ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDNmNWYwYmEuLjVmNjJkYTMgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTEsNiArMTEsNyBAQAogICBsaWIvQ29kZUdlbiBcCiAgIGxpYi9Ecml2ZXIgXAogICBsaWIvRWRpdCBcCisgIGxpYi9Gb3JtYXQgXAogICBsaWIvRnJvbnRlbmQgXAogICBsaWIvRnJvbnRlbmRUb29sIFwKICAgbGliL0hlYWRlcnMgXApkaWZmIC0tZ2l0IGEvQ01ha2VMaXN0cy50eHQgYi9DTWFrZUxpc3RzLnR4dAppbmRleCA4ZDAyYmYwLi4yZDdiYjZmIDEwMDY0NAotLS0gYS9DTWFrZUxpc3RzLnR4dAorKysgYi9DTWFrZUxpc3RzLnR4dApAQCAtMSw3MCArMSwxNjAgQEAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjguOCkKKworIyBGSVhNRTogSXQgbWF5IGJlIHJlbW92ZWQgd2hlbiB3ZSB1c2UgMi44LjEyLgoraWYoQ01BS0VfVkVSU0lPTiBWRVJTSU9OX0xFU1MgMi44LjEyKQorICAjIEludmFsaWRhdGUgYSBjb3VwbGUgb2Yga2V5d29yZHMuCisgIHNldChjbWFrZV8yXzhfMTJfSU5URVJGQUNFKQorICBzZXQoY21ha2VfMl84XzEyX1BSSVZBVEUpCitlbHNlKCkKKyAgIyBVc2UgJHtjbWFrZV8yXzhfMTJfS0VZV09SRH0gaW50ZWFkIG9mIEtFWVdPUkQgaW4gdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCkuCisgIHNldChjbWFrZV8yXzhfMTJfSU5URVJGQUNFIElOVEVSRkFDRSkKKyAgc2V0KGNtYWtlXzJfOF8xMl9QUklWQVRFIFBSSVZBVEUpCisgIGlmKFBPTElDWSBDTVAwMDIyKQorICAgIGNtYWtlX3BvbGljeShTRVQgQ01QMDAyMiBORVcpICMgYXV0b21hdGljIHdoZW4gMi44LjEyIGlzIHJlcXVpcmVkCisgIGVuZGlmKCkKK2VuZGlmKCkKKwogIyBJZiB3ZSBhcmUgbm90IGJ1aWxkaW5nIGFzIGEgcGFydCBvZiBMTFZNLCBidWlsZCBDbGFuZyBhcyBhbgogIyBzdGFuZGFsb25lIHByb2plY3QsIHVzaW5nIExMVk0gYXMgYW4gZXh0ZXJuYWwgbGlicmFyeToKIGlmKCBDTUFLRV9TT1VSQ0VfRElSIFNUUkVRVUFMIENNQUtFX0NVUlJFTlRfU09VUkNFX0RJUiApCiAgIHByb2plY3QoQ2xhbmcpCi0gIGNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjgpCiAKLSAgc2V0KENMQU5HX1BBVEhfVE9fTExWTV9TT1VSQ0UgIiIgQ0FDSEUgUEFUSAotICAgICJQYXRoIHRvIExMVk0gc291cmNlIGNvZGUuIE5vdCBuZWNlc3NhcnkgaWYgdXNpbmcgYW4gaW5zdGFsbGVkIExMVk0uIikKLSAgc2V0KENMQU5HX1BBVEhfVE9fTExWTV9CVUlMRCAiIiBDQUNIRSBQQVRICi0gICAgIlBhdGggdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBMTFZNIHdhcyBidWlsdCBvciBpbnN0YWxsZWQuIikKLQotICBpZiggQ0xBTkdfUEFUSF9UT19MTFZNX1NPVVJDRSApCi0gICAgaWYoIE5PVCBFWElTVFMgIiR7Q0xBTkdfUEFUSF9UT19MTFZNX1NPVVJDRX0vY21ha2UvY29uZmlnLWl4LmNtYWtlIiApCi0gICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJQbGVhc2Ugc2V0IENMQU5HX1BBVEhfVE9fTExWTV9TT1VSQ0UgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIExMVk0gc291cmNlIGNvZGUuIikKKyAgIyBSZWx5IG9uIGxsdm0tY29uZmlnLgorICBzZXQoQ09ORklHX09VVFBVVCkKKyAgZmluZF9wcm9ncmFtKExMVk1fQ09ORklHICJsbHZtLWNvbmZpZyIpCisgIGlmKExMVk1fQ09ORklHKQorICAgIG1lc3NhZ2UoU1RBVFVTICJGb3VuZCBMTFZNX0NPTkZJRyBhcyAke0xMVk1fQ09ORklHfSIpCisgICAgc2V0KENPTkZJR19DT01NQU5EICR7TExWTV9DT05GSUd9CisgICAgICAiLS1hc3NlcnRpb24tbW9kZSIKKyAgICAgICItLWJpbmRpciIKKyAgICAgICItLWxpYmRpciIKKyAgICAgICItLWluY2x1ZGVkaXIiCisgICAgICAiLS1wcmVmaXgiCisgICAgICAiLS1zcmMtcm9vdCIpCisgICAgZXhlY3V0ZV9wcm9jZXNzKAorICAgICAgQ09NTUFORCAke0NPTkZJR19DT01NQU5EfQorICAgICAgUkVTVUxUX1ZBUklBQkxFIEhBRF9FUlJPUgorICAgICAgT1VUUFVUX1ZBUklBQkxFIENPTkZJR19PVVRQVVQKKyAgICApCisgICAgaWYoTk9UIEhBRF9FUlJPUikKKyAgICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFCisgICAgICAgICJbIFx0XSpbXHJcbl0rWyBcdF0qIiAiOyIKKyAgICAgICAgQ09ORklHX09VVFBVVCAke0NPTkZJR19PVVRQVVR9KQogICAgIGVsc2UoKQotICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChMTFZNX01BSU5fU1JDX0RJUiAke0NMQU5HX1BBVEhfVE9fTExWTV9TT1VSQ0V9Ci0JQUJTT0xVVEUpCi0gICAgICBsaXN0KEFQUEVORCBDTUFLRV9NT0RVTEVfUEFUSCAiJHtMTFZNX01BSU5fU1JDX0RJUn0vY21ha2UvbW9kdWxlcyIpCisgICAgICBzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIENPTkZJR19DT01NQU5EX1NUUiAiJHtDT05GSUdfQ09NTUFORH0iKQorICAgICAgbWVzc2FnZShTVEFUVVMgIiR7Q09ORklHX0NPTU1BTkRfU1RSfSIpCisgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJsbHZtLWNvbmZpZyBmYWlsZWQgd2l0aCBzdGF0dXMgJHtIQURfRVJST1J9IikKICAgICBlbmRpZigpCi0gIGVuZGlmKCkKLQotICBpZiAoRVhJU1RTICIke0NMQU5HX1BBVEhfVE9fTExWTV9CVUlMRH0vYmluL2xsdm0tY29uZmlnJHtDTUFLRV9FWEVDVVRBQkxFX1NVRkZJWH0iKQotICAgIHNldCAoUEFUSF9UT19MTFZNX0NPTkZJRyAiJHtDTEFOR19QQVRIX1RPX0xMVk1fQlVJTER9L2Jpbi9sbHZtLWNvbmZpZyR7Q01BS0VfRVhFQ1VUQUJMRV9TVUZGSVh9IikKLSAgZWxzZWlmIChFWElTVFMgIiR7Q0xBTkdfUEFUSF9UT19MTFZNX0JVSUxEfS9iaW4vRGVidWcvbGx2bS1jb25maWcke0NNQUtFX0VYRUNVVEFCTEVfU1VGRklYfSIpCi0gICAgIyBMb29raW5nIGZvciBiaW4vRGVidWcvbGx2bS1jb25maWcgaXMgYSBjb21wbGV0ZSBoYWNrLiBIb3cgY2FuIHdlIGdldAotICAgICMgYXJvdW5kIHRoaXM/Ci0gICAgc2V0IChQQVRIX1RPX0xMVk1fQ09ORklHICIke0NMQU5HX1BBVEhfVE9fTExWTV9CVUlMRH0vYmluL0RlYnVnL2xsdm0tY29uZmlnJHtDTUFLRV9FWEVDVVRBQkxFX1NVRkZJWH0iKQogICBlbHNlKCkKLSAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJQbGVhc2Ugc2V0IENMQU5HX1BBVEhfVE9fTExWTV9CVUlMRCB0byBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgTExWTSBidWlsZC4iKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgImxsdm0tY29uZmlnIG5vdCBmb3VuZCAtLSAke0xMVk1fQ09ORklHfSIpCiAgIGVuZGlmKCkKIAotICBsaXN0KEFQUEVORCBDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTEFOR19QQVRIX1RPX0xMVk1fQlVJTER9L3NoYXJlL2xsdm0vY21ha2UiKQorICBsaXN0KEdFVCBDT05GSUdfT1VUUFVUIDAgRU5BQkxFX0FTU0VSVElPTlMpCisgIGxpc3QoR0VUIENPTkZJR19PVVRQVVQgMSBUT09MU19CSU5BUllfRElSKQorICBsaXN0KEdFVCBDT05GSUdfT1VUUFVUIDIgTElCUkFSWV9ESVIpCisgIGxpc3QoR0VUIENPTkZJR19PVVRQVVQgMyBJTkNMVURFX0RJUikKKyAgbGlzdChHRVQgQ09ORklHX09VVFBVVCA0IExMVk1fT0JKX1JPT1QpCisgIGxpc3QoR0VUIENPTkZJR19PVVRQVVQgNSBNQUlOX1NSQ19ESVIpCiAKLSAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChQQVRIX1RPX0xMVk1fQlVJTEQgJHtDTEFOR19QQVRIX1RPX0xMVk1fQlVJTER9Ci0gICAgQUJTT0xVVEUpCisgIGlmKE5PVCBNU1ZDX0lERSkKKyAgICBzZXQoTExWTV9FTkFCTEVfQVNTRVJUSU9OUyAke0VOQUJMRV9BU1NFUlRJT05TfQorICAgICAgQ0FDSEUgQk9PTCAiRW5hYmxlIGFzc2VydGlvbnMiKQorICAgICMgQXNzZXJ0aW9ucyBzaG91bGQgZm9sbG93IGxsdm0tY29uZmlnJ3MuCisgICAgbWFya19hc19hZHZhbmNlZChMTFZNX0VOQUJMRV9BU1NFUlRJT05TKQorICBlbmRpZigpCiAKLSAgb3B0aW9uKExMVk1fSU5TVEFMTF9UT09MQ0hBSU5fT05MWSAiT25seSBpbmNsdWRlIHRvb2xjaGFpbiBmaWxlcyBpbiB0aGUgJ2luc3RhbGwnIHRhcmdldC4iIE9GRikKKyAgc2V0KExMVk1fVE9PTFNfQklOQVJZX0RJUiAke1RPT0xTX0JJTkFSWV9ESVJ9IENBQ0hFIFBBVEggIlBhdGggdG8gbGx2bS9iaW4iKQorICBzZXQoTExWTV9MSUJSQVJZX0RJUiAke0xJQlJBUllfRElSfSBDQUNIRSBQQVRIICJQYXRoIHRvIGxsdm0vbGliIikKKyAgc2V0KExMVk1fTUFJTl9JTkNMVURFX0RJUiAke0lOQ0xVREVfRElSfSBDQUNIRSBQQVRIICJQYXRoIHRvIGxsdm0vaW5jbHVkZSIpCisgIHNldChMTFZNX0JJTkFSWV9ESVIgJHtMTFZNX09CSl9ST09UfSBDQUNIRSBQQVRIICJQYXRoIHRvIExMVk0gYnVpbGQgdHJlZSIpCisgIHNldChMTFZNX01BSU5fU1JDX0RJUiAke01BSU5fU1JDX0RJUn0gQ0FDSEUgUEFUSCAiUGF0aCB0byBMTFZNIHNvdXJjZSB0cmVlIikKKworICBmaW5kX3Byb2dyYW0oTExWTV9UQUJMRUdFTl9FWEUgImxsdm0tdGJsZ2VuIiAke0xMVk1fVE9PTFNfQklOQVJZX0RJUn0KKyAgICBOT19ERUZBVUxUX1BBVEgpCisKKyAgc2V0KExMVk1fQ01BS0VfUEFUSCAiJHtMTFZNX0JJTkFSWV9ESVJ9L3NoYXJlL2xsdm0vY21ha2UiKQorICBzZXQoTExWTUNPTkZJR19GSUxFICIke0xMVk1fQ01BS0VfUEFUSH0vTExWTUNvbmZpZy5jbWFrZSIpCisgIGlmKEVYSVNUUyAke0xMVk1DT05GSUdfRklMRX0pCisgICAgbGlzdChBUFBFTkQgQ01BS0VfTU9EVUxFX1BBVEggIiR7TExWTV9DTUFLRV9QQVRIfSIpCisgICAgaW5jbHVkZSgke0xMVk1DT05GSUdfRklMRX0pCisgIGVsc2UoKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIk5vdCBmb3VuZDogJHtMTFZNQ09ORklHX0ZJTEV9IikKKyAgZW5kaWYoKQorCisgICMgVGhleSBhcmUgdXNlZCBhcyBkZXN0aW5hdGlvbiBvZiB0YXJnZXQgZ2VuZXJhdG9ycy4KKyAgc2V0KExMVk1fUlVOVElNRV9PVVRQVVRfSU5URElSICR7Q01BS0VfQklOQVJZX0RJUn0vJHtDTUFLRV9DRkdfSU5URElSfS9iaW4pCisgIHNldChMTFZNX0xJQlJBUllfT1VUUFVUX0lOVERJUiAke0NNQUtFX0JJTkFSWV9ESVJ9LyR7Q01BS0VfQ0ZHX0lOVERJUn0vbGliKQorCisgIG9wdGlvbihMTFZNX0lOU1RBTExfVE9PTENIQUlOX09OTFkKKyAgICAiT25seSBpbmNsdWRlIHRvb2xjaGFpbiBmaWxlcyBpbiB0aGUgJ2luc3RhbGwnIHRhcmdldC4iIE9GRikKKworICBvcHRpb24oTExWTV9GT1JDRV9VU0VfT0xEX0hPU1RfVE9PTENIQUlOCisgICAgIlNldCB0byBPTiB0byBmb3JjZSB1c2luZyBhbiBvbGQsIHVuc3VwcG9ydGVkIGhvc3QgdG9vbGNoYWluLiIgT0ZGKQogCiAgIGluY2x1ZGUoQWRkTExWTSkKICAgaW5jbHVkZShUYWJsZUdlbikKLSAgaW5jbHVkZSgiJHtDTEFOR19QQVRIX1RPX0xMVk1fQlVJTER9L3NoYXJlL2xsdm0vY21ha2UvTExWTUNvbmZpZy5jbWFrZSIpCiAgIGluY2x1ZGUoSGFuZGxlTExWTU9wdGlvbnMpCiAKICAgc2V0KFBBQ0tBR0VfVkVSU0lPTiAiJHtMTFZNX1BBQ0tBR0VfVkVSU0lPTn0iKQogCi0gIHNldChMTFZNX01BSU5fSU5DTFVERV9ESVIgIiR7TExWTV9NQUlOX1NSQ19ESVJ9L2luY2x1ZGUiKQotICBzZXQoTExWTV9CSU5BUllfRElSICR7Q01BS0VfQklOQVJZX0RJUn0pCi0KLSAgc2V0KENNQUtFX0lOQ0xVREVfQ1VSUkVOVF9ESVIgT04pCi0gIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7UEFUSF9UT19MTFZNX0JVSUxEfS9pbmNsdWRlIiAiJHtMTFZNX01BSU5fSU5DTFVERV9ESVJ9IikKLSAgbGlua19kaXJlY3RvcmllcygiJHtQQVRIX1RPX0xMVk1fQlVJTER9L2xpYiIpCi0KLSAgZXhlY19wcm9ncmFtKCIke1BBVEhfVE9fTExWTV9DT05GSUd9IC0tYmluZGlyIiBPVVRQVVRfVkFSSUFCTEUgTExWTV9CSU5BUllfRElSKQotICBzZXQoTExWTV9UQUJMRUdFTl9FWEUgIiR7TExWTV9CSU5BUllfRElSfS9sbHZtLXRibGdlbiR7Q01BS0VfRVhFQ1VUQUJMRV9TVUZGSVh9IikKLQotICAjIERlZmluZSB0aGUgZGVmYXVsdCBhcmd1bWVudHMgdG8gdXNlIHdpdGggJ2xpdCcsIGFuZCBhbiBvcHRpb24gZm9yIHRoZSB1c2VyCi0gICMgdG8gb3ZlcnJpZGUuCi0gIHNldChMSVRfQVJHU19ERUZBVUxUICItc3YiKQotICBpZiAoTVNWQyBPUiBYQ09ERSkKLSAgICBzZXQoTElUX0FSR1NfREVGQVVMVCAiJHtMSVRfQVJHU19ERUZBVUxUfSAtLW5vLXByb2dyZXNzLWJhciIpCisgIGlmIChOT1QgREVGSU5FRCBMTFZNX0lOQ0xVREVfVEVTVFMpCisgICAgc2V0KExMVk1fSU5DTFVERV9URVNUUyBPTikKICAgZW5kaWYoKQotICBzZXQoTExWTV9MSVRfQVJHUyAiJHtMSVRfQVJHU19ERUZBVUxUfSIgQ0FDSEUgU1RSSU5HICJEZWZhdWx0IG9wdGlvbnMgZm9yIGxpdCIpCisKKyAgaW5jbHVkZV9kaXJlY3RvcmllcygiJHtMTFZNX0JJTkFSWV9ESVJ9L2luY2x1ZGUiICIke0xMVk1fTUFJTl9JTkNMVURFX0RJUn0iKQorICBsaW5rX2RpcmVjdG9yaWVzKCIke0xMVk1fTElCUkFSWV9ESVJ9IikKIAogICBzZXQoIENNQUtFX1JVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9L2JpbiApCiAgIHNldCggQ01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0vbGliICkKICAgc2V0KCBDTUFLRV9BUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9saWIgKQogCisgIGlmKExMVk1fSU5DTFVERV9URVNUUykKKyAgICAjIENoZWNrIHByZWJ1aWx0IGxsdm0vdXRpbHMuCisgICAgaWYoRVhJU1RTICR7TExWTV9UT09MU19CSU5BUllfRElSfS9GaWxlQ2hlY2ske0NNQUtFX0VYRUNVVEFCTEVfU1VGRklYfQorICAgICAgICBBTkQgRVhJU1RTICR7TExWTV9UT09MU19CSU5BUllfRElSfS9jb3VudCR7Q01BS0VfRVhFQ1VUQUJMRV9TVUZGSVh9CisgICAgICAgIEFORCBFWElTVFMgJHtMTFZNX1RPT0xTX0JJTkFSWV9ESVJ9L25vdCR7Q01BS0VfRVhFQ1VUQUJMRV9TVUZGSVh9KQorICAgICAgc2V0KExMVk1fVVRJTFNfUFJPVklERUQgT04pCisgICAgZW5kaWYoKQorCisgICAgaWYoRVhJU1RTICR7TExWTV9NQUlOX1NSQ19ESVJ9L3V0aWxzL2xpdC9saXQucHkpCisgICAgICBzZXQoTExWTV9MSVQgJHtMTFZNX01BSU5fU1JDX0RJUn0vdXRpbHMvbGl0L2xpdC5weSkKKyAgICAgIGlmKE5PVCBMTFZNX1VUSUxTX1BST1ZJREVEKQorICAgICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7TExWTV9NQUlOX1NSQ19ESVJ9L3V0aWxzL0ZpbGVDaGVjayB1dGlscy9GaWxlQ2hlY2spCisgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtMTFZNX01BSU5fU1JDX0RJUn0vdXRpbHMvY291bnQgdXRpbHMvY291bnQpCisgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtMTFZNX01BSU5fU1JDX0RJUn0vdXRpbHMvbm90IHV0aWxzL25vdCkKKyAgICAgICAgc2V0KExMVk1fVVRJTFNfUFJPVklERUQgT04pCisgICAgICAgIHNldChDTEFOR19URVNUX0RFUFMgRmlsZUNoZWNrIGNvdW50IG5vdCkKKyAgICAgIGVuZGlmKCkKKyAgICAgIHNldChVTklUVEVTVF9ESVIgJHtMTFZNX01BSU5fU1JDX0RJUn0vdXRpbHMvdW5pdHRlc3QpCisgICAgICBpZihFWElTVFMgJHtVTklUVEVTVF9ESVJ9L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oCisgICAgICAgICAgQU5EIE5PVCBFWElTVFMgJHtMTFZNX0xJQlJBUllfRElSfS8ke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1BSRUZJWH1ndGVzdCR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfQorICAgICAgICAgIEFORCBFWElTVFMgJHtVTklUVEVTVF9ESVJ9L0NNYWtlTGlzdHMudHh0KQorICAgICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7VU5JVFRFU1RfRElSfSB1dGlscy91bml0dGVzdCkKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAgICMgU2VlayBpbnN0YWxsZWQgTGl0LgorICAgICAgZmluZF9wcm9ncmFtKExMVk1fTElUICJsaXQucHkiICR7TExWTV9NQUlOX1NSQ19ESVJ9L3V0aWxzL2xpdAorICAgICAgICBET0MgIlBhdGggdG8gbGl0LnB5IikKKyAgICBlbmRpZigpCisKKyAgICBpZihMTFZNX0xJVCkKKyAgICAgICMgRGVmaW5lIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyB0byB1c2Ugd2l0aCAnbGl0JywgYW5kIGFuIG9wdGlvbiBmb3IgdGhlIHVzZXIKKyAgICAgICMgdG8gb3ZlcnJpZGUuCisgICAgICBzZXQoTElUX0FSR1NfREVGQVVMVCAiLXN2IikKKyAgICAgIGlmIChNU1ZDIE9SIFhDT0RFKQorICAgICAgICBzZXQoTElUX0FSR1NfREVGQVVMVCAiJHtMSVRfQVJHU19ERUZBVUxUfSAtLW5vLXByb2dyZXNzLWJhciIpCisgICAgICBlbmRpZigpCisgICAgICBzZXQoTExWTV9MSVRfQVJHUyAiJHtMSVRfQVJHU19ERUZBVUxUfSIgQ0FDSEUgU1RSSU5HICJEZWZhdWx0IG9wdGlvbnMgZm9yIGxpdCIpCisKKyAgICAgICMgT24gV2luMzIgaG9zdHMsIHByb3ZpZGUgYW4gb3B0aW9uIHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIEdudVdpbjMyIHRvb2xzLgorICAgICAgaWYoIFdJTjMyIEFORCBOT1QgQ1lHV0lOICkKKyAgICAgICAgc2V0KExMVk1fTElUX1RPT0xTX0RJUiAiIiBDQUNIRSBQQVRIICJQYXRoIHRvIEdudVdpbjMyIHRvb2xzIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAgIHNldChMTFZNX0lOQ0xVREVfVEVTVFMgT0ZGKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorCiAgIHNldCggQ0xBTkdfQlVJTFRfU1RBTkRBTE9ORSAxICkKIAogICBmaW5kX3BhY2thZ2UoTGliWG1sMikKQEAgLTE2MCwxNSArMjUwLDExIEBACiAgIGVuZGlmKCkKIGVuZGlmICgpCiAKLWlmIChBUFBMRSkKLSAgc2V0KENNQUtFX01PRFVMRV9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfTU9EVUxFX0xJTktFUl9GTEFHU30gLVdsLC1mbGF0X25hbWVzcGFjZSAtV2wsLXVuZGVmaW5lZCAtV2wsc3VwcHJlc3MiKQotZW5kaWYgKCkKLQogY29uZmlndXJlX2ZpbGUoCiAgICR7Q0xBTkdfU09VUkNFX0RJUn0vaW5jbHVkZS9jbGFuZy9Db25maWcvY29uZmlnLmguY21ha2UKICAgJHtDTEFOR19CSU5BUllfRElSfS9pbmNsdWRlL2NsYW5nL0NvbmZpZy9jb25maWcuaCkKIAotaW5jbHVkZShMTFZNUGFyc2VBcmd1bWVudHMpCitpbmNsdWRlKENNYWtlUGFyc2VBcmd1bWVudHMpCiAKIGZ1bmN0aW9uKGNsYW5nX3RhYmxlZ2VuKQogICAjIFN5bnRheDoKQEAgLTE4Myw1OSArMjY5LDI5IEBACiAgICMgZXhlY3V0aW5nIHRoZSBjdXN0b20gY29tbWFuZCBkZXBlbmRpbmcgb24gb3V0cHV0LWZpbGUuIEl0IGlzCiAgICMgcG9zc2libGUgdG8gbGlzdCBtb3JlIGZpbGVzIHRvIGRlcGVuZCBhZnRlciBERVBFTkRTLgogCi0gIHBhcnNlX2FyZ3VtZW50cyggQ1RHICJTT1VSQ0U7VEFSR0VUO0RFUEVORFMiICIiICR7QVJHTn0gKQorICBjbWFrZV9wYXJzZV9hcmd1bWVudHMoQ1RHICIiICJTT1VSQ0U7VEFSR0VUIiAiIiAke0FSR059KQogCiAgIGlmKCBOT1QgQ1RHX1NPVVJDRSApCiAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiU09VUkNFIHNvdXJjZS1maWxlIHJlcXVpcmVkIGJ5IGNsYW5nX3RhYmxlZ2VuIikKICAgZW5kaWYoKQogCiAgIHNldCggTExWTV9UQVJHRVRfREVGSU5JVElPTlMgJHtDVEdfU09VUkNFfSApCi0gIHRhYmxlZ2VuKCBDTEFORyAke0NUR19ERUZBVUxUX0FSR1N9ICkKKyAgdGFibGVnZW4oQ0xBTkcgJHtDVEdfVU5QQVJTRURfQVJHVU1FTlRTfSkKIAotICBsaXN0KCBHRVQgQ1RHX0RFRkFVTFRfQVJHUyAwIG91dHB1dF9maWxlICkKLSAgaWYoIENUR19UQVJHRVQgKQotICAgIGFkZF9jdXN0b21fdGFyZ2V0KCAke0NUR19UQVJHRVR9IERFUEVORFMgJHtvdXRwdXRfZmlsZX0gJHtDVEdfREVQRU5EU30gKQorICBpZihDVEdfVEFSR0VUKQorICAgIGFkZF9wdWJsaWNfdGFibGVnZW5fdGFyZ2V0KCR7Q1RHX1RBUkdFVH0pCiAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCAke0NUR19UQVJHRVR9IFBST1BFUlRJRVMgRk9MREVSICJDbGFuZyB0YWJsZWdlbm5pbmciKQorICAgIHNldF9wcm9wZXJ0eShHTE9CQUwgQVBQRU5EIFBST1BFUlRZIENMQU5HX1RBQkxFR0VOX1RBUkdFVFMgJHtDVEdfVEFSR0VUfSkKICAgZW5kaWYoKQogZW5kZnVuY3Rpb24oY2xhbmdfdGFibGVnZW4pCiAKLSMgRklYTUU6IEdlbmVyYWxpemUgYW5kIG1vdmUgdG8gbGx2bS4KLWZ1bmN0aW9uKGFkZF9jbGFuZ19zeW1ib2xfZXhwb3J0cyB0YXJnZXRfbmFtZSBleHBvcnRfZmlsZSkKLSAgIyBNYWtlZmlsZS5ydWxlcyBjb250YWlucyBzcGVjaWFsIGNhc2VzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zLgotICAjIFdlIHJlc3RyaWN0IG91cnNlbHZlcyB0byBEYXJ3aW4gZm9yIHRoZSB0aW1lIGJlaW5nLgotICBpZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iKQotICAgIGFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgc3ltYm9sLmV4cG9ydHMKLSAgICAgIENPTU1BTkQgc2VkIC1lICJzL14vXy8iIDwgJHtleHBvcnRfZmlsZX0gPiBzeW1ib2wuZXhwb3J0cwotICAgICAgREVQRU5EUyAke2V4cG9ydF9maWxlfQotICAgICAgVkVSQkFUSU0KLSAgICAgIENPTU1FTlQgIkNyZWF0aW5nIGV4cG9ydCBmaWxlIGZvciAke3RhcmdldF9uYW1lfSIpCi0gICAgYWRkX2N1c3RvbV90YXJnZXQoJHt0YXJnZXRfbmFtZX1fZXhwb3J0cyBERVBFTkRTIHN5bWJvbC5leHBvcnRzKQotICAgIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5ECi0gICAgICBQUk9QRVJUWSBBRERJVElPTkFMX01BS0VfQ0xFQU5fRklMRVMgc3ltYm9sLmV4cG9ydHMpCi0KLSAgICBnZXRfcHJvcGVydHkoc3JjcyBUQVJHRVQgJHt0YXJnZXRfbmFtZX0gUFJPUEVSVFkgU09VUkNFUykKLSAgICBmb3JlYWNoKHNyYyAke3NyY3N9KQotICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChleHRlbnNpb24gJHtzcmN9IEVYVCkKLSAgICAgIGlmKGV4dGVuc2lvbiBTVFJFUVVBTCAiLmNwcCIpCi0gICAgICAgIHNldChmaXJzdF9zb3VyY2VfZmlsZSAke3NyY30pCi0gICAgICAgIGJyZWFrKCkKLSAgICAgIGVuZGlmKCkKLSAgICBlbmRmb3JlYWNoKCkKLSAgCi0gICAgIyBGb3JjZSByZS1saW5raW5nIHdoZW4gdGhlIGV4cG9ydHMgZmlsZSBjaGFuZ2VzLiBBY3R1YWxseSwgaXQKLSAgICAjIGZvcmNlcyByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2UgZmlsZS4gVGhlIExJTktfREVQRU5EUyB0YXJnZXQKLSAgICAjIHByb3BlcnR5IG9ubHkgd29ya3MgZm9yIG1ha2VmaWxlLWJhc2VkIGdlbmVyYXRvcnMuCi0gICAgc2V0X3Byb3BlcnR5KFNPVVJDRSAke2ZpcnN0X3NvdXJjZV9maWxlfSBBUFBFTkQgUFJPUEVSVFkKLSAgICAgIE9CSkVDVF9ERVBFTkRTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zeW1ib2wuZXhwb3J0cykKLSAgCi0gICAgc2V0X3Byb3BlcnR5KFRBUkdFVCAke3RhcmdldF9uYW1lfSBBUFBFTkRfU1RSSU5HIFBST1BFUlRZCi0gICAgICAgICAgICAgICAgIExJTktfRkxBR1MgIiAtV2wsLWV4cG9ydGVkX3N5bWJvbHNfbGlzdCwke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3ltYm9sLmV4cG9ydHMiKQotICAgIGFkZF9kZXBlbmRlbmNpZXMoJHt0YXJnZXRfbmFtZX0gJHt0YXJnZXRfbmFtZX1fZXhwb3J0cykKLSAgZW5kaWYoKQotZW5kZnVuY3Rpb24oYWRkX2NsYW5nX3N5bWJvbF9leHBvcnRzKQotCiBtYWNybyhhZGRfY2xhbmdfbGlicmFyeSBuYW1lKQotICBsbHZtX3Byb2Nlc3Nfc291cmNlcyhzcmNzICR7QVJHTn0pCisgIGNtYWtlX3BhcnNlX2FyZ3VtZW50cyhBUkcKKyAgICAiIgorICAgICIiCisgICAgIkFERElUSU9OQUxfSEVBREVSUyIKKyAgICAke0FSR059KQorICBzZXQoc3JjcykKICAgaWYoTVNWQ19JREUgT1IgWENPREUpCiAgICAgIyBBZGQgcHVibGljIGhlYWRlcnMKICAgICBmaWxlKFJFTEFUSVZFX1BBVEggbGliX3BhdGgKQEAgLTI1NSwzNCArMzExLDMyIEBACiAgICAgICBzb3VyY2VfZ3JvdXAoIlRhYmxlR2VuIGRlc2NyaXB0aW9ucyIgRklMRVMgJHt0ZHN9KQogICAgICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7dGRzfX0gUFJPUEVSVElFUyBIRUFERVJfRklMRV9PTkxZIE9OKQogCi0gICAgICBzZXQoc3JjcyAke3NyY3N9ICR7aGVhZGVyc30gJHt0ZHN9KQorICAgICAgaWYoaGVhZGVycyBPUiB0ZHMpCisJc2V0KHNyY3MgJHtoZWFkZXJzfSAke3Rkc30pCisgICAgICBlbmRpZigpCiAgICAgZW5kaWYoKQogICBlbmRpZihNU1ZDX0lERSBPUiBYQ09ERSkKLSAgaWYgKE1PRFVMRSkKLSAgICBzZXQobGlia2luZCBNT0RVTEUpCi0gIGVsc2VpZiAoU0hBUkVEX0xJQlJBUlkpCi0gICAgc2V0KGxpYmtpbmQgU0hBUkVEKQorICBpZihzcmNzIE9SIEFSR19BRERJVElPTkFMX0hFQURFUlMpCisgICAgc2V0KHNyY3MKKyAgICAgIEFERElUSU9OQUxfSEVBREVSUworICAgICAgJHtzcmNzfQorICAgICAgJHtBUkdfQURESVRJT05BTF9IRUFERVJTfSAjIEl0IG1heSBjb250YWluIHVucGFyc2VkIHVua25vd24gYXJncy4KKyAgICAgICkKKyAgZW5kaWYoKQorICBsbHZtX2FkZF9saWJyYXJ5KCR7bmFtZX0gJHtBUkdfVU5QQVJTRURfQVJHVU1FTlRTfSAke3NyY3N9KQorCisgIGlmKFRBUkdFVCAke25hbWV9KQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9ICR7Y21ha2VfMl84XzEyX0lOVEVSRkFDRX0gJHtMTFZNX0NPTU1PTl9MSUJTfSkKKworICAgIGlmIChOT1QgTExWTV9JTlNUQUxMX1RPT0xDSEFJTl9PTkxZIE9SICR7bmFtZX0gU1RSRVFVQUwgImxpYmNsYW5nIikKKyAgICAgIGluc3RhbGwoVEFSR0VUUyAke25hbWV9CisgICAgICAgIExJQlJBUlkgREVTVElOQVRJT04gbGliJHtMTFZNX0xJQkRJUl9TVUZGSVh9CisgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gbGliJHtMTFZNX0xJQkRJUl9TVUZGSVh9CisgICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gYmluKQorICAgIGVuZGlmKCkKICAgZWxzZSgpCi0gICAgc2V0KGxpYmtpbmQpCi0gIGVuZGlmKCkKLSAgYWRkX2xpYnJhcnkoICR7bmFtZX0gJHtsaWJraW5kfSAke3NyY3N9ICkKLSAgaWYoIExMVk1fQ09NTU9OX0RFUEVORFMgKQotICAgIGFkZF9kZXBlbmRlbmNpZXMoICR7bmFtZX0gJHtMTFZNX0NPTU1PTl9ERVBFTkRTfSApCi0gIGVuZGlmKCBMTFZNX0NPTU1PTl9ERVBFTkRTICkKLQotICBsbHZtX2NvbmZpZyggJHtuYW1lfSAke0xMVk1fTElOS19DT01QT05FTlRTfSApCi0gIHRhcmdldF9saW5rX2xpYnJhcmllcyggJHtuYW1lfSAke0xMVk1fQ09NTU9OX0xJQlN9ICkKLSAgbGlua19zeXN0ZW1fbGlicyggJHtuYW1lfSApCi0gIAotICBpZiAoU0hBUkVEX0xJQlJBUlkgQU5EIEVYUE9SVEVEX1NZTUJPTF9GSUxFKQotICAgIGFkZF9jbGFuZ19zeW1ib2xfZXhwb3J0cyggJHtuYW1lfSAke0VYUE9SVEVEX1NZTUJPTF9GSUxFfSApIAotICBlbmRpZigpCi0KLSAgaWYgKE5PVCBMTFZNX0lOU1RBTExfVE9PTENIQUlOX09OTFkgT1IgJHtuYW1lfSBTVFJFUVVBTCAibGliY2xhbmciKQotICAgIGluc3RhbGwoVEFSR0VUUyAke25hbWV9Ci0gICAgICBMSUJSQVJZIERFU1RJTkFUSU9OIGxpYiR7TExWTV9MSUJESVJfU1VGRklYfQotICAgICAgQVJDSElWRSBERVNUSU5BVElPTiBsaWIke0xMVk1fTElCRElSX1NVRkZJWH0KLSAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gYmluKQorICAgICMgQWRkIGVtcHR5ICJwaG9ueSIgdGFyZ2V0CisgICAgYWRkX2N1c3RvbV90YXJnZXQoJHtuYW1lfSkKICAgZW5kaWYoKQogCiAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9IFBST1BFUlRJRVMgRk9MREVSICJDbGFuZyBsaWJyYXJpZXMiKQpAQCAtMjkzLDEzICszNDcsMTUgQEAKICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0gUFJPUEVSVElFUyBGT0xERVIgIkNsYW5nIGV4ZWN1dGFibGVzIikKIGVuZG1hY3JvKGFkZF9jbGFuZ19leGVjdXRhYmxlKQogCitzZXQoQ01BS0VfSU5DTFVERV9DVVJSRU5UX0RJUiBPTikKKwogaW5jbHVkZV9kaXJlY3RvcmllcyhCRUZPUkUKICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luY2x1ZGUKICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2luY2x1ZGUKICAgKQogCiBpZiAoTk9UIExMVk1fSU5TVEFMTF9UT09MQ0hBSU5fT05MWSkKLSAgaW5zdGFsbChESVJFQ1RPUlkgaW5jbHVkZS8KKyAgaW5zdGFsbChESVJFQ1RPUlkgaW5jbHVkZS9jbGFuZyBpbmNsdWRlL2NsYW5nLWMKICAgICBERVNUSU5BVElPTiBpbmNsdWRlCiAgICAgRklMRVNfTUFUQ0hJTkcKICAgICBQQVRURVJOICIqLmRlZiIKQEAgLTMwOCw3ICszNjQsNyBAQAogICAgIFBBVFRFUk4gIi5zdm4iIEVYQ0xVREUKICAgICApCiAKLSAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luY2x1ZGUvCisgIGluc3RhbGwoRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9pbmNsdWRlL2NsYW5nCiAgICAgREVTVElOQVRJT04gaW5jbHVkZQogICAgIEZJTEVTX01BVENISU5HCiAgICAgUEFUVEVSTiAiQ01ha2VGaWxlcyIgRVhDTFVERQpAQCAtMzYzLDExICs0MTksMjEgQEAKIGFkZF9zdWJkaXJlY3RvcnkodXRpbHMvVGFibGVHZW4pCiAKIGFkZF9zdWJkaXJlY3RvcnkoaW5jbHVkZSkKKworIyBBbGwgdGFyZ2V0cyBiZWxvdyBtYXkgZGVwZW5kIG9uIGFsbCB0YWJsZWdlbidkIGZpbGVzLgorZ2V0X3Byb3BlcnR5KENMQU5HX1RBQkxFR0VOX1RBUkdFVFMgR0xPQkFMIFBST1BFUlRZIENMQU5HX1RBQkxFR0VOX1RBUkdFVFMpCitsaXN0KEFQUEVORCBMTFZNX0NPTU1PTl9ERVBFTkRTICR7Q0xBTkdfVEFCTEVHRU5fVEFSR0VUU30pCisKIGFkZF9zdWJkaXJlY3RvcnkobGliKQogYWRkX3N1YmRpcmVjdG9yeSh0b29scykKIGFkZF9zdWJkaXJlY3RvcnkocnVudGltZSkKIAogb3B0aW9uKENMQU5HX0JVSUxEX0VYQU1QTEVTICJCdWlsZCBDTEFORyBleGFtcGxlIHByb2dyYW1zIGJ5IGRlZmF1bHQuIiBPRkYpCitpZiAoQ0xBTkdfQlVJTERfRVhBTVBMRVMpCisgIHNldChFTkFCTEVfQ0xBTkdfRVhBTVBMRVMgIjEiKQorZWxzZSgpCisgIHNldChFTkFCTEVfQ0xBTkdfRVhBTVBMRVMgIjAiKQorZW5kaWYoKQogYWRkX3N1YmRpcmVjdG9yeShleGFtcGxlcykKIAogb3B0aW9uKENMQU5HX0lOQ0xVREVfVEVTVFMKQEAgLTM3NSw4ICs0NDEsMzAgQEAKICAgICAgICAke0xMVk1fSU5DTFVERV9URVNUU30pCiAKIGlmKCBDTEFOR19JTkNMVURFX1RFU1RTICkKKyAgaWYoRVhJU1RTICR7TExWTV9NQUlOX1NSQ19ESVJ9L3V0aWxzL3VuaXR0ZXN0L2dvb2dsZXRlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oKQorICAgIGFkZF9zdWJkaXJlY3RvcnkodW5pdHRlc3RzKQorICAgIGxpc3QoQVBQRU5EIENMQU5HX1RFU1RfREVQUyBDbGFuZ1VuaXRUZXN0cykKKyAgICBsaXN0KEFQUEVORCBDTEFOR19URVNUX1BBUkFNUworICAgICAgY2xhbmdfdW5pdF9zaXRlX2NvbmZpZz0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGVzdC9Vbml0L2xpdC5zaXRlLmNmZworICAgICAgKQorICBlbmRpZigpCiAgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKLSAgYWRkX3N1YmRpcmVjdG9yeSh1bml0dGVzdHMpCisKKyAgaWYoQ0xBTkdfQlVJTFRfU1RBTkRBTE9ORSkKKyAgICAjIEFkZCBhIGdsb2JhbCBjaGVjayBydWxlIG5vdyB0aGF0IGFsbCBzdWJkaXJlY3RvcmllcyBoYXZlIGJlZW4gdHJhdmVyc2VkCisgICAgIyBhbmQgd2Uga25vdyB0aGUgdG90YWwgc2V0IG9mIGxpdCB0ZXN0c3VpdGVzLgorICAgIGdldF9wcm9wZXJ0eShMTFZNX0xJVF9URVNUU1VJVEVTIEdMT0JBTCBQUk9QRVJUWSBMTFZNX0xJVF9URVNUU1VJVEVTKQorICAgIGdldF9wcm9wZXJ0eShMTFZNX0xJVF9QQVJBTVMgR0xPQkFMIFBST1BFUlRZIExMVk1fTElUX1BBUkFNUykKKyAgICBnZXRfcHJvcGVydHkoTExWTV9MSVRfREVQRU5EUyBHTE9CQUwgUFJPUEVSVFkgTExWTV9MSVRfREVQRU5EUykKKyAgICBnZXRfcHJvcGVydHkoTExWTV9MSVRfRVhUUkFfQVJHUyBHTE9CQUwgUFJPUEVSVFkgTExWTV9MSVRfRVhUUkFfQVJHUykKKyAgICBhZGRfbGl0X3RhcmdldChjaGVjay1hbGwKKyAgICAgICJSdW5uaW5nIGFsbCByZWdyZXNzaW9uIHRlc3RzIgorICAgICAgJHtMTFZNX0xJVF9URVNUU1VJVEVTfQorICAgICAgUEFSQU1TICR7TExWTV9MSVRfUEFSQU1TfQorICAgICAgREVQRU5EUyAke0xMVk1fTElUX0RFUEVORFN9CisgICAgICBBUkdTICR7TExWTV9MSVRfRVhUUkFfQVJHU30KKyAgICAgICkKKyAgZW5kaWYoKQogZW5kaWYoKQogCiBvcHRpb24oQ0xBTkdfSU5DTFVERV9ET0NTICJHZW5lcmF0ZSBidWlsZCB0YXJnZXRzIGZvciB0aGUgQ2xhbmcgZG9jcy4iCkBAIC0zODUsMTcgKzQ3Myw1IEBACiAgIGFkZF9zdWJkaXJlY3RvcnkoZG9jcykKIGVuZGlmKCkKIAotIyBXb3JrYXJvdW5kIGZvciBNU1ZTMTAgdG8gYXZvaWQgdGhlIERpYWxvZyBIZWxsCi0jIEZJWE1FOiBUaGlzIGNvdWxkIGJlIHJlbW92ZWQgd2l0aCBmdXR1cmUgdmVyc2lvbiBvZiBDTWFrZS4KLWlmKCBDTEFOR19CVUlMVF9TVEFOREFMT05FIEFORCBNU1ZDX1ZFUlNJT04gRVFVQUwgMTYwMCApCi0gIHNldChDTEFOR19TTE5fRklMRU5BTUUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9DbGFuZy5zbG4iKQotICBpZiggRVhJU1RTICIke0NMQU5HX1NMTl9GSUxFTkFNRX0iICkKLSAgICBmaWxlKEFQUEVORCAiJHtDTEFOR19TTE5fRklMRU5BTUV9IiAiXG4jIFRoaXMgc2hvdWxkIGJlIHJlZ2VuZXJhdGVkIVxuIikKLSAgZW5kaWYoKQotZW5kaWYoKQotCi1zZXQoQlVHX1JFUE9SVF9VUkwgImh0dHA6Ly9sbHZtLm9yZy9idWdzLyIgQ0FDSEUgU1RSSU5HCi0gICJEZWZhdWx0IFVSTCB3aGVyZSBidWcgcmVwb3J0cyBhcmUgdG8gYmUgc3VibWl0dGVkLiIpCi0KIHNldChDTEFOR19PUkRFUl9GSUxFICIiIENBQ0hFIEZJTEVQQVRICiAgICJPcmRlciBmaWxlIHRvIHVzZSB3aGVuIGNvbXBpbGluZyBjbGFuZyBpbiBvcmRlciB0byBpbXByb3ZlIHN0YXJ0dXAgdGltZS4iKQpkaWZmIC0tZ2l0IGEvQ09ERV9PV05FUlMuVFhUIGIvQ09ERV9PV05FUlMuVFhUCmluZGV4IGFmNTA4MzEuLmJiZDMxNDIgMTAwNjQ0Ci0tLSBhL0NPREVfT1dORVJTLlRYVAorKysgYi9DT0RFX09XTkVSUy5UWFQKQEAgLTgsNiArOCwxMCBAQAogKFcpLCBQR1Aga2V5IElEIGFuZCBmaW5nZXJwcmludCAoUCksIGRlc2NyaXB0aW9uIChEKSwgYW5kIHNuYWlsLW1haWwgYWRkcmVzcwogKFMpLgogCitOOiBBYXJvbiBCYWxsbWFuCitFOiBhYXJvbkBhYXJvbmJhbGxtYW4uY29tCitEOiBDbGFuZyBhdHRyaWJ1dGVzCisKIE46IENoYW5kbGVyIENhcnJ1dGgKIEU6IGNoYW5kbGVyY0BnbWFpbC5jb20KIEU6IGNoYW5kbGVyY0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9MSUNFTlNFLlRYVCBiL0xJQ0VOU0UuVFhUCmluZGV4IGUzMTIyM2EuLjNiMTE1M2QgMTAwNjQ0Ci0tLSBhL0xJQ0VOU0UuVFhUCisrKyBiL0xJQ0VOU0UuVFhUCkBAIC00LDcgKzQsNyBAQAogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy9OQ1NBCiBPcGVuIFNvdXJjZSBMaWNlbnNlCiAKLUNvcHlyaWdodCAoYykgMjAwNy0yMDEzIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbi4KK0NvcHlyaWdodCAoYykgMjAwNy0yMDE0IFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbi4KIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKIERldmVsb3BlZCBieToKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggY2IyNTY2YS4uYmJjNTIxZiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTIzLDYgKzIzLDEyIEBACiBlbmRpZgogZW5kaWYKIAoraWZlcSAoJChCVUlMRF9FWEFNUExFUyksMSkKKyAgRU5BQkxFX0NMQU5HX0VYQU1QTEVTIDo9IDEKK2Vsc2UKKyAgRU5BQkxFX0NMQU5HX0VYQU1QTEVTIDo9IDAKK2VuZGlmCisKIGlmZXEgKCQoTUFLRUNNREdPQUxTKSxsaWJzLW9ubHkpCiAgIERJUlMgOj0gJChmaWx0ZXItb3V0IHRvb2xzIGRvY3MsICQoRElSUykpCiAgIE9QVElPTkFMX0RJUlMgOj0KZGlmZiAtLWdpdCBhL05PVElDRSBiL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY5MjA0ZS4uMDAwMDAwMAotLS0gYS9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUxMVk0gUmVsZWFzZSBMaWNlbnNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVVuaXZlcnNpdHkgb2YgSWxsaW5vaXMvTkNTQQotT3BlbiBTb3VyY2UgTGljZW5zZQotCi1Db3B5cmlnaHQgKGMpIDIwMDctMjAxMSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24uCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1EZXZlbG9wZWQgYnk6Ci0KLSAgICBMTFZNIFRlYW0KLQotICAgIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbgotCi0gICAgaHR0cDovL2xsdm0ub3JnCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKLXRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIHdpdGgKLXRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KLXVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCi1vZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KLXNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuCi0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotICAgICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIExMVk0gVGVhbSwgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdAotICAgICAgVXJiYW5hLUNoYW1wYWlnbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvCi0gICAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYwotICAgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKLUZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1DT05UUklCVVRPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIFdJVEggVEhFCi1TT0ZUV0FSRS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1UaGUgTExWTSBzb2Z0d2FyZSBjb250YWlucyBjb2RlIHdyaXR0ZW4gYnkgdGhpcmQgcGFydGllcy4gIFN1Y2ggc29mdHdhcmUgd2lsbAotaGF2ZSBpdHMgb3duIGluZGl2aWR1YWwgTElDRU5TRS5UWFQgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGl0IGFwcGVhcnMuCi1UaGlzIGZpbGUgd2lsbCBkZXNjcmliZSB0aGUgY29weXJpZ2h0cywgbGljZW5zZSwgYW5kIHJlc3RyaWN0aW9ucyB3aGljaCBhcHBseQotdG8gdGhhdCBjb2RlLgotCi1UaGUgZGlzY2xhaW1lciBvZiB3YXJyYW50eSBpbiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSBMaWNlbnNlCi1hcHBsaWVzIHRvIGFsbCBjb2RlIGluIHRoZSBMTFZNIERpc3RyaWJ1dGlvbiwgYW5kIG5vdGhpbmcgaW4gYW55IG9mIHRoZQotb3RoZXIgbGljZW5zZXMgZ2l2ZXMgcGVybWlzc2lvbiB0byB1c2UgdGhlIG5hbWVzIG9mIHRoZSBMTFZNIFRlYW0gb3IgdGhlCi1Vbml2ZXJzaXR5IG9mIElsbGlub2lzIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotU29mdHdhcmUuCi0KLVRoZSBmb2xsb3dpbmcgcGllY2VzIG9mIHNvZnR3YXJlIGhhdmUgYWRkaXRpb25hbCBvciBhbHRlcm5hdGUgY29weXJpZ2h0cywKLWxpY2Vuc2VzLCBhbmQvb3IgcmVzdHJpY3Rpb25zOgotCi1Qcm9ncmFtICAgICAgICAgICAgIERpcmVjdG9yeQotLS0tLS0tLSAgICAgICAgICAgICAtLS0tLS0tLS0KLTxub25lIHlldD4KZGlmZiAtLWdpdCBhL1JFQURNRS5hbmRyb2lkIGIvUkVBRE1FLmFuZHJvaWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYmUxMmYuLjAwMDAwMDAKLS0tIGEvUkVBRE1FLmFuZHJvaWQKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogUkVBRE1FLmFuZHJvaWQgZGVzY3JpYmVzIGluIGhpZ2gtbGV2ZWwgdGhlIExMVk0gY2hhbmdlcyB0aGF0IHdlIGNhbm5vdCBwdXNoCi0gKiB1cHN0cmVhbSB0byB0aGUgbGx2bS5vcmcgcmVwb3NpdG9yeToKLSAqICAtIENoYW5nZXMgZHVlIHRvIEFuZHJvaWQncyBidWlsZCBzeXN0ZW0uCi0gKiAgLSBDaGFuZ2VzIGR1ZSB0byBBbmRyb2lkJ3MgdG9vbGNoYWluLgotICogIC0gQ2hhbmdlcyBkdWUgdG8gdGhlIGxpbWl0YXRpb25zIGluIEFuZHJvaWQtYmFzZWQgY29uc3VtZXIgZWxlY3Ryb25pY3MuCi0gKgotICogU29tZSBvZiB0aGVtIGFyZSB0by1kb3MuIElmIGFuZCB3aGVuIHRoZXkgYXJlIGRvbmUsIHRoZXJlIHdpbGwgbm8gbG9uZ2VyIGJlCi0gKiBtZXJnZSBjb25mbGljdHMgd2l0aCB1cHN0cmVhbSBvbiB0aG9zZSBwYXJ0cy4KLSAqCi0gKiBUaGUgZmlsZSBjb250YWlucyB1c2VmdWwgaGludHMgd2hlbiB3ZSB0cnkgdG8gcmVzb2x2ZSBmdXR1cmUgMy13YXkgbWVyZ2UKLSAqIGNvbmZsaWN0cy4KLSAqLwotCi0qIEZvciBIb25leWNvbWI6IFN5bmNlZCB0byB1cHN0cmVhbSByMTEyMzQ3Ci0qIEZvciBIb25leWNvbWIgTVIxOiBTeW5jZWQgdG8gdXBzdHJlYW0gcjExOTM0OQotKiBGb3IgSG9uZXljb21iIE1SMjogU3luY2VkIHRvIHVwc3RyZWFtIHIxMTkzNDkKLSogRm9yIEljZSBDcmVhbSBTYW5kd2ljaDogU3luY2VkIHRvIHVwc3RyZWFtIHIxMzU1NzQKLSogRm9yIEljZSBDcmVhbSBTYW5kd2ljaCBNUjE6IFN5bmNlZCB0byB1cHN0cmVhbSByMTQyNTMxCi0qIEZvciBJY2UgQ3JlYW0gU2FuZHdpY2ggTVIyOiBTeW5jZWQgdG8gdXBzdHJlYW0gcjE0NjcxNQotKiBGb3IgSmVsbHliZWFuOiBTeW5jZWQgdG8gdXBzdHJlYW0gcjE1NTA4OAotKiBGb3IgSmVsbHliZWFuIE1SMTogU3luY2VkIHRvIHVwc3RyZWFtIHIxNjIzMjUKLSogRm9yIEplbGx5YmVhbiBNUjI6IFN5bmNlZCB0byB1cHN0cmVhbSByMTc3MzQ1Ci0qIEZvciBLZXkgTGltZSBQaWU6IFN5bmNlZCB0byB1cHN0cmVhbSByMTg3OTE0Ci0qIEZvciBGVVRVUkU6IFN5bmNlZCB0byBMTFZNIDMuNCByMTk4NjI2Ci0KLSogUmVjZW50IGRvd25zdHJlYW1pbmcgb24gMjAxNC8yLzExOiBTeW5jZWQgdG8gcjE5ODYyNiAoQ29udGFjdCBzcmhpbmVzIGZvciBtZXJnZSBxdWVzdGlvbnMuKQotKiBSZWNlbnQgZG93bnN0cmVhbWluZyBvbiAyMDEzLzgvODogU3luY2VkIHRvIHIxODc5MTQgKENvbnRhY3Qgc3JoaW5lcyBmb3IgbWVyZ2UgcXVlc3Rpb25zLikKLSogUmVjZW50IGRvd25zdHJlYW1pbmcgb24gMjAxMy82LzEzOiBTeW5jZWQgdG8gcjE4Mzg0OSAoQ29udGFjdCBzcmhpbmVzIGZvciBtZXJnZSBxdWVzdGlvbnMuKQotKiBSZWNlbnQgZG93bnN0cmVhbWluZyBvbiAyMDEzLzUvMzogU3luY2VkIHRvIHIxODA5NDQgKENvbnRhY3Qgc3JoaW5lcyBmb3IgbWVyZ2UgcXVlc3Rpb25zLikKLSogUmVjZW50IGRvd25zdHJlYW1pbmcgb24gMjAxMy8zLzE4OiBTeW5jZWQgdG8gcjE3NzM0NSAoQ29udGFjdCBzcmhpbmVzIGZvciBtZXJnZSBxdWVzdGlvbnMuKQotKiBSZWNlbnQgZG93bnN0cmVhbWluZyBvbiAyMDEzLzMvNTogU3luY2VkIHRvIHIxNzYxMzggKENvbnRhY3Qgc3JoaW5lcyBmb3IgbWVyZ2UgcXVlc3Rpb25zLikKLSogUmVjZW50IGRvd25zdHJlYW1pbmcgb24gMjAxMy8xLzg6IFN5bmNlZCB0byByMTcxOTA2IChDb250YWN0IHNyaGluZXMgZm9yIG1lcmdlIHF1ZXN0aW9ucy4pCi0qIFJlY2VudCBkb3duc3RyZWFtaW5nIG9uIDIwMTIvOC8yMzogU3luY2VkIHRvIHIxNjIzMjUgKHNyaGluZXMgZm9yIG1lcmdlIHF1ZXN0aW9ucykKLSogUmVjZW50IGRvd25zdHJlYW1pbmcgb24gMjAxMi84LzM6IFN5bmNlZCB0byByMTYwNjczIChzbGlhbyBmb3IgbWVyZ2UgcXVlc3Rpb25zKQotKiBSZWNlbnQgZG93bnN0cmVhbWluZyBvbiAyMDEyLzQvMjQ6IFN5bmNlZCB0byByMTU1MDg4IChzbGlhbyBmb3IgbWVyZ2UgcXVlc3Rpb25zKQotKiBSZWNlbnQgZG93bnN0cmVhbWluZyBvbiAyMDEyLzMvMjQ6IFN5bmNlZCB0byByMTUzMjIwIChzbGlhbyAmIHNyaGluZXMgZm9yIG1lcmdlIHF1ZXN0aW9ucykKLSogUmVjZW50IGRvd25zdHJlYW1pbmcgb24gMjAxMi8zLzU6IFN5bmNlZCB0byByMTUyMDYyIChzcmhpbmVzICYgc2xpYW8gZm9yIG1lcmdlIHF1ZXN0aW9ucykKLSogUmVjZW50IGRvd25zdHJlYW1pbmcgb24gMjAxMS8xMi8xNzogU3luY2VkIHRvIHIxNDY3MTUgKGxvZ2FuY2hpZW4gJiBzbGlhbyBmb3IgbWVyZ2UgcXVlc3Rpb25zKQotKiBSZWNlbnQgZG93bnN0cmVhbWluZyBvbiAyMDExLzExLzI2OiBTeW5jZWQgdG8gcjE0NTExNyAobG9nYW5jaGllbiAmIHNsaWFvIGZvciBtZXJnZSBxdWVzdGlvbnMpCi0qIFJlY2VudCBkb3duc3RyZWFtaW5nIG9uIDIwMTEvMTEvMTc6IFN5bmNlZCB0byByMTQ0NjA1IChsb2dhbmNoaWVuICYgc2xpYW8gZm9yIG1lcmdlIHF1ZXN0aW9ucykKLSogUmVjZW50IGRvd25zdHJlYW1pbmcgb24gMjAxMS8xMS8xNDogU3luY2VkIHRvIHIxNDQzNTUgKHNyaGluZXMgZm9yIG1lcmdlIHF1ZXN0aW9ucykKLSogUmVjZW50IGRvd25zdHJlYW1pbmcgb24gMjAxMS8xMC8yMjogU3luY2VkIHRvIHIxNDI1MzEgKHNsaWFvICYgbG9nYW5jaGllbiBmb3IgbWVyZ2UgcXVlc3Rpb25zKQotKiBSZWNlbnQgZG93bnN0cmVhbWluZyBvbiAyMDExLzcvMjE6ICBTeW5jZWQgdG8gcjEzNTU3NCAoc2xpYW8gJiBsb2dhbmNoaWVuIGZvciBtZXJnZSBxdWVzdGlvbnMpCi0qIFJlY2VudCBkb3duc3RyZWFtaW5nIG9uIDIwMTEvNy8xODogIFN5bmNlZCB0byByMTM1MzU5IChzbGlhbyBmb3IgbWVyZ2UgcXVlc3Rpb25zKQotKiBSZWNlbnQgZG93bnN0cmVhbWluZyBvbiAyMDExLzcvMjogICBTeW5jZWQgdG8gcjEzNDMwNSAoc2xpYW8gZm9yIG1lcmdlIHF1ZXN0aW9ucykKLSogUmVjZW50IGRvd25zdHJlYW1pbmcgb24gMjAxMS82LzMwOiAgU3luY2VkIHRvIHIxMzM3MjEgKHNsaWFvIGZvciBtZXJnZSBxdWVzdGlvbnMpCi0qIFJlY2VudCBkb3duc3RyZWFtaW5nIG9uIDIwMTEvNi8yMjogIFN5bmNlZCB0byByMTMzMTYzIChzbGlhbyBmb3IgbWVyZ2UgcXVlc3Rpb25zKQotKiBSZWNlbnQgZG93bnN0cmVhbWluZyBvbiAyMDExLzQvODogICBTeW5jZWQgdG8gcjEyOTE3MyAoc2xpYW8gZm9yIG1lcmdlIHF1ZXN0aW9ucykKLSogUmVjZW50IGRvd25zdHJlYW1pbmcgb24gMjAxMS8zLzExOiAgU3luY2VkIGZyb20gcjExOTM0OSB0byByMTI3MTIwIChzbGlhbyBmb3IgbWVyZ2UgcXVlc3Rpb25zKQotCi0qIFdlIGFkZCBBbmRyb2lkJ3MgKi5tayBmaWxlcyB0aGF0IGFyZSBzcGVjaWZpYyB0byBBbmRyb2lkJ3MgYnVpbGQgc3lzdGVtLgotCi0qIENoYW5nZXMgZm9yIGVuYWJsaW5nIGJvdGggaG9zdCBhbmQgZGV2aWNlIGJ1aWxkcy4KLQpkaWZmIC0tZ2l0IGEvYmluZGluZ3MvcHl0aG9uL2NsYW5nL2NpbmRleC5weSBiL2JpbmRpbmdzL3B5dGhvbi9jbGFuZy9jaW5kZXgucHkKaW5kZXggYzEwM2M3MC4uNTA3ODgyNSAxMDA2NDQKLS0tIGEvYmluZGluZ3MvcHl0aG9uL2NsYW5nL2NpbmRleC5weQorKysgYi9iaW5kaW5ncy9weXRob24vY2xhbmcvY2luZGV4LnB5CkBAIC0xODIwLDcgKzE4MjAsNyBAQAogICAgICAgICAgICAgIyA1IDogQ29tcGxldGlvbkNodW5rLktpbmQoIkN1cnJlbnRQYXJhbWV0ZXIiKSwKICAgICAgICAgICAgIDY6ICcoJywgICAjIENvbXBsZXRpb25DaHVuay5LaW5kKCJMZWZ0UGFyZW4iKSwKICAgICAgICAgICAgIDc6ICcpJywgICAjIENvbXBsZXRpb25DaHVuay5LaW5kKCJSaWdodFBhcmVuIiksCi0gICAgICAgICAgICA4OiAnXScsICAgIyBDb21wbGV0aW9uQ2h1bmsuS2luZCgiTGVmdEJyYWNrZXQiKSwKKyAgICAgICAgICAgIDg6ICdbJywgICAjIENvbXBsZXRpb25DaHVuay5LaW5kKCJMZWZ0QnJhY2tldCIpLAogICAgICAgICAgICAgOTogJ10nLCAgICMgQ29tcGxldGlvbkNodW5rLktpbmQoIlJpZ2h0QnJhY2tldCIpLAogICAgICAgICAgICAgMTA6ICd7JywgICMgQ29tcGxldGlvbkNodW5rLktpbmQoIkxlZnRCcmFjZSIpLAogICAgICAgICAgICAgMTE6ICd9JywgICMgQ29tcGxldGlvbkNodW5rLktpbmQoIlJpZ2h0QnJhY2UiKSwKQEAgLTI1MDEsNyArMjUwMSw3IEBACiAgICAgY29uc3RhbnRzIGluIHRoaXMgY2xhc3MuCiAgICAgIiIiCiAKLSAgICAjIEFuIHVua25vd24gZXJyb3Igb2NjdXJlZAorICAgICMgQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZAogICAgIEVSUk9SX1VOS05PV04gPSAwCiAKICAgICAjIFRoZSBkYXRhYmFzZSBjb3VsZCBub3QgYmUgbG9hZGVkCkBAIC0yNjA3LDYgKzI2MDcsMTQgQEAKICAgICAgICAgcmV0dXJuIGNvbmYubGliLmNsYW5nX0NvbXBpbGF0aW9uRGF0YWJhc2VfZ2V0Q29tcGlsZUNvbW1hbmRzKHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSkKIAorICAgIGRlZiBnZXRBbGxDb21waWxlQ29tbWFuZHMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBHZXQgYW4gaXRlcmFibGUgb2JqZWN0IHByb3ZpZGluZyBhbGwgdGhlIENvbXBpbGVDb21tYW5kcyBhdmFpbGFibGUgZnJvbQorICAgICAgICB0aGUgZGF0YWJhc2UuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gY29uZi5saWIuY2xhbmdfQ29tcGlsYXRpb25EYXRhYmFzZV9nZXRBbGxDb21waWxlQ29tbWFuZHMoc2VsZikKKworCiBjbGFzcyBUb2tlbihTdHJ1Y3R1cmUpOgogICAgICIiIlJlcHJlc2VudHMgYSBzaW5nbGUgdG9rZW4gZnJvbSB0aGUgcHJlcHJvY2Vzc29yLgogCkBAIC0yNjczLDYgKzI2ODEsMTEgQEAKICAgIGNfb2JqZWN0X3AsCiAgICBDb21waWxhdGlvbkRhdGFiYXNlLmZyb21fcmVzdWx0KSwKIAorICAoImNsYW5nX0NvbXBpbGF0aW9uRGF0YWJhc2VfZ2V0QWxsQ29tcGlsZUNvbW1hbmRzIiwKKyAgIFtjX29iamVjdF9wXSwKKyAgIGNfb2JqZWN0X3AsCisgICBDb21waWxlQ29tbWFuZHMuZnJvbV9yZXN1bHQpLAorCiAgICgiY2xhbmdfQ29tcGlsYXRpb25EYXRhYmFzZV9nZXRDb21waWxlQ29tbWFuZHMiLAogICAgW2Nfb2JqZWN0X3AsIGNfY2hhcl9wXSwKICAgIGNfb2JqZWN0X3AsCmRpZmYgLS1naXQgYS9iaW5kaW5ncy9weXRob24vdGVzdHMvY2luZGV4L3Rlc3RfY2RiLnB5IGIvYmluZGluZ3MvcHl0aG9uL3Rlc3RzL2NpbmRleC90ZXN0X2NkYi5weQppbmRleCBkMGY1ODBlLi5lMWY4MjRmIDEwMDY0NAotLS0gYS9iaW5kaW5ncy9weXRob24vdGVzdHMvY2luZGV4L3Rlc3RfY2RiLnB5CisrKyBiL2JpbmRpbmdzL3B5dGhvbi90ZXN0cy9jaW5kZXgvdGVzdF9jZGIucHkKQEAgLTMyLDYgKzMyLDI3IEBACiAgICAgY21kcyA9IGNkYi5nZXRDb21waWxlQ29tbWFuZHMoJy9ob21lL2pvaG4uZG9lL015UHJvamVjdC9wcm9qZWN0LmNwcCcpCiAgICAgYXNzZXJ0IGxlbihjbWRzKSAhPSAwCiAKK2RlZiB0ZXN0X2FsbF9jb21waWxlY29tbWFuZCgpOgorICAgICIiIkNoZWNrIHdlIGdldCBhbGwgcmVzdWx0cyBmcm9tIHRoZSBkYiIiIgorICAgIGNkYiA9IENvbXBpbGF0aW9uRGF0YWJhc2UuZnJvbURpcmVjdG9yeShrSW5wdXRzRGlyKQorICAgIGNtZHMgPSBjZGIuZ2V0QWxsQ29tcGlsZUNvbW1hbmRzKCkKKyAgICBhc3NlcnQgbGVuKGNtZHMpID09IDMKKyAgICBleHBlY3RlZCA9IFsKKyAgICAgICAgeyAnd2QnOiAnL2hvbWUvam9obi5kb2UvTXlQcm9qZWN0QScsCisgICAgICAgICAgJ2xpbmUnOiBbJ2NsYW5nKysnLCAnLW8nLCAncHJvamVjdDIubycsICctYycsCisgICAgICAgICAgICAgICAgICAgJy9ob21lL2pvaG4uZG9lL015UHJvamVjdC9wcm9qZWN0Mi5jcHAnXX0sCisgICAgICAgIHsgJ3dkJzogJy9ob21lL2pvaG4uZG9lL015UHJvamVjdEInLAorICAgICAgICAgICdsaW5lJzogWydjbGFuZysrJywgJy1ERkVBVFVSRT0xJywgJy1vJywgJ3Byb2plY3QyLWZlYXR1cmUubycsICctYycsCisgICAgICAgICAgICAgICAgICAgJy9ob21lL2pvaG4uZG9lL015UHJvamVjdC9wcm9qZWN0Mi5jcHAnXX0sCisgICAgICAgIHsgJ3dkJzogJy9ob21lL2pvaG4uZG9lL015UHJvamVjdCcsCisgICAgICAgICAgJ2xpbmUnOiBbJ2NsYW5nKysnLCAnLW8nLCAncHJvamVjdC5vJywgJy1jJywKKyAgICAgICAgICAgICAgICAgICAnL2hvbWUvam9obi5kb2UvTXlQcm9qZWN0L3Byb2plY3QuY3BwJ119CisgICAgICAgIF0KKyAgICBmb3IgaSBpbiByYW5nZShsZW4oY21kcykpOgorICAgICAgICBhc3NlcnQgY21kc1tpXS5kaXJlY3RvcnkgPT0gZXhwZWN0ZWRbaV1bJ3dkJ10KKyAgICAgICAgZm9yIGFyZywgZXhwIGluIHppcChjbWRzW2ldLmFyZ3VtZW50cywgZXhwZWN0ZWRbaV1bJ2xpbmUnXSk6CisgICAgICAgICAgICBhc3NlcnQgYXJnID09IGV4cAorCiBkZWYgdGVzdF8xX2NvbXBpbGVjb21tYW5kKCk6CiAgICAgIiIiQ2hlY2sgZmlsZSB3aXRoIHNpbmdsZSBjb21waWxlIGNvbW1hbmQiIiIKICAgICBjZGIgPSBDb21waWxhdGlvbkRhdGFiYXNlLmZyb21EaXJlY3Rvcnkoa0lucHV0c0RpcikKZGlmZiAtLWdpdCBhL2JpbmRpbmdzL3B5dGhvbi90ZXN0cy9jaW5kZXgvdGVzdF90cmFuc2xhdGlvbl91bml0LnB5IGIvYmluZGluZ3MvcHl0aG9uL3Rlc3RzL2NpbmRleC90ZXN0X3RyYW5zbGF0aW9uX3VuaXQucHkKaW5kZXggZjc3OTk4ZS4uYmU2Y2Q2NyAxMDA2NDQKLS0tIGEvYmluZGluZ3MvcHl0aG9uL3Rlc3RzL2NpbmRleC90ZXN0X3RyYW5zbGF0aW9uX3VuaXQucHkKKysrIGIvYmluZGluZ3MvcHl0aG9uL3Rlc3RzL2NpbmRleC90ZXN0X3RyYW5zbGF0aW9uX3VuaXQucHkKQEAgLTEsNSArMSw2IEBACiBpbXBvcnQgZ2MKIGltcG9ydCBvcworaW1wb3J0IHRlbXBmaWxlCiAKIGZyb20gY2xhbmcuY2luZGV4IGltcG9ydCBDdXJzb3JLaW5kCiBmcm9tIGNsYW5nLmNpbmRleCBpbXBvcnQgQ3Vyc29yCkBAIC05MywxNSArOTQsNyBAQAogCiAgICAgUmV0dXJucyB0aGUgZmlsZW5hbWUgaXQgd2FzIHNhdmVkIHRvLgogICAgICIiIgotCi0gICAgIyBGSVhNRSBHZW5lcmF0ZSBhIHRlbXAgZmlsZSBwYXRoIHVzaW5nIHN5c3RlbSBBUElzLgotICAgIGJhc2UgPSAnVEVNUF9GT1JfVFJBTlNMQVRJT05VTklUX1NBVkUuYycKLSAgICBwYXRoID0gb3MucGF0aC5qb2luKGtJbnB1dHNEaXIsIGJhc2UpCi0KLSAgICAjIEp1c3QgaW4gY2FzZS4KLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLSAgICAgICAgb3MudW5saW5rKHBhdGgpCi0KKyAgICBfLCBwYXRoID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgdHUuc2F2ZShwYXRoKQogCiAgICAgcmV0dXJuIHBhdGgKZGlmZiAtLWdpdCBhL2NsYW5nLXRibGdlbi1ydWxlcy5tayBiL2NsYW5nLXRibGdlbi1ydWxlcy5tawppbmRleCA2YTUwNTJhLi5hMmFlNDA1IDEwMDY0NAotLS0gYS9jbGFuZy10YmxnZW4tcnVsZXMubWsKKysrIGIvY2xhbmctdGJsZ2VuLXJ1bGVzLm1rCkBAIC0xLDQgKzEsNCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjNCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgVGFibGVHZW46IENvbXBpbGUgLnRkIGZpbGVzIHRvIC5pbmMuCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLCkKQEAgLTIzLDYgKzIzLDEzIEBACiAJJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxjbGFuZy1hdHRyLWltcGwpCiBlbmRpZgogCitpZm5lcSAoJChmaW5kc3RyaW5nIEF0dHJIYXNBdHRyaWJ1dGVJbXBsLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCitMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ckhhc0F0dHJpYnV0ZUltcGwuaW5jCiskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ckhhc0F0dHJpYnV0ZUltcGwuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJIYXNBdHRyaWJ1dGVJbXBsLmluYzogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ci50ZCB8ICQoQ0xBTkdfVEJMR0VOKQorCSQoY2FsbCB0cmFuc2Zvcm0taG9zdC1jbGFuZy10ZC10by1vdXQsY2xhbmctYXR0ci1oYXMtYXR0cmlidXRlLWltcGwpCitlbmRpZgorCiBpZm5lcSAoJChmaW5kc3RyaW5nIEF0dHJMaXN0LmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCiBMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ckxpc3QuaW5jCiAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ckxpc3QuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQpAQCAtMzAsMTMgKzM3LDYgQEAKIAkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWF0dHItbGlzdCkKIGVuZGlmCiAKLWlmbmVxICgkKGZpbmRzdHJpbmcgQXR0clNwZWxsaW5ncy5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQotTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0xleC9BdHRyU3BlbGxpbmdzLmluYwotJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0xleC9BdHRyU3BlbGxpbmdzLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKLSQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9MZXgvQXR0clNwZWxsaW5ncy5pbmM6ICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQgfCAkKENMQU5HX1RCTEdFTikKLQkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWF0dHItc3BlbGxpbmctbGlzdCkKLWVuZGlmCi0KIGlmbmVxICgkKGZpbmRzdHJpbmcgQXR0clNwZWxsaW5nTGlzdEluZGV4LmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCiBMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyU3BlbGxpbmdMaXN0SW5kZXguaW5jCiAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyU3BlbGxpbmdMaXN0SW5kZXguaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQpAQCAtNTgsMjAgKzU4LDYgQEAKIAkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWF0dHItcGNoLXdyaXRlKQogZW5kaWYKIAotaWZuZXEgKCQoZmluZHN0cmluZyBBdHRySWRlbnRpZmllckFyZy5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQotTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1BhcnNlL0F0dHJJZGVudGlmaWVyQXJnLmluYwotJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1BhcnNlL0F0dHJJZGVudGlmaWVyQXJnLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKLSQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9QYXJzZS9BdHRySWRlbnRpZmllckFyZy5pbmM6ICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQgfCAkKENMQU5HX1RCTEdFTikKLQkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWF0dHItaWRlbnRpZmllci1hcmctbGlzdCkKLWVuZGlmCi0KLWlmbmVxICgkKGZpbmRzdHJpbmcgQXR0ckxhdGVQYXJzZWQuaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKLUxPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9QYXJzZS9BdHRyTGF0ZVBhcnNlZC5pbmMKLSQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9QYXJzZS9BdHRyTGF0ZVBhcnNlZC5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCi0kKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvUGFyc2UvQXR0ckxhdGVQYXJzZWQuaW5jOiAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyLnRkIHwgJChDTEFOR19UQkxHRU4pCi0JJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxjbGFuZy1hdHRyLWxhdGUtcGFyc2VkLWxpc3QpCi1lbmRpZgotCiBpZm5lcSAoJChmaW5kc3RyaW5nIEF0dHJzLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCiBMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0F0dHJzLmluYwogJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9BdHRycy5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCkBAIC03OSw2ICs2NSwyMCBAQAogCSQoY2FsbCB0cmFuc2Zvcm0taG9zdC1jbGFuZy10ZC10by1vdXQsY2xhbmctYXR0ci1jbGFzc2VzKQogZW5kaWYKIAoraWZuZXEgKCQoZmluZHN0cmluZyBBdHRyUGFyc2VyU3RyaW5nU3dpdGNoZXMuaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9QYXJzZS9BdHRyUGFyc2VyU3RyaW5nU3dpdGNoZXMuaW5jCiskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvUGFyc2UvQXR0clBhcnNlclN0cmluZ1N3aXRjaGVzLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9QYXJzZS9BdHRyUGFyc2VyU3RyaW5nU3dpdGNoZXMuaW5jOiAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyLnRkIHwgJChDTEFOR19UQkxHRU4pCisJJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxjbGFuZy1hdHRyLXBhcnNlci1zdHJpbmctc3dpdGNoZXMpCitlbmRpZgorCitpZm5lcSAoJChmaW5kc3RyaW5nIEF0dHJWaXNpdG9yLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCitMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0F0dHJWaXNpdG9yLmluYworJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyVmlzaXRvci5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCiskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0F0dHJWaXNpdG9yLmluYzogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ci50ZCB8ICQoQ0xBTkdfVEJMR0VOKQorCSQoY2FsbCB0cmFuc2Zvcm0taG9zdC1jbGFuZy10ZC10by1vdXQsY2xhbmctYXR0ci1hc3QtdmlzaXRvcikKK2VuZGlmCisKIGlmbmVxICgkKGZpbmRzdHJpbmcgQXR0clBhcnNlZEF0dHJLaW5kcy5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQogTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0clBhcnNlZEF0dHJLaW5kcy5pbmMKICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRyS2luZHMuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQpAQCAtMTAwLDEzICsxMDAsNiBAQAogCSQoY2FsbCB0cmFuc2Zvcm0taG9zdC1jbGFuZy10ZC10by1vdXQsY2xhbmctYXR0ci1wYXJzZWQtYXR0ci1saXN0KQogZW5kaWYKIAotaWZuZXEgKCQoZmluZHN0cmluZyBBdHRyVHlwZUFyZy5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQotTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1BhcnNlL0F0dHJUeXBlQXJnLmluYwotJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1BhcnNlL0F0dHJUeXBlQXJnLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKLSQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9QYXJzZS9BdHRyVHlwZUFyZy5pbmM6ICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQgfCAkKENMQU5HX1RCTEdFTikKLQkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWF0dHItdHlwZS1hcmctbGlzdCkKLWVuZGlmCi0KIGlmbmVxICgkKGZpbmRzdHJpbmcgQXR0clRlbXBsYXRlSW5zdGFudGlhdGUuaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKIExPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJUZW1wbGF0ZUluc3RhbnRpYXRlLmluYwogJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0clRlbXBsYXRlSW5zdGFudGlhdGUuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvZG9jcy9BZGRyZXNzU2FuaXRpemVyLnJzdCBiL2RvY3MvQWRkcmVzc1Nhbml0aXplci5yc3QKaW5kZXggNWJjNmQwYi4uOTNhNmEwZSAxMDA2NDQKLS0tIGEvZG9jcy9BZGRyZXNzU2FuaXRpemVyLnJzdAorKysgYi9kb2NzL0FkZHJlc3NTYW5pdGl6ZXIucnN0CkBAIC02MSwxNCArNjEsMTQgQEAKICAgICAlIGNsYW5nIC1nIC1mc2FuaXRpemU9YWRkcmVzcyBleGFtcGxlX1VzZUFmdGVyRnJlZS5vCiAKIElmIGEgYnVnIGlzIGRldGVjdGVkLCB0aGUgcHJvZ3JhbSB3aWxsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgdG8gc3RkZXJyIGFuZAotZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlLiBDdXJyZW50bHksIEFkZHJlc3NTYW5pdGl6ZXIgZG9lcyBub3Qgc3ltYm9saXplCi1pdHMgb3V0cHV0LCBzbyB5b3UgbWF5IG5lZWQgdG8gdXNlIGEgc2VwYXJhdGUgc2NyaXB0IHRvIHN5bWJvbGl6ZSB0aGUgcmVzdWx0Ci1vZmZsaW5lICh0aGlzIHdpbGwgYmUgZml4ZWQgaW4gZnV0dXJlKS4KK2V4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZS4gVG8gbWFrZSBBZGRyZXNzU2FuaXRpemVyIHN5bWJvbGl6ZSBpdHMgb3V0cHV0Cit5b3UgbmVlZCB0byBzZXQgdGhlIGBgQVNBTl9TWU1CT0xJWkVSX1BBVEhgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwb2ludCB0bwordGhlIGBgbGx2bS1zeW1ib2xpemVyYGAgYmluYXJ5IChvciBtYWtlIHN1cmUgYGBsbHZtLXN5bWJvbGl6ZXJgYCBpcyBpbiB5b3VyCitgYCRQQVRIYGApOgogCiAuLiBjb2RlLWJsb2NrOjogY29uc29sZQogCi0gICAgJSAuL2Eub3V0IDI+IGxvZwotICAgICUgcHJvamVjdHMvY29tcGlsZXItcnQvbGliL2FzYW4vc2NyaXB0cy9hc2FuX3N5bWJvbGl6ZS5weSAvIDwgbG9nIHwgYysrZmlsdAorICAgICUgQVNBTl9TWU1CT0xJWkVSX1BBVEg9L3Vzci9sb2NhbC9iaW4vbGx2bS1zeW1ib2xpemVyIC4vYS5vdXQKICAgICA9PTk0NDI9PSBFUlJPUjogQWRkcmVzc1Nhbml0aXplciBoZWFwLXVzZS1hZnRlci1mcmVlIG9uIGFkZHJlc3MgMHg3ZjdkZGFiOGMwODQgYXQgcGMgMHg0MDNjOGMgYnAgMHg3ZmZmODdmYjgyZDAgc3AgMHg3ZmZmODdmYjgyYzgKICAgICBSRUFEIG9mIHNpemUgNCBhdCAweDdmN2RkYWI4YzA4NCB0aHJlYWQgVDAKICAgICAgICAgIzAgMHg0MDNjOGMgaW4gbWFpbiBleGFtcGxlX1VzZUFmdGVyRnJlZS5jYzo0CkBAIC04NCw2ICs4NCwyMyBAQAogICAgICAgICAjMiAweDdmN2RkYWJjYWM0ZCBpbiBfX2xpYmNfc3RhcnRfbWFpbiA/PzowCiAgICAgPT05NDQyPT0gQUJPUlRJTkcKIAorSWYgdGhhdCBkb2VzIG5vdCB3b3JrIGZvciB5b3UgKGUuZy4geW91ciBwcm9jZXNzIGlzIHNhbmRib3hlZCksIHlvdSBjYW4gdXNlIGEKK3NlcGFyYXRlIHNjcmlwdCB0byBzeW1ib2xpemUgdGhlIHJlc3VsdCBvZmZsaW5lIChvbmxpbmUgc3ltYm9saXphdGlvbiBjYW4gYmUKK2ZvcmNlIGRpc2FibGVkIGJ5IHNldHRpbmcgYGBBU0FOX09QVElPTlM9c3ltYm9saXplPTBgYCk6CisKKy4uIGNvZGUtYmxvY2s6OiBjb25zb2xlCisKKyAgICAlIEFTQU5fT1BUSU9OUz1zeW1ib2xpemU9MCAuL2Eub3V0IDI+IGxvZworICAgICUgcHJvamVjdHMvY29tcGlsZXItcnQvbGliL2FzYW4vc2NyaXB0cy9hc2FuX3N5bWJvbGl6ZS5weSAvIDwgbG9nIHwgYysrZmlsdAorICAgID09OTQ0Mj09IEVSUk9SOiBBZGRyZXNzU2FuaXRpemVyIGhlYXAtdXNlLWFmdGVyLWZyZWUgb24gYWRkcmVzcyAweDdmN2RkYWI4YzA4NCBhdCBwYyAweDQwM2M4YyBicCAweDdmZmY4N2ZiODJkMCBzcCAweDdmZmY4N2ZiODJjOAorICAgIFJFQUQgb2Ygc2l6ZSA0IGF0IDB4N2Y3ZGRhYjhjMDg0IHRocmVhZCBUMAorICAgICAgICAjMCAweDQwM2M4YyBpbiBtYWluIGV4YW1wbGVfVXNlQWZ0ZXJGcmVlLmNjOjQKKyAgICAgICAgIzEgMHg3ZjdkZGFiY2FjNGQgaW4gX19saWJjX3N0YXJ0X21haW4gPz86MAorICAgIC4uLgorCitOb3RlIHRoYXQgb24gT1MgWCB5b3UgbWF5IG5lZWQgdG8gcnVuIGBgZHN5bXV0aWxgYCBvbiB5b3VyIGJpbmFyeSB0byBoYXZlIHRoZQorZmlsZVw6bGluZSBpbmZvIGluIHRoZSBBZGRyZXNzU2FuaXRpemVyIHJlcG9ydHMuCisKIEFkZHJlc3NTYW5pdGl6ZXIgZXhpdHMgb24gdGhlIGZpcnN0IGRldGVjdGVkIGVycm9yLiBUaGlzIGlzIGJ5IGRlc2lnbi4KIE9uZSByZWFzb246IGl0IG1ha2VzIHRoZSBnZW5lcmF0ZWQgY29kZSBzbWFsbGVyIGFuZCBmYXN0ZXIgKGJvdGggYnkKIH41JSkuIEFub3RoZXIgcmVhc29uOiB0aGlzIG1ha2VzIGZpeGluZyBidWdzIHVuYXZvaWRhYmxlLiBXaXRoIFZhbGdyaW5kLApAQCAtMTY3LDExICsxODQsMTEgQEAKIAogQWRkcmVzc1Nhbml0aXplciBpcyBzdXBwb3J0ZWQgb24KIAotKiBMaW51eCBpMzg2L3g4NlxfNjQgKHRlc3RlZCBvbiBVYnVudHUgMTAuMDQgYW5kIDEyLjA0KTsKLSogTWFjT1MgMTAuNiwgMTAuNyBhbmQgMTAuOCAoaTM4Ni94ODZcXzY0KS4KKyogTGludXggaTM4Ni94ODZcXzY0ICh0ZXN0ZWQgb24gVWJ1bnR1IDEyLjA0KTsKKyogTWFjT1MgMTAuNiAtIDEwLjkgKGkzODYveDg2XF82NCkuCisqIEFuZHJvaWQgQVJNCiAKLVN1cHBvcnQgZm9yIExpbnV4IEFSTSAoYW5kIEFuZHJvaWQgQVJNKSBpcyBpbiBwcm9ncmVzcyAoaXQgbWF5IHdvcmssIGJ1dAotaXMgbm90IGd1YXJhbnRlZWQgdG9vKS4KK1BvcnRzIHRvIHZhcmlvdXMgb3RoZXIgcGxhdGZvcm1zIGFyZSBpbiBwcm9ncmVzcy4KIAogTGltaXRhdGlvbnMKID09PT09PT09PT09CmRpZmYgLS1naXQgYS9kb2NzL0F0dHJpYnV0ZVJlZmVyZW5jZS5yc3QgYi9kb2NzL0F0dHJpYnV0ZVJlZmVyZW5jZS5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhODEyZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvQXR0cmlidXRlUmVmZXJlbmNlLnJzdApAQCAtMCwwICsxLDEwMjYgQEAKKy4uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTk9URTogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgY2xhbmctdGJsZ2VuCisgIC1nZW4tYXR0ci1kb2NzLiBEbyBub3QgZWRpdCB0aGlzIGZpbGUgYnkgaGFuZCEhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPT09PT09PT09PT09PT09PT09PQorQXR0cmlidXRlcyBpbiBDbGFuZworPT09PT09PT09PT09PT09PT09PQorLi4gY29udGVudHM6OgorICAgOmxvY2FsOgorCitJbnRyb2R1Y3Rpb24KKz09PT09PT09PT09PQorCitUaGlzIHBhZ2UgbGlzdHMgdGhlIGF0dHJpYnV0ZXMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBDbGFuZy4KKworRnVuY3Rpb24gQXR0cmlidXRlcworPT09PT09PT09PT09PT09PT09PQorCisKK2ludGVycnVwdAorLS0tLS0tLS0tCisuLiBjc3YtdGFibGU6OiBTdXBwb3J0ZWQgU3ludGF4ZXMKKyAgIDpoZWFkZXI6ICJHTlUiLCAiQysrMTEiLCAiX19kZWNsc3BlYyIsICJLZXl3b3JkIgorCisgICAiWCIsIiIsIiIsIiIKKworQ2xhbmcgc3VwcG9ydHMgdGhlIEdOVSBzdHlsZSBgYF9fYXR0cmlidXRlX18oKGludGVycnVwdCgiVFlQRSIpKSlgYCBhdHRyaWJ1dGUgb24KK0FSTSB0YXJnZXRzLiBUaGlzIGF0dHJpYnV0ZSBtYXkgYmUgYXR0YWNoZWQgdG8gYSBmdW5jdGlvbiBkZWZpbml0aW9uIGFuZAoraW5zdHJ1Y3RzIHRoZSBiYWNrZW5kIHRvIGdlbmVyYXRlIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIGVudHJ5L2V4aXQgY29kZSBzbyB0aGF0CitpdCBjYW4gYmUgdXNlZCBkaXJlY3RseSBhcyBhbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorCitUaGUgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgaW50ZXJydXB0IGF0dHJpYnV0ZSBpcyBvcHRpb25hbCwgYnV0IGlmCitwcm92aWRlZCBpdCBtdXN0IGJlIGEgc3RyaW5nIGxpdGVyYWwgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICJJUlEiLAorIkZJUSIsICJTV0kiLCAiQUJPUlQiLCAiVU5ERUYiLgorCitUaGUgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzOgorCistIElmIHRoZSBmdW5jdGlvbiBpcyBBQVBDUywgQ2xhbmcgaW5zdHJ1Y3RzIHRoZSBiYWNrZW5kIHRvIHJlYWxpZ24gdGhlIHN0YWNrIHRvCisgIDggYnl0ZXMgb24gZW50cnkuIFRoaXMgaXMgYSBnZW5lcmFsIHJlcXVpcmVtZW50IG9mIHRoZSBBQVBDUyBhdCBwdWJsaWMKKyAgaW50ZXJmYWNlcywgYnV0IG1heSBub3QgaG9sZCB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0YWtlbi4gRG9pbmcgdGhpcyBhbGxvd3MKKyAgb3RoZXIgQUFQQ1MgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZC4KKy0gSWYgdGhlIENQVSBpcyBNLWNsYXNzIHRoaXMgaXMgYWxsIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBzaW5jZSB0aGUgYXJjaGl0ZWN0dXJlCisgIGl0c2VsZiBpcyBkZXNpZ25lZCBpbiBzdWNoIGEgd2F5IHRoYXQgZnVuY3Rpb25zIG9iZXlpbmcgdGhlIG5vcm1hbCBBQVBDUyBBQkkKKyAgY29uc3RyYWludHMgYXJlIHZhbGlkIGV4Y2VwdGlvbiBoYW5kbGVycy4KKy0gSWYgdGhlIENQVSBpcyBub3QgTS1jbGFzcywgdGhlIHByb2xvZ3VlIGFuZCBlcGlsb2d1ZSBhcmUgbW9kaWZpZWQgdG8gc2F2ZSBhbGwKKyAgbm9uLWJhbmtlZCByZWdpc3RlcnMgdGhhdCBhcmUgdXNlZCwgc28gdGhhdCB1cG9uIHJldHVybiB0aGUgdXNlci1tb2RlIHN0YXRlCisgIHdpbGwgbm90IGJlIGNvcnJ1cHRlZC4gTm90ZSB0aGF0IHRvIGF2b2lkIHVubmVjZXNzYXJ5IG92ZXJoZWFkLCBvbmx5CisgIGdlbmVyYWwtcHVycG9zZSAoaW50ZWdlcikgcmVnaXN0ZXJzIGFyZSBzYXZlZCBpbiB0aGlzIHdheS4gSWYgVkZQIG9wZXJhdGlvbnMKKyAgYXJlIG5lZWRlZCwgdGhhdCBzdGF0ZSBtdXN0IGJlIHNhdmVkIG1hbnVhbGx5LgorCisgIFNwZWNpZmljYWxseSwgaW50ZXJydXB0IGtpbmRzIG90aGVyIHRoYW4gIkZJUSIgd2lsbCBzYXZlIGFsbCBjb3JlIHJlZ2lzdGVycworICBleGNlcHQgImxyIiBhbmQgInNwIi4gIkZJUSIgaW50ZXJydXB0cyB3aWxsIHNhdmUgcjAtcjcuCistIElmIHRoZSBDUFUgaXMgbm90IE0tY2xhc3MsIHRoZSByZXR1cm4gaW5zdHJ1Y3Rpb24gaXMgY2hhbmdlZCB0byBvbmUgb2YgdGhlCisgIGNhbm9uaWNhbCBzZXF1ZW5jZXMgcGVybWl0dGVkIGJ5IHRoZSBhcmNoaXRlY3R1cmUgZm9yIGV4Y2VwdGlvbiByZXR1cm4uIFdoZXJlCisgIHBvc3NpYmxlIHRoZSBmdW5jdGlvbiBpdHNlbGYgd2lsbCBtYWtlIHRoZSBuZWNlc3NhcnkgImxyIiBhZGp1c3RtZW50cyBzbyB0aGF0CisgIHRoZSAicHJlZmVycmVkIHJldHVybiBhZGRyZXNzIiBpcyBzZWxlY3RlZC4KKworICBVbmZvcnR1bmF0ZWx5IHRoZSBjb21waWxlciBpcyB1bmFibGUgdG8gbWFrZSB0aGlzIGd1YXJhbnRlZSBmb3IgYW4gIlVOREVGIgorICBoYW5kbGVyLCB3aGVyZSB0aGUgb2Zmc2V0IGZyb20gImxyIiB0byB0aGUgcHJlZmVycmVkIHJldHVybiBhZGRyZXNzIGRlcGVuZHMgb24KKyAgdGhlIGV4ZWN1dGlvbiBzdGF0ZSBvZiB0aGUgY29kZSB3aGljaCBnZW5lcmF0ZWQgdGhlIGV4Y2VwdGlvbi4gSW4gdGhpcyBjYXNlCisgIGEgc2VxdWVuY2UgZXF1aXZhbGVudCB0byAibW92cyBwYywgbHIiIHdpbGwgYmUgdXNlZC4KKworCithY3F1aXJlX2NhcGFiaWxpdHkgKGFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHksIGNsYW5nOjphY3F1aXJlX2NhcGFiaWxpdHksIGNsYW5nOjphY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiWCIsIiIsIiIKKworTWFya3MgYSBmdW5jdGlvbiBhcyBhY3F1aXJpbmcgYSBjYXBhYmlsaXR5LgorCisKK2Fzc2VydF9jYXBhYmlsaXR5IChhc3NlcnRfc2hhcmVkX2NhcGFiaWxpdHksIGNsYW5nOjphc3NlcnRfY2FwYWJpbGl0eSwgY2xhbmc6OmFzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiWCIsIiIsIiIKKworTWFya3MgYSBmdW5jdGlvbiB0aGF0IGR5bmFtaWNhbGx5IHRlc3RzIHdoZXRoZXIgYSBjYXBhYmlsaXR5IGlzIGhlbGQsIGFuZCBoYWx0cwordGhlIHByb2dyYW0gaWYgaXQgaXMgbm90IGhlbGQuCisKKworYXZhaWxhYmlsaXR5CistLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiIiwiIiwiIgorCitUaGUgYGBhdmFpbGFiaWxpdHlgYCBhdHRyaWJ1dGUgY2FuIGJlIHBsYWNlZCBvbiBkZWNsYXJhdGlvbnMgdG8gZGVzY3JpYmUgdGhlCitsaWZlY3ljbGUgb2YgdGhhdCBkZWNsYXJhdGlvbiByZWxhdGl2ZSB0byBvcGVyYXRpbmcgc3lzdGVtIHZlcnNpb25zLiAgQ29uc2lkZXIKK3RoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBmb3IgYSBoeXBvdGhldGljYWwgZnVuY3Rpb24gYGBmYGA6CisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICB2b2lkIGYodm9pZCkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjQsZGVwcmVjYXRlZD0xMC42LG9ic29sZXRlZD0xMC43KSkpOworCitUaGUgYXZhaWxhYmlsaXR5IGF0dHJpYnV0ZSBzdGF0ZXMgdGhhdCBgYGZgYCB3YXMgaW50cm9kdWNlZCBpbiBNYWMgT1MgWCAxMC40LAorZGVwcmVjYXRlZCBpbiBNYWMgT1MgWCAxMC42LCBhbmQgb2Jzb2xldGVkIGluIE1hYyBPUyBYIDEwLjcuICBUaGlzIGluZm9ybWF0aW9uCitpcyB1c2VkIGJ5IENsYW5nIHRvIGRldGVybWluZSB3aGVuIGl0IGlzIHNhZmUgdG8gdXNlIGBgZmBgOiBmb3IgZXhhbXBsZSwgaWYKK0NsYW5nIGlzIGluc3RydWN0ZWQgdG8gY29tcGlsZSBjb2RlIGZvciBNYWMgT1MgWCAxMC41LCBhIGNhbGwgdG8gYGBmKClgYAorc3VjY2VlZHMuICBJZiBDbGFuZyBpcyBpbnN0cnVjdGVkIHRvIGNvbXBpbGUgY29kZSBmb3IgTWFjIE9TIFggMTAuNiwgdGhlIGNhbGwKK3N1Y2NlZWRzIGJ1dCBDbGFuZyBlbWl0cyBhIHdhcm5pbmcgc3BlY2lmeWluZyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLgorRmluYWxseSwgaWYgQ2xhbmcgaXMgaW5zdHJ1Y3RlZCB0byBjb21waWxlIGNvZGUgZm9yIE1hYyBPUyBYIDEwLjcsIHRoZSBjYWxsCitmYWlscyBiZWNhdXNlIGBgZigpYGAgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KKworVGhlIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBzdGFydGluZyB3aXRoIHRoZQorcGxhdGZvcm0gbmFtZSBhbmQgdGhlbiBpbmNsdWRpbmcgY2xhdXNlcyBzcGVjaWZ5aW5nIGltcG9ydGFudCBtaWxlc3RvbmVzIGluIHRoZQorZGVjbGFyYXRpb24ncyBsaWZldGltZSAoaW4gYW55IG9yZGVyKSBhbG9uZyB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICBUaG9zZQorY2xhdXNlcyBjYW4gYmU6CisKK2ludHJvZHVjZWQ9XCAqdmVyc2lvbioKKyAgVGhlIGZpcnN0IHZlcnNpb24gaW4gd2hpY2ggdGhpcyBkZWNsYXJhdGlvbiB3YXMgaW50cm9kdWNlZC4KKworZGVwcmVjYXRlZD1cICp2ZXJzaW9uKgorICBUaGUgZmlyc3QgdmVyc2lvbiBpbiB3aGljaCB0aGlzIGRlY2xhcmF0aW9uIHdhcyBkZXByZWNhdGVkLCBtZWFuaW5nIHRoYXQKKyAgdXNlcnMgc2hvdWxkIG1pZ3JhdGUgYXdheSBmcm9tIHRoaXMgQVBJLgorCitvYnNvbGV0ZWQ9XCAqdmVyc2lvbioKKyAgVGhlIGZpcnN0IHZlcnNpb24gaW4gd2hpY2ggdGhpcyBkZWNsYXJhdGlvbiB3YXMgb2Jzb2xldGVkLCBtZWFuaW5nIHRoYXQgaXQKKyAgd2FzIHJlbW92ZWQgY29tcGxldGVseSBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLgorCit1bmF2YWlsYWJsZQorICBUaGlzIGRlY2xhcmF0aW9uIGlzIG5ldmVyIGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLgorCittZXNzYWdlPVwgKnN0cmluZy1saXRlcmFsKgorICBBZGRpdGlvbmFsIG1lc3NhZ2UgdGV4dCB0aGF0IENsYW5nIHdpbGwgcHJvdmlkZSB3aGVuIGVtaXR0aW5nIGEgd2FybmluZyBvcgorICBlcnJvciBhYm91dCB1c2Ugb2YgYSBkZXByZWNhdGVkIG9yIG9ic29sZXRlZCBkZWNsYXJhdGlvbi4gIFVzZWZ1bCB0byBkaXJlY3QKKyAgdXNlcnMgdG8gcmVwbGFjZW1lbnQgQVBJcy4KKworTXVsdGlwbGUgYXZhaWxhYmlsaXR5IGF0dHJpYnV0ZXMgY2FuIGJlIHBsYWNlZCBvbiBhIGRlY2xhcmF0aW9uLCB3aGljaCBtYXkKK2NvcnJlc3BvbmQgdG8gZGlmZmVyZW50IHBsYXRmb3Jtcy4gIE9ubHkgdGhlIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUgd2l0aCB0aGUKK3BsYXRmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhcmdldCBwbGF0Zm9ybSB3aWxsIGJlIHVzZWQ7IGFueSBvdGhlcnMgd2lsbCBiZQoraWdub3JlZC4gIElmIG5vIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGF2YWlsYWJpbGl0eSBmb3IgdGhlIGN1cnJlbnQKK3RhcmdldCBwbGF0Zm9ybSwgdGhlIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGVzIGFyZSBpZ25vcmVkLiAgU3VwcG9ydGVkIHBsYXRmb3JtcworYXJlOgorCitgYGlvc2BgCisgIEFwcGxlJ3MgaU9TIG9wZXJhdGluZyBzeXN0ZW0uICBUaGUgbWluaW11bSBkZXBsb3ltZW50IHRhcmdldCBpcyBzcGVjaWZpZWQgYnkKKyAgdGhlIGBgLW1pb3MtdmVyc2lvbi1taW49KnZlcnNpb24qYGAgb3IgYGAtbWlwaG9uZW9zLXZlcnNpb24tbWluPSp2ZXJzaW9uKmBgCisgIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCisKK2BgbWFjb3N4YGAKKyAgQXBwbGUncyBNYWMgT1MgWCBvcGVyYXRpbmcgc3lzdGVtLiAgVGhlIG1pbmltdW0gZGVwbG95bWVudCB0YXJnZXQgaXMKKyAgc3BlY2lmaWVkIGJ5IHRoZSBgYC1tbWFjb3N4LXZlcnNpb24tbWluPSp2ZXJzaW9uKmBgIGNvbW1hbmQtbGluZSBhcmd1bWVudC4KKworQSBkZWNsYXJhdGlvbiBjYW4gYmUgdXNlZCBldmVuIHdoZW4gZGVwbG95aW5nIGJhY2sgdG8gYSBwbGF0Zm9ybSB2ZXJzaW9uIHByaW9yCit0byB3aGVuIHRoZSBkZWNsYXJhdGlvbiB3YXMgaW50cm9kdWNlZC4gIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgZGVjbGFyYXRpb24gaXMKK2B3ZWFrbHkgbGlua2VkCis8aHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvbWFjLyNkb2N1bWVudGF0aW9uL01hY09TWC9Db25jZXB0dWFsL0JQRnJhbWV3b3Jrcy9Db25jZXB0cy9XZWFrTGlua2luZy5odG1sPmBfLAorYXMgaWYgdGhlIGBgd2Vha19pbXBvcnRgYCBhdHRyaWJ1dGUgd2VyZSBhZGRlZCB0byB0aGUgZGVjbGFyYXRpb24uICBBCit3ZWFrbHktbGlua2VkIGRlY2xhcmF0aW9uIG1heSBvciBtYXkgbm90IGJlIHByZXNlbnQgYSBydW4tdGltZSwgYW5kIGEgcHJvZ3JhbQorY2FuIGRldGVybWluZSB3aGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBpcyBwcmVzZW50IGJ5IGNoZWNraW5nIHdoZXRoZXIgdGhlCithZGRyZXNzIG9mIHRoYXQgZGVjbGFyYXRpb24gaXMgbm9uLU5VTEwuCisKK0lmIHRoZXJlIGFyZSBtdWx0aXBsZSBkZWNsYXJhdGlvbnMgb2YgdGhlIHNhbWUgZW50aXR5LCB0aGUgYXZhaWxhYmlsaXR5CithdHRyaWJ1dGVzIG11c3QgZWl0aGVyIG1hdGNoIG9uIGEgcGVyLXBsYXRmb3JtIGJhc2lzIG9yIGxhdGVyCitkZWNsYXJhdGlvbnMgbXVzdCBub3QgaGF2ZSBhdmFpbGFiaWxpdHkgYXR0cmlidXRlcyBmb3IgdGhhdAorcGxhdGZvcm0uIEZvciBleGFtcGxlOgorCisuLiBjb2RlLWJsb2NrOjogYworCisgIHZvaWQgZyh2b2lkKSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNCkpKTsKKyAgdm9pZCBnKHZvaWQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC40KSkpOyAvLyBva2F5LCBtYXRjaGVzCisgIHZvaWQgZyh2b2lkKSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkoaW9zLGludHJvZHVjZWQ9NC4wKSkpOyAvLyBva2F5LCBhZGRzIGEgbmV3IHBsYXRmb3JtCisgIHZvaWQgZyh2b2lkKTsgLy8gb2theSwgaW5oZXJpdHMgYm90aCBtYWNvc3ggYW5kIGlvcyBhdmFpbGFiaWxpdHkgZnJvbSBhYm92ZS4KKyAgdm9pZCBnKHZvaWQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC41KSkpOyAvLyBlcnJvcjogbWlzbWF0Y2gKKworV2hlbiBvbmUgbWV0aG9kIG92ZXJyaWRlcyBhbm90aGVyLCB0aGUgb3ZlcnJpZGluZyBtZXRob2QgY2FuIGJlIG1vcmUgd2lkZWx5IGF2YWlsYWJsZSB0aGFuIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgZS5nLiw6CisKKy4uIGNvZGUtYmxvY2s6OiBvYmpjCisKKyAgQGludGVyZmFjZSBBCisgIC0gKGlkKW1ldGhvZCBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNCkpKTsKKyAgLSAoaWQpbWV0aG9kMiBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNCkpKTsKKyAgQGVuZAorCisgIEBpbnRlcmZhY2UgQiA6IEEKKyAgLSAoaWQpbWV0aG9kIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC4zKSkpOyAvLyBva2F5OiBtZXRob2QgbW92ZWQgaW50byBiYXNlIGNsYXNzIGxhdGVyCisgIC0gKGlkKW1ldGhvZCBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNSkpKTsgLy8gZXJyb3I6IHRoaXMgbWV0aG9kIHdhcyBhdmFpbGFibGUgdmlhIHRoZSBiYXNlIGNsYXNzIGluIDEwLjQKKyAgQGVuZAorCisKK19Ob3JldHVybgorLS0tLS0tLS0tCisuLiBjc3YtdGFibGU6OiBTdXBwb3J0ZWQgU3ludGF4ZXMKKyAgIDpoZWFkZXI6ICJHTlUiLCAiQysrMTEiLCAiX19kZWNsc3BlYyIsICJLZXl3b3JkIgorCisgICAiIiwiIiwiIiwiWCIKKworQSBmdW5jdGlvbiBkZWNsYXJlZCBhcyBgYF9Ob3JldHVybmBgIHNoYWxsIG5vdCByZXR1cm4gdG8gaXRzIGNhbGxlci4gVGhlCitjb21waWxlciB3aWxsIGdlbmVyYXRlIGEgZGlhZ25vc3RpYyBmb3IgYSBmdW5jdGlvbiBkZWNsYXJlZCBhcyBgYF9Ob3JldHVybmBgCit0aGF0IGFwcGVhcnMgdG8gYmUgY2FwYWJsZSBvZiByZXR1cm5pbmcgdG8gaXRzIGNhbGxlci4KKworCitub3JldHVybgorLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICIiLCJYIiwiIiwiIgorCitBIGZ1bmN0aW9uIGRlY2xhcmVkIGFzIGBgW1tub3JldHVybl1dYGAgc2hhbGwgbm90IHJldHVybiB0byBpdHMgY2FsbGVyLiBUaGUKK2NvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgYSBkaWFnbm9zdGljIGZvciBhIGZ1bmN0aW9uIGRlY2xhcmVkIGFzIGBgW1tub3JldHVybl1dYGAKK3RoYXQgYXBwZWFycyB0byBiZSBjYXBhYmxlIG9mIHJldHVybmluZyB0byBpdHMgY2FsbGVyLgorCisKK2NhcnJpZXNfZGVwZW5kZW5jeQorLS0tLS0tLS0tLS0tLS0tLS0tCisuLiBjc3YtdGFibGU6OiBTdXBwb3J0ZWQgU3ludGF4ZXMKKyAgIDpoZWFkZXI6ICJHTlUiLCAiQysrMTEiLCAiX19kZWNsc3BlYyIsICJLZXl3b3JkIgorCisgICAiWCIsIlgiLCIiLCIiCisKK1RoZSBgYGNhcnJpZXNfZGVwZW5kZW5jeWBgIGF0dHJpYnV0ZSBzcGVjaWZpZXMgZGVwZW5kZW5jeSBwcm9wYWdhdGlvbiBpbnRvIGFuZAorb3V0IG9mIGZ1bmN0aW9ucy4KKworV2hlbiBzcGVjaWZpZWQgb24gYSBmdW5jdGlvbiBvciBPYmplY3RpdmUtQyBtZXRob2QsIHRoZSBgYGNhcnJpZXNfZGVwZWRlbmN5YGAKK2F0dHJpYnV0ZSBtZWFucyB0aGF0IHRoZSByZXR1cm4gdmFsdWUgY2FycmllcyBhIGRlcGVuZGVuY3kgb3V0IG9mIHRoZSBmdW5jdGlvbiwgCitzbyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBuZWVkIG5vdCBjb25zdHJhaW4gb3JkZXJpbmcgdXBvbiByZXR1cm4gZnJvbSB0aGF0CitmdW5jdGlvbi4gSW1wbGVtZW50YXRpb25zIG9mIHRoZSBmdW5jdGlvbiBhbmQgaXRzIGNhbGxlciBtYXkgY2hvb3NlIHRvIHByZXNlcnZlCitkZXBlbmRlbmNpZXMgaW5zdGVhZCBvZiBlbWl0dGluZyBtZW1vcnkgb3JkZXJpbmcgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMgZmVuY2VzLgorCitOb3RlLCB0aGlzIGF0dHJpYnV0ZSBkb2VzIG5vdCBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0sIGJ1dCBtYXkgcmVzdWx0CitpbiBnZW5lcmF0YXRpb24gb2YgbW9yZSBlZmZpY2llbnQgY29kZS4KKworCitlbmFibGVfaWYKKy0tLS0tLS0tLQorLi4gY3N2LXRhYmxlOjogU3VwcG9ydGVkIFN5bnRheGVzCisgICA6aGVhZGVyOiAiR05VIiwgIkMrKzExIiwgIl9fZGVjbHNwZWMiLCAiS2V5d29yZCIKKworICAgIlgiLCIiLCIiLCIiCisKK1RoZSBgYGVuYWJsZV9pZmBgIGF0dHJpYnV0ZSBjYW4gYmUgcGxhY2VkIG9uIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB0byBjb250cm9sCit3aGljaCBvdmVybG9hZCBpcyBzZWxlY3RlZCBiYXNlZCBvbiB0aGUgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cy4KK1doZW4gY29tYmluZWQgd2l0aCB0aGUgYGBvdmVybG9hZGFibGVgYCBhdHRyaWJ1dGUsIHRoaXMgZmVhdHVyZSBpcyBhbHNvCithdmFpbGFibGUgaW4gQy4KKworLi4gY29kZS1ibG9jazo6IGMrKworCisgIGludCBpc2RpZ2l0KGludCBjKTsKKyAgaW50IGlzZGlnaXQoaW50IGMpIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZihjIDw9IC0xIHx8IGMgPiAyNTUsICJjaG9zZW4gd2hlbiAnYycgaXMgb3V0IG9mIHJhbmdlIikpKSBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSgiJ2MnIG11c3QgaGF2ZSB0aGUgdmFsdWUgb2YgYW4gdW5zaWduZWQgY2hhciBvciBFT0YiKSkpOworICAKKyAgdm9pZCBmb28oY2hhciBjKSB7CisgICAgaXNkaWdpdChjKTsKKyAgICBpc2RpZ2l0KDEwKTsKKyAgICBpc2RpZ2l0KC0xMCk7ICAvLyByZXN1bHRzIGluIGEgY29tcGlsZS10aW1lIGVycm9yLgorICB9CisKK1RoZSBlbmFibGVfaWYgYXR0cmlidXRlIHRha2VzIHR3byBhcmd1bWVudHMsIHRoZSBmaXJzdCBpcyBhbiBleHByZXNzaW9uIHdyaXR0ZW4KK2luIHRlcm1zIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzLCB0aGUgc2Vjb25kIGlzIGEgc3RyaW5nIGV4cGxhaW5pbmcgd2h5IHRoaXMKK292ZXJsb2FkIGNhbmRpZGF0ZSBjb3VsZCBub3QgYmUgc2VsZWN0ZWQgdG8gYmUgZGlzcGxheWVkIGluIGRpYWdub3N0aWNzLiBUaGUKK2V4cHJlc3Npb24gaXMgcGFydCBvZiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGZvciB0aGUgcHVycG9zZXMgb2YgZGV0ZXJtaW5pbmcKK3doZXRoZXIgaXQgaXMgYSByZWRlY2xhcmF0aW9uIChmb2xsb3dpbmcgdGhlIHJ1bGVzIHVzZWQgd2hlbiBkZXRlcm1pbmluZword2hldGhlciBhIEMrKyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpcyBPRFItZXF1aXZhbGVudCksIGJ1dCBpcyBub3QgcGFydCBvZgordGhlIHR5cGUuCisKK1RoZSBlbmFibGVfaWYgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXMgaWYgaXQgd2VyZSB0aGUgYm9keSBvZiBhCitib29sLXJldHVybmluZyBjb25zdGV4cHIgZnVuY3Rpb24gZGVjbGFyZWQgd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoZSBmdW5jdGlvbgoraXQgaXMgYmVpbmcgYXBwbGllZCB0bywgdGhlbiBjYWxsZWQgd2l0aCB0aGUgcGFyYW1ldGVycyBhdCB0aGUgY2FsbHNpdGUuIElmIHRoZQorcmVzdWx0IGlzIGZhbHNlIG9yIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIHRocm91Z2ggY29uc3RhbnQgZXhwcmVzc2lvbgorZXZhbHVhdGlvbiwgdGhlbiB0aGlzIG92ZXJsb2FkIHdpbGwgbm90IGJlIGNob3NlbiBhbmQgdGhlIHByb3ZpZGVkIHN0cmluZyBtYXkKK2JlIHVzZWQgaW4gYSBkaWFnbm9zdGljIGlmIHRoZSBjb21waWxlIGZhaWxzIGFzIGEgcmVzdWx0LgorCitCZWNhdXNlIHRoZSBlbmFibGVfaWYgZXhwcmVzc2lvbiBpcyBhbiB1bmV2YWx1YXRlZCBjb250ZXh0LCB0aGVyZSBhcmUgbm8gZ2xvYmFsCitzdGF0ZSBjaGFuZ2VzLCBub3IgdGhlIGFiaWxpdHkgdG8gcGFzcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBlbmFibGVfaWYKK2V4cHJlc3Npb24gdG8gdGhlIGZ1bmN0aW9uIGJvZHkuIEZvciBleGFtcGxlLCBzdXBwb3NlIHdlIHdhbnQgY2FsbHMgdG8KK3N0cm5sZW4oc3RyYnVmLCBtYXhsZW4pIHRvIHJlc29sdmUgdG8gc3Rybmxlbl9jaGsoc3RyYnVmLCBtYXhsZW4sIHNpemUgb2YKK3N0cmJ1Zikgb25seSBpZiB0aGUgc2l6ZSBvZiBzdHJidWYgY2FuIGJlIGRldGVybWluZWQ6CisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyAgc3RhdGljIGlubGluZSBzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICpzLCBzaXplX3QgbWF4bGVuKQorICAgIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKF9fYnVpbHRpbl9vYmplY3Rfc2l6ZShzLCAwKSAhPSAtMSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNob3NlbiB3aGVuIHRoZSBidWZmZXIgc2l6ZSBpcyBrbm93biBidXQgJ21heGxlbicgaXMgbm90IikpKQorICB7CisgICAgcmV0dXJuIHN0cm5sZW5fY2hrKHMsIG1heGxlbiwgX19idWlsdGluX29iamVjdF9zaXplKHMsIDApKTsKKyAgfQorCitNdWx0aXBsZSBlbmFibGVfaWYgYXR0cmlidXRlcyBtYXkgYmUgYXBwbGllZCB0byBhIHNpbmdsZSBkZWNsYXJhdGlvbi4gSW4gdGhpcworY2FzZSwgdGhlIGVuYWJsZV9pZiBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCBpbiB0aGUKK2ZvbGxvd2luZyBtYW5uZXIuIEZpcnN0LCB0aGUgY2FuZGlkYXRlcyB3aG9zZSBlbmFibGVfaWYgZXhwcmVzc2lvbnMgZXZhbHVhdGUgdG8KK2ZhbHNlIG9yIGNhbm5vdCBiZSBldmFsdWF0ZWQgYXJlIGRpc2NhcmRlZC4gSWYgdGhlIHJlbWFpbmluZyBjYW5kaWRhdGVzIGRvIG5vdAorc2hhcmUgT0RSLWVxdWl2YWxlbnQgZW5hYmxlX2lmIGV4cHJlc3Npb25zLCB0aGUgb3ZlcmxvYWQgcmVzb2x1dGlvbiBpcworYW1iaWd1b3VzLiBPdGhlcndpc2UsIGVuYWJsZV9pZiBvdmVybG9hZCByZXNvbHV0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0CitlbmFibGVfaWYgYXR0cmlidXRlIG9uIHRoZSBjYW5kaWRhdGVzIHRoYXQgaGF2ZSBub3QgYmVlbiBkaXNjYXJkZWQgYW5kIGhhdmUKK3JlbWFpbmluZyBlbmFibGVfaWYgYXR0cmlidXRlcy4gSW4gdGhpcyB3YXksIHdlIHBpY2sgdGhlIG1vc3Qgc3BlY2lmaWMKK292ZXJsb2FkIG91dCBvZiBhIG51bWJlciBvZiB2aWFibGUgb3ZlcmxvYWRzIHVzaW5nIGVuYWJsZV9pZi4KKworLi4gY29kZS1ibG9jazo6IGMrKworCisgIHZvaWQgZigpIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZih0cnVlLCAiIikpKTsgIC8vICMxCisgIHZvaWQgZigpIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZih0cnVlLCAiIikpKSBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYodHJ1ZSwgIiIpKSk7ICAvLyAjMgorICAKKyAgdm9pZCBnKGludCBpLCBpbnQgaikgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKGksICIiKSkpOyAgLy8gIzEKKyAgdm9pZCBnKGludCBpLCBpbnQgaikgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKGosICIiKSkpIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZih0cnVlKSkpOyAgLy8gIzIKKworSW4gdGhpcyBleGFtcGxlLCBhIGNhbGwgdG8gZigpIGlzIGFsd2F5cyByZXNvbHZlZCB0byAjMiwgYXMgdGhlIGZpcnN0IGVuYWJsZV9pZgorZXhwcmVzc2lvbiBpcyBPRFItZXF1aXZhbGVudCBmb3IgYm90aCBkZWNsYXJhdGlvbnMsIGJ1dCAjMSBkb2VzIG5vdCBoYXZlIGFub3RoZXIKK2VuYWJsZV9pZiBleHByZXNzaW9uIHRvIGNvbnRpbnVlIGV2YWx1YXRpbmcsIHNvIHRoZSBuZXh0IHJvdW5kIG9mIGV2YWx1YXRpb24gaGFzCitvbmx5IGEgc2luZ2xlIGNhbmRpZGF0ZS4gSW4gYSBjYWxsIHRvIGcoMSwgMSksIHRoZSBjYWxsIGlzIGFtYmlndW91cyBldmVuIHRob3VnaAorIzIgaGFzIG1vcmUgZW5hYmxlX2lmIGF0dHJpYnV0ZXMsIGJlY2F1c2UgdGhlIGZpcnN0IGVuYWJsZV9pZiBleHByZXNzaW9ucyBhcmUKK25vdCBPRFItZXF1aXZhbGVudC4KKworUXVlcnkgZm9yIHRoaXMgZmVhdHVyZSB3aXRoIGBgX19oYXNfYXR0cmlidXRlKGVuYWJsZV9pZilgYC4KKworCitmb3JtYXQgKGdudTo6Zm9ybWF0KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiWCIsIiIsIiIKKworQ2xhbmcgc3VwcG9ydHMgdGhlIGBgZm9ybWF0YGAgYXR0cmlidXRlLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZnVuY3Rpb24KK2FjY2VwdHMgYSBgYHByaW50ZmBgIG9yIGBgc2NhbmZgYC1saWtlIGZvcm1hdCBzdHJpbmcgYW5kIGNvcnJlc3BvbmRpbmcKK2FyZ3VtZW50cyBvciBhIGBgdmFfbGlzdGBgIHRoYXQgY29udGFpbnMgdGhlc2UgYXJndW1lbnRzLgorCitQbGVhc2Ugc2VlIGBHQ0MgZG9jdW1lbnRhdGlvbiBhYm91dCBmb3JtYXQgYXR0cmlidXRlCis8aHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0Z1bmN0aW9uLUF0dHJpYnV0ZXMuaHRtbD5gXyB0byBmaW5kIGRldGFpbHMKK2Fib3V0IGF0dHJpYnV0ZSBzeW50YXguCisKK0NsYW5nIGltcGxlbWVudHMgdHdvIGtpbmRzIG9mIGNoZWNrcyB3aXRoIHRoaXMgYXR0cmlidXRlLgorCisjLiBDbGFuZyBjaGVja3MgdGhhdCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgYGBmb3JtYXRgYCBhdHRyaWJ1dGUgaXMgY2FsbGVkIHdpdGgKKyAgIGEgZm9ybWF0IHN0cmluZyB0aGF0IHVzZXMgZm9ybWF0IHNwZWNpZmllcnMgdGhhdCBhcmUgYWxsb3dlZCwgYW5kIHRoYXQKKyAgIGFyZ3VtZW50cyBtYXRjaCB0aGUgZm9ybWF0IHN0cmluZy4gIFRoaXMgaXMgdGhlIGBgLVdmb3JtYXRgYCB3YXJuaW5nLCBpdCBpcworICAgb24gYnkgZGVmYXVsdC4KKworIy4gQ2xhbmcgY2hlY2tzIHRoYXQgdGhlIGZvcm1hdCBzdHJpbmcgYXJndW1lbnQgaXMgYSBsaXRlcmFsIHN0cmluZy4gIFRoaXMgaXMKKyAgIHRoZSBgYC1XZm9ybWF0LW5vbmxpdGVyYWxgYCB3YXJuaW5nLCBpdCBpcyBvZmYgYnkgZGVmYXVsdC4KKworICAgQ2xhbmcgaW1wbGVtZW50cyB0aGlzIG1vc3RseSB0aGUgc2FtZSB3YXkgYXMgR0NDLCBidXQgdGhlcmUgaXMgYSBkaWZmZXJlbmNlCisgICBmb3IgZnVuY3Rpb25zIHRoYXQgYWNjZXB0IGEgYGB2YV9saXN0YGAgYXJndW1lbnQgKGZvciBleGFtcGxlLCBgYHZwcmludGZgYCkuCisgICBHQ0MgZG9lcyBub3QgZW1pdCBgYC1XZm9ybWF0LW5vbmxpdGVyYWxgYCB3YXJuaW5nIGZvciBjYWxscyB0byBzdWNoCisgICBmdWN0aW9ucy4gIENsYW5nIGRvZXMgbm90IHdhcm4gaWYgdGhlIGZvcm1hdCBzdHJpbmcgY29tZXMgZnJvbSBhIGZ1bmN0aW9uCisgICBwYXJhbWV0ZXIsIHdoZXJlIHRoZSBmdW5jdGlvbiBpcyBhbm5vdGF0ZWQgd2l0aCBhIGNvbXBhdGlibGUgYXR0cmlidXRlLAorICAgb3RoZXJ3aXNlIGl0IHdhcm5zLiAgRm9yIGV4YW1wbGU6CisKKyAgIC4uIGNvZGUtYmxvY2s6OiBjCisKKyAgICAgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyAoX19zY2FuZl9fLCAxLCAzKSkpCisgICAgIHZvaWQgZm9vKGNvbnN0IGNoYXIqIHMsIGNoYXIgKmJ1ZiwgLi4uKSB7CisgICAgICAgdmFfbGlzdCBhcDsKKyAgICAgICB2YV9zdGFydChhcCwgYnVmKTsKKworICAgICAgIHZwcmludGYocywgYXApOyAvLyB3YXJuaW5nOiBmb3JtYXQgc3RyaW5nIGlzIG5vdCBhIHN0cmluZyBsaXRlcmFsCisgICAgIH0KKworICAgSW4gdGhpcyBjYXNlIHdlIHdhcm4gYmVjYXVzZSBgYHNgYCBjb250YWlucyBhIGZvcm1hdCBzdHJpbmcgZm9yIGEKKyAgIGBgc2NhbmZgYC1saWtlIGZ1bmN0aW9uLCBidXQgaXQgaXMgcGFzc2VkIHRvIGEgYGBwcmludGZgYC1saWtlIGZ1bmN0aW9uLgorCisgICBJZiB0aGUgYXR0cmlidXRlIGlzIHJlbW92ZWQsIGNsYW5nIHN0aWxsIHdhcm5zLCBiZWNhdXNlIHRoZSBmb3JtYXQgc3RyaW5nIGlzCisgICBub3QgYSBzdHJpbmcgbGl0ZXJhbC4KKworICAgQW5vdGhlciBleGFtcGxlOgorCisgICAuLiBjb2RlLWJsb2NrOjogYworCisgICAgIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDEsIDMpKSkKKyAgICAgdm9pZCBmb28oY29uc3QgY2hhciogcywgY2hhciAqYnVmLCAuLi4pIHsKKyAgICAgICB2YV9saXN0IGFwOworICAgICAgIHZhX3N0YXJ0KGFwLCBidWYpOworCisgICAgICAgdnByaW50ZihzLCBhcCk7IC8vIHdhcm5pbmcKKyAgICAgfQorCisgICBJbiB0aGlzIGNhc2UgQ2xhbmcgZG9lcyBub3Qgd2FybiBiZWNhdXNlIHRoZSBmb3JtYXQgc3RyaW5nIGBgc2BgIGFuZAorICAgdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRzIGFyZSBhbm5vdGF0ZWQuICBJZiB0aGUgYXJndW1lbnRzIGFyZQorICAgaW5jb3JyZWN0LCB0aGUgY2FsbGVyIG9mIGBgZm9vYGAgd2lsbCByZWNlaXZlIGEgd2FybmluZy4KKworCitub2R1cGxpY2F0ZSAoY2xhbmc6Om5vZHVwbGljYXRlKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiWCIsIiIsIiIKKworVGhlIGBgbm9kdXBsaWNhdGVgYCBhdHRyaWJ1dGUgY2FuIGJlIHBsYWNlZCBvbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgdG8gY29udHJvbAord2hldGhlciBmdW5jdGlvbiBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBkdXBsaWNhdGVkIG9yIG5vdCBhcyBhIHJlc3VsdCBvZgorb3B0aW1pemF0aW9ucy4gVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyB3aXRoCitjZXJ0YWluIHNwZWNpYWwgcmVxdWlyZW1lbnRzLCBsaWtlIHRoZSBPcGVuQ0wgImJhcnJpZXIiIGZ1bmN0aW9uLCB0aGF0IG1pZ2h0CituZWVkIHRvIGJlIHJ1biBjb25jdXJyZW50bHkgYnkgYWxsIHRoZSB0aHJlYWRzIHRoYXQgYXJlIGV4ZWN1dGluZyBpbiBsb2Nrc3RlcAorb24gdGhlIGhhcmR3YXJlLiBGb3IgZXhhbXBsZSB0aGlzIGF0dHJpYnV0ZSBhcHBsaWVkIG9uIHRoZSBmdW5jdGlvbgorIm5vZHVwZnVuYyIgaW4gdGhlIGNvZGUgYmVsb3cgYXZvaWRzIHRoYXQ6CisKKy4uIGNvZGUtYmxvY2s6OiBjCisKKyAgdm9pZCBub2R1cGZ1bmMoKSBfX2F0dHJpYnV0ZV9fKChub2R1cGxpY2F0ZSkpOworICAvLyBTZXR0aW5nIGl0IGFzIGEgQysrMTEgYXR0cmlidXRlIGlzIGFsc28gdmFsaWQKKyAgLy8gdm9pZCBub2R1cGZ1bmMoKSBbW2NsYW5nOjpub2R1cGxpY2F0ZV1dOworICB2b2lkIGZvbygpOworICB2b2lkIGJhcigpOworCisgIG5vZHVwZnVuYygpOworICBpZiAoYSA+IG4pIHsKKyAgICBmb28oKTsKKyAgfSBlbHNlIHsKKyAgICBiYXIoKTsKKyAgfQorCitnZXRzIHBvc3NpYmx5IG1vZGlmaWVkIGJ5IHNvbWUgb3B0aW1pemF0aW9ucyBpbnRvIGNvZGUgc2ltaWxhciB0byB0aGlzOgorCisuLiBjb2RlLWJsb2NrOjogYworCisgIGlmIChhID4gbikgeworICAgIG5vZHVwZnVuYygpOworICAgIGZvbygpOworICB9IGVsc2UgeworICAgIG5vZHVwZnVuYygpOworICAgIGJhcigpOworICB9CisKK3doZXJlIHRoZSBjYWxsIHRvICJub2R1cGZ1bmMiIGlzIGR1cGxpY2F0ZWQgYW5kIHN1bmsgaW50byB0aGUgdHdvIGJyYW5jaGVzCitvZiB0aGUgY29uZGl0aW9uLgorCisKK25vX3Nhbml0aXplX2FkZHJlc3MgKG5vX2FkZHJlc3Nfc2FmZXR5X2FuYWx5c2lzLCBnbnU6Om5vX2FkZHJlc3Nfc2FmZXR5X2FuYWx5c2lzLCBnbnU6Om5vX3Nhbml0aXplX2FkZHJlc3MpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLi4gY3N2LXRhYmxlOjogU3VwcG9ydGVkIFN5bnRheGVzCisgICA6aGVhZGVyOiAiR05VIiwgIkMrKzExIiwgIl9fZGVjbHNwZWMiLCAiS2V5d29yZCIKKworICAgIlgiLCJYIiwiIiwiIgorCisuLiBfbGFuZ2V4dC1hZGRyZXNzX3Nhbml0aXplcjoKKworVXNlIGBgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemVfYWRkcmVzcykpYGAgb24gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0bworc3BlY2lmeSB0aGF0IGFkZHJlc3Mgc2FmZXR5IGluc3RydW1lbnRhdGlvbiAoZS5nLiBBZGRyZXNzU2FuaXRpemVyKSBzaG91bGQKK25vdCBiZSBhcHBsaWVkIHRvIHRoYXQgZnVuY3Rpb24uCisKKworbm9fc2FuaXRpemVfbWVtb3J5CistLS0tLS0tLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiIiwiIiwiIgorCisuLiBfbGFuZ2V4dC1tZW1vcnlfc2FuaXRpemVyOgorCitVc2UgYGBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZV9tZW1vcnkpKWBgIG9uIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gdG8KK3NwZWNpZnkgdGhhdCBjaGVja3MgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHNob3VsZCBub3QgYmUgaW5zZXJ0ZWQgCisoZS5nLiBieSBNZW1vcnlTYW5pdGl6ZXIpLiBUaGUgZnVuY3Rpb24gbWF5IHN0aWxsIGJlIGluc3RydW1lbnRlZCBieSB0aGUgdG9vbAordG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzIGluIG90aGVyIHBsYWNlcy4KKworCitub19zYW5pdGl6ZV90aHJlYWQKKy0tLS0tLS0tLS0tLS0tLS0tLQorLi4gY3N2LXRhYmxlOjogU3VwcG9ydGVkIFN5bnRheGVzCisgICA6aGVhZGVyOiAiR05VIiwgIkMrKzExIiwgIl9fZGVjbHNwZWMiLCAiS2V5d29yZCIKKworICAgIlgiLCIiLCIiLCIiCisKKy4uIF9sYW5nZXh0LXRocmVhZF9zYW5pdGl6ZXI6CisKK1VzZSBgYF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplX3RocmVhZCkpYGAgb24gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0bworc3BlY2lmeSB0aGF0IGNoZWNrcyBmb3IgZGF0YSByYWNlcyBvbiBwbGFpbiAobm9uLWF0b21pYykgbWVtb3J5IGFjY2Vzc2VzIHNob3VsZAorbm90IGJlIGluc2VydGVkIGJ5IFRocmVhZFNhbml0aXplci4gVGhlIGZ1bmN0aW9uIGlzIHN0aWxsIGluc3RydW1lbnRlZCBieSB0aGUKK3Rvb2wgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzIGFuZCBwcm92aWRlIG1lYW5pbmdmdWwgc3RhY2sgdHJhY2VzLgorCisKK29iamNfbWV0aG9kX2ZhbWlseQorLS0tLS0tLS0tLS0tLS0tLS0tCisuLiBjc3YtdGFibGU6OiBTdXBwb3J0ZWQgU3ludGF4ZXMKKyAgIDpoZWFkZXI6ICJHTlUiLCAiQysrMTEiLCAiX19kZWNsc3BlYyIsICJLZXl3b3JkIgorCisgICAiWCIsIiIsIiIsIiIKKworTWFueSBtZXRob2RzIGluIE9iamVjdGl2ZS1DIGhhdmUgY29udmVudGlvbmFsIG1lYW5pbmdzIGRldGVybWluZWQgYnkgdGhlaXIKK3NlbGVjdG9ycy4gSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBiZSBhYmxlIHRvIG1hcmsgYSBtZXRob2QgYXMgaGF2aW5nIGEKK3BhcnRpY3VsYXIgY29udmVudGlvbmFsIG1lYW5pbmcgZGVzcGl0ZSBub3QgaGF2aW5nIHRoZSByaWdodCBzZWxlY3Rvciwgb3IgYXMKK25vdCBoYXZpbmcgdGhlIGNvbnZlbnRpb25hbCBtZWFuaW5nIHRoYXQgaXRzIHNlbGVjdG9yIHdvdWxkIHN1Z2dlc3QuIEZvciB0aGVzZQordXNlIGNhc2VzLCB3ZSBwcm92aWRlIGFuIGF0dHJpYnV0ZSB0byBzcGVjaWZpY2FsbHkgZGVzY3JpYmUgdGhlICJtZXRob2QgZmFtaWx5IgordGhhdCBhIG1ldGhvZCBiZWxvbmdzIHRvLgorCisqKlVzYWdlKio6IGBgX19hdHRyaWJ1dGVfXygob2JqY19tZXRob2RfZmFtaWx5KFgpKSlgYCwgd2hlcmUgYGBYYGAgaXMgb25lIG9mCitgYG5vbmVgYCwgYGBhbGxvY2BgLCBgYGNvcHlgYCwgYGBpbml0YGAsIGBgbXV0YWJsZUNvcHlgYCwgb3IgYGBuZXdgYC4gIFRoaXMKK2F0dHJpYnV0ZSBjYW4gb25seSBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiBhIG1ldGhvZCBkZWNsYXJhdGlvbjoKKworLi4gY29kZS1ibG9jazo6IG9iamMKKworICAtIChOU1N0cmluZyAqKWluaXRNeVN0cmluZ1ZhbHVlIF9fYXR0cmlidXRlX18oKG9iamNfbWV0aG9kX2ZhbWlseShub25lKSkpOworCitVc2VycyB3aG8gZG8gbm90IHdpc2ggdG8gY2hhbmdlIHRoZSBjb252ZW50aW9uYWwgbWVhbmluZyBvZiBhIG1ldGhvZCwgYW5kIHdobworbWVyZWx5IHdhbnQgdG8gZG9jdW1lbnQgaXRzIG5vbi1zdGFuZGFyZCByZXRhaW4gYW5kIHJlbGVhc2Ugc2VtYW50aWNzLCBzaG91bGQKK3VzZSB0aGUgcmV0YWluaW5nIGJlaGF2aW9yIGF0dHJpYnV0ZXMgKGBgbnNfcmV0dXJuc19yZXRhaW5lZGBgLAorYGBuc19yZXR1cm5zX25vdF9yZXRhaW5lZGBgLCBldGMpLgorCitRdWVyeSBmb3IgdGhpcyBmZWF0dXJlIHdpdGggYGBfX2hhc19hdHRyaWJ1dGUob2JqY19tZXRob2RfZmFtaWx5KWBgLgorCisKK29iamNfcmVxdWlyZXNfc3VwZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiIiwiIiwiIgorCitTb21lIE9iamVjdGl2ZS1DIGNsYXNzZXMgYWxsb3cgYSBzdWJjbGFzcyB0byBvdmVycmlkZSBhIHBhcnRpY3VsYXIgbWV0aG9kIGluIGEKK3BhcmVudCBjbGFzcyBidXQgZXhwZWN0IHRoYXQgdGhlIG92ZXJyaWRpbmcgbWV0aG9kIGFsc28gY2FsbHMgdGhlIG92ZXJyaWRkZW4KK21ldGhvZCBpbiB0aGUgcGFyZW50IGNsYXNzLiBGb3IgdGhlc2UgY2FzZXMsIHdlIHByb3ZpZGUgYW4gYXR0cmlidXRlIHRvCitkZXNpZ25hdGUgdGhhdCBhIG1ldGhvZCByZXF1aXJlcyBhICJjYWxsIHRvIGBgc3VwZXJgYCIgaW4gdGhlIG92ZXJyaWRpbmcKK21ldGhvZCBpbiB0aGUgc3ViY2xhc3MuCisKKyoqVXNhZ2UqKjogYGBfX2F0dHJpYnV0ZV9fKChvYmpjX3JlcXVpcmVzX3N1cGVyKSlgYC4gIFRoaXMgYXR0cmlidXRlIGNhbiBvbmx5CitiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiBhIG1ldGhvZCBkZWNsYXJhdGlvbjoKKworLi4gY29kZS1ibG9jazo6IG9iamMKKworICAtICh2b2lkKWZvbyBfX2F0dHJpYnV0ZV9fKChvYmpjX3JlcXVpcmVzX3N1cGVyKSk7CisKK1RoaXMgYXR0cmlidXRlIGNhbiBvbmx5IGJlIGFwcGxpZWQgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbnMgd2l0aGluIGEgY2xhc3MsIGFuZAorbm90IGEgcHJvdG9jb2wuICBDdXJyZW50bHkgdGhpcyBhdHRyaWJ1dGUgZG9lcyBub3QgZW5mb3JjZSBhbnkgcGxhY2VtZW50IG9mCit3aGVyZSB0aGUgY2FsbCBvY2N1cnMgaW4gdGhlIG92ZXJyaWRpbmcgbWV0aG9kIChzdWNoIGFzIGluIHRoZSBjYXNlIG9mCitgYC1kZWFsbG9jYGAgd2hlcmUgdGhlIGNhbGwgbXVzdCBhcHBlYXIgYXQgdGhlIGVuZCkuICBJdCBjaGVja3Mgb25seSB0aGF0IGl0CitleGlzdHMuCisKK05vdGUgdGhhdCBvbiBib3RoIE9TIFggYW5kIGlPUyB0aGF0IHRoZSBGb3VuZGF0aW9uIGZyYW1ld29yayBwcm92aWRlcyBhCitjb252ZW5pZW5jZSBtYWNybyBgYE5TX1JFUVVJUkVTX1NVUEVSYGAgdGhhdCBwcm92aWRlcyBzeW50YWN0aWMgc3VnYXIgZm9yIHRoaXMKK2F0dHJpYnV0ZToKKworLi4gY29kZS1ibG9jazo6IG9iamMKKworICAtICh2b2lkKWZvbyBOU19SRVFVSVJFU19TVVBFUjsKKworVGhpcyBtYWNybyBpcyBjb25kaXRpb25hbGx5IGRlZmluZWQgZGVwZW5kaW5nIG9uIHRoZSBjb21waWxlcidzIHN1cHBvcnQgZm9yCit0aGlzIGF0dHJpYnV0ZS4gIElmIHRoZSBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhdHRyaWJ1dGUgdGhlIG1hY3JvCitleHBhbmRzIHRvIG5vdGhpbmcuCisKK09wZXJhdGlvbmFsbHksIHdoZW4gYSBtZXRob2QgaGFzIHRoaXMgYW5ub3RhdGlvbiB0aGUgY29tcGlsZXIgd2lsbCB3YXJuIGlmIHRoZQoraW1wbGVtZW50YXRpb24gb2YgYW4gb3ZlcnJpZGUgaW4gYSBzdWJjbGFzcyBkb2VzIG5vdCBjYWxsIHN1cGVyLiAgRm9yIGV4YW1wbGU6CisKKy4uIGNvZGUtYmxvY2s6OiBvYmpjCisKKyAgIHdhcm5pbmc6IG1ldGhvZCBwb3NzaWJseSBtaXNzaW5nIGEgW3N1cGVyIEFubm90TWV0aF0gY2FsbAorICAgLSAodm9pZCkgQW5ub3RNZXRoe307CisgICAgICAgICAgICAgICAgICAgICAgXgorCisKK292ZXJsb2FkYWJsZQorLS0tLS0tLS0tLS0tCisuLiBjc3YtdGFibGU6OiBTdXBwb3J0ZWQgU3ludGF4ZXMKKyAgIDpoZWFkZXI6ICJHTlUiLCAiQysrMTEiLCAiX19kZWNsc3BlYyIsICJLZXl3b3JkIgorCisgICAiWCIsIiIsIiIsIiIKKworQ2xhbmcgcHJvdmlkZXMgc3VwcG9ydCBmb3IgQysrIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIGluIEMuICBGdW5jdGlvbiBvdmVybG9hZGluZworaW4gQyBpcyBpbnRyb2R1Y2VkIHVzaW5nIHRoZSBgYG92ZXJsb2FkYWJsZWBgIGF0dHJpYnV0ZS4gIEZvciBleGFtcGxlLCBvbmUKK21pZ2h0IHByb3ZpZGUgc2V2ZXJhbCBvdmVybG9hZGVkIHZlcnNpb25zIG9mIGEgYGB0Z3NpbmBgIGZ1bmN0aW9uIHRoYXQgaW52b2tlcwordGhlIGFwcHJvcHJpYXRlIHN0YW5kYXJkIGZ1bmN0aW9uIGNvbXB1dGluZyB0aGUgc2luZSBvZiBhIHZhbHVlIHdpdGggYGBmbG9hdGBgLAorYGBkb3VibGVgYCwgb3IgYGBsb25nIGRvdWJsZWBgIHByZWNpc2lvbjoKKworLi4gY29kZS1ibG9jazo6IGMKKworICAjaW5jbHVkZSA8bWF0aC5oPgorICBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0Z3NpbihmbG9hdCB4KSB7IHJldHVybiBzaW5mKHgpOyB9CisgIGRvdWJsZSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0Z3Npbihkb3VibGUgeCkgeyByZXR1cm4gc2luKHgpOyB9CisgIGxvbmcgZG91YmxlIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIHRnc2luKGxvbmcgZG91YmxlIHgpIHsgcmV0dXJuIHNpbmwoeCk7IH0KKworR2l2ZW4gdGhlc2UgZGVjbGFyYXRpb25zLCBvbmUgY2FuIGNhbGwgYGB0Z3NpbmBgIHdpdGggYSBgYGZsb2F0YGAgdmFsdWUgdG8KK3JlY2VpdmUgYSBgYGZsb2F0YGAgcmVzdWx0LCB3aXRoIGEgYGBkb3VibGVgYCB0byByZWNlaXZlIGEgYGBkb3VibGVgYCByZXN1bHQsCitldGMuICBGdW5jdGlvbiBvdmVybG9hZGluZyBpbiBDIGZvbGxvd3MgdGhlIHJ1bGVzIG9mIEMrKyBmdW5jdGlvbiBvdmVybG9hZGluZwordG8gcGljayB0aGUgYmVzdCBvdmVybG9hZCBnaXZlbiB0aGUgY2FsbCBhcmd1bWVudHMsIHdpdGggYSBmZXcgQy1zcGVjaWZpYworc2VtYW50aWNzOgorCisqIENvbnZlcnNpb24gZnJvbSBgYGZsb2F0YGAgb3IgYGBkb3VibGVgYCB0byBgYGxvbmcgZG91YmxlYGAgaXMgcmFua2VkIGFzIGEKKyAgZmxvYXRpbmctcG9pbnQgcHJvbW90aW9uIChwZXIgQzk5KSByYXRoZXIgdGhhbiBhcyBhIGZsb2F0aW5nLXBvaW50IGNvbnZlcnNpb24KKyAgKGFzIGluIEMrKykuCisKKyogQSBjb252ZXJzaW9uIGZyb20gYSBwb2ludGVyIG9mIHR5cGUgYGBUKmBgIHRvIGEgcG9pbnRlciBvZiB0eXBlIGBgVSpgYCBpcworICBjb25zaWRlcmVkIGEgcG9pbnRlciBjb252ZXJzaW9uICh3aXRoIGNvbnZlcnNpb24gcmFuaykgaWYgYGBUYGAgYW5kIGBgVWBgIGFyZQorICBjb21wYXRpYmxlIHR5cGVzLgorCisqIEEgY29udmVyc2lvbiBmcm9tIHR5cGUgYGBUYGAgdG8gYSB2YWx1ZSBvZiB0eXBlIGBgVWBgIGlzIHBlcm1pdHRlZCBpZiBgYFRgYAorICBhbmQgYGBVYGAgYXJlIGNvbXBhdGlibGUgdHlwZXMuICBUaGlzIGNvbnZlcnNpb24gaXMgZ2l2ZW4gImNvbnZlcnNpb24iIHJhbmsuCisKK1RoZSBkZWNsYXJhdGlvbiBvZiBgYG92ZXJsb2FkYWJsZWBgIGZ1bmN0aW9ucyBpcyByZXN0cmljdGVkIHRvIGZ1bmN0aW9uCitkZWNsYXJhdGlvbnMgYW5kIGRlZmluaXRpb25zLiAgTW9zdCBpbXBvcnRhbnRseSwgaWYgYW55IGZ1bmN0aW9uIHdpdGggYSBnaXZlbgorbmFtZSBpcyBnaXZlbiB0aGUgYGBvdmVybG9hZGFibGVgYCBhdHRyaWJ1dGUsIHRoZW4gYWxsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworYW5kIGRlZmluaXRpb25zIHdpdGggdGhhdCBuYW1lIChhbmQgaW4gdGhhdCBzY29wZSkgbXVzdCBoYXZlIHRoZQorYGBvdmVybG9hZGFibGVgYCBhdHRyaWJ1dGUuICBUaGlzIHJ1bGUgZXZlbiBhcHBsaWVzIHRvIHJlZGVjbGFyYXRpb25zIG9mCitmdW5jdGlvbnMgd2hvc2Ugb3JpZ2luYWwgZGVjbGFyYXRpb24gaGFkIHRoZSBgYG92ZXJsb2FkYWJsZWBgIGF0dHJpYnV0ZSwgZS5nLiwKKworLi4gY29kZS1ibG9jazo6IGMKKworICBpbnQgZihpbnQpIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpOworICBmbG9hdCBmKGZsb2F0KTsgLy8gZXJyb3I6IGRlY2xhcmF0aW9uIG9mICJmIiBtdXN0IGhhdmUgdGhlICJvdmVybG9hZGFibGUiIGF0dHJpYnV0ZQorCisgIGludCBnKGludCkgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSk7CisgIGludCBnKGludCkgeyB9IC8vIGVycm9yOiByZWRlY2xhcmF0aW9uIG9mICJnIiBtdXN0IGFsc28gaGF2ZSB0aGUgIm92ZXJsb2FkYWJsZSIgYXR0cmlidXRlCisKK0Z1bmN0aW9ucyBtYXJrZWQgYGBvdmVybG9hZGFibGVgYCBtdXN0IGhhdmUgcHJvdG90eXBlcy4gIFRoZXJlZm9yZSwgdGhlCitmb2xsb3dpbmcgY29kZSBpcyBpbGwtZm9ybWVkOgorCisuLiBjb2RlLWJsb2NrOjogYworCisgIGludCBoKCkgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSk7IC8vIGVycm9yOiBoIGRvZXMgbm90IGhhdmUgYSBwcm90b3R5cGUKKworSG93ZXZlciwgYGBvdmVybG9hZGFibGVgYCBmdW5jdGlvbnMgYXJlIGFsbG93ZWQgdG8gdXNlIGEgZWxsaXBzaXMgZXZlbiBpZiB0aGVyZQorYXJlIG5vIG5hbWVkIHBhcmFtZXRlcnMgKGFzIGlzIHBlcm1pdHRlZCBpbiBDKyspLiAgVGhpcyBmZWF0dXJlIGlzIHBhcnRpY3VsYXJseQordXNlZnVsIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgYGB1bmF2YWlsYWJsZWBgIGF0dHJpYnV0ZToKKworLi4gY29kZS1ibG9jazo6IGMrKworCisgIHZvaWQgaG9uZXlwb3QoLi4uKSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUsIHVuYXZhaWxhYmxlKSk7IC8vIGNhbGxpbmcgbWUgaXMgYW4gZXJyb3IKKworRnVuY3Rpb25zIGRlY2xhcmVkIHdpdGggdGhlIGBgb3ZlcmxvYWRhYmxlYGAgYXR0cmlidXRlIGhhdmUgdGhlaXIgbmFtZXMgbWFuZ2xlZAorYWNjb3JkaW5nIHRvIHRoZSBzYW1lIHJ1bGVzIGFzIEMrKyBmdW5jdGlvbiBuYW1lcy4gIEZvciBleGFtcGxlLCB0aGUgdGhyZWUKK2BgdGdzaW5gYCBmdW5jdGlvbnMgaW4gb3VyIG1vdGl2YXRpbmcgZXhhbXBsZSBnZXQgdGhlIG1hbmdsZWQgbmFtZXMKK2BgX1o1dGdzaW5mYGAsIGBgX1o1dGdzaW5kYGAsIGFuZCBgYF9aNXRnc2luZWBgLCByZXNwZWN0aXZlbHkuICBUaGVyZSBhcmUgdHdvCitjYXZlYXRzIHRvIHRoaXMgdXNlIG9mIG5hbWUgbWFuZ2xpbmc6CisKKyogRnV0dXJlIHZlcnNpb25zIG9mIENsYW5nIG1heSBjaGFuZ2UgdGhlIG5hbWUgbWFuZ2xpbmcgb2YgZnVuY3Rpb25zIG92ZXJsb2FkZWQKKyAgaW4gQywgc28geW91IHNob3VsZCBub3QgZGVwZW5kIG9uIGFuIHNwZWNpZmljIG1hbmdsaW5nLiAgVG8gYmUgY29tcGxldGVseQorICBzYWZlLCB3ZSBzdHJvbmdseSB1cmdlIHRoZSB1c2Ugb2YgYGBzdGF0aWMgaW5saW5lYGAgd2l0aCBgYG92ZXJsb2FkYWJsZWBgCisgIGZ1bmN0aW9ucy4KKworKiBUaGUgYGBvdmVybG9hZGFibGVgYCBhdHRyaWJ1dGUgaGFzIGFsbW9zdCBubyBtZWFuaW5nIHdoZW4gdXNlZCBpbiBDKyssCisgIGJlY2F1c2UgbmFtZXMgd2lsbCBhbHJlYWR5IGJlIG1hbmdsZWQgYW5kIGZ1bmN0aW9ucyBhcmUgYWxyZWFkeSBvdmVybG9hZGFibGUuCisgIEhvd2V2ZXIsIHdoZW4gYW4gYGBvdmVybG9hZGFibGVgYCBmdW5jdGlvbiBvY2N1cnMgd2l0aGluIGFuIGBgZXh0ZXJuICJDImBgCisgIGxpbmthZ2Ugc3BlY2lmaWNhdGlvbiwgaXQncyBuYW1lICp3aWxsKiBiZSBtYW5nbGVkIGluIHRoZSBzYW1lIHdheSBhcyBpdAorICB3b3VsZCBpbiBDLgorCitRdWVyeSBmb3IgdGhpcyBmZWF0dXJlIHdpdGggYGBfX2hhc19leHRlbnNpb24oYXR0cmlidXRlX292ZXJsb2FkYWJsZSlgYC4KKworCityZWxlYXNlX2NhcGFiaWxpdHkgKHJlbGVhc2Vfc2hhcmVkX2NhcGFiaWxpdHksIGNsYW5nOjpyZWxlYXNlX2NhcGFiaWxpdHksIGNsYW5nOjpyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiWCIsIiIsIiIKKworTWFya3MgYSBmdW5jdGlvbiBhcyByZWxlYXNpbmcgYSBjYXBhYmlsaXR5LgorCisKK3RyeV9hY3F1aXJlX2NhcGFiaWxpdHkgKHRyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5LCBjbGFuZzo6dHJ5X2FjcXVpcmVfY2FwYWJpbGl0eSwgY2xhbmc6OnRyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuLiBjc3YtdGFibGU6OiBTdXBwb3J0ZWQgU3ludGF4ZXMKKyAgIDpoZWFkZXI6ICJHTlUiLCAiQysrMTEiLCAiX19kZWNsc3BlYyIsICJLZXl3b3JkIgorCisgICAiWCIsIlgiLCIiLCIiCisKK01hcmtzIGEgZnVuY3Rpb24gdGhhdCBhdHRlbXB0cyB0byBhY3F1aXJlIGEgY2FwYWJpbGl0eS4gVGhpcyBmdW5jdGlvbiBtYXkgZmFpbCB0bworYWN0dWFsbHkgYWNxdWlyZSB0aGUgY2FwYWJpbGl0eTsgdGhleSBhY2NlcHQgYSBCb29sZWFuIHZhbHVlIGRldGVybWluaW5nCit3aGV0aGVyIGFjcXVpcmluZyB0aGUgY2FwYWJpbGl0eSBtZWFucyBzdWNjZXNzICh0cnVlKSwgb3IgZmFpbGluZyB0byBhY3F1aXJlCit0aGUgY2FwYWJpbGl0eSBtZWFucyBzdWNjZXNzIChmYWxzZSkuCisKKworVmFyaWFibGUgQXR0cmlidXRlcworPT09PT09PT09PT09PT09PT09PQorCisKK3Rsc19tb2RlbCAoZ251Ojp0bHNfbW9kZWwpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLi4gY3N2LXRhYmxlOjogU3VwcG9ydGVkIFN5bnRheGVzCisgICA6aGVhZGVyOiAiR05VIiwgIkMrKzExIiwgIl9fZGVjbHNwZWMiLCAiS2V5d29yZCIKKworICAgIlgiLCJYIiwiIiwiIgorCitUaGUgYGB0bHNfbW9kZWxgYCBhdHRyaWJ1dGUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoaWNoIHRocmVhZC1sb2NhbCBzdG9yYWdlCittb2RlbCB0byB1c2UuIEl0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBzdHJpbmdzOgorCisqIGdsb2JhbC1keW5hbWljCisqIGxvY2FsLWR5bmFtaWMKKyogaW5pdGlhbC1leGVjCisqIGxvY2FsLWV4ZWMKKworVExTIG1vZGVscyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorCisKK1R5cGUgQXR0cmlidXRlcworPT09PT09PT09PT09PT09CisKKworX19zaW5nbGVfaW5oZXJ0aWFuY2UsIF9fbXVsdGlwbGVfaW5oZXJpdGFuY2UsIF9fdmlydHVhbF9pbmhlcml0YW5jZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLi4gY3N2LXRhYmxlOjogU3VwcG9ydGVkIFN5bnRheGVzCisgICA6aGVhZGVyOiAiR05VIiwgIkMrKzExIiwgIl9fZGVjbHNwZWMiLCAiS2V5d29yZCIKKworICAgIiIsIiIsIiIsIlgiCisKK1RoaXMgY29sbGVjdGlvbiBvZiBrZXl3b3JkcyBpcyBlbmFibGVkIHVuZGVyIGBgLWZtcy1leHRlbnNpb25zYGAgYW5kIGNvbnRyb2xzCit0aGUgcG9pbnRlci10by1tZW1iZXIgcmVwcmVzZW50YXRpb24gdXNlZCBvbiBgYCotKi13aW4zMmBgIHRhcmdldHMuCisKK1RoZSBgYCotKi13aW4zMmBgIHRhcmdldHMgdXRpbGl6ZSBhIHBvaW50ZXItdG8tbWVtYmVyIHJlcHJlc2VudGF0aW9uIHdoaWNoCit2YXJpZXMgaW4gc2l6ZSBhbmQgYWxpZ25tZW50IGRlcGVuZGluZyBvbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgdW5kZXJseWluZworY2xhc3MuCisKK0hvd2V2ZXIsIHRoaXMgaXMgcHJvYmxlbWF0aWMgd2hlbiBhIGZvcndhcmQgZGVjbGFyYXRpb24gaXMgb25seSBhdmFpbGFibGUgYW5kCitubyBkZWZpbml0aW9uIGhhcyBiZWVuIG1hZGUgeWV0LiAgSW4gc3VjaCBjYXNlcywgQ2xhbmcgaXMgZm9yY2VkIHRvIHV0aWxpemUgdGhlCittb3N0IGdlbmVyYWwgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBhdmFpbGFibGUgdG8gaXQuCisKK1RoZXNlIGtleXdvcmRzIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIGEgcG9pbnRlci10by1tZW1iZXIgcmVwcmVzZW50YXRpb24gb3RoZXIKK3RoYW4gdGhlIG1vc3QgZ2VuZXJhbCBvbmUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgZGVmaW5pdGlvbiB3aWxsIGV2ZXIKK2JlIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4KKworVGhpcyBmYW1pbHkgb2Yga2V5d29yZHMgYmVsb25nIGJldHdlZW4gdGhlIGBgY2xhc3Mta2V5YGAgYW5kIGBgY2xhc3MtbmFtZWBgOgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgc3RydWN0IF9fc2luZ2xlX2luaGVyaXRhbmNlIFM7CisgIGludCBTOjoqaTsKKyAgc3RydWN0IFMge307CisKK1RoaXMga2V5d29yZCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyB0ZW1wbGF0ZXMgYnV0IG9ubHkgaGFzIGFuIGVmZmVjdCB3aGVuIHVzZWQKK29uIGZ1bGwgc3BlY2lhbGl6YXRpb25zOgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHN0cnVjdCBfX3NpbmdsZV9pbmhlcml0YW5jZSBBOyAvLyB3YXJuaW5nOiBpbmhlcml0YW5jZSBtb2RlbCBpZ25vcmVkIG9uIHByaW1hcnkgdGVtcGxhdGUKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBfX211bHRpcGxlX2luaGVyaXRhbmNlIEE8VCwgVD47IC8vIHdhcm5pbmc6IGluaGVyaXRhbmNlIG1vZGVsIGlnbm9yZWQgb24gcGFydGlhbCBzcGVjaWFsaXphdGlvbgorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19zaW5nbGVfaW5oZXJpdGFuY2UgQTxpbnQsIGZsb2F0PjsKKworTm90ZSB0aGF0IGNob29zaW5nIGFuIGluaGVyaXRhbmNlIG1vZGVsIGxlc3MgZ2VuZXJhbCB0aGFuIHN0cmljdGx5IG5lY2Vzc2FyeSBpcworYW4gZXJyb3I6CisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICBzdHJ1Y3QgX19tdWx0aXBsZV9pbmhlcml0YW5jZSBTOyAvLyBlcnJvcjogaW5oZXJpdGFuY2UgbW9kZWwgZG9lcyBub3QgbWF0Y2ggZGVmaW5pdGlvbgorICBpbnQgUzo6Kmk7CisgIHN0cnVjdCBTIHt9OworCisKK1N0YXRlbWVudCBBdHRyaWJ1dGVzCis9PT09PT09PT09PT09PT09PT09PQorCisKK2ZhbGx0aHJvdWdoIChjbGFuZzo6ZmFsbHRocm91Z2gpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLi4gY3N2LXRhYmxlOjogU3VwcG9ydGVkIFN5bnRheGVzCisgICA6aGVhZGVyOiAiR05VIiwgIkMrKzExIiwgIl9fZGVjbHNwZWMiLCAiS2V5d29yZCIKKworICAgIiIsIlgiLCIiLCIiCisKK1RoZSBgYGNsYW5nOjpmYWxsdGhyb3VnaGBgIGF0dHJpYnV0ZSBpcyB1c2VkIGFsb25nIHdpdGggdGhlCitgYC1XaW1wbGljaXQtZmFsbHRocm91Z2hgYCBhcmd1bWVudCB0byBhbm5vdGF0ZSBpbnRlbnRpb25hbCBmYWxsLXRocm91Z2gKK2JldHdlZW4gc3dpdGNoIGxhYmVscy4gIEl0IGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBudWxsIHN0YXRlbWVudCBwbGFjZWQgYXQgYQorcG9pbnQgb2YgZXhlY3V0aW9uIGJldHdlZW4gYW55IHN0YXRlbWVudCBhbmQgdGhlIG5leHQgc3dpdGNoIGxhYmVsLiAgSXQgaXMKK2NvbW1vbiB0byBtYXJrIHRoZXNlIHBsYWNlcyB3aXRoIGEgc3BlY2lmaWMgY29tbWVudCwgYnV0IHRoaXMgYXR0cmlidXRlIGlzCittZWFudCB0byByZXBsYWNlIGNvbW1lbnRzIHdpdGggYSBtb3JlIHN0cmljdCBhbm5vdGF0aW9uLCB3aGljaCBjYW4gYmUgY2hlY2tlZAorYnkgdGhlIGNvbXBpbGVyLiAgVGhpcyBhdHRyaWJ1dGUgZG9lc24ndCBjaGFuZ2Ugc2VtYW50aWNzIG9mIHRoZSBjb2RlIGFuZCBjYW4KK2JlIHVzZWQgd2hlcmV2ZXIgYW4gaW50ZW5kZWQgZmFsbC10aHJvdWdoIG9jY3Vycy4gIEl0IGlzIGRlc2lnbmVkIHRvIG1pbWljCitjb250cm9sLWZsb3cgc3RhdGVtZW50cyBsaWtlIGBgYnJlYWs7YGAsIHNvIGl0IGNhbiBiZSBwbGFjZWQgaW4gbW9zdCBwbGFjZXMKK3doZXJlIGBgYnJlYWs7YGAgY2FuLCBidXQgb25seSBpZiB0aGVyZSBhcmUgbm8gc3RhdGVtZW50cyBvbiB0aGUgZXhlY3V0aW9uIHBhdGgKK2JldHdlZW4gaXQgYW5kIHRoZSBuZXh0IHN3aXRjaCBsYWJlbC4KKworSGVyZSBpcyBhbiBleGFtcGxlOgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgLy8gY29tcGlsZSB3aXRoIC1XaW1wbGljaXQtZmFsbHRocm91Z2gKKyAgc3dpdGNoIChuKSB7CisgIGNhc2UgMjI6CisgIGNhc2UgMzM6ICAvLyBubyB3YXJuaW5nOiBubyBzdGF0ZW1lbnRzIGJldHdlZW4gY2FzZSBsYWJlbHMKKyAgICBmKCk7CisgIGNhc2UgNDQ6ICAvLyB3YXJuaW5nOiB1bmFubm90YXRlZCBmYWxsLXRocm91Z2gKKyAgICBnKCk7CisgICAgW1tjbGFuZzo6ZmFsbHRocm91Z2hdXTsKKyAgY2FzZSA1NTogIC8vIG5vIHdhcm5pbmcKKyAgICBpZiAoeCkgeworICAgICAgaCgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaSgpOworICAgICAgW1tjbGFuZzo6ZmFsbHRocm91Z2hdXTsKKyAgICB9CisgIGNhc2UgNjY6ICAvLyBubyB3YXJuaW5nCisgICAgcCgpOworICAgIFtbY2xhbmc6OmZhbGx0aHJvdWdoXV07IC8vIHdhcm5pbmc6IGZhbGx0aHJvdWdoIGFubm90YXRpb24gZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBkaXJlY3RseSBwcmVjZWRlIGNhc2UgbGFiZWwKKyAgICBxKCk7CisgIGNhc2UgNzc6ICAvLyB3YXJuaW5nOiB1bmFubm90YXRlZCBmYWxsLXRocm91Z2gKKyAgICByKCk7CisgIH0KKworCitDb25zdW1lZCBBbm5vdGF0aW9uIENoZWNraW5nCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDbGFuZyBzdXBwb3J0cyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgZm9yIGNoZWNraW5nIGJhc2ljIHJlc291cmNlIG1hbmFnZW1lbnQKK3Byb3BlcnRpZXMsIHNwZWNpZmljYWxseSBmb3IgdW5pcXVlIG9iamVjdHMgdGhhdCBoYXZlIGEgc2luZ2xlIG93bmluZyByZWZlcmVuY2UuCitUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQsIGFsdGhvdWdoICoqdGhlIGltcGxlbWVudGF0aW9uCitmb3IgdGhlc2UgYW5ub3RhdGlvbnMgaXMgY3VycmVudGx5IGluIGRldmVsb3BtZW50IGFuZCBhcmUgc3ViamVjdCB0byBjaGFuZ2UuKioKKworY2FsbGFibGVfd2hlbgorLS0tLS0tLS0tLS0tLQorLi4gY3N2LXRhYmxlOjogU3VwcG9ydGVkIFN5bnRheGVzCisgICA6aGVhZGVyOiAiR05VIiwgIkMrKzExIiwgIl9fZGVjbHNwZWMiLCAiS2V5d29yZCIKKworICAgIlgiLCIiLCIiLCIiCisKK1VzZSBgYF9fYXR0cmlidXRlX18oKGNhbGxhYmxlX3doZW4oLi4uKSkpYGAgdG8gaW5kaWNhdGUgd2hhdCBzdGF0ZXMgYSBtZXRob2QKK21heSBiZSBjYWxsZWQgaW4uICBWYWxpZCBzdGF0ZXMgYXJlIHVuY29uc3VtZWQsIGNvbnN1bWVkLCBvciB1bmtub3duLiAgRWFjaAorYXJndW1lbnQgdG8gdGhpcyBhdHRyaWJ1dGUgbXVzdCBiZSBhIHF1b3RlZCBzdHJpbmcuICBFLmcuOgorCitgYF9fYXR0cmlidXRlX18oKGNhbGxhYmxlX3doZW4oInVuY29uc3VtZWQiLCAidW5rbm93biIpKSlgYAorCisKK2NvbnN1bWFibGUKKy0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiIiwiIiwiIgorCitFYWNoIGBgY2xhc3NgYCB0aGF0IHVzZXMgYW55IG9mIHRoZSB0eXBlc3RhdGUgYW5ub3RhdGlvbnMgbXVzdCBmaXJzdCBiZSBtYXJrZWQKK3VzaW5nIHRoZSBgYGNvbnN1bWFibGVgYCBhdHRyaWJ1dGUuICBGYWlsdXJlIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZy4KKworVGhpcyBhdHRyaWJ1dGUgYWNjZXB0cyBhIHNpbmdsZSBwYXJhbWV0ZXIgdGhhdCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorYGB1bmtub3duYGAsIGBgY29uc3VtZWRgYCwgb3IgYGB1bmNvbnN1bWVkYGAuCisKKworcGFyYW1fdHlwZXN0YXRlCistLS0tLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiIiwiIiwiIgorCitUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgZXhwZWN0YXRpb25zIGFib3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMuICBDYWxscyB0byBhbgorZnVuY3Rpb24gd2l0aCBhbm5vdGF0ZWQgcGFyYW1ldGVycyB3aWxsIGlzc3VlIGEgd2FybmluZyBpZiB0aGUgY29ycmVzcG9uZGluZworYXJndW1lbnQgaXNuJ3QgaW4gdGhlIGV4cGVjdGVkIHN0YXRlLiAgVGhlIGF0dHJpYnV0ZSBpcyBhbHNvIHVzZWQgdG8gc2V0IHRoZQoraW5pdGlhbCBzdGF0ZSBvZiB0aGUgcGFyYW1ldGVyIHdoZW4gYW5hbHl6aW5nIHRoZSBmdW5jdGlvbidzIGJvZHkuCisKKworcmV0dXJuX3R5cGVzdGF0ZQorLS0tLS0tLS0tLS0tLS0tLQorLi4gY3N2LXRhYmxlOjogU3VwcG9ydGVkIFN5bnRheGVzCisgICA6aGVhZGVyOiAiR05VIiwgIkMrKzExIiwgIl9fZGVjbHNwZWMiLCAiS2V5d29yZCIKKworICAgIlgiLCIiLCIiLCIiCisKK1RoZSBgYHJldHVybl90eXBlc3RhdGVgYCBhdHRyaWJ1dGUgY2FuIGJlIGFwcGxpZWQgdG8gZnVuY3Rpb25zIG9yIHBhcmFtZXRlcnMuCitXaGVuIGFwcGxpZWQgdG8gYSBmdW5jdGlvbiB0aGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgc3RhdGUgb2YgdGhlIHJldHVybmVkCit2YWx1ZS4gIFRoZSBmdW5jdGlvbidzIGJvZHkgaXMgY2hlY2tlZCB0byBlbnN1cmUgdGhhdCBpdCBhbHdheXMgcmV0dXJucyBhIHZhbHVlCitpbiB0aGUgc3BlY2lmaWVkIHN0YXRlLiAgT24gdGhlIGNhbGxlciBzaWRlLCB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGFubm90YXRlZAorZnVuY3Rpb24gYXJlIGluaXRpYWxpemVkIHRvIHRoZSBnaXZlbiBzdGF0ZS4KKworV2hlbiBhcHBsaWVkIHRvIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGl0IG1vZGlmaWVzIHRoZSBzdGF0ZSBvZiBhbiBhcmd1bWVudCBhZnRlcgorYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiByZXR1cm5zLiAgVGhlIGZ1bmN0aW9uJ3MgYm9keSBpcyBjaGVja2VkIHRvIGVuc3VyZSB0aGF0Cit0aGUgcGFyYW1ldGVyIGlzIGluIHRoZSBleHBlY3RlZCBzdGF0ZSBiZWZvcmUgcmV0dXJuaW5nLgorCisKK3NldF90eXBlc3RhdGUKKy0tLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiIiwiIiwiIgorCitBbm5vdGF0ZSBtZXRob2RzIHRoYXQgdHJhbnNpdGlvbiBhbiBvYmplY3QgaW50byBhIG5ldyBzdGF0ZSB3aXRoCitgYF9fYXR0cmlidXRlX18oKHNldF90eXBlc3RhdGUobmV3X3N0YXRlKSkpYGAuICBUaGUgbmV3IG5ldyBzdGF0ZSBtdXN0IGJlCit1bmNvbnN1bWVkLCBjb25zdW1lZCwgb3IgdW5rbm93bi4KKworCit0ZXN0X3R5cGVzdGF0ZQorLS0tLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiIiwiIiwiIgorCitVc2UgYGBfX2F0dHJpYnV0ZV9fKCh0ZXN0X3R5cGVzdGF0ZSh0ZXN0ZWRfc3RhdGUpKSlgYCB0byBpbmRpY2F0ZSB0aGF0IGEgbWV0aG9kCityZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyBpbiB0aGUgc3BlY2lmaWVkIHN0YXRlLi4KKworCitUeXBlIFNhZmV0eSBDaGVja2luZworPT09PT09PT09PT09PT09PT09PT0KK0NsYW5nIHN1cHBvcnRzIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBlbmFibGUgY2hlY2tpbmcgdHlwZSBzYWZldHkgcHJvcGVydGllcwordGhhdCBjYW4ndCBiZSBlbmZvcmNlZCBieSB0aGUgQyB0eXBlIHN5c3RlbS4gIFVzZSBjYXNlcyBpbmNsdWRlOgorCisqIE1QSSBsaWJyYXJ5IGltcGxlbWVudGF0aW9ucywgd2hlcmUgdGhlc2UgYXR0cmlidXRlcyBlbmFibGUgY2hlY2tpbmcgdGhhdAorICB0aGUgYnVmZmVyIHR5cGUgbWF0Y2hlcyB0aGUgcGFzc2VkIGBgTVBJX0RhdGF0eXBlYGA7CisqIGZvciBIREY1IGxpYnJhcnkgdGhlcmUgaXMgYSBzaW1pbGFyIHVzZSBjYXNlIHRvIE1QSTsKKyogY2hlY2tpbmcgdHlwZXMgb2YgdmFyaWFkaWMgZnVuY3Rpb25zJyBhcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyBsaWtlCisgIGBgZmNudGwoKWBgIGFuZCBgYGlvY3RsKClgYC4KKworWW91IGNhbiBkZXRlY3Qgc3VwcG9ydCBmb3IgdGhlc2UgYXR0cmlidXRlcyB3aXRoIGBgX19oYXNfYXR0cmlidXRlKClgYC4gIEZvcgorZXhhbXBsZToKKworLi4gY29kZS1ibG9jazo6IGMrKworCisgICNpZiBkZWZpbmVkKF9faGFzX2F0dHJpYnV0ZSkKKyAgIyAgaWYgX19oYXNfYXR0cmlidXRlKGFyZ3VtZW50X3dpdGhfdHlwZV90YWcpICYmIFwKKyAgICAgICAgX19oYXNfYXR0cmlidXRlKHBvaW50ZXJfd2l0aF90eXBlX3RhZykgJiYgXAorICAgICAgICBfX2hhc19hdHRyaWJ1dGUodHlwZV90YWdfZm9yX2RhdGF0eXBlKQorICAjICAgIGRlZmluZSBBVFRSX01QSV9QV1QoYnVmZmVyX2lkeCwgdHlwZV9pZHgpIF9fYXR0cmlidXRlX18oKHBvaW50ZXJfd2l0aF90eXBlX3RhZyhtcGksYnVmZmVyX2lkeCx0eXBlX2lkeCkpKQorICAvKiAuLi4gb3RoZXIgbWFjcm9zIC4uLiAgKi8KKyAgIyAgZW5kaWYKKyAgI2VuZGlmCisKKyAgI2lmICFkZWZpbmVkKEFUVFJfTVBJX1BXVCkKKyAgIyBkZWZpbmUgQVRUUl9NUElfUFdUKGJ1ZmZlcl9pZHgsIHR5cGVfaWR4KQorICAjZW5kaWYKKworICBpbnQgTVBJX1NlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSAvKiwgb3RoZXIgYXJncyBvbWl0dGVkICovKQorICAgICAgQVRUUl9NUElfUFdUKDEsMyk7CisKK2FyZ3VtZW50X3dpdGhfdHlwZV90YWcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy4uIGNzdi10YWJsZTo6IFN1cHBvcnRlZCBTeW50YXhlcworICAgOmhlYWRlcjogIkdOVSIsICJDKysxMSIsICJfX2RlY2xzcGVjIiwgIktleXdvcmQiCisKKyAgICJYIiwiIiwiIiwiIgorCitVc2UgYGBfX2F0dHJpYnV0ZV9fKChhcmd1bWVudF93aXRoX3R5cGVfdGFnKGFyZ19raW5kLCBhcmdfaWR4LAordHlwZV90YWdfaWR4KSkpYGAgb24gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0byBzcGVjaWZ5IHRoYXQgdGhlIGZ1bmN0aW9uCithY2NlcHRzIGEgdHlwZSB0YWcgdGhhdCBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIHNvbWUgb3RoZXIgYXJndW1lbnQuCitgYGFyZ19raW5kYGAgaXMgYW4gaWRlbnRpZmllciB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gYW5ub3RhdGluZyBhbGwKK2FwcGxpY2FibGUgdHlwZSB0YWdzLgorCitUaGlzIGF0dHJpYnV0ZSBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBjaGVja2luZyBhcmd1bWVudHMgb2YgdmFyaWFkaWMgZnVuY3Rpb25zCisoYGBwb2ludGVyX3dpdGhfdHlwZV90YWdgYCBjYW4gYmUgdXNlZCBpbiBtb3N0IG5vbi12YXJpYWRpYyBjYXNlcykuCisKK0ZvciBleGFtcGxlOgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgaW50IGZjbnRsKGludCBmZCwgaW50IGNtZCwgLi4uKQorICAgICAgX19hdHRyaWJ1dGVfXygoIGFyZ3VtZW50X3dpdGhfdHlwZV90YWcoZmNudGwsMywyKSApKTsKKworCitwb2ludGVyX3dpdGhfdHlwZV90YWcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLi4gY3N2LXRhYmxlOjogU3VwcG9ydGVkIFN5bnRheGVzCisgICA6aGVhZGVyOiAiR05VIiwgIkMrKzExIiwgIl9fZGVjbHNwZWMiLCAiS2V5d29yZCIKKworICAgIlgiLCIiLCIiLCIiCisKK1VzZSBgYF9fYXR0cmlidXRlX18oKHBvaW50ZXJfd2l0aF90eXBlX3RhZyhwdHJfa2luZCwgcHRyX2lkeCwgdHlwZV90YWdfaWR4KSkpYGAKK29uIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgdHlwZSB0YWcgdGhhdAorZGV0ZXJtaW5lcyB0aGUgcG9pbnRlZSB0eXBlIG9mIHNvbWUgb3RoZXIgcG9pbnRlciBhcmd1bWVudC4KKworRm9yIGV4YW1wbGU6CisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICBpbnQgTVBJX1NlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSAvKiwgb3RoZXIgYXJncyBvbWl0dGVkICovKQorICAgICAgX19hdHRyaWJ1dGVfXygoIHBvaW50ZXJfd2l0aF90eXBlX3RhZyhtcGksMSwzKSApKTsKKworCit0eXBlX3RhZ19mb3JfZGF0YXR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLi4gY3N2LXRhYmxlOjogU3VwcG9ydGVkIFN5bnRheGVzCisgICA6aGVhZGVyOiAiR05VIiwgIkMrKzExIiwgIl9fZGVjbHNwZWMiLCAiS2V5d29yZCIKKworICAgIlgiLCIiLCIiLCIiCisKK0NsYW5nIHN1cHBvcnRzIGFubm90YXRpbmcgdHlwZSB0YWdzIG9mIHR3byBmb3Jtcy4KKworKiAqKlR5cGUgdGFnIHRoYXQgaXMgYW4gZXhwcmVzc2lvbiBjb250YWluaW5nIGEgcmVmZXJlbmNlIHRvIHNvbWUgZGVjbGFyZWQKKyAgaWRlbnRpZmllci4qKiBVc2UgYGBfX2F0dHJpYnV0ZV9fKCh0eXBlX3RhZ19mb3JfZGF0YXR5cGUoa2luZCwgdHlwZSkpKWBgIG9uIGEKKyAgZGVjbGFyYXRpb24gd2l0aCB0aGF0IGlkZW50aWZpZXI6CisKKyAgLi4gY29kZS1ibG9jazo6IGMrKworCisgICAgZXh0ZXJuIHN0cnVjdCBtcGlfZGF0YXR5cGUgbXBpX2RhdGF0eXBlX2ludAorICAgICAgICBfX2F0dHJpYnV0ZV9fKCggdHlwZV90YWdfZm9yX2RhdGF0eXBlKG1waSxpbnQpICkpOworICAgICNkZWZpbmUgTVBJX0lOVCAoKE1QSV9EYXRhdHlwZSkgJm1waV9kYXRhdHlwZV9pbnQpCisKKyogKipUeXBlIHRhZyB0aGF0IGlzIGFuIGludGVncmFsIGxpdGVyYWwuKiogSW50cm9kdWNlIGEgYGBzdGF0aWMgY29uc3RgYAorICB2YXJpYWJsZSB3aXRoIGEgY29ycmVzcG9uZGluZyBpbml0aWFsaXplciB2YWx1ZSBhbmQgYXR0YWNoCisgIGBgX19hdHRyaWJ1dGVfXygodHlwZV90YWdfZm9yX2RhdGF0eXBlKGtpbmQsIHR5cGUpKSlgYCBvbiB0aGF0IGRlY2xhcmF0aW9uLAorICBmb3IgZXhhbXBsZToKKworICAuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgICAjZGVmaW5lIE1QSV9JTlQgKChNUElfRGF0YXR5cGUpIDQyKQorICAgIHN0YXRpYyBjb25zdCBNUElfRGF0YXR5cGUgbXBpX2RhdGF0eXBlX2ludAorICAgICAgICBfX2F0dHJpYnV0ZV9fKCggdHlwZV90YWdfZm9yX2RhdGF0eXBlKG1waSxpbnQpICkpID0gNDIKKworVGhlIGF0dHJpYnV0ZSBhbHNvIGFjY2VwdHMgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUKK2V4cHJlc3Npb24gaXMgY29tcGFyZWQgdG8gdGhlIHR5cGUgdGFnLiAgVGhlcmUgYXJlIHR3byBzdXBwb3J0ZWQgZmxhZ3M6CisKKyogYGBsYXlvdXRfY29tcGF0aWJsZWBgIHdpbGwgY2F1c2UgdHlwZXMgdG8gYmUgY29tcGFyZWQgYWNjb3JkaW5nIHRvCisgIGxheW91dC1jb21wYXRpYmlsaXR5IHJ1bGVzIChDKysxMSBbY2xhc3MubWVtXSBwIDE3LCAxOCkuICBUaGlzIGlzCisgIGltcGxlbWVudGVkIHRvIHN1cHBvcnQgYW5ub3RhdGluZyB0eXBlcyBsaWtlIGBgTVBJX0RPVUJMRV9JTlRgYC4KKworICBGb3IgZXhhbXBsZToKKworICAuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgICAvKiBJbiBtcGkuaCAqLworICAgIHN0cnVjdCBpbnRlcm5hbF9tcGlfZG91YmxlX2ludCB7IGRvdWJsZSBkOyBpbnQgaTsgfTsKKyAgICBleHRlcm4gc3RydWN0IG1waV9kYXRhdHlwZSBtcGlfZGF0YXR5cGVfZG91YmxlX2ludAorICAgICAgICBfX2F0dHJpYnV0ZV9fKCggdHlwZV90YWdfZm9yX2RhdGF0eXBlKG1waSwgc3RydWN0IGludGVybmFsX21waV9kb3VibGVfaW50LCBsYXlvdXRfY29tcGF0aWJsZSkgKSk7CisKKyAgICAjZGVmaW5lIE1QSV9ET1VCTEVfSU5UICgoTVBJX0RhdGF0eXBlKSAmbXBpX2RhdGF0eXBlX2RvdWJsZV9pbnQpCisKKyAgICAvKiBJbiB1c2VyIGNvZGUgKi8KKyAgICBzdHJ1Y3QgbXlfcGFpciB7IGRvdWJsZSBhOyBpbnQgYjsgfTsKKyAgICBzdHJ1Y3QgbXlfcGFpciAqYnVmZmVyOworICAgIE1QSV9TZW5kKGJ1ZmZlciwgMSwgTVBJX0RPVUJMRV9JTlQgLyosIC4uLiAgKi8pOyAvLyBubyB3YXJuaW5nCisKKyAgICBzdHJ1Y3QgbXlfaW50X3BhaXIgeyBpbnQgYTsgaW50IGI7IH0KKyAgICBzdHJ1Y3QgbXlfaW50X3BhaXIgKmJ1ZmZlcjI7CisgICAgTVBJX1NlbmQoYnVmZmVyMiwgMSwgTVBJX0RPVUJMRV9JTlQgLyosIC4uLiAgKi8pOyAvLyB3YXJuaW5nOiBhY3R1YWwgYnVmZmVyIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgJ3N0cnVjdCBteV9pbnRfcGFpcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0Y2ggc3BlY2lmaWVkIE1QSV9EYXRhdHlwZQorCisqIGBgbXVzdF9iZV9udWxsYGAgc3BlY2lmaWVzIHRoYXQgdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIGEgbnVsbCBwb2ludGVyCisgIGNvbnN0YW50LCBmb3IgZXhhbXBsZToKKworICAuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgICAvKiBJbiBtcGkuaCAqLworICAgIGV4dGVybiBzdHJ1Y3QgbXBpX2RhdGF0eXBlIG1waV9kYXRhdHlwZV9udWxsCisgICAgICAgIF9fYXR0cmlidXRlX18oKCB0eXBlX3RhZ19mb3JfZGF0YXR5cGUobXBpLCB2b2lkLCBtdXN0X2JlX251bGwpICkpOworCisgICAgI2RlZmluZSBNUElfREFUQVRZUEVfTlVMTCAoKE1QSV9EYXRhdHlwZSkgJm1waV9kYXRhdHlwZV9udWxsKQorCisgICAgLyogSW4gdXNlciBjb2RlICovCisgICAgTVBJX1NlbmQoYnVmZmVyLCAxLCBNUElfREFUQVRZUEVfTlVMTCAvKiwgLi4uICAqLyk7IC8vIHdhcm5pbmc6IE1QSV9EQVRBVFlQRV9OVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBzcGVjaWZpZWQgYnV0IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgYSBudWxsIHBvaW50ZXIKKworCmRpZmYgLS1naXQgYS9kb2NzL0NNYWtlTGlzdHMudHh0IGIvZG9jcy9DTWFrZUxpc3RzLnR4dAppbmRleCA4NTI4YzdhLi42MzVlYTFmIDEwMDY0NAotLS0gYS9kb2NzL0NNYWtlTGlzdHMudHh0CisrKyBiL2RvY3MvQ01ha2VMaXN0cy50eHQKQEAgLTIyLDYgKzIyLDMxIEBACiAgICAgc2V0KGV4dHJhX3NlYXJjaF9tYXBwaW5ncyAiIikKICAgZW5kaWYoKQogCisgICMgSWYgYXNrZWQsIGNvbmZpZ3VyZSBkb3h5Z2VuIGZvciB0aGUgY3JlYXRpb24gb2YgYSBRdCBDb21wcmVzc2VkIEhlbHAgZmlsZS4KKyAgaWYgKExMVk1fRU5BQkxFX0RPWFlHRU5fUVRfSEVMUCkKKyAgICBzZXQoQ0xBTkdfRE9YWUdFTl9RQ0hfRklMRU5BTUUgIm9yZy5sbHZtLmNsYW5nLnFjaCIgQ0FDSEUgU1RSSU5HCisgICAgICAiRmlsZW5hbWUgb2YgdGhlIFF0IENvbXByZXNzZWQgaGVscCBmaWxlIikKKyAgICBzZXQoQ0xBTkdfRE9YWUdFTl9RSFBfTkFNRVNQQUNFICJvcmcubGx2bS5jbGFuZyIgQ0FDSEUgU1RSSU5HCisgICAgICAiTmFtZXNwYWNlIHVuZGVyIHdoaWNoIHRoZSBpbnRlcm1lZGlhdGUgUXQgSGVscCBQcm9qZWN0IGZpbGUgbGl2ZXMiKQorICAgIHNldChDTEFOR19ET1hZR0VOX1FIUF9DVVNUX0ZJTFRFUl9OQU1FICJDbGFuZyAke0NMQU5HX1ZFUlNJT059IiBDQUNIRSBTVFJJTkcKKyAgICAgICJTZWUgaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzIikKKyAgICBzZXQoQ0xBTkdfRE9YWUdFTl9RSFBfQ1VTVF9GSUxURVJfQVRUUlMgIkNsYW5nLCR7Q0xBTkdfVkVSU0lPTn0iIENBQ0hFIFNUUklORworICAgICAgIlNlZSBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMiKQorICAgIHNldChjbGFuZ19kb3h5Z2VuX2dlbmVyYXRlX3FocCAiWUVTIikKKyAgICBzZXQoY2xhbmdfZG94eWdlbl9xY2hfZmlsZW5hbWUgIiR7Q0xBTkdfRE9YWUdFTl9RQ0hfRklMRU5BTUV9IikKKyAgICBzZXQoY2xhbmdfZG94eWdlbl9xaHBfbmFtZXNwYWNlICIke0NMQU5HX0RPWFlHRU5fUUhQX05BTUVTUEFDRX0iKQorICAgIHNldChjbGFuZ19kb3h5Z2VuX3FoZWxwZ2VuZXJhdG9yX3BhdGggIiR7TExWTV9ET1hZR0VOX1FIRUxQR0VORVJBVE9SX1BBVEh9IikKKyAgICBzZXQoY2xhbmdfZG94eWdlbl9xaHBfY3VzdF9maWx0ZXJfbmFtZSAiJHtDTEFOR19ET1hZR0VOX1FIUF9DVVNUX0ZJTFRFUl9OQU1FfSIpCisgICAgc2V0KGNsYW5nX2RveHlnZW5fcWhwX2N1c3RfZmlsdGVyX2F0dHJzICIke0NMQU5HX0RPWFlHRU5fUUhQX0NVU1RfRklMVEVSX0FUVFJTfSIpCisgIGVsc2UoKQorICAgIHNldChjbGFuZ19kb3h5Z2VuX2dlbmVyYXRlX3FocCAiTk8iKQorICAgIHNldChjbGFuZ19kb3h5Z2VuX3FjaF9maWxlbmFtZSAiIikKKyAgICBzZXQoY2xhbmdfZG94eWdlbl9xaHBfbmFtZXNwYWNlICIiKQorICAgIHNldChjbGFuZ19kb3h5Z2VuX3FoZWxwZ2VuZXJhdG9yX3BhdGggIiIpCisgICAgc2V0KGNsYW5nX2RveHlnZW5fcWhwX2N1c3RfZmlsdGVyX25hbWUgIiIpCisgICAgc2V0KGNsYW5nX2RveHlnZW5fcWhwX2N1c3RfZmlsdGVyX2F0dHJzICIiKQorICBlbmRpZigpCisKICAgY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2RveHlnZW4uY2ZnLmluCiAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2RveHlnZW4uY2ZnIEBPTkxZKQogCkBAIC0zMyw2ICs1OCwxMiBAQAogICBzZXQoZW5hYmxlX3NlcnZlcl9iYXNlZF9zZWFyY2gpCiAgIHNldChlbmFibGVfZXh0ZXJuYWxfc2VhcmNoKQogICBzZXQoZXh0cmFfc2VhcmNoX21hcHBpbmdzKQorICBzZXQoY2xhbmdfZG94eWdlbl9nZW5lcmF0ZV9xaHApCisgIHNldChjbGFuZ19kb3h5Z2VuX3FjaF9maWxlbmFtZSkKKyAgc2V0KGNsYW5nX2RveHlnZW5fcWhwX25hbWVzcGFjZSkKKyAgc2V0KGNsYW5nX2RveHlnZW5fcWhlbHBnZW5lcmF0b3JfcGF0aCkKKyAgc2V0KGNsYW5nX2RveHlnZW5fcWhwX2N1c3RfZmlsdGVyX25hbWUpCisgIHNldChjbGFuZ19kb3h5Z2VuX3FocF9jdXN0X2ZpbHRlcl9hdHRycykKIAogICBhZGRfY3VzdG9tX3RhcmdldChkb3h5Z2VuLWNsYW5nCiAgICAgQ09NTUFORCAke0RPWFlHRU5fRVhFQ1VUQUJMRX0gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2RveHlnZW4uY2ZnCmRpZmYgLS1naXQgYS9kb2NzL0NsYW5nRm9ybWF0LnJzdCBiL2RvY3MvQ2xhbmdGb3JtYXQucnN0CmluZGV4IGJjNmI4YTIuLjNmODQ5OWIgMTAwNjQ0Ci0tLSBhL2RvY3MvQ2xhbmdGb3JtYXQucnN0CisrKyBiL2RvY3MvQ2xhbmdGb3JtYXQucnN0CkBAIC0xNDYsNyArMTQ2LDcgQEAKIFZpc3VhbCBTdHVkaW8gSW50ZWdyYXRpb24KID09PT09PT09PT09PT09PT09PT09PT09PT0KIAotRG93bmxvYWQgdGhlIGxhdGVzdCBWaXN1YWwgU3R1ZGlvIHBsdWdpbiBmcm9tIHRoZSBgYWxwaGEgYnVpbGQgc2l0ZQorRG93bmxvYWQgdGhlIGxhdGVzdCBWaXN1YWwgU3R1ZGlvIGV4dGVuc2lvbiBmcm9tIHRoZSBgYWxwaGEgYnVpbGQgc2l0ZQogPGh0dHA6Ly9sbHZtLm9yZy9idWlsZHMvPmBfLiBUaGUgZGVmYXVsdCBrZXktYmluZGluZyBpcyBDdHJsLVIsQ3RybC1GLgogCiAKQEAgLTE1OCwyMSArMTU4LDI0IEBACiAKIC4uIGNvZGUtYmxvY2s6OiBjb25zb2xlCiAKLSAgdXNhZ2U6IGNsYW5nLWZvcm1hdC1kaWZmLnB5IFstaF0gWy1wIFBdIFstc3R5bGUgU1RZTEVdCisgIHVzYWdlOiBjbGFuZy1mb3JtYXQtZGlmZi5weSBbLWhdIFstaV0gWy1wIE5VTV0gWy1yZWdleCBQQVRURVJOXSBbLXN0eWxlIFNUWUxFXQogCi0gIFJlZm9ybWF0IGNoYW5nZWQgbGluZXMgaW4gZGlmZi4KKyAgUmVmb3JtYXQgY2hhbmdlZCBsaW5lcyBpbiBkaWZmLiBXaXRob3V0IC1pIG9wdGlvbiBqdXN0IG91dHB1dCB0aGUgZGlmZiB0aGF0CisgIHdvdWxkIGJlIGludHJvZHVjZWQuCiAKICAgb3B0aW9uYWwgYXJndW1lbnRzOgotICAgIC1oLCAtLWhlbHAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAgIC1wIFAgICAgICAgICAgc3RyaXAgdGhlIHNtYWxsZXN0IHByZWZpeCBjb250YWluaW5nIFAgc2xhc2hlcwotICAgIC1zdHlsZSBTVFlMRSAgZm9ybWF0dGluZyBzdHlsZSB0byBhcHBseSAoTExWTSwgR29vZ2xlLCBDaHJvbWl1bSwgTW96aWxsYSwKLSAgICAgICAgICAgICAgICAgIFdlYktpdCkKKyAgICAtaCwgLS1oZWxwICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgIC1pICAgICAgICAgICAgICBhcHBseSBlZGl0cyB0byBmaWxlcyBpbnN0ZWFkIG9mIGRpc3BsYXlpbmcgYSBkaWZmCisgICAgLXAgTlVNICAgICAgICAgIHN0cmlwIHRoZSBzbWFsbGVzdCBwcmVmaXggY29udGFpbmluZyBQIHNsYXNoZXMKKyAgICAtcmVnZXggUEFUVEVSTiAgY3VzdG9tIHBhdHRlcm4gc2VsZWN0aW5nIGZpbGUgcGF0aHMgdG8gcmVmb3JtYXQKKyAgICAtc3R5bGUgU1RZTEUgICAgZm9ybWF0dGluZyBzdHlsZSB0byBhcHBseSAoTExWTSwgR29vZ2xlLCBDaHJvbWl1bSwgTW96aWxsYSwKKyAgICAgICAgICAgICAgICAgICAgV2ViS2l0KQogCiBTbyB0byByZWZvcm1hdCBhbGwgdGhlIGxpbmVzIGluIHRoZSBsYXRlc3QgOnByb2dyYW06YGdpdGAgY29tbWl0LCBqdXN0IGRvOgogCiAuLiBjb2RlLWJsb2NrOjogY29uc29sZQogCi0gIGdpdCBkaWZmIC1VMCBIRUFEXiB8IGNsYW5nLWZvcm1hdC1kaWZmLnB5IC1wMQorICBnaXQgZGlmZiAtVTAgSEVBRF4gfCBjbGFuZy1mb3JtYXQtZGlmZi5weSAtaSAtcDEKIAogVGhlIDpvcHRpb246YC1VMGAgd2lsbCBjcmVhdGUgYSBkaWZmIHdpdGhvdXQgY29udGV4dCBsaW5lcyAodGhlIHNjcmlwdCB3b3VsZCBmb3JtYXQKIHRob3NlIGFzIHdlbGwpLgpkaWZmIC0tZ2l0IGEvZG9jcy9DbGFuZ0Zvcm1hdFN0eWxlT3B0aW9ucy5yc3QgYi9kb2NzL0NsYW5nRm9ybWF0U3R5bGVPcHRpb25zLnJzdAppbmRleCBkNzM4MDFjLi5kYjc3MzcyIDEwMDY0NAotLS0gYS9kb2NzL0NsYW5nRm9ybWF0U3R5bGVPcHRpb25zLnJzdAorKysgYi9kb2NzL0NsYW5nRm9ybWF0U3R5bGVPcHRpb25zLnJzdApAQCAtMTA2LDYgKzEwNiwxMCBAQAogICBBbGxvdyBwdXR0aW5nIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gb250bwogICB0aGUgbmV4dCBsaW5lIGV2ZW4gaWYgYGBCaW5QYWNrUGFyYW1ldGVyc2BgIGlzIGBgZmFsc2VgYC4KIAorKipBbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZSoqIChgYGJvb2xgYCkKKyAgSWYgYGB0cnVlYGAsIGBgaW50IGYoKSB7IHJldHVybiAwOyB9YGAgY2FuIGJlIHB1dCBvbiBhIHNpbmdsZQorICBsaW5lLgorCiAqKkFsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lKiogKGBgYm9vbGBgKQogICBJZiBgYHRydWVgYCwgYGBpZiAoYSkgcmV0dXJuO2BgIGNhbiBiZSBwdXQgb24gYSBzaW5nbGUKICAgbGluZS4KQEAgLTE0Miw4ICsxNDYsMTUgQEAKICAgICBMaWtlIGBgQXR0YWNoYGAsIGJ1dCBicmVhayBiZWZvcmUgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCiAgICogYGBCU19BbGxtYW5gYCAoaW4gY29uZmlndXJhdGlvbjogYGBBbGxtYW5gYCkKICAgICBBbHdheXMgYnJlYWsgYmVmb3JlIGJyYWNlcy4KKyAgKiBgYEJTX0dOVWBgIChpbiBjb25maWd1cmF0aW9uOiBgYEdOVWBgKQorICAgIEFsd2F5cyBicmVhayBiZWZvcmUgYnJhY2VzIGFuZCBhZGQgYW4gZXh0cmEgbGV2ZWwgb2YgaW5kZW50YXRpb24gdG8KKyAgICBicmFjZXMgb2YgY29udHJvbCBzdGF0ZW1lbnRzLCBub3QgdG8gdGhvc2Ugb2YgY2xhc3MsIGZ1bmN0aW9uCisgICAgb3Igb3RoZXIgZGVmaW5pdGlvbnMuCiAKIAorKipCcmVha0JlZm9yZVRlcm5hcnlPcGVyYXRvcnMqKiAoYGBib29sYGApCisgIElmIGBgdHJ1ZWBgLCB0ZXJuYXJ5IG9wZXJhdG9ycyB3aWxsIGJlIHBsYWNlZCBhZnRlciBsaW5lIGJyZWFrcy4KKwogKipCcmVha0NvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzQmVmb3JlQ29tbWEqKiAoYGBib29sYGApCiAgIEFsd2F5cyBicmVhayBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMgYmVmb3JlIGNvbW1hcyBhbmQgYWxpZ24KICAgdGhlIGNvbW1hcyB3aXRoIHRoZSBjb2xvbi4KQEAgLTE1Myw3ICsxNjQsMTEgQEAKIAogICBBIGNvbHVtbiBsaW1pdCBvZiBgYDBgYCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIGNvbHVtbiBsaW1pdC4gSW4gdGhpcyBjYXNlLAogICBjbGFuZy1mb3JtYXQgd2lsbCByZXNwZWN0IHRoZSBpbnB1dCdzIGxpbmUgYnJlYWtpbmcgZGVjaXNpb25zIHdpdGhpbgotICBzdGF0ZW1lbnRzLgorICBzdGF0ZW1lbnRzIHVubGVzcyB0aGV5IGNvbnRyYWRpY3Qgb3RoZXIgcnVsZXMuCisKKyoqQ29tbWVudFByYWdtYXMqKiAoYGBzdGQ6OnN0cmluZ2BgKQorICBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGRlc2NyaWJlcyBjb21tZW50cyB3aXRoIHNwZWNpYWwgbWVhbmluZywKKyAgd2hpY2ggc2hvdWxkIG5vdCBiZSBzcGxpdCBpbnRvIGxpbmVzIG9yIG90aGVyd2lzZSBjaGFuZ2VkLgogCiAqKkNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJBbGxPbk9uZUxpbmVPck9uZVBlckxpbmUqKiAoYGBib29sYGApCiAgIElmIHRoZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMgZG9uJ3QgZml0IG9uIGEgbGluZSwgcHV0IGVhY2gKQEAgLTE2Myw2ICsxNzgsOSBAQAogICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gdXNlIGZvciBpbmRlbnRhdGlvbiBvZiBjb25zdHJ1Y3RvcgogICBpbml0aWFsaXplciBsaXN0cy4KIAorKipDb250aW51YXRpb25JbmRlbnRXaWR0aCoqIChgYHVuc2lnbmVkYGApCisgIEluZGVudCB3aWR0aCBmb3IgbGluZSBjb250aW51YXRpb25zLgorCiAqKkNwcDExQnJhY2VkTGlzdFN0eWxlKiogKGBgYm9vbGBgKQogICBJZiBgYHRydWVgYCwgZm9ybWF0IGJyYWNlZCBsaXN0cyBhcyBiZXN0IHN1aXRlZCBmb3IgQysrMTEgYnJhY2VkCiAgIGxpc3RzLgpAQCAtMTc5LDcgKzE5Nyw4IEBACiAgIGEgemVyby1sZW5ndGggbmFtZSBpcyBhc3N1bWVkLgogCiAqKkRlcml2ZVBvaW50ZXJCaW5kaW5nKiogKGBgYm9vbGBgKQotICBJZiBgYHRydWVgYCwgYW5hbHl6ZSB0aGUgZm9ybWF0dGVkIGZpbGUgZm9yIHRoZSBtb3N0IGNvbW1vbiBiaW5kaW5nLgorICBJZiBgYHRydWVgYCwgYW5hbHl6ZSB0aGUgZm9ybWF0dGVkIGZpbGUgZm9yIHRoZSBtb3N0IGNvbW1vbiBiaW5kaW5nCisgIGFuZCB1c2UgYGBQb2ludGVyQmluZHNUb1R5cGVgYCBvbmx5IGFzIGZhbGxiYWNrLgogCiAqKkV4cGVyaW1lbnRhbEF1dG9EZXRlY3RCaW5QYWNraW5nKiogKGBgYm9vbGBgKQogICBJZiBgYHRydWVgYCwgY2xhbmctZm9ybWF0IGRldGVjdHMgd2hldGhlciBmdW5jdGlvbiBjYWxscyBhbmQKQEAgLTE5Myw2ICsyMTIsMTQgQEAKICAgTk9URTogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmxhZywgdGhhdCBtaWdodCBnbyBhd2F5IG9yIGJlIHJlbmFtZWQuIERvCiAgIG5vdCB1c2UgdGhpcyBpbiBjb25maWcgZmlsZXMsIGV0Yy4gVXNlIGF0IHlvdXIgb3duIHJpc2suCiAKKyoqRm9yRWFjaE1hY3JvcyoqIChgYHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPmBgKQorICBBIGxpc3Qgb2YgbWFjcm9zIHRoYXQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGZvcmVhY2ggbG9vcHMgaW5zdGVhZCBvZiBhcworICBmdW5jdGlvbiBjYWxscy4KKworICBGb3IgZXhhbXBsZSwgYGBGb3JFYWNoTWFjcm9zOiBbQk9PU1RfRk9SRUFDSCwgUV9GT1JFQUNIXWBgIHRlbGxzCisgIGNsYW5nLWZvcm1hdCB0byB0cmVhdCBgYEJPT1NUX0ZPUkVBQ0hgYCBhbmQgYGBRX0ZPUkVBQ0hgYCBhcyBsb29wIGNvbnRyb2wKKyAgc3RhdGVtZW50cy4KKwogKipJbmRlbnRDYXNlTGFiZWxzKiogKGBgYm9vbGBgKQogICBJbmRlbnQgY2FzZSBsYWJlbHMgb25lIGxldmVsIGZyb20gdGhlIHN3aXRjaCBzdGF0ZW1lbnQuCiAKQEAgLTIwNiw2ICsyMzMsMjIgQEAKICoqSW5kZW50V2lkdGgqKiAoYGB1bnNpZ25lZGBgKQogICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgdG8gdXNlIGZvciBpbmRlbnRhdGlvbi4KIAorKipMYW5ndWFnZSoqIChgYExhbmd1YWdlS2luZGBgKQorICBMYW5ndWFnZSwgdGhpcyBmb3JtYXQgc3R5bGUgaXMgdGFyZ2V0ZWQgYXQuCisKKyAgUG9zc2libGUgdmFsdWVzOgorCisgICogYGBMS19Ob25lYGAgKGluIGNvbmZpZ3VyYXRpb246IGBgTm9uZWBgKQorICAgIERvIG5vdCB1c2UuCisgICogYGBMS19DcHBgYCAoaW4gY29uZmlndXJhdGlvbjogYGBDcHBgYCkKKyAgICBTaG91bGQgYmUgdXNlZCBmb3IgQywgQysrLCBPYmplY3RpdmVDLCBPYmplY3RpdmVDKysuCisgICogYGBMS19KYXZhU2NyaXB0YGAgKGluIGNvbmZpZ3VyYXRpb246IGBgSmF2YVNjcmlwdGBgKQorICAgIFNob3VsZCBiZSB1c2VkIGZvciBKYXZhU2NyaXB0LgorICAqIGBgTEtfUHJvdG9gYCAoaW4gY29uZmlndXJhdGlvbjogYGBQcm90b2BgKQorICAgIFNob3VsZCBiZSB1c2VkIGZvciBQcm90b2NvbCBCdWZmZXJzCisgICAgKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvKS4KKworCiAqKk1heEVtcHR5TGluZXNUb0tlZXAqKiAoYGB1bnNpZ25lZGBgKQogICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29uc2VjdXRpdmUgZW1wdHkgbGluZXMgdG8ga2VlcC4KIApAQCAtMjIyLDEwICsyNjUsMTcgQEAKICAgICBJbmRlbnQgaW4gYWxsIG5hbWVzcGFjZXMuCiAKIAorKipPYmpDU3BhY2VBZnRlclByb3BlcnR5KiogKGBgYm9vbGBgKQorICBBZGQgYSBzcGFjZSBhZnRlciBgYEBwcm9wZXJ0eWBgIGluIE9iamVjdGl2ZS1DLCBpLmUuIHVzZQorICBgYEBwcm9wZXJ0eSAocmVhZG9ubHkpYGAgaW5zdGVhZCBvZiBgYEBwcm9wZXJ0eShyZWFkb25seSlgYC4KKwogKipPYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3QqKiAoYGBib29sYGApCiAgIEFkZCBhIHNwYWNlIGluIGZyb250IG9mIGFuIE9iamVjdGl2ZS1DIHByb3RvY29sIGxpc3QsIGkuZS4gdXNlCiAgIGBgRm9vIDxQcm90b2NvbD5gYCBpbnN0ZWFkIG9mIGBgRm9vPFByb3RvY29sPmBgLgogCisqKlBlbmFsdHlCcmVha0JlZm9yZUZpcnN0Q2FsbFBhcmFtZXRlcioqIChgYHVuc2lnbmVkYGApCisgIFRoZSBwZW5hbHR5IGZvciBicmVha2luZyBhIGZ1bmN0aW9uIGNhbGwgYWZ0ZXIgImNhbGwoIi4KKwogKipQZW5hbHR5QnJlYWtDb21tZW50KiogKGBgdW5zaWduZWRgYCkKICAgVGhlIHBlbmFsdHkgZm9yIGVhY2ggbGluZSBicmVhayBpbnRyb2R1Y2VkIGluc2lkZSBhIGNvbW1lbnQuCiAKQEAgLTI0NSwyNSArMjk1LDQ1IEBACiAqKlBvaW50ZXJCaW5kc1RvVHlwZSoqIChgYGJvb2xgYCkKICAgU2V0IHdoZXRoZXIgJiBhbmQgKiBiaW5kIHRvIHRoZSB0eXBlIGFzIG9wcG9zZWQgdG8gdGhlIHZhcmlhYmxlLgogCi0qKlNwYWNlQWZ0ZXJDb250cm9sU3RhdGVtZW50S2V5d29yZCoqIChgYGJvb2xgYCkKLSAgSWYgYGB0cnVlYGAsIHNwYWNlcyB3aWxsIGJlIGluc2VydGVkIGJldHdlZW4gJ2ZvcicvJ2lmJy8nd2hpbGUnLy4uLgotICBhbmQgJygnLgotCiAqKlNwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9ycyoqIChgYGJvb2xgYCkKICAgSWYgYGBmYWxzZWBgLCBzcGFjZXMgd2lsbCBiZSByZW1vdmVkIGJlZm9yZSBhc3NpZ25tZW50IG9wZXJhdG9ycy4KIAorKipTcGFjZUJlZm9yZVBhcmVucyoqIChgYFNwYWNlQmVmb3JlUGFyZW5zT3B0aW9uc2BgKQorICBEZWZpbmVzIGluIHdoaWNoIGNhc2VzIHRvIHB1dCBhIHNwYWNlIGJlZm9yZSBvcGVuaW5nIHBhcmVudGhlc2VzLgorCisgIFBvc3NpYmxlIHZhbHVlczoKKworICAqIGBgU0JQT19OZXZlcmBgIChpbiBjb25maWd1cmF0aW9uOiBgYE5ldmVyYGApCisgICAgTmV2ZXIgcHV0IGEgc3BhY2UgYmVmb3JlIG9wZW5pbmcgcGFyZW50aGVzZXMuCisgICogYGBTQlBPX0NvbnRyb2xTdGF0ZW1lbnRzYGAgKGluIGNvbmZpZ3VyYXRpb246IGBgQ29udHJvbFN0YXRlbWVudHNgYCkKKyAgICBQdXQgYSBzcGFjZSBiZWZvcmUgb3BlbmluZyBwYXJlbnRoZXNlcyBvbmx5IGFmdGVyIGNvbnRyb2wgc3RhdGVtZW50CisgICAga2V5d29yZHMgKGBgZm9yL2lmL3doaWxlLi4uYGApLgorICAqIGBgU0JQT19BbHdheXNgYCAoaW4gY29uZmlndXJhdGlvbjogYGBBbHdheXNgYCkKKyAgICBBbHdheXMgcHV0IGEgc3BhY2UgYmVmb3JlIG9wZW5pbmcgcGFyZW50aGVzZXMsIGV4Y2VwdCB3aGVuIGl0J3MKKyAgICBwcm9oaWJpdGVkIGJ5IHRoZSBzeW50YXggcnVsZXMgKGluIGZ1bmN0aW9uLWxpa2UgbWFjcm8gZGVmaW5pdGlvbnMpIG9yCisgICAgd2hlbiBkZXRlcm1pbmVkIGJ5IG90aGVyIHN0eWxlIHJ1bGVzIChhZnRlciB1bmFyeSBvcGVyYXRvcnMsIG9wZW5pbmcKKyAgICBwYXJlbnRoZXNlcywgZXRjLikKKworCiAqKlNwYWNlSW5FbXB0eVBhcmVudGhlc2VzKiogKGBgYm9vbGBgKQotICBJZiBgYGZhbHNlYGAsIHNwYWNlcyBtYXkgYmUgaW5zZXJ0ZWQgaW50byAnKCknLgorICBJZiBgYHRydWVgYCwgc3BhY2VzIG1heSBiZSBpbnNlcnRlZCBpbnRvICcoKScuCiAKICoqU3BhY2VzQmVmb3JlVHJhaWxpbmdDb21tZW50cyoqIChgYHVuc2lnbmVkYGApCiAgIFRoZSBudW1iZXIgb2Ygc3BhY2VzIHRvIGJlZm9yZSB0cmFpbGluZyBsaW5lIGNvbW1lbnRzLgogCisqKlNwYWNlc0luQW5nbGVzKiogKGBgYm9vbGBgKQorICBJZiBgYHRydWVgYCwgc3BhY2VzIHdpbGwgYmUgaW5zZXJ0ZWQgYWZ0ZXIgJzwnIGFuZCBiZWZvcmUgJz4nIGluCisgIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3RzCisKICoqU3BhY2VzSW5DU3R5bGVDYXN0UGFyZW50aGVzZXMqKiAoYGBib29sYGApCi0gIElmIGBgZmFsc2VgYCwgc3BhY2VzIG1heSBiZSBpbnNlcnRlZCBpbnRvIEMgc3R5bGUgY2FzdHMuCisgIElmIGBgdHJ1ZWBgLCBzcGFjZXMgbWF5IGJlIGluc2VydGVkIGludG8gQyBzdHlsZSBjYXN0cy4KKworKipTcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzKiogKGBgYm9vbGBgKQorICBJZiBgYHRydWVgYCwgc3BhY2VzIGFyZSBpbnNlcnRlZCBpbnNpZGUgY29udGFpbmVyIGxpdGVyYWxzIChlLmcuCisgIE9iakMgYW5kIEphdmFzY3JpcHQgYXJyYXkgYW5kIGRpY3QgbGl0ZXJhbHMpLgogCiAqKlNwYWNlc0luUGFyZW50aGVzZXMqKiAoYGBib29sYGApCi0gIElmIGBgdHJ1ZWBgLCBzcGFjZXMgd2lsbCBiZSBpbnNlcnRlZCBhZnRlciBldmVyeSAnKCcgYW5kIGJlZm9yZQotICBldmVyeSAnKScuCisgIElmIGBgdHJ1ZWBgLCBzcGFjZXMgd2lsbCBiZSBpbnNlcnRlZCBhZnRlciAnKCcgYW5kIGJlZm9yZSAnKScuCiAKICoqU3RhbmRhcmQqKiAoYGBMYW5ndWFnZVN0YW5kYXJkYGApCiAgIEZvcm1hdCBjb21wYXRpYmxlIHdpdGggdGhpcyBzdGFuZGFyZCwgZS5nLiB1c2UKZGlmZiAtLWdpdCBhL2RvY3MvQ2xhbmdQbHVnaW5zLnJzdCBiL2RvY3MvQ2xhbmdQbHVnaW5zLnJzdAppbmRleCA3YzVjNjVjLi45YTViYzE0IDEwMDY0NAotLS0gYS9kb2NzL0NsYW5nUGx1Z2lucy5yc3QKKysrIGIvZG9jcy9DbGFuZ1BsdWdpbnMucnN0CkBAIC00Nyw3MCArNDcsMTAgQEAKID09PT09PT09PT09PT09PT09PT09PT09CiAKIExldCdzIGxvb2sgYXQgYW4gZXhhbXBsZSBwbHVnaW4gdGhhdCBwcmludHMgdG9wLWxldmVsIGZ1bmN0aW9uIG5hbWVzLiAgVGhpcwotZXhhbXBsZSBpcyBhbHNvIGNoZWNrZWQgaW50byB0aGUgY2xhbmcgcmVwb3NpdG9yeTsgcGxlYXNlIGFsc28gdGFrZSBhIGxvb2sgYXQKLXRoZSBsYXRlc3QgYGNoZWNrZWQgaW4gdmVyc2lvbiBvZiBQcmludEZ1bmN0aW9uTmFtZXMuY3BwCitleGFtcGxlIGlzIGNoZWNrZWQgaW50byB0aGUgY2xhbmcgcmVwb3NpdG9yeTsgcGxlYXNlIHRha2UgYSBsb29rIGF0Cit0aGUgYGxhdGVzdCB2ZXJzaW9uIG9mIFByaW50RnVuY3Rpb25OYW1lcy5jcHAKIDxodHRwOi8vbGx2bS5vcmcvdmlld3ZjL2xsdm0tcHJvamVjdC9jZmUvdHJ1bmsvZXhhbXBsZXMvUHJpbnRGdW5jdGlvbk5hbWVzL1ByaW50RnVuY3Rpb25OYW1lcy5jcHA/dmlldz1tYXJrdXA+YF8uCiAKLS4uIGNvZGUtYmxvY2s6OiBjKysKLQotICAgICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZFBsdWdpblJlZ2lzdHJ5LmgiCi0gICAgI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb25zdW1lci5oIgotICAgICNpbmNsdWRlICJjbGFuZy9BU1QvQVNULmgiCi0gICAgI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0NvbXBpbGVySW5zdGFuY2UuaCIKLSAgICAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCi0gICAgdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwotCi0gICAgbmFtZXNwYWNlIHsKLQotICAgIGNsYXNzIFByaW50RnVuY3Rpb25zQ29uc3VtZXIgOiBwdWJsaWMgQVNUQ29uc3VtZXIgewotICAgIHB1YmxpYzoKLSAgICAgIHZpcnR1YWwgYm9vbCBIYW5kbGVUb3BMZXZlbERlY2woRGVjbEdyb3VwUmVmIERHKSB7Ci0gICAgICAgIGZvciAoRGVjbEdyb3VwUmVmOjppdGVyYXRvciBpID0gREcuYmVnaW4oKSwgZSA9IERHLmVuZCgpOyBpICE9IGU7ICsraSkgewotICAgICAgICAgIGNvbnN0IERlY2wgKkQgPSAqaTsKLSAgICAgICAgICBpZiAoY29uc3QgTmFtZWREZWNsICpORCA9IGR5bl9jYXN0PE5hbWVkRGVjbD4oRCkpCi0gICAgICAgICAgICBsbHZtOjplcnJzKCkgPDwgInRvcC1sZXZlbC1kZWNsOiBcIiIgPDwgTkQtPmdldE5hbWVBc1N0cmluZygpIDw8ICJcIlxuIjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH07Ci0KLSAgICBjbGFzcyBQcmludEZ1bmN0aW9uTmFtZXNBY3Rpb24gOiBwdWJsaWMgUGx1Z2luQVNUQWN0aW9uIHsKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksIGxsdm06OlN0cmluZ1JlZikgewotICAgICAgICByZXR1cm4gbmV3IFByaW50RnVuY3Rpb25zQ29uc3VtZXIoKTsKLSAgICAgIH0KLQotICAgICAgYm9vbCBQYXJzZUFyZ3MoY29uc3QgQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGFyZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgewotICAgICAgICAgIGxsdm06OmVycnMoKSA8PCAiUHJpbnRGdW5jdGlvbk5hbWVzIGFyZyA9ICIgPDwgYXJnc1tpXSA8PCAiXG4iOwotCi0gICAgICAgICAgLy8gRXhhbXBsZSBlcnJvciBoYW5kbGluZy4KLSAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLWFuLWVycm9yIikgewotICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkQgPSBDSS5nZXREaWFnbm9zdGljcygpOwotICAgICAgICAgICAgdW5zaWduZWQgRGlhZ0lEID0gRC5nZXRDdXN0b21EaWFnSUQoCi0gICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpFcnJvciwgImludmFsaWQgYXJndW1lbnQgJyIgKyBhcmdzW2ldICsgIiciKTsKLSAgICAgICAgICAgIEQuUmVwb3J0KERpYWdJRCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChhcmdzLnNpemUoKSAmJiBhcmdzWzBdID09ICJoZWxwIikKLSAgICAgICAgICBQcmludEhlbHAobGx2bTo6ZXJycygpKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHZvaWQgUHJpbnRIZWxwKGxsdm06OnJhd19vc3RyZWFtJiByb3MpIHsKLSAgICAgICAgcm9zIDw8ICJIZWxwIGZvciBQcmludEZ1bmN0aW9uTmFtZXMgcGx1Z2luIGdvZXMgaGVyZVxuIjsKLSAgICAgIH0KLQotICAgIH07Ci0KLSAgICB9Ci0KLSAgICBzdGF0aWMgRnJvbnRlbmRQbHVnaW5SZWdpc3RyeTo6QWRkPFByaW50RnVuY3Rpb25OYW1lc0FjdGlvbj4KLSAgICBYKCJwcmludC1mbnMiLCAicHJpbnQgZnVuY3Rpb24gbmFtZXMiKTsKLQogUnVubmluZyB0aGUgcGx1Z2luCiA9PT09PT09PT09PT09PT09PT0KIApkaWZmIC0tZ2l0IGEvZG9jcy9DbGFuZ1Rvb2xzLnJzdCBiL2RvY3MvQ2xhbmdUb29scy5yc3QKaW5kZXggZjhhN2MzNi4uODk1NzU0MSAxMDA2NDQKLS0tIGEvZG9jcy9DbGFuZ1Rvb2xzLnJzdAorKysgYi9kb2NzL0NsYW5nVG9vbHMucnN0CkBAIC05Myw5ICs5Myw5IEBACiByZWZhY3RvcmluZyB0b29scywgZS5nLiB0byBkbyBhIHJlZm9ybWF0dGluZyBvZiBhbGwgdGhlIGxpbmVzIGNoYW5nZWQgZHVyaW5nIGEKIHJlbmFtaW5nLgogCi1gYGNwcDExLW1pZ3JhdGVgYAotfn5+fn5+fn5+fn5+fn5+fn4KLWBgY3BwMTEtbWlncmF0ZWBgIG1pZ3JhdGVzIEMrKyBjb2RlIHRvIHVzZSBDKysxMSBmZWF0dXJlcyB3aGVyZSBhcHByb3ByaWF0ZS4KK2BgY2xhbmctbW9kZXJuaXplYGAKK35+fn5+fn5+fn5+fn5+fn5+fn4KK2BgY2xhbmctbW9kZXJuaXplYGAgbWlncmF0ZXMgQysrIGNvZGUgdG8gdXNlIEMrKzExIGZlYXR1cmVzIHdoZXJlIGFwcHJvcHJpYXRlLgogQ3VycmVudGx5IGl0IGNhbjoKIAogKiBjb252ZXJ0IGxvb3BzIHRvIHJhbmdlLWJhc2VkIGZvciBsb29wczsKZGlmZiAtLWdpdCBhL2RvY3MvRXh0ZXJuYWxDbGFuZ0V4YW1wbGVzLnJzdCBiL2RvY3MvRXh0ZXJuYWxDbGFuZ0V4YW1wbGVzLnJzdAppbmRleCBjN2ZkNGM1Li43MWQ1MGMyIDEwMDY0NAotLS0gYS9kb2NzL0V4dGVybmFsQ2xhbmdFeGFtcGxlcy5yc3QKKysrIGIvZG9jcy9FeHRlcm5hbENsYW5nRXhhbXBsZXMucnN0CkBAIC03OCwzICs3OCwxMCBAQAogICAgICJjbGRvYyBpcyBhIENsYW5nIGJhc2VkIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yIGZvciBDIGFuZCBDKysuCiAgICAgY2xkb2MgdHJpZXMgdG8gc29sdmUgdGhlIGlzc3VlIG9mIHdyaXRpbmcgQy9DKysgc29mdHdhcmUgZG9jdW1lbnRhdGlvbgogICAgIHdpdGggYSBtb2Rlcm4sIG5vbi1pbnRydXNpdmUgYW5kIHJvYnVzdCBhcHByb2FjaC4iCisKK2A8aHR0cHM6Ly9naXRodWIuY29tL0FsZXhEZW5pc292L1RveUNsYW5nUGx1Z2luPmBfCisgICAgIlRoZSBzaW1wbGVzdCBDbGFuZyBwbHVnaW4gaW1wbGVtZW50aW5nIGEgc2VtYW50aWMgY2hlY2sgZm9yIE9iamVjdGl2ZS1DLgorICAgIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIHRoZSBgYERpYWdub3N0aWNzRW5naW5lYGAgKGVtaXQgd2FybmluZ3MsCisgICAgZXJyb3JzLCBmaXhpdCBoaW50cykuICBTZWUgYWxzbyBgPGh0dHA6Ly9sLnJ3LnJ3L2NsYW5nX3BsdWdpbj5gXyBmb3IKKyAgICBzdGVwLWJ5LXN0ZXAgaW5zdHJ1Y3Rpb25zLiIKKwpkaWZmIC0tZ2l0IGEvZG9jcy9JbnRlcm5hbHNNYW51YWwucnN0IGIvZG9jcy9JbnRlcm5hbHNNYW51YWwucnN0CmluZGV4IDZmNTU3MDIuLjU4MzBhN2UgMTAwNjQ0Ci0tLSBhL2RvY3MvSW50ZXJuYWxzTWFudWFsLnJzdAorKysgYi9kb2NzL0ludGVybmFsc01hbnVhbC5yc3QKQEAgLTg3LDcgKzg3LDggQEAKIFNpbmNlIHRoZSBlbnVtIGlzIHJlZmVyZW5jZWQgaW4gdGhlIEMrKyBjb2RlIHRoYXQgcHJvZHVjZXMgdGhlIGRpYWdub3N0aWMsIGl0CiBpcyBzb21ld2hhdCB1c2VmdWwgZm9yIGl0IHRvIGJlIHJlYXNvbmFibHkgc2hvcnQuCiAKLVRoZSBzZXZlcml0eSBvZiB0aGUgZGlhZ25vc3RpYyBjb21lcyBmcm9tIHRoZSBzZXQge2BgTk9URWBgLCBgYFdBUk5JTkdgYCwKK1RoZSBzZXZlcml0eSBvZiB0aGUgZGlhZ25vc3RpYyBjb21lcyBmcm9tIHRoZSBzZXQge2BgTk9URWBgLCBgYFJFTUFSS2BgLAorYGBXQVJOSU5HYGAsCiBgYEVYVEVOU0lPTmBgLCBgYEVYVFdBUk5gYCwgYGBFUlJPUmBgfS4gIFRoZSBgYEVSUk9SYGAgc2V2ZXJpdHkgaXMgdXNlZCBmb3IKIGRpYWdub3N0aWNzIGluZGljYXRpbmcgdGhlIHByb2dyYW0gaXMgbmV2ZXIgYWNjZXB0YWJsZSB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy4KIFdoZW4gYW4gZXJyb3IgaXMgZW1pdHRlZCwgdGhlIEFTVCBmb3IgdGhlIGlucHV0IGNvZGUgbWF5IG5vdCBiZSBmdWxseSBidWlsdC4KQEAgLTk3LDExICs5OCwxMyBAQAogY29kZSBpcyBub24tcG9ydGFibGUuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBmb3JtZXIgYXJlIGlnbm9yZWQgYnkKIGRlZmF1bHQsIGFuZCB0aGUgbGF0ZXIgd2FybiBieSBkZWZhdWx0LiAgVGhlIGBgV0FSTklOR2BgIHNldmVyaXR5IGlzIHVzZWQgZm9yCiBjb25zdHJ1Y3RzIHRoYXQgYXJlIHZhbGlkIGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc291cmNlIGxhbmd1YWdlIGJ1dCB0aGF0Ci1hcmUgZHViaW91cyBpbiBzb21lIHdheS4gIFRoZSBgYE5PVEVgYCBsZXZlbCBpcyB1c2VkIHRvIHN0YXBsZSBtb3JlIGluZm9ybWF0aW9uCi1vbnRvIHByZXZpb3VzIGRpYWdub3N0aWNzLgorYXJlIGR1YmlvdXMgaW4gc29tZSB3YXkuICBUaGUgYGBSRU1BUktgYCBzZXZlcml0eSBwcm92aWRlcyBnZW5lcmljIGluZm9ybWF0aW9uCithYm91dCB0aGUgY29tcGlsYXRpb24gdGhhdCBpcyBub3QgbmVjZXNzYXJpbHkgcmVsYXRlZCB0byBhbnkgZHViaW91cyBjb2RlLiAgVGhlCitgYE5PVEVgYCBsZXZlbCBpcyB1c2VkIHRvIHN0YXBsZSBtb3JlIGluZm9ybWF0aW9uIG9udG8gcHJldmlvdXMgZGlhZ25vc3RpY3MuCiAKIFRoZXNlICpzZXZlcml0aWVzKiBhcmUgbWFwcGVkIGludG8gYSBzbWFsbGVyIHNldCAodGhlIGBgRGlhZ25vc3RpYzo6TGV2ZWxgYAotZW51bSwge2BgSWdub3JlZGBgLCBgYE5vdGVgYCwgYGBXYXJuaW5nYGAsIGBgRXJyb3JgYCwgYGBGYXRhbGBgfSkgb2Ygb3V0cHV0CitlbnVtLCB7YGBJZ25vcmVkYGAsIGBgTm90ZWBgLCBgYFJlbWFya2BgLCBgYFdhcm5pbmdgYCwgYGBFcnJvcmBgLCBgYEZhdGFsYGB9KSBvZgorb3V0cHV0CiAqbGV2ZWxzKiBieSB0aGUgZGlhZ25vc3RpY3Mgc3Vic3lzdGVtIGJhc2VkIG9uIHZhcmlvdXMgY29uZmlndXJhdGlvbiBvcHRpb25zLgogQ2xhbmcgaW50ZXJuYWxseSBzdXBwb3J0cyBhIGZ1bGx5IGZpbmUgZ3JhaW5lZCBtYXBwaW5nIG1lY2hhbmlzbSB0aGF0IGFsbG93cwogeW91IHRvIG1hcCBhbG1vc3QgYW55IGRpYWdub3N0aWMgdG8gdGhlIG91dHB1dCBsZXZlbCB0aGF0IHlvdSB3YW50LiAgVGhlIG9ubHkKQEAgLTE1ODgsNDcgKzE1OTEsMTcxIEBACiBIb3cgdG8gYWRkIGFuIGF0dHJpYnV0ZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVG8gYWRkIGFuIGF0dHJpYnV0ZSwgeW91J2xsIGhhdmUgdG8gYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMsIGFkZCBpdCB0bwotdGhlIHBhcnNpbmcgcGhhc2UsIGFuZCBsb29rIGZvciBpdCBpbiB0aGUgQVNUIHNjYW4uCi1gcjEyNDIxNyA8aHR0cDovL2xsdm0ub3JnL3ZpZXd2Yy9sbHZtLXByb2plY3Q/dmlldz1yZXYmcmV2aXNpb249MTI0MjE3PmBfCi1oYXMgYSBnb29kIGV4YW1wbGUgb2YgYWRkaW5nIGEgd2FybmluZyBhdHRyaWJ1dGUuCitBdHRyaWJ1dGUgQmFzaWNzCiteXl5eXl5eXl5eXl5eXl5eCiAKLShCZXdhcmUgdGhhdCB0aGlzIGhhc24ndCBiZWVuIHJldmlld2VkL2ZpeGVkIGJ5IHRoZSBwZW9wbGUgd2hvIGRlc2lnbmVkIHRoZQotYXR0cmlidXRlcyBzeXN0ZW0geWV0LikKK0F0dHJpYnV0ZXMgaW4gY2xhbmcgY29tZSBpbiB0d28gZm9ybXM6IHBhcnNlZCBmb3JtLCBhbmQgc2VtYW50aWMgZm9ybS4gQm90aCAKK2Zvcm1zIGFyZSByZXByZXNlbnRlZCB2aWEgYSB0YWJsZWdlbiBkZWZpbml0aW9uIG9mIHRoZSBhdHRyaWJ1dGUsIHNwZWNpZmllZCBpbgorQXR0ci50ZC4KIAogCiBgYGluY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ci50ZGBgCiBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCiAKLUZpcnN0LCBhZGQgeW91ciBhdHRyaWJ1dGUgdG8gdGhlIGBpbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQgZmlsZQotPGh0dHA6Ly9sbHZtLm9yZy92aWV3dmMvbGx2bS1wcm9qZWN0L2NmZS90cnVuay9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQ/dmlldz1tYXJrdXA+YF8uCitGaXJzdCwgYWRkIHlvdXIgYXR0cmlidXRlIHRvIHRoZSBgaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyLnRkIAorPGh0dHA6Ly9sbHZtLm9yZy92aWV3dmMvbGx2bS1wcm9qZWN0L2NmZS90cnVuay9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQ/dmlldz1tYXJrdXA+YF8gCitmaWxlLgogCiBFYWNoIGF0dHJpYnV0ZSBnZXRzIGEgYGBkZWZgYCBpbmhlcml0aW5nIGZyb20gYGBBdHRyYGAgb3Igb25lIG9mIGl0cwogc3ViY2xhc3Nlcy4gIGBgSW5oZXJpdGFibGVBdHRyYGAgbWVhbnMgdGhhdCB0aGUgYXR0cmlidXRlIGFsc28gYXBwbGllcyB0bwotc3Vic2VxdWVudCBkZWNsYXJhdGlvbnMgb2YgdGhlIHNhbWUgbmFtZS4KK3N1YnNlcXVlbnQgZGVjbGFyYXRpb25zIG9mIHRoZSBzYW1lIG5hbWUuICBgYEluaGVyaXRhYmxlUGFyYW1BdHRyYGAgaXMgc2ltaWxhciAKK3RvIGBgSW5oZXJpdGFibGVBdHRyYGAsIGV4Y2VwdCB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgd3JpdHRlbiBvbiBhIHBhcmFtZXRlciAKK2luc3RlYWQgb2YgYSBkZWNsYXJhdGlvbiwgdHlwZSBvciBzdGF0ZW1lbnQuICBBdHRyaWJ1dGVzIGluaGVyaXRpbmcgZnJvbSAKK2BgVHlwZUF0dHJgYCBhcmUgcHVyZSB0eXBlIGF0dHJpYnV0ZXMgd2hpY2ggZ2VuZXJhbGx5IGFyZSBub3QgZ2l2ZW4gYSAKK3JlcHJlc2VudGF0aW9uIGluIHRoZSBBU1QuICBBdHRyaWJ1dGVzIGluaGVyaXRpbmcgZnJvbSBgYFRhcmdldFNwZWNpZmljQXR0cmBgIAorYXJlIGF0dHJpYnV0ZXMgc3BlY2lmaWMgdG8gb25lIG9yIG1vcmUgdGFyZ2V0IGFyY2hpdGVjdHVyZXMuICBBbiBhdHRyaWJ1dGUgdGhhdCAKK2luaGVyaXRzIGZyb20gYGBJZ25vcmVkQXR0cmBgIGlzIHBhcnNlZCwgYnV0IHdpbGwgZ2VuZXJhdGUgYW4gaWdub3JlZCBhdHRyaWJ1dGUgCitkaWFnbm9zdGljIHdoZW4gdXNlZC4gIFRoZSBhdHRyaWJ1dGUgdHlwZSBtYXkgYmUgdXNlZnVsIHdoZW4gYW4gYXR0cmlidXRlIGlzIAorc3VwcG9ydGVkIGJ5IGFub3RoZXIgdmVuZG9yLCBidXQgbm90IHN1cHBvcnRlZCBieSBjbGFuZy4KIAogYGBTcGVsbGluZ3NgYCBsaXN0cyB0aGUgc3RyaW5ncyB0aGF0IGNhbiBhcHBlYXIgaW4gYGBfX2F0dHJpYnV0ZV9fKChoZXJlKSlgYCBvcgotYGBbW2hlcmVdXWBgLiAgQWxsIHN1Y2ggc3RyaW5ncyB3aWxsIGJlIHN5bm9ueW1vdXMuICBJZiB5b3Ugd2FudCB0byBhbGxvdyB0aGUKLWBgW1tdXWBgIEMrKzExIHN5bnRheCwgeW91IGhhdmUgdG8gZGVmaW5lIGEgbGlzdCBvZiBgYE5hbWVzcGFjZXNgYCwgd2hpY2ggd2lsbAotbGV0IHVzZXJzIHdyaXRlIGBgW1tuYW1lc3BhY2U6OnNwZWxsaW5nXV1gYC4gIFVzaW5nIHRoZSBlbXB0eSBzdHJpbmcgZm9yIGEKLW5hbWVzcGFjZSB3aWxsIGFsbG93IHVzZXJzIHRvIHdyaXRlIGp1c3QgdGhlIHNwZWxsaW5nIHdpdGggbm8gImBgOjpgYCIuCi1BdHRyaWJ1dGVzIHdoaWNoIGcrKy00LjggYWNjZXB0cyBzaG91bGQgYWxzbyBoYXZlIGEKLWBgQ1hYMTE8ImdudSIsICJzcGVsbGluZyI+YGAgc3BlbGxpbmcuCitgYFtbaGVyZV1dYGAuICBBbGwgc3VjaCBzdHJpbmdzIHdpbGwgYmUgc3lub255bW91cy4gIFBvc3NpYmxlIGBgU3BlbGxpbmdzYGAgCithcmU6IGBgR05VYGAgKGZvciB1c2Ugd2l0aCBHTlUtc3R5bGUgX19hdHRyaWJ1dGVfXyBzcGVsbGluZ3MpLCBgYERlY2xzcGVjYGAgCisoZm9yIHVzZSB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvLXN0eWxlIF9fZGVjbHNwZWMgc3BlbGxpbmdzKSwgYGBDWFgxMWAgCisoZm9yIHVzZSB3aXRoIEMrKzExLXN0eWxlIFtbZm9vXV0gYW5kIFtbZm9vOjpiYXJdXSBzcGVsbGluZ3MpLCBhbmQgYGBLZXl3b3JkYGAgCisoZm9yIHVzZSB3aXRoIGF0dHJpYnV0ZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXMga2V5d29yZHMsIGxpa2UgQysrMTEncyAKK2Bgb3ZlcnJpZGVgYCBvciBgYGZpbmFsYGApLiBJZiB5b3Ugd2FudCB0byBhbGxvdyB0aGUgYGBbW11dYGAgQysrMTEgc3ludGF4LCB5b3UgCitoYXZlIHRvIGRlZmluZSBhIGxpc3Qgb2YgYGBOYW1lc3BhY2VzYGAsIHdoaWNoIHdpbGwgbGV0IHVzZXJzIHdyaXRlIAorYGBbW25hbWVzcGFjZTo6c3BlbGxpbmddXWBgLiAgVXNpbmcgdGhlIGVtcHR5IHN0cmluZyBmb3IgYSBuYW1lc3BhY2Ugd2lsbCBhbGxvdyAKK3VzZXJzIHRvIHdyaXRlIGp1c3QgdGhlIHNwZWxsaW5nIHdpdGggbm8gImBgOjpgYCIuICBBdHRyaWJ1dGVzIHdoaWNoIGcrKy00LjggCitvciBsYXRlciBhY2NlcHRzIHNob3VsZCBhbHNvIGhhdmUgYSBgYENYWDExPCJnbnUiLCAic3BlbGxpbmciPmBgIHNwZWxsaW5nLgogCiBgYFN1YmplY3RzYGAgcmVzdHJpY3RzIHdoYXQga2luZHMgb2YgQVNUIG5vZGUgdG8gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgY2FuCi1hcHBlcnRhaW4gKHJvdWdobHksIGF0dGFjaCkuCithcHBlcnRhaW4gKHJvdWdobHksIGF0dGFjaCkuICBUaGUgc3ViamVjdHMgYXJlIHNwZWNpZmllZCB2aWEgYSBgYFN1YmplY3RMaXN0YGAsIAord2hpY2ggc3BlY2lmeSB0aGUgbGlzdCBvZiBzdWJqZWN0cy4gQWRkaXRpb25hbGx5LCBzdWJqZWN0LXJlbGF0ZWQgZGlhZ25vc3RpY3MgCitjYW4gYmUgc3BlY2lmaWVkIHRvIGJlIHdhcm5pbmdzIG9yIGVycm9ycywgd2l0aCB0aGUgZGVmYXVsdCBiZWluZyBhIHdhcm5pbmcuICAKK1RoZSBkaWFnbm9zdGljcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYXJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBiYXNlZCBvbiAKK3RoZSBzdWJqZWN0cyBpbiB0aGUgbGlzdCwgYnV0IGEgY3VzdG9tIGRpYWdub3N0aWMgcGFyYW1ldGVyIGNhbiBhbHNvIGJlIAorc3BlY2lmaWVkIGluIHRoZSBgYFN1YmplY3RMaXN0YGAuICBUaGUgZGlhZ25vc3RpY3MgZ2VuZXJhdGVkIGZvciBzdWJqZWN0IGxpc3QgCit2aW9sYXRpb25zIGFyZSBlaXRoZXIgYGBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGVgYCBvcgorYGBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZWBgLCBhbmQgdGhlIHBhcmFtZXRlciBlbnVtZXJhdGlvbiBpcyAKK2ZvdW5kIGluIGBpbmNsdWRlL2NsYW5nL1NlbWEvQXR0cmlidXRlTGlzdC5oIAorPGh0dHA6Ly9sbHZtLm9yZy92aWV3dmMvbGx2bS1wcm9qZWN0L2NmZS90cnVuay9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0cmlidXRlTGlzdC5oP3ZpZXc9bWFya3VwPmBfIAorSWYgeW91IGFkZCBuZXcgRGVjbCBub2RlcyB0byB0aGUgYGBTdWJqZWN0TGlzdGBgLCB5b3UgbWF5IG5lZWQgdG8gdXBkYXRlIHRoZSAKK2xvZ2ljIHVzZWQgdG8gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIGRpYWdub3N0aWMgcGFyYW1ldGVyIGluIGB1dGlscy9UYWJsZUdlbi9DbGFuZ0F0dHJFbWl0dGVyLmNwcCAKKzxodHRwOi8vbGx2bS5vcmcvdmlld3ZjL2xsdm0tcHJvamVjdC9jZmUvdHJ1bmsvdXRpbHMvVGFibGVHZW4vQ2xhbmdBdHRyRW1pdHRlci5jcHA/dmlldz1tYXJrdXA+YF8uCisKK0RpYWdub3N0aWMgY2hlY2tpbmcgZm9yIGF0dHJpYnV0ZSBzdWJqZWN0IGxpc3RzIGlzIGF1dG9tYXRlZCBleGNlcHQgd2hlbiAKK2BgSGFzQ3VzdG9tUGFyc2luZ2BgIGlzIHNldCB0byBgYDFgYC4KKworQnkgZGVmYXVsdCwgYWxsIHN1YmplY3RzIGluIHRoZSBTdWJqZWN0TGlzdCBtdXN0IGVpdGhlciBiZSBhIERlY2wgbm9kZSBkZWZpbmVkIAoraW4gYGBEZWNsTm9kZXMudGRgYCwgb3IgYSBzdGF0ZW1lbnQgbm9kZSBkZWZpbmVkIGluIGBgU3RtdE5vZGVzLnRkYGAuICBIb3dldmVyLCAKK21vcmUgY29tcGxleCBzdWJqZWN0cyBjYW4gYmUgY3JlYXRlZCBieSBjcmVhdGluZyBhIGBgU3Vic2V0U3ViamVjdGBgIG9iamVjdC4gIAorRWFjaCBzdWNoIG9iamVjdCBoYXMgYSBiYXNlIHN1YmplY3Qgd2hpY2ggaXQgYXBwZXJ0YWlucyB0byAod2hpY2ggbXVzdCBiZSBhIAorRGVjbCBvciBTdG10IG5vZGUsIGFuZCBub3QgYSBTdWJzZXRTdWJqZWN0IG5vZGUpLCBhbmQgc29tZSBjdXN0b20gY29kZSB3aGljaCBpcyAKK2NhbGxlZCB3aGVuIGRldGVybWluaW5nIHdoZXRoZXIgYW4gYXR0cmlidXRlIGFwcGVydGFpbnMgdG8gdGhlIHN1YmplY3QuICBGb3IgCitpbnN0YW5jZSwgYSBgYE5vbkJpdEZpZWxkYGAgU3Vic2V0U3ViamVjdCBhcHBlcnRhaW5zIHRvIGEgYGBGaWVsZERlY2xgYCwgYW5kIAordGVzdHMgd2hldGhlciB0aGUgZ2l2ZW4gRmllbGREZWNsIGlzIGEgYml0IGZpZWxkLiAgV2hlbiBhIFN1YnNldFN1YmplY3QgaXMgCitzcGVjaWZpZWQgaW4gYSBTdWJqZWN0TGlzdCwgYSBjdXN0b20gZGlhZ25vc3RpYyBwYXJhbWV0ZXIgbXVzdCBhbHNvIGJlIHByb3ZpZGVkLgogCiBgYEFyZ3NgYCBuYW1lcyB0aGUgYXJndW1lbnRzIHRoZSBhdHRyaWJ1dGUgdGFrZXMsIGluIG9yZGVyLiAgSWYgYGBBcmdzYGAgaXMKIGBgW1N0cmluZ0FyZ3VtZW50PCJBcmcxIj4sIEludEFyZ3VtZW50PCJBcmcyIj5dYGAgdGhlbgotYGBfX2F0dHJpYnV0ZV9fKChteWF0dHJpYnV0ZSgiSGVsbG8iLCAzKSkpYGAgd2lsbCBiZSBhIHZhbGlkIHVzZS4KK2BgX19hdHRyaWJ1dGVfXygobXlhdHRyaWJ1dGUoIkhlbGxvIiwgMykpKWBgIHdpbGwgYmUgYSB2YWxpZCB1c2UuICBBdHRyaWJ1dGUgCithcmd1bWVudHMgc3BlY2lmeSBib3RoIHRoZSBwYXJzZWQgZm9ybSBhbmQgdGhlIHNlbWFudGljIGZvcm0gb2YgdGhlIGF0dHJpYnV0ZS4gIAorVGhlIHByZXZpb3VzIGV4YW1wbGUgc2hvd3MgYW4gYXR0cmlidXRlIHdoaWNoIHJlcXVpcmVzIHR3byBhdHRyaWJ1dGVzIHdoaWxlIAorcGFyc2luZywgYW5kIHRoZSBBdHRyIHN1YmNsYXNzJyBjb25zdHJ1Y3RvciBmb3IgdGhlIGF0dHJpYnV0ZSB3aWxsIHJlcXVpcmUgYSAKK3N0cmluZyBhbmQgaW50ZWdlciBhcmd1bWVudC4KKworRGlhZ25vc3RpYyBjaGVja2luZyBmb3IgYXJndW1lbnQgY291bnRzIGlzIGF1dG9tYXRlZCBleGNlcHQgd2hlbiAKK2BgSGFzQ3VzdG9tUGFyc2luZ2BgIGlzIHNldCB0byBgYDFgYCwgb3Igd2hlbiB0aGUgYXR0cmlidXRlIHVzZXMgYW4gb3B0aW9uYWwgb3IgCit2YXJpYWRpYyBhcmd1bWVudC4gIERpYWdub3N0aWMgY2hlY2tpbmcgZm9yIGFyZ3VtZW50IHNlbWFudGljcyBpcyBub3QgYXV0b21hdGVkLgorCitJZiB0aGUgcGFyc2VkIGZvcm0gb2YgdGhlIGF0dHJpYnV0ZSBpcyBtb3JlIGNvbXBsZXgsIG9yIGRpZmZlcnMgZnJvbSB0aGUgCitzZW1hbnRpYyBmb3JtLCB0aGUgYGBIYXNDdXN0b21QYXJzaW5nYGAgYml0IGNhbiBiZSBzZXQgdG8gYGAxYGAgZm9yIHRoZSBjbGFzcywgCithbmQgdGhlIHBhcnNpbmcgY29kZSBpbiBgUGFyc2VyOjpQYXJzZUdOVUF0dHJpYnV0ZUFyZ3MgCis8aHR0cDovL2xsdm0ub3JnL3ZpZXd2Yy9sbHZtLXByb2plY3QvY2ZlL3RydW5rL2xpYi9QYXJzZS9QYXJzZURlY2wuY3BwP3ZpZXc9bWFya3VwPmBfIAorY2FuIGJlIHVwZGF0ZWQgZm9yIHRoZSBzcGVjaWFsIGNhc2UuICBOb3RlIHRoYXQgdGhpcyBvbmx5IGFwcGxpZXMgdG8gYXJndW1lbnRzIAord2l0aCBhIEdOVSBzcGVsbGluZyAtLSBhdHRyaWJ1dGVzIHdpdGggYSBfX2RlY2xzcGVjIHNwZWxsaW5nIGN1cnJlbnRseSBpZ25vcmUgCit0aGlzIGZsYWcgYW5kIGFyZSBoYW5kbGVkIGJ5IGBgUGFyc2VyOjpQYXJzZU1pY3Jvc29mdERlY2xTcGVjYGAuCisKK0N1c3RvbSBhY2Nlc3NvcnMgY2FuIGJlIGdlbmVyYXRlZCBmb3IgYW4gYXR0cmlidXRlIGJhc2VkIG9uIHRoZSBzcGVsbGluZyBsaXN0IAorZm9yIHRoYXQgYXR0cmlidXRlLiAgRm9yIGluc3RhbmNlLCBpZiBhbiBhdHRyaWJ1dGUgaGFzIHR3byBkaWZmZXJlbnQgc3BlbGxpbmdzOiAKKydGb28nIGFuZCAnQmFyJywgYWNjZXNzb3JzIGNhbiBiZSBjcmVhdGVkOiAKK2BgW0FjY2Vzc29yPCJpc0ZvbyIsIFtHTlU8IkZvbyI+XT4sIEFjY2Vzc29yPCJpc0JhciIsIFtHTlU8IkJhciI+XT5dYGAKK1RoZXNlIGFjY2Vzc29ycyB3aWxsIGJlIGdlbmVyYXRlZCBvbiB0aGUgc2VtYW50aWMgZm9ybSBvZiB0aGUgYXR0cmlidXRlLCAKK2FjY2VwdGluZyBubyBhcmd1bWVudHMgYW5kIHJldHVybmluZyBhIEJvb2xlYW4uCisKK0F0dHJpYnV0ZXMgd2hpY2ggZG8gbm90IHJlcXVpcmUgYW4gQVNUIG5vZGUgc2hvdWxkIHNldCB0aGUgYGBBU1ROb2RlYGAgZmllbGQgdG8gCitgYDBgYCB0byBhdm9pZCBwb2xsdXRpbmcgdGhlIEFTVC4gIE5vdGUgdGhhdCBhbnl0aGluZyBpbmhlcml0aW5nIGZyb20gCitgYFR5cGVBdHRyYGAgb3IgYGBJZ25vcmVkQXR0cmBgIGF1dG9tYXRpY2FsbHkgZG8gbm90IGdlbmVyYXRlIGFuIEFTVCBub2RlLiAgQWxsIAorb3RoZXIgYXR0cmlidXRlcyBnZW5lcmF0ZSBhbiBBU1Qgbm9kZSBieSBkZWZhdWx0LiAgVGhlIEFTVCBub2RlIGlzIHRoZSBzZW1hbnRpYyAKK3JlcHJlc2VudGF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUuCisKK0F0dHJpYnV0ZXMgd2hpY2ggZG8gbm90IHJlcXVpcmUgY3VzdG9tIHNlbWFudGljIGhhbmRsaW5nIHNob3VsZCBzZXQgdGhlIAorYGBTZW1hSGFuZGxlcmBgIGZpZWxkIHRvIGBgMGBgLiAgTm90ZSB0aGF0IGFueXRoaW5nIGluaGVyaXRpbmcgZnJvbSAKK2BgSWdub3JlZEF0dHJgYCBhdXRvbWF0aWNhbGx5IGRvIG5vdCBnZXQgYSBzZW1hbnRpYyBoYW5kbGVyLiAgQWxsIG90aGVyIAorYXR0cmlidXRlcyBhcmUgYXNzdW1lZCB0byB1c2UgYSBzZW1hbnRpYyBoYW5kbGVyIGJ5IGRlZmF1bHQuICBBdHRyaWJ1dGVzIAord2l0aG91dCBhIHNlbWFudGljIGhhbmRsZXIgYXJlIG5vdCBnaXZlbiBhIHBhcnNlZCBhdHRyaWJ1dGUgS2luZCBlbnVtZXJhdGlvbi4KKworVGhlIGBgTGFuZ09wdHNgYCBmaWVsZCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBsYW5ndWFnZSBvcHRpb25zIAorcmVxdWlyZWQgYnkgdGhlIGF0dHJpYnV0ZS4gIEZvciBpbnN0YW5jZSwgYWxsIG9mIHRoZSBDVURBLXNwZWNpZmljIGF0dHJpYnV0ZXMgCitzcGVjaWZ5IGBgW0NVREFdYGAgZm9yIHRoZSBgYExhbmdPcHRzYGAgZmllbGQsIGFuZCB3aGVuIHRoZSBDVURBIGxhbmd1YWdlIAorb3B0aW9uIGlzIG5vdCBlbmFibGVkLCBhbiAiYXR0cmlidXRlIGlnbm9yZWQiIHdhcm5pbmcgZGlhZ25vc3RpYyBpcyBlbWl0dGVkLiAgCitTaW5jZSBsYW5ndWFnZSBvcHRpb25zIGFyZSBub3QgdGFibGUgZ2VuZXJhdGVkIG5vZGVzLCBuZXcgbGFuZ3VhZ2Ugb3B0aW9ucyBtdXN0IAorYmUgY3JlYXRlZCBtYW51YWxseSBhbmQgc2hvdWxkIHNwZWNpZnkgdGhlIHNwZWxsaW5nIHVzZWQgYnkgYGBMYW5nT3B0aW9uc2BgIGNsYXNzLgorCitUYXJnZXQtc3BlY2lmaWMgYXR0cmlidXRlIHNvbWV0aW1lcyBzaGFyZSBhIHNwZWxsaW5nIHdpdGggb3RoZXIgYXR0cmlidXRlcyBpbiAKK2RpZmZlcmVudCB0YXJnZXRzLiAgRm9yIGluc3RhbmNlLCB0aGUgQVJNIGFuZCBNU1A0MzAgdGFyZ2V0cyBib3RoIGhhdmUgYW4gCithdHRyaWJ1dGUgc3BlbGxlZCBgYEdOVTwiaW50ZXJydXB0Ij5gYCwgYnV0IHdpdGggZGlmZmVyZW50IHBhcnNpbmcgYW5kIHNlbWFudGljIAorcmVxdWlyZW1lbnRzLiAgVG8gc3VwcG9ydCB0aGlzIGZlYXR1cmUsIGFuIGF0dHJpYnV0ZSBpbmhlcml0aW5nIGZyb20gCitgYFRhcmdldFNwZWNpZmljQXR0cmlidXRlYGAgbWFrZSBzcGVjaWZ5IGEgYGBQYXJzZUtpbmRgYCBmaWVsZC4gIFRoaXMgZmllbGQgCitzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgYmV0d2VlbiBhbGwgYXJndW1lbnRzIHNoYXJpbmcgYSBzcGVsbGluZywgYW5kIAorY29ycmVzcG9uZHMgdG8gdGhlIHBhcnNlZCBhdHRyaWJ1dGUncyBLaW5kIGVudW1lcmF0aW9uLiAgVGhpcyBhbGxvd3MgYXR0cmlidXRlcyAKK3RvIHNoYXJlIGEgcGFyc2VkIGF0dHJpYnV0ZSBraW5kLCBidXQgaGF2ZSBkaXN0aW5jdCBzZW1hbnRpYyBhdHRyaWJ1dGUgY2xhc3Nlcy4gIAorRm9yIGluc3RhbmNlLCBgYEF0dHJpYnV0ZUxpc3Q6OkFUX0ludGVycnVwdGBgIGlzIHRoZSBzaGFyZWQgcGFyc2VkIGF0dHJpYnV0ZSAKK2tpbmQsIGJ1dCBBUk1JbnRlcnJ1cHRBdHRyIGFuZCBNU1A0MzBJbnRlcnJ1cHRBdHRyIGFyZSB0aGUgc2VtYW50aWMgYXR0cmlidXRlcyAKK2dlbmVyYXRlZC4KKworQnkgZGVmYXVsdCwgd2hlbiBkZWNsYXJhdGlvbnMgYXJlIG1lcmdpbmcgYXR0cmlidXRlcywgYW4gYXR0cmlidXRlIHdpbGwgbm90IGJlIAorZHVwbGljYXRlZC4gSG93ZXZlciwgaWYgYW4gYXR0cmlidXRlIGNhbiBiZSBkdXBsaWNhdGVkIGR1cmluZyB0aGlzIG1lcmdpbmcgCitzdGFnZSwgc2V0IGBgRHVwbGljYXRlc0FsbG93ZWRXaGlsZU1lcmdpbmdgYCB0byBgYDFgYCwgYW5kIHRoZSBhdHRyaWJ1dGUgd2lsbCAKK2JlIG1lcmdlZC4KKworQnkgZGVmYXVsdCwgYXR0cmlidXRlIGFyZ3VtZW50cyBhcmUgcGFyc2VkIGluIGFuIGV2YWx1YXRlZCBjb250ZXh0LiBJZiB0aGUgCithcmd1bWVudHMgZm9yIGFuIGF0dHJpYnV0ZSBzaG91bGQgYmUgcGFyc2VkIGluIGFuIHVuZXZhbHVhdGVkIGNvbnRleHQgKGFraW4gdG8gCit0aGUgd2F5IHRoZSBhcmd1bWVudCB0byBhIGBgc2l6ZW9mYGAgZXhwcmVzc2lvbiBpcyBwYXJzZWQpLCB5b3UgY2FuIHNldCAKK2BgUGFyc2VBcmd1bWVudHNBc1VuZXZhbHVhdGVkYGAgdG8gYGAxYGAuCisKK0lmIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBpcyBkZXNpcmVkIGZvciB0aGUgc2VtYW50aWMgZm9ybSBvZiB0aGUgYXR0cmlidXRlLCAKK3RoZSBgYEFkZGl0aW9uYWxNZW1iZXJzYGAgZmllbGQgc3BlY2lmaWVzIGNvZGUgdG8gYmUgY29waWVkIHZlcmJhdGltIGludG8gdGhlIAorc2VtYW50aWMgYXR0cmlidXRlIGNsYXNzIG9iamVjdC4KKworQWxsIGF0dHJpYnV0ZXMgbXVzdCBoYXZlIG9uZSBvciBtb3JlIGZvcm0gb2YgZG9jdW1lbnRhdGlvbiwgd2hpY2ggaXMgcHJvdmlkZWQgCitpbiB0aGUgYGBEb2N1bWVudGF0aW9uYGAgbGlzdC4gR2VuZXJhbGx5LCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYW4gYXR0cmlidXRlIAoraXMgYSBzdGFuZC1hbG9uZSBkZWZpbml0aW9uIGluIGBpbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJEb2NzLnRkIAorPGh0dHA6Ly9sbHZtLm9yZy92aWV3dmMvbGx2bS1wcm9qZWN0L2NmZS90cnVuay9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dGREb2NzLnRkP3ZpZXc9bWFya3VwPmBfCit0aGF0IGlzIG5hbWVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgYmVpbmcgZG9jdW1lbnRlZC4gRWFjaCBkb2N1bWVudGF0aW9uIGVsZW1lbnQgCitpcyBnaXZlbiBhIGBgQ2F0ZWdvcnlgYCAodmFyaWFibGUsIGZ1bmN0aW9uLCBvciB0eXBlKSBhbmQgYGBDb250ZW50YGAuIEEgc2luZ2xlIAorYXR0cmlidXRlIG1heSBjb250YWluIG11bHRpcGxlIGRvY3VtZW50YXRpb24gZWxlbWVudHMgZm9yIGRpc3RpbmN0IGNhdGVnb3JpZXMuIAorRm9yIGluc3RhbmNlLCBhbiBhdHRyaWJ1dGUgd2hpY2ggY2FuIGFwcGVydGFpbiB0byBib3RoIGZ1bmN0aW9uIGFuZCB0eXBlcyAoc3VjaCAKK2FzIGEgY2FsbGluZyBjb252ZW50aW9uIGF0dHJpYnV0ZSksIHNob3VsZCBjb250YWluIHR3byBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLiAKK1RoZSBgYENvbnRlbnRgYCBmb3IgYW4gYXR0cmlidXRlIHVzZXMgcmVTdHJ1Y3R1cmVkVGV4dCAoUlNUKSBzeW50YXguCisKK0lmIGFuIGF0dHJpYnV0ZSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyLCBidXQgaXMgbm90IHdyaXR0ZW4gYnkgdXNlcnMgCisoc3VjaCBhcyBhdHRyaWJ1dGVzIHdpdGggYW4gZW1wdHkgc3BlbGxpbmcgbGlzdCksIGl0IGNhbiB1c2UgdGhlIAorYGBVbmRvY3VtZW50ZWRgYCBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCiAKIEJvaWxlcnBsYXRlCiBeXl5eXl5eXl5eXgogCi1Xcml0ZSBhIG5ldyBgYEhhbmRsZVlvdXJBdHRyKClgYCBmdW5jdGlvbiBpbiBgbGliL1NlbWEvU2VtYURlY2xBdHRyLmNwcAotPGh0dHA6Ly9sbHZtLm9yZy92aWV3dmMvbGx2bS1wcm9qZWN0L2NmZS90cnVuay9saWIvU2VtYS9TZW1hRGVjbEF0dHIuY3BwP3ZpZXc9bWFya3VwPmBfLAotYW5kIGFkZCBhIGNhc2UgdG8gdGhlIHN3aXRjaCBpbiBgYFByb2Nlc3NOb25Jbmhlcml0YWJsZURlY2xBdHRyKClgYCBvcgotYGBQcm9jZXNzSW5oZXJpdGFibGVEZWNsQXR0cigpYGAgZm9yd2FyZGluZyB0byBpdC4KK0FsbCBzZW1hbnRpYyBwcm9jZXNzaW5nIG9mIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZXMgaGFwcGVucyBpbiBgbGliL1NlbWEvU2VtYURlY2xBdHRyLmNwcAorPGh0dHA6Ly9sbHZtLm9yZy92aWV3dmMvbGx2bS1wcm9qZWN0L2NmZS90cnVuay9saWIvU2VtYS9TZW1hRGVjbEF0dHIuY3BwP3ZpZXc9bWFya3VwPmBfLCAKK2FuZCBnZW5lcmFsbHkgc3RhcnRzIGluIHRoZSBgYFByb2Nlc3NEZWNsQXR0cmlidXRlYGAgZnVuY3Rpb24uICBJZiB5b3VyIAorYXR0cmlidXRlIGlzIGEgInNpbXBsZSIgYXR0cmlidXRlIC0tIG1lYW5pbmcgdGhhdCBpdCByZXF1aXJlcyBubyBjdXN0b20gCitzZW1hbnRpYyBwcm9jZXNzaW5nIGFzaWRlIGZyb20gd2hhdCBpcyBhdXRvbWF0aWNhbGx5ICBwcm92aWRlZCBmb3IgeW91LCB5b3UgY2FuIAorYWRkIGEgY2FsbCB0byBgYGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxZb3VyQXR0cj4oUywgRCwgQXR0cik7YGAgdG8gdGhlIHN3aXRjaCAKK3N0YXRlbWVudC4gT3RoZXJ3aXNlLCB3cml0ZSBhIG5ldyBgYGhhbmRsZVlvdXJBdHRyKClgYCBmdW5jdGlvbiwgYW5kIGFkZCB0aGF0IAordG8gdGhlIHN3aXRjaCBzdGF0ZW1lbnQuCiAKIElmIHlvdXIgYXR0cmlidXRlIGNhdXNlcyBleHRyYSB3YXJuaW5ncyB0byBmaXJlLCBkZWZpbmUgYSBgYERpYWdHcm91cGBgIGluCiBgaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljR3JvdXBzLnRkCkBAIC0xNjM4LDYgKzE3NjUsMTAgQEAKIGBgSW5Hcm91cDxEaWFnR3JvdXA8InlvdXItYXR0cmlidXRlIj4+YGAgZGlyZWN0bHkgaW4gYERpYWdub3N0aWNTZW1hS2luZHMudGQKIDxodHRwOi8vbGx2bS5vcmcvdmlld3ZjL2xsdm0tcHJvamVjdC9jZmUvdHJ1bmsvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljU2VtYUtpbmRzLnRkP3ZpZXc9bWFya3VwPmBfCiAKK0FsbCBzZW1hbnRpYyBkaWFnbm9zdGljcyBnZW5lcmF0ZWQgZm9yIHlvdXIgYXR0cmlidXRlLCBpbmNsdWRpbmcgYXV0b21hdGljYWxseS0KK2dlbmVyYXRlZCBvbmVzIChzdWNoIGFzIHN1YmplY3RzIGFuZCBhcmd1bWVudCBjb3VudHMpLCBzaG91bGQgaGF2ZSBhIAorY29ycmVzcG9uZGluZyB0ZXN0IGNhc2UuCisKIFRoZSBtZWF0IG9mIHlvdXIgYXR0cmlidXRlCiBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCmRpZmYgLS1naXQgYS9kb2NzL0xhbmd1YWdlRXh0ZW5zaW9ucy5yc3QgYi9kb2NzL0xhbmd1YWdlRXh0ZW5zaW9ucy5yc3QKaW5kZXggN2E0YjMxZS4uMzkyZTY3OSAxMDA2NDQKLS0tIGEvZG9jcy9MYW5ndWFnZUV4dGVuc2lvbnMucnN0CisrKyBiL2RvY3MvTGFuZ3VhZ2VFeHRlbnNpb25zLnJzdApAQCAtMTIsNyArMTIsNyBAQAogICAgT2JqZWN0aXZlQ0xpdGVyYWxzCiAgICBCbG9ja0xhbmd1YWdlU3BlYwogICAgQmxvY2stQUJJLUFwcGxlCi0gICBBdXRvbWF0aWNSZWZlcmVuY2VDb3VudGluZyAgIAorICAgQXV0b21hdGljUmVmZXJlbmNlQ291bnRpbmcKIAogSW50cm9kdWN0aW9uCiA9PT09PT09PT09PT0KQEAgLTExMyw4ICsxMTMsOCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGlzIGZ1bmN0aW9uLWxpa2UgbWFjcm8gdGFrZXMgYSBzaW5nbGUgaWRlbnRpZmllciBhcmd1bWVudCB0aGF0IGlzIHRoZSBuYW1lIG9mCi1hbiBhdHRyaWJ1dGUuICBJdCBldmFsdWF0ZXMgdG8gMSBpZiB0aGUgYXR0cmlidXRlIGlzIHN1cHBvcnRlZCBvciAwIGlmIG5vdC4gIEl0Ci1jYW4gYmUgdXNlZCBsaWtlIHRoaXM6CithbiBhdHRyaWJ1dGUuICBJdCBldmFsdWF0ZXMgdG8gMSBpZiB0aGUgYXR0cmlidXRlIGlzIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudAorY29tcGlsYXRpb24gdGFyZ2V0LCBvciAwIGlmIG5vdC4gIEl0IGNhbiBiZSB1c2VkIGxpa2UgdGhpczoKIAogLi4gY29kZS1ibG9jazo6IGMrKwogCkBAIC0xMzQsNiArMTM0LDcgQEAKIChkb3VibGUgdW5kZXJzY29yZSkgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIGZyb20gYSBtYWNybyB3aXRoIHRoZSBzYW1lIG5hbWUuICBGb3IKIGluc3RhbmNlLCBgYF9fYWx3YXlzX2lubGluZV9fYGAgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBgYGFsd2F5c19pbmxpbmVgYC4KIAorCiBJbmNsdWRlIEZpbGUgQ2hlY2tpbmcgTWFjcm9zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTQyNSwxMDMgKzQyNiw2IEBACiBmcmFtZXdvcmsgc2VhcmNoIHBhdGguICBGb3IgY29uc2lzdGVuY3ksIHdlIHJlY29tbWVuZCB0aGF0IHN1Y2ggZmlsZXMgbmV2ZXIgYmUKIGluY2x1ZGVkIGluIGluc3RhbGxlZCB2ZXJzaW9ucyBvZiB0aGUgZnJhbWV3b3JrLgogCi1BdmFpbGFiaWxpdHkgYXR0cmlidXRlCi09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNsYW5nIGludHJvZHVjZXMgdGhlIGBgYXZhaWxhYmlsaXR5YGAgYXR0cmlidXRlLCB3aGljaCBjYW4gYmUgcGxhY2VkIG9uCi1kZWNsYXJhdGlvbnMgdG8gZGVzY3JpYmUgdGhlIGxpZmVjeWNsZSBvZiB0aGF0IGRlY2xhcmF0aW9uIHJlbGF0aXZlIHRvCi1vcGVyYXRpbmcgc3lzdGVtIHZlcnNpb25zLiAgQ29uc2lkZXIgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGZvciBhCi1oeXBvdGhldGljYWwgZnVuY3Rpb24gYGBmYGA6Ci0KLS4uIGNvZGUtYmxvY2s6OiBjKysKLQotICB2b2lkIGYodm9pZCkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjQsZGVwcmVjYXRlZD0xMC42LG9ic29sZXRlZD0xMC43KSkpOwotCi1UaGUgYXZhaWxhYmlsaXR5IGF0dHJpYnV0ZSBzdGF0ZXMgdGhhdCBgYGZgYCB3YXMgaW50cm9kdWNlZCBpbiBNYWMgT1MgWCAxMC40LAotZGVwcmVjYXRlZCBpbiBNYWMgT1MgWCAxMC42LCBhbmQgb2Jzb2xldGVkIGluIE1hYyBPUyBYIDEwLjcuICBUaGlzIGluZm9ybWF0aW9uCi1pcyB1c2VkIGJ5IENsYW5nIHRvIGRldGVybWluZSB3aGVuIGl0IGlzIHNhZmUgdG8gdXNlIGBgZmBgOiBmb3IgZXhhbXBsZSwgaWYKLUNsYW5nIGlzIGluc3RydWN0ZWQgdG8gY29tcGlsZSBjb2RlIGZvciBNYWMgT1MgWCAxMC41LCBhIGNhbGwgdG8gYGBmKClgYAotc3VjY2VlZHMuICBJZiBDbGFuZyBpcyBpbnN0cnVjdGVkIHRvIGNvbXBpbGUgY29kZSBmb3IgTWFjIE9TIFggMTAuNiwgdGhlIGNhbGwKLXN1Y2NlZWRzIGJ1dCBDbGFuZyBlbWl0cyBhIHdhcm5pbmcgc3BlY2lmeWluZyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLgotRmluYWxseSwgaWYgQ2xhbmcgaXMgaW5zdHJ1Y3RlZCB0byBjb21waWxlIGNvZGUgZm9yIE1hYyBPUyBYIDEwLjcsIHRoZSBjYWxsCi1mYWlscyBiZWNhdXNlIGBgZigpYGAgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KLQotVGhlIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBzdGFydGluZyB3aXRoIHRoZQotcGxhdGZvcm0gbmFtZSBhbmQgdGhlbiBpbmNsdWRpbmcgY2xhdXNlcyBzcGVjaWZ5aW5nIGltcG9ydGFudCBtaWxlc3RvbmVzIGluIHRoZQotZGVjbGFyYXRpb24ncyBsaWZldGltZSAoaW4gYW55IG9yZGVyKSBhbG9uZyB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICBUaG9zZQotY2xhdXNlcyBjYW4gYmU6Ci0KLWludHJvZHVjZWQ9XCAqdmVyc2lvbioKLSAgVGhlIGZpcnN0IHZlcnNpb24gaW4gd2hpY2ggdGhpcyBkZWNsYXJhdGlvbiB3YXMgaW50cm9kdWNlZC4KLQotZGVwcmVjYXRlZD1cICp2ZXJzaW9uKgotICBUaGUgZmlyc3QgdmVyc2lvbiBpbiB3aGljaCB0aGlzIGRlY2xhcmF0aW9uIHdhcyBkZXByZWNhdGVkLCBtZWFuaW5nIHRoYXQKLSAgdXNlcnMgc2hvdWxkIG1pZ3JhdGUgYXdheSBmcm9tIHRoaXMgQVBJLgotCi1vYnNvbGV0ZWQ9XCAqdmVyc2lvbioKLSAgVGhlIGZpcnN0IHZlcnNpb24gaW4gd2hpY2ggdGhpcyBkZWNsYXJhdGlvbiB3YXMgb2Jzb2xldGVkLCBtZWFuaW5nIHRoYXQgaXQKLSAgd2FzIHJlbW92ZWQgY29tcGxldGVseSBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLgotCi11bmF2YWlsYWJsZQotICBUaGlzIGRlY2xhcmF0aW9uIGlzIG5ldmVyIGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLgotCi1tZXNzYWdlPVwgKnN0cmluZy1saXRlcmFsKgotICBBZGRpdGlvbmFsIG1lc3NhZ2UgdGV4dCB0aGF0IENsYW5nIHdpbGwgcHJvdmlkZSB3aGVuIGVtaXR0aW5nIGEgd2FybmluZyBvcgotICBlcnJvciBhYm91dCB1c2Ugb2YgYSBkZXByZWNhdGVkIG9yIG9ic29sZXRlZCBkZWNsYXJhdGlvbi4gIFVzZWZ1bCB0byBkaXJlY3QKLSAgdXNlcnMgdG8gcmVwbGFjZW1lbnQgQVBJcy4KLQotTXVsdGlwbGUgYXZhaWxhYmlsaXR5IGF0dHJpYnV0ZXMgY2FuIGJlIHBsYWNlZCBvbiBhIGRlY2xhcmF0aW9uLCB3aGljaCBtYXkKLWNvcnJlc3BvbmQgdG8gZGlmZmVyZW50IHBsYXRmb3Jtcy4gIE9ubHkgdGhlIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUgd2l0aCB0aGUKLXBsYXRmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhcmdldCBwbGF0Zm9ybSB3aWxsIGJlIHVzZWQ7IGFueSBvdGhlcnMgd2lsbCBiZQotaWdub3JlZC4gIElmIG5vIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUgc3BlY2lmaWVzIGF2YWlsYWJpbGl0eSBmb3IgdGhlIGN1cnJlbnQKLXRhcmdldCBwbGF0Zm9ybSwgdGhlIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGVzIGFyZSBpZ25vcmVkLiAgU3VwcG9ydGVkIHBsYXRmb3JtcwotYXJlOgotCi1gYGlvc2BgCi0gIEFwcGxlJ3MgaU9TIG9wZXJhdGluZyBzeXN0ZW0uICBUaGUgbWluaW11bSBkZXBsb3ltZW50IHRhcmdldCBpcyBzcGVjaWZpZWQgYnkKLSAgdGhlIGBgLW1pb3MtdmVyc2lvbi1taW49KnZlcnNpb24qYGAgb3IgYGAtbWlwaG9uZW9zLXZlcnNpb24tbWluPSp2ZXJzaW9uKmBgCi0gIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCi0KLWBgbWFjb3N4YGAKLSAgQXBwbGUncyBNYWMgT1MgWCBvcGVyYXRpbmcgc3lzdGVtLiAgVGhlIG1pbmltdW0gZGVwbG95bWVudCB0YXJnZXQgaXMKLSAgc3BlY2lmaWVkIGJ5IHRoZSBgYC1tbWFjb3N4LXZlcnNpb24tbWluPSp2ZXJzaW9uKmBgIGNvbW1hbmQtbGluZSBhcmd1bWVudC4KLQotQSBkZWNsYXJhdGlvbiBjYW4gYmUgdXNlZCBldmVuIHdoZW4gZGVwbG95aW5nIGJhY2sgdG8gYSBwbGF0Zm9ybSB2ZXJzaW9uIHByaW9yCi10byB3aGVuIHRoZSBkZWNsYXJhdGlvbiB3YXMgaW50cm9kdWNlZC4gIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgZGVjbGFyYXRpb24gaXMKLWB3ZWFrbHkgbGlua2VkCi08aHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvbWFjLyNkb2N1bWVudGF0aW9uL01hY09TWC9Db25jZXB0dWFsL0JQRnJhbWV3b3Jrcy9Db25jZXB0cy9XZWFrTGlua2luZy5odG1sPmBfLAotYXMgaWYgdGhlIGBgd2Vha19pbXBvcnRgYCBhdHRyaWJ1dGUgd2VyZSBhZGRlZCB0byB0aGUgZGVjbGFyYXRpb24uICBBCi13ZWFrbHktbGlua2VkIGRlY2xhcmF0aW9uIG1heSBvciBtYXkgbm90IGJlIHByZXNlbnQgYSBydW4tdGltZSwgYW5kIGEgcHJvZ3JhbQotY2FuIGRldGVybWluZSB3aGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBpcyBwcmVzZW50IGJ5IGNoZWNraW5nIHdoZXRoZXIgdGhlCi1hZGRyZXNzIG9mIHRoYXQgZGVjbGFyYXRpb24gaXMgbm9uLU5VTEwuCi0KLUlmIHRoZXJlIGFyZSBtdWx0aXBsZSBkZWNsYXJhdGlvbnMgb2YgdGhlIHNhbWUgZW50aXR5LCB0aGUgYXZhaWxhYmlsaXR5Ci1hdHRyaWJ1dGVzIG11c3QgZWl0aGVyIG1hdGNoIG9uIGEgcGVyLXBsYXRmb3JtIGJhc2lzIG9yIGxhdGVyCi1kZWNsYXJhdGlvbnMgbXVzdCBub3QgaGF2ZSBhdmFpbGFiaWxpdHkgYXR0cmlidXRlcyBmb3IgdGhhdAotcGxhdGZvcm0uIEZvciBleGFtcGxlOgotCi0uLiBjb2RlLWJsb2NrOjogYwotCi0gIHZvaWQgZyh2b2lkKSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNCkpKTsKLSAgdm9pZCBnKHZvaWQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC40KSkpOyAvLyBva2F5LCBtYXRjaGVzCi0gIHZvaWQgZyh2b2lkKSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkoaW9zLGludHJvZHVjZWQ9NC4wKSkpOyAvLyBva2F5LCBhZGRzIGEgbmV3IHBsYXRmb3JtCi0gIHZvaWQgZyh2b2lkKTsgLy8gb2theSwgaW5oZXJpdHMgYm90aCBtYWNvc3ggYW5kIGlvcyBhdmFpbGFiaWxpdHkgZnJvbSBhYm92ZS4KLSAgdm9pZCBnKHZvaWQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC41KSkpOyAvLyBlcnJvcjogbWlzbWF0Y2gKLQotV2hlbiBvbmUgbWV0aG9kIG92ZXJyaWRlcyBhbm90aGVyLCB0aGUgb3ZlcnJpZGluZyBtZXRob2QgY2FuIGJlIG1vcmUgd2lkZWx5IGF2YWlsYWJsZSB0aGFuIHRoZSBvdmVycmlkZGVuIG1ldGhvZCwgZS5nLiw6Ci0KLS4uIGNvZGUtYmxvY2s6OiBvYmpjCi0KLSAgQGludGVyZmFjZSBBCi0gIC0gKGlkKW1ldGhvZCBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNCkpKTsKLSAgLSAoaWQpbWV0aG9kMiBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNCkpKTsKLSAgQGVuZAotCi0gIEBpbnRlcmZhY2UgQiA6IEEKLSAgLSAoaWQpbWV0aG9kIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC4zKSkpOyAvLyBva2F5OiBtZXRob2QgbW92ZWQgaW50byBiYXNlIGNsYXNzIGxhdGVyCi0gIC0gKGlkKW1ldGhvZCBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNSkpKTsgLy8gZXJyb3I6IHRoaXMgbWV0aG9kIHdhcyBhdmFpbGFibGUgdmlhIHRoZSBiYXNlIGNsYXNzIGluIDEwLjQKLSAgQGVuZAotCiBDaGVja3MgZm9yIFN0YW5kYXJkIExhbmd1YWdlIEZlYXR1cmVzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTgzMCw3ICs3MzQsNiBAQAogYGBfX2hhc19leHRlbnNpb24oY3h4X2luaXRfY2FwdHVyZSlgYCB0byBkZXRlcm1pbmUgaWYgc3VwcG9ydCBmb3IKIGxhbWJkYSBjYXB0dXJlcyB3aXRoIGV4cGxpY2l0IGluaXRpYWxpemVycyBpcyBlbmFibGVkCiAoZm9yIGluc3RhbmNlLCBgYFtuKDApXSB7IHJldHVybiArK247IH1gYCkuCi1DbGFuZyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCiAKIEMrKzF5IGdlbmVyaWMgbGFtYmRhcwogXl5eXl5eXl5eXl5eXl5eXl5eXl5eCkBAIC04MzksNyArNzQyLDYgQEAKIGBgX19oYXNfZXh0ZW5zaW9uKGN4eF9nZW5lcmljX2xhbWJkYSlgYCB0byBkZXRlcm1pbmUgaWYgc3VwcG9ydCBmb3IgZ2VuZXJpYwogKHBvbHltb3JwaGljKSBsYW1iZGFzIGlzIGVuYWJsZWQKIChmb3IgaW5zdGFuY2UsIGBgW10gKGF1dG8geCkgeyByZXR1cm4geCArIDE7IH1gYCkuCi1DbGFuZyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCiAKIEMrKzF5IHJlbGF4ZWQgY29uc3RleHByCiBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgpAQCAtODcyLDcgKzc3NCw2IEBACiBVc2UgYGBfX2hhc19mZWF0dXJlKGN4eF92YXJpYWJsZV90ZW1wbGF0ZXMpYGAgb3IKIGBgX19oYXNfZXh0ZW5zaW9uKGN4eF92YXJpYWJsZV90ZW1wbGF0ZXMpYGAgdG8gZGV0ZXJtaW5lIGlmIHN1cHBvcnQgZm9yCiB0ZW1wbGF0ZWQgdmFyaWFibGUgZGVjbGFyYXRpb25zIGlzIGVuYWJsZWQuCi1DbGFuZyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCiAKIEMxMQogLS0tCkBAIC05MjQsMTUgKzgyNSwzMyBAQAogVXNlIGBgX19oYXNfZmVhdHVyZShjX3RocmVhZF9sb2NhbClgYCBvciBgYF9faGFzX2V4dGVuc2lvbihjX3RocmVhZF9sb2NhbClgYAogdG8gZGV0ZXJtaW5lIGlmIHN1cHBvcnQgZm9yIGBgX1RocmVhZF9sb2NhbGBgIHZhcmlhYmxlcyBpcyBlbmFibGVkLgogCi1DaGVja3MgZm9yIFR5cGUgVHJhaXRzCi09PT09PT09PT09PT09PT09PT09PT09CitDaGVja3MgZm9yIFR5cGUgVHJhaXQgUHJpbWl0aXZlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVHlwZSB0cmFpdCBwcmltaXRpdmVzIGFyZSBzcGVjaWFsIGJ1aWx0aW4gY29uc3RhbnQgZXhwcmVzc2lvbnMgdGhhdCBjYW4gYmUgdXNlZAorYnkgdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5IHRvIGZhY2lsaXRhdGUgb3Igc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uIG9mCit1c2VyLWZhY2luZyB0eXBlIHRyYWl0cyBpbiB0aGUgPHR5cGVfdHJhaXRzPiBoZWFkZXIuCisKK1RoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGJ5IHVzZXIgY29kZSBiZWNhdXNlIHRoZXkgYXJlCitpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGFuZCBzdWJqZWN0IHRvIGNoYW5nZSAtLSBhcyBzdWNoIHRoZXkncmUgdGllZCBjbG9zZWx5IHRvCit0aGUgc3VwcG9ydGVkIHNldCBvZiBzeXN0ZW0gaGVhZGVycywgY3VycmVudGx5OgorCisqIExMVk0ncyBvd24gbGliYysrCisqIEdOVSBsaWJzdGRjKysKKyogVGhlIE1pY3Jvc29mdCBzdGFuZGFyZCBDKysgbGlicmFyeQogCiBDbGFuZyBzdXBwb3J0cyB0aGUgYEdOVSBDKysgdHlwZSB0cmFpdHMKIDxodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvVHlwZS1UcmFpdHMuaHRtbD5gXyBhbmQgYSBzdWJzZXQgb2YgdGhlCiBgTWljcm9zb2Z0IFZpc3VhbCBDKysgVHlwZSB0cmFpdHMKLTxodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNzcxOTQodj1WUy4xMDApLmFzcHg+YF8uICBGb3IgZWFjaAotc3VwcG9ydGVkIHR5cGUgdHJhaXQgYGBfX1hgYCwgYGBfX2hhc19leHRlbnNpb24oWClgYCBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mCi10aGUgdHlwZSB0cmFpdC4gIEZvciBleGFtcGxlOgorPGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE3NzE5NCh2PVZTLjEwMCkuYXNweD5gXy4KKworRmVhdHVyZSBkZXRlY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHNvbWUgb2YgdGhlIHByaW1pdGl2ZXMgYXQgcHJlc2VudC4gVXNlcgorY29kZSBzaG91bGQgbm90IHVzZSB0aGVzZSBjaGVja3MgYmVjYXVzZSB0aGV5IGJlYXIgbm8gZGlyZWN0IHJlbGF0aW9uIHRvIHRoZQorYWN0dWFsIHNldCBvZiB0eXBlIHRyYWl0cyBzdXBwb3J0ZWQgYnkgdGhlIEMrKyBzdGFuZGFyZCBsaWJyYXJ5LgorCitGb3IgdHlwZSB0cmFpdCBgYF9fWGBgLCBgYF9faGFzX2V4dGVuc2lvbihYKWBgIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgdGhlCit0eXBlIHRyYWl0IHByaW1pdGl2ZSBpbiB0aGUgY29tcGlsZXIuIEEgc2ltcGxpc3RpYyB1c2FnZSBleGFtcGxlIGFzIG1pZ2h0IGJlCitzZWVuIGluIHN0YW5kYXJkIEMrKyBoZWFkZXJzIGZvbGxvd3M6CiAKIC4uIGNvZGUtYmxvY2s6OiBjKysKIApAQCAtOTQyLDEwICs4NjEsMTAgQEAKICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IF9faXNfY29udmVydGlibGVfdG8oRnJvbSwgVG8pOwogICB9OwogICAjZWxzZQotICAvLyBFbXVsYXRlIHR5cGUgdHJhaXQKKyAgLy8gRW11bGF0ZSB0eXBlIHRyYWl0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgY29tcGlsZXJzLgogICAjZW5kaWYKIAotVGhlIGZvbGxvd2luZyB0eXBlIHRyYWl0cyBhcmUgc3VwcG9ydGVkIGJ5IENsYW5nOgorVGhlIGZvbGxvd2luZyB0eXBlIHRyYWl0IHByaW1pdGl2ZXMgYXJlIHN1cHBvcnRlZCBieSBDbGFuZzoKIAogKiBgYF9faGFzX25vdGhyb3dfYXNzaWduYGAgKEdOVSwgTWljcm9zb2Z0KQogKiBgYF9faGFzX25vdGhyb3dfY29weWBgIChHTlUsIE1pY3Jvc29mdCkKQEAgLTk4MCw2ICs4OTksMTEgQEAKICAgYGBhcmd0eXBlcy4uLmBgIHN1Y2ggdGhhdCBubyBub24tdHJpdmlhbCBmdW5jdGlvbnMgYXJlIGNhbGxlZCBhcyBwYXJ0IG9mCiAgIHRoYXQgaW5pdGlhbGl6YXRpb24uICBUaGlzIHRyYWl0IGlzIHJlcXVpcmVkIHRvIGltcGxlbWVudCB0aGUgQysrMTEgc3RhbmRhcmQKICAgbGlicmFyeS4KKyogYGBfX2lzX2Rlc3RydWN0aWJsZWBgIChNU1ZDIDIwMTMpOiBwYXJ0aWFsbHkgaW1wbGVtZW50ZWQKKyogYGBfX2lzX25vdGhyb3dfZGVzdHJ1Y3RpYmxlYGAgKE1TVkMgMjAxMyk6IHBhcnRpYWxseSBpbXBsZW1lbnRlZAorKiBgYF9faXNfbm90aHJvd19hc3NpZ25hYmxlYGAgKE1TVkMgMjAxMywgY2xhbmcpCisqIGBgX19pc19jb25zdHJ1Y3RpYmxlYGAgKE1TVkMgMjAxMywgY2xhbmcpCisqIGBgX19pc19ub3Rocm93X2NvbnN0cnVjdGlibGVgYCAoTVNWQyAyMDEzLCBjbGFuZykKIAogQmxvY2tzCiA9PT09PT0KQEAgLTExNzQsNzcgKzEwOTgsNiBAQAogYGBfX2hhc19mZWF0dXJlKG9iamNfZGVmYXVsdF9zeW50aGVzaXplX3Byb3BlcnRpZXMpYGAgY2hlY2tzIGZvciBhdmFpbGFiaWxpdHkKIG9mIHRoaXMgZmVhdHVyZSBpbiB2ZXJzaW9uIG9mIGNsYW5nIGJlaW5nIHVzZWQuCiAKLS4uIF9sYW5nZXh0LW9iamNfbWV0aG9kX2ZhbWlseToKLQotCi1PYmplY3RpdmUtQyByZXF1aXJpbmcgYSBjYWxsIHRvIGBgc3VwZXJgYCBpbiBhbiBvdmVycmlkZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU29tZSBPYmplY3RpdmUtQyBjbGFzc2VzIGFsbG93IGEgc3ViY2xhc3MgdG8gb3ZlcnJpZGUgYSBwYXJ0aWN1bGFyIG1ldGhvZCBpbiBhCi1wYXJlbnQgY2xhc3MgYnV0IGV4cGVjdCB0aGF0IHRoZSBvdmVycmlkaW5nIG1ldGhvZCBhbHNvIGNhbGxzIHRoZSBvdmVycmlkZGVuCi1tZXRob2QgaW4gdGhlIHBhcmVudCBjbGFzcy4gRm9yIHRoZXNlIGNhc2VzLCB3ZSBwcm92aWRlIGFuIGF0dHJpYnV0ZSB0bwotZGVzaWduYXRlIHRoYXQgYSBtZXRob2QgcmVxdWlyZXMgYSAiY2FsbCB0byBgYHN1cGVyYGAiIGluIHRoZSBvdmVycmlkaW5nCi1tZXRob2QgaW4gdGhlIHN1YmNsYXNzLgotCi0qKlVzYWdlKio6IGBgX19hdHRyaWJ1dGVfXygob2JqY19yZXF1aXJlc19zdXBlcikpYGAuICBUaGlzIGF0dHJpYnV0ZSBjYW4gb25seQotYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgYSBtZXRob2QgZGVjbGFyYXRpb246Ci0KLS4uIGNvZGUtYmxvY2s6OiBvYmpjCi0KLSAgLSAodm9pZClmb28gX19hdHRyaWJ1dGVfXygob2JqY19yZXF1aXJlc19zdXBlcikpOwotCi1UaGlzIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIHRoZSBtZXRob2QgZGVjbGFyYXRpb25zIHdpdGhpbiBhIGNsYXNzLCBhbmQKLW5vdCBhIHByb3RvY29sLiAgQ3VycmVudGx5IHRoaXMgYXR0cmlidXRlIGRvZXMgbm90IGVuZm9yY2UgYW55IHBsYWNlbWVudCBvZgotd2hlcmUgdGhlIGNhbGwgb2NjdXJzIGluIHRoZSBvdmVycmlkaW5nIG1ldGhvZCAoc3VjaCBhcyBpbiB0aGUgY2FzZSBvZgotYGAtZGVhbGxvY2BgIHdoZXJlIHRoZSBjYWxsIG11c3QgYXBwZWFyIGF0IHRoZSBlbmQpLiAgSXQgY2hlY2tzIG9ubHkgdGhhdCBpdAotZXhpc3RzLgotCi1Ob3RlIHRoYXQgb24gYm90aCBPUyBYIGFuZCBpT1MgdGhhdCB0aGUgRm91bmRhdGlvbiBmcmFtZXdvcmsgcHJvdmlkZXMgYQotY29udmVuaWVuY2UgbWFjcm8gYGBOU19SRVFVSVJFU19TVVBFUmBgIHRoYXQgcHJvdmlkZXMgc3ludGFjdGljIHN1Z2FyIGZvciB0aGlzCi1hdHRyaWJ1dGU6Ci0KLS4uIGNvZGUtYmxvY2s6OiBvYmpjCi0KLSAgLSAodm9pZClmb28gTlNfUkVRVUlSRVNfU1VQRVI7Ci0KLVRoaXMgbWFjcm8gaXMgY29uZGl0aW9uYWxseSBkZWZpbmVkIGRlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIncyBzdXBwb3J0IGZvcgotdGhpcyBhdHRyaWJ1dGUuICBJZiB0aGUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYXR0cmlidXRlIHRoZSBtYWNybwotZXhwYW5kcyB0byBub3RoaW5nLgotCi1PcGVyYXRpb25hbGx5LCB3aGVuIGEgbWV0aG9kIGhhcyB0aGlzIGFubm90YXRpb24gdGhlIGNvbXBpbGVyIHdpbGwgd2FybiBpZiB0aGUKLWltcGxlbWVudGF0aW9uIG9mIGFuIG92ZXJyaWRlIGluIGEgc3ViY2xhc3MgZG9lcyBub3QgY2FsbCBzdXBlci4gIEZvciBleGFtcGxlOgotCi0uLiBjb2RlLWJsb2NrOjogb2JqYwotCi0gICB3YXJuaW5nOiBtZXRob2QgcG9zc2libHkgbWlzc2luZyBhIFtzdXBlciBBbm5vdE1ldGhdIGNhbGwKLSAgIC0gKHZvaWQpIEFubm90TWV0aHt9OwotICAgICAgICAgICAgICAgICAgICAgIF4KLQotT2JqZWN0aXZlLUMgTWV0aG9kIEZhbWlsaWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTWFueSBtZXRob2RzIGluIE9iamVjdGl2ZS1DIGhhdmUgY29udmVudGlvbmFsIG1lYW5pbmdzIGRldGVybWluZWQgYnkgdGhlaXIKLXNlbGVjdG9ycy4gSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBiZSBhYmxlIHRvIG1hcmsgYSBtZXRob2QgYXMgaGF2aW5nIGEKLXBhcnRpY3VsYXIgY29udmVudGlvbmFsIG1lYW5pbmcgZGVzcGl0ZSBub3QgaGF2aW5nIHRoZSByaWdodCBzZWxlY3Rvciwgb3IgYXMKLW5vdCBoYXZpbmcgdGhlIGNvbnZlbnRpb25hbCBtZWFuaW5nIHRoYXQgaXRzIHNlbGVjdG9yIHdvdWxkIHN1Z2dlc3QuIEZvciB0aGVzZQotdXNlIGNhc2VzLCB3ZSBwcm92aWRlIGFuIGF0dHJpYnV0ZSB0byBzcGVjaWZpY2FsbHkgZGVzY3JpYmUgdGhlICJtZXRob2QgZmFtaWx5IgotdGhhdCBhIG1ldGhvZCBiZWxvbmdzIHRvLgotCi0qKlVzYWdlKio6IGBgX19hdHRyaWJ1dGVfXygob2JqY19tZXRob2RfZmFtaWx5KFgpKSlgYCwgd2hlcmUgYGBYYGAgaXMgb25lIG9mCi1gYG5vbmVgYCwgYGBhbGxvY2BgLCBgYGNvcHlgYCwgYGBpbml0YGAsIGBgbXV0YWJsZUNvcHlgYCwgb3IgYGBuZXdgYC4gIFRoaXMKLWF0dHJpYnV0ZSBjYW4gb25seSBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiBhIG1ldGhvZCBkZWNsYXJhdGlvbjoKLQotLi4gY29kZS1ibG9jazo6IG9iamMKLQotICAtIChOU1N0cmluZyAqKWluaXRNeVN0cmluZ1ZhbHVlIF9fYXR0cmlidXRlX18oKG9iamNfbWV0aG9kX2ZhbWlseShub25lKSkpOwotCi1Vc2VycyB3aG8gZG8gbm90IHdpc2ggdG8gY2hhbmdlIHRoZSBjb252ZW50aW9uYWwgbWVhbmluZyBvZiBhIG1ldGhvZCwgYW5kIHdobwotbWVyZWx5IHdhbnQgdG8gZG9jdW1lbnQgaXRzIG5vbi1zdGFuZGFyZCByZXRhaW4gYW5kIHJlbGVhc2Ugc2VtYW50aWNzLCBzaG91bGQKLXVzZSB0aGUgOnJlZjpgcmV0YWluaW5nIGJlaGF2aW9yIGF0dHJpYnV0ZXMgPGxhbmdleHQtb2JqYy1yZXRhaW4tcmVsZWFzZT5gCi1kZXNjcmliZWQgYmVsb3cuCi0KLVF1ZXJ5IGZvciB0aGlzIGZlYXR1cmUgd2l0aCBgYF9faGFzX2F0dHJpYnV0ZShvYmpjX21ldGhvZF9mYW1pbHkpYGAuCi0KIC4uIF9sYW5nZXh0LW9iamMtcmV0YWluLXJlbGVhc2U6CiAKIE9iamVjdGl2ZS1DIHJldGFpbmluZyBiZWhhdmlvciBhdHRyaWJ1dGVzCkBAIC0xMjU3LDggKzExMTAsNyBAQAogcmV0dXJuIHZhbHVlcy4gSG93ZXZlciwgdGhlcmUgYXJlIGV4Y2VwdGlvbnMsIGFuZCBzbyBDbGFuZyBwcm92aWRlcyBhdHRyaWJ1dGVzCiB0byBhbGxvdyB0aGVzZSBleGNlcHRpb25zIHRvIGJlIGRvY3VtZW50ZWQuIFRoaXMgYXJlIHVzZWQgYnkgQVJDIGFuZCB0aGUKIGBzdGF0aWMgYW5hbHl6ZXIgPGh0dHA6Ly9jbGFuZy1hbmFseXplci5sbHZtLm9yZz5gXyBTb21lIGV4Y2VwdGlvbnMgbWF5IGJlCi1iZXR0ZXIgZGVzY3JpYmVkIHVzaW5nIHRoZSA6cmVmOmBvYmpjX21ldGhvZF9mYW1pbHkKLTxsYW5nZXh0LW9iamNfbWV0aG9kX2ZhbWlseT5gIGF0dHJpYnV0ZSBpbnN0ZWFkLgorYmV0dGVyIGRlc2NyaWJlZCB1c2luZyB0aGUgYGBvYmpjX21ldGhvZF9mYW1pbHlgYCBhdHRyaWJ1dGUgaW5zdGVhZC4KIAogKipVc2FnZSoqOiBUaGUgYGBuc19yZXR1cm5zX3JldGFpbmVkYGAsIGBgbnNfcmV0dXJuc19ub3RfcmV0YWluZWRgYCwKIGBgbnNfcmV0dXJuc19hdXRvcmVsZWFzZWRgYCwgYGBjZl9yZXR1cm5zX3JldGFpbmVkYGAsIGFuZApAQCAtMTMxNSw4NyArMTE2Nyw3IEBACiBRdWVyeSB0aGUgcHJlc2VuY2Ugb2YgdGhpcyBuZXcgbWFuZ2xpbmcgd2l0aAogYGBfX2hhc19mZWF0dXJlKG9iamNfcHJvdG9jb2xfcXVhbGlmaWVyX21hbmdsaW5nKWBgLgogCi1GdW5jdGlvbiBPdmVybG9hZGluZyBpbiBDCi09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNsYW5nIHByb3ZpZGVzIHN1cHBvcnQgZm9yIEMrKyBmdW5jdGlvbiBvdmVybG9hZGluZyBpbiBDLiAgRnVuY3Rpb24gb3ZlcmxvYWRpbmcKLWluIEMgaXMgaW50cm9kdWNlZCB1c2luZyB0aGUgYGBvdmVybG9hZGFibGVgYCBhdHRyaWJ1dGUuICBGb3IgZXhhbXBsZSwgb25lCi1taWdodCBwcm92aWRlIHNldmVyYWwgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiBhIGBgdGdzaW5gYCBmdW5jdGlvbiB0aGF0IGludm9rZXMKLXRoZSBhcHByb3ByaWF0ZSBzdGFuZGFyZCBmdW5jdGlvbiBjb21wdXRpbmcgdGhlIHNpbmUgb2YgYSB2YWx1ZSB3aXRoIGBgZmxvYXRgYCwKLWBgZG91YmxlYGAsIG9yIGBgbG9uZyBkb3VibGVgYCBwcmVjaXNpb246Ci0KLS4uIGNvZGUtYmxvY2s6OiBjCi0KLSAgI2luY2x1ZGUgPG1hdGguaD4KLSAgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGdzaW4oZmxvYXQgeCkgeyByZXR1cm4gc2luZih4KTsgfQotICBkb3VibGUgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGdzaW4oZG91YmxlIHgpIHsgcmV0dXJuIHNpbih4KTsgfQotICBsb25nIGRvdWJsZSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0Z3Npbihsb25nIGRvdWJsZSB4KSB7IHJldHVybiBzaW5sKHgpOyB9Ci0KLUdpdmVuIHRoZXNlIGRlY2xhcmF0aW9ucywgb25lIGNhbiBjYWxsIGBgdGdzaW5gYCB3aXRoIGEgYGBmbG9hdGBgIHZhbHVlIHRvCi1yZWNlaXZlIGEgYGBmbG9hdGBgIHJlc3VsdCwgd2l0aCBhIGBgZG91YmxlYGAgdG8gcmVjZWl2ZSBhIGBgZG91YmxlYGAgcmVzdWx0LAotZXRjLiAgRnVuY3Rpb24gb3ZlcmxvYWRpbmcgaW4gQyBmb2xsb3dzIHRoZSBydWxlcyBvZiBDKysgZnVuY3Rpb24gb3ZlcmxvYWRpbmcKLXRvIHBpY2sgdGhlIGJlc3Qgb3ZlcmxvYWQgZ2l2ZW4gdGhlIGNhbGwgYXJndW1lbnRzLCB3aXRoIGEgZmV3IEMtc3BlY2lmaWMKLXNlbWFudGljczoKLQotKiBDb252ZXJzaW9uIGZyb20gYGBmbG9hdGBgIG9yIGBgZG91YmxlYGAgdG8gYGBsb25nIGRvdWJsZWBgIGlzIHJhbmtlZCBhcyBhCi0gIGZsb2F0aW5nLXBvaW50IHByb21vdGlvbiAocGVyIEM5OSkgcmF0aGVyIHRoYW4gYXMgYSBmbG9hdGluZy1wb2ludCBjb252ZXJzaW9uCi0gIChhcyBpbiBDKyspLgotCi0qIEEgY29udmVyc2lvbiBmcm9tIGEgcG9pbnRlciBvZiB0eXBlIGBgVCpgYCB0byBhIHBvaW50ZXIgb2YgdHlwZSBgYFUqYGAgaXMKLSAgY29uc2lkZXJlZCBhIHBvaW50ZXIgY29udmVyc2lvbiAod2l0aCBjb252ZXJzaW9uIHJhbmspIGlmIGBgVGBgIGFuZCBgYFVgYCBhcmUKLSAgY29tcGF0aWJsZSB0eXBlcy4KLQotKiBBIGNvbnZlcnNpb24gZnJvbSB0eXBlIGBgVGBgIHRvIGEgdmFsdWUgb2YgdHlwZSBgYFVgYCBpcyBwZXJtaXR0ZWQgaWYgYGBUYGAKLSAgYW5kIGBgVWBgIGFyZSBjb21wYXRpYmxlIHR5cGVzLiAgVGhpcyBjb252ZXJzaW9uIGlzIGdpdmVuICJjb252ZXJzaW9uIiByYW5rLgotCi1UaGUgZGVjbGFyYXRpb24gb2YgYGBvdmVybG9hZGFibGVgYCBmdW5jdGlvbnMgaXMgcmVzdHJpY3RlZCB0byBmdW5jdGlvbgotZGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucy4gIE1vc3QgaW1wb3J0YW50bHksIGlmIGFueSBmdW5jdGlvbiB3aXRoIGEgZ2l2ZW4KLW5hbWUgaXMgZ2l2ZW4gdGhlIGBgb3ZlcmxvYWRhYmxlYGAgYXR0cmlidXRlLCB0aGVuIGFsbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLWFuZCBkZWZpbml0aW9ucyB3aXRoIHRoYXQgbmFtZSAoYW5kIGluIHRoYXQgc2NvcGUpIG11c3QgaGF2ZSB0aGUKLWBgb3ZlcmxvYWRhYmxlYGAgYXR0cmlidXRlLiAgVGhpcyBydWxlIGV2ZW4gYXBwbGllcyB0byByZWRlY2xhcmF0aW9ucyBvZgotZnVuY3Rpb25zIHdob3NlIG9yaWdpbmFsIGRlY2xhcmF0aW9uIGhhZCB0aGUgYGBvdmVybG9hZGFibGVgYCBhdHRyaWJ1dGUsIGUuZy4sCi0KLS4uIGNvZGUtYmxvY2s6OiBjCi0KLSAgaW50IGYoaW50KSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKTsKLSAgZmxvYXQgZihmbG9hdCk7IC8vIGVycm9yOiBkZWNsYXJhdGlvbiBvZiAiZiIgbXVzdCBoYXZlIHRoZSAib3ZlcmxvYWRhYmxlIiBhdHRyaWJ1dGUKLQotICBpbnQgZyhpbnQpIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpOwotICBpbnQgZyhpbnQpIHsgfSAvLyBlcnJvcjogcmVkZWNsYXJhdGlvbiBvZiAiZyIgbXVzdCBhbHNvIGhhdmUgdGhlICJvdmVybG9hZGFibGUiIGF0dHJpYnV0ZQotCi1GdW5jdGlvbnMgbWFya2VkIGBgb3ZlcmxvYWRhYmxlYGAgbXVzdCBoYXZlIHByb3RvdHlwZXMuICBUaGVyZWZvcmUsIHRoZQotZm9sbG93aW5nIGNvZGUgaXMgaWxsLWZvcm1lZDoKLQotLi4gY29kZS1ibG9jazo6IGMKLQotICBpbnQgaCgpIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpOyAvLyBlcnJvcjogaCBkb2VzIG5vdCBoYXZlIGEgcHJvdG90eXBlCi0KLUhvd2V2ZXIsIGBgb3ZlcmxvYWRhYmxlYGAgZnVuY3Rpb25zIGFyZSBhbGxvd2VkIHRvIHVzZSBhIGVsbGlwc2lzIGV2ZW4gaWYgdGhlcmUKLWFyZSBubyBuYW1lZCBwYXJhbWV0ZXJzIChhcyBpcyBwZXJtaXR0ZWQgaW4gQysrKS4gIFRoaXMgZmVhdHVyZSBpcyBwYXJ0aWN1bGFybHkKLXVzZWZ1bCB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIGBgdW5hdmFpbGFibGVgYCBhdHRyaWJ1dGU6Ci0KLS4uIGNvZGUtYmxvY2s6OiBjKysKLQotICB2b2lkIGhvbmV5cG90KC4uLikgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCB1bmF2YWlsYWJsZSkpOyAvLyBjYWxsaW5nIG1lIGlzIGFuIGVycm9yCi0KLUZ1bmN0aW9ucyBkZWNsYXJlZCB3aXRoIHRoZSBgYG92ZXJsb2FkYWJsZWBgIGF0dHJpYnV0ZSBoYXZlIHRoZWlyIG5hbWVzIG1hbmdsZWQKLWFjY29yZGluZyB0byB0aGUgc2FtZSBydWxlcyBhcyBDKysgZnVuY3Rpb24gbmFtZXMuICBGb3IgZXhhbXBsZSwgdGhlIHRocmVlCi1gYHRnc2luYGAgZnVuY3Rpb25zIGluIG91ciBtb3RpdmF0aW5nIGV4YW1wbGUgZ2V0IHRoZSBtYW5nbGVkIG5hbWVzCi1gYF9aNXRnc2luZmBgLCBgYF9aNXRnc2luZGBgLCBhbmQgYGBfWjV0Z3NpbmVgYCwgcmVzcGVjdGl2ZWx5LiAgVGhlcmUgYXJlIHR3bwotY2F2ZWF0cyB0byB0aGlzIHVzZSBvZiBuYW1lIG1hbmdsaW5nOgotCi0qIEZ1dHVyZSB2ZXJzaW9ucyBvZiBDbGFuZyBtYXkgY2hhbmdlIHRoZSBuYW1lIG1hbmdsaW5nIG9mIGZ1bmN0aW9ucyBvdmVybG9hZGVkCi0gIGluIEMsIHNvIHlvdSBzaG91bGQgbm90IGRlcGVuZCBvbiBhbiBzcGVjaWZpYyBtYW5nbGluZy4gIFRvIGJlIGNvbXBsZXRlbHkKLSAgc2FmZSwgd2Ugc3Ryb25nbHkgdXJnZSB0aGUgdXNlIG9mIGBgc3RhdGljIGlubGluZWBgIHdpdGggYGBvdmVybG9hZGFibGVgYAotICBmdW5jdGlvbnMuCi0KLSogVGhlIGBgb3ZlcmxvYWRhYmxlYGAgYXR0cmlidXRlIGhhcyBhbG1vc3Qgbm8gbWVhbmluZyB3aGVuIHVzZWQgaW4gQysrLAotICBiZWNhdXNlIG5hbWVzIHdpbGwgYWxyZWFkeSBiZSBtYW5nbGVkIGFuZCBmdW5jdGlvbnMgYXJlIGFscmVhZHkgb3ZlcmxvYWRhYmxlLgotICBIb3dldmVyLCB3aGVuIGFuIGBgb3ZlcmxvYWRhYmxlYGAgZnVuY3Rpb24gb2NjdXJzIHdpdGhpbiBhbiBgYGV4dGVybiAiQyJgYAotICBsaW5rYWdlIHNwZWNpZmljYXRpb24sIGl0J3MgbmFtZSAqd2lsbCogYmUgbWFuZ2xlZCBpbiB0aGUgc2FtZSB3YXkgYXMgaXQKLSAgd291bGQgaW4gQy4KLQotUXVlcnkgZm9yIHRoaXMgZmVhdHVyZSB3aXRoIGBgX19oYXNfZXh0ZW5zaW9uKGF0dHJpYnV0ZV9vdmVybG9hZGFibGUpYGAuCisuLiBfbGFuZ2V4dC1vdmVybG9hZGluZzoKIAogSW5pdGlhbGl6ZXIgbGlzdHMgZm9yIGNvbXBsZXggbnVtYmVycyBpbiBDCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE3NzQsNyArMTU0Niw3IEBACiAgIHZvaWQgX19idWlsdGluX2FybV9jbHJleCh2b2lkKTsKIAogVGhlIHR5cGVzIGBgVGBgIGN1cnJlbnRseSBzdXBwb3J0ZWQgYXJlOgotKiBJbnRlZ2VyIHR5cGVzIHdpdGggd2lkdGggYXQgbW9zdCA2NCBiaXRzLgorKiBJbnRlZ2VyIHR5cGVzIHdpdGggd2lkdGggYXQgbW9zdCA2NCBiaXRzIChvciAxMjggYml0cyBvbiBBUk02NCkuCiAqIEZsb2F0aW5nLXBvaW50IHR5cGVzCiAqIFBvaW50ZXIgdHlwZXMuCiAKQEAgLTE3OTgsNTUgKzE1NzAsNyBAQAogQ2xhbmcncyBub24tc3RhbmRhcmQgQysrMTEgYXR0cmlidXRlcyBsaXZlIGluIHRoZSBgYGNsYW5nYGAgYXR0cmlidXRlCiBuYW1lc3BhY2UuCiAKLVRoZSBgYGNsYW5nOjpmYWxsdGhyb3VnaGBgIGF0dHJpYnV0ZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBgYGNsYW5nOjpmYWxsdGhyb3VnaGBgIGF0dHJpYnV0ZSBpcyB1c2VkIGFsb25nIHdpdGggdGhlCi1gYC1XaW1wbGljaXQtZmFsbHRocm91Z2hgYCBhcmd1bWVudCB0byBhbm5vdGF0ZSBpbnRlbnRpb25hbCBmYWxsLXRocm91Z2gKLWJldHdlZW4gc3dpdGNoIGxhYmVscy4gIEl0IGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBudWxsIHN0YXRlbWVudCBwbGFjZWQgYXQgYQotcG9pbnQgb2YgZXhlY3V0aW9uIGJldHdlZW4gYW55IHN0YXRlbWVudCBhbmQgdGhlIG5leHQgc3dpdGNoIGxhYmVsLiAgSXQgaXMKLWNvbW1vbiB0byBtYXJrIHRoZXNlIHBsYWNlcyB3aXRoIGEgc3BlY2lmaWMgY29tbWVudCwgYnV0IHRoaXMgYXR0cmlidXRlIGlzCi1tZWFudCB0byByZXBsYWNlIGNvbW1lbnRzIHdpdGggYSBtb3JlIHN0cmljdCBhbm5vdGF0aW9uLCB3aGljaCBjYW4gYmUgY2hlY2tlZAotYnkgdGhlIGNvbXBpbGVyLiAgVGhpcyBhdHRyaWJ1dGUgZG9lc24ndCBjaGFuZ2Ugc2VtYW50aWNzIG9mIHRoZSBjb2RlIGFuZCBjYW4KLWJlIHVzZWQgd2hlcmV2ZXIgYW4gaW50ZW5kZWQgZmFsbC10aHJvdWdoIG9jY3Vycy4gIEl0IGlzIGRlc2lnbmVkIHRvIG1pbWljCi1jb250cm9sLWZsb3cgc3RhdGVtZW50cyBsaWtlIGBgYnJlYWs7YGAsIHNvIGl0IGNhbiBiZSBwbGFjZWQgaW4gbW9zdCBwbGFjZXMKLXdoZXJlIGBgYnJlYWs7YGAgY2FuLCBidXQgb25seSBpZiB0aGVyZSBhcmUgbm8gc3RhdGVtZW50cyBvbiB0aGUgZXhlY3V0aW9uIHBhdGgKLWJldHdlZW4gaXQgYW5kIHRoZSBuZXh0IHN3aXRjaCBsYWJlbC4KLQotSGVyZSBpcyBhbiBleGFtcGxlOgotCi0uLiBjb2RlLWJsb2NrOjogYysrCi0KLSAgLy8gY29tcGlsZSB3aXRoIC1XaW1wbGljaXQtZmFsbHRocm91Z2gKLSAgc3dpdGNoIChuKSB7Ci0gIGNhc2UgMjI6Ci0gIGNhc2UgMzM6ICAvLyBubyB3YXJuaW5nOiBubyBzdGF0ZW1lbnRzIGJldHdlZW4gY2FzZSBsYWJlbHMKLSAgICBmKCk7Ci0gIGNhc2UgNDQ6ICAvLyB3YXJuaW5nOiB1bmFubm90YXRlZCBmYWxsLXRocm91Z2gKLSAgICBnKCk7Ci0gICAgW1tjbGFuZzo6ZmFsbHRocm91Z2hdXTsKLSAgY2FzZSA1NTogIC8vIG5vIHdhcm5pbmcKLSAgICBpZiAoeCkgewotICAgICAgaCgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaSgpOwotICAgICAgW1tjbGFuZzo6ZmFsbHRocm91Z2hdXTsKLSAgICB9Ci0gIGNhc2UgNjY6ICAvLyBubyB3YXJuaW5nCi0gICAgcCgpOwotICAgIFtbY2xhbmc6OmZhbGx0aHJvdWdoXV07IC8vIHdhcm5pbmc6IGZhbGx0aHJvdWdoIGFubm90YXRpb24gZG9lcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICBkaXJlY3RseSBwcmVjZWRlIGNhc2UgbGFiZWwKLSAgICBxKCk7Ci0gIGNhc2UgNzc6ICAvLyB3YXJuaW5nOiB1bmFubm90YXRlZCBmYWxsLXRocm91Z2gKLSAgICByKCk7Ci0gIH0KLQotYGBnbnU6OmBgIGF0dHJpYnV0ZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNsYW5nIGFsc28gc3VwcG9ydHMgR0NDJ3MgYGBnbnVgYCBhdHRyaWJ1dGUgbmFtZXNwYWNlLiBBbGwgR0NDIGF0dHJpYnV0ZXMgd2hpY2gKK0NsYW5nIHN1cHBvcnRzIEdDQydzIGBgZ251YGAgYXR0cmlidXRlIG5hbWVzcGFjZS4gQWxsIEdDQyBhdHRyaWJ1dGVzIHdoaWNoCiBhcmUgYWNjZXB0ZWQgd2l0aCB0aGUgYGBfX2F0dHJpYnV0ZV9fKChmb28pKWBgIHN5bnRheCBhcmUgYWxzbyBhY2NlcHRlZCBhcwogYGBbW2dudTo6Zm9vXV1gYC4gVGhpcyBvbmx5IGV4dGVuZHMgdG8gYXR0cmlidXRlcyB3aGljaCBhcmUgc3BlY2lmaWVkIGJ5IEdDQwogKHNlZSB0aGUgbGlzdCBvZiBgR0NDIGZ1bmN0aW9uIGF0dHJpYnV0ZXMKQEAgLTE5MDIsNDggKzE2MjYsNiBAQAogICAgICAgICAgIG1vdmwgICAgJWdzOiglZWF4KSwgJWVheAogICAgICAgICAgIHJldAogCi1BUk0gTGFuZ3VhZ2UgRXh0ZW5zaW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSW50ZXJydXB0IGF0dHJpYnV0ZQotXl5eXl5eXl5eXl5eXl5eXl5eXgotCi1DbGFuZyBzdXBwb3J0cyB0aGUgR05VIHN0eWxlIGBgX19hdHRyaWJ1dGVfXygoaW50ZXJydXB0KCJUWVBFIikpKWBgIGF0dHJpYnV0ZSBvbgotQVJNIHRhcmdldHMuIFRoaXMgYXR0cmlidXRlIG1heSBiZSBhdHRhY2hlZCB0byBhIGZ1bmN0aW9uIGRlZmluaXRpb24gYW5kCi1pbnN0cnVjdHMgdGhlIGJhY2tlbmQgdG8gZ2VuZXJhdGUgYXBwcm9wcmlhdGUgZnVuY3Rpb24gZW50cnkvZXhpdCBjb2RlIHNvIHRoYXQKLWl0IGNhbiBiZSB1c2VkIGRpcmVjdGx5IGFzIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCi0KLSBUaGUgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgaW50ZXJydXB0IGF0dHJpYnV0ZSBpcyBvcHRpb25hbCwgYnV0IGlmCi1wcm92aWRlZCBpdCBtdXN0IGJlIGEgc3RyaW5nIGxpdGVyYWwgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6ICJJUlEiLAotIkZJUSIsICJTV0kiLCAiQUJPUlQiLCAiVU5ERUYiLgotCi1UaGUgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzOgotCi0tIElmIHRoZSBmdW5jdGlvbiBpcyBBQVBDUywgQ2xhbmcgaW5zdHJ1Y3RzIHRoZSBiYWNrZW5kIHRvIHJlYWxpZ24gdGhlIHN0YWNrIHRvCi0gIDggYnl0ZXMgb24gZW50cnkuIFRoaXMgaXMgYSBnZW5lcmFsIHJlcXVpcmVtZW50IG9mIHRoZSBBQVBDUyBhdCBwdWJsaWMKLSAgaW50ZXJmYWNlcywgYnV0IG1heSBub3QgaG9sZCB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0YWtlbi4gRG9pbmcgdGhpcyBhbGxvd3MKLSAgb3RoZXIgQUFQQ1MgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZC4KLS0gSWYgdGhlIENQVSBpcyBNLWNsYXNzIHRoaXMgaXMgYWxsIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBzaW5jZSB0aGUgYXJjaGl0ZWN0dXJlCi0gIGl0c2VsZiBpcyBkZXNpZ25lZCBpbiBzdWNoIGEgd2F5IHRoYXQgZnVuY3Rpb25zIG9iZXlpbmcgdGhlIG5vcm1hbCBBQVBDUyBBQkkKLSAgY29uc3RyYWludHMgYXJlIHZhbGlkIGV4Y2VwdGlvbiBoYW5kbGVycy4KLS0gSWYgdGhlIENQVSBpcyBub3QgTS1jbGFzcywgdGhlIHByb2xvZ3VlIGFuZCBlcGlsb2d1ZSBhcmUgbW9kaWZpZWQgdG8gc2F2ZSBhbGwKLSAgbm9uLWJhbmtlZCByZWdpc3RlcnMgdGhhdCBhcmUgdXNlZCwgc28gdGhhdCB1cG9uIHJldHVybiB0aGUgdXNlci1tb2RlIHN0YXRlCi0gIHdpbGwgbm90IGJlIGNvcnJ1cHRlZC4gTm90ZSB0aGF0IHRvIGF2b2lkIHVubmVjZXNzYXJ5IG92ZXJoZWFkLCBvbmx5Ci0gIGdlbmVyYWwtcHVycG9zZSAoaW50ZWdlcikgcmVnaXN0ZXJzIGFyZSBzYXZlZCBpbiB0aGlzIHdheS4gSWYgVkZQIG9wZXJhdGlvbnMKLSAgYXJlIG5lZWRlZCwgdGhhdCBzdGF0ZSBtdXN0IGJlIHNhdmVkIG1hbnVhbGx5LgotCi0gIFNwZWNpZmljYWxseSwgaW50ZXJydXB0IGtpbmRzIG90aGVyIHRoYW4gIkZJUSIgd2lsbCBzYXZlIGFsbCBjb3JlIHJlZ2lzdGVycwotICBleGNlcHQgImxyIiBhbmQgInNwIi4gIkZJUSIgaW50ZXJydXB0cyB3aWxsIHNhdmUgcjAtcjcuCi0tIElmIHRoZSBDUFUgaXMgbm90IE0tY2xhc3MsIHRoZSByZXR1cm4gaW5zdHJ1Y3Rpb24gaXMgY2hhbmdlZCB0byBvbmUgb2YgdGhlCi0gIGNhbm9uaWNhbCBzZXF1ZW5jZXMgcGVybWl0dGVkIGJ5IHRoZSBhcmNoaXRlY3R1cmUgZm9yIGV4Y2VwdGlvbiByZXR1cm4uIFdoZXJlCi0gIHBvc3NpYmxlIHRoZSBmdW5jdGlvbiBpdHNlbGYgd2lsbCBtYWtlIHRoZSBuZWNlc3NhcnkgImxyIiBhZGp1c3RtZW50cyBzbyB0aGF0Ci0gIHRoZSAicHJlZmVycmVkIHJldHVybiBhZGRyZXNzIiBpcyBzZWxlY3RlZC4KLQotICBVbmZvcnR1bmF0ZWx5IHRoZSBjb21waWxlciBpcyB1bmFibGUgdG8gbWFrZSB0aGlzIGd1YXJhbnRlZSBmb3IgYW4gIlVOREVGIgotICBoYW5kbGVyLCB3aGVyZSB0aGUgb2Zmc2V0IGZyb20gImxyIiB0byB0aGUgcHJlZmVycmVkIHJldHVybiBhZGRyZXNzIGRlcGVuZHMgb24KLSAgdGhlIGV4ZWN1dGlvbiBzdGF0ZSBvZiB0aGUgY29kZSB3aGljaCBnZW5lcmF0ZWQgdGhlIGV4Y2VwdGlvbi4gSW4gdGhpcyBjYXNlCi0gIGEgc2VxdWVuY2UgZXF1aXZhbGVudCB0byAibW92cyBwYywgbHIiIHdpbGwgYmUgdXNlZC4KLQogRXh0ZW5zaW9ucyBmb3IgU3RhdGljIEFuYWx5c2lzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTk1Nyw0NTAgKzE2MzksMTEgQEAKIEV4dGVuc2lvbnMgZm9yIER5bmFtaWMgQW5hbHlzaXMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotLi4gX2xhbmdleHQtYWRkcmVzc19zYW5pdGl6ZXI6Ci0KLUFkZHJlc3NTYW5pdGl6ZXIKLS0tLS0tLS0tLS0tLS0tLS0KLQogVXNlIGBgX19oYXNfZmVhdHVyZShhZGRyZXNzX3Nhbml0aXplcilgYCB0byBjaGVjayBpZiB0aGUgY29kZSBpcyBiZWluZyBidWlsdAogd2l0aCA6ZG9jOmBBZGRyZXNzU2FuaXRpemVyYC4KIAotVXNlIGBgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemVfYWRkcmVzcykpYGAKLW9uIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24KLXRvIHNwZWNpZnkgdGhhdCBhZGRyZXNzIHNhZmV0eSBpbnN0cnVtZW50YXRpb24gKGUuZy4gQWRkcmVzc1Nhbml0aXplcikgc2hvdWxkCi1ub3QgYmUgYXBwbGllZCB0byB0aGF0IGZ1bmN0aW9uLgotCi0uLiBfbGFuZ2V4dC10aHJlYWRfc2FuaXRpemVyOgotCi1UaHJlYWRTYW5pdGl6ZXIKLS0tLS0tLS0tLS0tLS0tLS0KLQogVXNlIGBgX19oYXNfZmVhdHVyZSh0aHJlYWRfc2FuaXRpemVyKWBgIHRvIGNoZWNrIGlmIHRoZSBjb2RlIGlzIGJlaW5nIGJ1aWx0CiB3aXRoIDpkb2M6YFRocmVhZFNhbml0aXplcmAuCiAKLVVzZSBgYF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplX3RocmVhZCkpYGAgb24gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbgotdG8gc3BlY2lmeSB0aGF0IGNoZWNrcyBmb3IgZGF0YSByYWNlcyBvbiBwbGFpbiAobm9uLWF0b21pYykgbWVtb3J5IGFjY2Vzc2VzCi1zaG91bGQgbm90IGJlIGluc2VydGVkIGJ5IFRocmVhZFNhbml0aXplci4KLVRoZSBmdW5jdGlvbiBpcyBzdGlsbCBpbnN0cnVtZW50ZWQgYnkgdGhlIHRvb2wgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzIGFuZAotcHJvdmlkZSBtZWFuaW5nZnVsIHN0YWNrIHRyYWNlcy4KLQotLi4gX2xhbmdleHQtbWVtb3J5X3Nhbml0aXplcjoKLQotTWVtb3J5U2FuaXRpemVyCi0tLS0tLS0tLS0tLS0tLS0tCiBVc2UgYGBfX2hhc19mZWF0dXJlKG1lbW9yeV9zYW5pdGl6ZXIpYGAgdG8gY2hlY2sgaWYgdGhlIGNvZGUgaXMgYmVpbmcgYnVpbHQKIHdpdGggOmRvYzpgTWVtb3J5U2FuaXRpemVyYC4KLQotVXNlIGBgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemVfbWVtb3J5KSlgYCBvbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uCi10byBzcGVjaWZ5IHRoYXQgY2hlY2tzIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSBzaG91bGQgbm90IGJlIGluc2VydGVkIAotKGUuZy4gYnkgTWVtb3J5U2FuaXRpemVyKS4gVGhlIGZ1bmN0aW9uIG1heSBzdGlsbCBiZSBpbnN0cnVtZW50ZWQgYnkgdGhlIHRvb2wKLXRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlcyBpbiBvdGhlciBwbGFjZXMuCi0KLQotVGhyZWFkLVNhZmV0eSBBbm5vdGF0aW9uIENoZWNraW5nCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ2xhbmcgc3VwcG9ydHMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGZvciBjaGVja2luZyBiYXNpYyBsb2NraW5nIHBvbGljaWVzIGluCi1tdWx0aXRocmVhZGVkIHByb2dyYW1zLiAgQ2xhbmcgY3VycmVudGx5IHBhcnNlcyB0aGUgZm9sbG93aW5nIGxpc3Qgb2YKLWF0dHJpYnV0ZXMsIGFsdGhvdWdoICoqdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGVzZSBhbm5vdGF0aW9ucyBpcyBjdXJyZW50bHkgaW4KLWRldmVsb3BtZW50LioqIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgYEdDQyBpbXBsZW1lbnRhdGlvbgotPGh0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1RocmVhZFNhZmV0eUFubm90YXRpb24+YF8uCi0KLWBgbm9fdGhyZWFkX3NhZmV0eV9hbmFseXNpc2BgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Vc2UgYGBfX2F0dHJpYnV0ZV9fKChub190aHJlYWRfc2FmZXR5X2FuYWx5c2lzKSlgYCBvbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHRvCi1zcGVjaWZ5IHRoYXQgdGhlIHRocmVhZCBzYWZldHkgYW5hbHlzaXMgc2hvdWxkIG5vdCBiZSBydW4gb24gdGhhdCBmdW5jdGlvbi4KLVRoaXMgYXR0cmlidXRlIHByb3ZpZGVzIGFuIGVzY2FwZSBoYXRjaCAoZS5nLiBmb3Igc2l0dWF0aW9ucyB3aGVuIGl0IGlzCi1kaWZmaWN1bHQgdG8gYW5ub3RhdGUgdGhlIGxvY2tpbmcgcG9saWN5KS4KLQotYGBsb2NrYWJsZWBgCi0tLS0tLS0tLS0tLS0KLQotVXNlIGBgX19hdHRyaWJ1dGVfXygobG9ja2FibGUpKWBgIG9uIGEgY2xhc3MgZGVmaW5pdGlvbiB0byBzcGVjaWZ5IHRoYXQgaXQgaGFzCi1hIGxvY2thYmxlIHR5cGUgKGUuZy4gYSBNdXRleCBjbGFzcykuICBUaGlzIGFubm90YXRpb24gaXMgcHJpbWFyaWx5IHVzZWQgdG8KLWNoZWNrIGNvbnNpc3RlbmN5LgotCi1gYHNjb3BlZF9sb2NrYWJsZWBgCi0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVzZSBgYF9fYXR0cmlidXRlX18oKHNjb3BlZF9sb2NrYWJsZSkpYGAgb24gYSBjbGFzcyBkZWZpbml0aW9uIHRvIHNwZWNpZnkgdGhhdAotaXQgaGFzIGEgInNjb3BlZCIgbG9ja2FibGUgdHlwZS4gIE9iamVjdHMgb2YgdGhpcyB0eXBlIHdpbGwgYWNxdWlyZSB0aGUgbG9jawotdXBvbiBjb25zdHJ1Y3Rpb24gYW5kIHJlbGVhc2UgaXQgdXBvbiBnb2luZyBvdXQgb2Ygc2NvcGUuICBUaGlzIGFubm90YXRpb24gaXMKLXByaW1hcmlseSB1c2VkIHRvIGNoZWNrIGNvbnNpc3RlbmN5LgotCi1gYGd1YXJkZWRfdmFyYGAKLS0tLS0tLS0tLS0tLS0tLQotCi1Vc2UgYGBfX2F0dHJpYnV0ZV9fKChndWFyZGVkX3ZhcikpYGAgb24gYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiB0byBzcGVjaWZ5IHRoYXQKLXRoZSB2YXJpYWJsZSBtdXN0IGJlIGFjY2Vzc2VkIHdoaWxlIGhvbGRpbmcgc29tZSBsb2NrLgotCi1gYHB0X2d1YXJkZWRfdmFyYGAKLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Vc2UgYGBfX2F0dHJpYnV0ZV9fKChwdF9ndWFyZGVkX3ZhcikpYGAgb24gYSBwb2ludGVyIGRlY2xhcmF0aW9uIHRvIHNwZWNpZnkKLXRoYXQgdGhlIHBvaW50ZXIgbXVzdCBiZSBkZXJlZmVyZW5jZWQgd2hpbGUgaG9sZGluZyBzb21lIGxvY2suCi0KLWBgZ3VhcmRlZF9ieShsKWBgCi0tLS0tLS0tLS0tLS0tLS0tLQotCi1Vc2UgYGBfX2F0dHJpYnV0ZV9fKChndWFyZGVkX2J5KGwpKSlgYCBvbiBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRvIHNwZWNpZnkKLXRoYXQgdGhlIHZhcmlhYmxlIG11c3QgYmUgYWNjZXNzZWQgd2hpbGUgaG9sZGluZyBsb2NrIGBgbGBgLgotCi1gYHB0X2d1YXJkZWRfYnkobClgYAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVXNlIGBgX19hdHRyaWJ1dGVfXygocHRfZ3VhcmRlZF9ieShsKSkpYGAgb24gYSBwb2ludGVyIGRlY2xhcmF0aW9uIHRvIHNwZWNpZnkKLXRoYXQgdGhlIHBvaW50ZXIgbXVzdCBiZSBkZXJlZmVyZW5jZWQgd2hpbGUgaG9sZGluZyBsb2NrIGBgbGBgLgotCi1gYGFjcXVpcmVkX2JlZm9yZSguLi4pYGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Vc2UgYGBfX2F0dHJpYnV0ZV9fKChhY3F1aXJlZF9iZWZvcmUoLi4uKSkpYGAgb24gYSBkZWNsYXJhdGlvbiBvZiBhIGxvY2thYmxlCi12YXJpYWJsZSB0byBzcGVjaWZ5IHRoYXQgdGhlIGxvY2sgbXVzdCBiZSBhY3F1aXJlZCBiZWZvcmUgYWxsIGF0dHJpYnV0ZQotYXJndW1lbnRzLiAgQXJndW1lbnRzIG11c3QgYmUgbG9ja2FibGUgdHlwZSwgYW5kIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lCi1hcmd1bWVudC4KLQotYGBhY3F1aXJlZF9hZnRlciguLi4pYGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVzZSBgYF9fYXR0cmlidXRlX18oKGFjcXVpcmVkX2FmdGVyKC4uLikpKWBgIG9uIGEgZGVjbGFyYXRpb24gb2YgYSBsb2NrYWJsZQotdmFyaWFibGUgdG8gc3BlY2lmeSB0aGF0IHRoZSBsb2NrIG11c3QgYmUgYWNxdWlyZWQgYWZ0ZXIgYWxsIGF0dHJpYnV0ZQotYXJndW1lbnRzLiAgQXJndW1lbnRzIG11c3QgYmUgbG9ja2FibGUgdHlwZSwgYW5kIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lCi1hcmd1bWVudC4KLQotYGBleGNsdXNpdmVfbG9ja19mdW5jdGlvbiguLi4pYGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVzZSBgYF9fYXR0cmlidXRlX18oKGV4Y2x1c2l2ZV9sb2NrX2Z1bmN0aW9uKC4uLikpKWBgIG9uIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24KLXRvIHNwZWNpZnkgdGhhdCB0aGUgZnVuY3Rpb24gYWNxdWlyZXMgYWxsIGxpc3RlZCBsb2NrcyBleGNsdXNpdmVseS4gIFRoaXMKLWF0dHJpYnV0ZSB0YWtlcyB6ZXJvIG9yIG1vcmUgYXJndW1lbnRzOiBlaXRoZXIgb2YgbG9ja2FibGUgdHlwZSBvciBpbnRlZ2VycwotaW5kZXhpbmcgaW50byBmdW5jdGlvbiBwYXJhbWV0ZXJzIG9mIGxvY2thYmxlIHR5cGUuICBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLAotdGhlIGFjcXVpcmVkIGxvY2sgaXMgaW1wbGljaXRseSBgYHRoaXNgYCBvZiB0aGUgZW5jbG9zaW5nIG9iamVjdC4KLQotYGBzaGFyZWRfbG9ja19mdW5jdGlvbiguLi4pYGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVzZSBgYF9fYXR0cmlidXRlX18oKHNoYXJlZF9sb2NrX2Z1bmN0aW9uKC4uLikpKWBgIG9uIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gdG8KLXNwZWNpZnkgdGhhdCB0aGUgZnVuY3Rpb24gYWNxdWlyZXMgYWxsIGxpc3RlZCBsb2NrcywgYWx0aG91Z2ggdGhlIGxvY2tzIG1heSBiZQotc2hhcmVkIChlLmcuIHJlYWQgbG9ja3MpLiAgVGhpcyBhdHRyaWJ1dGUgdGFrZXMgemVybyBvciBtb3JlIGFyZ3VtZW50czogZWl0aGVyCi1vZiBsb2NrYWJsZSB0eXBlIG9yIGludGVnZXJzIGluZGV4aW5nIGludG8gZnVuY3Rpb24gcGFyYW1ldGVycyBvZiBsb2NrYWJsZQotdHlwZS4gIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHRoZSBhY3F1aXJlZCBsb2NrIGlzIGltcGxpY2l0bHkgYGB0aGlzYGAgb2YKLXRoZSBlbmNsb3Npbmcgb2JqZWN0LgotCi1gYGV4Y2x1c2l2ZV90cnlsb2NrX2Z1bmN0aW9uKC4uLilgYAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVXNlIGBgX19hdHRyaWJ1dGVfXygoZXhjbHVzaXZlX2xvY2tfZnVuY3Rpb24oLi4uKSkpYGAgb24gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbgotdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIHRyeSAod2l0aG91dCBibG9ja2luZykgdG8gYWNxdWlyZSBhbGwgbGlzdGVkCi1sb2NrcyBleGNsdXNpdmVseS4gIFRoaXMgYXR0cmlidXRlIHRha2VzIG9uZSBvciBtb3JlIGFyZ3VtZW50cy4gIFRoZSBmaXJzdAotYXJndW1lbnQgaXMgYW4gaW50ZWdlciBvciBib29sZWFuIHZhbHVlIHNwZWNpZnlpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBhCi1zdWNjZXNzZnVsIGxvY2sgYWNxdWlzaXRpb24uICBUaGUgcmVtYWluaW5nIGFydWdtZW50cyBhcmUgZWl0aGVyIG9mIGxvY2thYmxlCi10eXBlIG9yIGludGVnZXJzIGluZGV4aW5nIGludG8gZnVuY3Rpb24gcGFyYW1ldGVycyBvZiBsb2NrYWJsZSB0eXBlLiAgSWYgb25seQotb25lIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgYWNxdWlyZWQgbG9jayBpcyBpbXBsaWNpdGx5IGBgdGhpc2BgIG9mIHRoZQotZW5jbG9zaW5nIG9iamVjdC4KLQotYGBzaGFyZWRfdHJ5bG9ja19mdW5jdGlvbiguLi4pYGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVzZSBgYF9fYXR0cmlidXRlX18oKHNoYXJlZF9sb2NrX2Z1bmN0aW9uKC4uLikpKWBgIG9uIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gdG8KLXNwZWNpZnkgdGhhdCB0aGUgZnVuY3Rpb24gd2lsbCB0cnkgKHdpdGhvdXQgYmxvY2tpbmcpIHRvIGFjcXVpcmUgYWxsIGxpc3RlZAotbG9ja3MsIGFsdGhvdWdoIHRoZSBsb2NrcyBtYXkgYmUgc2hhcmVkIChlLmcuIHJlYWQgbG9ja3MpLiAgVGhpcyBhdHRyaWJ1dGUKLXRha2VzIG9uZSBvciBtb3JlIGFyZ3VtZW50cy4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbiBpbnRlZ2VyIG9yIGJvb2xlYW4gdmFsdWUKLXNwZWNpZnlpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBhIHN1Y2Nlc3NmdWwgbG9jayBhY3F1aXNpdGlvbi4gIFRoZSByZW1haW5pbmcKLWFydWdtZW50cyBhcmUgZWl0aGVyIG9mIGxvY2thYmxlIHR5cGUgb3IgaW50ZWdlcnMgaW5kZXhpbmcgaW50byBmdW5jdGlvbgotcGFyYW1ldGVycyBvZiBsb2NrYWJsZSB0eXBlLiAgSWYgb25seSBvbmUgYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBhY3F1aXJlZCBsb2NrCi1pcyBpbXBsaWNpdGx5IGBgdGhpc2BgIG9mIHRoZSBlbmNsb3Npbmcgb2JqZWN0LgotCi1gYHVubG9ja19mdW5jdGlvbiguLi4pYGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Vc2UgYGBfX2F0dHJpYnV0ZV9fKCh1bmxvY2tfZnVuY3Rpb24oLi4uKSkpYGAgb24gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0bwotc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiByZWxlYXNlIGFsbCBsaXN0ZWQgbG9ja3MuICBUaGlzIGF0dHJpYnV0ZSB0YWtlcyB6ZXJvCi1vciBtb3JlIGFyZ3VtZW50czogZWl0aGVyIG9mIGxvY2thYmxlIHR5cGUgb3IgaW50ZWdlcnMgaW5kZXhpbmcgaW50byBmdW5jdGlvbgotcGFyYW1ldGVycyBvZiBsb2NrYWJsZSB0eXBlLiAgSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIGFjcXVpcmVkIGxvY2sgaXMKLWltcGxpY2l0bHkgYGB0aGlzYGAgb2YgdGhlIGVuY2xvc2luZyBvYmplY3QuCi0KLWBgbG9ja19yZXR1cm5lZChsKWBgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Vc2UgYGBfX2F0dHJpYnV0ZV9fKChsb2NrX3JldHVybmVkKGwpKSlgYCBvbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHRvIHNwZWNpZnkKLXRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgbG9jayBgYGxgYCAoYGBsYGAgbXVzdCBiZSBvZiBsb2NrYWJsZSB0eXBlKS4gIFRoaXMKLWFubm90YXRpb24gaXMgdXNlZCB0byBhaWQgaW4gcmVzb2x2aW5nIGxvY2sgZXhwcmVzc2lvbnMuCi0KLWBgbG9ja3NfZXhjbHVkZWQoLi4uKWBgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Vc2UgYGBfX2F0dHJpYnV0ZV9fKChsb2Nrc19leGNsdWRlZCguLi4pKSlgYCBvbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHRvCi1zcGVjaWZ5IHRoYXQgdGhlIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIHRoZSBsaXN0ZWQgbG9ja3MuICBBcmd1bWVudHMKLW11c3QgYmUgbG9ja2FibGUgdHlwZSwgYW5kIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LgotCi1gYGV4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCguLi4pYGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Vc2UgYGBfX2F0dHJpYnV0ZV9fKChleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQoLi4uKSkpYGAgb24gYSBmdW5jdGlvbgotZGVjbGFyYXRpb24gdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGlsZSBob2xkaW5nIHRoZQotbGlzdGVkIGV4Y2x1c2l2ZSBsb2Nrcy4gIEFyZ3VtZW50cyBtdXN0IGJlIGxvY2thYmxlIHR5cGUsIGFuZCB0aGVyZSBtdXN0IGJlIGF0Ci1sZWFzdCBvbmUgYXJndW1lbnQuCi0KLWBgc2hhcmVkX2xvY2tzX3JlcXVpcmVkKC4uLilgYAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVzZSBgYF9fYXR0cmlidXRlX18oKHNoYXJlZF9sb2Nrc19yZXF1aXJlZCguLi4pKSlgYCBvbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uCi10byBzcGVjaWZ5IHRoYXQgdGhlIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoaWxlIGhvbGRpbmcgdGhlIGxpc3RlZCBzaGFyZWQKLWxvY2tzLiAgQXJndW1lbnRzIG11c3QgYmUgbG9ja2FibGUgdHlwZSwgYW5kIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lCi1hcmd1bWVudC4KLQotQ29uc3VtZWQgQW5ub3RhdGlvbiBDaGVja2luZwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DbGFuZyBzdXBwb3J0cyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgZm9yIGNoZWNraW5nIGJhc2ljIHJlc291cmNlIG1hbmFnZW1lbnQKLXByb3BlcnRpZXMsIHNwZWNpZmljYWxseSBmb3IgdW5pcXVlIG9iamVjdHMgdGhhdCBoYXZlIGEgc2luZ2xlIG93bmluZyByZWZlcmVuY2UuCi1UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQsIGFsdGhvdWdoICoqdGhlIGltcGxlbWVudGF0aW9uCi1mb3IgdGhlc2UgYW5ub3RhdGlvbnMgaXMgY3VycmVudGx5IGluIGRldmVsb3BtZW50IGFuZCBhcmUgc3ViamVjdCB0byBjaGFuZ2UuKioKLQotYGBjb25zdW1hYmxlYGAKLS0tLS0tLS0tLS0tLS0tCi0KLUVhY2ggY2xhc3MgdGhhdCB1c2VzIGFueSBvZiB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIG11c3QgZmlyc3QgYmUgbWFya2VkCi11c2luZyB0aGUgY29uc3VtYWJsZSBhdHRyaWJ1dGUuICBGYWlsdXJlIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZy4KLQotYGBzZXRfdHlwZXN0YXRlKG5ld19zdGF0ZSlgYAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Bbm5vdGF0ZSBtZXRob2RzIHRoYXQgdHJhbnNpdGlvbiBhbiBvYmplY3QgaW50byBhIG5ldyBzdGF0ZSB3aXRoCi1gYF9fYXR0cmlidXRlX18oKHNldF90eXBlc3RhdGUobmV3X3N0YXRlKSkpYGAuICBUaGUgbmV3IG5ldyBzdGF0ZSBtdXN0IGJlCi11bmNvbnN1bWVkLCBjb25zdW1lZCwgb3IgdW5rbm93bi4KLQotYGBjYWxsYWJsZV93aGVuKC4uLilgYAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Vc2UgYGBfX2F0dHJpYnV0ZV9fKChjYWxsYWJsZV93aGVuKC4uLikpKWBgIHRvIGluZGljYXRlIHdoYXQgc3RhdGVzIGEgbWV0aG9kCi1tYXkgYmUgY2FsbGVkIGluLiAgVmFsaWQgc3RhdGVzIGFyZSB1bmNvbnN1bWVkLCBjb25zdW1lZCwgb3IgdW5rbm93bi4gIEVhY2gKLWFyZ3VtZW50IHRvIHRoaXMgYXR0cmlidXRlIG11c3QgYmUgYSBxdW90ZWQgc3RyaW5nLiAgRS5nLjoKLQotYGBfX2F0dHJpYnV0ZV9fKChjYWxsYWJsZV93aGVuKCJ1bmNvbnN1bWVkIiwgInVua25vd24iKSkpYGAKLQotYGB0ZXN0c190eXBlc3RhdGUodGVzdGVkX3N0YXRlKWBgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVXNlIGBgX19hdHRyaWJ1dGVfXygodGVzdHNfdHlwZXN0YXRlKHRlc3RlZF9zdGF0ZSkpKWBgIHRvIGluZGljYXRlIHRoYXQgYSBtZXRob2QKLXJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGluIHRoZSBzcGVjaWZpZWQgc3RhdGUuLgotCi1gYHBhcmFtX3R5cGVzdGF0ZShleHBlY3RlZF9zdGF0ZSlgYAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGV4cGVjdGF0aW9ucyBhYm91dCBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgQ2FsbHMgdG8gYW4KLWZ1bmN0aW9uIHdpdGggYW5ub3RhdGVkIHBhcmFtZXRlcnMgd2lsbCBpc3N1ZSBhIHdhcm5pbmcgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLWFyZ3VtZW50IGlzbid0IGluIHRoZSBleHBlY3RlZCBzdGF0ZS4gIFRoZSBhdHRyaWJ1dGUgaXMgYWxzbyB1c2VkIHRvIHNldCB0aGUKLWluaXRpYWwgc3RhdGUgb2YgdGhlIHBhcmFtZXRlciB3aGVuIGFuYWx5emluZyB0aGUgZnVuY3Rpb24ncyBib2R5LgotCi1gYHJldHVybl90eXBlc3RhdGUocmV0X3N0YXRlKWBgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBgYHJldHVybl90eXBlc3RhdGVgYCBhdHRyaWJ1dGUgY2FuIGJlIGFwcGxpZWQgdG8gZnVuY3Rpb25zIG9yIHBhcmFtZXRlcnMuCi1XaGVuIGFwcGxpZWQgdG8gYSBmdW5jdGlvbiB0aGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgc3RhdGUgb2YgdGhlIHJldHVybmVkCi12YWx1ZS4gIFRoZSBmdW5jdGlvbidzIGJvZHkgaXMgY2hlY2tlZCB0byBlbnN1cmUgdGhhdCBpdCBhbHdheXMgcmV0dXJucyBhIHZhbHVlCi1pbiB0aGUgc3BlY2lmaWVkIHN0YXRlLiAgT24gdGhlIGNhbGxlciBzaWRlLCB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGFubm90YXRlZAotZnVuY3Rpb24gYXJlIGluaXRpYWxpemVkIHRvIHRoZSBnaXZlbiBzdGF0ZS4KLQotSWYgdGhlIGF0dHJpYnV0ZSBpcyBhcHBsaWVkIHRvIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGl0IG1vZGlmaWVzIHRoZSBzdGF0ZSBvZgotYW4gYXJndW1lbnQgYWZ0ZXIgYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiByZXR1cm5zLiAgVGhlIGZ1bmN0aW9uJ3MgYm9keSBpcwotY2hlY2tlZCB0byBlbnN1cmUgdGhhdCB0aGUgcGFyYW1ldGVyIGlzIGluIHRoZSBleHBlY3RlZCBzdGF0ZSBiZWZvcmUgcmV0dXJuaW5nLiAKLQotVHlwZSBTYWZldHkgQ2hlY2tpbmcKLT09PT09PT09PT09PT09PT09PT09Ci0KLUNsYW5nIHN1cHBvcnRzIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBlbmFibGUgY2hlY2tpbmcgdHlwZSBzYWZldHkgcHJvcGVydGllcwotdGhhdCBjYW4ndCBiZSBlbmZvcmNlZCBieSB0aGUgQyB0eXBlIHN5c3RlbS4gIFVzZSBjYXNlcyBpbmNsdWRlOgotCi0qIE1QSSBsaWJyYXJ5IGltcGxlbWVudGF0aW9ucywgd2hlcmUgdGhlc2UgYXR0cmlidXRlcyBlbmFibGUgY2hlY2tpbmcgdGhhdAotICB0aGUgYnVmZmVyIHR5cGUgbWF0Y2hlcyB0aGUgcGFzc2VkIGBgTVBJX0RhdGF0eXBlYGA7Ci0qIGZvciBIREY1IGxpYnJhcnkgdGhlcmUgaXMgYSBzaW1pbGFyIHVzZSBjYXNlIHRvIE1QSTsKLSogY2hlY2tpbmcgdHlwZXMgb2YgdmFyaWFkaWMgZnVuY3Rpb25zJyBhcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyBsaWtlCi0gIGBgZmNudGwoKWBgIGFuZCBgYGlvY3RsKClgYC4KLQotWW91IGNhbiBkZXRlY3Qgc3VwcG9ydCBmb3IgdGhlc2UgYXR0cmlidXRlcyB3aXRoIGBgX19oYXNfYXR0cmlidXRlKClgYC4gIEZvcgotZXhhbXBsZToKLQotLi4gY29kZS1ibG9jazo6IGMrKwotCi0gICNpZiBkZWZpbmVkKF9faGFzX2F0dHJpYnV0ZSkKLSAgIyAgaWYgX19oYXNfYXR0cmlidXRlKGFyZ3VtZW50X3dpdGhfdHlwZV90YWcpICYmIFwKLSAgICAgICAgX19oYXNfYXR0cmlidXRlKHBvaW50ZXJfd2l0aF90eXBlX3RhZykgJiYgXAotICAgICAgICBfX2hhc19hdHRyaWJ1dGUodHlwZV90YWdfZm9yX2RhdGF0eXBlKQotICAjICAgIGRlZmluZSBBVFRSX01QSV9QV1QoYnVmZmVyX2lkeCwgdHlwZV9pZHgpIF9fYXR0cmlidXRlX18oKHBvaW50ZXJfd2l0aF90eXBlX3RhZyhtcGksYnVmZmVyX2lkeCx0eXBlX2lkeCkpKQotICAvKiAuLi4gb3RoZXIgbWFjcm9zIC4uLiAgKi8KLSAgIyAgZW5kaWYKLSAgI2VuZGlmCi0KLSAgI2lmICFkZWZpbmVkKEFUVFJfTVBJX1BXVCkKLSAgIyBkZWZpbmUgQVRUUl9NUElfUFdUKGJ1ZmZlcl9pZHgsIHR5cGVfaWR4KQotICAjZW5kaWYKLQotICBpbnQgTVBJX1NlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSAvKiwgb3RoZXIgYXJncyBvbWl0dGVkICovKQotICAgICAgQVRUUl9NUElfUFdUKDEsMyk7Ci0KLWBgYXJndW1lbnRfd2l0aF90eXBlX3RhZyguLi4pYGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVXNlIGBgX19hdHRyaWJ1dGVfXygoYXJndW1lbnRfd2l0aF90eXBlX3RhZyhhcmdfa2luZCwgYXJnX2lkeCwKLXR5cGVfdGFnX2lkeCkpKWBgIG9uIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbgotYWNjZXB0cyBhIHR5cGUgdGFnIHRoYXQgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBzb21lIG90aGVyIGFyZ3VtZW50LgotYGBhcmdfa2luZGBgIGlzIGFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIGFubm90YXRpbmcgYWxsCi1hcHBsaWNhYmxlIHR5cGUgdGFncy4KLQotVGhpcyBhdHRyaWJ1dGUgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgY2hlY2tpbmcgYXJndW1lbnRzIG9mIHZhcmlhZGljIGZ1bmN0aW9ucwotKGBgcG9pbnRlcl93aXRoX3R5cGVfdGFnYGAgY2FuIGJlIHVzZWQgaW4gbW9zdCBub24tdmFyaWFkaWMgY2FzZXMpLgotCi1Gb3IgZXhhbXBsZToKLQotLi4gY29kZS1ibG9jazo6IGMrKwotCi0gIGludCBmY250bChpbnQgZmQsIGludCBjbWQsIC4uLikKLSAgICAgIF9fYXR0cmlidXRlX18oKCBhcmd1bWVudF93aXRoX3R5cGVfdGFnKGZjbnRsLDMsMikgKSk7Ci0KLWBgcG9pbnRlcl93aXRoX3R5cGVfdGFnKC4uLilgYAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVzZSBgYF9fYXR0cmlidXRlX18oKHBvaW50ZXJfd2l0aF90eXBlX3RhZyhwdHJfa2luZCwgcHRyX2lkeCwgdHlwZV90YWdfaWR4KSkpYGAKLW9uIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgdHlwZSB0YWcgdGhhdAotZGV0ZXJtaW5lcyB0aGUgcG9pbnRlZSB0eXBlIG9mIHNvbWUgb3RoZXIgcG9pbnRlciBhcmd1bWVudC4KLQotRm9yIGV4YW1wbGU6Ci0KLS4uIGNvZGUtYmxvY2s6OiBjKysKLQotICBpbnQgTVBJX1NlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSAvKiwgb3RoZXIgYXJncyBvbWl0dGVkICovKQotICAgICAgX19hdHRyaWJ1dGVfXygoIHBvaW50ZXJfd2l0aF90eXBlX3RhZyhtcGksMSwzKSApKTsKLQotYGB0eXBlX3RhZ19mb3JfZGF0YXR5cGUoLi4uKWBgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2xhbmcgc3VwcG9ydHMgYW5ub3RhdGluZyB0eXBlIHRhZ3Mgb2YgdHdvIGZvcm1zLgotCi0qICoqVHlwZSB0YWcgdGhhdCBpcyBhbiBleHByZXNzaW9uIGNvbnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gc29tZSBkZWNsYXJlZAotICBpZGVudGlmaWVyLioqIFVzZSBgYF9fYXR0cmlidXRlX18oKHR5cGVfdGFnX2Zvcl9kYXRhdHlwZShraW5kLCB0eXBlKSkpYGAgb24gYQotICBkZWNsYXJhdGlvbiB3aXRoIHRoYXQgaWRlbnRpZmllcjoKLQotICAuLiBjb2RlLWJsb2NrOjogYysrCi0KLSAgICBleHRlcm4gc3RydWN0IG1waV9kYXRhdHlwZSBtcGlfZGF0YXR5cGVfaW50Ci0gICAgICAgIF9fYXR0cmlidXRlX18oKCB0eXBlX3RhZ19mb3JfZGF0YXR5cGUobXBpLGludCkgKSk7Ci0gICAgI2RlZmluZSBNUElfSU5UICgoTVBJX0RhdGF0eXBlKSAmbXBpX2RhdGF0eXBlX2ludCkKLQotKiAqKlR5cGUgdGFnIHRoYXQgaXMgYW4gaW50ZWdyYWwgbGl0ZXJhbC4qKiBJbnRyb2R1Y2UgYSBgYHN0YXRpYyBjb25zdGBgCi0gIHZhcmlhYmxlIHdpdGggYSBjb3JyZXNwb25kaW5nIGluaXRpYWxpemVyIHZhbHVlIGFuZCBhdHRhY2gKLSAgYGBfX2F0dHJpYnV0ZV9fKCh0eXBlX3RhZ19mb3JfZGF0YXR5cGUoa2luZCwgdHlwZSkpKWBgIG9uIHRoYXQgZGVjbGFyYXRpb24sCi0gIGZvciBleGFtcGxlOgotCi0gIC4uIGNvZGUtYmxvY2s6OiBjKysKLQotICAgICNkZWZpbmUgTVBJX0lOVCAoKE1QSV9EYXRhdHlwZSkgNDIpCi0gICAgc3RhdGljIGNvbnN0IE1QSV9EYXRhdHlwZSBtcGlfZGF0YXR5cGVfaW50Ci0gICAgICAgIF9fYXR0cmlidXRlX18oKCB0eXBlX3RhZ19mb3JfZGF0YXR5cGUobXBpLGludCkgKSkgPSA0MgotCi1UaGUgYXR0cmlidXRlIGFsc28gYWNjZXB0cyBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCB0aGF0IGRldGVybWluZXMgaG93IHRoZQotZXhwcmVzc2lvbiBpcyBjb21wYXJlZCB0byB0aGUgdHlwZSB0YWcuICBUaGVyZSBhcmUgdHdvIHN1cHBvcnRlZCBmbGFnczoKLQotKiBgYGxheW91dF9jb21wYXRpYmxlYGAgd2lsbCBjYXVzZSB0eXBlcyB0byBiZSBjb21wYXJlZCBhY2NvcmRpbmcgdG8KLSAgbGF5b3V0LWNvbXBhdGliaWxpdHkgcnVsZXMgKEMrKzExIFtjbGFzcy5tZW1dIHAgMTcsIDE4KS4gIFRoaXMgaXMKLSAgaW1wbGVtZW50ZWQgdG8gc3VwcG9ydCBhbm5vdGF0aW5nIHR5cGVzIGxpa2UgYGBNUElfRE9VQkxFX0lOVGBgLgotCi0gIEZvciBleGFtcGxlOgotCi0gIC4uIGNvZGUtYmxvY2s6OiBjKysKLQotICAgIC8qIEluIG1waS5oICovCi0gICAgc3RydWN0IGludGVybmFsX21waV9kb3VibGVfaW50IHsgZG91YmxlIGQ7IGludCBpOyB9OwotICAgIGV4dGVybiBzdHJ1Y3QgbXBpX2RhdGF0eXBlIG1waV9kYXRhdHlwZV9kb3VibGVfaW50Ci0gICAgICAgIF9fYXR0cmlidXRlX18oKCB0eXBlX3RhZ19mb3JfZGF0YXR5cGUobXBpLCBzdHJ1Y3QgaW50ZXJuYWxfbXBpX2RvdWJsZV9pbnQsIGxheW91dF9jb21wYXRpYmxlKSApKTsKLQotICAgICNkZWZpbmUgTVBJX0RPVUJMRV9JTlQgKChNUElfRGF0YXR5cGUpICZtcGlfZGF0YXR5cGVfZG91YmxlX2ludCkKLQotICAgIC8qIEluIHVzZXIgY29kZSAqLwotICAgIHN0cnVjdCBteV9wYWlyIHsgZG91YmxlIGE7IGludCBiOyB9OwotICAgIHN0cnVjdCBteV9wYWlyICpidWZmZXI7Ci0gICAgTVBJX1NlbmQoYnVmZmVyLCAxLCBNUElfRE9VQkxFX0lOVCAvKiwgLi4uICAqLyk7IC8vIG5vIHdhcm5pbmcKLQotICAgIHN0cnVjdCBteV9pbnRfcGFpciB7IGludCBhOyBpbnQgYjsgfQotICAgIHN0cnVjdCBteV9pbnRfcGFpciAqYnVmZmVyMjsKLSAgICBNUElfU2VuZChidWZmZXIyLCAxLCBNUElfRE9VQkxFX0lOVCAvKiwgLi4uICAqLyk7IC8vIHdhcm5pbmc6IGFjdHVhbCBidWZmZXIgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSAnc3RydWN0IG15X2ludF9wYWlyJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBtYXRjaCBzcGVjaWZpZWQgTVBJX0RhdGF0eXBlCi0KLSogYGBtdXN0X2JlX251bGxgYCBzcGVjaWZpZXMgdGhhdCB0aGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgYSBudWxsIHBvaW50ZXIKLSAgY29uc3RhbnQsIGZvciBleGFtcGxlOgotCi0gIC4uIGNvZGUtYmxvY2s6OiBjKysKLQotICAgIC8qIEluIG1waS5oICovCi0gICAgZXh0ZXJuIHN0cnVjdCBtcGlfZGF0YXR5cGUgbXBpX2RhdGF0eXBlX251bGwKLSAgICAgICAgX19hdHRyaWJ1dGVfXygoIHR5cGVfdGFnX2Zvcl9kYXRhdHlwZShtcGksIHZvaWQsIG11c3RfYmVfbnVsbCkgKSk7Ci0KLSAgICAjZGVmaW5lIE1QSV9EQVRBVFlQRV9OVUxMICgoTVBJX0RhdGF0eXBlKSAmbXBpX2RhdGF0eXBlX251bGwpCi0KLSAgICAvKiBJbiB1c2VyIGNvZGUgKi8KLSAgICBNUElfU2VuZChidWZmZXIsIDEsIE1QSV9EQVRBVFlQRV9OVUxMIC8qLCAuLi4gICovKTsgLy8gd2FybmluZzogTVBJX0RBVEFUWVBFX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIHNwZWNpZmllZCBidXQgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBhIG51bGwgcG9pbnRlcgotCi1Gb3JtYXQgU3RyaW5nIENoZWNraW5nCi09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNsYW5nIHN1cHBvcnRzIHRoZSBgYGZvcm1hdGBgIGF0dHJpYnV0ZSwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGZ1bmN0aW9uCi1hY2NlcHRzIGEgYGBwcmludGZgYCBvciBgYHNjYW5mYGAtbGlrZSBmb3JtYXQgc3RyaW5nIGFuZCBjb3JyZXNwb25kaW5nCi1hcmd1bWVudHMgb3IgYSBgYHZhX2xpc3RgYCB0aGF0IGNvbnRhaW5zIHRoZXNlIGFyZ3VtZW50cy4KLQotUGxlYXNlIHNlZSBgR0NDIGRvY3VtZW50YXRpb24gYWJvdXQgZm9ybWF0IGF0dHJpYnV0ZQotPGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy9GdW5jdGlvbi1BdHRyaWJ1dGVzLmh0bWw+YF8gdG8gZmluZCBkZXRhaWxzCi1hYm91dCBhdHRyaWJ1dGUgc3ludGF4LgotCi1DbGFuZyBpbXBsZW1lbnRzIHR3byBraW5kcyBvZiBjaGVja3Mgd2l0aCB0aGlzIGF0dHJpYnV0ZS4KLQotIy4gQ2xhbmcgY2hlY2tzIHRoYXQgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGBgZm9ybWF0YGAgYXR0cmlidXRlIGlzIGNhbGxlZCB3aXRoCi0gICBhIGZvcm1hdCBzdHJpbmcgdGhhdCB1c2VzIGZvcm1hdCBzcGVjaWZpZXJzIHRoYXQgYXJlIGFsbG93ZWQsIGFuZCB0aGF0Ci0gICBhcmd1bWVudHMgbWF0Y2ggdGhlIGZvcm1hdCBzdHJpbmcuICBUaGlzIGlzIHRoZSBgYC1XZm9ybWF0YGAgd2FybmluZywgaXQgaXMKLSAgIG9uIGJ5IGRlZmF1bHQuCi0KLSMuIENsYW5nIGNoZWNrcyB0aGF0IHRoZSBmb3JtYXQgc3RyaW5nIGFyZ3VtZW50IGlzIGEgbGl0ZXJhbCBzdHJpbmcuICBUaGlzIGlzCi0gICB0aGUgYGAtV2Zvcm1hdC1ub25saXRlcmFsYGAgd2FybmluZywgaXQgaXMgb2ZmIGJ5IGRlZmF1bHQuCi0KLSAgIENsYW5nIGltcGxlbWVudHMgdGhpcyBtb3N0bHkgdGhlIHNhbWUgd2F5IGFzIEdDQywgYnV0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZQotICAgZm9yIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBhIGBgdmFfbGlzdGBgIGFyZ3VtZW50IChmb3IgZXhhbXBsZSwgYGB2cHJpbnRmYGApLgotICAgR0NDIGRvZXMgbm90IGVtaXQgYGAtV2Zvcm1hdC1ub25saXRlcmFsYGAgd2FybmluZyBmb3IgY2FsbHMgdG8gc3VjaAotICAgZnVjdGlvbnMuICBDbGFuZyBkb2VzIG5vdCB3YXJuIGlmIHRoZSBmb3JtYXQgc3RyaW5nIGNvbWVzIGZyb20gYSBmdW5jdGlvbgotICAgcGFyYW1ldGVyLCB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgYW5ub3RhdGVkIHdpdGggYSBjb21wYXRpYmxlIGF0dHJpYnV0ZSwKLSAgIG90aGVyd2lzZSBpdCB3YXJucy4gIEZvciBleGFtcGxlOgotCi0gICAuLiBjb2RlLWJsb2NrOjogYwotCi0gICAgIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18gKF9fc2NhbmZfXywgMSwgMykpKQotICAgICB2b2lkIGZvbyhjb25zdCBjaGFyKiBzLCBjaGFyICpidWYsIC4uLikgewotICAgICAgIHZhX2xpc3QgYXA7Ci0gICAgICAgdmFfc3RhcnQoYXAsIGJ1Zik7Ci0KLSAgICAgICB2cHJpbnRmKHMsIGFwKTsgLy8gd2FybmluZzogZm9ybWF0IHN0cmluZyBpcyBub3QgYSBzdHJpbmcgbGl0ZXJhbAotICAgICB9Ci0KLSAgIEluIHRoaXMgY2FzZSB3ZSB3YXJuIGJlY2F1c2UgYGBzYGAgY29udGFpbnMgYSBmb3JtYXQgc3RyaW5nIGZvciBhCi0gICBgYHNjYW5mYGAtbGlrZSBmdW5jdGlvbiwgYnV0IGl0IGlzIHBhc3NlZCB0byBhIGBgcHJpbnRmYGAtbGlrZSBmdW5jdGlvbi4KLQotICAgSWYgdGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkLCBjbGFuZyBzdGlsbCB3YXJucywgYmVjYXVzZSB0aGUgZm9ybWF0IHN0cmluZyBpcwotICAgbm90IGEgc3RyaW5nIGxpdGVyYWwuCi0KLSAgIEFub3RoZXIgZXhhbXBsZToKLQotICAgLi4gY29kZS1ibG9jazo6IGMKLQotICAgICBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAxLCAzKSkpCi0gICAgIHZvaWQgZm9vKGNvbnN0IGNoYXIqIHMsIGNoYXIgKmJ1ZiwgLi4uKSB7Ci0gICAgICAgdmFfbGlzdCBhcDsKLSAgICAgICB2YV9zdGFydChhcCwgYnVmKTsKLQotICAgICAgIHZwcmludGYocywgYXApOyAvLyB3YXJuaW5nCi0gICAgIH0KLQotICAgSW4gdGhpcyBjYXNlIENsYW5nIGRvZXMgbm90IHdhcm4gYmVjYXVzZSB0aGUgZm9ybWF0IHN0cmluZyBgYHNgYCBhbmQKLSAgIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50cyBhcmUgYW5ub3RhdGVkLiAgSWYgdGhlIGFyZ3VtZW50cyBhcmUKLSAgIGluY29ycmVjdCwgdGhlIGNhbGxlciBvZiBgYGZvb2BgIHdpbGwgcmVjZWl2ZSBhIHdhcm5pbmcuCmRpZmYgLS1naXQgYS9kb2NzL0xpYkFTVE1hdGNoZXJzUmVmZXJlbmNlLmh0bWwgYi9kb2NzL0xpYkFTVE1hdGNoZXJzUmVmZXJlbmNlLmh0bWwKaW5kZXggMmM5YjNhYS4uZjcwMWYxMSAxMDA2NDQKLS0tIGEvZG9jcy9MaWJBU1RNYXRjaGVyc1JlZmVyZW5jZS5odG1sCisrKyBiL2RvY3MvTGliQVNUTWF0Y2hlcnNSZWZlcmVuY2UuaHRtbApAQCAtMjUwLDcgKzI1MCw3IEBACiA8dHI+PHRkIGNvbHNwYW49IjQiIGNsYXNzPSJkb2MiIGlkPSJtZXRob2REZWNsMCI+PHByZT5NYXRjaGVzIG1ldGhvZCBkZWNsYXJhdGlvbnMuCiAKIEV4YW1wbGUgbWF0Y2hlcyB5Ci0gIGNsYXNzIFggeyB2b2lkIHkoKSB9OworICBjbGFzcyBYIHsgdm9pZCB5KCk7IH07CiA8L3ByZT48L3RkPjwvdHI+CiAKIApAQCAtMTMxMSw3ICsxMzExLDcgQEAKIDwvcHJlPjwvdGQ+PC90cj4KIAogCi08dHI+PHRkPk1hdGNoZXImbHQ7KiZndDs8L3RkPjx0ZCBjbGFzcz0ibmFtZSIgb25jbGljaz0idG9nZ2xlKCd1bmxlc3MwJykiPjxhIG5hbWU9InVubGVzczBBbmNob3IiPnVubGVzczwvYT48L3RkPjx0ZD5NYXRjaGVyJmx0OyomZ3Q7ICBJbm5lck1hdGNoZXI8L3RkPjwvdHI+Cis8dHI+PHRkPk1hdGNoZXImbHQ7KiZndDs8L3RkPjx0ZCBjbGFzcz0ibmFtZSIgb25jbGljaz0idG9nZ2xlKCd1bmxlc3MwJykiPjxhIG5hbWU9InVubGVzczBBbmNob3IiPnVubGVzczwvYT48L3RkPjx0ZD5NYXRjaGVyJmx0OyomZ3Q7PC90ZD48L3RyPgogPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0idW5sZXNzMCI+PHByZT5NYXRjaGVzIGlmIHRoZSBwcm92aWRlZCBtYXRjaGVyIGRvZXMgbm90IG1hdGNoLgogCiBFeGFtcGxlIG1hdGNoZXMgWSAobWF0Y2hlciA9IHJlY29yZERlY2wodW5sZXNzKGhhc05hbWUoIlgiKSkpKQpAQCAtMTM1Miw2ICsxMzUyLDExIEBACiA8L3ByZT48L3RkPjwvdHI+CiAKIAorPHRyPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDWFhDb25zdHJ1Y3RFeHByLmh0bWwiPkNYWENvbnN0cnVjdEV4cHI8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ2lzTGlzdEluaXRpYWxpemF0aW9uMCcpIj48YSBuYW1lPSJpc0xpc3RJbml0aWFsaXphdGlvbjBBbmNob3IiPmlzTGlzdEluaXRpYWxpemF0aW9uPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4KKzx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9ImlzTGlzdEluaXRpYWxpemF0aW9uMCI+PHByZT5NYXRjaGVzIGEgY29uc3RydWN0b3IgY2FsbCBleHByZXNzaW9uIHdoaWNoIHVzZXMgbGlzdCBpbml0aWFsaXphdGlvbi4KKzwvcHJlPjwvdGQ+PC90cj4KKworCiA8dHI+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNYWENvbnN0cnVjdG9yRGVjbC5odG1sIj5DWFhDb25zdHJ1Y3RvckRlY2w8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ2lzSW1wbGljaXQwJykiPjxhIG5hbWU9ImlzSW1wbGljaXQwQW5jaG9yIj5pc0ltcGxpY2l0PC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4KIDx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9ImlzSW1wbGljaXQwIj48cHJlPk1hdGNoZXMgYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiB0aGF0IGhhcyBiZWVuIGltcGxpY2l0bHkgYWRkZWQKIGJ5IHRoZSBjb21waWxlciAoZWcuIGltcGxpY2l0IGRlZmF1bHRjb3B5IGNvbnN0cnVjdG9ycykuCkBAIC0xNDIyLDYgKzE0MjcsMTggQEAKIDwvcHJlPjwvdGQ+PC90cj4KIAogCis8dHI+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNYWE1ldGhvZERlY2wuaHRtbCI+Q1hYTWV0aG9kRGVjbDwvYT4mZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnaXNQdXJlMCcpIj48YSBuYW1lPSJpc1B1cmUwQW5jaG9yIj5pc1B1cmU8L2E+PC90ZD48dGQ+PC90ZD48L3RyPgorPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0iaXNQdXJlMCI+PHByZT5NYXRjaGVzIGlmIHRoZSBnaXZlbiBtZXRob2QgZGVjbGFyYXRpb24gaXMgcHVyZS4KKworR2l2ZW4KKyAgY2xhc3MgQSB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIHgoKSA9IDA7CisgIH07CisgIG1hdGNoZXMgQTo6eAorPC9wcmU+PC90ZD48L3RyPgorCisKIDx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ1hYTWV0aG9kRGVjbC5odG1sIj5DWFhNZXRob2REZWNsPC9hPiZndDs8L3RkPjx0ZCBjbGFzcz0ibmFtZSIgb25jbGljaz0idG9nZ2xlKCdpc1ZpcnR1YWwwJykiPjxhIG5hbWU9ImlzVmlydHVhbDBBbmNob3IiPmlzVmlydHVhbDwvYT48L3RkPjx0ZD48L3RkPjwvdHI+CiA8dHI+PHRkIGNvbHNwYW49IjQiIGNsYXNzPSJkb2MiIGlkPSJpc1ZpcnR1YWwwIj48cHJlPk1hdGNoZXMgaWYgdGhlIGdpdmVuIG1ldGhvZCBkZWNsYXJhdGlvbiBpcyB2aXJ0dWFsLgogCkBAIC0yMDI2LDI0ICsyMDQzLDYgQEAKIDwvcHJlPjwvdGQ+PC90cj4KIAogCi08dHI+PHRkPk1hdGNoZXImbHQ7KiZndDs8L3RkPjx0ZCBjbGFzcz0ibmFtZSIgb25jbGljaz0idG9nZ2xlKCdmb3JFYWNoMCcpIj48YSBuYW1lPSJmb3JFYWNoMEFuY2hvciI+Zm9yRWFjaDwvYT48L3RkPjx0ZD5NYXRjaGVyJmx0OyomZ3Q7PC90ZD48L3RyPgotPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0iZm9yRWFjaDAiPjxwcmU+TWF0Y2hlcyBBU1Qgbm9kZXMgdGhhdCBoYXZlIGNoaWxkIEFTVCBub2RlcyB0aGF0IG1hdGNoIHRoZQotcHJvdmlkZWQgbWF0Y2hlci4KLQotRXhhbXBsZSBtYXRjaGVzIFgsIFkgKG1hdGNoZXIgPSByZWNvcmREZWNsKGZvckVhY2gocmVjb3JkRGVjbChoYXNOYW1lKCJYIikpKQotICBjbGFzcyBYIHt9OyAgTWF0Y2hlcyBYLCBiZWNhdXNlIFg6OlggaXMgYSBjbGFzcyBvZiBuYW1lIFggaW5zaWRlIFguCi0gIGNsYXNzIFkgeyBjbGFzcyBYIHt9OyB9OwotICBjbGFzcyBaIHsgY2xhc3MgWSB7IGNsYXNzIFgge307IH07IH07ICBEb2VzIG5vdCBtYXRjaCBaLgotCi1DaGlsZFQgbXVzdCBiZSBhbiBBU1QgYmFzZSB0eXBlLgotCi1BcyBvcHBvc2VkIHRvICdoYXMnLCAnZm9yRWFjaCcgd2lsbCBjYXVzZSBhIG1hdGNoIGZvciBlYWNoIHJlc3VsdCB0aGF0Ci1tYXRjaGVzIGluc3RlYWQgb2Ygb25seSBvbiB0aGUgZmlyc3Qgb25lLgotCi1Vc2FibGUgYXM6IEFueSBNYXRjaGVyCi08L3ByZT48L3RkPjwvdHI+Ci0KLQogPHRyPjx0ZD5NYXRjaGVyJmx0OyomZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnZm9yRWFjaERlc2NlbmRhbnQwJykiPjxhIG5hbWU9ImZvckVhY2hEZXNjZW5kYW50MEFuY2hvciI+Zm9yRWFjaERlc2NlbmRhbnQ8L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDsqJmd0OzwvdGQ+PC90cj4KIDx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9ImZvckVhY2hEZXNjZW5kYW50MCI+PHByZT5NYXRjaGVzIEFTVCBub2RlcyB0aGF0IGhhdmUgZGVzY2VuZGFudCBBU1Qgbm9kZXMgdGhhdCBtYXRjaCB0aGUKIHByb3ZpZGVkIG1hdGNoZXIuCkBAIC0yMDY4LDE3ICsyMDY3LDIwIEBACiA8L3ByZT48L3RkPjwvdHI+CiAKIAotPHRyPjx0ZD5NYXRjaGVyJmx0OyomZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnaGFzMCcpIj48YSBuYW1lPSJoYXMwQW5jaG9yIj5oYXM8L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDsqJmd0OzwvdGQ+PC90cj4KLTx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9ImhhczAiPjxwcmU+TWF0Y2hlcyBBU1Qgbm9kZXMgdGhhdCBoYXZlIGNoaWxkIEFTVCBub2RlcyB0aGF0IG1hdGNoIHRoZQorPHRyPjx0ZD5NYXRjaGVyJmx0OyomZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnZm9yRWFjaDAnKSI+PGEgbmFtZT0iZm9yRWFjaDBBbmNob3IiPmZvckVhY2g8L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDsqJmd0OzwvdGQ+PC90cj4KKzx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9ImZvckVhY2gwIj48cHJlPk1hdGNoZXMgQVNUIG5vZGVzIHRoYXQgaGF2ZSBjaGlsZCBBU1Qgbm9kZXMgdGhhdCBtYXRjaCB0aGUKIHByb3ZpZGVkIG1hdGNoZXIuCiAKLUV4YW1wbGUgbWF0Y2hlcyBYLCBZIChtYXRjaGVyID0gcmVjb3JkRGVjbChoYXMocmVjb3JkRGVjbChoYXNOYW1lKCJYIikpKQorRXhhbXBsZSBtYXRjaGVzIFgsIFkgKG1hdGNoZXIgPSByZWNvcmREZWNsKGZvckVhY2gocmVjb3JkRGVjbChoYXNOYW1lKCJYIikpKQogICBjbGFzcyBYIHt9OyAgTWF0Y2hlcyBYLCBiZWNhdXNlIFg6OlggaXMgYSBjbGFzcyBvZiBuYW1lIFggaW5zaWRlIFguCiAgIGNsYXNzIFkgeyBjbGFzcyBYIHt9OyB9OwogICBjbGFzcyBaIHsgY2xhc3MgWSB7IGNsYXNzIFgge307IH07IH07ICBEb2VzIG5vdCBtYXRjaCBaLgogCiBDaGlsZFQgbXVzdCBiZSBhbiBBU1QgYmFzZSB0eXBlLgogCitBcyBvcHBvc2VkIHRvICdoYXMnLCAnZm9yRWFjaCcgd2lsbCBjYXVzZSBhIG1hdGNoIGZvciBlYWNoIHJlc3VsdCB0aGF0CittYXRjaGVzIGluc3RlYWQgb2Ygb25seSBvbiB0aGUgZmlyc3Qgb25lLgorCiBVc2FibGUgYXM6IEFueSBNYXRjaGVyCiA8L3ByZT48L3RkPjwvdHI+CiAKQEAgLTIxMTIsNiArMjExNCwyMSBAQAogPC9wcmU+PC90ZD48L3RyPgogCiAKKzx0cj48dGQ+TWF0Y2hlciZsdDsqJmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ2hhczAnKSI+PGEgbmFtZT0iaGFzMEFuY2hvciI+aGFzPC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ7KiZndDs8L3RkPjwvdHI+Cis8dHI+PHRkIGNvbHNwYW49IjQiIGNsYXNzPSJkb2MiIGlkPSJoYXMwIj48cHJlPk1hdGNoZXMgQVNUIG5vZGVzIHRoYXQgaGF2ZSBjaGlsZCBBU1Qgbm9kZXMgdGhhdCBtYXRjaCB0aGUKK3Byb3ZpZGVkIG1hdGNoZXIuCisKK0V4YW1wbGUgbWF0Y2hlcyBYLCBZIChtYXRjaGVyID0gcmVjb3JkRGVjbChoYXMocmVjb3JkRGVjbChoYXNOYW1lKCJYIikpKQorICBjbGFzcyBYIHt9OyAgTWF0Y2hlcyBYLCBiZWNhdXNlIFg6OlggaXMgYSBjbGFzcyBvZiBuYW1lIFggaW5zaWRlIFguCisgIGNsYXNzIFkgeyBjbGFzcyBYIHt9OyB9OworICBjbGFzcyBaIHsgY2xhc3MgWSB7IGNsYXNzIFgge307IH07IH07ICBEb2VzIG5vdCBtYXRjaCBaLgorCitDaGlsZFQgbXVzdCBiZSBhbiBBU1QgYmFzZSB0eXBlLgorCitVc2FibGUgYXM6IEFueSBNYXRjaGVyCis8L3ByZT48L3RkPjwvdHI+CisKKwogPHRyPjx0ZD5NYXRjaGVyJmx0OyomZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnaGFzUGFyZW50MCcpIj48YSBuYW1lPSJoYXNQYXJlbnQwQW5jaG9yIj5oYXNQYXJlbnQ8L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDsqJmd0OzwvdGQ+PC90cj4KIDx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9Imhhc1BhcmVudDAiPjxwcmU+TWF0Y2hlcyBBU1Qgbm9kZXMgdGhhdCBoYXZlIGEgcGFyZW50IHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQKIG1hdGNoZXIuCkBAIC0yMzEzLDggKzIzMzAsNiBAQAogCiBBbHNvIHVzYWJsZSBhcyBNYXRjaGVyJmx0O1QmZ3Q7IGZvciBhbnkgVCBzdXBwb3J0aW5nIHRoZSBnZXREZWNsKCkgbWVtYmVyCiBmdW5jdGlvbi4gZS5nLiB2YXJpb3VzIHN1YnR5cGVzIG9mIGNsYW5nOjpUeXBlIGFuZCB2YXJpb3VzIGV4cHJlc3Npb25zLgotRklYTUU6IEFkZCBhbGwgbm9kZSB0eXBlcyBmb3Igd2hpY2ggdGhpcyBpcyBtYXRjaGVyIGlzIHVzYWJsZSBkdWUgdG8KLWdldERlY2woKS4KIAogVXNhYmxlIGFzOiBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDYWxsRXhwci5odG1sIj5DYWxsRXhwcjwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDWFhDb25zdHJ1Y3RFeHByLmh0bWwiPkNYWENvbnN0cnVjdEV4cHI8L2E+Jmd0OywKICAgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRGVjbFJlZkV4cHIuaHRtbCI+RGVjbFJlZkV4cHI8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRW51bVR5cGUuaHRtbCI+RW51bVR5cGU8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xSW5qZWN0ZWRDbGFzc05hbWVUeXBlLmh0bWwiPkluamVjdGVkQ2xhc3NOYW1lVHlwZTwvYT4mZ3Q7LApAQCAtMjM3OCw2ICsyMzkzLDIwIEBACiA8L3ByZT48L3RkPjwvdHI+CiAKIAorPHRyPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDWFhGb3JSYW5nZVN0bXQuaHRtbCI+Q1hYRm9yUmFuZ2VTdG10PC9hPiZndDs8L3RkPjx0ZCBjbGFzcz0ibmFtZSIgb25jbGljaz0idG9nZ2xlKCdoYXNMb29wVmFyaWFibGUwJykiPjxhIG5hbWU9Imhhc0xvb3BWYXJpYWJsZTBBbmNob3IiPmhhc0xvb3BWYXJpYWJsZTwvYT48L3RkPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFWYXJEZWNsLmh0bWwiPlZhckRlY2w8L2E+Jmd0OyBJbm5lck1hdGNoZXI8L3RkPjwvdHI+Cis8dHI+PHRkIGNvbHNwYW49IjQiIGNsYXNzPSJkb2MiIGlkPSJoYXNMb29wVmFyaWFibGUwIj48cHJlPk1hdGNoZXMgdGhlIGluaXRpYWxpemF0aW9uIHN0YXRlbWVudCBvZiBhIGZvciBsb29wLgorCitFeGFtcGxlOgorICAgIGZvclN0bXQoaGFzTG9vcFZhcmlhYmxlKGFueXRoaW5nKCkpKQorbWF0Y2hlcyAnaW50IHgnIGluCisgICAgZm9yIChpbnQgeCA6IGEpIHsgfQorPC9wcmU+PC90ZD48L3RyPgorCisKKzx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ1hYTWVtYmVyQ2FsbEV4cHIuaHRtbCI+Q1hYTWVtYmVyQ2FsbEV4cHI8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ29uSW1wbGljaXRPYmplY3RBcmd1bWVudDAnKSI+PGEgbmFtZT0ib25JbXBsaWNpdE9iamVjdEFyZ3VtZW50MEFuY2hvciI+b25JbXBsaWNpdE9iamVjdEFyZ3VtZW50PC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUV4cHIuaHRtbCI+RXhwcjwvYT4mZ3Q7IElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KKzx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9Im9uSW1wbGljaXRPYmplY3RBcmd1bWVudDAiPjxwcmU+PC9wcmU+PC90ZD48L3RyPgorCisKIDx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ1hYTWVtYmVyQ2FsbEV4cHIuaHRtbCI+Q1hYTWVtYmVyQ2FsbEV4cHI8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ29uMCcpIj48YSBuYW1lPSJvbjBBbmNob3IiPm9uPC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUV4cHIuaHRtbCI+RXhwcjwvYT4mZ3Q7IElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KIDx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9Im9uMCI+PHByZT5NYXRjaGVzIG9uIHRoZSBpbXBsaWNpdCBvYmplY3QgYXJndW1lbnQgb2YgYSBtZW1iZXIgY2FsbCBleHByZXNzaW9uLgogCkBAIC0yMzg5LDE1ICsyNDE4LDE3IEBACiA8L3ByZT48L3RkPjwvdHI+CiAKIAotPHRyPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDWFhNZW1iZXJDYWxsRXhwci5odG1sIj5DWFhNZW1iZXJDYWxsRXhwcjwvYT4mZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnb25JbXBsaWNpdE9iamVjdEFyZ3VtZW50MCcpIj48YSBuYW1lPSJvbkltcGxpY2l0T2JqZWN0QXJndW1lbnQwQW5jaG9yIj5vbkltcGxpY2l0T2JqZWN0QXJndW1lbnQ8L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRXhwci5odG1sIj5FeHByPC9hPiZndDsgSW5uZXJNYXRjaGVyPC90ZD48L3RyPgotPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0ib25JbXBsaWNpdE9iamVjdEFyZ3VtZW50MCI+PHByZT48L3ByZT48L3RkPjwvdHI+Ci0KLQogPHRyPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDWFhNZW1iZXJDYWxsRXhwci5odG1sIj5DWFhNZW1iZXJDYWxsRXhwcjwvYT4mZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgndGhpc1BvaW50ZXJUeXBlMScpIj48YSBuYW1lPSJ0aGlzUG9pbnRlclR5cGUxQW5jaG9yIj50aGlzUG9pbnRlclR5cGU8L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRGVjbC5odG1sIj5EZWNsPC9hPiZndDsgSW5uZXJNYXRjaGVyPC90ZD48L3RyPgogPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0idGhpc1BvaW50ZXJUeXBlMSI+PHByZT5PdmVybG9hZGVkIHRvIG1hdGNoIHRoZSB0eXBlJ3MgZGVjbGFyYXRpb24uCiA8L3ByZT48L3RkPjwvdHI+CiAKIAorPHRyPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDWFhNZW1iZXJDYWxsRXhwci5odG1sIj5DWFhNZW1iZXJDYWxsRXhwcjwvYT4mZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgndGhpc1BvaW50ZXJUeXBlMCcpIj48YSBuYW1lPSJ0aGlzUG9pbnRlclR5cGUwQW5jaG9yIj50aGlzUG9pbnRlclR5cGU8L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xUXVhbFR5cGUuaHRtbCI+UXVhbFR5cGU8L2E+Jmd0OyBJbm5lck1hdGNoZXI8L3RkPjwvdHI+Cis8dHI+PHRkIGNvbHNwYW49IjQiIGNsYXNzPSJkb2MiIGlkPSJ0aGlzUG9pbnRlclR5cGUwIj48cHJlPk1hdGNoZXMgaWYgdGhlIGV4cHJlc3Npb24ncyB0eXBlIGVpdGhlciBtYXRjaGVzIHRoZSBzcGVjaWZpZWQKK21hdGNoZXIsIG9yIGlzIGEgcG9pbnRlciB0byBhIHR5cGUgdGhhdCBtYXRjaGVzIHRoZSBJbm5lck1hdGNoZXIuCis8L3ByZT48L3RkPjwvdHI+CisKKwogPHRyPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDWFhNZXRob2REZWNsLmh0bWwiPkNYWE1ldGhvZERlY2w8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ29mQ2xhc3MwJykiPjxhIG5hbWU9Im9mQ2xhc3MwQW5jaG9yIj5vZkNsYXNzPC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNYWFJlY29yZERlY2wuaHRtbCI+Q1hYUmVjb3JkRGVjbDwvYT4mZ3Q7IElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KIDx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9Im9mQ2xhc3MwIj48cHJlPk1hdGNoZXMgdGhlIGNsYXNzIGRlY2xhcmF0aW9uIHRoYXQgdGhlIGdpdmVuIG1ldGhvZCBkZWNsYXJhdGlvbgogYmVsb25ncyB0by4KQEAgLTI0NjYsNiArMjQ5NywyNCBAQAogPC9wcmU+PC90ZD48L3RyPgogCiAKKzx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ2FsbEV4cHIuaHRtbCI+Q2FsbEV4cHI8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ2NhbGxlZTAnKSI+PGEgbmFtZT0iY2FsbGVlMEFuY2hvciI+Y2FsbGVlPC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVN0bXQuaHRtbCI+U3RtdDwvYT4mZ3Q7IElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KKzx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9ImNhbGxlZTAiPjxwcmU+TWF0Y2hlcyBpZiB0aGUgY2FsbCBleHByZXNzaW9uJ3MgY2FsbGVlIGV4cHJlc3Npb24gbWF0Y2hlcy4KKworR2l2ZW4KKyAgY2xhc3MgWSB7IHZvaWQgeCgpIHsgdGhpcy0mZ3Q7eCgpOyB4KCk7IFkgeTsgeS54KCk7IH0gfTsKKyAgdm9pZCBmKCkgeyBmKCk7IH0KK2NhbGxFeHByKGNhbGxlZShleHByKCkpKQorICBtYXRjaGVzIHRoaXMtJmd0O3goKSwgeCgpLCB5LngoKSwgZigpCit3aXRoIGNhbGxlZSguLi4pCisgIG1hdGNoaW5nIHRoaXMtJmd0O3gsIHgsIHkueCwgZiByZXNwZWN0aXZlbHkKKworTm90ZTogQ2FsbGVlIGNhbm5vdCB0YWtlIHRoZSBtb3JlIGdlbmVyYWwgaW50ZXJuYWw6Ok1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUV4cHIuaHRtbCI+RXhwcjwvYT4mZ3Q7CitiZWNhdXNlIHRoaXMgaW50cm9kdWNlcyBhbWJpZ3VvdXMgb3ZlcmxvYWRzIHdpdGggY2FsbHMgdG8gQ2FsbGVlIHRha2luZyBhCitpbnRlcm5hbDo6TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRGVjbC5odG1sIj5EZWNsPC9hPiZndDssIGFzIHRoZSBtYXRjaGVyIGhpZXJhcmNoeSBpcyBwdXJlbHkKK2ltcGxlbWVudGVkIGluIHRlcm1zIG9mIGltcGxpY2l0IGNhc3RzLgorPC9wcmU+PC90ZD48L3RyPgorCisKIDx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ2FsbEV4cHIuaHRtbCI+Q2FsbEV4cHI8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ2hhc0FueUFyZ3VtZW50MCcpIj48YSBuYW1lPSJoYXNBbnlBcmd1bWVudDBBbmNob3IiPmhhc0FueUFyZ3VtZW50PC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUV4cHIuaHRtbCI+RXhwcjwvYT4mZ3Q7IElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KIDx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9Imhhc0FueUFyZ3VtZW50MCI+PHByZT5NYXRjaGVzIGFueSBhcmd1bWVudCBvZiBhIGNhbGwgZXhwcmVzc2lvbiBvciBhIGNvbnN0cnVjdG9yIGNhbGwKIGV4cHJlc3Npb24uCkBAIC0yNTA2LDggKzI1NTUsNiBAQAogCiBBbHNvIHVzYWJsZSBhcyBNYXRjaGVyJmx0O1QmZ3Q7IGZvciBhbnkgVCBzdXBwb3J0aW5nIHRoZSBnZXREZWNsKCkgbWVtYmVyCiBmdW5jdGlvbi4gZS5nLiB2YXJpb3VzIHN1YnR5cGVzIG9mIGNsYW5nOjpUeXBlIGFuZCB2YXJpb3VzIGV4cHJlc3Npb25zLgotRklYTUU6IEFkZCBhbGwgbm9kZSB0eXBlcyBmb3Igd2hpY2ggdGhpcyBpcyBtYXRjaGVyIGlzIHVzYWJsZSBkdWUgdG8KLWdldERlY2woKS4KIAogVXNhYmxlIGFzOiBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDYWxsRXhwci5odG1sIj5DYWxsRXhwcjwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDWFhDb25zdHJ1Y3RFeHByLmh0bWwiPkNYWENvbnN0cnVjdEV4cHI8L2E+Jmd0OywKICAgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRGVjbFJlZkV4cHIuaHRtbCI+RGVjbFJlZkV4cHI8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRW51bVR5cGUuaHRtbCI+RW51bVR5cGU8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xSW5qZWN0ZWRDbGFzc05hbWVUeXBlLmh0bWwiPkluamVjdGVkQ2xhc3NOYW1lVHlwZTwvYT4mZ3Q7LApAQCAtMjY0Nyw4ICsyNjk0LDYgQEAKIAogQWxzbyB1c2FibGUgYXMgTWF0Y2hlciZsdDtUJmd0OyBmb3IgYW55IFQgc3VwcG9ydGluZyB0aGUgZ2V0RGVjbCgpIG1lbWJlcgogZnVuY3Rpb24uIGUuZy4gdmFyaW91cyBzdWJ0eXBlcyBvZiBjbGFuZzo6VHlwZSBhbmQgdmFyaW91cyBleHByZXNzaW9ucy4KLUZJWE1FOiBBZGQgYWxsIG5vZGUgdHlwZXMgZm9yIHdoaWNoIHRoaXMgaXMgbWF0Y2hlciBpcyB1c2FibGUgZHVlIHRvCi1nZXREZWNsKCkuCiAKIFVzYWJsZSBhczogTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ2FsbEV4cHIuaHRtbCI+Q2FsbEV4cHI8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ1hYQ29uc3RydWN0RXhwci5odG1sIj5DWFhDb25zdHJ1Y3RFeHByPC9hPiZndDssCiAgIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMURlY2xSZWZFeHByLmh0bWwiPkRlY2xSZWZFeHByPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUVudW1UeXBlLmh0bWwiPkVudW1UeXBlPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUluamVjdGVkQ2xhc3NOYW1lVHlwZS5odG1sIj5JbmplY3RlZENsYXNzTmFtZVR5cGU8L2E+Jmd0OywKQEAgLTI4MTMsOCArMjg1OCw2IEBACiAKIEFsc28gdXNhYmxlIGFzIE1hdGNoZXImbHQ7VCZndDsgZm9yIGFueSBUIHN1cHBvcnRpbmcgdGhlIGdldERlY2woKSBtZW1iZXIKIGZ1bmN0aW9uLiBlLmcuIHZhcmlvdXMgc3VidHlwZXMgb2YgY2xhbmc6OlR5cGUgYW5kIHZhcmlvdXMgZXhwcmVzc2lvbnMuCi1GSVhNRTogQWRkIGFsbCBub2RlIHR5cGVzIGZvciB3aGljaCB0aGlzIGlzIG1hdGNoZXIgaXMgdXNhYmxlIGR1ZSB0bwotZ2V0RGVjbCgpLgogCiBVc2FibGUgYXM6IE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNhbGxFeHByLmh0bWwiPkNhbGxFeHByPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNYWENvbnN0cnVjdEV4cHIuaHRtbCI+Q1hYQ29uc3RydWN0RXhwcjwvYT4mZ3Q7LAogICBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFEZWNsUmVmRXhwci5odG1sIj5EZWNsUmVmRXhwcjwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFFbnVtVHlwZS5odG1sIj5FbnVtVHlwZTwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFJbmplY3RlZENsYXNzTmFtZVR5cGUuaHRtbCI+SW5qZWN0ZWRDbGFzc05hbWVUeXBlPC9hPiZndDssCkBAIC0yODUyLDYgKzI4OTUsMTcgQEAKIDwvcHJlPjwvdGQ+PC90cj4KIAogCis8dHI+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUV4cHIuaHRtbCI+RXhwcjwvYT4mZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnaGFzVHlwZTAnKSI+PGEgbmFtZT0iaGFzVHlwZTBBbmNob3IiPmhhc1R5cGU8L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xUXVhbFR5cGUuaHRtbCI+UXVhbFR5cGU8L2E+Jmd0OyBJbm5lck1hdGNoZXI8L3RkPjwvdHI+Cis8dHI+PHRkIGNvbHNwYW49IjQiIGNsYXNzPSJkb2MiIGlkPSJoYXNUeXBlMCI+PHByZT5NYXRjaGVzIGlmIHRoZSBleHByZXNzaW9uJ3Mgb3IgZGVjbGFyYXRpb24ncyB0eXBlIG1hdGNoZXMgYSB0eXBlCittYXRjaGVyLgorCitFeGFtcGxlIG1hdGNoZXMgeCAobWF0Y2hlciA9IGV4cHIoaGFzVHlwZShyZWNvcmREZWNsKGhhc05hbWUoIlgiKSkpKSkKKyAgICAgICAgICAgIGFuZCB6IChtYXRjaGVyID0gdmFyRGVjbChoYXNUeXBlKHJlY29yZERlY2woaGFzTmFtZSgiWCIpKSkpKQorIGNsYXNzIFgge307Cisgdm9pZCB5KFggJmFtcDt4KSB7IHg7IFggejsgfQorPC9wcmU+PC90ZD48L3RyPgorCisKIDx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRXhwci5odG1sIj5FeHByPC9hPiZndDs8L3RkPjx0ZCBjbGFzcz0ibmFtZSIgb25jbGljaz0idG9nZ2xlKCdpZ25vcmluZ0ltcENhc3RzMCcpIj48YSBuYW1lPSJpZ25vcmluZ0ltcENhc3RzMEFuY2hvciI+aWdub3JpbmdJbXBDYXN0czwvYT48L3RkPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFFeHByLmh0bWwiPkV4cHI8L2E+Jmd0OyBJbm5lck1hdGNoZXI8L3RkPjwvdHI+CiA8dHI+PHRkIGNvbHNwYW49IjQiIGNsYXNzPSJkb2MiIGlkPSJpZ25vcmluZ0ltcENhc3RzMCI+PHByZT5NYXRjaGVzIGV4cHJlc3Npb25zIHRoYXQgbWF0Y2ggSW5uZXJNYXRjaGVyIGFmdGVyIGFueSBpbXBsaWNpdCBjYXN0cwogYXJlIHN0cmlwcGVkIG9mZi4KQEAgLTMwMzQsOCArMzA4OCw2IEBACiAKIEFsc28gdXNhYmxlIGFzIE1hdGNoZXImbHQ7VCZndDsgZm9yIGFueSBUIHN1cHBvcnRpbmcgdGhlIGdldERlY2woKSBtZW1iZXIKIGZ1bmN0aW9uLiBlLmcuIHZhcmlvdXMgc3VidHlwZXMgb2YgY2xhbmc6OlR5cGUgYW5kIHZhcmlvdXMgZXhwcmVzc2lvbnMuCi1GSVhNRTogQWRkIGFsbCBub2RlIHR5cGVzIGZvciB3aGljaCB0aGlzIGlzIG1hdGNoZXIgaXMgdXNhYmxlIGR1ZSB0bwotZ2V0RGVjbCgpLgogCiBVc2FibGUgYXM6IE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNhbGxFeHByLmh0bWwiPkNhbGxFeHByPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNYWENvbnN0cnVjdEV4cHIuaHRtbCI+Q1hYQ29uc3RydWN0RXhwcjwvYT4mZ3Q7LAogICBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFEZWNsUmVmRXhwci5odG1sIj5EZWNsUmVmRXhwcjwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFFbnVtVHlwZS5odG1sIj5FbnVtVHlwZTwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFJbmplY3RlZENsYXNzTmFtZVR5cGUuaHRtbCI+SW5qZWN0ZWRDbGFzc05hbWVUeXBlPC9hPiZndDssCkBAIC0zMDU4LDggKzMxMTAsNiBAQAogCiBBbHNvIHVzYWJsZSBhcyBNYXRjaGVyJmx0O1QmZ3Q7IGZvciBhbnkgVCBzdXBwb3J0aW5nIHRoZSBnZXREZWNsKCkgbWVtYmVyCiBmdW5jdGlvbi4gZS5nLiB2YXJpb3VzIHN1YnR5cGVzIG9mIGNsYW5nOjpUeXBlIGFuZCB2YXJpb3VzIGV4cHJlc3Npb25zLgotRklYTUU6IEFkZCBhbGwgbm9kZSB0eXBlcyBmb3Igd2hpY2ggdGhpcyBpcyBtYXRjaGVyIGlzIHVzYWJsZSBkdWUgdG8KLWdldERlY2woKS4KIAogVXNhYmxlIGFzOiBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDYWxsRXhwci5odG1sIj5DYWxsRXhwcjwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDWFhDb25zdHJ1Y3RFeHByLmh0bWwiPkNYWENvbnN0cnVjdEV4cHI8L2E+Jmd0OywKICAgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRGVjbFJlZkV4cHIuaHRtbCI+RGVjbFJlZkV4cHI8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRW51bVR5cGUuaHRtbCI+RW51bVR5cGU8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xSW5qZWN0ZWRDbGFzc05hbWVUeXBlLmh0bWwiPkluamVjdGVkQ2xhc3NOYW1lVHlwZTwvYT4mZ3Q7LApAQCAtMzA4Miw4ICszMTMyLDYgQEAKIAogQWxzbyB1c2FibGUgYXMgTWF0Y2hlciZsdDtUJmd0OyBmb3IgYW55IFQgc3VwcG9ydGluZyB0aGUgZ2V0RGVjbCgpIG1lbWJlcgogZnVuY3Rpb24uIGUuZy4gdmFyaW91cyBzdWJ0eXBlcyBvZiBjbGFuZzo6VHlwZSBhbmQgdmFyaW91cyBleHByZXNzaW9ucy4KLUZJWE1FOiBBZGQgYWxsIG5vZGUgdHlwZXMgZm9yIHdoaWNoIHRoaXMgaXMgbWF0Y2hlciBpcyB1c2FibGUgZHVlIHRvCi1nZXREZWNsKCkuCiAKIFVzYWJsZSBhczogTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ2FsbEV4cHIuaHRtbCI+Q2FsbEV4cHI8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ1hYQ29uc3RydWN0RXhwci5odG1sIj5DWFhDb25zdHJ1Y3RFeHByPC9hPiZndDssCiAgIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMURlY2xSZWZFeHByLmh0bWwiPkRlY2xSZWZFeHByPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUVudW1UeXBlLmh0bWwiPkVudW1UeXBlPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUluamVjdGVkQ2xhc3NOYW1lVHlwZS5odG1sIj5JbmplY3RlZENsYXNzTmFtZVR5cGU8L2E+Jmd0OywKQEAgLTMxNjUsMTIgKzMyMTMsNiBAQAogPC9wcmU+PC90ZD48L3RyPgogCiAKLTx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xTmVzdGVkTmFtZVNwZWNpZmllckxvYy5odG1sIj5OZXN0ZWROYW1lU3BlY2lmaWVyTG9jPC9hPiZndDs8L3RkPjx0ZCBjbGFzcz0ibmFtZSIgb25jbGljaz0idG9nZ2xlKCdsb2MxJykiPjxhIG5hbWU9ImxvYzFBbmNob3IiPmxvYzwvYT48L3RkPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFOZXN0ZWROYW1lU3BlY2lmaWVyLmh0bWwiPk5lc3RlZE5hbWVTcGVjaWZpZXI8L2E+Jmd0OyAgSW5uZXJNYXRjaGVyPC90ZD48L3RyPgotPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0ibG9jMSI+PHByZT5NYXRjaGVzIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2NzIGZvciB3aGljaCB0aGUgZ2l2ZW4gaW5uZXIKLU5lc3RlZE5hbWVTcGVjaWZpZXItbWF0Y2hlciBtYXRjaGVzLgotPC9wcmU+PC90ZD48L3RyPgotCi0KIDx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xTmVzdGVkTmFtZVNwZWNpZmllckxvYy5odG1sIj5OZXN0ZWROYW1lU3BlY2lmaWVyTG9jPC9hPiZndDs8L3RkPjx0ZCBjbGFzcz0ibmFtZSIgb25jbGljaz0idG9nZ2xlKCdzcGVjaWZpZXNUeXBlTG9jMCcpIj48YSBuYW1lPSJzcGVjaWZpZXNUeXBlTG9jMEFuY2hvciI+c3BlY2lmaWVzVHlwZUxvYzwvYT48L3RkPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFUeXBlTG9jLmh0bWwiPlR5cGVMb2M8L2E+Jmd0OyBJbm5lck1hdGNoZXI8L3RkPjwvdHI+CiA8dHI+PHRkIGNvbHNwYW49IjQiIGNsYXNzPSJkb2MiIGlkPSJzcGVjaWZpZXNUeXBlTG9jMCI+PHByZT5NYXRjaGVzIG5lc3RlZCBuYW1lIHNwZWNpZmllciBsb2NzIHRoYXQgc3BlY2lmeSBhIHR5cGUgbWF0Y2hpbmcgdGhlCiBnaXZlbiBUeXBlTG9jLgpAQCAtMzI5MCw4ICszMzMyLDYgQEAKIAogQWxzbyB1c2FibGUgYXMgTWF0Y2hlciZsdDtUJmd0OyBmb3IgYW55IFQgc3VwcG9ydGluZyB0aGUgZ2V0RGVjbCgpIG1lbWJlcgogZnVuY3Rpb24uIGUuZy4gdmFyaW91cyBzdWJ0eXBlcyBvZiBjbGFuZzo6VHlwZSBhbmQgdmFyaW91cyBleHByZXNzaW9ucy4KLUZJWE1FOiBBZGQgYWxsIG5vZGUgdHlwZXMgZm9yIHdoaWNoIHRoaXMgaXMgbWF0Y2hlciBpcyB1c2FibGUgZHVlIHRvCi1nZXREZWNsKCkuCiAKIFVzYWJsZSBhczogTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ2FsbEV4cHIuaHRtbCI+Q2FsbEV4cHI8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ1hYQ29uc3RydWN0RXhwci5odG1sIj5DWFhDb25zdHJ1Y3RFeHByPC9hPiZndDssCiAgIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMURlY2xSZWZFeHByLmh0bWwiPkRlY2xSZWZFeHByPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUVudW1UeXBlLmh0bWwiPkVudW1UeXBlPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUluamVjdGVkQ2xhc3NOYW1lVHlwZS5odG1sIj5JbmplY3RlZENsYXNzTmFtZVR5cGU8L2E+Jmd0OywKQEAgLTMzMDcsMTEgKzMzNDcsMzYgQEAKIDwvcHJlPjwvdGQ+PC90cj4KIAogCis8dHI+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVF1YWxUeXBlLmh0bWwiPlF1YWxUeXBlPC9hPiZndDs8L3RkPjx0ZCBjbGFzcz0ibmFtZSIgb25jbGljaz0idG9nZ2xlKCdwb2ludHNUbzAnKSI+PGEgbmFtZT0icG9pbnRzVG8wQW5jaG9yIj5wb2ludHNUbzwvYT48L3RkPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFRdWFsVHlwZS5odG1sIj5RdWFsVHlwZTwvYT4mZ3Q7IElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KKzx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9InBvaW50c1RvMCI+PHByZT5NYXRjaGVzIGlmIHRoZSBtYXRjaGVkIHR5cGUgaXMgYSBwb2ludGVyIHR5cGUgYW5kIHRoZSBwb2ludGVlIHR5cGUKK21hdGNoZXMgdGhlIHNwZWNpZmllZCBtYXRjaGVyLgorCitFeGFtcGxlIG1hdGNoZXMgeS0mZ3Q7eCgpCisgICAgKG1hdGNoZXIgPSBjYWxsRXhwcihvbihoYXNUeXBlKHBvaW50c1RvKHJlY29yZERlY2woaGFzTmFtZSgiWSIpKSkpKSkpCisgIGNsYXNzIFkgeyBwdWJsaWM6IHZvaWQgeCgpOyB9OworICB2b2lkIHooKSB7IFkgKnk7IHktJmd0O3goKTsgfQorPC9wcmU+PC90ZD48L3RyPgorCisKIDx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xUXVhbFR5cGUuaHRtbCI+UXVhbFR5cGU8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ3JlZmVyZW5jZXMxJykiPjxhIG5hbWU9InJlZmVyZW5jZXMxQW5jaG9yIj5yZWZlcmVuY2VzPC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMURlY2wuaHRtbCI+RGVjbDwvYT4mZ3Q7IElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KIDx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9InJlZmVyZW5jZXMxIj48cHJlPk92ZXJsb2FkZWQgdG8gbWF0Y2ggdGhlIHJlZmVyZW5jZWQgdHlwZSdzIGRlY2xhcmF0aW9uLgogPC9wcmU+PC90ZD48L3RyPgogCiAKKzx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xUXVhbFR5cGUuaHRtbCI+UXVhbFR5cGU8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ3JlZmVyZW5jZXMwJykiPjxhIG5hbWU9InJlZmVyZW5jZXMwQW5jaG9yIj5yZWZlcmVuY2VzPC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVF1YWxUeXBlLmh0bWwiPlF1YWxUeXBlPC9hPiZndDsgSW5uZXJNYXRjaGVyPC90ZD48L3RyPgorPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0icmVmZXJlbmNlczAiPjxwcmU+TWF0Y2hlcyBpZiB0aGUgbWF0Y2hlZCB0eXBlIGlzIGEgcmVmZXJlbmNlIHR5cGUgYW5kIHRoZSByZWZlcmVuY2VkCit0eXBlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBtYXRjaGVyLgorCitFeGFtcGxlIG1hdGNoZXMgWCAmYW1wO3ggYW5kIGNvbnN0IFggJmFtcDt5CisgICAgKG1hdGNoZXIgPSB2YXJEZWNsKGhhc1R5cGUocmVmZXJlbmNlcyhyZWNvcmREZWNsKGhhc05hbWUoIlgiKSkpKSkpCisgIGNsYXNzIFggeworICAgIHZvaWQgYShYIGIpIHsKKyAgICAgIFggJmFtcDt4ID0gYjsKKyAgICAgIGNvbnN0IFggJmFtcDt5ID0gYjsKKyAgfTsKKzwvcHJlPjwvdGQ+PC90cj4KKworCiA8dHI+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVJlY29yZFR5cGUuaHRtbCI+UmVjb3JkVHlwZTwvYT4mZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnaGFzRGVjbGFyYXRpb241JykiPjxhIG5hbWU9Imhhc0RlY2xhcmF0aW9uNUFuY2hvciI+aGFzRGVjbGFyYXRpb248L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRGVjbC5odG1sIj5EZWNsPC9hPiZndDsgIElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KIDx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9Imhhc0RlY2xhcmF0aW9uNSI+PHByZT5NYXRjaGVzIGEgbm9kZSBpZiB0aGUgZGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoYXQgbm9kZQogbWF0Y2hlcyB0aGUgZ2l2ZW4gbWF0Y2hlci4KQEAgLTMzMjQsOCArMzM4OSw2IEBACiAKIEFsc28gdXNhYmxlIGFzIE1hdGNoZXImbHQ7VCZndDsgZm9yIGFueSBUIHN1cHBvcnRpbmcgdGhlIGdldERlY2woKSBtZW1iZXIKIGZ1bmN0aW9uLiBlLmcuIHZhcmlvdXMgc3VidHlwZXMgb2YgY2xhbmc6OlR5cGUgYW5kIHZhcmlvdXMgZXhwcmVzc2lvbnMuCi1GSVhNRTogQWRkIGFsbCBub2RlIHR5cGVzIGZvciB3aGljaCB0aGlzIGlzIG1hdGNoZXIgaXMgdXNhYmxlIGR1ZSB0bwotZ2V0RGVjbCgpLgogCiBVc2FibGUgYXM6IE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNhbGxFeHByLmh0bWwiPkNhbGxFeHByPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNYWENvbnN0cnVjdEV4cHIuaHRtbCI+Q1hYQ29uc3RydWN0RXhwcjwvYT4mZ3Q7LAogICBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFEZWNsUmVmRXhwci5odG1sIj5EZWNsUmVmRXhwcjwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFFbnVtVHlwZS5odG1sIj5FbnVtVHlwZTwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFJbmplY3RlZENsYXNzTmFtZVR5cGUuaHRtbCI+SW5qZWN0ZWRDbGFzc05hbWVUeXBlPC9hPiZndDssCkBAIC0zNDA1LDggKzM0NjgsNiBAQAogCiBBbHNvIHVzYWJsZSBhcyBNYXRjaGVyJmx0O1QmZ3Q7IGZvciBhbnkgVCBzdXBwb3J0aW5nIHRoZSBnZXREZWNsKCkgbWVtYmVyCiBmdW5jdGlvbi4gZS5nLiB2YXJpb3VzIHN1YnR5cGVzIG9mIGNsYW5nOjpUeXBlIGFuZCB2YXJpb3VzIGV4cHJlc3Npb25zLgotRklYTUU6IEFkZCBhbGwgbm9kZSB0eXBlcyBmb3Igd2hpY2ggdGhpcyBpcyBtYXRjaGVyIGlzIHVzYWJsZSBkdWUgdG8KLWdldERlY2woKS4KIAogVXNhYmxlIGFzOiBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDYWxsRXhwci5odG1sIj5DYWxsRXhwcjwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDWFhDb25zdHJ1Y3RFeHByLmh0bWwiPkNYWENvbnN0cnVjdEV4cHI8L2E+Jmd0OywKICAgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRGVjbFJlZkV4cHIuaHRtbCI+RGVjbFJlZkV4cHI8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRW51bVR5cGUuaHRtbCI+RW51bVR5cGU8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xSW5qZWN0ZWRDbGFzc05hbWVUeXBlLmh0bWwiPkluamVjdGVkQ2xhc3NOYW1lVHlwZTwvYT4mZ3Q7LApAQCAtMzQxNyw4ICszNDc4LDIzIEBACiA8L3ByZT48L3RkPjwvdHI+CiAKIAorPHRyPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFUZW1wbGF0ZUFyZ3VtZW50Lmh0bWwiPlRlbXBsYXRlQXJndW1lbnQ8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ2lzRXhwcjAnKSI+PGEgbmFtZT0iaXNFeHByMEFuY2hvciI+aXNFeHByPC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUV4cHIuaHRtbCI+RXhwcjwvYT4mZ3Q7IElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KKzx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9ImlzRXhwcjAiPjxwcmU+TWF0Y2hlcyBhIHN1Z2FyIFRlbXBsYXRlQXJndW1lbnQgdGhhdCByZWZlcnMgdG8gYSBjZXJ0YWluIGV4cHJlc3Npb24uCisKK0dpdmVuCisgIHRlbXBsYXRlJmx0O3R5cGVuYW1lIFQmZ3Q7IHN0cnVjdCBBIHt9OworICBzdHJ1Y3QgQiB7IEIqIG5leHQ7IH07CisgIEEmbHQ7JmFtcDtCOjpuZXh0Jmd0OyBhOwordGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUoaGFzQW55VGVtcGxhdGVBcmd1bWVudCgKKyAgaXNFeHByKGhhc0Rlc2NlbmRhbnQoZGVjbFJlZkV4cHIodG8oZmllbGREZWNsKGhhc05hbWUoIm5leHQiKSkpKSkpKSkKKyAgbWF0Y2hlcyB0aGUgc3BlY2lhbGl6YXRpb24gQSZsdDsmYW1wO0I6Om5leHQmZ3Q7IHdpdGggZmllbGREZWNsKC4uLikgbWF0Y2hpbmcKKyAgICBCOjpuZXh0Cis8L3ByZT48L3RkPjwvdHI+CisKKwogPHRyPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFUZW1wbGF0ZUFyZ3VtZW50Lmh0bWwiPlRlbXBsYXRlQXJndW1lbnQ8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ3JlZmVyc1RvRGVjbGFyYXRpb24wJykiPjxhIG5hbWU9InJlZmVyc1RvRGVjbGFyYXRpb24wQW5jaG9yIj5yZWZlcnNUb0RlY2xhcmF0aW9uPC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMURlY2wuaHRtbCI+RGVjbDwvYT4mZ3Q7IElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KLTx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9InJlZmVyc1RvRGVjbGFyYXRpb24wIj48cHJlPk1hdGNoZXMgYSBUZW1wbGF0ZUFyZ3VtZW50IHRoYXQgcmVmZXJzIHRvIGEgY2VydGFpbiBkZWNsYXJhdGlvbi4KKzx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9InJlZmVyc1RvRGVjbGFyYXRpb24wIj48cHJlPk1hdGNoZXMgYSBjYW5vbmljYWwgVGVtcGxhdGVBcmd1bWVudCB0aGF0IHJlZmVycyB0byBhIGNlcnRhaW4KK2RlY2xhcmF0aW9uLgogCiBHaXZlbgogICB0ZW1wbGF0ZSZsdDt0eXBlbmFtZSBUJmd0OyBzdHJ1Y3QgQSB7fTsKQEAgLTM0NDQsNiArMzUyMCwyMCBAQAogPC9wcmU+PC90ZD48L3RyPgogCiAKKzx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUuaHRtbCI+VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGU8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ2hhc0FueVRlbXBsYXRlQXJndW1lbnQxJykiPjxhIG5hbWU9Imhhc0FueVRlbXBsYXRlQXJndW1lbnQxQW5jaG9yIj5oYXNBbnlUZW1wbGF0ZUFyZ3VtZW50PC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVRlbXBsYXRlQXJndW1lbnQuaHRtbCI+VGVtcGxhdGVBcmd1bWVudDwvYT4mZ3Q7IElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KKzx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9Imhhc0FueVRlbXBsYXRlQXJndW1lbnQxIj48cHJlPk1hdGNoZXMgY2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9ucyB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lCitUZW1wbGF0ZUFyZ3VtZW50IG1hdGNoaW5nIHRoZSBnaXZlbiBJbm5lck1hdGNoZXIuCisKK0dpdmVuCisgIHRlbXBsYXRlJmx0O3R5cGVuYW1lIFQmZ3Q7IGNsYXNzIEEge307CisgIHRlbXBsYXRlJmx0OyZndDsgY2xhc3MgQSZsdDtkb3VibGUmZ3Q7IHt9OworICBBJmx0O2ludCZndDsgYTsKK2NsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2woaGFzQW55VGVtcGxhdGVBcmd1bWVudCgKKyAgICByZWZlcnNUb1R5cGUoYXNTdHJpbmcoImludCIpKSkpCisgIG1hdGNoZXMgdGhlIHNwZWNpYWxpemF0aW9uIEEmbHQ7aW50Jmd0OworPC9wcmU+PC90ZD48L3RyPgorCisKIDx0cj48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUuaHRtbCI+VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGU8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ2hhc0RlY2xhcmF0aW9uMycpIj48YSBuYW1lPSJoYXNEZWNsYXJhdGlvbjNBbmNob3IiPmhhc0RlY2xhcmF0aW9uPC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMURlY2wuaHRtbCI+RGVjbDwvYT4mZ3Q7ICBJbm5lck1hdGNoZXI8L3RkPjwvdHI+CiA8dHI+PHRkIGNvbHNwYW49IjQiIGNsYXNzPSJkb2MiIGlkPSJoYXNEZWNsYXJhdGlvbjMiPjxwcmU+TWF0Y2hlcyBhIG5vZGUgaWYgdGhlIGRlY2xhcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGF0IG5vZGUKIG1hdGNoZXMgdGhlIGdpdmVuIG1hdGNoZXIuCkBAIC0zNDU2LDggKzM1NDYsNiBAQAogCiBBbHNvIHVzYWJsZSBhcyBNYXRjaGVyJmx0O1QmZ3Q7IGZvciBhbnkgVCBzdXBwb3J0aW5nIHRoZSBnZXREZWNsKCkgbWVtYmVyCiBmdW5jdGlvbi4gZS5nLiB2YXJpb3VzIHN1YnR5cGVzIG9mIGNsYW5nOjpUeXBlIGFuZCB2YXJpb3VzIGV4cHJlc3Npb25zLgotRklYTUU6IEFkZCBhbGwgbm9kZSB0eXBlcyBmb3Igd2hpY2ggdGhpcyBpcyBtYXRjaGVyIGlzIHVzYWJsZSBkdWUgdG8KLWdldERlY2woKS4KIAogVXNhYmxlIGFzOiBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDYWxsRXhwci5odG1sIj5DYWxsRXhwcjwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFDWFhDb25zdHJ1Y3RFeHByLmh0bWwiPkNYWENvbnN0cnVjdEV4cHI8L2E+Jmd0OywKICAgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRGVjbFJlZkV4cHIuaHRtbCI+RGVjbFJlZkV4cHI8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRW51bVR5cGUuaHRtbCI+RW51bVR5cGU8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xSW5qZWN0ZWRDbGFzc05hbWVUeXBlLmh0bWwiPkluamVjdGVkQ2xhc3NOYW1lVHlwZTwvYT4mZ3Q7LApAQCAtMzQ2OCw2ICszNTU2LDIwIEBACiA8L3ByZT48L3RkPjwvdHI+CiAKIAorPHRyPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZS5odG1sIj5UZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZTwvYT4mZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnaGFzVGVtcGxhdGVBcmd1bWVudDEnKSI+PGEgbmFtZT0iaGFzVGVtcGxhdGVBcmd1bWVudDFBbmNob3IiPmhhc1RlbXBsYXRlQXJndW1lbnQ8L2E+PC90ZD48dGQ+dW5zaWduZWQgTiwgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xVGVtcGxhdGVBcmd1bWVudC5odG1sIj5UZW1wbGF0ZUFyZ3VtZW50PC9hPiZndDsgSW5uZXJNYXRjaGVyPC90ZD48L3RyPgorPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0iaGFzVGVtcGxhdGVBcmd1bWVudDEiPjxwcmU+TWF0Y2hlcyBjbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25zIHdoZXJlIHRoZSBuJ3RoIFRlbXBsYXRlQXJndW1lbnQKK21hdGNoZXMgdGhlIGdpdmVuIElubmVyTWF0Y2hlci4KKworR2l2ZW4KKyAgdGVtcGxhdGUmbHQ7dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSZndDsgY2xhc3MgQSB7fTsKKyAgQSZsdDtib29sLCBpbnQmZ3Q7IGI7CisgIEEmbHQ7aW50LCBib29sJmd0OyBjOworY2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbChoYXNUZW1wbGF0ZUFyZ3VtZW50KAorICAgIDEsIHJlZmVyc1RvVHlwZShhc1N0cmluZygiaW50IikpKSkKKyAgbWF0Y2hlcyB0aGUgc3BlY2lhbGl6YXRpb24gQSZsdDtib29sLCBpbnQmZ3Q7Cis8L3ByZT48L3RkPjwvdHI+CisKKwogPHRyPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFUZW1wbGF0ZVR5cGVQYXJtVHlwZS5odG1sIj5UZW1wbGF0ZVR5cGVQYXJtVHlwZTwvYT4mZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnaGFzRGVjbGFyYXRpb24yJykiPjxhIG5hbWU9Imhhc0RlY2xhcmF0aW9uMkFuY2hvciI+aGFzRGVjbGFyYXRpb248L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRGVjbC5odG1sIj5EZWNsPC9hPiZndDsgIElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KIDx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9Imhhc0RlY2xhcmF0aW9uMiI+PHByZT5NYXRjaGVzIGEgbm9kZSBpZiB0aGUgZGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoYXQgbm9kZQogbWF0Y2hlcyB0aGUgZ2l2ZW4gbWF0Y2hlci4KQEAgLTM0ODAsOCArMzU4Miw2IEBACiAKIEFsc28gdXNhYmxlIGFzIE1hdGNoZXImbHQ7VCZndDsgZm9yIGFueSBUIHN1cHBvcnRpbmcgdGhlIGdldERlY2woKSBtZW1iZXIKIGZ1bmN0aW9uLiBlLmcuIHZhcmlvdXMgc3VidHlwZXMgb2YgY2xhbmc6OlR5cGUgYW5kIHZhcmlvdXMgZXhwcmVzc2lvbnMuCi1GSVhNRTogQWRkIGFsbCBub2RlIHR5cGVzIGZvciB3aGljaCB0aGlzIGlzIG1hdGNoZXIgaXMgdXNhYmxlIGR1ZSB0bwotZ2V0RGVjbCgpLgogCiBVc2FibGUgYXM6IE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNhbGxFeHByLmh0bWwiPkNhbGxFeHByPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNYWENvbnN0cnVjdEV4cHIuaHRtbCI+Q1hYQ29uc3RydWN0RXhwcjwvYT4mZ3Q7LAogICBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFEZWNsUmVmRXhwci5odG1sIj5EZWNsUmVmRXhwcjwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFFbnVtVHlwZS5odG1sIj5FbnVtVHlwZTwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFJbmplY3RlZENsYXNzTmFtZVR5cGUuaHRtbCI+SW5qZWN0ZWRDbGFzc05hbWVUeXBlPC9hPiZndDssCkBAIC0zNTA3LDEyICszNjA3LDYgQEAKIDwvcHJlPjwvdGQ+PC90cj4KIAogCi08dHI+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVR5cGVMb2MuaHRtbCI+VHlwZUxvYzwvYT4mZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnbG9jMCcpIj48YSBuYW1lPSJsb2MwQW5jaG9yIj5sb2M8L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xUXVhbFR5cGUuaHRtbCI+UXVhbFR5cGU8L2E+Jmd0OyAgSW5uZXJNYXRjaGVyPC90ZD48L3RyPgotPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0ibG9jMCI+PHByZT5NYXRjaGVzIFR5cGVMb2NzIGZvciB3aGljaCB0aGUgZ2l2ZW4gaW5uZXIKLVF1YWxUeXBlLW1hdGNoZXIgbWF0Y2hlcy4KLTwvcHJlPjwvdGQ+PC90cj4KLQotCiA8dHI+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVR5cGVkZWZUeXBlLmh0bWwiPlR5cGVkZWZUeXBlPC9hPiZndDs8L3RkPjx0ZCBjbGFzcz0ibmFtZSIgb25jbGljaz0idG9nZ2xlKCdoYXNEZWNsYXJhdGlvbjEnKSI+PGEgbmFtZT0iaGFzRGVjbGFyYXRpb24xQW5jaG9yIj5oYXNEZWNsYXJhdGlvbjwvYT48L3RkPjx0ZD5NYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFEZWNsLmh0bWwiPkRlY2w8L2E+Jmd0OyAgSW5uZXJNYXRjaGVyPC90ZD48L3RyPgogPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0iaGFzRGVjbGFyYXRpb24xIj48cHJlPk1hdGNoZXMgYSBub2RlIGlmIHRoZSBkZWNsYXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhhdCBub2RlCiBtYXRjaGVzIHRoZSBnaXZlbiBtYXRjaGVyLgpAQCAtMzUyNSw4ICszNjE5LDYgQEAKIAogQWxzbyB1c2FibGUgYXMgTWF0Y2hlciZsdDtUJmd0OyBmb3IgYW55IFQgc3VwcG9ydGluZyB0aGUgZ2V0RGVjbCgpIG1lbWJlcgogZnVuY3Rpb24uIGUuZy4gdmFyaW91cyBzdWJ0eXBlcyBvZiBjbGFuZzo6VHlwZSBhbmQgdmFyaW91cyBleHByZXNzaW9ucy4KLUZJWE1FOiBBZGQgYWxsIG5vZGUgdHlwZXMgZm9yIHdoaWNoIHRoaXMgaXMgbWF0Y2hlciBpcyB1c2FibGUgZHVlIHRvCi1nZXREZWNsKCkuCiAKIFVzYWJsZSBhczogTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ2FsbEV4cHIuaHRtbCI+Q2FsbEV4cHI8L2E+Jmd0OywgTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ1hYQ29uc3RydWN0RXhwci5odG1sIj5DWFhDb25zdHJ1Y3RFeHByPC9hPiZndDssCiAgIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMURlY2xSZWZFeHByLmh0bWwiPkRlY2xSZWZFeHByPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUVudW1UeXBlLmh0bWwiPkVudW1UeXBlPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUluamVjdGVkQ2xhc3NOYW1lVHlwZS5odG1sIj5JbmplY3RlZENsYXNzTmFtZVR5cGU8L2E+Jmd0OywKQEAgLTM1NjcsOCArMzY1OSw2IEBACiAKIEFsc28gdXNhYmxlIGFzIE1hdGNoZXImbHQ7VCZndDsgZm9yIGFueSBUIHN1cHBvcnRpbmcgdGhlIGdldERlY2woKSBtZW1iZXIKIGZ1bmN0aW9uLiBlLmcuIHZhcmlvdXMgc3VidHlwZXMgb2YgY2xhbmc6OlR5cGUgYW5kIHZhcmlvdXMgZXhwcmVzc2lvbnMuCi1GSVhNRTogQWRkIGFsbCBub2RlIHR5cGVzIGZvciB3aGljaCB0aGlzIGlzIG1hdGNoZXIgaXMgdXNhYmxlIGR1ZSB0bwotZ2V0RGVjbCgpLgogCiBVc2FibGUgYXM6IE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNhbGxFeHByLmh0bWwiPkNhbGxFeHByPC9hPiZndDssIE1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNYWENvbnN0cnVjdEV4cHIuaHRtbCI+Q1hYQ29uc3RydWN0RXhwcjwvYT4mZ3Q7LAogICBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFEZWNsUmVmRXhwci5odG1sIj5EZWNsUmVmRXhwcjwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFFbnVtVHlwZS5odG1sIj5FbnVtVHlwZTwvYT4mZ3Q7LCBNYXRjaGVyJmx0PGEgaHJlZj0iaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFJbmplY3RlZENsYXNzTmFtZVR5cGUuaHRtbCI+SW5qZWN0ZWRDbGFzc05hbWVUeXBlPC9hPiZndDssCkBAIC0zNjIwLDYgKzM3MTAsMTcgQEAKIDwvcHJlPjwvdGQ+PC90cj4KIAogCis8dHI+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVZhbHVlRGVjbC5odG1sIj5WYWx1ZURlY2w8L2E+Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ2hhc1R5cGUxJykiPjxhIG5hbWU9Imhhc1R5cGUxQW5jaG9yIj5oYXNUeXBlPC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVF1YWxUeXBlLmh0bWwiPlF1YWxUeXBlPC9hPiZndDsgSW5uZXJNYXRjaGVyPC90ZD48L3RyPgorPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0iaGFzVHlwZTEiPjxwcmU+TWF0Y2hlcyBpZiB0aGUgZXhwcmVzc2lvbidzIG9yIGRlY2xhcmF0aW9uJ3MgdHlwZSBtYXRjaGVzIGEgdHlwZQorbWF0Y2hlci4KKworRXhhbXBsZSBtYXRjaGVzIHggKG1hdGNoZXIgPSBleHByKGhhc1R5cGUocmVjb3JkRGVjbChoYXNOYW1lKCJYIikpKSkpCisgICAgICAgICAgICBhbmQgeiAobWF0Y2hlciA9IHZhckRlY2woaGFzVHlwZShyZWNvcmREZWNsKGhhc05hbWUoIlgiKSkpKSkKKyBjbGFzcyBYIHt9OworIHZvaWQgeShYICZhbXA7eCkgeyB4OyBYIHo7IH0KKzwvcHJlPjwvdGQ+PC90cj4KKworCiA8dHI+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVZhckRlY2wuaHRtbCI+VmFyRGVjbDwvYT4mZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnaGFzSW5pdGlhbGl6ZXIwJykiPjxhIG5hbWU9Imhhc0luaXRpYWxpemVyMEFuY2hvciI+aGFzSW5pdGlhbGl6ZXI8L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xRXhwci5odG1sIj5FeHByPC9hPiZndDsgSW5uZXJNYXRjaGVyPC90ZD48L3RyPgogPHRyPjx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iZG9jIiBpZD0iaGFzSW5pdGlhbGl6ZXIwIj48cHJlPk1hdGNoZXMgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiB0aGF0IGhhcyBhbiBpbml0aWFsaXplciBleHByZXNzaW9uCiB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIG1hdGNoZXIuCkBAIC0zNjY1LDYgKzM3NjYsMTggQEAKICAgaWYgKHRydWUpIHt9CiA8L3ByZT48L3RkPjwvdHI+CiAKKworPHRyPjx0ZD5NYXRjaGVyJmx0O2ludGVybmFsOjpCaW5kYWJsZU1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MuaHRtbCI+TmVzdGVkTmFtZVNwZWNpZmllckxvYzwvYT4mZ3Q7Jmd0OzwvdGQ+PHRkIGNsYXNzPSJuYW1lIiBvbmNsaWNrPSJ0b2dnbGUoJ2xvYzEnKSI+PGEgbmFtZT0ibG9jMUFuY2hvciI+bG9jPC9hPjwvdGQ+PHRkPk1hdGNoZXImbHQ8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMU5lc3RlZE5hbWVTcGVjaWZpZXIuaHRtbCI+TmVzdGVkTmFtZVNwZWNpZmllcjwvYT4mZ3Q7IElubmVyTWF0Y2hlcjwvdGQ+PC90cj4KKzx0cj48dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImRvYyIgaWQ9ImxvYzEiPjxwcmU+TWF0Y2hlcyBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jcyBmb3Igd2hpY2ggdGhlIGdpdmVuIGlubmVyCitOZXN0ZWROYW1lU3BlY2lmaWVyLW1hdGNoZXIgbWF0Y2hlcy4KKzwvcHJlPjwvdGQ+PC90cj4KKworCis8dHI+PHRkPk1hdGNoZXImbHQ7aW50ZXJuYWw6OkJpbmRhYmxlTWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xVHlwZUxvYy5odG1sIj5UeXBlTG9jPC9hPiZndDsmZ3Q7PC90ZD48dGQgY2xhc3M9Im5hbWUiIG9uY2xpY2s9InRvZ2dsZSgnbG9jMCcpIj48YSBuYW1lPSJsb2MwQW5jaG9yIj5sb2M8L2E+PC90ZD48dGQ+TWF0Y2hlciZsdDxhIGhyZWY9Imh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xUXVhbFR5cGUuaHRtbCI+UXVhbFR5cGU8L2E+Jmd0OyBJbm5lck1hdGNoZXI8L3RkPjwvdHI+Cis8dHI+PHRkIGNvbHNwYW49IjQiIGNsYXNzPSJkb2MiIGlkPSJsb2MwIj48cHJlPk1hdGNoZXMgVHlwZUxvY3MgZm9yIHdoaWNoIHRoZSBnaXZlbiBpbm5lcgorUXVhbFR5cGUtbWF0Y2hlciBtYXRjaGVzLgorPC9wcmU+PC90ZD48L3RyPgorCiA8IS0tRU5EX1RSQVZFUlNBTF9NQVRDSEVSUyAtLT4KIDwvdGFibGU+CiAKZGlmZiAtLWdpdCBhL2RvY3MvTGliQVNUTWF0Y2hlcnNUdXRvcmlhbC5yc3QgYi9kb2NzL0xpYkFTVE1hdGNoZXJzVHV0b3JpYWwucnN0CmluZGV4IDViZDYyYTEuLjEzNzQ5ZmIgMTAwNjQ0Ci0tLSBhL2RvY3MvTGliQVNUTWF0Y2hlcnNUdXRvcmlhbC5yc3QKKysrIGIvZG9jcy9MaWJBU1RNYXRjaGVyc1R1dG9yaWFsLnJzdApAQCAtMTM3LDYgKzEzNywxMCBAQAogICAgICAgdXNpbmcgbmFtZXNwYWNlIGNsYW5nOjp0b29saW5nOwogICAgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm07CiAKKyAgICAgIC8vIEFwcGx5IGEgY3VzdG9tIGNhdGVnb3J5IHRvIGFsbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBzbyB0aGF0IHRoZXkgYXJlIHRoZQorICAgICAgLy8gb25seSBvbmVzIGRpc3BsYXllZC4KKyAgICAgIHN0YXRpYyBsbHZtOjpjbDo6T3B0aW9uQ2F0ZWdvcnkgTXlUb29sQ2F0ZWdvcnkoIm15LXRvb2wgb3B0aW9ucyIpOworCiAgICAgICAvLyBDb21tb25PcHRpb25zUGFyc2VyIGRlY2xhcmVzIEhlbHBNZXNzYWdlIHdpdGggYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29tbW9uCiAgICAgICAvLyBjb21tYW5kLWxpbmUgb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBjb21waWxhdGlvbiBkYXRhYmFzZSBhbmQgaW5wdXQgZmlsZXMuCiAgICAgICAvLyBJdCdzIG5pY2UgdG8gaGF2ZSB0aGlzIGhlbHAgbWVzc2FnZSBpbiBhbGwgdG9vbHMuCkBAIC0xNDYsNyArMTUwLDcgQEAKICAgICAgIHN0YXRpYyBjbDo6ZXh0cmFoZWxwIE1vcmVIZWxwKCJcbk1vcmUgaGVscCB0ZXh0Li4uIik7CiAKICAgICAgIGludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgewotICAgICAgICBDb21tb25PcHRpb25zUGFyc2VyIE9wdGlvbnNQYXJzZXIoYXJnYywgYXJndik7CisgICAgICAgIENvbW1vbk9wdGlvbnNQYXJzZXIgT3B0aW9uc1BhcnNlcihhcmdjLCBhcmd2LCBNeVRvb2xDYXRlZ29yeSk7CiAgICAgICAgIENsYW5nVG9vbCBUb29sKE9wdGlvbnNQYXJzZXIuZ2V0Q29tcGlsYXRpb25zKCksCiAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnNQYXJzZXIuZ2V0U291cmNlUGF0aExpc3QoKSk7CiAgICAgICAgIHJldHVybiBUb29sLnJ1bihuZXdGcm9udGVuZEFjdGlvbkZhY3Rvcnk8Y2xhbmc6OlN5bnRheE9ubHlBY3Rpb24+KCkpOwpAQCAtMjg3LDcgKzI5MSw3IEBACiAuLiBjb2RlLWJsb2NrOjogYysrCiAKICAgICAgIGludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgewotICAgICAgICBDb21tb25PcHRpb25zUGFyc2VyIE9wdGlvbnNQYXJzZXIoYXJnYywgYXJndik7CisgICAgICAgIENvbW1vbk9wdGlvbnNQYXJzZXIgT3B0aW9uc1BhcnNlcihhcmdjLCBhcmd2LCBNeVRvb2xDYXRlZ29yeSk7CiAgICAgICAgIENsYW5nVG9vbCBUb29sKE9wdGlvbnNQYXJzZXIuZ2V0Q29tcGlsYXRpb25zKCksCiAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnNQYXJzZXIuZ2V0U291cmNlUGF0aExpc3QoKSk7CiAKZGlmZiAtLWdpdCBhL2RvY3MvTGliVG9vbGluZy5yc3QgYi9kb2NzL0xpYlRvb2xpbmcucnN0CmluZGV4IDUwNTg2NTYuLjU3ZjIwN2YgMTAwNjQ0Ci0tLSBhL2RvY3MvTGliVG9vbGluZy5yc3QKKysrIGIvZG9jcy9MaWJUb29saW5nLnJzdApAQCAtNjAsMTMgKzYwLDE4IEBACiAuLiBjb2RlLWJsb2NrOjogYysrCiAKICAgI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQ29tbW9uT3B0aW9uc1BhcnNlci5oIgorICAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCiAKICAgdXNpbmcgbmFtZXNwYWNlIGNsYW5nOjp0b29saW5nOwogCisgIC8vIEFwcGx5IGEgY3VzdG9tIGNhdGVnb3J5IHRvIGFsbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBzbyB0aGF0IHRoZXkgYXJlIHRoZQorICAvLyBvbmx5IG9uZXMgZGlzcGxheWVkLgorICBzdGF0aWMgbGx2bTo6Y2w6Ok9wdGlvbkNhdGVnb3J5IE15VG9vbENhdGVnb3J5KCJteS10b29sIG9wdGlvbnMiKTsKKwogICBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIHsKICAgICAvLyBDb21tb25PcHRpb25zUGFyc2VyIGNvbnN0cnVjdG9yIHdpbGwgcGFyc2UgYXJndW1lbnRzIGFuZCBjcmVhdGUgYQogICAgIC8vIENvbXBpbGF0aW9uRGF0YWJhc2UuICBJbiBjYXNlIG9mIGVycm9yIGl0IHdpbGwgdGVybWluYXRlIHRoZSBwcm9ncmFtLgotICAgIENvbW1vbk9wdGlvbnNQYXJzZXIgT3B0aW9uc1BhcnNlcihhcmdjLCBhcmd2KTsKKyAgICBDb21tb25PcHRpb25zUGFyc2VyIE9wdGlvbnNQYXJzZXIoYXJnYywgYXJndiwgTXlUb29sQ2F0ZWdvcnkpOwogCiAgICAgLy8gVXNlIE9wdGlvbnNQYXJzZXIuZ2V0Q29tcGlsYXRpb25zKCkgYW5kIE9wdGlvbnNQYXJzZXIuZ2V0U291cmNlUGF0aExpc3QoKQogICAgIC8vIHRvIHJldHJpZXZlIENvbXBpbGF0aW9uRGF0YWJhc2UgYW5kIHRoZSBsaXN0IG9mIGlucHV0IGZpbGUgcGF0aHMuCkBAIC05OSw4ICsxMDQsOCBAQAogUHV0dGluZyBpdCB0b2dldGhlciAtLS0gdGhlIGZpcnN0IHRvb2wKIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCiAKLU5vdyB3ZSBjb21iaW5lIHRoZSB0d28gcHJldmlvdXMgc3RlcHMgaW50byBvdXIgZmlyc3QgcmVhbCB0b29sLiAgVGhpcyBleGFtcGxlCi10b29sIGlzIGFsc28gY2hlY2tlZCBpbnRvIHRoZSBjbGFuZyB0cmVlIGF0CitOb3cgd2UgY29tYmluZSB0aGUgdHdvIHByZXZpb3VzIHN0ZXBzIGludG8gb3VyIGZpcnN0IHJlYWwgdG9vbC4gIEEgbW9yZSBhZHZhbmNlZAordmVyc2lvbiBvZiB0aGlzIGV4YW1wbGUgdG9vbCBpcyBhbHNvIGNoZWNrZWQgaW50byB0aGUgY2xhbmcgdHJlZSBhdAogYGB0b29scy9jbGFuZy1jaGVjay9DbGFuZ0NoZWNrLmNwcGBgLgogCiAuLiBjb2RlLWJsb2NrOjogYysrCkBAIC0xMTUsNiArMTIwLDEwIEBACiAgIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6dG9vbGluZzsKICAgdXNpbmcgbmFtZXNwYWNlIGxsdm07CiAKKyAgLy8gQXBwbHkgYSBjdXN0b20gY2F0ZWdvcnkgdG8gYWxsIGNvbW1hbmQtbGluZSBvcHRpb25zIHNvIHRoYXQgdGhleSBhcmUgdGhlCisgIC8vIG9ubHkgb25lcyBkaXNwbGF5ZWQuCisgIHN0YXRpYyBjbDo6T3B0aW9uQ2F0ZWdvcnkgTXlUb29sQ2F0ZWdvcnkoIm15LXRvb2wgb3B0aW9ucyIpOworCiAgIC8vIENvbW1vbk9wdGlvbnNQYXJzZXIgZGVjbGFyZXMgSGVscE1lc3NhZ2Ugd2l0aCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tb24KICAgLy8gY29tbWFuZC1saW5lIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgY29tcGlsYXRpb24gZGF0YWJhc2UgYW5kIGlucHV0IGZpbGVzLgogICAvLyBJdCdzIG5pY2UgdG8gaGF2ZSB0aGlzIGhlbHAgbWVzc2FnZSBpbiBhbGwgdG9vbHMuCkBAIC0xMjQsOSArMTMzLDkgQEAKICAgc3RhdGljIGNsOjpleHRyYWhlbHAgTW9yZUhlbHAoIlxuTW9yZSBoZWxwIHRleHQuLi4iKTsKIAogICBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIHsKLSAgICBDb21tb25PcHRpb25zUGFyc2VyIE9wdGlvbnNQYXJzZXIoYXJnYywgYXJndik7CisgICAgQ29tbW9uT3B0aW9uc1BhcnNlciBPcHRpb25zUGFyc2VyKGFyZ2MsIGFyZ3YsIE15VG9vbENhdGVnb3J5KTsKICAgICBDbGFuZ1Rvb2wgVG9vbChPcHRpb25zUGFyc2VyLmdldENvbXBpbGF0aW9ucygpLAotICAgIE9wdGlvbnNQYXJzZXIuZ2V0U291cmNlUGF0aExpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgT3B0aW9uc1BhcnNlci5nZXRTb3VyY2VQYXRoTGlzdCgpKTsKICAgICByZXR1cm4gVG9vbC5ydW4obmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5PGNsYW5nOjpTeW50YXhPbmx5QWN0aW9uPigpKTsKICAgfQogCkBAIC0xNzYsNyArMTg1LDcgQEAKIAogQ2xhbmcgdG9vbHMgbmVlZCB0aGVpciBidWlsdGluIGhlYWRlcnMgYW5kIHNlYXJjaCBmb3IgdGhlbSB0aGUgc2FtZSB3YXkgQ2xhbmcKIGRvZXMuICBUaHVzLCB0aGUgZGVmYXVsdCBsb2NhdGlvbiB0byBsb29rIGZvciBidWlsdGluIGhlYWRlcnMgaXMgaW4gYSBwYXRoCi1gYCQoZGlybmFtZSAvcGF0aC90by90b29sKS8uLi9saWIvY2xhbmcvMy40L2luY2x1ZGVgYCByZWxhdGl2ZSB0byB0aGUgdG9vbAorYGAkKGRpcm5hbWUgL3BhdGgvdG8vdG9vbCkvLi4vbGliL2NsYW5nLzMuMy9pbmNsdWRlYGAgcmVsYXRpdmUgdG8gdGhlIHRvb2wKIGJpbmFyeS4gIFRoaXMgd29ya3Mgb3V0LW9mLXRoZS1ib3ggZm9yIHRvb2xzIHJ1bm5pbmcgZnJvbSBsbHZtJ3MgdG9wbGV2ZWwKIGJpbmFyeSBkaXJlY3RvcnkgYWZ0ZXIgYnVpbGRpbmcgY2xhbmctaGVhZGVycywgb3IgaWYgdGhlIHRvb2wgaXMgcnVubmluZyBmcm9tCiB0aGUgYmluYXJ5IGRpcmVjdG9yeSBvZiBhIGNsYW5nIGluc3RhbGwgbmV4dCB0byB0aGUgY2xhbmcgYmluYXJ5LgpkaWZmIC0tZ2l0IGEvZG9jcy9NU1ZDQ29tcGF0aWJpbGl0eS5yc3QgYi9kb2NzL01TVkNDb21wYXRpYmlsaXR5LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODNjZTkzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9NU1ZDQ29tcGF0aWJpbGl0eS5yc3QKQEAgLTAsMCArMSwxMjQgQEAKKy4uIHJhdzo6IGh0bWwKKworICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgIC5ub25lIHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGQ0NDQyB9CisgICAgLnBhcnRpYWwgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjk5IH0KKyAgICAuZ29vZCB7IGJhY2tncm91bmQtY29sb3I6ICNDQ0ZGOTkgfQorICA8L3N0eWxlPgorCisuLiByb2xlOjogbm9uZQorLi4gcm9sZTo6IHBhcnRpYWwKKy4uIHJvbGU6OiBnb29kCisKKz09PT09PT09PT09PT09PT09PQorTVNWQyBjb21wYXRpYmlsaXR5Cis9PT09PT09PT09PT09PT09PT0KKworV2hlbiBDbGFuZyBjb21waWxlcyBDKysgY29kZSBmb3IgV2luZG93cywgaXQgYXR0ZW1wdHMgdG8gYmUgY29tcGF0aWJsZSB3aXRoCitNU1ZDLiAgVGhlcmUgYXJlIG11bHRpcGxlIGRpbWVuc2lvbnMgdG8gY29tcGF0aWJpbGl0eS4KKworRmlyc3QsIENsYW5nIGF0dGVtcHRzIHRvIGJlIEFCSS1jb21wYXRpYmxlLCBtZWFuaW5nIHRoYXQgQ2xhbmctY29tcGlsZWQgY29kZQorc2hvdWxkIGJlIGFibGUgdG8gbGluayBhZ2FpbnN0IE1TVkMtY29tcGlsZWQgY29kZSBzdWNjZXNzZnVsbHkuICBIb3dldmVyLCBDKysKK0FCSXMgYXJlIHBhcnRpY3VsYXIgbGFyZ2UgYW5kIGNvbXBsaWNhdGVkLCBhbmQgQ2xhbmcncyBzdXBwb3J0IGZvciBNU1ZDJ3MgQysrCitBQkkgaXMgYSB3b3JrIGluIHByb2dyZXNzLiAgSWYgeW91IGRvbid0IHJlcXVpcmUgTVNWQyBBQkkgY29tcGF0aWJpbGl0eSBvciBkb24ndAord2FudCB0byB1c2UgTWljcm9zb2Z0J3MgQyBhbmQgQysrIHJ1bnRpbWVzLCB0aGUgbWluZ3czMiB0b29sY2hhaW4gbWlnaHQgYmUgYQorYmV0dGVyIGZpdCBmb3IgeW91ciBwcm9qZWN0LgorCitTZWNvbmQsIENsYW5nIGltcGxlbWVudHMgbWFueSBNU1ZDIGxhbmd1YWdlIGV4dGVuc2lvbnMsIHN1Y2ggYXMKK2BgX19kZWNsc3BlYyhkbGxleHBvcnQpYGAgYW5kIGEgaGFuZGZ1bCBvZiBwcmFnbWFzLiAgVGhlc2UgYXJlIHR5cGljYWxseQorY29udHJvbGxlZCBieSBgYC1mbXMtZXh0ZW5zaW9uc2BgLgorCitUaGlyZCwgTVNWQyBhY2NlcHRzIHNvbWUgQysrIGNvZGUgdGhhdCBDbGFuZyB3aWxsIHR5cGljYWxseSBkaWFnbm9zZSBhcworaW52YWxpZC4gIFdoZW4gdGhlc2UgY29uc3RydWN0cyBhcmUgcHJlc2VudCBpbiB3aWRlbHkgaW5jbHVkZWQgc3lzdGVtIGhlYWRlcnMsCitDbGFuZyBhdHRlbXB0cyB0byByZWNvdmVyIGFuZCBjb250aW51ZSBjb21waWxpbmcgdGhlIHVzZXIncyBwcm9ncmFtLiAgTW9zdAorcGFyc2luZyBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB0d2Vha3MgYXJlIGNvbnRyb2xsZWQgYnkKK2BgLWZtcy1jb21wYXRpYmlsaXR5YGAgYW5kIGBgLWZkZWxheWVkLXRlbXBsYXRlLXBhcnNpbmdgYCwgYW5kIHRoZXkgYXJlIGEgd29yaworaW4gcHJvZ3Jlc3MuCisKK0ZpbmFsbHksIHRoZXJlIGlzIDpyZWY6YGNsYW5nLWNsYCwgYSBkcml2ZXIgcHJvZ3JhbSBmb3IgY2xhbmcgdGhhdCBhdHRlbXB0cyB0bworYmUgY29tcGF0aWJsZSB3aXRoIE1TVkMncyBjbC5leGUuCisKK0FCSSBmZWF0dXJlcworPT09PT09PT09PT09CisKK1RoZSBzdGF0dXMgb2YgbWFqb3IgQUJJLWltcGFjdGluZyBDKysgZmVhdHVyZXM6CisKKyogUmVjb3JkIGxheW91dDogOmdvb2Q6YE1vc3RseSBjb21wbGV0ZWAuICBXZSd2ZSB0ZXN0ZWQgdGhpcyB3aXRoIGEgZnV6emVyLCBhbmQKKyAgbW9zdCBvZiB0aGUgcmVtYWluaW5nIGZhaWx1cmVzIGludm9sdmUgYGAjcHJhZ21hIHBhY2tgYCwKKyAgYGBfX2RlY2xzcGVjKGFsaWduKE4pKWBgLCBvciBvdGhlciBwcmFnbWFzLgorCisqIENsYXNzIGluaGVyaXRhbmNlOiA6Z29vZDpgTW9zdGx5IGNvbXBsZXRlYC4gIFRoaXMgY292ZXJzIGFsbCBvZiB0aGUgc3RhbmRhcmQKKyAgT08gZmVhdHVyZXMgeW91IHdvdWxkIGV4cGVjdDogdmlydHVhbCBtZXRob2QgaW5oZXJpdGFuY2UsIG11bHRpcGxlCisgIGluaGVyaXRhbmNlLCBhbmQgdmlydHVhbCBpbmhlcml0YW5jZS4gIEV2ZXJ5IHNvIG9mdGVuIHdlIHVuY292ZXIgYSBidWcgd2hlcmUKKyAgb3VyIHRhYmxlcyBhcmUgaW5jb21wYXRpYmxlLCBidXQgdGhpcyBpcyBwcmV0dHkgd2VsbCBpbiBoYW5kLgorCisqIE5hbWUgbWFuZ2xpbmc6IDpnb29kOmBPbmdvaW5nYC4gIEV2ZXJ5IG5ldyBDKysgZmVhdHVyZSBnZW5lcmFsbHkgbmVlZHMgaXRzIG93bgorICBtYW5nbGluZy4gIEZvciBleGFtcGxlLCBtZW1iZXIgcG9pbnRlciB0ZW1wbGF0ZSBhcmd1bWVudHMgaGF2ZSBhbiBpbnRlcmVzdGluZworICBhbmQgZGlzdGluY3QgbWFuZ2xpbmcuICBGb3J0dW5hdGVseSwgaW5jb3JyZWN0IG1hbmdsaW5ncyB1c3VhbGx5IGRvIG5vdCByZXN1bHQKKyAgaW4gcnVudGltZSBlcnJvcnMuICBOb24taW5saW5lIGZ1bmN0aW9ucyB3aXRoIGluY29ycmVjdCBtYW5nbGluZ3MgdXN1YWxseQorICByZXN1bHQgaW4gbGluayBlcnJvcnMsIHdoaWNoIGFyZSByZWxhdGl2ZWx5IGVhc3kgdG8gZGlhZ25vc2UuICBJbmNvcnJlY3QKKyAgbWFuZ2xpbmdzIGZvciBpbmxpbmUgZnVuY3Rpb25zIGFuZCB0ZW1wbGF0ZXMgcmVzdWx0IGluIG11bHRpcGxlIGNvcGllcyBpbiB0aGUKKyAgZmluYWwgaW1hZ2UuICBUaGUgQysrIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgdGhvc2UgYWRkcmVzc2VzIGJlIGVxdWFsLCBidXQgZmV3CisgIHByb2dyYW1zIHJlbHkgb24gdGhpcy4KKworKiBNZW1iZXIgcG9pbnRlcnM6IDpnb29kOmBNb3N0bHkgY29tcGxldGVgLiAgU3RhbmRhcmQgQysrIG1lbWJlciBwb2ludGVycyBhcmUKKyAgZnVsbHkgaW1wbGVtZW50ZWQgYW5kIHNob3VsZCBiZSBBQkkgY29tcGF0aWJsZS4gIEJvdGggYCNwcmFnbWEKKyAgcG9pbnRlcnNfdG9fbWVtYmVyc2BfIGFuZCB0aGUgYC92bWBfIGZsYWdzIGFyZSBzdXBwb3J0ZWQuIEhvd2V2ZXIsIE1TVkMKKyAgc3VwcG9ydHMgYW4gZXh0ZW5zaW9uIHRvIGFsbG93IGNyZWF0aW5nIGEgYHBvaW50ZXIgdG8gYSBtZW1iZXIgb2YgYSB2aXJ0dWFsCisgIGJhc2UgY2xhc3NgXy4gIENsYW5nIGRvZXMgbm90IHlldCBzdXBwb3J0IHRoaXMuCisKKy4uIF8jcHJhZ21hIHBvaW50ZXJzX3RvX21lbWJlcnM6CisgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS84M2NjaDVhNi5hc3B4CisuLiBfL3ZtOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkveWFkNDZhNnouYXNweAorLi4gX3BvaW50ZXIgdG8gYSBtZW1iZXIgb2YgYSB2aXJ0dWFsIGJhc2UgY2xhc3M6IGh0dHA6Ly9sbHZtLm9yZy9QUjE1NzEzCisKKyogRGVidWcgaW5mbzogOnBhcnRpYWw6YE1pbmltYWxgLiAgQ2xhbmcgZW1pdHMgQ29kZVZpZXcgbGluZSB0YWJsZXMgaW50byB0aGUKKyAgb2JqZWN0IGZpbGUsIHNpbWlsYXIgdG8gd2hhdCBNU1ZDIGVtaXRzIHdoZW4gZ2l2ZW4gdGhlIGBgL1o3YGAgZmxhZy4KKyAgTWljcm9zb2Z0J3MgbGluay5leGUgd2lsbCByZWFkIHRoaXMgaW5mb3JtYXRpb24gYW5kIHVzZSBpdCB0byBjcmVhdGUgYSBQREIsCisgIGVuYWJsaW5nIHN0YWNrIHRyYWNlcyBpbiBhbGwgbW9kZXJuIFdpbmRvd3MgZGVidWdnZXJzLiAgQ2xhbmcgZG9lcyBub3QgZW1pdAorICBhbnkgdHlwZSBpbmZvIG9yIGRlc2NyaXB0aW9uIG9mIHZhcmlhYmxlIGxheW91dC4KKworKiBgUlRUSWBfOiA6bm9uZTpgVW5zdGFydGVkYC4gIFNlZSB0aGUgYnVnIGZvciBhIGRpc2N1c3Npb24gb2Ygd2hhdCBuZWVkcyB0bworICBoYXBwZW4gZmlyc3QuCisKKy4uIF9SVFRJOiBodHRwOi8vbGx2bS5vcmcvUFIxODk1MQorCisqIEV4Y2VwdGlvbnMgYW5kIFNFSDogOm5vbmU6YFVuc3RhcnRlZGAuICBDbGFuZyBjYW4gcGFyc2UgYm90aCBjb25zdHJ1Y3RzLCBidXQKKyAgZG9lcyBub3Qga25vdyBob3cgdG8gZW1pdCBjb21wYXRpYmxlIGhhbmRsZXJzLiAgVGhpcyBkZXBlbmRzIG9uIFJUVEkuCisKKyogVGhyZWFkLXNhZmUgaW5pdGlhbGl6YXRpb24gb2YgbG9jYWwgc3RhdGljczogOm5vbmU6YFVuc3RhcnRlZGAuICBXZSBhcmUgQUJJCisgIGNvbXBhdGlibGUgd2l0aCBNU1ZDIDIwMTIsIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgdGhyZWFkLXNhZmUgbG9jYWwgc3RhdGljcy4KKyAgTVNWQyAyMDEzIGNoYW5nZWQgdGhlIEFCSSB0byBtYWtlIGluaXRpYWxpemF0aW9uIG9mIGxvY2FsIHN0YXRpY3MgdGhyZWFkIHNhZmUsCisgIGFuZCB3ZSBoYXZlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgdGhpcy4KKworKiBMYW1iZGFzIGluIEFCSSBib3VuZGFyaWVzOiA6bm9uZTpgSW5mZWFzaWJsZWAuICBJdCBpcyB1bmxpa2VseSB0aGF0IHdlIHdpbGwKKyAgZXZlciBiZSBmdWxseSBBQkkgY29tcGF0aWJsZSB3aXRoIGxhbWJkYXMgZGVjbGFyZWQgaW4gaW5saW5lIGZ1bmN0aW9ucyBkdWUgdG8KKyAgd2hhdCBhcHBlYXJzIHRvIGJlIGEgaGFzaCBjb2RlIGluIHRoZSBuYW1lIG1hbmdsaW5nLiAgTGFtYmRhcyB0aGF0IGFyZSBub3QKKyAgZXh0ZXJuYWxseSB2aXNpYmxlIHNob3VsZCB3b3JrIGZpbmUuCisKK1RlbXBsYXRlIGluc3RhbnRpYXRpb24gYW5kIG5hbWUgbG9va3VwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbiBhZGRpdGlvbiB0byB0aGUgdXN1YWwgYGRlcGVuZGVudCBuYW1lIGxvb2t1cCBGQVFzYF8sIENsYW5nIGlzIG9mdGVuIHVuYWJsZSB0bworcGFyc2UgY2VydGFpbiBpbnZhbGlkIEMrKyBjb25zdHJ1Y3RzIHRoYXQgTVNWQyBhbGxvd3MuICBBcyBvZiB0aGlzIHdyaXRpbmcsCitDbGFuZyB3aWxsIHJlamVjdCBjb2RlIHdpdGggbWlzc2luZyBgYHR5cGVuYW1lYGAgYW5ub3RhdGlvbnM6CisKKy4uIF9kZXBlbmRlbnQgbmFtZSBsb29rdXAgRkFRczoKKyAgaHR0cDovL2NsYW5nLmxsdm0ub3JnL2NvbXBhdGliaWxpdHkuaHRtbCNkZXBfbG9va3VwCisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICBzdHJ1Y3QgWCB7CisgICAgdHlwZWRlZiBpbnQgdHlwZTsKKyAgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IGYoKSB7CisgICAgLy8gbWlzc2luZyB0eXBlbmFtZSBrZXl3b3JkCisgICAgcmV0dXJuIHNpemVvZigvKnR5cGVuYW1lKi8gVDo6dHlwZSk7CisgIH0KKyAgdGVtcGxhdGUgdm9pZCBmPFg+KCk7CisKK0FjY2VwdGluZyBjb2RlIGxpa2UgdGhpcyBpcyBvbmdvaW5nIHdvcmsuICBVbHRpbWF0ZWx5LCBpdCBtYXkgYmUgY2xlYW5lciB0bworYGltcGxlbWVudCBhIHRva2VuLWJhc2VkIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gbW9kZWBfIHRoYW4gaXQgaXMgdG8gYWRkCitjb21wYXRpYmlsaXR5IGhhY2tzIHRvIHRoZSBleGlzdGluZyBBU1QtYmFzZWQgaW5zdGFudGlhdGlvbi4KKworLi4gX2ltcGxlbWVudCBhIHRva2VuLWJhc2VkIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gbW9kZTogaHR0cDovL2xsdm0ub3JnL1BSMTg3MTQKZGlmZiAtLWdpdCBhL2RvY3MvTWVtb3J5U2FuaXRpemVyLnJzdCBiL2RvY3MvTWVtb3J5U2FuaXRpemVyLnJzdAppbmRleCA1ZmM3ZTc0Li45ZDZjMjJkIDEwMDY0NAotLS0gYS9kb2NzL01lbW9yeVNhbml0aXplci5yc3QKKysrIGIvZG9jcy9NZW1vcnlTYW5pdGl6ZXIucnN0CkBAIC01NiwxMiArNTYsMTAgQEAKIAogLi4gY29kZS1ibG9jazo6IGNvbnNvbGUKIAotICAgICUgLi9hLm91dCAyPmxvZwotICAgICUgcHJvamVjdHMvY29tcGlsZXItcnQvbGliL2FzYW4vc2NyaXB0cy9hc2FuX3N5bWJvbGl6ZS5weSAvIDwgbG9nIHwgYysrZmlsdAotICAgID09MzAxMDY9PSAgV0FSTklORzogTWVtb3J5U2FuaXRpemVyOiBVTVIgKHVuaW5pdGlhbGl6ZWQtbWVtb3J5LXJlYWQpCisgICAgJSAuL2Eub3V0CisgICAgV0FSTklORzogTWVtb3J5U2FuaXRpemVyOiB1c2Utb2YtdW5pbml0aWFsaXplZC12YWx1ZQogICAgICAgICAjMCAweDdmNDU5NDRiNDE4YSBpbiBtYWluIHVtci5jYzo2CiAgICAgICAgICMxIDB4N2Y0NTkzOGI2NzZjIGluIF9fbGliY19zdGFydF9tYWluIGxpYmMtc3RhcnQuYzoyMjYKLSAgICBFeGl0aW5nCiAKIEJ5IGRlZmF1bHQsIE1lbW9yeVNhbml0aXplciBleGl0cyBvbiB0aGUgZmlyc3QgZGV0ZWN0ZWQgZXJyb3IuCiAKQEAgLTEwMSw2ICs5OSwxMyBAQAogd2FybmluZ3Mgd2lsbCBiZSBzdXBwcmVzc2VkIGFuZCBhbGwgdmFsdWVzIGxvYWRlZCBmcm9tIG1lbW9yeSB3aWxsIGJlCiBjb25zaWRlcmVkIGZ1bGx5IGluaXRpYWxpemVkLgogCitSZXBvcnQgc3ltYm9saXphdGlvbgorPT09PT09PT09PT09PT09PT09PT0KKworTWVtb3J5U2FuaXRpemVyIHVzZXMgYW4gZXh0ZXJuYWwgc3ltYm9saXplciB0byBwcmludCBmaWxlcyBhbmQgbGluZSBudW1iZXJzIGluCityZXBvcnRzLiBNYWtlIHN1cmUgdGhhdCBgYGxsdm0tc3ltYm9saXplcmBgIGJpbmFyeSBpcyBpbiBgYFBBVEhgYCwKK29yIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSBgYE1TQU5fU1lNQk9MSVpFUl9QQVRIYGAgdG8gcG9pbnQgdG8gaXQuCisKIE9yaWdpbiBUcmFja2luZwogPT09PT09PT09PT09PT09CiAKQEAgLTExMiwyOSArMTE3LDU5IEBACiAuLiBjb2RlLWJsb2NrOjogY29uc29sZQogCiAgICAgJSBjbGFuZyAtZnNhbml0aXplPW1lbW9yeSAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1nIC1PMiB1bXIuY2MKLSAgICAlIC4vYS5vdXQgMj5sb2cKLSAgICAlIHByb2plY3RzL2NvbXBpbGVyLXJ0L2xpYi9hc2FuL3NjcmlwdHMvYXNhbl9zeW1ib2xpemUucHkgLyA8IGxvZyB8IGMrK2ZpbHQKLSAgICA9PTE0NDI1PT0gIFdBUk5JTkc6IE1lbW9yeVNhbml0aXplcjogVU1SICh1bmluaXRpYWxpemVkLW1lbW9yeS1yZWFkKQotICAgID09MTQ0MjU9PSBXQVJOSU5HOiBUcnlpbmcgdG8gc3ltYm9saXplIGNvZGUsIGJ1dCBleHRlcm5hbCBzeW1ib2xpemVyIGlzIG5vdCBpbml0aWFsaXplZCEKLSAgICAgICAgIzAgMHg3ZjhiZGRhMzgyNGIgaW4gbWFpbiB1bXIuY2M6NgotICAgICAgICAjMSAweDdmOGJkY2UzYTc2YyBpbiBfX2xpYmNfc3RhcnRfbWFpbiBsaWJjLXN0YXJ0LmM6MjI2Ci0gICAgICByYXcgb3JpZ2luIGlkOiAyMDMwMDQzMTM3Ci0gICAgICBPUklHSU46IGhlYXAgYWxsb2NhdGlvbjoKLSAgICAgICAgIzAgMHg3ZjhiZGRhNDAzNGIgaW4gb3BlcmF0b3IgbmV3W10odW5zaWduZWQgbG9uZykgbXNhbl9uZXdfZGVsZXRlLmNjOjM5Ci0gICAgICAgICMxIDB4N2Y4YmRkYTM4MTRkIGluIG1haW4gdW1yLmNjOjQKLSAgICAgICAgIzIgMHg3ZjhiZGNlM2E3NmMgaW4gX19saWJjX3N0YXJ0X21haW4gbGliYy1zdGFydC5jOjIyNgotICAgIEV4aXRpbmcKKyAgICAlIC4vYS5vdXQKKyAgICBXQVJOSU5HOiBNZW1vcnlTYW5pdGl6ZXI6IHVzZS1vZi11bmluaXRpYWxpemVkLXZhbHVlCisgICAgICAgICMwIDB4N2Y3ODkzOTEyZjBiIGluIG1haW4gdW1yMi5jYzo2CisgICAgICAgICMxIDB4N2Y3ODkyNDliNzZjIGluIF9fbGliY19zdGFydF9tYWluIGxpYmMtc3RhcnQuYzoyMjYKIAotT3JpZ2luIHRyYWNraW5nIGhhcyBwcm92ZWQgdG8gYmUgdmVyeSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBVTVIKKyAgICAgIFVuaW5pdGlhbGl6ZWQgdmFsdWUgd2FzIGNyZWF0ZWQgYnkgYSBoZWFwIGFsbG9jYXRpb24KKyAgICAgICAgIzAgMHg3Zjc4OTM5MDFjYmQgaW4gb3BlcmF0b3IgbmV3W10odW5zaWduZWQgbG9uZykgbXNhbl9uZXdfZGVsZXRlLmNjOjQ0CisgICAgICAgICMxIDB4N2Y3ODkzOTEyZTA2IGluIG1haW4gdW1yMi5jYzo0CisKK09yaWdpbiB0cmFja2luZyBoYXMgcHJvdmVkIHRvIGJlIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgTWVtb3J5U2FuaXRpemVyCiByZXBvcnRzLiBJdCBzbG93cyBkb3duIHByb2dyYW0gZXhlY3V0aW9uIGJ5IGEgZmFjdG9yIG9mIDEuNXgtMnggb24gdG9wCiBvZiB0aGUgdXN1YWwgTWVtb3J5U2FuaXRpemVyIHNsb3dkb3duLgogCitNZW1vcnlTYW5pdGl6ZXIgY2FuIHByb3ZpZGUgZXZlbiBtb3JlIGluZm9ybWF0aW9uIHdpdGgKK2BgLWZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucz0yYGAgZmxhZy4gSW4gdGhpcyBtb2RlIHJlcG9ydHMKK2luY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgaW50ZXJtZWRpYXRlIHN0b3JlcyB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZSB3ZW50Cit0aHJvdWdoLgorCisuLiBjb2RlLWJsb2NrOjogY29uc29sZQorCisgICAgJSBjYXQgdW1yMi5jYworICAgICNpbmNsdWRlIDxzdGRpby5oPgorCisgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgICBpbnQqIGEgPSBuZXcgaW50WzEwXTsKKyAgICAgIGFbNV0gPSAwOworICAgICAgdm9sYXRpbGUgaW50IGIgPSBhW2FyZ2NdOworICAgICAgaWYgKGIpCisgICAgICAgIHByaW50ZigieHhcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgJSBjbGFuZyAtZnNhbml0aXplPW1lbW9yeSAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zPTIgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWcgLU8yIHVtcjIuY2MKKyAgICAlIC4vYS5vdXQKKyAgICBXQVJOSU5HOiBNZW1vcnlTYW5pdGl6ZXI6IHVzZS1vZi11bmluaXRpYWxpemVkLXZhbHVlCisgICAgICAgICMwIDB4N2Y3ODkzOTEyZjBiIGluIG1haW4gdW1yMi5jYzo3CisgICAgICAgICMxIDB4N2Y3ODkyNDliNzZjIGluIF9fbGliY19zdGFydF9tYWluIGxpYmMtc3RhcnQuYzoyMjYKKworICAgICAgVW5pbml0aWFsaXplZCB2YWx1ZSB3YXMgc3RvcmVkIHRvIG1lbW9yeSBhdAorICAgICAgICAjMCAweDdmNzg5MzhiNWMyNSBpbiBfX21zYW5fY2hhaW5fb3JpZ2luIG1zYW4uY2M6NDg0CisgICAgICAgICMxIDB4N2Y3ODkzOTEyZWNkIGluIG1haW4gdW1yMi5jYzo2CisKKyAgICAgIFVuaW5pdGlhbGl6ZWQgdmFsdWUgd2FzIGNyZWF0ZWQgYnkgYSBoZWFwIGFsbG9jYXRpb24KKyAgICAgICAgIzAgMHg3Zjc4OTM5MDFjYmQgaW4gb3BlcmF0b3IgbmV3W10odW5zaWduZWQgbG9uZykgbXNhbl9uZXdfZGVsZXRlLmNjOjQ0CisgICAgICAgICMxIDB4N2Y3ODkzOTEyZTA2IGluIG1haW4gdW1yMi5jYzo0CisKKwogSGFuZGxpbmcgZXh0ZXJuYWwgY29kZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBNZW1vcnlTYW5pdGl6ZXIgcmVxdWlyZXMgdGhhdCBhbGwgcHJvZ3JhbSBjb2RlIGlzIGluc3RydW1lbnRlZC4gVGhpcwogYWxzbyBpbmNsdWRlcyBhbnkgbGlicmFyaWVzIHRoYXQgdGhlIHByb2dyYW0gZGVwZW5kcyBvbiwgZXZlbiBsaWJjLgotRmFpbGluZyB0byBhY2hpZXZlIHRoaXMgbWF5IHJlc3VsdCBpbiBmYWxzZSBVTVIgcmVwb3J0cy4KK0ZhaWxpbmcgdG8gYWNoaWV2ZSB0aGlzIG1heSByZXN1bHQgaW4gZmFsc2UgcmVwb3J0cy4KIAogRnVsbCBNZW1vcnlTYW5pdGl6ZXIgaW5zdHJ1bWVudGF0aW9uIGlzIHZlcnkgZGlmZmljdWx0IHRvIGFjaGlldmUuIFRvCiBtYWtlIGl0IGVhc2llciwgTWVtb3J5U2FuaXRpemVyIHJ1bnRpbWUgbGlicmFyeSBpbmNsdWRlcyA3MCsKQEAgLTE1Nyw3ICsxOTIsNyBAQAogCiBNZW1vcnlTYW5pdGl6ZXIgaXMgc3VwcG9ydGVkIG9uCiAKLSogTGludXggeDg2XF82NCAodGVzdGVkIG9uIFVidW50dSAxMC4wNCBhbmQgMTIuMDQpOworKiBMaW51eCB4ODZcXzY0ICh0ZXN0ZWQgb24gVWJ1bnR1IDEyLjA0KTsKIAogTGltaXRhdGlvbnMKID09PT09PT09PT09CmRpZmYgLS1naXQgYS9kb2NzL01vZHVsZXMucnN0IGIvZG9jcy9Nb2R1bGVzLnJzdAppbmRleCA5ZmI0Yzc3Li5lZWMwYjc3IDEwMDY0NAotLS0gYS9kb2NzL01vZHVsZXMucnN0CisrKyBiL2RvY3MvTW9kdWxlcy5yc3QKQEAgLTE0NCw3ICsxNDQsNyBAQAogLS0tLS0tLS0tLS0KIFRoZSBjcnVjaWFsIGxpbmsgYmV0d2VlbiBtb2R1bGVzIGFuZCBoZWFkZXJzIGlzIGRlc2NyaWJlZCBieSBhICptb2R1bGUgbWFwKiwgd2hpY2ggZGVzY3JpYmVzIGhvdyBhIGNvbGxlY3Rpb24gb2YgZXhpc3RpbmcgaGVhZGVycyBtYXBzIG9uIHRvIHRoZSAobG9naWNhbCkgc3RydWN0dXJlIG9mIGEgbW9kdWxlLiBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGltYWdpbmUgYSBtb2R1bGUgYGBzdGRgYCBjb3ZlcmluZyB0aGUgQyBzdGFuZGFyZCBsaWJyYXJ5LiBFYWNoIG9mIHRoZSBDIHN0YW5kYXJkIGxpYnJhcnkgaGVhZGVycyAoYGA8c3RkaW8uaD5gYCwgYGA8c3RkbGliLmg+YGAsIGBgPG1hdGguaD5gYCwgZXRjLikgd291bGQgY29udHJpYnV0ZSB0byB0aGUgYGBzdGRgYCBtb2R1bGUsIGJ5IHBsYWNpbmcgdGhlaXIgcmVzcGVjdGl2ZSBBUElzIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgc3VibW9kdWxlIChgYHN0ZC5pb2BgLCBgYHN0ZC5saWJgYCwgYGBzdGQubWF0aGBgLCBldGMuKS4gSGF2aW5nIGEgbGlzdCBvZiB0aGUgaGVhZGVycyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBgYHN0ZGBgIG1vZHVsZSBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGJ1aWxkIHRoZSBgYHN0ZGBgIG1vZHVsZSBhcyBhIHN0YW5kYWxvbmUgZW50aXR5LCBhbmQgaGF2aW5nIHRoZSBtYXBwaW5nIGZyb20gaGVhZGVyIG5hbWVzIHRvIChzdWIpbW9kdWxlcyBhbGxvd3MgdGhlIGF1dG9tYXRpYyB0cmFuc2xhdGlvbiBvZiBgYCNpbmNsdWRlYGAgZGlyZWN0aXZlcyB0byBtb2R1bGUgaW1wb3J0cy4KIAotTW9kdWxlIG1hcHMgYXJlIHNwZWNpZmllZCBhcyBzZXBhcmF0ZSBmaWxlcyAoZWFjaCBuYW1lZCBgYG1vZHVsZS5tYXBgYCkgYWxvbmdzaWRlIHRoZSBoZWFkZXJzIHRoZXkgZGVzY3JpYmUsIHdoaWNoIGFsbG93cyB0aGVtIHRvIGJlIGFkZGVkIHRvIGV4aXN0aW5nIHNvZnR3YXJlIGxpYnJhcmllcyB3aXRob3V0IGhhdmluZyB0byBjaGFuZ2UgdGhlIGxpYnJhcnkgaGVhZGVycyB0aGVtc2VsdmVzIChpbiBtb3N0IGNhc2VzIFsjXV8pLiBUaGUgYWN0dWFsIGBNb2R1bGUgbWFwIGxhbmd1YWdlYF8gaXMgZGVzY3JpYmVkIGluIGEgbGF0ZXIgc2VjdGlvbi4KK01vZHVsZSBtYXBzIGFyZSBzcGVjaWZpZWQgYXMgc2VwYXJhdGUgZmlsZXMgKGVhY2ggbmFtZWQgYGBtb2R1bGUubW9kdWxlbWFwYGApIGFsb25nc2lkZSB0aGUgaGVhZGVycyB0aGV5IGRlc2NyaWJlLCB3aGljaCBhbGxvd3MgdGhlbSB0byBiZSBhZGRlZCB0byBleGlzdGluZyBzb2Z0d2FyZSBsaWJyYXJpZXMgd2l0aG91dCBoYXZpbmcgdG8gY2hhbmdlIHRoZSBsaWJyYXJ5IGhlYWRlcnMgdGhlbXNlbHZlcyAoaW4gbW9zdCBjYXNlcyBbI11fKS4gVGhlIGFjdHVhbCBgTW9kdWxlIG1hcCBsYW5ndWFnZWBfIGlzIGRlc2NyaWJlZCBpbiBhIGxhdGVyIHNlY3Rpb24uCiAKIC4uIG5vdGU6OgogCkBAIC0xOTgsMjAgKzE5OCw2MCBAQAogYGAtZm1vZHVsZS1tYXAtZmlsZT08ZmlsZT5gYAogICBMb2FkIHRoZSBnaXZlbiBtb2R1bGUgbWFwIGZpbGUgaWYgYSBoZWFkZXIgZnJvbSBpdHMgZGlyZWN0b3J5IG9yIG9uZSBvZiBpdHMgc3ViZGlyZWN0b3JpZXMgaXMgbG9hZGVkLgogCitNb2R1bGUgU2VtYW50aWNzCis9PT09PT09PT09PT09PT09CisKK01vZHVsZXMgYXJlIG1vZGVsZWQgYXMgaWYgZWFjaCBzdWJtb2R1bGUgd2VyZSBhIHNlcGFyYXRlIHRyYW5zbGF0aW9uIHVuaXQsIGFuZCBhIG1vZHVsZSBpbXBvcnQgbWFrZXMgbmFtZXMgZnJvbSB0aGUgb3RoZXIgdHJhbnNsYXRpb24gdW5pdCB2aXNpYmxlLiBFYWNoIHN1Ym1vZHVsZSBzdGFydHMgd2l0aCBhIG5ldyBwcmVwcm9jZXNzb3Igc3RhdGUgYW5kIGFuIGVtcHR5IHRyYW5zbGF0aW9uIHVuaXQuCisKKy4uIG5vdGU6OgorCisgIFRoaXMgYmVoYXZpb3IgaXMgY3VycmVudGx5IG9ubHkgYXBwcm94aW1hdGVkIHdoZW4gYnVpbGRpbmcgYSBtb2R1bGUuIEVudGl0aWVzIHdpdGhpbiBhIHN1Ym1vZHVsZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYnVpbHQgYXJlIHZpc2libGUgd2hlbiBidWlsZGluZyBsYXRlciBzdWJtb2R1bGVzIGluIHRoYXQgbW9kdWxlLiBUaGlzIGNhbiBsZWFkIHRvIGZyYWdpbGUgbW9kdWxlcyB0aGF0IGRlcGVuZCBvbiB0aGUgYnVpbGQgb3JkZXIgdXNlZCBmb3IgdGhlIHN1Ym1vZHVsZXMgb2YgdGhlIG1vZHVsZSwgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIHVwb24uCisKK0FzIGFuIGV4YW1wbGUsIGluIEMsIHRoaXMgaW1wbGllcyB0aGF0IGlmIHR3byBzdHJ1Y3RzIGFyZSBkZWZpbmVkIGluIGRpZmZlcmVudCBzdWJtb2R1bGVzIHdpdGggdGhlIHNhbWUgbmFtZSwgdGhvc2UgdHdvIHR5cGVzIGFyZSBkaXN0aW5jdCB0eXBlcyAoYnV0IG1heSBiZSAqY29tcGF0aWJsZSogdHlwZXMgaWYgdGhlaXIgZGVmaW5pdGlvbnMgbWF0Y2guIEluIEMrKywgdHdvIHN0cnVjdHMgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gZGlmZmVyZW50IHN1Ym1vZHVsZXMgYXJlIHRoZSAqc2FtZSogdHlwZSwgYW5kIG11c3QgYmUgZXF1aXZhbGVudCB1bmRlciBDKysncyBPbmUgRGVmaW5pdGlvbiBSdWxlLgorCisuLiBub3RlOjoKKworICBDbGFuZyBjdXJyZW50bHkgb25seSBwZXJmb3JtcyBtaW5pbWFsIGNoZWNraW5nIGZvciB2aW9sYXRpb25zIG9mIHRoZSBPbmUgRGVmaW5pdGlvbiBSdWxlLgorCitNYWNyb3MKKy0tLS0tLQorCitUaGUgQyBhbmQgQysrIHByZXByb2Nlc3NvciBhc3N1bWVzIHRoYXQgdGhlIGlucHV0IHRleHQgaXMgYSBzaW5nbGUgbGluZWFyIGJ1ZmZlciwgYnV0IHdpdGggbW9kdWxlcyB0aGlzIGlzIG5vdCB0aGUgY2FzZS4gSXQgaXMgcG9zc2libGUgdG8gaW1wb3J0IHR3byBtb2R1bGVzIHRoYXQgaGF2ZSBjb25mbGljdGluZyBkZWZpbml0aW9ucyBmb3IgYSBtYWNybyAob3Igd2hlcmUgb25lIGBgI2RlZmluZWBgXHMgYSBtYWNybyBhbmQgdGhlIG90aGVyIGBgI3VuZGVmYGBcaW5lcyBpdCkuIFRoZSBydWxlcyBmb3IgaGFuZGxpbmcgbWFjcm8gZGVmaW5pdGlvbnMgaW4gdGhlIHByZXNlbmNlIG9mIG1vZHVsZXMgYXJlIGFzIGZvbGxvd3M6CisKKyogRWFjaCBkZWZpbml0aW9uIGFuZCB1bmRlZmluaXRpb24gb2YgYSBtYWNybyBpcyBjb25zaWRlcmVkIHRvIGJlIGEgZGlzdGluY3QgZW50aXR5LgorKiBTdWNoIGVudGl0aWVzIGFyZSAqdmlzaWJsZSogaWYgdGhleSBhcmUgZnJvbSB0aGUgY3VycmVudCBzdWJtb2R1bGUgb3IgdHJhbnNsYXRpb24gdW5pdCwgb3IgaWYgdGhleSB3ZXJlIGV4cG9ydGVkIGZyb20gYSBzdWJtb2R1bGUgdGhhdCBoYXMgYmVlbiBpbXBvcnRlZC4KKyogQSBgYCNkZWZpbmUgWGBgIG9yIGBgI3VuZGVmIFhgYCBkaXJlY3RpdmUgKm92ZXJyaWRlcyogYWxsIGRlZmluaXRpb25zIG9mIGBgWGBgIHRoYXQgYXJlIHZpc2libGUgYXQgdGhlIHBvaW50IG9mIHRoZSBkaXJlY3RpdmUuCisqIEEgYGAjZGVmaW5lYGAgb3IgYGAjdW5kZWZgYCBkaXJlY3RpdmUgaXMgKmFjdGl2ZSogaWYgaXQgaXMgdmlzaWJsZSBhbmQgbm8gdmlzaWJsZSBkaXJlY3RpdmUgb3ZlcnJpZGVzIGl0LgorKiBBIHNldCBvZiBtYWNybyBkaXJlY3RpdmVzIGlzICpjb25zaXN0ZW50KiBpZiBpdCBjb25zaXN0cyBvZiBvbmx5IGBgI3VuZGVmYGAgZGlyZWN0aXZlcywgb3IgaWYgYWxsIGBgI2RlZmluZWBgIGRpcmVjdGl2ZXMgaW4gdGhlIHNldCBkZWZpbmUgdGhlIG1hY3JvIG5hbWUgdG8gdGhlIHNhbWUgc2VxdWVuY2Ugb2YgdG9rZW5zIChmb2xsb3dpbmcgdGhlIHVzdWFsIHJ1bGVzIGZvciBtYWNybyByZWRlZmluaXRpb25zKS4KKyogSWYgYSBtYWNybyBuYW1lIGlzIHVzZWQgYW5kIHRoZSBzZXQgb2YgYWN0aXZlIGRpcmVjdGl2ZXMgaXMgbm90IGNvbnNpc3RlbnQsIHRoZSBwcm9ncmFtIGlzIGlsbC1mb3JtZWQuIE90aGVyd2lzZSwgdGhlICh1bmlxdWUpIG1lYW5pbmcgb2YgdGhlIG1hY3JvIG5hbWUgaXMgdXNlZC4KKworRm9yIGV4YW1wbGUsIHN1cHBvc2U6CisKKyogYGA8c3RkaW8uaD5gYCBkZWZpbmVzIGEgbWFjcm8gYGBnZXRjYGAgKGFuZCBleHBvcnRzIGl0cyBgYCNkZWZpbmVgYCkKKyogYGA8Y3N0ZGlvPmBgIGltcG9ydHMgdGhlIGBgPHN0ZGlvLmg+YGAgbW9kdWxlIGFuZCB1bmRlZmluZXMgdGhlIG1hY3JvIChhbmQgZXhwb3J0cyBpdHMgYGAjdW5kZWZgYCkKKyAgCitUaGUgYGAjdW5kZWZgYCBvdmVycmlkZXMgdGhlIGBgI2RlZmluZWBgLCBhbmQgYSBzb3VyY2UgZmlsZSB0aGF0IGltcG9ydHMgYm90aCBtb2R1bGVzICppbiBhbnkgb3JkZXIqIHdpbGwgbm90IHNlZSBgYGdldGNgYCBkZWZpbmVkIGFzIGEgbWFjcm8uCisKIE1vZHVsZSBNYXAgTGFuZ3VhZ2UKID09PT09PT09PT09PT09PT09PT0KIAogVGhlIG1vZHVsZSBtYXAgbGFuZ3VhZ2UgZGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gaGVhZGVyIGZpbGVzIHRvIHRoZQogbG9naWNhbCBzdHJ1Y3R1cmUgb2YgbW9kdWxlcy4gVG8gZW5hYmxlIHN1cHBvcnQgZm9yIHVzaW5nIGEgbGlicmFyeSBhcwotYSBtb2R1bGUsIG9uZSBtdXN0IHdyaXRlIGEgYGBtb2R1bGUubWFwYGAgZmlsZSBmb3IgdGhhdCBsaWJyYXJ5LiBUaGUKLWBgbW9kdWxlLm1hcGBgIGZpbGUgaXMgcGxhY2VkIGFsb25nc2lkZSB0aGUgaGVhZGVyIGZpbGVzIHRoZW1zZWx2ZXMsCithIG1vZHVsZSwgb25lIG11c3Qgd3JpdGUgYSBgYG1vZHVsZS5tb2R1bGVtYXBgYCBmaWxlIGZvciB0aGF0IGxpYnJhcnkuIFRoZQorYGBtb2R1bGUubW9kdWxlbWFwYGAgZmlsZSBpcyBwbGFjZWQgYWxvbmdzaWRlIHRoZSBoZWFkZXIgZmlsZXMgdGhlbXNlbHZlcywKIGFuZCBpcyB3cml0dGVuIGluIHRoZSBtb2R1bGUgbWFwIGxhbmd1YWdlIGRlc2NyaWJlZCBiZWxvdy4KIAorLi4gbm90ZTo6CisgICAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyByZWxlYXNlcywgaWYgYSBtb2R1bGUgbWFwIGZpbGUgbmFtZWQKKyAgICBgYG1vZHVsZS5tb2R1bGVtYXBgYCBpcyBub3QgZm91bmQsIENsYW5nIHdpbGwgYWxzbyBzZWFyY2ggZm9yIGEgZmlsZSBuYW1lZAorICAgIGBgbW9kdWxlLm1hcGBgLiBUaGlzIGJlaGF2aW9yIGlzIGRlcHJlY2F0ZWQgYW5kIHdlIHBsYW4gdG8gZXZlbnR1YWxseQorICAgIHJlbW92ZSBpdC4KKwogQXMgYW4gZXhhbXBsZSwgdGhlIG1vZHVsZSBtYXAgZmlsZSBmb3IgdGhlIEMgc3RhbmRhcmQgbGlicmFyeSBtaWdodCBsb29rIGEgYml0IGxpa2UgdGhpczoKIAogLi4gcGFyc2VkLWxpdGVyYWw6OgogCi0gIG1vZHVsZSBzdGQgW3N5c3RlbV0geworICBtb2R1bGUgc3RkIFtzeXN0ZW1dIFtleHRlcm5fY10gewogICAgIG1vZHVsZSBjb21wbGV4IHsKICAgICAgIGhlYWRlciAiY29tcGxleC5oIgogICAgICAgZXhwb3J0ICoKQEAgLTI4NSwxMyArMzI1LDE1IEBACiAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAKICAgTmFtZS5mcmFtZXdvcmsvCi0gICAgbW9kdWxlLm1hcCAgICAgICAgICAgICAgICBNb2R1bGUgbWFwIGZvciB0aGUgZnJhbWV3b3JrCisgICAgTW9kdWxlcy9tb2R1bGUubW9kdWxlbWFwICBNb2R1bGUgbWFwIGZvciB0aGUgZnJhbWV3b3JrCiAgICAgSGVhZGVycy8gICAgICAgICAgICAgICAgICBTdWJkaXJlY3RvcnkgY29udGFpbmluZyBmcmFtZXdvcmsgaGVhZGVycwogICAgIEZyYW1ld29ya3MvICAgICAgICAgICAgICAgU3ViZGlyZWN0b3J5IGNvbnRhaW5pbmcgZW1iZWRkZWQgZnJhbWV3b3JrcwogICAgIFJlc291cmNlcy8gICAgICAgICAgICAgICAgU3ViZGlyZWN0b3J5IGNvbnRhaW5pbmcgYWRkaXRpb25hbCByZXNvdXJjZXMKICAgICBOYW1lICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbGljIGxpbmsgdG8gdGhlIHNoYXJlZCBsaWJyYXJ5IGZvciB0aGUgZnJhbWV3b3JrCiAKLVRoZSBgYHN5c3RlbWBgIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhhdCB0aGUgbW9kdWxlIGlzIGEgc3lzdGVtIG1vZHVsZS4gV2hlbiBhIHN5c3RlbSBtb2R1bGUgaXMgcmVidWlsdCwgYWxsIG9mIHRoZSBtb2R1bGUncyBoZWFkZXIgd2lsbCBiZSBjb25zaWRlcmVkIHN5c3RlbSBoZWFkZXJzLCB3aGljaCBzdXBwcmVzc2VzIHdhcm5pbmdzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gcGxhY2luZyBgYCNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXJgYCBpbiBlYWNoIG9mIHRoZSBtb2R1bGUncyBoZWFkZXJzLiBUaGUgZm9ybSBvZiBhdHRyaWJ1dGVzIGlzIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiBBdHRyaWJ1dGVzXywgYmVsb3cuCitUaGUgYGBzeXN0ZW1gYCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoYXQgdGhlIG1vZHVsZSBpcyBhIHN5c3RlbSBtb2R1bGUuIFdoZW4gYSBzeXN0ZW0gbW9kdWxlIGlzIHJlYnVpbHQsIGFsbCBvZiB0aGUgbW9kdWxlJ3MgaGVhZGVycyB3aWxsIGJlIGNvbnNpZGVyZWQgc3lzdGVtIGhlYWRlcnMsIHdoaWNoIHN1cHByZXNzZXMgd2FybmluZ3MuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBwbGFjaW5nIGBgI3ByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcmBgIGluIGVhY2ggb2YgdGhlIG1vZHVsZSdzIGhlYWRlcnMuIFRoZSBmb3JtIG9mIGF0dHJpYnV0ZXMgaXMgZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIEF0dHJpYnV0ZXNfLCBiZWxvdy4KKworVGhlIGBgZXh0ZXJuX2NgYCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoYXQgdGhlIG1vZHVsZSBjb250YWlucyBDIGNvZGUgdGhhdCBjYW4gYmUgdXNlZCBmcm9tIHdpdGhpbiBDKysuIFdoZW4gc3VjaCBhIG1vZHVsZSBpcyBidWlsdCBmb3IgdXNlIGluIEMrKyBjb2RlLCBhbGwgb2YgdGhlIG1vZHVsZSdzIGhlYWRlcnMgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZSBjb250YWluZWQgd2l0aGluIGFuIGltcGxpY2l0IGBgZXh0ZXJuICJDImBgIGJsb2NrLiBBbiBpbXBvcnQgZm9yIGEgbW9kdWxlIHdpdGggdGhpcyBhdHRyaWJ1dGUgY2FuIGFwcGVhciB3aXRoaW4gYW4gYGBleHRlcm4gIkMiYGAgYmxvY2suIE5vIG90aGVyIHJlc3RyaWN0aW9ucyBhcmUgbGlmdGVkLCBob3dldmVyOiB0aGUgbW9kdWxlIGN1cnJlbnRseSBjYW5ub3QgYmUgaW1wb3J0ZWQgd2l0aGluIGFuIGBgZXh0ZXJuICJDImBgIGJsb2NrIGluIGEgbmFtZXNwYWNlLgogCiBNb2R1bGVzIGNhbiBoYXZlIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBraW5kcyBvZiBtZW1iZXJzLCBlYWNoIG9mIHdoaWNoIGlzIGRlc2NyaWJlZCBiZWxvdzoKIApAQCAtNTczLDcgKzYxNSw3IEBACiAgICAgdXNlIEIKICAgfQogCi1XaGVuIGNvbXBpbGluZyBhIHNvdXJjZSBmaWxlIHRoYXQgaW1wbGVtZW50cyBhIG1vZHVsZSwgdXNlIHRoZSBvcHRpb24gYGAtZm1vZHVsZS1uYW1lPWBgbW9kdWxlLWlkIHRvIGluZGljYXRlIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoYXQgbW9kdWxlLgorV2hlbiBjb21waWxpbmcgYSBzb3VyY2UgZmlsZSB0aGF0IGltcGxlbWVudHMgYSBtb2R1bGUsIHVzZSB0aGUgb3B0aW9uIGBgLWZtb2R1bGUtbmFtZT1tb2R1bGUtaWRgYCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzb3VyY2UgZmlsZSBpcyBsb2dpY2FsbHkgcGFydCBvZiB0aGF0IG1vZHVsZS4KIAogVGhlIGNvbXBpbGVyIGF0IHByZXNlbnQgb25seSBhcHBsaWVzIHJlc3RyaWN0aW9ucyB0byB0aGUgbW9kdWxlIGRpcmVjdGx5IGJlaW5nIGJ1aWx0LgogCkBAIC02OTEsNiArNzMzLDYzIEBACiAKIEFueSAqaWRlbnRpZmllciogY2FuIGJlIHVzZWQgYXMgYW4gYXR0cmlidXRlLCBhbmQgZWFjaCBkZWNsYXJhdGlvbiBzcGVjaWZpZXMgd2hhdCBhdHRyaWJ1dGVzIGNhbiBiZSBhcHBsaWVkIHRvIGl0LgogCitQcml2YXRlIE1vZHVsZSBNYXAgRmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTW9kdWxlIG1hcCBmaWxlcyBhcmUgdHlwaWNhbGx5IG5hbWVkIGBgbW9kdWxlLm1vZHVsZW1hcGBgIGFuZCBsaXZlCitlaXRoZXIgYWxvbmdzaWRlIHRoZSBoZWFkZXJzIHRoZXkgZGVzY3JpYmUgb3IgaW4gYSBwYXJlbnQgZGlyZWN0b3J5IG9mCit0aGUgaGVhZGVycyB0aGV5IGRlc2NyaWJlLiBUaGVzZSBtb2R1bGUgbWFwcyB0eXBpY2FsbHkgZGVzY3JpYmUgYWxsIG9mCit0aGUgQVBJIGZvciB0aGUgbGlicmFyeS4KKworSG93ZXZlciwgaW4gc29tZSBjYXNlcywgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgcGFydGljdWxhciBoZWFkZXJzCitpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlICJwdWJsaWMiIGFuZCAicHJpdmF0ZSIgQVBJcyBvZiBhCitwYXJ0aWN1bGFyIGxpYnJhcnkuIEZvciBleGFtcGxlLCBhIGxpYnJhcnkgbWF5IGNvbnRhaW4gdGhlIGhlYWRlcnMKK2BgRm9vLmhgYCBhbmQgYGBGb29fUHJpdmF0ZS5oYGAsIHByb3ZpZGluZyBwdWJsaWMgYW5kIHByaXZhdGUgQVBJcywKK3Jlc3BlY3RpdmVseS4gQWRkaXRpb25hbGx5LCBgYEZvb19Qcml2YXRlLmhgYCBtYXkgb25seSBiZSBhdmFpbGFibGUgb24KK3NvbWUgdmVyc2lvbnMgb2YgbGlicmFyeSwgYW5kIGFic2VudCBpbiBvdGhlcnMuIE9uZSBjYW5ub3QgZWFzaWx5CitleHByZXNzIHRoaXMgd2l0aCBhIHNpbmdsZSBtb2R1bGUgbWFwIGZpbGUgaW4gdGhlIGxpYnJhcnk6CisKKy4uIHBhcnNlZC1saXRlcmFsOjoKKworICBtb2R1bGUgRm9vIHsKKyAgICBoZWFkZXIgIkZvby5oIgorICAgIAorICAgIGV4cGxpY2l0IG1vZHVsZSBQcml2YXRlIHsKKyAgICAgIGhlYWRlciAiRm9vX1ByaXZhdGUuaCIKKyAgICB9CisgIH0KKworCitiZWNhdXNlIHRoZSBoZWFkZXIgYGBGb29fUHJpdmF0ZS5oYGAgd29uJ3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gVGhlCittb2R1bGUgbWFwIGZpbGUgY291bGQgYmUgY3VzdG9taXplZCBiYXNlZCBvbiB3aGV0aGVyCitgYEZvb19Qcml2YXRlLmhgYGlzIGF2YWlsYWJsZSBvciBub3QsIGJ1dCBkb2luZyBzbyByZXF1aXJlcyBjdXN0b20KK2J1aWxkIG1hY2hpbmVyeS4KKworUHJpdmF0ZSBtb2R1bGUgbWFwIGZpbGVzLCB3aGljaCBhcmUgbmFtZWQgYGBtb2R1bGUucHJpdmF0ZS5tb2R1bGVtYXBgYAorKG9yLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYGBtb2R1bGVfcHJpdmF0ZS5tYXBgYCksIGFsbG93IG9uZSB0bworYXVnbWVudCB0aGUgcHJpbWFyeSBtb2R1bGUgbWFwIGZpbGUgd2l0aCBhbiBhZGRpdGlvbmFsIHN1Ym1vZHVsZS4gRm9yCitleGFtcGxlLCB3ZSB3b3VsZCBzcGxpdCB0aGUgbW9kdWxlIG1hcCBmaWxlIGFib3ZlIGludG8gdHdvIG1vZHVsZSBtYXAKK2ZpbGVzOgorCisuLiBwYXJzZWQtbGl0ZXJhbDo6CisKKyAgLyogbW9kdWxlLm1vZHVsZW1hcCAqLworICBtb2R1bGUgRm9vIHsKKyAgICBoZWFkZXIgIkZvby5oIgorICB9CisgIAorICAvKiBtb2R1bGUucHJpdmF0ZS5tb2R1bGVtYXAgKi8KKyAgZXhwbGljaXQgbW9kdWxlIEZvby5Qcml2YXRlIHsKKyAgICBoZWFkZXIgIkZvb19Qcml2YXRlLmgiCisgIH0KKworCitXaGVuIGEgYGBtb2R1bGUucHJpdmF0ZS5tb2R1bGVtYXBgYCBmaWxlIGlzIGZvdW5kIGFsb25nc2lkZSBhCitgYG1vZHVsZS5tb2R1bGVtYXBgYCBmaWxlLCBpdCBpcyBsb2FkZWQgYWZ0ZXIgdGhlIGBgbW9kdWxlLm1vZHVsZW1hcGBgCitmaWxlLiBJbiBvdXIgZXhhbXBsZSBsaWJyYXJ5LCB0aGUgYGBtb2R1bGUucHJpdmF0ZS5tb2R1bGVtYXBgYCBmaWxlCit3b3VsZCBiZSBhdmFpbGFibGUgd2hlbiBgYEZvb19Qcml2YXRlLmhgYCBpcyBhdmFpbGFibGUsIG1ha2luZyBpdAorZWFzaWVyIHRvIHNwbGl0IGEgbGlicmFyeSdzIHB1YmxpYyBhbmQgcHJpdmF0ZSBBUElzIGFsb25nIGhlYWRlcgorYm91bmRhcmllcy4KKwogTW9kdWxhcml6aW5nIGEgUGxhdGZvcm0KID09PT09PT09PT09PT09PT09PT09PT09CiBUbyBnZXQgYW55IGJlbmVmaXQgb3V0IG9mIG1vZHVsZXMsIG9uZSBuZWVkcyB0byBpbnRyb2R1Y2UgbW9kdWxlIG1hcHMgZm9yIHNvZnR3YXJlIGxpYnJhcmllcyBzdGFydGluZyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzdGFjay4gVGhpcyB0eXBpY2FsbHkgbWVhbnMgaW50cm9kdWNpbmcgYSBtb2R1bGUgbWFwIGNvdmVyaW5nIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgaGVhZGVycyBhbmQgdGhlIEMgc3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzIChpbiBgYC91c3IvaW5jbHVkZWBgLCBmb3IgYSBVbml4IHN5c3RlbSkuIApkaWZmIC0tZ2l0IGEvZG9jcy9PYmplY3RpdmVDTGl0ZXJhbHMucnN0IGIvZG9jcy9PYmplY3RpdmVDTGl0ZXJhbHMucnN0CmluZGV4IDgwNjZkOGYuLjg5MDdjMWUgMTAwNjQ0Ci0tLSBhL2RvY3MvT2JqZWN0aXZlQ0xpdGVyYWxzLnJzdAorKysgYi9kb2NzL09iamVjdGl2ZUNMaXRlcmFscy5yc3QKQEAgLTkxLDcgKzkxLDcgQEAKIGFuZCBgYFlFU2BgIGFuZCBgYE5PYGAgd2VyZSBtYWNyb3MgdGhhdCBleHBhbmQgdG8gYGAoQk9PTCkxYGAgYW5kCiBgYChCT09MKTBgYCByZXNwZWN0aXZlbHkuIFRvIHN1cHBvcnQgYGBAWUVTYGAgYW5kIGBgQE5PYGAgZXhwcmVzc2lvbnMsCiB0aGVzZSBtYWNyb3MgYXJlIG5vdyBkZWZpbmVkIHVzaW5nIG5ldyBsYW5ndWFnZSBrZXl3b3JkcyBpbgotYGAmTFQ7b2JqYy9vYmpjLmgmR1Q7YGA6CitgYDxvYmpjL29iamMuaD5gYDoKIAogLi4gY29kZS1ibG9jazo6IG9iamMKIApAQCAtMjUxLDcgKzI1MSw3IEBACiBzdWItZXhwcmVzc2lvbnMgb2YgYSBkaWN0aW9uYXJ5IGxpdGVyYWwgbXVzdCBiZSBPYmplY3RpdmUtQyBvYmplY3QKIHBvaW50ZXIgdHlwZWQsIGFzIGluIGFycmF5IGxpdGVyYWxzLiBLZXkgc3ViLWV4cHJlc3Npb25zIG11c3QgYmUgb2YgYW4KIE9iamVjdGl2ZS1DIG9iamVjdCBwb2ludGVyIHR5cGUgdGhhdCBpbXBsZW1lbnRzIHRoZQotYGAmTFQ7TlNDb3B5aW5nJkdUO2BgIHByb3RvY29sLgorYGA8TlNDb3B5aW5nPmBgIHByb3RvY29sLgogCiBEaXNjdXNzaW9uCiAtLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kb2NzL1JlbGVhc2VOb3Rlcy5yc3QgYi9kb2NzL1JlbGVhc2VOb3Rlcy5yc3QKaW5kZXggYjI0YmNhOS4uZGYyN2FmOSAxMDA2NDQKLS0tIGEvZG9jcy9SZWxlYXNlTm90ZXMucnN0CisrKyBiL2RvY3MvUmVsZWFzZU5vdGVzLnJzdApAQCAtMSwxNiArMSwyNCBAQAotPT09PT09PT09PT09PT09PT09PT09PT0KLUNsYW5nIDMuNCBSZWxlYXNlIE5vdGVzCi09PT09PT09PT09PT09PT09PT09PT09PQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ2xhbmcgMy41IChJbi1Qcm9ncmVzcykgUmVsZWFzZSBOb3RlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAuLiBjb250ZW50czo6CiAgICA6bG9jYWw6CiAgICA6ZGVwdGg6IDIKIAorV3JpdHRlbiBieSB0aGUgYExMVk0gVGVhbSA8aHR0cDovL2xsdm0ub3JnLz5gXworCisuLiB3YXJuaW5nOjoKKworICAgVGhlc2UgYXJlIGluLXByb2dyZXNzIG5vdGVzIGZvciB0aGUgdXBjb21pbmcgQ2xhbmcgMy41IHJlbGVhc2UuIFlvdSBtYXkKKyAgIHByZWZlciB0aGUgYENsYW5nIDMuNCBSZWxlYXNlIE5vdGVzCisgICA8aHR0cDovL2xsdm0ub3JnL3JlbGVhc2VzLzMuNC90b29scy9jbGFuZy9kb2NzL1JlbGVhc2VOb3Rlcy5odG1sPmBfLgorCiBJbnRyb2R1Y3Rpb24KID09PT09PT09PT09PQogCiBUaGlzIGRvY3VtZW50IGNvbnRhaW5zIHRoZSByZWxlYXNlIG5vdGVzIGZvciB0aGUgQ2xhbmcgQy9DKysvT2JqZWN0aXZlLUMKLWZyb250ZW5kLCBwYXJ0IG9mIHRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlLCByZWxlYXNlIDMuNC4gSGVyZSB3ZQorZnJvbnRlbmQsIHBhcnQgb2YgdGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUsIHJlbGVhc2UgMy41LiBIZXJlIHdlCiBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIENsYW5nIGluIHNvbWUgZGV0YWlsLCBpbmNsdWRpbmcgbWFqb3IKIGltcHJvdmVtZW50cyBmcm9tIHRoZSBwcmV2aW91cyByZWxlYXNlIGFuZCBuZXcgZmVhdHVyZSB3b3JrLiBGb3IgdGhlCiBnZW5lcmFsIExMVk0gcmVsZWFzZSBub3Rlcywgc2VlIGB0aGUgTExWTQpAQCAtMTgsMjUyICsyNiwxMzggQEAKIHJlbGVhc2VzIG1heSBiZSBkb3dubG9hZGVkIGZyb20gdGhlIGBMTFZNIHJlbGVhc2VzIHdlYgogc2l0ZSA8aHR0cDovL2xsdm0ub3JnL3JlbGVhc2VzLz5gXy4KIAotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQ2xhbmcgb3IgTExWTSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZQotbGF0ZXN0IHJlbGVhc2UsIHBsZWFzZSBjaGVjayBvdXQgdGhlIG1haW4gYENsYW5nIFdlYiBTaXRlCi08aHR0cDovL2NsYW5nLmxsdm0ub3JnPmBfIG9yIHRoZSBgTExWTSBXZWIgU2l0ZSA8aHR0cDovL2xsdm0ub3JnPmBfLgorRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQ2xhbmcgb3IgTExWTSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgbGF0ZXN0IHJlbGVhc2UsIHBsZWFzZSBjaGVjayBvdXQgdGhlIG1haW4gcGxlYXNlIHNlZSB0aGUgYENsYW5nIFdlYgorU2l0ZSA8aHR0cDovL2NsYW5nLmxsdm0ub3JnPmBfIG9yIHRoZSBgTExWTSBXZWIKK1NpdGUgPGh0dHA6Ly9sbHZtLm9yZz5gXy4KIAotTm90ZSB0aGF0IGlmIHlvdSBhcmUgcmVhZGluZyB0aGlzIGZpbGUgZnJvbSBhIFN1YnZlcnNpb24gY2hlY2tvdXQgb3IgdGhlIG1haW4KLUNsYW5nIHdlYiBwYWdlLCB0aGlzIGRvY3VtZW50IGFwcGxpZXMgdG8gdGhlICpuZXh0KiByZWxlYXNlLCBub3QgdGhlIGN1cnJlbnQKLW9uZS4gVG8gc2VlIHRoZSByZWxlYXNlIG5vdGVzIGZvciBhIHNwZWNpZmljIHJlbGVhc2UsIHBsZWFzZSBzZWUgdGhlIGByZWxlYXNlcwotcGFnZSA8aHR0cDovL2xsdm0ub3JnL3JlbGVhc2VzLz5gXy4KK05vdGUgdGhhdCBpZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyBmaWxlIGZyb20gYSBTdWJ2ZXJzaW9uIGNoZWNrb3V0IG9yIHRoZQorbWFpbiBDbGFuZyB3ZWIgcGFnZSwgdGhpcyBkb2N1bWVudCBhcHBsaWVzIHRvIHRoZSAqbmV4dCogcmVsZWFzZSwgbm90Cit0aGUgY3VycmVudCBvbmUuIFRvIHNlZSB0aGUgcmVsZWFzZSBub3RlcyBmb3IgYSBzcGVjaWZpYyByZWxlYXNlLCBwbGVhc2UKK3NlZSB0aGUgYHJlbGVhc2VzIHBhZ2UgPGh0dHA6Ly9sbHZtLm9yZy9yZWxlYXNlcy8+YF8uCiAKLVdoYXQncyBOZXcgaW4gQ2xhbmcgMy40PworV2hhdCdzIE5ldyBpbiBDbGFuZyAzLjU/CiA9PT09PT09PT09PT09PT09PT09PT09PT0KIAotU29tZSBvZiB0aGUgbWFqb3IgbmV3IGZlYXR1cmVzIGFuZCBpbXByb3ZlbWVudHMgdG8gQ2xhbmcgYXJlIGxpc3RlZCBoZXJlLgotR2VuZXJpYyBpbXByb3ZlbWVudHMgdG8gQ2xhbmcgYXMgYSB3aG9sZSBvciB0byBpdHMgdW5kZXJseWluZyBpbmZyYXN0cnVjdHVyZQotYXJlIGRlc2NyaWJlZCBmaXJzdCwgZm9sbG93ZWQgYnkgbGFuZ3VhZ2Utc3BlY2lmaWMgc2VjdGlvbnMgd2l0aCBpbXByb3ZlbWVudHMKLXRvIENsYW5nJ3Mgc3VwcG9ydCBmb3IgdGhvc2UgbGFuZ3VhZ2VzLgotCi1MYXN0IHJlbGVhc2Ugd2hpY2ggd2lsbCBidWlsZCBhcyBDKys5OAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBpcyBleHBlY3RlZCB0byBiZSB0aGUgbGFzdCByZWxlYXNlIG9mIENsYW5nIHdoaWNoIGNvbXBpbGVzIHVzaW5nIGEgQysrOTgKLXRvb2xjaGFpbi4gV2UgZXhwZWN0IHRvIHN0YXJ0IHVzaW5nIHNvbWUgQysrMTEgZmVhdHVyZXMgaW4gQ2xhbmcgc3RhcnRpbmcgYWZ0ZXIKLXRoaXMgcmVsZWFzZS4gVGhhdCBzYWlkLCB3ZSBhcmUgY29tbWl0dGVkIHRvIHN1cHBvcnRpbmcgYSByZWFzb25hYmxlIHNldCBvZgotbW9kZXJuIEMrKyB0b29sY2hhaW5zIGFzIHRoZSBob3N0IGNvbXBpbGVyIG9uIGFsbCBvZiB0aGUgcGxhdGZvcm1zLiBUaGlzIHdpbGwKLWF0IGxlYXN0IGluY2x1ZGUgVmlzdWFsIFN0dWRpbyAyMDEyIG9uIFdpbmRvd3MsIGFuZCBDbGFuZyAzLjEgb3IgR0NDIDQuNy54IG9uCi1NYWMgYW5kIExpbnV4LiBUaGUgZmluYWwgc2V0IG9mIGNvbXBpbGVycyAoYW5kIHRoZSBDKysxMSBmZWF0dXJlcyB0aGV5IHN1cHBvcnQpCi1pcyBub3Qgc2V0IGluIHN0b25lLCBidXQgd2Ugd2FudGVkIHVzZXJzIG9mIENsYW5nIHRvIGhhdmUgYSBoZWFkcyB1cCB0aGF0IHRoZQotbmV4dCByZWxlYXNlIHdpbGwgaW52b2x2ZSBhIHN1YnN0YW50aWFsIGNoYW5nZSBpbiB0aGUgaG9zdCB0b29sY2hhaW4KLXJlcXVpcmVtZW50cy4KLQotTm90ZSB0aGF0IHRoaXMgY2hhbmdlIGlzIHBhcnQgb2YgYSBjaGFuZ2UgZm9yIHRoZSBlbnRpcmUgTExWTSBwcm9qZWN0LCBub3QganVzdAotQ2xhbmcuCitTb21lIG9mIHRoZSBtYWpvciBuZXcgZmVhdHVyZXMgYW5kIGltcHJvdmVtZW50cyB0byBDbGFuZyBhcmUgbGlzdGVkCitoZXJlLiBHZW5lcmljIGltcHJvdmVtZW50cyB0byBDbGFuZyBhcyBhIHdob2xlIG9yIHRvIGl0cyB1bmRlcmx5aW5nCitpbmZyYXN0cnVjdHVyZSBhcmUgZGVzY3JpYmVkIGZpcnN0LCBmb2xsb3dlZCBieSBsYW5ndWFnZS1zcGVjaWZpYworc2VjdGlvbnMgd2l0aCBpbXByb3ZlbWVudHMgdG8gQ2xhbmcncyBzdXBwb3J0IGZvciB0aG9zZSBsYW5ndWFnZXMuCiAKIE1ham9yIE5ldyBGZWF0dXJlcwogLS0tLS0tLS0tLS0tLS0tLS0tCiAKKy0gQ2xhbmcgdXNlcyB0aGUgbmV3IE1pbmdXIEFCSQorICBHQ0MgNC43IGNoYW5nZWQgdGhlIG1pbmd3IEFCSS4gQ2xhbmcgMy40IGFuZCBvbGRlciB1c2UgdGhlIEdDQyA0LjYKKyAgQUJJLiBDbGFuZyAzLjUgYW5kIG5ld2VyIHVzZSB0aGUgR0NDIDQuNyBhYmkuCisKKy0gVGhlIF9faGFzX2F0dHJpYnV0ZSBmZWF0dXJlIHRlc3QgaXMgbm93IHRhcmdldC1hd2FyZS4gT2xkZXIgdmVyc2lvbnMgb2YgQ2xhbmcgCisgIHdvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIGF0dHJpYnV0ZSBzcGVsbGluZyB3YXMga25vd24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciAKKyAgdGhlIGF0dHJpYnV0ZSB3YXMgYXZhaWxhYmxlIHRvIHRoZSBzcGVjaWZpYyB0YXJnZXQuIENsYW5nIG5vdyByZXR1cm5zIHRydWUgb25seSAKKyAgd2hlbiB0aGUgYXR0cmlidXRlIHBlcnRhaW5zIHRvIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHRhcmdldC4KKworCiBJbXByb3ZlbWVudHMgdG8gQ2xhbmcncyBkaWFnbm9zdGljcwogXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAotQ2xhbmcncyBkaWFnbm9zdGljcyBhcmUgY29uc3RhbnRseSBiZWluZyBpbXByb3ZlZCB0byBjYXRjaCBtb3JlIGlzc3VlcywgZXhwbGFpbgotdGhlbSBtb3JlIGNsZWFybHksIGFuZCBwcm92aWRlIG1vcmUgYWNjdXJhdGUgc291cmNlIGluZm9ybWF0aW9uIGFib3V0IHRoZW0uIFRoZQotaW1wcm92ZW1lbnRzIHNpbmNlIHRoZSAzLjMgcmVsZWFzZSBpbmNsdWRlOgorQ2xhbmcncyBkaWFnbm9zdGljcyBhcmUgY29uc3RhbnRseSBiZWluZyBpbXByb3ZlZCB0byBjYXRjaCBtb3JlIGlzc3VlcywKK2V4cGxhaW4gdGhlbSBtb3JlIGNsZWFybHksIGFuZCBwcm92aWRlIG1vcmUgYWNjdXJhdGUgc291cmNlIGluZm9ybWF0aW9uCithYm91dCB0aGVtLiBUaGUgaW1wcm92ZW1lbnRzIHNpbmNlIHRoZSAzLjQgcmVsZWFzZSBpbmNsdWRlOgogCi0tIC1XaGVhZGVyLWd1YXJkIHdhcm5zIG9uIG1pc21hdGNoZXMgYmV0d2VlbiB0aGUgI2lmbmRlZiBhbmQgI2RlZmluZSBsaW5lcwotICBpbiBhIGhlYWRlciBndWFyZC4KLQotICAuLiBjb2RlLWJsb2NrOjogYwotCi0gICAgI2lmbmRlZiBtdWx0aXBsZQotICAgICNkZWZpbmUgbXVsdGkKLSAgICAjZW5kaWYKLQotICByZXR1cm5zCi0gIGB3YXJuaW5nOiAnbXVsdGlwbGUnIGlzIHVzZWQgYXMgYSBoZWFkZXIgZ3VhcmQgaGVyZSwgZm9sbG93ZWQgYnkgI2RlZmluZSBvZiBhIGRpZmZlcmVudCBtYWNybyBbLVdoZWFkZXItZ3VhcmRdYAotCi0tIC1XbG9naWNhbC1ub3QtcGFyZW50aGVzZXMgd2FybnMgd2hlbiBhIGxvZ2ljYWwgbm90ICgnIScpIG9ubHkgYXBwbGllcyB0byB0aGUKLSAgbGVmdC1oYW5kIHNpZGUgb2YgYSBjb21wYXJpc29uLiAgVGhpcyB3YXJuaW5nIGlzIHBhcnQgb2YgLVdwYXJlbnRoZXNlcy4KLQotICAuLiBjb2RlLWJsb2NrOjogYysrCi0KLSAgICBpbnQgaTEgPSAwLCBpMiA9IDE7Ci0gICAgYm9vbCByZXQ7Ci0gICAgcmV0ID0gIWkxID09IGkyOwotCi0gIHJldHVybnMKLSAgYHdhcm5pbmc6IGxvZ2ljYWwgbm90IGlzIG9ubHkgYXBwbGllZCB0byB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhpcyBjb21wYXJpc29uIFstV2xvZ2ljYWwtbm90LXBhcmVudGhlc2VzXWAKLQotCi0tIEJvb2xlYW4gaW5jcmVtZW50LCBhIGRlcHJlY2F0ZWQgZmVhdHVyZSwgaGFzIG93biB3YXJuaW5nIGZsYWcKLSAgLVdkZXByZWNhdGVkLWluY3JlbWVudC1ib29sLCBhbmQgaXMgc3RpbGwgcGFydCBvZiAtV2RlcHJlY2F0ZWQuCi0tIENsYW5nIGVycm9ycyBvbiBidWlsdGluIGVudW0gaW5jcmVtZW50cyBhbmQgZGVjcmVtZW50cyBpbiBDKysuCi0KLSAgLi4gY29kZS1ibG9jazo6IGMrKwotCi0gICAgZW51bSBBIHsgQTEsIEEyIH07Ci0gICAgdm9pZCB0ZXN0KCkgewotICAgIAlBIGE7Ci0gICAgCWErKzsKLSAgICB9Ci0KLSAgcmV0dXJucwotICBgZXJyb3I6IGNhbm5vdCBpbmNyZW1lbnQgZXhwcmVzc2lvbiBvZiBlbnVtIHR5cGUgJ0EnYAotCi0KLS0gLVdsb29wLWFuYWx5c2lzIG5vdyB3YXJucyBvbiBmb3ItbG9vcHMgd2hpY2ggaGF2ZSB0aGUgc2FtZSBpbmNyZW1lbnQgb3IKLSAgZGVjcmVtZW50IGluIHRoZSBsb29wIGhlYWRlciBhcyB0aGUgbGFzdCBzdGF0ZW1lbnQgaW4gdGhlIGxvb3AuCi0KLSAgLi4gY29kZS1ibG9jazo6IGMKLQotICAgIHZvaWQgZm9vKGNoYXIgKmEsIGNoYXIgKmIsIHVuc2lnbmVkIGMpIHsKLQkgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjOyArK2kpIHsKLQkJYVtpXSA9IGJbaV07Ci0JCSsraTsKLQkgIH0KLSAgICB9Ci0KLSAgcmV0dXJucwotICBgd2FybmluZzogdmFyaWFibGUgJ2knIGlzIGluY3JlbWVudGVkIGJvdGggaW4gdGhlIGxvb3AgaGVhZGVyIGFuZCBpbiB0aGUgbG9vcCBib2R5IFstV2xvb3AtYW5hbHlzaXNdYAotCi0tIC1XdW5pbml0aWFsaXplZCBub3cgcGVyZm9ybXMgY2hlY2tpbmcgYWNyb3NzIGZpZWxkIGluaXRpYWxpemVycyB0byBkZXRlY3QKLSAgd2hlbiBvbmUgZmllbGQgaW4gdXNlZCB1bmluaXRpYWxpemVkIGluIGFub3RoZXIgZmllbGQgaW5pdGlhbGl6YXRpb24uCi0KLSAgLi4gY29kZS1ibG9jazo6IGMrKwotCi0gICAgY2xhc3MgQSB7Ci0gICAgICBpbnQgeDsKLSAgICAgIGludCB5OwotICAgICAgQSgpIDogeCh5KSB7fQotICAgIH07Ci0KLSAgcmV0dXJucwotICBgd2FybmluZzogZmllbGQgJ3knIGlzIHVuaW5pdGlhbGl6ZWQgd2hlbiB1c2VkIGhlcmUgWy1XdW5pbml0aWFsaXplZF1gCi0KLS0gQ2xhbmcgY2FuIGRldGVjdCBpbml0aWFsaXplciBsaXN0IHVzZSBpbnNpZGUgYSBtYWNybyBhbmQgc3VnZ2VzdCBwYXJlbnRoZXNlcwotICBpZiBwb3NzaWJsZSB0byBmaXguCi0tIE1hbnkgaW1wcm92ZW1lbnRzIHRvIENsYW5nJ3MgdHlwbyBjb3JyZWN0aW9uIGZhY2lsaXRpZXMsIHN1Y2ggYXM6Ci0KLSAgKyBBZGRpbmcgZ2xvYmFsIG5hbWVzcGFjZSBxdWFsaWZpZXJzIHNvIHRoYXQgY29ycmVjdGlvbnMgY2FuIHJlZmVyIHRvIHNoYWRvd2VkCi0gICAgb3Igb3RoZXJ3aXNlIGFtYmlndW91cyBvciB1bnJlYWNoYWJsZSBuYW1lc3BhY2VzLgotICArIEluY2x1ZGluZyBhY2Nlc3NpYmxlIGNsYXNzIG1lbWJlcnMgaW4gdGhlIHNldCBvZiB0eXBvIGNvcnJlY3Rpb24gY2FuZGlkYXRlcywKLSAgICBzbyB0aGF0IGNvcnJlY3Rpb25zIHJlcXVpcmluZyBhIGNsYXNzIG5hbWUgaW4gdGhlIG5hbWUgc3BlY2lmaWVyIGFyZSBub3cKLSAgICBwb3NzaWJsZS4KLSAgKyBBbGxvd2luZyB0eXBvIGNvcnJlY3Rpb25zIHRoYXQgaW52b2x2ZSByZW1vdmluZyBhIG5hbWUgc3BlY2lmaWVyLgotICArIEluIHNvbWUgc2l0dWF0aW9ucywgY29ycmVjdGluZyBmdW5jdGlvbiBuYW1lcyB3aGVuIGEgZnVuY3Rpb24gd2FzIGdpdmVuIHRoZQotICAgIHdyb25nIG51bWJlciBvZiBhcmd1bWVudHMsIGluY2x1ZGluZyBzaXR1YXRpb25zIHdoZXJlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbgotICAgIG5hbWUgd2FzIGNvcnJlY3QgYnV0IHdhcyBzaGFkb3dlZCBieSBhIGxleGljYWxseSBjbG9zZXIgZnVuY3Rpb24gd2l0aCB0aGUKLSAgICBzYW1lIG5hbWUgeWV0IHRvb2sgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGFyZ3VtZW50cy4KLSAgKyBPZmZlcmluZyB0eXBvIHN1Z2dlc3Rpb25zIGZvciAndXNpbmcnIGRlY2xhcmF0aW9ucy4KLSAgKyBQcm92aWRpbmcgYmV0dGVyIGRpYWdub3N0aWNzIGFuZCBmaXhpdCBzdWdnZXN0aW9ucyBpbiBtb3JlIHNpdHVhdGlvbnMgd2hlbgotICAgIGEgJy0+JyB3YXMgdXNlZCBpbnN0ZWFkIG9mICcuJyBvciB2aWNlIHZlcnNhLgotICArIFByb3ZpZGluZyBtb3JlIHJlbGV2YW50IHN1Z2dlc3Rpb25zIGZvciB0eXBvcyBmb2xsb3dlZCBieSAnLicgb3IgJz0nLgotICArIFZhcmlvdXMgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHdoZW4gc2VhcmNoaW5nIGZvciB0eXBvIGNvcnJlY3Rpb24KLSAgICBjYW5kaWRhdGVzLgotCi0tIGBMZWFrU2FuaXRpemVyIDxMZWFrU2FuaXRpemVyLmh0bWw+YF8gaXMgYW4gZXhwZXJpbWVudGFsIG1lbW9yeSBsZWFrIGRldGVjdG9yCi0gIHdoaWNoIGNhbiBiZSBjb21iaW5lZCB3aXRoIEFkZHJlc3NTYW5pdGl6ZXIuCistICAuLi4KIAogTmV3IENvbXBpbGVyIEZsYWdzCiAtLS0tLS0tLS0tLS0tLS0tLS0KIAotLSBDbGFuZyBubyBsb25nZXIgc3BlY2lhbCBjYXNlcyAtTzQgdG8gZW5hYmxlIGx0by4gRXhwbGljaXRseSBwYXNzIC1mbHRvIHRvCi0gIGVuYWJsZSBpdC4KLS0gQ2xhbmcgbm8gbG9uZ2VyIGZhaWxzIG9uID49IC1PNS4gVGhlc2UgZmxhZ3MgYXJlIG1hcHBlZCB0byAtTzMgaW5zdGVhZC4KLS0gQ29tbWFuZCBsaW5lICJjbGFuZyAtTzMgLWZsdG8gYS5jIC1jIiBhbmQgImNsYW5nIC1lbWl0LWxsdm0gYS5jIC1jIgotICBhcmUgbm8gbG9uZ2VyIGVxdWl2YWxlbnQuCi0tIENsYW5nIG5vdyBlcnJvcnMgb24gdW5rbm93biAtbSBmbGFncyAoYGAtbXVua25vd24tdG8tY2xhbmdgYCksCi0gIHVua25vd24gLWYgZmxhZ3MgKGBgLWZ1bmtub3duLXRvLWNsYW5nYGApIGFuZCB1bmtub3duCi0gIG9wdGlvbnMgKGBgLXdoYXQtaXMtdGhpc2BgKS4KK1RoZSBpbnRlZ3JhdGVkIGFzc2VtYmxlciBpcyBub3cgdHVybmVkIG9uIGJ5IGRlZmF1bHQgb24gQVJNIChhbmQgVGh1bWIpLAorc28gdGhlIHVzZSBvZiB0aGUgb3B0aW9uIGAtZmludGVncmF0ZWQtYXNgIGlzIG5vdyByZWR1bmRhbnQgb24gdGhvc2UKK2FyY2hpdGVjdHVyZXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IG1vdmUgdG8gYm90aCAqZWF0IG91ciBvd24gZG9nIGZvb2QqCithbmQgdG8gZWFzZSBjcm9zcy1jb21waWxhdGlvbiB0cmVtZW5kb3VzbHkuCisKK1dlIGFyZSBhd2FyZSBvZiB0aGUgcHJvYmxlbXMgdGhhdCB0aGlzIG1heSBjYXVzZSBmb3IgY29kZSBiYXNlcyB0aGF0CityZWx5IG9uIHNwZWNpZmljIEdOVSBzeW50YXggb3IgZXh0ZW5zaW9ucywgYW5kIHdlJ3JlIHdvcmtpbmcgdG93YXJkcworZ2V0dGluZyB0aGVtIGFsbCBmaXhlZC4gUGxlYXNlLCByZXBvcnQgYnVncyBvciBmZWF0dXJlIHJlcXVlc3RzIGlmCit5b3UgZmluZCBhbnl0aGluZy4gSW4gdGhlIG1lYW50aW1lLCB1c2UgYC1mbm8taW50ZWdyYXRlZC1hc2AgdG8gcmV2ZXJ0CitiYWNrIHRoZSBjYWxsIHRvIEdOVSBhc3NlbWJsZXIuCisKK0luIG9yZGVyIHRvIHByb3ZpZGUgYmV0dGVyIGRpYWdub3N0aWNzLCB0aGUgaW50ZWdyYXRlZCBhc3NlbWJsZXIgdmFsaWRhdGVzCitpbmxpbmUgYXNzZW1ibHkgd2hlbiB0aGUgaW50ZWdyYXRlZCBhc3NlbWJsZXIgaXMgZW5hYmxlZC4gIEJlY2F1c2UgdGhpcyBpcworY29uc2lkZXJlZCBhIGZlYXR1cmUgb2YgdGhlIGNvbXBpbGVyLCBpdCBpcyBjb250cm9sbGVkIHZpYSB0aGUgYGZpbnRlZ3JhdGVkLWFzYAorYW5kIGBmbm8taW50ZWdyYXRlZC1hc2AgZmxhZ3Mgd2hpY2ggZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBpbnRlZ3JhdGVkIGFzc2VtYmxlcgorcmVzcGVjdGl2ZWx5LiAgYC1pbnRlZ3JhdGVkLWFzYCBhbmQgYC1uby1pbnRlZ3JhdGVkLWFzYCBhcmUgbm93IGNvbnNpZGVyZWQKK2xlZ2FjeSBmbGFncyAoYnV0IGFyZSBhdmFpbGFibGUgYXMgYW4gYWxpYXMgdG8gcHJldmVudCBicmVha2luZyBleGlzdGluZyB1c2VycyksCithbmQgdXNlcnMgYXJlIGVuY291cmFnZWQgdG8gc3dpdGNoIHRvIHRoZSBlcXVpdmFsZW50IG5ldyBmZWF0dXJlIGZsYWcuCisKK0RlcHJlY2F0ZWQgZmxhZ3MgYC1mYWRkcmVzcy1zYW5pdGl6ZXJgLCBgLWZ0aHJlYWQtc2FuaXRpemVyYCwKK2AtZmNhdGNoLXVuZGVmaW5lZC1iZWhhdmlvcmAgYW5kIGAtZmJvdW5kcy1jaGVja2luZ2Agd2VyZSByZW1vdmVkIGluIGZhdm9yIG9mCitgLWZzYW5pdGl6ZT1gIGZhbWlseSBvZiBmbGFncy4KIAogQyBMYW5ndWFnZSBDaGFuZ2VzIGluIENsYW5nCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLSBBZGRlZCBuZXcgY2hlY2tlZCBhcml0aG1ldGljIGJ1aWx0aW5zIGZvciBzZWN1cml0eSBjcml0aWNhbCBhcHBsaWNhdGlvbnMuCisuLi4KKworQzExIEZlYXR1cmUgU3VwcG9ydAorXl5eXl5eXl5eXl5eXl5eXl5eXgorCisuLi4KIAogQysrIExhbmd1YWdlIENoYW5nZXMgaW4gQ2xhbmcKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS0gRml4ZWQgYW4gQUJJIHJlZ3Jlc3Npb24sIGludHJvZHVjZWQgaW4gQ2xhbmcgMy4yLCB3aGljaCBhZmZlY3RlZAotICBtZW1iZXIgb2Zmc2V0cyBmb3IgY2xhc3NlcyBpbmhlcml0aW5nIGZyb20gY2VydGFpbiBjbGFzc2VzIHdpdGggdGFpbCBwYWRkaW5nLgotICBTZWUgYFBSMTY1MzcgPGh0dHA6Ly9sbHZtLm9yZy9QUjE2NTM3PmBfLgorLSAuLi4KIAotLSBDbGFuZyAzLjQgc3VwcG9ydHMgdGhlIDIwMTMtMDgtMjggZHJhZnQgb2YgdGhlIElTTyBXRzIxIFNHMTAgZmVhdHVyZSB0ZXN0Ci0gIG1hY3JvIHJlY29tbWVuZGF0aW9ucy4gVGhlc2UgYWltIHRvIHByb3ZpZGUgYSBwb3J0YWJsZSBtZXRob2QgdG8gZGV0ZXJtaW5lCi0gIHdoZXRoZXIgYSBjb21waWxlciBzdXBwb3J0cyBhIGxhbmd1YWdlIGZlYXR1cmUsIG11Y2ggbGlrZSBDbGFuZydzCi0gIHxoYXNfZmVhdHVyZSBtYWNyb3xfLgotCi0uLiB8aGFzX2ZlYXR1cmUgbWFjcm98IHJlcGxhY2U6OiBgYF9faGFzX2ZlYXR1cmVgYCBtYWNybwotLi4gX2hhc19mZWF0dXJlIG1hY3JvOiBMYW5ndWFnZUV4dGVuc2lvbnMuaHRtbCNoYXMtZmVhdHVyZS1hbmQtaGFzLWV4dGVuc2lvbgotCi1DKysxeSBGZWF0dXJlIFN1cHBvcnQKK0MrKzExIEZlYXR1cmUgU3VwcG9ydAogXl5eXl5eXl5eXl5eXl5eXl5eXl5eCiAKLUNsYW5nIDMuNCBzdXBwb3J0cyBhbGwgdGhlIGZlYXR1cmVzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZHJhZnQgb2YgdGhlCi11cGNvbWluZyBDKysgc3RhbmRhcmQsIHByb3Zpc2lvbmFsbHkgbmFtZWQgQysrMXkuIFN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmcKLW1ham9yIG5ldyBmZWF0dXJlcyBoYXMgYmVlbiBhZGRlZCBzaW5jZSBDbGFuZyAzLjM6CisuLi4KIAotLSBHZW5lcmljIGxhbWJkYXMgYW5kIGluaXRpYWxpemVkIGxhbWJkYSBjYXB0dXJlcy4KLS0gRGVkdWNlZCBmdW5jdGlvbiByZXR1cm4gdHlwZXMgKGBgYXV0byBmKCkgeyByZXR1cm4gMDsgfWBgKS4KLS0gR2VuZXJhbGl6ZWQgYGBjb25zdGV4cHJgYCBzdXBwb3J0ICh2YXJpYWJsZSBtdXRhdGlvbiBhbmQgbG9vcHMpLgotLSBWYXJpYWJsZSB0ZW1wbGF0ZXMgYW5kIHN0YXRpYyBkYXRhIG1lbWJlciB0ZW1wbGF0ZXMuCi0tIFVzZSBvZiBgYCdgYCBhcyBhIGRpZ2l0IHNlcGFyYXRvciBpbiBudW1lcmljIGxpdGVyYWxzLgotLSBTdXBwb3J0IGZvciBzaXplZCBgYDo6b3BlcmF0b3IgZGVsZXRlYGAgZnVuY3Rpb25zLgorT2JqZWN0aXZlLUMgTGFuZ3VhZ2UgQ2hhbmdlcyBpbiBDbGFuZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1JbiBhZGRpdGlvbiwgYGBbW2RlcHJlY2F0ZWRdXWBgIGlzIG5vdyBhY2NlcHRlZCBhcyBhIHN5bm9ueW0gZm9yIENsYW5nJ3MKLWV4aXN0aW5nIGBgZGVwcmVjYXRlZGBgIGF0dHJpYnV0ZS4KLQotVXNlIGBgLXN0ZD1jKysxeWBgIHRvIGVuYWJsZSBDKysxeSBtb2RlLgorLi4uCiAKIE9wZW5DTCBDIExhbmd1YWdlIENoYW5nZXMgaW4gQ2xhbmcKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLSBPcGVuQ0wgQyAibG9uZyIgbm93IGFsd2F5cyBoYXMgYSBzaXplIG9mIDY0IGJpdCwgYW5kIGFsbCBPcGVuQ0wgQwotICB0eXBlcyBhcmUgYWxpZ25lZCBhcyBzcGVjaWZpZWQgaW4gdGhlIE9wZW5DTCBDIHN0YW5kYXJkLiBBbHNvLAotICAiY2hhciIgaXMgbm93IGFsd2F5cyBzaWduZWQuCisuLi4KIAogSW50ZXJuYWwgQVBJIENoYW5nZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRoZXNlIGFyZSBtYWpvciBBUEkgY2hhbmdlcyB0aGF0IGhhdmUgaGFwcGVuZWQgc2luY2UgdGhlIDMuMyByZWxlYXNlIG9mCitUaGVzZSBhcmUgbWFqb3IgQVBJIGNoYW5nZXMgdGhhdCBoYXZlIGhhcHBlbmVkIHNpbmNlIHRoZSAzLjQgcmVsZWFzZSBvZgogQ2xhbmcuIElmIHVwZ3JhZGluZyBhbiBleHRlcm5hbCBjb2RlYmFzZSB0aGF0IHVzZXMgQ2xhbmcgYXMgYSBsaWJyYXJ5LAogdGhpcyBzZWN0aW9uIHNob3VsZCBoZWxwIGdldCB5b3UgcGFzdCB0aGUgbGFyZ2VzdCBodXJkbGVzIG9mIHVwZ3JhZGluZy4KIAotV2lkZSBDaGFyYWN0ZXIgVHlwZXMKLV5eXl5eXl5eXl5eXl5eXl5eXl5eCisuLi4KIAotVGhlIEFTVENvbnRleHQgY2xhc3Mgbm93IGtlZXBzIHRyYWNrIG9mIHR3byBkaWZmZXJlbnQgdHlwZXMgZm9yIHdpZGUgY2hhcmFjdGVyCi10eXBlczogV0NoYXJUeSBhbmQgV2lkZUNoYXJUeS4gV0NoYXJUeSByZXByZXNlbnRzIHRoZSBidWlsdC1pbiB3Y2hhcl90IHR5cGUKLWF2YWlsYWJsZSBpbiBDKysuIFdpZGVDaGFyVHkgaXMgdGhlIHR5cGUgdXNlZCBmb3Igd2lkZSBjaGFyYWN0ZXIgbGl0ZXJhbHM7IGluCi1DKysgaXQgaXMgdGhlIHNhbWUgYXMgV0NoYXJUeSwgYnV0IGluIEM5OSwgd2hlcmUgd2NoYXJfdCBpcyBhIHR5cGVkZWYsIGl0IGlzIGFuCi1pbnRlZ2VyIHR5cGUuCitsaWJjbGFuZworLS0tLS0tLS0KKworLi4uCiAKIFN0YXRpYyBBbmFseXplcgogLS0tLS0tLS0tLS0tLS0tCiAKLVRoZSBzdGF0aWMgYW5hbHl6ZXIgaGFzIGJlZW4gZ3JlYXRseSBpbXByb3ZlZC4gVGhpcyBpbXBhY3RzIHRoZSBvdmVyYWxsIGFuYWx5emVyIHF1YWxpdHkgYW5kIHJlZHVjZXMgYSBudW1iZXIgb2YgZmFsc2UgcG9zaXRpdmVzLgotSW4gcGFydGljdWxhciwgdGhpcyByZWxlYXNlIHByb3ZpZGVzIGVuaGFuY2VkIEMrKyBzdXBwb3J0LCByZWFzb25pbmcgYWJvdXQgaW5pdGlhbGl6ZXIgbGlzdHMsIHplcm9pbmcgY29uc3RydWN0b3JzLCBub3JldHVybiBkZXN0cnVjdG9ycyBhbmQgbW9kZWxpbmcgb2YgZGVzdHJ1Y3RvciBjYWxscyBvbiBjYWxscyB0byBkZWxldGUuCisuLi4KIAotQ2xhbmcgRm9ybWF0Ci0tLS0tLS0tLS0tLS0KK0NvcmUgQW5hbHlzaXMgSW1wcm92ZW1lbnRzCis9PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1DbGFuZyBub3cgaW5jbHVkZXMgYSBuZXcgdG9vbCBgYGNsYW5nLWZvcm1hdGBgIHdoaWNoIGNhbiBiZSB1c2VkIHRvCi1hdXRvbWF0aWNhbGx5IGZvcm1hdCBDLCBDKysgYW5kIE9iamVjdGl2ZS1DIHNvdXJjZSBjb2RlLiBgYGNsYW5nLWZvcm1hdGBgCi1hdXRvbWF0aWNhbGx5IGNob29zZXMgbGluZWJyZWFrcyBhbmQgaW5kZW50YXRpb24gYW5kIGNhbiBiZSBlYXNpbHkgaW50ZWdyYXRlZAotaW50byBlZGl0b3JzLCBJREVzIGFuZCB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtcy4gSXQgc3VwcG9ydHMgc2V2ZXJhbCBwcmUtZGVmaW5lZAotc3R5bGVzIGFzIHdlbGwgYXMgcHJlY2lzZSBzdHlsZSBjb250cm9sIHVzaW5nIGEgbXVsdGl0dWRlIG9mIGZvcm1hdHRpbmcKLW9wdGlvbnMuIGBgY2xhbmctZm9ybWF0YGAgaXRzZWxmIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgYXJvdW5kIGEgbGlicmFyeSB3aGljaAotY2FuIGFsc28gYmUgdXNlZCBkaXJlY3RseSBmcm9tIGNvZGUgcmVmYWN0b3JpbmcgYW5kIGNvZGUgdHJhbnNsYXRpb24gdG9vbHMuCi1Nb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBvbiBgQ2xhbmcgRm9ybWF0J3MKLXNpdGUgPGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0NsYW5nRm9ybWF0Lmh0bWw+YF8uCistIC4uLgogCi1XaW5kb3dzIFN1cHBvcnQKLS0tLS0tLS0tLS0tLS0tLQorTmV3IElzc3VlcyBGb3VuZAorPT09PT09PT09PT09PT09PQogCi0tIGBjbGFuZy1jbCA8VXNlcnNNYW51YWwuaHRtbCNjbGFuZy1jbD5gXyBwcm92aWRlcyBhIG5ldyBkcml2ZXIgbW9kZSB0aGF0IGlzCi0gIGRlc2lnbmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVmlzdWFsIFN0dWRpbydzIGNvbXBpbGVyLCBjbC5leGUuIFRoaXMgZHJpdmVyCi0gIG1vZGUgbWFrZXMgQ2xhbmcgYWNjZXB0IHRoZSBzYW1lIGtpbmQgb2YgY29tbWFuZC1saW5lIG9wdGlvbnMgYXMgY2wuZXhlLiBUaGUKLSAgaW5zdGFsbGVyIHdpbGwgYXR0ZW1wdCB0byBleHBvc2UgY2xhbmctY2wgaW4gYW55IFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9ucwotICBvbiB0aGUgc3lzdGVtIGFzIGEgUGxhdGZvcm0gVG9vbHNldCwgZS5nLiAiTExWTS12czIwMTIiLiBjbGFuZy1jbCB0YXJnZXRzIHRoZQotICBNaWNyb3NvZnQgQUJJIGJ5IGRlZmF1bHQuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBkcml2ZXIgbW9kZSBhbmQgY29tcGF0aWJpbGl0eQotICB3aXRoIHRoZSBNUyBBQkkgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbC4KKy0gLi4uCiAKIFB5dGhvbiBCaW5kaW5nIENoYW5nZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIGZvbGxvd2luZyBtZXRob2RzIGhhdmUgYmVlbiBhZGRlZDoKIAorLSAgLi4uCisKIFNpZ25pZmljYW50IEtub3duIFByb2JsZW1zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0yNzIsNyArMTY2LDcgQEAKIAogQSB3aWRlIHZhcmlldHkgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgb24gdGhlIGBDbGFuZyB3ZWIKIHBhZ2UgPGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy8+YF8uIFRoZSB3ZWIgcGFnZSBjb250YWlucyB2ZXJzaW9ucyBvZiB0aGUKLUFQSSBkb2N1bWVudGF0aW9uIHdoaWNoIGFyZSB1cC10by1kYXRlIHdpdGggdGhlIFN1YnZlcnNpb24gcmV2aXNpb24gb2YKK0FQSSBkb2N1bWVudGF0aW9uIHdoaWNoIGFyZSB1cC10by1kYXRlIHdpdGggdGhlIFN1YnZlcnNpb24gdmVyc2lvbiBvZgogdGhlIHNvdXJjZSBjb2RlLiBZb3UgY2FuIGFjY2VzcyB2ZXJzaW9ucyBvZiB0aGVzZSBkb2N1bWVudHMgc3BlY2lmaWMgdG8KIHRoaXMgcmVsZWFzZSBieSBnb2luZyBpbnRvIHRoZSAiYGBjbGFuZy9kb2NzL2BgIiBkaXJlY3RvcnkgaW4gdGhlIENsYW5nCiB0cmVlLgpkaWZmIC0tZ2l0IGEvZG9jcy9UaHJlYWRTYWZldHlBbmFseXNpcy5yc3QgYi9kb2NzL1RocmVhZFNhZmV0eUFuYWx5c2lzLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmVmODBiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9UaHJlYWRTYWZldHlBbmFseXNpcy5yc3QKQEAgLTAsMCArMSw4MTggQEAKKworPT09PT09PT09PT09PT09PT09PT09PQorVGhyZWFkIFNhZmV0eSBBbmFseXNpcworPT09PT09PT09PT09PT09PT09PT09PQorCitJbnRyb2R1Y3Rpb24KKz09PT09PT09PT09PQorCitDbGFuZyBUaHJlYWQgU2FmZXR5IEFuYWx5c2lzIGlzIGEgQysrIGxhbmd1YWdlIGV4dGVuc2lvbiB3aGljaCB3YXJucyBhYm91dAorcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBpbiBjb2RlLiAgVGhlIGFuYWx5c2lzIGlzIGNvbXBsZXRlbHkgc3RhdGljIChpLmUuCitjb21waWxlLXRpbWUpOyB0aGVyZSBpcyBubyBydW4tdGltZSBvdmVyaGVhZC4gIFRoZSBhbmFseXNpcyBpcyBzdGlsbAordW5kZXIgYWN0aXZlIGRldmVsb3BtZW50LCBidXQgaXQgaXMgbWF0dXJlIGVub3VnaCB0byBiZSBkZXBsb3llZCBpbiBhbgoraW5kdXN0cmlhbCBzZXR0aW5nLiAgSXQgYmVpbmcgZGV2ZWxvcGVkIGJ5IEdvb2dsZSwgYW5kIGlzIHVzZWQgZXh0ZW5zaXZlbHkKK29uIHRoZWlyIGludGVybmFsIGNvZGUgYmFzZS4KKworVGhyZWFkIHNhZmV0eSBhbmFseXNpcyB3b3JrcyB2ZXJ5IG11Y2ggbGlrZSBhIHR5cGUgc3lzdGVtIGZvciBtdWx0aS10aHJlYWRlZAorcHJvZ3JhbXMuICBJbiBhZGRpdGlvbiB0byBkZWNsYXJpbmcgdGhlICp0eXBlKiBvZiBkYXRhIChlLmcuIGBgaW50YGAsIGBgZmxvYXRgYCwKK2V0Yy4pLCB0aGUgcHJvZ3JhbW1lciBjYW4gKG9wdGlvbmFsbHkpIGRlY2xhcmUgaG93IGFjY2VzcyB0byB0aGF0IGRhdGEgaXMKK2NvbnRyb2xsZWQgaW4gYSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudC4gIEZvciBleGFtcGxlLCBpZiBgYGZvb2BgIGlzCisqZ3VhcmRlZCBieSogdGhlIG11dGV4IGBgbXVgYCwgdGhlbiB0aGUgYW5hbHlzaXMgd2lsbCBpc3N1ZSBhIHdhcm5pbmcgd2hlbmV2ZXIKK2EgcGllY2Ugb2YgY29kZSByZWFkcyBvciB3cml0ZXMgdG8gYGBmb29gYCB3aXRob3V0IGZpcnN0IGxvY2tpbmcgYGBtdWBgLgorU2ltaWxhcmx5LCBpZiB0aGVyZSBhcmUgcGFydGljdWxhciByb3V0aW5lcyB0aGF0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieQordGhlIEdVSSB0aHJlYWQsIHRoZW4gdGhlIGFuYWx5c2lzIHdpbGwgd2FybiBpZiBvdGhlciB0aHJlYWRzIGNhbGwgdGhvc2UKK3JvdXRpbmVzLiAKKworR2V0dGluZyBTdGFydGVkCistLS0tLS0tLS0tLS0tLS0tCisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICAjaW5jbHVkZSAibXV0ZXguaCIKKworICBjbGFzcyBCYW5rQWNjb3VudCB7CisgIHByaXZhdGU6CisgICAgTXV0ZXggbXU7CisgICAgaW50ICAgYmFsYW5jZSBHVUFSREVEX0JZKG11KTsKKyAgCisgICAgdm9pZCBkZXBvc2l0SW1wbChpbnQgYW1vdW50KSB7CisgICAgICBiYWxhbmNlICs9IGFtb3VudDsgICAgICAgLy8gV0FSTklORyEgQ2Fubm90IHdyaXRlIGJhbGFuY2Ugd2l0aG91dCBsb2NraW5nIG11LgorICAgIH0KKyAgCisgICAgdm9pZCB3aXRoZHJhd0ltcGwoaW50IGFtb3VudCkgRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEKG11KSB7CisgICAgICBiYWxhbmNlIC09IGFtb3VudDsgICAgICAgLy8gT0suIENhbGxlciBtdXN0IGhhdmUgbG9ja2VkIG11LgorICAgIH0KKyAgCisgIHB1YmxpYzoKKyAgICB2b2lkIHdpdGhkcmF3KGludCBhbW91bnQpIHsKKyAgICAgIG11LkxvY2soKTsKKyAgICAgIHdpdGhkcmF3SW1wbChhbW91bnQpOyAgICAvLyBPSy4gIFdlJ3ZlIGxvY2tlZCBtdS4KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HISAgRmFpbGVkIHRvIHVubG9jayBtdS4KKyAgCisgICAgdm9pZCB0cmFuc2ZlckZyb20oQmFua0FjY291bnQmIGIsIGludCBhbW91bnQpIHsKKyAgICAgIG11LkxvY2soKTsKKyAgICAgIGIud2l0aGRyYXdJbXBsKGFtb3VudCk7ICAvLyBXQVJOSU5HISAgQ2FsbGluZyB3aXRoZHJhd0ltcGwoKSByZXF1aXJlcyBsb2NraW5nIGIubXUuCisgICAgICBkZXBvc2l0SW1wbChhbW91bnQpOyAgICAgLy8gT0suICBkZXBvc2l0SW1wbCgpIGhhcyBubyByZXF1aXJlbWVudHMuCisgICAgICBtdS5VbmxvY2soKTsKKyAgICB9CisgIH07CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIGJhc2ljIGNvbmNlcHRzIGJlaGluZCB0aGUgYW5hbHlzaXMuICBUaGUKK2BgR1VBUkRFRF9CWWBgIGF0dHJpYnV0ZSBkZWNsYXJlcyB0aGF0IGEgdGhyZWFkIG11c3QgbG9jayBgYG11YGAgYmVmb3JlIGl0IGNhbgorcmVhZCBvciB3cml0ZSB0byBgYGJhbGFuY2VgYCwgdGh1cyBlbnN1cmluZyB0aGF0IHRoZSBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudAorb3BlcmF0aW9ucyBhcmUgYXRvbWljLiAgU2ltaWxhcmx5LCBgYEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRGBgIGRlY2xhcmVzIHRoYXQKK3RoZSBjYWxsaW5nIHRocmVhZCBtdXN0IGxvY2sgYGBtdWBgIGJlZm9yZSBjYWxsaW5nIGBgd2l0aGRyYXdJbXBsYGAuCitCZWNhdXNlIHRoZSBjYWxsZXIgaXMgYXNzdW1lZCB0byBoYXZlIGxvY2tlZCBgYG11YGAsIGl0IGlzIHNhZmUgdG8gbW9kaWZ5CitgYGJhbGFuY2VgYCB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIG1ldGhvZC4KKworVGhlIGBgZGVwb3NpdEltcGwoKWBgIG1ldGhvZCBkb2VzIG5vdCBoYXZlIGBgRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEYGAsIHNvIHRoZQorYW5hbHlzaXMgaXNzdWVzIGEgd2FybmluZy4gIFRocmVhZCBzYWZldHkgYW5hbHlzaXMgaXMgbm90IGludGVyLXByb2NlZHVyYWwsIHNvCitjYWxsZXIgcmVxdWlyZW1lbnRzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZC4KK1RoZXJlIGlzIGFsc28gYSB3YXJuaW5nIGluIGBgdHJhbnNmZXJGcm9tKClgYCwgYmVjYXVzZSBhbHRob3VnaCB0aGUgbWV0aG9kCitsb2NrcyBgYHRoaXMtPm11YGAsIGl0IGRvZXMgbm90IGxvY2sgYGBiLm11YGAuICBUaGUgYW5hbHlzaXMgdW5kZXJzdGFuZHMKK3RoYXQgdGhlc2UgYXJlIHR3byBzZXBhcmF0ZSBtdXRleGVzLCBpbiB0d28gZGlmZmVyZW50IG9iamVjdHMuICAKKworRmluYWxseSwgdGhlcmUgaXMgYSB3YXJuaW5nIGluIHRoZSBgYHdpdGhkcmF3KClgYCBtZXRob2QsIGJlY2F1c2UgaXQgZmFpbHMgdG8KK3VubG9jayBgYG11YGAuICBFdmVyeSBsb2NrIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgdW5sb2NrLCBhbmQgdGhlIGFuYWx5c2lzCit3aWxsIGRldGVjdCBib3RoIGRvdWJsZSBsb2NrcywgYW5kIGRvdWJsZSB1bmxvY2tzLiAgQSBmdW5jdGlvbiBpcyBhbGxvd2VkIHRvCithY3F1aXJlIGEgbG9jayB3aXRob3V0IHJlbGVhc2luZyBpdCwgKG9yIHZpY2UgdmVyc2EpLCBidXQgaXQgbXVzdCBiZSBhbm5vdGF0ZWQKK2FzIHN1Y2ggKHVzaW5nIGBgTE9DS2BgL2BgVU5MT0NLX0ZVTkNUSU9OYGApLgorCisKK1J1bm5pbmcgVGhlIEFuYWx5c2lzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBydW4gdGhlIGFuYWx5c2lzLCBzaW1wbHkgY29tcGlsZSB3aXRoIHRoZSBgYC1XdGhyZWFkLXNhZmV0eWBgIGZsYWcsIGUuZy4KKworLi4gY29kZS1ibG9jazo6IGJhc2gKKworICBjbGFuZyAtYyAtV3RocmVhZC1zYWZldHkgZXhhbXBsZS5jcHAKKworTm90ZSB0aGF0IHRoaXMgZXhhbXBsZSBhc3N1bWVzIHRoZSBwcmVzZW5jZSBvZiBhIHN1aXRhYmx5IGFubm90YXRlZAorOnJlZjpgbXV0ZXhoZWFkZXJgIHRoYXQgZGVjbGFyZXMgd2hpY2ggbWV0aG9kcyBwZXJmb3JtIGxvY2tpbmcsCit1bmxvY2tpbmcsIGFuZCBzbyBvbi4gCisKKworQmFzaWMgQ29uY2VwdHM6IENhcGFiaWxpdGllcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaHJlYWQgc2FmZXR5IGFuYWx5c2lzIHByb3ZpZGVzIGEgd2F5IG9mIHByb3RlY3RpbmcgKnJlc291cmNlcyogd2l0aAorKmNhcGFiaWxpdGllcyouICBBIHJlc291cmNlIGlzIGVpdGhlciBhIGRhdGEgbWVtYmVyLCBvciBhIGZ1bmN0aW9uL21ldGhvZAordGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gc29tZSB1bmRlcmx5aW5nIHJlc291cmNlLiAgVGhlIGFuYWx5c2lzIGVuc3VyZXMgdGhhdAordGhlIGNhbGxpbmcgdGhyZWFkIGNhbm5vdCBhY2Nlc3MgdGhlICpyZXNvdXJjZSogKGkuZS4gY2FsbCB0aGUgZnVuY3Rpb24sIG9yCityZWFkL3dyaXRlIHRoZSBkYXRhKSB1bmxlc3MgaXQgaGFzIHRoZSAqY2FwYWJpbGl0eSogdG8gZG8gc28uCisKK0NhcGFiaWxpdGllcyBhcmUgYXNzb2NpYXRlZCB3aXRoIG5hbWVkIEMrKyBvYmplY3RzIHdoaWNoIGRlY2xhcmUgc3BlY2lmaWMKK21ldGhvZHMgdG8gYWNxdWlyZSBhbmQgcmVsZWFzZSB0aGUgY2FwYWJpbGl0eS4gIFRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgc2VydmVzCit0byBpZGVudGlmeSB0aGUgY2FwYWJpbGl0eS4gIFRoZSBtb3N0IGNvbW1vbiBleGFtcGxlIGlzIGEgbXV0ZXguICBGb3IgZXhhbXBsZSwKK2lmIGBgbXVgYCBpcyBhIG11dGV4LCB0aGVuIGNhbGxpbmcgYGBtdS5Mb2NrKClgYCBjYXVzZXMgdGhlIGNhbGxpbmcgdGhyZWFkCit0byBhY3F1aXJlIHRoZSBjYXBhYmlsaXR5IHRvIGFjY2VzcyBkYXRhIHRoYXQgaXMgcHJvdGVjdGVkIGJ5IGBgbXVgYC4gU2ltaWxhcmx5LCAKK2NhbGxpbmcgYGBtdS5VbmxvY2soKWBgIHJlbGVhc2VzIHRoYXQgY2FwYWJpbGl0eS4KKworQSB0aHJlYWQgbWF5IGhvbGQgYSBjYXBhYmlsaXR5IGVpdGhlciAqZXhjbHVzaXZlbHkqIG9yICpzaGFyZWQqLiAgQW4gZXhjbHVzaXZlCitjYXBhYmlsaXR5IGNhbiBiZSBoZWxkIGJ5IG9ubHkgb25lIHRocmVhZCBhdCBhIHRpbWUsIHdoaWxlIGEgc2hhcmVkIGNhcGFiaWxpdHkKK2NhbiBiZSBoZWxkIGJ5IG1hbnkgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLiAgVGhpcyBtZWNoYW5pc20gZW5mb3JjZXMgYQorbXVsdGlwbGUtcmVhZGVyLCBzaW5nbGUtd3JpdGVyIHBhdHRlcm4uICBXcml0ZSBvcGVyYXRpb25zIHRvIHByb3RlY3RlZCBkYXRhCityZXF1aXJlIGV4Y2x1c2l2ZSBhY2Nlc3MsIHdoaWxlIHJlYWQgb3BlcmF0aW9ucyByZXF1aXJlIG9ubHkgc2hhcmVkIGFjY2Vzcy4gIAorCitBdCBhbnkgZ2l2ZW4gbW9tZW50IGR1cmluZyBwcm9ncmFtIGV4ZWN1dGlvbiwgYSB0aHJlYWQgaG9sZHMgYSBzcGVjaWZpYyBzZXQgb2YKK2NhcGFiaWxpdGllcyAoZS5nLiB0aGUgc2V0IG9mIG11dGV4ZXMgdGhhdCBpdCBoYXMgbG9ja2VkLikgIFRoZXNlIGFjdCBsaWtlIGtleXMKK29yIHRva2VucyB0aGF0IGFsbG93IHRoZSB0aHJlYWQgdG8gYWNjZXNzIGEgZ2l2ZW4gcmVzb3VyY2UuICBKdXN0IGxpa2UgcGh5c2ljYWwKK3NlY3VyaXR5IGtleXMsIGEgdGhyZWFkIGNhbm5vdCBtYWtlIGNvcHkgb2YgYSBjYXBhYmlsaXR5LCBub3IgY2FuIGl0IGRlc3Ryb3kKK29uZS4gIEEgdGhyZWFkIGNhbiBvbmx5IHJlbGVhc2UgYSBjYXBhYmlsaXR5IHRvIGFub3RoZXIgdGhyZWFkLCBvciBhY3F1aXJlIG9uZQorZnJvbSBhbm90aGVyIHRocmVhZC4gIFRoZSBhbm5vdGF0aW9ucyBhcmUgZGVsaWJlcmF0ZWx5IGFnbm9zdGljIGFib3V0IHRoZQorZXhhY3QgbWVjaGFuaXNtIHVzZWQgdG8gYWNxdWlyZSBhbmQgcmVsZWFzZSBjYXBhYmlsaXRpZXM7IGl0IGFzc3VtZXMgdGhhdCB0aGUgCit1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIChlLmcuIHRoZSBNdXRleCBpbXBsZW1lbnRhdGlvbikgZG9lcyB0aGUgaGFuZG9mZiBpbgorYW4gYXBwcm9wcmlhdGUgbWFubmVyLgorCitUaGUgc2V0IG9mIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBhY3R1YWxseSBoZWxkIGJ5IGEgZ2l2ZW4gdGhyZWFkIGF0IGEgZ2l2ZW4KK3BvaW50IGluIHByb2dyYW0gZXhlY3V0aW9uIGlzIGEgcnVuLXRpbWUgY29uY2VwdC4gIFRoZSBzdGF0aWMgYW5hbHlzaXMgd29ya3MKK2J5IGNhbGN1bGF0aW5nIGFuIGFwcHJveGltYXRpb24gb2YgdGhhdCBzZXQsIGNhbGxlZCB0aGUgKmNhcGFiaWxpdHkKK2Vudmlyb25tZW50Ki4gIFRoZSBjYXBhYmlsaXR5IGVudmlyb25tZW50IGlzIGNhbGN1bGF0ZWQgZm9yIGV2ZXJ5IHByb2dyYW0gcG9pbnQsCithbmQgZGVzY3JpYmVzIHRoZSBzZXQgb2YgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIHN0YXRpY2FsbHkga25vd24gdG8gYmUgaGVsZCwgb3IKK25vdCBoZWxkLCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQuICBUaGlzIGVudmlyb25tZW50IGlzIGEgY29uc2VydmF0aXZlCithcHByb3hpbWF0aW9uIG9mIHRoZSBmdWxsIHNldCBvZiBjYXBhYmlsaXRpZXMgdGhhdCB3aWxsIGFjdHVhbGx5IGhlbGQgYnkgYQordGhyZWFkIGF0IHJ1bi10aW1lLgorCisKK1JlZmVyZW5jZSBHdWlkZQorPT09PT09PT09PT09PT09CisKK1RoZSB0aHJlYWQgc2FmZXR5IGFuYWx5c2lzIHVzZXMgYXR0cmlidXRlcyB0byBkZWNsYXJlIHRocmVhZGluZyBjb25zdHJhaW50cy4KK0F0dHJpYnV0ZXMgbXVzdCBiZSBhdHRhY2hlZCB0byBuYW1lZCBkZWNsYXJhdGlvbnMsIHN1Y2ggYXMgY2xhc3NlcywgbWV0aG9kcywKK2FuZCBkYXRhIG1lbWJlcnMuIFVzZXJzIGFyZSAqc3Ryb25nbHkgYWR2aXNlZCogdG8gZGVmaW5lIG1hY3JvcyBmb3IgdGhlIHZhcmlvdXMKK2F0dHJpYnV0ZXM7IGV4YW1wbGUgZGVmaW5pdGlvbnMgY2FuIGJlIGZvdW5kIGluIDpyZWY6YG11dGV4aGVhZGVyYCwgYmVsb3cuCitUaGUgZm9sbG93aW5nIGRvY3VtZW50YXRpb24gYXNzdW1lcyB0aGUgdXNlIG9mIG1hY3Jvcy4KKworCitHVUFSREVEX0JZKGMpIGFuZCBQVF9HVUFSREVEX0JZKGMpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2BgR1VBUkRFRF9CWWBgIGlzIGFuIGF0dHJpYnV0ZSBvbiBkYXRhIG1lbWJlcnMsIHdoaWNoIGRlY2xhcmVzIHRoYXQgdGhlIGRhdGEKK21lbWJlciBpcyBwcm90ZWN0ZWQgYnkgdGhlIGdpdmVuIGNhcGFiaWxpdHkuICBSZWFkIG9wZXJhdGlvbnMgb24gdGhlIGRhdGEKK3JlcXVpcmUgc2hhcmVkIGFjY2Vzcywgd2hpbGUgd3JpdGUgb3BlcmF0aW9ucyByZXF1aXJlIGV4Y2x1c2l2ZSBhY2Nlc3MuCisKK2BgUFRfR1VBUkRFRF9CWWBgIGlzIHNpbWlsYXIsIGJ1dCBpcyBpbnRlbmRlZCBmb3IgdXNlIG9uIHBvaW50ZXJzIGFuZCBzbWFydAorcG9pbnRlcnMuIFRoZXJlIGlzIG5vIGNvbnN0cmFpbnQgb24gdGhlIGRhdGEgbWVtYmVyIGl0c2VsZiwgYnV0IHRoZSAqZGF0YSB0aGF0CitpdCBwb2ludHMgdG8qIGlzIHByb3RlY3RlZCBieSB0aGUgZ2l2ZW4gY2FwYWJpbGl0eS4gIAorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgTXV0ZXggbXU7CisgIGludCAqcDEgICAgICAgICAgICBHVUFSREVEX0JZKG11KTsKKyAgaW50ICpwMiAgICAgICAgICAgIFBUX0dVQVJERURfQlkobXUpOworICB1bmlxdWVfcHRyPGludD4gcDMgUFRfR1VBUkRFRF9CWShtdSk7CisgIAorICB2b2lkIHRlc3QoKSB7CisgICAgcDEgPSAwOyAgICAgICAgICAgICAvLyBXYXJuaW5nIQorICAKKyAgICBwMiA9IG5ldyBpbnQ7ICAgICAgIC8vIE9LLgorICAgICpwMiA9IDQyOyAgICAgICAgICAgLy8gV2FybmluZyEKKyAgCisgICAgcDMucmVzZXQobmV3IGludCk7ICAvLyBPSy4KKyAgICAqcDMgPSA0MjsgICAgICAgICAgIC8vIFdhcm5pbmchCisgIH0KKworCitFWENMVVNJVkVfTE9DS1NfUkVRVUlSRUQoLi4uKSwgU0hBUkVEX0xPQ0tTX1JFUVVJUkVEKC4uLikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitgYEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRGBgIGlzIGFuIGF0dHJpYnV0ZSBvbiBmdW5jdGlvbnMgb3IgbWV0aG9kcywgd2hpY2gKK2RlY2xhcmVzIHRoYXQgdGhlIGNhbGxpbmcgdGhyZWFkIG11c3QgaGF2ZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBnaXZlbgorY2FwYWJpbGl0aWVzLiAgTW9yZSB0aGFuIG9uZSBjYXBhYmlsaXR5IG1heSBiZSBzcGVjaWZpZWQuICBUaGUgY2FwYWJpbGl0aWVzCittdXN0IGJlIGhlbGQgb24gZW50cnkgdG8gdGhlIGZ1bmN0aW9uLCAqYW5kIG11c3Qgc3RpbGwgYmUgaGVsZCBvbiBleGl0Ki4gIAorCitgYFNIQVJFRF9MT0NLU19SRVFVSVJFRGBgIGlzIHNpbWlsYXIsIGJ1dCByZXF1aXJlcyBvbmx5IHNoYXJlZCBhY2Nlc3MuCisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICBNdXRleCBtdTEsIG11MjsKKyAgaW50IGEgR1VBUkRFRF9CWShtdTEpOworICBpbnQgYiBHVUFSREVEX0JZKG11Mik7CisgIAorICB2b2lkIGZvbygpIEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRChtdTEsIG11MikgeworICAgIGEgPSAwOworICAgIGIgPSAwOworICB9CisgIAorICB2b2lkIHRlc3QoKSB7CisgICAgbXUxLkxvY2soKTsKKyAgICBmb28oKTsgICAgICAgICAvLyBXYXJuaW5nISAgUmVxdWlyZXMgbXUyLgorICAgIG11MS5VbmxvY2soKTsKKyAgfQorCisKK0VYQ0xVU0lWRV9MT0NLX0ZVTkNUSU9OKC4uLiksIFNIQVJFRF9MT0NLX0ZVTkNUSU9OKC4uLiksIFVOTE9DS19GVU5DVElPTiguLi4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitgYEVYQ0xVU0lWRV9MT0NLX0ZVTkNUSU9OYGAgaXMgYW4gYXR0cmlidXRlIG9uIGZ1bmN0aW9ucyBvciBtZXRob2RzLCB3aGljaAorZGVjbGFyZXMgdGhhdCB0aGUgZnVuY3Rpb24gYWNxdWlyZXMgYSBjYXBhYmlsaXR5LCBidXQgZG9lcyBub3QgcmVsZWFzZSBpdC4gIFRoZQorY2FsbGVyIG11c3Qgbm90IGhvbGQgdGhlIGdpdmVuIGNhcGFiaWxpdHkgb24gZW50cnksIGFuZCBpdCB3aWxsIGhvbGQgdGhlCitjYXBhYmlsaXR5IG9uIGV4aXQuICBgYFNIQVJFRF9MT0NLX0ZVTkNUSU9OYGAgaXMgc2ltaWxhci4gCisKK2BgVU5MT0NLX0ZVTkNUSU9OYGAgZGVjbGFyZXMgdGhhdCB0aGUgZnVuY3Rpb24gcmVsZWFzZXMgdGhlIGdpdmVuIGNhcGFiaWxpdHkuCitUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgY2FwYWJpbGl0eSBvbiBlbnRyeSwgYW5kIHdpbGwgbm8gbG9uZ2VyIGhvbGQgaXQgb24KK2V4aXQuIEl0IGRvZXMgbm90IG1hdHRlciB3aGV0aGVyIHRoZSBnaXZlbiBjYXBhYmlsaXR5IGlzIHNoYXJlZCBvciBleGNsdXNpdmUuCisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICBNdXRleCBtdTsKKyAgTXlDbGFzcyBteU9iamVjdCBHVUFSREVEX0JZKG11KTsKKyAgCisgIHZvaWQgbG9ja0FuZEluaXQoKSBFWENMVVNJVkVfTE9DS19GVU5DVElPTihtdSkgeworICAgIG11LkxvY2soKTsKKyAgICBteU9iamVjdC5pbml0KCk7CisgIH0KKyAgCisgIHZvaWQgY2xlYW51cEFuZFVubG9jaygpIFVOTE9DS19GVU5DVElPTihtdSkgeworICAgIG15T2JqZWN0LmNsZWFudXAoKTsKKyAgfSAgLy8gV2FybmluZyEgIE5lZWQgdG8gdW5sb2NrIG11LgorICAKKyAgdm9pZCB0ZXN0KCkgeworICAgIGxvY2tBbmRJbml0KCk7CisgICAgbXlPYmplY3QuZG9Tb21ldGhpbmcoKTsKKyAgICBjbGVhbnVwQW5kVW5sb2NrKCk7CisgICAgbXlPYmplY3QuZG9Tb21ldGhpbmcoKTsgIC8vIFdhcm5pbmcsIG11IGlzIG5vdCBsb2NrZWQuCisgIH0KKworSWYgbm8gYXJndW1lbnQgaXMgcGFzc2VkIHRvIGBgKFVOKUxPQ0tfRlVOQ1RJT05gYCwgdGhlbiB0aGUgYXJndW1lbnQgaXMgYXNzdW1lZAordG8gYmUgYGB0aGlzYGAsIGFuZCB0aGUgYW5hbHlzaXMgd2lsbCBub3QgY2hlY2sgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLiAgVGhpcworcGF0dGVybiBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGNsYXNzZXMgd2hpY2ggaGlkZSBsb2NraW5nIGRldGFpbHMgYmVoaW5kIGFuCithYnN0cmFjdCBpbnRlcmZhY2UuICBFLmcuCisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgY2xhc3MgTE9DS0FCTEUgQ29udGFpbmVyIHsKKyAgcHJpdmF0ZToKKyAgICBNdXRleCBtdTsKKyAgICBUKiBkYXRhOworICAKKyAgcHVibGljOgorICAgIC8vIEhpZGUgbXUgZnJvbSBwdWJsaWMgaW50ZXJmYWNlLgorICAgIHZvaWQgTG9jaygpIEVYQ0xVU0lWRV9MT0NLX0ZVTkNUSU9OKCkgeyBtdS5Mb2NrKCk7IH0KKyAgICB2b2lkIFVubG9jaygpIFVOTE9DS19GVU5DVElPTigpIHsgbXUuVW5sb2NrKCk7IH0KKyAgCisgICAgVCYgZ2V0RWxlbShpbnQgaSkgeyByZXR1cm4gZGF0YVtpXTsgfQorICB9OworICAKKyAgdm9pZCB0ZXN0KCkgeworICAgIENvbnRhaW5lcjxpbnQ+IGM7CisgICAgYy5Mb2NrKCk7CisgICAgaW50IGkgPSBjLmdldEVsZW0oMCk7CisgICAgYy5VbmxvY2soKTsKKyAgfQorCisKK0xPQ0tTX0VYQ0xVREVEKC4uLikKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworYGBMT0NLU19FWENMVURFRGBgIGlzIGFuIGF0dHJpYnV0ZSBvbiBmdW5jdGlvbnMgb3IgbWV0aG9kcywgd2hpY2ggZGVjbGFyZXMgdGhhdAordGhlIGNhbGxlciBtdXN0ICpub3QqIGhvbGQgdGhlIGdpdmVuIGNhcGFiaWxpdGllcy4gIFRoaXMgYW5ub3RhdGlvbiBpcwordXNlZCB0byBwcmV2ZW50IGRlYWRsb2NrLiAgTWFueSBtdXRleCBpbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCByZS1lbnRyYW50LCBzbworZGVhZGxvY2sgY2FuIG9jY3VyIGlmIHRoZSBmdW5jdGlvbiBpbiBxdWVzdGlvbiBhY3F1aXJlcyB0aGUgbXV0ZXggYSBzZWNvbmQgdGltZS4KKworLi4gY29kZS1ibG9jazo6IGMrKworCisgIE11dGV4IG11OworICBpbnQgYSBHVUFSREVEX0JZKG11KTsKKyAgCisgIHZvaWQgY2xlYXIoKSBMT0NLU19FWENMVURFRChtdSkgeworICAgIG11LkxvY2soKTsKKyAgICBhID0gMDsKKyAgICBtdS5VbmxvY2soKTsKKyAgfQorICAKKyAgdm9pZCByZXNldCgpIHsKKyAgICBtdS5Mb2NrKCk7CisgICAgY2xlYXIoKTsgICAgIC8vIFdhcm5pbmchICBDYWxsZXIgY2Fubm90IGhvbGQgJ211Jy4KKyAgICBtdS5VbmxvY2soKTsKKyAgfQorCitVbmxpa2UgYGBMT0NLU19SRVFVSVJFRGBgLCBgYExPQ0tTX0VYQ0xVREVEYGAgaXMgb3B0aW9uYWwuICBUaGUgYW5hbHlzaXMgd2lsbAorbm90IGlzc3VlIGEgd2FybmluZyBpZiB0aGUgYXR0cmlidXRlIGlzIG1pc3NpbmcuICBTZWUgOnJlZjpgbGltaXRhdGlvbnNgLgorCisKK05PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYGBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTYGAgaXMgYW4gYXR0cmlidXRlIG9uIGZ1bmN0aW9ucyBvciBtZXRob2RzLCB3aGljaAordHVybnMgb2ZmIHRocmVhZCBzYWZldHkgY2hlY2tpbmcgZm9yIHRoYXQgbWV0aG9kLiAgSXQgcHJvdmlkZXMgYW4gZXNjYXBlIGhhdGNoCitmb3IgZnVuY3Rpb25zIHdoaWNoIGFyZSBlaXRoZXIgKDEpIGRlbGliZXJhdGVseSB0aHJlYWQtdW5zYWZlLCBvciAoMikgYXJlCit0aHJlYWQtc2FmZSwgYnV0IHRvbyBjb21wbGljYXRlZCBmb3IgdGhlIGFuYWx5c2lzIHRvIHVuZGVyc3RhbmQuICBSZWFzb25zIGZvcgorKDIpIHdpbGwgYmUgZGVzY3JpYmVkIGluIHRoZSA6cmVmOmBsaW1pdGF0aW9uc2AsIGJlbG93LgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgY2xhc3MgQ291bnRlciB7CisgICAgTXV0ZXggbXU7CisgICAgaW50IGEgR1VBUkRFRF9CWShtdSk7CisgIAorICAgIHZvaWQgdW5zYWZlSW5jcmVtZW50KCkgTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUyB7IGErKzsgfQorICB9OworCisKK0xPQ0tfUkVUVVJORUQoYykKKy0tLS0tLS0tLS0tLS0tLS0KKworYGBMT0NLX1JFVFVSTkVEYGAgaXMgYW4gYXR0cmlidXRlIG9uIGZ1bmN0aW9ucyBvciBtZXRob2RzLCB3aGljaCBkZWNsYXJlcyB0aGF0Cit0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gY2FwYWJpbGl0eS4gIEl0IGlzIHVzZWQgdG8KK2Fubm90YXRlIGdldHRlciBtZXRob2RzIHRoYXQgcmV0dXJuIG11dGV4ZXMuCisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICBjbGFzcyBNeUNsYXNzIHsKKyAgcHJpdmF0ZToKKyAgICBNdXRleCBtdTsKKyAgICBpbnQgYSBHVUFSREVEX0JZKG11KTsKKyAgCisgIHB1YmxpYzoKKyAgICBNdXRleCogZ2V0TXUoKSBMT0NLX1JFVFVSTkVEKG11KSB7IHJldHVybiAmbXU7IH0KKyAgCisgICAgLy8gYW5hbHlzaXMga25vd3MgdGhhdCBnZXRNdSgpID09IG11CisgICAgdm9pZCBjbGVhcigpIEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRChnZXRNdSgpKSB7IGEgPSAwOyB9CisgIH07CisKKworQUNRVUlSRURfQkVGT1JFKC4uLiksIEFDUVVJUkVEX0FGVEVSKC4uLikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2BgQUNRVUlSRURfQkVGT1JFYGAgYW5kIGBgQUNRVUlSRURfQUZURVJgYCBhcmUgYXR0cmlidXRlcyBvbiBtZW1iZXIKK2RlY2xhcmF0aW9ucywgc3BlY2lmaWNhbGx5IGRlY2xhcmF0aW9ucyBvZiBtdXRleGVzIG9yIG90aGVyIGNhcGFiaWxpdGllcy4KK1RoZXNlIGRlY2xhcmF0aW9ucyBlbmZvcmNlIGEgcGFydGljdWxhciBvcmRlciBpbiB3aGljaCB0aGUgbXV0ZXhlcyBtdXN0IGJlCithY3F1aXJlZCwgaW4gb3JkZXIgdG8gcHJldmVudCBkZWFkbG9jay4KKworLi4gY29kZS1ibG9jazo6IGMrKworCisgIE11dGV4IG0xOworICBNdXRleCBtMiBBQ1FVSVJFRF9BRlRFUihtMSk7CisgIAorICAvLyBBbHRlcm5hdGl2ZSBkZWNsYXJhdGlvbgorICAvLyBNdXRleCBtMjsKKyAgLy8gTXV0ZXggbTEgQUNRVUlSRURfQkVGT1JFKG0yKTsKKyAgCisgIHZvaWQgZm9vKCkgeworICAgIG0yLkxvY2soKTsKKyAgICBtMS5Mb2NrKCk7ICAvLyBXYXJuaW5nISAgbTIgbXVzdCBiZSBhY3F1aXJlZCBhZnRlciBtMS4KKyAgICBtMS5VbmxvY2soKTsKKyAgICBtMi5VbmxvY2soKTsKKyAgfQorCisKK0xPQ0tBQkxFCistLS0tLS0tLQorCitgYExPQ0tBQkxFYGAgaXMgYW4gYXR0cmlidXRlIG9uIGNsYXNzZXMsIHdoaWNoIHNwZWNpZmllcyB0aGF0IG9iamVjdHMgb2YgdGhlCitjbGFzcyBjYW4gYmUgdXNlZCBhcyBhIGNhcGFiaWxpdHkuICBTZWUgdGhlIGBgQ29udGFpbmVyYGAgZXhhbXBsZSBnaXZlbiBhYm92ZSwKK29yIHRoZSBgYE11dGV4YGAgY2xhc3MgaW4gOnJlZjpgbXV0ZXhoZWFkZXJgLgorCisKK1NDT1BFRF9MT0NLQUJMRQorLS0tLS0tLS0tLS0tLS0tCisKK2BgU0NPUEVEX0xPQ0tBQkxFYGAgaXMgYW4gYXR0cmlidXRlIG9uIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgUkFJSS1zdHlsZQorbG9ja2luZywgaW4gd2hpY2ggYSBjYXBhYmlsaXR5IGlzIGFjcXVpcmVkIGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHJlbGVhc2VkIGluCit0aGUgZGVzdHJ1Y3Rvci4gIFN1Y2ggY2xhc3NlcyByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IKK2FuZCBkZXN0cnVjdG9yIHJlZmVyIHRvIHRoZSBjYXBhYmlsaXR5IHZpYSBkaWZmZXJlbnQgbmFtZXM7IHNlZSB0aGUKK2BgTXV0ZXhMb2NrZXJgYCBjbGFzcyBpbiA6cmVmOmBtdXRleGhlYWRlcmAsIGJlbG93LgorCisKK0VYQ0xVU0lWRV9UUllMT0NLX0ZVTkNUSU9OKDxib29sPiwgLi4uKSwgU0hBUkVEX1RSWUxPQ0tfRlVOQ1RJT04oPGJvb2w+LCAuLi4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVzZSBhcmUgYXR0cmlidXRlcyBvbiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0aGF0IHRyaWVzIHRvIGFjcXVpcmUgdGhlIGdpdmVuCitjYXBhYmlsaXR5LCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmUuCitUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBgYHRydWVgYCBvciBgYGZhbHNlYGAsIHRvIHNwZWNpZnkgd2hpY2ggcmV0dXJuIHZhbHVlCitpbmRpY2F0ZXMgc3VjY2VzcywgYW5kIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBpbnRlcnByZXRlZCBpbiB0aGUgc2FtZSB3YXkKK2FzIGBgKFVOKUxPQ0tfRlVOQ1RJT05gYC4gIFNlZSA6cmVmOmBtdXRleGhlYWRlcmAsIGJlbG93LCBmb3IgZXhhbXBsZSB1c2VzLgorCisKK0FTU0VSVF9FWENMVVNJVkVfTE9DSyguLi4pIGFuZCBBU1NFUlRfU0hBUkVEX0xPQ0soLi4uKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXNlIGFyZSBhdHRyaWJ1dGVzIG9uIGEgZnVuY3Rpb24gb3IgbWV0aG9kIHRoYXQgZG9lcyBhIHJ1bi10aW1lIHRlc3QgdG8gc2VlCit3aGV0aGVyIHRoZSBjYWxsaW5nIHRocmVhZCBob2xkcyB0aGUgZ2l2ZW4gY2FwYWJpbGl0eS4gIFRoZSBmdW5jdGlvbiBpcyBhc3N1bWVkCit0byBmYWlsIChubyByZXR1cm4pIGlmIHRoZSBjYXBhYmlsaXR5IGlzIG5vdCBoZWxkLiAgU2VlIDpyZWY6YG11dGV4aGVhZGVyYCwKK2JlbG93LCBmb3IgZXhhbXBsZSB1c2VzLgorCisKK0dVQVJERURfVkFSIGFuZCBQVF9HVUFSREVEX1ZBUgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1VzZSBvZiB0aGVzZSBhdHRyaWJ1dGVzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCisKKworV2FybmluZyBmbGFncworLS0tLS0tLS0tLS0tLQorCisqIGBgLVd0aHJlYWQtc2FmZXR5YGA6ICBVbWJyZWxsYSBmbGFnIHdoaWNoIHR1cm5zIG9uIHRoZSBmb2xsb3dpbmcgdGhyZWU6CisKKyAgKyBgYC1XdGhyZWFkLXNhZmV0eS1hdHRyaWJ1dGVzYGA6IFNhbml0eSBjaGVja3Mgb24gYXR0cmlidXRlIHN5bnRheC4KKyAgKyBgYC1XdGhyZWFkLXNhZmV0eS1hbmFseXNpc2BgOiBUaGUgY29yZSBhbmFseXNpcy4KKyAgKyBgYC1XdGhyZWFkLXNhZmV0eS1wcmVjaXNlYGA6IFJlcXVpcmVzIHRoYXQgbXV0ZXggZXhwcmVzc2lvbnMgbWF0Y2ggcHJlY2lzZWx5LgorICAgIFRoaXMgd2FybmluZyBjYW4gYmUgZGlzYWJsZWQgZm9yIGNvZGUgd2hpY2ggaGFzIGEgbG90IG9mIGFsaWFzZXMuCisKK1doZW4gbmV3IGZlYXR1cmVzIGFuZCBjaGVja3MgYXJlIGFkZGVkIHRvIHRoZSBhbmFseXNpcywgdGhleSBjYW4gb2Z0ZW4gaW50cm9kdWNlCithZGRpdGlvbmFsIHdhcm5pbmdzLiAgVGhvc2Ugd2FybmluZ3MgYXJlIGluaXRpYWxseSByZWxlYXNlZCBhcyAqYmV0YSogd2FybmluZ3MKK2ZvciBhIHBlcmlvZCBvZiB0aW1lLCBhZnRlciB3aGljaCB0aGV5IGFyZSBtaWdyYXRlZCB0byB0aGUgc3RhbmRhcmQgYW5hbHlzaXMuICAKKworKiBgYC1XdGhyZWFkLXNhZmV0eS1iZXRhYGA6ICBOZXcgZmVhdHVyZXMuICBPZmYgYnkgZGVmYXVsdC4gCisKKworLi4gX2ZhcToKKworRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyhRKSBTaG91bGQgSSBwdXQgYXR0cmlidXRlcyBpbiB0aGUgaGVhZGVyIGZpbGUsIG9yIGluIHRoZSAuY2MvLmNwcC8uY3h4IGZpbGU/CisKKyhBKSBBdHRyaWJ1dGVzIHNob3VsZCBhbHdheXMgZ28gaW4gdGhlIGhlYWRlci4KKworCisoUSkgIipNdXRleCBpcyBub3QgbG9ja2VkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlPyoiICBXaGF0IGRvZXMgdGhhdCBtZWFuPworCisoQSkgU2VlIDpyZWY6YGNvbmRpdGlvbmFsX2xvY2tzYCwgYmVsb3cuCisKKworLi4gX2xpbWl0YXRpb25zOgorCitLbm93biBMaW1pdGF0aW9ucyAKKz09PT09PT09PT09PT09PT09CisKK0xleGljYWwgc2NvcGUKKy0tLS0tLS0tLS0tLS0KKworVGhyZWFkIHNhZmV0eSBhdHRyaWJ1dGVzIGNvbnRhaW4gb3JkaW5hcnkgQysrIGV4cHJlc3Npb25zLCBhbmQgdGh1cyBmb2xsb3cKK29yZGluYXJ5IEMrKyBzY29waW5nIHJ1bGVzLiAgSW4gcGFydGljdWxhciwgdGhpcyBtZWFucyB0aGF0IG11dGV4ZXMgYW5kIG90aGVyCitjYXBhYmlsaXRpZXMgbXVzdCBiZSBkZWNsYXJlZCBiZWZvcmUgdGhleSBjYW4gYmUgdXNlZCBpbiBhbiBhdHRyaWJ1dGUuCitVc2UtYmVmb3JlLWRlY2xhcmF0aW9uIGlzIG9rYXkgd2l0aGluIGEgc2luZ2xlIGNsYXNzLCBiZWNhdXNlIGF0dHJpYnV0ZXMgYXJlCitwYXJzZWQgYXQgdGhlIHNhbWUgdGltZSBhcyBtZXRob2QgYm9kaWVzLiAoQysrIGRlbGF5cyBwYXJzaW5nIG9mIG1ldGhvZCBib2RpZXMKK3VudGlsIHRoZSBlbmQgb2YgdGhlIGNsYXNzLikgIEhvd2V2ZXIsIHVzZS1iZWZvcmUtZGVjbGFyYXRpb24gaXMgbm90IGFsbG93ZWQKK2JldHdlZW4gY2xhc3NlcywgYXMgaWxsdXN0cmF0ZWQgYmVsb3cuICAKKworLi4gY29kZS1ibG9jazo6IGMrKworCisgIGNsYXNzIEZvbzsKKworICBjbGFzcyBCYXIgeworICAgIHZvaWQgYmFyKEZvbyogZikgRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEKGYtPm11KTsgIC8vIEVycm9yOiBtdSB1bmRlY2xhcmVkLgorICB9OworCisgIGNsYXNzIEZvbyB7CisgICAgTXV0ZXggbXU7CisgIH07CisKKworUHJpdmF0ZSBNdXRleGVzCistLS0tLS0tLS0tLS0tLS0KKworR29vZCBzb2Z0d2FyZSBlbmdpbmVlcmluZyBwcmFjdGljZSBkaWN0YXRlcyB0aGF0IG11dGV4ZXMgc2hvdWxkIGJlIHByaXZhdGUKK21lbWJlcnMsIGJlY2F1c2UgdGhlIGxvY2tpbmcgbWVjaGFuaXNtIHVzZWQgYnkgYSB0aHJlYWQtc2FmZSBjbGFzcyBpcyBwYXJ0IG9mCitpdHMgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uICBIb3dldmVyLCBwcml2YXRlIG11dGV4ZXMgY2FuIHNvbWV0aW1lcyBsZWFrIGludG8KK3RoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIGEgY2xhc3MuCitUaHJlYWQgc2FmZXR5IGF0dHJpYnV0ZXMgZm9sbG93IG5vcm1hbCBDKysgYWNjZXNzIHJlc3RyaWN0aW9ucywgc28gaWYgYGBtdWBgCitpcyBhIHByaXZhdGUgbWVtYmVyIG9mIGBgY2BgLCB0aGVuIGl0IGlzIGFuIGVycm9yIHRvIHdyaXRlIGBgYy5tdWBgIGluIGFuCithdHRyaWJ1dGUuCisKK09uZSB3b3Jrcm91bmQgaXMgdG8gKGFiKXVzZSB0aGUgYGBMT0NLX1JFVFVSTkVEYGAgYXR0cmlidXRlIHRvIHByb3ZpZGUgYSBwdWJsaWMKKypuYW1lKiBmb3IgYSBwcml2YXRlIG11dGV4LCB3aXRob3V0IGFjdHVhbGx5IGV4cG9zaW5nIHRoZSB1bmRlcmx5aW5nIG11dGV4LgorRm9yIGV4YW1wbGU6CisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICBjbGFzcyBNeUNsYXNzIHsKKyAgcHJpdmF0ZToKKyAgICBNdXRleCBtdTsKKworICBwdWJsaWM6CisgICAgLy8gRm9yIHRocmVhZCBzYWZldHkgYW5hbHlzaXMgb25seS4gIERvZXMgbm90IGFjdHVhbGx5IHJldHVybiBtdS4KKyAgICBNdXRleCogZ2V0TXUoKSBMT0NLX1JFVFVSTkVEKG11KSB7IHJldHVybiAwOyB9CisKKyAgICB2b2lkIGRvU29tZXRoaW5nKCkgRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEKG11KTsgCisgIH07CisKKyAgdm9pZCBkb1NvbWV0aGluZ1R3aWNlKE15Q2xhc3MmIGMpIEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRChjLmdldE11KCkpIHsKKyAgICAvLyBUaGUgYW5hbHlzaXMgdGhpbmtzIHRoYXQgYy5nZXRNdSgpID09IGMubXUKKyAgICBjLmRvU29tZXRoaW5nKCk7CisgICAgYy5kb1NvbWV0aGluZygpOworICB9CisKK0luIHRoZSBhYm92ZSBleGFtcGxlLCBgYGRvU29tZXRoaW5nVHdpY2UoKWBgIGlzIGFuIGV4dGVybmFsIHJvdXRpbmUgdGhhdAorcmVxdWlyZXMgYGBjLm11YGAgdG8gYmUgbG9ja2VkLCB3aGljaCBjYW5ub3QgYmUgZGVjbGFyZWQgZGlyZWN0bHkgYmVjYXVzZSBgYG11YGAKK2lzIHByaXZhdGUuICBUaGlzIHBhdHRlcm4gaXMgZGlzY291cmFnZWQgYmVjYXVzZSBpdAordmlvbGF0ZXMgZW5jYXBzdWxhdGlvbiwgYnV0IGl0IGlzIHNvbWV0aW1lcyBuZWNlc3NhcnksIGVzcGVjaWFsbHkgd2hlbiBhZGRpbmcKK2Fubm90YXRpb25zIHRvIGFuIGV4aXN0aW5nIGNvZGUgYmFzZS4gIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGRlZmluZSBgYGdldE11KClgYAorYXMgYSBmYWtlIGdldHRlciBtZXRob2QsIHdoaWNoIGlzIHByb3ZpZGVkIG9ubHkgZm9yIHRoZSBiZW5lZml0IG9mIHRocmVhZAorc2FmZXR5IGFuYWx5c2lzLgorCisKK0ZhbHNlIG5lZ2F0aXZlcyBvbiBwYXNzIGJ5IHJlZmVyZW5jZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgYW5hbHlzaXMgb25seSBjaGVja3Mgb3BlcmF0aW9ucyB3aGljaCByZWZlciB0bworZ3VhcmRlZCBkYXRhIG1lbWJlcnMgZGlyZWN0bHkgYnkgbmFtZS4gIElmIHRoZSBkYXRhIG1lbWJlcnMgYXJlIGFjY2Vzc2VkCitpbmRpcmVjdGx5LCB2aWEgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSwgdGhlbiBubyB3YXJuaW5nIGlzIGdlbmVyYXRlZC4gIFRodXMsCitubyB3YXJuaW5ncyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhlIGZvbGxvd2luZyBjb2RlOgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgTXV0ZXggbXU7CisgIGludCBhIEdVQVJERURfQlkobXUpOworCisgIHZvaWQgY2xlYXIoaW50JiByYSkgeyByYSA9IDA7IH0KKworICB2b2lkIHRlc3QoKSB7CisgICAgaW50ICpwID0gJmE7CisgICAgKnAgPSAwOyAgICAgICAvLyBObyB3YXJuaW5nLiAgKnAgaXMgYW4gYWxpYXMgdG8gYS4gIAorICAgICAgIAorICAgIGNsZWFyKGEpOyAgICAgLy8gTm8gd2FybmluZy4gICdhJyBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlLgorICB9CisKK1RoaXMgaXNzdWUgaXMgYnkgZmFyIHRoZSBiaWdnZXN0IHNvdXJjZSBvZiBmYWxzZSBuZWdhdGl2ZXMgaW4gdGhlIGN1cnJlbnQKK3ZlcnNpb24gb2YgdGhlIGFuYWx5c2lzLiAgQXQgYSBmdW5kYW1lbnRhbCBsZXZlbCwgdGhlCitmYWxzZSBuZWdhdGl2ZXMgYXJlIGNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IGFubm90YXRpb25zIGFyZSBhdHRhY2hlZCB0byBkYXRhCittZW1iZXJzLCByYXRoZXIgdGhhbiB0eXBlcy4gIFRoZSB0eXBlIG9mIGBgJmFgYCBzaG91bGQgcmVhbGx5IGJlCitgYGludCBHVUFSREVEX0JZKG11KSpgYCwgcmF0aGVyIHRoYW4gYGBpbnQqYGAsIGFuZCB0aGUgc3RhdGVtZW50IGBgcCA9ICZhYGAKK3Nob3VsZCB0aHVzIGdlbmVyYXRlIGEgdHlwZSBlcnJvci4gIEhvd2V2ZXIsIGF0dGFjaGluZyBhdHRyaWJ1dGVzIHRvIHR5cGVzCit3b3VsZCBiZSBhbiBpbnZhc2l2ZSBjaGFuZ2UgdG8gdGhlIEMrKyB0eXBlIHN5c3RlbSwgd2l0aCBwb3RlbnRpYWwKK3JhbWlmaWNhdGlvbnMgd2l0aCByZXNwZWN0IHRvIHRlbXBsYXRlIGluc3RhbnRhdGlvbiwgZnVuY3Rpb24gb3ZlcmxvYWRpbmcsCithbmQgc28gb24uICBUaHVzLCBhIGNvbXBsZXRlIHNvbHV0aW9uIHRvIHRoaXMgaXNzdWUgaXMgc2ltcGx5IG5vdCBmZWFzaWJsZS4KKworRnV0dXJlIHZlcnNpb25zIG9mIHRoZSBhbmFseXNpcyB3aWxsIGluY2x1ZGUgYmV0dGVyIHN1cHBvcnQgZm9yIHBvaW50ZXIKK2FsaWFzIGFuYWx5c2lzLCBhbG9uZyB3aXRoIGxpbWl0ZWQgY2hlY2tpbmcgb2YgZ3VhcmRlZCB0eXBlcywgaW4gb3JkZXIgdG8KK3JlZHVjZSB0aGUgbnVtYmVyIG9mIGZhbHNlIG5lZ2F0aXZlcy4KKworCisuLiBfY29uZGl0aW9uYWxfbG9ja3M6CisKK05vIGNvbmRpdGlvbmFsbHkgaGVsZCBsb2Nrcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGFuYWx5c2lzIG11c3QgYmUgYWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBhIGxvY2sgaXMgaGVsZCwgb3Igbm90IGhlbGQsIGF0CitldmVyeSBwcm9ncmFtIHBvaW50LiAgVGh1cywgc2VjdGlvbnMgb2YgY29kZSB3aGVyZSBhIGxvY2sgKm1pZ2h0IGJlIGhlbGQqIHdpbGwKK2dlbmVyYXRlIHNwdXJpb3VzIHdhcm5pbmdzIChmYWxzZSBwb3NpdGl2ZXMpLiAgRm9yIGV4YW1wbGU6CisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICB2b2lkIGZvbygpIHsKKyAgICBib29sIGIgPSBuZWVkc1RvTG9jaygpOworICAgIGlmIChiKSBtdS5Mb2NrKCk7CisgICAgLi4uICAvLyBXYXJuaW5nISAgTXV0ZXggJ211JyBpcyBub3QgaGVsZCBvbiBldmVyeSBwYXRoIHRocm91Z2ggaGVyZS4gCisgICAgaWYgKGIpIG11LlVubG9jaygpOworICB9CisKKworTm8gY2hlY2tpbmcgaW5zaWRlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGFuYWx5c2lzIGN1cnJlbnRseSBkb2VzIG5vdCBkbyBhbnkgY2hlY2tpbmcgaW5zaWRlIGNvbnN0cnVjdG9ycyBvcgorZGVzdHJ1Y3RvcnMuICBJbiBvdGhlciB3b3JkcywgZXZlcnkgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgaXMgdHJlYXRlZCBhcworaWYgaXQgd2FzIGFubm90YXRlZCB3aXRoIGBgTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJU2BgLiAgCitUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgZHVyaW5nIGluaXRpYWxpemF0aW9uLCBvbmx5IG9uZSB0aHJlYWQgdHlwaWNhbGx5CitoYXMgYWNjZXNzIHRvIHRoZSBvYmplY3Qgd2hpY2ggaXMgYmVpbmcgaW5pdGlhbGl6ZWQsIGFuZCBpdCBpcyB0aHVzIHNhZmUgKGFuZAorY29tbW9uIHByYWN0aWNlKSB0byBpbml0aWFsaXplIGd1YXJkZWQgbWVtYmVycyB3aXRob3V0IGFjcXVpcmluZyBhbnkgbG9ja3MuCitUaGUgc2FtZSBpcyB0cnVlIG9mIGRlc3RydWN0b3JzLgorCitJZGVhbGx5LCB0aGUgYW5hbHlzaXMgd291bGQgYWxsb3cgaW5pdGlhbGl6YXRpb24gb2YgZ3VhcmRlZCBtZW1iZXJzIGluc2lkZSB0aGUKK29iamVjdCBiZWluZyBpbml0aWFsaXplZCBvciBkZXN0cm95ZWQsIHdoaWxlIHN0aWxsIGVuZm9yY2luZyB0aGUgdXN1YWwgYWNjZXNzCityZXN0cmljdGlvbnMgb24gZXZlcnl0aGluZyBlbHNlLiAgSG93ZXZlciwgdGhpcyBpcyBkaWZmaWN1bHQgdG8gZW5mb3JjZSBpbgorcHJhY3RpY2UsIGJlY2F1c2UgaW4gY29tcGxleCBwb2ludGVyLWJhc2VkIGRhdGEgc3RydWN0dXJlcywgaXQgaXMgaGFyZCB0bworZGV0ZXJtaW5lIHdoYXQgZGF0YSBpcyAib3duZWQgYnkiIHRoZSBlbmNsb3Npbmcgb2JqZWN0LgorCitObyBpbmxpbmluZy4KKy0tLS0tLS0tLS0tLQorCitUaHJlYWQgc2FmZXR5IGFuYWx5c2lzIGlzIHN0cmljdGx5IGludHJhLXByb2NlZHVyYWwsIGp1c3QgbGlrZSBvcmRpbmFyeSB0eXBlCitjaGVja2luZy4gIEl0IHJlbGllcyBvbmx5IG9uIHRoZSBkZWNsYXJlZCBhdHRyaWJ1dGVzIG9mIGEgZnVuY3Rpb24sIGFuZCB3aWxsCitub3QgYXR0ZW1wdCB0byAic3RlcCBpbnNpZGUiLCBvciBpbmxpbmUgYW55IG1ldGhvZCBjYWxscy4gIEFzIGEgcmVzdWx0LCBjb2RlCitzdWNoIGFzIHRoZSBmb2xsb3dpbmcgd2lsbCBub3Qgd29yazoKKworLi4gY29kZS1ibG9jazo6IGMrKworCisgIHRlbXBsYXRlPGNsYXNzIFQ+CisgIGNsYXNzIEF1dG9DbGVhbnVwIHsKKyAgICBUKiBvYmplY3Q7CisgICAgdm9pZCAoVDo6Km1wKSgpOworICAgIAorICBwdWJsaWM6CisgICAgQXV0b0NsZWFudXAoVCogb2JqLCB2b2lkIChUOjoqaW1wKSgpKSA6IG9iamVjdChvYmopLCBtcChpbXApIHsgfQorICAgIH5BdXRvQ2xlYW51cCgpIHsgKG9iamVjdC0+Km1wKSgpOyB9CisgIH07CisKKyAgTXV0ZXggbXU7CisgIHZvaWQgZm9vKCkgeworICAgIG11LkxvY2soKTsKKyAgICBBdXRvQ2xlYW51cDxNdXRleD4oJm11LCAmTXV0ZXg6OlVubG9jayk7IAorICAgIC4uLgorICB9ICAvLyBXYXJuaW5nLCBtdSBpcyBub3QgdW5sb2NrZWQuCisKK0luIHRoaXMgY2FzZSwgdGhlIGRlc3RydWN0b3Igb2YgYGBBdXRvY2xlYW51cGBgIGNhbGxzIGBgbXUuVW5sb2NrKClgYCwgc28KK3RoZSB3YXJuaW5nIGlzIGJvZ3VzLiAgSG93ZXZlciwKK3RocmVhZCBzYWZldHkgYW5hbHlzaXMgY2Fubm90IHNlZSB0aGUgdW5sb2NrLCBiZWNhdXNlIGl0IGRvZXMgbm90IGF0dGVtcHQgdG8KK2lubGluZSB0aGUgZGVzdHJ1Y3Rvci4gIE1vcmVvdmVyLCB0aGVyZSBpcyBubyB3YXkgdG8gYW5ub3RhdGUgdGhlIGRlc3RydWN0b3IsCitiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIGlzIGNhbGxpbmcgYSBmdW5jdGlvbiB0aGF0IGlzIG5vdCBzdGF0aWNhbGx5IGtub3duLgorVGhpcyBwYXR0ZXJuIGlzIHNpbXBseSBub3Qgc3VwcG9ydGVkLiAKKworCitMT0NLU19FWENMVURFRCBpcyBub3QgdHJhbnNpdGl2ZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIGZ1bmN0aW9uIHdoaWNoIGNhbGxzIGEgbWV0aG9kIG1hcmtlZCB3aXRoIExPQ0tTX0VYQ0xVREVEIGlzIG5vdCByZXF1aXJlZCB0bworcHV0IExPQ0tTX0VYQ0xVREVEIGluIGl0cyBvd24gaW50ZXJmYWNlLiAgTE9DS1NfRVhDTFVERUQgYmVoYXZlcyBkaWZmZXJlbnRseQorZnJvbSBMT0NLU19SRVFVSVJFRCBpbiB0aGlzIHJlc3BlY3QsIGFuZCBpdCBjYW4gcmVzdWx0IGluIGZhbHNlIG5lZ2F0aXZlczoKKworLi4gY29kZS1ibG9jazo6IGMrKworCisgIGNsYXNzIEZvbyB7CisgICAgTXV0ZXggbXU7CisgICAgCisgICAgdm9pZCBmb28oKSB7CisgICAgICBtdS5Mb2NrKCk7CisgICAgICBiYXIoKTsgICAgICAgICAgICAgICAgLy8gTm8gd2FybmluZworICAgICAgbXUuVW5sb2NrKCk7CisgICAgfQorICAgIAorICAgIHZvaWQgYmFyKCkgeyBiYXooKTsgfSAgIC8vIE5vIHdhcm5pbmcuICAoU2hvdWxkIGhhdmUgTE9DS1NfRVhDTFVERUQobXUpLikKKyAgICAKKyAgICB2b2lkIGJheigpIExPQ0tTX0VYQ0xVREVEKG11KTsKKyAgfTsKKworVGhlIGxhY2sgb2YgdHJhbnNpdGl2aXR5IGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IExPQ0tTX0VYQ0xVREVEIGNhbiBlYXNpbHkKK2JyZWFrIGVuY2Fwc3VsYXRpb247IGl0IHdvdWxkIGJlIGEgYmFkIGlkZWEgdG8gcmVxdWlyZSBmdW5jdGlvbnMgdG8gbGlzdCB0aGUKK25hbWVzIHByaXZhdGUgbG9ja3Mgd2hpY2ggaGFwcGVuIHRvIGJlIGFjcXVpcmVkIGludGVybmFsbHkuICAKKworCitObyBhbGlhcyBhbmFseXNpcy4KKy0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYW5hbHlzaXMgY3VycmVudGx5IGRvZXMgbm90IHRyYWNrIHBvaW50ZXIgYWxpYXNlcy4gIFRodXMsIHRoZXJlIGNhbiBiZQorZmFsc2UgcG9zaXRpdmVzIGlmIHR3byBwb2ludGVycyBib3RoIHBvaW50IHRvIHRoZSBzYW1lIG11dGV4LiAgCisKKworLi4gY29kZS1ibG9jazo6IGMrKworCisgIGNsYXNzIE11dGV4VW5sb2NrZXIgeworICAgIE11dGV4KiBtdTsKKworICBwdWJsaWM6CisgICAgTXV0ZXhVbmxvY2tlcihNdXRleCogbSkgVU5MT0NLX0ZVTkNUSU9OKG0pIDogbXUobSkgIHsgbXUtPlVubG9jaygpOyB9CisgICAgfk11dGV4VW5sb2NrZXIoKSBFWENMVVNJVkVfTE9DS19GVU5DVElPTihtdSkgeyBtdS0+TG9jaygpOyB9CisgIH07CisKKyAgTXV0ZXggbXV0ZXg7CisgIHZvaWQgdGVzdCgpIEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRChtdXRleCkgeworICAgIHsgCisgICAgICBNdXRleFVubG9ja2VyIG11bmwoJm11dGV4KTsgIC8vIHVubG9ja3MgbXV0ZXgKKyAgICAgIGRvU29tZUlPKCk7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhcm5pbmc6IGxvY2tzIG11bmwubXUKKyAgfQorCitUaGUgTXV0ZXhVbmxvY2tlciBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB0aGUgZHVhbCBvZiB0aGUgTXV0ZXhMb2NrZXIgY2xhc3MsCitkZWZpbmVkIGluIDpyZWY6YG11dGV4aGVhZGVyYC4gIEhvd2V2ZXIsIGl0IGRvZXNuJ3Qgd29yayBiZWNhdXNlIHRoZSBhbmFseXNpcworZG9lc24ndCBrbm93IHRoYXQgbXVubC5tdSA9PSBtdXRleC4gIFRoZSBTQ09QRURfTE9DS0FCTEUgYXR0cmlidXRlIGhhbmRsZXMKK2FsaWFzaW5nIAorCisKK0FDUVVJUkVEX0JFRk9SRSguLi4pIGFuZCBBQ1FVSVJFRF9BRlRFUiguLi4pIGFyZSBjdXJyZW50bHkgdW5pbXBsZW1lbnRlZC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gYmUgZml4ZWQgaW4gYSBmdXR1cmUgdXBkYXRlLiAKKworCisuLiBfbXV0ZXhoZWFkZXI6CisKK211dGV4LmgKKz09PT09PT0KKworVGhyZWFkIHNhZmV0eSBhbmFseXNpcyBjYW4gYmUgdXNlZCB3aXRoIGFueSB0aHJlYWRpbmcgbGlicmFyeSwgYnV0IGl0IGRvZXMKK3JlcXVpcmUgdGhhdCB0aGUgdGhyZWFkaW5nIEFQSSBiZSB3cmFwcGVkIGluIGNsYXNzZXMgYW5kIG1ldGhvZHMgd2hpY2ggaGF2ZSB0aGUKK2FwcHJvcHJpYXRlIGFubm90YXRpb25zLiAgVGhlIGZvbGxvd2luZyBjb2RlIHByb3ZpZGVzIGBgbXV0ZXguaGBgIGFzIGFuIGV4YW1wbGU7Cit0aGVzZSBtZXRob2RzIHNob3VsZCBiZSBmaWxsZWQgaW4gdG8gY2FsbCB0aGUgYXBwcm9wcmlhdGUgdW5kZXJseWluZworaW1wbGVtZW50YXRpb24uIAorCisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICAjaWZuZGVmIFRIUkVBRF9TQUZFVFlfQU5BTFlTSVNfTVVURVhfSAorICAjZGVmaW5lIFRIUkVBRF9TQUZFVFlfQU5BTFlTSVNfTVVURVhfSAorICAKKyAgLy8gRW5hYmxlIHRocmVhZCBzYWZldHkgYXR0cmlidXRlcyBvbmx5IHdpdGggY2xhbmcuCisgIC8vIFRoZSBhdHRyaWJ1dGVzIGNhbiBiZSBzYWZlbHkgZXJhc2VkIHdoZW4gY29tcGlsaW5nIHdpdGggb3RoZXIgY29tcGlsZXJzLgorICAjaWYgZGVmaW5lZChfX2NsYW5nX18pICYmICghZGVmaW5lZChTV0lHKSkKKyAgI2RlZmluZSBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyh4KSAgIF9fYXR0cmlidXRlX18oKHgpKQorICAjZWxzZQorICAjZGVmaW5lIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKHgpICAgLy8gbm8tb3AKKyAgI2VuZGlmCisgIAorICAjZGVmaW5lIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKHgpICAgX19hdHRyaWJ1dGVfXygoeCkpCisgIAorICAjZGVmaW5lIEdVQVJERURfQlkoeCkgXAorICAgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGd1YXJkZWRfYnkoeCkpCisgIAorICAjZGVmaW5lIEdVQVJERURfVkFSIFwKKyAgICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhndWFyZGVkKQorICAKKyAgI2RlZmluZSBQVF9HVUFSREVEX0JZKHgpIFwKKyAgICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhwdF9ndWFyZGVkX2J5KHgpKQorICAKKyAgI2RlZmluZSBQVF9HVUFSREVEX1ZBUiBcCisgICAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18ocHRfZ3VhcmRlZCkKKyAgCisgICNkZWZpbmUgQUNRVUlSRURfQUZURVIoLi4uKSBcCisgICAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oYWNxdWlyZWRfYWZ0ZXIoX19WQV9BUkdTX18pKQorICAKKyAgI2RlZmluZSBBQ1FVSVJFRF9CRUZPUkUoLi4uKSBcCisgICAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oYWNxdWlyZWRfYmVmb3JlKF9fVkFfQVJHU19fKSkKKyAgCisgICNkZWZpbmUgRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEKC4uLikgXAorICAgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGV4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZChfX1ZBX0FSR1NfXykpCisgIAorICAjZGVmaW5lIFNIQVJFRF9MT0NLU19SRVFVSVJFRCguLi4pIFwKKyAgICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhzaGFyZWRfbG9ja3NfcmVxdWlyZWQoX19WQV9BUkdTX18pKQorICAKKyAgI2RlZmluZSBMT0NLU19FWENMVURFRCguLi4pIFwKKyAgICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhsb2Nrc19leGNsdWRlZChfX1ZBX0FSR1NfXykpCisgIAorICAjZGVmaW5lIExPQ0tfUkVUVVJORUQoeCkgXAorICAgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGxvY2tfcmV0dXJuZWQoeCkpCisgIAorICAjZGVmaW5lIExPQ0tBQkxFIFwKKyAgICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhsb2NrYWJsZSkKKyAgCisgICNkZWZpbmUgU0NPUEVEX0xPQ0tBQkxFIFwKKyAgICBUSFJFQURfQU5OT1RBVElPTl9BVFRSSUJVVEVfXyhzY29wZWRfbG9ja2FibGUpCisgIAorICAjZGVmaW5lIEVYQ0xVU0lWRV9MT0NLX0ZVTkNUSU9OKC4uLikgXAorICAgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGV4Y2x1c2l2ZV9sb2NrX2Z1bmN0aW9uKF9fVkFfQVJHU19fKSkKKyAgCisgICNkZWZpbmUgU0hBUkVEX0xPQ0tfRlVOQ1RJT04oLi4uKSBcCisgICAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oc2hhcmVkX2xvY2tfZnVuY3Rpb24oX19WQV9BUkdTX18pKQorICAKKyAgI2RlZmluZSBBU1NFUlRfRVhDTFVTSVZFX0xPQ0soLi4uKSBcCisgICAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oYXNzZXJ0X2V4Y2x1c2l2ZV9sb2NrKF9fVkFfQVJHU19fKSkKKyAgCisgICNkZWZpbmUgQVNTRVJUX1NIQVJFRF9MT0NLKC4uLikgXAorICAgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGFzc2VydF9zaGFyZWRfbG9jayhfX1ZBX0FSR1NfXykpCisgIAorICAjZGVmaW5lIEVYQ0xVU0lWRV9UUllMT0NLX0ZVTkNUSU9OKC4uLikgXAorICAgIFRIUkVBRF9BTk5PVEFUSU9OX0FUVFJJQlVURV9fKGV4Y2x1c2l2ZV90cnlsb2NrX2Z1bmN0aW9uKF9fVkFfQVJHU19fKSkKKyAgCisgICNkZWZpbmUgU0hBUkVEX1RSWUxPQ0tfRlVOQ1RJT04oLi4uKSBcCisgICAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18oc2hhcmVkX3RyeWxvY2tfZnVuY3Rpb24oX19WQV9BUkdTX18pKQorICAKKyAgI2RlZmluZSBVTkxPQ0tfRlVOQ1RJT04oLi4uKSBcCisgICAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18odW5sb2NrX2Z1bmN0aW9uKF9fVkFfQVJHU19fKSkKKyAgCisgICNkZWZpbmUgTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUyBcCisgICAgVEhSRUFEX0FOTk9UQVRJT05fQVRUUklCVVRFX18obm9fdGhyZWFkX3NhZmV0eV9hbmFseXNpcykKKyAgCisgIAorICAvLyBEZWZpbmVzIGFuIGFubm90YXRlZCBpbnRlcmZhY2UgZm9yIG11dGV4ZXMuCisgIC8vIFRoZXNlIG1ldGhvZHMgY2FuIGJlIGltcGxlbWVudGVkIHRvIHVzZSBhbnkgaW50ZXJuYWwgbXV0ZXggaW1wbGVtZW50YXRpb24uCisgIGNsYXNzIExPQ0tBQkxFIE11dGV4IHsKKyAgcHVibGljOgorICAgIC8vIEFjcXVpcmUvbG9jayB0aGlzIG11dGV4IGV4Y2x1c2l2ZWx5LiAgT25seSBvbmUgdGhyZWFkIGNhbiBoYXZlIGV4Y2x1c2l2ZQorICAgIC8vIGFjY2VzcyBhdCBhbnkgb25lIHRpbWUuICBXcml0ZSBvcGVyYXRpb25zIHRvIGd1YXJkZWQgZGF0YSByZXF1aXJlIGFuCisgICAgLy8gZXhjbHVzaXZlIGxvY2suCisgICAgdm9pZCBMb2NrKCkgRVhDTFVTSVZFX0xPQ0tfRlVOQ1RJT04oKTsKKyAgCisgICAgLy8gQWNxdWlyZS9sb2NrIHRoaXMgbXV0ZXggZm9yIHJlYWQgb3BlcmF0aW9ucywgd2hpY2ggcmVxdWlyZSBvbmx5IGEgc2hhcmVkCisgICAgLy8gbG9jay4gIFRoaXMgYXNzdW1lcyBhIG11bHRpcGxlLXJlYWRlciwgc2luZ2xlIHdyaXRlciBzZW1hbnRpY3MuICBNdWx0aXBsZQorICAgIC8vIHRocmVhZHMgbWF5IGFjcXVpcmUgdGhlIG11dGV4IHNpbXVsdGFuZW91c2x5IGFzIHJlYWRlcnMsIGJ1dCBhIHdyaXRlciBtdXN0CisgICAgLy8gd2FpdCBmb3IgYWxsIG9mIHRoZW0gdG8gcmVsZWFzZSB0aGUgbXV0ZXggYmVmb3JlIGl0IGNhbiBhY3F1aXJlIGl0CisgICAgLy8gZXhjbHVzaXZlbHkuICAKKyAgICB2b2lkIFJlYWRlckxvY2soKSBTSEFSRURfTE9DS19GVU5DVElPTigpOworICAKKyAgICAvLyBSZWxlYXNlL3VubG9jayB0aGUgbXV0ZXgsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBleGNsdXNpdmUgb3Igc2hhcmVkLgorICAgIHZvaWQgVW5sb2NrKCkgVU5MT0NLX0ZVTkNUSU9OKCk7CisgIAorICAgIC8vIFRyeSB0byBhY3F1aXJlIHRoZSBtdXRleC4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBhbmQgZmFsc2Ugb24gZmFpbHVyZS4KKyAgICBib29sIFRyeUxvY2soKSBFWENMVVNJVkVfVFJZTE9DS19GVU5DVElPTih0cnVlKTsKKyAgCisgICAgLy8gVHJ5IHRvIGFjcXVpcmUgdGhlIG11dGV4IGZvciByZWFkIG9wZXJhdGlvbnMuCisgICAgYm9vbCBSZWFkZXJUcnlMb2NrKCkgU0hBUkVEX1RSWUxPQ0tfRlVOQ1RJT04odHJ1ZSk7CisgIAorICAgIC8vIEFzc2VydCB0aGF0IHRoaXMgbXV0ZXggaXMgY3VycmVudGx5IGhlbGQgYnkgdGhlIGNhbGxpbmcgdGhyZWFkLgorICAgIHZvaWQgQXNzZXJ0SGVsZCgpIEFTU0VSVF9FWENMVVNJVkVfTE9DSygpOworICAKKyAgICAvLyBBc3NlcnQgdGhhdCBpcyBtdXRleCBpcyBjdXJyZW50bHkgaGVsZCBmb3IgcmVhZCBvcGVyYXRpb25zLiAKKyAgICB2b2lkIEFzc2VydFJlYWRlckhlbGQoKSBBU1NFUlRfU0hBUkVEX0xPQ0soKTsKKyAgfTsKKyAgCisgIAorICAvLyBNdXRleExvY2tlciBpcyBhbiBSQUlJIGNsYXNzIHRoYXQgYWNxdWlyZXMgYSBtdXRleCBpbiBpdHMgY29uc3RydWN0b3IsIGFuZAorICAvLyByZWxlYXNlcyBpdCBpbiBpdHMgZGVzdHJ1Y3Rvci4gIAorICBjbGFzcyBTQ09QRURfTE9DS0FCTEUgTXV0ZXhMb2NrZXIgeworICBwcml2YXRlOgorICAgIE11dGV4KiBtdXQ7CisgIAorICBwdWJsaWM6CisgICAgTXV0ZXhMb2NrZXIoTXV0ZXggKm11KSBFWENMVVNJVkVfTE9DS19GVU5DVElPTihtdSkgOiBtdXQobXUpIHsKKyAgICAgIG11LT5Mb2NrKCk7CisgICAgfSAgCisgICAgfk11dGV4TG9ja2VyKCkgVU5MT0NLX0ZVTkNUSU9OKCkgeworICAgICAgbXV0LT5VbmxvY2soKTsKKyAgICB9CisgIH07CisgIAorICAjZW5kaWYgIC8vIFRIUkVBRF9TQUZFVFlfQU5BTFlTSVNfTVVURVhfSApkaWZmIC0tZ2l0IGEvZG9jcy9UaHJlYWRTYW5pdGl6ZXIucnN0IGIvZG9jcy9UaHJlYWRTYW5pdGl6ZXIucnN0CmluZGV4IDE5NGFkNGEuLmExZDgxZTkgMTAwNjQ0Ci0tLSBhL2RvY3MvVGhyZWFkU2FuaXRpemVyLnJzdAorKysgYi9kb2NzL1RocmVhZFNhbml0aXplci5yc3QKQEAgLTE4LDkgKzE4LDkgQEAKIFN1cHBvcnRlZCBQbGF0Zm9ybXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhyZWFkU2FuaXRpemVyIGlzIHN1cHBvcnRlZCBvbiBMaW51eCB4ODZfNjQgKHRlc3RlZCBvbiBVYnVudHUgMTAuMDQgYW5kIDEyLjA0KS4KLVN1cHBvcnQgZm9yIE1hY09TIDEwLjcgKDY0LWJpdCBvbmx5KSBpcyBwbGFubmVkIGZvciAyMDEzLiAgU3VwcG9ydCBmb3IgMzItYml0Ci1wbGF0Zm9ybXMgaXMgcHJvYmxlbWF0aWMgYW5kIG5vdCB5ZXQgcGxhbm5lZC4KK1RocmVhZFNhbml0aXplciBpcyBzdXBwb3J0ZWQgb24gTGludXggeDg2XzY0ICh0ZXN0ZWQgb24gVWJ1bnR1IDEyLjA0KS4KK1N1cHBvcnQgZm9yIG90aGVyIDY0LWJpdCBhcmNoaXRlY3R1cmVzIGlzIHBvc3NpYmxlLCBjb250cmlidXRpb25zIGFyZSB3ZWxjb21lLgorU3VwcG9ydCBmb3IgMzItYml0IHBsYXRmb3JtcyBpcyBwcm9ibGVtYXRpYyBhbmQgaXMgbm90IHBsYW5uZWQuCiAKIFVzYWdlCiAtLS0tLQpkaWZmIC0tZ2l0IGEvZG9jcy9Vc2Vyc01hbnVhbC5yc3QgYi9kb2NzL1VzZXJzTWFudWFsLnJzdAppbmRleCA5NmQ2NWE0Li41Yjc2MWE4IDEwMDY0NAotLS0gYS9kb2NzL1VzZXJzTWFudWFsLnJzdAorKysgYi9kb2NzL1VzZXJzTWFudWFsLnJzdApAQCAtMTEyLDExICsxMTIsMTEgQEAKIAogLi4gb3B0aW9uOjogLXcKIAotICBEaXNhYmxlIGFsbCB3YXJuaW5ncy4KKyAgRGlzYWJsZSBhbGwgZGlhZ25vc3RpY3MuCiAKIC4uIG9wdGlvbjo6IC1XZXZlcnl0aGluZwogCi0gIDpyZWY6YEVuYWJsZSBhbGwgd2FybmluZ3MuIDxkaWFnbm9zdGljc19lbmFibGVfZXZlcnl0aGluZz5gCisgIDpyZWY6YEVuYWJsZSBhbGwgZGlhZ25vc3RpY3MuIDxkaWFnbm9zdGljc19lbmFibGVfZXZlcnl0aGluZz5gCiAKIC4uIG9wdGlvbjo6IC1wZWRhbnRpYwogCkBAIC0yNjUsMTEgKzI2NSw2IEBACiAKICAgICAgICAgICAgdC5jICszOjExOiB3YXJuaW5nOiBjb252ZXJzaW9uIHNwZWNpZmllcyB0eXBlICdjaGFyIConIGJ1dCB0aGUgYXJndW1lbnQgaGFzIHR5cGUgJ2ludCcKIAotKiotZltuby1dZGlhZ25vc3RpY3Mtc2hvdy1uYW1lKioKLSAgIEVuYWJsZSB0aGUgZGlzcGxheSBvZiB0aGUgZGlhZ25vc3RpYyBuYW1lLgotICAgVGhpcyBvcHRpb24sIHdoaWNoIGRlZmF1bHRzIHRvIG9mZiwgY29udHJvbHMgd2hldGhlciBvciBub3QgQ2xhbmcKLSAgIHByaW50cyB0aGUgYXNzb2NpYXRlZCBuYW1lLgotCiAuLiBfb3B0X2ZkaWFnbm9zdGljcy1zaG93LW9wdGlvbjoKIAogKiotZltuby1dZGlhZ25vc3RpY3Mtc2hvdy1vcHRpb24qKgpAQCAtNTg3LDYgKzU4Miw3IEBACiAKIC0gIElnbm9yZWQKIC0gIE5vdGUKKy0gIFJlbWFyawogLSAgV2FybmluZwogLSAgRXJyb3IKIC0gIEZhdGFsCkBAIC03MDQsMTcgKzcwMCwxOCBAQAogCiAgIGNoYXIgYiA9ICdhYic7IC8vIG5vIHdhcm5pbmcKIAotVGhlIDpvcHRpb246YC1pc3lzdGVtLXByZWZpeGAgYW5kIDpvcHRpb246YC1pbm8tc3lzdGVtLXByZWZpeGAgY29tbWFuZC1saW5lCi1hcmd1bWVudHMgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgd2hldGhlciBzdWJzZXRzIG9mIGFuIGluY2x1ZGUgcGF0aCBhcmUKLXRyZWF0ZWQgYXMgc3lzdGVtIGhlYWRlcnMuIFdoZW4gdGhlIG5hbWUgaW4gYSBgYCNpbmNsdWRlYGAgZGlyZWN0aXZlIGlzCi1mb3VuZCB3aXRoaW4gYSBoZWFkZXIgc2VhcmNoIHBhdGggYW5kIHN0YXJ0cyB3aXRoIGEgc3lzdGVtIHByZWZpeCwgdGhlCitUaGUgOm9wdGlvbjpgLS1zeXN0ZW0taGVhZGVyLXByZWZpeD1gIGFuZCA6b3B0aW9uOmAtLW5vLXN5c3RlbS1oZWFkZXItcHJlZml4PWAKK2NvbW1hbmQtbGluZSBhcmd1bWVudHMgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgd2hldGhlciBzdWJzZXRzIG9mIGFuIGluY2x1ZGUKK3BhdGggYXJlIHRyZWF0ZWQgYXMgc3lzdGVtIGhlYWRlcnMuIFdoZW4gdGhlIG5hbWUgaW4gYSBgYCNpbmNsdWRlYGAgZGlyZWN0aXZlCitpcyBmb3VuZCB3aXRoaW4gYSBoZWFkZXIgc2VhcmNoIHBhdGggYW5kIHN0YXJ0cyB3aXRoIGEgc3lzdGVtIHByZWZpeCwgdGhlCiBoZWFkZXIgaXMgdHJlYXRlZCBhcyBhIHN5c3RlbSBoZWFkZXIuIFRoZSBsYXN0IHByZWZpeCBvbiB0aGUKIGNvbW1hbmQtbGluZSB3aGljaCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgaGVhZGVyIG5hbWUgdGFrZXMgcHJlY2VkZW5jZS4KIEZvciBpbnN0YW5jZToKIAogLi4gY29kZS1ibG9jazo6IGNvbnNvbGUKIAotICAkIGNsYW5nIC1JZm9vIC1pc3lzdGVtIGJhciAtaXN5c3RlbS1wcmVmaXggeC8gLWluby1zeXN0ZW0tcHJlZml4IHgveS8KKyAgJCBjbGFuZyAtSWZvbyAtaXN5c3RlbSBiYXIgLS1zeXN0ZW0taGVhZGVyLXByZWZpeD14LyBcCisgICAgICAtLW5vLXN5c3RlbS1oZWFkZXItcHJlZml4PXgveS8KIAogSGVyZSwgYGAjaW5jbHVkZSAieC9hLmgiYGAgaXMgdHJlYXRlZCBhcyBpbmNsdWRpbmcgYSBzeXN0ZW0gaGVhZGVyLCBldmVuCiBpZiB0aGUgaGVhZGVyIGlzIGZvdW5kIGluIGBgZm9vYGAsIGFuZCBgYCNpbmNsdWRlICJ4L3kvYi5oImBgIGlzIHRyZWF0ZWQKQEAgLTcyNywxMSArNzI0LDEyIEBACiAKIC4uIF9kaWFnbm9zdGljc19lbmFibGVfZXZlcnl0aGluZzoKIAotRW5hYmxpbmcgQWxsIFdhcm5pbmdzCi1eXl5eXl5eXl5eXl5eXl5eXl5eXl4KK0VuYWJsaW5nIEFsbCBEaWFnbm9zdGljcworXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCiAKIEluIGFkZGl0aW9uIHRvIHRoZSB0cmFkaXRpb25hbCBgYC1XYGAgZmxhZ3MsIG9uZSBjYW4gZW5hYmxlICoqYWxsKioKLXdhcm5pbmdzIGJ5IHBhc3NpbmcgOm9wdGlvbjpgLVdldmVyeXRoaW5nYC4gVGhpcyB3b3JrcyBhcyBleHBlY3RlZCB3aXRoCitkaWFnbm9zdGljcyBieSBwYXNzaW5nIDpvcHRpb246YC1XZXZlcnl0aGluZ2AuIFRoaXMgd29ya3MgYXMgZXhwZWN0ZWQKK3dpdGgKIDpvcHRpb246YC1XZXJyb3JgLCBhbmQgYWxzbyBpbmNsdWRlcyB0aGUgd2FybmluZ3MgZnJvbSA6b3B0aW9uOmAtcGVkYW50aWNgLgogCiBOb3RlIHRoYXQgd2hlbiBjb21iaW5lZCB3aXRoIDpvcHRpb246YC13YCAod2hpY2ggZGlzYWJsZXMgYWxsIHdhcm5pbmdzKSwgdGhhdApAQCAtNzY1LDcgKzc2Myw3IEBACiBzb21lIG9mIHRoZSB3b3JrIG5lZWRlZCB0byBwcm9jZXNzIGEgY29ycmVzcG9uZGluZyBoZWFkZXIgZmlsZS4gV2hpbGUKIGRldGFpbHMgb2YgcHJlY29tcGlsZWQgaGVhZGVycyB2YXJ5IGJldHdlZW4gY29tcGlsZXJzLCBwcmVjb21waWxlZAogaGVhZGVycyBoYXZlIGJlZW4gc2hvd24gdG8gYmUgaGlnaGx5IGVmZmVjdGl2ZSBhdCBzcGVlZGluZyB1cCBwcm9ncmFtCi1jb21waWxhdGlvbiBvbiBzeXN0ZW1zIHdpdGggdmVyeSBsYXJnZSBzeXN0ZW0gaGVhZGVycyAoZS5nLiwgTWFjIE9TL1gpLgorY29tcGlsYXRpb24gb24gc3lzdGVtcyB3aXRoIHZlcnkgbGFyZ2Ugc3lzdGVtIGhlYWRlcnMgKGUuZy4sIE1hYyBPUyBYKS4KIAogR2VuZXJhdGluZyBhIFBDSCBGaWxlCiBeXl5eXl5eXl5eXl5eXl5eXl5eXl4KQEAgLTk3MSwxMiArOTY5LDE3IEBACiAgICBFeHRyYSBmZWF0dXJlcyBvZiBNZW1vcnlTYW5pdGl6ZXIgKHJlcXVpcmUgZXhwbGljaXQKICAgIGBgLWZzYW5pdGl6ZT1tZW1vcnlgYCk6CiAKLSAgIC0gIGBgLWZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2luc2BgOiBFbmFibGVzIG9yaWdpbiB0cmFja2luZyBpbgorICAgLSAgYGAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zWz1sZXZlbF1gYDogRW5hYmxlcyBvcmlnaW4gdHJhY2tpbmcgaW4KICAgICAgIE1lbW9yeVNhbml0aXplci4gQWRkcyBhIHNlY29uZCBzZWN0aW9uIHRvIE1lbW9yeVNhbml0aXplcgogICAgICAgcmVwb3J0cyBwb2ludGluZyB0byB0aGUgaGVhcCBvciBzdGFjayBhbGxvY2F0aW9uIHRoZQogICAgICAgdW5pbml0aWFsaXplZCBiaXRzIGNhbWUgZnJvbS4gU2xvd3MgZG93biBleGVjdXRpb24gYnkgYWRkaXRpb25hbAogICAgICAgMS41eC0yeC4KIAorICAgICAgUG9zc2libGUgdmFsdWVzIGZvciBsZXZlbCBhcmUgMCAob2ZmKSwgMSAoZGVmYXVsdCksIDIuIExldmVsIDIgYWRkcyBtb3JlCisgICAgICBzZWN0aW9ucyB0byBNZW1vcnlTYW5pdGl6ZXIgcmVwb3J0cyBkZXNjcmliaW5nIHRoZSBvcmRlciBvZiBtZW1vcnkgc3RvcmVzCisgICAgICB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZSB3ZW50IHRocm91Z2guIEJld2FyZSwgdGhpcyBtb2RlIG1heSB1c2UgYSBsb3Qgb2YKKyAgICAgIGV4dHJhIG1lbW9yeS4KKwogICAgRXh0cmEgZmVhdHVyZXMgb2YgVW5kZWZpbmVkQmVoYXZpb3JTYW5pdGl6ZXI6CiAKICAgIC0gIGBgLWZuby1zYW5pdGl6ZS1yZWNvdmVyYGA6IEJ5IGRlZmF1bHQsIGFmdGVyIGEgc2FuaXRpemVyIGRpYWdub3NlcwpAQCAtMTAwMiwxOCArMTAwNSw2IEBACiAgICBwcm9ncmFtLiBUaGUgYGAtZnNhbml0aXplPXVuZGVmaW5lZGBgIGNoZWNrcyBjYW4gYmUgY29tYmluZWQgd2l0aCBvdGhlcgogICAgc2FuaXRpemVycy4KIAotKiotZltuby1dYWRkcmVzcy1zYW5pdGl6ZXIqKgotICAgRGVwcmVjYXRlZCBzeW5vbnltIGZvciA6cmVmOmAtZltuby1dc2FuaXRpemU9YWRkcmVzcwotICAgPG9wdF9mc2FuaXRpemVfYWRkcmVzcz5gLgotKiotZltuby1ddGhyZWFkLXNhbml0aXplcioqCi0gICBEZXByZWNhdGVkIHN5bm9ueW0gZm9yIDpyZWY6YC1mW25vLV1zYW5pdGl6ZT10aHJlYWQKLSAgIDxvcHRfZnNhbml0aXplX3RocmVhZD5gLgotCi0uLiBvcHRpb246OiAtZmNhdGNoLXVuZGVmaW5lZC1iZWhhdmlvcgotCi0gICBEZXByZWNhdGVkIHN5bm9ueW0gZm9yIDpyZWY6YC1mc2FuaXRpemU9dW5kZWZpbmVkCi0gICA8b3B0X2ZzYW5pdGl6ZV91bmRlZmluZWQ+YC4KLQogLi4gb3B0aW9uOjogLWZuby1hc3N1bWUtc2FuZS1vcGVyYXRvci1uZXcKIAogICAgRG9uJ3QgYXNzdW1lIHRoYXQgdGhlIEMrKydzIG5ldyBvcGVyYXRvciBpcyBzYW5lLgpAQCAtMTA2Niw2ICsxMDU3LDEzIEBACiAKICAgIENSQyBpbnN0cnVjdGlvbnMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCBvbiBBUk12OC4KIAorLi4gb3B0aW9uOjogLW1nZW5lcmFsLXJlZ3Mtb25seQorCisgICBHZW5lcmF0ZSBjb2RlIHdoaWNoIG9ubHkgdXNlcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4KKworICAgVGhpcyBvcHRpb24gcmVzdHJpY3RzIHRoZSBnZW5lcmF0ZWQgY29kZSB0byB1c2UgZ2VuZXJhbCByZWdpc3RlcnMKKyAgIG9ubHkuIFRoaXMgb25seSBhcHBsaWVzIHRvIHRoZSBBQXJjaDY0IGFyY2hpdGVjdHVyZS4KKwogCiBDb250cm9sbGluZyBTaXplIG9mIERlYnVnIEluZm9ybWF0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDkxLDE4ICsxMDg5LDQzIEBACiAgIEdlbmVyYXRlIGNvbXBsZXRlIGRlYnVnIGluZm8uCiAKIENvbW1lbnQgUGFyc2luZyBPcHRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ2xhbmcgcGFyc2VzIERveHlnZW4gYW5kIG5vbi1Eb3h5Z2VuIHN0eWxlIGRvY3VtZW50YXRpb24gY29tbWVudHMgYW5kIGF0dGFjaGVzCiB0aGVtIHRvIHRoZSBhcHByb3ByaWF0ZSBkZWNsYXJhdGlvbiBub2Rlcy4gIEJ5IGRlZmF1bHQsIGl0IG9ubHkgcGFyc2VzCiBEb3h5Z2VuLXN0eWxlIGNvbW1lbnRzIGFuZCBpZ25vcmVzIG9yZGluYXJ5IGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGggYGAvL2BgIGFuZAogYGAvKmBgLgogCisuLiBvcHRpb246OiAtV2RvY3VtZW50YXRpb24KKworICBFbWl0IHdhcm5pbmdzIGFib3V0IHVzZSBvZiBkb2N1bWVudGF0aW9uIGNvbW1lbnRzLiAgVGhpcyB3YXJuaW5nIGdyb3VwIGlzIG9mZgorICBieSBkZWZhdWx0LgorCisgIFRoaXMgaW5jbHVkZXMgY2hlY2tpbmcgdGhhdCBgYFxwYXJhbWBgIGNvbW1hbmRzIG5hbWUgcGFyYW1ldGVycyB0aGF0IGFjdHVhbGx5CisgIHByZXNlbnQgaW4gdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSwgY2hlY2tpbmcgdGhhdCBgYFxyZXR1cm5zYGAgaXMgdXNlZCBvbmx5IG9uCisgIGZ1bmN0aW9ucyB0aGF0IGFjdHVhbGx5IHJldHVybiBhIHZhbHVlIGV0Yy4KKworLi4gb3B0aW9uOjogLVduby1kb2N1bWVudGF0aW9uLXVua25vd24tY29tbWFuZAorCisgIERvbid0IHdhcm4gd2hlbiBlbmNvdW50ZXJpbmcgYW4gdW5rbm93biBEb3h5Z2VuIGNvbW1hbmQuCisKIC4uIG9wdGlvbjo6IC1mcGFyc2UtYWxsLWNvbW1lbnRzCiAKICAgUGFyc2UgYWxsIGNvbW1lbnRzIGFzIGRvY3VtZW50YXRpb24gY29tbWVudHMgKGluY2x1ZGluZyBvcmRpbmFyeSBjb21tZW50cwogICBzdGFydGluZyB3aXRoIGBgLy9gYCBhbmQgYGAvKmBgKS4KIAorLi4gb3B0aW9uOjogLWZjb21tZW50LWJsb2NrLWNvbW1hbmRzPVtjb21tYW5kc10KKworICBEZWZpbmUgY3VzdG9tIGRvY3VtZW50YXRpb24gY29tbWFuZHMgYXMgYmxvY2sgY29tbWFuZHMuICBUaGlzIGFsbG93cyBDbGFuZyB0bworICBjb25zdHJ1Y3QgdGhlIGNvcnJlY3QgQVNUIGZvciB0aGVzZSBjdXN0b20gY29tbWFuZHMsIGFuZCBzaWxlbmNlcyB3YXJuaW5ncworICBhYm91dCB1bmtub3duIGNvbW1hbmRzLiAgU2V2ZXJhbCBjb21tYW5kcyBtdXN0IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hCisgICp3aXRob3V0IHRyYWlsaW5nIHNwYWNlKjsgZS5nLiBgYC1mY29tbWVudC1ibG9jay1jb21tYW5kcz1mb28sYmFyYGAgZGVmaW5lcworICBjdXN0b20gY29tbWFuZHMgYGBcZm9vYGAgYW5kIGBgXGJhcmBgLgorCisgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIGBgLWZjb21tZW50LWJsb2NrLWNvbW1hbmRzYGAgc2V2ZXJhbCB0aW1lczsgZS5nLgorICBgYC1mY29tbWVudC1ibG9jay1jb21tYW5kcz1mb28gLWZjb21tZW50LWJsb2NrLWNvbW1hbmRzPWJhcmBgIGRvZXMgdGhlIHNhbWUKKyAgYXMgYWJvdmUuCisKIC4uIF9jOgogCiBDIExhbmd1YWdlIEZlYXR1cmVzCkBAIC0xMzI5LDE0ICsxMzUyLDIxIEBACiBeXl4KIAogVGhlIHN1cHBvcnQgZm9yIFg4NiAoYm90aCAzMi1iaXQgYW5kIDY0LWJpdCkgaXMgY29uc2lkZXJlZCBzdGFibGUgb24KLURhcndpbiAoTWFjIE9TL1gpLCBMaW51eCwgRnJlZUJTRCwgYW5kIERyYWdvbmZseSBCU0Q6IGl0IGhhcyBiZWVuIHRlc3RlZAorRGFyd2luIChNYWMgT1MgWCksIExpbnV4LCBGcmVlQlNELCBhbmQgRHJhZ29uZmx5IEJTRDogaXQgaGFzIGJlZW4gdGVzdGVkCiB0byBjb3JyZWN0bHkgY29tcGlsZSBtYW55IGxhcmdlIEMsIEMrKywgT2JqZWN0aXZlLUMsIGFuZCBPYmplY3RpdmUtQysrCiBjb2RlYmFzZXMuCiAKIE9uIGBgeDg2XzY0LW1pbmd3MzJgYCwgcGFzc2luZyBpMTI4KGJ5IHZhbHVlKSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLU1pY3Jvc29mdCB4NjQgY2FsbGluZyBjb252ZXJzaW9uLiBZb3UgbWlnaHQgbmVlZCB0byB0d2VhaworTWljcm9zb2Z0IHg2NCBjYWxsaW5nIGNvbnZlbnRpb24uIFlvdSBtaWdodCBuZWVkIHRvIHR3ZWFrCiBgYFdpblg4Nl82NEFCSUluZm86OmNsYXNzaWZ5KClgYCBpbiBsaWIvQ29kZUdlbi9UYXJnZXRJbmZvLmNwcC4KIAorRm9yIHRoZSBYODYgdGFyZ2V0LCBjbGFuZyBzdXBwb3J0cyB0aGUgOm9wdGlvbjpgLW0xNmAgY29tbWFuZCBsaW5lCithcmd1bWVudCB3aGljaCBlbmFibGVzIDE2LWJpdCBjb2RlIG91dHB1dC4gVGhpcyBpcyBicm9hZGx5IHNpbWlsYXIgdG8KK3VzaW5nIGBgYXNtKCIuY29kZTE2Z2NjIilgYCB3aXRoIHRoZSBHTlUgdG9vbGNoYWluLiBUaGUgZ2VuZXJhdGVkIGNvZGUKK2FuZCB0aGUgQUJJIHJlbWFpbnMgMzItYml0IGJ1dCB0aGUgYXNzZW1ibGVyIGVtaXRzIGluc3RydWN0aW9ucworYXBwcm9wcmlhdGUgZm9yIGEgQ1BVIHJ1bm5pbmcgaW4gMTYtYml0IG1vZGUsIHdpdGggYWRkcmVzcy1zaXplIGFuZAorb3BlcmFuZC1zaXplIHByZWZpeGVzIHRvIGVuYWJsZSAzMi1iaXQgYWRkcmVzc2luZyBhbmQgb3BlcmF0aW9ucy4KKwogQVJNCiBeXl4KIApAQCAtMTM3NywxMCArMTQwNywxMCBAQAogT3BlcmF0aW5nIFN5c3RlbSBGZWF0dXJlcyBhbmQgTGltaXRhdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLURhcndpbiAoTWFjIE9TL1gpCitEYXJ3aW4gKE1hYyBPUyBYKQogXl5eXl5eXl5eXl5eXl5eXl4KIAotTm9uZQorVGhyZWFkIFNhbml0aXplciBpcyBub3Qgc3VwcG9ydGVkLgogCiBXaW5kb3dzCiBeXl5eXl5eCmRpZmYgLS1naXQgYS9kb2NzL2FuYWx5emVyL2NvbmYucHkgYi9kb2NzL2FuYWx5emVyL2NvbmYucHkKaW5kZXggMzY5MGY5My4uMTUxNDcwOCAxMDA2NDQKLS0tIGEvZG9jcy9hbmFseXplci9jb25mLnB5CisrKyBiL2RvY3MvYW5hbHl6ZXIvY29uZi5weQpAQCAtNDEsNyArNDEsNyBAQAogCiAjIEdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2plY3QuCiBwcm9qZWN0ID0gdSdDbGFuZyBTdGF0aWMgQW5hbHl6ZXInCi1jb3B5cmlnaHQgPSB1JzIwMTMsIEFuYWx5emVyIFRlYW0nCitjb3B5cmlnaHQgPSB1JzIwMTMtMjAxNCwgQW5hbHl6ZXIgVGVhbScKIAogIyBUaGUgdmVyc2lvbiBpbmZvIGZvciB0aGUgcHJvamVjdCB5b3UncmUgZG9jdW1lbnRpbmcsIGFjdHMgYXMgcmVwbGFjZW1lbnQgZm9yCiAjIHx2ZXJzaW9ufCBhbmQgfHJlbGVhc2V8LCBhbHNvIHVzZWQgaW4gdmFyaW91cyBvdGhlciBwbGFjZXMgdGhyb3VnaG91dCB0aGUKZGlmZiAtLWdpdCBhL2RvY3MvY29uZi5weSBiL2RvY3MvY29uZi5weQppbmRleCAxODNhMjg1Li4xOTYzYTA1IDEwMDY0NAotLS0gYS9kb2NzL2NvbmYucHkKKysrIGIvZG9jcy9jb25mLnB5CkBAIC00MSwxNiArNDEsMTYgQEAKIAogIyBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9qZWN0LgogcHJvamVjdCA9IHUnQ2xhbmcnCi1jb3B5cmlnaHQgPSB1JzIwMDctMjAxMywgVGhlIENsYW5nIFRlYW0nCitjb3B5cmlnaHQgPSB1JzIwMDctMjAxNCwgVGhlIENsYW5nIFRlYW0nCiAKICMgVGhlIHZlcnNpb24gaW5mbyBmb3IgdGhlIHByb2plY3QgeW91J3JlIGRvY3VtZW50aW5nLCBhY3RzIGFzIHJlcGxhY2VtZW50IGZvcgogIyB8dmVyc2lvbnwgYW5kIHxyZWxlYXNlfCwgYWxzbyB1c2VkIGluIHZhcmlvdXMgb3RoZXIgcGxhY2VzIHRocm91Z2hvdXQgdGhlCiAjIGJ1aWx0IGRvY3VtZW50cy4KICMKICMgVGhlIHNob3J0IFguWSB2ZXJzaW9uLgotdmVyc2lvbiA9ICczLjQnCit2ZXJzaW9uID0gJzMuNScKICMgVGhlIGZ1bGwgdmVyc2lvbiwgaW5jbHVkaW5nIGFscGhhL2JldGEvcmMgdGFncy4KLXJlbGVhc2UgPSAnMy40JworcmVsZWFzZSA9ICczLjUnCiAKICMgVGhlIGxhbmd1YWdlIGZvciBjb250ZW50IGF1dG9nZW5lcmF0ZWQgYnkgU3BoaW54LiBSZWZlciB0byBkb2N1bWVudGF0aW9uCiAjIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGxhbmd1YWdlcy4KZGlmZiAtLWdpdCBhL2RvY3MvZG94eWdlbi5jZmcuaW4gYi9kb2NzL2RveHlnZW4uY2ZnLmluCmluZGV4IDYxYzBiZDguLjIzNzJlMDQgMTAwNjQ0Ci0tLSBhL2RvY3MvZG94eWdlbi5jZmcuaW4KKysrIGIvZG9jcy9kb3h5Z2VuLmNmZy5pbgpAQCAtNjk3LDYgKzY5Nyw1OSBAQAogCiBUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KIAorIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kIAorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIAorIyB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEgCisjIFF0IENvbXByZXNzZWQgSGVscCAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBAY2xhbmdfZG94eWdlbl9nZW5lcmF0ZV9xaHBACisKKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbiAKKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuIAorIyBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8gdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4KKworUUNIX0ZJTEUgICAgICAgICAgICAgICA9IEBjbGFuZ19kb3h5Z2VuX3FjaF9maWxlbmFtZUAKKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyAKKyMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSAKKyMgaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI25hbWVzcGFjZQorCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gQGNsYW5nX2RveHlnZW5fcWhwX25hbWVzcGFjZUAKKworIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIAorIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIAorIyBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC1mb2xkZXJzCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiBRSFBfQ1VTVF9GSUxURVJfTkFNRSBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbSBmaWx0ZXIgdG8gCisjIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSAKKyMgaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzCisKK1FIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPSBAY2xhbmdfZG94eWdlbl9xaHBfY3VzdF9maWx0ZXJfbmFtZUAKKworIyBUaGUgUUhQX0NVU1RfRklMVF9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSAKKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgCisjIDxhIGhyZWY9Imh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycyI+IAorIyBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20gRmlsdGVyczwvYT4uCisKK1FIUF9DVVNUX0ZJTFRFUl9BVFRSUyAgPSBAY2xhbmdfZG94eWdlbl9xaHBfY3VzdF9maWx0ZXJfYXR0cnNACisKKyMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMgCisjIHByb2plY3QncyAKKyMgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4gCisjIDxhIGhyZWY9Imh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcyI+IAorIyBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlczwvYT4uCisKK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4gCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncyBxaGVscGdlbmVyYXRvci4gCisjIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUgZ2VuZXJhdGVkIAorIyAucWhwIGZpbGUuCisKK1FIR19MT0NBVElPTiAgICAgICAgICAgPSBAY2xhbmdfZG94eWdlbl9xaGVscGdlbmVyYXRvcl9wYXRoQAorCiAjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4IGF0IAogIyB0b3Agb2YgZWFjaCBIVE1MIHBhZ2UuIFRoZSB2YWx1ZSBOTyAodGhlIGRlZmF1bHQpIGVuYWJsZXMgdGhlIGluZGV4IGFuZCAKICMgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcyBpdC4KZGlmZiAtLWdpdCBhL2RvY3MvaW5kZXgucnN0IGIvZG9jcy9pbmRleC5yc3QKaW5kZXggYjE4ZGViOS4uYmYyZGU3ZSAxMDA2NDQKLS0tIGEvZG9jcy9pbmRleC5yc3QKKysrIGIvZG9jcy9pbmRleC5yc3QKQEAgLTE4LDcgKzE4LDkgQEAKIAogICAgVXNlcnNNYW51YWwKICAgIExhbmd1YWdlRXh0ZW5zaW9ucworICAgQXR0cmlidXRlUmVmZXJlbmNlCiAgICBDcm9zc0NvbXBpbGF0aW9uCisgICBUaHJlYWRTYWZldHlBbmFseXNpcwogICAgQWRkcmVzc1Nhbml0aXplcgogICAgVGhyZWFkU2FuaXRpemVyCiAgICBNZW1vcnlTYW5pdGl6ZXIKQEAgLTI2LDYgKzI4LDcgQEAKICAgIExlYWtTYW5pdGl6ZXIKICAgIFNhbml0aXplclNwZWNpYWxDYXNlTGlzdAogICAgTW9kdWxlcworICAgTVNWQ0NvbXBhdGliaWxpdHkKICAgIEZBUQogCiBVc2luZyBDbGFuZyBhcyBhIExpYnJhcnkKZGlmZiAtLWdpdCBhL2RvY3MvdG9vbHMvY2xhbmcucG9kIGIvZG9jcy90b29scy9jbGFuZy5wb2QKaW5kZXggYTU4OTg2Yy4uNmNjZGJiYSAxMDA2NDQKLS0tIGEvZG9jcy90b29scy9jbGFuZy5wb2QKKysrIGIvZG9jcy90b29scy9jbGFuZy5wb2QKQEAgLTIzNyw3ICsyMzcsNyBAQAogCiA9aXRlbSBCPC1tbWFjb3N4LXZlcnNpb24tbWluPj1JPHZlcnNpb24+CiAKLVdoZW4gYnVpbGRpbmcgZm9yIE1hYyBPUy9YLCBzcGVjaWZ5IHRoZSBtaW5pbXVtIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHlvdXIKK1doZW4gYnVpbGRpbmcgZm9yIE1hYyBPUyBYLCBzcGVjaWZ5IHRoZSBtaW5pbXVtIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHlvdXIKIGFwcGxpY2F0aW9uLgogCiA9aXRlbSBCPC1taXBob25lb3MtdmVyc2lvbi1taW4+CkBAIC0zMTAsOCArMzEwLDIyIEBACiA9aXRlbSBCPC1nPgogCiBHZW5lcmF0ZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCBDbGFuZyBkZWJ1ZyBpbmZvcm1hdGlvbiB3b3JrcyBiZXN0IGF0Ci1CPC1PMD4uICBBdCBoaWdoZXIgb3B0aW1pemF0aW9uIGxldmVscywgb25seSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpcwotY3VycmVudGx5IGF2YWlsYWJsZS4KK0I8LU8wPi4KKworPWl0ZW0gQjwtZnN0YW5kYWxvbmUtZGVidWc+IEI8LWZuby1zdGFuZGFsb25lLWRlYnVnPgorCitDbGFuZyBzdXBwb3J0cyBhIG51bWJlciBvZiBvcHRpbWl6YXRpb25zIHRvIHJlZHVjZSB0aGUgc2l6ZSBvZiBkZWJ1ZworaW5mb3JtYXRpb24gaW4gdGhlIGJpbmFyeS4gVGhleSB3b3JrIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlCitkZWJ1ZyB0eXBlIGluZm9ybWF0aW9uIGNhbiBiZSBzcHJlYWQgb3V0IG92ZXIgbXVsdGlwbGUgY29tcGlsYXRpb24KK3VuaXRzLiAgRm9yIGluc3RhbmNlLCBDbGFuZyB3aWxsIG5vdCBlbWl0IHR5cGUgZGVmaW5pdGlvbnMgZm9yIHR5cGVzCit0aGF0IGFyZSBub3QgbmVlZGVkIGJ5IGEgbW9kdWxlIGFuZCBjb3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgZm9yd2FyZAorZGVjbGFyYXRpb24uICBGdXJ0aGVyLCBDbGFuZyB3aWxsIG9ubHkgZW1pdCB0eXBlIGluZm8gZm9yIGEgZHluYW1pYworQysrIGNsYXNzIGluIHRoZSBtb2R1bGUgdGhhdCBjb250YWlucyB0aGUgdnRhYmxlIGZvciB0aGUgY2xhc3MuCisKK1RoZSBCPC1mc3RhbmRhbG9uZS1kZWJ1Zz4gb3B0aW9uIHR1cm5zIG9mZiB0aGVzZSBvcHRpbWl6YXRpb25zLiAgVGhpcworaXMgdXNlZnVsIHdoZW4gd29ya2luZyB3aXRoIDNyZC1wYXJ0eSBsaWJyYXJpZXMgdGhhdCBkb24ndCBjb21lIHdpdGgKK2RlYnVnIGluZm9ybWF0aW9uLiAgTm90ZSB0aGF0IENsYW5nIHdpbGwgbmV2ZXIgZW1pdCB0eXBlIGluZm9ybWF0aW9uCitmb3IgdHlwZXMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgYXQgYWxsIGJ5IHRoZSBwcm9ncmFtLgogCiA9aXRlbSBCPC1mZXhjZXB0aW9ucz4KIApAQCAtMzY2LDcgKzM4MCw3IEBACiAKID1pdGVtIEI8LSMjIz4KIAotUHJpbnQgdGhlIGNvbW1hbmRzIHRvIHJ1biBmb3IgdGhpcyBjb21waWxhdGlvbi4KK1ByaW50IChidXQgZG8gbm90IHJ1bikgdGhlIGNvbW1hbmRzIHRvIHJ1biBmb3IgdGhpcyBjb21waWxhdGlvbi4KIAogPWl0ZW0gQjwtLWhlbHA+CiAKZGlmZiAtLWdpdCBhL2RvY3MvdG9vbHMvZHVtcF9hc3RfbWF0Y2hlcnMucHkgYi9kb2NzL3Rvb2xzL2R1bXBfYXN0X21hdGNoZXJzLnB5CmluZGV4IDU2NGRjMzguLjRlY2U0NmEgMTAwNjQ0Ci0tLSBhL2RvY3MvdG9vbHMvZHVtcF9hc3RfbWF0Y2hlcnMucHkKKysrIGIvZG9jcy90b29scy9kdW1wX2FzdF9tYXRjaGVycy5weQpAQCAtMTE5LDkgKzExOSw5IEBACiAgICMgYXJndW1lbnRzLgogICBlbGlmICgnTWF0Y2hlcjwnIG5vdCBpbiBhcmdzIG9yCiAgICAgICAgIG5hbWUgaW4gWydhbGxPZicsICdhbnlPZicsICdhbnl0aGluZycsICd1bmxlc3MnXSk6Ci0gICAgbmFycm93aW5nX21hdGNoZXJzW3Jlc3VsdF90eXBlICsgbmFtZV0gPSBtYXRjaGVyX2h0bWwKKyAgICBuYXJyb3dpbmdfbWF0Y2hlcnNbcmVzdWx0X3R5cGUgKyBuYW1lICsgZXNjKGFyZ3MpXSA9IG1hdGNoZXJfaHRtbAogICBlbHNlOgotICAgIHRyYXZlcnNhbF9tYXRjaGVyc1tyZXN1bHRfdHlwZSArIG5hbWVdID0gbWF0Y2hlcl9odG1sCisgICAgdHJhdmVyc2FsX21hdGNoZXJzW3Jlc3VsdF90eXBlICsgbmFtZSArIGVzYyhhcmdzKV0gPSBtYXRjaGVyX2h0bWwKIAogZGVmIGFjdF9vbl9kZWNsKGRlY2xhcmF0aW9uLCBjb21tZW50LCBhbGxvd2VkX3R5cGVzKToKICAgIiIiUGFyc2UgdGhlIG1hdGNoZXIgb3V0IG9mIHRoZSBnaXZlbiBkZWNsYXJhdGlvbiBhbmQgY29tbWVudC4KQEAgLTIwNCw2ICsyMDQsMjUgQEAKICAgICAgICAgYWRkX21hdGNoZXIocmVzdWx0X3R5cGUsIG5hbWUsIGFyZ3MsIGNvbW1lbnQpCiAgICAgICByZXR1cm4KIAorICAgIG0gPSByZS5tYXRjaChyIiIiXlxzKkFTVF9NQVRDSEVSX0ZVTkNUSU9OKF9QKT8oLj8pKD86X09WRVJMT0FEKT9cKAorICAgICAgICAgICAgICAgICAgICAgICAoPzpccyooW15ccyxdKylccyosKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqKFteXHMsXSspXHMqCisgICAgICAgICAgICAgICAgICAgICAgICg/OixccyooW15ccyxdKylccyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLFxzKihbXlxzLF0rKVxzKik/CisgICAgICAgICAgICAgICAgICAgICAgICg/OixccyooW15ccyxdKylccyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLFxzKihbXlxzLF0rKVxzKik/CisgICAgICAgICAgICAgICAgICAgICAgICg/OixccypcZCtccyopPworICAgICAgICAgICAgICAgICAgICAgIFwpXHMqe1xzKiQiIiIsIGRlY2xhcmF0aW9uLCBmbGFncz1yZS5YKQorICAgIGlmIG06CisgICAgICBwLCBuLCByZXN1bHQsIG5hbWUgPSBtLmdyb3VwcygpWzA6NF0KKyAgICAgIGFyZ3MgPSBtLmdyb3VwcygpWzQ6XQorICAgICAgaWYgbiBub3QgaW4gWycnLCAnMiddOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oJ0Nhbm5vdCBwYXJzZSAiJXMiJyAlIGRlY2xhcmF0aW9uKQorICAgICAgYXJncyA9ICcsICcuam9pbignJXMgJXMnICUgKGFyZ3NbaV0sIGFyZ3NbaSsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGFyZ3MpLCAyKSBpZiBhcmdzW2ldKQorICAgICAgYWRkX21hdGNoZXIocmVzdWx0LCBuYW1lLCBhcmdzLCBjb21tZW50KQorICAgICAgcmV0dXJuCisKICAgICBtID0gcmUubWF0Y2gociIiIl5ccypBU1RfTUFUQ0hFUihfUCk/KC4/KSg/Ol9PVkVSTE9BRCk/XCgKICAgICAgICAgICAgICAgICAgICAgICAgKD86XHMqKFteXHMsXSspXHMqLCk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxzKihbXlxzLF0rKVxzKgpAQCAtMjQyLDEyICsyNjEsMTcgQEAKIAogICAgICMgUGFyc2UgVmFyaWFkaWMgb3BlcmF0b3IgbWF0Y2hlcnMuCiAgICAgbSA9IHJlLm1hdGNoKAotICAgICAgICByIiIiXi4qVmFyaWFkaWNPcGVyYXRvck1hdGNoZXJGdW5jXHMqKFthLXpBLVpdKilccyo9XHMqey4qfTskIiIiLAorICAgICAgICByIiIiXi4qVmFyaWFkaWNPcGVyYXRvck1hdGNoZXJGdW5jXHMqPFxzKihbXixdKyksXHMqKFteXHM+XSspXHMqPlxzKgorICAgICAgICAgICAgICAoW2EtekEtWl0qKVxzKj1ccyp7Lip9OyQiIiIsCiAgICAgICAgIGRlY2xhcmF0aW9uLCBmbGFncz1yZS5YKQogICAgIGlmIG06Ci0gICAgICBuYW1lID0gbS5ncm91cHMoKVswXQotICAgICAgYWRkX21hdGNoZXIoJyonLCBuYW1lLCAnTWF0Y2hlcjwqPiwgLi4uLCBNYXRjaGVyPCo+JywgY29tbWVudCkKLSAgICAgIHJldHVybgorICAgICAgbWluX2FyZ3MsIG1heF9hcmdzLCBuYW1lID0gbS5ncm91cHMoKVs6M10KKyAgICAgIGlmIG1heF9hcmdzID09ICcxJzoKKyAgICAgICAgYWRkX21hdGNoZXIoJyonLCBuYW1lLCAnTWF0Y2hlcjwqPicsIGNvbW1lbnQpCisgICAgICAgIHJldHVybgorICAgICAgZWxpZiBtYXhfYXJncyA9PSAnVUlOVF9NQVgnOgorICAgICAgICBhZGRfbWF0Y2hlcignKicsIG5hbWUsICdNYXRjaGVyPCo+LCAuLi4sIE1hdGNoZXI8Kj4nLCBjb21tZW50KQorICAgICAgICByZXR1cm4KIAogCiAgICAgIyBQYXJzZSBmcmVlIHN0YW5kaW5nIG1hdGNoZXIgZnVuY3Rpb25zLCBsaWtlOgpkaWZmIC0tZ2l0IGEvZG9jcy90b29scy9kdW1wX2Zvcm1hdF9zdHlsZS5weSBiL2RvY3MvdG9vbHMvZHVtcF9mb3JtYXRfc3R5bGUucHkKaW5kZXggMGM4Y2E2ZC4uYWRkZGEyYSAxMDA2NDQKLS0tIGEvZG9jcy90b29scy9kdW1wX2Zvcm1hdF9zdHlsZS5weQorKysgYi9kb2NzL3Rvb2xzL2R1bXBfZm9ybWF0X3N0eWxlLnB5CkBAIC05OCw3ICs5OCw3IEBACiAgICAgICAgIGVudW0gPSBFbnVtKG5hbWUsIGNvbW1lbnQpCiAgICAgICBlbGlmIGxpbmUuZW5kc3dpdGgoJzsnKToKICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JblN0cnVjdAotICAgICAgICBmaWVsZF90eXBlLCBmaWVsZF9uYW1lID0gcmUubWF0Y2gocicoXHcrKVxzKyhcdyspOycsIGxpbmUpLmdyb3VwcygpCisgICAgICAgIGZpZWxkX3R5cGUsIGZpZWxkX25hbWUgPSByZS5tYXRjaChyJyhbOlx3XSspXHMrKFx3Kyk7JywgbGluZSkuZ3JvdXBzKCkKICAgICAgICAgb3B0aW9uID0gT3B0aW9uKHN0cihmaWVsZF9uYW1lKSwgc3RyKGZpZWxkX3R5cGUpLCBjb21tZW50KQogICAgICAgICBvcHRpb25zLmFwcGVuZChvcHRpb24pCiAgICAgICBlbHNlOgpAQCAtMTIyLDcgKzEyMiw3IEBACiAgICAgcmFpc2UgRXhjZXB0aW9uKCdOb3QgZmluaXNoZWQgYnkgdGhlIGVuZCBvZiBmaWxlJykKIAogICBmb3Igb3B0aW9uIGluIG9wdGlvbnM6Ci0gICAgaWYgbm90IG9wdGlvbi50eXBlIGluIFsnYm9vbCcsICd1bnNpZ25lZCcsICdpbnQnXToKKyAgICBpZiBub3Qgb3B0aW9uLnR5cGUgaW4gWydib29sJywgJ3Vuc2lnbmVkJywgJ2ludCcsICdzdGQ6OnN0cmluZyddOgogICAgICAgaWYgZW51bXMuaGFzX2tleShvcHRpb24udHlwZSk6CiAgICAgICAgIG9wdGlvbi5lbnVtID0gZW51bXNbb3B0aW9uLnR5cGVdCiAgICAgICBlbHNlOgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvQ01ha2VMaXN0cy50eHQgYi9leGFtcGxlcy9DTWFrZUxpc3RzLnR4dAppbmRleCA4NGE1ZDJjLi41ZDRiNWZjIDEwMDY0NAotLS0gYS9leGFtcGxlcy9DTWFrZUxpc3RzLnR4dAorKysgYi9leGFtcGxlcy9DTWFrZUxpc3RzLnR4dApAQCAtMSw3ICsxLDEwIEBACiBpZihOT1QgQ0xBTkdfQlVJTERfRVhBTVBMRVMpCiAgIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgUFJPUEVSVFkgRVhDTFVERV9GUk9NX0FMTCBPTikKKyAgc2V0KEVYQ0xVREVfRlJPTV9BTEwgT04pCiBlbmRpZigpCiAKK2lmKENMQU5HX0VOQUJMRV9TVEFUSUNfQU5BTFlaRVIpCiBhZGRfc3ViZGlyZWN0b3J5KGFuYWx5emVyLXBsdWdpbikKK2VuZGlmKCkKIGFkZF9zdWJkaXJlY3RvcnkoY2xhbmctaW50ZXJwcmV0ZXIpCiBhZGRfc3ViZGlyZWN0b3J5KFByaW50RnVuY3Rpb25OYW1lcykKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL1ByaW50RnVuY3Rpb25OYW1lcy9DTWFrZUxpc3RzLnR4dCBiL2V4YW1wbGVzL1ByaW50RnVuY3Rpb25OYW1lcy9DTWFrZUxpc3RzLnR4dAppbmRleCBiYTZhMzUwLi44NzZiNWRhIDEwMDY0NAotLS0gYS9leGFtcGxlcy9QcmludEZ1bmN0aW9uTmFtZXMvQ01ha2VMaXN0cy50eHQKKysrIGIvZXhhbXBsZXMvUHJpbnRGdW5jdGlvbk5hbWVzL0NNYWtlTGlzdHMudHh0CkBAIC0xLDI0ICsxLDEyIEBACi1zZXQoTU9EVUxFIFRSVUUpCisjIElmIHdlIGRvbid0IG5lZWQgUlRUSSBvciBFSCwgdGhlcmUncyBubyByZWFzb24gdG8gZXhwb3J0IGFueXRoaW5nCisjIGZyb20gdGhlIHBsdWdpbi4KK2lmKCBOT1QgV0lOMzIgKSAjIFdpbjMyIG1hbmdsZXMgc3ltYm9scyBkaWZmZXJlbnRseSwgYW5kCisgICAgICAgICAgICAgICAgIyBQcmludEZ1bmN0aW9uTmFtZXMuZXhwb3J0IGNvbnRhaW5zIEMrKyBzeW1ib2xzLgorICBpZiggTk9UIExMVk1fUkVRVUlSRVNfUlRUSSApCisgICAgaWYoIE5PVCBMTFZNX1JFUVVJUkVTX0VIICkKKyAgICAgIHNldChMTFZNX0VYUE9SVEVEX1NZTUJPTF9GSUxFICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9QcmludEZ1bmN0aW9uTmFtZXMuZXhwb3J0cykKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKK2VuZGlmKCkKIAotc2V0KCBMTFZNX0xJTktfQ09NUE9ORU5UUyBzdXBwb3J0IG1jKQotCi1hZGRfY2xhbmdfbGlicmFyeShQcmludEZ1bmN0aW9uTmFtZXMgUHJpbnRGdW5jdGlvbk5hbWVzLmNwcCkKLQotYWRkX2RlcGVuZGVuY2llcyhQcmludEZ1bmN0aW9uTmFtZXMKLSAgQ2xhbmdBdHRyQ2xhc3NlcwotICBDbGFuZ0F0dHJMaXN0Ci0gIENsYW5nQ29tbWVudE5vZGVzCi0gIENsYW5nRGVjbE5vZGVzCi0gIENsYW5nRGlhZ25vc3RpY0NvbW1vbgotICBDbGFuZ1N0bXROb2RlcwotICApCi0KLXRhcmdldF9saW5rX2xpYnJhcmllcyhQcmludEZ1bmN0aW9uTmFtZXMKLSAgY2xhbmdGcm9udGVuZAotICBjbGFuZ0FTVAotICApCi0KLXNldF90YXJnZXRfcHJvcGVydGllcyhQcmludEZ1bmN0aW9uTmFtZXMKLSAgUFJPUEVSVElFUwotICBMSU5LRVJfTEFOR1VBR0UgQ1hYCi0gIFBSRUZJWCAiIikKK2FkZF9sbHZtX2xvYWRhYmxlX21vZHVsZShQcmludEZ1bmN0aW9uTmFtZXMgUHJpbnRGdW5jdGlvbk5hbWVzLmNwcCkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL1ByaW50RnVuY3Rpb25OYW1lcy9NYWtlZmlsZSBiL2V4YW1wbGVzL1ByaW50RnVuY3Rpb25OYW1lcy9NYWtlZmlsZQppbmRleCAyM2E1MzA1Li41ODY1MDk4IDEwMDY0NAotLS0gYS9leGFtcGxlcy9QcmludEZ1bmN0aW9uTmFtZXMvTWFrZWZpbGUKKysrIGIvZXhhbXBsZXMvUHJpbnRGdW5jdGlvbk5hbWVzL01ha2VmaWxlCkBAIC0xOSw3ICsxOSw3IEBACiBlbmRpZgogCiBMSU5LX0xJQlNfSU5fU0hBUkVEID0gMAotU0hBUkVEX0xJQlJBUlkgPSAxCitMT0FEQUJMRV9NT0RVTEUgPSAxCiAKIGluY2x1ZGUgJChDTEFOR19MRVZFTCkvTWFrZWZpbGUKIApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvUHJpbnRGdW5jdGlvbk5hbWVzL1ByaW50RnVuY3Rpb25OYW1lcy5jcHAgYi9leGFtcGxlcy9QcmludEZ1bmN0aW9uTmFtZXMvUHJpbnRGdW5jdGlvbk5hbWVzLmNwcAppbmRleCBmNmU3NWNjLi4zZjE4Y2Q0IDEwMDY0NAotLS0gYS9leGFtcGxlcy9QcmludEZ1bmN0aW9uTmFtZXMvUHJpbnRGdW5jdGlvbk5hbWVzLmNwcAorKysgYi9leGFtcGxlcy9QcmludEZ1bmN0aW9uTmFtZXMvUHJpbnRGdW5jdGlvbk5hbWVzLmNwcApAQCAtNDgsOSArNDgsOSBAQAogICAgICAgLy8gRXhhbXBsZSBlcnJvciBoYW5kbGluZy4KICAgICAgIGlmIChhcmdzW2ldID09ICItYW4tZXJyb3IiKSB7CiAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEID0gQ0kuZ2V0RGlhZ25vc3RpY3MoKTsKLSAgICAgICAgdW5zaWduZWQgRGlhZ0lEID0gRC5nZXRDdXN0b21EaWFnSUQoCi0gICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkVycm9yLCAiaW52YWxpZCBhcmd1bWVudCAnIiArIGFyZ3NbaV0gKyAiJyIpOwotICAgICAgICBELlJlcG9ydChEaWFnSUQpOworICAgICAgICB1bnNpZ25lZCBEaWFnSUQgPSBELmdldEN1c3RvbURpYWdJRChEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGFyZ3VtZW50ICclMCciKTsKKyAgICAgICAgRC5SZXBvcnQoRGlhZ0lEKSA8PCBhcmdzW2ldOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYW5hbHl6ZXItcGx1Z2luL0NNYWtlTGlzdHMudHh0IGIvZXhhbXBsZXMvYW5hbHl6ZXItcGx1Z2luL0NNYWtlTGlzdHMudHh0CmluZGV4IGJhNzMwMzAuLmIyYTIwZTEgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL2FuYWx5emVyLXBsdWdpbi9DTWFrZUxpc3RzLnR4dAorKysgYi9leGFtcGxlcy9hbmFseXplci1wbHVnaW4vQ01ha2VMaXN0cy50eHQKQEAgLTEsMjMgKzEgQEAKLXNldChNT0RVTEUgVFJVRSkKLQotc2V0KCBMTFZNX0xJTktfQ09NUE9ORU5UUyBzdXBwb3J0IG1jKQotCi1hZGRfY2xhbmdfbGlicmFyeShTYW1wbGVBbmFseXplclBsdWdpbiBNYWluQ2FsbENoZWNrZXIuY3BwKQotCi1hZGRfZGVwZW5kZW5jaWVzKFNhbXBsZUFuYWx5emVyUGx1Z2luCi0gIENsYW5nQXR0ckNsYXNzZXMKLSAgQ2xhbmdBdHRyTGlzdAotICBDbGFuZ0NvbW1lbnROb2RlcwotICBDbGFuZ0RlY2xOb2RlcwotICBDbGFuZ0RpYWdub3N0aWNDb21tb24KLSAgQ2xhbmdTdG10Tm9kZXMKLSAgKQotCi10YXJnZXRfbGlua19saWJyYXJpZXMoU2FtcGxlQW5hbHl6ZXJQbHVnaW4KLSAgY2xhbmdTdGF0aWNBbmFseXplckNvcmUKLSAgKQotCi1zZXRfdGFyZ2V0X3Byb3BlcnRpZXMoU2FtcGxlQW5hbHl6ZXJQbHVnaW4KLSAgUFJPUEVSVElFUwotICBMSU5LRVJfTEFOR1VBR0UgQ1hYCi0gIFBSRUZJWCAiIikKK2FkZF9sbHZtX2xvYWRhYmxlX21vZHVsZShTYW1wbGVBbmFseXplclBsdWdpbiBNYWluQ2FsbENoZWNrZXIuY3BwKQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYW5hbHl6ZXItcGx1Z2luL01haW5DYWxsQ2hlY2tlci5jcHAgYi9leGFtcGxlcy9hbmFseXplci1wbHVnaW4vTWFpbkNhbGxDaGVja2VyLmNwcAppbmRleCA4ODAxZjlhLi4yYWQ4Yzg0IDEwMDY0NAotLS0gYS9leGFtcGxlcy9hbmFseXplci1wbHVnaW4vTWFpbkNhbGxDaGVja2VyLmNwcAorKysgYi9leGFtcGxlcy9hbmFseXplci1wbHVnaW4vTWFpbkNhbGxDaGVja2VyLmNwcApAQCAtOCw3ICs4LDcgQEAKIAogbmFtZXNwYWNlIHsKIGNsYXNzIE1haW5DYWxsQ2hlY2tlciA6IHB1YmxpYyBDaGVja2VyIDwgY2hlY2s6OlByZVN0bXQ8Q2FsbEV4cHI+ID4gewotICBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVDsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlQ7CiAKIHB1YmxpYzoKICAgdm9pZCBjaGVja1ByZVN0bXQoY29uc3QgQ2FsbEV4cHIgKkNFLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CkBAIC0zNSw3ICszNSw3IEBACiAgICAgICByZXR1cm47CiAKICAgICBpZiAoIUJUKQotICAgICAgQlQucmVzZXQobmV3IEJ1Z1R5cGUoImNhbGwgdG8gbWFpbiIsICJleGFtcGxlIGFuYWx5emVyIHBsdWdpbiIpKTsKKyAgICAgIEJULnJlc2V0KG5ldyBCdWdUeXBlKHRoaXMsICJjYWxsIHRvIG1haW4iLCAiZXhhbXBsZSBhbmFseXplciBwbHVnaW4iKSk7CiAKICAgICBCdWdSZXBvcnQgKnJlcG9ydCA9IG5ldyBCdWdSZXBvcnQoKkJULCBCVC0+Z2V0TmFtZSgpLCBOKTsKICAgICByZXBvcnQtPmFkZFJhbmdlKENhbGxlZS0+Z2V0U291cmNlUmFuZ2UoKSk7CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jbGFuZy1pbnRlcnByZXRlci9DTWFrZUxpc3RzLnR4dCBiL2V4YW1wbGVzL2NsYW5nLWludGVycHJldGVyL0NNYWtlTGlzdHMudHh0CmluZGV4IDQ1MWI0YjguLjEwZGY3ZTcgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL2NsYW5nLWludGVycHJldGVyL0NNYWtlTGlzdHMudHh0CisrKyBiL2V4YW1wbGVzL2NsYW5nLWludGVycHJldGVyL0NNYWtlTGlzdHMudHh0CkBAIC0xLDE1ICsxLDkgQEAKIHNldChMTFZNX0xJTktfQ09NUE9ORU5UUwotICBqaXQKLSAgaW50ZXJwcmV0ZXIKKyAgQ29yZQorICBFeGVjdXRpb25FbmdpbmUKKyAgSklUCisgIFN1cHBvcnQKICAgbmF0aXZlY29kZWdlbgotICBhc21wYXJzZXIKLSAgYml0cmVhZGVyCi0gIGJpdHdyaXRlcgotICBpcnJlYWRlcgotICBjb2RlZ2VuCi0gIGlwbwotICBsaW5rZXIKLSAgc2VsZWN0aW9uZGFnCiAgICkKIAogYWRkX2NsYW5nX2V4ZWN1dGFibGUoY2xhbmctaW50ZXJwcmV0ZXIKQEAgLTIxLDE5ICsxNSw4IEBACiAgICkKIAogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNsYW5nLWludGVycHJldGVyCi0gIGNsYW5nRnJvbnRlbmQKLSAgY2xhbmdTZXJpYWxpemF0aW9uCi0gIGNsYW5nRHJpdmVyCi0gIGNsYW5nQ29kZUdlbgotICBjbGFuZ1NlbWEKLSAgY2xhbmdTdGF0aWNBbmFseXplckZyb250ZW5kCi0gIGNsYW5nU3RhdGljQW5hbHl6ZXJDaGVja2VycwotICBjbGFuZ1N0YXRpY0FuYWx5emVyQ29yZQotICBjbGFuZ0FuYWx5c2lzCi0gIGNsYW5nUmV3cml0ZUNvcmUKLSAgY2xhbmdSZXdyaXRlRnJvbnRlbmQKLSAgY2xhbmdBU1QKLSAgY2xhbmdQYXJzZQotICBjbGFuZ0xleAogICBjbGFuZ0Jhc2ljCisgIGNsYW5nQ29kZUdlbgorICBjbGFuZ0RyaXZlcgorICBjbGFuZ0Zyb250ZW5kCiAgICkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NsYW5nLWludGVycHJldGVyL01ha2VmaWxlIGIvZXhhbXBsZXMvY2xhbmctaW50ZXJwcmV0ZXIvTWFrZWZpbGUKaW5kZXggNTVhOGU2Zi4uNjQ5NGU5YSAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvY2xhbmctaW50ZXJwcmV0ZXIvTWFrZWZpbGUKKysrIGIvZXhhbXBsZXMvY2xhbmctaW50ZXJwcmV0ZXIvTWFrZWZpbGUKQEAgLTE2LDcgKzE2LDcgQEAKIFRPT0xfTk9fRVhQT1JUUyA9IDEKIAogTElOS19DT01QT05FTlRTIDo9IGppdCBpbnRlcnByZXRlciBuYXRpdmVjb2RlZ2VuIGJpdHJlYWRlciBiaXR3cml0ZXIgaXJyZWFkZXIgXAotCWlwbyBsaW5rZXIgc2VsZWN0aW9uZGFnIGFzbXBhcnNlciBpbnN0cnVtZW50YXRpb24gb3B0aW9uCisJaXBvIGxpbmtlciBzZWxlY3Rpb25kYWcgYXNtcGFyc2VyIGluc3RydW1lbnRhdGlvbiBvYmpjYXJjb3B0cyBvcHRpb24KIFVTRURMSUJTID0gY2xhbmdGcm9udGVuZC5hIGNsYW5nU2VyaWFsaXphdGlvbi5hIGNsYW5nRHJpdmVyLmEgY2xhbmdDb2RlR2VuLmEgXAogICAgICAgICAgICBjbGFuZ1BhcnNlLmEgY2xhbmdTZW1hLmEgY2xhbmdTdGF0aWNBbmFseXplckZyb250ZW5kLmEgXAogICAgICAgICAgICBjbGFuZ1N0YXRpY0FuYWx5emVyQ2hlY2tlcnMuYSBjbGFuZ1N0YXRpY0FuYWx5emVyQ29yZS5hIFwKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NsYW5nLWludGVycHJldGVyL21haW4uY3BwIGIvZXhhbXBsZXMvY2xhbmctaW50ZXJwcmV0ZXIvbWFpbi5jcHAKaW5kZXggZTAwNTgzZC4uNzEzYTY1MCAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvY2xhbmctaW50ZXJwcmV0ZXIvbWFpbi5jcHAKKysrIGIvZXhhbXBsZXMvY2xhbmctaW50ZXJwcmV0ZXIvbWFpbi5jcHAKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db21waWxlckludm9jYXRpb24uaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZERpYWdub3N0aWMuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpY1ByaW50ZXIuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgogI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0V4ZWN1dGlvbkVuZ2luZS5oIgogI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVC5oIgpAQCAtMjcsNiArMjYsNyBAQAogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RhcmdldFNlbGVjdC5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6ZHJpdmVyOwogCkBAIC00Niw4ICs0Niw4IEBACiAgIGxsdm06OkluaXRpYWxpemVOYXRpdmVUYXJnZXQoKTsKIAogICBzdGQ6OnN0cmluZyBFcnJvcjsKLSAgT3duaW5nUHRyPGxsdm06OkV4ZWN1dGlvbkVuZ2luZT4gRUUoCi0gICAgbGx2bTo6RXhlY3V0aW9uRW5naW5lOjpjcmVhdGVKSVQoTW9kLCAmRXJyb3IpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06OkV4ZWN1dGlvbkVuZ2luZT4gRUUoCisgICAgICBsbHZtOjpFeGVjdXRpb25FbmdpbmU6OmNyZWF0ZUpJVChNb2QsICZFcnJvcikpOwogICBpZiAoIUVFKSB7CiAgICAgbGx2bTo6ZXJycygpIDw8ICJ1bmFibGUgdG8gbWFrZSBleGVjdXRpb24gZW5naW5lOiAiIDw8IEVycm9yIDw8ICJcbiI7CiAgICAgcmV0dXJuIDI1NTsKQEAgLTgzLDcgKzgzLDcgQEAKICAgLy8gKGJhc2ljYWxseSwgZXhhY3RseSBvbmUgaW5wdXQsIGFuZCB0aGUgb3BlcmF0aW9uIG1vZGUgaXMgaGFyZCB3aXJlZCkuCiAgIFNtYWxsVmVjdG9yPGNvbnN0IGNoYXIgKiwgMTY+IEFyZ3MoYXJndiwgYXJndiArIGFyZ2MpOwogICBBcmdzLnB1c2hfYmFjaygiLWZzeW50YXgtb25seSIpOwotICBPd25pbmdQdHI8Q29tcGlsYXRpb24+IEMoVGhlRHJpdmVyLkJ1aWxkQ29tcGlsYXRpb24oQXJncykpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsYXRpb24+IEMoVGhlRHJpdmVyLkJ1aWxkQ29tcGlsYXRpb24oQXJncykpOwogICBpZiAoIUMpCiAgICAgcmV0dXJuIDA7CiAKQEAgLTEwOCw3ICsxMDgsNyBAQAogCiAgIC8vIEluaXRpYWxpemUgYSBjb21waWxlciBpbnZvY2F0aW9uIG9iamVjdCBmcm9tIHRoZSBjbGFuZyAoLWNjMSkgYXJndW1lbnRzLgogICBjb25zdCBkcml2ZXI6OkFyZ1N0cmluZ0xpc3QgJkNDQXJncyA9IENtZC0+Z2V0QXJndW1lbnRzKCk7Ci0gIE93bmluZ1B0cjxDb21waWxlckludm9jYXRpb24+IENJKG5ldyBDb21waWxlckludm9jYXRpb24pOworICBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsZXJJbnZvY2F0aW9uPiBDSShuZXcgQ29tcGlsZXJJbnZvY2F0aW9uKTsKICAgQ29tcGlsZXJJbnZvY2F0aW9uOjpDcmVhdGVGcm9tQXJncygqQ0ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjb25zdCBjaGFyICoqPihDQ0FyZ3MuZGF0YSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNvbnN0IGNoYXIgKio+KENDQXJncy5kYXRhKCkpICsKQEAgLTEyNiw3ICsxMjYsNyBAQAogCiAgIC8vIENyZWF0ZSBhIGNvbXBpbGVyIGluc3RhbmNlIHRvIGhhbmRsZSB0aGUgYWN0dWFsIHdvcmsuCiAgIENvbXBpbGVySW5zdGFuY2UgQ2xhbmc7Ci0gIENsYW5nLnNldEludm9jYXRpb24oQ0kudGFrZSgpKTsKKyAgQ2xhbmcuc2V0SW52b2NhdGlvbihDSS5yZWxlYXNlKCkpOwogCiAgIC8vIENyZWF0ZSB0aGUgY29tcGlsZXJzIGFjdHVhbCBkaWFnbm9zdGljcyBlbmdpbmUuCiAgIENsYW5nLmNyZWF0ZURpYWdub3N0aWNzKCk7CkBAIC0xNDAsNyArMTQwLDcgQEAKICAgICAgIENvbXBpbGVySW52b2NhdGlvbjo6R2V0UmVzb3VyY2VzUGF0aChhcmd2WzBdLCBNYWluQWRkcik7CiAKICAgLy8gQ3JlYXRlIGFuZCBleGVjdXRlIHRoZSBmcm9udGVuZCB0byBnZW5lcmF0ZSBhbiBMTFZNIGJpdGNvZGUgbW9kdWxlLgotICBPd25pbmdQdHI8Q29kZUdlbkFjdGlvbj4gQWN0KG5ldyBFbWl0TExWTU9ubHlBY3Rpb24oKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb2RlR2VuQWN0aW9uPiBBY3QobmV3IEVtaXRMTFZNT25seUFjdGlvbigpKTsKICAgaWYgKCFDbGFuZy5FeGVjdXRlQWN0aW9uKCpBY3QpKQogICAgIHJldHVybiAxOwogCmRpZmYgLS1naXQgYS9nZW5fZGlmZi5zaCBiL2dlbl9kaWZmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOTE0YTQxLi4wMDAwMDAwCi0tLSBhL2dlbl9kaWZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotZnVuY3Rpb24gdXNhZ2UoKSB7Ci0gIGVjaG8gVXNhZ2U6ICQwICJbUEFUSF9UT19ZT1VSX0xMVk1fRElSRUNUT1JZXSIKLSAgZWNobyBUaGlzIHdpbGwgZ2VuZXJhdGUgYSBkaWZmIG9mIGJvdGggQ2xhbmcgYW5kIExMVk0gaW4gdGhlIGZpbGVzCi0gIGVjaG8gZGlmZl9jbGFuZy50eHQKLSAgZWNobyBkaWZmX2xsdm0udHh0Ci19Ci0KLUJBU0VfTExWTV9ESVJfT05DRT0wCi1CQVNFX0xMVk1fRElSPSRMTFZNRElSL2xsdm0KLQotQVJHUz1gZ2V0b3B0IC1vIGggLS1sb25nIGhlbHAgLS0gIiRAImAKLWV2YWwgc2V0IC0tICIkQVJHUyIKLQotd2hpbGUgdHJ1ZTsgZG8KLSAgY2FzZSAiJDEiIGluCi0gIC1ofC0taGVscCkKLSAgICB1c2FnZQotICAgIGV4aXQgMAotICAgIDs7Ci0gIC0tKQotICAgIHNoaWZ0OwotICAgIGJyZWFrCi0gICAgOzsKLSAgKikKLSAgICBlY2hvICJJbnRlcm5hbCBlcnJvciEiCi0gICAgZXhpdCAxCi0gICAgOzsKLSAgZXNhYwotZG9uZQotCi1mb3IgQVJHOyBkbwotICBpZiBbICRCQVNFX0xMVk1fRElSX09OQ0UgLWVxIDEgXTsgdGhlbgotICAgIHVzYWdlCi0gICAgZXhpdCAxCi0gIGZpCi0gIEJBU0VfTExWTV9ESVJfT05DRT0xCi0gIEJBU0VfTExWTV9ESVI9JEFSRwotZG9uZQotCi1CQVNFX0NMQU5HX0RJUj0kQkFTRV9MTFZNX0RJUi90b29scy9jbGFuZwotZWNobyAiVXNpbmcgQkFTRV9MTFZNX0RJUiA9ICRCQVNFX0xMVk1fRElSIgotZWNobyAiVXNpbmcgQkFTRV9DTEFOR19ESVIgPSAkQkFTRV9DTEFOR19ESVIiCi0KLUFORFJPSURfTExWTV9ESVI9JFBXRC8uLi9sbHZtCi1BTkRST0lEX0NMQU5HX0RJUj0kUFdECi1lY2hvICJVc2luZyBBTkRST0lEX0xMVk1fRElSID0gJEFORFJPSURfTExWTV9ESVIiCi1lY2hvICJVc2luZyBBTkRST0lEX0NMQU5HX0RJUiA9ICRBTkRST0lEX0NMQU5HX0RJUiIKLQotRElGRl9GTEFHUz0iLXggLmdpdCAtciIKLQotZGlmZiAkRElGRl9GTEFHUyAkQkFTRV9DTEFOR19ESVIgJEFORFJPSURfQ0xBTkdfRElSID4gZGlmZl9jbGFuZy50eHQKLWRpZmYgJERJRkZfRkxBR1MgJEJBU0VfTExWTV9ESVIgJEFORFJPSURfTExWTV9ESVIgPiBkaWZmX2xsdm0udHh0Ci0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy1jL0J1aWxkU3lzdGVtLmggYi9pbmNsdWRlL2NsYW5nLWMvQnVpbGRTeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjEyNzI4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jbGFuZy1jL0J1aWxkU3lzdGVtLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qPT0tLSBjbGFuZy1jL0J1aWxkU3lzZXRtLmggLSBVdGlsaXRpZXMgZm9yIHVzZSBieSBidWlsZCBzeXN0ZW1zIC0qLSBDIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIHByb3ZpZGVzIHZhcmlvdXMgdXRpbGl0aWVzIGZvciB1c2UgYnkgYnVpbGQgc3lzdGVtcy4gICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBDTEFOR19DX0JVSUxEX1NZU1RFTV9ICisjZGVmaW5lIENMQU5HX0NfQlVJTERfU1lTVEVNX0gKKworI2luY2x1ZGUgImNsYW5nLWMvUGxhdGZvcm0uaCIKKyNpbmNsdWRlICJjbGFuZy1jL0NYRXJyb3JDb2RlLmgiCisjaW5jbHVkZSAiY2xhbmctYy9DWFN0cmluZy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogXGRlZmdyb3VwIEJVSUxEX1NZU1RFTSBCdWlsZCBzeXN0ZW0gdXRpbGl0aWVzCisgKiBAeworICovCisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgdGltZXN0YW1wIGZvciB1c2Ugd2l0aCBDbGFuZydzCisgKiBcYyAtZmJ1aWxkLXNlc3Npb24tdGltZXN0YW1wPSBvcHRpb24uCisgKi8KK0NJTkRFWF9MSU5LQUdFIHVuc2lnbmVkIGxvbmcgbG9uZyBjbGFuZ19nZXRCdWlsZFNlc3Npb25UaW1lc3RhbXAodm9pZCk7CisKKy8qKgorICogXGJyaWVmIE9iamVjdCBlbmNhcHN1bGF0aW5nIGluZm9ybWF0aW9uIGFib3V0IG92ZXJsYXlpbmcgdmlydHVhbAorICogZmlsZS9kaXJlY3RvcmllcyBvdmVyIHRoZSByZWFsIGZpbGUgc3lzdGVtLgorICovCit0eXBlZGVmIHN0cnVjdCBDWFZpcnR1YWxGaWxlT3ZlcmxheUltcGwgKkNYVmlydHVhbEZpbGVPdmVybGF5OworCisvKioKKyAqIFxicmllZiBDcmVhdGUgYSBcYyBDWFZpcnR1YWxGaWxlT3ZlcmxheSBvYmplY3QuCisgKiBNdXN0IGJlIGRpc3Bvc2VkIHdpdGggXGMgY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X2Rpc3Bvc2UoKS4KKyAqCisgKiBccGFyYW0gb3B0aW9ucyBpcyByZXNlcnZlZCwgYWx3YXlzIHBhc3MgMC4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hWaXJ0dWFsRmlsZU92ZXJsYXkKK2NsYW5nX1ZpcnR1YWxGaWxlT3ZlcmxheV9jcmVhdGUodW5zaWduZWQgb3B0aW9ucyk7CisKKy8qKgorICogXGJyaWVmIE1hcCBhbiBhYnNvbHV0ZSB2aXJ0dWFsIGZpbGUgcGF0aCB0byBhbiBhYnNvbHV0ZSByZWFsIG9uZS4KKyAqIFRoZSB2aXJ0dWFsIHBhdGggbXVzdCBiZSBjYW5vbmljYWxpemVkIChub3QgY29udGFpbiAiLiIvIi4uIikuCisgKiBccmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyB0byBpbmRpY2F0ZSBhbiBlcnJvci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEVycm9yQ29kZQorY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X2FkZEZpbGVNYXBwaW5nKENYVmlydHVhbEZpbGVPdmVybGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZpcnR1YWxQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYWxQYXRoKTsKKworLyoqCisgKiBcYnJpZWYgU2V0IHRoZSBjYXNlIHNlbnNpdGl2aXR5IGZvciB0aGUgXGMgQ1hWaXJ0dWFsRmlsZU92ZXJsYXkgb2JqZWN0LgorICogVGhlIFxjIENYVmlydHVhbEZpbGVPdmVybGF5IG9iamVjdCBpcyBjYXNlLXNlbnNpdGl2ZSBieSBkZWZhdWx0LCB0aGlzCisgKiBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCisgKiBccmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyB0byBpbmRpY2F0ZSBhbiBlcnJvci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEVycm9yQ29kZQorY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X3NldENhc2VTZW5zaXRpdml0eShDWFZpcnR1YWxGaWxlT3ZlcmxheSwKKwkJCQkJCQkJCQkJaW50IGNhc2VTZW5zaXRpdmUpOworCisvKioKKyAqIFxicmllZiBXcml0ZSBvdXQgdGhlIFxjIENYVmlydHVhbEZpbGVPdmVybGF5IG9iamVjdCB0byBhIGNoYXIgYnVmZmVyLgorICoKKyAqIFxwYXJhbSBvcHRpb25zIGlzIHJlc2VydmVkLCBhbHdheXMgcGFzcyAwLgorICogXHBhcmFtIG91dF9idWZmZXJfcHRyIHBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgYnVmZmVyIHBvaW50ZXIsIHdoaWNoIHNob3VsZCBiZQorICogZGlzcG9zZWQgdXNpbmcgXGMgZnJlZSgpLgorICogXHBhcmFtIG91dF9idWZmZXJfc2l6ZSBwb2ludGVyIHRvIHJlY2VpdmUgdGhlIGJ1ZmZlciBzaXplLgorICogXHJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gdG8gaW5kaWNhdGUgYW4gZXJyb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGVudW0gQ1hFcnJvckNvZGUKK2NsYW5nX1ZpcnR1YWxGaWxlT3ZlcmxheV93cml0ZVRvQnVmZmVyKENYVmlydHVhbEZpbGVPdmVybGF5LCB1bnNpZ25lZCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKm91dF9idWZmZXJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm91dF9idWZmZXJfc2l6ZSk7CisKKy8qKgorICogXGJyaWVmIERpc3Bvc2UgYSBcYyBDWFZpcnR1YWxGaWxlT3ZlcmxheSBvYmplY3QuCisgKi8KK0NJTkRFWF9MSU5LQUdFIHZvaWQgY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X2Rpc3Bvc2UoQ1hWaXJ0dWFsRmlsZU92ZXJsYXkpOworCisvKioKKyAqIFxicmllZiBPYmplY3QgZW5jYXBzdWxhdGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIG1vZHVsZS5tYXAgZmlsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ1hNb2R1bGVNYXBEZXNjcmlwdG9ySW1wbCAqQ1hNb2R1bGVNYXBEZXNjcmlwdG9yOworCisvKioKKyAqIFxicmllZiBDcmVhdGUgYSBcYyBDWE1vZHVsZU1hcERlc2NyaXB0b3Igb2JqZWN0LgorICogTXVzdCBiZSBkaXNwb3NlZCB3aXRoIFxjIGNsYW5nX01vZHVsZU1hcERlc2NyaXB0b3JfZGlzcG9zZSgpLgorICoKKyAqIFxwYXJhbSBvcHRpb25zIGlzIHJlc2VydmVkLCBhbHdheXMgcGFzcyAwLgorICovCitDSU5ERVhfTElOS0FHRSBDWE1vZHVsZU1hcERlc2NyaXB0b3IKK2NsYW5nX01vZHVsZU1hcERlc2NyaXB0b3JfY3JlYXRlKHVuc2lnbmVkIG9wdGlvbnMpOworCisvKioKKyAqIFxicmllZiBTZXRzIHRoZSBmcmFtZXdvcmsgbW9kdWxlIG5hbWUgdGhhdCB0aGUgbW9kdWxlLm1hcCBkZXNjcmliZXMuCisgKiBccmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyB0byBpbmRpY2F0ZSBhbiBlcnJvci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEVycm9yQ29kZQorY2xhbmdfTW9kdWxlTWFwRGVzY3JpcHRvcl9zZXRGcmFtZXdvcmtNb2R1bGVOYW1lKENYTW9kdWxlTWFwRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBcYnJpZWYgU2V0cyB0aGUgdW1icmVhbGxhIGhlYWRlciBuYW1lIHRoYXQgdGhlIG1vZHVsZS5tYXAgZGVzY3JpYmVzLgorICogXHJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gdG8gaW5kaWNhdGUgYW4gZXJyb3IuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGVudW0gQ1hFcnJvckNvZGUKK2NsYW5nX01vZHVsZU1hcERlc2NyaXB0b3Jfc2V0VW1icmVsbGFIZWFkZXIoQ1hNb2R1bGVNYXBEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBcYnJpZWYgV3JpdGUgb3V0IHRoZSBcYyBDWE1vZHVsZU1hcERlc2NyaXB0b3Igb2JqZWN0IHRvIGEgY2hhciBidWZmZXIuCisgKgorICogXHBhcmFtIG9wdGlvbnMgaXMgcmVzZXJ2ZWQsIGFsd2F5cyBwYXNzIDAuCisgKiBccGFyYW0gb3V0X2J1ZmZlcl9wdHIgcG9pbnRlciB0byByZWNlaXZlIHRoZSBidWZmZXIgcG9pbnRlciwgd2hpY2ggc2hvdWxkIGJlCisgKiBkaXNwb3NlZCB1c2luZyBcYyBmcmVlKCkuCisgKiBccGFyYW0gb3V0X2J1ZmZlcl9zaXplIHBvaW50ZXIgdG8gcmVjZWl2ZSB0aGUgYnVmZmVyIHNpemUuCisgKiBccmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyB0byBpbmRpY2F0ZSBhbiBlcnJvci4KKyAqLworQ0lOREVYX0xJTktBR0UgZW51bSBDWEVycm9yQ29kZQorY2xhbmdfTW9kdWxlTWFwRGVzY3JpcHRvcl93cml0ZVRvQnVmZmVyKENYTW9kdWxlTWFwRGVzY3JpcHRvciwgdW5zaWduZWQgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipvdXRfYnVmZmVyX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpvdXRfYnVmZmVyX3NpemUpOworCisvKioKKyAqIFxicmllZiBEaXNwb3NlIGEgXGMgQ1hNb2R1bGVNYXBEZXNjcmlwdG9yIG9iamVjdC4KKyAqLworQ0lOREVYX0xJTktBR0Ugdm9pZCBjbGFuZ19Nb2R1bGVNYXBEZXNjcmlwdG9yX2Rpc3Bvc2UoQ1hNb2R1bGVNYXBEZXNjcmlwdG9yKTsKKworLyoqCisgKiBAfQorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBDTEFOR19DX0JVSUxEX1NZU1RFTV9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmctYy9DWEVycm9yQ29kZS5oIGIvaW5jbHVkZS9jbGFuZy1jL0NYRXJyb3JDb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyNmM5NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2xhbmctYy9DWEVycm9yQ29kZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qPT09LS0gY2xhbmctYy9DWEVycm9yQ29kZS5oIC0gQyBJbmRleCBFcnJvciBDb2RlcyAgLS0tLS0tLS0tLS0tLS0qLSBDIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqfAorfCogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8Kj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgaGVhZGVyIHByb3ZpZGVzIHRoZSBDWEVycm9yQ29kZSBlbnVtZXJhdG9ycy4gICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBDTEFOR19DX0NYRVJST1JDT0RFX0gKKyNkZWZpbmUgQ0xBTkdfQ19DWEVSUk9SQ09ERV9ICisKKyNpbmNsdWRlICJjbGFuZy1jL1BsYXRmb3JtLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBcYnJpZWYgRXJyb3IgY29kZXMgcmV0dXJuZWQgYnkgbGliY2xhbmcgcm91dGluZXMuCisgKgorICogWmVybyAoXGMgQ1hFcnJvcl9TdWNjZXNzKSBpcyB0aGUgb25seSBlcnJvciBjb2RlIGluZGljYXRpbmcgc3VjY2Vzcy4gIE90aGVyCisgKiBlcnJvciBjb2RlcywgaW5jbHVkaW5nIG5vdCB5ZXQgYXNzaWduZWQgbm9uLXplcm8gdmFsdWVzLCBpbmRpY2F0ZSBlcnJvcnMuCisgKi8KK2VudW0gQ1hFcnJvckNvZGUgeworICAvKioKKyAgICogXGJyaWVmIE5vIGVycm9yLgorICAgKi8KKyAgQ1hFcnJvcl9TdWNjZXNzID0gMCwKKworICAvKioKKyAgICogXGJyaWVmIEEgZ2VuZXJpYyBlcnJvciBjb2RlLCBubyBmdXJ0aGVyIGRldGFpbHMgYXJlIGF2YWlsYWJsZS4KKyAgICoKKyAgICogRXJyb3JzIG9mIHRoaXMga2luZCBjYW4gZ2V0IHRoZWlyIG93biBzcGVjaWZpYyBlcnJvciBjb2RlcyBpbiBmdXR1cmUKKyAgICogbGliY2xhbmcgdmVyc2lvbnMuCisgICAqLworICBDWEVycm9yX0ZhaWx1cmUgPSAxLAorCisgIC8qKgorICAgKiBcYnJpZWYgbGliY2xhbmcgY3Jhc2hlZCB3aGlsZSBwZXJmb3JtaW5nIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgKi8KKyAgQ1hFcnJvcl9DcmFzaGVkID0gMiwKKworICAvKioKKyAgICogXGJyaWVmIFRoZSBmdW5jdGlvbiBkZXRlY3RlZCB0aGF0IHRoZSBhcmd1bWVudHMgdmlvbGF0ZSB0aGUgZnVuY3Rpb24KKyAgICogY29udHJhY3QuCisgICAqLworICBDWEVycm9yX0ludmFsaWRBcmd1bWVudHMgPSAzLAorCisgIC8qKgorICAgKiBcYnJpZWYgQW4gQVNUIGRlc2VyaWFsaXphdGlvbiBlcnJvciBoYXMgb2NjdXJyZWQuCisgICAqLworICBDWEVycm9yX0FTVFJlYWRFcnJvciA9IDQKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy1jL0luZGV4LmggYi9pbmNsdWRlL2NsYW5nLWMvSW5kZXguaAppbmRleCA5NWQ1NGMyLi43ZWZmMGE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nLWMvSW5kZXguaAorKysgYi9pbmNsdWRlL2NsYW5nLWMvSW5kZXguaApAQCAtMTksNyArMTksOSBAQAogI2luY2x1ZGUgPHRpbWUuaD4KIAogI2luY2x1ZGUgImNsYW5nLWMvUGxhdGZvcm0uaCIKKyNpbmNsdWRlICJjbGFuZy1jL0NYRXJyb3JDb2RlLmgiCiAjaW5jbHVkZSAiY2xhbmctYy9DWFN0cmluZy5oIgorI2luY2x1ZGUgImNsYW5nLWMvQnVpbGRTeXN0ZW0uaCIKIAogLyoqCiAgKiBcYnJpZWYgVGhlIHZlcnNpb24gY29uc3RhbnRzIGZvciB0aGUgbGliY2xhbmcgQVBJLgpAQCAtMzAsNyArMzIsNyBAQAogICogY29tcGF0aWJsZSwgdGh1cyBDSU5ERVhfVkVSU0lPTl9NQUpPUiBpcyBleHBlY3RlZCB0byByZW1haW4gc3RhYmxlLgogICovCiAjZGVmaW5lIENJTkRFWF9WRVJTSU9OX01BSk9SIDAKLSNkZWZpbmUgQ0lOREVYX1ZFUlNJT05fTUlOT1IgMjAKKyNkZWZpbmUgQ0lOREVYX1ZFUlNJT05fTUlOT1IgMjQKIAogI2RlZmluZSBDSU5ERVhfVkVSU0lPTl9FTkNPREUobWFqb3IsIG1pbm9yKSAoIFwKICAgICAgICgobWFqb3IpICogMTAwMDApICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC01OTksNiArNjAxLDMyIEBACiBDSU5ERVhfTElOS0FHRSBDWFNvdXJjZUxvY2F0aW9uIGNsYW5nX2dldFJhbmdlRW5kKENYU291cmNlUmFuZ2UgcmFuZ2UpOwogCiAvKioKKyAqIFxicmllZiBJZGVudGlmaWVzIGFuIGFycmF5IG9mIHJhbmdlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiogXGJyaWVmIFRoZSBudW1iZXIgb2YgcmFuZ2VzIGluIHRoZSBcYyByYW5nZXMgYXJyYXkuICovCisgIHVuc2lnbmVkIGNvdW50OworICAvKioKKyAgICogXGJyaWVmIEFuIGFycmF5IG9mIFxjIENYU291cmNlUmFuZ2VzLgorICAgKi8KKyAgQ1hTb3VyY2VSYW5nZSAqcmFuZ2VzOworfSBDWFNvdXJjZVJhbmdlTGlzdDsKKworLyoqCisgKiBcYnJpZWYgUmV0cmlldmUgYWxsIHJhbmdlcyB0aGF0IHdlcmUgc2tpcHBlZCBieSB0aGUgcHJlcHJvY2Vzc29yLgorICoKKyAqIFRoZSBwcmVwcm9jZXNzb3Igd2lsbCBza2lwIGxpbmVzIHdoZW4gdGhleSBhcmUgc3Vycm91bmRlZCBieSBhbgorICogaWYvaWZkZWYvaWZuZGVmIGRpcmVjdGl2ZSB3aG9zZSBjb25kaXRpb24gZG9lcyBub3QgZXZhbHVhdGUgdG8gdHJ1ZS4KKyAqLworQ0lOREVYX0xJTktBR0UgQ1hTb3VyY2VSYW5nZUxpc3QgKmNsYW5nX2dldFNraXBwZWRSYW5nZXMoQ1hUcmFuc2xhdGlvblVuaXQgdHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZpbGUgZmlsZSk7CisKKy8qKgorICogXGJyaWVmIERlc3Ryb3kgdGhlIGdpdmVuIFxjIENYU291cmNlUmFuZ2VMaXN0LgorICovCitDSU5ERVhfTElOS0FHRSB2b2lkIGNsYW5nX2Rpc3Bvc2VTb3VyY2VSYW5nZUxpc3QoQ1hTb3VyY2VSYW5nZUxpc3QgKnJhbmdlcyk7CisKKy8qKgogICogQH0KICAqLwogCkBAIC02MjUsNiArNjUzLDEyIEBACiAgIENYRGlhZ25vc3RpY19Ob3RlICAgID0gMSwKIAogICAvKioKKyAgICogXGJyaWVmIFRoaXMgZGlhZ25vc3RpYyBpcyBhIHJlbWFyayB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICogZm9yIHRoZSB1c2VyLgorICAgKi8KKyAgQ1hEaWFnbm9zdGljX1JlbWFyayA9IDUsCisKKyAgLyoqCiAgICAqIFxicmllZiBUaGlzIGRpYWdub3N0aWMgaW5kaWNhdGVzIHN1c3BpY2lvdXMgY29kZSB0aGF0IG1heSBub3QgYmUKICAgICogd3JvbmcuCiAgICAqLwpAQCAtMTA1MCwxMCArMTA4NCwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ1hVbnNhdmVkRmlsZSAqdW5zYXZlZF9maWxlcyk7CiAKIC8qKgotICogXGJyaWVmIENyZWF0ZSBhIHRyYW5zbGF0aW9uIHVuaXQgZnJvbSBhbiBBU1QgZmlsZSAoLWVtaXQtYXN0KS4KKyAqIFxicmllZiBTYW1lIGFzIFxjIGNsYW5nX2NyZWF0ZVRyYW5zbGF0aW9uVW5pdDIsIGJ1dCByZXR1cm5zCisgKiB0aGUgXGMgQ1hUcmFuc2xhdGlvblVuaXQgaW5zdGVhZCBvZiBhbiBlcnJvciBjb2RlLiAgSW4gY2FzZSBvZiBhbiBlcnJvciB0aGlzCisgKiByb3V0aW5lIHJldHVybnMgYSBcYyBOVUxMIFxjIENYVHJhbnNsYXRpb25Vbml0LCB3aXRob3V0IGZ1cnRoZXIgZGV0YWlsZWQKKyAqIGVycm9yIGNvZGVzLgogICovCi1DSU5ERVhfTElOS0FHRSBDWFRyYW5zbGF0aW9uVW5pdCBjbGFuZ19jcmVhdGVUcmFuc2xhdGlvblVuaXQoQ1hJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFzdF9maWxlbmFtZSk7CitDSU5ERVhfTElOS0FHRSBDWFRyYW5zbGF0aW9uVW5pdCBjbGFuZ19jcmVhdGVUcmFuc2xhdGlvblVuaXQoCisgICAgQ1hJbmRleCBDSWR4LAorICAgIGNvbnN0IGNoYXIgKmFzdF9maWxlbmFtZSk7CisKKy8qKgorICogXGJyaWVmIENyZWF0ZSBhIHRyYW5zbGF0aW9uIHVuaXQgZnJvbSBhbiBBU1QgZmlsZSAoXGMgLWVtaXQtYXN0KS4KKyAqCisgKiBccGFyYW1bb3V0XSBvdXRfVFUgQSBub24tTlVMTCBwb2ludGVyIHRvIHN0b3JlIHRoZSBjcmVhdGVkCisgKiBcYyBDWFRyYW5zbGF0aW9uVW5pdC4KKyAqCisgKiBccmV0dXJucyBaZXJvIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSByZXR1cm5zIGFuIGVycm9yIGNvZGUuCisgKi8KK0NJTkRFWF9MSU5LQUdFIGVudW0gQ1hFcnJvckNvZGUgY2xhbmdfY3JlYXRlVHJhbnNsYXRpb25Vbml0MigKKyAgICBDWEluZGV4IENJZHgsCisgICAgY29uc3QgY2hhciAqYXN0X2ZpbGVuYW1lLAorICAgIENYVHJhbnNsYXRpb25Vbml0ICpvdXRfVFUpOwogCiAvKioKICAqIFxicmllZiBGbGFncyB0aGF0IGNvbnRyb2wgdGhlIGNyZWF0aW9uIG9mIHRyYW5zbGF0aW9uIHVuaXRzLgpAQCAtMTE2Nyw3ICsxMjE4LDIyIEBACiAgKiBzZXQgb2Ygb3B0aW1pemF0aW9ucyBlbmFibGVkIG1heSBjaGFuZ2UgZnJvbSBvbmUgdmVyc2lvbiB0byB0aGUgbmV4dC4KICAqLwogQ0lOREVYX0xJTktBR0UgdW5zaWduZWQgY2xhbmdfZGVmYXVsdEVkaXRpbmdUcmFuc2xhdGlvblVuaXRPcHRpb25zKHZvaWQpOwotICAKKworLyoqCisgKiBcYnJpZWYgU2FtZSBhcyBcYyBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdDIsIGJ1dCByZXR1cm5zCisgKiB0aGUgXGMgQ1hUcmFuc2xhdGlvblVuaXQgaW5zdGVhZCBvZiBhbiBlcnJvciBjb2RlLiAgSW4gY2FzZSBvZiBhbiBlcnJvciB0aGlzCisgKiByb3V0aW5lIHJldHVybnMgYSBcYyBOVUxMIFxjIENYVHJhbnNsYXRpb25Vbml0LCB3aXRob3V0IGZ1cnRoZXIgZGV0YWlsZWQKKyAqIGVycm9yIGNvZGVzLgorICovCitDSU5ERVhfTElOS0FHRSBDWFRyYW5zbGF0aW9uVW5pdAorY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQoQ1hJbmRleCBDSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc291cmNlX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgKmNvbW1hbmRfbGluZV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jb21tYW5kX2xpbmVfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDWFVuc2F2ZWRGaWxlICp1bnNhdmVkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3Vuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBvcHRpb25zKTsKKwogLyoqCiAgKiBcYnJpZWYgUGFyc2UgdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGFuZCB0aGUgdHJhbnNsYXRpb24gdW5pdCBjb3JyZXNwb25kaW5nCiAgKiB0byB0aGF0IGZpbGUuCkBAIC0xMTgyLDcgKzEyNDgsNyBAQAogICogYXNzb2NpYXRlZC4KICAqCiAgKiBccGFyYW0gc291cmNlX2ZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBsb2FkLCBvciBOVUxMIGlmIHRoZQotICogc291cmNlIGZpbGUgaXMgaW5jbHVkZWQgaW4gXHAgY29tbWFuZF9saW5lX2FyZ3MuCisgKiBzb3VyY2UgZmlsZSBpcyBpbmNsdWRlZCBpbiBcYyBjb21tYW5kX2xpbmVfYXJncy4KICAqCiAgKiBccGFyYW0gY29tbWFuZF9saW5lX2FyZ3MgVGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdGhhdCB3b3VsZCBiZQogICogcGFzc2VkIHRvIHRoZSBcYyBjbGFuZyBleGVjdXRhYmxlIGlmIGl0IHdlcmUgYmVpbmcgaW52b2tlZCBvdXQtb2YtcHJvY2Vzcy4KQEAgLTExOTEsNyArMTI1Nyw3IEBACiAgKiAnLWVtaXQtYXN0JywgJy1mc3ludGF4LW9ubHknICh3aGljaCBpcyB0aGUgZGVmYXVsdCksIGFuZCAnLW8gXDxvdXRwdXQgZmlsZT4nLgogICoKICAqIFxwYXJhbSBudW1fY29tbWFuZF9saW5lX2FyZ3MgVGhlIG51bWJlciBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGluCi0gKiBccCBjb21tYW5kX2xpbmVfYXJncy4KKyAqIFxjIGNvbW1hbmRfbGluZV9hcmdzLgogICoKICAqIFxwYXJhbSB1bnNhdmVkX2ZpbGVzIHRoZSBmaWxlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIHNhdmVkIHRvIGRpc2sKICAqIGJ1dCBtYXkgYmUgcmVxdWlyZWQgZm9yIHBhcnNpbmcsIGluY2x1ZGluZyB0aGUgY29udGVudHMgb2YKQEAgLTEyMDYsMTggKzEyNzIsMjIgQEAKICAqIGlzIG1hbmFnZWQgYnV0IG5vdCBpdHMgY29tcGlsYXRpb24uIFRoaXMgc2hvdWxkIGJlIGEgYml0d2lzZSBPUiBvZiB0aGUKICAqIENYVHJhbnNsYXRpb25Vbml0X1hYWCBmbGFncy4KICAqCi0gKiBccmV0dXJucyBBIG5ldyB0cmFuc2xhdGlvbiB1bml0IGRlc2NyaWJpbmcgdGhlIHBhcnNlZCBjb2RlIGFuZCBjb250YWluaW5nCi0gKiBhbnkgZGlhZ25vc3RpY3MgcHJvZHVjZWQgYnkgdGhlIGNvbXBpbGVyLiBJZiB0aGVyZSBpcyBhIGZhaWx1cmUgZnJvbSB3aGljaAotICogdGhlIGNvbXBpbGVyIGNhbm5vdCByZWNvdmVyLCByZXR1cm5zIE5VTEwuCisgKiBccGFyYW1bb3V0XSBvdXRfVFUgQSBub24tTlVMTCBwb2ludGVyIHRvIHN0b3JlIHRoZSBjcmVhdGVkCisgKiBcYyBDWFRyYW5zbGF0aW9uVW5pdCwgZGVzY3JpYmluZyB0aGUgcGFyc2VkIGNvZGUgYW5kIGNvbnRhaW5pbmcgYW55CisgKiBkaWFnbm9zdGljcyBwcm9kdWNlZCBieSB0aGUgY29tcGlsZXIuCisgKgorICogXHJldHVybnMgWmVybyBvbiBzdWNjZXNzLCBvdGhlcndpc2UgcmV0dXJucyBhbiBlcnJvciBjb2RlLgogICovCi1DSU5ERVhfTElOS0FHRSBDWFRyYW5zbGF0aW9uVW5pdCBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdChDWEluZGV4IENJZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc291cmNlX2ZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmNvbW1hbmRfbGluZV9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jb21tYW5kX2xpbmVfYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENYVW5zYXZlZEZpbGUgKnVuc2F2ZWRfZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV91bnNhdmVkX2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb3B0aW9ucyk7Ci0gIAorQ0lOREVYX0xJTktBR0UgZW51bSBDWEVycm9yQ29kZQorY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQyKENYSW5kZXggQ0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzb3VyY2VfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgKmNvbW1hbmRfbGluZV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY29tbWFuZF9saW5lX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENYVW5zYXZlZEZpbGUgKnVuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3Vuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFRyYW5zbGF0aW9uVW5pdCAqb3V0X1RVKTsKKwogLyoqCiAgKiBcYnJpZWYgRmxhZ3MgdGhhdCBjb250cm9sIGhvdyB0cmFuc2xhdGlvbiB1bml0cyBhcmUgc2F2ZWQuCiAgKgpAQCAtMTM2OSwxMCArMTQzOSwxMSBAQAogICogVGhlIGZ1bmN0aW9uIFxjIGNsYW5nX2RlZmF1bHRSZXBhcnNlT3B0aW9ucygpIHByb2R1Y2VzIGEgZGVmYXVsdCBzZXQgb2YKICAqIG9wdGlvbnMgcmVjb21tZW5kZWQgZm9yIG1vc3QgdXNlcywgYmFzZWQgb24gdGhlIHRyYW5zbGF0aW9uIHVuaXQuCiAgKgotICogXHJldHVybnMgMCBpZiB0aGUgc291cmNlcyBjb3VsZCBiZSByZXBhcnNlZC4gQSBub24temVybyB2YWx1ZSB3aWxsIGJlCisgKiBccmV0dXJucyAwIGlmIHRoZSBzb3VyY2VzIGNvdWxkIGJlIHJlcGFyc2VkLiAgQSBub24temVybyBlcnJvciBjb2RlIHdpbGwgYmUKICAqIHJldHVybmVkIGlmIHJlcGFyc2luZyB3YXMgaW1wb3NzaWJsZSwgc3VjaCB0aGF0IHRoZSB0cmFuc2xhdGlvbiB1bml0IGlzCi0gKiBpbnZhbGlkLiBJbiBzdWNoIGNhc2VzLCB0aGUgb25seSB2YWxpZCBjYWxsIGZvciBccCBUVSBpcyAKLSAqIFxjIGNsYW5nX2Rpc3Bvc2VUcmFuc2xhdGlvblVuaXQoVFUpLgorICogaW52YWxpZC4gSW4gc3VjaCBjYXNlcywgdGhlIG9ubHkgdmFsaWQgY2FsbCBmb3IgXGMgVFUgaXMKKyAqIFxjIGNsYW5nX2Rpc3Bvc2VUcmFuc2xhdGlvblVuaXQoVFUpLiAgVGhlIGVycm9yIGNvZGVzIHJldHVybmVkIGJ5IHRoaXMKKyAqIHJvdXRpbmUgYXJlIGRlc2NyaWJlZCBieSB0aGUgXGMgQ1hFcnJvckNvZGUgZW51bS4KICAqLwogQ0lOREVYX0xJTktBR0UgaW50IGNsYW5nX3JlcGFyc2VUcmFuc2xhdGlvblVuaXQoQ1hUcmFuc2xhdGlvblVuaXQgVFUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fdW5zYXZlZF9maWxlcywKQEAgLTIwNzAsNyArMjE0MSwxMSBAQAogICAgKi8KICAgQ1hDdXJzb3JfT01QUGFyYWxsZWxEaXJlY3RpdmUgICAgICAgICAgPSAyMzIsCiAKLSAgQ1hDdXJzb3JfTGFzdFN0bXQgICAgICAgICAgICAgICAgICAgICAgPSBDWEN1cnNvcl9PTVBQYXJhbGxlbERpcmVjdGl2ZSwKKyAgLyoqIFxicmllZiBPcGVuTVAgc2ltZCBkaXJlY3RpdmUuCisgICAqLworICBDWEN1cnNvcl9PTVBTaW1kRGlyZWN0aXZlICAgICAgICAgICAgICA9IDIzMywKKworICBDWEN1cnNvcl9MYXN0U3RtdCAgICAgICAgICAgICAgICAgICAgICA9IENYQ3Vyc29yX09NUFNpbWREaXJlY3RpdmUsCiAKICAgLyoqCiAgICAqIFxicmllZiBDdXJzb3IgdGhhdCByZXByZXNlbnRzIHRoZSB0cmFuc2xhdGlvbiB1bml0IGl0c2VsZi4KQEAgLTIzNjksNyArMjQ0NCw3IEBACiAvKioKICAqIFxicmllZiBEZXNjcmliZSB0aGUgImxhbmd1YWdlIiBvZiB0aGUgZW50aXR5IHJlZmVycmVkIHRvIGJ5IGEgY3Vyc29yLgogICovCi1DSU5ERVhfTElOS0FHRSBlbnVtIENYTGFuZ3VhZ2VLaW5kIHsKK2VudW0gQ1hMYW5ndWFnZUtpbmQgewogICBDWExhbmd1YWdlX0ludmFsaWQgPSAwLAogICBDWExhbmd1YWdlX0MsCiAgIENYTGFuZ3VhZ2VfT2JqQywKQEAgLTI4NTQsMTQgKzI5MjksMTQgQEAKIENJTkRFWF9MSU5LQUdFIGVudW0gQ1hDYWxsaW5nQ29udiBjbGFuZ19nZXRGdW5jdGlvblR5cGVDYWxsaW5nQ29udihDWFR5cGUgVCk7CiAKIC8qKgotICogXGJyaWVmIFJldHJpZXZlIHRoZSByZXN1bHQgdHlwZSBhc3NvY2lhdGVkIHdpdGggYSBmdW5jdGlvbiB0eXBlLgorICogXGJyaWVmIFJldHJpZXZlIHRoZSByZXR1cm4gdHlwZSBhc3NvY2lhdGVkIHdpdGggYSBmdW5jdGlvbiB0eXBlLgogICoKICAqIElmIGEgbm9uLWZ1bmN0aW9uIHR5cGUgaXMgcGFzc2VkIGluLCBhbiBpbnZhbGlkIHR5cGUgaXMgcmV0dXJuZWQuCiAgKi8KIENJTkRFWF9MSU5LQUdFIENYVHlwZSBjbGFuZ19nZXRSZXN1bHRUeXBlKENYVHlwZSBUKTsKIAogLyoqCi0gKiBcYnJpZWYgUmV0cmlldmUgdGhlIG51bWJlciBvZiBub24tdmFyaWFkaWMgYXJndW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhCisgKiBcYnJpZWYgUmV0cmlldmUgdGhlIG51bWJlciBvZiBub24tdmFyaWFkaWMgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggYQogICogZnVuY3Rpb24gdHlwZS4KICAqCiAgKiBJZiBhIG5vbi1mdW5jdGlvbiB0eXBlIGlzIHBhc3NlZCBpbiwgLTEgaXMgcmV0dXJuZWQuCkBAIC0yODY5LDcgKzI5NDQsNyBAQAogQ0lOREVYX0xJTktBR0UgaW50IGNsYW5nX2dldE51bUFyZ1R5cGVzKENYVHlwZSBUKTsKIAogLyoqCi0gKiBcYnJpZWYgUmV0cmlldmUgdGhlIHR5cGUgb2YgYW4gYXJndW1lbnQgb2YgYSBmdW5jdGlvbiB0eXBlLgorICogXGJyaWVmIFJldHJpZXZlIHRoZSB0eXBlIG9mIGEgcGFyYW1ldGVyIG9mIGEgZnVuY3Rpb24gdHlwZS4KICAqCiAgKiBJZiBhIG5vbi1mdW5jdGlvbiB0eXBlIGlzIHBhc3NlZCBpbiBvciB0aGUgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBlbm91Z2gKICAqIHBhcmFtZXRlcnMsIGFuIGludmFsaWQgdHlwZSBpcyByZXR1cm5lZC4KQEAgLTI4ODIsNyArMjk1Nyw3IEBACiBDSU5ERVhfTElOS0FHRSB1bnNpZ25lZCBjbGFuZ19pc0Z1bmN0aW9uVHlwZVZhcmlhZGljKENYVHlwZSBUKTsKIAogLyoqCi0gKiBcYnJpZWYgUmV0cmlldmUgdGhlIHJlc3VsdCB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGN1cnNvci4KKyAqIFxicmllZiBSZXRyaWV2ZSB0aGUgcmV0dXJuIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gY3Vyc29yLgogICoKICAqIFRoaXMgb25seSByZXR1cm5zIGEgdmFsaWQgdHlwZSBpZiB0aGUgY3Vyc29yIHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIG1ldGhvZC4KICAqLwpAQCAtMzAxMiw2ICszMDg3LDI0IEBACiB9OwogCiAvKioKKyAqIFxicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGVtcGxhdGUgYXJndW1lbnRzIGZvciBnaXZlbiBjbGFzcyB0ZW1wbGF0ZQorICogc3BlY2lhbGl6YXRpb24sIG9yIC0xIGlmIHR5cGUgXGMgVCBpcyBub3QgYSBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KKyAqCisgKiBWYXJpYWRpYyBhcmd1bWVudCBwYWNrcyBjb3VudCBhcyBvbmx5IG9uZSBhcmd1bWVudCwgYW5kIGNhbiBub3QgYmUgaW5zcGVjdGVkCisgKiBmdXJ0aGVyLgorICovCitDSU5ERVhfTElOS0FHRSBpbnQgY2xhbmdfVHlwZV9nZXROdW1UZW1wbGF0ZUFyZ3VtZW50cyhDWFR5cGUgVCk7CisKKy8qKgorICogXGJyaWVmIFJldHVybnMgdGhlIHR5cGUgdGVtcGxhdGUgYXJndW1lbnQgb2YgYSB0ZW1wbGF0ZSBjbGFzcyBzcGVjaWFsaXphdGlvbgorICogYXQgZ2l2ZW4gaW5kZXguCisgKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMgYW5kIGRvZXMgbm90IGhhbmRsZQorICogdGVtcGxhdGUgdGVtcGxhdGUgYXJndW1lbnRzIG9yIHZhcmlhZGljIHBhY2tzLgorICovCitDSU5ERVhfTElOS0FHRSBDWFR5cGUgY2xhbmdfVHlwZV9nZXRUZW1wbGF0ZUFyZ3VtZW50QXNUeXBlKENYVHlwZSBULCB1bnNpZ25lZCBpKTsKKworLyoqCiAgKiBcYnJpZWYgUmV0cmlldmUgdGhlIHJlZi1xdWFsaWZpZXIga2luZCBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZC4KICAqCiAgKiBUaGUgcmVmLXF1YWxpZmllciBpcyByZXR1cm5lZCBmb3IgQysrIGZ1bmN0aW9ucyBvciBtZXRob2RzLiBGb3Igb3RoZXIgdHlwZXMKQEAgLTU3NjMsMTEgKzU4NTYsMTIgQEAKICAqIFxwYXJhbSBpbmRleF9vcHRpb25zIEEgYml0bWFzayBvZiBvcHRpb25zIHRoYXQgYWZmZWN0cyBob3cgaW5kZXhpbmcgaXMKICAqIHBlcmZvcm1lZC4gVGhpcyBzaG91bGQgYmUgYSBiaXR3aXNlIE9SIG9mIHRoZSBDWEluZGV4T3B0X1hYWCBmbGFncy4KICAqCi0gKiBccGFyYW0gb3V0X1RVIFtvdXRdIHBvaW50ZXIgdG8gc3RvcmUgYSBDWFRyYW5zbGF0aW9uVW5pdCB0aGF0IGNhbiBiZSByZXVzZWQKLSAqIGFmdGVyIGluZGV4aW5nIGlzIGZpbmlzaGVkLiBTZXQgdG8gTlVMTCBpZiB5b3UgZG8gbm90IHJlcXVpcmUgaXQuCisgKiBccGFyYW1bb3V0XSBvdXRfVFUgcG9pbnRlciB0byBzdG9yZSBhIFxjIENYVHJhbnNsYXRpb25Vbml0IHRoYXQgY2FuIGJlCisgKiByZXVzZWQgYWZ0ZXIgaW5kZXhpbmcgaXMgZmluaXNoZWQuIFNldCB0byBcYyBOVUxMIGlmIHlvdSBkbyBub3QgcmVxdWlyZSBpdC4KICAqCi0gKiBccmV0dXJucyBJZiB0aGVyZSBpcyBhIGZhaWx1cmUgZnJvbSB3aGljaCB0aGUgdGhlcmUgaXMgbm8gcmVjb3ZlcnksIHJldHVybnMKLSAqIG5vbi16ZXJvLCBvdGhlcndpc2UgcmV0dXJucyAwLgorICogXHJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGlmIHRoZXJlIHdlcmUgZXJyb3JzIGZyb20gd2hpY2ggdGhlIGNvbXBpbGVyIGNvdWxkCisgKiByZWNvdmVyLiAgSWYgdGhlcmUgaXMgYSBmYWlsdXJlIGZyb20gd2hpY2ggdGhlIHRoZXJlIGlzIG5vIHJlY292ZXJ5LCByZXR1cm5zCisgKiBhIG5vbi16ZXJvIFxjIENYRXJyb3JDb2RlLgogICoKICAqIFRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyAjY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVJDTWlncmF0ZS9BUkNNVEFjdGlvbnMuaCBiL2luY2x1ZGUvY2xhbmcvQVJDTWlncmF0ZS9BUkNNVEFjdGlvbnMuaAppbmRleCA0NWM4YjRlLi5iM2U3NGI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FSQ01pZ3JhdGUvQVJDTVRBY3Rpb25zLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BUkNNaWdyYXRlL0FSQ01UQWN0aW9ucy5oCkBAIC0xMiwxNCArMTIsMTQgQEAKIAogI2luY2x1ZGUgImNsYW5nL0FSQ01pZ3JhdGUvRmlsZVJlbWFwcGVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb24uaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CiBuYW1lc3BhY2UgYXJjbXQgewogCiBjbGFzcyBDaGVja0FjdGlvbiA6IHB1YmxpYyBXcmFwcGVyRnJvbnRlbmRBY3Rpb24gewogcHJvdGVjdGVkOgotICB2aXJ0dWFsIGJvb2wgQmVnaW5JbnZvY2F0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJKTsKKyAgYm9vbCBCZWdpbkludm9jYXRpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIG92ZXJyaWRlOwogCiBwdWJsaWM6CiAgIENoZWNrQWN0aW9uKEZyb250ZW5kQWN0aW9uICpXcmFwcGVkQWN0aW9uKTsKQEAgLTI3LDcgKzI3LDcgQEAKIAogY2xhc3MgTW9kaWZ5QWN0aW9uIDogcHVibGljIFdyYXBwZXJGcm9udGVuZEFjdGlvbiB7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgYm9vbCBCZWdpbkludm9jYXRpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpOworICBib29sIEJlZ2luSW52b2NhdGlvbihDb21waWxlckluc3RhbmNlICZDSSkgb3ZlcnJpZGU7CiAKIHB1YmxpYzoKICAgTW9kaWZ5QWN0aW9uKEZyb250ZW5kQWN0aW9uICpXcmFwcGVkQWN0aW9uKTsKQEAgLTM2LDkgKzM2LDkgQEAKIGNsYXNzIE1pZ3JhdGVTb3VyY2VBY3Rpb24gOiBwdWJsaWMgQVNURnJvbnRlbmRBY3Rpb24gewogICBGaWxlUmVtYXBwZXIgUmVtYXBwZXI7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgYm9vbCBCZWdpbkludm9jYXRpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpOwotICB2aXJ0dWFsIEFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSk7CisgIGJvb2wgQmVnaW5JbnZvY2F0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJKSBvdmVycmlkZTsKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBNaWdyYXRlQWN0aW9uIDogcHVibGljIFdyYXBwZXJGcm9udGVuZEFjdGlvbiB7CkBAIC00Niw3ICs0Niw3IEBACiAgIHN0ZDo6c3RyaW5nIFBsaXN0T3V0OwogICBib29sIEVtaXRQcmVtaWdyYXRpb25BUkNFcnJvczsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBib29sIEJlZ2luSW52b2NhdGlvbihDb21waWxlckluc3RhbmNlICZDSSk7CisgIGJvb2wgQmVnaW5JbnZvY2F0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJKSBvdmVycmlkZTsKIAogcHVibGljOgogICBNaWdyYXRlQWN0aW9uKEZyb250ZW5kQWN0aW9uICpXcmFwcGVkQWN0aW9uLCBTdHJpbmdSZWYgbWlncmF0ZURpciwKQEAgLTY1LDggKzY1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbWlncmF0ZUFjdGlvbik7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksU3RyaW5nUmVmIEluRmlsZSk7Ci0gIHZpcnR1YWwgYm9vbCBCZWdpbkludm9jYXRpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpOworICBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKKyAgYm9vbCBCZWdpbkludm9jYXRpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIG92ZXJyaWRlOwogfTsKIAogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BUkNNaWdyYXRlL0ZpbGVSZW1hcHBlci5oIGIvaW5jbHVkZS9jbGFuZy9BUkNNaWdyYXRlL0ZpbGVSZW1hcHBlci5oCmluZGV4IGY3Njc3Y2MuLmZiMmZkZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVJDTWlncmF0ZS9GaWxlUmVtYXBwZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FSQ01pZ3JhdGUvRmlsZVJlbWFwcGVyLmgKQEAgLTEyLDkgKzEyLDkgQEAKIAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGxsdm0gewogICBjbGFzcyBNZW1vcnlCdWZmZXI7CkBAIC0zMCw3ICszMCw3IEBACiAKIGNsYXNzIEZpbGVSZW1hcHBlciB7CiAgIC8vIEZJWE1FOiBSZXVzZSB0aGUgc2FtZSBGaWxlTWFuYWdlciBmb3IgbXVsdGlwbGUgQVNUQ29udGV4dHMuCi0gIE93bmluZ1B0cjxGaWxlTWFuYWdlcj4gRmlsZU1ncjsKKyAgc3RkOjp1bmlxdWVfcHRyPEZpbGVNYW5hZ2VyPiBGaWxlTWdyOwogCiAgIHR5cGVkZWYgbGx2bTo6UG9pbnRlclVuaW9uPGNvbnN0IEZpbGVFbnRyeSAqLCBsbHZtOjpNZW1vcnlCdWZmZXIgKj4gVGFyZ2V0OwogICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpbGVFbnRyeSAqLCBUYXJnZXQ+IE1hcHBpbmdzVHk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9BUFZhbHVlLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9BUFZhbHVlLmgKaW5kZXggYjRmZDJhZi4uMDc5ZjI1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvQVBWYWx1ZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL0FQVmFsdWUuaApAQCAtMTA4LDM0ICsxMDgsMzMgQEAKICAgfTsKICAgc3RydWN0IE1lbWJlclBvaW50ZXJEYXRhOwogCi0gIGVudW0gewotICAgIE1heFNpemUgPSAoc2l6ZW9mKENvbXBsZXhBUFNJbnQpID4gc2l6ZW9mKENvbXBsZXhBUEZsb2F0KSA/Ci0gICAgICAgICAgICAgICBzaXplb2YoQ29tcGxleEFQU0ludCkgOiBzaXplb2YoQ29tcGxleEFQRmxvYXQpKQotICB9OworICAvLyBXZSBlbnN1cmUgZWxzZXdoZXJlIHRoYXQgRGF0YSBpcyBiaWcgZW5vdWdoIGZvciBMViBhbmQgTWVtYmVyUG9pbnRlckRhdGEuCisgIHR5cGVkZWYgbGx2bTo6QWxpZ25lZENoYXJBcnJheVVuaW9uPHZvaWQgKiwgQVBTSW50LCBBUEZsb2F0LCBDb21wbGV4QVBTSW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV4QVBGbG9hdCwgVmVjLCBBcnIsIFN0cnVjdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaW9uRGF0YSwgQWRkckxhYmVsRGlmZkRhdGE+IERhdGFUeXBlOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IERhdGFTaXplID0gc2l6ZW9mKERhdGFUeXBlKTsKIAotICB1bmlvbiB7Ci0gICAgdm9pZCAqQWxpZ25lcjsKLSAgICBjaGFyIERhdGFbTWF4U2l6ZV07Ci0gIH07CisgIERhdGFUeXBlIERhdGE7CiAKIHB1YmxpYzoKICAgQVBWYWx1ZSgpIDogS2luZChVbmluaXRpYWxpemVkKSB7fQotICBleHBsaWNpdCBBUFZhbHVlKGNvbnN0IEFQU0ludCAmSSkgOiBLaW5kKFVuaW5pdGlhbGl6ZWQpIHsKLSAgICBNYWtlSW50KCk7IHNldEludChJKTsKKyAgZXhwbGljaXQgQVBWYWx1ZShBUFNJbnQgSSkgOiBLaW5kKFVuaW5pdGlhbGl6ZWQpIHsKKyAgICBNYWtlSW50KCk7IHNldEludChzdGQ6Om1vdmUoSSkpOwogICB9Ci0gIGV4cGxpY2l0IEFQVmFsdWUoY29uc3QgQVBGbG9hdCAmRikgOiBLaW5kKFVuaW5pdGlhbGl6ZWQpIHsKLSAgICBNYWtlRmxvYXQoKTsgc2V0RmxvYXQoRik7CisgIGV4cGxpY2l0IEFQVmFsdWUoQVBGbG9hdCBGKSA6IEtpbmQoVW5pbml0aWFsaXplZCkgeworICAgIE1ha2VGbG9hdCgpOyBzZXRGbG9hdChzdGQ6Om1vdmUoRikpOwogICB9CiAgIGV4cGxpY2l0IEFQVmFsdWUoY29uc3QgQVBWYWx1ZSAqRSwgdW5zaWduZWQgTikgOiBLaW5kKFVuaW5pdGlhbGl6ZWQpIHsKICAgICBNYWtlVmVjdG9yKCk7IHNldFZlY3RvcihFLCBOKTsKICAgfQotICBBUFZhbHVlKGNvbnN0IEFQU0ludCAmUiwgY29uc3QgQVBTSW50ICZJKSA6IEtpbmQoVW5pbml0aWFsaXplZCkgewotICAgIE1ha2VDb21wbGV4SW50KCk7IHNldENvbXBsZXhJbnQoUiwgSSk7CisgIEFQVmFsdWUoQVBTSW50IFIsIEFQU0ludCBJKSA6IEtpbmQoVW5pbml0aWFsaXplZCkgeworICAgIE1ha2VDb21wbGV4SW50KCk7IHNldENvbXBsZXhJbnQoc3RkOjptb3ZlKFIpLCBzdGQ6Om1vdmUoSSkpOwogICB9Ci0gIEFQVmFsdWUoY29uc3QgQVBGbG9hdCAmUiwgY29uc3QgQVBGbG9hdCAmSSkgOiBLaW5kKFVuaW5pdGlhbGl6ZWQpIHsKLSAgICBNYWtlQ29tcGxleEZsb2F0KCk7IHNldENvbXBsZXhGbG9hdChSLCBJKTsKKyAgQVBWYWx1ZShBUEZsb2F0IFIsIEFQRmxvYXQgSSkgOiBLaW5kKFVuaW5pdGlhbGl6ZWQpIHsKKyAgICBNYWtlQ29tcGxleEZsb2F0KCk7IHNldENvbXBsZXhGbG9hdChzdGQ6Om1vdmUoUiksIHN0ZDo6bW92ZShJKSk7CiAgIH0KICAgQVBWYWx1ZShjb25zdCBBUFZhbHVlICZSSFMpOworICBBUFZhbHVlKEFQVmFsdWUgJiZSSFMpIDogS2luZChVbmluaXRpYWxpemVkKSB7IHN3YXAoUkhTKTsgfQogICBBUFZhbHVlKExWYWx1ZUJhc2UgQiwgY29uc3QgQ2hhclVuaXRzICZPLCBOb0xWYWx1ZVBhdGggTiwgdW5zaWduZWQgQ2FsbEluZGV4KQogICAgICAgOiBLaW5kKFVuaW5pdGlhbGl6ZWQpIHsKICAgICBNYWtlTFZhbHVlKCk7IHNldExWYWx1ZShCLCBPLCBOLCBDYWxsSW5kZXgpOwpAQCAtMjAwLDcgKzE5OSw3IEBACiAKICAgQVBTSW50ICZnZXRJbnQoKSB7CiAgICAgYXNzZXJ0KGlzSW50KCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKLSAgICByZXR1cm4gKihBUFNJbnQqKShjaGFyKilEYXRhOworICAgIHJldHVybiAqKEFQU0ludCopKGNoYXIqKURhdGEuYnVmZmVyOwogICB9CiAgIGNvbnN0IEFQU0ludCAmZ2V0SW50KCkgY29uc3QgewogICAgIHJldHVybiBjb25zdF9jYXN0PEFQVmFsdWUqPih0aGlzKS0+Z2V0SW50KCk7CkBAIC0yMDgsNyArMjA3LDcgQEAKIAogICBBUEZsb2F0ICZnZXRGbG9hdCgpIHsKICAgICBhc3NlcnQoaXNGbG9hdCgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gICAgcmV0dXJuICooQVBGbG9hdCopKGNoYXIqKURhdGE7CisgICAgcmV0dXJuICooQVBGbG9hdCopKGNoYXIqKURhdGEuYnVmZmVyOwogICB9CiAgIGNvbnN0IEFQRmxvYXQgJmdldEZsb2F0KCkgY29uc3QgewogICAgIHJldHVybiBjb25zdF9jYXN0PEFQVmFsdWUqPih0aGlzKS0+Z2V0RmxvYXQoKTsKQEAgLTIxNiw3ICsyMTUsNyBAQAogCiAgIEFQU0ludCAmZ2V0Q29tcGxleEludFJlYWwoKSB7CiAgICAgYXNzZXJ0KGlzQ29tcGxleEludCgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gICAgcmV0dXJuICgoQ29tcGxleEFQU0ludCopKGNoYXIqKURhdGEpLT5SZWFsOworICAgIHJldHVybiAoKENvbXBsZXhBUFNJbnQqKShjaGFyKilEYXRhLmJ1ZmZlciktPlJlYWw7CiAgIH0KICAgY29uc3QgQVBTSW50ICZnZXRDb21wbGV4SW50UmVhbCgpIGNvbnN0IHsKICAgICByZXR1cm4gY29uc3RfY2FzdDxBUFZhbHVlKj4odGhpcyktPmdldENvbXBsZXhJbnRSZWFsKCk7CkBAIC0yMjQsNyArMjIzLDcgQEAKIAogICBBUFNJbnQgJmdldENvbXBsZXhJbnRJbWFnKCkgewogICAgIGFzc2VydChpc0NvbXBsZXhJbnQoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICAgIHJldHVybiAoKENvbXBsZXhBUFNJbnQqKShjaGFyKilEYXRhKS0+SW1hZzsKKyAgICByZXR1cm4gKChDb21wbGV4QVBTSW50KikoY2hhciopRGF0YS5idWZmZXIpLT5JbWFnOwogICB9CiAgIGNvbnN0IEFQU0ludCAmZ2V0Q29tcGxleEludEltYWcoKSBjb25zdCB7CiAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QVBWYWx1ZSo+KHRoaXMpLT5nZXRDb21wbGV4SW50SW1hZygpOwpAQCAtMjMyLDcgKzIzMSw3IEBACiAKICAgQVBGbG9hdCAmZ2V0Q29tcGxleEZsb2F0UmVhbCgpIHsKICAgICBhc3NlcnQoaXNDb21wbGV4RmxvYXQoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICAgIHJldHVybiAoKENvbXBsZXhBUEZsb2F0KikoY2hhciopRGF0YSktPlJlYWw7CisgICAgcmV0dXJuICgoQ29tcGxleEFQRmxvYXQqKShjaGFyKilEYXRhLmJ1ZmZlciktPlJlYWw7CiAgIH0KICAgY29uc3QgQVBGbG9hdCAmZ2V0Q29tcGxleEZsb2F0UmVhbCgpIGNvbnN0IHsKICAgICByZXR1cm4gY29uc3RfY2FzdDxBUFZhbHVlKj4odGhpcyktPmdldENvbXBsZXhGbG9hdFJlYWwoKTsKQEAgLTI0MCw3ICsyMzksNyBAQAogCiAgIEFQRmxvYXQgJmdldENvbXBsZXhGbG9hdEltYWcoKSB7CiAgICAgYXNzZXJ0KGlzQ29tcGxleEZsb2F0KCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKLSAgICByZXR1cm4gKChDb21wbGV4QVBGbG9hdCopKGNoYXIqKURhdGEpLT5JbWFnOworICAgIHJldHVybiAoKENvbXBsZXhBUEZsb2F0KikoY2hhciopRGF0YS5idWZmZXIpLT5JbWFnOwogICB9CiAgIGNvbnN0IEFQRmxvYXQgJmdldENvbXBsZXhGbG9hdEltYWcoKSBjb25zdCB7CiAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QVBWYWx1ZSo+KHRoaXMpLT5nZXRDb21wbGV4RmxvYXRJbWFnKCk7CkBAIC0yNTksMjAgKzI1OCwyMCBAQAogICBBUFZhbHVlICZnZXRWZWN0b3JFbHQodW5zaWduZWQgSSkgewogICAgIGFzc2VydChpc1ZlY3RvcigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CiAgICAgYXNzZXJ0KEkgPCBnZXRWZWN0b3JMZW5ndGgoKSAmJiAiSW5kZXggb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuICgoVmVjKikoY2hhciopRGF0YSktPkVsdHNbSV07CisgICAgcmV0dXJuICgoVmVjKikoY2hhciopRGF0YS5idWZmZXIpLT5FbHRzW0ldOwogICB9CiAgIGNvbnN0IEFQVmFsdWUgJmdldFZlY3RvckVsdCh1bnNpZ25lZCBJKSBjb25zdCB7CiAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QVBWYWx1ZSo+KHRoaXMpLT5nZXRWZWN0b3JFbHQoSSk7CiAgIH0KICAgdW5zaWduZWQgZ2V0VmVjdG9yTGVuZ3RoKCkgY29uc3QgewogICAgIGFzc2VydChpc1ZlY3RvcigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gICAgcmV0dXJuICgoY29uc3QgVmVjKikoY29uc3Qgdm9pZCAqKURhdGEpLT5OdW1FbHRzOworICAgIHJldHVybiAoKGNvbnN0IFZlYyopKGNvbnN0IHZvaWQgKilEYXRhLmJ1ZmZlciktPk51bUVsdHM7CiAgIH0KIAogICBBUFZhbHVlICZnZXRBcnJheUluaXRpYWxpemVkRWx0KHVuc2lnbmVkIEkpIHsKICAgICBhc3NlcnQoaXNBcnJheSgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7CiAgICAgYXNzZXJ0KEkgPCBnZXRBcnJheUluaXRpYWxpemVkRWx0cygpICYmICJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKLSAgICByZXR1cm4gKChBcnIqKShjaGFyKilEYXRhKS0+RWx0c1tJXTsKKyAgICByZXR1cm4gKChBcnIqKShjaGFyKilEYXRhLmJ1ZmZlciktPkVsdHNbSV07CiAgIH0KICAgY29uc3QgQVBWYWx1ZSAmZ2V0QXJyYXlJbml0aWFsaXplZEVsdCh1bnNpZ25lZCBJKSBjb25zdCB7CiAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QVBWYWx1ZSo+KHRoaXMpLT5nZXRBcnJheUluaXRpYWxpemVkRWx0KEkpOwpAQCAtMjgzLDM1ICsyODIsMzUgQEAKICAgQVBWYWx1ZSAmZ2V0QXJyYXlGaWxsZXIoKSB7CiAgICAgYXNzZXJ0KGlzQXJyYXkoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwogICAgIGFzc2VydChoYXNBcnJheUZpbGxlcigpICYmICJObyBhcnJheSBmaWxsZXIiKTsKLSAgICByZXR1cm4gKChBcnIqKShjaGFyKilEYXRhKS0+RWx0c1tnZXRBcnJheUluaXRpYWxpemVkRWx0cygpXTsKKyAgICByZXR1cm4gKChBcnIqKShjaGFyKilEYXRhLmJ1ZmZlciktPkVsdHNbZ2V0QXJyYXlJbml0aWFsaXplZEVsdHMoKV07CiAgIH0KICAgY29uc3QgQVBWYWx1ZSAmZ2V0QXJyYXlGaWxsZXIoKSBjb25zdCB7CiAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QVBWYWx1ZSo+KHRoaXMpLT5nZXRBcnJheUZpbGxlcigpOwogICB9CiAgIHVuc2lnbmVkIGdldEFycmF5SW5pdGlhbGl6ZWRFbHRzKCkgY29uc3QgewogICAgIGFzc2VydChpc0FycmF5KCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKLSAgICByZXR1cm4gKChjb25zdCBBcnIqKShjb25zdCB2b2lkICopRGF0YSktPk51bUVsdHM7CisgICAgcmV0dXJuICgoY29uc3QgQXJyKikoY29uc3Qgdm9pZCAqKURhdGEuYnVmZmVyKS0+TnVtRWx0czsKICAgfQogICB1bnNpZ25lZCBnZXRBcnJheVNpemUoKSBjb25zdCB7CiAgICAgYXNzZXJ0KGlzQXJyYXkoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICAgIHJldHVybiAoKGNvbnN0IEFyciopKGNvbnN0IHZvaWQgKilEYXRhKS0+QXJyU2l6ZTsKKyAgICByZXR1cm4gKChjb25zdCBBcnIqKShjb25zdCB2b2lkICopRGF0YS5idWZmZXIpLT5BcnJTaXplOwogICB9CiAKICAgdW5zaWduZWQgZ2V0U3RydWN0TnVtQmFzZXMoKSBjb25zdCB7CiAgICAgYXNzZXJ0KGlzU3RydWN0KCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKLSAgICByZXR1cm4gKChjb25zdCBTdHJ1Y3REYXRhKikoY29uc3QgY2hhciopRGF0YSktPk51bUJhc2VzOworICAgIHJldHVybiAoKGNvbnN0IFN0cnVjdERhdGEqKShjb25zdCBjaGFyKilEYXRhLmJ1ZmZlciktPk51bUJhc2VzOwogICB9CiAgIHVuc2lnbmVkIGdldFN0cnVjdE51bUZpZWxkcygpIGNvbnN0IHsKICAgICBhc3NlcnQoaXNTdHJ1Y3QoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICAgIHJldHVybiAoKGNvbnN0IFN0cnVjdERhdGEqKShjb25zdCBjaGFyKilEYXRhKS0+TnVtRmllbGRzOworICAgIHJldHVybiAoKGNvbnN0IFN0cnVjdERhdGEqKShjb25zdCBjaGFyKilEYXRhLmJ1ZmZlciktPk51bUZpZWxkczsKICAgfQogICBBUFZhbHVlICZnZXRTdHJ1Y3RCYXNlKHVuc2lnbmVkIGkpIHsKICAgICBhc3NlcnQoaXNTdHJ1Y3QoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICAgIHJldHVybiAoKFN0cnVjdERhdGEqKShjaGFyKilEYXRhKS0+RWx0c1tpXTsKKyAgICByZXR1cm4gKChTdHJ1Y3REYXRhKikoY2hhciopRGF0YS5idWZmZXIpLT5FbHRzW2ldOwogICB9CiAgIEFQVmFsdWUgJmdldFN0cnVjdEZpZWxkKHVuc2lnbmVkIGkpIHsKICAgICBhc3NlcnQoaXNTdHJ1Y3QoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICAgIHJldHVybiAoKFN0cnVjdERhdGEqKShjaGFyKilEYXRhKS0+RWx0c1tnZXRTdHJ1Y3ROdW1CYXNlcygpICsgaV07CisgICAgcmV0dXJuICgoU3RydWN0RGF0YSopKGNoYXIqKURhdGEuYnVmZmVyKS0+RWx0c1tnZXRTdHJ1Y3ROdW1CYXNlcygpICsgaV07CiAgIH0KICAgY29uc3QgQVBWYWx1ZSAmZ2V0U3RydWN0QmFzZSh1bnNpZ25lZCBpKSBjb25zdCB7CiAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QVBWYWx1ZSo+KHRoaXMpLT5nZXRTdHJ1Y3RCYXNlKGkpOwpAQCAtMzIyLDExICszMjEsMTEgQEAKIAogICBjb25zdCBGaWVsZERlY2wgKmdldFVuaW9uRmllbGQoKSBjb25zdCB7CiAgICAgYXNzZXJ0KGlzVW5pb24oKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICAgIHJldHVybiAoKGNvbnN0IFVuaW9uRGF0YSopKGNvbnN0IGNoYXIqKURhdGEpLT5GaWVsZDsKKyAgICByZXR1cm4gKChjb25zdCBVbmlvbkRhdGEqKShjb25zdCBjaGFyKilEYXRhLmJ1ZmZlciktPkZpZWxkOwogICB9CiAgIEFQVmFsdWUgJmdldFVuaW9uVmFsdWUoKSB7CiAgICAgYXNzZXJ0KGlzVW5pb24oKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICAgIHJldHVybiAqKChVbmlvbkRhdGEqKShjaGFyKilEYXRhKS0+VmFsdWU7CisgICAgcmV0dXJuICooKFVuaW9uRGF0YSopKGNoYXIqKURhdGEuYnVmZmVyKS0+VmFsdWU7CiAgIH0KICAgY29uc3QgQVBWYWx1ZSAmZ2V0VW5pb25WYWx1ZSgpIGNvbnN0IHsKICAgICByZXR1cm4gY29uc3RfY2FzdDxBUFZhbHVlKj4odGhpcyktPmdldFVuaW9uVmFsdWUoKTsKQEAgLTMzOCw0MSArMzM3LDQxIEBACiAKICAgY29uc3QgQWRkckxhYmVsRXhwciogZ2V0QWRkckxhYmVsRGlmZkxIUygpIGNvbnN0IHsKICAgICBhc3NlcnQoaXNBZGRyTGFiZWxEaWZmKCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKLSAgICByZXR1cm4gKChjb25zdCBBZGRyTGFiZWxEaWZmRGF0YSopKGNvbnN0IGNoYXIqKURhdGEpLT5MSFNFeHByOworICAgIHJldHVybiAoKGNvbnN0IEFkZHJMYWJlbERpZmZEYXRhKikoY29uc3QgY2hhciopRGF0YS5idWZmZXIpLT5MSFNFeHByOwogICB9CiAgIGNvbnN0IEFkZHJMYWJlbEV4cHIqIGdldEFkZHJMYWJlbERpZmZSSFMoKSBjb25zdCB7CiAgICAgYXNzZXJ0KGlzQWRkckxhYmVsRGlmZigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gICAgcmV0dXJuICgoY29uc3QgQWRkckxhYmVsRGlmZkRhdGEqKShjb25zdCBjaGFyKilEYXRhKS0+UkhTRXhwcjsKKyAgICByZXR1cm4gKChjb25zdCBBZGRyTGFiZWxEaWZmRGF0YSopKGNvbnN0IGNoYXIqKURhdGEuYnVmZmVyKS0+UkhTRXhwcjsKICAgfQogCi0gIHZvaWQgc2V0SW50KGNvbnN0IEFQU0ludCAmSSkgeworICB2b2lkIHNldEludChBUFNJbnQgSSkgewogICAgIGFzc2VydChpc0ludCgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gICAgKihBUFNJbnQqKShjaGFyKilEYXRhID0gSTsKKyAgICAqKEFQU0ludCAqKShjaGFyICopRGF0YS5idWZmZXIgPSBzdGQ6Om1vdmUoSSk7CiAgIH0KLSAgdm9pZCBzZXRGbG9hdChjb25zdCBBUEZsb2F0ICZGKSB7CisgIHZvaWQgc2V0RmxvYXQoQVBGbG9hdCBGKSB7CiAgICAgYXNzZXJ0KGlzRmxvYXQoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICAgICooQVBGbG9hdCopKGNoYXIqKURhdGEgPSBGOworICAgICooQVBGbG9hdCAqKShjaGFyICopRGF0YS5idWZmZXIgPSBzdGQ6Om1vdmUoRik7CiAgIH0KICAgdm9pZCBzZXRWZWN0b3IoY29uc3QgQVBWYWx1ZSAqRSwgdW5zaWduZWQgTikgewogICAgIGFzc2VydChpc1ZlY3RvcigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gICAgKChWZWMqKShjaGFyKilEYXRhKS0+RWx0cyA9IG5ldyBBUFZhbHVlW05dOwotICAgICgoVmVjKikoY2hhciopRGF0YSktPk51bUVsdHMgPSBOOworICAgICgoVmVjKikoY2hhciopRGF0YS5idWZmZXIpLT5FbHRzID0gbmV3IEFQVmFsdWVbTl07CisgICAgKChWZWMqKShjaGFyKilEYXRhLmJ1ZmZlciktPk51bUVsdHMgPSBOOwogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTjsgKytpKQotICAgICAgKChWZWMqKShjaGFyKilEYXRhKS0+RWx0c1tpXSA9IEVbaV07CisgICAgICAoKFZlYyopKGNoYXIqKURhdGEuYnVmZmVyKS0+RWx0c1tpXSA9IEVbaV07CiAgIH0KLSAgdm9pZCBzZXRDb21wbGV4SW50KGNvbnN0IEFQU0ludCAmUiwgY29uc3QgQVBTSW50ICZJKSB7CisgIHZvaWQgc2V0Q29tcGxleEludChBUFNJbnQgUiwgQVBTSW50IEkpIHsKICAgICBhc3NlcnQoUi5nZXRCaXRXaWR0aCgpID09IEkuZ2V0Qml0V2lkdGgoKSAmJgogICAgICAgICAgICAiSW52YWxpZCBjb21wbGV4IGludCAodHlwZSBtaXNtYXRjaCkuIik7CiAgICAgYXNzZXJ0KGlzQ29tcGxleEludCgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gICAgKChDb21wbGV4QVBTSW50KikoY2hhciopRGF0YSktPlJlYWwgPSBSOwotICAgICgoQ29tcGxleEFQU0ludCopKGNoYXIqKURhdGEpLT5JbWFnID0gSTsKKyAgICAoKENvbXBsZXhBUFNJbnQgKikoY2hhciAqKURhdGEuYnVmZmVyKS0+UmVhbCA9IHN0ZDo6bW92ZShSKTsKKyAgICAoKENvbXBsZXhBUFNJbnQgKikoY2hhciAqKURhdGEuYnVmZmVyKS0+SW1hZyA9IHN0ZDo6bW92ZShJKTsKICAgfQotICB2b2lkIHNldENvbXBsZXhGbG9hdChjb25zdCBBUEZsb2F0ICZSLCBjb25zdCBBUEZsb2F0ICZJKSB7CisgIHZvaWQgc2V0Q29tcGxleEZsb2F0KEFQRmxvYXQgUiwgQVBGbG9hdCBJKSB7CiAgICAgYXNzZXJ0KCZSLmdldFNlbWFudGljcygpID09ICZJLmdldFNlbWFudGljcygpICYmCiAgICAgICAgICAgICJJbnZhbGlkIGNvbXBsZXggZmxvYXQgKHR5cGUgbWlzbWF0Y2gpLiIpOwogICAgIGFzc2VydChpc0NvbXBsZXhGbG9hdCgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gICAgKChDb21wbGV4QVBGbG9hdCopKGNoYXIqKURhdGEpLT5SZWFsID0gUjsKLSAgICAoKENvbXBsZXhBUEZsb2F0KikoY2hhciopRGF0YSktPkltYWcgPSBJOworICAgICgoQ29tcGxleEFQRmxvYXQgKikoY2hhciAqKURhdGEuYnVmZmVyKS0+UmVhbCA9IHN0ZDo6bW92ZShSKTsKKyAgICAoKENvbXBsZXhBUEZsb2F0ICopKGNoYXIgKilEYXRhLmJ1ZmZlciktPkltYWcgPSBzdGQ6Om1vdmUoSSk7CiAgIH0KICAgdm9pZCBzZXRMVmFsdWUoTFZhbHVlQmFzZSBCLCBjb25zdCBDaGFyVW5pdHMgJk8sIE5vTFZhbHVlUGF0aCwKICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2FsbEluZGV4KTsKQEAgLTM4MSwxMyArMzgwLDEzIEBACiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENhbGxJbmRleCk7CiAgIHZvaWQgc2V0VW5pb24oY29uc3QgRmllbGREZWNsICpGaWVsZCwgY29uc3QgQVBWYWx1ZSAmVmFsdWUpIHsKICAgICBhc3NlcnQoaXNVbmlvbigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gICAgKChVbmlvbkRhdGEqKShjaGFyKilEYXRhKS0+RmllbGQgPSBGaWVsZDsKLSAgICAqKChVbmlvbkRhdGEqKShjaGFyKilEYXRhKS0+VmFsdWUgPSBWYWx1ZTsKKyAgICAoKFVuaW9uRGF0YSopKGNoYXIqKURhdGEuYnVmZmVyKS0+RmllbGQgPSBGaWVsZDsKKyAgICAqKChVbmlvbkRhdGEqKShjaGFyKilEYXRhLmJ1ZmZlciktPlZhbHVlID0gVmFsdWU7CiAgIH0KICAgdm9pZCBzZXRBZGRyTGFiZWxEaWZmKGNvbnN0IEFkZHJMYWJlbEV4cHIqIExIU0V4cHIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBZGRyTGFiZWxFeHByKiBSSFNFeHByKSB7Ci0gICAgKChBZGRyTGFiZWxEaWZmRGF0YSopKGNoYXIqKURhdGEpLT5MSFNFeHByID0gTEhTRXhwcjsKLSAgICAoKEFkZHJMYWJlbERpZmZEYXRhKikoY2hhciopRGF0YSktPlJIU0V4cHIgPSBSSFNFeHByOworICAgICgoQWRkckxhYmVsRGlmZkRhdGEqKShjaGFyKilEYXRhLmJ1ZmZlciktPkxIU0V4cHIgPSBMSFNFeHByOworICAgICgoQWRkckxhYmVsRGlmZkRhdGEqKShjaGFyKilEYXRhLmJ1ZmZlciktPlJIU0V4cHIgPSBSSFNFeHByOwogICB9CiAKICAgLy8vIEFzc2lnbiBieSBzd2FwcGluZyBmcm9tIGEgY29weSBvZiB0aGUgUkhTLgpAQCAtNDA0LDQ2ICs0MDMsNDYgQEAKICAgfQogICB2b2lkIE1ha2VJbnQoKSB7CiAgICAgYXNzZXJ0KGlzVW5pbml0KCkgJiYgIkJhZCBzdGF0ZSBjaGFuZ2UiKTsKLSAgICBuZXcgKCh2b2lkKilEYXRhKSBBUFNJbnQoMSk7CisgICAgbmV3ICgodm9pZCopRGF0YS5idWZmZXIpIEFQU0ludCgxKTsKICAgICBLaW5kID0gSW50OwogICB9CiAgIHZvaWQgTWFrZUZsb2F0KCkgewogICAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7Ci0gICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEpIEFQRmxvYXQoMC4wKTsKKyAgICBuZXcgKCh2b2lkKikoY2hhciopRGF0YS5idWZmZXIpIEFQRmxvYXQoMC4wKTsKICAgICBLaW5kID0gRmxvYXQ7CiAgIH0KICAgdm9pZCBNYWtlVmVjdG9yKCkgewogICAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7Ci0gICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEpIFZlYygpOworICAgIG5ldyAoKHZvaWQqKShjaGFyKilEYXRhLmJ1ZmZlcikgVmVjKCk7CiAgICAgS2luZCA9IFZlY3RvcjsKICAgfQogICB2b2lkIE1ha2VDb21wbGV4SW50KCkgewogICAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7Ci0gICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEpIENvbXBsZXhBUFNJbnQoKTsKKyAgICBuZXcgKCh2b2lkKikoY2hhciopRGF0YS5idWZmZXIpIENvbXBsZXhBUFNJbnQoKTsKICAgICBLaW5kID0gQ29tcGxleEludDsKICAgfQogICB2b2lkIE1ha2VDb21wbGV4RmxvYXQoKSB7CiAgICAgYXNzZXJ0KGlzVW5pbml0KCkgJiYgIkJhZCBzdGF0ZSBjaGFuZ2UiKTsKLSAgICBuZXcgKCh2b2lkKikoY2hhciopRGF0YSkgQ29tcGxleEFQRmxvYXQoKTsKKyAgICBuZXcgKCh2b2lkKikoY2hhciopRGF0YS5idWZmZXIpIENvbXBsZXhBUEZsb2F0KCk7CiAgICAgS2luZCA9IENvbXBsZXhGbG9hdDsKICAgfQogICB2b2lkIE1ha2VMVmFsdWUoKTsKICAgdm9pZCBNYWtlQXJyYXkodW5zaWduZWQgSW5pdEVsdHMsIHVuc2lnbmVkIFNpemUpOwogICB2b2lkIE1ha2VTdHJ1Y3QodW5zaWduZWQgQiwgdW5zaWduZWQgTSkgewogICAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7Ci0gICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEpIFN0cnVjdERhdGEoQiwgTSk7CisgICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEuYnVmZmVyKSBTdHJ1Y3REYXRhKEIsIE0pOwogICAgIEtpbmQgPSBTdHJ1Y3Q7CiAgIH0KICAgdm9pZCBNYWtlVW5pb24oKSB7CiAgICAgYXNzZXJ0KGlzVW5pbml0KCkgJiYgIkJhZCBzdGF0ZSBjaGFuZ2UiKTsKLSAgICBuZXcgKCh2b2lkKikoY2hhciopRGF0YSkgVW5pb25EYXRhKCk7CisgICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEuYnVmZmVyKSBVbmlvbkRhdGEoKTsKICAgICBLaW5kID0gVW5pb247CiAgIH0KICAgdm9pZCBNYWtlTWVtYmVyUG9pbnRlcihjb25zdCBWYWx1ZURlY2wgKk1lbWJlciwgYm9vbCBJc0Rlcml2ZWRNZW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgQ1hYUmVjb3JkRGVjbCo+IFBhdGgpOwogICB2b2lkIE1ha2VBZGRyTGFiZWxEaWZmKCkgewogICAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7Ci0gICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEpIEFkZHJMYWJlbERpZmZEYXRhKCk7CisgICAgbmV3ICgodm9pZCopKGNoYXIqKURhdGEuYnVmZmVyKSBBZGRyTGFiZWxEaWZmRGF0YSgpOwogICAgIEtpbmQgPSBBZGRyTGFiZWxEaWZmOwogICB9CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvQVNUQ29uc3VtZXIuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL0FTVENvbnN1bWVyLmgKaW5kZXggN2I2ZmE5NC4uNDVkMzA2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvQVNUQ29uc3VtZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9BU1RDb25zdW1lci5oCkBAIC0yMSw3ICsyMSw2IEBACiAgIGNsYXNzIENYWFJlY29yZERlY2w7CiAgIGNsYXNzIERlY2w7CiAgIGNsYXNzIERlY2xHcm91cFJlZjsKLSAgY2xhc3MgSGFuZGxlVGFnRGVjbERlZmluaXRpb247CiAgIGNsYXNzIEFTVE11dGF0aW9uTGlzdGVuZXI7CiAgIGNsYXNzIEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyOyAvLyBsYXllcmluZyB2aW9sYXRpb24gYmVjYXVzZSB2b2lkKiBpcyB1Z2x5CiAgIGNsYXNzIFNlbWFDb25zdW1lcjsgLy8gbGF5ZXJpbmcgdmlvbGF0aW9uIHJlcXVpcmVkIGZvciBzYWZlIFNlbWFDb25zdW1lcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvQVNUQ29udGV4dC5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvQVNUQ29udGV4dC5oCmluZGV4IGY0MjBlODUuLmNhMWE5MDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0FTVENvbnRleHQuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9BU1RDb250ZXh0LmgKQEAgLTMzLDEwICszMywxMCBAQAogI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvVGlueVB0clZlY3Rvci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgbGx2bSB7CkBAIC02Niw2ICs2Niw3IEBACiAgIGNsYXNzIFVucmVzb2x2ZWRTZXRJdGVyYXRvcjsKICAgY2xhc3MgVXNpbmdEZWNsOwogICBjbGFzcyBVc2luZ1NoYWRvd0RlY2w7CisgIGNsYXNzIFZUYWJsZUNvbnRleHRCYXNlOwogCiAgIG5hbWVzcGFjZSBCdWlsdGluIHsgY2xhc3MgQ29udGV4dDsgfQogCkBAIC04Miw3ICs4Myw3IEBACiAgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxFeHRRdWFscz4gRXh0UXVhbE5vZGVzOwogICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8Q29tcGxleFR5cGU+IENvbXBsZXhUeXBlczsKICAgbXV0YWJsZSBsbHZtOjpGb2xkaW5nU2V0PFBvaW50ZXJUeXBlPiBQb2ludGVyVHlwZXM7Ci0gIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxEZWNheWVkVHlwZT4gRGVjYXllZFR5cGVzOworICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8QWRqdXN0ZWRUeXBlPiBBZGp1c3RlZFR5cGVzOwogICBtdXRhYmxlIGxsdm06OkZvbGRpbmdTZXQ8QmxvY2tQb2ludGVyVHlwZT4gQmxvY2tQb2ludGVyVHlwZXM7CiAgIG11dGFibGUgbGx2bTo6Rm9sZGluZ1NldDxMVmFsdWVSZWZlcmVuY2VUeXBlPiBMVmFsdWVSZWZlcmVuY2VUeXBlczsKICAgbXV0YWJsZSBsbHZtOjpGb2xkaW5nU2V0PFJWYWx1ZVJlZmVyZW5jZVR5cGU+IFJWYWx1ZVJlZmVyZW5jZVR5cGVzOwpAQCAtMzY0LDYgKzM2NSw3IEBACiAgIC8vLyBcYnJpZWYgU2lkZS10YWJsZSBvZiBtYW5nbGluZyBudW1iZXJzIGZvciBkZWNsYXJhdGlvbnMgd2hpY2ggcmFyZWx5CiAgIC8vLyBuZWVkIHRoZW0gKGxpa2Ugc3RhdGljIGxvY2FsIHZhcnMpLgogICBsbHZtOjpEZW5zZU1hcDxjb25zdCBOYW1lZERlY2wgKiwgdW5zaWduZWQ+IE1hbmdsZU51bWJlcnM7CisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IFZhckRlY2wgKiwgdW5zaWduZWQ+IFN0YXRpY0xvY2FsTnVtYmVyczsKIAogICAvLy8gXGJyaWVmIE1hcHBpbmcgdGhhdCBzdG9yZXMgcGFyYW1ldGVySW5kZXggdmFsdWVzIGZvciBQYXJtVmFyRGVjbHMgd2hlbgogICAvLy8gdGhhdCB2YWx1ZSBleGNlZWRzIHRoZSBiaXRmaWVsZCBzaXplIG9mIFBhcm1WYXJEZWNsQml0cy5QYXJhbWV0ZXJJbmRleC4KQEAgLTM5Miw3ICszOTQsNyBAQAogICBQYXJ0aWFsRGlhZ25vc3RpYzo6U3RvcmFnZUFsbG9jYXRvciBEaWFnQWxsb2NhdG9yOwogCiAgIC8vLyBcYnJpZWYgVGhlIGN1cnJlbnQgQysrIEFCSS4KLSAgT3duaW5nUHRyPENYWEFCST4gQUJJOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hYQUJJPiBBQkk7CiAgIENYWEFCSSAqY3JlYXRlQ1hYQUJJKGNvbnN0IFRhcmdldEluZm8gJlQpOwogCiAgIC8vLyBcYnJpZWYgVGhlIGxvZ2ljYWwgLT4gcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBtYXAuCkBAIC00MTUsNyArNDE3LDcgQEAKICAgU2VsZWN0b3JUYWJsZSAmU2VsZWN0b3JzOwogICBCdWlsdGluOjpDb250ZXh0ICZCdWlsdGluSW5mbzsKICAgbXV0YWJsZSBEZWNsYXJhdGlvbk5hbWVUYWJsZSBEZWNsYXJhdGlvbk5hbWVzOwotICBPd25pbmdQdHI8RXh0ZXJuYWxBU1RTb3VyY2U+IEV4dGVybmFsU291cmNlOworICBJbnRydXNpdmVSZWZDbnRQdHI8RXh0ZXJuYWxBU1RTb3VyY2U+IEV4dGVybmFsU291cmNlOwogICBBU1RNdXRhdGlvbkxpc3RlbmVyICpMaXN0ZW5lcjsKIAogICAvLy8gXGJyaWVmIENvbnRhaW5zIHBhcmVudHMgb2YgYSBub2RlLgpAQCAtNjI0LDYgKzYyNiw0MyBAQAogcHJpdmF0ZToKICAgbXV0YWJsZSBjb21tZW50czo6Q29tbWFuZFRyYWl0cyBDb21tZW50Q29tbWFuZFRyYWl0czsKIAorICAvLy8gXGJyaWVmIEl0ZXJhdG9yIHRoYXQgdmlzaXRzIGltcG9ydCBkZWNsYXJhdGlvbnMuCisgIGNsYXNzIGltcG9ydF9pdGVyYXRvciB7CisgICAgSW1wb3J0RGVjbCAqSW1wb3J0OworCisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIEltcG9ydERlY2wgICAgICAgICAgICAgICAqdmFsdWVfdHlwZTsKKyAgICB0eXBlZGVmIEltcG9ydERlY2wgICAgICAgICAgICAgICAqcmVmZXJlbmNlOworICAgIHR5cGVkZWYgSW1wb3J0RGVjbCAgICAgICAgICAgICAgICpwb2ludGVyOworICAgIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OworCisgICAgaW1wb3J0X2l0ZXJhdG9yKCkgOiBJbXBvcnQoKSB7fQorICAgIGV4cGxpY2l0IGltcG9ydF9pdGVyYXRvcihJbXBvcnREZWNsICpJbXBvcnQpIDogSW1wb3J0KEltcG9ydCkge30KKworICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBJbXBvcnQ7IH0KKyAgICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBJbXBvcnQ7IH0KKworICAgIGltcG9ydF9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgIEltcG9ydCA9IEFTVENvbnRleHQ6OmdldE5leHRMb2NhbEltcG9ydChJbXBvcnQpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGltcG9ydF9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgICAgaW1wb3J0X2l0ZXJhdG9yIE90aGVyKCp0aGlzKTsKKyAgICAgICsrKCp0aGlzKTsKKyAgICAgIHJldHVybiBPdGhlcjsKKyAgICB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGltcG9ydF9pdGVyYXRvciBYLCBpbXBvcnRfaXRlcmF0b3IgWSkgeworICAgICAgcmV0dXJuIFguSW1wb3J0ID09IFkuSW1wb3J0OworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oaW1wb3J0X2l0ZXJhdG9yIFgsIGltcG9ydF9pdGVyYXRvciBZKSB7CisgICAgICByZXR1cm4gWC5JbXBvcnQgIT0gWS5JbXBvcnQ7CisgICAgfQorICB9OworCiBwdWJsaWM6CiAgIGNvbW1lbnRzOjpDb21tYW5kVHJhaXRzICZnZXRDb21tZW50Q29tbWFuZFRyYWl0cygpIGNvbnN0IHsKICAgICByZXR1cm4gQ29tbWVudENvbW1hbmRUcmFpdHM7CkBAIC03MTAsNDcgKzc0OSwxMCBAQAogICAgIHJldHVybiBJbXBvcnQtPk5leHRMb2NhbEltcG9ydDsKICAgfQogICAKLSAgLy8vIFxicmllZiBJdGVyYXRvciB0aGF0IHZpc2l0cyBpbXBvcnQgZGVjbGFyYXRpb25zLgotICBjbGFzcyBpbXBvcnRfaXRlcmF0b3IgewotICAgIEltcG9ydERlY2wgKkltcG9ydDsKLSAgICAKLSAgcHVibGljOgotICAgIHR5cGVkZWYgSW1wb3J0RGVjbCAgICAgICAgICAgICAgICp2YWx1ZV90eXBlOwotICAgIHR5cGVkZWYgSW1wb3J0RGVjbCAgICAgICAgICAgICAgICpyZWZlcmVuY2U7Ci0gICAgdHlwZWRlZiBJbXBvcnREZWNsICAgICAgICAgICAgICAgKnBvaW50ZXI7Ci0gICAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKLSAgICB0eXBlZGVmIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7Ci0gICAgCi0gICAgaW1wb3J0X2l0ZXJhdG9yKCkgOiBJbXBvcnQoKSB7IH0KLSAgICBleHBsaWNpdCBpbXBvcnRfaXRlcmF0b3IoSW1wb3J0RGVjbCAqSW1wb3J0KSA6IEltcG9ydChJbXBvcnQpIHsgfQotICAgIAotICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBJbXBvcnQ7IH0KLSAgICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBJbXBvcnQ7IH0KLSAgICAKLSAgICBpbXBvcnRfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7Ci0gICAgICBJbXBvcnQgPSBBU1RDb250ZXh0OjpnZXROZXh0TG9jYWxJbXBvcnQoSW1wb3J0KTsKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICBpbXBvcnRfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKLSAgICAgIGltcG9ydF9pdGVyYXRvciBPdGhlcigqdGhpcyk7Ci0gICAgICArKygqdGhpcyk7Ci0gICAgICByZXR1cm4gT3RoZXI7Ci0gICAgfQotICAgIAotICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oaW1wb3J0X2l0ZXJhdG9yIFgsIGltcG9ydF9pdGVyYXRvciBZKSB7Ci0gICAgICByZXR1cm4gWC5JbXBvcnQgPT0gWS5JbXBvcnQ7Ci0gICAgfQotCi0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShpbXBvcnRfaXRlcmF0b3IgWCwgaW1wb3J0X2l0ZXJhdG9yIFkpIHsKLSAgICAgIHJldHVybiBYLkltcG9ydCAhPSBZLkltcG9ydDsKLSAgICB9Ci0gIH07Ci0gIAotICBpbXBvcnRfaXRlcmF0b3IgbG9jYWxfaW1wb3J0X2JlZ2luKCkgY29uc3QgeyAKLSAgICByZXR1cm4gaW1wb3J0X2l0ZXJhdG9yKEZpcnN0TG9jYWxJbXBvcnQpOyAKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxpbXBvcnRfaXRlcmF0b3I+IGltcG9ydF9yYW5nZTsKKyAgaW1wb3J0X3JhbmdlIGxvY2FsX2ltcG9ydHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGltcG9ydF9yYW5nZShpbXBvcnRfaXRlcmF0b3IoRmlyc3RMb2NhbEltcG9ydCksIGltcG9ydF9pdGVyYXRvcigpKTsKICAgfQotICBpbXBvcnRfaXRlcmF0b3IgbG9jYWxfaW1wb3J0X2VuZCgpIGNvbnN0IHsgcmV0dXJuIGltcG9ydF9pdGVyYXRvcigpOyB9CiAKICAgRGVjbCAqZ2V0UHJpbWFyeU1lcmdlZERlY2woRGVjbCAqRCkgewogICAgIERlY2wgKlJlc3VsdCA9IE1lcmdlZERlY2xzLmxvb2t1cChEKTsKQEAgLTgxMCwxMSArODEyLDEzIEBACiAgIC8vLyBUaGUgZXh0ZXJuYWwgQVNUIHNvdXJjZSBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBsb2FkIHBhcnRzIG9mCiAgIC8vLyB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUgYXMgbmVlZGVkIGZyb20gc29tZSBleHRlcm5hbCBzdG9yYWdlLAogICAvLy8gZS5nLiwgYSBwcmVjb21waWxlZCBoZWFkZXIuCi0gIHZvaWQgc2V0RXh0ZXJuYWxTb3VyY2UoT3duaW5nUHRyPEV4dGVybmFsQVNUU291cmNlPiAmU291cmNlKTsKKyAgdm9pZCBzZXRFeHRlcm5hbFNvdXJjZShJbnRydXNpdmVSZWZDbnRQdHI8RXh0ZXJuYWxBU1RTb3VyY2U+IFNvdXJjZSk7CiAKICAgLy8vIFxicmllZiBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIGV4dGVybmFsIEFTVCBzb3VyY2UgYXNzb2NpYXRlZAogICAvLy8gd2l0aCB0aGlzIEFTVCBjb250ZXh0LCBpZiBhbnkuCi0gIEV4dGVybmFsQVNUU291cmNlICpnZXRFeHRlcm5hbFNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIEV4dGVybmFsU291cmNlLmdldCgpOyB9CisgIEV4dGVybmFsQVNUU291cmNlICpnZXRFeHRlcm5hbFNvdXJjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRXh0ZXJuYWxTb3VyY2UuZ2V0UHRyKCk7CisgIH0KIAogICAvLy8gXGJyaWVmIEF0dGFjaCBhbiBBU1QgbXV0YXRpb24gbGlzdGVuZXIgdG8gdGhlIEFTVCBjb250ZXh0LgogICAvLy8KQEAgLTgzMiw2ICs4MzYsMTQgQEAKICAgdm9pZCBQcmludFN0YXRzKCkgY29uc3Q7CiAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxUeXBlICo+JiBnZXRUeXBlcygpIGNvbnN0IHsgcmV0dXJuIFR5cGVzOyB9CiAKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgaW1wbGljaXQgVFUtbGV2ZWwgQ1hYUmVjb3JkRGVjbCBvciBSZWNvcmREZWNsCisgIC8vLyBkZWNsYXJhdGlvbi4KKyAgUmVjb3JkRGVjbCAqYnVpbGRJbXBsaWNpdFJlY29yZChTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmREZWNsOjpUYWdLaW5kIFRLID0gVFRLX1N0cnVjdCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgaW1wbGljaXQgVFUtbGV2ZWwgdHlwZWRlZiBkZWNsYXJhdGlvbi4KKyAgVHlwZWRlZkRlY2wgKmJ1aWxkSW1wbGljaXRUeXBlZGVmKFF1YWxUeXBlIFQsIFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKwogICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBkZWNsYXJhdGlvbiBmb3IgdGhlIDEyOC1iaXQgc2lnbmVkIGludGVnZXIgdHlwZS4KICAgVHlwZWRlZkRlY2wgKmdldEludDEyOERlY2woKSBjb25zdDsKIApAQCAtOTE1LDYgKzkyNywxNCBAQAogICAgIHJldHVybiBDYW5RdWFsVHlwZTo6Q3JlYXRlVW5zYWZlKGdldFBvaW50ZXJUeXBlKChRdWFsVHlwZSkgVCkpOwogICB9CiAKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHVuaXF1ZWQgcmVmZXJlbmNlIHRvIGEgdHlwZSBhZGp1c3RlZCBmcm9tIHRoZSBvcmlnaW5hbAorICAvLy8gdHlwZSB0byBhIG5ldyB0eXBlLgorICBRdWFsVHlwZSBnZXRBZGp1c3RlZFR5cGUoUXVhbFR5cGUgT3JpZywgUXVhbFR5cGUgTmV3KSBjb25zdDsKKyAgQ2FuUXVhbFR5cGUgZ2V0QWRqdXN0ZWRUeXBlKENhblF1YWxUeXBlIE9yaWcsIENhblF1YWxUeXBlIE5ldykgY29uc3QgeworICAgIHJldHVybiBDYW5RdWFsVHlwZTo6Q3JlYXRlVW5zYWZlKAorICAgICAgICBnZXRBZGp1c3RlZFR5cGUoKFF1YWxUeXBlKU9yaWcsIChRdWFsVHlwZSlOZXcpKTsKKyAgfQorCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB1bmlxdWVkIHJlZmVyZW5jZSB0byB0aGUgZGVjYXllZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbgogICAvLy8gdHlwZS4gIENhbiBvbmx5IGJlIGNhbGxlZCBvbiBhcnJheSBhbmQgZnVuY3Rpb24gdHlwZXMgd2hpY2ggZGVjYXkgdG8KICAgLy8vIHBvaW50ZXIgdHlwZXMuCkBAIC0xMTI2LDYgKzExNDYsMTMgQEAKICAgUXVhbFR5cGUgZ2V0T2JqQ09iamVjdFR5cGUoUXVhbFR5cGUgQmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ1Byb3RvY29sRGVjbCAqIGNvbnN0ICpQcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVByb3RvY29scykgY29uc3Q7CisgIAorICBib29sIE9iakNPYmplY3RBZG9wdHNRVHlwZVByb3RvY29scyhRdWFsVHlwZSBRVCwgT2JqQ0ludGVyZmFjZURlY2wgKkRlY2wpOworICAvLy8gUUlkUHJvdG9jb2xzQWRvcHRPYmpDT2JqZWN0UHJvdG9jb2xzIC0gQ2hlY2tzIHRoYXQgcHJvdG9jb2xzIGluCisgIC8vLyBRVCdzIHF1YWxpZmllZC1pZCBwcm90b2NvbCBsaXN0IGFkb3B0IGFsbCBwcm90b2NvbHMgaW4gSURlY2wncyBsaXN0CisgIC8vLyBvZiBwcm90b2NvbHMuCisgIGJvb2wgUUlkUHJvdG9jb2xzQWRvcHRPYmpDT2JqZWN0UHJvdG9jb2xzKFF1YWxUeXBlIFFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDSW50ZXJmYWNlRGVjbCAqSURlY2wpOwogCiAgIC8vLyBcYnJpZWYgUmV0dXJuIGEgT2JqQ09iamVjdFBvaW50ZXJUeXBlIHR5cGUgZm9yIHRoZSBnaXZlbiBPYmpDT2JqZWN0VHlwZS4KICAgUXVhbFR5cGUgZ2V0T2JqQ09iamVjdFBvaW50ZXJUeXBlKFF1YWxUeXBlIE9JVCkgY29uc3Q7CkBAIC0xMzgyLDYgKzE0MDksMTAgQEAKIAogICBib29sIFByb3RvY29sQ29tcGF0aWJsZVdpdGhQcm90b2NvbChPYmpDUHJvdG9jb2xEZWNsICpsUHJvdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNQcm90b2NvbERlY2wgKnJQcm90bykgY29uc3Q7CisgIAorICBPYmpDUHJvcGVydHlJbXBsRGVjbCAqZ2V0T2JqQ1Byb3BlcnR5SW1wbERlY2xGb3JQcm9wZXJ0eURlY2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgKlBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsICpDb250YWluZXIpIGNvbnN0OwogCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHR5cGUgXHAgVCBmb3IgT2JqZWN0aXZlLUMgZW5jb2RpbmcgcHVycG9zZSwKICAgLy8vIGluIGNoYXJhY3RlcnMuCkBAIC0xNzA0LDYgKzE3MzUsOCBAQAogCiAgIGJvb2wgaXNOZWFybHlFbXB0eShjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgY29uc3Q7CiAKKyAgVlRhYmxlQ29udGV4dEJhc2UgKmdldFZUYWJsZUNvbnRleHQoKTsKKwogICBNYW5nbGVDb250ZXh0ICpjcmVhdGVNYW5nbGVDb250ZXh0KCk7CiAgIAogICB2b2lkIERlZXBDb2xsZWN0T2JqQ0l2YXJzKGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpPSSwgYm9vbCBsZWFmQ2xhc3MsCkBAIC0xOTk0LDkgKzIwMjcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVW5xdWFsaWZpZWQgPSBmYWxzZSwgYm9vbCBCbG9ja1JldHVyblR5cGUgPSBmYWxzZSk7CiAgIFF1YWxUeXBlIG1lcmdlRnVuY3Rpb25UeXBlcyhRdWFsVHlwZSwgUXVhbFR5cGUsIGJvb2wgT2ZCbG9ja1BvaW50ZXI9ZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVucXVhbGlmaWVkID0gZmFsc2UpOwotICBRdWFsVHlwZSBtZXJnZUZ1bmN0aW9uQXJndW1lbnRUeXBlcyhRdWFsVHlwZSwgUXVhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT2ZCbG9ja1BvaW50ZXI9ZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVW5xdWFsaWZpZWQgPSBmYWxzZSk7CisgIFF1YWxUeXBlIG1lcmdlRnVuY3Rpb25QYXJhbWV0ZXJUeXBlcyhRdWFsVHlwZSwgUXVhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9mQmxvY2tQb2ludGVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVucXVhbGlmaWVkID0gZmFsc2UpOwogICBRdWFsVHlwZSBtZXJnZVRyYW5zcGFyZW50VW5pb25UeXBlKFF1YWxUeXBlLCBRdWFsVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9mQmxvY2tQb2ludGVyPWZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVW5xdWFsaWZpZWQgPSBmYWxzZSk7CkBAIC0yMDI3LDE0ICsyMDYwLDEyIEBACiAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogICAvLyAgICAgICAgICAgICAgICAgICAgVHlwZSBJdGVyYXRvcnMuCiAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPFNtYWxsVmVjdG9ySW1wbDxUeXBlICo+Ojpjb25zdF9pdGVyYXRvcj4KKyAgICB0eXBlX2NvbnN0X3JhbmdlOwogCi0gIHR5cGVkZWYgU21hbGxWZWN0b3JJbXBsPFR5cGUgKj46Oml0ZXJhdG9yICAgICAgIHR5cGVfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgU21hbGxWZWN0b3JJbXBsPFR5cGUgKj46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X3R5cGVfaXRlcmF0b3I7Ci0KLSAgdHlwZV9pdGVyYXRvciB0eXBlc19iZWdpbigpIHsgcmV0dXJuIFR5cGVzLmJlZ2luKCk7IH0KLSAgdHlwZV9pdGVyYXRvciB0eXBlc19lbmQoKSB7IHJldHVybiBUeXBlcy5lbmQoKTsgfQotICBjb25zdF90eXBlX2l0ZXJhdG9yIHR5cGVzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gVHlwZXMuYmVnaW4oKTsgfQotICBjb25zdF90eXBlX2l0ZXJhdG9yIHR5cGVzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFR5cGVzLmVuZCgpOyB9CisgIHR5cGVfY29uc3RfcmFuZ2UgdHlwZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGVfY29uc3RfcmFuZ2UoVHlwZXMuYmVnaW4oKSwgVHlwZXMuZW5kKCkpOworICB9CiAKICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAgIC8vICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIFZhbHVlcwpAQCAtMjEyNSw3ICsyMTU2LDcgQEAKICAgLy8vIHdoZW4gaXQgaXMgY2FsbGVkLgogICB2b2lkIEFkZERlYWxsb2NhdGlvbih2b2lkICgqQ2FsbGJhY2spKHZvaWQqKSwgdm9pZCAqRGF0YSk7CiAKLSAgR1ZBTGlua2FnZSBHZXRHVkFMaW5rYWdlRm9yRnVuY3Rpb24oY29uc3QgRnVuY3Rpb25EZWNsICpGRCk7CisgIEdWQUxpbmthZ2UgR2V0R1ZBTGlua2FnZUZvckZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQpIGNvbnN0OwogICBHVkFMaW5rYWdlIEdldEdWQUxpbmthZ2VGb3JWYXJpYWJsZShjb25zdCBWYXJEZWNsICpWRCk7CiAKICAgLy8vIFxicmllZiBEZXRlcm1pbmVzIGlmIHRoZSBkZWNsIGNhbiBiZSBDb2RlR2VuJ2VkIG9yIGRlc2VyaWFsaXplZCBmcm9tIFBDSApAQCAtMjEzOSw2ICsyMTcwLDkgQEAKICAgdm9pZCBzZXRNYW5nbGluZ051bWJlcihjb25zdCBOYW1lZERlY2wgKk5ELCB1bnNpZ25lZCBOdW1iZXIpOwogICB1bnNpZ25lZCBnZXRNYW5nbGluZ051bWJlcihjb25zdCBOYW1lZERlY2wgKk5EKSBjb25zdDsKIAorICB2b2lkIHNldFN0YXRpY0xvY2FsTnVtYmVyKGNvbnN0IFZhckRlY2wgKlZELCB1bnNpZ25lZCBOdW1iZXIpOworICB1bnNpZ25lZCBnZXRTdGF0aWNMb2NhbE51bWJlcihjb25zdCBWYXJEZWNsICpWRCkgY29uc3Q7CisKICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgY29udGV4dCBmb3IgY29tcHV0aW5nIG1hbmdsaW5nIG51bWJlcnMgaW4gdGhlIGdpdmVuCiAgIC8vLyBEZWNsQ29udGV4dC4KICAgTWFuZ2xlTnVtYmVyaW5nQ29udGV4dCAmZ2V0TWFuZ2xpbmdOdW1iZXJDb250ZXh0KGNvbnN0IERlY2xDb250ZXh0ICpEQyk7CkBAIC0yMjM4LDE3ICsyMjcyLDE3IEBACiAgIHZvaWQgZ2V0T2JqQ0VuY29kaW5nRm9yU3RydWN0dXJlSW1wbChSZWNvcmREZWNsICpSRCwgc3RkOjpzdHJpbmcgJlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlY2wgKkZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlVkJhc2VzID0gdHJ1ZSkgY29uc3Q7Ci0KK3B1YmxpYzoKICAgLy8gQWRkcyB0aGUgZW5jb2Rpbmcgb2YgYSBtZXRob2QgcGFyYW1ldGVyIG9yIHJldHVybiB0eXBlLgogICB2b2lkIGdldE9iakNFbmNvZGluZ0Zvck1ldGhvZFBhcmFtZXRlcihEZWNsOjpPYmpDRGVjbFF1YWxpZmllciBRVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgc3RkOjpzdHJpbmcmIFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXh0ZW5kZWQpIGNvbnN0OwotCisgIAorcHJpdmF0ZToKICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICYKICAgZ2V0T2JqQ0xheW91dChjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqRCwKICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpJbXBsKSBjb25zdDsKIAotcHJpdmF0ZToKICAgLy8vIFxicmllZiBBIHNldCBvZiBkZWFsbG9jYXRpb25zIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aGVuIHRoZQogICAvLy8gQVNUQ29udGV4dCBpcyBkZXN0cm95ZWQuCiAgIHR5cGVkZWYgbGx2bTo6U21hbGxEZW5zZU1hcDx2b2lkKCopKHZvaWQqKSwgbGx2bTo6U21hbGxWZWN0b3I8dm9pZCosIDE2PiA+CkBAIC0yMjY0LDcgKzIyOTgsOSBAQAogICBmcmllbmQgY2xhc3MgRGVjbGFyYXRpb25OYW1lVGFibGU7CiAgIHZvaWQgUmVsZWFzZURlY2xDb250ZXh0TWFwcygpOwogCi0gIGxsdm06Ok93bmluZ1B0cjxQYXJlbnRNYXA+IEFsbFBhcmVudHM7CisgIHN0ZDo6dW5pcXVlX3B0cjxQYXJlbnRNYXA+IEFsbFBhcmVudHM7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFZUYWJsZUNvbnRleHRCYXNlPiBWVENvbnRleHQ7CiB9OwogCiAvLy8gXGJyaWVmIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGNvbnN0cnVjdGluZyBhIG51bGxhcnkgc2VsZWN0b3IuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9BU1RMYW1iZGEuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL0FTVExhbWJkYS5oCmluZGV4IDM1OGFjNzEuLjlhZjAxNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0FTVExhbWJkYS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL0FTVExhbWJkYS5oCkBAIC0zNiw5ICszNiw5IEBACiAgIHJldHVybiBpc0xhbWJkYUNhbGxPcGVyYXRvcihjYXN0PENYWE1ldGhvZERlY2w+KERDKSk7CiB9CiAKLWlubGluZSBib29sIGlzR2VuZXJpY0xhbWJkYUNhbGxPcGVyYXRvclNwZWNpYWxpemF0aW9uKENYWE1ldGhvZERlY2wgKk1EKSB7CitpbmxpbmUgYm9vbCBpc0dlbmVyaWNMYW1iZGFDYWxsT3BlcmF0b3JTcGVjaWFsaXphdGlvbihjb25zdCBDWFhNZXRob2REZWNsICpNRCkgewogICBpZiAoIU1EKSByZXR1cm4gZmFsc2U7Ci0gIENYWFJlY29yZERlY2wgKkxhbWJkYUNsYXNzID0gTUQtPmdldFBhcmVudCgpOworICBjb25zdCBDWFhSZWNvcmREZWNsICpMYW1iZGFDbGFzcyA9IE1ELT5nZXRQYXJlbnQoKTsKICAgaWYgKExhbWJkYUNsYXNzICYmIExhbWJkYUNsYXNzLT5pc0dlbmVyaWNMYW1iZGEoKSkKICAgICByZXR1cm4gaXNMYW1iZGFDYWxsT3BlcmF0b3IoTUQpICYmIAogICAgICAgICAgICAgICAgICAgICBNRC0+aXNGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb24oKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL0FTVE11dGF0aW9uTGlzdGVuZXIuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL0FTVE11dGF0aW9uTGlzdGVuZXIuaAppbmRleCA2ZDEyYTkyLi5hODliZmVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9BU1RNdXRhdGlvbkxpc3RlbmVyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvQVNUTXV0YXRpb25MaXN0ZW5lci5oCkBAIC02NSw2ICs2NSwxMCBAQAogICB2aXJ0dWFsIHZvaWQgQWRkZWRDWFhUZW1wbGF0ZVNwZWNpYWxpemF0aW9uKGNvbnN0IEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpURCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkQpIHt9CiAKKyAgLy8vIFxicmllZiBBIGZ1bmN0aW9uJ3MgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaGFzIGJlZW4gZXZhbHVhdGVkIG9yCisgIC8vLyBpbnN0YW50aWF0ZWQuCisgIHZpcnR1YWwgdm9pZCBSZXNvbHZlZEV4Y2VwdGlvblNwZWMoY29uc3QgRnVuY3Rpb25EZWNsICpGRCkge30KKwogICAvLy8gXGJyaWVmIEEgZnVuY3Rpb24ncyByZXR1cm4gdHlwZSBoYXMgYmVlbiBkZWR1Y2VkLgogICB2aXJ0dWFsIHZvaWQgRGVkdWNlZFJldHVyblR5cGUoY29uc3QgRnVuY3Rpb25EZWNsICpGRCwgUXVhbFR5cGUgUmV0dXJuVHlwZSk7CiAKQEAgLTc0LDYgKzc4LDkgQEAKICAgLy8vIFxicmllZiBBIHN0YXRpYyBkYXRhIG1lbWJlciB3YXMgaW1wbGljaXRseSBpbnN0YW50aWF0ZWQuCiAgIHZpcnR1YWwgdm9pZCBTdGF0aWNEYXRhTWVtYmVySW5zdGFudGlhdGVkKGNvbnN0IFZhckRlY2wgKkQpIHt9CiAKKyAgLy8vIFxicmllZiBBIGZ1bmN0aW9uIHRlbXBsYXRlJ3MgZGVmaW5pdGlvbiB3YXMgaW5zdGFudGlhdGVkLgorICB2aXJ0dWFsIHZvaWQgRnVuY3Rpb25EZWZpbml0aW9uSW5zdGFudGlhdGVkKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCkge30KKwogICAvLy8gXGJyaWVmIEEgbmV3IG9iamMgY2F0ZWdvcnkgY2xhc3Mgd2FzIGFkZGVkIGZvciBhbiBpbnRlcmZhY2UuCiAgIHZpcnR1YWwgdm9pZCBBZGRlZE9iakNDYXRlZ29yeVRvSW50ZXJmYWNlKGNvbnN0IE9iakNDYXRlZ29yeURlY2wgKkNhdEQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRkQpIHt9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9BU1RUeXBlVHJhaXRzLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9BU1RUeXBlVHJhaXRzLmgKaW5kZXggMDg3YWQ1Ni4uYWJjODg1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvQVNUVHlwZVRyYWl0cy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL0FTVFR5cGVUcmFpdHMuaApAQCAtNTcsMTEgKzU3LDE4IEBACiAgIGJvb2wgaXNTYW1lKEFTVE5vZGVLaW5kIE90aGVyKSBjb25zdDsKIAogICAvLy8gXGJyaWVmIFJldHVybnMgXGMgdHJ1ZSBpZiBcYyB0aGlzIGlzIGEgYmFzZSBraW5kIG9mIChvciBzYW1lIGFzKSBcYyBPdGhlci4KLSAgYm9vbCBpc0Jhc2VPZihBU1ROb2RlS2luZCBPdGhlcikgY29uc3Q7CisgIC8vLyBccGFyYW0gRGlzdGFuY2UgSWYgbm9uLW51bGwsIHVzZWQgdG8gcmV0dXJuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIFxjIHRoaXMKKyAgLy8vIGFuZCBcYyBPdGhlciBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LgorICBib29sIGlzQmFzZU9mKEFTVE5vZGVLaW5kIE90aGVyLCB1bnNpZ25lZCAqRGlzdGFuY2UgPSAwKSBjb25zdDsKIAogICAvLy8gXGJyaWVmIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUga2luZC4KICAgU3RyaW5nUmVmIGFzU3RyaW5nUmVmKCkgY29uc3Q7CiAKKyAgLy8vIFxicmllZiBTdHJpY3Qgd2VhayBvcmRlcmluZyBmb3IgQVNUTm9kZUtpbmQuCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEFTVE5vZGVLaW5kICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBLaW5kSWQgPCBPdGhlci5LaW5kSWQ7CisgIH0KKwogcHJpdmF0ZToKICAgLy8vIFxicmllZiBLaW5kIGlkcy4KICAgLy8vCkBAIC05MSw3ICs5OCw5IEBACiAKICAgLy8vIFxicmllZiBSZXR1cm5zIFxjIHRydWUgaWYgXGMgQmFzZSBpcyBhIGJhc2Uga2luZCBvZiAob3Igc2FtZSBhcykgXGMKICAgLy8vICAgRGVyaXZlZC4KLSAgc3RhdGljIGJvb2wgaXNCYXNlT2YoTm9kZUtpbmRJZCBCYXNlLCBOb2RlS2luZElkIERlcml2ZWQpOworICAvLy8gXHBhcmFtIERpc3RhbmNlIElmIG5vbi1udWxsLCB1c2VkIHRvIHJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiBcYyBCYXNlCisgIC8vLyBhbmQgXGMgRGVyaXZlZCBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LgorICBzdGF0aWMgYm9vbCBpc0Jhc2VPZihOb2RlS2luZElkIEJhc2UsIE5vZGVLaW5kSWQgRGVyaXZlZCwgdW5zaWduZWQgKkRpc3RhbmNlKTsKIAogICAvLy8gXGJyaWVmIEhlbHBlciBtZXRhLWZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBraW5kIFQgdG8gaXRzIGVudW0gdmFsdWUuCiAgIC8vLwpAQCAtMTMzLDYgKzE0MiwxMSBAQAogI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTm9kZXMuZGVmIgogI3VuZGVmIEtJTkRfVE9fS0lORF9JRAogCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBBU1ROb2RlS2luZCBLKSB7CisgIE9TIDw8IEsuYXNTdHJpbmdSZWYoKTsKKyAgcmV0dXJuIE9TOworfQorCiAvLy8gXGJyaWVmIEEgZHluYW1pY2FsbHkgdHlwZWQgQVNUIG5vZGUgY29udGFpbmVyLgogLy8vCiAvLy8gU3RvcmVzIGFuIEFTVCBub2RlIGluIGEgdHlwZSBzYWZlIHdheS4gVGhpcyBhbGxvd3Mgd3JpdGluZyBjb2RlIHRoYXQKQEAgLTE5OCw4ICsyMTIsOCBAQAogICAgIHJldHVybiBnZXRNZW1vaXphdGlvbkRhdGEoKSA8IE90aGVyLmdldE1lbW9pemF0aW9uRGF0YSgpOwogICB9CiAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEeW5UeXBlZE5vZGUgJk90aGVyKSBjb25zdCB7Ci0gICAgLy8gTm9kZXMgd2l0aCBkaWZmZXJlbnQgdHlwZXMgY2Fubm90IGJlIGVxdWFsLgotICAgIGlmICghTm9kZUtpbmQuaXNTYW1lKE90aGVyLk5vZGVLaW5kKSkKKyAgICBpZiAoIU5vZGVLaW5kLmlzQmFzZU9mKE90aGVyLk5vZGVLaW5kKSAmJgorICAgICAgICAhT3RoZXIuTm9kZUtpbmQuaXNCYXNlT2YoTm9kZUtpbmQpKQogICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gRklYTUU6IEltcGxlbWVudCBmb3Igb3RoZXIgdHlwZXMuCkBAIC0yODMsMTggKzI5NywxOCBAQAogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBEeW5UeXBlZE5vZGU6OkJhc2VDb252ZXJ0ZXI8Ci0gICAgVCwgdHlwZW5hbWUgbGx2bTo6ZW5hYmxlX2lmPGxsdm06OmlzX2Jhc2Vfb2Y8Ci0gICAgICAgICAgIERlY2wsIFQ+ID46OnR5cGU+IDogcHVibGljIER5bkNhc3RQdHJDb252ZXJ0ZXI8VCwgRGVjbD4ge307CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPERlY2wsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgOiBwdWJsaWMgRHluQ2FzdFB0ckNvbnZlcnRlcjxULCBEZWNsPiB7fTsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdHJ1Y3QgRHluVHlwZWROb2RlOjpCYXNlQ29udmVydGVyPAotICAgIFQsIHR5cGVuYW1lIGxsdm06OmVuYWJsZV9pZjxsbHZtOjppc19iYXNlX29mPAotICAgICAgICAgICBTdG10LCBUPiA+Ojp0eXBlPiA6IHB1YmxpYyBEeW5DYXN0UHRyQ29udmVydGVyPFQsIFN0bXQ+IHt9OworICAgIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjxTdG10LCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgIDogcHVibGljIER5bkNhc3RQdHJDb252ZXJ0ZXI8VCwgU3RtdD4ge307CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IER5blR5cGVkTm9kZTo6QmFzZUNvbnZlcnRlcjwKLSAgICBULCB0eXBlbmFtZSBsbHZtOjplbmFibGVfaWY8bGx2bTo6aXNfYmFzZV9vZjwKLSAgICAgICAgICAgVHlwZSwgVD4gPjo6dHlwZT4gOiBwdWJsaWMgRHluQ2FzdFB0ckNvbnZlcnRlcjxULCBUeXBlPiB7fTsKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2Y8VHlwZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICA6IHB1YmxpYyBEeW5DYXN0UHRyQ29udmVydGVyPFQsIFR5cGU+IHt9OwogCiB0ZW1wbGF0ZSA8Pgogc3RydWN0IER5blR5cGVkTm9kZTo6QmFzZUNvbnZlcnRlcjwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL0FTVFZlY3Rvci5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvQVNUVmVjdG9yLmgKaW5kZXggNmRiOTE4ZS4uZDlkMzdiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvQVNUVmVjdG9yLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvQVNUVmVjdG9yLmgKQEAgLTI2LDMwICsyNiw2IEBACiAjaW5jbHVkZSA8Y3N0cmluZz4KICNpbmNsdWRlIDxtZW1vcnk+CiAKLSNpZmRlZiBfTVNDX1ZFUgotbmFtZXNwYWNlIHN0ZCB7Ci0jaWYgX01TQ19WRVIgPD0gMTMxMAotICAvLyBXb3JrIGFyb3VuZCBmbGF3ZWQgVkMrKyBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weS4gIERlZmluZQotICAvLyBhZGRpdGlvbmFsIG92ZXJsb2FkcyBzbyB0aGF0IGVsZW1lbnRzIHdpdGggcG9pbnRlciB0eXBlcyBhcmUgcmVjb2duaXplZCBhcwotICAvLyBzY2FsYXJzIGFuZCBub3Qgb2JqZWN0cywgY2F1c2luZyBiaXphcnJlIHR5cGUgY29udmVyc2lvbiBlcnJvcnMuCi0gIHRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4KLSAgaW5saW5lIF9TY2FsYXJfcHRyX2l0ZXJhdG9yX3RhZyBfUHRyX2NhdChUMSAqKiwgVDIgKiopIHsKLSAgICBfU2NhbGFyX3B0cl9pdGVyYXRvcl90YWcgX0NhdDsKLSAgICByZXR1cm4gX0NhdDsKLSAgfQotCi0gIHRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4KLSAgaW5saW5lIF9TY2FsYXJfcHRyX2l0ZXJhdG9yX3RhZyBfUHRyX2NhdChUMSogY29uc3QgKiwgVDIgKiopIHsKLSAgICBfU2NhbGFyX3B0cl9pdGVyYXRvcl90YWcgX0NhdDsKLSAgICByZXR1cm4gX0NhdDsKLSAgfQotI2Vsc2UKLSAgLy8gRklYTUU6IEl0IGlzIG5vdCBjbGVhciBpZiB0aGUgcHJvYmxlbSBpcyBmaXhlZCBpbiBWUyAyMDA1LiAgV2hhdCBpcyBjbGVhcgotICAvLyBpcyB0aGF0IHRoZSBhYm92ZSBoYWNrIHdvbid0IHdvcmsgaWYgaXQgd2Fzbid0IGZpeGVkLgotI2VuZGlmCi19Ci0jZW5kaWYKLQogbmFtZXNwYWNlIGNsYW5nIHsKICAgY2xhc3MgQVNUQ29udGV4dDsKIApAQCAtNzcsNyArNTMsNyBAQAogICB9CiAKICAgfkFTVFZlY3RvcigpIHsKLSAgICBpZiAobGx2bTo6aXNfY2xhc3M8VD46OnZhbHVlKSB7CisgICAgaWYgKHN0ZDo6aXNfY2xhc3M8VD46OnZhbHVlKSB7CiAgICAgICAvLyBEZXN0cm95IHRoZSBjb25zdHJ1Y3RlZCBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgogICAgICAgZGVzdHJveV9yYW5nZShCZWdpbiwgRW5kKTsKICAgICB9CkBAIC0xNDcsNyArMTIzLDcgQEAKICAgfQogCiAgIHZvaWQgY2xlYXIoKSB7Ci0gICAgaWYgKGxsdm06OmlzX2NsYXNzPFQ+Ojp2YWx1ZSkgeworICAgIGlmIChzdGQ6OmlzX2NsYXNzPFQ+Ojp2YWx1ZSkgewogICAgICAgZGVzdHJveV9yYW5nZShCZWdpbiwgRW5kKTsKICAgICB9CiAgICAgRW5kID0gQmVnaW47CkBAIC0zOTIsNyArMzY4LDcgQEAKICAgVCAqTmV3RWx0cyA9IG5ldyAoQywgbGx2bTo6YWxpZ25PZjxUPigpKSBUW05ld0NhcGFjaXR5XTsKIAogICAvLyBDb3B5IHRoZSBlbGVtZW50cyBvdmVyLgotICBpZiAobGx2bTo6aXNfY2xhc3M8VD46OnZhbHVlKSB7CisgIGlmIChzdGQ6OmlzX2NsYXNzPFQ+Ojp2YWx1ZSkgewogICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KEJlZ2luLCBFbmQsIE5ld0VsdHMpOwogICAgIC8vIERlc3Ryb3kgdGhlIG9yaWdpbmFsIGVsZW1lbnRzLgogICAgIGRlc3Ryb3lfcmFuZ2UoQmVnaW4sIEVuZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyLmgKaW5kZXggN2RiZjQxMy4uNjU1YmNhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvQXR0ci5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL0F0dHIuaApAQCAtNDgsMTAgKzQ4LDkgQEAKICAgLy8vIEFuIGluZGV4IGludG8gdGhlIHNwZWxsaW5nIGxpc3Qgb2YgYW4KICAgLy8vIGF0dHJpYnV0ZSBkZWZpbmVkIGluIEF0dHIudGQgZmlsZS4KICAgdW5zaWduZWQgU3BlbGxpbmdMaXN0SW5kZXggOiA0OwotCiAgIGJvb2wgSW5oZXJpdGVkIDogMTsKLQogICBib29sIElzUGFja0V4cGFuc2lvbiA6IDE7CisgIGJvb2wgSW1wbGljaXQgOiAxOwogCiAgIHZpcnR1YWwgfkF0dHIoKTsKIApAQCAtNzYsNyArNzUsNyBAQAogcHJvdGVjdGVkOgogICBBdHRyKGF0dHI6OktpbmQgQUssIFNvdXJjZVJhbmdlIFIsIHVuc2lnbmVkIFNwZWxsaW5nTGlzdEluZGV4ID0gMCkKICAgICA6IFJhbmdlKFIpLCBBdHRyS2luZChBSyksIFNwZWxsaW5nTGlzdEluZGV4KFNwZWxsaW5nTGlzdEluZGV4KSwKLSAgICAgIEluaGVyaXRlZChmYWxzZSksIElzUGFja0V4cGFuc2lvbihmYWxzZSkge30KKyAgICAgIEluaGVyaXRlZChmYWxzZSksIElzUGFja0V4cGFuc2lvbihmYWxzZSksIEltcGxpY2l0KGZhbHNlKSB7fQogCiBwdWJsaWM6CiAKQEAgLTg1LDYgKzg0LDcgQEAKICAgfQogICAKICAgdW5zaWduZWQgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSBjb25zdCB7IHJldHVybiBTcGVsbGluZ0xpc3RJbmRleDsgfQorICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFNwZWxsaW5nKCkgY29uc3QgPSAwOwogCiAgIFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gUmFuZ2UuZ2V0QmVnaW4oKTsgfQogICBTb3VyY2VSYW5nZSBnZXRSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIFJhbmdlOyB9CkBAIC05Miw2ICs5MiwxMSBAQAogCiAgIGJvb2wgaXNJbmhlcml0ZWQoKSBjb25zdCB7IHJldHVybiBJbmhlcml0ZWQ7IH0KIAorICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGhhcyBiZWVuIGltcGxpY2l0bHkgY3JlYXRlZCBpbnN0ZWFkCisgIC8vLyBvZiBleHBsaWNpdGx5IHdyaXR0ZW4gYnkgdGhlIHVzZXIuCisgIGJvb2wgaXNJbXBsaWNpdCgpIGNvbnN0IHsgcmV0dXJuIEltcGxpY2l0OyB9CisgIHZvaWQgc2V0SW1wbGljaXQoYm9vbCBJKSB7IEltcGxpY2l0ID0gSTsgfQorCiAgIHZvaWQgc2V0UGFja0V4cGFuc2lvbihib29sIFBFKSB7IElzUGFja0V4cGFuc2lvbiA9IFBFOyB9CiAgIGJvb2wgaXNQYWNrRXhwYW5zaW9uKCkgY29uc3QgeyByZXR1cm4gSXNQYWNrRXhwYW5zaW9uOyB9CiAKQEAgLTEwMyw2ICsxMDgsMTEgQEAKICAgLy8gUHJldHR5IHByaW50IHRoaXMgYXR0cmlidXRlLgogICB2aXJ0dWFsIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJk9TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgQnkgZGVmYXVsdCwgYXR0cmlidXRlcyBjYW5ub3QgYmUgZHVwbGljYXRlZCB3aGVuIGJlaW5nIG1lcmdlZDsKKyAgLy8vIGhvd2V2ZXIsIGFuIGF0dHJpYnV0ZSBjYW4gb3ZlcnJpZGUgdGhpcy4gUmV0dXJucyB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUKKyAgLy8vIGNhbiBiZSBkdXBsaWNhdGVkIHdoZW4gbWVyZ2luZy4KKyAgdmlydHVhbCBib29sIGR1cGxpY2F0ZXNBbGxvd2VkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIH07CiAKIGNsYXNzIEluaGVyaXRhYmxlQXR0ciA6IHB1YmxpYyBBdHRyIHsKQEAgLTEyMSw3ICsxMzEsNyBAQAogfTsKIAogY2xhc3MgSW5oZXJpdGFibGVQYXJhbUF0dHIgOiBwdWJsaWMgSW5oZXJpdGFibGVBdHRyIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogcHJvdGVjdGVkOgogICBJbmhlcml0YWJsZVBhcmFtQXR0cihhdHRyOjpLaW5kIEFLLCBTb3VyY2VSYW5nZSBSLAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcGVsbGluZ0xpc3RJbmRleCA9IDApCkBAIC0xMzYsMjMgKzE0NiwyMSBAQAogICB9CiB9OwogCi1jbGFzcyBNU0luaGVyaXRhbmNlQXR0ciA6IHB1YmxpYyBJbmhlcml0YWJsZUF0dHIgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7Ci1wcm90ZWN0ZWQ6Ci0gIE1TSW5oZXJpdGFuY2VBdHRyKGF0dHI6OktpbmQgQUssIFNvdXJjZVJhbmdlIFIsIHVuc2lnbmVkIFNwZWxsaW5nTGlzdEluZGV4ID0gMCkKLSAgICA6IEluaGVyaXRhYmxlQXR0cihBSywgUiwgU3BlbGxpbmdMaXN0SW5kZXgpIHt9Ci0KLXB1YmxpYzoKLSAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgotICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEF0dHIgKkEpIHsKLSAgICAvLyBSZWxpZXMgb24gcmVsYXRpdmUgb3JkZXIgb2YgZW51bSBlbWlzc2lvbiB3aXRoIHJlc3BlY3QgdG8gcGFyYW0gYXR0cnMuCi0gICAgcmV0dXJuIChBLT5nZXRLaW5kKCkgPD0gYXR0cjo6TEFTVF9NU19JTkhFUklUQU5DRSAmJgotICAgICAgICAgICAgQS0+Z2V0S2luZCgpID4gYXR0cjo6TEFTVF9JTkhFUklUQUJMRV9QQVJBTSk7Ci0gIH0KLX07Ci0KICNpbmNsdWRlICJjbGFuZy9BU1QvQXR0cnMuaW5jIgogCitpbmxpbmUgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHIgKkF0KSB7CisgIERCLkFkZFRhZ2dlZFZhbChyZWludGVycHJldF9jYXN0PGludHB0cl90PihBdCksCisgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6YWtfYXR0cik7CisgIHJldHVybiBEQjsKK30KKworaW5saW5lIGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZvcGVyYXRvcjw8KGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICZQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyICpBdCkgeworICBQRC5BZGRUYWdnZWRWYWwocmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oQXQpLAorICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OmFrX2F0dHIpOworICByZXR1cm4gUEQ7Cit9CiB9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvQXR0ckl0ZXJhdG9yLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9BdHRySXRlcmF0b3IuaAppbmRleCA4YmQ4ZmJlLi40ZWNmOThmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9BdHRySXRlcmF0b3IuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9BdHRySXRlcmF0b3IuaApAQCAtNDMsNyArNDMsNyBAQAogdHlwZWRlZiBTbWFsbFZlY3Rvcjxjb25zdCBBdHRyKiwgMj4gQ29uc3RBdHRyVmVjOwogCiAvLy8gc3BlY2lmaWNfYXR0cl9pdGVyYXRvciAtIEl0ZXJhdGVzIG92ZXIgYSBzdWJyYW5nZSBvZiBhbiBBdHRyVmVjLCBvbmx5Ci0vLy8gcHJvdmlkaW5nIGF0dHJpYnV0ZXMgdGhhdCBhcmUgb2YgYSBzcGVjaWZjIHR5cGUuCisvLy8gcHJvdmlkaW5nIGF0dHJpYnV0ZXMgdGhhdCBhcmUgb2YgYSBzcGVjaWZpYyB0eXBlLgogdGVtcGxhdGUgPHR5cGVuYW1lIFNwZWNpZmljQXR0ciwgdHlwZW5hbWUgQ29udGFpbmVyID0gQXR0clZlYz4KIGNsYXNzIHNwZWNpZmljX2F0dHJfaXRlcmF0b3IgewogICB0eXBlZGVmIHR5cGVuYW1lIENvbnRhaW5lcjo6Y29uc3RfaXRlcmF0b3IgSXRlcmF0b3I7CkBAIC01Myw3ICs1Myw3IEBACiAgIC8vLyBzcGVjaWZpY2FsbHkgcmVxdWVzdGVkLCB3ZSBkb24ndCBuZWNlc3NhcmlseSBhZHZhbmNlIHRoaXMgYWxsIHRoZQogICAvLy8gd2F5LiBJbnN0ZWFkLCB3ZSBhZHZhbmNlIGl0IHdoZW4gYW4gb3BlcmF0aW9uIGlzIHJlcXVlc3RlZDsgaWYgdGhlCiAgIC8vLyBvcGVyYXRpb24gaXMgYWN0aW5nIG9uIHdoYXQgc2hvdWxkIGJlIGEgcGFzdC10aGUtZW5kIGl0ZXJhdG9yLAotICAvLy8gdGhlbiB3ZSBvZmZlciBubyBndWFyYW50ZWVzLCBidXQgdGhpcyB3YXkgd2UgZG8gbm90IGRlcmVyZW5jZSBhCisgIC8vLyB0aGVuIHdlIG9mZmVyIG5vIGd1YXJhbnRlZXMsIGJ1dCB0aGlzIHdheSB3ZSBkbyBub3QgZGVyZWZlcmVuY2UgYQogICAvLy8gcGFzdC10aGUtZW5kIGl0ZXJhdG9yIHdoZW4gd2UgbW92ZSB0byBhIHBhc3QtdGhlLWVuZCBwb3NpdGlvbi4KICAgbXV0YWJsZSBJdGVyYXRvciBDdXJyZW50OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9DTWFrZUxpc3RzLnR4dCBiL2luY2x1ZGUvY2xhbmcvQVNUL0NNYWtlTGlzdHMudHh0CmluZGV4IGJhNTRmYTIuLjI2MDczNGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0NNYWtlTGlzdHMudHh0CisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL0NNYWtlTGlzdHMudHh0CkBAIC0xMyw2ICsxMywxMSBAQAogICBTT1VSQ0UgLi4vQmFzaWMvQXR0ci50ZAogICBUQVJHRVQgQ2xhbmdBdHRyRHVtcCkKIAorY2xhbmdfdGFibGVnZW4oQXR0clZpc2l0b3IuaW5jIC1nZW4tY2xhbmctYXR0ci1hc3QtdmlzaXRvcgorICAtSSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vCisgIFNPVVJDRSAuLi9CYXNpYy9BdHRyLnRkCisgIFRBUkdFVCBDbGFuZ0F0dHJWaXNpdG9yKQorCiBjbGFuZ190YWJsZWdlbihTdG10Tm9kZXMuaW5jIC1nZW4tY2xhbmctc3RtdC1ub2RlcwogICBTT1VSQ0UgLi4vQmFzaWMvU3RtdE5vZGVzLnRkCiAgIFRBUkdFVCBDbGFuZ1N0bXROb2RlcykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL0NYWEluaGVyaXRhbmNlLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9DWFhJbmhlcml0YW5jZS5oCmluZGV4IGRiZTRhZDAuLjNjN2I3ZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0NYWEluaGVyaXRhbmNlLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvQ1hYSW5oZXJpdGFuY2UuaApAQCAtMTkwLDggKzE5MCw4IEBACiAgIENYWEJhc2VQYXRoJiAgICAgICBmcm9udCgpICAgICAgIHsgcmV0dXJuIFBhdGhzLmZyb250KCk7IH0KICAgY29uc3QgQ1hYQmFzZVBhdGgmIGZyb250KCkgY29uc3QgeyByZXR1cm4gUGF0aHMuZnJvbnQoKTsgfQogICAKLSAgZGVjbF9pdGVyYXRvciBmb3VuZF9kZWNsc19iZWdpbigpOwotICBkZWNsX2l0ZXJhdG9yIGZvdW5kX2RlY2xzX2VuZCgpOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGRlY2xfaXRlcmF0b3I+IGRlY2xfcmFuZ2U7CisgIGRlY2xfcmFuZ2UgZm91bmRfZGVjbHMoKTsKICAgCiAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBhdGggZnJvbSB0aGUgbW9zdC1kZXJpdmVkIHR5cGUgdG8gdGhlCiAgIC8vLyBnaXZlbiBiYXNlIHR5cGUgaXMgYW1iaWd1b3VzIChpLmUuLCBpdCByZWZlcnMgdG8gbXVsdGlwbGUgc3Vib2JqZWN0cyBvZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvQ2Fub25pY2FsVHlwZS5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvQ2Fub25pY2FsVHlwZS5oCmluZGV4IDljNjk5YjcuLjdjY2NlZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0Nhbm9uaWNhbFR5cGUuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9DYW5vbmljYWxUeXBlLmgKQEAgLTE3LDcgKzE3LDYgQEAKIAogI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKICNpbmNsdWRlIDxpdGVyYXRvcj4KIAogbmFtZXNwYWNlIGNsYW5nIHsKQEAgLTYwLDkgKzU5LDkgQEAKIAogICAvLy8gXGJyaWVmIENvbnZlcnRpbmcgY29uc3RydWN0b3IgdGhhdCBwZXJtaXRzIGltcGxpY2l0IHVwY2FzdGluZyBvZgogICAvLy8gY2Fub25pY2FsIHR5cGUgcG9pbnRlcnMuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci0gIENhblF1YWwoY29uc3QgQ2FuUXVhbDxVPiYgT3RoZXIsCi0gICAgICAgICAgdHlwZW5hbWUgbGx2bTo6ZW5hYmxlX2lmPGxsdm06OmlzX2Jhc2Vfb2Y8VCwgVT4sIGludD46OnR5cGUgPSAwKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIENhblF1YWwoY29uc3QgQ2FuUXVhbDxVPiAmT3RoZXIsCisgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPFQsIFU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDApOwogCiAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIHVuZGVybHlpbmcgdHlwZSBwb2ludGVyLCB3aGljaCByZWZlcnMgdG8gYQogICAvLy8gY2Fub25pY2FsIHR5cGUuCkBAIC01NDEsMzkgKzU0MCwzOSBAQAogCiB0ZW1wbGF0ZTw+CiBzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPEZ1bmN0aW9uVHlwZT4gOiBwdWJsaWMgQ2FuUHJveHlCYXNlPEZ1bmN0aW9uVHlwZT4gewotICBMTFZNX0NMQU5HX0NBTlBST1hZX1RZUEVfQUNDRVNTT1IoZ2V0UmVzdWx0VHlwZSkKKyAgTExWTV9DTEFOR19DQU5QUk9YWV9UWVBFX0FDQ0VTU09SKGdldFJldHVyblR5cGUpCiAgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKEZ1bmN0aW9uVHlwZTo6RXh0SW5mbywgZ2V0RXh0SW5mbykKIH07CiAKIHRlbXBsYXRlPD4KIHN0cnVjdCBDYW5Qcm94eUFkYXB0b3I8RnVuY3Rpb25Ob1Byb3RvVHlwZT4KICAgOiBwdWJsaWMgQ2FuUHJveHlCYXNlPEZ1bmN0aW9uTm9Qcm90b1R5cGU+IHsKLSAgTExWTV9DTEFOR19DQU5QUk9YWV9UWVBFX0FDQ0VTU09SKGdldFJlc3VsdFR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfVFlQRV9BQ0NFU1NPUihnZXRSZXR1cm5UeXBlKQogICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihGdW5jdGlvblR5cGU6OkV4dEluZm8sIGdldEV4dEluZm8pCiB9OwogCiB0ZW1wbGF0ZTw+CiBzdHJ1Y3QgQ2FuUHJveHlBZGFwdG9yPEZ1bmN0aW9uUHJvdG9UeXBlPgogICA6IHB1YmxpYyBDYW5Qcm94eUJhc2U8RnVuY3Rpb25Qcm90b1R5cGU+IHsKLSAgTExWTV9DTEFOR19DQU5QUk9YWV9UWVBFX0FDQ0VTU09SKGdldFJlc3VsdFR5cGUpCisgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfVFlQRV9BQ0NFU1NPUihnZXRSZXR1cm5UeXBlKQogICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUihGdW5jdGlvblR5cGU6OkV4dEluZm8sIGdldEV4dEluZm8pCi0gIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKHVuc2lnbmVkLCBnZXROdW1BcmdzKQotICBDYW5RdWFsVHlwZSBnZXRBcmdUeXBlKHVuc2lnbmVkIGkpIGNvbnN0IHsKLSAgICByZXR1cm4gQ2FuUXVhbFR5cGU6OkNyZWF0ZVVuc2FmZSh0aGlzLT5nZXRUeXBlUHRyKCktPmdldEFyZ1R5cGUoaSkpOworICBMTFZNX0NMQU5HX0NBTlBST1hZX1NJTVBMRV9BQ0NFU1NPUih1bnNpZ25lZCwgZ2V0TnVtUGFyYW1zKQorICBDYW5RdWFsVHlwZSBnZXRQYXJhbVR5cGUodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBDYW5RdWFsVHlwZTo6Q3JlYXRlVW5zYWZlKHRoaXMtPmdldFR5cGVQdHIoKS0+Z2V0UGFyYW1UeXBlKGkpKTsKICAgfQogCiAgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKGJvb2wsIGlzVmFyaWFkaWMpCiAgIExMVk1fQ0xBTkdfQ0FOUFJPWFlfU0lNUExFX0FDQ0VTU09SKHVuc2lnbmVkLCBnZXRUeXBlUXVhbHMpCiAKLSAgdHlwZWRlZiBDYW5UeXBlSXRlcmF0b3I8RnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yPgotICAgIGFyZ190eXBlX2l0ZXJhdG9yOworICB0eXBlZGVmIENhblR5cGVJdGVyYXRvcjxGdW5jdGlvblByb3RvVHlwZTo6cGFyYW1fdHlwZV9pdGVyYXRvcj4KKyAgcGFyYW1fdHlwZV9pdGVyYXRvcjsKIAotICBhcmdfdHlwZV9pdGVyYXRvciBhcmdfdHlwZV9iZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gYXJnX3R5cGVfaXRlcmF0b3IodGhpcy0+Z2V0VHlwZVB0cigpLT5hcmdfdHlwZV9iZWdpbigpKTsKKyAgcGFyYW1fdHlwZV9pdGVyYXRvciBwYXJhbV90eXBlX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBwYXJhbV90eXBlX2l0ZXJhdG9yKHRoaXMtPmdldFR5cGVQdHIoKS0+cGFyYW1fdHlwZV9iZWdpbigpKTsKICAgfQogCi0gIGFyZ190eXBlX2l0ZXJhdG9yIGFyZ190eXBlX2VuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYXJnX3R5cGVfaXRlcmF0b3IodGhpcy0+Z2V0VHlwZVB0cigpLT5hcmdfdHlwZV9lbmQoKSk7CisgIHBhcmFtX3R5cGVfaXRlcmF0b3IgcGFyYW1fdHlwZV9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtX3R5cGVfaXRlcmF0b3IodGhpcy0+Z2V0VHlwZVB0cigpLT5wYXJhbV90eXBlX2VuZCgpKTsKICAgfQogCiAgIC8vIE5vdGU6IGNhbm9uaWNhbCBmdW5jdGlvbiB0eXBlcyBuZXZlciBoYXZlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvQ2hhclVuaXRzLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9DaGFyVW5pdHMuaAppbmRleCAwOWZmNjgyLi43MmNhOWY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9DaGFyVW5pdHMuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9DaGFyVW5pdHMuaApAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICAvLy8gUm91bmRVcFRvQWxpZ25tZW50IC0gUmV0dXJucyB0aGUgbmV4dCBpbnRlZ2VyIChtb2QgMioqNjQpIHRoYXQgaXMKICAgICAgIC8vLyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyBxdWFudGl0eSBhbmQgaXMgYSBtdWx0aXBsZSBvZiBccCBBbGlnbi4KICAgICAgIC8vLyBBbGlnbiBtdXN0IGJlIG5vbi16ZXJvLgotICAgICAgQ2hhclVuaXRzIFJvdW5kVXBUb0FsaWdubWVudChjb25zdCBDaGFyVW5pdHMgJkFsaWduKSB7CisgICAgICBDaGFyVW5pdHMgUm91bmRVcFRvQWxpZ25tZW50KGNvbnN0IENoYXJVbml0cyAmQWxpZ24pIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIENoYXJVbml0cyhsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoUXVhbnRpdHksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbi5RdWFudGl0eSkpOwogICAgICAgfQpAQCAtMTczLDEyICsxNzMsNyBAQAogICAgICAgLy8vIEdpdmVuIHRoYXQgdGhpcyBpcyBhIG5vbi16ZXJvIGFsaWdubWVudCB2YWx1ZSwgd2hhdCBpcyB0aGUKICAgICAgIC8vLyBhbGlnbm1lbnQgYXQgdGhlIGdpdmVuIG9mZnNldD8KICAgICAgIENoYXJVbml0cyBhbGlnbm1lbnRBdE9mZnNldChDaGFyVW5pdHMgb2Zmc2V0KSB7Ci0gICAgICAgIC8vIGFsaWdubWVudDogMDAxMDAwMAotICAgICAgICAvLyBvZmZzZXQ6ICAgIDEwMTExMDAKLSAgICAgICAgLy8gbG93Qml0czogICAwMDAxMDExCi0gICAgICAgIC8vIHJlc3VsdDogICAgMDAwMDEwMAotICAgICAgICBRdWFudGl0eVR5cGUgbG93Qml0cyA9IChRdWFudGl0eS0xKSAmIChvZmZzZXQuUXVhbnRpdHktMSk7Ci0gICAgICAgIHJldHVybiBDaGFyVW5pdHMoKGxvd0JpdHMgKyAxKSAmIH5sb3dCaXRzKTsKKyAgICAgICAgcmV0dXJuIENoYXJVbml0cyhsbHZtOjpNaW5BbGlnbihRdWFudGl0eSwgb2Zmc2V0LlF1YW50aXR5KSk7CiAgICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudC5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudC5oCmluZGV4IDI4ODQ5ZjUuLjUwZTkxOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnQuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50LmgKQEAgLTE5NCw5ICsxOTQsOSBAQAogCiAgIGNvbnN0IGNoYXIgKmdldENvbW1lbnRLaW5kTmFtZSgpIGNvbnN0OwogCi0gIExMVk1fQVRUUklCVVRFX1VTRUQgdm9pZCBkdW1wKCkgY29uc3Q7Ci0gIExMVk1fQVRUUklCVVRFX1VTRUQgdm9pZCBkdW1wQ29sb3IoKSBjb25zdDsKLSAgTExWTV9BVFRSSUJVVEVfVVNFRCB2b2lkIGR1bXAoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCkgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIGR1bXBDb2xvcigpIGNvbnN0OworICB2b2lkIGR1bXAoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCkgY29uc3Q7CiAgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IENvbW1hbmRUcmFpdHMgKlRyYWl0cywKICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgKlNNKSBjb25zdDsKIApAQCAtNjk5LDcgKzY5OSw3IEBACiAgIHVuc2lnbmVkIFBhcmFtSW5kZXg7CiAKIHB1YmxpYzoKLSAgZW51bSBMTFZNX0VOVU1fSU5UX1RZUEUodW5zaWduZWQpIHsKKyAgZW51bSA6IHVuc2lnbmVkIHsKICAgICBJbnZhbGlkUGFyYW1JbmRleCA9IH4wVSwKICAgICBWYXJBcmdQYXJhbUluZGV4ID0gfjBVLypJbnZhbGlkUGFyYW1JbmRleCovIC0gMVUKICAgfTsKQEAgLTk4MSw5ICs5ODEsOSBAQAogICAvLy8gdGhhdCB3ZSBjb25zaWRlciBhICJmdW5jdGlvbiIuCiAgIEFycmF5UmVmPGNvbnN0IFBhcm1WYXJEZWNsICo+IFBhcmFtVmFyczsKIAotICAvLy8gRnVuY3Rpb24gcmVzdWx0IHR5cGUgaWYgXGMgQ29tbWVudERlY2wgaXMgc29tZXRoaW5nIHRoYXQgd2UgY29uc2lkZXIKKyAgLy8vIEZ1bmN0aW9uIHJldHVybiB0eXBlIGlmIFxjIENvbW1lbnREZWNsIGlzIHNvbWV0aGluZyB0aGF0IHdlIGNvbnNpZGVyCiAgIC8vLyBhICJmdW5jdGlvbiIuCi0gIFF1YWxUeXBlIFJlc3VsdFR5cGU7CisgIFF1YWxUeXBlIFJldHVyblR5cGU7CiAKICAgLy8vIFRlbXBsYXRlIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBieSBcXHRwYXJhbSBpZiBcYyBDb21tZW50RGVjbCBpcwogICAvLy8gYSB0ZW1wbGF0ZSAoXGMgSXNUZW1wbGF0ZURlY2wgb3IgXGMgSXNUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbiBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudENvbW1hbmRzLnRkIGIvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudENvbW1hbmRzLnRkCmluZGV4IGVkMzIzZGEuLjk1OGVlMDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRDb21tYW5kcy50ZAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50Q29tbWFuZHMudGQKQEAgLTE0Niw3ICsxNDYsNyBAQAogZGVmIFZlcnNpb24gICAgOiBCbG9ja0NvbW1hbmQ8InZlcnNpb24iPjsKIGRlZiBXYXJuaW5nICAgIDogQmxvY2tDb21tYW5kPCJ3YXJuaW5nIj47CiAvLyBIZWFkZXJEb2MgY29tbWFuZHMKLWRlZiBBYnN0cmFjdCAgICAgIDogQmxvY2tDb21tYW5kPCJhYnN0cmFjdCI+OworZGVmIEFic3RyYWN0ICAgICAgOiBCbG9ja0NvbW1hbmQ8ImFic3RyYWN0Ij4geyBsZXQgSXNCcmllZkNvbW1hbmQgPSAxOyB9CiBkZWYgQ2xhc3NEZXNpZ24gICA6IFJlY29yZExpa2VEZXRhaWxDb21tYW5kPCJjbGFzc2Rlc2lnbiI+OwogZGVmIENvQ2xhc3MgICAgICAgOiBSZWNvcmRMaWtlRGV0YWlsQ29tbWFuZDwiY29jbGFzcyI+OwogZGVmIERlcGVuZGVuY3kgICAgOiBSZWNvcmRMaWtlRGV0YWlsQ29tbWFuZDwiZGVwZW5kZW5jeSI+OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudExleGVyLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50TGV4ZXIuaAppbmRleCBmMTUyYzc3Li44MDcwNjE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50TGV4ZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50TGV4ZXIuaApAQCAtMTQsOCArMTQsOCBAQAogI2lmbmRlZiBMTFZNX0NMQU5HX0FTVF9DT01NRU5UX0xFWEVSX0gKICNkZWZpbmUgTExWTV9DTEFOR19BU1RfQ09NTUVOVF9MRVhFUl9ICiAKLSNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCkBAIC0yOTMsMTcgKzI5Myw3IEBACiAgIFN0cmluZ1JlZiByZXNvbHZlSFRNTEhleENoYXJhY3RlclJlZmVyZW5jZShTdHJpbmdSZWYgTmFtZSkgY29uc3Q7CiAKICAgdm9pZCBmb3JtVG9rZW5XaXRoQ2hhcnMoVG9rZW4gJlJlc3VsdCwgY29uc3QgY2hhciAqVG9rRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBLaW5kKSB7Ci0gICAgY29uc3QgdW5zaWduZWQgVG9rTGVuID0gVG9rRW5kIC0gQnVmZmVyUHRyOwotICAgIFJlc3VsdC5zZXRMb2NhdGlvbihnZXRTb3VyY2VMb2NhdGlvbihCdWZmZXJQdHIpKTsKLSAgICBSZXN1bHQuc2V0S2luZChLaW5kKTsKLSAgICBSZXN1bHQuc2V0TGVuZ3RoKFRva0xlbik7Ci0jaWZuZGVmIE5ERUJVRwotICAgIFJlc3VsdC5UZXh0UHRyID0gIjxVTlNFVD4iOwotICAgIFJlc3VsdC5JbnRWYWwgPSA3OwotI2VuZGlmCi0gICAgQnVmZmVyUHRyID0gVG9rRW5kOwotICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIEtpbmQpOwogCiAgIHZvaWQgZm9ybVRleHRUb2tlbihUb2tlbiAmUmVzdWx0LCBjb25zdCBjaGFyICpUb2tFbmQpIHsKICAgICBTdHJpbmdSZWYgVGV4dChCdWZmZXJQdHIsIFRva0VuZCAtIEJ1ZmZlclB0cik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9EYXRhUmVjdXJzaXZlQVNUVmlzaXRvci5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTAyNThlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3IuaApAQCAtMCwwICsxLDI0MzcgQEAKKy8vPT09LS0tIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yLmggLSBEYXRhLVJlY3Vyc2l2ZSBBU1QgVmlzaXRvciAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvciBpbnRlcmZhY2UsIHdoaWNoIHJlY3Vyc2l2ZWx5CisvLyAgdHJhdmVyc2VzIHRoZSBlbnRpcmUgQVNULCB1c2luZyBkYXRhIHJlY3Vyc2lvbiBmb3IgU3RtdHMvRXhwcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9DTEFOR19BU1RfREFUQVJFQ1VSU0lWRUFTVFZJU0lUT1JfSAorI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9EQVRBUkVDVVJTSVZFQVNUVklTSVRPUl9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQXR0ci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbEZyaWVuZC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsT2JqQy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsT3Blbk1QLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwck9iakMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvTmVzdGVkTmFtZVNwZWNpZmllci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE9iakMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE9wZW5NUC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9UZW1wbGF0ZUJhc2UuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVGVtcGxhdGVOYW1lLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZUxvYy5oIgorCisvLyBUaGUgZm9sbG93aW5nIHRocmVlIG1hY3JvcyBhcmUgdXNlZCBmb3IgbWV0YSBwcm9ncmFtbWluZy4gIFRoZSBjb2RlCisvLyB1c2luZyB0aGVtIGlzIHJlc3BvbnNpYmxlIGZvciBkZWZpbmluZyBtYWNybyBPUEVSQVRPUigpLgorCisvLyBBbGwgdW5hcnkgb3BlcmF0b3JzLgorI2RlZmluZSBVTkFSWU9QX0xJU1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUEVSQVRPUihQb3N0SW5jKSAgIE9QRVJBVE9SKFBvc3REZWMpICAgICAgICAgXAorICBPUEVSQVRPUihQcmVJbmMpICAgIE9QRVJBVE9SKFByZURlYykgICAgICAgICAgXAorICBPUEVSQVRPUihBZGRyT2YpICAgIE9QRVJBVE9SKERlcmVmKSAgICAgICAgICAgXAorICBPUEVSQVRPUihQbHVzKSAgICAgIE9QRVJBVE9SKE1pbnVzKSAgICAgICAgICAgXAorICBPUEVSQVRPUihOb3QpICAgICAgIE9QRVJBVE9SKExOb3QpICAgICAgICAgICAgXAorICBPUEVSQVRPUihSZWFsKSAgICAgIE9QRVJBVE9SKEltYWcpICAgICAgICAgICAgXAorICBPUEVSQVRPUihFeHRlbnNpb24pCisKKy8vIEFsbCBiaW5hcnkgb3BlcmF0b3JzIChleGNsdWRpbmcgY29tcG91bmQgYXNzaWduIG9wZXJhdG9ycykuCisjZGVmaW5lIEJJTk9QX0xJU1QoKSBcCisgIE9QRVJBVE9SKFB0ck1lbUQpICAgICAgICAgICAgICBPUEVSQVRPUihQdHJNZW1JKSAgICBcCisgIE9QRVJBVE9SKE11bCkgICBPUEVSQVRPUihEaXYpICBPUEVSQVRPUihSZW0pICAgICAgICBcCisgIE9QRVJBVE9SKEFkZCkgICBPUEVSQVRPUihTdWIpICBPUEVSQVRPUihTaGwpICAgICAgICBcCisgIE9QRVJBVE9SKFNocikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QRVJBVE9SKExUKSAgICBPUEVSQVRPUihHVCkgICBPUEVSQVRPUihMRSkgICAgICAgICBcCisgIE9QRVJBVE9SKEdFKSAgICBPUEVSQVRPUihFUSkgICBPUEVSQVRPUihORSkgICAgICAgICBcCisgIE9QRVJBVE9SKEFuZCkgICBPUEVSQVRPUihYb3IpICBPUEVSQVRPUihPcikgICAgICAgICBcCisgIE9QRVJBVE9SKExBbmQpICBPUEVSQVRPUihMT3IpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QRVJBVE9SKEFzc2lnbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QRVJBVE9SKENvbW1hKQorCisvLyBBbGwgY29tcG91bmQgYXNzaWduIG9wZXJhdG9ycy4KKyNkZWZpbmUgQ0FPX0xJU1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BFUkFUT1IoTXVsKSBPUEVSQVRPUihEaXYpIE9QRVJBVE9SKFJlbSkgT1BFUkFUT1IoQWRkKSBPUEVSQVRPUihTdWIpIFwKKyAgT1BFUkFUT1IoU2hsKSBPUEVSQVRPUihTaHIpIE9QRVJBVE9SKEFuZCkgT1BFUkFUT1IoT3IpICBPUEVSQVRPUihYb3IpCisKK25hbWVzcGFjZSBjbGFuZyB7CisKKy8vIEEgaGVscGVyIG1hY3JvIHRvIGltcGxlbWVudCBzaG9ydC1jaXJjdWl0aW5nIHdoZW4gcmVjdXJzaW5nLiAgSXQKKy8vIGludm9rZXMgQ0FMTF9FWFBSLCB3aGljaCBtdXN0IGJlIGEgbWV0aG9kIGNhbGwsIG9uIHRoZSBkZXJpdmVkCisvLyBvYmplY3QgKHMudC4gYSB1c2VyIG9mIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yIGNhbiBvdmVycmlkZSB0aGUgbWV0aG9kCisvLyBpbiBDQUxMX0VYUFIpLgorI2RlZmluZSBUUllfVE8oQ0FMTF9FWFBSKSBcCisgIGRvIHsgaWYgKCFnZXREZXJpdmVkKCkuQ0FMTF9FWFBSKSByZXR1cm4gZmFsc2U7IH0gd2hpbGUgKDApCisKKy8vLyBcYnJpZWYgQSBjbGFzcyB0aGF0IGRvZXMgcHJlb3JkZXIgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIG9uIHRoZQorLy8vIGVudGlyZSBDbGFuZyBBU1QgYW5kIHZpc2l0cyBlYWNoIG5vZGUuCisvLy8KKy8vLyBUaGlzIGNsYXNzIHBlcmZvcm1zIHRocmVlIGRpc3RpbmN0IHRhc2tzOgorLy8vICAgMS4gdHJhdmVyc2UgdGhlIEFTVCAoaS5lLiBnbyB0byBlYWNoIG5vZGUpOworLy8vICAgMi4gYXQgYSBnaXZlbiBub2RlLCB3YWxrIHVwIHRoZSBjbGFzcyBoaWVyYXJjaHksIHN0YXJ0aW5nIGZyb20KKy8vLyAgICAgIHRoZSBub2RlJ3MgZHluYW1pYyB0eXBlLCB1bnRpbCB0aGUgdG9wLW1vc3QgY2xhc3MgKGUuZy4gU3RtdCwKKy8vLyAgICAgIERlY2wsIG9yIFR5cGUpIGlzIHJlYWNoZWQuCisvLy8gICAzLiBnaXZlbiBhIChub2RlLCBjbGFzcykgY29tYmluYXRpb24sIHdoZXJlICdjbGFzcycgaXMgc29tZSBiYXNlCisvLy8gICAgICBjbGFzcyBvZiB0aGUgZHluYW1pYyB0eXBlIG9mICdub2RlJywgY2FsbCBhIHVzZXItb3ZlcnJpZGFibGUKKy8vLyAgICAgIGZ1bmN0aW9uIHRvIGFjdHVhbGx5IHZpc2l0IHRoZSBub2RlLgorLy8vCisvLy8gVGhlc2UgdGFza3MgYXJlIGRvbmUgYnkgdGhyZWUgZ3JvdXBzIG9mIG1ldGhvZHMsIHJlc3BlY3RpdmVseToKKy8vLyAgIDEuIFRyYXZlcnNlRGVjbChEZWNsICp4KSBkb2VzIHRhc2sgIzEuICBJdCBpcyB0aGUgZW50cnkgcG9pbnQKKy8vLyAgICAgIGZvciB0cmF2ZXJzaW5nIGFuIEFTVCByb290ZWQgYXQgeC4gIFRoaXMgbWV0aG9kIHNpbXBseQorLy8vICAgICAgZGlzcGF0Y2hlcyAoaS5lLiBmb3J3YXJkcykgdG8gVHJhdmVyc2VGb28oRm9vICp4KSB3aGVyZSBGb28KKy8vLyAgICAgIGlzIHRoZSBkeW5hbWljIHR5cGUgb2YgKngsIHdoaWNoIGNhbGxzIFdhbGtVcEZyb21Gb28oeCkgYW5kCisvLy8gICAgICB0aGVuIHJlY3Vyc2l2ZWx5IHZpc2l0cyB0aGUgY2hpbGQgbm9kZXMgb2YgeC4KKy8vLyAgICAgIFRyYXZlcnNlU3RtdChTdG10ICp4KSBhbmQgVHJhdmVyc2VUeXBlKFF1YWxUeXBlIHgpIHdvcmsKKy8vLyAgICAgIHNpbWlsYXJseS4KKy8vLyAgIDIuIFdhbGtVcEZyb21Gb28oRm9vICp4KSBkb2VzIHRhc2sgIzIuICBJdCBkb2VzIG5vdCB0cnkgdG8gdmlzaXQKKy8vLyAgICAgIGFueSBjaGlsZCBub2RlIG9mIHguICBJbnN0ZWFkLCBpdCBmaXJzdCBjYWxscyBXYWxrVXBGcm9tQmFyKHgpCisvLy8gICAgICB3aGVyZSBCYXIgaXMgdGhlIGRpcmVjdCBwYXJlbnQgY2xhc3Mgb2YgRm9vICh1bmxlc3MgRm9vIGhhcworLy8vICAgICAgbm8gcGFyZW50KSwgYW5kIHRoZW4gY2FsbHMgVmlzaXRGb28oeCkgKHNlZSB0aGUgbmV4dCBsaXN0IGl0ZW0pLgorLy8vICAgMy4gVmlzaXRGb28oRm9vICp4KSBkb2VzIHRhc2sgIzMuCisvLy8KKy8vLyBUaGVzZSB0aHJlZSBtZXRob2QgZ3JvdXBzIGFyZSB0aWVyZWQgKFRyYXZlcnNlKiA+IFdhbGtVcEZyb20qID4KKy8vLyBWaXNpdCopLiAgQSBtZXRob2QgKGUuZy4gVHJhdmVyc2UqKSBtYXkgY2FsbCBtZXRob2RzIGZyb20gdGhlIHNhbWUKKy8vLyB0aWVyIChlLmcuIG90aGVyIFRyYXZlcnNlKikgb3Igb25lIHRpZXIgbG93ZXIgKGUuZy4gV2Fsa1VwRnJvbSopLgorLy8vIEl0IG1heSBub3QgY2FsbCBtZXRob2RzIGZyb20gYSBoaWdoZXIgdGllci4KKy8vLworLy8vIE5vdGUgdGhhdCBzaW5jZSBXYWxrVXBGcm9tRm9vKCkgY2FsbHMgV2Fsa1VwRnJvbUJhcigpICh3aGVyZSBCYXIKKy8vLyBpcyBGb28ncyBzdXBlciBjbGFzcykgYmVmb3JlIGNhbGxpbmcgVmlzaXRGb28oKSwgdGhlIHJlc3VsdCBpcworLy8vIHRoYXQgdGhlIFZpc2l0KigpIG1ldGhvZHMgZm9yIGEgZ2l2ZW4gbm9kZSBhcmUgY2FsbGVkIGluIHRoZQorLy8vIHRvcC1kb3duIG9yZGVyIChlLmcuIGZvciBhIG5vZGUgb2YgdHlwZSBOYW1lZERlY2wsIHRoZSBvcmRlciB3aWxsCisvLy8gYmUgVmlzaXREZWNsKCksIFZpc2l0TmFtZWREZWNsKCksIGFuZCB0aGVuIFZpc2l0TmFtZXNwYWNlRGVjbCgpKS4KKy8vLworLy8vIFRoaXMgc2NoZW1lIGd1YXJhbnRlZXMgdGhhdCBhbGwgVmlzaXQqKCkgY2FsbHMgZm9yIHRoZSBzYW1lIEFTVAorLy8vIG5vZGUgYXJlIGdyb3VwZWQgdG9nZXRoZXIuICBJbiBvdGhlciB3b3JkcywgVmlzaXQqKCkgbWV0aG9kcyBmb3IKKy8vLyBkaWZmZXJlbnQgbm9kZXMgYXJlIG5ldmVyIGludGVybGVhdmVkLgorLy8vCisvLy8gU3RtdHMgYXJlIHRyYXZlcnNlZCBpbnRlcm5hbGx5IHVzaW5nIGEgZGF0YSBxdWV1ZSB0byBhdm9pZCBhIHN0YWNrIG92ZXJmbG93CisvLy8gd2l0aCBodWdlbHkgbmVzdGVkIEFTVHMuCisvLy8KKy8vLyBDbGllbnRzIG9mIHRoaXMgdmlzaXRvciBzaG91bGQgc3ViY2xhc3MgdGhlIHZpc2l0b3IgKHByb3ZpZGluZworLy8vIHRoZW1zZWx2ZXMgYXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50LCB1c2luZyB0aGUgY3VyaW91c2x5IHJlY3VycmluZworLy8vIHRlbXBsYXRlIHBhdHRlcm4pIGFuZCBvdmVycmlkZSBhbnkgb2YgdGhlIFRyYXZlcnNlKiwgV2Fsa1VwRnJvbSosCisvLy8gYW5kIFZpc2l0KiBtZXRob2RzIGZvciBkZWNsYXJhdGlvbnMsIHR5cGVzLCBzdGF0ZW1lbnRzLAorLy8vIGV4cHJlc3Npb25zLCBvciBvdGhlciBBU1Qgbm9kZXMgd2hlcmUgdGhlIHZpc2l0b3Igc2hvdWxkIGN1c3RvbWl6ZQorLy8vIGJlaGF2aW9yLiAgTW9zdCB1c2VycyBvbmx5IG5lZWQgdG8gb3ZlcnJpZGUgVmlzaXQqLiAgQWR2YW5jZWQKKy8vLyB1c2VycyBtYXkgb3ZlcnJpZGUgVHJhdmVyc2UqIGFuZCBXYWxrVXBGcm9tKiB0byBpbXBsZW1lbnQgY3VzdG9tCisvLy8gdHJhdmVyc2FsIHN0cmF0ZWdpZXMuICBSZXR1cm5pbmcgZmFsc2UgZnJvbSBvbmUgb2YgdGhlc2Ugb3ZlcnJpZGRlbgorLy8vIGZ1bmN0aW9ucyB3aWxsIGFib3J0IHRoZSBlbnRpcmUgdHJhdmVyc2FsLgorLy8vCisvLy8gQnkgZGVmYXVsdCwgdGhpcyB2aXNpdG9yIHRyaWVzIHRvIHZpc2l0IGV2ZXJ5IHBhcnQgb2YgdGhlIGV4cGxpY2l0CisvLy8gc291cmNlIGNvZGUgZXhhY3RseSBvbmNlLiAgVGhlIGRlZmF1bHQgcG9saWN5IHRvd2FyZHMgdGVtcGxhdGVzCisvLy8gaXMgdG8gZGVzY2VuZCBpbnRvIHRoZSAncGF0dGVybicgY2xhc3Mgb3IgZnVuY3Rpb24gYm9keSwgbm90IGFueQorLy8vIGV4cGxpY2l0IG9yIGltcGxpY2l0IGluc3RhbnRpYXRpb25zLiAgRXhwbGljaXQgc3BlY2lhbGl6YXRpb25zCisvLy8gYXJlIHN0aWxsIHZpc2l0ZWQsIGFuZCB0aGUgcGF0dGVybnMgb2YgcGFydGlhbCBzcGVjaWFsaXphdGlvbnMKKy8vLyBhcmUgdmlzaXRlZCBzZXBhcmF0ZWx5LiAgVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCBieQorLy8vIG92ZXJyaWRpbmcgc2hvdWxkVmlzaXRUZW1wbGF0ZUluc3RhbnRpYXRpb25zKCkgaW4gdGhlIGRlcml2ZWQgY2xhc3MKKy8vLyB0byByZXR1cm4gdHJ1ZSwgaW4gd2hpY2ggY2FzZSBhbGwga25vd24gaW1wbGljaXQgYW5kIGV4cGxpY2l0CisvLy8gaW5zdGFudGlhdGlvbnMgd2lsbCBiZSB2aXNpdGVkIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIHBhdHRlcm4KKy8vLyBmcm9tIHdoaWNoIHRoZXkgd2VyZSBwcm9kdWNlZC4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitjbGFzcyBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvciB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBkZXJpdmVkIGNsYXNzLgorICBEZXJpdmVkICZnZXREZXJpdmVkKCkgeyByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWQqPih0aGlzKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHdoZXRoZXIgdGhpcyB2aXNpdG9yIHNob3VsZCByZWN1cnNlIGludG8KKyAgLy8vIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zLgorICBib29sIHNob3VsZFZpc2l0VGVtcGxhdGVJbnN0YW50aWF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gd2hldGhlciB0aGlzIHZpc2l0b3Igc2hvdWxkIHJlY3Vyc2UgaW50byB0aGUgdHlwZXMgb2YKKyAgLy8vIFR5cGVMb2NzLgorICBib29sIHNob3VsZFdhbGtUeXBlc09mVHlwZUxvY3MoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIHN0YXRlbWVudCBvciBleHByZXNzaW9uLCBieQorICAvLy8gZGlzcGF0Y2hpbmcgdG8gVHJhdmVyc2UqKCkgYmFzZWQgb24gdGhlIGFyZ3VtZW50J3MgZHluYW1pYyB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlCisgIC8vLyBvdGhlcndpc2UgKGluY2x1ZGluZyB3aGVuIHRoZSBhcmd1bWVudCBpcyBOVUxMKS4KKyAgYm9vbCBUcmF2ZXJzZVN0bXQoU3RtdCAqUyk7CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIHR5cGUsIGJ5IGRpc3BhdGNoaW5nIHRvCisgIC8vLyBUcmF2ZXJzZSpUeXBlKCkgYmFzZWQgb24gdGhlIGFyZ3VtZW50J3MgZ2V0VHlwZUNsYXNzKCkgcHJvcGVydHkuCisgIC8vLworICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUKKyAgLy8vIG90aGVyd2lzZSAoaW5jbHVkaW5nIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGEgTnVsbCB0eXBlKS4KKyAgYm9vbCBUcmF2ZXJzZVR5cGUoUXVhbFR5cGUgVCk7CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIHR5cGUgd2l0aCBsb2NhdGlvbiwgYnkgZGlzcGF0Y2hpbmcgdG8KKyAgLy8vIFRyYXZlcnNlKlR5cGVMb2MoKSBiYXNlZCBvbiB0aGUgYXJndW1lbnQgdHlwZSdzIGdldFR5cGVDbGFzcygpIHByb3BlcnR5LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlCisgIC8vLyBvdGhlcndpc2UgKGluY2x1ZGluZyB3aGVuIHRoZSBhcmd1bWVudCBpcyBhIE51bGwgdHlwZSBsb2NhdGlvbikuCisgIGJvb2wgVHJhdmVyc2VUeXBlTG9jKFR5cGVMb2MgVEwpOworCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYW4gYXR0cmlidXRlLCBieSBkaXNwYXRjaGluZyB0bworICAvLy8gVHJhdmVyc2UqQXR0cigpIGJhc2VkIG9uIHRoZSBhcmd1bWVudCdzIGR5bmFtaWMgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZQorICAvLy8gb3RoZXJ3aXNlIChpbmNsdWRpbmcgd2hlbiB0aGUgYXJndW1lbnQgaXMgYSBOdWxsIHR5cGUgbG9jYXRpb24pLgorICBib29sIFRyYXZlcnNlQXR0cihBdHRyICpBdCk7CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIGRlY2xhcmF0aW9uLCBieSBkaXNwYXRjaGluZyB0bworICAvLy8gVHJhdmVyc2UqRGVjbCgpIGJhc2VkIG9uIHRoZSBhcmd1bWVudCdzIGR5bmFtaWMgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZQorICAvLy8gb3RoZXJ3aXNlIChpbmNsdWRpbmcgd2hlbiB0aGUgYXJndW1lbnQgaXMgTlVMTCkuCisgIGJvb2wgVHJhdmVyc2VEZWNsKERlY2wgKkQpOworCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSBDKysgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlIG90aGVyd2lzZS4KKyAgYm9vbCBUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXIoTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TKTsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGEgQysrIG5lc3RlZC1uYW1lLXNwZWNpZmllciB3aXRoIGxvY2F0aW9uCisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgTk5TKTsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGEgbmFtZSB3aXRoIGl0cyBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKERlY2xhcmF0aW9uTmFtZUluZm8gTmFtZUluZm8pOworCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSB0ZW1wbGF0ZSBuYW1lIGFuZCBkaXNwYXRjaCB0byB0aGUKKyAgLy8vIGFwcHJvcHJpYXRlIG1ldGhvZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgVHJhdmVyc2VUZW1wbGF0ZU5hbWUoVGVtcGxhdGVOYW1lIFRlbXBsYXRlKTsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGEgdGVtcGxhdGUgYXJndW1lbnQgYW5kIGRpc3BhdGNoIHRvIHRoZQorICAvLy8gYXBwcm9wcmlhdGUgbWV0aG9kIGZvciB0aGUgYXJndW1lbnQgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCisgIC8vIEZJWE1FOiBtaWdyYXRlIGNhbGxlcnMgdG8gVGVtcGxhdGVBcmd1bWVudExvYyBpbnN0ZWFkLgorICBib29sIFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudChjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICZBcmcpOworCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSB0ZW1wbGF0ZSBhcmd1bWVudCBsb2NhdGlvbiBhbmQgZGlzcGF0Y2ggdG8gdGhlCisgIC8vLyBhcHByb3ByaWF0ZSBtZXRob2QgZm9yIHRoZSBhcmd1bWVudCB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlIG90aGVyd2lzZS4KKyAgYm9vbCBUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2MoY29uc3QgVGVtcGxhdGVBcmd1bWVudExvYyAmQXJnTG9jKTsKKworICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGEgc2V0IG9mIHRlbXBsYXRlIGFyZ3VtZW50cy4KKyAgLy8vIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcywgYnV0IGl0J3Mgbm90IGV4cGVjdGVkIHRoYXQKKyAgLy8vIHdpbGwgYmUgbmVlZGVkIC0tIHRoaXMgdmlzaXRvciBhbHdheXMgZGlzcGF0Y2hlcyB0byBhbm90aGVyLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlIG90aGVyd2lzZS4KKyAgLy8gRklYTUU6IHRha2UgYSBUZW1wbGF0ZUFyZ3VtZW50TG9jKiAob3IgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvKSBpbnN0ZWFkLgorICBib29sIFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudHMoY29uc3QgVGVtcGxhdGVBcmd1bWVudCAqQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUFyZ3MpOworCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSBjb25zdHJ1Y3RvciBpbml0aWFsaXplci4gIFRoaXMKKyAgLy8vIGF1dG9tYXRpY2FsbHkgZGlzcGF0Y2hlcyB0byBhbm90aGVyIHZpc2l0b3IgZm9yIHRoZSBpbml0aWFsaXplcgorICAvLy8gZXhwcmVzc2lvbiwgYnV0IG5vdCBmb3IgdGhlIG5hbWUgb2YgdGhlIGluaXRpYWxpemVyLCBzbyBtYXkKKyAgLy8vIGJlIG92ZXJyaWRkZW4gZm9yIGNsaWVudHMgdGhhdCBuZWVkIGFjY2VzcyB0byB0aGUgbmFtZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCisgIGJvb2wgVHJhdmVyc2VDb25zdHJ1Y3RvckluaXRpYWxpemVyKENYWEN0b3JJbml0aWFsaXplciAqSW5pdCk7CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIGxhbWJkYSBjYXB0dXJlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlIG90aGVyd2lzZS4KKyAgYm9vbCBUcmF2ZXJzZUxhbWJkYUNhcHR1cmUoTGFtYmRhRXhwcjo6Q2FwdHVyZSBDKTsKKworICAvLyAtLS0tIE1ldGhvZHMgb24gQXR0cnMgLS0tLQorCisgIC8vIFxicmllZiBWaXNpdCBhbiBhdHRyaWJ1dGUuCisgIGJvb2wgVmlzaXRBdHRyKEF0dHIgKkEpIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBEZWNsYXJlIFRyYXZlcnNlKiBhbmQgZW1wdHkgVmlzaXQqIGZvciBhbGwgQXR0ciBjbGFzc2VzLgorI2RlZmluZSBBVFRSX1ZJU0lUT1JfREVDTFNfT05MWQorI2luY2x1ZGUgImNsYW5nL0FTVC9BdHRyVmlzaXRvci5pbmMiCisjdW5kZWYgQVRUUl9WSVNJVE9SX0RFQ0xTX09OTFkKKworICAvLyAtLS0tIE1ldGhvZHMgb24gU3RtdHMgLS0tLQorCisgIC8vIERlY2xhcmUgVHJhdmVyc2UqKCkgZm9yIGFsbCBjb25jcmV0ZSBTdG10IGNsYXNzZXMuCisjZGVmaW5lIEFCU1RSQUNUX1NUTVQoU1RNVCkKKyNkZWZpbmUgU1RNVChDTEFTUywgUEFSRU5UKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgVHJhdmVyc2UjI0NMQVNTKENMQVNTICpTKTsKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE5vZGVzLmluYyIKKyAgLy8gVGhlIGFib3ZlIGhlYWRlciAjdW5kZWZzIEFCU1RSQUNUX1NUTVQgYW5kIFNUTVQgdXBvbiBleGl0LgorCisgIC8vIERlZmluZSBXYWxrVXBGcm9tKigpIGFuZCBlbXB0eSBWaXNpdCooKSBmb3IgYWxsIFN0bXQgY2xhc3Nlcy4KKyAgYm9vbCBXYWxrVXBGcm9tU3RtdChTdG10ICpTKSB7IHJldHVybiBnZXREZXJpdmVkKCkuVmlzaXRTdG10KFMpOyB9CisgIGJvb2wgVmlzaXRTdG10KFN0bXQgKlMpIHsgcmV0dXJuIHRydWU7IH0KKyNkZWZpbmUgU1RNVChDTEFTUywgUEFSRU5UKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgV2Fsa1VwRnJvbSMjQ0xBU1MoQ0xBU1MgKlMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRSWV9UTyhXYWxrVXBGcm9tIyNQQVJFTlQoUykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oVmlzaXQjI0NMQVNTKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBWaXNpdCMjQ0xBU1MoQ0xBU1MgKlMpIHsgcmV0dXJuIHRydWU7IH0KKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE5vZGVzLmluYyIKKworICAvLyBEZWZpbmUgVHJhdmVyc2UqKCksIFdhbGtVcEZyb20qKCksIGFuZCBWaXNpdCooKSBmb3IgdW5hcnkKKyAgLy8gb3BlcmF0b3IgbWV0aG9kcy4gIFVuYXJ5IG9wZXJhdG9ycyBhcmUgbm90IGNsYXNzZXMgaW4gdGhlbXNlbHZlcworICAvLyAodGhleSdyZSBhbGwgb3Bjb2RlcyBpbiBVbmFyeU9wZXJhdG9yKSBidXQgZG8gaGF2ZSB2aXNpdG9ycy4KKyNkZWZpbmUgT1BFUkFUT1IoTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFRyYXZlcnNlVW5hcnkjI05BTUUoVW5hcnlPcGVyYXRvciAqUykgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oV2Fsa1VwRnJvbVVuYXJ5IyNOQU1FKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU3RtdFF1ZXVlQWN0aW9uIFN0bXRRdWV1ZSgqdGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFN0bXRRdWV1ZS5xdWV1ZShTLT5nZXRTdWJFeHByKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFdhbGtVcEZyb21VbmFyeSMjTkFNRShVbmFyeU9wZXJhdG9yICpTKSB7ICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oV2Fsa1VwRnJvbVVuYXJ5T3BlcmF0b3IoUykpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFJZX1RPKFZpc2l0VW5hcnkjI05BTUUoUykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgVmlzaXRVbmFyeSMjTkFNRShVbmFyeU9wZXJhdG9yICpTKSB7IHJldHVybiB0cnVlOyB9CisKKyAgVU5BUllPUF9MSVNUKCkKKyN1bmRlZiBPUEVSQVRPUgorCisgIC8vIERlZmluZSBUcmF2ZXJzZSooKSwgV2Fsa1VwRnJvbSooKSwgYW5kIFZpc2l0KigpIGZvciBiaW5hcnkKKyAgLy8gb3BlcmF0b3IgbWV0aG9kcy4gIEJpbmFyeSBvcGVyYXRvcnMgYXJlIG5vdCBjbGFzc2VzIGluIHRoZW1zZWx2ZXMKKyAgLy8gKHRoZXkncmUgYWxsIG9wY29kZXMgaW4gQmluYXJ5T3BlcmF0b3IpIGJ1dCBkbyBoYXZlIHZpc2l0b3JzLgorI2RlZmluZSBHRU5FUkFMX0JJTk9QX0ZBTExCQUNLKE5BTUUsIEJJTk9QX1RZUEUpICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBUcmF2ZXJzZUJpbiMjTkFNRShCSU5PUF9UWVBFICpTKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFJZX1RPKFdhbGtVcEZyb21CaW4jI05BTUUoUykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFN0bXRRdWV1ZUFjdGlvbiBTdG10UXVldWUoKnRoaXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTdG10UXVldWUucXVldWUoUy0+Z2V0TEhTKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU3RtdFF1ZXVlLnF1ZXVlKFMtPmdldFJIUygpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgV2Fsa1VwRnJvbUJpbiMjTkFNRShCSU5PUF9UWVBFICpTKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRSWV9UTyhXYWxrVXBGcm9tIyNCSU5PUF9UWVBFKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oVmlzaXRCaW4jI05BTUUoUykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBWaXNpdEJpbiMjTkFNRShCSU5PUF9UWVBFICpTKSB7IHJldHVybiB0cnVlOyB9CisKKyNkZWZpbmUgT1BFUkFUT1IoTkFNRSkgR0VORVJBTF9CSU5PUF9GQUxMQkFDSyhOQU1FLCBCaW5hcnlPcGVyYXRvcikKKyAgQklOT1BfTElTVCgpCisjdW5kZWYgT1BFUkFUT1IKKworICAvLyBEZWZpbmUgVHJhdmVyc2UqKCksIFdhbGtVcEZyb20qKCksIGFuZCBWaXNpdCooKSBmb3IgY29tcG91bmQKKyAgLy8gYXNzaWdubWVudCBtZXRob2RzLiAgQ29tcG91bmQgYXNzaWdubWVudCBvcGVyYXRvcnMgYXJlIG5vdAorICAvLyBjbGFzc2VzIGluIHRoZW1zZWx2ZXMgKHRoZXkncmUgYWxsIG9wY29kZXMgaW4KKyAgLy8gQ29tcG91bmRBc3NpZ25PcGVyYXRvcikgYnV0IGRvIGhhdmUgdmlzaXRvcnMuCisjZGVmaW5lIE9QRVJBVE9SKE5BTUUpIFwKKyAgR0VORVJBTF9CSU5PUF9GQUxMQkFDSyhOQU1FIyNBc3NpZ24sIENvbXBvdW5kQXNzaWduT3BlcmF0b3IpCisKKyAgQ0FPX0xJU1QoKQorI3VuZGVmIE9QRVJBVE9SCisjdW5kZWYgR0VORVJBTF9CSU5PUF9GQUxMQkFDSworCisgIC8vIC0tLS0gTWV0aG9kcyBvbiBUeXBlcyAtLS0tCisgIC8vIEZJWE1FOiByZXZhbXAgdG8gdGFrZSBUeXBlTG9jJ3MgcmF0aGVyIHRoYW4gVHlwZXMuCisKKyAgLy8gRGVjbGFyZSBUcmF2ZXJzZSooKSBmb3IgYWxsIGNvbmNyZXRlIFR5cGUgY2xhc3Nlcy4KKyNkZWZpbmUgQUJTVFJBQ1RfVFlQRShDTEFTUywgQkFTRSkKKyNkZWZpbmUgVFlQRShDTEFTUywgQkFTRSkgXAorICBib29sIFRyYXZlcnNlIyNDTEFTUyMjVHlwZShDTEFTUyMjVHlwZSAqVCk7CisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVOb2Rlcy5kZWYiCisgIC8vIFRoZSBhYm92ZSBoZWFkZXIgI3VuZGVmcyBBQlNUUkFDVF9UWVBFIGFuZCBUWVBFIHVwb24gZXhpdC4KKworICAvLyBEZWZpbmUgV2Fsa1VwRnJvbSooKSBhbmQgZW1wdHkgVmlzaXQqKCkgZm9yIGFsbCBUeXBlIGNsYXNzZXMuCisgIGJvb2wgV2Fsa1VwRnJvbVR5cGUoVHlwZSAqVCkgeyByZXR1cm4gZ2V0RGVyaXZlZCgpLlZpc2l0VHlwZShUKTsgfQorICBib29sIFZpc2l0VHlwZShUeXBlICpUKSB7IHJldHVybiB0cnVlOyB9CisjZGVmaW5lIFRZUEUoQ0xBU1MsIEJBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFdhbGtVcEZyb20jI0NMQVNTIyNUeXBlKENMQVNTIyNUeXBlICpUKSB7ICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oV2Fsa1VwRnJvbSMjQkFTRShUKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFJZX1RPKFZpc2l0IyNDTEFTUyMjVHlwZShUKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgVmlzaXQjI0NMQVNTIyNUeXBlKENMQVNTIyNUeXBlICpUKSB7IHJldHVybiB0cnVlOyB9CisjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVOb2Rlcy5kZWYiCisKKyAgLy8gLS0tLSBNZXRob2RzIG9uIFR5cGVMb2NzIC0tLS0KKyAgLy8gRklYTUU6IHRoaXMgY3VycmVudGx5IGp1c3QgY2FsbHMgdGhlIG1hdGNoaW5nIFR5cGUgbWV0aG9kcworCisgIC8vIERlY2xhcmUgVHJhdmVyc2UqKCkgZm9yIGFsbCBjb25jcmV0ZSBUeXBlIGNsYXNzZXMuCisjZGVmaW5lIEFCU1RSQUNUX1RZUEVMT0MoQ0xBU1MsIEJBU0UpCisjZGVmaW5lIFRZUEVMT0MoQ0xBU1MsIEJBU0UpIFwKKyAgYm9vbCBUcmF2ZXJzZSMjQ0xBU1MjI1R5cGVMb2MoQ0xBU1MjI1R5cGVMb2MgVEwpOworI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jTm9kZXMuZGVmIgorICAvLyBUaGUgYWJvdmUgaGVhZGVyICN1bmRlZnMgQUJTVFJBQ1RfVFlQRUxPQyBhbmQgVFlQRUxPQyB1cG9uIGV4aXQuCisKKyAgLy8gRGVmaW5lIFdhbGtVcEZyb20qKCkgYW5kIGVtcHR5IFZpc2l0KigpIGZvciBhbGwgVHlwZUxvYyBjbGFzc2VzLgorICBib29sIFdhbGtVcEZyb21UeXBlTG9jKFR5cGVMb2MgVEwpIHsgcmV0dXJuIGdldERlcml2ZWQoKS5WaXNpdFR5cGVMb2MoVEwpOyB9CisgIGJvb2wgVmlzaXRUeXBlTG9jKFR5cGVMb2MgVEwpIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBRdWFsaWZpZWRUeXBlTG9jIGFuZCBVbnF1YWxUeXBlTG9jIGFyZSBub3QgZGVjbGFyZWQgaW4KKyAgLy8gVHlwZU5vZGVzLmRlZiBhbmQgdGh1cyBuZWVkIHRvIGJlIGhhbmRsZWQgc3BlY2lhbGx5LgorICBib29sIFdhbGtVcEZyb21RdWFsaWZpZWRUeXBlTG9jKFF1YWxpZmllZFR5cGVMb2MgVEwpIHsKKyAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlZpc2l0VW5xdWFsVHlwZUxvYyhUTC5nZXRVbnF1YWxpZmllZExvYygpKTsKKyAgfQorICBib29sIFZpc2l0UXVhbGlmaWVkVHlwZUxvYyhRdWFsaWZpZWRUeXBlTG9jIFRMKSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgV2Fsa1VwRnJvbVVucXVhbFR5cGVMb2MoVW5xdWFsVHlwZUxvYyBUTCkgeworICAgIHJldHVybiBnZXREZXJpdmVkKCkuVmlzaXRVbnF1YWxUeXBlTG9jKFRMLmdldFVucXVhbGlmaWVkTG9jKCkpOworICB9CisgIGJvb2wgVmlzaXRVbnF1YWxUeXBlTG9jKFVucXVhbFR5cGVMb2MgVEwpIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBOb3RlIHRoYXQgQkFTRSBpbmNsdWRlcyB0cmFpbGluZyAnVHlwZScgd2hpY2ggQ0xBU1MgZG9lc24ndC4KKyNkZWZpbmUgVFlQRShDTEFTUywgQkFTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgV2Fsa1VwRnJvbSMjQ0xBU1MjI1R5cGVMb2MoQ0xBU1MjI1R5cGVMb2MgVEwpIHsgICAgICAgICAgXAorICAgIFRSWV9UTyhXYWxrVXBGcm9tIyNCQVNFIyNMb2MoVEwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oVmlzaXQjI0NMQVNTIyNUeXBlTG9jKFRMKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBWaXNpdCMjQ0xBU1MjI1R5cGVMb2MoQ0xBU1MjI1R5cGVMb2MgVEwpIHsgcmV0dXJuIHRydWU7IH0KKyNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZU5vZGVzLmRlZiIKKworICAvLyAtLS0tIE1ldGhvZHMgb24gRGVjbHMgLS0tLQorCisgIC8vIERlY2xhcmUgVHJhdmVyc2UqKCkgZm9yIGFsbCBjb25jcmV0ZSBEZWNsIGNsYXNzZXMuCisjZGVmaW5lIEFCU1RSQUNUX0RFQ0woREVDTCkKKyNkZWZpbmUgREVDTChDTEFTUywgQkFTRSkgXAorICBib29sIFRyYXZlcnNlIyNDTEFTUyMjRGVjbChDTEFTUyMjRGVjbCAqRCk7CisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xOb2Rlcy5pbmMiCisgIC8vIFRoZSBhYm92ZSBoZWFkZXIgI3VuZGVmcyBBQlNUUkFDVF9ERUNMIGFuZCBERUNMIHVwb24gZXhpdC4KKworICAvLyBEZWZpbmUgV2Fsa1VwRnJvbSooKSBhbmQgZW1wdHkgVmlzaXQqKCkgZm9yIGFsbCBEZWNsIGNsYXNzZXMuCisgIGJvb2wgV2Fsa1VwRnJvbURlY2woRGVjbCAqRCkgeyByZXR1cm4gZ2V0RGVyaXZlZCgpLlZpc2l0RGVjbChEKTsgfQorICBib29sIFZpc2l0RGVjbChEZWNsICpEKSB7IHJldHVybiB0cnVlOyB9CisjZGVmaW5lIERFQ0woQ0xBU1MsIEJBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIFdhbGtVcEZyb20jI0NMQVNTIyNEZWNsKENMQVNTIyNEZWNsICpEKSB7ICAgICAgICAgICAgICAgIFwKKyAgICBUUllfVE8oV2Fsa1VwRnJvbSMjQkFTRShEKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFJZX1RPKFZpc2l0IyNDTEFTUyMjRGVjbChEKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgVmlzaXQjI0NMQVNTIyNEZWNsKENMQVNTIyNEZWNsICpEKSB7IHJldHVybiB0cnVlOyB9CisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xOb2Rlcy5pbmMiCisKK3ByaXZhdGU6CisgIC8vIFRoZXNlIGFyZSBoZWxwZXIgbWV0aG9kcyB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgVHJhdmVyc2UqIG1ldGhvZC4KKyAgYm9vbCBUcmF2ZXJzZVRlbXBsYXRlUGFyYW1ldGVyTGlzdEhlbHBlcihUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRQTCk7CisgIGJvb2wgVHJhdmVyc2VDbGFzc0luc3RhbnRpYXRpb25zKENsYXNzVGVtcGxhdGVEZWNsICpEKTsKKyAgYm9vbCBUcmF2ZXJzZVZhcmlhYmxlSW5zdGFudGlhdGlvbnMoVmFyVGVtcGxhdGVEZWNsICpEKTsKKyAgYm9vbCBUcmF2ZXJzZUZ1bmN0aW9uSW5zdGFudGlhdGlvbnMoRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkQpIDsKKyAgYm9vbCBUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2NzSGVscGVyKGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2MgKlRBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvdW50KTsKKyAgYm9vbCBUcmF2ZXJzZUFycmF5VHlwZUxvY0hlbHBlcihBcnJheVR5cGVMb2MgVEwpOworICBib29sIFRyYXZlcnNlUmVjb3JkSGVscGVyKFJlY29yZERlY2wgKkQpOworICBib29sIFRyYXZlcnNlQ1hYUmVjb3JkSGVscGVyKENYWFJlY29yZERlY2wgKkQpOworICBib29sIFRyYXZlcnNlRGVjbGFyYXRvckhlbHBlcihEZWNsYXJhdG9yRGVjbCAqRCk7CisgIGJvb2wgVHJhdmVyc2VEZWNsQ29udGV4dEhlbHBlcihEZWNsQ29udGV4dCAqREMpOworICBib29sIFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoRnVuY3Rpb25EZWNsICpEKTsKKyAgYm9vbCBUcmF2ZXJzZVZhckhlbHBlcihWYXJEZWNsICpEKTsKKyAgYm9vbCBUcmF2ZXJzZU9NUENsYXVzZShPTVBDbGF1c2UgKkMpOworICBib29sIFRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZShPTVBFeGVjdXRhYmxlRGlyZWN0aXZlICpTKTsKKyNkZWZpbmUgT1BFTk1QX0NMQVVTRShOYW1lLCBDbGFzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBWaXNpdCMjQ2xhc3MoQ2xhc3MgKkMpOworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKKyAgLy8vIFxicmllZiBQcm9jZXNzIGNsYXVzZXMgd2l0aCBsaXN0IG9mIHZhcmlhYmxlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgVmlzaXRPTVBDbGF1c2VMaXN0KFQgKk5vZGUpOworCisgIHR5cGVkZWYgU21hbGxWZWN0b3I8U3RtdCAqLCAxNj4gU3RtdHNUeTsKKyAgdHlwZWRlZiBTbWFsbFZlY3RvcjxTdG10c1R5ICosIDQ+IFF1ZXVlc1R5OworICAKKyAgUXVldWVzVHkgUXVldWVzOworCisgIGNsYXNzIE5ld1F1ZXVlUkFJSSB7CisgICAgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3IgJlJBVjsKKyAgcHVibGljOgorICAgIE5ld1F1ZXVlUkFJSShTdG10c1R5ICZxdWV1ZSwgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3IgJlJBVikgOiBSQVYoUkFWKSB7CisgICAgICBSQVYuUXVldWVzLnB1c2hfYmFjaygmcXVldWUpOworICAgIH0KKyAgICB+TmV3UXVldWVSQUlJKCkgeworICAgICAgUkFWLlF1ZXVlcy5wb3BfYmFjaygpOworICAgIH0KKyAgfTsKKworICBTdG10c1R5ICZnZXRDdXJyZW50UXVldWUoKSB7CisgICAgYXNzZXJ0KCFRdWV1ZXMuZW1wdHkoKSAmJiAiYmFzZSBUcmF2ZXJzZVN0bXQgd2FzIG5ldmVyIGNhbGxlZD8iKTsKKyAgICByZXR1cm4gKlF1ZXVlcy5iYWNrKCk7CisgIH0KKworcHVibGljOgorICBjbGFzcyBTdG10UXVldWVBY3Rpb24geworICAgIFN0bXRzVHkgJkN1cnJRdWV1ZTsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFN0bXRRdWV1ZUFjdGlvbihEYXRhUmVjdXJzaXZlQVNUVmlzaXRvciAmUkFWKQorICAgICAgOiBDdXJyUXVldWUoUkFWLmdldEN1cnJlbnRRdWV1ZSgpKSB7IH0KKworICAgIHZvaWQgcXVldWUoU3RtdCAqUykgeworICAgICAgQ3VyclF1ZXVlLnB1c2hfYmFjayhTKTsKKyAgICB9CisgIH07Cit9OworCisjZGVmaW5lIERJU1BBVENIKE5BTUUsIENMQVNTLCBWQVIpIFwKKyAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZSMjTkFNRShzdGF0aWNfY2FzdDxDTEFTUyo+KFZBUikpCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVN0bXQoU3RtdCAqUykgeworICBpZiAoIVMpCisgICAgcmV0dXJuIHRydWU7CisKKyAgU3RtdHNUeSBRdWV1ZSwgU3RtdHNUb0VucXVldTsKKyAgUXVldWUucHVzaF9iYWNrKFMpOworICBOZXdRdWV1ZVJBSUkgTlEoU3RtdHNUb0VucXVldSwgKnRoaXMpOworCisgIHdoaWxlICghUXVldWUuZW1wdHkoKSkgeworICAgIFMgPSBRdWV1ZS5wb3BfYmFja192YWwoKTsKKyAgICBpZiAoIVMpCisgICAgICBjb250aW51ZTsKKworICAgIFN0bXRzVG9FbnF1ZXUuY2xlYXIoKTsKKworI2RlZmluZSBESVNQQVRDSF9TVE1UKE5BTUUsIENMQVNTLCBWQVIpIFwKKyAgICBUUllfVE8oVHJhdmVyc2UjI05BTUUoc3RhdGljX2Nhc3Q8Q0xBU1MqPihWQVIpKSk7IGJyZWFrCisKKyAgICAvLyBJZiB3ZSBoYXZlIGEgYmluYXJ5IGV4cHIsIGRpc3BhdGNoIHRvIHRoZSBzdWJjb2RlIG9mIHRoZSBiaW5vcC4gIEEgc21hcnQKKyAgICAvLyBvcHRpbWl6ZXIgKGUuZy4gTExWTSkgd2lsbCBmb2xkIHRoaXMgY29tcGFyaXNvbiBpbnRvIHRoZSBzd2l0Y2ggc3RtdAorICAgIC8vIGJlbG93LgorICAgIGlmIChCaW5hcnlPcGVyYXRvciAqQmluT3AgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oUykpIHsKKyAgICAgIHN3aXRjaCAoQmluT3AtPmdldE9wY29kZSgpKSB7CisjZGVmaW5lIE9QRVJBVE9SKE5BTUUpIFwKKyAgICAgIGNhc2UgQk9fIyNOQU1FOiBESVNQQVRDSF9TVE1UKEJpbiMjTkFNRSwgQmluYXJ5T3BlcmF0b3IsIFMpOworICAKKyAgICAgIEJJTk9QX0xJU1QoKQorI3VuZGVmIE9QRVJBVE9SCisjdW5kZWYgQklOT1BfTElTVAorICAKKyNkZWZpbmUgT1BFUkFUT1IoTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIEJPXyMjTkFNRSMjQXNzaWduOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBESVNQQVRDSF9TVE1UKEJpbiMjTkFNRSMjQXNzaWduLCBDb21wb3VuZEFzc2lnbk9wZXJhdG9yLCBTKTsKKyAgCisgICAgICBDQU9fTElTVCgpCisjdW5kZWYgT1BFUkFUT1IKKyN1bmRlZiBDQU9fTElTVAorICAgICAgfQorICAgIH0gZWxzZSBpZiAoVW5hcnlPcGVyYXRvciAqVW5PcCA9IGR5bl9jYXN0PFVuYXJ5T3BlcmF0b3I+KFMpKSB7CisgICAgICBzd2l0Y2ggKFVuT3AtPmdldE9wY29kZSgpKSB7CisjZGVmaW5lIE9QRVJBVE9SKE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIFVPXyMjTkFNRTogRElTUEFUQ0hfU1RNVChVbmFyeSMjTkFNRSwgVW5hcnlPcGVyYXRvciwgUyk7CisgIAorICAgICAgVU5BUllPUF9MSVNUKCkKKyN1bmRlZiBPUEVSQVRPUgorI3VuZGVmIFVOQVJZT1BfTElTVAorICAgICAgfQorICAgIH0gZWxzZSB7CisgIAorICAgICAgLy8gVG9wIHN3aXRjaCBzdG10OiBkaXNwYXRjaCB0byBUcmF2ZXJzZUZvb1N0bXQgZm9yIGVhY2ggY29uY3JldGUgRm9vU3RtdC4KKyAgICAgIHN3aXRjaCAoUy0+Z2V0U3RtdENsYXNzKCkpIHsKKyAgICAgIGNhc2UgU3RtdDo6Tm9TdG10Q2xhc3M6IGJyZWFrOworI2RlZmluZSBBQlNUUkFDVF9TVE1UKFNUTVQpCisjZGVmaW5lIFNUTVQoQ0xBU1MsIFBBUkVOVCkgXAorICAgICAgY2FzZSBTdG10OjpDTEFTUyMjQ2xhc3M6IERJU1BBVENIX1NUTVQoQ0xBU1MsIENMQVNTLCBTKTsKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE5vZGVzLmluYyIKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxTdG10ICo+OjpyZXZlcnNlX2l0ZXJhdG9yCisgICAgICAgICAgIFJJID0gU3RtdHNUb0VucXVldS5yYmVnaW4oKSwKKyAgICAgICAgICAgUkUgPSBTdG10c1RvRW5xdWV1LnJlbmQoKTsgUkkgIT0gUkU7ICsrUkkpCisgICAgICBRdWV1ZS5wdXNoX2JhY2soKlJJKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VUeXBlKFF1YWxUeXBlIFQpIHsKKyAgaWYgKFQuaXNOdWxsKCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3dpdGNoIChULT5nZXRUeXBlQ2xhc3MoKSkgeworI2RlZmluZSBBQlNUUkFDVF9UWVBFKENMQVNTLCBCQVNFKQorI2RlZmluZSBUWVBFKENMQVNTLCBCQVNFKSBcCisgIGNhc2UgVHlwZTo6Q0xBU1M6IERJU1BBVENIKENMQVNTIyNUeXBlLCBDTEFTUyMjVHlwZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PFR5cGUqPihULmdldFR5cGVQdHIoKSkpOworI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTm9kZXMuZGVmIgorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVR5cGVMb2MoVHlwZUxvYyBUTCkgeworICBpZiAoVEwuaXNOdWxsKCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3dpdGNoIChUTC5nZXRUeXBlTG9jQ2xhc3MoKSkgeworI2RlZmluZSBBQlNUUkFDVF9UWVBFTE9DKENMQVNTLCBCQVNFKQorI2RlZmluZSBUWVBFTE9DKENMQVNTLCBCQVNFKSBcCisgIGNhc2UgVHlwZUxvYzo6Q0xBU1M6IFwKKyAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlIyNDTEFTUyMjVHlwZUxvYyhUTC5jYXN0QXM8Q0xBU1MjI1R5cGVMb2M+KCkpOworI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jTm9kZXMuZGVmIgorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKworLy8gRGVmaW5lIHRoZSBUcmF2ZXJzZSpBdHRyKEF0dHIqIEEpIG1ldGhvZHMKKyNkZWZpbmUgVklTSVRPUkNMQVNTIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yCisjaW5jbHVkZSAiY2xhbmcvQVNUL0F0dHJWaXNpdG9yLmluYyIKKyN1bmRlZiBWSVNJVE9SQ0xBU1MKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlRGVjbChEZWNsICpEKSB7CisgIGlmICghRCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBBcyBhIHN5bnRheCB2aXNpdG9yLCB3ZSB3YW50IHRvIGlnbm9yZSBkZWNsYXJhdGlvbnMgZm9yCisgIC8vIGltcGxpY2l0bHktZGVmaW5lZCBkZWNsYXJhdGlvbnMgKG9uZXMgbm90IHR5cGVkIGV4cGxpY2l0bHkgYnkgdGhlCisgIC8vIHVzZXIpLgorICBpZiAoRC0+aXNJbXBsaWNpdCgpKQorICAgIHJldHVybiB0cnVlOworCisgIHN3aXRjaCAoRC0+Z2V0S2luZCgpKSB7CisjZGVmaW5lIEFCU1RSQUNUX0RFQ0woREVDTCkKKyNkZWZpbmUgREVDTChDTEFTUywgQkFTRSkgXAorICBjYXNlIERlY2w6OkNMQVNTOiBcCisgICAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2UjI0NMQVNTIyNEZWNsKHN0YXRpY19jYXN0PENMQVNTIyNEZWNsKj4oRCkpKSBcCisgICAgICByZXR1cm4gZmFsc2U7IFwKKyAgICBicmVhazsKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbE5vZGVzLmluYyIKKyAgfQorCisgIC8vIFZpc2l0IGFueSBhdHRyaWJ1dGVzIGF0dGFjaGVkIHRvIHRoaXMgZGVjbGFyYXRpb24uCisgIGZvciAoYXV0byAqSSA6IEQtPmF0dHJzKCkpIHsKKyAgICBpZiAoIWdldERlcml2ZWQoKS5UcmF2ZXJzZUF0dHIoSSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKyN1bmRlZiBESVNQQVRDSAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUykgeworICBpZiAoIU5OUykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoTk5TLT5nZXRQcmVmaXgoKSkKKyAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyKE5OUy0+Z2V0UHJlZml4KCkpKTsKKworICBzd2l0Y2ggKE5OUy0+Z2V0S2luZCgpKSB7CisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6SWRlbnRpZmllcjoKKyAgY2FzZSBOZXN0ZWROYW1lU3BlY2lmaWVyOjpOYW1lc3BhY2U6CisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6TmFtZXNwYWNlQWxpYXM6CisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6R2xvYmFsOgorICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6VHlwZVNwZWM6CisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6VHlwZVNwZWNXaXRoVGVtcGxhdGU6CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShRdWFsVHlwZShOTlMtPmdldEFzVHlwZSgpLCAwKSkpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgTk5TKSB7CisgIGlmICghTk5TKQorICAgIHJldHVybiB0cnVlOworCisgICBpZiAoTmVzdGVkTmFtZVNwZWNpZmllckxvYyBQcmVmaXggPSBOTlMuZ2V0UHJlZml4KCkpCisgICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoUHJlZml4KSk7CisKKyAgc3dpdGNoIChOTlMuZ2V0TmVzdGVkTmFtZVNwZWNpZmllcigpLT5nZXRLaW5kKCkpIHsKKyAgY2FzZSBOZXN0ZWROYW1lU3BlY2lmaWVyOjpJZGVudGlmaWVyOgorICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6Ok5hbWVzcGFjZToKKyAgY2FzZSBOZXN0ZWROYW1lU3BlY2lmaWVyOjpOYW1lc3BhY2VBbGlhczoKKyAgY2FzZSBOZXN0ZWROYW1lU3BlY2lmaWVyOjpHbG9iYWw6CisgICAgcmV0dXJuIHRydWU7CisKKyAgY2FzZSBOZXN0ZWROYW1lU3BlY2lmaWVyOjpUeXBlU3BlYzoKKyAgY2FzZSBOZXN0ZWROYW1lU3BlY2lmaWVyOjpUeXBlU3BlY1dpdGhUZW1wbGF0ZToKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKE5OUy5nZXRUeXBlTG9jKCkpKTsKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZUluZm8gTmFtZUluZm8pIHsKKyAgc3dpdGNoIChOYW1lSW5mby5nZXROYW1lKCkuZ2V0TmFtZUtpbmQoKSkgeworICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYQ29uc3RydWN0b3JOYW1lOgorICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYRGVzdHJ1Y3Rvck5hbWU6CisgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhDb252ZXJzaW9uRnVuY3Rpb25OYW1lOgorICAgIGlmIChUeXBlU291cmNlSW5mbyAqVFNJbmZvID0gTmFtZUluZm8uZ2V0TmFtZWRUeXBlSW5mbygpKQorICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUU0luZm8tPmdldFR5cGVMb2MoKSkpOworCisgICAgYnJlYWs7CisKKyAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OklkZW50aWZpZXI6CisgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpPYmpDWmVyb0FyZ1NlbGVjdG9yOgorICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6T2JqQ09uZUFyZ1NlbGVjdG9yOgorICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6T2JqQ011bHRpQXJnU2VsZWN0b3I6CisgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhPcGVyYXRvck5hbWU6CisgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhMaXRlcmFsT3BlcmF0b3JOYW1lOgorICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYVXNpbmdEaXJlY3RpdmU6CisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlVGVtcGxhdGVOYW1lKFRlbXBsYXRlTmFtZSBUZW1wbGF0ZSkgeworICBpZiAoRGVwZW5kZW50VGVtcGxhdGVOYW1lICpEVE4gPSBUZW1wbGF0ZS5nZXRBc0RlcGVuZGVudFRlbXBsYXRlTmFtZSgpKQorICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXIoRFROLT5nZXRRdWFsaWZpZXIoKSkpOworICBlbHNlIGlmIChRdWFsaWZpZWRUZW1wbGF0ZU5hbWUgKlFUTiA9IFRlbXBsYXRlLmdldEFzUXVhbGlmaWVkVGVtcGxhdGVOYW1lKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllcihRVE4tPmdldFF1YWxpZmllcigpKSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICZBcmcpIHsKKyAgc3dpdGNoIChBcmcuZ2V0S2luZCgpKSB7CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6TnVsbDoKKyAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpEZWNsYXJhdGlvbjoKKyAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpJbnRlZ3JhbDoKKyAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpOdWxsUHRyOgorICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6VHlwZToKKyAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlVHlwZShBcmcuZ2V0QXNUeXBlKCkpOworCisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6VGVtcGxhdGU6CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6VGVtcGxhdGVFeHBhbnNpb246CisgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVRlbXBsYXRlTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZy5nZXRBc1RlbXBsYXRlT3JUZW1wbGF0ZVBhdHRlcm4oKSk7CisKKyAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpFeHByZXNzaW9uOgorICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEFyZy5nZXRBc0V4cHIoKSk7CisKKyAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpQYWNrOgorICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50cyhBcmcucGFja19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcucGFja19zaXplKCkpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZJWE1FOiBubyB0ZW1wbGF0ZSBuYW1lIGxvY2F0aW9uPworLy8gRklYTUU6IG5vIHNvdXJjZSBsb2NhdGlvbnMgZm9yIGEgdGVtcGxhdGUgYXJndW1lbnQgcGFjaz8KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExvYyAmQXJnTG9jKSB7CisgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZyA9IEFyZ0xvYy5nZXRBcmd1bWVudCgpOworCisgIHN3aXRjaCAoQXJnLmdldEtpbmQoKSkgeworICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6Ok51bGw6CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6RGVjbGFyYXRpb246CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6SW50ZWdyYWw6CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6TnVsbFB0cjoKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OlR5cGU6IHsKKyAgICAvLyBGSVhNRTogaG93IGNhbiBUU0kgZXZlciBiZSBOVUxMPworICAgIGlmIChUeXBlU291cmNlSW5mbyAqVFNJID0gQXJnTG9jLmdldFR5cGVTb3VyY2VJbmZvKCkpCisgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlVHlwZUxvYyhUU0ktPmdldFR5cGVMb2MoKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVR5cGUoQXJnLmdldEFzVHlwZSgpKTsKKyAgfQorCisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6VGVtcGxhdGU6CisgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6VGVtcGxhdGVFeHBhbnNpb246CisgICAgaWYgKEFyZ0xvYy5nZXRUZW1wbGF0ZVF1YWxpZmllckxvYygpKQorICAgICAgVFJZX1RPKGdldERlcml2ZWQoKS5UcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ0xvYy5nZXRUZW1wbGF0ZVF1YWxpZmllckxvYygpKSk7CisgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVRlbXBsYXRlTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnLmdldEFzVGVtcGxhdGVPclRlbXBsYXRlUGF0dGVybigpKTsKKworICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OkV4cHJlc3Npb246CisgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVN0bXQoQXJnTG9jLmdldFNvdXJjZUV4cHJlc3Npb24oKSk7CisKKyAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpQYWNrOgorICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50cyhBcmcucGFja19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcucGFja19zaXplKCkpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQXJncykgeworICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bUFyZ3M7ICsrSSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnQoQXJnc1tJXSkpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEN0b3JJbml0aWFsaXplciAqSW5pdCkgeworICBpZiAoVHlwZVNvdXJjZUluZm8gKlRJbmZvID0gSW5pdC0+Z2V0VHlwZVNvdXJjZUluZm8oKSkKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRJbmZvLT5nZXRUeXBlTG9jKCkpKTsKKworICBpZiAoSW5pdC0+aXNXcml0dGVuKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChJbml0LT5nZXRJbml0KCkpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZUxhbWJkYUNhcHR1cmUoTGFtYmRhRXhwcjo6Q2FwdHVyZSBDKXsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tIFR5cGUgdHJhdmVyc2FsIC0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgbWFjcm8gbWFrZXMgYXZhaWxhYmxlIGEgdmFyaWFibGUgVCwgdGhlIHBhc3NlZC1pbiB0eXBlLgorI2RlZmluZSBERUZfVFJBVkVSU0VfVFlQRShUWVBFLCBDT0RFKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZSMjVFlQRSAoVFlQRSAqVCkgeyAgICAgICAgXAorICAgIFRSWV9UTyhXYWxrVXBGcm9tIyNUWVBFIChUKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBDT0RFOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK0RFRl9UUkFWRVJTRV9UWVBFKEJ1aWx0aW5UeXBlLCB7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKENvbXBsZXhUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRFbGVtZW50VHlwZSgpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKFBvaW50ZXJUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRQb2ludGVlVHlwZSgpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKEJsb2NrUG9pbnRlclR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBvaW50ZWVUeXBlKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoTFZhbHVlUmVmZXJlbmNlVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0UG9pbnRlZVR5cGUoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRShSVmFsdWVSZWZlcmVuY2VUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRQb2ludGVlVHlwZSgpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKE1lbWJlclBvaW50ZXJUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShRdWFsVHlwZShULT5nZXRDbGFzcygpLCAwKSkpOworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0UG9pbnRlZVR5cGUoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRShEZWNheWVkVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0T3JpZ2luYWxUeXBlKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoQWRqdXN0ZWRUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRPcmlnaW5hbFR5cGUoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRShDb25zdGFudEFycmF5VHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRShJbmNvbXBsZXRlQXJyYXlUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRFbGVtZW50VHlwZSgpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKFZhcmlhYmxlQXJyYXlUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRFbGVtZW50VHlwZSgpKSk7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChULT5nZXRTaXplRXhwcigpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKERlcGVuZGVudFNpemVkQXJyYXlUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRFbGVtZW50VHlwZSgpKSk7CisgICAgaWYgKFQtPmdldFNpemVFeHByKCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VTdG10KFQtPmdldFNpemVFeHByKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoRGVwZW5kZW50U2l6ZWRFeHRWZWN0b3JUeXBlLCB7CisgICAgaWYgKFQtPmdldFNpemVFeHByKCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VTdG10KFQtPmdldFNpemVFeHByKCkpKTsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldEVsZW1lbnRUeXBlKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoVmVjdG9yVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRShFeHRWZWN0b3JUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRFbGVtZW50VHlwZSgpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKEZ1bmN0aW9uTm9Qcm90b1R5cGUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0UmV0dXJuVHlwZSgpKSk7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKEZ1bmN0aW9uUHJvdG9UeXBlLCB7CisgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0UmV0dXJuVHlwZSgpKSk7CisKKyAgZm9yIChjb25zdCBhdXRvICZBIDogVC0+cGFyYW1fdHlwZXMoKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoQSkpOworICB9CisKKyAgZm9yIChjb25zdCBhdXRvICZFIDogVC0+ZXhjZXB0aW9ucygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShFKSk7CisgIH0KK30pCisKK0RFRl9UUkFWRVJTRV9UWVBFKFVucmVzb2x2ZWRVc2luZ1R5cGUsIHsgfSkKK0RFRl9UUkFWRVJTRV9UWVBFKFR5cGVkZWZUeXBlLCB7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKFR5cGVPZkV4cHJUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChULT5nZXRVbmRlcmx5aW5nRXhwcigpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKFR5cGVPZlR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFVuZGVybHlpbmdUeXBlKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoRGVjbHR5cGVUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChULT5nZXRVbmRlcmx5aW5nRXhwcigpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKFVuYXJ5VHJhbnNmb3JtVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0QmFzZVR5cGUoKSkpOworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0VW5kZXJseWluZ1R5cGUoKSkpOworICAgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKEF1dG9UeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXREZWR1Y2VkVHlwZSgpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKFJlY29yZFR5cGUsIHsgfSkKK0RFRl9UUkFWRVJTRV9UWVBFKEVudW1UeXBlLCB7IH0pCitERUZfVFJBVkVSU0VfVFlQRShUZW1wbGF0ZVR5cGVQYXJtVHlwZSwgeyB9KQorREVGX1RSQVZFUlNFX1RZUEUoU3Vic3RUZW1wbGF0ZVR5cGVQYXJtVHlwZSwgeyB9KQorREVGX1RSQVZFUlNFX1RZUEUoU3Vic3RUZW1wbGF0ZVR5cGVQYXJtUGFja1R5cGUsIHsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZU5hbWUoVC0+Z2V0VGVtcGxhdGVOYW1lKCkpKTsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50cyhULT5nZXRBcmdzKCksIFQtPmdldE51bUFyZ3MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRShJbmplY3RlZENsYXNzTmFtZVR5cGUsIHsgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoQXR0cmlidXRlZFR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldE1vZGlmaWVkVHlwZSgpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFKFBhcmVuVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0SW5uZXJUeXBlKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoRWxhYm9yYXRlZFR5cGUsIHsKKyAgICBpZiAoVC0+Z2V0UXVhbGlmaWVyKCkpIHsKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXIoVC0+Z2V0UXVhbGlmaWVyKCkpKTsKKyAgICB9CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXROYW1lZFR5cGUoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRShEZXBlbmRlbnROYW1lVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXIoVC0+Z2V0UXVhbGlmaWVyKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoRGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyKFQtPmdldFF1YWxpZmllcigpKSk7CisgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudHMoVC0+Z2V0QXJncygpLCBULT5nZXROdW1BcmdzKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoUGFja0V4cGFuc2lvblR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBhdHRlcm4oKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRShPYmpDSW50ZXJmYWNlVHlwZSwgeyB9KQorCitERUZfVFJBVkVSU0VfVFlQRShPYmpDT2JqZWN0VHlwZSwgeworICAgIC8vIFdlIGhhdmUgdG8gd2F0Y2ggb3V0IGhlcmUgYmVjYXVzZSBhbiBPYmpDSW50ZXJmYWNlVHlwZSdzIGJhc2UKKyAgICAvLyB0eXBlIGlzIGl0c2VsZi4KKyAgICBpZiAoVC0+Z2V0QmFzZVR5cGUoKS5nZXRUeXBlUHRyKCkgIT0gVCkKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0QmFzZVR5cGUoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRShPYmpDT2JqZWN0UG9pbnRlclR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBvaW50ZWVUeXBlKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEUoQXRvbWljVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0VmFsdWVUeXBlKCkpKTsKKyAgfSkKKworI3VuZGVmIERFRl9UUkFWRVJTRV9UWVBFCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tIFR5cGVMb2MgdHJhdmVyc2FsIC0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgbWFjcm8gbWFrZXMgYXZhaWxhYmxlIGEgdmFyaWFibGUgVEwsIHRoZSBwYXNzZWQtaW4gVHlwZUxvYy4KKy8vIElmIHJlcXVlc3RlZCwgaXQgY2FsbHMgV2Fsa1VwRnJvbSogZm9yIHRoZSBUeXBlIGluIHRoZSBnaXZlbiBUeXBlTG9jLAorLy8gaW4gYWRkaXRpb24gdG8gV2Fsa1VwRnJvbSogZm9yIHRoZSBUeXBlTG9jIGl0c2VsZiwgc3VjaCB0aGF0IGV4aXN0aW5nCisvLyBjbGllbnRzIHRoYXQgb3ZlcnJpZGUgdGhlIFdhbGtVcEZyb20qVHlwZSgpIGFuZC9vciBWaXNpdCpUeXBlKCkgbWV0aG9kcworLy8gY29udGludWUgdG8gd29yay4KKyNkZWZpbmUgREVGX1RSQVZFUlNFX1RZUEVMT0MoVFlQRSwgQ09ERSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2UjI1RZUEUjI0xvYyhUWVBFIyNMb2MgVEwpIHsgXAorICAgIGlmIChnZXREZXJpdmVkKCkuc2hvdWxkV2Fsa1R5cGVzT2ZUeXBlTG9jcygpKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVFJZX1RPKFdhbGtVcEZyb20jI1RZUEUoY29uc3RfY2FzdDxUWVBFKj4oVEwuZ2V0VHlwZVB0cigpKSkpOyAgICAgXAorICAgIFRSWV9UTyhXYWxrVXBGcm9tIyNUWVBFIyNMb2MoVEwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgQ09ERTsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVF1YWxpZmllZFR5cGVMb2MoCisgICAgUXVhbGlmaWVkVHlwZUxvYyBUTCkgeworICAvLyBNb3ZlIHRoaXMgb3ZlciB0byB0aGUgJ21haW4nIHR5cGVsb2MgdHJlZS4gIE5vdGUgdGhhdCB0aGlzIGlzIGEKKyAgLy8gbW92ZSAtLSB3ZSBwcmV0ZW5kIHRoYXQgd2Ugd2VyZSByZWFsbHkgbG9va2luZyBhdCB0aGUgdW5xdWFsaWZpZWQKKyAgLy8gdHlwZWxvYyBhbGwgYWxvbmcgLS0gcmF0aGVyIHRoYW4gYSByZWN1cnNpb24sIHNvIHdlIGRvbid0IGZvbGxvdworICAvLyB0aGUgbm9ybWFsIENSVFAgcGxhbiBvZiBnb2luZyB0aHJvdWdoCisgIC8vIGdldERlcml2ZWQoKS5UcmF2ZXJzZVR5cGVMb2MuICBJZiB3ZSBkaWQsIHdlJ2QgYmUgdHJhdmVyc2luZworICAvLyB0d2ljZSBmb3IgdGhlIHNhbWUgdHlwZSAob25jZSBhcyBhIFF1YWxpZmllZFR5cGVMb2MgdmVyc2lvbiBvZgorICAvLyB0aGUgdHlwZSwgb25jZSBhcyBhbiBVbnF1YWxpZmllZFR5cGVMb2MgdmVyc2lvbiBvZiB0aGUgdHlwZSksCisgIC8vIHdoaWNoIGluIGVmZmVjdCBtZWFucyB3ZSdkIGNhbGwgVmlzaXRUeXBlTG9jIHR3aWNlIHdpdGggdGhlCisgIC8vICdzYW1lJyB0eXBlLiAgVGhpcyBzb2x2ZXMgdGhhdCBwcm9ibGVtLCBhdCB0aGUgY29zdCBvZiBuZXZlcgorICAvLyBzZWVpbmcgdGhlIHF1YWxpZmllZCB2ZXJzaW9uIG9mIHRoZSB0eXBlICh1bmxlc3MgdGhlIGNsaWVudAorICAvLyBzdWJjbGFzc2VzIFRyYXZlcnNlUXVhbGlmaWVkVHlwZUxvYyB0aGVtc2VsdmVzKS4gIEl0J3Mgbm90IGEKKyAgLy8gcGVyZmVjdCBzb2x1dGlvbi4gIEEgcGVyZmVjdCBzb2x1dGlvbiBwcm9iYWJseSByZXF1aXJlcyBtYWtpbmcKKyAgLy8gUXVhbGlmaWVkVHlwZUxvYyBhIHdyYXBwZXIgYXJvdW5kIFR5cGVMb2MgLS0gbGlrZSBRdWFsVHlwZSBpcyBhCisgIC8vIHdyYXBwZXIgYXJvdW5kIFR5cGUqIC0tIHJhdGhlciB0aGFuIGJlaW5nIGl0cyBvd24gY2xhc3MgaW4gdGhlCisgIC8vIHR5cGUgaGllcmFyY2h5LgorICByZXR1cm4gVHJhdmVyc2VUeXBlTG9jKFRMLmdldFVucXVhbGlmaWVkTG9jKCkpOworfQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhCdWlsdGluVHlwZSwgeyB9KQorCisvLyBGSVhNRTogQ29tcGxleFR5cGVMb2MgaXMgdW5maW5pc2hlZAorREVGX1RSQVZFUlNFX1RZUEVMT0MoQ29tcGxleFR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFRMLmdldFR5cGVQdHIoKS0+Z2V0RWxlbWVudFR5cGUoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhQb2ludGVyVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UG9pbnRlZUxvYygpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKEJsb2NrUG9pbnRlclR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFBvaW50ZWVMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhMVmFsdWVSZWZlcmVuY2VUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRQb2ludGVlTG9jKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoUlZhbHVlUmVmZXJlbmNlVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UG9pbnRlZUxvYygpKSk7CisgIH0pCisKKy8vIEZJWE1FOiBsb2NhdGlvbiBvZiBiYXNlIGNsYXNzPworLy8gV2UgdHJhdmVyc2UgdGhpcyBpbiB0aGUgdHlwZSBjYXNlIGFzIHdlbGwsIGJ1dCBob3cgaXMgaXQgbm90IHJlYWNoZWQgdGhyb3VnaAorLy8gdGhlIHBvaW50ZWUgdHlwZT8KK0RFRl9UUkFWRVJTRV9UWVBFTE9DKE1lbWJlclBvaW50ZXJUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShRdWFsVHlwZShUTC5nZXRUeXBlUHRyKCktPmdldENsYXNzKCksIDApKSk7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRQb2ludGVlTG9jKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoRGVjYXllZFR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldE9yaWdpbmFsTG9jKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoQWRqdXN0ZWRUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRPcmlnaW5hbExvYygpKSk7CisgIH0pCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZUFycmF5VHlwZUxvY0hlbHBlcihBcnJheVR5cGVMb2MgVEwpIHsKKyAgLy8gVGhpcyBpc24ndCBhdmFpbGFibGUgZm9yIEFycmF5VHlwZSwgYnV0IGlzIGZvciB0aGUgQXJyYXlUeXBlTG9jLgorICBUUllfVE8oVHJhdmVyc2VTdG10KFRMLmdldFNpemVFeHByKCkpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKENvbnN0YW50QXJyYXlUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRFbGVtZW50TG9jKCkpKTsKKyAgICByZXR1cm4gVHJhdmVyc2VBcnJheVR5cGVMb2NIZWxwZXIoVEwpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhJbmNvbXBsZXRlQXJyYXlUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRFbGVtZW50TG9jKCkpKTsKKyAgICByZXR1cm4gVHJhdmVyc2VBcnJheVR5cGVMb2NIZWxwZXIoVEwpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhWYXJpYWJsZUFycmF5VHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0RWxlbWVudExvYygpKSk7CisgICAgcmV0dXJuIFRyYXZlcnNlQXJyYXlUeXBlTG9jSGVscGVyKFRMKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoRGVwZW5kZW50U2l6ZWRBcnJheVR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldEVsZW1lbnRMb2MoKSkpOworICAgIHJldHVybiBUcmF2ZXJzZUFycmF5VHlwZUxvY0hlbHBlcihUTCk7CisgIH0pCisKKy8vIEZJWE1FOiBvcmRlcj8gd2h5IG5vdCBzaXplIGV4cHIgZmlyc3Q/CisvLyBGSVhNRTogYmFzZSBWZWN0b3JUeXBlTG9jIGlzIHVuZmluaXNoZWQKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKERlcGVuZGVudFNpemVkRXh0VmVjdG9yVHlwZSwgeworICAgIGlmIChUTC5nZXRUeXBlUHRyKCktPmdldFNpemVFeHByKCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VTdG10KFRMLmdldFR5cGVQdHIoKS0+Z2V0U2l6ZUV4cHIoKSkpOworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVEwuZ2V0VHlwZVB0cigpLT5nZXRFbGVtZW50VHlwZSgpKSk7CisgIH0pCisKKy8vIEZJWE1FOiBWZWN0b3JUeXBlTG9jIGlzIHVuZmluaXNoZWQKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFZlY3RvclR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFRMLmdldFR5cGVQdHIoKS0+Z2V0RWxlbWVudFR5cGUoKSkpOworICB9KQorCisvLyBGSVhNRTogc2l6ZSBhbmQgYXR0cmlidXRlcworLy8gRklYTUU6IGJhc2UgVmVjdG9yVHlwZUxvYyBpcyB1bmZpbmlzaGVkCitERUZfVFJBVkVSU0VfVFlQRUxPQyhFeHRWZWN0b3JUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShUTC5nZXRUeXBlUHRyKCktPmdldEVsZW1lbnRUeXBlKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoRnVuY3Rpb25Ob1Byb3RvVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UmV0dXJuTG9jKCkpKTsKKyAgfSkKKworLy8gRklYTUU6IGxvY2F0aW9uIG9mIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyAoYXR0cmlidXRlcz8pCitERUZfVFJBVkVSU0VfVFlQRUxPQyhGdW5jdGlvblByb3RvVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UmV0dXJuTG9jKCkpKTsKKworICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpUID0gVEwuZ2V0VHlwZVB0cigpOworCisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFRMLmdldE51bVBhcmFtcygpOyBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKFRMLmdldFBhcmFtKEkpKSB7CisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woVEwuZ2V0UGFyYW0oSSkpKTsKKyAgICAgIH0gZWxzZSBpZiAoSSA8IFQtPmdldE51bVBhcmFtcygpKSB7CisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0UGFyYW1UeXBlKEkpKSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZFIDogVC0+ZXhjZXB0aW9ucygpKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlKEUpKTsKKyAgICB9CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFVucmVzb2x2ZWRVc2luZ1R5cGUsIHsgfSkKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFR5cGVkZWZUeXBlLCB7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFR5cGVPZkV4cHJUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChUTC5nZXRVbmRlcmx5aW5nRXhwcigpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFR5cGVPZlR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFVuZGVybHlpbmdUSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKKyAgfSkKKworLy8gRklYTUU6IGxvY2F0aW9uIG9mIHVuZGVybHlpbmcgZXhwcgorREVGX1RSQVZFUlNFX1RZUEVMT0MoRGVjbHR5cGVUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChUTC5nZXRUeXBlUHRyKCktPmdldFVuZGVybHlpbmdFeHByKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoVW5hcnlUcmFuc2Zvcm1UeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRVbmRlcmx5aW5nVEluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKEF1dG9UeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShUTC5nZXRUeXBlUHRyKCktPmdldERlZHVjZWRUeXBlKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoUmVjb3JkVHlwZSwgeyB9KQorREVGX1RSQVZFUlNFX1RZUEVMT0MoRW51bVR5cGUsIHsgfSkKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFRlbXBsYXRlVHlwZVBhcm1UeXBlLCB7IH0pCitERUZfVFJBVkVSU0VfVFlQRUxPQyhTdWJzdFRlbXBsYXRlVHlwZVBhcm1UeXBlLCB7IH0pCitERUZfVFJBVkVSU0VfVFlQRUxPQyhTdWJzdFRlbXBsYXRlVHlwZVBhcm1QYWNrVHlwZSwgeyB9KQorCisvLyBGSVhNRTogdXNlIHRoZSBsb2MgZm9yIHRoZSB0ZW1wbGF0ZSBuYW1lPworREVGX1RSQVZFUlNFX1RZUEVMT0MoVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZU5hbWUoVEwuZ2V0VHlwZVB0cigpLT5nZXRUZW1wbGF0ZU5hbWUoKSkpOworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBUTC5nZXROdW1BcmdzKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jKFRMLmdldEFyZ0xvYyhJKSkpOworICAgIH0KKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoSW5qZWN0ZWRDbGFzc05hbWVUeXBlLCB7IH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKFBhcmVuVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0SW5uZXJMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhBdHRyaWJ1dGVkVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0TW9kaWZpZWRMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhFbGFib3JhdGVkVHlwZSwgeworICAgIGlmIChUTC5nZXRRdWFsaWZpZXJMb2MoKSkgeworICAgICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhUTC5nZXRRdWFsaWZpZXJMb2MoKSkpOworICAgIH0KKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldE5hbWVkVHlwZUxvYygpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9UWVBFTE9DKERlcGVuZGVudE5hbWVUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhUTC5nZXRRdWFsaWZpZXJMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhEZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZSwgeworICAgIGlmIChUTC5nZXRRdWFsaWZpZXJMb2MoKSkgeworICAgICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhUTC5nZXRRdWFsaWZpZXJMb2MoKSkpOworICAgIH0KKworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBUTC5nZXROdW1BcmdzKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jKFRMLmdldEFyZ0xvYyhJKSkpOworICAgIH0KKyAgfSkKKworREVGX1RSQVZFUlNFX1RZUEVMT0MoUGFja0V4cGFuc2lvblR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFBhdHRlcm5Mb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhPYmpDSW50ZXJmYWNlVHlwZSwgeyB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhPYmpDT2JqZWN0VHlwZSwgeworICAgIC8vIFdlIGhhdmUgdG8gd2F0Y2ggb3V0IGhlcmUgYmVjYXVzZSBhbiBPYmpDSW50ZXJmYWNlVHlwZSdzIGJhc2UKKyAgICAvLyB0eXBlIGlzIGl0c2VsZi4KKyAgICBpZiAoVEwuZ2V0VHlwZVB0cigpLT5nZXRCYXNlVHlwZSgpLmdldFR5cGVQdHIoKSAhPSBUTC5nZXRUeXBlUHRyKCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldEJhc2VMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhPYmpDT2JqZWN0UG9pbnRlclR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFBvaW50ZWVMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfVFlQRUxPQyhBdG9taWNUeXBlLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRWYWx1ZUxvYygpKSk7CisgIH0pCisKKyN1bmRlZiBERUZfVFJBVkVSU0VfVFlQRUxPQworCisvLyAtLS0tLS0tLS0tLS0tLS0tLSBEZWNsIHRyYXZlcnNhbCAtLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZvciBhIERlY2wsIHdlIGF1dG9tYXRlIChpbiB0aGUgREVGX1RSQVZFUlNFX0RFQ0wgbWFjcm8pIHRyYXZlcnNpbmcKKy8vIHRoZSBjaGlsZHJlbiB0aGF0IGNvbWUgZnJvbSB0aGUgRGVjbENvbnRleHQgYXNzb2NpYXRlZCB3aXRoIGl0LgorLy8gVGhlcmVmb3JlIGVhY2ggVHJhdmVyc2UqIG9ubHkgbmVlZHMgdG8gd29ycnkgYWJvdXQgY2hpbGRyZW4gb3RoZXIKKy8vIHRoYW4gdGhvc2UuCisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZURlY2xDb250ZXh0SGVscGVyKERlY2xDb250ZXh0ICpEQykgeworICBpZiAoIURDKQorICAgIHJldHVybiB0cnVlOworCisgIGZvciAoYXV0byAqQ2hpbGQgOiBEQy0+ZGVjbHMoKSkgeworICAgIC8vIEJsb2NrRGVjbHMgYW5kIENhcHR1cmVkRGVjbHMgYXJlIHRyYXZlcnNlZCB0aHJvdWdoIEJsb2NrRXhwcnMgYW5kCisgICAgLy8gQ2FwdHVyZWRTdG10cyByZXNwZWN0aXZlbHkuCisgICAgaWYgKCFpc2E8QmxvY2tEZWNsPihDaGlsZCkgJiYgIWlzYTxDYXB0dXJlZERlY2w+KENoaWxkKSkKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woQ2hpbGQpKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBUaGlzIG1hY3JvIG1ha2VzIGF2YWlsYWJsZSBhIHZhcmlhYmxlIEQsIHRoZSBwYXNzZWQtaW4gZGVjbC4KKyNkZWZpbmUgREVGX1RSQVZFUlNFX0RFQ0woREVDTCwgQ09ERSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2UjI0RFQ0wgKERFQ0wgKkQpIHsgICBcCisgIFRSWV9UTyhXYWxrVXBGcm9tIyNERUNMIChEKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7IENPREU7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbENvbnRleHRIZWxwZXIoZHluX2Nhc3Q8RGVjbENvbnRleHQ+KEQpKSk7ICBcCisgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitERUZfVFJBVkVSU0VfREVDTChBY2Nlc3NTcGVjRGVjbCwgeyB9KQorCitERUZfVFJBVkVSU0VfREVDTChCbG9ja0RlY2wsIHsKKyAgICBpZiAoVHlwZVNvdXJjZUluZm8gKlRJbmZvID0gRC0+Z2V0U2lnbmF0dXJlQXNXcml0dGVuKCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRJbmZvLT5nZXRUeXBlTG9jKCkpKTsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEJvZHkoKSkpOworICAgIC8vIFRoaXMgcmV0dXJuIHN0YXRlbWVudCBtYWtlcyBzdXJlIHRoZSB0cmF2ZXJzYWwgb2Ygbm9kZXMgaW4KKyAgICAvLyBkZWNsc19iZWdpbigpL2RlY2xzX2VuZCgpIChkb25lIGluIHRoZSBERUZfVFJBVkVSU0VfREVDTCBtYWNybykKKyAgICAvLyBpcyBza2lwcGVkIC0gZG9uJ3QgcmVtb3ZlIGl0LgorICAgIHJldHVybiB0cnVlOworICB9KQorCitERUZfVFJBVkVSU0VfREVDTChDYXB0dXJlZERlY2wsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEJvZHkoKSkpOworICAgIC8vIFRoaXMgcmV0dXJuIHN0YXRlbWVudCBtYWtlcyBzdXJlIHRoZSB0cmF2ZXJzYWwgb2Ygbm9kZXMgaW4KKyAgICAvLyBkZWNsc19iZWdpbigpL2RlY2xzX2VuZCgpIChkb25lIGluIHRoZSBERUZfVFJBVkVSU0VfREVDTCBtYWNybykKKyAgICAvLyBpcyBza2lwcGVkIC0gZG9uJ3QgcmVtb3ZlIGl0LgorICAgIHJldHVybiB0cnVlOworICB9KQorCitERUZfVFJBVkVSU0VfREVDTChFbXB0eURlY2wsIHsgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woRmlsZVNjb3BlQXNtRGVjbCwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0QXNtU3RyaW5nKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woSW1wb3J0RGVjbCwgeyB9KQorCitERUZfVFJBVkVSU0VfREVDTChGcmllbmREZWNsLCB7CisgICAgLy8gRnJpZW5kIGlzIGVpdGhlciBkZWNsIG9yIGEgdHlwZS4KKyAgICBpZiAoRC0+Z2V0RnJpZW5kVHlwZSgpKQorICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhELT5nZXRGcmllbmRUeXBlKCktPmdldFR5cGVMb2MoKSkpOworICAgIGVsc2UKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woRC0+Z2V0RnJpZW5kRGVjbCgpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKEZyaWVuZFRlbXBsYXRlRGVjbCwgeworICAgIGlmIChELT5nZXRGcmllbmRUeXBlKCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKEQtPmdldEZyaWVuZFR5cGUoKS0+Z2V0VHlwZUxvYygpKSk7CisgICAgZWxzZQorICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChELT5nZXRGcmllbmREZWNsKCkpKTsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gRC0+Z2V0TnVtVGVtcGxhdGVQYXJhbWV0ZXJzKCk7IEkgPCBFOyArK0kpIHsKKyAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVFBMID0gRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJMaXN0KEkpOworICAgICAgZm9yIChUZW1wbGF0ZVBhcmFtZXRlckxpc3Q6Oml0ZXJhdG9yIElUUEwgPSBUUEwtPmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVRQTCA9IFRQTC0+ZW5kKCk7CisgICAgICAgICAgIElUUEwgIT0gRVRQTDsgKytJVFBMKSB7CisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woKklUUEwpKTsKKyAgICAgIH0KKyAgICB9CisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKENsYXNzU2NvcGVGdW5jdGlvblNwZWNpYWxpemF0aW9uRGVjbCwgeworICBUUllfVE8oVHJhdmVyc2VEZWNsKEQtPmdldFNwZWNpYWxpemF0aW9uKCkpKTsKKyB9KQorCitERUZfVFJBVkVSU0VfREVDTChMaW5rYWdlU3BlY0RlY2wsIHsgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woT2JqQ1Byb3BlcnR5SW1wbERlY2wsIHsKKyAgICAvLyBGSVhNRTogaW1wbGVtZW50IHRoaXMKKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woU3RhdGljQXNzZXJ0RGVjbCwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0QXNzZXJ0RXhwcigpKSk7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRNZXNzYWdlKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woVHJhbnNsYXRpb25Vbml0RGVjbCwgeworICAgIC8vIENvZGUgaW4gYW4gdW5uYW1lZCBuYW1lc3BhY2Ugc2hvd3MgdXAgYXV0b21hdGljYWxseSBpbgorICAgIC8vIGRlY2xzX2JlZ2luKCkvZGVjbHNfZW5kKCkuICBUaHVzIHdlIGRvbid0IG5lZWQgdG8gcmVjdXJzZSBvbgorICAgIC8vIEQtPmdldEFub255bW91c05hbWVzcGFjZSgpLgorICB9KQorCitERUZfVFJBVkVSU0VfREVDTChOYW1lc3BhY2VBbGlhc0RlY2wsIHsKKyAgICAvLyBXZSBzaG91bGRuJ3QgdHJhdmVyc2UgYW4gYWxpYXNlZCBuYW1lc3BhY2UsIHNpbmNlIGl0IHdpbGwgYmUKKyAgICAvLyBkZWZpbmVkIChhbmQsIHRoZXJlZm9yZSwgdHJhdmVyc2VkKSBzb21ld2hlcmUgZWxzZS4KKyAgICAvLworICAgIC8vIFRoaXMgcmV0dXJuIHN0YXRlbWVudCBtYWtlcyBzdXJlIHRoZSB0cmF2ZXJzYWwgb2Ygbm9kZXMgaW4KKyAgICAvLyBkZWNsc19iZWdpbigpL2RlY2xzX2VuZCgpIChkb25lIGluIHRoZSBERUZfVFJBVkVSU0VfREVDTCBtYWNybykKKyAgICAvLyBpcyBza2lwcGVkIC0gZG9uJ3QgcmVtb3ZlIGl0LgorICAgIHJldHVybiB0cnVlOworICB9KQorCitERUZfVFJBVkVSU0VfREVDTChMYWJlbERlY2wsIHsKKyAgLy8gVGhlcmUgaXMgbm8gY29kZSBpbiBhIExhYmVsRGVjbC4KK30pCisKKworREVGX1RSQVZFUlNFX0RFQ0woTmFtZXNwYWNlRGVjbCwgeworICAgIC8vIENvZGUgaW4gYW4gdW5uYW1lZCBuYW1lc3BhY2Ugc2hvd3MgdXAgYXV0b21hdGljYWxseSBpbgorICAgIC8vIGRlY2xzX2JlZ2luKCkvZGVjbHNfZW5kKCkuICBUaHVzIHdlIGRvbid0IG5lZWQgdG8gcmVjdXJzZSBvbgorICAgIC8vIEQtPmdldEFub255bW91c05hbWVzcGFjZSgpLgorICB9KQorCitERUZfVFJBVkVSU0VfREVDTChPYmpDQ29tcGF0aWJsZUFsaWFzRGVjbCwgeworICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woT2JqQ0NhdGVnb3J5RGVjbCwgeworICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woT2JqQ0NhdGVnb3J5SW1wbERlY2wsIHsKKyAgICAvLyBGSVhNRTogaW1wbGVtZW50CisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKE9iakNJbXBsZW1lbnRhdGlvbkRlY2wsIHsKKyAgICAvLyBGSVhNRTogaW1wbGVtZW50CisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKE9iakNJbnRlcmZhY2VEZWNsLCB7CisgICAgLy8gRklYTUU6IGltcGxlbWVudAorICB9KQorCitERUZfVFJBVkVSU0VfREVDTChPYmpDUHJvdG9jb2xEZWNsLCB7CisgICAgLy8gRklYTUU6IGltcGxlbWVudAorICB9KQorCitERUZfVFJBVkVSU0VfREVDTChPYmpDTWV0aG9kRGVjbCwgeworICBpZiAoRC0+Z2V0UmV0dXJuVHlwZVNvdXJjZUluZm8oKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0UmV0dXJuVHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CisgIH0KKyAgZm9yIChPYmpDTWV0aG9kRGVjbDo6cGFyYW1faXRlcmF0b3IgSSA9IEQtPnBhcmFtX2JlZ2luKCksIEUgPSBELT5wYXJhbV9lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woKkkpKTsKKyAgfQorICBpZiAoRC0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRCb2R5KCkpKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKE9iakNQcm9wZXJ0eURlY2wsIHsKKyAgICAvLyBGSVhNRTogaW1wbGVtZW50CisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKFVzaW5nRGVjbCwgeworICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoRC0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKKyAgICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKEQtPmdldE5hbWVJbmZvKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woVXNpbmdEaXJlY3RpdmVEZWNsLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhELT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfREVDTChVc2luZ1NoYWRvd0RlY2wsIHsgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woT01QVGhyZWFkUHJpdmF0ZURlY2wsIHsKKyAgICBmb3IgKGF1dG8gKkkgOiBELT52YXJsaXN0cygpKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VTdG10KEkpKTsKKyAgICB9CisgIH0pCisKKy8vIEEgaGVscGVyIG1ldGhvZCBmb3IgVGVtcGxhdGVEZWNsJ3MgY2hpbGRyZW4uCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VUZW1wbGF0ZVBhcmFtZXRlckxpc3RIZWxwZXIoCisgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUUEwpIHsKKyAgaWYgKFRQTCkgeworICAgIGZvciAoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0OjppdGVyYXRvciBJID0gVFBMLT5iZWdpbigpLCBFID0gVFBMLT5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKCpJKSk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBBIGhlbHBlciBtZXRob2QgZm9yIHRyYXZlcnNpbmcgdGhlIGltcGxpY2l0IGluc3RhbnRpYXRpb25zIG9mIGEKKy8vIGNsYXNzIHRlbXBsYXRlLgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlQ2xhc3NJbnN0YW50aWF0aW9ucygKKyAgICBDbGFzc1RlbXBsYXRlRGVjbCAqRCkgeworICBmb3IgKGF1dG8gKlNEIDogRC0+c3BlY2lhbGl6YXRpb25zKCkpIHsKKyAgICBmb3IgKGF1dG8gKlJEIDogU0QtPnJlZGVjbHMoKSkgeworICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byB2aXNpdCBpbmplY3RlZC1jbGFzcy1uYW1lcyBpbiB0aGlzIHRyYXZlcnNhbC4KKyAgICAgIGlmIChjYXN0PENYWFJlY29yZERlY2w+KFJEKS0+aXNJbmplY3RlZENsYXNzTmFtZSgpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgc3dpdGNoIChjYXN0PENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+KFJEKS0+CisgICAgICAgICAgICAgICAgICBnZXRTcGVjaWFsaXphdGlvbktpbmQoKSkgeworICAgICAgLy8gVmlzaXQgdGhlIGltcGxpY2l0IGluc3RhbnRpYXRpb25zIHdpdGggdGhlIHJlcXVlc3RlZCBwYXR0ZXJuLgorICAgICAgY2FzZSBUU0tfVW5kZWNsYXJlZDoKKyAgICAgIGNhc2UgVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbjoKKyAgICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChSRCkpOworICAgICAgICBicmVhazsKKworICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBvbiBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uCisgICAgICAvLyBvciBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBiZWNhdXNlIHRoZXJlIHdpbGwgYmUgYW4gZXhwbGljaXQKKyAgICAgIC8vIG5vZGUgZm9yIGl0IGVsc2V3aGVyZS4KKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uOgorICAgICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVmaW5pdGlvbjoKKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitERUZfVFJBVkVSU0VfREVDTChDbGFzc1RlbXBsYXRlRGVjbCwgeworICAgIENYWFJlY29yZERlY2wqIFRlbXBEZWNsID0gRC0+Z2V0VGVtcGxhdGVkRGVjbCgpOworICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woVGVtcERlY2wpKTsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZVBhcmFtZXRlckxpc3RIZWxwZXIoRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkpKTsKKworICAgIC8vIEJ5IGRlZmF1bHQsIHdlIGRvIG5vdCB0cmF2ZXJzZSB0aGUgaW5zdGFudGlhdGlvbnMgb2YKKyAgICAvLyBjbGFzcyB0ZW1wbGF0ZXMgc2luY2UgdGhleSBkbyBub3QgYXBwZWFyIGluIHRoZSB1c2VyIGNvZGUuIFRoZQorICAgIC8vIGZvbGxvd2luZyBjb2RlIG9wdGlvbmFsbHkgdHJhdmVyc2VzIHRoZW0uCisgICAgLy8KKyAgICAvLyBXZSBvbmx5IHRyYXZlcnNlIHRoZSBjbGFzcyBpbnN0YW50aWF0aW9ucyB3aGVuIHdlIHNlZSB0aGUgY2Fub25pY2FsCisgICAgLy8gZGVjbGFyYXRpb24gb2YgdGhlIHRlbXBsYXRlLCB0byBlbnN1cmUgd2Ugb25seSB2aXNpdCB0aGVtIG9uY2UuCisgICAgaWYgKGdldERlcml2ZWQoKS5zaG91bGRWaXNpdFRlbXBsYXRlSW5zdGFudGlhdGlvbnMoKSAmJgorICAgICAgICBEID09IEQtPmdldENhbm9uaWNhbERlY2woKSkKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZUNsYXNzSW5zdGFudGlhdGlvbnMoRCkpOworCisgICAgLy8gTm90ZSB0aGF0IGdldEluc3RhbnRpYXRlZEZyb21NZW1iZXJUZW1wbGF0ZSgpIGlzIGp1c3QgYSBsaW5rCisgICAgLy8gZnJvbSBhIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gYmFjayB0byB0aGUgdGVtcGxhdGUgZnJvbSB3aGljaAorICAgIC8vIGl0IHdhcyBpbnN0YW50aWF0ZWQsIGFuZCB0aHVzIHNob3VsZCBub3QgYmUgdHJhdmVyc2VkLgorICB9KQorCisvLyBBIGhlbHBlciBtZXRob2QgZm9yIHRyYXZlcnNpbmcgdGhlIGltcGxpY2l0IGluc3RhbnRpYXRpb25zIG9mIGEKKy8vIGNsYXNzIHRlbXBsYXRlLgordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVZhcmlhYmxlSW5zdGFudGlhdGlvbnMoCisgICAgVmFyVGVtcGxhdGVEZWNsICpEKSB7CisgIGZvciAoYXV0byAqU0QgOiBELT5zcGVjaWFsaXphdGlvbnMoKSkgeworICAgIGZvciAoYXV0byAqUkQgOiBTRC0+cmVkZWNscygpKSB7CisgICAgICBzd2l0Y2ggKGNhc3Q8VmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+KFJEKS0+CisgICAgICAgICAgICAgICAgICBnZXRTcGVjaWFsaXphdGlvbktpbmQoKSkgeworICAgICAgLy8gVmlzaXQgdGhlIGltcGxpY2l0IGluc3RhbnRpYXRpb25zIHdpdGggdGhlIHJlcXVlc3RlZCBwYXR0ZXJuLgorICAgICAgY2FzZSBUU0tfVW5kZWNsYXJlZDoKKyAgICAgIGNhc2UgVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbjoKKyAgICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChSRCkpOworICAgICAgICBicmVhazsKKworICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBvbiBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uCisgICAgICAvLyBvciBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBiZWNhdXNlIHRoZXJlIHdpbGwgYmUgYW4gZXhwbGljaXQKKyAgICAgIC8vIG5vZGUgZm9yIGl0IGVsc2V3aGVyZS4KKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uOgorICAgICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVmaW5pdGlvbjoKKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitERUZfVFJBVkVSU0VfREVDTCgKKyAgICBWYXJUZW1wbGF0ZURlY2wsCisgICAgeworICBWYXJEZWNsICpUZW1wRGVjbCA9IEQtPmdldFRlbXBsYXRlZERlY2woKTsKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbChUZW1wRGVjbCkpOworICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZVBhcmFtZXRlckxpc3RIZWxwZXIoRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkpKTsKKworICAvLyBCeSBkZWZhdWx0LCB3ZSBkbyBub3QgdHJhdmVyc2UgdGhlIGluc3RhbnRpYXRpb25zIG9mCisgIC8vIHZhcmlhYmxlIHRlbXBsYXRlcyBzaW5jZSB0aGV5IGRvIG5vdCBhcHBlYXIgaW4gdGhlIHVzZXIgY29kZS4gVGhlCisgIC8vIGZvbGxvd2luZyBjb2RlIG9wdGlvbmFsbHkgdHJhdmVyc2VzIHRoZW0uCisgIC8vCisgIC8vIFdlIG9ubHkgdHJhdmVyc2UgdGhlIHZhcmlhYmxlIGluc3RhbnRpYXRpb25zIHdoZW4gd2Ugc2VlIHRoZSBjYW5vbmljYWwKKyAgLy8gZGVjbGFyYXRpb24gb2YgdGhlIHRlbXBsYXRlLCB0byBlbnN1cmUgd2Ugb25seSB2aXNpdCB0aGVtIG9uY2UuCisgIGlmIChnZXREZXJpdmVkKCkuc2hvdWxkVmlzaXRUZW1wbGF0ZUluc3RhbnRpYXRpb25zKCkgJiYKKyAgICAgIEQgPT0gRC0+Z2V0Q2Fub25pY2FsRGVjbCgpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVZhcmlhYmxlSW5zdGFudGlhdGlvbnMoRCkpOworCisgICAgICAvLyBOb3RlIHRoYXQgZ2V0SW5zdGFudGlhdGVkRnJvbU1lbWJlclRlbXBsYXRlKCkgaXMganVzdCBhIGxpbmsKKyAgICAgIC8vIGZyb20gYSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGJhY2sgdG8gdGhlIHRlbXBsYXRlIGZyb20gd2hpY2gKKyAgICAgIC8vIGl0IHdhcyBpbnN0YW50aWF0ZWQsIGFuZCB0aHVzIHNob3VsZCBub3QgYmUgdHJhdmVyc2VkLgorfSkKKworLy8gQSBoZWxwZXIgbWV0aG9kIGZvciB0cmF2ZXJzaW5nIHRoZSBpbnN0YW50aWF0aW9ucyBvZiBhCisvLyBmdW5jdGlvbiB3aGlsZSBza2lwcGluZyBpdHMgc3BlY2lhbGl6YXRpb25zLgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlRnVuY3Rpb25JbnN0YW50aWF0aW9ucygKKyAgICBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRCkgeworICBmb3IgKGF1dG8gKkZEIDogRC0+c3BlY2lhbGl6YXRpb25zKCkpIHsKKyAgICBmb3IgKGF1dG8gKlJEIDogRkQtPnJlZGVjbHMoKSkgeworICAgICAgc3dpdGNoIChSRC0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSkgeworICAgICAgY2FzZSBUU0tfVW5kZWNsYXJlZDoKKyAgICAgIGNhc2UgVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbjoKKyAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB3aGF0IGtpbmQgb2YgRnVuY3Rpb25EZWNsIHRoaXMgaXMuCisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woUkQpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8vIE5vIG5lZWQgdG8gdmlzaXQgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMsIHdlJ2xsIGZpbmQgdGhlIG5vZGUKKyAgICAgIC8vIGV2ZW50dWFsbHkuCisgICAgICAvLyBGSVhNRTogVGhpcyBpcyBpbmNvcnJlY3Q7IHRoZXJlIGlzIG5vIG90aGVyIG5vZGUgZm9yIGFuIGV4cGxpY2l0CisgICAgICAvLyBpbnN0YW50aWF0aW9uIG9mIGEgZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCisgICAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWNsYXJhdGlvbjoKKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlZmluaXRpb246CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uOgorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworREVGX1RSQVZFUlNFX0RFQ0woRnVuY3Rpb25UZW1wbGF0ZURlY2wsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VEZWNsKEQtPmdldFRlbXBsYXRlZERlY2woKSkpOworICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlUGFyYW1ldGVyTGlzdEhlbHBlcihELT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSkpOworCisgICAgLy8gQnkgZGVmYXVsdCwgd2UgZG8gbm90IHRyYXZlcnNlIHRoZSBpbnN0YW50aWF0aW9ucyBvZgorICAgIC8vIGZ1bmN0aW9uIHRlbXBsYXRlcyBzaW5jZSB0aGV5IGRvIG5vdCBhcHBlYXIgaW4gdGhlIHVzZXIgY29kZS4gVGhlCisgICAgLy8gZm9sbG93aW5nIGNvZGUgb3B0aW9uYWxseSB0cmF2ZXJzZXMgdGhlbS4KKyAgICAvLworICAgIC8vIFdlIG9ubHkgdHJhdmVyc2UgdGhlIGZ1bmN0aW9uIGluc3RhbnRpYXRpb25zIHdoZW4gd2Ugc2VlIHRoZSBjYW5vbmljYWwKKyAgICAvLyBkZWNsYXJhdGlvbiBvZiB0aGUgdGVtcGxhdGUsIHRvIGVuc3VyZSB3ZSBvbmx5IHZpc2l0IHRoZW0gb25jZS4KKyAgICBpZiAoZ2V0RGVyaXZlZCgpLnNob3VsZFZpc2l0VGVtcGxhdGVJbnN0YW50aWF0aW9ucygpICYmCisgICAgICAgIEQgPT0gRC0+Z2V0Q2Fub25pY2FsRGVjbCgpKQorICAgICAgVFJZX1RPKFRyYXZlcnNlRnVuY3Rpb25JbnN0YW50aWF0aW9ucyhEKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCwgeworICAgIC8vIEQgaXMgdGhlICJUIiBpbiBzb21ldGhpbmcgbGlrZQorICAgIC8vICAgdGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgVD4gY2xhc3MgY29udGFpbmVyIHsgfTsKKyAgICBUUllfVE8oVHJhdmVyc2VEZWNsKEQtPmdldFRlbXBsYXRlZERlY2woKSkpOworICAgIGlmIChELT5oYXNEZWZhdWx0QXJndW1lbnQoKSkgeworICAgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvYyhELT5nZXREZWZhdWx0QXJndW1lbnQoKSkpOworICAgIH0KKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZVBhcmFtZXRlckxpc3RIZWxwZXIoRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woVGVtcGxhdGVUeXBlUGFybURlY2wsIHsKKyAgICAvLyBEIGlzIHRoZSAiVCIgaW4gc29tZXRoaW5nIGxpa2UgInRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIHZlY3RvcjsiCisgICAgaWYgKEQtPmdldFR5cGVGb3JEZWNsKCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFF1YWxUeXBlKEQtPmdldFR5cGVGb3JEZWNsKCksIDApKSk7CisgICAgaWYgKEQtPmhhc0RlZmF1bHRBcmd1bWVudCgpKQorICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhELT5nZXREZWZhdWx0QXJndW1lbnRJbmZvKCktPmdldFR5cGVMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfREVDTChUeXBlZGVmRGVjbCwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CisgICAgLy8gV2Ugc2hvdWxkbid0IHRyYXZlcnNlIEQtPmdldFR5cGVGb3JEZWNsKCk7IGl0J3MgYSByZXN1bHQgb2YKKyAgICAvLyBkZWNsYXJpbmcgdGhlIHR5cGVkZWYsIG5vdCBzb21ldGhpbmcgdGhhdCB3YXMgd3JpdHRlbiBpbiB0aGUKKyAgICAvLyBzb3VyY2UuCisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKFR5cGVBbGlhc0RlY2wsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKEQtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworICAgIC8vIFdlIHNob3VsZG4ndCB0cmF2ZXJzZSBELT5nZXRUeXBlRm9yRGVjbCgpOyBpdCdzIGEgcmVzdWx0IG9mCisgICAgLy8gZGVjbGFyaW5nIHRoZSB0eXBlIGFsaWFzLCBub3Qgc29tZXRoaW5nIHRoYXQgd2FzIHdyaXR0ZW4gaW4gdGhlCisgICAgLy8gc291cmNlLgorICB9KQorCitERUZfVFJBVkVSU0VfREVDTChUeXBlQWxpYXNUZW1wbGF0ZURlY2wsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VEZWNsKEQtPmdldFRlbXBsYXRlZERlY2woKSkpOworICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlUGFyYW1ldGVyTGlzdEhlbHBlcihELT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfREVDTChVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wsIHsKKyAgICAvLyBBIGRlcGVuZGVudCB1c2luZyBkZWNsYXJhdGlvbiB3aGljaCB3YXMgbWFya2VkIHdpdGggJ3R5cGVuYW1lJy4KKyAgICAvLyAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEEgOiBwdWJsaWMgQjxUPiB7IHVzaW5nIHR5cGVuYW1lIEI8VD46OmZvbzsgfTsKKyAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7CisgICAgLy8gV2Ugc2hvdWxkbid0IHRyYXZlcnNlIEQtPmdldFR5cGVGb3JEZWNsKCk7IGl0J3MgYSByZXN1bHQgb2YKKyAgICAvLyBkZWNsYXJpbmcgdGhlIHR5cGUsIG5vdCBzb21ldGhpbmcgdGhhdCB3YXMgd3JpdHRlbiBpbiB0aGUKKyAgICAvLyBzb3VyY2UuCisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKEVudW1EZWNsLCB7CisgICAgaWYgKEQtPmdldFR5cGVGb3JEZWNsKCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFF1YWxUeXBlKEQtPmdldFR5cGVGb3JEZWNsKCksIDApKSk7CisKKyAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7CisgICAgLy8gVGhlIGVudW1lcmF0b3JzIGFyZSBhbHJlYWR5IHRyYXZlcnNlZCBieQorICAgIC8vIGRlY2xzX2JlZ2luKCkvZGVjbHNfZW5kKCkuCisgIH0pCisKKworLy8gSGVscGVyIG1ldGhvZHMgZm9yIFJlY29yZERlY2wgYW5kIGl0cyBjaGlsZHJlbi4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVJlY29yZEhlbHBlcigKKyAgICBSZWNvcmREZWNsICpEKSB7CisgIC8vIFdlIHNob3VsZG4ndCB0cmF2ZXJzZSBELT5nZXRUeXBlRm9yRGVjbCgpOyBpdCdzIGEgcmVzdWx0IG9mCisgIC8vIGRlY2xhcmluZyB0aGUgdHlwZSwgbm90IHNvbWV0aGluZyB0aGF0IHdhcyB3cml0dGVuIGluIHRoZSBzb3VyY2UuCisKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhELT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlQ1hYUmVjb3JkSGVscGVyKAorICAgIENYWFJlY29yZERlY2wgKkQpIHsKKyAgaWYgKCFUcmF2ZXJzZVJlY29yZEhlbHBlcihEKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChELT5pc0NvbXBsZXRlRGVmaW5pdGlvbigpKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogRC0+YmFzZXMoKSkgeworICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhJLmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworICAgIH0KKyAgICAvLyBXZSBkb24ndCB0cmF2ZXJzZSB0aGUgZnJpZW5kcyBvciB0aGUgY29udmVyc2lvbnMsIGFzIHRoZXkgYXJlCisgICAgLy8gYWxyZWFkeSBpbiBkZWNsc19iZWdpbigpL2RlY2xzX2VuZCgpLgorICB9CisgIHJldHVybiB0cnVlOworfQorCitERUZfVFJBVkVSU0VfREVDTChSZWNvcmREZWNsLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlUmVjb3JkSGVscGVyKEQpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woQ1hYUmVjb3JkRGVjbCwgeworICAgIFRSWV9UTyhUcmF2ZXJzZUNYWFJlY29yZEhlbHBlcihEKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wsIHsKKyAgICAvLyBGb3IgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgKCJzZXQ8aW50PiB4OyIpLCB3ZSBkb24ndCB3YW50IHRvCisgICAgLy8gcmVjdXJzZSBhdCBhbGwsIHNpbmNlIHRoZSBpbnN0YXRpYXRlZCBjbGFzcyBpc24ndCB3cml0dGVuIGluCisgICAgLy8gdGhlIHNvdXJjZSBjb2RlIGFueXdoZXJlLiAgKE5vdGUgdGhlIGluc3RhdGlhdGVkICp0eXBlKiAtLQorICAgIC8vIHNldDxpbnQ+IC0tIGlzIHdyaXR0ZW4sIGFuZCB3aWxsIHN0aWxsIGdldCBhIGNhbGxiYWNrIG9mCisgICAgLy8gVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUpLiAgRm9yIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zCisgICAgLy8gKCJ0ZW1wbGF0ZSBzZXQ8aW50PjsiKSwgd2UgZG8gbmVlZCBhIGNhbGxiYWNrLCBzaW5jZSB0aGlzCisgICAgLy8gaXMgdGhlIG9ubHkgY2FsbGJhY2sgdGhhdCdzIG1hZGUgZm9yIHRoaXMgaW5zdGFudGlhdGlvbi4KKyAgICAvLyBXZSB1c2UgZ2V0VHlwZUFzV3JpdHRlbigpIHRvIGRpc3Rpbmd1aXNoLgorICAgIGlmIChUeXBlU291cmNlSW5mbyAqVFNJID0gRC0+Z2V0VHlwZUFzV3JpdHRlbigpKQorICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUU0ktPmdldFR5cGVMb2MoKSkpOworCisgICAgaWYgKCFnZXREZXJpdmVkKCkuc2hvdWxkVmlzaXRUZW1wbGF0ZUluc3RhbnRpYXRpb25zKCkgJiYKKyAgICAgICAgRC0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSAhPSBUU0tfRXhwbGljaXRTcGVjaWFsaXphdGlvbikKKyAgICAgIC8vIFJldHVybmluZyBmcm9tIGhlcmUgc2tpcHMgdHJhdmVyc2luZyB0aGUKKyAgICAgIC8vIGRlY2xhcmF0aW9uIGNvbnRleHQgb2YgdGhlIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wKKyAgICAgIC8vIChlbWJlZGRlZCBpbiB0aGUgREVGX1RSQVZFUlNFX0RFQ0woKSBtYWNybykKKyAgICAgIC8vIHdoaWNoIGNvbnRhaW5zIHRoZSBpbnN0YW50aWF0ZWQgbWVtYmVycyBvZiB0aGUgY2xhc3MuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfSkKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2NzSGVscGVyKAorICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2MgKlRBTCwgdW5zaWduZWQgQ291bnQpIHsKKyAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSA8IENvdW50OyArK0kpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jKFRBTFtJXSkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitERUZfVFJBVkVSU0VfREVDTChDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCwgeworICAgIC8vIFRoZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLgorICAgIGlmIChUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRQTCA9IEQtPmdldFRlbXBsYXRlUGFyYW1ldGVycygpKSB7CisgICAgICBmb3IgKFRlbXBsYXRlUGFyYW1ldGVyTGlzdDo6aXRlcmF0b3IgSSA9IFRQTC0+YmVnaW4oKSwgRSA9IFRQTC0+ZW5kKCk7CisgICAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woKkkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gVGhlIGFyZ3MgdGhhdCByZW1haW5zIHVuc3BlY2lhbGl6ZWQuCisgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvY3NIZWxwZXIoCisgICAgICAgICAgICAgICAgICAgICAgIEQtPmdldFRlbXBsYXRlQXJnc0FzV3JpdHRlbigpLT5nZXRUZW1wbGF0ZUFyZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRC0+Z2V0VGVtcGxhdGVBcmdzQXNXcml0dGVuKCktPk51bVRlbXBsYXRlQXJncykpOworCisgICAgLy8gRG9uJ3QgbmVlZCB0aGUgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkhlbHBlciwgZXZlbgorICAgIC8vIHRob3VnaCB0aGF0J3Mgb3VyIHBhcmVudCBjbGFzcyAtLSB3ZSBhbHJlYWR5IHZpc2l0IGFsbCB0aGUKKyAgICAvLyB0ZW1wbGF0ZSBhcmdzIGhlcmUuCisgICAgVFJZX1RPKFRyYXZlcnNlQ1hYUmVjb3JkSGVscGVyKEQpKTsKKworICAgIC8vIEluc3RhbnRpYXRpb25zIHdpbGwgaGF2ZSBiZWVuIHZpc2l0ZWQgd2l0aCB0aGUgcHJpbWFyeSB0ZW1wbGF0ZS4KKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woRW51bUNvbnN0YW50RGVjbCwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0SW5pdEV4cHIoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfREVDTChVbnJlc29sdmVkVXNpbmdWYWx1ZURlY2wsIHsKKyAgICAvLyBMaWtlIFVucmVzb2x2ZWRVc2luZ1R5cGVuYW1lRGVjbCwgYnV0IHdpdGhvdXQgdGhlICd0eXBlbmFtZSc6CisgICAgLy8gICAgdGVtcGxhdGUgPGNsYXNzIFQ+IENsYXNzIEEgOiBwdWJsaWMgQmFzZTxUPiB7IHVzaW5nIEJhc2U8VD46OmZvbzsgfTsKKyAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7CisgICAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRpb25OYW1lSW5mbyhELT5nZXROYW1lSW5mbygpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKEluZGlyZWN0RmllbGREZWNsLCB7fSkKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlRGVjbGFyYXRvckhlbHBlcihEZWNsYXJhdG9yRGVjbCAqRCkgeworICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7CisgIGlmIChELT5nZXRUeXBlU291cmNlSW5mbygpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CisgIGVsc2UKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlKEQtPmdldFR5cGUoKSkpOworICByZXR1cm4gdHJ1ZTsKK30KKworREVGX1RSQVZFUlNFX0RFQ0woRmllbGREZWNsLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRvckhlbHBlcihEKSk7CisgICAgaWYgKEQtPmlzQml0RmllbGQoKSkKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0Qml0V2lkdGgoKSkpOworICAgIGVsc2UgaWYgKEQtPmhhc0luQ2xhc3NJbml0aWFsaXplcigpKQorICAgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRJbkNsYXNzSW5pdGlhbGl6ZXIoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfREVDTChNU1Byb3BlcnR5RGVjbCwgeworICAgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0b3JIZWxwZXIoRCkpOworICB9KQorCitERUZfVFJBVkVSU0VfREVDTChPYmpDQXREZWZzRmllbGREZWNsLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRvckhlbHBlcihEKSk7CisgICAgaWYgKEQtPmlzQml0RmllbGQoKSkKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0Qml0V2lkdGgoKSkpOworICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQgdGhlIHJlc3QuCisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKE9iakNJdmFyRGVjbCwgeworICAgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0b3JIZWxwZXIoRCkpOworICAgIGlmIChELT5pc0JpdEZpZWxkKCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEJpdFdpZHRoKCkpKTsKKyAgICAvLyBGSVhNRTogaW1wbGVtZW50IHRoZSByZXN0LgorICB9KQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VGdW5jdGlvbkhlbHBlcihGdW5jdGlvbkRlY2wgKkQpIHsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhELT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKEQtPmdldE5hbWVJbmZvKCkpKTsKKworICAvLyBJZiB3ZSdyZSBhbiBleHBsaWNpdCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiwgaXRlcmF0ZSBvdmVyIHRoZQorICAvLyB0ZW1wbGF0ZSBhcmdzIHRoYXQgd2VyZSBleHBsaWNpdGx5IHNwZWNpZmllZC4gIElmIHdlIHdlcmUgZG9pbmcKKyAgLy8gdGhpcyBpbiB0eXBpbmcgb3JkZXIsIHdlJ2QgZG8gaXQgYmV0d2VlbiB0aGUgcmV0dXJuIHR5cGUgYW5kCisgIC8vIHRoZSBmdW5jdGlvbiBhcmdzLCBidXQgYm90aCBhcmUgaGFuZGxlZCBieSB0aGUgRnVuY3Rpb25UeXBlTG9jCisgIC8vIGFib3ZlLCBzbyB3ZSBoYXZlIHRvIGNob29zZSBvbmUgc2lkZS4gIEkndmUgZGVjaWRlZCB0byBkbyBiZWZvcmUuCisgIGlmIChjb25zdCBGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb25JbmZvICpGVFNJID0KKyAgICAgIEQtPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25JbmZvKCkpIHsKKyAgICBpZiAoRlRTSS0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSAhPSBUU0tfVW5kZWNsYXJlZCAmJgorICAgICAgICBGVFNJLT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpICE9IFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb24pIHsKKyAgICAgIC8vIEEgc3BlY2lhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnRzIGlmIGl0IGhhcworICAgICAgLy8gYSB0ZW1wbGF0ZWQgcmV0dXJuIHR5cGUgYW5kIGNvbmNyZXRlIGFyZ3VtZW50cy4KKyAgICAgIGlmIChjb25zdCBBU1RUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKlRBTEkgPQorICAgICAgICAgIEZUU0ktPlRlbXBsYXRlQXJndW1lbnRzQXNXcml0dGVuKSB7CisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2NzSGVscGVyKFRBTEktPmdldFRlbXBsYXRlQXJncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUxJLT5OdW1UZW1wbGF0ZUFyZ3MpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBWaXNpdCB0aGUgZnVuY3Rpb24gdHlwZSBpdHNlbGYsIHdoaWNoIGNhbiBiZSBlaXRoZXIKKyAgLy8gRnVuY3Rpb25Ob1Byb3RvVHlwZSBvciBGdW5jdGlvblByb3RvVHlwZSwgb3IgYSB0eXBlZGVmLiAgVGhpcworICAvLyBhbHNvIGNvdmVycyB0aGUgcmV0dXJuIHR5cGUgYW5kIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzLAorICAvLyBpbmNsdWRpbmcgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zLgorICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKEQtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworCisgIGlmIChDWFhDb25zdHJ1Y3RvckRlY2wgKkN0b3IgPSBkeW5fY2FzdDxDWFhDb25zdHJ1Y3RvckRlY2w+KEQpKSB7CisgICAgLy8gQ29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLgorICAgIGZvciAoYXV0byAqSSA6IEN0b3ItPmluaXRzKCkpIHsKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXIoSSkpOworICAgIH0KKyAgfQorCisgIGlmIChELT5pc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEJvZHkoKSkpOyAgLy8gRnVuY3Rpb24gYm9keS4KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworREVGX1RSQVZFUlNFX0RFQ0woRnVuY3Rpb25EZWNsLCB7CisgICAgLy8gV2Ugc2tpcCBkZWNsc19iZWdpbi9kZWNsc19lbmQsIHdoaWNoIGFyZSBhbHJlYWR5IGNvdmVyZWQgYnkKKyAgICAvLyBUcmF2ZXJzZUZ1bmN0aW9uSGVscGVyKCkuCisgICAgcmV0dXJuIFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoRCk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKENYWE1ldGhvZERlY2wsIHsKKyAgICAvLyBXZSBza2lwIGRlY2xzX2JlZ2luL2RlY2xzX2VuZCwgd2hpY2ggYXJlIGFscmVhZHkgY292ZXJlZCBieQorICAgIC8vIFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoKS4KKyAgICByZXR1cm4gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcihEKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woQ1hYQ29uc3RydWN0b3JEZWNsLCB7CisgICAgLy8gV2Ugc2tpcCBkZWNsc19iZWdpbi9kZWNsc19lbmQsIHdoaWNoIGFyZSBhbHJlYWR5IGNvdmVyZWQgYnkKKyAgICAvLyBUcmF2ZXJzZUZ1bmN0aW9uSGVscGVyKCkuCisgICAgcmV0dXJuIFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoRCk7CisgIH0pCisKKy8vIENYWENvbnZlcnNpb25EZWNsIGlzIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4KKy8vIEl0J3Mgbm90IGEgY2FzdCBleHByZXNzaW9uLgorREVGX1RSQVZFUlNFX0RFQ0woQ1hYQ29udmVyc2lvbkRlY2wsIHsKKyAgICAvLyBXZSBza2lwIGRlY2xzX2JlZ2luL2RlY2xzX2VuZCwgd2hpY2ggYXJlIGFscmVhZHkgY292ZXJlZCBieQorICAgIC8vIFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoKS4KKyAgICByZXR1cm4gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcihEKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woQ1hYRGVzdHJ1Y3RvckRlY2wsIHsKKyAgICAvLyBXZSBza2lwIGRlY2xzX2JlZ2luL2RlY2xzX2VuZCwgd2hpY2ggYXJlIGFscmVhZHkgY292ZXJlZCBieQorICAgIC8vIFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoKS4KKyAgICByZXR1cm4gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcihEKTsKKyAgfSkKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlVmFySGVscGVyKFZhckRlY2wgKkQpIHsKKyAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRvckhlbHBlcihEKSk7CisgIC8vIERlZmF1bHQgcGFyYW1zIGFyZSB0YWtlbiBjYXJlIG9mIHdoZW4gd2UgdHJhdmVyc2UgdGhlIFBhcm1WYXJEZWNsLgorICBpZiAoIWlzYTxQYXJtVmFyRGVjbD4oRCkpCisgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRJbml0KCkpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0RFRl9UUkFWRVJTRV9ERUNMKFZhckRlY2wsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VWYXJIZWxwZXIoRCkpOworICB9KQorCitERUZfVFJBVkVSU0VfREVDTChWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCwgeworICAvLyBGb3IgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMsIHdlIGRvbid0IHdhbnQgdG8KKyAgLy8gcmVjdXJzZSBhdCBhbGwsIHNpbmNlIHRoZSBpbnN0YXRpYXRlZCBjbGFzcyBpc24ndCB3cml0dGVuIGluCisgIC8vIHRoZSBzb3VyY2UgY29kZSBhbnl3aGVyZS4KKyAgaWYgKFR5cGVTb3VyY2VJbmZvICpUU0kgPSBELT5nZXRUeXBlQXNXcml0dGVuKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUU0ktPmdldFR5cGVMb2MoKSkpOworCisgIGlmICghZ2V0RGVyaXZlZCgpLnNob3VsZFZpc2l0VGVtcGxhdGVJbnN0YW50aWF0aW9ucygpICYmCisgICAgICBELT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpICE9IFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uKQorICAgIC8vIFJldHVybmluZyBmcm9tIGhlcmUgc2tpcHMgdHJhdmVyc2luZyB0aGUKKyAgICAvLyBkZWNsYXJhdGlvbiBjb250ZXh0IG9mIHRoZSBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbAorICAgIC8vIChlbWJlZGRlZCBpbiB0aGUgREVGX1RSQVZFUlNFX0RFQ0woKSBtYWNybykuCisgICAgcmV0dXJuIHRydWU7Cit9KQorCitERUZfVFJBVkVSU0VfREVDTChWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wsCisgICAgICAgICAgICAgICAgICB7CisgIC8vIFRoZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLgorICBpZiAoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUUEwgPSBELT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSkgeworICAgIGZvciAoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0OjppdGVyYXRvciBJID0gVFBMLT5iZWdpbigpLCBFID0gVFBMLT5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKCpJKSk7CisgICAgfQorICB9CisgIC8vIFRoZSBhcmdzIHRoYXQgcmVtYWlucyB1bnNwZWNpYWxpemVkLgorICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICBELT5nZXRUZW1wbGF0ZUFyZ3NBc1dyaXR0ZW4oKS0+Z2V0VGVtcGxhdGVBcmdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgRC0+Z2V0VGVtcGxhdGVBcmdzQXNXcml0dGVuKCktPk51bVRlbXBsYXRlQXJncykpOworCisgIC8vIERvbid0IG5lZWQgdGhlIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uSGVscGVyLCBldmVuCisgIC8vIHRob3VnaCB0aGF0J3Mgb3VyIHBhcmVudCBjbGFzcyAtLSB3ZSBhbHJlYWR5IHZpc2l0IGFsbCB0aGUKKyAgLy8gdGVtcGxhdGUgYXJncyBoZXJlLgorICBUUllfVE8oVHJhdmVyc2VWYXJIZWxwZXIoRCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEluc3RhbnRpYXRpb25zIHdpbGwgaGF2ZSBiZWVuIHZpc2l0ZWQgd2l0aCB0aGUgcHJpbWFyeQorICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZS4KK30pCisKK0RFRl9UUkFWRVJTRV9ERUNMKEltcGxpY2l0UGFyYW1EZWNsLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVmFySGVscGVyKEQpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX0RFQ0woTm9uVHlwZVRlbXBsYXRlUGFybURlY2wsIHsKKyAgICAvLyBBIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlciwgZS5nLiAiUyIgaW4gdGVtcGxhdGU8aW50IFM+IGNsYXNzIEZvbyAuLi4KKyAgICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdG9ySGVscGVyKEQpKTsKKyAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldERlZmF1bHRBcmd1bWVudCgpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9ERUNMKFBhcm1WYXJEZWNsLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVmFySGVscGVyKEQpKTsKKworICAgIGlmIChELT5oYXNEZWZhdWx0QXJnKCkgJiYKKyAgICAgICAgRC0+aGFzVW5pbnN0YW50aWF0ZWREZWZhdWx0QXJnKCkgJiYKKyAgICAgICAgIUQtPmhhc1VucGFyc2VkRGVmYXVsdEFyZygpKQorICAgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRVbmluc3RhbnRpYXRlZERlZmF1bHRBcmcoKSkpOworCisgICAgaWYgKEQtPmhhc0RlZmF1bHRBcmcoKSAmJgorICAgICAgICAhRC0+aGFzVW5pbnN0YW50aWF0ZWREZWZhdWx0QXJnKCkgJiYKKyAgICAgICAgIUQtPmhhc1VucGFyc2VkRGVmYXVsdEFyZygpKQorICAgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXREZWZhdWx0QXJnKCkpKTsKKyAgfSkKKworI3VuZGVmIERFRl9UUkFWRVJTRV9ERUNMCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tIFN0bXQgdHJhdmVyc2FsIC0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRm9yIHN0bXRzLCB3ZSBhdXRvbWF0ZSAoaW4gdGhlIERFRl9UUkFWRVJTRV9TVE1UIG1hY3JvKSBpdGVyYXRpbmcKKy8vIG92ZXIgdGhlIGNoaWxkcmVuIGRlZmluZWQgaW4gY2hpbGRyZW4oKSAoZXZlcnkgc3RtdCBkZWZpbmVzIHRoZXNlLAorLy8gdGhvdWdoIHNvbWV0aW1lcyB0aGUgcmFuZ2UgaXMgZW1wdHkpLiAgRWFjaCBpbmRpdmlkdWFsIFRyYXZlcnNlKgorLy8gbWV0aG9kIG9ubHkgbmVlZHMgdG8gd29ycnkgYWJvdXQgY2hpbGRyZW4gb3RoZXIgdGhhbiB0aG9zZS4gIFRvIHNlZQorLy8gd2hhdCBjaGlsZHJlbigpIGRvZXMgZm9yIGEgZ2l2ZW4gY2xhc3MsIHNlZSwgZS5nLiwKKy8vICAgaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vU3RtdF84Y3BwX3NvdXJjZS5odG1sCisKKy8vIFRoaXMgbWFjcm8gbWFrZXMgYXZhaWxhYmxlIGEgdmFyaWFibGUgUywgdGhlIHBhc3NlZC1pbiBzdG10LgorI2RlZmluZSBERUZfVFJBVkVSU0VfU1RNVChTVE1ULCBDT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2UjI1NUTVQgKFNUTVQgKlMpIHsgICAgICAgICAgIFwKKyAgVFJZX1RPKFdhbGtVcEZyb20jI1NUTVQoUykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU3RtdFF1ZXVlQWN0aW9uIFN0bXRRdWV1ZSgqdGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyBDT0RFOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChTdG10OjpjaGlsZF9yYW5nZSByYW5nZSA9IFMtPmNoaWxkcmVuKCk7IHJhbmdlOyArK3JhbmdlKSB7ICAgICAgIFwKKyAgICBTdG10UXVldWUucXVldWUoKnJhbmdlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworREVGX1RSQVZFUlNFX1NUTVQoR0NDQXNtU3RtdCwgeworICAgIFN0bXRRdWV1ZS5xdWV1ZShTLT5nZXRBc21TdHJpbmcoKSk7CisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFMtPmdldE51bUlucHV0cygpOyBJIDwgRTsgKytJKSB7CisgICAgICBTdG10UXVldWUucXVldWUoUy0+Z2V0SW5wdXRDb25zdHJhaW50TGl0ZXJhbChJKSk7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBTLT5nZXROdW1PdXRwdXRzKCk7IEkgPCBFOyArK0kpIHsKKyAgICAgIFN0bXRRdWV1ZS5xdWV1ZShTLT5nZXRPdXRwdXRDb25zdHJhaW50TGl0ZXJhbChJKSk7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBTLT5nZXROdW1DbG9iYmVycygpOyBJIDwgRTsgKytJKSB7CisgICAgICBTdG10UXVldWUucXVldWUoUy0+Z2V0Q2xvYmJlclN0cmluZ0xpdGVyYWwoSSkpOworICAgIH0KKyAgICAvLyBjaGlsZHJlbigpIGl0ZXJhdGVzIG92ZXIgaW5wdXRFeHByIGFuZCBvdXRwdXRFeHByLgorICB9KQorCitERUZfVFJBVkVSU0VfU1RNVChNU0FzbVN0bXQsIHsKKyAgICAvLyBGSVhNRTogTVMgQXNtIGRvZXNuJ3QgY3VycmVudGx5IHBhcnNlIENvbnN0cmFpbnRzLCBDbG9iYmVycywgZXRjLiAgT25jZQorICAgIC8vIGFkZGVkIHRoaXMgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQuCisgIH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWENhdGNoU3RtdCwgeworICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woUy0+Z2V0RXhjZXB0aW9uRGVjbCgpKSk7CisgICAgLy8gY2hpbGRyZW4oKSBpdGVyYXRlcyBvdmVyIHRoZSBoYW5kbGVyIGJsb2NrLgorICB9KQorCitERUZfVFJBVkVSU0VfU1RNVChEZWNsU3RtdCwgeworICAgIGZvciAoYXV0byAqSSA6IFMtPmRlY2xzKCkpIHsKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woSSkpOworICAgIH0KKyAgICAvLyBTdXBwcmVzcyB0aGUgZGVmYXVsdCBpdGVyYXRpb24gb3ZlciBjaGlsZHJlbigpIGJ5CisgICAgLy8gcmV0dXJuaW5nLiAgSGVyZSdzIHdoeTogQSBEZWNsU3RtdCBsb29rcyBsaWtlICd0eXBlIHZhciBbPQorICAgIC8vIGluaXRpYWxpemVyXScuICBUaGUgZGVjbHMgYWJvdmUgYWxyZWFkeSB0cmF2ZXJzZSBvdmVyIHRoZQorICAgIC8vIGluaXRpYWxpemVycywgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBpdCBhZ2FpbiAod2hpY2gKKyAgICAvLyBjaGlsZHJlbigpIHdvdWxkIGRvKS4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSkKKworCisvLyBUaGVzZSBub24tZXhwciBzdG10cyAobW9zdCBvZiB0aGVtKSwgZG8gbm90IG5lZWQgYW55IGFjdGlvbiBleGNlcHQKKy8vIGl0ZXJhdGluZyBvdmVyIHRoZSBjaGlsZHJlbi4KK0RFRl9UUkFWRVJTRV9TVE1UKEJyZWFrU3RtdCwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoQ1hYVHJ5U3RtdCwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoQ2FzZVN0bXQsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKENvbXBvdW5kU3RtdCwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoQ29udGludWVTdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChEZWZhdWx0U3RtdCwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoRG9TdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChGb3JTdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChHb3RvU3RtdCwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoSWZTdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChJbmRpcmVjdEdvdG9TdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChMYWJlbFN0bXQsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKEF0dHJpYnV0ZWRTdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChOdWxsU3RtdCwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0F0Q2F0Y2hTdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDQXRGaW5hbGx5U3RtdCwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0F0U3luY2hyb25pemVkU3RtdCwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0F0VGhyb3dTdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDQXRUcnlTdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDRm9yQ29sbGVjdGlvblN0bXQsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9iakNBdXRvcmVsZWFzZVBvb2xTdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChDWFhGb3JSYW5nZVN0bXQsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKE1TRGVwZW5kZW50RXhpc3RzU3RtdCwgeworICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoUy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKKyAgICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKFMtPmdldE5hbWVJbmZvKCkpKTsKK30pCitERUZfVFJBVkVSU0VfU1RNVChSZXR1cm5TdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChTd2l0Y2hTdG10LCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChXaGlsZVN0bXQsIHsgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoQ1hYRGVwZW5kZW50U2NvcGVNZW1iZXJFeHByLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhTLT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICAgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0aW9uTmFtZUluZm8oUy0+Z2V0TWVtYmVyTmFtZUluZm8oKSkpOworICAgIGlmIChTLT5oYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcigKKyAgICAgICAgICBTLT5nZXRUZW1wbGF0ZUFyZ3MoKSwgUy0+Z2V0TnVtVGVtcGxhdGVBcmdzKCkpKTsKKyAgICB9CisgIH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKERlY2xSZWZFeHByLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhTLT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICAgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0aW9uTmFtZUluZm8oUy0+Z2V0TmFtZUluZm8oKSkpOworICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2NzSGVscGVyKAorICAgICAgICBTLT5nZXRUZW1wbGF0ZUFyZ3MoKSwgUy0+Z2V0TnVtVGVtcGxhdGVBcmdzKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoRGVwZW5kZW50U2NvcGVEZWNsUmVmRXhwciwgeworICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoUy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKKyAgICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKFMtPmdldE5hbWVJbmZvKCkpKTsKKyAgICBpZiAoUy0+aGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkgeworICAgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvY3NIZWxwZXIoCisgICAgICAgICAgUy0+Z2V0RXhwbGljaXRUZW1wbGF0ZUFyZ3MoKS5nZXRUZW1wbGF0ZUFyZ3MoKSwKKyAgICAgICAgICBTLT5nZXROdW1UZW1wbGF0ZUFyZ3MoKSkpOworICAgIH0KKyAgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoTWVtYmVyRXhwciwgeworICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoUy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKKyAgICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKFMtPmdldE1lbWJlck5hbWVJbmZvKCkpKTsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcigKKyAgICAgICAgUy0+Z2V0VGVtcGxhdGVBcmdzKCksIFMtPmdldE51bVRlbXBsYXRlQXJncygpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKEltcGxpY2l0Q2FzdEV4cHIsIHsKKyAgICAvLyBXZSBkb24ndCB0cmF2ZXJzZSB0aGUgY2FzdCB0eXBlLCBhcyBpdCdzIG5vdCB3cml0dGVuIGluIHRoZQorICAgIC8vIHNvdXJjZSBjb2RlLgorICB9KQorCitERUZfVFJBVkVSU0VfU1RNVChDU3R5bGVDYXN0RXhwciwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZUluZm9Bc1dyaXR0ZW4oKS0+Z2V0VHlwZUxvYygpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWEZ1bmN0aW9uYWxDYXN0RXhwciwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZUluZm9Bc1dyaXR0ZW4oKS0+Z2V0VHlwZUxvYygpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWENvbnN0Q2FzdEV4cHIsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVJbmZvQXNXcml0dGVuKCktPmdldFR5cGVMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfU1RNVChDWFhEeW5hbWljQ2FzdEV4cHIsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVJbmZvQXNXcml0dGVuKCktPmdldFR5cGVMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfU1RNVChDWFhSZWludGVycHJldENhc3RFeHByLCB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRUeXBlSW5mb0FzV3JpdHRlbigpLT5nZXRUeXBlTG9jKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoQ1hYU3RhdGljQ2FzdEV4cHIsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVJbmZvQXNXcml0dGVuKCktPmdldFR5cGVMb2MoKSkpOworICB9KQorCisvLyBJbml0TGlzdEV4cHIgaXMgYSB0cmlja3kgb25lLCBiZWNhdXNlIHdlIHdhbnQgdG8gZG8gYWxsIG91ciB3b3JrIG9uCisvLyB0aGUgc3ludGFjdGljIGZvcm0gb2YgdGhlIGxpc3RleHByLCBidXQgdGhpcyBtZXRob2QgdGFrZXMgdGhlCisvLyBzZW1hbnRpYyBmb3JtIGJ5IGRlZmF1bHQuICBXZSBjYW4ndCB1c2UgdGhlIG1hY3JvIGhlbHBlciBiZWNhdXNlIGl0CisvLyBjYWxscyBXYWxrVXAqKCkgb24gdGhlIHNlbWFudGljIGZvcm0sIGJlZm9yZSBvdXIgY29kZSBjYW4gY29udmVydAorLy8gdG8gdGhlIHN5bnRhY3RpYyBmb3JtLgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlSW5pdExpc3RFeHByKEluaXRMaXN0RXhwciAqUykgeworICBpZiAoSW5pdExpc3RFeHByICpTeW4gPSBTLT5nZXRTeW50YWN0aWNGb3JtKCkpCisgICAgUyA9IFN5bjsKKyAgVFJZX1RPKFdhbGtVcEZyb21Jbml0TGlzdEV4cHIoUykpOworICBTdG10UXVldWVBY3Rpb24gU3RtdFF1ZXVlKCp0aGlzKTsKKyAgLy8gQWxsIHdlIG5lZWQgYXJlIHRoZSBkZWZhdWx0IGFjdGlvbnMuICBGSVhNRTogdXNlIGEgaGVscGVyIGZ1bmN0aW9uLgorICBmb3IgKFN0bXQ6OmNoaWxkX3JhbmdlIHJhbmdlID0gUy0+Y2hpbGRyZW4oKTsgcmFuZ2U7ICsrcmFuZ2UpIHsKKyAgICBTdG10UXVldWUucXVldWUoKnJhbmdlKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gR2VuZXJpY1NlbGVjdGlvbkV4cHIgaXMgYSBzcGVjaWFsIGNhc2UgYmVjYXVzZSB0aGUgdHlwZXMgYW5kIGV4cHJlc3Npb25zCisvLyBhcmUgaW50ZXJsZWF2ZWQuICBXZSBhbHNvIG5lZWQgdG8gd2F0Y2ggb3V0IGZvciBudWxsIHR5cGVzIChkZWZhdWx0CisvLyBnZW5lcmljIGFzc29jaWF0aW9ucykuCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6CitUcmF2ZXJzZUdlbmVyaWNTZWxlY3Rpb25FeHByKEdlbmVyaWNTZWxlY3Rpb25FeHByICpTKSB7CisgIFRSWV9UTyhXYWxrVXBGcm9tR2VuZXJpY1NlbGVjdGlvbkV4cHIoUykpOworICBTdG10UXVldWVBY3Rpb24gU3RtdFF1ZXVlKCp0aGlzKTsKKyAgU3RtdFF1ZXVlLnF1ZXVlKFMtPmdldENvbnRyb2xsaW5nRXhwcigpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBTLT5nZXROdW1Bc3NvY3MoKTsgKytpKSB7CisgICAgaWYgKFR5cGVTb3VyY2VJbmZvICpUUyA9IFMtPmdldEFzc29jVHlwZVNvdXJjZUluZm8oaSkpCisgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRTLT5nZXRUeXBlTG9jKCkpKTsKKyAgICBTdG10UXVldWUucXVldWUoUy0+Z2V0QXNzb2NFeHByKGkpKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUHNldWRvT2JqZWN0RXhwciBpcyBhIHNwZWNpYWwgY2FzZSBiZWNhdXNlIG9mIHRoZSB3aWVyZG5lc3Mgd2l0aAorLy8gc3ludGFjdGljIGV4cHJlc3Npb25zIGFuZCBvcGFxdWUgdmFsdWVzLgordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OgorVHJhdmVyc2VQc2V1ZG9PYmplY3RFeHByKFBzZXVkb09iamVjdEV4cHIgKlMpIHsKKyAgVFJZX1RPKFdhbGtVcEZyb21Qc2V1ZG9PYmplY3RFeHByKFMpKTsKKyAgU3RtdFF1ZXVlQWN0aW9uIFN0bXRRdWV1ZSgqdGhpcyk7CisgIFN0bXRRdWV1ZS5xdWV1ZShTLT5nZXRTeW50YWN0aWNGb3JtKCkpOworICBmb3IgKFBzZXVkb09iamVjdEV4cHI6OnNlbWFudGljc19pdGVyYXRvcgorICAgICAgICAgaSA9IFMtPnNlbWFudGljc19iZWdpbigpLCBlID0gUy0+c2VtYW50aWNzX2VuZCgpOyBpICE9IGU7ICsraSkgeworICAgIEV4cHIgKnN1YiA9ICppOworICAgIGlmIChPcGFxdWVWYWx1ZUV4cHIgKk9WRSA9IGR5bl9jYXN0PE9wYXF1ZVZhbHVlRXhwcj4oc3ViKSkKKyAgICAgIHN1YiA9IE9WRS0+Z2V0U291cmNlRXhwcigpOworICAgIFN0bXRRdWV1ZS5xdWV1ZShzdWIpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitERUZfVFJBVkVSU0VfU1RNVChDWFhTY2FsYXJWYWx1ZUluaXRFeHByLCB7CisgICAgLy8gVGhpcyBpcyBjYWxsZWQgZm9yIGNvZGUgbGlrZSAncmV0dXJuIFQoKScgd2hlcmUgVCBpcyBhIGJ1aWx0LWluCisgICAgLy8gKGkuZS4gbm9uLWNsYXNzKSB0eXBlLgorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWE5ld0V4cHIsIHsKKyAgLy8gVGhlIGNoaWxkLWl0ZXJhdG9yIHdpbGwgcGljayB1cCB0aGUgb3RoZXIgYXJndW1lbnRzLgorICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldEFsbG9jYXRlZFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfU1RNVChPZmZzZXRPZkV4cHIsIHsKKyAgICAvLyBUaGUgY2hpbGQtaXRlcmF0b3Igd2lsbCBwaWNrIHVwIHRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZworICAgIC8vIHRoZSBmaWVsZC4KKyAgICAvLyBGSU1YRTogZm9yIGNvZGUgbGlrZSBvZmZzZXRvZihGb28sIGEuYi5jKSwgc2hvdWxkIHdlIGdldAorICAgIC8vIG1ha2luZyBhIE1lbWJlckV4cHIgY2FsbGJhY2tzIGZvciBGb28uYSwgRm9vLmEuYiwgYW5kIEZvby5hLmIuYz8KKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfU1RNVChVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHIsIHsKKyAgICAvLyBUaGUgY2hpbGQtaXRlcmF0b3Igd2lsbCBwaWNrIHVwIHRoZSBhcmcgaWYgaXQncyBhbiBleHByZXNzaW9uLAorICAgIC8vIGJ1dCBub3QgaWYgaXQncyBhIHR5cGUuCisgICAgaWYgKFMtPmlzQXJndW1lbnRUeXBlKCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldEFyZ3VtZW50VHlwZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CisgIH0pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWFR5cGVpZEV4cHIsIHsKKyAgICAvLyBUaGUgY2hpbGQtaXRlcmF0b3Igd2lsbCBwaWNrIHVwIHRoZSBhcmcgaWYgaXQncyBhbiBleHByZXNzaW9uLAorICAgIC8vIGJ1dCBub3QgaWYgaXQncyBhIHR5cGUuCisgICAgaWYgKFMtPmlzVHlwZU9wZXJhbmQoKSkKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZU9wZXJhbmRTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworICB9KQorCitERUZfVFJBVkVSU0VfU1RNVChDWFhVdWlkb2ZFeHByLCB7CisgICAgLy8gVGhlIGNoaWxkLWl0ZXJhdG9yIHdpbGwgcGljayB1cCB0aGUgYXJnIGlmIGl0J3MgYW4gZXhwcmVzc2lvbiwKKyAgICAvLyBidXQgbm90IGlmIGl0J3MgYSB0eXBlLgorICAgIGlmIChTLT5pc1R5cGVPcGVyYW5kKCkpCisgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVPcGVyYW5kU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoVHlwZVRyYWl0RXhwciwgeworICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gUy0+Z2V0TnVtQXJncygpOyBJICE9IE47ICsrSSkKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldEFyZyhJKS0+Z2V0VHlwZUxvYygpKSk7Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChBcnJheVR5cGVUcmFpdEV4cHIsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFF1ZXJpZWRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoRXhwcmVzc2lvblRyYWl0RXhwciwgeworICAgIFN0bXRRdWV1ZS5xdWV1ZShTLT5nZXRRdWVyaWVkRXhwcmVzc2lvbigpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoVkFBcmdFeHByLCB7CisgICAgLy8gVGhlIGNoaWxkLWl0ZXJhdG9yIHdpbGwgcGljayB1cCB0aGUgZXhwcmVzc2lvbiBhcmd1bWVudC4KKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFdyaXR0ZW5UeXBlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKKyAgfSkKKworREVGX1RSQVZFUlNFX1NUTVQoQ1hYVGVtcG9yYXJ5T2JqZWN0RXhwciwgeworICAgIC8vIFRoaXMgaXMgY2FsbGVkIGZvciBjb2RlIGxpa2UgJ3JldHVybiBUKCknIHdoZXJlIFQgaXMgYSBjbGFzcyB0eXBlLgorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CisgIH0pCisKKy8vIFdhbGsgb25seSB0aGUgdmlzaWJsZSBwYXJ0cyBvZiBsYW1iZGEgZXhwcmVzc2lvbnMuICAKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZUxhbWJkYUV4cHIoTGFtYmRhRXhwciAqUykgeworICBUUllfVE8oV2Fsa1VwRnJvbUxhbWJkYUV4cHIoUykpOworCisgIGZvciAoTGFtYmRhRXhwcjo6Y2FwdHVyZV9pdGVyYXRvciBDID0gUy0+ZXhwbGljaXRfY2FwdHVyZV9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VuZCA9IFMtPmV4cGxpY2l0X2NhcHR1cmVfZW5kKCk7CisgICAgICAgQyAhPSBDRW5kOyArK0MpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VMYW1iZGFDYXB0dXJlKCpDKSk7CisgIH0KKworICBpZiAoUy0+aGFzRXhwbGljaXRQYXJhbWV0ZXJzKCkgfHwgUy0+aGFzRXhwbGljaXRSZXN1bHRUeXBlKCkpIHsKKyAgICBUeXBlTG9jIFRMID0gUy0+Z2V0Q2FsbE9wZXJhdG9yKCktPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKTsKKyAgICBpZiAoUy0+aGFzRXhwbGljaXRQYXJhbWV0ZXJzKCkgJiYgUy0+aGFzRXhwbGljaXRSZXN1bHRUeXBlKCkpIHsKKyAgICAgIC8vIFZpc2l0IHRoZSB3aG9sZSB0eXBlLgorICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTCkpOworICAgIH0gZWxzZSBpZiAoRnVuY3Rpb25Qcm90b1R5cGVMb2MgUHJvdG8gPSBUTC5nZXRBczxGdW5jdGlvblByb3RvVHlwZUxvYz4oKSkgeworICAgICAgaWYgKFMtPmhhc0V4cGxpY2l0UGFyYW1ldGVycygpKSB7CisgICAgICAgIC8vIFZpc2l0IHBhcmFtZXRlcnMuCisgICAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBQcm90by5nZXROdW1QYXJhbXMoKTsgSSAhPSBOOyArK0kpIHsKKyAgICAgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKFByb3RvLmdldFBhcmFtKEkpKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUHJvdG8uZ2V0UmV0dXJuTG9jKCkpKTsKKyAgICAgIH0gICAgICAgIAorICAgIH0KKyAgfQorCisgIFN0bXRRdWV1ZUFjdGlvbiBTdG10UXVldWUoKnRoaXMpOworICBTdG10UXVldWUucXVldWUoUy0+Z2V0Qm9keSgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWFVucmVzb2x2ZWRDb25zdHJ1Y3RFeHByLCB7CisgICAgLy8gVGhpcyBpcyBjYWxsZWQgZm9yIGNvZGUgbGlrZSAnVCgpJywgd2hlcmUgVCBpcyBhIHRlbXBsYXRlIGFyZ3VtZW50LgorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CisgIH0pCisKKy8vIFRoZXNlIGV4cHJlc3Npb25zIGFsbCBtaWdodCB0YWtlIGV4cGxpY2l0IHRlbXBsYXRlIGFyZ3VtZW50cy4KKy8vIFdlIHRyYXZlcnNlIHRob3NlIGlmIHNvLiAgRklYTUU6IGltcGxlbWVudCB0aGVzZS4KK0RFRl9UUkFWRVJTRV9TVE1UKENYWENvbnN0cnVjdEV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKENhbGxFeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChDWFhNZW1iZXJDYWxsRXhwciwgeyB9KQorCisvLyBUaGVzZSBleHBycyAobW9zdCBvZiB0aGVtKSwgZG8gbm90IG5lZWQgYW55IGFjdGlvbiBleGNlcHQgaXRlcmF0aW5nCisvLyBvdmVyIHRoZSBjaGlsZHJlbi4KK0RFRl9UUkFWRVJTRV9TVE1UKEFkZHJMYWJlbEV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKEFycmF5U3Vic2NyaXB0RXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoQmxvY2tFeHByLCB7CisgIFRSWV9UTyhUcmF2ZXJzZURlY2woUy0+Z2V0QmxvY2tEZWNsKCkpKTsKKyAgcmV0dXJuIHRydWU7IC8vIG5vIGNoaWxkIHN0YXRlbWVudHMgdG8gbG9vcCB0aHJvdWdoLgorfSkKK0RFRl9UUkFWRVJTRV9TVE1UKENob29zZUV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKENvbXBvdW5kTGl0ZXJhbEV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKENYWEJpbmRUZW1wb3JhcnlFeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChDWFhCb29sTGl0ZXJhbEV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKENYWERlZmF1bHRBcmdFeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChDWFhEZWZhdWx0SW5pdEV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKENYWERlbGV0ZUV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKEV4cHJXaXRoQ2xlYW51cHMsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKENYWE51bGxQdHJMaXRlcmFsRXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoQ1hYU3RkSW5pdGlhbGl6ZXJMaXN0RXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoQ1hYUHNldWRvRGVzdHJ1Y3RvckV4cHIsIHsKKyAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhTLT5nZXRRdWFsaWZpZXJMb2MoKSkpOworICBpZiAoVHlwZVNvdXJjZUluZm8gKlNjb3BlSW5mbyA9IFMtPmdldFNjb3BlVHlwZUluZm8oKSkKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFNjb3BlSW5mby0+Z2V0VHlwZUxvYygpKSk7CisgIGlmIChUeXBlU291cmNlSW5mbyAqRGVzdHJveWVkVHlwZUluZm8gPSBTLT5nZXREZXN0cm95ZWRUeXBlSW5mbygpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRGVzdHJveWVkVHlwZUluZm8tPmdldFR5cGVMb2MoKSkpOworfSkKK0RFRl9UUkFWRVJTRV9TVE1UKENYWFRoaXNFeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChDWFhUaHJvd0V4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKFVzZXJEZWZpbmVkTGl0ZXJhbCwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoRGVzaWduYXRlZEluaXRFeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChFeHRWZWN0b3JFbGVtZW50RXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoR05VTnVsbEV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKEltcGxpY2l0VmFsdWVJbml0RXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0Jvb2xMaXRlcmFsRXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0VuY29kZUV4cHIsIHsKKyAgaWYgKFR5cGVTb3VyY2VJbmZvICpUSW5mbyA9IFMtPmdldEVuY29kZWRUeXBlU291cmNlSW5mbygpKQorICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEluZm8tPmdldFR5cGVMb2MoKSkpOworfSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9iakNJc2FFeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDSXZhclJlZkV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9iakNNZXNzYWdlRXhwciwgeworICBpZiAoVHlwZVNvdXJjZUluZm8gKlRJbmZvID0gUy0+Z2V0Q2xhc3NSZWNlaXZlclR5cGVJbmZvKCkpCisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUSW5mby0+Z2V0VHlwZUxvYygpKSk7Cit9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ1Byb3BlcnR5UmVmRXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ1N1YnNjcmlwdFJlZkV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9iakNQcm90b2NvbEV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9iakNTZWxlY3RvckV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9iakNJbmRpcmVjdENvcHlSZXN0b3JlRXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0JyaWRnZWRDYXN0RXhwciwgeworICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVJbmZvQXNXcml0dGVuKCktPmdldFR5cGVMb2MoKSkpOworfSkKK0RFRl9UUkFWRVJTRV9TVE1UKFBhcmVuRXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoUGFyZW5MaXN0RXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoUHJlZGVmaW5lZEV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKFNodWZmbGVWZWN0b3JFeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChDb252ZXJ0VmVjdG9yRXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoU3RtdEV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKFVucmVzb2x2ZWRMb29rdXBFeHByLCB7CisgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoUy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKKyAgaWYgKFMtPmhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcihTLT5nZXRUZW1wbGF0ZUFyZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLT5nZXROdW1UZW1wbGF0ZUFyZ3MoKSkpOworICB9Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChVbnJlc29sdmVkTWVtYmVyRXhwciwgeworICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKFMtPmdldFF1YWxpZmllckxvYygpKSk7CisgIGlmIChTLT5oYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvY3NIZWxwZXIoUy0+Z2V0VGVtcGxhdGVBcmdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy0+Z2V0TnVtVGVtcGxhdGVBcmdzKCkpKTsKKyAgfQorfSkKKworREVGX1RSQVZFUlNFX1NUTVQoTVNQcm9wZXJ0eVJlZkV4cHIsIHt9KQorREVGX1RSQVZFUlNFX1NUTVQoU0VIVHJ5U3RtdCwge30pCitERUZfVFJBVkVSU0VfU1RNVChTRUhFeGNlcHRTdG10LCB7fSkKK0RFRl9UUkFWRVJTRV9TVE1UKFNFSEZpbmFsbHlTdG10LHt9KQorREVGX1RSQVZFUlNFX1NUTVQoQ2FwdHVyZWRTdG10LCB7CisgIFRSWV9UTyhUcmF2ZXJzZURlY2woUy0+Z2V0Q2FwdHVyZWREZWNsKCkpKTsKK30pCisKK0RFRl9UUkFWRVJTRV9TVE1UKENYWE9wZXJhdG9yQ2FsbEV4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9wYXF1ZVZhbHVlRXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoQ1VEQUtlcm5lbENhbGxFeHByLCB7IH0pCisKKy8vIFRoZXNlIG9wZXJhdG9ycyAoYWxsIG9mIHRoZW0pIGRvIG5vdCBuZWVkIGFueSBhY3Rpb24gZXhjZXB0CisvLyBpdGVyYXRpbmcgb3ZlciB0aGUgY2hpbGRyZW4uCitERUZfVFJBVkVSU0VfU1RNVChCaW5hcnlDb25kaXRpb25hbE9wZXJhdG9yLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChDb25kaXRpb25hbE9wZXJhdG9yLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChVbmFyeU9wZXJhdG9yLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChCaW5hcnlPcGVyYXRvciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoQ29tcG91bmRBc3NpZ25PcGVyYXRvciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoQ1hYTm9leGNlcHRFeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChQYWNrRXhwYW5zaW9uRXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoU2l6ZU9mUGFja0V4cHIsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKFN1YnN0Tm9uVHlwZVRlbXBsYXRlUGFybVBhY2tFeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChTdWJzdE5vblR5cGVUZW1wbGF0ZVBhcm1FeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChGdW5jdGlvblBhcm1QYWNrRXhwciwgeyB9KQorREVGX1RSQVZFUlNFX1NUTVQoTWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChBdG9taWNFeHByLCB7IH0pCisKKy8vIFRoZXNlIGxpdGVyYWxzIChhbGwgb2YgdGhlbSkgZG8gbm90IG5lZWQgYW55IGFjdGlvbi4KK0RFRl9UUkFWRVJTRV9TVE1UKEludGVnZXJMaXRlcmFsLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChDaGFyYWN0ZXJMaXRlcmFsLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChGbG9hdGluZ0xpdGVyYWwsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKEltYWdpbmFyeUxpdGVyYWwsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKFN0cmluZ0xpdGVyYWwsIHsgfSkKK0RFRl9UUkFWRVJTRV9TVE1UKE9iakNTdHJpbmdMaXRlcmFsLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDQm94ZWRFeHByLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDQXJyYXlMaXRlcmFsLCB7IH0pCitERUZfVFJBVkVSU0VfU1RNVChPYmpDRGljdGlvbmFyeUxpdGVyYWwsIHsgfSkKKyAgCisvLyBUcmF2ZXJzZSBPcGVuQ0w6IEFzVHlwZSwgQ29udmVydC4KK0RFRl9UUkFWRVJTRV9TVE1UKEFzVHlwZUV4cHIsIHsgfSkKKworLy8gT3Blbk1QIGRpcmVjdGl2ZXMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlICpTKSB7CisgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzID0gUy0+Y2xhdXNlcygpOworICBmb3IgKEFycmF5UmVmPE9NUENsYXVzZSAqPjo6aXRlcmF0b3IgSSA9IENsYXVzZXMuYmVnaW4oKSwgRSA9IENsYXVzZXMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgaWYgKCFUcmF2ZXJzZU9NUENsYXVzZSgqSSkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFBhcmFsbGVsRGlyZWN0aXZlLCB7CisgIGlmICghVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKSByZXR1cm4gZmFsc2U7Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBTaW1kRGlyZWN0aXZlLCB7CisgIGlmICghVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKSByZXR1cm4gZmFsc2U7Cit9KQorCisvLyBPcGVuTVAgY2xhdXNlcy4KK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZU9NUENsYXVzZShPTVBDbGF1c2UgKkMpIHsKKyAgaWYgKCFDKSByZXR1cm4gdHJ1ZTsKKyAgc3dpdGNoIChDLT5nZXRDbGF1c2VLaW5kKCkpIHsKKyNkZWZpbmUgT1BFTk1QX0NMQVVTRShOYW1lLCBDbGFzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBPTVBDXyMjTmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlZpc2l0IyNDbGFzcyhzdGF0aWNfY2FzdDxDbGFzcyo+KEMpKTsKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5kZWYiCisgIGRlZmF1bHQ6IGJyZWFrOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBJZkNsYXVzZShPTVBJZkNsYXVzZSAqQykgeworICBUcmF2ZXJzZVN0bXQoQy0+Z2V0Q29uZGl0aW9uKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QTnVtVGhyZWFkc0NsYXVzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBOdW1UaHJlYWRzQ2xhdXNlICpDKSB7CisgIFRyYXZlcnNlU3RtdChDLT5nZXROdW1UaHJlYWRzKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QU2FmZWxlbkNsYXVzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QU2FmZWxlbkNsYXVzZSAqQykgeworICBUcmF2ZXJzZVN0bXQoQy0+Z2V0U2FmZWxlbigpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUERlZmF1bHRDbGF1c2UoT01QRGVmYXVsdENsYXVzZSAqQykgeworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUENsYXVzZUxpc3QoVCAqTm9kZSkgeworICBmb3IgKGF1dG8gKkkgOiBOb2RlLT52YXJsaXN0cygpKQorICAgIFRyYXZlcnNlU3RtdChJKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QUHJpdmF0ZUNsYXVzZShPTVBQcml2YXRlQ2xhdXNlICpDKSB7CisgIFZpc2l0T01QQ2xhdXNlTGlzdChDKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBGaXJzdHByaXZhdGVDbGF1c2UgKkMpIHsKKyAgVmlzaXRPTVBDbGF1c2VMaXN0KEMpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QU2hhcmVkQ2xhdXNlKE9NUFNoYXJlZENsYXVzZSAqQykgeworICBWaXNpdE9NUENsYXVzZUxpc3QoQyk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBEYXRhUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBDb3B5aW5DbGF1c2UoT01QQ29weWluQ2xhdXNlICpDKSB7CisgIFZpc2l0T01QQ2xhdXNlTGlzdChDKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZJWE1FOiBsb29rIGF0IHRoZSBmb2xsb3dpbmcgdHJpY2t5LXNlZW1pbmcgZXhwcnMgdG8gc2VlIGlmIHdlCisvLyBuZWVkIHRvIHJlY3Vyc2Ugb24gYW55dGhpbmcuICBUaGVzZSBhcmUgb25lcyB0aGF0IGhhdmUgbWV0aG9kcworLy8gcmV0dXJuaW5nIGRlY2xzIG9yIHF1YWx0eXBlcyBvciBuZXN0ZWRuYW1lc3BlY2lmaWVyIC0tIHRob3VnaCBJJ20KKy8vIG5vdCBzdXJlIGlmIHRoZXkgb3duIHRoZW0gLS0gb3IganVzdCBzZWVtZWQgdmVyeSBjb21wbGljYXRlZCwgb3IKKy8vIGhhZCBsb3RzIG9mIHN1Yi10eXBlcyB0byBleHBsb3JlLgorLy8KKy8vIFZpc2l0T3ZlcmxvYWRFeHByIGFuZCBpdHMgY2hpbGRyZW46IHJlY3Vyc2Ugb24gdGVtcGxhdGUgYXJncz8gZXRjPworCisvLyBGSVhNRTogZ28gdGhyb3VnaCBhbGwgdGhlIHN0bXRzIGFuZCBleHBycyBhZ2FpbiwgYW5kIHNlZSB3aGljaCBvZiB0aGVtCisvLyBjcmVhdGUgbmV3IHR5cGVzLCBhbmQgcmVjdXJzZSBvbiB0aGUgdHlwZXMgKFR5cGVMb2NzPykgb2YgdGhvc2UuCisvLyBDYW5kaWRhdGVzOgorLy8KKy8vICAgIGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL2NsYXNzY2xhbmdfMV8xQ1hYVHlwZWlkRXhwci5odG1sCisvLyAgICBodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwci5odG1sCisvLyAgICBodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMVR5cGVzQ29tcGF0aWJsZUV4cHIuaHRtbAorLy8gICAgRXZlcnkgY2xhc3MgdGhhdCBoYXMgZ2V0UXVhbGlmaWVyLgorCisjdW5kZWYgREVGX1RSQVZFUlNFX1NUTVQKKworI3VuZGVmIFRSWV9UTworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfTElCQ0xBTkdfUkVDVVJTSVZFQVNUVklTSVRPUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsLmgKaW5kZXggMjQ0YTdiOC4uNTI2MTg3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2wuaApAQCAtMTEwLDcgKzExMCw3IEBACiAgIERlY2xhcmF0aW9uTmFtZSBOYW1lOwogCiBwcml2YXRlOgotICBOYW1lZERlY2wgKmdldFVuZGVybHlpbmdEZWNsSW1wbCgpOworICBOYW1lZERlY2wgKmdldFVuZGVybHlpbmdEZWNsSW1wbCgpIExMVk1fUkVBRE9OTFk7CiAKIHByb3RlY3RlZDoKICAgTmFtZWREZWNsKEtpbmQgREssIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTCwgRGVjbGFyYXRpb25OYW1lIE4pCkBAIC0xNjEsOSArMTYxLDggQEAKICAgdm9pZCBwcmludFF1YWxpZmllZE5hbWUocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKICAgdm9pZCBwcmludFF1YWxpZmllZE5hbWUocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKIAotICAvLyBGSVhNRTogUmVtb3ZlIHN0cmluZyB2ZXJzaW9ucy4KKyAgLy8gRklYTUU6IFJlbW92ZSBzdHJpbmcgdmVyc2lvbi4KICAgc3RkOjpzdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZUFzU3RyaW5nKCkgY29uc3Q7Ci0gIHN0ZDo6c3RyaW5nIGdldFF1YWxpZmllZE5hbWVBc1N0cmluZyhjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdDsKIAogICAvLy8gZ2V0TmFtZUZvckRpYWdub3N0aWMgLSBBcHBlbmRzIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhpcwogICAvLy8gZGVjbGFyYXRpb24gaW50byB0aGUgZ2l2ZW4gc3RyZWFtLgpAQCAtMjU5LDYgKzI1OCwxNiBAQAogICAvLy8gY2hlY2tpbmcuIFNob3VsZCBhbHdheXMgcmV0dXJuIHRydWUuCiAgIGJvb2wgaXNMaW5rYWdlVmFsaWQoKSBjb25zdDsKIAorICAvLy8gXGJyaWVmIFRydWUgaWYgc29tZXRoaW5nIGhhcyByZXF1aXJlZCB1cyB0byBjb21wdXRlIHRoZSBsaW5rYWdlCisgIC8vLyBvZiB0aGlzIGRlY2xhcmF0aW9uLgorICAvLy8KKyAgLy8vIExhbmd1YWdlIGZlYXR1cmVzIHdoaWNoIGNhbiByZXRyb2FjdGl2ZWx5IGNoYW5nZSBsaW5rYWdlIChsaWtlIGEKKyAgLy8vIHR5cGVkZWYgbmFtZSBmb3IgbGlua2FnZSBwdXJwb3NlcykgbWF5IG5lZWQgdG8gY29uc2lkZXIgdGhpcywKKyAgLy8vIGJ1dCBob3BlZnVsbHkgb25seSBpbiB0cmFuc2l0b3J5IHdheXMgZHVyaW5nIHBhcnNpbmcuCisgIGJvb2wgaGFzTGlua2FnZUJlZW5Db21wdXRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzQ2FjaGVkTGlua2FnZSgpOworICB9CisKICAgLy8vIFxicmllZiBMb29rcyB0aHJvdWdoIFVzaW5nRGVjbHMgYW5kIE9iakNDb21wYXRpYmxlQWxpYXNEZWNscyBmb3IKICAgLy8vIHRoZSB1bmRlcmx5aW5nIG5hbWVkIGRlY2wuCiAgIE5hbWVkRGVjbCAqZ2V0VW5kZXJseWluZ0RlY2woKSB7CkBAIC0yOTUsNyArMzA0LDcgQEAKIC8vLyBsb2NhdGlvbiBvZiB0aGUgc3RhdGVtZW50LiAgRm9yIEdOVSBsb2NhbCBsYWJlbHMgKF9fbGFiZWxfXyksIHRoZSBkZWNsCiAvLy8gbG9jYXRpb24gaXMgd2hlcmUgdGhlIF9fbGFiZWxfXyBpcy4KIGNsYXNzIExhYmVsRGVjbCA6IHB1YmxpYyBOYW1lZERlY2wgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAgIExhYmVsU3RtdCAqVGhlU3RtdDsKICAgLy8vIExvY1N0YXJ0IC0gRm9yIG5vcm1hbCBsYWJlbHMsIHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIG1haW4gZGVjbGFyYXRpb24KICAgLy8vIGxhYmVsLCBpLmUuLCB0aGUgbG9jYXRpb24gb2YgdGhlIGlkZW50aWZpZXI7IGZvciBHTlUgbG9jYWwgbGFiZWxzLApAQCAtMzIwLDcgKzMyOSw3IEBACiAgIGJvb2wgaXNHbnVMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIExvY1N0YXJ0ICE9IGdldExvY2F0aW9uKCk7IH0KICAgdm9pZCBzZXRMb2NTdGFydChTb3VyY2VMb2NhdGlvbiBMKSB7IExvY1N0YXJ0ID0gTDsgfQogCi0gIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CiAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKExvY1N0YXJ0LCBnZXRMb2NhdGlvbigpKTsKICAgfQogCkBAIC0zMzMsOCArMzQyLDYgQEAKIGNsYXNzIE5hbWVzcGFjZURlY2wgOiBwdWJsaWMgTmFtZWREZWNsLCBwdWJsaWMgRGVjbENvbnRleHQsIAogICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBSZWRlY2xhcmFibGU8TmFtZXNwYWNlRGVjbD4gCiB7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKLQogICAvLy8gTG9jU3RhcnQgLSBUaGUgc3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIHNvdXJjZSByYW5nZSwgcG9pbnRpbmcKICAgLy8vIHRvIGVpdGhlciB0aGUgbmFtZXNwYWNlIG9yIHRoZSBpbmxpbmUga2V5d29yZC4KICAgU291cmNlTG9jYXRpb24gTG9jU3RhcnQ7CkBAIC0zNTAsMTggKzM1NywxMiBAQAogICBOYW1lc3BhY2VEZWNsKERlY2xDb250ZXh0ICpEQywgYm9vbCBJbmxpbmUsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAogICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsCiAgICAgICAgICAgICAgICAgTmFtZXNwYWNlRGVjbCAqUHJldkRlY2wpOwotICAKKwogICB0eXBlZGVmIFJlZGVjbGFyYWJsZTxOYW1lc3BhY2VEZWNsPiByZWRlY2xhcmFibGVfYmFzZTsKLSAgdmlydHVhbCBOYW1lc3BhY2VEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbigpIHsKLSAgICByZXR1cm4gUmVkZWNsTGluay5nZXROZXh0KCk7Ci0gIH0KLSAgdmlydHVhbCBOYW1lc3BhY2VEZWNsICpnZXRQcmV2aW91c0RlY2xJbXBsKCkgewotICAgIHJldHVybiBnZXRQcmV2aW91c0RlY2woKTsKLSAgfQotICB2aXJ0dWFsIE5hbWVzcGFjZURlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIHsKLSAgICByZXR1cm4gZ2V0TW9zdFJlY2VudERlY2woKTsKLSAgfQotICAKKyAgTmFtZXNwYWNlRGVjbCAqZ2V0TmV4dFJlZGVjbGFyYXRpb24oKSBvdmVycmlkZTsKKyAgTmFtZXNwYWNlRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIG92ZXJyaWRlOworICBOYW1lc3BhY2VEZWNsICpnZXRNb3N0UmVjZW50RGVjbEltcGwoKSBvdmVycmlkZTsKKwogcHVibGljOgogICBzdGF0aWMgTmFtZXNwYWNlRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElubGluZSwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCkBAIC0zNzAsOSArMzcxLDExIEBACiAKICAgc3RhdGljIE5hbWVzcGFjZURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CiAKKyAgdHlwZWRlZiByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX3JhbmdlIHJlZGVjbF9yYW5nZTsKICAgdHlwZWRlZiByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX2l0ZXJhdG9yIHJlZGVjbF9pdGVyYXRvcjsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfYmVnaW47CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2VuZDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHM7CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRQcmV2aW91c0RlY2w7CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRNb3N0UmVjZW50RGVjbDsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmlzRmlyc3REZWNsOwpAQCAtNDMyLDE0ICs0MzUsMTQgQEAKICAgfQogCiAgIC8vLyBSZXRyaWV2ZXMgdGhlIGNhbm9uaWNhbCBkZWNsYXJhdGlvbiBvZiB0aGlzIG5hbWVzcGFjZS4KLSAgTmFtZXNwYWNlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIHsKKyAgTmFtZXNwYWNlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0T3JpZ2luYWxOYW1lc3BhY2UoKTsKICAgfQogICBjb25zdCBOYW1lc3BhY2VEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgewogICAgIHJldHVybiBnZXRPcmlnaW5hbE5hbWVzcGFjZSgpOwogICB9Ci0gIAotICB2aXJ0dWFsIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKICAgICByZXR1cm4gU291cmNlUmFuZ2UoTG9jU3RhcnQsIFJCcmFjZUxvYyk7CiAgIH0KIApAQCAtNDY2LDcgKzQ2OSw3IEBACiAvLy8gYW4gbHZhbHVlKSBhIGZ1bmN0aW9uIChpbiB3aGljaCBjYXNlIGl0IGlzIGEgZnVuY3Rpb24gZGVzaWduYXRvcikgb3IKIC8vLyBhbiBlbnVtIGNvbnN0YW50LgogY2xhc3MgVmFsdWVEZWNsIDogcHVibGljIE5hbWVkRGVjbCB7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKICAgUXVhbFR5cGUgRGVjbFR5cGU7CiAKIHByb3RlY3RlZDoKQEAgLTU2Nyw3ICs1NzAsNyBAQAogICAvLy8gcmFuZ2UgdGFraW5nIGludG8gYWNjb3VudCBhbnkgb3V0ZXIgdGVtcGxhdGUgZGVjbGFyYXRpb25zLgogICBTb3VyY2VMb2NhdGlvbiBnZXRPdXRlckxvY1N0YXJ0KCkgY29uc3Q7CiAKLSAgdmlydHVhbCBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWTsKICAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKICAgICByZXR1cm4gZ2V0T3V0ZXJMb2NTdGFydCgpOwogICB9CkBAIC03NjksMTggKzc3MiwyMCBAQAogICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbywgU3RvcmFnZUNsYXNzIFNDKTsKIAogICB0eXBlZGVmIFJlZGVjbGFyYWJsZTxWYXJEZWNsPiByZWRlY2xhcmFibGVfYmFzZTsKLSAgdmlydHVhbCBWYXJEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbigpIHsgcmV0dXJuIFJlZGVjbExpbmsuZ2V0TmV4dCgpOyB9Ci0gIHZpcnR1YWwgVmFyRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIHsKKyAgVmFyRGVjbCAqZ2V0TmV4dFJlZGVjbGFyYXRpb24oKSBvdmVycmlkZSB7IHJldHVybiBSZWRlY2xMaW5rLmdldE5leHQoKTsgfQorICBWYXJEZWNsICpnZXRQcmV2aW91c0RlY2xJbXBsKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBnZXRQcmV2aW91c0RlY2woKTsKICAgfQotICB2aXJ0dWFsIFZhckRlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIHsKKyAgVmFyRGVjbCAqZ2V0TW9zdFJlY2VudERlY2xJbXBsKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBnZXRNb3N0UmVjZW50RGVjbCgpOwogICB9CiAKIHB1YmxpYzoKKyAgdHlwZWRlZiByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX3JhbmdlIHJlZGVjbF9yYW5nZTsKICAgdHlwZWRlZiByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX2l0ZXJhdG9yIHJlZGVjbF9pdGVyYXRvcjsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfYmVnaW47CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2VuZDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHM7CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRQcmV2aW91c0RlY2w7CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRNb3N0UmVjZW50RGVjbDsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmlzRmlyc3REZWNsOwpAQCAtNzkxLDggKzc5Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUNsYXNzIFMpOwogCiAgIHN0YXRpYyBWYXJEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOwotICAKLSAgdmlydHVhbCBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOwogCiAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc3RvcmFnZSBjbGFzcyBhcyB3cml0dGVuIGluIHRoZSBzb3VyY2UuIEZvciB0aGUKICAgLy8vIGNvbXB1dGVkIGxpbmthZ2Ugb2Ygc3ltYm9sLCBzZWUgZ2V0TGlua2FnZS4KQEAgLTkxMyw3ICs5MTgsNyBAQAogICAgIHJldHVybiBnZXRLaW5kKCkgIT0gRGVjbDo6UGFybVZhciAmJiBnZXREZWNsQ29udGV4dCgpLT5pc1JlY29yZCgpOwogICB9CiAKLSAgdmlydHVhbCBWYXJEZWNsICpnZXRDYW5vbmljYWxEZWNsKCk7CisgIFZhckRlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZTsKICAgY29uc3QgVmFyRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsKICAgICByZXR1cm4gY29uc3RfY2FzdDxWYXJEZWNsKj4odGhpcyktPmdldENhbm9uaWNhbERlY2woKTsKICAgfQpAQCAtOTYwLDcgKzk2NSw3IEBACiAKICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIG9yIHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBhbiBvdXQtb2YtbGluZQogICAvLy8gZGVmaW5pdGlvbiBvZiBhIHN0YXRpYyBkYXRhIG1lbWJlci4KLSAgdmlydHVhbCBib29sIGlzT3V0T2ZMaW5lKCkgY29uc3Q7CisgIGJvb2wgaXNPdXRPZkxpbmUoKSBjb25zdCBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIElmIHRoaXMgaXMgYSBzdGF0aWMgZGF0YSBtZW1iZXIsIGZpbmQgaXRzIG91dC1vZi1saW5lIGRlZmluaXRpb24uCiAgIFZhckRlY2wgKmdldE91dE9mTGluZURlZmluaXRpb24oKTsKQEAgLTEyMDgsNyArMTIxMyw3IEBACiB9OwogCiBjbGFzcyBJbXBsaWNpdFBhcmFtRGVjbCA6IHB1YmxpYyBWYXJEZWNsIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogcHVibGljOgogICBzdGF0aWMgSW1wbGljaXRQYXJhbURlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsCkBAIC0xMjU0LDggKzEyNTksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlQ2xhc3MgUywgRXhwciAqRGVmQXJnKTsKIAogICBzdGF0aWMgUGFybVZhckRlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7Ci0gIAotICB2aXJ0dWFsIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFk7CiAKICAgdm9pZCBzZXRPYmpDTWV0aG9kU2NvcGVJbmZvKHVuc2lnbmVkIHBhcmFtZXRlckluZGV4KSB7CiAgICAgUGFybVZhckRlY2xCaXRzLklzT2JqQ01ldGhvZFBhcmFtID0gdHJ1ZTsKQEAgLTE1NTksMTggKzE1NjQsMjAgQEAKICAgICAgIEROTG9jKE5hbWVJbmZvLmdldEluZm8oKSkge30KIAogICB0eXBlZGVmIFJlZGVjbGFyYWJsZTxGdW5jdGlvbkRlY2w+IHJlZGVjbGFyYWJsZV9iYXNlOwotICB2aXJ0dWFsIEZ1bmN0aW9uRGVjbCAqZ2V0TmV4dFJlZGVjbGFyYXRpb24oKSB7IHJldHVybiBSZWRlY2xMaW5rLmdldE5leHQoKTsgfQotICB2aXJ0dWFsIEZ1bmN0aW9uRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIHsKKyAgRnVuY3Rpb25EZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbigpIG92ZXJyaWRlIHsgcmV0dXJuIFJlZGVjbExpbmsuZ2V0TmV4dCgpOyB9CisgIEZ1bmN0aW9uRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0UHJldmlvdXNEZWNsKCk7CiAgIH0KLSAgdmlydHVhbCBGdW5jdGlvbkRlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIHsKKyAgRnVuY3Rpb25EZWNsICpnZXRNb3N0UmVjZW50RGVjbEltcGwoKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGdldE1vc3RSZWNlbnREZWNsKCk7CiAgIH0KIAogcHVibGljOgorICB0eXBlZGVmIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfcmFuZ2UgcmVkZWNsX3JhbmdlOwogICB0eXBlZGVmIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfaXRlcmF0b3IgcmVkZWNsX2l0ZXJhdG9yOwogICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsc19iZWdpbjsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfZW5kOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsczsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldFByZXZpb3VzRGVjbDsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldE1vc3RSZWNlbnREZWNsOwogICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6aXNGaXJzdERlY2w7CkBAIC0xNjA1LDEzICsxNjEyLDEyIEBACiAgICAgcmV0dXJuIERlY2xhcmF0aW9uTmFtZUluZm8oZ2V0RGVjbE5hbWUoKSwgZ2V0TG9jYXRpb24oKSwgRE5Mb2MpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGdldE5hbWVGb3JEaWFnbm9zdGljKHJhd19vc3RyZWFtICZPUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFF1YWxpZmllZCkgY29uc3Q7CisgIHZvaWQgZ2V0TmFtZUZvckRpYWdub3N0aWMocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUXVhbGlmaWVkKSBjb25zdCBvdmVycmlkZTsKIAogICB2b2lkIHNldFJhbmdlRW5kKFNvdXJjZUxvY2F0aW9uIEUpIHsgRW5kUmFuZ2VMb2MgPSBFOyB9CiAKLSAgdmlydHVhbCBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWTsKIAogICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaGFzIGEgYm9keSAoZGVmaW5pdGlvbikuIFRoZQogICAvLy8gZnVuY3Rpb24gYm9keSBtaWdodCBiZSBpbiBhbnkgb2YgdGhlIChyZS0pZGVjbGFyYXRpb25zIG9mIHRoaXMKQEAgLTE2MjAsNyArMTYyNiw3IEBACiAgIC8vLyBjb250YWluaW5nIHRoZSBib2R5IChpZiB0aGVyZSBpcyBvbmUpLgogICBib29sIGhhc0JvZHkoY29uc3QgRnVuY3Rpb25EZWNsIComRGVmaW5pdGlvbikgY29uc3Q7CiAKLSAgdmlydHVhbCBib29sIGhhc0JvZHkoKSBjb25zdCB7CisgIGJvb2wgaGFzQm9keSgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBjb25zdCBGdW5jdGlvbkRlY2wqIERlZmluaXRpb247CiAgICAgcmV0dXJuIGhhc0JvZHkoRGVmaW5pdGlvbik7CiAgIH0KQEAgLTE2NDgsNyArMTY1NCw3IEBACiAgIC8vLyB1bm5lY2Vzc2FyeSBBU1QgZGUtc2VyaWFsaXphdGlvbiBvZiB0aGUgYm9keS4KICAgU3RtdCAqZ2V0Qm9keShjb25zdCBGdW5jdGlvbkRlY2wgKiZEZWZpbml0aW9uKSBjb25zdDsKIAotICB2aXJ0dWFsIFN0bXQgKmdldEJvZHkoKSBjb25zdCB7CisgICBTdG10ICpnZXRCb2R5KCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCogRGVmaW5pdGlvbjsKICAgICByZXR1cm4gZ2V0Qm9keShEZWZpbml0aW9uKTsKICAgfQpAQCAtMTgyOCw3ICsxODM0LDcgQEAKICAgdm9pZCBzZXRQcmV2aW91c0RlY2xhcmF0aW9uKEZ1bmN0aW9uRGVjbCAqIFByZXZEZWNsKTsKIAogICB2aXJ0dWFsIGNvbnN0IEZ1bmN0aW9uRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0OwotICB2aXJ0dWFsIEZ1bmN0aW9uRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpOworICBGdW5jdGlvbkRlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZTsKIAogICB1bnNpZ25lZCBnZXRCdWlsdGluSUQoKSBjb25zdDsKIApAQCAtMTgzNiwxMiArMTg0MiwyNCBAQAogICB1bnNpZ25lZCBwYXJhbV9zaXplKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtUGFyYW1zKCk7IH0KICAgdHlwZWRlZiBQYXJtVmFyRGVjbCAqKnBhcmFtX2l0ZXJhdG9yOwogICB0eXBlZGVmIFBhcm1WYXJEZWNsICogY29uc3QgKnBhcmFtX2NvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHBhcmFtX2l0ZXJhdG9yPiBwYXJhbV9yYW5nZTsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxwYXJhbV9jb25zdF9pdGVyYXRvcj4gcGFyYW1fY29uc3RfcmFuZ2U7CiAKLSAgcGFyYW1faXRlcmF0b3IgcGFyYW1fYmVnaW4oKSB7IHJldHVybiBQYXJhbUluZm87IH0KLSAgcGFyYW1faXRlcmF0b3IgcGFyYW1fZW5kKCkgICB7IHJldHVybiBQYXJhbUluZm8rcGFyYW1fc2l6ZSgpOyB9CisgIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgeyByZXR1cm4gcGFyYW1faXRlcmF0b3IoUGFyYW1JbmZvKTsgfQorICBwYXJhbV9pdGVyYXRvciBwYXJhbV9lbmQoKSB7CisgICAgcmV0dXJuIHBhcmFtX2l0ZXJhdG9yKFBhcmFtSW5mbyArIHBhcmFtX3NpemUoKSk7CisgIH0KKyAgcGFyYW1fcmFuZ2UgcGFyYW1zKCkgeyByZXR1cm4gcGFyYW1fcmFuZ2UocGFyYW1fYmVnaW4oKSwgcGFyYW1fZW5kKCkpOyB9CiAKLSAgcGFyYW1fY29uc3RfaXRlcmF0b3IgcGFyYW1fYmVnaW4oKSBjb25zdCB7IHJldHVybiBQYXJhbUluZm87IH0KLSAgcGFyYW1fY29uc3RfaXRlcmF0b3IgcGFyYW1fZW5kKCkgY29uc3QgICB7IHJldHVybiBQYXJhbUluZm8rcGFyYW1fc2l6ZSgpOyB9CisgIHBhcmFtX2NvbnN0X2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBwYXJhbV9jb25zdF9pdGVyYXRvcihQYXJhbUluZm8pOworICB9CisgIHBhcmFtX2NvbnN0X2l0ZXJhdG9yIHBhcmFtX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcGFyYW1fY29uc3RfaXRlcmF0b3IoUGFyYW1JbmZvICsgcGFyYW1fc2l6ZSgpKTsKKyAgfQorICBwYXJhbV9jb25zdF9yYW5nZSBwYXJhbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtX2NvbnN0X3JhbmdlKHBhcmFtX2JlZ2luKCksIHBhcmFtX2VuZCgpKTsKKyAgfQogCiAgIC8vLyBnZXROdW1QYXJhbXMgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRoaXMgZnVuY3Rpb24gbXVzdCBoYXZlCiAgIC8vLyBiYXNlZCBvbiBpdHMgRnVuY3Rpb25UeXBlLiAgVGhpcyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBQYXJhbUluZm8gYXJyYXkKQEAgLTE4NjAsNiArMTg3OCwxMiBAQAogICAgIHNldFBhcmFtcyhnZXRBU1RDb250ZXh0KCksIE5ld1BhcmFtSW5mbyk7CiAgIH0KIAorICAvLyBBcnJheVJlZiBpdGVyZmFjZSB0byBwYXJhbWV0ZXJzLgorICAvLyBGSVhNRTogU2hvdWxkIG9uZSBkYXkgcmVwbGFjZSBpdGVyYXRvciBpbnRlcmZhY2UuCisgIEFycmF5UmVmPFBhcm1WYXJEZWNsKj4gcGFyYW1ldGVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKFBhcmFtSW5mbywgZ2V0TnVtUGFyYW1zKCkpOworICB9CisKICAgY29uc3QgQXJyYXlSZWY8TmFtZWREZWNsICo+ICZnZXREZWNsc0luUHJvdG90eXBlU2NvcGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIERlY2xzSW5Qcm90b3R5cGVTY29wZTsKICAgfQpAQCAtMTg3MSw4ICsxODk1LDggQEAKICAgLy8vIGFyZ3VtZW50cyAoaW4gQysrKS4KICAgdW5zaWduZWQgZ2V0TWluUmVxdWlyZWRBcmd1bWVudHMoKSBjb25zdDsKIAotICBRdWFsVHlwZSBnZXRSZXN1bHRUeXBlKCkgY29uc3QgewotICAgIHJldHVybiBnZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uVHlwZT4oKS0+Z2V0UmVzdWx0VHlwZSgpOworICBRdWFsVHlwZSBnZXRSZXR1cm5UeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uVHlwZT4oKS0+Z2V0UmV0dXJuVHlwZSgpOwogICB9CiAKICAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbiB0aGF0IGNhbGxzIHRoaXMgZnVuY3Rpb24uCkBAIC0xOTA2LDYgKzE5MzAsOCBAQAogCiAgIGJvb2wgaXNJbmxpbmVEZWZpbml0aW9uRXh0ZXJuYWxseVZpc2libGUoKSBjb25zdDsKIAorICBib29sIGlzTVNFeHRlcm5JbmxpbmUoKSBjb25zdDsKKwogICBib29sIGRvZXNEZWNsYXJhdGlvbkZvcmNlRXh0ZXJuYWxseVZpc2libGVEZWZpbml0aW9uKCkgY29uc3Q7CiAKICAgLy8vIGlzT3ZlcmxvYWRlZE9wZXJhdG9yIC0gV2hldGhlciB0aGlzIGZ1bmN0aW9uIGRlY2xhcmF0aW9uCkBAIC0yMDk1LDcgKzIxMjEsNyBAQAogCiAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBvciB3YXMgaW5zdGFudGlhdGVkIGZyb20gYW4gb3V0LW9mLWxpbmUKICAgLy8vIGRlZmluaXRpb24gb2YgYSBtZW1iZXIgZnVuY3Rpb24uCi0gIHZpcnR1YWwgYm9vbCBpc091dE9mTGluZSgpIGNvbnN0OworICBib29sIGlzT3V0T2ZMaW5lKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBJZGVudGlmeSBhIG1lbW9yeSBjb3B5aW5nIG9yIHNldHRpbmcgZnVuY3Rpb24uCiAgIC8vLyBJZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgYSBtZW1vcnkgY29weSBvciBzZXR0aW5nIGZ1bmN0aW9uLCByZXR1cm5zCkBAIC0yMjM0LDEwICsyMjYwLDEwIEBACiAgICAgcmV0dXJuIGNhc3Q8UmVjb3JkRGVjbD4oZ2V0RGVjbENvbnRleHQoKSk7CiAgIH0KIAotICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWTsKIAogICAvLy8gUmV0cmlldmVzIHRoZSBjYW5vbmljYWwgZGVjbGFyYXRpb24gb2YgdGhpcyBmaWVsZC4KLSAgRmllbGREZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KKyAgRmllbGREZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KICAgY29uc3QgRmllbGREZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KIAogICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCkBAIC0yMjc2LDEwICsyMzAyLDEwIEBACiAgIHZvaWQgc2V0SW5pdEV4cHIoRXhwciAqRSkgeyBJbml0ID0gKFN0bXQqKSBFOyB9CiAgIHZvaWQgc2V0SW5pdFZhbChjb25zdCBsbHZtOjpBUFNJbnQgJlYpIHsgVmFsID0gVjsgfQogCi0gIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOwogCiAgIC8vLyBSZXRyaWV2ZXMgdGhlIGNhbm9uaWNhbCBkZWNsYXJhdGlvbiBvZiB0aGlzIGVudW1lcmF0b3IuCi0gIEVudW1Db25zdGFudERlY2wgKmdldENhbm9uaWNhbERlY2woKSB7IHJldHVybiBnZXRGaXJzdERlY2woKTsgfQorICBFbnVtQ29uc3RhbnREZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KICAgY29uc3QgRW51bUNvbnN0YW50RGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsgcmV0dXJuIGdldEZpcnN0RGVjbCgpOyB9CiAKICAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgpAQCAtMjI5Myw3ICsyMzE5LDcgQEAKIC8vLyBmaWVsZCBpbmplY3RlZCBmcm9tIGFuIGFub255bW91cyB1bmlvbi9zdHJ1Y3QgaW50byB0aGUgcGFyZW50IHNjb3BlLgogLy8vIEluZGlyZWN0RmllbGREZWNsIGFyZSBhbHdheXMgaW1wbGljaXQuCiBjbGFzcyBJbmRpcmVjdEZpZWxkRGVjbCA6IHB1YmxpYyBWYWx1ZURlY2wgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAgIE5hbWVkRGVjbCAqKkNoYWluaW5nOwogICB1bnNpZ25lZCBDaGFpbmluZ1NpemU7CiAKQEAgLTIzMTAsOCArMjMzNiwxMyBAQAogICBzdGF0aWMgSW5kaXJlY3RGaWVsZERlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CiAgIAogICB0eXBlZGVmIE5hbWVkRGVjbCAqIGNvbnN0ICpjaGFpbl9pdGVyYXRvcjsKLSAgY2hhaW5faXRlcmF0b3IgY2hhaW5fYmVnaW4oKSBjb25zdCB7IHJldHVybiBDaGFpbmluZzsgfQotICBjaGFpbl9pdGVyYXRvciBjaGFpbl9lbmQoKSBjb25zdCAgeyByZXR1cm4gQ2hhaW5pbmcrQ2hhaW5pbmdTaXplOyB9CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y2hhaW5faXRlcmF0b3I+IGNoYWluX3JhbmdlOworCisgIGNoYWluX3JhbmdlIGNoYWluKCkgY29uc3QgeyByZXR1cm4gY2hhaW5fcmFuZ2UoY2hhaW5fYmVnaW4oKSwgY2hhaW5fZW5kKCkpOyB9CisgIGNoYWluX2l0ZXJhdG9yIGNoYWluX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gY2hhaW5faXRlcmF0b3IoQ2hhaW5pbmcpOyB9CisgIGNoYWluX2l0ZXJhdG9yIGNoYWluX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2hhaW5faXRlcmF0b3IoQ2hhaW5pbmcgKyBDaGFpbmluZ1NpemUpOworICB9CiAKICAgdW5zaWduZWQgZ2V0Q2hhaW5pbmdTaXplKCkgY29uc3QgeyByZXR1cm4gQ2hhaW5pbmdTaXplOyB9CiAKQEAgLTIzMzQsNyArMjM2NSw3IEBACiAvLy8gVHlwZURlY2wgLSBSZXByZXNlbnRzIGEgZGVjbGFyYXRpb24gb2YgYSB0eXBlLgogLy8vCiBjbGFzcyBUeXBlRGVjbCA6IHB1YmxpYyBOYW1lZERlY2wgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAgIC8vLyBUeXBlRm9yRGVjbCAtIFRoaXMgaW5kaWNhdGVzIHRoZSBUeXBlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMKICAgLy8vIHRoaXMgVHlwZURlY2wuICBJdCBpcyBhIGNhY2hlIG1haW50YWluZWQgYnkKICAgLy8vIEFTVENvbnRleHQ6OmdldFR5cGVkZWZUeXBlLCBBU1RDb250ZXh0OjpnZXRUYWdEZWNsVHlwZSwgYW5kCkBAIC0yMzY0LDcgKzIzOTUsNyBAQAogCiAgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2NTdGFydDsgfQogICB2b2lkIHNldExvY1N0YXJ0KFNvdXJjZUxvY2F0aW9uIEwpIHsgTG9jU3RhcnQgPSBMOyB9Ci0gIHZpcnR1YWwgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKICAgICBpZiAoTG9jU3RhcnQuaXNWYWxpZCgpKQogICAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKExvY1N0YXJ0LCBnZXRMb2NhdGlvbigpKTsKICAgICBlbHNlCkBAIC0yMzc5LDcgKzI0MTAsNyBAQAogCiAvLy8gQmFzZSBjbGFzcyBmb3IgZGVjbGFyYXRpb25zIHdoaWNoIGludHJvZHVjZSBhIHR5cGVkZWYtbmFtZS4KIGNsYXNzIFR5cGVkZWZOYW1lRGVjbCA6IHB1YmxpYyBUeXBlRGVjbCwgcHVibGljIFJlZGVjbGFyYWJsZTxUeXBlZGVmTmFtZURlY2w+IHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogICB0eXBlZGVmIHN0ZDo6cGFpcjxUeXBlU291cmNlSW5mbyosIFF1YWxUeXBlPiBNb2RlZFRJbmZvOwogICBsbHZtOjpQb2ludGVyVW5pb248VHlwZVNvdXJjZUluZm8qLCBNb2RlZFRJbmZvKj4gTWF5YmVNb2RlZFRJbmZvOwogCkBAIC0yMzkwLDIwICsyNDIxLDIyIEBACiAgICAgOiBUeXBlRGVjbChESywgREMsIElkTG9jLCBJZCwgU3RhcnRMb2MpLCBNYXliZU1vZGVkVEluZm8oVEluZm8pIHt9CiAKICAgdHlwZWRlZiBSZWRlY2xhcmFibGU8VHlwZWRlZk5hbWVEZWNsPiByZWRlY2xhcmFibGVfYmFzZTsKLSAgdmlydHVhbCBUeXBlZGVmTmFtZURlY2wgKmdldE5leHRSZWRlY2xhcmF0aW9uKCkgeworICBUeXBlZGVmTmFtZURlY2wgKmdldE5leHRSZWRlY2xhcmF0aW9uKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBSZWRlY2xMaW5rLmdldE5leHQoKTsKICAgfQotICB2aXJ0dWFsIFR5cGVkZWZOYW1lRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIHsKKyAgVHlwZWRlZk5hbWVEZWNsICpnZXRQcmV2aW91c0RlY2xJbXBsKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBnZXRQcmV2aW91c0RlY2woKTsKICAgfQotICB2aXJ0dWFsIFR5cGVkZWZOYW1lRGVjbCAqZ2V0TW9zdFJlY2VudERlY2xJbXBsKCkgeworICBUeXBlZGVmTmFtZURlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0TW9zdFJlY2VudERlY2woKTsKICAgfQogCiBwdWJsaWM6CisgIHR5cGVkZWYgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbF9yYW5nZSByZWRlY2xfcmFuZ2U7CiAgIHR5cGVkZWYgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbF9pdGVyYXRvciByZWRlY2xfaXRlcmF0b3I7CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2JlZ2luOwogICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsc19lbmQ7CisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzOwogICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6Z2V0UHJldmlvdXNEZWNsOwogICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6Z2V0TW9zdFJlY2VudERlY2w7CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjppc0ZpcnN0RGVjbDsKQEAgLTI0MjgsNyArMjQ2MSw3IEBACiAgIH0KIAogICAvLy8gUmV0cmlldmVzIHRoZSBjYW5vbmljYWwgZGVjbGFyYXRpb24gb2YgdGhpcyB0eXBlZGVmLW5hbWUuCi0gIFR5cGVkZWZOYW1lRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIHsgcmV0dXJuIGdldEZpcnN0RGVjbCgpOyB9CisgIFR5cGVkZWZOYW1lRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlIHsgcmV0dXJuIGdldEZpcnN0RGVjbCgpOyB9CiAgIGNvbnN0IFR5cGVkZWZOYW1lRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsgcmV0dXJuIGdldEZpcnN0RGVjbCgpOyB9CiAKICAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgpAQCAtMjQ1MCw4ICsyNDgzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIElkTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbyk7CiAgIHN0YXRpYyBUeXBlZGVmRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKLSAgCi0gIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFk7CiAKICAgLy8gSW1wbGVtZW50IGlzYS9jYXN0L2R5bmNhc3QvZXRjLgogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KQEAgLTI0NzEsNyArMjUwNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLCBUeXBlU291cmNlSW5mbyAqVEluZm8pOwogICBzdGF0aWMgVHlwZUFsaWFzRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKIAotICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWTsKIAogICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQpAQCAtMjU3MiwxMSArMjYwNSwxMSBAQAogICB9CiAKICAgdHlwZWRlZiBSZWRlY2xhcmFibGU8VGFnRGVjbD4gcmVkZWNsYXJhYmxlX2Jhc2U7Ci0gIHZpcnR1YWwgVGFnRGVjbCAqZ2V0TmV4dFJlZGVjbGFyYXRpb24oKSB7IHJldHVybiBSZWRlY2xMaW5rLmdldE5leHQoKTsgfQotICB2aXJ0dWFsIFRhZ0RlY2wgKmdldFByZXZpb3VzRGVjbEltcGwoKSB7CisgIFRhZ0RlY2wgKmdldE5leHRSZWRlY2xhcmF0aW9uKCkgb3ZlcnJpZGUgeyByZXR1cm4gUmVkZWNsTGluay5nZXROZXh0KCk7IH0KKyAgVGFnRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0UHJldmlvdXNEZWNsKCk7CiAgIH0KLSAgdmlydHVhbCBUYWdEZWNsICpnZXRNb3N0UmVjZW50RGVjbEltcGwoKSB7CisgIFRhZ0RlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0TW9zdFJlY2VudERlY2woKTsKICAgfQogCkBAIC0yNTg2LDkgKzI2MTksMTEgQEAKICAgdm9pZCBjb21wbGV0ZURlZmluaXRpb24oKTsKIAogcHVibGljOgorICB0eXBlZGVmIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfcmFuZ2UgcmVkZWNsX3JhbmdlOwogICB0eXBlZGVmIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfaXRlcmF0b3IgcmVkZWNsX2l0ZXJhdG9yOwogICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsc19iZWdpbjsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfZW5kOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsczsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldFByZXZpb3VzRGVjbDsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldE1vc3RSZWNlbnREZWNsOwogICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6aXNGaXJzdERlY2w7CkBAIC0yNjAzLDkgKzI2MzgsOSBAQAogICAvLy8gZ2V0T3V0ZXJMb2NTdGFydCAtIFJldHVybiBTb3VyY2VMb2NhdGlvbiByZXByZXNlbnRpbmcgc3RhcnQgb2Ygc291cmNlCiAgIC8vLyByYW5nZSB0YWtpbmcgaW50byBhY2NvdW50IGFueSBvdXRlciB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMuCiAgIFNvdXJjZUxvY2F0aW9uIGdldE91dGVyTG9jU3RhcnQoKSBjb25zdDsKLSAgdmlydHVhbCBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWTsKIAotICB2aXJ0dWFsIFRhZ0RlY2wqIGdldENhbm9uaWNhbERlY2woKTsKKyAgVGFnRGVjbCogZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlOwogICBjb25zdCBUYWdEZWNsKiBnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgewogICAgIHJldHVybiBjb25zdF9jYXN0PFRhZ0RlY2wqPih0aGlzKS0+Z2V0Q2Fub25pY2FsRGVjbCgpOwogICB9CkBAIC0yNzczLDcgKzI4MDgsNyBAQAogLy8vIHdpdGggYSBmaXhlZCB1bmRlcmx5aW5nIHR5cGUsIGFuZCBpbiBDIHdlIGFsbG93IHRoZW0gdG8gYmUgZm9yd2FyZC1kZWNsYXJlZAogLy8vIHdpdGggbm8gdW5kZXJseWluZyB0eXBlIGFzIGFuIGV4dGVuc2lvbi4KIGNsYXNzIEVudW1EZWNsIDogcHVibGljIFRhZ0RlY2wgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAgIC8vLyBJbnRlZ2VyVHlwZSAtIFRoaXMgcmVwcmVzZW50IHRoZSBpbnRlZ2VyIHR5cGUgdGhhdCB0aGUgZW51bSBjb3JyZXNwb25kcwogICAvLy8gdG8gZm9yIGNvZGUgZ2VuZXJhdGlvbiBwdXJwb3Nlcy4gIE5vdGUgdGhhdCB0aGUgZW51bWVyYXRvciBjb25zdGFudHMgbWF5CiAgIC8vLyBoYXZlIGEgZGlmZmVyZW50IHR5cGUgdGhhbiB0aGlzIGRvZXMuCkBAIC0yODE5LDcgKzI4NTQsNyBAQAogICB2b2lkIHNldEluc3RhbnRpYXRpb25PZk1lbWJlckVudW0oQVNUQ29udGV4dCAmQywgRW51bURlY2wgKkVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLKTsKIHB1YmxpYzoKLSAgRW51bURlY2wgKmdldENhbm9uaWNhbERlY2woKSB7CisgIEVudW1EZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBjYXN0PEVudW1EZWNsPihUYWdEZWNsOjpnZXRDYW5vbmljYWxEZWNsKCkpOwogICB9CiAgIGNvbnN0IEVudW1EZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgewpAQCAtMjg2NSw2ICsyOTAwLDEyIEBACiAgIC8vIGVudW1lcmF0b3JfaXRlcmF0b3IgLSBJdGVyYXRlcyB0aHJvdWdoIHRoZSBlbnVtZXJhdG9ycyBvZiB0aGlzCiAgIC8vIGVudW1lcmF0aW9uLgogICB0eXBlZGVmIHNwZWNpZmljX2RlY2xfaXRlcmF0b3I8RW51bUNvbnN0YW50RGVjbD4gZW51bWVyYXRvcl9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPEVudW1Db25zdGFudERlY2w+PgorICAgIGVudW1lcmF0b3JfcmFuZ2U7CisKKyAgZW51bWVyYXRvcl9yYW5nZSBlbnVtZXJhdG9ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gZW51bWVyYXRvcl9yYW5nZShlbnVtZXJhdG9yX2JlZ2luKCksIGVudW1lcmF0b3JfZW5kKCkpOworICB9CiAKICAgZW51bWVyYXRvcl9pdGVyYXRvciBlbnVtZXJhdG9yX2JlZ2luKCkgY29uc3QgewogICAgIGNvbnN0IEVudW1EZWNsICpFID0gZ2V0RGVmaW5pdGlvbigpOwpAQCAtMjg4OCwyNyArMjkyOSwzMiBAQAogICB2b2lkIHNldFByb21vdGlvblR5cGUoUXVhbFR5cGUgVCkgeyBQcm9tb3Rpb25UeXBlID0gVDsgfQogCiAgIC8vLyBnZXRJbnRlZ2VyVHlwZSAtIFJldHVybiB0aGUgaW50ZWdlciB0eXBlIHRoaXMgZW51bSBkZWNsIGNvcnJlc3BvbmRzIHRvLgotICAvLy8gVGhpcyByZXR1cm5zIGEgbnVsbCBxdWFsdHlwZSBmb3IgYW4gZW51bSBmb3J3YXJkIGRlZmluaXRpb24uCisgIC8vLyBUaGlzIHJldHVybnMgYSBudWxsIFF1YWxUeXBlIGZvciBhbiBlbnVtIGZvcndhcmQgZGVmaW5pdGlvbiB3aXRoIG5vIGZpeGVkCisgIC8vLyB1bmRlcmx5aW5nIHR5cGUuCiAgIFF1YWxUeXBlIGdldEludGVnZXJUeXBlKCkgY29uc3QgewogICAgIGlmICghSW50ZWdlclR5cGUpCiAgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKLSAgICBpZiAoY29uc3QgVHlwZSogVCA9IEludGVnZXJUeXBlLmR5bl9jYXN0PGNvbnN0IFR5cGUqPigpKQorICAgIGlmIChjb25zdCBUeXBlICpUID0gSW50ZWdlclR5cGUuZHluX2Nhc3Q8Y29uc3QgVHlwZSo+KCkpCiAgICAgICByZXR1cm4gUXVhbFR5cGUoVCwgMCk7Ci0gICAgcmV0dXJuIEludGVnZXJUeXBlLmdldDxUeXBlU291cmNlSW5mbyo+KCktPmdldFR5cGUoKTsKKyAgICByZXR1cm4gSW50ZWdlclR5cGUuZ2V0PFR5cGVTb3VyY2VJbmZvKj4oKS0+Z2V0VHlwZSgpLmdldFVucXVhbGlmaWVkVHlwZSgpOwogICB9CiAKICAgLy8vIFxicmllZiBTZXQgdGhlIHVuZGVybHlpbmcgaW50ZWdlciB0eXBlLgogICB2b2lkIHNldEludGVnZXJUeXBlKFF1YWxUeXBlIFQpIHsgSW50ZWdlclR5cGUgPSBULmdldFR5cGVQdHJPck51bGwoKTsgfQogCiAgIC8vLyBcYnJpZWYgU2V0IHRoZSB1bmRlcmx5aW5nIGludGVnZXIgdHlwZSBzb3VyY2UgaW5mby4KLSAgdm9pZCBzZXRJbnRlZ2VyVHlwZVNvdXJjZUluZm8oVHlwZVNvdXJjZUluZm8qIFRJbmZvKSB7IEludGVnZXJUeXBlID0gVEluZm87IH0KKyAgdm9pZCBzZXRJbnRlZ2VyVHlwZVNvdXJjZUluZm8oVHlwZVNvdXJjZUluZm8gKlRJbmZvKSB7IEludGVnZXJUeXBlID0gVEluZm87IH0KIAogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdHlwZSBzb3VyY2UgaW5mbyBmb3IgdGhlIHVuZGVybHlpbmcgaW50ZWdlciB0eXBlLAogICAvLy8gaWYgbm8gdHlwZSBzb3VyY2UgaW5mbyBleGlzdHMsIHJldHVybiAwLgotICBUeXBlU291cmNlSW5mbyogZ2V0SW50ZWdlclR5cGVTb3VyY2VJbmZvKCkgY29uc3QgeworICBUeXBlU291cmNlSW5mbyAqZ2V0SW50ZWdlclR5cGVTb3VyY2VJbmZvKCkgY29uc3QgewogICAgIHJldHVybiBJbnRlZ2VyVHlwZS5keW5fY2FzdDxUeXBlU291cmNlSW5mbyo+KCk7CiAgIH0KIAorICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBzb3VyY2UgcmFuZ2UgdGhhdCBjb3ZlcnMgdGhlIHVuZGVybHlpbmcgdHlwZSBpZgorICAvLy8gc3BlY2lmaWVkLgorICBTb3VyY2VSYW5nZSBnZXRJbnRlZ2VyVHlwZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKwogICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHdpZHRoIGluIGJpdHMgcmVxdWlyZWQgdG8gc3RvcmUgYWxsIHRoZQogICAvLy8gbm9uLW5lZ2F0aXZlIGVudW1lcmF0b3JzIG9mIHRoaXMgZW51bS4KICAgdW5zaWduZWQgZ2V0TnVtUG9zaXRpdmVCaXRzKCkgY29uc3QgewpAQCAtMzEwNiw3ICszMTUyLDkgQEAKICAgLy8gdGhlIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzIG9mIHRoaXMgY2xhc3MsIGlnbm9yaW5nIGFueSBzdGF0aWMKICAgLy8gZGF0YSBtZW1iZXJzLCBmdW5jdGlvbnMsIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMsIGV0Yy4KICAgdHlwZWRlZiBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPEZpZWxkRGVjbD4gZmllbGRfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxGaWVsZERlY2w+PiBmaWVsZF9yYW5nZTsKIAorICBmaWVsZF9yYW5nZSBmaWVsZHMoKSBjb25zdCB7IHJldHVybiBmaWVsZF9yYW5nZShmaWVsZF9iZWdpbigpLCBmaWVsZF9lbmQoKSk7IH0KICAgZmllbGRfaXRlcmF0b3IgZmllbGRfYmVnaW4oKSBjb25zdDsKIAogICBmaWVsZF9pdGVyYXRvciBmaWVsZF9lbmQoKSBjb25zdCB7CkBAIC0zMTU1LDcgKzMyMDMsNyBAQAogICBTb3VyY2VMb2NhdGlvbiBnZXRBc21Mb2MoKSBjb25zdCB7IHJldHVybiBnZXRMb2NhdGlvbigpOyB9CiAgIFNvdXJjZUxvY2F0aW9uIGdldFJQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIFJQYXJlbkxvYzsgfQogICB2b2lkIHNldFJQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMKSB7IFJQYXJlbkxvYyA9IEw7IH0KLSAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKICAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0QXNtTG9jKCksIGdldFJQYXJlbkxvYygpKTsKICAgfQogCkBAIC0zMjUxLDcgKzMyOTksNyBAQAogICB2b2lkIHNldElzVmFyaWFkaWMoYm9vbCB2YWx1ZSkgeyBJc1ZhcmlhZGljID0gdmFsdWU7IH0KIAogICBDb21wb3VuZFN0bXQgKmdldENvbXBvdW5kQm9keSgpIGNvbnN0IHsgcmV0dXJuIChDb21wb3VuZFN0bXQqKSBCb2R5OyB9Ci0gIFN0bXQgKmdldEJvZHkoKSBjb25zdCB7IHJldHVybiAoU3RtdCopIEJvZHk7IH0KKyAgU3RtdCAqZ2V0Qm9keSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIChTdG10KikgQm9keTsgfQogICB2b2lkIHNldEJvZHkoQ29tcG91bmRTdG10ICpCKSB7IEJvZHkgPSAoU3RtdCopIEI7IH0KIAogICB2b2lkIHNldFNpZ25hdHVyZUFzV3JpdHRlbihUeXBlU291cmNlSW5mbyAqU2lnKSB7IFNpZ25hdHVyZUFzV3JpdHRlbiA9IFNpZzsgfQpAQCAtMzI2MSwxMyArMzMwOSwzMSBAQAogICB1bnNpZ25lZCBwYXJhbV9zaXplKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtUGFyYW1zKCk7IH0KICAgdHlwZWRlZiBQYXJtVmFyRGVjbCAqKnBhcmFtX2l0ZXJhdG9yOwogICB0eXBlZGVmIFBhcm1WYXJEZWNsICogY29uc3QgKnBhcmFtX2NvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHBhcmFtX2l0ZXJhdG9yPiBwYXJhbV9yYW5nZTsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxwYXJhbV9jb25zdF9pdGVyYXRvcj4gcGFyYW1fY29uc3RfcmFuZ2U7CisKKyAgLy8gQXJyYXlSZWYgYWNjZXNzIHRvIGZvcm1hbCBwYXJhbWV0ZXJzLgorICAvLyBGSVhNRTogU2hvdWxkIGV2ZW50dWFsIHJlcGxhY2UgaXRlcmF0b3IgYWNjZXNzLgorICBBcnJheVJlZjxQYXJtVmFyRGVjbCo+IHBhcmFtZXRlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihQYXJhbUluZm8sIHBhcmFtX3NpemUoKSk7CisgIH0KIAogICBib29sIHBhcmFtX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtUGFyYW1zID09IDA7IH0KLSAgcGFyYW1faXRlcmF0b3IgcGFyYW1fYmVnaW4oKSAgeyByZXR1cm4gUGFyYW1JbmZvOyB9Ci0gIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2VuZCgpICAgeyByZXR1cm4gUGFyYW1JbmZvK3BhcmFtX3NpemUoKTsgfQorICBwYXJhbV9yYW5nZSBwYXJhbXMoKSB7IHJldHVybiBwYXJhbV9yYW5nZShwYXJhbV9iZWdpbigpLCBwYXJhbV9lbmQoKSk7IH0KKyAgcGFyYW1faXRlcmF0b3IgcGFyYW1fYmVnaW4oKSB7IHJldHVybiBwYXJhbV9pdGVyYXRvcihQYXJhbUluZm8pOyB9CisgIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2VuZCgpIHsKKyAgICByZXR1cm4gcGFyYW1faXRlcmF0b3IoUGFyYW1JbmZvICsgcGFyYW1fc2l6ZSgpKTsKKyAgfQogCi0gIHBhcmFtX2NvbnN0X2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gUGFyYW1JbmZvOyB9Ci0gIHBhcmFtX2NvbnN0X2l0ZXJhdG9yIHBhcmFtX2VuZCgpIGNvbnN0ICAgeyByZXR1cm4gUGFyYW1JbmZvK3BhcmFtX3NpemUoKTsgfQorICBwYXJhbV9jb25zdF9yYW5nZSBwYXJhbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtX2NvbnN0X3JhbmdlKHBhcmFtX2JlZ2luKCksIHBhcmFtX2VuZCgpKTsKKyAgfQorICBwYXJhbV9jb25zdF9pdGVyYXRvciBwYXJhbV9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gcGFyYW1fY29uc3RfaXRlcmF0b3IoUGFyYW1JbmZvKTsKKyAgfQorICBwYXJhbV9jb25zdF9pdGVyYXRvciBwYXJhbV9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtX2NvbnN0X2l0ZXJhdG9yKFBhcmFtSW5mbyArIHBhcmFtX3NpemUoKSk7CisgIH0KIAogICB1bnNpZ25lZCBnZXROdW1QYXJhbXMoKSBjb25zdCB7IHJldHVybiBOdW1QYXJhbXM7IH0KICAgY29uc3QgUGFybVZhckRlY2wgKmdldFBhcmFtRGVjbCh1bnNpZ25lZCBpKSBjb25zdCB7CkBAIC0zMjkwLDYgKzMzNTYsMTYgQEAKIAogICB0eXBlZGVmIGNvbnN0IENhcHR1cmUgKmNhcHR1cmVfaXRlcmF0b3I7CiAgIHR5cGVkZWYgY29uc3QgQ2FwdHVyZSAqY2FwdHVyZV9jb25zdF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxjYXB0dXJlX2l0ZXJhdG9yPiBjYXB0dXJlX3JhbmdlOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNhcHR1cmVfY29uc3RfaXRlcmF0b3I+IGNhcHR1cmVfY29uc3RfcmFuZ2U7CisKKyAgY2FwdHVyZV9yYW5nZSBjYXB0dXJlcygpIHsKKyAgICByZXR1cm4gY2FwdHVyZV9yYW5nZShjYXB0dXJlX2JlZ2luKCksIGNhcHR1cmVfZW5kKCkpOworICB9CisgIGNhcHR1cmVfY29uc3RfcmFuZ2UgY2FwdHVyZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhcHR1cmVfY29uc3RfcmFuZ2UoY2FwdHVyZV9iZWdpbigpLCBjYXB0dXJlX2VuZCgpKTsKKyAgfQorCiAgIGNhcHR1cmVfaXRlcmF0b3IgY2FwdHVyZV9iZWdpbigpIHsgcmV0dXJuIENhcHR1cmVzOyB9CiAgIGNhcHR1cmVfaXRlcmF0b3IgY2FwdHVyZV9lbmQoKSB7IHJldHVybiBDYXB0dXJlcyArIE51bUNhcHR1cmVzOyB9CiAgIGNhcHR1cmVfY29uc3RfaXRlcmF0b3IgY2FwdHVyZV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIENhcHR1cmVzOyB9CkBAIC0zMzIxLDcgKzMzOTcsNyBAQAogICAgIE1hbmdsaW5nQ29udGV4dERlY2wgPSBDdHg7CiAgIH0KIAotICB2aXJ0dWFsIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOwogCiAgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CkBAIC0zMzU3LDcgKzM0MzMsNyBAQAogICBzdGF0aWMgQ2FwdHVyZWREZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1QYXJhbXMpOwogCi0gIFN0bXQgKmdldEJvZHkoKSBjb25zdCB7IHJldHVybiBCb2R5OyB9CisgIFN0bXQgKmdldEJvZHkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBCb2R5OyB9CiAgIHZvaWQgc2V0Qm9keShTdG10ICpCKSB7IEJvZHkgPSBCOyB9CiAKICAgdW5zaWduZWQgZ2V0TnVtUGFyYW1zKCkgY29uc3QgeyByZXR1cm4gTnVtUGFyYW1zOyB9CkBAIC0zMzc2LDExICszNDUyLDE2IEBACiAgIHZvaWQgc2V0Q29udGV4dFBhcmFtKEltcGxpY2l0UGFyYW1EZWNsICpQKSB7IHNldFBhcmFtKDAsIFApOyB9CiAKICAgdHlwZWRlZiBJbXBsaWNpdFBhcmFtRGVjbCAqKnBhcmFtX2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHBhcmFtX2l0ZXJhdG9yPiBwYXJhbV9yYW5nZTsKKwogICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBwYXJhbWV0ZXIgZGVjbC4KICAgcGFyYW1faXRlcmF0b3IgcGFyYW1fYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRQYXJhbXMoKTsgfQogICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIG9uZSBwYXN0IHRoZSBsYXN0IHBhcmFtZXRlciBkZWNsLgogICBwYXJhbV9pdGVyYXRvciBwYXJhbV9lbmQoKSBjb25zdCB7IHJldHVybiBnZXRQYXJhbXMoKSArIE51bVBhcmFtczsgfQogCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgcmFuZ2UgZm9yIHRoZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zLgorICBwYXJhbV9yYW5nZSBwYXJhbXMoKSBjb25zdCB7IHJldHVybiBwYXJhbV9yYW5nZShwYXJhbV9iZWdpbigpLCBwYXJhbV9lbmQoKSk7IH0KKwogICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQogICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gQ2FwdHVyZWQ7IH0KQEAgLTM0NTUsOSArMzUzNiw5IEBACiAgIC8vLyBUaGlzIHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBsb2NhdGlvbnMgb2YgdGhlIGluZGl2aWR1YWwKICAgLy8vIGlkZW50aWZpZXJzIGFyZW4ndCBhdmFpbGFibGUuCiAgIEFycmF5UmVmPFNvdXJjZUxvY2F0aW9uPiBnZXRJZGVudGlmaWVyTG9jcygpIGNvbnN0OwotICAKLSAgdmlydHVhbCBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7Ci0gIAorCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWTsKKwogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIGNsYXNzb2ZLaW5kKEQtPmdldEtpbmQoKSk7IH0KICAgc3RhdGljIGJvb2wgY2xhc3NvZktpbmQoS2luZCBLKSB7IHJldHVybiBLID09IEltcG9ydDsgfQogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xCYXNlLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsQmFzZS5oCmluZGV4IDI2ZWVhNjQuLjZjMzEzNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xCYXNlLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbEJhc2UuaApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xpbmthZ2UuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9TcGVjaWZpZXJzLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJldHR5U3RhY2tUcmFjZS5oIgogCkBAIC0zMiw2ICszMyw3IEBACiBjbGFzcyBEZXBlbmRlbnREaWFnbm9zdGljOwogY2xhc3MgRW51bURlY2w7CiBjbGFzcyBGdW5jdGlvbkRlY2w7CitjbGFzcyBGdW5jdGlvblR5cGU7CiBjbGFzcyBMaW5rYWdlQ29tcHV0ZXI7CiBjbGFzcyBMaW5rYWdlU3BlY0RlY2w7CiBjbGFzcyBNb2R1bGU7CkBAIC01MiwyMCArNTQsNiBAQAogY2xhc3MgVXNpbmdEaXJlY3RpdmVEZWNsOwogfQogCi1uYW1lc3BhY2UgbGx2bSB7Ci0vLyBEZWNsQ29udGV4dCogaXMgb25seSA0LWJ5dGUgYWxpZ25lZCBvbiAzMi1iaXQgc3lzdGVtcy4KLXRlbXBsYXRlPD4KLSAgY2xhc3MgUG9pbnRlckxpa2VUeXBlVHJhaXRzPGNsYW5nOjpEZWNsQ29udGV4dCo+IHsKLSAgdHlwZWRlZiBjbGFuZzo6RGVjbENvbnRleHQqIFBUOwotcHVibGljOgotICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEFzVm9pZFBvaW50ZXIoUFQgUCkgeyByZXR1cm4gUDsgfQotICBzdGF0aWMgaW5saW5lIFBUIGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFBUPihQKTsKLSAgfQotICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IDIgfTsKLX07Ci19Ci0KIG5hbWVzcGFjZSBjbGFuZyB7CiAKICAgLy8vIFxicmllZiBDYXB0dXJlcyB0aGUgcmVzdWx0IG9mIGNoZWNraW5nIHRoZSBhdmFpbGFiaWxpdHkgb2YgYQpAQCAtMzAyLDggKzI5MCwyNCBAQAogCiAgIHRlbXBsYXRlPHR5cGVuYW1lIGRlY2xfdHlwZT4gZnJpZW5kIGNsYXNzIFJlZGVjbGFyYWJsZTsKIAorICAvLy8gXGJyaWVmIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBkZXNlcmlhbGl6ZWQgZGVjbGFyYXRpb24uCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgdXNlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFueSBkZWNsYXJhdGlvbiB0aGF0IGlzCisgIC8vLyBkZXNlcmlhbGl6ZWQgZnJvbSBhIG1vZHVsZSBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTaXplIFRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgb2JqZWN0LgorICAvLy8gXHBhcmFtIEN0eCBUaGUgY29udGV4dCBpbiB3aGljaCB3ZSB3aWxsIGFsbG9jYXRlIG1lbW9yeS4KKyAgLy8vIFxwYXJhbSBJRCBUaGUgZ2xvYmFsIElEIG9mIHRoZSBkZXNlcmlhbGl6ZWQgZGVjbGFyYXRpb24uCisgIC8vLyBccGFyYW0gRXh0cmEgVGhlIGFtb3VudCBvZiBleHRyYSBzcGFjZSB0byBhbGxvY2F0ZSBhZnRlciB0aGUgb2JqZWN0LgorICB2b2lkICpvcGVyYXRvciBuZXcoc3RkOjpzaXplX3QgU2l6ZSwgY29uc3QgQVNUQ29udGV4dCAmQ3R4LCB1bnNpZ25lZCBJRCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IEV4dHJhID0gMCk7CisKKyAgLy8vIFxicmllZiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgbm9uLWRlc2VyaWFsaXplZCBkZWNsYXJhdGlvbi4KKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IFNpemUsIGNvbnN0IEFTVENvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpQYXJlbnQsIHN0ZDo6c2l6ZV90IEV4dHJhID0gMCk7CisKIHByaXZhdGU6Ci0gIHZvaWQgQ2hlY2tBY2Nlc3NEZWNsQ29udGV4dCgpIGNvbnN0OworICBib29sIEFjY2Vzc0RlY2xDb250ZXh0U2FuaXR5KCkgY29uc3Q7CiAKIHByb3RlY3RlZDoKIApAQCAtMzMwLDE4ICszMzQsNiBAQAogCiAgIHZpcnR1YWwgfkRlY2woKTsKIAotICAvLy8gXGJyaWVmIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBkZXNlcmlhbGl6ZWQgZGVjbGFyYXRpb24uCi0gIC8vLwotICAvLy8gVGhpcyByb3V0aW5lIG11c3QgYmUgdXNlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFueSBkZWNsYXJhdGlvbiB0aGF0IGlzCi0gIC8vLyBkZXNlcmlhbGl6ZWQgZnJvbSBhIG1vZHVsZSBmaWxlLgotICAvLy8KLSAgLy8vIFxwYXJhbSBDb250ZXh0IFRoZSBjb250ZXh0IGluIHdoaWNoIHdlIHdpbGwgYWxsb2NhdGUgbWVtb3J5LgotICAvLy8gXHBhcmFtIElEIFRoZSBnbG9iYWwgSUQgb2YgdGhlIGRlc2VyaWFsaXplZCBkZWNsYXJhdGlvbi4KLSAgLy8vIFxwYXJhbSBTaXplIFRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgb2JqZWN0LgotICBzdGF0aWMgdm9pZCAqQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSk7Ci0KICAgLy8vIFxicmllZiBVcGRhdGUgYSBwb3RlbnRpYWxseSBvdXQtb2YtZGF0ZSBkZWNsYXJhdGlvbi4KICAgdm9pZCB1cGRhdGVPdXRPZkRhdGUoSWRlbnRpZmllckluZm8gJklJKSBjb25zdDsKIApAQCAtNDA5LDE1ICs0MDEsMTEgQEAKIAogICB2b2lkIHNldEFjY2VzcyhBY2Nlc3NTcGVjaWZpZXIgQVMpIHsKICAgICBBY2Nlc3MgPSBBUzsKLSNpZm5kZWYgTkRFQlVHCi0gICAgQ2hlY2tBY2Nlc3NEZWNsQ29udGV4dCgpOwotI2VuZGlmCisgICAgYXNzZXJ0KEFjY2Vzc0RlY2xDb250ZXh0U2FuaXR5KCkpOwogICB9CiAKICAgQWNjZXNzU3BlY2lmaWVyIGdldEFjY2VzcygpIGNvbnN0IHsKLSNpZm5kZWYgTkRFQlVHCi0gICAgQ2hlY2tBY2Nlc3NEZWNsQ29udGV4dCgpOwotI2VuZGlmCisgICAgYXNzZXJ0KEFjY2Vzc0RlY2xDb250ZXh0U2FuaXR5KCkpOwogICAgIHJldHVybiBBY2Nlc3NTcGVjaWZpZXIoQWNjZXNzKTsKICAgfQogCkBAIC00NDUsOSArNDMzLDEyIEBACiAgIH0KIAogICB0eXBlZGVmIEF0dHJWZWM6OmNvbnN0X2l0ZXJhdG9yIGF0dHJfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8YXR0cl9pdGVyYXRvcj4gYXR0cl9yYW5nZTsKIAotICAvLyBGSVhNRTogRG8gbm90IHJlbHkgb24gaXRlcmF0b3JzIGhhdmluZyBjb21wYXJhYmxlIHNpbmd1bGFyIHZhbHVlcy4KLSAgLy8gICAgICAgIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBlcnJvciBvdXQgaWYgdGhleSBkbyBub3QuCisgIGF0dHJfcmFuZ2UgYXR0cnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGF0dHJfcmFuZ2UoYXR0cl9iZWdpbigpLCBhdHRyX2VuZCgpKTsKKyAgfQorCiAgIGF0dHJfaXRlcmF0b3IgYXR0cl9iZWdpbigpIGNvbnN0IHsKICAgICByZXR1cm4gaGFzQXR0cnMoKSA/IGdldEF0dHJzKCkuYmVnaW4oKSA6IDA7CiAgIH0KQEAgLTQ2Nyw2ICs0NTgsMTIgQEAKICAgfQogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjaWZpY19hdHRyX2l0ZXJhdG9yPFQ+PiBzcGVjaWZpY19hdHRycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxUPj4oCisgICAgICAgIHNwZWNpZmljX2F0dHJfYmVnaW48VD4oKSwgc3BlY2lmaWNfYXR0cl9lbmQ8VD4oKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxUPiBzcGVjaWZpY19hdHRyX2JlZ2luKCkgY29uc3QgewogICAgIHJldHVybiBzcGVjaWZpY19hdHRyX2l0ZXJhdG9yPFQ+KGF0dHJfYmVnaW4oKSk7CiAgIH0KQEAgLTc2OSwxMCArNzY2LDE2IEBACiAgICAgfQogICB9OwogCi0gIC8vLyBcYnJpZWYgUmV0dXJucyBpdGVyYXRvciBmb3IgYWxsIHRoZSByZWRlY2xhcmF0aW9ucyBvZiB0aGUgc2FtZSBkZWNsLgotICAvLy8gSXQgd2lsbCBpdGVyYXRlIGF0IGxlYXN0IG9uY2UgKHdoZW4gdGhpcyBkZWNsIGlzIHRoZSBvbmx5IG9uZSkuCisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cmVkZWNsX2l0ZXJhdG9yPiByZWRlY2xfcmFuZ2U7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHJhbmdlIGZvciBhbGwgdGhlIHJlZGVjbGFyYXRpb25zIG9mIHRoZSBzYW1lCisgIC8vLyBkZWNsLiBJdCB3aWxsIGl0ZXJhdGUgYXQgbGVhc3Qgb25jZSAod2hlbiB0aGlzIGRlY2wgaXMgdGhlIG9ubHkgb25lKS4KKyAgcmVkZWNsX3JhbmdlIHJlZGVjbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlZGVjbF9yYW5nZShyZWRlY2xzX2JlZ2luKCksIHJlZGVjbHNfZW5kKCkpOworICB9CisKICAgcmVkZWNsX2l0ZXJhdG9yIHJlZGVjbHNfYmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJlZGVjbF9pdGVyYXRvcihjb25zdF9jYXN0PERlY2wqPih0aGlzKSk7CisgICAgcmV0dXJuIHJlZGVjbF9pdGVyYXRvcihjb25zdF9jYXN0PERlY2wgKj4odGhpcykpOwogICB9CiAgIHJlZGVjbF9pdGVyYXRvciByZWRlY2xzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIHJlZGVjbF9pdGVyYXRvcigpOyB9CiAKQEAgLTgzNiw3ICs4MzksMTkgQEAKICAgYm9vbCBpc1RlbXBsYXRlRGVjbCgpIGNvbnN0OwogCiAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGRlY2xhcmF0aW9uIGlzIGEgZnVuY3Rpb24gb3IgZnVuY3Rpb24gdGVtcGxhdGUuCi0gIGJvb2wgaXNGdW5jdGlvbk9yRnVuY3Rpb25UZW1wbGF0ZSgpIGNvbnN0OworICBib29sIGlzRnVuY3Rpb25PckZ1bmN0aW9uVGVtcGxhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIChEZWNsS2luZCA+PSBEZWNsOjpmaXJzdEZ1bmN0aW9uICYmCisgICAgICAgICAgICBEZWNsS2luZCA8PSBEZWNsOjpsYXN0RnVuY3Rpb24pIHx8CisgICAgICAgICAgIERlY2xLaW5kID09IEZ1bmN0aW9uVGVtcGxhdGU7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGZ1bmN0aW9uIGl0c2VsZiwgb3IgdGhlIHRlbXBsYXRlZCBmdW5jdGlvbiBpZiB0aGlzIGlzIGEKKyAgLy8vIGZ1bmN0aW9uIHRlbXBsYXRlLgorICBGdW5jdGlvbkRlY2wgKmdldEFzRnVuY3Rpb24oKSBMTFZNX1JFQURPTkxZOworCisgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqZ2V0QXNGdW5jdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxEZWNsICo+KHRoaXMpLT5nZXRBc0Z1bmN0aW9uKCk7CisgIH0KIAogICAvLy8gXGJyaWVmIENoYW5nZXMgdGhlIG5hbWVzcGFjZSBvZiB0aGlzIGRlY2xhcmF0aW9uIHRvIHJlZmxlY3QgdGhhdCBpdCdzCiAgIC8vLyBhIGZ1bmN0aW9uLWxvY2FsIGV4dGVybiBkZWNsYXJhdGlvbi4KQEAgLTkzOCwxMSArOTUzLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCwgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRhdGlvbiA9IDApOwogICAvLyBEZWJ1Z2dlcnMgZG9uJ3QgdXN1YWxseSByZXNwZWN0IGRlZmF1bHQgYXJndW1lbnRzLgotICBMTFZNX0FUVFJJQlVURV9VU0VEIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKICAgLy8gU2FtZSBhcyBkdW1wKCksIGJ1dCBmb3JjZXMgY29sb3IgcHJpbnRpbmcuCi0gIExMVk1fQVRUUklCVVRFX1VTRUQgdm9pZCBkdW1wQ29sb3IoKSBjb25zdDsKKyAgdm9pZCBkdW1wQ29sb3IoKSBjb25zdDsKICAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPdXQpIGNvbnN0OwogCisgIC8vLyBcYnJpZWYgTG9va3MgdGhyb3VnaCB0aGUgRGVjbCdzIHVuZGVybHlpbmcgdHlwZSB0byBleHRyYWN0IGEgRnVuY3Rpb25UeXBlCisgIC8vLyB3aGVuIHBvc3NpYmxlLiBXaWxsIHJldHVybiBudWxsIGlmIHRoZSB0eXBlIHVuZGVybHlpbmcgdGhlIERlY2wgZG9lcyBub3QKKyAgLy8vIGhhdmUgYSBGdW5jdGlvblR5cGUuCisgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0RnVuY3Rpb25UeXBlKGJvb2wgQmxvY2tzVG9vID0gdHJ1ZSkgY29uc3Q7CisKIHByaXZhdGU6CiAgIHZvaWQgc2V0QXR0cnNJbXBsKGNvbnN0IEF0dHJWZWMmIEF0dHJzLCBBU1RDb250ZXh0ICZDdHgpOwogICB2b2lkIHNldERlY2xDb250ZXh0c0ltcGwoRGVjbENvbnRleHQgKlNlbWFEQywgRGVjbENvbnRleHQgKkxleGljYWxEQywKQEAgLTk3NSw3ICs5OTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VNYW5hZ2VyICZzbSwgY29uc3QgY2hhciAqTXNnKQogICA6IFRoZURlY2wodGhlRGVjbCksIExvYyhMKSwgU00oc20pLCBNZXNzYWdlKE1zZykge30KIAotICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOwogfTsKIAogdHlwZWRlZiBsbHZtOjpNdXRhYmxlQXJyYXlSZWY8TmFtZWREZWNsKj4gRGVjbENvbnRleHRMb29rdXBSZXN1bHQ7CkBAIC0xMjgyLDggKzEzMDIsMTEgQEAKICAgICB9CiAgIH07CiAKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxkZWNsX2l0ZXJhdG9yPiBkZWNsX3JhbmdlOworCiAgIC8vLyBkZWNsc19iZWdpbi9kZWNsc19lbmQgLSBJdGVyYXRlIG92ZXIgdGhlIGRlY2xhcmF0aW9ucyBzdG9yZWQgaW4KICAgLy8vIHRoaXMgY29udGV4dC4KKyAgZGVjbF9yYW5nZSBkZWNscygpIGNvbnN0IHsgcmV0dXJuIGRlY2xfcmFuZ2UoZGVjbHNfYmVnaW4oKSwgZGVjbHNfZW5kKCkpOyB9CiAgIGRlY2xfaXRlcmF0b3IgZGVjbHNfYmVnaW4oKSBjb25zdDsKICAgZGVjbF9pdGVyYXRvciBkZWNsc19lbmQoKSBjb25zdCB7IHJldHVybiBkZWNsX2l0ZXJhdG9yKCk7IH0KICAgYm9vbCBkZWNsc19lbXB0eSgpIGNvbnN0OwpAQCAtMTI5MSw3ICsxMzE0LDEwIEBACiAgIC8vLyBub2xvYWRfZGVjbHNfYmVnaW4vZW5kIC0gSXRlcmF0ZSBvdmVyIHRoZSBkZWNsYXJhdGlvbnMgc3RvcmVkIGluIHRoaXMKICAgLy8vIGNvbnRleHQgdGhhdCBhcmUgY3VycmVudGx5IGxvYWRlZDsgZG9uJ3QgYXR0ZW1wdCB0byByZXRyaWV2ZSBhbnl0aGluZwogICAvLy8gZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UuCi0gIGRlY2xfaXRlcmF0b3Igbm9sb2FkX2RlY2xzX2JlZ2luKCkgY29uc3Q7CisgIGRlY2xfcmFuZ2Ugbm9sb2FkX2RlY2xzKCkgY29uc3QgeworICAgIHJldHVybiBkZWNsX3JhbmdlKG5vbG9hZF9kZWNsc19iZWdpbigpLCBub2xvYWRfZGVjbHNfZW5kKCkpOworICB9CisgIGRlY2xfaXRlcmF0b3Igbm9sb2FkX2RlY2xzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZGVjbF9pdGVyYXRvcihGaXJzdERlY2wpOyB9CiAgIGRlY2xfaXRlcmF0b3Igbm9sb2FkX2RlY2xzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGRlY2xfaXRlcmF0b3IoKTsgfQogCiAgIC8vLyBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yIC0gSXRlcmF0ZXMgb3ZlciBhIHN1YnJhbmdlIG9mCkBAIC0xNTM3LDYgKzE1NjMsMTEgQEAKICAgLy8vIG9mIGxvb2tpbmcgdXAgZXZlcnkgcG9zc2libGUgbmFtZS4KICAgY2xhc3MgYWxsX2xvb2t1cHNfaXRlcmF0b3I7CiAKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxhbGxfbG9va3Vwc19pdGVyYXRvcj4gbG9va3Vwc19yYW5nZTsKKworICBsb29rdXBzX3JhbmdlIGxvb2t1cHMoKSBjb25zdDsKKyAgbG9va3Vwc19yYW5nZSBub2xvYWRfbG9va3VwcygpIGNvbnN0OworCiAgIC8vLyBcYnJpZWYgSXRlcmF0b3JzIG92ZXIgYWxsIHBvc3NpYmxlIGxvb2t1cHMgd2l0aGluIHRoaXMgY29udGV4dC4KICAgYWxsX2xvb2t1cHNfaXRlcmF0b3IgbG9va3Vwc19iZWdpbigpIGNvbnN0OwogICBhbGxfbG9va3Vwc19pdGVyYXRvciBsb29rdXBzX2VuZCgpIGNvbnN0OwpAQCAtMTU0NywyNiArMTU3OCwxNSBAQAogICBhbGxfbG9va3Vwc19pdGVyYXRvciBub2xvYWRfbG9va3Vwc19iZWdpbigpIGNvbnN0OwogICBhbGxfbG9va3Vwc19pdGVyYXRvciBub2xvYWRfbG9va3Vwc19lbmQoKSBjb25zdDsKIAotICAvLy8gdWRpcl9pdGVyYXRvciAtIEl0ZXJhdGVzIHRocm91Z2ggdGhlIHVzaW5nLWRpcmVjdGl2ZXMgc3RvcmVkCi0gIC8vLyB3aXRoaW4gdGhpcyBjb250ZXh0LgotICB0eXBlZGVmIFVzaW5nRGlyZWN0aXZlRGVjbCAqIGNvbnN0ICogdWRpcl9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxVc2luZ0RpcmVjdGl2ZURlY2wgKiBjb25zdCAqPiB1ZGlyX3JhbmdlOwogCi0gIHR5cGVkZWYgc3RkOjpwYWlyPHVkaXJfaXRlcmF0b3IsIHVkaXJfaXRlcmF0b3I+IHVkaXJfaXRlcmF0b3JfcmFuZ2U7Ci0KLSAgdWRpcl9pdGVyYXRvcl9yYW5nZSBnZXRVc2luZ0RpcmVjdGl2ZXMoKSBjb25zdDsKLQotICB1ZGlyX2l0ZXJhdG9yIHVzaW5nX2RpcmVjdGl2ZXNfYmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGdldFVzaW5nRGlyZWN0aXZlcygpLmZpcnN0OwotICB9Ci0KLSAgdWRpcl9pdGVyYXRvciB1c2luZ19kaXJlY3RpdmVzX2VuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZ2V0VXNpbmdEaXJlY3RpdmVzKCkuc2Vjb25kOwotICB9CisgIHVkaXJfcmFuZ2UgdXNpbmdfZGlyZWN0aXZlcygpIGNvbnN0OwogCiAgIC8vIFRoZXNlIGFyZSBhbGwgZGVmaW5lZCBpbiBEZXBlbmRlbnREaWFnbm9zdGljLmguCiAgIGNsYXNzIGRkaWFnX2l0ZXJhdG9yOwotICBpbmxpbmUgZGRpYWdfaXRlcmF0b3IgZGRpYWdfYmVnaW4oKSBjb25zdDsKLSAgaW5saW5lIGRkaWFnX2l0ZXJhdG9yIGRkaWFnX2VuZCgpIGNvbnN0OworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPERlY2xDb250ZXh0OjpkZGlhZ19pdGVyYXRvcj4gZGRpYWdfcmFuZ2U7CisKKyAgaW5saW5lIGRkaWFnX3JhbmdlIGRkaWFncygpIGNvbnN0OwogCiAgIC8vIExvdy1sZXZlbCBhY2Nlc3NvcnMKICAgICAKQEAgLTE2MTYsMTIgKzE2MzYsMTIgQEAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKTsKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsQ29udGV4dCAqRCkgeyByZXR1cm4gdHJ1ZTsgfQogCi0gIExMVk1fQVRUUklCVVRFX1VTRUQgdm9pZCBkdW1wRGVjbENvbnRleHQoKSBjb25zdDsKLSAgTExWTV9BVFRSSUJVVEVfVVNFRCB2b2lkIGR1bXBMb29rdXBzKCkgY29uc3Q7Ci0gIExMVk1fQVRUUklCVVRFX1VTRUQgdm9pZCBkdW1wTG9va3VwcyhsbHZtOjpyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXBEZWNsQ29udGV4dCgpIGNvbnN0OworICB2b2lkIGR1bXBMb29rdXBzKCkgY29uc3Q7CisgIHZvaWQgZHVtcExvb2t1cHMobGx2bTo6cmF3X29zdHJlYW0gJk9TKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgdm9pZCByZWNvbmNpbGVFeHRlcm5hbFZpc2libGVTdG9yYWdlKCk7CisgIHZvaWQgcmVjb25jaWxlRXh0ZXJuYWxWaXNpYmxlU3RvcmFnZSgpIGNvbnN0OwogICB2b2lkIExvYWRMZXhpY2FsRGVjbHNGcm9tRXh0ZXJuYWxTdG9yYWdlKCkgY29uc3Q7CiAKICAgLy8vIEBicmllZiBNYWtlcyBhIGRlY2xhcmF0aW9uIHZpc2libGUgd2l0aGluIHRoaXMgY29udGV4dCwgYnV0CkBAIC0xNjUwLDcgKzE2NzAsNyBAQAogCiAvLyBTcGVjaWFsaXphdGlvbiBzZWxlY3RlZCB3aGVuIFRvVHkgaXMgbm90IGEga25vd24gc3ViY2xhc3Mgb2YgRGVjbENvbnRleHQuCiB0ZW1wbGF0ZSA8Y2xhc3MgVG9UeSwKLSAgICAgICAgICBib29sIElzS25vd25TdWJ0eXBlID0gOjpsbHZtOjppc19iYXNlX29mPCBEZWNsQ29udGV4dCwgVG9UeT46OnZhbHVlPgorICAgICAgICAgIGJvb2wgSXNLbm93blN1YnR5cGUgPSA6OnN0ZDo6aXNfYmFzZV9vZjxEZWNsQ29udGV4dCwgVG9UeT46OnZhbHVlPgogc3RydWN0IGNhc3RfY29udmVydF9kZWNsX2NvbnRleHQgewogICBzdGF0aWMgY29uc3QgVG9UeSAqZG9pdChjb25zdCBEZWNsQ29udGV4dCAqVmFsKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFRvVHkqPihEZWNsOjpjYXN0RnJvbURlY2xDb250ZXh0KFZhbCkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbENYWC5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbENYWC5oCmluZGV4IGRiYzQxMzIuLmY2NGVmOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xDWFguaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsQ1hYLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNkZWZpbmUgTExWTV9DTEFOR19BU1RfREVDTENYWF9ICiAKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUVW5yZXNvbHZlZFNldC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9BdHRyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2wuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByQ1hYLmgiCkBAIC0xMjIsMTQgKzEyMywxNCBAQAogICAvLy8gXGJyaWVmIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb2xvbi4KICAgdm9pZCBzZXRDb2xvbkxvYyhTb3VyY2VMb2NhdGlvbiBDTG9jKSB7IENvbG9uTG9jID0gQ0xvYzsgfQogCi0gIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CiAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldEFjY2Vzc1NwZWNpZmllckxvYygpLCBnZXRDb2xvbkxvYygpKTsKICAgfQogCiAgIHN0YXRpYyBBY2Nlc3NTcGVjRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIEFjY2Vzc1NwZWNpZmllciBBUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBBU0xvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ29sb25Mb2MpIHsKLSAgICByZXR1cm4gbmV3IChDKSBBY2Nlc3NTcGVjRGVjbChBUywgREMsIEFTTG9jLCBDb2xvbkxvYyk7CisgICAgcmV0dXJuIG5ldyAoQywgREMpIEFjY2Vzc1NwZWNEZWNsKEFTLCBEQywgQVNMb2MsIENvbG9uTG9jKTsKICAgfQogICBzdGF0aWMgQWNjZXNzU3BlY0RlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CiAKQEAgLTI1OCwxNiArMjU5LDYgQEAKICAgVHlwZVNvdXJjZUluZm8gKmdldFR5cGVTb3VyY2VJbmZvKCkgY29uc3QgeyByZXR1cm4gQmFzZVR5cGVJbmZvOyB9CiB9OwogCi0vLy8gVGhlIGluaGVyaXRhbmNlIG1vZGVsIHRvIHVzZSBmb3IgbWVtYmVyIHBvaW50ZXJzIG9mIGEgZ2l2ZW4gQ1hYUmVjb3JkRGVjbC4KLWVudW0gTVNJbmhlcml0YW5jZU1vZGVsIHsKLSAgTVNJTV9TaW5nbGUsCi0gIE1TSU1fU2luZ2xlUG9seW1vcnBoaWMsCi0gIE1TSU1fTXVsdGlwbGUsCi0gIE1TSU1fTXVsdGlwbGVQb2x5bW9ycGhpYywKLSAgTVNJTV9WaXJ0dWFsLAotICBNU0lNX1Vuc3BlY2lmaWVkCi19OwotCiAvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDKysgc3RydWN0L3VuaW9uL2NsYXNzLgogLy8vCiAvLy8gRklYTUU6IFRoaXMgY2xhc3Mgd2lsbCBkaXNhcHBlYXIgb25jZSB3ZSd2ZSBwcm9wZXJseSB0YXVnaHQgUmVjb3JkRGVjbApAQCAtMzUwLDEwICszNDEsMTUgQEAKICAgICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBjbGFzcyAob3IgYW55IHN1Ym9iamVjdCkgaGFzIG11dGFibGUgZmllbGRzLgogICAgIGJvb2wgSGFzTXV0YWJsZUZpZWxkcyA6IDE7CiAKKyAgICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBjbGFzcyAob3IgYW55IG5lc3RlZCBhbm9ueW1vdXMgc3RydWN0IG9yIHVuaW9uKQorICAgIC8vLyBoYXMgdmFyaWFudCBtZW1iZXJzLgorICAgIGJvb2wgSGFzVmFyaWFudE1lbWJlcnMgOiAxOworCiAgICAgLy8vIFxicmllZiBUcnVlIGlmIHRoZXJlIG5vIG5vbi1maWVsZCBtZW1iZXJzIGRlY2xhcmVkIGJ5IHRoZSB1c2VyLgogICAgIGJvb2wgSGFzT25seUNNZW1iZXJzIDogMTsKIAotICAgIC8vLyBcYnJpZWYgVHJ1ZSBpZiBhbnkgZmllbGQgaGFzIGFuIGluLWNsYXNzIGluaXRpYWxpemVyLgorICAgIC8vLyBcYnJpZWYgVHJ1ZSBpZiBhbnkgZmllbGQgaGFzIGFuIGluLWNsYXNzIGluaXRpYWxpemVyLCBpbmNsdWRpbmcgdGhvc2UKKyAgICAvLy8gd2l0aGluIGFub255bW91cyB1bmlvbnMgb3Igc3RydWN0cy4KICAgICBib29sIEhhc0luQ2xhc3NJbml0aWFsaXplciA6IDE7CiAKICAgICAvLy8gXGJyaWVmIFRydWUgaWYgYW55IGZpZWxkIGlzIG9mIHJlZmVyZW5jZSB0eXBlLCBhbmQgZG9lcyBub3QgaGF2ZSBhbgpAQCAtNjIxLDE3ICs2MTcsNyBAQAogICAvLy8gXGJyaWVmIEl0ZXJhdG9yIHRoYXQgdHJhdmVyc2VzIHRoZSBiYXNlIGNsYXNzZXMgb2YgYSBjbGFzcy4KICAgdHlwZWRlZiBjb25zdCBDWFhCYXNlU3BlY2lmaWVyKiBiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yOwogCi0gIC8vLyBcYnJpZWYgSXRlcmF0b3IgdGhhdCB0cmF2ZXJzZXMgdGhlIGJhc2UgY2xhc3NlcyBvZiBhIGNsYXNzIGluIHJldmVyc2UKLSAgLy8vIG9yZGVyLgotICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxiYXNlX2NsYXNzX2l0ZXJhdG9yPgotICAgIHJldmVyc2VfYmFzZV9jbGFzc19pdGVyYXRvcjsKLQotICAvLy8gXGJyaWVmIEl0ZXJhdG9yIHRoYXQgdHJhdmVyc2VzIHRoZSBiYXNlIGNsYXNzZXMgb2YgYSBjbGFzcyBpbiByZXZlcnNlCi0gIC8vLyBvcmRlci4KLSAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvcj4KLSAgICByZXZlcnNlX2Jhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3I7Ci0KLSAgdmlydHVhbCBDWFhSZWNvcmREZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgeworICBDWFhSZWNvcmREZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBjYXN0PENYWFJlY29yZERlY2w+KFJlY29yZERlY2w6OmdldENhbm9uaWNhbERlY2woKSk7CiAgIH0KICAgdmlydHVhbCBjb25zdCBDWFhSZWNvcmREZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgewpAQCAtNjgyLDQ2ICs2NjgsNDAgQEAKICAgLy8vIFxicmllZiBSZXRyaWV2ZXMgdGhlIG51bWJlciBvZiBiYXNlIGNsYXNzZXMgb2YgdGhpcyBjbGFzcy4KICAgdW5zaWduZWQgZ2V0TnVtQmFzZXMoKSBjb25zdCB7IHJldHVybiBkYXRhKCkuTnVtQmFzZXM7IH0KIAorICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGJhc2VfY2xhc3NfaXRlcmF0b3I+IGJhc2VfY2xhc3NfcmFuZ2U7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvcj4KKyAgICBiYXNlX2NsYXNzX2NvbnN0X3JhbmdlOworCisgIGJhc2VfY2xhc3NfcmFuZ2UgYmFzZXMoKSB7CisgICAgcmV0dXJuIGJhc2VfY2xhc3NfcmFuZ2UoYmFzZXNfYmVnaW4oKSwgYmFzZXNfZW5kKCkpOworICB9CisgIGJhc2VfY2xhc3NfY29uc3RfcmFuZ2UgYmFzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJhc2VfY2xhc3NfY29uc3RfcmFuZ2UoYmFzZXNfYmVnaW4oKSwgYmFzZXNfZW5kKCkpOworICB9CisKICAgYmFzZV9jbGFzc19pdGVyYXRvciBiYXNlc19iZWdpbigpIHsgcmV0dXJuIGRhdGEoKS5nZXRCYXNlcygpOyB9CiAgIGJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgYmFzZXNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBkYXRhKCkuZ2V0QmFzZXMoKTsgfQogICBiYXNlX2NsYXNzX2l0ZXJhdG9yIGJhc2VzX2VuZCgpIHsgcmV0dXJuIGJhc2VzX2JlZ2luKCkgKyBkYXRhKCkuTnVtQmFzZXM7IH0KICAgYmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBiYXNlc19lbmQoKSBjb25zdCB7CiAgICAgcmV0dXJuIGJhc2VzX2JlZ2luKCkgKyBkYXRhKCkuTnVtQmFzZXM7CiAgIH0KLSAgcmV2ZXJzZV9iYXNlX2NsYXNzX2l0ZXJhdG9yICAgICAgIGJhc2VzX3JiZWdpbigpIHsKLSAgICByZXR1cm4gcmV2ZXJzZV9iYXNlX2NsYXNzX2l0ZXJhdG9yKGJhc2VzX2VuZCgpKTsKLSAgfQotICByZXZlcnNlX2Jhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgYmFzZXNfcmJlZ2luKCkgY29uc3QgewotICAgIHJldHVybiByZXZlcnNlX2Jhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IoYmFzZXNfZW5kKCkpOwotICB9Ci0gIHJldmVyc2VfYmFzZV9jbGFzc19pdGVyYXRvciBiYXNlc19yZW5kKCkgewotICAgIHJldHVybiByZXZlcnNlX2Jhc2VfY2xhc3NfaXRlcmF0b3IoYmFzZXNfYmVnaW4oKSk7Ci0gIH0KLSAgcmV2ZXJzZV9iYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIGJhc2VzX3JlbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJldmVyc2VfYmFzZV9jbGFzc19jb25zdF9pdGVyYXRvcihiYXNlc19iZWdpbigpKTsKLSAgfQogCiAgIC8vLyBcYnJpZWYgUmV0cmlldmVzIHRoZSBudW1iZXIgb2YgdmlydHVhbCBiYXNlIGNsYXNzZXMgb2YgdGhpcyBjbGFzcy4KICAgdW5zaWduZWQgZ2V0TnVtVkJhc2VzKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpLk51bVZCYXNlczsgfQogCisgIGJhc2VfY2xhc3NfcmFuZ2UgdmJhc2VzKCkgeworICAgIHJldHVybiBiYXNlX2NsYXNzX3JhbmdlKHZiYXNlc19iZWdpbigpLCB2YmFzZXNfZW5kKCkpOworICB9CisgIGJhc2VfY2xhc3NfY29uc3RfcmFuZ2UgdmJhc2VzKCkgY29uc3QgeworICAgIHJldHVybiBiYXNlX2NsYXNzX2NvbnN0X3JhbmdlKHZiYXNlc19iZWdpbigpLCB2YmFzZXNfZW5kKCkpOworICB9CisKICAgYmFzZV9jbGFzc19pdGVyYXRvciB2YmFzZXNfYmVnaW4oKSB7IHJldHVybiBkYXRhKCkuZ2V0VkJhc2VzKCk7IH0KICAgYmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciB2YmFzZXNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBkYXRhKCkuZ2V0VkJhc2VzKCk7IH0KICAgYmFzZV9jbGFzc19pdGVyYXRvciB2YmFzZXNfZW5kKCkgeyByZXR1cm4gdmJhc2VzX2JlZ2luKCkgKyBkYXRhKCkuTnVtVkJhc2VzOyB9CiAgIGJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgdmJhc2VzX2VuZCgpIGNvbnN0IHsKICAgICByZXR1cm4gdmJhc2VzX2JlZ2luKCkgKyBkYXRhKCkuTnVtVkJhc2VzOwogICB9Ci0gIHJldmVyc2VfYmFzZV9jbGFzc19pdGVyYXRvciB2YmFzZXNfcmJlZ2luKCkgewotICAgIHJldHVybiByZXZlcnNlX2Jhc2VfY2xhc3NfaXRlcmF0b3IodmJhc2VzX2VuZCgpKTsKLSAgfQotICByZXZlcnNlX2Jhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgdmJhc2VzX3JiZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gcmV2ZXJzZV9iYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yKHZiYXNlc19lbmQoKSk7Ci0gIH0KLSAgcmV2ZXJzZV9iYXNlX2NsYXNzX2l0ZXJhdG9yIHZiYXNlc19yZW5kKCkgewotICAgIHJldHVybiByZXZlcnNlX2Jhc2VfY2xhc3NfaXRlcmF0b3IodmJhc2VzX2JlZ2luKCkpOwotICB9Ci0gIHJldmVyc2VfYmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciB2YmFzZXNfcmVuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcmV2ZXJzZV9iYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yKHZiYXNlc19iZWdpbigpKTsKLSB9CiAKICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhbnkgZGVwZW5kZW50IGJhc2UgY2xhc3NlcyB3aGljaAogICAvLy8gYXJlIG5vdCB0aGUgY3VycmVudCBpbnN0YW50aWF0aW9uLgpAQCAtNzMxLDYgKzcxMSwxMiBAQAogICAvLy8gYWxsIG1ldGhvZCBtZW1iZXJzIG9mIHRoZSBjbGFzcywgaW5jbHVkaW5nIG5vbi1pbnN0YW5jZSBtZXRob2RzLAogICAvLy8gc3BlY2lhbCBtZXRob2RzLCBldGMuCiAgIHR5cGVkZWYgc3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxDWFhNZXRob2REZWNsPiBtZXRob2RfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxDWFhNZXRob2REZWNsPj4KKyAgICBtZXRob2RfcmFuZ2U7CisKKyAgbWV0aG9kX3JhbmdlIG1ldGhvZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ldGhvZF9yYW5nZShtZXRob2RfYmVnaW4oKSwgbWV0aG9kX2VuZCgpKTsKKyAgfQogCiAgIC8vLyBcYnJpZWYgTWV0aG9kIGJlZ2luIGl0ZXJhdG9yLiAgSXRlcmF0ZXMgaW4gdGhlIG9yZGVyIHRoZSBtZXRob2RzCiAgIC8vLyB3ZXJlIGRlY2xhcmVkLgpAQCAtNzQ0LDYgKzczMCwxMCBAQAogCiAgIC8vLyBJdGVyYXRvciBhY2Nlc3MgdG8gY29uc3RydWN0b3IgbWVtYmVycy4KICAgdHlwZWRlZiBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPENYWENvbnN0cnVjdG9yRGVjbD4gY3Rvcl9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPENYWENvbnN0cnVjdG9yRGVjbD4+CisgICAgY3Rvcl9yYW5nZTsKKworICBjdG9yX3JhbmdlIGN0b3JzKCkgY29uc3QgeyByZXR1cm4gY3Rvcl9yYW5nZShjdG9yX2JlZ2luKCksIGN0b3JfZW5kKCkpOyB9CiAKICAgY3Rvcl9pdGVyYXRvciBjdG9yX2JlZ2luKCkgY29uc3QgewogICAgIHJldHVybiBjdG9yX2l0ZXJhdG9yKGRlY2xzX2JlZ2luKCkpOwpAQCAtNzU1LDYgKzc0NSw5IEBACiAgIC8vLyBBbiBpdGVyYXRvciBvdmVyIGZyaWVuZCBkZWNsYXJhdGlvbnMuICBBbGwgb2YgdGhlc2UgYXJlIGRlZmluZWQKICAgLy8vIGluIERlY2xGcmllbmQuaC4KICAgY2xhc3MgZnJpZW5kX2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGZyaWVuZF9pdGVyYXRvcj4gZnJpZW5kX3JhbmdlOworCisgIGZyaWVuZF9yYW5nZSBmcmllbmRzKCkgY29uc3Q7CiAgIGZyaWVuZF9pdGVyYXRvciBmcmllbmRfYmVnaW4oKSBjb25zdDsKICAgZnJpZW5kX2l0ZXJhdG9yIGZyaWVuZF9lbmQoKSBjb25zdDsKICAgdm9pZCBwdXNoRnJpZW5kRGVjbChGcmllbmREZWNsICpGRCk7CkBAIC0xMDI2LDYgKzEwMTksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVjbCAqJlRoaXNDYXB0dXJlKSBjb25zdDsKIAogICB0eXBlZGVmIGNvbnN0IExhbWJkYUV4cHI6OkNhcHR1cmUqIGNhcHR1cmVfY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y2FwdHVyZV9jb25zdF9pdGVyYXRvcj4gY2FwdHVyZV9jb25zdF9yYW5nZTsKKworICBjYXB0dXJlX2NvbnN0X3JhbmdlIGNhcHR1cmVzKCkgY29uc3QgeworICAgIHJldHVybiBjYXB0dXJlX2NvbnN0X3JhbmdlKGNhcHR1cmVzX2JlZ2luKCksIGNhcHR1cmVzX2VuZCgpKTsKKyAgfQogICBjYXB0dXJlX2NvbnN0X2l0ZXJhdG9yIGNhcHR1cmVzX2JlZ2luKCkgY29uc3QgewogICAgIHJldHVybiBpc0xhbWJkYSgpID8gZ2V0TGFtYmRhRGF0YSgpLkNhcHR1cmVzIDogTlVMTDsKICAgfQpAQCAtMTA1OCw3ICsxMDU2LDggQEAKICAgYm9vbCBpc0FnZ3JlZ2F0ZSgpIGNvbnN0IHsgcmV0dXJuIGRhdGEoKS5BZ2dyZWdhdGU7IH0KIAogICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBjbGFzcyBoYXMgYW55IGluLWNsYXNzIGluaXRpYWxpemVycwotICAvLy8gZm9yIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzLgorICAvLy8gZm9yIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzIChpbmNsdWRpbmcgdGhvc2UgaW4gYW5vbnltb3VzIHVuaW9ucyBvcgorICAvLy8gc3RydWN0cykuCiAgIGJvb2wgaGFzSW5DbGFzc0luaXRpYWxpemVyKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpLkhhc0luQ2xhc3NJbml0aWFsaXplcjsgfQogCiAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGNsYXNzIG9yIGFueSBvZiBpdHMgc3Vib2JqZWN0cyBoYXMgYW55IG1lbWJlcnMgb2YKQEAgLTExMTcsNiArMTExNiw5IEBACiAgIC8vLyBjb250YWlucyBhIG11dGFibGUgZmllbGQuCiAgIGJvb2wgaGFzTXV0YWJsZUZpZWxkcygpIGNvbnN0IHsgcmV0dXJuIGRhdGEoKS5IYXNNdXRhYmxlRmllbGRzOyB9CiAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhbnkgdmFyaWFudCBtZW1iZXJzLgorICBib29sIGhhc1ZhcmlhbnRNZW1iZXJzKCkgY29uc3QgeyByZXR1cm4gZGF0YSgpLkhhc1ZhcmlhbnRNZW1iZXJzOyB9CisKICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIHRyaXZpYWwgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAvLy8gKEMrKzExIFtjbGFzcy5jdG9yXXA1KS4KICAgYm9vbCBoYXNUcml2aWFsRGVmYXVsdENvbnN0cnVjdG9yKCkgY29uc3QgewpAQCAtMTE0NCw3ICsxMTQ2LDcgQEAKICAgLy8vIHdvdWxkIGJlIGNvbnN0ZXhwci4KICAgYm9vbCBkZWZhdWx0ZWREZWZhdWx0Q29uc3RydWN0b3JJc0NvbnN0ZXhwcigpIGNvbnN0IHsKICAgICByZXR1cm4gZGF0YSgpLkRlZmF1bHRlZERlZmF1bHRDb25zdHJ1Y3RvcklzQ29uc3RleHByICYmCi0gICAgICAgICAgICghaXNVbmlvbigpIHx8IGhhc0luQ2xhc3NJbml0aWFsaXplcigpKTsKKyAgICAgICAgICAgKCFpc1VuaW9uKCkgfHwgaGFzSW5DbGFzc0luaXRpYWxpemVyKCkgfHwgIWhhc1ZhcmlhbnRNZW1iZXJzKCkpOwogICB9CiAKICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIGNvbnN0ZXhwciBkZWZhdWx0IGNvbnN0cnVjdG9yLgpAQCAtMTU0Niw3ICsxNTQ4LDcgQEAKICAgdm9pZCBmaW5pc2hlZERlZmF1bHRlZE9yRGVsZXRlZE1lbWJlcihDWFhNZXRob2REZWNsICpNRCk7CiAKICAgLy8vIFxicmllZiBJbmRpY2F0ZXMgdGhhdCB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGNsYXNzIGlzIG5vdyBjb21wbGV0ZS4KLSAgdmlydHVhbCB2b2lkIGNvbXBsZXRlRGVmaW5pdGlvbigpOworICB2b2lkIGNvbXBsZXRlRGVmaW5pdGlvbigpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgSW5kaWNhdGVzIHRoYXQgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBjbGFzcyBpcyBub3cgY29tcGxldGUsCiAgIC8vLyBhbmQgcHJvdmlkZXMgYSBmaW5hbCBvdmVycmlkZXIgbWFwIHRvIGhlbHAgZGV0ZXJtaW5lCkBAIC0xNTk5LDcgKzE2MDEsMjUgQEAKICAgfQogCiAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgaW5oZXJpdGFuY2UgbW9kZWwgdXNlZCBmb3IgdGhpcyByZWNvcmQuCi0gIE1TSW5oZXJpdGFuY2VNb2RlbCBnZXRNU0luaGVyaXRhbmNlTW9kZWwoKSBjb25zdDsKKyAgTVNJbmhlcml0YW5jZUF0dHI6OlNwZWxsaW5nIGdldE1TSW5oZXJpdGFuY2VNb2RlbCgpIGNvbnN0OworICAvLy8gXGJyaWVmIENhbGN1bGF0ZSB3aGF0IHRoZSBpbmhlcml0YW5jZSBtb2RlbCB3b3VsZCBiZSBmb3IgdGhpcyBjbGFzcy4KKyAgTVNJbmhlcml0YW5jZUF0dHI6OlNwZWxsaW5nIGNhbGN1bGF0ZUluaGVyaXRhbmNlTW9kZWwoKSBjb25zdDsKKworICAvLy8gSW4gdGhlIE1pY3Jvc29mdCBDKysgQUJJLCB1c2UgemVybyBmb3IgdGhlIGZpZWxkIG9mZnNldCBvZiBhIG51bGwgZGF0YQorICAvLy8gbWVtYmVyIHBvaW50ZXIgaWYgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IHplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgb2Zmc2V0LAorICAvLy8gb3IgaWYgdGhlIG1lbWJlciBwb2ludGVyIGhhcyBtdWx0aXBsZSBmaWVsZHMuICBQb2x5bW9ycGhpYyBjbGFzc2VzIGhhdmUgYQorICAvLy8gdmZwdHIgYXQgb2Zmc2V0IHplcm8sIHNvIHdlIGNhbiB1c2UgemVybyBmb3IgbnVsbC4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZQorICAvLy8gZmllbGRzLCB3ZSBjYW4gdXNlIHplcm8gZXZlbiBpZiBpdCBpcyBhIHZhbGlkIGZpZWxkIG9mZnNldCBiZWNhdXNlCisgIC8vLyBudWxsLW5lc3MgdGVzdGluZyB3aWxsIGNoZWNrIHRoZSBvdGhlciBmaWVsZHMuCisgIGJvb2wgbnVsbEZpZWxkT2Zmc2V0SXNaZXJvKCkgY29uc3QgeworICAgIHJldHVybiAhTVNJbmhlcml0YW5jZUF0dHI6Omhhc09ubHlPbmVGaWVsZCgvKklzTWVtYmVyRnVuY3Rpb249Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TVNJbmhlcml0YW5jZU1vZGVsKCkpIHx8CisgICAgICAgICAgIChoYXNEZWZpbml0aW9uKCkgJiYgaXNQb2x5bW9ycGhpYygpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29udHJvbHMgd2hlbiB2dG9yZGlzcHMgd2lsbCBiZSBlbWl0dGVkIGlmIHRoaXMgcmVjb3JkIGlzIHVzZWQgYXMgYQorICAvLy8gdmlydHVhbCBiYXNlLgorICBNU1Z0b3JEaXNwQXR0cjo6TW9kZSBnZXRNU1Z0b3JEaXNwTW9kZSgpIGNvbnN0OwogCiAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBsYW1iZGEgZXhwcmVzc2lvbiB3YXMga25vd24gdG8gYmUgZGVwZW5kZW50CiAgIC8vLyBhdCB0aGUgdGltZSBpdCB3YXMgY3JlYXRlZCwgZXZlbiBpZiBpdHMgY29udGV4dCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUKQEAgLTE2MzYsNyArMTY1Niw3IEBACiAvLy8gSW4gdGhlIHRlcm1pbm9sb2d5IG9mIHRoZSBDKysgU3RhbmRhcmQsIHRoZXNlIGFyZSB0aGUgKHN0YXRpYyBhbmQKIC8vLyBub24tc3RhdGljKSBtZW1iZXIgZnVuY3Rpb25zLCB3aGV0aGVyIHZpcnR1YWwgb3Igbm90LgogY2xhc3MgQ1hYTWV0aG9kRGVjbCA6IHB1YmxpYyBGdW5jdGlvbkRlY2wgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiBwcm90ZWN0ZWQ6CiAgIENYWE1ldGhvZERlY2woS2luZCBESywgQ1hYUmVjb3JkRGVjbCAqUkQsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAogICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLApAQCAtMTY4Myw5ICsxNzAzLDkgQEAKICAgICBDWFhNZXRob2REZWNsICpDRCA9CiAgICAgICBjYXN0PENYWE1ldGhvZERlY2w+KGNvbnN0X2Nhc3Q8Q1hYTWV0aG9kRGVjbCo+KHRoaXMpLT5nZXRDYW5vbmljYWxEZWNsKCkpOwogCi0gICAgLy8gTWV0aG9kcyBkZWNsYXJlZCBpbiBpbnRlcmZhY2VzIGFyZSBhdXRvbWF0aWNhbGx5IChwdXJlKSB2aXJ0dWFsLgotICAgIGlmIChDRC0+aXNWaXJ0dWFsQXNXcml0dGVuKCkgfHwKLSAgICAgICAgICAoQ0QtPmdldFBhcmVudCgpLT5pc0ludGVyZmFjZSgpICYmIENELT5pc1VzZXJQcm92aWRlZCgpKSkKKyAgICAvLyBNZW1iZXIgZnVuY3Rpb24gaXMgdmlydHVhbCBpZiBpdCBpcyBtYXJrZWQgZXhwbGljaXRseSBzbywgb3IgaWYgaXQgaXMKKyAgICAvLyBkZWNsYXJlZCBpbiBfX2ludGVyZmFjZSAtLSB0aGVuIGl0IGlzIGF1dG9tYXRpY2FsbHkgcHVyZSB2aXJ0dWFsLgorICAgIGlmIChDRC0+aXNWaXJ0dWFsQXNXcml0dGVuKCkgfHwgQ0QtPmlzUHVyZSgpKQogICAgICAgcmV0dXJuIHRydWU7CiAKICAgICByZXR1cm4gKENELT5iZWdpbl9vdmVycmlkZGVuX21ldGhvZHMoKSAhPSBDRC0+ZW5kX292ZXJyaWRkZW5fbWV0aG9kcygpKTsKQEAgLTE3MDMsMTAgKzE3MjMsMTAgQEAKICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgogICBib29sIGlzTW92ZUFzc2lnbm1lbnRPcGVyYXRvcigpIGNvbnN0OwogCi0gIENYWE1ldGhvZERlY2wgKmdldENhbm9uaWNhbERlY2woKSB7CisgIENYWE1ldGhvZERlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGNhc3Q8Q1hYTWV0aG9kRGVjbD4oRnVuY3Rpb25EZWNsOjpnZXRDYW5vbmljYWxEZWNsKCkpOwogICB9Ci0gIGNvbnN0IENYWE1ldGhvZERlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7CisgIGNvbnN0IENYWE1ldGhvZERlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q1hYTWV0aG9kRGVjbCo+KHRoaXMpLT5nZXRDYW5vbmljYWxEZWNsKCk7CiAgIH0KIApAQCAtMjA2Niw3ICsyMDg2LDcgQEAKIC8vLyB9OwogLy8vIFxlbmRjb2RlCiBjbGFzcyBDWFhDb25zdHJ1Y3RvckRlY2wgOiBwdWJsaWMgQ1hYTWV0aG9kRGVjbCB7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKICAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgY29uc3RydWN0b3IgZGVjbGFyYXRpb24gaGFzIHRoZSBcYyBleHBsaWNpdCBrZXl3b3JkCiAgIC8vLyBzcGVjaWZpZWQuCiAgIGJvb2wgSXNFeHBsaWNpdFNwZWNpZmllZCA6IDE7CkBAIC0yMTE1LDYgKzIxMzUsMTQgQEAKICAgLy8vIFxicmllZiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBtZW1iZXIvYmFzZSBpbml0aWFsaXplciBsaXN0LgogICB0eXBlZGVmIENYWEN0b3JJbml0aWFsaXplciAqIGNvbnN0ICogaW5pdF9jb25zdF9pdGVyYXRvcjsKIAorICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGluaXRfaXRlcmF0b3I+IGluaXRfcmFuZ2U7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8aW5pdF9jb25zdF9pdGVyYXRvcj4gaW5pdF9jb25zdF9yYW5nZTsKKworICBpbml0X3JhbmdlIGluaXRzKCkgeyByZXR1cm4gaW5pdF9yYW5nZShpbml0X2JlZ2luKCksIGluaXRfZW5kKCkpOyB9CisgIGluaXRfY29uc3RfcmFuZ2UgaW5pdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGluaXRfY29uc3RfcmFuZ2UoaW5pdF9iZWdpbigpLCBpbml0X2VuZCgpKTsKKyAgfQorCiAgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGluaXRpYWxpemVyLgogICBpbml0X2l0ZXJhdG9yICAgICAgIGluaXRfYmVnaW4oKSAgICAgICB7IHJldHVybiBDdG9ySW5pdGlhbGl6ZXJzOyB9CiAgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGluaXRpYWxpemVyLgpAQCAtMjI0MCwxMCArMjI2OCwxMCBAQAogICAvLy8gXGJyaWVmIFNldCB0aGUgY29uc3RydWN0b3IgdGhhdCB0aGlzIGluaGVyaXRpbmcgY29uc3RydWN0b3IgaXMgYmFzZWQgb24uCiAgIHZvaWQgc2V0SW5oZXJpdGVkQ29uc3RydWN0b3IoY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpCYXNlQ3Rvcik7CiAKLSAgY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgeworICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGNhc3Q8Q1hYQ29uc3RydWN0b3JEZWNsPihGdW5jdGlvbkRlY2w6OmdldENhbm9uaWNhbERlY2woKSk7CiAgIH0KLSAgQ1hYQ29uc3RydWN0b3JEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgeworICBDWFhDb25zdHJ1Y3RvckRlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGNhc3Q8Q1hYQ29uc3RydWN0b3JEZWNsPihGdW5jdGlvbkRlY2w6OmdldENhbm9uaWNhbERlY2woKSk7CiAgIH0KIApAQCAtMjI2Niw3ICsyMjk0LDcgQEAKIC8vLyB9OwogLy8vIFxlbmRjb2RlCiBjbGFzcyBDWFhEZXN0cnVjdG9yRGVjbCA6IHB1YmxpYyBDWFhNZXRob2REZWNsIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogCiAgIEZ1bmN0aW9uRGVjbCAqT3BlcmF0b3JEZWxldGU7CiAKQEAgLTIyODksOCArMjMxNywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzSW1wbGljaXRseURlY2xhcmVkKTsKICAgc3RhdGljIENYWERlc3RydWN0b3JEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmIEMsIHVuc2lnbmVkIElEKTsKIAotICB2b2lkIHNldE9wZXJhdG9yRGVsZXRlKEZ1bmN0aW9uRGVjbCAqT0QpIHsgT3BlcmF0b3JEZWxldGUgPSBPRDsgfQotICBjb25zdCBGdW5jdGlvbkRlY2wgKmdldE9wZXJhdG9yRGVsZXRlKCkgY29uc3QgeyByZXR1cm4gT3BlcmF0b3JEZWxldGU7IH0KKyAgdm9pZCBzZXRPcGVyYXRvckRlbGV0ZShGdW5jdGlvbkRlY2wgKk9EKSB7CisgICAgY2FzdDxDWFhEZXN0cnVjdG9yRGVjbD4oZ2V0Rmlyc3REZWNsKCkpLT5PcGVyYXRvckRlbGV0ZSA9IE9EOworICB9CisgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqZ2V0T3BlcmF0b3JEZWxldGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q1hYRGVzdHJ1Y3RvckRlY2w+KGdldEZpcnN0RGVjbCgpKS0+T3BlcmF0b3JEZWxldGU7CisgIH0KIAogICAvLyBJbXBsZW1lbnQgaXNhL2Nhc3QvZHluY2FzdC9ldGMuCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQpAQCAtMjMxMSw3ICsyMzQzLDcgQEAKIC8vLyB9OwogLy8vIFxlbmRjb2RlCiBjbGFzcyBDWFhDb252ZXJzaW9uRGVjbCA6IHB1YmxpYyBDWFhNZXRob2REZWNsIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogICAvLy8gV2hldGhlciB0aGlzIGNvbnZlcnNpb24gZnVuY3Rpb24gZGVjbGFyYXRpb24gaXMgbWFya2VkCiAgIC8vLyAiZXhwbGljaXQiLCBtZWFuaW5nIHRoYXQgaXQgY2FuIG9ubHkgYmUgYXBwbGllZCB3aGVuIHRoZSB1c2VyCiAgIC8vLyBleHBsaWNpdGx5IHdyb3RlIGEgY2FzdC4gVGhpcyBpcyBhIEMrKzB4IGZlYXR1cmUuCkBAIC0yMzUxLDcgKzIzODMsNyBAQAogCiAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgdHlwZSB0aGF0IHRoaXMgY29udmVyc2lvbiBmdW5jdGlvbiBpcyBjb252ZXJ0aW5nIHRvLgogICBRdWFsVHlwZSBnZXRDb252ZXJzaW9uVHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZ2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblR5cGU+KCktPmdldFJlc3VsdFR5cGUoKTsKKyAgICByZXR1cm4gZ2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblR5cGU+KCktPmdldFJldHVyblR5cGUoKTsKICAgfQogCiAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjb252ZXJzaW9uIGZ1bmN0aW9uIGlzIGEgY29udmVyc2lvbiBmcm9tCkBAIC0yNDQwLDcgKzI0NzIsNyBAQAogICAgIHJldHVybiBkZWNsc19lbXB0eSgpID8gZ2V0TG9jYXRpb24oKSA6IGRlY2xzX2JlZ2luKCktPmdldExvY0VuZCgpOwogICB9CiAKLSAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKICAgICByZXR1cm4gU291cmNlUmFuZ2UoRXh0ZXJuTG9jLCBnZXRMb2NFbmQoKSk7CiAgIH0KIApAQCAtMjQ2NSw3ICsyNDk3LDcgQEAKIC8vLyBhcnRpZmljaWFsIG5hbWVzIGZvciBhbGwgdXNpbmctZGlyZWN0aXZlcyBpbiBvcmRlciB0byBzdG9yZQogLy8vIHRoZW0gaW4gRGVjbENvbnRleHQgZWZmZWN0aXZlbHkuCiBjbGFzcyBVc2luZ0RpcmVjdGl2ZURlY2wgOiBwdWJsaWMgTmFtZWREZWNsIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgXGMgdXNpbmcga2V5d29yZC4KICAgU291cmNlTG9jYXRpb24gVXNpbmdMb2M7CiAKQEAgLTI1NDYsOCArMjU3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKk5vbWluYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpDb21tb25BbmNlc3Rvcik7CiAgIHN0YXRpYyBVc2luZ0RpcmVjdGl2ZURlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7Ci0gIAotICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworCisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CiAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKFVzaW5nTG9jLCBnZXRMb2NhdGlvbigpKTsKICAgfQogCkBAIC0yNTY4LDcgKzI2MDAsNyBAQAogLy8vIG5hbWVzcGFjZSBGb28gPSBCYXI7CiAvLy8gXGVuZGNvZGUKIGNsYXNzIE5hbWVzcGFjZUFsaWFzRGVjbCA6IHB1YmxpYyBOYW1lZERlY2wgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIFxjIG5hbWVzcGFjZSBrZXl3b3JkLgogICBTb3VyY2VMb2NhdGlvbiBOYW1lc3BhY2VMb2M7CkBAIC0yNjQxLDggKzI2NzMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpOYW1lc3BhY2UpOwogCiAgIHN0YXRpYyBOYW1lc3BhY2VBbGlhc0RlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7Ci0gIAotICB2aXJ0dWFsIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKICAgICByZXR1cm4gU291cmNlUmFuZ2UoTmFtZXNwYWNlTG9jLCBJZGVudExvYyk7CiAgIH0KIApAQCAtMjY2NCw3ICsyNjk2LDcgQEAKIC8vLyB9CiAvLy8gXGVuZGNvZGUKIGNsYXNzIFVzaW5nU2hhZG93RGVjbCA6IHB1YmxpYyBOYW1lZERlY2wsIHB1YmxpYyBSZWRlY2xhcmFibGU8VXNpbmdTaGFkb3dEZWNsPiB7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKIAogICAvLy8gVGhlIHJlZmVyZW5jZWQgZGVjbGFyYXRpb24uCiAgIE5hbWVkRGVjbCAqVW5kZXJseWluZzsKQEAgLTI2ODcsMTMgKzI3MTksMTMgQEAKICAgfQogCiAgIHR5cGVkZWYgUmVkZWNsYXJhYmxlPFVzaW5nU2hhZG93RGVjbD4gcmVkZWNsYXJhYmxlX2Jhc2U7Ci0gIHZpcnR1YWwgVXNpbmdTaGFkb3dEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbigpIHsKKyAgVXNpbmdTaGFkb3dEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbigpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gUmVkZWNsTGluay5nZXROZXh0KCk7CiAgIH0KLSAgdmlydHVhbCBVc2luZ1NoYWRvd0RlY2wgKmdldFByZXZpb3VzRGVjbEltcGwoKSB7CisgIFVzaW5nU2hhZG93RGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0UHJldmlvdXNEZWNsKCk7CiAgIH0KLSAgdmlydHVhbCBVc2luZ1NoYWRvd0RlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIHsKKyAgVXNpbmdTaGFkb3dEZWNsICpnZXRNb3N0UmVjZW50RGVjbEltcGwoKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGdldE1vc3RSZWNlbnREZWNsKCk7CiAgIH0KIApAQCAtMjcwMSwyMSArMjczMywyMyBAQAogICBzdGF0aWMgVXNpbmdTaGFkb3dEZWNsICpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLCBVc2luZ0RlY2wgKlVzaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpUYXJnZXQpIHsKLSAgICByZXR1cm4gbmV3IChDKSBVc2luZ1NoYWRvd0RlY2woREMsIExvYywgVXNpbmcsIFRhcmdldCk7CisgICAgcmV0dXJuIG5ldyAoQywgREMpIFVzaW5nU2hhZG93RGVjbChEQywgTG9jLCBVc2luZywgVGFyZ2V0KTsKICAgfQogCiAgIHN0YXRpYyBVc2luZ1NoYWRvd0RlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CiAKLSAgdHlwZWRlZiByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX2l0ZXJhdG9yIHJlZGVjbF9pdGVyYXRvcjsKLSAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfYmVnaW47Ci0gIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2VuZDsKKyAgdHlwZWRlZiByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX3JhbmdlIHJlZGVjbF9yYW5nZTsKKyAgdHlwZWRlZiByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX2l0ZXJhdG9yIHJlZGVjbF9pdGVyYXRvcjsNCisgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2JlZ2luOw0KKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfZW5kOw0KKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHM7CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRQcmV2aW91c0RlY2w7CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRNb3N0UmVjZW50RGVjbDsKIAotICB2aXJ0dWFsIFVzaW5nU2hhZG93RGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIHsKKyAgVXNpbmdTaGFkb3dEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBnZXRGaXJzdERlY2woKTsKICAgfQotICB2aXJ0dWFsIGNvbnN0IFVzaW5nU2hhZG93RGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsKKyAgY29uc3QgVXNpbmdTaGFkb3dEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgewogICAgIHJldHVybiBnZXRGaXJzdERlY2woKTsKICAgfQogCkBAIC0yNzU0LDcgKzI3ODgsNyBAQAogLy8vICAgIHVzaW5nIHNvbWVOYW1lU3BhY2U6OnNvbWVJZGVudGlmaWVyOwogLy8vIFxlbmRjb2RlCiBjbGFzcyBVc2luZ0RlY2wgOiBwdWJsaWMgTmFtZWREZWNsIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgJ3VzaW5nJyBrZXl3b3JkIGl0c2VsZi4KICAgU291cmNlTG9jYXRpb24gVXNpbmdMb2NhdGlvbjsKQEAgLTI4NDgsNiArMjg4MiwxMSBAQAogICAgIH0KICAgfTsKIAorICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHNoYWRvd19pdGVyYXRvcj4gc2hhZG93X3JhbmdlOworCisgIHNoYWRvd19yYW5nZSBzaGFkb3dzKCkgY29uc3QgeworICAgIHJldHVybiBzaGFkb3dfcmFuZ2Uoc2hhZG93X2JlZ2luKCksIHNoYWRvd19lbmQoKSk7CisgIH0KICAgc2hhZG93X2l0ZXJhdG9yIHNoYWRvd19iZWdpbigpIGNvbnN0IHsKICAgICByZXR1cm4gc2hhZG93X2l0ZXJhdG9yKEZpcnN0VXNpbmdTaGFkb3cuZ2V0UG9pbnRlcigpKTsKICAgfQpAQCAtMjg3MCw3ICsyOTA5LDcgQEAKIAogICBzdGF0aWMgVXNpbmdEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOwogCi0gIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOwogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gY2xhc3NvZktpbmQoRC0+Z2V0S2luZCgpKTsgfQogICBzdGF0aWMgYm9vbCBjbGFzc29mS2luZChLaW5kIEspIHsgcmV0dXJuIEsgPT0gVXNpbmc7IH0KQEAgLTI4OTEsNyArMjkzMCw3IEBACiAvLy8gfTsKIC8vLyBcZW5kY29kZQogY2xhc3MgVW5yZXNvbHZlZFVzaW5nVmFsdWVEZWNsIDogcHVibGljIFZhbHVlRGVjbCB7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlICd1c2luZycga2V5d29yZAogICBTb3VyY2VMb2NhdGlvbiBVc2luZ0xvY2F0aW9uOwpAQCAtMjk0NCw3ICsyOTgzLDcgQEAKICAgc3RhdGljIFVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbCAqCiAgIENyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7CiAKLSAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFk7CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CiAgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBVbnJlc29sdmVkVXNpbmdWYWx1ZTsgfQpAQCAtMjk2NSw3ICszMDA0LDcgQEAKIC8vLyBUaGUgdHlwZSBhc3NvY2lhdGVkIHdpdGggYW4gdW5yZXNvbHZlZCB1c2luZyB0eXBlbmFtZSBkZWNsIGlzCiAvLy8gY3VycmVudGx5IGFsd2F5cyBhIHR5cGVuYW1lIHR5cGUuCiBjbGFzcyBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wgOiBwdWJsaWMgVHlwZURlY2wgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSAndHlwZW5hbWUnIGtleXdvcmQKICAgU291cmNlTG9jYXRpb24gVHlwZW5hbWVMb2NhdGlvbjsKQEAgLTMwNDMsNyArMzA4Miw3IEBACiAKICAgU291cmNlTG9jYXRpb24gZ2V0UlBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gUlBhcmVuTG9jOyB9CiAKLSAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKICAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0TG9jYXRpb24oKSwgZ2V0UlBhcmVuTG9jKCkpOwogICB9CiAKQEAgLTMwODMsMTQgKzMxMjIsMTcgQEAKIGNsYXNzIE1TUHJvcGVydHlEZWNsIDogcHVibGljIERlY2xhcmF0b3JEZWNsIHsKICAgSWRlbnRpZmllckluZm8gKkdldHRlcklkLCAqU2V0dGVySWQ7CiAKLXB1YmxpYzoKLSAgTVNQcm9wZXJ0eURlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBMLAotICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWUgTiwgUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlRJbmZvLAotICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydEwsIElkZW50aWZpZXJJbmZvICpHZXR0ZXIsCi0gICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpTZXR0ZXIpOgotICBEZWNsYXJhdG9yRGVjbChNU1Byb3BlcnR5LCBEQywgTCwgTiwgVCwgVEluZm8sIFN0YXJ0TCksIEdldHRlcklkKEdldHRlciksCi0gIFNldHRlcklkKFNldHRlcikge30KKyAgTVNQcm9wZXJ0eURlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBMLCBEZWNsYXJhdGlvbk5hbWUgTiwKKyAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBTb3VyY2VMb2NhdGlvbiBTdGFydEwsCisgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpHZXR0ZXIsIElkZW50aWZpZXJJbmZvICpTZXR0ZXIpCisgICAgICA6IERlY2xhcmF0b3JEZWNsKE1TUHJvcGVydHksIERDLCBMLCBOLCBULCBUSW5mbywgU3RhcnRMKSwKKyAgICAgICAgR2V0dGVySWQoR2V0dGVyKSwgU2V0dGVySWQoU2V0dGVyKSB7fQogCitwdWJsaWM6CisgIHN0YXRpYyBNU1Byb3BlcnR5RGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwgRGVjbGFyYXRpb25OYW1lIE4sIFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbywgU291cmNlTG9jYXRpb24gU3RhcnRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqR2V0dGVyLCBJZGVudGlmaWVySW5mbyAqU2V0dGVyKTsKICAgc3RhdGljIE1TUHJvcGVydHlEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOwogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVjbCAqRCkgeyByZXR1cm4gRC0+Z2V0S2luZCgpID09IE1TUHJvcGVydHk7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xDb250ZXh0SW50ZXJuYWxzLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsQ29udGV4dEludGVybmFscy5oCmluZGV4IDljNjI2YzguLmY4NWNlYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xDb250ZXh0SW50ZXJuYWxzLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbENvbnRleHRJbnRlcm5hbHMuaApAQCAtNDYsMTAgKzQ2LDggQEAKIHB1YmxpYzoKICAgU3RvcmVkRGVjbHNMaXN0KCkge30KIAotICBTdG9yZWREZWNsc0xpc3QoY29uc3QgU3RvcmVkRGVjbHNMaXN0ICZSSFMpIDogRGF0YShSSFMuRGF0YSkgewotICAgIGlmIChEZWNsc1R5ICpSSFNWZWMgPSBSSFMuZ2V0QXNWZWN0b3IoKSkKLSAgICAgIERhdGEgPSBEZWNsc0FuZEhhc0V4dGVybmFsVHkobmV3IERlY2xzVHkoKlJIU1ZlYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIUy5oYXNFeHRlcm5hbERlY2xzKCkpOworICBTdG9yZWREZWNsc0xpc3QoU3RvcmVkRGVjbHNMaXN0ICYmUkhTKSA6IERhdGEoUkhTLkRhdGEpIHsKKyAgICBSSFMuRGF0YSA9IChOYW1lZERlY2wgKikwOwogICB9CiAKICAgflN0b3JlZERlY2xzTGlzdCgpIHsKQEAgLTU4LDEyICs1NiwxMSBAQAogICAgICAgZGVsZXRlIFZlY3RvcjsKICAgfQogCi0gIFN0b3JlZERlY2xzTGlzdCAmb3BlcmF0b3I9KGNvbnN0IFN0b3JlZERlY2xzTGlzdCAmUkhTKSB7CisgIFN0b3JlZERlY2xzTGlzdCAmb3BlcmF0b3I9KFN0b3JlZERlY2xzTGlzdCAmJlJIUykgewogICAgIGlmIChEZWNsc1R5ICpWZWN0b3IgPSBnZXRBc1ZlY3RvcigpKQogICAgICAgZGVsZXRlIFZlY3RvcjsKICAgICBEYXRhID0gUkhTLkRhdGE7Ci0gICAgaWYgKERlY2xzVHkgKlJIU1ZlYyA9IFJIUy5nZXRBc1ZlY3RvcigpKQotICAgICAgRGF0YSA9IERlY2xzQW5kSGFzRXh0ZXJuYWxUeShuZXcgRGVjbHNUeSgqUkhTVmVjKSwgaGFzRXh0ZXJuYWxEZWNscygpKTsKKyAgICBSSFMuRGF0YSA9IChOYW1lZERlY2wgKikwOwogICAgIHJldHVybiAqdGhpczsKICAgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsRnJpZW5kLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsRnJpZW5kLmgKaW5kZXggYmU2ZjJlYi4uYmI4NTJkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbEZyaWVuZC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xGcmllbmQuaApAQCAtMTMyLDcgKzEzMiw3IEBACiAgIH0KIAogICAvLy8gUmV0cmlldmVzIHRoZSBzb3VyY2UgcmFuZ2UgZm9yIHRoZSBmcmllbmQgZGVjbGFyYXRpb24uCi0gIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CiAgICAgaWYgKE5hbWVkRGVjbCAqTkQgPSBnZXRGcmllbmREZWNsKCkpIHsKICAgICAgIGlmIChGdW5jdGlvblRlbXBsYXRlRGVjbCAqRlREID0gZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KE5EKSkKICAgICAgICAgcmV0dXJuIEZURC0+Z2V0U291cmNlUmFuZ2UoKTsKQEAgLTIyNyw2ICsyMjcsMTAgQEAKICAgcmV0dXJuIGZyaWVuZF9pdGVyYXRvcigwKTsKIH0KIAoraW5saW5lIENYWFJlY29yZERlY2w6OmZyaWVuZF9yYW5nZSBDWFhSZWNvcmREZWNsOjpmcmllbmRzKCkgY29uc3QgeworICByZXR1cm4gZnJpZW5kX3JhbmdlKGZyaWVuZF9iZWdpbigpLCBmcmllbmRfZW5kKCkpOworfQorCiBpbmxpbmUgdm9pZCBDWFhSZWNvcmREZWNsOjpwdXNoRnJpZW5kRGVjbChGcmllbmREZWNsICpGRCkgewogICBhc3NlcnQoIUZELT5OZXh0RnJpZW5kICYmICJmcmllbmQgYWxyZWFkeSBoYXMgbmV4dCBmcmllbmQ/Iik7CiAgIEZELT5OZXh0RnJpZW5kID0gZGF0YSgpLkZpcnN0RnJpZW5kOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbExvb2t1cHMuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xMb29rdXBzLmgKaW5kZXggYzE2OTc1YS4uZDIwMTZhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbExvb2t1cHMuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsTG9va3Vwcy5oCkBAIC02OCwzOCArNjgsNDAgQEAKICAgfQogfTsKIAotaW5saW5lIERlY2xDb250ZXh0OjphbGxfbG9va3Vwc19pdGVyYXRvciBEZWNsQ29udGV4dDo6bG9va3Vwc19iZWdpbigpIGNvbnN0IHsKK2lubGluZSBEZWNsQ29udGV4dDo6bG9va3Vwc19yYW5nZSBEZWNsQ29udGV4dDo6bG9va3VwcygpIGNvbnN0IHsKICAgRGVjbENvbnRleHQgKlByaW1hcnkgPSBjb25zdF9jYXN0PERlY2xDb250ZXh0Kj4odGhpcyktPmdldFByaW1hcnlDb250ZXh0KCk7CiAgIGlmIChQcmltYXJ5LT5oYXNFeHRlcm5hbFZpc2libGVTdG9yYWdlKCkpCiAgICAgZ2V0UGFyZW50QVNUQ29udGV4dCgpLmdldEV4dGVybmFsU291cmNlKCktPmNvbXBsZXRlVmlzaWJsZURlY2xzTWFwKFByaW1hcnkpOwogICBpZiAoU3RvcmVkRGVjbHNNYXAgKk1hcCA9IFByaW1hcnktPmJ1aWxkTG9va3VwKCkpCi0gICAgcmV0dXJuIGFsbF9sb29rdXBzX2l0ZXJhdG9yKE1hcC0+YmVnaW4oKSwgTWFwLT5lbmQoKSk7Ci0gIHJldHVybiBhbGxfbG9va3Vwc19pdGVyYXRvcigpOworICAgIHJldHVybiBsb29rdXBzX3JhbmdlKGFsbF9sb29rdXBzX2l0ZXJhdG9yKE1hcC0+YmVnaW4oKSwgTWFwLT5lbmQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2xvb2t1cHNfaXRlcmF0b3IoTWFwLT5lbmQoKSwgTWFwLT5lbmQoKSkpOworICByZXR1cm4gbG9va3Vwc19yYW5nZSgpOworfQorCitpbmxpbmUgRGVjbENvbnRleHQ6OmFsbF9sb29rdXBzX2l0ZXJhdG9yIERlY2xDb250ZXh0Ojpsb29rdXBzX2JlZ2luKCkgY29uc3QgeworICByZXR1cm4gbG9va3VwcygpLmJlZ2luKCk7CiB9CiAKIGlubGluZSBEZWNsQ29udGV4dDo6YWxsX2xvb2t1cHNfaXRlcmF0b3IgRGVjbENvbnRleHQ6Omxvb2t1cHNfZW5kKCkgY29uc3QgeworICByZXR1cm4gbG9va3VwcygpLmVuZCgpOworfQorCitpbmxpbmUgRGVjbENvbnRleHQ6Omxvb2t1cHNfcmFuZ2UgRGVjbENvbnRleHQ6Om5vbG9hZF9sb29rdXBzKCkgY29uc3QgewogICBEZWNsQ29udGV4dCAqUHJpbWFyeSA9IGNvbnN0X2Nhc3Q8RGVjbENvbnRleHQqPih0aGlzKS0+Z2V0UHJpbWFyeUNvbnRleHQoKTsKLSAgaWYgKFByaW1hcnktPmhhc0V4dGVybmFsVmlzaWJsZVN0b3JhZ2UoKSkKLSAgICBnZXRQYXJlbnRBU1RDb250ZXh0KCkuZ2V0RXh0ZXJuYWxTb3VyY2UoKS0+Y29tcGxldGVWaXNpYmxlRGVjbHNNYXAoUHJpbWFyeSk7Ci0gIGlmIChTdG9yZWREZWNsc01hcCAqTWFwID0gUHJpbWFyeS0+YnVpbGRMb29rdXAoKSkKLSAgICByZXR1cm4gYWxsX2xvb2t1cHNfaXRlcmF0b3IoTWFwLT5lbmQoKSwgTWFwLT5lbmQoKSk7Ci0gIHJldHVybiBhbGxfbG9va3Vwc19pdGVyYXRvcigpOworICBpZiAoU3RvcmVkRGVjbHNNYXAgKk1hcCA9IFByaW1hcnktPmdldExvb2t1cFB0cigpKQorICAgIHJldHVybiBsb29rdXBzX3JhbmdlKGFsbF9sb29rdXBzX2l0ZXJhdG9yKE1hcC0+YmVnaW4oKSwgTWFwLT5lbmQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2xvb2t1cHNfaXRlcmF0b3IoTWFwLT5lbmQoKSwgTWFwLT5lbmQoKSkpOworICByZXR1cm4gbG9va3Vwc19yYW5nZSgpOwogfQogCiBpbmxpbmUKIERlY2xDb250ZXh0OjphbGxfbG9va3Vwc19pdGVyYXRvciBEZWNsQ29udGV4dDo6bm9sb2FkX2xvb2t1cHNfYmVnaW4oKSBjb25zdCB7Ci0gIERlY2xDb250ZXh0ICpQcmltYXJ5ID0gY29uc3RfY2FzdDxEZWNsQ29udGV4dCo+KHRoaXMpLT5nZXRQcmltYXJ5Q29udGV4dCgpOwotICBpZiAoU3RvcmVkRGVjbHNNYXAgKk1hcCA9IFByaW1hcnktPmdldExvb2t1cFB0cigpKQotICAgIHJldHVybiBhbGxfbG9va3Vwc19pdGVyYXRvcihNYXAtPmJlZ2luKCksIE1hcC0+ZW5kKCkpOwotICByZXR1cm4gYWxsX2xvb2t1cHNfaXRlcmF0b3IoKTsKKyAgcmV0dXJuIG5vbG9hZF9sb29rdXBzKCkuYmVnaW4oKTsKIH0KIAogaW5saW5lCiBEZWNsQ29udGV4dDo6YWxsX2xvb2t1cHNfaXRlcmF0b3IgRGVjbENvbnRleHQ6Om5vbG9hZF9sb29rdXBzX2VuZCgpIGNvbnN0IHsKLSAgRGVjbENvbnRleHQgKlByaW1hcnkgPSBjb25zdF9jYXN0PERlY2xDb250ZXh0Kj4odGhpcyktPmdldFByaW1hcnlDb250ZXh0KCk7Ci0gIGlmIChTdG9yZWREZWNsc01hcCAqTWFwID0gUHJpbWFyeS0+Z2V0TG9va3VwUHRyKCkpCi0gICAgcmV0dXJuIGFsbF9sb29rdXBzX2l0ZXJhdG9yKE1hcC0+ZW5kKCksIE1hcC0+ZW5kKCkpOwotICByZXR1cm4gYWxsX2xvb2t1cHNfaXRlcmF0b3IoKTsKKyAgcmV0dXJuIG5vbG9hZF9sb29rdXBzKCkuZW5kKCk7CiB9CiAKIH0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbE9iakMuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xPYmpDLmgKaW5kZXggMmU3NjBkNi4uY2RkN2QyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbE9iakMuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsT2JqQy5oCkBAIC0xNjIsMTEgKzE2MiwxMSBAQAogICAvLy8gXGJyaWVmIEluZGljYXRlcyBpZiB0aGUgbWV0aG9kIHdhcyBhIGRlZmluaXRpb24gYnV0IGl0cyBib2R5IHdhcyBza2lwcGVkLgogICB1bnNpZ25lZCBIYXNTa2lwcGVkQm9keSA6IDE7CiAKLSAgLy8gUmVzdWx0IHR5cGUgb2YgdGhpcyBtZXRob2QuCisgIC8vIFJldHVybiB0eXBlIG9mIHRoaXMgbWV0aG9kLgogICBRdWFsVHlwZSBNZXRob2REZWNsVHlwZTsKIAotICAvLyBUeXBlIHNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlc3VsdCB0eXBlLgotICBUeXBlU291cmNlSW5mbyAqUmVzdWx0VEluZm87CisgIC8vIFR5cGUgc291cmNlIGluZm9ybWF0aW9uIGZvciB0aGUgcmV0dXJuIHR5cGUuCisgIFR5cGVTb3VyY2VJbmZvICpSZXR1cm5USW5mbzsKIAogICAvLy8gXGJyaWVmIEFycmF5IG9mIFBhcm1WYXJEZWNscyBmb3IgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mIHRoaXMgbWV0aG9kCiAgIC8vLyBhbmQgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBzZWxlY3RvciBsb2NhdGlvbnMuCkBAIC0yMjQsNTQgKzIyNCw0MyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IFNlbExvY3MpOwogCiAgIE9iakNNZXRob2REZWNsKFNvdXJjZUxvY2F0aW9uIGJlZ2luTG9jLCBTb3VyY2VMb2NhdGlvbiBlbmRMb2MsCi0gICAgICAgICAgICAgICAgIFNlbGVjdG9yIFNlbEluZm8sIFF1YWxUeXBlIFQsCi0gICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpSZXN1bHRUSW5mbywKLSAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQgKmNvbnRleHREZWNsLAotICAgICAgICAgICAgICAgICBib29sIGlzSW5zdGFuY2UgPSB0cnVlLAotICAgICAgICAgICAgICAgICBib29sIGlzVmFyaWFkaWMgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgYm9vbCBpc1Byb3BlcnR5QWNjZXNzb3IgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgYm9vbCBpc0ltcGxpY2l0bHlEZWNsYXJlZCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICBib29sIGlzRGVmaW5lZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICBTZWxlY3RvciBTZWxJbmZvLCBRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyAqUmV0dXJuVEluZm8sCisgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpjb250ZXh0RGVjbCwgYm9vbCBpc0luc3RhbmNlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhcmlhZGljID0gZmFsc2UsIGJvb2wgaXNQcm9wZXJ0eUFjY2Vzc29yID0gZmFsc2UsCisgICAgICAgICAgICAgICAgIGJvb2wgaXNJbXBsaWNpdGx5RGVjbGFyZWQgPSBmYWxzZSwgYm9vbCBpc0RlZmluZWQgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgSW1wbGVtZW50YXRpb25Db250cm9sIGltcENvbnRyb2wgPSBOb25lLAogICAgICAgICAgICAgICAgICBib29sIEhhc1JlbGF0ZWRSZXN1bHRUeXBlID0gZmFsc2UpCi0gIDogTmFtZWREZWNsKE9iakNNZXRob2QsIGNvbnRleHREZWNsLCBiZWdpbkxvYywgU2VsSW5mbyksCi0gICAgRGVjbENvbnRleHQoT2JqQ01ldGhvZCksIEZhbWlseShJbnZhbGlkT2JqQ01ldGhvZEZhbWlseSksCi0gICAgSXNJbnN0YW5jZShpc0luc3RhbmNlKSwgSXNWYXJpYWRpYyhpc1ZhcmlhZGljKSwKLSAgICBJc1Byb3BlcnR5QWNjZXNzb3IoaXNQcm9wZXJ0eUFjY2Vzc29yKSwKLSAgICBJc0RlZmluZWQoaXNEZWZpbmVkKSwgSXNSZWRlY2xhcmF0aW9uKDApLCBIYXNSZWRlY2xhcmF0aW9uKDApLAotICAgIERlY2xJbXBsZW1lbnRhdGlvbihpbXBDb250cm9sKSwgb2JqY0RlY2xRdWFsaWZpZXIoT0JKQ19UUV9Ob25lKSwKLSAgICBSZWxhdGVkUmVzdWx0VHlwZShIYXNSZWxhdGVkUmVzdWx0VHlwZSksCi0gICAgU2VsTG9jc0tpbmQoU2VsTG9jX1N0YW5kYXJkTm9TcGFjZSksIElzT3ZlcnJpZGluZygwKSwgSGFzU2tpcHBlZEJvZHkoMCksCi0gICAgTWV0aG9kRGVjbFR5cGUoVCksIFJlc3VsdFRJbmZvKFJlc3VsdFRJbmZvKSwKLSAgICBQYXJhbXNBbmRTZWxMb2NzKDApLCBOdW1QYXJhbXMoMCksCi0gICAgRGVjbEVuZExvYyhlbmRMb2MpLCBCb2R5KCksIFNlbGZEZWNsKDApLCBDbWREZWNsKDApIHsKKyAgICAgIDogTmFtZWREZWNsKE9iakNNZXRob2QsIGNvbnRleHREZWNsLCBiZWdpbkxvYywgU2VsSW5mbyksCisgICAgICAgIERlY2xDb250ZXh0KE9iakNNZXRob2QpLCBGYW1pbHkoSW52YWxpZE9iakNNZXRob2RGYW1pbHkpLAorICAgICAgICBJc0luc3RhbmNlKGlzSW5zdGFuY2UpLCBJc1ZhcmlhZGljKGlzVmFyaWFkaWMpLAorICAgICAgICBJc1Byb3BlcnR5QWNjZXNzb3IoaXNQcm9wZXJ0eUFjY2Vzc29yKSwgSXNEZWZpbmVkKGlzRGVmaW5lZCksCisgICAgICAgIElzUmVkZWNsYXJhdGlvbigwKSwgSGFzUmVkZWNsYXJhdGlvbigwKSwgRGVjbEltcGxlbWVudGF0aW9uKGltcENvbnRyb2wpLAorICAgICAgICBvYmpjRGVjbFF1YWxpZmllcihPQkpDX1RRX05vbmUpLAorICAgICAgICBSZWxhdGVkUmVzdWx0VHlwZShIYXNSZWxhdGVkUmVzdWx0VHlwZSksCisgICAgICAgIFNlbExvY3NLaW5kKFNlbExvY19TdGFuZGFyZE5vU3BhY2UpLCBJc092ZXJyaWRpbmcoMCksIEhhc1NraXBwZWRCb2R5KDApLAorICAgICAgICBNZXRob2REZWNsVHlwZShUKSwgUmV0dXJuVEluZm8oUmV0dXJuVEluZm8pLCBQYXJhbXNBbmRTZWxMb2NzKDApLAorICAgICAgICBOdW1QYXJhbXMoMCksIERlY2xFbmRMb2MoZW5kTG9jKSwgQm9keSgpLCBTZWxmRGVjbCgwKSwgQ21kRGVjbCgwKSB7CiAgICAgc2V0SW1wbGljaXQoaXNJbXBsaWNpdGx5RGVjbGFyZWQpOwogICB9CiAKICAgLy8vIFxicmllZiBBIGRlZmluaXRpb24gd2lsbCByZXR1cm4gaXRzIGludGVyZmFjZSBkZWNsYXJhdGlvbi4KICAgLy8vIEFuIGludGVyZmFjZSBkZWNsYXJhdGlvbiB3aWxsIHJldHVybiBpdHMgZGVmaW5pdGlvbi4KICAgLy8vIE90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBpdHNlbGYuCi0gIHZpcnR1YWwgT2JqQ01ldGhvZERlY2wgKmdldE5leHRSZWRlY2xhcmF0aW9uKCk7CisgIE9iakNNZXRob2REZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbigpIG92ZXJyaWRlOwogCiBwdWJsaWM6Ci0gIHN0YXRpYyBPYmpDTWV0aG9kRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGJlZ2luTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBlbmRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIFNlbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpSZXN1bHRUSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQgKmNvbnRleHREZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzSW5zdGFuY2UgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyaWFkaWMgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1Byb3BlcnR5QWNjZXNzb3IgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0ltcGxpY2l0bHlEZWNsYXJlZCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGVmaW5lZCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBsZW1lbnRhdGlvbkNvbnRyb2wgaW1wQ29udHJvbCA9IE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzUmVsYXRlZFJlc3VsdFR5cGUgPSBmYWxzZSk7CisgIHN0YXRpYyBPYmpDTWV0aG9kRGVjbCAqCisgIENyZWF0ZShBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBiZWdpbkxvYywgU291cmNlTG9jYXRpb24gZW5kTG9jLAorICAgICAgICAgU2VsZWN0b3IgU2VsSW5mbywgUXVhbFR5cGUgVCwgVHlwZVNvdXJjZUluZm8gKlJldHVyblRJbmZvLAorICAgICAgICAgRGVjbENvbnRleHQgKmNvbnRleHREZWNsLCBib29sIGlzSW5zdGFuY2UgPSB0cnVlLAorICAgICAgICAgYm9vbCBpc1ZhcmlhZGljID0gZmFsc2UsIGJvb2wgaXNQcm9wZXJ0eUFjY2Vzc29yID0gZmFsc2UsCisgICAgICAgICBib29sIGlzSW1wbGljaXRseURlY2xhcmVkID0gZmFsc2UsIGJvb2wgaXNEZWZpbmVkID0gZmFsc2UsCisgICAgICAgICBJbXBsZW1lbnRhdGlvbkNvbnRyb2wgaW1wQ29udHJvbCA9IE5vbmUsCisgICAgICAgICBib29sIEhhc1JlbGF0ZWRSZXN1bHRUeXBlID0gZmFsc2UpOwogCiAgIHN0YXRpYyBPYmpDTWV0aG9kRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKLSAgCi0gIHZpcnR1YWwgT2JqQ01ldGhvZERlY2wgKmdldENhbm9uaWNhbERlY2woKTsKKworICBPYmpDTWV0aG9kRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlOwogICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsKICAgICByZXR1cm4gY29uc3RfY2FzdDxPYmpDTWV0aG9kRGVjbCo+KHRoaXMpLT5nZXRDYW5vbmljYWxEZWNsKCk7CiAgIH0KQEAgLTMwMCw3ICsyODksNyBAQAogICAvLyBMb2NhdGlvbiBpbmZvcm1hdGlvbiwgbW9kZWxlZCBhZnRlciB0aGUgU3RtdCBBUEkuCiAgIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBnZXRMb2NhdGlvbigpOyB9CiAgIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IExMVk1fUkVBRE9OTFk7Ci0gIHZpcnR1YWwgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKICAgICByZXR1cm4gU291cmNlUmFuZ2UoZ2V0TG9jYXRpb24oKSwgZ2V0TG9jRW5kKCkpOwogICB9CiAKQEAgLTMxNCw4ICszMDMsNyBAQAogICAgIGlmIChoYXNTdGFuZGFyZFNlbExvY3MoKSkKICAgICAgIHJldHVybiBnZXRTdGFuZGFyZFNlbGVjdG9yTG9jKEluZGV4LCBnZXRTZWxlY3RvcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZWxMb2NzS2luZCgpID09IFNlbExvY19TdGFuZGFyZFdpdGhTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBsbHZtOjptYWtlQXJyYXlSZWYoY29uc3RfY2FzdDxQYXJtVmFyRGVjbCoqPihnZXRQYXJhbXMoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xFbmRMb2MpOwogICAgIHJldHVybiBnZXRTdG9yZWRTZWxMb2NzKClbSW5kZXhdOwogICB9CkBAIC0zMzgsMzIgKzMyNiw1MiBAQAogCiAgIFNlbGVjdG9yIGdldFNlbGVjdG9yKCkgY29uc3QgeyByZXR1cm4gZ2V0RGVjbE5hbWUoKS5nZXRPYmpDU2VsZWN0b3IoKTsgfQogCi0gIFF1YWxUeXBlIGdldFJlc3VsdFR5cGUoKSBjb25zdCB7IHJldHVybiBNZXRob2REZWNsVHlwZTsgfQotICB2b2lkIHNldFJlc3VsdFR5cGUoUXVhbFR5cGUgVCkgeyBNZXRob2REZWNsVHlwZSA9IFQ7IH0KKyAgUXVhbFR5cGUgZ2V0UmV0dXJuVHlwZSgpIGNvbnN0IHsgcmV0dXJuIE1ldGhvZERlY2xUeXBlOyB9CisgIHZvaWQgc2V0UmV0dXJuVHlwZShRdWFsVHlwZSBUKSB7IE1ldGhvZERlY2xUeXBlID0gVDsgfQogCiAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuIGV4cHJlc3Npb24gdGhhdCBzZW5kcyBhIG1lc3NhZ2UgdG8gdGhpcwogICAvLy8gZnVuY3Rpb24uCiAgIFF1YWxUeXBlIGdldFNlbmRSZXN1bHRUeXBlKCkgY29uc3QgewotICAgIHJldHVybiBnZXRSZXN1bHRUeXBlKCkuZ2V0Tm9uTFZhbHVlRXhwclR5cGUoZ2V0QVNUQ29udGV4dCgpKTsKKyAgICByZXR1cm4gZ2V0UmV0dXJuVHlwZSgpLmdldE5vbkxWYWx1ZUV4cHJUeXBlKGdldEFTVENvbnRleHQoKSk7CiAgIH0KIAotICBUeXBlU291cmNlSW5mbyAqZ2V0UmVzdWx0VHlwZVNvdXJjZUluZm8oKSBjb25zdCB7IHJldHVybiBSZXN1bHRUSW5mbzsgfQotICB2b2lkIHNldFJlc3VsdFR5cGVTb3VyY2VJbmZvKFR5cGVTb3VyY2VJbmZvICpUSW5mbykgeyBSZXN1bHRUSW5mbyA9IFRJbmZvOyB9CisgIFR5cGVTb3VyY2VJbmZvICpnZXRSZXR1cm5UeXBlU291cmNlSW5mbygpIGNvbnN0IHsgcmV0dXJuIFJldHVyblRJbmZvOyB9CisgIHZvaWQgc2V0UmV0dXJuVHlwZVNvdXJjZUluZm8oVHlwZVNvdXJjZUluZm8gKlRJbmZvKSB7IFJldHVyblRJbmZvID0gVEluZm87IH0KIAogICAvLyBJdGVyYXRvciBhY2Nlc3MgdG8gZm9ybWFsIHBhcmFtZXRlcnMuCiAgIHVuc2lnbmVkIHBhcmFtX3NpemUoKSBjb25zdCB7IHJldHVybiBOdW1QYXJhbXM7IH0KICAgdHlwZWRlZiBjb25zdCBQYXJtVmFyRGVjbCAqY29uc3QgKnBhcmFtX2NvbnN0X2l0ZXJhdG9yOwogICB0eXBlZGVmIFBhcm1WYXJEZWNsICpjb25zdCAqcGFyYW1faXRlcmF0b3I7Ci0gIHBhcmFtX2NvbnN0X2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0UGFyYW1zKCk7IH0KLSAgcGFyYW1fY29uc3RfaXRlcmF0b3IgcGFyYW1fZW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0UGFyYW1zKCkgKyBOdW1QYXJhbXM7IH0KLSAgcGFyYW1faXRlcmF0b3IgcGFyYW1fYmVnaW4oKSB7IHJldHVybiBnZXRQYXJhbXMoKTsgfQotICBwYXJhbV9pdGVyYXRvciBwYXJhbV9lbmQoKSB7IHJldHVybiBnZXRQYXJhbXMoKSArIE51bVBhcmFtczsgfQorICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHBhcmFtX2l0ZXJhdG9yPiBwYXJhbV9yYW5nZTsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxwYXJhbV9jb25zdF9pdGVyYXRvcj4gcGFyYW1fY29uc3RfcmFuZ2U7CisKKyAgcGFyYW1fcmFuZ2UgcGFyYW1zKCkgeyByZXR1cm4gcGFyYW1fcmFuZ2UocGFyYW1fYmVnaW4oKSwgcGFyYW1fZW5kKCkpOyB9CisgIHBhcmFtX2NvbnN0X3JhbmdlIHBhcmFtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gcGFyYW1fY29uc3RfcmFuZ2UocGFyYW1fYmVnaW4oKSwgcGFyYW1fZW5kKCkpOworICB9CisKKyAgcGFyYW1fY29uc3RfaXRlcmF0b3IgcGFyYW1fYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtX2NvbnN0X2l0ZXJhdG9yKGdldFBhcmFtcygpKTsKKyAgfQorICBwYXJhbV9jb25zdF9pdGVyYXRvciBwYXJhbV9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtX2NvbnN0X2l0ZXJhdG9yKGdldFBhcmFtcygpICsgTnVtUGFyYW1zKTsKKyAgfQorICBwYXJhbV9pdGVyYXRvciBwYXJhbV9iZWdpbigpIHsgcmV0dXJuIHBhcmFtX2l0ZXJhdG9yKGdldFBhcmFtcygpKTsgfQorICBwYXJhbV9pdGVyYXRvciBwYXJhbV9lbmQoKSB7IHJldHVybiBwYXJhbV9pdGVyYXRvcihnZXRQYXJhbXMoKSArIE51bVBhcmFtcyk7IH0KKwogICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIGFuZCBvZiB0aGUgcGFyYW1ldGVycyB3aGljaCBhcmUgcGFydCBvZiB0aGUgc2VsZWN0b3IKICAgLy8gbmFtZSBtYW5nbGluZyByZXF1aXJlbWVudHMuCiAgIHBhcmFtX2NvbnN0X2l0ZXJhdG9yIHNlbF9wYXJhbV9lbmQoKSBjb25zdCB7CiAgICAgcmV0dXJuIHBhcmFtX2JlZ2luKCkgKyBnZXRTZWxlY3RvcigpLmdldE51bUFyZ3MoKTsKICAgfQogCisgIC8vIEFycmF5UmVmIGFjY2VzcyB0byBmb3JtYWwgcGFyYW1ldGVycy4gIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkKKyAgLy8gcmVwbGFjZSB0aGUgaXRlcmF0b3IgaW50ZXJmYWNlIGFib3ZlLgorICBBcnJheVJlZjxQYXJtVmFyRGVjbCo+IHBhcmFtZXRlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGxsdm06Om1ha2VBcnJheVJlZihjb25zdF9jYXN0PFBhcm1WYXJEZWNsKio+KGdldFBhcmFtcygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVBhcmFtcyk7CisgIH0KKwogICAvLy8gXGJyaWVmIFNldHMgdGhlIG1ldGhvZCdzIHBhcmFtZXRlcnMgYW5kIHNlbGVjdG9yIHNvdXJjZSBsb2NhdGlvbnMuCiAgIC8vLyBJZiB0aGUgbWV0aG9kIGlzIGltcGxpY2l0IChub3QgY29taW5nIGZyb20gc291cmNlKSBccCBTZWxMb2NzIGlzCiAgIC8vLyBpZ25vcmVkLgpAQCAtMzc1LDEyICszODMsMTIgQEAKICAgLy8gSXRlcmF0b3IgYWNjZXNzIHRvIHBhcmFtZXRlciB0eXBlcy4KICAgdHlwZWRlZiBzdGQ6OmNvbnN0X21lbV9mdW5fdDxRdWFsVHlwZSwgUGFybVZhckRlY2w+IGRlcmVmX2Z1bjsKICAgdHlwZWRlZiBsbHZtOjptYXBwZWRfaXRlcmF0b3I8cGFyYW1fY29uc3RfaXRlcmF0b3IsIGRlcmVmX2Z1bj4KLSAgICAgIGFyZ190eXBlX2l0ZXJhdG9yOworICBwYXJhbV90eXBlX2l0ZXJhdG9yOwogCi0gIGFyZ190eXBlX2l0ZXJhdG9yIGFyZ190eXBlX2JlZ2luKCkgY29uc3QgeworICBwYXJhbV90eXBlX2l0ZXJhdG9yIHBhcmFtX3R5cGVfYmVnaW4oKSBjb25zdCB7CiAgICAgcmV0dXJuIGxsdm06Om1hcF9pdGVyYXRvcihwYXJhbV9iZWdpbigpLCBkZXJlZl9mdW4oJlBhcm1WYXJEZWNsOjpnZXRUeXBlKSk7CiAgIH0KLSAgYXJnX3R5cGVfaXRlcmF0b3IgYXJnX3R5cGVfZW5kKCkgY29uc3QgeworICBwYXJhbV90eXBlX2l0ZXJhdG9yIHBhcmFtX3R5cGVfZW5kKCkgY29uc3QgewogICAgIHJldHVybiBsbHZtOjptYXBfaXRlcmF0b3IocGFyYW1fZW5kKCksIGRlcmVmX2Z1bigmUGFybVZhckRlY2w6OmdldFR5cGUpKTsKICAgfQogCkBAIC00NTEsMTEgKzQ1OSwyNCBAQAogICAgIHJldHVybiBJbXBsZW1lbnRhdGlvbkNvbnRyb2woRGVjbEltcGxlbWVudGF0aW9uKTsKICAgfQogCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBzcGVjaWZpYyBtZXRob2QgZGVjbGFyYXRpb24gaXMgbWFya2VkIHdpdGggdGhlCisgIC8vLyBkZXNpZ25hdGVkIGluaXRpYWxpemVyIGF0dHJpYnV0ZS4KKyAgYm9vbCBpc1RoaXNEZWNsYXJhdGlvbkFEZXNpZ25hdGVkSW5pdGlhbGl6ZXIoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2Qgc2VsZWN0b3IgcmVzb2x2ZXMgdG8gYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyCisgIC8vLyBpbiB0aGUgY2xhc3MncyBpbnRlcmZhY2UuCisgIC8vLworICAvLy8gXHBhcmFtIEluaXRNZXRob2QgaWYgbm9uLW51bGwgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUsIGl0IHJlY2VpdmVzCisgIC8vLyB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uIHRoYXQgd2FzIG1hcmtlZCB3aXRoIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyCisgIC8vLyBhdHRyaWJ1dGUuCisgIGJvb2wgaXNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJGb3JUaGVJbnRlcmZhY2UoCisgICAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqKkluaXRNZXRob2QgPSAwKSBjb25zdDsKKwogICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgbWV0aG9kIGhhcyBhIGJvZHkuCi0gIHZpcnR1YWwgYm9vbCBoYXNCb2R5KCkgY29uc3QgeyByZXR1cm4gQm9keS5pc1ZhbGlkKCk7IH0KKyAgYm9vbCBoYXNCb2R5KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQm9keS5pc1ZhbGlkKCk7IH0KIAogICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kLCBpZiBpdCBoYXMgb25lLgotICB2aXJ0dWFsIFN0bXQgKmdldEJvZHkoKSBjb25zdDsKKyAgU3RtdCAqZ2V0Qm9keSgpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHZvaWQgc2V0TGF6eUJvZHkodWludDY0X3QgT2Zmc2V0KSB7IEJvZHkgPSBPZmZzZXQ7IH0KIApAQCAtNDg0LDcgKzUwNSw3IEBACiAvLy8gT2JqQ1Byb3RvY29sRGVjbCwgYW5kIE9iakNJbXBsRGVjbC4KIC8vLwogY2xhc3MgT2JqQ0NvbnRhaW5lckRlY2wgOiBwdWJsaWMgTmFtZWREZWNsLCBwdWJsaWMgRGVjbENvbnRleHQgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAKICAgU291cmNlTG9jYXRpb24gQXRTdGFydDsKIApAQCAtNTAwLDYgKzUyMSwxMCBAQAogCiAgIC8vIEl0ZXJhdG9yIGFjY2VzcyB0byBwcm9wZXJ0aWVzLgogICB0eXBlZGVmIHNwZWNpZmljX2RlY2xfaXRlcmF0b3I8T2JqQ1Byb3BlcnR5RGVjbD4gcHJvcF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPE9iakNQcm9wZXJ0eURlY2w+PgorICAgIHByb3BfcmFuZ2U7CisKKyAgcHJvcF9yYW5nZSBwcm9wZXJ0aWVzKCkgY29uc3QgeyByZXR1cm4gcHJvcF9yYW5nZShwcm9wX2JlZ2luKCksIHByb3BfZW5kKCkpOyB9CiAgIHByb3BfaXRlcmF0b3IgcHJvcF9iZWdpbigpIGNvbnN0IHsKICAgICByZXR1cm4gcHJvcF9pdGVyYXRvcihkZWNsc19iZWdpbigpKTsKICAgfQpAQCAtNTA5LDYgKzUzNCwxMiBAQAogCiAgIC8vIEl0ZXJhdG9yIGFjY2VzcyB0byBpbnN0YW5jZS9jbGFzcyBtZXRob2RzLgogICB0eXBlZGVmIHNwZWNpZmljX2RlY2xfaXRlcmF0b3I8T2JqQ01ldGhvZERlY2w+IG1ldGhvZF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPE9iakNNZXRob2REZWNsPj4KKyAgICBtZXRob2RfcmFuZ2U7CisKKyAgbWV0aG9kX3JhbmdlIG1ldGhvZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ldGhvZF9yYW5nZShtZXRoX2JlZ2luKCksIG1ldGhfZW5kKCkpOworICB9CiAgIG1ldGhvZF9pdGVyYXRvciBtZXRoX2JlZ2luKCkgY29uc3QgewogICAgIHJldHVybiBtZXRob2RfaXRlcmF0b3IoZGVjbHNfYmVnaW4oKSk7CiAgIH0KQEAgLTUxOSw2ICs1NTAsMTEgQEAKICAgdHlwZWRlZiBmaWx0ZXJlZF9kZWNsX2l0ZXJhdG9yPE9iakNNZXRob2REZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk9iakNNZXRob2REZWNsOjppc0luc3RhbmNlTWV0aG9kPgogICAgIGluc3RtZXRoX2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGluc3RtZXRoX2l0ZXJhdG9yPiBpbnN0bWV0aF9yYW5nZTsKKworICBpbnN0bWV0aF9yYW5nZSBpbnN0YW5jZV9tZXRob2RzKCkgY29uc3QgeworICAgIHJldHVybiBpbnN0bWV0aF9yYW5nZShpbnN0bWV0aF9iZWdpbigpLCBpbnN0bWV0aF9lbmQoKSk7CisgIH0KICAgaW5zdG1ldGhfaXRlcmF0b3IgaW5zdG1ldGhfYmVnaW4oKSBjb25zdCB7CiAgICAgcmV0dXJuIGluc3RtZXRoX2l0ZXJhdG9yKGRlY2xzX2JlZ2luKCkpOwogICB9CkBAIC01MjksNiArNTY1LDExIEBACiAgIHR5cGVkZWYgZmlsdGVyZWRfZGVjbF9pdGVyYXRvcjxPYmpDTWV0aG9kRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZPYmpDTWV0aG9kRGVjbDo6aXNDbGFzc01ldGhvZD4KICAgICBjbGFzc21ldGhfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Y2xhc3NtZXRoX2l0ZXJhdG9yPiBjbGFzc21ldGhfcmFuZ2U7CisKKyAgY2xhc3NtZXRoX3JhbmdlIGNsYXNzX21ldGhvZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNsYXNzbWV0aF9yYW5nZShjbGFzc21ldGhfYmVnaW4oKSwgY2xhc3NtZXRoX2VuZCgpKTsKKyAgfQogICBjbGFzc21ldGhfaXRlcmF0b3IgY2xhc3NtZXRoX2JlZ2luKCkgY29uc3QgewogICAgIHJldHVybiBjbGFzc21ldGhfaXRlcmF0b3IoZGVjbHNfYmVnaW4oKSk7CiAgIH0KQEAgLTU3NSw3ICs2MTYsNyBAQAogICAgIEF0RW5kID0gYXRFbmQ7CiAgIH0KIAotICB2aXJ0dWFsIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CiAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKEF0U3RhcnQsIGdldEF0RW5kUmFuZ2UoKS5nZXRFbmQoKSk7CiAgIH0KIApAQCAtNjIxLDcgKzY2Miw3IEBACiAvLy8KIGNsYXNzIE9iakNJbnRlcmZhY2VEZWNsIDogcHVibGljIE9iakNDb250YWluZXJEZWNsCiAgICAgICAgICAgICAgICAgICAgICAgICAsIHB1YmxpYyBSZWRlY2xhcmFibGU8T2JqQ0ludGVyZmFjZURlY2w+IHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogCiAgIC8vLyBUeXBlRm9yRGVjbCAtIFRoaXMgaW5kaWNhdGVzIHRoZSBUeXBlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhpcwogICAvLy8gVHlwZURlY2wuICBJdCBpcyBhIGNhY2hlIG1haW50YWluZWQgYnkgQVNUQ29udGV4dDo6Z2V0T2JqQ0ludGVyZmFjZVR5cGUKQEAgLTY2MSw2ICs3MDIsMjIgQEAKICAgICAvLy8gZGVjbGFyZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uLgogICAgIG11dGFibGUgYm9vbCBJdmFyTGlzdE1pc3NpbmdJbXBsZW1lbnRhdGlvbiA6IDE7CiAKKyAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhpcyBpbnRlcmZhY2UgZGVjbCBjb250YWlucyBhdCBsZWFzdCBvbmUgaW5pdGlhbGl6ZXIKKyAgICAvLy8gbWFya2VkIHdpdGggdGhlICdvYmpjX2Rlc2lnbmF0ZWRfaW5pdGlhbGl6ZXInIGF0dHJpYnV0ZS4KKyAgICBib29sIEhhc0Rlc2lnbmF0ZWRJbml0aWFsaXplcnMgOiAxOworCisgICAgZW51bSBJbmhlcml0ZWREZXNpZ25hdGVkSW5pdGlhbGl6ZXJzU3RhdGUgeworICAgICAgLy8vIFdlIGRpZG4ndCBjYWxjdWxhdGUgd2hldGhlciB0aGUgZGVzaWduYXRlZCBpbml0aWFsaXplcnMgc2hvdWxkIGJlCisgICAgICAvLy8gaW5oZXJpdGVkIG9yIG5vdC4KKyAgICAgIElESV9Vbmtub3duID0gMCwKKyAgICAgIC8vLyBEZXNpZ25hdGVkIGluaXRpYWxpemVycyBhcmUgaW5oZXJpdGVkIGZvciB0aGUgc3VwZXIgY2xhc3MuCisgICAgICBJRElfSW5oZXJpdGVkID0gMSwKKyAgICAgIC8vLyBUaGUgY2xhc3MgZG9lcyBub3QgaW5oZXJpdCBkZXNpZ25hdGVkIGluaXRpYWxpemVycy4KKyAgICAgIElESV9Ob3RJbmhlcml0ZWQgPSAyCisgICAgfTsKKyAgICAvLy8gT25lIG9mIHRoZSBcYyBJbmhlcml0ZWREZXNpZ25hdGVkSW5pdGlhbGl6ZXJzU3RhdGUgZW51bWVyYXRvcy4KKyAgICBtdXRhYmxlIHVuc2lnbmVkIEluaGVyaXRlZERlc2lnbmF0ZWRJbml0aWFsaXplcnMgOiAyOworCiAgICAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIHN1cGVyY2xhc3MsIGlmIGFueS4KICAgICBTb3VyY2VMb2NhdGlvbiBTdXBlckNsYXNzTG9jOwogICAgIApAQCAtNjcxLDcgKzcyOCw5IEBACiAKICAgICBEZWZpbml0aW9uRGF0YSgpIDogRGVmaW5pdGlvbigpLCBTdXBlckNsYXNzKCksIENhdGVnb3J5TGlzdCgpLCBJdmFyTGlzdCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxseUNvbXBsZXRlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICBJdmFyTGlzdE1pc3NpbmdJbXBsZW1lbnRhdGlvbih0cnVlKSB7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgSXZhckxpc3RNaXNzaW5nSW1wbGVtZW50YXRpb24odHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgIEhhc0Rlc2lnbmF0ZWRJbml0aWFsaXplcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5oZXJpdGVkRGVzaWduYXRlZEluaXRpYWxpemVycyhJRElfVW5rbm93bikgeyB9CiAgIH07CiAKICAgT2JqQ0ludGVyZmFjZURlY2woRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBhdExvYywgSWRlbnRpZmllckluZm8gKklkLApAQCAtNjk2LDEzICs3NTUsMTMgQEAKICAgdm9pZCBhbGxvY2F0ZURlZmluaXRpb25EYXRhKCk7CiAgIAogICB0eXBlZGVmIFJlZGVjbGFyYWJsZTxPYmpDSW50ZXJmYWNlRGVjbD4gcmVkZWNsYXJhYmxlX2Jhc2U7Ci0gIHZpcnR1YWwgT2JqQ0ludGVyZmFjZURlY2wgKmdldE5leHRSZWRlY2xhcmF0aW9uKCkgeyAKKyAgT2JqQ0ludGVyZmFjZURlY2wgKmdldE5leHRSZWRlY2xhcmF0aW9uKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBSZWRlY2xMaW5rLmdldE5leHQoKTsKICAgfQotICB2aXJ0dWFsIE9iakNJbnRlcmZhY2VEZWNsICpnZXRQcmV2aW91c0RlY2xJbXBsKCkgeworICBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0UHJldmlvdXNEZWNsKCk7CiAgIH0KLSAgdmlydHVhbCBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0TW9zdFJlY2VudERlY2xJbXBsKCkgeworICBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0TW9zdFJlY2VudERlY2xJbXBsKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBnZXRNb3N0UmVjZW50RGVjbCgpOwogICB9CiAKQEAgLTcxNiw3ICs3NzUsNyBAQAogCiAgIHN0YXRpYyBPYmpDSW50ZXJmYWNlRGVjbCAqQ3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKTsKIAotICB2aXJ0dWFsIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CiAgICAgaWYgKGlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkKICAgICAgIHJldHVybiBPYmpDQ29udGFpbmVyRGVjbDo6Z2V0U291cmNlUmFuZ2UoKTsKICAgICAKQEAgLTcyOCw2ICs3ODcsMjAgQEAKICAgLy8vIHdoZW4gYSBjb21wbGV0ZSBjbGFzcyBpcyByZXF1aXJlZC4KICAgdm9pZCBzZXRFeHRlcm5hbGx5Q29tcGxldGVkKCk7CiAKKyAgLy8vIEluZGljYXRlIHRoYXQgdGhpcyBpbnRlcmZhY2UgZGVjbCBjb250YWlucyBhdCBsZWFzdCBvbmUgaW5pdGlhbGl6ZXIKKyAgLy8vIG1hcmtlZCB3aXRoIHRoZSAnb2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyJyBhdHRyaWJ1dGUuCisgIHZvaWQgc2V0SGFzRGVzaWduYXRlZEluaXRpYWxpemVycygpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnRlcmZhY2UgZGVjbCBjb250YWlucyBhdCBsZWFzdCBvbmUgaW5pdGlhbGl6ZXIKKyAgLy8vIG1hcmtlZCB3aXRoIHRoZSAnb2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyJyBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzRGVzaWduYXRlZEluaXRpYWxpemVycygpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnRlcmZhY2UgZGVjbCBkZWNsYXJlcyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIKKyAgLy8vIG9yIGl0IGluaGVyaXRlcyBvbmUgZnJvbSBpdHMgc3VwZXIgY2xhc3MuCisgIGJvb2wgZGVjbGFyZXNPckluaGVyaXRzRGVzaWduYXRlZEluaXRpYWxpemVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRGVzaWduYXRlZEluaXRpYWxpemVycygpIHx8IGluaGVyaXRzRGVzaWduYXRlZEluaXRpYWxpemVycygpOworICB9CisKICAgY29uc3QgT2JqQ1Byb3RvY29sTGlzdCAmZ2V0UmVmZXJlbmNlZFByb3RvY29scygpIGNvbnN0IHsKICAgICBhc3NlcnQoaGFzRGVmaW5pdGlvbigpICYmICJDYWxsZXIgZGlkIG5vdCBjaGVjayBmb3IgZm9yd2FyZCByZWZlcmVuY2UhIik7CiAgICAgaWYgKGRhdGEoKS5FeHRlcm5hbGx5Q29tcGxldGVkKQpAQCAtNzUwLDcgKzgyMywxMSBAQAogICB9CiAKICAgdHlwZWRlZiBPYmpDUHJvdG9jb2xMaXN0OjppdGVyYXRvciBwcm90b2NvbF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxwcm90b2NvbF9pdGVyYXRvcj4gcHJvdG9jb2xfcmFuZ2U7CiAKKyAgcHJvdG9jb2xfcmFuZ2UgcHJvdG9jb2xzKCkgY29uc3QgeworICAgIHJldHVybiBwcm90b2NvbF9yYW5nZShwcm90b2NvbF9iZWdpbigpLCBwcm90b2NvbF9lbmQoKSk7CisgIH0KICAgcHJvdG9jb2xfaXRlcmF0b3IgcHJvdG9jb2xfYmVnaW4oKSBjb25zdCB7CiAgICAgLy8gRklYTUU6IFNob3VsZCBtYWtlIHN1cmUgbm8gY2FsbGVycyBldmVyIGRvIHRoaXMuCiAgICAgaWYgKCFoYXNEZWZpbml0aW9uKCkpCkBAIC03NzMsNyArODUwLDExIEBACiAgIH0KIAogICB0eXBlZGVmIE9iakNQcm90b2NvbExpc3Q6OmxvY19pdGVyYXRvciBwcm90b2NvbF9sb2NfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cHJvdG9jb2xfbG9jX2l0ZXJhdG9yPiBwcm90b2NvbF9sb2NfcmFuZ2U7CiAKKyAgcHJvdG9jb2xfbG9jX3JhbmdlIHByb3RvY29sX2xvY3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHByb3RvY29sX2xvY19yYW5nZShwcm90b2NvbF9sb2NfYmVnaW4oKSwgcHJvdG9jb2xfbG9jX2VuZCgpKTsKKyAgfQogICBwcm90b2NvbF9sb2NfaXRlcmF0b3IgcHJvdG9jb2xfbG9jX2JlZ2luKCkgY29uc3QgewogICAgIC8vIEZJWE1FOiBTaG91bGQgbWFrZSBzdXJlIG5vIGNhbGxlcnMgZXZlciBkbyB0aGlzLgogICAgIGlmICghaGFzRGVmaW5pdGlvbigpKQpAQCAtNzk3LDcgKzg3OCwxMiBAQAogICB9CiAKICAgdHlwZWRlZiBPYmpDTGlzdDxPYmpDUHJvdG9jb2xEZWNsPjo6aXRlcmF0b3IgYWxsX3Byb3RvY29sX2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGFsbF9wcm90b2NvbF9pdGVyYXRvcj4gYWxsX3Byb3RvY29sX3JhbmdlOwogCisgIGFsbF9wcm90b2NvbF9yYW5nZSBhbGxfcmVmZXJlbmNlZF9wcm90b2NvbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGFsbF9wcm90b2NvbF9yYW5nZShhbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfZW5kKCkpOworICB9CiAgIGFsbF9wcm90b2NvbF9pdGVyYXRvciBhbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9iZWdpbigpIGNvbnN0IHsKICAgICAvLyBGSVhNRTogU2hvdWxkIG1ha2Ugc3VyZSBubyBjYWxsZXJzIGV2ZXIgZG8gdGhpcy4KICAgICBpZiAoIWhhc0RlZmluaXRpb24oKSkKQEAgLTgyNCw3ICs5MTAsOSBAQAogICB9CiAKICAgdHlwZWRlZiBzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPE9iakNJdmFyRGVjbD4gaXZhcl9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPE9iakNJdmFyRGVjbD4+IGl2YXJfcmFuZ2U7CiAKKyAgaXZhcl9yYW5nZSBpdmFycygpIGNvbnN0IHsgcmV0dXJuIGl2YXJfcmFuZ2UoaXZhcl9iZWdpbigpLCBpdmFyX2VuZCgpKTsgfQogICBpdmFyX2l0ZXJhdG9yIGl2YXJfYmVnaW4oKSBjb25zdCB7IAogICAgIGlmIChjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqRGVmID0gZ2V0RGVmaW5pdGlvbigpKQogICAgICAgcmV0dXJuIGl2YXJfaXRlcmF0b3IoRGVmLT5kZWNsc19iZWdpbigpKTsgCkBAIC04NjcsNiArOTU1LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RDb250ZXh0ICZDKTsKIAorICAvLy8gUmV0dXJucyB0aGUgZGVzaWduYXRlZCBpbml0aWFsaXplcnMgZm9yIHRoZSBpbnRlcmZhY2UuCisgIC8vLworICAvLy8gSWYgdGhpcyBkZWNsYXJhdGlvbiBkb2VzIG5vdCBoYXZlIG1ldGhvZHMgbWFya2VkIGFzIGRlc2lnbmF0ZWQKKyAgLy8vIGluaXRpYWxpemVycyB0aGVuIHRoZSBpbnRlcmZhY2UgaW5oZXJpdHMgdGhlIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzIG9mCisgIC8vLyBpdHMgc3VwZXIgY2xhc3MuCisgIHZvaWQgZ2V0RGVzaWduYXRlZEluaXRpYWxpemVycygKKyAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjb25zdCBPYmpDTWV0aG9kRGVjbCAqPiAmTWV0aG9kcykgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VsZWN0b3IgaXMgYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIGZvciB0aGUKKyAgLy8vIGludGVyZmFjZS4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGRlY2xhcmF0aW9uIGRvZXMgbm90IGhhdmUgbWV0aG9kcyBtYXJrZWQgYXMgZGVzaWduYXRlZAorICAvLy8gaW5pdGlhbGl6ZXJzIHRoZW4gdGhlIGludGVyZmFjZSBpbmhlcml0cyB0aGUgZGVzaWduYXRlZCBpbml0aWFsaXplcnMgb2YKKyAgLy8vIGl0cyBzdXBlciBjbGFzcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5pdE1ldGhvZCBpZiBub24tbnVsbCBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgaXQgcmVjZWl2ZXMKKyAgLy8vIHRoZSBtZXRob2QgdGhhdCB3YXMgbWFya2VkIGFzIGEgZGVzaWduYXRlZCBpbml0aWFsaXplci4KKyAgYm9vbCBpc0Rlc2lnbmF0ZWRJbml0aWFsaXplcihTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKipJbml0TWV0aG9kID0gMCkgY29uc3Q7CisKICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhcnRpY3VsYXIgZGVjbGFyYXRpb24gb2YgdGhpcyBjbGFzcyBpcwogICAvLy8gYWN0dWFsbHkgYWxzbyBhIGRlZmluaXRpb24uCiAgIGJvb2wgaXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpIGNvbnN0IHsgCkBAIC05ODQsNiArMTA5MiwxNCBAQAogICB0eXBlZGVmIGZpbHRlcmVkX2NhdGVnb3J5X2l0ZXJhdG9yPGlzVmlzaWJsZUNhdGVnb3J5PgogICAgIHZpc2libGVfY2F0ZWdvcmllc19pdGVyYXRvcjsKIAorICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHZpc2libGVfY2F0ZWdvcmllc19pdGVyYXRvcj4KKyAgICB2aXNpYmxlX2NhdGVnb3JpZXNfcmFuZ2U7CisKKyAgdmlzaWJsZV9jYXRlZ29yaWVzX3JhbmdlIHZpc2libGVfY2F0ZWdvcmllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gdmlzaWJsZV9jYXRlZ29yaWVzX3JhbmdlKHZpc2libGVfY2F0ZWdvcmllc19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZV9jYXRlZ29yaWVzX2VuZCgpKTsKKyAgfQorCiAgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdmlzaWJsZS1jYXRlZ29yaWVzCiAgIC8vLyBsaXN0LgogICB2aXNpYmxlX2NhdGVnb3JpZXNfaXRlcmF0b3IgdmlzaWJsZV9jYXRlZ29yaWVzX2JlZ2luKCkgY29uc3QgewpAQCAtMTAxMCw2ICsxMTI2LDEzIEBACiAgIC8vLyBcYnJpZWYgSXRlcmF0b3IgdGhhdCB3YWxrcyBvdmVyIGFsbCBvZiB0aGUga25vd24gY2F0ZWdvcmllcyBhbmQKICAgLy8vIGV4dGVuc2lvbnMsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSBoaWRkZW4uCiAgIHR5cGVkZWYgZmlsdGVyZWRfY2F0ZWdvcnlfaXRlcmF0b3I8aXNLbm93bkNhdGVnb3J5PiBrbm93bl9jYXRlZ29yaWVzX2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGtub3duX2NhdGVnb3JpZXNfaXRlcmF0b3I+CisgICAga25vd25fY2F0ZWdvcmllc19yYW5nZTsKKworICBrbm93bl9jYXRlZ29yaWVzX3JhbmdlIGtub3duX2NhdGVnb3JpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGtub3duX2NhdGVnb3JpZXNfcmFuZ2Uoa25vd25fY2F0ZWdvcmllc19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duX2NhdGVnb3JpZXNfZW5kKCkpOworICB9CiAKICAgLy8vIFxicmllZiBSZXRyaWV2ZSBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrbm93bi1jYXRlZ29yaWVzCiAgIC8vLyBsaXN0LgpAQCAtMTAzOSw2ICsxMTYyLDE0IEBACiAgIHR5cGVkZWYgZmlsdGVyZWRfY2F0ZWdvcnlfaXRlcmF0b3I8aXNWaXNpYmxlRXh0ZW5zaW9uPgogICAgIHZpc2libGVfZXh0ZW5zaW9uc19pdGVyYXRvcjsKIAorICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHZpc2libGVfZXh0ZW5zaW9uc19pdGVyYXRvcj4KKyAgICB2aXNpYmxlX2V4dGVuc2lvbnNfcmFuZ2U7CisKKyAgdmlzaWJsZV9leHRlbnNpb25zX3JhbmdlIHZpc2libGVfZXh0ZW5zaW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gdmlzaWJsZV9leHRlbnNpb25zX3JhbmdlKHZpc2libGVfZXh0ZW5zaW9uc19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZV9leHRlbnNpb25zX2VuZCgpKTsKKyAgfQorCiAgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdmlzaWJsZS1leHRlbnNpb25zCiAgIC8vLyBsaXN0LgogICB2aXNpYmxlX2V4dGVuc2lvbnNfaXRlcmF0b3IgdmlzaWJsZV9leHRlbnNpb25zX2JlZ2luKCkgY29uc3QgewpAQCAtMTA2NSw2ICsxMTk2LDEzIEBACiAgIC8vLyBcYnJpZWYgSXRlcmF0b3IgdGhhdCB3YWxrcyBvdmVyIGFsbCBvZiB0aGUga25vd24gZXh0ZW5zaW9ucy4KICAgdHlwZWRlZiBmaWx0ZXJlZF9jYXRlZ29yeV9pdGVyYXRvcjxpc0tub3duRXh0ZW5zaW9uPgogICAgIGtub3duX2V4dGVuc2lvbnNfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8a25vd25fZXh0ZW5zaW9uc19pdGVyYXRvcj4KKyAgICBrbm93bl9leHRlbnNpb25zX3JhbmdlOworCisgIGtub3duX2V4dGVuc2lvbnNfcmFuZ2Uga25vd25fZXh0ZW5zaW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4ga25vd25fZXh0ZW5zaW9uc19yYW5nZShrbm93bl9leHRlbnNpb25zX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd25fZXh0ZW5zaW9uc19lbmQoKSk7CisgIH0KIAogICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtub3duLWV4dGVuc2lvbnMKICAgLy8vIGxpc3QuCkBAIC0xMTA0LDggKzEyNDIsOCBAQAogICBPYmpDUHJvcGVydHlEZWNsCiAgICAgKkZpbmRQcm9wZXJ0eVZpc2libGVJblByaW1hcnlDbGFzcyhJZGVudGlmaWVySW5mbyAqUHJvcGVydHlJZCkgY29uc3Q7CiAKLSAgdmlydHVhbCB2b2lkIGNvbGxlY3RQcm9wZXJ0aWVzVG9JbXBsZW1lbnQoUHJvcGVydHlNYXAgJlBNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURlY2xPcmRlciAmUE8pIGNvbnN0OworICB2b2lkIGNvbGxlY3RQcm9wZXJ0aWVzVG9JbXBsZW1lbnQoUHJvcGVydHlNYXAgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZWNsT3JkZXIgJlBPKSBjb25zdCBvdmVycmlkZTsKIAogICAvLy8gaXNTdXBlckNsYXNzT2YgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIHRoZSBzcGVjaWZpZWQgY2xhc3Mgb3IgaXMgYQogICAvLy8gc3VwZXIgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgY2xhc3MuCkBAIC0xMTQxLDE1ICsxMjc5LDE4IEBACiAgIC8vIExvb2t1cCBhIG1ldGhvZC4gRmlyc3QsIHdlIHNlYXJjaCBsb2NhbGx5LiBJZiBhIG1ldGhvZCBpc24ndAogICAvLyBmb3VuZCwgd2Ugc2VhcmNoIHJlZmVyZW5jZWQgcHJvdG9jb2xzIGFuZCBjbGFzcyBjYXRlZ29yaWVzLgogICBPYmpDTWV0aG9kRGVjbCAqbG9va3VwTWV0aG9kKFNlbGVjdG9yIFNlbCwgYm9vbCBpc0luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2hhbGxvd0NhdGVnb3J5TG9va3VwPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDQ2F0ZWdvcnlEZWNsICpDPSAwKSBjb25zdDsKLSAgT2JqQ01ldGhvZERlY2wgKmxvb2t1cEluc3RhbmNlTWV0aG9kKFNlbGVjdG9yIFNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNoYWxsb3dDYXRlZ29yeUxvb2t1cCA9IGZhbHNlKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxvb2t1cE1ldGhvZChTZWwsIHRydWUvKmlzSW5zdGFuY2UqLywgc2hhbGxvd0NhdGVnb3J5TG9va3VwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNoYWxsb3dDYXRlZ29yeUxvb2t1cCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9sbG93U3VwZXIgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNDYXRlZ29yeURlY2wgKkMgPSAwKSBjb25zdDsKKworICAvLy8gTG9va3VwIGFuIGluc3RhbmNlIG1ldGhvZCBmb3IgYSBnaXZlbiBzZWxlY3Rvci4KKyAgT2JqQ01ldGhvZERlY2wgKmxvb2t1cEluc3RhbmNlTWV0aG9kKFNlbGVjdG9yIFNlbCkgY29uc3QgeworICAgIHJldHVybiBsb29rdXBNZXRob2QoU2VsLCB0cnVlLyppc0luc3RhbmNlKi8pOwogICB9Ci0gIE9iakNNZXRob2REZWNsICpsb29rdXBDbGFzc01ldGhvZChTZWxlY3RvciBTZWwsCi0gICAgICAgICAgICAgICAgICAgICBib29sIHNoYWxsb3dDYXRlZ29yeUxvb2t1cCA9IGZhbHNlKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxvb2t1cE1ldGhvZChTZWwsIGZhbHNlLyppc0luc3RhbmNlKi8sIHNoYWxsb3dDYXRlZ29yeUxvb2t1cCk7CisKKyAgLy8vIExvb2t1cCBhIGNsYXNzIG1ldGhvZCBmb3IgYSBnaXZlbiBzZWxlY3Rvci4KKyAgT2JqQ01ldGhvZERlY2wgKmxvb2t1cENsYXNzTWV0aG9kKFNlbGVjdG9yIFNlbCkgY29uc3QgeworICAgIHJldHVybiBsb29rdXBNZXRob2QoU2VsLCBmYWxzZS8qaXNJbnN0YW5jZSovKTsKICAgfQogICBPYmpDSW50ZXJmYWNlRGVjbCAqbG9va3VwSW5oZXJpdGVkQ2xhc3MoY29uc3QgSWRlbnRpZmllckluZm8gKklDTmFtZSk7CiAKQEAgLTExNjcsNyArMTMwOCw5IEBACiAgIE9iakNNZXRob2REZWNsICpsb29rdXBQcm9wZXJ0eUFjY2Vzc29yKGNvbnN0IFNlbGVjdG9yIFNlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0NhdGVnb3J5RGVjbCAqQ2F0KSBjb25zdCB7CiAgICAgcmV0dXJuIGxvb2t1cE1ldGhvZChTZWwsIHRydWUvKmlzSW5zdGFuY2UqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLypzaGFsbG93Q2F0ZWdvcnlMb29rdXAqLywgQ2F0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLypzaGFsbG93Q2F0ZWdvcnlMb29rdXAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZm9sbG93c1N1cGVyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2F0KTsKICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgU291cmNlTG9jYXRpb24gZ2V0RW5kT2ZEZWZpbml0aW9uTG9jKCkgY29uc3QgeyAKQEAgLTExOTYsMTUgKzEzMzksMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvb2t1cENhdGVnb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUkhTSXNRdWFsaWZpZWRJRCA9IGZhbHNlKTsKIAorICB0eXBlZGVmIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfcmFuZ2UgcmVkZWNsX3JhbmdlOwogICB0eXBlZGVmIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfaXRlcmF0b3IgcmVkZWNsX2l0ZXJhdG9yOwogICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsc19iZWdpbjsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfZW5kOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsczsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldFByZXZpb3VzRGVjbDsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldE1vc3RSZWNlbnREZWNsOwogICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6aXNGaXJzdERlY2w7CiAKICAgLy8vIFJldHJpZXZlcyB0aGUgY2Fub25pY2FsIGRlY2xhcmF0aW9uIG9mIHRoaXMgT2JqZWN0aXZlLUMgY2xhc3MuCi0gIE9iakNJbnRlcmZhY2VEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KKyAgT2JqQ0ludGVyZmFjZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7IHJldHVybiBnZXRGaXJzdERlY2woKTsgfQogICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsgcmV0dXJuIGdldEZpcnN0RGVjbCgpOyB9CiAKICAgLy8gTG93LWxldmVsIGFjY2Vzc29yCkBAIC0xMjE3LDYgKzEzNjIsMTAgQEAKICAgZnJpZW5kIGNsYXNzIEFTVFJlYWRlcjsKICAgZnJpZW5kIGNsYXNzIEFTVERlY2xSZWFkZXI7CiAgIGZyaWVuZCBjbGFzcyBBU1REZWNsV3JpdGVyOworCitwcml2YXRlOgorICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqZmluZEludGVyZmFjZVdpdGhEZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKCkgY29uc3Q7CisgIGJvb2wgaW5oZXJpdHNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKCkgY29uc3Q7CiB9OwogCiAvLy8gT2JqQ0l2YXJEZWNsIC0gUmVwcmVzZW50cyBhbiBPYmpDIGluc3RhbmNlIHZhcmlhYmxlLiBJbiBnZW5lcmFsLCBPYmpDCkBAIC0xMjM1LDcgKzEzODQsNyBAQAogLy8vICAgfQogLy8vCiBjbGFzcyBPYmpDSXZhckRlY2wgOiBwdWJsaWMgRmllbGREZWNsIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogCiBwdWJsaWM6CiAgIGVudW0gQWNjZXNzQ29udHJvbCB7CkBAIC0xMjQ2LDEyICsxMzk1LDEwIEBACiAgIE9iakNJdmFyRGVjbChPYmpDQ29udGFpbmVyRGVjbCAqREMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAogICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWRMb2MsIElkZW50aWZpZXJJbmZvICpJZCwKICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywgQWNjZXNzQ29udHJvbCBhYywgRXhwciAqQlcsCi0gICAgICAgICAgICAgICBib29sIHN5bnRoZXNpemVkLAotICAgICAgICAgICAgICAgYm9vbCBiYWNraW5nSXZhclJlZmVyZW5jZWRJbkFjY2Vzc29yKQorICAgICAgICAgICAgICAgYm9vbCBzeW50aGVzaXplZCkKICAgICA6IEZpZWxkRGVjbChPYmpDSXZhciwgREMsIFN0YXJ0TG9jLCBJZExvYywgSWQsIFQsIFRJbmZvLCBCVywKICAgICAgICAgICAgICAgICAvKk11dGFibGU9Ki9mYWxzZSwgLypIYXNJbml0PSovSUNJU19Ob0luaXQpLAotICAgICAgTmV4dEl2YXIoMCksIERlY2xBY2Nlc3MoYWMpLCBTeW50aGVzaXplZChzeW50aGVzaXplZCksCi0gICAgICBCYWNraW5nSXZhclJlZmVyZW5jZWRJbkFjY2Vzc29yKGJhY2tpbmdJdmFyUmVmZXJlbmNlZEluQWNjZXNzb3IpIHt9CisgICAgICBOZXh0SXZhcigwKSwgRGVjbEFjY2VzcyhhYyksIFN5bnRoZXNpemVkKHN5bnRoZXNpemVkKSB7fQogCiBwdWJsaWM6CiAgIHN0YXRpYyBPYmpDSXZhckRlY2wgKkNyZWF0ZShBU1RDb250ZXh0ICZDLCBPYmpDQ29udGFpbmVyRGVjbCAqREMsCkBAIC0xMjU5LDggKzE0MDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLCBRdWFsVHlwZSBULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbCBhYywgRXhwciAqQlcgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeW50aGVzaXplZD1mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmFja2luZ0l2YXJSZWZlcmVuY2VkSW5BY2Nlc3Nvcj1mYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5bnRoZXNpemVkPWZhbHNlKTsKIAogICBzdGF0aWMgT2JqQ0l2YXJEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOwogICAKQEAgLTEyODIsMTMgKzE0MjgsNiBAQAogICAgIHJldHVybiBEZWNsQWNjZXNzID09IE5vbmUgPyBQcm90ZWN0ZWQgOiBBY2Nlc3NDb250cm9sKERlY2xBY2Nlc3MpOwogICB9CiAKLSAgdm9pZCBzZXRCYWNraW5nSXZhclJlZmVyZW5jZWRJbkFjY2Vzc29yKGJvb2wgdmFsKSB7Ci0gICAgQmFja2luZ0l2YXJSZWZlcmVuY2VkSW5BY2Nlc3NvciA9IHZhbDsKLSAgfQotICBib29sIGdldEJhY2tpbmdJdmFyUmVmZXJlbmNlZEluQWNjZXNzb3IoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEJhY2tpbmdJdmFyUmVmZXJlbmNlZEluQWNjZXNzb3I7Ci0gIH0KLSAgCiAgIHZvaWQgc2V0U3ludGhlc2l6ZShib29sIHN5bnRoKSB7IFN5bnRoZXNpemVkID0gc3ludGg7IH0KICAgYm9vbCBnZXRTeW50aGVzaXplKCkgY29uc3QgeyByZXR1cm4gU3ludGhlc2l6ZWQ7IH0KIApAQCAtMTMwMywxMyArMTQ0MiwxMiBAQAogICAvLyBOT1RFOiBWQysrIHRyZWF0cyBlbnVtcyBhcyBzaWduZWQsIGF2b2lkIHVzaW5nIHRoZSBBY2Nlc3NDb250cm9sIGVudW0KICAgdW5zaWduZWQgRGVjbEFjY2VzcyA6IDM7CiAgIHVuc2lnbmVkIFN5bnRoZXNpemVkIDogMTsKLSAgdW5zaWduZWQgQmFja2luZ0l2YXJSZWZlcmVuY2VkSW5BY2Nlc3NvciA6IDE7CiB9OwogCiAKIC8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGZpZWxkIGRlY2xhcmF0aW9uIGNyZWF0ZWQgYnkgYW4gXEBkZWZzKC4uLikuCiBjbGFzcyBPYmpDQXREZWZzRmllbGREZWNsIDogcHVibGljIEZpZWxkRGVjbCB7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKICAgT2JqQ0F0RGVmc0ZpZWxkRGVjbChEZWNsQ29udGV4dCAqREMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAogICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsCiAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwgRXhwciAqQlcpCkBAIC0xMzYyLDcgKzE1MDAsNyBAQAogLy8vCiBjbGFzcyBPYmpDUHJvdG9jb2xEZWNsIDogcHVibGljIE9iakNDb250YWluZXJEZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBSZWRlY2xhcmFibGU8T2JqQ1Byb3RvY29sRGVjbD4gewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAKICAgc3RydWN0IERlZmluaXRpb25EYXRhIHsKICAgICAvLyBcYnJpZWYgVGhlIGRlY2xhcmF0aW9uIHRoYXQgZGVmaW5lcyB0aGlzIHByb3RvY29sLgpAQCAtMTM5MSwxMyArMTUyOSwxMyBAQAogICB2b2lkIGFsbG9jYXRlRGVmaW5pdGlvbkRhdGEoKTsKIAogICB0eXBlZGVmIFJlZGVjbGFyYWJsZTxPYmpDUHJvdG9jb2xEZWNsPiByZWRlY2xhcmFibGVfYmFzZTsKLSAgdmlydHVhbCBPYmpDUHJvdG9jb2xEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbigpIHsgCisgIE9iakNQcm90b2NvbERlY2wgKmdldE5leHRSZWRlY2xhcmF0aW9uKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBSZWRlY2xMaW5rLmdldE5leHQoKTsgCiAgIH0KLSAgdmlydHVhbCBPYmpDUHJvdG9jb2xEZWNsICpnZXRQcmV2aW91c0RlY2xJbXBsKCkgeworICBPYmpDUHJvdG9jb2xEZWNsICpnZXRQcmV2aW91c0RlY2xJbXBsKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBnZXRQcmV2aW91c0RlY2woKTsKICAgfQotICB2aXJ0dWFsIE9iakNQcm90b2NvbERlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIHsKKyAgT2JqQ1Byb3RvY29sRGVjbCAqZ2V0TW9zdFJlY2VudERlY2xJbXBsKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBnZXRNb3N0UmVjZW50RGVjbCgpOwogICB9CiAKQEAgLTE0MTUsNiArMTU1MywxMSBAQAogICAgIHJldHVybiBkYXRhKCkuUmVmZXJlbmNlZFByb3RvY29sczsKICAgfQogICB0eXBlZGVmIE9iakNQcm90b2NvbExpc3Q6Oml0ZXJhdG9yIHByb3RvY29sX2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHByb3RvY29sX2l0ZXJhdG9yPiBwcm90b2NvbF9yYW5nZTsKKworICBwcm90b2NvbF9yYW5nZSBwcm90b2NvbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHByb3RvY29sX3JhbmdlKHByb3RvY29sX2JlZ2luKCksIHByb3RvY29sX2VuZCgpKTsKKyAgfQogICBwcm90b2NvbF9pdGVyYXRvciBwcm90b2NvbF9iZWdpbigpIGNvbnN0IHsKICAgICBpZiAoIWhhc0RlZmluaXRpb24oKSkKICAgICAgIHJldHVybiBwcm90b2NvbF9pdGVyYXRvcigpOwpAQCAtMTQyOCw2ICsxNTcxLDExIEBACiAgICAgcmV0dXJuIGRhdGEoKS5SZWZlcmVuY2VkUHJvdG9jb2xzLmVuZCgpOyAKICAgfQogICB0eXBlZGVmIE9iakNQcm90b2NvbExpc3Q6OmxvY19pdGVyYXRvciBwcm90b2NvbF9sb2NfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cHJvdG9jb2xfbG9jX2l0ZXJhdG9yPiBwcm90b2NvbF9sb2NfcmFuZ2U7CisKKyAgcHJvdG9jb2xfbG9jX3JhbmdlIHByb3RvY29sX2xvY3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHByb3RvY29sX2xvY19yYW5nZShwcm90b2NvbF9sb2NfYmVnaW4oKSwgcHJvdG9jb2xfbG9jX2VuZCgpKTsKKyAgfQogICBwcm90b2NvbF9sb2NfaXRlcmF0b3IgcHJvdG9jb2xfbG9jX2JlZ2luKCkgY29uc3QgewogICAgIGlmICghaGFzRGVmaW5pdGlvbigpKQogICAgICAgcmV0dXJuIHByb3RvY29sX2xvY19pdGVyYXRvcigpOwpAQCAtMTUwMywyOSArMTY1MSwzMSBAQAogICAvLy8gXGJyaWVmIFN0YXJ0cyB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIE9iamVjdGl2ZS1DIHByb3RvY29sLgogICB2b2lkIHN0YXJ0RGVmaW5pdGlvbigpOwogCi0gIHZpcnR1YWwgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZIHsKICAgICBpZiAoaXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpKQogICAgICAgcmV0dXJuIE9iakNDb250YWluZXJEZWNsOjpnZXRTb3VyY2VSYW5nZSgpOwogICAgCiAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKGdldEF0U3RhcnRMb2MoKSwgZ2V0TG9jYXRpb24oKSk7CiAgIH0KICAgIAorICB0eXBlZGVmIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfcmFuZ2UgcmVkZWNsX3JhbmdlOwogICB0eXBlZGVmIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xfaXRlcmF0b3IgcmVkZWNsX2l0ZXJhdG9yOwogICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsc19iZWdpbjsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfZW5kOworICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsczsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldFByZXZpb3VzRGVjbDsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmdldE1vc3RSZWNlbnREZWNsOwogICB1c2luZyByZWRlY2xhcmFibGVfYmFzZTo6aXNGaXJzdERlY2w7CiAKICAgLy8vIFJldHJpZXZlcyB0aGUgY2Fub25pY2FsIGRlY2xhcmF0aW9uIG9mIHRoaXMgT2JqZWN0aXZlLUMgcHJvdG9jb2wuCi0gIE9iakNQcm90b2NvbERlY2wgKmdldENhbm9uaWNhbERlY2woKSB7IHJldHVybiBnZXRGaXJzdERlY2woKTsgfQorICBPYmpDUHJvdG9jb2xEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7IH0KICAgY29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIGNvbnN0IHsgcmV0dXJuIGdldEZpcnN0RGVjbCgpOyB9CiAKLSAgdmlydHVhbCB2b2lkIGNvbGxlY3RQcm9wZXJ0aWVzVG9JbXBsZW1lbnQoUHJvcGVydHlNYXAgJlBNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURlY2xPcmRlciAmUE8pIGNvbnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi12b2lkIGNvbGxlY3RJbmhlcml0ZWRQcm90b2NvbFByb3BlcnRpZXMoY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xQcm9wZXJ0eU1hcCAmUE0pIGNvbnN0OworICB2b2lkIGNvbGxlY3RQcm9wZXJ0aWVzVG9JbXBsZW1lbnQoUHJvcGVydHlNYXAgJlBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZWNsT3JkZXIgJlBPKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGNvbGxlY3RJbmhlcml0ZWRQcm90b2NvbFByb3BlcnRpZXMoY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFByb3BlcnR5TWFwICZQTSkgY29uc3Q7CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CiAgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBPYmpDUHJvdG9jb2w7IH0KQEAgLTE1NTMsNyArMTcwMyw3IEBACiAvLy8gZG9uJ3Qgc3VwcG9ydCB0aGlzIGxldmVsIG9mIGR5bmFtaXNtLCB3aGljaCBpcyBib3RoIHBvd2VyZnVsIGFuZCBkYW5nZXJvdXMuCiAvLy8KIGNsYXNzIE9iakNDYXRlZ29yeURlY2wgOiBwdWJsaWMgT2JqQ0NvbnRhaW5lckRlY2wgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAKICAgLy8vIEludGVyZmFjZSBiZWxvbmdpbmcgdG8gdGhpcyBjYXRlZ29yeQogICBPYmpDSW50ZXJmYWNlRGVjbCAqQ2xhc3NJbnRlcmZhY2U7CkBAIC0xNjEzLDEwICsxNzYzLDIyIEBACiAgIH0KIAogICB0eXBlZGVmIE9iakNQcm90b2NvbExpc3Q6Oml0ZXJhdG9yIHByb3RvY29sX2l0ZXJhdG9yOwotICBwcm90b2NvbF9pdGVyYXRvciBwcm90b2NvbF9iZWdpbigpIGNvbnN0IHtyZXR1cm4gUmVmZXJlbmNlZFByb3RvY29scy5iZWdpbigpO30KKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxwcm90b2NvbF9pdGVyYXRvcj4gcHJvdG9jb2xfcmFuZ2U7CisKKyAgcHJvdG9jb2xfcmFuZ2UgcHJvdG9jb2xzKCkgY29uc3QgeworICAgIHJldHVybiBwcm90b2NvbF9yYW5nZShwcm90b2NvbF9iZWdpbigpLCBwcm90b2NvbF9lbmQoKSk7CisgIH0KKyAgcHJvdG9jb2xfaXRlcmF0b3IgcHJvdG9jb2xfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIFJlZmVyZW5jZWRQcm90b2NvbHMuYmVnaW4oKTsKKyAgfQogICBwcm90b2NvbF9pdGVyYXRvciBwcm90b2NvbF9lbmQoKSBjb25zdCB7IHJldHVybiBSZWZlcmVuY2VkUHJvdG9jb2xzLmVuZCgpOyB9CiAgIHVuc2lnbmVkIHByb3RvY29sX3NpemUoKSBjb25zdCB7IHJldHVybiBSZWZlcmVuY2VkUHJvdG9jb2xzLnNpemUoKTsgfQogICB0eXBlZGVmIE9iakNQcm90b2NvbExpc3Q6OmxvY19pdGVyYXRvciBwcm90b2NvbF9sb2NfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8cHJvdG9jb2xfbG9jX2l0ZXJhdG9yPiBwcm90b2NvbF9sb2NfcmFuZ2U7CisKKyAgcHJvdG9jb2xfbG9jX3JhbmdlIHByb3RvY29sX2xvY3MoKSBjb25zdCB7CisgICAgcmV0dXJuIHByb3RvY29sX2xvY19yYW5nZShwcm90b2NvbF9sb2NfYmVnaW4oKSwgcHJvdG9jb2xfbG9jX2VuZCgpKTsKKyAgfQogICBwcm90b2NvbF9sb2NfaXRlcmF0b3IgcHJvdG9jb2xfbG9jX2JlZ2luKCkgY29uc3QgewogICAgIHJldHVybiBSZWZlcmVuY2VkUHJvdG9jb2xzLmxvY19iZWdpbigpOwogICB9CkBAIC0xNjM1LDYgKzE3OTcsOSBAQAogICBib29sIElzQ2xhc3NFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiBnZXRJZGVudGlmaWVyKCkgPT0gMDsgfQogCiAgIHR5cGVkZWYgc3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxPYmpDSXZhckRlY2w+IGl2YXJfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxPYmpDSXZhckRlY2w+PiBpdmFyX3JhbmdlOworCisgIGl2YXJfcmFuZ2UgaXZhcnMoKSBjb25zdCB7IHJldHVybiBpdmFyX3JhbmdlKGl2YXJfYmVnaW4oKSwgaXZhcl9lbmQoKSk7IH0KICAgaXZhcl9pdGVyYXRvciBpdmFyX2JlZ2luKCkgY29uc3QgewogICAgIHJldHVybiBpdmFyX2l0ZXJhdG9yKGRlY2xzX2JlZ2luKCkpOwogICB9CkBAIC0xNjY0LDcgKzE4MjksNyBAQAogfTsKIAogY2xhc3MgT2JqQ0ltcGxEZWNsIDogcHVibGljIE9iakNDb250YWluZXJEZWNsIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogCiAgIC8vLyBDbGFzcyBpbnRlcmZhY2UgZm9yIHRoaXMgY2xhc3MvY2F0ZWdvcnkgaW1wbGVtZW50YXRpb24KICAgT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzSW50ZXJmYWNlOwpAQCAtMTcwMSw2ICsxODY2LDEyIEBACiAKICAgLy8gSXRlcmF0b3IgYWNjZXNzIHRvIHByb3BlcnRpZXMuCiAgIHR5cGVkZWYgc3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxPYmpDUHJvcGVydHlJbXBsRGVjbD4gcHJvcGltcGxfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxPYmpDUHJvcGVydHlJbXBsRGVjbD4+CisgICAgcHJvcGltcGxfcmFuZ2U7CisKKyAgcHJvcGltcGxfcmFuZ2UgcHJvcGVydHlfaW1wbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHByb3BpbXBsX3JhbmdlKHByb3BpbXBsX2JlZ2luKCksIHByb3BpbXBsX2VuZCgpKTsKKyAgfQogICBwcm9waW1wbF9pdGVyYXRvciBwcm9waW1wbF9iZWdpbigpIGNvbnN0IHsKICAgICByZXR1cm4gcHJvcGltcGxfaXRlcmF0b3IoZGVjbHNfYmVnaW4oKSk7CiAgIH0KQEAgLTE3MjgsNyArMTg5OSw3IEBACiAvLy8KIC8vLyBPYmpDQ2F0ZWdvcnlJbXBsRGVjbAogY2xhc3MgT2JqQ0NhdGVnb3J5SW1wbERlY2wgOiBwdWJsaWMgT2JqQ0ltcGxEZWNsIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogCiAgIC8vIENhdGVnb3J5IG5hbWUKICAgSWRlbnRpZmllckluZm8gKklkOwpAQCAtMTgwOCw3ICsxOTc5LDcgQEAKIC8vLyBzcGVjaWZpZWQsIHRoZXkgbmVlZCB0byBiZSAqaWRlbnRpY2FsKiB0byB0aGUgaW50ZXJmYWNlLgogLy8vCiBjbGFzcyBPYmpDSW1wbGVtZW50YXRpb25EZWNsIDogcHVibGljIE9iakNJbXBsRGVjbCB7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKICAgLy8vIEltcGxlbWVudGF0aW9uIENsYXNzJ3Mgc3VwZXIgY2xhc3MuCiAgIE9iakNJbnRlcmZhY2VEZWNsICpTdXBlckNsYXNzOwogICBTb3VyY2VMb2NhdGlvbiBTdXBlckxvYzsKQEAgLTE4NTksNiArMjAzMCwxNCBAQAogICAvLy8gaW5pdF9jb25zdF9pdGVyYXRvciAtIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGl2YXIgaW5pdGlhbGl6ZXIgbGlzdC4KICAgdHlwZWRlZiBDWFhDdG9ySW5pdGlhbGl6ZXIgKiBjb25zdCAqIGluaXRfY29uc3RfaXRlcmF0b3I7CiAKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxpbml0X2l0ZXJhdG9yPiBpbml0X3JhbmdlOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGluaXRfY29uc3RfaXRlcmF0b3I+IGluaXRfY29uc3RfcmFuZ2U7CisKKyAgaW5pdF9yYW5nZSBpbml0cygpIHsgcmV0dXJuIGluaXRfcmFuZ2UoaW5pdF9iZWdpbigpLCBpbml0X2VuZCgpKTsgfQorICBpbml0X2NvbnN0X3JhbmdlIGluaXRzKCkgY29uc3QgeworICAgIHJldHVybiBpbml0X2NvbnN0X3JhbmdlKGluaXRfYmVnaW4oKSwgaW5pdF9lbmQoKSk7CisgIH0KKwogICAvLy8gaW5pdF9iZWdpbigpIC0gUmV0cmlldmUgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGluaXRpYWxpemVyLgogICBpbml0X2l0ZXJhdG9yICAgICAgIGluaXRfYmVnaW4oKSAgICAgICB7IHJldHVybiBJdmFySW5pdGlhbGl6ZXJzOyB9CiAgIC8vLyBiZWdpbigpIC0gUmV0cmlldmUgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGluaXRpYWxpemVyLgpAQCAtMTkzMCw2ICsyMTA5LDkgQEAKICAgU291cmNlTG9jYXRpb24gZ2V0SXZhclJCcmFjZUxvYygpIGNvbnN0IHsgcmV0dXJuIEl2YXJSQnJhY2VMb2M7IH0KICAgCiAgIHR5cGVkZWYgc3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxPYmpDSXZhckRlY2w+IGl2YXJfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY2lmaWNfZGVjbF9pdGVyYXRvcjxPYmpDSXZhckRlY2w+PiBpdmFyX3JhbmdlOworCisgIGl2YXJfcmFuZ2UgaXZhcnMoKSBjb25zdCB7IHJldHVybiBpdmFyX3JhbmdlKGl2YXJfYmVnaW4oKSwgaXZhcl9lbmQoKSk7IH0KICAgaXZhcl9pdGVyYXRvciBpdmFyX2JlZ2luKCkgY29uc3QgewogICAgIHJldHVybiBpdmFyX2l0ZXJhdG9yKGRlY2xzX2JlZ2luKCkpOwogICB9CkBAIC0xOTU1LDcgKzIxMzcsNyBAQAogLy8vIE9iakNDb21wYXRpYmxlQWxpYXNEZWNsIC0gUmVwcmVzZW50cyBhbGlhcyBvZiBhIGNsYXNzLiBUaGlzIGFsaWFzIGlzCiAvLy8gZGVjbGFyZWQgYXMgXEBjb21wYXRpYmlsaXR5X2FsaWFzIGFsaWFzIGNsYXNzLgogY2xhc3MgT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2wgOiBwdWJsaWMgTmFtZWREZWNsIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogICAvLy8gQ2xhc3MgdGhhdCB0aGlzIGlzIGFuIGFsaWFzIG9mLgogICBPYmpDSW50ZXJmYWNlRGVjbCAqQWxpYXNlZENsYXNzOwogCkBAIC0xOTg2LDcgKzIxNjgsNyBAQAogLy8vIFxAcHJvcGVydHkgKGFzc2lnbiwgcmVhZHdyaXRlKSBpbnQgTXlQcm9wZXJ0eTsKIC8vLyBcZW5kY29kZQogY2xhc3MgT2JqQ1Byb3BlcnR5RGVjbCA6IHB1YmxpYyBOYW1lZERlY2wgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiBwdWJsaWM6CiAgIGVudW0gUHJvcGVydHlBdHRyaWJ1dGVLaW5kIHsKICAgICBPQkpDX1BSX25vYXR0ciAgICA9IDB4MDAsCkBAIC0yMTQ1LDcgKzIzMjcsNyBAQAogICAgIHJldHVybiBQcm9wZXJ0eUl2YXJEZWNsOwogICB9CiAKLSAgdmlydHVhbCBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFkgewogICAgIHJldHVybiBTb3VyY2VSYW5nZShBdExvYywgZ2V0TG9jYXRpb24oKSk7CiAgIH0KICAgCkBAIC0yMjE1LDggKzIzOTcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBpdmFyTG9jKTsKIAogICBzdGF0aWMgT2JqQ1Byb3BlcnR5SW1wbERlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCk7Ci0gIAotICB2aXJ0dWFsIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFk7CiAKICAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCBMTFZNX1JFQURPTkxZIHsgcmV0dXJuIEF0TG9jOyB9CiAgIHZvaWQgc2V0QXRMb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IEF0TG9jID0gTG9jOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsT3Blbk1QLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsT3Blbk1QLmgKaW5kZXggNDJmZTkwNy4uNzYyODJhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbE9wZW5NUC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xPcGVuTVAuaApAQCAtNjQsOSArNjQsMTggQEAKIAogICB0eXBlZGVmIGxsdm06Ok11dGFibGVBcnJheVJlZjxFeHByICo+OjppdGVyYXRvciB2YXJsaXN0X2l0ZXJhdG9yOwogICB0eXBlZGVmIEFycmF5UmVmPGNvbnN0IEV4cHIgKj46Oml0ZXJhdG9yIHZhcmxpc3RfY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8dmFybGlzdF9pdGVyYXRvcj4gdmFybGlzdF9yYW5nZTsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTx2YXJsaXN0X2NvbnN0X2l0ZXJhdG9yPiB2YXJsaXN0X2NvbnN0X3JhbmdlOwogCiAgIHVuc2lnbmVkIHZhcmxpc3Rfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE51bVZhcnM7IH0KICAgYm9vbCB2YXJsaXN0X2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtVmFycyA9PSAwOyB9CisKKyAgdmFybGlzdF9yYW5nZSB2YXJsaXN0cygpIHsKKyAgICByZXR1cm4gdmFybGlzdF9yYW5nZSh2YXJsaXN0X2JlZ2luKCksIHZhcmxpc3RfZW5kKCkpOworICB9CisgIHZhcmxpc3RfY29uc3RfcmFuZ2UgdmFybGlzdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHZhcmxpc3RfY29uc3RfcmFuZ2UodmFybGlzdF9iZWdpbigpLCB2YXJsaXN0X2VuZCgpKTsKKyAgfQogICB2YXJsaXN0X2l0ZXJhdG9yIHZhcmxpc3RfYmVnaW4oKSB7IHJldHVybiBnZXRWYXJzKCkuYmVnaW4oKTsgfQogICB2YXJsaXN0X2l0ZXJhdG9yIHZhcmxpc3RfZW5kKCkgeyByZXR1cm4gZ2V0VmFycygpLmVuZCgpOyB9CiAgIHZhcmxpc3RfY29uc3RfaXRlcmF0b3IgdmFybGlzdF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldFZhcnMoKS5iZWdpbigpOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9EZWNsVGVtcGxhdGUuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oCmluZGV4IDI0YmQyOGEuLmQ1NTU4MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oCkBAIC0yMjcsNyArMjI3LDcgQEAKIC8vLyBUaGUgVGVtcGxhdGVEZWNsIGNsYXNzIHN0b3JlcyB0aGUgbGlzdCBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFuZCBhCiAvLy8gcmVmZXJlbmNlIHRvIHRoZSB0ZW1wbGF0ZWQgc2NvcGVkIGRlY2xhcmF0aW9uOiB0aGUgdW5kZXJseWluZyBBU1Qgbm9kZS4KIGNsYXNzIFRlbXBsYXRlRGVjbCA6IHB1YmxpYyBOYW1lZERlY2wgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiBwcm90ZWN0ZWQ6CiAgIC8vIFRoaXMgaXMgcHJvYmFibHkgbmV2ZXIgdXNlZC4KICAgVGVtcGxhdGVEZWNsKEtpbmQgREssIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTCwKQEAgLTI2MSw3ICsyNjEsNyBAQAogICAgIHJldHVybiBLID49IGZpcnN0VGVtcGxhdGUgJiYgSyA8PSBsYXN0VGVtcGxhdGU7CiAgIH0KIAotICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeworICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIExMVk1fUkVBRE9OTFkgewogICAgIHJldHVybiBTb3VyY2VSYW5nZShUZW1wbGF0ZVBhcmFtcy0+Z2V0VGVtcGxhdGVMb2MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVkRGVjbC0+Z2V0U291cmNlUmFuZ2UoKS5nZXRFbmQoKSk7CiAgIH0KQEAgLTUzMCwxMyArNTMwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUmVkZWNsYXJhYmxlPFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbD4gCiB7CiAgIHR5cGVkZWYgUmVkZWNsYXJhYmxlPFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbD4gcmVkZWNsYXJhYmxlX2Jhc2U7Ci0gIHZpcnR1YWwgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbigpIHsKKyAgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsICpnZXROZXh0UmVkZWNsYXJhdGlvbigpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gUmVkZWNsTGluay5nZXROZXh0KCk7CiAgIH0KLSAgdmlydHVhbCBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wgKmdldFByZXZpb3VzRGVjbEltcGwoKSB7CisgIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCAqZ2V0UHJldmlvdXNEZWNsSW1wbCgpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0UHJldmlvdXNEZWNsKCk7CiAgIH0KLSAgdmlydHVhbCBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wgKmdldE1vc3RSZWNlbnREZWNsSW1wbCgpIHsKKyAgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsICpnZXRNb3N0UmVjZW50RGVjbEltcGwoKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGdldE1vc3RSZWNlbnREZWNsKCk7CiAgIH0KIApAQCAtNjMxLDcgKzYzMSw5IEBACiAgIHRlbXBsYXRlIDxjbGFzcyBkZWNsX3R5cGU+IGZyaWVuZCBjbGFzcyBSZWRlY2xhcmFibGVUZW1wbGF0ZTsKIAogICAvLy8gXGJyaWVmIFJldHJpZXZlcyB0aGUgY2Fub25pY2FsIGRlY2xhcmF0aW9uIG9mIHRoaXMgdGVtcGxhdGUuCi0gIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIHsgcmV0dXJuIGdldEZpcnN0RGVjbCgpOyB9CisgIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZ2V0Rmlyc3REZWNsKCk7CisgIH0KICAgY29uc3QgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgY29uc3QgewogICAgIHJldHVybiBnZXRGaXJzdERlY2woKTsKICAgfQpAQCAtNzEwLDkgKzcxMiwxMSBAQAogICAgIGdldENvbW1vblB0cigpLT5JbnN0YW50aWF0ZWRGcm9tTWVtYmVyLnNldFBvaW50ZXIoVEQpOwogICB9CiAKKyAgdHlwZWRlZiByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX3JhbmdlIHJlZGVjbF9yYW5nZTsKICAgdHlwZWRlZiByZWRlY2xhcmFibGVfYmFzZTo6cmVkZWNsX2l0ZXJhdG9yIHJlZGVjbF9pdGVyYXRvcjsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHNfYmVnaW47CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpyZWRlY2xzX2VuZDsKKyAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OnJlZGVjbHM7CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRQcmV2aW91c0RlY2w7CiAgIHVzaW5nIHJlZGVjbGFyYWJsZV9iYXNlOjpnZXRNb3N0UmVjZW50RGVjbDsKICAgdXNpbmcgcmVkZWNsYXJhYmxlX2Jhc2U6OmlzRmlyc3REZWNsOwpAQCAtNzczLDcgKzc3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLCBOYW1lZERlY2wgKkRlY2wpCiAgICAgOiBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2woRnVuY3Rpb25UZW1wbGF0ZSwgREMsIEwsIE5hbWUsIFBhcmFtcywgRGVjbCkgeyB9CiAKLSAgQ29tbW9uQmFzZSAqbmV3Q29tbW9uKEFTVENvbnRleHQgJkMpIGNvbnN0OworICBDb21tb25CYXNlICpuZXdDb21tb24oQVNUQ29udGV4dCAmQykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgQ29tbW9uICpnZXRDb21tb25QdHIoKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENvbW1vbiAqPihSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w6OmdldENvbW1vblB0cigpKTsKQEAgLTgxMyw3ICs4MTcsNyBAQAogICBGdW5jdGlvbkRlY2wgKmZpbmRTcGVjaWFsaXphdGlvbihjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1BcmdzLCB2b2lkIComSW5zZXJ0UG9zKTsKIAotICBGdW5jdGlvblRlbXBsYXRlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIHsKKyAgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGNhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KAogICAgICAgICAgICAgIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6Z2V0Q2Fub25pY2FsRGVjbCgpKTsKICAgfQpAQCAtODQyLDcgKzg0NiwxMSBAQAogICB9CiAKICAgdHlwZWRlZiBTcGVjSXRlcmF0b3I8RnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uSW5mbz4gc3BlY19pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjX2l0ZXJhdG9yPiBzcGVjX3JhbmdlOwogCisgIHNwZWNfcmFuZ2Ugc3BlY2lhbGl6YXRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBzcGVjX3JhbmdlKHNwZWNfYmVnaW4oKSwgc3BlY19lbmQoKSk7CisgIH0KICAgc3BlY19pdGVyYXRvciBzcGVjX2JlZ2luKCkgY29uc3QgewogICAgIHJldHVybiBtYWtlU3BlY0l0ZXJhdG9yKGdldFNwZWNpYWxpemF0aW9ucygpLCBmYWxzZSk7CiAgIH0KQEAgLTg5MiwxMiArOTAwLDkgQEAKIC8vLyBUaGlzIGNsYXNzIGlzIGluaGVyaXRlZGx5IHByaXZhdGVseSBieSBkaWZmZXJlbnQga2luZHMgb2YgdGVtcGxhdGUKIC8vLyBwYXJhbWV0ZXJzIGFuZCBpcyBub3QgcGFydCBvZiB0aGUgRGVjbCBoaWVyYXJjaHkuIEp1c3QgYSBmYWNpbGl0eS4KIGNsYXNzIFRlbXBsYXRlUGFybVBvc2l0aW9uIHsKLXByb3RlY3RlZDoKLSAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHByb2JhYmx5IG5ldmVyIGJlIGNhbGxlZCwgYnV0IGl0J3MgaGVyZSBhcwotICBUZW1wbGF0ZVBhcm1Qb3NpdGlvbigpCi0gICAgOiBEZXB0aCgwKSwgUG9zaXRpb24oMCkKLSAgeyAvKiBsbHZtX3VucmVhY2hhYmxlKCJDYW5ub3QgY3JlYXRlIHBvc2l0aW9ubGVzcyB0ZW1wbGF0ZSBwYXJhbWV0ZXIiKTsgKi8gfQorICBUZW1wbGF0ZVBhcm1Qb3NpdGlvbigpIExMVk1fREVMRVRFRF9GVU5DVElPTjsKIAorcHJvdGVjdGVkOgogICBUZW1wbGF0ZVBhcm1Qb3NpdGlvbih1bnNpZ25lZCBELCB1bnNpZ25lZCBQKQogICAgIDogRGVwdGgoRCksIFBvc2l0aW9uKFApCiAgIHsgfQpAQCAtMTAwOSw3ICsxMDE0LDcgQEAKICAgLy8vIFxicmllZiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpcyBhIHBhcmFtZXRlciBwYWNrLgogICBib29sIGlzUGFyYW1ldGVyUGFjaygpIGNvbnN0OwogCi0gIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOwogCiAgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0L2V0Yy4KICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CkBAIC0xMDg2LDcgKzEwOTEsNyBAQAogICB1c2luZyBUZW1wbGF0ZVBhcm1Qb3NpdGlvbjo6c2V0UG9zaXRpb247CiAgIHVzaW5nIFRlbXBsYXRlUGFybVBvc2l0aW9uOjpnZXRJbmRleDsKIAotICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWTsKIAogICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgdGVtcGxhdGUgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQKICAgLy8vIGFyZ3VtZW50LgpAQCAtMTIwNiw3ICsxMjExLDcgQEAKIGNsYXNzIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCA6IHB1YmxpYyBUZW1wbGF0ZURlY2wsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFRlbXBsYXRlUGFybVBvc2l0aW9uIAogewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAKICAgLy8vIERlZmF1bHRBcmd1bWVudCAtIFRoZSBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50LCBpZiBhbnkuCiAgIFRlbXBsYXRlQXJndW1lbnRMb2MgRGVmYXVsdEFyZ3VtZW50OwpAQCAtMTM0Nyw3ICsxMzUyLDcgQEAKICAgICBEZWZhdWx0QXJndW1lbnRXYXNJbmhlcml0ZWQgPSBmYWxzZTsKICAgfQogCi0gIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWSB7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGUgTExWTV9SRUFET05MWSB7CiAgICAgU291cmNlTG9jYXRpb24gRW5kID0gZ2V0TG9jYXRpb24oKTsKICAgICBpZiAoaGFzRGVmYXVsdEFyZ3VtZW50KCkgJiYgIWRlZmF1bHRBcmd1bWVudFdhc0luaGVyaXRlZCgpKQogICAgICAgRW5kID0gZ2V0RGVmYXVsdEFyZ3VtZW50KCkuZ2V0U291cmNlUmFuZ2UoKS5nZXRFbmQoKTsKQEAgLTE0NDQsMTAgKzE0NDksMTQgQEAKICAgc3RhdGljIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKgogICBDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOwogCi0gIHZpcnR1YWwgdm9pZCBnZXROYW1lRm9yRGlhZ25vc3RpYyhyYXdfb3N0cmVhbSAmT1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBRdWFsaWZpZWQpIGNvbnN0OworICB2b2lkIGdldE5hbWVGb3JEaWFnbm9zdGljKHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFF1YWxpZmllZCkgY29uc3Qgb3ZlcnJpZGU7CiAKKyAgLy8gRklYTUU6IFRoaXMgaXMgYnJva2VuLiBDWFhSZWNvcmREZWNsOjpnZXRNb3N0UmVjZW50RGVjbCgpIHJldHVybnMgYQorICAvLyBkaWZmZXJlbnQgIm1vc3QgcmVjZW50IiBkZWNsYXJhdGlvbiBmcm9tIHRoaXMgZnVuY3Rpb24gZm9yIHRoZSBzYW1lCisgIC8vIGRlY2xhcmF0aW9uLCBiZWNhdXNlIHdlIGRvbid0IG92ZXJyaWRlIGdldE1vc3RSZWNlbnREZWNsSW1wbCgpLiBCdXQKKyAgLy8gaXQncyBub3QgY2xlYXIgdGhhdCB3ZSBzaG91bGQgb3ZlcnJpZGUgdGhhdCwgYmVjYXVzZSB0aGUgbW9zdCByZWNlbnQKKyAgLy8gZGVjbGFyYXRpb24gYXMgYSBDWFhSZWNvcmREZWNsIHNvbWV0aW1lcyBpcyB0aGUgaW5qZWN0ZWQtY2xhc3MtbmFtZS4KICAgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqZ2V0TW9zdFJlY2VudERlY2woKSB7CiAgICAgQ1hYUmVjb3JkRGVjbCAqUmVjZW50ID0gc3RhdGljX2Nhc3Q8Q1hYUmVjb3JkRGVjbCAqPigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpLT5nZXRNb3N0UmVjZW50RGVjbCgpOwpAQCAtMTUxNiwxNyArMTUyNSwxMSBAQAogICBsbHZtOjpQb2ludGVyVW5pb248Q2xhc3NUZW1wbGF0ZURlY2wgKiwKICAgICAgICAgICAgICAgICAgICAgIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICo+CiAgIGdldEluc3RhbnRpYXRlZEZyb20oKSBjb25zdCB7Ci0gICAgaWYgKGdldFNwZWNpYWxpemF0aW9uS2luZCgpICE9IFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb24gJiYKLSAgICAgICAgZ2V0U3BlY2lhbGl6YXRpb25LaW5kKCkgIT0gVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlZmluaXRpb24gJiYKLSAgICAgICAgZ2V0U3BlY2lhbGl6YXRpb25LaW5kKCkgIT0gVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uKQorICAgIGlmICghaXNUZW1wbGF0ZUluc3RhbnRpYXRpb24oZ2V0U3BlY2lhbGl6YXRpb25LaW5kKCkpKQogICAgICAgcmV0dXJuIGxsdm06OlBvaW50ZXJVbmlvbjxDbGFzc1RlbXBsYXRlRGVjbCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqPigpOwogCi0gICAgaWYgKFNwZWNpYWxpemVkUGFydGlhbFNwZWNpYWxpemF0aW9uICpQYXJ0aWFsU3BlYwotICAgICAgICAgID0gU3BlY2lhbGl6ZWRUZW1wbGF0ZS5keW5fY2FzdDxTcGVjaWFsaXplZFBhcnRpYWxTcGVjaWFsaXphdGlvbio+KCkpCi0gICAgICByZXR1cm4gUGFydGlhbFNwZWMtPlBhcnRpYWxTcGVjaWFsaXphdGlvbjsKLQotICAgIHJldHVybiBTcGVjaWFsaXplZFRlbXBsYXRlLmdldDxDbGFzc1RlbXBsYXRlRGVjbCo+KCk7CisgICAgcmV0dXJuIGdldFNwZWNpYWxpemVkVGVtcGxhdGVPclBhcnRpYWwoKTsKICAgfQogCiAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGNsYXNzIHRlbXBsYXRlIG9yIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwKQEAgLTE2MTcsNyArMTYyMCw3IEBACiAgICAgcmV0dXJuIEV4cGxpY2l0SW5mbyA/IEV4cGxpY2l0SW5mby0+VGVtcGxhdGVLZXl3b3JkTG9jIDogU291cmNlTG9jYXRpb24oKTsKICAgfQogCi0gIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgU291cmNlUmFuZ2UgZ2V0U291cmNlUmFuZ2UoKSBjb25zdCBvdmVycmlkZSBMTFZNX1JFQURPTkxZOwogCiAgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgewogICAgIFByb2ZpbGUoSUQsIFRlbXBsYXRlQXJncy0+ZGF0YSgpLCBUZW1wbGF0ZUFyZ3MtPnNpemUoKSwgZ2V0QVNUQ29udGV4dCgpKTsKQEAgLTE2NDMsNyArMTY0Niw3IEBACiAKIGNsYXNzIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsCiAgIDogcHVibGljIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCiAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCogVGVtcGxhdGVQYXJhbXM7CkBAIC0xODQwLDcgKzE4NDMsNyBAQAogICAgIDogUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsKENsYXNzVGVtcGxhdGUsIDAsIFNvdXJjZUxvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lKCksIDAsIDApIHsgfQogCi0gIENvbW1vbkJhc2UgKm5ld0NvbW1vbihBU1RDb250ZXh0ICZDKSBjb25zdDsKKyAgQ29tbW9uQmFzZSAqbmV3Q29tbW9uKEFTVENvbnRleHQgJkMpIGNvbnN0IG92ZXJyaWRlOwogCiAgIENvbW1vbiAqZ2V0Q29tbW9uUHRyKCkgY29uc3QgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb21tb24gKj4oUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsOjpnZXRDb21tb25QdHIoKSk7CkBAIC0xODc5LDcgKzE4ODIsNyBAQAogICAvLy8gaW4uIEluc2VydFBvcyBtdXN0IGJlIG9idGFpbmVkIGZyb20gZmluZFNwZWNpYWxpemF0aW9uLgogICB2b2lkIEFkZFNwZWNpYWxpemF0aW9uKENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKkQsIHZvaWQgKkluc2VydFBvcyk7CiAKLSAgQ2xhc3NUZW1wbGF0ZURlY2wgKmdldENhbm9uaWNhbERlY2woKSB7CisgIENsYXNzVGVtcGxhdGVEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBjYXN0PENsYXNzVGVtcGxhdGVEZWNsPigKICAgICAgICAgICAgICBSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w6OmdldENhbm9uaWNhbERlY2woKSk7CiAgIH0KQEAgLTE5NzAsNiArMTk3MywxMSBAQAogICBRdWFsVHlwZSBnZXRJbmplY3RlZENsYXNzTmFtZVNwZWNpYWxpemF0aW9uKCk7CiAKICAgdHlwZWRlZiBTcGVjSXRlcmF0b3I8Q2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbD4gc3BlY19pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxzcGVjX2l0ZXJhdG9yPiBzcGVjX3JhbmdlOworCisgIHNwZWNfcmFuZ2Ugc3BlY2lhbGl6YXRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBzcGVjX3JhbmdlKHNwZWNfYmVnaW4oKSwgc3BlY19lbmQoKSk7CisgIH0KIAogICBzcGVjX2l0ZXJhdG9yIHNwZWNfYmVnaW4oKSBjb25zdCB7CiAgICAgcmV0dXJuIG1ha2VTcGVjSXRlcmF0b3IoZ2V0U3BlY2lhbGl6YXRpb25zKCksIGZhbHNlKTsKQEAgLTE5NzksMTcgKzE5ODcsNiBAQAogICAgIHJldHVybiBtYWtlU3BlY0l0ZXJhdG9yKGdldFNwZWNpYWxpemF0aW9ucygpLCB0cnVlKTsKICAgfQogCi0gIHR5cGVkZWYgU3BlY0l0ZXJhdG9yPENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsPgotICAgICAgICAgIHBhcnRpYWxfc3BlY19pdGVyYXRvcjsKLQotICBwYXJ0aWFsX3NwZWNfaXRlcmF0b3IgcGFydGlhbF9zcGVjX2JlZ2luKCkgewotICAgIHJldHVybiBtYWtlU3BlY0l0ZXJhdG9yKGdldFBhcnRpYWxTcGVjaWFsaXphdGlvbnMoKSwgZmFsc2UpOwotICB9Ci0KLSAgcGFydGlhbF9zcGVjX2l0ZXJhdG9yIHBhcnRpYWxfc3BlY19lbmQoKSB7Ci0gICAgcmV0dXJuIG1ha2VTcGVjSXRlcmF0b3IoZ2V0UGFydGlhbFNwZWNpYWxpemF0aW9ucygpLCB0cnVlKTsKLSAgfQotCiAgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0IHN1cHBvcnQKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CiAgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBDbGFzc1RlbXBsYXRlOyB9CkBAIC0yMTA5LDcgKzIxMDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsIE5hbWVkRGVjbCAqRGVjbCkKICAgICA6IFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbChUeXBlQWxpYXNUZW1wbGF0ZSwgREMsIEwsIE5hbWUsIFBhcmFtcywgRGVjbCkgeyB9CiAKLSAgQ29tbW9uQmFzZSAqbmV3Q29tbW9uKEFTVENvbnRleHQgJkMpIGNvbnN0OworICBDb21tb25CYXNlICpuZXdDb21tb24oQVNUQ29udGV4dCAmQykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgQ29tbW9uICpnZXRDb21tb25QdHIoKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENvbW1vbiAqPihSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w6OmdldENvbW1vblB0cigpKTsKQEAgLTIxMjIsNyArMjExOSw3IEBACiAgIH0KIAogCi0gIFR5cGVBbGlhc1RlbXBsYXRlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIHsKKyAgVHlwZUFsaWFzVGVtcGxhdGVEZWNsICpnZXRDYW5vbmljYWxEZWNsKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBjYXN0PFR5cGVBbGlhc1RlbXBsYXRlRGVjbD4oCiAgICAgICAgICAgICAgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsOjpnZXRDYW5vbmljYWxEZWNsKCkpOwogICB9CkBAIC0yMTcyLDcgKzIxNjksNyBAQAogCiAvLy8gXGJyaWVmIERlY2xhcmF0aW9uIG9mIGEgZnVuY3Rpb24gc3BlY2lhbGl6YXRpb24gYXQgdGVtcGxhdGUgY2xhc3Mgc2NvcGUuCiAvLy8KLS8vLyBUaGlzIGlzIGEgbm9uIHN0YW5kYXJkIGV4dGVuc2lvbiBuZWVkZWQgdG8gc3VwcG9ydCBNU1ZDLgorLy8vIFRoaXMgaXMgYSBub24tc3RhbmRhcmQgZXh0ZW5zaW9uIG5lZWRlZCB0byBzdXBwb3J0IE1TVkMuCiAvLy8KIC8vLyBGb3IgZXhhbXBsZToKIC8vLyBcY29kZQpAQCAtMjIxNCw5ICsyMjExLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWE1ldGhvZERlY2wgKkZELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNFeHBsaWNpdFRlbXBsYXRlQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gVGVtcGxhdGVBcmdzKSB7Ci0gICAgcmV0dXJuIG5ldyAoQykgQ2xhc3NTY29wZUZ1bmN0aW9uU3BlY2lhbGl6YXRpb25EZWNsKERDICwgTG9jLCBGRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJncyk7CisgICAgcmV0dXJuIG5ldyAoQywgREMpIENsYXNzU2NvcGVGdW5jdGlvblNwZWNpYWxpemF0aW9uRGVjbCgKKyAgICAgICAgREMsIExvYywgRkQsIEhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzLCBUZW1wbGF0ZUFyZ3MpOwogICB9CiAKICAgc3RhdGljIENsYXNzU2NvcGVGdW5jdGlvblNwZWNpYWxpemF0aW9uRGVjbCAqCkBAIC0yMzE2LDkgKzIzMTIsOCBAQAogICBzdGF0aWMgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJRCk7CiAKLSAgdmlydHVhbCB2b2lkIGdldE5hbWVGb3JEaWFnbm9zdGljKHJhd19vc3RyZWFtICZPUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFF1YWxpZmllZCkgY29uc3Q7CisgIHZvaWQgZ2V0TmFtZUZvckRpYWdub3N0aWMocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUXVhbGlmaWVkKSBjb25zdCBvdmVycmlkZTsKIAogICBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqZ2V0TW9zdFJlY2VudERlY2woKSB7CiAgICAgVmFyRGVjbCAqUmVjZW50ID0gc3RhdGljX2Nhc3Q8VmFyRGVjbCAqPih0aGlzKS0+Z2V0TW9zdFJlY2VudERlY2woKTsKQEAgLTI1MTAsNyArMjUwNSw3IEBACiAKIGNsYXNzIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbAogICAgIDogcHVibGljIFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgVGhlIGxpc3Qgb2YgdGVtcGxhdGUgcGFyYW1ldGVycwogICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRlbXBsYXRlUGFyYW1zOwpAQCAtMjY4NSw3ICsyNjgwLDcgQEAKICAgICAgIDogUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsKFZhclRlbXBsYXRlLCAwLCBTb3VyY2VMb2NhdGlvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lKCksIDAsIDApIHt9CiAKLSAgQ29tbW9uQmFzZSAqbmV3Q29tbW9uKEFTVENvbnRleHQgJkMpIGNvbnN0OworICBDb21tb25CYXNlICpuZXdDb21tb24oQVNUQ29udGV4dCAmQykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgQ29tbW9uICpnZXRDb21tb25QdHIoKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENvbW1vbiAqPihSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w6OmdldENvbW1vblB0cigpKTsKQEAgLTI3MDgsOCArMjcwMyw4IEBACiAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdmFyaWFibGUgdGVtcGxhdGUgbm9kZS4KICAgc3RhdGljIFZhclRlbXBsYXRlRGVjbCAqQ3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwsIERlY2xhcmF0aW9uTmFtZSBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsIE5hbWVkRGVjbCAqRGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhclRlbXBsYXRlRGVjbCAqUHJldkRlY2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJEZWNsICpEZWNsKTsKIAogICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBlbXB0eSB2YXJpYWJsZSB0ZW1wbGF0ZSBub2RlLgogICBzdGF0aWMgVmFyVGVtcGxhdGVEZWNsICpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpOwpAQCAtMjcyNCw3ICsyNzE5LDcgQEAKICAgLy8vIGluLiBJbnNlcnRQb3MgbXVzdCBiZSBvYnRhaW5lZCBmcm9tIGZpbmRTcGVjaWFsaXphdGlvbi4KICAgdm9pZCBBZGRTcGVjaWFsaXphdGlvbihWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqRCwgdm9pZCAqSW5zZXJ0UG9zKTsKIAotICBWYXJUZW1wbGF0ZURlY2wgKmdldENhbm9uaWNhbERlY2woKSB7CisgIFZhclRlbXBsYXRlRGVjbCAqZ2V0Q2Fub25pY2FsRGVjbCgpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gY2FzdDxWYXJUZW1wbGF0ZURlY2w+KFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6Z2V0Q2Fub25pY2FsRGVjbCgpKTsKICAgfQogICBjb25zdCBWYXJUZW1wbGF0ZURlY2wgKmdldENhbm9uaWNhbERlY2woKSBjb25zdCB7CkBAIC0yNzgwLDYgKzI3NzUsMTEgQEAKICAgICAgIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqRCk7CiAKICAgdHlwZWRlZiBTcGVjSXRlcmF0b3I8VmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+IHNwZWNfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8c3BlY19pdGVyYXRvcj4gc3BlY19yYW5nZTsKKworICBzcGVjX3JhbmdlIHNwZWNpYWxpemF0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3BlY19yYW5nZShzcGVjX2JlZ2luKCksIHNwZWNfZW5kKCkpOworICB9CiAKICAgc3BlY19pdGVyYXRvciBzcGVjX2JlZ2luKCkgY29uc3QgewogICAgIHJldHVybiBtYWtlU3BlY0l0ZXJhdG9yKGdldFNwZWNpYWxpemF0aW9ucygpLCBmYWxzZSk7CkBAIC0yNzg5LDE3ICsyNzg5LDYgQEAKICAgICByZXR1cm4gbWFrZVNwZWNJdGVyYXRvcihnZXRTcGVjaWFsaXphdGlvbnMoKSwgdHJ1ZSk7CiAgIH0KIAotICB0eXBlZGVmIFNwZWNJdGVyYXRvcjxWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2w+Ci0gIHBhcnRpYWxfc3BlY19pdGVyYXRvcjsKLQotICBwYXJ0aWFsX3NwZWNfaXRlcmF0b3IgcGFydGlhbF9zcGVjX2JlZ2luKCkgewotICAgIHJldHVybiBtYWtlU3BlY0l0ZXJhdG9yKGdldFBhcnRpYWxTcGVjaWFsaXphdGlvbnMoKSwgZmFsc2UpOwotICB9Ci0KLSAgcGFydGlhbF9zcGVjX2l0ZXJhdG9yIHBhcnRpYWxfc3BlY19lbmQoKSB7Ci0gICAgcmV0dXJuIG1ha2VTcGVjSXRlcmF0b3IoZ2V0UGFydGlhbFNwZWNpYWxpemF0aW9ucygpLCB0cnVlKTsKLSAgfQotCiAgIC8vIEltcGxlbWVudCBpc2EvY2FzdC9keW5jYXN0IHN1cHBvcnQKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWNsICpEKSB7IHJldHVybiBjbGFzc29mS2luZChELT5nZXRLaW5kKCkpOyB9CiAgIHN0YXRpYyBib29sIGNsYXNzb2ZLaW5kKEtpbmQgSykgeyByZXR1cm4gSyA9PSBWYXJUZW1wbGF0ZTsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvRGVwZW5kZW50RGlhZ25vc3RpYy5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvRGVwZW5kZW50RGlhZ25vc3RpYy5oCmluZGV4IDAwNGI0NWQuLjBjNzgzZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL0RlcGVuZGVudERpYWdub3N0aWMuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9EZXBlbmRlbnREaWFnbm9zdGljLmgKQEAgLTE3MSwxOCArMTcxLDE2IEBACiAgIERlcGVuZGVudERpYWdub3N0aWMgKlB0cjsKIH07CiAKLWlubGluZSBEZWNsQ29udGV4dDo6ZGRpYWdfaXRlcmF0b3IgRGVjbENvbnRleHQ6OmRkaWFnX2JlZ2luKCkgY29uc3QgeworaW5saW5lIERlY2xDb250ZXh0OjpkZGlhZ19yYW5nZSBEZWNsQ29udGV4dDo6ZGRpYWdzKCkgY29uc3QgewogICBhc3NlcnQoaXNEZXBlbmRlbnRDb250ZXh0KCkKICAgICAgICAgICYmICJjYW5ub3QgaXRlcmF0ZSBkZXBlbmRlbnQgZGlhZ25vc3RpY3Mgb2Ygbm9uLWRlcGVuZGVudCBjb250ZXh0Iik7CiAgIGNvbnN0IERlcGVuZGVudFN0b3JlZERlY2xzTWFwICpNYXAKICAgICA9IHN0YXRpY19jYXN0PERlcGVuZGVudFN0b3JlZERlY2xzTWFwKj4oZ2V0UHJpbWFyeUNvbnRleHQoKS0+Z2V0TG9va3VwUHRyKCkpOwogCi0gIGlmICghTWFwKSByZXR1cm4gZGRpYWdfaXRlcmF0b3IoKTsKLSAgcmV0dXJuIGRkaWFnX2l0ZXJhdG9yKE1hcC0+Rmlyc3REaWFnbm9zdGljKTsKLX0KKyAgaWYgKCFNYXApCisgICAgcmV0dXJuIGRkaWFnX3JhbmdlKCk7CiAKLWlubGluZSBEZWNsQ29udGV4dDo6ZGRpYWdfaXRlcmF0b3IgRGVjbENvbnRleHQ6OmRkaWFnX2VuZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGRkaWFnX2l0ZXJhdG9yKCk7CisgIHJldHVybiBkZGlhZ19yYW5nZShkZGlhZ19pdGVyYXRvcihNYXAtPkZpcnN0RGlhZ25vc3RpYyksIGRkaWFnX2l0ZXJhdG9yKCkpOwogfQogCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9FeHByLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9FeHByLmgKaW5kZXggZjI2NDhiOS4uYWRjODMwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvRXhwci5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL0V4cHIuaApAQCAtNTA4LDYgKzUwOCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGlhbERpYWdub3N0aWNBdD4gJkRpYWdzKTsKIAorICAvLy8gaXNQb3RlbnRpYWxDb25zdGFudEV4cHJVbmV2YWx1dGVkIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBleHByZXNzaW9uIG1pZ2h0CisgIC8vLyBiZSB1c2FibGUgaW4gYSBjb25zdGFudCBleHByZXNzaW9uIGluIEMrKzExIGluIGFuIHVuZXZhbHVhdGVkIGNvbnRleHQsIGlmCisgIC8vLyBpdCB3ZXJlIGluIGZ1bmN0aW9uIEZEIG1hcmtlZCBjb25zdGV4cHIuIFJldHVybiBmYWxzZSBpZiB0aGUgZnVuY3Rpb24gY2FuCisgIC8vLyBuZXZlciBwcm9kdWNlIGEgY29uc3RhbnQgZXhwcmVzc2lvbiwgYWxvbmcgd2l0aCBkaWFnbm9zdGljcyBkZXNjcmliaW5nCisgIC8vLyB3aHkgbm90LgorICBzdGF0aWMgYm9vbCBpc1BvdGVudGlhbENvbnN0YW50RXhwclVuZXZhbHVhdGVkKEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWFsRGlhZ25vc3RpY0F0PiAmRGlhZ3MpOworCiAgIC8vLyBpc0NvbnN0YW50SW5pdGlhbGl6ZXIgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBleHByZXNzaW9uIGNhbiBiZSBlbWl0dGVkIHRvCiAgIC8vLyBJUiBhcyBhIGNvbnN0YW50LCBhbmQgdGh1cyBjYW4gYmUgdXNlZCBhcyBhIGNvbnN0YW50IGluaXRpYWxpemVyIGluIEMuCiAgIGJvb2wgaXNDb25zdGFudEluaXRpYWxpemVyKEFTVENvbnRleHQgJkN0eCwgYm9vbCBGb3JSZWYpIGNvbnN0OwpAQCAtNjAwLDYgKzYxMCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYXJEZWNsICpWRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFBhcnRpYWxEaWFnbm9zdGljQXQ+ICZOb3RlcykgY29uc3Q7CiAKKyAgLy8vIEV2YWx1YXRlV2l0aFN1YnN0aXR1dGlvbiAtIEV2YWx1YXRlIGFuIGV4cHJlc3Npb24gYXMgaWYgZnJvbSB0aGUgY29udGV4dAorICAvLy8gb2YgYSBjYWxsIHRvIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMsIGluc2lkZSBhbgorICAvLy8gdW5ldmFsdWF0ZWQgY29udGV4dC4gUmV0dXJucyB0cnVlIGlmIHRoZSBleHByZXNzaW9uIGNvdWxkIGJlIGZvbGRlZCB0byBhCisgIC8vLyBjb25zdGFudC4KKyAgYm9vbCBFdmFsdWF0ZVdpdGhTdWJzdGl0dXRpb24oQVBWYWx1ZSAmVmFsdWUsIEFTVENvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPGNvbnN0IEV4cHIqPiBBcmdzKSBjb25zdDsKKwogICAvLy8gXGJyaWVmIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGtpbmQgb2YgTnVsbCBwb2ludGVyIGNvbnN0YW50CiAgIC8vLyByZXR1cm5lZCBmcm9tIFxjIGlzTnVsbFBvaW50ZXJDb25zdGFudCgpLgogICBlbnVtIE51bGxQb2ludGVyQ29uc3RhbnRLaW5kIHsKQEAgLTc2NCwxMSArNzgyLDYgQEAKICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBFeHByICo+ICZDb21tYUxIUywKICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTdWJvYmplY3RBZGp1c3RtZW50PiAmQWRqdXN0bWVudHMpIGNvbnN0OwogCi0gIC8vLyBTa2lwIGlycmVsZXZhbnQgZXhwcmVzc2lvbnMgdG8gZmluZCB3aGF0IHNob3VsZCBiZSBtYXRlcmlhbGl6ZSBmb3IKLSAgLy8vIGJpbmRpbmcgd2l0aCBhIHJlZmVyZW5jZS4KLSAgY29uc3QgRXhwciAqCi0gIGZpbmRNYXRlcmlhbGl6ZWRUZW1wb3JhcnkoY29uc3QgTWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByIComTVRFKSBjb25zdDsKLQogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKICAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPj0gZmlyc3RFeHByQ29uc3RhbnQgJiYKICAgICAgICAgICAgVC0+Z2V0U3RtdENsYXNzKCkgPD0gbGFzdEV4cHJDb25zdGFudDsKQEAgLTIyMzgsOSArMjI1MSw5IEBACiAgIC8vLyB0aGlzIGZ1bmN0aW9uIGNhbGwuCiAgIHVuc2lnbmVkIGdldE51bUNvbW1hcygpIGNvbnN0IHsgcmV0dXJuIE51bUFyZ3MgPyBOdW1BcmdzIC0gMSA6IDA7IH0KIAotICAvLy8gaXNCdWlsdGluQ2FsbCAtIElmIHRoaXMgaXMgYSBjYWxsIHRvIGEgYnVpbHRpbiwgcmV0dXJuIHRoZSBidWlsdGluIElELiAgSWYKLSAgLy8vIG5vdCwgcmV0dXJuIDAuCi0gIHVuc2lnbmVkIGlzQnVpbHRpbkNhbGwoKSBjb25zdDsKKyAgLy8vIGdldEJ1aWx0aW5DYWxsZWUgLSBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIGJ1aWx0aW4sIHJldHVybiB0aGUgYnVpbHRpbiBJRAorICAvLy8gb2YgdGhlIGNhbGxlZS4gSWYgbm90LCByZXR1cm4gMC4KKyAgdW5zaWduZWQgZ2V0QnVpbHRpbkNhbGxlZSgpIGNvbnN0OwogCiAgIC8vLyBcYnJpZWYgUmV0dXJucyBcYyB0cnVlIGlmIHRoaXMgaXMgYSBjYWxsIHRvIGEgYnVpbHRpbiB3aGljaCBkb2VzIG5vdAogICAvLy8gZXZhbHVhdGUgc2lkZS1lZmZlY3RzIHdpdGhpbiBpdHMgYXJndW1lbnRzLgpAQCAtMjYzMyw3ICsyNjQ2LDcgQEAKIHByaXZhdGU6CiAgIFN0bXQgKk9wOwogCi0gIHZvaWQgQ2hlY2tDYXN0Q29uc2lzdGVuY3koKSBjb25zdDsKKyAgYm9vbCBDYXN0Q29uc2lzdGVuY3koKSBjb25zdDsKIAogICBjb25zdCBDWFhCYXNlU3BlY2lmaWVyICogY29uc3QgKnBhdGhfYnVmZmVyKCkgY29uc3QgewogICAgIHJldHVybiBjb25zdF9jYXN0PENhc3RFeHByKj4odGhpcyktPnBhdGhfYnVmZmVyKCk7CkBAIC0yNjY0LDkgKzI2NzcsNyBAQAogICAgIGFzc2VydChraW5kICE9IENLX0ludmFsaWQgJiYgImNyZWF0aW5nIGNhc3Qgd2l0aCBpbnZhbGlkIGNhc3Qga2luZCIpOwogICAgIENhc3RFeHByQml0cy5LaW5kID0ga2luZDsKICAgICBzZXRCYXNlUGF0aFNpemUoQmFzZVBhdGhTaXplKTsKLSNpZm5kZWYgTkRFQlVHCi0gICAgQ2hlY2tDYXN0Q29uc2lzdGVuY3koKTsKLSNlbmRpZgorICAgIGFzc2VydChDYXN0Q29uc2lzdGVuY3koKSk7CiAgIH0KIAogICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBjYXN0LgpAQCAtMzc3NCw2ICszNzg1LDE0IEBACiAgIHZvaWQgc2V0SW5pdCh1bnNpZ25lZCBJbml0LCBFeHByICpleHByKSB7CiAgICAgYXNzZXJ0KEluaXQgPCBnZXROdW1Jbml0cygpICYmICJJbml0aWFsaXplciBhY2Nlc3Mgb3V0IG9mIHJhbmdlISIpOwogICAgIEluaXRFeHByc1tJbml0XSA9IGV4cHI7CisKKyAgICBpZiAoZXhwcikgeworICAgICAgRXhwckJpdHMuVHlwZURlcGVuZGVudCB8PSBleHByLT5pc1R5cGVEZXBlbmRlbnQoKTsKKyAgICAgIEV4cHJCaXRzLlZhbHVlRGVwZW5kZW50IHw9IGV4cHItPmlzVmFsdWVEZXBlbmRlbnQoKTsKKyAgICAgIEV4cHJCaXRzLkluc3RhbnRpYXRpb25EZXBlbmRlbnQgfD0gZXhwci0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCk7CisgICAgICBFeHByQml0cy5Db250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrIHw9CisgICAgICAgICAgZXhwci0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpOworICAgIH0KICAgfQogCiAgIC8vLyBcYnJpZWYgUmVzZXJ2ZSBzcGFjZSBmb3Igc29tZSBudW1iZXIgb2YgaW5pdGlhbGl6ZXJzLgpAQCAtNDE4NiwxOCArNDIwNSwxNCBAQAogICAvLy8gYW5kIGFycmF5LXJhbmdlIGRlc2lnbmF0b3JzLgogICB1bnNpZ25lZCBnZXROdW1TdWJFeHBycygpIGNvbnN0IHsgcmV0dXJuIE51bVN1YkV4cHJzOyB9CiAKLSAgRXhwciAqZ2V0U3ViRXhwcih1bnNpZ25lZCBJZHgpIHsKKyAgRXhwciAqZ2V0U3ViRXhwcih1bnNpZ25lZCBJZHgpIGNvbnN0IHsKICAgICBhc3NlcnQoSWR4IDwgTnVtU3ViRXhwcnMgJiYgIlN1YnNjcmlwdCBvdXQgb2YgcmFuZ2UiKTsKLSAgICBjaGFyKiBQdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oc3RhdGljX2Nhc3Q8dm9pZCAqPih0aGlzKSk7Ci0gICAgUHRyICs9IHNpemVvZihEZXNpZ25hdGVkSW5pdEV4cHIpOwotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEV4cHIqKj4ocmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KFB0cikpW0lkeF07CisgICAgcmV0dXJuIGNhc3Q8RXhwcj4ocmVpbnRlcnByZXRfY2FzdDxTdG10ICpjb25zdCAqPih0aGlzICsgMSlbSWR4XSk7CiAgIH0KIAogICB2b2lkIHNldFN1YkV4cHIodW5zaWduZWQgSWR4LCBFeHByICpFKSB7CiAgICAgYXNzZXJ0KElkeCA8IE51bVN1YkV4cHJzICYmICJTdWJzY3JpcHQgb3V0IG9mIHJhbmdlIik7Ci0gICAgY2hhciogUHRyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHN0YXRpY19jYXN0PHZvaWQgKj4odGhpcykpOwotICAgIFB0ciArPSBzaXplb2YoRGVzaWduYXRlZEluaXRFeHByKTsKLSAgICByZWludGVycHJldF9jYXN0PEV4cHIqKj4ocmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KFB0cikpW0lkeF0gPSBFOworICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odGhpcyArIDEpW0lkeF0gPSBFOwogICB9CiAKICAgLy8vIFxicmllZiBSZXBsYWNlcyB0aGUgZGVzaWduYXRvciBhdCBpbmRleCBAcCBJZHggd2l0aCB0aGUgc2VyaWVzCkBAIC00NjIxLDcgKzQ2MzYsNyBAQAogcHVibGljOgogICAvLy8gTm9SZXN1bHQgLSBBIHZhbHVlIGZvciB0aGUgcmVzdWx0IGluZGV4IGluZGljYXRpbmcgdGhhdCB0aGVyZSBpcwogICAvLy8gbm8gc2VtYW50aWMgcmVzdWx0LgotICBlbnVtIExMVk1fRU5VTV9JTlRfVFlQRSh1bnNpZ25lZCkgeyBOb1Jlc3VsdCA9IH4wVSB9OworICBlbnVtIDogdW5zaWduZWQgeyBOb1Jlc3VsdCA9IH4wVSB9OwogCiAgIHN0YXRpYyBQc2V1ZG9PYmplY3RFeHByICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwgRXhwciAqc3ludGFjdGljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIqPiBzZW1hbnRpYywKQEAgLTQ3MTMsNiArNDcyOCwxNiBAQAogICAgIEJJX0ZpcnN0ID0gMAogICB9OwogCisgIC8vIFRoZSBBQkkgdmFsdWVzIGZvciB2YXJpb3VzIGF0b21pYyBtZW1vcnkgb3JkZXJpbmdzLgorICBlbnVtIEF0b21pY09yZGVyaW5nS2luZCB7CisgICAgQU9fQUJJX21lbW9yeV9vcmRlcl9yZWxheGVkID0gMCwKKyAgICBBT19BQklfbWVtb3J5X29yZGVyX2NvbnN1bWUgPSAxLAorICAgIEFPX0FCSV9tZW1vcnlfb3JkZXJfYWNxdWlyZSA9IDIsCisgICAgQU9fQUJJX21lbW9yeV9vcmRlcl9yZWxlYXNlID0gMywKKyAgICBBT19BQklfbWVtb3J5X29yZGVyX2FjcV9yZWwgPSA0LAorICAgIEFPX0FCSV9tZW1vcnlfb3JkZXJfc2VxX2NzdCA9IDUKKyAgfTsKKwogcHJpdmF0ZToKICAgZW51bSB7IFBUUiwgT1JERVIsIFZBTDEsIE9SREVSX0ZBSUwsIFZBTDIsIFdFQUssIEVORF9FWFBSIH07CiAgIFN0bXQqIFN1YkV4cHJzW0VORF9FWFBSXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL0V4cHJDWFguaCBiL2luY2x1ZGUvY2xhbmcvQVNUL0V4cHJDWFguaAppbmRleCA2MzU2ZWU3Li42ZWQ1NWNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9FeHByQ1hYLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvRXhwckNYWC5oCkBAIC0xMTYxLDcgKzExNjEsMTAgQEAKICAgY29uc3RfYXJnX2l0ZXJhdG9yIGFyZ19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEFyZ3M7IH0KICAgY29uc3RfYXJnX2l0ZXJhdG9yIGFyZ19lbmQoKSBjb25zdCB7IHJldHVybiBBcmdzICsgTnVtQXJnczsgfQogCi0gIEV4cHIgKipnZXRBcmdzKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFeHByICoqPihBcmdzKTsgfQorICBFeHByICoqZ2V0QXJncygpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqKj4oQXJncyk7IH0KKyAgY29uc3QgRXhwciAqY29uc3QgKmdldEFyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q1hYQ29uc3RydWN0RXhwciAqPih0aGlzKS0+Z2V0QXJncygpOworICB9CiAgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzOyB9CiAKICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNwZWNpZmllZCBhcmd1bWVudC4KQEAgLTIxMTAsMTM4ICsyMTEzLDEyIEBACiAgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoJkJhc2UsICZCYXNlICsgMSk7IH0KIH07CiAKLS8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIEdDQyBvciBNUyB1bmFyeSB0eXBlIHRyYWl0LCBhcyB1c2VkIGluIHRoZQotLy8vIGltcGxlbWVudGF0aW9uIG9mIFRSMS9DKysxMSB0eXBlIHRyYWl0IHRlbXBsYXRlcy4KLS8vLwotLy8vIEV4YW1wbGU6Ci0vLy8gXGNvZGUKLS8vLyAgIF9faXNfcG9kKGludCkgPT0gdHJ1ZQotLy8vICAgX19pc19lbnVtKHN0ZDo6c3RyaW5nKSA9PSBmYWxzZQotLy8vIFxlbmRjb2RlCi1jbGFzcyBVbmFyeVR5cGVUcmFpdEV4cHIgOiBwdWJsaWMgRXhwciB7Ci0gIC8vLyBcYnJpZWYgVGhlIHRyYWl0LiBBIFVuYXJ5VHlwZVRyYWl0IGVudW0gaW4gTVNWQyBjb21wYXRpYmxlIHVuc2lnbmVkLgotICB1bnNpZ25lZCBVVFQgOiAzMTsKLSAgLy8vIFRoZSB2YWx1ZSBvZiB0aGUgdHlwZSB0cmFpdC4gVW5zcGVjaWZpZWQgaWYgZGVwZW5kZW50LgotICBib29sIFZhbHVlIDogMTsKLQotICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgdHlwZSB0cmFpdCBrZXl3b3JkLgotICBTb3VyY2VMb2NhdGlvbiBMb2M7Ci0KLSAgLy8vIFxicmllZiBUaGUgbG9jYXRpb24gb2YgdGhlIGNsb3NpbmcgcGFyZW4uCi0gIFNvdXJjZUxvY2F0aW9uIFJQYXJlbjsKLQotICAvLy8gXGJyaWVmIFRoZSB0eXBlIGJlaW5nIHF1ZXJpZWQuCi0gIFR5cGVTb3VyY2VJbmZvICpRdWVyaWVkVHlwZTsKLQotcHVibGljOgotICBVbmFyeVR5cGVUcmFpdEV4cHIoU291cmNlTG9jYXRpb24gbG9jLCBVbmFyeVR5cGVUcmFpdCB1dHQsCi0gICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqcXVlcmllZCwgYm9vbCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIHJwYXJlbiwgUXVhbFR5cGUgdHkpCi0gICAgOiBFeHByKFVuYXJ5VHlwZVRyYWl0RXhwckNsYXNzLCB0eSwgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwKLSAgICAgICAgICAgZmFsc2UsICBxdWVyaWVkLT5nZXRUeXBlKCktPmlzRGVwZW5kZW50VHlwZSgpLAotICAgICAgICAgICBxdWVyaWVkLT5nZXRUeXBlKCktPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSwKLSAgICAgICAgICAgcXVlcmllZC0+Z2V0VHlwZSgpLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAotICAgICAgVVRUKHV0dCksIFZhbHVlKHZhbHVlKSwgTG9jKGxvYyksIFJQYXJlbihycGFyZW4pLCBRdWVyaWVkVHlwZShxdWVyaWVkKSB7IH0KLQotICBleHBsaWNpdCBVbmFyeVR5cGVUcmFpdEV4cHIoRW1wdHlTaGVsbCBFbXB0eSkKLSAgICA6IEV4cHIoVW5hcnlUeXBlVHJhaXRFeHByQ2xhc3MsIEVtcHR5KSwgVVRUKDApLCBWYWx1ZShmYWxzZSksCi0gICAgICBRdWVyaWVkVHlwZSgpIHsgfQotCi0gIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KLSAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSUGFyZW47IH0KLQotICBVbmFyeVR5cGVUcmFpdCBnZXRUcmFpdCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PFVuYXJ5VHlwZVRyYWl0PihVVFQpOyB9Ci0KLSAgUXVhbFR5cGUgZ2V0UXVlcmllZFR5cGUoKSBjb25zdCB7IHJldHVybiBRdWVyaWVkVHlwZS0+Z2V0VHlwZSgpOyB9Ci0KLSAgVHlwZVNvdXJjZUluZm8gKmdldFF1ZXJpZWRUeXBlU291cmNlSW5mbygpIGNvbnN0IHsgcmV0dXJuIFF1ZXJpZWRUeXBlOyB9Ci0KLSAgYm9vbCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9Ci0KLSAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7Ci0gICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IFVuYXJ5VHlwZVRyYWl0RXhwckNsYXNzOwotICB9Ci0KLSAgLy8gSXRlcmF0b3JzCi0gIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoKTsgfQotCi0gIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOwotfTsKLQotLy8vIFxicmllZiBSZXByZXNlbnRzIGEgR0NDIG9yIE1TIGJpbmFyeSB0eXBlIHRyYWl0LCBhcyB1c2VkIGluIHRoZQotLy8vIGltcGxlbWVudGF0aW9uIG9mIFRSMS9DKysxMSB0eXBlIHRyYWl0IHRlbXBsYXRlcy4KLS8vLwotLy8vIEV4YW1wbGU6Ci0vLy8gXGNvZGUKLS8vLyAgIF9faXNfYmFzZV9vZihCYXNlLCBEZXJpdmVkKSA9PSB0cnVlCi0vLy8gXGVuZGNvZGUKLWNsYXNzIEJpbmFyeVR5cGVUcmFpdEV4cHIgOiBwdWJsaWMgRXhwciB7Ci0gIC8vLyBcYnJpZWYgVGhlIHRyYWl0LiBBIEJpbmFyeVR5cGVUcmFpdCBlbnVtIGluIE1TVkMgY29tcGF0aWJsZSB1bnNpZ25lZC4KLSAgdW5zaWduZWQgQlRUIDogODsKLQotICAvLy8gVGhlIHZhbHVlIG9mIHRoZSB0eXBlIHRyYWl0LiBVbnNwZWNpZmllZCBpZiBkZXBlbmRlbnQuCi0gIGJvb2wgVmFsdWUgOiAxOwotCi0gIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIG9mIHRoZSB0eXBlIHRyYWl0IGtleXdvcmQuCi0gIFNvdXJjZUxvY2F0aW9uIExvYzsKLQotICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgY2xvc2luZyBwYXJlbi4KLSAgU291cmNlTG9jYXRpb24gUlBhcmVuOwotCi0gIC8vLyBcYnJpZWYgVGhlIGxocyB0eXBlIGJlaW5nIHF1ZXJpZWQuCi0gIFR5cGVTb3VyY2VJbmZvICpMaHNUeXBlOwotCi0gIC8vLyBcYnJpZWYgVGhlIHJocyB0eXBlIGJlaW5nIHF1ZXJpZWQuCi0gIFR5cGVTb3VyY2VJbmZvICpSaHNUeXBlOwotCi1wdWJsaWM6Ci0gIEJpbmFyeVR5cGVUcmFpdEV4cHIoU291cmNlTG9jYXRpb24gbG9jLCBCaW5hcnlUeXBlVHJhaXQgYnR0LAotICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKmxoc1R5cGUsIFR5cGVTb3VyY2VJbmZvICpyaHNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZSwgU291cmNlTG9jYXRpb24gcnBhcmVuLCBRdWFsVHlwZSB0eSkKLSAgICA6IEV4cHIoQmluYXJ5VHlwZVRyYWl0RXhwckNsYXNzLCB0eSwgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwgZmFsc2UsCi0gICAgICAgICAgIGxoc1R5cGUtPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCkgfHwKLSAgICAgICAgICAgcmhzVHlwZS0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSwKLSAgICAgICAgICAgKGxoc1R5cGUtPmdldFR5cGUoKS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpIHx8Ci0gICAgICAgICAgICByaHNUeXBlLT5nZXRUeXBlKCktPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSksCi0gICAgICAgICAgIChsaHNUeXBlLT5nZXRUeXBlKCktPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSB8fAotICAgICAgICAgICAgcmhzVHlwZS0+Z2V0VHlwZSgpLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpKSwKLSAgICAgIEJUVChidHQpLCBWYWx1ZSh2YWx1ZSksIExvYyhsb2MpLCBSUGFyZW4ocnBhcmVuKSwKLSAgICAgIExoc1R5cGUobGhzVHlwZSksIFJoc1R5cGUocmhzVHlwZSkgeyB9Ci0KLQotICBleHBsaWNpdCBCaW5hcnlUeXBlVHJhaXRFeHByKEVtcHR5U2hlbGwgRW1wdHkpCi0gICAgOiBFeHByKEJpbmFyeVR5cGVUcmFpdEV4cHJDbGFzcywgRW1wdHkpLCBCVFQoMCksIFZhbHVlKGZhbHNlKSwKLSAgICAgIExoc1R5cGUoKSwgUmhzVHlwZSgpIHsgfQotCi0gIFNvdXJjZUxvY2F0aW9uIGdldExvY1N0YXJ0KCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBMb2M7IH0KLSAgU291cmNlTG9jYXRpb24gZ2V0TG9jRW5kKCkgY29uc3QgTExWTV9SRUFET05MWSB7IHJldHVybiBSUGFyZW47IH0KLQotICBCaW5hcnlUeXBlVHJhaXQgZ2V0VHJhaXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEJpbmFyeVR5cGVUcmFpdD4oQlRUKTsKLSAgfQotCi0gIFF1YWxUeXBlIGdldExoc1R5cGUoKSBjb25zdCB7IHJldHVybiBMaHNUeXBlLT5nZXRUeXBlKCk7IH0KLSAgUXVhbFR5cGUgZ2V0UmhzVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFJoc1R5cGUtPmdldFR5cGUoKTsgfQotCi0gIFR5cGVTb3VyY2VJbmZvICpnZXRMaHNUeXBlU291cmNlSW5mbygpIGNvbnN0IHsgcmV0dXJuIExoc1R5cGU7IH0KLSAgVHlwZVNvdXJjZUluZm8gKmdldFJoc1R5cGVTb3VyY2VJbmZvKCkgY29uc3QgeyByZXR1cm4gUmhzVHlwZTsgfQotCi0gIGJvb2wgZ2V0VmFsdWUoKSBjb25zdCB7IGFzc2VydCghaXNUeXBlRGVwZW5kZW50KCkpOyByZXR1cm4gVmFsdWU7IH0KLQotICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFN0bXQgKlQpIHsKLSAgICByZXR1cm4gVC0+Z2V0U3RtdENsYXNzKCkgPT0gQmluYXJ5VHlwZVRyYWl0RXhwckNsYXNzOwotICB9Ci0KLSAgLy8gSXRlcmF0b3JzCi0gIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gY2hpbGRfcmFuZ2UoKTsgfQotCi0gIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOwotfTsKLQogLy8vIFxicmllZiBBIHR5cGUgdHJhaXQgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdmFyaW91cyBDKysxMSBhbmQKIC8vLyBMaWJyYXJ5IFRSMSB0cmFpdCB0ZW1wbGF0ZXMuCiAvLy8KIC8vLyBcY29kZQorLy8vICAgX19pc19wb2QoaW50KSA9PSB0cnVlCisvLy8gICBfX2lzX2VudW0oc3RkOjpzdHJpbmcpID09IGZhbHNlCiAvLy8gICBfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlKHZlY3RvcjxpbnQ+LCBpbnQqLCBpbnQqKQogLy8vIFxlbmRjb2RlCiBjbGFzcyBUeXBlVHJhaXRFeHByIDogcHVibGljIEV4cHIgewpAQCAtMjMzNCw3ICsyMjExLDcgQEAKICAgZnJpZW5kIGNsYXNzIEFTVFN0bXRXcml0ZXI7CiAKIH07Ci0gIAorCiAvLy8gXGJyaWVmIEFuIEVtYmFyY2FkZXJvIGFycmF5IHR5cGUgdHJhaXQsIGFzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mCiAvLy8gX19hcnJheV9yYW5rIGFuZCBfX2FycmF5X2V4dGVudC4KIC8vLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvRXhwck9iakMuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL0V4cHJPYmpDLmgKaW5kZXggYWViNTVkYS4uZmM3OGU4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvRXhwck9iakMuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9FeHByT2JqQy5oCkBAIC0yMTUsNyArMjE1LDcgQEAKIH0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwogCiBuYW1lc3BhY2UgbGx2bSB7Ci10ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNQb2RMaWtlPGNsYW5nOjpPYmpDRGljdGlvbmFyeUVsZW1lbnQ+IDogbGx2bTo6dHJ1ZV90eXBlIHt9OwordGVtcGxhdGUgPD4gc3RydWN0IGlzUG9kTGlrZTxjbGFuZzo6T2JqQ0RpY3Rpb25hcnlFbGVtZW50PiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwogfQogCiBuYW1lc3BhY2UgY2xhbmcgewpAQCAtNjgzLDEzICs2ODMsMTMgQEAKICAgICBpZiAoaXNFeHBsaWNpdFByb3BlcnR5KCkpIHsKICAgICAgIGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgKlBEZWNsID0gZ2V0RXhwbGljaXRQcm9wZXJ0eSgpOwogICAgICAgaWYgKGNvbnN0IE9iakNNZXRob2REZWNsICpHZXR0ZXIgPSBQRGVjbC0+Z2V0R2V0dGVyTWV0aG9kRGVjbCgpKQotICAgICAgICBSZXN1bHRUeXBlID0gR2V0dGVyLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgICAgIFJlc3VsdFR5cGUgPSBHZXR0ZXItPmdldFJldHVyblR5cGUoKTsKICAgICAgIGVsc2UKICAgICAgICAgUmVzdWx0VHlwZSA9IFBEZWNsLT5nZXRUeXBlKCk7CiAgICAgfSBlbHNlIHsKICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpHZXR0ZXIgPSBnZXRJbXBsaWNpdFByb3BlcnR5R2V0dGVyKCk7CiAgICAgICBpZiAoR2V0dGVyKQotICAgICAgICBSZXN1bHRUeXBlID0gR2V0dGVyLT5nZXRSZXN1bHRUeXBlKCk7IC8vIHdpdGggcmVmZXJlbmNlIQorICAgICAgICBSZXN1bHRUeXBlID0gR2V0dGVyLT5nZXRSZXR1cm5UeXBlKCk7IC8vIHdpdGggcmVmZXJlbmNlIQogICAgIH0KICAgICByZXR1cm4gUmVzdWx0VHlwZTsKICAgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvRXh0ZXJuYWxBU1RTb3VyY2UuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL0V4dGVybmFsQVNUU291cmNlLmgKaW5kZXggYjA3NzQyNi4uNTRlOTZkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvRXh0ZXJuYWxBU1RTb3VyY2UuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9FeHRlcm5hbEFTVFNvdXJjZS5oCkBAIC01Myw3ICs1Myw3IEBACiAvLy8gc291cmNlcyBjYW4gcmVzb2x2ZSB0eXBlcyBhbmQgZGVjbGFyYXRpb25zIGZyb20gYWJzdHJhY3QgSURzIGludG8KIC8vLyBhY3R1YWwgdHlwZSBhbmQgZGVjbGFyYXRpb24gbm9kZXMsIGFuZCByZWFkIHBhcnRzIG9mIGRlY2xhcmF0aW9uCiAvLy8gY29udGV4dHMuCi1jbGFzcyBFeHRlcm5hbEFTVFNvdXJjZSB7CitjbGFzcyBFeHRlcm5hbEFTVFNvdXJjZSA6IHB1YmxpYyBSZWZDb3VudGVkQmFzZTxFeHRlcm5hbEFTVFNvdXJjZT4gewogICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBBU1Qgc291cmNlIGFsc28gcHJvdmlkZXMgaW5mb3JtYXRpb24gZm9yCiAgIC8vLyBzZW1hbnRpYyBhbmFseXNpcy4KICAgYm9vbCBTZW1hU291cmNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvTWFrZWZpbGUgYi9pbmNsdWRlL2NsYW5nL0FTVC9NYWtlZmlsZQppbmRleCBhZTg0YmNmLi44NWU2NDQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9NYWtlZmlsZQorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9NYWtlZmlsZQpAQCAtMSw2ICsxLDYgQEAKIENMQU5HX0xFVkVMIDo9IC4uLy4uLy4uCiBURF9TUkNfRElSID0gJChQUk9KX1NSQ19ESVIpLy4uL0Jhc2ljCi1CVUlMVF9TT1VSQ0VTID0gQXR0cnMuaW5jIEF0dHJJbXBsLmluYyBBdHRyRHVtcC5pbmMgXAorQlVJTFRfU09VUkNFUyA9IEF0dHJzLmluYyBBdHRySW1wbC5pbmMgQXR0ckR1bXAuaW5jIEF0dHJWaXNpdG9yLmluYyBcCiAgICAgICAgICAgICAgICAgU3RtdE5vZGVzLmluYyBEZWNsTm9kZXMuaW5jIFwKICAgICAgICAgICAgICAgICBDb21tZW50Tm9kZXMuaW5jIENvbW1lbnRIVE1MVGFncy5pbmMgXAogICAgICAgICAgICAgICAgIENvbW1lbnRIVE1MVGFnc1Byb3BlcnRpZXMuaW5jIFwKQEAgLTMwLDYgKzMwLDEyIEBACiAJJChWZXJiKSAkKENsYW5nVGFibGVHZW4pIC1nZW4tY2xhbmctYXR0ci1kdW1wIC1vICQoY2FsbCBTWVNQQVRILCAkQCkgXAogCQktSSAkKFBST0pfU1JDX0RJUikvLi4vLi4vICQ8CiAKKyQoT2JqRGlyKS9BdHRyVmlzaXRvci5pbmMudG1wIDogJChURF9TUkNfRElSKS9BdHRyLnRkICQoQ0xBTkdfVEJMR0VOKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoT2JqRGlyKS8uZGlyCisJJChFY2hvKSAiQnVpbGRpbmcgQ2xhbmcgYXR0cmlidXRlIEFTVCB2aXNpdG9yIHdpdGggdGJsZ2VuIgorCSQoVmVyYikgJChDbGFuZ1RhYmxlR2VuKSAtZ2VuLWNsYW5nLWF0dHItYXN0LXZpc2l0b3IgLW8gJChjYWxsIFNZU1BBVEgsICRAKSBcCisJCS1JICQoUFJPSl9TUkNfRElSKS8uLi8uLi8gJDwKKwogJChPYmpEaXIpL1N0bXROb2Rlcy5pbmMudG1wIDogJChURF9TUkNfRElSKS9TdG10Tm9kZXMudGQgJChDTEFOR19UQkxHRU4pIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoT2JqRGlyKS8uZGlyCiAJJChFY2hvKSAiQnVpbGRpbmcgQ2xhbmcgc3RhdGVtZW50IG5vZGUgdGFibGVzIHdpdGggdGJsZ2VuIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvTWFuZ2xlLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9NYW5nbGUuaAppbmRleCBjNGQwZDIyLi4yOGJjZDhiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9NYW5nbGUuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9NYW5nbGUuaApAQCAtMzEsOSArMzEsMTAgQEAKICAgY2xhc3MgRnVuY3Rpb25EZWNsOwogICBjbGFzcyBOYW1lZERlY2w7CiAgIGNsYXNzIE9iakNNZXRob2REZWNsOwotICBjbGFzcyBWYXJEZWNsOworICBjbGFzcyBTdHJpbmdMaXRlcmFsOwogICBzdHJ1Y3QgVGhpc0FkanVzdG1lbnQ7CiAgIHN0cnVjdCBUaHVua0luZm87CisgIGNsYXNzIFZhckRlY2w7CiAKIC8vLyBNYW5nbGVCdWZmZXIgLSBhIGNvbnZlbmllbnQgY2xhc3MgZm9yIHN0b3JpbmcgYSBuYW1lIHdoaWNoIGlzCiAvLy8gZWl0aGVyIHRoZSByZXN1bHQgb2YgYSBtYW5nbGluZyBvciBpcyBhIGNvbnN0YW50IHN0cmluZyB3aXRoCkBAIC04MCw2ICs4MSw3IEBACiAKICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQmxvY2tEZWNsKiwgdW5zaWduZWQ+IEdsb2JhbEJsb2NrSWRzOwogICBsbHZtOjpEZW5zZU1hcDxjb25zdCBCbG9ja0RlY2wqLCB1bnNpZ25lZD4gTG9jYWxCbG9ja0lkczsKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgVGFnRGVjbCosIHVpbnQ2NF90PiBBbm9uU3RydWN0SWRzOwogCiBwdWJsaWM6CiAgIE1hbmdsZXJLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CkBAIC0xMDQsMTIgKzEwNiwxOSBAQAogICAgICAgUmVzdWx0ID0gQmxvY2tJZHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEJELCBCbG9ja0lkcy5zaXplKCkpKTsKICAgICByZXR1cm4gUmVzdWx0LmZpcnN0LT5zZWNvbmQ7CiAgIH0KLSAgCisKKyAgdWludDY0X3QgZ2V0QW5vbnltb3VzU3RydWN0SWQoY29uc3QgVGFnRGVjbCAqVEQpIHsKKyAgICBzdGQ6OnBhaXI8bGx2bTo6RGVuc2VNYXA8Y29uc3QgVGFnRGVjbCAqLCB1aW50NjRfdD46Oml0ZXJhdG9yLCBib29sPgorICAgICAgICBSZXN1bHQgPSBBbm9uU3RydWN0SWRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihURCwgQW5vblN0cnVjdElkcy5zaXplKCkpKTsKKyAgICByZXR1cm4gUmVzdWx0LmZpcnN0LT5zZWNvbmQ7CisgIH0KKwogICAvLy8gQG5hbWUgTWFuZ2xlciBFbnRyeSBQb2ludHMKICAgLy8vIEB7CiAKICAgYm9vbCBzaG91bGRNYW5nbGVEZWNsTmFtZShjb25zdCBOYW1lZERlY2wgKkQpOwogICB2aXJ0dWFsIGJvb2wgc2hvdWxkTWFuZ2xlQ1hYTmFtZShjb25zdCBOYW1lZERlY2wgKkQpID0gMDsKKyAgdmlydHVhbCBib29sIHNob3VsZE1hbmdsZVN0cmluZ0xpdGVyYWwoY29uc3QgU3RyaW5nTGl0ZXJhbCAqU0wpID0gMDsKIAogICAvLyBGSVhNRTogY29uc2lkZXIgcmVwbGFjaW5nIHJhd19vc3RyZWFtICYgd2l0aCBzb21ldGhpbmcgbGlrZSBTbWFsbFN0cmluZyAmLgogICB2b2lkIG1hbmdsZU5hbWUoY29uc3QgTmFtZWREZWNsICpELCByYXdfb3N0cmVhbSAmKTsKQEAgLTEyOCw2ICsxMzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBtYW5nbGVDWFhEdG9yKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpELCBDWFhEdG9yVHlwZSBUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBtYW5nbGVTdHJpbmdMaXRlcmFsKGNvbnN0IFN0cmluZ0xpdGVyYWwgKlNMLCByYXdfb3N0cmVhbSAmKSA9IDA7CiAKICAgdm9pZCBtYW5nbGVHbG9iYWxCbG9jayhjb25zdCBCbG9ja0RlY2wgKkJELAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVkRGVjbCAqSUQsCkBAIC0yMDAsNyArMjEwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCkgPSAwOwogCiAgIHZpcnR1YWwgdm9pZCBtYW5nbGVWaXJ0dWFsTWVtUHRyVGh1bmsoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5WRlRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpID0gMDsKIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1hbmdsZUNvbnRleHQgKkMpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL01hbmdsZU51bWJlcmluZ0NvbnRleHQuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL01hbmdsZU51bWJlcmluZ0NvbnRleHQuaAppbmRleCA1YTIyN2YyLi41NmM5OTUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9NYW5nbGVOdW1iZXJpbmdDb250ZXh0LmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvTWFuZ2xlTnVtYmVyaW5nQ29udGV4dC5oCkBAIC0zMyw3ICszMyw2IEBACiBjbGFzcyBNYW5nbGVOdW1iZXJpbmdDb250ZXh0IAogICAgIDogcHVibGljIFJlZkNvdW50ZWRCYXNlPE1hbmdsZU51bWJlcmluZ0NvbnRleHQ+IHsKICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgVHlwZSAqLCB1bnNpZ25lZD4gTWFuZ2xpbmdOdW1iZXJzOwotICBsbHZtOjpEZW5zZU1hcDxJZGVudGlmaWVySW5mbyosIHVuc2lnbmVkPiBUYWdNYW5nbGluZ051bWJlcnM7CiAKIHB1YmxpYzoKICAgdmlydHVhbCB+TWFuZ2xlTnVtYmVyaW5nQ29udGV4dCgpIHt9CkBAIC00NiwxMyArNDUsMTggQEAKICAgLy8vIGNvbnRleHQuCiAgIHVuc2lnbmVkIGdldE1hbmdsaW5nTnVtYmVyKGNvbnN0IEJsb2NrRGVjbCAqQkQpOwogCi0gIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1hbmdsaW5nIG51bWJlciBvZiBhIHN0YXRpYyBsb2NhbCB2YXJpYWJsZSB3aXRoaW4KLSAgLy8vIHRoaXMgY29udGV4dC4KLSAgdmlydHVhbCB1bnNpZ25lZCBnZXRNYW5nbGluZ051bWJlcihjb25zdCBWYXJEZWNsICpWRCkgPSAwOworICAvLy8gU3RhdGljIGxvY2FscyBhcmUgbnVtYmVyZWQgYnkgc291cmNlIG9yZGVyLgorICB1bnNpZ25lZCBnZXRTdGF0aWNMb2NhbE51bWJlcihjb25zdCBWYXJEZWNsICpWRCk7CiAKICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbWFuZ2xpbmcgbnVtYmVyIG9mIGEgc3RhdGljIGxvY2FsIHZhcmlhYmxlIHdpdGhpbgogICAvLy8gdGhpcyBjb250ZXh0LgotICB1bnNpZ25lZCBnZXRNYW5nbGluZ051bWJlcihjb25zdCBUYWdEZWNsICpURCk7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWFuZ2xpbmdOdW1iZXIoY29uc3QgVmFyRGVjbCAqVkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTVNMb2NhbE1hbmdsaW5nTnVtYmVyKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbWFuZ2xpbmcgbnVtYmVyIG9mIGEgc3RhdGljIGxvY2FsIHZhcmlhYmxlIHdpdGhpbgorICAvLy8gdGhpcyBjb250ZXh0LgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE1hbmdsaW5nTnVtYmVyKGNvbnN0IFRhZ0RlY2wgKlRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1TTG9jYWxNYW5nbGluZ051bWJlcikgPSAwOwogfTsKICAgCiB9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL09wZW5NUENsYXVzZS5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvT3Blbk1QQ2xhdXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiNWNlNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL09wZW5NUENsYXVzZS5oCkBAIC0wLDAgKzEsNjE3IEBACisvLz09PS0gT3Blbk1QQ2xhdXNlLmggLSBDbGFzc2VzIGZvciBPcGVuTVAgY2xhdXNlcyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFRoaXMgZmlsZSBkZWZpbmVzIE9wZW5NUCBBU1QgY2xhc3NlcyBmb3IgY2xhdXNlcy4KKy8vLyBUaGVyZSBhcmUgY2xhdXNlcyBmb3IgZXhlY3V0YWJsZSBkaXJlY3RpdmVzLCBjbGF1c2VzIGZvciBkZWNsYXJhdGl2ZQorLy8vIGRpcmVjdGl2ZXMgYW5kIGNsYXVzZXMgd2hpY2ggY2FuIGJlIHVzZWQgaW4gYm90aCBraW5kcyBvZiBkaXJlY3RpdmVzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX09QRU5NUENMQVVTRV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX09QRU5NUENMQVVTRV9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQVNUIGNsYXNzZXMgZm9yIGNsYXVzZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gXGJyaWVmIFRoaXMgaXMgYSBiYXNpYyBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIHNpbmdsZSBPcGVuTVAgY2xhdXNlLgorLy8vCitjbGFzcyBPTVBDbGF1c2UgeworICAvLy8gXGJyaWVmIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UgKHRoZSBjbGF1c2Uga2V5d29yZCkuCisgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jOworICAvLy8gXGJyaWVmIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICBTb3VyY2VMb2NhdGlvbiBFbmRMb2M7CisgIC8vLyBcYnJpZWYgS2luZCBvZiB0aGUgY2xhdXNlLgorICBPcGVuTVBDbGF1c2VLaW5kIEtpbmQ7CisKK3Byb3RlY3RlZDoKKyAgT01QQ2xhdXNlKE9wZW5NUENsYXVzZUtpbmQgSywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogU3RhcnRMb2MoU3RhcnRMb2MpLCBFbmRMb2MoRW5kTG9jKSwgS2luZChLKSB7fQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgU291cmNlTG9jYXRpb24gZ2V0TG9jU3RhcnQoKSBjb25zdCB7IHJldHVybiBTdGFydExvYzsgfQorICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NFbmQoKSBjb25zdCB7IHJldHVybiBFbmRMb2M7IH0KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIHZvaWQgc2V0TG9jU3RhcnQoU291cmNlTG9jYXRpb24gTG9jKSB7IFN0YXJ0TG9jID0gTG9jOyB9CisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgZW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIHZvaWQgc2V0TG9jRW5kKFNvdXJjZUxvY2F0aW9uIExvYykgeyBFbmRMb2MgPSBMb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMga2luZCBvZiBPcGVuTVAgY2xhdXNlIChwcml2YXRlLCBzaGFyZWQsIHJlZHVjdGlvbiwgZXRjLikuCisgIE9wZW5NUENsYXVzZUtpbmQgZ2V0Q2xhdXNlS2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICBib29sIGlzSW1wbGljaXQoKSBjb25zdCB7IHJldHVybiBTdGFydExvYy5pc0ludmFsaWQoKTsgfQorCisgIFN0bXRSYW5nZSBjaGlsZHJlbigpOworICBDb25zdFN0bXRSYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxPTVBDbGF1c2UgKj4odGhpcyktPmNoaWxkcmVuKCk7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsgcmV0dXJuIHRydWU7IH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZXMgd2l0aCB0aGUgbGlzdCBvZiB2YXJpYWJsZXMgbGlrZSAncHJpdmF0ZScsCisvLy8gJ2ZpcnN0cHJpdmF0ZScsICdjb3B5aW4nLCAnc2hhcmVkJywgb3IgJ3JlZHVjdGlvbicgY2xhdXNlcyBpbiB0aGUKKy8vLyAnI3ByYWdtYSBvbXAgLi4uJyBkaXJlY3RpdmVzLgordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIE9NUFZhckxpc3RDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlIHsKKyAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKKyAgLy8vIFxicmllZiBMb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYzsKKyAgLy8vIFxicmllZiBOdW1iZXIgb2YgdmFyaWFibGVzIGluIHRoZSBsaXN0LgorICB1bnNpZ25lZCBOdW1WYXJzOworCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgRmV0Y2hlcyBsaXN0IG9mIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGF1c2UuCisgIGxsdm06Ok11dGFibGVBcnJheVJlZjxFeHByICo+IGdldFZhclJlZnMoKSB7CisgICAgcmV0dXJuIGxsdm06Ok11dGFibGVBcnJheVJlZjxFeHByICo+KAorICAgICAgICByZWludGVycHJldF9jYXN0PEV4cHIgKio+KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KHRoaXMpICsKKyAgICAgICAgICAgIGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChzaXplb2YoVCksIGxsdm06OmFsaWduT2Y8RXhwciAqPigpKSksCisgICAgICAgIE51bVZhcnMpOworICB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsaXN0IG9mIHZhcmlhYmxlcyBmb3IgdGhpcyBjbGF1c2UuCisgIHZvaWQgc2V0VmFyUmVmcyhBcnJheVJlZjxFeHByICo+IFZMKSB7CisgICAgYXNzZXJ0KFZMLnNpemUoKSA9PSBOdW1WYXJzICYmCisgICAgICAgICAgICJOdW1iZXIgb2YgdmFyaWFibGVzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgcHJlYWxsb2NhdGVkIGJ1ZmZlciIpOworICAgIHN0ZDo6Y29weSgKKyAgICAgICAgVkwuYmVnaW4oKSwgVkwuZW5kKCksCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqKj4oCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIgKj4odGhpcykgKworICAgICAgICAgICAgbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KHNpemVvZihUKSwgbGx2bTo6YWxpZ25PZjxFeHByICo+KCkpKSk7CisgIH0KKworICAvLy8gXGJyaWVmIEJ1aWxkIGEgY2xhdXNlIHdpdGggXGEgTiB2YXJpYWJsZXMKKyAgLy8vCisgIC8vLyBccGFyYW0gSyBLaW5kIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZSAodGhlIGNsYXVzZSBrZXl3b3JkKS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOIE51bWJlciBvZiB0aGUgdmFyaWFibGVzIGluIHRoZSBjbGF1c2UuCisgIC8vLworICBPTVBWYXJMaXN0Q2xhdXNlKE9wZW5NUENsYXVzZUtpbmQgSywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIHVuc2lnbmVkIE4pCisgICAgICA6IE9NUENsYXVzZShLLCBTdGFydExvYywgRW5kTG9jKSwgTFBhcmVuTG9jKExQYXJlbkxvYyksIE51bVZhcnMoTikge30KKworcHVibGljOgorICB0eXBlZGVmIGxsdm06Ok11dGFibGVBcnJheVJlZjxFeHByICo+OjppdGVyYXRvciB2YXJsaXN0X2l0ZXJhdG9yOworICB0eXBlZGVmIEFycmF5UmVmPGNvbnN0IEV4cHIgKj46Oml0ZXJhdG9yIHZhcmxpc3RfY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8dmFybGlzdF9pdGVyYXRvcj4gdmFybGlzdF9yYW5nZTsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTx2YXJsaXN0X2NvbnN0X2l0ZXJhdG9yPiB2YXJsaXN0X2NvbnN0X3JhbmdlOworCisgIHVuc2lnbmVkIHZhcmxpc3Rfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE51bVZhcnM7IH0KKyAgYm9vbCB2YXJsaXN0X2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtVmFycyA9PSAwOyB9CisKKyAgdmFybGlzdF9yYW5nZSB2YXJsaXN0cygpIHsKKyAgICByZXR1cm4gdmFybGlzdF9yYW5nZSh2YXJsaXN0X2JlZ2luKCksIHZhcmxpc3RfZW5kKCkpOworICB9CisgIHZhcmxpc3RfY29uc3RfcmFuZ2UgdmFybGlzdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHZhcmxpc3RfY29uc3RfcmFuZ2UodmFybGlzdF9iZWdpbigpLCB2YXJsaXN0X2VuZCgpKTsKKyAgfQorCisgIHZhcmxpc3RfaXRlcmF0b3IgdmFybGlzdF9iZWdpbigpIHsgcmV0dXJuIGdldFZhclJlZnMoKS5iZWdpbigpOyB9CisgIHZhcmxpc3RfaXRlcmF0b3IgdmFybGlzdF9lbmQoKSB7IHJldHVybiBnZXRWYXJSZWZzKCkuZW5kKCk7IH0KKyAgdmFybGlzdF9jb25zdF9pdGVyYXRvciB2YXJsaXN0X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFyUmVmcygpLmJlZ2luKCk7IH0KKyAgdmFybGlzdF9jb25zdF9pdGVyYXRvciB2YXJsaXN0X2VuZCgpIGNvbnN0IHsgcmV0dXJuIGdldFZhclJlZnMoKS5lbmQoKTsgfQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgJygnLgorICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgTFBhcmVuTG9jID0gTG9jOyB9CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKworICAvLy8gXGJyaWVmIEZldGNoZXMgbGlzdCBvZiBhbGwgdmFyaWFibGVzIGluIHRoZSBjbGF1c2UuCisgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gZ2V0VmFyUmVmcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQXJyYXlSZWY8Y29uc3QgRXhwciAqPigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHByICpjb25zdCAqPigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPih0aGlzKSArCisgICAgICAgICAgICBsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoc2l6ZW9mKFQpLCBsbHZtOjphbGlnbk9mPEV4cHIgKj4oKSkpLAorICAgICAgICBOdW1WYXJzKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ2lmJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYoYSA+IDUpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBwYXJhbGxlbCcgaGFzIHNpbXBsZSAnaWYnCisvLy8gY2xhdXNlIHdpdGggY29uZGl0aW9uICdhID4gNScuCisvLy8KK2NsYXNzIE9NUElmQ2xhdXNlIDogcHVibGljIE9NUENsYXVzZSB7CisgIGZyaWVuZCBjbGFzcyBPTVBDbGF1c2VSZWFkZXI7CisgIC8vLyBcYnJpZWYgTG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2M7CisgIC8vLyBcYnJpZWYgQ29uZGl0aW9uIG9mIHRoZSAnaWYnIGNsYXVzZS4KKyAgU3RtdCAqQ29uZGl0aW9uOworCisgIC8vLyBcYnJpZWYgU2V0IGNvbmRpdGlvbi4KKyAgLy8vCisgIHZvaWQgc2V0Q29uZGl0aW9uKEV4cHIgKkNvbmQpIHsgQ29uZGl0aW9uID0gQ29uZDsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ2lmJyBjbGF1c2Ugd2l0aCBjb25kaXRpb24gXGEgQ29uZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIENvbmQgQ29uZGl0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8KKyAgT01QSWZDbGF1c2UoRXhwciAqQ29uZCwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19pZiwgU3RhcnRMb2MsIEVuZExvYyksIExQYXJlbkxvYyhMUGFyZW5Mb2MpLAorICAgICAgICBDb25kaXRpb24oQ29uZCkge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgLy8vCisgIE9NUElmQ2xhdXNlKCkKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfaWYsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpLAorICAgICAgICBMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24oKSksIENvbmRpdGlvbigwKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgJygnLgorICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgTFBhcmVuTG9jID0gTG9jOyB9CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgY29uZGl0aW9uLgorICBFeHByICpnZXRDb25kaXRpb24oKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oQ29uZGl0aW9uKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX2lmOworICB9CisKKyAgU3RtdFJhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gU3RtdFJhbmdlKCZDb25kaXRpb24sICZDb25kaXRpb24gKyAxKTsgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJ251bV90aHJlYWRzJyBjbGF1c2UgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCisvLy8gZGlyZWN0aXZlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg2KQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGhhcyBzaW1wbGUgJ251bV90aHJlYWRzJworLy8vIGNsYXVzZSB3aXRoIG51bWJlciBvZiB0aHJlYWRzICc2Jy4KKy8vLworY2xhc3MgT01QTnVtVGhyZWFkc0NsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOworICAvLy8gXGJyaWVmIENvbmRpdGlvbiBvZiB0aGUgJ251bV90aHJlYWRzJyBjbGF1c2UuCisgIFN0bXQgKk51bVRocmVhZHM7CisKKyAgLy8vIFxicmllZiBTZXQgY29uZGl0aW9uLgorICAvLy8KKyAgdm9pZCBzZXROdW1UaHJlYWRzKEV4cHIgKk5UaHJlYWRzKSB7IE51bVRocmVhZHMgPSBOVGhyZWFkczsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ251bV90aHJlYWRzJyBjbGF1c2Ugd2l0aCBjb25kaXRpb24gXGEgTnVtVGhyZWFkcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTnVtVGhyZWFkcyBOdW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIGNvbnN0cnVjdC4KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8KKyAgT01QTnVtVGhyZWFkc0NsYXVzZShFeHByICpOdW1UaHJlYWRzLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsIFNvdXJjZUxvY2F0aW9uIEVuZExvYykKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfbnVtX3RocmVhZHMsIFN0YXJ0TG9jLCBFbmRMb2MpLCBMUGFyZW5Mb2MoTFBhcmVuTG9jKSwKKyAgICAgICAgTnVtVGhyZWFkcyhOdW1UaHJlYWRzKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICAvLy8KKyAgT01QTnVtVGhyZWFkc0NsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX251bV90aHJlYWRzLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSwKKyAgICAgICAgTFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uKCkpLCBOdW1UaHJlYWRzKDApIHt9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBMUGFyZW5Mb2MgPSBMb2M7IH0KKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiAnKCcuCisgIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBudW1iZXIgb2YgdGhyZWFkcy4KKyAgRXhwciAqZ2V0TnVtVGhyZWFkcygpIGNvbnN0IHsgcmV0dXJuIGNhc3Rfb3JfbnVsbDxFeHByPihOdW1UaHJlYWRzKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX251bV90aHJlYWRzOworICB9CisKKyAgU3RtdFJhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gU3RtdFJhbmdlKCZOdW1UaHJlYWRzLCAmTnVtVGhyZWFkcyArIDEpOyB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnc2FmZWxlbicgY2xhdXNlIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJworLy8vIGRpcmVjdGl2ZS4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuKDQpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBzaW1kJyBoYXMgY2xhdXNlICdzYWZlbGVuJworLy8vIHdpdGggc2luZ2xlIGV4cHJlc3Npb24gJzQnLgorLy8vIElmIHRoZSBzYWZlbGVuIGNsYXVzZSBpcyB1c2VkIHRoZW4gbm8gdHdvIGl0ZXJhdGlvbnMgZXhlY3V0ZWQKKy8vLyBjb25jdXJyZW50bHkgd2l0aCBTSU1EIGluc3RydWN0aW9ucyBjYW4gaGF2ZSBhIGdyZWF0ZXIgZGlzdGFuY2UKKy8vLyBpbiB0aGUgbG9naWNhbCBpdGVyYXRpb24gc3BhY2UgdGhhbiBpdHMgdmFsdWUuIFRoZSBwYXJhbWV0ZXIgb2YKKy8vLyB0aGUgc2FmZWxlbiBjbGF1c2UgbXVzdCBiZSBhIGNvbnN0YW50IHBvc2l0aXZlIGludGVnZXIgZXhwcmVzc2lvbi4KKy8vLworY2xhc3MgT01QU2FmZWxlbkNsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOworICAvLy8gXGJyaWVmIFNhZmUgaXRlcmF0aW9uIHNwYWNlIGRpc3RhbmNlLgorICBTdG10ICpTYWZlbGVuOworCisgIC8vLyBcYnJpZWYgU2V0IHNhZmVsZW4uCisgIHZvaWQgc2V0U2FmZWxlbihFeHByICpMZW4pIHsgU2FmZWxlbiA9IExlbjsgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQnVpbGQgJ3NhZmVsZW4nIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTGVuIEV4cHJlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhdXNlLgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8KKyAgT01QU2FmZWxlbkNsYXVzZShFeHByICpMZW4sIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKQorICAgICAgOiBPTVBDbGF1c2UoT01QQ19zYWZlbGVuLCBTdGFydExvYywgRW5kTG9jKSwgTFBhcmVuTG9jKExQYXJlbkxvYyksCisgICAgICAgIFNhZmVsZW4oTGVuKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICAvLy8KKyAgZXhwbGljaXQgT01QU2FmZWxlbkNsYXVzZSgpCisgICAgICA6IE9NUENsYXVzZShPTVBDX3NhZmVsZW4sIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpLAorICAgICAgICBMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24oKSksIFNhZmVsZW4oMCkge30KKworICAvLy8gXGJyaWVmIFNldHMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgdm9pZCBzZXRMUGFyZW5Mb2MoU291cmNlTG9jYXRpb24gTG9jKSB7IExQYXJlbkxvYyA9IExvYzsgfQorICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgeyByZXR1cm4gTFBhcmVuTG9jOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gc2FmZSBpdGVyYXRpb24gc3BhY2UgZGlzdGFuY2UuCisgIEV4cHIgKmdldFNhZmVsZW4oKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RXhwcj4oU2FmZWxlbik7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19zYWZlbGVuOworICB9CisKKyAgU3RtdFJhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gU3RtdFJhbmdlKCZTYWZlbGVuLCAmU2FmZWxlbiArIDEpOyB9Cit9OworCisvLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnZGVmYXVsdCcgY2xhdXNlIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHBhcmFsbGVsIGRlZmF1bHQoc2hhcmVkKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGhhcyBzaW1wbGUgJ2RlZmF1bHQnCisvLy8gY2xhdXNlIHdpdGgga2luZCAnc2hhcmVkJy4KKy8vLworY2xhc3MgT01QRGVmYXVsdENsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgeworICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOworICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICcoJy4KKyAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOworICAvLy8gXGJyaWVmIEEga2luZCBvZiB0aGUgJ2RlZmF1bHQnIGNsYXVzZS4KKyAgT3Blbk1QRGVmYXVsdENsYXVzZUtpbmQgS2luZDsKKyAgLy8vIFxicmllZiBTdGFydCBsb2NhdGlvbiBvZiB0aGUga2luZCBpbiBzb3VyY2UgY29kZS4KKyAgU291cmNlTG9jYXRpb24gS2luZEt3TG9jOworCisgIC8vLyBcYnJpZWYgU2V0IGtpbmQgb2YgdGhlIGNsYXVzZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEsgQXJndW1lbnQgb2YgY2xhdXNlLgorICAvLy8KKyAgdm9pZCBzZXREZWZhdWx0S2luZChPcGVuTVBEZWZhdWx0Q2xhdXNlS2luZCBLKSB7IEtpbmQgPSBLOyB9CisKKyAgLy8vIFxicmllZiBTZXQgYXJndW1lbnQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEtMb2MgQXJndW1lbnQgbG9jYXRpb24uCisgIC8vLworICB2b2lkIHNldERlZmF1bHRLaW5kS3dMb2MoU291cmNlTG9jYXRpb24gS0xvYykgeyBLaW5kS3dMb2MgPSBLTG9jOyB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBCdWlsZCAnZGVmYXVsdCcgY2xhdXNlIHdpdGggYXJndW1lbnQgXGEgQSAoJ25vbmUnIG9yICdzaGFyZWQnKS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQSBBcmd1bWVudCBvZiB0aGUgY2xhdXNlICgnbm9uZScgb3IgJ3NoYXJlZCcpLgorICAvLy8gXHBhcmFtIEFMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGFyZ3VtZW50LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLworICBPTVBEZWZhdWx0Q2xhdXNlKE9wZW5NUERlZmF1bHRDbGF1c2VLaW5kIEEsIFNvdXJjZUxvY2F0aW9uIEFMb2MsCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpCisgICAgICA6IE9NUENsYXVzZShPTVBDX2RlZmF1bHQsIFN0YXJ0TG9jLCBFbmRMb2MpLCBMUGFyZW5Mb2MoTFBhcmVuTG9jKSwKKyAgICAgICAgS2luZChBKSwgS2luZEt3TG9jKEFMb2MpIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIC8vLworICBPTVBEZWZhdWx0Q2xhdXNlKCkKKyAgICAgIDogT01QQ2xhdXNlKE9NUENfZGVmYXVsdCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSksCisgICAgICAgIExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbigpKSwgS2luZChPTVBDX0RFRkFVTFRfdW5rbm93biksCisgICAgICAgIEtpbmRLd0xvYyhTb3VyY2VMb2NhdGlvbigpKSB7fQorCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbG9jYXRpb24gb2YgJygnLgorICB2b2lkIHNldExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsgTFBhcmVuTG9jID0gTG9jOyB9CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgJygnLgorICBTb3VyY2VMb2NhdGlvbiBnZXRMUGFyZW5Mb2MoKSBjb25zdCB7IHJldHVybiBMUGFyZW5Mb2M7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMga2luZCBvZiB0aGUgY2xhdXNlLgorICBPcGVuTVBEZWZhdWx0Q2xhdXNlS2luZCBnZXREZWZhdWx0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgbG9jYXRpb24gb2YgY2xhdXNlIGtpbmQuCisgIFNvdXJjZUxvY2F0aW9uIGdldERlZmF1bHRLaW5kS3dMb2MoKSBjb25zdCB7IHJldHVybiBLaW5kS3dMb2M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19kZWZhdWx0OworICB9CisKKyAgU3RtdFJhbmdlIGNoaWxkcmVuKCkgeyByZXR1cm4gU3RtdFJhbmdlKCk7IH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZSAncHJpdmF0ZScgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nIGRpcmVjdGl2ZXMuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoYSxiKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGhhcyBjbGF1c2UgJ3ByaXZhdGUnCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgorLy8vCitjbGFzcyBPTVBQcml2YXRlQ2xhdXNlIDogcHVibGljIE9NUFZhckxpc3RDbGF1c2U8T01QUHJpdmF0ZUNsYXVzZT4geworICAvLy8gXGJyaWVmIEJ1aWxkIGNsYXVzZSB3aXRoIG51bWJlciBvZiB2YXJpYWJsZXMgXGEgTi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOIE51bWJlciBvZiB0aGUgdmFyaWFibGVzIGluIHRoZSBjbGF1c2UuCisgIC8vLworICBPTVBQcml2YXRlQ2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCB1bnNpZ25lZCBOKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUFByaXZhdGVDbGF1c2U+KE9NUENfcHJpdmF0ZSwgU3RhcnRMb2MsIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MsIE4pIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFByaXZhdGVDbGF1c2UodW5zaWduZWQgTikKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxPTVBQcml2YXRlQ2xhdXNlPihPTVBDX3ByaXZhdGUsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOKSB7fQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBjbGF1c2Ugd2l0aCBhIGxpc3Qgb2YgdmFyaWFibGVzIFxhIFZMLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gVkwgTGlzdCBvZiByZWZlcmVuY2VzIHRvIHRoZSB2YXJpYWJsZXMuCisgIC8vLworICBzdGF0aWMgT01QUHJpdmF0ZUNsYXVzZSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIEFycmF5UmVmPEV4cHIgKj4gVkwpOworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgY2xhdXNlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOIFRoZSBudW1iZXIgb2YgdmFyaWFibGVzLgorICAvLy8KKyAgc3RhdGljIE9NUFByaXZhdGVDbGF1c2UgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE4pOworCisgIFN0bXRSYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gU3RtdFJhbmdlKHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9lbmQoKSkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfcHJpdmF0ZTsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgY2xhdXNlICdmaXJzdHByaXZhdGUnIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJworLy8vIGRpcmVjdGl2ZXMuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZShhLGIpCisvLy8gXGVuZGNvZGUKKy8vLyBJbiB0aGlzIGV4YW1wbGUgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBwYXJhbGxlbCcgaGFzIGNsYXVzZSAnZmlyc3Rwcml2YXRlJworLy8vIHdpdGggdGhlIHZhcmlhYmxlcyAnYScgYW5kICdiJy4KKy8vLworY2xhc3MgT01QRmlyc3Rwcml2YXRlQ2xhdXNlIDogcHVibGljIE9NUFZhckxpc3RDbGF1c2U8T01QRmlyc3Rwcml2YXRlQ2xhdXNlPiB7CisgIC8vLyBcYnJpZWYgQnVpbGQgY2xhdXNlIHdpdGggbnVtYmVyIG9mIHZhcmlhYmxlcyBcYSBOLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCisgIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgorICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGNsYXVzZS4KKyAgLy8vCisgIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLCB1bnNpZ25lZCBOKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUEZpcnN0cHJpdmF0ZUNsYXVzZT4oT01QQ19maXJzdHByaXZhdGUsIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBhcmVuTG9jLCBFbmRMb2MsIE4pIHt9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCisgIC8vLworICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSh1bnNpZ25lZCBOKQorICAgICAgOiBPTVBWYXJMaXN0Q2xhdXNlPE9NUEZpcnN0cHJpdmF0ZUNsYXVzZT4oCisgICAgICAgICAgICBPTVBDX2ZpcnN0cHJpdmF0ZSwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIE4pIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGNsYXVzZSB3aXRoIGEgbGlzdCBvZiB2YXJpYWJsZXMgXGEgVkwuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBWTCBMaXN0IG9mIHJlZmVyZW5jZXMgdG8gdGhlIHZhcmlhYmxlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBGaXJzdHByaXZhdGVDbGF1c2UgKgorICBDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgQXJyYXlSZWY8RXhwciAqPiBWTCk7CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBjbGF1c2Ugd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE4gdmFyaWFibGVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIE4gVGhlIG51bWJlciBvZiB2YXJpYWJsZXMuCisgIC8vLworICBzdGF0aWMgT01QRmlyc3Rwcml2YXRlQ2xhdXNlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOKTsKKworICBTdG10UmFuZ2UgY2hpbGRyZW4oKSB7CisgICAgcmV0dXJuIFN0bXRSYW5nZShyZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFN0bXQgKio+KHZhcmxpc3RfZW5kKCkpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX2ZpcnN0cHJpdmF0ZTsKKyAgfQorfTsKKworLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgY2xhdXNlICdzaGFyZWQnIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJyBkaXJlY3RpdmVzLgorLy8vCisvLy8gXGNvZGUKKy8vLyAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQoYSxiKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGhhcyBjbGF1c2UgJ3NoYXJlZCcKKy8vLyB3aXRoIHRoZSB2YXJpYWJsZXMgJ2EnIGFuZCAnYicuCisvLy8KK2NsYXNzIE9NUFNoYXJlZENsYXVzZSA6IHB1YmxpYyBPTVBWYXJMaXN0Q2xhdXNlPE9NUFNoYXJlZENsYXVzZT4geworICAvLy8gXGJyaWVmIEJ1aWxkIGNsYXVzZSB3aXRoIG51bWJlciBvZiB2YXJpYWJsZXMgXGEgTi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBOIE51bWJlciBvZiB0aGUgdmFyaWFibGVzIGluIHRoZSBjbGF1c2UuCisgIC8vLworICBPTVBTaGFyZWRDbGF1c2UoU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgdW5zaWduZWQgTikKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxPTVBTaGFyZWRDbGF1c2U+KE9NUENfc2hhcmVkLCBTdGFydExvYywgTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kTG9jLCBOKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOIE51bWJlciBvZiB2YXJpYWJsZXMuCisgIC8vLworICBleHBsaWNpdCBPTVBTaGFyZWRDbGF1c2UodW5zaWduZWQgTikKKyAgICAgIDogT01QVmFyTGlzdENsYXVzZTxPTVBTaGFyZWRDbGF1c2U+KE9NUENfc2hhcmVkLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4pIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGNsYXVzZSB3aXRoIGEgbGlzdCBvZiB2YXJpYWJsZXMgXGEgVkwuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgorICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KKyAgLy8vIFxwYXJhbSBWTCBMaXN0IG9mIHJlZmVyZW5jZXMgdG8gdGhlIHZhcmlhYmxlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBTaGFyZWRDbGF1c2UgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgQXJyYXlSZWY8RXhwciAqPiBWTCk7CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBjbGF1c2Ugd2l0aCBcYSBOIHZhcmlhYmxlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBOIFRoZSBudW1iZXIgb2YgdmFyaWFibGVzLgorICAvLy8KKyAgc3RhdGljIE9NUFNoYXJlZENsYXVzZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTik7CisKKyAgU3RtdFJhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBTdG10UmFuZ2UocmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2JlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2VuZCgpKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgeworICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19zaGFyZWQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZSAnY29weWluJyBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicgZGlyZWN0aXZlcy4KKy8vLworLy8vIFxjb2RlCisvLy8gI3ByYWdtYSBvbXAgcGFyYWxsZWwgY29weWluKGEsYikKKy8vLyBcZW5kY29kZQorLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBoYXMgY2xhdXNlICdjb3B5aW4nCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgorLy8vCitjbGFzcyBPTVBDb3B5aW5DbGF1c2UgOiBwdWJsaWMgT01QVmFyTGlzdENsYXVzZTxPTVBDb3B5aW5DbGF1c2U+IHsKKyAgLy8vIFxicmllZiBCdWlsZCBjbGF1c2Ugd2l0aCBudW1iZXIgb2YgdmFyaWFibGVzIFxhIE4uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgorICAvLy8KKyAgT01QQ29weWluQ2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIHVuc2lnbmVkIE4pCisgICAgICA6IE9NUFZhckxpc3RDbGF1c2U8T01QQ29weWluQ2xhdXNlPihPTVBDX2NvcHlpbiwgU3RhcnRMb2MsIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZExvYywgTikge30KKworICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdmFyaWFibGVzLgorICAvLy8KKyAgZXhwbGljaXQgT01QQ29weWluQ2xhdXNlKHVuc2lnbmVkIE4pCisgICAgICA6IE9NUFZhckxpc3RDbGF1c2U8T01QQ29weWluQ2xhdXNlPihPTVBDX2NvcHlpbiwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOKSB7fQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBjbGF1c2Ugd2l0aCBhIGxpc3Qgb2YgdmFyaWFibGVzIFxhIFZMLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCisgIC8vLyBccGFyYW0gVkwgTGlzdCBvZiByZWZlcmVuY2VzIHRvIHRoZSB2YXJpYWJsZXMuCisgIC8vLworICBzdGF0aWMgT01QQ29weWluQ2xhdXNlICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIEFycmF5UmVmPEV4cHIgKj4gVkwpOworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgY2xhdXNlIHdpdGggXGEgTiB2YXJpYWJsZXMuCisgIC8vLworICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCisgIC8vLyBccGFyYW0gTiBUaGUgbnVtYmVyIG9mIHZhcmlhYmxlcy4KKyAgLy8vCisgIHN0YXRpYyBPTVBDb3B5aW5DbGF1c2UgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE4pOworCisgIFN0bXRSYW5nZSBjaGlsZHJlbigpIHsKKyAgICByZXR1cm4gU3RtdFJhbmdlKHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqKj4odmFybGlzdF9lbmQoKSkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBPTVBDbGF1c2UgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0Q2xhdXNlS2luZCgpID09IE9NUENfY29weWluOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9PcGVyYXRpb25LaW5kcy5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvT3BlcmF0aW9uS2luZHMuaAppbmRleCA1ZTQxZDk1Li5hYmE4OGQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9PcGVyYXRpb25LaW5kcy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL09wZXJhdGlvbktpbmRzLmgKQEAgLTI5NSw3ICsyOTUsMTAgQEAKICAgQ0tfQnVpbHRpbkZuVG9GblB0ciwKIAogICAvLyBDb252ZXJ0IGEgemVybyB2YWx1ZSBmb3IgT3BlbkNMIGV2ZW50X3QgaW5pdGlhbGl6YXRpb24uCi0gIENLX1plcm9Ub09DTEV2ZW50CisgIENLX1plcm9Ub09DTEV2ZW50LAorCisgIC8vIENvbnZlcnQgYSBwb2ludGVyIHRvIGEgZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2UuCisgIENLX0FkZHJlc3NTcGFjZUNvbnZlcnNpb24KIH07CiAKIHN0YXRpYyBjb25zdCBDYXN0S2luZCBDS19JbnZhbGlkID0gc3RhdGljX2Nhc3Q8Q2FzdEtpbmQ+KC0xKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL1ByZXR0eVByaW50ZXIuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL1ByZXR0eVByaW50ZXIuaAppbmRleCA3NjQyNjk5Li4zNDlmNGM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9QcmV0dHlQcmludGVyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvUHJldHR5UHJpbnRlci5oCkBAIC00MSw3ICs0MSw4IEBACiAgICAgICBDb25zdGFudEFycmF5U2l6ZUFzV3JpdHRlbihmYWxzZSksIEFub255bW91c1RhZ0xvY2F0aW9ucyh0cnVlKSwKICAgICAgIFN1cHByZXNzU3Ryb25nTGlmZXRpbWUoZmFsc2UpLCBTdXBwcmVzc0xpZmV0aW1lUXVhbGlmaWVycyhmYWxzZSksCiAgICAgICBCb29sKExPLkJvb2wpLCBUZXJzZU91dHB1dChmYWxzZSksIFBvbGlzaEZvckRlY2xhcmF0aW9uKGZhbHNlKSwKLSAgICAgIE1TV0NoYXIoTE8uTWljcm9zb2Z0RXh0ICYmICFMTy5XQ2hhcikgeyB9CisgICAgICBIYWxmKExPLkhhbGYpLCBNU1dDaGFyKExPLk1pY3Jvc29mdEV4dCAmJiAhTE8uV0NoYXIpLAorICAgICAgSW5jbHVkZU5ld2xpbmVzKHRydWUpIHsgfQogCiAgIC8vLyBcYnJpZWYgV2hhdCBsYW5ndWFnZSB3ZSdyZSBwcmludGluZy4KICAgTGFuZ09wdGlvbnMgTGFuZ09wdHM7CkBAIC0xMjUsNyArMTI2LDcgQEAKICAgCiAgIC8vLyBcYnJpZWYgV2hlbiBwcmludGluZyBhbiBhbm9ueW1vdXMgdGFnIG5hbWUsIGFsc28gcHJpbnQgdGhlIGxvY2F0aW9uIG9mCiAgIC8vLyB0aGF0IGVudGl0eSAoZS5nLiwgImVudW0gPGFub255bW91cyBhdCB0Lmg6MTA6NT4iKS4gT3RoZXJ3aXNlLCBqdXN0IAotICAvLy8gcHJpbnRzICI8YW5vbnltb3VzPiIgZm9yIHRoZSBuYW1lLgorICAvLy8gcHJpbnRzICIoYW5vbnltb3VzKSIgZm9yIHRoZSBuYW1lLgogICBib29sIEFub255bW91c1RhZ0xvY2F0aW9ucyA6IDE7CiAgIAogICAvLy8gXGJyaWVmIFdoZW4gdHJ1ZSwgc3VwcHJlc3MgcHJpbnRpbmcgb2YgdGhlIF9fc3Ryb25nIGxpZmV0aW1lIHF1YWxpZmllciBpbgpAQCAtMTUyLDkgKzE1MywxNiBAQAogICAvLy8KICAgdW5zaWduZWQgUG9saXNoRm9yRGVjbGFyYXRpb24gOiAxOwogCisgIC8vLyBcYnJpZWYgV2hlbiB0cnVlLCBwcmludCB0aGUgaGFsZi1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdHlwZSBhcyAnaGFsZicKKyAgLy8vIGluc3RlYWQgb2YgJ19fZnAxNicKKyAgdW5zaWduZWQgSGFsZiA6IDE7CisKICAgLy8vIFxicmllZiBXaGVuIHRydWUsIHByaW50IHRoZSBidWlsdC1pbiB3Y2hhcl90IHR5cGUgYXMgX193Y2hhcl90LiBGb3IgdXNlIGluCiAgIC8vLyBNaWNyb3NvZnQgbW9kZSB3aGVuIHdjaGFyX3QgaXMgbm90IGF2YWlsYWJsZS4KICAgdW5zaWduZWQgTVNXQ2hhciA6IDE7CisKKyAgLy8vIFxicmllZiBXaGVuIHRydWUsIGluY2x1ZGUgbmV3bGluZXMgYWZ0ZXIgc3RhdGVtZW50cyBsaWtlICJicmVhayIsIGV0Yy4KKyAgdW5zaWduZWQgSW5jbHVkZU5ld2xpbmVzIDogMTsKIH07CiAKIH0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvUmF3Q29tbWVudExpc3QuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL1Jhd0NvbW1lbnRMaXN0LmgKaW5kZXggYTRmY2MxMC4uOGJhODVjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvUmF3Q29tbWVudExpc3QuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9SYXdDb21tZW50TGlzdC5oCkBAIC0xOTMsOSArMTkzLDcgQEAKICAgU291cmNlTWFuYWdlciAmU291cmNlTWdyOwogICBzdGQ6OnZlY3RvcjxSYXdDb21tZW50ICo+IENvbW1lbnRzOwogCi0gIHZvaWQgYWRkQ29tbWVudHNUb0Zyb250KGNvbnN0IHN0ZDo6dmVjdG9yPFJhd0NvbW1lbnQgKj4gJkMpIHsKLSAgICBDb21tZW50cy5pbnNlcnQoQ29tbWVudHMuYmVnaW4oKSwgQy5iZWdpbigpLCBDLmVuZCgpKTsKLSAgfQorICB2b2lkIGFkZERlc2VyaWFsaXplZENvbW1lbnRzKEFycmF5UmVmPFJhd0NvbW1lbnQgKj4gRGVzZXJpYWxpemVkQ29tbWVudHMpOwogCiAgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvUmVjb3JkTGF5b3V0LmggYi9pbmNsdWRlL2NsYW5nL0FTVC9SZWNvcmRMYXlvdXQuaAppbmRleCA3MjY4YjNhLi40YmVmYjQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9SZWNvcmRMYXlvdXQuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9SZWNvcmRMYXlvdXQuaApAQCAtNjYsNiArNjYsMTAgQEAKICAgLy8gQWxpZ25tZW50IC0gQWxpZ25tZW50IG9mIHJlY29yZCBpbiBjaGFyYWN0ZXJzLgogICBDaGFyVW5pdHMgQWxpZ25tZW50OwogCisgIC8vLyBSZXF1aXJlZEFsaWdubWVudCAtIFRoZSByZXF1aXJlZCBhbGlnbm1lbnQgb2YgdGhlIG9iamVjdC4gIEluIHRoZSBNUy1BQkkKKyAgLy8vIHRoZSBfX2RlY2xzcGVjKGFsaWduKCkpIHRydW1wcyAjcHJhbWdhIHBhY2sgYW5kIG11c3QgYWx3YXlzIGJlIG9iZXllZC4KKyAgQ2hhclVuaXRzIFJlcXVpcmVkQWxpZ25tZW50OworCiAgIC8vLyBGaWVsZE9mZnNldHMgLSBBcnJheSBvZiBmaWVsZCBvZmZzZXRzIGluIGJpdHMuCiAgIHVpbnQ2NF90ICpGaWVsZE9mZnNldHM7CiAKQEAgLTc4LDkgKzgyLDkgQEAKICAgICAvLy8gdGhlIHNpemUgb2YgdGhlIG9iamVjdCB3aXRob3V0IHZpcnR1YWwgYmFzZXMuCiAgICAgQ2hhclVuaXRzIE5vblZpcnR1YWxTaXplOwogCi0gICAgLy8vIE5vblZpcnR1YWxBbGlnbiAtIFRoZSBub24tdmlydHVhbCBhbGlnbm1lbnQgKGluIGNoYXJzKSBvZiBhbiBvYmplY3QsCisgICAgLy8vIE5vblZpcnR1YWxBbGlnbm1lbnQgLSBUaGUgbm9uLXZpcnR1YWwgYWxpZ25tZW50IChpbiBjaGFycykgb2YgYW4gb2JqZWN0LAogICAgIC8vLyB3aGljaCBpcyB0aGUgYWxpZ25tZW50IG9mIHRoZSBvYmplY3Qgd2l0aG91dCB2aXJ0dWFsIGJhc2VzLgotICAgIENoYXJVbml0cyBOb25WaXJ0dWFsQWxpZ247CisgICAgQ2hhclVuaXRzIE5vblZpcnR1YWxBbGlnbm1lbnQ7CiAKICAgICAvLy8gU2l6ZU9mTGFyZ2VzdEVtcHR5U3Vib2JqZWN0IC0gVGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgZW1wdHkgc3Vib2JqZWN0CiAgICAgLy8vIChlaXRoZXIgYSBiYXNlIG9yIGEgbWVtYmVyKS4gV2lsbCBiZSB6ZXJvIGlmIHRoZSBjbGFzcyBkb2Vzbid0IGNvbnRhaW4KQEAgLTEwMCwxMCArMTA0LDE1IEBACiAgICAgLy8vIGEgcHJpbWFyeSBiYXNlIGNsYXNzLgogICAgIGJvb2wgSGFzRXh0ZW5kYWJsZVZGUHRyIDogMTsKIAotICAgIC8vLyBBbGlnbkFmdGVyVkJhc2VzIC0gRm9yY2UgYXBwcm9wcmlhdGUgYWxpZ25tZW50IGFmdGVyIHZpcnR1YWwgYmFzZXMgYXJlCi0gICAgLy8vIGxhaWQgb3V0IGluIE1TLUMrKy1BQkkuCi0gICAgYm9vbCBBbGlnbkFmdGVyVkJhc2VzIDogMTsKLSAgICAKKyAgICAvLy8gSGFzWmVyb1NpemVkU3ViT2JqZWN0IC0gVHJ1ZSBpZiB0aGlzIGNsYXNzIGNvbnRhaW5zIGEgemVybyBzaXplZCBtZW1iZXIKKyAgICAvLy8gb3IgYmFzZSBvciBhIGJhc2Ugd2l0aCBhIHplcm8gc2l6ZWQgbWVtYmVyIG9yIGJhc2UuICBPbmx5IHVzZWQgZm9yCisgICAgLy8vIE1TLUFCSS4KKyAgICBib29sIEhhc1plcm9TaXplZFN1Yk9iamVjdCA6IDE7CisKKyAgICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBjbGFzcyBpcyB6ZXJvIHNpemVkIG9yIGZpcnN0IGJhc2UgaXMgemVybyBzaXplZCBvcgorICAgIC8vLyBoYXMgdGhpcyBwcm9wZXJ0eS4gIE9ubHkgdXNlZCBmb3IgTVMtQUJJLgorICAgIGJvb2wgTGVhZHNXaXRoWmVyb1NpemVkQmFzZSA6IDE7CisKICAgICAvLy8gUHJpbWFyeUJhc2UgLSBUaGUgcHJpbWFyeSBiYXNlIGluZm8gZm9yIHRoaXMgcmVjb3JkLgogICAgIGxsdm06OlBvaW50ZXJJbnRQYWlyPGNvbnN0IENYWFJlY29yZERlY2wgKiwgMSwgYm9vbD4gUHJpbWFyeUJhc2U7CiAKQEAgLTEyNyw2ICsxMzYsNyBAQAogICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsKIAogICBBU1RSZWNvcmRMYXlvdXQoY29uc3QgQVNUQ29udGV4dCAmQ3R4LCBDaGFyVW5pdHMgc2l6ZSwgQ2hhclVuaXRzIGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgIENoYXJVbml0cyByZXF1aXJlZEFsaWdubWVudCwKICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBkYXRhc2l6ZSwgY29uc3QgdWludDY0X3QgKmZpZWxkb2Zmc2V0cywKICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZpZWxkY291bnQpOwogCkBAIC0xMzQsMTYgKzE0NCwxOCBAQAogICB0eXBlZGVmIENYWFJlY29yZExheW91dEluZm86OkJhc2VPZmZzZXRzTWFwVHkgQmFzZU9mZnNldHNNYXBUeTsKICAgQVNUUmVjb3JkTGF5b3V0KGNvbnN0IEFTVENvbnRleHQgJkN0eCwKICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBzaXplLCBDaGFyVW5pdHMgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIHJlcXVpcmVkQWxpZ25tZW50LAogICAgICAgICAgICAgICAgICAgYm9vbCBoYXNPd25WRlB0ciwgYm9vbCBoYXNFeHRlbmRhYmxlVkZQdHIsCiAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgdmJwdHJvZmZzZXQsCiAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgZGF0YXNpemUsCiAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCAqZmllbGRvZmZzZXRzLCB1bnNpZ25lZCBmaWVsZGNvdW50LAotICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIG5vbnZpcnR1YWxzaXplLCBDaGFyVW5pdHMgbm9udmlydHVhbGFsaWduLAorICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIG5vbnZpcnR1YWxzaXplLCBDaGFyVW5pdHMgbm9udmlydHVhbGFsaWdubWVudCwKICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBTaXplT2ZMYXJnZXN0RW1wdHlTdWJvYmplY3QsCiAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpQcmltYXJ5QmFzZSwKICAgICAgICAgICAgICAgICAgIGJvb2wgSXNQcmltYXJ5QmFzZVZpcnR1YWwsCiAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlU2hhcmluZ1ZCUHRyLAotICAgICAgICAgICAgICAgICAgYm9vbCBGb3JjZUFsaWduLAorICAgICAgICAgICAgICAgICAgYm9vbCBIYXNaZXJvU2l6ZWRTdWJPYmplY3QsCisgICAgICAgICAgICAgICAgICBib29sIExlYWRzV2l0aFplcm9TaXplZEJhc2UsCiAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNlT2Zmc2V0c01hcFR5JiBCYXNlT2Zmc2V0cywKICAgICAgICAgICAgICAgICAgIGNvbnN0IFZCYXNlT2Zmc2V0c01hcFR5JiBWQmFzZU9mZnNldHMpOwogCkBAIC0xODcsMTAgKzE5OSwxMCBAQAogCiAgIC8vLyBnZXROb25WaXJ0dWFsU2l6ZSAtIEdldCB0aGUgbm9uLXZpcnR1YWwgYWxpZ25tZW50IChpbiBjaGFycykgb2YgYW4gb2JqZWN0LAogICAvLy8gd2hpY2ggaXMgdGhlIGFsaWdubWVudCBvZiB0aGUgb2JqZWN0IHdpdGhvdXQgdmlydHVhbCBiYXNlcy4KLSAgQ2hhclVuaXRzIGdldE5vblZpcnR1YWxBbGlnbigpIGNvbnN0IHsKKyAgQ2hhclVuaXRzIGdldE5vblZpcnR1YWxBbGlnbm1lbnQoKSBjb25zdCB7CiAgICAgYXNzZXJ0KENYWEluZm8gJiYgIlJlY29yZCBsYXlvdXQgZG9lcyBub3QgaGF2ZSBDKysgc3BlY2lmaWMgaW5mbyEiKTsKIAotICAgIHJldHVybiBDWFhJbmZvLT5Ob25WaXJ0dWFsQWxpZ247CisgICAgcmV0dXJuIENYWEluZm8tPk5vblZpcnR1YWxBbGlnbm1lbnQ7CiAgIH0KIAogICAvLy8gZ2V0UHJpbWFyeUJhc2UgLSBHZXQgdGhlIHByaW1hcnkgYmFzZSBmb3IgdGhpcyByZWNvcmQuCkBAIC0yNjcsOSArMjc5LDE3IEBACiAgICAgcmV0dXJuICFDWFhJbmZvLT5WQlB0ck9mZnNldC5pc05lZ2F0aXZlKCk7CiAgIH0KIAotICBib29sIGdldEFsaWduQWZ0ZXJWQmFzZXMoKSBjb25zdCB7CisgIENoYXJVbml0cyBnZXRSZXF1aXJlZEFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVxdWlyZWRBbGlnbm1lbnQ7CisgIH0KKworICBib29sIGhhc1plcm9TaXplZFN1Yk9iamVjdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ1hYSW5mbyAmJiBDWFhJbmZvLT5IYXNaZXJvU2l6ZWRTdWJPYmplY3Q7CisgIH0KKworICBib29sIGxlYWRzV2l0aFplcm9TaXplZEJhc2UoKSBjb25zdCB7CiAgICAgYXNzZXJ0KENYWEluZm8gJiYgIlJlY29yZCBsYXlvdXQgZG9lcyBub3QgaGF2ZSBDKysgc3BlY2lmaWMgaW5mbyEiKTsKLSAgICByZXR1cm4gQ1hYSW5mby0+QWxpZ25BZnRlclZCYXNlczsKKyAgICByZXR1cm4gQ1hYSW5mby0+TGVhZHNXaXRoWmVyb1NpemVkQmFzZTsKICAgfQogCiAgIC8vLyBnZXRWQlB0ck9mZnNldCAtIEdldCB0aGUgb2Zmc2V0IGZvciB2aXJ0dWFsIGJhc2UgdGFibGUgcG9pbnRlci4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL1JlY3Vyc2l2ZUFTVFZpc2l0b3IuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL1JlY3Vyc2l2ZUFTVFZpc2l0b3IuaAppbmRleCBkMDk1NTBmLi4xYTJjZTQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9SZWN1cnNpdmVBU1RWaXNpdG9yLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvUmVjdXJzaXZlQVNUVmlzaXRvci5oCkBAIC0xNCw2ICsxNCw3IEBACiAjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX1JFQ1VSU0lWRUFTVFZJU0lUT1JfSAogI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9SRUNVUlNJVkVBU1RWSVNJVE9SX0gKIAorI2luY2x1ZGUgImNsYW5nL0FTVC9BdHRyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2wuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsRnJpZW5kLmgiCkBAIC0xODIsNiArMTgzLDEzIEBACiAgIC8vLyBvdGhlcndpc2UgKGluY2x1ZGluZyB3aGVuIHRoZSBhcmd1bWVudCBpcyBhIE51bGwgdHlwZSBsb2NhdGlvbikuCiAgIGJvb2wgVHJhdmVyc2VUeXBlTG9jKFR5cGVMb2MgVEwpOwogCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYW4gYXR0cmlidXRlLCBieSBkaXNwYXRjaGluZyB0bworICAvLy8gVHJhdmVyc2UqQXR0cigpIGJhc2VkIG9uIHRoZSBhcmd1bWVudCdzIGR5bmFtaWMgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZQorICAvLy8gb3RoZXJ3aXNlIChpbmNsdWRpbmcgd2hlbiB0aGUgYXJndW1lbnQgaXMgYSBOdWxsIHR5cGUgbG9jYXRpb24pLgorICBib29sIFRyYXZlcnNlQXR0cihBdHRyICpBdCk7CisKICAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIGRlY2xhcmF0aW9uLCBieSBkaXNwYXRjaGluZyB0bwogICAvLy8gVHJhdmVyc2UqRGVjbCgpIGJhc2VkIG9uIHRoZSBhcmd1bWVudCdzIGR5bmFtaWMgdHlwZS4KICAgLy8vCkBAIC0yNTQsNiArMjYyLDE2IEBACiAgIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZSBvdGhlcndpc2UuCiAgIGJvb2wgVHJhdmVyc2VMYW1iZGFCb2R5KExhbWJkYUV4cHIgKkxFKTsKIAorICAvLyAtLS0tIE1ldGhvZHMgb24gQXR0cnMgLS0tLQorCisgIC8vIFxicmllZiBWaXNpdCBhbiBhdHRyaWJ1dGUuCisgIGJvb2wgVmlzaXRBdHRyKEF0dHIgKkEpIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBEZWNsYXJlIFRyYXZlcnNlKiBhbmQgZW1wdHkgVmlzaXQqIGZvciBhbGwgQXR0ciBjbGFzc2VzLgorI2RlZmluZSBBVFRSX1ZJU0lUT1JfREVDTFNfT05MWQorI2luY2x1ZGUgImNsYW5nL0FTVC9BdHRyVmlzaXRvci5pbmMiCisjdW5kZWYgQVRUUl9WSVNJVE9SX0RFQ0xTX09OTFkKKwogICAvLyAtLS0tIE1ldGhvZHMgb24gU3RtdHMgLS0tLQogCiAgIC8vIERlY2xhcmUgVHJhdmVyc2UqKCkgZm9yIGFsbCBjb25jcmV0ZSBTdG10IGNsYXNzZXMuCkBAIC00MjMsNiArNDQxLDcgQEAKICAgYm9vbCBUcmF2ZXJzZUZ1bmN0aW9uSGVscGVyKEZ1bmN0aW9uRGVjbCAqRCk7CiAgIGJvb2wgVHJhdmVyc2VWYXJIZWxwZXIoVmFyRGVjbCAqRCk7CiAgIGJvb2wgVHJhdmVyc2VPTVBDbGF1c2UoT01QQ2xhdXNlICpDKTsKKyAgYm9vbCBUcmF2ZXJzZU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoT01QRXhlY3V0YWJsZURpcmVjdGl2ZSAqUyk7CiAjZGVmaW5lIE9QRU5NUF9DTEFVU0UoTmFtZSwgQ2xhc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGJvb2wgVmlzaXQjI0NsYXNzKENsYXNzICpDKTsKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5kZWYiCkBAIC02MjMsNiArNjQyLDEyIEBACiB9CiAKIAorLy8gRGVmaW5lIHRoZSBUcmF2ZXJzZSpBdHRyKEF0dHIqIEEpIG1ldGhvZHMKKyNkZWZpbmUgVklTSVRPUkNMQVNTIFJlY3Vyc2l2ZUFTVFZpc2l0b3IKKyNpbmNsdWRlICJjbGFuZy9BU1QvQXR0clZpc2l0b3IuaW5jIgorI3VuZGVmIFZJU0lUT1JDTEFTUworCisKIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CiBib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlRGVjbChEZWNsICpEKSB7CiAgIGlmICghRCkKQEAgLTYzNiwxMCArNjYxLDE4IEBACiAgIHN3aXRjaCAoRC0+Z2V0S2luZCgpKSB7CiAjZGVmaW5lIEFCU1RSQUNUX0RFQ0woREVDTCkKICNkZWZpbmUgREVDTChDTEFTUywgQkFTRSkgXAotICBjYXNlIERlY2w6OkNMQVNTOiBESVNQQVRDSChDTEFTUyMjRGVjbCwgQ0xBU1MjI0RlY2wsIEQpOworICBjYXNlIERlY2w6OkNMQVNTOiBcCisgICAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2UjI0NMQVNTIyNEZWNsKHN0YXRpY19jYXN0PENMQVNTIyNEZWNsKj4oRCkpKSBcCisgICAgICByZXR1cm4gZmFsc2U7IFwKKyAgICBicmVhazsKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbE5vZGVzLmluYyIKLSB9CisgIH0KIAorICAvLyBWaXNpdCBhbnkgYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGlzIGRlY2xhcmF0aW9uLgorICBmb3IgKGF1dG8gKkkgOiBELT5hdHRycygpKSB7CisgICAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VBdHRyKEkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CiAgIHJldHVybiB0cnVlOwogfQogCkBAIC04NzQsNiArOTA3LDEwIEBACiAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRQb2ludGVlVHlwZSgpKSk7CiAgIH0pCiAKK0RFRl9UUkFWRVJTRV9UWVBFKEFkanVzdGVkVHlwZSwgeworICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0T3JpZ2luYWxUeXBlKCkpKTsKKyAgfSkKKwogREVGX1RSQVZFUlNFX1RZUEUoRGVjYXllZFR5cGUsIHsKICAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldE9yaWdpbmFsVHlwZSgpKSk7CiAgIH0pCkBAIC05MTEsMjUgKzk0OCwyMCBAQAogICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOwogICB9KQogCi1ERUZfVFJBVkVSU0VfVFlQRShGdW5jdGlvbk5vUHJvdG9UeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRSZXN1bHRUeXBlKCkpKTsKLSAgfSkKK0RFRl9UUkFWRVJTRV9UWVBFKEZ1bmN0aW9uTm9Qcm90b1R5cGUsCisgICAgICAgICAgICAgICAgICB7IFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0UmV0dXJuVHlwZSgpKSk7IH0pCiAKIERFRl9UUkFWRVJTRV9UWVBFKEZ1bmN0aW9uUHJvdG9UeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRSZXN1bHRUeXBlKCkpKTsKKyAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRSZXR1cm5UeXBlKCkpKTsKIAotICAgIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yIEEgPSBULT5hcmdfdHlwZV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFbmQgPSBULT5hcmdfdHlwZV9lbmQoKTsKLSAgICAgICAgIEEgIT0gQUVuZDsgKytBKSB7Ci0gICAgICBUUllfVE8oVHJhdmVyc2VUeXBlKCpBKSk7Ci0gICAgfQorICBmb3IgKGNvbnN0IGF1dG8gJkEgOiBULT5wYXJhbV90eXBlcygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShBKSk7CisgIH0KIAotICAgIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmV4Y2VwdGlvbl9pdGVyYXRvciBFID0gVC0+ZXhjZXB0aW9uX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFbmQgPSBULT5leGNlcHRpb25fZW5kKCk7Ci0gICAgICAgICBFICE9IEVFbmQ7ICsrRSkgewotICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZSgqRSkpOwotICAgIH0KLSAgfSkKKyAgZm9yIChjb25zdCBhdXRvICZFIDogVC0+ZXhjZXB0aW9ucygpKSB7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShFKSk7CisgIH0KK30pCiAKIERFRl9UUkFWRVJTRV9UWVBFKFVucmVzb2x2ZWRVc2luZ1R5cGUsIHsgfSkKIERFRl9UUkFWRVJTRV9UWVBFKFR5cGVkZWZUeXBlLCB7IH0pCkBAIC0xMDg0LDYgKzExMTYsMTAgQEAKICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFBvaW50ZWVMb2MoKSkpOwogICB9KQogCitERUZfVFJBVkVSU0VfVFlQRUxPQyhBZGp1c3RlZFR5cGUsIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldE9yaWdpbmFsTG9jKCkpKTsKKyAgfSkKKwogREVGX1RSQVZFUlNFX1RZUEVMT0MoRGVjYXllZFR5cGUsIHsKICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldE9yaWdpbmFsTG9jKCkpKTsKICAgfSkKQEAgLTExMzUsMjcgKzExNzEsMjUgQEAKICAgfSkKIAogREVGX1RSQVZFUlNFX1RZUEVMT0MoRnVuY3Rpb25Ob1Byb3RvVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UmVzdWx0TG9jKCkpKTsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFJldHVybkxvYygpKSk7CiAgIH0pCiAKIC8vIEZJWE1FOiBsb2NhdGlvbiBvZiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgKGF0dHJpYnV0ZXM/KQogREVGX1RSQVZFUlNFX1RZUEVMT0MoRnVuY3Rpb25Qcm90b1R5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFJlc3VsdExvYygpKSk7CisgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRSZXR1cm5Mb2MoKSkpOwogCiAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlQgPSBUTC5nZXRUeXBlUHRyKCk7CiAKLSAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gVEwuZ2V0TnVtQXJncygpOyBJICE9IEU7ICsrSSkgewotICAgICAgaWYgKFRMLmdldEFyZyhJKSkgewotICAgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKFRMLmdldEFyZyhJKSkpOwotICAgICAgfSBlbHNlIGlmIChJIDwgVC0+Z2V0TnVtQXJncygpKSB7Ci0gICAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0QXJnVHlwZShJKSkpOworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBUTC5nZXROdW1QYXJhbXMoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChUTC5nZXRQYXJhbShJKSkgeworICAgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKFRMLmdldFBhcmFtKEkpKSk7CisgICAgICB9IGVsc2UgaWYgKEkgPCBULT5nZXROdW1QYXJhbXMoKSkgeworICAgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBhcmFtVHlwZShJKSkpOwogICAgICAgfQogICAgIH0KIAotICAgIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmV4Y2VwdGlvbl9pdGVyYXRvciBFID0gVC0+ZXhjZXB0aW9uX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFbmQgPSBULT5leGNlcHRpb25fZW5kKCk7Ci0gICAgICAgICBFICE9IEVFbmQ7ICsrRSkgewotICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZSgqRSkpOworICAgIGZvciAoY29uc3QgYXV0byAmRSA6IFQtPmV4Y2VwdGlvbnMoKSkgeworICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZShFKSk7CiAgICAgfQogICB9KQogCkBAIC0xMjYzLDEzICsxMjk3LDExIEBACiAgIGlmICghREMpCiAgICAgcmV0dXJuIHRydWU7CiAKLSAgZm9yIChEZWNsQ29udGV4dDo6ZGVjbF9pdGVyYXRvciBDaGlsZCA9IERDLT5kZWNsc19iZWdpbigpLAotICAgICAgICAgICBDaGlsZEVuZCA9IERDLT5kZWNsc19lbmQoKTsKLSAgICAgICBDaGlsZCAhPSBDaGlsZEVuZDsgKytDaGlsZCkgeworICBmb3IgKGF1dG8gKkNoaWxkIDogREMtPmRlY2xzKCkpIHsKICAgICAvLyBCbG9ja0RlY2xzIGFuZCBDYXB0dXJlZERlY2xzIGFyZSB0cmF2ZXJzZWQgdGhyb3VnaCBCbG9ja0V4cHJzIGFuZAogICAgIC8vIENhcHR1cmVkU3RtdHMgcmVzcGVjdGl2ZWx5LgotICAgIGlmICghaXNhPEJsb2NrRGVjbD4oKkNoaWxkKSAmJiAhaXNhPENhcHR1cmVkRGVjbD4oKkNoaWxkKSkKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woKkNoaWxkKSk7CisgICAgaWYgKCFpc2E8QmxvY2tEZWNsPihDaGlsZCkgJiYgIWlzYTxDYXB0dXJlZERlY2w+KENoaWxkKSkKKyAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woQ2hpbGQpKTsKICAgfQogCiAgIHJldHVybiB0cnVlOwpAQCAtMTQwOSwxOCArMTQ0MSwxOCBAQAogICB9KQogCiBERUZfVFJBVkVSU0VfREVDTChPYmpDTWV0aG9kRGVjbCwgewotICAgIGlmIChELT5nZXRSZXN1bHRUeXBlU291cmNlSW5mbygpKSB7Ci0gICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKEQtPmdldFJlc3VsdFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOwotICAgIH0KLSAgICBmb3IgKE9iakNNZXRob2REZWNsOjpwYXJhbV9pdGVyYXRvcgotICAgICAgICAgICBJID0gRC0+cGFyYW1fYmVnaW4oKSwgRSA9IEQtPnBhcmFtX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbCgqSSkpOwotICAgIH0KLSAgICBpZiAoRC0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpKSB7Ci0gICAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEJvZHkoKSkpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSkKKyAgaWYgKEQtPmdldFJldHVyblR5cGVTb3VyY2VJbmZvKCkpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKEQtPmdldFJldHVyblR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOworICB9CisgIGZvciAoT2JqQ01ldGhvZERlY2w6OnBhcmFtX2l0ZXJhdG9yIEkgPSBELT5wYXJhbV9iZWdpbigpLCBFID0gRC0+cGFyYW1fZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBUUllfVE8oVHJhdmVyc2VEZWNsKCpJKSk7CisgIH0KKyAgaWYgKEQtPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkgeworICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0Qm9keSgpKSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9KQogCiBERUZfVFJBVkVSU0VfREVDTChPYmpDUHJvcGVydHlEZWNsLCB7CiAgICAgLy8gRklYTUU6IGltcGxlbWVudApAQCAtMTQzOCwxMCArMTQ3MCw4IEBACiBERUZfVFJBVkVSU0VfREVDTChVc2luZ1NoYWRvd0RlY2wsIHsgfSkKIAogREVGX1RSQVZFUlNFX0RFQ0woT01QVGhyZWFkUHJpdmF0ZURlY2wsIHsKLSAgICBmb3IgKE9NUFRocmVhZFByaXZhdGVEZWNsOjp2YXJsaXN0X2l0ZXJhdG9yIEkgPSBELT52YXJsaXN0X2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRC0+dmFybGlzdF9lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgICBUUllfVE8oVHJhdmVyc2VTdG10KCpJKSk7CisgICAgZm9yIChhdXRvICpJIDogRC0+dmFybGlzdHMoKSkgeworICAgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChJKSk7CiAgICAgfQogICB9KQogCkBAIC0xNDU4LDY1ICsxNDg4LDg0IEBACiAgIHJldHVybiB0cnVlOwogfQogCi0jZGVmaW5lIERFRl9UUkFWRVJTRV9UTVBMX0lOU1QoVE1QTERFQ0xLSU5EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS8qIEEgaGVscGVyIG1ldGhvZCBmb3IgdHJhdmVyc2luZyB0aGUgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgb2YgYQotICAgY2xhc3Mgb3IgdmFyaWFibGUgdGVtcGxhdGUuICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VUZW1wbGF0ZUluc3RhbnRpYXRpb25zKCAgICAgICAgICAgXAotICAgIFRNUExERUNMS0lORCMjVGVtcGxhdGVEZWNsICpEKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFRNUExERUNMS0lORCMjVGVtcGxhdGVEZWNsOjpzcGVjX2l0ZXJhdG9yIGVuZCA9IEQtPnNwZWNfZW5kKCk7ICAgICAgICAgICAgIFwKLSAgZm9yIChUTVBMREVDTEtJTkQjI1RlbXBsYXRlRGVjbDo6c3BlY19pdGVyYXRvciBpdCA9IEQtPnNwZWNfYmVnaW4oKTsgICAgICAgXAotICAgICAgIGl0ICE9IGVuZDsgKytpdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVE1QTERFQ0xLSU5EIyNUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCogU0QgPSAqaXQ7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN3aXRjaCAoU0QtPmdldFNwZWNpYWxpemF0aW9uS2luZCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgLyogVmlzaXQgdGhlIGltcGxpY2l0IGluc3RhbnRpYXRpb25zIHdpdGggdGhlIHJlcXVlc3RlZCBwYXR0ZXJuLiAqLyAgICAgIFwKLSAgICBjYXNlIFRTS19VbmRlY2xhcmVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKFNEKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgLyogV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBvbiBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uICAgICAgICAgICAgIAotICAgICAgIG9yIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGJlY2F1c2UgdGhlcmUgd2lsbCBiZSBhbiBleHBsaWNpdAotICAgICAgIG5vZGUgZm9yIGl0IGVsc2V3aGVyZS4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVjbGFyYXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWZpbml0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VUZW1wbGF0ZUluc3RhbnRpYXRpb25zKAorICAgIENsYXNzVGVtcGxhdGVEZWNsICpEKSB7CisgIGZvciAoYXV0byAqU0QgOiBELT5zcGVjaWFsaXphdGlvbnMoKSkgeworICAgIGZvciAoYXV0byAqUkQgOiBTRC0+cmVkZWNscygpKSB7CisgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHZpc2l0IGluamVjdGVkLWNsYXNzLW5hbWVzIGluIHRoaXMgdHJhdmVyc2FsLgorICAgICAgaWYgKGNhc3Q8Q1hYUmVjb3JkRGVjbD4oUkQpLT5pc0luamVjdGVkQ2xhc3NOYW1lKCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBzd2l0Y2ggKGNhc3Q8Q2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbD4oUkQpLT4KKyAgICAgICAgICAgICAgICAgIGdldFNwZWNpYWxpemF0aW9uS2luZCgpKSB7CisgICAgICAvLyBWaXNpdCB0aGUgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgd2l0aCB0aGUgcmVxdWVzdGVkIHBhdHRlcm4uCisgICAgICBjYXNlIFRTS19VbmRlY2xhcmVkOgorICAgICAgY2FzZSBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uOgorICAgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKFJEKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIG9uIGFuIGV4cGxpY2l0IGluc3RhbnRpYXRpb24KKyAgICAgIC8vIG9yIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGJlY2F1c2UgdGhlcmUgd2lsbCBiZSBhbiBleHBsaWNpdAorICAgICAgLy8gbm9kZSBmb3IgaXQgZWxzZXdoZXJlLgorICAgICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVjbGFyYXRpb246CisgICAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWZpbml0aW9uOgorICAgICAgY2FzZSBUU0tfRXhwbGljaXRTcGVjaWFsaXphdGlvbjoKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7CiB9Ci0gICAKLURFRl9UUkFWRVJTRV9UTVBMX0lOU1QoQ2xhc3MpCi1ERUZfVFJBVkVSU0VfVE1QTF9JTlNUKFZhcikKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK2Jvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VUZW1wbGF0ZUluc3RhbnRpYXRpb25zKAorICAgIFZhclRlbXBsYXRlRGVjbCAqRCkgeworICBmb3IgKGF1dG8gKlNEIDogRC0+c3BlY2lhbGl6YXRpb25zKCkpIHsKKyAgICBmb3IgKGF1dG8gKlJEIDogU0QtPnJlZGVjbHMoKSkgeworICAgICAgc3dpdGNoIChjYXN0PFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsPihSRCktPgorICAgICAgICAgICAgICAgICAgZ2V0U3BlY2lhbGl6YXRpb25LaW5kKCkpIHsKKyAgICAgIGNhc2UgVFNLX1VuZGVjbGFyZWQ6CisgICAgICBjYXNlIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb246CisgICAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woUkQpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uOgorICAgICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVmaW5pdGlvbjoKKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQogCiAvLyBBIGhlbHBlciBtZXRob2QgZm9yIHRyYXZlcnNpbmcgdGhlIGluc3RhbnRpYXRpb25zIG9mIGEKIC8vIGZ1bmN0aW9uIHdoaWxlIHNraXBwaW5nIGl0cyBzcGVjaWFsaXphdGlvbnMuCiB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgogYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVRlbXBsYXRlSW5zdGFudGlhdGlvbnMoCiAgICAgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkQpIHsKLSAgRnVuY3Rpb25UZW1wbGF0ZURlY2w6OnNwZWNfaXRlcmF0b3IgZW5kID0gRC0+c3BlY19lbmQoKTsKLSAgZm9yIChGdW5jdGlvblRlbXBsYXRlRGVjbDo6c3BlY19pdGVyYXRvciBpdCA9IEQtPnNwZWNfYmVnaW4oKTsgaXQgIT0gZW5kOwotICAgICAgICsraXQpIHsKLSAgICBGdW5jdGlvbkRlY2wqIEZEID0gKml0OwotICAgIHN3aXRjaCAoRkQtPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkpIHsKLSAgICBjYXNlIFRTS19VbmRlY2xhcmVkOgotICAgIGNhc2UgVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbjoKLSAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hhdCBraW5kIG9mIEZ1bmN0aW9uRGVjbCB0aGlzIGlzLgotICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChGRCkpOwotICAgICAgYnJlYWs7CisgIGZvciAoYXV0byAqRkQgOiBELT5zcGVjaWFsaXphdGlvbnMoKSkgeworICAgIGZvciAoYXV0byAqUkQgOiBGRC0+cmVkZWNscygpKSB7CisgICAgICBzd2l0Y2ggKFJELT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpKSB7CisgICAgICBjYXNlIFRTS19VbmRlY2xhcmVkOgorICAgICAgY2FzZSBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uOgorICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoYXQga2luZCBvZiBGdW5jdGlvbkRlY2wgdGhpcyBpcy4KKyAgICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChSRCkpOworICAgICAgICBicmVhazsKIAotICAgIC8vIEZJWE1FOiBGb3Igbm93IHRyYXZlcnNlIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGhlcmUuIENoYW5nZSB0aGF0Ci0gICAgLy8gb25jZSB0aGV5IGFyZSByZXByZXNlbnRlZCBhcyBkZWRpY2F0ZWQgbm9kZXMgaW4gdGhlIEFTVC4KLSAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWNsYXJhdGlvbjoKLSAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWZpbml0aW9uOgotICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChGRCkpOwotICAgICAgYnJlYWs7CisgICAgICAvLyBGSVhNRTogRm9yIG5vdyB0cmF2ZXJzZSBleHBsaWNpdCBpbnN0YW50aWF0aW9ucyBoZXJlLiBDaGFuZ2UgdGhhdAorICAgICAgLy8gb25jZSB0aGV5IGFyZSByZXByZXNlbnRlZCBhcyBkZWRpY2F0ZWQgbm9kZXMgaW4gdGhlIEFTVC4KKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uOgorICAgICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVmaW5pdGlvbjoKKyAgICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChSRCkpOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KICAgfQogCkBAIC0xNjIyLDEwICsxNjcxLDggQEAKICAgaWYgKCFUcmF2ZXJzZVJlY29yZEhlbHBlcihEKSkKICAgICByZXR1cm4gZmFsc2U7CiAgIGlmIChELT5pc0NvbXBsZXRlRGVmaW5pdGlvbigpKSB7Ci0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yIEkgPSBELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRC0+YmFzZXNfZW5kKCk7Ci0gICAgICAgICBJICE9IEU7ICsrSSkgewotICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhJLT5nZXRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBELT5iYXNlcygpKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKEkuZ2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CiAgICAgfQogICAgIC8vIFdlIGRvbid0IHRyYXZlcnNlIHRoZSBmcmllbmRzIG9yIHRoZSBjb252ZXJzaW9ucywgYXMgdGhleSBhcmUKICAgICAvLyBhbHJlYWR5IGluIGRlY2xzX2JlZ2luKCkvZGVjbHNfZW5kKCkuCkBAIC0xNzkxLDEwICsxODM4LDggQEAKIAogICBpZiAoQ1hYQ29uc3RydWN0b3JEZWNsICpDdG9yID0gZHluX2Nhc3Q8Q1hYQ29uc3RydWN0b3JEZWNsPihEKSkgewogICAgIC8vIENvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KLSAgICBmb3IgKENYWENvbnN0cnVjdG9yRGVjbDo6aW5pdF9pdGVyYXRvciBJID0gQ3Rvci0+aW5pdF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBDdG9yLT5pbml0X2VuZCgpOwotICAgICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXIoKkkpKTsKKyAgICBmb3IgKGF1dG8gKkkgOiBDdG9yLT5pbml0cygpKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VDb25zdHJ1Y3RvckluaXRpYWxpemVyKEkpKTsKICAgICB9CiAgIH0KIApAQCAtMTkyMyw5ICsxOTY4LDggQEAKICAgfSkKIAogREVGX1RSQVZFUlNFX1NUTVQoRGVjbFN0bXQsIHsKLSAgICBmb3IgKERlY2xTdG10OjpkZWNsX2l0ZXJhdG9yIEkgPSBTLT5kZWNsX2JlZ2luKCksIEUgPSBTLT5kZWNsX2VuZCgpOwotICAgICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woKkkpKTsKKyAgICBmb3IgKGF1dG8gKkkgOiBTLT5kZWNscygpKSB7CisgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKEkpKTsKICAgICB9CiAgICAgLy8gU3VwcHJlc3MgdGhlIGRlZmF1bHQgaXRlcmF0aW9uIG92ZXIgY2hpbGRyZW4oKSBieQogICAgIC8vIHJldHVybmluZy4gIEhlcmUncyB3aHk6IEEgRGVjbFN0bXQgbG9va3MgbGlrZSAndHlwZSB2YXIgWz0KQEAgLTIxMzMsMTUgKzIxNzcsNiBAQAogICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRUeXBlT3BlcmFuZFNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7CiAgIH0pCiAKLURFRl9UUkFWRVJTRV9TVE1UKFVuYXJ5VHlwZVRyYWl0RXhwciwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0UXVlcmllZFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfU1RNVChCaW5hcnlUeXBlVHJhaXRFeHByLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRMaHNUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFJoc1R5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOwotICB9KQotCiBERUZfVFJBVkVSU0VfU1RNVChUeXBlVHJhaXRFeHByLCB7CiAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBTLT5nZXROdW1BcmdzKCk7IEkgIT0gTjsgKytJKQogICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0QXJnKEkpLT5nZXRUeXBlTG9jKCkpKTsKQEAgLTIxODQsMTEgKzIyMTksMTEgQEAKICAgICB9IGVsc2UgaWYgKEZ1bmN0aW9uUHJvdG9UeXBlTG9jIFByb3RvID0gVEwuZ2V0QXM8RnVuY3Rpb25Qcm90b1R5cGVMb2M+KCkpIHsKICAgICAgIGlmIChTLT5oYXNFeHBsaWNpdFBhcmFtZXRlcnMoKSkgewogICAgICAgICAvLyBWaXNpdCBwYXJhbWV0ZXJzLgotICAgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gUHJvdG8uZ2V0TnVtQXJncygpOyBJICE9IE47ICsrSSkgewotICAgICAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woUHJvdG8uZ2V0QXJnKEkpKSk7CisgICAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBQcm90by5nZXROdW1QYXJhbXMoKTsgSSAhPSBOOyArK0kpIHsKKyAgICAgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKFByb3RvLmdldFBhcmFtKEkpKSk7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUHJvdG8uZ2V0UmVzdWx0TG9jKCkpKTsKKyAgICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhQcm90by5nZXRSZXR1cm5Mb2MoKSkpOwogICAgICAgfSAgICAgICAgCiAgICAgfQogICB9CkBAIC0yMzI1LDExICsyMzYwLDIyIEBACiBERUZfVFJBVkVSU0VfU1RNVChBc1R5cGVFeHByLCB7IH0pCiAKIC8vIE9wZW5NUCBkaXJlY3RpdmVzLgotREVGX1RSQVZFUlNFX1NUTVQoT01QUGFyYWxsZWxEaXJlY3RpdmUsIHsKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlT01QRXhlY3V0YWJsZURpcmVjdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlICpTKSB7CiAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzID0gUy0+Y2xhdXNlcygpOwogICBmb3IgKEFycmF5UmVmPE9NUENsYXVzZSAqPjo6aXRlcmF0b3IgSSA9IENsYXVzZXMuYmVnaW4oKSwgRSA9IENsYXVzZXMuZW5kKCk7CiAgICAgICAgSSAhPSBFOyArK0kpCiAgICAgaWYgKCFUcmF2ZXJzZU9NUENsYXVzZSgqSSkpIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0RFRl9UUkFWRVJTRV9TVE1UKE9NUFBhcmFsbGVsRGlyZWN0aXZlLCB7CisgIGlmICghVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKSByZXR1cm4gZmFsc2U7Cit9KQorCitERUZfVFJBVkVSU0VfU1RNVChPTVBTaW1kRGlyZWN0aXZlLCB7CisgIGlmICghVHJhdmVyc2VPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKFMpKSByZXR1cm4gZmFsc2U7CiB9KQogCiAvLyBPcGVuTVAgY2xhdXNlcy4KQEAgLTIzNDcsNiArMjM5MywyNSBAQAogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUElmQ2xhdXNlKE9NUElmQ2xhdXNlICpDKSB7CisgIFRyYXZlcnNlU3RtdChDLT5nZXRDb25kaXRpb24oKSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUE51bVRocmVhZHNDbGF1c2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBOdW1UaHJlYWRzQ2xhdXNlICpDKSB7CisgIFRyYXZlcnNlU3RtdChDLT5nZXROdW1UaHJlYWRzKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QU2FmZWxlbkNsYXVzZShPTVBTYWZlbGVuQ2xhdXNlICpDKSB7CisgIFRyYXZlcnNlU3RtdChDLT5nZXRTYWZlbGVuKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KIGJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBEZWZhdWx0Q2xhdXNlKE9NUERlZmF1bHRDbGF1c2UgKkMpIHsKICAgcmV0dXJuIHRydWU7CiB9CkBAIC0yMzU0LDEwICsyNDE5LDggQEAKIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogdm9pZCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUENsYXVzZUxpc3QoVCAqTm9kZSkgewotICBmb3IgKHR5cGVuYW1lIFQ6OnZhcmxpc3RfaXRlcmF0b3IgSSA9IE5vZGUtPnZhcmxpc3RfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBOb2RlLT52YXJsaXN0X2VuZCgpOwotICAgICAgICAgSSAhPSBFOyArK0kpCi0gICAgVHJhdmVyc2VTdG10KCpJKTsKKyAgZm9yIChhdXRvICpJIDogTm9kZS0+dmFybGlzdHMoKSkKKyAgICBUcmF2ZXJzZVN0bXQoSSk7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CkBAIC0yMzc5LDYgKzI0NDIsMTIgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Citib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QQ29weWluQ2xhdXNlKE9NUENvcHlpbkNsYXVzZSAqQykgeworICBWaXNpdE9NUENsYXVzZUxpc3QoQyk7CisgIHJldHVybiB0cnVlOworfQorCiAvLyBGSVhNRTogbG9vayBhdCB0aGUgZm9sbG93aW5nIHRyaWNreS1zZWVtaW5nIGV4cHJzIHRvIHNlZSBpZiB3ZQogLy8gbmVlZCB0byByZWN1cnNlIG9uIGFueXRoaW5nLiAgVGhlc2UgYXJlIG9uZXMgdGhhdCBoYXZlIG1ldGhvZHMKIC8vIHJldHVybmluZyBkZWNscyBvciBxdWFsdHlwZXMgb3IgbmVzdGVkbmFtZXNwZWNpZmllciAtLSB0aG91Z2ggSSdtCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9SZWRlY2xhcmFibGUuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL1JlZGVjbGFyYWJsZS5oCmluZGV4IGNmZTVhOTAuLjExNzBlZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL1JlZGVjbGFyYWJsZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL1JlZGVjbGFyYWJsZS5oCkBAIC0xNjEsMTMgKzE2MSwxOCBAQAogICAgIH0KICAgfTsKIAotICAvLy8gXGJyaWVmIFJldHVybnMgaXRlcmF0b3IgZm9yIGFsbCB0aGUgcmVkZWNsYXJhdGlvbnMgb2YgdGhlIHNhbWUgZGVjbC4KLSAgLy8vIEl0IHdpbGwgaXRlcmF0ZSBhdCBsZWFzdCBvbmNlICh3aGVuIHRoaXMgZGVjbCBpcyB0aGUgb25seSBvbmUpLgotICByZWRlY2xfaXRlcmF0b3IgcmVkZWNsc19iZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gcmVkZWNsX2l0ZXJhdG9yKGNvbnN0X2Nhc3Q8ZGVjbF90eXBlKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBkZWNsX3R5cGUqPih0aGlzKSkpOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHJlZGVjbF9pdGVyYXRvcj4gcmVkZWNsX3JhbmdlOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhbiBpdGVyYXRvciByYW5nZSBmb3IgYWxsIHRoZSByZWRlY2xhcmF0aW9ucyBvZiB0aGUgc2FtZQorICAvLy8gZGVjbC4gSXQgd2lsbCBpdGVyYXRlIGF0IGxlYXN0IG9uY2UgKHdoZW4gdGhpcyBkZWNsIGlzIHRoZSBvbmx5IG9uZSkuCisgIHJlZGVjbF9yYW5nZSByZWRlY2xzKCkgY29uc3QgeworICAgIHJldHVybiByZWRlY2xfcmFuZ2UocmVkZWNsX2l0ZXJhdG9yKGNvbnN0X2Nhc3Q8ZGVjbF90eXBlICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGRlY2xfdHlwZSAqPih0aGlzKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVkZWNsX2l0ZXJhdG9yKCkpOwogICB9Ci0gIHJlZGVjbF9pdGVyYXRvciByZWRlY2xzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIHJlZGVjbF9pdGVyYXRvcigpOyB9CisKKyAgcmVkZWNsX2l0ZXJhdG9yIHJlZGVjbHNfYmVnaW4oKSBjb25zdCB7IHJldHVybiByZWRlY2xzKCkuYmVnaW4oKTsgfQorICByZWRlY2xfaXRlcmF0b3IgcmVkZWNsc19lbmQoKSBjb25zdCB7IHJldHVybiByZWRlY2xzKCkuZW5kKCk7IH0KIAogICBmcmllbmQgY2xhc3MgQVNURGVjbFJlYWRlcjsKICAgZnJpZW5kIGNsYXNzIEFTVERlY2xXcml0ZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9TdG10LmggYi9pbmNsdWRlL2NsYW5nL0FTVC9TdG10LmgKaW5kZXggYWNlNTNkOC4uYWUzNGY0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL1N0bXQuaApAQCAtMzcxLDEyICszNzEsMTIgQEAKIAogICAvLy8gXGJyaWVmIER1bXBzIHRoZSBzcGVjaWZpZWQgQVNUIGZyYWdtZW50IGFuZCBhbGwgc3VidHJlZXMgdG8KICAgLy8vIFxjIGxsdm06OmVycnMoKS4KLSAgTExWTV9BVFRSSUJVVEVfVVNFRCB2b2lkIGR1bXAoKSBjb25zdDsKLSAgTExWTV9BVFRSSUJVVEVfVVNFRCB2b2lkIGR1bXAoU291cmNlTWFuYWdlciAmU00pIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBkdW1wKFNvdXJjZU1hbmFnZXIgJlNNKSBjb25zdDsKICAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgU291cmNlTWFuYWdlciAmU00pIGNvbnN0OwogCiAgIC8vLyBkdW1wQ29sb3IgLSBzYW1lIGFzIGR1bXAoKSwgYnV0IGZvcmNlcyBjb2xvciBoaWdobGlnaHRpbmcuCi0gIExMVk1fQVRUUklCVVRFX1VTRUQgdm9pZCBkdW1wQ29sb3IoKSBjb25zdDsKKyAgdm9pZCBkdW1wQ29sb3IoKSBjb25zdDsKIAogICAvLy8gZHVtcFByZXR0eS9wcmludFByZXR0eSAtIFRoZXNlIHR3byBtZXRob2RzIGRvIGEgInByZXR0eSBwcmludCIgb2YgdGhlIEFTVAogICAvLy8gYmFjayB0byBpdHMgb3JpZ2luYWwgc291cmNlIGxhbmd1YWdlIHN5bnRheC4KQEAgLTQ4NSw3ICs0ODUsMTMgQEAKIAogICB0eXBlZGVmIERlY2xHcm91cFJlZjo6aXRlcmF0b3IgZGVjbF9pdGVyYXRvcjsKICAgdHlwZWRlZiBEZWNsR3JvdXBSZWY6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2RlY2xfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8ZGVjbF9pdGVyYXRvcj4gZGVjbF9yYW5nZTsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxjb25zdF9kZWNsX2l0ZXJhdG9yPiBkZWNsX2NvbnN0X3JhbmdlOwogCisgIGRlY2xfcmFuZ2UgZGVjbHMoKSB7IHJldHVybiBkZWNsX3JhbmdlKGRlY2xfYmVnaW4oKSwgZGVjbF9lbmQoKSk7IH0KKyAgZGVjbF9jb25zdF9yYW5nZSBkZWNscygpIGNvbnN0IHsKKyAgICByZXR1cm4gZGVjbF9jb25zdF9yYW5nZShkZWNsX2JlZ2luKCksIGRlY2xfZW5kKCkpOworICB9CiAgIGRlY2xfaXRlcmF0b3IgZGVjbF9iZWdpbigpIHsgcmV0dXJuIERHLmJlZ2luKCk7IH0KICAgZGVjbF9pdGVyYXRvciBkZWNsX2VuZCgpIHsgcmV0dXJuIERHLmVuZCgpOyB9CiAgIGNvbnN0X2RlY2xfaXRlcmF0b3IgZGVjbF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIERHLmJlZ2luKCk7IH0KQEAgLTU2NSw2ICs1NzEsOSBAQAogICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gQ29tcG91bmRTdG10Qml0cy5OdW1TdG10czsgfQogCiAgIHR5cGVkZWYgU3RtdCoqIGJvZHlfaXRlcmF0b3I7CisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8Ym9keV9pdGVyYXRvcj4gYm9keV9yYW5nZTsKKworICBib2R5X3JhbmdlIGJvZHkoKSB7IHJldHVybiBib2R5X3JhbmdlKGJvZHlfYmVnaW4oKSwgYm9keV9lbmQoKSk7IH0KICAgYm9keV9pdGVyYXRvciBib2R5X2JlZ2luKCkgeyByZXR1cm4gQm9keTsgfQogICBib2R5X2l0ZXJhdG9yIGJvZHlfZW5kKCkgeyByZXR1cm4gQm9keSArIHNpemUoKTsgfQogICBTdG10ICpib2R5X2JhY2soKSB7IHJldHVybiAhYm9keV9lbXB0eSgpID8gQm9keVtzaXplKCktMV0gOiAwOyB9CkBAIC01NzUsNiArNTg0LDExIEBACiAgIH0KIAogICB0eXBlZGVmIFN0bXQqIGNvbnN0ICogY29uc3RfYm9keV9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxjb25zdF9ib2R5X2l0ZXJhdG9yPiBib2R5X2NvbnN0X3JhbmdlOworCisgIGJvZHlfY29uc3RfcmFuZ2UgYm9keSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYm9keV9jb25zdF9yYW5nZShib2R5X2JlZ2luKCksIGJvZHlfZW5kKCkpOworICB9CiAgIGNvbnN0X2JvZHlfaXRlcmF0b3IgYm9keV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJvZHk7IH0KICAgY29uc3RfYm9keV9pdGVyYXRvciBib2R5X2VuZCgpIGNvbnN0IHsgcmV0dXJuIEJvZHkgKyBzaXplKCk7IH0KICAgY29uc3QgU3RtdCAqYm9keV9iYWNrKCkgY29uc3QgeyByZXR1cm4gIWJvZHlfZW1wdHkoKSA/IEJvZHlbc2l6ZSgpLTFdIDogMDsgfQpAQCAtNjEyLDExICs2MjYsMTEgQEAKIAogICAvLyBJdGVyYXRvcnMKICAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZCb2R5WzBdLCAmQm9keVswXStDb21wb3VuZFN0bXRCaXRzLk51bVN0bXRzKTsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoQm9keSwgQm9keSArIENvbXBvdW5kU3RtdEJpdHMuTnVtU3RtdHMpOwogICB9CiAKICAgY29uc3RfY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZCb2R5WzBdLCAmQm9keVswXStDb21wb3VuZFN0bXRCaXRzLk51bVN0bXRzKTsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoQm9keSwgQm9keSArIENvbXBvdW5kU3RtdEJpdHMuTnVtU3RtdHMpOwogICB9CiB9OwogCkBAIC0xNzY3LDcgKzE3ODEsNyBAQAogICB9CiAKICAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIGNoaWxkX3JhbmdlKCZFeHByc1swXSwgJkV4cHJzWzBdKTsKKyAgICByZXR1cm4gY2hpbGRfcmFuZ2UoJkV4cHJzWzBdLCAmRXhwcnNbTnVtSW5wdXRzICsgTnVtT3V0cHV0c10pOwogICB9CiB9OwogCkBAIC0yMDQyLDYgKzIwNTYsMTUgQEAKICAgLy8vIFxicmllZiBBbiBpdGVyYXRvciB0aGF0IHdhbGtzIG92ZXIgdGhlIGNhcHR1cmVzLgogICB0eXBlZGVmIENhcHR1cmUgKmNhcHR1cmVfaXRlcmF0b3I7CiAgIHR5cGVkZWYgY29uc3QgQ2FwdHVyZSAqY29uc3RfY2FwdHVyZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxjYXB0dXJlX2l0ZXJhdG9yPiBjYXB0dXJlX3JhbmdlOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNvbnN0X2NhcHR1cmVfaXRlcmF0b3I+IGNhcHR1cmVfY29uc3RfcmFuZ2U7CisKKyAgY2FwdHVyZV9yYW5nZSBjYXB0dXJlcygpIHsKKyAgICByZXR1cm4gY2FwdHVyZV9yYW5nZShjYXB0dXJlX2JlZ2luKCksIGNhcHR1cmVfZW5kKCkpOworICB9CisgIGNhcHR1cmVfY29uc3RfcmFuZ2UgY2FwdHVyZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhcHR1cmVfY29uc3RfcmFuZ2UoY2FwdHVyZV9iZWdpbigpLCBjYXB0dXJlX2VuZCgpKTsKKyAgfQogCiAgIC8vLyBcYnJpZWYgUmV0cmlldmUgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGNhcHR1cmUuCiAgIGNhcHR1cmVfaXRlcmF0b3IgY2FwdHVyZV9iZWdpbigpIHsgcmV0dXJuIGdldFN0b3JlZENhcHR1cmVzKCk7IH0KQEAgLTIwNTgsNiArMjA4MSwxMSBAQAogCiAgIC8vLyBcYnJpZWYgSXRlcmF0b3IgdGhhdCB3YWxrcyBvdmVyIHRoZSBjYXB0dXJlIGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cy4KICAgdHlwZWRlZiBFeHByICoqY2FwdHVyZV9pbml0X2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGNhcHR1cmVfaW5pdF9pdGVyYXRvcj4gY2FwdHVyZV9pbml0X3JhbmdlOworCisgIGNhcHR1cmVfaW5pdF9yYW5nZSBjYXB0dXJlX2luaXRzKCkgY29uc3QgeworICAgIHJldHVybiBjYXB0dXJlX2luaXRfcmFuZ2UoY2FwdHVyZV9pbml0X2JlZ2luKCksIGNhcHR1cmVfaW5pdF9lbmQoKSk7CisgIH0KIAogICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBmaXJzdCBpbml0aWFsaXphdGlvbiBhcmd1bWVudC4KICAgY2FwdHVyZV9pbml0X2l0ZXJhdG9yIGNhcHR1cmVfaW5pdF9iZWdpbigpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL1N0bXRJdGVyYXRvci5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdEl0ZXJhdG9yLmgKaW5kZXggZmJjOGU1ZC4uYTMxNjMyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdEl0ZXJhdG9yLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdEl0ZXJhdG9yLmgKQEAgLTE0LDggKzE0LDggQEAKICNpZm5kZWYgTExWTV9DTEFOR19BU1RfU1RNVF9JVFJfSAogI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9TVE1UX0lUUl9ICiAKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgogI2luY2x1ZGUgPGNhc3NlcnQ+CiAjaW5jbHVkZSA8Y3N0ZGRlZj4KICNpbmNsdWRlIDxpdGVyYXRvcj4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL1N0bXRPcGVuTVAuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL1N0bXRPcGVuTVAuaAppbmRleCA4NTcwZDg4Li4wMjM3MjBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9TdG10T3Blbk1QLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdE9wZW5NUC5oCkBAIC0xLDQgKzEsNCBAQAotLy89PT0tIFN0bXRPcGVuTVAuaCAtIENsYXNzZXMgZm9yIE9wZW5NUCBkaXJlY3RpdmVzIGFuZCBjbGF1c2VzIC0tKi0gQysrIC0qLT09PS8vCisvLz09PS0gU3RtdE9wZW5NUC5oIC0gQ2xhc3NlcyBmb3IgT3Blbk1QIGRpcmVjdGl2ZXMgIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLwogLy8KIC8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKIC8vCkBAIC0xNSwzNTkgKzE1LDE1IEBACiAjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX1NUTVRPUEVOTVBfSAogI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9TVE1UT1BFTk1QX0gKIAorI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL09wZW5NUENsYXVzZS5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCi0jaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXQuaCIKIAogbmFtZXNwYWNlIGNsYW5nIHsKIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vIEFTVCBjbGFzc2VzIGZvciBjbGF1c2VzLgotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotLy8vIFxicmllZiBUaGlzIGlzIGEgYmFzaWMgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBzaW5nbGUgT3Blbk1QIGNsYXVzZS4KLS8vLwotY2xhc3MgT01QQ2xhdXNlIHsKLSAgLy8vIFxicmllZiBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlICh0aGUgY2xhdXNlIGtleXdvcmQpLgotICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYzsKLSAgLy8vIFxicmllZiBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KLSAgU291cmNlTG9jYXRpb24gRW5kTG9jOwotICAvLy8gXGJyaWVmIEtpbmQgb2YgdGhlIGNsYXVzZS4KLSAgT3Blbk1QQ2xhdXNlS2luZCBLaW5kOwotcHJvdGVjdGVkOgotICBPTVBDbGF1c2UoT3Blbk1QQ2xhdXNlS2luZCBLLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gRW5kTG9jKQotICAgIDogU3RhcnRMb2MoU3RhcnRMb2MpLCBFbmRMb2MoRW5kTG9jKSwgS2luZChLKSB7fQotCi1wdWJsaWM6Ci0KLSAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgotICBTb3VyY2VMb2NhdGlvbiBnZXRMb2NTdGFydCgpIGNvbnN0IHsgcmV0dXJuIFN0YXJ0TG9jOyB9Ci0gIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCi0gIFNvdXJjZUxvY2F0aW9uIGdldExvY0VuZCgpIGNvbnN0IHsgcmV0dXJuIEVuZExvYzsgfQotCi0gIC8vLyBcYnJpZWYgU2V0cyB0aGUgc3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KLSAgdm9pZCBzZXRMb2NTdGFydChTb3VyY2VMb2NhdGlvbiBMb2MpIHsgU3RhcnRMb2MgPSBMb2M7IH0KLSAgLy8vIFxicmllZiBTZXRzIHRoZSBlbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KLSAgdm9pZCBzZXRMb2NFbmQoU291cmNlTG9jYXRpb24gTG9jKSB7IEVuZExvYyA9IExvYzsgfQotCi0gIC8vLyBcYnJpZWYgUmV0dXJucyBraW5kIG9mIE9wZW5NUCBjbGF1c2UgKHByaXZhdGUsIHNoYXJlZCwgcmVkdWN0aW9uLCBldGMuKS4KLSAgT3Blbk1QQ2xhdXNlS2luZCBnZXRDbGF1c2VLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQotCi0gIGJvb2wgaXNJbXBsaWNpdCgpIGNvbnN0IHsgcmV0dXJuIFN0YXJ0TG9jLmlzSW52YWxpZCgpO30KLQotICBTdG10UmFuZ2UgY2hpbGRyZW4oKTsKLSAgQ29uc3RTdG10UmFuZ2UgY2hpbGRyZW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8T01QQ2xhdXNlICo+KHRoaXMpLT5jaGlsZHJlbigpOwotICB9Ci0gIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KLS8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZXMgd2l0aCB0aGUgbGlzdCBvZiB2YXJpYWJsZXMgbGlrZSAncHJpdmF0ZScsCi0vLy8gJ2ZpcnN0cHJpdmF0ZScsICdjb3B5aW4nLCAnc2hhcmVkJywgb3IgJ3JlZHVjdGlvbicgY2xhdXNlcyBpbiB0aGUKLS8vLyAnI3ByYWdtYSBvbXAgLi4uJyBkaXJlY3RpdmVzLgotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jbGFzcyBPTVBWYXJMaXN0IHsKLSAgZnJpZW5kIGNsYXNzIE9NUENsYXVzZVJlYWRlcjsKLSAgLy8vIFxicmllZiBMb2NhdGlvbiBvZiAnKCcuCi0gIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYzsKLSAgLy8vIFxicmllZiBOdW1iZXIgb2YgdmFyaWFibGVzIGluIHRoZSBsaXN0LgotICB1bnNpZ25lZCBOdW1WYXJzOwotcHJvdGVjdGVkOgotICAvLy8gXGJyaWVmIEZldGNoZXMgbGlzdCBvZiB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhdXNlLgotICBsbHZtOjpNdXRhYmxlQXJyYXlSZWY8RXhwciAqPiBnZXRWYXJSZWZzKCkgewotICAgIHJldHVybiBsbHZtOjpNdXRhYmxlQXJyYXlSZWY8RXhwciAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEV4cHIgKio+KHN0YXRpY19jYXN0PFQgKj4odGhpcykgKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WYXJzKTsKLSAgfQotCi0gIC8vLyBcYnJpZWYgU2V0cyB0aGUgbGlzdCBvZiB2YXJpYWJsZXMgZm9yIHRoaXMgY2xhdXNlLgotICB2b2lkIHNldFZhclJlZnMoQXJyYXlSZWY8RXhwciAqPiBWTCkgewotICAgIGFzc2VydChWTC5zaXplKCkgPT0gTnVtVmFycyAmJgotICAgICAgICAgICAiTnVtYmVyIG9mIHZhcmlhYmxlcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHByZWFsbG9jYXRlZCBidWZmZXIiKTsKLSAgICBzdGQ6OmNvcHkoVkwuYmVnaW4oKSwgVkwuZW5kKCksCi0gICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqKj4oc3RhdGljX2Nhc3Q8VCAqPih0aGlzKSArIDEpKTsKLSAgfQotCi0gIC8vLyBcYnJpZWYgQnVpbGQgY2xhdXNlIHdpdGggbnVtYmVyIG9mIHZhcmlhYmxlcyBcYSBOLgotICAvLy8KLSAgLy8vIFxwYXJhbSBOIE51bWJlciBvZiB0aGUgdmFyaWFibGVzIGluIHRoZSBjbGF1c2UuCi0gIC8vLwotICBPTVBWYXJMaXN0KFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgdW5zaWduZWQgTikKLSAgICA6IExQYXJlbkxvYyhMUGFyZW5Mb2MpLCBOdW1WYXJzKE4pIHsgfQotcHVibGljOgotICB0eXBlZGVmIGxsdm06Ok11dGFibGVBcnJheVJlZjxFeHByICo+OjppdGVyYXRvciB2YXJsaXN0X2l0ZXJhdG9yOwotICB0eXBlZGVmIEFycmF5UmVmPGNvbnN0IEV4cHIgKj46Oml0ZXJhdG9yIHZhcmxpc3RfY29uc3RfaXRlcmF0b3I7Ci0KLSAgdW5zaWduZWQgdmFybGlzdF9zaXplKCkgY29uc3QgeyByZXR1cm4gTnVtVmFyczsgfQotICBib29sIHZhcmxpc3RfZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1WYXJzID09IDA7IH0KLSAgdmFybGlzdF9pdGVyYXRvciB2YXJsaXN0X2JlZ2luKCkgeyByZXR1cm4gZ2V0VmFyUmVmcygpLmJlZ2luKCk7IH0KLSAgdmFybGlzdF9pdGVyYXRvciB2YXJsaXN0X2VuZCgpIHsgcmV0dXJuIGdldFZhclJlZnMoKS5lbmQoKTsgfQotICB2YXJsaXN0X2NvbnN0X2l0ZXJhdG9yIHZhcmxpc3RfYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRWYXJSZWZzKCkuYmVnaW4oKTsgfQotICB2YXJsaXN0X2NvbnN0X2l0ZXJhdG9yIHZhcmxpc3RfZW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFyUmVmcygpLmVuZCgpOyB9Ci0KLSAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiAnKCcuCi0gIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBMUGFyZW5Mb2MgPSBMb2M7IH0KLSAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiAnKCcuCi0gIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQotCi0gIC8vLyBcYnJpZWYgRmV0Y2hlcyBsaXN0IG9mIGFsbCB2YXJpYWJsZXMgaW4gdGhlIGNsYXVzZS4KLSAgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBnZXRWYXJSZWZzKCkgY29uc3QgewotICAgIHJldHVybiBBcnJheVJlZjxjb25zdCBFeHByICo+KAotICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwciAqY29uc3QgKj4oc3RhdGljX2Nhc3Q8Y29uc3QgVCAqPih0aGlzKSArIDEpLAotICAgICAgIE51bVZhcnMpOwotICB9Ci19OwotCi0vLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyAnZGVmYXVsdCcgY2xhdXNlIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJyBkaXJlY3RpdmUuCi0vLy8KLS8vLyBcY29kZQotLy8vICNwcmFnbWEgb21wIHBhcmFsbGVsIGRlZmF1bHQoc2hhcmVkKQotLy8vIFxlbmRjb2RlCi0vLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGhhcyBzaW1wbGUgJ2RlZmF1bHQnCi0vLy8gY2xhdXNlIHdpdGgga2luZCAnc2hhcmVkJy4KLS8vLwotY2xhc3MgT01QRGVmYXVsdENsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UgewotICBmcmllbmQgY2xhc3MgT01QQ2xhdXNlUmVhZGVyOwotICAvLy8gXGJyaWVmIExvY2F0aW9uIG9mICcoJy4KLSAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jOwotICAvLy8gXGJyaWVmIEEga2luZCBvZiB0aGUgJ2RlZmF1bHQnIGNsYXVzZS4KLSAgT3Blbk1QRGVmYXVsdENsYXVzZUtpbmQgS2luZDsKLSAgLy8vIFxicmllZiBTdGFydCBsb2NhdGlvbiBvZiB0aGUga2luZCBpbiBzb3VyY2UgY29kZS4KLSAgU291cmNlTG9jYXRpb24gS2luZEt3TG9jOwotCi0gIC8vLyBcYnJpZWYgU2V0IGtpbmQgb2YgdGhlIGNsYXVzZXMuCi0gIC8vLwotICAvLy8gXHBhcmFtIEsgQXJndW1lbnQgb2YgY2xhdXNlLgotICAvLy8KLSAgdm9pZCBzZXREZWZhdWx0S2luZChPcGVuTVBEZWZhdWx0Q2xhdXNlS2luZCBLKSB7IEtpbmQgPSBLOyB9Ci0KLSAgLy8vIFxicmllZiBTZXQgYXJndW1lbnQgbG9jYXRpb24uCi0gIC8vLwotICAvLy8gXHBhcmFtIEtMb2MgQXJndW1lbnQgbG9jYXRpb24uCi0gIC8vLwotICB2b2lkIHNldERlZmF1bHRLaW5kS3dMb2MoU291cmNlTG9jYXRpb24gS0xvYykgeyBLaW5kS3dMb2MgPSBLTG9jOyB9Ci1wdWJsaWM6Ci0gIC8vLyBcYnJpZWYgQnVpbGQgJ2RlZmF1bHQnIGNsYXVzZSB3aXRoIGFyZ3VtZW50IFxhIEEgKCdub25lJyBvciAnc2hhcmVkJykuCi0gIC8vLwotICAvLy8gXHBhcmFtIEEgQXJndW1lbnQgb2YgdGhlIGNsYXVzZSAoJ25vbmUnIG9yICdzaGFyZWQnKS4KLSAgLy8vIFxwYXJhbSBBTG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBhcmd1bWVudC4KLSAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgotICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCi0gIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgotICAvLy8KLSAgT01QRGVmYXVsdENsYXVzZShPcGVuTVBEZWZhdWx0Q2xhdXNlS2luZCBBLCBTb3VyY2VMb2NhdGlvbiBBTG9jLAotICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCi0gICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKQotICAgIDogT01QQ2xhdXNlKE9NUENfZGVmYXVsdCwgU3RhcnRMb2MsIEVuZExvYyksIExQYXJlbkxvYyhMUGFyZW5Mb2MpLAotICAgICAgS2luZChBKSwgS2luZEt3TG9jKEFMb2MpIHsgfQotCi0gIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgotICAvLy8KLSAgT01QRGVmYXVsdENsYXVzZSgpCi0gICAgOiBPTVBDbGF1c2UoT01QQ19kZWZhdWx0LCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgIExQYXJlbkxvYyhTb3VyY2VMb2NhdGlvbigpKSwgS2luZChPTVBDX0RFRkFVTFRfdW5rbm93biksCi0gICAgICBLaW5kS3dMb2MoU291cmNlTG9jYXRpb24oKSkgeyB9Ci0KLSAgLy8vIFxicmllZiBTZXRzIHRoZSBsb2NhdGlvbiBvZiAnKCcuCi0gIHZvaWQgc2V0TFBhcmVuTG9jKFNvdXJjZUxvY2F0aW9uIExvYykgeyBMUGFyZW5Mb2MgPSBMb2M7IH0KLSAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiAnKCcuCi0gIFNvdXJjZUxvY2F0aW9uIGdldExQYXJlbkxvYygpIGNvbnN0IHsgcmV0dXJuIExQYXJlbkxvYzsgfQotCi0gIC8vLyBcYnJpZWYgUmV0dXJucyBraW5kIG9mIHRoZSBjbGF1c2UuCi0gIE9wZW5NUERlZmF1bHRDbGF1c2VLaW5kIGdldERlZmF1bHRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQotCi0gIC8vLyBcYnJpZWYgUmV0dXJucyBsb2NhdGlvbiBvZiBjbGF1c2Uga2luZC4KLSAgU291cmNlTG9jYXRpb24gZ2V0RGVmYXVsdEtpbmRLd0xvYygpIGNvbnN0IHsgcmV0dXJuIEtpbmRLd0xvYzsgfQotCi0gIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgT01QQ2xhdXNlICpUKSB7Ci0gICAgcmV0dXJuIFQtPmdldENsYXVzZUtpbmQoKSA9PSBPTVBDX2RlZmF1bHQ7Ci0gIH0KLQotICBTdG10UmFuZ2UgY2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIFN0bXRSYW5nZSgpOwotICB9Ci19OwotCi0vLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyBjbGF1c2UgJ3ByaXZhdGUnIGluIHRoZSAnI3ByYWdtYSBvbXAgLi4uJyBkaXJlY3RpdmVzLgotLy8vCi0vLy8gXGNvZGUKLS8vLyAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGEsYikKLS8vLyBcZW5kY29kZQotLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBoYXMgY2xhdXNlICdwcml2YXRlJwotLy8vIHdpdGggdGhlIHZhcmlhYmxlcyAnYScgYW5kICdiJy4KLS8vLwotY2xhc3MgT01QUHJpdmF0ZUNsYXVzZSA6IHB1YmxpYyBPTVBDbGF1c2UsIHB1YmxpYyBPTVBWYXJMaXN0PE9NUFByaXZhdGVDbGF1c2U+IHsKLSAgLy8vIFxicmllZiBCdWlsZCBjbGF1c2Ugd2l0aCBudW1iZXIgb2YgdmFyaWFibGVzIFxhIE4uCi0gIC8vLwotICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCi0gIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KLSAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCi0gIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgotICAvLy8KLSAgT01QUHJpdmF0ZUNsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAotICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgdW5zaWduZWQgTikKLSAgICA6IE9NUENsYXVzZShPTVBDX3ByaXZhdGUsIFN0YXJ0TG9jLCBFbmRMb2MpLAotICAgICAgT01QVmFyTGlzdDxPTVBQcml2YXRlQ2xhdXNlPihMUGFyZW5Mb2MsIE4pIHsgfQotCi0gIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgY2xhdXNlLgotICAvLy8KLSAgLy8vIFxwYXJhbSBOIE51bWJlciBvZiB2YXJpYWJsZXMuCi0gIC8vLwotICBleHBsaWNpdCBPTVBQcml2YXRlQ2xhdXNlKHVuc2lnbmVkIE4pCi0gICAgOiBPTVBDbGF1c2UoT01QQ19wcml2YXRlLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgIE9NUFZhckxpc3Q8T01QUHJpdmF0ZUNsYXVzZT4oU291cmNlTG9jYXRpb24oKSwgTikgeyB9Ci1wdWJsaWM6Ci0gIC8vLyBcYnJpZWYgQ3JlYXRlcyBjbGF1c2Ugd2l0aCBhIGxpc3Qgb2YgdmFyaWFibGVzIFxhIFZMLgotICAvLy8KLSAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgotICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCi0gIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KLSAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCi0gIC8vLyBccGFyYW0gVkwgTGlzdCBvZiByZWZlcmVuY2VzIHRvIHRoZSB2YXJpYWJsZXMuCi0gIC8vLwotICBzdGF0aWMgT01QUHJpdmF0ZUNsYXVzZSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBWTCk7Ci0gIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBjbGF1c2Ugd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE4gdmFyaWFibGVzLgotICAvLy8KLSAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgotICAvLy8gXHBhcmFtIE4gVGhlIG51bWJlciBvZiB2YXJpYWJsZXMuCi0gIC8vLwotICBzdGF0aWMgT01QUHJpdmF0ZUNsYXVzZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTik7Ci0KLSAgU3RtdFJhbmdlIGNoaWxkcmVuKCkgewotICAgIHJldHVybiBTdG10UmFuZ2UocmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2JlZ2luKCkpLAotICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2VuZCgpKSk7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgewotICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19wcml2YXRlOwotICB9Ci19OwotCi0vLy8gXGJyaWVmIFRoaXMgcmVwcmVzZW50cyBjbGF1c2UgJ2ZpcnN0cHJpdmF0ZScgaW4gdGhlICcjcHJhZ21hIG9tcCAuLi4nCi0vLy8gZGlyZWN0aXZlcy4KLS8vLwotLy8vIFxjb2RlCi0vLy8gI3ByYWdtYSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKGEsYikKLS8vLyBcZW5kY29kZQotLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBoYXMgY2xhdXNlICdmaXJzdHByaXZhdGUnCi0vLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgotLy8vCi1jbGFzcyBPTVBGaXJzdHByaXZhdGVDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9NUFZhckxpc3Q8T01QRmlyc3Rwcml2YXRlQ2xhdXNlPiB7Ci0gIC8vLyBcYnJpZWYgQnVpbGQgY2xhdXNlIHdpdGggbnVtYmVyIG9mIHZhcmlhYmxlcyBcYSBOLgotICAvLy8KLSAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgotICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCi0gIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgotICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGNsYXVzZS4KLSAgLy8vCi0gIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZShTb3VyY2VMb2NhdGlvbiBTdGFydExvYywgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAotICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgdW5zaWduZWQgTikKLSAgICA6IE9NUENsYXVzZShPTVBDX2ZpcnN0cHJpdmF0ZSwgU3RhcnRMb2MsIEVuZExvYyksCi0gICAgICBPTVBWYXJMaXN0PE9NUEZpcnN0cHJpdmF0ZUNsYXVzZT4oTFBhcmVuTG9jLCBOKSB7IH0KLQotICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGNsYXVzZS4KLSAgLy8vCi0gIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdmFyaWFibGVzLgotICAvLy8KLSAgZXhwbGljaXQgT01QRmlyc3Rwcml2YXRlQ2xhdXNlKHVuc2lnbmVkIE4pCi0gICAgOiBPTVBDbGF1c2UoT01QQ19maXJzdHByaXZhdGUsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpLAotICAgICAgT01QVmFyTGlzdDxPTVBGaXJzdHByaXZhdGVDbGF1c2U+KFNvdXJjZUxvY2F0aW9uKCksIE4pIHsgfQotcHVibGljOgotICAvLy8gXGJyaWVmIENyZWF0ZXMgY2xhdXNlIHdpdGggYSBsaXN0IG9mIHZhcmlhYmxlcyBcYSBWTC4KLSAgLy8vCi0gIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KLSAgLy8vIFxwYXJhbSBTdGFydExvYyBTdGFydGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgotICAvLy8gXHBhcmFtIExQYXJlbkxvYyBMb2NhdGlvbiBvZiAnKCcuCi0gIC8vLyBccGFyYW0gRW5kTG9jIEVuZGluZyBsb2NhdGlvbiBvZiB0aGUgY2xhdXNlLgotICAvLy8gXHBhcmFtIFZMIExpc3Qgb2YgcmVmZXJlbmNlcyB0byB0aGUgdmFyaWFibGVzLgotICAvLy8KLSAgc3RhdGljIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSAqQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gVkwpOwotICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgY2xhdXNlIHdpdGggdGhlIHBsYWNlIGZvciBcYSBOIHZhcmlhYmxlcy4KLSAgLy8vCi0gIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KLSAgLy8vIFxwYXJhbSBOIFRoZSBudW1iZXIgb2YgdmFyaWFibGVzLgotICAvLy8KLSAgc3RhdGljIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTik7Ci0KLSAgU3RtdFJhbmdlIGNoaWxkcmVuKCkgewotICAgIHJldHVybiBTdG10UmFuZ2UocmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2JlZ2luKCkpLAotICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2VuZCgpKSk7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgewotICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19maXJzdHByaXZhdGU7Ci0gIH0KLX07Ci0KLS8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGNsYXVzZSAnc2hhcmVkJyBpbiB0aGUgJyNwcmFnbWEgb21wIC4uLicgZGlyZWN0aXZlcy4KLS8vLwotLy8vIFxjb2RlCi0vLy8gI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGEsYikKLS8vLyBcZW5kY29kZQotLy8vIEluIHRoaXMgZXhhbXBsZSBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBoYXMgY2xhdXNlICdzaGFyZWQnCi0vLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLgotLy8vCi1jbGFzcyBPTVBTaGFyZWRDbGF1c2UgOiBwdWJsaWMgT01QQ2xhdXNlLCBwdWJsaWMgT01QVmFyTGlzdDxPTVBTaGFyZWRDbGF1c2U+IHsKLSAgLy8vIFxicmllZiBCdWlsZCBjbGF1c2Ugd2l0aCBudW1iZXIgb2YgdmFyaWFibGVzIFxhIE4uCi0gIC8vLwotICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCi0gIC8vLyBccGFyYW0gTFBhcmVuTG9jIExvY2F0aW9uIG9mICcoJy4KLSAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBjbGF1c2UuCi0gIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgY2xhdXNlLgotICAvLy8KLSAgT01QU2hhcmVkQ2xhdXNlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCi0gICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsIHVuc2lnbmVkIE4pCi0gICAgOiBPTVBDbGF1c2UoT01QQ19zaGFyZWQsIFN0YXJ0TG9jLCBFbmRMb2MpLAotICAgICAgT01QVmFyTGlzdDxPTVBTaGFyZWRDbGF1c2U+KExQYXJlbkxvYywgTikgeyB9Ci0KLSAgLy8vIFxicmllZiBCdWlsZCBhbiBlbXB0eSBjbGF1c2UuCi0gIC8vLwotICAvLy8gXHBhcmFtIE4gTnVtYmVyIG9mIHZhcmlhYmxlcy4KLSAgLy8vCi0gIGV4cGxpY2l0IE9NUFNoYXJlZENsYXVzZSh1bnNpZ25lZCBOKQotICAgIDogT01QQ2xhdXNlKE9NUENfc2hhcmVkLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgIE9NUFZhckxpc3Q8T01QU2hhcmVkQ2xhdXNlPihTb3VyY2VMb2NhdGlvbigpLCBOKSB7IH0KLXB1YmxpYzoKLSAgLy8vIFxicmllZiBDcmVhdGVzIGNsYXVzZSB3aXRoIGEgbGlzdCBvZiB2YXJpYWJsZXMgXGEgVkwuCi0gIC8vLwotICAvLy8gXHBhcmFtIEMgQVNUIGNvbnRleHQuCi0gIC8vLyBccGFyYW0gU3RhcnRMb2MgU3RhcnRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KLSAgLy8vIFxwYXJhbSBMUGFyZW5Mb2MgTG9jYXRpb24gb2YgJygnLgotICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgbG9jYXRpb24gb2YgdGhlIGNsYXVzZS4KLSAgLy8vIFxwYXJhbSBWTCBMaXN0IG9mIHJlZmVyZW5jZXMgdG8gdGhlIHZhcmlhYmxlcy4KLSAgLy8vCi0gIHN0YXRpYyBPTVBTaGFyZWRDbGF1c2UgKkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywgQXJyYXlSZWY8RXhwciAqPiBWTCk7Ci0gIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBjbGF1c2Ugd2l0aCBcYSBOIHZhcmlhYmxlcy4KLSAgLy8vCi0gIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KLSAgLy8vIFxwYXJhbSBOIFRoZSBudW1iZXIgb2YgdmFyaWFibGVzLgotICAvLy8KLSAgc3RhdGljIE9NUFNoYXJlZENsYXVzZSAqQ3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgTik7Ci0KLSAgU3RtdFJhbmdlIGNoaWxkcmVuKCkgewotICAgIHJldHVybiBTdG10UmFuZ2UocmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2JlZ2luKCkpLAotICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTdG10ICoqPih2YXJsaXN0X2VuZCgpKSk7Ci0gIH0KLQotICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE9NUENsYXVzZSAqVCkgewotICAgIHJldHVybiBULT5nZXRDbGF1c2VLaW5kKCkgPT0gT01QQ19zaGFyZWQ7Ci0gIH0KLX07Ci0KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAvLyBBU1QgY2xhc3NlcyBmb3IgZGlyZWN0aXZlcy4KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKQEAgLTM4MiwxMCArMzgsMjMgQEAKICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2M7CiAgIC8vLyBcYnJpZWYgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCiAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYzsKLSAgLy8vIFxicmllZiBQb2ludGVyIHRvIHRoZSBsaXN0IG9mIGNsYXVzZXMuCi0gIGxsdm06Ok11dGFibGVBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlczsKLSAgLy8vIFxicmllZiBBc3NvY2lhdGVkIHN0YXRlbWVudCAoaWYgYW55KSBhbmQgZXhwcmVzc2lvbnMuCi0gIGxsdm06Ok11dGFibGVBcnJheVJlZjxTdG10ICo+IFN0bXRBbmRFeHByZXNzaW9uczsKKyAgLy8vIFxicmllZiBOdW1iZXJzIG9mIGNsYXVzZXMuCisgIGNvbnN0IHVuc2lnbmVkIE51bUNsYXVzZXM7CisgIC8vLyBcYnJpZWYgTnVtYmVyIG9mIGNoaWxkIGV4cHJlc3Npb25zL3N0bXRzLgorICBjb25zdCB1bnNpZ25lZCBOdW1DaGlsZHJlbjsKKyAgLy8vIFxicmllZiBPZmZzZXQgZnJvbSB0aGlzIHRvIHRoZSBzdGFydCBvZiBjbGF1c2VzLgorICAvLy8gVGhlcmUgYXJlIE51bUNsYXVzZXMgcG9pbnRlcnMgdG8gY2xhdXNlcywgdGhleSBhcmUgZm9sbG93ZWQgYnkKKyAgLy8vIE51bUNoaWxkcmVuIHBvaW50ZXJzIHRvIGNoaWxkIHN0bXRzL2V4cHJzIChpZiB0aGUgZGlyZWN0aXZlIHR5cGUKKyAgLy8vIHJlcXVpcmVzIGFuIGFzc29jaWF0ZWQgc3RtdCwgdGhlbiBpdCBoYXMgdG8gYmUgdGhlIGZpcnN0IG9mIHRoZW0pLgorICBjb25zdCB1bnNpZ25lZCBDbGF1c2VzT2Zmc2V0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjbGF1c2VzIHN0b3JhZ2UuCisgIGxsdm06Ok11dGFibGVBcnJheVJlZjxPTVBDbGF1c2UgKj4gZ2V0Q2xhdXNlcygpIHsKKyAgICBPTVBDbGF1c2UgKipDbGF1c2VTdG9yYWdlID0gcmVpbnRlcnByZXRfY2FzdDxPTVBDbGF1c2UgKio+KAorICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIgKj4odGhpcykgKyBDbGF1c2VzT2Zmc2V0KTsKKyAgICByZXR1cm4gbGx2bTo6TXV0YWJsZUFycmF5UmVmPE9NUENsYXVzZSAqPihDbGF1c2VTdG9yYWdlLCBOdW1DbGF1c2VzKTsKKyAgfQorCiBwcm90ZWN0ZWQ6CiAgIC8vLyBcYnJpZWYgQnVpbGQgaW5zdGFuY2Ugb2YgZGlyZWN0aXZlIG9mIGNsYXNzIFxhIEsuCiAgIC8vLwpAQCAtMzk3LDEyICs2NiwxMSBAQAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgT01QRXhlY3V0YWJsZURpcmVjdGl2ZShjb25zdCBUICosIFN0bXRDbGFzcyBTQywgT3Blbk1QRGlyZWN0aXZlS2luZCBLLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywgdW5zaWduZWQgTnVtYmVyT2ZFeHByZXNzaW9ucykKLSAgICA6IFN0bXQoU0MpLCBLaW5kKEspLCBTdGFydExvYyhTdGFydExvYyksIEVuZExvYyhFbmRMb2MpLAotICAgICAgQ2xhdXNlcyhyZWludGVycHJldF9jYXN0PE9NUENsYXVzZSAqKj4oc3RhdGljX2Nhc3Q8VCAqPih0aGlzKSArIDEpLAotICAgICAgICAgICAgICBOdW1DbGF1c2VzKSwKLSAgICAgIFN0bXRBbmRFeHByZXNzaW9ucyhyZWludGVycHJldF9jYXN0PFN0bXQgKio+KENsYXVzZXMuZW5kKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlck9mRXhwcmVzc2lvbnMpIHsgfQorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsIHVuc2lnbmVkIE51bUNoaWxkcmVuKQorICAgICAgOiBTdG10KFNDKSwgS2luZChLKSwgU3RhcnRMb2MoU3RhcnRMb2MpLCBFbmRMb2MoRW5kTG9jKSwKKyAgICAgICAgTnVtQ2xhdXNlcyhOdW1DbGF1c2VzKSwgTnVtQ2hpbGRyZW4oTnVtQ2hpbGRyZW4pLAorICAgICAgICBDbGF1c2VzT2Zmc2V0KGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChzaXplb2YoVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmFsaWduT2Y8T01QQ2xhdXNlICo+KCkpKSB7fQogCiAgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbGlzdCBvZiB2YXJpYWJsZXMgZm9yIHRoaXMgY2xhdXNlLgogICAvLy8KQEAgLTQxNCw5ICs4Miw3IEBACiAgIC8vLwogICAvLy8gL3BhcmFtIFMgQXNzb2NpYXRlZCBzdGF0ZW1lbnQuCiAgIC8vLwotICB2b2lkIHNldEFzc29jaWF0ZWRTdG10KFN0bXQgKlMpIHsKLSAgICBTdG10QW5kRXhwcmVzc2lvbnNbMF0gPSBTOwotICB9CisgIHZvaWQgc2V0QXNzb2NpYXRlZFN0bXQoU3RtdCAqUykgeyAqY2hpbGRfYmVnaW4oKSA9IFM7IH0KIAogcHVibGljOgogICAvLy8gXGJyaWVmIFJldHVybnMgc3RhcnRpbmcgbG9jYXRpb24gb2YgZGlyZWN0aXZlIGtpbmQuCkBAIC00MzYsMjEgKzEwMiwxNiBAQAogICB2b2lkIHNldExvY0VuZChTb3VyY2VMb2NhdGlvbiBMb2MpIHsgRW5kTG9jID0gTG9jOyB9CiAKICAgLy8vIFxicmllZiBHZXQgbnVtYmVyIG9mIGNsYXVzZXMuCi0gIHVuc2lnbmVkIGdldE51bUNsYXVzZXMoKSBjb25zdCB7IHJldHVybiBDbGF1c2VzLnNpemUoKTsgfQorICB1bnNpZ25lZCBnZXROdW1DbGF1c2VzKCkgY29uc3QgeyByZXR1cm4gTnVtQ2xhdXNlczsgfQogCiAgIC8vLyBcYnJpZWYgUmV0dXJucyBzcGVjaWZpZWQgY2xhdXNlLgogICAvLy8KICAgLy8vIFxwYXJhbSBpIE51bWJlciBvZiBjbGF1c2UuCiAgIC8vLwotICBPTVBDbGF1c2UgKmdldENsYXVzZSh1bnNpZ25lZCBpKSBjb25zdCB7Ci0gICAgYXNzZXJ0KGkgPCBDbGF1c2VzLnNpemUoKSAmJiAiaW5kZXggb3V0IG9mIGJvdW5kISIpOwotICAgIHJldHVybiBDbGF1c2VzW2ldOwotICB9CisgIE9NUENsYXVzZSAqZ2V0Q2xhdXNlKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIGNsYXVzZXMoKVtpXTsgfQogCiAgIC8vLyBcYnJpZWYgUmV0dXJucyBzdGF0ZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCi0gIFN0bXQgKmdldEFzc29jaWF0ZWRTdG10KCkgY29uc3QgewotICAgIHJldHVybiBTdG10QW5kRXhwcmVzc2lvbnNbMF07Ci0gIH0KKyAgU3RtdCAqZ2V0QXNzb2NpYXRlZFN0bXQoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PFN0bXQgKj4oKmNoaWxkX2JlZ2luKCkpOyB9CiAKICAgT3Blbk1QRGlyZWN0aXZlS2luZCBnZXREaXJlY3RpdmVLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQogCkBAIC00NjAsMTIgKzEyMSwxNSBAQAogICB9CiAKICAgY2hpbGRfcmFuZ2UgY2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIGNoaWxkX3JhbmdlKFN0bXRBbmRFeHByZXNzaW9ucy5iZWdpbigpLCBTdG10QW5kRXhwcmVzc2lvbnMuZW5kKCkpOworICAgIFN0bXQgKipDaGlsZFN0b3JhZ2UgPSByZWludGVycHJldF9jYXN0PFN0bXQgKio+KGdldENsYXVzZXMoKS5lbmQoKSk7CisgICAgcmV0dXJuIGNoaWxkX3JhbmdlKENoaWxkU3RvcmFnZSwgQ2hpbGRTdG9yYWdlICsgTnVtQ2hpbGRyZW4pOwogICB9CiAKLSAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IGNsYXVzZXMoKSB7IHJldHVybiBDbGF1c2VzOyB9CisgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBjbGF1c2VzKCkgeyByZXR1cm4gZ2V0Q2xhdXNlcygpOyB9CiAKLSAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IGNsYXVzZXMoKSBjb25zdCB7IHJldHVybiBDbGF1c2VzOyB9CisgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBjbGF1c2VzKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgKj4odGhpcyktPmdldENsYXVzZXMoKTsKKyAgfQogfTsKIAogLy8vIFxicmllZiBUaGlzIHJlcHJlc2VudHMgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBkaXJlY3RpdmUuCkBAIC00ODQsMTcgKzE0OCwxOSBAQAogICAvLy8gXHBhcmFtIEVuZExvYyBFbmRpbmcgTG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KICAgLy8vCiAgIE9NUFBhcmFsbGVsRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE4pCi0gICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFBhcmFsbGVsRGlyZWN0aXZlQ2xhc3MsIE9NUERfcGFyYWxsZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBFbmRMb2MsIE4sIDEpIHsgfQorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFBhcmFsbGVsRGlyZWN0aXZlQ2xhc3MsIE9NUERfcGFyYWxsZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYywgTnVtQ2xhdXNlcywgMSkge30KIAogICAvLy8gXGJyaWVmIEJ1aWxkIGFuIGVtcHR5IGRpcmVjdGl2ZS4KICAgLy8vCi0gIC8vLyBccGFyYW0gTiBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgogICAvLy8KLSAgZXhwbGljaXQgT01QUGFyYWxsZWxEaXJlY3RpdmUodW5zaWduZWQgTikKLSAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QUGFyYWxsZWxEaXJlY3RpdmVDbGFzcywgT01QRF9wYXJhbGxlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgTiwgMSkgeyB9CisgIGV4cGxpY2l0IE9NUFBhcmFsbGVsRGlyZWN0aXZlKHVuc2lnbmVkIE51bUNsYXVzZXMpCisgICAgICA6IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUodGhpcywgT01QUGFyYWxsZWxEaXJlY3RpdmVDbGFzcywgT01QRF9wYXJhbGxlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpIHt9CisKIHB1YmxpYzoKICAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgogICAvLy8KQEAgLTUwNCwyNSArMTcwLDkxIEBACiAgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCiAgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgogICAvLy8KLSAgc3RhdGljIE9NUFBhcmFsbGVsRGlyZWN0aXZlICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10KTsKKyAgc3RhdGljIE9NUFBhcmFsbGVsRGlyZWN0aXZlICoKKyAgQ3JlYXRlKGNvbnN0IEFTVENvbnRleHQgJkMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywgU3RtdCAqQXNzb2NpYXRlZFN0bXQpOwogCiAgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhbiBlbXB0eSBkaXJlY3RpdmUgd2l0aCB0aGUgcGxhY2UgZm9yIFxhIE4gY2xhdXNlcy4KICAgLy8vCiAgIC8vLyBccGFyYW0gQyBBU1QgY29udGV4dC4KLSAgLy8vIFxwYXJhbSBOIFRoZSBudW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgogICAvLy8KLSAgc3RhdGljIE9NUFBhcmFsbGVsRGlyZWN0aXZlICpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5U2hlbGwpOworICBzdGF0aWMgT01QUGFyYWxsZWxEaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2xhdXNlcywgRW1wdHlTaGVsbCk7CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTdG10ICpUKSB7CiAgICAgcmV0dXJuIFQtPmdldFN0bXRDbGFzcygpID09IE9NUFBhcmFsbGVsRGlyZWN0aXZlQ2xhc3M7CiAgIH0KIH07CiAKLX0gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzICcjcHJhZ21hIG9tcCBzaW1kJyBkaXJlY3RpdmUuCisvLy8KKy8vLyBcY29kZQorLy8vICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZShhLGIpIGxpbmVhcihpLGo6cykgcmVkdWN0aW9uKCs6YyxkKQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhpcyBleGFtcGxlIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgc2ltZCcgaGFzIGNsYXVzZXMgJ3ByaXZhdGUnCisvLy8gd2l0aCB0aGUgdmFyaWFibGVzICdhJyBhbmQgJ2InLCAnbGluZWFyJyB3aXRoIHZhcmlhYmxlcyAnaScsICdqJyBhbmQKKy8vLyBsaW5lYXIgc3RlcCAncycsICdyZWR1Y3Rpb24nIHdpdGggb3BlcmF0b3IgJysnIGFuZCB2YXJpYWJsZXMgJ2MnIGFuZCAnZCcuCisvLy8KK2NsYXNzIE9NUFNpbWREaXJlY3RpdmUgOiBwdWJsaWMgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSB7CisgIGZyaWVuZCBjbGFzcyBBU1RTdG10UmVhZGVyOworICAvLy8gXGJyaWVmIE51bWJlciBvZiBjb2xsYXBzZWQgbG9vcHMgYXMgc3BlY2lmaWVkIGJ5ICdjb2xsYXBzZScgY2xhdXNlLgorICB1bnNpZ25lZCBDb2xsYXBzZWROdW07CisgIC8vLyBcYnJpZWYgQnVpbGQgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ29sbGFwc2VkTnVtIE51bWJlciBvZiBjb2xsYXBzZWQgbmVzdGVkIGxvb3BzLgorICAvLy8gXHBhcmFtIE51bUNsYXVzZXMgTnVtYmVyIG9mIGNsYXVzZXMuCisgIC8vLworICBPTVBTaW1kRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sbGFwc2VkTnVtLCB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFNpbWREaXJlY3RpdmVDbGFzcywgT01QRF9zaW1kLCBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MsIE51bUNsYXVzZXMsIDEpLAorICAgICAgICBDb2xsYXBzZWROdW0oQ29sbGFwc2VkTnVtKSB7fQorCisgIC8vLyBcYnJpZWYgQnVpbGQgYW4gZW1wdHkgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb2xsYXBzZWROdW0gTnVtYmVyIG9mIGNvbGxhcHNlZCBuZXN0ZWQgbG9vcHMuCisgIC8vLyBccGFyYW0gTnVtQ2xhdXNlcyBOdW1iZXIgb2YgY2xhdXNlcy4KKyAgLy8vCisgIGV4cGxpY2l0IE9NUFNpbWREaXJlY3RpdmUodW5zaWduZWQgQ29sbGFwc2VkTnVtLCB1bnNpZ25lZCBOdW1DbGF1c2VzKQorICAgICAgOiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKHRoaXMsIE9NUFNpbWREaXJlY3RpdmVDbGFzcywgT01QRF9zaW1kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSksCisgICAgICAgIENvbGxhcHNlZE51bShDb2xsYXBzZWROdW0pIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGVzIGRpcmVjdGl2ZSB3aXRoIGEgbGlzdCBvZiBcYSBDbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFN0YXJ0TG9jIFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUga2luZC4KKyAgLy8vIFxwYXJhbSBFbmRMb2MgRW5kaW5nIExvY2F0aW9uIG9mIHRoZSBkaXJlY3RpdmUuCisgIC8vLyBccGFyYW0gQ2xhdXNlcyBMaXN0IG9mIGNsYXVzZXMuCisgIC8vLyBccGFyYW0gQXNzb2NpYXRlZFN0bXQgU3RhdGVtZW50LCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS4KKyAgLy8vCisgIHN0YXRpYyBPTVBTaW1kRGlyZWN0aXZlICpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkFzc29jaWF0ZWRTdG10KTsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYW4gZW1wdHkgZGlyZWN0aXZlIHdpdGggdGhlIHBsYWNlCisgIC8vLyBmb3IgXGEgTnVtQ2xhdXNlcyBjbGF1c2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDIEFTVCBjb250ZXh0LgorICAvLy8gXHBhcmFtIENvbGxhcHNlZE51bSBOdW1iZXIgb2YgY29sbGFwc2VkIG5lc3RlZCBsb29wcy4KKyAgLy8vIFxwYXJhbSBOdW1DbGF1c2VzIE51bWJlciBvZiBjbGF1c2VzLgorICAvLy8KKyAgc3RhdGljIE9NUFNpbWREaXJlY3RpdmUgKkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sIEVtcHR5U2hlbGwpOworCisgIHVuc2lnbmVkIGdldENvbGxhcHNlZE51bWJlcigpIGNvbnN0IHsgcmV0dXJuIENvbGxhcHNlZE51bTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU3RtdCAqVCkgeworICAgIHJldHVybiBULT5nZXRTdG10Q2xhc3MoKSA9PSBPTVBTaW1kRGlyZWN0aXZlQ2xhc3M7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL1RlbXBsYXRlQmFzZS5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvVGVtcGxhdGVCYXNlLmgKaW5kZXggNmM0MGViMS4uYWJlMTA2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvVGVtcGxhdGVCYXNlLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvVGVtcGxhdGVCYXNlLmgKQEAgLTM0LDggKzM0LDcgQEAKIGNsYXNzIFR5cGVTb3VyY2VJbmZvOwogY2xhc3MgVmFsdWVEZWNsOwogCi0vLy8gXGJyaWVmIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSBhcmd1bWVudCB3aXRoaW4gYSBjbGFzcyB0ZW1wbGF0ZQotLy8vIHNwZWNpYWxpemF0aW9uLgorLy8vIFxicmllZiBSZXByZXNlbnRzIGEgdGVtcGxhdGUgYXJndW1lbnQuCiBjbGFzcyBUZW1wbGF0ZUFyZ3VtZW50IHsKIHB1YmxpYzoKICAgLy8vIFxicmllZiBUaGUga2luZCBvZiB0ZW1wbGF0ZSBhcmd1bWVudCB3ZSdyZSBzdG9yaW5nLgpAQCAtNTIsMTYgKzUxLDE5IEBACiAgICAgLy8vIHdhcyBwcm92aWRlZCBmb3IgYSBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCiAgICAgTnVsbFB0ciwKICAgICAvLy8gVGhlIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGFuIGludGVncmFsIHZhbHVlIHN0b3JlZCBpbiBhbiBsbHZtOjpBUFNJbnQKLSAgICAvLy8gdGhhdCB3YXMgcHJvdmlkZWQgZm9yIGFuIGludGVncmFsIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlci4gCisgICAgLy8vIHRoYXQgd2FzIHByb3ZpZGVkIGZvciBhbiBpbnRlZ3JhbCBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCiAgICAgSW50ZWdyYWwsCi0gICAgLy8vIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBhIHRlbXBsYXRlIG5hbWUgdGhhdCB3YXMgcHJvdmlkZWQgZm9yIGEgCisgICAgLy8vIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBhIHRlbXBsYXRlIG5hbWUgdGhhdCB3YXMgcHJvdmlkZWQgZm9yIGEKICAgICAvLy8gdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyLgogICAgIFRlbXBsYXRlLAotICAgIC8vLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgaXMgYSBwYWNrIGV4cGFuc2lvbiBvZiBhIHRlbXBsYXRlIG5hbWUgdGhhdCB3YXMgCisgICAgLy8vIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBhIHBhY2sgZXhwYW5zaW9uIG9mIGEgdGVtcGxhdGUgbmFtZSB0aGF0IHdhcwogICAgIC8vLyBwcm92aWRlZCBmb3IgYSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCiAgICAgVGVtcGxhdGVFeHBhbnNpb24sCi0gICAgLy8vIFRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBhIHZhbHVlLSBvciB0eXBlLWRlcGVuZGVudCBleHByZXNzaW9uIG9yIGEKLSAgICAvLy8gbm9uLWRlcGVuZGVudCBfX3V1aWRvZiBleHByZXNzaW9uIHN0b3JlZCBpbiBhbiBFeHByKi4KKyAgICAvLy8gVGhlIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGFuIGV4cHJlc3Npb24sIGFuZCB3ZSd2ZSBub3QgcmVzb2x2ZWQgaXQgdG8gb25lCisgICAgLy8vIG9mIHRoZSBvdGhlciBmb3JtcyB5ZXQsIGVpdGhlciBiZWNhdXNlIGl0J3MgZGVwZW5kZW50IG9yIGJlY2F1c2Ugd2UncmUKKyAgICAvLy8gcmVwcmVzZW50aW5nIGEgbm9uLWNhbm9uaWNhbCB0ZW1wbGF0ZSBhcmd1bWVudCAoZm9yIGluc3RhbmNlLCBpbiBhCisgICAgLy8vIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlKS4gQWxzbyB1c2VkIHRvIHJlcHJlc2VudCBhIG5vbi1kZXBlbmRlbnQKKyAgICAvLy8gX191dWlkb2YgZXhwcmVzc2lvbiAoYSBNaWNyb3NvZnQgZXh0ZW5zaW9uKS4KICAgICBFeHByZXNzaW9uLAogICAgIC8vLyBUaGUgdGVtcGxhdGUgYXJndW1lbnQgaXMgYWN0dWFsbHkgYSBwYXJhbWV0ZXIgcGFjay4gQXJndW1lbnRzIGFyZSBzdG9yZWQKICAgICAvLy8gaW4gdGhlIEFyZ3Mgc3RydWN0LgpAQCAtNTY1LDcgKzU2Nyw4IEBACiAKICAgICAvLy8gRm9yY2UgQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvIHRvIHRoZSByaWdodCBhbGlnbm1lbnQKICAgICAvLy8gZm9yIHRoZSBmb2xsb3dpbmcgYXJyYXkgb2YgVGVtcGxhdGVBcmd1bWVudExvY3MuCi0gICAgdm9pZCAqQWxpZ25lcjsKKyAgICBsbHZtOjpBbGlnbmVkQ2hhckFycmF5PAorICAgICAgICBsbHZtOjpBbGlnbk9mPFRlbXBsYXRlQXJndW1lbnRMb2M+OjpBbGlnbm1lbnQsIDE+IEFsaWduZXI7CiAgIH07CiAKICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnRzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlLmggYi9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlLmgKaW5kZXggNzk5NWUyMS4uN2JlNmZjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGUuaApAQCAtMjYsMTIgKzI2LDEyIEBACiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVmlzaWJpbGl0eS5oIgogI2luY2x1ZGUgImxsdm0vQURUL0FQU0ludC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgogI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKICNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCiAKIG5hbWVzcGFjZSBjbGFuZyB7CiAgIGVudW0gewpAQCAtNTA1LDkgKzUwNSw5IEBACiAKICAgU3BsaXRRdWFsVHlwZSBnZXRTaW5nbGVTdGVwRGVzdWdhcmVkVHlwZSgpIGNvbnN0OyAvLyBlbmQgb2YgdGhpcyBmaWxlCiAKLSAgLy8gTWFrZSBsbHZtOjp0aWUgd29yay4KLSAgb3BlcmF0b3Igc3RkOjpwYWlyPGNvbnN0IFR5cGUgKixRdWFsaWZpZXJzPigpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjpwYWlyPGNvbnN0IFR5cGUgKixRdWFsaWZpZXJzPihUeSwgUXVhbHMpOworICAvLyBNYWtlIHN0ZDo6dGllIHdvcmsuCisgIHN0ZDo6cGFpcjxjb25zdCBUeXBlICosUXVhbGlmaWVycz4gYXNQYWlyKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnBhaXI8Y29uc3QgVHlwZSAqLCBRdWFsaWZpZXJzPihUeSwgUXVhbHMpOwogICB9CiAKICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShTcGxpdFF1YWxUeXBlIGEsIFNwbGl0UXVhbFR5cGUgYikgewpAQCAtMTc5Nyw3ICsxNzk3LDcgQEAKICAgICByZXR1cm4gQ2Fub25pY2FsVHlwZTsKICAgfQogICBDYW5RdWFsVHlwZSBnZXRDYW5vbmljYWxUeXBlVW5xdWFsaWZpZWQoKSBjb25zdDsgLy8gaW4gQ2Fub25pY2FsVHlwZS5oCi0gIExMVk1fQVRUUklCVVRFX1VTRUQgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OwogCiAgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CiAgIGZyaWVuZCBjbGFzcyBBU1RXcml0ZXI7CkBAIC0xOTk2LDM5ICsxOTk2LDU5IEBACiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeyByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gUG9pbnRlcjsgfQogfTsKIAotLy8vIFxicmllZiBSZXByZXNlbnRzIGEgcG9pbnRlciB0eXBlIGRlY2F5ZWQgZnJvbSBhbiBhcnJheSBvciBmdW5jdGlvbiB0eXBlLgotY2xhc3MgRGVjYXllZFR5cGUgOiBwdWJsaWMgVHlwZSwgcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKLSAgUXVhbFR5cGUgT3JpZ2luYWxUeXBlOwotICBRdWFsVHlwZSBEZWNheWVkUG9pbnRlcjsKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHR5cGUgd2hpY2ggd2FzIGltcGxpY2l0bHkgYWRqdXN0ZWQgYnkgdGhlIHNlbWFudGljCisvLy8gZW5naW5lIGZvciBhcmJpdHJhcnkgcmVhc29ucy4gIEZvciBleGFtcGxlLCBhcnJheSBhbmQgZnVuY3Rpb24gdHlwZXMgY2FuCisvLy8gZGVjYXksIGFuZCBmdW5jdGlvbiB0eXBlcyBjYW4gaGF2ZSB0aGVpciBjYWxsaW5nIGNvbnZlbnRpb25zIGFkanVzdGVkLgorY2xhc3MgQWRqdXN0ZWRUeXBlIDogcHVibGljIFR5cGUsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CisgIFF1YWxUeXBlIE9yaWdpbmFsVHk7CisgIFF1YWxUeXBlIEFkanVzdGVkVHk7CiAKLSAgRGVjYXllZFR5cGUoUXVhbFR5cGUgT3JpZ2luYWxUeXBlLCBRdWFsVHlwZSBEZWNheWVkUG9pbnRlciwKLSAgICAgICAgICAgICAgUXVhbFR5cGUgQ2Fub25pY2FsUHRyKQotICAgICAgOiBUeXBlKERlY2F5ZWQsIENhbm9uaWNhbFB0ciwgT3JpZ2luYWxUeXBlLT5pc0RlcGVuZGVudFR5cGUoKSwKLSAgICAgICAgICAgICBPcmlnaW5hbFR5cGUtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSwKLSAgICAgICAgICAgICBPcmlnaW5hbFR5cGUtPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSwKLSAgICAgICAgICAgICBPcmlnaW5hbFR5cGUtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSksCi0gICAgICAgIE9yaWdpbmFsVHlwZShPcmlnaW5hbFR5cGUpLCBEZWNheWVkUG9pbnRlcihEZWNheWVkUG9pbnRlcikgewotICAgIGFzc2VydChpc2E8UG9pbnRlclR5cGU+KERlY2F5ZWRQb2ludGVyKSk7Citwcm90ZWN0ZWQ6CisgIEFkanVzdGVkVHlwZShUeXBlQ2xhc3MgVEMsIFF1YWxUeXBlIE9yaWdpbmFsVHksIFF1YWxUeXBlIEFkanVzdGVkVHksCisgICAgICAgICAgICAgICBRdWFsVHlwZSBDYW5vbmljYWxQdHIpCisgICAgICA6IFR5cGUoVEMsIENhbm9uaWNhbFB0ciwgT3JpZ2luYWxUeS0+aXNEZXBlbmRlbnRUeXBlKCksCisgICAgICAgICAgICAgT3JpZ2luYWxUeS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgIE9yaWdpbmFsVHktPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSwKKyAgICAgICAgICAgICBPcmlnaW5hbFR5LT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpLAorICAgICAgICBPcmlnaW5hbFR5KE9yaWdpbmFsVHkpLCBBZGp1c3RlZFR5KEFkanVzdGVkVHkpIHt9CisKKyAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7ICAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UuCisKK3B1YmxpYzoKKyAgUXVhbFR5cGUgZ2V0T3JpZ2luYWxUeXBlKCkgY29uc3QgeyByZXR1cm4gT3JpZ2luYWxUeTsgfQorICBRdWFsVHlwZSBnZXRBZGp1c3RlZFR5cGUoKSBjb25zdCB7IHJldHVybiBBZGp1c3RlZFR5OyB9CisKKyAgYm9vbCBpc1N1Z2FyZWQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBBZGp1c3RlZFR5OyB9CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgUHJvZmlsZShJRCwgT3JpZ2luYWxUeSwgQWRqdXN0ZWRUeSk7CisgIH0KKyAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgUXVhbFR5cGUgT3JpZywgUXVhbFR5cGUgTmV3KSB7CisgICAgSUQuQWRkUG9pbnRlcihPcmlnLmdldEFzT3BhcXVlUHRyKCkpOworICAgIElELkFkZFBvaW50ZXIoTmV3LmdldEFzT3BhcXVlUHRyKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVDbGFzcygpID09IEFkanVzdGVkIHx8IFQtPmdldFR5cGVDbGFzcygpID09IERlY2F5ZWQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHBvaW50ZXIgdHlwZSBkZWNheWVkIGZyb20gYW4gYXJyYXkgb3IgZnVuY3Rpb24gdHlwZS4KK2NsYXNzIERlY2F5ZWRUeXBlIDogcHVibGljIEFkanVzdGVkVHlwZSB7CisKKyAgRGVjYXllZFR5cGUoUXVhbFR5cGUgT3JpZ2luYWxUeXBlLCBRdWFsVHlwZSBEZWNheWVkUHRyLCBRdWFsVHlwZSBDYW5vbmljYWxQdHIpCisgICAgICA6IEFkanVzdGVkVHlwZShEZWNheWVkLCBPcmlnaW5hbFR5cGUsIERlY2F5ZWRQdHIsIENhbm9uaWNhbFB0cikgeworICAgIGFzc2VydChpc2E8UG9pbnRlclR5cGU+KGdldEFkanVzdGVkVHlwZSgpKSk7CiAgIH0KIAogICBmcmllbmQgY2xhc3MgQVNUQ29udGV4dDsgIC8vIEFTVENvbnRleHQgY3JlYXRlcyB0aGVzZS4KIAogcHVibGljOgotICBRdWFsVHlwZSBnZXREZWNheWVkVHlwZSgpIGNvbnN0IHsgcmV0dXJuIERlY2F5ZWRQb2ludGVyOyB9Ci0gIFF1YWxUeXBlIGdldE9yaWdpbmFsVHlwZSgpIGNvbnN0IHsgcmV0dXJuIE9yaWdpbmFsVHlwZTsgfQorICBRdWFsVHlwZSBnZXREZWNheWVkVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldEFkanVzdGVkVHlwZSgpOyB9CiAKICAgUXVhbFR5cGUgZ2V0UG9pbnRlZVR5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNhc3Q8UG9pbnRlclR5cGU+KERlY2F5ZWRQb2ludGVyKS0+Z2V0UG9pbnRlZVR5cGUoKTsKLSAgfQotCi0gIGJvb2wgaXNTdWdhcmVkKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gRGVjYXllZFBvaW50ZXI7IH0KLQotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKLSAgICBQcm9maWxlKElELCBPcmlnaW5hbFR5cGUpOwotICB9Ci0gIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIFF1YWxUeXBlIE9yaWdpbmFsVHlwZSkgewotICAgIElELkFkZFBvaW50ZXIoT3JpZ2luYWxUeXBlLmdldEFzT3BhcXVlUHRyKCkpOworICAgIHJldHVybiBjYXN0PFBvaW50ZXJUeXBlPihnZXREZWNheWVkVHlwZSgpKS0+Z2V0UG9pbnRlZVR5cGUoKTsKICAgfQogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeyByZXR1cm4gVC0+Z2V0VHlwZUNsYXNzKCkgPT0gRGVjYXllZDsgfQpAQCAtMjE4NSw2ICsyMjA1LDcgQEAKICAgfQogCiAgIGNvbnN0IFR5cGUgKmdldENsYXNzKCkgY29uc3QgeyByZXR1cm4gQ2xhc3M7IH0KKyAgQ1hYUmVjb3JkRGVjbCAqZ2V0TW9zdFJlY2VudENYWFJlY29yZERlY2woKSBjb25zdDsKIAogICBib29sIGlzU3VnYXJlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgIFF1YWxUeXBlIGRlc3VnYXIoKSBjb25zdCB7IHJldHVybiBRdWFsVHlwZSh0aGlzLCAwKTsgfQpAQCAtMjc1OCw4ICsyNzc5LDcgQEAKICAgdW5zaWduZWQgZ2V0VHlwZVF1YWxzKCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25UeXBlQml0cy5UeXBlUXVhbHM7IH0KIAogcHVibGljOgotCi0gIFF1YWxUeXBlIGdldFJlc3VsdFR5cGUoKSBjb25zdCB7IHJldHVybiBSZXN1bHRUeXBlOyB9CisgIFF1YWxUeXBlIGdldFJldHVyblR5cGUoKSBjb25zdCB7IHJldHVybiBSZXN1bHRUeXBlOyB9CiAKICAgYm9vbCBnZXRIYXNSZWdQYXJtKCkgY29uc3QgeyByZXR1cm4gZ2V0RXh0SW5mbygpLmdldEhhc1JlZ1Bhcm0oKTsgfQogICB1bnNpZ25lZCBnZXRSZWdQYXJtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldEV4dEluZm8oKS5nZXRSZWdQYXJtKCk7IH0KQEAgLTI3NzYsNyArMjc5Niw3IEBACiAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuIGV4cHJlc3Npb24gdGhhdCBjYWxscyBhIGZ1bmN0aW9uIG9mCiAgIC8vLyB0aGlzIHR5cGUuCiAgIFF1YWxUeXBlIGdldENhbGxSZXN1bHRUeXBlKEFTVENvbnRleHQgJkNvbnRleHQpIGNvbnN0IHsKLSAgICByZXR1cm4gZ2V0UmVzdWx0VHlwZSgpLmdldE5vbkxWYWx1ZUV4cHJUeXBlKENvbnRleHQpOworICAgIHJldHVybiBnZXRSZXR1cm5UeXBlKCkuZ2V0Tm9uTFZhbHVlRXhwclR5cGUoQ29udGV4dCk7CiAgIH0KIAogICBzdGF0aWMgU3RyaW5nUmVmIGdldE5hbWVGb3JDYWxsQ29udihDYWxsaW5nQ29udiBDQyk7CkBAIC0yODA1LDcgKzI4MjUsNyBAQAogICBRdWFsVHlwZSBkZXN1Z2FyKCkgY29uc3QgeyByZXR1cm4gUXVhbFR5cGUodGhpcywgMCk7IH0KIAogICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKLSAgICBQcm9maWxlKElELCBnZXRSZXN1bHRUeXBlKCksIGdldEV4dEluZm8oKSk7CisgICAgUHJvZmlsZShJRCwgZ2V0UmV0dXJuVHlwZSgpLCBnZXRFeHRJbmZvKCkpOwogICB9CiAgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIFF1YWxUeXBlIFJlc3VsdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgRXh0SW5mbyBJbmZvKSB7CkBAIC0yODE4LDI3ICsyODM4LDI2IEBACiAgIH0KIH07CiAKLS8vLyBGdW5jdGlvblByb3RvVHlwZSAtIFJlcHJlc2VudHMgYSBwcm90b3R5cGUgd2l0aCBhcmd1bWVudCB0eXBlIGluZm8sIGUuZy4KKy8vLyBGdW5jdGlvblByb3RvVHlwZSAtIFJlcHJlc2VudHMgYSBwcm90b3R5cGUgd2l0aCBwYXJhbWV0ZXIgdHlwZSBpbmZvLCBlLmcuCiAvLy8gJ2ludCBmb28oaW50KScgb3IgJ2ludCBmb28odm9pZCknLiAgJ3ZvaWQnIGlzIHJlcHJlc2VudGVkIGFzIGhhdmluZyBubwotLy8vIGFyZ3VtZW50cywgbm90IGFzIGhhdmluZyBhIHNpbmdsZSB2b2lkIGFyZ3VtZW50LiBTdWNoIGEgdHlwZSBjYW4gaGF2ZSBhbgorLy8vIHBhcmFtZXRlcnMsIG5vdCBhcyBoYXZpbmcgYSBzaW5nbGUgdm9pZCBwYXJhbWV0ZXIuIFN1Y2ggYSB0eXBlIGNhbiBoYXZlIGFuCiAvLy8gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24sIGJ1dCB0aGlzIHNwZWNpZmljYXRpb24gaXMgbm90IHBhcnQgb2YgdGhlIGNhbm9uaWNhbAogLy8vIHR5cGUuCiBjbGFzcyBGdW5jdGlvblByb3RvVHlwZSA6IHB1YmxpYyBGdW5jdGlvblR5cGUsIHB1YmxpYyBsbHZtOjpGb2xkaW5nU2V0Tm9kZSB7CiBwdWJsaWM6CiAgIC8vLyBFeHRQcm90b0luZm8gLSBFeHRyYSBpbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uIHByb3RvdHlwZS4KICAgc3RydWN0IEV4dFByb3RvSW5mbyB7Ci0gICAgRXh0UHJvdG9JbmZvKCkgOgotICAgICAgVmFyaWFkaWMoZmFsc2UpLCBIYXNUcmFpbGluZ1JldHVybihmYWxzZSksIFR5cGVRdWFscygwKSwKLSAgICAgIEV4Y2VwdGlvblNwZWNUeXBlKEVTVF9Ob25lKSwgUmVmUXVhbGlmaWVyKFJRX05vbmUpLAotICAgICAgTnVtRXhjZXB0aW9ucygwKSwgRXhjZXB0aW9ucygwKSwgTm9leGNlcHRFeHByKDApLAotICAgICAgRXhjZXB0aW9uU3BlY0RlY2woMCksIEV4Y2VwdGlvblNwZWNUZW1wbGF0ZSgwKSwKLSAgICAgIENvbnN1bWVkQXJndW1lbnRzKDApIHt9CisgICAgRXh0UHJvdG9JbmZvKCkKKyAgICAgICAgOiBWYXJpYWRpYyhmYWxzZSksIEhhc1RyYWlsaW5nUmV0dXJuKGZhbHNlKSwgVHlwZVF1YWxzKDApLAorICAgICAgICAgIEV4Y2VwdGlvblNwZWNUeXBlKEVTVF9Ob25lKSwgUmVmUXVhbGlmaWVyKFJRX05vbmUpLCBOdW1FeGNlcHRpb25zKDApLAorICAgICAgICAgIEV4Y2VwdGlvbnMoMCksIE5vZXhjZXB0RXhwcigwKSwgRXhjZXB0aW9uU3BlY0RlY2woMCksCisgICAgICAgICAgRXhjZXB0aW9uU3BlY1RlbXBsYXRlKDApLCBDb25zdW1lZFBhcmFtZXRlcnMoMCkge30KIAogICAgIEV4dFByb3RvSW5mbyhDYWxsaW5nQ29udiBDQykKICAgICAgICAgOiBFeHRJbmZvKENDKSwgVmFyaWFkaWMoZmFsc2UpLCBIYXNUcmFpbGluZ1JldHVybihmYWxzZSksIFR5cGVRdWFscygwKSwKICAgICAgICAgICBFeGNlcHRpb25TcGVjVHlwZShFU1RfTm9uZSksIFJlZlF1YWxpZmllcihSUV9Ob25lKSwgTnVtRXhjZXB0aW9ucygwKSwKICAgICAgICAgICBFeGNlcHRpb25zKDApLCBOb2V4Y2VwdEV4cHIoMCksIEV4Y2VwdGlvblNwZWNEZWNsKDApLAotICAgICAgICAgIEV4Y2VwdGlvblNwZWNUZW1wbGF0ZSgwKSwgQ29uc3VtZWRBcmd1bWVudHMoMCkge30KKyAgICAgICAgICBFeGNlcHRpb25TcGVjVGVtcGxhdGUoMCksIENvbnN1bWVkUGFyYW1ldGVycygwKSB7fQogCiAgICAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvIEV4dEluZm87CiAgICAgYm9vbCBWYXJpYWRpYyA6IDE7CkBAIC0yODUxLDcgKzI4NzAsNyBAQAogICAgIEV4cHIgKk5vZXhjZXB0RXhwcjsKICAgICBGdW5jdGlvbkRlY2wgKkV4Y2VwdGlvblNwZWNEZWNsOwogICAgIEZ1bmN0aW9uRGVjbCAqRXhjZXB0aW9uU3BlY1RlbXBsYXRlOwotICAgIGNvbnN0IGJvb2wgKkNvbnN1bWVkQXJndW1lbnRzOworICAgIGNvbnN0IGJvb2wgKkNvbnN1bWVkUGFyYW1ldGVyczsKICAgfTsKIAogcHJpdmF0ZToKQEAgLTI4NjYsMTEgKzI4ODUsMTEgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBGdW5jdGlvblByb3RvVHlwZShRdWFsVHlwZSByZXN1bHQsIEFycmF5UmVmPFF1YWxUeXBlPiBhcmdzLAorICBGdW5jdGlvblByb3RvVHlwZShRdWFsVHlwZSByZXN1bHQsIEFycmF5UmVmPFF1YWxUeXBlPiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIGNhbm9uaWNhbCwgY29uc3QgRXh0UHJvdG9JbmZvICZlcGkpOwogCi0gIC8vLyBOdW1BcmdzIC0gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhpcyBmdW5jdGlvbiBoYXMsIG5vdCBjb3VudGluZyAnLi4uJy4KLSAgdW5zaWduZWQgTnVtQXJncyA6IDE1OworICAvLy8gVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRoaXMgZnVuY3Rpb24gaGFzLCBub3QgY291bnRpbmcgJy4uLicuCisgIHVuc2lnbmVkIE51bVBhcmFtcyA6IDE1OwogCiAgIC8vLyBOdW1FeGNlcHRpb25zIC0gVGhlIG51bWJlciBvZiB0eXBlcyBpbiB0aGUgZXhjZXB0aW9uIHNwZWMsIGlmIGFueS4KICAgdW5zaWduZWQgTnVtRXhjZXB0aW9ucyA6IDk7CkBAIC0yODc4LDggKzI4OTcsOCBAQAogICAvLy8gRXhjZXB0aW9uU3BlY1R5cGUgLSBUaGUgdHlwZSBvZiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiB0aGlzIGZ1bmN0aW9uIGhhcy4KICAgdW5zaWduZWQgRXhjZXB0aW9uU3BlY1R5cGUgOiAzOwogCi0gIC8vLyBIYXNBbnlDb25zdW1lZEFyZ3MgLSBXaGV0aGVyIHRoaXMgZnVuY3Rpb24gaGFzIGFueSBjb25zdW1lZCBhcmd1bWVudHMuCi0gIHVuc2lnbmVkIEhhc0FueUNvbnN1bWVkQXJncyA6IDE7CisgIC8vLyBIYXNBbnlDb25zdW1lZFBhcmFtcyAtIFdoZXRoZXIgdGhpcyBmdW5jdGlvbiBoYXMgYW55IGNvbnN1bWVkIHBhcmFtZXRlcnMuCisgIHVuc2lnbmVkIEhhc0FueUNvbnN1bWVkUGFyYW1zIDogMTsKIAogICAvLy8gVmFyaWFkaWMgLSBXaGV0aGVyIHRoZSBmdW5jdGlvbiBpcyB2YXJpYWRpYy4KICAgdW5zaWduZWQgVmFyaWFkaWMgOiAxOwpAQCAtMjg5Miw4ICsyOTExLDggQEAKICAgLy8vIFRoaXMgaXMgYSB2YWx1ZSBvZiB0eXBlIFxjIFJlZlF1YWxpZmllcktpbmQuCiAgIHVuc2lnbmVkIFJlZlF1YWxpZmllciA6IDI7CiAKLSAgLy8gQXJnSW5mbyAtIFRoZXJlIGlzIGFuIHZhcmlhYmxlIHNpemUgYXJyYXkgYWZ0ZXIgdGhlIGNsYXNzIGluIG1lbW9yeSB0aGF0Ci0gIC8vIGhvbGRzIHRoZSBhcmd1bWVudCB0eXBlcy4KKyAgLy8gUGFyYW1JbmZvIC0gVGhlcmUgaXMgYW4gdmFyaWFibGUgc2l6ZSBhcnJheSBhZnRlciB0aGUgY2xhc3MgaW4gbWVtb3J5IHRoYXQKKyAgLy8gaG9sZHMgdGhlIHBhcmFtZXRlciB0eXBlcy4KIAogICAvLyBFeGNlcHRpb25zIC0gVGhlcmUgaXMgYW5vdGhlciB2YXJpYWJsZSBzaXplIGFycmF5IGFmdGVyIEFyZ0luZm8gdGhhdAogICAvLyBob2xkcyB0aGUgZXhjZXB0aW9uIHR5cGVzLgpAQCAtMjkwNiwxNyArMjkyNSwxNyBAQAogICAvLyBpbnN0YW50aWF0ZSB0aGlzIGZ1bmN0aW9uIHR5cGUncyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiwgYW5kIHRoZSBmdW5jdGlvbgogICAvLyBmcm9tIHdoaWNoIGl0IHNob3VsZCBiZSBpbnN0YW50aWF0ZWQuCiAKLSAgLy8gQ29uc3VtZWRBcmdzIC0gQSB2YXJpYWJsZSBzaXplIGFycmF5LCBmb2xsb3dpbmcgRXhjZXB0aW9ucwotICAvLyBhbmQgb2YgbGVuZ3RoIE51bUFyZ3MsIGhvbGRpbmcgZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBhcmd1bWVudHMKLSAgLy8gYXJlIGNvbnN1bWVkLiAgVGhpcyBvbmx5IGFwcGVhcnMgaWYgSGFzQW55Q29uc3VtZWRBcmdzIGlzIHRydWUuCisgIC8vIENvbnN1bWVkUGFyYW1ldGVycyAtIEEgdmFyaWFibGUgc2l6ZSBhcnJheSwgZm9sbG93aW5nIEV4Y2VwdGlvbnMKKyAgLy8gYW5kIG9mIGxlbmd0aCBOdW1QYXJhbXMsIGhvbGRpbmcgZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBwYXJhbWV0ZXJzCisgIC8vIGFyZSBjb25zdW1lZC4gIFRoaXMgb25seSBhcHBlYXJzIGlmIEhhc0FueUNvbnN1bWVkUGFyYW1zIGlzIHRydWUuCiAKICAgZnJpZW5kIGNsYXNzIEFTVENvbnRleHQ7ICAvLyBBU1RDb250ZXh0IGNyZWF0ZXMgdGhlc2UuCiAKLSAgY29uc3QgYm9vbCAqZ2V0Q29uc3VtZWRBcmdzQnVmZmVyKCkgY29uc3QgewotICAgIGFzc2VydChoYXNBbnlDb25zdW1lZEFyZ3MoKSk7CisgIGNvbnN0IGJvb2wgKmdldENvbnN1bWVkUGFyYW1zQnVmZmVyKCkgY29uc3QgeworICAgIGFzc2VydChoYXNBbnlDb25zdW1lZFBhcmFtcygpKTsKIAogICAgIC8vIEZpbmQgdGhlIGVuZCBvZiB0aGUgZXhjZXB0aW9ucy4KLSAgICBFeHByICogY29uc3QgKmVoX2VuZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqIGNvbnN0ICo+KGFyZ190eXBlX2VuZCgpKTsKKyAgICBFeHByICpjb25zdCAqZWhfZW5kID0gcmVpbnRlcnByZXRfY2FzdDxFeHByICpjb25zdCAqPihwYXJhbV90eXBlX2VuZCgpKTsKICAgICBpZiAoZ2V0RXhjZXB0aW9uU3BlY1R5cGUoKSAhPSBFU1RfQ29tcHV0ZWROb2V4Y2VwdCkKICAgICAgIGVoX2VuZCArPSBOdW1FeGNlcHRpb25zOwogICAgIGVsc2UKQEAgLTI5MjYsMTMgKzI5NDUsMTMgQEAKICAgfQogCiBwdWJsaWM6Ci0gIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzOyB9Ci0gIFF1YWxUeXBlIGdldEFyZ1R5cGUodW5zaWduZWQgaSkgY29uc3QgewotICAgIGFzc2VydChpIDwgTnVtQXJncyAmJiAiSW52YWxpZCBhcmd1bWVudCBudW1iZXIhIik7Ci0gICAgcmV0dXJuIGFyZ190eXBlX2JlZ2luKClbaV07CisgIHVuc2lnbmVkIGdldE51bVBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIE51bVBhcmFtczsgfQorICBRdWFsVHlwZSBnZXRQYXJhbVR5cGUodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgTnVtUGFyYW1zICYmICJpbnZhbGlkIHBhcmFtZXRlciBpbmRleCIpOworICAgIHJldHVybiBwYXJhbV90eXBlX2JlZ2luKClbaV07CiAgIH0KLSAgQXJyYXlSZWY8UXVhbFR5cGU+IGdldEFyZ1R5cGVzKCkgY29uc3QgewotICAgIHJldHVybiBBcnJheVJlZjxRdWFsVHlwZT4oYXJnX3R5cGVfYmVnaW4oKSwgYXJnX3R5cGVfZW5kKCkpOworICBBcnJheVJlZjxRdWFsVHlwZT4gZ2V0UGFyYW1UeXBlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQXJyYXlSZWY8UXVhbFR5cGU+KHBhcmFtX3R5cGVfYmVnaW4oKSwgcGFyYW1fdHlwZV9lbmQoKSk7CiAgIH0KIAogICBFeHRQcm90b0luZm8gZ2V0RXh0UHJvdG9JbmZvKCkgY29uc3QgewpAQCAtMjk1NCw4ICsyOTczLDggQEAKICAgICB9IGVsc2UgaWYgKEVQSS5FeGNlcHRpb25TcGVjVHlwZSA9PSBFU1RfVW5ldmFsdWF0ZWQpIHsKICAgICAgIEVQSS5FeGNlcHRpb25TcGVjRGVjbCA9IGdldEV4Y2VwdGlvblNwZWNEZWNsKCk7CiAgICAgfQotICAgIGlmIChoYXNBbnlDb25zdW1lZEFyZ3MoKSkKLSAgICAgIEVQSS5Db25zdW1lZEFyZ3VtZW50cyA9IGdldENvbnN1bWVkQXJnc0J1ZmZlcigpOworICAgIGlmIChoYXNBbnlDb25zdW1lZFBhcmFtcygpKQorICAgICAgRVBJLkNvbnN1bWVkUGFyYW1ldGVycyA9IGdldENvbnN1bWVkUGFyYW1zQnVmZmVyKCk7CiAgICAgcmV0dXJuIEVQSTsKICAgfQogCkBAIC0yOTk0LDcgKzMwMTMsNyBAQAogICAgIGlmIChnZXRFeGNlcHRpb25TcGVjVHlwZSgpICE9IEVTVF9Db21wdXRlZE5vZXhjZXB0KQogICAgICAgcmV0dXJuIDA7CiAgICAgLy8gTm9leGNlcHRFeHByIHNpdHMgd2hlcmUgdGhlIGFyZ3VtZW50cyBlbmQuCi0gICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEV4cHIgKmNvbnN0ICo+KGFyZ190eXBlX2VuZCgpKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqY29uc3QgKj4ocGFyYW1fdHlwZV9lbmQoKSk7CiAgIH0KICAgLy8vIFxicmllZiBJZiB0aGlzIGZ1bmN0aW9uIHR5cGUgaGFzIGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHdoaWNoIGhhc24ndAogICAvLy8gYmVlbiBkZXRlcm1pbmVkIHlldCAoZWl0aGVyIGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIGV2YWx1YXRlZCBvciBiZWNhdXNlCkBAIC0zMDA0LDcgKzMwMjMsNyBAQAogICAgIGlmIChnZXRFeGNlcHRpb25TcGVjVHlwZSgpICE9IEVTVF9Vbmluc3RhbnRpYXRlZCAmJgogICAgICAgICBnZXRFeGNlcHRpb25TcGVjVHlwZSgpICE9IEVTVF9VbmV2YWx1YXRlZCkKICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZ1bmN0aW9uRGVjbCAqIGNvbnN0ICo+KGFyZ190eXBlX2VuZCgpKVswXTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGdW5jdGlvbkRlY2wgKmNvbnN0ICo+KHBhcmFtX3R5cGVfZW5kKCkpWzBdOwogICB9CiAgIC8vLyBcYnJpZWYgSWYgdGhpcyBmdW5jdGlvbiB0eXBlIGhhcyBhbiB1bmluc3RhbnRpYXRlZCBleGNlcHRpb24KICAgLy8vIHNwZWNpZmljYXRpb24sIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHdob3NlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uCkBAIC0zMDEzLDE3ICszMDMyLDEyIEBACiAgIEZ1bmN0aW9uRGVjbCAqZ2V0RXhjZXB0aW9uU3BlY1RlbXBsYXRlKCkgY29uc3QgewogICAgIGlmIChnZXRFeGNlcHRpb25TcGVjVHlwZSgpICE9IEVTVF9Vbmluc3RhbnRpYXRlZCkKICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZ1bmN0aW9uRGVjbCAqIGNvbnN0ICo+KGFyZ190eXBlX2VuZCgpKVsxXTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGdW5jdGlvbkRlY2wgKmNvbnN0ICo+KHBhcmFtX3R5cGVfZW5kKCkpWzFdOwogICB9Ci0gIGJvb2wgaXNOb3Rocm93KGNvbnN0IEFTVENvbnRleHQgJkN0eCkgY29uc3QgewotICAgIEV4Y2VwdGlvblNwZWNpZmljYXRpb25UeXBlIEVTVCA9IGdldEV4Y2VwdGlvblNwZWNUeXBlKCk7Ci0gICAgYXNzZXJ0KEVTVCAhPSBFU1RfVW5ldmFsdWF0ZWQgJiYgRVNUICE9IEVTVF9Vbmluc3RhbnRpYXRlZCk7Ci0gICAgaWYgKEVTVCA9PSBFU1RfRHluYW1pY05vbmUgfHwgRVNUID09IEVTVF9CYXNpY05vZXhjZXB0KQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKEVTVCAhPSBFU1RfQ29tcHV0ZWROb2V4Y2VwdCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gZ2V0Tm9leGNlcHRTcGVjKEN0eCkgPT0gTlJfTm90aHJvdzsKLSAgfQorICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gdHlwZSBoYXMgYSBub24tdGhyb3dpbmcgZXhjZXB0aW9uCisgIC8vLyBzcGVjaWZpY2F0aW9uLiBJZiB0aGlzIGRlcGVuZHMgb24gdGVtcGxhdGUgYXJndW1lbnRzLCByZXR1cm5zCisgIC8vLyBcYyBSZXN1bHRJZkRlcGVuZGVudC4KKyAgYm9vbCBpc05vdGhyb3coY29uc3QgQVNUQ29udGV4dCAmQ3R4LCBib29sIFJlc3VsdElmRGVwZW5kZW50ID0gZmFsc2UpIGNvbnN0OwogCiAgIGJvb2wgaXNWYXJpYWRpYygpIGNvbnN0IHsgcmV0dXJuIFZhcmlhZGljOyB9CiAKQEAgLTMwNDUsMTYgKzMwNTksMjggQEAKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVmUXVhbGlmaWVyS2luZD4oUmVmUXVhbGlmaWVyKTsKICAgfQogCi0gIHR5cGVkZWYgY29uc3QgUXVhbFR5cGUgKmFyZ190eXBlX2l0ZXJhdG9yOwotICBhcmdfdHlwZV9pdGVyYXRvciBhcmdfdHlwZV9iZWdpbigpIGNvbnN0IHsKKyAgdHlwZWRlZiBjb25zdCBRdWFsVHlwZSAqcGFyYW1fdHlwZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxwYXJhbV90eXBlX2l0ZXJhdG9yPiBwYXJhbV90eXBlX3JhbmdlOworCisgIHBhcmFtX3R5cGVfcmFuZ2UgcGFyYW1fdHlwZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtX3R5cGVfcmFuZ2UocGFyYW1fdHlwZV9iZWdpbigpLCBwYXJhbV90eXBlX2VuZCgpKTsKKyAgfQorICBwYXJhbV90eXBlX2l0ZXJhdG9yIHBhcmFtX3R5cGVfYmVnaW4oKSBjb25zdCB7CiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUXVhbFR5cGUgKj4odGhpcysxKTsKICAgfQotICBhcmdfdHlwZV9pdGVyYXRvciBhcmdfdHlwZV9lbmQoKSBjb25zdCB7IHJldHVybiBhcmdfdHlwZV9iZWdpbigpK051bUFyZ3M7IH0KKyAgcGFyYW1fdHlwZV9pdGVyYXRvciBwYXJhbV90eXBlX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcGFyYW1fdHlwZV9iZWdpbigpICsgTnVtUGFyYW1zOworICB9CiAKICAgdHlwZWRlZiBjb25zdCBRdWFsVHlwZSAqZXhjZXB0aW9uX2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPGV4Y2VwdGlvbl9pdGVyYXRvcj4gZXhjZXB0aW9uX3JhbmdlOworCisgIGV4Y2VwdGlvbl9yYW5nZSBleGNlcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBleGNlcHRpb25fcmFuZ2UoZXhjZXB0aW9uX2JlZ2luKCksIGV4Y2VwdGlvbl9lbmQoKSk7CisgIH0KICAgZXhjZXB0aW9uX2l0ZXJhdG9yIGV4Y2VwdGlvbl9iZWdpbigpIGNvbnN0IHsKICAgICAvLyBleGNlcHRpb25zIGJlZ2luIHdoZXJlIGFyZ3VtZW50cyBlbmQKLSAgICByZXR1cm4gYXJnX3R5cGVfZW5kKCk7CisgICAgcmV0dXJuIHBhcmFtX3R5cGVfZW5kKCk7CiAgIH0KICAgZXhjZXB0aW9uX2l0ZXJhdG9yIGV4Y2VwdGlvbl9lbmQoKSBjb25zdCB7CiAgICAgaWYgKGdldEV4Y2VwdGlvblNwZWNUeXBlKCkgIT0gRVNUX0R5bmFtaWMpCkBAIC0zMDYyLDEzICszMDg4LDExIEBACiAgICAgcmV0dXJuIGV4Y2VwdGlvbl9iZWdpbigpICsgTnVtRXhjZXB0aW9uczsKICAgfQogCi0gIGJvb2wgaGFzQW55Q29uc3VtZWRBcmdzKCkgY29uc3QgewotICAgIHJldHVybiBIYXNBbnlDb25zdW1lZEFyZ3M7Ci0gIH0KLSAgYm9vbCBpc0FyZ0NvbnN1bWVkKHVuc2lnbmVkIEkpIGNvbnN0IHsKLSAgICBhc3NlcnQoSSA8IGdldE51bUFyZ3MoKSAmJiAiYXJndW1lbnQgaW5kZXggb3V0IG9mIHJhbmdlISIpOwotICAgIGlmIChoYXNBbnlDb25zdW1lZEFyZ3MoKSkKLSAgICAgIHJldHVybiBnZXRDb25zdW1lZEFyZ3NCdWZmZXIoKVtJXTsKKyAgYm9vbCBoYXNBbnlDb25zdW1lZFBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIEhhc0FueUNvbnN1bWVkUGFyYW1zOyB9CisgIGJvb2wgaXNQYXJhbUNvbnN1bWVkKHVuc2lnbmVkIEkpIGNvbnN0IHsKKyAgICBhc3NlcnQoSSA8IGdldE51bVBhcmFtcygpICYmICJwYXJhbWV0ZXIgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgaWYgKGhhc0FueUNvbnN1bWVkUGFyYW1zKCkpCisgICAgICByZXR1cm4gZ2V0Q29uc3VtZWRQYXJhbXNCdWZmZXIoKVtJXTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIApAQCAtMzA4NCw3ICszMTA4LDcgQEAKIAogICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIGNvbnN0IEFTVENvbnRleHQgJkN0eCk7CiAgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsIFF1YWxUeXBlIFJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICBhcmdfdHlwZV9pdGVyYXRvciBBcmdUeXMsIHVuc2lnbmVkIE51bUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fdHlwZV9pdGVyYXRvciBBcmdUeXMsIHVuc2lnbmVkIE51bUFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0UHJvdG9JbmZvICZFUEksIGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQpOwogfTsKIApAQCAtNDMyNiw3ICs0MzUwLDkgQEAKICAgT2JqQ0ludGVyZmFjZURlY2wgKmdldEludGVyZmFjZSgpIGNvbnN0OwogCiAgIHR5cGVkZWYgT2JqQ1Byb3RvY29sRGVjbCAqIGNvbnN0ICpxdWFsX2l0ZXJhdG9yOworICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPHF1YWxfaXRlcmF0b3I+IHF1YWxfcmFuZ2U7CiAKKyAgcXVhbF9yYW5nZSBxdWFscygpIGNvbnN0IHsgcmV0dXJuIHF1YWxfcmFuZ2UocXVhbF9iZWdpbigpLCBxdWFsX2VuZCgpKTsgfQogICBxdWFsX2l0ZXJhdG9yIHF1YWxfYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRQcm90b2NvbFN0b3JhZ2UoKTsgfQogICBxdWFsX2l0ZXJhdG9yIHF1YWxfZW5kKCkgY29uc3QgeyByZXR1cm4gcXVhbF9iZWdpbigpICsgZ2V0TnVtUHJvdG9jb2xzKCk7IH0KIApAQCAtNDUyOCw3ICs0NTU0LDkgQEAKICAgLy8vIGZvciBjb252ZW5pZW5jZS4gIFRoaXMgd2lsbCBhbHdheXMgaXRlcmF0ZSBvdmVyIHRoZSBmdWxsIHNldCBvZgogICAvLy8gcHJvdG9jb2xzIG9uIGEgdHlwZSwgbm90IGp1c3QgdGhvc2UgcHJvdmlkZWQgZGlyZWN0bHkuCiAgIHR5cGVkZWYgT2JqQ09iamVjdFR5cGU6OnF1YWxfaXRlcmF0b3IgcXVhbF9pdGVyYXRvcjsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxxdWFsX2l0ZXJhdG9yPiBxdWFsX3JhbmdlOwogCisgIHF1YWxfcmFuZ2UgcXVhbHMoKSBjb25zdCB7IHJldHVybiBxdWFsX3JhbmdlKHF1YWxfYmVnaW4oKSwgcXVhbF9lbmQoKSk7IH0KICAgcXVhbF9pdGVyYXRvciBxdWFsX2JlZ2luKCkgY29uc3QgewogICAgIHJldHVybiBnZXRPYmplY3RUeXBlKCktPnF1YWxfYmVnaW4oKTsKICAgfQpAQCAtNTE1OSwxMCArNTE4Nyw5IEBACiAKIC8vIEhlbHBlciBjbGFzcyB0ZW1wbGF0ZSB0aGF0IGlzIHVzZWQgYnkgVHlwZTo6Z2V0QXMgdG8gZW5zdXJlIHRoYXQgb25lIGRvZXMKIC8vIG5vdCB0cnkgdG8gbG9vayB0aHJvdWdoIGEgcXVhbGlmaWVkIHR5cGUgdG8gZ2V0IHRvIGFuIGFycmF5IHR5cGUuCi10ZW1wbGF0ZTx0eXBlbmFtZSBULAotICAgICAgICAgYm9vbCBpc0FycmF5VHlwZSA9IChsbHZtOjppc19zYW1lPFQsIEFycmF5VHlwZT46OnZhbHVlIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmlzX2Jhc2Vfb2Y8QXJyYXlUeXBlLCBUPjo6dmFsdWUpPgotc3RydWN0IEFycmF5VHlwZV9jYW5ub3RfYmVfdXNlZF93aXRoX2dldEFzIHsgfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGlzQXJyYXlUeXBlID0gKHN0ZDo6aXNfc2FtZTxULCBBcnJheVR5cGU+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPEFycmF5VHlwZSwgVD46OnZhbHVlKT4KK3N0cnVjdCBBcnJheVR5cGVfY2Fubm90X2JlX3VzZWRfd2l0aF9nZXRBcyB7fTsKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIHN0cnVjdCBBcnJheVR5cGVfY2Fubm90X2JlX3VzZWRfd2l0aF9nZXRBczxULCB0cnVlPjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGVMb2MuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGVMb2MuaAppbmRleCA4ZGRmYWM3Li5hNTRhZWU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlTG9jLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZUxvYy5oCkBAIC05NzgsMTIgKzk3OCwxMCBAQAogfQogCiAKLXN0cnVjdCBEZWNheWVkTG9jSW5mbyB7IH07IC8vIE5vdGhpbmcuCitzdHJ1Y3QgQWRqdXN0ZWRMb2NJbmZvIHsgfTsgLy8gTm90aGluZy4KIAotLy8vIFxicmllZiBXcmFwcGVyIGZvciBzb3VyY2UgaW5mbyBmb3IgcG9pbnRlcnMgZGVjYXllZCBmcm9tIGFycmF5cyBhbmQKLS8vLyBmdW5jdGlvbnMuCi1jbGFzcyBEZWNheWVkVHlwZUxvYyA6IHB1YmxpYyBDb25jcmV0ZVR5cGVMb2M8VW5xdWFsVHlwZUxvYywgRGVjYXllZFR5cGVMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjYXllZFR5cGUsIERlY2F5ZWRMb2NJbmZvPiB7CitjbGFzcyBBZGp1c3RlZFR5cGVMb2MgOiBwdWJsaWMgQ29uY3JldGVUeXBlTG9jPFVucXVhbFR5cGVMb2MsIEFkanVzdGVkVHlwZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqdXN0ZWRUeXBlLCBBZGp1c3RlZExvY0luZm8+IHsKIHB1YmxpYzoKICAgVHlwZUxvYyBnZXRPcmlnaW5hbExvYygpIGNvbnN0IHsKICAgICByZXR1cm4gZ2V0SW5uZXJUeXBlTG9jKCk7CkBAIC0xMDA0LDEyICsxMDAyLDE3IEBACiAgIH0KIAogICB1bnNpZ25lZCBnZXRMb2NhbERhdGFTaXplKCkgY29uc3QgewotICAgIC8vIHNpemVvZihEZWNheWVkTG9jSW5mbykgaXMgMSwgYnV0IHdlIGRvbid0IG5lZWQgaXRzIGFkZHJlc3MgdG8gYmUgdW5pcXVlCisgICAgLy8gc2l6ZW9mKEFkanVzdGVkTG9jSW5mbykgaXMgMSwgYnV0IHdlIGRvbid0IG5lZWQgaXRzIGFkZHJlc3MgdG8gYmUgdW5pcXVlCiAgICAgLy8gYW55d2F5LiAgVHlwZUxvY0J1aWxkZXIgY2FuJ3QgaGFuZGxlIGRhdGEgc2l6ZXMgb2YgMS4KICAgICByZXR1cm4gMDsgIC8vIE5vIGRhdGEuCiAgIH0KIH07CiAKKy8vLyBcYnJpZWYgV3JhcHBlciBmb3Igc291cmNlIGluZm8gZm9yIHBvaW50ZXJzIGRlY2F5ZWQgZnJvbSBhcnJheXMgYW5kCisvLy8gZnVuY3Rpb25zLgorY2xhc3MgRGVjYXllZFR5cGVMb2MgOiBwdWJsaWMgSW5oZXJpdGluZ0NvbmNyZXRlVHlwZUxvYzwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkanVzdGVkVHlwZUxvYywgRGVjYXllZFR5cGVMb2MsIERlY2F5ZWRUeXBlPiB7Cit9OwogCiBzdHJ1Y3QgUG9pbnRlckxpa2VMb2NJbmZvIHsKICAgU291cmNlTG9jYXRpb24gU3RhckxvYzsKQEAgLTEyMDUsMjMgKzEyMDgsMjMgQEAKICAgfQogCiAgIEFycmF5UmVmPFBhcm1WYXJEZWNsICo+IGdldFBhcmFtcygpIGNvbnN0IHsKLSAgICByZXR1cm4gQXJyYXlSZWY8UGFybVZhckRlY2wgKj4oZ2V0UGFybUFycmF5KCksIGdldE51bUFyZ3MoKSk7CisgICAgcmV0dXJuIEFycmF5UmVmPFBhcm1WYXJEZWNsICo+KGdldFBhcm1BcnJheSgpLCBnZXROdW1QYXJhbXMoKSk7CiAgIH0KIAotICAvLyBQYXJtVmFyRGVjbHMqIGFyZSBzdG9yZWQgYWZ0ZXIgSW5mbywgb25lIGZvciBlYWNoIGFyZ3VtZW50LgorICAvLyBQYXJtVmFyRGVjbHMqIGFyZSBzdG9yZWQgYWZ0ZXIgSW5mbywgb25lIGZvciBlYWNoIHBhcmFtZXRlci4KICAgUGFybVZhckRlY2wgKipnZXRQYXJtQXJyYXkoKSBjb25zdCB7CiAgICAgcmV0dXJuIChQYXJtVmFyRGVjbCoqKSBnZXRFeHRyYUxvY2FsRGF0YSgpOwogICB9CiAKLSAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IHsKKyAgdW5zaWduZWQgZ2V0TnVtUGFyYW1zKCkgY29uc3QgewogICAgIGlmIChpc2E8RnVuY3Rpb25Ob1Byb3RvVHlwZT4oZ2V0VHlwZVB0cigpKSkKICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihnZXRUeXBlUHRyKCkpLT5nZXROdW1BcmdzKCk7CisgICAgcmV0dXJuIGNhc3Q8RnVuY3Rpb25Qcm90b1R5cGU+KGdldFR5cGVQdHIoKSktPmdldE51bVBhcmFtcygpOwogICB9Ci0gIFBhcm1WYXJEZWNsICpnZXRBcmcodW5zaWduZWQgaSkgY29uc3QgeyByZXR1cm4gZ2V0UGFybUFycmF5KClbaV07IH0KLSAgdm9pZCBzZXRBcmcodW5zaWduZWQgaSwgUGFybVZhckRlY2wgKlZEKSB7IGdldFBhcm1BcnJheSgpW2ldID0gVkQ7IH0KKyAgUGFybVZhckRlY2wgKmdldFBhcmFtKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIGdldFBhcm1BcnJheSgpW2ldOyB9CisgIHZvaWQgc2V0UGFyYW0odW5zaWduZWQgaSwgUGFybVZhckRlY2wgKlZEKSB7IGdldFBhcm1BcnJheSgpW2ldID0gVkQ7IH0KIAotICBUeXBlTG9jIGdldFJlc3VsdExvYygpIGNvbnN0IHsKKyAgVHlwZUxvYyBnZXRSZXR1cm5Mb2MoKSBjb25zdCB7CiAgICAgcmV0dXJuIGdldElubmVyVHlwZUxvYygpOwogICB9CiAKQEAgLTEyMzQsMjEgKzEyMzcsMjEgQEAKICAgICBzZXRMUGFyZW5Mb2MoTG9jKTsKICAgICBzZXRSUGFyZW5Mb2MoTG9jKTsKICAgICBzZXRMb2NhbFJhbmdlRW5kKExvYyk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bUFyZ3MoKTsgaSAhPSBlOyArK2kpCi0gICAgICBzZXRBcmcoaSwgTlVMTCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bVBhcmFtcygpOyBpICE9IGU7ICsraSkKKyAgICAgIHNldFBhcmFtKGksIE5VTEwpOwogICB9CiAKICAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSB0eXBlIHNvdXJjZSBpbmZvIGRhdGEgYmxvY2sgdGhhdCBpcwogICAvLy8gc3BlY2lmaWMgdG8gdGhpcyB0eXBlLgogICB1bnNpZ25lZCBnZXRFeHRyYUxvY2FsRGF0YVNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGdldE51bUFyZ3MoKSAqIHNpemVvZihQYXJtVmFyRGVjbCopOworICAgIHJldHVybiBnZXROdW1QYXJhbXMoKSAqIHNpemVvZihQYXJtVmFyRGVjbCAqKTsKICAgfQogCiAgIHVuc2lnbmVkIGdldEV4dHJhTG9jYWxEYXRhQWxpZ25tZW50KCkgY29uc3QgewogICAgIHJldHVybiBsbHZtOjphbGlnbk9mPFBhcm1WYXJEZWNsKj4oKTsKICAgfQogCi0gIFF1YWxUeXBlIGdldElubmVyVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVQdHIoKS0+Z2V0UmVzdWx0VHlwZSgpOyB9CisgIFF1YWxUeXBlIGdldElubmVyVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVQdHIoKS0+Z2V0UmV0dXJuVHlwZSgpOyB9CiB9OwogCiBjbGFzcyBGdW5jdGlvblByb3RvVHlwZUxvYyA6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlTm9kZXMuZGVmIGIvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZU5vZGVzLmRlZgppbmRleCAzMTI2ZjQ4Li4zYjI2NjViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVC9UeXBlTm9kZXMuZGVmCisrKyBiL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGVOb2Rlcy5kZWYKQEAgLTgxLDcgKzgxLDggQEAKIERFUEVOREVOVF9UWVBFKFVucmVzb2x2ZWRVc2luZywgVHlwZSkKIE5PTl9DQU5PTklDQUxfVFlQRShQYXJlbiwgVHlwZSkKIE5PTl9DQU5PTklDQUxfVFlQRShUeXBlZGVmLCBUeXBlKQotTk9OX0NBTk9OSUNBTF9UWVBFKERlY2F5ZWQsIFR5cGUpCitOT05fQ0FOT05JQ0FMX1RZUEUoQWRqdXN0ZWQsIFR5cGUpCitOT05fQ0FOT05JQ0FMX1RZUEUoRGVjYXllZCwgQWRqdXN0ZWRUeXBlKQogTk9OX0NBTk9OSUNBTF9VTkxFU1NfREVQRU5ERU5UX1RZUEUoVHlwZU9mRXhwciwgVHlwZSkKIE5PTl9DQU5PTklDQUxfVU5MRVNTX0RFUEVOREVOVF9UWVBFKFR5cGVPZiwgVHlwZSkKIE5PTl9DQU5PTklDQUxfVU5MRVNTX0RFUEVOREVOVF9UWVBFKERlY2x0eXBlLCBUeXBlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1QvVlRhYmxlQnVpbGRlci5oIGIvaW5jbHVkZS9jbGFuZy9BU1QvVlRhYmxlQnVpbGRlci5oCmluZGV4IDRlNDUxMzIuLjAyMTMyZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL1ZUYWJsZUJ1aWxkZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVC9WVGFibGVCdWlsZGVyLmgKQEAgLTE5LDggKzE5LDkgQEAKICNpbmNsdWRlICJjbGFuZy9BU1QvR2xvYmFsRGVjbC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9SZWNvcmRMYXlvdXQuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9BQkkuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgotI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CkBAIC0yMDgsMTEgKzIwOSwxMSBAQAogICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPEJhc2VTdWJvYmplY3QsIHVpbnQ2NF90PiBBZGRyZXNzUG9pbnRzTWFwVHk7CiBwcml2YXRlOgogICB1aW50NjRfdCBOdW1WVGFibGVDb21wb25lbnRzOwotICBsbHZtOjpPd25pbmdBcnJheVB0cjxWVGFibGVDb21wb25lbnQ+IFZUYWJsZUNvbXBvbmVudHM7CisgIHN0ZDo6dW5pcXVlX3B0cjxWVGFibGVDb21wb25lbnRbXT4gVlRhYmxlQ29tcG9uZW50czsKIAogICAvLy8gXGJyaWVmIENvbnRhaW5zIHRodW5rcyBuZWVkZWQgYnkgdnRhYmxlcywgc29ydGVkIGJ5IGluZGljZXMuCiAgIHVpbnQ2NF90IE51bVZUYWJsZVRodW5rczsKLSAgbGx2bTo6T3duaW5nQXJyYXlQdHI8VlRhYmxlVGh1bmtUeT4gVlRhYmxlVGh1bmtzOworICBzdGQ6OnVuaXF1ZV9wdHI8VlRhYmxlVGh1bmtUeVtdPiBWVGFibGVUaHVua3M7CiAKICAgLy8vIFxicmllZiBBZGRyZXNzIHBvaW50cyBmb3IgYWxsIHZ0YWJsZXMuCiAgIEFkZHJlc3NQb2ludHNNYXBUeSBBZGRyZXNzUG9pbnRzOwpAQCAtMjcwLDYgKzI3MSwxMCBAQAogcHVibGljOgogICB0eXBlZGVmIFNtYWxsVmVjdG9yPFRodW5rSW5mbywgMT4gVGh1bmtJbmZvVmVjdG9yVHk7CiAKKyAgYm9vbCBpc01pY3Jvc29mdCgpIGNvbnN0IHsgcmV0dXJuIElzTWljcm9zb2Z0QUJJOyB9CisKKyAgdmlydHVhbCB+VlRhYmxlQ29udGV4dEJhc2UoKSB7fQorCiBwcm90ZWN0ZWQ6CiAgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYTWV0aG9kRGVjbCAqLCBUaHVua0luZm9WZWN0b3JUeT4gVGh1bmtzTWFwVHk7CiAKQEAgLTI4MCw3ICsyODUsNyBAQAogICAvLy8gb2Zmc2V0IG9mZnNldHMsIHRodW5rcyBldGMpIGZvciB0aGUgZ2l2ZW4gcmVjb3JkIGRlY2wuCiAgIHZpcnR1YWwgdm9pZCBjb21wdXRlVlRhYmxlUmVsYXRlZEluZm9ybWF0aW9uKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSA9IDA7CiAKLSAgdmlydHVhbCB+VlRhYmxlQ29udGV4dEJhc2UoKSB7fQorICBWVGFibGVDb250ZXh0QmFzZShib29sIE1TKSA6IElzTWljcm9zb2Z0QUJJKE1TKSB7fQogCiBwdWJsaWM6CiAgIHZpcnR1YWwgY29uc3QgVGh1bmtJbmZvVmVjdG9yVHkgKmdldFRodW5rSW5mbyhHbG9iYWxEZWNsIEdEKSB7CkBAIC0yOTcsMTEgKzMwMiwxMiBAQAogCiAgICAgcmV0dXJuICZJLT5zZWNvbmQ7CiAgIH0KKworICBib29sIElzTWljcm9zb2Z0QUJJOwogfTsKIAogY2xhc3MgSXRhbml1bVZUYWJsZUNvbnRleHQgOiBwdWJsaWMgVlRhYmxlQ29udGV4dEJhc2UgewogcHJpdmF0ZToKLSAgYm9vbCBJc01pY3Jvc29mdEFCSTsKIAogICAvLy8gXGJyaWVmIENvbnRhaW5zIHRoZSBpbmRleCAocmVsYXRpdmUgdG8gdGhlIHZ0YWJsZSBhZGRyZXNzIHBvaW50KQogICAvLy8gd2hlcmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGEgdmlydHVhbCBmdW5jdGlvbiBpcyBzdG9yZWQuCkBAIC0zMjMsNyArMzI5LDcgQEAKICAgICBWaXJ0dWFsQmFzZUNsYXNzT2Zmc2V0T2Zmc2V0c01hcFR5OwogICBWaXJ0dWFsQmFzZUNsYXNzT2Zmc2V0T2Zmc2V0c01hcFR5IFZpcnR1YWxCYXNlQ2xhc3NPZmZzZXRPZmZzZXRzOwogCi0gIHZvaWQgY29tcHV0ZVZUYWJsZVJlbGF0ZWRJbmZvcm1hdGlvbihjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7CisgIHZvaWQgY29tcHV0ZVZUYWJsZVJlbGF0ZWRJbmZvcm1hdGlvbihjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgb3ZlcnJpZGU7CiAKIHB1YmxpYzoKICAgSXRhbml1bVZUYWJsZUNvbnRleHQoQVNUQ29udGV4dCAmQ29udGV4dCk7CkBAIC0zNTUsNDkgKzM2MSw4MyBAQAogICAvLy8gQmFzZSBtdXN0IGJlIGEgdmlydHVhbCBiYXNlIGNsYXNzIG9yIGFuIHVuYW1iaWd1b3VzIGJhc2UuCiAgIENoYXJVbml0cyBnZXRWaXJ0dWFsQmFzZU9mZnNldE9mZnNldChjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlZCYXNlKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZUYWJsZUNvbnRleHRCYXNlICpWVCkgeworICAgIHJldHVybiAhVlQtPmlzTWljcm9zb2Z0KCk7CisgIH0KIH07CiAKLXN0cnVjdCBWRlB0ckluZm8geworLy8vIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbmhlcml0YW5jZSBwYXRoIHRvIGEgdmlydHVhbCBiYXNlIG9yIGZ1bmN0aW9uCisvLy8gdGFibGUgcG9pbnRlci4gIEEgcmVjb3JkIG1heSBjb250YWluIGFzIG1hbnkgdmZwdHJzIG9yIHZicHRycyBhcyB0aGVyZSBhcmUKKy8vLyBiYXNlIHN1Ym9iamVjdHMuCitzdHJ1Y3QgVlB0ckluZm8gewogICB0eXBlZGVmIFNtYWxsVmVjdG9yPGNvbnN0IENYWFJlY29yZERlY2wgKiwgMT4gQmFzZVBhdGg7CiAKLSAgLy8gRG9uJ3QgcGFzcyB0aGUgUGF0aFRvTWFuZ2xlIGFzIGl0IHNob3VsZCBiZSBjYWxjdWxhdGVkIGxhdGVyLgotICBWRlB0ckluZm8oQ2hhclVuaXRzIFZGUHRyT2Zmc2V0LCBjb25zdCBCYXNlUGF0aCAmUGF0aFRvQmFzZVdpdGhWRlB0cikKLSAgICAgIDogVkJUYWJsZUluZGV4KDApLCBMYXN0VkJhc2UoMCksIFZGUHRyT2Zmc2V0KFZGUHRyT2Zmc2V0KSwKLSAgICAgICAgUGF0aFRvQmFzZVdpdGhWRlB0cihQYXRoVG9CYXNlV2l0aFZGUHRyKSwgVkZQdHJGdWxsT2Zmc2V0KFZGUHRyT2Zmc2V0KSB7Ci0gIH0KKyAgVlB0ckluZm8oY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpCisgICAgICA6IFJldXNpbmdCYXNlKFJEKSwgQmFzZVdpdGhWUHRyKFJEKSwgTmV4dEJhc2VUb01hbmdsZShSRCkge30KIAotICAvLyBEb24ndCBwYXNzIHRoZSBQYXRoVG9NYW5nbGUgYXMgaXQgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgbGF0ZXIuCi0gIFZGUHRySW5mbyh1aW50NjRfdCBWQlRhYmxlSW5kZXgsIGNvbnN0IENYWFJlY29yZERlY2wgKkxhc3RWQmFzZSwKLSAgICAgICAgICAgIENoYXJVbml0cyBWRlB0ck9mZnNldCwgY29uc3QgQmFzZVBhdGggJlBhdGhUb0Jhc2VXaXRoVkZQdHIsCi0gICAgICAgICAgICBDaGFyVW5pdHMgVkZQdHJGdWxsT2Zmc2V0KQotICAgICAgOiBWQlRhYmxlSW5kZXgoVkJUYWJsZUluZGV4KSwgTGFzdFZCYXNlKExhc3RWQmFzZSksCi0gICAgICAgIFZGUHRyT2Zmc2V0KFZGUHRyT2Zmc2V0KSwgUGF0aFRvQmFzZVdpdGhWRlB0cihQYXRoVG9CYXNlV2l0aFZGUHRyKSwKLSAgICAgICAgVkZQdHJGdWxsT2Zmc2V0KFZGUHRyRnVsbE9mZnNldCkgewotICAgIGFzc2VydChWQlRhYmxlSW5kZXggJiYgIlRoZSBmdWxsIGNvbnN0cnVjdG9yIHNob3VsZCBvbmx5IGJlIHVzZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciB2ZnB0cnMgaW4gdmlydHVhbCBiYXNlcyIpOwotICAgIGFzc2VydChMYXN0VkJhc2UpOwotICB9CisgIC8vIENvcHkgY29uc3RydWN0b3IuCisgIC8vIEZJWE1FOiBVbmNvbW1lbnQgd2hlbiB3ZSd2ZSBtb3ZlZCB0byBDKysxMS4KKyAgLy8gVlB0ckluZm8oY29uc3QgVlB0ckluZm8gJikgPSBkZWZhdWx0OwogCi0gIC8vLyBJZiBub256ZXJvLCBob2xkcyB0aGUgdmJ0YWJsZSBpbmRleCBvZiB0aGUgdmlydHVhbCBiYXNlIHdpdGggdGhlIHZmcHRyLgotICB1aW50NjRfdCBWQlRhYmxlSW5kZXg7CisgIC8vLyBUaGUgdnRhYmxlIHdpbGwgaG9sZCBhbGwgb2YgdGhlIHZpcnR1YWwgYmFzZXMgb3IgdmlydHVhbCBtZXRob2RzIG9mCisgIC8vLyBSZXVzaW5nQmFzZS4gIFRoaXMgbWF5IG9yIG1heSBub3QgYmUgdGhlIHNhbWUgY2xhc3MgYXMgVlB0clN1Ym9iamVjdC5CYXNlLgorICAvLy8gQSBkZXJpdmVkIGNsYXNzIHdpbGwgcmV1c2UgdGhlIHZwdHIgb2YgdGhlIGZpcnN0IG5vbi12aXJ0dWFsIGJhc2UKKyAgLy8vIHN1Ym9iamVjdCB0aGF0IGhhcyBvbmUuCisgIGNvbnN0IENYWFJlY29yZERlY2wgKlJldXNpbmdCYXNlOwogCi0gIC8vLyBTdG9yZXMgdGhlIGxhc3QgdmJhc2Ugb24gdGhlIHBhdGggZnJvbSB0aGUgY29tcGxldGUgdHlwZSB0byB0aGUgdmZwdHIuCi0gIGNvbnN0IENYWFJlY29yZERlY2wgKkxhc3RWQmFzZTsKKyAgLy8vIEJhc2VXaXRoVlB0ciBpcyBhdCB0aGlzIG9mZnNldCBmcm9tIGl0cyBjb250YWluaW5nIGNvbXBsZXRlIG9iamVjdCBvcgorICAvLy8gdmlydHVhbCBiYXNlLgorICBDaGFyVW5pdHMgTm9uVmlydHVhbE9mZnNldDsKIAotICAvLy8gVGhpcyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSB2ZnB0ciBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbGFzdCB2YmFzZSwKLSAgLy8vIG9yIHRoZSBjb21wbGV0ZSB0eXBlIGlmIHRoZXJlIGFyZSBubyB2aXJ0dWFsIGJhc2VzLgotICBDaGFyVW5pdHMgVkZQdHJPZmZzZXQ7CisgIC8vLyBUaGUgdnB0ciBpcyBzdG9yZWQgaW5zaWRlIHRoaXMgc3Vib2JqZWN0LgorICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlV2l0aFZQdHI7CisKKyAgLy8vIFRoZSBiYXNlcyBmcm9tIHRoZSBpbmhlcml0YW5jZSBwYXRoIHRoYXQgZ290IHVzZWQgdG8gbWFuZ2xlIHRoZSB2YnRhYmxlCisgIC8vLyBuYW1lLiAgVGhpcyBpcyBub3QgcmVhbGx5IGEgZnVsbCBwYXRoIGxpa2UgYSBDWFhCYXNlUGF0aC4gIEl0IGhvbGRzIHRoZQorICAvLy8gc3Vic2V0IG9mIHJlY29yZHMgdGhhdCBuZWVkIHRvIGJlIG1hbmdsZWQgaW50byB0aGUgdmJ0YWJsZSBzeW1ib2wgbmFtZSBpbgorICAvLy8gb3JkZXIgdG8gZ2V0IGEgdW5pcXVlIG5hbWUuCisgIEJhc2VQYXRoIE1hbmdsZWRQYXRoOworCisgIC8vLyBUaGUgbmV4dCBiYXNlIHRvIHB1c2ggb250byB0aGUgbWFuZ2xlZCBwYXRoIGlmIHRoaXMgcGF0aCBpcyBhbWJpZ3VvdXMgaW4gYQorICAvLy8gZGVyaXZlZCBjbGFzcy4gIElmIGl0J3MgbnVsbCwgdGhlbiBpdCdzIGFscmVhZHkgYmVlbiBwdXNoZWQgb250byB0aGUgcGF0aC4KKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTmV4dEJhc2VUb01hbmdsZTsKKworICAvLy8gVGhlIHNldCBvZiBwb3NzaWJseSBpbmRpcmVjdCB2YmFzZXMgdGhhdCBjb250YWluIHRoaXMgdmJ0YWJsZS4gIFdoZW4gYQorICAvLy8gZGVyaXZlZCBjbGFzcyBpbmRpcmVjdGx5IGluaGVyaXRzIGZyb20gdGhlIHNhbWUgdmJhc2UgdHdpY2UsIHdlIG9ubHkga2VlcAorICAvLy8gdnRhYmxlcyBhbmQgdGhlaXIgcGF0aHMgZnJvbSB0aGUgZmlyc3QgaW5zdGFuY2UuCisgIEJhc2VQYXRoIENvbnRhaW5pbmdWQmFzZXM7CiAKICAgLy8vIFRoaXMgaG9sZHMgdGhlIGJhc2UgY2xhc3NlcyBwYXRoIGZyb20gdGhlIGNvbXBsZXRlIHR5cGUgdG8gdGhlIGZpcnN0IGJhc2UKLSAgLy8vIHdpdGggdGhlIGdpdmVuIHZmcHRyIG9mZnNldCwgaW4gdGhlIGJhc2UtdG8tZGVyaXZlZCBvcmRlci4KLSAgQmFzZVBhdGggUGF0aFRvQmFzZVdpdGhWRlB0cjsKKyAgLy8vIHdpdGggdGhlIGdpdmVuIHZmcHRyIG9mZnNldCwgaW4gdGhlIGJhc2UtdG8tZGVyaXZlZCBvcmRlci4gIE9ubHkgdXNlZCBmb3IKKyAgLy8vIHZmdGFibGVzLgorICBCYXNlUGF0aCBQYXRoVG9CYXNlV2l0aFZQdHI7CiAKLSAgLy8vIFRoaXMgaG9sZHMgdGhlIHN1YnNldCBvZiByZWNvcmRzIHRoYXQgbmVlZCB0byBiZSBtYW5nbGVkIGludG8gdGhlIHZmdGFibGUKLSAgLy8vIHN5bWJvbCBuYW1lIGluIG9yZGVyIHRvIGdldCBhIHVuaXF1ZSBuYW1lLCBpbiB0aGUgZGVyaXZlZC10by1iYXNlIG9yZGVyLgotICBCYXNlUGF0aCBQYXRoVG9NYW5nbGU7CisgIC8vLyBTdGF0aWMgb2Zmc2V0IGZyb20gdGhlIHRvcCBvZiB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzIHRvIHRoaXMgdmZwdHIsCisgIC8vLyBpbmNsdWRpbmcgYW55IHZpcnR1YWwgYmFzZSBvZmZzZXQuICBPbmx5IHVzZWQgZm9yIHZmdGFibGVzLgorICBDaGFyVW5pdHMgRnVsbE9mZnNldEluTURDOwogCi0gIC8vLyBUaGlzIGlzIHRoZSBmdWxsIG9mZnNldCBvZiB0aGUgdmZwdHIgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGNvbXBsZXRlIHR5cGUuCi0gIENoYXJVbml0cyBWRlB0ckZ1bGxPZmZzZXQ7CisgIC8vLyBUaGUgdnB0ciBpcyBzdG9yZWQgaW5zaWRlIHRoZSBub24tdmlydHVhbCBjb21wb25lbnQgb2YgdGhpcyB2aXJ0dWFsIGJhc2UuCisgIGNvbnN0IENYWFJlY29yZERlY2wgKmdldFZCYXNlV2l0aFZQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnRhaW5pbmdWQmFzZXMuZW1wdHkoKSA/IDAgOiBDb250YWluaW5nVkJhc2VzLmZyb250KCk7CisgIH0KK307CisKK3R5cGVkZWYgU21hbGxWZWN0b3I8VlB0ckluZm8gKiwgMj4gVlB0ckluZm9WZWN0b3I7CisKKy8vLyBBbGwgdmlydHVhbCBiYXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBnaXZlbiByZWNvcmQgZGVjbC4gIEluY2x1ZGVzCisvLy8gaW5mb3JtYXRpb24gb24gYWxsIHZpcnR1YWwgYmFzZSB0YWJsZXMgYW5kIHRoZSBwYXRoIGNvbXBvbmVudHMgdGhhdCBhcmUgdXNlZAorLy8vIHRvIG1hbmdsZSB0aGVtLgorc3RydWN0IFZpcnR1YWxCYXNlSW5mbyB7CisgIH5WaXJ0dWFsQmFzZUluZm8oKSB7IGxsdm06OkRlbGV0ZUNvbnRhaW5lclBvaW50ZXJzKFZCUHRyUGF0aHMpOyB9CisKKyAgLy8vIEEgbWFwIGZyb20gdmlydHVhbCBiYXNlIHRvIHZidGFibGUgaW5kZXggZm9yIGRvaW5nIGEgY29udmVyc2lvbiBmcm9tIHRoZQorICAvLy8gdGhlIGRlcml2ZWQgY2xhc3MgdG8gdGhlIGEgYmFzZS4KKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCB1bnNpZ25lZD4gVkJUYWJsZUluZGljZXM7CisKKyAgLy8vIEluZm9ybWF0aW9uIG9uIGFsbCB2aXJ0dWFsIGJhc2UgdGFibGVzIHVzZWQgd2hlbiB0aGlzIHJlY29yZCBpcyB0aGUgbW9zdAorICAvLy8gZGVyaXZlZCBjbGFzcy4KKyAgVlB0ckluZm9WZWN0b3IgVkJQdHJQYXRoczsKIH07CiAKIGNsYXNzIE1pY3Jvc29mdFZUYWJsZUNvbnRleHQgOiBwdWJsaWMgVlRhYmxlQ29udGV4dEJhc2UgewpAQCAtNDMxLDE2ICs0NzEsMTEgQEAKICAgICAgICAgYXNzZXJ0KFZCYXNlICE9IG90aGVyLlZCYXNlKTsKICAgICAgICAgcmV0dXJuIFZCVGFibGVJbmRleCA8IG90aGVyLlZCVGFibGVJbmRleDsKICAgICAgIH0KLSAgICAgIGlmIChWRlB0ck9mZnNldCAhPSBvdGhlci5WRlB0ck9mZnNldCkKLSAgICAgICAgcmV0dXJuIFZGUHRyT2Zmc2V0IDwgb3RoZXIuVkZQdHJPZmZzZXQ7Ci0gICAgICBpZiAoSW5kZXggIT0gb3RoZXIuSW5kZXgpCi0gICAgICAgIHJldHVybiBJbmRleCA8IG90aGVyLkluZGV4OwotICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHN0ZDo6dGllKFZGUHRyT2Zmc2V0LCBJbmRleCkgPAorICAgICAgICAgICAgIHN0ZDo6dGllKG90aGVyLlZGUHRyT2Zmc2V0LCBvdGhlci5JbmRleCk7CiAgICAgfQogICB9OwogCi0gIHR5cGVkZWYgU21hbGxWZWN0b3I8VkZQdHJJbmZvLCAxPiBWRlB0ckxpc3RUeTsKLQogcHJpdmF0ZToKICAgQVNUQ29udGV4dCAmQ29udGV4dDsKIApAQCAtNDQ4LDcgKzQ4Myw3IEBACiAgICAgTWV0aG9kVkZUYWJsZUxvY2F0aW9uc1R5OwogICBNZXRob2RWRlRhYmxlTG9jYXRpb25zVHkgTWV0aG9kVkZUYWJsZUxvY2F0aW9uczsKIAotICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPGNvbnN0IENYWFJlY29yZERlY2wgKiwgVkZQdHJMaXN0VHk+CisgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCBWUHRySW5mb1ZlY3RvciAqPgogICAgIFZGUHRyTG9jYXRpb25zTWFwVHk7CiAgIFZGUHRyTG9jYXRpb25zTWFwVHkgVkZQdHJMb2NhdGlvbnM7CiAKQEAgLTQ1Niw0MyArNDkxLDM2IEBACiAgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8VkZUYWJsZUlkVHksIGNvbnN0IFZUYWJsZUxheW91dCAqPiBWRlRhYmxlTGF5b3V0TWFwVHk7CiAgIFZGVGFibGVMYXlvdXRNYXBUeSBWRlRhYmxlTGF5b3V0czsKIAotICB0eXBlZGVmIGxsdm06OlNtYWxsU2V0VmVjdG9yPGNvbnN0IENYWFJlY29yZERlY2wgKiwgOD4gQmFzZXNTZXRWZWN0b3JUeTsKLSAgdm9pZCBlbnVtZXJhdGVWRlB0cnMoY29uc3QgQ1hYUmVjb3JkRGVjbCAqTW9zdERlcml2ZWRDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZNb3N0RGVyaXZlZENsYXNzTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICBCYXNlU3Vib2JqZWN0IEJhc2UsIGNvbnN0IENYWFJlY29yZERlY2wgKkxhc3RWQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVkZQdHJJbmZvOjpCYXNlUGF0aCAmUGF0aEZyb21Db21wbGV0ZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICBCYXNlc1NldFZlY3RvclR5ICZWaXNpdGVkVkJhc2VzLAotICAgICAgICAgICAgICAgICAgICAgICBNaWNyb3NvZnRWVGFibGVDb250ZXh0OjpWRlB0ckxpc3RUeSAmUmVzdWx0KTsKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCBWaXJ0dWFsQmFzZUluZm8gKj4gVkJhc2VJbmZvOwogCi0gIHZvaWQgZW51bWVyYXRlVkZQdHJzKGNvbnN0IENYWFJlY29yZERlY2wgKkZvckNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICBNaWNyb3NvZnRWVGFibGVDb250ZXh0OjpWRlB0ckxpc3RUeSAmUmVzdWx0KTsKKyAgdm9pZCBlbnVtZXJhdGVWRlB0cnMoY29uc3QgQ1hYUmVjb3JkRGVjbCAqRm9yQ2xhc3MsIFZQdHJJbmZvVmVjdG9yICZSZXN1bHQpOwogCi0gIHZvaWQgY29tcHV0ZVZUYWJsZVJlbGF0ZWRJbmZvcm1hdGlvbihjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7CisgIHZvaWQgY29tcHV0ZVZUYWJsZVJlbGF0ZWRJbmZvcm1hdGlvbihjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgb3ZlcnJpZGU7CiAKICAgdm9pZCBkdW1wTWV0aG9kTG9jYXRpb25zKGNvbnN0IENYWFJlY29yZERlY2wgKlJELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kVkZUYWJsZUxvY2F0aW9uc1R5ICZOZXdNZXRob2RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJik7CiAKLSAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCBjb25zdCBDWFhSZWNvcmREZWNsICo+IENsYXNzUGFpclR5OwotICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPENsYXNzUGFpclR5LCB1bnNpZ25lZD4gVkJUYWJsZUluZGljZXNUeTsKLSAgVkJUYWJsZUluZGljZXNUeSBWQlRhYmxlSW5kaWNlczsKLSAgbGx2bTo6RGVuc2VTZXQ8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqPiBDb21wdXRlZFZCVGFibGVJbmRpY2VzOworICBjb25zdCBWaXJ0dWFsQmFzZUluZm8gKgorICBjb21wdXRlVkJUYWJsZVJlbGF0ZWRJbmZvcm1hdGlvbihjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7CiAKLSAgdm9pZCBjb21wdXRlVkJUYWJsZVJlbGF0ZWRJbmZvcm1hdGlvbihjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7CisgIHZvaWQgY29tcHV0ZVZUYWJsZVBhdGhzKGJvb2wgRm9yVkJUYWJsZXMsIGNvbnN0IENYWFJlY29yZERlY2wgKlJELAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUHRySW5mb1ZlY3RvciAmUGF0aHMpOwogCiBwdWJsaWM6Ci0gIE1pY3Jvc29mdFZUYWJsZUNvbnRleHQoQVNUQ29udGV4dCAmQ29udGV4dCkgOiBDb250ZXh0KENvbnRleHQpIHt9CisgIE1pY3Jvc29mdFZUYWJsZUNvbnRleHQoQVNUQ29udGV4dCAmQ29udGV4dCkKKyAgICAgIDogVlRhYmxlQ29udGV4dEJhc2UoLypNUz0qL3RydWUpLCBDb250ZXh0KENvbnRleHQpIHt9CiAKLSAgfk1pY3Jvc29mdFZUYWJsZUNvbnRleHQoKSB7IGxsdm06OkRlbGV0ZUNvbnRhaW5lclNlY29uZHMoVkZUYWJsZUxheW91dHMpOyB9CisgIH5NaWNyb3NvZnRWVGFibGVDb250ZXh0KCk7CiAKLSAgY29uc3QgVkZQdHJMaXN0VHkgJmdldFZGUHRyT2Zmc2V0cyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7CisgIGNvbnN0IFZQdHJJbmZvVmVjdG9yICZnZXRWRlB0ck9mZnNldHMoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOwogCiAgIGNvbnN0IFZUYWJsZUxheW91dCAmZ2V0VkZUYWJsZUxheW91dChjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBWRlB0ck9mZnNldCk7CiAKICAgY29uc3QgTWV0aG9kVkZUYWJsZUxvY2F0aW9uICZnZXRNZXRob2RWRlRhYmxlTG9jYXRpb24oR2xvYmFsRGVjbCBHRCk7CiAKLSAgY29uc3QgVGh1bmtJbmZvVmVjdG9yVHkgKmdldFRodW5rSW5mbyhHbG9iYWxEZWNsIEdEKSB7CisgIGNvbnN0IFRodW5rSW5mb1ZlY3RvclR5ICpnZXRUaHVua0luZm8oR2xvYmFsRGVjbCBHRCkgb3ZlcnJpZGUgewogICAgIC8vIENvbXBsZXRlIGRlc3RydWN0b3JzIGRvbid0IGhhdmUgYSBzbG90IGluIGEgdmZ0YWJsZSwgc28gbm8gdGh1bmtzIG5lZWRlZC4KICAgICBpZiAoaXNhPENYWERlc3RydWN0b3JEZWNsPihHRC5nZXREZWNsKCkpICYmCiAgICAgICAgIEdELmdldER0b3JUeXBlKCkgPT0gRHRvcl9Db21wbGV0ZSkKQEAgLTUwNSwxNCArNTMzLDEzIEBACiAgIC8vLyBUaGUgdmJ0YWJsZSBpcyBhbiBhcnJheSBvZiBpMzIgb2Zmc2V0cy4gIFRoZSBmaXJzdCBlbnRyeSBpcyBhIHNlbGYgZW50cnksCiAgIC8vLyBhbmQgdGhlIHJlc3QgYXJlIG9mZnNldHMgZnJvbSB0aGUgdmJwdHIgdG8gdmlydHVhbCBiYXNlcy4KICAgdW5zaWduZWQgZ2V0VkJUYWJsZUluZGV4KGNvbnN0IENYWFJlY29yZERlY2wgKkRlcml2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpWQmFzZSkgewotICAgIGNvbXB1dGVWQlRhYmxlUmVsYXRlZEluZm9ybWF0aW9uKERlcml2ZWQpOwotICAgIENsYXNzUGFpclR5IFBhaXIoRGVyaXZlZCwgVkJhc2UpOwotICAgIGFzc2VydChWQlRhYmxlSW5kaWNlcy5jb3VudChQYWlyKSA9PSAxICYmCi0gICAgICAgICAgICJWQmFzZSBtdXN0IGJlIGEgdmJhc2Ugb2YgRGVyaXZlZCIpOwotICAgIHJldHVybiBWQlRhYmxlSW5kaWNlc1tQYWlyXTsKLSAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqVkJhc2UpOworCisgIGNvbnN0IFZQdHJJbmZvVmVjdG9yICZlbnVtZXJhdGVWQlRhYmxlcyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWVGFibGVDb250ZXh0QmFzZSAqVlQpIHsgcmV0dXJuIFZULT5pc01pY3Jvc29mdCgpOyB9CiB9OwotfQorCit9IC8vIG5hbWVzcGFjZSBjbGFuZwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hGaW5kZXIuaCBiL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hGaW5kZXIuaAppbmRleCBkYjBhODNkLi44YzhhNTA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0FTVE1hdGNoRmluZGVyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaEZpbmRlci5oCkBAIC0yMjgsNyArMjI4LDcgQEAKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CiBjbGFzcyBDb2xsZWN0TWF0Y2hlc0NhbGxiYWNrIDogcHVibGljIE1hdGNoRmluZGVyOjpNYXRjaENhbGxiYWNrIHsKIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHJ1bihjb25zdCBNYXRjaEZpbmRlcjo6TWF0Y2hSZXN1bHQgJlJlc3VsdCkgeworICB2b2lkIHJ1bihjb25zdCBNYXRjaEZpbmRlcjo6TWF0Y2hSZXN1bHQgJlJlc3VsdCkgb3ZlcnJpZGUgewogICAgIE5vZGVzLnB1c2hfYmFjayhSZXN1bHQuTm9kZXMpOwogICB9CiAgIFNtYWxsVmVjdG9yPEJvdW5kTm9kZXMsIDE+IE5vZGVzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVycy5oIGIvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVycy5oCmluZGV4IDBhMzE1N2QuLjE1NjIxYjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnMuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzLmgKQEAgLTMyMyw5ICszMjMsMTMgQEAKIC8vLyBjbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKGhhc0FueVRlbXBsYXRlQXJndW1lbnQoCiAvLy8gICAgIHJlZmVyc1RvVHlwZShhc1N0cmluZygiaW50IikpKSkKIC8vLyAgIG1hdGNoZXMgdGhlIHNwZWNpYWxpemF0aW9uIFxjIEE8aW50PgotQVNUX01BVENIRVJfUChDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsLCBoYXNBbnlUZW1wbGF0ZUFyZ3VtZW50LAotICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxUZW1wbGF0ZUFyZ3VtZW50PiwgSW5uZXJNYXRjaGVyKSB7Ci0gIGxsdm06OkFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IExpc3QgPSBOb2RlLmdldFRlbXBsYXRlQXJncygpLmFzQXJyYXkoKTsKK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSX1AoCisgICAgaGFzQW55VGVtcGxhdGVBcmd1bWVudCwKKyAgICBBU1RfUE9MWU1PUlBISUNfU1VQUE9SVEVEX1RZUEVTXzIoQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUpLAorICAgIGludGVybmFsOjpNYXRjaGVyPFRlbXBsYXRlQXJndW1lbnQ+LCBJbm5lck1hdGNoZXIpIHsKKyAgbGx2bTo6QXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gTGlzdCA9CisgICAgICBpbnRlcm5hbDo6Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbkFyZ3MoTm9kZSk7CiAgIHJldHVybiBtYXRjaGVzRmlyc3RJblJhbmdlKElubmVyTWF0Y2hlciwgTGlzdC5iZWdpbigpLCBMaXN0LmVuZCgpLCBGaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIpOwogfQpAQCAtNDE5LDEyICs0MjMsMTYgQEAKIC8vLyBjbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKGhhc1RlbXBsYXRlQXJndW1lbnQoCiAvLy8gICAgIDEsIHJlZmVyc1RvVHlwZShhc1N0cmluZygiaW50IikpKSkKIC8vLyAgIG1hdGNoZXMgdGhlIHNwZWNpYWxpemF0aW9uIFxjIEE8Ym9vbCwgaW50PgotQVNUX01BVENIRVJfUDIoQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCwgaGFzVGVtcGxhdGVBcmd1bWVudCwKLSAgICAgICAgICAgICAgIHVuc2lnbmVkLCBOLCBpbnRlcm5hbDo6TWF0Y2hlcjxUZW1wbGF0ZUFyZ3VtZW50PiwgSW5uZXJNYXRjaGVyKSB7Ci0gIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICZMaXN0ID0gTm9kZS5nZXRUZW1wbGF0ZUFyZ3MoKTsKK0FTVF9QT0xZTU9SUEhJQ19NQVRDSEVSX1AyKAorICAgIGhhc1RlbXBsYXRlQXJndW1lbnQsCisgICAgQVNUX1BPTFlNT1JQSElDX1NVUFBPUlRFRF9UWVBFU18yKENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlKSwKKyAgICB1bnNpZ25lZCwgTiwgaW50ZXJuYWw6Ok1hdGNoZXI8VGVtcGxhdGVBcmd1bWVudD4sIElubmVyTWF0Y2hlcikgeworICBsbHZtOjpBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBMaXN0ID0KKyAgICAgIGludGVybmFsOjpnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uQXJncyhOb2RlKTsKICAgaWYgKExpc3Quc2l6ZSgpIDw9IE4pCiAgICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoTGlzdC5nZXQoTiksIEZpbmRlciwgQnVpbGRlcik7CisgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcyhMaXN0W05dLCBGaW5kZXIsIEJ1aWxkZXIpOwogfQogCiAvLy8gXGJyaWVmIE1hdGNoZXMgYSBUZW1wbGF0ZUFyZ3VtZW50IHRoYXQgcmVmZXJzIHRvIGEgY2VydGFpbiB0eXBlLgpAQCAtNDQ1LDcgKzQ1Myw4IEBACiAgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcyhOb2RlLmdldEFzVHlwZSgpLCBGaW5kZXIsIEJ1aWxkZXIpOwogfQogCi0vLy8gXGJyaWVmIE1hdGNoZXMgYSBUZW1wbGF0ZUFyZ3VtZW50IHRoYXQgcmVmZXJzIHRvIGEgY2VydGFpbiBkZWNsYXJhdGlvbi4KKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIGNhbm9uaWNhbCBUZW1wbGF0ZUFyZ3VtZW50IHRoYXQgcmVmZXJzIHRvIGEgY2VydGFpbgorLy8vIGRlY2xhcmF0aW9uLgogLy8vCiAvLy8gR2l2ZW4KIC8vLyBcY29kZQpAQCAtNDY0LDYgKzQ3MywyNCBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKKy8vLyBcYnJpZWYgTWF0Y2hlcyBhIHN1Z2FyIFRlbXBsYXRlQXJndW1lbnQgdGhhdCByZWZlcnMgdG8gYSBjZXJ0YWluIGV4cHJlc3Npb24uCisvLy8KKy8vLyBHaXZlbgorLy8vIFxjb2RlCisvLy8gICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQSB7fTsKKy8vLyAgIHN0cnVjdCBCIHsgQiogbmV4dDsgfTsKKy8vLyAgIEE8JkI6Om5leHQ+IGE7CisvLy8gXGVuZGNvZGUKKy8vLyB0ZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZShoYXNBbnlUZW1wbGF0ZUFyZ3VtZW50KAorLy8vICAgaXNFeHByKGhhc0Rlc2NlbmRhbnQoZGVjbFJlZkV4cHIodG8oZmllbGREZWNsKGhhc05hbWUoIm5leHQiKSkpKSkpKSkKKy8vLyAgIG1hdGNoZXMgdGhlIHNwZWNpYWxpemF0aW9uIFxjIEE8JkI6Om5leHQ+IHdpdGggXGMgZmllbGREZWNsKC4uLikgbWF0Y2hpbmcKKy8vLyAgICAgXGMgQjo6bmV4dAorQVNUX01BVENIRVJfUChUZW1wbGF0ZUFyZ3VtZW50LCBpc0V4cHIsIGludGVybmFsOjpNYXRjaGVyPEV4cHI+LCBJbm5lck1hdGNoZXIpIHsKKyAgaWYgKE5vZGUuZ2V0S2luZCgpID09IFRlbXBsYXRlQXJndW1lbnQ6OkV4cHJlc3Npb24pCisgICAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKCpOb2RlLmdldEFzRXhwcigpLCBGaW5kZXIsIEJ1aWxkZXIpOworICByZXR1cm4gZmFsc2U7Cit9CisKIC8vLyBcYnJpZWYgTWF0Y2hlcyBDKysgY29uc3RydWN0b3IgZGVjbGFyYXRpb25zLgogLy8vCiAvLy8gRXhhbXBsZSBtYXRjaGVzIEZvbzo6Rm9vKCkgYW5kIEZvbzo6Rm9vKGludCkKQEAgLTUxOCw3ICs1NDUsNyBAQAogLy8vCiAvLy8gRXhhbXBsZSBtYXRjaGVzIHkKIC8vLyBcY29kZQotLy8vICAgY2xhc3MgWCB7IHZvaWQgeSgpIH07CisvLy8gICBjbGFzcyBYIHsgdm9pZCB5KCk7IH07CiAvLy8gXGVuZGNvZGUKIGNvbnN0IGludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8RGVjbCwgQ1hYTWV0aG9kRGVjbD4gbWV0aG9kRGVjbDsKIApAQCAtNjM1LDYgKzY2MiwxNiBAQAogICBTdG10LAogICBDWFhNZW1iZXJDYWxsRXhwcj4gbWVtYmVyQ2FsbEV4cHI7CiAKKy8vLyBcYnJpZWYgTWF0Y2hlcyBleHByZXNzaW9ucyB0aGF0IGludHJvZHVjZSBjbGVhbnVwcyB0byBiZSBydW4gYXQgdGhlIGVuZAorLy8vIG9mIHRoZSBzdWItZXhwcmVzc2lvbidzIGV2YWx1YXRpb24uCisvLy8KKy8vLyBFeGFtcGxlIG1hdGNoZXMgc3RkOjpzdHJpbmcoKQorLy8vIFxjb2RlCisvLy8gICBjb25zdCBzdGQ6OnN0cmluZyBzdHIgPSBzdGQ6OnN0cmluZygpOworLy8vIFxlbmRjb2RlCitjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIEV4cHJXaXRoQ2xlYW51cHM+CitleHByV2l0aENsZWFudXBzOworCiAvLy8gXGJyaWVmIE1hdGNoZXMgaW5pdCBsaXN0IGV4cHJlc3Npb25zLgogLy8vCiAvLy8gR2l2ZW4KQEAgLTg0MiwxNSArODc5LDYgQEAKIC8vLyBcZW5kY29kZQogY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBGb3JTdG10PiBmb3JTdG10OwogCi0vLy8gXGJyaWVmIE1hdGNoZXMgcmFuZ2UtYmFzZWQgZm9yIHN0YXRlbWVudHMuCi0vLy8KLS8vLyBmb3JSYW5nZVN0bXQoKSBtYXRjaGVzICdmb3IgKGF1dG8gYSA6IGkpJwotLy8vIFxjb2RlCi0vLy8gICBpbnQgaVtdID0gIHsxLCAyLCAzfTsgZm9yIChhdXRvIGEgOiBpKTsKLS8vLyAgIGZvcihpbnQgaiA9IDA7IGogPCA1OyArK2opOwotLy8vIFxlbmRjb2RlCi1jb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVyPFN0bXQsIENYWEZvclJhbmdlU3RtdD4gZm9yUmFuZ2VTdG10OwotCiAvLy8gXGJyaWVmIE1hdGNoZXMgdGhlIGluY3JlbWVudCBzdGF0ZW1lbnQgb2YgYSBmb3IgbG9vcC4KIC8vLwogLy8vIEV4YW1wbGU6CkBAIC04ODAsNiArOTA4LDI5IEBACiAgIHJldHVybiAoSW5pdCAhPSBOVUxMICYmIElubmVyTWF0Y2hlci5tYXRjaGVzKCpJbml0LCBGaW5kZXIsIEJ1aWxkZXIpKTsKIH0KIAorLy8vIFxicmllZiBNYXRjaGVzIHJhbmdlLWJhc2VkIGZvciBzdGF0ZW1lbnRzLgorLy8vCisvLy8gZm9yUmFuZ2VTdG10KCkgbWF0Y2hlcyAnZm9yIChhdXRvIGEgOiBpKScKKy8vLyBcY29kZQorLy8vICAgaW50IGlbXSA9ICB7MSwgMiwgM307IGZvciAoYXV0byBhIDogaSk7CisvLy8gICBmb3IoaW50IGogPSAwOyBqIDwgNTsgKytqKTsKKy8vLyBcZW5kY29kZQorY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjxTdG10LCBDWFhGb3JSYW5nZVN0bXQ+IGZvclJhbmdlU3RtdDsKKworLy8vIFxicmllZiBNYXRjaGVzIHRoZSBpbml0aWFsaXphdGlvbiBzdGF0ZW1lbnQgb2YgYSBmb3IgbG9vcC4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gICAgIGZvclN0bXQoaGFzTG9vcFZhcmlhYmxlKGFueXRoaW5nKCkpKQorLy8vIG1hdGNoZXMgJ2ludCB4JyBpbgorLy8vIFxjb2RlCisvLy8gICAgIGZvciAoaW50IHggOiBhKSB7IH0KKy8vLyBcZW5kY29kZQorQVNUX01BVENIRVJfUChDWFhGb3JSYW5nZVN0bXQsIGhhc0xvb3BWYXJpYWJsZSwgaW50ZXJuYWw6Ok1hdGNoZXI8VmFyRGVjbD4sCisgICAgICAgICAgICAgIElubmVyTWF0Y2hlcikgeworICBjb25zdCBWYXJEZWNsICpjb25zdCBWYXIgPSBOb2RlLmdldExvb3BWYXJpYWJsZSgpOworICByZXR1cm4gKFZhciAhPSBOVUxMICYmIElubmVyTWF0Y2hlci5tYXRjaGVzKCpWYXIsIEZpbmRlciwgQnVpbGRlcikpOworfQorCiAvLy8gXGJyaWVmIE1hdGNoZXMgd2hpbGUgc3RhdGVtZW50cy4KIC8vLwogLy8vIEdpdmVuCkBAIC0xMzE3LDIxICsxMzY4LDIxIEBACiAvLy8gXGMgYi4KIC8vLwogLy8vIFVzYWJsZSBhczogQW55IE1hdGNoZXIKLWNvbnN0IGludGVybmFsOjpWYXJpYWRpY09wZXJhdG9yTWF0Y2hlckZ1bmMgZWFjaE9mID0geworY29uc3QgaW50ZXJuYWw6OlZhcmlhZGljT3BlcmF0b3JNYXRjaGVyRnVuYzwyLCBVSU5UX01BWD4gZWFjaE9mID0gewogICBpbnRlcm5hbDo6RWFjaE9mVmFyaWFkaWNPcGVyYXRvcgogfTsKIAogLy8vIFxicmllZiBNYXRjaGVzIGlmIGFueSBvZiB0aGUgZ2l2ZW4gbWF0Y2hlcnMgbWF0Y2hlcy4KIC8vLwogLy8vIFVzYWJsZSBhczogQW55IE1hdGNoZXIKLWNvbnN0IGludGVybmFsOjpWYXJpYWRpY09wZXJhdG9yTWF0Y2hlckZ1bmMgYW55T2YgPSB7Citjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNPcGVyYXRvck1hdGNoZXJGdW5jPDIsIFVJTlRfTUFYPiBhbnlPZiA9IHsKICAgaW50ZXJuYWw6OkFueU9mVmFyaWFkaWNPcGVyYXRvcgogfTsKIAogLy8vIFxicmllZiBNYXRjaGVzIGlmIGFsbCBnaXZlbiBtYXRjaGVycyBtYXRjaC4KIC8vLwogLy8vIFVzYWJsZSBhczogQW55IE1hdGNoZXIKLWNvbnN0IGludGVybmFsOjpWYXJpYWRpY09wZXJhdG9yTWF0Y2hlckZ1bmMgYWxsT2YgPSB7Citjb25zdCBpbnRlcm5hbDo6VmFyaWFkaWNPcGVyYXRvck1hdGNoZXJGdW5jPDIsIFVJTlRfTUFYPiBhbGxPZiA9IHsKICAgaW50ZXJuYWw6OkFsbE9mVmFyaWFkaWNPcGVyYXRvcgogfTsKIApAQCAtMTY3MSwxMiArMTcyMiw5IEBACiAvLy8gXGVuZGNvZGUKIC8vLwogLy8vIFVzYWJsZSBhczogQW55IE1hdGNoZXIKLXRlbXBsYXRlIDx0eXBlbmFtZSBNPgotaW50ZXJuYWw6OlBvbHltb3JwaGljTWF0Y2hlcldpdGhQYXJhbTE8aW50ZXJuYWw6Ok5vdE1hdGNoZXIsIE0+Ci11bmxlc3MoY29uc3QgTSAmSW5uZXJNYXRjaGVyKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6UG9seW1vcnBoaWNNYXRjaGVyV2l0aFBhcmFtMTwKLSAgICBpbnRlcm5hbDo6Tm90TWF0Y2hlciwgTT4oSW5uZXJNYXRjaGVyKTsKLX0KK2NvbnN0IGludGVybmFsOjpWYXJpYWRpY09wZXJhdG9yTWF0Y2hlckZ1bmM8MSwgMT4gdW5sZXNzID0geworICBpbnRlcm5hbDo6Tm90VW5hcnlPcGVyYXRvcgorfTsKIAogLy8vIFxicmllZiBNYXRjaGVzIGEgbm9kZSBpZiB0aGUgZGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoYXQgbm9kZQogLy8vIG1hdGNoZXMgdGhlIGdpdmVuIG1hdGNoZXIuCkBAIC0yMTc1LDYgKzIyMjMsMTEgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCisvLy8gXGJyaWVmIE1hdGNoZXMgYSBjb25zdHJ1Y3RvciBjYWxsIGV4cHJlc3Npb24gd2hpY2ggdXNlcyBsaXN0IGluaXRpYWxpemF0aW9uLgorQVNUX01BVENIRVIoQ1hYQ29uc3RydWN0RXhwciwgaXNMaXN0SW5pdGlhbGl6YXRpb24pIHsKKyAgcmV0dXJuIE5vZGUuaXNMaXN0SW5pdGlhbGl6YXRpb24oKTsKK30KKwogLy8vIFxicmllZiBNYXRjaGVzIHRoZSBuJ3RoIHBhcmFtZXRlciBvZiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgogLy8vCiAvLy8gR2l2ZW4KQEAgLTIyMzQsNyArMjI4Nyw3IEBACiAvLy8gICBtYXRjaGVzIGludCBmKCkgeyByZXR1cm4gMTsgfQogQVNUX01BVENIRVJfUChGdW5jdGlvbkRlY2wsIHJldHVybnMsCiAgICAgICAgICAgICAgIGludGVybmFsOjpNYXRjaGVyPFF1YWxUeXBlPiwgSW5uZXJNYXRjaGVyKSB7Ci0gIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcyhOb2RlLmdldFJlc3VsdFR5cGUoKSwgRmluZGVyLCBCdWlsZGVyKTsKKyAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKE5vZGUuZ2V0UmV0dXJuVHlwZSgpLCBGaW5kZXIsIEJ1aWxkZXIpOwogfQogCiAvLy8gXGJyaWVmIE1hdGNoZXMgZXh0ZXJuICJDIiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCkBAIC0yMjY3LDE2ICsyMzIwLDYgQEAKICAgICAgICAgICBJbm5lck1hdGNoZXIubWF0Y2hlcygqQ29uZGl0aW9uLCBGaW5kZXIsIEJ1aWxkZXIpKTsKIH0KIAotbmFtZXNwYWNlIGludGVybmFsIHsKLXN0cnVjdCBOb3RFcXVhbHNCb3VuZE5vZGVQcmVkaWNhdGUgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgaW50ZXJuYWw6OkJvdW5kTm9kZXNNYXAgJk5vZGVzKSBjb25zdCB7Ci0gICAgcmV0dXJuIE5vZGVzLmdldE5vZGUoSUQpICE9IE5vZGU7Ci0gIH0KLSAgc3RkOjpzdHJpbmcgSUQ7Ci0gIGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlIE5vZGU7Ci19OwotfSAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQogLy8vIFxicmllZiBNYXRjaGVzIGlmIGEgbm9kZSBlcXVhbHMgYSBwcmV2aW91c2x5IGJvdW5kIG5vZGUuCiAvLy8KIC8vLyBNYXRjaGVzIGEgbm9kZSBpZiBpdCBlcXVhbHMgdGhlIG5vZGUgcHJldmlvdXNseSBib3VuZCB0byBccCBJRC4KQEAgLTI2MDMsNiArMjY0NiwyMCBAQAogICByZXR1cm4gTm9kZS5pc1ZpcnR1YWwoKTsKIH0KIAorLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBnaXZlbiBtZXRob2QgZGVjbGFyYXRpb24gaXMgcHVyZS4KKy8vLworLy8vIEdpdmVuCisvLy8gXGNvZGUKKy8vLyAgIGNsYXNzIEEgeworLy8vICAgIHB1YmxpYzoKKy8vLyAgICAgdmlydHVhbCB2b2lkIHgoKSA9IDA7CisvLy8gICB9OworLy8vIFxlbmRjb2RlCisvLy8gICBtYXRjaGVzIEE6OngKK0FTVF9NQVRDSEVSKENYWE1ldGhvZERlY2wsIGlzUHVyZSkgeworICByZXR1cm4gTm9kZS5pc1B1cmUoKTsKK30KKwogLy8vIFxicmllZiBNYXRjaGVzIGlmIHRoZSBnaXZlbiBtZXRob2QgZGVjbGFyYXRpb24gaXMgY29uc3QuCiAvLy8KIC8vLyBHaXZlbgpAQCAtMjgyMiw4ICsyODc5LDggQEAKIAogLy8vIFxicmllZiBNYXRjaGVzIFxjIFR5cGVMb2NzIGZvciB3aGljaCB0aGUgZ2l2ZW4gaW5uZXIKIC8vLyBRdWFsVHlwZS1tYXRjaGVyIG1hdGNoZXMuCi1pbmxpbmUgaW50ZXJuYWw6OkJpbmRhYmxlTWF0Y2hlcjxUeXBlTG9jPiBsb2MoCi0gICAgY29uc3QgaW50ZXJuYWw6Ok1hdGNoZXI8UXVhbFR5cGU+ICZJbm5lck1hdGNoZXIpIHsKK0FTVF9NQVRDSEVSX0ZVTkNUSU9OX1BfT1ZFUkxPQUQoaW50ZXJuYWw6OkJpbmRhYmxlTWF0Y2hlcjxUeXBlTG9jPiwgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6TWF0Y2hlcjxRdWFsVHlwZT4sIElubmVyTWF0Y2hlciwgMCkgewogICByZXR1cm4gaW50ZXJuYWw6OkJpbmRhYmxlTWF0Y2hlcjxUeXBlTG9jPigKICAgICAgIG5ldyBpbnRlcm5hbDo6VHlwZUxvY1R5cGVNYXRjaGVyKElubmVyTWF0Y2hlcikpOwogfQpAQCAtMzMwNiw4ICszMzYzLDkgQEAKIAogLy8vIFxicmllZiBNYXRjaGVzIFxjIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2NzIGZvciB3aGljaCB0aGUgZ2l2ZW4gaW5uZXIKIC8vLyBOZXN0ZWROYW1lU3BlY2lmaWVyLW1hdGNoZXIgbWF0Y2hlcy4KLWlubGluZSBpbnRlcm5hbDo6QmluZGFibGVNYXRjaGVyPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+IGxvYygKLSAgICBjb25zdCBpbnRlcm5hbDo6TWF0Y2hlcjxOZXN0ZWROYW1lU3BlY2lmaWVyPiAmSW5uZXJNYXRjaGVyKSB7CitBU1RfTUFUQ0hFUl9GVU5DVElPTl9QX09WRVJMT0FEKAorICAgIGludGVybmFsOjpCaW5kYWJsZU1hdGNoZXI8TmVzdGVkTmFtZVNwZWNpZmllckxvYz4sIGxvYywKKyAgICBpbnRlcm5hbDo6TWF0Y2hlcjxOZXN0ZWROYW1lU3BlY2lmaWVyPiwgSW5uZXJNYXRjaGVyLCAxKSB7CiAgIHJldHVybiBpbnRlcm5hbDo6QmluZGFibGVNYXRjaGVyPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+KAogICAgICAgbmV3IGludGVybmFsOjpMb2NNYXRjaGVyPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MsIE5lc3RlZE5hbWVTcGVjaWZpZXI+KAogICAgICAgICAgIElubmVyTWF0Y2hlcikpOwpAQCAtMzM0Myw3ICszNDAxLDcgQEAKIC8vLyAgIG1hdGNoZXMgIkE6OiIKIEFTVF9NQVRDSEVSX1AoTmVzdGVkTmFtZVNwZWNpZmllckxvYywgc3BlY2lmaWVzVHlwZUxvYywKICAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8VHlwZUxvYz4sIElubmVyTWF0Y2hlcikgewotICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoTm9kZS5nZXRUeXBlTG9jKCksIEZpbmRlciwgQnVpbGRlcik7CisgIHJldHVybiBOb2RlICYmIElubmVyTWF0Y2hlci5tYXRjaGVzKE5vZGUuZ2V0VHlwZUxvYygpLCBGaW5kZXIsIEJ1aWxkZXIpOwogfQogCiAvLy8gXGJyaWVmIE1hdGNoZXMgb24gdGhlIHByZWZpeCBvZiBhIFxjIE5lc3RlZE5hbWVTcGVjaWZpZXIuCkBAIC0zNDYzLDExICszNTIxLDkgQEAKICAgICAgICAgICAgICAgaW50ZXJuYWw6Ok1hdGNoZXI8Q1hYQ3RvckluaXRpYWxpemVyPiwgSW5uZXJNYXRjaGVyKSB7CiAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciBSZXN1bHQ7CiAgIGJvb2wgTWF0Y2hlZCA9IGZhbHNlOwotICBmb3IgKENYWENvbnN0cnVjdG9yRGVjbDo6aW5pdF9jb25zdF9pdGVyYXRvciBJID0gTm9kZS5pbml0X2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBOb2RlLmluaXRfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogTm9kZS5pbml0cygpKSB7CiAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyIEluaXRCdWlsZGVyKCpCdWlsZGVyKTsKLSAgICBpZiAoSW5uZXJNYXRjaGVyLm1hdGNoZXMoKipJLCBGaW5kZXIsICZJbml0QnVpbGRlcikpIHsKKyAgICBpZiAoSW5uZXJNYXRjaGVyLm1hdGNoZXMoKkksIEZpbmRlciwgJkluaXRCdWlsZGVyKSkgewogICAgICAgTWF0Y2hlZCA9IHRydWU7CiAgICAgICBSZXN1bHQuYWRkTWF0Y2goSW5pdEJ1aWxkZXIpOwogICAgIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnNJbnRlcm5hbC5oIGIvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVyc0ludGVybmFsLmgKaW5kZXggNjljZWUyZS4uMjM4ODVhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVyc0ludGVybmFsLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVyc0ludGVybmFsLmgKQEAgLTQ0LDcgKzQ0LDYgQEAKICNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgogI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvVmFyaWFkaWNGdW5jdGlvbi5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90eXBlX3RyYWl0cy5oIgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgpAQCAtNTIsMTEgKzUxLDYgQEAKIG5hbWVzcGFjZSBjbGFuZyB7CiBuYW1lc3BhY2UgYXN0X21hdGNoZXJzIHsKIAotLy8vIEZJWE1FOiBNb3ZlIGludG8gdGhlIGxsdm0gc3VwcG9ydCBsaWJyYXJ5LgotdGVtcGxhdGUgPGJvb2w+IHN0cnVjdCBDb21waWxlQXNzZXJ0IHt9OwotI2RlZmluZSBUT09MSU5HX0NPTVBJTEVfQVNTRVJUKEV4cHIsIE1zZykgXAotICB0eXBlZGVmIENvbXBpbGVBc3NlcnQ8KGJvb2woRXhwcikpPiBNc2dbYm9vbChFeHByKSA/IDEgOiAtMV0KLQogY2xhc3MgQm91bmROb2RlczsKIAogbmFtZXNwYWNlIGludGVybmFsIHsKQEAgLTE5OCw5ICsxOTIsOSBAQAogCiBwcml2YXRlOgogICAvLy8gSW1wbGVtZW50cyBNYXRjaGVySW50ZXJmYWNlOjpNYXRjaGVzLgotICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyhjb25zdCBUICZOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlciAqIC8qIEZpbmRlciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICogLyogIEJ1aWxkZXIgKi8pIGNvbnN0IHsKKyAgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsCisgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlciAqIC8qIEZpbmRlciAqLywKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqIC8qICBCdWlsZGVyICovKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIG1hdGNoZXNOb2RlKE5vZGUpOwogICB9CiB9OwpAQCAtMjI1LDkgKzIxOSw4IEBACiAgIC8vLyBSZXF1aXJlcyBcYyBUIHRvIGJlIGRlcml2ZWQgZnJvbSBcYyBGcm9tLgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KICAgTWF0Y2hlcihjb25zdCBNYXRjaGVyPEZyb20+ICZPdGhlciwKLSAgICAgICAgICB0eXBlbmFtZSBsbHZtOjplbmFibGVfaWZfYzwKLSAgICAgICAgICAgIGxsdm06OmlzX2Jhc2Vfb2Y8RnJvbSwgVD46OnZhbHVlICYmCi0gICAgICAgICAgICAhbGx2bTo6aXNfc2FtZTxGcm9tLCBUPjo6dmFsdWUgPjo6dHlwZSogPSAwKQorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjxGcm9tLCBUPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RkOjppc19zYW1lPEZyb20sIFQ+Ojp2YWx1ZT46OnR5cGUgKiA9IDApCiAgICAgICA6IEltcGxlbWVudGF0aW9uKG5ldyBJbXBsaWNpdENhc3RNYXRjaGVyPEZyb20+KE90aGVyKSkge30KIAogICAvLy8gXGJyaWVmIEltcGxpY2l0bHkgY29udmVydHMgXGMgTWF0Y2hlcjxUeXBlPiB0byBcYyBNYXRjaGVyPFF1YWxUeXBlPi4KQEAgLTIzNSw5ICsyMjgsOSBAQAogICAvLy8gVGhlIHJlc3VsdGluZyBtYXRjaGVyIGlzIG5vdCBzdHJpY3QsIGkuZS4gaWdub3JlcyBxdWFsaWZpZXJzLgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZVQ+CiAgIE1hdGNoZXIoY29uc3QgTWF0Y2hlcjxUeXBlVD4gJk90aGVyLAotICAgICAgICAgIHR5cGVuYW1lIGxsdm06OmVuYWJsZV9pZl9jPAotICAgICAgICAgICAgbGx2bTo6aXNfc2FtZTxULCBRdWFsVHlwZT46OnZhbHVlICYmCi0gICAgICAgICAgICBsbHZtOjppc19zYW1lPFR5cGVULCBUeXBlPjo6dmFsdWUgPjo6dHlwZSogPSAwKQorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIFF1YWxUeXBlPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxUeXBlVCwgVHlwZT46OnZhbHVlPjo6dHlwZSogPSAwKQogICAgICAgOiBJbXBsZW1lbnRhdGlvbihuZXcgVHlwZVRvUXVhbFR5cGU8VHlwZVQ+KE90aGVyKSkge30KIAogICAvLy8gXGJyaWVmIEZvcndhcmRzIHRoZSBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIE1hdGNoZXJJbnRlcmZhY2U8VD4gcG9pbnRlci4KQEAgLTI3Miw5ICsyNjUsOCBAQAogICAgIFR5cGVUb1F1YWxUeXBlKGNvbnN0IE1hdGNoZXI8VHlwZVQ+ICZJbm5lck1hdGNoZXIpCiAgICAgICAgIDogSW5uZXJNYXRjaGVyKElubmVyTWF0Y2hlcikge30KIAotICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKGNvbnN0IFF1YWxUeXBlICZOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCB7CisgICAgYm9vbCBtYXRjaGVzKGNvbnN0IFF1YWxUeXBlICZOb2RlLCBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIGlmIChOb2RlLmlzTnVsbCgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICByZXR1cm4gSW5uZXJNYXRjaGVyLm1hdGNoZXMoKk5vZGUsIEZpbmRlciwgQnVpbGRlcik7CkBAIC0yOTIsOSArMjg0LDggQEAKICAgICBleHBsaWNpdCBJbXBsaWNpdENhc3RNYXRjaGVyKGNvbnN0IE1hdGNoZXI8QmFzZT4gJkZyb20pCiAgICAgICAgIDogRnJvbShGcm9tKSB7fQogCi0gICAgdmlydHVhbCBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBUICZOb2RlLCBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHJldHVybiBGcm9tLm1hdGNoZXMoTm9kZSwgRmluZGVyLCBCdWlsZGVyKTsKICAgICB9CiAKQEAgLTM3OSw5ICszNzAsNyBAQAogICAvLy8gICBtYXRjaGVyIGNhbiBoYW5kbGUgYSB2YWx1ZSBvZiBULgogICAvLy8KICAgLy8vIElmIGl0IGlzIG5vdCBjb21wYXRpYmxlLCB0aGVuIHRoaXMgbWF0Y2hlciB3aWxsIG5ldmVyIG1hdGNoIGFueXRoaW5nLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gTWF0Y2hlcjxUPiB1bmNvbmRpdGlvbmFsQ29udmVydFRvKCkgY29uc3QgewotICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBXcmFwcGVkTWF0Y2hlcjxUPigqdGhpcykpOwotICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBNYXRjaGVyPFQ+IHVuY29uZGl0aW9uYWxDb252ZXJ0VG8oKSBjb25zdDsKIAogcHJpdmF0ZToKICAgY2xhc3MgTWF0Y2hlclN0b3JhZ2UgOiBwdWJsaWMgUmVmQ291bnRlZEJhc2VWUFRSIHsKQEAgLTQxMCw5ICszOTksNiBAQAogICAvLy8gXGJyaWVmIFR5cGVkIGltcGxlbWVudGF0aW9uIG9mIFxjIE1hdGNoZXJTdG9yYWdlLgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgVHlwZWRNYXRjaGVyU3RvcmFnZTsKIAotICAvLy8gXGJyaWVmIFNpbXBsZSBNYXRjaGVySW50ZXJmYWNlPFQ+IHdyYXBwZXIgYXJvdW5kIGEgRHluVHlwZWRNYXRjaGVyLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgV3JhcHBlZE1hdGNoZXI7Ci0KICAgSW50cnVzaXZlUmVmQ250UHRyPGNvbnN0IE1hdGNoZXJTdG9yYWdlPiBTdG9yYWdlOwogfTsKIApAQCAtNDI1LDE1ICs0MTEsMTUgQEAKICAgICAgICAgSW5uZXJNYXRjaGVyKE90aGVyKSwgQWxsb3dCaW5kKEFsbG93QmluZCkge30KIAogICBib29sIG1hdGNoZXMoY29uc3QgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgRHluTm9kZSwKLSAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QKLSAgICAgIExMVk1fT1ZFUlJJREUgeworICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIGlmIChjb25zdCBUICpOb2RlID0gRHluTm9kZS5nZXQ8VD4oKSkgewogICAgICAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKCpOb2RlLCBGaW5kZXIsIEJ1aWxkZXIpOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBsbHZtOjpPcHRpb25hbDxEeW5UeXBlZE1hdGNoZXI+IHRyeUJpbmQoU3RyaW5nUmVmIElEKSBjb25zdCBMTFZNX09WRVJSSURFIHsKKyAgbGx2bTo6T3B0aW9uYWw8RHluVHlwZWRNYXRjaGVyPiB0cnlCaW5kKFN0cmluZ1JlZiBJRCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIGlmICghQWxsb3dCaW5kKQogICAgICAgcmV0dXJuIGxsdm06Ok9wdGlvbmFsPER5blR5cGVkTWF0Y2hlcj4oKTsKICAgICByZXR1cm4gRHluVHlwZWRNYXRjaGVyKEJpbmRhYmxlTWF0Y2hlcjxUPihJbm5lck1hdGNoZXIpLmJpbmQoSUQpKTsKQEAgLTQ1MiwyMiArNDM4LDYgQEAKIGlubGluZSBEeW5UeXBlZE1hdGNoZXI6OkR5blR5cGVkTWF0Y2hlcihjb25zdCBCaW5kYWJsZU1hdGNoZXI8VD4gJk0pCiAgICAgOiBTdG9yYWdlKG5ldyBUeXBlZE1hdGNoZXJTdG9yYWdlPFQ+KE0sIHRydWUpKSB7fQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIER5blR5cGVkTWF0Y2hlcjo6V3JhcHBlZE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci1wdWJsaWM6Ci0gIGV4cGxpY2l0IFdyYXBwZWRNYXRjaGVyKGNvbnN0IER5blR5cGVkTWF0Y2hlciAmTWF0Y2hlcikgOiBJbm5lcihNYXRjaGVyKSB7fQotICB2aXJ0dWFsIH5XcmFwcGVkTWF0Y2hlcigpIHt9Ci0KLSAgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCi0gICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gSW5uZXIubWF0Y2hlcyhhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZTo6Y3JlYXRlKE5vZGUpLCBGaW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlcik7Ci0gIH0KLQotcHJpdmF0ZToKLSAgY29uc3QgRHluVHlwZWRNYXRjaGVyIElubmVyOwotfTsKLQogLy8vIFxicmllZiBTcGVjaWFsaXphdGlvbiBvZiB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIFF1YWxUeXBlLgogLy8vCiAvLy8gVGhlc2Ugc3BlY2lhbGl6YXRpb25zIHByb3ZpZGUgdGhlIE1hdGNoZXI8VHlwZT4tPk1hdGNoZXI8UXVhbFR5cGU+CkBAIC01NDYsMTYgKzUxNiwxNyBAQAogLy8vIFBvbHltb3JwaGljTWF0Y2hlcldpdGhQYXJhbTEgYW5kIHNob3VsZCBiZSBTdHJpbmdSZWYuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnVD4KIGNsYXNzIEhhc092ZXJsb2FkZWRPcGVyYXRvck5hbWVNYXRjaGVyIDogcHVibGljIFNpbmdsZU5vZGVNYXRjaGVySW50ZXJmYWNlPFQ+IHsKLSAgVE9PTElOR19DT01QSUxFX0FTU0VSVCgobGx2bTo6aXNfc2FtZTxULCBDWFhPcGVyYXRvckNhbGxFeHByPjo6dmFsdWUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6aXNfc2FtZTxULCBDWFhNZXRob2REZWNsPjo6dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkX2NsYXNzX2Zvcl9tYXRjaGVyKTsKLSAgVE9PTElOR19DT01QSUxFX0FTU0VSVCgobGx2bTo6aXNfc2FtZTxBcmdULCBTdHJpbmdSZWY+Ojp2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRfdHlwZV9tdXN0X2JlX1N0cmluZ1JlZik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFQsIENYWE9wZXJhdG9yQ2FsbEV4cHI+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBDWFhNZXRob2REZWNsPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGNsYXNzIGZvciBtYXRjaGVyIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPEFyZ1QsIFN0cmluZ1JlZj46OnZhbHVlLAorICAgICAgICAgICAgICAgICJhcmd1bWVudCB0eXBlIG11c3QgYmUgU3RyaW5nUmVmIik7CisKIHB1YmxpYzoKICAgZXhwbGljaXQgSGFzT3ZlcmxvYWRlZE9wZXJhdG9yTmFtZU1hdGNoZXIoY29uc3QgU3RyaW5nUmVmIE5hbWUpCiAgICAgICA6IFNpbmdsZU5vZGVNYXRjaGVySW50ZXJmYWNlPFQ+KCksIE5hbWUoTmFtZSkge30KIAotICB2aXJ0dWFsIGJvb2wgbWF0Y2hlc05vZGUoY29uc3QgVCAmTm9kZSkgY29uc3QgTExWTV9PVkVSUklERSB7CisgIGJvb2wgbWF0Y2hlc05vZGUoY29uc3QgVCAmTm9kZSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBtYXRjaGVzU3BlY2lhbGl6ZWQoTm9kZSk7CiAgIH0KIApAQCAtNTg0LDE2ICs1NTUsMTUgQEAKIC8vLyBub3QgYWN0dWFsbHkgdXNlZC4KIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBEZWNsTWF0Y2hlclQ+CiBjbGFzcyBIYXNEZWNsYXJhdGlvbk1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gIFRPT0xJTkdfQ09NUElMRV9BU1NFUlQoKGxsdm06OmlzX3NhbWU8IERlY2xNYXRjaGVyVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hlcjxEZWNsPiA+Ojp2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlZF93aXRoX3dyb25nX3R5cGVzKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8RGVjbE1hdGNoZXJULCBNYXRjaGVyPERlY2w+Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgImluc3RhbnRpYXRlZCB3aXRoIHdyb25nIHR5cGVzIik7CisKIHB1YmxpYzoKICAgZXhwbGljaXQgSGFzRGVjbGFyYXRpb25NYXRjaGVyKGNvbnN0IE1hdGNoZXI8RGVjbD4gJklubmVyTWF0Y2hlcikKICAgICAgIDogSW5uZXJNYXRjaGVyKElubmVyTWF0Y2hlcikge30KIAotICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyhjb25zdCBUICZOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IHsKKyAgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gbWF0Y2hlc1NwZWNpYWxpemVkKE5vZGUsIEZpbmRlciwgQnVpbGRlcik7CiAgIH0KIApAQCAtNjAzLDcgKzU3Myw3IEBACiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgogICBib29sIG1hdGNoZXNTcGVjaWFsaXplZCgKICAgICAgIGNvbnN0IFUgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlciwKLSAgICAgIHR5cGVuYW1lIGxsdm06OmVuYWJsZV9pZjxoYXNfZ2V0RGVjbDxVPiwgaW50Pjo6dHlwZSA9IDApIGNvbnN0IHsKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19nZXREZWNsPFU+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDApIGNvbnN0IHsKICAgICByZXR1cm4gbWF0Y2hlc0RlY2woTm9kZS5nZXREZWNsKCksIEZpbmRlciwgQnVpbGRlcik7CiAgIH0KIApAQCAtNjY3LDE0ICs2MzcsMTQgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IElzQmFzZVR5cGUgewogICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9Ci0gICAgICAobGx2bTo6aXNfc2FtZTxULCBEZWNsPjo6dmFsdWUgfHwKLSAgICAgICBsbHZtOjppc19zYW1lPFQsIFN0bXQ+Ojp2YWx1ZSB8fAotICAgICAgIGxsdm06OmlzX3NhbWU8VCwgUXVhbFR5cGU+Ojp2YWx1ZSB8fAotICAgICAgIGxsdm06OmlzX3NhbWU8VCwgVHlwZT46OnZhbHVlIHx8Ci0gICAgICAgbGx2bTo6aXNfc2FtZTxULCBUeXBlTG9jPjo6dmFsdWUgfHwKLSAgICAgICBsbHZtOjppc19zYW1lPFQsIE5lc3RlZE5hbWVTcGVjaWZpZXI+Ojp2YWx1ZSB8fAotICAgICAgIGxsdm06OmlzX3NhbWU8VCwgTmVzdGVkTmFtZVNwZWNpZmllckxvYz46OnZhbHVlIHx8Ci0gICAgICAgbGx2bTo6aXNfc2FtZTxULCBDWFhDdG9ySW5pdGlhbGl6ZXI+Ojp2YWx1ZSk7CisgICAgICBzdGQ6OmlzX3NhbWU8VCwgRGVjbD46OnZhbHVlIHx8CisgICAgICBzdGQ6OmlzX3NhbWU8VCwgU3RtdD46OnZhbHVlIHx8CisgICAgICBzdGQ6OmlzX3NhbWU8VCwgUXVhbFR5cGU+Ojp2YWx1ZSB8fAorICAgICAgc3RkOjppc19zYW1lPFQsIFR5cGU+Ojp2YWx1ZSB8fAorICAgICAgc3RkOjppc19zYW1lPFQsIFR5cGVMb2M+Ojp2YWx1ZSB8fAorICAgICAgc3RkOjppc19zYW1lPFQsIE5lc3RlZE5hbWVTcGVjaWZpZXI+Ojp2YWx1ZSB8fAorICAgICAgc3RkOjppc19zYW1lPFQsIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+Ojp2YWx1ZSB8fAorICAgICAgc3RkOjppc19zYW1lPFQsIENYWEN0b3JJbml0aWFsaXplcj46OnZhbHVlOwogfTsKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogY29uc3QgYm9vbCBJc0Jhc2VUeXBlPFQ+Ojp2YWx1ZTsKQEAgLTc0MCwxNCArNzEwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgIFRyYXZlcnNhbEtpbmQgVHJhdmVyc2UsCiAgICAgICAgICAgICAgICAgICAgICAgQmluZEtpbmQgQmluZCkgewotICAgIFRPT0xJTkdfQ09NUElMRV9BU1NFUlQoCi0gICAgICAgIChsbHZtOjppc19iYXNlX29mPERlY2wsIFQ+Ojp2YWx1ZSB8fAotICAgICAgICAgbGx2bTo6aXNfYmFzZV9vZjxTdG10LCBUPjo6dmFsdWUgfHwKLSAgICAgICAgIGxsdm06OmlzX2Jhc2Vfb2Y8TmVzdGVkTmFtZVNwZWNpZmllciwgVD46OnZhbHVlIHx8Ci0gICAgICAgICBsbHZtOjppc19iYXNlX29mPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MsIFQ+Ojp2YWx1ZSB8fAotICAgICAgICAgbGx2bTo6aXNfYmFzZV9vZjxUeXBlTG9jLCBUPjo6dmFsdWUgfHwKLSAgICAgICAgIGxsdm06OmlzX2Jhc2Vfb2Y8UXVhbFR5cGUsIFQ+Ojp2YWx1ZSksCi0gICAgICAgIHVuc3VwcG9ydGVkX3R5cGVfZm9yX3JlY3Vyc2l2ZV9tYXRjaGluZyk7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8RGVjbCwgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8U3RtdCwgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8TmVzdGVkTmFtZVNwZWNpZmllciwgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8TmVzdGVkTmFtZVNwZWNpZmllckxvYywgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8VHlwZUxvYywgVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8UXVhbFR5cGUsIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCB0eXBlIGZvciByZWN1cnNpdmUgbWF0Y2hpbmciKTsKICAgIHJldHVybiBtYXRjaGVzQ2hpbGRPZihhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZTo6Y3JlYXRlKE5vZGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyLCBCdWlsZGVyLCBUcmF2ZXJzZSwgQmluZCk7CiAgIH0KQEAgLTc1NywxNCArNzI2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kS2luZCBCaW5kKSB7Ci0gICAgVE9PTElOR19DT01QSUxFX0FTU0VSVCgKLSAgICAgICAgKGxsdm06OmlzX2Jhc2Vfb2Y8RGVjbCwgVD46OnZhbHVlIHx8Ci0gICAgICAgICBsbHZtOjppc19iYXNlX29mPFN0bXQsIFQ+Ojp2YWx1ZSB8fAotICAgICAgICAgbGx2bTo6aXNfYmFzZV9vZjxOZXN0ZWROYW1lU3BlY2lmaWVyLCBUPjo6dmFsdWUgfHwKLSAgICAgICAgIGxsdm06OmlzX2Jhc2Vfb2Y8TmVzdGVkTmFtZVNwZWNpZmllckxvYywgVD46OnZhbHVlIHx8Ci0gICAgICAgICBsbHZtOjppc19iYXNlX29mPFR5cGVMb2MsIFQ+Ojp2YWx1ZSB8fAotICAgICAgICAgbGx2bTo6aXNfYmFzZV9vZjxRdWFsVHlwZSwgVD46OnZhbHVlKSwKLSAgICAgICAgdW5zdXBwb3J0ZWRfdHlwZV9mb3JfcmVjdXJzaXZlX21hdGNoaW5nKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZjxEZWNsLCBUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxTdG10LCBUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxOZXN0ZWROYW1lU3BlY2lmaWVyLCBUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxOZXN0ZWROYW1lU3BlY2lmaWVyTG9jLCBUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxUeXBlTG9jLCBUPjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxRdWFsVHlwZSwgVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIHR5cGUgZm9yIHJlY3Vyc2l2ZSBtYXRjaGluZyIpOwogICAgIHJldHVybiBtYXRjaGVzRGVzY2VuZGFudE9mKGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlOjpjcmVhdGUoTm9kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hlciwgQnVpbGRlciwgQmluZCk7CiAgIH0KQEAgLTc3NSw5ICs3NDMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IER5blR5cGVkTWF0Y2hlciAmTWF0Y2hlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgQW5jZXN0b3JNYXRjaE1vZGUgTWF0Y2hNb2RlKSB7Ci0gICAgVE9PTElOR19DT01QSUxFX0FTU0VSVCgobGx2bTo6aXNfYmFzZV9vZjxEZWNsLCBUPjo6dmFsdWUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjppc19iYXNlX29mPFN0bXQsIFQ+Ojp2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5X0RlY2xfb3JfU3RtdF9hbGxvd2VkX2Zvcl9yZWN1cnNpdmVfbWF0Y2hpbmcpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPERlY2wsIFQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPFN0bXQsIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJvbmx5IERlY2wgb3IgU3RtdCBhbGxvd2VkIGZvciByZWN1cnNpdmUgbWF0Y2hpbmciKTsKICAgICByZXR1cm4gbWF0Y2hlc0FuY2VzdG9yT2YoYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGU6OmNyZWF0ZShOb2RlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hlciwgQnVpbGRlciwgTWF0Y2hNb2RlKTsKICAgfQpAQCAtODIwLDcgKzc4OCw3IEBACiAgIC8vLyBcYnJpZWYgVGhlIGZpcnN0IHR5cGUgb24gdGhlIGxpc3QuCiAgIHR5cGVkZWYgVDEgaGVhZDsKIAotICAvLy8gXGJyaWVmIEEgc3ViIGxpc3Qgd2l0aCB0aGUgdGFpbC4gaWUgZXZlcnl0aGluZyBidXQgdGhlIGhlYWQuCisgIC8vLyBcYnJpZWYgQSBzdWJsaXN0IHdpdGggdGhlIHRhaWwuIGllIGV2ZXJ5dGhpbmcgYnV0IHRoZSBoZWFkLgogICAvLy8KICAgLy8vIFRoaXMgdHlwZSBpcyB1c2VkIHRvIGRvIHJlY3Vyc2lvbi4gVHlwZUxpc3Q8Pi9FbXB0eVR5cGVMaXN0IGluZGljYXRlcyB0aGUKICAgLy8vIGVuZCBvZiB0aGUgbGlzdC4KQEAgLTg1Miw3ICs4MjAsNyBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIEFueVR5cGVMaXN0LCB0eXBlbmFtZSBUPgogc3RydWN0IFR5cGVMaXN0Q29udGFpbnNTdXBlck9mIHsKICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQotICAgICAgbGx2bTo6aXNfYmFzZV9vZjx0eXBlbmFtZSBBbnlUeXBlTGlzdDo6aGVhZCwgVD46OnZhbHVlIHx8CisgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8dHlwZW5hbWUgQW55VHlwZUxpc3Q6OmhlYWQsIFQ+Ojp2YWx1ZSB8fAogICAgICAgVHlwZUxpc3RDb250YWluc1N1cGVyT2Y8dHlwZW5hbWUgQW55VHlwZUxpc3Q6OnRhaWwsIFQ+Ojp2YWx1ZTsKIH07CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KQEAgLTk1Miw4ICs5MjAsOCBAQAogICB0eXBlZGVmIHR5cGVuYW1lIEV4dHJhY3RGdW5jdGlvbkFyZ01ldGE8UmV0dXJuVHlwZXNGPjo6dHlwZSBSZXR1cm5UeXBlczsKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgIG9wZXJhdG9yIE1hdGNoZXI8VD4oKSBjb25zdCB7Ci0gICAgVE9PTElOR19DT01QSUxFX0FTU0VSVCgoVHlwZUxpc3RDb250YWluc1N1cGVyT2Y8UmV0dXJuVHlwZXMsIFQ+Ojp2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9wb2x5bW9ycGhpY19jb252ZXJzaW9uKTsKKyAgICBzdGF0aWNfYXNzZXJ0KFR5cGVMaXN0Q29udGFpbnNTdXBlck9mPFJldHVyblR5cGVzLCBUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAicmlnaHQgcG9seW1vcnBoaWMgY29udmVyc2lvbiIpOwogICAgIHJldHVybiBNYXRjaGVyPFQ+KG5ldyBNYXRjaGVyVDxUPigpKTsKICAgfQogfTsKQEAgLTk3MCw4ICs5MzgsOCBAQAogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgewotICAgIFRPT0xJTkdfQ09NUElMRV9BU1NFUlQoKFR5cGVMaXN0Q29udGFpbnNTdXBlck9mPFJldHVyblR5cGVzLCBUPjo6dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfcG9seW1vcnBoaWNfY29udmVyc2lvbik7CisgICAgc3RhdGljX2Fzc2VydChUeXBlTGlzdENvbnRhaW5zU3VwZXJPZjxSZXR1cm5UeXBlcywgVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInJpZ2h0IHBvbHltb3JwaGljIGNvbnZlcnNpb24iKTsKICAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgTWF0Y2hlclQ8VCwgUDE+KFBhcmFtMSkpOwogICB9CiAKQEAgLTk5MSw4ICs5NTksOCBAQAogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICBvcGVyYXRvciBNYXRjaGVyPFQ+KCkgY29uc3QgewotICAgIFRPT0xJTkdfQ09NUElMRV9BU1NFUlQoKFR5cGVMaXN0Q29udGFpbnNTdXBlck9mPFJldHVyblR5cGVzLCBUPjo6dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfcG9seW1vcnBoaWNfY29udmVyc2lvbik7CisgICAgc3RhdGljX2Fzc2VydChUeXBlTGlzdENvbnRhaW5zU3VwZXJPZjxSZXR1cm5UeXBlcywgVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInJpZ2h0IHBvbHltb3JwaGljIGNvbnZlcnNpb24iKTsKICAgICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgTWF0Y2hlclQ8VCwgUDEsIFAyPihQYXJhbTEsIFBhcmFtMikpOwogICB9CiAKQEAgLTEwMTgsNyArOTg2LDcgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogY2xhc3MgVHJ1ZU1hdGNoZXIgOiBwdWJsaWMgU2luZ2xlTm9kZU1hdGNoZXJJbnRlcmZhY2U8VD4gIHsKIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIG1hdGNoZXNOb2RlKGNvbnN0IFQgJk5vZGUpIGNvbnN0IHsKKyAgYm9vbCBtYXRjaGVzTm9kZShjb25zdCBUICZOb2RlKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIH07CkBAIC0xMDMzLDkgKzEwMDEsOCBAQAogICBJZE1hdGNoZXIoU3RyaW5nUmVmIElELCBjb25zdCBNYXRjaGVyPFQ+ICZJbm5lck1hdGNoZXIpCiAgICAgICA6IElEKElEKSwgSW5uZXJNYXRjaGVyKElubmVyTWF0Y2hlcikge30KIAotICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyhjb25zdCBUICZOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IHsKKyAgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBib29sIFJlc3VsdCA9IElubmVyTWF0Y2hlci5tYXRjaGVzKE5vZGUsIEZpbmRlciwgQnVpbGRlcik7CiAgICAgaWYgKFJlc3VsdCkgewogICAgICAgQnVpbGRlci0+c2V0QmluZGluZyhJRCwgJk5vZGUpOwpAQCAtMTA3NCwxNSArMTA0MSwxNSBAQAogLy8vIENoaWxkVCBtdXN0IGJlIGFuIEFTVCBiYXNlIHR5cGUuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ2hpbGRUPgogY2xhc3MgSGFzTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKLSAgVE9PTElOR19DT01QSUxFX0FTU0VSVChJc0Jhc2VUeXBlPENoaWxkVD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19vbmx5X2FjY2VwdHNfYmFzZV90eXBlX21hdGNoZXIpOworICBzdGF0aWNfYXNzZXJ0KElzQmFzZVR5cGU8Q2hpbGRUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgImhhcyBvbmx5IGFjY2VwdHMgYmFzZSB0eXBlIG1hdGNoZXIiKTsKKwogcHVibGljOgogICBleHBsaWNpdCBIYXNNYXRjaGVyKGNvbnN0IE1hdGNoZXI8Q2hpbGRUPiAmQ2hpbGRNYXRjaGVyKQogICAgICAgOiBDaGlsZE1hdGNoZXIoQ2hpbGRNYXRjaGVyKSB7fQogCi0gIHZpcnR1YWwgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBGaW5kZXItPm1hdGNoZXNDaGlsZE9mKAogICAgICAgICBOb2RlLCBDaGlsZE1hdGNoZXIsIEJ1aWxkZXIsCiAgICAgICAgIEFTVE1hdGNoRmluZGVyOjpUS19JZ25vcmVJbXBsaWNpdENhc3RzQW5kUGFyZW50aGVzZXMsCkBAIC0xMTAwLDE1ICsxMDY3LDE1IEBACiAvLy8gZm9yIGVhY2ggY2hpbGQgdGhhdCBtYXRjaGVzLgogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENoaWxkVD4KIGNsYXNzIEZvckVhY2hNYXRjaGVyIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewotICBUT09MSU5HX0NPTVBJTEVfQVNTRVJUKElzQmFzZVR5cGU8Q2hpbGRUPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZm9yX2VhY2hfb25seV9hY2NlcHRzX2Jhc2VfdHlwZV9tYXRjaGVyKTsKKyAgc3RhdGljX2Fzc2VydChJc0Jhc2VUeXBlPENoaWxkVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJmb3IgZWFjaCBvbmx5IGFjY2VwdHMgYmFzZSB0eXBlIG1hdGNoZXIiKTsKKwogIHB1YmxpYzoKICAgZXhwbGljaXQgRm9yRWFjaE1hdGNoZXIoY29uc3QgTWF0Y2hlcjxDaGlsZFQ+ICZDaGlsZE1hdGNoZXIpCiAgICAgICA6IENoaWxkTWF0Y2hlcihDaGlsZE1hdGNoZXIpIHt9CiAKLSAgdmlydHVhbCBib29sIG1hdGNoZXMoY29uc3QgVCYgTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXIqIEZpbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyKiBCdWlsZGVyKSBjb25zdCB7CisgIGJvb2wgbWF0Y2hlcyhjb25zdCBUJiBOb2RlLCBBU1RNYXRjaEZpbmRlciogRmluZGVyLAorICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyKiBCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIEZpbmRlci0+bWF0Y2hlc0NoaWxkT2YoCiAgICAgICBOb2RlLCBDaGlsZE1hdGNoZXIsIEJ1aWxkZXIsCiAgICAgICBBU1RNYXRjaEZpbmRlcjo6VEtfSWdub3JlSW1wbGljaXRDYXN0c0FuZFBhcmVudGhlc2VzLApAQCAtMTExOSwzOCArMTA4Niw2IEBACiAgIGNvbnN0IE1hdGNoZXI8Q2hpbGRUPiBDaGlsZE1hdGNoZXI7CiB9OwogCi0vLy8gXGJyaWVmIE1hdGNoZXMgbm9kZXMgb2YgdHlwZSBUIGlmIHRoZSBnaXZlbiBNYXRjaGVyPFQ+IGRvZXMgbm90IG1hdGNoLgotLy8vCi0vLy8gVHlwZSBhcmd1bWVudCBNYXRjaGVyVCBpcyByZXF1aXJlZCBieSBQb2x5bW9ycGhpY01hdGNoZXJXaXRoUGFyYW0xCi0vLy8gYnV0IG5vdCBhY3R1YWxseSB1c2VkLiBJdCB3aWxsIGFsd2F5cyBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIHR5cGUKLS8vLyBjb252ZXJ0aWJsZSB0byBNYXRjaGVyPFQ+LgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE1hdGNoZXJUPgotY2xhc3MgTm90TWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFQ+IHsKLXB1YmxpYzoKLSAgZXhwbGljaXQgTm90TWF0Y2hlcihjb25zdCBNYXRjaGVyPFQ+ICZJbm5lck1hdGNoZXIpCi0gICAgICA6IElubmVyTWF0Y2hlcihJbm5lck1hdGNoZXIpIHt9Ci0KLSAgdmlydHVhbCBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCB7Ci0gICAgLy8gVGhlICd1bmxlc3MnIG1hdGNoZXIgd2lsbCBhbHdheXMgZGlzY2FyZCB0aGUgcmVzdWx0OgotICAgIC8vIElmIHRoZSBpbm5lciBtYXRjaGVyIGRvZXNuJ3QgbWF0Y2gsIHVubGVzcyByZXR1cm5zIHRydWUsCi0gICAgLy8gYnV0IHRoZSBpbm5lciBtYXRjaGVyIGNhbm5vdCBoYXZlIGJvdW5kIGFueXRoaW5nLgotICAgIC8vIElmIHRoZSBpbm5lciBtYXRjaGVyIG1hdGNoZXMsIHRoZSByZXN1bHQgaXMgZmFsc2UsIGFuZAotICAgIC8vIGFueSBwb3NzaWJsZSBiaW5kaW5nIHdpbGwgYmUgZGlzY2FyZGVkLgotICAgIC8vIFdlIHN0aWxsIG5lZWQgdG8gaGFuZCBpbiBhbGwgdGhlIGJvdW5kIG5vZGVzIHVwIHRvIHRoaXMKLSAgICAvLyBwb2ludCBzbyB0aGUgaW5uZXIgbWF0Y2hlciBjYW4gZGVwZW5kIG9uIGJvdW5kIG5vZGVzLAotICAgIC8vIGFuZCB3ZSBuZWVkIHRvIGFjdGl2ZWx5IGRpc2NhcmQgdGhlIGJvdW5kIG5vZGVzLCBvdGhlcndpc2UKLSAgICAvLyB0aGUgaW5uZXIgbWF0Y2hlciB3aWxsIHJlc2V0IHRoZSBib3VuZCBub2RlcyBpZiBpdCBkb2Vzbid0Ci0gICAgLy8gbWF0Y2gsIGJ1dCB0aGlzIHdvdWxkIGJlIGludmVyc2VkIGJ5ICd1bmxlc3MnLgotICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciBEaXNjYXJkKCpCdWlsZGVyKTsKLSAgICByZXR1cm4gIUlubmVyTWF0Y2hlci5tYXRjaGVzKE5vZGUsIEZpbmRlciwgJkRpc2NhcmQpOwotICB9Ci0KLXByaXZhdGU6Ci0gIGNvbnN0IE1hdGNoZXI8VD4gSW5uZXJNYXRjaGVyOwotfTsKLQogLy8vIFxicmllZiBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlciByZWxhdGVkIHR5cGVzLgogLy8vIEB7CiAKQEAgLTExNjUsMjIgKzExMDAsMTggQEAKIGNsYXNzIFZhcmlhZGljT3BlcmF0b3JNYXRjaGVySW50ZXJmYWNlIDogcHVibGljIE1hdGNoZXJJbnRlcmZhY2U8VD4gewogcHVibGljOgogICBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlckludGVyZmFjZShWYXJpYWRpY09wZXJhdG9yRnVuY3Rpb24gRnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgTWF0Y2hlcjxUPiAqPiBJbnB1dE1hdGNoZXJzKQotICAgICAgOiBGdW5jKEZ1bmMpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IElucHV0TWF0Y2hlcnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgewotICAgICAgSW5uZXJNYXRjaGVycy5wdXNoX2JhY2soKklucHV0TWF0Y2hlcnNbaV0pOwotICAgIH0KLSAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEeW5UeXBlZE1hdGNoZXI+IElubmVyTWF0Y2hlcnMpCisgICAgICA6IEZ1bmMoRnVuYyksIElubmVyTWF0Y2hlcnMoc3RkOjptb3ZlKElubmVyTWF0Y2hlcnMpKSB7fQogCi0gIHZpcnR1YWwgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBGdW5jKGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlOjpjcmVhdGUoTm9kZSksIEZpbmRlciwgQnVpbGRlciwKICAgICAgICAgICAgICAgICBJbm5lck1hdGNoZXJzKTsKICAgfQogCiBwcml2YXRlOgogICBjb25zdCBWYXJpYWRpY09wZXJhdG9yRnVuY3Rpb24gRnVuYzsKLSAgc3RkOjp2ZWN0b3I8RHluVHlwZWRNYXRjaGVyPiBJbm5lck1hdGNoZXJzOworICBjb25zdCBzdGQ6OnZlY3RvcjxEeW5UeXBlZE1hdGNoZXI+IElubmVyTWF0Y2hlcnM7CiB9OwogCiAvLy8gXGJyaWVmICJObyBhcmd1bWVudCIgcGxhY2Vob2xkZXIgdG8gdXNlIGFzIHRlbXBsYXRlIHBhcmF0ZW1lcnMuCkBAIC0xMTkyLDE0ICsxMTIzLDE0IEBACiAvLy8gSW5wdXQgbWF0Y2hlcnMgY2FuIGhhdmUgYW55IHR5cGUgKGluY2x1ZGluZyBvdGhlciBwb2x5bW9ycGhpYyBtYXRjaGVyCiAvLy8gdHlwZXMpLCBhbmQgdGhlIGFjdHVhbCBNYXRjaGVyPFQ+IGlzIGdlbmVyYXRlZCBvbiBkZW1hbmQgd2l0aCBhbiBpbXBsaWNpdAogLy8vIGNvdmVyc2lvbiBvcGVyYXRvci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBQMSwgdHlwZW5hbWUgUDIsCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUDEsIHR5cGVuYW1lIFAyID0gVmFyaWFkaWNPcGVyYXRvck5vQXJnLAogICAgICAgICAgIHR5cGVuYW1lIFAzID0gVmFyaWFkaWNPcGVyYXRvck5vQXJnLAogICAgICAgICAgIHR5cGVuYW1lIFA0ID0gVmFyaWFkaWNPcGVyYXRvck5vQXJnLAogICAgICAgICAgIHR5cGVuYW1lIFA1ID0gVmFyaWFkaWNPcGVyYXRvck5vQXJnPgogY2xhc3MgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXIgewogcHVibGljOgogICBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlcihWYXJpYWRpY09wZXJhdG9yRnVuY3Rpb24gRnVuYywgY29uc3QgUDEgJlBhcmFtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUDIgJlBhcmFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUDIgJlBhcmFtMiA9IFZhcmlhZGljT3BlcmF0b3JOb0FyZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQMyAmUGFyYW0zID0gVmFyaWFkaWNPcGVyYXRvck5vQXJnKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFA0ICZQYXJhbTQgPSBWYXJpYWRpY09wZXJhdG9yTm9BcmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUDUgJlBhcmFtNSA9IFZhcmlhZGljT3BlcmF0b3JOb0FyZygpKQpAQCAtMTIwNywzMSArMTEzOCwyNyBAQAogICAgICAgICBQYXJhbTQoUGFyYW00KSwgUGFyYW01KFBhcmFtNSkge30KIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gb3BlcmF0b3IgTWF0Y2hlcjxUPigpIGNvbnN0IHsKLSAgICBNYXRjaGVyPFQ+ICpBcnJheVs1XTsKLSAgICBzaXplX3QgU2l6ZSA9IDA7Ci0KLSAgICBhZGRNYXRjaGVyPFQ+KFBhcmFtMSwgQXJyYXksIFNpemUpOwotICAgIGFkZE1hdGNoZXI8VD4oUGFyYW0yLCBBcnJheSwgU2l6ZSk7Ci0gICAgYWRkTWF0Y2hlcjxUPihQYXJhbTMsIEFycmF5LCBTaXplKTsKLSAgICBhZGRNYXRjaGVyPFQ+KFBhcmFtNCwgQXJyYXksIFNpemUpOwotICAgIGFkZE1hdGNoZXI8VD4oUGFyYW01LCBBcnJheSwgU2l6ZSk7Ci0gICAgTWF0Y2hlcjxUPiBSZXN1bHQobmV3IFZhcmlhZGljT3BlcmF0b3JNYXRjaGVySW50ZXJmYWNlPFQ+KAotICAgICAgICBGdW5jLCBBcnJheVJlZjxjb25zdCBNYXRjaGVyPFQ+ICo+KEFycmF5LCBTaXplKSkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gU2l6ZTsgaSAhPSBlOyArK2kpIGRlbGV0ZSBBcnJheVtpXTsKLSAgICByZXR1cm4gUmVzdWx0OworICAgIHN0ZDo6dmVjdG9yPER5blR5cGVkTWF0Y2hlcj4gTWF0Y2hlcnM7CisgICAgYWRkTWF0Y2hlcjxUPihQYXJhbTEsIE1hdGNoZXJzKTsKKyAgICBhZGRNYXRjaGVyPFQ+KFBhcmFtMiwgTWF0Y2hlcnMpOworICAgIGFkZE1hdGNoZXI8VD4oUGFyYW0zLCBNYXRjaGVycyk7CisgICAgYWRkTWF0Y2hlcjxUPihQYXJhbTQsIE1hdGNoZXJzKTsKKyAgICBhZGRNYXRjaGVyPFQ+KFBhcmFtNSwgTWF0Y2hlcnMpOworICAgIHJldHVybiBNYXRjaGVyPFQ+KAorICAgICAgICBuZXcgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXJJbnRlcmZhY2U8VD4oRnVuYywgc3RkOjptb3ZlKE1hdGNoZXJzKSkpOwogICB9CiAKIHByaXZhdGU6CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVyKGNvbnN0IE1hdGNoZXI8VD4gJk0sIE1hdGNoZXI8VD4gKipBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgJlNpemUpIHsKLSAgICBBcnJheVtTaXplKytdID0gbmV3IE1hdGNoZXI8VD4oTSk7CisgIHN0YXRpYyB2b2lkIGFkZE1hdGNoZXIoY29uc3QgTWF0Y2hlcjxUPiAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEeW5UeXBlZE1hdGNoZXI+ICZNYXRjaGVycykgeworICAgIE1hdGNoZXJzLnB1c2hfYmFjayhNKTsKICAgfQogCiAgIC8vLyBcYnJpZWYgT3ZlcmxvYWQgdG8gaWdub3JlIFxjIFZhcmlhZGljT3BlcmF0b3JOb0FyZyBhcmd1bWVudHMuCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdGF0aWMgdm9pZCBhZGRNYXRjaGVyKFZhcmlhZGljT3BlcmF0b3JOb0FyZywgTWF0Y2hlcjxUPiAqKkFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAmU2l6ZSkge30KKyAgc3RhdGljIHZvaWQgYWRkTWF0Y2hlcihWYXJpYWRpY09wZXJhdG9yTm9BcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RHluVHlwZWRNYXRjaGVyPiAmTWF0Y2hlcnMpIHt9CiAKICAgY29uc3QgVmFyaWFkaWNPcGVyYXRvckZ1bmN0aW9uIEZ1bmM7CiAgIGNvbnN0IFAxIFBhcmFtMTsKQEAgLTEyNDQsMjYgKzExNzEsMzggQEAKIC8vLyBcYnJpZWYgT3ZlcmxvYWRlZCBmdW5jdGlvbiBvYmplY3QgdG8gZ2VuZXJhdGUgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXIKIC8vLyAgIG9iamVjdHMgZnJvbSBhcmJpdHJhcnkgbWF0Y2hlcnMuCiAvLy8KLS8vLyBJdCBzdXBwb3J0cyAyLTUgYXJndW1lbnQgb3ZlcmxvYWRlZCBvcGVyYXRvcigpLiBNb3JlIGNhbiBiZSBhZGRlZCBpZiBuZWVkZWQuCisvLy8gSXQgc3VwcG9ydHMgMS01IGFyZ3VtZW50IG92ZXJsb2FkZWQgb3BlcmF0b3IoKS4gTW9yZSBjYW4gYmUgYWRkZWQgaWYgbmVlZGVkLgordGVtcGxhdGUgPHVuc2lnbmVkIE1pbkNvdW50LCB1bnNpZ25lZCBNYXhDb3VudD4KIHN0cnVjdCBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlckZ1bmMgewogICBWYXJpYWRpY09wZXJhdG9yRnVuY3Rpb24gRnVuYzsKIAorICB0ZW1wbGF0ZSA8dW5zaWduZWQgQ291bnQsIHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBFbmFibGVJZlZhbGlkQXJpdHkKKyAgICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX2lmPE1pbkNvdW50IDw9IENvdW50ICYmIENvdW50IDw9IE1heENvdW50LCBUPiB7fTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTTE+CisgIHR5cGVuYW1lIEVuYWJsZUlmVmFsaWRBcml0eTwxLCBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlcjxNMT4gPjo6dHlwZQorICBvcGVyYXRvcigpKGNvbnN0IE0xICZQMSkgY29uc3QgeworICAgIHJldHVybiBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlcjxNMT4oRnVuYywgUDEpOworICB9CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTI+Ci0gIFZhcmlhZGljT3BlcmF0b3JNYXRjaGVyPE0xLCBNMj4gb3BlcmF0b3IoKShjb25zdCBNMSAmUDEsIGNvbnN0IE0yICZQMikgY29uc3QgeworICB0eXBlbmFtZSBFbmFibGVJZlZhbGlkQXJpdHk8MiwgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXI8TTEsIE0yPiA+Ojp0eXBlCisgIG9wZXJhdG9yKCkoY29uc3QgTTEgJlAxLCBjb25zdCBNMiAmUDIpIGNvbnN0IHsKICAgICByZXR1cm4gVmFyaWFkaWNPcGVyYXRvck1hdGNoZXI8TTEsIE0yPihGdW5jLCBQMSwgUDIpOwogICB9CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBNMSwgdHlwZW5hbWUgTTIsIHR5cGVuYW1lIE0zPgotICBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlcjxNMSwgTTIsIE0zPiBvcGVyYXRvcigpKGNvbnN0IE0xICZQMSwgY29uc3QgTTIgJlAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE0zICZQMykgY29uc3QgeworICB0eXBlbmFtZSBFbmFibGVJZlZhbGlkQXJpdHk8MywgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXI8TTEsIE0yLCBNMz4gPjo6dHlwZQorICBvcGVyYXRvcigpKGNvbnN0IE0xICZQMSwgY29uc3QgTTIgJlAyLCBjb25zdCBNMyAmUDMpIGNvbnN0IHsKICAgICByZXR1cm4gVmFyaWFkaWNPcGVyYXRvck1hdGNoZXI8TTEsIE0yLCBNMz4oRnVuYywgUDEsIFAyLCBQMyk7CiAgIH0KICAgdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00PgotICBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlcjxNMSwgTTIsIE0zLCBNND4KKyAgdHlwZW5hbWUgRW5hYmxlSWZWYWxpZEFyaXR5PDQsIFZhcmlhZGljT3BlcmF0b3JNYXRjaGVyPE0xLCBNMiwgTTMsIE00PiA+Ojp0eXBlCiAgIG9wZXJhdG9yKCkoY29uc3QgTTEgJlAxLCBjb25zdCBNMiAmUDIsIGNvbnN0IE0zICZQMywgY29uc3QgTTQgJlA0KSBjb25zdCB7CiAgICAgcmV0dXJuIFZhcmlhZGljT3BlcmF0b3JNYXRjaGVyPE0xLCBNMiwgTTMsIE00PihGdW5jLCBQMSwgUDIsIFAzLCBQNCk7CiAgIH0KICAgdGVtcGxhdGUgPHR5cGVuYW1lIE0xLCB0eXBlbmFtZSBNMiwgdHlwZW5hbWUgTTMsIHR5cGVuYW1lIE00LCB0eXBlbmFtZSBNNT4KLSAgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXI8TTEsIE0yLCBNMywgTTQsIE01PgorICB0eXBlbmFtZSBFbmFibGVJZlZhbGlkQXJpdHk8CisgICAgICA1LCBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlcjxNMSwgTTIsIE0zLCBNNCwgTTU+ID46OnR5cGUKICAgb3BlcmF0b3IoKShjb25zdCBNMSAmUDEsIGNvbnN0IE0yICZQMiwgY29uc3QgTTMgJlAzLCBjb25zdCBNNCAmUDQsCiAgICAgICAgICAgICAgY29uc3QgTTUgJlA1KSBjb25zdCB7CiAgICAgcmV0dXJuIFZhcmlhZGljT3BlcmF0b3JNYXRjaGVyPE0xLCBNMiwgTTMsIE00LCBNNT4oRnVuYywgUDEsIFAyLCBQMywgUDQsCkBAIC0xMjczLDYgKzEyMTIsMTMgQEAKIAogLy8vIEB9CiAKKy8vLyBcYnJpZWYgTWF0Y2hlcyBub2RlcyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgbWF0Y2hlci4KKy8vLworLy8vIFVzZXMgdGhlIHZhcmlhZGljIG1hdGNoZXIgaW50ZXJmYWNlLCBidXQgZmFpbHMgaWYgSW5uZXJNYXRjaGVycy5zaXplKCkhPTEuCitib29sIE5vdFVuYXJ5T3BlcmF0b3IoY29uc3QgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgRHluTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlciAqRmluZGVyLCBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RHluVHlwZWRNYXRjaGVyPiBJbm5lck1hdGNoZXJzKTsKKwogLy8vIFxicmllZiBNYXRjaGVzIG5vZGVzIGZvciB3aGljaCBhbGwgcHJvdmlkZWQgbWF0Y2hlcnMgbWF0Y2guCiBib29sIEFsbE9mVmFyaWFkaWNPcGVyYXRvcihjb25zdCBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZSBEeW5Ob2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKQEAgLTEyOTMsMTIgKzEyMzksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPER5blR5cGVkTWF0Y2hlcj4gSW5uZXJNYXRjaGVycyk7CiAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIE1hdGNoZXI8VD4gRHluVHlwZWRNYXRjaGVyOjp1bmNvbmRpdGlvbmFsQ29udmVydFRvKCkgY29uc3QgeworICByZXR1cm4gTWF0Y2hlcjxUPihuZXcgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXJJbnRlcmZhY2U8VD4oCisgICAgICBBbGxPZlZhcmlhZGljT3BlcmF0b3IsIGxsdm06Om1ha2VBcnJheVJlZigqdGhpcykpKTsKK30KKwogLy8vIFxicmllZiBDcmVhdGVzIGEgTWF0Y2hlcjxUPiB0aGF0IG1hdGNoZXMgaWYgYWxsIGlubmVyIG1hdGNoZXJzIG1hdGNoLgogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIEJpbmRhYmxlTWF0Y2hlcjxUPiBtYWtlQWxsT2ZDb21wb3NpdGUoCiAgICAgQXJyYXlSZWY8Y29uc3QgTWF0Y2hlcjxUPiAqPiBJbm5lck1hdGNoZXJzKSB7CisgIHN0ZDo6dmVjdG9yPER5blR5cGVkTWF0Y2hlcj4gRHluTWF0Y2hlcnM7CisgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gSW5uZXJNYXRjaGVycy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgRHluTWF0Y2hlcnMucHVzaF9iYWNrKCpJbm5lck1hdGNoZXJzW2ldKTsKKyAgfQogICByZXR1cm4gQmluZGFibGVNYXRjaGVyPFQ+KG5ldyBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlckludGVyZmFjZTxUPigKLSAgICAgIEFsbE9mVmFyaWFkaWNPcGVyYXRvciwgSW5uZXJNYXRjaGVycykpOworICAgICAgQWxsT2ZWYXJpYWRpY09wZXJhdG9yLCBzdGQ6Om1vdmUoRHluTWF0Y2hlcnMpKSk7CiB9CiAKIC8vLyBcYnJpZWYgQ3JlYXRlcyBhIE1hdGNoZXI8VD4gdGhhdCBtYXRjaGVzIGlmCkBAIC0xMzIwLDE1ICsxMjc2LDE1IEBACiAvLy8gRGVzY2VuZGFudFQgbXVzdCBiZSBhbiBBU1QgYmFzZSB0eXBlLgogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERlc2NlbmRhbnRUPgogY2xhc3MgSGFzRGVzY2VuZGFudE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gIFRPT0xJTkdfQ09NUElMRV9BU1NFUlQoSXNCYXNlVHlwZTxEZXNjZW5kYW50VD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19kZXNjZW5kYW50X29ubHlfYWNjZXB0c19iYXNlX3R5cGVfbWF0Y2hlcik7CisgIHN0YXRpY19hc3NlcnQoSXNCYXNlVHlwZTxEZXNjZW5kYW50VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJoYXMgZGVzY2VuZGFudCBvbmx5IGFjY2VwdHMgYmFzZSB0eXBlIG1hdGNoZXIiKTsKKwogcHVibGljOgogICBleHBsaWNpdCBIYXNEZXNjZW5kYW50TWF0Y2hlcihjb25zdCBNYXRjaGVyPERlc2NlbmRhbnRUPiAmRGVzY2VuZGFudE1hdGNoZXIpCiAgICAgICA6IERlc2NlbmRhbnRNYXRjaGVyKERlc2NlbmRhbnRNYXRjaGVyKSB7fQogCi0gIHZpcnR1YWwgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBGaW5kZXItPm1hdGNoZXNEZXNjZW5kYW50T2YoCiAgICAgICAgIE5vZGUsIERlc2NlbmRhbnRNYXRjaGVyLCBCdWlsZGVyLCBBU1RNYXRjaEZpbmRlcjo6QktfRmlyc3QpOwogICB9CkBAIC0xMzQzLDE1ICsxMjk5LDE1IEBACiAvLy8gXGMgUGFyZW50VCBtdXN0IGJlIGFuIEFTVCBiYXNlIHR5cGUuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUGFyZW50VD4KIGNsYXNzIEhhc1BhcmVudE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gIFRPT0xJTkdfQ09NUElMRV9BU1NFUlQoSXNCYXNlVHlwZTxQYXJlbnRUPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGFzX3BhcmVudF9vbmx5X2FjY2VwdHNfYmFzZV90eXBlX21hdGNoZXIpOworICBzdGF0aWNfYXNzZXJ0KElzQmFzZVR5cGU8UGFyZW50VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJoYXMgcGFyZW50IG9ubHkgYWNjZXB0cyBiYXNlIHR5cGUgbWF0Y2hlciIpOworCiBwdWJsaWM6CiAgIGV4cGxpY2l0IEhhc1BhcmVudE1hdGNoZXIoY29uc3QgTWF0Y2hlcjxQYXJlbnRUPiAmUGFyZW50TWF0Y2hlcikKICAgICAgIDogUGFyZW50TWF0Y2hlcihQYXJlbnRNYXRjaGVyKSB7fQogCi0gIHZpcnR1YWwgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBGaW5kZXItPm1hdGNoZXNBbmNlc3Rvck9mKAogICAgICAgICBOb2RlLCBQYXJlbnRNYXRjaGVyLCBCdWlsZGVyLCBBU1RNYXRjaEZpbmRlcjo6QU1NX1BhcmVudE9ubHkpOwogICB9CkBAIC0xMzY2LDE1ICsxMzIyLDE1IEBACiAvLy8gXGMgQW5jZXN0b3JUIG11c3QgYmUgYW4gQVNUIGJhc2UgdHlwZS4KIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbmNlc3RvclQ+CiBjbGFzcyBIYXNBbmNlc3Rvck1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gIFRPT0xJTkdfQ09NUElMRV9BU1NFUlQoSXNCYXNlVHlwZTxBbmNlc3RvclQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfYW5jZXN0b3Jfb25seV9hY2NlcHRzX2Jhc2VfdHlwZV9tYXRjaGVyKTsKKyAgc3RhdGljX2Fzc2VydChJc0Jhc2VUeXBlPEFuY2VzdG9yVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJoYXMgYW5jZXN0b3Igb25seSBhY2NlcHRzIGJhc2UgdHlwZSBtYXRjaGVyIik7CisKIHB1YmxpYzoKICAgZXhwbGljaXQgSGFzQW5jZXN0b3JNYXRjaGVyKGNvbnN0IE1hdGNoZXI8QW5jZXN0b3JUPiAmQW5jZXN0b3JNYXRjaGVyKQogICAgICAgOiBBbmNlc3Rvck1hdGNoZXIoQW5jZXN0b3JNYXRjaGVyKSB7fQogCi0gIHZpcnR1YWwgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBGaW5kZXItPm1hdGNoZXNBbmNlc3Rvck9mKAogICAgICAgICBOb2RlLCBBbmNlc3Rvck1hdGNoZXIsIEJ1aWxkZXIsIEFTVE1hdGNoRmluZGVyOjpBTU1fQWxsKTsKICAgfQpAQCAtMTM5MSwxNiArMTM0NywxNiBAQAogLy8vIGZvciBlYWNoIGRlc2NlbmRhbnQgbm9kZSB0aGF0IG1hdGNoZXMgaW5zdGVhZCBvZiBvbmx5IGZvciB0aGUgZmlyc3QuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRGVzY2VuZGFudFQ+CiBjbGFzcyBGb3JFYWNoRGVzY2VuZGFudE1hdGNoZXIgOiBwdWJsaWMgTWF0Y2hlckludGVyZmFjZTxUPiB7Ci0gIFRPT0xJTkdfQ09NUElMRV9BU1NFUlQoSXNCYXNlVHlwZTxEZXNjZW5kYW50VD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvcl9lYWNoX2Rlc2NlbmRhbnRfb25seV9hY2NlcHRzX2Jhc2VfdHlwZV9tYXRjaGVyKTsKKyAgc3RhdGljX2Fzc2VydChJc0Jhc2VUeXBlPERlc2NlbmRhbnRUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgImZvciBlYWNoIGRlc2NlbmRhbnQgb25seSBhY2NlcHRzIGJhc2UgdHlwZSBtYXRjaGVyIik7CisKICBwdWJsaWM6CiAgIGV4cGxpY2l0IEZvckVhY2hEZXNjZW5kYW50TWF0Y2hlcigKICAgICAgIGNvbnN0IE1hdGNoZXI8RGVzY2VuZGFudFQ+JiBEZXNjZW5kYW50TWF0Y2hlcikKICAgICAgIDogRGVzY2VuZGFudE1hdGNoZXIoRGVzY2VuZGFudE1hdGNoZXIpIHt9CiAKLSAgdmlydHVhbCBib29sIG1hdGNoZXMoY29uc3QgVCYgTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXIqIEZpbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyKiBCdWlsZGVyKSBjb25zdCB7CisgIGJvb2wgbWF0Y2hlcyhjb25zdCBUJiBOb2RlLCBBU1RNYXRjaEZpbmRlciogRmluZGVyLAorICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyKiBCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIEZpbmRlci0+bWF0Y2hlc0Rlc2NlbmRhbnRPZihOb2RlLCBEZXNjZW5kYW50TWF0Y2hlciwgQnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyOjpCS19BbGwpOwogICB9CkBAIC0xNDEzLDE3ICsxMzY5LDE3IEBACiAvLy8gdGhlIHZhbHVlIHRoZSBWYWx1ZUVxdWFsc01hdGNoZXIgd2FzIGNvbnN0cnVjdGVkIHdpdGguCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVmFsdWVUPgogY2xhc3MgVmFsdWVFcXVhbHNNYXRjaGVyIDogcHVibGljIFNpbmdsZU5vZGVNYXRjaGVySW50ZXJmYWNlPFQ+IHsKLSAgVE9PTElOR19DT01QSUxFX0FTU0VSVCgobGx2bTo6aXNfYmFzZV9vZjxDaGFyYWN0ZXJMaXRlcmFsLCBUPjo6dmFsdWUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjppc19iYXNlX29mPENYWEJvb2xMaXRlcmFsRXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ+Ojp2YWx1ZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmlzX2Jhc2Vfb2Y8RmxvYXRpbmdMaXRlcmFsLCBUPjo6dmFsdWUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjppc19iYXNlX29mPEludGVnZXJMaXRlcmFsLCBUPjo6dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZV9ub2RlX211c3RfaGF2ZV9hX2dldFZhbHVlX21ldGhvZCk7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPENoYXJhY3RlckxpdGVyYWwsIFQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxDWFhCb29sTGl0ZXJhbEV4cHIsIFQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxGbG9hdGluZ0xpdGVyYWwsIFQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxJbnRlZ2VyTGl0ZXJhbCwgVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJ0aGUgbm9kZSBtdXN0IGhhdmUgYSBnZXRWYWx1ZSBtZXRob2QiKTsKKwogcHVibGljOgogICBleHBsaWNpdCBWYWx1ZUVxdWFsc01hdGNoZXIoY29uc3QgVmFsdWVUICZFeHBlY3RlZFZhbHVlKQogICAgICAgOiBFeHBlY3RlZFZhbHVlKEV4cGVjdGVkVmFsdWUpIHt9CiAKLSAgdmlydHVhbCBib29sIG1hdGNoZXNOb2RlKGNvbnN0IFQgJk5vZGUpIGNvbnN0IHsKKyAgYm9vbCBtYXRjaGVzTm9kZShjb25zdCBUICZOb2RlKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIE5vZGUuZ2V0VmFsdWUoKSA9PSBFeHBlY3RlZFZhbHVlOwogICB9CiAKQEAgLTE0NzgsOSArMTQzNCw4IEBACiAgIGV4cGxpY2l0IExvY01hdGNoZXIoY29uc3QgTWF0Y2hlcjxUPiAmSW5uZXJNYXRjaGVyKQogICAgIDogSW5uZXJNYXRjaGVyKElubmVyTWF0Y2hlcikge30KIAotICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyhjb25zdCBUTG9jICZOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IHsKKyAgYm9vbCBtYXRjaGVzKGNvbnN0IFRMb2MgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBpZiAoIU5vZGUpCiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgcmV0dXJuIElubmVyTWF0Y2hlci5tYXRjaGVzKCpleHRyYWN0KE5vZGUpLCBGaW5kZXIsIEJ1aWxkZXIpOwpAQCAtMTUwMyw5ICsxNDU4LDggQEAKICAgZXhwbGljaXQgVHlwZUxvY1R5cGVNYXRjaGVyKGNvbnN0IE1hdGNoZXI8UXVhbFR5cGU+ICZJbm5lck1hdGNoZXIpCiAgICAgICA6IElubmVyTWF0Y2hlcihJbm5lck1hdGNoZXIpIHt9CiAKLSAgdmlydHVhbCBib29sIG1hdGNoZXMoY29uc3QgVHlwZUxvYyAmTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCB7CisgIGJvb2wgbWF0Y2hlcyhjb25zdCBUeXBlTG9jICZOb2RlLCBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAorICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgaWYgKCFOb2RlKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIHJldHVybiBJbm5lck1hdGNoZXIubWF0Y2hlcyhOb2RlLmdldFR5cGUoKSwgRmluZGVyLCBCdWlsZGVyKTsKQEAgLTE1MjUsOSArMTQ3OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgKFQ6OipUcmF2ZXJzZUZ1bmN0aW9uKSgpIGNvbnN0KQogICAgICAgOiBJbm5lck1hdGNoZXIoSW5uZXJNYXRjaGVyKSwgVHJhdmVyc2VGdW5jdGlvbihUcmF2ZXJzZUZ1bmN0aW9uKSB7fQogCi0gIHZpcnR1YWwgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3QgeworICBib29sIG1hdGNoZXMoY29uc3QgVCAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKKyAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIFF1YWxUeXBlIE5leHROb2RlID0gKE5vZGUuKlRyYXZlcnNlRnVuY3Rpb24pKCk7CiAgICAgaWYgKE5leHROb2RlLmlzTnVsbCgpKQogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTU0OSw5ICsxNTAyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlTG9jIChUOjoqVHJhdmVyc2VGdW5jdGlvbikoKSBjb25zdCkKICAgICAgIDogSW5uZXJNYXRjaGVyKElubmVyTWF0Y2hlciksIFRyYXZlcnNlRnVuY3Rpb24oVHJhdmVyc2VGdW5jdGlvbikge30KIAotICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyhjb25zdCBUICZOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBBU1RNYXRjaEZpbmRlciAqRmluZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IHsKKyAgYm9vbCBtYXRjaGVzKGNvbnN0IFQgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsCisgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBUeXBlTG9jIE5leHROb2RlID0gKE5vZGUuKlRyYXZlcnNlRnVuY3Rpb24pKCk7CiAgICAgaWYgKCFOZXh0Tm9kZSkKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE2MTIsNiArMTU2NCwyNiBAQAogICByZXR1cm4gU2VsZihJbm5lck1hdGNoZXJzKTsKIH0KIAorLy8gRklYTUU6IHVuaWZ5IENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgYW5kIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlJ3MKKy8vIEFQSXMgZm9yIGFjY2Vzc2luZyB0aGUgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4KK2lubGluZSBsbHZtOjpBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PgorZ2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbkFyZ3MoY29uc3QgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAmRCkgeworICByZXR1cm4gRC5nZXRUZW1wbGF0ZUFyZ3MoKS5hc0FycmF5KCk7Cit9CisKK2lubGluZSBsbHZtOjpBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PgorZ2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbkFyZ3MoY29uc3QgVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUgJlQpIHsKKyAgcmV0dXJuIGxsdm06OkFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+KFQuZ2V0QXJncygpLCBULmdldE51bUFyZ3MoKSk7Cit9CisKK3N0cnVjdCBOb3RFcXVhbHNCb3VuZE5vZGVQcmVkaWNhdGUgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgaW50ZXJuYWw6OkJvdW5kTm9kZXNNYXAgJk5vZGVzKSBjb25zdCB7CisgICAgcmV0dXJuIE5vZGVzLmdldE5vZGUoSUQpICE9IE5vZGU7CisgIH0KKyAgc3RkOjpzdHJpbmcgSUQ7CisgIGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlIE5vZGU7Cit9OworCiB9IC8vIGVuZCBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gLy8gZW5kIG5hbWVzcGFjZSBhc3RfbWF0Y2hlcnMKIH0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVyc01hY3Jvcy5oIGIvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVyc01hY3Jvcy5oCmluZGV4IGI1ZDUzMDMuLjQxOGU1NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnNNYWNyb3MuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzTWFjcm9zLmgKQEAgLTM3LDYgKzM3LDI1IEBACiAjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX01BVENIRVJTX0FTVF9NQVRDSEVSU19NQUNST1NfSAogI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9NQVRDSEVSU19BU1RfTUFUQ0hFUlNfTUFDUk9TX0gKIAorLy8vIFxicmllZiBBU1RfTUFUQ0hFUl9GVU5DVElPTl9QKFJldHVyblR5cGUsIERlZmluZU1hdGNoZXIsIFBhcmFtVHlwZSwgUGFyYW0pIHsKKy8vLyBkZWZpbmVzIGEgc2luZ2xlLXBhcmFtZXRlciBmdW5jdGlvbiBuYW1lZCBEZWZpbmVNYXRjaGVyKCkgdGhhdCByZXR1cm5zIGEKKy8vLyBSZXR1cm5UeXBlIG9iamVjdC4KKy8vLworLy8vIFRoZSBjb2RlIGJldHdlZW4gdGhlIGN1cmx5IGJyYWNlcyBoYXMgYWNjZXNzIHRvIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorLy8vCisvLy8gICBQYXJhbTogICAgICAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbjsgaXRzIHR5cGUKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgUGFyYW1UeXBlLgorLy8vCisvLy8gVGhlIGNvZGUgc2hvdWxkIHJldHVybiBhbiBpbnN0YW5jZSBvZiBSZXR1cm5UeXBlLgorI2RlZmluZSBBU1RfTUFUQ0hFUl9GVU5DVElPTl9QKFJldHVyblR5cGUsIERlZmluZU1hdGNoZXIsIFBhcmFtVHlwZSwgUGFyYW0pICAgIFwKKyAgQVNUX01BVENIRVJfRlVOQ1RJT05fUF9PVkVSTE9BRChSZXR1cm5UeXBlLCBEZWZpbmVNYXRjaGVyLCBQYXJhbVR5cGUsIFBhcmFtLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkKKyNkZWZpbmUgQVNUX01BVENIRVJfRlVOQ1RJT05fUF9PVkVSTE9BRChSZXR1cm5UeXBlLCBEZWZpbmVNYXRjaGVyLCBQYXJhbVR5cGUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW0sIE92ZXJsb2FkSWQpICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgUmV0dXJuVHlwZSBEZWZpbmVNYXRjaGVyKGNvbnN0IFBhcmFtVHlwZSAmUGFyYW0pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBSZXR1cm5UeXBlICgmRGVmaW5lTWF0Y2hlciMjX1R5cGUjI092ZXJsb2FkSWQpKGNvbnN0IFBhcmFtVHlwZSAmKTsgICBcCisgIGlubGluZSBSZXR1cm5UeXBlIERlZmluZU1hdGNoZXIoY29uc3QgUGFyYW1UeXBlICZQYXJhbSkKKwogLy8vIFxicmllZiBBU1RfTUFUQ0hFUihUeXBlLCBEZWZpbmVNYXRjaGVyKSB7IC4uLiB9CiAvLy8gZGVmaW5lcyBhIHplcm8gcGFyYW1ldGVyIGZ1bmN0aW9uIG5hbWVkIERlZmluZU1hdGNoZXIoKSB0aGF0IHJldHVybnMgYQogLy8vIE1hdGNoZXI8VHlwZT4gb2JqZWN0LgpAQCAtNTMsOCArNzIsOCBAQAogICBjbGFzcyBtYXRjaGVyXyMjRGVmaW5lTWF0Y2hlciMjTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPFR5cGU+IHsgICAgIFwKICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZXhwbGljaXQgbWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI01hdGNoZXIoKSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKGNvbnN0IFR5cGUgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0OyAgICAgICAgICAgICAgICBcCisgICAgYm9vbCBtYXRjaGVzKGNvbnN0IFR5cGUgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlOyAgICAgICAgICAgICAgIFwKICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBpbmxpbmUgaW50ZXJuYWw6Ok1hdGNoZXI8VHlwZT4gRGVmaW5lTWF0Y2hlcigpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTkwLDggKzEwOSw4IEBACiAgICAgZXhwbGljaXQgbWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXIoICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjb25zdCBQYXJhbVR5cGUgJkEjI1BhcmFtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgOiBQYXJhbShBIyNQYXJhbSkge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdmlydHVhbCBib29sIG1hdGNoZXMoY29uc3QgVHlwZSAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Q7ICAgICAgICAgICAgICAgIFwKKyAgICBib29sIG1hdGNoZXMoY29uc3QgVHlwZSAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgY29uc3QgUGFyYW1UeXBlIFBhcmFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTM1LDggKzE1NCw4IEBACiAgICAgbWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXIoY29uc3QgUGFyYW1UeXBlMSAmQSMjUGFyYW0xLCAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtVHlwZTIgJkEjI1BhcmFtMikgIFwKICAgICAgICAgOiBQYXJhbTEoQSMjUGFyYW0xKSwgUGFyYW0yKEEjI1BhcmFtMikge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdmlydHVhbCBib29sIG1hdGNoZXMoY29uc3QgVHlwZSAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Q7ICAgICAgICAgICAgICAgIFwKKyAgICBib29sIG1hdGNoZXMoY29uc3QgVHlwZSAmTm9kZSwgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgY29uc3QgUGFyYW1UeXBlMSBQYXJhbTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTg0LDggKzIwMyw4IEBACiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBjbGFzcyBtYXRjaGVyXyMjRGVmaW5lTWF0Y2hlciMjTWF0Y2hlciA6IHB1YmxpYyBNYXRjaGVySW50ZXJmYWNlPE5vZGVUeXBlPiB7IFwKICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdmlydHVhbCBib29sIG1hdGNoZXMoY29uc3QgTm9kZVR5cGUgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Q7ICAgICAgICAgICAgICAgIFwKKyAgICBib29sIG1hdGNoZXMoY29uc3QgTm9kZVR5cGUgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7ICAgICAgICAgICAgICAgXAogICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGlubGluZSBpbnRlcm5hbDo6UG9seW1vcnBoaWNNYXRjaGVyV2l0aFBhcmFtMDwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjIzLDggKzI0Miw4IEBACiAgICAgZXhwbGljaXQgbWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXIoICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjb25zdCBQYXJhbVR5cGUgJkEjI1BhcmFtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgOiBQYXJhbShBIyNQYXJhbSkge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdmlydHVhbCBib29sIG1hdGNoZXMoY29uc3QgTm9kZVR5cGUgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Q7ICAgICAgICAgICAgICAgIFwKKyAgICBib29sIG1hdGNoZXMoY29uc3QgTm9kZVR5cGUgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgY29uc3QgUGFyYW1UeXBlIFBhcmFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjcwLDggKzI4OSw4IEBACiAgICAgbWF0Y2hlcl8jI0RlZmluZU1hdGNoZXIjI092ZXJsb2FkSWQjI01hdGNoZXIoY29uc3QgUGFyYW1UeXBlMSAmQSMjUGFyYW0xLCAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtVHlwZTIgJkEjI1BhcmFtMikgIFwKICAgICAgICAgOiBQYXJhbTEoQSMjUGFyYW0xKSwgUGFyYW0yKEEjI1BhcmFtMikge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdmlydHVhbCBib29sIG1hdGNoZXMoY29uc3QgTm9kZVR5cGUgJk5vZGUsIEFTVE1hdGNoRmluZGVyICpGaW5kZXIsICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgY29uc3Q7ICAgICAgICAgICAgICAgIFwKKyAgICAgYm9vbCBtYXRjaGVzKGNvbnN0IE5vZGVUeXBlICZOb2RlLCBBU1RNYXRjaEZpbmRlciAqRmluZGVyLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlOyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgcHJpdmF0ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgY29uc3QgUGFyYW1UeXBlMSBQYXJhbTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL0RpYWdub3N0aWNzLmggYi9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvRGlhZ25vc3RpY3MuaAppbmRleCBhZWMwYzBlLi41MzYyOWJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvRGlhZ25vc3RpY3MuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvRGlhZ25vc3RpY3MuaApAQCAtMTUsMTUgKzE1LDE0IEBACiAjaWZuZGVmIExMVk1fQ0xBTkdfQVNUX01BVENIRVJTX0RZTkFNSUNfRElBR05PU1RJQ1NfSAogI2RlZmluZSBMTFZNX0NMQU5HX0FTVF9NQVRDSEVSU19EWU5BTUlDX0RJQUdOT1NUSUNTX0gKIAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KICNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1ZhcmlhbnRWYWx1ZS5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKICNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgogI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGNsYW5nIHsKIG5hbWVzcGFjZSBhc3RfbWF0Y2hlcnMgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1BhcnNlci5oIGIvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1BhcnNlci5oCmluZGV4IGJiNmFjNzYuLjU5MDE0OTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9QYXJzZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvUGFyc2VyLmgKQEAgLTM0LDYgKzM0LDcgQEAKICNkZWZpbmUgTExWTV9DTEFOR19BU1RfTUFUQ0hFUlNfRFlOQU1JQ19QQVJTRVJfSAogCiAjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9EaWFnbm9zdGljcy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvUmVnaXN0cnkuaCIKICNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1ZhcmlhbnRWYWx1ZS5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKICNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgpAQCAtNjUsNyArNjYsNyBAQAogICAgIC8vLwogICAgIC8vLyBBbGwgdGhlIGFyZ3VtZW50cyBwYXNzZWQgaGVyZSBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuCiAgICAgLy8vCi0gICAgLy8vIFxwYXJhbSBNYXRjaGVyTmFtZSBUaGUgbWF0Y2hlciBuYW1lIGZvdW5kIGJ5IHRoZSBwYXJzZXIuCisgICAgLy8vIFxwYXJhbSBDdG9yIEEgbWF0Y2hlciBjb25zdHJ1Y3RvciBsb29rZWQgdXAgYnkgbG9va3VwTWF0Y2hlckN0b3IuCiAgICAgLy8vCiAgICAgLy8vIFxwYXJhbSBOYW1lUmFuZ2UgVGhlIGxvY2F0aW9uIG9mIHRoZSBuYW1lIGluIHRoZSBtYXRjaGVyIHNvdXJjZS4KICAgICAvLy8gICBVc2VmdWwgZm9yIGVycm9yIHJlcG9ydGluZy4KQEAgLTc4LDExICs3OSwyNSBAQAogICAgIC8vLyBccmV0dXJuIFRoZSBtYXRjaGVyIG9iamVjdHMgY29uc3RydWN0ZWQgYnkgdGhlIHByb2Nlc3Nvciwgb3IgYSBudWxsCiAgICAgLy8vICAgbWF0Y2hlciBpZiBhbiBlcnJvciBvY2N1cnJlZC4gSW4gdGhhdCBjYXNlLCBcYyBFcnJvciB3aWxsIGNvbnRhaW4gYQogICAgIC8vLyAgIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvci4KLSAgICB2aXJ0dWFsIFZhcmlhbnRNYXRjaGVyIGFjdE9uTWF0Y2hlckV4cHJlc3Npb24oU3RyaW5nUmVmIE1hdGNoZXJOYW1lLAorICAgIHZpcnR1YWwgVmFyaWFudE1hdGNoZXIgYWN0T25NYXRjaGVyRXhwcmVzc2lvbihNYXRjaGVyQ3RvciBDdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VSYW5nZSAmTmFtZVJhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQmluZElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZXJWYWx1ZT4gQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3MgKkVycm9yKSA9IDA7CisKKyAgICAvLy8gXGJyaWVmIExvb2sgdXAgYSBtYXRjaGVyIGJ5IG5hbWUuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBNYXRjaGVyTmFtZSBUaGUgbWF0Y2hlciBuYW1lIGZvdW5kIGJ5IHRoZSBwYXJzZXIuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBOYW1lUmFuZ2UgVGhlIGxvY2F0aW9uIG9mIHRoZSBuYW1lIGluIHRoZSBtYXRjaGVyIHNvdXJjZS4KKyAgICAvLy8gICBVc2VmdWwgZm9yIGVycm9yIHJlcG9ydGluZy4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybiBUaGUgbWF0Y2hlciBjb25zdHJ1Y3Rvciwgb3IgT3B0aW9uYWw8TWF0Y2hlckN0b3I+KCkgaWYgYW4gZXJyb3IKKyAgICAvLy8gICBvY2N1cnJlZC4gSW4gdGhhdCBjYXNlLCBcYyBFcnJvciB3aWxsIGNvbnRhaW4gYSBkZXNjcmlwdGlvbiBvZiB0aGUKKyAgICAvLy8gICBlcnJvci4KKyAgICB2aXJ0dWFsIGxsdm06Ok9wdGlvbmFsPE1hdGNoZXJDdG9yPgorICAgIGxvb2t1cE1hdGNoZXJDdG9yKFN0cmluZ1JlZiBNYXRjaGVyTmFtZSwgY29uc3QgU291cmNlUmFuZ2UgJk5hbWVSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpID0gMDsKICAgfTsKIAogICAvLy8gXGJyaWVmIFBhcnNlIGEgbWF0Y2hlciBleHByZXNzaW9uLCBjcmVhdGluZyBtYXRjaGVycyBmcm9tIHRoZSByZWdpc3RyeS4KQEAgLTEyOSw4ICsxNDQsMTYgQEAKICAgc3RhdGljIGJvb2wgcGFyc2VFeHByZXNzaW9uKFN0cmluZ1JlZiBDb2RlLCBTZW1hICpTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFudFZhbHVlICpWYWx1ZSwgRGlhZ25vc3RpY3MgKkVycm9yKTsKIAorICAvLy8gXGJyaWVmIENvbXBsZXRlIGFuIGV4cHJlc3Npb24gYXQgdGhlIGdpdmVuIG9mZnNldC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBsaXN0IG9mIGNvbXBsZXRpb25zLCB3aGljaCBtYXkgYmUgZW1wdHkgaWYgdGhlcmUgYXJlIG5vCisgIC8vLyBhdmFpbGFibGUgY29tcGxldGlvbnMgb3IgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxNYXRjaGVyQ29tcGxldGlvbj4KKyAgY29tcGxldGVFeHByZXNzaW9uKFN0cmluZ1JlZiBDb2RlLCB1bnNpZ25lZCBDb21wbGV0aW9uT2Zmc2V0KTsKKwogcHJpdmF0ZToKICAgY2xhc3MgQ29kZVRva2VuaXplcjsKKyAgc3RydWN0IFNjb3BlZENvbnRleHRFbnRyeTsKICAgc3RydWN0IFRva2VuSW5mbzsKIAogICBQYXJzZXIoQ29kZVRva2VuaXplciAqVG9rZW5pemVyLCBTZW1hICpTLApAQCAtMTM5LDkgKzE2MiwxNyBAQAogICBib29sIHBhcnNlRXhwcmVzc2lvbkltcGwoVmFyaWFudFZhbHVlICpWYWx1ZSk7CiAgIGJvb2wgcGFyc2VNYXRjaGVyRXhwcmVzc2lvbkltcGwoVmFyaWFudFZhbHVlICpWYWx1ZSk7CiAKKyAgdm9pZCBhZGRDb21wbGV0aW9uKGNvbnN0IFRva2VuSW5mbyAmQ29tcFRva2VuLCBTdHJpbmdSZWYgVHlwZWRUZXh0LAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERlY2wpOworICB2b2lkIGFkZEV4cHJlc3Npb25Db21wbGV0aW9ucygpOworCiAgIENvZGVUb2tlbml6ZXIgKmNvbnN0IFRva2VuaXplcjsKICAgU2VtYSAqY29uc3QgUzsKICAgRGlhZ25vc3RpY3MgKmNvbnN0IEVycm9yOworCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPE1hdGNoZXJDdG9yLCB1bnNpZ25lZD4gPiBDb250ZXh0U3RhY2tUeTsKKyAgQ29udGV4dFN0YWNrVHkgQ29udGV4dFN0YWNrOworICBzdGQ6OnZlY3RvcjxNYXRjaGVyQ29tcGxldGlvbj4gQ29tcGxldGlvbnM7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgZHluYW1pYwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1JlZ2lzdHJ5LmggYi9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvUmVnaXN0cnkuaAppbmRleCBjMTEzYzE0Li5kN2RmNjk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvUmVnaXN0cnkuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvUmVnaXN0cnkuaApAQCAtMjEsMjAgKzIxLDcyIEBACiAjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9WYXJpYW50VmFsdWUuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgogCiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIGFzdF9tYXRjaGVycyB7CiBuYW1lc3BhY2UgZHluYW1pYyB7CiAKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBNYXRjaGVyRGVzY3JpcHRvcjsKK30KKwordHlwZWRlZiBjb25zdCBpbnRlcm5hbDo6TWF0Y2hlckRlc2NyaXB0b3IgKk1hdGNoZXJDdG9yOworCitzdHJ1Y3QgTWF0Y2hlckNvbXBsZXRpb24geworICBNYXRjaGVyQ29tcGxldGlvbigpIHt9CisgIE1hdGNoZXJDb21wbGV0aW9uKFN0cmluZ1JlZiBUeXBlZFRleHQsIFN0cmluZ1JlZiBNYXRjaGVyRGVjbCkKKyAgICAgIDogVHlwZWRUZXh0KFR5cGVkVGV4dCksIE1hdGNoZXJEZWNsKE1hdGNoZXJEZWNsKSB7fQorCisgIC8vLyBcYnJpZWYgVGhlIHRleHQgdG8gdHlwZSB0byBzZWxlY3QgdGhpcyBtYXRjaGVyLgorICBzdGQ6OnN0cmluZyBUeXBlZFRleHQ7CisKKyAgLy8vIFxicmllZiBUaGUgImRlY2xhcmF0aW9uIiBvZiB0aGUgbWF0Y2hlciwgd2l0aCB0eXBlIGluZm9ybWF0aW9uLgorICBzdGQ6OnN0cmluZyBNYXRjaGVyRGVjbDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWF0Y2hlckNvbXBsZXRpb24gJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVkVGV4dCA9PSBPdGhlci5UeXBlZFRleHQgJiYgTWF0Y2hlckRlY2wgPT0gT3RoZXIuTWF0Y2hlckRlY2w7CisgIH0KK307CisKIGNsYXNzIFJlZ2lzdHJ5IHsKIHB1YmxpYzoKLSAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBtYXRjaGVyIGZyb20gdGhlIHJlZ2lzdHJ5IGJ5IG5hbWUuCisgIC8vLyBcYnJpZWYgTG9vayB1cCBhIG1hdGNoZXIgaW4gdGhlIHJlZ2lzdHJ5IGJ5IG5hbWUsCiAgIC8vLwotICAvLy8gQ29uc3VsdCB0aGUgcmVnaXN0cnkgb2Yga25vd24gbWF0Y2hlcnMgYW5kIGNvbnN0cnVjdCB0aGUgYXBwcm9wcmlhdGUKLSAgLy8vIG1hdGNoZXIgYnkgbmFtZS4KKyAgLy8vIFxyZXR1cm4gQW4gb3BhcXVlIHZhbHVlIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBtYXRjaGVyCisgIC8vLyBjb25zdHJ1Y3Rvciwgb3IgT3B0aW9uYWw8TWF0Y2hlckN0b3I+KCkgaWYgbm90IGZvdW5kLiAgSW4gdGhhdCBjYXNlCisgIC8vLyBcYyBFcnJvciB3aWxsIGNvbnRhaW4gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvci4KKyAgc3RhdGljIGxsdm06Ok9wdGlvbmFsPE1hdGNoZXJDdG9yPgorICBsb29rdXBNYXRjaGVyQ3RvcihTdHJpbmdSZWYgTWF0Y2hlck5hbWUsIGNvbnN0IFNvdXJjZVJhbmdlICZOYW1lUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzICpFcnJvcik7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBsaXN0IG9mIGNvbXBsZXRpb25zIGZvciBccCBDb250ZXh0LgogICAvLy8KLSAgLy8vIFxwYXJhbSBNYXRjaGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgbWF0Y2hlciB0byBpbnN0YW50aWF0ZS4KKyAgLy8vIEVhY2ggZWxlbWVudCBvZiBccCBDb250ZXh0IHJlcHJlc2VudHMgYSBtYXRjaGVyIGludm9jYXRpb24sIGdvaW5nIGZyb20KKyAgLy8vIG91dGVybW9zdCB0byBpbm5lcm1vc3QuIEVsZW1lbnRzIGFyZSBwYWlycyBjb25zaXN0aW5nIG9mIGEgcmVmZXJlbmNlIHRvIHRoZQorICAvLy8gbWF0Y2hlciBjb25zdHJ1Y3RvciBhbmQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGFyZ3VtZW50IGxpc3QKKyAgLy8vIG9mIHRoYXQgbWF0Y2hlciAob3IgZm9yIHRoZSBsYXN0IGVsZW1lbnQsIHRoZSBpbmRleCBvZiB0aGUgY29tcGxldGlvbgorICAvLy8gcG9pbnQgaW4gdGhlIGFyZ3VtZW50IGxpc3QpLiBBbiBlbXB0eSBsaXN0IHJlcXVlc3RzIGNvbXBsZXRpb24gZm9yIHRoZQorICAvLy8gcm9vdCBtYXRjaGVyLgorICAvLy8KKyAgLy8vIFRoZSBjb21wbGV0aW9ucyBhcmUgb3JkZXJlZCBmaXJzdCBieSBkZWNyZWFzaW5nIHJlbGV2YW5jZSwgdGhlbgorICAvLy8gYWxwaGFiZXRpY2FsbHkuICBSZWxldmFuY2UgaXMgZGV0ZXJtaW5lZCBieSBob3cgY2xvc2VseSB0aGUgbWF0Y2hlcidzCisgIC8vLyB0eXBlIG1hdGNoZXMgdGhhdCBvZiB0aGUgY29udGV4dC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBpbm5lcm1vc3QgbWF0Y2hlcgorICAvLy8gdGFrZXMgYSBGdW5jdGlvbkRlY2wgbWF0Y2hlciwgdGhlIEZ1bmN0aW9uRGVjbCBtYXRjaGVycyBhcmUgcmV0dXJuZWQKKyAgLy8vIGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgVmFsdWVEZWNsIG1hdGNoZXJzLCB0aGVuIE5hbWVkRGVjbCwgdGhlbiBEZWNsLCB0aGVuCisgIC8vLyBwb2x5bW9ycGhpYyBtYXRjaGVycy4KKyAgLy8vCisgIC8vLyBNYXRjaGVycyB3aGljaCBhcmUgdGVjaG5pY2FsbHkgY29udmVydGlibGUgdG8gdGhlIGlubmVybW9zdCBjb250ZXh0IGJ1dAorICAvLy8gd2hpY2ggd291bGQgbWF0Y2ggZWl0aGVyIGFsbCBvciBubyBub2RlcyBhcmUgZXhjbHVkZWQuIEZvciBleGFtcGxlLAorICAvLy8gbmFtZWREZWNsIGFuZCB2YXJEZWNsIGFyZSBleGNsdWRlZCBpbiBhIEZ1bmN0aW9uRGVjbCBjb250ZXh0LCBiZWNhdXNlCisgIC8vLyB0aG9zZSBtYXRjaGVycyB3b3VsZCBtYXRjaCByZXNwZWN0aXZlbHkgYWxsIG9yIG5vIG5vZGVzIGluIHN1Y2ggYSBjb250ZXh0LgorICBzdGF0aWMgc3RkOjp2ZWN0b3I8TWF0Y2hlckNvbXBsZXRpb24+CisgIGdldENvbXBsZXRpb25zKGxsdm06OkFycmF5UmVmPHN0ZDo6cGFpcjxNYXRjaGVyQ3RvciwgdW5zaWduZWQ+ID4gQ29udGV4dCk7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBtYXRjaGVyIGZyb20gdGhlIHJlZ2lzdHJ5LgorICAvLy8KKyAgLy8vIFxwYXJhbSBDdG9yIFRoZSBtYXRjaGVyIGNvbnN0cnVjdG9yIHRvIGluc3RhbnRpYXRlLgogICAvLy8KICAgLy8vIFxwYXJhbSBOYW1lUmFuZ2UgVGhlIGxvY2F0aW9uIG9mIHRoZSBuYW1lIGluIHRoZSBtYXRjaGVyIHNvdXJjZS4KICAgLy8vICAgVXNlZnVsIGZvciBlcnJvciByZXBvcnRpbmcuCkBAIC00NCwxMCArOTYsMTAgQEAKICAgLy8vICAgd2lsbCByZXR1cm4gYW4gZXJyb3IuCiAgIC8vLwogICAvLy8gXHJldHVybiBUaGUgbWF0Y2hlciBvYmplY3QgY29uc3RydWN0ZWQgaWYgbm8gZXJyb3Igd2FzIGZvdW5kLgotICAvLy8gICBBIG51bGwgbWF0Y2hlciBpZiB0aGUgbWF0Y2hlciBpcyBub3QgZm91bmQsIG9yIGlmIHRoZSBudW1iZXIgb2YKLSAgLy8vICAgYXJndW1lbnRzIG9yIGFyZ3VtZW50IHR5cGVzIGRvIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlLgotICAvLy8gICBJbiB0aGF0IGNhc2UgXGMgRXJyb3Igd2lsbCBjb250YWluIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCi0gIHN0YXRpYyBWYXJpYW50TWF0Y2hlciBjb25zdHJ1Y3RNYXRjaGVyKFN0cmluZ1JlZiBNYXRjaGVyTmFtZSwKKyAgLy8vICAgQSBudWxsIG1hdGNoZXIgaWYgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgb3IgYXJndW1lbnQgdHlwZXMgZG8gbm90IG1hdGNoCisgIC8vLyAgIHRoZSBzaWduYXR1cmUuICBJbiB0aGF0IGNhc2UgXGMgRXJyb3Igd2lsbCBjb250YWluIHRoZSBkZXNjcmlwdGlvbiBvZgorICAvLy8gICB0aGUgZXJyb3IuCisgIHN0YXRpYyBWYXJpYW50TWF0Y2hlciBjb25zdHJ1Y3RNYXRjaGVyKE1hdGNoZXJDdG9yIEN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZVJhbmdlICZOYW1lUmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlclZhbHVlPiBBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpOwpAQCAtNTgsNyArMTEwLDcgQEAKICAgLy8vIG1hdGNoZXIgdG8gdGhlIHNwZWNpZmllZCBcYyBCaW5kSUQuCiAgIC8vLyBJZiB0aGUgbWF0Y2hlciBpcyBub3QgYmluZGFibGUsIGl0IHNldHMgYW4gZXJyb3IgaW4gXGMgRXJyb3IgYW5kIHJldHVybnMKICAgLy8vIGEgbnVsbCBtYXRjaGVyLgotICBzdGF0aWMgVmFyaWFudE1hdGNoZXIgY29uc3RydWN0Qm91bmRNYXRjaGVyKFN0cmluZ1JlZiBNYXRjaGVyTmFtZSwKKyAgc3RhdGljIFZhcmlhbnRNYXRjaGVyIGNvbnN0cnVjdEJvdW5kTWF0Y2hlcihNYXRjaGVyQ3RvciBDdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZVJhbmdlICZOYW1lUmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEJpbmRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZXJWYWx1ZT4gQXJncywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9WYXJpYW50VmFsdWUuaCBiL2luY2x1ZGUvY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9WYXJpYW50VmFsdWUuaAppbmRleCBiOWJjMDE3Li5jNjg1MzU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvVmFyaWFudFZhbHVlLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1ZhcmlhbnRWYWx1ZS5oCkBAIC0xNywxNCArMTcsMTMgQEAKICNpZm5kZWYgTExWTV9DTEFOR19BU1RfTUFUQ0hFUlNfRFlOQU1JQ19WQVJJQU5UX1ZBTFVFX0gKICNkZWZpbmUgTExWTV9DTEFOR19BU1RfTUFUQ0hFUlNfRFlOQU1JQ19WQVJJQU5UX1ZBTFVFX0gKIAotI2luY2x1ZGUgPHZlY3Rvcj4KLQogI2luY2x1ZGUgImNsYW5nL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnNJbnRlcm5hbC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIGFzdF9tYXRjaGVycyB7CkBAIC01MCw3ICs0OSw4IEBACiAgIGNsYXNzIE1hdGNoZXJPcHMgewogICBwdWJsaWM6CiAgICAgdmlydHVhbCB+TWF0Y2hlck9wcygpOwotICAgIHZpcnR1YWwgYm9vbCBjYW5Db25zdHJ1Y3RGcm9tKGNvbnN0IER5blR5cGVkTWF0Y2hlciAmTWF0Y2hlcikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBjYW5Db25zdHJ1Y3RGcm9tKGNvbnN0IER5blR5cGVkTWF0Y2hlciAmTWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJc0V4YWN0TWF0Y2gpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgY29uc3RydWN0RnJvbShjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgY29uc3RydWN0VmFyaWFkaWNPcGVyYXRvcigKICAgICAgICAgYXN0X21hdGNoZXJzOjppbnRlcm5hbDo6VmFyaWFkaWNPcGVyYXRvckZ1bmN0aW9uIEZ1bmMsCkBAIC03OCwxNCArNzgsMTQgQEAKICAgLy8vIFxicmllZiBDbG9uZXMgdGhlIHByb3ZpZGVkIG1hdGNoZXJzLgogICAvLy8KICAgLy8vIFRoZXkgc2hvdWxkIGJlIHRoZSByZXN1bHQgb2YgYSBwb2x5bW9ycGhpYyBtYXRjaGVyLgotICBzdGF0aWMgVmFyaWFudE1hdGNoZXIgUG9seW1vcnBoaWNNYXRjaGVyKEFycmF5UmVmPER5blR5cGVkTWF0Y2hlcj4gTWF0Y2hlcnMpOworICBzdGF0aWMgVmFyaWFudE1hdGNoZXIgUG9seW1vcnBoaWNNYXRjaGVyKHN0ZDo6dmVjdG9yPER5blR5cGVkTWF0Y2hlcj4gTWF0Y2hlcnMpOwogCiAgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhICd2YXJpYWRpYycgb3BlcmF0b3IgbWF0Y2hlci4KICAgLy8vCiAgIC8vLyBJdCB3aWxsIGJpbmQgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUgb24gZ2V0VHlwZWRNYXRjaGVyPFQ+KCkuCiAgIHN0YXRpYyBWYXJpYW50TWF0Y2hlciBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlcigKICAgICAgIGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OlZhcmlhZGljT3BlcmF0b3JGdW5jdGlvbiBGdW5jLAotICAgICAgQXJyYXlSZWY8VmFyaWFudE1hdGNoZXI+IEFyZ3MpOworICAgICAgc3RkOjp2ZWN0b3I8VmFyaWFudE1hdGNoZXI+IEFyZ3MpOwogCiAgIC8vLyBcYnJpZWYgTWFrZXMgdGhlIG1hdGNoZXIgdGhlICJudWxsIiBtYXRjaGVyLgogICB2b2lkIHJlc2V0KCk7CkBAIC0xNDUsNyArMTQ1LDEwIEBACiAgIHB1YmxpYzoKICAgICB0eXBlZGVmIGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6Ok1hdGNoZXI8VD4gTWF0Y2hlclQ7CiAKLSAgICB2aXJ0dWFsIGJvb2wgY2FuQ29uc3RydWN0RnJvbShjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIpIGNvbnN0IHsKKyAgICB2aXJ0dWFsIGJvb2wgY2FuQ29uc3RydWN0RnJvbShjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSXNFeGFjdE1hdGNoKSBjb25zdCB7CisgICAgICBJc0V4YWN0TWF0Y2ggPSBNYXRjaGVyLmdldFN1cHBvcnRlZEtpbmQoKS5pc1NhbWUoCisgICAgICAgICAgYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPFQ+KCkpOwogICAgICAgcmV0dXJuIE1hdGNoZXIuY2FuQ29udmVydFRvPFQ+KCk7CiAgICAgfQogCkBAIC0xNTYsMzQgKzE1OSwyNSBAQAogICAgIHZpcnR1YWwgdm9pZCBjb25zdHJ1Y3RWYXJpYWRpY09wZXJhdG9yKAogICAgICAgICBhc3RfbWF0Y2hlcnM6OmludGVybmFsOjpWYXJpYWRpY09wZXJhdG9yRnVuY3Rpb24gRnVuYywKICAgICAgICAgQXJyYXlSZWY8VmFyaWFudE1hdGNoZXI+IElubmVyTWF0Y2hlcnMpIHsKLSAgICAgIGNvbnN0IHNpemVfdCBOdW1BcmdzID0gSW5uZXJNYXRjaGVycy5zaXplKCk7Ci0gICAgICBNYXRjaGVyVCAqKklubmVyQXJncyA9IG5ldyBNYXRjaGVyVCAqW051bUFyZ3NdKCk7Ci0gICAgICBib29sIEhhc0Vycm9yID0gZmFsc2U7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBOdW1BcmdzOyArK2kpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPER5blR5cGVkTWF0Y2hlcj4gRHluTWF0Y2hlcnM7CisgICAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IElubmVyTWF0Y2hlcnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgewogICAgICAgICAvLyBBYm9ydCBpZiBhbnkgb2YgdGhlIGlubmVyIG1hdGNoZXJzIGNhbid0IGJlIGNvbnZlcnRlZCB0bwogICAgICAgICAvLyBNYXRjaGVyPFQ+LgogICAgICAgICBpZiAoIUlubmVyTWF0Y2hlcnNbaV0uaGFzVHlwZWRNYXRjaGVyPFQ+KCkpIHsKLSAgICAgICAgICBIYXNFcnJvciA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIElubmVyQXJnc1tpXSA9IG5ldyBNYXRjaGVyVChJbm5lck1hdGNoZXJzW2ldLmdldFR5cGVkTWF0Y2hlcjxUPigpKTsKKyAgICAgICAgRHluTWF0Y2hlcnMucHVzaF9iYWNrKElubmVyTWF0Y2hlcnNbaV0uZ2V0VHlwZWRNYXRjaGVyPFQ+KCkpOwogICAgICAgfQotICAgICAgaWYgKCFIYXNFcnJvcikgewotICAgICAgICBPdXQucmVzZXQobmV3IE1hdGNoZXJUKAotICAgICAgICAgICAgbmV3IGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OlZhcmlhZGljT3BlcmF0b3JNYXRjaGVySW50ZXJmYWNlPFQ+KAotICAgICAgICAgICAgICAgIEZ1bmMsIEFycmF5UmVmPGNvbnN0IE1hdGNoZXJUICo+KElubmVyQXJncywgTnVtQXJncykpKSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBOdW1BcmdzOyArK2kpIHsKLSAgICAgICAgZGVsZXRlIElubmVyQXJnc1tpXTsKLSAgICAgIH0KLSAgICAgIGRlbGV0ZVtdIElubmVyQXJnczsKKyAgICAgIE91dC5yZXNldChuZXcgTWF0Y2hlclQoCisgICAgICAgICAgbmV3IGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OlZhcmlhZGljT3BlcmF0b3JNYXRjaGVySW50ZXJmYWNlPFQ+KAorICAgICAgICAgICAgICBGdW5jLCBEeW5NYXRjaGVycykpKTsKICAgICB9CiAKICAgICBib29sIGhhc01hdGNoZXIoKSBjb25zdCB7IHJldHVybiBPdXQuZ2V0KCkgIT0gTlVMTDsgfQogICAgIGNvbnN0IE1hdGNoZXJUICZtYXRjaGVyKCkgY29uc3QgeyByZXR1cm4gKk91dDsgfQogCiAgIHByaXZhdGU6Ci0gICAgT3duaW5nUHRyPE1hdGNoZXJUPiBPdXQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1hdGNoZXJUPiBPdXQ7CiAgIH07CiAKICAgSW50cnVzaXZlUmVmQ250UHRyPGNvbnN0IFBheWxvYWQ+IFZhbHVlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Db25zdW1lZC5oIGIvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Db25zdW1lZC5oCmluZGV4IDIzYTA5NGEuLjdkZTRiNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvQ29uc3VtZWQuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL0NvbnN1bWVkLmgKQEAgLTE4LDggKzE4LDggQEAKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByQ1hYLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRDWFguaCIKLSNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNpc0NvbnRleHQuaCIKICNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Qb3N0T3JkZXJDRkdWaWV3LmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNDb250ZXh0LmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKIAogbmFtZXNwYWNlIGNsYW5nIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvRG9taW5hdG9ycy5oIGIvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Eb21pbmF0b3JzLmgKaW5kZXggMmE4MDZjOC4uMWJmZDA1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Eb21pbmF0b3JzLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Eb21pbmF0b3JzLmgKQEAgLTE3LDkgKzE3LDE1IEBACiAjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNDb250ZXh0LmgiCiAjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQ0ZHLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKLSNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYXRvckludGVybmFscy5oIgotI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9taW5hdG9ycy5oIgotI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlQ29uc3RydWN0aW9uLmgiCisKKy8vIEZJWE1FOiBUaGVyZSBpcyBubyBnb29kIHJlYXNvbiBmb3IgdGhlIGRvbXRyZWUgdG8gcmVxdWlyZSBhIHByaW50IG1ldGhvZAorLy8gd2hpY2ggYWNjZXB0cyBhbiBMTFZNIE1vZHVsZSwgc28gcmVtb3ZlIHRoaXMgKGFuZCB0aGUgbWV0aG9kJ3MgYXJndW1lbnQgdGhhdAorLy8gbmVlZHMgaXQpIHdoZW4gdGhhdCBpcyBmaXhlZC4KK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1vZHVsZTsKK30KIAogbmFtZXNwYWNlIGNsYW5nIHsKIApAQCAtMTU1LDExICsxNjEsNiBAQAogICBDRkcgKmNmZzsKIH07CiAKLWlubGluZSB2b2lkIFdyaXRlQXNPcGVyYW5kKHJhd19vc3RyZWFtICZPUywgY29uc3QgQ0ZHQmxvY2sgKkJCLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHQpIHsKLSAgT1MgPDwgIkJCIyIgPDwgQkItPmdldEJsb2NrSUQoKTsKLX0KLQogfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Gb3JtYXRTdHJpbmcuaCBiL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvRm9ybWF0U3RyaW5nLmgKaW5kZXggYzk1MTZiNS4uM2JmZmNkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Gb3JtYXRTdHJpbmcuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL0Zvcm1hdFN0cmluZy5oCkBAIC01NzIsNyArNTcyLDggQEAKIAogICBBcmdUeXBlIGdldEFyZ1R5cGUoQVNUQ29udGV4dCAmQ3R4KSBjb25zdDsKIAotICBib29sIGZpeFR5cGUoUXVhbFR5cGUgUVQsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0LCBBU1RDb250ZXh0ICZDdHgpOworICBib29sIGZpeFR5cGUoUXVhbFR5cGUgUVQsIFF1YWxUeXBlIFJhd1FULCBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdCwKKyAgICAgICAgICAgICAgIEFTVENvbnRleHQgJkN0eCk7CiAKICAgdm9pZCB0b1N0cmluZyhyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1JlYWNoYWJsZUNvZGUuaCBiL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvUmVhY2hhYmxlQ29kZS5oCmluZGV4IDMwYzViMmQuLjkwYTZkMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvUmVhY2hhYmxlQ29kZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvUmVhY2hhYmxlQ29kZS5oCkBAIC0yNyw2ICsyNyw3IEBACiBuYW1lc3BhY2UgY2xhbmcgewogICBjbGFzcyBBbmFseXNpc0RlY2xDb250ZXh0OwogICBjbGFzcyBDRkdCbG9jazsKKyAgY2xhc3MgUHJlcHJvY2Vzc29yOwogfQogCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtMzYsMTEgKzM3LDIyIEBACiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIHJlYWNoYWJsZV9jb2RlIHsKIAorLy8vIENsYXNzaWZpY2F0aW9ucyBvZiB1bnJlYWNoYWJsZSBjb2RlLgorZW51bSBVbnJlYWNoYWJsZUtpbmQgeworICBVS19SZXR1cm4sCisgIFVLX0JyZWFrLAorICBVS19Mb29wX0luY3JlbWVudCwKKyAgVUtfT3RoZXIKK307CisKIGNsYXNzIENhbGxiYWNrIHsKICAgdmlydHVhbCB2b2lkIGFuY2hvcigpOwogcHVibGljOgogICB2aXJ0dWFsIH5DYWxsYmFjaygpIHt9Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVVbnJlYWNoYWJsZShTb3VyY2VMb2NhdGlvbiBMLCBTb3VyY2VSYW5nZSBSMSwKKyAgdmlydHVhbCB2b2lkIEhhbmRsZVVucmVhY2hhYmxlKFVucmVhY2hhYmxlS2luZCBVSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBDb25kaXRpb25WYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFIyKSA9IDA7CiB9OwogCkBAIC00OSw3ICs2MSw4IEBACiB1bnNpZ25lZCBTY2FuUmVhY2hhYmxlRnJvbUJsb2NrKGNvbnN0IENGR0Jsb2NrICpTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Qml0VmVjdG9yICZSZWFjaGFibGUpOwogCi12b2lkIEZpbmRVbnJlYWNoYWJsZUNvZGUoQW5hbHlzaXNEZWNsQ29udGV4dCAmQUMsIENhbGxiYWNrICZDQik7Cit2b2lkIEZpbmRVbnJlYWNoYWJsZUNvZGUoQW5hbHlzaXNEZWNsQ29udGV4dCAmQUMsIFByZXByb2Nlc3NvciAmUFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2sgJkNCKTsKIAogfX0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZzo6cmVhY2hhYmxlX2NvZGUKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9UaHJlYWRTYWZldHkuaCBiL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvVGhyZWFkU2FmZXR5LmgKaW5kZXggNWRlZjNkZC4uZDhjMDgwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNlcy9UaHJlYWRTYWZldHkuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1RocmVhZFNhZmV0eS5oCkBAIC0zOSw3ICszOSw4IEBACiAvLy8gbXV0ZXguCiBlbnVtIExvY2tLaW5kIHsKICAgTEtfU2hhcmVkLCAvLy88IFNoYXJlZC9yZWFkZXIgbG9jayBvZiBhIG11dGV4LgotICBMS19FeGNsdXNpdmUgLy8vPCBFeGNsdXNpdmUvd3JpdGVyIGxvY2sgb2YgYSBtdXRleC4KKyAgTEtfRXhjbHVzaXZlLCAvLy88IEV4Y2x1c2l2ZS93cml0ZXIgbG9jayBvZiBhIG11dGV4LgorICBMS19HZW5lcmljICAvLy88ICBDYW4gYmUgZWl0aGVyIFNoYXJlZCBvciBFeGNsdXNpdmUKIH07CiAKIC8vLyBUaGlzIGVudW0gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGRpZmZlcmVudCB3YXlzIHRvIGFjY2VzcyAocmVhZCBvciB3cml0ZSkgYQpAQCAtNzIsMjcgKzczLDQ2IEBACiAgIHZpcnR1YWwgflRocmVhZFNhZmV0eUhhbmRsZXIoKTsKIAogICAvLy8gV2FybiBhYm91dCBsb2NrIGV4cHJlc3Npb25zIHdoaWNoIGZhaWwgdG8gcmVzb2x2ZSB0byBsb2NrYWJsZSBvYmplY3RzLgorICAvLy8gXHBhcmFtIEtpbmQgLS0gdGhlIGNhcGFiaWxpdHkncyBuYW1lIHBhcmFtZXRlciAocm9sZSwgbXV0ZXgsIGV0YykuCiAgIC8vLyBccGFyYW0gTG9jIC0tIHRoZSBTb3VyY2VMb2NhdGlvbiBvZiB0aGUgdW5yZXNvbHZlZCBleHByZXNzaW9uLgotICB2aXJ0dWFsIHZvaWQgaGFuZGxlSW52YWxpZExvY2tFeHAoU291cmNlTG9jYXRpb24gTG9jKSB7fQorICB2aXJ0dWFsIHZvaWQgaGFuZGxlSW52YWxpZExvY2tFeHAoU3RyaW5nUmVmIEtpbmQsIFNvdXJjZUxvY2F0aW9uIExvYykge30KIAogICAvLy8gV2FybiBhYm91dCB1bmxvY2sgZnVuY3Rpb24gY2FsbHMgdGhhdCBkbyBub3QgaGF2ZSBhIHByaW9yIG1hdGNoaW5nIGxvY2sKICAgLy8vIGV4cHJlc3Npb24uCisgIC8vLyBccGFyYW0gS2luZCAtLSB0aGUgY2FwYWJpbGl0eSdzIG5hbWUgcGFyYW1ldGVyIChyb2xlLCBtdXRleCwgZXRjKS4KICAgLy8vIFxwYXJhbSBMb2NrTmFtZSAtLSBBIFN0cmluZ1JlZiBuYW1lIGZvciB0aGUgbG9jayBleHByZXNzaW9uLCB0byBiZSBwcmludGVkCiAgIC8vLyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KICAgLy8vIFxwYXJhbSBMb2MgLS0gVGhlIFNvdXJjZUxvY2F0aW9uIG9mIHRoZSBVbmxvY2sKLSAgdmlydHVhbCB2b2lkIGhhbmRsZVVubWF0Y2hlZFVubG9jayhOYW1lIExvY2tOYW1lLCBTb3VyY2VMb2NhdGlvbiBMb2MpIHt9CisgIHZpcnR1YWwgdm9pZCBoYW5kbGVVbm1hdGNoZWRVbmxvY2soU3RyaW5nUmVmIEtpbmQsIE5hbWUgTG9ja05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKSB7fQorCisgIC8vLyBXYXJuIGFib3V0IGFuIHVubG9jayBmdW5jdGlvbiBjYWxsIHRoYXQgYXR0ZW1wdHMgdG8gdW5sb2NrIGEgbG9jayB3aXRoCisgIC8vLyB0aGUgaW5jb3JyZWN0IGxvY2sga2luZC4gRm9yIGluc3RhbmNlLCBhIHNoYXJlZCBsb2NrIGJlaW5nIHVubG9ja2VkCisgIC8vLyBleGNsdXNpdmVseSwgb3IgdmljZSB2ZXJzYS4KKyAgLy8vIFxwYXJhbSBMb2NrTmFtZSAtLSBBIFN0cmluZ1JlZiBuYW1lIGZvciB0aGUgbG9jayBleHByZXNzaW9uLCB0byBiZSBwcmludGVkCisgIC8vLyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgLy8vIFxwYXJhbSBLaW5kIC0tIHRoZSBjYXBhYmlsaXR5J3MgbmFtZSBwYXJhbWV0ZXIgKHJvbGUsIG11dGV4LCBldGMpLgorICAvLy8gXHBhcmFtIEV4cGVjdGVkIC0tIHRoZSBraW5kIG9mIGxvY2sgZXhwZWN0ZWQuCisgIC8vLyBccGFyYW0gUmVjZWl2ZWQgLS0gdGhlIGtpbmQgb2YgbG9jayByZWNlaXZlZC4KKyAgLy8vIFxwYXJhbSBMb2MgLS0gVGhlIFNvdXJjZUxvY2F0aW9uIG9mIHRoZSBVbmxvY2suCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVJbmNvcnJlY3RVbmxvY2tLaW5kKFN0cmluZ1JlZiBLaW5kLCBOYW1lIExvY2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NrS2luZCBFeHBlY3RlZCwgTG9ja0tpbmQgUmVjZWl2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykge30KIAogICAvLy8gV2FybiBhYm91dCBsb2NrIGZ1bmN0aW9uIGNhbGxzIGZvciBsb2NrcyB3aGljaCBhcmUgYWxyZWFkeSBoZWxkLgorICAvLy8gXHBhcmFtIEtpbmQgLS0gdGhlIGNhcGFiaWxpdHkncyBuYW1lIHBhcmFtZXRlciAocm9sZSwgbXV0ZXgsIGV0YykuCiAgIC8vLyBccGFyYW0gTG9ja05hbWUgLS0gQSBTdHJpbmdSZWYgbmFtZSBmb3IgdGhlIGxvY2sgZXhwcmVzc2lvbiwgdG8gYmUgcHJpbnRlZAogICAvLy8gaW4gdGhlIGVycm9yIG1lc3NhZ2UuCiAgIC8vLyBccGFyYW0gTG9jIC0tIFRoZSBsb2NhdGlvbiBvZiB0aGUgc2Vjb25kIGxvY2sgZXhwcmVzc2lvbi4KLSAgdmlydHVhbCB2b2lkIGhhbmRsZURvdWJsZUxvY2soTmFtZSBMb2NrTmFtZSwgU291cmNlTG9jYXRpb24gTG9jKSB7fQorICB2aXJ0dWFsIHZvaWQgaGFuZGxlRG91YmxlTG9jayhTdHJpbmdSZWYgS2luZCwgTmFtZSBMb2NrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKSB7fQogCiAgIC8vLyBXYXJuIGFib3V0IHNpdHVhdGlvbnMgd2hlcmUgYSBtdXRleCBpcyBzb21ldGltZXMgaGVsZCBhbmQgc29tZXRpbWVzIG5vdC4KICAgLy8vIFRoZSB0aHJlZSBzaXR1YXRpb25zIGFyZToKICAgLy8vIDEuIGEgbXV0ZXggaXMgbG9ja2VkIG9uIGFuICJpZiIgYnJhbmNoIGJ1dCBub3QgdGhlICJlbHNlIiBicmFuY2gsCiAgIC8vLyAyLCBvciBhIG11dGV4IGlzIG9ubHkgaGVsZCBhdCB0aGUgc3RhcnQgb2Ygc29tZSBsb29wIGl0ZXJhdGlvbnMsCiAgIC8vLyAzLiBvciB3aGVuIGEgbXV0ZXggaXMgbG9ja2VkIGJ1dCBub3QgdW5sb2NrZWQgaW5zaWRlIGEgZnVuY3Rpb24uCisgIC8vLyBccGFyYW0gS2luZCAtLSB0aGUgY2FwYWJpbGl0eSdzIG5hbWUgcGFyYW1ldGVyIChyb2xlLCBtdXRleCwgZXRjKS4KICAgLy8vIFxwYXJhbSBMb2NrTmFtZSAtLSBBIFN0cmluZ1JlZiBuYW1lIGZvciB0aGUgbG9jayBleHByZXNzaW9uLCB0byBiZSBwcmludGVkCiAgIC8vLyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KICAgLy8vIFxwYXJhbSBMb2NMb2NrZWQgLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBsb2NrIGV4cHJlc3Npb24gd2hlcmUgdGhlIG11dGV4IGlzCkBAIC0xMDAsNTAgKzEyMCw1NiBAQAogICAvLy8gXHBhcmFtIExvY0VuZE9mU2NvcGUgLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIHNjb3BlIHdoZXJlIHRoZQogICAvLy8gICAgICAgICAgICAgICBtdXRleCBpcyBubyBsb25nZXIgaGVsZAogICAvLy8gXHBhcmFtIExFSyAtLSB3aGljaCBvZiB0aGUgdGhyZWUgYWJvdmUgY2FzZXMgd2Ugc2hvdWxkIHdhcm4gZm9yCi0gIHZpcnR1YWwgdm9pZCBoYW5kbGVNdXRleEhlbGRFbmRPZlNjb3BlKE5hbWUgTG9ja05hbWUsCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVNdXRleEhlbGRFbmRPZlNjb3BlKFN0cmluZ1JlZiBLaW5kLCBOYW1lIExvY2tOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2NMb2NrZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZE9mU2NvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2tFcnJvcktpbmQgTEVLKXt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2tFcnJvcktpbmQgTEVLKSB7fQogCiAgIC8vLyBXYXJuIHdoZW4gYSBtdXRleCBpcyBoZWxkIGV4Y2x1c2l2ZWx5IGFuZCBzaGFyZWQgYXQgdGhlIHNhbWUgcG9pbnQuIEZvcgogICAvLy8gZXhhbXBsZSwgaWYgYSBtdXRleCBpcyBsb2NrZWQgZXhjbHVzaXZlbHkgZHVyaW5nIGFuIGlmIGJyYW5jaCBhbmQgc2hhcmVkCiAgIC8vLyBkdXJpbmcgdGhlIGVsc2UgYnJhbmNoLgorICAvLy8gXHBhcmFtIEtpbmQgLS0gdGhlIGNhcGFiaWxpdHkncyBuYW1lIHBhcmFtZXRlciAocm9sZSwgbXV0ZXgsIGV0YykuCiAgIC8vLyBccGFyYW0gTG9ja05hbWUgLS0gQSBTdHJpbmdSZWYgbmFtZSBmb3IgdGhlIGxvY2sgZXhwcmVzc2lvbiwgdG8gYmUgcHJpbnRlZAogICAvLy8gaW4gdGhlIGVycm9yIG1lc3NhZ2UuCiAgIC8vLyBccGFyYW0gTG9jMSAtLSBUaGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IGxvY2sgZXhwcmVzc2lvbi4KICAgLy8vIFxwYXJhbSBMb2MyIC0tIFRoZSBsb2NhdGlvbiBvZiB0aGUgc2Vjb25kIGxvY2sgZXhwcmVzc2lvbi4KLSAgdmlydHVhbCB2b2lkIGhhbmRsZUV4Y2x1c2l2ZUFuZFNoYXJlZChOYW1lIExvY2tOYW1lLCBTb3VyY2VMb2NhdGlvbiBMb2MxLAorICB2aXJ0dWFsIHZvaWQgaGFuZGxlRXhjbHVzaXZlQW5kU2hhcmVkKFN0cmluZ1JlZiBLaW5kLCBOYW1lIExvY2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jMikge30KIAogICAvLy8gV2FybiB3aGVuIGEgcHJvdGVjdGVkIG9wZXJhdGlvbiBvY2N1cnMgd2hpbGUgbm8gbG9ja3MgYXJlIGhlbGQuCisgIC8vLyBccGFyYW0gS2luZCAtLSB0aGUgY2FwYWJpbGl0eSdzIG5hbWUgcGFyYW1ldGVyIChyb2xlLCBtdXRleCwgZXRjKS4KICAgLy8vIFxwYXJhbSBEIC0tIFRoZSBkZWNsIGZvciB0aGUgcHJvdGVjdGVkIHZhcmlhYmxlIG9yIGZ1bmN0aW9uCiAgIC8vLyBccGFyYW0gUE9LIC0tIFRoZSBraW5kIG9mIHByb3RlY3RlZCBvcGVyYXRpb24gKGUuZy4gdmFyaWFibGUgYWNjZXNzKQogICAvLy8gXHBhcmFtIEFLIC0tIFRoZSBraW5kIG9mIGFjY2VzcyAoaS5lLiByZWFkIG9yIHdyaXRlKSB0aGF0IG9jY3VycmVkCiAgIC8vLyBccGFyYW0gTG9jIC0tIFRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvdGVjdGVkIG9wZXJhdGlvbi4KLSAgdmlydHVhbCB2b2lkIGhhbmRsZU5vTXV0ZXhIZWxkKGNvbnN0IE5hbWVkRGVjbCAqRCwgUHJvdGVjdGVkT3BlcmF0aW9uS2luZCBQT0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NLaW5kIEFLLCBTb3VyY2VMb2NhdGlvbiBMb2MpIHt9CisgIHZpcnR1YWwgdm9pZCBoYW5kbGVOb011dGV4SGVsZChTdHJpbmdSZWYgS2luZCwgY29uc3QgTmFtZWREZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdGVjdGVkT3BlcmF0aW9uS2luZCBQT0ssIEFjY2Vzc0tpbmQgQUssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpIHt9CiAKICAgLy8vIFdhcm4gd2hlbiBhIHByb3RlY3RlZCBvcGVyYXRpb24gb2NjdXJzIHdoaWxlIHRoZSBzcGVjaWZpYyBtdXRleCBwcm90ZWN0aW5nCiAgIC8vLyB0aGUgb3BlcmF0aW9uIGlzIG5vdCBsb2NrZWQuCisgIC8vLyBccGFyYW0gS2luZCAtLSB0aGUgY2FwYWJpbGl0eSdzIG5hbWUgcGFyYW1ldGVyIChyb2xlLCBtdXRleCwgZXRjKS4KICAgLy8vIFxwYXJhbSBEIC0tIFRoZSBkZWNsIGZvciB0aGUgcHJvdGVjdGVkIHZhcmlhYmxlIG9yIGZ1bmN0aW9uCiAgIC8vLyBccGFyYW0gUE9LIC0tIFRoZSBraW5kIG9mIHByb3RlY3RlZCBvcGVyYXRpb24gKGUuZy4gdmFyaWFibGUgYWNjZXNzKQogICAvLy8gXHBhcmFtIExvY2tOYW1lIC0tIEEgU3RyaW5nUmVmIG5hbWUgZm9yIHRoZSBsb2NrIGV4cHJlc3Npb24sIHRvIGJlIHByaW50ZWQKICAgLy8vIGluIHRoZSBlcnJvciBtZXNzYWdlLgogICAvLy8gXHBhcmFtIExLIC0tIFRoZSBraW5kIG9mIGFjY2VzcyAoaS5lLiByZWFkIG9yIHdyaXRlKSB0aGF0IG9jY3VycmVkCiAgIC8vLyBccGFyYW0gTG9jIC0tIFRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvdGVjdGVkIG9wZXJhdGlvbi4KLSAgdmlydHVhbCB2b2lkIGhhbmRsZU11dGV4Tm90SGVsZChjb25zdCBOYW1lZERlY2wgKkQsCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVNdXRleE5vdEhlbGQoU3RyaW5nUmVmIEtpbmQsIGNvbnN0IE5hbWVkRGVjbCAqRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90ZWN0ZWRPcGVyYXRpb25LaW5kIFBPSywgTmFtZSBMb2NrTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NrS2luZCBMSywgU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgKlBvc3NpYmxlTWF0Y2g9MCkge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICpQb3NzaWJsZU1hdGNoID0gMCkge30KIAogICAvLy8gV2FybiB3aGVuIGEgZnVuY3Rpb24gaXMgY2FsbGVkIHdoaWxlIGFuIGV4Y2x1ZGVkIG11dGV4IGlzIGxvY2tlZC4gRm9yCiAgIC8vLyBleGFtcGxlLCB0aGUgbXV0ZXggbWF5IGJlIGxvY2tlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLgorICAvLy8gXHBhcmFtIEtpbmQgLS0gdGhlIGNhcGFiaWxpdHkncyBuYW1lIHBhcmFtZXRlciAocm9sZSwgbXV0ZXgsIGV0YykuCiAgIC8vLyBccGFyYW0gRnVuTmFtZSAtLSBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KICAgLy8vIFxwYXJhbSBMb2NrTmFtZSAtLSBBIFN0cmluZ1JlZiBuYW1lIGZvciB0aGUgbG9jayBleHByZXNzaW9uLCB0byBiZSBwcmludGVkCiAgIC8vLyBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KICAgLy8vIFxwYXJhbSBMb2MgLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBmdW5jdGlvbiBjYWxsLgotICB2aXJ0dWFsIHZvaWQgaGFuZGxlRnVuRXhjbHVkZXNMb2NrKE5hbWUgRnVuTmFtZSwgTmFtZSBMb2NrTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpIHt9CisgIHZpcnR1YWwgdm9pZCBoYW5kbGVGdW5FeGNsdWRlc0xvY2soU3RyaW5nUmVmIEtpbmQsIE5hbWUgRnVuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIExvY2tOYW1lLCBTb3VyY2VMb2NhdGlvbiBMb2MpIHt9CiAKICAgYm9vbCBpc3N1ZUJldGFXYXJuaW5ncygpIHsgcmV0dXJuIElzc3VlQmV0YVdhcm5pbmdzOyB9CiAgIHZvaWQgc2V0SXNzdWVCZXRhV2FybmluZ3MoYm9vbCBiKSB7IElzc3VlQmV0YVdhcm5pbmdzID0gYjsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNpc0NvbnRleHQuaCBiL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQW5hbHlzaXNDb250ZXh0LmgKaW5kZXggYjZmMTgzZC4uNzNiMzhiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9BbmFseXNpc0NvbnRleHQuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0FuYWx5c2lzQ29udGV4dC5oCkBAIC0xOSw4ICsxOSw4IEBACiAjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQ0ZHLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGNsYW5nIHsKIApAQCAtNjksMTYgKzY5LDE2IEBACiAKICAgY29uc3QgRGVjbCAqIGNvbnN0IEQ7CiAKLSAgT3duaW5nUHRyPENGRz4gY2ZnLCBjb21wbGV0ZUNGRzsKLSAgT3duaW5nUHRyPENGR1N0bXRNYXA+IGNmZ1N0bXRNYXA7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRkc+IGNmZywgY29tcGxldGVDRkc7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRkdTdG10TWFwPiBjZmdTdG10TWFwOwogCiAgIENGRzo6QnVpbGRPcHRpb25zIGNmZ0J1aWxkT3B0aW9uczsKICAgQ0ZHOjpCdWlsZE9wdGlvbnM6OkZvcmNlZEJsa0V4cHJzICpmb3JjZWRCbGtFeHByczsKIAogICBib29sIGJ1aWx0Q0ZHLCBidWlsdENvbXBsZXRlQ0ZHOwotICBPd25pbmdQdHI8UGFyZW50TWFwPiBQTTsKLSAgT3duaW5nUHRyPFBzZXVkb0NvbnN0YW50QW5hbHlzaXM+IFBDQTsKLSAgT3duaW5nUHRyPENGR1JldmVyc2VCbG9ja1JlYWNoYWJpbGl0eUFuYWx5c2lzPiBDRkE7CisgIHN0ZDo6dW5pcXVlX3B0cjxQYXJlbnRNYXA+IFBNOworICBzdGQ6OnVuaXF1ZV9wdHI8UHNldWRvQ29uc3RhbnRBbmFseXNpcz4gUENBOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHUmV2ZXJzZUJsb2NrUmVhY2hhYmlsaXR5QW5hbHlzaXM+IENGQTsKIAogICBsbHZtOjpCdW1wUHRyQWxsb2NhdG9yIEE7CiAKQEAgLTI1Miw3ICsyNTIsNyBAQAogICB2aXJ0dWFsIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgPSAwOwogCiAgIHZvaWQgZHVtcFN0YWNrKHJhd19vc3RyZWFtICZPUywgU3RyaW5nUmVmIEluZGVudCA9ICIiKSBjb25zdDsKLSAgTExWTV9BVFRSSUJVVEVfVVNFRCB2b2lkIGR1bXBTdGFjaygpIGNvbnN0OworICB2b2lkIGR1bXBTdGFjaygpIGNvbnN0OwogCiBwdWJsaWM6CiAgIHN0YXRpYyB2b2lkIFByb2ZpbGVDb21tb24obGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQsCkBAIC0yODcsMTEgKzI4NywxMSBAQAogICBjb25zdCBDRkdCbG9jayAqZ2V0Q2FsbFNpdGVCbG9jaygpIGNvbnN0IHsgcmV0dXJuIEJsb2NrOyB9CiAKICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IExvY2F0aW9uQ29udGV4dCBoYXMgbm8gY2FsbGVyIGNvbnRleHQuCi0gIHZpcnR1YWwgYm9vbCBpblRvcEZyYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0UGFyZW50KCkgPT0gMDsgIH0KKyAgYm9vbCBpblRvcEZyYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZ2V0UGFyZW50KCkgPT0gMDsgIH0KIAogICB1bnNpZ25lZCBnZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIEluZGV4OyB9CiAKLSAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKTsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBvdmVycmlkZTsKIAogICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBBbmFseXNpc0RlY2xDb250ZXh0ICpjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpwYXJlbnQsIGNvbnN0IFN0bXQgKnMsCkBAIC0zMTcsNyArMzE3LDcgQEAKIHB1YmxpYzoKICAgflNjb3BlQ29udGV4dCgpIHt9CiAKLSAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKTsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBvdmVycmlkZTsKIAogICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklELCBBbmFseXNpc0RlY2xDb250ZXh0ICpjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpwYXJlbnQsIGNvbnN0IFN0bXQgKnMpIHsKQEAgLTM0OSw3ICszNDksNyBAQAogICAKICAgY29uc3Qgdm9pZCAqZ2V0Q29udGV4dERhdGEoKSBjb25zdCB7IHJldHVybiBDb250ZXh0RGF0YTsgfQogCi0gIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCk7CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgb3ZlcnJpZGU7CiAKICAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgQW5hbHlzaXNEZWNsQ29udGV4dCAqY3R4LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqcGFyZW50LCBjb25zdCBCbG9ja0RlY2wgKmJkLApAQCAtNDA5LDcgKzQwOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkSW5pdGlhbGl6ZXJzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkVGVtcG9yYXJ5RHRvcnMgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeW50aGVzaXplQm9kaWVzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkU3RhdGljSW5pdEJyYW5jaGVzID0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZFN0YXRpY0luaXRCcmFuY2hlcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZENYWE5ld0FsbG9jYXRvciA9IHRydWUpOwogCiAgIH5BbmFseXNpc0RlY2xDb250ZXh0TWFuYWdlcigpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0NGRy5oIGIvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9DRkcuaAppbmRleCAxNGI3YWI4Li4xMjNkMTQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0NGRy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvQ0ZHLmgKQEAgLTIxLDEzICsyMSwxNCBAQAogI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCiAjaW5jbHVkZSA8Yml0c2V0PgogI2luY2x1ZGUgPGNhc3NlcnQ+CiAjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgY2xhbmcgewogICBjbGFzcyBDWFhEZXN0cnVjdG9yRGVjbDsKQEAgLTQ1LDYgKzQ2LDcgQEAKICAgY2xhc3MgQVNUQ29udGV4dDsKICAgY2xhc3MgQ1hYUmVjb3JkRGVjbDsKICAgY2xhc3MgQ1hYRGVsZXRlRXhwcjsKKyAgY2xhc3MgQ1hYTmV3RXhwcjsKIAogLy8vIENGR0VsZW1lbnQgLSBSZXByZXNlbnRzIGEgdG9wLWxldmVsIGV4cHJlc3Npb24gaW4gYSBiYXNpYyBibG9jay4KIGNsYXNzIENGR0VsZW1lbnQgewpAQCAtNTMsNiArNTUsNyBAQAogICAgIC8vIG1haW4ga2luZAogICAgIFN0YXRlbWVudCwKICAgICBJbml0aWFsaXplciwKKyAgICBOZXdBbGxvY2F0b3IsCiAgICAgLy8gZHRvciBraW5kCiAgICAgQXV0b21hdGljT2JqZWN0RHRvciwKICAgICBEZWxldGVEdG9yLApAQCAtNzAsNyArNzMsOSBAQAogCiAgIENGR0VsZW1lbnQoS2luZCBraW5kLCBjb25zdCB2b2lkICpQdHIxLCBjb25zdCB2b2lkICpQdHIyID0gMCkKICAgICA6IERhdGExKGNvbnN0X2Nhc3Q8dm9pZCo+KFB0cjEpLCAoKHVuc2lnbmVkKSBraW5kKSAmIDB4MyksCi0gICAgICBEYXRhMihjb25zdF9jYXN0PHZvaWQqPihQdHIyKSwgKCgodW5zaWduZWQpIGtpbmQpID4+IDIpICYgMHgzKSB7fQorICAgICAgRGF0YTIoY29uc3RfY2FzdDx2b2lkKj4oUHRyMiksICgoKHVuc2lnbmVkKSBraW5kKSA+PiAyKSAmIDB4MykgeworICAgIGFzc2VydChnZXRLaW5kKCkgPT0ga2luZCk7CisgIH0KIAogICBDRkdFbGVtZW50KCkge30KIHB1YmxpYzoKQEAgLTE0MSw2ICsxNDYsMjUgQEAKICAgfQogfTsKIAorLy8vIENGR05ld0FsbG9jYXRvciAtIFJlcHJlc2VudHMgQysrIGFsbG9jYXRvciBjYWxsLgorY2xhc3MgQ0ZHTmV3QWxsb2NhdG9yIDogcHVibGljIENGR0VsZW1lbnQgeworcHVibGljOgorICBleHBsaWNpdCBDRkdOZXdBbGxvY2F0b3IoY29uc3QgQ1hYTmV3RXhwciAqUykKKyAgICA6IENGR0VsZW1lbnQoTmV3QWxsb2NhdG9yLCBTKSB7fQorCisgIC8vIEdldCB0aGUgbmV3IGV4cHJlc3Npb24uCisgIGNvbnN0IENYWE5ld0V4cHIgKmdldEFsbG9jYXRvckV4cHIoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENYWE5ld0V4cHIgKj4oRGF0YTEuZ2V0UG9pbnRlcigpKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQ0ZHRWxlbWVudDsKKyAgQ0ZHTmV3QWxsb2NhdG9yKCkge30KKyAgc3RhdGljIGJvb2wgaXNLaW5kKGNvbnN0IENGR0VsZW1lbnQgJmVsZW0pIHsKKyAgICByZXR1cm4gZWxlbS5nZXRLaW5kKCkgPT0gTmV3QWxsb2NhdG9yOworICB9Cit9OworCiAvLy8gQ0ZHSW1wbGljaXREdG9yIC0gUmVwcmVzZW50cyBDKysgb2JqZWN0IGRlc3RydWN0b3IgaW1wbGljaXRseSBnZW5lcmF0ZWQKIC8vLyBieSBjb21waWxlciBvbiB2YXJpb3VzIG9jY2FzaW9ucy4KIGNsYXNzIENGR0ltcGxpY2l0RHRvciA6IHB1YmxpYyBDRkdFbGVtZW50IHsKQEAgLTM4OCw5ICs0MTIsNjQgQEAKICAgLy8vICAgb2YgdGhlIENGRy4KICAgdW5zaWduZWQgQmxvY2tJRDsKIAorcHVibGljOgorICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcG90ZW50aWFsIGFkamFjZW50IGJsb2NrIGluIHRoZSBDRkcuICBJdCBlbmNvZGVzCisgIC8vLyB3aGV0aGVyIG9yIG5vdCB0aGUgYmxvY2sgaXMgYWN0dWFsbHkgcmVhY2hhYmxlLCBvciBjYW4gYmUgcHJvdmVkIHRvIGJlCisgIC8vLyB0cml2aWFsbHkgdW5yZWFjaGFibGUuICBGb3Igc29tZSBjYXNlcyBpdCBhbGxvd3Mgb25lIHRvIGVuY29kZSBzY2VuYXJpb3MKKyAgLy8vIHdoZXJlIGEgYmxvY2sgd2FzIHN1YnN0aXR1dGVkIGJlY2F1c2UgdGhlIG9yaWdpbmFsIChub3cgYWx0ZXJuYXRlKSBibG9jaworICAvLy8gaXMgdW5yZWFjaGFibGUuCisgIGNsYXNzIEFkamFjZW50QmxvY2sgeworICAgIGVudW0gS2luZCB7CisgICAgICBBQl9Ob3JtYWwsCisgICAgICBBQl9VbnJlYWNoYWJsZSwKKyAgICAgIEFCX0FsdGVybmF0ZQorICAgIH07CisKKyAgICBDRkdCbG9jayAqUmVhY2hhYmxlQmxvY2s7CisgICAgbGx2bTo6UG9pbnRlckludFBhaXI8Q0ZHQmxvY2sqLCAyPiBVbnJlYWNoYWJsZUJsb2NrOworCisgIHB1YmxpYzoKKyAgICAvLy8gQ29uc3RydWN0IGFuIEFkamFjZW50QmxvY2sgd2l0aCBhIHBvc3NpYmx5IHVucmVhY2hhYmxlIGJsb2NrLgorICAgIEFkamFjZW50QmxvY2soQ0ZHQmxvY2sgKkIsIGJvb2wgSXNSZWFjaGFibGUpOworICAgIAorICAgIC8vLyBDb25zdHJ1Y3QgYW4gQWRqYWNlbnRCbG9jayB3aXRoIGEgcmVhY2hhYmxlIGJsb2NrIGFuZCBhbiBhbHRlcm5hdGUKKyAgICAvLy8gdW5yZWFjaGFibGUgYmxvY2suCisgICAgQWRqYWNlbnRCbG9jayhDRkdCbG9jayAqQiwgQ0ZHQmxvY2sgKkFsdGVybmF0ZUJsb2NrKTsKKworICAgIC8vLyBHZXQgdGhlIHJlYWNoYWJsZSBibG9jaywgaWYgb25lIGV4aXN0cy4KKyAgICBDRkdCbG9jayAqZ2V0UmVhY2hhYmxlQmxvY2soKSBjb25zdCB7CisgICAgICByZXR1cm4gUmVhY2hhYmxlQmxvY2s7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgcG90ZW50aWFsbHkgdW5yZWFjaGFibGUgYmxvY2suCisgICAgQ0ZHQmxvY2sgKmdldFBvc3NpYmx5VW5yZWFjaGFibGVCbG9jaygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBVbnJlYWNoYWJsZUJsb2NrLmdldFBvaW50ZXIoKTsKKyAgICB9CisKKyAgICAvLy8gUHJvdmlkZSBhbiBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIENGR0Jsb2NrKiBzbyB0aGF0CisgICAgLy8vIEFkamFjZW50QmxvY2sgY2FuIGJlIHN1YnN0aXR1dGVkIGZvciBDRkdCbG9jayouCisgICAgb3BlcmF0b3IgQ0ZHQmxvY2sqKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFJlYWNoYWJsZUJsb2NrKCk7CisgICAgfQorCisgICAgQ0ZHQmxvY2smIG9wZXJhdG9yICooKSBjb25zdCB7CisgICAgICByZXR1cm4gKmdldFJlYWNoYWJsZUJsb2NrKCk7CisgICAgfQorCisgICAgQ0ZHQmxvY2sqIG9wZXJhdG9yIC0+KCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFJlYWNoYWJsZUJsb2NrKCk7CisgICAgfQorCisgICAgYm9vbCBpc1JlYWNoYWJsZSgpIGNvbnN0IHsKKyAgICAgIEtpbmQgSyA9IChLaW5kKSBVbnJlYWNoYWJsZUJsb2NrLmdldEludCgpOworICAgICAgcmV0dXJuIEsgPT0gQUJfTm9ybWFsIHx8IEsgPT0gQUJfQWx0ZXJuYXRlOworICAgIH0KKyAgfTsKKworcHJpdmF0ZToKICAgLy8vIFByZWRlY2Vzc29ycy9TdWNjZXNzb3JzIC0gS2VlcCB0cmFjayBvZiB0aGUgcHJlZGVjZXNzb3IgLyBzdWNjZXNzb3IKICAgLy8vIENGRyBibG9ja3MuCi0gIHR5cGVkZWYgQnVtcFZlY3RvcjxDRkdCbG9jayo+IEFkamFjZW50QmxvY2tzOworICB0eXBlZGVmIEJ1bXBWZWN0b3I8QWRqYWNlbnRCbG9jaz4gQWRqYWNlbnRCbG9ja3M7CiAgIEFkamFjZW50QmxvY2tzIFByZWRzOwogICBBZGphY2VudEJsb2NrcyBTdWNjczsKIApAQCAtNDgwLDkgKzU1OSwxMSBAQAogICBjbGFzcyBGaWx0ZXJPcHRpb25zIHsKICAgcHVibGljOgogICAgIEZpbHRlck9wdGlvbnMoKSB7CisgICAgICBJZ25vcmVOdWxsUHJlZGVjZXNzb3JzID0gMTsKICAgICAgIElnbm9yZURlZmF1bHRzV2l0aENvdmVyZWRFbnVtcyA9IDA7CiAgICAgfQogCisgICAgdW5zaWduZWQgSWdub3JlTnVsbFByZWRlY2Vzc29ycyA6IDE7CiAgICAgdW5zaWduZWQgSWdub3JlRGVmYXVsdHNXaXRoQ292ZXJlZEVudW1zIDogMTsKICAgfTsKIApAQCAtNDk1LDExICs1NzYsMTQgQEAKICAgICBJTVBMIEksIEU7CiAgICAgY29uc3QgRmlsdGVyT3B0aW9ucyBGOwogICAgIGNvbnN0IENGR0Jsb2NrICpGcm9tOwotICAgcHVibGljOgorICBwdWJsaWM6CiAgICAgZXhwbGljaXQgRmlsdGVyZWRDRkdCbG9ja0l0ZXJhdG9yKGNvbnN0IElNUEwgJmksIGNvbnN0IElNUEwgJmUsCi0gICAgICAgICAgICAgIGNvbnN0IENGR0Jsb2NrICpmcm9tLAotICAgICAgICAgICAgICBjb25zdCBGaWx0ZXJPcHRpb25zICZmKQotICAgICAgOiBJKGkpLCBFKGUpLCBGKGYpLCBGcm9tKGZyb20pIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGR0Jsb2NrICpmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWx0ZXJPcHRpb25zICZmKQorICAgICAgICA6IEkoaSksIEUoZSksIEYoZiksIEZyb20oZnJvbSkgeworICAgICAgd2hpbGUgKGhhc01vcmUoKSAmJiBGaWx0ZXIoKkkpKQorICAgICAgICArK0k7CisgICAgfQogCiAgICAgYm9vbCBoYXNNb3JlKCkgY29uc3QgeyByZXR1cm4gSSAhPSBFOyB9CiAKQEAgLTUzMSw3ICs2MTUsNyBAQAogCiAgIC8vIE1hbmlwdWxhdGlvbiBvZiBibG9jayBjb250ZW50cwogCi0gIHZvaWQgc2V0VGVybWluYXRvcihTdG10ICpTdGF0ZW1lbnQpIHsgVGVybWluYXRvciA9IFN0YXRlbWVudDsgfQorICB2b2lkIHNldFRlcm1pbmF0b3IoQ0ZHVGVybWluYXRvciBUZXJtKSB7IFRlcm1pbmF0b3IgPSBUZXJtOyB9CiAgIHZvaWQgc2V0TGFiZWwoU3RtdCAqU3RhdGVtZW50KSB7IExhYmVsID0gU3RhdGVtZW50OyB9CiAgIHZvaWQgc2V0TG9vcFRhcmdldChjb25zdCBTdG10ICpsb29wVGFyZ2V0KSB7IExvb3BUYXJnZXQgPSBsb29wVGFyZ2V0OyB9CiAgIHZvaWQgc2V0SGFzTm9SZXR1cm5FbGVtZW50KCkgeyBIYXNOb1JldHVybkVsZW1lbnQgPSB0cnVlOyB9CkBAIC01MzksMTAgKzYyMywxMCBAQAogICBDRkdUZXJtaW5hdG9yIGdldFRlcm1pbmF0b3IoKSB7IHJldHVybiBUZXJtaW5hdG9yOyB9CiAgIGNvbnN0IENGR1Rlcm1pbmF0b3IgZ2V0VGVybWluYXRvcigpIGNvbnN0IHsgcmV0dXJuIFRlcm1pbmF0b3I7IH0KIAotICBTdG10ICpnZXRUZXJtaW5hdG9yQ29uZGl0aW9uKCk7CisgIFN0bXQgKmdldFRlcm1pbmF0b3JDb25kaXRpb24oYm9vbCBTdHJpcFBhcmVucyA9IHRydWUpOwogCi0gIGNvbnN0IFN0bXQgKmdldFRlcm1pbmF0b3JDb25kaXRpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q0ZHQmxvY2sqPih0aGlzKS0+Z2V0VGVybWluYXRvckNvbmRpdGlvbigpOworICBjb25zdCBTdG10ICpnZXRUZXJtaW5hdG9yQ29uZGl0aW9uKGJvb2wgU3RyaXBQYXJlbnMgPSB0cnVlKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q0ZHQmxvY2sqPih0aGlzKS0+Z2V0VGVybWluYXRvckNvbmRpdGlvbihTdHJpcFBhcmVucyk7CiAgIH0KIAogICBjb25zdCBTdG10ICpnZXRMb29wVGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gTG9vcFRhcmdldDsgfQpAQCAtNTYwLDEzICs2NDQsMTMgQEAKICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IENGRyogY2ZnLCBjb25zdCBMYW5nT3B0aW9ucyAmTE8sCiAgICAgICAgICAgICAgYm9vbCBTaG93Q29sb3JzKSBjb25zdDsKICAgdm9pZCBwcmludFRlcm1pbmF0b3IocmF3X29zdHJlYW0gJk9TLCBjb25zdCBMYW5nT3B0aW9ucyAmTE8pIGNvbnN0OwotCi0gIHZvaWQgYWRkU3VjY2Vzc29yKENGR0Jsb2NrICpCbG9jaywgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKLSAgICBpZiAoQmxvY2spCi0gICAgICBCbG9jay0+UHJlZHMucHVzaF9iYWNrKHRoaXMsIEMpOwotICAgIFN1Y2NzLnB1c2hfYmFjayhCbG9jaywgQyk7CisgIHZvaWQgcHJpbnRBc09wZXJhbmQocmF3X29zdHJlYW0gJk9TLCBib29sIC8qUHJpbnRUeXBlKi8pIHsKKyAgICBPUyA8PCAiQkIjIiA8PCBnZXRCbG9ja0lEKCk7CiAgIH0KIAorICAvLy8gQWRkcyBhIChwb3RlbnRpYWxseSB1bnJlYWNoYWJsZSkgc3VjY2Vzc29yIGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLgorICB2b2lkIGFkZFN1Y2Nlc3NvcihBZGphY2VudEJsb2NrIFN1Y2MsIEJ1bXBWZWN0b3JDb250ZXh0ICZDKTsKKwogICB2b2lkIGFwcGVuZFN0bXQoU3RtdCAqc3RhdGVtZW50LCBCdW1wVmVjdG9yQ29udGV4dCAmQykgewogICAgIEVsZW1lbnRzLnB1c2hfYmFjayhDRkdTdG10KHN0YXRlbWVudCksIEMpOwogICB9CkBAIC01NzYsNiArNjYwLDExIEBACiAgICAgRWxlbWVudHMucHVzaF9iYWNrKENGR0luaXRpYWxpemVyKGluaXRpYWxpemVyKSwgQyk7CiAgIH0KIAorICB2b2lkIGFwcGVuZE5ld0FsbG9jYXRvcihDWFhOZXdFeHByICpORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVtcFZlY3RvckNvbnRleHQgJkMpIHsKKyAgICBFbGVtZW50cy5wdXNoX2JhY2soQ0ZHTmV3QWxsb2NhdG9yKE5FKSwgQyk7CisgIH0KKwogICB2b2lkIGFwcGVuZEJhc2VEdG9yKGNvbnN0IENYWEJhc2VTcGVjaWZpZXIgKkJTLCBCdW1wVmVjdG9yQ29udGV4dCAmQykgewogICAgIEVsZW1lbnRzLnB1c2hfYmFjayhDRkdCYXNlRHRvcihCUyksIEMpOwogICB9CkBAIC02MzQsNiArNzIzLDcgQEAKICAgICBib29sIEFkZEltcGxpY2l0RHRvcnM7CiAgICAgYm9vbCBBZGRUZW1wb3JhcnlEdG9yczsKICAgICBib29sIEFkZFN0YXRpY0luaXRCcmFuY2hlczsKKyAgICBib29sIEFkZENYWE5ld0FsbG9jYXRvcjsKIAogICAgIGJvb2wgYWx3YXlzQWRkKGNvbnN0IFN0bXQgKnN0bXQpIGNvbnN0IHsKICAgICAgIHJldHVybiBhbHdheXNBZGRNYXNrW3N0bXQtPmdldFN0bXRDbGFzcygpXTsKQEAgLTY1NSw3ICs3NDUsOCBAQAogICAgICAgLEFkZEluaXRpYWxpemVycyhmYWxzZSkKICAgICAgICxBZGRJbXBsaWNpdER0b3JzKGZhbHNlKQogICAgICAgLEFkZFRlbXBvcmFyeUR0b3JzKGZhbHNlKQotICAgICAgLEFkZFN0YXRpY0luaXRCcmFuY2hlcyhmYWxzZSkge30KKyAgICAgICxBZGRTdGF0aWNJbml0QnJhbmNoZXMoZmFsc2UpCisgICAgICAsQWRkQ1hYTmV3QWxsb2NhdG9yKGZhbHNlKSB7fQogICB9OwogCiAgIC8vLyBcYnJpZWYgUHJvdmlkZXMgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgdGhlIGl0ZXJhdG9yIGNsYXNzIHRvIGhhdmUgdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL0Zsb3dTZW5zaXRpdmUvRGF0YWZsb3dTb2x2ZXIuaCBiL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvRmxvd1NlbnNpdGl2ZS9EYXRhZmxvd1NvbHZlci5oCmluZGV4IGM2MTFlYTIuLjViOTlmMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvRmxvd1NlbnNpdGl2ZS9EYXRhZmxvd1NvbHZlci5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvRmxvd1NlbnNpdGl2ZS9EYXRhZmxvd1NvbHZlci5oCkBAIC0xNCwxMiArMTQsMTIgQEAKICNpZm5kZWYgTExWTV9DTEFOR19BTkFMWVNFU19EQVRBRkxPV19TT0xWRVIKICNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNFU19EQVRBRkxPV19TT0xWRVIKIAotI2luY2x1ZGUgImZ1bmN0aW9uYWwiIC8vIFNUTAogI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0NGRy5oIgogI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0Zsb3dTZW5zaXRpdmUvRGF0YWZsb3dWYWx1ZXMuaCIKICNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9Qcm9ncmFtUG9pbnQuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KIAogbmFtZXNwYWNlIGNsYW5nIHsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9Qcm9ncmFtUG9pbnQuaCBiL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvUHJvZ3JhbVBvaW50LmgKaW5kZXggMzMzMzI5ZC4uMTQyM2UwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9Qcm9ncmFtUG9pbnQuaAorKysgYi9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL1Byb2dyYW1Qb2ludC5oCkBAIC02NTgsMTIgKzY1OCwxMiBAQAogcHJpdmF0ZToKICAgY29uc3Qgdm9pZCAqVGFnS2luZDsKIH07Ci0gIAorCiBjbGFzcyBTaW1wbGVQcm9ncmFtUG9pbnRUYWcgOiBwdWJsaWMgUHJvZ3JhbVBvaW50VGFnIHsKLSAgc3RkOjpzdHJpbmcgZGVzYzsKKyAgc3RkOjpzdHJpbmcgRGVzYzsKIHB1YmxpYzoKLSAgU2ltcGxlUHJvZ3JhbVBvaW50VGFnKFN0cmluZ1JlZiBkZXNjcmlwdGlvbik7Ci0gIFN0cmluZ1JlZiBnZXRUYWdEZXNjcmlwdGlvbigpIGNvbnN0OworICBTaW1wbGVQcm9ncmFtUG9pbnRUYWcoU3RyaW5nUmVmIE1zZ1Byb3ZpZGVyLCBTdHJpbmdSZWYgTXNnKTsKKyAgU3RyaW5nUmVmIGdldFRhZ0Rlc2NyaXB0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiB9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvU3VwcG9ydC9CdW1wVmVjdG9yLmggYi9pbmNsdWRlL2NsYW5nL0FuYWx5c2lzL1N1cHBvcnQvQnVtcFZlY3Rvci5oCmluZGV4IDM4N2U3NzkuLmUyNDY3MTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQW5hbHlzaXMvU3VwcG9ydC9CdW1wVmVjdG9yLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9BbmFseXNpcy9TdXBwb3J0L0J1bXBWZWN0b3IuaApAQCAtNjAsNyArNjAsNyBAQAogICB9CiAgIAogICB+QnVtcFZlY3RvcigpIHsKLSAgICBpZiAobGx2bTo6aXNfY2xhc3M8VD46OnZhbHVlKSB7CisgICAgaWYgKHN0ZDo6aXNfY2xhc3M8VD46OnZhbHVlKSB7CiAgICAgICAvLyBEZXN0cm95IHRoZSBjb25zdHJ1Y3RlZCBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgogICAgICAgZGVzdHJveV9yYW5nZShCZWdpbiwgRW5kKTsKICAgICB9CkBAIC0xMzAsNyArMTMwLDcgQEAKICAgfQogICAKICAgdm9pZCBjbGVhcigpIHsKLSAgICBpZiAobGx2bTo6aXNfY2xhc3M8VD46OnZhbHVlKSB7CisgICAgaWYgKHN0ZDo6aXNfY2xhc3M8VD46OnZhbHVlKSB7CiAgICAgICBkZXN0cm95X3JhbmdlKEJlZ2luLCBFbmQpOwogICAgIH0KICAgICBFbmQgPSBCZWdpbjsKQEAgLTIyMyw3ICsyMjMsNyBAQAogICBUICpOZXdFbHRzID0gQy5nZXRBbGxvY2F0b3IoKS50ZW1wbGF0ZSBBbGxvY2F0ZTxUPihOZXdDYXBhY2l0eSk7CiAgIAogICAvLyBDb3B5IHRoZSBlbGVtZW50cyBvdmVyLgotICBpZiAobGx2bTo6aXNfY2xhc3M8VD46OnZhbHVlKSB7CisgIGlmIChzdGQ6OmlzX2NsYXNzPFQ+Ojp2YWx1ZSkgewogICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KEJlZ2luLCBFbmQsIE5ld0VsdHMpOwogICAgIC8vIERlc3Ryb3kgdGhlIG9yaWdpbmFsIGVsZW1lbnRzLgogICAgIGRlc3Ryb3lfcmFuZ2UoQmVnaW4sIEVuZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQKaW5kZXggM2RhMmUyYi4uNzM2MDY4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyLnRkCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ci50ZApAQCAtNyw2ICs3LDU0IEBACiAvLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAorLy8gVGhlIGRvY3VtZW50YXRpb24gaXMgb3JnYW5pemVkIGJ5IGNhdGVnb3J5LiBBdHRyaWJ1dGVzIGNhbiBoYXZlIGNhdGVnb3J5LQorLy8gc3BlY2lmaWMgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIGNvbGxhdGVkIHdpdGhpbiB0aGUgbGFyZ2VyIGRvY3VtZW50LgorY2xhc3MgRG9jdW1lbnRhdGlvbkNhdGVnb3J5PHN0cmluZyBuYW1lPiB7CisgIHN0cmluZyBOYW1lID0gbmFtZTsKKyAgY29kZSBDb250ZW50ID0gW3t9XTsKK30KK2RlZiBEb2NDYXRGdW5jdGlvbiA6IERvY3VtZW50YXRpb25DYXRlZ29yeTwiRnVuY3Rpb24gQXR0cmlidXRlcyI+OworZGVmIERvY0NhdFZhcmlhYmxlIDogRG9jdW1lbnRhdGlvbkNhdGVnb3J5PCJWYXJpYWJsZSBBdHRyaWJ1dGVzIj47CitkZWYgRG9jQ2F0VHlwZSA6IERvY3VtZW50YXRpb25DYXRlZ29yeTwiVHlwZSBBdHRyaWJ1dGVzIj47CitkZWYgRG9jQ2F0U3RtdCA6IERvY3VtZW50YXRpb25DYXRlZ29yeTwiU3RhdGVtZW50IEF0dHJpYnV0ZXMiPjsKKy8vIEF0dHJpYnV0ZXMgbGlzdGVkIHVuZGVyIHRoZSBVbmRvY3VtZW50ZWQgY2F0ZWdvcnkgZG8gbm90IGdlbmVyYXRlIGFueSBwdWJsaWMKKy8vIGRvY3VtZW50YXRpb24uIElkZWFsbHksIHRoaXMgY2F0ZWdvcnkgc2hvdWxkIGJlIHVzZWQgZm9yIGludGVybmFsLW9ubHkKKy8vIGF0dHJpYnV0ZXMgd2hpY2ggY29udGFpbiBubyBzcGVsbGluZ3MuCitkZWYgRG9jQ2F0VW5kb2N1bWVudGVkIDogRG9jdW1lbnRhdGlvbkNhdGVnb3J5PCJVbmRvY3VtZW50ZWQiPjsKKworY2xhc3MgRG9jRGVwcmVjYXRlZDxzdHJpbmcgcmVwbGFjZW1lbnQgPSAiIj4geworICAvLyBJZiB0aGUgUmVwbGFjZW1lbnQgZmllbGQgaXMgZW1wdHksIG5vIHJlcGxhY2VtZW50IHdpbGwgYmUgbGlzdGVkIHdpdGggdGhlCisgIC8vIGRvY3VtZW50YXRpb24uIE90aGVyd2lzZSwgdGhlIGRvY3VtZW50YXRpb24gd2lsbCBzcGVjaWZ5IHRoZSBhdHRyaWJ1dGUgaGFzCisgIC8vIGJlZW4gc3VwZXJzZWRlZCBieSB0aGlzIHJlcGxhY2VtZW50LgorICBzdHJpbmcgUmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudDsKK30KKworLy8gU3BlY2lmaWVzIHRoZSBkb2N1bWVudGF0aW9uIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCitjbGFzcyBEb2N1bWVudGF0aW9uIHsKKyAgRG9jdW1lbnRhdGlvbkNhdGVnb3J5IENhdGVnb3J5OworICBjb2RlIENvbnRlbnQ7CisKKyAgLy8gSWYgdGhlIGhlYWRpbmcgaXMgZW1wdHksIG9uZSBtYXkgYmUgcGlja2VkIGF1dG9tYXRpY2FsbHkuIElmIHRoZSBhdHRyaWJ1dGUKKyAgLy8gb25seSBoYXMgb25lIHNwZWxsaW5nLCBubyBoZWFkaW5nIGlzIHJlcXVpcmVkIGFzIHRoZSBhdHRyaWJ1dGUncyBzb2xlCisgIC8vIHNwZWxsaW5nIGlzIHN1ZmZpY2llbnQuIElmIGFsbCBzcGVsbGluZ3MgYXJlIHNlbWFudGljYWxseSBjb21tb24sIHRoZQorICAvLyBoZWFkaW5nIHdpbGwgYmUgdGhlIHNlbWFudGljIHNwZWxsaW5nLiBJZiB0aGUgc3BlbGxpbmdzIGFyZSBub3QKKyAgLy8gc2VtYW50aWNhbGx5IGNvbW1vbiBhbmQgbm8gaGVhZGluZyBpcyBwcm92aWRlZCwgYW4gZXJyb3Igd2lsbCBiZSBlbWl0dGVkLgorICBzdHJpbmcgSGVhZGluZyA9ICIiOworCisgIC8vIFdoZW4gc2V0LCBzcGVjaWZpZXMgdGhhdCB0aGUgYXR0cmlidXRlIGlzIGRlcHJlY2F0ZWQgYW5kIGNhbiBvcHRpb25hbGx5CisgIC8vIHNwZWNpZnkgYSByZXBsYWNlbWVudCBhdHRyaWJ1dGUuCisgIERvY0RlcHJlY2F0ZWQgRGVwcmVjYXRlZDsKK30KKworLy8gU3BlY2lmaWVzIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBleHBsaWNpdGx5IHVuZG9jdW1lbnRlZC4gVGhpcyBjYW4gYmUgYQorLy8gaGVscGZ1bCBwbGFjZWhvbGRlciBmb3IgdGhlIGF0dHJpYnV0ZSB3aGlsZSB3b3JraW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwKKy8vIGJ1dCBzaG91bGQgbm90IGJlIHVzZWQgb25jZSBmZWF0dXJlIHdvcmsgaGFzIGJlZW4gY29tcGxldGVkLgorZGVmIFVuZG9jdW1lbnRlZCA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRVbmRvY3VtZW50ZWQ7Cit9CisKK2luY2x1ZGUgImNsYW5nL0Jhc2ljL0F0dHJEb2NzLnRkIgorCiAvLyBBbiBhdHRyaWJ1dGUncyBzdWJqZWN0IGlzIHdoYXRldmVyIGl0IGFwcGVydGFpbnMgdG8uIEluIHRoaXMgZmlsZSwgaXQgaXMKIC8vIG1vcmUgYWNjdXJhdGVseSBhIGxpc3Qgb2YgdGhpbmdzIHRoYXQgYW4gYXR0cmlidXRlIGNhbiBhcHBlcnRhaW4gdG8uIEFsbAogLy8gRGVjbHMgYW5kIFN0bXRzIGFyZSBwb3NzaWJseSBBdHRyU3ViamVjdHMgKGV2ZW4gdGhvdWdoIHRoZSBzeW50YXggbWF5IG5vdApAQCAtMTksMjkgKzY3LDYzIEBACiAvLyBBIHN1YnNldC1zdWJqZWN0IGlzIGFuIEF0dHJTdWJqZWN0IGNvbnN0cmFpbmVkIHRvIG9wZXJhdGUgb25seSBvbiBzb21lIHN1YnNldAogLy8gb2YgdGhhdCBzdWJqZWN0LgogLy8KLS8vIFRoZSBkZXNjcmlwdGlvbiBpcyB1c2VkIGluIG91dHB1dCBtZXNzYWdlcyB0byBzcGVjaWZ5IHdoYXQgdGhlIHN1YmplY3QKLS8vIHJlcHJlc2VudHMuIEZJWE1FOiBEZWFsIHdpdGggdHJhbnNsYXRpb24gaXNzdWVzLgotLy8KIC8vIFRoZSBjb2RlIGZyYWdtZW50IGlzIGEgYm9vbGVhbiBleHByZXNzaW9uIHRoYXQgd2lsbCBjb25maXJtIHRoYXQgdGhlIHN1YmplY3QKIC8vIG1lZXRzIHRoZSByZXF1aXJlbWVudHM7IHRoZSBzdWJqZWN0IHdpbGwgaGF2ZSB0aGUgbmFtZSBTLCBhbmQgd2lsbCBoYXZlIHRoZQogLy8gdHlwZSBzcGVjaWZpZWQgYnkgdGhlIGJhc2UuIEl0IHNob3VsZCBiZSBhIHNpbXBsZSBib29sZWFuIGV4cHJlc3Npb24uCi1jbGFzcyBTdWJzZXRTdWJqZWN0PEF0dHJTdWJqZWN0IGJhc2UsIHN0cmluZyBkZXNjcmlwdGlvbiwgY29kZSBjaGVjaz4KLSAgICA6IEF0dHJTdWJqZWN0IHsKK2NsYXNzIFN1YnNldFN1YmplY3Q8QXR0clN1YmplY3QgYmFzZSwgY29kZSBjaGVjaz4gOiBBdHRyU3ViamVjdCB7CiAgIEF0dHJTdWJqZWN0IEJhc2UgPSBiYXNlOwotICBzdHJpbmcgRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKICAgY29kZSBDaGVja0NvZGUgPSBjaGVjazsKIH0KIAogLy8gVGhpcyBpcyB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIHdoaWNoIEMrKzExIGFsbG93cyBhbGlnbmFzKC4uLikgdG8gYXBwZXJ0YWluCiAvLyB0by4KLWRlZiBOb3JtYWxWYXIgOiBTdWJzZXRTdWJqZWN0PFZhciwgIm5vbi1yZWdpc3Rlciwgbm9uLXBhcmFtZXRlciB2YXJpYWJsZSIsCitkZWYgTm9ybWFsVmFyIDogU3Vic2V0U3ViamVjdDxWYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe1MtPmdldFN0b3JhZ2VDbGFzcygpICE9IFZhckRlY2w6OlJlZ2lzdGVyICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMtPmdldEtpbmQoKSAhPSBEZWNsOjpJbXBsaWNpdFBhcmFtICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMtPmdldEtpbmQoKSAhPSBEZWNsOjpQYXJtVmFyICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMtPmdldEtpbmQoKSAhPSBEZWNsOjpOb25UeXBlVGVtcGxhdGVQYXJtfV0+OwotZGVmIE5vbkJpdEZpZWxkIDogU3Vic2V0U3ViamVjdDxGaWVsZCwgIm5vbi1iaXQgZmllbGQiLAorZGVmIE5vbkJpdEZpZWxkIDogU3Vic2V0U3ViamVjdDxGaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3shUy0+aXNCaXRGaWVsZCgpfV0+OwogCitkZWYgT2JqQ0luc3RhbmNlTWV0aG9kIDogU3Vic2V0U3ViamVjdDxPYmpDTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3tTLT5pc0luc3RhbmNlTWV0aG9kKCl9XT47CisKK2RlZiBPYmpDSW50ZXJmYWNlRGVjbEluaXRNZXRob2QgOiBTdWJzZXRTdWJqZWN0PE9iakNNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3tTLT5nZXRNZXRob2RGYW1pbHkoKSA9PSBPTUZfaW5pdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzYTxPYmpDSW50ZXJmYWNlRGVjbD4oUy0+Z2V0RGVjbENvbnRleHQoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNhPE9iakNDYXRlZ29yeURlY2w+KFMtPmdldERlY2xDb250ZXh0KCkpICYmCisgICAgICAgICAgICBjYXN0PE9iakNDYXRlZ29yeURlY2w+KFMtPmdldERlY2xDb250ZXh0KCkpLT5Jc0NsYXNzRXh0ZW5zaW9uKCkpKX1dPjsKKworZGVmIFN0cnVjdCA6IFN1YnNldFN1YmplY3Q8UmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW3shUy0+aXNVbmlvbigpfV0+OworCitkZWYgVExTVmFyIDogU3Vic2V0U3ViamVjdDxWYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbe1MtPmdldFRMU0tpbmQoKSAhPSAwfV0+OworCitkZWYgU2hhcmVkVmFyIDogU3Vic2V0U3ViamVjdDxWYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe1MtPmhhc0dsb2JhbFN0b3JhZ2UoKSAmJiAhUy0+Z2V0VExTS2luZCgpfV0+OworCitkZWYgR2xvYmFsVmFyIDogU3Vic2V0U3ViamVjdDxWYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt7Uy0+aGFzR2xvYmFsU3RvcmFnZSgpfV0+OworCisvLyBGSVhNRTogdGhpcyBoYWNrIGlzIG5lZWRlZCBiZWNhdXNlIERlY2xOb2Rlcy50ZCBkZWZpbmVzIHRoZSBiYXNlIERlY2wgbm9kZQorLy8gdHlwZSB0byBiZSBhIGNsYXNzLCBub3QgYSBkZWZpbml0aW9uLiBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gY3JlYXRlIGFuCisvLyBhdHRyaWJ1dGUgc3ViamVjdCB3aGljaCBhY2NlcHRzIGEgRGVjbC4gTm9ybWFsbHksIHRoaXMgaXMgbm90IGEgcHJvYmxlbSwKKy8vIGJlY2F1c2UgdGhlIGF0dHJpYnV0ZSBjYW4gaGF2ZSBubyBTdWJqZWN0cyBjbGF1c2UgdG8gYWNjb21wbGlzaCB0aGlzLiBCdXQgaW4KKy8vIHRoZSBjYXNlIG9mIGEgU3Vic2V0U3ViamVjdCwgdGhlcmUncyBubyB3YXkgdG8gZXhwcmVzcyBpdCB3aXRob3V0IHRoaXMgaGFjay4KK2RlZiBEZWNsQmFzZSA6IEF0dHJTdWJqZWN0OworZGVmIEZ1bmN0aW9uTGlrZSA6IFN1YnNldFN1YmplY3Q8RGVjbEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3tTLT5nZXRGdW5jdGlvblR5cGUoZmFsc2UpICE9IE5VTEx9XT47CisKKy8vIEhhc0Z1bmN0aW9uUHJvdG8gaXMgYSBtb3JlIHN0cmljdCB2ZXJzaW9uIG9mIEZ1bmN0aW9uTGlrZSwgc28gaXQgc2hvdWxkCisvLyBuZXZlciBiZSBzcGVjaWZpZWQgaW4gYSBTdWJqZWN0cyBsaXN0IGFsb25nIHdpdGggRnVuY3Rpb25MaWtlIChkdWUgdG8gdGhlCisvLyBpbmNsdXNpdmUgbmF0dXJlIG9mIHN1YmplY3QgdGVzdGluZykuCitkZWYgSGFzRnVuY3Rpb25Qcm90byA6IFN1YnNldFN1YmplY3Q8RGVjbEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3soUy0+Z2V0RnVuY3Rpb25UeXBlKHRydWUpICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzYTxGdW5jdGlvblByb3RvVHlwZT4oUy0+Z2V0RnVuY3Rpb25UeXBlKCkpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNhPE9iakNNZXRob2REZWNsPihTKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNhPEJsb2NrRGVjbD4oUyl9XT47CisKIC8vIEEgc2luZ2xlIGFyZ3VtZW50IHRvIGFuIGF0dHJpYnV0ZQogY2xhc3MgQXJndW1lbnQ8c3RyaW5nIG5hbWUsIGJpdCBvcHRpb25hbD4gewogICBzdHJpbmcgTmFtZSA9IG5hbWU7CkBAIC01Niw3ICsxMzgsNiBAQAogY2xhc3MgRnVuY3Rpb25Bcmd1bWVudDxzdHJpbmcgbmFtZSwgYml0IG9wdCA9IDA+IDogQXJndW1lbnQ8bmFtZSwgb3B0PjsKIGNsYXNzIFR5cGVBcmd1bWVudDxzdHJpbmcgbmFtZSwgYml0IG9wdCA9IDA+IDogQXJndW1lbnQ8bmFtZSwgb3B0PjsKIGNsYXNzIFVuc2lnbmVkQXJndW1lbnQ8c3RyaW5nIG5hbWUsIGJpdCBvcHQgPSAwPiA6IEFyZ3VtZW50PG5hbWUsIG9wdD47Ci1jbGFzcyBTb3VyY2VMb2NBcmd1bWVudDxzdHJpbmcgbmFtZSwgYml0IG9wdCA9IDA+IDogQXJndW1lbnQ8bmFtZSwgb3B0PjsKIGNsYXNzIFZhcmlhZGljVW5zaWduZWRBcmd1bWVudDxzdHJpbmcgbmFtZT4gOiBBcmd1bWVudDxuYW1lLCAxPjsKIGNsYXNzIFZhcmlhZGljRXhwckFyZ3VtZW50PHN0cmluZyBuYW1lPiA6IEFyZ3VtZW50PG5hbWUsIDE+OwogCkBAIC02OCw2ICsxNDksMTEgQEAKIC8vIGJlIGRlcGVuZGVudC4KIGNsYXNzIEFsaWduZWRBcmd1bWVudDxzdHJpbmcgbmFtZSwgYml0IG9wdCA9IDA+IDogQXJndW1lbnQ8bmFtZSwgb3B0PjsKIAorLy8gQSBib29sIGFyZ3VtZW50IHdpdGggYSBkZWZhdWx0IHZhbHVlCitjbGFzcyBEZWZhdWx0Qm9vbEFyZ3VtZW50PHN0cmluZyBuYW1lLCBiaXQgZGVmYXVsdD4gOiBCb29sQXJndW1lbnQ8bmFtZSwgMT4geworICBiaXQgRGVmYXVsdCA9IGRlZmF1bHQ7Cit9CisKIC8vIEFuIGludGVnZXIgYXJndW1lbnQgd2l0aCBhIGRlZmF1bHQgdmFsdWUKIGNsYXNzIERlZmF1bHRJbnRBcmd1bWVudDxzdHJpbmcgbmFtZSwgaW50IGRlZmF1bHQ+IDogSW50QXJndW1lbnQ8bmFtZSwgMT4gewogICBpbnQgRGVmYXVsdCA9IGRlZmF1bHQ7CkBAIC05NSw2ICsxODEsNyBAQAogY2xhc3MgU3BlbGxpbmc8c3RyaW5nIG5hbWUsIHN0cmluZyB2YXJpZXR5PiB7CiAgIHN0cmluZyBOYW1lID0gbmFtZTsKICAgc3RyaW5nIFZhcmlldHkgPSB2YXJpZXR5OworICBiaXQgS25vd25Ub0dDQzsKIH0KIAogY2xhc3MgR05VPHN0cmluZyBuYW1lPiA6IFNwZWxsaW5nPG5hbWUsICJHTlUiPjsKQEAgLTEwNCwxNiArMTkxLDU4IEBACiB9CiBjbGFzcyBLZXl3b3JkPHN0cmluZyBuYW1lPiA6IFNwZWxsaW5nPG5hbWUsICJLZXl3b3JkIj47CiAKKy8vIFRoZSBHQ0Mgc3BlbGxpbmcgaW1wbGllcyBHTlU8bmFtZSwgIkdOVSI+IGFuZCBDWFgxMTwiZ251IiwgbmFtZT4gYW5kIGFsc28KKy8vIHNldHMgS25vd25Ub0dDQyB0byAxLiBUaGlzIHNwZWxsaW5nIHNob3VsZCBiZSB1c2VkIGZvciBhbnkgR0NDLWNvbXBhdGlibGUKKy8vIGF0dHJpYnV0ZXMuCitjbGFzcyBHQ0M8c3RyaW5nIG5hbWU+IDogU3BlbGxpbmc8bmFtZSwgIkdDQyI+IHsKKyAgbGV0IEtub3duVG9HQ0MgPSAxOworfQorCiBjbGFzcyBBY2Nlc3NvcjxzdHJpbmcgbmFtZSwgbGlzdDxTcGVsbGluZz4gc3BlbGxpbmdzPiB7CiAgIHN0cmluZyBOYW1lID0gbmFtZTsKICAgbGlzdDxTcGVsbGluZz4gU3BlbGxpbmdzID0gc3BlbGxpbmdzOwogfQogCitjbGFzcyBTdWJqZWN0RGlhZzxiaXQgd2Fybj4geworICBiaXQgV2FybiA9IHdhcm47Cit9CitkZWYgV2FybkRpYWcgOiBTdWJqZWN0RGlhZzwxPjsKK2RlZiBFcnJvckRpYWcgOiBTdWJqZWN0RGlhZzwwPjsKKworY2xhc3MgU3ViamVjdExpc3Q8bGlzdDxBdHRyU3ViamVjdD4gc3ViamVjdHMsIFN1YmplY3REaWFnIGRpYWcgPSBXYXJuRGlhZywKKyAgICAgICAgICAgICAgICAgIHN0cmluZyBjdXN0b21EaWFnID0gIiI+IHsKKyAgbGlzdDxBdHRyU3ViamVjdD4gU3ViamVjdHMgPSBzdWJqZWN0czsKKyAgU3ViamVjdERpYWcgRGlhZyA9IGRpYWc7CisgIHN0cmluZyBDdXN0b21EaWFnID0gY3VzdG9tRGlhZzsKK30KKworY2xhc3MgTGFuZ09wdDxzdHJpbmcgbmFtZT4geworICBzdHJpbmcgTmFtZSA9IG5hbWU7Cit9CitkZWYgTWljcm9zb2Z0RXh0IDogTGFuZ09wdDwiTWljcm9zb2Z0RXh0Ij47CitkZWYgQm9ybGFuZCA6IExhbmdPcHQ8IkJvcmxhbmQiPjsKK2RlZiBDVURBIDogTGFuZ09wdDwiQ1VEQSI+OworCisvLyBEZWZpbmVzIHRhcmdldHMgZm9yIHRhcmdldC1zcGVjaWZpYyBhdHRyaWJ1dGVzLiBUaGUgbGlzdCBvZiBzdHJpbmdzIHNob3VsZAorLy8gc3BlY2lmeSBhcmNoaXRlY3R1cmVzIGZvciB3aGljaCB0aGUgdGFyZ2V0IGFwcGxpZXMsIGJhc2VkIG9mZiB0aGUgQXJjaFR5cGUKKy8vIGVudW1lcmF0aW9uIGluIFRyaXBsZS5oLgorY2xhc3MgVGFyZ2V0QXJjaDxsaXN0PHN0cmluZz4gYXJjaGVzPiB7CisgIGxpc3Q8c3RyaW5nPiBBcmNoZXMgPSBhcmNoZXM7CisgIGxpc3Q8c3RyaW5nPiBPU2VzOworfQorZGVmIFRhcmdldEFSTSA6IFRhcmdldEFyY2g8WyJhcm0iLCAidGh1bWIiXT47CitkZWYgVGFyZ2V0TVNQNDMwIDogVGFyZ2V0QXJjaDxbIm1zcDQzMCJdPjsKK2RlZiBUYXJnZXRYODYgOiBUYXJnZXRBcmNoPFsieDg2Il0+OworZGVmIFRhcmdldFg4NldpbiA6IFRhcmdldEFyY2g8WyJ4ODYiLCAieDg2XzY0Il0+IHsKKyAgbGV0IE9TZXMgPSBbIldpbjMyIl07Cit9CitkZWYgVGFyZ2V0TWlwcyA6IFRhcmdldEFyY2g8WyJtaXBzIiwgIm1pcHNlbCJdPjsKKwogY2xhc3MgQXR0ciB7CiAgIC8vIFRoZSB2YXJpb3VzIHdheXMgaW4gd2hpY2ggYW4gYXR0cmlidXRlIGNhbiBiZSBzcGVsbGVkIGluIHNvdXJjZQogICBsaXN0PFNwZWxsaW5nPiBTcGVsbGluZ3M7CiAgIC8vIFRoZSB0aGluZ3MgdG8gd2hpY2ggYW4gYXR0cmlidXRlIGNhbiBhcHBlcnRhaW4KLSAgbGlzdDxBdHRyU3ViamVjdD4gU3ViamVjdHM7CisgIFN1YmplY3RMaXN0IFN1YmplY3RzOwogICAvLyBUaGUgYXJndW1lbnRzIGFsbG93ZWQgb24gYW4gYXR0cmlidXRlCiAgIGxpc3Q8QXJndW1lbnQ+IEFyZ3MgPSBbXTsKICAgLy8gQWNjZXNzb3JzIHdoaWNoIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBhdHRyaWJ1dGUuCkBAIC0xMzEsMjggKzI2MCw1NSBAQAogICBiaXQgU2VtYUhhbmRsZXIgPSAxOwogICAvLyBTZXQgdG8gdHJ1ZSBmb3IgYXR0cmlidXRlcyB0aGF0IGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQuCiAgIGJpdCBJZ25vcmVkID0gMDsKLSAgLy8gU2V0IHRvIHRydWUgaWYgZWFjaCBvZiB0aGUgc3BlbGxpbmdzIGlzIGEgZGlzdGluY3QgYXR0cmlidXRlLgotICBiaXQgRGlzdGluY3RTcGVsbGluZ3MgPSAwOwogICAvLyBTZXQgdG8gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlJ3MgcGFyc2luZyBkb2VzIG5vdCBtYXRjaCBpdHMgc2VtYW50aWMKICAgLy8gY29udGVudC4gRWcpIEl0IHBhcnNlcyAzIGFyZ3MsIGJ1dCBzZW1hbnRpY2FsbHkgdGFrZXMgNCBhcmdzLiAgT3B0cyBvdXQgb2YKICAgLy8gY29tbW9uIGF0dHJpYnV0ZSBlcnJvciBjaGVja2luZy4KICAgYml0IEhhc0N1c3RvbVBhcnNpbmcgPSAwOworICAvLyBTZXQgdG8gdHJ1ZSBpZiBhbGwgb2YgdGhlIGF0dHJpYnV0ZSdzIGFyZ3VtZW50cyBzaG91bGQgYmUgcGFyc2VkIGluIGFuCisgIC8vIHVuZXZhbHVhdGVkIGNvbnRleHQuCisgIGJpdCBQYXJzZUFyZ3VtZW50c0FzVW5ldmFsdWF0ZWQgPSAwOworICAvLyBTZXQgdG8gdHJ1ZSBpZiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgZHVwbGljYXRlZCBvbiBhIHN1YmplY3Qgd2hlbiBtZXJnaW5nCisgIC8vIGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIGF0dHJpYnV0ZXMgYXJlIG5vdCBtZXJnZWQuCisgIGJpdCBEdXBsaWNhdGVzQWxsb3dlZFdoaWxlTWVyZ2luZyA9IDA7CisgIC8vIExpc3RzIGxhbmd1YWdlIG9wdGlvbnMsIG9uZSBvZiB3aGljaCBpcyByZXF1aXJlZCB0byBiZSB0cnVlIGZvciB0aGUKKyAgLy8gYXR0cmlidXRlIHRvIGJlIGFwcGxpY2FibGUuIElmIGVtcHR5LCBubyBsYW5ndWFnZSBvcHRpb25zIGFyZSByZXF1aXJlZC4KKyAgbGlzdDxMYW5nT3B0PiBMYW5nT3B0cyA9IFtdOwogICAvLyBBbnkgYWRkaXRpb25hbCB0ZXh0IHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIHZlcmJhdGltIGluIHRoZSBjbGFzcy4KICAgY29kZSBBZGRpdGlvbmFsTWVtYmVycyA9IFt7fV07CisgIC8vIEFueSBkb2N1bWVudGF0aW9uIHRoYXQgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlLiBTaW5jZSBhbgorICAvLyBhdHRyaWJ1dGUgbWF5IGJlIGRvY3VtZW50ZWQgdW5kZXIgbXVsdGlwbGUgY2F0ZWdvcmllcywgbW9yZSB0aGFuIG9uZQorICAvLyBEb2N1bWVudGF0aW9uIGVudHJ5IG1heSBiZSBsaXN0ZWQuCisgIGxpc3Q8RG9jdW1lbnRhdGlvbj4gRG9jdW1lbnRhdGlvbjsKIH0KIAogLy8vIEEgdHlwZSBhdHRyaWJ1dGUgaXMgbm90IHByb2Nlc3NlZCBvbiBhIGRlY2xhcmF0aW9uIG9yIGEgc3RhdGVtZW50LgogY2xhc3MgVHlwZUF0dHIgOiBBdHRyIHsKKyAgLy8gQnkgZGVmYXVsdCwgdHlwZSBhdHRyaWJ1dGVzIGRvIG5vdCBnZXQgYW4gQVNUIG5vZGUuCiAgIGxldCBBU1ROb2RlID0gMDsKIH0KIAogLy8vIEFuIGluaGVyaXRhYmxlIGF0dHJpYnV0ZSBpcyBpbmhlcml0ZWQgYnkgbGF0ZXIgcmVkZWNsYXJhdGlvbnMuCiBjbGFzcyBJbmhlcml0YWJsZUF0dHIgOiBBdHRyOwogCi0vLy8gQSB0YXJnZXQtc3BlY2lmaWMgYXR0cmlidXRlIHRoYXQgaXMgbWVhbnQgdG8gYmUgcHJvY2Vzc2VkIHZpYQotLy8vIFRhcmdldEF0dHJpYnV0ZXNTZW1hOjpQcm9jZXNzRGVjbEF0dHJpYnV0ZS4gIFRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gYmUgdXNlZAotLy8vIGFzIGEgbWl4aW4gd2l0aCBJbmhlcml0YWJsZUF0dHIgb3IgQXR0ciBkZXBlbmRpbmcgb24gdGhlIGF0dHJpYnV0ZSdzIG5lZWRzLgotY2xhc3MgVGFyZ2V0U3BlY2lmaWNBdHRyOworLy8vIEEgdGFyZ2V0LXNwZWNpZmljIGF0dHJpYnV0ZS4gIFRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIG1peGluCisvLy8gd2l0aCBJbmhlcml0YWJsZUF0dHIgb3IgQXR0ciBkZXBlbmRpbmcgb24gdGhlIGF0dHJpYnV0ZSdzIG5lZWRzLgorY2xhc3MgVGFyZ2V0U3BlY2lmaWNBdHRyPFRhcmdldEFyY2ggdGFyZ2V0PiB7CisgIFRhcmdldEFyY2ggVGFyZ2V0ID0gdGFyZ2V0OworICAvLyBBdHRyaWJ1dGVzIGFyZSBnZW5lcmFsbHkgcmVxdWlyZWQgdG8gaGF2ZSB1bmlxdWUgc3BlbGxpbmdzIGZvciB0aGVpciBuYW1lcworICAvLyBzbyB0aGF0IHRoZSBwYXJzZXIgY2FuIGRldGVybWluZSB3aGF0IGtpbmQgb2YgYXR0cmlidXRlIGl0IGhhcyBwYXJzZWQuCisgIC8vIEhvd2V2ZXIsIHRhcmdldC1zcGVjaWZpYyBhdHRyaWJ1dGVzIGFyZSBzcGVjaWFsIGluIHRoYXQgdGhlIGF0dHJpYnV0ZSBvbmx5CisgIC8vICJleGlzdHMiIGZvciBhIGdpdmVuIHRhcmdldC4gU28gdHdvIHRhcmdldC1zcGVjaWZpYyBhdHRyaWJ1dGVzIGNhbiBzaGFyZQorICAvLyB0aGUgc2FtZSBuYW1lIHdoZW4gdGhleSBleGlzdCBpbiBkaWZmZXJlbnQgdGFyZ2V0cy4gVG8gc3VwcG9ydCB0aGlzLCBhCisgIC8vIEtpbmQgY2FuIGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGZvciBhIHRhcmdldC1zcGVjaWZpYyBhdHRyaWJ1dGUuIFRoaXMKKyAgLy8gY29ycmVzcG9uZHMgdG8gdGhlIEF0dHJpYnV0ZUxpc3Q6OkFUXyogZW51bSB0aGF0IGlzIGdlbmVyYXRlZCBhbmQgaXQKKyAgLy8gc2hvdWxkIGNvbnRhaW4gYSBzaGFyZWQgdmFsdWUgYmV0d2VlbiB0aGUgYXR0cmlidXRlcy4KKyAgLy8KKyAgLy8gVGFyZ2V0LXNwZWNpZmljIGF0dHJpYnV0ZXMgd2hpY2ggdXNlIHRoaXMgZmVhdHVyZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlCisgIC8vIHNwZWxsaW5ncyBtYXRjaCBleGFjdGx5IGJldHdlZWVuIHRoZSBhdHRyaWJ1dGVzLCBhbmQgaWYgdGhlIGFyZ3VtZW50cyBvcgorICAvLyBzdWJqZWN0cyBkaWZmZXIsIHNob3VsZCBzcGVjaWZ5IEhhc0N1c3RvbVBhcnNpbmcgPSAxIGFuZCBpbXBsZW1lbnQgdGhlaXIKKyAgLy8gb3duIHBhcnNpbmcgYW5kIHNlbWFudGljIGhhbmRsaW5nIHJlcXVpcmVtZW50cyBhcy1uZWVkZWQuCisgIHN0cmluZyBQYXJzZUtpbmQ7Cit9CiAKIC8vLyBBbiBpbmhlcml0YWJsZSBwYXJhbWV0ZXIgYXR0cmlidXRlIGlzIGluaGVyaXRlZCBieSBsYXRlcgogLy8vIHJlZGVjbGFyYXRpb25zLCBldmVuIHdoZW4gaXQncyB3cml0dGVuIG9uIGEgcGFyYW1ldGVyLgpAQCAtMTYzLDYgKzMxOSw3IEBACiAgIGxldCBJZ25vcmVkID0gMTsKICAgbGV0IEFTVE5vZGUgPSAwOwogICBsZXQgU2VtYUhhbmRsZXIgPSAwOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiAvLwpAQCAtMTcyLDY2ICszMjksNzcgQEAKIGRlZiBBZGRyZXNzU3BhY2UgOiBUeXBlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJhZGRyZXNzX3NwYWNlIj5dOwogICBsZXQgQXJncyA9IFtJbnRBcmd1bWVudDwiQWRkcmVzc1NwYWNlIj5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgQWxpYXMgOiBBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImFsaWFzIj4sIENYWDExPCJnbnUiLCAiYWxpYXMiPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJhbGlhcyI+XTsKICAgbGV0IEFyZ3MgPSBbU3RyaW5nQXJndW1lbnQ8IkFsaWFzZWUiPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBBbGlnbmVkIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImFsaWduZWQiPiwgRGVjbHNwZWM8ImFsaWduIj4sIENYWDExPCJnbnUiLCAiYWxpZ25lZCI+LAotICAgICAgICAgICAgICAgICAgIEtleXdvcmQ8ImFsaWduYXMiPiwgS2V5d29yZDwiX0FsaWduYXMiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtOb25CaXRGaWVsZCwgTm9ybWFsVmFyLCBUYWddOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwiYWxpZ25lZCI+LCBEZWNsc3BlYzwiYWxpZ24iPiwgS2V5d29yZDwiYWxpZ25hcyI+LAorICAgICAgICAgICAgICAgICAgIEtleXdvcmQ8Il9BbGlnbmFzIj5dOworLy8gIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtOb25CaXRGaWVsZCwgTm9ybWFsVmFyLCBUYWddPjsKICAgbGV0IEFyZ3MgPSBbQWxpZ25lZEFyZ3VtZW50PCJBbGlnbm1lbnQiLCAxPl07Ci0gIGxldCBBY2Nlc3NvcnMgPSBbQWNjZXNzb3I8ImlzR05VIiwgW0dOVTwiYWxpZ25lZCI+LCBDWFgxMTwiZ251IiwiYWxpZ25lZCI+XT4sCisgIGxldCBBY2Nlc3NvcnMgPSBbQWNjZXNzb3I8ImlzR05VIiwgW0dDQzwiYWxpZ25lZCI+XT4sCiAgICAgICAgICAgICAgICAgICAgQWNjZXNzb3I8ImlzQzExIiwgW0tleXdvcmQ8Il9BbGlnbmFzIj5dPiwKICAgICAgICAgICAgICAgICAgICBBY2Nlc3NvcjwiaXNBbGlnbmFzIiwgW0tleXdvcmQ8ImFsaWduYXMiPiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXdvcmQ8Il9BbGlnbmFzIj5dPiwKICAgICAgICAgICAgICAgICAgICBBY2Nlc3NvcjwiaXNEZWNsc3BlYyIsW0RlY2xzcGVjPCJhbGlnbiI+XT5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgQWxpZ25NYWM2OGsgOiBJbmhlcml0YWJsZUF0dHIgeworICAvLyBUaGlzIGF0dHJpYnV0ZSBoYXMgbm8gc3BlbGxpbmdzIGFzIGl0IGlzIG9ubHkgZXZlciBjcmVhdGVkIGltcGxpY2l0bHkuCiAgIGxldCBTcGVsbGluZ3MgPSBbXTsKICAgbGV0IFNlbWFIYW5kbGVyID0gMDsKLX0KLQotZGVmIEFsbG9jU2l6ZSA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJhbGxvY19zaXplIj4sIENYWDExPCJnbnUiLCAiYWxsb2Nfc2l6ZSI+XTsKLSAgbGV0IEFyZ3MgPSBbVmFyaWFkaWNVbnNpZ25lZEFyZ3VtZW50PCJBcmdzIj5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgQWx3YXlzSW5saW5lIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImFsd2F5c19pbmxpbmUiPiwgQ1hYMTE8ImdudSIsICJhbHdheXNfaW5saW5lIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwiYWx3YXlzX2lubGluZSI+LCBLZXl3b3JkPCJfX2ZvcmNlaW5saW5lIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb25dPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIFRMU01vZGVsIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InRsc19tb2RlbCI+LCBDWFgxMTwiZ251IiwgInRsc19tb2RlbCI+XTsKLSAgbGV0IFN1YmplY3RzID0gW1Zhcl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJ0bHNfbW9kZWwiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtUTFNWYXJdLCBFcnJvckRpYWcsICJFeHBlY3RlZFRMU1ZhciI+OwogICBsZXQgQXJncyA9IFtTdHJpbmdBcmd1bWVudDwiTW9kZWwiPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1RMU01vZGVsRG9jc107CiB9CiAKIGRlZiBBbmFseXplck5vUmV0dXJuIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImFuYWx5emVyX25vcmV0dXJuIj5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgQW5ub3RhdGUgOiBJbmhlcml0YWJsZVBhcmFtQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJhbm5vdGF0ZSI+XTsKICAgbGV0IEFyZ3MgPSBbU3RyaW5nQXJndW1lbnQ8IkFubm90YXRpb24iPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKLWRlZiBBUk1JbnRlcnJ1cHQgOiBJbmhlcml0YWJsZUF0dHIsIFRhcmdldFNwZWNpZmljQXR0ciB7CitkZWYgQVJNSW50ZXJydXB0IDogSW5oZXJpdGFibGVBdHRyLCBUYXJnZXRTcGVjaWZpY0F0dHI8VGFyZ2V0QVJNPiB7CisgIC8vIE5PVEU6IElmIHlvdSBhZGQgYW55IGFkZGl0aW9uYWwgc3BlbGxpbmdzLCBNU1A0MzBJbnRlcnJ1cHQncyBzcGVsbGluZ3MKKyAgLy8gbXVzdCBtYXRjaC4KICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImludGVycnVwdCI+XTsKICAgbGV0IEFyZ3MgPSBbRW51bUFyZ3VtZW50PCJJbnRlcnJ1cHQiLCAiSW50ZXJydXB0VHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIklSUSIsICJGSVEiLCAiU1dJIiwgIkFCT1JUIiwgIlVOREVGIiwgIiJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJJUlEiLCAiRklRIiwgIlNXSSIsICJBQk9SVCIsICJVTkRFRiIsICJHZW5lcmljIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPl07CisgIGxldCBQYXJzZUtpbmQgPSAiSW50ZXJydXB0IjsKKyAgbGV0IEhhc0N1c3RvbVBhcnNpbmcgPSAxOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtBUk1JbnRlcnJ1cHREb2NzXTsKIH0KIAogZGVmIEFzbUxhYmVsIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtdOworICBsZXQgU3BlbGxpbmdzID0gW0tleXdvcmQ8ImFzbSI+LCBLZXl3b3JkPCJfX2FzbV9fIj5dOwogICBsZXQgQXJncyA9IFtTdHJpbmdBcmd1bWVudDwiTGFiZWwiPl07CiAgIGxldCBTZW1hSGFuZGxlciA9IDA7CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBBdmFpbGFiaWxpdHkgOiBJbmhlcml0YWJsZUF0dHIgewpAQCAtMjQ3LDExICs0MTUsMTUgQEAKICAgICAgICAgICAgICAuRGVmYXVsdChsbHZtOjpTdHJpbmdSZWYoKSk7CiB9IH1dOwogICBsZXQgSGFzQ3VzdG9tUGFyc2luZyA9IDE7CisgIGxldCBEdXBsaWNhdGVzQWxsb3dlZFdoaWxlTWVyZ2luZyA9IDE7CisvLyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W05hbWVkXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW0F2YWlsYWJpbGl0eURvY3NdOwogfQogCiBkZWYgQmxvY2tzIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImJsb2NrcyI+XTsKICAgbGV0IEFyZ3MgPSBbRW51bUFyZ3VtZW50PCJUeXBlIiwgIkJsb2NrVHlwZSIsIFsiYnlyZWYiXSwgWyJCeVJlZiJdPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBCb3VuZGVkIDogSWdub3JlZEF0dHIgewpAQCAtMjU5LDE0ICs0MzEsMTUgQEAKIH0KIAogZGVmIENhcnJpZXNEZXBlbmRlbmN5IDogSW5oZXJpdGFibGVQYXJhbUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiY2Fycmllc19kZXBlbmRlbmN5Ij4sIENYWDExPCIiLCJjYXJyaWVzX2RlcGVuZGVuY3kiPiwKLSAgICAgICAgICAgICAgICAgICBDWFgxMTwic3RkIiwiY2Fycmllc19kZXBlbmRlbmN5Ij5dOwotICBsZXQgU3ViamVjdHMgPSBbUGFybVZhciwgRnVuY3Rpb25dOworICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiY2Fycmllc19kZXBlbmRlbmN5Ij4sIENYWDExPCIiLCJjYXJyaWVzX2RlcGVuZGVuY3kiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtQYXJtVmFyLCBPYmpDTWV0aG9kLCBGdW5jdGlvbl0sIEVycm9yRGlhZz47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW0NhcnJpZXNEZXBlbmRlbmN5RG9jc107CiB9CiAKIGRlZiBDRGVjbCA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJjZGVjbCI+LCBDWFgxMTwiZ251IiwgImNkZWNsIj4sIEtleXdvcmQ8Il9fY2RlY2wiPiwKLSAgICAgICAgICAgICAgICAgICBLZXl3b3JkPCJfY2RlY2wiPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJjZGVjbCI+LCBLZXl3b3JkPCJfX2NkZWNsIj4sIEtleXdvcmQ8Il9jZGVjbCI+XTsKKy8vICBsZXQgU3ViamVjdHMgPSBbRnVuY3Rpb24sIE9iakNNZXRob2RdOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiAvLyBjZl9hdWRpdGVkX3RyYW5zZmVyIGluZGljYXRlcyB0aGF0IHRoZSBnaXZlbiBmdW5jdGlvbiBoYXMgYmVlbgpAQCAtMjc1LDcgKzQ0OCw4IEBACiAvLyAnI3ByYWdtYSBjbGFuZyBhcmNfY2ZfY29kZV9hdWRpdGVkJyByYXRoZXIgdGhhbiBleHBsaWNpdGx5LgogZGVmIENGQXVkaXRlZFRyYW5zZmVyIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImNmX2F1ZGl0ZWRfdHJhbnNmZXIiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtGdW5jdGlvbl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbl0sIEVycm9yRGlhZz47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIC8vIGNmX3Vua25vd25fdHJhbnNmZXIgaXMgYW4gZXhwbGljaXQgb3B0LW91dCBvZiBjZl9hdWRpdGVkX3RyYW5zZmVyLgpAQCAtMjgzLDIzNyArNDU3LDM4MSBAQAogLy8gdHJhbnNmZXIgc2VtYW50aWNzLgogZGVmIENGVW5rbm93blRyYW5zZmVyIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImNmX3Vua25vd25fdHJhbnNmZXIiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtGdW5jdGlvbl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbl0sIEVycm9yRGlhZz47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBDRlJldHVybnNSZXRhaW5lZCA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJjZl9yZXR1cm5zX3JldGFpbmVkIj5dOwotICBsZXQgU3ViamVjdHMgPSBbT2JqQ01ldGhvZCwgRnVuY3Rpb25dOworLy8gIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtPYmpDTWV0aG9kLCBPYmpDUHJvcGVydHksIEZ1bmN0aW9uXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBDRlJldHVybnNOb3RSZXRhaW5lZCA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJjZl9yZXR1cm5zX25vdF9yZXRhaW5lZCI+XTsKLSAgbGV0IFN1YmplY3RzID0gW09iakNNZXRob2QsIEZ1bmN0aW9uXTsKKy8vICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbT2JqQ01ldGhvZCwgT2JqQ1Byb3BlcnR5LCBGdW5jdGlvbl0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgQ0ZDb25zdW1lZCA6IEluaGVyaXRhYmxlUGFyYW1BdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImNmX2NvbnN1bWVkIj5dOwotICBsZXQgU3ViamVjdHMgPSBbUGFybVZhcl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtQYXJtVmFyXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBDbGVhbnVwIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImNsZWFudXAiPiwgQ1hYMTE8ImdudSIsICJjbGVhbnVwIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwiY2xlYW51cCI+XTsKICAgbGV0IEFyZ3MgPSBbRnVuY3Rpb25Bcmd1bWVudDwiRnVuY3Rpb25EZWNsIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbVmFyXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBDb2xkIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImNvbGQiPiwgQ1hYMTE8ImdudSIsICJjb2xkIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwiY29sZCI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBDb21tb24gOiBJbmhlcml0YWJsZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiY29tbW9uIj4sIENYWDExPCJnbnUiLCAiY29tbW9uIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwiY29tbW9uIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbVmFyXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBDb25zdCA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJjb25zdCI+LCBHTlU8Il9fY29uc3QiPiwKLSAgICAgICAgICAgICAgICAgICBDWFgxMTwiZ251IiwgImNvbnN0Ij4sIENYWDExPCJnbnUiLCAiX19jb25zdCI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8ImNvbnN0Ij4sIEdDQzwiX19jb25zdCI+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIENvbnN0cnVjdG9yIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImNvbnN0cnVjdG9yIj4sIENYWDExPCJnbnUiLCAiY29uc3RydWN0b3IiPl07Ci0gIGxldCBBcmdzID0gW0ludEFyZ3VtZW50PCJQcmlvcml0eSIsIDE+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8ImNvbnN0cnVjdG9yIj5dOworICBsZXQgQXJncyA9IFtEZWZhdWx0SW50QXJndW1lbnQ8IlByaW9yaXR5IiwgNjU1MzU+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBDVURBQ29uc3RhbnQgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiY29uc3RhbnQiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtWYXJdPjsKKyAgbGV0IExhbmdPcHRzID0gW0NVREFdOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgQ1VEQURldmljZSA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJkZXZpY2UiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbiwgVmFyXT47CisgIGxldCBMYW5nT3B0cyA9IFtDVURBXTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIENVREFHbG9iYWwgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiZ2xvYmFsIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb25dPjsKKyAgbGV0IExhbmdPcHRzID0gW0NVREFdOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgQ1VEQUhvc3QgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiaG9zdCI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uXT47CisgIGxldCBMYW5nT3B0cyA9IFtDVURBXTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIENVREFMYXVuY2hCb3VuZHMgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibGF1bmNoX2JvdW5kcyI+XTsKICAgbGV0IEFyZ3MgPSBbSW50QXJndW1lbnQ8Ik1heFRocmVhZHMiPiwgRGVmYXVsdEludEFyZ3VtZW50PCJNaW5CbG9ja3MiLCAwPl07CisgIGxldCBMYW5nT3B0cyA9IFtDVURBXTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W09iakNNZXRob2QsIEZ1bmN0aW9uTGlrZV0sIFdhcm5EaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWRGdW5jdGlvbk9yTWV0aG9kIj47CisgIC8vIEFuIEFTVCBub2RlIGlzIGNyZWF0ZWQgZm9yIHRoaXMgYXR0cmlidXRlLCBidXQgaXMgbm90IHVzZWQgYnkgb3RoZXIgcGFydHMKKyAgLy8gb2YgdGhlIGNvbXBpbGVyLiBIb3dldmVyLCB0aGlzIG5vZGUgbmVlZHMgdG8gZXhpc3QgaW4gdGhlIEFTVCBiZWNhdXNlCisgIC8vIG5vbi1MTFZNIGJhY2tlbmRzIG1heSBiZSByZWx5aW5nIG9uIHRoZSBhdHRyaWJ1dGUncyBwcmVzZW5jZS4KKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIENVREFTaGFyZWQgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwic2hhcmVkIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbVmFyXT47CisgIGxldCBMYW5nT3B0cyA9IFtDVURBXTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIEMxMU5vUmV0dXJuIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtLZXl3b3JkPCJfTm9yZXR1cm4iPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtGdW5jdGlvbl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbl0sIEVycm9yRGlhZz47CiAgIGxldCBTZW1hSGFuZGxlciA9IDA7CisgIGxldCBEb2N1bWVudGF0aW9uID0gW0MxMU5vUmV0dXJuRG9jc107CiB9CiAKIGRlZiBDWFgxMU5vUmV0dXJuIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtDWFgxMTwiIiwibm9yZXR1cm4iPiwgQ1hYMTE8InN0ZCIsIm5vcmV0dXJuIj5dOwotICBsZXQgU3ViamVjdHMgPSBbRnVuY3Rpb25dOworICBsZXQgU3BlbGxpbmdzID0gW0NYWDExPCIiLCJub3JldHVybiI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uXSwgRXJyb3JEaWFnPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbQ1hYMTFOb1JldHVybkRvY3NdOwogfQogCiBkZWYgT3BlbkNMS2VybmVsIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtLZXl3b3JkPCJfX2tlcm5lbCI+LCBLZXl3b3JkPCJrZXJuZWwiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbl0sIEVycm9yRGlhZz47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKKy8vIFRoaXMgYXR0cmlidXRlIGlzIGJvdGggYSB0eXBlIGF0dHJpYnV0ZSwgYW5kIGEgZGVjbGFyYXRpb24gYXR0cmlidXRlIChmb3IKKy8vIHBhcmFtZXRlciB2YXJpYWJsZXMpLgogZGVmIE9wZW5DTEltYWdlQWNjZXNzIDogQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJvcGVuY2xfaW1hZ2VfYWNjZXNzIj5dOwotICBsZXQgQXJncyA9IFtJbnRBcmd1bWVudDwiQWNjZXNzIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0tleXdvcmQ8Il9fcmVhZF9vbmx5Ij4sIEtleXdvcmQ8InJlYWRfb25seSI+LAorICAgICAgICAgICAgICAgICAgIEtleXdvcmQ8Il9fd3JpdGVfb25seSI+LCBLZXl3b3JkPCJ3cml0ZV9vbmx5Ij4sCisgICAgICAgICAgICAgICAgICAgS2V5d29yZDwiX19yZWFkX3dyaXRlIj4sIEtleXdvcmQ8InJlYWRfd3JpdGUiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtQYXJtVmFyXSwgRXJyb3JEaWFnPjsKKyAgbGV0IEFjY2Vzc29ycyA9IFtBY2Nlc3NvcjwiaXNSZWFkT25seSIsIFtLZXl3b3JkPCJfX3JlYWRfb25seSI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXdvcmQ8InJlYWRfb25seSI+XT4sCisgICAgICAgICAgICAgICAgICAgQWNjZXNzb3I8ImlzUmVhZFdyaXRlIiwgW0tleXdvcmQ8Il9fcmVhZF93cml0ZSI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXl3b3JkPCJyZWFkX3dyaXRlIj5dPiwKKyAgICAgICAgICAgICAgICAgICBBY2Nlc3NvcjwiaXNXcml0ZU9ubHkiLCBbS2V5d29yZDwiX193cml0ZV9vbmx5Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXdvcmQ8IndyaXRlX29ubHkiPl0+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKK30KKworZGVmIE9wZW5DTFByaXZhdGVBZGRyZXNzU3BhY2UgOiBUeXBlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbS2V5d29yZDwiX19wcml2YXRlIj4sIEtleXdvcmQ8InByaXZhdGUiPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07Cit9CisKK2RlZiBPcGVuQ0xHbG9iYWxBZGRyZXNzU3BhY2UgOiBUeXBlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbS2V5d29yZDwiX19nbG9iYWwiPiwgS2V5d29yZDwiZ2xvYmFsIj5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOworfQorCitkZWYgT3BlbkNMTG9jYWxBZGRyZXNzU3BhY2UgOiBUeXBlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbS2V5d29yZDwiX19sb2NhbCI+LCBLZXl3b3JkPCJsb2NhbCI+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKK30KKworZGVmIE9wZW5DTENvbnN0YW50QWRkcmVzc1NwYWNlIDogVHlwZUF0dHIgeworICBsZXQgU3BlbGxpbmdzID0gW0tleXdvcmQ8Il9fY29uc3RhbnQiPiwgS2V5d29yZDwiY29uc3RhbnQiPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBLZXJuZWwgOiBBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Imtlcm5lbCI+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIERlcHJlY2F0ZWQgOiBJbmhlcml0YWJsZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiZGVwcmVjYXRlZCI+LAotICAgICAgICAgICAgICAgICAgIENYWDExPCJnbnUiLCAiZGVwcmVjYXRlZCI+LCBDWFgxMTwiIiwiZGVwcmVjYXRlZCI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8ImRlcHJlY2F0ZWQiPiwgRGVjbHNwZWM8ImRlcHJlY2F0ZWQiPiwKKyAgICAgICAgICAgICAgICAgICBDWFgxMTwiIiwiZGVwcmVjYXRlZCI+XTsKICAgbGV0IEFyZ3MgPSBbU3RyaW5nQXJndW1lbnQ8Ik1lc3NhZ2UiLCAxPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBEZXN0cnVjdG9yIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImRlc3RydWN0b3IiPiwgQ1hYMTE8ImdudSIsICJkZXN0cnVjdG9yIj5dOwotICBsZXQgQXJncyA9IFtJbnRBcmd1bWVudDwiUHJpb3JpdHkiLCAxPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJkZXN0cnVjdG9yIj5dOworICBsZXQgQXJncyA9IFtEZWZhdWx0SW50QXJndW1lbnQ8IlByaW9yaXR5IiwgNjU1MzU+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07Cit9CisKK2RlZiBFbmFibGVJZiA6IEluaGVyaXRhYmxlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJlbmFibGVfaWYiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbl0+OworICBsZXQgQXJncyA9IFtFeHByQXJndW1lbnQ8IkNvbmQiPiwgU3RyaW5nQXJndW1lbnQ8Ik1lc3NhZ2UiPl07CisgIGxldCBUZW1wbGF0ZURlcGVuZGVudCA9IDE7CisgIGxldCBEb2N1bWVudGF0aW9uID0gW0VuYWJsZUlmRG9jc107CiB9CiAKIGRlZiBFeHRWZWN0b3JUeXBlIDogQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJleHRfdmVjdG9yX3R5cGUiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtUeXBlZGVmTmFtZV0sIEVycm9yRGlhZz47CiAgIGxldCBBcmdzID0gW0V4cHJBcmd1bWVudDwiTnVtRWxlbWVudHMiPl07CiAgIGxldCBBU1ROb2RlID0gMDsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIEZhbGxUaHJvdWdoIDogQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbQ1hYMTE8ImNsYW5nIiwgImZhbGx0aHJvdWdoIj5dOwotICBsZXQgU3ViamVjdHMgPSBbTnVsbFN0bXRdOworLy8gIGxldCBTdWJqZWN0cyA9IFtOdWxsU3RtdF07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW0ZhbGx0aHJvdWdoRG9jc107CiB9CiAKIGRlZiBGYXN0Q2FsbCA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJmYXN0Y2FsbCI+LCBDWFgxMTwiZ251IiwgImZhc3RjYWxsIj4sCi0gICAgICAgICAgICAgICAgICAgS2V5d29yZDwiX19mYXN0Y2FsbCI+LCBLZXl3b3JkPCJfZmFzdGNhbGwiPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJmYXN0Y2FsbCI+LCBLZXl3b3JkPCJfX2Zhc3RjYWxsIj4sCisgICAgICAgICAgICAgICAgICAgS2V5d29yZDwiX2Zhc3RjYWxsIj5dOworLy8gIGxldCBTdWJqZWN0cyA9IFtGdW5jdGlvbiwgT2JqQ01ldGhvZF07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBGaW5hbCA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbS2V5d29yZDwiZmluYWwiPiwgS2V5d29yZDwic2VhbGVkIj5dOwogICBsZXQgQWNjZXNzb3JzID0gW0FjY2Vzc29yPCJpc1NwZWxsZWRBc1NlYWxlZCIsIFtLZXl3b3JkPCJzZWFsZWQiPl0+XTsKICAgbGV0IFNlbWFIYW5kbGVyID0gMDsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIE1pblNpemUgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibWluc2l6ZSI+XTsKLSAgbGV0IFN1YmplY3RzID0gW0Z1bmN0aW9uXTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uLCBPYmpDTWV0aG9kXSwgRXJyb3JEaWFnPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIEZvcm1hdCA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJmb3JtYXQiPiwgQ1hYMTE8ImdudSIsICJmb3JtYXQiPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJmb3JtYXQiPl07CiAgIGxldCBBcmdzID0gW0lkZW50aWZpZXJBcmd1bWVudDwiVHlwZSI+LCBJbnRBcmd1bWVudDwiRm9ybWF0SWR4Ij4sCiAgICAgICAgICAgICAgIEludEFyZ3VtZW50PCJGaXJzdEFyZyI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W09iakNNZXRob2QsIEJsb2NrLCBIYXNGdW5jdGlvblByb3RvXSwgV2FybkRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZEZ1bmN0aW9uIj47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW0Zvcm1hdERvY3NdOwogfQogCiBkZWYgRm9ybWF0QXJnIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImZvcm1hdF9hcmciPiwgQ1hYMTE8ImdudSIsICJmb3JtYXRfYXJnIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwiZm9ybWF0X2FyZyI+XTsKICAgbGV0IEFyZ3MgPSBbSW50QXJndW1lbnQ8IkZvcm1hdElkeCI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W09iakNNZXRob2QsIEhhc0Z1bmN0aW9uUHJvdG9dLCBXYXJuRGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkRnVuY3Rpb24iPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIEdOVUlubGluZSA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJnbnVfaW5saW5lIj4sIENYWDExPCJnbnUiLCAiZ251X2lubGluZSI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8ImdudV9pbmxpbmUiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbl0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgSG90IDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImhvdCI+LCBDWFgxMTwiZ251IiwgImhvdCI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8ImhvdCI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uXT47CisgIC8vIEFuIEFTVCBub2RlIGlzIGNyZWF0ZWQgZm9yIHRoaXMgYXR0cmlidXRlLCBidXQgbm90IGFjdHVhbGx5IHVzZWQgYmV5b25kCisgIC8vIHNlbWFudGljIGNoZWNraW5nIGZvciBtdXR1YWwgZXhjbHVzaW9uIHdpdGggdGhlIENvbGQgYXR0cmlidXRlLgorICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgSUJBY3Rpb24gOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiaWJhY3Rpb24iPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtPYmpDSW5zdGFuY2VNZXRob2RdLCBXYXJuRGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkT2JqQ0luc3RhbmNlTWV0aG9kIj47CisgIC8vIEFuIEFTVCBub2RlIGlzIGNyZWF0ZWQgZm9yIHRoaXMgYXR0cmlidXRlLCBidXQgaXMgbm90IHVzZWQgYnkgb3RoZXIgcGFydHMKKyAgLy8gb2YgdGhlIGNvbXBpbGVyLiBIb3dldmVyLCB0aGlzIG5vZGUgbmVlZHMgdG8gZXhpc3QgaW4gdGhlIEFTVCBiZWNhdXNlCisgIC8vIGV4dGVybmFsIHRvb2xzIHJlbHkgb24gaXQuCisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBJQk91dGxldCA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJpYm91dGxldCI+XTsKKy8vICBsZXQgU3ViamVjdHMgPSBbT2JqQ0l2YXIsIE9iakNQcm9wZXJ0eV07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBJQk91dGxldENvbGxlY3Rpb24gOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiaWJvdXRsZXRjb2xsZWN0aW9uIj5dOwogICBsZXQgQXJncyA9IFtUeXBlQXJndW1lbnQ8IkludGVyZmFjZSIsIDE+XTsKKy8vICBsZXQgU3ViamVjdHMgPSBbT2JqQ0l2YXIsIE9iakNQcm9wZXJ0eV07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBNYWxsb2MgOiBJbmhlcml0YWJsZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibWFsbG9jIj4sIENYWDExPCJnbnUiLCAibWFsbG9jIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwibWFsbG9jIj5dOworLy8gIGxldCBTdWJqZWN0cyA9IFtGdW5jdGlvbl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBNYXhGaWVsZEFsaWdubWVudCA6IEluaGVyaXRhYmxlQXR0ciB7CisgIC8vIFRoaXMgYXR0cmlidXRlIGhhcyBubyBzcGVsbGluZ3MgYXMgaXQgaXMgb25seSBldmVyIGNyZWF0ZWQgaW1wbGljaXRseS4KICAgbGV0IFNwZWxsaW5ncyA9IFtdOwogICBsZXQgQXJncyA9IFtVbnNpZ25lZEFyZ3VtZW50PCJBbGlnbm1lbnQiPl07CiAgIGxldCBTZW1hSGFuZGxlciA9IDA7CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBNYXlBbGlhcyA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJtYXlfYWxpYXMiPiwgQ1hYMTE8ImdudSIsICJtYXlfYWxpYXMiPl07CisgIC8vIEZJWE1FOiB0aGlzIGlzIGEgdHlwZSBhdHRyaWJ1dGUgaW4gR0NDLCBidXQgYSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGUgaGVyZS4KKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8Im1heV9hbGlhcyI+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIE1TQUJJIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im1zX2FiaSI+LCBDWFgxMTwiZ251IiwgIm1zX2FiaSI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8Im1zX2FiaSI+XTsKKy8vICBsZXQgU3ViamVjdHMgPSBbRnVuY3Rpb24sIE9iakNNZXRob2RdOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCi1kZWYgTVNQNDMwSW50ZXJydXB0IDogSW5oZXJpdGFibGVBdHRyLCBUYXJnZXRTcGVjaWZpY0F0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW107CitkZWYgTVNQNDMwSW50ZXJydXB0IDogSW5oZXJpdGFibGVBdHRyLCBUYXJnZXRTcGVjaWZpY0F0dHI8VGFyZ2V0TVNQNDMwPiB7CisgIC8vIE5PVEU6IElmIHlvdSBhZGQgYW55IGFkZGl0aW9uYWwgc3BlbGxpbmdzLCBBUk1JbnRlcnJ1cHQncyBzcGVsbGluZ3MgbXVzdAorICAvLyBtYXRjaC4KKyAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImludGVycnVwdCI+XTsKICAgbGV0IEFyZ3MgPSBbVW5zaWduZWRBcmd1bWVudDwiTnVtYmVyIj5dOwotICBsZXQgU2VtYUhhbmRsZXIgPSAwOworICBsZXQgUGFyc2VLaW5kID0gIkludGVycnVwdCI7CisgIGxldCBIYXNDdXN0b21QYXJzaW5nID0gMTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAotZGVmIE1pcHMxNiA6IEluaGVyaXRhYmxlQXR0ciwgVGFyZ2V0U3BlY2lmaWNBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im1pcHMxNiI+LCBDWFgxMTwiZ251IiwgIm1pcHMxNiI+XTsKLSAgbGV0IFN1YmplY3RzID0gW0Z1bmN0aW9uXTsKK2RlZiBNaXBzMTYgOiBJbmhlcml0YWJsZUF0dHIsIFRhcmdldFNwZWNpZmljQXR0cjxUYXJnZXRNaXBzPiB7CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJtaXBzMTYiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbl0sIEVycm9yRGlhZz47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBNb2RlIDogQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJtb2RlIj4sIENYWDExPCJnbnUiLCAibW9kZSI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8Im1vZGUiPl07CiAgIGxldCBBcmdzID0gW0lkZW50aWZpZXJBcmd1bWVudDwiTW9kZSI+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIE5ha2VkIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im5ha2VkIj4sIENYWDExPCJnbnUiLCAibmFrZWQiPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJuYWtlZCI+LCBEZWNsc3BlYzwibmFrZWQiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbl0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgTmVvblBvbHlWZWN0b3JUeXBlIDogVHlwZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibmVvbl9wb2x5dmVjdG9yX3R5cGUiPl07CiAgIGxldCBBcmdzID0gW0ludEFyZ3VtZW50PCJOdW1FbGVtZW50cyI+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIE5lb25WZWN0b3JUeXBlIDogVHlwZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibmVvbl92ZWN0b3JfdHlwZSI+XTsKICAgbGV0IEFyZ3MgPSBbSW50QXJndW1lbnQ8Ik51bUVsZW1lbnRzIj5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgUmV0dXJuc1R3aWNlIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InJldHVybnNfdHdpY2UiPiwgQ1hYMTE8ImdudSIsICJyZXR1cm5zX3R3aWNlIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwicmV0dXJuc190d2ljZSI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBOb0NvbW1vbiA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJub2NvbW1vbiI+LCBDWFgxMTwiZ251IiwgIm5vY29tbW9uIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwibm9jb21tb24iPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtWYXJdPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIE5vRGVidWcgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibm9kZWJ1ZyI+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKK30KKworZGVmIE5vRHVwbGljYXRlIDogSW5oZXJpdGFibGVBdHRyIHsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im5vZHVwbGljYXRlIj4sIENYWDExPCJjbGFuZyIsICJub2R1cGxpY2F0ZSI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW05vRHVwbGljYXRlRG9jc107CiB9CiAKIGRlZiBOb0lubGluZSA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJub2lubGluZSI+LCBDWFgxMTwiZ251IiwgIm5vaW5saW5lIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwibm9pbmxpbmUiPiwgRGVjbHNwZWM8Im5vaW5saW5lIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb25dPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAotZGVmIE5vTWlwczE2IDogSW5oZXJpdGFibGVBdHRyLCBUYXJnZXRTcGVjaWZpY0F0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibm9taXBzMTYiPiwgQ1hYMTE8ImdudSIsICJub21pcHMxNiI+XTsKLSAgbGV0IFN1YmplY3RzID0gW0Z1bmN0aW9uXTsKK2RlZiBOb01pcHMxNiA6IEluaGVyaXRhYmxlQXR0ciwgVGFyZ2V0U3BlY2lmaWNBdHRyPFRhcmdldE1pcHM+IHsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8Im5vbWlwczE2Ij5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb25dLCBFcnJvckRpYWc+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgTm9uTnVsbCA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJub25udWxsIj4sIENYWDExPCJnbnUiLCAibm9ubnVsbCI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8Im5vbm51bGwiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtPYmpDTWV0aG9kLCBIYXNGdW5jdGlvblByb3RvLCBQYXJtVmFyXSwgV2FybkRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZEZ1bmN0aW9uTWV0aG9kT3JQYXJhbWV0ZXIiPjsKICAgbGV0IEFyZ3MgPSBbVmFyaWFkaWNVbnNpZ25lZEFyZ3VtZW50PCJBcmdzIj5dOwogICBsZXQgQWRkaXRpb25hbE1lbWJlcnMgPQogW3tib29sIGlzTm9uTnVsbCh1bnNpZ25lZCBpZHgpIGNvbnN0IHsKQEAgLTUyMywxNTAgKzg0MSwyMjYgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9IH1dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOworfQorCitkZWYgUmV0dXJuc05vbk51bGwgOiBJbmhlcml0YWJsZUF0dHIgeworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwicmV0dXJuc19ub25udWxsIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbT2JqQ01ldGhvZCwgSGFzRnVuY3Rpb25Qcm90b10sIFdhcm5EaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWRGdW5jdGlvbk9yTWV0aG9kIj47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBOb1JldHVybiA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJub3JldHVybiI+LCBDWFgxMTwiZ251IiwgIm5vcmV0dXJuIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwibm9yZXR1cm4iPiwgRGVjbHNwZWM8Im5vcmV0dXJuIj5dOwogICAvLyBGSVhNRTogRG9lcyBHQ0MgYWxsb3cgdGhpcyBvbiB0aGUgZnVuY3Rpb24gaW5zdGVhZD8KLSAgbGV0IFN1YmplY3RzID0gW0Z1bmN0aW9uXTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIE5vSW5zdHJ1bWVudEZ1bmN0aW9uIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im5vX2luc3RydW1lbnRfZnVuY3Rpb24iPiwKLSAgICAgICAgICAgICAgICAgICBDWFgxMTwiZ251IiwgIm5vX2luc3RydW1lbnRfZnVuY3Rpb24iPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtGdW5jdGlvbl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJub19pbnN0cnVtZW50X2Z1bmN0aW9uIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb25dPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIE5vVGhyb3cgOiBJbmhlcml0YWJsZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibm90aHJvdyI+LCBDWFgxMTwiZ251IiwgIm5vdGhyb3ciPl07Ci19Ci0KLWRlZiBOU0JyaWRnZWQgOiBJbmhlcml0YWJsZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibnNfYnJpZGdlZCI+XTsKLSAgbGV0IFN1YmplY3RzID0gW1JlY29yZF07Ci0gIGxldCBBcmdzID0gW0lkZW50aWZpZXJBcmd1bWVudDwiQnJpZGdlZFR5cGUiLCAxPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJub3Rocm93Ij4sIERlY2xzcGVjPCJub3Rocm93Ij5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgT2JqQ0JyaWRnZSA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJvYmpjX2JyaWRnZSI+XTsKLSAgbGV0IFN1YmplY3RzID0gW1JlY29yZF07Ci0gIGxldCBBcmdzID0gW0lkZW50aWZpZXJBcmd1bWVudDwiQnJpZGdlZFR5cGUiLCAxPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtSZWNvcmRdLCBFcnJvckRpYWc+OworICBsZXQgQXJncyA9IFtJZGVudGlmaWVyQXJndW1lbnQ8IkJyaWRnZWRUeXBlIj5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOworfQorCitkZWYgT2JqQ0JyaWRnZU11dGFibGUgOiBJbmhlcml0YWJsZUF0dHIgeworICBsZXQgU3BlbGxpbmdzID0gW0dOVTwib2JqY19icmlkZ2VfbXV0YWJsZSI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W1JlY29yZF0sIEVycm9yRGlhZz47CisgIGxldCBBcmdzID0gW0lkZW50aWZpZXJBcmd1bWVudDwiQnJpZGdlZFR5cGUiPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07Cit9CisKK2RlZiBPYmpDQnJpZGdlUmVsYXRlZCA6IEluaGVyaXRhYmxlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJvYmpjX2JyaWRnZV9yZWxhdGVkIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbUmVjb3JkXSwgRXJyb3JEaWFnPjsKKyAgbGV0IEFyZ3MgPSBbSWRlbnRpZmllckFyZ3VtZW50PCJSZWxhdGVkQ2xhc3MiPiwKKyAgICAgICAgICBJZGVudGlmaWVyQXJndW1lbnQ8IkNsYXNzTWV0aG9kIj4sCisgICAgICAgICAgSWRlbnRpZmllckFyZ3VtZW50PCJJbnN0YW5jZU1ldGhvZCI+XTsKKyAgbGV0IEhhc0N1c3RvbVBhcnNpbmcgPSAxOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgTlNSZXR1cm5zUmV0YWluZWQgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibnNfcmV0dXJuc19yZXRhaW5lZCI+XTsKLSAgbGV0IFN1YmplY3RzID0gW09iakNNZXRob2QsIEZ1bmN0aW9uXTsKKy8vICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbT2JqQ01ldGhvZCwgT2JqQ1Byb3BlcnR5LCBGdW5jdGlvbl0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgTlNSZXR1cm5zTm90UmV0YWluZWQgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibnNfcmV0dXJuc19ub3RfcmV0YWluZWQiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtPYmpDTWV0aG9kLCBGdW5jdGlvbl07CisvLyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W09iakNNZXRob2QsIE9iakNQcm9wZXJ0eSwgRnVuY3Rpb25dPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIE5TUmV0dXJuc0F1dG9yZWxlYXNlZCA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJuc19yZXR1cm5zX2F1dG9yZWxlYXNlZCI+XTsKLSAgbGV0IFN1YmplY3RzID0gW09iakNNZXRob2QsIEZ1bmN0aW9uXTsKKy8vICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbT2JqQ01ldGhvZCwgT2JqQ1Byb3BlcnR5LCBGdW5jdGlvbl0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgTlNDb25zdW1lc1NlbGYgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibnNfY29uc3VtZXNfc2VsZiI+XTsKLSAgbGV0IFN1YmplY3RzID0gW09iakNNZXRob2RdOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbT2JqQ01ldGhvZF0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgTlNDb25zdW1lZCA6IEluaGVyaXRhYmxlUGFyYW1BdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im5zX2NvbnN1bWVkIj5dOwotICBsZXQgU3ViamVjdHMgPSBbUGFybVZhcl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtQYXJtVmFyXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBPYmpDRXhjZXB0aW9uIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im9iamNfZXhjZXB0aW9uIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbT2JqQ0ludGVyZmFjZV0sIEVycm9yRGlhZz47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBPYmpDTWV0aG9kRmFtaWx5IDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im9iamNfbWV0aG9kX2ZhbWlseSI+XTsKLSAgbGV0IFN1YmplY3RzID0gW09iakNNZXRob2RdOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbT2JqQ01ldGhvZF0sIEVycm9yRGlhZz47CiAgIGxldCBBcmdzID0gW0VudW1Bcmd1bWVudDwiRmFtaWx5IiwgIkZhbWlseUtpbmQiLAogICAgICAgICAgICAgICAgWyJub25lIiwgImFsbG9jIiwgImNvcHkiLCAiaW5pdCIsICJtdXRhYmxlQ29weSIsICJuZXciXSwKICAgICAgICAgICAgICAgIFsiT01GX05vbmUiLCAiT01GX2FsbG9jIiwgIk9NRl9jb3B5IiwgIk9NRl9pbml0IiwKICAgICAgICAgICAgICAgICAiT01GX211dGFibGVDb3B5IiwgIk9NRl9uZXciXT5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtPYmpDTWV0aG9kRmFtaWx5RG9jc107CiB9CiAKIGRlZiBPYmpDTlNPYmplY3QgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiTlNPYmplY3QiPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBPYmpDUHJlY2lzZUxpZmV0aW1lIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im9iamNfcHJlY2lzZV9saWZldGltZSI+XTsKLSAgbGV0IFN1YmplY3RzID0gW1Zhcl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtWYXJdLCBFcnJvckRpYWc+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgT2JqQ1JldHVybnNJbm5lclBvaW50ZXIgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwib2JqY19yZXR1cm5zX2lubmVyX3BvaW50ZXIiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtPYmpDTWV0aG9kLCBPYmpDUHJvcGVydHldOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbT2JqQ01ldGhvZCwgT2JqQ1Byb3BlcnR5XSwgRXJyb3JEaWFnPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIE9iakNSZXF1aXJlc1N1cGVyIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im9iamNfcmVxdWlyZXNfc3VwZXIiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtPYmpDTWV0aG9kXTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W09iakNNZXRob2RdLCBFcnJvckRpYWc+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtPYmpDUmVxdWlyZXNTdXBlckRvY3NdOwogfQogCiBkZWYgT2JqQ1Jvb3RDbGFzcyA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJvYmpjX3Jvb3RfY2xhc3MiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtPYmpDSW50ZXJmYWNlXTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W09iakNJbnRlcmZhY2VdLCBFcnJvckRpYWc+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOworfQorCitkZWYgT2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsIDogSW5oZXJpdGFibGVBdHRyIHsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im9iamNfcHJvdG9jb2xfcmVxdWlyZXNfZXhwbGljaXRfaW1wbGVtZW50YXRpb24iPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtPYmpDUHJvdG9jb2xdLCBFcnJvckRpYWc+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOworfQorCitkZWYgT2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplciA6IEF0dHIgeworICBsZXQgU3BlbGxpbmdzID0gW0dOVTwib2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbT2JqQ0ludGVyZmFjZURlY2xJbml0TWV0aG9kXSwgRXJyb3JEaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWRPYmpDSW50ZXJmYWNlRGVjbEluaXRNZXRob2QiPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKK30KKworZGVmIE9wdGltaXplTm9uZSA6IEluaGVyaXRhYmxlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJvcHRub25lIj4sIENYWDExPCJjbGFuZyIsICJvcHRub25lIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb24sIE9iakNNZXRob2RdPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbT3B0bm9uZURvY3NdOwogfQogCiBkZWYgT3ZlcmxvYWRhYmxlIDogQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJvdmVybG9hZGFibGUiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbl0sIEVycm9yRGlhZz47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW092ZXJsb2FkYWJsZURvY3NdOwogfQogCiBkZWYgT3ZlcnJpZGUgOiBJbmhlcml0YWJsZUF0dHIgeyAKLSAgbGV0IFNwZWxsaW5ncyA9IFtdOworICBsZXQgU3BlbGxpbmdzID0gW0tleXdvcmQ8Im92ZXJyaWRlIj5dOwogICBsZXQgU2VtYUhhbmRsZXIgPSAwOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgT3duZXJzaGlwIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im93bmVyc2hpcF9ob2xkcyI+LCBHTlU8Im93bmVyc2hpcF9yZXR1cm5zIj4sCiAgICAgICAgICAgICAgICAgICAgR05VPCJvd25lcnNoaXBfdGFrZXMiPl07Ci0gIGxldCBEaXN0aW5jdFNwZWxsaW5ncyA9IDE7Ci0gIGxldCBBcmdzID0gW0VudW1Bcmd1bWVudDwiT3duS2luZCIsICJPd25lcnNoaXBLaW5kIiwKLSAgICAgICAgICAgICAgICAgICAgWyJvd25lcnNoaXBfaG9sZHMiLCAib3duZXJzaGlwX3JldHVybnMiLCAib3duZXJzaGlwX3Rha2VzIl0sCi0gICAgICAgICAgICAgICAgICAgIFsiSG9sZHMiLCAiUmV0dXJucyIsICJUYWtlcyJdPiwKLSAgICAgICAgICAgICAgU3RyaW5nQXJndW1lbnQ8Ik1vZHVsZSI+LCBWYXJpYWRpY1Vuc2lnbmVkQXJndW1lbnQ8IkFyZ3MiPl07Ci0gIGxldCBIYXNDdXN0b21QYXJzaW5nID0gMTsKKyAgbGV0IEFjY2Vzc29ycyA9IFtBY2Nlc3NvcjwiaXNIb2xkcyIsIFtHTlU8Im93bmVyc2hpcF9ob2xkcyI+XT4sCisgICAgICAgICAgICAgICAgICAgQWNjZXNzb3I8ImlzUmV0dXJucyIsIFtHTlU8Im93bmVyc2hpcF9yZXR1cm5zIj5dPiwKKyAgICAgICAgICAgICAgICAgICBBY2Nlc3NvcjwiaXNUYWtlcyIsIFtHTlU8Im93bmVyc2hpcF90YWtlcyI+XT5dOworICBsZXQgQWRkaXRpb25hbE1lbWJlcnMgPSBbeworICAgIGVudW0gT3duZXJzaGlwS2luZCB7IEhvbGRzLCBSZXR1cm5zLCBUYWtlcyB9OworICAgIE93bmVyc2hpcEtpbmQgZ2V0T3duS2luZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc0hvbGRzKCkgPyBIb2xkcyA6CisgICAgICAgICAgICAgaXNUYWtlcygpID8gVGFrZXMgOgorICAgICAgICAgICAgIFJldHVybnM7CisgICAgfQorICB9XTsKKyAgbGV0IEFyZ3MgPSBbSWRlbnRpZmllckFyZ3VtZW50PCJNb2R1bGUiPiwgVmFyaWFkaWNVbnNpZ25lZEFyZ3VtZW50PCJBcmdzIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbSGFzRnVuY3Rpb25Qcm90b10sIFdhcm5EaWFnLCAiRXhwZWN0ZWRGdW5jdGlvbiI+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgUGFja2VkIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InBhY2tlZCI+LCBDWFgxMTwiZ251IiwgInBhY2tlZCI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8InBhY2tlZCI+XTsKKy8vICBsZXQgU3ViamVjdHMgPSBbVGFnLCBGaWVsZF07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBQbmFjbENhbGwgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwicG5hY2xjYWxsIj5dOworLy8gIGxldCBTdWJqZWN0cyA9IFtGdW5jdGlvbiwgT2JqQ01ldGhvZF07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBJbnRlbE9jbEJpY2MgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiaW50ZWxfb2NsX2JpY2MiPl07CisvLyAgbGV0IFN1YmplY3RzID0gW0Z1bmN0aW9uLCBPYmpDTWV0aG9kXTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIFBjcyA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJwY3MiPiwgQ1hYMTE8ImdudSIsICJwY3MiPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJwY3MiPl07CiAgIGxldCBBcmdzID0gW0VudW1Bcmd1bWVudDwiUENTIiwgIlBDU1R5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJhYXBjcyIsICJhYXBjcy12ZnAiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiQUFQQ1MiLCAiQUFQQ1NfVkZQIl0+XTsKKy8vICBsZXQgU3ViamVjdHMgPSBbRnVuY3Rpb24sIE9iakNNZXRob2RdOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtQY3NEb2NzXTsKIH0KIAogZGVmIFB1cmUgOiBJbmhlcml0YWJsZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwicHVyZSI+LCBDWFgxMTwiZ251IiwgInB1cmUiPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJwdXJlIj5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCi1kZWYgUmVncGFybSA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJyZWdwYXJtIj4sIENYWDExPCJnbnUiLCAicmVncGFybSI+XTsKK2RlZiBSZWdwYXJtIDogVHlwZUF0dHIgeworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwicmVncGFybSI+XTsKICAgbGV0IEFyZ3MgPSBbVW5zaWduZWRBcmd1bWVudDwiTnVtUGFyYW1zIj5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgUmVxZFdvcmtHcm91cFNpemUgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwicmVxZF93b3JrX2dyb3VwX3NpemUiPl07CiAgIGxldCBBcmdzID0gW1Vuc2lnbmVkQXJndW1lbnQ8IlhEaW0iPiwgVW5zaWduZWRBcmd1bWVudDwiWURpbSI+LAogICAgICAgICAgICAgICBVbnNpZ25lZEFyZ3VtZW50PCJaRGltIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb25dLCBFcnJvckRpYWc+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgV29ya0dyb3VwU2l6ZUhpbnQgOiAgSW5oZXJpdGFibGVBdHRyIHsKQEAgLTY3NCwxMDIgKzEwNjgsMTM3IEBACiAgIGxldCBBcmdzID0gW1Vuc2lnbmVkQXJndW1lbnQ8IlhEaW0iPiwgCiAgICAgICAgICAgICAgIFVuc2lnbmVkQXJndW1lbnQ8IllEaW0iPiwKICAgICAgICAgICAgICAgVW5zaWduZWRBcmd1bWVudDwiWkRpbSI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uXSwgRXJyb3JEaWFnPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIEluaXRQcmlvcml0eSA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJpbml0X3ByaW9yaXR5Ij5dOwogICBsZXQgQXJncyA9IFtVbnNpZ25lZEFyZ3VtZW50PCJQcmlvcml0eSI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W1Zhcl0sIEVycm9yRGlhZz47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBTZWN0aW9uIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InNlY3Rpb24iPiwgQ1hYMTE8ImdudSIsICJzZWN0aW9uIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwic2VjdGlvbiI+XTsKICAgbGV0IEFyZ3MgPSBbU3RyaW5nQXJndW1lbnQ8Ik5hbWUiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbiwgR2xvYmFsVmFyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2QsIE9iakNQcm9wZXJ0eV0sIEVycm9yRGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkRnVuY3Rpb25HbG9iYWxWYXJNZXRob2RPclByb3BlcnR5Ij47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBTZW50aW5lbCA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJzZW50aW5lbCI+LCBDWFgxMTwiZ251IiwgInNlbnRpbmVsIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwic2VudGluZWwiPl07CiAgIGxldCBBcmdzID0gW0RlZmF1bHRJbnRBcmd1bWVudDwiU2VudGluZWwiLCAwPiwKICAgICAgICAgICAgICAgRGVmYXVsdEludEFyZ3VtZW50PCJOdWxsUG9zIiwgMD5dOworLy8gIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbiwgT2JqQ01ldGhvZCwgQmxvY2ssIFZhcl0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgU3RkQ2FsbCA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJzdGRjYWxsIj4sIENYWDExPCJnbnUiLCAic3RkY2FsbCI+LAotICAgICAgICAgICAgICAgICAgIEtleXdvcmQ8Il9fc3RkY2FsbCI+LCBLZXl3b3JkPCJfc3RkY2FsbCI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8InN0ZGNhbGwiPiwgS2V5d29yZDwiX19zdGRjYWxsIj4sIEtleXdvcmQ8Il9zdGRjYWxsIj5dOworLy8gIGxldCBTdWJqZWN0cyA9IFtGdW5jdGlvbiwgT2JqQ01ldGhvZF07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBTeXNWQUJJIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InN5c3ZfYWJpIj4sIENYWDExPCJnbnUiLCAic3lzdl9hYmkiPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJzeXN2X2FiaSI+XTsKKy8vICBsZXQgU3ViamVjdHMgPSBbRnVuY3Rpb24sIE9iakNNZXRob2RdOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgVGhpc0NhbGwgOiBJbmhlcml0YWJsZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwidGhpc2NhbGwiPiwgQ1hYMTE8ImdudSIsICJ0aGlzY2FsbCI+LAotICAgICAgICAgICAgICAgICAgIEtleXdvcmQ8Il9fdGhpc2NhbGwiPiwgS2V5d29yZDwiX3RoaXNjYWxsIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwidGhpc2NhbGwiPiwgS2V5d29yZDwiX190aGlzY2FsbCI+LAorICAgICAgICAgICAgICAgICAgIEtleXdvcmQ8Il90aGlzY2FsbCI+XTsKKy8vICBsZXQgU3ViamVjdHMgPSBbRnVuY3Rpb24sIE9iakNNZXRob2RdOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgUGFzY2FsIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InBhc2NhbCI+LCBLZXl3b3JkPCJfX3Bhc2NhbCI+LCBLZXl3b3JkPCJfcGFzY2FsIj5dOworLy8gIGxldCBTdWJqZWN0cyA9IFtGdW5jdGlvbiwgT2JqQ01ldGhvZF07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBUcmFuc3BhcmVudFVuaW9uIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InRyYW5zcGFyZW50X3VuaW9uIj4sIENYWDExPCJnbnUiLCAidHJhbnNwYXJlbnRfdW5pb24iPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJ0cmFuc3BhcmVudF91bmlvbiI+XTsKKy8vICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbUmVjb3JkLCBUeXBlZGVmTmFtZV0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgVW5hdmFpbGFibGUgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwidW5hdmFpbGFibGUiPl07CiAgIGxldCBBcmdzID0gW1N0cmluZ0FyZ3VtZW50PCJNZXNzYWdlIiwgMT5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgQXJjV2Vha3JlZlVuYXZhaWxhYmxlIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im9iamNfYXJjX3dlYWtfcmVmZXJlbmNlX3VuYXZhaWxhYmxlIj5dOwotICBsZXQgU3ViamVjdHMgPSBbT2JqQ0ludGVyZmFjZV07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtPYmpDSW50ZXJmYWNlXSwgRXJyb3JEaWFnPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIE9iakNHQyA6IFR5cGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im9iamNfZ2MiPl07CiAgIGxldCBBcmdzID0gW0lkZW50aWZpZXJBcmd1bWVudDwiS2luZCI+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIE9iakNPd25lcnNoaXAgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwib2JqY19vd25lcnNoaXAiPl07CiAgIGxldCBBcmdzID0gW0lkZW50aWZpZXJBcmd1bWVudDwiS2luZCI+XTsKICAgbGV0IEFTVE5vZGUgPSAwOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im9iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtPYmpDSW50ZXJmYWNlXTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W09iakNJbnRlcmZhY2VdLCBFcnJvckRpYWc+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgVW51c2VkIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InVudXNlZCI+LCBDWFgxMTwiZ251IiwgInVudXNlZCI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8InVudXNlZCI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W1ZhciwgT2JqQ0l2YXIsIFR5cGUsIExhYmVsLCBGaWVsZCwgT2JqQ01ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uTGlrZV0sIFdhcm5EaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWRWYXJpYWJsZUZ1bmN0aW9uT3JMYWJlbCI+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgVXNlZCA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJ1c2VkIj4sIENYWDExPCJnbnUiLCAidXNlZCI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8InVzZWQiPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBVdWlkIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InV1aWQiPl07CisgIGxldCBTcGVsbGluZ3MgPSBbRGVjbHNwZWM8InV1aWQiPl07CiAgIGxldCBBcmdzID0gW1N0cmluZ0FyZ3VtZW50PCJHdWlkIj5dOwotICBsZXQgU3ViamVjdHMgPSBbQ1hYUmVjb3JkXTsKKy8vICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbQ1hYUmVjb3JkXT47CisgIGxldCBMYW5nT3B0cyA9IFtNaWNyb3NvZnRFeHQsIEJvcmxhbmRdOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgVmVjdG9yU2l6ZSA6IFR5cGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InZlY3Rvcl9zaXplIj4sIENYWDExPCJnbnUiLCAidmVjdG9yX3NpemUiPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJ2ZWN0b3Jfc2l6ZSI+XTsKICAgbGV0IEFyZ3MgPSBbRXhwckFyZ3VtZW50PCJOdW1CeXRlcyI+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIFZlY1R5cGVIaW50IDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InZlY190eXBlX2hpbnQiPl07CiAgIGxldCBBcmdzID0gW1R5cGVBcmd1bWVudDwiVHlwZUhpbnQiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbl0sIEVycm9yRGlhZz47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBWaXNpYmlsaXR5IDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IENsb25lID0gMDsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InZpc2liaWxpdHkiPiwgQ1hYMTE8ImdudSIsICJ2aXNpYmlsaXR5Ij5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwidmlzaWJpbGl0eSI+XTsKICAgbGV0IEFyZ3MgPSBbRW51bUFyZ3VtZW50PCJWaXNpYmlsaXR5IiwgIlZpc2liaWxpdHlUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZGVmYXVsdCIsICJoaWRkZW4iLCAiaW50ZXJuYWwiLCAicHJvdGVjdGVkIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIkRlZmF1bHQiLCAiSGlkZGVuIiwgIkhpZGRlbiIsICJQcm90ZWN0ZWQiXT5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgVHlwZVZpc2liaWxpdHkgOiBJbmhlcml0YWJsZUF0dHIgewpAQCAtNzc4LDgwICsxMjA3LDIyNyBAQAogICBsZXQgQXJncyA9IFtFbnVtQXJndW1lbnQ8IlZpc2liaWxpdHkiLCAiVmlzaWJpbGl0eVR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJkZWZhdWx0IiwgImhpZGRlbiIsICJpbnRlcm5hbCIsICJwcm90ZWN0ZWQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiRGVmYXVsdCIsICJIaWRkZW4iLCAiSGlkZGVuIiwgIlByb3RlY3RlZCJdPl07CisvLyAgbGV0IFN1YmplY3RzID0gW1RhZywgT2JqQ0ludGVyZmFjZSwgTmFtZXNwYWNlXTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIFZlY1JldHVybiA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJ2ZWNyZXR1cm4iPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtDWFhSZWNvcmRdOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbQ1hYUmVjb3JkXSwgRXJyb3JEaWFnPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIFdhcm5VbnVzZWQgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwid2Fybl91bnVzZWQiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtSZWNvcmRdOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbUmVjb3JkXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBXYXJuVW51c2VkUmVzdWx0IDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Indhcm5fdW51c2VkX3Jlc3VsdCI+LAotICAgICAgICAgICAgICAgICAgIENYWDExPCJjbGFuZyIsICJ3YXJuX3VudXNlZF9yZXN1bHQiPiwKLSAgICAgICAgICAgICAgICAgICBDWFgxMTwiZ251IiwgIndhcm5fdW51c2VkX3Jlc3VsdCI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8Indhcm5fdW51c2VkX3Jlc3VsdCI+LAorICAgICAgICAgICAgICAgICAgIENYWDExPCJjbGFuZyIsICJ3YXJuX3VudXNlZF9yZXN1bHQiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtPYmpDTWV0aG9kLCBDWFhSZWNvcmQsIEZ1bmN0aW9uTGlrZV0sIFdhcm5EaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWRGdW5jdGlvbk1ldGhvZE9yQ2xhc3MiPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIFdlYWsgOiBJbmhlcml0YWJsZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwid2VhayI+LCBDWFgxMTwiZ251IiwgIndlYWsiPl07CisgIGxldCBTcGVsbGluZ3MgPSBbR0NDPCJ3ZWFrIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbVmFyLCBGdW5jdGlvbiwgQ1hYUmVjb3JkXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBXZWFrSW1wb3J0IDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8IndlYWtfaW1wb3J0Ij5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgV2Vha1JlZiA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJ3ZWFrcmVmIj4sIENYWDExPCJnbnUiLCAid2Vha3JlZiI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8IndlYWtyZWYiPl07CiAgIC8vIEEgV2Vha1JlZiB0aGF0IGhhcyBhbiBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGJlaW5nIGFuIEFsaWFzQXR0cgogICBsZXQgQXJncyA9IFtTdHJpbmdBcmd1bWVudDwiQWxpYXNlZSIsIDE+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W1ZhciwgRnVuY3Rpb25dLCBFcnJvckRpYWc+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCi1kZWYgWDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXIgOiBJbmhlcml0YWJsZUF0dHIsIFRhcmdldFNwZWNpZmljQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbXTsKK2RlZiBYODZGb3JjZUFsaWduQXJnUG9pbnRlciA6IEluaGVyaXRhYmxlQXR0ciwgVGFyZ2V0U3BlY2lmaWNBdHRyPFRhcmdldFg4Nj4geworICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiZm9yY2VfYWxpZ25fYXJnX3BvaW50ZXIiPl07CisgIC8vIFRlY2huaWNhbGx5LCB0aGlzIGFwcGVydGFpbnMgdG8gYSBGdW5jdGlvbkRlY2wsIGJ1dCB0aGUgdGFyZ2V0LXNwZWNpZmljCisgIC8vIGNvZGUgc2lsZW50bHkgYWxsb3dzIGFueXRoaW5nIGZ1bmN0aW9uLWxpa2UgKHN1Y2ggYXMgdHlwZWRlZnMgb3IgZnVuY3Rpb24KKyAgLy8gcG9pbnRlcnMpLCBidXQgZG9lcyBub3QgYXBwbHkgdGhlIGF0dHJpYnV0ZSB0byB0aGVtLgorICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiAvLyBBdHRyaWJ1dGUgdG8gZGlzYWJsZSBBZGRyZXNzU2FuaXRpemVyIChvciBlcXVpdmFsZW50KSBjaGVja3MuCiBkZWYgTm9TYW5pdGl6ZUFkZHJlc3MgOiBJbmhlcml0YWJsZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwibm9fYWRkcmVzc19zYWZldHlfYW5hbHlzaXMiPiwKLSAgICAgICAgICAgICAgICAgICBHTlU8Im5vX3Nhbml0aXplX2FkZHJlc3MiPiwKLSAgICAgICAgICAgICAgICAgICBDWFgxMTwiZ251IiwgIm5vX2FkZHJlc3Nfc2FmZXR5X2FuYWx5c2lzIj4sCi0gICAgICAgICAgICAgICAgICAgQ1hYMTE8ImdudSIsICJub19zYW5pdGl6ZV9hZGRyZXNzIj5dOworICBsZXQgU3BlbGxpbmdzID0gW0dDQzwibm9fYWRkcmVzc19zYWZldHlfYW5hbHlzaXMiPiwKKyAgICAgICAgICAgICAgICAgICBHQ0M8Im5vX3Nhbml0aXplX2FkZHJlc3MiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbiwgRnVuY3Rpb25UZW1wbGF0ZV0sIEVycm9yRGlhZz47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW05vU2FuaXRpemVBZGRyZXNzRG9jc107CiB9CiAKIC8vIEF0dHJpYnV0ZSB0byBkaXNhYmxlIFRocmVhZFNhbml0aXplciBjaGVja3MuCiBkZWYgTm9TYW5pdGl6ZVRocmVhZCA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJub19zYW5pdGl6ZV90aHJlYWQiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbiwgRnVuY3Rpb25UZW1wbGF0ZV0sIEVycm9yRGlhZz47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW05vU2FuaXRpemVUaHJlYWREb2NzXTsKIH0KIAogLy8gQXR0cmlidXRlIHRvIGRpc2FibGUgTWVtb3J5U2FuaXRpemVyIGNoZWNrcy4KIGRlZiBOb1Nhbml0aXplTWVtb3J5IDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Im5vX3Nhbml0aXplX21lbW9yeSI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uLCBGdW5jdGlvblRlbXBsYXRlXSwgRXJyb3JEaWFnPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbTm9TYW5pdGl6ZU1lbW9yeURvY3NdOwogfQogCiAvLyBDL0MrKyBUaHJlYWQgc2FmZXR5IGF0dHJpYnV0ZXMgKGUuZy4gZm9yIGRlYWRsb2NrLCBkYXRhIHJhY2UgY2hlY2tpbmcpCiAKIGRlZiBHdWFyZGVkVmFyIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8Imd1YXJkZWRfdmFyIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRmllbGQsIFNoYXJlZFZhcl0sIFdhcm5EaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWRGaWVsZE9yR2xvYmFsVmFyIj47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBQdEd1YXJkZWRWYXIgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwicHRfZ3VhcmRlZF92YXIiPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGaWVsZCwgU2hhcmVkVmFyXSwgV2FybkRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZEZpZWxkT3JHbG9iYWxWYXIiPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIExvY2thYmxlIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImxvY2thYmxlIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbUmVjb3JkXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CisgIGxldCBBU1ROb2RlID0gMDsgIC8vIFJlcGxhY2VkIGJ5IENhcGFiaWxpdHkKIH0KIAogZGVmIFNjb3BlZExvY2thYmxlIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InNjb3BlZF9sb2NrYWJsZSI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W1JlY29yZF0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOworfQorCitkZWYgQ2FwYWJpbGl0eSA6IEluaGVyaXRhYmxlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJjYXBhYmlsaXR5Ij4sIENYWDExPCJjbGFuZyIsICJjYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgR05VPCJzaGFyZWRfY2FwYWJpbGl0eSI+LAorICAgICAgICAgICAgICAgICAgIENYWDExPCJjbGFuZyIsICJzaGFyZWRfY2FwYWJpbGl0eSI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W1N0cnVjdCwgVHlwZWRlZk5hbWVdLCBFcnJvckRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZFN0cnVjdE9yVHlwZWRlZiI+OworICBsZXQgQXJncyA9IFtTdHJpbmdBcmd1bWVudDwiTmFtZSI+XTsKKyAgbGV0IEFjY2Vzc29ycyA9IFtBY2Nlc3NvcjwiaXNTaGFyZWQiLAorICAgICAgICAgICAgICAgICAgICBbR05VPCJzaGFyZWRfY2FwYWJpbGl0eSI+LAorICAgICAgICAgICAgICAgICAgICAgQ1hYMTE8ImNsYW5nIiwic2hhcmVkX2NhcGFiaWxpdHkiPl0+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKKyAgbGV0IEFkZGl0aW9uYWxNZW1iZXJzID0gW3sKKyAgICBib29sIGlzTXV0ZXgoKSBjb25zdCB7IHJldHVybiBnZXROYW1lKCkuZXF1YWxzX2xvd2VyKCJtdXRleCIpOyB9CisgICAgYm9vbCBpc1JvbGUoKSBjb25zdCB7IHJldHVybiBnZXROYW1lKCkuZXF1YWxzX2xvd2VyKCJyb2xlIik7IH0KKyAgfV07Cit9CisKK2RlZiBBc3NlcnRDYXBhYmlsaXR5IDogSW5oZXJpdGFibGVBdHRyIHsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImFzc2VydF9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgQ1hYMTE8ImNsYW5nIiwgImFzc2VydF9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgR05VPCJhc3NlcnRfc2hhcmVkX2NhcGFiaWxpdHkiPiwKKyAgICAgICAgICAgICAgICAgICBDWFgxMTwiY2xhbmciLCAiYXNzZXJ0X3NoYXJlZF9jYXBhYmlsaXR5Ij5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb24sIEZ1bmN0aW9uVGVtcGxhdGVdPjsKKyAgbGV0IExhdGVQYXJzZWQgPSAxOworICBsZXQgVGVtcGxhdGVEZXBlbmRlbnQgPSAxOworICBsZXQgUGFyc2VBcmd1bWVudHNBc1VuZXZhbHVhdGVkID0gMTsKKyAgbGV0IER1cGxpY2F0ZXNBbGxvd2VkV2hpbGVNZXJnaW5nID0gMTsKKyAgbGV0IEFyZ3MgPSBbRXhwckFyZ3VtZW50PCJFeHByIj5dOworICBsZXQgQWNjZXNzb3JzID0gW0FjY2Vzc29yPCJpc1NoYXJlZCIsCisgICAgICAgICAgICAgICAgICAgIFtHTlU8ImFzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSI+LAorICAgICAgICAgICAgICAgICAgICAgQ1hYMTE8ImNsYW5nIiwgImFzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSI+XT5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtBc3NlcnRDYXBhYmlsaXR5RG9jc107Cit9CisKK2RlZiBBY3F1aXJlQ2FwYWJpbGl0eSA6IEluaGVyaXRhYmxlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJhY3F1aXJlX2NhcGFiaWxpdHkiPiwKKyAgICAgICAgICAgICAgICAgICBDWFgxMTwiY2xhbmciLCAiYWNxdWlyZV9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgR05VPCJhY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgQ1hYMTE8ImNsYW5nIiwgImFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiPiwKKyAgICAgICAgICAgICAgICAgICBHTlU8ImV4Y2x1c2l2ZV9sb2NrX2Z1bmN0aW9uIj4sCisgICAgICAgICAgICAgICAgICAgR05VPCJzaGFyZWRfbG9ja19mdW5jdGlvbiI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uLCBGdW5jdGlvblRlbXBsYXRlXT47CisgIGxldCBMYXRlUGFyc2VkID0gMTsKKyAgbGV0IFRlbXBsYXRlRGVwZW5kZW50ID0gMTsKKyAgbGV0IFBhcnNlQXJndW1lbnRzQXNVbmV2YWx1YXRlZCA9IDE7CisgIGxldCBEdXBsaWNhdGVzQWxsb3dlZFdoaWxlTWVyZ2luZyA9IDE7CisgIGxldCBBcmdzID0gW1ZhcmlhZGljRXhwckFyZ3VtZW50PCJBcmdzIj5dOworICBsZXQgQWNjZXNzb3JzID0gW0FjY2Vzc29yPCJpc1NoYXJlZCIsCisgICAgICAgICAgICAgICAgICAgIFtHTlU8ImFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkiPiwKKyAgICAgICAgICAgICAgICAgICAgIENYWDExPCJjbGFuZyIsICJhY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgICBHTlU8InNoYXJlZF9sb2NrX2Z1bmN0aW9uIj5dPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW0FjcXVpcmVDYXBhYmlsaXR5RG9jc107Cit9CisKK2RlZiBUcnlBY3F1aXJlQ2FwYWJpbGl0eSA6IEluaGVyaXRhYmxlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJ0cnlfYWNxdWlyZV9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgQ1hYMTE8ImNsYW5nIiwgInRyeV9hY3F1aXJlX2NhcGFiaWxpdHkiPiwKKyAgICAgICAgICAgICAgICAgICBHTlU8InRyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgQ1hYMTE8ImNsYW5nIiwgInRyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5Ij5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb24sIEZ1bmN0aW9uVGVtcGxhdGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckRpYWc+OworICBsZXQgTGF0ZVBhcnNlZCA9IDE7CisgIGxldCBUZW1wbGF0ZURlcGVuZGVudCA9IDE7CisgIGxldCBQYXJzZUFyZ3VtZW50c0FzVW5ldmFsdWF0ZWQgPSAxOworICBsZXQgRHVwbGljYXRlc0FsbG93ZWRXaGlsZU1lcmdpbmcgPSAxOworICBsZXQgQXJncyA9IFtFeHByQXJndW1lbnQ8IlN1Y2Nlc3NWYWx1ZSI+LCBWYXJpYWRpY0V4cHJBcmd1bWVudDwiQXJncyI+XTsKKyAgbGV0IEFjY2Vzc29ycyA9IFtBY2Nlc3NvcjwiaXNTaGFyZWQiLAorICAgICAgICAgICAgICAgICAgICBbR05VPCJ0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSI+LAorICAgICAgICAgICAgICAgICAgICAgQ1hYMTE8ImNsYW5nIiwgInRyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5Ij5dPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1RyeUFjcXVpcmVDYXBhYmlsaXR5RG9jc107Cit9CisKK2RlZiBSZWxlYXNlQ2FwYWJpbGl0eSA6IEluaGVyaXRhYmxlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJyZWxlYXNlX2NhcGFiaWxpdHkiPiwKKyAgICAgICAgICAgICAgICAgICBDWFgxMTwiY2xhbmciLCAicmVsZWFzZV9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgR05VPCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgQ1hYMTE8ImNsYW5nIiwgInJlbGVhc2Vfc2hhcmVkX2NhcGFiaWxpdHkiPiwKKyAgICAgICAgICAgICAgICAgICBHTlU8InJlbGVhc2VfZ2VuZXJpY19jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgQ1hYMTE8ImNsYW5nIiwgInJlbGVhc2VfZ2VuZXJpY19jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgR05VPCJ1bmxvY2tfZnVuY3Rpb24iPl07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbiwgRnVuY3Rpb25UZW1wbGF0ZV0+OworICBsZXQgTGF0ZVBhcnNlZCA9IDE7CisgIGxldCBUZW1wbGF0ZURlcGVuZGVudCA9IDE7CisgIGxldCBQYXJzZUFyZ3VtZW50c0FzVW5ldmFsdWF0ZWQgPSAxOworICBsZXQgRHVwbGljYXRlc0FsbG93ZWRXaGlsZU1lcmdpbmcgPSAxOworICBsZXQgQXJncyA9IFtWYXJpYWRpY0V4cHJBcmd1bWVudDwiQXJncyI+XTsKKyAgbGV0IEFjY2Vzc29ycyA9IFtBY2Nlc3NvcjwiaXNTaGFyZWQiLAorICAgICAgICAgICAgICAgICAgICBbR05VPCJyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgICBDWFgxMTwiY2xhbmciLCAicmVsZWFzZV9zaGFyZWRfY2FwYWJpbGl0eSI+XT4sCisgICAgICAgICAgICAgICAgICAgQWNjZXNzb3I8ImlzR2VuZXJpYyIsCisgICAgICAgICAgICAgICAgICAgICBbR05VPCJyZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eSI+LAorICAgICAgICAgICAgICAgICAgICAgIENYWDExPCJjbGFuZyIsICJyZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eSI+LAorICAgICAgICAgICAgICAgICAgICAgIEdOVTwidW5sb2NrX2Z1bmN0aW9uIj5dPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1JlbGVhc2VDYXBhYmlsaXR5RG9jc107Cit9CisKK2RlZiBSZXF1aXJlc0NhcGFiaWxpdHkgOiBJbmhlcml0YWJsZUF0dHIgeworICBsZXQgU3BlbGxpbmdzID0gW0dOVTwicmVxdWlyZXNfY2FwYWJpbGl0eSI+LAorICAgICAgICAgICAgICAgICAgIENYWDExPCJjbGFuZyIsICJyZXF1aXJlc19jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgR05VPCJleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQiPiwKKyAgICAgICAgICAgICAgICAgICBHTlU8InJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgQ1hYMTE8ImNsYW5nIiwgInJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5Ij4sCisgICAgICAgICAgICAgICAgICAgR05VPCJzaGFyZWRfbG9ja3NfcmVxdWlyZWQiPl07CisgIGxldCBBcmdzID0gW1ZhcmlhZGljRXhwckFyZ3VtZW50PCJBcmdzIj5dOworICBsZXQgTGF0ZVBhcnNlZCA9IDE7CisgIGxldCBUZW1wbGF0ZURlcGVuZGVudCA9IDE7CisgIGxldCBQYXJzZUFyZ3VtZW50c0FzVW5ldmFsdWF0ZWQgPSAxOworICBsZXQgRHVwbGljYXRlc0FsbG93ZWRXaGlsZU1lcmdpbmcgPSAxOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb24sIEZ1bmN0aW9uVGVtcGxhdGVdPjsKKyAgbGV0IEFjY2Vzc29ycyA9IFtBY2Nlc3NvcjwiaXNTaGFyZWQiLCBbR05VPCJyZXF1aXJlc19zaGFyZWRfY2FwYWJpbGl0eSI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTlU8InNoYXJlZF9sb2Nrc19yZXF1aXJlZCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFgxMTwiY2xhbmciLCJyZXF1aXJlc19zaGFyZWRfY2FwYWJpbGl0eSI+XT5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgTm9UaHJlYWRTYWZldHlBbmFseXNpcyA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJub190aHJlYWRfc2FmZXR5X2FuYWx5c2lzIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb24sIEZ1bmN0aW9uVGVtcGxhdGVdPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIEd1YXJkZWRCeSA6IEluaGVyaXRhYmxlQXR0ciB7CkBAIC04NTksNiArMTQzNSwxMSBAQAogICBsZXQgQXJncyA9IFtFeHByQXJndW1lbnQ8IkFyZyI+XTsKICAgbGV0IExhdGVQYXJzZWQgPSAxOwogICBsZXQgVGVtcGxhdGVEZXBlbmRlbnQgPSAxOworICBsZXQgUGFyc2VBcmd1bWVudHNBc1VuZXZhbHVhdGVkID0gMTsKKyAgbGV0IER1cGxpY2F0ZXNBbGxvd2VkV2hpbGVNZXJnaW5nID0gMTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0ZpZWxkLCBTaGFyZWRWYXJdLCBXYXJuRGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkRmllbGRPckdsb2JhbFZhciI+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgUHRHdWFyZGVkQnkgOiBJbmhlcml0YWJsZUF0dHIgewpAQCAtODY2LDYgKzE0NDcsMTEgQEAKICAgbGV0IEFyZ3MgPSBbRXhwckFyZ3VtZW50PCJBcmciPl07CiAgIGxldCBMYXRlUGFyc2VkID0gMTsKICAgbGV0IFRlbXBsYXRlRGVwZW5kZW50ID0gMTsKKyAgbGV0IFBhcnNlQXJndW1lbnRzQXNVbmV2YWx1YXRlZCA9IDE7CisgIGxldCBEdXBsaWNhdGVzQWxsb3dlZFdoaWxlTWVyZ2luZyA9IDE7CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGaWVsZCwgU2hhcmVkVmFyXSwgV2FybkRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZEZpZWxkT3JHbG9iYWxWYXIiPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIEFjcXVpcmVkQWZ0ZXIgOiBJbmhlcml0YWJsZUF0dHIgewpAQCAtODczLDYgKzE0NTksMTEgQEAKICAgbGV0IEFyZ3MgPSBbVmFyaWFkaWNFeHByQXJndW1lbnQ8IkFyZ3MiPl07CiAgIGxldCBMYXRlUGFyc2VkID0gMTsKICAgbGV0IFRlbXBsYXRlRGVwZW5kZW50ID0gMTsKKyAgbGV0IFBhcnNlQXJndW1lbnRzQXNVbmV2YWx1YXRlZCA9IDE7CisgIGxldCBEdXBsaWNhdGVzQWxsb3dlZFdoaWxlTWVyZ2luZyA9IDE7CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGaWVsZCwgU2hhcmVkVmFyXSwgV2FybkRpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZEZpZWxkT3JHbG9iYWxWYXIiPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIEFjcXVpcmVkQmVmb3JlIDogSW5oZXJpdGFibGVBdHRyIHsKQEAgLTg4MCwyMCArMTQ3MSwxMSBAQAogICBsZXQgQXJncyA9IFtWYXJpYWRpY0V4cHJBcmd1bWVudDwiQXJncyI+XTsKICAgbGV0IExhdGVQYXJzZWQgPSAxOwogICBsZXQgVGVtcGxhdGVEZXBlbmRlbnQgPSAxOwotfQotCi1kZWYgRXhjbHVzaXZlTG9ja0Z1bmN0aW9uIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8ImV4Y2x1c2l2ZV9sb2NrX2Z1bmN0aW9uIj5dOwotICBsZXQgQXJncyA9IFtWYXJpYWRpY0V4cHJBcmd1bWVudDwiQXJncyI+XTsKLSAgbGV0IExhdGVQYXJzZWQgPSAxOwotICBsZXQgVGVtcGxhdGVEZXBlbmRlbnQgPSAxOwotfQotCi1kZWYgU2hhcmVkTG9ja0Z1bmN0aW9uIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InNoYXJlZF9sb2NrX2Z1bmN0aW9uIj5dOwotICBsZXQgQXJncyA9IFtWYXJpYWRpY0V4cHJBcmd1bWVudDwiQXJncyI+XTsKLSAgbGV0IExhdGVQYXJzZWQgPSAxOwotICBsZXQgVGVtcGxhdGVEZXBlbmRlbnQgPSAxOworICBsZXQgUGFyc2VBcmd1bWVudHNBc1VuZXZhbHVhdGVkID0gMTsKKyAgbGV0IER1cGxpY2F0ZXNBbGxvd2VkV2hpbGVNZXJnaW5nID0gMTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0ZpZWxkLCBTaGFyZWRWYXJdLCBXYXJuRGlhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkRmllbGRPckdsb2JhbFZhciI+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgQXNzZXJ0RXhjbHVzaXZlTG9jayA6IEluaGVyaXRhYmxlQXR0ciB7CkBAIC05MDEsNiArMTQ4MywxMCBAQAogICBsZXQgQXJncyA9IFtWYXJpYWRpY0V4cHJBcmd1bWVudDwiQXJncyI+XTsKICAgbGV0IExhdGVQYXJzZWQgPSAxOwogICBsZXQgVGVtcGxhdGVEZXBlbmRlbnQgPSAxOworICBsZXQgUGFyc2VBcmd1bWVudHNBc1VuZXZhbHVhdGVkID0gMTsKKyAgbGV0IER1cGxpY2F0ZXNBbGxvd2VkV2hpbGVNZXJnaW5nID0gMTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uLCBGdW5jdGlvblRlbXBsYXRlXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBBc3NlcnRTaGFyZWRMb2NrIDogSW5oZXJpdGFibGVBdHRyIHsKQEAgLTkwOCw2ICsxNDk0LDEwIEBACiAgIGxldCBBcmdzID0gW1ZhcmlhZGljRXhwckFyZ3VtZW50PCJBcmdzIj5dOwogICBsZXQgTGF0ZVBhcnNlZCA9IDE7CiAgIGxldCBUZW1wbGF0ZURlcGVuZGVudCA9IDE7CisgIGxldCBQYXJzZUFyZ3VtZW50c0FzVW5ldmFsdWF0ZWQgPSAxOworICBsZXQgRHVwbGljYXRlc0FsbG93ZWRXaGlsZU1lcmdpbmcgPSAxOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb24sIEZ1bmN0aW9uVGVtcGxhdGVdPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogLy8gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFuIGludGVnZXIgb3IgYm9vbGVhbiB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSByZXR1cm4gdmFsdWUKQEAgLTkxNyw2ICsxNTA3LDEwIEBACiAgIGxldCBBcmdzID0gW0V4cHJBcmd1bWVudDwiU3VjY2Vzc1ZhbHVlIj4sIFZhcmlhZGljRXhwckFyZ3VtZW50PCJBcmdzIj5dOwogICBsZXQgTGF0ZVBhcnNlZCA9IDE7CiAgIGxldCBUZW1wbGF0ZURlcGVuZGVudCA9IDE7CisgIGxldCBQYXJzZUFyZ3VtZW50c0FzVW5ldmFsdWF0ZWQgPSAxOworICBsZXQgRHVwbGljYXRlc0FsbG93ZWRXaGlsZU1lcmdpbmcgPSAxOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb24sIEZ1bmN0aW9uVGVtcGxhdGVdPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogLy8gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFuIGludGVnZXIgb3IgYm9vbGVhbiB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSByZXR1cm4gdmFsdWUKQEAgLTkyNiwxMyArMTUyMCwxMCBAQAogICBsZXQgQXJncyA9IFtFeHByQXJndW1lbnQ8IlN1Y2Nlc3NWYWx1ZSI+LCBWYXJpYWRpY0V4cHJBcmd1bWVudDwiQXJncyI+XTsKICAgbGV0IExhdGVQYXJzZWQgPSAxOwogICBsZXQgVGVtcGxhdGVEZXBlbmRlbnQgPSAxOwotfQotCi1kZWYgVW5sb2NrRnVuY3Rpb24gOiBJbmhlcml0YWJsZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0dOVTwidW5sb2NrX2Z1bmN0aW9uIj5dOwotICBsZXQgQXJncyA9IFtWYXJpYWRpY0V4cHJBcmd1bWVudDwiQXJncyI+XTsKLSAgbGV0IExhdGVQYXJzZWQgPSAxOwotICBsZXQgVGVtcGxhdGVEZXBlbmRlbnQgPSAxOworICBsZXQgUGFyc2VBcmd1bWVudHNBc1VuZXZhbHVhdGVkID0gMTsKKyAgbGV0IER1cGxpY2F0ZXNBbGxvd2VkV2hpbGVNZXJnaW5nID0gMTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uLCBGdW5jdGlvblRlbXBsYXRlXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBMb2NrUmV0dXJuZWQgOiBJbmhlcml0YWJsZUF0dHIgewpAQCAtOTQwLDYgKzE1MzEsOSBAQAogICBsZXQgQXJncyA9IFtFeHByQXJndW1lbnQ8IkFyZyI+XTsKICAgbGV0IExhdGVQYXJzZWQgPSAxOwogICBsZXQgVGVtcGxhdGVEZXBlbmRlbnQgPSAxOworICBsZXQgUGFyc2VBcmd1bWVudHNBc1VuZXZhbHVhdGVkID0gMTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uLCBGdW5jdGlvblRlbXBsYXRlXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBMb2Nrc0V4Y2x1ZGVkIDogSW5oZXJpdGFibGVBdHRyIHsKQEAgLTk0Nyw3MCArMTU0MSw3OCBAQAogICBsZXQgQXJncyA9IFtWYXJpYWRpY0V4cHJBcmd1bWVudDwiQXJncyI+XTsKICAgbGV0IExhdGVQYXJzZWQgPSAxOwogICBsZXQgVGVtcGxhdGVEZXBlbmRlbnQgPSAxOwotfQotCi1kZWYgRXhjbHVzaXZlTG9ja3NSZXF1aXJlZCA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbR05VPCJleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQiPl07Ci0gIGxldCBBcmdzID0gW1ZhcmlhZGljRXhwckFyZ3VtZW50PCJBcmdzIj5dOwotICBsZXQgTGF0ZVBhcnNlZCA9IDE7Ci0gIGxldCBUZW1wbGF0ZURlcGVuZGVudCA9IDE7Ci19Ci0KLWRlZiBTaGFyZWRMb2Nrc1JlcXVpcmVkIDogSW5oZXJpdGFibGVBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InNoYXJlZF9sb2Nrc19yZXF1aXJlZCI+XTsKLSAgbGV0IEFyZ3MgPSBbVmFyaWFkaWNFeHByQXJndW1lbnQ8IkFyZ3MiPl07Ci0gIGxldCBMYXRlUGFyc2VkID0gMTsKLSAgbGV0IFRlbXBsYXRlRGVwZW5kZW50ID0gMTsKKyAgbGV0IFBhcnNlQXJndW1lbnRzQXNVbmV2YWx1YXRlZCA9IDE7CisgIGxldCBEdXBsaWNhdGVzQWxsb3dlZFdoaWxlTWVyZ2luZyA9IDE7CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtGdW5jdGlvbiwgRnVuY3Rpb25UZW1wbGF0ZV0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiAvLyBDL0MrKyBjb25zdW1lZCBhdHRyaWJ1dGVzLgogCiBkZWYgQ29uc3VtYWJsZSA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJjb25zdW1hYmxlIj5dOwotICBsZXQgU3ViamVjdHMgPSBbQ1hYUmVjb3JkXTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0NYWFJlY29yZF0+OwogICBsZXQgQXJncyA9IFtFbnVtQXJndW1lbnQ8IkRlZmF1bHRTdGF0ZSIsICJDb25zdW1lZFN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsidW5rbm93biIsICJjb25zdW1lZCIsICJ1bmNvbnN1bWVkIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIlVua25vd24iLCAiQ29uc3VtZWQiLCAiVW5jb25zdW1lZCJdPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW0NvbnN1bWFibGVEb2NzXTsKK30KKworZGVmIENvbnN1bWFibGVBdXRvQ2FzdCA6IEluaGVyaXRhYmxlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJjb25zdW1hYmxlX2F1dG9fY2FzdF9zdGF0ZSI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0NYWFJlY29yZF0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOworfQorCitkZWYgQ29uc3VtYWJsZVNldE9uUmVhZCA6IEluaGVyaXRhYmxlQXR0ciB7CisgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJjb25zdW1hYmxlX3NldF9zdGF0ZV9vbl9yZWFkIj5dOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbQ1hYUmVjb3JkXT47CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBDYWxsYWJsZVdoZW4gOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwiY2FsbGFibGVfd2hlbiI+XTsKLSAgbGV0IFN1YmplY3RzID0gW0NYWE1ldGhvZF07CisgIGxldCBTdWJqZWN0cyA9IFN1YmplY3RMaXN0PFtDWFhNZXRob2RdPjsKICAgbGV0IEFyZ3MgPSBbVmFyaWFkaWNFbnVtQXJndW1lbnQ8IkNhbGxhYmxlU3RhdGUiLCAiQ29uc3VtZWRTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsidW5rbm93biIsICJjb25zdW1lZCIsICJ1bmNvbnN1bWVkIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiVW5rbm93biIsICJDb25zdW1lZCIsICJVbmNvbnN1bWVkIl0+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbQ2FsbGFibGVXaGVuRG9jc107CiB9CiAKIGRlZiBQYXJhbVR5cGVzdGF0ZSA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJwYXJhbV90eXBlc3RhdGUiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtQYXJtVmFyXTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W1Bhcm1WYXJdPjsKICAgbGV0IEFyZ3MgPSBbRW51bUFyZ3VtZW50PCJQYXJhbVN0YXRlIiwgIkNvbnN1bWVkU3RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJ1bmtub3duIiwgImNvbnN1bWVkIiwgInVuY29uc3VtZWQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiVW5rbm93biIsICJDb25zdW1lZCIsICJVbmNvbnN1bWVkIl0+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbUGFyYW1UeXBlc3RhdGVEb2NzXTsKIH0KIAogZGVmIFJldHVyblR5cGVzdGF0ZSA6IEluaGVyaXRhYmxlQXR0ciB7CiAgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJyZXR1cm5fdHlwZXN0YXRlIj5dOwotICBsZXQgU3ViamVjdHMgPSBbRnVuY3Rpb24sIFBhcm1WYXJdOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbRnVuY3Rpb24sIFBhcm1WYXJdPjsKICAgbGV0IEFyZ3MgPSBbRW51bUFyZ3VtZW50PCJTdGF0ZSIsICJDb25zdW1lZFN0YXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsidW5rbm93biIsICJjb25zdW1lZCIsICJ1bmNvbnN1bWVkIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIlVua25vd24iLCAiQ29uc3VtZWQiLCAiVW5jb25zdW1lZCJdPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1JldHVyblR5cGVzdGF0ZURvY3NdOwogfQogCiBkZWYgU2V0VHlwZXN0YXRlIDogSW5oZXJpdGFibGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtHTlU8InNldF90eXBlc3RhdGUiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtDWFhNZXRob2RdOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbQ1hYTWV0aG9kXT47CiAgIGxldCBBcmdzID0gW0VudW1Bcmd1bWVudDwiTmV3U3RhdGUiLCAiQ29uc3VtZWRTdGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbInVua25vd24iLCAiY29uc3VtZWQiLCAidW5jb25zdW1lZCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJVbmtub3duIiwgIkNvbnN1bWVkIiwgIlVuY29uc3VtZWQiXT5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtTZXRUeXBlc3RhdGVEb2NzXTsKIH0KIAogZGVmIFRlc3RUeXBlc3RhdGUgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0dOVTwidGVzdF90eXBlc3RhdGUiPl07Ci0gIGxldCBTdWJqZWN0cyA9IFtDWFhNZXRob2RdOworICBsZXQgU3ViamVjdHMgPSBTdWJqZWN0TGlzdDxbQ1hYTWV0aG9kXT47CiAgIGxldCBBcmdzID0gW0VudW1Bcmd1bWVudDwiVGVzdFN0YXRlIiwgIkNvbnN1bWVkU3RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJjb25zdW1lZCIsICJ1bmNvbnN1bWVkIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIkNvbnN1bWVkIiwgIlVuY29uc3VtZWQiXT5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtUZXN0VHlwZXN0YXRlRG9jc107CiB9CiAKIC8vIFR5cGUgc2FmZXR5IGF0dHJpYnV0ZXMgZm9yIGB2b2lkIConIHBvaW50ZXJzIGFuZCB0eXBlIHRhZ3MuCkBAIC0xMDIyLDggKzE2MjQsOCBAQAogICAgICAgICAgICAgICBVbnNpZ25lZEFyZ3VtZW50PCJBcmd1bWVudElkeCI+LAogICAgICAgICAgICAgICBVbnNpZ25lZEFyZ3VtZW50PCJUeXBlVGFnSWR4Ij4sCiAgICAgICAgICAgICAgIEJvb2xBcmd1bWVudDwiSXNQb2ludGVyIj5dOwotICBsZXQgU3ViamVjdHMgPSBbRnVuY3Rpb25dOwogICBsZXQgSGFzQ3VzdG9tUGFyc2luZyA9IDE7CisgIGxldCBEb2N1bWVudGF0aW9uID0gW0FyZ3VtZW50V2l0aFR5cGVUYWdEb2NzLCBQb2ludGVyV2l0aFR5cGVUYWdEb2NzXTsKIH0KIAogZGVmIFR5cGVUYWdGb3JEYXRhdHlwZSA6IEluaGVyaXRhYmxlQXR0ciB7CkBAIC0xMDMyLDggKzE2MzQsOSBAQAogICAgICAgICAgICAgICBUeXBlQXJndW1lbnQ8Ik1hdGNoaW5nQ1R5cGUiPiwKICAgICAgICAgICAgICAgQm9vbEFyZ3VtZW50PCJMYXlvdXRDb21wYXRpYmxlIj4sCiAgICAgICAgICAgICAgIEJvb2xBcmd1bWVudDwiTXVzdEJlTnVsbCI+XTsKLSAgbGV0IFN1YmplY3RzID0gW1Zhcl07CisvLyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W1Zhcl0sIEVycm9yRGlhZz47CiAgIGxldCBIYXNDdXN0b21QYXJzaW5nID0gMTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVHlwZVRhZ0ZvckRhdGF0eXBlRG9jc107CiB9CiAKIC8vIE1pY3Jvc29mdC1yZWxhdGVkIGF0dHJpYnV0ZXMKQEAgLTEwNDMsNjMgKzE2NDYsMTAzIEBACiB9CiAKIGRlZiBNc1N0cnVjdCA6IEluaGVyaXRhYmxlQXR0ciB7Ci0gIGxldCBTcGVsbGluZ3MgPSBbRGVjbHNwZWM8Im1zX3N0cnVjdCI+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtHQ0M8Im1zX3N0cnVjdCI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W1JlY29yZF0+OworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCi1kZWYgRExMRXhwb3J0IDogSW5oZXJpdGFibGVBdHRyLCBUYXJnZXRTcGVjaWZpY0F0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0RlY2xzcGVjPCJkbGxleHBvcnQiPl07CitkZWYgRExMRXhwb3J0IDogSW5oZXJpdGFibGVBdHRyLCBUYXJnZXRTcGVjaWZpY0F0dHI8VGFyZ2V0WDg2V2luPiB7CisgIGxldCBTcGVsbGluZ3MgPSBbRGVjbHNwZWM8ImRsbGV4cG9ydCI+LCBHQ0M8ImRsbGV4cG9ydCI+XTsKKyAgbGV0IFN1YmplY3RzID0gU3ViamVjdExpc3Q8W0Z1bmN0aW9uLCBWYXJdPjsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAotZGVmIERMTEltcG9ydCA6IEluaGVyaXRhYmxlQXR0ciwgVGFyZ2V0U3BlY2lmaWNBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtEZWNsc3BlYzwiZGxsaW1wb3J0Ij5dOwotfQotCi1kZWYgRm9yY2VJbmxpbmUgOiBJbmhlcml0YWJsZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0tleXdvcmQ8Il9fZm9yY2VpbmxpbmUiPl07CitkZWYgRExMSW1wb3J0IDogSW5oZXJpdGFibGVBdHRyLCBUYXJnZXRTcGVjaWZpY0F0dHI8VGFyZ2V0WDg2V2luPiB7CisgIGxldCBTcGVsbGluZ3MgPSBbRGVjbHNwZWM8ImRsbGltcG9ydCI+LCBHQ0M8ImRsbGltcG9ydCI+XTsKKyAgLy8gVGVjaG5pY2FsbHksIHRoZSBzdWJqZWN0cyBmb3IgRGxsSW1wb3J0IGFyZSBGdW5jdGlvbiBhbmQgVmFyLCBidXQgdGhlcmUgaXMKKyAgLy8gY3VzdG9tIHNlbWFudGljIGhhbmRsaW5nIHJlcXVpcmVkIHdoZW4gTWljcm9zb2Z0RXh0IGlzIHRydWUuCisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBTZWxlY3RBbnkgOiBJbmhlcml0YWJsZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0RlY2xzcGVjPCJzZWxlY3RhbnkiPl07CisgIGxldCBMYW5nT3B0cyA9IFtNaWNyb3NvZnRFeHRdOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCi1kZWYgV2luNjQgOiBJbmhlcml0YWJsZUF0dHIgeworZGVmIFdpbjY0IDogSWdub3JlZEF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0tleXdvcmQ8Il9fdzY0Ij5dOworICBsZXQgTGFuZ09wdHMgPSBbTWljcm9zb2Z0RXh0XTsKIH0KIAogZGVmIFB0cjMyIDogVHlwZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0tleXdvcmQ8Il9fcHRyMzIiPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBQdHI2NCA6IFR5cGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtLZXl3b3JkPCJfX3B0cjY0Ij5dOworICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOwogfQogCiBkZWYgU1B0ciA6IFR5cGVBdHRyIHsKICAgbGV0IFNwZWxsaW5ncyA9IFtLZXl3b3JkPCJfX3NwdHIiPl07CisgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CiB9CiAKIGRlZiBVUHRyIDogVHlwZUF0dHIgewogICBsZXQgU3BlbGxpbmdzID0gW0tleXdvcmQ8Il9fdXB0ciI+XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAotY2xhc3MgTVNJbmhlcml0YW5jZUF0dHIgOiBJbmhlcml0YWJsZUF0dHI7CitkZWYgTVNJbmhlcml0YW5jZSA6IEluaGVyaXRhYmxlQXR0ciB7CisgIGxldCBMYW5nT3B0cyA9IFtNaWNyb3NvZnRFeHRdOworICBsZXQgQXJncyA9IFtEZWZhdWx0Qm9vbEFyZ3VtZW50PCJCZXN0Q2FzZSIsIDE+XTsKKyAgbGV0IFNwZWxsaW5ncyA9IFtLZXl3b3JkPCJfX3NpbmdsZV9pbmhlcml0YW5jZSI+LAorICAgICAgICAgICAgICAgICAgIEtleXdvcmQ8Il9fbXVsdGlwbGVfaW5oZXJpdGFuY2UiPiwKKyAgICAgICAgICAgICAgICAgICBLZXl3b3JkPCJfX3ZpcnR1YWxfaW5oZXJpdGFuY2UiPiwKKyAgICAgICAgICAgICAgICAgICBLZXl3b3JkPCJfX3Vuc3BlY2lmaWVkX2luaGVyaXRhbmNlIj5dOworICBsZXQgQWRkaXRpb25hbE1lbWJlcnMgPSBbeworICBzdGF0aWMgYm9vbCBoYXNWQlB0ck9mZnNldEZpZWxkKFNwZWxsaW5nIEluaGVyaXRhbmNlKSB7CisgICAgcmV0dXJuIEluaGVyaXRhbmNlID09IEtleXdvcmRfdW5zcGVjaWZpZWRfaW5oZXJpdGFuY2U7CisgIH0KIAotZGVmIFNpbmdsZUluaGVyaXRhbmNlIDogTVNJbmhlcml0YW5jZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0tleXdvcmQ8Il9fc2luZ2xlX2luaGVyaXRhbmNlIj5dOworICAvLyBPbmx5IG1lbWJlciBwb2ludGVycyB0byBmdW5jdGlvbnMgbmVlZCBhIHRoaXMgYWRqdXN0bWVudCwgc2luY2UgaXQgY2FuIGJlCisgIC8vIGNvbWJpbmVkIHdpdGggdGhlIGZpZWxkIG9mZnNldCBmb3IgZGF0YSBwb2ludGVycy4KKyAgc3RhdGljIGJvb2wgaGFzTlZPZmZzZXRGaWVsZChib29sIElzTWVtYmVyRnVuY3Rpb24sIFNwZWxsaW5nIEluaGVyaXRhbmNlKSB7CisgICAgcmV0dXJuIElzTWVtYmVyRnVuY3Rpb24gJiYgSW5oZXJpdGFuY2UgPj0gS2V5d29yZF9tdWx0aXBsZV9pbmhlcml0YW5jZTsKKyAgfQorCisgIHN0YXRpYyBib29sIGhhc1ZCVGFibGVPZmZzZXRGaWVsZChTcGVsbGluZyBJbmhlcml0YW5jZSkgeworICAgIHJldHVybiBJbmhlcml0YW5jZSA+PSBLZXl3b3JkX3ZpcnR1YWxfaW5oZXJpdGFuY2U7CisgIH0KKworICBzdGF0aWMgYm9vbCBoYXNPbmx5T25lRmllbGQoYm9vbCBJc01lbWJlckZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlbGxpbmcgSW5oZXJpdGFuY2UpIHsKKyAgICBpZiAoSXNNZW1iZXJGdW5jdGlvbikKKyAgICAgIHJldHVybiBJbmhlcml0YW5jZSA8PSBLZXl3b3JkX3NpbmdsZV9pbmhlcml0YW5jZTsKKyAgICByZXR1cm4gSW5oZXJpdGFuY2UgPD0gS2V5d29yZF9tdWx0aXBsZV9pbmhlcml0YW5jZTsKKyAgfQorICB9XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbTVNJbmhlcml0YW5jZURvY3NdOwogfQogCi1kZWYgTXVsdGlwbGVJbmhlcml0YW5jZSA6IE1TSW5oZXJpdGFuY2VBdHRyIHsKLSAgbGV0IFNwZWxsaW5ncyA9IFtLZXl3b3JkPCJfX211bHRpcGxlX2luaGVyaXRhbmNlIj5dOwotfQotCi1kZWYgVmlydHVhbEluaGVyaXRhbmNlIDogTVNJbmhlcml0YW5jZUF0dHIgewotICBsZXQgU3BlbGxpbmdzID0gW0tleXdvcmQ8Il9fdmlydHVhbF9pbmhlcml0YW5jZSI+XTsKLX0KLQotLy8gVGhpcyBhdHRyaWJ1dGUgZG9lc24ndCBoYXZlIGFueSBzcGVsbGluZ3MsIGJ1dCB3ZSBjYW4gYXBwbHkgaXQgaW1wbGljaXRseSB0bwotLy8gaW5jb21wbGV0ZSB0eXBlcyB0aGF0IGxhY2sgYW55IG9mIHRoZSBvdGhlciBhdHRyaWJ1dGVzLgotZGVmIFVuc3BlY2lmaWVkSW5oZXJpdGFuY2UgOiBNU0luaGVyaXRhbmNlQXR0ciB7CitkZWYgTVNWdG9yRGlzcCA6IEluaGVyaXRhYmxlQXR0ciB7CisgIC8vIFRoaXMgYXR0cmlidXRlIGhhcyBubyBzcGVsbGluZ3MgYXMgaXQgaXMgb25seSBldmVyIGNyZWF0ZWQgaW1wbGljaXRseS4KICAgbGV0IFNwZWxsaW5ncyA9IFtdOworICBsZXQgQXJncyA9IFtVbnNpZ25lZEFyZ3VtZW50PCJ2ZG0iPl07CisgIGxldCBTZW1hSGFuZGxlciA9IDA7CisKKyAgbGV0IEFkZGl0aW9uYWxNZW1iZXJzID0gW3sKKyAgZW51bSBNb2RlIHsKKyAgICBOZXZlciwKKyAgICBGb3JWQmFzZU92ZXJyaWRlLAorICAgIEZvclZGVGFibGUKKyAgfTsKKworICBNb2RlIGdldFZ0b3JEaXNwTW9kZSgpIGNvbnN0IHsgcmV0dXJuIE1vZGUodmRtKTsgfQorICB9XTsKKyAgbGV0IERvY3VtZW50YXRpb24gPSBbVW5kb2N1bWVudGVkXTsKIH0KIAogZGVmIFVuYWxpZ25lZCA6IElnbm9yZWRBdHRyIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ckRvY3MudGQgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJEb2NzLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjIxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJEb2NzLnRkCkBAIC0wLDAgKzEsOTcwIEBACisvLz09LS0tIEF0dHJEb2NzLnRkIC0gQXR0cmlidXRlIGRvY3VtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIEdsb2JhbERvY3VtZW50YXRpb24geworICBjb2RlIEludHJvID1bey4uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTk9URTogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgY2xhbmctdGJsZ2VuCisgIC1nZW4tYXR0ci1kb2NzLiBEbyBub3QgZWRpdCB0aGlzIGZpbGUgYnkgaGFuZCEhCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPT09PT09PT09PT09PT09PT09PQorQXR0cmlidXRlcyBpbiBDbGFuZworPT09PT09PT09PT09PT09PT09PQorLi4gY29udGVudHM6OgorICAgOmxvY2FsOgorCitJbnRyb2R1Y3Rpb24KKz09PT09PT09PT09PQorCitUaGlzIHBhZ2UgbGlzdHMgdGhlIGF0dHJpYnV0ZXMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBDbGFuZy4KK31dOworfQorCitkZWYgVExTTW9kZWxEb2NzIDogRG9jdW1lbnRhdGlvbiB7CisgIGxldCBDYXRlZ29yeSA9IERvY0NhdFZhcmlhYmxlOworICBsZXQgQ29udGVudCA9IFt7CitUaGUgYGB0bHNfbW9kZWxgYCBhdHRyaWJ1dGUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoaWNoIHRocmVhZC1sb2NhbCBzdG9yYWdlCittb2RlbCB0byB1c2UuIEl0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBzdHJpbmdzOgorCisqIGdsb2JhbC1keW5hbWljCisqIGxvY2FsLWR5bmFtaWMKKyogaW5pdGlhbC1leGVjCisqIGxvY2FsLWV4ZWMKKworVExTIG1vZGVscyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICB9XTsKK30KKworZGVmIENhcnJpZXNEZXBlbmRlbmN5RG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgbGV0IENvbnRlbnQgPSBbeworVGhlIGBgY2Fycmllc19kZXBlbmRlbmN5YGAgYXR0cmlidXRlIHNwZWNpZmllcyBkZXBlbmRlbmN5IHByb3BhZ2F0aW9uIGludG8gYW5kCitvdXQgb2YgZnVuY3Rpb25zLgorCitXaGVuIHNwZWNpZmllZCBvbiBhIGZ1bmN0aW9uIG9yIE9iamVjdGl2ZS1DIG1ldGhvZCwgdGhlIGBgY2Fycmllc19kZXBlZGVuY3lgYAorYXR0cmlidXRlIG1lYW5zIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBjYXJyaWVzIGEgZGVwZW5kZW5jeSBvdXQgb2YgdGhlIGZ1bmN0aW9uLCAKK3NvIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIG5lZWQgbm90IGNvbnN0cmFpbiBvcmRlcmluZyB1cG9uIHJldHVybiBmcm9tIHRoYXQKK2Z1bmN0aW9uLiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGFuZCBpdHMgY2FsbGVyIG1heSBjaG9vc2UgdG8gcHJlc2VydmUKK2RlcGVuZGVuY2llcyBpbnN0ZWFkIG9mIGVtaXR0aW5nIG1lbW9yeSBvcmRlcmluZyBpbnN0cnVjdGlvbnMgc3VjaCBhcyBmZW5jZXMuCisKK05vdGUsIHRoaXMgYXR0cmlidXRlIGRvZXMgbm90IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSwgYnV0IG1heSByZXN1bHQKK2luIGdlbmVyYXRhdGlvbiBvZiBtb3JlIGVmZmljaWVudCBjb2RlLgorICB9XTsKK30KKworZGVmIEMxMU5vUmV0dXJuRG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgbGV0IENvbnRlbnQgPSBbeworQSBmdW5jdGlvbiBkZWNsYXJlZCBhcyBgYF9Ob3JldHVybmBgIHNoYWxsIG5vdCByZXR1cm4gdG8gaXRzIGNhbGxlci4gVGhlCitjb21waWxlciB3aWxsIGdlbmVyYXRlIGEgZGlhZ25vc3RpYyBmb3IgYSBmdW5jdGlvbiBkZWNsYXJlZCBhcyBgYF9Ob3JldHVybmBgCit0aGF0IGFwcGVhcnMgdG8gYmUgY2FwYWJsZSBvZiByZXR1cm5pbmcgdG8gaXRzIGNhbGxlci4KKyAgfV07Cit9CisKK2RlZiBDWFgxMU5vUmV0dXJuRG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgbGV0IENvbnRlbnQgPSBbeworQSBmdW5jdGlvbiBkZWNsYXJlZCBhcyBgYFtbbm9yZXR1cm5dXWBgIHNoYWxsIG5vdCByZXR1cm4gdG8gaXRzIGNhbGxlci4gVGhlCitjb21waWxlciB3aWxsIGdlbmVyYXRlIGEgZGlhZ25vc3RpYyBmb3IgYSBmdW5jdGlvbiBkZWNsYXJlZCBhcyBgYFtbbm9yZXR1cm5dXWBgCit0aGF0IGFwcGVhcnMgdG8gYmUgY2FwYWJsZSBvZiByZXR1cm5pbmcgdG8gaXRzIGNhbGxlci4KKyAgfV07Cit9CisKK2RlZiBBc3NlcnRDYXBhYmlsaXR5RG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgbGV0IEhlYWRpbmcgPSAiYXNzZXJ0X2NhcGFiaWxpdHkgKGFzc2VydF9zaGFyZWRfY2FwYWJpbGl0eSwgY2xhbmc6OmFzc2VydF9jYXBhYmlsaXR5LCBjbGFuZzo6YXNzZXJ0X3NoYXJlZF9jYXBhYmlsaXR5KSI7CisgIGxldCBDb250ZW50ID0gW3sKK01hcmtzIGEgZnVuY3Rpb24gdGhhdCBkeW5hbWljYWxseSB0ZXN0cyB3aGV0aGVyIGEgY2FwYWJpbGl0eSBpcyBoZWxkLCBhbmQgaGFsdHMKK3RoZSBwcm9ncmFtIGlmIGl0IGlzIG5vdCBoZWxkLgorICB9XTsKK30KKworZGVmIEFjcXVpcmVDYXBhYmlsaXR5RG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgbGV0IEhlYWRpbmcgPSAiYWNxdWlyZV9jYXBhYmlsaXR5IChhY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5LCBjbGFuZzo6YWNxdWlyZV9jYXBhYmlsaXR5LCBjbGFuZzo6YWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSkiOworICBsZXQgQ29udGVudCA9IFt7CitNYXJrcyBhIGZ1bmN0aW9uIGFzIGFjcXVpcmluZyBhIGNhcGFiaWxpdHkuCisgIH1dOworfQorCitkZWYgVHJ5QWNxdWlyZUNhcGFiaWxpdHlEb2NzIDogRG9jdW1lbnRhdGlvbiB7CisgIGxldCBDYXRlZ29yeSA9IERvY0NhdEZ1bmN0aW9uOworICBsZXQgSGVhZGluZyA9ICJ0cnlfYWNxdWlyZV9jYXBhYmlsaXR5ICh0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSwgY2xhbmc6OnRyeV9hY3F1aXJlX2NhcGFiaWxpdHksIGNsYW5nOjp0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSkiOworICBsZXQgQ29udGVudCA9IFt7CitNYXJrcyBhIGZ1bmN0aW9uIHRoYXQgYXR0ZW1wdHMgdG8gYWNxdWlyZSBhIGNhcGFiaWxpdHkuIFRoaXMgZnVuY3Rpb24gbWF5IGZhaWwgdG8KK2FjdHVhbGx5IGFjcXVpcmUgdGhlIGNhcGFiaWxpdHk7IHRoZXkgYWNjZXB0IGEgQm9vbGVhbiB2YWx1ZSBkZXRlcm1pbmluZword2hldGhlciBhY3F1aXJpbmcgdGhlIGNhcGFiaWxpdHkgbWVhbnMgc3VjY2VzcyAodHJ1ZSksIG9yIGZhaWxpbmcgdG8gYWNxdWlyZQordGhlIGNhcGFiaWxpdHkgbWVhbnMgc3VjY2VzcyAoZmFsc2UpLgorICB9XTsKK30KKworZGVmIFJlbGVhc2VDYXBhYmlsaXR5RG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgbGV0IEhlYWRpbmcgPSAicmVsZWFzZV9jYXBhYmlsaXR5IChyZWxlYXNlX3NoYXJlZF9jYXBhYmlsaXR5LCBjbGFuZzo6cmVsZWFzZV9jYXBhYmlsaXR5LCBjbGFuZzo6cmVsZWFzZV9zaGFyZWRfY2FwYWJpbGl0eSkiOworICBsZXQgQ29udGVudCA9IFt7CitNYXJrcyBhIGZ1bmN0aW9uIGFzIHJlbGVhc2luZyBhIGNhcGFiaWxpdHkuCisgIH1dOworfQorZGVmIEVuYWJsZUlmRG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgbGV0IENvbnRlbnQgPSBbeworVGhlIGBgZW5hYmxlX2lmYGAgYXR0cmlidXRlIGNhbiBiZSBwbGFjZWQgb24gZnVuY3Rpb24gZGVjbGFyYXRpb25zIHRvIGNvbnRyb2wKK3doaWNoIG92ZXJsb2FkIGlzIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzLgorV2hlbiBjb21iaW5lZCB3aXRoIHRoZSBgYG92ZXJsb2FkYWJsZWBgIGF0dHJpYnV0ZSwgdGhpcyBmZWF0dXJlIGlzIGFsc28KK2F2YWlsYWJsZSBpbiBDLgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgaW50IGlzZGlnaXQoaW50IGMpOworICBpbnQgaXNkaWdpdChpbnQgYykgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKGMgPD0gLTEgfHwgYyA+IDI1NSwgImNob3NlbiB3aGVuICdjJyBpcyBvdXQgb2YgcmFuZ2UiKSkpIF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKCInYycgbXVzdCBoYXZlIHRoZSB2YWx1ZSBvZiBhbiB1bnNpZ25lZCBjaGFyIG9yIEVPRiIpKSk7CisgIAorICB2b2lkIGZvbyhjaGFyIGMpIHsKKyAgICBpc2RpZ2l0KGMpOworICAgIGlzZGlnaXQoMTApOworICAgIGlzZGlnaXQoLTEwKTsgIC8vIHJlc3VsdHMgaW4gYSBjb21waWxlLXRpbWUgZXJyb3IuCisgIH0KKworVGhlIGVuYWJsZV9pZiBhdHRyaWJ1dGUgdGFrZXMgdHdvIGFyZ3VtZW50cywgdGhlIGZpcnN0IGlzIGFuIGV4cHJlc3Npb24gd3JpdHRlbgoraW4gdGVybXMgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMsIHRoZSBzZWNvbmQgaXMgYSBzdHJpbmcgZXhwbGFpbmluZyB3aHkgdGhpcworb3ZlcmxvYWQgY2FuZGlkYXRlIGNvdWxkIG5vdCBiZSBzZWxlY3RlZCB0byBiZSBkaXNwbGF5ZWQgaW4gZGlhZ25vc3RpY3MuIFRoZQorZXhwcmVzc2lvbiBpcyBwYXJ0IG9mIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgZm9yIHRoZSBwdXJwb3NlcyBvZiBkZXRlcm1pbmluZword2hldGhlciBpdCBpcyBhIHJlZGVjbGFyYXRpb24gKGZvbGxvd2luZyB0aGUgcnVsZXMgdXNlZCB3aGVuIGRldGVybWluaW5nCit3aGV0aGVyIGEgQysrIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGlzIE9EUi1lcXVpdmFsZW50KSwgYnV0IGlzIG5vdCBwYXJ0IG9mCit0aGUgdHlwZS4KKworVGhlIGVuYWJsZV9pZiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhcyBpZiBpdCB3ZXJlIHRoZSBib2R5IG9mIGEKK2Jvb2wtcmV0dXJuaW5nIGNvbnN0ZXhwciBmdW5jdGlvbiBkZWNsYXJlZCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhlIGZ1bmN0aW9uCitpdCBpcyBiZWluZyBhcHBsaWVkIHRvLCB0aGVuIGNhbGxlZCB3aXRoIHRoZSBwYXJhbWV0ZXJzIGF0IHRoZSBjYWxsc2l0ZS4gSWYgdGhlCityZXN1bHQgaXMgZmFsc2Ugb3IgY291bGQgbm90IGJlIGRldGVybWluZWQgdGhyb3VnaCBjb25zdGFudCBleHByZXNzaW9uCitldmFsdWF0aW9uLCB0aGVuIHRoaXMgb3ZlcmxvYWQgd2lsbCBub3QgYmUgY2hvc2VuIGFuZCB0aGUgcHJvdmlkZWQgc3RyaW5nIG1heQorYmUgdXNlZCBpbiBhIGRpYWdub3N0aWMgaWYgdGhlIGNvbXBpbGUgZmFpbHMgYXMgYSByZXN1bHQuCisKK0JlY2F1c2UgdGhlIGVuYWJsZV9pZiBleHByZXNzaW9uIGlzIGFuIHVuZXZhbHVhdGVkIGNvbnRleHQsIHRoZXJlIGFyZSBubyBnbG9iYWwKK3N0YXRlIGNoYW5nZXMsIG5vciB0aGUgYWJpbGl0eSB0byBwYXNzIGluZm9ybWF0aW9uIGZyb20gdGhlIGVuYWJsZV9pZgorZXhwcmVzc2lvbiB0byB0aGUgZnVuY3Rpb24gYm9keS4gRm9yIGV4YW1wbGUsIHN1cHBvc2Ugd2Ugd2FudCBjYWxscyB0bworc3RybmxlbihzdHJidWYsIG1heGxlbikgdG8gcmVzb2x2ZSB0byBzdHJubGVuX2NoayhzdHJidWYsIG1heGxlbiwgc2l6ZSBvZgorc3RyYnVmKSBvbmx5IGlmIHRoZSBzaXplIG9mIHN0cmJ1ZiBjYW4gYmUgZGV0ZXJtaW5lZDoKKworLi4gY29kZS1ibG9jazo6IGMrKworCisgIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUpKQorICBzdGF0aWMgaW5saW5lIHNpemVfdCBzdHJubGVuKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBtYXhsZW4pCisgICAgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYoX19idWlsdGluX29iamVjdF9zaXplKHMsIDApICE9IC0xKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvc2VuIHdoZW4gdGhlIGJ1ZmZlciBzaXplIGlzIGtub3duIGJ1dCAnbWF4bGVuJyBpcyBub3QiKSkpCisgIHsKKyAgICByZXR1cm4gc3Rybmxlbl9jaGsocywgbWF4bGVuLCBfX2J1aWx0aW5fb2JqZWN0X3NpemUocywgMCkpOworICB9CisKK011bHRpcGxlIGVuYWJsZV9pZiBhdHRyaWJ1dGVzIG1heSBiZSBhcHBsaWVkIHRvIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiBJbiB0aGlzCitjYXNlLCB0aGUgZW5hYmxlX2lmIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IGluIHRoZQorZm9sbG93aW5nIG1hbm5lci4gRmlyc3QsIHRoZSBjYW5kaWRhdGVzIHdob3NlIGVuYWJsZV9pZiBleHByZXNzaW9ucyBldmFsdWF0ZSB0bworZmFsc2Ugb3IgY2Fubm90IGJlIGV2YWx1YXRlZCBhcmUgZGlzY2FyZGVkLiBJZiB0aGUgcmVtYWluaW5nIGNhbmRpZGF0ZXMgZG8gbm90CitzaGFyZSBPRFItZXF1aXZhbGVudCBlbmFibGVfaWYgZXhwcmVzc2lvbnMsIHRoZSBvdmVybG9hZCByZXNvbHV0aW9uIGlzCithbWJpZ3VvdXMuIE90aGVyd2lzZSwgZW5hYmxlX2lmIG92ZXJsb2FkIHJlc29sdXRpb24gY29udGludWVzIHdpdGggdGhlIG5leHQKK2VuYWJsZV9pZiBhdHRyaWJ1dGUgb24gdGhlIGNhbmRpZGF0ZXMgdGhhdCBoYXZlIG5vdCBiZWVuIGRpc2NhcmRlZCBhbmQgaGF2ZQorcmVtYWluaW5nIGVuYWJsZV9pZiBhdHRyaWJ1dGVzLiBJbiB0aGlzIHdheSwgd2UgcGljayB0aGUgbW9zdCBzcGVjaWZpYworb3ZlcmxvYWQgb3V0IG9mIGEgbnVtYmVyIG9mIHZpYWJsZSBvdmVybG9hZHMgdXNpbmcgZW5hYmxlX2lmLgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgdm9pZCBmKCkgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKHRydWUsICIiKSkpOyAgLy8gIzEKKyAgdm9pZCBmKCkgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKHRydWUsICIiKSkpIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZih0cnVlLCAiIikpKTsgIC8vICMyCisgIAorICB2b2lkIGcoaW50IGksIGludCBqKSBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYoaSwgIiIpKSk7ICAvLyAjMQorICB2b2lkIGcoaW50IGksIGludCBqKSBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYoaiwgIiIpKSkgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKHRydWUpKSk7ICAvLyAjMgorCitJbiB0aGlzIGV4YW1wbGUsIGEgY2FsbCB0byBmKCkgaXMgYWx3YXlzIHJlc29sdmVkIHRvICMyLCBhcyB0aGUgZmlyc3QgZW5hYmxlX2lmCitleHByZXNzaW9uIGlzIE9EUi1lcXVpdmFsZW50IGZvciBib3RoIGRlY2xhcmF0aW9ucywgYnV0ICMxIGRvZXMgbm90IGhhdmUgYW5vdGhlcgorZW5hYmxlX2lmIGV4cHJlc3Npb24gdG8gY29udGludWUgZXZhbHVhdGluZywgc28gdGhlIG5leHQgcm91bmQgb2YgZXZhbHVhdGlvbiBoYXMKK29ubHkgYSBzaW5nbGUgY2FuZGlkYXRlLiBJbiBhIGNhbGwgdG8gZygxLCAxKSwgdGhlIGNhbGwgaXMgYW1iaWd1b3VzIGV2ZW4gdGhvdWdoCisjMiBoYXMgbW9yZSBlbmFibGVfaWYgYXR0cmlidXRlcywgYmVjYXVzZSB0aGUgZmlyc3QgZW5hYmxlX2lmIGV4cHJlc3Npb25zIGFyZQorbm90IE9EUi1lcXVpdmFsZW50LgorCitRdWVyeSBmb3IgdGhpcyBmZWF0dXJlIHdpdGggYGBfX2hhc19hdHRyaWJ1dGUoZW5hYmxlX2lmKWBgLgorICB9XTsKK30KKworZGVmIE92ZXJsb2FkYWJsZURvY3MgOiBEb2N1bWVudGF0aW9uIHsKKyAgbGV0IENhdGVnb3J5ID0gRG9jQ2F0RnVuY3Rpb247CisgIGxldCBDb250ZW50ID0gW3sKK0NsYW5nIHByb3ZpZGVzIHN1cHBvcnQgZm9yIEMrKyBmdW5jdGlvbiBvdmVybG9hZGluZyBpbiBDLiAgRnVuY3Rpb24gb3ZlcmxvYWRpbmcKK2luIEMgaXMgaW50cm9kdWNlZCB1c2luZyB0aGUgYGBvdmVybG9hZGFibGVgYCBhdHRyaWJ1dGUuICBGb3IgZXhhbXBsZSwgb25lCittaWdodCBwcm92aWRlIHNldmVyYWwgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiBhIGBgdGdzaW5gYCBmdW5jdGlvbiB0aGF0IGludm9rZXMKK3RoZSBhcHByb3ByaWF0ZSBzdGFuZGFyZCBmdW5jdGlvbiBjb21wdXRpbmcgdGhlIHNpbmUgb2YgYSB2YWx1ZSB3aXRoIGBgZmxvYXRgYCwKK2BgZG91YmxlYGAsIG9yIGBgbG9uZyBkb3VibGVgYCBwcmVjaXNpb246CisKKy4uIGNvZGUtYmxvY2s6OiBjCisKKyAgI2luY2x1ZGUgPG1hdGguaD4KKyAgZmxvYXQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGdzaW4oZmxvYXQgeCkgeyByZXR1cm4gc2luZih4KTsgfQorICBkb3VibGUgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgdGdzaW4oZG91YmxlIHgpIHsgcmV0dXJuIHNpbih4KTsgfQorICBsb25nIGRvdWJsZSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSB0Z3Npbihsb25nIGRvdWJsZSB4KSB7IHJldHVybiBzaW5sKHgpOyB9CisKK0dpdmVuIHRoZXNlIGRlY2xhcmF0aW9ucywgb25lIGNhbiBjYWxsIGBgdGdzaW5gYCB3aXRoIGEgYGBmbG9hdGBgIHZhbHVlIHRvCityZWNlaXZlIGEgYGBmbG9hdGBgIHJlc3VsdCwgd2l0aCBhIGBgZG91YmxlYGAgdG8gcmVjZWl2ZSBhIGBgZG91YmxlYGAgcmVzdWx0LAorZXRjLiAgRnVuY3Rpb24gb3ZlcmxvYWRpbmcgaW4gQyBmb2xsb3dzIHRoZSBydWxlcyBvZiBDKysgZnVuY3Rpb24gb3ZlcmxvYWRpbmcKK3RvIHBpY2sgdGhlIGJlc3Qgb3ZlcmxvYWQgZ2l2ZW4gdGhlIGNhbGwgYXJndW1lbnRzLCB3aXRoIGEgZmV3IEMtc3BlY2lmaWMKK3NlbWFudGljczoKKworKiBDb252ZXJzaW9uIGZyb20gYGBmbG9hdGBgIG9yIGBgZG91YmxlYGAgdG8gYGBsb25nIGRvdWJsZWBgIGlzIHJhbmtlZCBhcyBhCisgIGZsb2F0aW5nLXBvaW50IHByb21vdGlvbiAocGVyIEM5OSkgcmF0aGVyIHRoYW4gYXMgYSBmbG9hdGluZy1wb2ludCBjb252ZXJzaW9uCisgIChhcyBpbiBDKyspLgorCisqIEEgY29udmVyc2lvbiBmcm9tIGEgcG9pbnRlciBvZiB0eXBlIGBgVCpgYCB0byBhIHBvaW50ZXIgb2YgdHlwZSBgYFUqYGAgaXMKKyAgY29uc2lkZXJlZCBhIHBvaW50ZXIgY29udmVyc2lvbiAod2l0aCBjb252ZXJzaW9uIHJhbmspIGlmIGBgVGBgIGFuZCBgYFVgYCBhcmUKKyAgY29tcGF0aWJsZSB0eXBlcy4KKworKiBBIGNvbnZlcnNpb24gZnJvbSB0eXBlIGBgVGBgIHRvIGEgdmFsdWUgb2YgdHlwZSBgYFVgYCBpcyBwZXJtaXR0ZWQgaWYgYGBUYGAKKyAgYW5kIGBgVWBgIGFyZSBjb21wYXRpYmxlIHR5cGVzLiAgVGhpcyBjb252ZXJzaW9uIGlzIGdpdmVuICJjb252ZXJzaW9uIiByYW5rLgorCitUaGUgZGVjbGFyYXRpb24gb2YgYGBvdmVybG9hZGFibGVgYCBmdW5jdGlvbnMgaXMgcmVzdHJpY3RlZCB0byBmdW5jdGlvbgorZGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucy4gIE1vc3QgaW1wb3J0YW50bHksIGlmIGFueSBmdW5jdGlvbiB3aXRoIGEgZ2l2ZW4KK25hbWUgaXMgZ2l2ZW4gdGhlIGBgb3ZlcmxvYWRhYmxlYGAgYXR0cmlidXRlLCB0aGVuIGFsbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKK2FuZCBkZWZpbml0aW9ucyB3aXRoIHRoYXQgbmFtZSAoYW5kIGluIHRoYXQgc2NvcGUpIG11c3QgaGF2ZSB0aGUKK2Bgb3ZlcmxvYWRhYmxlYGAgYXR0cmlidXRlLiAgVGhpcyBydWxlIGV2ZW4gYXBwbGllcyB0byByZWRlY2xhcmF0aW9ucyBvZgorZnVuY3Rpb25zIHdob3NlIG9yaWdpbmFsIGRlY2xhcmF0aW9uIGhhZCB0aGUgYGBvdmVybG9hZGFibGVgYCBhdHRyaWJ1dGUsIGUuZy4sCisKKy4uIGNvZGUtYmxvY2s6OiBjCisKKyAgaW50IGYoaW50KSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKTsKKyAgZmxvYXQgZihmbG9hdCk7IC8vIGVycm9yOiBkZWNsYXJhdGlvbiBvZiAiZiIgbXVzdCBoYXZlIHRoZSAib3ZlcmxvYWRhYmxlIiBhdHRyaWJ1dGUKKworICBpbnQgZyhpbnQpIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpOworICBpbnQgZyhpbnQpIHsgfSAvLyBlcnJvcjogcmVkZWNsYXJhdGlvbiBvZiAiZyIgbXVzdCBhbHNvIGhhdmUgdGhlICJvdmVybG9hZGFibGUiIGF0dHJpYnV0ZQorCitGdW5jdGlvbnMgbWFya2VkIGBgb3ZlcmxvYWRhYmxlYGAgbXVzdCBoYXZlIHByb3RvdHlwZXMuICBUaGVyZWZvcmUsIHRoZQorZm9sbG93aW5nIGNvZGUgaXMgaWxsLWZvcm1lZDoKKworLi4gY29kZS1ibG9jazo6IGMKKworICBpbnQgaCgpIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpOyAvLyBlcnJvcjogaCBkb2VzIG5vdCBoYXZlIGEgcHJvdG90eXBlCisKK0hvd2V2ZXIsIGBgb3ZlcmxvYWRhYmxlYGAgZnVuY3Rpb25zIGFyZSBhbGxvd2VkIHRvIHVzZSBhIGVsbGlwc2lzIGV2ZW4gaWYgdGhlcmUKK2FyZSBubyBuYW1lZCBwYXJhbWV0ZXJzIChhcyBpcyBwZXJtaXR0ZWQgaW4gQysrKS4gIFRoaXMgZmVhdHVyZSBpcyBwYXJ0aWN1bGFybHkKK3VzZWZ1bCB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIGBgdW5hdmFpbGFibGVgYCBhdHRyaWJ1dGU6CisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICB2b2lkIGhvbmV5cG90KC4uLikgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlLCB1bmF2YWlsYWJsZSkpOyAvLyBjYWxsaW5nIG1lIGlzIGFuIGVycm9yCisKK0Z1bmN0aW9ucyBkZWNsYXJlZCB3aXRoIHRoZSBgYG92ZXJsb2FkYWJsZWBgIGF0dHJpYnV0ZSBoYXZlIHRoZWlyIG5hbWVzIG1hbmdsZWQKK2FjY29yZGluZyB0byB0aGUgc2FtZSBydWxlcyBhcyBDKysgZnVuY3Rpb24gbmFtZXMuICBGb3IgZXhhbXBsZSwgdGhlIHRocmVlCitgYHRnc2luYGAgZnVuY3Rpb25zIGluIG91ciBtb3RpdmF0aW5nIGV4YW1wbGUgZ2V0IHRoZSBtYW5nbGVkIG5hbWVzCitgYF9aNXRnc2luZmBgLCBgYF9aNXRnc2luZGBgLCBhbmQgYGBfWjV0Z3NpbmVgYCwgcmVzcGVjdGl2ZWx5LiAgVGhlcmUgYXJlIHR3bworY2F2ZWF0cyB0byB0aGlzIHVzZSBvZiBuYW1lIG1hbmdsaW5nOgorCisqIEZ1dHVyZSB2ZXJzaW9ucyBvZiBDbGFuZyBtYXkgY2hhbmdlIHRoZSBuYW1lIG1hbmdsaW5nIG9mIGZ1bmN0aW9ucyBvdmVybG9hZGVkCisgIGluIEMsIHNvIHlvdSBzaG91bGQgbm90IGRlcGVuZCBvbiBhbiBzcGVjaWZpYyBtYW5nbGluZy4gIFRvIGJlIGNvbXBsZXRlbHkKKyAgc2FmZSwgd2Ugc3Ryb25nbHkgdXJnZSB0aGUgdXNlIG9mIGBgc3RhdGljIGlubGluZWBgIHdpdGggYGBvdmVybG9hZGFibGVgYAorICBmdW5jdGlvbnMuCisKKyogVGhlIGBgb3ZlcmxvYWRhYmxlYGAgYXR0cmlidXRlIGhhcyBhbG1vc3Qgbm8gbWVhbmluZyB3aGVuIHVzZWQgaW4gQysrLAorICBiZWNhdXNlIG5hbWVzIHdpbGwgYWxyZWFkeSBiZSBtYW5nbGVkIGFuZCBmdW5jdGlvbnMgYXJlIGFscmVhZHkgb3ZlcmxvYWRhYmxlLgorICBIb3dldmVyLCB3aGVuIGFuIGBgb3ZlcmxvYWRhYmxlYGAgZnVuY3Rpb24gb2NjdXJzIHdpdGhpbiBhbiBgYGV4dGVybiAiQyJgYAorICBsaW5rYWdlIHNwZWNpZmljYXRpb24sIGl0J3MgbmFtZSAqd2lsbCogYmUgbWFuZ2xlZCBpbiB0aGUgc2FtZSB3YXkgYXMgaXQKKyAgd291bGQgaW4gQy4KKworUXVlcnkgZm9yIHRoaXMgZmVhdHVyZSB3aXRoIGBgX19oYXNfZXh0ZW5zaW9uKGF0dHJpYnV0ZV9vdmVybG9hZGFibGUpYGAuCisgIH1dOworfQorCitkZWYgT2JqQ01ldGhvZEZhbWlseURvY3MgOiBEb2N1bWVudGF0aW9uIHsKKyAgbGV0IENhdGVnb3J5ID0gRG9jQ2F0RnVuY3Rpb247CisgIGxldCBDb250ZW50ID0gW3sKK01hbnkgbWV0aG9kcyBpbiBPYmplY3RpdmUtQyBoYXZlIGNvbnZlbnRpb25hbCBtZWFuaW5ncyBkZXRlcm1pbmVkIGJ5IHRoZWlyCitzZWxlY3RvcnMuIEl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gYmUgYWJsZSB0byBtYXJrIGEgbWV0aG9kIGFzIGhhdmluZyBhCitwYXJ0aWN1bGFyIGNvbnZlbnRpb25hbCBtZWFuaW5nIGRlc3BpdGUgbm90IGhhdmluZyB0aGUgcmlnaHQgc2VsZWN0b3IsIG9yIGFzCitub3QgaGF2aW5nIHRoZSBjb252ZW50aW9uYWwgbWVhbmluZyB0aGF0IGl0cyBzZWxlY3RvciB3b3VsZCBzdWdnZXN0LiBGb3IgdGhlc2UKK3VzZSBjYXNlcywgd2UgcHJvdmlkZSBhbiBhdHRyaWJ1dGUgdG8gc3BlY2lmaWNhbGx5IGRlc2NyaWJlIHRoZSAibWV0aG9kIGZhbWlseSIKK3RoYXQgYSBtZXRob2QgYmVsb25ncyB0by4KKworKipVc2FnZSoqOiBgYF9fYXR0cmlidXRlX18oKG9iamNfbWV0aG9kX2ZhbWlseShYKSkpYGAsIHdoZXJlIGBgWGBgIGlzIG9uZSBvZgorYGBub25lYGAsIGBgYWxsb2NgYCwgYGBjb3B5YGAsIGBgaW5pdGBgLCBgYG11dGFibGVDb3B5YGAsIG9yIGBgbmV3YGAuICBUaGlzCithdHRyaWJ1dGUgY2FuIG9ubHkgYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgYSBtZXRob2QgZGVjbGFyYXRpb246CisKKy4uIGNvZGUtYmxvY2s6OiBvYmpjCisKKyAgLSAoTlNTdHJpbmcgKilpbml0TXlTdHJpbmdWYWx1ZSBfX2F0dHJpYnV0ZV9fKChvYmpjX21ldGhvZF9mYW1pbHkobm9uZSkpKTsKKworVXNlcnMgd2hvIGRvIG5vdCB3aXNoIHRvIGNoYW5nZSB0aGUgY29udmVudGlvbmFsIG1lYW5pbmcgb2YgYSBtZXRob2QsIGFuZCB3aG8KK21lcmVseSB3YW50IHRvIGRvY3VtZW50IGl0cyBub24tc3RhbmRhcmQgcmV0YWluIGFuZCByZWxlYXNlIHNlbWFudGljcywgc2hvdWxkCit1c2UgdGhlIHJldGFpbmluZyBiZWhhdmlvciBhdHRyaWJ1dGVzIChgYG5zX3JldHVybnNfcmV0YWluZWRgYCwKK2BgbnNfcmV0dXJuc19ub3RfcmV0YWluZWRgYCwgZXRjKS4KKworUXVlcnkgZm9yIHRoaXMgZmVhdHVyZSB3aXRoIGBgX19oYXNfYXR0cmlidXRlKG9iamNfbWV0aG9kX2ZhbWlseSlgYC4KKyAgfV07Cit9CisKK2RlZiBOb0R1cGxpY2F0ZURvY3MgOiBEb2N1bWVudGF0aW9uIHsKKyAgbGV0IENhdGVnb3J5ID0gRG9jQ2F0RnVuY3Rpb247CisgIGxldCBDb250ZW50ID0gW3sKK1RoZSBgYG5vZHVwbGljYXRlYGAgYXR0cmlidXRlIGNhbiBiZSBwbGFjZWQgb24gZnVuY3Rpb24gZGVjbGFyYXRpb25zIHRvIGNvbnRyb2wKK3doZXRoZXIgZnVuY3Rpb24gY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBjYW4gYmUgZHVwbGljYXRlZCBvciBub3QgYXMgYSByZXN1bHQgb2YKK29wdGltaXphdGlvbnMuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgd2l0aAorY2VydGFpbiBzcGVjaWFsIHJlcXVpcmVtZW50cywgbGlrZSB0aGUgT3BlbkNMICJiYXJyaWVyIiBmdW5jdGlvbiwgdGhhdCBtaWdodAorbmVlZCB0byBiZSBydW4gY29uY3VycmVudGx5IGJ5IGFsbCB0aGUgdGhyZWFkcyB0aGF0IGFyZSBleGVjdXRpbmcgaW4gbG9ja3N0ZXAKK29uIHRoZSBoYXJkd2FyZS4gRm9yIGV4YW1wbGUgdGhpcyBhdHRyaWJ1dGUgYXBwbGllZCBvbiB0aGUgZnVuY3Rpb24KKyJub2R1cGZ1bmMiIGluIHRoZSBjb2RlIGJlbG93IGF2b2lkcyB0aGF0OgorCisuLiBjb2RlLWJsb2NrOjogYworCisgIHZvaWQgbm9kdXBmdW5jKCkgX19hdHRyaWJ1dGVfXygobm9kdXBsaWNhdGUpKTsKKyAgLy8gU2V0dGluZyBpdCBhcyBhIEMrKzExIGF0dHJpYnV0ZSBpcyBhbHNvIHZhbGlkCisgIC8vIHZvaWQgbm9kdXBmdW5jKCkgW1tjbGFuZzo6bm9kdXBsaWNhdGVdXTsKKyAgdm9pZCBmb28oKTsKKyAgdm9pZCBiYXIoKTsKKworICBub2R1cGZ1bmMoKTsKKyAgaWYgKGEgPiBuKSB7CisgICAgZm9vKCk7CisgIH0gZWxzZSB7CisgICAgYmFyKCk7CisgIH0KKworZ2V0cyBwb3NzaWJseSBtb2RpZmllZCBieSBzb21lIG9wdGltaXphdGlvbnMgaW50byBjb2RlIHNpbWlsYXIgdG8gdGhpczoKKworLi4gY29kZS1ibG9jazo6IGMKKworICBpZiAoYSA+IG4pIHsKKyAgICBub2R1cGZ1bmMoKTsKKyAgICBmb28oKTsKKyAgfSBlbHNlIHsKKyAgICBub2R1cGZ1bmMoKTsKKyAgICBiYXIoKTsKKyAgfQorCit3aGVyZSB0aGUgY2FsbCB0byAibm9kdXBmdW5jIiBpcyBkdXBsaWNhdGVkIGFuZCBzdW5rIGludG8gdGhlIHR3byBicmFuY2hlcworb2YgdGhlIGNvbmRpdGlvbi4KKyAgfV07Cit9CisKK2RlZiBPYmpDUmVxdWlyZXNTdXBlckRvY3MgOiBEb2N1bWVudGF0aW9uIHsKKyAgbGV0IENhdGVnb3J5ID0gRG9jQ2F0RnVuY3Rpb247CisgIGxldCBDb250ZW50ID0gW3sKK1NvbWUgT2JqZWN0aXZlLUMgY2xhc3NlcyBhbGxvdyBhIHN1YmNsYXNzIHRvIG92ZXJyaWRlIGEgcGFydGljdWxhciBtZXRob2QgaW4gYQorcGFyZW50IGNsYXNzIGJ1dCBleHBlY3QgdGhhdCB0aGUgb3ZlcnJpZGluZyBtZXRob2QgYWxzbyBjYWxscyB0aGUgb3ZlcnJpZGRlbgorbWV0aG9kIGluIHRoZSBwYXJlbnQgY2xhc3MuIEZvciB0aGVzZSBjYXNlcywgd2UgcHJvdmlkZSBhbiBhdHRyaWJ1dGUgdG8KK2Rlc2lnbmF0ZSB0aGF0IGEgbWV0aG9kIHJlcXVpcmVzIGEgImNhbGwgdG8gYGBzdXBlcmBgIiBpbiB0aGUgb3ZlcnJpZGluZworbWV0aG9kIGluIHRoZSBzdWJjbGFzcy4KKworKipVc2FnZSoqOiBgYF9fYXR0cmlidXRlX18oKG9iamNfcmVxdWlyZXNfc3VwZXIpKWBgLiAgVGhpcyBhdHRyaWJ1dGUgY2FuIG9ubHkKK2JlIHBsYWNlZCBhdCB0aGUgZW5kIG9mIGEgbWV0aG9kIGRlY2xhcmF0aW9uOgorCisuLiBjb2RlLWJsb2NrOjogb2JqYworCisgIC0gKHZvaWQpZm9vIF9fYXR0cmlidXRlX18oKG9iamNfcmVxdWlyZXNfc3VwZXIpKTsKKworVGhpcyBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgYXBwbGllZCB0aGUgbWV0aG9kIGRlY2xhcmF0aW9ucyB3aXRoaW4gYSBjbGFzcywgYW5kCitub3QgYSBwcm90b2NvbC4gIEN1cnJlbnRseSB0aGlzIGF0dHJpYnV0ZSBkb2VzIG5vdCBlbmZvcmNlIGFueSBwbGFjZW1lbnQgb2YKK3doZXJlIHRoZSBjYWxsIG9jY3VycyBpbiB0aGUgb3ZlcnJpZGluZyBtZXRob2QgKHN1Y2ggYXMgaW4gdGhlIGNhc2Ugb2YKK2BgLWRlYWxsb2NgYCB3aGVyZSB0aGUgY2FsbCBtdXN0IGFwcGVhciBhdCB0aGUgZW5kKS4gIEl0IGNoZWNrcyBvbmx5IHRoYXQgaXQKK2V4aXN0cy4KKworTm90ZSB0aGF0IG9uIGJvdGggT1MgWCBhbmQgaU9TIHRoYXQgdGhlIEZvdW5kYXRpb24gZnJhbWV3b3JrIHByb3ZpZGVzIGEKK2NvbnZlbmllbmNlIG1hY3JvIGBgTlNfUkVRVUlSRVNfU1VQRVJgYCB0aGF0IHByb3ZpZGVzIHN5bnRhY3RpYyBzdWdhciBmb3IgdGhpcworYXR0cmlidXRlOgorCisuLiBjb2RlLWJsb2NrOjogb2JqYworCisgIC0gKHZvaWQpZm9vIE5TX1JFUVVJUkVTX1NVUEVSOworCitUaGlzIG1hY3JvIGlzIGNvbmRpdGlvbmFsbHkgZGVmaW5lZCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyJ3Mgc3VwcG9ydCBmb3IKK3RoaXMgYXR0cmlidXRlLiAgSWYgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGF0dHJpYnV0ZSB0aGUgbWFjcm8KK2V4cGFuZHMgdG8gbm90aGluZy4KKworT3BlcmF0aW9uYWxseSwgd2hlbiBhIG1ldGhvZCBoYXMgdGhpcyBhbm5vdGF0aW9uIHRoZSBjb21waWxlciB3aWxsIHdhcm4gaWYgdGhlCitpbXBsZW1lbnRhdGlvbiBvZiBhbiBvdmVycmlkZSBpbiBhIHN1YmNsYXNzIGRvZXMgbm90IGNhbGwgc3VwZXIuICBGb3IgZXhhbXBsZToKKworLi4gY29kZS1ibG9jazo6IG9iamMKKworICAgd2FybmluZzogbWV0aG9kIHBvc3NpYmx5IG1pc3NpbmcgYSBbc3VwZXIgQW5ub3RNZXRoXSBjYWxsCisgICAtICh2b2lkKSBBbm5vdE1ldGh7fTsKKyAgICAgICAgICAgICAgICAgICAgICBeCisgIH1dOworfQorCitkZWYgQXZhaWxhYmlsaXR5RG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgbGV0IENvbnRlbnQgPSBbeworVGhlIGBgYXZhaWxhYmlsaXR5YGAgYXR0cmlidXRlIGNhbiBiZSBwbGFjZWQgb24gZGVjbGFyYXRpb25zIHRvIGRlc2NyaWJlIHRoZQorbGlmZWN5Y2xlIG9mIHRoYXQgZGVjbGFyYXRpb24gcmVsYXRpdmUgdG8gb3BlcmF0aW5nIHN5c3RlbSB2ZXJzaW9ucy4gIENvbnNpZGVyCit0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gZm9yIGEgaHlwb3RoZXRpY2FsIGZ1bmN0aW9uIGBgZmBgOgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgdm9pZCBmKHZvaWQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC40LGRlcHJlY2F0ZWQ9MTAuNixvYnNvbGV0ZWQ9MTAuNykpKTsKKworVGhlIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGUgc3RhdGVzIHRoYXQgYGBmYGAgd2FzIGludHJvZHVjZWQgaW4gTWFjIE9TIFggMTAuNCwKK2RlcHJlY2F0ZWQgaW4gTWFjIE9TIFggMTAuNiwgYW5kIG9ic29sZXRlZCBpbiBNYWMgT1MgWCAxMC43LiAgVGhpcyBpbmZvcm1hdGlvbgoraXMgdXNlZCBieSBDbGFuZyB0byBkZXRlcm1pbmUgd2hlbiBpdCBpcyBzYWZlIHRvIHVzZSBgYGZgYDogZm9yIGV4YW1wbGUsIGlmCitDbGFuZyBpcyBpbnN0cnVjdGVkIHRvIGNvbXBpbGUgY29kZSBmb3IgTWFjIE9TIFggMTAuNSwgYSBjYWxsIHRvIGBgZigpYGAKK3N1Y2NlZWRzLiAgSWYgQ2xhbmcgaXMgaW5zdHJ1Y3RlZCB0byBjb21waWxlIGNvZGUgZm9yIE1hYyBPUyBYIDEwLjYsIHRoZSBjYWxsCitzdWNjZWVkcyBidXQgQ2xhbmcgZW1pdHMgYSB3YXJuaW5nIHNwZWNpZnlpbmcgdGhhdCB0aGUgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4KK0ZpbmFsbHksIGlmIENsYW5nIGlzIGluc3RydWN0ZWQgdG8gY29tcGlsZSBjb2RlIGZvciBNYWMgT1MgWCAxMC43LCB0aGUgY2FsbAorZmFpbHMgYmVjYXVzZSBgYGYoKWBgIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCisKK1RoZSBhdmFpbGFiaWxpdHkgYXR0cmlidXRlIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgc3RhcnRpbmcgd2l0aCB0aGUKK3BsYXRmb3JtIG5hbWUgYW5kIHRoZW4gaW5jbHVkaW5nIGNsYXVzZXMgc3BlY2lmeWluZyBpbXBvcnRhbnQgbWlsZXN0b25lcyBpbiB0aGUKK2RlY2xhcmF0aW9uJ3MgbGlmZXRpbWUgKGluIGFueSBvcmRlcikgYWxvbmcgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiAgVGhvc2UKK2NsYXVzZXMgY2FuIGJlOgorCitpbnRyb2R1Y2VkPVwgKnZlcnNpb24qCisgIFRoZSBmaXJzdCB2ZXJzaW9uIGluIHdoaWNoIHRoaXMgZGVjbGFyYXRpb24gd2FzIGludHJvZHVjZWQuCisKK2RlcHJlY2F0ZWQ9XCAqdmVyc2lvbioKKyAgVGhlIGZpcnN0IHZlcnNpb24gaW4gd2hpY2ggdGhpcyBkZWNsYXJhdGlvbiB3YXMgZGVwcmVjYXRlZCwgbWVhbmluZyB0aGF0CisgIHVzZXJzIHNob3VsZCBtaWdyYXRlIGF3YXkgZnJvbSB0aGlzIEFQSS4KKworb2Jzb2xldGVkPVwgKnZlcnNpb24qCisgIFRoZSBmaXJzdCB2ZXJzaW9uIGluIHdoaWNoIHRoaXMgZGVjbGFyYXRpb24gd2FzIG9ic29sZXRlZCwgbWVhbmluZyB0aGF0IGl0CisgIHdhcyByZW1vdmVkIGNvbXBsZXRlbHkgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZC4KKwordW5hdmFpbGFibGUKKyAgVGhpcyBkZWNsYXJhdGlvbiBpcyBuZXZlciBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybS4KKworbWVzc2FnZT1cICpzdHJpbmctbGl0ZXJhbCoKKyAgQWRkaXRpb25hbCBtZXNzYWdlIHRleHQgdGhhdCBDbGFuZyB3aWxsIHByb3ZpZGUgd2hlbiBlbWl0dGluZyBhIHdhcm5pbmcgb3IKKyAgZXJyb3IgYWJvdXQgdXNlIG9mIGEgZGVwcmVjYXRlZCBvciBvYnNvbGV0ZWQgZGVjbGFyYXRpb24uICBVc2VmdWwgdG8gZGlyZWN0CisgIHVzZXJzIHRvIHJlcGxhY2VtZW50IEFQSXMuCisKK011bHRpcGxlIGF2YWlsYWJpbGl0eSBhdHRyaWJ1dGVzIGNhbiBiZSBwbGFjZWQgb24gYSBkZWNsYXJhdGlvbiwgd2hpY2ggbWF5Citjb3JyZXNwb25kIHRvIGRpZmZlcmVudCBwbGF0Zm9ybXMuICBPbmx5IHRoZSBhdmFpbGFiaWxpdHkgYXR0cmlidXRlIHdpdGggdGhlCitwbGF0Zm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YXJnZXQgcGxhdGZvcm0gd2lsbCBiZSB1c2VkOyBhbnkgb3RoZXJzIHdpbGwgYmUKK2lnbm9yZWQuICBJZiBubyBhdmFpbGFiaWxpdHkgYXR0cmlidXRlIHNwZWNpZmllcyBhdmFpbGFiaWxpdHkgZm9yIHRoZSBjdXJyZW50Cit0YXJnZXQgcGxhdGZvcm0sIHRoZSBhdmFpbGFiaWxpdHkgYXR0cmlidXRlcyBhcmUgaWdub3JlZC4gIFN1cHBvcnRlZCBwbGF0Zm9ybXMKK2FyZToKKworYGBpb3NgYAorICBBcHBsZSdzIGlPUyBvcGVyYXRpbmcgc3lzdGVtLiAgVGhlIG1pbmltdW0gZGVwbG95bWVudCB0YXJnZXQgaXMgc3BlY2lmaWVkIGJ5CisgIHRoZSBgYC1taW9zLXZlcnNpb24tbWluPSp2ZXJzaW9uKmBgIG9yIGBgLW1pcGhvbmVvcy12ZXJzaW9uLW1pbj0qdmVyc2lvbipgYAorICBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorCitgYG1hY29zeGBgCisgIEFwcGxlJ3MgTWFjIE9TIFggb3BlcmF0aW5nIHN5c3RlbS4gIFRoZSBtaW5pbXVtIGRlcGxveW1lbnQgdGFyZ2V0IGlzCisgIHNwZWNpZmllZCBieSB0aGUgYGAtbW1hY29zeC12ZXJzaW9uLW1pbj0qdmVyc2lvbipgYCBjb21tYW5kLWxpbmUgYXJndW1lbnQuCisKK0EgZGVjbGFyYXRpb24gY2FuIGJlIHVzZWQgZXZlbiB3aGVuIGRlcGxveWluZyBiYWNrIHRvIGEgcGxhdGZvcm0gdmVyc2lvbiBwcmlvcgordG8gd2hlbiB0aGUgZGVjbGFyYXRpb24gd2FzIGludHJvZHVjZWQuICBXaGVuIHRoaXMgaGFwcGVucywgdGhlIGRlY2xhcmF0aW9uIGlzCitgd2Vha2x5IGxpbmtlZAorPGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L21hYy8jZG9jdW1lbnRhdGlvbi9NYWNPU1gvQ29uY2VwdHVhbC9CUEZyYW1ld29ya3MvQ29uY2VwdHMvV2Vha0xpbmtpbmcuaHRtbD5gXywKK2FzIGlmIHRoZSBgYHdlYWtfaW1wb3J0YGAgYXR0cmlidXRlIHdlcmUgYWRkZWQgdG8gdGhlIGRlY2xhcmF0aW9uLiAgQQord2Vha2x5LWxpbmtlZCBkZWNsYXJhdGlvbiBtYXkgb3IgbWF5IG5vdCBiZSBwcmVzZW50IGEgcnVuLXRpbWUsIGFuZCBhIHByb2dyYW0KK2NhbiBkZXRlcm1pbmUgd2hldGhlciB0aGUgZGVjbGFyYXRpb24gaXMgcHJlc2VudCBieSBjaGVja2luZyB3aGV0aGVyIHRoZQorYWRkcmVzcyBvZiB0aGF0IGRlY2xhcmF0aW9uIGlzIG5vbi1OVUxMLgorCitJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZGVjbGFyYXRpb25zIG9mIHRoZSBzYW1lIGVudGl0eSwgdGhlIGF2YWlsYWJpbGl0eQorYXR0cmlidXRlcyBtdXN0IGVpdGhlciBtYXRjaCBvbiBhIHBlci1wbGF0Zm9ybSBiYXNpcyBvciBsYXRlcgorZGVjbGFyYXRpb25zIG11c3Qgbm90IGhhdmUgYXZhaWxhYmlsaXR5IGF0dHJpYnV0ZXMgZm9yIHRoYXQKK3BsYXRmb3JtLiBGb3IgZXhhbXBsZToKKworLi4gY29kZS1ibG9jazo6IGMKKworICB2b2lkIGcodm9pZCkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjQpKSk7CisgIHZvaWQgZyh2b2lkKSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNCkpKTsgLy8gb2theSwgbWF0Y2hlcworICB2b2lkIGcodm9pZCkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTQuMCkpKTsgLy8gb2theSwgYWRkcyBhIG5ldyBwbGF0Zm9ybQorICB2b2lkIGcodm9pZCk7IC8vIG9rYXksIGluaGVyaXRzIGJvdGggbWFjb3N4IGFuZCBpb3MgYXZhaWxhYmlsaXR5IGZyb20gYWJvdmUuCisgIHZvaWQgZyh2b2lkKSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNSkpKTsgLy8gZXJyb3I6IG1pc21hdGNoCisKK1doZW4gb25lIG1ldGhvZCBvdmVycmlkZXMgYW5vdGhlciwgdGhlIG92ZXJyaWRpbmcgbWV0aG9kIGNhbiBiZSBtb3JlIHdpZGVseSBhdmFpbGFibGUgdGhhbiB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGUuZy4sOgorCisuLiBjb2RlLWJsb2NrOjogb2JqYworCisgIEBpbnRlcmZhY2UgQQorICAtIChpZCltZXRob2QgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjQpKSk7CisgIC0gKGlkKW1ldGhvZDIgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjQpKSk7CisgIEBlbmQKKworICBAaW50ZXJmYWNlIEIgOiBBCisgIC0gKGlkKW1ldGhvZCBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuMykpKTsgLy8gb2theTogbWV0aG9kIG1vdmVkIGludG8gYmFzZSBjbGFzcyBsYXRlcgorICAtIChpZCltZXRob2QgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjUpKSk7IC8vIGVycm9yOiB0aGlzIG1ldGhvZCB3YXMgYXZhaWxhYmxlIHZpYSB0aGUgYmFzZSBjbGFzcyBpbiAxMC40CisgIEBlbmQKKyAgfV07Cit9CisKK2RlZiBGYWxsdGhyb3VnaERvY3MgOiBEb2N1bWVudGF0aW9uIHsKKyAgbGV0IENhdGVnb3J5ID0gRG9jQ2F0U3RtdDsKKyAgbGV0IENvbnRlbnQgPSBbeworVGhlIGBgY2xhbmc6OmZhbGx0aHJvdWdoYGAgYXR0cmlidXRlIGlzIHVzZWQgYWxvbmcgd2l0aCB0aGUKK2BgLVdpbXBsaWNpdC1mYWxsdGhyb3VnaGBgIGFyZ3VtZW50IHRvIGFubm90YXRlIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaAorYmV0d2VlbiBzd2l0Y2ggbGFiZWxzLiAgSXQgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIG51bGwgc3RhdGVtZW50IHBsYWNlZCBhdCBhCitwb2ludCBvZiBleGVjdXRpb24gYmV0d2VlbiBhbnkgc3RhdGVtZW50IGFuZCB0aGUgbmV4dCBzd2l0Y2ggbGFiZWwuICBJdCBpcworY29tbW9uIHRvIG1hcmsgdGhlc2UgcGxhY2VzIHdpdGggYSBzcGVjaWZpYyBjb21tZW50LCBidXQgdGhpcyBhdHRyaWJ1dGUgaXMKK21lYW50IHRvIHJlcGxhY2UgY29tbWVudHMgd2l0aCBhIG1vcmUgc3RyaWN0IGFubm90YXRpb24sIHdoaWNoIGNhbiBiZSBjaGVja2VkCitieSB0aGUgY29tcGlsZXIuICBUaGlzIGF0dHJpYnV0ZSBkb2Vzbid0IGNoYW5nZSBzZW1hbnRpY3Mgb2YgdGhlIGNvZGUgYW5kIGNhbgorYmUgdXNlZCB3aGVyZXZlciBhbiBpbnRlbmRlZCBmYWxsLXRocm91Z2ggb2NjdXJzLiAgSXQgaXMgZGVzaWduZWQgdG8gbWltaWMKK2NvbnRyb2wtZmxvdyBzdGF0ZW1lbnRzIGxpa2UgYGBicmVhaztgYCwgc28gaXQgY2FuIGJlIHBsYWNlZCBpbiBtb3N0IHBsYWNlcword2hlcmUgYGBicmVhaztgYCBjYW4sIGJ1dCBvbmx5IGlmIHRoZXJlIGFyZSBubyBzdGF0ZW1lbnRzIG9uIHRoZSBleGVjdXRpb24gcGF0aAorYmV0d2VlbiBpdCBhbmQgdGhlIG5leHQgc3dpdGNoIGxhYmVsLgorCitIZXJlIGlzIGFuIGV4YW1wbGU6CisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICAvLyBjb21waWxlIHdpdGggLVdpbXBsaWNpdC1mYWxsdGhyb3VnaAorICBzd2l0Y2ggKG4pIHsKKyAgY2FzZSAyMjoKKyAgY2FzZSAzMzogIC8vIG5vIHdhcm5pbmc6IG5vIHN0YXRlbWVudHMgYmV0d2VlbiBjYXNlIGxhYmVscworICAgIGYoKTsKKyAgY2FzZSA0NDogIC8vIHdhcm5pbmc6IHVuYW5ub3RhdGVkIGZhbGwtdGhyb3VnaAorICAgIGcoKTsKKyAgICBbW2NsYW5nOjpmYWxsdGhyb3VnaF1dOworICBjYXNlIDU1OiAgLy8gbm8gd2FybmluZworICAgIGlmICh4KSB7CisgICAgICBoKCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpKCk7CisgICAgICBbW2NsYW5nOjpmYWxsdGhyb3VnaF1dOworICAgIH0KKyAgY2FzZSA2NjogIC8vIG5vIHdhcm5pbmcKKyAgICBwKCk7CisgICAgW1tjbGFuZzo6ZmFsbHRocm91Z2hdXTsgLy8gd2FybmluZzogZmFsbHRocm91Z2ggYW5ub3RhdGlvbiBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgIGRpcmVjdGx5IHByZWNlZGUgY2FzZSBsYWJlbAorICAgIHEoKTsKKyAgY2FzZSA3NzogIC8vIHdhcm5pbmc6IHVuYW5ub3RhdGVkIGZhbGwtdGhyb3VnaAorICAgIHIoKTsKKyAgfQorICB9XTsKK30KKworZGVmIEFSTUludGVycnVwdERvY3MgOiBEb2N1bWVudGF0aW9uIHsKKyAgbGV0IENhdGVnb3J5ID0gRG9jQ2F0RnVuY3Rpb247CisgIGxldCBDb250ZW50ID0gW3sKK0NsYW5nIHN1cHBvcnRzIHRoZSBHTlUgc3R5bGUgYGBfX2F0dHJpYnV0ZV9fKChpbnRlcnJ1cHQoIlRZUEUiKSkpYGAgYXR0cmlidXRlIG9uCitBUk0gdGFyZ2V0cy4gVGhpcyBhdHRyaWJ1dGUgbWF5IGJlIGF0dGFjaGVkIHRvIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBhbmQKK2luc3RydWN0cyB0aGUgYmFja2VuZCB0byBnZW5lcmF0ZSBhcHByb3ByaWF0ZSBmdW5jdGlvbiBlbnRyeS9leGl0IGNvZGUgc28gdGhhdAoraXQgY2FuIGJlIHVzZWQgZGlyZWN0bHkgYXMgYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKworVGhlIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGludGVycnVwdCBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwsIGJ1dCBpZgorcHJvdmlkZWQgaXQgbXVzdCBiZSBhIHN0cmluZyBsaXRlcmFsIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAiSVJRIiwKKyJGSVEiLCAiU1dJIiwgIkFCT1JUIiwgIlVOREVGIi4KKworVGhlIHNlbWFudGljcyBhcmUgYXMgZm9sbG93czoKKworLSBJZiB0aGUgZnVuY3Rpb24gaXMgQUFQQ1MsIENsYW5nIGluc3RydWN0cyB0aGUgYmFja2VuZCB0byByZWFsaWduIHRoZSBzdGFjayB0bworICA4IGJ5dGVzIG9uIGVudHJ5LiBUaGlzIGlzIGEgZ2VuZXJhbCByZXF1aXJlbWVudCBvZiB0aGUgQUFQQ1MgYXQgcHVibGljCisgIGludGVyZmFjZXMsIGJ1dCBtYXkgbm90IGhvbGQgd2hlbiBhbiBleGNlcHRpb24gaXMgdGFrZW4uIERvaW5nIHRoaXMgYWxsb3dzCisgIG90aGVyIEFBUENTIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQuCistIElmIHRoZSBDUFUgaXMgTS1jbGFzcyB0aGlzIGlzIGFsbCB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgc2luY2UgdGhlIGFyY2hpdGVjdHVyZQorICBpdHNlbGYgaXMgZGVzaWduZWQgaW4gc3VjaCBhIHdheSB0aGF0IGZ1bmN0aW9ucyBvYmV5aW5nIHRoZSBub3JtYWwgQUFQQ1MgQUJJCisgIGNvbnN0cmFpbnRzIGFyZSB2YWxpZCBleGNlcHRpb24gaGFuZGxlcnMuCistIElmIHRoZSBDUFUgaXMgbm90IE0tY2xhc3MsIHRoZSBwcm9sb2d1ZSBhbmQgZXBpbG9ndWUgYXJlIG1vZGlmaWVkIHRvIHNhdmUgYWxsCisgIG5vbi1iYW5rZWQgcmVnaXN0ZXJzIHRoYXQgYXJlIHVzZWQsIHNvIHRoYXQgdXBvbiByZXR1cm4gdGhlIHVzZXItbW9kZSBzdGF0ZQorICB3aWxsIG5vdCBiZSBjb3JydXB0ZWQuIE5vdGUgdGhhdCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBvdmVyaGVhZCwgb25seQorICBnZW5lcmFsLXB1cnBvc2UgKGludGVnZXIpIHJlZ2lzdGVycyBhcmUgc2F2ZWQgaW4gdGhpcyB3YXkuIElmIFZGUCBvcGVyYXRpb25zCisgIGFyZSBuZWVkZWQsIHRoYXQgc3RhdGUgbXVzdCBiZSBzYXZlZCBtYW51YWxseS4KKworICBTcGVjaWZpY2FsbHksIGludGVycnVwdCBraW5kcyBvdGhlciB0aGFuICJGSVEiIHdpbGwgc2F2ZSBhbGwgY29yZSByZWdpc3RlcnMKKyAgZXhjZXB0ICJsciIgYW5kICJzcCIuICJGSVEiIGludGVycnVwdHMgd2lsbCBzYXZlIHIwLXI3LgorLSBJZiB0aGUgQ1BVIGlzIG5vdCBNLWNsYXNzLCB0aGUgcmV0dXJuIGluc3RydWN0aW9uIGlzIGNoYW5nZWQgdG8gb25lIG9mIHRoZQorICBjYW5vbmljYWwgc2VxdWVuY2VzIHBlcm1pdHRlZCBieSB0aGUgYXJjaGl0ZWN0dXJlIGZvciBleGNlcHRpb24gcmV0dXJuLiBXaGVyZQorICBwb3NzaWJsZSB0aGUgZnVuY3Rpb24gaXRzZWxmIHdpbGwgbWFrZSB0aGUgbmVjZXNzYXJ5ICJsciIgYWRqdXN0bWVudHMgc28gdGhhdAorICB0aGUgInByZWZlcnJlZCByZXR1cm4gYWRkcmVzcyIgaXMgc2VsZWN0ZWQuCisKKyAgVW5mb3J0dW5hdGVseSB0aGUgY29tcGlsZXIgaXMgdW5hYmxlIHRvIG1ha2UgdGhpcyBndWFyYW50ZWUgZm9yIGFuICJVTkRFRiIKKyAgaGFuZGxlciwgd2hlcmUgdGhlIG9mZnNldCBmcm9tICJsciIgdG8gdGhlIHByZWZlcnJlZCByZXR1cm4gYWRkcmVzcyBkZXBlbmRzIG9uCisgIHRoZSBleGVjdXRpb24gc3RhdGUgb2YgdGhlIGNvZGUgd2hpY2ggZ2VuZXJhdGVkIHRoZSBleGNlcHRpb24uIEluIHRoaXMgY2FzZQorICBhIHNlcXVlbmNlIGVxdWl2YWxlbnQgdG8gIm1vdnMgcGMsIGxyIiB3aWxsIGJlIHVzZWQuCisgIH1dOworfQorCitkZWYgUGNzRG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgbGV0IENvbnRlbnQgPSBbeworT24gQVJNIHRhcmdldHMsIHRoaXMgY2FuIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzZWxlY3QgY2FsbGluZyBjb252ZW50aW9ucywKK3NpbWlsYXIgdG8gYGBzdGRjYWxsYGAgb24geDg2LiBWYWxpZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSAiYWFwY3MiIGFuZAorImFhcGNzLXZmcCIuCisgIH1dOworfQorCitkZWYgRG9jQ2F0Q29uc3VtZWQgOiBEb2N1bWVudGF0aW9uQ2F0ZWdvcnk8IkNvbnN1bWVkIEFubm90YXRpb24gQ2hlY2tpbmciPiB7CisgIGxldCBDb250ZW50ID0gW3sKK0NsYW5nIHN1cHBvcnRzIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBmb3IgY2hlY2tpbmcgYmFzaWMgcmVzb3VyY2UgbWFuYWdlbWVudAorcHJvcGVydGllcywgc3BlY2lmaWNhbGx5IGZvciB1bmlxdWUgb2JqZWN0cyB0aGF0IGhhdmUgYSBzaW5nbGUgb3duaW5nIHJlZmVyZW5jZS4KK1RoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCwgYWx0aG91Z2ggKip0aGUgaW1wbGVtZW50YXRpb24KK2ZvciB0aGVzZSBhbm5vdGF0aW9ucyBpcyBjdXJyZW50bHkgaW4gZGV2ZWxvcG1lbnQgYW5kIGFyZSBzdWJqZWN0IHRvIGNoYW5nZS4qKgorICB9XTsKK30KKworZGVmIFNldFR5cGVzdGF0ZURvY3MgOiBEb2N1bWVudGF0aW9uIHsKKyAgbGV0IENhdGVnb3J5ID0gRG9jQ2F0Q29uc3VtZWQ7CisgIGxldCBDb250ZW50ID0gW3sKK0Fubm90YXRlIG1ldGhvZHMgdGhhdCB0cmFuc2l0aW9uIGFuIG9iamVjdCBpbnRvIGEgbmV3IHN0YXRlIHdpdGgKK2BgX19hdHRyaWJ1dGVfXygoc2V0X3R5cGVzdGF0ZShuZXdfc3RhdGUpKSlgYC4gIFRoZSBuZXcgbmV3IHN0YXRlIG11c3QgYmUKK3VuY29uc3VtZWQsIGNvbnN1bWVkLCBvciB1bmtub3duLgorICB9XTsKK30KKworZGVmIENhbGxhYmxlV2hlbkRvY3MgOiBEb2N1bWVudGF0aW9uIHsKKyAgbGV0IENhdGVnb3J5ID0gRG9jQ2F0Q29uc3VtZWQ7CisgIGxldCBDb250ZW50ID0gW3sKK1VzZSBgYF9fYXR0cmlidXRlX18oKGNhbGxhYmxlX3doZW4oLi4uKSkpYGAgdG8gaW5kaWNhdGUgd2hhdCBzdGF0ZXMgYSBtZXRob2QKK21heSBiZSBjYWxsZWQgaW4uICBWYWxpZCBzdGF0ZXMgYXJlIHVuY29uc3VtZWQsIGNvbnN1bWVkLCBvciB1bmtub3duLiAgRWFjaAorYXJndW1lbnQgdG8gdGhpcyBhdHRyaWJ1dGUgbXVzdCBiZSBhIHF1b3RlZCBzdHJpbmcuICBFLmcuOgorCitgYF9fYXR0cmlidXRlX18oKGNhbGxhYmxlX3doZW4oInVuY29uc3VtZWQiLCAidW5rbm93biIpKSlgYAorICB9XTsKK30KKworZGVmIFRlc3RUeXBlc3RhdGVEb2NzIDogRG9jdW1lbnRhdGlvbiB7CisgIGxldCBDYXRlZ29yeSA9IERvY0NhdENvbnN1bWVkOworICBsZXQgQ29udGVudCA9IFt7CitVc2UgYGBfX2F0dHJpYnV0ZV9fKCh0ZXN0X3R5cGVzdGF0ZSh0ZXN0ZWRfc3RhdGUpKSlgYCB0byBpbmRpY2F0ZSB0aGF0IGEgbWV0aG9kCityZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyBpbiB0aGUgc3BlY2lmaWVkIHN0YXRlLi4KKyAgfV07Cit9CisKK2RlZiBQYXJhbVR5cGVzdGF0ZURvY3MgOiBEb2N1bWVudGF0aW9uIHsKKyAgbGV0IENhdGVnb3J5ID0gRG9jQ2F0Q29uc3VtZWQ7CisgIGxldCBDb250ZW50ID0gW3sKK1RoaXMgYXR0cmlidXRlIHNwZWNpZmllcyBleHBlY3RhdGlvbnMgYWJvdXQgZnVuY3Rpb24gcGFyYW1ldGVycy4gIENhbGxzIHRvIGFuCitmdW5jdGlvbiB3aXRoIGFubm90YXRlZCBwYXJhbWV0ZXJzIHdpbGwgaXNzdWUgYSB3YXJuaW5nIGlmIHRoZSBjb3JyZXNwb25kaW5nCithcmd1bWVudCBpc24ndCBpbiB0aGUgZXhwZWN0ZWQgc3RhdGUuICBUaGUgYXR0cmlidXRlIGlzIGFsc28gdXNlZCB0byBzZXQgdGhlCitpbml0aWFsIHN0YXRlIG9mIHRoZSBwYXJhbWV0ZXIgd2hlbiBhbmFseXppbmcgdGhlIGZ1bmN0aW9uJ3MgYm9keS4KKyAgfV07Cit9CisKK2RlZiBSZXR1cm5UeXBlc3RhdGVEb2NzIDogRG9jdW1lbnRhdGlvbiB7CisgIGxldCBDYXRlZ29yeSA9IERvY0NhdENvbnN1bWVkOworICBsZXQgQ29udGVudCA9IFt7CitUaGUgYGByZXR1cm5fdHlwZXN0YXRlYGAgYXR0cmlidXRlIGNhbiBiZSBhcHBsaWVkIHRvIGZ1bmN0aW9ucyBvciBwYXJhbWV0ZXJzLgorV2hlbiBhcHBsaWVkIHRvIGEgZnVuY3Rpb24gdGhlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHN0YXRlIG9mIHRoZSByZXR1cm5lZAordmFsdWUuICBUaGUgZnVuY3Rpb24ncyBib2R5IGlzIGNoZWNrZWQgdG8gZW5zdXJlIHRoYXQgaXQgYWx3YXlzIHJldHVybnMgYSB2YWx1ZQoraW4gdGhlIHNwZWNpZmllZCBzdGF0ZS4gIE9uIHRoZSBjYWxsZXIgc2lkZSwgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBhbm5vdGF0ZWQKK2Z1bmN0aW9uIGFyZSBpbml0aWFsaXplZCB0byB0aGUgZ2l2ZW4gc3RhdGUuCisKK1doZW4gYXBwbGllZCB0byBhIGZ1bmN0aW9uIHBhcmFtZXRlciBpdCBtb2RpZmllcyB0aGUgc3RhdGUgb2YgYW4gYXJndW1lbnQgYWZ0ZXIKK2EgY2FsbCB0byB0aGUgZnVuY3Rpb24gcmV0dXJucy4gIFRoZSBmdW5jdGlvbidzIGJvZHkgaXMgY2hlY2tlZCB0byBlbnN1cmUgdGhhdAordGhlIHBhcmFtZXRlciBpcyBpbiB0aGUgZXhwZWN0ZWQgc3RhdGUgYmVmb3JlIHJldHVybmluZy4KKyAgfV07Cit9CisKK2RlZiBDb25zdW1hYmxlRG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRDb25zdW1lZDsKKyAgbGV0IENvbnRlbnQgPSBbeworRWFjaCBgYGNsYXNzYGAgdGhhdCB1c2VzIGFueSBvZiB0aGUgdHlwZXN0YXRlIGFubm90YXRpb25zIG11c3QgZmlyc3QgYmUgbWFya2VkCit1c2luZyB0aGUgYGBjb25zdW1hYmxlYGAgYXR0cmlidXRlLiAgRmFpbHVyZSB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcuCisKK1RoaXMgYXR0cmlidXRlIGFjY2VwdHMgYSBzaW5nbGUgcGFyYW1ldGVyIHRoYXQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKK2BgdW5rbm93bmBgLCBgYGNvbnN1bWVkYGAsIG9yIGBgdW5jb25zdW1lZGBgLgorICB9XTsKK30KKworZGVmIE5vU2FuaXRpemVBZGRyZXNzRG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgLy8gVGhpcyBmdW5jdGlvbiBoYXMgbXVsdGlwbGUgZGlzdGluY3Qgc3BlbGxpbmdzLCBhbmQgc28gaXQgcmVxdWlyZXMgYSBjdXN0b20KKyAgLy8gaGVhZGluZyB0byBiZSBzcGVjaWZpZWQuIFRoZSBtb3N0IGNvbW1vbiBzcGVsbGluZyBpcyBzdWZmaWNpZW50LgorICBsZXQgSGVhZGluZyA9ICJub19zYW5pdGl6ZV9hZGRyZXNzIChub19hZGRyZXNzX3NhZmV0eV9hbmFseXNpcywgZ251Ojpub19hZGRyZXNzX3NhZmV0eV9hbmFseXNpcywgZ251Ojpub19zYW5pdGl6ZV9hZGRyZXNzKSI7CisgIGxldCBDb250ZW50ID0gW3sKKy4uIF9sYW5nZXh0LWFkZHJlc3Nfc2FuaXRpemVyOgorCitVc2UgYGBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZV9hZGRyZXNzKSlgYCBvbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHRvCitzcGVjaWZ5IHRoYXQgYWRkcmVzcyBzYWZldHkgaW5zdHJ1bWVudGF0aW9uIChlLmcuIEFkZHJlc3NTYW5pdGl6ZXIpIHNob3VsZAorbm90IGJlIGFwcGxpZWQgdG8gdGhhdCBmdW5jdGlvbi4KKyAgfV07Cit9CisKK2RlZiBOb1Nhbml0aXplVGhyZWFkRG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgbGV0IENvbnRlbnQgPSBbeworLi4gX2xhbmdleHQtdGhyZWFkX3Nhbml0aXplcjoKKworVXNlIGBgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemVfdGhyZWFkKSlgYCBvbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHRvCitzcGVjaWZ5IHRoYXQgY2hlY2tzIGZvciBkYXRhIHJhY2VzIG9uIHBsYWluIChub24tYXRvbWljKSBtZW1vcnkgYWNjZXNzZXMgc2hvdWxkCitub3QgYmUgaW5zZXJ0ZWQgYnkgVGhyZWFkU2FuaXRpemVyLiBUaGUgZnVuY3Rpb24gaXMgc3RpbGwgaW5zdHJ1bWVudGVkIGJ5IHRoZQordG9vbCB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMgYW5kIHByb3ZpZGUgbWVhbmluZ2Z1bCBzdGFjayB0cmFjZXMuCisgIH1dOworfQorCitkZWYgTm9TYW5pdGl6ZU1lbW9yeURvY3MgOiBEb2N1bWVudGF0aW9uIHsKKyAgbGV0IENhdGVnb3J5ID0gRG9jQ2F0RnVuY3Rpb247CisgIGxldCBDb250ZW50ID0gW3sKKy4uIF9sYW5nZXh0LW1lbW9yeV9zYW5pdGl6ZXI6CisKK1VzZSBgYF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplX21lbW9yeSkpYGAgb24gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0bworc3BlY2lmeSB0aGF0IGNoZWNrcyBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgc2hvdWxkIG5vdCBiZSBpbnNlcnRlZCAKKyhlLmcuIGJ5IE1lbW9yeVNhbml0aXplcikuIFRoZSBmdW5jdGlvbiBtYXkgc3RpbGwgYmUgaW5zdHJ1bWVudGVkIGJ5IHRoZSB0b29sCit0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMgaW4gb3RoZXIgcGxhY2VzLgorICB9XTsKK30KKworZGVmIERvY0NhdFR5cGVTYWZldHkgOiBEb2N1bWVudGF0aW9uQ2F0ZWdvcnk8IlR5cGUgU2FmZXR5IENoZWNraW5nIj4geworICBsZXQgQ29udGVudCA9IFt7CitDbGFuZyBzdXBwb3J0cyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8gZW5hYmxlIGNoZWNraW5nIHR5cGUgc2FmZXR5IHByb3BlcnRpZXMKK3RoYXQgY2FuJ3QgYmUgZW5mb3JjZWQgYnkgdGhlIEMgdHlwZSBzeXN0ZW0uICBVc2UgY2FzZXMgaW5jbHVkZToKKworKiBNUEkgbGlicmFyeSBpbXBsZW1lbnRhdGlvbnMsIHdoZXJlIHRoZXNlIGF0dHJpYnV0ZXMgZW5hYmxlIGNoZWNraW5nIHRoYXQKKyAgdGhlIGJ1ZmZlciB0eXBlIG1hdGNoZXMgdGhlIHBhc3NlZCBgYE1QSV9EYXRhdHlwZWBgOworKiBmb3IgSERGNSBsaWJyYXJ5IHRoZXJlIGlzIGEgc2ltaWxhciB1c2UgY2FzZSB0byBNUEk7CisqIGNoZWNraW5nIHR5cGVzIG9mIHZhcmlhZGljIGZ1bmN0aW9ucycgYXJndW1lbnRzIGZvciBmdW5jdGlvbnMgbGlrZQorICBgYGZjbnRsKClgYCBhbmQgYGBpb2N0bCgpYGAuCisKK1lvdSBjYW4gZGV0ZWN0IHN1cHBvcnQgZm9yIHRoZXNlIGF0dHJpYnV0ZXMgd2l0aCBgYF9faGFzX2F0dHJpYnV0ZSgpYGAuICBGb3IKK2V4YW1wbGU6CisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICAjaWYgZGVmaW5lZChfX2hhc19hdHRyaWJ1dGUpCisgICMgIGlmIF9faGFzX2F0dHJpYnV0ZShhcmd1bWVudF93aXRoX3R5cGVfdGFnKSAmJiBcCisgICAgICAgIF9faGFzX2F0dHJpYnV0ZShwb2ludGVyX3dpdGhfdHlwZV90YWcpICYmIFwKKyAgICAgICAgX19oYXNfYXR0cmlidXRlKHR5cGVfdGFnX2Zvcl9kYXRhdHlwZSkKKyAgIyAgICBkZWZpbmUgQVRUUl9NUElfUFdUKGJ1ZmZlcl9pZHgsIHR5cGVfaWR4KSBfX2F0dHJpYnV0ZV9fKChwb2ludGVyX3dpdGhfdHlwZV90YWcobXBpLGJ1ZmZlcl9pZHgsdHlwZV9pZHgpKSkKKyAgLyogLi4uIG90aGVyIG1hY3JvcyAuLi4gICovCisgICMgIGVuZGlmCisgICNlbmRpZgorCisgICNpZiAhZGVmaW5lZChBVFRSX01QSV9QV1QpCisgICMgZGVmaW5lIEFUVFJfTVBJX1BXVChidWZmZXJfaWR4LCB0eXBlX2lkeCkKKyAgI2VuZGlmCisKKyAgaW50IE1QSV9TZW5kKHZvaWQgKmJ1ZiwgaW50IGNvdW50LCBNUElfRGF0YXR5cGUgZGF0YXR5cGUgLyosIG90aGVyIGFyZ3Mgb21pdHRlZCAqLykKKyAgICAgIEFUVFJfTVBJX1BXVCgxLDMpOworICB9XTsKK30KKworZGVmIEFyZ3VtZW50V2l0aFR5cGVUYWdEb2NzIDogRG9jdW1lbnRhdGlvbiB7CisgIGxldCBDYXRlZ29yeSA9IERvY0NhdFR5cGVTYWZldHk7CisgIGxldCBIZWFkaW5nID0gImFyZ3VtZW50X3dpdGhfdHlwZV90YWciOworICBsZXQgQ29udGVudCA9IFt7CitVc2UgYGBfX2F0dHJpYnV0ZV9fKChhcmd1bWVudF93aXRoX3R5cGVfdGFnKGFyZ19raW5kLCBhcmdfaWR4LAordHlwZV90YWdfaWR4KSkpYGAgb24gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0byBzcGVjaWZ5IHRoYXQgdGhlIGZ1bmN0aW9uCithY2NlcHRzIGEgdHlwZSB0YWcgdGhhdCBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIHNvbWUgb3RoZXIgYXJndW1lbnQuCitgYGFyZ19raW5kYGAgaXMgYW4gaWRlbnRpZmllciB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gYW5ub3RhdGluZyBhbGwKK2FwcGxpY2FibGUgdHlwZSB0YWdzLgorCitUaGlzIGF0dHJpYnV0ZSBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBjaGVja2luZyBhcmd1bWVudHMgb2YgdmFyaWFkaWMgZnVuY3Rpb25zCisoYGBwb2ludGVyX3dpdGhfdHlwZV90YWdgYCBjYW4gYmUgdXNlZCBpbiBtb3N0IG5vbi12YXJpYWRpYyBjYXNlcykuCisKK0ZvciBleGFtcGxlOgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgaW50IGZjbnRsKGludCBmZCwgaW50IGNtZCwgLi4uKQorICAgICAgX19hdHRyaWJ1dGVfXygoIGFyZ3VtZW50X3dpdGhfdHlwZV90YWcoZmNudGwsMywyKSApKTsKKyAgfV07Cit9CisKK2RlZiBQb2ludGVyV2l0aFR5cGVUYWdEb2NzIDogRG9jdW1lbnRhdGlvbiB7CisgIGxldCBDYXRlZ29yeSA9IERvY0NhdFR5cGVTYWZldHk7CisgIGxldCBIZWFkaW5nID0gInBvaW50ZXJfd2l0aF90eXBlX3RhZyI7CisgIGxldCBDb250ZW50ID0gW3sKK1VzZSBgYF9fYXR0cmlidXRlX18oKHBvaW50ZXJfd2l0aF90eXBlX3RhZyhwdHJfa2luZCwgcHRyX2lkeCwgdHlwZV90YWdfaWR4KSkpYGAKK29uIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gdG8gc3BlY2lmeSB0aGF0IHRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgdHlwZSB0YWcgdGhhdAorZGV0ZXJtaW5lcyB0aGUgcG9pbnRlZSB0eXBlIG9mIHNvbWUgb3RoZXIgcG9pbnRlciBhcmd1bWVudC4KKworRm9yIGV4YW1wbGU6CisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICBpbnQgTVBJX1NlbmQodm9pZCAqYnVmLCBpbnQgY291bnQsIE1QSV9EYXRhdHlwZSBkYXRhdHlwZSAvKiwgb3RoZXIgYXJncyBvbWl0dGVkICovKQorICAgICAgX19hdHRyaWJ1dGVfXygoIHBvaW50ZXJfd2l0aF90eXBlX3RhZyhtcGksMSwzKSApKTsKKyAgfV07Cit9CisKK2RlZiBUeXBlVGFnRm9yRGF0YXR5cGVEb2NzIDogRG9jdW1lbnRhdGlvbiB7CisgIGxldCBDYXRlZ29yeSA9IERvY0NhdFR5cGVTYWZldHk7CisgIGxldCBDb250ZW50ID0gW3sKK0NsYW5nIHN1cHBvcnRzIGFubm90YXRpbmcgdHlwZSB0YWdzIG9mIHR3byBmb3Jtcy4KKworKiAqKlR5cGUgdGFnIHRoYXQgaXMgYW4gZXhwcmVzc2lvbiBjb250YWluaW5nIGEgcmVmZXJlbmNlIHRvIHNvbWUgZGVjbGFyZWQKKyAgaWRlbnRpZmllci4qKiBVc2UgYGBfX2F0dHJpYnV0ZV9fKCh0eXBlX3RhZ19mb3JfZGF0YXR5cGUoa2luZCwgdHlwZSkpKWBgIG9uIGEKKyAgZGVjbGFyYXRpb24gd2l0aCB0aGF0IGlkZW50aWZpZXI6CisKKyAgLi4gY29kZS1ibG9jazo6IGMrKworCisgICAgZXh0ZXJuIHN0cnVjdCBtcGlfZGF0YXR5cGUgbXBpX2RhdGF0eXBlX2ludAorICAgICAgICBfX2F0dHJpYnV0ZV9fKCggdHlwZV90YWdfZm9yX2RhdGF0eXBlKG1waSxpbnQpICkpOworICAgICNkZWZpbmUgTVBJX0lOVCAoKE1QSV9EYXRhdHlwZSkgJm1waV9kYXRhdHlwZV9pbnQpCisKKyogKipUeXBlIHRhZyB0aGF0IGlzIGFuIGludGVncmFsIGxpdGVyYWwuKiogSW50cm9kdWNlIGEgYGBzdGF0aWMgY29uc3RgYAorICB2YXJpYWJsZSB3aXRoIGEgY29ycmVzcG9uZGluZyBpbml0aWFsaXplciB2YWx1ZSBhbmQgYXR0YWNoCisgIGBgX19hdHRyaWJ1dGVfXygodHlwZV90YWdfZm9yX2RhdGF0eXBlKGtpbmQsIHR5cGUpKSlgYCBvbiB0aGF0IGRlY2xhcmF0aW9uLAorICBmb3IgZXhhbXBsZToKKworICAuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgICAjZGVmaW5lIE1QSV9JTlQgKChNUElfRGF0YXR5cGUpIDQyKQorICAgIHN0YXRpYyBjb25zdCBNUElfRGF0YXR5cGUgbXBpX2RhdGF0eXBlX2ludAorICAgICAgICBfX2F0dHJpYnV0ZV9fKCggdHlwZV90YWdfZm9yX2RhdGF0eXBlKG1waSxpbnQpICkpID0gNDIKKworVGhlIGF0dHJpYnV0ZSBhbHNvIGFjY2VwdHMgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUKK2V4cHJlc3Npb24gaXMgY29tcGFyZWQgdG8gdGhlIHR5cGUgdGFnLiAgVGhlcmUgYXJlIHR3byBzdXBwb3J0ZWQgZmxhZ3M6CisKKyogYGBsYXlvdXRfY29tcGF0aWJsZWBgIHdpbGwgY2F1c2UgdHlwZXMgdG8gYmUgY29tcGFyZWQgYWNjb3JkaW5nIHRvCisgIGxheW91dC1jb21wYXRpYmlsaXR5IHJ1bGVzIChDKysxMSBbY2xhc3MubWVtXSBwIDE3LCAxOCkuICBUaGlzIGlzCisgIGltcGxlbWVudGVkIHRvIHN1cHBvcnQgYW5ub3RhdGluZyB0eXBlcyBsaWtlIGBgTVBJX0RPVUJMRV9JTlRgYC4KKworICBGb3IgZXhhbXBsZToKKworICAuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgICAvKiBJbiBtcGkuaCAqLworICAgIHN0cnVjdCBpbnRlcm5hbF9tcGlfZG91YmxlX2ludCB7IGRvdWJsZSBkOyBpbnQgaTsgfTsKKyAgICBleHRlcm4gc3RydWN0IG1waV9kYXRhdHlwZSBtcGlfZGF0YXR5cGVfZG91YmxlX2ludAorICAgICAgICBfX2F0dHJpYnV0ZV9fKCggdHlwZV90YWdfZm9yX2RhdGF0eXBlKG1waSwgc3RydWN0IGludGVybmFsX21waV9kb3VibGVfaW50LCBsYXlvdXRfY29tcGF0aWJsZSkgKSk7CisKKyAgICAjZGVmaW5lIE1QSV9ET1VCTEVfSU5UICgoTVBJX0RhdGF0eXBlKSAmbXBpX2RhdGF0eXBlX2RvdWJsZV9pbnQpCisKKyAgICAvKiBJbiB1c2VyIGNvZGUgKi8KKyAgICBzdHJ1Y3QgbXlfcGFpciB7IGRvdWJsZSBhOyBpbnQgYjsgfTsKKyAgICBzdHJ1Y3QgbXlfcGFpciAqYnVmZmVyOworICAgIE1QSV9TZW5kKGJ1ZmZlciwgMSwgTVBJX0RPVUJMRV9JTlQgLyosIC4uLiAgKi8pOyAvLyBubyB3YXJuaW5nCisKKyAgICBzdHJ1Y3QgbXlfaW50X3BhaXIgeyBpbnQgYTsgaW50IGI7IH0KKyAgICBzdHJ1Y3QgbXlfaW50X3BhaXIgKmJ1ZmZlcjI7CisgICAgTVBJX1NlbmQoYnVmZmVyMiwgMSwgTVBJX0RPVUJMRV9JTlQgLyosIC4uLiAgKi8pOyAvLyB3YXJuaW5nOiBhY3R1YWwgYnVmZmVyIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgJ3N0cnVjdCBteV9pbnRfcGFpcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0Y2ggc3BlY2lmaWVkIE1QSV9EYXRhdHlwZQorCisqIGBgbXVzdF9iZV9udWxsYGAgc3BlY2lmaWVzIHRoYXQgdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIGEgbnVsbCBwb2ludGVyCisgIGNvbnN0YW50LCBmb3IgZXhhbXBsZToKKworICAuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgICAvKiBJbiBtcGkuaCAqLworICAgIGV4dGVybiBzdHJ1Y3QgbXBpX2RhdGF0eXBlIG1waV9kYXRhdHlwZV9udWxsCisgICAgICAgIF9fYXR0cmlidXRlX18oKCB0eXBlX3RhZ19mb3JfZGF0YXR5cGUobXBpLCB2b2lkLCBtdXN0X2JlX251bGwpICkpOworCisgICAgI2RlZmluZSBNUElfREFUQVRZUEVfTlVMTCAoKE1QSV9EYXRhdHlwZSkgJm1waV9kYXRhdHlwZV9udWxsKQorCisgICAgLyogSW4gdXNlciBjb2RlICovCisgICAgTVBJX1NlbmQoYnVmZmVyLCAxLCBNUElfREFUQVRZUEVfTlVMTCAvKiwgLi4uICAqLyk7IC8vIHdhcm5pbmc6IE1QSV9EQVRBVFlQRV9OVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBzcGVjaWZpZWQgYnV0IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgYSBudWxsIHBvaW50ZXIKKyAgfV07Cit9CisKK2RlZiBGb3JtYXREb2NzIDogRG9jdW1lbnRhdGlvbiB7CisgIGxldCBDYXRlZ29yeSA9IERvY0NhdEZ1bmN0aW9uOworICBsZXQgQ29udGVudCA9IFt7CisKK0NsYW5nIHN1cHBvcnRzIHRoZSBgYGZvcm1hdGBgIGF0dHJpYnV0ZSwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGZ1bmN0aW9uCithY2NlcHRzIGEgYGBwcmludGZgYCBvciBgYHNjYW5mYGAtbGlrZSBmb3JtYXQgc3RyaW5nIGFuZCBjb3JyZXNwb25kaW5nCithcmd1bWVudHMgb3IgYSBgYHZhX2xpc3RgYCB0aGF0IGNvbnRhaW5zIHRoZXNlIGFyZ3VtZW50cy4KKworUGxlYXNlIHNlZSBgR0NDIGRvY3VtZW50YXRpb24gYWJvdXQgZm9ybWF0IGF0dHJpYnV0ZQorPGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy9GdW5jdGlvbi1BdHRyaWJ1dGVzLmh0bWw+YF8gdG8gZmluZCBkZXRhaWxzCithYm91dCBhdHRyaWJ1dGUgc3ludGF4LgorCitDbGFuZyBpbXBsZW1lbnRzIHR3byBraW5kcyBvZiBjaGVja3Mgd2l0aCB0aGlzIGF0dHJpYnV0ZS4KKworIy4gQ2xhbmcgY2hlY2tzIHRoYXQgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGBgZm9ybWF0YGAgYXR0cmlidXRlIGlzIGNhbGxlZCB3aXRoCisgICBhIGZvcm1hdCBzdHJpbmcgdGhhdCB1c2VzIGZvcm1hdCBzcGVjaWZpZXJzIHRoYXQgYXJlIGFsbG93ZWQsIGFuZCB0aGF0CisgICBhcmd1bWVudHMgbWF0Y2ggdGhlIGZvcm1hdCBzdHJpbmcuICBUaGlzIGlzIHRoZSBgYC1XZm9ybWF0YGAgd2FybmluZywgaXQgaXMKKyAgIG9uIGJ5IGRlZmF1bHQuCisKKyMuIENsYW5nIGNoZWNrcyB0aGF0IHRoZSBmb3JtYXQgc3RyaW5nIGFyZ3VtZW50IGlzIGEgbGl0ZXJhbCBzdHJpbmcuICBUaGlzIGlzCisgICB0aGUgYGAtV2Zvcm1hdC1ub25saXRlcmFsYGAgd2FybmluZywgaXQgaXMgb2ZmIGJ5IGRlZmF1bHQuCisKKyAgIENsYW5nIGltcGxlbWVudHMgdGhpcyBtb3N0bHkgdGhlIHNhbWUgd2F5IGFzIEdDQywgYnV0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZQorICAgZm9yIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBhIGBgdmFfbGlzdGBgIGFyZ3VtZW50IChmb3IgZXhhbXBsZSwgYGB2cHJpbnRmYGApLgorICAgR0NDIGRvZXMgbm90IGVtaXQgYGAtV2Zvcm1hdC1ub25saXRlcmFsYGAgd2FybmluZyBmb3IgY2FsbHMgdG8gc3VjaAorICAgZnVjdGlvbnMuICBDbGFuZyBkb2VzIG5vdCB3YXJuIGlmIHRoZSBmb3JtYXQgc3RyaW5nIGNvbWVzIGZyb20gYSBmdW5jdGlvbgorICAgcGFyYW1ldGVyLCB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgYW5ub3RhdGVkIHdpdGggYSBjb21wYXRpYmxlIGF0dHJpYnV0ZSwKKyAgIG90aGVyd2lzZSBpdCB3YXJucy4gIEZvciBleGFtcGxlOgorCisgICAuLiBjb2RlLWJsb2NrOjogYworCisgICAgIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18gKF9fc2NhbmZfXywgMSwgMykpKQorICAgICB2b2lkIGZvbyhjb25zdCBjaGFyKiBzLCBjaGFyICpidWYsIC4uLikgeworICAgICAgIHZhX2xpc3QgYXA7CisgICAgICAgdmFfc3RhcnQoYXAsIGJ1Zik7CisKKyAgICAgICB2cHJpbnRmKHMsIGFwKTsgLy8gd2FybmluZzogZm9ybWF0IHN0cmluZyBpcyBub3QgYSBzdHJpbmcgbGl0ZXJhbAorICAgICB9CisKKyAgIEluIHRoaXMgY2FzZSB3ZSB3YXJuIGJlY2F1c2UgYGBzYGAgY29udGFpbnMgYSBmb3JtYXQgc3RyaW5nIGZvciBhCisgICBgYHNjYW5mYGAtbGlrZSBmdW5jdGlvbiwgYnV0IGl0IGlzIHBhc3NlZCB0byBhIGBgcHJpbnRmYGAtbGlrZSBmdW5jdGlvbi4KKworICAgSWYgdGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkLCBjbGFuZyBzdGlsbCB3YXJucywgYmVjYXVzZSB0aGUgZm9ybWF0IHN0cmluZyBpcworICAgbm90IGEgc3RyaW5nIGxpdGVyYWwuCisKKyAgIEFub3RoZXIgZXhhbXBsZToKKworICAgLi4gY29kZS1ibG9jazo6IGMKKworICAgICBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAxLCAzKSkpCisgICAgIHZvaWQgZm9vKGNvbnN0IGNoYXIqIHMsIGNoYXIgKmJ1ZiwgLi4uKSB7CisgICAgICAgdmFfbGlzdCBhcDsKKyAgICAgICB2YV9zdGFydChhcCwgYnVmKTsKKworICAgICAgIHZwcmludGYocywgYXApOyAvLyB3YXJuaW5nCisgICAgIH0KKworICAgSW4gdGhpcyBjYXNlIENsYW5nIGRvZXMgbm90IHdhcm4gYmVjYXVzZSB0aGUgZm9ybWF0IHN0cmluZyBgYHNgYCBhbmQKKyAgIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50cyBhcmUgYW5ub3RhdGVkLiAgSWYgdGhlIGFyZ3VtZW50cyBhcmUKKyAgIGluY29ycmVjdCwgdGhlIGNhbGxlciBvZiBgYGZvb2BgIHdpbGwgcmVjZWl2ZSBhIHdhcm5pbmcuCisgIH1dOworfQorCitkZWYgTVNJbmhlcml0YW5jZURvY3MgOiBEb2N1bWVudGF0aW9uIHsKKyAgbGV0IENhdGVnb3J5ID0gRG9jQ2F0VHlwZTsKKyAgbGV0IEhlYWRpbmcgPSAiX19zaW5nbGVfaW5oZXJ0aWFuY2UsIF9fbXVsdGlwbGVfaW5oZXJpdGFuY2UsIF9fdmlydHVhbF9pbmhlcml0YW5jZSI7CisgIGxldCBDb250ZW50ID0gW3sKK1RoaXMgY29sbGVjdGlvbiBvZiBrZXl3b3JkcyBpcyBlbmFibGVkIHVuZGVyIGBgLWZtcy1leHRlbnNpb25zYGAgYW5kIGNvbnRyb2xzCit0aGUgcG9pbnRlci10by1tZW1iZXIgcmVwcmVzZW50YXRpb24gdXNlZCBvbiBgYCotKi13aW4zMmBgIHRhcmdldHMuCisKK1RoZSBgYCotKi13aW4zMmBgIHRhcmdldHMgdXRpbGl6ZSBhIHBvaW50ZXItdG8tbWVtYmVyIHJlcHJlc2VudGF0aW9uIHdoaWNoCit2YXJpZXMgaW4gc2l6ZSBhbmQgYWxpZ25tZW50IGRlcGVuZGluZyBvbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgdW5kZXJseWluZworY2xhc3MuCisKK0hvd2V2ZXIsIHRoaXMgaXMgcHJvYmxlbWF0aWMgd2hlbiBhIGZvcndhcmQgZGVjbGFyYXRpb24gaXMgb25seSBhdmFpbGFibGUgYW5kCitubyBkZWZpbml0aW9uIGhhcyBiZWVuIG1hZGUgeWV0LiAgSW4gc3VjaCBjYXNlcywgQ2xhbmcgaXMgZm9yY2VkIHRvIHV0aWxpemUgdGhlCittb3N0IGdlbmVyYWwgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBhdmFpbGFibGUgdG8gaXQuCisKK1RoZXNlIGtleXdvcmRzIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIGEgcG9pbnRlci10by1tZW1iZXIgcmVwcmVzZW50YXRpb24gb3RoZXIKK3RoYW4gdGhlIG1vc3QgZ2VuZXJhbCBvbmUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgZGVmaW5pdGlvbiB3aWxsIGV2ZXIKK2JlIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4KKworVGhpcyBmYW1pbHkgb2Yga2V5d29yZHMgYmVsb25nIGJldHdlZW4gdGhlIGBgY2xhc3Mta2V5YGAgYW5kIGBgY2xhc3MtbmFtZWBgOgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgc3RydWN0IF9fc2luZ2xlX2luaGVyaXRhbmNlIFM7CisgIGludCBTOjoqaTsKKyAgc3RydWN0IFMge307CisKK1RoaXMga2V5d29yZCBjYW4gYmUgYXBwbGllZCB0byBjbGFzcyB0ZW1wbGF0ZXMgYnV0IG9ubHkgaGFzIGFuIGVmZmVjdCB3aGVuIHVzZWQKK29uIGZ1bGwgc3BlY2lhbGl6YXRpb25zOgorCisuLiBjb2RlLWJsb2NrOjogYysrCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHN0cnVjdCBfX3NpbmdsZV9pbmhlcml0YW5jZSBBOyAvLyB3YXJuaW5nOiBpbmhlcml0YW5jZSBtb2RlbCBpZ25vcmVkIG9uIHByaW1hcnkgdGVtcGxhdGUKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBfX211bHRpcGxlX2luaGVyaXRhbmNlIEE8VCwgVD47IC8vIHdhcm5pbmc6IGluaGVyaXRhbmNlIG1vZGVsIGlnbm9yZWQgb24gcGFydGlhbCBzcGVjaWFsaXphdGlvbgorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgX19zaW5nbGVfaW5oZXJpdGFuY2UgQTxpbnQsIGZsb2F0PjsKKworTm90ZSB0aGF0IGNob29zaW5nIGFuIGluaGVyaXRhbmNlIG1vZGVsIGxlc3MgZ2VuZXJhbCB0aGFuIHN0cmljdGx5IG5lY2Vzc2FyeSBpcworYW4gZXJyb3I6CisKKy4uIGNvZGUtYmxvY2s6OiBjKysKKworICBzdHJ1Y3QgX19tdWx0aXBsZV9pbmhlcml0YW5jZSBTOyAvLyBlcnJvcjogaW5oZXJpdGFuY2UgbW9kZWwgZG9lcyBub3QgbWF0Y2ggZGVmaW5pdGlvbgorICBpbnQgUzo6Kmk7CisgIHN0cnVjdCBTIHt9OworfV07Cit9CisKK2RlZiBPcHRub25lRG9jcyA6IERvY3VtZW50YXRpb24geworICBsZXQgQ2F0ZWdvcnkgPSBEb2NDYXRGdW5jdGlvbjsKKyAgbGV0IENvbnRlbnQgPSBbeworVGhlIGBgb3B0bm9uZWBgIGF0dHJpYnV0ZSBzdXBwcmVzc2VzIGVzc2VudGlhbGx5IGFsbCBvcHRpbWl6YXRpb25zCitvbiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCwgcmVnYXJkbGVzcyBvZiB0aGUgb3B0aW1pemF0aW9uIGxldmVsIGFwcGxpZWQgdG8KK3RoZSBjb21waWxhdGlvbiB1bml0IGFzIGEgd2hvbGUuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiB5b3UKK25lZWQgdG8gZGVidWcgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLCBidXQgaXQgaXMgaW5mZWFzaWJsZSB0byBidWlsZCB0aGUKK2VudGlyZSBhcHBsaWNhdGlvbiB3aXRob3V0IG9wdGltaXphdGlvbi4gIEF2b2lkaW5nIG9wdGltaXphdGlvbiBvbiB0aGUKK3NwZWNpZmllZCBmdW5jdGlvbiBjYW4gaW1wcm92ZSB0aGUgcXVhbGl0eSBvZiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uCitmb3IgdGhhdCBmdW5jdGlvbi4KKworVGhpcyBhdHRyaWJ1dGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGBgYWx3YXlzX2lubGluZWBgIGF0dHJpYnV0ZS4KKyAgfV07Cit9CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0cktpbmRzLmggYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJLaW5kcy5oCmluZGV4IDdjNGUyYzcuLjE1MGEzMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0cktpbmRzLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyS2luZHMuaApAQCAtMjQsNyArMjQsNiBAQAogI2RlZmluZSBBVFRSKFgpIFgsCiAjZGVmaW5lIExBU1RfSU5IRVJJVEFCTEVfQVRUUihYKSBYLCBMQVNUX0lOSEVSSVRBQkxFID0gWCwKICNkZWZpbmUgTEFTVF9JTkhFUklUQUJMRV9QQVJBTV9BVFRSKFgpIFgsIExBU1RfSU5IRVJJVEFCTEVfUEFSQU0gPSBYLAotI2RlZmluZSBMQVNUX01TX0lOSEVSSVRBTkNFX0FUVFIoWCkgWCwgTEFTVF9NU19JTkhFUklUQU5DRSA9IFgsCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQXR0ckxpc3QuaW5jIgogICBOVU1fQVRUUlMKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJpYnV0ZXMuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhN2U0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJpYnV0ZXMuaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0tLSBBdHRyaWJ1dGVzLmggLSBBdHRyaWJ1dGVzIGhlYWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfQkFTSUNfQVRUUklCVVRFU19ICisjZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfQVRUUklCVVRFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oIgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBJZGVudGlmaWVySW5mbzsKKworZW51bSBjbGFzcyBBdHRyU3ludGF4IHsKKyAgLy8vIElzIHRoZSBhdHRyaWJ1dGUgaWRlbnRpZmllciBnZW5lcmFsbHkga25vd24gZm9yIGFueSBzeW50YXg/CisgIEdlbmVyaWMsCisgIC8vLyBJcyB0aGUgaWRlbnRpZmllciBrbm93biBhcyBhIEdOVS1zdHlsZSBhdHRyaWJ1dGU/CisgIEdOVSwKKyAgLy8vIElzIHRoZSBpZGVudGlmaWVyIGtub3duIGFzIGEgX19kZWNsc3BlYy1zdHlsZSBhdHRyaWJ1dGU/CisgIERlY2xzcGVjLAorICAvLyBJcyB0aGUgaWRlbnRpZmllciBrbm93biBhcyBhIEMrKy1zdHlsZSBhdHRyaWJ1dGU/CisgIENYWAorfTsKKworLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB3ZSByZWNvZ25pemUgYW5kIGltcGxlbWVudCB0aGUgYXR0cmlidXRlIHNwZWNpZmllZCBieQorLy8vIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KK2Jvb2wgaGFzQXR0cmlidXRlKEF0dHJTeW50YXggU3ludGF4LCBjb25zdCBJZGVudGlmaWVySW5mbyAqU2NvcGUsCisgICAgICAgICAgICAgICAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqQXR0ciwgY29uc3QgbGx2bTo6VHJpcGxlICZULAorICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCisKKyNlbmRpZiAvLyBMTFZNX0NMQU5HX0JBU0lDX0FUVFJJQlVURVNfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGlucy5kZWYgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zLmRlZgppbmRleCA1NWM2ZWQ3Li41NDBlYzI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zLmRlZgorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zLmRlZgpAQCAtNTAsNiArNTAsNyBAQAogLy8gIEwgICAtPiBsb25nIChlLmcuIExpIGZvciAnbG9uZyBpbnQnKQogLy8gIExMICAtPiBsb25nIGxvbmcKIC8vICBMTEwgLT4gX19pbnQxMjhfdCAoZS5nLiBMTExpKQorLy8gIFcgICAtPiBpbnQ2NF90CiAvLyAgUyAgIC0+IHNpZ25lZAogLy8gIFUgICAtPiB1bnNpZ25lZAogLy8gIEkgICAtPiBSZXF1aXJlZCB0byBjb25zdGFudCBmb2xkIHRvIGFuIGludGVnZXIgY29uc3RhbnQgZXhwcmVzc2lvbi4KQEAgLTQ0NCw2ICs0NDUsNyBAQAogQlVJTFRJTihfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MsICJ2KklVaSIsICJuIikKIEJVSUxUSU4oX19idWlsdGluX2V4dHJhY3RfcmV0dXJuX2FkZHIsICJ2KnYqIiwgIm4iKQogQlVJTFRJTihfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcywgInYqSVVpIiwgIm4iKQorQlVJTFRJTihfX2J1aWx0aW5fX19jbGVhcl9jYWNoZSwgInZjKmMqIiwgIm4iKQogQlVJTFRJTihfX2J1aWx0aW5fZmx0X3JvdW5kcywgImkiLCAibmMiKQogQlVJTFRJTihfX2J1aWx0aW5fc2V0am1wLCAiaXYqKiIsICJqIikKIEJVSUxUSU4oX19idWlsdGluX2xvbmdqbXAsICJ2dioqaSIsICJyIikKQEAgLTY3OSw2ICs2ODEsMTEgQEAKIExBTkdCVUlMVElOKF9fYXNzdW1lLCAgICAgInZiIiwgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKIExBTkdCVUlMVElOKF9fbm9vcCwgICAgICAgInYuIiwgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKIExBTkdCVUlMVElOKF9fZGVidWdicmVhaywgInYiLCAgICJuIiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9fdmFfc3RhcnQsICAgInZjKiouIiwgIm50IiwgQUxMX01TX0xBTkdVQUdFUykKK0xBTkdCVUlMVElOKF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSwgIkxpTGlEKkxpTGkiLCAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfSW50ZXJsb2NrZWRJbmNyZW1lbnQsICJMaUxpRCoiLCAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfSW50ZXJsb2NrZWREZWNyZW1lbnQsICJMaUxpRCoiLCAibiIsIEFMTF9NU19MQU5HVUFHRVMpCitMQU5HQlVJTFRJTihfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCwgIkxpTGlEKkxpIiwgIm4iLCBBTExfTVNfTEFOR1VBR0VTKQogCiAvLyBDOTkgbGlicmFyeSBmdW5jdGlvbnMKIC8vIEM5OSBzdGRsaWIuaApAQCAtMTEzNyw2ICsxMTQ0LDIxIEBACiBMSUJCVUlMVElOKGN0YW5oZiwgIlhmWGYiLCAiZm5jIiwgImNvbXBsZXguaCIsIEFMTF9MQU5HVUFHRVMpCiBMSUJCVUlMVElOKGN0YW5obCwgIlhMZFhMZCIsICJmbmMiLCAiY29tcGxleC5oIiwgQUxMX0xBTkdVQUdFUykKIAorLy8gX19zaW5waSBhbmQgZnJpZW5kcyBhcmUgT1MgWCBzcGVjaWZpYyBsaWJyYXJ5IGZ1bmN0aW9ucywgYnV0IG90aGVyd2lzZSBtdWNoCisvLyBsaWtlIHRoZSBzdGFuZGFyZCAobm9uLWNvbXBsZXgpIHNpbiAoZXRjKS4KK0xJQkJVSUxUSU4oX19zaW5waSwgImRkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihfX3NpbnBpZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCitMSUJCVUlMVElOKF9fY29zcGksICJkZCIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKK0xJQkJVSUxUSU4oX19jb3NwaWYsICJmZiIsICJmbmUiLCAibWF0aC5oIiwgQUxMX0xBTkdVQUdFUykKKworTElCQlVJTFRJTihfX3RhbnBpLCAiZGQiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCitMSUJCVUlMVElOKF9fdGFucGlmLCAiZmYiLCAiZm5lIiwgIm1hdGguaCIsIEFMTF9MQU5HVUFHRVMpCisKKy8vIFNpbWlsYXJseSwgX19leHAxMCBpcyBPUyBYIG9ubHkKK0xJQkJVSUxUSU4oX19leHAxMCwgImRkIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorTElCQlVJTFRJTihfX2V4cDEwZiwgImZmIiwgImZuZSIsICJtYXRoLmgiLCBBTExfTEFOR1VBR0VTKQorCiAvLyBCbG9ja3MgcnVudGltZSBCdWlsdGluIG1hdGggbGlicmFyeSBmdW5jdGlvbnMKIExJQkJVSUxUSU4oX0Jsb2NrX29iamVjdF9hc3NpZ24sICJ2dip2QyppQyIsICJmIiwgIkJsb2Nrcy5oIiwgQUxMX0xBTkdVQUdFUykKIExJQkJVSUxUSU4oX0Jsb2NrX29iamVjdF9kaXNwb3NlLCAidnZDKmlDIiwgImYiLCAiQmxvY2tzLmgiLCBBTExfTEFOR1VBR0VTKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGlucy5oIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGlucy5oCmluZGV4IDk3NTZmMjEuLmZkOGZkNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnMuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zLmgKQEAgLTE3Nyw2ICsxNzcsMTAgQEAKICAgLy8vIFxicmllZiBJcyB0aGlzIGJ1aWx0aW4gc3VwcG9ydGVkIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gbGFuZ3VhZ2Ugb3B0aW9ucz8KICAgYm9vbCBCdWlsdGluSXNTdXBwb3J0ZWQoY29uc3QgQnVpbHRpbjo6SW5mbyAmQnVpbHRpbkluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cyk7CisKKyAgLy8vIFxicmllZiBIZWxwZXIgZnVuY3Rpb24gZm9yIGlzUHJpbnRmTGlrZSBhbmQgaXNTY2FuZkxpa2UuCisgIGJvb2wgaXNMaWtlKHVuc2lnbmVkIElELCB1bnNpZ25lZCAmRm9ybWF0SWR4LCBib29sICZIYXNWQUxpc3RBcmcsCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkZtdCkgY29uc3Q7CiB9OwogCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zQUFyY2g2NC5kZWYgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zQUFyY2g2NC5kZWYKaW5kZXggYWFmZDIwMi4uYTBhMGE1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0FBcmNoNjQuZGVmCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNBQXJjaDY0LmRlZgpAQCAtMTYsMTAgKzE2LDUgQEAKIAogLy8gSW4gbGliZ2NjCiBCVUlMVElOKF9fY2xlYXJfY2FjaGUsICJ2dip2KiIsICJpIikKLS8vIE5FT04KLSNkZWZpbmUgR0VUX05FT05fQUFSQ0g2NF9CVUlMVElOUwotI2luY2x1ZGUgImNsYW5nL0Jhc2ljL2FybV9uZW9uLmluYyIKLSN1bmRlZiBHRVRfTkVPTl9BQVJDSDY0X0JVSUxUSU5TCi0jdW5kZWYgR0VUX05FT05fQlVJTFRJTlMKIAogI3VuZGVmIEJVSUxUSU4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNBUk0uZGVmIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0FSTS5kZWYKaW5kZXggMjFiYjg5Mi4uYWFiOTI1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0FSTS5kZWYKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc0FSTS5kZWYKQEAgLTY1LDkgKzY1LDQgQEAKIEJVSUxUSU4oX19idWlsdGluX2FybV9kbWIsICJ2VWkiLCAibmMiKQogQlVJTFRJTihfX2J1aWx0aW5fYXJtX2RzYiwgInZVaSIsICJuYyIpCiAKLS8vIE5FT04KLSNkZWZpbmUgR0VUX05FT05fQlVJTFRJTlMKLSNpbmNsdWRlICJjbGFuZy9CYXNpYy9hcm1fbmVvbi5pbmMiCi0jdW5kZWYgR0VUX05FT05fQlVJTFRJTlMKLQogI3VuZGVmIEJVSUxUSU4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNBUk02NC5kZWYgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zQVJNNjQuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYzFiNTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zQVJNNjQuZGVmCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LS0tIEJ1aWx0aW5zQVJNNjQuZGVmIC0gQVJNNjQgQnVpbHRpbiBmdW5jdGlvbiBkYXRhYmFzZSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEFSTTY0LXNwZWNpZmljIGJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UuICBVc2VycyBvZgorLy8gdGhpcyBmaWxlIG11c3QgZGVmaW5lIHRoZSBCVUlMVElOIG1hY3JvIHRvIG1ha2UgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVGhlIGZvcm1hdCBvZiB0aGlzIGRhdGFiYXNlIG1hdGNoZXMgY2xhbmcvQmFzaWMvQnVpbHRpbnMuZGVmLgorCisvLyBJbiBsaWJnY2MKK0JVSUxUSU4oX19jbGVhcl9jYWNoZSwgInZ2KnYqIiwgIiIpCisKK0JVSUxUSU4oX19idWlsdGluX2FybV9sZHJleCwgInYuIiwgInQiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX3N0cmV4LCAiaS4iLCAidCIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY2xyZXgsICJ2IiwgIiIpCisKKy8vIENSQzMyCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY3JjMzJiLCAiVWlVaVVjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9jcmMzMmNiLCAiVWlVaVVjIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX2FybV9jcmMzMmgsICJVaVVpVXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2NyYzMyY2gsICJVaVVpVXMiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fYXJtX2NyYzMydywgIlVpVWlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY3JjMzJjdywgIlVpVWlVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY3JjMzJkLCAiVWlVaUxVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9hcm1fY3JjMzJjZCwgIlVpVWlMVWkiLCAibmMiKQorCisjdW5kZWYgQlVJTFRJTgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc01pcHMuZGVmIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc01pcHMuZGVmCmluZGV4IGU0MzVkNTIuLjJkMjE3ZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNNaXBzLmRlZgorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0J1aWx0aW5zTWlwcy5kZWYKQEAgLTc4MywxNSArNzgzLDE1IEBACiBCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2hmX2gsICJWOHNWOHNJVWkiLCAibmMiKQogQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NoZl93LCAiVjRpVjRpSVVpIiwgIm5jIikKIAotQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NsZF9iLCAiVjE2Y1YxNmNVaSIsICJuYyIpCi1CVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xkX2gsICJWOHNWOHNVaSIsICJuYyIpCi1CVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xkX3csICJWNGlWNGlVaSIsICJuYyIpCi1CVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xkX2QsICJWMkxMaVYyTExpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NsZF9iLCAiVjE2Y1YxNmNWMTZjVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NsZF9oLCAiVjhzVjhzVjhzVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NsZF93LCAiVjRpVjRpVjRpVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NsZF9kLCAiVjJMTGlWMkxMaVYyTExpVWkiLCAibmMiKQogCi1CVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xkaV9iLCAiVjE2Y1YxNmNJVWkiLCAibmMiKQotQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NsZGlfaCwgIlY4c1Y4c0lVaSIsICJuYyIpCi1CVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xkaV93LCAiVjRpVjRpSVVpIiwgIm5jIikKLUJVSUxUSU4oX19idWlsdGluX21zYV9zbGRpX2QsICJWMkxMaVYyTExpSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zbGRpX2IsICJWMTZjVjE2Y1YxNmNJVWkiLCAibmMiKQorQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NsZGlfaCwgIlY4c1Y4c1Y4c0lVaSIsICJuYyIpCitCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xkaV93LCAiVjRpVjRpVjRpSVVpIiwgIm5jIikKK0JVSUxUSU4oX19idWlsdGluX21zYV9zbGRpX2QsICJWMkxMaVYyTExpVjJMTGlJVWkiLCAibmMiKQogCiBCVUlMVElOKF9fYnVpbHRpbl9tc2Ffc2xsX2IsICJWMTZjVjE2Y1YxNmMiLCAibmMiKQogQlVJTFRJTihfX2J1aWx0aW5fbXNhX3NsbF9oLCAiVjhzVjhzVjhzIiwgIm5jIikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNORU9OLmRlZiBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNORU9OLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODAwYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc05FT04uZGVmCkBAIC0wLDAgKzEsMjEgQEAKKy8vPT09LS0tIEJ1aWx0aW5zTkVPTi5kZWYgLSBORU9OIEJ1aWx0aW4gZnVuY3Rpb24gZGF0YWJhc2UgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE5FT04tc3BlY2lmaWMgYnVpbHRpbiBmdW5jdGlvbiBkYXRhYmFzZS4gIFVzZXJzIG9mCisvLyB0aGlzIGZpbGUgbXVzdCBkZWZpbmUgdGhlIEJVSUxUSU4gbWFjcm8gdG8gbWFrZSB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUaGUgZm9ybWF0IG9mIHRoaXMgZGF0YWJhc2UgbWF0Y2hlcyBjbGFuZy9CYXNpYy9CdWlsdGlucy5kZWYuCisKKyNkZWZpbmUgR0VUX05FT05fQlVJTFRJTlMKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9hcm1fbmVvbi5pbmMiCisjdW5kZWYgR0VUX05FT05fQlVJTFRJTlMKKworI3VuZGVmIEJVSUxUSU4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQnVpbHRpbnNYODYuZGVmIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc1g4Ni5kZWYKaW5kZXggNTEzOTdmYS4uNGE2N2ZjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc1g4Ni5kZWYKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9CdWlsdGluc1g4Ni5kZWYKQEAgLTU5LDYgKzU5LDcgQEAKIC8vIEFsbCBNTVggaW5zdHJ1Y3Rpb25zIHdpbGwgYmUgZ2VuZXJhdGVkIHZpYSBidWlsdGlucy4gQW55IE1NWCB2ZWN0b3IKIC8vIHR5cGVzICg8MSB4IGk2ND4sIDwyIHggaTMyPiwgZXRjLikgdGhhdCBhcmVuJ3QgdXNlZCBieSB0aGVzZSBidWlsdGlucyB3aWxsIGJlCiAvLyBleHBhbmRlZCBieSB0aGUgYmFjay1lbmQuCitCVUlMVElOKF9tbV9wcmVmZXRjaCwgInZjQyppIiwgIm5jIikKIEJVSUxUSU4oX19idWlsdGluX2lhMzJfZW1tcywgInYiLCAiIikKIEJVSUxUSU4oX19idWlsdGluX2lhMzJfcGFkZGIsICJWOGNWOGNWOGMiLCAiIikKIEJVSUxUSU4oX19idWlsdGluX2lhMzJfcGFkZHcsICJWNHNWNHNWNHMiLCAiIikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQ01ha2VMaXN0cy50eHQgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0NNYWtlTGlzdHMudHh0CmluZGV4IDI3NGI5NGQuLmU0OTI5YjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvQ01ha2VMaXN0cy50eHQKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9DTWFrZUxpc3RzLnR4dApAQCAtMjgsNyArMjgsMTQgQEAKICAgU09VUkNFIEF0dHIudGQKICAgVEFSR0VUIENsYW5nQXR0ckxpc3QpCiAKK2NsYW5nX3RhYmxlZ2VuKEF0dHJIYXNBdHRyaWJ1dGVJbXBsLmluYyAtZ2VuLWNsYW5nLWF0dHItaGFzLWF0dHJpYnV0ZS1pbXBsCisgIC1JICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8KKyAgU09VUkNFIEF0dHIudGQKKyAgVEFSR0VUIENsYW5nQXR0ckhhc0F0dHJpYnV0ZUltcGwKKyAgKQorCiAjIEFSTSBORU9OCiBjbGFuZ190YWJsZWdlbihhcm1fbmVvbi5pbmMgLWdlbi1hcm0tbmVvbi1zZW1hCisgIC1JICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8KICAgU09VUkNFIGFybV9uZW9uLnRkCiAgIFRBUkdFVCBDbGFuZ0FSTU5lb24pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oCmluZGV4IGMwNTdiZGYuLjYwODJlYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90eXBlX3RyYWl0cy5oIgogI2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8dmVjdG9yPgogCkBAIC0zNSw2ICszNCw5IEBACiAgIGNsYXNzIFByZXByb2Nlc3NvcjsKICAgY2xhc3MgRGlhZ25vc3RpY0Vycm9yVHJhcDsKICAgY2xhc3MgU3RvcmVkRGlhZ25vc3RpYzsKKyAgbmFtZXNwYWNlIHRvayB7CisgIGVudW0gVG9rZW5LaW5kIDogdW5zaWduZWQgc2hvcnQ7CisgIH0KIAogLy8vIFxicmllZiBBbm5vdGF0ZXMgYSBkaWFnbm9zdGljIHdpdGggc29tZSBjb2RlIHRoYXQgc2hvdWxkIGJlCiAvLy8gaW5zZXJ0ZWQsIHJlbW92ZWQsIG9yIHJlcGxhY2VkIHRvIGZpeCB0aGUgcHJvYmxlbS4KQEAgLTEzNCw2ICsxMzYsNyBAQAogICBlbnVtIExldmVsIHsKICAgICBJZ25vcmVkID0gRGlhZ25vc3RpY0lEczo6SWdub3JlZCwKICAgICBOb3RlID0gRGlhZ25vc3RpY0lEczo6Tm90ZSwKKyAgICBSZW1hcmsgPSBEaWFnbm9zdGljSURzOjpSZW1hcmssCiAgICAgV2FybmluZyA9IERpYWdub3N0aWNJRHM6Oldhcm5pbmcsCiAgICAgRXJyb3IgPSBEaWFnbm9zdGljSURzOjpFcnJvciwKICAgICBGYXRhbCA9IERpYWdub3N0aWNJRHM6OkZhdGFsCkBAIC0xNTEsMTMgKzE1NCwxNSBAQAogICAgIGFrX2Nfc3RyaW5nLCAgICAgICAgLy8vPCBjb25zdCBjaGFyICoKICAgICBha19zaW50LCAgICAgICAgICAgIC8vLzwgaW50CiAgICAgYWtfdWludCwgICAgICAgICAgICAvLy88IHVuc2lnbmVkCisgICAgYWtfdG9rZW5raW5kLCAgICAgICAvLy88IGVudW0gVG9rZW5LaW5kIDogdW5zaWduZWQKICAgICBha19pZGVudGlmaWVyaW5mbywgIC8vLzwgSWRlbnRpZmllckluZm8KICAgICBha19xdWFsdHlwZSwgICAgICAgIC8vLzwgUXVhbFR5cGUKICAgICBha19kZWNsYXJhdGlvbm5hbWUsIC8vLzwgRGVjbGFyYXRpb25OYW1lCiAgICAgYWtfbmFtZWRkZWNsLCAgICAgICAvLy88IE5hbWVkRGVjbCAqCiAgICAgYWtfbmVzdGVkbmFtZXNwZWMsICAvLy88IE5lc3RlZE5hbWVTcGVjaWZpZXIgKgogICAgIGFrX2RlY2xjb250ZXh0LCAgICAgLy8vPCBEZWNsQ29udGV4dCAqCi0gICAgYWtfcXVhbHR5cGVfcGFpciAgICAvLy88IHBhaXI8UXVhbFR5cGUsIFF1YWxUeXBlPgorICAgIGFrX3F1YWx0eXBlX3BhaXIsICAgLy8vPCBwYWlyPFF1YWxUeXBlLCBRdWFsVHlwZT4KKyAgICBha19hdHRyICAgICAgICAgICAgIC8vLzwgQXR0ciAqCiAgIH07CiAKICAgLy8vIFxicmllZiBSZXByZXNlbnRzIG9uIGFyZ3VtZW50IHZhbHVlLCB3aGljaCBpcyBhIHVuaW9uIGRpc2NyaW1pbmF0ZWQKQEAgLTUzNiwxMSArNTQxLDYgQEAKICAgYm9vbCBzZXREaWFnbm9zdGljR3JvdXBNYXBwaW5nKFN0cmluZ1JlZiBHcm91cCwgZGlhZzo6TWFwcGluZyBNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBTb3VyY2VMb2NhdGlvbigpKTsKIAotICAvLy8gXGJyaWVmIFNldCB0aGUgd2FybmluZy1hcy1lcnJvciBmbGFnIGZvciB0aGUgZ2l2ZW4gZGlhZ25vc3RpYy4KLSAgLy8vCi0gIC8vLyBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBvbmx5IG9wZXJhdGVzIG9uIHRoZSBjdXJyZW50IGRpYWdub3N0aWMgc3RhdGUuCi0gIHZvaWQgc2V0RGlhZ25vc3RpY1dhcm5pbmdBc0Vycm9yKGRpYWc6OmtpbmQgRGlhZywgYm9vbCBFbmFibGVkKTsKLQogICAvLy8gXGJyaWVmIFNldCB0aGUgd2FybmluZy1hcy1lcnJvciBmbGFnIGZvciB0aGUgZ2l2ZW4gZGlhZ25vc3RpYyBncm91cC4KICAgLy8vCiAgIC8vLyBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBvbmx5IG9wZXJhdGVzIG9uIHRoZSBjdXJyZW50IGRpYWdub3N0aWMgc3RhdGUuCkBAIC01NDgsMTEgKzU0OCw2IEBACiAgIC8vLyBccmV0dXJucyBUcnVlIGlmIHRoZSBnaXZlbiBncm91cCBpcyB1bmtub3duLCBmYWxzZSBvdGhlcndpc2UuCiAgIGJvb2wgc2V0RGlhZ25vc3RpY0dyb3VwV2FybmluZ0FzRXJyb3IoU3RyaW5nUmVmIEdyb3VwLCBib29sIEVuYWJsZWQpOwogCi0gIC8vLyBcYnJpZWYgU2V0IHRoZSBlcnJvci1hcy1mYXRhbCBmbGFnIGZvciB0aGUgZ2l2ZW4gZGlhZ25vc3RpYy4KLSAgLy8vCi0gIC8vLyBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBvbmx5IG9wZXJhdGVzIG9uIHRoZSBjdXJyZW50IGRpYWdub3N0aWMgc3RhdGUuCi0gIHZvaWQgc2V0RGlhZ25vc3RpY0Vycm9yQXNGYXRhbChkaWFnOjpraW5kIERpYWcsIGJvb2wgRW5hYmxlZCk7Ci0KICAgLy8vIFxicmllZiBTZXQgdGhlIGVycm9yLWFzLWZhdGFsIGZsYWcgZm9yIHRoZSBnaXZlbiBkaWFnbm9zdGljIGdyb3VwLgogICAvLy8KICAgLy8vIFRoaXMgZnVuY3Rpb24gYWx3YXlzIG9ubHkgb3BlcmF0ZXMgb24gdGhlIGN1cnJlbnQgZGlhZ25vc3RpYyBzdGF0ZS4KQEAgLTU4NywxMiArNTgyLDE4IEBACiAgICAgdGhpcy0+TnVtV2FybmluZ3MgPSBOdW1XYXJuaW5nczsKICAgfQogCi0gIC8vLyBcYnJpZWYgUmV0dXJuIGFuIElEIGZvciBhIGRpYWdub3N0aWMgd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYW5kIGxldmVsLgorICAvLy8gXGJyaWVmIFJldHVybiBhbiBJRCBmb3IgYSBkaWFnbm9zdGljIHdpdGggdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nIGFuZAorICAvLy8gbGV2ZWwuCiAgIC8vLwogICAvLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgcmVxdWVzdCBmb3IgdGhpcyBkaWFnbm9zdGljLCBpdCBpcyByZWdpc3RlcmVkIGFuZAogICAvLy8gY3JlYXRlZCwgb3RoZXJ3aXNlIHRoZSBleGlzdGluZyBJRCBpcyByZXR1cm5lZC4KLSAgdW5zaWduZWQgZ2V0Q3VzdG9tRGlhZ0lEKExldmVsIEwsIFN0cmluZ1JlZiBNZXNzYWdlKSB7Ci0gICAgcmV0dXJuIERpYWdzLT5nZXRDdXN0b21EaWFnSUQoKERpYWdub3N0aWNJRHM6OkxldmVsKUwsIE1lc3NhZ2UpOworICAvLy8KKyAgLy8vIFxwYXJhbSBGb3JtYXRTdHJpbmcgQSBmaXhlZCBkaWFnbm9zdGljIGZvcm1hdCBzdHJpbmcgdGhhdCB3aWxsIGJlIGhhc2hlZAorICAvLy8gYW5kIG1hcHBlZCB0byBhIHVuaXF1ZSBEaWFnSUQuCisgIHRlbXBsYXRlIDx1bnNpZ25lZCBOPgorICB1bnNpZ25lZCBnZXRDdXN0b21EaWFnSUQoTGV2ZWwgTCwgY29uc3QgY2hhciAoJkZvcm1hdFN0cmluZylbTl0pIHsKKyAgICByZXR1cm4gRGlhZ3MtPmdldEN1c3RvbURpYWdJRCgoRGlhZ25vc3RpY0lEczo6TGV2ZWwpTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYoRm9ybWF0U3RyaW5nLCBOIC0gMSkpOwogICB9CiAKICAgLy8vIFxicmllZiBDb252ZXJ0cyBhIGRpYWdub3N0aWMgYXJndW1lbnQgKGFzIGFuIGludHB0cl90KSBpbnRvIHRoZSBzdHJpbmcKQEAgLTEwMTMsNyArMTAxNCwxMyBAQAogICByZXR1cm4gREI7CiB9CiAKLWlubGluZSBjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmb3BlcmF0b3I8PChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmREIsYm9vbCBJKSB7CisvLyBXZSB1c2UgZW5hYmxlX2lmIGhlcmUgdG8gcHJldmVudCB0aGF0IHRoaXMgb3ZlcmxvYWQgaXMgc2VsZWN0ZWQgZm9yCisvLyBwb2ludGVycyBvciBvdGhlciBhcmd1bWVudHMgdGhhdCBhcmUgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0byBib29sLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZTxULCBib29sPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmPjo6dHlwZQorb3BlcmF0b3I8PChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmREIsIFQgSSkgewogICBEQi5BZGRUYWdnZWRWYWwoSSwgRGlhZ25vc3RpY3NFbmdpbmU6OmFrX3NpbnQpOwogICByZXR1cm4gREI7CiB9CkBAIC0xMDI1LDYgKzEwMzIsMTIgQEAKIH0KIAogaW5saW5lIGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZvcGVyYXRvcjw8KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBJKSB7CisgIERCLkFkZFRhZ2dlZFZhbChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oSSksIERpYWdub3N0aWNzRW5naW5lOjpha190b2tlbmtpbmQpOworICByZXR1cm4gREI7Cit9CisKK2lubGluZSBjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmb3BlcmF0b3I8PChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmREIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllckluZm8gKklJKSB7CiAgIERCLkFkZFRhZ2dlZFZhbChyZWludGVycHJldF9jYXN0PGludHB0cl90PihJSSksCiAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6YWtfaWRlbnRpZmllcmluZm8pOwpAQCAtMTAzNywxNCArMTA1MCwxNCBAQAogLy8gbWF0Y2guCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogaW5saW5lCi10eXBlbmFtZSBsbHZtOjplbmFibGVfaWY8bGx2bTo6aXNfc2FtZTxULCBEZWNsQ29udGV4dD4sIAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICY+Ojp0eXBlCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VCwgRGVjbENvbnRleHQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICY+Ojp0eXBlCiBvcGVyYXRvcjw8KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQiwgVCAqREMpIHsKICAgREIuQWRkVGFnZ2VkVmFsKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KERDKSwKICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpha19kZWNsY29udGV4dCk7CiAgIHJldHVybiBEQjsKIH0KLSAgCisKIGlubGluZSBjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmb3BlcmF0b3I8PChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmREIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlUmFuZ2UgJlIpIHsKICAgREIuQWRkU291cmNlUmFuZ2UoQ2hhclNvdXJjZVJhbmdlOjpnZXRUb2tlblJhbmdlKFIpKTsKQEAgLTEwNTIsMTEgKzEwNjUsMTggQEAKIH0KIAogaW5saW5lIGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZvcGVyYXRvcjw8KGNvbnN0IERpYWdub3N0aWNCdWlsZGVyICZEQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VSYW5nZT4gUmFuZ2VzKSB7CisgIGZvciAoY29uc3QgU291cmNlUmFuZ2UgJlI6IFJhbmdlcykKKyAgICBEQi5BZGRTb3VyY2VSYW5nZShDaGFyU291cmNlUmFuZ2U6OmdldFRva2VuUmFuZ2UoUikpOworICByZXR1cm4gREI7Cit9CisKK2lubGluZSBjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmb3BlcmF0b3I8PChjb25zdCBEaWFnbm9zdGljQnVpbGRlciAmREIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSKSB7CiAgIERCLkFkZFNvdXJjZVJhbmdlKFIpOwogICByZXR1cm4gREI7CiB9Ci0gIAorCiBpbmxpbmUgY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJm9wZXJhdG9yPDwoY29uc3QgRGlhZ25vc3RpY0J1aWxkZXIgJkRCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpeEl0SGludCAmSGludCkgewogICBpZiAoIUhpbnQuaXNOdWxsKCkpCkBAIC0xMDY1LDcgKzEwODUsNyBAQAogfQogCiBpbmxpbmUgRGlhZ25vc3RpY0J1aWxkZXIgRGlhZ25vc3RpY3NFbmdpbmU6OlJlcG9ydChTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERpYWdJRCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaWFnSUQpIHsKICAgYXNzZXJ0KEN1ckRpYWdJRCA9PSB+MFUgJiYgIk11bHRpcGxlIGRpYWdub3N0aWNzIGluIGZsaWdodCBhdCBvbmNlISIpOwogICBDdXJEaWFnTG9jID0gTG9jOwogICBDdXJEaWFnSUQgPSBEaWFnSUQ7CkBAIC0xMzEyLDcgKzEzMzIsNyBAQAogY2xhc3MgSWdub3JpbmdEaWFnQ29uc3VtZXIgOiBwdWJsaWMgRGlhZ25vc3RpY0NvbnN1bWVyIHsKICAgdmlydHVhbCB2b2lkIGFuY2hvcigpOwogICB2b2lkIEhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIERpYWdMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pIG92ZXJyaWRlIHsKICAgICAvLyBKdXN0IGlnbm9yZSBpdC4KICAgfQogfTsKQEAgLTEzMjgsMTEgKzEzNDgsMTEgQEAKIAogICB2aXJ0dWFsIH5Gb3J3YXJkaW5nRGlhZ25vc3RpY0NvbnN1bWVyKCk7CiAKLSAgdmlydHVhbCB2b2lkIEhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIERpYWdMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpYyAmSW5mbyk7Ci0gIHZpcnR1YWwgdm9pZCBjbGVhcigpOworICB2b2lkIEhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIERpYWdMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pIG92ZXJyaWRlOworICB2b2lkIGNsZWFyKCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBib29sIEluY2x1ZGVJbkRpYWdub3N0aWNDb3VudHMoKSBjb25zdDsKKyAgYm9vbCBJbmNsdWRlSW5EaWFnbm9zdGljQ291bnRzKCkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiAvLyBTdHJ1Y3QgdXNlZCBmb3Igc2VuZGluZyBpbmZvIGFib3V0IGhvdyBhIHR5cGUgc2hvdWxkIGJlIHByaW50ZWQuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWMudGQgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWMudGQKaW5kZXggMjYxNjU0OC4uNjFhNDUwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljLnRkCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy50ZApAQCAtMTUsNiArMTUsNyBAQAogLy8gRGVmaW5lIHRoZSBkaWFnbm9zdGljIG1hcHBpbmdzLgogY2xhc3MgRGlhZ01hcHBpbmc7CiBkZWYgTUFQX0lHTk9SRSAgOiBEaWFnTWFwcGluZzsKK2RlZiBNQVBfUkVNQVJLICA6IERpYWdNYXBwaW5nOwogZGVmIE1BUF9XQVJOSU5HIDogRGlhZ01hcHBpbmc7CiBkZWYgTUFQX0VSUk9SICAgOiBEaWFnTWFwcGluZzsKIGRlZiBNQVBfRkFUQUwgICA6IERpYWdNYXBwaW5nOwpAQCAtMjIsNiArMjMsNyBAQAogLy8gRGVmaW5lIHRoZSBkaWFnbm9zdGljIGNsYXNzZXMuCiBjbGFzcyBEaWFnQ2xhc3M7CiBkZWYgQ0xBU1NfTk9URSAgICAgIDogRGlhZ0NsYXNzOworZGVmIENMQVNTX1JFTUFSSyAgICA6IERpYWdDbGFzczsKIGRlZiBDTEFTU19XQVJOSU5HICAgOiBEaWFnQ2xhc3M7CiBkZWYgQ0xBU1NfRVhURU5TSU9OIDogRGlhZ0NsYXNzOwogZGVmIENMQVNTX0VSUk9SICAgICA6IERpYWdDbGFzczsKQEAgLTg0LDYgKzg2LDcgQEAKIC8vIEZJWE1FOiBFeHRXYXJuIGFuZCBFeHRlbnNpb24gc2hvdWxkIGFsc28gYmUgU0ZJTkFFRmFpbHVyZSBieSBkZWZhdWx0LgogY2xhc3MgRXJyb3I8c3RyaW5nIHN0cj4gICAgIDogRGlhZ25vc3RpYzxzdHIsIENMQVNTX0VSUk9SLCBNQVBfRVJST1I+LCBTRklOQUVGYWlsdXJlOwogY2xhc3MgV2FybmluZzxzdHJpbmcgc3RyPiAgIDogRGlhZ25vc3RpYzxzdHIsIENMQVNTX1dBUk5JTkcsIE1BUF9XQVJOSU5HPjsKK2NsYXNzIFJlbWFyazxzdHJpbmcgc3RyPiAgICA6IERpYWdub3N0aWM8c3RyLCBDTEFTU19SRU1BUkssIE1BUF9JR05PUkU+OwogY2xhc3MgRXh0ZW5zaW9uPHN0cmluZyBzdHI+IDogRGlhZ25vc3RpYzxzdHIsIENMQVNTX0VYVEVOU0lPTiwgTUFQX0lHTk9SRT47CiBjbGFzcyBFeHRXYXJuPHN0cmluZyBzdHI+ICAgOiBEaWFnbm9zdGljPHN0ciwgQ0xBU1NfRVhURU5TSU9OLCBNQVBfV0FSTklORz47CiBjbGFzcyBOb3RlPHN0cmluZyBzdHI+ICAgICAgOiBEaWFnbm9zdGljPHN0ciwgQ0xBU1NfTk9URSwgTUFQX0ZBVEFMLyppZ25vcmVkKi8+OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQ2F0ZWdvcmllcy50ZCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0NhdGVnb3JpZXMudGQKaW5kZXggYTAyZmJkZi4uMzdiODU2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQ2F0ZWdvcmllcy50ZAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNDYXRlZ29yaWVzLnRkCkBAIC04LDMgKzgsNCBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogY2xhc3MgQ2F0SW5saW5lQXNtIDogRGlhZ0NhdGVnb3J5PCJJbmxpbmUgQXNzZW1ibHkgSXNzdWUiPjsKK2NsYXNzIENhdEJhY2tlbmQgOiBEaWFnQ2F0ZWdvcnk8IkJhY2tlbmQgSXNzdWUiPjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0NvbW1vbktpbmRzLnRkIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQ29tbW9uS2luZHMudGQKaW5kZXggYzU0YmFmYy4uMDQzMGIxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQ29tbW9uS2luZHMudGQKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljQ29tbW9uS2luZHMudGQKQEAgLTMwLDcgKzMwLDcgQEAKICAgImRlZmluaXRpb24gb2YgJTAgaXMgbm90IGNvbXBsZXRlIHVudGlsIHRoZSBjbG9zaW5nICd9JyI+OwogLy8vIG5vdGVfbWF0Y2hpbmcgLSB0aGlzIGlzIHVzZWQgYXMgYSBjb250aW51YXRpb24gb2YgYSBwcmV2aW91cyBkaWFnbm9zdGljLAogLy8vIGUuZy4gdG8gc3BlY2lmeSB0aGUgJygnIHdoZW4gd2UgZXhwZWN0ZWQgYSAnKScuCi1kZWYgbm90ZV9tYXRjaGluZyA6IE5vdGU8InRvIG1hdGNoIHRoaXMgJyUwJyI+OworZGVmIG5vdGVfbWF0Y2hpbmcgOiBOb3RlPCJ0byBtYXRjaCB0aGlzICUwIj47CiAKIGRlZiBub3RlX3VzaW5nIDogTm90ZTwidXNpbmciPjsKIGRlZiBub3RlX3Bvc3NpYmlsaXR5IDogTm90ZTwib25lIHBvc3NpYmlsaXR5Ij47CkBAIC00MCw3ICs0MCw2IEBACiAKIGxldCBDYXRlZ29yeU5hbWUgPSAiTGV4aWNhbCBvciBQcmVwcm9jZXNzb3IgSXNzdWUiIGluIHsKIAotZGVmIGVycl9leHBlY3RlZF9jb2xvbiA6IEVycm9yPCJleHBlY3RlZCAnOiciPjsKIGRlZiBlcnJfZXhwZWN0ZWRfY29sb25fYWZ0ZXJfc2V0dGVyX25hbWUgOiBFcnJvcjwKICAgIm1ldGhvZCBuYW1lIHJlZmVyZW5jZWQgaW4gcHJvcGVydHkgc2V0dGVyIGF0dHJpYnV0ZSAiCiAgICJtdXN0IGVuZCB3aXRoICc6JyI+OwpAQCAtNjAsNiArNTksMTAgQEAKIAogbGV0IENhdGVnb3J5TmFtZSA9ICJQYXJzZSBJc3N1ZSIgaW4gewogCitkZWYgZXJyX2V4cGVjdGVkIDogRXJyb3I8ImV4cGVjdGVkICUwIj47CitkZWYgZXJyX2V4cGVjdGVkX2VpdGhlciA6IEVycm9yPCJleHBlY3RlZCAlMCBvciAlMSI+OworZGVmIGVycl9leHBlY3RlZF9hZnRlciA6IEVycm9yPCJleHBlY3RlZCAlMSBhZnRlciAlMCI+OworCiBkZWYgZXJyX3BhcmFtX3JlZGVmaW5pdGlvbiA6IEVycm9yPCJyZWRlZmluaXRpb24gb2YgcGFyYW1ldGVyICUwIj47CiBkZWYgd2Fybl9tZXRob2RfcGFyYW1fcmVkZWZpbml0aW9uIDogV2FybmluZzwicmVkZWZpbml0aW9uIG9mIG1ldGhvZCBwYXJhbWV0ZXIgJTAiPjsKIGRlZiB3YXJuX21ldGhvZF9wYXJhbV9kZWNsYXJhdGlvbiA6IFdhcm5pbmc8InJlZGVjbGFyYXRpb24gb2YgbWV0aG9kIHBhcmFtZXRlciAlMCI+LApAQCAtMTAxLDggKzEwNCw5IEBACiAgIEluR3JvdXA8Q1hYOThDb21wYXRQZWRhbnRpYz4sIERlZmF1bHRJZ25vcmU7CiBkZWYgZXJyX2ludGVnZXJfdG9vX2xhcmdlIDogRXJyb3I8CiAgICJpbnRlZ2VyIGNvbnN0YW50IGlzIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IHVuc2lnbmVkIGludGVnZXIgdHlwZSI+OwotZGVmIHdhcm5faW50ZWdlcl90b29fbGFyZ2VfZm9yX3NpZ25lZCA6IFdhcm5pbmc8Ci0gICJpbnRlZ2VyIGNvbnN0YW50IGlzIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IHNpZ25lZCBpbnRlZ2VyIHR5cGUiPjsKK2RlZiBleHRfaW50ZWdlcl90b29fbGFyZ2VfZm9yX3NpZ25lZCA6IEV4dFdhcm48CisgICJpbnRlZ2VyIGNvbnN0YW50IGlzIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IHNpZ25lZCBpbnRlZ2VyIHR5cGUiPiwKKyAgSW5Hcm91cDxEaWFnR3JvdXA8ImltcGxpY2l0bHktdW5zaWduZWQtbGl0ZXJhbCI+PjsKIAogLy8gU2VtYSAmJiBBU1QKIGRlZiBub3RlX2ludmFsaWRfc3ViZXhwcl9pbl9jb25zdF9leHByIDogTm90ZTwKQEAgLTExNCw3ICsxMTgsNiBAQAogICAidW5rbm93biB0YXJnZXQgdHJpcGxlICclMCcsIHBsZWFzZSB1c2UgLXRyaXBsZSBvciAtYXJjaCI+OwogZGVmIGVycl90YXJnZXRfdW5rbm93bl9jcHUgOiBFcnJvcjwidW5rbm93biB0YXJnZXQgQ1BVICclMCciPjsKIGRlZiBlcnJfdGFyZ2V0X3Vua25vd25fYWJpIDogRXJyb3I8InVua25vd24gdGFyZ2V0IEFCSSAnJTAnIj47Ci1kZWYgZXJyX3RhcmdldF91bmtub3duX2N4eGFiaSA6IEVycm9yPCJ1bmtub3duIEMrKyBBQkkgJyUwJyI+OwogZGVmIGVycl90YXJnZXRfdW5rbm93bl9mcG1hdGggOiBFcnJvcjwidW5rbm93biBGUCB1bml0ICclMCciPjsKIGRlZiBlcnJfdGFyZ2V0X3Vuc3VwcG9ydGVkX2ZwbWF0aCA6IEVycm9yPAogICAgICJ0aGUgJyUwJyB1bml0IGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIGluc3RydWN0aW9uIHNldCI+OwpAQCAtMTMzLDQgKzEzNiwxNCBAQAogLy8gTW9kdWxlcwogZGVmIGVycl9tb2R1bGVfZmlsZV9jb25mbGljdCA6IEVycm9yPCJtb2R1bGUgJyUwJyBmb3VuZCBpbiBib3RoICclMScgYW5kICclMiciPjsKIAorLy8gVHJhbnNmb3JtQWN0aW9ucworLy8gVE9ETzogVXNlIGEgY3VzdG9tIGNhdGVnb3J5IG5hbWUgdG8gZGlzdGluZ3Vpc2ggcmV3cml0ZXIgZXJyb3JzLgorZGVmIGVycl9tdF9tZXNzYWdlIDogRXJyb3I8IltyZXdyaXRlcl0gJTAiPjsKK2RlZiB3YXJuX210X21lc3NhZ2UgOiBXYXJuaW5nPCJbcmV3cml0ZXJdICUwIj47CitkZWYgbm90ZV9tdF9tZXNzYWdlIDogTm90ZTwiW3Jld3JpdGVyXSAlMCI+OworCisvLyBBUkNNaWdyYXRlCitkZWYgZXJyX2FyY210X25zYWxsb2NfcmVhbGxvYyA6IEVycm9yPCJbcmV3cml0ZXJdIGNhbGwgcmV0dXJucyBwb2ludGVyIHRvIEdDIG1hbmFnZWQgbWVtb3J5OyBpdCB3aWxsIGJlY29tZSB1bm1hbmFnZWQgaW4gQVJDIj47CitkZWYgZXJyX2FyY210X25zaW52b2NhdGlvbl9vd25lcnNoaXAgOiBFcnJvcjwiTlNJbnZvY2F0aW9uJ3MgJTAgaXMgbm90IHNhZmUgdG8gYmUgdXNlZCB3aXRoIGFuIG9iamVjdCB3aXRoIG93bmVyc2hpcCBvdGhlciB0aGFuIF9fdW5zYWZlX3VucmV0YWluZWQiPjsKKwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljRHJpdmVyS2luZHMudGQgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNEcml2ZXJLaW5kcy50ZAppbmRleCBiNDg5ODA3Li43MTA4MGJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNEcml2ZXJLaW5kcy50ZAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNEcml2ZXJLaW5kcy50ZApAQCAtMTcsNiArMTcsOCBAQAogICAidW5zdXBwb3J0ZWQgYXJndW1lbnQgJyUxJyB0byBvcHRpb24gJyUwJyI+OwogZGVmIGVycl9kcnZfdW5rbm93bl9zdGRpbl90eXBlIDogRXJyb3I8CiAgICItRSBvciAteCByZXF1aXJlZCB3aGVuIGlucHV0IGlzIGZyb20gc3RhbmRhcmQgaW5wdXQiPjsKK2RlZiBlcnJfZHJ2X3Vua25vd25fc3RkaW5fdHlwZV9jbGFuZ19jbCA6IEVycm9yPAorICAidXNlIC9UYyBvciAvVHAgdG8gc2V0IGlucHV0IHR5cGUgZm9yIHN0YW5kYXJkIGlucHV0Ij47CiBkZWYgZXJyX2Rydl91bmtub3duX2xhbmd1YWdlIDogRXJyb3I8Imxhbmd1YWdlIG5vdCByZWNvZ25pemVkOiAnJTAnIj47CiBkZWYgZXJyX2Rydl9pbnZhbGlkX2FyY2hfbmFtZSA6IEVycm9yPAogICAiaW52YWxpZCBhcmNoIG5hbWUgJyUwJyI+OwpAQCAtMTA5LDggKzExMSw2IEBACiAgICJ1bmtub3duIG9yIGlsbC1mb3JtZWQgT2JqZWN0aXZlLUMgcnVudGltZSAnJTAnIj47CiBkZWYgZXJyX2Rydl9lbWl0X2xsdm1fbGluayA6IEVycm9yPAogICAgIi1lbWl0LWxsdm0gY2Fubm90IGJlIHVzZWQgd2hlbiBsaW5raW5nIj47Ci1kZWYgZXJyX2Rydl91bmtub3duX3Rvb2xjaGFpbiA6IEVycm9yPAotICAiY2Fubm90IHJlY29nbml6ZSB0aGUgdHlwZSBvZiB0aGUgdG9vbGNoYWluIj47CiAKIGRlZiB3YXJuX080X2lzX08zIDogV2FybmluZzwiLU80IGlzIGVxdWl2YWxlbnQgdG8gLU8zIj4sIEluR3JvdXA8RGVwcmVjYXRlZD47CiBkZWYgd2Fybl9kcnZfb3B0aW1pemF0aW9uX3ZhbHVlIDogV2FybmluZzwib3B0aW1pemF0aW9uIGxldmVsICclMCcgaXMgdW5zdXBwb3J0ZWQ7IHVzaW5nICclMSUyJyBpbnN0ZWFkIj4sCkBAIC0xMzYsOCArMTM2LDYgQEAKICAgSW5Hcm91cDxVbnVzZWRTYW5pdGl6ZUFyZ3VtZW50PjsKIGRlZiB3YXJuX2Rydl9jbGFuZ191bnN1cHBvcnRlZCA6IFdhcm5pbmc8CiAgICJ0aGUgY2xhbmcgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCAnJTAnIj47Ci1kZWYgd2Fybl9kcnZfZGVwcmVjYXRlZF9hcmcgOiBXYXJuaW5nPAotICAiYXJndW1lbnQgJyUwJyBpcyBkZXByZWNhdGVkLCB1c2UgJyUxJyBpbnN0ZWFkIj4sIEluR3JvdXA8RGVwcmVjYXRlZD47CiBkZWYgd2Fybl9kcnZfYXNzdW1pbmdfbWZsb2F0X2FiaV9pcyA6IFdhcm5pbmc8CiAgICJ1bmtub3duIHBsYXRmb3JtLCBhc3N1bWluZyAtbWZsb2F0LWFiaT0lMCI+OwogZGVmIHdhcm5faWdub3JpbmdfZnRhYnN0b3BfdmFsdWUgOiBXYXJuaW5nPApAQCAtMTU0LDYgKzE1Miw4IEBACiAgICJwcmVjb21waWxlZCBoZWFkZXIgJyUwJyB3YXMgaWdub3JlZCBiZWNhdXNlICclMScgaXMgbm90IGZpcnN0ICctaW5jbHVkZSciPjsKIGRlZiB3YXJuX21pc3Npbmdfc3lzcm9vdCA6IFdhcm5pbmc8Im5vIHN1Y2ggc3lzcm9vdCBkaXJlY3Rvcnk6ICclMCciPiwKICAgSW5Hcm91cDxEaWFnR3JvdXA8Im1pc3Npbmctc3lzcm9vdCI+PjsKK2RlZiB3YXJuX2RlYnVnX2NvbXByZXNzaW9uX3VuYXZhaWxhYmxlIDogV2FybmluZzwiY2Fubm90IGNvbXByZXNzIGRlYnVnIHNlY3Rpb25zICh6bGliIG5vdCBpbnN0YWxsZWQpIj4sCisgIEluR3JvdXA8RGlhZ0dyb3VwPCJkZWJ1Zy1jb21wcmVzc2lvbi11bmF2YWlsYWJsZSI+PjsKIAogZGVmIG5vdGVfZHJ2X2NvbW1hbmRfZmFpbGVkX2RpYWdfbXNnIDogTm90ZTwKICAgImRpYWdub3N0aWMgbXNnOiAlMCI+OwpAQCAtMTY0LDQgKzE2NCwxMSBAQAogICAiYW5hbHl6ZXItY29uZmlnIG9wdGlvbiAnJTAnIGhhcyBhIGtleSBidXQgbm8gdmFsdWUiPjsKIGRlZiBlcnJfYW5hbHl6ZXJfY29uZmlnX211bHRpcGxlX3ZhbHVlcyA6IEVycm9yPAogICAiYW5hbHl6ZXItY29uZmlnIG9wdGlvbiAnJTAnIHNob3VsZCBjb250YWluIG9ubHkgb25lICc9JyI+OworCitkZWYgZXJyX2Rydl9tb2R1bGVzX3ZhbGlkYXRlX29uY2VfcmVxdWlyZXNfdGltZXN0YW1wIDogRXJyb3I8CisgICJvcHRpb24gJy1mbW9kdWxlcy12YWxpZGF0ZS1vbmNlLXBlci1idWlsZC1zZXNzaW9uJyByZXF1aXJlcyAiCisgICInLWZidWlsZC1zZXNzaW9uLXRpbWVzdGFtcD08c2Vjb25kcyBzaW5jZSBFcG9jaD4nIj47CisKK2RlZiB3YXJuX2Rydl9pbnZva2luZ19mYWxsYmFjayA6IFdhcm5pbmc8ImZhbGxpbmcgYmFjayB0byAlMCI+LAorICBJbkdyb3VwPERpYWdHcm91cDwiZmFsbGJhY2siPj47CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNGcm9udGVuZEtpbmRzLnRkIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljRnJvbnRlbmRLaW5kcy50ZAppbmRleCBiY2YzYzQxLi4zMmM4MjRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNGcm9udGVuZEtpbmRzLnRkCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0Zyb250ZW5kS2luZHMudGQKQEAgLTE2LDExICsxNiwyMSBAQAogCiAvLyBFcnJvciBnZW5lcmF0ZWQgYnkgdGhlIGJhY2tlbmQuCiBkZWYgZXJyX2ZlX2lubGluZV9hc20gOiBFcnJvcjwiJTAiPiwgQ2F0SW5saW5lQXNtOworZGVmIHdhcm5fZmVfaW5saW5lX2FzbSA6IFdhcm5pbmc8IiUwIj4sIENhdElubGluZUFzbSwgSW5Hcm91cDxCYWNrZW5kSW5saW5lQXNtPjsKK2RlZiBub3RlX2ZlX2lubGluZV9hc20gOiBOb3RlPCIlMCI+LCBDYXRJbmxpbmVBc207CiBkZWYgbm90ZV9mZV9pbmxpbmVfYXNtX2hlcmUgOiBOb3RlPCJpbnN0YW50aWF0ZWQgaW50byBhc3NlbWJseSBoZXJlIj47CiBkZWYgZXJyX2ZlX2Nhbm5vdF9saW5rX21vZHVsZSA6IEVycm9yPCJjYW5ub3QgbGluayBtb2R1bGUgJyUwJzogJTEiPiwKICAgRGVmYXVsdEZhdGFsOwogCitkZWYgd2Fybl9mZV9iYWNrZW5kX2ZyYW1lX2xhcmdlcl90aGFuOiBXYXJuaW5nPCJzdGFjayBzaXplIGV4Y2VlZGVkICglMCkgaW4gJTEiPiwKKyAgICBDYXRCYWNrZW5kLCBJbkdyb3VwPEJhY2tlbmRGcmFtZUxhcmdlclRoYW4+OworZGVmIGVycl9mZV9iYWNrZW5kX2ZyYW1lX2xhcmdlcl90aGFuOiBFcnJvcjwiJTAiPiwgQ2F0QmFja2VuZDsKK2RlZiBub3RlX2ZlX2JhY2tlbmRfZnJhbWVfbGFyZ2VyX3RoYW46IE5vdGU8IiUwIj4sIENhdEJhY2tlbmQ7CiAKK2RlZiB3YXJuX2ZlX2JhY2tlbmRfcGx1Z2luOiBXYXJuaW5nPCIlMCI+LCBDYXRCYWNrZW5kLCBJbkdyb3VwPEJhY2tlbmRQbHVnaW4+OworZGVmIGVycl9mZV9iYWNrZW5kX3BsdWdpbjogRXJyb3I8IiUwIj4sIENhdEJhY2tlbmQ7CitkZWYgcmVtYXJrX2ZlX2JhY2tlbmRfcGx1Z2luOiBSZW1hcms8IiUwIj4sIENhdEJhY2tlbmQsIEluR3JvdXA8UmVtYXJrQmFja2VuZFBsdWdpbj47CitkZWYgbm90ZV9mZV9iYWNrZW5kX3BsdWdpbjogTm90ZTwiJTAiPiwgQ2F0QmFja2VuZDsKIAogZGVmIGVycl9mZV9pbnZhbGlkX2NvZGVfY29tcGxldGVfZmlsZSA6IEVycm9yPAogICAgICJjYW5ub3QgbG9jYXRlIGNvZGUtY29tcGxldGlvbiBmaWxlICUwIj4sIERlZmF1bHRGYXRhbDsKQEAgLTc3LDYgKzg3LDggQEAKICAgICAiY2Fubm90IGZpbmQgZW5kICgnfX0nKSBvZiBleHBlY3RlZCAlMCI+OwogZGVmIGVycl92ZXJpZnlfaW52YWxpZF9jb250ZW50IDogRXJyb3I8CiAgICAgImludmFsaWQgZXhwZWN0ZWQgJTA6ICUxIj47CitkZWYgZXJyX3ZlcmlmeV9taXNzaW5nX3JlZ2V4IDogRXJyb3I8CisgICAgImNhbm5vdCBmaW5kIHN0YXJ0IG9mIHJlZ2V4ICgne3snKSBpbiAlMCI+OwogZGVmIGVycl92ZXJpZnlfaW5jb25zaXN0ZW50X2RpYWdzIDogRXJyb3I8CiAgICAgIiclMCcgZGlhZ25vc3RpY3MgJXNlbGVjdHtleHBlY3RlZHxzZWVufTEgYnV0IG5vdCAlc2VsZWN0e3NlZW58ZXhwZWN0ZWR9MTogIgogICAgICIlMiI+OwpAQCAtMTM4LDYgKzE1MCwxMCBAQAogICBJbkdyb3VwPEluY29tcGxldGVVbWJyZWxsYT47CiBkZWYgZXJyX21vZHVsZV91bmF2YWlsYWJsZSA6IEVycm9yPAogICAibW9kdWxlICclMCcgJXNlbGVjdHtpcyBpbmNvbXBhdGlibGUgd2l0aHxyZXF1aXJlc30xIGZlYXR1cmUgJyUyJyI+OworZGVmIGVycl9tb2R1bGVfaGVhZGVyX21pc3NpbmcgOiBFcnJvcjwKKyAgIiVzZWxlY3R7fHVtYnJlbGxhIH0waGVhZGVyICclMScgbm90IGZvdW5kIj47CitkZWYgZXJyX21vZHVsZV9jYW5ub3RfY3JlYXRlX2luY2x1ZGVzIDogRXJyb3I8CisgICJjYW5ub3QgY3JlYXRlIGluY2x1ZGVzIGZpbGUgZm9yIG1vZHVsZSAlMDogJTEiPjsKIGRlZiB3YXJuX21vZHVsZV9jb25maWdfbWFjcm9fdW5kZWYgOiBXYXJuaW5nPAogICAiJXNlbGVjdHtkZWZpbml0aW9ufCN1bmRlZn0wIG9mIGNvbmZpZ3VyYXRpb24gbWFjcm8gJyUxJyBoYXMgbm8gZWZmZWN0IG9uICIKICAgInRoZSBpbXBvcnQgb2YgJyUyJzsgcGFzcyAnJXNlbGVjdHstRCUxPS4uLnwtVSUxfTAnIG9uIHRoZSBjb21tYW5kIGxpbmUgIgpAQCAtMTQ1LDQgKzE2MSw5IEBACiAgIEluR3JvdXA8Q29uZmlnTWFjcm9zPjsKIGRlZiBub3RlX21vZHVsZV9kZWZfdW5kZWZfaGVyZSA6IE5vdGU8CiAgICJtYWNybyB3YXMgJXNlbGVjdHtkZWZpbmVkfCN1bmRlZidkfTAgaGVyZSI+OworCitkZWYgZXJyX21pc3NpbmdfdmZzX292ZXJsYXlfZmlsZSA6IEVycm9yPAorICAidmlydHVhbCBmaWxlc3lzdGVtIG92ZXJsYXkgZmlsZSAnJTAnIG5vdCBmb3VuZCI+LCBEZWZhdWx0RmF0YWw7CitkZWYgZXJyX2ludmFsaWRfdmZzX292ZXJsYXkgOiBFcnJvcjwKKyAgImludmFsaWQgdmlydHVhbCBmaWxlc3lzdGVtIG92ZXJsYXkgZmlsZSAnJTAnIj4sIERlZmF1bHRGYXRhbDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0dyb3Vwcy50ZCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0dyb3Vwcy50ZAppbmRleCBiMGQwMjE2Li41ZGY3NDBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNHcm91cHMudGQKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljR3JvdXBzLnRkCkBAIC0xOCw3ICsxOCw3IEBACiAKIC8vIEVtcHR5IERpYWdHcm91cHMgYXJlIHJlY29nbml6ZWQgYnkgY2xhbmcgYnV0IGlnbm9yZWQuCiBkZWYgOiBEaWFnR3JvdXA8ImFiaSI+OwotZGVmIDogRGlhZ0dyb3VwPCJhZGRyZXNzIj47CitkZWYgQWJzb2x1dGVWYWx1ZSA6IERpYWdHcm91cDwiYWJzb2x1dGUtdmFsdWUiPjsKIGRlZiBBZGRyZXNzT2ZUZW1wb3JhcnkgOiBEaWFnR3JvdXA8ImFkZHJlc3Mtb2YtdGVtcG9yYXJ5Ij47CiBkZWYgOiBEaWFnR3JvdXA8ImFnZ3JlZ2F0ZS1yZXR1cm4iPjsKIGRlZiBHTlVBbGlnbm9mRXhwcmVzc2lvbiA6IERpYWdHcm91cDwiZ251LWFsaWdub2YtZXhwcmVzc2lvbiI+OwpAQCAtMzcsMTMgKzM3LDE2IEBACiBkZWYgTGl0ZXJhbENvbnZlcnNpb24gOiBEaWFnR3JvdXA8ImxpdGVyYWwtY29udmVyc2lvbiI+OwogZGVmIFN0cmluZ0NvbnZlcnNpb24gOiBEaWFnR3JvdXA8InN0cmluZy1jb252ZXJzaW9uIj47CiBkZWYgU2lnbkNvbnZlcnNpb24gOiBEaWFnR3JvdXA8InNpZ24tY29udmVyc2lvbiI+OwotZGVmIEJvb2xDb252ZXJzaW9uIDogRGlhZ0dyb3VwPCJib29sLWNvbnZlcnNpb24iPjsKK2RlZiBQb2ludGVyQm9vbENvbnZlcnNpb24gOiBEaWFnR3JvdXA8InBvaW50ZXItYm9vbC1jb252ZXJzaW9uIj47CitkZWYgQm9vbENvbnZlcnNpb24gOiBEaWFnR3JvdXA8ImJvb2wtY29udmVyc2lvbiIsIFsgUG9pbnRlckJvb2xDb252ZXJzaW9uIF0gPjsKIGRlZiBJbnRDb252ZXJzaW9uIDogRGlhZ0dyb3VwPCJpbnQtY29udmVyc2lvbiI+OwogZGVmIEVudW1Db252ZXJzaW9uIDogRGlhZ0dyb3VwPCJlbnVtLWNvbnZlcnNpb24iPjsKK2RlZiBFbnVtVG9vTGFyZ2UgOiBEaWFnR3JvdXA8ImVudW0tdG9vLWxhcmdlIj47CiBkZWYgTm9uTGl0ZXJhbE51bGxDb252ZXJzaW9uIDogRGlhZ0dyb3VwPCJub24tbGl0ZXJhbC1udWxsLWNvbnZlcnNpb24iPjsKIGRlZiBOdWxsQ29udmVyc2lvbiA6IERpYWdHcm91cDwibnVsbC1jb252ZXJzaW9uIj47CiBkZWYgSW1wbGljaXRDb252ZXJzaW9uRmxvYXRpbmdQb2ludFRvQm9vbCA6CiAgIERpYWdHcm91cDwiaW1wbGljaXQtY29udmVyc2lvbi1mbG9hdGluZy1wb2ludC10by1ib29sIj47CitkZWYgT2JqQ0xpdGVyYWxDb252ZXJzaW9uIDogRGlhZ0dyb3VwPCJvYmpjLWxpdGVyYWwtY29udmVyc2lvbiI+OwogZGVmIEJhZEFycmF5TmV3TGVuZ3RoIDogRGlhZ0dyb3VwPCJiYWQtYXJyYXktbmV3LWxlbmd0aCI+OwogZGVmIEJ1aWx0aW5NYWNyb1JlZGVmaW5lZCA6IERpYWdHcm91cDwiYnVpbHRpbi1tYWNyby1yZWRlZmluZWQiPjsKIGRlZiBCdWlsdGluUmVxdWlyZXNIZWFkZXIgOiBEaWFnR3JvdXA8ImJ1aWx0aW4tcmVxdWlyZXMtaGVhZGVyIj47CkBAIC03MSw2ICs3NCw3IEBACiAgIERpYWdHcm91cDwiYysrMTEtY29tcGF0LWRlcHJlY2F0ZWQtd3JpdGFibGUtc3RyaW5ncyI+OwogCiBkZWYgRGVwcmVjYXRlZERlY2xhcmF0aW9ucyA6IERpYWdHcm91cDwiZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiPjsKK2RlZiBVbmF2YWlsYWJsZURlY2xhcmF0aW9ucyA6IERpYWdHcm91cDwidW5hdmFpbGFibGUtZGVjbGFyYXRpb25zIj47CiBkZWYgRGVwcmVjYXRlZEltcGxlbWVudGF0aW9ucyA6RGlhZ0dyb3VwPCJkZXByZWNhdGVkLWltcGxlbWVudGF0aW9ucyI+OwogZGVmIERlcHJlY2F0ZWRJbmNyZW1lbnRCb29sIDogRGlhZ0dyb3VwPCJkZXByZWNhdGVkLWluY3JlbWVudC1ib29sIj47CiBkZWYgRGVwcmVjYXRlZFJlZ2lzdGVyIDogRGlhZ0dyb3VwPCJkZXByZWNhdGVkLXJlZ2lzdGVyIj47CkBAIC0xNjgsOSArMTcyLDExIEBACiBkZWYgRGFuZ2xpbmdFbHNlOiBEaWFnR3JvdXA8ImRhbmdsaW5nLWVsc2UiPjsKIGRlZiBEYW5nbGluZ0ZpZWxkIDogRGlhZ0dyb3VwPCJkYW5nbGluZy1maWVsZCI+OwogZGVmIERpc3RyaWJ1dGVkT2JqZWN0TW9kaWZpZXJzIDogRGlhZ0dyb3VwPCJkaXN0cmlidXRlZC1vYmplY3QtbW9kaWZpZXJzIj47CitkZWYgSW5maW5pdGVSZWN1cnNpb24gOiBEaWFnR3JvdXA8ImluZmluaXRlLXJlY3Vyc2lvbiI+OwogZGVmIEdOVUltYWdpbmFyeUNvbnN0YW50IDogRGlhZ0dyb3VwPCJnbnUtaW1hZ2luYXJ5LWNvbnN0YW50Ij47CiBkZWYgSWdub3JlZFF1YWxpZmllcnMgOiBEaWFnR3JvdXA8Imlnbm9yZWQtcXVhbGlmaWVycyI+OwogZGVmIDogRGlhZ0dyb3VwPCJpbXBvcnQiPjsKK2RlZiBJbmNvbXBhdGlibGVNU1N0cnVjdCA6IERpYWdHcm91cDwiaW5jb21wYXRpYmxlLW1zLXN0cnVjdCI+OwogZGVmIEluY29tcGF0aWJsZVBvaW50ZXJUeXBlc0Rpc2NhcmRzUXVhbGlmaWVycyAKICAgOiBEaWFnR3JvdXA8ImluY29tcGF0aWJsZS1wb2ludGVyLXR5cGVzLWRpc2NhcmRzLXF1YWxpZmllcnMiPjsKIGRlZiBJbmNvbXBhdGlibGVQb2ludGVyVHlwZXMKQEAgLTIxNCwxNiArMjIwLDE4IEBACiBkZWYgSW5pdGlhbGl6ZXJPdmVycmlkZXMgOiBEaWFnR3JvdXA8ImluaXRpYWxpemVyLW92ZXJyaWRlcyI+OwogZGVmIE5vbk51bGwgOiBEaWFnR3JvdXA8Im5vbm51bGwiPjsKIGRlZiBOb25QT0RWYXJhcmdzIDogRGlhZ0dyb3VwPCJub24tcG9kLXZhcmFyZ3MiPjsKK2RlZiBDbGFzc1ZhcmFyZ3MgOiBEaWFnR3JvdXA8ImNsYXNzLXZhcmFyZ3MiLCBbTm9uUE9EVmFyYXJnc10+OwogZGVmIDogRGlhZ0dyb3VwPCJub25wb3J0YWJsZS1jZnN0cmluZ3MiPjsKIGRlZiBOb25WaXJ0dWFsRHRvciA6IERpYWdHcm91cDwibm9uLXZpcnR1YWwtZHRvciI+OwogZGVmIE92ZXJhbGlnbmVkVHlwZSA6IERpYWdHcm91cDwib3Zlci1hbGlnbmVkIj47Ci1kZWYgOiBEaWFnR3JvdXA8Im9sZC1zdHlsZS1jYXN0Ij47CitkZWYgT2xkU3R5bGVDYXN0IDogRGlhZ0dyb3VwPCJvbGQtc3R5bGUtY2FzdCI+OwogZGVmIDogRGlhZ0dyb3VwPCJvbGQtc3R5bGUtZGVmaW5pdGlvbiI+OwogZGVmIE91dE9mTGluZURlY2xhcmF0aW9uIDogRGlhZ0dyb3VwPCJvdXQtb2YtbGluZS1kZWNsYXJhdGlvbiI+OwogZGVmIDogRGlhZ0dyb3VwPCJvdmVyZmxvdyI+OwogZGVmIEZvcndhcmRDbGFzc1JlY2VpdmVyIDogRGlhZ0dyb3VwPCJyZWNlaXZlci1mb3J3YXJkLWNsYXNzIj47CiBkZWYgTWV0aG9kQWNjZXNzIDogRGlhZ0dyb3VwPCJvYmpjLW1ldGhvZC1hY2Nlc3MiPjsKIGRlZiBPYmpDUmVjZWl2ZXIgOiBEaWFnR3JvdXA8InJlY2VpdmVyLWV4cHIiPjsKK2RlZiBPcGVyYXRvck5ld1JldHVybnNOdWxsIDogRGlhZ0dyb3VwPCJuZXctcmV0dXJucy1udWxsIj47CiBkZWYgT3Zlcmxlbmd0aFN0cmluZ3MgOiBEaWFnR3JvdXA8Im92ZXJsZW5ndGgtc3RyaW5ncyI+OwogZGVmIE92ZXJsb2FkZWRWaXJ0dWFsIDogRGlhZ0dyb3VwPCJvdmVybG9hZGVkLXZpcnR1YWwiPjsKIGRlZiBQcml2YXRlRXh0ZXJuIDogRGlhZ0dyb3VwPCJwcml2YXRlLWV4dGVybiI+OwpAQCAtMjMyLDYgKzI0MCw3IEBACiBkZWYgT2JqQ1Byb3BlcnR5SW1wbCA6IERpYWdHcm91cDwib2JqYy1wcm9wZXJ0eS1pbXBsZW1lbnRhdGlvbiI+OwogZGVmIE9iakNQcm9wZXJ0eU5vQXR0cmlidXRlIDogRGlhZ0dyb3VwPCJvYmpjLXByb3BlcnR5LW5vLWF0dHJpYnV0ZSI+OwogZGVmIE9iakNNaXNzaW5nU3VwZXJDYWxscyA6IERpYWdHcm91cDwib2JqYy1taXNzaW5nLXN1cGVyLWNhbGxzIj47CitkZWYgT2JqQ0Rlc2lnbmF0ZWRJbml0IDogRGlhZ0dyb3VwPCJvYmpjLWRlc2lnbmF0ZWQtaW5pdGlhbGl6ZXJzIj47CiBkZWYgT2JqQ1JldGFpbkJsb2NrUHJvcGVydHkgOiBEaWFnR3JvdXA8Im9iamMtbm9uY29weS1yZXRhaW4tYmxvY2stcHJvcGVydHkiPjsKIGRlZiBPYmpDUmVhZG9ubHlQcm9wZXJ0eUhhc1NldHRlciA6IERpYWdHcm91cDwib2JqYy1yZWFkb25seS13aXRoLXNldHRlci1wcm9wZXJ0eSI+OwogZGVmIE9iakNJbnZhbGlkSUJPdXRsZXRQcm9wZXJ0eSA6IERpYWdHcm91cDwiaW52YWxpZC1pYm91dGxldCI+OwpAQCAtMjc1LDEyICsyODQsMTUgQEAKIGRlZiBHTlVTdGF0aWNGbG9hdEluaXQgOiBEaWFnR3JvdXA8ImdudS1zdGF0aWMtZmxvYXQtaW5pdCI+OwogZGVmIFN0YXRpY0Zsb2F0SW5pdCA6IERpYWdHcm91cDwic3RhdGljLWZsb2F0LWluaXQiLCBbR05VU3RhdGljRmxvYXRJbml0XT47CiBkZWYgR05VU3RhdGVtZW50RXhwcmVzc2lvbiA6IERpYWdHcm91cDwiZ251LXN0YXRlbWVudC1leHByZXNzaW9uIj47CitkZWYgU3RyaW5nQ29tcGFyZSA6IERpYWdHcm91cDwic3RyaW5nLWNvbXBhcmUiPjsKIGRlZiBTdHJpbmdQbHVzSW50IDogRGlhZ0dyb3VwPCJzdHJpbmctcGx1cy1pbnQiPjsKIGRlZiBTdHJpbmdQbHVzQ2hhciA6IERpYWdHcm91cDwic3RyaW5nLXBsdXMtY2hhciI+OwogZGVmIFN0cm5jYXRTaXplIDogRGlhZ0dyb3VwPCJzdHJuY2F0LXNpemUiPjsKIGRlZiBUYXV0b2xvZ2ljYWxPdXRPZlJhbmdlQ29tcGFyZSA6IERpYWdHcm91cDwidGF1dG9sb2dpY2FsLWNvbnN0YW50LW91dC1vZi1yYW5nZS1jb21wYXJlIj47CitkZWYgVGF1dG9sb2dpY2FsUG9pbnRlckNvbXBhcmUgOiBEaWFnR3JvdXA8InRhdXRvbG9naWNhbC1wb2ludGVyLWNvbXBhcmUiPjsKIGRlZiBUYXV0b2xvZ2ljYWxDb21wYXJlIDogRGlhZ0dyb3VwPCJ0YXV0b2xvZ2ljYWwtY29tcGFyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVGF1dG9sb2dpY2FsT3V0T2ZSYW5nZUNvbXBhcmVdPjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtUYXV0b2xvZ2ljYWxPdXRPZlJhbmdlQ29tcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXV0b2xvZ2ljYWxQb2ludGVyQ29tcGFyZV0+OwogZGVmIEhlYWRlckh5Z2llbmUgOiBEaWFnR3JvdXA8ImhlYWRlci1oeWdpZW5lIj47CiBkZWYgRHVwbGljYXRlRGVjbFNwZWNpZmllciA6IERpYWdHcm91cDwiZHVwbGljYXRlLWRlY2wtc3BlY2lmaWVyIj47CiBkZWYgQ29tcGFyZURpc3RpbmN0UG9pbnRlclR5cGUgOiBEaWFnR3JvdXA8ImNvbXBhcmUtZGlzdGluY3QtcG9pbnRlci10eXBlcyI+OwpAQCAtMzE1LDYgKzMyNyw3IEBACiBkZWYgU3RyaWN0U2VsZWN0b3IgOiBEaWFnR3JvdXA8InN0cmljdC1zZWxlY3Rvci1tYXRjaCI+OwogZGVmIE1ldGhvZER1cGxpY2F0ZSA6IERpYWdHcm91cDwiZHVwbGljYXRlLW1ldGhvZC1tYXRjaCI+OwogZGVmIENvdmVyZWRTd2l0Y2hEZWZhdWx0IDogRGlhZ0dyb3VwPCJjb3ZlcmVkLXN3aXRjaC1kZWZhdWx0Ij47CitkZWYgU3dpdGNoQm9vbCAgICAgOiBEaWFnR3JvdXA8InN3aXRjaC1ib29sIj47CiBkZWYgU3dpdGNoRW51bSAgICAgOiBEaWFnR3JvdXA8InN3aXRjaC1lbnVtIj47CiBkZWYgU3dpdGNoICAgICAgICAgOiBEaWFnR3JvdXA8InN3aXRjaCI+OwogZGVmIEltcGxpY2l0RmFsbHRocm91Z2hQZXJGdW5jdGlvbiA6CkBAIC0zMzQsMTAgKzM0NywxNCBAQAogZGVmIFVuaW5pdGlhbGl6ZWQgIDogRGlhZ0dyb3VwPCJ1bmluaXRpYWxpemVkIiwgW1VuaW5pdGlhbGl6ZWRTb21ldGltZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pbml0aWFsaXplZFN0YXRpY1NlbGZJbml0XT47CiBkZWYgVW5rbm93blByYWdtYXMgOiBEaWFnR3JvdXA8InVua25vd24tcHJhZ21hcyI+OworZGVmIElnbm9yZWRQcmFnbWFzIDogRGlhZ0dyb3VwPCJpZ25vcmVkLXByYWdtYXMiPjsKK2RlZiBQcmFnbWFzIDogRGlhZ0dyb3VwPCJwcmFnbWFzIiwgW1Vua25vd25QcmFnbWFzLCBJZ25vcmVkUHJhZ21hc10+OwogZGVmIFVua25vd25XYXJuaW5nT3B0aW9uIDogRGlhZ0dyb3VwPCJ1bmtub3duLXdhcm5pbmctb3B0aW9uIj47CiBkZWYgTlNvYmplY3RBdHRyaWJ1dGUgOiBEaWFnR3JvdXA8Ik5TT2JqZWN0LWF0dHJpYnV0ZSI+OwotZGVmIFVua25vd25BdHRyaWJ1dGVzIDogRGlhZ0dyb3VwPCJhdHRyaWJ1dGVzIj47CitkZWYgVW5rbm93bkF0dHJpYnV0ZXMgOiBEaWFnR3JvdXA8InVua25vd24tYXR0cmlidXRlcyI+OwogZGVmIElnbm9yZWRBdHRyaWJ1dGVzIDogRGlhZ0dyb3VwPCJpZ25vcmVkLWF0dHJpYnV0ZXMiPjsKK2RlZiBBdHRyaWJ1dGVzIDogRGlhZ0dyb3VwPCJhdHRyaWJ1dGVzIiwgW1Vua25vd25BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZEF0dHJpYnV0ZXNdPjsKIGRlZiBVbm5hbWVkVHlwZVRlbXBsYXRlQXJncyA6IERpYWdHcm91cDwidW5uYW1lZC10eXBlLXRlbXBsYXRlLWFyZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtDWFg5OENvbXBhdFVubmFtZWRUeXBlVGVtcGxhdGVBcmdzXT47CiBkZWYgVW5zdXBwb3J0ZWRGcmllbmQgOiBEaWFnR3JvdXA8InVuc3VwcG9ydGVkLWZyaWVuZCI+OwpAQCAtMzY0LDcgKzM4MSw2IEBACiBkZWYgVW51c2VkUHJvcGVydHlJdmFyIDogIERpYWdHcm91cDwidW51c2VkLXByb3BlcnR5LWl2YXIiPjsKIGRlZiBVc2VkQnV0TWFya2VkVW51c2VkIDogRGlhZ0dyb3VwPCJ1c2VkLWJ1dC1tYXJrZWQtdW51c2VkIj47CiBkZWYgVXNlckRlZmluZWRMaXRlcmFscyA6IERpYWdHcm91cDwidXNlci1kZWZpbmVkLWxpdGVyYWxzIj47Ci1kZWYgUmVhZE9ubHlTZXR0ZXJBdHRycyA6IERpYWdHcm91cDwicmVhZG9ubHktc2V0dGVyLWF0dHJzIj47CiBkZWYgUmVvcmRlciA6IERpYWdHcm91cDwicmVvcmRlciI+OwogZGVmIFVuZGVjbGFyZWRTZWxlY3RvciA6IERpYWdHcm91cDwidW5kZWNsYXJlZC1zZWxlY3RvciI+OwogZGVmIEltcGxpY2l0QXRvbWljIDogRGlhZ0dyb3VwPCJpbXBsaWNpdC1hdG9taWMtcHJvcGVydGllcyI+OwpAQCAtMzg1LDYgKzQwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FSQ1JlcGVhdGVkVXNlT2ZXZWFrTWF5YmVdPjsKIGRlZiBPYmpDQnJpZGdlIDogRGlhZ0dyb3VwPCJicmlkZ2UtY2FzdCI+OwogCitkZWYgRGVhbGxvY0luQ2F0ZWdvcnk6RGlhZ0dyb3VwPCJkZWFsbG9jLWluLWNhdGVnb3J5Ij47CiBkZWYgU2VsZWN0b3JUeXBlTWlzbWF0Y2ggOiBEaWFnR3JvdXA8InNlbGVjdG9yLXR5cGUtbWlzbWF0Y2giPjsKIGRlZiBTZWxlY3RvciA6IERpYWdHcm91cDwic2VsZWN0b3IiLCBbU2VsZWN0b3JUeXBlTWlzbWF0Y2hdPjsKIGRlZiBQcm90b2NvbCA6IERpYWdHcm91cDwicHJvdG9jb2wiPjsKQEAgLTQwOCw4ICs0MjUsMjkgQEAKIGRlZiBMYXJnZUJ5VmFsdWVDb3B5IDogRGlhZ0dyb3VwPCJsYXJnZS1ieS12YWx1ZS1jb3B5Ij47CiBkZWYgRHVwbGljYXRlQXJnRGVjbCA6IERpYWdHcm91cDwiZHVwbGljYXRlLW1ldGhvZC1hcmciPjsKIAorLy8gVW5yZWFjaGFibGUgY29kZSB3YXJuaW5nIGdyb3Vwcy4KKy8vCisvLyAgVGhlIGdvYWwgaXMgbWFrZSAtV3VucmVhY2hhYmxlLWNvZGUgb24gYnkgZGVmYXVsdCwgaW4gLVdhbGwsIG9yIGF0CisvLyAgbGVhc3QgYWN0aXZlbHkgdXNlZCwgd2l0aCBtb3JlIG5vaXN5IHZlcnNpb25zIG9mIHRoZSB3YXJuaW5nIGNvdmVyZWQKKy8vICB1bmRlciBzZXBhcmF0ZSBmbGFncy4KKy8vCitkZWYgVW5yZWFjaGFibGVDb2RlTG9vcEluY3JlbWVudCA6IERpYWdHcm91cDwidW5yZWFjaGFibGUtY29kZS1sb29wLWluY3JlbWVudCI+OworZGVmIFVucmVhY2hhYmxlQ29kZSA6IERpYWdHcm91cDwidW5yZWFjaGFibGUtY29kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtVbnJlYWNoYWJsZUNvZGVMb29wSW5jcmVtZW50XT47CitkZWYgVW5yZWFjaGFibGVDb2RlQnJlYWsgOiBEaWFnR3JvdXA8InVucmVhY2hhYmxlLWNvZGUtYnJlYWsiPjsKK2RlZiBVbnJlYWNoYWJsZUNvZGVSZXR1cm4gOiBEaWFnR3JvdXA8InVucmVhY2hhYmxlLWNvZGUtcmV0dXJuIj47CitkZWYgVW5yZWFjaGFibGVDb2RlQWdncmVzc2l2ZSA6IERpYWdHcm91cDwidW5yZWFjaGFibGUtY29kZS1hZ2dyZXNzaXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtVbnJlYWNoYWJsZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZWFjaGFibGVDb2RlQnJlYWssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZWFjaGFibGVDb2RlUmV0dXJuXT47CisKIC8vIEFnZ3JlZ2F0aW9uIHdhcm5pbmcgc2V0dGluZ3MuCiAKKy8vIFBvcHVsYXRlIC1XYWRkcmVzcyB3aXRoIHdhcm5pbmdzIGZyb20gb3RoZXIgZ3JvdXBzLgorZGVmIDogRGlhZ0dyb3VwPCJhZGRyZXNzIiwgW1BvaW50ZXJCb29sQ29udmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhdXRvbG9naWNhbFBvaW50ZXJDb21wYXJlXT47CisKIC8vIC1XaWRpb21hdGljLXBhcmVudGhlc2VzIGNvbnRhaW5zIHdhcm5pbmdzIGFib3V0ICdpZGlvbWF0aWMnCiAvLyBtaXNzaW5nIHBhcmVudGhlc2VzOyAgaXQgaXMgb2ZmIGJ5IGRlZmF1bHQuICBXZSBkbyBub3QgaW5jbHVkZSBpdAogLy8gaW4gLVdwYXJlbnRoZXNlcyBiZWNhdXNlIG1vc3QgdXNlcnMgd2hvIHVzZSAtV3BhcmVudGhlc2VzIGV4cGxpY2l0bHkKQEAgLTQ0MCw2ICs0NzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdGVyYWxDb252ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbkxpdGVyYWxOdWxsQ29udmVyc2lvbiwgLy8gKDEtMSktPnBvaW50ZXIgKGV0YykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdWxsQ29udmVyc2lvbiwgLy8gTlVMTC0+bm9uLXBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTGl0ZXJhbENvbnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnbkNvbnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVyc2lvbl0+LAogICAgICAgICAgICAgICAgICBEaWFnQ2F0ZWdvcnk8IlZhbHVlIENvbnZlcnNpb24gSXNzdWUiPjsKQEAgLTQ2MSw3ICs1MDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBbRm9ybWF0RXh0cmFBcmdzLCBGb3JtYXRaZXJvTGVuZ3RoLCBOb25OdWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0U2VjdXJpdHksIEZvcm1hdFkySywgRm9ybWF0SW52YWxpZFNwZWNpZmllcl0+LAogICAgICAgICAgICAgIERpYWdDYXRlZ29yeTwiRm9ybWF0IFN0cmluZyBJc3N1ZSI+OwotZGVmIEZvcm1hdE5vbkxpdGVyYWwgOiBEaWFnR3JvdXA8ImZvcm1hdC1ub25saXRlcmFsIiwgW0Zvcm1hdFNlY3VyaXR5XT47CitkZWYgRm9ybWF0Tm9uTGl0ZXJhbCA6IERpYWdHcm91cDwiZm9ybWF0LW5vbmxpdGVyYWwiPjsKIGRlZiBGb3JtYXQyIDogRGlhZ0dyb3VwPCJmb3JtYXQ9MiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBbRm9ybWF0Tm9uTGl0ZXJhbCwgRm9ybWF0U2VjdXJpdHksIEZvcm1hdFkyS10+OwogCkBAIC01MDIsNiArNTQxLDcgQEAKICAgICBVbnVzZWQsCiAgICAgVm9sYXRpbGVSZWdpc3RlclZhciwKICAgICBPYmpDTWlzc2luZ1N1cGVyQ2FsbHMsCisgICAgT2JqQ0Rlc2lnbmF0ZWRJbml0LAogICAgIE92ZXJsb2FkZWRWaXJ0dWFsLAogICAgIFByaXZhdGVFeHRlcm4sCiAgICAgU2VsVHlwZUNhc3QsCkBAIC01MjQsNyArNTY0LDcgQEAKIC8vIE5vdGUgdGhhdCBwdXR0aW5nIHdhcm5pbmdzIGluIC1XYWxsIHdpbGwgbm90IGRpc2FibGUgdGhlbSBieSBkZWZhdWx0LiBJZiBhCiAvLyB3YXJuaW5nIHNob3VsZCBiZSBhY3RpdmUgX29ubHlfIHdoZW4gLVdhbGwgaXMgcGFzc2VkIGluLCBtYXJrIGl0IGFzCiAvLyBEZWZhdWx0SWdub3JlIGluIGFkZGl0aW9uIHRvIHB1dHRpbmcgaXQgaGVyZS4KLWRlZiA6IERpYWdHcm91cDwiYWxsIiwgW01vc3QsIFBhcmVudGhlc2VzLCBTd2l0Y2hdPjsKK2RlZiA6IERpYWdHcm91cDwiYWxsIiwgW01vc3QsIFBhcmVudGhlc2VzLCBTd2l0Y2gsIFN3aXRjaEJvb2xdPjsKIAogLy8gV2FybmluZ3MgZW5hYmxlZCBieSAtcGVkYW50aWMuICBUaGlzIGlzIG1hZ2ljYWxseSBmaWxsZWQgaW4gYnkgVGFibGVHZW4uCiBkZWYgUGVkYW50aWMgOiBEaWFnR3JvdXA8InBlZGFudGljIj47CkBAIC02MDgsOCArNjQ4LDYgQEAKICAgICBPYmpDU3RyaW5nQ29tcGFyaXNvbgogICBdPjsKIAotZGVmIE9iakNMaXRlcmFsTWlzc2luZ0F0U2lnbiA6IERpYWdHcm91cDwib2JqYy1saXRlcmFsLW1pc3NpbmctYXRzaWduIj47Ci0KIC8vIElubGluZSBBU00gd2FybmluZ3MuCiBkZWYgQVNNT3BlcmFuZFdpZHRocyA6IERpYWdHcm91cDwiYXNtLW9wZXJhbmQtd2lkdGhzIj47CiBkZWYgQVNNIDogRGlhZ0dyb3VwPCJhc20iLCBbCkBAIC02MTgsMyArNjU2LDkgQEAKIAogLy8gT3Blbk1QIHdhcm5pbmdzLgogZGVmIFNvdXJjZVVzZXNPcGVuTVAgOiBEaWFnR3JvdXA8InNvdXJjZS11c2VzLW9wZW5tcCI+OworCisvLyBCYWNrZW5kIHdhcm5pbmdzLgorZGVmIEJhY2tlbmRJbmxpbmVBc20gOiBEaWFnR3JvdXA8ImlubGluZS1hc20iPjsKK2RlZiBCYWNrZW5kRnJhbWVMYXJnZXJUaGFuIDogRGlhZ0dyb3VwPCJmcmFtZS1sYXJnZXItdGhhbiI+OworZGVmIEJhY2tlbmRQbHVnaW4gOiBEaWFnR3JvdXA8ImJhY2tlbmQtcGx1Z2luIj47CitkZWYgUmVtYXJrQmFja2VuZFBsdWdpbiA6IERpYWdHcm91cDwicmVtYXJrLWJhY2tlbmQtcGx1Z2luIj47CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNJRHMuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0lEcy5oCmluZGV4IDU2ZTMwZmIuLmY5Yjg0NTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0lEcy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0lEcy5oCkBAIC01NiwxNiArNTYsMTcgQEAKICAgICB9OwogCiAgICAgLy8vIEVudW0gdmFsdWVzIHRoYXQgYWxsb3cgdGhlIGNsaWVudCB0byBtYXAgTk9URXMsIFdBUk5JTkdzLCBhbmQgRVhURU5TSU9OcwotICAgIC8vLyB0byBlaXRoZXIgTUFQX0lHTk9SRSAobm90aGluZyksIE1BUF9XQVJOSU5HIChlbWl0IGEgd2FybmluZyksIE1BUF9FUlJPUgotICAgIC8vLyAoZW1pdCBhcyBhbiBlcnJvcikuICBJdCBhbGxvd3MgY2xpZW50cyB0byBtYXAgZXJyb3JzIHRvCi0gICAgLy8vIE1BUF9FUlJPUi9NQVBfREVGQVVMVCBvciBNQVBfRkFUQUwgKHN0b3AgZW1pdHRpbmcgZGlhZ25vc3RpY3MgYWZ0ZXIgdGhpcwotICAgIC8vLyBvbmUpLgorICAgIC8vLyB0byBlaXRoZXIgTUFQX0lHTk9SRSAobm90aGluZyksIE1BUF9SRU1BUksgKGVtaXQgYSByZW1hcmspLCBNQVBfV0FSTklORworICAgIC8vLyAoZW1pdCBhIHdhcm5pbmcpLCBNQVBfRVJST1IgKGVtaXQgYXMgYW4gZXJyb3IpLiAgSXQgYWxsb3dzIGNsaWVudHMgdG8KKyAgICAvLy8gbWFwIGVycm9ycyB0byBNQVBfRVJST1IvTUFQX0RFRkFVTFQgb3IgTUFQX0ZBVEFMIChzdG9wIGVtaXR0aW5nCisgICAgLy8vIGRpYWdub3N0aWNzIGFmdGVyIHRoaXMgb25lKS4KICAgICBlbnVtIE1hcHBpbmcgewogICAgICAgLy8gTk9URTogMCBtZWFucyAidW5jb21wdXRlZCIuCiAgICAgICBNQVBfSUdOT1JFICA9IDEsICAgICAvLy88IE1hcCB0aGlzIGRpYWdub3N0aWMgdG8gbm90aGluZywgaWdub3JlIGl0LgotICAgICAgTUFQX1dBUk5JTkcgPSAyLCAgICAgLy8vPCBNYXAgdGhpcyBkaWFnbm9zdGljIHRvIGEgd2FybmluZy4KLSAgICAgIE1BUF9FUlJPUiAgID0gMywgICAgIC8vLzwgTWFwIHRoaXMgZGlhZ25vc3RpYyB0byBhbiBlcnJvci4KLSAgICAgIE1BUF9GQVRBTCAgID0gNCAgICAgIC8vLzwgTWFwIHRoaXMgZGlhZ25vc3RpYyB0byBhIGZhdGFsIGVycm9yLgorICAgICAgTUFQX1JFTUFSSyAgPSAyLCAgICAgLy8vPCBNYXAgdGhpcyBkaWFnbm9zdGljIHRvIGEgcmVtYXJrLgorICAgICAgTUFQX1dBUk5JTkcgPSAzLCAgICAgLy8vPCBNYXAgdGhpcyBkaWFnbm9zdGljIHRvIGEgd2FybmluZy4KKyAgICAgIE1BUF9FUlJPUiAgID0gNCwgICAgIC8vLzwgTWFwIHRoaXMgZGlhZ25vc3RpYyB0byBhbiBlcnJvci4KKyAgICAgIE1BUF9GQVRBTCAgID0gNSAgICAgIC8vLzwgTWFwIHRoaXMgZGlhZ25vc3RpYyB0byBhIGZhdGFsIGVycm9yLgogICAgIH07CiAgIH0KIApAQCAtMTEzLDcgKzExNCw3IEBACiBwdWJsaWM6CiAgIC8vLyBcYnJpZWYgVGhlIGxldmVsIG9mIHRoZSBkaWFnbm9zdGljLCBhZnRlciBpdCBoYXMgYmVlbiB0aHJvdWdoIG1hcHBpbmcuCiAgIGVudW0gTGV2ZWwgewotICAgIElnbm9yZWQsIE5vdGUsIFdhcm5pbmcsIEVycm9yLCBGYXRhbAorICAgIElnbm9yZWQsIE5vdGUsIFJlbWFyaywgV2FybmluZywgRXJyb3IsIEZhdGFsCiAgIH07CiAKIHByaXZhdGU6CkBAIC0xMjQsMTEgKzEyNSwxNiBAQAogICBEaWFnbm9zdGljSURzKCk7CiAgIH5EaWFnbm9zdGljSURzKCk7CiAKLSAgLy8vIFxicmllZiBSZXR1cm4gYW4gSUQgZm9yIGEgZGlhZ25vc3RpYyB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgbGV2ZWwuCisgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIElEIGZvciBhIGRpYWdub3N0aWMgd2l0aCB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcgYW5kCisgIC8vLyBsZXZlbC4KICAgLy8vCiAgIC8vLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCByZXF1ZXN0IGZvciB0aGlzIGRpYWdub3N0aWMsIGl0IGlzIHJlZ2lzdGVyZWQgYW5kCiAgIC8vLyBjcmVhdGVkLCBvdGhlcndpc2UgdGhlIGV4aXN0aW5nIElEIGlzIHJldHVybmVkLgotICB1bnNpZ25lZCBnZXRDdXN0b21EaWFnSUQoTGV2ZWwgTCwgU3RyaW5nUmVmIE1lc3NhZ2UpOworCisgIC8vIEZJWE1FOiBSZXBsYWNlIHRoaXMgZnVuY3Rpb24gd2l0aCBhIGNyZWF0ZS1vbmx5IGZhY2lsdHkgbGlrZQorICAvLyBjcmVhdGVDdXN0b21EaWFnSURGcm9tRm9ybWF0U3RyaW5nKCkgdG8gZW5mb3JjZSBzYWZlIHVzYWdlLiBBdCB0aGUgdGltZSBvZgorICAvLyB3cml0aW5nLCBuZWFybHkgYWxsIGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbiB3ZXJlIGludmFsaWQuCisgIHVuc2lnbmVkIGdldEN1c3RvbURpYWdJRChMZXZlbCBMLCBTdHJpbmdSZWYgRm9ybWF0U3RyaW5nKTsKIAogICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KICAgLy8gRGlhZ25vc3RpYyBjbGFzc2lmaWNhdGlvbiBhbmQgcmVwb3J0aW5nIGludGVyZmFjZXMuCkBAIC0yNDcsMTUgKzI1MywxNSBAQAogICAvLy8KICAgLy8vIFxwYXJhbSBMb2MgVGhlIHNvdXJjZSBsb2NhdGlvbiBmb3Igd2hpY2ggd2UgYXJlIGludGVyZXN0ZWQgaW4gZmluZGluZyBvdXQKICAgLy8vIHRoZSBkaWFnbm9zdGljIHN0YXRlLiBDYW4gYmUgbnVsbCBpbiBvcmRlciB0byBxdWVyeSB0aGUgbGF0ZXN0IHN0YXRlLgotICBEaWFnbm9zdGljSURzOjpMZXZlbCBnZXREaWFnbm9zdGljTGV2ZWwodW5zaWduZWQgRGlhZ0lELCBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZykgY29uc3Q7CisgIERpYWdub3N0aWNJRHM6OkxldmVsCisgIGdldERpYWdub3N0aWNMZXZlbCh1bnNpZ25lZCBEaWFnSUQsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNzRW5naW5lICZEaWFnKSBjb25zdCBMTFZNX1JFQURPTkxZOwogCiAgIC8vLyBcYnJpZWYgQW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gaGVscGVyIHVzZWQgd2hlbiBccCBEaWFnQ2xhc3MgaXMKICAgLy8vIGFscmVhZHkga25vd24uCi0gIERpYWdub3N0aWNJRHM6OkxldmVsIGdldERpYWdub3N0aWNMZXZlbCh1bnNpZ25lZCBEaWFnSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaWFnQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZykgY29uc3Q7CisgIERpYWdub3N0aWNJRHM6OkxldmVsCisgIGdldERpYWdub3N0aWNMZXZlbCh1bnNpZ25lZCBEaWFnSUQsIHVuc2lnbmVkIERpYWdDbGFzcywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWcpIGNvbnN0IExMVk1fUkVBRE9OTFk7CiAKICAgLy8vIFxicmllZiBVc2VkIHRvIHJlcG9ydCBhIGRpYWdub3N0aWMgdGhhdCBpcyBmaW5hbGx5IGZ1bGx5IGZvcm1lZC4KICAgLy8vCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNMZXhLaW5kcy50ZCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0xleEtpbmRzLnRkCmluZGV4IDg3MWY1ZjYuLmUxZmM3MmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0xleEtpbmRzLnRkCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0xleEtpbmRzLnRkCkBAIC0xNTEsNyArMTUxLDggQEAKIC8vIExpdGVyYWwKIGRlZiBleHRfbm9uc3RhbmRhcmRfZXNjYXBlIDogRXh0ZW5zaW9uPAogICAidXNlIG9mIG5vbi1zdGFuZGFyZCBlc2NhcGUgY2hhcmFjdGVyICdcXCUwJyI+OwotZGVmIGV4dF91bmtub3duX2VzY2FwZSA6IEV4dFdhcm48InVua25vd24gZXNjYXBlIHNlcXVlbmNlICdcXCUwJyI+OworZGVmIGV4dF91bmtub3duX2VzY2FwZSA6IEV4dFdhcm48InVua25vd24gZXNjYXBlIHNlcXVlbmNlICdcXCUwJyI+LAorICBJbkdyb3VwPERpYWdHcm91cDwidW5rbm93bi1lc2NhcGUtc2VxdWVuY2UiPj47CiBkZWYgZXJyX2ludmFsaWRfZGVjaW1hbF9kaWdpdCA6IEVycm9yPCJpbnZhbGlkIGRpZ2l0ICclMCcgaW4gZGVjaW1hbCBjb25zdGFudCI+OwogZGVmIGVycl9pbnZhbGlkX2JpbmFyeV9kaWdpdCA6IEVycm9yPCJpbnZhbGlkIGRpZ2l0ICclMCcgaW4gYmluYXJ5IGNvbnN0YW50Ij47CiBkZWYgZXJyX2ludmFsaWRfb2N0YWxfZGlnaXQgOiBFcnJvcjwiaW52YWxpZCBkaWdpdCAnJTAnIGluIG9jdGFsIGNvbnN0YW50Ij47CkBAIC0zMDAsNiArMzAxLDkgQEAKICAgSW5Hcm91cDxEaWFnR3JvdXA8ImltcG9ydC1wcmVwcm9jZXNzb3ItZGlyZWN0aXZlLXBlZGFudGljIj4+OwogZGVmIGVycl9wcF9pbXBvcnRfZGlyZWN0aXZlX21zIDogRXJyb3I8CiAgICIjaW1wb3J0IG9mIHR5cGUgbGlicmFyeSBpcyBhbiB1bnN1cHBvcnRlZCBNaWNyb3NvZnQgZmVhdHVyZSI+OworZGVmIGV4dF9wcF9pbmNsdWRlX3NlYXJjaF9tcyA6IEV4dFdhcm48CisgICIjaW5jbHVkZSByZXNvbHZlZCB1c2luZyBub24tcG9ydGFibGUgTVNWQyBzZWFyY2ggcnVsZXMgYXM6ICUwIj4sCisgIEluR3JvdXA8RGlhZ0dyb3VwPCJtc3ZjLWluY2x1ZGUiPj47CiAKIGRlZiBleHRfcHBfaWRlbnRfZGlyZWN0aXZlIDogRXh0ZW5zaW9uPCIjaWRlbnQgaXMgYSBsYW5ndWFnZSBleHRlbnNpb24iPjsKIGRlZiBleHRfcHBfaW5jbHVkZV9uZXh0X2RpcmVjdGl2ZSA6IEV4dGVuc2lvbjwKQEAgLTM3Nyw4ICszODEsNyBAQAogICAiZXhwZWN0ZWQgZW5kIG9mIGxpbmUgaW4gcHJlcHJvY2Vzc29yIGV4cHJlc3Npb24iPjsKIGRlZiBlcnJfcHBfZGVmaW5lZF9yZXF1aXJlc19pZGVudGlmaWVyIDogRXJyb3I8CiAgICJvcGVyYXRvciAnZGVmaW5lZCcgcmVxdWlyZXMgYW4gaWRlbnRpZmllciI+OwotZGVmIGVycl9wcF9taXNzaW5nX2xwYXJlbiA6IEVycm9yPCJtaXNzaW5nICcoJyBhZnRlciAnJTAnIj47Ci1kZWYgZXJyX3BwX21pc3NpbmdfcnBhcmVuIDogRXJyb3I8Im1pc3NpbmcgJyknIGFmdGVyICclMCciPjsKK2RlZiBlcnJfcHBfZXhwZWN0ZWRfYWZ0ZXIgOiBFcnJvcjwibWlzc2luZyAlMSBhZnRlciAlMCI+OwogZGVmIGVycl9wcF9jb2xvbl93aXRob3V0X3F1ZXN0aW9uIDogRXJyb3I8Iic6JyB3aXRob3V0IHByZWNlZGluZyAnPyciPjsKIGRlZiBlcnJfcHBfZGl2aXNpb25fYnlfemVybyA6IEVycm9yPAogICAiZGl2aXNpb24gYnkgemVybyBpbiBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbiI+OwpAQCAtNDAwLDYgKzQwMyw5IEBACiAgICBFeHRXYXJuPCJfX2hhc193YXJuaW5nIGV4cGVjdGVkIG9wdGlvbiBuYW1lIChlLmcuIFwiLVd1bmRlZlwiKSI+LAogICAgSW5Hcm91cDxNYWxmb3JtZWRXYXJuaW5nQ2hlY2s+OwogCitkZWYgZXJyX3BwX2lkZW50aWZpZXJfYXJnX25vdF9pZGVudGlmaWVyIDogRXJyb3I8CisgICJjYW5ub3QgY29udmVydCAlMCB0b2tlbiB0byBhbiBpZGVudGlmaWVyIj47CisKIGRlZiB3YXJuX3ByYWdtYV9pbmNsdWRlX2FsaWFzX21pc21hdGNoX2FuZ2xlIDoKICAgIEV4dFdhcm48ImFuZ2xlLWJyYWNrZXRlZCBpbmNsdWRlIDwlMD4gY2Fubm90IGJlIGFsaWFzZWQgdG8gZG91YmxlLXF1b3RlZCAiCiAgICAiaW5jbHVkZSBcIiUxXCIiPiwgSW5Hcm91cDxVbmtub3duUHJhZ21hcz47CkBAIC00MzUsNyArNDQxLDggQEAKIGRlZiBlcnJfcHJhZ21hX3B1c2hfcG9wX21hY3JvX21hbGZvcm1lZCA6IEVycm9yPAogICAgInByYWdtYSAlMCByZXF1aXJlcyBhIHBhcmVudGhlc2l6ZWQgc3RyaW5nIj47CiBkZWYgd2Fybl9wcmFnbWFfcG9wX21hY3JvX25vX3B1c2ggOiBXYXJuaW5nPAotICAgInByYWdtYSBwb3BfbWFjcm8gY291bGQgbm90IHBvcCAnJTAnLCBubyBtYXRjaGluZyBwdXNoX21hY3JvIj47CisgICAicHJhZ21hIHBvcF9tYWNybyBjb3VsZCBub3QgcG9wICclMCcsIG5vIG1hdGNoaW5nIHB1c2hfbWFjcm8iPiwKKyAgSW5Hcm91cDxJZ25vcmVkUHJhZ21hcz47CiBkZWYgd2Fybl9wcmFnbWFfbWVzc2FnZSA6IFdhcm5pbmc8IiUwIj4sCiAgICBJbkdyb3VwPFBvdW5kUHJhZ21hTWVzc2FnZT4sIERlZmF1bHRXYXJuTm9XZXJyb3I7CiBkZWYgZXJyX3ByYWdtYV9tZXNzYWdlIDogRXJyb3I8IiUwIj47CkBAIC00NzAsNyArNDc3LDcgQEAKICAgIEluR3JvdXA8VW5rbm93blByYWdtYXM+OwogLy8gLSAjcHJhZ21hIF9fZGVidWcKIGRlZiB3YXJuX3ByYWdtYV9kZWJ1Z191bmV4cGVjdGVkX2NvbW1hbmQgOiBXYXJuaW5nPAotICAidW5leHBlY3RlZCBkZWJ1ZyBjb21tYW5kICclMCciPjsKKyAgInVuZXhwZWN0ZWQgZGVidWcgY29tbWFuZCAnJTAnIj4sIEluR3JvdXA8SWdub3JlZFByYWdtYXM+OwogCiBkZWYgZXJyX2RlZmluZWRfbWFjcm9fbmFtZSA6IEVycm9yPCInZGVmaW5lZCcgY2Fubm90IGJlIHVzZWQgYXMgYSBtYWNybyBuYW1lIj47CiBkZWYgZXJyX3Bhc3RlX2F0X3N0YXJ0IDogRXJyb3I8CkBAIC00OTEsNyArNDk4LDcgQEAKICAgInRvbyBmZXcgYXJndW1lbnRzIHByb3ZpZGVkIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm8gaW52b2NhdGlvbiI+OwogZGVmIGVycl9wcF9iYWRfcGFzdGUgOiBFcnJvcjwKICAgInBhc3RpbmcgZm9ybWVkICclMCcsIGFuIGludmFsaWQgcHJlcHJvY2Vzc2luZyB0b2tlbiI+OwotZGVmIGVycl9wcF9iYWRfcGFzdGVfbXMgOiBXYXJuaW5nPAorZGVmIGV4dF9wcF9iYWRfcGFzdGVfbXMgOiBFeHRXYXJuPAogICAicGFzdGluZyBmb3JtZWQgJyUwJywgYW4gaW52YWxpZCBwcmVwcm9jZXNzaW5nIHRva2VuIj4sIERlZmF1bHRFcnJvciwKICAgSW5Hcm91cDxEaWFnR3JvdXA8ImludmFsaWQtdG9rZW4tcGFzdGUiPj47CiBkZWYgZXJyX3BwX29wZXJhdG9yX3VzZWRfYXNfbWFjcm9fbmFtZSA6IEVycm9yPApAQCAtNTUxLDggKzU1OCw2IEBACiBkZWYgZXJyX21tYXBfbW9kdWxlX3JlZGVmaW5pdGlvbiA6IEVycm9yPAogICAicmVkZWZpbml0aW9uIG9mIG1vZHVsZSAnJTAnIj47CiBkZWYgbm90ZV9tbWFwX3ByZXZfZGVmaW5pdGlvbiA6IE5vdGU8InByZXZpb3VzbHkgZGVmaW5lZCBoZXJlIj47Ci1kZWYgZXJyX21tYXBfaGVhZGVyX25vdF9mb3VuZCA6IEVycm9yPAotICAiJXNlbGVjdHt8dW1icmVsbGEgfTBoZWFkZXIgJyUxJyBub3QgZm91bmQiPjsKIGRlZiBlcnJfbW1hcF91bWJyZWxsYV9kaXJfbm90X2ZvdW5kIDogRXJyb3I8CiAgICJ1bWJyZWxsYSBkaXJlY3RvcnkgJyUwJyBub3QgZm91bmQiPjsKIGRlZiBlcnJfbW1hcF91bWJyZWxsYV9jbGFzaCA6IEVycm9yPApAQCAtNjA1LDcgKzYxMCw3IEBACiAgICJpbXBvcnQgb2YgbW9kdWxlICclMSciPiwgSW5Hcm91cDxBdXRvSW1wb3J0PiwgRGVmYXVsdElnbm9yZTsKIGRlZiB3YXJuX3VuY292ZXJlZF9tb2R1bGVfaGVhZGVyIDogV2FybmluZzwKICAgInVtYnJlbGxhIGhlYWRlciBmb3IgbW9kdWxlICclMCcgZG9lcyBub3QgaW5jbHVkZSBoZWFkZXIgJyUxJyI+LCAKLSAgSW5Hcm91cDxJbmNvbXBsZXRlVW1icmVsbGE+LCBEZWZhdWx0SWdub3JlOworICBJbkdyb3VwPEluY29tcGxldGVVbWJyZWxsYT47CiBkZWYgd2Fybl9mb3Jnb3R0ZW5fbW9kdWxlX2hlYWRlciA6IFdhcm5pbmc8CiAgICJoZWFkZXIgJyUwJyBpcyBpbmNsdWRlZCBpbiBtb2R1bGUgJyUxJyBidXQgbm90IGxpc3RlZCBpbiBtb2R1bGUgbWFwIj4sCiAgIEluR3JvdXA8SW5jb21wbGV0ZU1vZHVsZT4sIERlZmF1bHRJZ25vcmU7CkBAIC02MTQsNyArNjE5LDcgQEAKIGRlZiBlcnJvcl91c2Vfb2ZfcHJpdmF0ZV9oZWFkZXJfb3V0c2lkZV9tb2R1bGUgOiBFcnJvcjwKICAgInVzZSBvZiBwcml2YXRlIGhlYWRlciBmcm9tIG91dHNpZGUgaXRzIG1vZHVsZTogJyUwJyI+OwogZGVmIGVycm9yX3VuZGVjbGFyZWRfdXNlX29mX21vZHVsZSA6IEVycm9yPAotICAidXNlIG9mIGEgbW9kdWxlIG5vdCBkZWNsYXJlZCB1c2VkOiAnJTAnIj47CisgICJtb2R1bGUgJTAgZG9lcyBub3QgZGVwZW5kIG9uIGEgbW9kdWxlIGV4cG9ydGluZyAnJTEnIj47CiAKIGRlZiB3YXJuX2hlYWRlcl9ndWFyZCA6IFdhcm5pbmc8CiAgICIlMCBpcyB1c2VkIGFzIGEgaGVhZGVyIGd1YXJkIGhlcmUsIGZvbGxvd2VkIGJ5ICNkZWZpbmUgb2YgYSBkaWZmZXJlbnQgbWFjcm8iPiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY1BhcnNlS2luZHMudGQgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNQYXJzZUtpbmRzLnRkCmluZGV4IDJmZWFiNTIuLjQwZmFiNzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY1BhcnNlS2luZHMudGQKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljUGFyc2VLaW5kcy50ZApAQCAtNTksNyArNTksOCBAQAogICAiY29tcGxleCBpbnRlZ2VyIHR5cGVzIGFyZSBhIEdOVSBleHRlbnNpb24iPiwgSW5Hcm91cDxHTlVDb21wbGV4SW50ZWdlcj47CiBkZWYgZXh0X3RocmVhZF9iZWZvcmUgOiBFeHRlbnNpb248IidfX3RocmVhZCcgYmVmb3JlICclMCciPjsKIGRlZiBleHRfa2V5d29yZF9hc19pZGVudCA6IEV4dFdhcm48Ci0gICJrZXl3b3JkICclMCcgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGlkZW50aWZpZXIgJXNlbGVjdHtoZXJlfGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cmFuc2xhdGlvbiB1bml0fTEiPiwKKyAgImtleXdvcmQgJyUwJyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGFzIGFuIGlkZW50aWZpZXIgIgorICAiJXNlbGVjdHtoZXJlfGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cmFuc2xhdGlvbiB1bml0fTEiPiwKICAgSW5Hcm91cDxLZXl3b3JkQ29tcGF0PjsKIAogZGVmIGVycm9yX2VtcHR5X2VudW0gOiBFcnJvcjwidXNlIG9mIGVtcHR5IGVudW0iPjsKQEAgLTE0OCwxOCArMTQ5LDYgQEAKIGRlZiBlcnJfZXhwZWN0ZWRfdHlwZSA6IEVycm9yPCJleHBlY3RlZCBhIHR5cGUiPjsKIGRlZiBlcnJfZXhwZWN0ZWRfZXh0ZXJuYWxfZGVjbGFyYXRpb24gOiBFcnJvcjwiZXhwZWN0ZWQgZXh0ZXJuYWwgZGVjbGFyYXRpb24iPjsKIGRlZiBlcnJfZXh0cmFuZW91c19jbG9zaW5nX2JyYWNlIDogRXJyb3I8ImV4dHJhbmVvdXMgY2xvc2luZyBicmFjZSAoJ30nKSI+OwotZGVmIGVycl9leHBlY3RlZF9pZGVudCA6IEVycm9yPCJleHBlY3RlZCBpZGVudGlmaWVyIj47Ci1kZWYgZXJyX2V4cGVjdGVkX2lkZW50X2xwYXJlbiA6IEVycm9yPCJleHBlY3RlZCBpZGVudGlmaWVyIG9yICcoJyI+OwotZGVmIGVycl9leHBlY3RlZF9pZGVudF9sYnJhY2UgOiBFcnJvcjwiZXhwZWN0ZWQgaWRlbnRpZmllciBvciAneyciPjsKLWRlZiBlcnJfZXhwZWN0ZWRfbGJyYWNlIDogRXJyb3I8ImV4cGVjdGVkICd7JyI+OwotZGVmIGVycl9leHBlY3RlZF9scGFyZW4gOiBFcnJvcjwiZXhwZWN0ZWQgJygnIj47Ci1kZWYgZXJyX2V4cGVjdGVkX2xwYXJlbl9vcl9sYnJhY2UgOiBFcnJvcjwiZXhwZWN0ZWQgJygnIG9yICd7JyI+OwotZGVmIGVycl9leHBlY3RlZF9ycGFyZW4gOiBFcnJvcjwiZXhwZWN0ZWQgJyknIj47Ci1kZWYgZXJyX2V4cGVjdGVkX2xzcXVhcmUgOiBFcnJvcjwiZXhwZWN0ZWQgJ1snIj47Ci1kZWYgZXJyX2V4cGVjdGVkX3JzcXVhcmUgOiBFcnJvcjwiZXhwZWN0ZWQgJ10nIj47Ci1kZWYgZXJyX2V4cGVjdGVkX3JicmFjZSA6IEVycm9yPCJleHBlY3RlZCAnfSciPjsKLWRlZiBlcnJfZXhwZWN0ZWRfZ3JlYXRlciA6IEVycm9yPCJleHBlY3RlZCAnPiciPjsKLWRlZiBlcnJfZXhwZWN0ZWRfZ2dnIDogRXJyb3I8ImV4cGVjdGVkICc+Pj4nIj47CiBkZWYgZXJyX2V4cGVjdGVkX3NlbWlfZGVjbGFyYXRpb24gOiBFcnJvcjwKICAgImV4cGVjdGVkICc7JyBhdCBlbmQgb2YgZGVjbGFyYXRpb24iPjsKIGRlZiBlcnJfZXhwZWN0ZWRfc2VtaV9kZWNsX2xpc3QgOiBFcnJvcjwKQEAgLTE4NSwxOCArMTc0LDE2IEBACiBkZWYgZXJyX2ludmFsaWRfdG9rZW5fYWZ0ZXJfdG9wbGV2ZWxfZGVjbGFyYXRvciA6IEVycm9yPAogICAiZXhwZWN0ZWQgJzsnIGFmdGVyIHRvcCBsZXZlbCBkZWNsYXJhdG9yIj47CiBkZWYgZXJyX2ludmFsaWRfdG9rZW5fYWZ0ZXJfZGVjbGFyYXRvcl9zdWdnZXN0X2VxdWFsIDogRXJyb3I8Ci0gICJpbnZhbGlkICclMCcgYXQgZW5kIG9mIGRlY2xhcmF0aW9uOyBkaWQgeW91IG1lYW4gJz0nPyI+OworICAiaW52YWxpZCAlMCBhdCBlbmQgb2YgZGVjbGFyYXRpb247IGRpZCB5b3UgbWVhbiAnPSc/Ij47CiBkZWYgZXJyX2V4cGVjdGVkX3N0YXRlbWVudCA6IEVycm9yPCJleHBlY3RlZCBzdGF0ZW1lbnQiPjsKIGRlZiBlcnJfZXhwZWN0ZWRfbHBhcmVuX2FmdGVyIDogRXJyb3I8ImV4cGVjdGVkICcoJyBhZnRlciAnJTAnIj47Ci1kZWYgZXJyX2V4cGVjdGVkX2xwYXJlbl9hZnRlcl9pZCA6IEVycm9yPCJleHBlY3RlZCAnKCcgYWZ0ZXIgJTAiPjsKK2RlZiBlcnJfZXhwZWN0ZWRfcnBhcmVuX2FmdGVyIDogRXJyb3I8ImV4cGVjdGVkICcpJyBhZnRlciAnJTAnIj47CitkZWYgZXJyX2V4cGVjdGVkX3B1bmMgOiBFcnJvcjwiZXhwZWN0ZWQgJyknIG9yICcsJyBhZnRlciAnJTAnIj47CiBkZWYgZXJyX2V4cGVjdGVkX2xlc3NfYWZ0ZXIgOiBFcnJvcjwiZXhwZWN0ZWQgJzwnIGFmdGVyICclMCciPjsKLWRlZiBlcnJfZXhwZWN0ZWRfZXF1YWxfYWZ0ZXIgOiBFcnJvcjwiZXhwZWN0ZWQgJz0nIGFmdGVyICUwIj47Ci1kZWYgZXJyX2V4cGVjdGVkX2NvbW1hIDogRXJyb3I8ImV4cGVjdGVkICcsJyI+OwogZGVmIGVycl9leHBlY3RlZF9sYnJhY2VfaW5fY29tcG91bmRfbGl0ZXJhbCA6IEVycm9yPAogICAiZXhwZWN0ZWQgJ3snIGluIGNvbXBvdW5kIGxpdGVyYWwiPjsKIGRlZiBlcnJfZXhwZWN0ZWRfd2hpbGUgOiBFcnJvcjwiZXhwZWN0ZWQgJ3doaWxlJyBpbiBkby93aGlsZSBsb29wIj47CiAKLWRlZiBlcnJfZXhwZWN0ZWRfc2VtaV9hZnRlciA6IEVycm9yPCJleHBlY3RlZCAnOycgYWZ0ZXIgJTAiPjsKIGRlZiBlcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9zdG10IDogRXJyb3I8ImV4cGVjdGVkICc7JyBhZnRlciAlMCBzdGF0ZW1lbnQiPjsKIGRlZiBlcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9leHByIDogRXJyb3I8ImV4cGVjdGVkICc7JyBhZnRlciBleHByZXNzaW9uIj47CiBkZWYgZXJyX2V4dHJhbmVvdXNfdG9rZW5fYmVmb3JlX3NlbWkgOiBFcnJvcjwiZXh0cmFuZW91cyAnJTAnIGJlZm9yZSAnOyciPjsKQEAgLTIwNiw3ICsxOTMsNyBAQAogZGVmIGVycl9leHBlY3RlZF9zZW1pX2FmdGVyX25hbWVzcGFjZV9uYW1lIDogRXJyb3I8CiAgICJleHBlY3RlZCAnOycgYWZ0ZXIgbmFtZXNwYWNlIG5hbWUiPjsKIGRlZiBlcnJfdW5leHBlY3RlZF9uYW1lc3BhY2VfYXR0cmlidXRlc19hbGlhcyA6IEVycm9yPAotICAiYXR0cmlidXRlcyBjYW4gbm90IGJlIHNwZWNpZmllZCBvbiBuYW1lc3BhY2UgYWxpYXMiPjsKKyAgImF0dHJpYnV0ZXMgY2Fubm90IGJlIHNwZWNpZmllZCBvbiBuYW1lc3BhY2UgYWxpYXMiPjsKIGRlZiBlcnJfaW5saW5lX25hbWVzcGFjZV9hbGlhcyA6IEVycm9yPCJuYW1lc3BhY2UgYWxpYXMgY2Fubm90IGJlIGlubGluZSI+OwogZGVmIGVycl9uYW1lc3BhY2Vfbm9ubmFtZXNwYWNlX3Njb3BlIDogRXJyb3I8CiAgICJuYW1lc3BhY2VzIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gZ2xvYmFsIG9yIG5hbWVzcGFjZSBzY29wZSI+OwpAQCAtMjE3LDcgKzIwNCw2IEBACiBkZWYgZXJyX2V4cGVjdGVkX3NlbWlfYWZ0ZXJfc3RhdGljX2Fzc2VydCA6IEVycm9yPAogICAiZXhwZWN0ZWQgJzsnIGFmdGVyIHN0YXRpY19hc3NlcnQiPjsKIGRlZiBlcnJfZXhwZWN0ZWRfc2VtaV9mb3IgOiBFcnJvcjwiZXhwZWN0ZWQgJzsnIGluICdmb3InIHN0YXRlbWVudCBzcGVjaWZpZXIiPjsKLWRlZiBlcnJfZXhwZWN0ZWRfY29sb25fYWZ0ZXIgOiBFcnJvcjwiZXhwZWN0ZWQgJzonIGFmdGVyICUwIj47CiBkZWYgd2Fybl9taXNzaW5nX3NlbGVjdG9yX25hbWUgOiBXYXJuaW5nPAogICAiJTAgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgcHJldmlvdXMgcGFyYW1ldGVyIHJhdGhlciB0aGFuIGFzIHBhcnQgIgogICAib2YgdGhlIHNlbGVjdG9yIj4sCkBAIC0yMzgsNiArMjI0LDggQEAKIGRlZiBlcnJfZXhwZWN0ZWRfcHJvcGVydHlfbmFtZSA6IEVycm9yPCJleHBlY3RlZCBwcm9wZXJ0eSBuYW1lIj47CiAKIGRlZiBlcnJfdW5leHBlY3RlZF9hdCA6IEVycm9yPCJ1bmV4cGVjdGVkICdAJyBpbiBwcm9ncmFtIj47CitkZWYgZXJyX2F0aW1wb3J0IDogRXJyb3I8CisidXNlIG9mICdAaW1wb3J0JyB3aGVuIG1vZHVsZXMgYXJlIGRpc2FibGVkLCBhZGQgLWZtb2R1bGVzIj47CiAKIGRlZiBlcnJfaW52YWxpZF9yZWZlcmVuY2VfcXVhbGlmaWVyX2FwcGxpY2F0aW9uIDogRXJyb3I8CiAgICInJTAnIHF1YWxpZmllciBtYXkgbm90IGJlIGFwcGxpZWQgdG8gYSByZWZlcmVuY2UiPjsKQEAgLTM2NCw2ICszNTIsOCBAQAogICAidW5leHBlY3RlZCBwYXJlbnRoZXNpcyBhZnRlciAnOjonIj47CiBkZWYgZXJyX2Z1bmN0aW9uX2RlZmluaXRpb25fbm90X2FsbG93ZWQgOiBFcnJvcjwKICAgImZ1bmN0aW9uIGRlZmluaXRpb24gaXMgbm90IGFsbG93ZWQgaGVyZSI+OworZGVmIGVycl9leHBlY3RlZF9lbmRfb2ZfZW51bWVyYXRvciA6IEVycm9yPAorICAiZXhwZWN0ZWQgJz0gY29uc3RhbnQtZXhwcmVzc2lvbicgb3IgZW5kIG9mIGVudW1lcmF0b3IgZGVmaW5pdGlvbiI+OwogCiAvLy8gT2JqZWN0aXZlLUMgcGFyc2VyIGRpYWdub3N0aWNzCiBkZWYgZXJyX2V4cGVjdGVkX21pbnVzX29yX3BsdXMgOiBFcnJvcjwKQEAgLTQyNCw3ICs0MTQsNyBAQAogZGVmIGVycl9leHBlY3RlZF9vYmpjX2NvbnRhaW5lciA6IEVycm9yPAogICAiJ0BlbmQnIG11c3QgYXBwZWFyIGluIGFuIE9iamVjdGl2ZS1DIGNvbnRleHQiPjsKIGRlZiBlcnJfdW5leHBlY3RlZF9wcm90b2NvbF9xdWFsaWZpZXIgOiBFcnJvcjwKLSAgIkBpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbiBjYW4gbm90IGJlIHByb3RvY29sIHF1YWxpZmllZCI+OworICAiQGltcGxlbWVudGF0aW9uIGRlY2xhcmF0aW9uIGNhbm5vdCBiZSBwcm90b2NvbCBxdWFsaWZpZWQiPjsKIGRlZiBlcnJfb2JqY191bmV4cGVjdGVkX2F0ZW5kIDogRXJyb3I8CiAgICInQGVuZCcgYXBwZWFycyB3aGVyZSBjbG9zaW5nIGJyYWNlICd9JyBpcyBleHBlY3RlZCI+OwogZGVmIGVycm9yX3Byb3BlcnR5X2l2YXJfZGVjbCA6IEVycm9yPApAQCAtNDgwLDkgKzQ3MCw2IEBACiAgICJub2V4Y2VwdCBzcGVjaWZpY2F0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiPiwKICAgSW5Hcm91cDxDWFg5OENvbXBhdD4sIERlZmF1bHRJZ25vcmU7CiBkZWYgZXJyX2V4cGVjdGVkX2NhdGNoIDogRXJyb3I8ImV4cGVjdGVkIGNhdGNoIj47Ci1kZWYgZXJyX2V4cGVjdGVkX2xicmFjZV9vcl9jb21tYSA6IEVycm9yPCJleHBlY3RlZCAneycgb3IgJywnIj47Ci1kZWYgZXJyX2V4cGVjdGVkX3JicmFjZV9vcl9jb21tYSA6IEVycm9yPCJleHBlY3RlZCAnfScgb3IgJywnIj47Ci1kZWYgZXJyX2V4cGVjdGVkX3JzcXVhcmVfb3JfY29tbWEgOiBFcnJvcjwiZXhwZWN0ZWQgJ10nIG9yICcsJyI+OwogZGVmIGVycl91c2luZ19uYW1lc3BhY2VfaW5fY2xhc3MgOiBFcnJvcjwKICAgIid1c2luZyBuYW1lc3BhY2UnIGlzIG5vdCBhbGxvd2VkIGluIGNsYXNzZXMiPjsKIGRlZiBlcnJfY29uc3RydWN0b3JfYmFkX25hbWUgOiBFcnJvcjwKQEAgLTUwNCw4ICs0OTEsNyBAQAogICAiSVNPIEMrKzExIHJlcXVpcmVzIGEgcGFyZW50aGVzaXplZCBwYWNrIGRlY2xhcmF0aW9uIHRvIGhhdmUgYSBuYW1lIj4sCiAgIEluR3JvdXA8RGlhZ0dyb3VwPCJhbm9ueW1vdXMtcGFjay1wYXJlbnMiPj47CiBkZWYgZXJyX2Z1bmN0aW9uX2lzX25vdF9yZWNvcmQgOiBFcnJvcjwKLSAgInVuZXhwZWN0ZWQgJyVzZWxlY3R7LnwtPn0wJyBpbiBmdW5jdGlvbiBjYWxsOyBwZXJoYXBzIHJlbW92ZSB0aGUgIgotICAiJyVzZWxlY3R7LnwtPn0wJz8iPjsKKyAgInVuZXhwZWN0ZWQgJTAgaW4gZnVuY3Rpb24gY2FsbDsgcGVyaGFwcyByZW1vdmUgdGhlICUwPyI+OwogCiAvLyBDKysgZGVyaXZlZCBjbGFzc2VzCiBkZWYgZXJyX2R1cF92aXJ0dWFsIDogRXJyb3I8ImR1cGxpY2F0ZSAndmlydHVhbCcgaW4gYmFzZSBzcGVjaWZpZXIiPjsKQEAgLTUzNSw3ICs1MjEsNyBAQAogZGVmIHdhcm5fY3h4OThfY29tcGF0X2FsaWduYXMgOiBXYXJuaW5nPCInYWxpZ25hcycgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiPiwKICAgSW5Hcm91cDxDWFg5OENvbXBhdD4sIERlZmF1bHRJZ25vcmU7CiBkZWYgd2Fybl9jeHg5OF9jb21wYXRfYXR0cmlidXRlIDogV2FybmluZzwKLSAgImF0dHJpYnV0ZXMgYXJlIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4Ij4sCisgICJDKysxMSBhdHRyaWJ1dGUgc3ludGF4IGlzIGluY29tcGF0aWJsZSB3aXRoIEMrKzk4Ij4sCiAgIEluR3JvdXA8Q1hYOThDb21wYXQ+LCBEZWZhdWx0SWdub3JlOwogZGVmIGVycl9jeHgxMV9hdHRyaWJ1dGVfZm9yYmlkc19hcmd1bWVudHMgOiBFcnJvcjwKICAgImF0dHJpYnV0ZSAnJTAnIGNhbm5vdCBoYXZlIGFuIGFyZ3VtZW50IGxpc3QiPjsKQEAgLTU0OSw4ICs1MzUsNiBAQAogICAiaW50cm9kdWNpbmcgYW4gYXR0cmlidXRlIj47CiBkZWYgZXJyX21zX2RlY2xzcGVjX3R5cGUgOiBFcnJvcjwKICAgIl9fZGVjbHNwZWMgYXR0cmlidXRlcyBtdXN0IGJlIGFuIGlkZW50aWZpZXIgb3Igc3RyaW5nIGxpdGVyYWwiPjsKLWRlZiB3YXJuX21zX2RlY2xzcGVjX3Vua25vd24gOiBXYXJuaW5nPAotICAidW5rbm93biBfX2RlY2xzcGVjIGF0dHJpYnV0ZSAlMCBpZ25vcmVkIj4sIEluR3JvdXA8VW5rbm93bkF0dHJpYnV0ZXM+OwogZGVmIGVycl9tc19wcm9wZXJ0eV9ub19nZXR0ZXJfb3JfcHV0dGVyIDogRXJyb3I8CiAgICJwcm9wZXJ0eSBkb2VzIG5vdCBzcGVjaWZ5IGEgZ2V0dGVyIG9yIGEgcHV0dGVyIj47CiBkZWYgZXJyX21zX3Byb3BlcnR5X3Vua25vd25fYWNjZXNzb3IgOiBFcnJvcjwKQEAgLTU3OCw4ICs1NjIsOCBAQAogICAidGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyIHJlcXVpcmVzICdjbGFzcycgYWZ0ZXIgdGhlIHBhcmFtZXRlciBsaXN0Ij47CiBkZWYgZXJyX3RlbXBsYXRlX3NwZWNfc3ludGF4X25vbl90ZW1wbGF0ZSA6IEVycm9yPAogICAiaWRlbnRpZmllciBmb2xsb3dlZCBieSAnPCcgaW5kaWNhdGVzIGEgY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gYnV0ICIKLSAgIiUwICVzZWxlY3R7ZG9lcyBub3QgcmVmZXIgdG8gYSB0ZW1wbGF0ZXxyZWZlcnMgdG8gYSBmdW5jdGlvbiAiCi0gICJ0ZW1wbGF0ZXw8dW51c2VkPnxyZWZlcnMgdG8gYSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJ9MSI+OworICAiJTAgJXNlbGVjdHtkb2VzIG5vdCByZWZlciB0byBhIHRlbXBsYXRlfHJlZmVycyB0byBhIGZ1bmN0aW9uIHRlbXBsYXRlfCIKKyAgIjx1bnVzZWQ+fHJlZmVycyB0byBhIHZhcmlhYmxlIHRlbXBsYXRlfDx1bnVzZWQ+fTEiPjsKIGRlZiBlcnJfaWRfYWZ0ZXJfdGVtcGxhdGVfaW5fbmVzdGVkX25hbWVfc3BlYyA6IEVycm9yPAogICAiZXhwZWN0ZWQgdGVtcGxhdGUgbmFtZSBhZnRlciAndGVtcGxhdGUnIGtleXdvcmQgaW4gbmVzdGVkIG5hbWUgc3BlY2lmaWVyIj47CiBkZWYgZXJyX3R3b19yaWdodF9hbmdsZV9icmFja2V0c19uZWVkX3NwYWNlIDogRXJyb3I8CkBAIC02MzksMTYgKzYyMywxMyBAQAogICAiZXhwZWN0ZWQgYSBxdWFsaWZpZWQgbmFtZSBhZnRlciAndHlwZW5hbWUnIj47CiBkZWYgd2Fybl9leHBlY3RlZF9xdWFsaWZpZWRfYWZ0ZXJfdHlwZW5hbWUgOiBFeHRXYXJuPAogICAiZXhwZWN0ZWQgYSBxdWFsaWZpZWQgbmFtZSBhZnRlciAndHlwZW5hbWUnIj47Ci1kZWYgZXJyX2V4cGVjdGVkX3NlbWlfYWZ0ZXJfdGFnZGVjbCA6IEVycm9yPAotICAiZXhwZWN0ZWQgJzsnIGFmdGVyICUwIj47CiAKIGRlZiBlcnJfdHlwZW5hbWVfcmVmZXJzX3RvX25vbl90eXBlX3RlbXBsYXRlIDogRXJyb3I8Ci0gICJ0eXBlbmFtZSBzcGVjaWZpZXIgcmVmZXJzIHRvIGEgbm9uLXRlbXBsYXRlIj47CisgICJ0eXBlbmFtZSBzcGVjaWZpZXIgcmVmZXJzIHRvIGEgbm9uLXR5cGUgdGVtcGxhdGUiPjsKIGRlZiBlcnJfZXhwZWN0ZWRfdHlwZV9uYW1lX2FmdGVyX3R5cGVuYW1lIDogRXJyb3I8CiAgICJleHBlY3RlZCBhbiBpZGVudGlmaWVyIG9yIHRlbXBsYXRlLWlkIGFmdGVyICc6OiciPjsKIGRlZiBlcnJfZXhwbGljaXRfc3BlY19ub25fdGVtcGxhdGUgOiBFcnJvcjwKLSAgImV4cGxpY2l0ICVzZWxlY3R7c3BlY2lhbGl6YXRpb258aW5zdGFudGlhdGlvbn0wIG9mIG5vbi10ZW1wbGF0ZSAiCi0gICIlc2VsZWN0e2NsYXNzfHN0cnVjdHx1bmlvbnxpbnRlcmZhY2V9MSAlMiI+OworICAiZXhwbGljaXQgJXNlbGVjdHtzcGVjaWFsaXphdGlvbnxpbnN0YW50aWF0aW9ufTAgb2Ygbm9uLXRlbXBsYXRlICUxICUyIj47CiAgIAogZGVmIGVycl9kZWZhdWx0X3RlbXBsYXRlX3RlbXBsYXRlX3BhcmFtZXRlcl9ub3RfdGVtcGxhdGUgOiBFcnJvcjwKICAgImRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnQgZm9yIGEgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyIG11c3QgYmUgYSBjbGFzcyAiCkBAIC03NDQsNyArNzI1LDggQEAKICAgImxhbWJkYSBleHByZXNzaW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiPiwKICAgSW5Hcm91cDxDWFg5OENvbXBhdD4sIERlZmF1bHRJZ25vcmU7CiBkZWYgZXJyX2xhbWJkYV9taXNzaW5nX3BhcmVucyA6IEVycm9yPAotICAibGFtYmRhIHJlcXVpcmVzICcoKScgYmVmb3JlICVzZWxlY3R7J211dGFibGUnfHJldHVybiB0eXBlfTAiPjsKKyAgImxhbWJkYSByZXF1aXJlcyAnKCknIGJlZm9yZSAlc2VsZWN0eydtdXRhYmxlJ3xyZXR1cm4gdHlwZXwiCisgICJhdHRyaWJ1dGUgc3BlY2lmaWVyfTAiPjsKIAogLy8gQXZhaWxhYmlsaXR5IGF0dHJpYnV0ZQogZGVmIGVycl9leHBlY3RlZF92ZXJzaW9uIDogRXJyb3I8CkBAIC03NTMsNiArNzM1LDEzIEBACiAgICJ2ZXJzaW9uIG51bWJlciBtdXN0IGhhdmUgbm9uLXplcm8gbWFqb3IsIG1pbm9yLCBvciBzdWItbWlub3IgdmVyc2lvbiI+OwogZGVmIGVycl9hdmFpbGFiaWxpdHlfZXhwZWN0ZWRfcGxhdGZvcm0gOiBFcnJvcjwKICAgImV4cGVjdGVkIGEgcGxhdGZvcm0gbmFtZSwgZS5nLiwgJ21hY29zeCciPjsKKyAgCisvLyBvYmpjX2JyaWRnZV9yZWxhdGVkIGF0dHJpYnV0ZQorZGVmIGVycl9vYmpjYnJpZGdlX3JlbGF0ZWRfZXhwZWN0ZWRfcmVsYXRlZF9jbGFzcyA6IEVycm9yPAorICAiZXhwZWN0ZWQgYSByZWxhdGVkIE9iamVjdGl2ZUMgY2xhc3MgbmFtZSwgZS5nLiwgJ05TQ29sb3InIj47CitkZWYgZXJyX29iamNicmlkZ2VfcmVsYXRlZF9zZWxlY3Rvcl9uYW1lIDogRXJyb3I8CisgICJleHBlY3RlZCBhIGNsYXNzIG1ldGhvZCBzZWxlY3RvciB3aXRoIHNpbmdsZSBhcmd1bWVudCwgZS5nLiwgJ2NvbG9yV2l0aENHQ29sb3I6JyI+OworCiBkZWYgZXJyX2F2YWlsYWJpbGl0eV9leHBlY3RlZF9jaGFuZ2UgOiBFcnJvcjwKICAgImV4cGVjdGVkICdpbnRyb2R1Y2VkJywgJ2RlcHJlY2F0ZWQnLCBvciAnb2Jzb2xldGVkJyI+OwogZGVmIGVycl9hdmFpbGFiaWxpdHlfdW5rbm93bl9jaGFuZ2UgOiBFcnJvcjwKQEAgLTc2OSwzNSArNzU4LDUxIEBACiBkZWYgZXJyX3R5cGVfc2FmZXR5X3Vua25vd25fZmxhZyA6IEVycm9yPAogICAiaW52YWxpZCBjb21wYXJpc29uIGZsYWcgJTA7IHVzZSAnbGF5b3V0X2NvbXBhdGlibGUnIG9yICdtdXN0X2JlX251bGwnIj47CiAKKy8vIFR5cGUgdHJhaXRzCitkZWYgZXJyX3R5cGVfdHJhaXRfYXJpdHkgOiBFcnJvcjwKKyAgInR5cGUgdHJhaXQgcmVxdWlyZXMgJTAlc2VsZWN0e3wgb3IgbW9yZX0xIGFyZ3VtZW50JXNlbGVjdHt8c30yOyBoYXZlICIKKyAgIiUzIGFyZ3VtZW50JXMzIj47CisKIC8vIExhbmd1YWdlIHNwZWNpZmljIHByYWdtYXMKIC8vIC0gR2VuZXJpYyB3YXJuaW5ncwogZGVmIHdhcm5fcHJhZ21hX2V4cGVjdGVkX2xwYXJlbiA6IFdhcm5pbmc8Ci0gICJtaXNzaW5nICcoJyBhZnRlciAnI3ByYWdtYSAlMCcgLSBpZ25vcmluZyI+OworICAibWlzc2luZyAnKCcgYWZ0ZXIgJyNwcmFnbWEgJTAnIC0gaWdub3JpbmciPiwgSW5Hcm91cDxJZ25vcmVkUHJhZ21hcz47CiBkZWYgd2Fybl9wcmFnbWFfZXhwZWN0ZWRfcnBhcmVuIDogV2FybmluZzwKLSAgIm1pc3NpbmcgJyknIGFmdGVyICcjcHJhZ21hICUwJyAtIGlnbm9yaW5nIj47CisgICJtaXNzaW5nICcpJyBhZnRlciAnI3ByYWdtYSAlMCcgLSBpZ25vcmluZyI+LCBJbkdyb3VwPElnbm9yZWRQcmFnbWFzPjsKIGRlZiB3YXJuX3ByYWdtYV9leHBlY3RlZF9pZGVudGlmaWVyIDogV2FybmluZzwKLSAgImV4cGVjdGVkIGlkZW50aWZpZXIgaW4gJyNwcmFnbWEgJTAnIC0gaWdub3JlZCI+OyAgCisgICJleHBlY3RlZCBpZGVudGlmaWVyIGluICcjcHJhZ21hICUwJyAtIGlnbm9yZWQiPiwgSW5Hcm91cDxJZ25vcmVkUHJhZ21hcz47CitkZWYgd2Fybl9wcmFnbWFfZXhwZWN0ZWRfaW50ZWdlciA6IFdhcm5pbmc8CisgICJleHBlY3RlZCBpbnRlZ2VyIGJldHdlZW4gJTAgYW5kICUxIGluY2x1c2l2ZSBpbiAnI3ByYWdtYSAlMicgLSBpZ25vcmVkIj4sCisgIEluR3JvdXA8SWdub3JlZFByYWdtYXM+OwogZGVmIHdhcm5fcHJhZ21hX21zX3N0cnVjdCA6IFdhcm5pbmc8Ci0gICJpbmNvcnJlY3QgdXNlIG9mICcjcHJhZ21hIG1zX3N0cnVjdCBvbnxvZmYnIC0gaWdub3JlZCI+OyAgCisgICJpbmNvcnJlY3QgdXNlIG9mICcjcHJhZ21hIG1zX3N0cnVjdCBvbnxvZmYnIC0gaWdub3JlZCI+LAorICBJbkdyb3VwPElnbm9yZWRQcmFnbWFzPjsKIGRlZiB3YXJuX3ByYWdtYV9leHRyYV90b2tlbnNfYXRfZW9sIDogV2FybmluZzwKLSAgImV4dHJhIHRva2VucyBhdCBlbmQgb2YgJyNwcmFnbWEgJTAnIC0gaWdub3JlZCI+OyAKKyAgImV4dHJhIHRva2VucyBhdCBlbmQgb2YgJyNwcmFnbWEgJTAnIC0gaWdub3JlZCI+LAorICBJbkdyb3VwPElnbm9yZWRQcmFnbWFzPjsKK2RlZiB3YXJuX3ByYWdtYV9leHBlY3RlZF9wdW5jIDogV2FybmluZzwKKyAgImV4cGVjdGVkICcpJyBvciAnLCcgaW4gJyNwcmFnbWEgJTAnIj4sIEluR3JvdXA8SWdub3JlZFByYWdtYXM+OwogLy8gLSAjcHJhZ21hIG9wdGlvbnMKIGRlZiB3YXJuX3ByYWdtYV9vcHRpb25zX2V4cGVjdGVkX2FsaWduIDogV2FybmluZzwKLSAgImV4cGVjdGVkICdhbGlnbicgZm9sbG93aW5nICcjcHJhZ21hIG9wdGlvbnMnIC0gaWdub3JlZCI+OworICAiZXhwZWN0ZWQgJ2FsaWduJyBmb2xsb3dpbmcgJyNwcmFnbWEgb3B0aW9ucycgLSBpZ25vcmVkIj4sCisgIEluR3JvdXA8SWdub3JlZFByYWdtYXM+OwogZGVmIHdhcm5fcHJhZ21hX2FsaWduX2V4cGVjdGVkX2VxdWFsIDogV2FybmluZzwKLSAgImV4cGVjdGVkICc9JyBmb2xsb3dpbmcgJyNwcmFnbWEgJXNlbGVjdHthbGlnbnxvcHRpb25zIGFsaWdufTAnIC0gaWdub3JlZCI+OworICAiZXhwZWN0ZWQgJz0nIGZvbGxvd2luZyAnI3ByYWdtYSAlc2VsZWN0e2FsaWdufG9wdGlvbnMgYWxpZ259MCcgLSBpZ25vcmVkIj4sCisgIEluR3JvdXA8SWdub3JlZFByYWdtYXM+OwogZGVmIHdhcm5fcHJhZ21hX2FsaWduX2ludmFsaWRfb3B0aW9uIDogV2FybmluZzwKLSAgImludmFsaWQgYWxpZ25tZW50IG9wdGlvbiBpbiAnI3ByYWdtYSAlc2VsZWN0e2FsaWdufG9wdGlvbnMgYWxpZ259MCcgLSBpZ25vcmVkIj47CisgICJpbnZhbGlkIGFsaWdubWVudCBvcHRpb24gaW4gJyNwcmFnbWEgJXNlbGVjdHthbGlnbnxvcHRpb25zIGFsaWdufTAnIC0gaWdub3JlZCI+LAorICBJbkdyb3VwPElnbm9yZWRQcmFnbWFzPjsKIC8vIC0gI3ByYWdtYSBwYWNrCi1kZWYgd2Fybl9wcmFnbWFfcGFja19pbnZhbGlkX2FjdGlvbiA6IFdhcm5pbmc8Ci0gICJ1bmtub3duIGFjdGlvbiBmb3IgJyNwcmFnbWEgcGFjaycgLSBpZ25vcmVkIj47CitkZWYgd2Fybl9wcmFnbWFfaW52YWxpZF9hY3Rpb24gOiBXYXJuaW5nPAorICAidW5rbm93biBhY3Rpb24gZm9yICcjcHJhZ21hICUwJyAtIGlnbm9yZWQiPiwKKyAgSW5Hcm91cDxJZ25vcmVkUHJhZ21hcz47CiBkZWYgd2Fybl9wcmFnbWFfcGFja19tYWxmb3JtZWQgOiBXYXJuaW5nPAotICAiZXhwZWN0ZWQgaW50ZWdlciBvciBpZGVudGlmaWVyIGluICcjcHJhZ21hIHBhY2snIC0gaWdub3JlZCI+OworICAiZXhwZWN0ZWQgaW50ZWdlciBvciBpZGVudGlmaWVyIGluICcjcHJhZ21hIHBhY2snIC0gaWdub3JlZCI+LAorICBJbkdyb3VwPElnbm9yZWRQcmFnbWFzPjsKIC8vIC0gI3ByYWdtYSB1bnVzZWQKIGRlZiB3YXJuX3ByYWdtYV91bnVzZWRfZXhwZWN0ZWRfdmFyIDogV2FybmluZzwKLSAgImV4cGVjdGVkICcjcHJhZ21hIHVudXNlZCcgYXJndW1lbnQgdG8gYmUgYSB2YXJpYWJsZSBuYW1lIj47Ci1kZWYgd2Fybl9wcmFnbWFfdW51c2VkX2V4cGVjdGVkX3B1bmMgOiBXYXJuaW5nPAotICAiZXhwZWN0ZWQgJyknIG9yICcsJyBpbiAnI3ByYWdtYSB1bnVzZWQnIj47CisgICJleHBlY3RlZCAnI3ByYWdtYSB1bnVzZWQnIGFyZ3VtZW50IHRvIGJlIGEgdmFyaWFibGUgbmFtZSI+LAorICBJbkdyb3VwPElnbm9yZWRQcmFnbWFzPjsKIC8vIC0gI3ByYWdtYSBmcF9jb250cmFjdAogZGVmIGVycl9wcmFnbWFfZnBfY29udHJhY3Rfc2NvcGUgOiBFcnJvcjwKICAgIicjcHJhZ21hIGZwX2NvbnRyYWN0JyBjYW4gb25seSBhcHBlYXIgYXQgZmlsZSBzY29wZSBvciBhdCB0aGUgc3RhcnQgb2YgYSAiCkBAIC04MTAsNiArODE1LDEwIEBACiBkZWYgZXJyX3ByYWdtYV9kZXRlY3RfbWlzbWF0Y2hfbWFsZm9ybWVkIDogRXJyb3I8CiAgICJwcmFnbWEgZGV0ZWN0X21pc21hdGNoIGlzIG1hbGZvcm1lZDsgaXQgcmVxdWlyZXMgdHdvIGNvbW1hLXNlcGFyYXRlZCAiCiAgICJzdHJpbmcgbGl0ZXJhbHMiPjsKKy8vIC0gI3ByYWdtYSBwb2ludGVyc190b19tZW1iZXJzCitkZWYgZXJyX3ByYWdtYV9wb2ludGVyc190b19tZW1iZXJzX3Vua25vd25fa2luZCA6IEVycm9yPAorICAidW5leHBlY3RlZCAlMCwgZXhwZWN0ZWQgdG8gc2VlIG9uZSBvZiAlc2VsZWN0e3wnYmVzdF9jYXNlJywgJ2Z1bGxfZ2VuZXJhbGl0eScsIH0xIgorICAiJ3NpbmdsZV9pbmhlcml0YW5jZScsICdtdWx0aXBsZV9pbmhlcml0YW5jZScsIG9yICd2aXJ0dWFsX2luaGVyaXRhbmNlJyI+OwogCiAvLyBPcGVuQ0wgU2VjdGlvbiA2LjguZwogZGVmIGVycl9ub3Rfb3BlbmNsX3N0b3JhZ2VfY2xhc3Nfc3BlY2lmaWVyIDogRXJyb3I8CkBAIC04MTcsMTEgKzgyNiwxMSBAQAogCiAvLyBPcGVuQ0wgRVhURU5TSU9OIHByYWdtYSAoT3BlbkNMIDEuMSBbOS4xXSkKIGRlZiB3YXJuX3ByYWdtYV9leHBlY3RlZF9jb2xvbiA6IFdhcm5pbmc8Ci0gICJtaXNzaW5nICc6JyBhZnRlciAlMCAtIGlnbm9yaW5nIj47CisgICJtaXNzaW5nICc6JyBhZnRlciAlMCAtIGlnbm9yaW5nIj4sIEluR3JvdXA8SWdub3JlZFByYWdtYXM+OwogZGVmIHdhcm5fcHJhZ21hX2V4cGVjdGVkX2VuYWJsZV9kaXNhYmxlIDogV2FybmluZzwKLSAgImV4cGVjdGVkICdlbmFibGUnIG9yICdkaXNhYmxlJyAtIGlnbm9yaW5nIj47CisgICJleHBlY3RlZCAnZW5hYmxlJyBvciAnZGlzYWJsZScgLSBpZ25vcmluZyI+LCBJbkdyb3VwPElnbm9yZWRQcmFnbWFzPjsKIGRlZiB3YXJuX3ByYWdtYV91bmtub3duX2V4dGVuc2lvbiA6IFdhcm5pbmc8Ci0gICJ1bmtub3duIE9wZW5DTCBleHRlbnNpb24gJTAgLSBpZ25vcmluZyI+OworICAidW5rbm93biBPcGVuQ0wgZXh0ZW5zaW9uICUwIC0gaWdub3JpbmciPiwgSW5Hcm91cDxJZ25vcmVkUHJhZ21hcz47CiAKIGRlZiBlcnJfc2VoX2V4cGVjdGVkX2hhbmRsZXIgOiBFcnJvcjwKICAgImV4cGVjdGVkICdfX2V4Y2VwdCcgb3IgJ19fZmluYWxseScgYmxvY2siPjsKQEAgLTgzNiwyMCArODQ1LDIwIEBACiAgICIlMCBvbmx5IGFsbG93ZWQgaW4gX19maW5hbGx5IGJsb2NrIj47CiAKIC8vIE9wZW5NUCBzdXBwb3J0LgotZGVmIHdhcm5fcHJhZ21hX29tcF9pZ25vcmVkIDogV2FybmluZyA8CitkZWYgd2Fybl9wcmFnbWFfb21wX2lnbm9yZWQgOiBXYXJuaW5nPAogICAidW5leHBlY3RlZCAnI3ByYWdtYSBvbXAgLi4uJyBpbiBwcm9ncmFtIj4sIEluR3JvdXA8U291cmNlVXNlc09wZW5NUD4sIERlZmF1bHRJZ25vcmU7Ci1kZWYgd2Fybl9vbXBfZXh0cmFfdG9rZW5zX2F0X2VvbCA6IFdhcm5pbmcgPAorZGVmIHdhcm5fb21wX2V4dHJhX3Rva2Vuc19hdF9lb2wgOiBXYXJuaW5nPAogICAiZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wICUwJyBhcmUgaWdub3JlZCI+LAogICBJbkdyb3VwPEV4dHJhVG9rZW5zPjsKLWRlZiBlcnJfb21wX3Vua25vd25fZGlyZWN0aXZlIDogRXJyb3IgPAorZGVmIGVycl9vbXBfdW5rbm93bl9kaXJlY3RpdmUgOiBFcnJvcjwKICAgImV4cGVjdGVkIGFuIE9wZW5NUCBkaXJlY3RpdmUiPjsKLWRlZiBlcnJfb21wX3VuZXhwZWN0ZWRfZGlyZWN0aXZlIDogRXJyb3IgPAorZGVmIGVycl9vbXBfdW5leHBlY3RlZF9kaXJlY3RpdmUgOiBFcnJvcjwKICAgInVuZXhwZWN0ZWQgT3Blbk1QIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgJTAnIj47Ci1kZWYgZXJyX29tcF9leHBlY3RlZF9wdW5jIDogRXJyb3IgPAotICAiZXhwZWN0ZWQgJywnIG9yICcpJyBpbiAlc2VsZWN0eycjcHJhZ21hIG9tcCAlMSd8JyUxJyBjbGF1c2V9MCI+OwotZGVmIGVycl9vbXBfdW5leHBlY3RlZF9jbGF1c2UgOiBFcnJvciA8CitkZWYgZXJyX29tcF9leHBlY3RlZF9wdW5jIDogRXJyb3I8CisgICJleHBlY3RlZCAnLCcgb3IgJyknIGluICclMCcgY2xhdXNlIj47CitkZWYgZXJyX29tcF91bmV4cGVjdGVkX2NsYXVzZSA6IEVycm9yPAogICAidW5leHBlY3RlZCBPcGVuTVAgY2xhdXNlICclMCcgaW4gZGlyZWN0aXZlICcjcHJhZ21hIG9tcCAlMSciPjsKLWRlZiBlcnJfb21wX21vcmVfb25lX2NsYXVzZSA6IEVycm9yIDwKK2RlZiBlcnJfb21wX21vcmVfb25lX2NsYXVzZSA6IEVycm9yPAogICAiZGlyZWN0aXZlICcjcHJhZ21hIG9tcCAlMCcgY2Fubm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSAnJTEnIGNsYXVzZSI+OwogfSAvLyBlbmQgb2YgUGFyc2UgSXNzdWUgY2F0ZWdvcnkuCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY1NlbWFLaW5kcy50ZCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY1NlbWFLaW5kcy50ZAppbmRleCA2YzdjYjAwLi5iMTM4NjE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNTZW1hS2luZHMudGQKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljU2VtYUtpbmRzLnRkCkBAIC0zMCw2ICszMCwyNSBAQAogICAiYmVlbiBhc3NpZ25lZCI+LCBJbkdyb3VwPERpYWdHcm91cDwiZHVwbGljYXRlLWVudW0iPj4sIERlZmF1bHRJZ25vcmU7CiBkZWYgbm90ZV9kdXBsaWNhdGVfZWxlbWVudCA6IE5vdGU8ImVsZW1lbnQgJTAgYWxzbyBoYXMgdmFsdWUgJTEiPjsKIAorLy8gQWJzb2x1dGUgdmFsdWUgZnVuY3Rpb25zCitkZWYgd2Fybl91bnNpZ25lZF9hYnMgOiBXYXJuaW5nPAorICAidGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCB0eXBlICUwIGhhcyBubyBlZmZlY3QiPiwKKyAgSW5Hcm91cDxBYnNvbHV0ZVZhbHVlPjsKK2RlZiBub3RlX3JlbW92ZV9hYnMgOiBOb3RlPAorICAicmVtb3ZlIHRoZSBjYWxsIHRvICUwIHNpbmNlIHVuc2lnbmVkIHZhbHVlcyBjYW5ub3QgYmUgbmVnYXRpdmUiPjsKK2RlZiB3YXJuX2Fic190b29fc21hbGwgOiBXYXJuaW5nPAorICAiYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJTAgZ2l2ZW4gYW4gYXJndW1lbnQgb2YgdHlwZSAlMSBidXQgaGFzIHBhcmFtZXRlciAiCisgICJvZiB0eXBlICUyIHdoaWNoIG1heSBjYXVzZSB0cnVuY2F0aW9uIG9mIHZhbHVlIj4sIEluR3JvdXA8QWJzb2x1dGVWYWx1ZT47CitkZWYgd2Fybl93cm9uZ19hYnNvbHV0ZV92YWx1ZV90eXBlIDogV2FybmluZzwKKyAgInVzaW5nICVzZWxlY3R7aW50ZWdlcnxmbG9hdGluZyBwb2ludHxjb21wbGV4fTEgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJTAgIgorICAid2hlbiBhcmd1bWVudCBpcyBvZiAlc2VsZWN0e2ludGVnZXJ8ZmxvYXRpbmcgcG9pbnR8Y29tcGxleH0yIHR5cGUiPiwKKyAgSW5Hcm91cDxBYnNvbHV0ZVZhbHVlPjsKK2RlZiBub3RlX3JlcGxhY2VfYWJzX2Z1bmN0aW9uIDogTm90ZTwidXNlIGZ1bmN0aW9uICclMCcgaW5zdGVhZCI+OworCitkZWYgd2Fybl9pbmZpbml0ZV9yZWN1cnNpdmVfZnVuY3Rpb24gOiBXYXJuaW5nPAorICAiYWxsIHBhdGhzIHRocm91Z2ggdGhpcyBmdW5jdGlvbiB3aWxsIGNhbGwgaXRzZWxmIj4sCisgIEluR3JvdXA8SW5maW5pdGVSZWN1cnNpb24+LCBEZWZhdWx0SWdub3JlOworCiAvLyBDb25zdGFudCBleHByZXNzaW9ucwogZGVmIGVycl9leHByX25vdF9pY2UgOiBFcnJvcjwKICAgImV4cHJlc3Npb24gaXMgbm90IGFuICVzZWxlY3R7aW50ZWdlcnxpbnRlZ3JhbH0wIGNvbnN0YW50IGV4cHJlc3Npb24iPjsKQEAgLTg3LDkgKzEwNiw5IEBACiBkZWYgZXJyX3ZsYV9kZWNsX2luX2ZpbGVfc2NvcGUgOiBFcnJvcjwKICAgInZhcmlhYmxlIGxlbmd0aCBhcnJheSBkZWNsYXJhdGlvbiBub3QgYWxsb3dlZCBhdCBmaWxlIHNjb3BlIj47CiBkZWYgZXJyX3ZsYV9kZWNsX2hhc19zdGF0aWNfc3RvcmFnZSA6IEVycm9yPAotICAidmFyaWFibGUgbGVuZ3RoIGFycmF5IGRlY2xhcmF0aW9uIGNhbiBub3QgaGF2ZSAnc3RhdGljJyBzdG9yYWdlIGR1cmF0aW9uIj47CisgICJ2YXJpYWJsZSBsZW5ndGggYXJyYXkgZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgJ3N0YXRpYycgc3RvcmFnZSBkdXJhdGlvbiI+OwogZGVmIGVycl92bGFfZGVjbF9oYXNfZXh0ZXJuX2xpbmthZ2UgOiBFcnJvcjwKLSAgInZhcmlhYmxlIGxlbmd0aCBhcnJheSBkZWNsYXJhdGlvbiBjYW4gbm90IGhhdmUgJ2V4dGVybicgbGlua2FnZSI+OworICAidmFyaWFibGUgbGVuZ3RoIGFycmF5IGRlY2xhcmF0aW9uIGNhbm5vdCBoYXZlICdleHRlcm4nIGxpbmthZ2UiPjsKIGRlZiBleHRfdmxhX2ZvbGRlZF90b19jb25zdGFudCA6IEV4dGVuc2lvbjwKICAgInZhcmlhYmxlIGxlbmd0aCBhcnJheSBmb2xkZWQgdG8gY29uc3RhbnQgYXJyYXkgYXMgYW4gZXh0ZW5zaW9uIj4sIEluR3JvdXA8R05VRm9sZGluZ0NvbnN0YW50PjsKIApAQCAtMTQyLDcgKzE2MSw3IEBACiBkZWYgZXJyX2JhZF92YXJpYWJsZV9uYW1lIDogRXJyb3I8CiAgICIlMCBjYW5ub3QgYmUgdGhlIG5hbWUgb2YgYSB2YXJpYWJsZSBvciBkYXRhIG1lbWJlciI+OwogZGVmIGVycl9iYWRfcGFyYW1ldGVyX25hbWUgOiBFcnJvcjwKLSAgIiclMCcgY2Fubm90IGJlIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyIj47CisgICIlMCBjYW5ub3QgYmUgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIiPjsKIGRlZiBlcnJfcGFyYW1ldGVyX25hbWVfb21pdHRlZCA6IEVycm9yPCJwYXJhbWV0ZXIgbmFtZSBvbWl0dGVkIj47CiBkZWYgd2Fybl91bnVzZWRfcGFyYW1ldGVyIDogV2FybmluZzwidW51c2VkIHBhcmFtZXRlciAlMCI+LAogICBJbkdyb3VwPFVudXNlZFBhcmFtZXRlcj4sIERlZmF1bHRJZ25vcmU7CkBAIC0yMTgsNyArMjM3LDEwIEBACiBkZWYgZXJyX2VsbGlwc2lzX2ZpcnN0X2FyZyA6IEVycm9yPAogICAiSVNPIEMgcmVxdWlyZXMgYSBuYW1lZCBhcmd1bWVudCBiZWZvcmUgJy4uLiciPjsKIGRlZiBlcnJfZGVjbGFyYXRvcl9uZWVkX2lkZW50IDogRXJyb3I8ImRlY2xhcmF0b3IgcmVxdWlyZXMgYW4gaWRlbnRpZmllciI+OwotZGVmIGVycl9iYWRfbGFuZ3VhZ2UgOiBFcnJvcjwidW5rbm93biBsaW5rYWdlIGxhbmd1YWdlIj47CitkZWYgZXJyX2xhbmd1YWdlX2xpbmthZ2Vfc3BlY191bmtub3duIDogRXJyb3I8InVua25vd24gbGlua2FnZSBsYW5ndWFnZSI+OworZGVmIGVycl9sYW5ndWFnZV9saW5rYWdlX3NwZWNfbm90X2FzY2lpIDogRXJyb3I8CisgICJzdHJpbmcgbGl0ZXJhbCBpbiBsYW5ndWFnZSBsaW5rYWdlIHNwZWNpZmllciBjYW5ub3QgaGF2ZSBhbiAiCisgICJlbmNvZGluZy1wcmVmaXgiPjsKIGRlZiB3YXJuX3VzZV9vdXRfb2Zfc2NvcGVfZGVjbGFyYXRpb24gOiBXYXJuaW5nPAogICAidXNlIG9mIG91dC1vZi1zY29wZSBkZWNsYXJhdGlvbiBvZiAlMCI+OwogZGVmIGVycl9pbmxpbmVfbm9uX2Z1bmN0aW9uIDogRXJyb3I8CkBAIC0yNTEsOSArMjczLDkgQEAKIGRlZiBlcnJfdXNpbmdfZGVjbF9uZXN0ZWRfbmFtZV9zcGVjaWZpZXJfaXNfbm90X2Jhc2VfY2xhc3MgOiBFcnJvcjwKICAgInVzaW5nIGRlY2xhcmF0aW9uIHJlZmVycyBpbnRvICclMCcsIHdoaWNoIGlzIG5vdCBhIGJhc2UgY2xhc3Mgb2YgJTEiPjsKIGRlZiBlcnJfdXNpbmdfZGVjbF9jb25zdHJ1Y3Rvcl9ub3RfaW5fZGlyZWN0X2Jhc2UgOiBFcnJvcjwKLSAgIiUwIGlzIG5vdCBhIGRpcmVjdCBiYXNlIG9mICUxLCBjYW4gbm90IGluaGVyaXQgY29uc3RydWN0b3JzIj47CisgICIlMCBpcyBub3QgYSBkaXJlY3QgYmFzZSBvZiAlMSwgY2Fubm90IGluaGVyaXQgY29uc3RydWN0b3JzIj47CiBkZWYgZXJyX3VzaW5nX2RlY2xfY29uc3RydWN0b3JfY29uZmxpY3QgOiBFcnJvcjwKLSAgImNhbiBub3QgaW5oZXJpdCBjb25zdHJ1Y3RvciwgYWxyZWFkeSBpbmhlcml0ZWQgY29uc3RydWN0b3Igd2l0aCAiCisgICJjYW5ub3QgaW5oZXJpdCBjb25zdHJ1Y3RvciwgYWxyZWFkeSBpbmhlcml0ZWQgY29uc3RydWN0b3Igd2l0aCAiCiAgICJ0aGUgc2FtZSBzaWduYXR1cmUiPjsKIGRlZiBub3RlX3VzaW5nX2RlY2xfY29uc3RydWN0b3JfY29uZmxpY3RfY3VycmVudF9jdG9yIDogTm90ZTwKICAgImNvbmZsaWN0aW5nIGNvbnN0cnVjdG9yIj47CkBAIC0yNjcsMTggKzI4OSwyMSBAQAogZGVmIG5vdGVfdXNpbmdfZGVjbF9jb25zdHJ1Y3Rvcl9lbGxpcHNpcyA6IE5vdGU8CiAgICJjb25zdHJ1Y3RvciBkZWNsYXJlZCB3aXRoIGVsbGlwc2lzIGhlcmUiPjsKIGRlZiBlcnJfdXNpbmdfZGVjbF9jYW5fbm90X3JlZmVyX3RvX2NsYXNzX21lbWJlciA6IEVycm9yPAotICAidXNpbmcgZGVjbGFyYXRpb24gY2FuIG5vdCByZWZlciB0byBjbGFzcyBtZW1iZXIiPjsKKyAgInVzaW5nIGRlY2xhcmF0aW9uIGNhbm5vdCByZWZlciB0byBjbGFzcyBtZW1iZXIiPjsKK2RlZiBub3RlX3VzaW5nX2RlY2xfY2xhc3NfbWVtYmVyX3dvcmthcm91bmQgOiBOb3RlPAorICAidXNlICVzZWxlY3R7YW4gYWxpYXMgZGVjbGFyYXRpb258YSB0eXBlZGVmIGRlY2xhcmF0aW9ufGEgcmVmZXJlbmNlfTAgIgorICAiaW5zdGVhZCI+OwogZGVmIGVycl91c2luZ19kZWNsX2Nhbl9ub3RfcmVmZXJfdG9fbmFtZXNwYWNlIDogRXJyb3I8Ci0gICJ1c2luZyBkZWNsYXJhdGlvbiBjYW4gbm90IHJlZmVyIHRvIG5hbWVzcGFjZSI+OworICAidXNpbmcgZGVjbGFyYXRpb24gY2Fubm90IHJlZmVyIHRvIG5hbWVzcGFjZSI+OwogZGVmIGVycl91c2luZ19kZWNsX2NvbnN0cnVjdG9yIDogRXJyb3I8Ci0gICJ1c2luZyBkZWNsYXJhdGlvbiBjYW4gbm90IHJlZmVyIHRvIGEgY29uc3RydWN0b3IiPjsKKyAgInVzaW5nIGRlY2xhcmF0aW9uIGNhbm5vdCByZWZlciB0byBhIGNvbnN0cnVjdG9yIj47CiBkZWYgd2Fybl9jeHg5OF9jb21wYXRfdXNpbmdfZGVjbF9jb25zdHJ1Y3RvciA6IFdhcm5pbmc8CiAgICJpbmhlcml0aW5nIGNvbnN0cnVjdG9ycyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTgiPiwKICAgSW5Hcm91cDxDWFg5OENvbXBhdD4sIERlZmF1bHRJZ25vcmU7CiBkZWYgZXJyX3VzaW5nX2RlY2xfZGVzdHJ1Y3RvciA6IEVycm9yPAotICAidXNpbmcgZGVjbGFyYXRpb24gY2FuIG5vdCByZWZlciB0byBhIGRlc3RydWN0b3IiPjsKKyAgInVzaW5nIGRlY2xhcmF0aW9uIGNhbm5vdCByZWZlciB0byBhIGRlc3RydWN0b3IiPjsKIGRlZiBlcnJfdXNpbmdfZGVjbF90ZW1wbGF0ZV9pZCA6IEVycm9yPAotICAidXNpbmcgZGVjbGFyYXRpb24gY2FuIG5vdCByZWZlciB0byBhIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIj47CisgICJ1c2luZyBkZWNsYXJhdGlvbiBjYW5ub3QgcmVmZXIgdG8gYSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiI+OwogZGVmIG5vdGVfdXNpbmdfZGVjbF90YXJnZXQgOiBOb3RlPCJ0YXJnZXQgb2YgdXNpbmcgZGVjbGFyYXRpb24iPjsKIGRlZiBub3RlX3VzaW5nX2RlY2xfY29uZmxpY3QgOiBOb3RlPCJjb25mbGljdGluZyBkZWNsYXJhdGlvbiI+OwogZGVmIGVycl91c2luZ19kZWNsX3JlZGVjbGFyYXRpb24gOiBFcnJvcjwicmVkZWNsYXJhdGlvbiBvZiB1c2luZyBkZWNsIj47CkBAIC0zMzcsOCArMzYyLDIyIEBACiBkZWYgd2Fybl9zdWdnZXN0X25vcmV0dXJuX2Jsb2NrIDogV2FybmluZzwKICAgImJsb2NrIGNvdWxkIGJlIGRlY2xhcmVkIHdpdGggYXR0cmlidXRlICdub3JldHVybiciPiwKICAgSW5Hcm91cDxNaXNzaW5nTm9yZXR1cm4+LCBEZWZhdWx0SWdub3JlOwotZGVmIHdhcm5fdW5yZWFjaGFibGUgOiBXYXJuaW5nPCJ3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkIj4sCi0gIEluR3JvdXA8RGlhZ0dyb3VwPCJ1bnJlYWNoYWJsZS1jb2RlIj4+LCBEZWZhdWx0SWdub3JlOworCisvLyBVbnJlYWNoYWJsZSBjb2RlLgorZGVmIHdhcm5fdW5yZWFjaGFibGUgOiBXYXJuaW5nPAorICAiY29kZSB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkIj4sCisgIEluR3JvdXA8VW5yZWFjaGFibGVDb2RlPiwgRGVmYXVsdElnbm9yZTsKK2RlZiB3YXJuX3VucmVhY2hhYmxlX2JyZWFrIDogV2FybmluZzwKKyAgIidicmVhaycgd2lsbCBuZXZlciBiZSBleGVjdXRlZCI+LAorICBJbkdyb3VwPFVucmVhY2hhYmxlQ29kZUJyZWFrPiwgRGVmYXVsdElnbm9yZTsKK2RlZiB3YXJuX3VucmVhY2hhYmxlX3JldHVybiA6IFdhcm5pbmc8CisgICIncmV0dXJuJyB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkIj4sCisgIEluR3JvdXA8VW5yZWFjaGFibGVDb2RlUmV0dXJuPiwgRGVmYXVsdElnbm9yZTsKK2RlZiB3YXJuX3VucmVhY2hhYmxlX2xvb3BfaW5jcmVtZW50IDogV2FybmluZzwKKyAgImxvb3Agd2lsbCBydW4gYXQgbW9zdCBvbmNlIChsb29wIGluY3JlbWVudCBuZXZlciBleGVjdXRlZCkiPiwKKyAgSW5Hcm91cDxVbnJlYWNoYWJsZUNvZGVMb29wSW5jcmVtZW50PiwgRGVmYXVsdElnbm9yZTsKK2RlZiBub3RlX3VucmVhY2hhYmxlX3NpbGVuY2UgOiBOb3RlPAorICAic2lsZW5jZSBieSBhZGRpbmcgcGFyZW50aGVzZXMgdG8gbWFyayBjb2RlIGFzIGV4cGxpY2l0bHkgZGVhZCI+OwogCiAvLy8gQnVpbHQtaW4gZnVuY3Rpb25zLgogZGVmIGV4dF9pbXBsaWNpdF9saWJfZnVuY3Rpb25fZGVjbCA6IEV4dFdhcm48CkBAIC0zNjMsOCArNDAyLDYgQEAKICAgImluY29tcGF0aWJsZSByZWRlY2xhcmF0aW9uIG9mIGxpYnJhcnkgZnVuY3Rpb24gJTAiPiwKICAgSW5Hcm91cDxEaWFnR3JvdXA8ImluY29tcGF0aWJsZS1saWJyYXJ5LXJlZGVjbGFyYXRpb24iPj47CiBkZWYgZXJyX2J1aWx0aW5fZGVmaW5pdGlvbiA6IEVycm9yPCJkZWZpbml0aW9uIG9mIGJ1aWx0aW4gZnVuY3Rpb24gJTAiPjsKLWRlZiBlcnJfdHlwZXNfY29tcGF0aWJsZV9wX2luX2NwbHVzcGx1cyA6IEVycm9yPAotICAiX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCBpcyBub3QgdmFsaWQgaW4gQysrIj47CiBkZWYgd2Fybl9idWlsdGluX3Vua25vd24gOiBXYXJuaW5nPCJ1c2Ugb2YgdW5rbm93biBidWlsdGluICUwIj4sCiAgIEluR3JvdXA8SW1wbGljaXRGdW5jdGlvbkRlY2xhcmU+LCBEZWZhdWx0RXJyb3I7CiBkZWYgd2Fybl9keW5fY2xhc3NfbWVtYWNjZXNzIDogV2FybmluZzwKQEAgLTM4OCwxMSArNDI1LDE4IEBACiAgICIlc2VsZWN0e2Rlc3RpbmF0aW9ufHNvdXJjZX0yOyBleHBlY3RlZCAlMyBvciBhbiBleHBsaWNpdCBsZW5ndGgiPiwKICAgSW5Hcm91cDxTaXplb2ZQb2ludGVyTWVtYWNjZXNzPjsKIGRlZiB3YXJuX3N0cmxjcHljYXRfd3Jvbmdfc2l6ZSA6IFdhcm5pbmc8Ci0gICJzaXplIGFyZ3VtZW50IGluICUwIGNhbGwgYXBwZWFycyB0byBiZSBzaXplIG9mIHRoZSBzb3VyY2U7IGV4cGVjdGVkIHRoZSBzaXplIG9mICIKLSAgInRoZSBkZXN0aW5hdGlvbiI+LAorICAic2l6ZSBhcmd1bWVudCBpbiAlMCBjYWxsIGFwcGVhcnMgdG8gYmUgc2l6ZSBvZiB0aGUgc291cmNlOyAiCisgICJleHBlY3RlZCB0aGUgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24iPiwKICAgSW5Hcm91cDxEaWFnR3JvdXA8InN0cmxjcHktc3RybGNhdC1zaXplIj4+OwogZGVmIG5vdGVfc3RybGNweWNhdF93cm9uZ19zaXplIDogTm90ZTwKICAgImNoYW5nZSBzaXplIGFyZ3VtZW50IHRvIGJlIHRoZSBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiI+OworZGVmIHdhcm5fbWVtc2l6ZV9jb21wYXJpc29uIDogV2FybmluZzwKKyAgInNpemUgYXJndW1lbnQgaW4gJTAgY2FsbCBpcyBhIGNvbXBhcmlzb24iPiwKKyAgSW5Hcm91cDxEaWFnR3JvdXA8Im1lbXNpemUtY29tcGFyaXNvbiI+PjsKK2RlZiB3YXJuX21lbXNpemVfY29tcGFyaXNvbl9wYXJlbl9ub3RlIDogTm90ZTwKKyAgImRpZCB5b3UgbWVhbiB0byBjb21wYXJlIHRoZSByZXN1bHQgb2YgJTAgaW5zdGVhZD8iPjsKK2RlZiB3YXJuX21lbXNpemVfY29tcGFyaXNvbl9jYXN0X25vdGUgOiBOb3RlPAorICAiZXhwbGljaXRseSBjYXN0IHRoZSBhcmd1bWVudCB0byBzaXplX3QgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmciPjsKICAgCiBkZWYgd2Fybl9zdHJuY2F0X2xhcmdlX3NpemUgOiBXYXJuaW5nPAogICAidGhlIHZhbHVlIG9mIHRoZSBzaXplIGFyZ3VtZW50IGluICdzdHJuY2F0JyBpcyB0b28gbGFyZ2UsIG1pZ2h0IGxlYWQgdG8gYSAiIApAQCAtNDE2LDcgKzQ2MCw4IEBACiBkZWYgbm90ZV9tYWluX3JlbW92ZV9ub3JldHVybiA6IE5vdGU8InJlbW92ZSAnX05vcmV0dXJuJyI+OwogZGVmIGVycl9jb25zdGV4cHJfbWFpbiA6IEVycm9yPAogICAiJ21haW4nIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGRlY2xhcmVkIGNvbnN0ZXhwciI+OwotZGVmIGVycl9tYWlubGlrZV90ZW1wbGF0ZV9kZWNsIDogRXJyb3I8IiclMCcgY2Fubm90IGJlIGEgdGVtcGxhdGUiPjsKK2RlZiBlcnJfZGVsZXRlZF9tYWluIDogRXJyb3I8IidtYWluJyBpcyBub3QgYWxsb3dlZCB0byBiZSBkZWxldGVkIj47CitkZWYgZXJyX21haW5saWtlX3RlbXBsYXRlX2RlY2wgOiBFcnJvcjwiJTAgY2Fubm90IGJlIGEgdGVtcGxhdGUiPjsKIGRlZiBlcnJfbWFpbl9yZXR1cm5zX25vbmludCA6IEVycm9yPCInbWFpbicgbXVzdCByZXR1cm4gJ2ludCciPjsKIGRlZiBleHRfbWFpbl9yZXR1cm5zX25vbmludCA6IEV4dFdhcm48InJldHVybiB0eXBlIG9mICdtYWluJyBpcyBub3QgJ2ludCciPiwKICAgICBJbkdyb3VwPE1haW5SZXR1cm5UeXBlPjsKQEAgLTQyOCw2ICs0NzMsOCBAQAogZGVmIGVycl9tYWluX2FyZ193cm9uZyA6IEVycm9yPCIlc2VsZWN0e2ZpcnN0fHNlY29uZHx0aGlyZHxmb3VydGh9MCAiCiAgICAgInBhcmFtZXRlciBvZiAnbWFpbicgKCVzZWxlY3R7YXJndW1lbnQgY291bnR8YXJndW1lbnQgYXJyYXl8ZW52aXJvbm1lbnR8IgogICAgICJwbGF0Zm9ybS1zcGVjaWZpYyBkYXRhfTApIG11c3QgYmUgb2YgdHlwZSAlMSI+OworZGVmIGV4dF9tYWluX3VzZWQgOiBFeHRlbnNpb248CisgICJJU08gQysrIGRvZXMgbm90IGFsbG93ICdtYWluJyB0byBiZSB1c2VkIGJ5IGEgcHJvZ3JhbSI+LCBJbkdyb3VwPE1haW4+OwogCiAvLy8gcGFyc2VyIGRpYWdub3N0aWNzCiBkZWYgZXh0X25vX2RlY2xhcmF0b3JzIDogRXh0V2FybjwiZGVjbGFyYXRpb24gZG9lcyBub3QgZGVjbGFyZSBhbnl0aGluZyI+LApAQCAtNDM1LDYgKzQ4MiwxMCBAQAogZGVmIGV4dF90eXBlZGVmX3dpdGhvdXRfYV9uYW1lIDogRXh0V2FybjwidHlwZWRlZiByZXF1aXJlcyBhIG5hbWUiPiwKICAgSW5Hcm91cDxNaXNzaW5nRGVjbGFyYXRpb25zPjsKIGRlZiBlcnJfdHlwZWRlZl9ub3RfaWRlbnRpZmllciA6IEVycm9yPCJ0eXBlZGVmIG5hbWUgbXVzdCBiZSBhbiBpZGVudGlmaWVyIj47CitkZWYgZXJyX3R5cGVkZWZfY2hhbmdlc19saW5rYWdlIDogRXJyb3I8InVuc3VwcG9ydGVkOiB0eXBlZGVmIGNoYW5nZXMgbGlua2FnZSIKKyAgIiBvZiBhbm9ueW1vdXMgdHlwZSwgYnV0IGxpbmthZ2Ugd2FzIGFscmVhZHkgY29tcHV0ZWQiPjsKK2RlZiBub3RlX3R5cGVkZWZfY2hhbmdlc19saW5rYWdlIDogTm90ZTwidXNlIGEgdGFnIG5hbWUgaGVyZSB0byBlc3RhYmxpc2ggIgorICAibGlua2FnZSBwcmlvciB0byBkZWZpbml0aW9uIj47CiBkZWYgZXJyX3N0YXRpY2FsbHlfYWxsb2NhdGVkX29iamVjdCA6IEVycm9yPAogICAiaW50ZXJmYWNlIHR5cGUgY2Fubm90IGJlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIj47CiBkZWYgZXJyX29iamVjdF9jYW5ub3RfYmVfcGFzc2VkX3JldHVybmVkX2J5X3ZhbHVlIDogRXJyb3I8CkBAIC00NTMsMjIgKzUwNCwzMCBAQAogICAiZGVjbGFyaW5nIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSBvZiB0eXBlICUwIGlzIG5vdCBhbGxvd2VkOyBkaWQgeW91IGZvcmdldCAqID8iPjsKIGRlZiB3YXJuX2VudW1fdmFsdWVfb3ZlcmZsb3cgOiBXYXJuaW5nPCJvdmVyZmxvdyBpbiBlbnVtZXJhdGlvbiB2YWx1ZSI+OwogZGVmIHdhcm5fcHJhZ21hX29wdGlvbnNfYWxpZ25fcmVzZXRfZmFpbGVkIDogV2FybmluZzwKLSAgIiNwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldCBmYWlsZWQ6ICUwIj47CisgICIjcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQgZmFpbGVkOiAlMCI+LAorICBJbkdyb3VwPElnbm9yZWRQcmFnbWFzPjsKIGRlZiBlcnJfcHJhZ21hX29wdGlvbnNfYWxpZ25fbWFjNjhrX3RhcmdldF91bnN1cHBvcnRlZCA6IEVycm9yPAogICAibWFjNjhrIGFsaWdubWVudCBwcmFnbWEgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHRhcmdldCI+OwogZGVmIHdhcm5fcHJhZ21hX3BhY2tfaW52YWxpZF9hbGlnbm1lbnQgOiBXYXJuaW5nPAotICAiZXhwZWN0ZWQgI3ByYWdtYSBwYWNrIHBhcmFtZXRlciB0byBiZSAnMScsICcyJywgJzQnLCAnOCcsIG9yICcxNiciPjsKKyAgImV4cGVjdGVkICNwcmFnbWEgcGFjayBwYXJhbWV0ZXIgdG8gYmUgJzEnLCAnMicsICc0JywgJzgnLCBvciAnMTYnIj4sCisgIEluR3JvdXA8SWdub3JlZFByYWdtYXM+OwogLy8gRm9sbG93IHRoZSBNU1ZDIGltcGxlbWVudGF0aW9uLgogZGVmIHdhcm5fcHJhZ21hX3BhY2tfc2hvdyA6IFdhcm5pbmc8InZhbHVlIG9mICNwcmFnbWEgcGFjayhzaG93KSA9PSAlMCI+OwogZGVmIHdhcm5fcHJhZ21hX3BhY2tfcG9wX2lkZW50aWZlcl9hbmRfYWxpZ25tZW50IDogV2FybmluZzwKICAgInNwZWNpZnlpbmcgYm90aCBhIG5hbWUgYW5kIGFsaWdubWVudCB0byAncG9wJyBpcyB1bmRlZmluZWQiPjsKLWRlZiB3YXJuX3ByYWdtYV9wYWNrX3BvcF9mYWlsZWQgOiBXYXJuaW5nPCIjcHJhZ21hIHBhY2socG9wLCAuLi4pIGZhaWxlZDogJTAiPjsKLWRlZiB3YXJuX3ByYWdtYV9tc19zdHJ1Y3RfZmFpbGVkIDogV2FybmluZzwiI3ByYW1nYSBtc19zdHJ1Y3QgY2FuIG5vdCBiZSB1c2VkIHdpdGggZHluYW1pYyBjbGFzc2VzIG9yIHN0cnVjdHVyZXMiPiwgSW5Hcm91cDxJZ25vcmVkQXR0cmlidXRlcz47CitkZWYgd2Fybl9wcmFnbWFfcG9wX2ZhaWxlZCA6IFdhcm5pbmc8IiNwcmFnbWEgJTAocG9wLCAuLi4pIGZhaWxlZDogJTEiPiwKKyAgSW5Hcm91cDxJZ25vcmVkUHJhZ21hcz47CitkZWYgd2Fybl9jeHhfbXNfc3RydWN0IDoKKyAgV2FybmluZzwibXNfc3RydWN0IG1heSBub3QgcHJvZHVjZSBNU1ZDLWNvbXBhdGlibGUgbGF5b3V0cyBmb3IgY2xhc3NlcyAiCisgICAgICAgICAgIndpdGggYmFzZSBjbGFzc2VzIG9yIHZpcnR1YWwgZnVuY3Rpb25zIj4sCisgIERlZmF1bHRFcnJvciwgSW5Hcm91cDxJbmNvbXBhdGlibGVNU1N0cnVjdD47CiAKIGRlZiB3YXJuX3ByYWdtYV91bnVzZWRfdW5kZWNsYXJlZF92YXIgOiBXYXJuaW5nPAotICAidW5kZWNsYXJlZCB2YXJpYWJsZSAlMCB1c2VkIGFzIGFuIGFyZ3VtZW50IGZvciAnI3ByYWdtYSB1bnVzZWQnIj47CisgICJ1bmRlY2xhcmVkIHZhcmlhYmxlICUwIHVzZWQgYXMgYW4gYXJndW1lbnQgZm9yICcjcHJhZ21hIHVudXNlZCciPiwKKyAgSW5Hcm91cDxJZ25vcmVkUHJhZ21hcz47CiBkZWYgd2Fybl9wcmFnbWFfdW51c2VkX2V4cGVjdGVkX3Zhcl9hcmcgOiBXYXJuaW5nPAotICAib25seSB2YXJpYWJsZXMgY2FuIGJlIGFyZ3VtZW50cyB0byAnI3ByYWdtYSB1bnVzZWQnIj47CisgICJvbmx5IHZhcmlhYmxlcyBjYW4gYmUgYXJndW1lbnRzIHRvICcjcHJhZ21hIHVudXNlZCciPiwKKyAgSW5Hcm91cDxJZ25vcmVkUHJhZ21hcz47CiBkZWYgZXJyX3ByYWdtYV9wdXNoX3Zpc2liaWxpdHlfbWlzbWF0Y2ggOiBFcnJvcjwKICAgIiNwcmFnbWEgdmlzaWJpbGl0eSBwdXNoIHdpdGggbm8gbWF0Y2hpbmcgI3ByYWdtYSB2aXNpYmlsaXR5IHBvcCI+OwogZGVmIG5vdGVfc3Vycm91bmRpbmdfbmFtZXNwYWNlX2VuZHNfaGVyZSA6IE5vdGU8CkBAIC01NDcsMTIgKzYwNiwxMCBAQAogICAiaW5zdGFuY2UgdmFyaWFibGUgJTAgaGFzIGNvbmZsaWN0aW5nIGJpdC1maWVsZCB3aWR0aCI+OwogZGVmIGVycl9jb25mbGljdGluZ19pdmFyX25hbWUgOiBFcnJvcjwKICAgImNvbmZsaWN0aW5nIGluc3RhbmNlIHZhcmlhYmxlIG5hbWVzOiAlMCB2cyAlMSI+OwotZGVmIGVycl9pbmNvbnNpc3RhbnRfaXZhcl9jb3VudCA6IEVycm9yPAorZGVmIGVycl9pbmNvbnNpc3RlbnRfaXZhcl9jb3VudCA6IEVycm9yPAogICAiaW5jb25zaXN0ZW50IG51bWJlciBvZiBpbnN0YW5jZSB2YXJpYWJsZXMgc3BlY2lmaWVkIj47CiBkZWYgd2Fybl91bmRlZl9tZXRob2RfaW1wbCA6IFdhcm5pbmc8Im1ldGhvZCBkZWZpbml0aW9uIGZvciAlMCBub3QgZm91bmQiPiwKICAgSW5Hcm91cDxEaWFnR3JvdXA8ImluY29tcGxldGUtaW1wbGVtZW50YXRpb24iPj47Ci1kZWYgbm90ZV9yZXF1aXJlZF9mb3JfcHJvdG9jb2xfYXQgOiAKLSAgTm90ZTwicmVxdWlyZWQgZm9yIGRpcmVjdCBvciBpbmRpcmVjdCBwcm90b2NvbCAlMCI+OwogCiBkZWYgd2Fybl9jb25mbGljdGluZ19vdmVycmlkaW5nX3JldF90eXBlcyA6IFdhcm5pbmc8CiAgICJjb25mbGljdGluZyByZXR1cm4gdHlwZSBpbiAiCkBAIC02OTYsMjEgKzc1MywyMSBAQAogZGVmIGVycl9hdG9taWNfcHJvcGVydHlfbm9udHJpdmlhbF9hc3NpZ25fb3AgOiBFcnJvcjwKICAgImF0b21pYyBwcm9wZXJ0eSBvZiByZWZlcmVuY2UgdHlwZSAlMCBjYW5ub3QgaGF2ZSBub24tdHJpdmlhbCBhc3NpZ25tZW50IgogICAiIG9wZXJhdG9yIj47Ci1kZWYgd2Fybl9vd25pbmdfZ2V0dGVyX3J1bGUgOiBXYXJuaW5nPAotICAicHJvcGVydHkncyBzeW50aGVzaXplZCBnZXR0ZXIgZm9sbG93cyBDb2NvYSBuYW1pbmciCitkZWYgd2Fybl9jb2NvYV9uYW1pbmdfb3duZWRfcnVsZSA6IFdhcm5pbmc8CisgICJwcm9wZXJ0eSBmb2xsb3dzIENvY29hIG5hbWluZyIKICAgIiBjb252ZW50aW9uIGZvciByZXR1cm5pbmcgJ293bmVkJyBvYmplY3RzIj4sCiAgIEluR3JvdXA8RGlhZ0dyb3VwPCJvYmpjLXByb3BlcnR5LW1hdGNoZXMtY29jb2Etb3duZXJzaGlwLXJ1bGUiPj47CiBkZWYgd2Fybl9hdXRvX3N5bnRoZXNpemluZ19wcm90b2NvbF9wcm9wZXJ0eSA6V2FybmluZzwKLSAgImF1dG8gcHJvcGVydHkgc3ludGhlc2lzIHdpbGwgbm90IHN5bnRoZXNpemUgcHJvcGVydHkiCi0gICIgZGVjbGFyZWQgaW4gYSBwcm90b2NvbCI+LAorICAiYXV0byBwcm9wZXJ0eSBzeW50aGVzaXMgd2lsbCBub3Qgc3ludGhlc2l6ZSBwcm9wZXJ0eSAlMCIKKyAgIiBkZWNsYXJlZCBpbiBwcm90b2NvbCAlMSI+LAogICBJbkdyb3VwPERpYWdHcm91cDwib2JqYy1wcm90b2NvbC1wcm9wZXJ0eS1zeW50aGVzaXMiPj47CiBkZWYgd2Fybl9ub19hdXRvc3ludGhlc2lzX3NoYXJlZF9pdmFyX3Byb3BlcnR5IDogV2FybmluZyA8CiAgICJhdXRvIHByb3BlcnR5IHN5bnRoZXNpcyB3aWxsIG5vdCBzeW50aGVzaXplIHByb3BlcnR5ICIKLSAgIiclMCcgYmVjYXVzZSBpdCBjYW5ub3Qgc2hhcmUgYW4gaXZhciB3aXRoIGFub3RoZXIgc3ludGhlc2l6ZWQgcHJvcGVydHkiPiwKKyAgIiUwIGJlY2F1c2UgaXQgY2Fubm90IHNoYXJlIGFuIGl2YXIgd2l0aCBhbm90aGVyIHN5bnRoZXNpemVkIHByb3BlcnR5Ij4sCiAgIEluR3JvdXA8T2JqQ05vUHJvcGVydHlBdXRvU3ludGhlc2lzPjsKIGRlZiB3YXJuX25vX2F1dG9zeW50aGVzaXNfcHJvcGVydHkgOiBXYXJuaW5nPAogICAiYXV0byBwcm9wZXJ0eSBzeW50aGVzaXMgd2lsbCBub3Qgc3ludGhlc2l6ZSBwcm9wZXJ0eSAiCi0gICInJTAnIGJlY2F1c2UgaXQgaXMgJ3JlYWR3cml0ZScgYnV0IGl0IHdpbGwgYmUgc3ludGhlc2l6ZWQgJ3JlYWRvbmx5JyAiCisgICIlMCBiZWNhdXNlIGl0IGlzICdyZWFkd3JpdGUnIGJ1dCBpdCB3aWxsIGJlIHN5bnRoZXNpemVkICdyZWFkb25seScgIgogICAidmlhIGFub3RoZXIgcHJvcGVydHkiPiwKICAgSW5Hcm91cDxPYmpDTm9Qcm9wZXJ0eUF1dG9TeW50aGVzaXM+OwogZGVmIHdhcm5fYXV0b3N5bnRoZXNpc19wcm9wZXJ0eV9pdmFyX21hdGNoIDpXYXJuaW5nPApAQCAtNzI0LDEwICs3ODEsMTAgQEAKICAgInByb3BlcnR5IGRlY2xhcmVkIGFzIHJldHVybmluZyBub24tcmV0YWluZWQgb2JqZWN0cyIKICAgIjsgZ2V0dGVyIHJldHVybmluZyByZXRhaW5lZCBvYmplY3RzIj47CiBkZWYgZXJyb3JfcHJvcGVydHlfc2V0dGVyX2FtYmlndW91c191c2UgOiBFcnJvcjwKLSAgInN5bnRoZXNpemVkIHByb3BlcnRpZXMgJyUwJyBhbmQgJyUxJyBib3RoIGNsYWltIHNldHRlciAlMiAtIgorICAic3ludGhlc2l6ZWQgcHJvcGVydGllcyAlMCBhbmQgJTEgYm90aCBjbGFpbSBzZXR0ZXIgJTIgLSIKICAgIiB1c2Ugb2YgdGhpcyBzZXR0ZXIgd2lsbCBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9yIj47Ci1kZWYgZXJyX293bmluX2dldHRlcl9ydWxlIDogRXJyb3I8Ci0gICJwcm9wZXJ0eSdzIHN5bnRoZXNpemVkIGdldHRlciBmb2xsb3dzIENvY29hIG5hbWluZyIKK2RlZiBlcnJfY29jb2FfbmFtaW5nX293bmVkX3J1bGUgOiBFcnJvcjwKKyAgInByb3BlcnR5IGZvbGxvd3MgQ29jb2EgbmFtaW5nIgogICAiIGNvbnZlbnRpb24gZm9yIHJldHVybmluZyAnb3duZWQnIG9iamVjdHMiPjsKIGRlZiB3YXJuX2RlZmF1bHRfYXRvbWljX2N1c3RvbV9nZXR0ZXJfc2V0dGVyIDogV2FybmluZzwKICAgImF0b21pYyBieSBkZWZhdWx0IHByb3BlcnR5ICUwIGhhcyBhIHVzZXIgZGVmaW5lZCAlc2VsZWN0e2dldHRlcnxzZXR0ZXJ9MSAiCkBAIC03NzgsNiArODM1LDkgQEAKIGRlZiB3YXJuX2FyY19wZXJmb3JtX3NlbGVjdG9yX2xlYWtzIDogV2FybmluZzwKICAgInBlcmZvcm1TZWxlY3RvciBtYXkgY2F1c2UgYSBsZWFrIGJlY2F1c2UgaXRzIHNlbGVjdG9yIGlzIHVua25vd24iPiwKICAgSW5Hcm91cDxEaWFnR3JvdXA8ImFyYy1wZXJmb3JtU2VsZWN0b3ItbGVha3MiPj47CitkZWYgd2Fybl9kZWFsbG9jX2luX2NhdGVnb3J5IDogV2FybmluZzwKKyItZGVhbGxvYyBpcyBiZWluZyBvdmVycmlkZGVuIGluIGEgY2F0ZWdvcnkiPiwKK0luR3JvdXA8RGVhbGxvY0luQ2F0ZWdvcnk+OwogZGVmIGVycl9nY193ZWFrX3Byb3BlcnR5X3N0cm9uZ190eXBlIDogRXJyb3I8CiAgICJ3ZWFrIGF0dHJpYnV0ZSBkZWNsYXJlZCBvbiBhIF9fc3Ryb25nIHR5cGUgcHJvcGVydHkgaW4gR0MgbW9kZSI+OwogZGVmIHdhcm5fcmVjZWl2ZXJfaXNfd2VhayA6IFdhcm5pbmcgPApAQCAtODE4LDEzICs4NzgsMTAgQEAKIGRlZiBlcnJvcl9zdHJvbmdfcHJvcGVydHkgOiBFcnJvcjwKICAgImV4aXN0aW5nIGluc3RhbmNlIHZhcmlhYmxlICUxIGZvciBzdHJvbmcgcHJvcGVydHkgJTAgbWF5IG5vdCBiZSBfX3dlYWsiPjsKIGRlZiBlcnJvcl9keW5hbWljX3Byb3BlcnR5X2l2YXJfZGVjbCA6IEVycm9yPAotICAiZHluYW1pYyBwcm9wZXJ0eSBjYW4gbm90IGhhdmUgaW5zdGFuY2UgdmFyaWFibGUgc3BlY2lmaWNhdGlvbiI+OworICAiZHluYW1pYyBwcm9wZXJ0eSBjYW5ub3QgaGF2ZSBpbnN0YW5jZSB2YXJpYWJsZSBzcGVjaWZpY2F0aW9uIj47CiBkZWYgZXJyb3JfZHVwbGljYXRlX2l2YXJfdXNlIDogRXJyb3I8CiAgICJzeW50aGVzaXplZCBwcm9wZXJ0aWVzICUwIGFuZCAlMSBib3RoIGNsYWltIGluc3RhbmNlIHZhcmlhYmxlICUyIj47CiBkZWYgZXJyb3JfcHJvcGVydHlfaW1wbGVtZW50ZWQgOiBFcnJvcjwicHJvcGVydHkgJTAgaXMgYWxyZWFkeSBpbXBsZW1lbnRlZCI+OwotZGVmIHdhcm5fb2JqY19wcm9wZXJ0eV9hdHRyX211dHVhbGx5X2V4Y2x1c2l2ZSA6IFdhcm5pbmc8Ci0gICJwcm9wZXJ0eSBhdHRyaWJ1dGVzICclMCcgYW5kICclMScgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSI+LAotICBJbkdyb3VwPFJlYWRPbmx5U2V0dGVyQXR0cnM+LCBEZWZhdWx0SWdub3JlOwogZGVmIHdhcm5fb2JqY19taXNzaW5nX3N1cGVyX2NhbGwgOiBXYXJuaW5nPAogICAibWV0aG9kIHBvc3NpYmx5IG1pc3NpbmcgYSBbc3VwZXIgJTBdIGNhbGwiPiwKICAgSW5Hcm91cDxPYmpDTWlzc2luZ1N1cGVyQ2FsbHM+OwpAQCAtODQxLDE5ICs4OTgsMjEgQEAKIGRlZiBub3RlX2F1dG9fcmVhZG9ubHlfaWJvdXRsZXRfZml4dXBfc3VnZ2VzdCA6IE5vdGU8CiAgICJwcm9wZXJ0eSBzaG91bGQgYmUgY2hhbmdlZCB0byBiZSByZWFkd3JpdGUiPjsKIGRlZiB3YXJuX2F1dG9fcmVhZG9ubHlfaWJvdXRsZXRfcHJvcGVydHkgOiBXYXJuaW5nPAotICAicmVhZG9ubHkgSUJPdXRsZXQgcHJvcGVydHkgJyUwJyB3aGVuIGF1dG8tc3ludGhlc2l6ZWQgbWF5ICIKKyAgInJlYWRvbmx5IElCT3V0bGV0IHByb3BlcnR5ICUwIHdoZW4gYXV0by1zeW50aGVzaXplZCBtYXkgIgogICAibm90IHdvcmsgY29ycmVjdGx5IHdpdGggJ25pYicgbG9hZGVyIj4sCiAgIEluR3JvdXA8RGlhZ0dyb3VwPCJyZWFkb25seS1pYm91dGxldC1wcm9wZXJ0eSI+PjsKIGRlZiB3YXJuX2F1dG9faW1wbGljaXRfYXRvbWljX3Byb3BlcnR5IDogV2FybmluZzwKICAgInByb3BlcnR5IGlzIGFzc3VtZWQgYXRvbWljIHdoZW4gYXV0by1zeW50aGVzaXppbmcgdGhlIHByb3BlcnR5Ij4sCiAgIEluR3JvdXA8SW1wbGljaXRBdG9taWM+LCBEZWZhdWx0SWdub3JlOwogZGVmIHdhcm5fdW5pbXBsZW1lbnRlZF9zZWxlY3RvcjogIFdhcm5pbmc8Ci0gICJjcmVhdGluZyBzZWxlY3RvciBmb3Igbm9uZXhpc3RlbnQgbWV0aG9kICUwIj4sIEluR3JvdXA8U2VsZWN0b3I+LCBEZWZhdWx0SWdub3JlOwotZGVmIHdhcm5pbmdfbXVsdGlwbGVfc2VsZWN0b3JzOiBXYXJuaW5nPAotICAibXVsdGlwbGUgc2VsZWN0b3JzIG5hbWVkICUwIGZvdW5kIj4sIEluR3JvdXA8U2VsZWN0b3JUeXBlTWlzbWF0Y2g+LCBEZWZhdWx0SWdub3JlOworICAibm8gbWV0aG9kIHdpdGggc2VsZWN0b3IgJTAgaXMgaW1wbGVtZW50ZWQgaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0Ij4sIAorICBJbkdyb3VwPFNlbGVjdG9yPiwgRGVmYXVsdElnbm9yZTsKIGRlZiB3YXJuX3VuaW1wbGVtZW50ZWRfcHJvdG9jb2xfbWV0aG9kIDogV2FybmluZzwKLSAgIm1ldGhvZCAlMCBpbiBwcm90b2NvbCBub3QgaW1wbGVtZW50ZWQiPiwgSW5Hcm91cDxQcm90b2NvbD47Ci0KKyAgIm1ldGhvZCAlMCBpbiBwcm90b2NvbCAlMSBub3QgaW1wbGVtZW50ZWQiPiwgSW5Hcm91cDxQcm90b2NvbD47CitkZWYgd2FybmluZ19tdWx0aXBsZV9zZWxlY3RvcnM6IFdhcm5pbmc8CisgICJzZXZlcmFsIG1ldGhvZHMgd2l0aCBzZWxlY3RvciAlMCBvZiBtaXNtYXRjaGVkIHR5cGVzIGFyZSBmb3VuZCAiCisgICJmb3IgdGhlIEBzZWxlY3RvciBleHByZXNzaW9uIj4sCisgIEluR3JvdXA8U2VsZWN0b3JUeXBlTWlzbWF0Y2g+LCBEZWZhdWx0SWdub3JlOwogLy8gQysrIGRlY2xhcmF0aW9ucwogZGVmIGVycl9zdGF0aWNfYXNzZXJ0X2V4cHJlc3Npb25faXNfbm90X2NvbnN0YW50IDogRXJyb3I8CiAgICJzdGF0aWNfYXNzZXJ0IGV4cHJlc3Npb24gaXMgbm90IGFuIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb24iPjsKQEAgLTkzNywxOSArOTk2LDIzIEBACiBkZWYgZXJyX2FycmF5X29mX2Fic3RyYWN0X3R5cGUgOiBFcnJvcjwiYXJyYXkgb2YgYWJzdHJhY3QgY2xhc3MgdHlwZSAlMCI+OwogZGVmIGVycl9jYXB0dXJlX29mX2Fic3RyYWN0X3R5cGUgOiBFcnJvcjwKICAgImJ5LWNvcHkgY2FwdHVyZSBvZiB2YWx1ZSBvZiBhYnN0cmFjdCB0eXBlICUwIj47CitkZWYgZXJyX2NhcHR1cmVfb2ZfaW5jb21wbGV0ZV90eXBlIDogRXJyb3I8CisgICJieS1jb3B5IGNhcHR1cmUgb2YgdmFyaWFibGUgJTAgd2l0aCBpbmNvbXBsZXRlIHR5cGUgJTEiPjsKK2RlZiBlcnJfY2FwdHVyZV9kZWZhdWx0X25vbl9sb2NhbCA6IEVycm9yPAorICAibm9uLWxvY2FsIGxhbWJkYSBleHByZXNzaW9uIGNhbm5vdCBoYXZlIGEgY2FwdHVyZS1kZWZhdWx0Ij47CiAKIGRlZiBlcnJfbXVsdGlwbGVfZmluYWxfb3ZlcnJpZGVycyA6IEVycm9yPAogICAidmlydHVhbCBmdW5jdGlvbiAlcTAgaGFzIG1vcmUgdGhhbiBvbmUgZmluYWwgb3ZlcnJpZGVyIGluICUxIj47IAogZGVmIG5vdGVfZmluYWxfb3ZlcnJpZGVyIDogTm90ZTwiZmluYWwgb3ZlcnJpZGVyIG9mICVxMCBpbiAlMSI+OwogCiBkZWYgZXJyX3R5cGVfZGVmaW5lZF9pbl90eXBlX3NwZWNpZmllciA6IEVycm9yPAotICAiJTAgY2FuIG5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBzcGVjaWZpZXIiPjsKKyAgIiUwIGNhbm5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBzcGVjaWZpZXIiPjsKIGRlZiBlcnJfdHlwZV9kZWZpbmVkX2luX3Jlc3VsdF90eXBlIDogRXJyb3I8Ci0gICIlMCBjYW4gbm90IGJlIGRlZmluZWQgaW4gdGhlIHJlc3VsdCB0eXBlIG9mIGEgZnVuY3Rpb24iPjsKKyAgIiUwIGNhbm5vdCBiZSBkZWZpbmVkIGluIHRoZSByZXN1bHQgdHlwZSBvZiBhIGZ1bmN0aW9uIj47CiBkZWYgZXJyX3R5cGVfZGVmaW5lZF9pbl9wYXJhbV90eXBlIDogRXJyb3I8Ci0gICIlMCBjYW4gbm90IGJlIGRlZmluZWQgaW4gYSBwYXJhbWV0ZXIgdHlwZSI+OworICAiJTAgY2Fubm90IGJlIGRlZmluZWQgaW4gYSBwYXJhbWV0ZXIgdHlwZSI+OwogZGVmIGVycl90eXBlX2RlZmluZWRfaW5fYWxpYXNfdGVtcGxhdGUgOiBFcnJvcjwKLSAgIiUwIGNhbiBub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgYWxpYXMgdGVtcGxhdGUiPjsKKyAgIiUwIGNhbm5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBhbGlhcyB0ZW1wbGF0ZSI+OwogCiBkZWYgbm90ZV9wdXJlX3ZpcnR1YWxfZnVuY3Rpb24gOiBOb3RlPAogICAidW5pbXBsZW1lbnRlZCBwdXJlIHZpcnR1YWwgbWV0aG9kICUwIGluICUxIj47CkBAIC0xMTE5LDcgKzExODIsNyBAQAogZGVmIGVycl92aXJ0dWFsX291dF9vZl9jbGFzcyA6IEVycm9yPAogICAiJ3ZpcnR1YWwnIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpbnNpZGUgdGhlIGNsYXNzIGRlZmluaXRpb24iPjsKIGRlZiBlcnJfdmlydHVhbF9tZW1iZXJfZnVuY3Rpb25fdGVtcGxhdGUgOiBFcnJvcjwKLSAgIid2aXJ0dWFsJyBjYW4gbm90IGJlIHNwZWNpZmllZCBvbiBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGVzIj47CisgICIndmlydHVhbCcgY2Fubm90IGJlIHNwZWNpZmllZCBvbiBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGVzIj47CiBkZWYgZXJyX3N0YXRpY19vdmVycmlkZXNfdmlydHVhbCA6IEVycm9yPAogICAiJ3N0YXRpYycgbWVtYmVyIGZ1bmN0aW9uICUwIG92ZXJyaWRlcyBhIHZpcnR1YWwgZnVuY3Rpb24gaW4gYSBiYXNlIGNsYXNzIj47CiBkZWYgZXJyX2V4cGxpY2l0X25vbl9mdW5jdGlvbiA6IEVycm9yPApAQCAtMTQ5NSwxNiArMTU1OCwyMiBAQAogICAiZGVjbGFyYXRpb24gb2YgdmFyaWFibGUgJTAgd2l0aCB0eXBlICUxIHJlcXVpcmVzIGFuIGluaXRpYWxpemVyIj47CiBkZWYgZXJyX2F1dG9fbmV3X3JlcXVpcmVzX2N0b3JfYXJnIDogRXJyb3I8CiAgICJuZXcgZXhwcmVzc2lvbiBmb3IgdHlwZSAlMCByZXF1aXJlcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50Ij47Ci1kZWYgZXJyX2F1dG9fbmV3X3JlcXVpcmVzX3BhcmVucyA6IEVycm9yPAorZGVmIGVycl9hdXRvX25ld19saXN0X2luaXQgOiBFcnJvcjwKICAgIm5ldyBleHByZXNzaW9uIGZvciB0eXBlICUwIGNhbm5vdCB1c2UgbGlzdC1pbml0aWFsaXphdGlvbiI+OwogZGVmIGVycl9hdXRvX3Zhcl9pbml0X25vX2V4cHJlc3Npb24gOiBFcnJvcjwKICAgImluaXRpYWxpemVyIGZvciB2YXJpYWJsZSAlMCB3aXRoIHR5cGUgJTEgaXMgZW1wdHkiPjsKIGRlZiBlcnJfYXV0b192YXJfaW5pdF9tdWx0aXBsZV9leHByZXNzaW9ucyA6IEVycm9yPAogICAiaW5pdGlhbGl6ZXIgZm9yIHZhcmlhYmxlICUwIHdpdGggdHlwZSAlMSBjb250YWlucyBtdWx0aXBsZSBleHByZXNzaW9ucyI+OworZGVmIGVycl9hdXRvX3Zhcl9pbml0X3BhcmVuX2JyYWNlcyA6IEVycm9yPAorICAiY2Fubm90IGRlZHVjZSB0eXBlIGZvciB2YXJpYWJsZSAlMCB3aXRoIHR5cGUgJTEgZnJvbSAiCisgICJwYXJlbnRoZXNpemVkIGluaXRpYWxpemVyIGxpc3QiPjsKIGRlZiBlcnJfYXV0b19uZXdfY3Rvcl9tdWx0aXBsZV9leHByZXNzaW9ucyA6IEVycm9yPAogICAibmV3IGV4cHJlc3Npb24gZm9yIHR5cGUgJTAgY29udGFpbnMgbXVsdGlwbGUgY29uc3RydWN0b3IgYXJndW1lbnRzIj47CiBkZWYgZXJyX2F1dG9fbWlzc2luZ190cmFpbGluZ19yZXR1cm4gOiBFcnJvcjwKLSAgIidhdXRvJyByZXR1cm4gd2l0aG91dCB0cmFpbGluZyByZXR1cm4gdHlwZSI+OworICAiJ2F1dG8nIHJldHVybiB3aXRob3V0IHRyYWlsaW5nIHJldHVybiB0eXBlOyBkZWR1Y2VkIHJldHVybiB0eXBlcyBhcmUgYSAiCisgICJDKysxeSBleHRlbnNpb24iPjsKK2RlZiBlcnJfZGVkdWNlZF9yZXR1cm5fdHlwZSA6IEVycm9yPAorICAiZGVkdWNlZCByZXR1cm4gdHlwZXMgYXJlIGEgQysrMXkgZXh0ZW5zaW9uIj47CiBkZWYgZXJyX3RyYWlsaW5nX3JldHVybl93aXRob3V0X2F1dG8gOiBFcnJvcjwKICAgImZ1bmN0aW9uIHdpdGggdHJhaWxpbmcgcmV0dXJuIHR5cGUgbXVzdCBzcGVjaWZ5IHJldHVybiB0eXBlICdhdXRvJywgbm90ICUwIj47CiBkZWYgZXJyX3RyYWlsaW5nX3JldHVybl9pbl9wYXJlbnMgOiBFcnJvcjwKQEAgLTE1NzAsNyArMTYzOSw3IEBACiAgICJhYnN0cmFjdCBjbGFzcyBpcyBtYXJrZWQgJyVzZWxlY3R7ZmluYWx8c2VhbGVkfTAnIj4sIEluR3JvdXA8QWJzdHJhY3RGaW5hbENsYXNzPjsKIAogLy8gQysrMTEgYXR0cmlidXRlcwotZGVmIGVycl9yZXBlYXRfYXR0cmlidXRlIDogRXJyb3I8IiclMCcgYXR0cmlidXRlIGNhbm5vdCBiZSByZXBlYXRlZCI+OworZGVmIGVycl9yZXBlYXRfYXR0cmlidXRlIDogRXJyb3I8IiUwIGF0dHJpYnV0ZSBjYW5ub3QgYmUgcmVwZWF0ZWQiPjsKIAogLy8gQysrMTEgZmluYWwKIGRlZiBlcnJfZmluYWxfZnVuY3Rpb25fb3ZlcnJpZGRlbiA6IEVycm9yPApAQCAtMTczMCw2ICsxNzk5LDggQEAKIGRlZiBleHRfY29uc3RleHByX2Z1bmN0aW9uX25ldmVyX2NvbnN0YW50X2V4cHIgOiBFeHRXYXJuPAogICAiY29uc3RleHByICVzZWxlY3R7ZnVuY3Rpb258Y29uc3RydWN0b3J9MCBuZXZlciBwcm9kdWNlcyBhICIKICAgImNvbnN0YW50IGV4cHJlc3Npb24iPiwgSW5Hcm91cDxEaWFnR3JvdXA8ImludmFsaWQtY29uc3RleHByIj4+LCBEZWZhdWx0RXJyb3I7CitkZWYgZXJyX2VuYWJsZV9pZl9uZXZlcl9jb25zdGFudF9leHByIDogRXJyb3I8CisgICInZW5hYmxlX2lmJyBhdHRyaWJ1dGUgZXhwcmVzc2lvbiBuZXZlciBwcm9kdWNlcyBhIGNvbnN0YW50IGV4cHJlc3Npb24iPjsKIGRlZiBlcnJfY29uc3RleHByX2JvZHlfbm9fcmV0dXJuIDogRXJyb3I8CiAgICJubyByZXR1cm4gc3RhdGVtZW50IGluIGNvbnN0ZXhwciBmdW5jdGlvbiI+OwogZGVmIHdhcm5fY3h4MTFfY29tcGF0X2NvbnN0ZXhwcl9ib2R5X25vX3JldHVybiA6IFdhcm5pbmc8CkBAIC0xNzg2LDcgKzE4NTcsNyBAQAogCiAvLyBBdHRyaWJ1dGVzCiBkZWYgZXJyX25zb2JqZWN0X2F0dHJpYnV0ZSA6IEVycm9yPAotICAiX19hdHRyaWJ1dGUgKChOU09iamVjdCkpIGlzIGZvciBwb2ludGVyIHR5cGVzIG9ubHkiPjsKKyAgIidOU09iamVjdCcgYXR0cmlidXRlIGlzIGZvciBwb2ludGVyIHR5cGVzIG9ubHkiPjsKIGRlZiBlcnJfYXR0cmlidXRlX2Nhbl9iZV9hcHBsaWVkX29ubHlfdG9fc3ltYm9sX2RlY2xhcmF0aW9uIDogRXJyb3I8CiAgICIlMCBhdHRyaWJ1dGUgY2FuIGJlIGFwcGxpZWQgb25seSB0byBzeW1ib2wgZGVjbGFyYXRpb24iPjsKIGRlZiBlcnJfYXR0cmlidXRlc19hcmVfbm90X2NvbXBhdGlibGUgOiBFcnJvcjwKQEAgLTE3OTUsMTIgKzE4NjYsOSBAQAogICAiJTAgYXR0cmlidXRlICVwbHVyYWx7MDp0YWtlcyBubyBhcmd1bWVudHN8MTp0YWtlcyBvbmUgYXJndW1lbnR8IgogICAiOnJlcXVpcmVzIGV4YWN0bHkgJTEgYXJndW1lbnRzfTEiPjsKIGRlZiBlcnJfYXR0cmlidXRlX3Rvb19tYW55X2FyZ3VtZW50cyA6IEVycm9yPAotICAiYXR0cmlidXRlIHRha2VzIG5vIG1vcmUgdGhhbiAlMCBhcmd1bWVudCVzMCI+OwotZGVmIGVycl9zdXBwcmVzc19hdXRvc3ludGhlc2lzIDogRXJyb3I8Ci0gICJvYmpjX3JlcXVpcmVzX3Byb3BlcnR5X2RlZmluaXRpb25zIGF0dHJpYnV0ZSBtYXkgb25seSBiZSBzcGVjaWZpZWQgb24gYSBjbGFzcyIKLSAgInRvIGEgY2xhc3MgZGVjbGFyYXRpb24iPjsKKyAgIiUwIGF0dHJpYnV0ZSB0YWtlcyBubyBtb3JlIHRoYW4gJTEgYXJndW1lbnQlczEiPjsKIGRlZiBlcnJfYXR0cmlidXRlX3Rvb19mZXdfYXJndW1lbnRzIDogRXJyb3I8Ci0gICJhdHRyaWJ1dGUgdGFrZXMgYXQgbGVhc3QgJTAgYXJndW1lbnQlczAiPjsKKyAgIiUwIGF0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAlMSBhcmd1bWVudCVzMSI+OwogZGVmIGVycl9hdHRyaWJ1dGVfaW52YWxpZF92ZWN0b3JfdHlwZSA6IEVycm9yPCJpbnZhbGlkIHZlY3RvciBlbGVtZW50IHR5cGUgJTAiPjsKIGRlZiBlcnJfYXR0cmlidXRlX2JhZF9uZW9uX3ZlY3Rvcl9zaXplIDogRXJyb3I8CiAgICJOZW9uIHZlY3RvciBzaXplIG11c3QgYmUgNjQgb3IgMTI4IGJpdHMiPjsKQEAgLTE4MDksMTQgKzE4NzcsMTEgQEAKIGRlZiBlcnJfYWxpZ25lZF9hdHRyaWJ1dGVfYXJndW1lbnRfbm90X2ludCA6IEVycm9yPAogICAiJ2FsaWduZWQnIGF0dHJpYnV0ZSByZXF1aXJlcyBpbnRlZ2VyIGNvbnN0YW50Ij47CiBkZWYgZXJyX2FsaWduYXNfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSA6IEVycm9yPAotICAiJyVzZWxlY3R7YWxpZ25hc3xfQWxpZ25hc30wJyBhdHRyaWJ1dGUgY2Fubm90IGJlIGFwcGxpZWQgdG8gYSAlc2VsZWN0eyIKLSAgImZ1bmN0aW9uIHBhcmFtZXRlcnx2YXJpYWJsZSB3aXRoICdyZWdpc3Rlcicgc3RvcmFnZSBjbGFzc3wiCi0gICInY2F0Y2gnIHZhcmlhYmxlfGJpdC1maWVsZH0xIj47CisgICIlMCBhdHRyaWJ1dGUgY2Fubm90IGJlIGFwcGxpZWQgdG8gYSAlc2VsZWN0e2Z1bmN0aW9uIHBhcmFtZXRlcnwiCisgICJ2YXJpYWJsZSB3aXRoICdyZWdpc3Rlcicgc3RvcmFnZSBjbGFzc3wnY2F0Y2gnIHZhcmlhYmxlfGJpdC1maWVsZH0xIj47CiBkZWYgZXJyX2FsaWduYXNfbWlzc2luZ19vbl9kZWZpbml0aW9uIDogRXJyb3I8Ci0gICInJXNlbGVjdHthbGlnbmFzfF9BbGlnbmFzfTAnIG11c3QgYmUgc3BlY2lmaWVkIG9uIGRlZmluaXRpb24gaWYgaXQgaXMgIgotICAic3BlY2lmaWVkIG9uIGFueSBkZWNsYXJhdGlvbiI+OwotZGVmIG5vdGVfYWxpZ25hc19vbl9kZWNsYXJhdGlvbiA6IE5vdGU8Ci0gICJkZWNsYXJlZCB3aXRoICclc2VsZWN0e2FsaWduYXN8X0FsaWduYXN9MCcgYXR0cmlidXRlIGhlcmUiPjsKKyAgIiUwIG11c3QgYmUgc3BlY2lmaWVkIG9uIGRlZmluaXRpb24gaWYgaXQgaXMgc3BlY2lmaWVkIG9uIGFueSBkZWNsYXJhdGlvbiI+OworZGVmIG5vdGVfYWxpZ25hc19vbl9kZWNsYXJhdGlvbiA6IE5vdGU8ImRlY2xhcmVkIHdpdGggJTAgYXR0cmlidXRlIGhlcmUiPjsKIGRlZiBlcnJfYWxpZ25hc19taXNtYXRjaCA6IEVycm9yPAogICAicmVkZWNsYXJhdGlvbiBoYXMgZGlmZmVyZW50IGFsaWdubWVudCByZXF1aXJlbWVudCAoJTEgdnMgJTApIj47CiBkZWYgZXJyX2FsaWduYXNfdW5kZXJhbGlnbmVkIDogRXJyb3I8CkBAIC0xODM2LDE3ICsxOTAxLDIwIEBACiBkZWYgZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF92ZWNfdHlwZV9oaW50IDogRXJyb3I8CiAgICJpbnZhbGlkIGF0dHJpYnV0ZSBhcmd1bWVudCAlMCAtIGV4cGVjdGluZyBhIHZlY3RvciBvciB2ZWN0b3JpemFibGUgc2NhbGFyIHR5cGUiPjsKIGRlZiBlcnJfYXR0cmlidXRlX2FyZ3VtZW50X291dF9vZl9ib3VuZHMgOiBFcnJvcjwKLSAgIiclMCcgYXR0cmlidXRlIHBhcmFtZXRlciAlMSBpcyBvdXQgb2YgYm91bmRzIj47CisgICIlMCBhdHRyaWJ1dGUgcGFyYW1ldGVyICUxIGlzIG91dCBvZiBib3VuZHMiPjsKIGRlZiBlcnJfYXR0cmlidXRlX3V1aWRfbWFsZm9ybWVkX2d1aWQgOiBFcnJvcjwKICAgInV1aWQgYXR0cmlidXRlIGNvbnRhaW5zIGEgbWFsZm9ybWVkIEdVSUQiPjsKLWRlZiB3YXJuX25vbm51bGxfcG9pbnRlcnNfb25seSA6IFdhcm5pbmc8Ci0gICJub25udWxsIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gcG9pbnRlciBhcmd1bWVudHMiPjsKLWRlZiBlcnJfYXR0cmlidXRlX3BvaW50ZXJzX29ubHkgOiBFcnJvcjwKLSAgIiUwIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gcG9pbnRlciBhcmd1bWVudHMiPjsKK2RlZiB3YXJuX2F0dHJpYnV0ZV9wb2ludGVyc19vbmx5IDogV2FybmluZzwKKyAgIiUwIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gcG9pbnRlciBhcmd1bWVudHMiPiwKKyAgSW5Hcm91cDxJZ25vcmVkQXR0cmlidXRlcz47CitkZWYgZXJyX2F0dHJpYnV0ZV9wb2ludGVyc19vbmx5IDogRXJyb3I8d2Fybl9hdHRyaWJ1dGVfcG9pbnRlcnNfb25seS5UZXh0PjsKK2RlZiB3YXJuX2F0dHJpYnV0ZV9yZXR1cm5fcG9pbnRlcnNfb25seSA6IFdhcm5pbmc8CisgICIlMCBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHJldHVybiB2YWx1ZXMgdGhhdCBhcmUgcG9pbnRlcnMiPiwKKyAgSW5Hcm91cDxJZ25vcmVkQXR0cmlidXRlcz47CiBkZWYgZXJyX2F0dHJpYnV0ZV9ub19tZW1iZXJfcG9pbnRlcnMgOiBFcnJvcjwKICAgIiUwIGF0dHJpYnV0ZSBjYW5ub3QgYmUgdXNlZCB3aXRoIHBvaW50ZXJzIHRvIG1lbWJlcnMiPjsKIGRlZiBlcnJfYXR0cmlidXRlX2ludmFsaWRfaW1wbGljaXRfdGhpc19hcmd1bWVudCA6IEVycm9yPAotICAiJyUwJyBhdHRyaWJ1dGUgaXMgaW52YWxpZCBmb3IgdGhlIGltcGxpY2l0IHRoaXMgYXJndW1lbnQiPjsKKyAgIiUwIGF0dHJpYnV0ZSBpcyBpbnZhbGlkIGZvciB0aGUgaW1wbGljaXQgdGhpcyBhcmd1bWVudCI+OwogZGVmIGVycl9vd25lcnNoaXBfdHlwZSA6IEVycm9yPAogICAiJTAgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byAlc2VsZWN0e3BvaW50ZXJ8aW50ZWdlcn0xIGFyZ3VtZW50cyI+OwogZGVmIGVycl9mb3JtYXRfc3RyZnRpbWVfdGhpcmRfcGFyYW1ldGVyIDogRXJyb3I8CkBAIC0xODU4LDggKzE5MjYsNiBAQAogZGVmIGVycl9mb3JtYXRfYXR0cmlidXRlX2ltcGxpY2l0X3RoaXNfZm9ybWF0X3N0cmluZyA6IEVycm9yPAogICAiZm9ybWF0IGF0dHJpYnV0ZSBjYW5ub3Qgc3BlY2lmeSB0aGUgaW1wbGljaXQgdGhpcyBhcmd1bWVudCBhcyB0aGUgZm9ybWF0ICIKICAgInN0cmluZyI+OwotZGVmIGVycl9jb21tb25fbm90X3N1cHBvcnRlZF9jcGx1c3BsdXMgOiBFcnJvcjwKLSAgImNvbW1vbiBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBpbiBDKysiPjsKIGRlZiBlcnJfaW5pdF9tZXRob2RfYmFkX3JldHVybl90eXBlIDogRXJyb3I8CiAgICJpbml0IG1ldGhvZHMgbXVzdCByZXR1cm4gYW4gb2JqZWN0IHBvaW50ZXIgdHlwZSwgbm90ICUwIj47CiBkZWYgZXJyX2F0dHJpYnV0ZV9pbnZhbGlkX3NpemUgOiBFcnJvcjwKQEAgLTE4NjgsOCArMTkzNCw4IEBACiBkZWYgZXJyX2F0dHJpYnV0ZV9zaXplX3Rvb19sYXJnZSA6IEVycm9yPCJ2ZWN0b3Igc2l6ZSB0b28gbGFyZ2UiPjsKIGRlZiBlcnJfdHlwZWNoZWNrX3ZlY3Rvcl9ub3RfY29udmVydGFibGUgOiBFcnJvcjwKICAgImNhbid0IGNvbnZlcnQgYmV0d2VlbiB2ZWN0b3IgdmFsdWVzIG9mIGRpZmZlcmVudCBzaXplICglMCBhbmQgJTEpIj47Ci1kZWYgZXJyX3R5cGVjaGVja19leHRfdmVjdG9yX25vdF90eXBlZGVmIDogRXJyb3I8Ci0gICJleHRfdmVjdG9yX3R5cGUgb25seSBhcHBsaWVzIHRvIHR5cGVzLCBub3QgdmFyaWFibGVzIj47CitkZWYgZXJyX3R5cGVjaGVja192ZWN0b3Jfbm90X2NvbnZlcnRhYmxlX25vbl9zY2FsYXIgOiBFcnJvcjwKKyAgImNhbid0IGNvbnZlcnQgYmV0d2VlbiB2ZWN0b3IgYW5kIG5vbi1zY2FsYXIgdmFsdWVzICglMCBhbmQgJTEpIj47CiBkZWYgZXJyX2V4dF92ZWN0b3JfY29tcG9uZW50X2V4Y2VlZHNfbGVuZ3RoIDogRXJyb3I8CiAgICJ2ZWN0b3IgY29tcG9uZW50IGFjY2VzcyBleGNlZWRzIHR5cGUgJTAiPjsKIGRlZiBlcnJfZXh0X3ZlY3Rvcl9jb21wb25lbnRfbmFtZV9pbGxlZ2FsIDogRXJyb3I8CkBAIC0xOTIzLDggKzE5ODksOCBAQAogICAiZGlyZWN0IGNvbXBhcmlzb24gb2YgJXNlbGVjdHthbiBhcnJheSBsaXRlcmFsfGEgZGljdGlvbmFyeSBsaXRlcmFsfCIKICAgImEgbnVtZXJpYyBsaXRlcmFsfGEgYm94ZWQgZXhwcmVzc2lvbnx9MCBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yIj4sCiAgIEluR3JvdXA8T2JqQ0xpdGVyYWxDb21wYXJpc29uPjsKLWRlZiB3YXJuX21pc3NpbmdfYXRzaWduX3ByZWZpeCA6IFdhcm5pbmc8Ci0gICJzdHJpbmcgbGl0ZXJhbCBtdXN0IGJlIHByZWZpeGVkIGJ5ICdAJyAiPiwgSW5Hcm91cDxPYmpDTGl0ZXJhbE1pc3NpbmdBdFNpZ24+OworZGVmIGVycl9taXNzaW5nX2F0c2lnbl9wcmVmaXggOiBFcnJvcjwKKyAgInN0cmluZyBsaXRlcmFsIG11c3QgYmUgcHJlZml4ZWQgYnkgJ0AnICI+OwogZGVmIHdhcm5fb2JqY19zdHJpbmdfbGl0ZXJhbF9jb21wYXJpc29uIDogV2FybmluZzwKICAgImRpcmVjdCBjb21wYXJpc29uIG9mIGEgc3RyaW5nIGxpdGVyYWwgaGFzIHVuZGVmaW5lZCBiZWhhdmlvciI+LCAKICAgSW5Hcm91cDxPYmpDU3RyaW5nQ29tcGFyaXNvbj47CkBAIC0xOTQ4LDMwICsyMDE0LDI0IEBACiAKIGRlZiBlcnJfYXR0cmlidXRlX3NlY3Rpb25faW52YWxpZF9mb3JfdGFyZ2V0IDogRXJyb3I8CiAgICJhcmd1bWVudCB0byAnc2VjdGlvbicgYXR0cmlidXRlIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyB0YXJnZXQ6ICUwIj47Ci1kZWYgZXJyX2F0dHJpYnV0ZV9zZWN0aW9uX2xvY2FsX3ZhcmlhYmxlIDogRXJyb3I8Ci0gICInc2VjdGlvbicgYXR0cmlidXRlIGlzIG5vdCB2YWxpZCBvbiBsb2NhbCB2YXJpYWJsZXMiPjsKIGRlZiB3YXJuX21pc21hdGNoZWRfc2VjdGlvbiA6IFdhcm5pbmc8CiAgICJzZWN0aW9uIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIGRlY2xhcmF0aW9uIj4sIEluR3JvdXA8U2VjdGlvbj47CiAKIGRlZiBlcnJfYW5vbnltb3VzX3Byb3BlcnR5OiBFcnJvcjwKICAgImFub255bW91cyBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIj47Ci1kZWYgZXJyX3Byb3BlcnR5X2lzX3ZhcmlhYmx5X21vZGlmaWVkOiBFcnJvcjwKLSAgInByb3BlcnR5ICclMCcgaGFzIGEgdmFyaWFibHkgbW9kaWZpZWQgdHlwZSI+OwotZGVmIGVycl9ub19nZXR0ZXJfZm9yX3Byb3BlcnR5IDogRXJyb3I8Ci0gICJubyBnZXR0ZXIgZGVmaW5lZCBmb3IgcHJvcGVydHkgJyUwJyI+OwotZGVmIGVycl9ub19zZXR0ZXJfZm9yX3Byb3BlcnR5IDogRXJyb3I8Ci0gICJubyBzZXR0ZXIgZGVmaW5lZCBmb3IgcHJvcGVydHkgJyUwJyI+OwotZGVmIGVycm9yX2Nhbm5vdF9maW5kX3N1aXRhYmxlX2dldHRlciA6IEVycm9yPAotICAiY2Fubm90IGZpbmQgc3VpdGFibGUgZ2V0dGVyIGZvciBwcm9wZXJ0eSAnJTAnIj47Ci1kZWYgZXJyb3JfY2Fubm90X2ZpbmRfc3VpdGFibGVfc2V0dGVyIDogRXJyb3I8Ci0gICJjYW5ub3QgZmluZCBzdWl0YWJsZSBzZXR0ZXIgZm9yIHByb3BlcnR5ICclMCciPjsKK2RlZiBlcnJfcHJvcGVydHlfaXNfdmFyaWFibHlfbW9kaWZpZWQgOiBFcnJvcjwKKyAgInByb3BlcnR5ICUwIGhhcyBhIHZhcmlhYmx5IG1vZGlmaWVkIHR5cGUiPjsKK2RlZiBlcnJfbm9fYWNjZXNzb3JfZm9yX3Byb3BlcnR5IDogRXJyb3I8CisgICJubyAlc2VsZWN0e2dldHRlcnxzZXR0ZXJ9MCBkZWZpbmVkIGZvciBwcm9wZXJ0eSAlMSI+OworZGVmIGVycm9yX2Nhbm5vdF9maW5kX3N1aXRhYmxlX2FjY2Vzc29yIDogRXJyb3I8CisgICJjYW5ub3QgZmluZCBzdWl0YWJsZSAlc2VsZWN0e2dldHRlcnxzZXR0ZXJ9MCBmb3IgcHJvcGVydHkgJTEiPjsKIAogZGVmIGVycl9hdHRyaWJ1dGVfYWxpZ25lZF9ub3RfcG93ZXJfb2ZfdHdvIDogRXJyb3I8CiAgICJyZXF1ZXN0ZWQgYWxpZ25tZW50IGlzIG5vdCBhIHBvd2VyIG9mIDIiPjsKLWRlZiBlcnJfYXR0cmlidXRlX2FsaWduZWRfZ3JlYXRlcl90aGFuXzgxOTIgOiBFcnJvcjwKLSAgInJlcXVlc3RlZCBhbGlnbm1lbnQgbXVzdCBiZSA4MTkyIGJ5dGVzIG9yIHNtYWxsZXIiPjsKK2RlZiBlcnJfYXR0cmlidXRlX2FsaWduZWRfdG9vX2dyZWF0IDogRXJyb3I8CisgICJyZXF1ZXN0ZWQgYWxpZ25tZW50IG11c3QgYmUgJTAgYnl0ZXMgb3Igc21hbGxlciI+OwogZGVmIHdhcm5fcmVkZWNsYXJhdGlvbl93aXRob3V0X2F0dHJpYnV0ZV9wcmV2X2F0dHJpYnV0ZV9pZ25vcmVkIDogV2FybmluZzwKLSAgIiclMCcgcmVkZWNsYXJlZCB3aXRob3V0ICUxIGF0dHJpYnV0ZTogcHJldmlvdXMgJTEgaWdub3JlZCI+OworICAiJTAgcmVkZWNsYXJlZCB3aXRob3V0ICUxIGF0dHJpYnV0ZTogcHJldmlvdXMgJTEgaWdub3JlZCI+OwogZGVmIHdhcm5fYXR0cmlidXRlX2lnbm9yZWQgOiBXYXJuaW5nPCIlMCBhdHRyaWJ1dGUgaWdub3JlZCI+LAogICBJbkdyb3VwPElnbm9yZWRBdHRyaWJ1dGVzPjsKIGRlZiB3YXJuX2F0dHJpYnV0ZV9hZnRlcl9kZWZpbml0aW9uX2lnbm9yZWQgOiBXYXJuaW5nPApAQCAtMjAwNSw4ICsyMDY1LDggQEAKICAgIk9iamVjdGl2ZS1DIEdDIGRvZXMgbm90IGFsbG93IHdlYWsgdmFyaWFibGVzIG9uIHRoZSBzdGFjayI+LAogICBJbkdyb3VwPElnbm9yZWRBdHRyaWJ1dGVzPjsKIGRlZiB3YXJuX25zb2JqZWN0X2F0dHJpYnV0ZSA6IFdhcm5pbmc8Ci0gICJfX2F0dHJpYnV0ZSAoKE5TT2JqZWN0KSkgbWF5IGJlIHB1dCBvbiBhIHR5cGVkZWYgb25seSwgIgotICAiYXR0cmlidXRlIGlzIGlnbm9yZWQiPiwgSW5Hcm91cDxOU29iamVjdEF0dHJpYnV0ZT47CisgICInTlNPYmplY3QnIGF0dHJpYnV0ZSBtYXkgYmUgcHV0IG9uIGEgdHlwZWRlZiBvbmx5OyBhdHRyaWJ1dGUgaXMgaWdub3JlZCI+LAorICBJbkdyb3VwPE5Tb2JqZWN0QXR0cmlidXRlPjsKIGRlZiB3YXJuX2F0dHJpYnV0ZV93ZWFrX29uX2xvY2FsIDogV2FybmluZzwKICAgIl9fd2VhayBhdHRyaWJ1dGUgY2Fubm90IGJlIHNwZWNpZmllZCBvbiBhbiBhdXRvbWF0aWMgdmFyaWFibGUgd2hlbiBBUkMgIgogICAiaXMgbm90IGVuYWJsZWQiPiwKQEAgLTIwMTcsMTkgKzIwNzcsMjggQEAKICAgIndlYWsgZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgaW50ZXJuYWwgbGlua2FnZSI+OwogZGVmIGVycl9hdHRyaWJ1dGVfc2VsZWN0YW55X25vbl9leHRlcm5fZGF0YSA6IEVycm9yPAogICAiJ3NlbGVjdGFueScgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBkYXRhIGl0ZW1zIHdpdGggZXh0ZXJuYWwgbGlua2FnZSI+OworZGVmIGVycl9hdHRyaWJ1dGVfZGxsX25vdF9leHRlcm4gOiBFcnJvcjwKKyAgIiVxMCBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICVxMSI+OwogZGVmIHdhcm5fYXR0cmlidXRlX2ludmFsaWRfb25fZGVmaW5pdGlvbiA6IFdhcm5pbmc8CiAgICInJTAnIGF0dHJpYnV0ZSBjYW5ub3QgYmUgc3BlY2lmaWVkIG9uIGEgZGVmaW5pdGlvbiI+LAogICBJbkdyb3VwPElnbm9yZWRBdHRyaWJ1dGVzPjsKK2RlZiBlcnJfYXR0cmlidXRlX2RsbF9yZWRlY2xhcmF0aW9uIDogRXJyb3I8CisgICJyZWRlY2xhcmF0aW9uIG9mICVxMCBjYW5ub3QgYWRkICVxMSBhdHRyaWJ1dGUiPjsKK2RlZiBlcnJfYXR0cmlidXRlX2RsbGltcG9ydF9kYXRhX2RlZmluaXRpb24gOiBFcnJvcjwKKyAgImRlZmluaXRpb24gb2YgZGxsaW1wb3J0IGRhdGEiPjsKIGRlZiBlcnJfYXR0cmlidXRlX3dlYWtyZWZfbm90X3N0YXRpYyA6IEVycm9yPAogICAid2Vha3JlZiBkZWNsYXJhdGlvbiBtdXN0IGhhdmUgaW50ZXJuYWwgbGlua2FnZSI+OwogZGVmIGVycl9hdHRyaWJ1dGVfd2Vha3JlZl9ub3RfZ2xvYmFsX2NvbnRleHQgOiBFcnJvcjwKLSAgIndlYWtyZWYgZGVjbGFyYXRpb24gb2YgJyUwJyBtdXN0IGJlIGluIGEgZ2xvYmFsIGNvbnRleHQiPjsKKyAgIndlYWtyZWYgZGVjbGFyYXRpb24gb2YgJTAgbXVzdCBiZSBpbiBhIGdsb2JhbCBjb250ZXh0Ij47CiBkZWYgZXJyX2F0dHJpYnV0ZV93ZWFrcmVmX3dpdGhvdXRfYWxpYXMgOiBFcnJvcjwKLSAgIndlYWtyZWYgZGVjbGFyYXRpb24gb2YgJyUwJyBtdXN0IGFsc28gaGF2ZSBhbiBhbGlhcyBhdHRyaWJ1dGUiPjsKKyAgIndlYWtyZWYgZGVjbGFyYXRpb24gb2YgJTAgbXVzdCBhbHNvIGhhdmUgYW4gYWxpYXMgYXR0cmlidXRlIj47CiBkZWYgZXJyX2FsaWFzX25vdF9zdXBwb3J0ZWRfb25fZGFyd2luIDogRXJyb3IgPAogICAib25seSB3ZWFrIGFsaWFzZXMgYXJlIHN1cHBvcnRlZCBvbiBkYXJ3aW4iPjsKIGRlZiBlcnJfYWxpYXNfdG9fdW5kZWZpbmVkIDogRXJyb3I8CiAgICJhbGlhcyBtdXN0IHBvaW50IHRvIGEgZGVmaW5lZCB2YXJpYWJsZSBvciBmdW5jdGlvbiI+OworZGVmIHdhcm5fYWxpYXNfdG9fd2Vha19hbGlhcyA6IFdhcm5pbmc8CisgICJhbGlhcyB3aWxsIGFsd2F5cyByZXNvbHZlIHRvICUwIGV2ZW4gaWYgd2VhayBkZWZpbml0aW9uIG9mIGFsaWFzICUxIGlzIG92ZXJyaWRkZW4iPiwKKyAgSW5Hcm91cDxJZ25vcmVkQXR0cmlidXRlcz47CiBkZWYgZXJyX2R1cGxpY2F0ZV9tYW5nbGVkX25hbWUgOiBFcnJvcjwKICAgImRlZmluaXRpb24gd2l0aCBzYW1lIG1hbmdsZWQgbmFtZSBhcyBhbm90aGVyIGRlZmluaXRpb24iPjsKIGRlZiBlcnJfY3ljbGljX2FsaWFzIDogRXJyb3I8CkBAIC0yMDQyLDE4ICsyMTExLDEzIEBACiAgICJ2YXJpYWJsZXMsIGZ1bmN0aW9ucyBhbmQgbGFiZWxzfGZpZWxkcyBhbmQgZ2xvYmFsIHZhcmlhYmxlc3xzdHJ1Y3RzfCIKICAgInZhcmlhYmxlcywgZnVuY3Rpb25zIGFuZCB0YWcgdHlwZXN8dGhyZWFkLWxvY2FsIHZhcmlhYmxlc3wiCiAgICJ2YXJpYWJsZXMgYW5kIGZpZWxkc3x2YXJpYWJsZXMsIGRhdGEgbWVtYmVycyBhbmQgdGFnIHR5cGVzfCIKLSAgInR5cGVzIGFuZCBuYW1lc3BhY2VzfE9iamVjdGl2ZS1DIGludGVyZmFjZXN9MSI+LAorICAidHlwZXMgYW5kIG5hbWVzcGFjZXN8T2JqZWN0aXZlLUMgaW50ZXJmYWNlc3xtZXRob2RzIGFuZCBwcm9wZXJ0aWVzfCIKKyAgInN0cnVjdCBvciB1bmlvbnxzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzfHR5cGVzfCIKKyAgIk9iamVjdGl2ZS1DIGluc3RhbmNlIG1ldGhvZHN8aW5pdCBtZXRob2RzIG9mIGludGVyZmFjZSBvciBjbGFzcyBleHRlbnNpb24gZGVjbGFyYXRpb25zfCIKKyAgInZhcmlhYmxlcywgZnVuY3Rpb25zIGFuZCBjbGFzc2VzfE9iamVjdGl2ZS1DIHByb3RvY29sc3wiCisgICJmdW5jdGlvbnMgYW5kIGdsb2JhbCB2YXJpYWJsZXN8c3RydWN0cyBvciB0eXBlZGVmc30xIj4sCiAgIEluR3JvdXA8SWdub3JlZEF0dHJpYnV0ZXM+OwotZGVmIGVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlIDogRXJyb3I8Ci0gICIlMCBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvICVzZWxlY3R7ZnVuY3Rpb25zfHVuaW9uc3wiCi0gICJ2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uc3xmdW5jdGlvbnMgYW5kIG1ldGhvZHN8cGFyYW1ldGVyc3wiCi0gICJmdW5jdGlvbnMsIG1ldGhvZHMgYW5kIGJsb2Nrc3xmdW5jdGlvbnMsIG1ldGhvZHMsIGFuZCBjbGFzc2VzfCIKLSAgImZ1bmN0aW9ucywgbWV0aG9kcywgYW5kIHBhcmFtZXRlcnN8Y2xhc3Nlc3x2YXJpYWJsZXN8bWV0aG9kc3wiCi0gICJ2YXJpYWJsZXMsIGZ1bmN0aW9ucyBhbmQgbGFiZWxzfGZpZWxkcyBhbmQgZ2xvYmFsIHZhcmlhYmxlc3xzdHJ1Y3RzfCIKLSAgInZhcmlhYmxlcywgZnVuY3Rpb25zIGFuZCB0YWcgdHlwZXN8dGhyZWFkLWxvY2FsIHZhcmlhYmxlc3wiCi0gICJ2YXJpYWJsZXMgYW5kIGZpZWxkc3x2YXJpYWJsZXMsIGRhdGEgbWVtYmVycyBhbmQgdGFnIHR5cGVzfCIKLSAgInR5cGVzIGFuZCBuYW1lc3BhY2VzfE9iamVjdGl2ZS1DIGludGVyZmFjZXN8IgotICAibWV0aG9kcyBhbmQgcHJvcGVydGllc3xzdHJ1Y3Qgb3IgdW5pb258c3RydWN0LCB1bmlvbiBvciBjbGFzc30xIj47CitkZWYgZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUgOiBFcnJvcjx3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUuVGV4dD47CiBkZWYgd2Fybl90eXBlX2F0dHJpYnV0ZV93cm9uZ190eXBlIDogV2FybmluZzwKICAgIiclMCcgb25seSBhcHBsaWVzIHRvICVzZWxlY3R7ZnVuY3Rpb258cG9pbnRlcnwiCiAgICJPYmplY3RpdmUtQyBvYmplY3Qgb3IgYmxvY2sgcG9pbnRlcn0xIHR5cGVzOyB0eXBlIGhlcmUgaXMgJTIiPiwKQEAgLTIwOTMsOCArMjE1Nyw2IEBACiAgICJvYmpjX3ByZWNpc2VfbGlmZXRpbWUgaXMgbm90IG1lYW5pbmdmdWwgZm9yICIKICAgIiVzZWxlY3R7X191bnNhZmVfdW5yZXRhaW5lZHxfX2F1dG9yZWxlYXNpbmd9MCBvYmplY3RzIj47CiBkZWYgZXJyX2ludmFsaWRfcGNzIDogRXJyb3I8ImludmFsaWQgUENTIHR5cGUiPjsKLWRlZiBlcnJfYXR0cmlidXRlX2Nhbl9iZV9hcHBsaWVkX29ubHlfdG9fdmFsdWVfZGVjbCA6IEVycm9yPAotICAiJTAgYXR0cmlidXRlIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gdmFsdWUgZGVjbGFyYXRpb25zIj47CiBkZWYgd2Fybl9hdHRyaWJ1dGVfbm90X29uX2RlY2wgOiBXYXJuaW5nPAogICAiJTAgYXR0cmlidXRlIGlnbm9yZWQgd2hlbiBwYXJzaW5nIHR5cGUiPiwgSW5Hcm91cDxJZ25vcmVkQXR0cmlidXRlcz47CiBkZWYgZXJyX2Jhc2Vfc3BlY2lmaWVyX2F0dHJpYnV0ZSA6IEVycm9yPApAQCAtMjEyMSwyOSArMjE4MywyMyBAQAogICAib3ZlcnJpZGRlbiBtZXRob2QgaXMgaGVyZSI+OwogCiAvLyBUaHJlYWQgU2FmZXR5IEF0dHJpYnV0ZXMKK2RlZiB3YXJuX2ludmFsaWRfY2FwYWJpbGl0eV9uYW1lIDogV2FybmluZzwKKyAgImludmFsaWQgY2FwYWJpbGl0eSBuYW1lICclMCc7IGNhcGFiaWxpdHkgbmFtZSBtdXN0IGJlICdtdXRleCcgb3IgJ3JvbGUnIj4sCisgIEluR3JvdXA8VGhyZWFkU2FmZXR5QXR0cmlidXRlcz4sIERlZmF1bHRJZ25vcmU7CiBkZWYgd2Fybl90aHJlYWRfYXR0cmlidXRlX2lnbm9yZWQgOiBXYXJuaW5nPAogICAiaWdub3JpbmcgJTAgYXR0cmlidXRlIGJlY2F1c2UgaXRzIGFyZ3VtZW50IGlzIGludmFsaWQiPiwKICAgSW5Hcm91cDxUaHJlYWRTYWZldHlBdHRyaWJ1dGVzPiwgRGVmYXVsdElnbm9yZTsKIGRlZiB3YXJuX3RocmVhZF9hdHRyaWJ1dGVfYXJndW1lbnRfbm90X2xvY2thYmxlIDogV2FybmluZzwKICAgIiUwIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgIgotICAid2l0aCAnbG9ja2FibGUnIGF0dHJpYnV0ZTsgdHlwZSBoZXJlIGlzICclMSciPiwKKyAgIndpdGggJ2NhcGFiaWxpdHknIGF0dHJpYnV0ZTsgdHlwZSBoZXJlIGlzICUxIj4sCiAgIEluR3JvdXA8VGhyZWFkU2FmZXR5QXR0cmlidXRlcz4sIERlZmF1bHRJZ25vcmU7Ci1kZWYgd2Fybl90aHJlYWRfYXR0cmlidXRlX2FyZ3VtZW50X25vdF9jbGFzcyA6IFdhcm5pbmc8Ci0gICIlMCBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHRoYXQgYXJlIGNsYXNzIHR5cGUgb3IgcG9pbnQgdG8iCi0gICIgY2xhc3MgdHlwZTsgdHlwZSBoZXJlIGlzICclMSciPiwKLSAgSW5Hcm91cDxUaHJlYWRTYWZldHlBdHRyaWJ1dGVzPiwgRGVmYXVsdElnbm9yZTsgIAogZGVmIHdhcm5fdGhyZWFkX2F0dHJpYnV0ZV9kZWNsX25vdF9sb2NrYWJsZSA6IFdhcm5pbmc8CiAgICIlMCBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgYXBwbGllZCBpbiBhIGNvbnRleHQgYW5ub3RhdGVkICIKLSAgIndpdGggJ2xvY2thYmxlJyBhdHRyaWJ1dGUiPiwKKyAgIndpdGggJ2NhcGFiaWxpdHkoXCJtdXRleFwiKScgYXR0cmlidXRlIj4sCiAgIEluR3JvdXA8VGhyZWFkU2FmZXR5QXR0cmlidXRlcz4sIERlZmF1bHRJZ25vcmU7CiBkZWYgd2Fybl90aHJlYWRfYXR0cmlidXRlX2RlY2xfbm90X3BvaW50ZXIgOiBXYXJuaW5nPAotICAiJyUwJyBvbmx5IGFwcGxpZXMgdG8gcG9pbnRlciB0eXBlczsgdHlwZSBoZXJlIGlzICUxIj4sCisgICIlMCBvbmx5IGFwcGxpZXMgdG8gcG9pbnRlciB0eXBlczsgdHlwZSBoZXJlIGlzICUxIj4sCiAgIEluR3JvdXA8VGhyZWFkU2FmZXR5QXR0cmlidXRlcz4sIERlZmF1bHRJZ25vcmU7Ci1kZWYgd2Fybl90aHJlYWRfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSA6IFdhcm5pbmc8Ci0gICIlMCBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvICVzZWxlY3R7IgotICAiZmllbGRzIGFuZCBnbG9iYWwgdmFyaWFibGVzfGZ1bmN0aW9ucyBhbmQgbWV0aG9kc3wiCi0gICJjbGFzc2VzIGFuZCBzdHJ1Y3RzfTEiPiwKLSAgSW5Hcm91cDxUaHJlYWRTYWZldHlBdHRyaWJ1dGVzPiwgRGVmYXVsdElnbm9yZTsgIAogZGVmIGVycl9hdHRyaWJ1dGVfYXJndW1lbnRfb3V0X29mX3JhbmdlIDogRXJyb3I8CiAgICIlMCBhdHRyaWJ1dGUgcGFyYW1ldGVyICUxIGlzIG91dCBvZiBib3VuZHM6ICIKICAgIiVwbHVyYWx7MDpubyBwYXJhbWV0ZXJzIHRvIGluZGV4IGludG98IgpAQCAtMjE1MSw0MSArMjIwNyw0MyBAQAogICAiOm11c3QgYmUgYmV0d2VlbiAxIGFuZCAlMn0yIj47CiAKIC8vIFRocmVhZCBTYWZldHkgQW5hbHlzaXMgICAKLWRlZiB3YXJuX3VubG9ja19idXRfbm9fbG9jayA6IFdhcm5pbmc8Ci0gICJ1bmxvY2tpbmcgJyUwJyB0aGF0IHdhcyBub3QgbG9ja2VkIj4sCitkZWYgd2Fybl91bmxvY2tfYnV0X25vX2xvY2sgOiBXYXJuaW5nPCJyZWxlYXNpbmcgJTAgJyUxJyB0aGF0IHdhcyBub3QgaGVsZCI+LAogICBJbkdyb3VwPFRocmVhZFNhZmV0eUFuYWx5c2lzPiwgRGVmYXVsdElnbm9yZTsKLWRlZiB3YXJuX2RvdWJsZV9sb2NrIDogV2FybmluZzwKLSAgImxvY2tpbmcgJyUwJyB0aGF0IGlzIGFscmVhZHkgbG9ja2VkIj4sCitkZWYgd2Fybl91bmxvY2tfa2luZF9taXNtYXRjaCA6IFdhcm5pbmc8CisgICJyZWxlYXNpbmcgJTAgJyUxJyB1c2luZyAlc2VsZWN0e3NoYXJlZHxleGNsdXNpdmV9MiBhY2Nlc3MsIGV4cGVjdGVkICIKKyAgIiVzZWxlY3R7c2hhcmVkfGV4Y2x1c2l2ZX0zIGFjY2VzcyI+LAorICBJbkdyb3VwPFRocmVhZFNhZmV0eUFuYWx5c2lzPiwgRGVmYXVsdElnbm9yZTsKK2RlZiB3YXJuX2RvdWJsZV9sb2NrIDogV2FybmluZzwiYWNxdWlyaW5nICUwICclMScgdGhhdCBpcyBhbHJlYWR5IGhlbGQiPiwKICAgSW5Hcm91cDxUaHJlYWRTYWZldHlBbmFseXNpcz4sIERlZmF1bHRJZ25vcmU7CiBkZWYgd2Fybl9ub191bmxvY2sgOiBXYXJuaW5nPAotICAibXV0ZXggJyUwJyBpcyBzdGlsbCBsb2NrZWQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbiI+LAorICAiJTAgJyUxJyBpcyBzdGlsbCBoZWxkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb24iPiwKICAgSW5Hcm91cDxUaHJlYWRTYWZldHlBbmFseXNpcz4sIERlZmF1bHRJZ25vcmU7CiBkZWYgd2Fybl9leHBlY3RpbmdfbG9ja2VkIDogV2FybmluZzwKLSAgImV4cGVjdGluZyBtdXRleCAnJTAnIHRvIGJlIGxvY2tlZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9uIj4sCisgICJleHBlY3RpbmcgJTAgJyUxJyB0byBiZSBoZWxkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb24iPiwKICAgSW5Hcm91cDxUaHJlYWRTYWZldHlBbmFseXNpcz4sIERlZmF1bHRJZ25vcmU7ICAKIC8vIEZJWE1FOiBpbXByb3ZlIHRoZSBlcnJvciBtZXNzYWdlIGFib3V0IGxvY2tzIG5vdCBpbiBzY29wZQogZGVmIHdhcm5fbG9ja19zb21lX3ByZWRlY2Vzc29ycyA6IFdhcm5pbmc8Ci0gICJtdXRleCAnJTAnIGlzIG5vdCBsb2NrZWQgb24gZXZlcnkgcGF0aCB0aHJvdWdoIGhlcmUiPiwKKyAgIiUwICclMScgaXMgbm90IGhlbGQgb24gZXZlcnkgcGF0aCB0aHJvdWdoIGhlcmUiPiwKICAgSW5Hcm91cDxUaHJlYWRTYWZldHlBbmFseXNpcz4sIERlZmF1bHRJZ25vcmU7CiBkZWYgd2Fybl9leHBlY3RpbmdfbG9ja19oZWxkX29uX2xvb3AgOiBXYXJuaW5nPAotICAiZXhwZWN0aW5nIG11dGV4ICclMCcgdG8gYmUgbG9ja2VkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcCI+LAorICAiZXhwZWN0aW5nICUwICclMScgdG8gYmUgaGVsZCBhdCBzdGFydCBvZiBlYWNoIGxvb3AiPiwKICAgSW5Hcm91cDxUaHJlYWRTYWZldHlBbmFseXNpcz4sIERlZmF1bHRJZ25vcmU7Ci1kZWYgbm90ZV9sb2NrZWRfaGVyZSA6IE5vdGU8Im11dGV4IGFjcXVpcmVkIGhlcmUiPjsKK2RlZiBub3RlX2xvY2tlZF9oZXJlIDogTm90ZTwiJTAgYWNxdWlyZWQgaGVyZSI+OwogZGVmIHdhcm5fbG9ja19leGNsdXNpdmVfYW5kX3NoYXJlZCA6IFdhcm5pbmc8Ci0gICJtdXRleCAnJTAnIGlzIGxvY2tlZCBleGNsdXNpdmVseSBhbmQgc2hhcmVkIGluIHRoZSBzYW1lIHNjb3BlIj4sCisgICIlMCAnJTEnIGlzIGFjcXVpcmVkIGV4Y2x1c2l2ZWx5IGFuZCBzaGFyZWQgaW4gdGhlIHNhbWUgc2NvcGUiPiwKICAgSW5Hcm91cDxUaHJlYWRTYWZldHlBbmFseXNpcz4sIERlZmF1bHRJZ25vcmU7CiBkZWYgbm90ZV9sb2NrX2V4Y2x1c2l2ZV9hbmRfc2hhcmVkIDogTm90ZTwKLSAgInRoZSBvdGhlciBsb2NrIG9mIG11dGV4ICclMCcgaXMgaGVyZSI+OworICAidGhlIG90aGVyIGFjcXVpc2l0aW9uIG9mICUwICclMScgaXMgaGVyZSI+OwogZGVmIHdhcm5fdmFyaWFibGVfcmVxdWlyZXNfYW55X2xvY2sgOiBXYXJuaW5nPAotICAiJXNlbGVjdHtyZWFkaW5nfHdyaXRpbmd9MSB2YXJpYWJsZSAnJTAnIHJlcXVpcmVzIGxvY2tpbmcgIgorICAiJXNlbGVjdHtyZWFkaW5nfHdyaXRpbmd9MSB2YXJpYWJsZSAnJTAnIHJlcXVpcmVzIGhvbGRpbmcgIgogICAiJXNlbGVjdHthbnkgbXV0ZXh8YW55IG11dGV4IGV4Y2x1c2l2ZWx5fTEiPiwKICAgSW5Hcm91cDxUaHJlYWRTYWZldHlBbmFseXNpcz4sIERlZmF1bHRJZ25vcmU7CiBkZWYgd2Fybl92YXJfZGVyZWZfcmVxdWlyZXNfYW55X2xvY2sgOiBXYXJuaW5nPAotICAiJXNlbGVjdHtyZWFkaW5nfHdyaXRpbmd9MSB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnJTAnIHJlcXVpcmVzIGxvY2tpbmcgIgorICAiJXNlbGVjdHtyZWFkaW5nfHdyaXRpbmd9MSB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnJTAnIHJlcXVpcmVzIGhvbGRpbmcgIgogICAiJXNlbGVjdHthbnkgbXV0ZXh8YW55IG11dGV4IGV4Y2x1c2l2ZWx5fTEiPiwKICAgSW5Hcm91cDxUaHJlYWRTYWZldHlBbmFseXNpcz4sIERlZmF1bHRJZ25vcmU7CiBkZWYgd2Fybl9mdW5fZXhjbHVkZXNfbXV0ZXggOiBXYXJuaW5nPAotICAiY2Fubm90IGNhbGwgZnVuY3Rpb24gJyUwJyB3aGlsZSBtdXRleCAnJTEnIGlzIGxvY2tlZCI+LAorICAiY2Fubm90IGNhbGwgZnVuY3Rpb24gJyUxJyB3aGlsZSAlMCAnJTInIGlzIGhlbGQiPiwKICAgSW5Hcm91cDxUaHJlYWRTYWZldHlBbmFseXNpcz4sIERlZmF1bHRJZ25vcmU7CiBkZWYgd2Fybl9jYW5ub3RfcmVzb2x2ZV9sb2NrIDogV2FybmluZzwKICAgImNhbm5vdCByZXNvbHZlIGxvY2sgZXhwcmVzc2lvbiI+LApAQCAtMjE5MywyOCArMjI1MSwyNiBAQAogCiAvLyBJbXByZWNpc2UgdGhyZWFkIHNhZmV0eSB3YXJuaW5ncwogZGVmIHdhcm5fdmFyaWFibGVfcmVxdWlyZXNfbG9jayA6IFdhcm5pbmc8Ci0gICIlc2VsZWN0e3JlYWRpbmd8d3JpdGluZ30yIHZhcmlhYmxlICclMCcgcmVxdWlyZXMgbG9ja2luZyAiCi0gICIlc2VsZWN0eyclMSd8JyUxJyBleGNsdXNpdmVseX0yIj4sCisgICIlc2VsZWN0e3JlYWRpbmd8d3JpdGluZ30zIHZhcmlhYmxlICclMScgcmVxdWlyZXMgaG9sZGluZyAlMCAiCisgICIlc2VsZWN0eyclMid8JyUyJyBleGNsdXNpdmVseX0zIj4sCiAgIEluR3JvdXA8VGhyZWFkU2FmZXR5QW5hbHlzaXM+LCBEZWZhdWx0SWdub3JlOwogZGVmIHdhcm5fdmFyX2RlcmVmX3JlcXVpcmVzX2xvY2sgOiBXYXJuaW5nPAotICAiJXNlbGVjdHtyZWFkaW5nfHdyaXRpbmd9MiB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnJTAnIHJlcXVpcmVzIGxvY2tpbmcgIgotICAiJXNlbGVjdHsnJTEnfCclMScgZXhjbHVzaXZlbHl9MiI+LAorICAiJXNlbGVjdHtyZWFkaW5nfHdyaXRpbmd9MyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnJTEnIHJlcXVpcmVzICIKKyAgImhvbGRpbmcgJTAgJXNlbGVjdHsnJTInfCclMicgZXhjbHVzaXZlbHl9MyI+LAogICBJbkdyb3VwPFRocmVhZFNhZmV0eUFuYWx5c2lzPiwgRGVmYXVsdElnbm9yZTsKIGRlZiB3YXJuX2Z1bl9yZXF1aXJlc19sb2NrIDogV2FybmluZzwKLSAgImNhbGxpbmcgZnVuY3Rpb24gJyUwJyByZXF1aXJlcyAlc2VsZWN0e3NoYXJlZHxleGNsdXNpdmV9MiBsb2NrIG9uICclMSciPiwKKyAgImNhbGxpbmcgZnVuY3Rpb24gJyUxJyByZXF1aXJlcyBob2xkaW5nICUwICVzZWxlY3R7JyUyJ3wnJTInIGV4Y2x1c2l2ZWx5fTMiPiwKICAgSW5Hcm91cDxUaHJlYWRTYWZldHlBbmFseXNpcz4sIERlZmF1bHRJZ25vcmU7CiAKIC8vIFByZWNpc2UgdGhyZWFkIHNhZmV0eSB3YXJuaW5ncwotZGVmIHdhcm5fdmFyaWFibGVfcmVxdWlyZXNfbG9ja19wcmVjaXNlIDogV2FybmluZzwKLSAgIiVzZWxlY3R7cmVhZGluZ3x3cml0aW5nfTIgdmFyaWFibGUgJyUwJyByZXF1aXJlcyBsb2NraW5nICIKLSAgIiVzZWxlY3R7JyUxJ3wnJTEnIGV4Y2x1c2l2ZWx5fTIiPiwKK2RlZiB3YXJuX3ZhcmlhYmxlX3JlcXVpcmVzX2xvY2tfcHJlY2lzZSA6CisgIFdhcm5pbmc8d2Fybl92YXJpYWJsZV9yZXF1aXJlc19sb2NrLlRleHQ+LAogICBJbkdyb3VwPFRocmVhZFNhZmV0eVByZWNpc2U+LCBEZWZhdWx0SWdub3JlOwotZGVmIHdhcm5fdmFyX2RlcmVmX3JlcXVpcmVzX2xvY2tfcHJlY2lzZSA6IFdhcm5pbmc8Ci0gICIlc2VsZWN0e3JlYWRpbmd8d3JpdGluZ30yIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICclMCcgcmVxdWlyZXMgbG9ja2luZyAiCi0gICIlc2VsZWN0eyclMSd8JyUxJyBleGNsdXNpdmVseX0yIj4sCitkZWYgd2Fybl92YXJfZGVyZWZfcmVxdWlyZXNfbG9ja19wcmVjaXNlIDoKKyAgV2FybmluZzx3YXJuX3Zhcl9kZXJlZl9yZXF1aXJlc19sb2NrLlRleHQ+LAogICBJbkdyb3VwPFRocmVhZFNhZmV0eVByZWNpc2U+LCBEZWZhdWx0SWdub3JlOwotZGVmIHdhcm5fZnVuX3JlcXVpcmVzX2xvY2tfcHJlY2lzZSA6IFdhcm5pbmc8Ci0gICJjYWxsaW5nIGZ1bmN0aW9uICclMCcgcmVxdWlyZXMgJXNlbGVjdHtzaGFyZWR8ZXhjbHVzaXZlfTIgbG9jayBvbiAnJTEnIj4sCitkZWYgd2Fybl9mdW5fcmVxdWlyZXNfbG9ja19wcmVjaXNlIDoKKyAgV2FybmluZzx3YXJuX2Z1bl9yZXF1aXJlc19sb2NrLlRleHQ+LAogICBJbkdyb3VwPFRocmVhZFNhZmV0eVByZWNpc2U+LCBEZWZhdWx0SWdub3JlOwogZGVmIG5vdGVfZm91bmRfbXV0ZXhfbmVhcl9tYXRjaCA6IE5vdGU8ImZvdW5kIG5lYXIgbWF0Y2ggJyUwJyI+OwogCkBAIC0yMjk5LDE3ICsyMzU1LDMwIEBACiBkZWYgd2Fybl9pbXBjYXN0X2Zsb2F0aW5nX3BvaW50X3RvX2Jvb2wgOiBXYXJuaW5nPAogICAgICJpbXBsaWNpdCBjb252ZXJzaW9uIHR1cm5zIGZsb2F0aW5nLXBvaW50IG51bWJlciBpbnRvIGJvb2w6ICUwIHRvICUxIj4sCiAgICAgSW5Hcm91cDxJbXBsaWNpdENvbnZlcnNpb25GbG9hdGluZ1BvaW50VG9Cb29sPjsKLWRlZiB3YXJuX2ltcGNhc3RfZnVuY3Rpb25fdG9fYm9vbCA6IFdhcm5pbmc8Ci0gICAgImFkZHJlc3Mgb2YgZnVuY3Rpb24gJXEwIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICd0cnVlJyI+LAotICAgIEluR3JvdXA8Qm9vbENvbnZlcnNpb24+OwotZGVmIG5vdGVfZnVuY3Rpb25fdG9fYm9vbF9zaWxlbmNlIDogTm90ZTwKKworZGVmIHdhcm5faW1wY2FzdF9wb2ludGVyX3RvX2Jvb2wgOiBXYXJuaW5nPAorICAgICJhZGRyZXNzIG9mJXNlbGVjdHt8IGZ1bmN0aW9ufCBhcnJheX0wICclMScgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gIgorICAgICIndHJ1ZSciPiwKKyAgICBJbkdyb3VwPFBvaW50ZXJCb29sQ29udmVyc2lvbj47CitkZWYgd2Fybl9udWxsX3BvaW50ZXJfY29tcGFyZSA6IFdhcm5pbmc8CisgICAgImNvbXBhcmlzb24gb2YgJXNlbGVjdHthZGRyZXNzIG9mfGZ1bmN0aW9ufGFycmF5fTAgJyUxJyAlc2VsZWN0e25vdCB8fTIiCisgICAgImVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzIGFsd2F5cyAlc2VsZWN0e3RydWV8ZmFsc2V9MiI+LAorICAgIEluR3JvdXA8VGF1dG9sb2dpY2FsUG9pbnRlckNvbXBhcmU+OworCitkZWYgbm90ZV9mdW5jdGlvbl93YXJuaW5nX3NpbGVuY2UgOiBOb3RlPAogICAgICJwcmVmaXggd2l0aCB0aGUgYWRkcmVzcy1vZiBvcGVyYXRvciB0byBzaWxlbmNlIHRoaXMgd2FybmluZyI+OwotZGVmIG5vdGVfZnVuY3Rpb25fdG9fYm9vbF9jYWxsIDogTm90ZTwKK2RlZiBub3RlX2Z1bmN0aW9uX3RvX2Z1bmN0aW9uX2NhbGwgOiBOb3RlPAogICAgICJzdWZmaXggd2l0aCBwYXJlbnRoZXNlcyB0byB0dXJuIHRoaXMgaW50byBhIGZ1bmN0aW9uIGNhbGwiPjsKK2RlZiB3YXJuX2ltcGNhc3Rfb2JqZWN0aXZlX2NfbGl0ZXJhbF90b19ib29sIDogV2FybmluZzwKKyAgICAiaW1wbGljaXQgYm9vbGVhbiBjb252ZXJzaW9uIG9mIE9iamVjdGl2ZS1DIG9iamVjdCBsaXRlcmFsIGFsd2F5cyAiCisgICAgImV2YWx1YXRlcyB0byB0cnVlIj4sCisgICAgSW5Hcm91cDxPYmpDTGl0ZXJhbENvbnZlcnNpb24+OwogCiBkZWYgd2Fybl9jYXN0X2FsaWduIDogV2FybmluZzwKICAgImNhc3QgZnJvbSAlMCB0byAlMSBpbmNyZWFzZXMgcmVxdWlyZWQgYWxpZ25tZW50IGZyb20gJTIgdG8gJTMiPiwKICAgSW5Hcm91cDxDYXN0QWxpZ24+LCBEZWZhdWx0SWdub3JlOworZGVmIHdhcm5fb2xkX3N0eWxlX2Nhc3QgOiBXYXJuaW5nPAorICAidXNlIG9mIG9sZC1zdHlsZSBjYXN0Ij4sIEluR3JvdXA8T2xkU3R5bGVDYXN0PiwgRGVmYXVsdElnbm9yZTsKIAogLy8gU2VwYXJhdGUgYmV0d2VlbiBjYXN0cyB0byB2b2lkKiBhbmQgbm9uLXZvaWQqIHBvaW50ZXJzLgogLy8gU29tZSBBUElzIHVzZSAoYWJ1c2UpIHZvaWQqIGZvciBzb21ldGhpbmcgbGlrZSBhIHVzZXIgY29udGV4dCwKQEAgLTIzNTUsMTcgKzI0MjQsMjYgQEAKICAgSW5Hcm91cDxEaWFnR3JvdXA8InVuc3VwcG9ydGVkLXZpc2liaWxpdHkiPj47CiBkZWYgZXJyX21pc21hdGNoZWRfdmlzaWJpbGl0eTogRXJyb3I8InZpc2liaWxpdHkgZG9lcyBub3QgbWF0Y2ggcHJldmlvdXMgZGVjbGFyYXRpb24iPjsKIGRlZiBub3RlX3ByZXZpb3VzX2F0dHJpYnV0ZSA6IE5vdGU8InByZXZpb3VzIGF0dHJpYnV0ZSBpcyBoZXJlIj47Ci1kZWYgZXJyX3Vua25vd25fbWFjaGluZV9tb2RlIDogRXJyb3I8InVua25vd24gbWFjaGluZSBtb2RlICUwIj47Ci1kZWYgZXJyX3Vuc3VwcG9ydGVkX21hY2hpbmVfbW9kZSA6IEVycm9yPCJ1bnN1cHBvcnRlZCBtYWNoaW5lIG1vZGUgJTAiPjsKK2RlZiBlcnJfbWlzbWF0Y2hlZF9tc19pbmhlcml0YW5jZSA6IEVycm9yPAorICAiaW5oZXJpdGFuY2UgbW9kZWwgZG9lcyBub3QgbWF0Y2ggJXNlbGVjdHtkZWZpbml0aW9ufHByZXZpb3VzIGRlY2xhcmF0aW9ufTAiPjsKK2RlZiB3YXJuX2lnbm9yZWRfbXNfaW5oZXJpdGFuY2UgOiBXYXJuaW5nPAorICAiaW5oZXJpdGFuY2UgbW9kZWwgaWdub3JlZCBvbiAlc2VsZWN0e3ByaW1hcnkgdGVtcGxhdGV8cGFydGlhbCBzcGVjaWFsaXphdGlvbn0wIj4sCisgIEluR3JvdXA8SWdub3JlZEF0dHJpYnV0ZXM+OworZGVmIG5vdGVfcHJldmlvdXNfbXNfaW5oZXJpdGFuY2UgOiBOb3RlPAorICAicHJldmlvdXMgaW5oZXJpdGFuY2UgbW9kZWwgc3BlY2lmaWVkIGhlcmUiPjsKK2RlZiBlcnJfbWFjaGluZV9tb2RlIDogRXJyb3I8IiVzZWxlY3R7dW5rbm93bnx1bnN1cHBvcnRlZH0wIG1hY2hpbmUgbW9kZSAlMSI+OwogZGVmIGVycl9tb2RlX25vdF9wcmltaXRpdmUgOiBFcnJvcjwKICAgIm1vZGUgYXR0cmlidXRlIG9ubHkgc3VwcG9ydGVkIGZvciBpbnRlZ2VyIGFuZCBmbG9hdGluZy1wb2ludCB0eXBlcyI+OwogZGVmIGVycl9tb2RlX3dyb25nX3R5cGUgOiBFcnJvcjwKICAgInR5cGUgb2YgbWFjaGluZSBtb2RlIGRvZXMgbm90IG1hdGNoIHR5cGUgb2YgYmFzZSB0eXBlIj47CiBkZWYgZXJyX2F0dHJfd3JvbmdfZGVjbCA6IEVycm9yPAotICAiJyUwJyBhdHRyaWJ1dGUgaW52YWxpZCBvbiB0aGlzIGRlY2xhcmF0aW9uLCByZXF1aXJlcyB0eXBlZGVmIG9yIHZhbHVlIj47CisgICIlMCBhdHRyaWJ1dGUgaW52YWxpZCBvbiB0aGlzIGRlY2xhcmF0aW9uLCByZXF1aXJlcyB0eXBlZGVmIG9yIHZhbHVlIj47CiBkZWYgd2Fybl9hdHRyaWJ1dGVfbm9ubnVsbF9ub19wb2ludGVycyA6IFdhcm5pbmc8CiAgICInbm9ubnVsbCcgYXR0cmlidXRlIGFwcGxpZWQgdG8gZnVuY3Rpb24gd2l0aCBubyBwb2ludGVyIGFyZ3VtZW50cyI+LAogICBJbkdyb3VwPElnbm9yZWRBdHRyaWJ1dGVzPjsKK2RlZiB3YXJuX2F0dHJpYnV0ZV9ub25udWxsX3Bhcm1fbm9fYXJncyA6IFdhcm5pbmc8CisgICInbm9ubnVsbCcgYXR0cmlidXRlIHdoZW4gdXNlZCBvbiBwYXJhbWV0ZXJzIHRha2VzIG5vIGFyZ3VtZW50cyI+LAorICBJbkdyb3VwPElnbm9yZWRBdHRyaWJ1dGVzPjsKIGRlZiB3YXJuX2F0dHJpYnV0ZV9tYWxsb2NfcG9pbnRlcl9vbmx5IDogV2FybmluZzwKICAgIidtYWxsb2MnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zIHJldHVybmluZyBhIHBvaW50ZXIgdHlwZSI+LAogICBJbkdyb3VwPElnbm9yZWRBdHRyaWJ1dGVzPjsKQEAgLTIzOTQsMTUgKzI0NzIsMTQgQEAKICAgIidyZWdwYXJtJyBpcyBub3QgdmFsaWQgb24gdGhpcyBwbGF0Zm9ybSI+OwogZGVmIGVycl9hdHRyaWJ1dGVfcmVncGFybV9pbnZhbGlkX251bWJlciA6IEVycm9yPAogICAiJ3JlZ3Bhcm0nIHBhcmFtZXRlciBtdXN0IGJlIGJldHdlZW4gMCBhbmQgJTAgaW5jbHVzaXZlIj47CitkZWYgZXJyX2F0dHJpYnV0ZV9ub3Rfc3VwcG9ydGVkX2luX2xhbmcgOiBFcnJvcjwKKyAgIiUwIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGluICVzZWxlY3R7Q3xDKyt8T2JqZWN0aXZlLUN9MSI+OwogCiAKIC8vIENsYW5nLVNwZWNpZmljIEF0dHJpYnV0ZXMKIGRlZiB3YXJuX2F0dHJpYnV0ZV9pYm91dGxldCA6IFdhcm5pbmc8CiAgICIlMCBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBpbnN0YW5jZSB2YXJpYWJsZXMgb3IgcHJvcGVydGllcyI+LAogICBJbkdyb3VwPElnbm9yZWRBdHRyaWJ1dGVzPjsKLWRlZiB3YXJuX2F0dHJpYnV0ZV9pYmFjdGlvbjogV2FybmluZzwKLSAgImliYWN0aW9uIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIHRvIE9iamVjdGl2ZS1DIGluc3RhbmNlIG1ldGhvZHMiPiwKLSAgSW5Hcm91cDxJZ25vcmVkQXR0cmlidXRlcz47CiBkZWYgZXJyX2lib3V0bGV0Y29sbGVjdGlvbl90eXBlIDogRXJyb3I8CiAgICJpbnZhbGlkIHR5cGUgJTAgYXMgYXJndW1lbnQgb2YgaWJvdXRsZXRjb2xsZWN0aW9uIGF0dHJpYnV0ZSI+OwogZGVmIGVycl9pYm91dGxldGNvbGxlY3Rpb25fYnVpbHRpbnR5cGUgOiBFcnJvcjwKQEAgLTI0MTQsOCArMjQ5MSw2IEBACiAgICJJQk91dGxldENvbGxlY3Rpb24gcHJvcGVydGllcyBzaG91bGQgYmUgY29weS9zdHJvbmcgYW5kIG5vdCBhc3NpZ24iPiwKICAgSW5Hcm91cDxPYmpDSW52YWxpZElCT3V0bGV0UHJvcGVydHk+OwogICAKLWRlZiBlcnJfYXR0cmlidXRlX292ZXJsb2FkYWJsZV9ub3RfZnVuY3Rpb24gOiBFcnJvcjwKLSAgIidvdmVybG9hZGFibGUnIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEgZnVuY3Rpb24iPjsKIGRlZiBlcnJfYXR0cmlidXRlX292ZXJsb2FkYWJsZV9taXNzaW5nIDogRXJyb3I8CiAgICIlc2VsZWN0e292ZXJsb2FkZWQgZnVuY3Rpb258cmVkZWNsYXJhdGlvbiBvZn0wICUxIG11c3QgaGF2ZSB0aGUgIgogICAiJ292ZXJsb2FkYWJsZScgYXR0cmlidXRlIj47CkBAIC0yNDM2LDE1ICsyNTExLDM2IEBACiAgIEluR3JvdXA8RGlhZ0dyb3VwPCJyZXF1aXJlcy1zdXBlci1hdHRyaWJ1dGUiPj47CiBkZWYgbm90ZV9wcm90b2NvbF9kZWNsIDogTm90ZTwKICAgInByb3RvY29sIGlzIGRlY2xhcmVkIGhlcmUiPjsKK2RlZiBub3RlX3Byb3RvY29sX2RlY2xfdW5kZWZpbmVkIDogTm90ZTwKKyAgInByb3RvY29sICUwIGhhcyBubyBkZWZpbml0aW9uIj47CiAKLWRlZiBlcnJfbnNfYnJpZGdlZF9ub3RfaW50ZXJmYWNlIDogRXJyb3I8Ci0gICJwYXJhbWV0ZXIgb2YgJ25zX2JyaWRnZWQnIGF0dHJpYnV0ZSBkb2VzIG5vdCBuYW1lIGFuIE9iamVjdGl2ZS1DIGNsYXNzIj47Ci0gIAorLy8gb2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyIGF0dHJpYnV0ZSBkaWFnbm9zdGljcy4KK2RlZiB3YXJuX29iamNfZGVzaWduYXRlZF9pbml0X21pc3Npbmdfc3VwZXJfY2FsbCA6IFdhcm5pbmc8CisgICJkZXNpZ25hdGVkIGluaXRpYWxpemVyIG1pc3NpbmcgYSAnc3VwZXInIGNhbGwgdG8gYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBzdXBlciBjbGFzcyI+LAorICBJbkdyb3VwPE9iakNEZXNpZ25hdGVkSW5pdD47CitkZWYgbm90ZV9vYmpjX2Rlc2lnbmF0ZWRfaW5pdF9tYXJrZWRfaGVyZSA6IE5vdGU8CisgICJtZXRob2QgbWFya2VkIGFzIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgb2YgdGhlIGNsYXNzIGhlcmUiPjsKK2RlZiB3YXJuX29iamNfZGVzaWduYXRlZF9pbml0X25vbl9zdXBlcl9kZXNpZ25hdGVkX2luaXRfY2FsbCA6IFdhcm5pbmc8CisgICJkZXNpZ25hdGVkIGluaXRpYWxpemVyIHNob3VsZCBvbmx5IGludm9rZSBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgb24gJ3N1cGVyJyI+LAorICBJbkdyb3VwPE9iakNEZXNpZ25hdGVkSW5pdD47CitkZWYgd2Fybl9vYmpjX2Rlc2lnbmF0ZWRfaW5pdF9ub25fZGVzaWduYXRlZF9pbml0X2NhbGwgOiBXYXJuaW5nPAorICAiZGVzaWduYXRlZCBpbml0aWFsaXplciBpbnZva2VkIGEgbm9uLWRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIiPiwKKyAgSW5Hcm91cDxPYmpDRGVzaWduYXRlZEluaXQ+OworZGVmIHdhcm5fb2JqY19zZWNvbmRhcnlfaW5pdF9zdXBlcl9pbml0X2NhbGwgOiBXYXJuaW5nPAorICAic2Vjb25kYXJ5IGluaXRpYWxpemVyIHNob3VsZCBub3QgaW52b2tlIGFuIGluaXRpYWxpemVyIG9uICdzdXBlciciPiwKKyAgSW5Hcm91cDxPYmpDRGVzaWduYXRlZEluaXQ+OworZGVmIHdhcm5fb2JqY19zZWNvbmRhcnlfaW5pdF9taXNzaW5nX2luaXRfY2FsbCA6IFdhcm5pbmc8CisgICJzZWNvbmRhcnkgaW5pdGlhbGl6ZXIgbWlzc2luZyBhICdzZWxmJyBjYWxsIHRvIGFub3RoZXIgaW5pdGlhbGl6ZXIiPiwKKyAgSW5Hcm91cDxPYmpDRGVzaWduYXRlZEluaXQ+OworZGVmIHdhcm5fb2JqY19pbXBsZW1lbnRhdGlvbl9taXNzaW5nX2Rlc2lnbmF0ZWRfaW5pdF9vdmVycmlkZSA6IFdhcm5pbmc8CisgICJtZXRob2Qgb3ZlcnJpZGUgZm9yIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBzdXBlcmNsYXNzICVvYmpjaW5zdGFuY2UwIG5vdCBmb3VuZCI+LAorICBJbkdyb3VwPE9iakNEZXNpZ25hdGVkSW5pdD47CisKIC8vIG9iamNfYnJpZGdlIGF0dHJpYnV0ZSBkaWFnbm9zdGljcy4KLWRlZiBlcnJfb2JqY19icmlkZ2Vfbm90X2lkIDogRXJyb3I8Ci0gICJwYXJhbWV0ZXIgb2YgJ29iamNfYnJpZGdlJyBhdHRyaWJ1dGUgbXVzdCBiZSBhIHNpbmdsZSBuYW1lIG9mIGFuIE9iamVjdGl2ZS1DIGNsYXNzIj47CitkZWYgZXJyX29iamNfYXR0cl9ub3RfaWQgOiBFcnJvcjwKKyAgInBhcmFtZXRlciBvZiAlMCBhdHRyaWJ1dGUgbXVzdCBiZSBhIHNpbmdsZSBuYW1lIG9mIGFuIE9iamVjdGl2ZS1DICVzZWxlY3R7Y2xhc3N8cHJvdG9jb2x9MSI+OwogZGVmIGVycl9vYmpjX2NmX2JyaWRnZWRfbm90X2ludGVyZmFjZSA6IEVycm9yPAotICAiQ0Ygb2JqZWN0IG9mIHR5cGUgJTAgaXMgYnJpZGdlZCB0byAnJTEnLCB3aGljaCBpcyBub3QgYW4gT2JqZWN0aXZlLUMgY2xhc3MiPjsKKyAgIkNGIG9iamVjdCBvZiB0eXBlICUwIGlzIGJyaWRnZWQgdG8gJTEsIHdoaWNoIGlzIG5vdCBhbiBPYmplY3RpdmUtQyBjbGFzcyI+OwogZGVmIGVycl9vYmpjX25zX2JyaWRnZWRfaW52YWxpZF9jZm9iamVjdCA6IEVycm9yPAogICAiT2JqZWN0aXZlQyBvYmplY3Qgb2YgdHlwZSAlMCBpcyBicmlkZ2VkIHRvICUxLCB3aGljaCBpcyBub3QgdmFsaWQgQ0Ygb2JqZWN0Ij47CiBkZWYgd2Fybl9vYmpjX2ludmFsaWRfYnJpZGdlIDogV2FybmluZzwKQEAgLTI0NTIsNiArMjU0OCwxOCBAQAogZGVmIHdhcm5fb2JqY19pbnZhbGlkX2JyaWRnZV90b19jZiA6IFdhcm5pbmc8CiAgICIlMCBjYW5ub3QgYnJpZGdlIHRvICUxIj4sIEluR3JvdXA8T2JqQ0JyaWRnZT47CiAKKy8vIG9iamNfYnJpZGdlX3JlbGF0ZWQgYXR0cmlidXRlIGRpYWdub3N0aWNzLgorZGVmIGVycl9vYmpjX2JyaWRnZWRfcmVsYXRlZF9pbnZhbGlkX2NsYXNzIDogRXJyb3I8CisgICJjb3VsZCBub3QgZmluZCBPYmplY3RpdmUtQyBjbGFzcyAlMCB0byBjb252ZXJ0ICUxIHRvICUyIj47CitkZWYgZXJyX29iamNfYnJpZGdlZF9yZWxhdGVkX2ludmFsaWRfY2xhc3NfbmFtZSA6IEVycm9yPAorICAiJTAgbXVzdCBiZSBuYW1lIG9mIGFuIE9iamVjdGl2ZS1DIGNsYXNzIHRvIGJlIGFibGUgdG8gY29udmVydCAlMSB0byAlMiI+OworZGVmIGVycl9vYmpjX2JyaWRnZWRfcmVsYXRlZF9rbm93bl9tZXRob2QgOiBFcnJvcjwKKyAiJTAgbXVzdCBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCB0byAlMTsgdXNlICVzZWxlY3R7JW9iamNjbGFzczJ8JW9iamNpbnN0YW5jZTJ9MyAiCisgIm1ldGhvZCBmb3IgdGhpcyBjb252ZXJzaW9uIj47CisKK2RlZiBlcnJfb2JqY19hdHRyX3Byb3RvY29sX3JlcXVpcmVzX2RlZmluaXRpb24gOiBFcnJvcjwKKyAgImF0dHJpYnV0ZSAlMCBjYW4gb25seSBiZSBhcHBsaWVkIHRvIEBwcm90b2NvbCBkZWZpbml0aW9ucywgbm90IGZvcndhcmQgZGVjbGFyYXRpb25zIj47CisKIC8vIEZ1bmN0aW9uIFBhcmFtZXRlciBTZW1hbnRpYyBBbmFseXNpcy4KIGRlZiBlcnJfcGFyYW1fd2l0aF92b2lkX3R5cGUgOiBFcnJvcjwiYXJndW1lbnQgbWF5IG5vdCBoYXZlICd2b2lkJyB0eXBlIj47CiBkZWYgZXJyX3ZvaWRfb25seV9wYXJhbSA6IEVycm9yPApAQCAtMjQ2Miw4ICsyNTcwLDYgQEAKICAgImEgcGFyYW1ldGVyIGxpc3Qgd2l0aG91dCB0eXBlcyBpcyBvbmx5IGFsbG93ZWQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uIj47CiBkZWYgZXh0X3BhcmFtX25vdF9kZWNsYXJlZCA6IEV4dGVuc2lvbjwKICAgInBhcmFtZXRlciAlMCB3YXMgbm90IGRlY2xhcmVkLCBkZWZhdWx0aW5nIHRvIHR5cGUgJ2ludCciPjsKLWRlZiBlcnJfcGFyYW1fdHlwZWRlZl9vZl92b2lkIDogRXJyb3I8Ci0gICJlbXB0eSBwYXJhbWV0ZXIgbGlzdCBkZWZpbmVkIHdpdGggYSAlc2VsZWN0e3R5cGVkZWZ8dHlwZSBhbGlhc30wIG9mICd2b2lkJyBub3QgYWxsb3dlZCVzZWxlY3R7IGluIEMrK3x9MCI+OwogZGVmIGVycl9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50IDogRXJyb3I8CiAgICJDIGRvZXMgbm90IHN1cHBvcnQgZGVmYXVsdCBhcmd1bWVudHMiPjsKIGRlZiBlcnJfcGFyYW1fZGVmYXVsdF9hcmd1bWVudF9yZWRlZmluaXRpb24gOiBFcnJvcjwKQEAgLTI1NzksNiArMjY4NSw4IEBACiAgICAgImNhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOiBzdWJzdGl0dXRpb24gZmFpbHVyZSUwJTEiPjsKIGRlZiBub3RlX292bF9jYW5kaWRhdGVfZGlzYWJsZWRfYnlfZW5hYmxlX2lmIDogTm90ZTwKICAgICAiY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IGRpc2FibGVkIGJ5ICUwJTEiPjsKK2RlZiBub3RlX292bF9jYW5kaWRhdGVfZGlzYWJsZWRfYnlfZW5hYmxlX2lmX2F0dHIgOiBOb3RlPAorICAgICJjYW5kaWRhdGUgZGlzYWJsZWQ6ICUwIj47CiBkZWYgbm90ZV9vdmxfY2FuZGlkYXRlX2ZhaWxlZF9vdmVybG9hZF9yZXNvbHV0aW9uIDogTm90ZTwKICAgICAiY2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IGNvdWxkbid0IHJlc29sdmUgcmVmZXJlbmNlIHRvIG92ZXJsb2FkZWQgIgogICAgICJmdW5jdGlvbiAlMCI+OwpAQCAtMzE2NCw2ICszMjcyLDggQEAKIGRlZiBlcnJfZGVwZW5kZW50X25vbl90eXBlX2FyZ19pbl9wYXJ0aWFsX3NwZWMgOiBFcnJvcjwKICAgICAibm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQgZGVwZW5kcyBvbiBhIHRlbXBsYXRlIHBhcmFtZXRlciBvZiB0aGUgIgogICAgICJwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIj47CitkZWYgbm90ZV9kZXBlbmRlbnRfbm9uX3R5cGVfZGVmYXVsdF9hcmdfaW5fcGFydGlhbF9zcGVjIDogTm90ZTwKKyAgICAidGVtcGxhdGUgcGFyYW1ldGVyIGlzIHVzZWQgaW4gZGVmYXVsdCBhcmd1bWVudCBkZWNsYXJlZCBoZXJlIj47CiBkZWYgZXJyX2RlcGVuZGVudF90eXBlZF9ub25fdHlwZV9hcmdfaW5fcGFydGlhbF9zcGVjIDogRXJyb3I8CiAgICAgIm5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IHNwZWNpYWxpemVzIGEgdGVtcGxhdGUgcGFyYW1ldGVyIHdpdGggIgogICAgICJkZXBlbmRlbnQgdHlwZSAlMCI+OwpAQCAtMzE3Myw3ICszMjgzLDcgQEAKICAgICAicHJpbWFyeSB0ZW1wbGF0ZSwgcmVtb3ZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0Ij47IAogZGVmIHdhcm5fcGFydGlhbF9zcGVjc19ub3RfZGVkdWNpYmxlIDogV2FybmluZzwKICAgICAiJXNlbGVjdHtjbGFzc3x2YXJpYWJsZX0wIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gY29udGFpbnMgIgotICAgICIlc2VsZWN0e2EgdGVtcGxhdGUgcGFyYW1ldGVyfHRlbXBsYXRlIHBhcmFtZXRlcnN9MSB0aGF0IGNhbiBub3QgYmUgIgorICAgICIlc2VsZWN0e2EgdGVtcGxhdGUgcGFyYW1ldGVyfHRlbXBsYXRlIHBhcmFtZXRlcnN9MSB0aGF0IGNhbm5vdCBiZSAiCiAgICAgImRlZHVjZWQ7IHRoaXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB3aWxsIG5ldmVyIGJlIHVzZWQiPjsKIGRlZiBub3RlX3BhcnRpYWxfc3BlY191bnVzZWRfcGFyYW1ldGVyIDogTm90ZTwKICAgICAibm9uLWRlZHVjaWJsZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgJTAiPjsKQEAgLTMzODMsMTEgKzM0OTMsMTEgQEAKICAgImFkZCAndHlwZW5hbWUnIHRvIHRyZWF0IHRoaXMgdXNpbmcgZGVjbGFyYXRpb24gYXMgYSB0eXBlIj47CiAKIGRlZiBlcnJfdGVtcGxhdGVfa3dfcmVmZXJzX3RvX25vbl90ZW1wbGF0ZSA6IEVycm9yPAotICAgICIlMCBmb2xsb3dpbmcgdGhlICd0ZW1wbGF0ZScga2V5d29yZCBkb2VzIG5vdCByZWZlciB0byBhIHRlbXBsYXRlIj47CisgICIlMCBmb2xsb3dpbmcgdGhlICd0ZW1wbGF0ZScga2V5d29yZCBkb2VzIG5vdCByZWZlciB0byBhIHRlbXBsYXRlIj47CiBkZWYgZXJyX3RlbXBsYXRlX2t3X3JlZmVyc190b19jbGFzc190ZW1wbGF0ZSA6IEVycm9yPAotICAgICInJTAlMScgaW5zdGFudGlhdGVkIHRvIGEgY2xhc3MgdGVtcGxhdGUsIG5vdCBhIGZ1bmN0aW9uIHRlbXBsYXRlIj47CisgICInJTAlMScgaW5zdGFudGlhdGVkIHRvIGEgY2xhc3MgdGVtcGxhdGUsIG5vdCBhIGZ1bmN0aW9uIHRlbXBsYXRlIj47CiBkZWYgbm90ZV9yZWZlcmVuY2VkX2NsYXNzX3RlbXBsYXRlIDogRXJyb3I8Ci0gICAgImNsYXNzIHRlbXBsYXRlIGRlY2xhcmVkIGhlcmUiPjsKKyAgImNsYXNzIHRlbXBsYXRlIGRlY2xhcmVkIGhlcmUiPjsKIGRlZiBlcnJfdGVtcGxhdGVfa3dfbWlzc2luZyA6IEVycm9yPAogICAibWlzc2luZyAndGVtcGxhdGUnIGtleXdvcmQgcHJpb3IgdG8gZGVwZW5kZW50IHRlbXBsYXRlIG5hbWUgJyUwJTEnIj47CiBkZWYgZXh0X3RlbXBsYXRlX291dHNpZGVfb2ZfdGVtcGxhdGUgOiBFeHRXYXJuPApAQCAtMzM5NywxMyArMzUwNywxNiBAQAogICBJbkdyb3VwPENYWDk4Q29tcGF0PiwgRGVmYXVsdElnbm9yZTsKIAogZGVmIGVycl9ub25fdHlwZV90ZW1wbGF0ZV9pbl9uZXN0ZWRfbmFtZV9zcGVjaWZpZXIgOiBFcnJvcjwKLSAgInF1YWxpZmllZCBuYW1lIHJlZmVycyBpbnRvIGEgc3BlY2lhbGl6YXRpb24gb2YgZnVuY3Rpb24gdGVtcGxhdGUgJTAiPjsKKyAgInF1YWxpZmllZCBuYW1lIHJlZmVycyBpbnRvIGEgc3BlY2lhbGl6YXRpb24gb2YgJXNlbGVjdHtmdW5jdGlvbnx2YXJpYWJsZX0wICIKKyAgInRlbXBsYXRlICUxIj47CiBkZWYgZXJyX3RlbXBsYXRlX2lkX25vdF9hX3R5cGUgOiBFcnJvcjwKICAgInRlbXBsYXRlIG5hbWUgcmVmZXJzIHRvIG5vbi10eXBlIHRlbXBsYXRlICUwIj47CiBkZWYgbm90ZV90ZW1wbGF0ZV9kZWNsYXJlZF9oZXJlIDogTm90ZTwKICAgIiVzZWxlY3R7ZnVuY3Rpb24gdGVtcGxhdGV8Y2xhc3MgdGVtcGxhdGV8dmFyaWFibGUgdGVtcGxhdGUiCiAgICJ8dHlwZSBhbGlhcyB0ZW1wbGF0ZXx0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJ9MCAiCiAgICIlMSBkZWNsYXJlZCBoZXJlIj47CitkZWYgZXJyX2FsaWFzX3RlbXBsYXRlX2V4cGFuc2lvbl9pbnRvX2ZpeGVkX2xpc3QgOiBFcnJvcjwKKyAgInBhY2sgZXhwYW5zaW9uIHVzZWQgYXMgYXJndW1lbnQgZm9yIG5vbi1wYWNrIHBhcmFtZXRlciBvZiBhbGlhcyB0ZW1wbGF0ZSI+OwogZGVmIG5vdGVfcGFyYW1ldGVyX3R5cGUgOiBOb3RlPAogICAicGFyYW1ldGVyIG9mIHR5cGUgJTAgaXMgZGVjbGFyZWQgaGVyZSI+OwogCkBAIC0zNDk0LDcgKzM2MDcsNyBAQAogZGVmIHdhcm5fZGVwcmVjYXRlZF9tZXNzYWdlIDogV2FybmluZzwiJTAgaXMgZGVwcmVjYXRlZDogJTEiPiwKICAgICBJbkdyb3VwPERlcHJlY2F0ZWREZWNsYXJhdGlvbnM+OwogZGVmIHdhcm5fZGVwcmVjYXRlZF9md2RjbGFzc19tZXNzYWdlIDogV2FybmluZzwKLSAgICAiJTAgbWF5YmUgZGVwcmVjYXRlZCBiZWNhdXNlIHJlY2VpdmVyIHR5cGUgaXMgdW5rbm93biI+LAorICAgICIlMCBtYXkgYmUgZGVwcmVjYXRlZCBiZWNhdXNlIHRoZSByZWNlaXZlciB0eXBlIGlzIHVua25vd24iPiwKICAgICBJbkdyb3VwPERlcHJlY2F0ZWREZWNsYXJhdGlvbnM+OwogZGVmIHdhcm5fZGVwcmVjYXRlZF9kZWYgOiBXYXJuaW5nPAogICAgICJJbXBsZW1lbnRpbmcgZGVwcmVjYXRlZCAlc2VsZWN0e21ldGhvZHxjbGFzc3xjYXRlZ29yeX0wIj4sCkBAIC0zNTAyLDkgKzM2MTUsMTAgQEAKIGRlZiBlcnJfdW5hdmFpbGFibGUgOiBFcnJvcjwiJTAgaXMgdW5hdmFpbGFibGUiPjsKIGRlZiBlcnJfdW5hdmFpbGFibGVfbWVzc2FnZSA6IEVycm9yPCIlMCBpcyB1bmF2YWlsYWJsZTogJTEiPjsKIGRlZiB3YXJuX3VuYXZhaWxhYmxlX2Z3ZGNsYXNzX21lc3NhZ2UgOiBXYXJuaW5nPAotICAgICIlMCBtYXliZSB1bmF2YWlsYWJsZSBiZWNhdXNlIHJlY2VpdmVyIHR5cGUgaXMgdW5rbm93biI+OwotZGVmIG5vdGVfdW5hdmFpbGFibGVfaGVyZSA6IE5vdGU8Ci0gICIlc2VsZWN0e2RlY2xhcmF0aW9ufGZ1bmN0aW9ufTAgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgIgorICAgICIlMCBtYXkgYmUgdW5hdmFpbGFibGUgYmVjYXVzZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3duIj4sCisgICAgSW5Hcm91cDxVbmF2YWlsYWJsZURlY2xhcmF0aW9ucz47CitkZWYgbm90ZV9hdmFpbGFiaWxpdHlfc3BlY2lmaWVkX2hlcmUgOiBOb3RlPAorICAiJTAgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgIgogICAiJXNlbGVjdHt1bmF2YWlsYWJsZXxkZWxldGVkfGRlcHJlY2F0ZWR9MSBoZXJlIj47CiBkZWYgbm90ZV9pbXBsaWNpdGx5X2RlbGV0ZWQgOiBOb3RlPAogICAiZXhwbGljaXRseSBkZWZhdWx0ZWQgZnVuY3Rpb24gd2FzIGltcGxpY2l0bHkgZGVsZXRlZCBoZXJlIj47CkBAIC0zNTI4LDYgKzM2NDIsOCBAQAogZGVmIHdhcm5fbWlzc2luZ192YXJpYWJsZV9kZWNsYXJhdGlvbnMgOiBXYXJuaW5nPAogICAibm8gcHJldmlvdXMgZXh0ZXJuIGRlY2xhcmF0aW9uIGZvciBub24tc3RhdGljIHZhcmlhYmxlICUwIj4sCiAgIEluR3JvdXA8RGlhZ0dyb3VwPCJtaXNzaW5nLXZhcmlhYmxlLWRlY2xhcmF0aW9ucyI+PiwgRGVmYXVsdElnbm9yZTsKK2RlZiBlcnJfc3RhdGljX2RhdGFfbWVtYmVyX3JlaW5pdGlhbGl6YXRpb24gOgorICBFcnJvcjwic3RhdGljIGRhdGEgbWVtYmVyICUwIGFscmVhZHkgaGFzIGFuIGluaXRpYWxpemVyIj47CiBkZWYgZXJyX3JlZGVmaW5pdGlvbiA6IEVycm9yPCJyZWRlZmluaXRpb24gb2YgJTAiPjsKIGRlZiBlcnJfYWxpYXNfYWZ0ZXJfdGVudGF0aXZlIDoKICAgRXJyb3I8ImFsaWFzIGRlZmluaXRpb24gb2YgJTAgYWZ0ZXIgdGVudGF0aXZlIGRlZmluaXRpb24iPjsKQEAgLTM1NDQsOSArMzY2MCw2IEBACiBkZWYgZXJyX3JlZGVmaW5pdGlvbl9leHRlcm5faW5saW5lIDogRXJyb3I8CiAgICJyZWRlZmluaXRpb24gb2YgYSAnZXh0ZXJuIGlubGluZScgZnVuY3Rpb24gJTAgaXMgbm90IHN1cHBvcnRlZCBpbiAiCiAgICIlc2VsZWN0e0M5OSBtb2RlfEMrK30xIj47Ci1kZWYgd2Fybl9jeHg5OF9jb21wYXRfZnJpZW5kX3JlZGVmaW5pdGlvbiA6IFdhcm5pbmc8Ci0gICJmcmllbmQgZnVuY3Rpb24gJTAgd291bGQgYmUgaW1wbGljaXRseSByZWRlZmluZWQgaW4gQysrOTgiPiwKLSAgSW5Hcm91cDxDWFg5OENvbXBhdD4sIERlZmF1bHRJZ25vcmU7CiAKIGRlZiBub3RlX2RlbGV0ZWRfZHRvcl9ub19vcGVyYXRvcl9kZWxldGUgOiBOb3RlPAogICAidmlydHVhbCBkZXN0cnVjdG9yIHJlcXVpcmVzIGFuIHVuYW1iaWd1b3VzLCBhY2Nlc3NpYmxlICdvcGVyYXRvciBkZWxldGUnIj47CkBAIC0zNjA0LDYgKzM3MTcsOCBAQAogZGVmIGVycl9yZWRlZmluaXRpb25fdmFyaWFibHlfbW9kaWZpZWRfdHlwZWRlZiA6IEVycm9yPAogICAicmVkZWZpbml0aW9uIG9mICVzZWxlY3R7dHlwZWRlZnx0eXBlIGFsaWFzfTAgZm9yIHZhcmlhYmx5LW1vZGlmaWVkIHR5cGUgJTEiPjsKIAorZGVmIGVycl9pbmxpbmVfZGVjbF9mb2xsb3dzX2RlZiA6IEVycm9yPAorICAiaW5saW5lIGRlY2xhcmF0aW9uIG9mICUwIGZvbGxvd3Mgbm9uLWlubGluZSBkZWZpbml0aW9uIj47CiBkZWYgZXJyX2lubGluZV9kZWNsYXJhdGlvbl9ibG9ja19zY29wZSA6IEVycm9yPAogICAiaW5saW5lIGRlY2xhcmF0aW9uIG9mICUwIG5vdCBhbGxvd2VkIGluIGJsb2NrIHNjb3BlIj47CiBkZWYgZXJyX3N0YXRpY19ub25fc3RhdGljIDogRXJyb3I8CkBAIC0zNjg5LDE3ICszODA0LDE4IEBACiBkZWYgZXh0X2VudW1fdmFsdWVfbm90X2ludCA6IEV4dGVuc2lvbjwKICAgIklTTyBDIHJlc3RyaWN0cyBlbnVtZXJhdG9yIHZhbHVlcyB0byByYW5nZSBvZiAnaW50JyAoJTAgaXMgdG9vICIKICAgIiVzZWxlY3R7c21hbGx8bGFyZ2V9MSkiPjsKLWRlZiB3YXJuX2VudW1fdG9vX2xhcmdlIDogV2FybmluZzwKLSAgImVudW1lcmF0aW9uIHZhbHVlcyBleGNlZWQgcmFuZ2Ugb2YgbGFyZ2VzdCBpbnRlZ2VyIj47Ci1kZWYgd2Fybl9lbnVtZXJhdG9yX3Rvb19sYXJnZSA6IFdhcm5pbmc8Ci0gICJlbnVtZXJhdG9yIHZhbHVlICUwIGlzIG5vdCByZXByZXNlbnRhYmxlIGluIHRoZSBsYXJnZXN0IGludGVnZXIgdHlwZSI+OworZGVmIGV4dF9lbnVtX3Rvb19sYXJnZSA6IEV4dFdhcm48CisgICJlbnVtZXJhdGlvbiB2YWx1ZXMgZXhjZWVkIHJhbmdlIG9mIGxhcmdlc3QgaW50ZWdlciI+LCBJbkdyb3VwPEVudW1Ub29MYXJnZT47CitkZWYgZXh0X2VudW1lcmF0b3JfaW5jcmVtZW50X3Rvb19sYXJnZSA6IEV4dFdhcm48CisgICJpbmNyZW1lbnRlZCBlbnVtZXJhdG9yIHZhbHVlICUwIGlzIG5vdCByZXByZXNlbnRhYmxlIGluIHRoZSAiCisgICJsYXJnZXN0IGludGVnZXIgdHlwZSI+LCBJbkdyb3VwPEVudW1Ub29MYXJnZT47CiAgIAogZGVmIHdhcm5faWxsZWdhbF9jb25zdGFudF9hcnJheV9zaXplIDogRXh0ZW5zaW9uPAogICAic2l6ZSBvZiBzdGF0aWMgYXJyYXkgbXVzdCBiZSBhbiBpbnRlZ2VyIGNvbnN0YW50IGV4cHJlc3Npb24iPjsKIGRlZiBlcnJfdm1fZGVjbF9pbl9maWxlX3Njb3BlIDogRXJyb3I8CiAgICJ2YXJpYWJseSBtb2RpZmllZCB0eXBlIGRlY2xhcmF0aW9uIG5vdCBhbGxvd2VkIGF0IGZpbGUgc2NvcGUiPjsKIGRlZiBlcnJfdm1fZGVjbF9oYXNfZXh0ZXJuX2xpbmthZ2UgOiBFcnJvcjwKLSAgInZhcmlhYmx5IG1vZGlmaWVkIHR5cGUgZGVjbGFyYXRpb24gY2FuIG5vdCBoYXZlICdleHRlcm4nIGxpbmthZ2UiPjsKKyAgInZhcmlhYmx5IG1vZGlmaWVkIHR5cGUgZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgJ2V4dGVybicgbGlua2FnZSI+OwogZGVmIGVycl90eXBlY2hlY2tfZmllbGRfdmFyaWFibGVfc2l6ZSA6IEVycm9yPAogICAiZmllbGRzIG11c3QgaGF2ZSBhIGNvbnN0YW50IHNpemU6ICd2YXJpYWJsZSBsZW5ndGggYXJyYXkgaW4gc3RydWN0dXJlJyAiCiAgICJleHRlbnNpb24gd2lsbCBuZXZlciBiZSBzdXBwb3J0ZWQiPjsKQEAgLTM3MzIsNiArMzg0OCw5IEBACiAgIEluR3JvdXA8QmFkQXJyYXlOZXdMZW5ndGg+OwogZGVmIHdhcm5fdHlwZWNoZWNrX2Z1bmN0aW9uX3F1YWxpZmllcnMgOiBXYXJuaW5nPAogICAicXVhbGlmaWVyIG9uIGZ1bmN0aW9uIHR5cGUgJTAgaGFzIHVuc3BlY2lmaWVkIGJlaGF2aW9yIj47CitkZWYgd2Fybl90eXBlY2hlY2tfcmVmZXJlbmNlX3F1YWxpZmllcnMgOiBXYXJuaW5nPAorICAiJyUwJyBxdWFsaWZpZXIgb24gcmVmZXJlbmNlIHR5cGUgJTEgaGFzIG5vIGVmZmVjdCI+LAorICBJbkdyb3VwPElnbm9yZWRRdWFsaWZpZXJzPjsKIGRlZiBlcnJfdHlwZWNoZWNrX2ludmFsaWRfcmVzdHJpY3Rfbm90X3BvaW50ZXIgOiBFcnJvcjwKICAgInJlc3RyaWN0IHJlcXVpcmVzIGEgcG9pbnRlciBvciByZWZlcmVuY2UgKCUwIGlzIGludmFsaWQpIj47CiBkZWYgZXJyX3R5cGVjaGVja19pbnZhbGlkX3Jlc3RyaWN0X25vdF9wb2ludGVyX25vYXJnIDogRXJyb3I8CkBAIC0zNzcxLDExICszODkwLDExIEBACiBkZWYgd2Fybl9pbml0aWFsaXplcl9zdHJpbmdfZm9yX2NoYXJfYXJyYXlfdG9vX2xvbmcgOiBFeHRXYXJuPAogICAiaW5pdGlhbGl6ZXItc3RyaW5nIGZvciBjaGFyIGFycmF5IGlzIHRvbyBsb25nIj47CiBkZWYgd2Fybl9taXNzaW5nX2ZpZWxkX2luaXRpYWxpemVycyA6IFdhcm5pbmc8Ci0gICJtaXNzaW5nIGZpZWxkICclMCcgaW5pdGlhbGl6ZXIiPiwKKyAgIm1pc3NpbmcgZmllbGQgJTAgaW5pdGlhbGl6ZXIiPiwKICAgSW5Hcm91cDxNaXNzaW5nRmllbGRJbml0aWFsaXplcnM+LCBEZWZhdWx0SWdub3JlOwogZGVmIHdhcm5fYnJhY2VzX2Fyb3VuZF9zY2FsYXJfaW5pdCA6IFdhcm5pbmc8CiAgICJicmFjZXMgYXJvdW5kIHNjYWxhciBpbml0aWFsaXplciI+OwotZGVmIHdhcm5fbWFueV9icmFjZXNfYXJvdW5kX3NjYWxhcl9pbml0IDogRXh0V2FybjwKK2RlZiBleHRfbWFueV9icmFjZXNfYXJvdW5kX3NjYWxhcl9pbml0IDogRXh0V2FybjwKICAgInRvbyBtYW55IGJyYWNlcyBhcm91bmQgc2NhbGFyIGluaXRpYWxpemVyIj47CiBkZWYgZXh0X2NvbXBsZXhfY29tcG9uZW50X2luaXQgOiBFeHRlbnNpb248CiAgICJjb21wbGV4IGluaXRpYWxpemF0aW9uIHNwZWNpZnlpbmcgcmVhbCBhbmQgaW1hZ2luYXJ5IGNvbXBvbmVudHMgIgpAQCAtMzkxMyw2ICs0MDMyLDkgQEAKICAgImp1bXAgZXhpdHMgc2NvcGUgb2YgdmFyaWFibGUgd2l0aCBfX2F0dHJpYnV0ZV9fKChjbGVhbnVwKSkiPjsKIGRlZiBub3RlX2V4aXRzX2R0b3IgOiBOb3RlPAogICAianVtcCBleGl0cyBzY29wZSBvZiB2YXJpYWJsZSB3aXRoIG5vbi10cml2aWFsIGRlc3RydWN0b3IiPjsKK2RlZiBub3RlX2V4aXRzX3RlbXBvcmFyeV9kdG9yIDogTm90ZTwKKyAgImp1bXAgZXhpdHMgc2NvcGUgb2YgbGlmZXRpbWUtZXh0ZW5kZWQgdGVtcG9yYXJ5IHdpdGggbm9uLXRyaXZpYWwgIgorICAiZGVzdHJ1Y3RvciI+OwogZGVmIG5vdGVfZXhpdHNfX19ibG9jayA6IE5vdGU8CiAgICJqdW1wIGV4aXRzIHNjb3BlIG9mIF9fYmxvY2sgdmFyaWFibGUiPjsKIGRlZiBub3RlX2V4aXRzX29iamNfdHJ5IDogTm90ZTwKQEAgLTM5NTQsOCArNDA3Niw4IEBACiBkZWYgZXJyX2ZsZXhpYmxlX2FycmF5X2VtcHR5X2FnZ3JlZ2F0ZSA6IEVycm9yPAogICAiZmxleGlibGUgYXJyYXkgbWVtYmVyICUwIG5vdCBhbGxvd2VkIGluIG90aGVyd2lzZSBlbXB0eSAiCiAgICIlc2VsZWN0e3N0cnVjdHxpbnRlcmZhY2V8dW5pb258Y2xhc3N8ZW51bX0xIj47Ci1kZWYgZXJyX2ZsZXhpYmxlX2FycmF5X2hhc19ub25wb2RfdHlwZSA6IEVycm9yPAotICAiZmxleGlibGUgYXJyYXkgbWVtYmVyICUwIG9mIG5vbi1QT0QgZWxlbWVudCB0eXBlICUxIj47CitkZWYgZXJyX2ZsZXhpYmxlX2FycmF5X2hhc19ub250cml2aWFsX2R0b3IgOiBFcnJvcjwKKyAgImZsZXhpYmxlIGFycmF5IG1lbWJlciAlMCBvZiB0eXBlICUxIHdpdGggbm9uLXRyaXZpYWwgZGVzdHJ1Y3Rpb24iPjsKIGRlZiBleHRfZmxleGlibGVfYXJyYXlfaW5fc3RydWN0IDogRXh0ZW5zaW9uPAogICAiJTAgbWF5IG5vdCBiZSBuZXN0ZWQgaW4gYSBzdHJ1Y3QgZHVlIHRvIGZsZXhpYmxlIGFycmF5IG1lbWJlciI+LAogICBJbkdyb3VwPEZsZXhpYmxlQXJyYXlFeHRlbnNpb25zPjsKQEAgLTQyMjQsNiArNDM0Niw4IEBACiBkZWYgZXh0X3NpemVvZl9hbGlnbm9mX3ZvaWRfdHlwZSA6IEV4dGVuc2lvbjwKICAgImludmFsaWQgYXBwbGljYXRpb24gb2YgJyVzZWxlY3R7c2l6ZW9mfGFsaWdub2Z8dmVjX3N0ZXB9MCcgdG8gYSB2b2lkICIKICAgInR5cGUiPiwgSW5Hcm91cDxQb2ludGVyQXJpdGg+OworZGVmIGVycl9vcGVuY2xfc2l6ZW9mX2FsaWdub2ZfdHlwZSA6IEVycm9yPAorICAiaW52YWxpZCBhcHBsaWNhdGlvbiBvZiAnJXNlbGVjdHtzaXplb2Z8YWxpZ25vZnx2ZWNfc3RlcH0wJyB0byBhIHZvaWQgdHlwZSI+OwogZGVmIGVycl9zaXplb2ZfYWxpZ25vZl9pbmNvbXBsZXRlX3R5cGUgOiBFcnJvcjwKICAgImludmFsaWQgYXBwbGljYXRpb24gb2YgJyVzZWxlY3R7c2l6ZW9mfGFsaWdub2Z8dmVjX3N0ZXB9MCcgdG8gYW4gIgogICAiaW5jb21wbGV0ZSB0eXBlICUxIj47CkBAIC00NDM5LDYgKzQ1NjMsOSBAQAogICAiZXh0cmEgcXVhbGlmaWNhdGlvbiBvbiBtZW1iZXIgJTAiPiwgSW5Hcm91cDxNaWNyb3NvZnQ+OwogZGVmIGVycl9tZW1iZXJfZXh0cmFfcXVhbGlmaWNhdGlvbiA6IEVycm9yPAogICAiZXh0cmEgcXVhbGlmaWNhdGlvbiBvbiBtZW1iZXIgJTAiPjsKK2RlZiB3YXJuX25hbWVzcGFjZV9tZW1iZXJfZXh0cmFfcXVhbGlmaWNhdGlvbiA6IFdhcm5pbmc8CisgICJleHRyYSBxdWFsaWZpY2F0aW9uIG9uIG1lbWJlciAlMCI+LAorICBJbkdyb3VwPERpYWdHcm91cDwiZXh0cmEtcXVhbGlmaWNhdGlvbiI+PjsKIGRlZiBlcnJfbWVtYmVyX3F1YWxpZmljYXRpb24gOiBFcnJvcjwKICAgIm5vbi1mcmllbmQgY2xhc3MgbWVtYmVyICUwIGNhbm5vdCBoYXZlIGEgcXVhbGlmaWVkIG5hbWUiPjsgIAogZGVmIG5vdGVfbWVtYmVyX2RlZl9jbG9zZV9tYXRjaCA6IE5vdGU8Im1lbWJlciBkZWNsYXJhdGlvbiBuZWFybHkgbWF0Y2hlcyI+OwpAQCAtNDUwNSw4ICs0NjMyLDkgQEAKIGRlZiB3YXJuX2RlcHJlY2F0ZWRfc3RyaW5nX2xpdGVyYWxfY29udmVyc2lvbiA6IFdhcm5pbmc8CiAgICJjb252ZXJzaW9uIGZyb20gc3RyaW5nIGxpdGVyYWwgdG8gJTAgaXMgZGVwcmVjYXRlZCI+LAogICBJbkdyb3VwPENYWDExQ29tcGF0RGVwcmVjYXRlZFdyaXRhYmxlU3RyPjsKLWRlZiB3YXJuX2RlcHJlY2F0ZWRfc3RyaW5nX2xpdGVyYWxfY29udmVyc2lvbl9jIDogV2FybmluZzwKLSAgImR1bW15IHdhcm5pbmcgdG8gZW5hYmxlIC1mY29uc3Qtc3RyaW5ncyI+LCBJbkdyb3VwPERlcHJlY2F0ZWRXcml0YWJsZVN0cj4sIERlZmF1bHRJZ25vcmU7CitkZWYgZXh0X2RlcHJlY2F0ZWRfc3RyaW5nX2xpdGVyYWxfY29udmVyc2lvbiA6IEV4dFdhcm48CisgICJJU08gQysrMTEgZG9lcyBub3QgYWxsb3cgY29udmVyc2lvbiBmcm9tIHN0cmluZyBsaXRlcmFsIHRvICUwIj4sCisgIEluR3JvdXA8Q1hYMTFDb21wYXREZXByZWNhdGVkV3JpdGFibGVTdHI+LCBTRklOQUVGYWlsdXJlOwogZGVmIGVycl9yZWFsaW1hZ19pbnZhbGlkX3R5cGUgOiBFcnJvcjwiaW52YWxpZCB0eXBlICUwIHRvICUxIG9wZXJhdG9yIj47CiBkZWYgZXJyX3R5cGVjaGVja19zY2xhc3NfZnNjb3BlIDogRXJyb3I8CiAgICJpbGxlZ2FsIHN0b3JhZ2UgY2xhc3Mgb24gZmlsZS1zY29wZWQgdmFyaWFibGUiPjsKQEAgLTQ4MTIsNyArNDk0MCw3IEBACiBkZWYgZXJyX3F1YWxpZmllZF9vYmpjX2NhdGNoX3Bhcm0gOiBFcnJvcjwKICAgIkBjYXRjaCBwYXJhbWV0ZXIgZGVjbGFyYXRvciBjYW5ub3QgYmUgcXVhbGlmaWVkIj47CiBkZWYgd2Fybl9vYmpjX3BvaW50ZXJfY3h4X2NhdGNoX2ZyYWdpbGUgOiBXYXJuaW5nPAotICAiY2FuIG5vdCBjYXRjaCBhbiBleGNlcHRpb24gdGhyb3duIHdpdGggQHRocm93IGluIEMrKyBpbiB0aGUgbm9uLXVuaWZpZWQgIgorICAiY2Fubm90IGNhdGNoIGFuIGV4Y2VwdGlvbiB0aHJvd24gd2l0aCBAdGhyb3cgaW4gQysrIGluIHRoZSBub24tdW5pZmllZCAiCiAgICJleGNlcHRpb24gbW9kZWwiPiwgSW5Hcm91cDxPYmpDTm9uVW5pZmllZEV4Y2VwdGlvbj47CiBkZWYgZXJyX29iamNfb2JqZWN0X2NhdGNoIDogRXJyb3I8CiAgICJjYW4ndCBjYXRjaCBhbiBPYmplY3RpdmUtQyBvYmplY3QgYnkgdmFsdWUiPjsKQEAgLTUwMTMsNyArNTE0MSw3IEBACiAgICJleGNlcHRpb24gZGVjbGFyYXRvciBjYW5ub3QgYmUgcXVhbGlmaWVkIj47CiBkZWYgZXJyX2Vhcmx5X2NhdGNoX2FsbCA6IEVycm9yPCJjYXRjaC1hbGwgaGFuZGxlciBtdXN0IGNvbWUgbGFzdCI+OwogZGVmIGVycl9iYWRfbWVtcHRyX3JocyA6IEVycm9yPAotICAicmlnaHQgaGFuZCBvcGVyYW5kIHRvICUwIGhhcyBub24gcG9pbnRlci10by1tZW1iZXIgdHlwZSAlMSI+OworICAicmlnaHQgaGFuZCBvcGVyYW5kIHRvICUwIGhhcyBub24tcG9pbnRlci10by1tZW1iZXIgdHlwZSAlMSI+OwogZGVmIGVycl9iYWRfbWVtcHRyX2xocyA6IEVycm9yPAogICAibGVmdCBoYW5kIG9wZXJhbmQgdG8gJTAgbXVzdCBiZSBhICVzZWxlY3R7fHBvaW50ZXIgdG8gfTFjbGFzcyAiCiAgICJjb21wYXRpYmxlIHdpdGggdGhlIHJpZ2h0IGhhbmQgb3BlcmFuZCwgYnV0IGlzICUyIj47CkBAIC01MTM5LDYgKzUyNjcsOSBAQAogICAgICJpbml0aWFsaXplciBtaXNzaW5nIGZvciBsYW1iZGEgY2FwdHVyZSAlMCI+OwogICBkZWYgZXJyX2luaXRfY2FwdHVyZV9tdWx0aXBsZV9leHByZXNzaW9ucyA6IEVycm9yPAogICAgICJpbml0aWFsaXplciBmb3IgbGFtYmRhIGNhcHR1cmUgJTAgY29udGFpbnMgbXVsdGlwbGUgZXhwcmVzc2lvbnMiPjsKKyAgZGVmIGVycl9pbml0X2NhcHR1cmVfcGFyZW5fYnJhY2VzIDogRXJyb3I8CisgICAgImNhbm5vdCBkZWR1Y2UgdHlwZSBmb3IgbGFtYmRhIGNhcHR1cmUgJTAgZnJvbSAiCisgICAgInBhcmVudGhlc2l6ZWQgaW5pdGlhbGl6ZXIgbGlzdCI+OwogICBkZWYgZXJyX2luaXRfY2FwdHVyZV9kZWR1Y3Rpb25fZmFpbHVyZSA6IEVycm9yPAogICAgICJjYW5ub3QgZGVkdWNlIHR5cGUgZm9yIGxhbWJkYSBjYXB0dXJlICUwIGZyb20gaW5pdGlhbGl6ZXIgb2YgdHlwZSAlMiI+OwogICBkZWYgZXJyX2luaXRfY2FwdHVyZV9kZWR1Y3Rpb25fZmFpbHVyZV9mcm9tX2luaXRfbGlzdCA6IEVycm9yPApAQCAtNTE5OSw5ICs1MzMwLDEwIEBACiAgICJjb252ZXJzaW9uIGZ1bmN0aW9uICVkaWZme2Zyb20gJCB0byAkfGJldHdlZW4gdHlwZXN9MCwxICIKICAgImludm9rZXMgYSBkZWxldGVkIGZ1bmN0aW9uIj47CiAgIAotZGVmIGVycl9leHBlY3RlZF9jbGFzc19vcl9uYW1lc3BhY2UgOiBFcnJvcjwiZXhwZWN0ZWQgYSBjbGFzcyBvciBuYW1lc3BhY2UiPjsKLWRlZiBlcnJfZXhwZWN0ZWRfY2xhc3MgOiBFcnJvcjwiJTAgaXMgbm90IGEgY2xhc3Mlc2VsZWN0eyBvciBuYW1lc3BhY2V8LCAiCi0gICJuYW1lc3BhY2UsIG9yIHNjb3BlZCBlbnVtZXJhdGlvbn0xIj47CitkZWYgZXJyX2V4cGVjdGVkX2NsYXNzX29yX25hbWVzcGFjZSA6IEVycm9yPCIlMCBpcyBub3QgYSBjbGFzcyIKKyAgIiVzZWxlY3R7IG9yIG5hbWVzcGFjZXwsIG5hbWVzcGFjZSwgb3Igc2NvcGVkIGVudW1lcmF0aW9ufTEiPjsKK2RlZiBub3RlX2V4cGVjdGVkX2NsYXNzX29yX25hbWVzcGFjZV9kZWNsYXJlZF9oZXJlIDogTm90ZTwKKyAgIiUwIGRlY2xhcmVkIGhlcmUiPjsKIGRlZiBlcnJfaW52YWxpZF9kZWNsYXJhdG9yX3Njb3BlIDogRXJyb3I8ImNhbm5vdCBkZWZpbmUgb3IgcmVkZWNsYXJlICUwIGhlcmUgIgogICAiYmVjYXVzZSBuYW1lc3BhY2UgJTEgZG9lcyBub3QgZW5jbG9zZSBuYW1lc3BhY2UgJTIiPjsKIGRlZiBlcnJfaW52YWxpZF9kZWNsYXJhdG9yX2dsb2JhbF9zY29wZSA6IEVycm9yPApAQCAtNTU5MCw3ICs1NzIyLDEwIEBACiBkZWYgZXJyX2F0b21pY19vcF9iaXR3aXNlX25lZWRzX2F0b21pY19pbnQgOiBFcnJvcjwKICAgImFkZHJlc3MgYXJndW1lbnQgdG8gYml0d2lzZSBhdG9taWMgb3BlcmF0aW9uIG11c3QgYmUgYSBwb2ludGVyIHRvICIKICAgIiVzZWxlY3R7fGF0b21pYyB9MGludGVnZXIgKCUxIGludmFsaWQpIj47Ci0gIAorZGVmIHdhcm5fYXRvbWljX29wX2hhc19pbnZhbGlkX21lbW9yeV9vcmRlciA6IFdhcm5pbmc8CisgICJtZW1vcnkgb3JkZXIgYXJndW1lbnQgdG8gYXRvbWljIG9wZXJhdGlvbiBpcyBpbnZhbGlkIj4sCisgIEluR3JvdXA8RGlhZ0dyb3VwPCJhdG9taWMtbWVtb3J5LW9yZGVyaW5nIj4+OworCiBkZWYgZXJyX2F0b21pY19sb2FkX3N0b3JlX3VzZXNfbGliIDogRXJyb3I8CiAgICJhdG9taWMgJXNlbGVjdHtsb2FkfHN0b3JlfTAgcmVxdWlyZXMgcnVudGltZSBzdXBwb3J0IHRoYXQgaXMgbm90ICIKICAgImF2YWlsYWJsZSBmb3IgdGhpcyB0YXJnZXQiPjsKQEAgLTU2MzAsNiArNTc2NSwxMSBAQAogICAicGFzc2luZyBvYmplY3Qgb2YgdHJpdmlhbCBidXQgbm9uLVBPRCB0eXBlICUwIHRocm91Z2ggdmFyaWFkaWMiCiAgICIgJXNlbGVjdHtmdW5jdGlvbnxibG9ja3xtZXRob2R8Y29uc3RydWN0b3J9MSBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OCI+LAogICBJbkdyb3VwPENYWDk4Q29tcGF0PiwgRGVmYXVsdElnbm9yZTsKK2RlZiB3YXJuX3Bhc3NfY2xhc3NfYXJnX3RvX3ZhcmFyZyA6IFdhcm5pbmc8CisgICJwYXNzaW5nIG9iamVjdCBvZiBjbGFzcyB0eXBlICUwIHRocm91Z2ggdmFyaWFkaWMgIgorICAiJXNlbGVjdHtmdW5jdGlvbnxibG9ja3xtZXRob2R8Y29uc3RydWN0b3J9MSIKKyAgIiVzZWxlY3R7fDsgZGlkIHlvdSBtZWFuIHRvIGNhbGwgJyUzJz99MiI+LAorICBJbkdyb3VwPENsYXNzVmFyYXJncz4sIERlZmF1bHRJZ25vcmU7CiBkZWYgZXJyX2Nhbm5vdF9wYXNzX3RvX3ZhcmFyZyA6IEVycm9yPAogICAiY2Fubm90IHBhc3MgJXNlbGVjdHtleHByZXNzaW9uIG9mIHR5cGUgJTF8aW5pdGlhbGl6ZXIgbGlzdH0wIHRvIHZhcmlhZGljICIKICAgIiVzZWxlY3R7ZnVuY3Rpb258YmxvY2t8bWV0aG9kfGNvbnN0cnVjdG9yfTIiPjsKQEAgLTU3MDksMjAgKzU4NDksMTYgQEAKICAgSW5Hcm91cDxEaWFnR3JvdXA8InVudXNlZC12b2xhdGlsZS1sdmFsdWUiPj47CiAKIGRlZiB3YXJuX3VudXNlZF9jb21wYXJpc29uIDogV2FybmluZzwKLSAgIiVzZWxlY3R7ZXF1YWxpdHl8aW5lcXVhbGl0eX0wIGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZCI+LAorICAiJXNlbGVjdHslc2VsZWN0e3xpbn0xZXF1YWxpdHl8cmVsYXRpb25hbH0wIGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZCI+LAogICBJbkdyb3VwPFVudXNlZENvbXBhcmlzb24+OwogZGVmIG5vdGVfaW5lcXVhbGl0eV9jb21wYXJpc29uX3RvX29yX2Fzc2lnbiA6IE5vdGU8CiAgICJ1c2UgJ3w9JyB0byB0dXJuIHRoaXMgaW5lcXVhbGl0eSBjb21wYXJpc29uIGludG8gYW4gb3ItYXNzaWdubWVudCI+OwogCiBkZWYgZXJyX2luY29tcGxldGVfdHlwZV91c2VkX2luX3R5cGVfdHJhaXRfZXhwciA6IEVycm9yPAogICAiaW5jb21wbGV0ZSB0eXBlICUwIHVzZWQgaW4gdHlwZSB0cmFpdCBleHByZXNzaW9uIj47Ci1kZWYgZXJyX3R5cGVfdHJhaXRfYXJpdHkgOiBFcnJvcjwKLSAgInR5cGUgdHJhaXQgcmVxdWlyZXMgJTAlc2VsZWN0e3wgb3IgbW9yZX0xIGFyZ3VtZW50JXNlbGVjdHt8c30yOyBoYXZlICIKLSAgIiUzIGFyZ3VtZW50JXMzIj47CiAgIAogZGVmIGVycl9kaW1lbnNpb25fZXhwcl9ub3RfY29uc3RhbnRfaW50ZWdlciA6IEVycm9yPAogICAiZGltZW5zaW9uIGV4cHJlc3Npb24gZG9lcyBub3QgZXZhbHVhdGUgdG8gYSBjb25zdGFudCB1bnNpZ25lZCBpbnQiPjsKLWRlZiBlcnJfZXhwZWN0ZWRfaWRlbnRfb3JfbHBhcmVuIDogRXJyb3I8ImV4cGVjdGVkIGlkZW50aWZpZXIgb3IgJygnIj47CiAKIGRlZiBlcnJfdHlwZWNoZWNrX2NvbmRfaW5jb21wYXRpYmxlX29wZXJhbmRzX251bGwgOiBFcnJvcjwKICAgIm5vbi1wb2ludGVyIG9wZXJhbmQgdHlwZSAlMCBpbmNvbXBhdGlibGUgd2l0aCAlc2VsZWN0e05VTEx8bnVsbHB0cn0xIj47CkBAIC01NzgyLDYgKzU5MTgsMTIgQEAKICAgImludmFsaWQgY29udmVyc2lvbiBiZXR3ZWVuIHZlY3RvciB0eXBlICUwIGFuZCBpbnRlZ2VyIHR5cGUgJTEgIgogICAib2YgZGlmZmVyZW50IHNpemUiPjsKIAorZGVmIGVycl9vcGVuY2xfZnVuY3Rpb25fcG9pbnRlcl92YXJpYWJsZSA6IEVycm9yPAorICAicG9pbnRlcnMgdG8gZnVuY3Rpb25zIGFyZSBub3QgYWxsb3dlZCI+OworCitkZWYgZXJyX29wZW5jbF90YWtpbmdfZnVuY3Rpb25fYWRkcmVzcyA6IEVycm9yPAorICAidGFraW5nIGFkZHJlc3Mgb2YgZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQiPjsKKwogZGVmIGVycl9pbnZhbGlkX2NvbnZlcnNpb25fYmV0d2Vlbl92ZWN0b3JfYW5kX3NjYWxhciA6IEVycm9yPAogICAiaW52YWxpZCBjb252ZXJzaW9uIGJldHdlZW4gdmVjdG9yIHR5cGUgJTAgYW5kIHNjYWxhciB0eXBlICUxIj47CiAKQEAgLTU5NzQsNiArNjExNiw5IEBACiAgICIlMCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciI+OwogZGVmIGVycl9vcGVyYXRvcl9uZXdfZGVsZXRlX3RlbXBsYXRlX3Rvb19mZXdfcGFyYW1ldGVycyA6IEVycm9yPAogICAiJTAgdGVtcGxhdGUgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBwYXJhbWV0ZXJzIj47CitkZWYgd2Fybl9vcGVyYXRvcl9uZXdfcmV0dXJuc19udWxsIDogV2FybmluZzwKKyAgIiUwIHNob3VsZCBub3QgcmV0dXJuIGEgbnVsbCBwb2ludGVyIHVubGVzcyBpdCBpcyBkZWNsYXJlZCAndGhyb3coKSciCisgICIlc2VsZWN0e3wgb3IgJ25vZXhjZXB0J30xIj4sIEluR3JvdXA8T3BlcmF0b3JOZXdSZXR1cm5zTnVsbD47CiAKIGRlZiBlcnJfb3BlcmF0b3JfbmV3X2RlcGVuZGVudF9wYXJhbV90eXBlIDogRXJyb3I8CiAgICIlMCBjYW5ub3QgdGFrZSBhIGRlcGVuZGVudCB0eXBlIGFzIGZpcnN0IHBhcmFtZXRlcjsgIgpAQCAtNTk5MCw2ICs2MTM1LDggQEAKIC8vIEMrKyBsaXRlcmFsIG9wZXJhdG9ycwogZGVmIGVycl9saXRlcmFsX29wZXJhdG9yX291dHNpZGVfbmFtZXNwYWNlIDogRXJyb3I8CiAgICJsaXRlcmFsIG9wZXJhdG9yICUwIG11c3QgYmUgaW4gYSBuYW1lc3BhY2Ugb3IgZ2xvYmFsIHNjb3BlIj47CitkZWYgZXJyX2xpdGVyYWxfb3BlcmF0b3JfaWRfb3V0c2lkZV9uYW1lc3BhY2UgOiBFcnJvcjwKKyAgIm5vbi1uYW1lc3BhY2Ugc2NvcGUgJyUwJyBjYW5ub3QgaGF2ZSBhIGxpdGVyYWwgb3BlcmF0b3IgbWVtYmVyIj47CiBkZWYgZXJyX2xpdGVyYWxfb3BlcmF0b3JfZGVmYXVsdF9hcmd1bWVudCA6IEVycm9yPAogICAibGl0ZXJhbCBvcGVyYXRvciBjYW5ub3QgaGF2ZSBhIGRlZmF1bHQgYXJndW1lbnQiPjsKIC8vIEZJWE1FOiBUaGlzIGRpYWdub3N0aWMgc3Vja3MKQEAgLTYxNTAsNiArNjI5Nyw4IEBACiAgICJmb3JtYXQgc3RyaW5nIHNob3VsZCBub3QgYmUgYSB3aWRlIHN0cmluZyI+LCBJbkdyb3VwPEZvcm1hdD47CiBkZWYgd2Fybl9wcmludGZfZm9ybWF0X3N0cmluZ19jb250YWluc19udWxsX2NoYXIgOiBXYXJuaW5nPAogICAiZm9ybWF0IHN0cmluZyBjb250YWlucyAnXFwwJyB3aXRoaW4gdGhlIHN0cmluZyBib2R5Ij4sIEluR3JvdXA8Rm9ybWF0PjsKK2RlZiB3YXJuX3ByaW50Zl9mb3JtYXRfc3RyaW5nX25vdF9udWxsX3Rlcm1pbmF0ZWQgOiBXYXJuaW5nPAorICAiZm9ybWF0IHN0cmluZyBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIj4sIEluR3JvdXA8Rm9ybWF0PjsKIGRlZiB3YXJuX3ByaW50Zl9hc3Rlcmlza19taXNzaW5nX2FyZyA6IFdhcm5pbmc8CiAgICInJXNlbGVjdHsqfC4qfTAnIHNwZWNpZmllZCBmaWVsZCAlc2VsZWN0e3dpZHRofHByZWNpc2lvbn0wIGlzIG1pc3NpbmcgYSBtYXRjaGluZyAnaW50JyBhcmd1bWVudCI+LAogICBJbkdyb3VwPEZvcm1hdD47CkBAIC02MTg2LDYgKzYzMzUsOSBAQAogZGVmIHdhcm5fbnVsbF9hcmcgOiBXYXJuaW5nPAogICAibnVsbCBwYXNzZWQgdG8gYSBjYWxsZWUgd2hpY2ggcmVxdWlyZXMgYSBub24tbnVsbCBhcmd1bWVudCI+LAogICBJbkdyb3VwPE5vbk51bGw+OworZGVmIHdhcm5fbnVsbF9yZXQgOiBXYXJuaW5nPAorICAibnVsbCByZXR1cm5lZCBmcm9tICVzZWxlY3R7ZnVuY3Rpb258bWV0aG9kfTAgdGhhdCByZXF1aXJlcyBhIG5vbi1udWxsIHJldHVybiB2YWx1ZSI+LAorICBJbkdyb3VwPE5vbk51bGw+OwogCiAvLyBDSEVDSzogcmV0dXJuaW5nIGFkZHJlc3MvcmVmZXJlbmNlIG9mIHN0YWNrIG1lbW9yeQogZGVmIHdhcm5fcmV0X3N0YWNrX2FkZHIgOiBXYXJuaW5nPApAQCAtNjIzNCw3ICs2Mzg2LDcgQEAKIGRlZiB3YXJuX3N0cmluZ2NvbXBhcmUgOiBXYXJuaW5nPAogICAicmVzdWx0IG9mIGNvbXBhcmlzb24gYWdhaW5zdCAlc2VsZWN0e2Egc3RyaW5nIGxpdGVyYWx8QGVuY29kZX0wIGlzICIKICAgInVuc3BlY2lmaWVkICh1c2Ugc3RybmNtcCBpbnN0ZWFkKSI+LAotICBJbkdyb3VwPERpYWdHcm91cDwic3RyaW5nLWNvbXBhcmUiPj47CisgIEluR3JvdXA8U3RyaW5nQ29tcGFyZT47CiAKIGRlZiB3YXJuX2lkZW50aXR5X2ZpZWxkX2Fzc2lnbiA6IFdhcm5pbmc8CiAgICJhc3NpZ25pbmcgJXNlbGVjdHtmaWVsZHxpbnN0YW5jZSB2YXJpYWJsZX0wIHRvIGl0c2VsZiI+LApAQCAtNjI1Miw3ICs2NDA0LDcgQEAKICAgInRoaXMgdHlwZSB0YWcgd2FzIG5vdCBkZXNpZ25lZCB0byBiZSB1c2VkIHdpdGggdGhpcyBmdW5jdGlvbiI+LAogICBJbkdyb3VwPFR5cGVTYWZldHk+OwogZGVmIHdhcm5fdHlwZV9zYWZldHlfdHlwZV9taXNtYXRjaCA6IFdhcm5pbmc8Ci0gICJhcmd1bWVudCB0eXBlICUwIGRvZXNuJ3QgbWF0Y2ggc3BlY2lmaWVkICclMScgdHlwZSB0YWcgIgorICAiYXJndW1lbnQgdHlwZSAlMCBkb2Vzbid0IG1hdGNoIHNwZWNpZmllZCAlMSB0eXBlIHRhZyAiCiAgICIlc2VsZWN0e3RoYXQgcmVxdWlyZXMgJTN8fTIiPiwgSW5Hcm91cDxUeXBlU2FmZXR5PjsKIGRlZiB3YXJuX3R5cGVfc2FmZXR5X251bGxfcG9pbnRlcl9yZXF1aXJlZCA6IFdhcm5pbmc8CiAgICJzcGVjaWZpZWQgJTAgdHlwZSB0YWcgcmVxdWlyZXMgYSBudWxsIHBvaW50ZXIiPiwgSW5Hcm91cDxUeXBlU2FmZXR5PjsKQEAgLTYyOTksMTEgKzY0NTEsMTcgQEAKICAgIidjb250aW51ZScgc3RhdGVtZW50IG5vdCBpbiBsb29wIHN0YXRlbWVudCI+OwogZGVmIGVycl9icmVha19ub3RfaW5fbG9vcF9vcl9zd2l0Y2ggOiBFcnJvcjwKICAgIidicmVhaycgc3RhdGVtZW50IG5vdCBpbiBsb29wIG9yIHN3aXRjaCBzdGF0ZW1lbnQiPjsKK2RlZiB3YXJuX2xvb3BfY3RybF9iaW5kc190b19pbm5lciA6IFdhcm5pbmc8CisgICInJTAnIGlzIGJvdW5kIHRvIGN1cnJlbnQgbG9vcCwgR0NDIGJpbmRzIGl0IHRvIHRoZSBlbmNsb3NpbmcgbG9vcCI+LAorICBJbkdyb3VwPEdjY0NvbXBhdD47CitkZWYgd2Fybl9icmVha19iaW5kc190b19zd2l0Y2ggOiBXYXJuaW5nPAorICAiJ2JyZWFrJyBpcyBib3VuZCB0byBsb29wLCBHQ0MgYmluZHMgaXQgdG8gc3dpdGNoIj4sCisgIEluR3JvdXA8R2NjQ29tcGF0PjsKIGRlZiBlcnJfZGVmYXVsdF9ub3RfaW5fc3dpdGNoIDogRXJyb3I8CiAgICInZGVmYXVsdCcgc3RhdGVtZW50IG5vdCBpbiBzd2l0Y2ggc3RhdGVtZW50Ij47CiBkZWYgZXJyX2Nhc2Vfbm90X2luX3N3aXRjaCA6IEVycm9yPCInY2FzZScgc3RhdGVtZW50IG5vdCBpbiBzd2l0Y2ggc3RhdGVtZW50Ij47CiBkZWYgd2Fybl9ib29sX3N3aXRjaF9jb25kaXRpb24gOiBXYXJuaW5nPAotICAic3dpdGNoIGNvbmRpdGlvbiBoYXMgYm9vbGVhbiB2YWx1ZSI+OworICAic3dpdGNoIGNvbmRpdGlvbiBoYXMgYm9vbGVhbiB2YWx1ZSI+LCBJbkdyb3VwPFN3aXRjaEJvb2w+OwogZGVmIHdhcm5fY2FzZV92YWx1ZV9vdmVyZmxvdyA6IFdhcm5pbmc8CiAgICJvdmVyZmxvdyBjb252ZXJ0aW5nIGNhc2UgdmFsdWUgdG8gc3dpdGNoIGNvbmRpdGlvbiB0eXBlICglMCB0byAlMSkiPiwKICAgSW5Hcm91cDxTd2l0Y2g+OwpAQCAtNjQzNCw2ICs2NTkyLDggQEAKIGRlZiBlcnJfcmV0dXJuX2luaXRfbGlzdCA6IEVycm9yPAogICAiJXNlbGVjdHt2b2lkIGZ1bmN0aW9ufHZvaWQgbWV0aG9kfGNvbnN0cnVjdG9yfGRlc3RydWN0b3J9MSAlMCAiCiAgICJtdXN0IG5vdCByZXR1cm4gYSB2YWx1ZSI+OworZGVmIGVycl9jdG9yX2R0b3JfcmV0dXJuc192b2lkIDogRXJyb3I8CisgICIlc2VsZWN0e2NvbnN0cnVjdG9yfGRlc3RydWN0b3J9MSAlMCBtdXN0IG5vdCByZXR1cm4gdm9pZCBleHByZXNzaW9uIj47CiBkZWYgd2Fybl9ub3JldHVybl9mdW5jdGlvbl9oYXNfcmV0dXJuX2V4cHIgOiBXYXJuaW5nPAogICAiZnVuY3Rpb24gJTAgZGVjbGFyZWQgJ25vcmV0dXJuJyBzaG91bGQgbm90IHJldHVybiI+LAogICBJbkdyb3VwPEludmFsaWROb3JldHVybj47CkBAIC02NTcyLDkgKzY3MzIsNiBAQAogZGVmIGVycm9yX3Byb3RlY3RlZF9pdmFyX2FjY2VzcyA6IEVycm9yPCJpbnN0YW5jZSB2YXJpYWJsZSAlMCBpcyBwcm90ZWN0ZWQiPiwKICAgQWNjZXNzQ29udHJvbDsKIGRlZiB3YXJuX21heW5vdF9yZXNwb25kIDogV2FybmluZzwiJTAgbWF5IG5vdCByZXNwb25kIHRvICUxIj47Ci1kZWYgd2Fybl9hdHRyaWJ1dGVfbWV0aG9kX2RlZiA6IFdhcm5pbmc8Ci0gICJhdHRyaWJ1dGVzIG9uIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBhbmQgaXRzIGRlY2xhcmF0aW9uIG11c3QgbWF0Y2giPiwKLSAgSW5Hcm91cDxEaWFnR3JvdXA8Im1pc21hdGNoZWQtbWV0aG9kLWF0dHJpYnV0ZXMiPj47CiBkZWYgZXh0X3R5cGVjaGVja19iYXNlX3N1cGVyIDogV2FybmluZzwKICAgIm1ldGhvZCBwYXJhbWV0ZXIgdHlwZSAiCiAgICIlZGlmZnskIGRvZXMgbm90IG1hdGNoIHN1cGVyIGNsYXNzIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZSAkfCIKQEAgLTY2NjcsNiArNjgyNCw4IEBACiAgICJrZXJuZWwgZnVuY3Rpb25zIGNhbm5vdCBiZSBkZWNsYXJlZCBzdGF0aWMiPjsKIGRlZiBlcnJfb3BlbmNsX3B0cnB0cl9rZXJuZWxfcGFyYW0gOiBFcnJvcjwKICAgImtlcm5lbCBwYXJhbWV0ZXIgY2Fubm90IGJlIGRlY2xhcmVkIGFzIGEgcG9pbnRlciB0byBhIHBvaW50ZXIiPjsKK2RlZiBlcnJfb3BlbmNsX3ByaXZhdGVfcHRyX2tlcm5lbF9wYXJhbSA6IEVycm9yPAorICAia2VybmVsIHBhcmFtZXRlciBjYW5ub3QgYmUgZGVjbGFyZWQgYXMgYSBwb2ludGVyIHRvIHRoZSBfX3ByaXZhdGUgYWRkcmVzcyBzcGFjZSI+OwogZGVmIGVycl9zdGF0aWNfZnVuY3Rpb25fc2NvcGUgOiBFcnJvcjwKICAgInZhcmlhYmxlcyBpbiBmdW5jdGlvbiBzY29wZSBjYW5ub3QgYmUgZGVjbGFyZWQgc3RhdGljIj47CiBkZWYgZXJyX29wZW5jbF9iaXRmaWVsZHMgOiBFcnJvcjwKQEAgLTY2OTYsNiArNjg1NSwxMiBAQAogZGVmIGVycl9vcGVuY2xfZ2xvYmFsX2ludmFsaWRfYWRkcl9zcGFjZSA6IEVycm9yPAogICAiZ2xvYmFsIHZhcmlhYmxlcyBtdXN0IGhhdmUgYSBjb25zdGFudCBhZGRyZXNzIHNwYWNlIHF1YWxpZmllciI+OwogZGVmIGVycl9vcGVuY2xfbm9fbWFpbiA6IEVycm9yPCIlc2VsZWN0e2Z1bmN0aW9ufGtlcm5lbH0wIGNhbm5vdCBiZSBjYWxsZWQgJ21haW4nIj47CitkZWYgZXJyX29wZW5jbF9rZXJuZWxfYXR0ciA6CisgIEVycm9yPCJhdHRyaWJ1dGUgJTAgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIGtlcm5lbCBmdW5jdGlvbiI+OworZGVmIGVycl9vcGVuY2xfcmV0dXJuX3ZhbHVlX3dpdGhfYWRkcmVzc19zcGFjZSA6IEVycm9yPAorICAicmV0dXJuIHZhbHVlIGNhbm5vdCBiZSBxdWFsaWZpZWQgd2l0aCBhZGRyZXNzIHNwYWNlIj47CitkZWYgZXJyX29wZW5jbF9jb25zdGFudF9ub19pbml0IDogRXJyb3I8CisgICJ2YXJpYWJsZSBpbiBjb25zdGFudCBhZGRyZXNzIHNwYWNlIG11c3QgYmUgaW5pdGlhbGl6ZWQiPjsKIH0gLy8gZW5kIG9mIHNlbWEgY2F0ZWdvcnkKIAogbGV0IENhdGVnb3J5TmFtZSA9ICJPcGVuTVAgSXNzdWUiIGluIHsKQEAgLTY3MTksMjQgKzY4ODQsNDIgQEAKICAgImEgcHJpdmF0ZSB2YXJpYWJsZSB3aXRoIGluY29tcGxldGUgdHlwZSAlMCI+OwogZGVmIGVycl9vbXBfZmlyc3Rwcml2YXRlX2luY29tcGxldGVfdHlwZSA6IEVycm9yPAogICAiYSBmaXJzdHByaXZhdGUgdmFyaWFibGUgd2l0aCBpbmNvbXBsZXRlIHR5cGUgJTAiPjsKLWRlZiBlcnJfb21wX3VuZXhwZWN0ZWRfY2xhdXNlX3ZhbHVlIDogRXJyb3IgPAorZGVmIGVycl9vbXBfdW5leHBlY3RlZF9jbGF1c2VfdmFsdWUgOiBFcnJvcjwKICAgImV4cGVjdGVkICUwIGluIE9wZW5NUCBjbGF1c2UgJyUxJyI+OwotZGVmIGVycl9vbXBfZXhwZWN0ZWRfdmFyX25hbWUgOiBFcnJvciA8CitkZWYgZXJyX29tcF9leHBlY3RlZF92YXJfbmFtZSA6IEVycm9yPAogICAiZXhwZWN0ZWQgdmFyaWFibGUgbmFtZSI+OwotZGVmIGVycl9vbXBfcmVxdWlyZWRfbWV0aG9kIDogRXJyb3IgPAorZGVmIGVycl9vbXBfcmVxdWlyZWRfbWV0aG9kIDogRXJyb3I8CiAgICIlMCB2YXJpYWJsZSBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSwgdW5hbWJpZ3VvdXMgJXNlbGVjdHtkZWZhdWx0IGNvbnN0cnVjdG9yfGNvcHkgY29uc3RydWN0b3J8Y29weSBhc3NpZ25tZW50IG9wZXJhdG9yfCclMid8ZGVzdHJ1Y3Rvcn0xIj47CiBkZWYgZXJyX29tcF9jbGF1c2VfcmVmX3R5cGVfYXJnIDogRXJyb3I8CiAgICJhcmd1bWVudHMgb2YgT3Blbk1QIGNsYXVzZSAnJTAnIGNhbm5vdCBiZSBvZiByZWZlcmVuY2UgdHlwZSAlMSI+OwogZGVmIGVycl9vbXBfdGhyZWFkcHJpdmF0ZV9pbmNvbXBsZXRlX3R5cGUgOiBFcnJvcjwKICAgInRocmVhZHByaXZhdGUgdmFyaWFibGUgd2l0aCBpbmNvbXBsZXRlIHR5cGUgJTAiPjsKLWRlZiBlcnJfb21wX25vX2RzYV9mb3JfdmFyaWFibGUgOiBFcnJvciA8CitkZWYgZXJyX29tcF9ub19kc2FfZm9yX3ZhcmlhYmxlIDogRXJyb3I8CiAgICJ2YXJpYWJsZSAlMCBtdXN0IGhhdmUgZXhwbGljaXRseSBzcGVjaWZpZWQgZGF0YSBzaGFyaW5nIGF0dHJpYnV0ZXMiPjsKIGRlZiBlcnJfb21wX3dyb25nX2RzYSA6IEVycm9yPAogICAiJTAgdmFyaWFibGUgY2Fubm90IGJlICUxIj47Ci1kZWYgbm90ZV9vbXBfZXhwbGljaXRfZHNhIDogTm90ZSA8CitkZWYgbm90ZV9vbXBfZXhwbGljaXRfZHNhIDogTm90ZTwKICAgImRlZmluZWQgYXMgJTAiPjsKLWRlZiBub3RlX29tcF9wcmVkZXRlcm1pbmVkX2RzYSA6IE5vdGUgPAorZGVmIG5vdGVfb21wX3ByZWRldGVybWluZWRfZHNhIDogTm90ZTwKICAgInByZWRldGVybWluZWQgYXMgJTAiPjsKK2RlZiBlcnJfb21wX25vdF9mb3IgOiBFcnJvcjwKKyAgInN0YXRlbWVudCBhZnRlciAnI3ByYWdtYSBvbXAgJTAnIG11c3QgYmUgYSBmb3IgbG9vcCI+OworZGVmIGVycl9vbXBfbmVnYXRpdmVfZXhwcmVzc2lvbl9pbl9jbGF1c2UgOiBFcnJvcjwKKyAgImFyZ3VtZW50IHRvICclMCcgY2xhdXNlIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlIj47CitkZWYgZXJyX29tcF9ub3RfaW50ZWdyYWwgOiBFcnJvcjwKKyAgImV4cHJlc3Npb24gbXVzdCBoYXZlIGludGVncmFsIG9yIHVuc2NvcGVkIGVudW1lcmF0aW9uICIKKyAgInR5cGUsIG5vdCAlMCI+OworZGVmIGVycl9vbXBfaW5jb21wbGV0ZV90eXBlIDogRXJyb3I8CisgICJleHByZXNzaW9uIGhhcyBpbmNvbXBsZXRlIGNsYXNzIHR5cGUgJTAiPjsKK2RlZiBlcnJfb21wX2V4cGxpY2l0X2NvbnZlcnNpb24gOiBFcnJvcjwKKyAgImV4cHJlc3Npb24gcmVxdWlyZXMgZXhwbGljaXQgY29udmVyc2lvbiBmcm9tICUwIHRvICUxIj47CitkZWYgbm90ZV9vbXBfY29udmVyc2lvbl9oZXJlIDogTm90ZTwKKyAgImNvbnZlcnNpb24gdG8gJXNlbGVjdHtpbnRlZ3JhbHxlbnVtZXJhdGlvbn0wIHR5cGUgJTEgZGVjbGFyZWQgaGVyZSI+OworZGVmIGVycl9vbXBfYW1iaWd1b3VzX2NvbnZlcnNpb24gOiBFcnJvcjwKKyAgImFtYmlndW91cyBjb252ZXJzaW9uIGZyb20gdHlwZSAlMCB0byBhbiBpbnRlZ3JhbCBvciB1bnNjb3BlZCAiCisgICJlbnVtZXJhdGlvbiB0eXBlIj47CitkZWYgZXJyX29tcF9yZXF1aXJlZF9hY2Nlc3MgOiBFcnJvcjwKKyAgIiUwIHZhcmlhYmxlIG11c3QgYmUgJTEiPjsKIH0gLy8gZW5kIG9mIE9wZW5NUCBjYXRlZ29yeQogCiBsZXQgQ2F0ZWdvcnlOYW1lID0gIlJlbGF0ZWQgUmVzdWx0IFR5cGUgSXNzdWUiIGluIHsKQEAgLTY3NzgsNiArNjk2MSwxNCBAQAogICAiZGVjbGFyYXRpb24gb2YgJTAgbXVzdCBiZSBpbXBvcnRlZCBmcm9tIG1vZHVsZSAnJTEnIGJlZm9yZSBpdCBpcyByZXF1aXJlZCI+OwogZGVmIGVycl9tb2R1bGVfcHJpdmF0ZV9kZWZpbml0aW9uIDogRXJyb3I8CiAgICJkZWZpbml0aW9uIG9mICUwIG11c3QgYmUgaW1wb3J0ZWQgZnJvbSBtb2R1bGUgJyUxJyBiZWZvcmUgaXQgaXMgcmVxdWlyZWQiPjsKK2RlZiBlcnJfbW9kdWxlX2ltcG9ydF9pbl9leHRlcm5fYyA6IEVycm9yPAorICAiaW1wb3J0IG9mIEMrKyBtb2R1bGUgJyUwJyBhcHBlYXJzIHdpdGhpbiBleHRlcm4gXCJDXCIgbGFuZ3VhZ2UgbGlua2FnZSAiCisgICJzcGVjaWZpY2F0aW9uIj47CitkZWYgbm90ZV9tb2R1bGVfaW1wb3J0X2luX2V4dGVybl9jIDogTm90ZTwKKyAgImV4dGVybiBcIkNcIiBsYW5ndWFnZSBsaW5rYWdlIHNwZWNpZmljYXRpb24gYmVnaW5zIGhlcmUiPjsKK2RlZiBlcnJfbW9kdWxlX2ltcG9ydF9ub3RfYXRfdG9wX2xldmVsIDogRXJyb3I8CisgICJpbXBvcnQgb2YgbW9kdWxlICclMCcgYXBwZWFycyB3aXRoaW4gJTEiPjsKK2RlZiBub3RlX21vZHVsZV9pbXBvcnRfbm90X2F0X3RvcF9sZXZlbCA6IE5vdGU8IiUwIGJlZ2lucyBoZXJlIj47CiB9CiAKIGxldCBDYXRlZ29yeU5hbWUgPSAiRG9jdW1lbnRhdGlvbiBJc3N1ZSIgaW4gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljU2VyaWFsaXphdGlvbktpbmRzLnRkIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljU2VyaWFsaXphdGlvbktpbmRzLnRkCmluZGV4IDgxNTA5Y2MuLjU3YmEwYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY1NlcmlhbGl6YXRpb25LaW5kcy50ZAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNTZXJpYWxpemF0aW9uS2luZHMudGQKQEAgLTgsNiArOCw3IEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiBsZXQgQ29tcG9uZW50ID0gIlNlcmlhbGl6YXRpb24iIGluIHsKK2xldCBDYXRlZ29yeU5hbWUgPSAiQVNUIERlc2VyaWFsaXphdGlvbiBJc3N1ZSIgaW4gewogCiBkZWYgZXJyX2ZlX3VuYWJsZV90b19yZWFkX3BjaF9maWxlIDogRXJyb3I8CiAgICAgInVuYWJsZSB0byByZWFkIFBDSCBmaWxlICUwOiAnJTEnIj47CkBAIC0yMiw2ICsyMyw4IEBACiAgICAgRGVmYXVsdEZhdGFsOwogZGVmIGVycl9mZV9wY2hfZmlsZV9vdmVycmlkZGVuIDogRXJyb3I8CiAgICAgImZpbGUgJyUwJyBmcm9tIHRoZSBwcmVjb21waWxlZCBoZWFkZXIgaGFzIGJlZW4gb3ZlcnJpZGRlbiI+OworZGVmIG5vdGVfcGNoX3JlcXVpcmVkX2J5IDogTm90ZTwiJyUwJyByZXF1aXJlZCBieSAnJTEnIj47CitkZWYgbm90ZV9wY2hfcmVidWlsZF9yZXF1aXJlZCA6IE5vdGU8InBsZWFzZSByZWJ1aWxkIHByZWNvbXBpbGVkIGhlYWRlciAnJTAnIj47CiBkZWYgbm90ZV9tb2R1bGVfY2FjaGVfcGF0aCA6IE5vdGU8CiAgICAgImFmdGVyIG1vZGlmeWluZyBzeXN0ZW0gaGVhZGVycywgcGxlYXNlIGRlbGV0ZSB0aGUgbW9kdWxlIGNhY2hlIGF0ICclMCciPjsKIApAQCAtMzcsMTEgKzQwLDExIEBACiBkZWYgZXJyX3BjaF9sYW5nb3B0X3ZhbHVlX21pc21hdGNoIDogRXJyb3I8CiAgICIlMCBkaWZmZXJzIGluIFBDSCBmaWxlIHZzLiBjdXJyZW50IGZpbGUiPjsKICAgCi1kZWYgd2Fybl9wY2hfdmVyc2lvbl90b29fb2xkIDogRXJyb3I8CitkZWYgZXJyX3BjaF92ZXJzaW9uX3Rvb19vbGQgOiBFcnJvcjwKICAgICAiUENIIGZpbGUgdXNlcyBhbiBvbGRlciBQQ0ggZm9ybWF0IHRoYXQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCI+OwotZGVmIHdhcm5fcGNoX3ZlcnNpb25fdG9vX25ldyA6IEVycm9yPAorZGVmIGVycl9wY2hfdmVyc2lvbl90b29fbmV3IDogRXJyb3I8CiAgICAgIlBDSCBmaWxlIHVzZXMgYSBuZXdlciBQQ0ggZm9ybWF0IHRoYXQgY2Fubm90IGJlIHJlYWQiPjsKLWRlZiB3YXJuX3BjaF9kaWZmZXJlbnRfYnJhbmNoIDogRXJyb3I8CitkZWYgZXJyX3BjaF9kaWZmZXJlbnRfYnJhbmNoIDogRXJyb3I8CiAgICAgIlBDSCBmaWxlIGJ1aWx0IGZyb20gYSBkaWZmZXJlbnQgYnJhbmNoICglMCkgdGhhbiB0aGUgY29tcGlsZXIgKCUxKSI+OwogZGVmIGVycl9wY2hfd2l0aF9jb21waWxlcl9lcnJvcnMgOiBFcnJvcjwKICAgICAiUENIIGZpbGUgY29udGFpbnMgY29tcGlsZXIgZXJyb3JzIj47CkBAIC03Niw0ICs3OSw2IEBACiBkZWYgbm90ZV9tb2R1bGVfb2RyX3Zpb2xhdGlvbl9wb3NzaWJsZV9kZWNsIDogTm90ZTwKICAgImRlY2xhcmF0aW9uIG9mICUwIGRvZXMgbm90IG1hdGNoIj47CiAKLX0KK30gLy8gbGV0IENhdGVnb3J5TmFtZQorfSAvLyBsZXQgQ29tcG9uZW50CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvRmlsZU1hbmFnZXIuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvRmlsZU1hbmFnZXIuaAppbmRleCAyNTVlZWUzLi5jYzllNGU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0ZpbGVNYW5hZ2VyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9GaWxlTWFuYWdlci5oCkBAIC0xNywxNiArMTcsMTcgQEAKIAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0ZpbGVTeXN0ZW1PcHRpb25zLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ZpcnR1YWxGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KIC8vIEZJWE1FOiBFbmhhbmNlIGxpYnN5c3RlbSB0byBzdXBwb3J0IGlub2RlIGFuZCBvdGhlciBmaWVsZHMgaW4gc3RhdC4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxtYXA+CiAKICNpZmRlZiBfTVNDX1ZFUgogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBtb2RlX3Q7CkBAIC01NSwxMCArNTYsMTAgQEAKIC8vLyBcYnJpZWYgQ2FjaGVkIGluZm9ybWF0aW9uIGFib3V0IG9uZSBmaWxlIChlaXRoZXIgb24gZGlzawogLy8vIG9yIGluIHRoZSB2aXJ0dWFsIGZpbGUgc3lzdGVtKS4KIC8vLwotLy8vIElmIHRoZSAnRkQnIG1lbWJlciBpcyB2YWxpZCwgdGhlbiB0aGlzIEZpbGVFbnRyeSBoYXMgYW4gb3BlbiBmaWxlCisvLy8gSWYgdGhlICdGaWxlJyBtZW1iZXIgaXMgdmFsaWQsIHRoZW4gdGhpcyBGaWxlRW50cnkgaGFzIGFuIG9wZW4gZmlsZQogLy8vIGRlc2NyaXB0b3IgZm9yIHRoZSBmaWxlLgogY2xhc3MgRmlsZUVudHJ5IHsKLSAgY29uc3QgY2hhciAqTmFtZTsgICAgICAgICAgIC8vIE5hbWUgb2YgdGhlIGZpbGUuCisgIHN0ZDo6c3RyaW5nIE5hbWU7ICAgICAgICAgICAvLyBOYW1lIG9mIHRoZSBmaWxlLgogICBvZmZfdCBTaXplOyAgICAgICAgICAgICAgICAgLy8gRmlsZSBzaXplIGluIGJ5dGVzLgogICB0aW1lX3QgTW9kVGltZTsgICAgICAgICAgICAgLy8gTW9kaWZpY2F0aW9uIHRpbWUgb2YgZmlsZS4KICAgY29uc3QgRGlyZWN0b3J5RW50cnkgKkRpcjsgIC8vIERpcmVjdG9yeSBmaWxlIGxpdmVzIGluLgpAQCAtNjYsMzMgKzY3LDM0IEBACiAgIGxsdm06OnN5czo6ZnM6OlVuaXF1ZUlEIFVuaXF1ZUlEOwogICBib29sIElzTmFtZWRQaXBlOwogICBib29sIEluUENIOworICBib29sIElzVmFsaWQ7ICAgICAgICAgICAgICAgLy8gSXMgdGhpcyBcYyBGaWxlRW50cnkgaW5pdGlhbGl6ZWQgYW5kIHZhbGlkPwogCi0gIC8vLyBGRCAtIFRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBmaWxlIGVudHJ5IGlmIGl0IGlzIG9wZW5lZCBhbmQgb3duZWQKLSAgLy8vIGJ5IHRoZSBGaWxlRW50cnkuICBJZiBub3QsIHRoaXMgaXMgc2V0IHRvIC0xLgotICBtdXRhYmxlIGludCBGRDsKKyAgLy8vIFxicmllZiBUaGUgb3BlbiBmaWxlLCBpZiBpdCBpcyBvd25lZCBieSB0aGUgXHAgRmlsZUVudHJ5LgorICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjx2ZnM6OkZpbGU+IEZpbGU7CiAgIGZyaWVuZCBjbGFzcyBGaWxlTWFuYWdlcjsKIAorICB2b2lkIGNsb3NlRmlsZSgpIGNvbnN0IHsKKyAgICBGaWxlLnJlc2V0KDApOyAvLyByZWx5IG9uIGRlc3RydWN0b3IgdG8gY2xvc2UgRmlsZQorICB9CisKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRmlsZUVudHJ5ICYpIExMVk1fREVMRVRFRF9GVU5DVElPTjsKKwogcHVibGljOgotICBGaWxlRW50cnkobGx2bTo6c3lzOjpmczo6VW5pcXVlSUQgVW5pcXVlSUQsIGJvb2wgSXNOYW1lZFBpcGUsIGJvb2wgSW5QQ0gpCi0gICAgICA6IE5hbWUoMCksIFVuaXF1ZUlEKFVuaXF1ZUlEKSwgSXNOYW1lZFBpcGUoSXNOYW1lZFBpcGUpLCBJblBDSChJblBDSCksCi0gICAgICAgIEZEKC0xKSB7fQotICAvLyBBZGQgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciB1c2Ugd2l0aCBsbHZtOjpTdHJpbmdNYXAKICAgRmlsZUVudHJ5KCkKLSAgICAgIDogTmFtZSgwKSwgVW5pcXVlSUQoMCwgMCksIElzTmFtZWRQaXBlKGZhbHNlKSwgSW5QQ0goZmFsc2UpLCBGRCgtMSkge30KKyAgICAgIDogVW5pcXVlSUQoMCwgMCksIElzTmFtZWRQaXBlKGZhbHNlKSwgSW5QQ0goZmFsc2UpLCBJc1ZhbGlkKGZhbHNlKQorICB7fQogCi0gIEZpbGVFbnRyeShjb25zdCBGaWxlRW50cnkgJkZFKSB7Ci0gICAgbWVtY3B5KHRoaXMsICZGRSwgc2l6ZW9mKEZFKSk7Ci0gICAgYXNzZXJ0KEZEID09IC0xICYmICJDYW5ub3QgY29weSBhIGZpbGUtb3duaW5nIEZpbGVFbnRyeSIpOworICAvLyBGSVhNRTogdGhpcyBpcyBoZXJlIHRvIGFsbG93IHB1dHRpbmcgRmlsZUVudHJ5IGluIHN0ZDo6bWFwLiAgT25jZSB3ZSBoYXZlCisgIC8vIGVtcGxhY2UsIHdlIHNob3VsZG4ndCBuZWVkIGEgY29weSBjb25zdHJ1Y3RvciBhbnltb3JlLgorICAvLy8gSW50ZW50aW9uYWxseSBkb2VzIG5vdCBjb3B5IGZpZWxkcyB0aGF0IGFyZSBub3Qgc2V0IGluIGFuIHVuaW5pdGlhbGl6ZWQKKyAgLy8vIFxjIEZpbGVFbnRyeS4KKyAgRmlsZUVudHJ5KGNvbnN0IEZpbGVFbnRyeSAmRkUpIDogVW5pcXVlSUQoRkUuVW5pcXVlSUQpLAorICAgICAgSXNOYW1lZFBpcGUoRkUuSXNOYW1lZFBpcGUpLCBJblBDSChGRS5JblBDSCksIElzVmFsaWQoRkUuSXNWYWxpZCkgeworICAgIGFzc2VydCghaXNWYWxpZCgpICYmICJDYW5ub3QgY29weSBhbiBpbml0aWFsaXplZCBGaWxlRW50cnkiKTsKICAgfQogCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEZpbGVFbnRyeSAmRkUpIHsKLSAgICBtZW1jcHkodGhpcywgJkZFLCBzaXplb2YoRkUpKTsKLSAgICBhc3NlcnQoRkQgPT0gLTEgJiYgIkNhbm5vdCBhc3NpZ24gYSBmaWxlLW93bmluZyBGaWxlRW50cnkiKTsKLSAgfQotCi0gIH5GaWxlRW50cnkoKTsKLQotICBjb25zdCBjaGFyICpnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICBjb25zdCBjaGFyICpnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZS5jX3N0cigpOyB9CisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIElzVmFsaWQ7IH0KICAgb2ZmX3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KICAgdW5zaWduZWQgZ2V0VUlEKCkgY29uc3QgeyByZXR1cm4gVUlEOyB9CiAgIGNvbnN0IGxsdm06OnN5czo6ZnM6OlVuaXF1ZUlEICZnZXRVbmlxdWVJRCgpIGNvbnN0IHsgcmV0dXJuIFVuaXF1ZUlEOyB9CkBAIC0xMTksMTYgKzEyMSwxNCBAQAogLy8vIGFzIGEgc2luZ2xlIGZpbGUuCiAvLy8KIGNsYXNzIEZpbGVNYW5hZ2VyIDogcHVibGljIFJlZkNvdW50ZWRCYXNlPEZpbGVNYW5hZ2VyPiB7CisgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6OkZpbGVTeXN0ZW0+IEZTOwogICBGaWxlU3lzdGVtT3B0aW9ucyBGaWxlU3lzdGVtT3B0czsKIAotICBjbGFzcyBVbmlxdWVEaXJDb250YWluZXI7Ci0gIGNsYXNzIFVuaXF1ZUZpbGVDb250YWluZXI7Ci0KICAgLy8vIFxicmllZiBDYWNoZSBmb3IgZXhpc3RpbmcgcmVhbCBkaXJlY3Rvcmllcy4KLSAgVW5pcXVlRGlyQ29udGFpbmVyICZVbmlxdWVSZWFsRGlyczsKKyAgc3RkOjptYXA8bGx2bTo6c3lzOjpmczo6VW5pcXVlSUQsIERpcmVjdG9yeUVudHJ5PiBVbmlxdWVSZWFsRGlyczsKIAogICAvLy8gXGJyaWVmIENhY2hlIGZvciBleGlzdGluZyByZWFsIGZpbGVzLgotICBVbmlxdWVGaWxlQ29udGFpbmVyICZVbmlxdWVSZWFsRmlsZXM7CisgIHN0ZDo6bWFwPGxsdm06OnN5czo6ZnM6OlVuaXF1ZUlELCBGaWxlRW50cnk+IFVuaXF1ZVJlYWxGaWxlczsKIAogICAvLy8gXGJyaWVmIFRoZSB2aXJ0dWFsIGRpcmVjdG9yaWVzIHRoYXQgd2UgaGF2ZSBhbGxvY2F0ZWQuCiAgIC8vLwpAQCAtMTY5LDE3ICsxNjksMTggQEAKICAgdW5zaWduZWQgTnVtRGlyQ2FjaGVNaXNzZXMsIE51bUZpbGVDYWNoZU1pc3NlczsKIAogICAvLyBDYWNoaW5nLgotICBPd25pbmdQdHI8RmlsZVN5c3RlbVN0YXRDYWNoZT4gU3RhdENhY2hlOworICBzdGQ6OnVuaXF1ZV9wdHI8RmlsZVN5c3RlbVN0YXRDYWNoZT4gU3RhdENhY2hlOwogCiAgIGJvb2wgZ2V0U3RhdFZhbHVlKGNvbnN0IGNoYXIgKlBhdGgsIEZpbGVEYXRhICZEYXRhLCBib29sIGlzRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgaW50ICpGaWxlRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIHZmczo6RmlsZSAqKkYpOwogCiAgIC8vLyBBZGQgYWxsIGFuY2VzdG9ycyBvZiB0aGUgZ2l2ZW4gcGF0aCAocG9pbnRpbmcgdG8gZWl0aGVyIGEgZmlsZQogICAvLy8gb3IgYSBkaXJlY3RvcnkpIGFzIHZpcnR1YWwgZGlyZWN0b3JpZXMuCiAgIHZvaWQgYWRkQW5jZXN0b3JzQXNWaXJ0dWFsRGlycyhTdHJpbmdSZWYgUGF0aCk7CiAKIHB1YmxpYzoKLSAgRmlsZU1hbmFnZXIoY29uc3QgRmlsZVN5c3RlbU9wdGlvbnMgJkZpbGVTeXN0ZW1PcHRzKTsKKyAgRmlsZU1hbmFnZXIoY29uc3QgRmlsZVN5c3RlbU9wdGlvbnMgJkZpbGVTeXN0ZW1PcHRzLAorICAgICAgICAgICAgICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBGUyA9IDApOwogICB+RmlsZU1hbmFnZXIoKTsKIAogICAvLy8gXGJyaWVmIEluc3RhbGxzIHRoZSBwcm92aWRlZCBGaWxlU3lzdGVtU3RhdENhY2hlIG9iamVjdCB3aXRoaW4KQEAgLTIyNiw2ICsyMjcsMTAgQEAKICAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBjdXJyZW50IGZpbGUgc3lzdGVtIG9wdGlvbnMKICAgY29uc3QgRmlsZVN5c3RlbU9wdGlvbnMgJmdldEZpbGVTeXN0ZW1PcHRpb25zKCkgeyByZXR1cm4gRmlsZVN5c3RlbU9wdHM7IH0KIAorICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBnZXRWaXJ0dWFsRmlsZVN5c3RlbSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRlM7CisgIH0KKwogICAvLy8gXGJyaWVmIFJldHJpZXZlIGEgZmlsZSBlbnRyeSBmb3IgYSAidmlydHVhbCIgZmlsZSB0aGF0IGFjdHMgYXMKICAgLy8vIGlmIHRoZXJlIHdlcmUgYSBmaWxlIHdpdGggdGhlIGdpdmVuIG5hbWUgb24gZGlzay4KICAgLy8vCkBAIC0yNDUsOCArMjUwLDEwIEBACiAgIC8vLwogICAvLy8gSWYgdGhlIHBhdGggaXMgcmVsYXRpdmUsIGl0IHdpbGwgYmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgV29ya2luZ0RpciBvZiB0aGUKICAgLy8vIEZpbGVNYW5hZ2VyJ3MgRmlsZVN5c3RlbU9wdGlvbnMuCisgIC8vLworICAvLy8gXHJldHVybnMgZmFsc2Ugb24gc3VjY2VzcywgdHJ1ZSBvbiBlcnJvci4KICAgYm9vbCBnZXROb25jYWNoZWRTdGF0VmFsdWUoU3RyaW5nUmVmIFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6OmZpbGVfc3RhdHVzICZSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZnM6OlN0YXR1cyAmUmVzdWx0KTsKIAogICAvLy8gXGJyaWVmIFJlbW92ZSB0aGUgcmVhbCBmaWxlIFxwIEVudHJ5IGZyb20gdGhlIGNhY2hlLgogICB2b2lkIGludmFsaWRhdGVDYWNoZShjb25zdCBGaWxlRW50cnkgKkVudHJ5KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvRmlsZVN5c3RlbVN0YXRDYWNoZS5oIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9GaWxlU3lzdGVtU3RhdENhY2hlLmgKaW5kZXggMjNkODI1Ni4uYzRhODliMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9GaWxlU3lzdGVtU3RhdENhY2hlLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9GaWxlU3lzdGVtU3RhdENhY2hlLmgKQEAgLTE2LDE1ICsxNiwyMiBAQAogI2RlZmluZSBMTFZNX0NMQU5HX0ZJTEVTWVNURU1TVEFUQ0FDSEVfSAogCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CiAKK25hbWVzcGFjZSB2ZnMgeworY2xhc3MgRmlsZTsKK2NsYXNzIEZpbGVTeXN0ZW07Cit9CisKKy8vIEZJWE1FOiBzaG91bGQgcHJvYmFibHkgcmVwbGFjZSB0aGlzIHdpdGggdmZzOjpTdGF0dXMKIHN0cnVjdCBGaWxlRGF0YSB7CisgIHN0ZDo6c3RyaW5nIE5hbWU7CiAgIHVpbnQ2NF90IFNpemU7CiAgIHRpbWVfdCBNb2RUaW1lOwogICBsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRCBVbmlxdWVJRDsKQEAgLTM5LDggKzQ2LDggQEAKIGNsYXNzIEZpbGVTeXN0ZW1TdGF0Q2FjaGUgewogICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CiBwcm90ZWN0ZWQ6Ci0gIE93bmluZ1B0cjxGaWxlU3lzdGVtU3RhdENhY2hlPiBOZXh0U3RhdENhY2hlOwotICAKKyAgc3RkOjp1bmlxdWVfcHRyPEZpbGVTeXN0ZW1TdGF0Q2FjaGU+IE5leHRTdGF0Q2FjaGU7CisKIHB1YmxpYzoKICAgdmlydHVhbCB+RmlsZVN5c3RlbVN0YXRDYWNoZSgpIHt9CiAgIApAQCAtNTcsMTAgKzY0LDExIEBACiAgIC8vLyBJZiBpc0ZpbGUgaXMgdHJ1ZSwgdGhlbiB0aGlzIGxvb2t1cCBzaG91bGQgb25seSByZXR1cm4gc3VjY2VzcyBmb3IgZmlsZXMKICAgLy8vIChub3QgZGlyZWN0b3JpZXMpLiAgSWYgaXQgaXMgZmFsc2UgdGhpcyBsb29rdXAgc2hvdWxkIG9ubHkgcmV0dXJuCiAgIC8vLyBzdWNjZXNzIGZvciBkaXJlY3RvcmllcyAobm90IGZpbGVzKS4gIE9uIGEgc3VjY2Vzc2Z1bCBmaWxlIGxvb2t1cCwgdGhlCi0gIC8vLyBpbXBsZW1lbnRhdGlvbiBjYW4gb3B0aW9uYWxseSBmaWxsIGluIEZpbGVEZXNjcmlwdG9yIHdpdGggYSB2YWxpZAotICAvLy8gZGVzY3JpcHRvciBhbmQgdGhlIGNsaWVudCBndWFyYW50ZWVzIHRoYXQgaXQgd2lsbCBjbG9zZSBpdC4KKyAgLy8vIGltcGxlbWVudGF0aW9uIGNhbiBvcHRpb25hbGx5IGZpbGwgaW4gXHAgRiB3aXRoIGEgdmFsaWQgXHAgRmlsZSBvYmplY3QgYW5kCisgIC8vLyB0aGUgY2xpZW50IGd1YXJhbnRlZXMgdGhhdCBpdCB3aWxsIGNsb3NlIGl0LgogICBzdGF0aWMgYm9vbCBnZXQoY29uc3QgY2hhciAqUGF0aCwgRmlsZURhdGEgJkRhdGEsIGJvb2wgaXNGaWxlLAotICAgICAgICAgICAgICAgICAgaW50ICpGaWxlRGVzY3JpcHRvciwgRmlsZVN5c3RlbVN0YXRDYWNoZSAqQ2FjaGUpOworICAgICAgICAgICAgICAgICAgdmZzOjpGaWxlICoqRiwgRmlsZVN5c3RlbVN0YXRDYWNoZSAqQ2FjaGUsCisgICAgICAgICAgICAgICAgICB2ZnM6OkZpbGVTeXN0ZW0gJkZTKTsKIAogICAvLy8gXGJyaWVmIFNldHMgdGhlIG5leHQgc3RhdCBjYWxsIGNhY2hlIGluIHRoZSBjaGFpbiBvZiBzdGF0IGNhY2hlcy4KICAgLy8vIFRha2VzIG93bmVyc2hpcCBvZiB0aGUgZ2l2ZW4gc3RhdCBjYWNoZS4KQEAgLTc0LDIxICs4MiwyMCBAQAogICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBuZXh0IHN0YXQgY2FsbCBjYWNoZSBpbiB0aGUgY2hhaW4sIHRyYW5zZmVycmluZwogICAvLy8gb3duZXJzaGlwIG9mIHRoaXMgY2FjaGUgKGFuZCwgdHJhbnNpdGl2ZWx5LCBhbGwgb2YgdGhlIHJlbWFpbmluZyBjYWNoZXMpCiAgIC8vLyB0byB0aGUgY2FsbGVyLgotICBGaWxlU3lzdGVtU3RhdENhY2hlICp0YWtlTmV4dFN0YXRDYWNoZSgpIHsgcmV0dXJuIE5leHRTdGF0Q2FjaGUudGFrZSgpOyB9Ci0gIAorICBGaWxlU3lzdGVtU3RhdENhY2hlICp0YWtlTmV4dFN0YXRDYWNoZSgpIHsgcmV0dXJuIE5leHRTdGF0Q2FjaGUucmVsZWFzZSgpOyB9CisKIHByb3RlY3RlZDoKICAgdmlydHVhbCBMb29rdXBSZXN1bHQgZ2V0U3RhdChjb25zdCBjaGFyICpQYXRoLCBGaWxlRGF0YSAmRGF0YSwgYm9vbCBpc0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpGaWxlRGVzY3JpcHRvcikgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZmczo6RmlsZSAqKkYsIHZmczo6RmlsZVN5c3RlbSAmRlMpID0gMDsKIAogICBMb29rdXBSZXN1bHQgc3RhdENoYWluZWQoY29uc3QgY2hhciAqUGF0aCwgRmlsZURhdGEgJkRhdGEsIGJvb2wgaXNGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpGaWxlRGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgdmZzOjpGaWxlICoqRiwgdmZzOjpGaWxlU3lzdGVtICZGUykgewogICAgIGlmIChGaWxlU3lzdGVtU3RhdENhY2hlICpOZXh0ID0gZ2V0TmV4dFN0YXRDYWNoZSgpKQotICAgICAgcmV0dXJuIE5leHQtPmdldFN0YXQoUGF0aCwgRGF0YSwgaXNGaWxlLCBGaWxlRGVzY3JpcHRvcik7CisgICAgICByZXR1cm4gTmV4dC0+Z2V0U3RhdChQYXRoLCBEYXRhLCBpc0ZpbGUsIEYsIEZTKTsKIAogICAgIC8vIElmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIHN0YXQgY2FjaGVzIHRvIHRyeSwganVzdCBjb21wdXRlIGFuZAogICAgIC8vIHJldHVybiBpdCB3aXRob3V0IGEgY2FjaGUuCi0gICAgcmV0dXJuIGdldChQYXRoLCBEYXRhLCBpc0ZpbGUsIEZpbGVEZXNjcmlwdG9yLCAwKSA/IENhY2hlTWlzc2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDYWNoZUV4aXN0czsKKyAgICByZXR1cm4gZ2V0KFBhdGgsIERhdGEsIGlzRmlsZSwgRiwgMCwgRlMpID8gQ2FjaGVNaXNzaW5nIDogQ2FjaGVFeGlzdHM7CiAgIH0KIH07CiAKQEAgLTEwNiw4ICsxMTMsOCBAQAogICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFN0YXRDYWxscy5iZWdpbigpOyB9CiAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFN0YXRDYWxscy5lbmQoKTsgfQogCi0gIHZpcnR1YWwgTG9va3VwUmVzdWx0IGdldFN0YXQoY29uc3QgY2hhciAqUGF0aCwgRmlsZURhdGEgJkRhdGEsIGJvb2wgaXNGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqRmlsZURlc2NyaXB0b3IpOworICBMb29rdXBSZXN1bHQgZ2V0U3RhdChjb25zdCBjaGFyICpQYXRoLCBGaWxlRGF0YSAmRGF0YSwgYm9vbCBpc0ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgIHZmczo6RmlsZSAqKkYsIHZmczo6RmlsZVN5c3RlbSAmRlMpIG92ZXJyaWRlOwogfTsKIAogfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0lkZW50aWZpZXJUYWJsZS5oIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaAppbmRleCAzMDRmZjM2Li5hYmY1YjkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0lkZW50aWZpZXJUYWJsZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvSWRlbnRpZmllclRhYmxlLmgKQEAgLTY5Nyw5ICs2OTcsMTEgQEAKICAgCiAgIC8vLyBcYnJpZWYgRGVyaXZlIHRoZSBmdWxsIHNlbGVjdG9yIG5hbWUgKGUuZy4gImZvbzpiYXI6IikgYW5kIHJldHVybgogICAvLy8gaXQgYXMgYW4gc3RkOjpzdHJpbmcuCi0gIC8vIEZJWE1FOiBBZGQgYSBwcmludCBtZXRob2QgdGhhdCB1c2VzIGEgcmF3X29zdHJlYW0uCiAgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Q7CiAKKyAgLy8vIFxicmllZiBQcmludHMgdGhlIGZ1bGwgc2VsZWN0b3IgbmFtZSAoZS5nLiAiZm9vOmJhcjoiKS4KKyAgdm9pZCBwcmludChsbHZtOjpyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCiAgIC8vLyBcYnJpZWYgRGVyaXZlIHRoZSBjb252ZW50aW9uYWwgZmFtaWx5IG9mIHRoaXMgbWV0aG9kLgogICBPYmpDTWV0aG9kRmFtaWx5IGdldE1ldGhvZEZhbWlseSgpIGNvbnN0IHsKICAgICByZXR1cm4gZ2V0TWV0aG9kRmFtaWx5SW1wbCgqdGhpcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0xMVk0uaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvTExWTS5oCmluZGV4IDMwNmM3NWUuLjAxODk4ZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvTExWTS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvTExWTS5oCkBAIC0yOSw3ICsyOSw2IEBACiAgIGNsYXNzIFN0cmluZ1JlZjsKICAgY2xhc3MgVHdpbmU7CiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOwotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBPd25pbmdQdHI7CiAgIHRlbXBsYXRlPHVuc2lnbmVkIEludGVybmFsTGVuPiBjbGFzcyBTbWFsbFN0cmluZzsKICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4gY2xhc3MgU21hbGxWZWN0b3I7CiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKQEAgLTYzLDcgKzYyLDYgQEAKICAgdXNpbmcgbGx2bTo6U3RyaW5nUmVmOwogICB1c2luZyBsbHZtOjpUd2luZTsKICAgdXNpbmcgbGx2bTo6QXJyYXlSZWY7Ci0gIHVzaW5nIGxsdm06Ok93bmluZ1B0cjsKICAgdXNpbmcgbGx2bTo6U21hbGxTdHJpbmc7CiAgIHVzaW5nIGxsdm06OlNtYWxsVmVjdG9yOwogICB1c2luZyBsbHZtOjpTbWFsbFZlY3RvckltcGw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmRlZiBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuZGVmCmluZGV4IGM2YTJjNzguLjdiMjE0ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuZGVmCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuZGVmCkBAIC00MywxMiArNDMsMTIgQEAKIAogTEFOR09QVChDOTkgICAgICAgICAgICAgICAsIDEsIDAsICJDOTkiKQogTEFOR09QVChDMTEgICAgICAgICAgICAgICAsIDEsIDAsICJDMTEiKQotTEFOR09QVChNaWNyb3NvZnRFeHQgICAgICAsIDEsIDAsICJNaWNyb3NvZnQgZXh0ZW5zaW9ucyIpCi1MQU5HT1BUKE1pY3Jvc29mdE1vZGUgICAgICwgMSwgMCwgIk1pY3Jvc29mdCBjb21wYXRpYmlsaXR5IG1vZGUiKQorTEFOR09QVChNU1ZDQ29tcGF0ICAgICAgICAsIDEsIDAsICJNaWNyb3NvZnQgVmlzdWFsIEMrKyBmdWxsIGNvbXBhdGliaWxpdHkgbW9kZSIpCitMQU5HT1BUKE1pY3Jvc29mdEV4dCAgICAgICwgMSwgMCwgIk1pY3Jvc29mdCBDKysgZXh0ZW5zaW9ucyIpCiBMQU5HT1BUKEFzbUJsb2NrcyAgICAgICAgICwgMSwgMCwgIk1pY3Jvc29mdCBpbmxpbmUgYXNtIGJsb2NrcyIpCiBMQU5HT1BUKEJvcmxhbmQgICAgICAgICAgICwgMSwgMCwgIkJvcmxhbmQgZXh0ZW5zaW9ucyIpCiBMQU5HT1BUKENQbHVzUGx1cyAgICAgICAgICwgMSwgMCwgIkMrKyIpCi1MQU5HT1BUKENQbHVzUGx1czExICAgICAgICwgMSwgMCwgIkMrKzB4IikKK0xBTkdPUFQoQ1BsdXNQbHVzMTEgICAgICAgLCAxLCAwLCAiQysrMTEiKQogTEFOR09QVChDUGx1c1BsdXMxeSAgICAgICAsIDEsIDAsICJDKysxeSIpCiBMQU5HT1BUKE9iakMxICAgICAgICAgICAgICwgMSwgMCwgIk9iamVjdGl2ZS1DIDEiKQogTEFOR09QVChPYmpDMiAgICAgICAgICAgICAsIDEsIDAsICJPYmplY3RpdmUtQyAyIikKQEAgLTYxLDYgKzYxLDcgQEAKIExBTkdPUFQoVHJpZ3JhcGhzICAgICAgICAgLCAxLCAwLCJ0cmlncmFwaHMiKQogTEFOR09QVChMaW5lQ29tbWVudCAgICAgICAsIDEsIDAsICInLy8nIGNvbW1lbnRzIikKIExBTkdPUFQoQm9vbCAgICAgICAgICAgICAgLCAxLCAwLCAiYm9vbCwgdHJ1ZSwgYW5kIGZhbHNlIGtleXdvcmRzIikKK0xBTkdPUFQoSGFsZiAgICAgICAgICAgICAgLCAxLCAwLCAiaGFsZiBrZXl3b3JkIikKIExBTkdPUFQoV0NoYXIgICAgICAgICAgICAgLCAxLCBDUGx1c1BsdXMsICJ3Y2hhcl90IGtleXdvcmQiKQogQkVOSUdOX0xBTkdPUFQoRG9sbGFySWRlbnRzICAgLCAxLCAxLCAiJyQnIGluIGlkZW50aWZpZXJzIikKIEJFTklHTl9MQU5HT1BUKEFzbVByZXByb2Nlc3NvciwgMSwgMCwgInByZXByb2Nlc3NvciBpbiBhc20gbW9kZSIpCkBAIC0xMTMsNiArMTE0LDcgQEAKIEJFTklHTl9MQU5HT1BUKEFjY2Vzc0NvbnRyb2wgICAgICwgMSwgMSwgIkMrKyBhY2Nlc3MgY29udHJvbCIpCiBMQU5HT1BUKENoYXJJc1NpZ25lZCAgICAgICwgMSwgMSwgInNpZ25lZCBjaGFyIikKIExBTkdPUFQoU2hvcnRXQ2hhciAgICAgICAgLCAxLCAwLCAidW5zaWduZWQgc2hvcnQgd2NoYXJfdCIpCitFTlVNX0xBTkdPUFQoTVNQb2ludGVyVG9NZW1iZXJSZXByZXNlbnRhdGlvbk1ldGhvZCwgUHJhZ21hTVNQb2ludGVyc1RvTWVtYmVyc0tpbmQsIDIsIFBQVE1LX0Jlc3RDYXNlLCAibWVtYmVyLXBvaW50ZXIgcmVwcmVzZW50YXRpb24gbWV0aG9kIikKIAogTEFOR09QVChTaG9ydEVudW1zICAgICAgICAsIDEsIDAsICJzaG9ydCBlbnVtIHR5cGVzIikKIApAQCAtMTIxLDcgKzEyMyw3IEBACiBMQU5HT1BUKE5hdGl2ZUhhbGZUeXBlICAgICwgMSwgMCwgIk5hdGl2ZSBoYWxmIHR5cGUgc3VwcG9ydCIpCiBMQU5HT1BUKENVREEgICAgICAgICAgICAgICwgMSwgMCwgIkNVREEiKQogTEFOR09QVChPcGVuTVAgICAgICAgICAgICAsIDEsIDAsICJPcGVuTVAgc3VwcG9ydCIpCi1MQU5HT1BUKFJlbmRlcnNjcmlwdCAgICAgICwgMSwgMCwgIlJlbmRlcnNjcmlwdCIpCitMQU5HT1BUKFJlbmRlcnNjcmlwdCAgICAgICwgMSwgMCwgIlJlbmRlclNjcmlwdCIpCiAKIExBTkdPUFQoQXNzdW1lU2FuZU9wZXJhdG9yTmV3ICwgMSwgMSwgImltcGxpY2l0IF9fYXR0cmlidXRlX18oKG1hbGxvYykpIGZvciBDKysncyBuZXcgb3BlcmF0b3JzIikKIExBTkdPUFQoU2l6ZWREZWFsbG9jYXRpb24gLCAxLCAwLCAiZW5hYmxlIHNpemVkIGRlYWxsb2NhdGlvbiBmdW5jdGlvbnMiKQpAQCAtMTc2LDEwICsxNzgsMTEgQEAKICAgICAgICAgImlmIG5vbi16ZXJvLCB3YXJuIGFib3V0IHBhcmFtZXRlciBvciByZXR1cm4gV2FybiBpZiBwYXJhbWV0ZXIvcmV0dXJuIHZhbHVlIGlzIGxhcmdlciBpbiBieXRlcyB0aGFuIHRoaXMgc2V0dGluZy4gMCBpcyBubyBjaGVjay4iKQogVkFMVUVfTEFOR09QVChNU0NWZXJzaW9uLCAzMiwgMCwKICAgICAgICAgICAgICAgInZlcnNpb24gb2YgTWljcm9zb2Z0IFZpc3VhbCBDL0MrKyIpCitWQUxVRV9MQU5HT1BUKFZ0b3JEaXNwTW9kZSwgMiwgMSwgIkhvdyBtYW55IHZ0b3JkaXNwcyB0byBpbnNlcnQiKQogCiBMQU5HT1BUKEFwcGxlUHJhZ21hUGFjaywgMSwgMCwgIkFwcGxlIGdjYy1jb21wYXRpYmxlICNwcmFnbWEgcGFjayBoYW5kbGluZyIpCiAKLUJFTklHTl9MQU5HT1BUKFJldGFpbkNvbW1lbnRzRnJvbVN5c3RlbUhlYWRlcnMsIDEsIDAsICJyZXRhaW4gZG9jdW1lbnRhdGlvbiBjb21tZW50cyBmcm9tIHN5c3RlbSBoZWFkZXJzIGluIHRoZSBBU1QiKQorTEFOR09QVChSZXRhaW5Db21tZW50c0Zyb21TeXN0ZW1IZWFkZXJzLCAxLCAwLCAicmV0YWluIGRvY3VtZW50YXRpb24gY29tbWVudHMgZnJvbSBzeXN0ZW0gaGVhZGVycyBpbiB0aGUgQVNUIikKIAogI3VuZGVmIExBTkdPUFQKICN1bmRlZiBWQUxVRV9MQU5HT1BUCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmggYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmgKaW5kZXggZDRlOGI0ZS4uZTk2OTE2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaApAQCAtNTgsNyArNTgsNyBAQAogICB0eXBlZGVmIGNsYW5nOjpWaXNpYmlsaXR5IFZpc2liaWxpdHk7CiAgIAogICBlbnVtIEdDTW9kZSB7IE5vbkdDLCBHQ09ubHksIEh5YnJpZEdDIH07Ci0gIGVudW0gU3RhY2tQcm90ZWN0b3JNb2RlIHsgU1NQT2ZmLCBTU1BPbiwgU1NQUmVxIH07CisgIGVudW0gU3RhY2tQcm90ZWN0b3JNb2RlIHsgU1NQT2ZmLCBTU1BPbiwgU1NQU3Ryb25nLCBTU1BSZXEgfTsKICAgCiAgIGVudW0gU2lnbmVkT3ZlcmZsb3dCZWhhdmlvclR5IHsKICAgICBTT0JfVW5kZWZpbmVkLCAgLy8gRGVmYXVsdCBDIHN0YW5kYXJkIGJlaGF2aW9yLgpAQCAtNjYsNiArNjYsMTMgQEAKICAgICBTT0JfVHJhcHBpbmcgICAgLy8gLWZ0cmFwdgogICB9OwogCisgIGVudW0gUHJhZ21hTVNQb2ludGVyc1RvTWVtYmVyc0tpbmQgeworICAgIFBQVE1LX0Jlc3RDYXNlLAorICAgIFBQVE1LX0Z1bGxHZW5lcmFsaXR5U2luZ2xlSW5oZXJpdGFuY2UsCisgICAgUFBUTUtfRnVsbEdlbmVyYWxpdHlNdWx0aXBsZUluaGVyaXRhbmNlLAorICAgIFBQVE1LX0Z1bGxHZW5lcmFsaXR5VmlydHVhbEluaGVyaXRhbmNlCisgIH07CisKICAgZW51bSBBZGRyU3BhY2VNYXBNYW5nbGluZyB7IEFTTU1fVGFyZ2V0LCBBU01NX09uLCBBU01NX09mZiB9OwogCiBwdWJsaWM6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0xpbmthZ2UuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGlua2FnZS5oCmluZGV4IDY5OTYyMDcuLjI0N2M2ZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGlua2FnZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGlua2FnZS5oCkBAIC02Myw3ICs2Myw3IEBACiAgIEdWQV9DWFhJbmxpbmUsCiAgIEdWQV9TdHJvbmdFeHRlcm5hbCwKICAgR1ZBX1RlbXBsYXRlSW5zdGFudGlhdGlvbiwKLSAgR1ZBX0V4cGxpY2l0VGVtcGxhdGVJbnN0YW50aWF0aW9uCisgIEdWQV9TdHJvbmdPRFIKIH07CiAKIGlubGluZSBib29sIGlzRXh0ZXJuYWxseVZpc2libGUoTGlua2FnZSBMKSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL01ha2VmaWxlIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9NYWtlZmlsZQppbmRleCA2YTMzMTMzLi41NTc5YTk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL01ha2VmaWxlCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvTWFrZWZpbGUKQEAgLTYsNiArNiw3IEBACiAJRGlhZ25vc3RpY0Zyb250ZW5kS2luZHMuaW5jIERpYWdub3N0aWNMZXhLaW5kcy5pbmMgXAogCURpYWdub3N0aWNQYXJzZUtpbmRzLmluYyBEaWFnbm9zdGljU2VtYUtpbmRzLmluYyBcCiAJRGlhZ25vc3RpY1NlcmlhbGl6YXRpb25LaW5kcy5pbmMgXAorCUF0dHJIYXNBdHRyaWJ1dGVJbXBsLmluYyBcCiAJRGlhZ25vc3RpY0luZGV4TmFtZS5pbmMgRGlhZ25vc3RpY0dyb3Vwcy5pbmMgQXR0ckxpc3QuaW5jIGFybV9uZW9uLmluYyBcCiAJVmVyc2lvbi5pbmMKIApAQCAtNDgsOSArNDksMTYgQEAKIAkkKFZlcmIpICQoQ2xhbmdUYWJsZUdlbikgLWdlbi1jbGFuZy1hdHRyLWxpc3QgLW8gJChjYWxsIFNZU1BBVEgsICRAKSBcCiAJICAtSSAkKFBST0pfU1JDX0RJUikvLi4vLi4gJDwKIAorJChPYmpEaXIpL0F0dHJIYXNBdHRyaWJ1dGVJbXBsLmluYy50bXAgOiBBdHRyLnRkICQoQ0xBTkdfVEJMR0VOKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChPYmpEaXIpLy5kaXIKKwkkKEVjaG8pICJCdWlsZGluZyBDbGFuZyBfX2hhc19hdHRyaWJ1dGUgaW1wbGVtZW50YXRpb24gd2l0aCB0YmxnZW4iCisJJChWZXJiKSAkKENsYW5nVGFibGVHZW4pIC1nZW4tY2xhbmctYXR0ci1oYXMtYXR0cmlidXRlLWltcGwgLW8gJChjYWxsIFNZU1BBVEgsICRAKSBcCisJCS1JICQoUFJPSl9TUkNfRElSKS8uLi8uLi8gJDwKKwogJChPYmpEaXIpL2FybV9uZW9uLmluYy50bXAgOiBhcm1fbmVvbi50ZCAkKENMQU5HX1RCTEdFTikgJChPYmpEaXIpLy5kaXIKIAkkKEVjaG8pICJCdWlsZGluZyBDbGFuZyBhcm1fbmVvbi5pbmMgd2l0aCB0YmxnZW4iCi0JJChWZXJiKSAkKENsYW5nVGFibGVHZW4pIC1nZW4tYXJtLW5lb24tc2VtYSAtbyAkKGNhbGwgU1lTUEFUSCwgJEApICQ8CisJJChWZXJiKSAkKENsYW5nVGFibGVHZW4pIC1nZW4tYXJtLW5lb24tc2VtYSAtbyAkKGNhbGwgU1lTUEFUSCwgJEApIFwKKwkgIC1JICQoUFJPSl9TUkNfRElSKS8uLi8uLiAkPAogCiAkKE9iakRpcikvVmVyc2lvbi5pbmMudG1wIDogVmVyc2lvbi5pbmMuaW4gTWFrZWZpbGUgJChMTFZNX09CSl9ST09UKS9NYWtlZmlsZS5jb25maWcgJChPYmpEaXIpLy5kaXIKIAkkKEVjaG8pICJVcGRhdGluZyBDbGFuZyB2ZXJzaW9uIGluZm8uIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9Nb2R1bGUuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvTW9kdWxlLmgKaW5kZXggZThkNzc0ZS4uMWY3ZjcxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9Nb2R1bGUuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL01vZHVsZS5oCkBAIC04OCw3ICs4OCwxOSBAQAogICBTbWFsbFZlY3Rvcjxjb25zdCBGaWxlRW50cnkgKiwgMj4gRXhjbHVkZWRIZWFkZXJzOwogCiAgIC8vLyBcYnJpZWYgVGhlIGhlYWRlcnMgdGhhdCBhcmUgcHJpdmF0ZSB0byB0aGlzIG1vZHVsZS4KLSAgbGx2bTo6U21hbGxWZWN0b3I8Y29uc3QgRmlsZUVudHJ5ICosIDI+IFByaXZhdGVIZWFkZXJzOworICBTbWFsbFZlY3Rvcjxjb25zdCBGaWxlRW50cnkgKiwgMj4gUHJpdmF0ZUhlYWRlcnM7CisKKyAgLy8vIFxicmllZiBJbmZvcm1hdGlvbiBhYm91dCBhIGhlYWRlciBkaXJlY3RpdmUgYXMgZm91bmQgaW4gdGhlIG1vZHVsZSBtYXAKKyAgLy8vIGZpbGUuCisgIHN0cnVjdCBIZWFkZXJEaXJlY3RpdmUgeworICAgIFNvdXJjZUxvY2F0aW9uIEZpbGVOYW1lTG9jOworICAgIHN0ZDo6c3RyaW5nIEZpbGVOYW1lOworICAgIGJvb2wgSXNVbWJyZWxsYTsKKyAgfTsKKworICAvLy8gXGJyaWVmIEhlYWRlcnMgdGhhdCBhcmUgbWVudGlvbmVkIGluIHRoZSBtb2R1bGUgbWFwIGZpbGUgYnV0IGNvdWxkIG5vdCBiZQorICAvLy8gZm91bmQgb24gdGhlIGZpbGUgc3lzdGVtLgorICBTbWFsbFZlY3RvcjxIZWFkZXJEaXJlY3RpdmUsIDE+IE1pc3NpbmdIZWFkZXJzOwogCiAgIC8vLyBcYnJpZWYgQW4gaW5kaXZpZHVhbCByZXF1aXJlbWVudDogYSBmZWF0dXJlIG5hbWUgYW5kIGEgZmxhZyBpbmRpY2F0aW5nCiAgIC8vLyB0aGUgcmVxdWlyZWQgc3RhdGUgb2YgdGhhdCBmZWF0dXJlLgpAQCAtMTE2LDcgKzEyOCwxMiBAQAogICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBpcyBhICJzeXN0ZW0iIG1vZHVsZSAod2hpY2ggYXNzdW1lcyB0aGF0IGFsbAogICAvLy8gaGVhZGVycyBpbiBpdCBhcmUgc3lzdGVtIGhlYWRlcnMpLgogICB1bnNpZ25lZCBJc1N5c3RlbSA6IDE7Ci0gIAorCisgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGFuICdleHRlcm4gIkMiJyBtb2R1bGUgKHdoaWNoIGltcGxpY2l0bHkgcHV0cyBhbGwKKyAgLy8vIGhlYWRlcnMgaW4gaXQgd2l0aGluIGFuICdleHRlcm4gIkMiJyBibG9jaywgYW5kIGFsbG93cyB0aGUgbW9kdWxlIHRvIGJlCisgIC8vLyBpbXBvcnRlZCB3aXRoaW4gc3VjaCBhIGJsb2NrKS4KKyAgdW5zaWduZWQgSXNFeHRlcm5DIDogMTsKKwogICAvLy8gXGJyaWVmIFdoZXRoZXIgd2Ugc2hvdWxkIGluZmVyIHN1Ym1vZHVsZXMgZm9yIHRoaXMgbW9kdWxlIGJhc2VkIG9uIAogICAvLy8gdGhlIGhlYWRlcnMuCiAgIC8vLwpAQCAtMTQ4LDExICsxNjUsMTQgQEAKICAgICBNYWNyb3NWaXNpYmxlLAogICAgIC8vLyBcYnJpZWYgQWxsIG9mIHRoZSBuYW1lcyBpbiB0aGlzIG1vZHVsZSBhcmUgdmlzaWJsZS4KICAgICBBbGxWaXNpYmxlCi0gIH07ICAKLSAgCi0gIC8vL1wgYnJpZWYgVGhlIHZpc2liaWxpdHkgb2YgbmFtZXMgd2l0aGluIHRoaXMgcGFydGljdWxhciBtb2R1bGUuCisgIH07CisKKyAgLy8vIFxicmllZiBUaGUgdmlzaWJpbGl0eSBvZiBuYW1lcyB3aXRoaW4gdGhpcyBwYXJ0aWN1bGFyIG1vZHVsZS4KICAgTmFtZVZpc2liaWxpdHlLaW5kIE5hbWVWaXNpYmlsaXR5OwogCisgIC8vLyBcYnJpZWYgVGhlIGxvY2F0aW9uIGF0IHdoaWNoIG1hY3JvcyB3aXRoaW4gdGhpcyBtb2R1bGUgYmVjYW1lIHZpc2libGUuCisgIFNvdXJjZUxvY2F0aW9uIE1hY3JvVmlzaWJpbGl0eUxvYzsKKwogICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW5mZXJyZWQgc3VibW9kdWxlLgogICBTb3VyY2VMb2NhdGlvbiBJbmZlcnJlZFN1Ym1vZHVsZUxvYzsKIApAQCAtMjQzLDE2ICsyNjMsNiBAQAogICAvLy8gXGJyaWVmIFRoZSBsaXN0IG9mIGNvbmZsaWN0cy4KICAgc3RkOjp2ZWN0b3I8Q29uZmxpY3Q+IENvbmZsaWN0czsKIAotICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIHRvcC1sZXZlbCBtb2R1bGUuCi0gIGV4cGxpY2l0IE1vZHVsZShTdHJpbmdSZWYgTmFtZSwgU291cmNlTG9jYXRpb24gRGVmaW5pdGlvbkxvYywKLSAgICAgICAgICAgICAgICAgIGJvb2wgSXNGcmFtZXdvcmspCi0gICAgOiBOYW1lKE5hbWUpLCBEZWZpbml0aW9uTG9jKERlZmluaXRpb25Mb2MpLCBQYXJlbnQoMCksVW1icmVsbGEoKSxBU1RGaWxlKDApLAotICAgICAgSXNBdmFpbGFibGUodHJ1ZSksIElzRnJvbU1vZHVsZUZpbGUoZmFsc2UpLCBJc0ZyYW1ld29yayhJc0ZyYW1ld29yayksIAotICAgICAgSXNFeHBsaWNpdChmYWxzZSksIElzU3lzdGVtKGZhbHNlKSwKLSAgICAgIEluZmVyU3VibW9kdWxlcyhmYWxzZSksIEluZmVyRXhwbGljaXRTdWJtb2R1bGVzKGZhbHNlKSwKLSAgICAgIEluZmVyRXhwb3J0V2lsZGNhcmQoZmFsc2UpLCBDb25maWdNYWNyb3NFeGhhdXN0aXZlKGZhbHNlKSwKLSAgICAgIE5hbWVWaXNpYmlsaXR5KEhpZGRlbikgeyB9Ci0gIAogICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIG5ldyBtb2R1bGUgb3Igc3VibW9kdWxlLgogICBNb2R1bGUoU3RyaW5nUmVmIE5hbWUsIFNvdXJjZUxvY2F0aW9uIERlZmluaXRpb25Mb2MsIE1vZHVsZSAqUGFyZW50LCAKICAgICAgICAgIGJvb2wgSXNGcmFtZXdvcmssIGJvb2wgSXNFeHBsaWNpdCk7CkBAIC0yNzYsNyArMjg2LDggQEAKICAgLy8vIHRoaXMgbW9kdWxlLgogICBib29sIGlzQXZhaWxhYmxlKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywgCiAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50ICZSZXEpIGNvbnN0OworICAgICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50ICZSZXEsCisgICAgICAgICAgICAgICAgICAgSGVhZGVyRGlyZWN0aXZlICZNaXNzaW5nSGVhZGVyKSBjb25zdDsKIAogICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgbW9kdWxlIGlzIGEgc3VibW9kdWxlLgogICBib29sIGlzU3ViTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gUGFyZW50ICE9IDA7IH0KQEAgLTMzMCw3ICszNDEsOCBAQAogCiAgIC8vLyBcYnJpZWYgU2V0IHRoZSBzZXJpYWxpemVkIEFTVCBmaWxlIGZvciB0aGUgdG9wLWxldmVsIG1vZHVsZSBvZiB0aGlzIG1vZHVsZS4KICAgdm9pZCBzZXRBU1RGaWxlKGNvbnN0IEZpbGVFbnRyeSAqRmlsZSkgewotICAgIGFzc2VydCgoZ2V0QVNURmlsZSgpID09IDAgfHwgZ2V0QVNURmlsZSgpID09IEZpbGUpICYmICJmaWxlIHBhdGggY2hhbmdlZCIpOworICAgIGFzc2VydCgoRmlsZSA9PSAwIHx8IGdldEFTVEZpbGUoKSA9PSAwIHx8IGdldEFTVEZpbGUoKSA9PSBGaWxlKSAmJgorICAgICAgICAgICAiZmlsZSBwYXRoIGNoYW5nZWQiKTsKICAgICBnZXRUb3BMZXZlbE1vZHVsZSgpLT5BU1RGaWxlID0gRmlsZTsKICAgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL09iakNSdW50aW1lLmggYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL09iakNSdW50aW1lLmgKaW5kZXggNGM2NDQ5Ny4uZmEzNzVmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9PYmpDUnVudGltZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvT2JqQ1J1bnRpbWUuaApAQCAtOTksNiArOTksMTEgQEAKICAgICAgICAgICBBcmNoID09IGxsdm06OlRyaXBsZTo6eDg2XzY0KQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIGVsc2UgaWYgKChnZXRLaW5kKCkgPT0gIE1hY09TWCkgJiYgaXNOb25GcmFnaWxlKCkgJiYKKyAgICAgICAgICAgICAoZ2V0VmVyc2lvbigpID49IFZlcnNpb25UdXBsZSgxMCwgMCkpICYmCisgICAgICAgICAgICAgKGdldFZlcnNpb24oKSA8IFZlcnNpb25UdXBsZSgxMCwgNikpKQorICAgICAgICByZXR1cm4gQXJjaCAhPSBsbHZtOjpUcmlwbGU6Ong4Nl82NDsKKyAgICAvLyBFeGNlcHQgZm9yIGRlcGxveW1lbnQgdGFyZ2V0IG9mIDEwLjUgb3IgbGVzcywKICAgICAvLyBNYWMgcnVudGltZXMgdXNlIGxlZ2FjeSBkaXNwYXRjaCBldmVyeXdoZXJlIG5vdy4KICAgICByZXR1cm4gdHJ1ZTsKICAgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9PbkRpc2tIYXNoVGFibGUuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvT25EaXNrSGFzaFRhYmxlLmgKaW5kZXggZWUzMDEyMy4uOGMyY2Q4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9PbkRpc2tIYXNoVGFibGUuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL09uRGlza0hhc2hUYWJsZS5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhblN0cmVhbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Ib3N0LmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKQEAgLTI5LDg0ICszMCwxMSBAQAogCiB0eXBlZGVmIHVpbnQzMl90IE9mZnNldDsKIAotaW5saW5lIHZvaWQgRW1pdDgocmF3X29zdHJlYW0mIE91dCwgdWludDMyX3QgVikgewotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYpOwotfQotCi1pbmxpbmUgdm9pZCBFbWl0MTYocmF3X29zdHJlYW0mIE91dCwgdWludDMyX3QgVikgewotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gIDgpOwotICBhc3NlcnQoKFYgPj4gMTYpID09IDApOwotfQotCi1pbmxpbmUgdm9pZCBFbWl0MjQocmF3X29zdHJlYW0mIE91dCwgdWludDMyX3QgVikgewotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gIDgpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gMTYpOwotICBhc3NlcnQoKFYgPj4gMjQpID09IDApOwotfQotCi1pbmxpbmUgdm9pZCBFbWl0MzIocmF3X29zdHJlYW0mIE91dCwgdWludDMyX3QgVikgewotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gIDgpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gMTYpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gMjQpOwotfQotCi1pbmxpbmUgdm9pZCBFbWl0NjQocmF3X29zdHJlYW0mIE91dCwgdWludDY0X3QgVikgewotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gIDgpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gMTYpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gMjQpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gMzIpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gNDApOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gNDgpOwotICBPdXQgPDwgKHVuc2lnbmVkIGNoYXIpKFYgPj4gNTYpOwotfQotCiBpbmxpbmUgdm9pZCBQYWQocmF3X29zdHJlYW0mIE91dCwgdW5zaWduZWQgQSkgeworICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKICAgT2Zmc2V0IG9mZiA9IChPZmZzZXQpIE91dC50ZWxsKCk7CiAgIGZvciAodWludDMyX3QgbiA9IGxsdm06Ok9mZnNldFRvQWxpZ25tZW50KG9mZiwgQSk7IG47IC0tbikKLSAgICBFbWl0OChPdXQsIDApOwotfQotCi1pbmxpbmUgdWludDE2X3QgUmVhZFVuYWxpZ25lZExFMTYoY29uc3QgdW5zaWduZWQgY2hhciAqJkRhdGEpIHsKLSAgdWludDE2X3QgViA9ICgodWludDE2X3QpRGF0YVswXSkgfAotICAgICAgICAgICAgICAgKCh1aW50MTZfdClEYXRhWzFdIDw8ICA4KTsKLSAgRGF0YSArPSAyOwotICByZXR1cm4gVjsKLX0KLQotaW5saW5lIHVpbnQzMl90IFJlYWRVbmFsaWduZWRMRTMyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiZEYXRhKSB7Ci0gIHVpbnQzMl90IFYgPSAoKHVpbnQzMl90KURhdGFbMF0pICB8Ci0gICAgICAgICAgICAgICAoKHVpbnQzMl90KURhdGFbMV0gPDwgOCkgIHwKLSAgICAgICAgICAgICAgICgodWludDMyX3QpRGF0YVsyXSA8PCAxNikgfAotICAgICAgICAgICAgICAgKCh1aW50MzJfdClEYXRhWzNdIDw8IDI0KTsKLSAgRGF0YSArPSA0OwotICByZXR1cm4gVjsKLX0KLQotaW5saW5lIHVpbnQ2NF90IFJlYWRVbmFsaWduZWRMRTY0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKiZEYXRhKSB7Ci0gIHVpbnQ2NF90IFYgPSAoKHVpbnQ2NF90KURhdGFbMF0pICB8Ci0gICAgKCh1aW50NjRfdClEYXRhWzFdIDw8IDgpICB8Ci0gICAgKCh1aW50NjRfdClEYXRhWzJdIDw8IDE2KSB8Ci0gICAgKCh1aW50NjRfdClEYXRhWzNdIDw8IDI0KSB8Ci0gICAgKCh1aW50NjRfdClEYXRhWzRdIDw8IDMyKSB8Ci0gICAgKCh1aW50NjRfdClEYXRhWzVdIDw8IDQwKSB8Ci0gICAgKCh1aW50NjRfdClEYXRhWzZdIDw8IDQ4KSB8Ci0gICAgKCh1aW50NjRfdClEYXRhWzddIDw8IDU2KTsKLSAgRGF0YSArPSA4OwotICByZXR1cm4gVjsKLX0KLQotaW5saW5lIHVpbnQzMl90IFJlYWRMRTMyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiZEYXRhKSB7Ci0gIC8vIEhvc3RzIHRoYXQgZGlyZWN0bHkgc3VwcG9ydCBsaXR0bGUtZW5kaWFuIDMyLWJpdCBsb2FkcyBjYW4ganVzdAotICAvLyB1c2UgdGhlbS4gIEJpZy1lbmRpYW4gaG9zdHMgbmVlZCBhIGJzd2FwLgotICB1aW50MzJfdCBWID0gKigoY29uc3QgdWludDMyX3QqKURhdGEpOwotICBpZiAobGx2bTo6c3lzOjpJc0JpZ0VuZGlhbkhvc3QpCi0gICAgViA9IGxsdm06OkJ5dGVTd2FwXzMyKFYpOwotICBEYXRhICs9IDQ7Ci0gIHJldHVybiBWOworICAgIGVuZGlhbjo6V3JpdGVyPGxpdHRsZT4oT3V0KS53cml0ZTx1aW50OF90PigwKTsKIH0KIAogfSAvLyBlbmQgbmFtZXNwYWNlIGlvCkBAIC0xODgsNyArMTE2LDggQEAKICAgfQogCiAgIGlvOjpPZmZzZXQgRW1pdChyYXdfb3N0cmVhbSAmb3V0LCBJbmZvICZJbmZvT2JqKSB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIGNsYW5nOjppbzsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+IExFKG91dCk7CiAKICAgICAvLyBFbWl0IHRoZSBwYXlsb2FkIG9mIHRoZSB0YWJsZS4KICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtQnVja2V0czsgKytpKSB7CkBAIC0yMDAsMTIgKzEyOSwxMiBAQAogICAgICAgYXNzZXJ0KEIub2ZmICYmICJDYW5ub3Qgd3JpdGUgYSBidWNrZXQgYXQgb2Zmc2V0IDAuIFBsZWFzZSBhZGQgcGFkZGluZy4iKTsKIAogICAgICAgLy8gV3JpdGUgb3V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGJ1Y2tldC4KLSAgICAgIEVtaXQxNihvdXQsIEIubGVuZ3RoKTsKKyAgICAgIExFLndyaXRlPHVpbnQxNl90PihCLmxlbmd0aCk7CiAgICAgICBhc3NlcnQoQi5sZW5ndGggIT0gMCAgJiYgIkJ1Y2tldCBoYXMgYSBoZWFkIGJ1dCB6ZXJvIGxlbmd0aD8iKTsKIAogICAgICAgLy8gV3JpdGUgb3V0IHRoZSBlbnRyaWVzIGluIHRoZSBidWNrZXQuCiAgICAgICBmb3IgKEl0ZW0gKkkgPSBCLmhlYWQ7IEkgOyBJID0gSS0+bmV4dCkgewotICAgICAgICBFbWl0MzIob3V0LCBJLT5oYXNoKTsKKyAgICAgICAgTEUud3JpdGU8dWludDMyX3Q+KEktPmhhc2gpOwogICAgICAgICBjb25zdCBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiYgTGVuID0KICAgICAgICAgICBJbmZvT2JqLkVtaXRLZXlEYXRhTGVuZ3RoKG91dCwgSS0+a2V5LCBJLT5kYXRhKTsKICAgICAgICAgSW5mb09iai5FbWl0S2V5KG91dCwgSS0+a2V5LCBMZW4uZmlyc3QpOwpAQCAtMjE0LDExICsxNDMsMTIgQEAKICAgICB9CiAKICAgICAvLyBFbWl0IHRoZSBoYXNodGFibGUgaXRzZWxmLgotICAgIFBhZChvdXQsIDQpOworICAgIGlvOjpQYWQob3V0LCA0KTsKICAgICBpbzo6T2Zmc2V0IFRhYmxlT2ZmID0gb3V0LnRlbGwoKTsKLSAgICBFbWl0MzIob3V0LCBOdW1CdWNrZXRzKTsKLSAgICBFbWl0MzIob3V0LCBOdW1FbnRyaWVzKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtQnVja2V0czsgKytpKSBFbWl0MzIob3V0LCBCdWNrZXRzW2ldLm9mZik7CisgICAgTEUud3JpdGU8dWludDMyX3Q+KE51bUJ1Y2tldHMpOworICAgIExFLndyaXRlPHVpbnQzMl90PihOdW1FbnRyaWVzKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtQnVja2V0czsgKytpKQorICAgICAgTEUud3JpdGU8dWludDMyX3Q+KEJ1Y2tldHNbaV0ub2ZmKTsKIAogICAgIHJldHVybiBUYWJsZU9mZjsKICAgfQpAQCAtMjg2LDcgKzIxNiw3IEBACiAgICAgaWYgKCFJbmZvUHRyKQogICAgICAgSW5mb1B0ciA9ICZJbmZvT2JqOwogCi0gICAgdXNpbmcgbmFtZXNwYWNlIGlvOworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OwogICAgIGNvbnN0IGludGVybmFsX2tleV90eXBlJiBpS2V5ID0gSW5mb09iai5HZXRJbnRlcm5hbEtleShlS2V5KTsKICAgICB1bnNpZ25lZCBrZXlfaGFzaCA9IEluZm9PYmouQ29tcHV0ZUhhc2goaUtleSk7CiAKQEAgLTI5NCwxNyArMjI0LDE3IEBACiAgICAgdW5zaWduZWQgaWR4ID0ga2V5X2hhc2ggJiAoTnVtQnVja2V0cyAtIDEpOwogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIEJ1Y2tldCA9IEJ1Y2tldHMgKyBzaXplb2YodWludDMyX3QpKmlkeDsKIAotICAgIHVuc2lnbmVkIG9mZnNldCA9IFJlYWRMRTMyKEJ1Y2tldCk7CisgICAgdW5zaWduZWQgb2Zmc2V0ID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPihCdWNrZXQpOwogICAgIGlmIChvZmZzZXQgPT0gMCkgcmV0dXJuIGl0ZXJhdG9yKCk7IC8vIEVtcHR5IGJ1Y2tldC4KICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBJdGVtcyA9IEJhc2UgKyBvZmZzZXQ7CiAKICAgICAvLyAnSXRlbXMnIHN0YXJ0cyB3aXRoIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZQogICAgIC8vIG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIGJ1Y2tldC4KLSAgICB1bnNpZ25lZCBsZW4gPSBSZWFkVW5hbGlnbmVkTEUxNihJdGVtcyk7CisgICAgdW5zaWduZWQgbGVuID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KEl0ZW1zKTsKIAogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICAgLy8gUmVhZCB0aGUgaGFzaC4KLSAgICAgIHVpbnQzMl90IGl0ZW1faGFzaCA9IFJlYWRVbmFsaWduZWRMRTMyKEl0ZW1zKTsKKyAgICAgIHVpbnQzMl90IGl0ZW1faGFzaCA9IGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPihJdGVtcyk7CiAKICAgICAgIC8vIERldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgYW5kIHRoZSBkYXRhLgogICAgICAgY29uc3Qgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4mIEwgPSBJbmZvOjpSZWFkS2V5RGF0YUxlbmd0aChJdGVtcyk7CkBAIC0zNTksMTAgKzI4OSwxMiBAQAogICAgIH0KIAogICAgIGtleV9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgIC8vIFByZWluY3JlbWVudAorICAgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CiAgICAgICBpZiAoIU51bUl0ZW1zSW5CdWNrZXRMZWZ0KSB7CiAgICAgICAgIC8vICdJdGVtcycgc3RhcnRzIHdpdGggYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgIC8vIG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIGJ1Y2tldC4KLSAgICAgICAgTnVtSXRlbXNJbkJ1Y2tldExlZnQgPSBpbzo6UmVhZFVuYWxpZ25lZExFMTYoUHRyKTsKKyAgICAgICAgTnVtSXRlbXNJbkJ1Y2tldExlZnQgPQorICAgICAgICAgICAgZW5kaWFuOjpyZWFkTmV4dDx1aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KFB0cik7CiAgICAgICB9CiAgICAgICBQdHIgKz0gNDsgLy8gU2tpcCB0aGUgaGFzaC4KICAgICAgIC8vIERldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgYW5kIHRoZSBkYXRhLgpAQCAtNDIzLDEwICszNTUsMTIgQEAKICAgICB9CiAKICAgICBkYXRhX2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgLy8gUHJlaW5jcmVtZW50CisgICAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKICAgICAgIGlmICghTnVtSXRlbXNJbkJ1Y2tldExlZnQpIHsKICAgICAgICAgLy8gJ0l0ZW1zJyBzdGFydHMgd2l0aCBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgLy8gbnVtYmVyIG9mIGl0ZW1zIGluIHRoaXMgYnVja2V0LgotICAgICAgICBOdW1JdGVtc0luQnVja2V0TGVmdCA9IGlvOjpSZWFkVW5hbGlnbmVkTEUxNihQdHIpOworICAgICAgICBOdW1JdGVtc0luQnVja2V0TGVmdCA9CisgICAgICAgICAgICBlbmRpYW46OnJlYWROZXh0PHVpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oUHRyKTsKICAgICAgIH0KICAgICAgIFB0ciArPSA0OyAvLyBTa2lwIHRoZSBoYXNoLgogICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIGtleSBhbmQgdGhlIGRhdGEuCkBAIC00NjgsMTMgKzQwMiwxMyBAQAogICBzdGF0aWMgT25EaXNrQ2hhaW5lZEhhc2hUYWJsZSogQ3JlYXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ1Y2tldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogY29uc3QgYmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmZvICZJbmZvT2JqID0gSW5mbygpKSB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIGlvOworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OwogICAgIGFzc2VydChidWNrZXRzID4gYmFzZSk7CiAgICAgYXNzZXJ0KChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oYnVja2V0cykgJiAweDMpID09IDAgJiYKICAgICAgICAgICAgImJ1Y2tldHMgc2hvdWxkIGJlIDQtYnl0ZSBhbGlnbmVkLiIpOwogCi0gICAgdW5zaWduZWQgbnVtQnVja2V0cyA9IFJlYWRMRTMyKGJ1Y2tldHMpOwotICAgIHVuc2lnbmVkIG51bUVudHJpZXMgPSBSZWFkTEUzMihidWNrZXRzKTsKKyAgICB1bnNpZ25lZCBudW1CdWNrZXRzID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPihidWNrZXRzKTsKKyAgICB1bnNpZ25lZCBudW1FbnRyaWVzID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPihidWNrZXRzKTsKICAgICByZXR1cm4gbmV3IE9uRGlza0NoYWluZWRIYXNoVGFibGU8SW5mbz4obnVtQnVja2V0cywgbnVtRW50cmllcywgYnVja2V0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwgSW5mb09iaik7CiAgIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvT3BlbkNMLmggYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL09wZW5DTC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjNmMjU5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvT3BlbkNMLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLz09PS0tLSBPcGVuQ0wuaCAtIE9wZW5DTCBlbnVtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8vCi0vLy8gXGZpbGUKLS8vLyBcYnJpZWYgRGVmaW5lcyBzb21lIE9wZW5DTC1zcGVjaWZpYyBlbnVtcy4KLS8vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX09QRU5DTF9ICi0jZGVmaW5lIExMVk1fQ0xBTkdfQkFTSUNfT1BFTkNMX0gKLQotbmFtZXNwYWNlIGNsYW5nIHsKLQotLy8vIFxicmllZiBOYW1lcyBmb3IgdGhlIE9wZW5DTCBpbWFnZSBhY2Nlc3MgcXVhbGlmaWVycyAoT3BlbkNMIDEuMSA2LjYpLgotZW51bSBPcGVuQ0xJbWFnZUFjY2VzcyB7Ci0gIENMSUFfcmVhZF9vbmx5ID0gMSwKLSAgQ0xJQV93cml0ZV9vbmx5ID0gMiwKLSAgQ0xJQV9yZWFkX3dyaXRlID0gMwotfTsKLQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuZGVmIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5kZWYKaW5kZXggNmQxYTdiMi4uMzQ4ZjQwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5kZWYKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9PcGVuTVBLaW5kcy5kZWYKQEAgLTIxLDYgKzIxLDkgQEAKICNpZm5kZWYgT1BFTk1QX1BBUkFMTEVMX0NMQVVTRQogIyAgZGVmaW5lIE9QRU5NUF9QQVJBTExFTF9DTEFVU0UoTmFtZSkKICNlbmRpZgorI2lmbmRlZiBPUEVOTVBfU0lNRF9DTEFVU0UKKyMgIGRlZmluZSBPUEVOTVBfU0lNRF9DTEFVU0UoTmFtZSkKKyNlbmRpZgogI2lmbmRlZiBPUEVOTVBfREVGQVVMVF9LSU5ECiAjICBkZWZpbmUgT1BFTk1QX0RFRkFVTFRfS0lORChOYW1lKQogI2VuZGlmCkBAIC0yOSwxOCArMzIsMzAgQEAKIE9QRU5NUF9ESVJFQ1RJVkUodGhyZWFkcHJpdmF0ZSkKIE9QRU5NUF9ESVJFQ1RJVkUocGFyYWxsZWwpCiBPUEVOTVBfRElSRUNUSVZFKHRhc2spCitPUEVOTVBfRElSRUNUSVZFKHNpbWQpCiAKIC8vIE9wZW5NUCBjbGF1c2VzLgorT1BFTk1QX0NMQVVTRShpZiwgT01QSWZDbGF1c2UpCitPUEVOTVBfQ0xBVVNFKG51bV90aHJlYWRzLCBPTVBOdW1UaHJlYWRzQ2xhdXNlKQorT1BFTk1QX0NMQVVTRShzYWZlbGVuLCBPTVBTYWZlbGVuQ2xhdXNlKQogT1BFTk1QX0NMQVVTRShkZWZhdWx0LCBPTVBEZWZhdWx0Q2xhdXNlKQogT1BFTk1QX0NMQVVTRShwcml2YXRlLCBPTVBQcml2YXRlQ2xhdXNlKQogT1BFTk1QX0NMQVVTRShmaXJzdHByaXZhdGUsIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSkKIE9QRU5NUF9DTEFVU0Uoc2hhcmVkLCAgT01QU2hhcmVkQ2xhdXNlKQorT1BFTk1QX0NMQVVTRShjb3B5aW4sICBPTVBDb3B5aW5DbGF1c2UpCiAKLS8vIENsYXVzZXMgYWxsb3dlZCBmb3IgT3Blbk1QIGRpcmVjdGl2ZXMuCisvLyBDbGF1c2VzIGFsbG93ZWQgZm9yIE9wZW5NUCBkaXJlY3RpdmUgJ3BhcmFsbGVsJy4KK09QRU5NUF9QQVJBTExFTF9DTEFVU0UoaWYpCitPUEVOTVBfUEFSQUxMRUxfQ0xBVVNFKG51bV90aHJlYWRzKQogT1BFTk1QX1BBUkFMTEVMX0NMQVVTRShkZWZhdWx0KQogT1BFTk1QX1BBUkFMTEVMX0NMQVVTRShwcml2YXRlKQogT1BFTk1QX1BBUkFMTEVMX0NMQVVTRShmaXJzdHByaXZhdGUpCiBPUEVOTVBfUEFSQUxMRUxfQ0xBVVNFKHNoYXJlZCkKK09QRU5NUF9QQVJBTExFTF9DTEFVU0UoY29weWluKQorCisvLyBGSVhNRTogbW9yZSBjbGF1c2VzIGFsbG93ZWQgZm9yIGRpcmVjdGl2ZSAnb21wIHNpbWQnLgorT1BFTk1QX1NJTURfQ0xBVVNFKHByaXZhdGUpCitPUEVOTVBfU0lNRF9DTEFVU0Uoc2FmZWxlbikKIAogLy8gU3RhdGljIGF0dHJpYnV0ZXMgZm9yICdkZWZhdWx0JyBjbGF1c2UuCiBPUEVOTVBfREVGQVVMVF9LSU5EKG5vbmUpCkBAIC01MCwzICs2NSw1IEBACiAjdW5kZWYgT1BFTk1QX0RJUkVDVElWRQogI3VuZGVmIE9QRU5NUF9DTEFVU0UKICN1bmRlZiBPUEVOTVBfUEFSQUxMRUxfQ0xBVVNFCisjdW5kZWYgT1BFTk1QX1NJTURfQ0xBVVNFCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvUGFydGlhbERpYWdub3N0aWMuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvUGFydGlhbERpYWdub3N0aWMuaAppbmRleCBkZDI5OTI2Li4zMTRiOWVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1BhcnRpYWxEaWFnbm9zdGljLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9QYXJ0aWFsRGlhZ25vc3RpYy5oCkBAIC0yMDEsMTMgKzIwMSwxMSBAQAogICAgIH0KICAgfQogCi0jaWYgTExWTV9IQVNfUlZBTFVFX1JFRkVSRU5DRVMKICAgUGFydGlhbERpYWdub3N0aWMoUGFydGlhbERpYWdub3N0aWMgJiZPdGhlcikKICAgICA6IERpYWdJRChPdGhlci5EaWFnSUQpLCBEaWFnU3RvcmFnZShPdGhlci5EaWFnU3RvcmFnZSksCiAgICAgICBBbGxvY2F0b3IoT3RoZXIuQWxsb2NhdG9yKSB7CiAgICAgT3RoZXIuRGlhZ1N0b3JhZ2UgPSAwOwogICB9Ci0jZW5kaWYKIAogICBQYXJ0aWFsRGlhZ25vc3RpYyhjb25zdCBQYXJ0aWFsRGlhZ25vc3RpYyAmT3RoZXIsIFN0b3JhZ2UgKkRpYWdTdG9yYWdlKQogICAgIDogRGlhZ0lEKE90aGVyLkRpYWdJRCksIERpYWdTdG9yYWdlKERpYWdTdG9yYWdlKSwKQEAgLTI1MSw3ICsyNDksNiBAQAogICAgIHJldHVybiAqdGhpczsKICAgfQogCi0jaWYgTExWTV9IQVNfUlZBTFVFX1JFRkVSRU5DRVMKICAgUGFydGlhbERpYWdub3N0aWMgJm9wZXJhdG9yPShQYXJ0aWFsRGlhZ25vc3RpYyAmJk90aGVyKSB7CiAgICAgZnJlZVN0b3JhZ2UoKTsKIApAQCAtMjYyLDcgKzI1OSw2IEBACiAgICAgT3RoZXIuRGlhZ1N0b3JhZ2UgPSAwOwogICAgIHJldHVybiAqdGhpczsKICAgfQotI2VuZGlmCiAKICAgflBhcnRpYWxEaWFnbm9zdGljKCkgewogICAgIGZyZWVTdG9yYWdlKCk7CkBAIC0zODAsOCArMzc2LDggQEAKICAgLy8gbWF0Y2guCiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgIGZyaWVuZCBpbmxpbmUKLSAgdHlwZW5hbWUgbGx2bTo6ZW5hYmxlX2lmPGxsdm06OmlzX3NhbWU8VCwgRGVjbENvbnRleHQ+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFydGlhbERpYWdub3N0aWMgJj46OnR5cGUKKyAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPFQsIERlY2xDb250ZXh0Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnRpYWxEaWFnbm9zdGljICY+Ojp0eXBlCiAgIG9wZXJhdG9yPDwoY29uc3QgUGFydGlhbERpYWdub3N0aWMgJlBELCBUICpEQykgewogICAgIFBELkFkZFRhZ2dlZFZhbChyZWludGVycHJldF9jYXN0PGludHB0cl90PihEQyksCiAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpha19kZWNsY29udGV4dCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1BsaXN0U3VwcG9ydC5oIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9QbGlzdFN1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDg1M2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9QbGlzdFN1cHBvcnQuaApAQCAtMCwwICsxLDExMyBAQAorLy89PT0tLS0tLS0tLS0tIFBsaXN0U3VwcG9ydC5oIC0gUGxpc3QgT3V0cHV0IFV0aWxpdGllcyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX1BMSVNUU1VQUE9SVF9ICisjZGVmaW5lIExMVk1fQ0xBTkdfUExJU1RTVVBQT1JUX0gKKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0ZpbGVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9MZXhlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIG1hcmt1cCB7Cit0eXBlZGVmIGxsdm06OkRlbnNlTWFwPEZpbGVJRCwgdW5zaWduZWQ+IEZJRE1hcDsKKworc3RhdGljIGNvbnN0IGNoYXIgKlBsaXN0SGVhZGVyID0KKyAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iCisgICAgIjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgXCItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU5cIiAiCisgICAgIlwiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZFwiPlxuIgorICAgICI8cGxpc3QgdmVyc2lvbj1cIjEuMFwiPlxuIjsKKworc3RhdGljIHZvaWQgQWRkRklEKEZJRE1hcCAmRklEcywgU21hbGxWZWN0b3JJbXBsPEZpbGVJRD4gJlYsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00sIFNvdXJjZUxvY2F0aW9uIEwpIHsKKyAgRmlsZUlEIEZJRCA9IFNNLmdldEZpbGVJRChTTS5nZXRFeHBhbnNpb25Mb2MoTCkpOworICBGSURNYXA6Oml0ZXJhdG9yIEkgPSBGSURzLmZpbmQoRklEKTsKKyAgaWYgKEkgIT0gRklEcy5lbmQoKSkKKyAgICByZXR1cm47CisgIEZJRHNbRklEXSA9IFYuc2l6ZSgpOworICBWLnB1c2hfYmFjayhGSUQpOworfQorCitzdGF0aWMgdW5zaWduZWQgR2V0RklEKGNvbnN0IEZJRE1hcCAmRklEcywgY29uc3QgU291cmNlTWFuYWdlciAmU00sCisgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEwpIHsKKyAgRmlsZUlEIEZJRCA9IFNNLmdldEZpbGVJRChTTS5nZXRFeHBhbnNpb25Mb2MoTCkpOworICBGSURNYXA6OmNvbnN0X2l0ZXJhdG9yIEkgPSBGSURzLmZpbmQoRklEKTsKKyAgYXNzZXJ0KEkgIT0gRklEcy5lbmQoKSk7CisgIHJldHVybiBJLT5zZWNvbmQ7Cit9CisKK3N0YXRpYyByYXdfb3N0cmVhbSAmSW5kZW50KHJhd19vc3RyZWFtICZvLCBjb25zdCB1bnNpZ25lZCBpbmRlbnQpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGluZGVudDsgKytpKQorICAgIG8gPDwgJyAnOworICByZXR1cm4gbzsKK30KKworc3RhdGljIHZvaWQgRW1pdExvY2F0aW9uKHJhd19vc3RyZWFtICZvLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsIFNvdXJjZUxvY2F0aW9uIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklETWFwICZGTSwgdW5zaWduZWQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZW5kID0gZmFsc2UpIHsKKyAgRnVsbFNvdXJjZUxvYyBMb2MoU00uZ2V0RXhwYW5zaW9uTG9jKEwpLCBjb25zdF9jYXN0PFNvdXJjZU1hbmFnZXIgJj4oU00pKTsKKworICAvLyBBZGQgaW4gdGhlIGxlbmd0aCBvZiB0aGUgdG9rZW4sIHNvIHRoYXQgd2UgY292ZXIgbXVsdGktY2hhciB0b2tlbnMuCisgIHVuc2lnbmVkIG9mZnNldCA9CisgICAgICBleHRlbmQgPyBMZXhlcjo6TWVhc3VyZVRva2VuTGVuZ3RoKExvYywgU00sIExhbmdPcHRzKSAtIDEgOiAwOworCisgIEluZGVudChvLCBpbmRlbnQpIDw8ICI8ZGljdD5cbiI7CisgIEluZGVudChvLCBpbmRlbnQpIDw8ICIgPGtleT5saW5lPC9rZXk+PGludGVnZXI+IgorICAgICAgICAgICAgICAgICAgICA8PCBMb2MuZ2V0RXhwYW5zaW9uTGluZU51bWJlcigpIDw8ICI8L2ludGVnZXI+XG4iOworICBJbmRlbnQobywgaW5kZW50KSA8PCAiIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+IgorICAgICAgICAgICAgICAgICAgICA8PCBMb2MuZ2V0RXhwYW5zaW9uQ29sdW1uTnVtYmVyKCkgKyBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgPDwgIjwvaW50ZWdlcj5cbiI7CisgIEluZGVudChvLCBpbmRlbnQpIDw8ICIgPGtleT5maWxlPC9rZXk+PGludGVnZXI+IiA8PCBHZXRGSUQoRk0sIFNNLCBMb2MpCisgICAgICAgICAgICAgICAgICAgIDw8ICI8L2ludGVnZXI+XG4iOworICBJbmRlbnQobywgaW5kZW50KSA8PCAiPC9kaWN0PlxuIjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEVtaXRSYW5nZShyYXdfb3N0cmVhbSAmbywgY29uc3QgU291cmNlTWFuYWdlciAmU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywgQ2hhclNvdXJjZVJhbmdlIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJRE1hcCAmRk0sIHVuc2lnbmVkIGluZGVudCkgeworICBJbmRlbnQobywgaW5kZW50KSA8PCAiPGFycmF5PlxuIjsKKyAgRW1pdExvY2F0aW9uKG8sIFNNLCBMYW5nT3B0cywgUi5nZXRCZWdpbigpLCBGTSwgaW5kZW50ICsgMSk7CisgIEVtaXRMb2NhdGlvbihvLCBTTSwgTGFuZ09wdHMsIFIuZ2V0RW5kKCksIEZNLCBpbmRlbnQgKyAxLCBSLmlzVG9rZW5SYW5nZSgpKTsKKyAgSW5kZW50KG8sIGluZGVudCkgPDwgIjwvYXJyYXk+XG4iOworfQorCitzdGF0aWMgcmF3X29zdHJlYW0gJkVtaXRTdHJpbmcocmF3X29zdHJlYW0gJm8sIFN0cmluZ1JlZiBzKSB7CisgIG8gPDwgIjxzdHJpbmc+IjsKKyAgZm9yIChTdHJpbmdSZWY6OmNvbnN0X2l0ZXJhdG9yIEkgPSBzLmJlZ2luKCksIEUgPSBzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGNoYXIgYyA9ICpJOworICAgIHN3aXRjaCAoYykgeworICAgIGRlZmF1bHQ6CisgICAgICBvIDw8IGM7CisgICAgICBicmVhazsKKyAgICBjYXNlICcmJzoKKyAgICAgIG8gPDwgIiZhbXA7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgbyA8PCAiJmx0OyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgIG8gPDwgIiZndDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXCcnOgorICAgICAgbyA8PCAiJmFwb3M7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1wiJzoKKyAgICAgIG8gPDwgIiZxdW90OyI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgbyA8PCAiPC9zdHJpbmc+IjsKKyAgcmV0dXJuIG87Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9QcmV0dHlTdGFja1RyYWNlLmggYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ByZXR0eVN0YWNrVHJhY2UuaAppbmRleCA5NjdkMGQxLi4wZTQ5Mjk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ByZXR0eVN0YWNrVHJhY2UuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ByZXR0eVN0YWNrVHJhY2UuaApAQCAtMzEsNyArMzEsNyBAQAogICBwdWJsaWM6CiAgICAgUHJldHR5U3RhY2tUcmFjZUxvYyhTb3VyY2VNYW5hZ2VyICZzbSwgU291cmNlTG9jYXRpb24gTCwgY29uc3QgY2hhciAqTXNnKQogICAgICAgOiBTTShzbSksIExvYyhMKSwgTWVzc2FnZShNc2cpIHt9Ci0gICAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1Nhbml0aXplcnMuZGVmIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9TYW5pdGl6ZXJzLmRlZgppbmRleCBjOWIzMWEzLi45NGM0NjE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1Nhbml0aXplcnMuZGVmCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvU2FuaXRpemVycy5kZWYKQEAgLTg5LDcgKzg5LDcgQEAKICAgICAgICAgICAgICAgICBPYmplY3RTaXplIHwgUmV0dXJuIHwgU2hpZnQgfCBTaWduZWRJbnRlZ2VyT3ZlcmZsb3cgfAogICAgICAgICAgICAgICAgIFVucmVhY2hhYmxlIHwgVkxBQm91bmQgfCBWcHRyKQogCi0vLyAtZnNhbml0aXplPXVuZGVmaW5lZC10cmFwIChhbmQgaXRzIGFsaWFzIC1mY2F0Y2gtdW5kZWZpbmVkLWJlaGF2aW9yKSBpbmNsdWRlcworLy8gLWZzYW5pdGl6ZT11bmRlZmluZWQtdHJhcCBpbmNsdWRlcwogLy8gYWxsIHNhbml0aXplcnMgaW5jbHVkZWQgYnkgLWZzYW5pdGl6ZT11bmRlZmluZWQsIGV4Y2VwdCB0aG9zZSB0aGF0IHJlcXVpcmUKIC8vIHJ1bnRpbWUgc3VwcG9ydC4gIFRoaXMgZ3JvdXAgaXMgZ2VuZXJhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKIC8vIC1mc2FuaXRpemUtdW5kZWZpbmVkLXRyYXAtb24tZXJyb3IgZmxhZy4KQEAgLTEwMyw3ICsxMDMsNiBAQAogICAgICAgICAgICAgICAgIFNpZ25lZEludGVnZXJPdmVyZmxvdyB8IFVuc2lnbmVkSW50ZWdlck92ZXJmbG93IHwgU2hpZnQgfAogICAgICAgICAgICAgICAgIEludGVnZXJEaXZpZGVCeVplcm8pCiAKLS8vIC1mYm91bmRzLWNoZWNraW5nCiBTQU5JVElaRVIoImxvY2FsLWJvdW5kcyIsIExvY2FsQm91bmRzKQogU0FOSVRJWkVSX0dST1VQKCJib3VuZHMiLCBCb3VuZHMsIEFycmF5Qm91bmRzIHwgTG9jYWxCb3VuZHMpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaAppbmRleCAxMGFlMDdiLi4wMWNhOWE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oCkBAIC04OSw3ICs4OSw3IEBACiAgIGZyaWVuZCBjbGFzcyBTb3VyY2VNYW5hZ2VyOwogICBmcmllbmQgY2xhc3MgQVNUUmVhZGVyOwogICBmcmllbmQgY2xhc3MgQVNUV3JpdGVyOwotICBlbnVtIExMVk1fRU5VTV9JTlRfVFlQRSh1bnNpZ25lZCkgeworICBlbnVtIDogdW5zaWduZWQgewogICAgIE1hY3JvSURCaXQgPSAxVSA8PCAzMQogICB9OwogcHVibGljOgpAQCAtMTcyLDcgKzE3Miw3IEBACiAgIH0KIAogICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgU291cmNlTWFuYWdlciAmU00pIGNvbnN0OwotICBMTFZNX0FUVFJJQlVURV9VU0VEIHN0ZDo6c3RyaW5nIHByaW50VG9TdHJpbmcoY29uc3QgU291cmNlTWFuYWdlciAmU00pIGNvbnN0OworICBzdGQ6OnN0cmluZyBwcmludFRvU3RyaW5nKGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKSBjb25zdDsKICAgdm9pZCBkdW1wKGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKSBjb25zdDsKIH07CiAKQEAgLTE4OCw3ICsxODgsNyBAQAogICByZXR1cm4gTEhTLmdldFJhd0VuY29kaW5nKCkgPCBSSFMuZ2V0UmF3RW5jb2RpbmcoKTsKIH0KIAotLy8vIFxicmllZiBBIHRyaXZhbCB0dXBsZSB1c2VkIHRvIHJlcHJlc2VudCBhIHNvdXJjZSByYW5nZS4KKy8vLyBcYnJpZWYgQSB0cml2aWFsIHR1cGxlIHVzZWQgdG8gcmVwcmVzZW50IGEgc291cmNlIHJhbmdlLgogY2xhc3MgU291cmNlUmFuZ2UgewogICBTb3VyY2VMb2NhdGlvbiBCOwogICBTb3VyY2VMb2NhdGlvbiBFOwpAQCAtMzMxLDcgKzMzMSw3IEBACiAgIC8vLyBcYnJpZWYgUHJpbnRzIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgRnVsbFNvdXJjZUxvYyB0byBzdGRlcnIuCiAgIC8vLwogICAvLy8gVGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KLSAgTExWTV9BVFRSSUJVVEVfVVNFRCB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CiAKICAgZnJpZW5kIGlubGluZSBib29sCiAgIG9wZXJhdG9yPT0oY29uc3QgRnVsbFNvdXJjZUxvYyAmTEhTLCBjb25zdCBGdWxsU291cmNlTG9jICZSSFMpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgKaW5kZXggNmFhYjk5OC4uYzIxMzBhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCkBAIC01MCw2ICs0OSw3IEBACiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgogI2luY2x1ZGUgPGNhc3NlcnQ+CiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CkBAIC01NjksNyArNTY5LDcgQEAKIAogICAvLy8gXGJyaWVmIExhemlseSBjcmVhdGUgdGhlIG9iamVjdCBrZWVwaW5nIG92ZXJyaWRkZW4gZmlsZXMgaW5mbywgc2luY2UKICAgLy8vIGl0IGlzIHVuY29tbW9ubHkgdXNlZC4KLSAgT3duaW5nUHRyPE92ZXJyaWRkZW5GaWxlc0luZm9UeT4gT3ZlcnJpZGRlbkZpbGVzSW5mbzsKKyAgc3RkOjp1bmlxdWVfcHRyPE92ZXJyaWRkZW5GaWxlc0luZm9UeT4gT3ZlcnJpZGRlbkZpbGVzSW5mbzsKIAogICBPdmVycmlkZGVuRmlsZXNJbmZvVHkgJmdldE92ZXJyaWRkZW5GaWxlc0luZm8oKSB7CiAgICAgaWYgKCFPdmVycmlkZGVuRmlsZXNJbmZvKQpAQCAtMTMzMiw3ICsxMzMyLDcgQEAKICAgICByZXR1cm4gbG9jLmlzTWFjcm9JRCgpICYmIGlzSW5TeXN0ZW1IZWFkZXIoZ2V0U3BlbGxpbmdMb2MobG9jKSk7CiAgIH0KIAotICAvLy8gXGJyaWVmIFRoZSBzaXplIG9mIHRoZSBTTG9jRW50eSB0aGF0IFxwIEZJRCByZXByZXNlbnRzLgorICAvLy8gXGJyaWVmIFRoZSBzaXplIG9mIHRoZSBTTG9jRW50cnkgdGhhdCBccCBGSUQgcmVwcmVzZW50cy4KICAgdW5zaWduZWQgZ2V0RmlsZUlEU2l6ZShGaWxlSUQgRklEKSBjb25zdDsKIAogICAvLy8gXGJyaWVmIEdpdmVuIGEgc3BlY2lmaWMgRmlsZUlELCByZXR1cm5zIHRydWUgaWYgXHAgTG9jIGlzIGluc2lkZSB0aGF0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1NwZWNpZmllcnMuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oCmluZGV4IDBiODA5MzkuLmY4OTU2NzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oCkBAIC02MywyMSArNjMsMTMgQEAKICAgICBUU1RfZGVjbHR5cGVfYXV0bywgICAgLy8gQysrMXkgZGVjbHR5cGUoYXV0bykKICAgICBUU1RfdW5rbm93bl9hbnl0eXBlLCAgLy8gX191bmtub3duX2FueXR5cGUgZXh0ZW5zaW9uCiAgICAgVFNUX2F0b21pYywgICAgICAgICAgIC8vIEMxMSBfQXRvbWljCi0gICAgVFNUX2ltYWdlMWRfdCwgICAgICAgIC8vIE9wZW5DTCBpbWFnZTFkX3QKLSAgICBUU1RfaW1hZ2UxZF9hcnJheV90LCAgLy8gT3BlbkNMIGltYWdlMWRfYXJyYXlfdAotICAgIFRTVF9pbWFnZTFkX2J1ZmZlcl90LCAvLyBPcGVuQ0wgaW1hZ2UxZF9idWZmZXJfdAotICAgIFRTVF9pbWFnZTJkX3QsICAgICAgICAvLyBPcGVuQ0wgaW1hZ2UyZF90Ci0gICAgVFNUX2ltYWdlMmRfYXJyYXlfdCwgIC8vIE9wZW5DTCBpbWFnZTJkX2FycmF5X3QKLSAgICBUU1RfaW1hZ2UzZF90LCAgICAgICAgLy8gT3BlbkNMIGltYWdlM2RfdAotICAgIFRTVF9zYW1wbGVyX3QsICAgICAgICAvLyBPcGVuQ0wgc2FtcGxlcl90Ci0gICAgVFNUX2V2ZW50X3QsICAgICAgICAgIC8vIE9wZW5DTCBldmVudF90CiAgICAgVFNUX2Vycm9yICAgICAgICAgLy8gZXJyb25lb3VzIHR5cGUKICAgfTsKICAgCiAgIC8vLyBcYnJpZWYgU3RydWN0dXJlIHRoYXQgcGFja3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgc3BlY2lmaWVycyB0aGF0CiAgIC8vLyB3ZXJlIHdyaXR0ZW4gaW4gYSBwYXJ0aWN1bGFyIHR5cGUgc3BlY2lmaWVyIHNlcXVlbmNlLgogICBzdHJ1Y3QgV3JpdHRlbkJ1aWx0aW5TcGVjcyB7Ci0gICAgLypEZWNsU3BlYzo6VFNUKi8gdW5zaWduZWQgVHlwZSAgOiA2OworICAgIC8qRGVjbFNwZWM6OlRTVCovIHVuc2lnbmVkIFR5cGUgIDogNTsKICAgICAvKkRlY2xTcGVjOjpUU1MqLyB1bnNpZ25lZCBTaWduICA6IDI7CiAgICAgLypEZWNsU3BlYzo6VFNXKi8gdW5zaWduZWQgV2lkdGggOiAyOwogICAgIGJvb2wgTW9kZUF0dHIgOiAxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9TdG10Tm9kZXMudGQgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL1N0bXROb2Rlcy50ZAppbmRleCA2OTg1MWE5Li4wZjBmMjg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1N0bXROb2Rlcy50ZAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL1N0bXROb2Rlcy50ZApAQCAtMTE1LDggKzExNSw2IEBACiBkZWYgQ1hYRGVsZXRlRXhwciA6IERTdG10PEV4cHI+OwogZGVmIENYWFBzZXVkb0Rlc3RydWN0b3JFeHByIDogRFN0bXQ8RXhwcj47CiBkZWYgVHlwZVRyYWl0RXhwciA6IERTdG10PEV4cHI+OwotZGVmIFVuYXJ5VHlwZVRyYWl0RXhwciA6IERTdG10PEV4cHI+OwotZGVmIEJpbmFyeVR5cGVUcmFpdEV4cHIgOiBEU3RtdDxFeHByPjsKIGRlZiBBcnJheVR5cGVUcmFpdEV4cHIgOiBEU3RtdDxFeHByPjsKIGRlZiBFeHByZXNzaW9uVHJhaXRFeHByIDogRFN0bXQ8RXhwcj47CiBkZWYgRGVwZW5kZW50U2NvcGVEZWNsUmVmRXhwciA6IERTdG10PEV4cHI+OwpAQCAtMTgwLDMgKzE3OCw0IEBACiAvLyBPcGVuTVAgRGlyZWN0aXZlcy4KIGRlZiBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlIDogU3RtdDwxPjsKIGRlZiBPTVBQYXJhbGxlbERpcmVjdGl2ZSA6IERTdG10PE9NUEV4ZWN1dGFibGVEaXJlY3RpdmU+OworZGVmIE9NUFNpbWREaXJlY3RpdmUgOiBEU3RtdDxPTVBFeGVjdXRhYmxlRGlyZWN0aXZlPjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvVGFyZ2V0QnVpbHRpbnMuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvVGFyZ2V0QnVpbHRpbnMuaAppbmRleCBlZDNjYzQ5Li5lNmNjOWFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1RhcmdldEJ1aWx0aW5zLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9UYXJnZXRCdWlsdGlucy5oCkBAIC0yMSwxMCArMjEsMjAgQEAKIAogbmFtZXNwYWNlIGNsYW5nIHsKIAorICBuYW1lc3BhY2UgTkVPTiB7CisgIGVudW0geworICAgIExhc3RUSUJ1aWx0aW4gPSBjbGFuZzo6QnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW4gLSAxLAorI2RlZmluZSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykgQkkjI0lELAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zTkVPTi5kZWYiCisgICAgRmlyc3RUU0J1aWx0aW4KKyAgfTsKKyAgfQorCiAgIC8vLyBcYnJpZWYgQUFyY2g2NCBidWlsdGlucwogICBuYW1lc3BhY2UgQUFyY2g2NCB7CiAgICAgZW51bSB7CiAgICAgICBMYXN0VElCdWlsdGluID0gY2xhbmc6OkJ1aWx0aW46OkZpcnN0VFNCdWlsdGluLTEsCisgICAgICBMYXN0TkVPTkJ1aWx0aW4gPSBORU9OOjpGaXJzdFRTQnVpbHRpbiAtIDEsCiAjZGVmaW5lIEJVSUxUSU4oSUQsIFRZUEUsIEFUVFJTKSBCSSMjSUQsCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQnVpbHRpbnNBQXJjaDY0LmRlZiIKICAgICAgIExhc3RUU0J1aWx0aW4KQEAgLTMzLDEzICs0MywyNSBAQAogICAvLy8gXGJyaWVmIEFSTSBidWlsdGlucwogICBuYW1lc3BhY2UgQVJNIHsKICAgICBlbnVtIHsKLSAgICAgICAgTGFzdFRJQnVpbHRpbiA9IGNsYW5nOjpCdWlsdGluOjpGaXJzdFRTQnVpbHRpbi0xLAorICAgICAgTGFzdFRJQnVpbHRpbiA9IGNsYW5nOjpCdWlsdGluOjpGaXJzdFRTQnVpbHRpbi0xLAorICAgICAgTGFzdE5FT05CdWlsdGluID0gTkVPTjo6Rmlyc3RUU0J1aWx0aW4gLSAxLAogI2RlZmluZSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykgQkkjI0lELAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zQVJNLmRlZiIKLSAgICAgICAgTGFzdFRTQnVpbHRpbgorICAgICAgTGFzdFRTQnVpbHRpbgogICAgIH07CiAgIH0KIAorICAvLy8gXGJyaWVmIEFSTTY0IGJ1aWx0aW5zCisgIG5hbWVzcGFjZSBBUk02NCB7CisgIGVudW0geworICAgIExhc3RUSUJ1aWx0aW4gPSBjbGFuZzo6QnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW4gLSAxLAorICAgIExhc3RORU9OQnVpbHRpbiA9IE5FT046OkZpcnN0VFNCdWlsdGluIC0gMSwKKyAgI2RlZmluZSBCVUlMVElOKElELCBUWVBFLCBBVFRSUykgQkkjI0lELAorICAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQnVpbHRpbnNBUk02NC5kZWYiCisgICAgTGFzdFRTQnVpbHRpbgorICB9OworICB9CisKICAgLy8vIFxicmllZiBQUEMgYnVpbHRpbnMKICAgbmFtZXNwYWNlIFBQQyB7CiAgICAgZW51bSB7CkBAIC05MSw2ICsxMTMsNyBAQAogICAgICAgUG9seTgsCiAgICAgICBQb2x5MTYsCiAgICAgICBQb2x5NjQsCisgICAgICBQb2x5MTI4LAogICAgICAgRmxvYXQxNiwKICAgICAgIEZsb2F0MzIsCiAgICAgICBGbG9hdDY0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1RhcmdldENYWEFCSS5oIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9UYXJnZXRDWFhBQkkuaAppbmRleCAxNTkwY2NhLi5mOWUzN2MzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1RhcmdldENYWEFCSS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvVGFyZ2V0Q1hYQUJJLmgKQEAgLTYzLDYgKzYzLDE0IEBACiAgICAgLy8vICAgLSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHNpZ25hdHVyZXMuCiAgICAgaU9TLAogCisgICAgLy8vIFRoZSBpT1MgNjQtYml0IEFCSSBpcyBmb2xsb3dzIEFSTSdzIHB1Ymxpc2hlZCA2NC1iaXQgQUJJIG1vcmUKKyAgICAvLy8gY2xvc2VseSwgYnV0IHdlIGRvbid0IGd1YXJhbnRlZSB0byBmb2xsb3cgaXQgcGVyZmVjdGx5LgorICAgIC8vLworICAgIC8vLyBJdCBpcyBkb2N1bWVudGVkIGhlcmU6CisgICAgLy8vICAgIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20KKyAgICAvLy8gICAgICAgICAgICAgICAgICAvaGVscC90b3BpYy9jb20uYXJtLmRvYy5paGkwMDU5YS9JSEkwMDU5QV9jcHBhYmk2NC5wZGYKKyAgICBpT1M2NCwKKwogICAgIC8vLyBUaGUgZ2VuZXJpYyBBQXJjaDY0IEFCSSBpcyBhbHNvIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgSXRhbml1bSBBQkksCiAgICAgLy8vIGJ1dCBpdCBoYXMgZmV3ZXIgZGl2ZXJnZW5jZXMgdGhhbiB0aGUgMzItYml0IEFSTSBBQkkuCiAgICAgLy8vCkBAIC0xMDUsNiArMTEzLDcgQEAKICAgICBjYXNlIEdlbmVyaWNJdGFuaXVtOgogICAgIGNhc2UgR2VuZXJpY0FSTToKICAgICBjYXNlIGlPUzoKKyAgICBjYXNlIGlPUzY0OgogICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBjYXNlIE1pY3Jvc29mdDoKQEAgLTEyMCw2ICsxMjksNyBAQAogICAgIGNhc2UgR2VuZXJpY0l0YW5pdW06CiAgICAgY2FzZSBHZW5lcmljQVJNOgogICAgIGNhc2UgaU9TOgorICAgIGNhc2UgaU9TNjQ6CiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBjYXNlIE1pY3Jvc29mdDoKQEAgLTEzNSwxNCArMTQ1LDE0IEBACiAgICAgcmV0dXJuICFpc01pY3Jvc29mdCgpOwogICB9CiAKLSAgLy8vIEFyZSB0ZW1wb3Jhcnkgb2JqZWN0cyBwYXNzZWQgYnkgdmFsdWUgdG8gYSBjYWxsIGRlc3Ryb3llZCBieSB0aGUgY2FsbGVlPworICAvLy8gQXJlIGFyZ3VtZW50cyB0byBhIGNhbGwgZGVzdHJveWVkIGxlZnQgdG8gcmlnaHQgaW4gdGhlIGNhbGxlZT8KICAgLy8vIFRoaXMgaXMgYSBmdW5kYW1lbnRhbCBsYW5ndWFnZSBjaGFuZ2UsIHNpbmNlIGl0IGltcGxpZXMgdGhhdCBvYmplY3RzCiAgIC8vLyBwYXNzZWQgYnkgdmFsdWUgZG8gKm5vdCogbGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBmdWxsIGV4cHJlc3Npb24uCiAgIC8vLyBUZW1wb3JhcmllcyBwYXNzZWQgdG8gYSBmdW5jdGlvbiB0YWtpbmcgYSBjb25zdCByZWZlcmVuY2UgbGl2ZSB0byB0aGUgZW5kCiAgIC8vLyBvZiB0aGUgZnVsbCBleHByZXNzaW9uIGFzIHVzdWFsLiAgQm90aCB0aGUgY2FsbGVyIGFuZCB0aGUgY2FsbGVlIG11c3QKICAgLy8vIGhhdmUgYWNjZXNzIHRvIHRoZSBkZXN0cnVjdG9yLCB3aGlsZSBvbmx5IHRoZSBjYWxsZXIgbmVlZHMgdGhlCiAgIC8vLyBkZXN0cnVjdG9yIGlmIHRoaXMgaXMgZmFsc2UuCi0gIGJvb2wgaXNBcmd1bWVudERlc3Ryb3llZEJ5Q2FsbGVlKCkgY29uc3QgeworICBib29sIGFyZUFyZ3NEZXN0cm95ZWRMZWZ0VG9SaWdodEluQ2FsbGVlKCkgY29uc3QgewogICAgIHJldHVybiBpc01pY3Jvc29mdCgpOwogICB9CiAKQEAgLTE5NSw2ICsyMDUsNyBAQAogICBib29sIGNhbktleUZ1bmN0aW9uQmVJbmxpbmUoKSBjb25zdCB7CiAgICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKICAgICBjYXNlIEdlbmVyaWNBUk06CisgICAgY2FzZSBpT1M2NDoKICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGNhc2UgR2VuZXJpY0FBcmNoNjQ6CkBAIC0yMzAsNyArMjQxLDcgQEAKIAogICAgIC8vLyBPbmx5IGFsbG9jYXRlIG9iamVjdHMgaW4gdGhlIHRhaWwgcGFkZGluZyBvZiBhIGJhc2UgY2xhc3MgaWYKICAgICAvLy8gdGhlIGJhc2UgY2xhc3MgaXMgbm90IFBPRCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIG9mIEMrKyBUUjEuCi0gICAgLy8vIFRoaXMgaXMgbm9uIHN0cmljdGx5IGNvbmZvcm1pbmcgaW4gQysrMTEgbW9kZS4KKyAgICAvLy8gVGhpcyBpcyBub24tc3RyaWN0bHkgY29uZm9ybWluZyBpbiBDKysxMSBtb2RlLgogICAgIFVzZVRhaWxQYWRkaW5nVW5sZXNzUE9EMDMsCiAKICAgICAvLy8gT25seSBhbGxvY2F0ZSBvYmplY3RzIGluIHRoZSB0YWlsIHBhZGRpbmcgb2YgYSBiYXNlIGNsYXNzIGlmCkBAIC0yNDgsNiArMjU5LDExIEBACiAgICAgY2FzZSBpT1M6CiAgICAgICByZXR1cm4gVXNlVGFpbFBhZGRpbmdVbmxlc3NQT0QwMzsKIAorICAgIC8vIGlPUyBvbiBBUk02NCB1c2VzIHRoZSBDKysxMSBQT0QgcnVsZXMuICBJdCBkb2VzIG5vdCBob25vciB0aGUKKyAgICAvLyBJdGFuaXVtIGV4Y2VwdGlvbiBhYm91dCBjbGFzc2VzIHdpdGggb3Zlci1sYXJnZSBiaXRmaWVsZHMuCisgICAgY2FzZSBpT1M2NDoKKyAgICAgIHJldHVybiBVc2VUYWlsUGFkZGluZ1VubGVzc1BPRDExOworCiAgICAgLy8gTVNWQyBhbHdheXMgYWxsb2NhdGVzIGZpZWxkcyBpbiB0aGUgdGFpbC1wYWRkaW5nIG9mIGEgYmFzZSBjbGFzcwogICAgIC8vIHN1Ym9iamVjdCwgZXZlbiBpZiB0aGV5J3JlIFBPRC4KICAgICBjYXNlIE1pY3Jvc29mdDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgKaW5kZXggMDQ3ODcyZC4uMjRhNmZhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgKQEAgLTE2LDkgKzE2LDkgQEAKICNkZWZpbmUgTExWTV9DTEFOR19CQVNJQ19UQVJHRVRJTkZPX0gKIAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0FkZHJlc3NTcGFjZXMuaCIKLSNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRDWFhBQkkuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU3BlY2lmaWVycy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1RhcmdldENYWEFCSS5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1RhcmdldE9wdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9WZXJzaW9uVHVwbGUuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKQEAgLTU3OSw2ICs1NzksNyBAQAogICB9CiAKICAgY29uc3QgY2hhciAqZ2V0VGFyZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgYXNzZXJ0KERlc2NyaXB0aW9uU3RyaW5nKTsKICAgICByZXR1cm4gRGVzY3JpcHRpb25TdHJpbmc7CiAgIH0KIApAQCAtNjA0LDI0ICs2MDUsNiBAQAogICAvLy8gZWl0aGVyOyB0aGUgZW50aXJlIHRoaW5nIGlzIHByZXR0eSBiYWRseSBtYW5nbGVkLgogICB2aXJ0dWFsIGJvb2wgaGFzUHJvdGVjdGVkVmlzaWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KIAotICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc2VjdGlvbiB0byB1c2UgZm9yIENGU3RyaW5nIGxpdGVyYWxzLCBvciAwIGlmIG5vCi0gIC8vLyBzcGVjaWFsIHNlY3Rpb24gaXMgdXNlZC4KLSAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRDRlN0cmluZ1NlY3Rpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuICJfX0RBVEEsX19jZnN0cmluZyI7Ci0gIH0KLQotICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc2VjdGlvbiB0byB1c2UgZm9yIE5TU3RyaW5nIGxpdGVyYWxzLCBvciAwIGlmIG5vCi0gIC8vLyBzcGVjaWFsIHNlY3Rpb24gaXMgdXNlZC4KLSAgdmlydHVhbCBjb25zdCBjaGFyICpnZXROU1N0cmluZ1NlY3Rpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuICJfX09CSkMsX19jc3RyaW5nX29iamVjdCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiOwotICB9Ci0KLSAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNlY3Rpb24gdG8gdXNlIGZvciBOU1N0cmluZyBsaXRlcmFscywgb3IgMCBpZiBubwotICAvLy8gc3BlY2lhbCBzZWN0aW9uIGlzIHVzZWQgKE5vbkZyYWdpbGUgQUJJKS4KLSAgdmlydHVhbCBjb25zdCBjaGFyICpnZXROU1N0cmluZ05vbkZyYWdpbGVBQklTZWN0aW9uKCkgY29uc3QgewotICAgIHJldHVybiAiX19EQVRBLCBfX29iamNfc3RyaW5nb2JqLCByZWd1bGFyLCBub19kZWFkX3N0cmlwIjsKLSAgfQotCiAgIC8vLyBcYnJpZWYgQW4gb3B0aW9uYWwgaG9vayB0aGF0IHRhcmdldHMgY2FuIGltcGxlbWVudCB0byBwZXJmb3JtIHNlbWFudGljCiAgIC8vLyBjaGVja2luZyBvbiBhdHRyaWJ1dGUoKHNlY3Rpb24oImZvbyIpKSkgc3BlY2lmaWVycy4KICAgLy8vCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1RhcmdldE9wdGlvbnMuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvVGFyZ2V0T3B0aW9ucy5oCmluZGV4IDk5MDkxODIuLmQ4YTEwYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvVGFyZ2V0T3B0aW9ucy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvVGFyZ2V0T3B0aW9ucy5oCkBAIC0zOCwxMCArMzgsNiBAQAogICAvLy8gSWYgZ2l2ZW4sIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgQUJJIHRvIHVzZS4KICAgc3RkOjpzdHJpbmcgQUJJOwogCi0gIC8vLyBJZiBnaXZlbiwgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBDKysgQUJJIHRvIHVzZS4gSWYgbm90IGdpdmVuLCBkZWZhdWx0cwotICAvLy8gdG8gIml0YW5pdW0iLgotICBzdGQ6OnN0cmluZyBDWFhBQkk7Ci0KICAgLy8vIElmIGdpdmVuLCB0aGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGxpbmtlciBpbiB1c2UuCiAgIHN0ZDo6c3RyaW5nIExpbmtlclZlcnNpb247CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvVGVtcGxhdGVLaW5kcy5oIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9UZW1wbGF0ZUtpbmRzLmgKaW5kZXggYzUyMTg5My4uYjczMDE0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9UZW1wbGF0ZUtpbmRzLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9UZW1wbGF0ZUtpbmRzLmgKQEAgLTE3LDYgKzE3LDcgQEAKIG5hbWVzcGFjZSBjbGFuZyB7CiAKIC8vLyBcYnJpZWYgU3BlY2lmaWVzIHRoZSBraW5kIG9mIHRlbXBsYXRlIG5hbWUgdGhhdCBhbiBpZGVudGlmaWVyIHJlZmVycyB0by4KKy8vLyBCZSBjYXJlZnVsIHdoZW4gY2hhbmdpbmcgdGhpczogdGhpcyBlbnVtZXJhdGlvbiBpcyB1c2VkIGluIGRpYWdub3N0aWNzLgogZW51bSBUZW1wbGF0ZU5hbWVLaW5kIHsKICAgLy8vIFRoZSBuYW1lIGRvZXMgbm90IHJlZmVyIHRvIGEgdGVtcGxhdGUuCiAgIFROS19Ob25fdGVtcGxhdGUgPSAwLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmRlZiBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvVG9rZW5LaW5kcy5kZWYKaW5kZXggNjgxMmNjZS4uNDJlYmNmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmRlZgorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL1Rva2VuS2luZHMuZGVmCkBAIC0yMyw2ICsyMywxOCBAQAogI2lmbmRlZiBLRVlXT1JECiAjZGVmaW5lIEtFWVdPUkQoWCxZKSBUT0soa3dfICMjIFgpCiAjZW5kaWYKKyNpZm5kZWYgVFlQRV9UUkFJVAorI2RlZmluZSBUWVBFX1RSQUlUKE4sSSxLKSBLRVlXT1JEKEksSykKKyNlbmRpZgorI2lmbmRlZiBUWVBFX1RSQUlUXzEKKyNkZWZpbmUgVFlQRV9UUkFJVF8xKEksRSxLKSBUWVBFX1RSQUlUKDEsSSxLKQorI2VuZGlmCisjaWZuZGVmIFRZUEVfVFJBSVRfMgorI2RlZmluZSBUWVBFX1RSQUlUXzIoSSxFLEspIFRZUEVfVFJBSVQoMixJLEspCisjZW5kaWYKKyNpZm5kZWYgVFlQRV9UUkFJVF9OCisjZGVmaW5lIFRZUEVfVFJBSVRfTihJLEUsSykgVFlQRV9UUkFJVCgwLEksSykKKyNlbmRpZgogI2lmbmRlZiBBTElBUwogI2RlZmluZSBBTElBUyhYLFksWikKICNlbmRpZgpAQCAtMjE3LDYgKzIyOSw3IEBACiAvLyAgIEtFWUFMVElWRUMgLSBUaGlzIGlzIGEga2V5d29yZCBpbiBBbHRpVmVjCiAvLyAgIEtFWUJPUkxBTkQgLSBUaGlzIGlzIGEga2V5d29yZCBpZiBCb3JsYW5kIGV4dGVuc2lvbnMgYXJlIGVuYWJsZWQKIC8vICAgQk9PTFNVUFBPUlQgLSBUaGlzIGlzIGEga2V5d29yZCBpZiAnYm9vbCcgaXMgYSBidWlsdC1pbiB0eXBlCisvLyAgIEhBTEZTVVBQT1JUIC0gVGhpcyBpcyBhIGtleXdvcmQgaWYgJ2hhbGYnIGlzIGEgYnVpbHQtaW4gdHlwZQogLy8gICBXQ0hBUlNVUFBPUlQgLSBUaGlzIGlzIGEga2V5d29yZCBpZiAnd2NoYXJfdCcgaXMgYSBidWlsdC1pbiB0eXBlCiAvLwogS0VZV09SRChhdXRvICAgICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCkBAIC0yNTUsNyArMjY4LDcgQEAKIEtFWVdPUkQod2hpbGUgICAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQogS0VZV09SRChfQWxpZ25hcyAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCiBLRVlXT1JEKF9BbGlnbm9mICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKLUtFWVdPUkQoX0F0b21pYyAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQorS0VZV09SRChfQXRvbWljICAgICAgICAgICAgICAgICAgICAgLCBLRVlBTEx8S0VZTk9NUykKIEtFWVdPUkQoX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICwgS0VZTk9DWFgpCiBLRVlXT1JEKF9Db21wbGV4ICAgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKIEtFWVdPUkQoX0dlbmVyaWMgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQpAQCAtMjg0LDcgKzI5Nyw3IEBACiBLRVlXT1JEKG5hbWVzcGFjZSAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKIEtFWVdPUkQobmV3ICAgICAgICAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQogS0VZV09SRChvcGVyYXRvciAgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKHByaXZhdGUgICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWHxLRVlPUEVOQ0wpCitLRVlXT1JEKHByaXZhdGUgICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKIEtFWVdPUkQocHJvdGVjdGVkICAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQogS0VZV09SRChwdWJsaWMgICAgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCiBLRVlXT1JEKHJlaW50ZXJwcmV0X2Nhc3QgICAgICAgICAgICAsIEtFWUNYWCkKQEAgLTMzNCw3ICszNDcsOSBAQAogS0VZV09SRChfX2F0dHJpYnV0ZSAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCiBLRVlXT1JEKF9fYnVpbHRpbl9jaG9vc2VfZXhwciAgICAgICAsIEtFWUFMTCkKIEtFWVdPUkQoX19idWlsdGluX29mZnNldG9mICAgICAgICAgICwgS0VZQUxMKQotS0VZV09SRChfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wLCBLRVlBTEwpCisvLyBfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wIGlzIGEgR05VIEMgZXh0ZW5zaW9uIHRoYXQgd2UgaGFuZGxlIGxpa2UgYSBDKysKKy8vIHR5cGUgdHJhaXQuCitUWVBFX1RSQUlUXzIoX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCwgVHlwZUNvbXBhdGlibGUsIEtFWU5PQ1hYKQogS0VZV09SRChfX2J1aWx0aW5fdmFfYXJnICAgICAgICAgICAgLCBLRVlBTEwpCiBLRVlXT1JEKF9fZXh0ZW5zaW9uX18gICAgICAgICAgICAgICAsIEtFWUFMTCkKIEtFWVdPUkQoX19pbWFnICAgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQpAQCAtMzUxLDQyICszNjYsNDkgQEAKIC8vIE1TIEV4dGVuc2lvbnMKIEtFWVdPUkQoX19GVU5DRE5BTUVfXyAgICAgICAgICAgICAgICwgS0VZTVMpCiBLRVlXT1JEKExfX0ZVTkNUSU9OX18gICAgICAgICAgICAgICAsIEtFWU1TKQotS0VZV09SRChfX2lzX2ludGVyZmFjZV9jbGFzcyAgICAgICAgLCBLRVlNUykKLUtFWVdPUkQoX19pc19zZWFsZWQgICAgICAgICAgICAgICAgICwgS0VZTVMpCitUWVBFX1RSQUlUXzEoX19pc19pbnRlcmZhY2VfY2xhc3MsIElzSW50ZXJmYWNlQ2xhc3MsIEtFWU1TKQorVFlQRV9UUkFJVF8xKF9faXNfc2VhbGVkLCBJc1NlYWxlZCwgS0VZTVMpCisKKy8vIE1TVkMxMi4wIC8gVlMyMDEzIFR5cGUgVHJhaXRzCitUWVBFX1RSQUlUXzEoX19pc19kZXN0cnVjdGlibGUsIElzRGVzdHJ1Y3RpYmxlLCBLRVlNUykKK1RZUEVfVFJBSVRfMShfX2lzX25vdGhyb3dfZGVzdHJ1Y3RpYmxlLCBJc05vdGhyb3dEZXN0cnVjdGlibGUsIEtFWU1TKQorVFlQRV9UUkFJVF8yKF9faXNfbm90aHJvd19hc3NpZ25hYmxlLCBJc05vdGhyb3dBc3NpZ25hYmxlLCBLRVlDWFgpCitUWVBFX1RSQUlUX04oX19pc19jb25zdHJ1Y3RpYmxlLCBJc0NvbnN0cnVjdGlibGUsIEtFWUNYWCkKK1RZUEVfVFJBSVRfTihfX2lzX25vdGhyb3dfY29uc3RydWN0aWJsZSwgSXNOb3Rocm93Q29uc3RydWN0aWJsZSwgS0VZQ1hYKQogCiAvLyBHTlUgYW5kIE1TIFR5cGUgVHJhaXRzCi1LRVlXT1JEKF9faGFzX25vdGhyb3dfYXNzaWduICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2hhc19ub3Rocm93X21vdmVfYXNzaWduICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19oYXNfbm90aHJvd19jb3B5ICAgICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2hhc190cml2aWFsX2Fzc2lnbiAgICAgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19oYXNfdHJpdmlhbF9tb3ZlX2Fzc2lnbiAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faGFzX3RyaXZpYWxfY29weSAgICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19oYXNfdHJpdmlhbF9tb3ZlX2NvbnN0cnVjdG9yLCBLRVlDWFgpCi1LRVlXT1JEKF9faGFzX3RyaXZpYWxfZGVzdHJ1Y3RvciAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2hhc192aXJ0dWFsX2Rlc3RydWN0b3IgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc19hYnN0cmFjdCAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfYmFzZV9vZiAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX2NsYXNzICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc19jb252ZXJ0aWJsZV90byAgICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfZW1wdHkgICAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX2VudW0gICAgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc19maW5hbCAgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19oYXNfbm90aHJvd19hc3NpZ24sIEhhc05vdGhyb3dBc3NpZ24sIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2hhc19ub3Rocm93X21vdmVfYXNzaWduLCBIYXNOb3Rocm93TW92ZUFzc2lnbiwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faGFzX25vdGhyb3dfY29weSwgSGFzTm90aHJvd0NvcHksIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2hhc19ub3Rocm93X2NvbnN0cnVjdG9yLCBIYXNOb3Rocm93Q29uc3RydWN0b3IsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2hhc190cml2aWFsX2Fzc2lnbiwgSGFzVHJpdmlhbEFzc2lnbiwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faGFzX3RyaXZpYWxfbW92ZV9hc3NpZ24sIEhhc1RyaXZpYWxNb3ZlQXNzaWduLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19oYXNfdHJpdmlhbF9jb3B5LCBIYXNUcml2aWFsQ29weSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IsIEhhc1RyaXZpYWxEZWZhdWx0Q29uc3RydWN0b3IsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2hhc190cml2aWFsX21vdmVfY29uc3RydWN0b3IsIEhhc1RyaXZpYWxNb3ZlQ29uc3RydWN0b3IsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2hhc190cml2aWFsX2Rlc3RydWN0b3IsIEhhc1RyaXZpYWxEZXN0cnVjdG9yLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yLCBIYXNWaXJ0dWFsRGVzdHJ1Y3RvciwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfYWJzdHJhY3QsIElzQWJzdHJhY3QsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMihfX2lzX2Jhc2Vfb2YsIElzQmFzZU9mLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19jbGFzcywgSXNDbGFzcywgS0VZQ1hYKQorVFlQRV9UUkFJVF8yKF9faXNfY29udmVydGlibGVfdG8sIElzQ29udmVydGlibGVUbywgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfZW1wdHksIElzRW1wdHksIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX2VudW0sIElzRW51bSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfZmluYWwsIElzRmluYWwsIEtFWUNYWCkKIC8vIFRlbnRhdGl2ZSBuYW1lIC0gdGhlcmUncyBubyBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6OmlzX2xpdGVyYWxfdHlwZSB5ZXQuCi1LRVlXT1JEKF9faXNfbGl0ZXJhbCAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfbGl0ZXJhbCwgSXNMaXRlcmFsLCBLRVlDWFgpCiAvLyBOYW1lIGZvciBHQ0MgNC42IGNvbXBhdGliaWxpdHkgLSBwZW9wbGUgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gbGlicmFyaWVzIHVzaW5nCiAvLyB0aGlzIG5hbWUgdW5mb3J0dW5hdGVseS4KLUtFWVdPUkQoX19pc19saXRlcmFsX3R5cGUgICAgICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfcG9kICAgICAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX3BvbHltb3JwaGljICAgICAgICAgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc190cml2aWFsICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfdW5pb24gICAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQorQUxJQVMoIl9faXNfbGl0ZXJhbF90eXBlIiwgX19pc19saXRlcmFsLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19wb2QsIElzUE9ELCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19wb2x5bW9ycGhpYywgSXNQb2x5bW9ycGhpYywgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfdHJpdmlhbCwgSXNUcml2aWFsLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc191bmlvbiwgSXNVbmlvbiwgS0VZQ1hYKQogCiAvLyBDbGFuZy1vbmx5IEMrKyBUeXBlIFRyYWl0cwotS0VZV09SRChfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc190cml2aWFsbHlfYXNzaWduYWJsZSAgICwgS0VZQ1hYKQorVFlQRV9UUkFJVF9OKF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUsIElzVHJpdmlhbGx5Q29uc3RydWN0aWJsZSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfdHJpdmlhbGx5X2NvcHlhYmxlLCBJc1RyaXZpYWxseUNvcHlhYmxlLCBLRVlDWFgpCitUWVBFX1RSQUlUXzIoX19pc190cml2aWFsbHlfYXNzaWduYWJsZSwgSXNUcml2aWFsbHlBc3NpZ25hYmxlLCBLRVlDWFgpCiBLRVlXT1JEKF9fdW5kZXJseWluZ190eXBlICAgICAgICAgICAsIEtFWUNYWCkKIAogLy8gRW1iYXJjYWRlcm8gRXhwcmVzc2lvbiBUcmFpdHMKQEAgLTM5NCwzMyArNDE2LDMzIEBACiBLRVlXT1JEKF9faXNfcnZhbHVlX2V4cHIgICAgICAgICAgICAsIEtFWUNYWCkKIAogLy8gRW1iYXJjYWRlcm8gVW5hcnkgVHlwZSBUcmFpdHMKLUtFWVdPUkQoX19pc19hcml0aG1ldGljICAgICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX2Zsb2F0aW5nX3BvaW50ICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfaW50ZWdyYWwgICAgICAgICAgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc19jb21wbGV0ZV90eXBlICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX3ZvaWQgICAgICAgICAgICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfYXJyYXkgICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc19mdW5jdGlvbiAgICAgICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX3JlZmVyZW5jZSAgICAgICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfbHZhbHVlX3JlZmVyZW5jZSAgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc19ydmFsdWVfcmVmZXJlbmNlICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX2Z1bmRhbWVudGFsICAgICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfb2JqZWN0ICAgICAgICAgICAgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc19zY2FsYXIgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX2NvbXBvdW5kICAgICAgICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfcG9pbnRlciAgICAgICAgICAgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXIgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfbWVtYmVyX3BvaW50ZXIgICAgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc19jb25zdCAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX3ZvbGF0aWxlICAgICAgICAgICAgICAgLCBLRVlDWFgpCi1LRVlXT1JEKF9faXNfc3RhbmRhcmRfbGF5b3V0ICAgICAgICAsIEtFWUNYWCkKLUtFWVdPUkQoX19pc19zaWduZWQgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX3Vuc2lnbmVkICAgICAgICAgICAgICAgLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19hcml0aG1ldGljLCBJc0FyaXRobWV0aWMsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX2Zsb2F0aW5nX3BvaW50LCBJc0Zsb2F0aW5nUG9pbnQsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX2ludGVncmFsLCBJc0ludGVncmFsLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19jb21wbGV0ZV90eXBlLCBJc0NvbXBsZXRlVHlwZSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfdm9pZCwgSXNWb2lkLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19hcnJheSwgSXNBcnJheSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfZnVuY3Rpb24sIElzRnVuY3Rpb24sIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX3JlZmVyZW5jZSwgSXNSZWZlcmVuY2UsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX2x2YWx1ZV9yZWZlcmVuY2UsIElzTHZhbHVlUmVmZXJlbmNlLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19ydmFsdWVfcmVmZXJlbmNlLCBJc1J2YWx1ZVJlZmVyZW5jZSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfZnVuZGFtZW50YWwsIElzRnVuZGFtZW50YWwsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX29iamVjdCwgSXNPYmplY3QsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX3NjYWxhciwgSXNTY2FsYXIsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX2NvbXBvdW5kLCBJc0NvbXBvdW5kLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19wb2ludGVyLCBJc1BvaW50ZXIsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlciwgSXNNZW1iZXJPYmplY3RQb2ludGVyLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlciwgSXNNZW1iZXJGdW5jdGlvblBvaW50ZXIsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX21lbWJlcl9wb2ludGVyLCBJc01lbWJlclBvaW50ZXIsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMShfX2lzX2NvbnN0LCBJc0NvbnN0LCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc192b2xhdGlsZSwgSXNWb2xhdGlsZSwgS0VZQ1hYKQorVFlQRV9UUkFJVF8xKF9faXNfc3RhbmRhcmRfbGF5b3V0LCBJc1N0YW5kYXJkTGF5b3V0LCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc19zaWduZWQsIElzU2lnbmVkLCBLRVlDWFgpCitUWVBFX1RSQUlUXzEoX19pc191bnNpZ25lZCwgSXNVbnNpZ25lZCwgS0VZQ1hYKQogCiAvLyBFbWJhcmNhZGVybyBCaW5hcnkgVHlwZSBUcmFpdHMKLUtFWVdPUkQoX19pc19zYW1lICAgICAgICAgICAgICAgICAgICwgS0VZQ1hYKQotS0VZV09SRChfX2lzX2NvbnZlcnRpYmxlICAgICAgICAgICAgLCBLRVlDWFgpCitUWVBFX1RSQUlUXzIoX19pc19zYW1lLCBJc1NhbWUsIEtFWUNYWCkKK1RZUEVfVFJBSVRfMihfX2lzX2NvbnZlcnRpYmxlLCBJc0NvbnZlcnRpYmxlLCBLRVlDWFgpCiBLRVlXT1JEKF9fYXJyYXlfcmFuayAgICAgICAgICAgICAgICAsIEtFWUNYWCkKIEtFWVdPUkQoX19hcnJheV9leHRlbnQgICAgICAgICAgICAgICwgS0VZQ1hYKQogCkBAIC00MzQsMzUgKzQ1NiwzMSBAQAogS0VZV09SRChfX3N0ZGNhbGwgICAgICAgICAgICAgICAgICAgLCBLRVlBTEwpCiBLRVlXT1JEKF9fZmFzdGNhbGwgICAgICAgICAgICAgICAgICAsIEtFWUFMTCkKIEtFWVdPUkQoX190aGlzY2FsbCAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQotS0VZV09SRChfX2ZvcmNlaW5saW5lICAgICAgICAgICAgICAgLCBLRVlBTEwpCitLRVlXT1JEKF9fZm9yY2VpbmxpbmUgICAgICAgICAgICAgICAsIEtFWU1TKQogS0VZV09SRChfX3VuYWxpZ25lZCAgICAgICAgICAgICAgICAgLCBLRVlNUykKIAotLy8gT3BlbkNMLXNwZWNpZmljIGtleXdvcmRzCi1LRVlXT1JEKF9fa2VybmVsICAgICAgICAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKLUFMSUFTKCJrZXJuZWwiLCBfX2tlcm5lbCAgICAgICAgICAgICwgS0VZT1BFTkNMKQotS0VZV09SRCh2ZWNfc3RlcCAgICAgICAgICAgICAgICAgICAgLCBLRVlPUEVOQ0x8S0VZQUxUSVZFQykKLUtFWVdPUkQoX19wcml2YXRlICAgICAgICAgICAgICAgICAgICwgS0VZT1BFTkNMKQorLy8gT3BlbkNMIGFkZHJlc3Mgc3BhY2UgcXVhbGlmaWVycwogS0VZV09SRChfX2dsb2JhbCAgICAgICAgICAgICAgICAgICAgLCBLRVlPUEVOQ0wpCiBLRVlXT1JEKF9fbG9jYWwgICAgICAgICAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKIEtFWVdPUkQoX19jb25zdGFudCAgICAgICAgICAgICAgICAgICwgS0VZT1BFTkNMKQorS0VZV09SRChfX3ByaXZhdGUgICAgICAgICAgICAgICAgICAgLCBLRVlPUEVOQ0wpCiBBTElBUygiZ2xvYmFsIiwgX19nbG9iYWwgICAgICAgICAgICAsIEtFWU9QRU5DTCkKIEFMSUFTKCJsb2NhbCIsIF9fbG9jYWwgICAgICAgICAgICAgICwgS0VZT1BFTkNMKQogQUxJQVMoImNvbnN0YW50IiwgX19jb25zdGFudCAgICAgICAgLCBLRVlPUEVOQ0wpCitBTElBUygicHJpdmF0ZSIsIF9fcHJpdmF0ZSAgICAgICAgICAsIEtFWU9QRU5DTCkKKy8vIE9wZW5DTCBmdW5jdGlvbiBxdWFsaWZpZXJzCitLRVlXT1JEKF9fa2VybmVsICAgICAgICAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKK0FMSUFTKCJrZXJuZWwiLCBfX2tlcm5lbCAgICAgICAgICAgICwgS0VZT1BFTkNMKQorLy8gT3BlbkNMIGFjY2VzcyBxdWFsaWZpZXJzCiBLRVlXT1JEKF9fcmVhZF9vbmx5ICAgICAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKIEtFWVdPUkQoX193cml0ZV9vbmx5ICAgICAgICAgICAgICAgICwgS0VZT1BFTkNMKQogS0VZV09SRChfX3JlYWRfd3JpdGUgICAgICAgICAgICAgICAgLCBLRVlPUEVOQ0wpCiBBTElBUygicmVhZF9vbmx5IiwgX19yZWFkX29ubHkgICAgICAsIEtFWU9QRU5DTCkKIEFMSUFTKCJ3cml0ZV9vbmx5IiwgX193cml0ZV9vbmx5ICAgICwgS0VZT1BFTkNMKQogQUxJQVMoInJlYWRfd3JpdGUiLCBfX3JlYWRfd3JpdGUgICAgLCBLRVlPUEVOQ0wpCisvLyBPcGVuQ0wgYnVpbHRpbnMKIEtFWVdPUkQoX19idWlsdGluX2FzdHlwZSAgICAgICAgICAgICwgS0VZT1BFTkNMKQotS0VZV09SRChpbWFnZTFkX3QgICAgICAgICAgICAgICAgICAgLCBLRVlPUEVOQ0wpCi1LRVlXT1JEKGltYWdlMWRfYXJyYXlfdCAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKLUtFWVdPUkQoaW1hZ2UxZF9idWZmZXJfdCAgICAgICAgICAgICwgS0VZT1BFTkNMKQotS0VZV09SRChpbWFnZTJkX3QgICAgICAgICAgICAgICAgICAgLCBLRVlPUEVOQ0wpCi1LRVlXT1JEKGltYWdlMmRfYXJyYXlfdCAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKLUtFWVdPUkQoaW1hZ2UzZF90ICAgICAgICAgICAgICAgICAgICwgS0VZT1BFTkNMKQotS0VZV09SRChzYW1wbGVyX3QgICAgICAgICAgICAgICAgICAgLCBLRVlPUEVOQ0wpCi1LRVlXT1JEKGV2ZW50X3QgICAgICAgICAgICAgICAgICAgICAsIEtFWU9QRU5DTCkKK0tFWVdPUkQodmVjX3N0ZXAgICAgICAgICAgICAgICAgICAgICwgS0VZT1BFTkNMfEtFWUFMVElWRUMpCiAKIC8vIEJvcmxhbmQgRXh0ZW5zaW9ucy4KIEtFWVdPUkQoX19wYXNjYWwgICAgICAgICAgICAgICAgICAgICwgS0VZQUxMKQpAQCAtNDc1LDcgKzQ5Myw3IEBACiBBTElBUygiX19mcDE2IiwgaGFsZiAgICAgICAgICAgICAgICAsIEtFWUFMTCkKIAogLy8gT3BlbkNMIEV4dGVuc2lvbi4KLUtFWVdPUkQoaGFsZiAgICAgICAgICAgICAgICAgICAgICAgICwgS0VZT1BFTkNMKQorS0VZV09SRChoYWxmICAgICAgICAgICAgICAgICAgICAgICAgLCBIQUxGU1VQUE9SVCkKIAogLy8gT2JqZWN0aXZlLUMgQVJDIGtleXdvcmRzLgogS0VZV09SRChfX2JyaWRnZSAgICAgICAgICAgICAgICAgICAgICwgS0VZQVJDKQpAQCAtNjU2LDYgKzY3NCwxNiBAQAogLy8gaGFuZGxlcyB0aGVtLgogQU5OT1RBVElPTihwcmFnbWFfZnBfY29udHJhY3QpCiAKKy8vIEFubm90YXRpb24gZm9yICNwcmFnbWEgcG9pbnRlcnNfdG9fbWVtYmVycy4uLgorLy8gVGhlIGxleGVyIHByb2R1Y2VzIHRoZXNlIHNvIHRoYXQgdGhleSBvbmx5IHRha2UgZWZmZWN0IHdoZW4gdGhlIHBhcnNlcgorLy8gaGFuZGxlcyB0aGVtLgorQU5OT1RBVElPTihwcmFnbWFfbXNfcG9pbnRlcnNfdG9fbWVtYmVycykKKworLy8gQW5ub3RhdGlvbiBmb3IgI3ByYWdtYSB2dG9yZGlzcC4uLgorLy8gVGhlIGxleGVyIHByb2R1Y2VzIHRoZXNlIHNvIHRoYXQgdGhleSBvbmx5IHRha2UgZWZmZWN0IHdoZW4gdGhlIHBhcnNlcgorLy8gaGFuZGxlcyB0aGVtLgorQU5OT1RBVElPTihwcmFnbWFfbXNfdnRvcmRpc3ApCisKIC8vIEFubm90YXRpb24gZm9yICNwcmFnbWEgT1BFTkNMIEVYVEVOU0lPTi4uLgogLy8gVGhlIGxleGVyIHByb2R1Y2VzIHRoZXNlIHNvIHRoYXQgdGhleSBvbmx5IHRha2UgZWZmZWN0IHdoZW4gdGhlIHBhcnNlcgogLy8gaGFuZGxlcyB0aGVtLgpAQCAtNjY3LDggKzY5NSwxMCBAQAogQU5OT1RBVElPTihwcmFnbWFfb3Blbm1wKQogQU5OT1RBVElPTihwcmFnbWFfb3Blbm1wX2VuZCkKIAotLy8gQW5ub3RhdGlvbiBmb3IgbW9kdWxlIGltcG9ydCB0cmFuc2xhdGVkIGZyb20gI2luY2x1ZGUgZXRjLgorLy8gQW5ub3RhdGlvbnMgZm9yIG1vZHVsZSBpbXBvcnQgdHJhbnNsYXRlZCBmcm9tICNpbmNsdWRlIGV0Yy4KIEFOTk9UQVRJT04obW9kdWxlX2luY2x1ZGUpCitBTk5PVEFUSU9OKG1vZHVsZV9iZWdpbikKK0FOTk9UQVRJT04obW9kdWxlX2VuZCkKIAogI3VuZGVmIEFOTk9UQVRJT04KICN1bmRlZiBURVNUSU5HX0tFWVdPUkQKQEAgLTY3Nyw2ICs3MDcsMTAgQEAKICN1bmRlZiBDWFhfS0VZV09SRF9PUEVSQVRPUgogI3VuZGVmIFBQS0VZV09SRAogI3VuZGVmIEFMSUFTCisjdW5kZWYgVFlQRV9UUkFJVF9OCisjdW5kZWYgVFlQRV9UUkFJVF8yCisjdW5kZWYgVFlQRV9UUkFJVF8xCisjdW5kZWYgVFlQRV9UUkFJVAogI3VuZGVmIEtFWVdPUkQKICN1bmRlZiBQVU5DVFVBVE9SCiAjdW5kZWYgVE9LCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1Rva2VuS2luZHMuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvVG9rZW5LaW5kcy5oCmluZGV4IGRjYmUxZGEuLjc5NDYyNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvVG9rZW5LaW5kcy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvVG9rZW5LaW5kcy5oCkBAIC0xNSwxMiArMTUsMTQgQEAKICNpZm5kZWYgTExWTV9DTEFOR19UT0tFTktJTkRTX0gKICNkZWZpbmUgTExWTV9DTEFOR19UT0tFTktJTkRTX0gKIAorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorCiBuYW1lc3BhY2UgY2xhbmcgewogCiBuYW1lc3BhY2UgdG9rIHsKIAogLy8vIFxicmllZiBQcm92aWRlcyBhIHNpbXBsZSB1bmlmb3JtIG5hbWVzcGFjZSBmb3IgdG9rZW5zIGZyb20gYWxsIEMgbGFuZ3VhZ2VzLgotZW51bSBUb2tlbktpbmQgeworZW51bSBUb2tlbktpbmQgOiB1bnNpZ25lZCBzaG9ydCB7CiAjZGVmaW5lIFRPSyhYKSBYLAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Rva2VuS2luZHMuZGVmIgogICBOVU1fVE9LRU5TCkBAIC01Miw3ICs1NCw3IEBACiAvLy8KIC8vLyBUaGUgbmFtZSBvZiBhIHRva2VuIHdpbGwgYmUgYW4gaW50ZXJuYWwgbmFtZSAoc3VjaCBhcyAibF9zcXVhcmUiKQogLy8vIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYXMgcGFydCBvZiBkaWFnbm9zdGljIG1lc3NhZ2VzLgotY29uc3QgY2hhciAqZ2V0VG9rZW5OYW1lKGVudW0gVG9rZW5LaW5kIEtpbmQpOworY29uc3QgY2hhciAqZ2V0VG9rZW5OYW1lKFRva2VuS2luZCBLaW5kKSBMTFZNX1JFQUROT05FOwogCiAvLy8gXGJyaWVmIERldGVybWluZXMgdGhlIHNwZWxsaW5nIG9mIHNpbXBsZSBwdW5jdHVhdGlvbiB0b2tlbnMgbGlrZQogLy8vICchJyBvciAnJScsIGFuZCByZXR1cm5zIE5VTEwgZm9yIGxpdGVyYWwgYW5kIGFubm90YXRpb24gdG9rZW5zLgpAQCAtNjEsNyArNjMsMTEgQEAKIC8vLyBhbmQgd2lsbCBub3QgcHJvZHVjZSBhbnkgYWx0ZXJuYXRpdmUgc3BlbGxpbmdzIChlLmcuLCBhCiAvLy8gZGlncmFwaCkuIEZvciB0aGUgYWN0dWFsIHNwZWxsaW5nIG9mIGEgZ2l2ZW4gVG9rZW4sIHVzZQogLy8vIFByZXByb2Nlc3Nvcjo6Z2V0U3BlbGxpbmcoKS4KLWNvbnN0IGNoYXIgKmdldFRva2VuU2ltcGxlU3BlbGxpbmcoZW51bSBUb2tlbktpbmQgS2luZCk7Citjb25zdCBjaGFyICpnZXRQdW5jdHVhdG9yU3BlbGxpbmcoVG9rZW5LaW5kIEtpbmQpIExMVk1fUkVBRE5PTkU7CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB0aGUgc3BlbGxpbmcgb2Ygc2ltcGxlIGtleXdvcmQgYW5kIGNvbnRleHR1YWwga2V5d29yZAorLy8vIHRva2VucyBsaWtlICdpbnQnIGFuZCAnZHluYW1pY19jYXN0Jy4gUmV0dXJucyBOVUxMIGZvciBvdGhlciB0b2tlbiBraW5kcy4KK2NvbnN0IGNoYXIgKmdldEtleXdvcmRTcGVsbGluZyhUb2tlbktpbmQgS2luZCkgTExWTV9SRUFETk9ORTsKIAogLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgcmF3IGlkZW50aWZpZXIgb3IgYW4gaWRlbnRpZmllciBraW5kLgogaW5saW5lIGJvb2wgaXNBbnlJZGVudGlmaWVyKFRva2VuS2luZCBLKSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1R5cGVUcmFpdHMuaCBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvVHlwZVRyYWl0cy5oCmluZGV4IGZjNTM1MjcuLmQ3ZDJiMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQmFzaWMvVHlwZVRyYWl0cy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvVHlwZVRyYWl0cy5oCkBAIC0xNyw4ICsxNyw4IEBACiAKIG5hbWVzcGFjZSBjbGFuZyB7CiAKLSAgLy8vIFxicmllZiBOYW1lcyBmb3IgdGhlIHVuYXJ5IHR5cGUgdHJhaXRzLgotICBlbnVtIFVuYXJ5VHlwZVRyYWl0IHsKKyAgLy8vIFxicmllZiBOYW1lcyBmb3IgdHJhaXRzIHRoYXQgb3BlcmF0ZSBzcGVjaWZpY2FsbHkgb24gdHlwZXMuCisgIGVudW0gVHlwZVRyYWl0IHsKICAgICBVVFRfSGFzTm90aHJvd0Fzc2lnbiwKICAgICBVVFRfSGFzTm90aHJvd01vdmVBc3NpZ24sCiAgICAgVVRUX0hhc05vdGhyb3dDb3B5LApAQCAtMzcsNiArMzcsNyBAQAogICAgIFVUVF9Jc0NvbXBsZXRlVHlwZSwKICAgICBVVFRfSXNDb21wb3VuZCwKICAgICBVVFRfSXNDb25zdCwKKyAgICBVVFRfSXNEZXN0cnVjdGlibGUsCiAgICAgVVRUX0lzRW1wdHksCiAgICAgVVRUX0lzRW51bSwKICAgICBVVFRfSXNGaW5hbCwKQEAgLTUwLDYgKzUxLDcgQEAKICAgICBVVFRfSXNNZW1iZXJGdW5jdGlvblBvaW50ZXIsCiAgICAgVVRUX0lzTWVtYmVyT2JqZWN0UG9pbnRlciwKICAgICBVVFRfSXNNZW1iZXJQb2ludGVyLAorICAgIFVUVF9Jc05vdGhyb3dEZXN0cnVjdGlibGUsCiAgICAgVVRUX0lzT2JqZWN0LAogICAgIFVUVF9Jc1BPRCwKICAgICBVVFRfSXNQb2ludGVyLApAQCAtNjUsMTcgKzY3LDE5IEBACiAgICAgVVRUX0lzVW5pb24sCiAgICAgVVRUX0lzVW5zaWduZWQsCiAgICAgVVRUX0lzVm9pZCwKLSAgICBVVFRfSXNWb2xhdGlsZQotICB9OwotCi0gIC8vLyBcYnJpZWYgTmFtZXMgZm9yIHRoZSBiaW5hcnkgdHlwZSB0cmFpdHMuCi0gIGVudW0gQmluYXJ5VHlwZVRyYWl0IHsKKyAgICBVVFRfSXNWb2xhdGlsZSwKKyAgICBVVFRfTGFzdCA9IFVUVF9Jc1ZvbGF0aWxlLAogICAgIEJUVF9Jc0Jhc2VPZiwKICAgICBCVFRfSXNDb252ZXJ0aWJsZSwKICAgICBCVFRfSXNDb252ZXJ0aWJsZVRvLAogICAgIEJUVF9Jc1NhbWUsCiAgICAgQlRUX1R5cGVDb21wYXRpYmxlLAotICAgIEJUVF9Jc1RyaXZpYWxseUFzc2lnbmFibGUKKyAgICBCVFRfSXNOb3Rocm93QXNzaWduYWJsZSwKKyAgICBCVFRfSXNUcml2aWFsbHlBc3NpZ25hYmxlLAorICAgIEJUVF9MYXN0ID0gQlRUX0lzVHJpdmlhbGx5QXNzaWduYWJsZSwKKyAgICBUVF9Jc0NvbnN0cnVjdGlibGUsCisgICAgVFRfSXNOb3Rocm93Q29uc3RydWN0aWJsZSwKKyAgICBUVF9Jc1RyaXZpYWxseUNvbnN0cnVjdGlibGUKICAgfTsKIAogICAvLy8gXGJyaWVmIE5hbWVzIGZvciB0aGUgYXJyYXkgdHlwZSB0cmFpdHMuCkBAIC05MCwxMiArOTQsNiBAQAogICAgIFVFVFRfQWxpZ25PZiwKICAgICBVRVRUX1ZlY1N0ZXAKICAgfTsKLSAgCi0gIC8vLyBcYnJpZWYgTmFtZXMgZm9yIHR5cGUgdHJhaXRzIHRoYXQgb3BlcmF0ZSBzcGVjaWZpY2FsbHkgb24gdHlwZXMuCi0gIGVudW0gVHlwZVRyYWl0IHsKLSAgICBUVF9Jc1RyaXZpYWxseUNvbnN0cnVjdGlibGUKLSAgfTsKLSAgCiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9WZXJzaW9uLmggYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZlcnNpb24uaAppbmRleCA3ZGI4YTJlLi4wMmRhNDMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZlcnNpb24uaAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZlcnNpb24uaApAQCAtNzAsNiArNzAsOSBAQAogICAvLy8gYW5kIHRoZSB2ZW5kb3IgdGFnLgogICBzdGQ6OnN0cmluZyBnZXRDbGFuZ0Z1bGxWZXJzaW9uKCk7CiAKKyAgLy8vIFxicmllZiBMaWtlIGdldENsYW5nRnVsbFZlcnNpb24oKSwgYnV0IHdpdGggYSBjdXN0b20gdG9vbCBuYW1lLgorICBzdGQ6OnN0cmluZyBnZXRDbGFuZ1Rvb2xGdWxsVmVyc2lvbihsbHZtOjpTdHJpbmdSZWYgVG9vbE5hbWUpOworCiAgIC8vLyBcYnJpZWYgUmV0cmlldmVzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29tcGxldGUgY2xhbmcgdmVyc2lvbiBzdWl0YWJsZQogICAvLy8gZm9yIHVzZSBpbiB0aGUgQ1BQIF9fVkVSU0lPTl9fIG1hY3JvLCB3aGljaCBpbmNsdWRlcyB0aGUgY2xhbmcgdmVyc2lvbgogICAvLy8gbnVtYmVyLCB0aGUgcmVwb3NpdG9yeSB2ZXJzaW9uLCBhbmQgdGhlIHZlbmRvciB0YWcuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZlcnNpb25UdXBsZS5oIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9WZXJzaW9uVHVwbGUuaAppbmRleCBmZjA2YTVjLi41NGQwNmUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZlcnNpb25UdXBsZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvVmVyc2lvblR1cGxlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CiAKQEAgLTg3LDEzICs4OCw4IEBACiAgIC8vLyBJZiBub3QgcHJvdmlkZWQsIG1pbm9yIGFuZCBzdWJtaW5vciB2ZXJzaW9uIG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgdG8gYmUKICAgLy8vIHplcm8uCiAgIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBWZXJzaW9uVHVwbGUgJlgsIGNvbnN0IFZlcnNpb25UdXBsZSAmWSkgewotICAgIGlmIChYLk1ham9yICE9IFkuTWFqb3IpCi0gICAgICByZXR1cm4gWC5NYWpvciA8IFkuTWFqb3I7Ci0KLSAgICBpZiAoWC5NaW5vciAhPSBZLk1pbm9yKQotICAgICAgcmV0dXJuIFguTWlub3IgPCBZLk1pbm9yOwotCi0gICAgcmV0dXJuIFguU3VibWlub3IgPCBZLlN1Ym1pbm9yOworICAgIHJldHVybiBzdGQ6OnRpZShYLk1ham9yLCBYLk1pbm9yLCBYLlN1Ym1pbm9yKSA8CisgICAgICAgICAgIHN0ZDo6dGllKFkuTWFqb3IsIFkuTWlub3IsIFkuU3VibWlub3IpOwogICB9CiAKICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBvbmUgdmVyc2lvbiBudW1iZXIgZm9sbG93cyBhbm90aGVyLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9WaXJ0dWFsRmlsZVN5c3RlbS5oIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9WaXJ0dWFsRmlsZVN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OTVlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZpcnR1YWxGaWxlU3lzdGVtLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8vPT09LSBWaXJ0dWFsRmlsZVN5c3RlbS5oIC0gVmlydHVhbCBGaWxlIFN5c3RlbSBMYXllciAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgRGVmaW5lcyB0aGUgdmlydHVhbCBmaWxlIHN5c3RlbSBpbnRlcmZhY2UgdmZzOjpGaWxlU3lzdGVtLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0JBU0lDX1ZJUlRVQUxfRklMRV9TWVNURU1fSAorI2RlZmluZSBMTFZNX0NMQU5HX0JBU0lDX1ZJUlRVQUxfRklMRV9TWVNURU1fSAorCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvck9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKK30KKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSB2ZnMgeworCisvLy8gXGJyaWVmIFRoZSByZXN1bHQgb2YgYSBccCBzdGF0dXMgb3BlcmF0aW9uLgorY2xhc3MgU3RhdHVzIHsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgbGx2bTo6c3lzOjpmczo6VW5pcXVlSUQgVUlEOworICBsbHZtOjpzeXM6OlRpbWVWYWx1ZSBNVGltZTsKKyAgdWludDMyX3QgVXNlcjsKKyAgdWludDMyX3QgR3JvdXA7CisgIHVpbnQ2NF90IFNpemU7CisgIGxsdm06OnN5czo6ZnM6OmZpbGVfdHlwZSBUeXBlOworICBsbHZtOjpzeXM6OmZzOjpwZXJtcyBQZXJtczsKKworcHVibGljOgorICBTdGF0dXMoKSA6IFR5cGUobGx2bTo6c3lzOjpmczo6ZmlsZV90eXBlOjpzdGF0dXNfZXJyb3IpIHt9CisgIFN0YXR1cyhjb25zdCBsbHZtOjpzeXM6OmZzOjpmaWxlX3N0YXR1cyAmU3RhdHVzKTsKKyAgU3RhdHVzKFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgUmVhbE5hbWUsIGxsdm06OnN5czo6ZnM6OlVuaXF1ZUlEIFVJRCwKKyAgICAgICAgIGxsdm06OnN5czo6VGltZVZhbHVlIE1UaW1lLCB1aW50MzJfdCBVc2VyLCB1aW50MzJfdCBHcm91cCwKKyAgICAgICAgIHVpbnQ2NF90IFNpemUsIGxsdm06OnN5czo6ZnM6OmZpbGVfdHlwZSBUeXBlLAorICAgICAgICAgbGx2bTo6c3lzOjpmczo6cGVybXMgUGVybXMpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGZpbGUgb3IgZGlyZWN0b3J5LgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKyAgdm9pZCBzZXROYW1lKFN0cmluZ1JlZiBOKSB7IE5hbWUgPSBOOyB9CisKKyAgLy8vIEBuYW1lIFN0YXR1cyBpbnRlcmZhY2UgZnJvbSBsbHZtOjpzeXM6OmZzCisgIC8vLyBAeworICBsbHZtOjpzeXM6OmZzOjpmaWxlX3R5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKyAgbGx2bTo6c3lzOjpmczo6cGVybXMgZ2V0UGVybWlzc2lvbnMoKSBjb25zdCB7IHJldHVybiBQZXJtczsgfQorICBsbHZtOjpzeXM6OlRpbWVWYWx1ZSBnZXRMYXN0TW9kaWZpY2F0aW9uVGltZSgpIGNvbnN0IHsgcmV0dXJuIE1UaW1lOyB9CisgIGxsdm06OnN5czo6ZnM6OlVuaXF1ZUlEIGdldFVuaXF1ZUlEKCkgY29uc3QgeyByZXR1cm4gVUlEOyB9CisgIHVpbnQzMl90IGdldFVzZXIoKSBjb25zdCB7IHJldHVybiBVc2VyOyB9CisgIHVpbnQzMl90IGdldEdyb3VwKCkgY29uc3QgeyByZXR1cm4gR3JvdXA7IH0KKyAgdWludDY0X3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKyAgdm9pZCBzZXRUeXBlKGxsdm06OnN5czo6ZnM6OmZpbGVfdHlwZSB2KSB7IFR5cGUgPSB2OyB9CisgIHZvaWQgc2V0UGVybWlzc2lvbnMobGx2bTo6c3lzOjpmczo6cGVybXMgcCkgeyBQZXJtcyA9IHA7IH0KKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBTdGF0dXMgcXVlcmllcworICAvLy8gVGhlc2UgYXJlIHN0YXRpYyBxdWVyaWVzIGluIGxsdm06OnN5czo6ZnMuCisgIC8vLyBAeworICBib29sIGVxdWl2YWxlbnQoY29uc3QgU3RhdHVzICZPdGhlcikgY29uc3Q7CisgIGJvb2wgaXNEaXJlY3RvcnkoKSBjb25zdDsKKyAgYm9vbCBpc1JlZ3VsYXJGaWxlKCkgY29uc3Q7CisgIGJvb2wgaXNPdGhlcigpIGNvbnN0OworICBib29sIGlzU3ltbGluaygpIGNvbnN0OworICBib29sIGlzU3RhdHVzS25vd24oKSBjb25zdDsKKyAgYm9vbCBleGlzdHMoKSBjb25zdDsKKyAgLy8vIEB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYW4gb3BlbiBmaWxlLgorY2xhc3MgRmlsZSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRGVzdHJveSB0aGUgZmlsZSBhZnRlciBjbG9zaW5nIGl0IChpZiBvcGVuKS4KKyAgLy8vIFN1Yi1jbGFzc2VzIHNob3VsZCBnZW5lcmFsbHkgY2FsbCBjbG9zZSgpIGluc2lkZSB0aGVpciBkZXN0cnVjdG9ycy4gIFdlCisgIC8vLyBjYW5ub3QgZG8gdGhhdCBmcm9tIHRoZSBiYXNlIGNsYXNzLCBzaW5jZSBjbG9zZSBpcyB2aXJ0dWFsLgorICB2aXJ0dWFsIH5GaWxlKCk7CisgIC8vLyBcYnJpZWYgR2V0IHRoZSBzdGF0dXMgb2YgdGhlIGZpbGUuCisgIHZpcnR1YWwgbGx2bTo6RXJyb3JPcjxTdGF0dXM+IHN0YXR1cygpID0gMDsKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFzIGEgXHAgTWVtb3J5QnVmZmVyLgorICB2aXJ0dWFsIGxsdm06OmVycm9yX2NvZGUKKyAgZ2V0QnVmZmVyKGNvbnN0IFR3aW5lICZOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiAmUmVzdWx0LAorICAgICAgICAgICAgaW50NjRfdCBGaWxlU2l6ZSA9IC0xLCBib29sIFJlcXVpcmVzTnVsbFRlcm1pbmF0b3IgPSB0cnVlKSA9IDA7CisgIC8vLyBcYnJpZWYgQ2xvc2VzIHRoZSBmaWxlLgorICB2aXJ0dWFsIGxsdm06OmVycm9yX2NvZGUgY2xvc2UoKSA9IDA7CisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgbmFtZSB0byB1c2UgZm9yIHRoaXMgZmlsZS4KKyAgdmlydHVhbCB2b2lkIHNldE5hbWUoU3RyaW5nUmVmIE5hbWUpID0gMDsKK307CisKKy8vLyBcYnJpZWYgVGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0gaW50ZXJmYWNlLgorY2xhc3MgRmlsZVN5c3RlbSA6IHB1YmxpYyBsbHZtOjpUaHJlYWRTYWZlUmVmQ291bnRlZEJhc2U8RmlsZVN5c3RlbT4geworcHVibGljOgorICB2aXJ0dWFsIH5GaWxlU3lzdGVtKCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHN0YXR1cyBvZiB0aGUgZW50cnkgYXQgXHAgUGF0aCwgaWYgb25lIGV4aXN0cy4KKyAgdmlydHVhbCBsbHZtOjpFcnJvck9yPFN0YXR1cz4gc3RhdHVzKGNvbnN0IFR3aW5lICZQYXRoKSA9IDA7CisgIC8vLyBcYnJpZWYgR2V0IGEgXHAgRmlsZSBvYmplY3QgZm9yIHRoZSBmaWxlIGF0IFxwIFBhdGgsIGlmIG9uZSBleGlzdHMuCisgIHZpcnR1YWwgbGx2bTo6ZXJyb3JfY29kZSBvcGVuRmlsZUZvclJlYWQoY29uc3QgVHdpbmUgJlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEZpbGU+ICZSZXN1bHQpID0gMDsKKworICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IG9wZW5zIGEgZmlsZSwgZ2V0cyBpdHMgY29udGVudCBhbmQgdGhlbgorICAvLy8gY2xvc2VzIHRoZSBmaWxlLgorICBsbHZtOjplcnJvcl9jb2RlIGdldEJ1ZmZlckZvckZpbGUoY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiAmUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBGaWxlU2l6ZSA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXF1aXJlc051bGxUZXJtaW5hdG9yID0gdHJ1ZSk7Cit9OworCisvLy8gXGJyaWVmIEdldHMgYW4gXHAgdmZzOjpGaWxlU3lzdGVtIGZvciB0aGUgJ3JlYWwnIGZpbGUgc3lzdGVtLCBhcyBzZWVuIGJ5CisvLy8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uCitJbnRydXNpdmVSZWZDbnRQdHI8RmlsZVN5c3RlbT4gZ2V0UmVhbEZpbGVTeXN0ZW0oKTsKKworLy8vIFxicmllZiBBIGZpbGUgc3lzdGVtIHRoYXQgYWxsb3dzIG92ZXJsYXlpbmcgb25lIFxwIEFic3RyYWN0RmlsZVN5c3RlbSBvbiB0b3AKKy8vLyBvZiBhbm90aGVyLgorLy8vCisvLy8gQ29uc2lzdHMgb2YgYSBzdGFjayBvZiA+PTEgXHAgRmlsZVN5c3RlbSBvYmplY3RzLCB3aGljaCBhcmUgdHJlYXRlZCBhcyBiZWluZworLy8vIG9uZSBtZXJnZWQgZmlsZSBzeXN0ZW0uIFdoZW4gdGhlcmUgaXMgYSBkaXJlY3RvcnkgdGhhdCBleGlzdHMgaW4gbW9yZSB0aGFuCisvLy8gb25lIGZpbGUgc3lzdGVtLCB0aGUgXHAgT3ZlcmxheUZpbGVTeXN0ZW0gY29udGFpbnMgYSBkaXJlY3RvcnkgY29udGFpbmluZworLy8vIHRoZSB1bmlvbiBvZiB0aGVpciBjb250ZW50cy4gIFRoZSBhdHRyaWJ1dGVzIChwZXJtaXNzaW9ucywgZXRjLikgb2YgdGhlCisvLy8gdG9wLW1vc3QgKG1vc3QgcmVjZW50bHkgYWRkZWQpIGRpcmVjdG9yeSBhcmUgdXNlZC4gIFdoZW4gdGhlcmUgaXMgYSBmaWxlCisvLy8gdGhhdCBleGlzdHMgaW4gbW9yZSB0aGFuIG9uZSBmaWxlIHN5c3RlbSwgdGhlIGZpbGUgaW4gdGhlIHRvcC1tb3N0IGZpbGUKKy8vLyBzeXN0ZW0gb3ZlcnJpZGVzIHRoZSBvdGhlcihzKS4KK2NsYXNzIE92ZXJsYXlGaWxlU3lzdGVtIDogcHVibGljIEZpbGVTeXN0ZW0geworICB0eXBlZGVmIFNtYWxsVmVjdG9yPEludHJ1c2l2ZVJlZkNudFB0cjxGaWxlU3lzdGVtPiwgMT4gRmlsZVN5c3RlbUxpc3Q7CisgIHR5cGVkZWYgRmlsZVN5c3RlbUxpc3Q6OnJldmVyc2VfaXRlcmF0b3IgaXRlcmF0b3I7CisKKyAgLy8vIFxicmllZiBUaGUgc3RhY2sgb2YgZmlsZSBzeXN0ZW1zLCBpbXBsZW1lbnRlZCBhcyBhIGxpc3QgaW4gb3JkZXIgb2YKKyAgLy8vIHRoZWlyIGFkZGl0aW9uLgorICBGaWxlU3lzdGVtTGlzdCBGU0xpc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgZmlsZSBzeXN0ZW0uCisgIGl0ZXJhdG9yIG92ZXJsYXlzX2JlZ2luKCkgeyByZXR1cm4gRlNMaXN0LnJiZWdpbigpOyB9CisKKyAgLy8vIFxicmllZiBHZXQgYW4gaXRlcmF0b3IgcG9pbnRpbmcgb25lLXBhc3QgdGhlIGxlYXN0IHJlY2VudGx5IGFkZGVkIGZpbGUKKyAgLy8vIHN5c3RlbS4KKyAgaXRlcmF0b3Igb3ZlcmxheXNfZW5kKCkgeyByZXR1cm4gRlNMaXN0LnJlbmQoKTsgfQorCitwdWJsaWM6CisgIE92ZXJsYXlGaWxlU3lzdGVtKEludHJ1c2l2ZVJlZkNudFB0cjxGaWxlU3lzdGVtPiBCYXNlKTsKKyAgLy8vIFxicmllZiBQdXNoZXMgYSBmaWxlIHN5c3RlbSBvbiB0b3Agb2YgdGhlIHN0YWNrLgorICB2b2lkIHB1c2hPdmVybGF5KEludHJ1c2l2ZVJlZkNudFB0cjxGaWxlU3lzdGVtPiBGUyk7CisKKyAgbGx2bTo6RXJyb3JPcjxTdGF0dXM+IHN0YXR1cyhjb25zdCBUd2luZSAmUGF0aCkgb3ZlcnJpZGU7CisgIGxsdm06OmVycm9yX2NvZGUgb3BlbkZpbGVGb3JSZWFkKGNvbnN0IFR3aW5lICZQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RmlsZT4gJlJlc3VsdCkgb3ZlcnJpZGU7Cit9OworCisvLy8gXGJyaWVmIEdldCBhIGdsb2JhbGx5IHVuaXF1ZSBJRCBmb3IgYSB2aXJ0dWFsIGZpbGUgb3IgZGlyZWN0b3J5LgorbGx2bTo6c3lzOjpmczo6VW5pcXVlSUQgZ2V0TmV4dFZpcnR1YWxVbmlxdWVJRCgpOworCisvLy8gXGJyaWVmIEdldHMgYSBccCBGaWxlU3lzdGVtIGZvciBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0gZGVzY3JpYmVkIGluIFlBTUwKKy8vLyBmb3JtYXQuCisvLy8KKy8vLyBUYWtlcyBvd25lcnNoaXAgb2YgXHAgQnVmZmVyLgorSW50cnVzaXZlUmVmQ250UHRyPEZpbGVTeXN0ZW0+CitnZXRWRlNGcm9tWUFNTChsbHZtOjpNZW1vcnlCdWZmZXIgKkJ1ZmZlciwKKyAgICAgICAgICAgICAgIGxsdm06OlNvdXJjZU1ncjo6RGlhZ0hhbmRsZXJUeSBEaWFnSGFuZGxlciwKKyAgICAgICAgICAgICAgIHZvaWQgKkRpYWdDb250ZXh0ID0gMCwKKyAgICAgICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxGaWxlU3lzdGVtPiBFeHRlcm5hbEZTID0gZ2V0UmVhbEZpbGVTeXN0ZW0oKSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSB2ZnMKK30gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZworI2VuZGlmIC8vIExMVk1fQ0xBTkdfQkFTSUNfVklSVFVBTF9GSUxFX1NZU1RFTV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL2FybV9uZW9uLnRkIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9hcm1fbmVvbi50ZAppbmRleCBiOTE4NDU5Li44ZjdhZTU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL2FybV9uZW9uLnRkCisrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvYXJtX25lb24udGQKQEAgLTMwLDYgKzMwLDcgQEAKIGRlZiBPUF9NTEEgICA6IE9wOwogZGVmIE9QX01MQUwgIDogT3A7CiBkZWYgT1BfTVVMTEhpIDogT3A7CitkZWYgT1BfTVVMTEhpX1A2NCA6IE9wOwogZGVmIE9QX01VTExIaV9OIDogT3A7CiBkZWYgT1BfTUxBTEhpIDogT3A7CiBkZWYgT1BfTUxBTEhpX04gOiBPcDsKQEAgLTE0MCwxMyArMTQxLDE3IEBACiAgIHN0cmluZyBOYW1lID0gbjsKICAgc3RyaW5nIFByb3RvdHlwZSA9IHA7CiAgIHN0cmluZyBUeXBlcyA9IHQ7CisgIHN0cmluZyBBcmNoR3VhcmQgPSAiIjsKKwogICBPcCBPcGVyYW5kID0gbzsKICAgYml0IGlzU2hpZnQgPSAwOwogICBiaXQgaXNTY2FsYXJTaGlmdCA9IDA7CiAgIGJpdCBpc1NjYWxhck5hcnJvd1NoaWZ0ID0gMDsKICAgYml0IGlzVkNWVF9OID0gMDsKLSAgYml0IGlzQTY0ID0gMDsKLSAgYml0IGlzQ3J5cHRvID0gMDsKKyAgLy8gRm9yIGltbWVkaWF0ZSBjaGVja3M6IHRoZSBpbW1lZGlhdGUgd2lsbCBiZSBhc3N1bWVkIHRvIHNwZWNpZnkgdGhlIGxhbmUgb2YKKyAgLy8gYSBRIHJlZ2lzdGVyLiBPbmx5IHVzZWQgZm9yIGludHJpbnNpY3Mgd2hpY2ggZW5kIHVwIGNhbGxpbmcgcG9seW1vcnBoaWMKKyAgLy8gYnVpbHRpbnMuCisgIGJpdCBpc0xhbmVRID0gMDsKIAogICAvLyBDZXJ0YWluIGludHJpbnNpY3MgaGF2ZSBkaWZmZXJlbnQgbmFtZXMgdGhhbiB0aGVpciByZXByZXNlbnRhdGl2ZQogICAvLyBpbnN0cnVjdGlvbnMuIFRoaXMgZmllbGQgYWxsb3dzIHVzIHRvIGhhbmRsZSB0aGlzIGNvcnJlY3RseSB3aGVuIHdlCkBAIC0yMjQsNiArMjI5LDcgQEAKIC8vIHM6IHNob3J0CiAvLyBpOiBpbnQKIC8vIGw6IGxvbmcKKy8vIGs6IDEyOC1iaXQgbG9uZwogLy8gZjogZmxvYXQKIC8vIGg6IGhhbGYtZmxvYXQKIC8vIGQ6IGRvdWJsZQpAQCAtNDA0LDkgKzQxMCwxMSBAQAogLy8gRS4zLjE5IFNldCBhbGwgbGFuZXMgdG8gc2FtZSB2YWx1ZQogbGV0IEluc3ROYW1lID0gInZtb3YiIGluIHsKIGRlZiBWRFVQX04gICA6IFdPcEluc3Q8InZkdXBfbiIsICJkcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICJVY1VzVWljc2lQY1BzZlFVY1FVc1FVaVFjUXNRaVFQY1FQc1FmbFVsUWxRVWwiLCBPUF9EVVA+OworICAgICAgICAgICAgICAgICAgICAgICAiVWNVc1VpY3NpUGNQc2hmUVVjUVVzUVVpUWNRc1FpUVBjUVBzUWhRZmxVbFFsUVVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BfRFVQPjsKIGRlZiBWTU9WX04gICA6IFdPcEluc3Q8InZtb3ZfbiIsICJkcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICJVY1VzVWljc2lQY1BzZlFVY1FVc1FVaVFjUXNRaVFQY1FQc1FmbFVsUWxRVWwiLCBPUF9EVVA+OworICAgICAgICAgICAgICAgICAgICAgICAiVWNVc1VpY3NpUGNQc2hmUVVjUVVzUVVpUWNRc1FpUVBjUVBzUWhRZmxVbFFsUVVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BfRFVQPjsKIH0KIGxldCBJbnN0TmFtZSA9ICIiIGluCiBkZWYgVkRVUF9MQU5FOiBXT3BJbnN0PCJ2ZHVwX2xhbmUiLCAiZGdpIiwKQEAgLTU0MCw4NyArNTQ4LDY2IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQUFyY2g2NCBJbnRyaW5zaWNzCiAKLWxldCBpc0E2NCA9IDEgaW4geworbGV0IEFyY2hHdWFyZCA9ICJkZWZpbmVkKF9fYWFyY2g2NF9fKSIgaW4gewogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gTG9hZC9TdG9yZQotLy8gV2l0aCBhZGRpdGlvbmFsIFFVbCwgUWwsIGQsIFFkLCBQbCwgUVBsIHR5cGUuCi1kZWYgTEQxIDogV0luc3Q8InZsZDEiLCAiZGMiLAotICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRVWxRY1FzUWlRbFFoUWZRZFFQY1FQc1VjVXNVaVVsY3NpbGhmZFBjUHNQbFFQbCI+OwotZGVmIExEMiA6IFdJbnN0PCJ2bGQyIiwgIjJjIiwKLSAgICAgICAgICAgICAgICAiUVVjUVVzUVVpUVVsUWNRc1FpUWxRaFFmUWRRUGNRUHNVY1VzVWlVbGNzaWxoZmRQY1BzUGxRUGwiPjsKLWRlZiBMRDMgOiBXSW5zdDwidmxkMyIsICIzYyIsCi0gICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFVbFFjUXNRaVFsUWhRZlFkUVBjUVBzVWNVc1VpVWxjc2lsaGZkUGNQc1BsUVBsIj47Ci1kZWYgTEQ0IDogV0luc3Q8InZsZDQiLCAiNGMiLAotICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRVWxRY1FzUWlRbFFoUWZRZFFQY1FQc1VjVXNVaVVsY3NpbGhmZFBjUHNQbFFQbCI+OwotZGVmIFNUMSA6IFdJbnN0PCJ2c3QxIiwgInZwZCIsCi0gICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFVbFFjUXNRaVFsUWhRZlFkUVBjUVBzVWNVc1VpVWxjc2lsaGZkUGNQc1BsUVBsIj47Ci1kZWYgU1QyIDogV0luc3Q8InZzdDIiLCAidnAyIiwKLSAgICAgICAgICAgICAgICAiUVVjUVVzUVVpUVVsUWNRc1FpUWxRaFFmUWRRUGNRUHNVY1VzVWlVbGNzaWxoZmRQY1BzUGxRUGwiPjsKLWRlZiBTVDMgOiBXSW5zdDwidnN0MyIsICJ2cDMiLAotICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRVWxRY1FzUWlRbFFoUWZRZFFQY1FQc1VjVXNVaVVsY3NpbGhmZFBjUHNQbFFQbCI+OwotZGVmIFNUNCA6IFdJbnN0PCJ2c3Q0IiwgInZwNCIsCi0gICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFVbFFjUXNRaVFsUWhRZlFkUVBjUVBzVWNVc1VpVWxjc2lsaGZkUGNQc1BsUVBsIj47CitkZWYgTEQxIDogV0luc3Q8InZsZDEiLCAiZGMiLCAiZFFkUGxRUGwiPjsKK2RlZiBMRDIgOiBXSW5zdDwidmxkMiIsICIyYyIsICJRVWxRbGRRZFBsUVBsIj47CitkZWYgTEQzIDogV0luc3Q8InZsZDMiLCAiM2MiLCAiUVVsUWxkUWRQbFFQbCI+OworZGVmIExENCA6IFdJbnN0PCJ2bGQ0IiwgIjRjIiwgIlFVbFFsZFFkUGxRUGwiPjsKK2RlZiBTVDEgOiBXSW5zdDwidnN0MSIsICJ2cGQiLCAiZFFkUGxRUGwiPjsKK2RlZiBTVDIgOiBXSW5zdDwidnN0MiIsICJ2cDIiLCAiUVVsUWxkUWRQbFFQbCI+OworZGVmIFNUMyA6IFdJbnN0PCJ2c3QzIiwgInZwMyIsICJRVWxRbGRRZFBsUVBsIj47CitkZWYgU1Q0IDogV0luc3Q8InZzdDQiLCAidnA0IiwgIlFVbFFsZFFkUGxRUGwiPjsKIAogZGVmIExEMV9YMiA6IFdJbnN0PCJ2bGQxX3gyIiwgIjJjIiwKLSAgICAgICAgICAgICAgICAgICAiUVVjUVVzUVVpUVVsUWNRc1FpUWxRaFFmUWRRUGNRUHNRUGxVY1VzVWlVbGNzaWxoZmRQY1BzUGwiPjsKKyAgICAgICAgICAgICAgICAgICAiUVVjUVVzUVVpUWNRc1FpUWhRZlFQY1FQc1VjVXNVaVVsY3NpbGhmUGNQc1FVbFFsZFFkUGxRUGwiPjsKIGRlZiBMRDNfeDMgOiBXSW5zdDwidmxkMV94MyIsICIzYyIsCi0gICAgICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFVbFFjUXNRaVFsUWhRZlFkUVBjUVBzUVBsVWNVc1VpVWxjc2lsaGZkUGNQc1BsIj47CisgICAgICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFjUXNRaVFoUWZRUGNRUHNVY1VzVWlVbGNzaWxoZlBjUHNRVWxRbGRRZFBsUVBsIj47CiBkZWYgTEQ0X3g0IDogV0luc3Q8InZsZDFfeDQiLCAiNGMiLAotICAgICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRVWxRY1FzUWlRbFFoUWZRZFFQY1FQc1FQbFVjVXNVaVVsY3NpbGhmZFBjUHNQbCI+OworICAgICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRY1FzUWlRaFFmUVBjUVBzVWNVc1VpVWxjc2lsaGZQY1BzUVVsUWxkUWRQbFFQbCI+OwogCiBkZWYgU1QxX1gyIDogV0luc3Q8InZzdDFfeDIiLCAidnAyIiwKLSAgICAgICAgICAgICAgICAgICAiUVVjUVVzUVVpUVVsUWNRc1FpUWxRaFFmUWRRUGNRUHNRUGxVY1VzVWlVbGNzaWxoZmRQY1BzUGwiPjsKKyAgICAgICAgICAgICAgICAgICAiUVVjUVVzUVVpUWNRc1FpUWhRZlFQY1FQc1VjVXNVaVVsY3NpbGhmUGNQc1FVbFFsZFFkUGxRUGwiPjsKIGRlZiBTVDFfWDMgOiBXSW5zdDwidnN0MV94MyIsICJ2cDMiLAotICAgICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRVWxRY1FzUWlRbFFoUWZRZFFQY1FQc1FQbFVjVXNVaVVsY3NpbGhmZFBjUHNQbCI+OworICAgICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRY1FzUWlRaFFmUVBjUVBzVWNVc1VpVWxjc2lsaGZQY1BzUVVsUWxkUWRQbFFQbCI+OwogZGVmIFNUMV9YNCA6IFdJbnN0PCJ2c3QxX3g0IiwgInZwNCIsCi0gICAgICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFVbFFjUXNRaVFsUWhRZlFkUVBjUVBzUVBsVWNVc1VpVWxjc2lsaGZkUGNQc1BsIj47CisgICAgICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFjUXNRaVFoUWZRUGNRUHNVY1VzVWlVbGNzaWxoZlBjUHNRVWxRbGRRZFBsUVBsIj47CiAKLS8vIFdpdGggYWRkaXRpb25hbCBRVWwsIFFsLCBkLCBRZCwgUGwsIFFQbCB0eXBlLgotZGVmIExEMV9MQU5FIDogV0luc3Q8InZsZDFfbGFuZSIsICJkY2RpIiwKLSAgICAgICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFVbFFjUXNRaVFsUWhRZlFkUVBjUVBzUVBsVWNVc1VpVWxjc2lsaGZkUGNQc1BsIj47Ci1kZWYgTEQyX0xBTkUgOiBXSW5zdDwidmxkMl9sYW5lIiwgIjJjMmkiLAotICAgICAgICAgICAgICAgICAgICAiUVVjUVVzUVVpUVVsUWNRc1FpUWxRaFFmUWRRUGNRUHNRUGxVY1VzVWlVbGNzaWxoZmRQY1BzUGwiPjsKLWRlZiBMRDNfTEFORSA6IFdJbnN0PCJ2bGQzX2xhbmUiLCAiM2MzaSIsCi0gICAgICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRVWxRY1FzUWlRbFFoUWZRZFFQY1FQc1FQbFVjVXNVaVVsY3NpbGhmZFBjUHNQbCI+OwotZGVmIExENF9MQU5FIDogV0luc3Q8InZsZDRfbGFuZSIsICI0YzRpIiwKLSAgICAgICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFVbFFjUXNRaVFsUWhRZlFkUVBjUVBzUVBsVWNVc1VpVWxjc2lsaGZkUGNQc1BsIj47Ci1kZWYgU1QxX0xBTkUgOiBXSW5zdDwidnN0MV9sYW5lIiwgInZwZGkiLAotICAgICAgICAgICAgICAgICAgICAiUVVjUVVzUVVpUVVsUWNRc1FpUWxRaFFmUWRRUGNRUHNRUGxVY1VzVWlVbGNzaWxoZmRQY1BzUGwiPjsKLWRlZiBTVDJfTEFORSA6IFdJbnN0PCJ2c3QyX2xhbmUiLCAidnAyaSIsCi0gICAgICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRVWxRY1FzUWlRbFFoUWZRZFFQY1FQc1FQbFVjVXNVaVVsY3NpbGhmZFBjUHNQbCI+OwotZGVmIFNUM19MQU5FIDogV0luc3Q8InZzdDNfbGFuZSIsICJ2cDNpIiwKLSAgICAgICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFVbFFjUXNRaVFsUWhRZlFkUVBjUVBzUVBsVWNVc1VpVWxjc2lsaGZkUGNQc1BsIj47Ci1kZWYgU1Q0X0xBTkUgOiBXSW5zdDwidnN0NF9sYW5lIiwgInZwNGkiLAotICAgICAgICAgICAgICAgICAgICAiUVVjUVVzUVVpUVVsUWNRc1FpUWxRaFFmUWRRUGNRUHNRUGxVY1VzVWlVbGNzaWxoZmRQY1BzUGwiPjsKK2RlZiBMRDFfTEFORSA6IFdJbnN0PCJ2bGQxX2xhbmUiLCAiZGNkaSIsICJkUWRQbFFQbCI+OworZGVmIExEMl9MQU5FIDogV0luc3Q8InZsZDJfbGFuZSIsICIyYzJpIiwgImxVbFFjUVVjUVBjUWxRVWxkUWRQbFFQbCI+OworZGVmIExEM19MQU5FIDogV0luc3Q8InZsZDNfbGFuZSIsICIzYzNpIiwgImxVbFFjUVVjUVBjUWxRVWxkUWRQbFFQbCI+OworZGVmIExENF9MQU5FIDogV0luc3Q8InZsZDRfbGFuZSIsICI0YzRpIiwgImxVbFFjUVVjUVBjUWxRVWxkUWRQbFFQbCI+OworZGVmIFNUMV9MQU5FIDogV0luc3Q8InZzdDFfbGFuZSIsICJ2cGRpIiwgImRRZFBsUVBsIj47CitkZWYgU1QyX0xBTkUgOiBXSW5zdDwidnN0Ml9sYW5lIiwgInZwMmkiLCAibFVsUWNRVWNRUGNRbFFVbGRRZFBsUVBsIj47CitkZWYgU1QzX0xBTkUgOiBXSW5zdDwidnN0M19sYW5lIiwgInZwM2kiLCAibFVsUWNRVWNRUGNRbFFVbGRRZFBsUVBsIj47CitkZWYgU1Q0X0xBTkUgOiBXSW5zdDwidnN0NF9sYW5lIiwgInZwNGkiLCAibFVsUWNRVWNRUGNRbFFVbGRRZFBsUVBsIj47CiAKLWRlZiBMRDFfRFVQICA6IFdJbnN0PCJ2bGQxX2R1cCIsICJkYyIsCi0gICAgICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRVWxRY1FzUWlRbFFoUWZRZFFQY1FQc1FQbFVjVXNVaVVsY3NpbGhmZFBjUHNQbCI+OworZGVmIExEMV9EVVAgIDogV0luc3Q8InZsZDFfZHVwIiwgImRjIiwgImRRZFBsUVBsIj47CiBkZWYgTEQyX0RVUCAgOiBXSW5zdDwidmxkMl9kdXAiLCAiMmMiLAotICAgICAgICAgICAgICAgICAgICAiUVVjUVVzUVVpUVVsUWNRc1FpUWxRaFFmUWRRUGNRUHNRUGxVY1VzVWlVbGNzaWxoZmRQY1BzUGwiPjsKKyAgICAgICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRVWxRY1FzUWlRbFFoUWZRZFFQY1FQc1FQbGRQbCI+OwogZGVmIExEM19EVVAgIDogV0luc3Q8InZsZDNfZHVwIiwgIjNjIiwKLSAgICAgICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFVbFFjUXNRaVFsUWhRZlFkUVBjUVBzUVBsVWNVc1VpVWxjc2lsaGZkUGNQc1BsIj47CisgICAgICAgICAgICAgICAgICAgICAiUVVjUVVzUVVpUVVsUWNRc1FpUWxRaFFmUWRRUGNRUHNRUGxkUGwiPjsKIGRlZiBMRDRfRFVQICA6IFdJbnN0PCJ2bGQ0X2R1cCIsICI0YyIsCi0gICAgICAgICAgICAgICAgICAgICJRVWNRVXNRVWlRVWxRY1FzUWlRbFFoUWZRZFFQY1FQc1FQbFVjVXNVaVVsY3NpbGhmZFBjUHNQbCI+OworICAgICAgICAgICAgICAgICAgICAgIlFVY1FVc1FVaVFVbFFjUXNRaVFsUWhRZlFkUVBjUVBzUVBsZFBsIj47CisKK2RlZiBWTERSUSA6IFdJbnN0PCJ2bGRycSIsICJzYyIsICJQayI+OworZGVmIFZTVFJRIDogV0luc3Q8InZzdHJxIiwgInZwcyIsICJQayI+OwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQWRkaXRpb24KLS8vIFdpdGggYWRkaXRpb25hbCBkLCBRZCB0eXBlLgotZGVmIEFERCA6IElPcEluc3Q8InZhZGQiLCAiZGRkIiwgImNzaWxmZFVjVXNVaVVsUWNRc1FpUWxRZlFVY1FVc1FVaVFVbFFkIiwKLSAgICAgICAgICAgICAgICAgIE9QX0FERD47CitkZWYgQUREIDogSU9wSW5zdDwidmFkZCIsICJkZGQiLCAiZFFkIiwgT1BfQUREPjsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFN1YnRyYWN0aW9uCi0vLyBXaXRoIGFkZGl0aW9uYWwgUWQgdHlwZS4KLWRlZiBTVUIgOiBJT3BJbnN0PCJ2c3ViIiwgImRkZCIsICJjc2lsZGZVY1VzVWlVbFFjUXNRaVFsUWZRVWNRVXNRVWlRVWxRZCIsCi0gICAgICAgICAgICAgICAgICBPUF9TVUI+OworZGVmIFNVQiA6IElPcEluc3Q8InZzdWIiLCAiZGRkIiwgImRRZCIsIE9QX1NVQj47CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBNdWx0aXBsaWNhdGlvbgotLy8gV2l0aCBhZGRpdGlvbmFsIFFkIHR5cGUuCi1kZWYgTVVMICAgICA6IElPcEluc3Q8InZtdWwiLCAiZGRkIiwgImNzaWZkVWNVc1VpUWNRc1FpUWZRVWNRVXNRVWlRZCIsIE9QX01VTD47Ci1kZWYgTUxBICAgICA6IElPcEluc3Q8InZtbGEiLCAiZGRkZCIsICJjc2lmZFVjVXNVaVFjUXNRaVFmUVVjUVVzUVVpUWQiLCBPUF9NTEE+OwotZGVmIE1MUyAgICAgOiBJT3BJbnN0PCJ2bWxzIiwgImRkZGQiLCAiY3NpZmRVY1VzVWlRY1FzUWlRZlFVY1FVc1FVaVFkIiwgT1BfTUxTPjsKK2RlZiBNVUwgICAgIDogSU9wSW5zdDwidm11bCIsICJkZGQiLCAiZFFkIiwgT1BfTVVMPjsKK2RlZiBNTEEgICAgIDogSU9wSW5zdDwidm1sYSIsICJkZGRkIiwgImRRZCIsIE9QX01MQT47CitkZWYgTUxTICAgICA6IElPcEluc3Q8InZtbHMiLCAiZGRkZCIsICJkUWQiLCBPUF9NTFM+OwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gTXVsdGlwbGljYXRpb24gRXh0ZW5kZWQKQEAgLTYzMiwzNCArNjE5LDMzIEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBWZWN0b3IgZnVzZWQgbXVsdGlwbHktYWRkIG9wZXJhdGlvbnMKLS8vIFdpdGggYWRkaXRpb25hbCBkLCBRZCB0eXBlLgotZGVmIEZNTEEgOiBTSW5zdDwidmZtYSIsICJkZGRkIiwgImZkUWZRZCI+OworZGVmIEZNTEEgOiBTSW5zdDwidmZtYSIsICJkZGRkIiwgImRRZCI+OwogZGVmIEZNTFMgOiBTSW5zdDwidmZtcyIsICJkZGRkIiwgImZkUWZRZCI+OwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTVVMLCBGTUEsIEZNUyBkZWZpbml0aW9ucyB3aXRoIHNjYWxhciBhcmd1bWVudAorLy8gTVVMLCBNTEEsIE1MUywgRk1BLCBGTVMgZGVmaW5pdGlvbnMgd2l0aCBzY2FsYXIgYXJndW1lbnQKIGRlZiBWTVVMX05fQTY0IDogSU9wSW5zdDwidm11bF9uIiwgImRkcyIsICJRZCIsIE9QX01VTF9OPjsKLWRlZiBGTUxBX04gOiBTT3BJbnN0PCJ2Zm1hX24iLCAiZGRkcyIsICJmUWYiLCBPUF9GTUxBX04+OwotZGVmIEZNTFNfTiA6IFNPcEluc3Q8InZmbXNfbiIsICJkZGRzIiwgImZRZiIsIE9QX0ZNTFNfTj47CisKK2RlZiBGTUxBX04gOiBTT3BJbnN0PCJ2Zm1hX24iLCAiZGRkcyIsICJmUWZRZCIsIE9QX0ZNTEFfTj47CitkZWYgRk1MU19OIDogU09wSW5zdDwidmZtc19uIiwgImRkZHMiLCAiZlFmUWQiLCBPUF9GTUxTX04+OworCitkZWYgTUxBX04gOiBTT3BJbnN0PCJ2bWxhX24iLCAiZGRkcyIsICJRZCIsIE9QX01MQV9OPjsKK2RlZiBNTFNfTiA6IFNPcEluc3Q8InZtbHNfbiIsICJkZGRzIiwgIlFkIiwgT1BfTUxTX04+OwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gTG9naWNhbCBvcGVyYXRpb25zCi0vLyBXaXRoIGFkZGl0aW9uYWwgUWQsIFFsLCBRUGwgdHlwZS4KLWRlZiBCU0wgOiBTSW5zdDwidmJzbCIsICJkdWRkIiwKLSAgICAgICAgICAgICAgICAiY3NpbFVjVXNVaVVsZmRQY1BzUWNRc1FpUWxRVWNRVXNRVWlRVWxRZlFQY1FQc1FkUGxRUGwiPjsKK2RlZiBCU0wgOiBTSW5zdDwidmJzbCIsICJkdWRkIiwgImRQbFFkUVBsIj47CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBBYnNvbHV0ZSBEaWZmZXJlbmNlCi0vLyBXaXRoIGFkZGl0aW9uYWwgUWQgdHlwZS4KLWRlZiBBQkQgIDogU0luc3Q8InZhYmQiLCAiZGRkIiwgICJjc2lVY1VzVWlmZFFjUXNRaVFVY1FVc1FVaVFmUWQiPjsKK2RlZiBBQkQgIDogU0luc3Q8InZhYmQiLCAiZGRkIiwgICJkUWQiPjsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIHNhdHVyYXRpbmcgYWJzb2x1dGUvbmVnYXRlCi0vLyBXaXRoIGFkZGl0aW9uYWwgUWQvUWwgdHlwZS4KLWRlZiBBQlMgICAgOiBTSW5zdDwidmFicyIsICJkZCIsICJjc2lsZmRRY1FzUWlRZlFsUWQiPjsKLWRlZiBRQUJTICAgOiBTSW5zdDwidnFhYnMiLCAiZGQiLCAiY3NpbFFjUXNRaVFsIj47Ci1kZWYgTkVHICAgIDogU09wSW5zdDwidm5lZyIsICJkZCIsICJjc2lsZmRRY1FzUWlRZlFkUWwiLCBPUF9ORUc+OwotZGVmIFFORUcgICA6IFNJbnN0PCJ2cW5lZyIsICJkZCIsICJjc2lsUWNRc1FpUWwiPjsKK2RlZiBBQlMgICAgOiBTSW5zdDwidmFicyIsICJkZCIsICJkUWRsUWwiPjsKK2RlZiBRQUJTICAgOiBTSW5zdDwidnFhYnMiLCAiZGQiLCAibFFsIj47CitkZWYgTkVHICAgIDogU09wSW5zdDwidm5lZyIsICJkZCIsICJkbFFkUWwiLCBPUF9ORUc+OworZGVmIFFORUcgICA6IFNJbnN0PCJ2cW5lZyIsICJkZCIsICJsUWwiPjsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFNpZ25lZCBTYXR1cmF0aW5nIEFjY3VtdWxhdGVkIG9mIFVuc2lnbmVkIFZhbHVlCkBAIC02NzEsOSArNjU3LDggQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFJlY2lwcm9jYWwvU3FydAotLy8gV2l0aCBhZGRpdGlvbmFsIGQsIFFkIHR5cGUuCi1kZWYgRlJFQ1BTICA6IElJbnN0PCJ2cmVjcHMiLCAiZGRkIiwgImZkUWZRZCI+OwotZGVmIEZSU1FSVFMgOiBJSW5zdDwidnJzcXJ0cyIsICJkZGQiLCAiZmRRZlFkIj47CitkZWYgRlJFQ1BTICA6IElJbnN0PCJ2cmVjcHMiLCAiZGRkIiwgImRRZCI+OworZGVmIEZSU1FSVFMgOiBJSW5zdDwidnJzcXJ0cyIsICJkZGQiLCAiZFFkIj47CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBiaXR3aXNlIHJldmVyc2UKQEAgLTY5NSw3ICs2ODAsNyBAQAogLy8gQ29udmVydGluZyB2ZWN0b3JzCiBkZWYgVkNWVF9ISUdIX0YxNiA6IFNPcEluc3Q8InZjdnRfaGlnaF9mMTYiLCAicWhqIiwgImYiLCBPUF9WQ1ZUX05BX0hJPjsKIGRlZiBWQ1ZUX0hJR0hfRjMyX0YxNiA6IFNPcEluc3Q8InZjdnRfaGlnaF9mMzIiLCAid2siLCAiaCIsIE9QX1ZDVlRfRVhfSEk+OwotZGVmIFZDVlRfRjMyX0Y2NCA6IFNJbnN0PCJ2Y3Z0X2YzMl9mNjQiLCAiZmoiLCAiZCI+OworZGVmIFZDVlRfRjMyX0Y2NCA6IFNJbnN0PCJ2Y3Z0X2YzMl9mNjQiLCAibWoiLCAiZCI+OwogZGVmIFZDVlRfSElHSF9GMzJfRjY0IDogU09wSW5zdDwidmN2dF9oaWdoX2YzMiIsICJxZmoiLCAiZCIsIE9QX1ZDVlRfTkFfSEk+OwogZGVmIFZDVlRfRjY0X0YzMiA6IFNJbnN0PCJ2Y3Z0X2Y2NF9mMzIiLCAid2QiLCAiZiI+OwogZGVmIFZDVlRfRjY0IDogU0luc3Q8InZjdnRfZjY0IiwgIkZkIiwgICJsVWxRbFFVbCI+OwpAQCAtNzExLDQ3ICs2OTYsMjIgQEAKIGRlZiBGUklOVEkgOiBTSW5zdDwidnJuZGkiLCAiZGQiLCAiZmRRZlFkIj47CiBkZWYgVkNWVF9TNjQgOiBTSW5zdDwidmN2dF9zNjQiLCAieGQiLCAgImRRZCI+OwogZGVmIFZDVlRfVTY0IDogU0luc3Q8InZjdnRfdTY0IiwgInVkIiwgICJkUWQiPjsKLWRlZiBGQ1ZUTlNfUzMyIDogU0luc3Q8InZjdnRuX3MzMiIsICJ4ZCIsICJmUWYiPjsKLWRlZiBGQ1ZUTlNfUzY0IDogU0luc3Q8InZjdnRuX3M2NCIsICJ4ZCIsICJkUWQiPjsKLWRlZiBGQ1ZUTlVfUzMyIDogU0luc3Q8InZjdnRuX3UzMiIsICJ1ZCIsICJmUWYiPjsKLWRlZiBGQ1ZUTlVfUzY0IDogU0luc3Q8InZjdnRuX3U2NCIsICJ1ZCIsICJkUWQiPjsKLWRlZiBGQ1ZUUFNfUzMyIDogU0luc3Q8InZjdnRwX3MzMiIsICJ4ZCIsICJmUWYiPjsKLWRlZiBGQ1ZUUFNfUzY0IDogU0luc3Q8InZjdnRwX3M2NCIsICJ4ZCIsICJkUWQiPjsKLWRlZiBGQ1ZUUFVfUzMyIDogU0luc3Q8InZjdnRwX3UzMiIsICJ1ZCIsICJmUWYiPjsKLWRlZiBGQ1ZUUFVfUzY0IDogU0luc3Q8InZjdnRwX3U2NCIsICJ1ZCIsICJkUWQiPjsKLWRlZiBGQ1ZUTVNfUzMyIDogU0luc3Q8InZjdnRtX3MzMiIsICJ4ZCIsICJmUWYiPjsKLWRlZiBGQ1ZUTVNfUzY0IDogU0luc3Q8InZjdnRtX3M2NCIsICJ4ZCIsICJkUWQiPjsKLWRlZiBGQ1ZUTVVfUzMyIDogU0luc3Q8InZjdnRtX3UzMiIsICJ1ZCIsICJmUWYiPjsKLWRlZiBGQ1ZUTVVfUzY0IDogU0luc3Q8InZjdnRtX3U2NCIsICJ1ZCIsICJkUWQiPjsKLWRlZiBGQ1ZUQVNfUzMyIDogU0luc3Q8InZjdnRhX3MzMiIsICJ4ZCIsICJmUWYiPjsKLWRlZiBGQ1ZUQVNfUzY0IDogU0luc3Q8InZjdnRhX3M2NCIsICJ4ZCIsICJkUWQiPjsKLWRlZiBGQ1ZUQVVfUzMyIDogU0luc3Q8InZjdnRhX3UzMiIsICJ1ZCIsICJmUWYiPjsKLWRlZiBGQ1ZUQVVfUzY0IDogU0luc3Q8InZjdnRhX3U2NCIsICJ1ZCIsICJkUWQiPjsKLWRlZiBGUkVDUEUgIDogU0luc3Q8InZyZWNwZSIsICJkZCIsICJmZFVpUWZRVWlRZCI+OwotZGVmIEZSU1FSVEUgOiBTSW5zdDwidnJzcXJ0ZSIsICJkZCIsICJmZFVpUWZRVWlRZCI+OworZGVmIEZSRUNQRSAgOiBTSW5zdDwidnJlY3BlIiwgImRkIiwgImRRZCI+OworZGVmIEZSU1FSVEUgOiBTSW5zdDwidnJzcXJ0ZSIsICJkZCIsICJkUWQiPjsKIGRlZiBGU1FSVCAgIDogU0luc3Q8InZzcXJ0IiwgImRkIiwgImZkUWZRZCI+OwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQ29tcGFyaXNvbgotLy8gV2l0aCBhZGRpdGlvbmFsIFFkLCBRbCwgUVBsIHR5cGUuCi1kZWYgRkNBR0UgOiBJSW5zdDwidmNhZ2UiLCAidWRkIiwgImZkUWZRZCI+OwotZGVmIEZDQUdUIDogSUluc3Q8InZjYWd0IiwgInVkZCIsICJmZFFmUWQiPjsKLWRlZiBGQ0FMRSA6IElJbnN0PCJ2Y2FsZSIsICJ1ZGQiLCAiZmRRZlFkIj47Ci1kZWYgRkNBTFQgOiBJSW5zdDwidmNhbHQiLCAidWRkIiwgImZkUWZRZCI+OwotLy8gV2l0aCBhZGRpdGlvbmFsIFFsLCBRVWwsIFFkIHR5cGVzLgotZGVmIENNVFNUICA6IFdJbnN0PCJ2dHN0IiwgInVkZCIsCi0gICAgICAgICAgICAgICAgICAgImNzaVVjVXNVaVBjUHNRY1FzUWlRVWNRVXNRVWlRUGNRUHNsVWxRbFFVbFBsUVBsIj47Ci0vLyBXaXRoIGFkZGl0aW9uYWwgbCwgVWwsZCwgUWQsIFFsLCBRVWwsIFFkIHR5cGVzLgotZGVmIENGTUVRICA6IFNPcEluc3Q8InZjZXEiLCAidWRkIiwKLSAgICAgICAgICAgICAgICAgICAgICJjc2lsZlVjVXNVaVVsUGNRY2RRZFFzUWlRZlFVY1FVc1FVaVFVbFFsUVBjUGxRUGwiLCBPUF9FUT47Ci1kZWYgQ0ZNR0UgIDogU09wSW5zdDwidmNnZSIsICJ1ZGQiLAotICAgICAgICAgICAgICAgICAgICAgImNzaWxmVWNVc1VpVWxRY1FzUWlRbFFmUVVjUVVzUVVpUVVsZFFkIiwgT1BfR0U+OwotZGVmIENGTUxFICA6IFNPcEluc3Q8InZjbGUiLCAidWRkIiwKLSAgICAgICAgICAgICAgICAgICAgICJjc2lsZlVjVXNVaVVsUWNRc1FpUWxRZlFVY1FVc1FVaVFVbGRRZCIsIE9QX0xFPjsKLWRlZiBDRk1HVCAgOiBTT3BJbnN0PCJ2Y2d0IiwgInVkZCIsCi0gICAgICAgICAgICAgICAgICAgICAiY3NpbGZVY1VzVWlVbFFjUXNRaVFsUWZRVWNRVXNRVWlRVWxkUWQiLCBPUF9HVD47Ci1kZWYgQ0ZNTFQgIDogU09wSW5zdDwidmNsdCIsICJ1ZGQiLAotICAgICAgICAgICAgICAgICAgICAgImNzaWxmVWNVc1VpVWxRY1FzUWlRbFFmUVVjUVVzUVVpUVVsZFFkIiwgT1BfTFQ+OworZGVmIEZDQUdFIDogSUluc3Q8InZjYWdlIiwgInVkZCIsICJkUWQiPjsKK2RlZiBGQ0FHVCA6IElJbnN0PCJ2Y2FndCIsICJ1ZGQiLCAiZFFkIj47CitkZWYgRkNBTEUgOiBJSW5zdDwidmNhbGUiLCAidWRkIiwgImRRZCI+OworZGVmIEZDQUxUIDogSUluc3Q8InZjYWx0IiwgInVkZCIsICJkUWQiPjsKK2RlZiBDTVRTVCAgOiBXSW5zdDwidnRzdCIsICJ1ZGQiLCAibFVsUGxRbFFVbFFQbCI+OworZGVmIENGTUVRICA6IFNPcEluc3Q8InZjZXEiLCAidWRkIiwgImxVbGRRZFFsUVVsUGxRUGwiLCBPUF9FUT47CitkZWYgQ0ZNR0UgIDogU09wSW5zdDwidmNnZSIsICJ1ZGQiLCAibFVsZFFkUWxRVWwiLCBPUF9HRT47CitkZWYgQ0ZNTEUgIDogU09wSW5zdDwidmNsZSIsICJ1ZGQiLCAibFVsZFFkUWxRVWwiLCBPUF9MRT47CitkZWYgQ0ZNR1QgIDogU09wSW5zdDwidmNndCIsICJ1ZGQiLCAibFVsZFFkUWxRVWwiLCBPUF9HVD47CitkZWYgQ0ZNTFQgIDogU09wSW5zdDwidmNsdCIsICJ1ZGQiLCAibFVsZFFkUWxRVWwiLCBPUF9MVD47CiAKIGRlZiBDTUVRICA6IFNJbnN0PCJ2Y2VxeiIsICJ1ZCIsCiAgICAgICAgICAgICAgICAgICAiY3NpbGZVY1VzVWlVbFBjUHNQbFFjUXNRaVFsUWZRVWNRVXNRVWlRVWxRUGNRUHNkUWRRUGwiPjsKQEAgLTc2Miw5ICs3MjIsOCBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gTWF4L01pbiBJbnRlZ2VyCi0vLyBXaXRoIGFkZGl0aW9uYWwgUWQgdHlwZS4KLWRlZiBNQVggOiBTSW5zdDwidm1heCIsICJkZGQiLCAiY3NpVWNVc1VpZmRRY1FzUWlRVWNRVXNRVWlRZlFkIj47Ci1kZWYgTUlOIDogU0luc3Q8InZtaW4iLCAiZGRkIiwgImNzaVVjVXNVaWZkUWNRc1FpUVVjUVVzUVVpUWZRZCI+OworZGVmIE1BWCA6IFNJbnN0PCJ2bWF4IiwgImRkZCIsICJkUWQiPjsKK2RlZiBNSU4gOiBTSW5zdDwidm1pbiIsICJkZGQiLCAiZFFkIj47CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBNYXhOdW0vTWluTnVtIEZsb2F0aW5nIFBvaW50CkBAIC03NzMsOSArNzMyLDggQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFBhaXJ3aXNlIE1heC9NaW4KLS8vIFdpdGggYWRkaXRpb25hbCBRYyBRcyBRaSBRVWMgUVVzIFFVaSBRZiBRZCB0eXBlcy4KLWRlZiBNQVhQIDogU0luc3Q8InZwbWF4IiwgImRkZCIsICJjc2lVY1VzVWlmUWNRc1FpUVVjUVVzUVVpUWZRZCI+OwotZGVmIE1JTlAgOiBTSW5zdDwidnBtaW4iLCAiZGRkIiwgImNzaVVjVXNVaWZRY1FzUWlRVWNRVXNRVWlRZlFkIj47CitkZWYgTUFYUCA6IFNJbnN0PCJ2cG1heCIsICJkZGQiLCAiUWNRc1FpUVVjUVVzUVVpUWZRZCI+OworZGVmIE1JTlAgOiBTSW5zdDwidnBtaW4iLCAiZGRkIiwgIlFjUXNRaVFVY1FVc1FVaVFmUWQiPjsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFBhaXJ3aXNlIE1heE51bS9NaW5OdW0gRmxvYXRpbmcgUG9pbnQKQEAgLTc4NCw4ICs3NDIsNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gUGFpcndpc2UgQWRkaXRpb24KLS8vIFdpdGggYWRkaXRpb25hbCBRYyBRcyBRaSBRVWMgUVVzIFFVaSBRZiBRZCB0eXBlcy4KLWRlZiBBRERQICA6IElJbnN0PCJ2cGFkZCIsICJkZGQiLCAiY3NpVWNVc1VpZlFjUXNRaVFsUVVjUVVzUVVpUVVsUWZRZCI+OworZGVmIEFERFAgIDogSUluc3Q8InZwYWRkIiwgImRkZCIsICJRY1FzUWlRbFFVY1FVc1FVaVFVbFFmUWQiPjsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFNoaWZ0cyBieSBjb25zdGFudApAQCAtNzk1LDExICs3NTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUF9MT05HX0hJPjsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFNoaWZ0cyB3aXRoIGluc2VydCwgd2l0aCBhZGRpdGlvbmFsIFFsLCBRUGwgdHlwZS4KLWRlZiBTUklfTiA6IFdJbnN0PCJ2c3JpX24iLCAiZGRkaSIsCi0gICAgICAgICAgICAgICAgICAiY3NpbFVjVXNVaVVsUGNQc1FjUXNRaVFsUVVjUVVzUVVpUVVsUVBjUVBzUGxRUGwiPjsKLWRlZiBTTElfTiA6IFdJbnN0PCJ2c2xpX24iLCAiZGRkaSIsCi0gICAgICAgICAgICAgICAgICAiY3NpbFVjVXNVaVVsUGNQc1FjUXNRaVFsUVVjUVVzUVVpUVVsUVBjUVBzUGxRUGwiPjsKK2RlZiBTUklfTiA6IFdJbnN0PCJ2c3JpX24iLCAiZGRkaSIsICJQbFFQbCI+OworZGVmIFNMSV9OIDogV0luc3Q8InZzbGlfbiIsICJkZGRpIiwgIlBsUVBsIj47CiAKIC8vIFJpZ2h0IHNoaWZ0IG5hcnJvdyBoaWdoCiBkZWYgU0hSTl9ISUdIX04gICAgOiBJT3BJbnN0PCJ2c2hybl9oaWdoX24iLCAiaG1kaSIsCkBAIC04NTQsMTUgKzgwOCwxNiBAQAogZGVmIFZRRE1MQUxfSElHSF9OIDogU09wSW5zdDwidnFkbWxhbF9oaWdoX24iLCAid3drcyIsICJzaSIsIE9QX1FETUxBTEhpX04+OwogZGVmIFZRRE1MU0xfSElHSCA6IFNPcEluc3Q8InZxZG1sc2xfaGlnaCIsICJ3d2trIiwgInNpIiwgT1BfUURNTFNMSGk+OwogZGVmIFZRRE1MU0xfSElHSF9OIDogU09wSW5zdDwidnFkbWxzbF9oaWdoX24iLCAid3drcyIsICJzaSIsIE9QX1FETUxTTEhpX04+OworZGVmIFZNVUxMX1A2NCAgICA6IFNJbnN0PCJ2bXVsbCIsICJyc3MiLCAiUGwiPjsKK2RlZiBWTVVMTF9ISUdIX1A2NCA6IFNPcEluc3Q8InZtdWxsX2hpZ2giLCAicmRkIiwgIkhQbCIsIE9QX01VTExIaV9QNjQ+OworCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBFeHRyYWN0IG9yIGluc2VydCBlbGVtZW50IGZyb20gdmVjdG9yCi1kZWYgR0VUX0xBTkUgOiBJSW5zdDwidmdldF9sYW5lIiwgInNkaSIsCi0gICAgICAgICAgICAgICAgICAgICAiY3NpbFBjUHNVY1VzVWlVbFFjUXNRaVFsUVVjUVVzUVVpUVVsUGNQc1FQY1FQc2ZkUWZRZFBsUVBsIj47Ci1kZWYgU0VUX0xBTkUgOiBJSW5zdDwidnNldF9sYW5lIiwgImRzZGkiLAotICAgICAgICAgICAgICAgICAgICAgImNzaWxQY1BzVWNVc1VpVWxRY1FzUWlRbFFVY1FVc1FVaVFVbFBjUHNRUGNRUHNmZFFmUWRQbFFQbCI+OworZGVmIEdFVF9MQU5FIDogSUluc3Q8InZnZXRfbGFuZSIsICJzZGkiLCAiZFFkUGxRUGwiPjsKK2RlZiBTRVRfTEFORSA6IElJbnN0PCJ2c2V0X2xhbmUiLCAiZHNkaSIsICJkUWRQbFFQbCI+OwogZGVmIENPUFlfTEFORSA6IElPcEluc3Q8InZjb3B5X2xhbmUiLCAiZGRpZGkiLAotICAgICAgICAgICAgICAgICAgICAgICAgImNzaWxQY1BzVWNVc1VpVWxQY1BzUGxmZCIsIE9QX0NPUFlfTE4+OworICAgICAgICAgICAgICAgICAgICAgICAgImNzaWxVY1VzVWlVbFBjUHNQbGZkIiwgT1BfQ09QWV9MTj47CiBkZWYgQ09QWVFfTEFORSA6IElPcEluc3Q8InZjb3B5X2xhbmUiLCAiZGRpZ2kiLAogICAgICAgICAgICAgICAgICAgICAgICAgIlFjUXNRaVFsUVVjUVVzUVVpUVVsUVBjUVBzUWZRZFFQbCIsIE9QX0NPUFlRX0xOPjsKIGRlZiBDT1BZX0xBTkVRIDogSU9wSW5zdDwidmNvcHlfbGFuZXEiLCAiZGRpa2kiLApAQCAtODcyLDI2ICs4MjcsMTkgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFNldCBhbGwgbGFuZXMgdG8gc2FtZSB2YWx1ZQotZGVmIFZEVVBfTEFORTE6IFdPcEluc3Q8InZkdXBfbGFuZSIsICJkZ2kiLAotICAgICAgICAgICAgICAgICAgImNzaWxQY1BzVWNVc1VpVWxoZmRRY1FzUWlRbFFQY1FQc1FVY1FVc1FVaVFVbFFoUWZRZFBsUVBsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QX0RVUF9MTj47CitkZWYgVkRVUF9MQU5FMTogV09wSW5zdDwidmR1cF9sYW5lIiwgImRnaSIsICJoZFFoUWRQbFFQbCIsIE9QX0RVUF9MTj47CiBkZWYgVkRVUF9MQU5FMjogV09wSW5zdDwidmR1cF9sYW5lcSIsICJka2kiLAotICAgICAgICAgICAgICAgICAgImNzaWxQY1BzVWNVc1VpVWxoZmRRY1FzUWlRbFFQY1FQc1FVY1FVc1FVaVFVbFFoUWZRZFBsUVBsIiwKKyAgICAgICAgICAgICAgICAgICJjc2lsVWNVc1VpVWxQY1BzaGZkUWNRc1FpUWxRUGNRUHNRVWNRVXNRVWlRVWxRaFFmUWRQbFFQbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBPUF9EVVBfTE4+OwotZGVmIERVUF9OICAgOiBXT3BJbnN0PCJ2ZHVwX24iLCAiZHMiLAotICAgICAgICAgICAgICAgICAgICAgICAiVWNVc1VpY3NpUGNQc2ZRVWNRVXNRVWlRY1FzUWlRUGNRUHNRZmxVbFFsUVVsZFFkUGxRUGwiLAotICAgICAgICAgICAgICAgICAgICAgICBPUF9EVVA+OwotZGVmIE1PVl9OICAgOiBXT3BJbnN0PCJ2bW92X24iLCAiZHMiLAotICAgICAgICAgICAgICAgICAgICAgICAiVWNVc1VpY3NpUGNQc2ZRVWNRVXNRVWlRY1FzUWlRUGNRUHNRZmxVbFFsUVVsZFFkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgT1BfRFVQPjsKK2RlZiBEVVBfTiAgIDogV09wSW5zdDwidmR1cF9uIiwgImRzIiwgImRRZFBsUVBsIiwgT1BfRFVQPjsKK2RlZiBNT1ZfTiAgIDogV09wSW5zdDwidm1vdl9uIiwgImRzIiwgImRRZCIsIE9QX0RVUD47CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDb21iaW5pbmcgdmVjdG9ycywgd2l0aCBhZGRpdGlvbmFsIFBsCi1kZWYgQ09NQklORSA6IE5vVGVzdE9wSW5zdDwidmNvbWJpbmUiLCAia2RkIiwgImNzaWxoZmRVY1VzVWlVbFBjUHNQbCIsIE9QX0NPTkM+OworZGVmIENPTUJJTkUgOiBOb1Rlc3RPcEluc3Q8InZjb21iaW5lIiwgImtkZCIsICJkUGwiLCBPUF9DT05DPjsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vSW5pdGlhbGl6ZSBhIHZlY3RvciBmcm9tIGJpdCBwYXR0ZXJuLCB3aXRoIGFkZGl0aW9uYWwgUGwKLWRlZiBDUkVBVEUgOiBOb1Rlc3RPcEluc3Q8InZjcmVhdGUiLCAiZGwiLCAiY3NpaGZkVWNVc1VpVWxQY1BzbFBsIiwgT1BfQ0FTVD47CisvL0luaXRpYWxpemUgYSB2ZWN0b3IgZnJvbSBiaXQgcGF0dGVybgorZGVmIENSRUFURSA6IE5vVGVzdE9wSW5zdDwidmNyZWF0ZSIsICJkbCIsICJkUGwiLCBPUF9DQVNUPjsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIApAQCAtOTAxLDcgKzg0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lVc1VpZlFzUWlRVXNRVWlRZiIsIE9QX01MU19MTj47CiAKIGRlZiBWRk1BX0xBTkUgICAgOiBJSW5zdDwidmZtYV9sYW5lIiwgImRkZGdpIiwgImZkUWZRZCI+OwotZGVmIFZGTUFfTEFORVEgICA6IElJbnN0PCJ2Zm1hX2xhbmVxIiwgImRkZGppIiwgImZkUWZRZCI+OworZGVmIFZGTUFfTEFORVEgICA6IElJbnN0PCJ2Zm1hX2xhbmVxIiwgImRkZGppIiwgImZkUWZRZCI+IHsKKyAgbGV0IGlzTGFuZVEgPSAxOworfQogZGVmIFZGTVNfTEFORSAgICA6IElPcEluc3Q8InZmbXNfbGFuZSIsICJkZGRnaSIsICJmZFFmUWQiLCBPUF9GTVNfTE4+OwogZGVmIFZGTVNfTEFORVEgICA6IElPcEluc3Q8InZmbXNfbGFuZXEiLCAiZGRkamkiLCAiZmRRZlFkIiwgT1BfRk1TX0xOUT47CiAKQEAgLTkzMyw3ICs4ODMsNyBAQAogCiAvLyBOb3RlOiBkIHR5cGUgaXMgaGFuZGxlZCBieSBTQ0FMQVJfVk1VTF9MQU5FUQogZGVmIFZNVUxfTEFORVEgICA6IElPcEluc3Q8InZtdWxfbGFuZXEiLCAiZGRqaSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAic2lmVXNVaVFzUWlRZlFVc1FVaVFmUWQiLCBPUF9NVUxfTE4+OworICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZlVzVWlRc1FpUVVzUVVpUWZRZCIsIE9QX01VTF9MTj47CiBkZWYgVk1VTExfTEFORVEgIDogU09wSW5zdDwidm11bGxfbGFuZXEiLCAid2RraSIsICJzaVVzVWkiLCBPUF9NVUxMX0xOPjsKIGRlZiBWTVVMTF9ISUdIX0xBTkUgICA6IFNPcEluc3Q8InZtdWxsX2hpZ2hfbGFuZSIsICJ3a2RpIiwgInNpVXNVaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QX01VTExIaV9MTj47CkBAIC05NjUsMTIgKzkxNSwxMSBAQAogIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIE5ld2x5IGFkZGVkIFZlY3RvciBFeHRyYWN0IGZvciBmNjQKLWRlZiBWRVhUX0E2NCA6IFdJbnN0PCJ2ZXh0IiwgImRkZGkiLAotICAgICAgICAgICAgICAgICAgICAgImNVY1Bjc1VzUHNpVWlsVWxmZFFjUVVjUVBjUXNRVXNRUHNRaVFVaVFsUVVsUWZRZFBsUVBsIj47CitkZWYgVkVYVF9BNjQgOiBXSW5zdDwidmV4dCIsICJkZGRpIiwgImRRZFBsUVBsIj47CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBDcnlwdG8KLWxldCBpc0NyeXB0byA9IDEgaW4geworbGV0IEFyY2hHdWFyZCA9ICJfX0FSTV9GRUFUVVJFX0NSWVBUTyIgaW4gewogZGVmIEFFU0UgOiBTSW5zdDwidmFlc2UiLCAiZGRkIiwgIlFVYyI+OwogZGVmIEFFU0QgOiBTSW5zdDwidmFlc2QiLCAiZGRkIiwgIlFVYyI+OwogZGVmIEFFU01DIDogU0luc3Q8InZhZXNtYyIsICJkZCIsICJRVWMiPjsKQEAgLTk5MCw2ICs5MzksMzEgQEAKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZsb2F0IC0+IEludCBjb252ZXJzaW9ucyB3aXRoIGV4cGxpY2l0IHJvdW5kaW5nIG1vZGUKKworbGV0IEFyY2hHdWFyZCA9ICJfX0FSTV9BUkNIID49IDgiIGluIHsKK2RlZiBGQ1ZUTlNfUzMyIDogU0luc3Q8InZjdnRuX3MzMiIsICJ4ZCIsICJmUWYiPjsKK2RlZiBGQ1ZUTlVfUzMyIDogU0luc3Q8InZjdnRuX3UzMiIsICJ1ZCIsICJmUWYiPjsKK2RlZiBGQ1ZUUFNfUzMyIDogU0luc3Q8InZjdnRwX3MzMiIsICJ4ZCIsICJmUWYiPjsKK2RlZiBGQ1ZUUFVfUzMyIDogU0luc3Q8InZjdnRwX3UzMiIsICJ1ZCIsICJmUWYiPjsKK2RlZiBGQ1ZUTVNfUzMyIDogU0luc3Q8InZjdnRtX3MzMiIsICJ4ZCIsICJmUWYiPjsKK2RlZiBGQ1ZUTVVfUzMyIDogU0luc3Q8InZjdnRtX3UzMiIsICJ1ZCIsICJmUWYiPjsKK2RlZiBGQ1ZUQVNfUzMyIDogU0luc3Q8InZjdnRhX3MzMiIsICJ4ZCIsICJmUWYiPjsKK2RlZiBGQ1ZUQVVfUzMyIDogU0luc3Q8InZjdnRhX3UzMiIsICJ1ZCIsICJmUWYiPjsKK30KKworbGV0IEFyY2hHdWFyZCA9ICJfX0FSTV9BUkNIID49IDggJiYgZGVmaW5lZChfX2FhcmNoNjRfXykiIGluIHsKK2RlZiBGQ1ZUTlNfUzY0IDogU0luc3Q8InZjdnRuX3M2NCIsICJ4ZCIsICJkUWQiPjsKK2RlZiBGQ1ZUTlVfUzY0IDogU0luc3Q8InZjdnRuX3U2NCIsICJ1ZCIsICJkUWQiPjsKK2RlZiBGQ1ZUUFNfUzY0IDogU0luc3Q8InZjdnRwX3M2NCIsICJ4ZCIsICJkUWQiPjsKK2RlZiBGQ1ZUUFVfUzY0IDogU0luc3Q8InZjdnRwX3U2NCIsICJ1ZCIsICJkUWQiPjsKK2RlZiBGQ1ZUTVNfUzY0IDogU0luc3Q8InZjdnRtX3M2NCIsICJ4ZCIsICJkUWQiPjsKK2RlZiBGQ1ZUTVVfUzY0IDogU0luc3Q8InZjdnRtX3U2NCIsICJ1ZCIsICJkUWQiPjsKK2RlZiBGQ1ZUQVNfUzY0IDogU0luc3Q8InZjdnRhX3M2NCIsICJ4ZCIsICJkUWQiPjsKK2RlZiBGQ1ZUQVVfUzY0IDogU0luc3Q8InZjdnRhX3U2NCIsICJ1ZCIsICJkUWQiPjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFBlcm11dGF0aW9uCiBkZWYgVlRSTjEgOiBTT3BJbnN0PCJ2dHJuMSIsICJkZGQiLAogICAgICAgICAgICAgICAgICAgICAiY3NpVWNVc1VpZlBjUHNRY1FzUWlRbFFVY1FVc1FVaVFVbFFmUWRRUGNRUHNRUGwiLCBPUF9UUk4xPjsKQEAgLTEwMjEsMTAgKzk5NSwxNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gVmVjdG9yIHJlaW50ZXJwcmV0IGNhc3Qgb3BlcmF0aW9ucwotLy8gV2l0aCBhZGRpdGlvbmFsIGQsIFFkLCBwbCwgUXBsIHR5cGVzCi1kZWYgUkVJTlRFUlBSRVQKKworLy8gTmVvbkVtaXR0ZXIgaW1wbGljaXRseSB0YWtlcyB0aGUgY2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhlIHR5cGUgc3RyaW5nIHdpdGgKKy8vIGl0c2VsZiBkdXJpbmcgZ2VuZXJhdGlvbiBzbywgdW5saWtlIGFsbCBvdGhlciBpbnRyaW5zaWNzLCB0aGlzIG9uZSBzaG91bGQKKy8vIGluY2x1ZGUgKmFsbCogdHlwZXMsIG5vdCBqdXN0IGFkZGl0aW9uYWwgb25lcy4KKy8vCisvLyBXZSBhbHNvIHJlbHkgb24gTmVvbkVtaXR0ZXIgaGFuZGxpbmcgdGhlIDMyLWJpdCB2cmVpbnRlcnByZXQgYmVmb3JlIHRoZQorLy8gNjQtYml0IG9uZSBzbyB0aGF0IHRoZSBjb21tb24gY2FzdHMgZG9uJ3QgZ2V0IGd1YXJkZWQgYXMgQUFyY2g2NC1vbmx5CisvLyAoRklYTUUpLgorZGVmIFZWUkVJTlRFUlBSRVQKICAgOiBOb1Rlc3RPcEluc3Q8InZyZWludGVycHJldCIsICJkZCIsCi0gICAgICAgICAiY3NpbFVjVXNVaVVsaGZkUGNQc1BsUWNRc1FpUWxRVWNRVXNRVWlRVWxRaFFmUWRRUGNRUHNRUGwiLCBPUF9SRUlOVD47CisgICAgICAgImNzaWxVY1VzVWlVbGhmZFBjUHNQbFFjUXNRaVFsUVVjUVVzUVVpUVVsUWhRZlFkUVBjUVBzUVBsUVBrIiwgT1BfUkVJTlQ+OwogCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xMDQyLDEwICsxMDIzLDggQEAKIGRlZiBTQ0FMQVJfUVNVQiAgIDogU0luc3Q8InZxc3ViIiwgInNzcyIsICJTY1NzU2lTbFNVY1NVc1NVaVNVbCI+OwogCiBsZXQgSW5zdE5hbWUgPSAidm1vdiIgaW4gewotZGVmIFZHRVRfSElHSF9BNjQgOiBOb1Rlc3RPcEluc3Q8InZnZXRfaGlnaCIsICJkayIsICJjc2lsaGZkVWNVc1VpVWxQY1BzUGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BfSEk+OwotZGVmIFZHRVRfTE9XX0E2NCAgOiBOb1Rlc3RPcEluc3Q8InZnZXRfbG93IiwgImRrIiwgImNzaWxoZmRVY1VzVWlVbFBjUHNQbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUF9MTz47CitkZWYgVkdFVF9ISUdIX0E2NCA6IE5vVGVzdE9wSW5zdDwidmdldF9oaWdoIiwgImRrIiwgImRQbCIsIE9QX0hJPjsKK2RlZiBWR0VUX0xPV19BNjQgIDogTm9UZXN0T3BJbnN0PCJ2Z2V0X2xvdyIsICJkayIsICJkUGwiLCBPUF9MTz47CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xMjk0LDcgKzEyNzMsOSBAQAogZGVmIFNDQUxBUl9WTVVMX0xBTkUgOiBJSW5zdDwidm11bF9sYW5lIiwgImRkZ2kiLCAiZCI+OwogCiAvLyBWTVVMX0xBTkVRIGQgdHlwZSBpbXBsZW1lbnRlZCB1c2luZyBzY2FsYXIgbXVsIGxhbmUKLWRlZiBTQ0FMQVJfVk1VTF9MQU5FUSAgIDogSUluc3Q8InZtdWxfbGFuZXEiLCAiZGRqaSIsICJkIj47CitkZWYgU0NBTEFSX1ZNVUxfTEFORVEgICA6IElJbnN0PCJ2bXVsX2xhbmVxIiwgImRkamkiLCAiZCI+IHsKKyAgbGV0IGlzTGFuZVEgPSAxOworfQogCiAvLyBWTVVMWF9MQU5FIGQgdHlwZSBpbXBsZW1lbnRlZCB1c2luZyBzY2FsYXIgdm11bHhfbGFuZQogZGVmIFNDQUxBUl9WTVVMWF9MQU5FIDogSU9wSW5zdDwidm11bHhfbGFuZSIsICJkZGdpIiwgImQiLCBPUF9TQ0FMQVJfVk1VTFhfTE4+OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9DTWFrZUxpc3RzLnR4dCBiL2luY2x1ZGUvY2xhbmcvQ01ha2VMaXN0cy50eHQKaW5kZXggNzFjMzdmZC4uMWQ4YWVjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9DTWFrZUxpc3RzLnR4dAorKysgYi9pbmNsdWRlL2NsYW5nL0NNYWtlTGlzdHMudHh0CkBAIC0xLDcgKzEsNiBAQAogYWRkX3N1YmRpcmVjdG9yeShBU1QpCiBhZGRfc3ViZGlyZWN0b3J5KEJhc2ljKQogYWRkX3N1YmRpcmVjdG9yeShEcml2ZXIpCi1hZGRfc3ViZGlyZWN0b3J5KExleCkKIGFkZF9zdWJkaXJlY3RvcnkoUGFyc2UpCiBhZGRfc3ViZGlyZWN0b3J5KFNlbWEpCiBhZGRfc3ViZGlyZWN0b3J5KFNlcmlhbGl6YXRpb24pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQmFja2VuZFV0aWwuaCBiL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9CYWNrZW5kVXRpbC5oCmluZGV4IDEzNWI2YTkuLmY4YjkwYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9CYWNrZW5kVXRpbC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9CYWNrZW5kVXRpbC5oCkBAIC0yMSw3ICsyMSw3IEBACiAgIGNsYXNzIENvZGVHZW5PcHRpb25zOwogICBjbGFzcyBUYXJnZXRPcHRpb25zOwogICBjbGFzcyBMYW5nT3B0aW9uczsKLSAgCisKICAgZW51bSBCYWNrZW5kQWN0aW9uIHsKICAgICBCYWNrZW5kX0VtaXRBc3NlbWJseSwgIC8vLzwgRW1pdCBuYXRpdmUgYXNzZW1ibHkgZmlsZXMKICAgICBCYWNrZW5kX0VtaXRCQywgICAgICAgIC8vLzwgRW1pdCBMTFZNIGJpdGNvZGUgZmlsZXMKQEAgLTMwLDExICszMCwxMSBAQAogICAgIEJhY2tlbmRfRW1pdE1DTnVsbCwgICAgLy8vPCBSdW4gQ29kZUdlbiwgYnV0IGRvbid0IGVtaXQgYW55dGhpbmcKICAgICBCYWNrZW5kX0VtaXRPYmogICAgICAgIC8vLzwgRW1pdCBuYXRpdmUgb2JqZWN0IGZpbGVzCiAgIH07Ci0gIAorCiAgIHZvaWQgRW1pdEJhY2tlbmRPdXRwdXQoRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLCBjb25zdCBDb2RlR2VuT3B0aW9ucyAmQ0dPcHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE9wdGlvbnMgJlRPcHRzLCBjb25zdCBMYW5nT3B0aW9ucyAmTE9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6TW9kdWxlICpNLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2tlbmRBY3Rpb24gQWN0aW9uLCByYXdfb3N0cmVhbSAqT1MpOworICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBURGVzYywgbGx2bTo6TW9kdWxlICpNLCBCYWNrZW5kQWN0aW9uIEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAqT1MpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9DR0Z1bmN0aW9uSW5mby5oIGIvaW5jbHVkZS9jbGFuZy9Db2RlR2VuL0NHRnVuY3Rpb25JbmZvLmgKaW5kZXggOTZkYTBlOS4uZTRhOTI3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Db2RlR2VuL0NHRnVuY3Rpb25JbmZvLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Db2RlR2VuL0NHRnVuY3Rpb25JbmZvLmgKQEAgLTE5LDE0ICsxOSwxNiBAQAogI2luY2x1ZGUgImNsYW5nL0FTVC9DYW5vbmljYWxUeXBlLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCi0KICNpbmNsdWRlIDxjYXNzZXJ0PgogCiBuYW1lc3BhY2UgbGx2bSB7CiAgIGNsYXNzIFR5cGU7CisgIGNsYXNzIFN0cnVjdFR5cGU7CiB9CiAKIG5hbWVzcGFjZSBjbGFuZyB7CitjbGFzcyBEZWNsOworCiBuYW1lc3BhY2UgQ29kZUdlbiB7CiAKIC8vLyBBQklBcmdJbmZvIC0gSGVscGVyIGNsYXNzIHRvIGVuY2Fwc3VsYXRlIGluZm9ybWF0aW9uIGFib3V0IGhvdyBhCkBAIC02MCw3ICs2MiwxNSBAQAogICAgIC8vLyBhcmUgYWxsIHNjYWxhciB0eXBlcyBvciBhcmUgdGhlbXNlbHZlcyBleHBhbmRhYmxlIHR5cGVzLgogICAgIEV4cGFuZCwKIAotICAgIEtpbmRGaXJzdD1EaXJlY3QsIEtpbmRMYXN0PUV4cGFuZAorICAgIC8vLyBJbkFsbG9jYSAtIFBhc3MgdGhlIGFyZ3VtZW50IGRpcmVjdGx5IHVzaW5nIHRoZSBMTFZNIGluYWxsb2NhIGF0dHJpYnV0ZS4KKyAgICAvLy8gVGhpcyBpcyBzaW1pbGFyIHRvICdkaXJlY3QnLCBleGNlcHQgaXQgb25seSBhcHBsaWVzIHRvIGFyZ3VtZW50cyBzdG9yZWQKKyAgICAvLy8gaW4gbWVtb3J5IGFuZCBmb3JiaWRzIGFueSBpbXBsaWNpdCBjb3BpZXMuICBXaGVuIGFwcGxpZWQgdG8gYSByZXR1cm4KKyAgICAvLy8gdHlwZSwgaXQgbWVhbnMgdGhlIHZhbHVlIGlzIHJldHVybmVkIGluZGlyZWN0bHkgdmlhIGFuIGltcGxpY2l0IHNyZXQKKyAgICAvLy8gcGFyYW1ldGVyIHN0b3JlZCBpbiB0aGUgYXJndW1lbnQgc3RydWN0LgorICAgIEluQWxsb2NhLAorCisgICAgS2luZEZpcnN0ID0gRGlyZWN0LAorICAgIEtpbmRMYXN0ID0gSW5BbGxvY2EKICAgfTsKIAogcHJpdmF0ZToKQEAgLTEwMyw2ICsxMTMsOSBAQAogICAgIHJldHVybiBBQklBcmdJbmZvKEluZGlyZWN0LCAwLCBBbGlnbm1lbnQsIEJ5VmFsLCBSZWFsaWduLCBmYWxzZSwgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgUGFkZGluZyk7CiAgIH0KKyAgc3RhdGljIEFCSUFyZ0luZm8gZ2V0SW5BbGxvY2EodW5zaWduZWQgRmllbGRJbmRleCkgeworICAgIHJldHVybiBBQklBcmdJbmZvKEluQWxsb2NhLCAwLCBGaWVsZEluZGV4LCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMCk7CisgIH0KICAgc3RhdGljIEFCSUFyZ0luZm8gZ2V0SW5kaXJlY3RJblJlZyh1bnNpZ25lZCBBbGlnbm1lbnQsIGJvb2wgQnlWYWwgPSB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgYm9vbCBSZWFsaWduID0gZmFsc2UpIHsKICAgICByZXR1cm4gQUJJQXJnSW5mbyhJbmRpcmVjdCwgMCwgQWxpZ25tZW50LCBCeVZhbCwgUmVhbGlnbiwgdHJ1ZSwgZmFsc2UsIDApOwpAQCAtMTE4LDYgKzEzMSw3IEBACiAKICAgS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gVGhlS2luZDsgfQogICBib29sIGlzRGlyZWN0KCkgY29uc3QgeyByZXR1cm4gVGhlS2luZCA9PSBEaXJlY3Q7IH0KKyAgYm9vbCBpc0luQWxsb2NhKCkgY29uc3QgeyByZXR1cm4gVGhlS2luZCA9PSBJbkFsbG9jYTsgfQogICBib29sIGlzRXh0ZW5kKCkgY29uc3QgeyByZXR1cm4gVGhlS2luZCA9PSBFeHRlbmQ7IH0KICAgYm9vbCBpc0lnbm9yZSgpIGNvbnN0IHsgcmV0dXJuIFRoZUtpbmQgPT0gSWdub3JlOyB9CiAgIGJvb2wgaXNJbmRpcmVjdCgpIGNvbnN0IHsgcmV0dXJuIFRoZUtpbmQgPT0gSW5kaXJlY3Q7IH0KQEAgLTE3Miw2ICsxODYsMjMgQEAKICAgICByZXR1cm4gQm9vbERhdGExOwogICB9CiAKKyAgdW5zaWduZWQgZ2V0SW5BbGxvY2FGaWVsZEluZGV4KCkgY29uc3QgeworICAgIGFzc2VydChUaGVLaW5kID09IEluQWxsb2NhICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgcmV0dXJuIFVJbnREYXRhOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZpZWxkIG9mIGFuIGluYWxsb2NhIHN0cnVjdCBzaG91bGQgYmUgcmV0dXJuZWQKKyAgLy8vIHRvIGltcGxlbWVudCBhIHN0cnVjdCByZXR1cm4gY2FsbGluZyBjb252ZW50aW9uLgorICBib29sIGdldEluQWxsb2NhU1JldCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoVGhlS2luZCA9PSBJbkFsbG9jYSAmJiAiSW52YWxpZCBraW5kISIpOworICAgIHJldHVybiBCb29sRGF0YTA7CisgIH0KKworICB2b2lkIHNldEluQWxsb2NhU1JldChib29sIFNSZXQpIHsKKyAgICBhc3NlcnQoVGhlS2luZCA9PSBJbkFsbG9jYSAmJiAiSW52YWxpZCBraW5kISIpOworICAgIEJvb2xEYXRhMCA9IFNSZXQ7CisgIH0KKwogICB2b2lkIGR1bXAoKSBjb25zdDsKIH07CiAKQEAgLTE5NSw3ICsyMjYsNyBAQAogICBzdGF0aWMgUmVxdWlyZWRBcmdzIGZvclByb3RvdHlwZVBsdXMoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKnByb3RvdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFkZGl0aW9uYWwpIHsKICAgICBpZiAoIXByb3RvdHlwZS0+aXNWYXJpYWRpYygpKSByZXR1cm4gQWxsOwotICAgIHJldHVybiBSZXF1aXJlZEFyZ3MocHJvdG90eXBlLT5nZXROdW1BcmdzKCkgKyBhZGRpdGlvbmFsKTsKKyAgICByZXR1cm4gUmVxdWlyZWRBcmdzKHByb3RvdHlwZS0+Z2V0TnVtUGFyYW1zKCkgKyBhZGRpdGlvbmFsKTsKICAgfQogCiAgIHN0YXRpYyBSZXF1aXJlZEFyZ3MgZm9yUHJvdG90eXBlKGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpwcm90b3R5cGUpIHsKQEAgLTI0Myw2ICsyNzQsOSBAQAogICAvLy8gVGhlIGNsYW5nOjpDYWxsaW5nQ29udiB0aGF0IHRoaXMgd2FzIG9yaWdpbmFsbHkgY3JlYXRlZCB3aXRoLgogICB1bnNpZ25lZCBBU1RDYWxsaW5nQ29udmVudGlvbiA6IDg7CiAKKyAgLy8vIFdoZXRoZXIgdGhpcyBpcyBhbiBpbnN0YW5jZSBtZXRob2QuCisgIHVuc2lnbmVkIEluc3RhbmNlTWV0aG9kIDogMTsKKwogICAvLy8gV2hldGhlciB0aGlzIGZ1bmN0aW9uIGlzIG5vcmV0dXJuLgogICB1bnNpZ25lZCBOb1JldHVybiA6IDE7CiAKQEAgLTI1NSw2ICsyODksMTAgQEAKIAogICBSZXF1aXJlZEFyZ3MgUmVxdWlyZWQ7CiAKKyAgLy8vIFRoZSBzdHJ1Y3QgcmVwcmVzZW50aW5nIGFsbCBhcmd1bWVudHMgcGFzc2VkIGluIG1lbW9yeS4gIE9ubHkgdXNlZCB3aGVuCisgIC8vLyBwYXNzaW5nIG5vbi10cml2aWFsIHR5cGVzIHdpdGggaW5hbGxvY2EuICBOb3QgcGFydCBvZiB0aGUgcHJvZmlsZS4KKyAgbGx2bTo6U3RydWN0VHlwZSAqQXJnU3RydWN0OworCiAgIHVuc2lnbmVkIE51bUFyZ3M7CiAgIEFyZ0luZm8gKmdldEFyZ3NCdWZmZXIoKSB7CiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QXJnSW5mbyo+KHRoaXMrMSk7CkBAIC0yNjcsNiArMzA1LDcgQEAKIAogcHVibGljOgogICBzdGF0aWMgQ0dGdW5jdGlvbkluZm8gKmNyZWF0ZSh1bnNpZ25lZCBsbHZtQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5zdGFuY2VNZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uVHlwZTo6RXh0SW5mbyAmZXh0SW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuUXVhbFR5cGUgcmVzdWx0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q2FuUXVhbFR5cGU+IGFyZ1R5cGVzLApAQCAtMjc1LDYgKzMxNCwxNCBAQAogICB0eXBlZGVmIGNvbnN0IEFyZ0luZm8gKmNvbnN0X2FyZ19pdGVyYXRvcjsKICAgdHlwZWRlZiBBcmdJbmZvICphcmdfaXRlcmF0b3I7CiAKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxhcmdfaXRlcmF0b3I+IGFyZ19yYW5nZTsKKyAgdHlwZWRlZiBsbHZtOjppdGVyYXRvcl9yYW5nZTxjb25zdF9hcmdfaXRlcmF0b3I+IGFyZ19jb25zdF9yYW5nZTsKKworICBhcmdfcmFuZ2UgYXJndW1lbnRzKCkgeyByZXR1cm4gYXJnX3JhbmdlKGFyZ19iZWdpbigpLCBhcmdfZW5kKCkpOyB9CisgIGFyZ19jb25zdF9yYW5nZSBhcmd1bWVudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGFyZ19jb25zdF9yYW5nZShhcmdfYmVnaW4oKSwgYXJnX2VuZCgpKTsKKyAgfQorCiAgIGNvbnN0X2FyZ19pdGVyYXRvciBhcmdfYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRBcmdzQnVmZmVyKCkgKyAxOyB9CiAgIGNvbnN0X2FyZ19pdGVyYXRvciBhcmdfZW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJnc0J1ZmZlcigpICsgMSArIE51bUFyZ3M7IH0KICAgYXJnX2l0ZXJhdG9yIGFyZ19iZWdpbigpIHsgcmV0dXJuIGdldEFyZ3NCdWZmZXIoKSArIDE7IH0KQEAgLTI4NSw2ICszMzIsOCBAQAogICBib29sIGlzVmFyaWFkaWMoKSBjb25zdCB7IHJldHVybiBSZXF1aXJlZC5hbGxvd3NPcHRpb25hbEFyZ3MoKTsgfQogICBSZXF1aXJlZEFyZ3MgZ2V0UmVxdWlyZWRBcmdzKCkgY29uc3QgeyByZXR1cm4gUmVxdWlyZWQ7IH0KIAorICBib29sIGlzSW5zdGFuY2VNZXRob2QoKSBjb25zdCB7IHJldHVybiBJbnN0YW5jZU1ldGhvZDsgfQorCiAgIGJvb2wgaXNOb1JldHVybigpIGNvbnN0IHsgcmV0dXJuIE5vUmV0dXJuOyB9CiAKICAgLy8vIEluIEFSQywgd2hldGhlciB0aGlzIGZ1bmN0aW9uIHJldGFpbnMgaXRzIHJldHVybiB2YWx1ZS4gIFRoaXMKQEAgLTMyNSwyMyArMzc0LDMzIEBACiAgIEFCSUFyZ0luZm8gJmdldFJldHVybkluZm8oKSB7IHJldHVybiBnZXRBcmdzQnVmZmVyKClbMF0uaW5mbzsgfQogICBjb25zdCBBQklBcmdJbmZvICZnZXRSZXR1cm5JbmZvKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJnc0J1ZmZlcigpWzBdLmluZm87IH0KIAorICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gdXNlcyBpbmFsbG9jYSBhcmd1bWVudHMuCisgIGJvb2wgdXNlc0luQWxsb2NhKCkgY29uc3QgeyByZXR1cm4gQXJnU3RydWN0OyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHN0cnVjdCB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IGFsbCB0aGUgYXJndW1lbnRzIGluIG1lbW9yeS4KKyAgbGx2bTo6U3RydWN0VHlwZSAqZ2V0QXJnU3RydWN0KCkgY29uc3QgeyByZXR1cm4gQXJnU3RydWN0OyB9CisgIHZvaWQgc2V0QXJnU3RydWN0KGxsdm06OlN0cnVjdFR5cGUgKlR5KSB7IEFyZ1N0cnVjdCA9IFR5OyB9CisKICAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSB7CiAgICAgSUQuQWRkSW50ZWdlcihnZXRBU1RDYWxsaW5nQ29udmVudGlvbigpKTsKKyAgICBJRC5BZGRCb29sZWFuKEluc3RhbmNlTWV0aG9kKTsKICAgICBJRC5BZGRCb29sZWFuKE5vUmV0dXJuKTsKICAgICBJRC5BZGRCb29sZWFuKFJldHVybnNSZXRhaW5lZCk7CiAgICAgSUQuQWRkQm9vbGVhbihIYXNSZWdQYXJtKTsKICAgICBJRC5BZGRJbnRlZ2VyKFJlZ1Bhcm0pOwogICAgIElELkFkZEludGVnZXIoUmVxdWlyZWQuZ2V0T3BhcXVlRGF0YSgpKTsKICAgICBnZXRSZXR1cm5UeXBlKCkuUHJvZmlsZShJRCk7Ci0gICAgZm9yIChhcmdfaXRlcmF0b3IgaXQgPSBhcmdfYmVnaW4oKSwgaWUgPSBhcmdfZW5kKCk7IGl0ICE9IGllOyArK2l0KQotICAgICAgaXQtPnR5cGUuUHJvZmlsZShJRCk7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogYXJndW1lbnRzKCkpCisgICAgICBJLnR5cGUuUHJvZmlsZShJRCk7CiAgIH0KICAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIEluc3RhbmNlTWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uVHlwZTo6RXh0SW5mbyAmaW5mbywKICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZEFyZ3MgcmVxdWlyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgQ2FuUXVhbFR5cGUgcmVzdWx0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDYW5RdWFsVHlwZT4gYXJnVHlwZXMpIHsKICAgICBJRC5BZGRJbnRlZ2VyKGluZm8uZ2V0Q0MoKSk7CisgICAgSUQuQWRkQm9vbGVhbihJbnN0YW5jZU1ldGhvZCk7CiAgICAgSUQuQWRkQm9vbGVhbihpbmZvLmdldE5vUmV0dXJuKCkpOwogICAgIElELkFkZEJvb2xlYW4oaW5mby5nZXRQcm9kdWNlc1Jlc3VsdCgpKTsKICAgICBJRC5BZGRCb29sZWFuKGluZm8uZ2V0SGFzUmVnUGFybSgpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9Db2RlR2VuQUJJVHlwZXMuaCBiL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9Db2RlR2VuQUJJVHlwZXMuaAppbmRleCA4MWUyY2RjLi45MGM3NDk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQ29kZUdlbkFCSVR5cGVzLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Db2RlR2VuL0NvZGVHZW5BQklUeXBlcy5oCkBAIC00NywxMCArNDcsNyBAQAogY2xhc3MgQ29kZUdlbkFCSVR5cGVzCiB7CiBwdWJsaWM6Ci0gIENvZGVHZW5BQklUeXBlcyhBU1RDb250ZXh0ICZDLCBjb25zdCBDb2RlR2VuT3B0aW9ucyAmQ29kZUdlbk9wdHMsCi0gICAgICAgICAgICAgICAgICBsbHZtOjpNb2R1bGUgJk0sIGNvbnN0IGxsdm06OkRhdGFMYXlvdXQgJlRELAotICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKTsKLQorICBDb2RlR2VuQUJJVHlwZXMoQVNUQ29udGV4dCAmQywgbGx2bTo6TW9kdWxlICZNLCBjb25zdCBsbHZtOjpEYXRhTGF5b3V0ICZURCk7CiAgIH5Db2RlR2VuQUJJVHlwZXMoKTsKIAogICAvLy8gVGhlc2UgbWV0aG9kcyBhbGwgZm9yd2FyZCB0byBtZXRob2RzIGluIHRoZSBwcml2YXRlIGltcGxlbWVudGF0aW9uIGNsYXNzCkBAIC02NSwxMiArNjIsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhblF1YWw8RnVuY3Rpb25Ob1Byb3RvVHlwZT4gVHkpOwogICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmYXJyYW5nZUNYWE1ldGhvZFR5cGUoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlRQKTsKLSAgY29uc3QgQ0dGdW5jdGlvbkluZm8gJmFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKENhblF1YWxUeXBlIHJldHVyblR5cGUsCisgIGNvbnN0IENHRnVuY3Rpb25JbmZvICZhcnJhbmdlRnJlZUZ1bmN0aW9uQ2FsbChDYW5RdWFsVHlwZSByZXR1cm5UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxDYW5RdWFsVHlwZT4gYXJnVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbyBpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZEFyZ3MgYXJncyk7CiAKIHByaXZhdGU6CisgIC8vLyBEZWZhdWx0IENvZGVHZW5PcHRpb25zIG9iamVjdCB1c2VkIHRvIGluaXRpYWxpemUgdGhlCisgIC8vLyBDb2RlR2VuTW9kdWxlIGFuZCBvdGhlcndpc2Ugbm90IHVzZWQuIE1vcmUgc3BlY2lmaWNhbGx5LCBpdCBpcworICAvLy8gbm90IHVzZWQgaW4gQUJJIHR5cGUgZ2VuZXJhdGlvbiwgc28gbm9uZSBvZiB0aGUgb3B0aW9ucyBtYXR0ZXIuCisgIENvZGVHZW5PcHRpb25zICpDR087CisKKyAgLy8vIFRoZSBDb2RlR2VuTW9kdWxlIHdlIHVzZSBnZXQgdG8gdGhlIENvZGVHZW5UeXBlcyBvYmplY3QuCiAgIENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgKkNHTTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9Db2RlR2VuQWN0aW9uLmggYi9pbmNsdWRlL2NsYW5nL0NvZGVHZW4vQ29kZUdlbkFjdGlvbi5oCmluZGV4IDkxMmVmMDEuLjIzMDBkMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvQ29kZUdlbi9Db2RlR2VuQWN0aW9uLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Db2RlR2VuL0NvZGVHZW5BY3Rpb24uaApAQCAtMTEsNyArMTEsNyBAQAogI2RlZmluZSBMTFZNX0NMQU5HX0NPREVHRU5fQ09ERV9HRU5fQUNUSU9OX0gKIAogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9uLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgbGx2bSB7CiAgIGNsYXNzIExMVk1Db250ZXh0OwpAQCAtMjQsNyArMjQsNyBAQAogY2xhc3MgQ29kZUdlbkFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7CiBwcml2YXRlOgogICB1bnNpZ25lZCBBY3Q7Ci0gIE93bmluZ1B0cjxsbHZtOjpNb2R1bGU+IFRoZU1vZHVsZTsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1vZHVsZT4gVGhlTW9kdWxlOwogICBsbHZtOjpNb2R1bGUgKkxpbmtNb2R1bGU7CiAgIGxsdm06OkxMVk1Db250ZXh0ICpWTUNvbnRleHQ7CiAgIGJvb2wgT3duc1ZNQ29udGV4dDsKQEAgLTM1LDE0ICszNSwxNCBAQAogICAvLy8gb3RoZXJ3aXNlIGl0IGNyZWF0ZXMgYSBmcmVzaCBMTFZNIGNvbnRleHQgYW5kIHRha2VzIG93bmVyc2hpcC4KICAgQ29kZUdlbkFjdGlvbih1bnNpZ25lZCBfQWN0LCBsbHZtOjpMTFZNQ29udGV4dCAqX1ZNQ29udGV4dCA9IDApOwogCi0gIHZpcnR1YWwgYm9vbCBoYXNJUlN1cHBvcnQoKSBjb25zdDsKKyAgYm9vbCBoYXNJUlN1cHBvcnQoKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIEFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSk7CisgIEFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBFeGVjdXRlQWN0aW9uKCk7CisgIHZvaWQgRXhlY3V0ZUFjdGlvbigpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBFbmRTb3VyY2VGaWxlQWN0aW9uKCk7CisgIHZvaWQgRW5kU291cmNlRmlsZUFjdGlvbigpIG92ZXJyaWRlOwogCiBwdWJsaWM6CiAgIH5Db2RlR2VuQWN0aW9uKCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9BY3Rpb24uaCBiL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0FjdGlvbi5oCmluZGV4IDI4OWRiZTMuLjJjZGI1ODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0FjdGlvbi5oCisrKyBiL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0FjdGlvbi5oCkBAIC01MCwxMCArNTAsMTEgQEAKICAgICBMaW5rSm9iQ2xhc3MsCiAgICAgTGlwb0pvYkNsYXNzLAogICAgIERzeW11dGlsSm9iQ2xhc3MsCi0gICAgVmVyaWZ5Sm9iQ2xhc3MsCisgICAgVmVyaWZ5RGVidWdJbmZvSm9iQ2xhc3MsCisgICAgVmVyaWZ5UENISm9iQ2xhc3MsCiAKICAgICBKb2JDbGFzc0ZpcnN0PVByZXByb2Nlc3NKb2JDbGFzcywKLSAgICBKb2JDbGFzc0xhc3Q9VmVyaWZ5Sm9iQ2xhc3MKKyAgICBKb2JDbGFzc0xhc3Q9VmVyaWZ5UENISm9iQ2xhc3MKICAgfTsKIAogICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0Q2xhc3NOYW1lKEFjdGlvbkNsYXNzIEFDKTsKQEAgLTE0MSw3ICsxNDIsNyBAQAogfTsKIAogY2xhc3MgUHJlcHJvY2Vzc0pvYkFjdGlvbiA6IHB1YmxpYyBKb2JBY3Rpb24gewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiBwdWJsaWM6CiAgIFByZXByb2Nlc3NKb2JBY3Rpb24oQWN0aW9uICpJbnB1dCwgdHlwZXM6OklEIE91dHB1dFR5cGUpOwogCkBAIC0xNTEsNyArMTUyLDcgQEAKIH07CiAKIGNsYXNzIFByZWNvbXBpbGVKb2JBY3Rpb24gOiBwdWJsaWMgSm9iQWN0aW9uIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogcHVibGljOgogICBQcmVjb21waWxlSm9iQWN0aW9uKEFjdGlvbiAqSW5wdXQsIHR5cGVzOjpJRCBPdXRwdXRUeXBlKTsKIApAQCAtMTYxLDcgKzE2Miw3IEBACiB9OwogCiBjbGFzcyBBbmFseXplSm9iQWN0aW9uIDogcHVibGljIEpvYkFjdGlvbiB7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKIHB1YmxpYzoKICAgQW5hbHl6ZUpvYkFjdGlvbihBY3Rpb24gKklucHV0LCB0eXBlczo6SUQgT3V0cHV0VHlwZSk7CiAKQEAgLTE3MSw3ICsxNzIsNyBAQAogfTsKIAogY2xhc3MgTWlncmF0ZUpvYkFjdGlvbiA6IHB1YmxpYyBKb2JBY3Rpb24gewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiBwdWJsaWM6CiAgIE1pZ3JhdGVKb2JBY3Rpb24oQWN0aW9uICpJbnB1dCwgdHlwZXM6OklEIE91dHB1dFR5cGUpOwogCkBAIC0xODEsNyArMTgyLDcgQEAKIH07CiAKIGNsYXNzIENvbXBpbGVKb2JBY3Rpb24gOiBwdWJsaWMgSm9iQWN0aW9uIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogcHVibGljOgogICBDb21waWxlSm9iQWN0aW9uKEFjdGlvbiAqSW5wdXQsIHR5cGVzOjpJRCBPdXRwdXRUeXBlKTsKIApAQCAtMTkxLDcgKzE5Miw3IEBACiB9OwogCiBjbGFzcyBBc3NlbWJsZUpvYkFjdGlvbiA6IHB1YmxpYyBKb2JBY3Rpb24gewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiBwdWJsaWM6CiAgIEFzc2VtYmxlSm9iQWN0aW9uKEFjdGlvbiAqSW5wdXQsIHR5cGVzOjpJRCBPdXRwdXRUeXBlKTsKIApAQCAtMjAxLDcgKzIwMiw3IEBACiB9OwogCiBjbGFzcyBMaW5rSm9iQWN0aW9uIDogcHVibGljIEpvYkFjdGlvbiB7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKIHB1YmxpYzoKICAgTGlua0pvYkFjdGlvbihBY3Rpb25MaXN0ICZJbnB1dHMsIHR5cGVzOjpJRCBUeXBlKTsKIApAQCAtMjExLDcgKzIxMiw3IEBACiB9OwogCiBjbGFzcyBMaXBvSm9iQWN0aW9uIDogcHVibGljIEpvYkFjdGlvbiB7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKIHB1YmxpYzoKICAgTGlwb0pvYkFjdGlvbihBY3Rpb25MaXN0ICZJbnB1dHMsIHR5cGVzOjpJRCBUeXBlKTsKIApAQCAtMjIxLDcgKzIyMiw3IEBACiB9OwogCiBjbGFzcyBEc3ltdXRpbEpvYkFjdGlvbiA6IHB1YmxpYyBKb2JBY3Rpb24gewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiBwdWJsaWM6CiAgIERzeW11dGlsSm9iQWN0aW9uKEFjdGlvbkxpc3QgJklucHV0cywgdHlwZXM6OklEIFR5cGUpOwogCkBAIC0yMzEsMTEgKzIzMiwzMSBAQAogfTsKIAogY2xhc3MgVmVyaWZ5Sm9iQWN0aW9uIDogcHVibGljIEpvYkFjdGlvbiB7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKIHB1YmxpYzoKLSAgVmVyaWZ5Sm9iQWN0aW9uKEFjdGlvbkxpc3QgJklucHV0cywgdHlwZXM6OklEIFR5cGUpOworICBWZXJpZnlKb2JBY3Rpb24oQWN0aW9uQ2xhc3MgS2luZCwgQWN0aW9uICpJbnB1dCwgdHlwZXM6OklEIFR5cGUpOworICBWZXJpZnlKb2JBY3Rpb24oQWN0aW9uQ2xhc3MgS2luZCwgQWN0aW9uTGlzdCAmSW5wdXRzLCB0eXBlczo6SUQgVHlwZSk7CiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7Ci0gICAgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBWZXJpZnlKb2JDbGFzczsKKyAgICByZXR1cm4gQS0+Z2V0S2luZCgpID09IFZlcmlmeURlYnVnSW5mb0pvYkNsYXNzIHx8CisgICAgICAgICAgIEEtPmdldEtpbmQoKSA9PSBWZXJpZnlQQ0hKb2JDbGFzczsKKyAgfQorfTsKKworY2xhc3MgVmVyaWZ5RGVidWdJbmZvSm9iQWN0aW9uIDogcHVibGljIFZlcmlmeUpvYkFjdGlvbiB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CitwdWJsaWM6CisgIFZlcmlmeURlYnVnSW5mb0pvYkFjdGlvbihBY3Rpb24gKklucHV0LCB0eXBlczo6SUQgVHlwZSk7CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBWZXJpZnlEZWJ1Z0luZm9Kb2JDbGFzczsKKyAgfQorfTsKKworY2xhc3MgVmVyaWZ5UENISm9iQWN0aW9uIDogcHVibGljIFZlcmlmeUpvYkFjdGlvbiB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CitwdWJsaWM6CisgIFZlcmlmeVBDSEpvYkFjdGlvbihBY3Rpb24gKklucHV0LCB0eXBlczo6SUQgVHlwZSk7CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQWN0aW9uICpBKSB7CisgICAgcmV0dXJuIEEtPmdldEtpbmQoKSA9PSBWZXJpZnlQQ0hKb2JDbGFzczsKICAgfQogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxQXNPcHRpb25zLnRkIGIvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxQXNPcHRpb25zLnRkCmluZGV4IGI1MzY3MjQuLjNlMTMwZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMUFzT3B0aW9ucy50ZAorKysgYi9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFBc09wdGlvbnMudGQKQEAgLTgzLDYgKzgzLDkgQEAKIGRlZiBtbm9fZXhlY19zdGFjayA6IEZsYWc8WyItIl0sICJtbm9leGVjc3RhY2siPiwKICAgICBIZWxwVGV4dDwiTWFyayB0aGUgZmlsZSBhcyBub3QgbmVlZGluZyBhbiBleGVjdXRhYmxlIHN0YWNrIj47CiAKK2RlZiBjb21wcmVzc19kZWJ1Z19zZWN0aW9ucyA6IEZsYWc8WyItIl0sICJjb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucyI+LAorICAgIEhlbHBUZXh0PCJDb21wcmVzcyBEV0FSRiBkZWJ1ZyBzZWN0aW9ucyB1c2luZyB6bGliIj47CisKIGRlZiBnIDogRmxhZzxbIi0iXSwgImciPiwgSGVscFRleHQ8IkdlbmVyYXRlIHNvdXJjZSBsZXZlbCBkZWJ1ZyBpbmZvcm1hdGlvbiI+OwogCiBkZWYgZmRlYnVnX2NvbXBpbGF0aW9uX2RpciA6IFNlcGFyYXRlPFsiLSJdLCAiZmRlYnVnLWNvbXBpbGF0aW9uLWRpciI+LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy50ZCBiL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMudGQKaW5kZXggODVjZmRjZi4uZTg0YTIwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy50ZAorKysgYi9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLnRkCkBAIC0xNyw4ICsxNyw2IEBACiAvLyBUYXJnZXQgT3B0aW9ucwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAotZGVmIGN4eF9hYmkgOiBTZXBhcmF0ZTxbIi0iXSwgImN4eC1hYmkiPiwKLSAgSGVscFRleHQ8IlRhcmdldCBhIHBhcnRpY3VsYXIgQysrIEFCSSB0eXBlIj47CiBkZWYgdGFyZ2V0X2FiaSA6IFNlcGFyYXRlPFsiLSJdLCAidGFyZ2V0LWFiaSI+LAogICBIZWxwVGV4dDwiVGFyZ2V0IGEgcGFydGljdWxhciBBQkkgdHlwZSI+OwogZGVmIHRhcmdldF9jcHUgOiBTZXBhcmF0ZTxbIi0iXSwgInRhcmdldC1jcHUiPiwKQEAgLTE0MCw2ICsxMzgsOCBAQAogICBIZWxwVGV4dDwiU3BsaXQgb3V0IHRoZSBkd2FyZiAuZHdvIHNlY3Rpb25zIj47CiBkZWYgZ251X3B1Ym5hbWVzIDogRmxhZzxbIi0iXSwgImdudS1wdWJuYW1lcyI+LAogICBIZWxwVGV4dDwiRW1pdCBuZXdlciBHTlUgc3R5bGUgcHVibmFtZXMiPjsKK2RlZiBhcmFuZ2Vfc2VjdGlvbnMgOiBGbGFnPFsiLSJdLCAiYXJhbmdlX3NlY3Rpb25zIj4sCisgIEhlbHBUZXh0PCJFbWl0IERXQVJGIC5kZWJ1Z19hcmFuZ2Ugc2VjdGlvbnMiPjsKIGRlZiBmZm9yYmlkX2d1YXJkX3ZhcmlhYmxlcyA6IEZsYWc8WyItIl0sICJmZm9yYmlkLWd1YXJkLXZhcmlhYmxlcyI+LAogICBIZWxwVGV4dDwiRW1pdCBhbiBlcnJvciBpZiBhIEMrKyBzdGF0aWMgbG9jYWwgaW5pdGlhbGl6ZXIgd291bGQgbmVlZCBhIGd1YXJkIHZhcmlhYmxlIj47CiBkZWYgbm9faW1wbGljaXRfZmxvYXQgOiBGbGFnPFsiLSJdLCAibm8taW1wbGljaXQtZmxvYXQiPiwKQEAgLTE5MCw2ICsxOTAsOCBAQAogICBIZWxwVGV4dDwiTGltaXQgZmxvYXQgcHJlY2lzaW9uIHRvIHRoZSBnaXZlbiB2YWx1ZSI+OwogZGVmIG1ub19leGVjX3N0YWNrIDogRmxhZzxbIi0iXSwgIm1ub2V4ZWNzdGFjayI+LAogICBIZWxwVGV4dDwiTWFyayB0aGUgZmlsZSBhcyBub3QgbmVlZGluZyBhbiBleGVjdXRhYmxlIHN0YWNrIj47CitkZWYgY29tcHJlc3NfZGVidWdfc2VjdGlvbnMgOiBGbGFnPFsiLSJdLCAiY29tcHJlc3MtZGVidWctc2VjdGlvbnMiPiwKKyAgICBIZWxwVGV4dDwiQ29tcHJlc3MgRFdBUkYgZGVidWcgc2VjdGlvbnMgdXNpbmcgemxpYiI+OwogZGVmIHNwbGl0X3N0YWNrcyA6IEZsYWc8WyItIl0sICJzcGxpdC1zdGFja3MiPiwKICAgSGVscFRleHQ8IlRyeSB0byB1c2UgYSBzcGxpdCBzdGFjayBpZiBwb3NzaWJsZS4iPjsKIGRlZiBtbm9femVyb19pbml0aWFsaXplZF9pbl9ic3MgOiBGbGFnPFsiLSJdLCAibW5vLXplcm8taW5pdGlhbGl6ZWQtaW4tYnNzIj4sCkBAIC0yMjMsNiArMjI1LDggQEAKIAogZGVmIHN5c19oZWFkZXJfZGVwcyA6IEZsYWc8WyItIl0sICJzeXMtaGVhZGVyLWRlcHMiPiwKICAgSGVscFRleHQ8IkluY2x1ZGUgc3lzdGVtIGhlYWRlcnMgaW4gZGVwZW5kZW5jeSBvdXRwdXQiPjsKK2RlZiBtb2R1bGVfZmlsZV9kZXBzIDogRmxhZzxbIi0iXSwgIm1vZHVsZS1maWxlLWRlcHMiPiwKKyAgSGVscFRleHQ8IkluY2x1ZGUgbW9kdWxlIGZpbGVzIGluIGRlcGVuZGVuY3kgb3V0cHV0Ij47CiBkZWYgaGVhZGVyX2luY2x1ZGVfZmlsZSA6IFNlcGFyYXRlPFsiLSJdLCAiaGVhZGVyLWluY2x1ZGUtZmlsZSI+LAogICBIZWxwVGV4dDwiRmlsZW5hbWUgKG9yIC0pIHRvIHdyaXRlIGhlYWRlciBpbmNsdWRlIG91dHB1dCB0byI+OwogZGVmIHNob3dfaW5jbHVkZXMgOiBGbGFnPFsiLS0iXSwgInNob3ctaW5jbHVkZXMiPiwKQEAgLTI1Niw2ICsyNjAsOCBAQAogICBIZWxwVGV4dDwiU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRvIHByaW50IGluIGEgY29uc3RleHByIGV2YWx1YXRpb24gYmFja3RyYWNlICgwID0gbm8gbGltaXQpLiI+OwogZGVmIGZtZXNzYWdlX2xlbmd0aCA6IFNlcGFyYXRlPFsiLSJdLCAiZm1lc3NhZ2UtbGVuZ3RoIj4sIE1ldGFWYXJOYW1lPCI8Tj4iPiwKICAgSGVscFRleHQ8IkZvcm1hdCBtZXNzYWdlIGRpYWdub3N0aWNzIHNvIHRoYXQgdGhleSBmaXQgd2l0aGluIE4gY29sdW1ucyBvciBmZXdlciwgd2hlbiBwb3NzaWJsZS4iPjsKK2RlZiB2ZXJpZnkgOiBGbGFnPFsiLSJdLCAidmVyaWZ5Ij4sCisgIEhlbHBUZXh0PCJWZXJpZnkgZGlhZ25vc3RpYyBvdXRwdXQgdXNpbmcgY29tbWVudCBkaXJlY3RpdmVzIj47CiBkZWYgV25vX3Jld3JpdGVfbWFjcm9zIDogRmxhZzxbIi0iXSwgIlduby1yZXdyaXRlLW1hY3JvcyI+LAogICBIZWxwVGV4dDwiU2lsZW5jZSBPYmpDIHJld3JpdGluZyB3YXJuaW5ncyI+OwogCkBAIC0zOTcsOCArNDAzLDYgQEAKICAgSGVscFRleHQ8IldlYWtseSBsaW5rIGluIHRoZSBibG9ja3MgcnVudGltZSI+OwogZGVmIGZzamxqX2V4Y2VwdGlvbnMgOiBGbGFnPFsiLSJdLCAiZnNqbGotZXhjZXB0aW9ucyI+LAogICBIZWxwVGV4dDwiVXNlIFNqTGogc3R5bGUgZXhjZXB0aW9ucyI+OwotZGVmIGZoaWRkZW5fd2Vha192dGFibGVzIDogRmxhZzxbIi0iXSwgImZoaWRkZW4td2Vhay12dGFibGVzIj4sCi0gIEhlbHBUZXh0PCJHZW5lcmF0ZSB3ZWFrIHZ0YWJsZXMgYW5kIFJUVEkgd2l0aCBoaWRkZW4gdmlzaWJpbGl0eSI+OwogZGVmIG1haW5fZmlsZV9uYW1lIDogU2VwYXJhdGU8WyItIl0sICJtYWluLWZpbGUtbmFtZSI+LAogICBIZWxwVGV4dDwiTWFpbiBmaWxlIG5hbWUgdG8gdXNlIGZvciBkZWJ1ZyBpbmZvIj47CiBkZWYgc3BsaXRfZHdhcmZfZmlsZSA6IFNlcGFyYXRlPFsiLSJdLCAic3BsaXQtZHdhcmYtZmlsZSI+LApAQCAtNDc2LDYgKzQ4MCw4IEBACiAgIEhlbHBUZXh0PCJFbmFibGUgQysrMXkgc2l6ZWQgZ2xvYmFsIGRlYWxsb2NhdGlvbiBmdW5jdGlvbnMiPjsKIGRlZiBmb2JqY19zdWJzY3JpcHRpbmdfbGVnYWN5X3J1bnRpbWUgOiBGbGFnPFsiLSJdLCAiZm9iamMtc3Vic2NyaXB0aW5nLWxlZ2FjeS1ydW50aW1lIj4sCiAgIEhlbHBUZXh0PCJBbGxvdyBPYmplY3RpdmUtQyBhcnJheSBhbmQgZGljdGlvbmFyeSBzdWJzY3JpcHRpbmcgaW4gbGVnYWN5IHJ1bnRpbWUiPjsKK2RlZiB2dG9yZGlzcF9tb2RlX0VRIDogSm9pbmVkPFsiLSJdLCAidnRvcmRpc3AtbW9kZT0iPiwKKyAgSGVscFRleHQ8IkNvbnRyb2wgdnRvcmRpc3AgcGxhY2VtZW50IG9uIHdpbjMyIHRhcmdldHMiPjsKIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIC8vIEhlYWRlciBTZWFyY2ggT3B0aW9ucwpAQCAtNTA0LDE0ICs1MTAsNiBAQAogICAgICAgICAgICAiaW1wbGljaXQgZXh0ZXJuIFwiQ1wiIHNlbWFudGljczsgdGhlc2UgYXJlIGFzc3VtZWQgdG8gbm90IGJlICIKICAgICAgICAgICAgInVzZXItcHJvdmlkZWQgYW5kIGFyZSB1c2VkIHRvIG1vZGVsIHN5c3RlbSBhbmQgc3RhbmRhcmQgaGVhZGVycycgIgogICAgICAgICAgICAicGF0aHMuIj47Ci1kZWYgaXN5c3RlbV9wcmVmaXggOiBKb2luZWRPclNlcGFyYXRlPFsiLSJdLCAiaXN5c3RlbS1wcmVmaXgiPiwKLSAgTWV0YVZhck5hbWU8IjxwcmVmaXg+Ij4sCi0gIEhlbHBUZXh0PCJUcmVhdCBhbGwgI2luY2x1ZGUgcGF0aHMgc3RhcnRpbmcgd2l0aCA8cHJlZml4PiBhcyBpbmNsdWRpbmcgYSAiCi0gICAgICAgICAgICJzeXN0ZW0gaGVhZGVyLiI+OwotZGVmIGlub19zeXN0ZW1fcHJlZml4IDogSm9pbmVkT3JTZXBhcmF0ZTxbIi0iXSwgImluby1zeXN0ZW0tcHJlZml4Ij4sCi0gIE1ldGFWYXJOYW1lPCI8cHJlZml4PiI+LAotICBIZWxwVGV4dDwiVHJlYXQgYWxsICNpbmNsdWRlIHBhdGhzIHN0YXJ0aW5nIHdpdGggPHByZWZpeD4gYXMgbm90IGluY2x1ZGluZyBhICIKLSAgICAgICAgICAgInN5c3RlbSBoZWFkZXIuIj47CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAvLyBQcmVwcm9jZXNzb3IgT3B0aW9ucwpAQCAtNTM5LDYgKzUzNyw4IEBACiAgIEhlbHBUZXh0PCJPcGVuQ0wgb25seS4gVHJlYXQgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBjb25zdGFudCBhcyBzaW5nbGUgcHJlY2lzaW9uIGNvbnN0YW50LiI+OwogZGVmIGNsX2Zpbml0ZV9tYXRoX29ubHkgOiBGbGFnPFsiLSJdLCAiY2wtZmluaXRlLW1hdGgtb25seSI+LAogICBIZWxwVGV4dDwiT3BlbkNMIG9ubHkuIEFsbG93IGZsb2F0aW5nLXBvaW50IG9wdGltaXphdGlvbnMgdGhhdCBhc3N1bWUgYXJndW1lbnRzIGFuZCByZXN1bHRzIGFyZSBub3QgTmFOcyBvciArLUluZi4iPjsKK2RlZiBjbF9rZXJuZWxfYXJnX2luZm8gOiBGbGFnPFsiLSJdLCAiY2wta2VybmVsLWFyZy1pbmZvIj4sCisgIEhlbHBUZXh0PCJPcGVuQ0wgb25seS4gR2VuZXJhdGUga2VybmVsIGFyZ3VtZW50IG1ldGFkYXRhLiI+OwogZGVmIGNsX3Vuc2FmZV9tYXRoX29wdGltaXphdGlvbnMgOiBGbGFnPFsiLSJdLCAiY2wtdW5zYWZlLW1hdGgtb3B0aW1pemF0aW9ucyI+LAogICBIZWxwVGV4dDwiT3BlbkNMIG9ubHkuIEFsbG93IHVuc2FmZSBmbG9hdGluZy1wb2ludCBvcHRpbWl6YXRpb25zLiAgQWxzbyBpbXBsaWVzIC1jbC1uby1zaWduZWQtemVyb3MgYW5kIC1jbC1tYWQtZW5hYmxlIj47CiBkZWYgY2xfZmFzdF9yZWxheGVkX21hdGggOiBGbGFnPFsiLSJdLCAiY2wtZmFzdC1yZWxheGVkLW1hdGgiPiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NMQ29tcGF0T3B0aW9ucy50ZCBiL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NMQ29tcGF0T3B0aW9ucy50ZAppbmRleCBkMTdhNjNjLi5kMzNlNmI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DTENvbXBhdE9wdGlvbnMudGQKKysrIGIvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0xDb21wYXRPcHRpb25zLnRkCkBAIC01NywxMCArNTcsMTUgQEAKIGRlZiBfU0xBU0hfYyA6IENMRmxhZzwiYyI+LCBIZWxwVGV4dDwiQ29tcGlsZSBvbmx5Ij4sIEFsaWFzPGM+OwogZGVmIF9TTEFTSF9EIDogQ0xKb2luZWRPclNlcGFyYXRlPCJEIj4sIEhlbHBUZXh0PCJEZWZpbmUgbWFjcm8iPiwKICAgTWV0YVZhck5hbWU8IjxtYWNyb1s9dmFsdWVdPiI+LCBBbGlhczxEPjsKK2RlZiBfU0xBU0hfRSA6IENMRmxhZzwiRSI+LCBIZWxwVGV4dDwiUHJlcHJvY2VzcyB0byBzdGRvdXQiPiwgQWxpYXM8RT47CiBkZWYgX1NMQVNIX0dSIDogQ0xGbGFnPCJHUiI+LCBIZWxwVGV4dDwiRW5hYmxlIFJUVEkiPiwgQWxpYXM8ZnJ0dGk+OwogZGVmIF9TTEFTSF9HUl8gOiBDTEZsYWc8IkdSLSI+LCBIZWxwVGV4dDwiRGlzYWJsZSBSVFRJIj4sIEFsaWFzPGZub19ydHRpPjsKIGRlZiBfU0xBU0hfR0ZfIDogQ0xGbGFnPCJHRi0iPiwgSGVscFRleHQ8IkRpc2FibGUgc3RyaW5nIHBvb2xpbmciPiwKICAgQWxpYXM8ZndyaXRhYmxlX3N0cmluZ3M+OworZGVmIF9TTEFTSF9HeSA6IENMRmxhZzwiR3kiPiwgSGVscFRleHQ8IlB1dCBlYWNoIGZ1bmN0aW9uIGluIGl0cyBvd24gc2VjdGlvbiI+LAorICBBbGlhczxmZnVuY3Rpb25fc2VjdGlvbnM+OworZGVmIF9TTEFTSF9HeV8gOiBDTEZsYWc8Ikd5LSI+LCBIZWxwVGV4dDwiRG9uJ3QgcHV0IGVhY2ggZnVuY3Rpb24gaW4gaXRzIG93biBzZWN0aW9uIj4sCisgIEFsaWFzPGZub19mdW5jdGlvbl9zZWN0aW9ucz47CiBkZWYgX1NMQVNIX2hlbHAgOiBDTEZsYWc8ImhlbHAiPiwgQWxpYXM8aGVscD4sCiAgIEhlbHBUZXh0PCJEaXNwbGF5IGF2YWlsYWJsZSBvcHRpb25zIj47CiBkZWYgX1NMQVNIX0hFTFAgOiBDTEZsYWc8IkhFTFAiPiwgQWxpYXM8aGVscD47CkBAIC04OCw3ICs5Myw2IEBACiAgIEFsaWFzPGZvbWl0X2ZyYW1lX3BvaW50ZXI+OwogZGVmIF9TTEFTSF9PeV8gOiBDTEZsYWc8Ik95LSI+LCBIZWxwVGV4dDwiRGlzYWJsZSBmcmFtZSBwb2ludGVyIG9taXNzaW9uIj4sCiAgIEFsaWFzPGZub19vbWl0X2ZyYW1lX3BvaW50ZXI+OwotZGVmIF9TTEFTSF9QIDogQ0xGbGFnPCJQIj4sIEhlbHBUZXh0PCJPbmx5IHJ1biB0aGUgcHJlcHJvY2Vzc29yIj4sIEFsaWFzPEU+OwogZGVmIF9TTEFTSF9RVUVTVElPTiA6IENMRmxhZzwiPyI+LCBBbGlhczxoZWxwPiwKICAgSGVscFRleHQ8IkRpc3BsYXkgYXZhaWxhYmxlIG9wdGlvbnMiPjsKIGRlZiBfU0xBU0hfc2hvd0luY2x1ZGVzIDogQ0xGbGFnPCJzaG93SW5jbHVkZXMiPiwKQEAgLTk2LDYgKzEwMCwxNiBAQAogICBBbGlhczxzaG93X2luY2x1ZGVzPjsKIGRlZiBfU0xBU0hfVSA6IENMSm9pbmVkT3JTZXBhcmF0ZTwiVSI+LCBIZWxwVGV4dDwiVW5kZWZpbmUgbWFjcm8iPiwKICAgTWV0YVZhck5hbWU8IjxtYWNybz4iPiwgQWxpYXM8VT47CitkZWYgX1NMQVNIX3ZtYiA6IENMRmxhZzwidm1iIj4sCisgIEhlbHBUZXh0PCJVc2UgYSBiZXN0LWNhc2UgcmVwcmVzZW50YXRpb24gbWV0aG9kIGZvciBtZW1iZXIgcG9pbnRlcnMiPjsKK2RlZiBfU0xBU0hfdm1nIDogQ0xGbGFnPCJ2bWciPiwKKyAgSGVscFRleHQ8IlVzZSBhIG1vc3QtZ2VuZXJhbCByZXByZXNlbnRhdGlvbiBmb3IgbWVtYmVyIHBvaW50ZXJzIj47CitkZWYgX1NMQVNIX3ZtcyA6IENMRmxhZzwidm1zIj4sCisgIEhlbHBUZXh0PCJTZXQgdGhlIGRlZmF1bHQgbW9zdC1nZW5lcmFsIHJlcHJlc2VudGF0aW9uIHRvIHNpbmdsZSBpbmhlcml0YW5jZSI+OworZGVmIF9TTEFTSF92bW0gOiBDTEZsYWc8InZtbSI+LAorICBIZWxwVGV4dDwiU2V0IHRoZSBkZWZhdWx0IG1vc3QtZ2VuZXJhbCByZXByZXNlbnRhdGlvbiB0byBtdWx0aXBsZSBpbmhlcml0YW5jZSI+OworZGVmIF9TTEFTSF92bXYgOiBDTEZsYWc8InZtdiI+LAorICBIZWxwVGV4dDwiU2V0IHRoZSBkZWZhdWx0IG1vc3QtZ2VuZXJhbCByZXByZXNlbnRhdGlvbiB0byB2aXJ0dWFsIGluaGVyaXRhbmNlIj47CiBkZWYgX1NMQVNIX1cwIDogQ0xGbGFnPCJXMCI+LCBIZWxwVGV4dDwiRGlzYWJsZSBhbGwgd2FybmluZ3MiPiwgQWxpYXM8dz47CiBkZWYgX1NMQVNIX1cxIDogQ0xGbGFnPCJXMSI+LCBIZWxwVGV4dDwiRW5hYmxlIC1XYWxsIj4sIEFsaWFzPFdhbGw+OwogZGVmIF9TTEFTSF9XMiA6IENMRmxhZzwiVzIiPiwgSGVscFRleHQ8IkVuYWJsZSAtV2FsbCI+LCBBbGlhczxXYWxsPjsKQEAgLTEwNyw2ICsxMjEsMTEgQEAKIGRlZiBfU0xBU0hfV1hfIDogQ0xGbGFnPCJXWC0iPiwgSGVscFRleHQ8IkRvIG5vdCB0cmVhdCB3YXJuaW5ncyBhcyBlcnJvcnMiPiwKICAgQWxpYXM8V19Kb2luZWQ+LCBBbGlhc0FyZ3M8WyJuby1lcnJvciJdPjsKIGRlZiBfU0xBU0hfd19mbGFnIDogQ0xGbGFnPCJ3Ij4sIEhlbHBUZXh0PCJEaXNhYmxlIGFsbCB3YXJuaW5ncyI+LCBBbGlhczx3PjsKK2RlZiBfU0xBU0hfdmQgOiBDTEpvaW5lZDwidmQiPiwgSGVscFRleHQ8IkNvbnRyb2wgdnRvcmRpc3AgcGxhY2VtZW50Ij4sCisgIEFsaWFzPHZ0b3JkaXNwX21vZGVfRVE+OworZGVmIF9TTEFTSF9aNyA6IENMRmxhZzwiWjciPiwgQWxpYXM8Z2xpbmVfdGFibGVzX29ubHk+OworZGVmIF9TTEFTSF9aaSA6IENMRmxhZzwiWmkiPiwgSGVscFRleHQ8IkVuYWJsZSBkZWJ1ZyBpbmZvcm1hdGlvbiI+LAorICBBbGlhczxnbGluZV90YWJsZXNfb25seT47CiBkZWYgX1NMQVNIX1pzIDogQ0xGbGFnPCJacyI+LCBIZWxwVGV4dDwiU3ludGF4LWNoZWNrIG9ubHkiPiwKICAgQWxpYXM8ZnN5bnRheF9vbmx5PjsKIApAQCAtMTQyLDYgKzE2MSw3IEBACiAgIEZsYWdzPFtDTE9wdGlvbiwgRHJpdmVyT3B0aW9uXT4sIEhlbHBUZXh0PCJVc2Ugc3RhdGljIHJ1bi10aW1lIj47CiBkZWYgX1NMQVNIX01UZCA6IE9wdGlvbjxbIi8iLCAiLSJdLCAiTVRkIiwgS0lORF9GTEFHPiwgR3JvdXA8X1NMQVNIX01fR3JvdXA+LAogICBGbGFnczxbQ0xPcHRpb24sIERyaXZlck9wdGlvbl0+LCBIZWxwVGV4dDwiVXNlIHN0YXRpYyBkZWJ1ZyBydW4tdGltZSI+OworZGVmIF9TTEFTSF9QIDogQ0xGbGFnPCJQIj4sIEhlbHBUZXh0PCJQcmVwcm9jZXNzIHRvIGZpbGUiPjsKIGRlZiBfU0xBU0hfVGMgOiBDTENvbXBpbGVKb2luZWRPclNlcGFyYXRlPCJUYyI+LAogICBIZWxwVGV4dDwiU3BlY2lmeSBhIEMgc291cmNlIGZpbGUiPiwgTWV0YVZhck5hbWU8IjxmaWxlbmFtZT4iPjsKIGRlZiBfU0xBU0hfVEMgOiBDTENvbXBpbGVGbGFnPCJUQyI+LCBIZWxwVGV4dDwiVHJlYXQgYWxsIHNvdXJjZSBmaWxlcyBhcyBDIj47CkBAIC0xNjQsNyArMTg0LDYgQEAKIGRlZiBfU0xBU0hfUlRDIDogQ0xJZ25vcmVkSm9pbmVkPCJSVEMiPjsKIGRlZiBfU0xBU0hfc2RsIDogQ0xJZ25vcmVkRmxhZzwic2RsIj47CiBkZWYgX1NMQVNIX3NkbF8gOiBDTElnbm9yZWRGbGFnPCJzZGwtIj47Ci1kZWYgX1NMQVNIX3ZtZyA6IENMSWdub3JlZEZsYWc8InZtZyI+OwogZGVmIF9TTEFTSF93IDogQ0xJZ25vcmVkSm9pbmVkPCJ3Ij47CiBkZWYgX1NMQVNIX1pjX2ZvclNjb3BlIDogQ0xJZ25vcmVkRmxhZzwiWmM6Zm9yU2NvcGUiPjsKIGRlZiBfU0xBU0hfWmNfd2NoYXJfdCA6IENMSWdub3JlZEZsYWc8IlpjOndjaGFyX3QiPjsKQEAgLTE3Nyw4ICsxOTYsOCBAQAogZGVmIF9TTEFTSF9hcmNoIDogQ0xKb2luZWQ8ImFyY2g6Ij47CiBkZWYgX1NMQVNIX2JpZ29iaiA6IENMRmxhZzwiYmlnb2JqIj47CiBkZWYgX1NMQVNIX2NsciA6IENMSm9pbmVkPCJjbHIiPjsKK2RlZiBfU0xBU0hfZDJaaV9QTFVTIDogQ0xGbGFnPCJkMlppKyI+OwogZGVmIF9TTEFTSF9kb2MgOiBDTEpvaW5lZDwiZG9jIj47Ci1kZWYgX1NMQVNIX0UgOiBDTEZsYWc8IkUiPjsKIGRlZiBfU0xBU0hfRUggOiBDTEpvaW5lZDwiRUgiPjsKIGRlZiBfU0xBU0hfRVAgOiBDTEZsYWc8IkVQIj47CiBkZWYgX1NMQVNIX0ZBX2pvaW5lZCA6IENMSm9pbmVkPCJGQSI+OwpAQCAtMjEwLDggKzIyOSw2IEBACiBkZWYgX1NMQVNIX0dzIDogQ0xKb2luZWQ8IkdzIj47CiBkZWYgX1NMQVNIX0dUIDogQ0xGbGFnPCJHVCI+OwogZGVmIF9TTEFTSF9HWCA6IENMRmxhZzwiR1giPjsKLWRlZiBfU0xBU0hfR3kgOiBDTEZsYWc8Ikd5Ij47Ci1kZWYgX1NMQVNIX0d5XyA6IENMRmxhZzwiR3ktIj47CiBkZWYgX1NMQVNIX0d6IDogQ0xGbGFnPCJHeiI+OwogZGVmIF9TTEFTSF9HWiA6IENMRmxhZzwiR1oiPjsKIGRlZiBfU0xBU0hfSCA6IENMRmxhZzwiSCI+OwpAQCAtMjI5LDExICsyNDYsNiBAQAogZGVmIF9TTEFTSF9RdmVjX3JlcG9ydCA6IENMSm9pbmVkPCJRdmVjLXJlcG9ydCI+OwogZGVmIF9TTEFTSF91IDogQ0xGbGFnPCJ1Ij47CiBkZWYgX1NMQVNIX1YgOiBDTEZsYWc8IlYiPjsKLWRlZiBfU0xBU0hfdmQgOiBDTEpvaW5lZDwidmQiPjsKLWRlZiBfU0xBU0hfdm1iIDogQ0xGbGFnPCJ2bWIiPjsKLWRlZiBfU0xBU0hfdm1tIDogQ0xGbGFnPCJ2bW0iPjsKLWRlZiBfU0xBU0hfdm1zIDogQ0xGbGFnPCJ2bXMiPjsKLWRlZiBfU0xBU0hfdm12IDogQ0xGbGFnPCJ2bXYiPjsKIGRlZiBfU0xBU0hfdm9sYXRpbGUgOiBDTEZsYWc8InZvbGF0aWxlIj47CiBkZWYgX1NMQVNIX1dMIDogQ0xGbGFnPCJXTCI+OwogZGVmIF9TTEFTSF9XcDY0IDogQ0xGbGFnPCJXcDY0Ij47CkBAIC0yNDMsMTMgKzI1NSwxMSBAQAogZGVmIF9TTEFTSF9ZZCA6IENMRmxhZzwiWWQiPjsKIGRlZiBfU0xBU0hfWWwgOiBDTEpvaW5lZDwiWWwiPjsKIGRlZiBfU0xBU0hfWXUgOiBDTEpvaW5lZDwiWXUiPjsKLWRlZiBfU0xBU0hfWjcgOiBDTEZsYWc8Ilo3Ij47CiBkZWYgX1NMQVNIX1phIDogQ0xGbGFnPCJaYSI+OwogZGVmIF9TTEFTSF9aYyA6IENMSm9pbmVkPCJaYzoiPjsKIGRlZiBfU0xBU0hfWmUgOiBDTEZsYWc8IlplIj47CiBkZWYgX1NMQVNIX1pnIDogQ0xGbGFnPCJaZyI+OwotZGVmIF9TTEFTSF9aaSA6IENMRmxhZzwiWmkiPjsKIGRlZiBfU0xBU0hfWkkgOiBDTEZsYWc8IlpJIj47CiBkZWYgX1NMQVNIX1psIDogQ0xGbGFnPCJabCI+OwotZGVmIF9TTEFTSF9acCA6IENMRmxhZzwiWnAiPjsKK2RlZiBfU0xBU0hfWnAgOiBDTEpvaW5lZDwiWnAiPjsKIGRlZiBfU0xBU0hfWlcgOiBDTEpvaW5lZDwiWlciPjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0RyaXZlci5oIGIvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvRHJpdmVyLmgKaW5kZXggODY3NDQ0ZS4uMDQ0ODcyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvRHJpdmVyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvRHJpdmVyLmgKQEAgLTE1LDExICsxNSwxMSBAQAogI2luY2x1ZGUgImNsYW5nL0RyaXZlci9QaGFzZXMuaCIKICNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvVHlwZXMuaCIKICNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvVXRpbC5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgogI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiIC8vIEZJWE1FOiBLaWxsIHdoZW4gQ29tcGlsYXRpb25JbmZvCisjaW5jbHVkZSA8bWVtb3J5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFuZHMuCiAjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxzZXQ+CkBAIC00MTUsNiArNDE1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhZEV4dHJhKTsKIH07CiAKKy8vLyBccmV0dXJuIFRydWUgaWYgdGhlIGxhc3QgZGVmaW5lZCBvcHRpbWl6YXRpb24gbGV2ZWwgaXMgLU9mYXN0LgorLy8vIEFuZCBGYWxzZSBvdGhlcndpc2UuCitib29sIGlzT3B0aW1pemF0aW9uTGV2ZWxGYXN0KGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CisKIH0gLy8gZW5kIG5hbWVzcGFjZSBkcml2ZXIKIH0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9Kb2IuaCBiL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0pvYi5oCmluZGV4IDFkZDQ5YTcuLjViMTllZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0pvYi5oCisrKyBiL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0pvYi5oCkBAIC0xMSw5ICsxMSw5IEBACiAjZGVmaW5lIENMQU5HX0RSSVZFUl9KT0JfSF8KIAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgogI2luY2x1ZGUgImxsdm0vT3B0aW9uL09wdGlvbi5oIgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGxsdm0gewogICBjbGFzcyByYXdfb3N0cmVhbTsKQEAgLTc2LDggKzc2LDggQEAKICAgQ29tbWFuZChjb25zdCBBY3Rpb24gJl9Tb3VyY2UsIGNvbnN0IFRvb2wgJl9DcmVhdG9yLCBjb25zdCBjaGFyICpfRXhlY3V0YWJsZSwKICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJl9Bcmd1bWVudHMpOwogCi0gIHZpcnR1YWwgdm9pZCBQcmludChsbHZtOjpyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IGNoYXIgKlRlcm1pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICBib29sIFF1b3RlLCBib29sIENyYXNoUmVwb3J0ID0gZmFsc2UpIGNvbnN0OworICB2b2lkIFByaW50KGxsdm06OnJhd19vc3RyZWFtICZPUywgY29uc3QgY2hhciAqVGVybWluYXRvciwgYm9vbCBRdW90ZSwKKyAgICAgICAgICAgICBib29sIENyYXNoUmVwb3J0ID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHZpcnR1YWwgaW50IEV4ZWN1dGUoY29uc3QgU3RyaW5nUmVmICoqUmVkaXJlY3RzLCBzdGQ6OnN0cmluZyAqRXJyTXNnLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkV4ZWN1dGlvbkZhaWxlZCkgY29uc3Q7CkBAIC04OCw2ICs4OCw4IEBACiAgIC8vLyBnZXRDcmVhdG9yIC0gUmV0dXJuIHRoZSBUb29sIHdoaWNoIGNhdXNlZCB0aGUgY3JlYXRpb24gb2YgdGhpcyBqb2IuCiAgIGNvbnN0IFRvb2wgJmdldENyZWF0b3IoKSBjb25zdCB7IHJldHVybiBDcmVhdG9yOyB9CiAKKyAgY29uc3QgY2hhciAqZ2V0RXhlY3V0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIEV4ZWN1dGFibGU7IH0KKwogICBjb25zdCBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJmdldEFyZ3VtZW50cygpIGNvbnN0IHsgcmV0dXJuIEFyZ3VtZW50czsgfQogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSm9iICpKKSB7CkBAIC0xMDQsMTggKzEwNiwxOCBAQAogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqRXhlY3V0YWJsZV8sIGNvbnN0IEFyZ1N0cmluZ0xpc3QgJkFyZ3VtZW50c18sCiAgICAgICAgICAgICAgICAgICBDb21tYW5kICpGYWxsYmFja18pOwogCi0gIHZpcnR1YWwgdm9pZCBQcmludChsbHZtOjpyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IGNoYXIgKlRlcm1pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICBib29sIFF1b3RlLCBib29sIENyYXNoUmVwb3J0ID0gZmFsc2UpIGNvbnN0OworICB2b2lkIFByaW50KGxsdm06OnJhd19vc3RyZWFtICZPUywgY29uc3QgY2hhciAqVGVybWluYXRvciwgYm9vbCBRdW90ZSwKKyAgICAgICAgICAgICBib29sIENyYXNoUmVwb3J0ID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgaW50IEV4ZWN1dGUoY29uc3QgU3RyaW5nUmVmICoqUmVkaXJlY3RzLCBzdGQ6OnN0cmluZyAqRXJyTXNnLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkV4ZWN1dGlvbkZhaWxlZCkgY29uc3Q7CisgIGludCBFeGVjdXRlKGNvbnN0IFN0cmluZ1JlZiAqKlJlZGlyZWN0cywgc3RkOjpzdHJpbmcgKkVyck1zZywKKyAgICAgICAgICAgICAgYm9vbCAqRXhlY3V0aW9uRmFpbGVkKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEpvYiAqSikgewogICAgIHJldHVybiBKLT5nZXRLaW5kKCkgPT0gRmFsbGJhY2tDb21tYW5kQ2xhc3M7CiAgIH0KIAogcHJpdmF0ZToKLSAgT3duaW5nUHRyPENvbW1hbmQ+IEZhbGxiYWNrOworICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZD4gRmFsbGJhY2s7CiB9OwogCiAvLy8gSm9iTGlzdCAtIEEgc2VxdWVuY2Ugb2Ygam9icyB0byBwZXJmb3JtLgpAQCAtMTMzLDggKzEzNSw4IEBACiAgIEpvYkxpc3QoKTsKICAgdmlydHVhbCB+Sm9iTGlzdCgpOwogCi0gIHZpcnR1YWwgdm9pZCBQcmludChsbHZtOjpyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IGNoYXIgKlRlcm1pbmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICBib29sIFF1b3RlLCBib29sIENyYXNoUmVwb3J0ID0gZmFsc2UpIGNvbnN0OworICB2b2lkIFByaW50KGxsdm06OnJhd19vc3RyZWFtICZPUywgY29uc3QgY2hhciAqVGVybWluYXRvciwKKyAgICAgICAgICAgICBib29sIFF1b3RlLCBib29sIENyYXNoUmVwb3J0ID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vLyBBZGQgYSBqb2IgdG8gdGhlIGxpc3QgKHRha2luZyBvd25lcnNoaXApLgogICB2b2lkIGFkZEpvYihKb2IgKkopIHsgSm9icy5wdXNoX2JhY2soSik7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL011bHRpbGliLmggYi9pbmNsdWRlL2NsYW5nL0RyaXZlci9NdWx0aWxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzczOGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NsYW5nL0RyaXZlci9NdWx0aWxpYi5oCkBAIC0wLDAgKzEsMTY3IEBACisvLz09PS0tLSBNdWx0aWxpYi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIENMQU5HX0xJQl9EUklWRVJfTVVMVElMSUJfSF8KKyNkZWZpbmUgQ0xBTkdfTElCX0RSSVZFUl9NVUxUSUxJQl9IXworCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vT3B0aW9uL09wdGlvbi5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgZHJpdmVyIHsKKworLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgR0NDIE11bHRpbGliLCBvciBhIHNlZ21lbnQgb2Ygb25lIGNvbnRyb2xsZWQKKy8vLyBieSBhIGNvbW1hbmQgbGluZSBmbGFnCitjbGFzcyBNdWx0aWxpYiB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZsYWdzX2xpc3Q7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIEdDQ1N1ZmZpeDsKKyAgc3RkOjpzdHJpbmcgT1NTdWZmaXg7CisgIHN0ZDo6c3RyaW5nIEluY2x1ZGVTdWZmaXg7CisgIGZsYWdzX2xpc3QgRmxhZ3M7CisKK3B1YmxpYzoKKyAgTXVsdGlsaWIoU3RyaW5nUmVmIEdDQ1N1ZmZpeCA9ICIiLCBTdHJpbmdSZWYgT1NTdWZmaXggPSAiIiwKKyAgICAgICAgICAgU3RyaW5nUmVmIEluY2x1ZGVTdWZmaXggPSAiIik7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGRldGVjdGVkIEdDQyBpbnN0YWxsYXRpb24gcGF0aCBzdWZmaXggZm9yIHRoZSBtdWx0aS1hcmNoCisgIC8vLyB0YXJnZXQgdmFyaWFudC4gQWx3YXlzIHN0YXJ0cyB3aXRoIGEgJy8nLCB1bmxlc3MgZW1wdHkKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdjY1N1ZmZpeCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoR0NDU3VmZml4LmVtcHR5KCkgfHwKKyAgICAgICAgICAgKFN0cmluZ1JlZihHQ0NTdWZmaXgpLmZyb250KCkgPT0gJy8nICYmIEdDQ1N1ZmZpeC5zaXplKCkgPiAxKSk7CisgICAgcmV0dXJuIEdDQ1N1ZmZpeDsKKyAgfQorICAvLy8gU2V0IHRoZSBHQ0MgaW5zdGFsbGF0aW9uIHBhdGggc3VmZml4LgorICBNdWx0aWxpYiAmZ2NjU3VmZml4KFN0cmluZ1JlZiBTKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgZGV0ZWN0ZWQgb3MgcGF0aCBzdWZmaXggZm9yIHRoZSBtdWx0aS1hcmNoCisgIC8vLyB0YXJnZXQgdmFyaWFudC4gQWx3YXlzIHN0YXJ0cyB3aXRoIGEgJy8nLCB1bmxlc3MgZW1wdHkKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJm9zU3VmZml4KCkgY29uc3QgeworICAgIGFzc2VydChPU1N1ZmZpeC5lbXB0eSgpIHx8CisgICAgICAgICAgIChTdHJpbmdSZWYoT1NTdWZmaXgpLmZyb250KCkgPT0gJy8nICYmIE9TU3VmZml4LnNpemUoKSA+IDEpKTsKKyAgICByZXR1cm4gT1NTdWZmaXg7CisgIH0KKyAgLy8vIFNldCB0aGUgb3MgcGF0aCBzdWZmaXguCisgIE11bHRpbGliICZvc1N1ZmZpeChTdHJpbmdSZWYgUyk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGluY2x1ZGUgZGlyZWN0b3J5IHN1ZmZpeC4gQWx3YXlzIHN0YXJ0cyB3aXRoIGEgJy8nLCB1bmxlc3MKKyAgLy8vIGVtcHR5CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZpbmNsdWRlU3VmZml4KCkgY29uc3QgeworICAgIGFzc2VydChJbmNsdWRlU3VmZml4LmVtcHR5KCkgfHwKKyAgICAgICAgICAgKFN0cmluZ1JlZihJbmNsdWRlU3VmZml4KS5mcm9udCgpID09ICcvJyAmJiBJbmNsdWRlU3VmZml4LnNpemUoKSA+IDEpKTsKKyAgICByZXR1cm4gSW5jbHVkZVN1ZmZpeDsKKyAgfQorICAvLy8gU2V0IHRoZSBpbmNsdWRlIGRpcmVjdG9yeSBzdWZmaXgKKyAgTXVsdGlsaWIgJmluY2x1ZGVTdWZmaXgoU3RyaW5nUmVmIFMpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBmbGFncyB0aGF0IGluZGljYXRlIG9yIGNvbnRyYWluZGljYXRlIHRoaXMgbXVsdGlsaWIncyB1c2UKKyAgLy8vIEFsbCBlbGVtZW50cyBiZWdpbiB3aXRoIGVpdGhlciAnKycgb3IgJy0nCisgIGNvbnN0IGZsYWdzX2xpc3QgJmZsYWdzKCkgY29uc3QgeyByZXR1cm4gRmxhZ3M7IH0KKyAgZmxhZ3NfbGlzdCAmZmxhZ3MoKSB7IHJldHVybiBGbGFnczsgfQorICAvLy8gQWRkIGEgZmxhZyB0byB0aGUgZmxhZ3MgbGlzdAorICBNdWx0aWxpYiAmZmxhZyhTdHJpbmdSZWYgRikgeworICAgIGFzc2VydChGLmZyb250KCkgPT0gJysnIHx8IEYuZnJvbnQoKSA9PSAnLScpOworICAgIEZsYWdzLnB1c2hfYmFjayhGKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIHByaW50IHN1bW1hcnkgb2YgdGhlIE11bHRpbGliCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gQ2hlY2sgd2hldGhlciBhbnkgb2YgdGhlICdhZ2FpbnN0JyBmbGFncyBjb250cmFkaWN0IHRoZSAnZm9yJyBmbGFncy4KKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhlIGRlZmF1bHQgaXMgc2VsZWN0ZWQKKyAgYm9vbCBpc0RlZmF1bHQoKSBjb25zdAorICB7IHJldHVybiBHQ0NTdWZmaXguZW1wdHkoKSAmJiBPU1N1ZmZpeC5lbXB0eSgpICYmIEluY2x1ZGVTdWZmaXguZW1wdHkoKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNdWx0aWxpYiAmT3RoZXIpIGNvbnN0OworfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNdWx0aWxpYiAmTSk7CisKK2NsYXNzIE11bHRpbGliU2V0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxNdWx0aWxpYj4gbXVsdGlsaWJfbGlzdDsKKyAgdHlwZWRlZiBtdWx0aWxpYl9saXN0OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiBtdWx0aWxpYl9saXN0Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICBzdHJ1Y3QgRmlsdGVyQ2FsbGJhY2sgeworICAgIHZpcnR1YWwgfkZpbHRlckNhbGxiYWNrKCkge307CisgICAgLy8vIFxyZXR1cm4gdHJ1ZSBpZmYgdGhlIGZpbHRlciBzaG91bGQgcmVtb3ZlIHRoZSBNdWx0aWxpYiBmcm9tIHRoZSBzZXQKKyAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3IoKShjb25zdCBNdWx0aWxpYiAmTSkgY29uc3QgPSAwOworICB9OworCitwcml2YXRlOgorICBtdWx0aWxpYl9saXN0IE11bHRpbGliczsKKworcHVibGljOgorICBNdWx0aWxpYlNldCgpIHt9CisKKyAgLy8vIEFkZCBhbiBvcHRpb25hbCBNdWx0aWxpYiBzZWdtZW50CisgIE11bHRpbGliU2V0ICZNYXliZShjb25zdCBNdWx0aWxpYiAmTSk7CisKKyAgLy8vIEFkZCBhIHNldCBvZiBtdXR1YWxseSBpbmNvbXBhdGlibGUgTXVsdGlsaWIgc2VnbWVudHMKKyAgTXVsdGlsaWJTZXQgJkVpdGhlcihjb25zdCBNdWx0aWxpYiAmTTEsIGNvbnN0IE11bHRpbGliICZNMik7CisgIE11bHRpbGliU2V0ICZFaXRoZXIoY29uc3QgTXVsdGlsaWIgJk0xLCBjb25zdCBNdWx0aWxpYiAmTTIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlsaWIgJk0zKTsKKyAgTXVsdGlsaWJTZXQgJkVpdGhlcihjb25zdCBNdWx0aWxpYiAmTTEsIGNvbnN0IE11bHRpbGliICZNMiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aWxpYiAmTTMsIGNvbnN0IE11bHRpbGliICZNNCk7CisgIE11bHRpbGliU2V0ICZFaXRoZXIoY29uc3QgTXVsdGlsaWIgJk0xLCBjb25zdCBNdWx0aWxpYiAmTTIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlsaWIgJk0zLCBjb25zdCBNdWx0aWxpYiAmTTQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlsaWIgJk01KTsKKyAgTXVsdGlsaWJTZXQgJkVpdGhlcihjb25zdCBzdGQ6OnZlY3RvcjxNdWx0aWxpYj4gJk1zKTsKKworICAvLy8gRmlsdGVyIG91dCBzb21lIHN1YnNldCBvZiB0aGUgTXVsdGlsaWJzIHVzaW5nIGEgdXNlciBkZWZpbmVkIGNhbGxiYWNrCisgIE11bHRpbGliU2V0ICZGaWx0ZXJPdXQoY29uc3QgRmlsdGVyQ2FsbGJhY2sgJkYpOworICAvLy8gRmlsdGVyIG91dCB0aG9zZSBNdWx0aWxpYnMgd2hvc2UgZ2NjU3VmZml4IG1hdGNoZXMgdGhlIGdpdmVuIGV4cHJlc3Npb24KKyAgTXVsdGlsaWJTZXQgJkZpbHRlck91dChzdGQ6OnN0cmluZyBSZWdleCk7CisKKyAgLy8vIEFkZCBhIGNvbXBsZXRlZCBNdWx0aWxpYiB0byB0aGUgc2V0CisgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IE11bHRpbGliICZNKTsKKworICAvLy8gVW5pb24gdGhpcyBzZXQgb2YgbXVsdGlsaWJzIHdpdGggYW5vdGhlcgorICB2b2lkIGNvbWJpbmVXaXRoKGNvbnN0IE11bHRpbGliU2V0ICZNUyk7CisKKyAgLy8vIFJlbW92ZSBhbGwgb2YgdGhpZSBtdWx0aWxpYnMgZnJvbSB0aGUgc2V0CisgIHZvaWQgY2xlYXIoKSB7IE11bHRpbGlicy5jbGVhcigpOyB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBNdWx0aWxpYnMuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIE11bHRpbGlicy5iZWdpbigpOyB9CisKKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gTXVsdGlsaWJzLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIE11bHRpbGlicy5lbmQoKTsgfQorCisgIC8vLyBQaWNrIHRoZSBiZXN0IG11bHRpbGliIGluIHRoZSBzZXQsIFxyZXR1cm5zIGZhbHNlIGlmIG5vbmUgYXJlIGNvbXBhdGlibGUKKyAgYm9vbCBzZWxlY3QoY29uc3QgTXVsdGlsaWI6OmZsYWdzX2xpc3QgJkZsYWdzLCBNdWx0aWxpYiAmTSkgY29uc3Q7CisKKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE11bHRpbGlicy5zaXplKCk7IH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vLyBBcHBseSB0aGUgZmlsdGVyIHRvIE11bHRpbGlicyBhbmQgcmV0dXJuIHRoZSBzdWJzZXQgdGhhdCByZW1haW5zCisgIHN0YXRpYyBtdWx0aWxpYl9saXN0IGZpbHRlckNvcHkoY29uc3QgRmlsdGVyQ2FsbGJhY2sgJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbXVsdGlsaWJfbGlzdCAmTXMpOworCisgIC8vLyBBcHBseSB0aGUgZmlsdGVyIHRvIHRoZSBtdWx0aWxpYl9saXN0LCByZW1vdmluZyB0aG9zZSB0aGF0IGRvbid0IG1hdGNoCisgIHN0YXRpYyB2b2lkIGZpbHRlckluUGxhY2UoY29uc3QgRmlsdGVyQ2FsbGJhY2sgJkYsIG11bHRpbGliX2xpc3QgJk1zKTsKK307CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTXVsdGlsaWJTZXQgJk1TKTsKK30KK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL09wdGlvbnMudGQgYi9pbmNsdWRlL2NsYW5nL0RyaXZlci9PcHRpb25zLnRkCmluZGV4IDllN2RjNzguLjMzZTA1OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL09wdGlvbnMudGQKKysrIGIvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvT3B0aW9ucy50ZApAQCAtNzIsOCArNzIsOCBAQAogZGVmIG1feDg2X0ZlYXR1cmVzX0dyb3VwICA6IE9wdGlvbkdyb3VwPCI8bSB4ODYgZmVhdHVyZXMgZ3JvdXA+Ij4sIEdyb3VwPG1fR3JvdXA+OwogZGVmIG1faGV4YWdvbl9GZWF0dXJlc19Hcm91cCAgOiBPcHRpb25Hcm91cDwiPG0gaGV4YWdvbiBmZWF0dXJlcyBncm91cD4iPiwgR3JvdXA8bV9Hcm91cD47CiBkZWYgbV9hcm1fRmVhdHVyZXNfR3JvdXAgIDogT3B0aW9uR3JvdXA8IjxtIGFybSBmZWF0dXJlcyBncm91cD4iPiwgR3JvdXA8bV9Hcm91cD47CitkZWYgbV9hYXJjaDY0X0ZlYXR1cmVzX0dyb3VwICA6IE9wdGlvbkdyb3VwPCI8bSBhYXJjaDY0IGZlYXR1cmVzIGdyb3VwPiI+LCBHcm91cDxtX0dyb3VwPjsKIGRlZiBtX3BwY19GZWF0dXJlc19Hcm91cCAgOiBPcHRpb25Hcm91cDwiPG0gcHBjIGZlYXR1cmVzIGdyb3VwPiI+LCBHcm91cDxtX0dyb3VwPjsKLWRlZiBvcGVuY2xfR3JvdXAgICAgICAgICAgOiBPcHRpb25Hcm91cDwiPG9wZW5jbCBncm91cD4iPjsKIGRlZiB1X0dyb3VwICAgICAgICAgICAgICAgOiBPcHRpb25Hcm91cDwiPHUgZ3JvdXA+Ij47CiAKIGRlZiBwZWRhbnRpY19Hcm91cCAgICAgICAgOiBPcHRpb25Hcm91cDwiPHBlZGFudGljIGdyb3VwPiI+LApAQCAtMTg0LDggKzE4NCwxMyBAQAogICBIZWxwVGV4dDwiRW5hYmxlIG1pZ3JhdGlvbiB0byBhbm5vdGF0ZSBwcm9wZXJ0eSB3aXRoIE5TX1JFVFVSTlNfSU5ORVJfUE9JTlRFUiI+OwogZGVmIG9iamNtdF9uc19ub25hdG9taWNfaW9zb25seTogRmxhZzxbIi0iXSwgIm9iamNtdC1ucy1ub25hdG9taWMtaW9zb25seSI+LCBGbGFnczxbQ0MxT3B0aW9uXT4sCiAgIEhlbHBUZXh0PCJFbmFibGUgbWlncmF0aW9uIHRvIHVzZSBOU19OT05BVE9NSUNfSU9TT05MWSBtYWNybyBmb3Igc2V0dGluZyBwcm9wZXJ0eSdzICdhdG9taWMnIGF0dHJpYnV0ZSI+OwotZGVmIG9iamNtdF93aGl0ZV9saXN0X2Rpcl9wYXRoOiBKb2luZWQ8WyItIl0sICJvYmpjbXQtd2hpdGUtbGlzdC1kaXItcGF0aD0iPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAorZGVmIG9iamNtdF9taWdyYXRlX2Rlc2lnbmF0ZWRfaW5pdCA6IEZsYWc8WyItIl0sICJvYmpjbXQtbWlncmF0ZS1kZXNpZ25hdGVkLWluaXQiPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAorICBIZWxwVGV4dDwiRW5hYmxlIG1pZ3JhdGlvbiB0byBpbmZlciBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSIGZvciBpbml0aWFsaXplciBtZXRob2RzIj47CitkZWYgb2JqY210X3doaXRlbGlzdF9kaXJfcGF0aDogSm9pbmVkPFsiLSJdLCAib2JqY210LXdoaXRlbGlzdC1kaXItcGF0aD0iPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAogICBIZWxwVGV4dDwiT25seSBtb2RpZnkgZmlsZXMgd2l0aCBhIGZpbGVuYW1lIGNvbnRhaW5lZCBpbiB0aGUgcHJvdmlkZWQgZGlyZWN0b3J5IHBhdGgiPjsKKy8vIFRoZSBtaXNzcGVsdCAid2hpdGUtbGlzdCIgW3NpY10gYWxpYXMgaXMgZHVlIGZvciByZW1vdmFsLgorZGVmIDogSm9pbmVkPFsiLSJdLCAib2JqY210LXdoaXRlLWxpc3QtZGlyLXBhdGg9Ij4sIEZsYWdzPFtDQzFPcHRpb25dPiwKKyAgICBBbGlhczxvYmpjbXRfd2hpdGVsaXN0X2Rpcl9wYXRoPjsKIAogLy8gTWFrZSBzdXJlIGFsbCBvdGhlciAtY2NjLSBvcHRpb25zIGFyZSByZWplY3RlZC4KIGRlZiBjY2NfIDogSm9pbmVkPFsiLSJdLCAiY2NjLSI+LCBHcm91cDxpbnRlcm5hbF9Hcm91cD4sIEZsYWdzPFtVbnN1cHBvcnRlZF0+OwpAQCAtMTkzLDcgKzE5OCw3IEBACiAvLyBTdGFuZGFyZCBPcHRpb25zCiAKIGRlZiBfSEFTSF9IQVNIX0hBU0ggOiBGbGFnPFsiLSJdLCAiIyMjIj4sIEZsYWdzPFtEcml2ZXJPcHRpb24sIENvcmVPcHRpb25dPiwKLSAgICBIZWxwVGV4dDwiUHJpbnQgdGhlIGNvbW1hbmRzIHRvIHJ1biBmb3IgdGhpcyBjb21waWxhdGlvbiI+OworICAgIEhlbHBUZXh0PCJQcmludCAoYnV0IGRvIG5vdCBydW4pIHRoZSBjb21tYW5kcyB0byBydW4gZm9yIHRoaXMgY29tcGlsYXRpb24iPjsKIGRlZiBfREFTSF9EQVNIIDogT3B0aW9uPFsiLS0iXSwgIiIsIEtJTkRfUkVNQUlOSU5HX0FSR1M+LAogICAgIEZsYWdzPFtEcml2ZXJPcHRpb24sIENvcmVPcHRpb25dPjsKIGRlZiBBIDogSm9pbmVkT3JTZXBhcmF0ZTxbIi0iXSwgIkEiPiwgRmxhZ3M8W1JlbmRlckpvaW5lZF0+OwpAQCAtMjEzLDIwICsyMTgsMjYgQEAKIGRlZiBJIDogSm9pbmVkT3JTZXBhcmF0ZTxbIi0iXSwgIkkiPiwgR3JvdXA8SV9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgICBIZWxwVGV4dDwiQWRkIGRpcmVjdG9yeSB0byBpbmNsdWRlIHNlYXJjaCBwYXRoIj47CiBkZWYgTCA6IEpvaW5lZE9yU2VwYXJhdGU8WyItIl0sICJMIj4sIEZsYWdzPFtSZW5kZXJKb2luZWRdPjsKLWRlZiBNRCA6IEZsYWc8WyItIl0sICJNRCI+LCBHcm91cDxNX0dyb3VwPjsKLWRlZiBNRiA6IEpvaW5lZE9yU2VwYXJhdGU8WyItIl0sICJNRiI+LCBHcm91cDxNX0dyb3VwPjsKK2RlZiBNRCA6IEZsYWc8WyItIl0sICJNRCI+LCBHcm91cDxNX0dyb3VwPiwKKyAgICBIZWxwVGV4dDwiV3JpdGUgYSBkZXBmaWxlIGNvbnRhaW5pbmcgdXNlciBhbmQgc3lzdGVtIGhlYWRlcnMiPjsKK2RlZiBNTUQgOiBGbGFnPFsiLSJdLCAiTU1EIj4sIEdyb3VwPE1fR3JvdXA+LAorICAgIEhlbHBUZXh0PCJXcml0ZSBhIGRlcGZpbGUgY29udGFpbmluZyB1c2VyIGhlYWRlcnMiPjsKK2RlZiBNIDogRmxhZzxbIi0iXSwgIk0iPiwgR3JvdXA8TV9Hcm91cD4sCisgICAgSGVscFRleHQ8Ikxpa2UgLU1ELCBidXQgYWxzbyBpbXBsaWVzIC1FIGFuZCB3cml0ZXMgdG8gc3Rkb3V0IGJ5IGRlZmF1bHQiPjsKK2RlZiBNTSA6IEZsYWc8WyItIl0sICJNTSI+LCBHcm91cDxNX0dyb3VwPiwKKyAgICBIZWxwVGV4dDwiTGlrZSAtTU1ELCBidXQgYWxzbyBpbXBsaWVzIC1FIGFuZCB3cml0ZXMgdG8gc3Rkb3V0IGJ5IGRlZmF1bHQiPjsKK2RlZiBNRiA6IEpvaW5lZE9yU2VwYXJhdGU8WyItIl0sICJNRiI+LCBHcm91cDxNX0dyb3VwPiwKKyAgICBIZWxwVGV4dDwiV3JpdGUgZGVwZmlsZSBvdXRwdXQgZnJvbSAtTU1ELCAtTUQsIC1NTSwgb3IgLU0gdG8gPGZpbGU+Ij4sCisgICAgTWV0YVZhck5hbWU8IjxmaWxlPiI+OwogZGVmIE1HIDogRmxhZzxbIi0iXSwgIk1HIj4sIEdyb3VwPE1fR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sCi0gICAgSGVscFRleHQ8IkFkZCBtaXNzaW5nIGhlYWRlcnMgdG8gZGVwZW5kZW5jeSBsaXN0Ij47Ci1kZWYgTU1EIDogRmxhZzxbIi0iXSwgIk1NRCI+LCBHcm91cDxNX0dyb3VwPjsKLWRlZiBNTSA6IEZsYWc8WyItIl0sICJNTSI+LCBHcm91cDxNX0dyb3VwPjsKKyAgICBIZWxwVGV4dDwiQWRkIG1pc3NpbmcgaGVhZGVycyB0byBkZXBmaWxlIj47CiBkZWYgTVAgOiBGbGFnPFsiLSJdLCAiTVAiPiwgR3JvdXA8TV9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgICBIZWxwVGV4dDwiQ3JlYXRlIHBob255IHRhcmdldCBmb3IgZWFjaCBkZXBlbmRlbmN5IChvdGhlciB0aGFuIG1haW4gZmlsZSkiPjsKIGRlZiBNUSA6IEpvaW5lZE9yU2VwYXJhdGU8WyItIl0sICJNUSI+LCBHcm91cDxNX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAotICAgIEhlbHBUZXh0PCJTcGVjaWZ5IHRhcmdldCB0byBxdW90ZSBmb3IgZGVwZW5kZW5jeSI+OworICAgIEhlbHBUZXh0PCJTcGVjaWZ5IG5hbWUgb2YgbWFpbiBmaWxlIG91dHB1dCB0byBxdW90ZSBpbiBkZXBmaWxlIj47CiBkZWYgTVQgOiBKb2luZWRPclNlcGFyYXRlPFsiLSJdLCAiTVQiPiwgR3JvdXA8TV9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKLSAgICBIZWxwVGV4dDwiU3BlY2lmeSB0YXJnZXQgZm9yIGRlcGVuZGVuY3kiPjsKKyAgICBIZWxwVGV4dDwiU3BlY2lmeSBuYW1lIG9mIG1haW4gZmlsZSBvdXRwdXQgaW4gZGVwZmlsZSI+OwogZGVmIE1hY2ggOiBGbGFnPFsiLSJdLCAiTWFjaCI+OwotZGVmIE0gOiBGbGFnPFsiLSJdLCAiTSI+LCBHcm91cDxNX0dyb3VwPjsKIGRlZiBPMCA6IEZsYWc8WyItIl0sICJPMCI+LCBHcm91cDxPX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+OwogZGVmIE80IDogRmxhZzxbIi0iXSwgIk80Ij4sIEdyb3VwPE9fR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT47CiBkZWYgT2JqQ1hYIDogRmxhZzxbIi0iXSwgIk9iakMrKyI+LCBGbGFnczxbRHJpdmVyT3B0aW9uXT4sCkBAIC0yNjgsNiArMjc5LDggQEAKIGRlZiBXcF9DT01NQSA6IENvbW1hSm9pbmVkPFsiLSJdLCAiV3AsIj4sCiAgIEhlbHBUZXh0PCJQYXNzIHRoZSBjb21tYSBzZXBhcmF0ZWQgYXJndW1lbnRzIGluIDxhcmc+IHRvIHRoZSBwcmVwcm9jZXNzb3IiPiwKICAgTWV0YVZhck5hbWU8Ijxhcmc+Ij47CitkZWYgV3dyaXRlX3N0cmluZ3MgOiBGbGFnPFsiLSJdLCAiV3dyaXRlLXN0cmluZ3MiPiwgR3JvdXA8V19Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPjsKK2RlZiBXbm9fd3JpdGVfc3RyaW5ncyA6IEZsYWc8WyItIl0sICJXbm8td3JpdGUtc3RyaW5ncyI+LCBHcm91cDxXX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+OwogZGVmIFdfSm9pbmVkIDogSm9pbmVkPFsiLSJdLCAiVyI+LCBHcm91cDxXX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbiwgQ29yZU9wdGlvbl0+LAogICBNZXRhVmFyTmFtZTwiPHdhcm5pbmc+Ij4sIEhlbHBUZXh0PCJFbmFibGUgdGhlIHNwZWNpZmllZCB3YXJuaW5nIj47CiBkZWYgWGFuYWx5emVyIDogU2VwYXJhdGU8WyItIl0sICJYYW5hbHl6ZXIiPiwKQEAgLTI5Nyw4ICszMTAsNiBAQAogZGVmIGJ1bmRsZV9fbG9hZGVyIDogU2VwYXJhdGU8WyItIl0sICJidW5kbGVfbG9hZGVyIj47CiBkZWYgYnVuZGxlIDogRmxhZzxbIi0iXSwgImJ1bmRsZSI+OwogZGVmIGIgOiBKb2luZWRPclNlcGFyYXRlPFsiLSJdLCAiYiI+LCBGbGFnczxbVW5zdXBwb3J0ZWRdPjsKLWRlZiBjbF9rZXJuZWxfYXJnX2luZm8gOiBGbGFnPFsiLSJdLCAiY2wta2VybmVsLWFyZy1pbmZvIj4sIEZsYWdzPFtDQzFPcHRpb25dPiwgR3JvdXA8b3BlbmNsX0dyb3VwPiwKLUhlbHBUZXh0PCJPcGVuQ0wgb25seS4gVGhpcyBvcHRpb24gYWxsb3dzIHRoZSBjb21waWxlciB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXJndW1lbnRzIG9mIGEga2VybmVsKHMpIj4gOwogZGVmIGNsaWVudF9fbmFtZSA6IEpvaW5lZE9yU2VwYXJhdGU8WyItIl0sICJjbGllbnRfbmFtZSI+OwogZGVmIGNvbWJpbmUgOiBGbGFnPFsiLSIsICItLSJdLCAiY29tYmluZSI+LCBGbGFnczxbRHJpdmVyT3B0aW9uLCBVbnN1cHBvcnRlZF0+OwogZGVmIGNvbXBhdGliaWxpdHlfX3ZlcnNpb24gOiBKb2luZWRPclNlcGFyYXRlPFsiLSJdLCAiY29tcGF0aWJpbGl0eV92ZXJzaW9uIj47CkBAIC0zNDYsMTAgKzM1Nyw3IEBACiAgIEhlbHBUZXh0PCJVc2UgQXBwbGUncyBrZXJuZWwgZXh0ZW5zaW9ucyBBQkkiPjsKIGRlZiBmYXBwbGVfcHJhZ21hX3BhY2sgOiBGbGFnPFsiLSJdLCAiZmFwcGxlLXByYWdtYS1wYWNrIj4sIEdyb3VwPGZfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sCiAgIEhlbHBUZXh0PCJFbmFibGUgQXBwbGUgZ2NjLWNvbXBhdGlibGUgI3ByYWdtYSBwYWNrIGhhbmRsaW5nIj47Ci1kZWYgZmFkZHJlc3Nfc2FuaXRpemVyIDogRmxhZzxbIi0iXSwgImZhZGRyZXNzLXNhbml0aXplciI+LCBHcm91cDxmX0dyb3VwPjsKLWRlZiBmbm9fYWRkcmVzc19zYW5pdGl6ZXIgOiBGbGFnPFsiLSJdLCAiZm5vLWFkZHJlc3Mtc2FuaXRpemVyIj4sIEdyb3VwPGZfR3JvdXA+OwotZGVmIGZ0aHJlYWRfc2FuaXRpemVyIDogRmxhZzxbIi0iXSwgImZ0aHJlYWQtc2FuaXRpemVyIj4sIEdyb3VwPGZfR3JvdXA+OwotZGVmIGZub190aHJlYWRfc2FuaXRpemVyIDogRmxhZzxbIi0iXSwgImZuby10aHJlYWQtc2FuaXRpemVyIj4sIEdyb3VwPGZfR3JvdXA+OworZGVmIHNoYXJlZF9saWJhc2FuIDogRmxhZzxbIi0iXSwgInNoYXJlZC1saWJhc2FuIj47CiBkZWYgZmFzbSA6IEZsYWc8WyItIl0sICJmYXNtIj4sIEdyb3VwPGZfR3JvdXA+OwogCiBkZWYgZmFzbV9ibG9ja3MgOiBGbGFnPFsiLSJdLCAiZmFzbS1ibG9ja3MiPiwgR3JvdXA8Zl9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPjsKQEAgLTM2OSwxOSArMzc3LDIzIEBACiBkZWYgZnByb2ZpbGVfc2FtcGxlX3VzZV9FUSA6IEpvaW5lZDxbIi0iXSwgImZwcm9maWxlLXNhbXBsZS11c2U9Ij4sCiAgICAgR3JvdXA8Zl9Hcm91cD4sIEZsYWdzPFtEcml2ZXJPcHRpb24sIENDMU9wdGlvbl0+LAogICAgIEhlbHBUZXh0PCJFbmFibGUgc2FtcGxlLWJhc2VkIHByb2ZpbGUgZ3VpZGVkIG9wdGltaXphdGlvbnMiPjsKK2RlZiBmYXV0b19wcm9maWxlX0VRIDogSm9pbmVkPFsiLSJdLCAiZmF1dG8tcHJvZmlsZT0iPiwKKyAgICBBbGlhczxmcHJvZmlsZV9zYW1wbGVfdXNlX0VRPjsKK2RlZiBmcHJvZmlsZV9pbnN0cl9nZW5lcmF0ZSA6IEZsYWc8WyItIl0sICJmcHJvZmlsZS1pbnN0ci1nZW5lcmF0ZSI+LAorICAgIEdyb3VwPGZfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sCisgICAgSGVscFRleHQ8IkdlbmVyYXRlIGluc3RydW1lbnRlZCBjb2RlIHRvIGNvbGxlY3QgZXhlY3V0aW9uIGNvdW50cyI+OworZGVmIGZwcm9maWxlX2luc3RyX3VzZSA6IEZsYWc8WyItIl0sICJmcHJvZmlsZS1pbnN0ci11c2UiPiwgR3JvdXA8Zl9Hcm91cD47CitkZWYgZnByb2ZpbGVfaW5zdHJfdXNlX0VRIDogSm9pbmVkPFsiLSJdLCAiZnByb2ZpbGUtaW5zdHItdXNlPSI+LAorICAgIEdyb3VwPGZfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sCisgICAgSGVscFRleHQ8IlVzZSBpbnN0cnVtZW50YXRpb24gZGF0YSBmb3IgcHJvZmlsZS1ndWlkZWQgb3B0aW1pemF0aW9uIj47CiAKIGRlZiBmYmxvY2tzIDogRmxhZzxbIi0iXSwgImZibG9ja3MiPiwgR3JvdXA8Zl9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgSGVscFRleHQ8IkVuYWJsZSB0aGUgJ2Jsb2NrcycgbGFuZ3VhZ2UgZmVhdHVyZSI+OwogZGVmIGZib290Y2xhc3NwYXRoX0VRIDogSm9pbmVkPFsiLSJdLCAiZmJvb3RjbGFzc3BhdGg9Ij4sIEdyb3VwPGZfR3JvdXA+OwogZGVmIGZib3JsYW5kX2V4dGVuc2lvbnMgOiBGbGFnPFsiLSJdLCAiZmJvcmxhbmQtZXh0ZW5zaW9ucyI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAogICBIZWxwVGV4dDwiQWNjZXB0IG5vbi1zdGFuZGFyZCBjb25zdHJ1Y3RzIHN1cHBvcnRlZCBieSB0aGUgQm9ybGFuZCBjb21waWxlciI+OwotZGVmIGZib3VuZHNfY2hlY2tpbmcgOiBGbGFnPFsiLSJdLCAiZmJvdW5kcy1jaGVja2luZyI+LCBHcm91cDxmX0dyb3VwPiwKLSAgSGVscFRleHQ8IkVuYWJsZSBydW4tdGltZSBib3VuZHMgY2hlY2tzIj47Ci1kZWYgZmJvdW5kc19jaGVja2luZ19FUSA6IEpvaW5lZDxbIi0iXSwgImZib3VuZHMtY2hlY2tpbmc9Ij4sIEZsYWdzPFtDQzFPcHRpb25dPiwKLSAgR3JvdXA8Zl9Hcm91cD47CiBkZWYgZmJ1aWx0aW4gOiBGbGFnPFsiLSJdLCAiZmJ1aWx0aW4iPiwgR3JvdXA8Zl9Hcm91cD47CiBkZWYgZmNhcmV0X2RpYWdub3N0aWNzIDogRmxhZzxbIi0iXSwgImZjYXJldC1kaWFnbm9zdGljcyI+LCBHcm91cDxmX0dyb3VwPjsKLWRlZiBmY2F0Y2hfdW5kZWZpbmVkX2JlaGF2aW9yIDogRmxhZzxbIi0iXSwgImZjYXRjaC11bmRlZmluZWQtYmVoYXZpb3IiPiwgR3JvdXA8Zl9Hcm91cD47CiBkZWYgZmNsYXNzcGF0aF9FUSA6IEpvaW5lZDxbIi0iXSwgImZjbGFzc3BhdGg9Ij4sIEdyb3VwPGZfR3JvdXA+OwogZGVmIGZjb2xvcl9kaWFnbm9zdGljcyA6IEZsYWc8WyItIl0sICJmY29sb3ItZGlhZ25vc3RpY3MiPiwgR3JvdXA8Zl9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgSGVscFRleHQ8IlVzZSBjb2xvcnMgaW4gZGlhZ25vc3RpY3MiPjsKQEAgLTQxNyw4ICs0MjksNiBAQAogICAgIEhlbHBUZXh0PCJQcmludCBzb3VyY2UgcmFuZ2Ugc3BhbnMgaW4gbnVtZXJpYyBmb3JtIj47CiBkZWYgZmRpYWdub3N0aWNzX3Nob3dfb3B0aW9uIDogRmxhZzxbIi0iXSwgImZkaWFnbm9zdGljcy1zaG93LW9wdGlvbiI+LCBHcm91cDxmX0dyb3VwPiwKICAgICBGbGFnczxbQ0MxT3B0aW9uXT4sIEhlbHBUZXh0PCJQcmludCBvcHRpb24gbmFtZSB3aXRoIG1hcHBhYmxlIGRpYWdub3N0aWNzIj47Ci1kZWYgZmRpYWdub3N0aWNzX3Nob3dfbmFtZSA6IEZsYWc8WyItIl0sICJmZGlhZ25vc3RpY3Mtc2hvdy1uYW1lIj4sIEdyb3VwPGZfR3JvdXA+LAotICAgIEZsYWdzPFtDQzFPcHRpb25dPiwgSGVscFRleHQ8IlByaW50IGRpYWdub3N0aWMgbmFtZSI+OwogZGVmIGZkaWFnbm9zdGljc19zaG93X25vdGVfaW5jbHVkZV9zdGFjayA6IEZsYWc8WyItIl0sICJmZGlhZ25vc3RpY3Mtc2hvdy1ub3RlLWluY2x1ZGUtc3RhY2siPiwKICAgICBHcm91cDxmX0dyb3VwPiwgIEZsYWdzPFtDQzFPcHRpb25dPiwgSGVscFRleHQ8IkRpc3BsYXkgaW5jbHVkZSBzdGFja3MgZm9yIGRpYWdub3N0aWMgbm90ZXMiPjsKIGRlZiBmZGlhZ25vc3RpY3NfZm9ybWF0X0VRIDogSm9pbmVkPFsiLSJdLCAiZmRpYWdub3N0aWNzLWZvcm1hdD0iPiwgR3JvdXA8Zl9jbGFuZ19Hcm91cD47CkBAIC00NDAsMTggKzQ1MCwxNCBAQAogZGVmIGZlbWl0X2FsbF9kZWNscyA6IEZsYWc8WyItIl0sICJmZW1pdC1hbGwtZGVjbHMiPiwgR3JvdXA8Zl9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgSGVscFRleHQ8IkVtaXQgYWxsIGRlY2xhcmF0aW9ucywgZXZlbiBpZiB1bnVzZWQiPjsKIGRlZiBmZW5jb2RpbmdfRVEgOiBKb2luZWQ8WyItIl0sICJmZW5jb2Rpbmc9Ij4sIEdyb3VwPGZfR3JvdXA+OwotZGVmIGZlcnJvcl9saW1pdF9FUSA6IEpvaW5lZDxbIi0iXSwgImZlcnJvci1saW1pdD0iPiwgR3JvdXA8Zl9Hcm91cD47CitkZWYgZmVycm9yX2xpbWl0X0VRIDogSm9pbmVkPFsiLSJdLCAiZmVycm9yLWxpbWl0PSI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NvcmVPcHRpb25dPjsKIGRlZiBmZXhjZXB0aW9ucyA6IEZsYWc8WyItIl0sICJmZXhjZXB0aW9ucyI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAogICBIZWxwVGV4dDwiRW5hYmxlIHN1cHBvcnQgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZyI+OwotZGVmIGZleHBlbnNpdmVfb3B0aW1pemF0aW9ucyA6IEZsYWc8WyItIl0sICJmZXhwZW5zaXZlLW9wdGltaXphdGlvbnMiPiwKLSAgR3JvdXA8Y2xhbmdfaWdub3JlZF9mX0dyb3VwPjsKLWRlZiBmbm9fZXhwZW5zaXZlX29wdGltaXphdGlvbnMgOiBGbGFnPFsiLSJdLCAiZm5vLWV4cGVuc2l2ZS1vcHRpbWl6YXRpb25zIj4sCi0gIEdyb3VwPGNsYW5nX2lnbm9yZWRfZl9Hcm91cD47CitkZWYgOiBGbGFnPFsiLSJdLCAiZmV4cGVuc2l2ZS1vcHRpbWl6YXRpb25zIj4sIEdyb3VwPGNsYW5nX2lnbm9yZWRfZl9Hcm91cD47CitkZWYgOiBGbGFnPFsiLSJdLCAiZm5vLWV4cGVuc2l2ZS1vcHRpbWl6YXRpb25zIj4sIEdyb3VwPGNsYW5nX2lnbm9yZWRfZl9Hcm91cD47CiBkZWYgZmV4dGRpcnNfRVEgOiBKb2luZWQ8WyItIl0sICJmZXh0ZGlycz0iPiwgR3JvdXA8Zl9Hcm91cD47Ci1kZWYgZmV4dGVuZGVkX2lkZW50aWZpZXJzIDogRmxhZzxbIi0iXSwgImZleHRlbmRlZC1pZGVudGlmaWVycyI+LAotICAgIEdyb3VwPGNsYW5nX2lnbm9yZWRfZl9Hcm91cD47Ci1kZWYgZm5vX2V4dGVuZGVkX2lkZW50aWZpZXJzIDogRmxhZzxbIi0iXSwgImZuby1leHRlbmRlZC1pZGVudGlmaWVycyI+LAotICAgIEdyb3VwPGZfR3JvdXA+LCBGbGFnczxbVW5zdXBwb3J0ZWRdPjsKK2RlZiA6IEZsYWc8WyItIl0sICJmZXh0ZW5kZWQtaWRlbnRpZmllcnMiPiwgR3JvdXA8Y2xhbmdfaWdub3JlZF9mX0dyb3VwPjsKK2RlZiA6IEZsYWc8WyItIl0sICJmbm8tZXh0ZW5kZWQtaWRlbnRpZmllcnMiPiwgR3JvdXA8Zl9Hcm91cD4sIEZsYWdzPFtVbnN1cHBvcnRlZF0+OwogZGVmIGZob3N0ZWQgOiBGbGFnPFsiLSJdLCAiZmhvc3RlZCI+LCBHcm91cDxmX0dyb3VwPjsKIGRlZiBmZmFzdF9tYXRoIDogRmxhZzxbIi0iXSwgImZmYXN0LW1hdGgiPiwgR3JvdXA8Zl9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgSGVscFRleHQ8IkVuYWJsZSB0aGUgKmZyb250ZW5kKidzICdmYXN0LW1hdGgnIG1vZGUuIFRoaXMgaGFzIG5vIGVmZmVjdCBvbiAiCkBAIC00NzAsMjMgKzQ3NiwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRyZXNzIChtZW1vcnkgZXJyb3JzKSB8IHRocmVhZCAocmFjZSBkZXRlY3Rpb24pIHwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmRlZmluZWQgKG1pc2NlbGxhbmVvdXMgdW5kZWZpbmVkIGJlaGF2aW9yKSI+OwogZGVmIGZub19zYW5pdGl6ZV9FUSA6IENvbW1hSm9pbmVkPFsiLSJdLCAiZm5vLXNhbml0aXplPSI+LCBHcm91cDxmX2NsYW5nX0dyb3VwPjsKLWRlZiBmc2FuaXRpemVfYWRkcmVzc196ZXJvX2Jhc2Vfc2hhZG93IDogRmxhZzxbIi0iXSwgImZzYW5pdGl6ZS1hZGRyZXNzLXplcm8tYmFzZS1zaGFkb3ciPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXA8Zl9jbGFuZ19Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVscFRleHQ8Ik1ha2UgQWRkcmVzc1Nhbml0aXplciBtYXAgc2hhZG93IG1lbW9yeSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdCB6ZXJvIG9mZnNldCI+OwotZGVmIGZub19zYW5pdGl6ZV9hZGRyZXNzX3plcm9fYmFzZV9zaGFkb3cgOiBGbGFnPFsiLSJdLCAiZm5vLXNhbml0aXplLWFkZHJlc3MtemVyby1iYXNlLXNoYWRvdyI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cDxmX2NsYW5nX0dyb3VwPjsKIGRlZiBmc2FuaXRpemVfYmxhY2tsaXN0IDogSm9pbmVkPFsiLSJdLCAiZnNhbml0aXplLWJsYWNrbGlzdD0iPiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXA8Zl9jbGFuZ19Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVscFRleHQ8IlBhdGggdG8gYmxhY2tsaXN0IGZpbGUgZm9yIHNhbml0aXplcnMiPjsKIGRlZiBmbm9fc2FuaXRpemVfYmxhY2tsaXN0IDogRmxhZzxbIi0iXSwgImZuby1zYW5pdGl6ZS1ibGFja2xpc3QiPiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXA8Zl9jbGFuZ19Hcm91cD4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlbHBUZXh0PCJEb24ndCB1c2UgYmxhY2tsaXN0IGZpbGUgZm9yIHNhbml0aXplcnMiPjsKK2RlZiBmc2FuaXRpemVfbWVtb3J5X3RyYWNrX29yaWdpbnNfRVEgOiBKb2luZWQ8WyItIl0sICJmc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnM9Ij4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXA8Zl9jbGFuZ19Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWxwVGV4dDwiRW5hYmxlIG9yaWdpbnMgdHJhY2tpbmcgaW4gTWVtb3J5U2FuaXRpemVyIj47CiBkZWYgZnNhbml0aXplX21lbW9yeV90cmFja19vcmlnaW5zIDogRmxhZzxbIi0iXSwgImZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucyI+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwPGZfY2xhbmdfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVscFRleHQ8IkVuYWJsZSBvcmlnaW5zIHRyYWNraW5nIGluIE1lbW9yeVNhbml0aXplciI+OwogZGVmIGZub19zYW5pdGl6ZV9tZW1vcnlfdHJhY2tfb3JpZ2lucyA6IEZsYWc8WyItIl0sICJmbm8tc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnMiPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cDxmX2NsYW5nX0dyb3VwPjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cDxmX2NsYW5nX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlbHBUZXh0PCJEaXNhYmxlIG9yaWdpbnMgdHJhY2tpbmcgaW4gTWVtb3J5U2FuaXRpemVyIj47CiBkZWYgZnNhbml0aXplX3JlY292ZXIgOiBGbGFnPFsiLSJdLCAiZnNhbml0aXplLXJlY292ZXIiPiwKICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwPGZfY2xhbmdfR3JvdXA+OwogZGVmIGZub19zYW5pdGl6ZV9yZWNvdmVyIDogRmxhZzxbIi0iXSwgImZuby1zYW5pdGl6ZS1yZWNvdmVyIj4sCkBAIC01MTIsOSArNTE2LDkgQEAKIGRlZiBmbm9faG9ub3JfbmFucyA6IEZsYWc8WyItIl0sICJmbm8taG9ub3ItbmFucyI+LCBHcm91cDxmX0dyb3VwPjsKIGRlZiBmaG9ub3JfaW5maW5pdGllcyA6IEZsYWc8WyItIl0sICJmaG9ub3ItaW5maW5pdGllcyI+LCBHcm91cDxmX0dyb3VwPjsKIGRlZiBmbm9faG9ub3JfaW5maW5pdGllcyA6IEZsYWc8WyItIl0sICJmbm8taG9ub3ItaW5maW5pdGllcyI+LCBHcm91cDxmX0dyb3VwPjsKLS8vIFNpYy4gVGhpcyBvcHRpb24gd2FzIG1pc3NwZWxsZWQgb3JpZ2luYWxseS4KLWRlZiBmaG9ub3JfaW5maW5pdGVzIDogRmxhZzxbIi0iXSwgImZob25vci1pbmZpbml0ZXMiPiwgQWxpYXM8Zmhvbm9yX2luZmluaXRpZXM+OwotZGVmIGZub19ob25vcl9pbmZpbml0ZXMgOiBGbGFnPFsiLSJdLCAiZm5vLWhvbm9yLWluZmluaXRlcyI+LCBBbGlhczxmbm9faG9ub3JfaW5maW5pdGllcz47CisvLyBUaGlzIG9wdGlvbiB3YXMgb3JpZ2luYWxseSBtaXNzcGVsdCAiaW5maW5pdGVzIiBbc2ljXS4KK2RlZiA6IEZsYWc8WyItIl0sICJmaG9ub3ItaW5maW5pdGVzIj4sIEFsaWFzPGZob25vcl9pbmZpbml0aWVzPjsKK2RlZiA6IEZsYWc8WyItIl0sICJmbm8taG9ub3ItaW5maW5pdGVzIj4sIEFsaWFzPGZub19ob25vcl9pbmZpbml0aWVzPjsKIGRlZiBmdHJhcHBpbmdfbWF0aCA6IEZsYWc8WyItIl0sICJmdHJhcHBpbmctbWF0aCI+LCBHcm91cDxmX0dyb3VwPjsKIGRlZiBmbm9fdHJhcHBpbmdfbWF0aCA6IEZsYWc8WyItIl0sICJmbm8tdHJhcHBpbmctbWF0aCI+LCBHcm91cDxmX0dyb3VwPjsKIGRlZiBmZnBfY29udHJhY3QgOiBKb2luZWQ8WyItIl0sICJmZnAtY29udHJhY3Q9Ij4sIEdyb3VwPGZfR3JvdXA+LApAQCAtNTM5LDE2ICs1NDMsMTQgQEAKICAgSGVscFRleHQ8IkdlbmVyYXRlIG91dHB1dCBjb21wYXRpYmxlIHdpdGggdGhlIHN0YW5kYXJkIEdOVSBPYmplY3RpdmUtQyBydW50aW1lIj47CiBkZWYgZmhlaW5vdXNfZ251X2V4dGVuc2lvbnMgOiBGbGFnPFsiLSJdLCAiZmhlaW5vdXMtZ251LWV4dGVuc2lvbnMiPiwgRmxhZ3M8W0NDMU9wdGlvbl0+OwogZGVmIGZpbGVsaXN0IDogU2VwYXJhdGU8WyItIl0sICJmaWxlbGlzdCI+LCBGbGFnczxbTGlua2VySW5wdXRdPjsKLWRlZiBmaW5kaXJlY3RfdmlydHVhbF9jYWxscyA6IEZsYWc8WyItIl0sICJmaW5kaXJlY3QtdmlydHVhbC1jYWxscyI+LCBBbGlhczxmYXBwbGVfa2V4dD47CitkZWYgOiBGbGFnPFsiLSJdLCAiZmluZGlyZWN0LXZpcnR1YWwtY2FsbHMiPiwgQWxpYXM8ZmFwcGxlX2tleHQ+OwogZGVmIGZpbmxpbmVfZnVuY3Rpb25zIDogRmxhZzxbIi0iXSwgImZpbmxpbmUtZnVuY3Rpb25zIj4sIEdyb3VwPGNsYW5nX2lnbm9yZWRfZl9Hcm91cD47CiBkZWYgZmlubGluZSA6IEZsYWc8WyItIl0sICJmaW5saW5lIj4sIEdyb3VwPGNsYW5nX2lnbm9yZWRfZl9Hcm91cD47CiBkZWYgZmluc3RydW1lbnRfZnVuY3Rpb25zIDogRmxhZzxbIi0iXSwgImZpbnN0cnVtZW50LWZ1bmN0aW9ucyI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAogICBIZWxwVGV4dDwiR2VuZXJhdGUgY2FsbHMgdG8gaW5zdHJ1bWVudCBmdW5jdGlvbiBlbnRyeSBhbmQgZXhpdCI+OwotZGVmIGZrZWVwX2lubGluZV9mdW5jdGlvbnMgOiBGbGFnPFsiLSJdLCAiZmtlZXAtaW5saW5lLWZ1bmN0aW9ucyI+LCBHcm91cDxjbGFuZ19pZ25vcmVkX2ZfR3JvdXA+OworZGVmIDogRmxhZzxbIi0iXSwgImZrZWVwLWlubGluZS1mdW5jdGlvbnMiPiwgR3JvdXA8Y2xhbmdfaWdub3JlZF9mX0dyb3VwPjsKIGRlZiBmbGF0X19uYW1lc3BhY2UgOiBGbGFnPFsiLSJdLCAiZmxhdF9uYW1lc3BhY2UiPjsKIGRlZiBmbGF4X3ZlY3Rvcl9jb252ZXJzaW9ucyA6IEZsYWc8WyItIl0sICJmbGF4LXZlY3Rvci1jb252ZXJzaW9ucyI+LCBHcm91cDxmX0dyb3VwPjsKLWRlZiBmbGltaXRfZGVidWdfaW5mbyA6IEZsYWc8WyItIl0sICJmbGltaXQtZGVidWctaW5mbyI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAotICBIZWxwVGV4dDwiTGltaXQgZGVidWcgaW5mb3JtYXRpb24gcHJvZHVjZWQgdG8gcmVkdWNlIHNpemUgb2YgZGVidWcgYmluYXJ5Ij47CiBkZWYgZmxpbWl0ZWRfcHJlY2lzaW9uX0VRIDogSm9pbmVkPFsiLSJdLCAiZmxpbWl0ZWQtcHJlY2lzaW9uPSI+LCBHcm91cDxmX0dyb3VwPjsKIGRlZiBmbHRvIDogRmxhZzxbIi0iXSwgImZsdG8iPiwgR3JvdXA8Zl9Hcm91cD47CiBkZWYgZm5vX2x0byA6IEZsYWc8WyItIl0sICJmbm8tbHRvIj4sIEdyb3VwPGZfR3JvdXA+OwpAQCAtNTU5LDIxICs1NjEsMzUgQEAKIGRlZiBmbXNfZXh0ZW5zaW9ucyA6IEZsYWc8WyItIl0sICJmbXMtZXh0ZW5zaW9ucyI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAogICBIZWxwVGV4dDwiQWNjZXB0IHNvbWUgbm9uLXN0YW5kYXJkIGNvbnN0cnVjdHMgc3VwcG9ydGVkIGJ5IHRoZSBNaWNyb3NvZnQgY29tcGlsZXIiPjsKIGRlZiBmbXNfY29tcGF0aWJpbGl0eSA6IEZsYWc8WyItIl0sICJmbXMtY29tcGF0aWJpbGl0eSI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAotICBIZWxwVGV4dDwiRW5hYmxlIE1pY3Jvc29mdCBjb21wYXRpYmlsaXR5IG1vZGUiPjsKKyAgSGVscFRleHQ8IkVuYWJsZSBmdWxsIE1pY3Jvc29mdCBWaXN1YWwgQysrIGNvbXBhdGliaWxpdHkiPjsKIGRlZiBmbXNjX3ZlcnNpb24gOiBKb2luZWQ8WyItIl0sICJmbXNjLXZlcnNpb249Ij4sIEdyb3VwPGZfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uLCBDb3JlT3B0aW9uXT4sCi0gIEhlbHBUZXh0PCJWZXJzaW9uIG9mIHRoZSBNaWNyb3NvZnQgQy9DKysgY29tcGlsZXIgdG8gcmVwb3J0IGluIF9NU0NfVkVSICgwID0gZG9uJ3QgZGVmaW5lIGl0IChkZWZhdWx0KSkiPjsKKyAgSGVscFRleHQ8Ik1pY3Jvc29mdCBjb21waWxlciB2ZXJzaW9uIG51bWJlciB0byByZXBvcnQgaW4gX01TQ19WRVIgKDAgPSBkb24ndCBkZWZpbmUgaXQgKGRlZmF1bHQpKSI+OwogZGVmIGZkZWxheWVkX3RlbXBsYXRlX3BhcnNpbmcgOiBGbGFnPFsiLSJdLCAiZmRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyI+LCBHcm91cDxmX0dyb3VwPiwKICAgSGVscFRleHQ8IlBhcnNlIHRlbXBsYXRlZCBmdW5jdGlvbiBkZWZpbml0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSAiCi0gICAgICAgICAgICJ0cmFuc2xhdGlvbiB1bml0ICI+LCAgRmxhZ3M8W0NDMU9wdGlvbl0+OworICAgICAgICAgICAidHJhbnNsYXRpb24gdW5pdCI+LCAgRmxhZ3M8W0NDMU9wdGlvbl0+OworZGVmIGZtc19tZW1wdHJfcmVwX0VRIDogSm9pbmVkPFsiLSJdLCAiZm1zLW1lbXB0ci1yZXA9Ij4sIEdyb3VwPGZfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT47CiBkZWYgZm1vZHVsZXNfY2FjaGVfcGF0aCA6IEpvaW5lZDxbIi0iXSwgImZtb2R1bGVzLWNhY2hlLXBhdGg9Ij4sIEdyb3VwPGlfR3JvdXA+LAogICBGbGFnczxbRHJpdmVyT3B0aW9uLCBDQzFPcHRpb25dPiwgTWV0YVZhck5hbWU8IjxkaXJlY3Rvcnk+Ij4sCiAgIEhlbHBUZXh0PCJTcGVjaWZ5IHRoZSBtb2R1bGUgY2FjaGUgcGF0aCI+OworZGVmIGZtb2R1bGVzX3VzZXJfYnVpbGRfcGF0aCA6IFNlcGFyYXRlPFsiLSJdLCAiZm1vZHVsZXMtdXNlci1idWlsZC1wYXRoIj4sIEdyb3VwPGlfR3JvdXA+LAorICBGbGFnczxbRHJpdmVyT3B0aW9uLCBDQzFPcHRpb25dPiwgTWV0YVZhck5hbWU8IjxkaXJlY3Rvcnk+Ij4sCisgIEhlbHBUZXh0PCJTcGVjaWZ5IHRoZSBtb2R1bGUgdXNlciBidWlsZCBwYXRoIj47CiBkZWYgZm1vZHVsZXNfcHJ1bmVfaW50ZXJ2YWwgOiBKb2luZWQ8WyItIl0sICJmbW9kdWxlcy1wcnVuZS1pbnRlcnZhbD0iPiwgR3JvdXA8aV9Hcm91cD4sCiAgIEZsYWdzPFtDQzFPcHRpb25dPiwgTWV0YVZhck5hbWU8IjxzZWNvbmRzPiI+LAogICBIZWxwVGV4dDwiU3BlY2lmeSB0aGUgaW50ZXJ2YWwgKGluIHNlY29uZHMpIGJldHdlZW4gYXR0ZW1wdHMgdG8gcHJ1bmUgdGhlIG1vZHVsZSBjYWNoZSI+OwogZGVmIGZtb2R1bGVzX3BydW5lX2FmdGVyIDogSm9pbmVkPFsiLSJdLCAiZm1vZHVsZXMtcHJ1bmUtYWZ0ZXI9Ij4sIEdyb3VwPGlfR3JvdXA+LAogICBGbGFnczxbQ0MxT3B0aW9uXT4sIE1ldGFWYXJOYW1lPCI8c2Vjb25kcz4iPiwKICAgSGVscFRleHQ8IlNwZWNpZnkgdGhlIGludGVydmFsIChpbiBzZWNvbmRzKSBhZnRlciB3aGljaCBhIG1vZHVsZSBmaWxlIHdpbGwgYmUgY29uc2lkZXJlZCB1bnVzZWQiPjsKK2RlZiBmYnVpbGRfc2Vzc2lvbl90aW1lc3RhbXAgOiBKb2luZWQ8WyItIl0sICJmYnVpbGQtc2Vzc2lvbi10aW1lc3RhbXA9Ij4sCisgIEdyb3VwPGlfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sIE1ldGFWYXJOYW1lPCI8dGltZSBzaW5jZSBFcG9jaCBpbiBzZWNvbmRzPiI+LAorICBIZWxwVGV4dDwiVGltZSB3aGVuIHRoZSBjdXJyZW50IGJ1aWxkIHNlc3Npb24gc3RhcnRlZCI+OworZGVmIGZtb2R1bGVzX3ZhbGlkYXRlX29uY2VfcGVyX2J1aWxkX3Nlc3Npb24gOiBGbGFnPFsiLSJdLCAiZm1vZHVsZXMtdmFsaWRhdGUtb25jZS1wZXItYnVpbGQtc2Vzc2lvbiI+LAorICBHcm91cDxpX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAorICBIZWxwVGV4dDwiRG9uJ3QgdmVyaWZ5IGlucHV0IGZpbGVzIGZvciB0aGUgbW9kdWxlcyBpZiB0aGUgbW9kdWxlIGhhcyBiZWVuICIKKyAgICAgICAgICAgInN1Y2Nlc3NmdWxseSB2YWxpZGF0ZSBvciBsb2FkZWQgZHVyaW5nIHRoaXMgYnVpbGQgc2Vzc2lvbiI+OworZGVmIGZtb2R1bGVzX3ZhbGlkYXRlX3N5c3RlbV9oZWFkZXJzIDogRmxhZzxbIi0iXSwgImZtb2R1bGVzLXZhbGlkYXRlLXN5c3RlbS1oZWFkZXJzIj4sCisgIEdyb3VwPGlfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sCisgIEhlbHBUZXh0PCJWYWxpZGF0ZSB0aGUgc3lzdGVtIGhlYWRlcnMgdGhhdCBhIG1vZHVsZSBkZXBlbmRzIG9uIHdoZW4gbG9hZGluZyB0aGUgbW9kdWxlIj47CiBkZWYgZm1vZHVsZXMgOiBGbGFnIDxbIi0iXSwgImZtb2R1bGVzIj4sIEdyb3VwPGZfR3JvdXA+LAogICBGbGFnczxbRHJpdmVyT3B0aW9uLCBDQzFPcHRpb25dPiwKICAgSGVscFRleHQ8IkVuYWJsZSB0aGUgJ21vZHVsZXMnIGxhbmd1YWdlIGZlYXR1cmUiPjsKQEAgLTYyNyw3ICs2NDMsNiBAQAogICBGbGFnczxbRHJpdmVyT3B0aW9uXT47CiBkZWYgZm5vX2RpYWdub3N0aWNzX2ZpeGl0X2luZm8gOiBGbGFnPFsiLSJdLCAiZm5vLWRpYWdub3N0aWNzLWZpeGl0LWluZm8iPiwgR3JvdXA8Zl9Hcm91cD4sCiAgIEZsYWdzPFtDQzFPcHRpb25dPiwgSGVscFRleHQ8IkRvIG5vdCBpbmNsdWRlIGZpeGl0IGluZm9ybWF0aW9uIGluIGRpYWdub3N0aWNzIj47Ci1kZWYgZm5vX2RpYWdub3N0aWNzX3Nob3dfbmFtZSA6IEZsYWc8WyItIl0sICJmbm8tZGlhZ25vc3RpY3Mtc2hvdy1uYW1lIj4sIEdyb3VwPGZfR3JvdXA+OwogZGVmIGZub19kaWFnbm9zdGljc19zaG93X29wdGlvbiA6IEZsYWc8WyItIl0sICJmbm8tZGlhZ25vc3RpY3Mtc2hvdy1vcHRpb24iPiwgR3JvdXA8Zl9Hcm91cD47CiBkZWYgZm5vX2RpYWdub3N0aWNzX3Nob3dfbm90ZV9pbmNsdWRlX3N0YWNrIDogRmxhZzxbIi0iXSwgImZuby1kaWFnbm9zdGljcy1zaG93LW5vdGUtaW5jbHVkZS1zdGFjayI+LAogICAgIEZsYWdzPFtDQzFPcHRpb25dPiwgR3JvdXA8Zl9Hcm91cD47CkBAIC02NDAsMTEgKzY1NSw5IEBACiBkZWYgZm5vX2dudV9rZXl3b3JkcyA6IEZsYWc8WyItIl0sICJmbm8tZ251LWtleXdvcmRzIj4sIEdyb3VwPGZfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT47CiBkZWYgZm5vX2lubGluZV9mdW5jdGlvbnMgOiBGbGFnPFsiLSJdLCAiZm5vLWlubGluZS1mdW5jdGlvbnMiPiwgR3JvdXA8Zl9jbGFuZ19Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPjsKIGRlZiBmbm9faW5saW5lIDogRmxhZzxbIi0iXSwgImZuby1pbmxpbmUiPiwgR3JvdXA8Zl9jbGFuZ19Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPjsKLWRlZiBmbm9fa2VlcF9pbmxpbmVfZnVuY3Rpb25zIDogRmxhZzxbIi0iXSwgImZuby1rZWVwLWlubGluZS1mdW5jdGlvbnMiPiwgR3JvdXA8Y2xhbmdfaWdub3JlZF9mX0dyb3VwPjsKK2RlZiA6IEZsYWc8WyItIl0sICJmbm8ta2VlcC1pbmxpbmUtZnVuY3Rpb25zIj4sIEdyb3VwPGNsYW5nX2lnbm9yZWRfZl9Hcm91cD47CiBkZWYgZm5vX2xheF92ZWN0b3JfY29udmVyc2lvbnMgOiBGbGFnPFsiLSJdLCAiZm5vLWxheC12ZWN0b3ItY29udmVyc2lvbnMiPiwgR3JvdXA8Zl9Hcm91cD4sCiAgIEhlbHBUZXh0PCJEaXNhbGxvdyBpbXBsaWNpdCBjb252ZXJzaW9ucyBiZXR3ZWVuIHZlY3RvcnMgd2l0aCBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgb3IgZGlmZmVyZW50IGVsZW1lbnQgdHlwZXMiPiwgRmxhZ3M8W0NDMU9wdGlvbl0+OwotZGVmIGZub19saW1pdF9kZWJ1Z19pbmZvIDogRmxhZzxbIi0iXSwgImZuby1saW1pdC1kZWJ1Zy1pbmZvIj4sIEdyb3VwPGZfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sCi0gIEhlbHBUZXh0PCJEbyBub3QgbGltaXQgZGVidWcgaW5mb3JtYXRpb24gcHJvZHVjZWQgdG8gcmVkdWNlIHNpemUgb2YgZGVidWcgYmluYXJ5Ij47CiBkZWYgZm5vX21lcmdlX2FsbF9jb25zdGFudHMgOiBGbGFnPFsiLSJdLCAiZm5vLW1lcmdlLWFsbC1jb25zdGFudHMiPiwgR3JvdXA8Zl9Hcm91cD4sCiAgICAgRmxhZ3M8W0NDMU9wdGlvbl0+LCBIZWxwVGV4dDwiRGlzYWxsb3cgbWVyZ2luZyBvZiBjb25zdGFudHMiPjsKIGRlZiBmbm9fbW9kdWxlcyA6IEZsYWcgPFsiLSJdLCAiZm5vLW1vZHVsZXMiPiwgR3JvdXA8Zl9Hcm91cD4sCkBAIC02NzIsNyArNjg1LDggQEAKICAgRmxhZ3M8W0NDMU9wdGlvbl0+LCBIZWxwVGV4dDwiRG8gbm90IGluY2x1ZGUgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdpdGggZGlhZ25vc3RpY3MiPjsKIGRlZiBmbm9fc3BlbGxfY2hlY2tpbmcgOiBGbGFnPFsiLSJdLCAiZm5vLXNwZWxsLWNoZWNraW5nIj4sIEdyb3VwPGZfR3JvdXA+LAogICBGbGFnczxbQ0MxT3B0aW9uXT4sIEhlbHBUZXh0PCJEaXNhYmxlIHNwZWxsLWNoZWNraW5nIj47Ci1kZWYgZm5vX3N0YWNrX3Byb3RlY3RvciA6IEZsYWc8WyItIl0sICJmbm8tc3RhY2stcHJvdGVjdG9yIj4sIEdyb3VwPGZfR3JvdXA+OworZGVmIGZub19zdGFja19wcm90ZWN0b3IgOiBGbGFnPFsiLSJdLCAiZm5vLXN0YWNrLXByb3RlY3RvciI+LCBHcm91cDxmX0dyb3VwPiwKKyAgSGVscFRleHQ8IkRpc2FibGUgdGhlIHVzZSBvZiBzdGFjayBwcm90ZWN0b3JzIj47CiBkZWYgZm5vX3N0cmljdF9hbGlhc2luZyA6IEZsYWc8WyItIl0sICJmbm8tc3RyaWN0LWFsaWFzaW5nIj4sIEdyb3VwPGZfR3JvdXA+OwogZGVmIGZzdHJ1Y3RfcGF0aF90YmFhIDogRmxhZzxbIi0iXSwgImZzdHJ1Y3QtcGF0aC10YmFhIj4sIEdyb3VwPGZfR3JvdXA+OwogZGVmIGZub19zdHJ1Y3RfcGF0aF90YmFhIDogRmxhZzxbIi0iXSwgImZuby1zdHJ1Y3QtcGF0aC10YmFhIj4sIEdyb3VwPGZfR3JvdXA+OwpAQCAtNzI2LDcgKzc0MCw4IEBACiAKIGRlZiBmb2JqY19zZW5kZXJfZGVwZW5kZW50X2Rpc3BhdGNoIDogRmxhZzxbIi0iXSwgImZvYmpjLXNlbmRlci1kZXBlbmRlbnQtZGlzcGF0Y2giPiwgR3JvdXA8Zl9Hcm91cD47CiBkZWYgZm9taXRfZnJhbWVfcG9pbnRlciA6IEZsYWc8WyItIl0sICJmb21pdC1mcmFtZS1wb2ludGVyIj4sIEdyb3VwPGZfR3JvdXA+OwotZGVmIGZvcGVubXAgOiBGbGFnPFsiLSJdLCAiZm9wZW5tcCI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+OworZGVmIGZvcGVubXAgOiBGbGFnPFsiLSJdLCAiZm9wZW5tcCI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbiwgTm9Bcmd1bWVudFVudXNlZF0+OworZGVmIGZvcGVubXBfRVEgOiBKb2luZWQ8WyItIl0sICJmb3Blbm1wPSI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+OwogZGVmIGZub19vcHRpbWl6ZV9zaWJsaW5nX2NhbGxzIDogRmxhZzxbIi0iXSwgImZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzIj4sIEdyb3VwPGZfR3JvdXA+OwogZGVmIGZvcHRpbWl6ZV9zaWJsaW5nX2NhbGxzIDogRmxhZzxbIi0iXSwgImZvcHRpbWl6ZS1zaWJsaW5nLWNhbGxzIj4sIEdyb3VwPGZfR3JvdXA+OwogZGVmIGZvcmNlX19jcHVzdWJ0eXBlX19BTEwgOiBGbGFnPFsiLSJdLCAiZm9yY2VfY3B1c3VidHlwZV9BTEwiPjsKQEAgLTc1MywxMiArNzY4LDE0IEBACiBkZWYgZnJlZ19zdHJ1Y3RfcmV0dXJuIDogRmxhZzxbIi0iXSwgImZyZWctc3RydWN0LXJldHVybiI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAogICBIZWxwVGV4dDwiT3ZlcnJpZGUgdGhlIGRlZmF1bHQgQUJJIHRvIHJldHVybiBzbWFsbCBzdHJ1Y3RzIGluIHJlZ2lzdGVycyI+OwogZGVmIGZydHRpIDogRmxhZzxbIi0iXSwgImZydHRpIj4sIEdyb3VwPGZfR3JvdXA+OwotZGVmIGZzY2hlZF9pbnRlcmJsb2NrIDogRmxhZzxbIi0iXSwgImZzY2hlZC1pbnRlcmJsb2NrIj4sIEdyb3VwPGNsYW5nX2lnbm9yZWRfZl9Hcm91cD47CitkZWYgOiBGbGFnPFsiLSJdLCAiZnNjaGVkLWludGVyYmxvY2siPiwgR3JvdXA8Y2xhbmdfaWdub3JlZF9mX0dyb3VwPjsKIGRlZiBmc2hvcnRfZW51bXMgOiBGbGFnPFsiLSJdLCAiZnNob3J0LWVudW1zIj4sIEdyb3VwPGZfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sCiAgIEhlbHBUZXh0PCJBbGxvY2F0ZSB0byBhbiBlbnVtIHR5cGUgb25seSBhcyBtYW55IGJ5dGVzIGFzIGl0IG5lZWRzIGZvciB0aGUgZGVjbGFyZWQgcmFuZ2Ugb2YgcG9zc2libGUgdmFsdWVzIj47Ci1kZWYgZnJlb3JkZXJfYmxvY2tzIDogRmxhZzxbIi0iXSwgImZyZW9yZGVyLWJsb2NrcyI+LCBHcm91cDxjbGFuZ19pZ25vcmVkX2ZfR3JvdXA+OworZGVmIDogRmxhZzxbIi0iXSwgImZyZW9yZGVyLWJsb2NrcyI+LCBHcm91cDxjbGFuZ19pZ25vcmVkX2ZfR3JvdXA+OwogZGVmIGZzaG9ydF93Y2hhciA6IEZsYWc8WyItIl0sICJmc2hvcnQtd2NoYXIiPiwgR3JvdXA8Zl9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgSGVscFRleHQ8IkZvcmNlIHdjaGFyX3QgdG8gYmUgYSBzaG9ydCB1bnNpZ25lZCBpbnQiPjsKK2RlZiBmbm9fc2hvcnRfd2NoYXIgOiBGbGFnPFsiLSJdLCAiZm5vLXNob3J0LXdjaGFyIj4sIEdyb3VwPGZfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sCisgIEhlbHBUZXh0PCJGb3JjZSB3Y2hhcl90IHRvIGJlIGFuIHVuc2lnbmVkIGludCI+OwogZGVmIGZzaG93X292ZXJsb2Fkc19FUSA6IEpvaW5lZDxbIi0iXSwgImZzaG93LW92ZXJsb2Fkcz0iPiwgR3JvdXA8Zl9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgSGVscFRleHQ8IldoaWNoIG92ZXJsb2FkIGNhbmRpZGF0ZXMgdG8gc2hvdyB3aGVuIG92ZXJsb2FkIHJlc29sdXRpb24gZmFpbHM6ICIKICAgICAgICAgICAgImJlc3R8YWxsOyBkZWZhdWx0cyB0byBhbGwiPjsKQEAgLTc3MCw4ICs3ODcsMTggQEAKIGRlZiBmbm9fc2lnbmVkX2NoYXIgOiBGbGFnPFsiLSJdLCAiZm5vLXNpZ25lZC1jaGFyIj4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgICBHcm91cDxjbGFuZ19pZ25vcmVkX2ZfR3JvdXA+LCBIZWxwVGV4dDwiQ2hhciBpcyB1bnNpZ25lZCI+OwogZGVmIGZzcGxpdF9zdGFjayA6IEZsYWc8WyItIl0sICJmc3BsaXQtc3RhY2siPiwgR3JvdXA8Zl9Hcm91cD47Ci1kZWYgZnN0YWNrX3Byb3RlY3Rvcl9hbGwgOiBGbGFnPFsiLSJdLCAiZnN0YWNrLXByb3RlY3Rvci1hbGwiPiwgR3JvdXA8Zl9Hcm91cD47Ci1kZWYgZnN0YWNrX3Byb3RlY3RvciA6IEZsYWc8WyItIl0sICJmc3RhY2stcHJvdGVjdG9yIj4sIEdyb3VwPGZfR3JvdXA+OworZGVmIGZzdGFja19wcm90ZWN0b3JfYWxsIDogRmxhZzxbIi0iXSwgImZzdGFjay1wcm90ZWN0b3ItYWxsIj4sIEdyb3VwPGZfR3JvdXA+LAorICBIZWxwVGV4dDwiRm9yY2UgdGhlIHVzYWdlIG9mIHN0YWNrIHByb3RlY3RvcnMgZm9yIGFsbCBmdW5jdGlvbnMiPjsKK2RlZiBmc3RhY2tfcHJvdGVjdG9yX3N0cm9uZyA6IEZsYWc8WyItIl0sICJmc3RhY2stcHJvdGVjdG9yLXN0cm9uZyI+LCBHcm91cDxmX0dyb3VwPiwKKyAgSGVscFRleHQ8IlVzZSBhIHN0cm9uZyBoZXVyaXN0aWMgdG8gYXBwbHkgc3RhY2sgcHJvdGVjdG9ycyB0byBmdW5jdGlvbnMiPjsKK2RlZiBmc3RhY2tfcHJvdGVjdG9yIDogRmxhZzxbIi0iXSwgImZzdGFjay1wcm90ZWN0b3IiPiwgR3JvdXA8Zl9Hcm91cD4sCisgIEhlbHBUZXh0PCJFbmFibGUgc3RhY2sgcHJvdGVjdG9ycyBmb3IgZnVuY3Rpb25zIHBvdGVudGlhbGx5IHZ1bG5lcmFibGUgdG8gc3RhY2sgc21hc2hpbmciPjsKK2RlZiBmc3RhbmRhbG9uZV9kZWJ1ZyA6IEZsYWc8WyItIl0sICJmc3RhbmRhbG9uZS1kZWJ1ZyI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAorICBIZWxwVGV4dDwiRW1pdCBmdWxsIGRlYnVnIGluZm8gZm9yIGFsbCB0eXBlcyB1c2VkIGJ5IHRoZSBwcm9ncmFtIj47CitkZWYgZm5vX3N0YW5kYWxvbmVfZGVidWcgOiBGbGFnPFsiLSJdLCAiZm5vLXN0YW5kYWxvbmUtZGVidWciPiwgR3JvdXA8Zl9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKKyAgSGVscFRleHQ8IkxpbWl0IGRlYnVnIGluZm9ybWF0aW9uIHByb2R1Y2VkIHRvIHJlZHVjZSBzaXplIG9mIGRlYnVnIGJpbmFyeSI+OworZGVmIGZsaW1pdF9kZWJ1Z19pbmZvIDogRmxhZzxbIi0iXSwgImZsaW1pdC1kZWJ1Zy1pbmZvIj4sIEFsaWFzPGZub19zdGFuZGFsb25lX2RlYnVnPjsKK2RlZiBmbm9fbGltaXRfZGVidWdfaW5mbyA6IEZsYWc8WyItIl0sICJmbm8tbGltaXQtZGVidWctaW5mbyI+LCBBbGlhczxmc3RhbmRhbG9uZV9kZWJ1Zz47CiBkZWYgZnN0cmljdF9hbGlhc2luZyA6IEZsYWc8WyItIl0sICJmc3RyaWN0LWFsaWFzaW5nIj4sIEdyb3VwPGZfR3JvdXA+OwogZGVmIGZzdHJpY3RfZW51bXMgOiBGbGFnPFsiLSJdLCAiZnN0cmljdC1lbnVtcyI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAogICBIZWxwVGV4dDwiRW5hYmxlIG9wdGltaXphdGlvbnMgYmFzZWQgb24gdGhlIHN0cmljdCBkZWZpbml0aW9uIG9mIGFuIGVudW0ncyAiCkBAIC03ODksMTYgKzgxNiwxNiBAQAogZGVmIGZ2ZWN0b3JpemUgOiBGbGFnPFsiLSJdLCAiZnZlY3Rvcml6ZSI+LCBHcm91cDxmX0dyb3VwPiwKICAgSGVscFRleHQ8IkVuYWJsZSB0aGUgbG9vcCB2ZWN0b3JpemF0aW9uIHBhc3NlcyI+OwogZGVmIGZub192ZWN0b3JpemUgOiBGbGFnPFsiLSJdLCAiZm5vLXZlY3Rvcml6ZSI+LCBHcm91cDxmX0dyb3VwPjsKLWRlZiBmdHJlZV92ZWN0b3JpemUgOiBGbGFnPFsiLSJdLCAiZnRyZWUtdmVjdG9yaXplIj4sIEFsaWFzPGZ2ZWN0b3JpemU+OwotZGVmIGZub190cmVlX3ZlY3Rvcml6ZSA6IEZsYWc8WyItIl0sICJmbm8tdHJlZS12ZWN0b3JpemUiPiwgQWxpYXM8Zm5vX3ZlY3Rvcml6ZT47CitkZWYgOiBGbGFnPFsiLSJdLCAiZnRyZWUtdmVjdG9yaXplIj4sIEFsaWFzPGZ2ZWN0b3JpemU+OworZGVmIDogRmxhZzxbIi0iXSwgImZuby10cmVlLXZlY3Rvcml6ZSI+LCBBbGlhczxmbm9fdmVjdG9yaXplPjsKIGRlZiBmc2xwX3ZlY3Rvcml6ZSA6IEZsYWc8WyItIl0sICJmc2xwLXZlY3Rvcml6ZSI+LCBHcm91cDxmX0dyb3VwPiwKICAgSGVscFRleHQ8IkVuYWJsZSB0aGUgc3VwZXJ3b3JkLWxldmVsIHBhcmFsbGVsaXNtIHZlY3Rvcml6YXRpb24gcGFzc2VzIj47CiBkZWYgZm5vX3NscF92ZWN0b3JpemUgOiBGbGFnPFsiLSJdLCAiZm5vLXNscC12ZWN0b3JpemUiPiwgR3JvdXA8Zl9Hcm91cD47CiBkZWYgZnNscF92ZWN0b3JpemVfYWdncmVzc2l2ZSA6IEZsYWc8WyItIl0sICJmc2xwLXZlY3Rvcml6ZS1hZ2dyZXNzaXZlIj4sIEdyb3VwPGZfR3JvdXA+LAogICBIZWxwVGV4dDwiRW5hYmxlIHRoZSBCQiB2ZWN0b3JpemF0aW9uIHBhc3NlcyI+OwogZGVmIGZub19zbHBfdmVjdG9yaXplX2FnZ3Jlc3NpdmUgOiBGbGFnPFsiLSJdLCAiZm5vLXNscC12ZWN0b3JpemUtYWdncmVzc2l2ZSI+LCBHcm91cDxmX0dyb3VwPjsKLWRlZiBmdHJlZV9zbHBfdmVjdG9yaXplIDogRmxhZzxbIi0iXSwgImZ0cmVlLXNscC12ZWN0b3JpemUiPiwgQWxpYXM8ZnNscF92ZWN0b3JpemU+OwotZGVmIGZub190cmVlX3NscF92ZWN0b3JpemUgOiBGbGFnPFsiLSJdLCAiZm5vLXRyZWUtc2xwLXZlY3Rvcml6ZSI+LCBBbGlhczxmbm9fc2xwX3ZlY3Rvcml6ZT47CitkZWYgOiBGbGFnPFsiLSJdLCAiZnRyZWUtc2xwLXZlY3Rvcml6ZSI+LCBBbGlhczxmc2xwX3ZlY3Rvcml6ZT47CitkZWYgOiBGbGFnPFsiLSJdLCAiZm5vLXRyZWUtc2xwLXZlY3Rvcml6ZSI+LCBBbGlhczxmbm9fc2xwX3ZlY3Rvcml6ZT47CiBkZWYgV2xhcmdlX2J5X3ZhbHVlX2NvcHlfZGVmIDogRmxhZzxbIi0iXSwgIldsYXJnZS1ieS12YWx1ZS1jb3B5Ij4sCiAgIEhlbHBUZXh0PCJXYXJuIGlmIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiByZXR1cm5zIG9yIGFjY2VwdHMgYW4gb2JqZWN0IGxhcmdlciAiCiAgICAgICAgICAgICJpbiBieXRlcyB0aGFuIGEgZ2l2ZW4gdmFsdWUiPiwgRmxhZ3M8W0hlbHBIaWRkZW5dPjsKQEAgLTgxMSw3ICs4MzgsNyBAQAogZGVmIFdmcmFtZV9sYXJnZXJfdGhhbiA6IFNlcGFyYXRlPFsiLSJdLCAiV2ZyYW1lLWxhcmdlci10aGFuIj4sIEdyb3VwPGNsYW5nX2lnbm9yZWRfZl9Hcm91cD47CiBkZWYgV2ZyYW1lX2xhcmdlcl90aGFuX0VRIDogSm9pbmVkPFsiLSJdLCAiV2ZyYW1lLWxhcmdlci10aGFuPSI+LCBBbGlhczxXZnJhbWVfbGFyZ2VyX3RoYW4+OwogCi1kZWYgZnRlcm1pbmF0ZWRfdnRhYmxlcyA6IEZsYWc8WyItIl0sICJmdGVybWluYXRlZC12dGFibGVzIj4sIEFsaWFzPGZhcHBsZV9rZXh0PjsKK2RlZiA6IEZsYWc8WyItIl0sICJmdGVybWluYXRlZC12dGFibGVzIj4sIEFsaWFzPGZhcHBsZV9rZXh0PjsKIGRlZiBmdGhyZWFkc2FmZV9zdGF0aWNzIDogRmxhZzxbIi0iXSwgImZ0aHJlYWRzYWZlLXN0YXRpY3MiPiwgR3JvdXA8Zl9Hcm91cD47CiBkZWYgZnRpbWVfcmVwb3J0IDogRmxhZzxbIi0iXSwgImZ0aW1lLXJlcG9ydCI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+OwogZGVmIGZ0bHNtb2RlbF9FUSA6IEpvaW5lZDxbIi0iXSwgImZ0bHMtbW9kZWw9Ij4sIEdyb3VwPGZfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT47CkBAIC04NjYsMTAgKzg5MywxMyBAQAogICBGbGFnczxbQ0MxT3B0aW9uXT47CiBkZWYgZmRlYnVnX3R5cGVzX3NlY3Rpb246IEZsYWcgPFsiLSJdLCAiZmRlYnVnLXR5cGVzLXNlY3Rpb24iPiwgR3JvdXA8Zl9Hcm91cD4sCiAgIEZsYWdzPFtDQzFPcHRpb25dPiwgSGVscFRleHQ8IlBsYWNlIGRlYnVnIHR5cGVzIGluIHRoZWlyIG93biBzZWN0aW9uIChFTEYgT25seSkiPjsKK2RlZiBmbm9fZGVidWdfdHlwZXNfc2VjdGlvbjogRmxhZzxbIi0iXSwgImZuby1kZWJ1Zy10eXBlcy1zZWN0aW9uIj4sIEdyb3VwPGZfR3JvdXA+LAorICBGbGFnczxbQ0MxT3B0aW9uXT47CiBkZWYgZ19GbGFnIDogRmxhZzxbIi0iXSwgImciPiwgR3JvdXA8Z19Hcm91cD4sCiAgIEhlbHBUZXh0PCJHZW5lcmF0ZSBzb3VyY2UgbGV2ZWwgZGVidWcgaW5mb3JtYXRpb24iPiwgRmxhZ3M8W0NDMU9wdGlvbl0+OwogZGVmIGdsaW5lX3RhYmxlc19vbmx5IDogRmxhZzxbIi0iXSwgImdsaW5lLXRhYmxlcy1vbmx5Ij4sIEdyb3VwPGdfR3JvdXA+LAogICBIZWxwVGV4dDwiRW1pdCBkZWJ1ZyBsaW5lIG51bWJlciB0YWJsZXMgb25seSI+LCBGbGFnczxbQ0MxT3B0aW9uXT47CitkZWYgZ21sdCA6IEZsYWc8WyItIl0sICJnbWx0Ij4sIEFsaWFzPGdsaW5lX3RhYmxlc19vbmx5PjsKIGRlZiBnMCA6IEZsYWc8WyItIl0sICJnMCI+LCBHcm91cDxnX0dyb3VwPjsKIGRlZiBnMSA6IEZsYWc8WyItIl0sICJnMSI+LCBHcm91cDxnX0dyb3VwPjsKIGRlZiBnMiA6IEZsYWc8WyItIl0sICJnMiI+LCBHcm91cDxnX0dyb3VwPjsKQEAgLTkwMCw2ICs5MzAsNyBAQAogZGVmIGdjb2x1bW5faW5mbyA6IEZsYWc8WyItIl0sICJnY29sdW1uLWluZm8iPiwgR3JvdXA8Z19mbGFnc19Hcm91cD47CiBkZWYgZ3NwbGl0X2R3YXJmIDogRmxhZzxbIi0iXSwgImdzcGxpdC1kd2FyZiI+LCBHcm91cDxnX2ZsYWdzX0dyb3VwPjsKIGRlZiBnZ251X3B1Ym5hbWVzIDogRmxhZzxbIi0iXSwgImdnbnUtcHVibmFtZXMiPiwgR3JvdXA8Z19mbGFnc19Hcm91cD47CitkZWYgZ2R3YXJmX2FyYW5nZXMgOiBGbGFnPFsiLSJdLCAiZ2R3YXJmLWFyYW5nZXMiPiwgR3JvdXA8Z19mbGFnc19Hcm91cD47CiBkZWYgaGVhZGVycGFkX19tYXhfX2luc3RhbGxfX25hbWVzIDogSm9pbmVkPFsiLSJdLCAiaGVhZGVycGFkX21heF9pbnN0YWxsX25hbWVzIj47CiBkZWYgaGVscCA6IEZsYWc8WyItIiwgIi0tIl0sICJoZWxwIj4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgSGVscFRleHQ8IkRpc3BsYXkgYXZhaWxhYmxlIG9wdGlvbnMiPjsKQEAgLTkxOCw5ICs5NDksMTAgQEAKICAgSGVscFRleHQ8IkluY2x1ZGUgcHJlY29tcGlsZWQgaGVhZGVyIGZpbGUiPiwgTWV0YVZhck5hbWU8IjxmaWxlPiI+OwogZGVmIHJlbG9jYXRhYmxlX3BjaCA6IEZsYWc8WyItIiwgIi0tIl0sICJyZWxvY2F0YWJsZS1wY2giPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAogICBIZWxwVGV4dDwiV2hldGhlciB0byBidWlsZCBhIHJlbG9jYXRhYmxlIHByZWNvbXBpbGVkIGhlYWRlciI+OworZGVmIHZlcmlmeV9wY2ggOiBGbGFnPFsiLSJdLCAidmVyaWZ5LXBjaCI+LCBHcm91cDxBY3Rpb25fR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sCisgIEhlbHBUZXh0PCJMb2FkIGFuZCB2ZXJpZnkgdGhhdCBhIHByZS1jb21waWxlZCBoZWFkZXIgZmlsZSBpcyBub3Qgc3RhbGUiPjsKIGRlZiBpbml0IDogU2VwYXJhdGU8WyItIl0sICJpbml0Ij47CiBkZWYgaW5zdGFsbF9fbmFtZSA6IFNlcGFyYXRlPFsiLSJdLCAiaW5zdGFsbF9uYW1lIj47Ci1kZWYgaW50ZWdyYXRlZF9hcyA6IEZsYWc8WyItIl0sICJpbnRlZ3JhdGVkLWFzIj4sIEZsYWdzPFtEcml2ZXJPcHRpb25dPjsKIGRlZiBpcHJlZml4IDogSm9pbmVkT3JTZXBhcmF0ZTxbIi0iXSwgImlwcmVmaXgiPiwgR3JvdXA8Y2xhbmdfaV9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgSGVscFRleHQ8IlNldCB0aGUgLWl3aXRocHJlZml4Ly1pd2l0aHByZWZpeGJlZm9yZSBwcmVmaXgiPiwgTWV0YVZhck5hbWU8IjxkaXI+Ij47CiBkZWYgaXF1b3RlIDogSm9pbmVkT3JTZXBhcmF0ZTxbIi0iXSwgImlxdW90ZSI+LCBHcm91cDxjbGFuZ19pX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LApAQCAtOTM4LDYgKzk3MCw4IEBACiAgIEhlbHBUZXh0PCJBZGQgZGlyZWN0b3J5IHRvIFNZU1RFTSBpbmNsdWRlIHNlYXJjaCBwYXRoLCAiCiAgICAgICAgICAgICJhYnNvbHV0ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gLWlzeXNyb290Ij4sIE1ldGFWYXJOYW1lPCI8ZGlyZWN0b3J5PiI+LAogICBGbGFnczxbQ0MxT3B0aW9uXT47CitkZWYgaXZmc292ZXJsYXkgOiBKb2luZWRPclNlcGFyYXRlPFsiLSJdLCAiaXZmc292ZXJsYXkiPiwgR3JvdXA8Y2xhbmdfaV9Hcm91cD4sIEZsYWdzPFtDQzFPcHRpb25dPiwKKyAgSGVscFRleHQ8Ik92ZXJsYXkgdGhlIHZpcnR1YWwgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgZmlsZSBvdmVyIHRoZSByZWFsIGZpbGUgc3lzdGVtIj47CiBkZWYgaSA6IEpvaW5lZDxbIi0iXSwgImkiPiwgR3JvdXA8aV9Hcm91cD47CiBkZWYga2VlcF9fcHJpdmF0ZV9fZXh0ZXJucyA6IEZsYWc8WyItIl0sICJrZWVwX3ByaXZhdGVfZXh0ZXJucyI+OwogZGVmIGwgOiBKb2luZWRPclNlcGFyYXRlPFsiLSJdLCAibCI+LCBGbGFnczxbTGlua2VySW5wdXQsIFJlbmRlckpvaW5lZF0+OwpAQCAtOTQ1LDYgKzk3OSw3IEBACiBkZWYgbGF6eV9fbGlicmFyeSA6IFNlcGFyYXRlPFsiLSJdLCAibGF6eV9saWJyYXJ5Ij4sIEZsYWdzPFtMaW5rZXJJbnB1dF0+OwogZGVmIEVMIDogRmxhZzxbIi0iXSwgIkVMIj4sIEZsYWdzPFtEcml2ZXJPcHRpb25dPjsKIGRlZiBFQiA6IEZsYWc8WyItIl0sICJFQiI+LCBGbGFnczxbRHJpdmVyT3B0aW9uXT47CitkZWYgbTE2IDogRmxhZzxbIi0iXSwgIm0xNiI+LCBHcm91cDxtX0dyb3VwPiwgRmxhZ3M8W0RyaXZlck9wdGlvbiwgQ29yZU9wdGlvbl0+OwogZGVmIG0zMiA6IEZsYWc8WyItIl0sICJtMzIiPiwgR3JvdXA8bV9Hcm91cD4sIEZsYWdzPFtEcml2ZXJPcHRpb24sIENvcmVPcHRpb25dPjsKIGRlZiBtcWRzcDZfY29tcGF0IDogRmxhZzxbIi0iXSwgIm1xZHNwNi1jb21wYXQiPiwgR3JvdXA8bV9Hcm91cD4sIEZsYWdzPFtEcml2ZXJPcHRpb24sQ0MxT3B0aW9uXT4sCiAgIEhlbHBUZXh0PCJFbmFibGUgaGV4YWdvbi1xZHNwNiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ij47CkBAIC0xMDQ2LDYgKzEwODEsOSBAQAogZGVmIG1ub2NyYyA6IEZsYWc8WyItIl0sICJtbm9jcmMiPiwgR3JvdXA8bV9hcm1fRmVhdHVyZXNfR3JvdXA+LAogICBIZWxwVGV4dDwiRGlzYWxsb3cgdXNlIG9mIENSQyBpbnN0cnVjdGlvbnMgKEFSTSBvbmx5KSI+OwogCitkZWYgbWdlbmVyYWxfcmVnc19vbmx5IDogRmxhZzxbIi0iXSwgIm1nZW5lcmFsLXJlZ3Mtb25seSI+LCBHcm91cDxtX2FhcmNoNjRfRmVhdHVyZXNfR3JvdXA+LAorICBIZWxwVGV4dDwiR2VuZXJhdGUgY29kZSB3aGljaCBvbmx5IHVzZXMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKEFBcmNoNjQgb25seSkiPjsKKwogZGVmIG12c3ggOiBGbGFnPFsiLSJdLCAibXZzeCI+LCBHcm91cDxtX3BwY19GZWF0dXJlc19Hcm91cD47CiBkZWYgbW5vX3ZzeCA6IEZsYWc8WyItIl0sICJtbm8tdnN4Ij4sIEdyb3VwPG1fcHBjX0ZlYXR1cmVzX0dyb3VwPjsKIGRlZiBtZnBybmQgOiBGbGFnPFsiLSJdLCAibWZwcm5kIj4sIEdyb3VwPG1fcHBjX0ZlYXR1cmVzX0dyb3VwPjsKQEAgLTEwNTYsNiArMTA5NCw4IEBACiBkZWYgbW5vX3BvcGNudGQgOiBGbGFnPFsiLSJdLCAibW5vLXBvcGNudGQiPiwgR3JvdXA8bV9wcGNfRmVhdHVyZXNfR3JvdXA+OwogZGVmIG1xcHggOiBGbGFnPFsiLSJdLCAibXFweCI+LCBHcm91cDxtX3BwY19GZWF0dXJlc19Hcm91cD47CiBkZWYgbW5vX3FweCA6IEZsYWc8WyItIl0sICJtbm8tcXB4Ij4sIEdyb3VwPG1fcHBjX0ZlYXR1cmVzX0dyb3VwPjsKK2RlZiBtY3JiaXRzIDogRmxhZzxbIi0iXSwgIm1jcmJpdHMiPiwgR3JvdXA8bV9wcGNfRmVhdHVyZXNfR3JvdXA+OworZGVmIG1ub19jcmJpdHMgOiBGbGFnPFsiLSJdLCAibW5vLWNyYml0cyI+LCBHcm91cDxtX3BwY19GZWF0dXJlc19Hcm91cD47CiAKIGRlZiBmYWx0aXZlYyA6IEZsYWc8WyItIl0sICJmYWx0aXZlYyI+LCBHcm91cDxmX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LAogICBIZWxwVGV4dDwiRW5hYmxlIEFsdGlWZWMgdmVjdG9yIGluaXRpYWxpemVyIHN5bnRheCI+OwpAQCAtMTE2MCw3ICsxMjAwLDYgQEAKIGRlZiBub19jYW5vbmljYWxfcHJlZml4ZXMgOiBGbGFnPFsiLSJdLCAibm8tY2Fub25pY2FsLXByZWZpeGVzIj4sIEZsYWdzPFtIZWxwSGlkZGVuXT4sCiAgIEhlbHBUZXh0PCJVc2UgcmVsYXRpdmUgaW5zdGVhZCBvZiBjYW5vbmljYWwgcGF0aHMiPjsKIGRlZiBub19jcHBfcHJlY29tcCA6IEZsYWc8WyItIl0sICJuby1jcHAtcHJlY29tcCI+LCBHcm91cDxjbGFuZ19pZ25vcmVkX2ZfR3JvdXA+OwotZGVmIG5vX2ludGVncmF0ZWRfYXMgOiBGbGFnPFsiLSJdLCAibm8taW50ZWdyYXRlZC1hcyI+LCBGbGFnczxbRHJpdmVyT3B0aW9uXT47CiBkZWYgbm9faW50ZWdyYXRlZF9jcHAgOiBGbGFnPFsiLSIsICItLSJdLCAibm8taW50ZWdyYXRlZC1jcHAiPiwgRmxhZ3M8W0RyaXZlck9wdGlvbl0+OwogZGVmIG5vX3BlZGFudGljIDogRmxhZzxbIi0iLCAiLS0iXSwgIm5vLXBlZGFudGljIj4sIEdyb3VwPHBlZGFudGljX0dyb3VwPjsKIGRlZiBub19fZGVhZF9fc3RyaXBfX2luaXRzX19hbmRfX3Rlcm1zIDogRmxhZzxbIi0iXSwgIm5vX2RlYWRfc3RyaXBfaW5pdHNfYW5kX3Rlcm1zIj47CkBAIC0xMjI4LDYgKzEyNjcsOCBAQAogZGVmIHIgOiBGbGFnPFsiLSJdLCAiciI+OwogZGVmIHNhdmVfdGVtcHMgOiBGbGFnPFsiLSIsICItLSJdLCAic2F2ZS10ZW1wcyI+LCBGbGFnczxbRHJpdmVyT3B0aW9uXT4sCiAgIEhlbHBUZXh0PCJTYXZlIGludGVybWVkaWF0ZSBjb21waWxhdGlvbiByZXN1bHRzIj47CitkZWYgdmlhX2ZpbGVfYXNtIDogRmxhZzxbIi0iLCAiLS0iXSwgInZpYS1maWxlLWFzbSI+LCBJbnRlcm5hbERlYnVnT3B0LAorICBIZWxwVGV4dDwiV3JpdGUgYXNzZW1ibHkgdG8gZmlsZSBmb3IgaW5wdXQgdG8gYXNzZW1ibGUgam9icyI+OwogZGVmIHNlY3RhbGlnbiA6IE11bHRpQXJnPFsiLSJdLCAic2VjdGFsaWduIiwgMz47CiBkZWYgc2VjdGNyZWF0ZSA6IE11bHRpQXJnPFsiLSJdLCAic2VjdGNyZWF0ZSIsIDM+OwogZGVmIHNlY3RvYmplY3RzeW1ib2xzIDogTXVsdGlBcmc8WyItIl0sICJzZWN0b2JqZWN0c3ltYm9scyIsIDI+OwpAQCAtMTI1Nyw2ICsxMjk4LDE2IEBACiAgIEhlbHBUZXh0PCJDKysgc3RhbmRhcmQgbGlicmFyeSB0byB1c2UiPjsKIGRlZiBzdWJfX2xpYnJhcnkgOiBKb2luZWRPclNlcGFyYXRlPFsiLSJdLCAic3ViX2xpYnJhcnkiPjsKIGRlZiBzdWJfX3VtYnJlbGxhIDogSm9pbmVkT3JTZXBhcmF0ZTxbIi0iXSwgInN1Yl91bWJyZWxsYSI+OworZGVmIHN5c3RlbV9oZWFkZXJfcHJlZml4IDogSm9pbmVkPFsiLS0iXSwgInN5c3RlbS1oZWFkZXItcHJlZml4PSI+LAorICBHcm91cDxjbGFuZ19pX0dyb3VwPiwgRmxhZ3M8W0NDMU9wdGlvbl0+LCBNZXRhVmFyTmFtZTwiPHByZWZpeD4iPiwKKyAgSGVscFRleHQ8IlRyZWF0IGFsbCAjaW5jbHVkZSBwYXRocyBzdGFydGluZyB3aXRoIDxwcmVmaXg+IGFzIGluY2x1ZGluZyBhICIKKyAgICAgICAgICAgInN5c3RlbSBoZWFkZXIuIj47CitkZWYgOiBTZXBhcmF0ZTxbIi0tIl0sICJzeXN0ZW0taGVhZGVyLXByZWZpeCI+LCBBbGlhczxzeXN0ZW1faGVhZGVyX3ByZWZpeD47CitkZWYgbm9fc3lzdGVtX2hlYWRlcl9wcmVmaXggOiBKb2luZWQ8WyItLSJdLCAibm8tc3lzdGVtLWhlYWRlci1wcmVmaXg9Ij4sCisgIEdyb3VwPGNsYW5nX2lfR3JvdXA+LCBGbGFnczxbQ0MxT3B0aW9uXT4sIE1ldGFWYXJOYW1lPCI8cHJlZml4PiI+LAorICBIZWxwVGV4dDwiVHJlYXQgYWxsICNpbmNsdWRlIHBhdGhzIHN0YXJ0aW5nIHdpdGggPHByZWZpeD4gYXMgbm90IGluY2x1ZGluZyBhICIKKyAgICAgICAgICAgInN5c3RlbSBoZWFkZXIuIj47CitkZWYgOiBTZXBhcmF0ZTxbIi0tIl0sICJuby1zeXN0ZW0taGVhZGVyLXByZWZpeCI+LCBBbGlhczxub19zeXN0ZW1faGVhZGVyX3ByZWZpeD47CiBkZWYgcyA6IEZsYWc8WyItIl0sICJzIj47CiBkZWYgdGFyZ2V0IDogSm9pbmVkPFsiLS0iXSwgInRhcmdldD0iPiwgRmxhZ3M8W0RyaXZlck9wdGlvbl0+LAogICBIZWxwVGV4dDwiR2VuZXJhdGUgY29kZSBmb3IgdGhlIGdpdmVuIHRhcmdldCI+OwpAQCAtMTI3OCwxMCArMTMyOSwxMCBAQAogICBIZWxwVGV4dDwidW5kZWYgYWxsIHN5c3RlbSBkZWZpbmVzIj47CiBkZWYgdW5leHBvcnRlZF9fc3ltYm9sc19fbGlzdCA6IFNlcGFyYXRlPFsiLSJdLCAidW5leHBvcnRlZF9zeW1ib2xzX2xpc3QiPjsKIGRlZiB1IDogSm9pbmVkT3JTZXBhcmF0ZTxbIi0iXSwgInUiPiwgR3JvdXA8dV9Hcm91cD47Ci1kZWYgdiA6IEZsYWc8WyItIl0sICJ2Ij4sIEZsYWdzPFtDQzFPcHRpb25dPiwKK2RlZiB2IDogRmxhZzxbIi0iXSwgInYiPiwgRmxhZ3M8W0NDMU9wdGlvbiwgQ29yZU9wdGlvbl0+LAogICBIZWxwVGV4dDwiU2hvdyBjb21tYW5kcyB0byBydW4gYW5kIHVzZSB2ZXJib3NlIG91dHB1dCI+OwotZGVmIHZlcmlmeSA6IEZsYWc8WyItIl0sICJ2ZXJpZnkiPiwgRmxhZ3M8W0RyaXZlck9wdGlvbixDQzFPcHRpb25dPiwKLSAgSGVscFRleHQ8IlZlcmlmeSBvdXRwdXQgdXNpbmcgYSB2ZXJpZmllciI+OworZGVmIHZlcmlmeV9kZWJ1Z19pbmZvIDogRmxhZzxbIi0tIl0sICJ2ZXJpZnktZGVidWctaW5mbyI+LCBGbGFnczxbRHJpdmVyT3B0aW9uXT4sCisgIEhlbHBUZXh0PCJWZXJpZnkgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBkZWJ1ZyBvdXRwdXQiPjsKIGRlZiB3ZWFrX2wgOiBKb2luZWQ8WyItIl0sICJ3ZWFrLWwiPiwgRmxhZ3M8W0xpbmtlcklucHV0XT47CiBkZWYgd2Vha19fZnJhbWV3b3JrIDogU2VwYXJhdGU8WyItIl0sICJ3ZWFrX2ZyYW1ld29yayI+LCBGbGFnczxbTGlua2VySW5wdXRdPjsKIGRlZiB3ZWFrX19saWJyYXJ5IDogU2VwYXJhdGU8WyItIl0sICJ3ZWFrX2xpYnJhcnkiPiwgRmxhZ3M8W0xpbmtlcklucHV0XT47CkBAIC0xMjk0LDYgKzEzNDUsMTUgQEAKICAgTWV0YVZhck5hbWU8IjxsYW5ndWFnZT4iPjsKIGRlZiB5IDogSm9pbmVkPFsiLSJdLCAieSI+OwogCitkZWYgZmludGVncmF0ZWRfYXMgOiBGbGFnPFsiLSJdLCAiZmludGVncmF0ZWQtYXMiPiwgRmxhZ3M8W0RyaXZlck9wdGlvbl0+LAorICAgICAgICAgICAgICAgICAgICAgR3JvdXA8Zl9Hcm91cD4sIEhlbHBUZXh0PCJFbmFibGUgdGhlIGludGVncmF0ZWQgYXNzZW1ibGVyIj47CitkZWYgZm5vX2ludGVncmF0ZWRfYXMgOiBGbGFnPFsiLSJdLCAiZm5vLWludGVncmF0ZWQtYXMiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzPFtDQzFPcHRpb24sIERyaXZlck9wdGlvbl0+LCBHcm91cDxmX0dyb3VwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhlbHBUZXh0PCJEaXNhYmxlIHRoZSBpbnRlZ3JhdGVkIGFzc2VtYmxlciI+OworZGVmIDogRmxhZzxbIi0iXSwgImludGVncmF0ZWQtYXMiPiwgQWxpYXM8ZmludGVncmF0ZWRfYXM+LCBGbGFnczxbRHJpdmVyT3B0aW9uXT47CitkZWYgOiBGbGFnPFsiLSJdLCAibm8taW50ZWdyYXRlZC1hcyI+LCBBbGlhczxmbm9faW50ZWdyYXRlZF9hcz4sCisgICAgICBGbGFnczxbQ0MxT3B0aW9uLCBEcml2ZXJPcHRpb25dPjsKKwogZGVmIHdvcmtpbmdfZGlyZWN0b3J5IDogSm9pbmVkT3JTZXBhcmF0ZTxbIi0iXSwgIndvcmtpbmctZGlyZWN0b3J5Ij4sIEZsYWdzPFtDQzFPcHRpb25dPiwKICAgSGVscFRleHQ8IlJlc29sdmUgZmlsZSBwYXRocyByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSI+OwogZGVmIHdvcmtpbmdfZGlyZWN0b3J5X0VRIDogSm9pbmVkPFsiLSJdLCAid29ya2luZy1kaXJlY3Rvcnk9Ij4sIEZsYWdzPFtDQzFPcHRpb25dPiwKQEAgLTEzMDIsNyArMTM2Miw4IEBACiAvLyBEb3VibGUgZGFzaCBvcHRpb25zLCB3aGljaCBhcmUgdXN1YWxseSBhbiBhbGlhcyBmb3Igb25lIG9mIHRoZSBwcmV2aW91cwogLy8gb3B0aW9ucy4KIAotZGVmIF9taHdkaXZfRVEgOiBTZXBhcmF0ZTxbIi0tIl0sICJtaHdkaXYiPiwgQWxpYXM8bWh3ZGl2X0VRPjsKK2RlZiBfbWh3ZGl2X0VRIDogSm9pbmVkPFsiLS0iXSwgIm1od2Rpdj0iPiwgQWxpYXM8bWh3ZGl2X0VRPjsKK2RlZiBfbWh3ZGl2IDogU2VwYXJhdGU8WyItLSJdLCAibWh3ZGl2Ij4sIEFsaWFzPG1od2Rpdl9FUT47CiBkZWYgX0NMQVNTUEFUSF9FUSA6IEpvaW5lZDxbIi0tIl0sICJDTEFTU1BBVEg9Ij4sIEFsaWFzPGZjbGFzc3BhdGhfRVE+OwogZGVmIF9DTEFTU1BBVEggOiBTZXBhcmF0ZTxbIi0tIl0sICJDTEFTU1BBVEgiPiwgQWxpYXM8ZmNsYXNzcGF0aF9FUT47CiBkZWYgX2FsbF93YXJuaW5ncyA6IEZsYWc8WyItLSJdLCAiYWxsLXdhcm5pbmdzIj4sIEFsaWFzPFdhbGw+OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvU2FuaXRpemVyQXJncy5oIGIvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvU2FuaXRpemVyQXJncy5oCmluZGV4IDM1YjhmODkuLmM3OWM0NzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL1Nhbml0aXplckFyZ3MuaAorKysgYi9pbmNsdWRlL2NsYW5nL0RyaXZlci9TYW5pdGl6ZXJBcmdzLmgKQEAgLTksMTAgKzksOSBAQAogI2lmbmRlZiBDTEFOR19MSUJfRFJJVkVSX1NBTklUSVpFUkFSR1NfSF8KICNkZWZpbmUgQ0xBTkdfTElCX0RSSVZFUl9TQU5JVElaRVJBUkdTX0hfCiAKLSNpbmNsdWRlIDxzdHJpbmc+Ci0KICNpbmNsdWRlICJsbHZtL09wdGlvbi9BcmcuaCIKICNpbmNsdWRlICJsbHZtL09wdGlvbi9BcmdMaXN0LmgiCisjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIGRyaXZlciB7CkBAIC00MywxNCArNDIsMTYgQEAKICAgICBOZWVkc0xlYWtEZXRlY3Rpb24gPSBMZWFrLAogICAgIE5lZWRzVWJzYW5SdCA9IFVuZGVmaW5lZCB8IEludGVnZXIsCiAgICAgTm90QWxsb3dlZFdpdGhUcmFwID0gVnB0ciwKLSAgICBIYXNaZXJvQmFzZVNoYWRvdyA9IFRocmVhZCB8IE1lbW9yeSB8IERhdGFGbG93CisgICAgSGFzWmVyb0Jhc2VTaGFkb3cgPSBUaHJlYWQgfCBNZW1vcnkgfCBEYXRhRmxvdywKKyAgICBOZWVkc1Vud2luZFRhYmxlcyA9IEFkZHJlc3MgfCBUaHJlYWQgfCBNZW1vcnkgfCBEYXRhRmxvdwogICB9OwogICB1bnNpZ25lZCBLaW5kOwogCiAgIHN0ZDo6c3RyaW5nIEJsYWNrbGlzdEZpbGU7Ci0gIGJvb2wgTXNhblRyYWNrT3JpZ2luczsKKyAgaW50IE1zYW5UcmFja09yaWdpbnM7CiAgIGJvb2wgQXNhblplcm9CYXNlU2hhZG93OwogICBib29sIFVic2FuVHJhcE9uRXJyb3I7CisgIGJvb2wgQXNhblNoYXJlZFJ1bnRpbWU7CiAKICBwdWJsaWM6CiAgIFNhbml0aXplckFyZ3MoKTsKQEAgLTU4LDYgKzU5LDcgQEAKICAgU2FuaXRpemVyQXJncyhjb25zdCBUb29sQ2hhaW4gJlRDLCBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpOwogCiAgIGJvb2wgbmVlZHNBc2FuUnQoKSBjb25zdCB7IHJldHVybiBLaW5kICYgTmVlZHNBc2FuUnQ7IH0KKyAgYm9vbCBuZWVkc1NoYXJlZEFzYW5SdCgpIGNvbnN0IHsgcmV0dXJuIEFzYW5TaGFyZWRSdW50aW1lOyB9CiAgIGJvb2wgbmVlZHNUc2FuUnQoKSBjb25zdCB7IHJldHVybiBLaW5kICYgTmVlZHNUc2FuUnQ7IH0KICAgYm9vbCBuZWVkc01zYW5SdCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgJiBOZWVkc01zYW5SdDsgfQogICBib29sIG5lZWRzTGVha0RldGVjdGlvbigpIGNvbnN0IHsgcmV0dXJuIEtpbmQgJiBOZWVkc0xlYWtEZXRlY3Rpb247IH0KQEAgLTc0LDYgKzc2LDcgQEAKICAgYm9vbCBoYXNaZXJvQmFzZVNoYWRvdygpIGNvbnN0IHsKICAgICByZXR1cm4gKEtpbmQgJiBIYXNaZXJvQmFzZVNoYWRvdykgfHwgQXNhblplcm9CYXNlU2hhZG93OwogICB9CisgIGJvb2wgbmVlZHNVbndpbmRUYWJsZXMoKSBjb25zdCB7IHJldHVybiBLaW5kICYgTmVlZHNVbndpbmRUYWJsZXM7IH0KICAgdm9pZCBhZGRBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3Q7CiAKQEAgLTk5LDcgKzEwMiw3IEBACiAKICAgLy8vIFByb2R1Y2UgYW4gYXJndW1lbnQgc3RyaW5nIGZyb20gQXJnTGlzdCBccCBBcmdzLCB3aGljaCBzaG93cyBob3cgaXQKICAgLy8vIHByb3ZpZGVzIGEgc2FuaXRpemVyIGtpbmQgaW4gXHAgTWFzay4gRm9yIGV4YW1wbGUsIHRoZSBhcmd1bWVudCBsaXN0Ci0gIC8vLyAiLWZzYW5pdGl6ZT10aHJlYWQsdnB0ciAtZmFkZHJlc3Mtc2FuaXRpemVyIiB3aXRoIG1hc2sgXGMgTmVlZHNVYnNhblJ0CisgIC8vLyAiLWZzYW5pdGl6ZT10aHJlYWQsdnB0ciAtZnNhbml0aXplPWFkZHJlc3MiIHdpdGggbWFzayBcYyBOZWVkc1Vic2FuUnQKICAgLy8vIHdvdWxkIHByb2R1Y2UgIi1mc2FuaXRpemU9dnB0ciIuCiAgIHN0YXRpYyBzdGQ6OnN0cmluZyBsYXN0QXJndW1lbnRGb3JLaW5kKGNvbnN0IERyaXZlciAmRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvVG9vbENoYWluLmggYi9pbmNsdWRlL2NsYW5nL0RyaXZlci9Ub29sQ2hhaW4uaAppbmRleCA4NGUwYjU1Li45NTMyMjljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9Ub29sQ2hhaW4uaAorKysgYi9pbmNsdWRlL2NsYW5nL0RyaXZlci9Ub29sQ2hhaW4uaApAQCAtMTEsMTIgKzExLDEzIEBACiAjZGVmaW5lIENMQU5HX0RSSVZFUl9UT09MQ0hBSU5fSF8KIAogI2luY2x1ZGUgImNsYW5nL0RyaXZlci9BY3Rpb24uaCIKKyNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvTXVsdGlsaWIuaCIKICNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvVHlwZXMuaCIKICNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvVXRpbC5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdGguaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgbGx2bSB7CkBAIC02NSwxNyArNjYsMTkgQEAKICAgLy8vIHByb2dyYW1zLgogICBwYXRoX2xpc3QgUHJvZ3JhbVBhdGhzOwogCi0gIG11dGFibGUgT3duaW5nUHRyPFRvb2w+IENsYW5nOwotICBtdXRhYmxlIE93bmluZ1B0cjxUb29sPiBBc3NlbWJsZTsKLSAgbXV0YWJsZSBPd25pbmdQdHI8VG9vbD4gTGluazsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8VG9vbD4gQ2xhbmc7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPFRvb2w+IEFzc2VtYmxlOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxUb29sPiBMaW5rOwogICBUb29sICpnZXRDbGFuZygpIGNvbnN0OwogICBUb29sICpnZXRBc3NlbWJsZSgpIGNvbnN0OwogICBUb29sICpnZXRMaW5rKCkgY29uc3Q7CiAgIFRvb2wgKmdldENsYW5nQXMoKSBjb25zdDsKIAotICBtdXRhYmxlIE93bmluZ1B0cjxTYW5pdGl6ZXJBcmdzPiBTYW5pdGl6ZXJBcmd1bWVudHM7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPFNhbml0aXplckFyZ3M+IFNhbml0aXplckFyZ3VtZW50czsKIAogcHJvdGVjdGVkOgorICBNdWx0aWxpYlNldCBNdWx0aWxpYnM7CisKICAgVG9vbENoYWluKGNvbnN0IERyaXZlciAmRCwgY29uc3QgbGx2bTo6VHJpcGxlICZULAogICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKTsKIApAQCAtMTEzLDYgKzExNiw5IEBACiAgIFN0cmluZ1JlZiBnZXRQbGF0Zm9ybSgpIGNvbnN0IHsgcmV0dXJuIFRyaXBsZS5nZXRWZW5kb3JOYW1lKCk7IH0KICAgU3RyaW5nUmVmIGdldE9TKCkgY29uc3QgeyByZXR1cm4gVHJpcGxlLmdldE9TTmFtZSgpOyB9CiAKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIHRvb2xjaGFpbiBpcyB0YXJnZXRpbmcgYSBub24tbmF0aXZlIGFyY2hpdGVjdHVyZS4KKyAgYm9vbCBpc0Nyb3NzQ29tcGlsaW5nKCkgY29uc3Q7CisKICAgLy8vIFxicmllZiBQcm92aWRlIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSBuYW1lIChhcyBleHBlY3RlZCBieSAtYXJjaCkgZm9yCiAgIC8vLyB0aGlzIHRvb2xjaGFpbi4gTm90ZSB0CiAgIHN0ZDo6c3RyaW5nIGdldERlZmF1bHRVbml2ZXJzYWxBcmNoTmFtZSgpIGNvbnN0OwpAQCAtMTI3LDYgKzEzMyw4IEBACiAgIHBhdGhfbGlzdCAmZ2V0UHJvZ3JhbVBhdGhzKCkgeyByZXR1cm4gUHJvZ3JhbVBhdGhzOyB9CiAgIGNvbnN0IHBhdGhfbGlzdCAmZ2V0UHJvZ3JhbVBhdGhzKCkgY29uc3QgeyByZXR1cm4gUHJvZ3JhbVBhdGhzOyB9CiAKKyAgY29uc3QgTXVsdGlsaWJTZXQgJmdldE11bHRpbGlicygpIGNvbnN0IHsgcmV0dXJuIE11bHRpbGliczsgfQorCiAgIGNvbnN0IFNhbml0aXplckFyZ3MmIGdldFNhbml0aXplckFyZ3MoKSBjb25zdDsKIAogICAvLyBUb29sIGFjY2Vzcy4KQEAgLTE5Myw3ICsyMDEsNyBAQAogICB2aXJ0dWFsIGJvb2wgVXNlT2JqQ01peGVkRGlzcGF0Y2goKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCiAgIC8vLyBHZXREZWZhdWx0U3RhY2tQcm90ZWN0b3JMZXZlbCAtIEdldCB0aGUgZGVmYXVsdCBzdGFjayBwcm90ZWN0b3IgbGV2ZWwgZm9yCi0gIC8vLyB0aGlzIHRvb2wgY2hhaW4gKDA9b2ZmLCAxPW9uLCAyPWFsbCkuCisgIC8vLyB0aGlzIHRvb2wgY2hhaW4gKDA9b2ZmLCAxPW9uLCAyPXN0cm9uZywgMz1hbGwpLgogICB2aXJ0dWFsIHVuc2lnbmVkIEdldERlZmF1bHRTdGFja1Byb3RlY3RvckxldmVsKGJvb2wgS2VybmVsT3JLZXh0KSBjb25zdCB7CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTI3NSw2ICsyODMsOSBAQAogICB2aXJ0dWFsIHZvaWQgYWRkQ2xhbmdUYXJnZXRPcHRpb25zKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmRHJpdmVyQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0OwogCisgIC8vLyBcYnJpZWYgQWRkIHdhcm5pbmcgb3B0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcGFzc2VkIHRvIGNjMSBmb3IgdGhpcyB0YXJnZXQuCisgIHZpcnR1YWwgdm9pZCBhZGRDbGFuZ1dhcm5pbmdPcHRpb25zKGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncykgY29uc3Q7CisKICAgLy8gR2V0UnVudGltZUxpYlR5cGUgLSBEZXRlcm1pbmUgdGhlIHJ1bnRpbWUgbGlicmFyeSB0eXBlIHRvIHVzZSB3aXRoIHRoZQogICAvLyBnaXZlbiBjb21waWxhdGlvbiBhcmd1bWVudHMuCiAgIHZpcnR1YWwgUnVudGltZUxpYlR5cGUKQEAgLTMwMyw3ICszMTQsNyBAQAogICAvLy8gQWRkRmFzdE1hdGhSdW50aW1lSWZBdmFpbGFibGUgLSBJZiBhIHJ1bnRpbWUgbGlicmFyeSBleGlzdHMgdGhhdCBzZXRzCiAgIC8vLyBnbG9iYWwgZmxhZ3MgZm9yIHVuc2FmZSBmbG9hdGluZyBwb2ludCBtYXRoLCBhZGQgaXQgYW5kIHJldHVybiB0cnVlLgogICAvLy8KLSAgLy8vIFRoaXMgY2hlY2tzIGZvciBwcmVzZW5jZSBvZiB0aGUgLWZmYXN0LW1hdGggb3IgLWZ1bnNhZmUtbWF0aCBmbGFncy4KKyAgLy8vIFRoaXMgY2hlY2tzIGZvciBwcmVzZW5jZSBvZiB0aGUgLU9mYXN0LCAtZmZhc3QtbWF0aCBvciAtZnVuc2FmZS1tYXRoIGZsYWdzLgogICB2aXJ0dWFsIGJvb2wKICAgQWRkRmFzdE1hdGhSdW50aW1lSWZBdmFpbGFibGUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9FZGl0L0VkaXRlZFNvdXJjZS5oIGIvaW5jbHVkZS9jbGFuZy9FZGl0L0VkaXRlZFNvdXJjZS5oCmluZGV4IDNhZDVhNmIuLmY5NWI3OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRWRpdC9FZGl0ZWRTb3VyY2UuaAorKysgYi9pbmNsdWRlL2NsYW5nL0VkaXQvRWRpdGVkU291cmNlLmgKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgRkNvbW1pdEluU3lzdGVtSGVhZGVyID0gdHJ1ZSkKICAgICA6IFNvdXJjZU1ncihTTSksIExhbmdPcHRzKExhbmdPcHRzKSwgUFBSZWMoUFBSZWMpLAogICAgICAgRm9yY2VDb21taXRJblN5c3RlbUhlYWRlcihGQ29tbWl0SW5TeXN0ZW1IZWFkZXIpLAotICAgICAgU3RyQWxsb2MoLypzaXplPSovNTEyKSB7IH0KKyAgICAgIFN0ckFsbG9jKCkgeyB9CiAKICAgY29uc3QgU291cmNlTWFuYWdlciAmZ2V0U291cmNlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZU1ncjsgfQogICBjb25zdCBMYW5nT3B0aW9ucyAmZ2V0TGFuZ09wdHMoKSBjb25zdCB7IHJldHVybiBMYW5nT3B0czsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9FZGl0L0ZpbGVPZmZzZXQuaCBiL2luY2x1ZGUvY2xhbmcvRWRpdC9GaWxlT2Zmc2V0LmgKaW5kZXggNjc1YWQxOC4uMGMxZTcyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9FZGl0L0ZpbGVPZmZzZXQuaAorKysgYi9pbmNsdWRlL2NsYW5nL0VkaXQvRmlsZU9mZnNldC5oCkBAIC00MSwyMCArNDEsMTYgQEAKICAgICByZXR1cm4gIShMSFMgPT0gUkhTKTsKICAgfQogICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoRmlsZU9mZnNldCBMSFMsIEZpbGVPZmZzZXQgUkhTKSB7Ci0gICAgaWYgKExIUy5GSUQgIT0gUkhTLkZJRCkKLSAgICAgIHJldHVybiBMSFMuRklEIDwgUkhTLkZJRDsKLSAgICByZXR1cm4gTEhTLk9mZnMgPCBSSFMuT2ZmczsKKyAgICByZXR1cm4gc3RkOjp0aWUoTEhTLkZJRCwgTEhTLk9mZnMpIDwgc3RkOjp0aWUoUkhTLkZJRCwgUkhTLk9mZnMpOwogICB9CiAgIGZyaWVuZCBib29sIG9wZXJhdG9yPihGaWxlT2Zmc2V0IExIUywgRmlsZU9mZnNldCBSSFMpIHsKLSAgICBpZiAoTEhTLkZJRCAhPSBSSFMuRklEKQotICAgICAgcmV0dXJuIExIUy5GSUQgPiBSSFMuRklEOwotICAgIHJldHVybiBMSFMuT2ZmcyA+IFJIUy5PZmZzOworICAgIHJldHVybiBSSFMgPCBMSFM7CiAgIH0KICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShGaWxlT2Zmc2V0IExIUywgRmlsZU9mZnNldCBSSFMpIHsKLSAgICByZXR1cm4gTEhTID4gUkhTIHx8IExIUyA9PSBSSFM7CisgICAgcmV0dXJuICEoTEhTIDwgUkhTKTsKICAgfQogICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KEZpbGVPZmZzZXQgTEhTLCBGaWxlT2Zmc2V0IFJIUykgewotICAgIHJldHVybiBMSFMgPCBSSFMgfHwgTEhTID09IFJIUzsKKyAgICByZXR1cm4gIShSSFMgPCBMSFMpOwogICB9CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Zvcm1hdC9Gb3JtYXQuaCBiL2luY2x1ZGUvY2xhbmcvRm9ybWF0L0Zvcm1hdC5oCmluZGV4IDBmMjc0NjcuLmNkZWQ5MTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRm9ybWF0L0Zvcm1hdC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvRm9ybWF0L0Zvcm1hdC5oCkBAIC0zMCwxNiArMzAsMzcgQEAKIC8vLyBcYnJpZWYgVGhlIFxjIEZvcm1hdFN0eWxlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBmb3JtYXR0aW5nIHRvIGZvbGxvdwogLy8vIHNwZWNpZmljIGd1aWRlbGluZXMuCiBzdHJ1Y3QgRm9ybWF0U3R5bGUgeworICAvLy8gXGJyaWVmIFN1cHBvcnRlZCBsYW5ndWFnZXMuIFdoZW4gc3RvcmVkIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLCBzcGVjaWZpZXMKKyAgLy8vIHRoZSBsYW5ndWFnZSwgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB0YXJnZXRzLiBXaGVuIHBhc3NlZCB0byB0aGUKKyAgLy8vIHJlZm9ybWF0KCkgZnVuY3Rpb24sIGVuYWJsZXMgc3ludGF4IGZlYXR1cmVzIHNwZWNpZmljIHRvIHRoZSBsYW5ndWFnZS4KKyAgZW51bSBMYW5ndWFnZUtpbmQgeworICAgIC8vLyBEbyBub3QgdXNlLgorICAgIExLX05vbmUsCisgICAgLy8vIFNob3VsZCBiZSB1c2VkIGZvciBDLCBDKyssIE9iamVjdGl2ZUMsIE9iamVjdGl2ZUMrKy4KKyAgICBMS19DcHAsCisgICAgLy8vIFNob3VsZCBiZSB1c2VkIGZvciBKYXZhU2NyaXB0LgorICAgIExLX0phdmFTY3JpcHQsCisgICAgLy8vIFNob3VsZCBiZSB1c2VkIGZvciBQcm90b2NvbCBCdWZmZXJzCisgICAgLy8vIChodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLykuCisgICAgTEtfUHJvdG8KKyAgfTsKKworICAvLy8gXGJyaWVmIExhbmd1YWdlLCB0aGlzIGZvcm1hdCBzdHlsZSBpcyB0YXJnZXRlZCBhdC4KKyAgTGFuZ3VhZ2VLaW5kIExhbmd1YWdlOworCiAgIC8vLyBcYnJpZWYgVGhlIGNvbHVtbiBsaW1pdC4KICAgLy8vCiAgIC8vLyBBIGNvbHVtbiBsaW1pdCBvZiBcYyAwIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gY29sdW1uIGxpbWl0LiBJbiB0aGlzIGNhc2UsCiAgIC8vLyBjbGFuZy1mb3JtYXQgd2lsbCByZXNwZWN0IHRoZSBpbnB1dCdzIGxpbmUgYnJlYWtpbmcgZGVjaXNpb25zIHdpdGhpbgotICAvLy8gc3RhdGVtZW50cy4KKyAgLy8vIHN0YXRlbWVudHMgdW5sZXNzIHRoZXkgY29udHJhZGljdCBvdGhlciBydWxlcy4KICAgdW5zaWduZWQgQ29sdW1uTGltaXQ7CiAKICAgLy8vIFxicmllZiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29uc2VjdXRpdmUgZW1wdHkgbGluZXMgdG8ga2VlcC4KICAgdW5zaWduZWQgTWF4RW1wdHlMaW5lc1RvS2VlcDsKIAorICAvLy8gXGJyaWVmIElmIHRydWUsIGVtcHR5IGxpbmVzIGF0IHRoZSBzdGFydCBvZiBibG9ja3MgYXJlIGtlcHQuCisgIGJvb2wgS2VlcEVtcHR5TGluZXNBdFRoZVN0YXJ0T2ZCbG9ja3M7CisKICAgLy8vIFxicmllZiBUaGUgcGVuYWx0eSBmb3IgZWFjaCBsaW5lIGJyZWFrIGludHJvZHVjZWQgaW5zaWRlIGEgY29tbWVudC4KICAgdW5zaWduZWQgUGVuYWx0eUJyZWFrQ29tbWVudDsKIApAQCAtNTgsNyArNzksOCBAQAogICAvLy8gXGJyaWVmIFNldCB3aGV0aGVyICYgYW5kICogYmluZCB0byB0aGUgdHlwZSBhcyBvcHBvc2VkIHRvIHRoZSB2YXJpYWJsZS4KICAgYm9vbCBQb2ludGVyQmluZHNUb1R5cGU7CiAKLSAgLy8vIFxicmllZiBJZiBcYyB0cnVlLCBhbmFseXplIHRoZSBmb3JtYXR0ZWQgZmlsZSBmb3IgdGhlIG1vc3QgY29tbW9uIGJpbmRpbmcuCisgIC8vLyBcYnJpZWYgSWYgXGMgdHJ1ZSwgYW5hbHl6ZSB0aGUgZm9ybWF0dGVkIGZpbGUgZm9yIHRoZSBtb3N0IGNvbW1vbiBiaW5kaW5nCisgIC8vLyBhbmQgdXNlIFxjIFBvaW50ZXJCaW5kc1RvVHlwZSBvbmx5IGFzIGZhbGxiYWNrLgogICBib29sIERlcml2ZVBvaW50ZXJCaW5kaW5nOwogCiAgIC8vLyBcYnJpZWYgVGhlIGV4dHJhIGluZGVudCBvciBvdXRkZW50IG9mIGFjY2VzcyBtb2RpZmllcnMsIGUuZy4gXGMgcHVibGljOi4KQEAgLTE0MSw2ICsxNjMsMTQgQEAKICAgLy8vIHNpbmdsZSBsaW5lLgogICBib29sIEFsbG93U2hvcnRMb29wc09uQVNpbmdsZUxpbmU7CiAKKyAgLy8vIFxicmllZiBJZiBcYyB0cnVlLCA8dHQ+aW50IGYoKSB7IHJldHVybiAwOyB9PC90dD4gY2FuIGJlIHB1dCBvbiBhIHNpbmdsZQorICAvLy8gbGluZS4KKyAgYm9vbCBBbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZTsKKworICAvLy8gXGJyaWVmIEFkZCBhIHNwYWNlIGFmdGVyIFxjIEBwcm9wZXJ0eSBpbiBPYmplY3RpdmUtQywgaS5lLiB1c2UKKyAgLy8vIDx0dD5AcHJvcGVydHkgKHJlYWRvbmx5KTwvdHQ+IGluc3RlYWQgb2YgPHR0PkBwcm9wZXJ0eShyZWFkb25seSk8L3R0Pi4KKyAgYm9vbCBPYmpDU3BhY2VBZnRlclByb3BlcnR5OworCiAgIC8vLyBcYnJpZWYgQWRkIGEgc3BhY2UgaW4gZnJvbnQgb2YgYW4gT2JqZWN0aXZlLUMgcHJvdG9jb2wgbGlzdCwgaS5lLiB1c2UKICAgLy8vIDx0dD5Gb28gPFByb3RvY29sPjwvdHQ+IGluc3RlYWQgb2YgXGMgRm9vPFByb3RvY29sPi4KICAgYm9vbCBPYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3Q7CkBAIC0xOTksNyArMjI5LDExIEBACiAgICAgLy8vIExpa2UgXGMgQXR0YWNoLCBidXQgYnJlYWsgYmVmb3JlIGZ1bmN0aW9uIGRlZmluaXRpb25zLgogICAgIEJTX1N0cm91c3RydXAsCiAgICAgLy8vIEFsd2F5cyBicmVhayBiZWZvcmUgYnJhY2VzLgotICAgIEJTX0FsbG1hbgorICAgIEJTX0FsbG1hbiwKKyAgICAvLy8gQWx3YXlzIGJyZWFrIGJlZm9yZSBicmFjZXMgYW5kIGFkZCBhbiBleHRyYSBsZXZlbCBvZiBpbmRlbnRhdGlvbiB0bworICAgIC8vLyBicmFjZXMgb2YgY29udHJvbCBzdGF0ZW1lbnRzLCBub3QgdG8gdGhvc2Ugb2YgY2xhc3MsIGZ1bmN0aW9uCisgICAgLy8vIG9yIG90aGVyIGRlZmluaXRpb25zLgorICAgIEJTX0dOVQogICB9OwogCiAgIC8vLyBcYnJpZWYgVGhlIGJyYWNlIGJyZWFraW5nIHN0eWxlIHRvIHVzZS4KQEAgLTIzMSwxNSArMjY1LDMyIEBACiAgIC8vLyB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0cwogICBib29sIFNwYWNlc0luQW5nbGVzOwogCi0gIC8vLyBcYnJpZWYgSWYgXGMgZmFsc2UsIHNwYWNlcyBtYXkgYmUgaW5zZXJ0ZWQgaW50byAnKCknLgorICAvLy8gXGJyaWVmIElmIFxjIHRydWUsIHNwYWNlcyBtYXkgYmUgaW5zZXJ0ZWQgaW50byAnKCknLgogICBib29sIFNwYWNlSW5FbXB0eVBhcmVudGhlc2VzOwogCi0gIC8vLyBcYnJpZWYgSWYgXGMgZmFsc2UsIHNwYWNlcyBtYXkgYmUgaW5zZXJ0ZWQgaW50byBDIHN0eWxlIGNhc3RzLgorICAvLy8gXGJyaWVmIElmIFxjIHRydWUsIHNwYWNlcyBhcmUgaW5zZXJ0ZWQgaW5zaWRlIGNvbnRhaW5lciBsaXRlcmFscyAoZS5nLgorICAvLy8gT2JqQyBhbmQgSmF2YXNjcmlwdCBhcnJheSBhbmQgZGljdCBsaXRlcmFscykuCisgIGJvb2wgU3BhY2VzSW5Db250YWluZXJMaXRlcmFsczsKKworICAvLy8gXGJyaWVmIElmIFxjIHRydWUsIHNwYWNlcyBtYXkgYmUgaW5zZXJ0ZWQgaW50byBDIHN0eWxlIGNhc3RzLgogICBib29sIFNwYWNlc0luQ1N0eWxlQ2FzdFBhcmVudGhlc2VzOwogCi0gIC8vLyBcYnJpZWYgSWYgXGMgdHJ1ZSwgc3BhY2VzIHdpbGwgYmUgaW5zZXJ0ZWQgYmV0d2VlbiAnZm9yJy8naWYnLyd3aGlsZScvLi4uCi0gIC8vLyBhbmQgJygnLgotICBib29sIFNwYWNlQWZ0ZXJDb250cm9sU3RhdGVtZW50S2V5d29yZDsKKyAgLy8vIFxicmllZiBEaWZmZXJlbnQgd2F5cyB0byBwdXQgYSBzcGFjZSBiZWZvcmUgb3BlbmluZyBwYXJlbnRoZXNlcy4KKyAgZW51bSBTcGFjZUJlZm9yZVBhcmVuc09wdGlvbnMgeworICAgIC8vLyBOZXZlciBwdXQgYSBzcGFjZSBiZWZvcmUgb3BlbmluZyBwYXJlbnRoZXNlcy4KKyAgICBTQlBPX05ldmVyLAorICAgIC8vLyBQdXQgYSBzcGFjZSBiZWZvcmUgb3BlbmluZyBwYXJlbnRoZXNlcyBvbmx5IGFmdGVyIGNvbnRyb2wgc3RhdGVtZW50CisgICAgLy8vIGtleXdvcmRzICg8dHQ+Zm9yL2lmL3doaWxlLi4uPC90dD4pLgorICAgIFNCUE9fQ29udHJvbFN0YXRlbWVudHMsCisgICAgLy8vIEFsd2F5cyBwdXQgYSBzcGFjZSBiZWZvcmUgb3BlbmluZyBwYXJlbnRoZXNlcywgZXhjZXB0IHdoZW4gaXQncworICAgIC8vLyBwcm9oaWJpdGVkIGJ5IHRoZSBzeW50YXggcnVsZXMgKGluIGZ1bmN0aW9uLWxpa2UgbWFjcm8gZGVmaW5pdGlvbnMpIG9yCisgICAgLy8vIHdoZW4gZGV0ZXJtaW5lZCBieSBvdGhlciBzdHlsZSBydWxlcyAoYWZ0ZXIgdW5hcnkgb3BlcmF0b3JzLCBvcGVuaW5nCisgICAgLy8vIHBhcmVudGhlc2VzLCBldGMuKQorICAgIFNCUE9fQWx3YXlzCisgIH07CisKKyAgLy8vIFxicmllZiBEZWZpbmVzIGluIHdoaWNoIGNhc2VzIHRvIHB1dCBhIHNwYWNlIGJlZm9yZSBvcGVuaW5nIHBhcmVudGhlc2VzLgorICBTcGFjZUJlZm9yZVBhcmVuc09wdGlvbnMgU3BhY2VCZWZvcmVQYXJlbnM7CiAKICAgLy8vIFxicmllZiBJZiBcYyBmYWxzZSwgc3BhY2VzIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgYXNzaWdubWVudCBvcGVyYXRvcnMuCiAgIGJvb2wgU3BhY2VCZWZvcmVBc3NpZ25tZW50T3BlcmF0b3JzOwpAQCAtMjQ3LDYgKzI5OCwyMiBAQAogICAvLy8gXGJyaWVmIEluZGVudCB3aWR0aCBmb3IgbGluZSBjb250aW51YXRpb25zLgogICB1bnNpZ25lZCBDb250aW51YXRpb25JbmRlbnRXaWR0aDsKIAorICAvLy8gXGJyaWVmIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgZGVzY3JpYmVzIGNvbW1lbnRzIHdpdGggc3BlY2lhbCBtZWFuaW5nLAorICAvLy8gd2hpY2ggc2hvdWxkIG5vdCBiZSBzcGxpdCBpbnRvIGxpbmVzIG9yIG90aGVyd2lzZSBjaGFuZ2VkLgorICBzdGQ6OnN0cmluZyBDb21tZW50UHJhZ21hczsKKworICAvLy8gXGJyaWVmIEEgdmVjdG9yIG9mIG1hY3JvcyB0aGF0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBmb3JlYWNoIGxvb3BzCisgIC8vLyBpbnN0ZWFkIG9mIGFzIGZ1bmN0aW9uIGNhbGxzLgorICAvLy8KKyAgLy8vIFRoZXNlIGFyZSBleHBlY3RlZCB0byBiZSBtYWNyb3Mgb2YgdGhlIGZvcm06CisgIC8vLyBcY29kZQorICAvLy8gRk9SRUFDSCg8dmFyaWFibGUtZGVjbGFyYXRpb24+LCAuLi4pCisgIC8vLyAgIDxsb29wLWJvZHk+CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlOiBCT09TVF9GT1JFQUNILgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRm9yRWFjaE1hY3JvczsKKwogICBib29sIG9wZXJhdG9yPT0oY29uc3QgRm9ybWF0U3R5bGUgJlIpIGNvbnN0IHsKICAgICByZXR1cm4gQWNjZXNzTW9kaWZpZXJPZmZzZXQgPT0gUi5BY2Nlc3NNb2RpZmllck9mZnNldCAmJgogICAgICAgICAgICBDb25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGggPT0KQEAgLTI1NSw2ICszMjIsOCBAQAogICAgICAgICAgICBBbGlnblRyYWlsaW5nQ29tbWVudHMgPT0gUi5BbGlnblRyYWlsaW5nQ29tbWVudHMgJiYKICAgICAgICAgICAgQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmUgPT0KICAgICAgICAgICAgICAgIFIuQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmUgJiYKKyAgICAgICAgICAgQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmUgPT0KKyAgICAgICAgICAgICAgIFIuQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmUgJiYKICAgICAgICAgICAgQWxsb3dTaG9ydElmU3RhdGVtZW50c09uQVNpbmdsZUxpbmUgPT0KICAgICAgICAgICAgICAgIFIuQWxsb3dTaG9ydElmU3RhdGVtZW50c09uQVNpbmdsZUxpbmUgJiYKICAgICAgICAgICAgQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZSA9PSBSLkFsbG93U2hvcnRMb29wc09uQVNpbmdsZUxpbmUgJiYKQEAgLTI3Nyw5ICszNDYsMTIgQEAKICAgICAgICAgICAgSW5kZW50Q2FzZUxhYmVscyA9PSBSLkluZGVudENhc2VMYWJlbHMgJiYKICAgICAgICAgICAgSW5kZW50RnVuY3Rpb25EZWNsYXJhdGlvbkFmdGVyVHlwZSA9PQogICAgICAgICAgICAgICAgUi5JbmRlbnRGdW5jdGlvbkRlY2xhcmF0aW9uQWZ0ZXJUeXBlICYmCi0gICAgICAgICAgIEluZGVudFdpZHRoID09IFIuSW5kZW50V2lkdGggJiYKKyAgICAgICAgICAgSW5kZW50V2lkdGggPT0gUi5JbmRlbnRXaWR0aCAmJiBMYW5ndWFnZSA9PSBSLkxhbmd1YWdlICYmCiAgICAgICAgICAgIE1heEVtcHR5TGluZXNUb0tlZXAgPT0gUi5NYXhFbXB0eUxpbmVzVG9LZWVwICYmCisgICAgICAgICAgIEtlZXBFbXB0eUxpbmVzQXRUaGVTdGFydE9mQmxvY2tzID09CisgICAgICAgICAgICAgICBSLktlZXBFbXB0eUxpbmVzQXRUaGVTdGFydE9mQmxvY2tzICYmCiAgICAgICAgICAgIE5hbWVzcGFjZUluZGVudGF0aW9uID09IFIuTmFtZXNwYWNlSW5kZW50YXRpb24gJiYKKyAgICAgICAgICAgT2JqQ1NwYWNlQWZ0ZXJQcm9wZXJ0eSA9PSBSLk9iakNTcGFjZUFmdGVyUHJvcGVydHkgJiYKICAgICAgICAgICAgT2JqQ1NwYWNlQmVmb3JlUHJvdG9jb2xMaXN0ID09IFIuT2JqQ1NwYWNlQmVmb3JlUHJvdG9jb2xMaXN0ICYmCiAgICAgICAgICAgIFBlbmFsdHlCcmVha0NvbW1lbnQgPT0gUi5QZW5hbHR5QnJlYWtDb21tZW50ICYmCiAgICAgICAgICAgIFBlbmFsdHlCcmVha0ZpcnN0TGVzc0xlc3MgPT0gUi5QZW5hbHR5QnJlYWtGaXJzdExlc3NMZXNzICYmCkBAIC0yOTMsMTEgKzM2NSwxMyBAQAogICAgICAgICAgICBVc2VUYWIgPT0gUi5Vc2VUYWIgJiYgU3BhY2VzSW5QYXJlbnRoZXNlcyA9PSBSLlNwYWNlc0luUGFyZW50aGVzZXMgJiYKICAgICAgICAgICAgU3BhY2VzSW5BbmdsZXMgPT0gUi5TcGFjZXNJbkFuZ2xlcyAmJgogICAgICAgICAgICBTcGFjZUluRW1wdHlQYXJlbnRoZXNlcyA9PSBSLlNwYWNlSW5FbXB0eVBhcmVudGhlc2VzICYmCisgICAgICAgICAgIFNwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHMgPT0gUi5TcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzICYmCiAgICAgICAgICAgIFNwYWNlc0luQ1N0eWxlQ2FzdFBhcmVudGhlc2VzID09IFIuU3BhY2VzSW5DU3R5bGVDYXN0UGFyZW50aGVzZXMgJiYKLSAgICAgICAgICAgU3BhY2VBZnRlckNvbnRyb2xTdGF0ZW1lbnRLZXl3b3JkID09Ci0gICAgICAgICAgICAgICBSLlNwYWNlQWZ0ZXJDb250cm9sU3RhdGVtZW50S2V5d29yZCAmJgorICAgICAgICAgICBTcGFjZUJlZm9yZVBhcmVucyA9PSBSLlNwYWNlQmVmb3JlUGFyZW5zICYmCiAgICAgICAgICAgIFNwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9ycyA9PSBSLlNwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9ycyAmJgotICAgICAgICAgICBDb250aW51YXRpb25JbmRlbnRXaWR0aCA9PSBSLkNvbnRpbnVhdGlvbkluZGVudFdpZHRoOworICAgICAgICAgICBDb250aW51YXRpb25JbmRlbnRXaWR0aCA9PSBSLkNvbnRpbnVhdGlvbkluZGVudFdpZHRoICYmCisgICAgICAgICAgIENvbW1lbnRQcmFnbWFzID09IFIuQ29tbWVudFByYWdtYXMgJiYKKyAgICAgICAgICAgRm9yRWFjaE1hY3JvcyA9PSBSLkZvckVhY2hNYWNyb3M7CiAgIH0KIH07CiAKQEAgLTMwNSwxMyArMzc5LDE1IEBACiAvLy8gaHR0cDovL2xsdm0ub3JnL2RvY3MvQ29kaW5nU3RhbmRhcmRzLmh0bWwuCiBGb3JtYXRTdHlsZSBnZXRMTFZNU3R5bGUoKTsKIAotLy8vIFxicmllZiBSZXR1cm5zIGEgZm9ybWF0IHN0eWxlIGNvbXBseWluZyB3aXRoIEdvb2dsZSdzIEMrKyBzdHlsZSBndWlkZToKKy8vLyBcYnJpZWYgUmV0dXJucyBhIGZvcm1hdCBzdHlsZSBjb21wbHlpbmcgd2l0aCBvbmUgb2YgR29vZ2xlJ3Mgc3R5bGUgZ3VpZGVzOgogLy8vIGh0dHA6Ly9nb29nbGUtc3R5bGVndWlkZS5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvY3BwZ3VpZGUueG1sLgotRm9ybWF0U3R5bGUgZ2V0R29vZ2xlU3R5bGUoKTsKKy8vLyBodHRwOi8vZ29vZ2xlLXN0eWxlZ3VpZGUuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL2phdmFzY3JpcHRndWlkZS54bWwuCisvLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3N0eWxlLgorRm9ybWF0U3R5bGUgZ2V0R29vZ2xlU3R5bGUoRm9ybWF0U3R5bGU6Okxhbmd1YWdlS2luZCBMYW5ndWFnZSk7CiAKIC8vLyBcYnJpZWYgUmV0dXJucyBhIGZvcm1hdCBzdHlsZSBjb21wbHlpbmcgd2l0aCBDaHJvbWl1bSdzIHN0eWxlIGd1aWRlOgogLy8vIGh0dHA6Ly93d3cuY2hyb21pdW0ub3JnL2RldmVsb3BlcnMvY29kaW5nLXN0eWxlLgotRm9ybWF0U3R5bGUgZ2V0Q2hyb21pdW1TdHlsZSgpOworRm9ybWF0U3R5bGUgZ2V0Q2hyb21pdW1TdHlsZShGb3JtYXRTdHlsZTo6TGFuZ3VhZ2VLaW5kIExhbmd1YWdlKTsKIAogLy8vIFxicmllZiBSZXR1cm5zIGEgZm9ybWF0IHN0eWxlIGNvbXBseWluZyB3aXRoIE1vemlsbGEncyBzdHlsZSBndWlkZToKIC8vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0RldmVsb3Blcl9HdWlkZS9Db2RpbmdfU3R5bGUuCkBAIC0zMjEsMTUgKzM5NywyNiBAQAogLy8vIGh0dHA6Ly93d3cud2Via2l0Lm9yZy9jb2RpbmcvY29kaW5nLXN0eWxlLmh0bWwKIEZvcm1hdFN0eWxlIGdldFdlYktpdFN0eWxlKCk7CiAKLS8vLyBcYnJpZWYgR2V0cyBhIHByZWRlZmluZWQgc3R5bGUgYnkgbmFtZS4KKy8vLyBcYnJpZWYgUmV0dXJucyBhIGZvcm1hdCBzdHlsZSBjb21wbHlpbmcgd2l0aCBHTlUgQ29kaW5nIFN0YW5kYXJkczoKKy8vLyBodHRwOi8vd3d3LmdudS5vcmcvcHJlcC9zdGFuZGFyZHMvc3RhbmRhcmRzLmh0bWwKK0Zvcm1hdFN0eWxlIGdldEdOVVN0eWxlKCk7CisKKy8vLyBcYnJpZWYgR2V0cyBhIHByZWRlZmluZWQgc3R5bGUgZm9yIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UgYnkgbmFtZS4KIC8vLwogLy8vIEN1cnJlbnRseSBzdXBwb3J0ZWQgbmFtZXM6IExMVk0sIEdvb2dsZSwgQ2hyb21pdW0sIE1vemlsbGEuIE5hbWVzIGFyZQogLy8vIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmVseS4KIC8vLwogLy8vIFJldHVybnMgXGMgdHJ1ZSBpZiB0aGUgU3R5bGUgaGFzIGJlZW4gc2V0LgotYm9vbCBnZXRQcmVkZWZpbmVkU3R5bGUoU3RyaW5nUmVmIE5hbWUsIEZvcm1hdFN0eWxlICpTdHlsZSk7Citib29sIGdldFByZWRlZmluZWRTdHlsZShTdHJpbmdSZWYgTmFtZSwgRm9ybWF0U3R5bGU6Okxhbmd1YWdlS2luZCBMYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFN0eWxlICpTdHlsZSk7CiAKIC8vLyBcYnJpZWYgUGFyc2UgY29uZmlndXJhdGlvbiBmcm9tIFlBTUwtZm9ybWF0dGVkIHRleHQuCisvLy8KKy8vLyBTdHlsZS0+TGFuZ3VhZ2UgaXMgdXNlZCB0byBnZXQgdGhlIGJhc2Ugc3R5bGUsIGlmIHRoZSBcYyBCYXNlZE9uU3R5bGUKKy8vLyBvcHRpb24gaXMgcHJlc2VudC4KKy8vLworLy8vIFdoZW4gXGMgQmFzZWRPblN0eWxlIGlzIG5vdCBwcmVzZW50LCBvcHRpb25zIG5vdCBwcmVzZW50IGluIHRoZSBZQU1MCisvLy8gZG9jdW1lbnQsIGFyZSByZXRhaW5lZCBpbiBccCBTdHlsZS4KIGxsdm06OmVycm9yX2NvZGUgcGFyc2VDb25maWd1cmF0aW9uKFN0cmluZ1JlZiBUZXh0LCBGb3JtYXRTdHlsZSAqU3R5bGUpOwogCiAvLy8gXGJyaWVmIEdldHMgY29uZmlndXJhdGlvbiBpbiBhIFlBTUwgc3RyaW5nLgpAQCAtMzgxLDEwICs0NjgsMTMgQEAKIC8vLyBhYm92ZS4KIC8vLyBccGFyYW1baW5dIEZpbGVOYW1lIFBhdGggdG8gc3RhcnQgc2VhcmNoIGZvciAuY2xhbmctZm9ybWF0IGlmIFxjIFN0eWxlTmFtZQogLy8vID09ICJmaWxlIi4KKy8vLyBccGFyYW1baW5dIEZhbGxiYWNrU3R5bGUgVGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkIHN0eWxlIHVzZWQgdG8gZmFsbGJhY2sgdG8KKy8vLyBpbiBjYXNlIHRoZSBzdHlsZSBjYW4ndCBiZSBkZXRlcm1pbmVkIGZyb20gXHAgU3R5bGVOYW1lLgogLy8vCiAvLy8gXHJldHVybnMgRm9ybWF0U3R5bGUgYXMgc3BlY2lmaWVkIGJ5IFxjIFN0eWxlTmFtZS4gSWYgbm8gc3R5bGUgY291bGQgYmUKIC8vLyBkZXRlcm1pbmVkLCB0aGUgZGVmYXVsdCBpcyBMTFZNIFN0eWxlIChzZWUgZ2V0TExWTVN0eWxlKCkpLgotRm9ybWF0U3R5bGUgZ2V0U3R5bGUoU3RyaW5nUmVmIFN0eWxlTmFtZSwgU3RyaW5nUmVmIEZpbGVOYW1lKTsKK0Zvcm1hdFN0eWxlIGdldFN0eWxlKFN0cmluZ1JlZiBTdHlsZU5hbWUsIFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGYWxsYmFja1N0eWxlKTsKIAogfSAvLyBlbmQgbmFtZXNwYWNlIGZvcm1hdAogfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0FTVFVuaXQuaCBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQVNUVW5pdC5oCmluZGV4IDQzZDc3ZjAuLjNhMjZkZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQVNUVW5pdC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQVNUVW5pdC5oCkBAIC0yNywxMiArMjcsMTMgQEAKICNpbmNsdWRlICJjbGFuZy9TZW1hL0NvZGVDb21wbGV0ZUNvbnN1bWVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RCaXRDb2Rlcy5oIgogI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01ENS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCiAjaW5jbHVkZSA8Y2Fzc2VydD4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1dGlsaXR5PgpAQCAtNjMsMzMgKzY0LDUxIEBACiAvLy8gXGJyaWVmIFV0aWxpdHkgY2xhc3MgZm9yIGxvYWRpbmcgYSBBU1RDb250ZXh0IGZyb20gYW4gQVNUIGZpbGUuCiAvLy8KIGNsYXNzIEFTVFVuaXQgOiBwdWJsaWMgTW9kdWxlTG9hZGVyIHsKK3B1YmxpYzoKKyAgc3RydWN0IFN0YW5kYWxvbmVGaXhJdCB7CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gUmVtb3ZlUmFuZ2U7CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gSW5zZXJ0RnJvbVJhbmdlOworICAgIHN0ZDo6c3RyaW5nIENvZGVUb0luc2VydDsKKyAgICBib29sIEJlZm9yZVByZXZpb3VzSW5zZXJ0aW9uczsKKyAgfTsKKworICBzdHJ1Y3QgU3RhbmRhbG9uZURpYWdub3N0aWMgeworICAgIHVuc2lnbmVkIElEOworICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbDsKKyAgICBzdGQ6OnN0cmluZyBNZXNzYWdlOworICAgIHN0ZDo6c3RyaW5nIEZpbGVuYW1lOworICAgIHVuc2lnbmVkIExvY09mZnNldDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiA+IFJhbmdlczsKKyAgICBzdGQ6OnZlY3RvcjxTdGFuZGFsb25lRml4SXQ+IEZpeEl0czsKKyAgfTsKKwogcHJpdmF0ZToKICAgSW50cnVzaXZlUmVmQ250UHRyPExhbmdPcHRpb25zPiAgICAgICAgIExhbmdPcHRzOwogICBJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY3NFbmdpbmU+ICAgRGlhZ25vc3RpY3M7CiAgIEludHJ1c2l2ZVJlZkNudFB0cjxGaWxlTWFuYWdlcj4gICAgICAgICBGaWxlTWdyOwogICBJbnRydXNpdmVSZWZDbnRQdHI8U291cmNlTWFuYWdlcj4gICAgICAgU291cmNlTWdyOwotICBPd25pbmdQdHI8SGVhZGVyU2VhcmNoPiAgICAgICAgICAgICAgICAgSGVhZGVySW5mbzsKKyAgc3RkOjp1bmlxdWVfcHRyPEhlYWRlclNlYXJjaD4gICAgICAgICAgIEhlYWRlckluZm87CiAgIEludHJ1c2l2ZVJlZkNudFB0cjxUYXJnZXRJbmZvPiAgICAgICAgICBUYXJnZXQ7CiAgIEludHJ1c2l2ZVJlZkNudFB0cjxQcmVwcm9jZXNzb3I+ICAgICAgICBQUDsKICAgSW50cnVzaXZlUmVmQ250UHRyPEFTVENvbnRleHQ+ICAgICAgICAgIEN0eDsKICAgSW50cnVzaXZlUmVmQ250UHRyPFRhcmdldE9wdGlvbnM+ICAgICAgIFRhcmdldE9wdHM7CiAgIEludHJ1c2l2ZVJlZkNudFB0cjxIZWFkZXJTZWFyY2hPcHRpb25zPiBIU09wdHM7Ci0gIEFTVFJlYWRlciAqUmVhZGVyOworICBJbnRydXNpdmVSZWZDbnRQdHI8QVNUUmVhZGVyPiBSZWFkZXI7CiAgIGJvb2wgSGFkTW9kdWxlTG9hZGVyRmF0YWxGYWlsdXJlOwogCiAgIHN0cnVjdCBBU1RXcml0ZXJEYXRhOwotICBPd25pbmdQdHI8QVNUV3JpdGVyRGF0YT4gV3JpdGVyRGF0YTsKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVFdyaXRlckRhdGE+IFdyaXRlckRhdGE7CiAKICAgRmlsZVN5c3RlbU9wdGlvbnMgRmlsZVN5c3RlbU9wdHM7CiAKICAgLy8vIFxicmllZiBUaGUgQVNUIGNvbnN1bWVyIHRoYXQgcmVjZWl2ZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zbGF0aW9uCiAgIC8vLyB1bml0IGFzIGl0IHdhcyBwYXJzZWQgb3IgbG9hZGVkLgotICBPd25pbmdQdHI8QVNUQ29uc3VtZXI+IENvbnN1bWVyOwotICAKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDb25zdW1lcjsKKwogICAvLy8gXGJyaWVmIFRoZSBzZW1hbnRpYyBhbmFseXNpcyBvYmplY3QgdXNlZCB0byB0eXBlLWNoZWNrIHRoZSB0cmFuc2xhdGlvbgogICAvLy8gdW5pdC4KLSAgT3duaW5nUHRyPFNlbWE+IFRoZVNlbWE7Ci0gIAorICBzdGQ6OnVuaXF1ZV9wdHI8U2VtYT4gVGhlU2VtYTsKKwogICAvLy8gT3B0aW9uYWwgb3duZWQgaW52b2NhdGlvbiwganVzdCB1c2VkIHRvIG1ha2UgdGhlIGludm9jYXRpb24gdXNlZCBpbgogICAvLy8gTG9hZEZyb21Db21tYW5kTGluZSBhdmFpbGFibGUuCiAgIEludHJ1c2l2ZVJlZkNudFB0cjxDb21waWxlckludm9jYXRpb24+IEludm9jYXRpb247CkBAIC0xMzUsNyArMTU0LDcgQEAKICAgc3RkOjpzdHJpbmcgT3JpZ2luYWxTb3VyY2VGaWxlOwogCiAgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiBkaWFnbm9zdGljcyBwcm9kdWNlZCB3aGVuIGNyZWF0aW5nIHRoZSBwcmVhbWJsZS4KLSAgU21hbGxWZWN0b3I8U3RvcmVkRGlhZ25vc3RpYywgND4gUHJlYW1ibGVEaWFnbm9zdGljczsKKyAgU21hbGxWZWN0b3I8U3RhbmRhbG9uZURpYWdub3N0aWMsIDQ+IFByZWFtYmxlRGlhZ25vc3RpY3M7CiAKICAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGRpYWdub3N0aWNzIHByb2R1Y2VkIHdoZW4gY3JlYXRpbmcgdGhpcwogICAvLy8gdHJhbnNsYXRpb24gdW5pdC4KQEAgLTIwNSw4ICsyMjQsMzQgQEAKICAgICByZXR1cm4gUHJlYW1ibGU7CiAgIH0KIAotcHJpdmF0ZToKKyAgLy8vIERhdGEgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBmaWxlIHVzZWQgaW4gdGhlIHByZWFtYmxlIGhhcyBiZWVuIGNoYW5nZWQuCisgIHN0cnVjdCBQcmVhbWJsZUZpbGVIYXNoIHsKKyAgICAvLy8gQWxsIGZpbGVzIGhhdmUgc2l6ZSBzZXQuCisgICAgb2ZmX3QgU2l6ZTsKIAorICAgIC8vLyBNb2RpZmljYXRpb24gdGltZSBpcyBzZXQgZm9yIGZpbGVzIHRoYXQgYXJlIG9uIGRpc2suICBGb3IgbWVtb3J5CisgICAgLy8vIGJ1ZmZlcnMgaXQgaXMgemVyby4KKyAgICB0aW1lX3QgTW9kVGltZTsKKworICAgIC8vLyBNZW1vcnkgYnVmZmVycyBoYXZlIE1ENSBpbnN0ZWFkIG9mIG1vZGlmaWNhdGlvbiB0aW1lLiAgV2UgZG9uJ3QKKyAgICAvLy8gY29tcHV0ZSBNRDUgZm9yIG9uLWRpc2sgZmlsZXMgYmVjYXVzZSB3ZSBob3BlIHRoYXQgbW9kaWZpY2F0aW9uIHRpbWUgaXMKKyAgICAvLy8gZW5vdWdoIHRvIHRlbGwgaWYgdGhlIGZpbGUgd2FzIGNoYW5nZWQuCisgICAgbGx2bTo6TUQ1OjpNRDVSZXN1bHQgTUQ1OworCisgICAgc3RhdGljIFByZWFtYmxlRmlsZUhhc2ggY3JlYXRlRm9yRmlsZShvZmZfdCBTaXplLCB0aW1lX3QgTW9kVGltZSk7CisgICAgc3RhdGljIFByZWFtYmxlRmlsZUhhc2gKKyAgICBjcmVhdGVGb3JNZW1vcnlCdWZmZXIoY29uc3QgbGx2bTo6TWVtb3J5QnVmZmVyICpCdWZmZXIpOworCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQcmVhbWJsZUZpbGVIYXNoICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVhbWJsZUZpbGVIYXNoICZSSFMpOworCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQcmVhbWJsZUZpbGVIYXNoICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVhbWJsZUZpbGVIYXNoICZSSFMpIHsKKyAgICAgIHJldHVybiAhKExIUyA9PSBSSFMpOworICAgIH0KKyAgfTsKKworcHJpdmF0ZToKICAgLy8vIFxicmllZiBUaGUgY29udGVudHMgb2YgdGhlIHByZWFtYmxlIHRoYXQgaGFzIGJlZW4gcHJlY29tcGlsZWQgdG8KICAgLy8vIFxjIFByZWFtYmxlRmlsZS4KICAgUHJlYW1ibGVEYXRhIFByZWFtYmxlOwpAQCAtMjE2LDE3ICsyNjEsMTMgQEAKICAgLy8vIFVzZWQgdG8gaW5mb3JtIHRoZSBsZXhlciBhcyB0byB3aGV0aGVyIGl0J3Mgc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyBvZgogICAvLy8gYSBsaW5lIGFmdGVyIHNraXBwaW5nIHRoZSBwcmVhbWJsZS4KICAgYm9vbCBQcmVhbWJsZUVuZHNBdFN0YXJ0T2ZMaW5lOwotICAKLSAgLy8vIFxicmllZiBUaGUgc2l6ZSBvZiB0aGUgc291cmNlIGJ1ZmZlciB0aGF0IHdlJ3ZlIHJlc2VydmVkIGZvciB0aGUgbWFpbiAKLSAgLy8vIGZpbGUgd2l0aGluIHRoZSBwcmVjb21waWxlZCBwcmVhbWJsZS4KLSAgdW5zaWduZWQgUHJlYW1ibGVSZXNlcnZlZFNpemU7CiAKICAgLy8vIFxicmllZiBLZWVwcyB0cmFjayBvZiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgd2hlbiBjb21wdXRpbmcgdGhlIAogICAvLy8gcHJlYW1ibGUsIHdpdGggYm90aCB0aGVpciBidWZmZXIgc2l6ZSBhbmQgdGhlaXIgbW9kaWZpY2F0aW9uIHRpbWUuCiAgIC8vLwogICAvLy8gSWYgYW55IG9mIHRoZSBmaWxlcyBoYXZlIGNoYW5nZWQgZnJvbSBvbmUgY29tcGlsZSB0byB0aGUgbmV4dCwKICAgLy8vIHRoZSBwcmVhbWJsZSBtdXN0IGJlIHRocm93biBhd2F5LgotICBsbHZtOjpTdHJpbmdNYXA8c3RkOjpwYWlyPG9mZl90LCB0aW1lX3Q+ID4gRmlsZXNJblByZWFtYmxlOworICBsbHZtOjpTdHJpbmdNYXA8UHJlYW1ibGVGaWxlSGFzaD4gRmlsZXNJblByZWFtYmxlOwogCiAgIC8vLyBcYnJpZWYgV2hlbiBub24tTlVMTCwgdGhpcyBpcyB0aGUgYnVmZmVyIHVzZWQgdG8gc3RvcmUgdGhlIGNvbnRlbnRzIG9mCiAgIC8vLyB0aGUgbWFpbiBmaWxlIHdoZW4gaXQgaGFzIGJlZW4gcGFkZGVkIGZvciB1c2Ugd2l0aCB0aGUgcHJlY29tcGlsZWQKQEAgLTI2OCw5ICszMDksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqQXJnQmVnaW4sIGNvbnN0IGNoYXIgKipBcmdFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVFVuaXQgJkFTVCwgYm9vbCBDYXB0dXJlRGlhZ25vc3RpY3MpOwogCi0gIHZvaWQgVHJhbnNsYXRlU3RvcmVkRGlhZ25vc3RpY3MoQVNUUmVhZGVyICpNTWFuLCBTdHJpbmdSZWYgTW9kTmFtZSwKKyAgdm9pZCBUcmFuc2xhdGVTdG9yZWREaWFnbm9zdGljcyhGaWxlTWFuYWdlciAmRmlsZU1nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VNYW5hZ2VyICZTcmNNYW4sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFN0b3JlZERpYWdub3N0aWM+ICZEaWFncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8U3RhbmRhbG9uZURpYWdub3N0aWM+ICZEaWFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U3RvcmVkRGlhZ25vc3RpYz4gJk91dCk7CiAKICAgdm9pZCBjbGVhckZpbGVMZXZlbERlY2xzKCk7CkBAIC0zMzcsOCArMzc4LDggQEAKICAgLy8vIFxicmllZiBBbGxvY2F0b3IgdXNlZCB0byBzdG9yZSBjYWNoZWQgY29kZSBjb21wbGV0aW9ucy4KICAgSW50cnVzaXZlUmVmQ250UHRyPEdsb2JhbENvZGVDb21wbGV0aW9uQWxsb2NhdG9yPgogICAgIENhY2hlZENvbXBsZXRpb25BbGxvY2F0b3I7Ci0gIAotICBPd25pbmdQdHI8Q29kZUNvbXBsZXRpb25UVUluZm8+IENDVFVJbmZvOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDb2RlQ29tcGxldGlvblRVSW5mbz4gQ0NUVUluZm87CiAKICAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGNhY2hlZCBjb2RlLWNvbXBsZXRpb24gcmVzdWx0cy4KICAgc3RkOjp2ZWN0b3I8Q2FjaGVkQ29kZUNvbXBsZXRpb25SZXN1bHQ+IENhY2hlZENvbXBsZXRpb25SZXN1bHRzOwpAQCAtNDA2LDkgKzQ0Nyw3IEBACiAgIC8vLyBqdXN0IGFib3V0IGFueSB1c2FnZS4KICAgLy8vIEJlY29tZXMgYSBub29wIGluIHJlbGVhc2UgbW9kZTsgb25seSB1c2VmdWwgZm9yIGRlYnVnIG1vZGUgY2hlY2tpbmcuCiAgIGNsYXNzIENvbmN1cnJlbmN5U3RhdGUgewotI2lmbmRlZiBOREVCVUcKICAgICB2b2lkICpNdXRleDsgLy8gYSBsbHZtOjpzeXM6Ok11dGV4SW1wbCBpbiBkZWJ1ZzsKLSNlbmRpZgogCiAgIHB1YmxpYzoKICAgICBDb25jdXJyZW5jeVN0YXRlKCk7CkBAIC00NTcsNyArNDk2LDcgQEAKICAgdm9pZCBzZXRBU1RDb250ZXh0KEFTVENvbnRleHQgKmN0eCkgeyBDdHggPSBjdHg7IH0KICAgdm9pZCBzZXRQcmVwcm9jZXNzb3IoUHJlcHJvY2Vzc29yICpwcCk7CiAKLSAgYm9vbCBoYXNTZW1hKCkgY29uc3QgeyByZXR1cm4gVGhlU2VtYS5pc1ZhbGlkKCk7IH0KKyAgYm9vbCBoYXNTZW1hKCkgY29uc3QgeyByZXR1cm4gKGJvb2wpVGhlU2VtYTsgfQogICBTZW1hICZnZXRTZW1hKCkgY29uc3QgeyAKICAgICBhc3NlcnQoVGhlU2VtYSAmJiAiQVNUVW5pdCBkb2VzIG5vdCBoYXZlIGEgU2VtYSBvYmplY3QhIik7CiAgICAgcmV0dXJuICpUaGVTZW1hOyAKQEAgLTY0NiwxMSArNjg1LDkgQEAKICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hhdCBraW5kIG9mIHRyYW5zbGF0aW9uIHVuaXQgdGhpcyBBU1QgcmVwcmVzZW50cy4KICAgVHJhbnNsYXRpb25Vbml0S2luZCBnZXRUcmFuc2xhdGlvblVuaXRLaW5kKCkgY29uc3QgeyByZXR1cm4gVFVLaW5kOyB9CiAKLSAgdHlwZWRlZiBsbHZtOjpQb2ludGVyVW5pb248Y29uc3QgY2hhciAqLCBjb25zdCBsbHZtOjpNZW1vcnlCdWZmZXIgKj4KLSAgICAgIEZpbGVuYW1lT3JNZW1CdWY7CiAgIC8vLyBcYnJpZWYgQSBtYXBwaW5nIGZyb20gYSBmaWxlIG5hbWUgdG8gdGhlIG1lbW9yeSBidWZmZXIgdGhhdCBzdG9yZXMgdGhlCiAgIC8vLyByZW1hcHBlZCBjb250ZW50cyBvZiB0aGF0IGZpbGUuCi0gIHR5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBGaWxlbmFtZU9yTWVtQnVmPiBSZW1hcHBlZEZpbGU7CisgIHR5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBjb25zdCBsbHZtOjpNZW1vcnlCdWZmZXIgKj4gUmVtYXBwZWRGaWxlOwogCiAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgQVNUVW5pdC4gR2V0cyBvd25lcnNoaXAgb2YgdGhlIHBhc3NlZCBDb21waWxlckludm9jYXRpb24uIAogICBzdGF0aWMgQVNUVW5pdCAqY3JlYXRlKENvbXBpbGVySW52b2NhdGlvbiAqQ0ksCkBAIC02NzAsOCArNzA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVN5c3RlbU9wdGlvbnMgJkZpbGVTeXN0ZW1PcHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seUxvY2FsRGVjbHMgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1hcHBlZEZpbGUgKlJlbWFwcGVkRmlsZXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVJlbWFwcGVkRmlsZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFJlbWFwcGVkRmlsZT4gUmVtYXBwZWRGaWxlcyA9IE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDYXB0dXJlRGlhZ25vc3RpY3MgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93UENIV2l0aENvbXBpbGVyRXJyb3JzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VyRmlsZXNBcmVWb2xhdGlsZSA9IGZhbHNlKTsKQEAgLTcxNCwxOSArNzUwLDE0IEBACiAgIC8vLyBUaGlzIHdpbGwgb25seSByZWNlaXZlIGFuIEFTVFVuaXQgaWYgYSBuZXcgb25lIHdhcyBjcmVhdGVkLiBJZiBhbiBhbHJlYWR5CiAgIC8vLyBjcmVhdGVkIEFTVFVuaXQgd2FzIHBhc3NlZCBpbiBccCBVbml0IHRoZW4gdGhlIGNhbGxlciBjYW4gY2hlY2sgdGhhdC4KICAgLy8vCi0gIHN0YXRpYyBBU1RVbml0ICpMb2FkRnJvbUNvbXBpbGVySW52b2NhdGlvbkFjdGlvbihDb21waWxlckludm9jYXRpb24gKkNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNzRW5naW5lPiBEaWFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVEZyb250ZW5kQWN0aW9uICpBY3Rpb24gPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUVW5pdCAqVW5pdCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBlcnNpc3RlbnQgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVzb3VyY2VGaWxlc1BhdGggPSBTdHJpbmdSZWYoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seUxvY2FsRGVjbHMgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2FwdHVyZURpYWdub3N0aWNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFByZWNvbXBpbGVQcmVhbWJsZSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDYWNoZUNvZGVDb21wbGV0aW9uUmVzdWx0cyA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlQnJpZWZDb21tZW50c0luQ29kZUNvbXBsZXRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXNlckZpbGVzQXJlVm9sYXRpbGUgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmluZ1B0cjxBU1RVbml0PiAqRXJyQVNUID0gMCk7CisgIHN0YXRpYyBBU1RVbml0ICpMb2FkRnJvbUNvbXBpbGVySW52b2NhdGlvbkFjdGlvbigKKyAgICAgIENvbXBpbGVySW52b2NhdGlvbiAqQ0ksIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MsCisgICAgICBBU1RGcm9udGVuZEFjdGlvbiAqQWN0aW9uID0gMCwgQVNUVW5pdCAqVW5pdCA9IDAsIGJvb2wgUGVyc2lzdGVudCA9IHRydWUsCisgICAgICBTdHJpbmdSZWYgUmVzb3VyY2VGaWxlc1BhdGggPSBTdHJpbmdSZWYoKSwgYm9vbCBPbmx5TG9jYWxEZWNscyA9IGZhbHNlLAorICAgICAgYm9vbCBDYXB0dXJlRGlhZ25vc3RpY3MgPSBmYWxzZSwgYm9vbCBQcmVjb21waWxlUHJlYW1ibGUgPSBmYWxzZSwKKyAgICAgIGJvb2wgQ2FjaGVDb2RlQ29tcGxldGlvblJlc3VsdHMgPSBmYWxzZSwKKyAgICAgIGJvb2wgSW5jbHVkZUJyaWVmQ29tbWVudHNJbkNvZGVDb21wbGV0aW9uID0gZmFsc2UsCisgICAgICBib29sIFVzZXJGaWxlc0FyZVZvbGF0aWxlID0gZmFsc2UsIHN0ZDo6dW5pcXVlX3B0cjxBU1RVbml0PiAqRXJyQVNUID0gMCk7CiAKICAgLy8vIExvYWRGcm9tQ29tcGlsZXJJbnZvY2F0aW9uIC0gQ3JlYXRlIGFuIEFTVFVuaXQgZnJvbSBhIHNvdXJjZSBmaWxlLCB2aWEgYQogICAvLy8gQ29tcGlsZXJJbnZvY2F0aW9uIG9iamVjdC4KQEAgLTc2NywzMiArNzk4LDI1IEBACiAgIC8vLwogICAvLyBGSVhNRTogTW92ZSBPbmx5TG9jYWxEZWNscywgVXNlQnVtcEFsbG9jYXRvciB0byBzZXR0ZXJzIG9uIHRoZSBBU1RVbml0LCB3ZQogICAvLyBzaG91bGRuJ3QgbmVlZCB0byBzcGVjaWZ5IHRoZW0gYXQgY29uc3RydWN0aW9uIHRpbWUuCi0gIHN0YXRpYyBBU1RVbml0ICpMb2FkRnJvbUNvbW1hbmRMaW5lKGNvbnN0IGNoYXIgKipBcmdCZWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKkFyZ0VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBSZXNvdXJjZUZpbGVzUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPbmx5TG9jYWxEZWNscyA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhcHR1cmVEaWFnbm9zdGljcyA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1hcHBlZEZpbGUgKlJlbWFwcGVkRmlsZXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZW1hcHBlZEZpbGVzID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZW1hcHBlZEZpbGVzS2VlcE9yaWdpbmFsTmFtZSA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUHJlY29tcGlsZVByZWFtYmxlID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uVW5pdEtpbmQgVFVLaW5kID0gVFVfQ29tcGxldGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2FjaGVDb2RlQ29tcGxldGlvblJlc3VsdHMgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluY2x1ZGVCcmllZkNvbW1lbnRzSW5Db2RlQ29tcGxldGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93UENIV2l0aENvbXBpbGVyRXJyb3JzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2tpcEZ1bmN0aW9uQm9kaWVzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXNlckZpbGVzQXJlVm9sYXRpbGUgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3JTZXJpYWxpemF0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmluZ1B0cjxBU1RVbml0PiAqRXJyQVNUID0gMCk7Ci0gIAorICBzdGF0aWMgQVNUVW5pdCAqTG9hZEZyb21Db21tYW5kTGluZSgKKyAgICAgIGNvbnN0IGNoYXIgKipBcmdCZWdpbiwgY29uc3QgY2hhciAqKkFyZ0VuZCwKKyAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MsIFN0cmluZ1JlZiBSZXNvdXJjZUZpbGVzUGF0aCwKKyAgICAgIGJvb2wgT25seUxvY2FsRGVjbHMgPSBmYWxzZSwgYm9vbCBDYXB0dXJlRGlhZ25vc3RpY3MgPSBmYWxzZSwKKyAgICAgIEFycmF5UmVmPFJlbWFwcGVkRmlsZT4gUmVtYXBwZWRGaWxlcyA9IE5vbmUsCisgICAgICBib29sIFJlbWFwcGVkRmlsZXNLZWVwT3JpZ2luYWxOYW1lID0gdHJ1ZSwKKyAgICAgIGJvb2wgUHJlY29tcGlsZVByZWFtYmxlID0gZmFsc2UsIFRyYW5zbGF0aW9uVW5pdEtpbmQgVFVLaW5kID0gVFVfQ29tcGxldGUsCisgICAgICBib29sIENhY2hlQ29kZUNvbXBsZXRpb25SZXN1bHRzID0gZmFsc2UsCisgICAgICBib29sIEluY2x1ZGVCcmllZkNvbW1lbnRzSW5Db2RlQ29tcGxldGlvbiA9IGZhbHNlLAorICAgICAgYm9vbCBBbGxvd1BDSFdpdGhDb21waWxlckVycm9ycyA9IGZhbHNlLCBib29sIFNraXBGdW5jdGlvbkJvZGllcyA9IGZhbHNlLAorICAgICAgYm9vbCBVc2VyRmlsZXNBcmVWb2xhdGlsZSA9IGZhbHNlLCBib29sIEZvclNlcmlhbGl6YXRpb24gPSBmYWxzZSwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBU1RVbml0PiAqRXJyQVNUID0gMCk7CisKICAgLy8vIFxicmllZiBSZXBhcnNlIHRoZSBzb3VyY2UgZmlsZXMgdXNpbmcgdGhlIHNhbWUgY29tbWFuZC1saW5lIG9wdGlvbnMgdGhhdAogICAvLy8gd2VyZSBvcmlnaW5hbGx5IHVzZWQgdG8gcHJvZHVjZSB0aGlzIHRyYW5zbGF0aW9uIHVuaXQuCiAgIC8vLwogICAvLy8gXHJldHVybnMgVHJ1ZSBpZiBhIGZhaWx1cmUgb2NjdXJyZWQgdGhhdCBjYXVzZXMgdGhlIEFTVFVuaXQgbm90IHRvCiAgIC8vLyBjb250YWluIGFueSB0cmFuc2xhdGlvbi11bml0IGluZm9ybWF0aW9uLCBmYWxzZSBvdGhlcndpc2UuICAKLSAgYm9vbCBSZXBhcnNlKFJlbWFwcGVkRmlsZSAqUmVtYXBwZWRGaWxlcyA9IDAsCi0gICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZW1hcHBlZEZpbGVzID0gMCk7CisgIGJvb2wgUmVwYXJzZShBcnJheVJlZjxSZW1hcHBlZEZpbGU+IFJlbWFwcGVkRmlsZXMgPSBOb25lKTsKIAogICAvLy8gXGJyaWVmIFBlcmZvcm0gY29kZSBjb21wbGV0aW9uIGF0IHRoZSBnaXZlbiBmaWxlLCBsaW5lLCBhbmQKICAgLy8vIGNvbHVtbiB3aXRoaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0LgpAQCAtODE1LDcgKzgzOSw3IEBACiAgIC8vLyBGSVhNRTogVGhlIERpYWcsIExhbmdPcHRzLCBTb3VyY2VNZ3IsIEZpbGVNZ3IsIFN0b3JlZERpYWdub3N0aWNzLCBhbmQKICAgLy8vIE93bmVkQnVmZmVycyBwYXJhbWV0ZXJzIGFyZSBhbGwgZGlzZ3VzdGluZyBoYWNrcy4gVGhleSB3aWxsIGdvIGF3YXkuCiAgIHZvaWQgQ29kZUNvbXBsZXRlKFN0cmluZ1JlZiBGaWxlLCB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2x1bW4sCi0gICAgICAgICAgICAgICAgICAgIFJlbWFwcGVkRmlsZSAqUmVtYXBwZWRGaWxlcywgdW5zaWduZWQgTnVtUmVtYXBwZWRGaWxlcywKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UmVtYXBwZWRGaWxlPiBSZW1hcHBlZEZpbGVzLAogICAgICAgICAgICAgICAgICAgICBib29sIEluY2x1ZGVNYWNyb3MsIGJvb2wgSW5jbHVkZUNvZGVQYXR0ZXJucywKICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlQnJpZWZDb21tZW50cywKICAgICAgICAgICAgICAgICAgICAgQ29kZUNvbXBsZXRlQ29uc3VtZXIgJkNvbnN1bWVyLApAQCAtODM0LDE5ICs4NTgsMTYgQEAKICAgLy8vCiAgIC8vLyBccmV0dXJucyBUcnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCiAgIGJvb2wgc2VyaWFsaXplKHJhd19vc3RyZWFtICZPUyk7Ci0gIAotICB2aXJ0dWFsIE1vZHVsZUxvYWRSZXN1bHQgbG9hZE1vZHVsZShTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUlkUGF0aCBQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGU6Ok5hbWVWaXNpYmlsaXR5S2luZCBWaXNpYmlsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW5jbHVzaW9uRGlyZWN0aXZlKSB7CisKKyAgTW9kdWxlTG9hZFJlc3VsdCBsb2FkTW9kdWxlKFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYywgTW9kdWxlSWRQYXRoIFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGU6Ok5hbWVWaXNpYmlsaXR5S2luZCBWaXNpYmlsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0luY2x1c2lvbkRpcmVjdGl2ZSkgb3ZlcnJpZGUgewogICAgIC8vIEFTVFVuaXQgZG9lc24ndCBrbm93IGhvdyB0byBsb2FkIG1vZHVsZXMgKG5vdCB0aGF0IHRoaXMgbWF0dGVycykuCiAgICAgcmV0dXJuIE1vZHVsZUxvYWRSZXN1bHQoKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBtYWtlTW9kdWxlVmlzaWJsZShNb2R1bGUgKk1vZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZTo6TmFtZVZpc2liaWxpdHlLaW5kIFZpc2liaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKSB7IH0KKyAgdm9pZCBtYWtlTW9kdWxlVmlzaWJsZShNb2R1bGUgKk1vZCwgTW9kdWxlOjpOYW1lVmlzaWJpbGl0eUtpbmQgVmlzaWJpbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsIGJvb2wgQ29tcGxhaW4pIG92ZXJyaWRlIHt9CiAKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQ2hhaW5lZERpYWdub3N0aWNDb25zdW1lci5oIGIvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9DaGFpbmVkRGlhZ25vc3RpY0NvbnN1bWVyLmgKaW5kZXggYjdkYzdjNy4uMTE3NjJhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9DaGFpbmVkRGlhZ25vc3RpY0NvbnN1bWVyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9DaGFpbmVkRGlhZ25vc3RpY0NvbnN1bWVyLmgKQEAgLTExLDcgKzExLDcgQEAKICNkZWZpbmUgTExWTV9DTEFOR19GUk9OVEVORF9DSEFJTkVERElBR05PU1RJQ0NPTlNVTUVSX0gKIAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CiBjbGFzcyBMYW5nT3B0aW9uczsKQEAgLTIyLDggKzIyLDggQEAKIC8vLyBkaWFnbm9zdGljcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gY291bnRzLgogY2xhc3MgQ2hhaW5lZERpYWdub3N0aWNDb25zdW1lciA6IHB1YmxpYyBEaWFnbm9zdGljQ29uc3VtZXIgewogICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7Ci0gIE93bmluZ1B0cjxEaWFnbm9zdGljQ29uc3VtZXI+IFByaW1hcnk7Ci0gIE93bmluZ1B0cjxEaWFnbm9zdGljQ29uc3VtZXI+IFNlY29uZGFyeTsKKyAgc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNDb25zdW1lcj4gUHJpbWFyeTsKKyAgc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNDb25zdW1lcj4gU2Vjb25kYXJ5OwogCiBwdWJsaWM6CiAgIENoYWluZWREaWFnbm9zdGljQ29uc3VtZXIoRGlhZ25vc3RpY0NvbnN1bWVyICpfUHJpbWFyeSwKQEAgLTMyLDI4ICszMiwyOCBAQAogICAgIFNlY29uZGFyeS5yZXNldChfU2Vjb25kYXJ5KTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBCZWdpblNvdXJjZUZpbGUoY29uc3QgTGFuZ09wdGlvbnMgJkxPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXByb2Nlc3NvciAqUFApIHsKKyAgdm9pZCBCZWdpblNvdXJjZUZpbGUoY29uc3QgTGFuZ09wdGlvbnMgJkxPLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVwcm9jZXNzb3IgKlBQKSBvdmVycmlkZSB7CiAgICAgUHJpbWFyeS0+QmVnaW5Tb3VyY2VGaWxlKExPLCBQUCk7CiAgICAgU2Vjb25kYXJ5LT5CZWdpblNvdXJjZUZpbGUoTE8sIFBQKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBFbmRTb3VyY2VGaWxlKCkgeworICB2b2lkIEVuZFNvdXJjZUZpbGUoKSBvdmVycmlkZSB7CiAgICAgU2Vjb25kYXJ5LT5FbmRTb3VyY2VGaWxlKCk7CiAgICAgUHJpbWFyeS0+RW5kU291cmNlRmlsZSgpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGZpbmlzaCgpIHsKKyAgdm9pZCBmaW5pc2goKSBvdmVycmlkZSB7CiAgICAgU2Vjb25kYXJ5LT5maW5pc2goKTsKICAgICBQcmltYXJ5LT5maW5pc2goKTsKICAgfQogCi0gIHZpcnR1YWwgYm9vbCBJbmNsdWRlSW5EaWFnbm9zdGljQ291bnRzKCkgY29uc3QgeworICBib29sIEluY2x1ZGVJbkRpYWdub3N0aWNDb3VudHMoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFByaW1hcnktPkluY2x1ZGVJbkRpYWdub3N0aWNDb3VudHMoKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pIHsKKyAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKSBvdmVycmlkZSB7CiAgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAoV2FybmluZ3MvZXJyb3JzIGNvdW50KS4KICAgICBEaWFnbm9zdGljQ29uc3VtZXI6OkhhbmRsZURpYWdub3N0aWMoRGlhZ0xldmVsLCBJbmZvKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9DaGFpbmVkSW5jbHVkZXNTb3VyY2UuaCBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQ2hhaW5lZEluY2x1ZGVzU291cmNlLmgKaW5kZXggYWEzMDQ2MC4uNjc2ZTc0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9DaGFpbmVkSW5jbHVkZXNTb3VyY2UuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NoYWluZWRJbmNsdWRlc1NvdXJjZS5oCkBAIC0yNCwxMyArMjQsMTMgQEAKIHB1YmxpYzoKICAgdmlydHVhbCB+Q2hhaW5lZEluY2x1ZGVzU291cmNlKCk7CiAKLSAgc3RhdGljIENoYWluZWRJbmNsdWRlc1NvdXJjZSAqY3JlYXRlKENvbXBpbGVySW5zdGFuY2UgJkNJKTsKKyAgc3RhdGljIEludHJ1c2l2ZVJlZkNudFB0cjxDaGFpbmVkSW5jbHVkZXNTb3VyY2U+IGNyZWF0ZShDb21waWxlckluc3RhbmNlICZDSSk7CiAKICAgRXh0ZXJuYWxTZW1hU291cmNlICZnZXRGaW5hbFJlYWRlcigpIGNvbnN0IHsgcmV0dXJuICpGaW5hbFJlYWRlcjsgfQogCiBwcml2YXRlOgogICBzdGQ6OnZlY3RvcjxDb21waWxlckluc3RhbmNlICo+IENJczsKLSAgT3duaW5nUHRyPEV4dGVybmFsU2VtYVNvdXJjZT4gRmluYWxSZWFkZXI7CisgIEludHJ1c2l2ZVJlZkNudFB0cjxFeHRlcm5hbFNlbWFTb3VyY2U+IEZpbmFsUmVhZGVyOwogCiAgIAogcHJvdGVjdGVkOgpAQCAtMzksMzUgKzM5LDM1IEBACiAvLyBFeHRlcm5hbEFTVFNvdXJjZSBpbnRlcmZhY2UuCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCi0gIHZpcnR1YWwgRGVjbCAqR2V0RXh0ZXJuYWxEZWNsKHVpbnQzMl90IElEKTsKLSAgdmlydHVhbCBTZWxlY3RvciBHZXRFeHRlcm5hbFNlbGVjdG9yKHVpbnQzMl90IElEKTsKLSAgdmlydHVhbCB1aW50MzJfdCBHZXROdW1FeHRlcm5hbFNlbGVjdG9ycygpOwotICB2aXJ0dWFsIFN0bXQgKkdldEV4dGVybmFsRGVjbFN0bXQodWludDY0X3QgT2Zmc2V0KTsKLSAgdmlydHVhbCBDWFhCYXNlU3BlY2lmaWVyICpHZXRFeHRlcm5hbENYWEJhc2VTcGVjaWZpZXJzKHVpbnQ2NF90IE9mZnNldCk7Ci0gIHZpcnR1YWwgYm9vbCBGaW5kRXh0ZXJuYWxWaXNpYmxlRGVjbHNCeU5hbWUoY29uc3QgRGVjbENvbnRleHQgKkRDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lKTsKLSAgdmlydHVhbCBFeHRlcm5hbExvYWRSZXN1bHQgRmluZEV4dGVybmFsTGV4aWNhbERlY2xzKGNvbnN0IERlY2xDb250ZXh0ICpEQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqaXNLaW5kV2VXYW50KShEZWNsOjpLaW5kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8RGVjbCo+ICZSZXN1bHQpOwotICB2aXJ0dWFsIHZvaWQgQ29tcGxldGVUeXBlKFRhZ0RlY2wgKlRhZyk7Ci0gIHZpcnR1YWwgdm9pZCBDb21wbGV0ZVR5cGUoT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzKTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0ZWREZXNlcmlhbGl6aW5nKCk7Ci0gIHZpcnR1YWwgdm9pZCBGaW5pc2hlZERlc2VyaWFsaXppbmcoKTsKLSAgdmlydHVhbCB2b2lkIFN0YXJ0VHJhbnNsYXRpb25Vbml0KEFTVENvbnN1bWVyICpDb25zdW1lcik7Ci0gIHZpcnR1YWwgdm9pZCBQcmludFN0YXRzKCk7CisgIERlY2wgKkdldEV4dGVybmFsRGVjbCh1aW50MzJfdCBJRCkgb3ZlcnJpZGU7CisgIFNlbGVjdG9yIEdldEV4dGVybmFsU2VsZWN0b3IodWludDMyX3QgSUQpIG92ZXJyaWRlOworICB1aW50MzJfdCBHZXROdW1FeHRlcm5hbFNlbGVjdG9ycygpIG92ZXJyaWRlOworICBTdG10ICpHZXRFeHRlcm5hbERlY2xTdG10KHVpbnQ2NF90IE9mZnNldCkgb3ZlcnJpZGU7CisgIENYWEJhc2VTcGVjaWZpZXIgKkdldEV4dGVybmFsQ1hYQmFzZVNwZWNpZmllcnModWludDY0X3QgT2Zmc2V0KSBvdmVycmlkZTsKKyAgYm9vbCBGaW5kRXh0ZXJuYWxWaXNpYmxlRGVjbHNCeU5hbWUoY29uc3QgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWUgTmFtZSkgb3ZlcnJpZGU7CisgIEV4dGVybmFsTG9hZFJlc3VsdCBGaW5kRXh0ZXJuYWxMZXhpY2FsRGVjbHMoY29uc3QgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqaXNLaW5kV2VXYW50KShEZWNsOjpLaW5kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wqPiAmUmVzdWx0KSBvdmVycmlkZTsKKyAgdm9pZCBDb21wbGV0ZVR5cGUoVGFnRGVjbCAqVGFnKSBvdmVycmlkZTsKKyAgdm9pZCBDb21wbGV0ZVR5cGUoT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzKSBvdmVycmlkZTsKKyAgdm9pZCBTdGFydGVkRGVzZXJpYWxpemluZygpIG92ZXJyaWRlOworICB2b2lkIEZpbmlzaGVkRGVzZXJpYWxpemluZygpIG92ZXJyaWRlOworICB2b2lkIFN0YXJ0VHJhbnNsYXRpb25Vbml0KEFTVENvbnN1bWVyICpDb25zdW1lcikgb3ZlcnJpZGU7CisgIHZvaWQgUHJpbnRTdGF0cygpIG92ZXJyaWRlOwogCiAgIC8vLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSBtZW1vcnkgYnVmZmVycywgYnJlYWtpbmcgZG93bgogICAvLy8gYnkgaGVhcC1iYWNrZWQgdmVyc3VzIG1tYXAnZWQgbWVtb3J5LgotICB2aXJ0dWFsIHZvaWQgZ2V0TWVtb3J5QnVmZmVyU2l6ZXMoTWVtb3J5QnVmZmVyU2l6ZXMgJnNpemVzKSBjb25zdDsKKyAgdm9pZCBnZXRNZW1vcnlCdWZmZXJTaXplcyhNZW1vcnlCdWZmZXJTaXplcyAmc2l6ZXMpIGNvbnN0IG92ZXJyaWRlOwogCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogLy8gRXh0ZXJuYWxTZW1hU291cmNlIGludGVyZmFjZS4KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKLSAgdmlydHVhbCB2b2lkIEluaXRpYWxpemVTZW1hKFNlbWEgJlMpOwotICB2aXJ0dWFsIHZvaWQgRm9yZ2V0U2VtYSgpOwotICB2aXJ0dWFsIHZvaWQgUmVhZE1ldGhvZFBvb2woU2VsZWN0b3IgU2VsKTsKLSAgdmlydHVhbCBib29sIExvb2t1cFVucXVhbGlmaWVkKExvb2t1cFJlc3VsdCAmUiwgU2NvcGUgKlMpOworICB2b2lkIEluaXRpYWxpemVTZW1hKFNlbWEgJlMpIG92ZXJyaWRlOworICB2b2lkIEZvcmdldFNlbWEoKSBvdmVycmlkZTsKKyAgdm9pZCBSZWFkTWV0aG9kUG9vbChTZWxlY3RvciBTZWwpIG92ZXJyaWRlOworICBib29sIExvb2t1cFVucXVhbGlmaWVkKExvb2t1cFJlc3VsdCAmUiwgU2NvcGUgKlMpIG92ZXJyaWRlOwogfTsKIAogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Db2RlR2VuT3B0aW9ucy5kZWYgYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NvZGVHZW5PcHRpb25zLmRlZgppbmRleCA3OGI4MjVkLi43NTNiNjQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NvZGVHZW5PcHRpb25zLmRlZgorKysgYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NvZGVHZW5PcHRpb25zLmRlZgpAQCAtMjgsNiArMjgsOCBAQAogQ09ERUdFTk9QVChOYW1lLCBCaXRzLCBEZWZhdWx0KQogI2VuZGlmCiAKK0NPREVHRU5PUFQoRGlzYWJsZUludGVncmF0ZWRBUywgMSwgMCkgLy8vPCAtbm8taW50ZWdyYXRlZC1hcworQ09ERUdFTk9QVChDb21wcmVzc0RlYnVnU2VjdGlvbnMsIDEsIDApIC8vLzwgLVdhLC1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucwogQ09ERUdFTk9QVChBdXRvbGluayAgICAgICAgICAsIDEsIDEpIC8vLzwgLWZuby1hdXRvbGluawogQ09ERUdFTk9QVChBc21WZXJib3NlICAgICAgICAsIDEsIDApIC8vLzwgLWRBLCAtZnZlcmJvc2UtYXNtLgogQ09ERUdFTk9QVChPYmpDQXV0b1JlZkNvdW50RXhjZXB0aW9ucyAsIDEsIDApIC8vLzwgV2hldGhlciBBUkMgc2hvdWxkIGJlIEVILXNhZmUuCkBAIC01OSw4ICs2MSw2IEBACiBDT0RFR0VOT1BUKEZvcmJpZEd1YXJkVmFyaWFibGVzICwgMSwgMCkgLy8vPCBJc3N1ZSBlcnJvcnMgaWYgQysrIGd1YXJkIHZhcmlhYmxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYXJlIHJlcXVpcmVkLgogQ09ERUdFTk9QVChGdW5jdGlvblNlY3Rpb25zICAsIDEsIDApIC8vLzwgU2V0IHdoZW4gLWZmdW5jdGlvbi1zZWN0aW9ucyBpcyBlbmFibGVkLgotQ09ERUdFTk9QVChIaWRkZW5XZWFrVlRhYmxlcyAsIDEsIDApIC8vLzwgRW1pdCB3ZWFrIHZ0YWJsZXMsIFJUVEksIGFuZCB0aHVua3Mgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaGlkZGVuIHZpc2liaWxpdHkuCiBDT0RFR0VOT1BUKEluc3RydW1lbnRGdW5jdGlvbnMgLCAxLCAwKSAvLy88IFNldCB3aGVuIC1maW5zdHJ1bWVudC1mdW5jdGlvbnMgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZW5hYmxlZC4KIENPREVHRU5PUFQoSW5zdHJ1bWVudEZvclByb2ZpbGluZyAsIDEsIDApIC8vLzwgU2V0IHdoZW4gLXBnIGlzIGVuYWJsZWQuCkBAIC04Nyw2ICs4Nyw5IEBACiBWQUxVRV9DT0RFR0VOT1BUKE9wdGltaXphdGlvbkxldmVsLCAzLCAwKSAvLy88IFRoZSAtT1swLTRdIG9wdGlvbiBzcGVjaWZpZWQuCiBWQUxVRV9DT0RFR0VOT1BUKE9wdGltaXplU2l6ZSwgMiwgMCkgLy8vPCBJZiAtT3MgKD09MSkgb3IgLU96ICg9PTIpIGlzIHNwZWNpZmllZC4KIAorQ09ERUdFTk9QVChQcm9maWxlSW5zdHJHZW5lcmF0ZSAsIDEsIDApIC8vLzwgSW5zdHJ1bWVudCBjb2RlIHRvIGdlbmVyYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBleGVjdXRpb24gY291bnRzIHRvIHVzZSB3aXRoIFBHTy4KKwogICAvLy8gSWYgLWZwY2Mtc3RydWN0LXJldHVybiBvciAtZnJlZy1zdHJ1Y3QtcmV0dXJuIGlzIHNwZWNpZmllZC4KIEVOVU1fQ09ERUdFTk9QVChTdHJ1Y3RSZXR1cm5Db252ZW50aW9uLCBTdHJ1Y3RSZXR1cm5Db252ZW50aW9uS2luZCwgMiwgU1JDS19EZWZhdWx0KQogCkBAIC05Niw3ICs5OSw3IEBACiBDT0RFR0VOT1BUKFNhdmVUZW1wTGFiZWxzICAgICwgMSwgMCkgLy8vPCBTYXZlIHRlbXBvcmFyeSBsYWJlbHMuCiBDT0RFR0VOT1BUKFNhbml0aXplQWRkcmVzc1plcm9CYXNlU2hhZG93ICwgMSwgMCkgLy8vPCBNYXAgc2hhZG93IG1lbW9yeSBhdCB6ZXJvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBvZmZzZXQgaW4gQWRkcmVzc1Nhbml0aXplci4KLUNPREVHRU5PUFQoU2FuaXRpemVNZW1vcnlUcmFja09yaWdpbnMsIDEsIDApIC8vLzwgRW5hYmxlIHRyYWNraW5nIG9yaWdpbnMgaW4KK0NPREVHRU5PUFQoU2FuaXRpemVNZW1vcnlUcmFja09yaWdpbnMsIDIsIDApIC8vLzwgRW5hYmxlIHRyYWNraW5nIG9yaWdpbnMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTWVtb3J5U2FuaXRpemVyCiBDT0RFR0VOT1BUKFNhbml0aXplVW5kZWZpbmVkVHJhcE9uRXJyb3IsIDEsIDApIC8vLzwgU2V0IG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyAtZnNhbml0aXplLXVuZGVmaW5lZC10cmFwLW9uLWVycm9yCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NvZGVHZW5PcHRpb25zLmggYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NvZGVHZW5PcHRpb25zLmgKaW5kZXggODZhYWJmNy4uZGE5N2U1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Db2RlR2VuT3B0aW9ucy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQ29kZUdlbk9wdGlvbnMuaApAQCAtNTAsMTIgKzUwLDIwIEBACiAgIH07CiAKICAgZW51bSBEZWJ1Z0luZm9LaW5kIHsKLSAgICBOb0RlYnVnSW5mbywgICAgICAgICAgLy8gRG9uJ3QgZ2VuZXJhdGUgZGVidWcgaW5mby4KLSAgICBEZWJ1Z0xpbmVUYWJsZXNPbmx5LCAgLy8gRW1pdCBvbmx5IGRlYnVnIGluZm8gbmVjZXNzYXJ5IGZvciBnZW5lcmF0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgbnVtYmVyIHRhYmxlcyAoLWdsaW5lLXRhYmxlcy1vbmx5KS4KLSAgICBMaW1pdGVkRGVidWdJbmZvLCAgICAgLy8gTGltaXQgZ2VuZXJhdGVkIGRlYnVnIGluZm8gdG8gcmVkdWNlIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKC1mbGltaXQtZGVidWctaW5mbykuCi0gICAgRnVsbERlYnVnSW5mbyAgICAgICAgIC8vIEdlbmVyYXRlIGNvbXBsZXRlIGRlYnVnIGluZm8uCisgICAgTm9EZWJ1Z0luZm8sICAgICAgICAgIC8vLyBEb24ndCBnZW5lcmF0ZSBkZWJ1ZyBpbmZvLgorCisgICAgRGVidWdMaW5lVGFibGVzT25seSwgIC8vLyBFbWl0IG9ubHkgZGVidWcgaW5mbyBuZWNlc3NhcnkgZm9yIGdlbmVyYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIGxpbmUgbnVtYmVyIHRhYmxlcyAoLWdsaW5lLXRhYmxlcy1vbmx5KS4KKworICAgIExpbWl0ZWREZWJ1Z0luZm8sICAgICAvLy8gTGltaXQgZ2VuZXJhdGVkIGRlYnVnIGluZm8gdG8gcmVkdWNlIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vICgtZm5vLXN0YW5kYWxvbmUtZGVidWcpLiBUaGlzIGVtaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBmb3J3YXJkIGRlY2xzIGZvciB0eXBlcyB0aGF0IGNvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyByZXBsYWNlZCB3aXRoIGZvcndhcmQgZGVjbHMgaW4gdGhlIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gY29kZS4gRm9yIGR5bmFtaWMgQysrIGNsYXNzZXMgdHlwZSBpbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBpcyBvbmx5IGVtaXR0ZWQgaW50IHRoZSBtb2R1bGUgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gY29udGFpbnMgdGhlIGNsYXNzZSdzIHZ0YWJsZS4KKworICAgIEZ1bGxEZWJ1Z0luZm8gICAgICAgICAvLy8gR2VuZXJhdGUgY29tcGxldGUgZGVidWcgaW5mby4KICAgfTsKIAogICBlbnVtIFRMU01vZGVsIHsKQEAgLTEzNCw2ICsxNDIsOSBAQAogICAvLy8gTmFtZSBvZiB0aGUgcHJvZmlsZSBmaWxlIHRvIHVzZSB3aXRoIC1mcHJvZmlsZS1zYW1wbGUtdXNlLgogICBzdGQ6OnN0cmluZyBTYW1wbGVQcm9maWxlRmlsZTsKIAorICAvLy8gTmFtZSBvZiB0aGUgcHJvZmlsZSBmaWxlIHRvIHVzZSBhcyBpbnB1dCBmb3IgLWZwcm9maWxlLWluc3RyLXVzZQorICBzdGQ6OnN0cmluZyBJbnN0clByb2ZpbGVJbnB1dDsKKwogcHVibGljOgogICAvLyBEZWZpbmUgYWNjZXNzb3JzL211dGF0b3JzIGZvciBjb2RlIGdlbmVyYXRpb24gb3B0aW9ucyBvZiBlbnVtZXJhdGlvbiB0eXBlLgogI2RlZmluZSBDT0RFR0VOT1BUKE5hbWUsIEJpdHMsIERlZmF1bHQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0NvbXBpbGVySW5zdGFuY2UuaCBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQ29tcGlsZXJJbnN0YW5jZS5oCmluZGV4IDU2NzNjNTkuLmVlOTdkOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQ29tcGlsZXJJbnN0YW5jZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvQ29tcGlsZXJJbnN0YW5jZS5oCkBAIC0xMywxNCArMTMsMTUgQEAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0NvbXBpbGVySW52b2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL1V0aWxzLmgiCiAjaW5jbHVkZSAiY2xhbmcvTGV4L01vZHVsZUxvYWRlci5oIgogI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKICNpbmNsdWRlIDxjYXNzZXJ0PgogI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlsaXR5PgogCkBAIC03NCw2ICs3NSw5IEBACiAgIC8vLyBUaGUgdGFyZ2V0IGJlaW5nIGNvbXBpbGVkIGZvci4KICAgSW50cnVzaXZlUmVmQ250UHRyPFRhcmdldEluZm8+IFRhcmdldDsKIAorICAvLy8gVGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0uCisgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6OkZpbGVTeXN0ZW0+IFZpcnR1YWxGaWxlU3lzdGVtOworCiAgIC8vLyBUaGUgZmlsZSBtYW5hZ2VyLgogICBJbnRydXNpdmVSZWZDbnRQdHI8RmlsZU1hbmFnZXI+IEZpbGVNZ3I7CiAKQEAgLTg3LDE5ICs5MSwyMiBAQAogICBJbnRydXNpdmVSZWZDbnRQdHI8QVNUQ29udGV4dD4gQ29udGV4dDsKIAogICAvLy8gVGhlIEFTVCBjb25zdW1lci4KLSAgT3duaW5nUHRyPEFTVENvbnN1bWVyPiBDb25zdW1lcjsKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDb25zdW1lcjsKIAogICAvLy8gVGhlIGNvZGUgY29tcGxldGlvbiBjb25zdW1lci4KLSAgT3duaW5nUHRyPENvZGVDb21wbGV0ZUNvbnN1bWVyPiBDb21wbGV0aW9uQ29uc3VtZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb2RlQ29tcGxldGVDb25zdW1lcj4gQ29tcGxldGlvbkNvbnN1bWVyOwogCiAgIC8vLyBcYnJpZWYgVGhlIHNlbWFudGljIGFuYWx5c2lzIG9iamVjdC4KLSAgT3duaW5nUHRyPFNlbWE+IFRoZVNlbWE7CisgIHN0ZDo6dW5pcXVlX3B0cjxTZW1hPiBUaGVTZW1hOwogCiAgIC8vLyBcYnJpZWYgVGhlIGZyb250ZW5kIHRpbWVyCi0gIE93bmluZ1B0cjxsbHZtOjpUaW1lcj4gRnJvbnRlbmRUaW1lcjsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06OlRpbWVyPiBGcm9udGVuZFRpbWVyOwogCi0gIC8vLyBcYnJpZWYgTm9uLW93bmluZyByZWZlcmVuY2UgdG8gdGhlIEFTVFJlYWRlciwgaWYgb25lIGV4aXN0cy4KLSAgQVNUUmVhZGVyICpNb2R1bGVNYW5hZ2VyOworICAvLy8gXGJyaWVmIFRoZSBBU1RSZWFkZXIsIGlmIG9uZSBleGlzdHMuCisgIEludHJ1c2l2ZVJlZkNudFB0cjxBU1RSZWFkZXI+IE1vZHVsZU1hbmFnZXI7CisKKyAgLy8vIFxicmllZiBUaGUgZGVwZW5kZW5jeSBmaWxlIGdlbmVyYXRvci4KKyAgc3RkOjp1bmlxdWVfcHRyPERlcGVuZGVuY3lGaWxlR2VuZXJhdG9yPiBUaGVEZXBlbmRlbmN5RmlsZUdlbmVyYXRvcjsKIAogICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgdG9wLWxldmVsIG1vZHVsZXMgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCwKICAgLy8vIGFsb25nIHdpdGggdGhlIG1vZHVsZSBtYXAKQEAgLTEyMyw3ICsxMzAsNyBAQAogICAvLy8gXGJyaWVmIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdXRwdXQgZmlsZS4KICAgLy8vCiAgIC8vLyBJZiBUZW1wRmlsZW5hbWUgaXMgbm90IGVtcHR5IHdlIG11c3QgcmVuYW1lIGl0IHRvIEZpbGVuYW1lIGF0IHRoZSBlbmQuCi0gIC8vLyBUZW1wRmlsZW5hbWUgbWF5IGJlIGVtcHR5IGFuZCBGaWxlbmFtZSBub24gZW1wdHkgaWYgY3JlYXRpbmcgdGhlIHRlbXBvcmFyeQorICAvLy8gVGVtcEZpbGVuYW1lIG1heSBiZSBlbXB0eSBhbmQgRmlsZW5hbWUgbm9uLWVtcHR5IGlmIGNyZWF0aW5nIHRoZSB0ZW1wb3JhcnkKICAgLy8vIGZhaWxlZC4KICAgc3RydWN0IE91dHB1dEZpbGUgewogICAgIHN0ZDo6c3RyaW5nIEZpbGVuYW1lOwpAQCAtMzEzLDYgKzMyMCwyNiBAQAogICB2b2lkIHNldFRhcmdldChUYXJnZXRJbmZvICpWYWx1ZSk7CiAKICAgLy8vIH0KKyAgLy8vIEBuYW1lIFZpcnR1YWwgRmlsZSBTeXN0ZW0KKyAgLy8vIHsKKworICBib29sIGhhc1ZpcnR1YWxGaWxlU3lzdGVtKCkgY29uc3QgeyByZXR1cm4gVmlydHVhbEZpbGVTeXN0ZW0gIT0gMDsgfQorCisgIHZmczo6RmlsZVN5c3RlbSAmZ2V0VmlydHVhbEZpbGVTeXN0ZW0oKSBjb25zdCB7CisgICAgYXNzZXJ0KGhhc1ZpcnR1YWxGaWxlU3lzdGVtKCkgJiYKKyAgICAgICAgICAgIkNvbXBpbGVyIGluc3RhbmNlIGhhcyBubyB2aXJ0dWFsIGZpbGUgc3lzdGVtIik7CisgICAgcmV0dXJuICpWaXJ0dWFsRmlsZVN5c3RlbTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVwbGFjZSB0aGUgY3VycmVudCB2aXJ0dWFsIGZpbGUgc3lzdGVtLgorICAvLy8KKyAgLy8vIFxub3RlIE1vc3QgY2xpZW50cyBzaG91bGQgdXNlIHNldEZpbGVNYW5hZ2VyLCB3aGljaCB3aWxsIGltcGxpY2l0bHkgcmVzZXQKKyAgLy8vIHRoZSB2aXJ0dWFsIGZpbGUgc3lzdGVtIHRvIHRoZSBvbmUgY29udGFpbmVkIGluIHRoZSBmaWxlIG1hbmFnZXIuCisgIHZvaWQgc2V0VmlydHVhbEZpbGVTeXN0ZW0oSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gRlMpIHsKKyAgICBWaXJ0dWFsRmlsZVN5c3RlbSA9IEZTOworICB9CisKKyAgLy8vIH0KICAgLy8vIEBuYW1lIEZpbGUgTWFuYWdlcgogICAvLy8gewogCkBAIC0zMjUsMTAgKzM1MiwxMSBAQAogICB9CiAgIAogICB2b2lkIHJlc2V0QW5kTGVha0ZpbGVNYW5hZ2VyKCkgeworICAgIEJ1cnlQb2ludGVyKEZpbGVNZ3IuZ2V0UHRyKCkpOwogICAgIEZpbGVNZ3IucmVzZXRXaXRob3V0UmVsZWFzZSgpOwogICB9CiAKLSAgLy8vIHNldEZpbGVNYW5hZ2VyIC0gUmVwbGFjZSB0aGUgY3VycmVudCBmaWxlIG1hbmFnZXIuCisgIC8vLyBcYnJpZWYgUmVwbGFjZSB0aGUgY3VycmVudCBmaWxlIG1hbmFnZXIgYW5kIHZpcnR1YWwgZmlsZSBzeXN0ZW0uCiAgIHZvaWQgc2V0RmlsZU1hbmFnZXIoRmlsZU1hbmFnZXIgKlZhbHVlKTsKIAogICAvLy8gfQpAQCAtMzQ0LDYgKzM3Miw3IEBACiAgIH0KICAgCiAgIHZvaWQgcmVzZXRBbmRMZWFrU291cmNlTWFuYWdlcigpIHsKKyAgICBCdXJ5UG9pbnRlcihTb3VyY2VNZ3IuZ2V0UHRyKCkpOwogICAgIFNvdXJjZU1nci5yZXNldFdpdGhvdXRSZWxlYXNlKCk7CiAgIH0KIApAQCAtMzYzLDYgKzM5Miw3IEBACiAgIH0KIAogICB2b2lkIHJlc2V0QW5kTGVha1ByZXByb2Nlc3NvcigpIHsKKyAgICBCdXJ5UG9pbnRlcihQUC5nZXRQdHIoKSk7CiAgICAgUFAucmVzZXRXaXRob3V0UmVsZWFzZSgpOwogICB9CiAKQEAgLTM4MSw2ICs0MTEsNyBAQAogICB9CiAgIAogICB2b2lkIHJlc2V0QW5kTGVha0FTVENvbnRleHQoKSB7CisgICAgQnVyeVBvaW50ZXIoQ29udGV4dC5nZXRQdHIoKSk7CiAgICAgQ29udGV4dC5yZXNldFdpdGhvdXRSZWxlYXNlKCk7CiAgIH0KIApAQCAtMzk1LDcgKzQyNiw3IEBACiAgIC8vLyBAbmFtZSBBU1RDb25zdW1lcgogICAvLy8gewogCi0gIGJvb2wgaGFzQVNUQ29uc3VtZXIoKSBjb25zdCB7IHJldHVybiBDb25zdW1lci5pc1ZhbGlkKCk7IH0KKyAgYm9vbCBoYXNBU1RDb25zdW1lcigpIGNvbnN0IHsgcmV0dXJuIChib29sKUNvbnN1bWVyOyB9CiAKICAgQVNUQ29uc3VtZXIgJmdldEFTVENvbnN1bWVyKCkgY29uc3QgewogICAgIGFzc2VydChDb25zdW1lciAmJiAiQ29tcGlsZXIgaW5zdGFuY2UgaGFzIG5vIEFTVCBjb25zdW1lciEiKTsKQEAgLTQwNCw3ICs0MzUsNyBAQAogCiAgIC8vLyB0YWtlQVNUQ29uc3VtZXIgLSBSZW1vdmUgdGhlIGN1cnJlbnQgQVNUIGNvbnN1bWVyIGFuZCBnaXZlIG93bmVyc2hpcCB0bwogICAvLy8gdGhlIGNhbGxlci4KLSAgQVNUQ29uc3VtZXIgKnRha2VBU1RDb25zdW1lcigpIHsgcmV0dXJuIENvbnN1bWVyLnRha2UoKTsgfQorICBBU1RDb25zdW1lciAqdGFrZUFTVENvbnN1bWVyKCkgeyByZXR1cm4gQ29uc3VtZXIucmVsZWFzZSgpOyB9CiAKICAgLy8vIHNldEFTVENvbnN1bWVyIC0gUmVwbGFjZSB0aGUgY3VycmVudCBBU1QgY29uc3VtZXI7IHRoZSBjb21waWxlciBpbnN0YW5jZQogICAvLy8gdGFrZXMgb3duZXJzaGlwIG9mIFxwIFZhbHVlLgpAQCAtNDEzLDI5ICs0NDQsMjcgQEAKICAgLy8vIH0KICAgLy8vIEBuYW1lIFNlbWFudGljIGFuYWx5c2lzCiAgIC8vLyB7Ci0gIGJvb2wgaGFzU2VtYSgpIGNvbnN0IHsgcmV0dXJuIFRoZVNlbWEuaXNWYWxpZCgpOyB9Ci0gIAorICBib29sIGhhc1NlbWEoKSBjb25zdCB7IHJldHVybiAoYm9vbClUaGVTZW1hOyB9CisKICAgU2VtYSAmZ2V0U2VtYSgpIGNvbnN0IHsgCiAgICAgYXNzZXJ0KFRoZVNlbWEgJiYgIkNvbXBpbGVyIGluc3RhbmNlIGhhcyBubyBTZW1hIG9iamVjdCEiKTsKICAgICByZXR1cm4gKlRoZVNlbWE7CiAgIH0KLSAgCi0gIFNlbWEgKnRha2VTZW1hKCkgeyByZXR1cm4gVGhlU2VtYS50YWtlKCk7IH0KLSAgCisKKyAgU2VtYSAqdGFrZVNlbWEoKSB7IHJldHVybiBUaGVTZW1hLnJlbGVhc2UoKTsgfQorCiAgIC8vLyB9CiAgIC8vLyBAbmFtZSBNb2R1bGUgTWFuYWdlbWVudAogICAvLy8gewogCi0gIEFTVFJlYWRlciAqZ2V0TW9kdWxlTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIE1vZHVsZU1hbmFnZXI7IH0KLSAgdm9pZCBzZXRNb2R1bGVNYW5hZ2VyKEFTVFJlYWRlciAqUmVhZGVyKSB7IE1vZHVsZU1hbmFnZXIgPSBSZWFkZXI7IH0KKyAgSW50cnVzaXZlUmVmQ250UHRyPEFTVFJlYWRlcj4gZ2V0TW9kdWxlTWFuYWdlcigpIGNvbnN0OworICB2b2lkIHNldE1vZHVsZU1hbmFnZXIoSW50cnVzaXZlUmVmQ250UHRyPEFTVFJlYWRlcj4gUmVhZGVyKTsKIAogICAvLy8gfQogICAvLy8gQG5hbWUgQ29kZSBDb21wbGV0aW9uCiAgIC8vLyB7CiAKLSAgYm9vbCBoYXNDb2RlQ29tcGxldGlvbkNvbnN1bWVyKCkgY29uc3QgewotICAgIHJldHVybiBDb21wbGV0aW9uQ29uc3VtZXIuaXNWYWxpZCgpOwotICB9CisgIGJvb2wgaGFzQ29kZUNvbXBsZXRpb25Db25zdW1lcigpIGNvbnN0IHsgcmV0dXJuIChib29sKUNvbXBsZXRpb25Db25zdW1lcjsgfQogCiAgIENvZGVDb21wbGV0ZUNvbnN1bWVyICZnZXRDb2RlQ29tcGxldGlvbkNvbnN1bWVyKCkgY29uc3QgewogICAgIGFzc2VydChDb21wbGV0aW9uQ29uc3VtZXIgJiYKQEAgLTQ0Niw3ICs0NzUsNyBAQAogICAvLy8gdGFrZUNvZGVDb21wbGV0aW9uQ29uc3VtZXIgLSBSZW1vdmUgdGhlIGN1cnJlbnQgY29kZSBjb21wbGV0aW9uIGNvbnN1bWVyCiAgIC8vLyBhbmQgZ2l2ZSBvd25lcnNoaXAgdG8gdGhlIGNhbGxlci4KICAgQ29kZUNvbXBsZXRlQ29uc3VtZXIgKnRha2VDb2RlQ29tcGxldGlvbkNvbnN1bWVyKCkgewotICAgIHJldHVybiBDb21wbGV0aW9uQ29uc3VtZXIudGFrZSgpOworICAgIHJldHVybiBDb21wbGV0aW9uQ29uc3VtZXIucmVsZWFzZSgpOwogICB9CiAKICAgLy8vIHNldENvZGVDb21wbGV0aW9uQ29uc3VtZXIgLSBSZXBsYWNlIHRoZSBjdXJyZW50IGNvZGUgY29tcGxldGlvbiBjb25zdW1lcjsKQEAgLTQ1Nyw3ICs0ODYsNyBAQAogICAvLy8gQG5hbWUgRnJvbnRlbmQgdGltZXIKICAgLy8vIHsKIAotICBib29sIGhhc0Zyb250ZW5kVGltZXIoKSBjb25zdCB7IHJldHVybiBGcm9udGVuZFRpbWVyLmlzVmFsaWQoKTsgfQorICBib29sIGhhc0Zyb250ZW5kVGltZXIoKSBjb25zdCB7IHJldHVybiAoYm9vbClGcm9udGVuZFRpbWVyOyB9CiAKICAgbGx2bTo6VGltZXIgJmdldEZyb250ZW5kVGltZXIoKSBjb25zdCB7CiAgICAgYXNzZXJ0KEZyb250ZW5kVGltZXIgJiYgIkNvbXBpbGVyIGluc3RhbmNlIGhhcyBubyBmcm9udGVuZCB0aW1lciEiKTsKQEAgLTUzMCw3ICs1NTksNyBAQAogCiAgIC8vLyBDcmVhdGUgdGhlIHByZXByb2Nlc3NvciwgdXNpbmcgdGhlIGludm9jYXRpb24sIGZpbGUsIGFuZCBzb3VyY2UgbWFuYWdlcnMsCiAgIC8vLyBhbmQgcmVwbGFjZSBhbnkgZXhpc3Rpbmcgb25lIHdpdGggaXQuCi0gIHZvaWQgY3JlYXRlUHJlcHJvY2Vzc29yKCk7CisgIHZvaWQgY3JlYXRlUHJlcHJvY2Vzc29yKFRyYW5zbGF0aW9uVW5pdEtpbmQgVFVLaW5kKTsKIAogICAvLy8gQ3JlYXRlIHRoZSBBU1QgY29udGV4dC4KICAgdm9pZCBjcmVhdGVBU1RDb250ZXh0KCk7CkBAIC02NTMsMTYgKzY4MiwxMyBAQAogICAgICAgICAgICAgICAgIGNvbnN0IEZyb250ZW5kT3B0aW9ucyAmT3B0cyk7CiAKICAgLy8vIH0KLSAgCi0gIHZpcnR1YWwgTW9kdWxlTG9hZFJlc3VsdCBsb2FkTW9kdWxlKFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlSWRQYXRoIFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZTo6TmFtZVZpc2liaWxpdHlLaW5kIFZpc2liaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbmNsdXNpb25EaXJlY3RpdmUpOwogCi0gIHZpcnR1YWwgdm9pZCBtYWtlTW9kdWxlVmlzaWJsZShNb2R1bGUgKk1vZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZTo6TmFtZVZpc2liaWxpdHlLaW5kIFZpc2liaWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKTsKKyAgTW9kdWxlTG9hZFJlc3VsdCBsb2FkTW9kdWxlKFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYywgTW9kdWxlSWRQYXRoIFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGU6Ok5hbWVWaXNpYmlsaXR5S2luZCBWaXNpYmlsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0luY2x1c2lvbkRpcmVjdGl2ZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBtYWtlTW9kdWxlVmlzaWJsZShNb2R1bGUgKk1vZCwgTW9kdWxlOjpOYW1lVmlzaWJpbGl0eUtpbmQgVmlzaWJpbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsIGJvb2wgQ29tcGxhaW4pIG92ZXJyaWRlOwogCiAgIGJvb2wgaGFkTW9kdWxlTG9hZGVyRmF0YWxGYWlsdXJlKCkgY29uc3QgewogICAgIHJldHVybiBNb2R1bGVMb2FkZXI6OkhhZEZhdGFsRmFpbHVyZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRGVwZW5kZW5jeU91dHB1dE9wdGlvbnMuaCBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRGVwZW5kZW5jeU91dHB1dE9wdGlvbnMuaAppbmRleCBmZWZiNmYzLi5kMjc1MjQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0RlcGVuZGVuY3lPdXRwdXRPcHRpb25zLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9EZXBlbmRlbmN5T3V0cHV0T3B0aW9ucy5oCkBAIC0yNiw2ICsyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIHByb2JsZW1zLgogICB1bnNpZ25lZCBBZGRNaXNzaW5nSGVhZGVyRGVwcyA6IDE7IC8vLzwgQWRkIG1pc3NpbmcgaGVhZGVycyB0byBkZXBlbmRlbmN5IGxpc3QKICAgdW5zaWduZWQgUHJpbnRTaG93SW5jbHVkZXMgOiAxOyAvLy88IFByaW50IGNsLmV4ZSBzdHlsZSAvc2hvd0luY2x1ZGVzIGluZm8uCisgIHVuc2lnbmVkIEluY2x1ZGVNb2R1bGVGaWxlcyA6IDE7IC8vLzwgSW5jbHVkZSBtb2R1bGUgZmlsZSBkZXBlbmRlbmNpZXMuCiAgIAogICAvLy8gVGhlIGZpbGUgdG8gd3JpdGUgZGVwZW5kZW5jeSBvdXRwdXQgdG8uCiAgIHN0ZDo6c3RyaW5nIE91dHB1dEZpbGU7CkBAIC01MCw2ICs1MSw3IEBACiAgICAgVXNlUGhvbnlUYXJnZXRzID0gMDsKICAgICBBZGRNaXNzaW5nSGVhZGVyRGVwcyA9IDA7CiAgICAgUHJpbnRTaG93SW5jbHVkZXMgPSAwOworICAgIEluY2x1ZGVNb2R1bGVGaWxlcyA9IDA7CiAgIH0KIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRGlhZ25vc3RpY1JlbmRlcmVyLmggYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0RpYWdub3N0aWNSZW5kZXJlci5oCmluZGV4IGYzY2QwNTQuLmY1NTRiODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRGlhZ25vc3RpY1JlbmRlcmVyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9EaWFnbm9zdGljUmVuZGVyZXIuaApAQCAtMTU4LDIwICsxNTgsMTkgQEAKICAgICA6IERpYWdub3N0aWNSZW5kZXJlcihMYW5nT3B0cywgRGlhZ09wdHMpIHt9CiAgIAogICB2aXJ0dWFsIH5EaWFnbm9zdGljTm90ZVJlbmRlcmVyKCk7Ci0gIAotICB2aXJ0dWFsIHZvaWQgZW1pdEJhc2ljTm90ZShTdHJpbmdSZWYgTWVzc2FnZSk7Ci0gICAgCi0gIHZpcnR1YWwgdm9pZCBlbWl0SW5jbHVkZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlc3VtZWRMb2MgUExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00pOwogCi0gIHZpcnR1YWwgdm9pZCBlbWl0SW1wb3J0TG9jYXRpb24oU291cmNlTG9jYXRpb24gTG9jLCBQcmVzdW1lZExvYyBQTG9jLAorICB2b2lkIGVtaXRCYXNpY05vdGUoU3RyaW5nUmVmIE1lc3NhZ2UpIG92ZXJyaWRlOworCisgIHZvaWQgZW1pdEluY2x1ZGVMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MsIFByZXN1bWVkTG9jIFBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBlbWl0SW1wb3J0TG9jYXRpb24oU291cmNlTG9jYXRpb24gTG9jLCBQcmVzdW1lZExvYyBQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTW9kdWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00pIG92ZXJyaWRlOworCisgIHZvaWQgZW1pdEJ1aWxkaW5nTW9kdWxlTG9jYXRpb24oU291cmNlTG9jYXRpb24gTG9jLCBQcmVzdW1lZExvYyBQTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNb2R1bGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKTsKLQotICB2aXJ0dWFsIHZvaWQgZW1pdEJ1aWxkaW5nTW9kdWxlTG9jYXRpb24oU291cmNlTG9jYXRpb24gTG9jLCBQcmVzdW1lZExvYyBQTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1vZHVsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00pIG92ZXJyaWRlOwogCiAgIHZpcnR1YWwgdm9pZCBlbWl0Tm90ZShTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAqU00pID0gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb24uaCBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb24uaAppbmRleCBhNTY4YmEwLi44YzI0NTEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9uLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbi5oCkBAIC0yMSw4ICsyMSw4IEBACiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmgiCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRPcHRpb25zLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKQEAgLTM1LDcgKzM1LDcgQEAKIC8vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhY3Rpb25zIHdoaWNoIGNhbiBiZSBwZXJmb3JtZWQgYnkgdGhlIGZyb250ZW5kLgogY2xhc3MgRnJvbnRlbmRBY3Rpb24gewogICBGcm9udGVuZElucHV0RmlsZSBDdXJyZW50SW5wdXQ7Ci0gIE93bmluZ1B0cjxBU1RVbml0PiBDdXJyZW50QVNUVW5pdDsKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVFVuaXQ+IEN1cnJlbnRBU1RVbml0OwogICBDb21waWxlckluc3RhbmNlICpJbnN0YW5jZTsKICAgZnJpZW5kIGNsYXNzIEFTVE1lcmdlQWN0aW9uOwogICBmcmllbmQgY2xhc3MgV3JhcHBlckZyb250ZW5kQWN0aW9uOwpAQCAtMTI0LDcgKzEyNCw3IEBACiAKICAgYm9vbCBpc0N1cnJlbnRGaWxlQVNUKCkgY29uc3QgewogICAgIGFzc2VydCghQ3VycmVudElucHV0LmlzRW1wdHkoKSAmJiAiTm8gY3VycmVudCBmaWxlISIpOwotICAgIHJldHVybiBDdXJyZW50QVNUVW5pdC5pc1ZhbGlkKCk7CisgICAgcmV0dXJuIChib29sKUN1cnJlbnRBU1RVbml0OwogICB9CiAKICAgY29uc3QgRnJvbnRlbmRJbnB1dEZpbGUgJmdldEN1cnJlbnRJbnB1dCgpIGNvbnN0IHsKQEAgLTE0Niw5ICsxNDYsNyBAQAogICAgIHJldHVybiAqQ3VycmVudEFTVFVuaXQ7CiAgIH0KIAotICBBU1RVbml0ICp0YWtlQ3VycmVudEFTVFVuaXQoKSB7Ci0gICAgcmV0dXJuIEN1cnJlbnRBU1RVbml0LnRha2UoKTsKLSAgfQorICBBU1RVbml0ICp0YWtlQ3VycmVudEFTVFVuaXQoKSB7IHJldHVybiBDdXJyZW50QVNUVW5pdC5yZWxlYXNlKCk7IH0KIAogICB2b2lkIHNldEN1cnJlbnRJbnB1dChjb25zdCBGcm9udGVuZElucHV0RmlsZSAmQ3VycmVudElucHV0LCBBU1RVbml0ICpBU1QgPSAwKTsKIApAQCAtMjIwLDE3ICsyMTgsMTcgQEAKICAgLy8vCiAgIC8vLyBUaGlzIHdpbGwgYWxzbyB0YWtlIGNhcmUgb2YgaW5zdGFudGlhdGluZyBhIGNvZGUgY29tcGxldGlvbiBjb25zdW1lciBpZgogICAvLy8gdGhlIHVzZXIgcmVxdWVzdGVkIGl0IGFuZCB0aGUgYWN0aW9uIHN1cHBvcnRzIGl0LgotICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZUFjdGlvbigpOworICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKIAogcHVibGljOgotICB2aXJ0dWFsIGJvb2wgdXNlc1ByZXByb2Nlc3Nvck9ubHkoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBib29sIHVzZXNQcmVwcm9jZXNzb3JPbmx5KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIH07CiAKIGNsYXNzIFBsdWdpbkFTVEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7CiAgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpID0gMDsKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGUgPSAwOwogCiBwdWJsaWM6CiAgIC8vLyBcYnJpZWYgUGFyc2UgdGhlIGdpdmVuIHBsdWdpbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgpAQCAtMjQ4LDExICsyNDYsMTEgQEAKIHByb3RlY3RlZDoKICAgLy8vIFxicmllZiBQcm92aWRlIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aGljaCByZXR1cm5zIGFib3J0czsKICAgLy8vIHRoaXMgbWV0aG9kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnkgRnJvbnRlbmRBY3Rpb24gY2xpZW50cy4KLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpOworICBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKIAogcHVibGljOgotICB2aXJ0dWFsIGJvb2wgdXNlc1ByZXByb2Nlc3Nvck9ubHkoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgdXNlc1ByZXByb2Nlc3Nvck9ubHkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiB9OwogCiAvLy8gXGJyaWVmIEEgZnJvbnRlbmQgYWN0aW9uIHdoaWNoIHNpbXBseSB3cmFwcyBzb21lIG90aGVyIHJ1bnRpbWUtc3BlY2lmaWVkCkBAIC0yNjIsMjggKzI2MCwyNyBAQAogLy8vIHNvbWUgZXhpc3RpbmcgYWN0aW9uJ3MgYmVoYXZpb3IuIEl0IGltcGxlbWVudHMgZXZlcnkgdmlydHVhbCBtZXRob2QgaW4KIC8vLyB0aGUgRnJvbnRlbmRBY3Rpb24gaW50ZXJmYWNlIGJ5IGZvcndhcmRpbmcgdG8gdGhlIHdyYXBwZWQgYWN0aW9uLgogY2xhc3MgV3JhcHBlckZyb250ZW5kQWN0aW9uIDogcHVibGljIEZyb250ZW5kQWN0aW9uIHsKLSAgT3duaW5nUHRyPEZyb250ZW5kQWN0aW9uPiBXcmFwcGVkQWN0aW9uOworICBzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb24+IFdyYXBwZWRBY3Rpb247CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpOwotICB2aXJ0dWFsIGJvb2wgQmVnaW5JbnZvY2F0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJKTsKLSAgdmlydHVhbCBib29sIEJlZ2luU291cmNlRmlsZUFjdGlvbihDb21waWxlckluc3RhbmNlICZDSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZW5hbWUpOwotICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZUFjdGlvbigpOwotICB2aXJ0dWFsIHZvaWQgRW5kU291cmNlRmlsZUFjdGlvbigpOworICBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKKyAgYm9vbCBCZWdpbkludm9jYXRpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIG92ZXJyaWRlOworICBib29sIEJlZ2luU291cmNlRmlsZUFjdGlvbihDb21waWxlckluc3RhbmNlICZDSSwgU3RyaW5nUmVmIEZpbGVuYW1lKSBvdmVycmlkZTsKKyAgdm9pZCBFeGVjdXRlQWN0aW9uKCkgb3ZlcnJpZGU7CisgIHZvaWQgRW5kU291cmNlRmlsZUFjdGlvbigpIG92ZXJyaWRlOwogCiBwdWJsaWM6CiAgIC8vLyBDb25zdHJ1Y3QgYSBXcmFwcGVyRnJvbnRlbmRBY3Rpb24gZnJvbSBhbiBleGlzdGluZyBhY3Rpb24sIHRha2luZwogICAvLy8gb3duZXJzaGlwIG9mIGl0LgogICBXcmFwcGVyRnJvbnRlbmRBY3Rpb24oRnJvbnRlbmRBY3Rpb24gKldyYXBwZWRBY3Rpb24pOwogCi0gIHZpcnR1YWwgYm9vbCB1c2VzUHJlcHJvY2Vzc29yT25seSgpIGNvbnN0OwotICB2aXJ0dWFsIFRyYW5zbGF0aW9uVW5pdEtpbmQgZ2V0VHJhbnNsYXRpb25Vbml0S2luZCgpOwotICB2aXJ0dWFsIGJvb2wgaGFzUENIU3VwcG9ydCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgaGFzQVNURmlsZVN1cHBvcnQoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIGhhc0lSU3VwcG9ydCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgaGFzQ29kZUNvbXBsZXRpb25TdXBwb3J0KCkgY29uc3Q7CisgIGJvb2wgdXNlc1ByZXByb2Nlc3Nvck9ubHkoKSBjb25zdCBvdmVycmlkZTsKKyAgVHJhbnNsYXRpb25Vbml0S2luZCBnZXRUcmFuc2xhdGlvblVuaXRLaW5kKCkgb3ZlcnJpZGU7CisgIGJvb2wgaGFzUENIU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0FTVEZpbGVTdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzSVJTdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ29kZUNvbXBsZXRpb25TdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiB9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5oIGIvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaAppbmRleCBmM2QxMjc2Li5hNWRiMjUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmgKQEAgLTIzLDE1ICsyMywxNSBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogY2xhc3MgSW5pdE9ubHlBY3Rpb24gOiBwdWJsaWMgRnJvbnRlbmRBY3Rpb24gewotICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZUFjdGlvbigpOworICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIEFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSk7CisgIEFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOwogCiBwdWJsaWM6CiAgIC8vIERvbid0IGNsYWltIHRvIG9ubHkgdXNlIHRoZSBwcmVwcm9jZXNzb3IsIHdlIHdhbnQgdG8gZm9sbG93IHRoZSBBU1QgcGF0aCwKICAgLy8gYnV0IGRvIG5vdGhpbmcuCi0gIHZpcnR1YWwgYm9vbCB1c2VzUHJlcHJvY2Vzc29yT25seSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgdXNlc1ByZXByb2Nlc3Nvck9ubHkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogfTsKIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTQwLDQ0ICs0MCw0NCBAQAogCiBjbGFzcyBBU1RQcmludEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKTsKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBBU1REdW1wQWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpOworICBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIEFTVERlY2xMaXN0QWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpOworICBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIEFTVFZpZXdBY3Rpb24gOiBwdWJsaWMgQVNURnJvbnRlbmRBY3Rpb24gewogcHJvdGVjdGVkOgotICB2aXJ0dWFsIEFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSk7CisgIEFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgRGVjbENvbnRleHRQcmludEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKTsKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBHZW5lcmF0ZVBDSEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKTsKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBUcmFuc2xhdGlvblVuaXRLaW5kIGdldFRyYW5zbGF0aW9uVW5pdEtpbmQoKSB7CisgIFRyYW5zbGF0aW9uVW5pdEtpbmQgZ2V0VHJhbnNsYXRpb25Vbml0S2luZCgpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gVFVfUHJlZml4OwogICB9CiAKLSAgdmlydHVhbCBib29sIGhhc0FTVEZpbGVTdXBwb3J0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgYm9vbCBoYXNBU1RGaWxlU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiAKIHB1YmxpYzoKICAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBBU1QgY29uc3VtZXIgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSB1c2VkIHRvCkBAIC05NiwyMSArOTYsMjEgQEAKICAgYm9vbCBJc1N5c3RlbTsKICAgCiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKTsKLSAgCi0gIHZpcnR1YWwgVHJhbnNsYXRpb25Vbml0S2luZCBnZXRUcmFuc2xhdGlvblVuaXRLaW5kKCkgeyAKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CisKKyAgVHJhbnNsYXRpb25Vbml0S2luZCBnZXRUcmFuc2xhdGlvblVuaXRLaW5kKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBUVV9Nb2R1bGU7CiAgIH0KLSAgCi0gIHZpcnR1YWwgYm9vbCBoYXNBU1RGaWxlU3VwcG9ydCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIAorCisgIGJvb2wgaGFzQVNURmlsZVN1cHBvcnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCiBwdWJsaWM6CiAgIGV4cGxpY2l0IEdlbmVyYXRlTW9kdWxlQWN0aW9uKGJvb2wgSXNTeXN0ZW0gPSBmYWxzZSkKICAgICA6IEFTVEZyb250ZW5kQWN0aW9uKCksIElzU3lzdGVtKElzU3lzdGVtKSB7IH0KIAotICB2aXJ0dWFsIGJvb2wgQmVnaW5Tb3VyY2VGaWxlQWN0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJLCBTdHJpbmdSZWYgRmlsZW5hbWUpOwotICAKKyAgYm9vbCBCZWdpblNvdXJjZUZpbGVBY3Rpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0ksIFN0cmluZ1JlZiBGaWxlbmFtZSkgb3ZlcnJpZGU7CisKICAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBBU1QgY29uc3VtZXIgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSB1c2VkIHRvCiAgIC8vLyBjcmVhdGUgdGhlIFBDSEdlbmVyYXRvciBpbnN0YW5jZSByZXR1cm5lZCBieSBDcmVhdGVBU1RDb25zdW1lci4KICAgLy8vCkBAIC0xMjQsMjYgKzEyNCwzNyBAQAogCiBjbGFzcyBTeW50YXhPbmx5QWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpOworICBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOwogCiBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBoYXNDb2RlQ29tcGxldGlvblN1cHBvcnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgaGFzQ29kZUNvbXBsZXRpb25TdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogfTsKIAogLy8vIFxicmllZiBEdW1wIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnaXZlbiBtb2R1bGUgZmlsZSwgdG8gYmUgdXNlZCBmb3IKIC8vLyBiYXNpYyBkZWJ1Z2dpbmcgYW5kIGRpc2NvdmVyeS4KIGNsYXNzIER1bXBNb2R1bGVJbmZvQWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpOwotICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZUFjdGlvbigpOwotICAKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CisgIHZvaWQgRXhlY3V0ZUFjdGlvbigpIG92ZXJyaWRlOworCiBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBoYXNQQ0hTdXBwb3J0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGhhc0FTVEZpbGVTdXBwb3J0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICB2aXJ0dWFsIGJvb2wgaGFzSVJTdXBwb3J0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGhhc0NvZGVDb21wbGV0aW9uU3VwcG9ydCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgaGFzUENIU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgaGFzQVNURmlsZVN1cHBvcnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgaGFzSVJTdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgYm9vbCBoYXNDb2RlQ29tcGxldGlvblN1cHBvcnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorfTsKKworY2xhc3MgVmVyaWZ5UENIQWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBFeGVjdXRlQWN0aW9uKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgYm9vbCBoYXNDb2RlQ29tcGxldGlvblN1cHBvcnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogfTsKIAogLyoqCkBAIC0xNjIsMzQgKzE3MywzNCBAQAogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQVNURmlsZXM7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpOworICBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIGJvb2wgQmVnaW5Tb3VyY2VGaWxlQWN0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlbmFtZSk7CisgIGJvb2wgQmVnaW5Tb3VyY2VGaWxlQWN0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZW5hbWUpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBFeGVjdXRlQWN0aW9uKCk7Ci0gIHZpcnR1YWwgdm9pZCBFbmRTb3VyY2VGaWxlQWN0aW9uKCk7CisgIHZvaWQgRXhlY3V0ZUFjdGlvbigpIG92ZXJyaWRlOworICB2b2lkIEVuZFNvdXJjZUZpbGVBY3Rpb24oKSBvdmVycmlkZTsKIAogcHVibGljOgogICBBU1RNZXJnZUFjdGlvbihGcm9udGVuZEFjdGlvbiAqQWRhcHRlZEFjdGlvbiwgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IEFTVEZpbGVzKTsKICAgdmlydHVhbCB+QVNUTWVyZ2VBY3Rpb24oKTsKIAotICB2aXJ0dWFsIGJvb2wgdXNlc1ByZXByb2Nlc3Nvck9ubHkoKSBjb25zdDsKLSAgdmlydHVhbCBUcmFuc2xhdGlvblVuaXRLaW5kIGdldFRyYW5zbGF0aW9uVW5pdEtpbmQoKTsKLSAgdmlydHVhbCBib29sIGhhc1BDSFN1cHBvcnQoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIGhhc0FTVEZpbGVTdXBwb3J0KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBoYXNDb2RlQ29tcGxldGlvblN1cHBvcnQoKSBjb25zdDsKKyAgYm9vbCB1c2VzUHJlcHJvY2Vzc29yT25seSgpIGNvbnN0IG92ZXJyaWRlOworICBUcmFuc2xhdGlvblVuaXRLaW5kIGdldFRyYW5zbGF0aW9uVW5pdEtpbmQoKSBvdmVycmlkZTsKKyAgYm9vbCBoYXNQQ0hTdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQVNURmlsZVN1cHBvcnQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDb2RlQ29tcGxldGlvblN1cHBvcnQoKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIGNsYXNzIFByaW50UHJlYW1ibGVBY3Rpb24gOiBwdWJsaWMgRnJvbnRlbmRBY3Rpb24gewogcHJvdGVjdGVkOgotICB2b2lkIEV4ZWN1dGVBY3Rpb24oKTsKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmLCBTdHJpbmdSZWYpIHsgCi0gICAgcmV0dXJuIDA7IAorICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJiwgU3RyaW5nUmVmKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIDA7CiAgIH0KLSAgCi0gIHZpcnR1YWwgYm9vbCB1c2VzUHJlcHJvY2Vzc29yT25seSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICBib29sIHVzZXNQcmVwcm9jZXNzb3JPbmx5KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogfTsKICAgCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtMTk4LDI5ICsyMDksMjkgQEAKIAogY2xhc3MgRHVtcFJhd1Rva2Vuc0FjdGlvbiA6IHB1YmxpYyBQcmVwcm9jZXNzb3JGcm9udGVuZEFjdGlvbiB7CiBwcm90ZWN0ZWQ6Ci0gIHZvaWQgRXhlY3V0ZUFjdGlvbigpOworICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIER1bXBUb2tlbnNBY3Rpb24gOiBwdWJsaWMgUHJlcHJvY2Vzc29yRnJvbnRlbmRBY3Rpb24gewogcHJvdGVjdGVkOgotICB2b2lkIEV4ZWN1dGVBY3Rpb24oKTsKKyAgdm9pZCBFeGVjdXRlQWN0aW9uKCkgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBHZW5lcmF0ZVBUSEFjdGlvbiA6IHB1YmxpYyBQcmVwcm9jZXNzb3JGcm9udGVuZEFjdGlvbiB7CiBwcm90ZWN0ZWQ6Ci0gIHZvaWQgRXhlY3V0ZUFjdGlvbigpOworICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIFByZXByb2Nlc3NPbmx5QWN0aW9uIDogcHVibGljIFByZXByb2Nlc3NvckZyb250ZW5kQWN0aW9uIHsKIHByb3RlY3RlZDoKLSAgdm9pZCBFeGVjdXRlQWN0aW9uKCk7CisgIHZvaWQgRXhlY3V0ZUFjdGlvbigpIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgUHJpbnRQcmVwcm9jZXNzZWRBY3Rpb24gOiBwdWJsaWMgUHJlcHJvY2Vzc29yRnJvbnRlbmRBY3Rpb24gewogcHJvdGVjdGVkOgotICB2b2lkIEV4ZWN1dGVBY3Rpb24oKTsKKyAgdm9pZCBFeGVjdXRlQWN0aW9uKCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBib29sIGhhc1BDSFN1cHBvcnQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgaGFzUENIU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIH07CiAgIAogfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Gcm9udGVuZE9wdGlvbnMuaCBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRPcHRpb25zLmgKaW5kZXggNGIzMjFlOC4uZmMxM2IxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Gcm9udGVuZE9wdGlvbnMuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0Zyb250ZW5kT3B0aW9ucy5oCkBAIC00Myw2ICs0Myw3IEBACiAgICAgR2VuZXJhdGVQVEgsICAgICAgICAgICAgLy8vPCBHZW5lcmF0ZSBwcmUtdG9rZW5pemVkIGhlYWRlci4KICAgICBJbml0T25seSwgICAgICAgICAgICAgICAvLy88IE9ubHkgZXhlY3V0ZSBmcm9udGVuZCBpbml0aWFsaXphdGlvbi4KICAgICBNb2R1bGVGaWxlSW5mbywgICAgICAgICAvLy88IER1bXAgaW5mb3JtYXRpb24gYWJvdXQgYSBtb2R1bGUgZmlsZS4KKyAgICBWZXJpZnlQQ0gsICAgICAgICAgICAgICAvLy88IExvYWQgYW5kIHZlcmlmeSB0aGF0IGEgUENIIGZpbGUgaXMgdXNhYmxlLgogICAgIFBhcnNlU3ludGF4T25seSwgICAgICAgIC8vLzwgUGFyc2UgYW5kIHBlcmZvcm0gc2VtYW50aWMgYW5hbHlzaXMuCiAgICAgUGx1Z2luQWN0aW9uLCAgICAgICAgICAgLy8vPCBSdW4gYSBwbHVnaW4gYWN0aW9uLCBcc2VlIEFjdGlvbk5hbWUuCiAgICAgUHJpbnREZWNsQ29udGV4dCwgICAgICAgLy8vPCBQcmludCBEZWNsQ29udGV4dCBhbmQgdGhlaXIgRGVjbHMuCkBAIC0xNzksMTAgKzE4MCwxMyBAQAogICAgIE9iakNNVF9SZXR1cm5zSW5uZXJQb2ludGVyUHJvcGVydHkgPSAweDIwMCwKICAgICAvLy8gXGJyaWVmIHVzZSBOU19OT05BVE9NSUNfSU9TT05MWSBmb3IgcHJvcGVydHkgJ2F0b21pYycgYXR0cmlidXRlCiAgICAgT2JqQ01UX05zQXRvbWljSU9TT25seVByb3BlcnR5ID0gMHg0MDAsCisgICAgLy8vIFxicmllZiBFbmFibGUgaW5mZXJyaW5nIE5TX0RFU0lHTkFURURfSU5JVElBTElaRVIgZm9yIE9iakMgbWV0aG9kcy4KKyAgICBPYmpDTVRfRGVzaWduYXRlZEluaXRpYWxpemVyID0gMHg4MDAsCiAgICAgT2JqQ01UX01pZ3JhdGVEZWNscyA9IChPYmpDTVRfUmVhZG9ubHlQcm9wZXJ0eSB8IE9iakNNVF9SZWFkd3JpdGVQcm9wZXJ0eSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTVRfQW5ub3RhdGlvbiB8IE9iakNNVF9JbnN0YW5jZXR5cGUgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01UX05zTWFjcm9zIHwgT2JqQ01UX1Byb3RvY29sQ29uZm9ybWFuY2UgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01UX05zQXRvbWljSU9TT25seVByb3BlcnR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNVF9Oc0F0b21pY0lPU09ubHlQcm9wZXJ0eSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTVRfRGVzaWduYXRlZEluaXRpYWxpemVyKSwKICAgICBPYmpDTVRfTWlncmF0ZUFsbCA9IChPYmpDTVRfTGl0ZXJhbHMgfCBPYmpDTVRfU3Vic2NyaXB0aW5nIHwgT2JqQ01UX01pZ3JhdGVEZWNscykKICAgfTsKICAgdW5zaWduZWQgT2JqQ01UQWN0aW9uOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9MYXlvdXRPdmVycmlkZVNvdXJjZS5oIGIvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9MYXlvdXRPdmVycmlkZVNvdXJjZS5oCmluZGV4IGVjMzRlMTQuLjE2ZDAzMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvTGF5b3V0T3ZlcnJpZGVTb3VyY2UuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0xheW91dE92ZXJyaWRlU291cmNlLmgKQEAgLTQ3LDEyICs0NywxMyBAQAogICAgIAogICAgIC8vLyBcYnJpZWYgSWYgdGhpcyBwYXJ0aWN1bGFyIHJlY29yZCB0eXBlIGhhcyBhbiBvdmVycmlkZGVuIGxheW91dCwKICAgICAvLy8gcmV0dXJuIHRoYXQgbGF5b3V0LgotICAgIHZpcnR1YWwgYm9vbCAKKyAgICBib29sCiAgICAgbGF5b3V0UmVjb3JkVHlwZShjb25zdCBSZWNvcmREZWNsICpSZWNvcmQsCiAgICAgICAgdWludDY0X3QgJlNpemUsIHVpbnQ2NF90ICZBbGlnbm1lbnQsCiAgICAgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRmllbGREZWNsICosIHVpbnQ2NF90PiAmRmllbGRPZmZzZXRzLAogICAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IENYWFJlY29yZERlY2wgKiwgQ2hhclVuaXRzPiAmQmFzZU9mZnNldHMsCi0gICAgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCBDaGFyVW5pdHM+ICZWaXJ0dWFsQmFzZU9mZnNldHMpOworICAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IENYWFJlY29yZERlY2wgKiwKKyAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHM+ICZWaXJ0dWFsQmFzZU9mZnNldHMpIG92ZXJyaWRlOwogICAgIAogICAgIC8vLyBcYnJpZWYgRHVtcCB0aGUgb3ZlcnJpZGRlbiBsYXlvdXRzLgogICAgIHZvaWQgZHVtcCgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Mb2dEaWFnbm9zdGljUHJpbnRlci5oIGIvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9Mb2dEaWFnbm9zdGljUHJpbnRlci5oCmluZGV4IGU4YTZiYjMuLjRlZjY0M2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvTG9nRGlhZ25vc3RpY1ByaW50ZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL0xvZ0RpYWdub3N0aWNQcmludGVyLmgKQEAgLTYyLDE0ICs2MiwxNCBAQAogICAgIER3YXJmRGVidWdGbGFncyA9IFZhbHVlOwogICB9CiAKLSAgdm9pZCBCZWdpblNvdXJjZUZpbGUoY29uc3QgTGFuZ09wdGlvbnMgJkxPLCBjb25zdCBQcmVwcm9jZXNzb3IgKlBQKSB7CisgIHZvaWQgQmVnaW5Tb3VyY2VGaWxlKGNvbnN0IExhbmdPcHRpb25zICZMTywgY29uc3QgUHJlcHJvY2Vzc29yICpQUCkgb3ZlcnJpZGUgewogICAgIExhbmdPcHRzID0gJkxPOwogICB9CiAKLSAgdm9pZCBFbmRTb3VyY2VGaWxlKCk7CisgIHZvaWQgRW5kU291cmNlRmlsZSgpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pOworICB2b2lkIEhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIERpYWdMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pIG92ZXJyaWRlOwogfTsKIAogfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL011bHRpcGxleENvbnN1bWVyLmggYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL011bHRpcGxleENvbnN1bWVyLmgKaW5kZXggNmVhNzU0Ny4uNmVhMWQ3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9NdWx0aXBsZXhDb25zdW1lci5oCisrKyBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvTXVsdGlwbGV4Q29uc3VtZXIuaApAQCAtMTcsNyArMTcsNyBAQAogCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2VtYUNvbnN1bWVyLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGNsYW5nIHsKQEAgLTMzLDI4ICszMywyOCBAQAogICB+TXVsdGlwbGV4Q29uc3VtZXIoKTsKIAogICAvLyBBU1RDb25zdW1lcgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDb250ZXh0KTsKLSAgdmlydHVhbCB2b2lkIEhhbmRsZUNYWFN0YXRpY01lbWJlclZhckluc3RhbnRpYXRpb24oVmFyRGVjbCAqVkQpOwotICB2aXJ0dWFsIGJvb2wgSGFuZGxlVG9wTGV2ZWxEZWNsKERlY2xHcm91cFJlZiBEKTsKLSAgdmlydHVhbCB2b2lkIEhhbmRsZUludGVyZXN0aW5nRGVjbChEZWNsR3JvdXBSZWYgRCk7Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVUcmFuc2xhdGlvblVuaXQoQVNUQ29udGV4dCAmQ3R4KTsKLSAgdmlydHVhbCB2b2lkIEhhbmRsZVRhZ0RlY2xEZWZpbml0aW9uKFRhZ0RlY2wgKkQpOwotICB2aXJ0dWFsIHZvaWQgSGFuZGxlQ1hYSW1wbGljaXRGdW5jdGlvbkluc3RhbnRpYXRpb24oRnVuY3Rpb25EZWNsICpEKTsKLSAgdmlydHVhbCB2b2lkIEhhbmRsZVRvcExldmVsRGVjbEluT2JqQ0NvbnRhaW5lcihEZWNsR3JvdXBSZWYgRCk7Ci0gIHZpcnR1YWwgdm9pZCBDb21wbGV0ZVRlbnRhdGl2ZURlZmluaXRpb24oVmFyRGVjbCAqRCk7Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVWVGFibGUoQ1hYUmVjb3JkRGVjbCAqUkQsIGJvb2wgRGVmaW5pdGlvblJlcXVpcmVkKTsKLSAgdmlydHVhbCBBU1RNdXRhdGlvbkxpc3RlbmVyICpHZXRBU1RNdXRhdGlvbkxpc3RlbmVyKCk7Ci0gIHZpcnR1YWwgQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIgKkdldEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyKCk7Ci0gIHZpcnR1YWwgdm9pZCBQcmludFN0YXRzKCk7CisgIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDb250ZXh0KSBvdmVycmlkZTsKKyAgdm9pZCBIYW5kbGVDWFhTdGF0aWNNZW1iZXJWYXJJbnN0YW50aWF0aW9uKFZhckRlY2wgKlZEKSBvdmVycmlkZTsKKyAgYm9vbCBIYW5kbGVUb3BMZXZlbERlY2woRGVjbEdyb3VwUmVmIEQpIG92ZXJyaWRlOworICB2b2lkIEhhbmRsZUludGVyZXN0aW5nRGVjbChEZWNsR3JvdXBSZWYgRCkgb3ZlcnJpZGU7CisgIHZvaWQgSGFuZGxlVHJhbnNsYXRpb25Vbml0KEFTVENvbnRleHQgJkN0eCkgb3ZlcnJpZGU7CisgIHZvaWQgSGFuZGxlVGFnRGVjbERlZmluaXRpb24oVGFnRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgSGFuZGxlQ1hYSW1wbGljaXRGdW5jdGlvbkluc3RhbnRpYXRpb24oRnVuY3Rpb25EZWNsICpEKSBvdmVycmlkZTsKKyAgdm9pZCBIYW5kbGVUb3BMZXZlbERlY2xJbk9iakNDb250YWluZXIoRGVjbEdyb3VwUmVmIEQpIG92ZXJyaWRlOworICB2b2lkIENvbXBsZXRlVGVudGF0aXZlRGVmaW5pdGlvbihWYXJEZWNsICpEKSBvdmVycmlkZTsKKyAgdm9pZCBIYW5kbGVWVGFibGUoQ1hYUmVjb3JkRGVjbCAqUkQsIGJvb2wgRGVmaW5pdGlvblJlcXVpcmVkKSBvdmVycmlkZTsKKyAgQVNUTXV0YXRpb25MaXN0ZW5lciAqR2V0QVNUTXV0YXRpb25MaXN0ZW5lcigpIG92ZXJyaWRlOworICBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lciAqR2V0QVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIoKSBvdmVycmlkZTsKKyAgdm9pZCBQcmludFN0YXRzKCkgb3ZlcnJpZGU7CiAKICAgLy8gU2VtYUNvbnN1bWVyCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplU2VtYShTZW1hICZTKTsKLSAgdmlydHVhbCB2b2lkIEZvcmdldFNlbWEoKTsKKyAgdm9pZCBJbml0aWFsaXplU2VtYShTZW1hICZTKSBvdmVycmlkZTsKKyAgdm9pZCBGb3JnZXRTZW1hKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgIHN0ZDo6dmVjdG9yPEFTVENvbnN1bWVyKj4gQ29uc3VtZXJzOyAgLy8gT3ducyB0aGVzZS4KLSAgT3duaW5nUHRyPE11bHRpcGxleEFTVE11dGF0aW9uTGlzdGVuZXI+IE11dGF0aW9uTGlzdGVuZXI7Ci0gIE93bmluZ1B0cjxNdWx0aXBsZXhBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lcj4gRGVzZXJpYWxpemF0aW9uTGlzdGVuZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxNdWx0aXBsZXhBU1RNdXRhdGlvbkxpc3RlbmVyPiBNdXRhdGlvbkxpc3RlbmVyOworICBzdGQ6OnVuaXF1ZV9wdHI8TXVsdGlwbGV4QVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXI+IERlc2VyaWFsaXphdGlvbkxpc3RlbmVyOwogfTsKIAogfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9TZXJpYWxpemVkRGlhZ25vc3RpY1ByaW50ZXIuaCBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvU2VyaWFsaXplZERpYWdub3N0aWNQcmludGVyLmgKaW5kZXggMTE3NzcxZC4uNGRkYTFmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9TZXJpYWxpemVkRGlhZ25vc3RpY1ByaW50ZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1NlcmlhbGl6ZWREaWFnbm9zdGljUHJpbnRlci5oCkBAIC00Niw2ICs0NiwxOSBAQAogICBSRUNPUkRfTEFTVCA9IFJFQ09SRF9GSVhJVAogfTsKIAorLy8vIEEgc3RhYmxlIHZlcnNpb24gb2YgRGlhZ25vc3RpY0lEczo6TGV2ZWwuCisvLy8KKy8vLyBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB2YWx1ZXMgaW4gdGhpcyBlbnVtLCBhbmQgcGxlYXNlIGluY3JlbWVudCB0aGUKKy8vLyBzZXJpYWxpemVkIGRpYWdub3N0aWNzIHZlcnNpb24gbnVtYmVyIHdoZW4geW91IGFkZCB0byBpdC4KK2VudW0gTGV2ZWwgeworICBJZ25vcmVkID0gMCwKKyAgTm90ZSwKKyAgV2FybmluZywKKyAgRXJyb3IsCisgIEZhdGFsLAorICBSZW1hcmsKK307CisKIC8vLyBcYnJpZWYgUmV0dXJucyBhIERpYWdub3N0aWNDb25zdW1lciB0aGF0IHNlcmlhbGl6ZXMgZGlhZ25vc3RpY3MgdG8KIC8vLyAgYSBiaXRjb2RlIGZpbGUuCiAvLy8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWMuaCBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWMuaAppbmRleCBjOGQwMWIwLi4yYWE5NTc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1RleHREaWFnbm9zdGljLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpYy5oCkBAIC03NywzOCArNzcsMzggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3dDb2xvcnMpOwogCiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBlbWl0RGlhZ25vc3RpY01lc3NhZ2UoU291cmNlTG9jYXRpb24gTG9jLFByZXN1bWVkTG9jIFBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENoYXJTb3VyY2VSYW5nZT4gUmFuZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgKlNNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdPclN0b3JlZERpYWcgRCk7CisgIHZvaWQgZW1pdERpYWdub3N0aWNNZXNzYWdlKFNvdXJjZUxvY2F0aW9uIExvYyxQcmVzdW1lZExvYyBQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDaGFyU291cmNlUmFuZ2U+IFJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAqU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdPclN0b3JlZERpYWcgRCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIGVtaXREaWFnbm9zdGljTG9jKFNvdXJjZUxvY2F0aW9uIExvYywgUHJlc3VtZWRMb2MgUExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENoYXJTb3VyY2VSYW5nZT4gUmFuZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00pOwotICAKLSAgdmlydHVhbCB2b2lkIGVtaXRDb2RlQ29udGV4dChTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDaGFyU291cmNlUmFuZ2U+JiBSYW5nZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Rml4SXRIaW50PiBIaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgeworICB2b2lkIGVtaXREaWFnbm9zdGljTG9jKFNvdXJjZUxvY2F0aW9uIExvYywgUHJlc3VtZWRMb2MgUExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q2hhclNvdXJjZVJhbmdlPiBSYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00pIG92ZXJyaWRlOworCisgIHZvaWQgZW1pdENvZGVDb250ZXh0KFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q2hhclNvdXJjZVJhbmdlPiYgUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxGaXhJdEhpbnQ+IEhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgb3ZlcnJpZGUgewogICAgIGVtaXRTbmlwcGV0QW5kQ2FyZXQoTG9jLCBMZXZlbCwgUmFuZ2VzLCBIaW50cywgU00pOwogICB9Ci0gIAotICB2aXJ0dWFsIHZvaWQgZW1pdEJhc2ljTm90ZShTdHJpbmdSZWYgTWVzc2FnZSk7Ci0gIAotICB2aXJ0dWFsIHZvaWQgZW1pdEluY2x1ZGVMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MsIFByZXN1bWVkTG9jIFBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKTsKIAotICB2aXJ0dWFsIHZvaWQgZW1pdEltcG9ydExvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIExvYywgUHJlc3VtZWRMb2MgUExvYywKKyAgdm9pZCBlbWl0QmFzaWNOb3RlKFN0cmluZ1JlZiBNZXNzYWdlKSBvdmVycmlkZTsKKworICB2b2lkIGVtaXRJbmNsdWRlTG9jYXRpb24oU291cmNlTG9jYXRpb24gTG9jLCBQcmVzdW1lZExvYyBQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00pIG92ZXJyaWRlOworCisgIHZvaWQgZW1pdEltcG9ydExvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIExvYywgUHJlc3VtZWRMb2MgUExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1vZHVsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKSBvdmVycmlkZTsKKworICB2b2lkIGVtaXRCdWlsZGluZ01vZHVsZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIExvYywgUHJlc3VtZWRMb2MgUExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTW9kdWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7Ci0KLSAgdmlydHVhbCB2b2lkIGVtaXRCdWlsZGluZ01vZHVsZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIExvYywgUHJlc3VtZWRMb2MgUExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNb2R1bGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgdm9pZCBlbWl0U25pcHBldEFuZENhcmV0KFNvdXJjZUxvY2F0aW9uIExvYywgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpY0J1ZmZlci5oIGIvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpY0J1ZmZlci5oCmluZGV4IDkzYWMyOTkuLmZlZmY3OTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWNCdWZmZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1RleHREaWFnbm9zdGljQnVmZmVyLmgKQEAgLTM5LDggKzM5LDggQEAKICAgY29uc3RfaXRlcmF0b3Igbm90ZV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIE5vdGVzLmJlZ2luKCk7IH0KICAgY29uc3RfaXRlcmF0b3Igbm90ZV9lbmQoKSBjb25zdCAgIHsgcmV0dXJuIE5vdGVzLmVuZCgpOyB9CiAKLSAgdmlydHVhbCB2b2lkIEhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIERpYWdMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpYyAmSW5mbyk7CisgIHZvaWQgSGFuZGxlRGlhZ25vc3RpYyhEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgRGlhZ0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpYyAmSW5mbykgb3ZlcnJpZGU7CiAKICAgLy8vIEZsdXNoRGlhZ25vc3RpY3MgLSBGbHVzaCB0aGUgYnVmZmVyZWQgZGlhZ25vc3RpY3MgdG8gYW4gZ2l2ZW4KICAgLy8vIGRpYWdub3N0aWMgZW5naW5lLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpY1ByaW50ZXIuaCBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWNQcmludGVyLmgKaW5kZXggZGM4MDQ3MC4uOWY2ZDVmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpY1ByaW50ZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1RleHREaWFnbm9zdGljUHJpbnRlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKICNpbmNsdWRlICJsbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CiBjbGFzcyBEaWFnbm9zdGljT3B0aW9uczsKQEAgLTMwLDcgKzMwLDcgQEAKICAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNPcHRpb25zPiBEaWFnT3B0czsKIAogICAvLy8gXGJyaWVmIEhhbmRsZSB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSB0ZXh0IGRpYWdub3N0aWMgZW1pdHRlci4KLSAgT3duaW5nUHRyPFRleHREaWFnbm9zdGljPiBUZXh0RGlhZzsKKyAgc3RkOjp1bmlxdWVfcHRyPFRleHREaWFnbm9zdGljPiBUZXh0RGlhZzsKIAogICAvLy8gQSBzdHJpbmcgdG8gcHJlZml4IHRvIGVycm9yIG1lc3NhZ2VzLgogICBzdGQ6OnN0cmluZyBQcmVmaXg7CkBAIC00Nyw5ICs0NywxMCBAQAogICAvLy8gdXNlZC4KICAgdm9pZCBzZXRQcmVmaXgoc3RkOjpzdHJpbmcgVmFsdWUpIHsgUHJlZml4ID0gVmFsdWU7IH0KIAotICB2b2lkIEJlZ2luU291cmNlRmlsZShjb25zdCBMYW5nT3B0aW9ucyAmTE8sIGNvbnN0IFByZXByb2Nlc3NvciAqUFApOwotICB2b2lkIEVuZFNvdXJjZUZpbGUoKTsKLSAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwgY29uc3QgRGlhZ25vc3RpYyAmSW5mbyk7CisgIHZvaWQgQmVnaW5Tb3VyY2VGaWxlKGNvbnN0IExhbmdPcHRpb25zICZMTywgY29uc3QgUHJlcHJvY2Vzc29yICpQUCkgb3ZlcnJpZGU7CisgIHZvaWQgRW5kU291cmNlRmlsZSgpIG92ZXJyaWRlOworICB2b2lkIEhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpYyAmSW5mbykgb3ZlcnJpZGU7CiB9OwogCiB9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVXRpbHMuaCBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVXRpbHMuaAppbmRleCBkZmY1NmMzLi42M2VlY2IxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1V0aWxzLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9VdGlscy5oCkBAIC0zMCw2ICszMCw3IEBACiAKIG5hbWVzcGFjZSBjbGFuZyB7CiBjbGFzcyBBU1RDb25zdW1lcjsKK2NsYXNzIEFTVFJlYWRlcjsKIGNsYXNzIENvbXBpbGVySW5zdGFuY2U7CiBjbGFzcyBDb21waWxlckludm9jYXRpb247CiBjbGFzcyBEZWNsOwpAQCAtNzIsMTAgKzczLDE4IEBACiB2b2lkIERvUHJpbnRQcmVwcm9jZXNzZWRJbnB1dChQcmVwcm9jZXNzb3IgJlBQLCByYXdfb3N0cmVhbSogT1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVwcm9jZXNzb3JPdXRwdXRPcHRpb25zICZPcHRzKTsKIAotLy8vIEF0dGFjaERlcGVuZGVuY3lGaWxlR2VuIC0gQ3JlYXRlIGEgZGVwZW5kZW5jeSBmaWxlIGdlbmVyYXRvciwgYW5kIGF0dGFjaAotLy8vIGl0IHRvIHRoZSBnaXZlbiBwcmVwcm9jZXNzb3IuICBUaGlzIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgb3V0cHV0IHN0cmVhbS4KLXZvaWQgQXR0YWNoRGVwZW5kZW5jeUZpbGVHZW4oUHJlcHJvY2Vzc29yICZQUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVwZW5kZW5jeU91dHB1dE9wdGlvbnMgJk9wdHMpOworLy8vIEJ1aWxkcyBhIGRlcGRlbmVuY3kgZmlsZSB3aGVuIGF0dGFjaGVkIHRvIGEgUHJlcHJvY2Vzc29yIChmb3IgaW5jbHVkZXMpIGFuZAorLy8vIEFTVFJlYWRlciAoZm9yIG1vZHVsZSBpbXBvcnRzKSwgYW5kIHdyaXRlcyBpdCBvdXQgYXQgdGhlIGVuZCBvZiBwcm9jZXNzaW5nCisvLy8gYSBzb3VyY2UgZmlsZS4gIFVzZXJzIHNob3VsZCBhdHRhY2ggdG8gdGhlIGFzdCByZWFkZXIgd2hlbmV2ZXIgYSBtb2R1bGUgaXMKKy8vLyBsb2FkZWQuCitjbGFzcyBEZXBlbmRlbmN5RmlsZUdlbmVyYXRvciB7CisgIHZvaWQgKkltcGw7IC8vIE9wYXF1ZSBpbXBsZW1lbnRhdGlvbgorICBEZXBlbmRlbmN5RmlsZUdlbmVyYXRvcih2b2lkICpJbXBsKTsKK3B1YmxpYzoKKyAgc3RhdGljIERlcGVuZGVuY3lGaWxlR2VuZXJhdG9yICpDcmVhdGVBbmRBdHRhY2hUb1ByZXByb2Nlc3NvcigKKyAgICBQcmVwcm9jZXNzb3IgJlBQLCBjb25zdCBEZXBlbmRlbmN5T3V0cHV0T3B0aW9ucyAmT3B0cyk7CisgIHZvaWQgQXR0YWNoVG9BU1RSZWFkZXIoQVNUUmVhZGVyICZSKTsKK307CiAKIC8vLyBBdHRhY2hEZXBlbmRlbmN5R3JhcGhHZW4gLSBDcmVhdGUgYSBkZXBlbmRlbmN5IGdyYXBoIGdlbmVyYXRvciwgYW5kIGF0dGFjaAogLy8vIGl0IHRvIHRoZSBnaXZlbiBwcmVwcm9jZXNzb3IuCkBAIC0xMjMsNiArMTMyLDIyIEBACiAgIHJldHVybiBnZXRMYXN0QXJnSW50VmFsdWUoQXJncywgSWQsIERlZmF1bHQsICZEaWFncyk7CiB9CiAKK3VpbnQ2NF90IGdldExhc3RBcmdVSW50NjRWYWx1ZShjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpPcHRTcGVjaWZpZXIgSWQsIHVpbnQ2NF90IERlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgKkRpYWdzID0gMCk7CisKK2lubGluZSB1aW50NjRfdCBnZXRMYXN0QXJnVUludDY0VmFsdWUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6Ok9wdFNwZWNpZmllciBJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKSB7CisgIHJldHVybiBnZXRMYXN0QXJnVUludDY0VmFsdWUoQXJncywgSWQsIERlZmF1bHQsICZEaWFncyk7Cit9CisKKy8vIFdoZW4gQ2xhbmctPmdldEZyb250ZW5kT3B0cygpLkRpc2FibGVGcmVlIGlzIHNldCB3ZSBkb24ndCBkZWxldGUgc29tZSBvZiB0aGUKKy8vIGdsb2JhbCBvYmplY3RzLCBidXQgd2UgZG9uJ3Qgd2FudCBMZWFrRGV0ZWN0b3JzIHRvIGNvbXBsYWluLCBzbyB3ZSBidXJ5IHRoZW0KKy8vIGluIGEgZ2xvYmFsbHkgdmlzaWJsZSBhcnJheS4KK3ZvaWQgQnVyeVBvaW50ZXIoY29uc3Qgdm9pZCAqUHRyKTsKKwogfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9WZXJpZnlEaWFnbm9zdGljQ29uc3VtZXIuaCBiL2luY2x1ZGUvY2xhbmcvRnJvbnRlbmQvVmVyaWZ5RGlhZ25vc3RpY0NvbnN1bWVyLmgKaW5kZXggOTVkNzc1Mi4uMzk2NzhlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Gcm9udGVuZC9WZXJpZnlEaWFnbm9zdGljQ29uc3VtZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL0Zyb250ZW5kL1ZlcmlmeURpYWdub3N0aWNDb25zdW1lci5oCkBAIC0xMywxMCArMTMsMTAgQEAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3Nvci5oIgogI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKICNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGNsYW5nIHsKIApAQCAtMTA4LDEwICsxMDgsMTEgQEAKIC8vLwogLy8vIEluIHRoaXMgZXhhbXBsZSwgdGhlIGRpYWdub3N0aWMgbWF5IGFwcGVhciBvbmx5IG9uY2UsIGlmIGF0IGFsbC4KIC8vLwotLy8vIFJlZ2V4IG1hdGNoaW5nIG1vZGUgbWF5IGJlIHNlbGVjdGVkIGJ5IGFwcGVuZGluZyAnLXJlJyB0byB0eXBlLCBzdWNoIGFzOgorLy8vIFJlZ2V4IG1hdGNoaW5nIG1vZGUgbWF5IGJlIHNlbGVjdGVkIGJ5IGFwcGVuZGluZyAnLXJlJyB0byB0eXBlIGFuZAorLy8vIGluY2x1ZGluZyByZWdleGVzIHdyYXBwZWQgaW4gZG91YmxlIGN1cmx5IGJyYWNlcyBpbiB0aGUgZGlyZWN0aXZlLCBzdWNoIGFzOgogLy8vCiAvLy8gXGNvZGUKLS8vLyAgIGV4cGVjdGVkLWVycm9yLXJlCisvLy8gICBleHBlY3RlZC1lcnJvci1yZSB7e2Zvcm1hdCBzcGVjaWZpZXMgdHlwZSAnd2NoYXJfdCAqKicgKGFrYSAne3suK319Jyl9fQogLy8vIFxlbmRjb2RlCiAvLy8KIC8vLyBFeGFtcGxlcyBtYXRjaGluZyBlcnJvcjogInZhcmlhYmxlIGhhcyBpbmNvbXBsZXRlIHR5cGUgJ3N0cnVjdCBzJyIKQEAgLTEyMCwxMCArMTIxLDEwIEBACiAvLy8gICAvLyBleHBlY3RlZC1lcnJvciB7e3ZhcmlhYmxlIGhhcyBpbmNvbXBsZXRlIHR5cGUgJ3N0cnVjdCBzJ319CiAvLy8gICAvLyBleHBlY3RlZC1lcnJvciB7e3ZhcmlhYmxlIGhhcyBpbmNvbXBsZXRlIHR5cGV9fQogLy8vCi0vLy8gICAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3ZhcmlhYmxlIGhhcyBoYXMgdHlwZSAnc3RydWN0IC4nfX0KLS8vLyAgIC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7dmFyaWFibGUgaGFzIGhhcyB0eXBlICdzdHJ1Y3QgLionfX0KLS8vLyAgIC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7dmFyaWFibGUgaGFzIGhhcyB0eXBlICdzdHJ1Y3QgKC4qKSd9fQotLy8vICAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t2YXJpYWJsZSBoYXMgaGFzIHR5cGUgJ3N0cnVjdFtbOnNwYWNlOl1dKC4qKSd9fQorLy8vICAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t2YXJpYWJsZSBoYXMgdHlwZSAnc3RydWN0IHt7Ln19J319CisvLy8gICAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3ZhcmlhYmxlIGhhcyB0eXBlICdzdHJ1Y3Qge3suKn19J319CisvLy8gICAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3ZhcmlhYmxlIGhhcyB0eXBlICdzdHJ1Y3Qge3soLiopfX0nfX0KKy8vLyAgIC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7dmFyaWFibGUgaGFzIHR5cGUgJ3N0cnVjdHt7W1s6c3BhY2U6XV0oLiopfX0nfX0KIC8vLyBcZW5kY29kZQogLy8vCiAvLy8gVmVyaWZ5RGlhZ25vc3RpY0NvbnN1bWVyIGV4cGVjdHMgYXQgbGVhc3Qgb25lIGV4cGVjdGVkLSogZGlyZWN0aXZlIHRvCkBAIC0yMDMsNyArMjA0LDcgQEAKICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzOwogICBEaWFnbm9zdGljQ29uc3VtZXIgKlByaW1hcnlDbGllbnQ7CiAgIGJvb2wgT3duc1ByaW1hcnlDbGllbnQ7Ci0gIE93bmluZ1B0cjxUZXh0RGlhZ25vc3RpY0J1ZmZlcj4gQnVmZmVyOworICBzdGQ6OnVuaXF1ZV9wdHI8VGV4dERpYWdub3N0aWNCdWZmZXI+IEJ1ZmZlcjsKICAgY29uc3QgUHJlcHJvY2Vzc29yICpDdXJyZW50UHJlcHJvY2Vzc29yOwogICBjb25zdCBMYW5nT3B0aW9ucyAqTGFuZ09wdHM7CiAgIFNvdXJjZU1hbmFnZXIgKlNyY01hbmFnZXI7CkBAIC0yMTcsMjQgKzIxOCwxOSBAQAogICAgIFNyY01hbmFnZXIgPSAmU007CiAgIH0KIAotI2lmbmRlZiBOREVCVUcKKyAgLy8gVGhlc2UgZmFjaWxpdGllcyBhcmUgdXNlZCBmb3IgdmFsaWRhdGlvbiBpbiBkZWJ1ZyBidWlsZHMuCiAgIGNsYXNzIFVucGFyc2VkRmlsZVN0YXR1cyB7CiAgICAgbGx2bTo6UG9pbnRlckludFBhaXI8Y29uc3QgRmlsZUVudHJ5ICosIDEsIGJvb2w+IERhdGE7Ci0KICAgcHVibGljOgogICAgIFVucGFyc2VkRmlsZVN0YXR1cyhjb25zdCBGaWxlRW50cnkgKkZpbGUsIGJvb2wgRm91bmREaXJlY3RpdmVzKQogICAgICAgOiBEYXRhKEZpbGUsIEZvdW5kRGlyZWN0aXZlcykge30KLQogICAgIGNvbnN0IEZpbGVFbnRyeSAqZ2V0RmlsZSgpIGNvbnN0IHsgcmV0dXJuIERhdGEuZ2V0UG9pbnRlcigpOyB9CiAgICAgYm9vbCBmb3VuZERpcmVjdGl2ZXMoKSBjb25zdCB7IHJldHVybiBEYXRhLmdldEludCgpOyB9CiAgIH07Ci0KICAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxGaWxlSUQsIGNvbnN0IEZpbGVFbnRyeSAqPiBQYXJzZWRGaWxlc01hcDsKICAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxGaWxlSUQsIFVucGFyc2VkRmlsZVN0YXR1cz4gVW5wYXJzZWRGaWxlc01hcDsKLQogICBQYXJzZWRGaWxlc01hcCBQYXJzZWRGaWxlczsKICAgVW5wYXJzZWRGaWxlc01hcCBVbnBhcnNlZEZpbGVzOwotI2VuZGlmCiAKIHB1YmxpYzoKICAgLy8vIENyZWF0ZSBhIG5ldyB2ZXJpZnlpbmcgZGlhZ25vc3RpYyBjbGllbnQsIHdoaWNoIHdpbGwgaXNzdWUgZXJyb3JzIHRvCkBAIC0yNDMsMTAgKzIzOSwxMCBAQAogICBWZXJpZnlEaWFnbm9zdGljQ29uc3VtZXIoRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKTsKICAgflZlcmlmeURpYWdub3N0aWNDb25zdW1lcigpOwogCi0gIHZpcnR1YWwgdm9pZCBCZWdpblNvdXJjZUZpbGUoY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXByb2Nlc3NvciAqUFApOworICB2b2lkIEJlZ2luU291cmNlRmlsZShjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXByb2Nlc3NvciAqUFApIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBFbmRTb3VyY2VGaWxlKCk7CisgIHZvaWQgRW5kU291cmNlRmlsZSgpIG92ZXJyaWRlOwogCiAgIGVudW0gUGFyc2VkU3RhdHVzIHsKICAgICAvLy8gRmlsZSBoYXMgYmVlbiBwcm9jZXNzZWQgdmlhIEhhbmRsZUNvbW1lbnQuCkBAIC0yNjIsMTAgKzI1OCwxMCBAQAogICAvLy8gXGJyaWVmIFVwZGF0ZSBsaXN0cyBvZiBwYXJzZWQgYW5kIHVucGFyc2VkIGZpbGVzLgogICB2b2lkIFVwZGF0ZVBhcnNlZEZpbGVTdGF0dXMoU291cmNlTWFuYWdlciAmU00sIEZpbGVJRCBGSUQsIFBhcnNlZFN0YXR1cyBQUyk7CiAKLSAgdmlydHVhbCBib29sIEhhbmRsZUNvbW1lbnQoUHJlcHJvY2Vzc29yICZQUCwgU291cmNlUmFuZ2UgQ29tbWVudCk7CisgIGJvb2wgSGFuZGxlQ29tbWVudChQcmVwcm9jZXNzb3IgJlBQLCBTb3VyY2VSYW5nZSBDb21tZW50KSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgSGFuZGxlRGlhZ25vc3RpYyhEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgRGlhZ0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKTsKKyAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKSBvdmVycmlkZTsKIH07CiAKIH0gLy8gZW5kIG5hbXNwYWNlIGNsYW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0luZGV4L1VTUkdlbmVyYXRpb24uaCBiL2luY2x1ZGUvY2xhbmcvSW5kZXgvVVNSR2VuZXJhdGlvbi5oCmluZGV4IDdiMGZkNTAuLjMxOTVkZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvSW5kZXgvVVNSR2VuZXJhdGlvbi5oCisrKyBiL2luY2x1ZGUvY2xhbmcvSW5kZXgvVVNSR2VuZXJhdGlvbi5oCkBAIC0xNCw3ICsxNCw5IEBACiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCiAKIG5hbWVzcGFjZSBjbGFuZyB7Ci0gIGNsYXNzIERlY2w7CitjbGFzcyBEZWNsOworY2xhc3MgTWFjcm9EZWZpbml0aW9uOworY2xhc3MgU291cmNlTWFuYWdlcjsKIAogbmFtZXNwYWNlIGluZGV4IHsKIApAQCAtMjIsNyArMjQsNyBAQAogICByZXR1cm4gImM6IjsKIH0KIAotLy8vIFxicmllZiBHZW5lcmF0ZSBhIFVTUiBmb3IgYSBEZWNsLCBpbmNsdWRpbmcgdGhlIHByZWZpeC4KKy8vLyBcYnJpZWYgR2VuZXJhdGUgYSBVU1IgZm9yIGEgRGVjbCwgaW5jbHVkaW5nIHRoZSBVU1IgcHJlZml4LgogLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIGlnbm9yZWQsIGZhbHNlIG90aGVyd2lzZS4KIGJvb2wgZ2VuZXJhdGVVU1JGb3JEZWNsKGNvbnN0IERlY2wgKkQsIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmQnVmKTsKIApAQCAtNDcsNiArNDksMTIgQEAKIC8vLyBcYnJpZWYgR2VuZXJhdGUgYSBVU1IgZnJhZ21lbnQgZm9yIGFuIE9iamVjdGl2ZS1DIHByb3RvY29sLgogdm9pZCBnZW5lcmF0ZVVTUkZvck9iakNQcm90b2NvbChTdHJpbmdSZWYgUHJvdCwgcmF3X29zdHJlYW0gJk9TKTsKIAorLy8vIFxicmllZiBHZW5lcmF0ZSBhIFVTUiBmb3IgYSBtYWNybywgaW5jbHVkaW5nIHRoZSBVU1IgcHJlZml4LgorLy8vCisvLy8gXHJldHVybnMgdHJ1ZSBvbiBlcnJvciwgZmFsc2Ugb24gc3VjY2Vzcy4KK2Jvb2wgZ2VuZXJhdGVVU1JGb3JNYWNybyhjb25zdCBNYWNyb0RlZmluaXRpb24gKk1ELCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkJ1Zik7CisKIH0gLy8gbmFtZXNwYWNlIGluZGV4CiB9IC8vIG5hbWVzcGFjZSBjbGFuZwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0xleC9DTWFrZUxpc3RzLnR4dCBiL2luY2x1ZGUvY2xhbmcvTGV4L0NNYWtlTGlzdHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODA1NWViLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY2xhbmcvTGV4L0NNYWtlTGlzdHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1jbGFuZ190YWJsZWdlbihBdHRyU3BlbGxpbmdzLmluYyAtZ2VuLWNsYW5nLWF0dHItc3BlbGxpbmctbGlzdAotICAtSSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vCi0gIFNPVVJDRSAuLi9CYXNpYy9BdHRyLnRkCi0gIFRBUkdFVCBDbGFuZ0F0dHJTcGVsbGluZ3MKLSAgREVQRU5EUyBBdHRyU3BlbGxpbmdzLmluYykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvTGV4L0RpcmVjdG9yeUxvb2t1cC5oIGIvaW5jbHVkZS9jbGFuZy9MZXgvRGlyZWN0b3J5TG9va3VwLmgKaW5kZXggZGZmM2U4Yy4uMTY4OTlhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9MZXgvRGlyZWN0b3J5TG9va3VwLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9MZXgvRGlyZWN0b3J5TG9va3VwLmgKQEAgLTE2MSwxMSArMTYxLDE3IEBACiAgIC8vLyBccGFyYW0gW291dF0gSW5Vc2VyU3BlY2lmaWVkU3lzdGVtRnJhbWV3b3JrIElmIHRoZSBmaWxlIGlzIGZvdW5kLAogICAvLy8gc2V0IHRvIHRydWUgaWYgdGhlIGZpbGUgaXMgbG9jYXRlZCBpbiBhIGZyYW1ld29yayB0aGF0IGhhcyBiZWVuCiAgIC8vLyB1c2VyLXNwZWNpZmllZCB0byBiZSB0cmVhdGVkIGFzIGEgc3lzdGVtIGZyYW1ld29yay4KLSAgY29uc3QgRmlsZUVudHJ5ICpMb29rdXBGaWxlKFN0cmluZ1JlZiBGaWxlbmFtZSwgSGVhZGVyU2VhcmNoICZIUywKKyAgLy8vCisgIC8vLyBccGFyYW0gW291dF0gTWFwcGVkTmFtZSBpZiB0aGlzIGlzIGEgaGVhZGVybWFwIHdoaWNoIG1hcHMgdGhlIGZpbGVuYW1lIHRvCisgIC8vLyBhIGZyYW1ld29yayBpbmNsdWRlICgiRm9vLmgiIC0+ICJGb28vRm9vLmgiKSwgc2V0IHRoZSBuZXcgbmFtZSB0byB0aGlzCisgIC8vLyB2ZWN0b3IgYW5kIHBvaW50IEZpbGVuYW1lIHRvIGl0LgorICBjb25zdCBGaWxlRW50cnkgKkxvb2t1cEZpbGUoU3RyaW5nUmVmICZGaWxlbmFtZSwgSGVhZGVyU2VhcmNoICZIUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqU2VhcmNoUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqUmVsYXRpdmVQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlTWFwOjpLbm93bkhlYWRlciAqU3VnZ2VzdGVkTW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSW5Vc2VyU3BlY2lmaWVkU3lzdGVtRnJhbWV3b3JrKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkluVXNlclNwZWNpZmllZFN5c3RlbUZyYW1ld29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhc0JlZW5NYXBwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk1hcHBlZE5hbWUpIGNvbnN0OwogCiBwcml2YXRlOgogICBjb25zdCBGaWxlRW50cnkgKkRvRnJhbWV3b3JrTG9va3VwKApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9MZXgvSGVhZGVyTWFwLmggYi9pbmNsdWRlL2NsYW5nL0xleC9IZWFkZXJNYXAuaAppbmRleCA4NDczYTZhLi44ZTc4YjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0xleC9IZWFkZXJNYXAuaAorKysgYi9pbmNsdWRlL2NsYW5nL0xleC9IZWFkZXJNYXAuaApAQCAtNTUsNiArNTUsMTEgQEAKICAgLy8vICIuLi8uLi9maWxlLmgiLgogICBjb25zdCBGaWxlRW50cnkgKkxvb2t1cEZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBGaWxlTWFuYWdlciAmRk0pIGNvbnN0OwogCisgIC8vLyBJZiB0aGUgc3BlY2lmaWVkIHJlbGF0aXZlIGZpbGVuYW1lIGlzIGxvY2F0ZWQgaW4gdGhpcyBIZWFkZXJNYXAgcmV0dXJuCisgIC8vLyB0aGUgZmlsZW5hbWUgaXQgaXMgbWFwcGVkIHRvLCBvdGhlcndpc2UgcmV0dXJuIGFuIGVtcHR5IFN0cmluZ1JlZi4KKyAgU3RyaW5nUmVmIGxvb2t1cEZpbGVuYW1lKFN0cmluZ1JlZiBGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmRGVzdFBhdGgpIGNvbnN0OworCiAgIC8vLyBnZXRGaWxlTmFtZSAtIFJldHVybiB0aGUgZmlsZW5hbWUgb2YgdGhlIGhlYWRlcm1hcC4KICAgY29uc3QgY2hhciAqZ2V0RmlsZU5hbWUoKSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9MZXgvSGVhZGVyU2VhcmNoLmggYi9pbmNsdWRlL2NsYW5nL0xleC9IZWFkZXJTZWFyY2guaAppbmRleCBmYjFhODYyLi5jM2FmNjMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0xleC9IZWFkZXJTZWFyY2guaAorKysgYi9pbmNsdWRlL2NsYW5nL0xleC9IZWFkZXJTZWFyY2guaApAQCAtMTgsMTAgKzE4LDEwIEBACiAjaW5jbHVkZSAiY2xhbmcvTGV4L01vZHVsZU1hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CkBAIC03Myw2ICs3Myw5IEBACiAgIC8vLyBwcm92aWRlZCB2aWEgYSBoZWFkZXIgbWFwLiBUaGlzIGJpdCBpbmRpY2F0ZXMgd2hlbiB0aGlzIGlzIG9uZSBvZgogICAvLy8gdGhvc2UgZnJhbWV3b3JrIGhlYWRlcnMuCiAgIHVuc2lnbmVkIEluZGV4SGVhZGVyTWFwSGVhZGVyIDogMTsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBmaWxlIGhhZCBiZWVuIGxvb2tlZCB1cCBhcyBhIGhlYWRlci4KKyAgdW5zaWduZWQgSXNWYWxpZCA6IDE7CiAgIAogICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgaGFzIGJlZW4gaW5jbHVkZWQgYWxyZWFkeS4KICAgdW5zaWduZWQgc2hvcnQgTnVtSW5jbHVkZXM7CkBAIC0xMDIsNyArMTA1LDcgQEAKICAgICA6IGlzSW1wb3J0KGZhbHNlKSwgaXNQcmFnbWFPbmNlKGZhbHNlKSwgRGlySW5mbyhTcmNNZ3I6OkNfVXNlciksIAogICAgICAgRXh0ZXJuYWwoZmFsc2UpLCBpc01vZHVsZUhlYWRlcihmYWxzZSksIGlzQ29tcGlsaW5nTW9kdWxlSGVhZGVyKGZhbHNlKSwKICAgICAgIEhlYWRlclJvbGUoTW9kdWxlTWFwOjpOb3JtYWxIZWFkZXIpLAotICAgICAgUmVzb2x2ZWQoZmFsc2UpLCBJbmRleEhlYWRlck1hcEhlYWRlcihmYWxzZSksCisgICAgICBSZXNvbHZlZChmYWxzZSksIEluZGV4SGVhZGVyTWFwSGVhZGVyKGZhbHNlKSwgSXNWYWxpZCgwKSwKICAgICAgIE51bUluY2x1ZGVzKDApLCBDb250cm9sbGluZ01hY3JvSUQoMCksIENvbnRyb2xsaW5nTWFjcm8oMCkgIHt9CiAKICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgY29udHJvbGxpbmcgbWFjcm8gZm9yIHRoaXMgaGVhZGVyIGZpbGUsIGlmCkBAIC0xNTgsNiArMTYxLDcgQEAKICAgLy8vIFxicmllZiBIZWFkZXItc2VhcmNoIG9wdGlvbnMgdXNlZCB0byBpbml0aWFsaXplIHRoaXMgaGVhZGVyIHNlYXJjaC4KICAgSW50cnVzaXZlUmVmQ250UHRyPEhlYWRlclNlYXJjaE9wdGlvbnM+IEhTT3B0czsKIAorICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3M7CiAgIEZpbGVNYW5hZ2VyICZGaWxlTWdyOwogICAvLy8gXCNpbmNsdWRlIHNlYXJjaCBwYXRoIGluZm9ybWF0aW9uLiAgUmVxdWVzdHMgZm9yIFwjaW5jbHVkZSAieCIgc2VhcmNoIHRoZQogICAvLy8gZGlyZWN0b3J5IG9mIHRoZSBcI2luY2x1ZGluZyBmaWxlIGZpcnN0LCB0aGVuIGVhY2ggZGlyZWN0b3J5IGluIFNlYXJjaERpcnMKQEAgLTE4NSwxNSArMTg5LDI3IEBACiAgIC8vLyBpbmNsdWRlZCwgaW5kZXhlZCBieSB0aGUgRmlsZUVudHJ5J3MgVUlELgogICBzdGQ6OnZlY3RvcjxIZWFkZXJGaWxlSW5mbz4gRmlsZUluZm87CiAKLSAgLy8vIFxicmllZiBLZWVwcyB0cmFjayBvZiBlYWNoIGxvb2t1cCBwZXJmb3JtZWQgYnkgTG9va3VwRmlsZS4KLSAgLy8vCi0gIC8vLyBUaGUgZmlyc3QgcGFydCBvZiB0aGUgdmFsdWUgaXMgdGhlIHN0YXJ0aW5nIGluZGV4IGluIFNlYXJjaERpcnMKLSAgLy8vIHRoYXQgdGhlIGNhY2hlZCBzZWFyY2ggd2FzIHBlcmZvcm1lZCBmcm9tLiAgSWYgdGhlcmUgaXMgYSBoaXQgYW5kCi0gIC8vLyB0aGlzIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgcXVlcnksIHRoZSBjYWNoZSBoYXMgdG8gYmUKLSAgLy8vIGlnbm9yZWQuICBUaGUgc2Vjb25kIHZhbHVlIGlzIHRoZSBlbnRyeSBpbiBTZWFyY2hEaXJzIHRoYXQgc2F0aXNmaWVkCi0gIC8vLyB0aGUgcXVlcnkuCi0gIGxsdm06OlN0cmluZ01hcDxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiwgbGx2bTo6QnVtcFB0ckFsbG9jYXRvcj4KLSAgICBMb29rdXBGaWxlQ2FjaGU7CisgIC8vLyBLZWVwcyB0cmFjayBvZiBlYWNoIGxvb2t1cCBwZXJmb3JtZWQgYnkgTG9va3VwRmlsZS4KKyAgc3RydWN0IExvb2t1cEZpbGVDYWNoZUluZm8geworICAgIC8vLyBTdGFydGluZyBpbmRleCBpbiBTZWFyY2hEaXJzIHRoYXQgdGhlIGNhY2hlZCBzZWFyY2ggd2FzIHBlcmZvcm1lZCBmcm9tLgorICAgIC8vLyBJZiB0aGVyZSBpcyBhIGhpdCBhbmQgdGhpcyB2YWx1ZSBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IHF1ZXJ5LCB0aGUKKyAgICAvLy8gY2FjaGUgaGFzIHRvIGJlIGlnbm9yZWQuCisgICAgdW5zaWduZWQgU3RhcnRJZHg7CisgICAgLy8vIFRoZSBlbnRyeSBpbiBTZWFyY2hEaXJzIHRoYXQgc2F0aXNmaWVkIHRoZSBxdWVyeS4KKyAgICB1bnNpZ25lZCBIaXRJZHg7CisgICAgLy8vIFRoaXMgaXMgbm9uLW51bGwgaWYgdGhlIG9yaWdpbmFsIGZpbGVuYW1lIHdhcyBtYXBwZWQgdG8gYSBmcmFtZXdvcmsKKyAgICAvLy8gaW5jbHVkZSB2aWEgYSBoZWFkZXJtYXAuCisgICAgY29uc3QgY2hhciAqTWFwcGVkTmFtZTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIC0tIEluaXRpYWxpemUgYWxsIG1lbWJlcnMgd2l0aCB6ZXJvLgorICAgIExvb2t1cEZpbGVDYWNoZUluZm8oKTogU3RhcnRJZHgoMCksIEhpdElkeCgwKSwgTWFwcGVkTmFtZShudWxscHRyKSB7fQorCisgICAgdm9pZCByZXNldCh1bnNpZ25lZCBTdGFydElkeCkgeworICAgICAgdGhpcy0+U3RhcnRJZHggPSBTdGFydElkeDsKKyAgICAgIHRoaXMtPk1hcHBlZE5hbWUgPSBudWxscHRyOworICAgIH0KKyAgfTsKKyAgbGx2bTo6U3RyaW5nTWFwPExvb2t1cEZpbGVDYWNoZUluZm8sIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3I+IExvb2t1cEZpbGVDYWNoZTsKIAogICAvLy8gXGJyaWVmIENvbGxlY3Rpb24gbWFwcGluZyBhIGZyYW1ld29yayBvciBzdWJmcmFtZXdvcmsKICAgLy8vIG5hbWUgbGlrZSAiQ2FyYm9uIiB0byB0aGUgQ2FyYm9uLmZyYW1ld29yayBkaXJlY3RvcnkuCkBAIC0yMDQsNyArMjIwLDcgQEAKICAgLy8vIGluY2x1ZGVfYWxpYXMgcHJhZ21hIGZvciBNaWNyb3NvZnQgY29tcGF0aWJpbGl0eS4KICAgdHlwZWRlZiBsbHZtOjpTdHJpbmdNYXA8c3RkOjpzdHJpbmcsIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3I+CiAgICAgSW5jbHVkZUFsaWFzTWFwOwotICBPd25pbmdQdHI8SW5jbHVkZUFsaWFzTWFwPiBJbmNsdWRlQWxpYXNlczsKKyAgc3RkOjp1bmlxdWVfcHRyPEluY2x1ZGVBbGlhc01hcD4gSW5jbHVkZUFsaWFzZXM7CiAKICAgLy8vIEhlYWRlck1hcHMgLSBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIEZpbGVFbnRyeSAtPiBIZWFkZXJNYXAsIHVuaXF1aW5nCiAgIC8vLyBoZWFkZXJtYXBzLiAgVGhpcyB2ZWN0b3Igb3ducyB0aGUgaGVhZGVybWFwLgpAQCAtMjMyLDYgKzI0OCw4IEBACiAgIHVuc2lnbmVkIE51bU11bHRpSW5jbHVkZUZpbGVPcHR6bjsKICAgdW5zaWduZWQgTnVtRnJhbWV3b3JrTG9va3VwcywgTnVtU3ViRnJhbWV3b3JrTG9va3VwczsKIAorICBib29sIEVuYWJsZWRNb2R1bGVzOworCiAgIC8vIEhlYWRlclNlYXJjaCBkb2Vzbid0IHN1cHBvcnQgZGVmYXVsdCBvciBjb3B5IGNvbnN0cnVjdGlvbi4KICAgSGVhZGVyU2VhcmNoKGNvbnN0IEhlYWRlclNlYXJjaCYpIExMVk1fREVMRVRFRF9GVU5DVElPTjsKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSGVhZGVyU2VhcmNoJikgTExWTV9ERUxFVEVEX0ZVTkNUSU9OOwpAQCAtMjc4LDkgKzI5Niw3IEBACiAgIH0KIAogICAvLy8gXGJyaWVmIENoZWNrcyB3aGV0aGVyIHRoZSBtYXAgZXhpc3RzIG9yIG5vdC4KLSAgYm9vbCBIYXNJbmNsdWRlQWxpYXNNYXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEluY2x1ZGVBbGlhc2VzLmlzVmFsaWQoKTsKLSAgfQorICBib29sIEhhc0luY2x1ZGVBbGlhc01hcCgpIGNvbnN0IHsgcmV0dXJuIChib29sKUluY2x1ZGVBbGlhc2VzOyB9CiAKICAgLy8vIFxicmllZiBNYXAgdGhlIHNvdXJjZSBpbmNsdWRlIG5hbWUgdG8gdGhlIGRlc3QgaW5jbHVkZSBuYW1lLgogICAvLy8KQEAgLTM0NywxMyArMzYzLDE1IEBACiAgIC8vLyBccmV0dXJucyBJZiBzdWNjZXNzZnVsLCB0aGlzIHJldHVybnMgJ1VzZWREaXInLCB0aGUgRGlyZWN0b3J5TG9va3VwIG1lbWJlcgogICAvLy8gdGhlIGZpbGUgd2FzIGZvdW5kIGluLCBvciBudWxsIGlmIG5vdCBhcHBsaWNhYmxlLgogICAvLy8KKyAgLy8vIFxwYXJhbSBJbmNsdWRlTG9jIFVzZWQgZm9yIGRpYWdub3N0aWNzIGlmIHZhbGlkLgorICAvLy8KICAgLy8vIFxwYXJhbSBpc0FuZ2xlZCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlsZSByZWZlcmVuY2UgaXMgYSA8PiByZWZlcmVuY2UuCiAgIC8vLwogICAvLy8gXHBhcmFtIEN1ckRpciBJZiBub24tbnVsbCwgdGhlIGZpbGUgd2FzIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5CiAgIC8vLyBzZWFyY2ggbG9jYXRpb24uICBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IFwjaW5jbHVkZV9uZXh0LgogICAvLy8KLSAgLy8vIFxwYXJhbSBDdXJGaWxlRW50IElmIG5vbi1udWxsLCBpbmRpY2F0ZXMgd2hlcmUgdGhlIFwjaW5jbHVkaW5nIGZpbGUgaXMsIGluCi0gIC8vLyBjYXNlIGEgcmVsYXRpdmUgc2VhcmNoIGlzIG5lZWRlZC4KKyAgLy8vIFxwYXJhbSBJbmNsdWRlcnMgSW5kaWNhdGVzIHdoZXJlIHRoZSBcI2luY2x1ZGluZyBmaWxlKHMpIGFyZSwgaW4gY2FzZQorICAvLy8gcmVsYXRpdmUgc2VhcmNoZXMgYXJlIG5lZWRlZC4gSW4gcmV2ZXJzZSBvcmRlciBvZiBpbmNsdXNpb24uCiAgIC8vLwogICAvLy8gXHBhcmFtIFNlYXJjaFBhdGggSWYgbm9uLW51bGwsIHdpbGwgYmUgc2V0IHRvIHRoZSBzZWFyY2ggcGF0aCByZWxhdGl2ZQogICAvLy8gdG8gd2hpY2ggdGhlIGZpbGUgd2FzIGZvdW5kLiBJZiB0aGUgaW5jbHVkZSBwYXRoIGlzIGFic29sdXRlLCBTZWFyY2hQYXRoCkBAIC0zNjYsMTAgKzM4NCwxMCBAQAogICAvLy8gXHBhcmFtIFN1Z2dlc3RlZE1vZHVsZSBJZiBub24tbnVsbCwgYW5kIHRoZSBmaWxlIGZvdW5kIGlzIHNlbWFudGljYWxseQogICAvLy8gcGFydCBvZiBhIGtub3duIG1vZHVsZSwgdGhpcyB3aWxsIGJlIHNldCB0byB0aGUgbW9kdWxlIHRoYXQgc2hvdWxkCiAgIC8vLyBiZSBpbXBvcnRlZCBpbnN0ZWFkIG9mIHByZXByb2Nlc3NpbmcvcGFyc2luZyB0aGUgZmlsZSBmb3VuZC4KLSAgY29uc3QgRmlsZUVudHJ5ICpMb29rdXBGaWxlKFN0cmluZ1JlZiBGaWxlbmFtZSwgYm9vbCBpc0FuZ2xlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUxvb2t1cCAqRnJvbURpciwKKyAgY29uc3QgRmlsZUVudHJ5ICpMb29rdXBGaWxlKFN0cmluZ1JlZiBGaWxlbmFtZSwgU291cmNlTG9jYXRpb24gSW5jbHVkZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNBbmdsZWQsIGNvbnN0IERpcmVjdG9yeUxvb2t1cCAqRnJvbURpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUxvb2t1cCAqJkN1ckRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqQ3VyRmlsZUVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IEZpbGVFbnRyeSAqPiBJbmNsdWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gKlNlYXJjaFBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gKlJlbGF0aXZlUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZU1hcDo6S25vd25IZWFkZXIgKlN1Z2dlc3RlZE1vZHVsZSwKQEAgLTQ1OCw2ICs0NzYsOSBAQAogICAvLy8gRmlsZUVudHJ5LCB1bmlxdWluZyB0aGVtIHRocm91Z2ggdGhlICdIZWFkZXJNYXBzJyBkYXRhc3RydWN0dXJlLgogICBjb25zdCBIZWFkZXJNYXAgKkNyZWF0ZUhlYWRlck1hcChjb25zdCBGaWxlRW50cnkgKkZFKTsKIAorICAvLy8gUmV0dXJucyB0cnVlIGlmIG1vZHVsZXMgYXJlIGVuYWJsZWQuCisgIGJvb2wgZW5hYmxlZE1vZHVsZXMoKSBjb25zdCB7IHJldHVybiBFbmFibGVkTW9kdWxlczsgfQorCiAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBmaWxlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gCiAgIC8vLyBsb2FkIHRoZSBnaXZlbiBtb2R1bGUuCiAgIC8vLwpAQCAtNDg2LDExICs1MDcsMTggQEAKICAgLy8vCiAgIC8vLyBccmV0dXJucyBUaGUgbW9kdWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAgIE1vZHVsZSAqbG9va3VwTW9kdWxlKFN0cmluZ1JlZiBNb2R1bGVOYW1lLCBib29sIEFsbG93U2VhcmNoID0gdHJ1ZSk7CisKKworICAvLy8gXGJyaWVmIFRyeSB0byBmaW5kIGEgbW9kdWxlIG1hcCBmaWxlIGluIHRoZSBnaXZlbiBkaXJlY3RvcnksIHJldHVybmluZworICAvLy8gXGMgbnVsbHB0ciBpZiBub25lIGlzIGZvdW5kLgorICBjb25zdCBGaWxlRW50cnkgKmxvb2t1cE1vZHVsZU1hcEZpbGUoY29uc3QgRGlyZWN0b3J5RW50cnkgKkRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNGcmFtZXdvcmspOwogICAKICAgdm9pZCBJbmNyZW1lbnRGcmFtZXdvcmtMb29rdXBDb3VudCgpIHsgKytOdW1GcmFtZXdvcmtMb29rdXBzOyB9CiAKICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhIG1vZHVsZSBtYXAgdGhhdCBtYXkgbWFwIHRoZSBoZWFkZXIKICAgLy8vIHdpdGggdGhlIGdpdmVuIGZpbGUgbmFtZSB0byBhIChzdWIpbW9kdWxlLgorICAvLy8gQWx3YXlzIHJldHVybnMgZmFsc2UgaWYgbW9kdWxlcyBhcmUgZGlzYWJsZWQuCiAgIC8vLwogICAvLy8gXHBhcmFtIEZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlLgogICAvLy8KQEAgLTU0MywxNiArNTcxLDIwIEBACiAgIC8vLyBvZiB0aGUgZ2l2ZW4gc2VhcmNoIGRpcmVjdG9yeS4KICAgdm9pZCBsb2FkU3ViZGlyZWN0b3J5TW9kdWxlTWFwcyhEaXJlY3RvcnlMb29rdXAgJlNlYXJjaERpcik7CiAKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIEhlYWRlckZpbGVJbmZvIHN0cnVjdHVyZSBmb3IgdGhlIHNwZWNpZmllZCBGaWxlRW50cnkuCisgIGNvbnN0IEhlYWRlckZpbGVJbmZvICZnZXRGaWxlSW5mbyhjb25zdCBGaWxlRW50cnkgKkZFKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8SGVhZGVyU2VhcmNoKj4odGhpcyktPmdldEZpbGVJbmZvKEZFKTsKKyAgfQorCiBwdWJsaWM6CiAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIG1vZHVsZSBtYXAuCiAgIE1vZHVsZU1hcCAmZ2V0TW9kdWxlTWFwKCkgeyByZXR1cm4gTW9kTWFwOyB9CiAgIAogICB1bnNpZ25lZCBoZWFkZXJfZmlsZV9zaXplKCkgY29uc3QgeyByZXR1cm4gRmlsZUluZm8uc2l6ZSgpOyB9CiAKLSAgLy8vIFxicmllZiBSZXR1cm4gdGhlIEhlYWRlckZpbGVJbmZvIHN0cnVjdHVyZSBmb3IgdGhlIHNwZWNpZmllZCBGaWxlRW50cnkuCi0gIGNvbnN0IEhlYWRlckZpbGVJbmZvICZnZXRGaWxlSW5mbyhjb25zdCBGaWxlRW50cnkgKkZFKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8SGVhZGVyU2VhcmNoKj4odGhpcyktPmdldEZpbGVJbmZvKEZFKTsKLSAgfQorICAvLy8gXGJyaWVmIEdldCBhIFxjIEhlYWRlckZpbGVJbmZvIHN0cnVjdHVyZSBmb3IgdGhlIHNwZWNpZmllZCBcYyBGaWxlRW50cnksCisgIC8vLyBpZiBvbmUgZXhpc3RzLgorICBib29sIHRyeUdldEZpbGVJbmZvKGNvbnN0IEZpbGVFbnRyeSAqRkUsIEhlYWRlckZpbGVJbmZvICZSZXN1bHQpIGNvbnN0OwogCiAgIC8vIFVzZWQgYnkgZXh0ZXJuYWwgdG9vbHMKICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxEaXJlY3RvcnlMb29rdXA+Ojpjb25zdF9pdGVyYXRvciBzZWFyY2hfZGlyX2l0ZXJhdG9yOwpAQCAtNjAyLDI2ICs2MzQsMzIgQEAKICAgICAvLy8gaW52YWxpZC4KICAgICBMTU1fSW52YWxpZE1vZHVsZU1hcAogICB9OwotICAKKworICBMb2FkTW9kdWxlTWFwUmVzdWx0IGxvYWRNb2R1bGVNYXBGaWxlSW1wbChjb25zdCBGaWxlRW50cnkgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTeXN0ZW0pOworCiAgIC8vLyBcYnJpZWYgVHJ5IHRvIGxvYWQgdGhlIG1vZHVsZSBtYXAgZmlsZSBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgogICAvLy8KICAgLy8vIFxwYXJhbSBEaXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3Rvcnkgd2hlcmUgd2Ugd2lsbCBsb29rIGZvciBhIG1vZHVsZQogICAvLy8gbWFwIGZpbGUuCiAgIC8vLyBccGFyYW0gSXNTeXN0ZW0gV2hldGhlciB0aGlzIGlzIGEgc3lzdGVtIGhlYWRlciBkaXJlY3RvcnkuCisgIC8vLyBccGFyYW0gSXNGcmFtZXdvcmsgV2hldGhlciB0aGlzIGlzIGEgZnJhbWV3b3JrIGRpcmVjdG9yeS4KICAgLy8vCiAgIC8vLyBccmV0dXJucyBUaGUgcmVzdWx0IG9mIGF0dGVtcHRpbmcgdG8gbG9hZCB0aGUgbW9kdWxlIG1hcCBmaWxlIGZyb20gdGhlCiAgIC8vLyBuYW1lZCBkaXJlY3RvcnkuCi0gIExvYWRNb2R1bGVNYXBSZXN1bHQgbG9hZE1vZHVsZU1hcEZpbGUoU3RyaW5nUmVmIERpck5hbWUsIGJvb2wgSXNTeXN0ZW0pOworICBMb2FkTW9kdWxlTWFwUmVzdWx0IGxvYWRNb2R1bGVNYXBGaWxlKFN0cmluZ1JlZiBEaXJOYW1lLCBib29sIElzU3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNGcmFtZXdvcmspOwogCiAgIC8vLyBcYnJpZWYgVHJ5IHRvIGxvYWQgdGhlIG1vZHVsZSBtYXAgZmlsZSBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgogICAvLy8KICAgLy8vIFxwYXJhbSBEaXIgVGhlIGRpcmVjdG9yeSB3aGVyZSB3ZSB3aWxsIGxvb2sgZm9yIGEgbW9kdWxlIG1hcCBmaWxlLgogICAvLy8gXHBhcmFtIElzU3lzdGVtIFdoZXRoZXIgdGhpcyBpcyBhIHN5c3RlbSBoZWFkZXIgZGlyZWN0b3J5LgorICAvLy8gXHBhcmFtIElzRnJhbWV3b3JrIFdoZXRoZXIgdGhpcyBpcyBhIGZyYW1ld29yayBkaXJlY3RvcnkuCiAgIC8vLwogICAvLy8gXHJldHVybnMgVGhlIHJlc3VsdCBvZiBhdHRlbXB0aW5nIHRvIGxvYWQgdGhlIG1vZHVsZSBtYXAgZmlsZSBmcm9tIHRoZQogICAvLy8gbmFtZWQgZGlyZWN0b3J5LgogICBMb2FkTW9kdWxlTWFwUmVzdWx0IGxvYWRNb2R1bGVNYXBGaWxlKGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1N5c3RlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1N5c3RlbSwgYm9vbCBJc0ZyYW1ld29yayk7CiAKICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIEhlYWRlckZpbGVJbmZvIHN0cnVjdHVyZSBmb3IgdGhlIHNwZWNpZmllZCBGaWxlRW50cnkuCiAgIEhlYWRlckZpbGVJbmZvICZnZXRGaWxlSW5mbyhjb25zdCBGaWxlRW50cnkgKkZFKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvTGV4L0hlYWRlclNlYXJjaE9wdGlvbnMuaCBiL2luY2x1ZGUvY2xhbmcvTGV4L0hlYWRlclNlYXJjaE9wdGlvbnMuaAppbmRleCBiNTYzYjM4Li4wNjAyNGIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0xleC9IZWFkZXJTZWFyY2hPcHRpb25zLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9MZXgvSGVhZGVyU2VhcmNoT3B0aW9ucy5oCkBAIC01OCwyMCArNTgsNiBAQAogICAgICAgICAgIGJvb2wgaWdub3JlU3lzUm9vdCkKICAgICAgIDogUGF0aChwYXRoKSwgR3JvdXAoZ3JvdXApLCBJc0ZyYW1ld29yayhpc0ZyYW1ld29yayksCiAgICAgICAgIElnbm9yZVN5c1Jvb3QoaWdub3JlU3lzUm9vdCkge30KLQotICAgIEVudHJ5KGNvbnN0IEVudHJ5JiByaHMpCi0gICAgICAgIDogUGF0aChyaHMuUGF0aCksIEdyb3VwKHJocy5Hcm91cCksIElzRnJhbWV3b3JrKHJocy5Jc0ZyYW1ld29yayksCi0gICAgICAgICAgSWdub3JlU3lzUm9vdChyaHMuSWdub3JlU3lzUm9vdCkge30KLQotICAgIEVudHJ5JiBvcGVyYXRvcj0oY29uc3QgRW50cnkmIHJocykKLSAgICB7Ci0gICAgICBpZiAodGhpcyA9PSAmcmhzKQotICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAgIFBhdGggPSByaHMuUGF0aDsKLSAgICAgIEdyb3VwID0gcmhzLkdyb3VwOwotICAgICAgSXNGcmFtZXdvcmsgPSByaHMuSXNGcmFtZXdvcms7Ci0gICAgICBJZ25vcmVTeXNSb290ID0gcmhzLklnbm9yZVN5c1Jvb3Q7Ci0gICAgfQogICB9OwogCiAgIHN0cnVjdCBTeXN0ZW1IZWFkZXJQcmVmaXggewpAQCAtMTAzLDYgKzg5LDkgQEAKICAgLy8vIFxicmllZiBUaGUgZGlyZWN0b3J5IHVzZWQgZm9yIHRoZSBtb2R1bGUgY2FjaGUuCiAgIHN0ZDo6c3RyaW5nIE1vZHVsZUNhY2hlUGF0aDsKIAorICAvLy8gXGJyaWVmIFRoZSBkaXJlY3RvcnkgdXNlZCBmb3IgYSB1c2VyIGJ1aWxkLgorICBzdGQ6OnN0cmluZyBNb2R1bGVVc2VyQnVpbGRQYXRoOworCiAgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBzaG91bGQgZGlzYWJsZSB0aGUgdXNlIG9mIHRoZSBoYXNoIHN0cmluZyB3aXRoaW4gdGhlCiAgIC8vLyBtb2R1bGUgY2FjaGUuCiAgIC8vLwpAQCAtMTMwLDYgKzExOSwxMiBAQAogICAvLy8gcmVnZW5lcmF0ZWQgb2Z0ZW4uCiAgIHVuc2lnbmVkIE1vZHVsZUNhY2hlUHJ1bmVBZnRlcjsKIAorICAvLy8gXGJyaWVmIFRoZSB0aW1lIGluIHNlY29uZHMgd2hlbiB0aGUgYnVpbGQgc2Vzc2lvbiBzdGFydGVkLgorICAvLy8KKyAgLy8vIFRoaXMgdGltZSBpcyB1c2VkIGJ5IG90aGVyIG9wdGltaXphdGlvbnMgaW4gaGVhZGVyIHNlYXJjaCBhbmQgbW9kdWxlCisgIC8vLyBsb2FkaW5nLgorICB1aW50NjRfdCBCdWlsZFNlc3Npb25UaW1lc3RhbXA7CisKICAgLy8vIFxicmllZiBUaGUgc2V0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgZm9yIHRoZSBwdXJwb3NlcwogICAvLy8gb2YgY29tcHV0aW5nIHRoZSBtb2R1bGUgaGFzaC4KICAgbGx2bTo6U2V0VmVjdG9yPHN0ZDo6c3RyaW5nPiBNb2R1bGVzSWdub3JlTWFjcm9zOwpAQCAtMTM3LDYgKzEzMiw5IEBACiAgIC8vLyBcYnJpZWYgVGhlIHNldCBvZiB1c2VyLXByb3ZpZGVkIG1vZHVsZS1tYXAtZmlsZXMuCiAgIGxsdm06OlNldFZlY3RvcjxzdGQ6OnN0cmluZz4gTW9kdWxlTWFwRmlsZXM7CiAKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIHVzZXItcHJvdmlkZWQgdmlydHVhbCBmaWxlc3lzdGVtIG92ZXJsYXkgZmlsZXMuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBWRlNPdmVybGF5RmlsZXM7CisKICAgLy8vIEluY2x1ZGUgdGhlIGNvbXBpbGVyIGJ1aWx0aW4gaW5jbHVkZXMuCiAgIHVuc2lnbmVkIFVzZUJ1aWx0aW5JbmNsdWRlcyA6IDE7CiAKQEAgLTE1MiwxNCArMTUwLDI1IEBACiAgIC8vLyBXaGV0aGVyIGhlYWRlciBzZWFyY2ggaW5mb3JtYXRpb24gc2hvdWxkIGJlIG91dHB1dCBhcyBmb3IgLXYuCiAgIHVuc2lnbmVkIFZlcmJvc2UgOiAxOwogCisgIC8vLyBcYnJpZWYgSWYgdHJ1ZSwgc2tpcCB2ZXJpZnlpbmcgaW5wdXQgZmlsZXMgdXNlZCBieSBtb2R1bGVzIGlmIHRoZQorICAvLy8gbW9kdWxlIHdhcyBhbHJlYWR5IHZlcmlmaWVkIGR1cmluZyB0aGlzIGJ1aWxkIHNlc3Npb24gKHNlZQorICAvLy8gXGMgQnVpbGRTZXNzaW9uVGltZXN0YW1wKS4KKyAgdW5zaWduZWQgTW9kdWxlc1ZhbGlkYXRlT25jZVBlckJ1aWxkU2Vzc2lvbiA6IDE7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRvIHZhbGlkYXRlIHN5c3RlbSBpbnB1dCBmaWxlcyB3aGVuIGEgbW9kdWxlIGlzIGxvYWRlZC4KKyAgdW5zaWduZWQgTW9kdWxlc1ZhbGlkYXRlU3lzdGVtSGVhZGVycyA6IDE7CisKIHB1YmxpYzoKICAgSGVhZGVyU2VhcmNoT3B0aW9ucyhTdHJpbmdSZWYgX1N5c3Jvb3QgPSAiLyIpCiAgICAgOiBTeXNyb290KF9TeXNyb290KSwgRGlzYWJsZU1vZHVsZUhhc2goMCksIE1vZHVsZU1hcHMoMCksCiAgICAgICBNb2R1bGVDYWNoZVBydW5lSW50ZXJ2YWwoNyoyNCo2MCo2MCksCiAgICAgICBNb2R1bGVDYWNoZVBydW5lQWZ0ZXIoMzEqMjQqNjAqNjApLAorICAgICAgQnVpbGRTZXNzaW9uVGltZXN0YW1wKDApLAogICAgICAgVXNlQnVpbHRpbkluY2x1ZGVzKHRydWUpLAogICAgICAgVXNlU3RhbmRhcmRTeXN0ZW1JbmNsdWRlcyh0cnVlKSwgVXNlU3RhbmRhcmRDWFhJbmNsdWRlcyh0cnVlKSwKLSAgICAgIFVzZUxpYmN4eChmYWxzZSksIFZlcmJvc2UoZmFsc2UpIHt9CisgICAgICBVc2VMaWJjeHgoZmFsc2UpLCBWZXJib3NlKGZhbHNlKSwKKyAgICAgIE1vZHVsZXNWYWxpZGF0ZU9uY2VQZXJCdWlsZFNlc3Npb24oZmFsc2UpLAorICAgICAgTW9kdWxlc1ZhbGlkYXRlU3lzdGVtSGVhZGVycyhmYWxzZSkge30KIAogICAvLy8gQWRkUGF0aCAtIEFkZCB0aGUgXHAgUGF0aCBwYXRoIHRvIHRoZSBzcGVjaWZpZWQgXHAgR3JvdXAgbGlzdC4KICAgdm9pZCBBZGRQYXRoKFN0cmluZ1JlZiBQYXRoLCBmcm9udGVuZDo6SW5jbHVkZURpckdyb3VwIEdyb3VwLApAQCAtMTczLDYgKzE4MiwxMCBAQAogICB2b2lkIEFkZFN5c3RlbUhlYWRlclByZWZpeChTdHJpbmdSZWYgUHJlZml4LCBib29sIElzU3lzdGVtSGVhZGVyKSB7CiAgICAgU3lzdGVtSGVhZGVyUHJlZml4ZXMucHVzaF9iYWNrKFN5c3RlbUhlYWRlclByZWZpeChQcmVmaXgsIElzU3lzdGVtSGVhZGVyKSk7CiAgIH0KKworICB2b2lkIEFkZFZGU092ZXJsYXlGaWxlKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgVkZTT3ZlcmxheUZpbGVzLnB1c2hfYmFjayhOYW1lKTsKKyAgfQogfTsKIAogfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0xleC9MZXhlci5oIGIvaW5jbHVkZS9jbGFuZy9MZXgvTGV4ZXIuaAppbmRleCBmNDU2ZmE5Li41MTNlYjg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0xleC9MZXhlci5oCisrKyBiL2luY2x1ZGUvY2xhbmcvTGV4L0xleGVyLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIC8vLyBvciBidWZmZXJpbmcvc2Vla2luZyBvZiB0b2tlbnMsIG9ubHkgZm9yd2FyZCBsZXhpbmcgaXMgc3VwcG9ydGVkLiAgSXQgcmVsaWVzCiAvLy8gb24gdGhlIHNwZWNpZmllZCBQcmVwcm9jZXNzb3Igb2JqZWN0IHRvIGhhbmRsZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcywgZXRjLgogY2xhc3MgTGV4ZXIgOiBwdWJsaWMgUHJlcHJvY2Vzc29yTGV4ZXIgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAKICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAgIC8vIENvbnN0YW50IGNvbmZpZ3VyYXRpb24gdmFsdWVzIGZvciB0aGlzIGxleGVyLgpAQCAtMTQ1LDcgKzE0NSw3IEBACiBwcml2YXRlOgogICAvLy8gSW5kaXJlY3RMZXggLSBBbiBpbmRpcmVjdCBjYWxsIHRvICdMZXgnIHRoYXQgY2FuIGJlIGludm9rZWQgdmlhCiAgIC8vLyAgdGhlIFByZXByb2Nlc3NvckxleGVyIGludGVyZmFjZS4KLSAgdm9pZCBJbmRpcmVjdExleChUb2tlbiAmUmVzdWx0KSB7IExleChSZXN1bHQpOyB9CisgIHZvaWQgSW5kaXJlY3RMZXgoVG9rZW4gJlJlc3VsdCkgb3ZlcnJpZGUgeyBMZXgoUmVzdWx0KTsgfQogCiBwdWJsaWM6CiAgIC8vLyBMZXhGcm9tUmF3TGV4ZXIgLSBMZXggYSB0b2tlbiBmcm9tIGEgZGVzaWduYXRlZCByYXcgbGV4ZXIgKG9uZSB3aXRoIG5vCkBAIC0yMTgsNyArMjE4LDkgQEAKIAogICAvLy8gZ2V0U291cmNlTG9jYXRpb24gLSBSZXR1cm4gYSBzb3VyY2UgbG9jYXRpb24gZm9yIHRoZSBuZXh0IGNoYXJhY3RlciBpbgogICAvLy8gdGhlIGN1cnJlbnQgZmlsZS4KLSAgU291cmNlTG9jYXRpb24gZ2V0U291cmNlTG9jYXRpb24oKSB7IHJldHVybiBnZXRTb3VyY2VMb2NhdGlvbihCdWZmZXJQdHIpOyB9CisgIFNvdXJjZUxvY2F0aW9uIGdldFNvdXJjZUxvY2F0aW9uKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRTb3VyY2VMb2NhdGlvbihCdWZmZXJQdHIpOworICB9CiAKICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGJ1ZmZlci4KICAgY29uc3QgY2hhciAqZ2V0QnVmZmVyTG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBCdWZmZXJQdHI7IH0KQEAgLTYxNCw4ICs2MTYsMjggQEAKICAgLy8vIFxyZXR1cm4gVGhlIFVuaWNvZGUgY29kZXBvaW50IHNwZWNpZmllZCBieSB0aGUgVUNOLCBvciAwIGlmIHRoZSBVQ04gaXMKICAgLy8vICAgICAgICAgaW52YWxpZC4KICAgdWludDMyX3QgdHJ5UmVhZFVDTihjb25zdCBjaGFyIComQ3VyUHRyLCBjb25zdCBjaGFyICpTbGFzaExvYywgVG9rZW4gKlRvayk7Ci19OwogCisgIC8vLyBcYnJpZWYgVHJ5IHRvIGNvbnN1bWUgYSBVQ04gYXMgcGFydCBvZiBhbiBpZGVudGlmaWVyIGF0IHRoZSBjdXJyZW50CisgIC8vLyBsb2NhdGlvbi4KKyAgLy8vIFxwYXJhbSBDdXJQdHIgSW5pdGlhbGx5IHBvaW50cyB0byB0aGUgcmFuZ2Ugb2YgY2hhcmFjdGVycyBpbiB0aGUgc291cmNlCisgIC8vLyAgICAgICAgICAgICAgIGJ1ZmZlciBjb250YWluaW5nIHRoZSAnXCcuIFVwZGF0ZWQgdG8gcG9pbnQgcGFzdCB0aGUgZW5kIG9mCisgIC8vLyAgICAgICAgICAgICAgIHRoZSBVQ04gb24gc3VjY2Vzcy4KKyAgLy8vIFxwYXJhbSBTaXplIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBvY2N1cGllZCBieSB0aGUgJ1wnIChpbmNsdWRpbmcKKyAgLy8vICAgICAgICAgICAgIHRyaWdyYXBocyBhbmQgZXNjYXBlZCBuZXdsaW5lcykuCisgIC8vLyBccGFyYW0gUmVzdWx0IFRoZSB0b2tlbiBiZWluZyBwcm9kdWNlZC4gTWFya2VkIGFzIGNvbnRhaW5pbmcgYSBVQ04gb24KKyAgLy8vICAgICAgICAgICAgICAgc3VjY2Vzcy4KKyAgLy8vIFxyZXR1cm4gXGMgdHJ1ZSBpZiBhIFVDTiB3YXMgbGV4ZWQgYW5kIGl0IHByb2R1Y2VkIGFuIGFjY2VwdGFibGUKKyAgLy8vICAgICAgICAgaWRlbnRpZmllciBjaGFyYWN0ZXIsIFxjIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCB0cnlDb25zdW1lSWRlbnRpZmllclVDTihjb25zdCBjaGFyIComQ3VyUHRyLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZSZXN1bHQpOworCisgIC8vLyBcYnJpZWYgVHJ5IHRvIGNvbnN1bWUgYW4gaWRlbnRpZmllciBjaGFyYWN0ZXIgZW5jb2RlZCBpbiBVVEYtOC4KKyAgLy8vIFxwYXJhbSBDdXJQdHIgUG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgKHBvdGVudGlhbCkgVVRGLTggY29kZSB1bml0CisgIC8vLyAgICAgICAgc2VxdWVuY2UuIE9uIHN1Y2Nlc3MsIHVwZGF0ZWQgdG8gcG9pbnQgcGFzdCB0aGUgZW5kIG9mIGl0LgorICAvLy8gXHJldHVybiBcYyB0cnVlIGlmIGEgVVRGLTggc2VxdWVuY2UgbWFwcGluZyB0byBhbiBhY2NlcHRhYmxlIGlkZW50aWZpZXIKKyAgLy8vICAgICAgICAgY2hhcmFjdGVyIHdhcyBsZXhlZCwgXGMgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIHRyeUNvbnN1bWVJZGVudGlmaWVyVVRGOENoYXIoY29uc3QgY2hhciAqJkN1clB0cik7Cit9OwogCiB9ICAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvTGV4L0xpdGVyYWxTdXBwb3J0LmggYi9pbmNsdWRlL2NsYW5nL0xleC9MaXRlcmFsU3VwcG9ydC5oCmluZGV4IDY0ZDVhYTIuLjNlNTI0MTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvTGV4L0xpdGVyYWxTdXBwb3J0LmgKKysrIGIvaW5jbHVkZS9jbGFuZy9MZXgvTGl0ZXJhbFN1cHBvcnQuaApAQCAtMzMsNiArMzMsOSBAQAogY2xhc3MgU291cmNlTWFuYWdlcjsKIGNsYXNzIExhbmdPcHRpb25zOwogCisvLy8gQ29weSBjaGFyYWN0ZXJzIGZyb20gSW5wdXQgdG8gQnVmLCBleHBhbmRpbmcgYW55IFVDTnMuCit2b2lkIGV4cGFuZFVDTnMoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZCdWYsIFN0cmluZ1JlZiBJbnB1dCk7CisKIC8vLyBOdW1lcmljTGl0ZXJhbFBhcnNlciAtIFRoaXMgcGVyZm9ybXMgc3RyaWN0IHNlbWFudGljIGFuYWx5c2lzIG9mIHRoZSBjb250ZW50CiAvLy8gb2YgYSBwcG51bWJlciwgY2xhc3NpZnlpbmcgaXQgYXMgZWl0aGVyIGludGVnZXIsIGZsb2F0aW5nLCBvciBlcnJvbmVvdXMsCiAvLy8gZGV0ZXJtaW5lcyB0aGUgcmFkaXggb2YgdGhlIHZhbHVlIGFuZCBjYW4gY29udmVydCBpdCB0byBhIHVzZWZ1bCB2YWx1ZS4KQEAgLTQ4LDYgKzUxLDggQEAKIAogICBib29sIHNhd19leHBvbmVudCwgc2F3X3BlcmlvZCwgc2F3X3VkX3N1ZmZpeDsKIAorICBTbWFsbFN0cmluZzwzMj4gVURTdWZmaXhCdWY7CisKIHB1YmxpYzoKICAgTnVtZXJpY0xpdGVyYWxQYXJzZXIoU3RyaW5nUmVmIFRva1NwZWxsaW5nLAogICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUb2tMb2MsCkBAIC03Miw3ICs3Nyw3IEBACiAgIH0KICAgU3RyaW5nUmVmIGdldFVEU3VmZml4KCkgY29uc3QgewogICAgIGFzc2VydChzYXdfdWRfc3VmZml4KTsKLSAgICByZXR1cm4gU3RyaW5nUmVmKFN1ZmZpeEJlZ2luLCBUaGlzVG9rRW5kIC0gU3VmZml4QmVnaW4pOworICAgIHJldHVybiBVRFN1ZmZpeEJ1ZjsKICAgfQogICB1bnNpZ25lZCBnZXRVRFN1ZmZpeE9mZnNldCgpIGNvbnN0IHsKICAgICBhc3NlcnQoc2F3X3VkX3N1ZmZpeCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0xleC9NYWNyb0luZm8uaCBiL2luY2x1ZGUvY2xhbmcvTGV4L01hY3JvSW5mby5oCmluZGV4IDhjYjM3MGUuLjE1ODBkMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvTGV4L01hY3JvSW5mby5oCisrKyBiL2luY2x1ZGUvY2xhbmcvTGV4L01hY3JvSW5mby5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8Y2Fzc2VydD4KIAogbmFtZXNwYWNlIGNsYW5nIHsKLSAgY2xhc3MgUHJlcHJvY2Vzc29yOworY2xhc3MgUHJlcHJvY2Vzc29yOwogCiAvLy8gXGJyaWVmIEVuY2Fwc3VsYXRlcyB0aGUgZGF0YSBhYm91dCBhIG1hY3JvIGRlZmluaXRpb24gKGUuZy4gaXRzIHRva2VucykuCiAvLy8KQEAgLTMzOCwxMiArMzM4LDYgQEAKICAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBtYWNybyBkaXJlY3RpdmUgd2FzIGxvYWRlZCBmcm9tIGEgUENIIGZpbGUuCiAgIGJvb2wgSXNGcm9tUENIIDogMTsKIAotICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIG1hY3JvIGRpcmVjdGl2ZSBpcyBjdXJyZW50bHkgImhpZGRlbiIuCi0gIC8vLwotICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgdHJhbnNpZW50IHN0YXRlIHRoYXQgaXMgbmV2ZXIgc2VyaWFsaXplZCB0byB0aGUgQVNUCi0gIC8vLyBmaWxlLgotICBib29sIElzSGlkZGVuIDogMTsKLQogICAvLyBVc2VkIGJ5IERlZk1hY3JvRGlyZWN0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KIAogICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBtYWNybyB3YXMgaW1wb3J0ZWQgZnJvbSBhIG1vZHVsZS4KQEAgLTM2MCwxMCArMzU0LDEwIEBACiAgIGJvb2wgSXNQdWJsaWMgOiAxOwogCiAgIE1hY3JvRGlyZWN0aXZlKEtpbmQgSywgU291cmNlTG9jYXRpb24gTG9jKQotICAgIDogUHJldmlvdXMoMCksIExvYyhMb2MpLCBNREtpbmQoSyksIElzRnJvbVBDSChmYWxzZSksIElzSGlkZGVuKGZhbHNlKSwKKyAgICA6IFByZXZpb3VzKDApLCBMb2MoTG9jKSwgTURLaW5kKEspLCBJc0Zyb21QQ0goZmFsc2UpLAogICAgICAgSXNJbXBvcnRlZChmYWxzZSksIElzQW1iaWd1b3VzKGZhbHNlKSwKICAgICAgIElzUHVibGljKHRydWUpIHsKLSAgfQorICB9IAogCiBwdWJsaWM6CiAgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQoTURLaW5kKTsgfQpAQCAtMzg2LDEyICszODAsNiBAQAogCiAgIHZvaWQgc2V0SXNGcm9tUENIKCkgeyBJc0Zyb21QQ0ggPSB0cnVlOyB9CiAKLSAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIG1hY3JvIGRpcmVjdGl2ZSBpcyBoaWRkZW4uCi0gIGJvb2wgaXNIaWRkZW4oKSBjb25zdCB7IHJldHVybiBJc0hpZGRlbjsgfQotCi0gIC8vLyBcYnJpZWYgU2V0IHdoZXRoZXIgdGhpcyBtYWNybyBkaXJlY3RpdmUgaXMgaGlkZGVuLgotICB2b2lkIHNldEhpZGRlbihib29sIFZhbCkgeyBJc0hpZGRlbiA9IFZhbDsgfQotCiAgIGNsYXNzIERlZkluZm8gewogICAgIERlZk1hY3JvRGlyZWN0aXZlICpEZWZEaXJlY3RpdmU7CiAgICAgU291cmNlTG9jYXRpb24gVW5kZWZMb2M7CkBAIC00MjMsMzEgKzQxMSwzMSBAQAogCiAgICAgTExWTV9FWFBMSUNJVCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaXNWYWxpZCgpOyB9CiAKLSAgICBpbmxpbmUgRGVmSW5mbyBnZXRQcmV2aW91c0RlZmluaXRpb24oYm9vbCBBbGxvd0hpZGRlbiA9IGZhbHNlKTsKLSAgICBjb25zdCBEZWZJbmZvIGdldFByZXZpb3VzRGVmaW5pdGlvbihib29sIEFsbG93SGlkZGVuID0gZmFsc2UpIGNvbnN0IHsKLSAgICAgIHJldHVybiBjb25zdF9jYXN0PERlZkluZm8qPih0aGlzKS0+Z2V0UHJldmlvdXNEZWZpbml0aW9uKEFsbG93SGlkZGVuKTsKKyAgICBpbmxpbmUgRGVmSW5mbyBnZXRQcmV2aW91c0RlZmluaXRpb24oKTsKKyAgICBjb25zdCBEZWZJbmZvIGdldFByZXZpb3VzRGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PERlZkluZm8qPih0aGlzKS0+Z2V0UHJldmlvdXNEZWZpbml0aW9uKCk7CiAgICAgfQogICB9OwogCiAgIC8vLyBcYnJpZWYgVHJhdmVyc2VzIHRoZSBtYWNybyBkaXJlY3RpdmVzIGhpc3RvcnkgYW5kIHJldHVybnMgdGhlIG5leHQKICAgLy8vIG1hY3JvIGRlZmluaXRpb24gZGlyZWN0aXZlIGFsb25nIHdpdGggaW5mbyBhYm91dCBpdHMgdW5kZWZpbmVkIGxvY2F0aW9uCiAgIC8vLyAoaWYgdGhlcmUgaXMgb25lKSBhbmQgaWYgaXQgaXMgcHVibGljIG9yIHByaXZhdGUuCi0gIERlZkluZm8gZ2V0RGVmaW5pdGlvbihib29sIEFsbG93SGlkZGVuID0gZmFsc2UpOwotICBjb25zdCBEZWZJbmZvIGdldERlZmluaXRpb24oYm9vbCBBbGxvd0hpZGRlbiA9IGZhbHNlKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TWFjcm9EaXJlY3RpdmUqPih0aGlzKS0+Z2V0RGVmaW5pdGlvbihBbGxvd0hpZGRlbik7CisgIERlZkluZm8gZ2V0RGVmaW5pdGlvbigpOworICBjb25zdCBEZWZJbmZvIGdldERlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TWFjcm9EaXJlY3RpdmUqPih0aGlzKS0+Z2V0RGVmaW5pdGlvbigpOwogICB9CiAKLSAgYm9vbCBpc0RlZmluZWQoYm9vbCBBbGxvd0hpZGRlbiA9IGZhbHNlKSBjb25zdCB7Ci0gICAgaWYgKGNvbnN0IERlZkluZm8gRGVmID0gZ2V0RGVmaW5pdGlvbihBbGxvd0hpZGRlbikpCisgIGJvb2wgaXNEZWZpbmVkKCkgY29uc3QgeworICAgIGlmIChjb25zdCBEZWZJbmZvIERlZiA9IGdldERlZmluaXRpb24oKSkKICAgICAgIHJldHVybiAhRGVmLmlzVW5kZWZpbmVkKCk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgY29uc3QgTWFjcm9JbmZvICpnZXRNYWNyb0luZm8oYm9vbCBBbGxvd0hpZGRlbiA9IGZhbHNlKSBjb25zdCB7Ci0gICAgcmV0dXJuIGdldERlZmluaXRpb24oQWxsb3dIaWRkZW4pLmdldE1hY3JvSW5mbygpOworICBjb25zdCBNYWNyb0luZm8gKmdldE1hY3JvSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RGVmaW5pdGlvbigpLmdldE1hY3JvSW5mbygpOwogICB9Ci0gIE1hY3JvSW5mbyAqZ2V0TWFjcm9JbmZvKGJvb2wgQWxsb3dIaWRkZW4gPSBmYWxzZSkgewotICAgIHJldHVybiBnZXREZWZpbml0aW9uKEFsbG93SGlkZGVuKS5nZXRNYWNyb0luZm8oKTsKKyAgTWFjcm9JbmZvICpnZXRNYWNyb0luZm8oKSB7CisgICAgcmV0dXJuIGdldERlZmluaXRpb24oKS5nZXRNYWNyb0luZm8oKTsKICAgfQogCiAgIC8vLyBcYnJpZWYgRmluZCBtYWNybyBkZWZpbml0aW9uIGFjdGl2ZSBpbiB0aGUgc3BlY2lmaWVkIHNvdXJjZSBsb2NhdGlvbi4gSWYKQEAgLTUzOCwxMCArNTI2LDEwIEBACiB9CiAKIGlubGluZSBNYWNyb0RpcmVjdGl2ZTo6RGVmSW5mbwotTWFjcm9EaXJlY3RpdmU6OkRlZkluZm86OmdldFByZXZpb3VzRGVmaW5pdGlvbihib29sIEFsbG93SGlkZGVuKSB7CitNYWNyb0RpcmVjdGl2ZTo6RGVmSW5mbzo6Z2V0UHJldmlvdXNEZWZpbml0aW9uKCkgewogICBpZiAoaXNJbnZhbGlkKCkgfHwgRGVmRGlyZWN0aXZlLT5nZXRQcmV2aW91cygpID09IDApCiAgICAgcmV0dXJuIERlZkluZm8oKTsKLSAgcmV0dXJuIERlZkRpcmVjdGl2ZS0+Z2V0UHJldmlvdXMoKS0+Z2V0RGVmaW5pdGlvbihBbGxvd0hpZGRlbik7CisgIHJldHVybiBEZWZEaXJlY3RpdmUtPmdldFByZXZpb3VzKCktPmdldERlZmluaXRpb24oKTsKIH0KIAogfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9MZXgvTWFrZWZpbGUgYi9pbmNsdWRlL2NsYW5nL0xleC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyYjlhMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NsYW5nL0xleC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUNMQU5HX0xFVkVMIDo9IC4uLy4uLy4uCi1URF9TUkNfRElSID0gJChQUk9KX1NSQ19ESVIpLy4uL0Jhc2ljCi1CVUlMVF9TT1VSQ0VTID0gQXR0clNwZWxsaW5ncy5pbmMgCi0KLVRBQkxFR0VOX0lOQ19GSUxFU19DT01NT04gPSAxCi0KLWluY2x1ZGUgJChDTEFOR19MRVZFTCkvTWFrZWZpbGUKLQotJChPYmpEaXIpL0F0dHJTcGVsbGluZ3MuaW5jLnRtcCA6ICQoVERfU1JDX0RJUikvQXR0ci50ZCAkKENMQU5HX1RCTEdFTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoT2JqRGlyKS8uZGlyCi0JJChFY2hvKSAiQnVpbGRpbmcgQ2xhbmcgYXR0cmlidXRlIHNwZWxsaW5ncyB3aXRoIHRibGdlbiIKLQkkKFZlcmIpICQoQ2xhbmdUYWJsZUdlbikgLWdlbi1jbGFuZy1hdHRyLXNwZWxsaW5nLWxpc3QgLW8gJChjYWxsIFNZU1BBVEgsICRAKSBcCi0JCS1JICQoUFJPSl9TUkNfRElSKS8uLi8uLi8gJDwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvTGV4L01vZHVsZU1hcC5oIGIvaW5jbHVkZS9jbGFuZy9MZXgvTW9kdWxlTWFwLmgKaW5kZXggM2ExNzE1Ny4uMWNkNmQzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9MZXgvTW9kdWxlTWFwLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9MZXgvTW9kdWxlTWFwLmgKQEAgLTM4LDcgKzM4LDcgQEAKICAgCiBjbGFzcyBNb2R1bGVNYXAgewogICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3I7Ci0gIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3M7CisgIERpYWdub3N0aWNzRW5naW5lICZEaWFnczsKICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzOwogICBjb25zdCBUYXJnZXRJbmZvICpUYXJnZXQ7CiAgIEhlYWRlclNlYXJjaCAmSGVhZGVySW5mbzsKQEAgLTE3NSw2ICsxNzUsMTMgQEAKICAgLy8vIHJlc29sdmVkLgogICBNb2R1bGUgKnJlc29sdmVNb2R1bGVJZChjb25zdCBNb2R1bGVJZCAmSWQsIE1vZHVsZSAqTW9kLCBib29sIENvbXBsYWluKSBjb25zdDsKIAorICAvLy8gXGJyaWVmIExvb2tzIHVwIHRoZSBtb2R1bGVzIHRoYXQgXHAgRmlsZSBjb3JyZXNwb25kcyB0by4KKyAgLy8vCisgIC8vLyBJZiBccCBGaWxlIHJlcHJlc2VudHMgYSBidWlsdGluIGhlYWRlciB3aXRoaW4gQ2xhbmcncyBidWlsdGluIGluY2x1ZGUKKyAgLy8vIGRpcmVjdG9yeSwgdGhpcyBhbHNvIGxvYWRzIGFsbCBvZiB0aGUgbW9kdWxlIG1hcHMgdG8gc2VlIGlmIGl0IHdpbGwgZ2V0CisgIC8vLyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBtb2R1bGUgKGUuZy4gaW4gL3Vzci9pbmNsdWRlKS4KKyAgSGVhZGVyc01hcDo6aXRlcmF0b3IgZmluZEtub3duSGVhZGVyKGNvbnN0IEZpbGVFbnRyeSAqRmlsZSk7CisKIHB1YmxpYzoKICAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBuZXcgbW9kdWxlIG1hcC4KICAgLy8vCkBAIC0xODIsMTMgKzE4OSwxMiBAQAogICAvLy8gVGhpcyBzb3VyY2UgbWFuYWdlciBzaG91bGQgYmUgc2hhcmVkIHdpdGggdGhlIGhlYWRlci1zZWFyY2ggbWVjaGFuaXNtLAogICAvLy8gc2luY2UgdGhleSB3aWxsIHJlZmVyIHRvIHRoZSBzYW1lIGhlYWRlcnMuCiAgIC8vLwotICAvLy8gXHBhcmFtIERDIEEgZGlhZ25vc3RpYyBjb25zdW1lciB0aGF0IHdpbGwgYmUgY2xvbmVkIGZvciB1c2UgaW4gZ2VuZXJhdGluZwotICAvLy8gZGlhZ25vc3RpY3MuCisgIC8vLyBccGFyYW0gRGlhZ3MgQSBkaWFnbm9zdGljIGVuZ2luZSB1c2VkIGZvciBkaWFnbm9zdGljcy4KICAgLy8vCiAgIC8vLyBccGFyYW0gTGFuZ09wdHMgTGFuZ3VhZ2Ugb3B0aW9ucyBmb3IgdGhpcyB0cmFuc2xhdGlvbiB1bml0LgogICAvLy8KICAgLy8vIFxwYXJhbSBUYXJnZXQgVGhlIHRhcmdldCBmb3IgdGhpcyB0cmFuc2xhdGlvbiB1bml0LgotICBNb2R1bGVNYXAoU291cmNlTWFuYWdlciAmU291cmNlTWdyLCBEaWFnbm9zdGljQ29uc3VtZXIgJkRDLAorICBNb2R1bGVNYXAoU291cmNlTWFuYWdlciAmU291cmNlTWdyLCBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MsCiAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsIGNvbnN0IFRhcmdldEluZm8gKlRhcmdldCwKICAgICAgICAgICAgIEhlYWRlclNlYXJjaCAmSGVhZGVySW5mbyk7CiAKQEAgLTIxOSw2ICsyMjUsMTkgQEAKICAgS25vd25IZWFkZXIgZmluZE1vZHVsZUZvckhlYWRlcihjb25zdCBGaWxlRW50cnkgKkZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICpSZXF1ZXN0aW5nTW9kdWxlID0gTlVMTCk7CiAKKyAgLy8vIFxicmllZiBSZXBvcnRzIGVycm9ycyBpZiBhIG1vZHVsZSBtdXN0IG5vdCBpbmNsdWRlIGEgc3BlY2lmaWMgZmlsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmVxdWVzdGluZ01vZHVsZSBUaGUgbW9kdWxlIGluY2x1ZGluZyBhIGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIEZpbGVuYW1lTG9jIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW5jbHVzaW9uJ3MgZmlsZW5hbWUuCisgIC8vLworICAvLy8gXHBhcmFtIEZpbGVuYW1lIFRoZSBpbmNsdWRlZCBmaWxlbmFtZSBhcyB3cml0dGVuLgorICAvLy8KKyAgLy8vIFxwYXJhbSBGaWxlIFRoZSBpbmNsdWRlZCBmaWxlLgorICB2b2lkIGRpYWdub3NlSGVhZGVySW5jbHVzaW9uKE1vZHVsZSAqUmVxdWVzdGluZ01vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBGaWxlbmFtZUxvYywgU3RyaW5nUmVmIEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSk7CisKICAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gaGVhZGVyIGlzIHBhcnQgb2YgYSBtb2R1bGUKICAgLy8vIG1hcmtlZCAndW5hdmFpbGFibGUnLgogICBib29sIGlzSGVhZGVySW5VbmF2YWlsYWJsZU1vZHVsZShjb25zdCBGaWxlRW50cnkgKkhlYWRlcikgY29uc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0xleC9QUENhbGxiYWNrcy5oIGIvaW5jbHVkZS9jbGFuZy9MZXgvUFBDYWxsYmFja3MuaAppbmRleCAwZTExMjE4Li45NzRhYjU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0xleC9QUENhbGxiYWNrcy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvTGV4L1BQQ2FsbGJhY2tzLmgKQEAgLTI2Nyw2ICsyNjcsMTAgQEAKICAgdmlydHVhbCB2b2lkIFNvdXJjZVJhbmdlU2tpcHBlZChTb3VyY2VSYW5nZSBSYW5nZSkgewogICB9CiAKKyAgZW51bSBDb25kaXRpb25WYWx1ZUtpbmQgeworICAgIENWS19Ob3RFdmFsdWF0ZWQsIENWS19GYWxzZSwgQ1ZLX1RydWUKKyAgfTsKKwogICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW5ldmVyIGFuIFwjaWYgaXMgc2Vlbi4KICAgLy8vIFxwYXJhbSBMb2MgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlLgogICAvLy8gXHBhcmFtIENvbmRpdGlvblJhbmdlIFRoZSBTb3VyY2VSYW5nZSBvZiB0aGUgZXhwcmVzc2lvbiBiZWluZyB0ZXN0ZWQuCkBAIC0yNzQsNyArMjc4LDcgQEAKICAgLy8vCiAgIC8vIEZJWE1FOiBiZXR0ZXIgdG8gcGFzcyBpbiBhIGxpc3QgKG9yIHRyZWUhKSBvZiBUb2tlbnMuCiAgIHZpcnR1YWwgdm9pZCBJZihTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIENvbmRpdGlvblJhbmdlLAotICAgICAgICAgICAgICAgICAgYm9vbCBDb25kaXRpb25WYWx1ZSkgeworICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVmFsdWVLaW5kIENvbmRpdGlvblZhbHVlKSB7CiAgIH0KIAogICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW5ldmVyIGFuIFwjZWxpZiBpcyBzZWVuLgpAQCAtMjg0LDcgKzI4OCw3IEBACiAgIC8vLyBccGFyYW0gSWZMb2MgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgXCNpZi9cI2lmZGVmL1wjaWZuZGVmIGRpcmVjdGl2ZS4KICAgLy8gRklYTUU6IGJldHRlciB0byBwYXNzIGluIGEgbGlzdCAob3IgdHJlZSEpIG9mIFRva2Vucy4KICAgdmlydHVhbCB2b2lkIEVsaWYoU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBDb25kaXRpb25SYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBDb25kaXRpb25WYWx1ZSwgU291cmNlTG9jYXRpb24gSWZMb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uVmFsdWVLaW5kIENvbmRpdGlvblZhbHVlLCBTb3VyY2VMb2NhdGlvbiBJZkxvYykgewogICB9CiAKICAgLy8vIFxicmllZiBIb29rIGNhbGxlZCB3aGVuZXZlciBhbiBcI2lmZGVmIGlzIHNlZW4uCkBAIC0zMjksMzUgKzMzMywzMSBAQAogICAgIGRlbGV0ZSBGaXJzdDsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBGaWxlQ2hhbmdlZChTb3VyY2VMb2NhdGlvbiBMb2MsIEZpbGVDaGFuZ2VSZWFzb24gUmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgUHJldkZJRCkgeworICB2b2lkIEZpbGVDaGFuZ2VkKFNvdXJjZUxvY2F0aW9uIExvYywgRmlsZUNoYW5nZVJlYXNvbiBSZWFzb24sCisgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgRmlsZUlEIFByZXZGSUQpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+RmlsZUNoYW5nZWQoTG9jLCBSZWFzb24sIEZpbGVUeXBlLCBQcmV2RklEKTsKICAgICBTZWNvbmQtPkZpbGVDaGFuZ2VkKExvYywgUmVhc29uLCBGaWxlVHlwZSwgUHJldkZJRCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgRmlsZVNraXBwZWQoY29uc3QgRmlsZUVudHJ5ICZQYXJlbnRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVG9rZW4gJkZpbGVuYW1lVG9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZVR5cGUpIHsKKyAgdm9pZCBGaWxlU2tpcHBlZChjb25zdCBGaWxlRW50cnkgJlBhcmVudEZpbGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVG9rZW4gJkZpbGVuYW1lVG9rLAorICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVUeXBlKSBvdmVycmlkZSB7CiAgICAgRmlyc3QtPkZpbGVTa2lwcGVkKFBhcmVudEZpbGUsIEZpbGVuYW1lVG9rLCBGaWxlVHlwZSk7CiAgICAgU2Vjb25kLT5GaWxlU2tpcHBlZChQYXJlbnRGaWxlLCBGaWxlbmFtZVRvaywgRmlsZVR5cGUpOwogICB9CiAKLSAgdmlydHVhbCBib29sIEZpbGVOb3RGb3VuZChTdHJpbmdSZWYgRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZWNvdmVyeVBhdGgpIHsKKyAgYm9vbCBGaWxlTm90Rm91bmQoU3RyaW5nUmVmIEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlY292ZXJ5UGF0aCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBGaXJzdC0+RmlsZU5vdEZvdW5kKEZpbGVOYW1lLCBSZWNvdmVyeVBhdGgpIHx8CiAgICAgICAgICAgIFNlY29uZC0+RmlsZU5vdEZvdW5kKEZpbGVOYW1lLCBSZWNvdmVyeVBhdGgpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIEluY2x1c2lvbkRpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBIYXNoTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRva2VuICZJbmNsdWRlVG9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQW5nbGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTb3VyY2VSYW5nZSBGaWxlbmFtZVJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VhcmNoUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVsYXRpdmVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqSW1wb3J0ZWQpIHsKKyAgdm9pZCBJbmNsdXNpb25EaXJlY3RpdmUoU291cmNlTG9jYXRpb24gSGFzaExvYywgY29uc3QgVG9rZW4gJkluY2x1ZGVUb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwgYm9vbCBJc0FuZ2xlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNvdXJjZVJhbmdlIEZpbGVuYW1lUmFuZ2UsIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNlYXJjaFBhdGgsIFN0cmluZ1JlZiBSZWxhdGl2ZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqSW1wb3J0ZWQpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+SW5jbHVzaW9uRGlyZWN0aXZlKEhhc2hMb2MsIEluY2x1ZGVUb2ssIEZpbGVOYW1lLCBJc0FuZ2xlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lUmFuZ2UsIEZpbGUsIFNlYXJjaFBhdGgsIFJlbGF0aXZlUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydGVkKTsKQEAgLTM2NiwxNDcgKzM2NiwxNDIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRlZCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgbW9kdWxlSW1wb3J0KFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVJZFBhdGggUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkltcG9ydGVkKSB7CisgIHZvaWQgbW9kdWxlSW1wb3J0KFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYywgTW9kdWxlSWRQYXRoIFBhdGgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqSW1wb3J0ZWQpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+bW9kdWxlSW1wb3J0KEltcG9ydExvYywgUGF0aCwgSW1wb3J0ZWQpOwogICAgIFNlY29uZC0+bW9kdWxlSW1wb3J0KEltcG9ydExvYywgUGF0aCwgSW1wb3J0ZWQpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIEVuZE9mTWFpbkZpbGUoKSB7CisgIHZvaWQgRW5kT2ZNYWluRmlsZSgpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+RW5kT2ZNYWluRmlsZSgpOwogICAgIFNlY29uZC0+RW5kT2ZNYWluRmlsZSgpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIElkZW50KFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgeworICB2b2lkIElkZW50KFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgb3ZlcnJpZGUgewogICAgIEZpcnN0LT5JZGVudChMb2MsIHN0cik7CiAgICAgU2Vjb25kLT5JZGVudChMb2MsIHN0cik7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgUHJhZ21hQ29tbWVudChTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IElkZW50aWZpZXJJbmZvICpLaW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmU3RyKSB7CisgIHZvaWQgUHJhZ21hQ29tbWVudChTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IElkZW50aWZpZXJJbmZvICpLaW5kLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJlN0cikgb3ZlcnJpZGUgewogICAgIEZpcnN0LT5QcmFnbWFDb21tZW50KExvYywgS2luZCwgU3RyKTsKICAgICBTZWNvbmQtPlByYWdtYUNvbW1lbnQoTG9jLCBLaW5kLCBTdHIpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIFByYWdtYURldGVjdE1pc21hdGNoKFNvdXJjZUxvY2F0aW9uIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJlZhbHVlKSB7CisgIHZvaWQgUHJhZ21hRGV0ZWN0TWlzbWF0Y2goU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmVmFsdWUpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+UHJhZ21hRGV0ZWN0TWlzbWF0Y2goTG9jLCBOYW1lLCBWYWx1ZSk7CiAgICAgU2Vjb25kLT5QcmFnbWFEZXRlY3RNaXNtYXRjaChMb2MsIE5hbWUsIFZhbHVlKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBQcmFnbWFNZXNzYWdlKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJhZ21hTWVzc2FnZUtpbmQgS2luZCwgU3RyaW5nUmVmIFN0cikgeworICB2b2lkIFByYWdtYU1lc3NhZ2UoU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgTmFtZXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgUHJhZ21hTWVzc2FnZUtpbmQgS2luZCwgU3RyaW5nUmVmIFN0cikgb3ZlcnJpZGUgewogICAgIEZpcnN0LT5QcmFnbWFNZXNzYWdlKExvYywgTmFtZXNwYWNlLCBLaW5kLCBTdHIpOwogICAgIFNlY29uZC0+UHJhZ21hTWVzc2FnZShMb2MsIE5hbWVzcGFjZSwgS2luZCwgU3RyKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBQcmFnbWFEaWFnbm9zdGljUHVzaChTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZXNwYWNlKSB7CisgIHZvaWQgUHJhZ21hRGlhZ25vc3RpY1B1c2goU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgTmFtZXNwYWNlKSBvdmVycmlkZSB7CiAgICAgRmlyc3QtPlByYWdtYURpYWdub3N0aWNQdXNoKExvYywgTmFtZXNwYWNlKTsKICAgICBTZWNvbmQtPlByYWdtYURpYWdub3N0aWNQdXNoKExvYywgTmFtZXNwYWNlKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBQcmFnbWFEaWFnbm9zdGljUG9wKFNvdXJjZUxvY2F0aW9uIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lc3BhY2UpIHsKKyAgdm9pZCBQcmFnbWFEaWFnbm9zdGljUG9wKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIE5hbWVzcGFjZSkgb3ZlcnJpZGUgewogICAgIEZpcnN0LT5QcmFnbWFEaWFnbm9zdGljUG9wKExvYywgTmFtZXNwYWNlKTsKICAgICBTZWNvbmQtPlByYWdtYURpYWdub3N0aWNQb3AoTG9jLCBOYW1lc3BhY2UpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIFByYWdtYURpYWdub3N0aWMoU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjpNYXBwaW5nIG1hcHBpbmcsIFN0cmluZ1JlZiBTdHIpIHsKKyAgdm9pZCBQcmFnbWFEaWFnbm9zdGljKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIE5hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6Ok1hcHBpbmcgbWFwcGluZywgU3RyaW5nUmVmIFN0cikgb3ZlcnJpZGUgewogICAgIEZpcnN0LT5QcmFnbWFEaWFnbm9zdGljKExvYywgTmFtZXNwYWNlLCBtYXBwaW5nLCBTdHIpOwogICAgIFNlY29uZC0+UHJhZ21hRGlhZ25vc3RpYyhMb2MsIE5hbWVzcGFjZSwgbWFwcGluZywgU3RyKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBQcmFnbWFPcGVuQ0xFeHRlbnNpb24oU291cmNlTG9jYXRpb24gTmFtZUxvYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhdGVMb2MsIHVuc2lnbmVkIFN0YXRlKSB7CisgIHZvaWQgUHJhZ21hT3BlbkNMRXh0ZW5zaW9uKFNvdXJjZUxvY2F0aW9uIE5hbWVMb2MsIGNvbnN0IElkZW50aWZpZXJJbmZvICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGF0ZUxvYywgdW5zaWduZWQgU3RhdGUpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+UHJhZ21hT3BlbkNMRXh0ZW5zaW9uKE5hbWVMb2MsIE5hbWUsIFN0YXRlTG9jLCBTdGF0ZSk7CiAgICAgU2Vjb25kLT5QcmFnbWFPcGVuQ0xFeHRlbnNpb24oTmFtZUxvYywgTmFtZSwgU3RhdGVMb2MsIFN0YXRlKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBQcmFnbWFXYXJuaW5nKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIFdhcm5pbmdTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxpbnQ+IElkcykgeworICB2b2lkIFByYWdtYVdhcm5pbmcoU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgV2FybmluZ1NwZWMsCisgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxpbnQ+IElkcykgb3ZlcnJpZGUgewogICAgIEZpcnN0LT5QcmFnbWFXYXJuaW5nKExvYywgV2FybmluZ1NwZWMsIElkcyk7CiAgICAgU2Vjb25kLT5QcmFnbWFXYXJuaW5nKExvYywgV2FybmluZ1NwZWMsIElkcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgUHJhZ21hV2FybmluZ1B1c2goU291cmNlTG9jYXRpb24gTG9jLCBpbnQgTGV2ZWwpIHsKKyAgdm9pZCBQcmFnbWFXYXJuaW5nUHVzaChTb3VyY2VMb2NhdGlvbiBMb2MsIGludCBMZXZlbCkgb3ZlcnJpZGUgewogICAgIEZpcnN0LT5QcmFnbWFXYXJuaW5nUHVzaChMb2MsIExldmVsKTsKICAgICBTZWNvbmQtPlByYWdtYVdhcm5pbmdQdXNoKExvYywgTGV2ZWwpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIFByYWdtYVdhcm5pbmdQb3AoU291cmNlTG9jYXRpb24gTG9jKSB7CisgIHZvaWQgUHJhZ21hV2FybmluZ1BvcChTb3VyY2VMb2NhdGlvbiBMb2MpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+UHJhZ21hV2FybmluZ1BvcChMb2MpOwogICAgIFNlY29uZC0+UHJhZ21hV2FybmluZ1BvcChMb2MpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIE1hY3JvRXhwYW5kcyhjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLCBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUmFuZ2UsIGNvbnN0IE1hY3JvQXJncyAqQXJncykgeworICB2b2lkIE1hY3JvRXhwYW5kcyhjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLCBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlLCBjb25zdCBNYWNyb0FyZ3MgKkFyZ3MpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+TWFjcm9FeHBhbmRzKE1hY3JvTmFtZVRvaywgTUQsIFJhbmdlLCBBcmdzKTsKICAgICBTZWNvbmQtPk1hY3JvRXhwYW5kcyhNYWNyb05hbWVUb2ssIE1ELCBSYW5nZSwgQXJncyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgTWFjcm9EZWZpbmVkKGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCkgeworICB2b2lkIE1hY3JvRGVmaW5lZChjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLCBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+TWFjcm9EZWZpbmVkKE1hY3JvTmFtZVRvaywgTUQpOwogICAgIFNlY29uZC0+TWFjcm9EZWZpbmVkKE1hY3JvTmFtZVRvaywgTUQpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIE1hY3JvVW5kZWZpbmVkKGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpIHsKKyAgdm9pZCBNYWNyb1VuZGVmaW5lZChjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCkgb3ZlcnJpZGUgewogICAgIEZpcnN0LT5NYWNyb1VuZGVmaW5lZChNYWNyb05hbWVUb2ssIE1EKTsKICAgICBTZWNvbmQtPk1hY3JvVW5kZWZpbmVkKE1hY3JvTmFtZVRvaywgTUQpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIERlZmluZWQoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1ELAotICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSYW5nZSkgeworICB2b2lkIERlZmluZWQoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1ELAorICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUmFuZ2UpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+RGVmaW5lZChNYWNyb05hbWVUb2ssIE1ELCBSYW5nZSk7CiAgICAgU2Vjb25kLT5EZWZpbmVkKE1hY3JvTmFtZVRvaywgTUQsIFJhbmdlKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBTb3VyY2VSYW5nZVNraXBwZWQoU291cmNlUmFuZ2UgUmFuZ2UpIHsKKyAgdm9pZCBTb3VyY2VSYW5nZVNraXBwZWQoU291cmNlUmFuZ2UgUmFuZ2UpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+U291cmNlUmFuZ2VTa2lwcGVkKFJhbmdlKTsKICAgICBTZWNvbmQtPlNvdXJjZVJhbmdlU2tpcHBlZChSYW5nZSk7CiAgIH0KIAogICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW5ldmVyIGFuIFwjaWYgaXMgc2Vlbi4KLSAgdmlydHVhbCB2b2lkIElmKFNvdXJjZUxvY2F0aW9uIExvYywgU291cmNlUmFuZ2UgQ29uZGl0aW9uUmFuZ2UsCi0gICAgICAgICAgICAgICAgICBib29sIENvbmRpdGlvblZhbHVlKSB7CisgIHZvaWQgSWYoU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBDb25kaXRpb25SYW5nZSwKKyAgICAgICAgICBDb25kaXRpb25WYWx1ZUtpbmQgQ29uZGl0aW9uVmFsdWUpIG92ZXJyaWRlIHsKICAgICBGaXJzdC0+SWYoTG9jLCBDb25kaXRpb25SYW5nZSwgQ29uZGl0aW9uVmFsdWUpOwogICAgIFNlY29uZC0+SWYoTG9jLCBDb25kaXRpb25SYW5nZSwgQ29uZGl0aW9uVmFsdWUpOwogICB9CiAKICAgLy8vIFxicmllZiBIb29rIGNhbGxlZCB3aGVuZXZlciBhbiBcI2VsaWYgaXMgc2Vlbi4KLSAgdmlydHVhbCB2b2lkIEVsaWYoU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBDb25kaXRpb25SYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBDb25kaXRpb25WYWx1ZSwgU291cmNlTG9jYXRpb24gSWZMb2MpIHsKKyAgdm9pZCBFbGlmKFNvdXJjZUxvY2F0aW9uIExvYywgU291cmNlUmFuZ2UgQ29uZGl0aW9uUmFuZ2UsCisgICAgICAgICAgICBDb25kaXRpb25WYWx1ZUtpbmQgQ29uZGl0aW9uVmFsdWUsIFNvdXJjZUxvY2F0aW9uIElmTG9jKSBvdmVycmlkZSB7CiAgICAgRmlyc3QtPkVsaWYoTG9jLCBDb25kaXRpb25SYW5nZSwgQ29uZGl0aW9uVmFsdWUsIElmTG9jKTsKICAgICBTZWNvbmQtPkVsaWYoTG9jLCBDb25kaXRpb25SYW5nZSwgQ29uZGl0aW9uVmFsdWUsIElmTG9jKTsKICAgfQogCiAgIC8vLyBcYnJpZWYgSG9vayBjYWxsZWQgd2hlbmV2ZXIgYW4gXCNpZmRlZiBpcyBzZWVuLgotICB2aXJ0dWFsIHZvaWQgSWZkZWYoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKSB7CisgIHZvaWQgSWZkZWYoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCkgb3ZlcnJpZGUgewogICAgIEZpcnN0LT5JZmRlZihMb2MsIE1hY3JvTmFtZVRvaywgTUQpOwogICAgIFNlY29uZC0+SWZkZWYoTG9jLCBNYWNyb05hbWVUb2ssIE1EKTsKICAgfQogCiAgIC8vLyBcYnJpZWYgSG9vayBjYWxsZWQgd2hlbmV2ZXIgYW4gXCNpZm5kZWYgaXMgc2Vlbi4KLSAgdmlydHVhbCB2b2lkIElmbmRlZihTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKSB7CisgIHZvaWQgSWZuZGVmKFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywKKyAgICAgICAgICAgICAgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKSBvdmVycmlkZSB7CiAgICAgRmlyc3QtPklmbmRlZihMb2MsIE1hY3JvTmFtZVRvaywgTUQpOwogICAgIFNlY29uZC0+SWZuZGVmKExvYywgTWFjcm9OYW1lVG9rLCBNRCk7CiAgIH0KIAogICAvLy8gXGJyaWVmIEhvb2sgY2FsbGVkIHdoZW5ldmVyIGFuIFwjZWxzZSBpcyBzZWVuLgotICB2aXJ0dWFsIHZvaWQgRWxzZShTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZUxvY2F0aW9uIElmTG9jKSB7CisgIHZvaWQgRWxzZShTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZUxvY2F0aW9uIElmTG9jKSBvdmVycmlkZSB7CiAgICAgRmlyc3QtPkVsc2UoTG9jLCBJZkxvYyk7CiAgICAgU2Vjb25kLT5FbHNlKExvYywgSWZMb2MpOwogICB9CiAKICAgLy8vIFxicmllZiBIb29rIGNhbGxlZCB3aGVuZXZlciBhbiBcI2VuZGlmIGlzIHNlZW4uCi0gIHZpcnR1YWwgdm9pZCBFbmRpZihTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZUxvY2F0aW9uIElmTG9jKSB7CisgIHZvaWQgRW5kaWYoU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VMb2NhdGlvbiBJZkxvYykgb3ZlcnJpZGUgewogICAgIEZpcnN0LT5FbmRpZihMb2MsIElmTG9jKTsKICAgICBTZWNvbmQtPkVuZGlmKExvYywgSWZMb2MpOwogICB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0xleC9QUENvbmRpdGlvbmFsRGlyZWN0aXZlUmVjb3JkLmggYi9pbmNsdWRlL2NsYW5nL0xleC9QUENvbmRpdGlvbmFsRGlyZWN0aXZlUmVjb3JkLmgKaW5kZXggNTRhMTMyZC4uMDBkMmQ1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9MZXgvUFBDb25kaXRpb25hbERpcmVjdGl2ZVJlY29yZC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvTGV4L1BQQ29uZGl0aW9uYWxEaXJlY3RpdmVSZWNvcmQuaApAQCAtODYsMTYgKzg2LDE2IEBACiAgIFNvdXJjZUxvY2F0aW9uIGZpbmRDb25kaXRpb25hbERpcmVjdGl2ZVJlZ2lvbkxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0OwogCiBwcml2YXRlOgotICB2aXJ0dWFsIHZvaWQgSWYoU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBDb25kaXRpb25SYW5nZSwKLSAgICAgICAgICAgICAgICAgIGJvb2wgQ29uZGl0aW9uVmFsdWUpOwotICB2aXJ0dWFsIHZvaWQgRWxpZihTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIENvbmRpdGlvblJhbmdlLAotICAgICAgICAgICAgICAgICAgICBib29sIENvbmRpdGlvblZhbHVlLCBTb3VyY2VMb2NhdGlvbiBJZkxvYyk7Ci0gIHZpcnR1YWwgdm9pZCBJZmRlZihTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpOwotICB2aXJ0dWFsIHZvaWQgSWZuZGVmKFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpOwotICB2aXJ0dWFsIHZvaWQgRWxzZShTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZUxvY2F0aW9uIElmTG9jKTsKLSAgdmlydHVhbCB2b2lkIEVuZGlmKFNvdXJjZUxvY2F0aW9uIExvYywgU291cmNlTG9jYXRpb24gSWZMb2MpOworICB2b2lkIElmKFNvdXJjZUxvY2F0aW9uIExvYywgU291cmNlUmFuZ2UgQ29uZGl0aW9uUmFuZ2UsCisgICAgICAgICAgQ29uZGl0aW9uVmFsdWVLaW5kIENvbmRpdGlvblZhbHVlKSBvdmVycmlkZTsKKyAgdm9pZCBFbGlmKFNvdXJjZUxvY2F0aW9uIExvYywgU291cmNlUmFuZ2UgQ29uZGl0aW9uUmFuZ2UsCisgICAgICAgICAgICBDb25kaXRpb25WYWx1ZUtpbmQgQ29uZGl0aW9uVmFsdWUsIFNvdXJjZUxvY2F0aW9uIElmTG9jKSBvdmVycmlkZTsKKyAgdm9pZCBJZmRlZihTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssCisgICAgICAgICAgICAgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKSBvdmVycmlkZTsKKyAgdm9pZCBJZm5kZWYoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgICBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpIG92ZXJyaWRlOworICB2b2lkIEVsc2UoU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VMb2NhdGlvbiBJZkxvYykgb3ZlcnJpZGU7CisgIHZvaWQgRW5kaWYoU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VMb2NhdGlvbiBJZkxvYykgb3ZlcnJpZGU7CiB9OwogCiB9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvTGV4L1BUSExleGVyLmggYi9pbmNsdWRlL2NsYW5nL0xleC9QVEhMZXhlci5oCmluZGV4IGQ3NDhiYzEuLjIzNTJjY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvTGV4L1BUSExleGVyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9MZXgvUFRITGV4ZXIuaApAQCAtOTAsMTEgKzkwLDExIEBACiAKICAgLy8vIEluZGlyZWN0TGV4IC0gQW4gaW5kaXJlY3QgY2FsbCB0byAnTGV4JyB0aGF0IGNhbiBiZSBpbnZva2VkIHZpYQogICAvLy8gIHRoZSBQcmVwcm9jZXNzb3JMZXhlciBpbnRlcmZhY2UuCi0gIHZvaWQgSW5kaXJlY3RMZXgoVG9rZW4gJlJlc3VsdCkgeyBMZXgoUmVzdWx0KTsgfQorICB2b2lkIEluZGlyZWN0TGV4KFRva2VuICZSZXN1bHQpIG92ZXJyaWRlIHsgTGV4KFJlc3VsdCk7IH0KIAogICAvLy8gZ2V0U291cmNlTG9jYXRpb24gLSBSZXR1cm4gYSBzb3VyY2UgbG9jYXRpb24gZm9yIHRoZSB0b2tlbiBpbgogICAvLy8gdGhlIGN1cnJlbnQgZmlsZS4KLSAgU291cmNlTG9jYXRpb24gZ2V0U291cmNlTG9jYXRpb24oKTsKKyAgU291cmNlTG9jYXRpb24gZ2V0U291cmNlTG9jYXRpb24oKSBvdmVycmlkZTsKIAogICAvLy8gU2tpcEJsb2NrIC0gVXNlZCBieSBQcmVwcm9jZXNzb3IgdG8gc2tpcCB0aGUgY3VycmVudCBjb25kaXRpb25hbCBibG9jay4KICAgYm9vbCBTa2lwQmxvY2soKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvTGV4L1BUSE1hbmFnZXIuaCBiL2luY2x1ZGUvY2xhbmcvTGV4L1BUSE1hbmFnZXIuaAppbmRleCBmYWQwODA2Li4xMWI1Y2VhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL0xleC9QVEhNYW5hZ2VyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9MZXgvUFRITWFuYWdlci5oCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgLy8vICBVbmxpa2UgdGhlIHZlcnNpb24gaW4gSWRlbnRpZmllclRhYmxlLCB0aGlzIHJldHVybnMgYSBwb2ludGVyIGluc3RlYWQKICAgLy8vICBvZiBhIHJlZmVyZW5jZS4gIElmIHRoZSBwb2ludGVyIGlzIE5VTEwgdGhlbiB0aGUgSWRlbnRpZmllckluZm8gY2Fubm90CiAgIC8vLyAgYmUgZm91bmQuCi0gIElkZW50aWZpZXJJbmZvICpnZXQoU3RyaW5nUmVmIE5hbWUpOworICBJZGVudGlmaWVySW5mbyAqZ2V0KFN0cmluZ1JlZiBOYW1lKSBvdmVycmlkZTsKIAogICAvLy8gQ3JlYXRlIC0gVGhpcyBtZXRob2QgY3JlYXRlcyBQVEhNYW5hZ2VyIG9iamVjdHMuICBUaGUgJ2ZpbGUnIGFyZ3VtZW50CiAgIC8vLyAgaXMgdGhlIG5hbWUgb2YgdGhlIFBUSCBmaWxlLiAgVGhpcyBtZXRob2QgcmV0dXJucyBOVUxMIHVwb24gZmFpbHVyZS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvTGV4L1ByYWdtYS5oIGIvaW5jbHVkZS9jbGFuZy9MZXgvUHJhZ21hLmgKaW5kZXggMDg3NDQ4Zi4uZjI2MzgyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9MZXgvUHJhZ21hLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9MZXgvUHJhZ21hLmgKQEAgLTc4LDggKzc4LDggQEAKIHB1YmxpYzoKICAgRW1wdHlQcmFnbWFIYW5kbGVyKCk7CiAKLSAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKTsKKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pIG92ZXJyaWRlOwogfTsKIAogLy8vIFByYWdtYU5hbWVzcGFjZSAtIFRoaXMgUHJhZ21hSGFuZGxlciBzdWJkaXZpZGVzIHRoZSBuYW1lc3BhY2Ugb2YgcHJhZ21hcywKQEAgLTExNCwxMCArMTE0LDEwIEBACiAgICAgcmV0dXJuIEhhbmRsZXJzLmVtcHR5KCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pOworICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRmlyc3RUb2tlbikgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBQcmFnbWFOYW1lc3BhY2UgKmdldElmTmFtZXNwYWNlKCkgeyByZXR1cm4gdGhpczsgfQorICBQcmFnbWFOYW1lc3BhY2UgKmdldElmTmFtZXNwYWNlKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0xleC9QcmVwcm9jZXNzaW5nUmVjb3JkLmggYi9pbmNsdWRlL2NsYW5nL0xleC9QcmVwcm9jZXNzaW5nUmVjb3JkLmgKaW5kZXggMjU4NDM0MC4uNDk1ZGE3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9MZXgvUHJlcHJvY2Vzc2luZ1JlY29yZC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvTGV4L1ByZXByb2Nlc3NpbmdSZWNvcmQuaApAQCAtMzA0LDYgKzMwNCw5IEBACiAgICAgLy8vIGFuZCBhcmUgcmVmZXJlbmNlZCBieSB0aGUgaXRlcmF0b3IgdXNpbmcgbmVnYXRpdmUgaW5kaWNlcy4KICAgICBzdGQ6OnZlY3RvcjxQcmVwcm9jZXNzZWRFbnRpdHkgKj4gTG9hZGVkUHJlcHJvY2Vzc2VkRW50aXRpZXM7CiAKKyAgICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgcmFuZ2VzIHRoYXQgd2VyZSBza2lwcGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IsCisgICAgc3RkOjp2ZWN0b3I8U291cmNlUmFuZ2U+IFNraXBwZWRSYW5nZXM7CisKICAgICAvLy8gXGJyaWVmIEdsb2JhbCAobG9hZGVkIG9yIGxvY2FsKSBJRCBmb3IgYSBwcmVwcm9jZXNzZWQgZW50aXR5LgogICAgIC8vLyBOZWdhdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgdG8gaW5kaWNhdGUgcHJlcHJvY2Vzc2VkIGVudGl0aWVzCiAgICAgLy8vIGxvYWRlZCBmcm9tIHRoZSBleHRlcm5hbCBzb3VyY2Ugd2hpbGUgbm9uLW5lZ2F0aXZlIHZhbHVlcyBhcmUgdXNlZCB0bwpAQCAtNTU2LDI4ICs1NTksMzIgQEAKICAgICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtYWNybyBkZWZpbml0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuCiAgICAgLy8vIFxjIE1hY3JvSW5mby4KICAgICBNYWNyb0RlZmluaXRpb24gKmZpbmRNYWNyb0RlZmluaXRpb24oY29uc3QgTWFjcm9JbmZvICpNSSk7CisKKyAgICAvLy8gXGJyaWVmIFJldHJpZXZlIGFsbCByYW5nZXMgdGhhdCBnb3Qgc2tpcHBlZCB3aGlsZSBwcmVwcm9jZXNzaW5nLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFNvdXJjZVJhbmdlPiAmZ2V0U2tpcHBlZFJhbmdlcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTa2lwcGVkUmFuZ2VzOworICAgIH0KICAgICAgICAgCiAgIHByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIE1hY3JvRXhwYW5kcyhjb25zdCBUb2tlbiAmSWQsIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlLCBjb25zdCBNYWNyb0FyZ3MgKkFyZ3MpOwotICAgIHZpcnR1YWwgdm9pZCBNYWNyb0RlZmluZWQoY29uc3QgVG9rZW4gJklkLCBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpOwotICAgIHZpcnR1YWwgdm9pZCBNYWNyb1VuZGVmaW5lZChjb25zdCBUb2tlbiAmSWQsIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCk7Ci0gICAgdmlydHVhbCB2b2lkIEluY2x1c2lvbkRpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBIYXNoTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVG9rZW4gJkluY2x1ZGVUb2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQW5nbGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNvdXJjZVJhbmdlIEZpbGVuYW1lUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRW50cnkgKkZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VhcmNoUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBSZWxhdGl2ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkltcG9ydGVkKTsKLSAgICB2aXJ0dWFsIHZvaWQgSWZkZWYoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpOwotICAgIHZpcnR1YWwgdm9pZCBJZm5kZWYoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKTsKKyAgICB2b2lkIE1hY3JvRXhwYW5kcyhjb25zdCBUb2tlbiAmSWQsIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCwKKyAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSYW5nZSwgY29uc3QgTWFjcm9BcmdzICpBcmdzKSBvdmVycmlkZTsKKyAgICB2b2lkIE1hY3JvRGVmaW5lZChjb25zdCBUb2tlbiAmSWQsIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCkgb3ZlcnJpZGU7CisgICAgdm9pZCBNYWNyb1VuZGVmaW5lZChjb25zdCBUb2tlbiAmSWQsIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCkgb3ZlcnJpZGU7CisgICAgdm9pZCBJbmNsdXNpb25EaXJlY3RpdmUoU291cmNlTG9jYXRpb24gSGFzaExvYywgY29uc3QgVG9rZW4gJkluY2x1ZGVUb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lLCBib29sIElzQW5nbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTb3VyY2VSYW5nZSBGaWxlbmFtZVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwgU3RyaW5nUmVmIFNlYXJjaFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkltcG9ydGVkKSBvdmVycmlkZTsKKyAgICB2b2lkIElmZGVmKFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywKKyAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCkgb3ZlcnJpZGU7CisgICAgdm9pZCBJZm5kZWYoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCkgb3ZlcnJpZGU7CiAgICAgLy8vIFxicmllZiBIb29rIGNhbGxlZCB3aGVuZXZlciB0aGUgJ2RlZmluZWQnIG9wZXJhdG9yIGlzIHNlZW4uCi0gICAgdmlydHVhbCB2b2lkIERlZmluZWQoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1ELAotICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlKTsKKyAgICB2b2lkIERlZmluZWQoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1ELAorICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSYW5nZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIFNvdXJjZVJhbmdlU2tpcHBlZChTb3VyY2VSYW5nZSBSYW5nZSkgb3ZlcnJpZGU7CiAKICAgICB2b2lkIGFkZE1hY3JvRXhwYW5zaW9uKGNvbnN0IFRva2VuICZJZCwgY29uc3QgTWFjcm9JbmZvICpNSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvTGV4L1ByZXByb2Nlc3Nvci5oIGIvaW5jbHVkZS9jbGFuZy9MZXgvUHJlcHJvY2Vzc29yLmgKaW5kZXggMjIzZmQ0Ny4uNTRkZWU2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9MZXgvUHJlcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9MZXgvUHJlcHJvY2Vzc29yLmgKQEAgLTYsOSArNiwxMCBAQAogLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgogLy8KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQcmVwcm9jZXNzb3IgaW50ZXJmYWNlLgotLy8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIGNsYW5nOjpQcmVwcm9jZXNzb3IgaW50ZXJmYWNlLgorLy8vCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiAjaWZuZGVmIExMVk1fQ0xBTkdfTEVYX1BSRVBST0NFU1NPUl9ICkBAIC0yOCwxMCArMjksMTAgQEAKICNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgogI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgbGx2bSB7CkBAIC03OCwxMSArNzksMTIgQEAKICAgfQogfTsKIAotLy8vIFByZXByb2Nlc3NvciAtIFRoaXMgb2JqZWN0IGVuZ2FnZXMgaW4gYSB0aWdodCBsaXR0bGUgZGFuY2Ugd2l0aCB0aGUgbGV4ZXIgdG8KLS8vLyBlZmZpY2llbnRseSBwcmVwcm9jZXNzIHRva2Vucy4gIExleGVycyBrbm93IG9ubHkgYWJvdXQgdG9rZW5zIHdpdGhpbiBhCi0vLy8gc2luZ2xlIHNvdXJjZSBmaWxlLCBhbmQgZG9uJ3Qga25vdyBhbnl0aGluZyBhYm91dCBwcmVwcm9jZXNzb3ItbGV2ZWwgaXNzdWVzCi0vLy8gbGlrZSB0aGUgXCNpbmNsdWRlIHN0YWNrLCB0b2tlbiBleHBhbnNpb24sIGV0Yy4KKy8vLyBcYnJpZWYgRW5nYWdlcyBpbiBhIHRpZ2h0IGxpdHRsZSBkYW5jZSB3aXRoIHRoZSBsZXhlciB0byBlZmZpY2llbnRseQorLy8vIHByZXByb2Nlc3MgdG9rZW5zLgogLy8vCisvLy8gTGV4ZXJzIGtub3cgb25seSBhYm91dCB0b2tlbnMgd2l0aGluIGEgc2luZ2xlIHNvdXJjZSBmaWxlLCBhbmQgZG9uJ3QKKy8vLyBrbm93IGFueXRoaW5nIGFib3V0IHByZXByb2Nlc3Nvci1sZXZlbCBpc3N1ZXMgbGlrZSB0aGUgXCNpbmNsdWRlIHN0YWNrLAorLy8vIHRva2VuIGV4cGFuc2lvbiwgZXRjLgogY2xhc3MgUHJlcHJvY2Vzc29yIDogcHVibGljIFJlZkNvdW50ZWRCYXNlPFByZXByb2Nlc3Nvcj4gewogICBJbnRydXNpdmVSZWZDbnRQdHI8UHJlcHJvY2Vzc29yT3B0aW9ucz4gUFBPcHRzOwogICBEaWFnbm9zdGljc0VuZ2luZSAgICAgICAgKkRpYWdzOwpAQCAtOTgsMTIgKzEwMCwxMiBAQAogICBFeHRlcm5hbFByZXByb2Nlc3NvclNvdXJjZSAqRXh0ZXJuYWxTb3VyY2U7CiAKIAotICAvLy8gUFRIIC0gQW4gb3B0aW9uYWwgUFRITWFuYWdlciBvYmplY3QgdXNlZCBmb3IgZ2V0dGluZyB0b2tlbnMgZnJvbQotICAvLy8gIGEgdG9rZW4gY2FjaGUgcmF0aGVyIHRoYW4gbGV4aW5nIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZS4KLSAgT3duaW5nUHRyPFBUSE1hbmFnZXI+IFBUSDsKKyAgLy8vIEFuIG9wdGlvbmFsIFBUSE1hbmFnZXIgb2JqZWN0IHVzZWQgZm9yIGdldHRpbmcgdG9rZW5zIGZyb20KKyAgLy8vIGEgdG9rZW4gY2FjaGUgcmF0aGVyIHRoYW4gbGV4aW5nIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZS4KKyAgc3RkOjp1bmlxdWVfcHRyPFBUSE1hbmFnZXI+IFBUSDsKIAotICAvLy8gQlAgLSBBIEJ1bXBQdHJBbGxvY2F0b3Igb2JqZWN0IHVzZWQgdG8gcXVpY2tseSBhbGxvY2F0ZSBhbmQgcmVsZWFzZQotICAvLy8gIG9iamVjdHMgaW50ZXJuYWwgdG8gdGhlIFByZXByb2Nlc3Nvci4KKyAgLy8vIEEgQnVtcFB0ckFsbG9jYXRvciBvYmplY3QgdXNlZCB0byBxdWlja2x5IGFsbG9jYXRlIGFuZCByZWxlYXNlCisgIC8vLyBvYmplY3RzIGludGVybmFsIHRvIHRoZSBQcmVwcm9jZXNzb3IuCiAgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgQlA7CiAKICAgLy8vIElkZW50aWZpZXJzIGZvciBidWlsdGluIG1hY3JvcyBhbmQgb3RoZXIgYnVpbHRpbnMuCkBAIC0xMTQsNiArMTE2LDcgQEAKICAgSWRlbnRpZmllckluZm8gKklkZW50X19USU1FU1RBTVBfXzsgICAgICAgICAgICAgIC8vIF9fVElNRVNUQU1QX18KICAgSWRlbnRpZmllckluZm8gKklkZW50X19DT1VOVEVSX187ICAgICAgICAgICAgICAgIC8vIF9fQ09VTlRFUl9fCiAgIElkZW50aWZpZXJJbmZvICpJZGVudF9QcmFnbWEsICpJZGVudF9fcHJhZ21hOyAgICAvLyBfUHJhZ21hLCBfX3ByYWdtYQorICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX2lkZW50aWZpZXI7ICAgICAgICAgICAgICAgLy8gX19pZGVudGlmaWVyCiAgIElkZW50aWZpZXJJbmZvICpJZGVudF9fVkFfQVJHU19fOyAgICAgICAgICAgICAgICAvLyBfX1ZBX0FSR1NfXwogICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX2hhc19mZWF0dXJlOyAgICAgICAgICAgICAgLy8gX19oYXNfZmVhdHVyZQogICBJZGVudGlmaWVySW5mbyAqSWRlbnRfX2hhc19leHRlbnNpb247ICAgICAgICAgICAgLy8gX19oYXNfZXh0ZW5zaW9uCkBAIC0xMjksNyArMTMyLDcgQEAKICAgdW5zaWduZWQgQ291bnRlclZhbHVlOyAgLy8gTmV4dCBfX0NPVU5URVJfXyB2YWx1ZS4KIAogICBlbnVtIHsKLSAgICAvLy8gTWF4SW5jbHVkZVN0YWNrRGVwdGggLSBNYXhpbXVtIGRlcHRoIG9mIFwjaW5jbHVkZXMuCisgICAgLy8vIFxicmllZiBNYXhpbXVtIGRlcHRoIG9mIFwjaW5jbHVkZXMuCiAgICAgTWF4QWxsb3dlZEluY2x1ZGVTdGFja0RlcHRoID0gMjAwCiAgIH07CiAKQEAgLTE0NCwxMiArMTQ3LDExIEBACiAgIC8vLyBXaGV0aGVyIHRoZSBwcmVwcm9jZXNzb3Igb3ducyB0aGUgaGVhZGVyIHNlYXJjaCBvYmplY3QuCiAgIGJvb2wgT3duc0hlYWRlclNlYXJjaCA6IDE7CiAKLSAgLy8vIERpc2FibGVNYWNyb0V4cGFuc2lvbiAtIFRydWUgaWYgbWFjcm8gZXhwYW5zaW9uIGlzIGRpc2FibGVkLgorICAvLy8gVHJ1ZSBpZiBtYWNybyBleHBhbnNpb24gaXMgZGlzYWJsZWQuCiAgIGJvb2wgRGlzYWJsZU1hY3JvRXhwYW5zaW9uIDogMTsKIAotICAvLy8gTWFjcm9FeHBhbnNpb25JbkRpcmVjdGl2ZXNPdmVycmlkZSAtIFRlbXBvcmFyaWx5IGRpc2FibGVzCi0gIC8vLyBEaXNhYmxlTWFjcm9FeHBhbnNpb24gKGkuZS4gZW5hYmxlcyBleHBhbnNpb24pIHdoZW4gcGFyc2luZyBwcmVwcm9jZXNzb3IKLSAgLy8vIGRpcmVjdGl2ZXMuCisgIC8vLyBUZW1wb3JhcmlseSBkaXNhYmxlcyBEaXNhYmxlTWFjcm9FeHBhbnNpb24gKGkuZS4gZW5hYmxlcyBleHBhbnNpb24pCisgIC8vLyB3aGVuIHBhcnNpbmcgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCiAgIGJvb2wgTWFjcm9FeHBhbnNpb25JbkRpcmVjdGl2ZXNPdmVycmlkZSA6IDE7CiAKICAgY2xhc3MgUmVzZXRNYWNyb0V4cGFuc2lvbkhlbHBlcjsKQEAgLTE2OSwyMyArMTcxLDI1IEBACiAgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB3ZSBhcmUgcHJlLWV4cGFuZGluZyBtYWNybyBhcmd1bWVudHMuCiAgIGJvb2wgSW5NYWNyb0FyZ1ByZUV4cGFuc2lvbjsKIAotICAvLy8gSWRlbnRpZmllcnMgLSBUaGlzIGlzIG1hcHBpbmcvbG9va3VwIGluZm9ybWF0aW9uIGZvciBhbGwgaWRlbnRpZmllcnMgaW4KKyAgLy8vIFxicmllZiBNYXBwaW5nL2xvb2t1cCBpbmZvcm1hdGlvbiBmb3IgYWxsIGlkZW50aWZpZXJzIGluCiAgIC8vLyB0aGUgcHJvZ3JhbSwgaW5jbHVkaW5nIHByb2dyYW0ga2V5d29yZHMuCiAgIG11dGFibGUgSWRlbnRpZmllclRhYmxlIElkZW50aWZpZXJzOwogCi0gIC8vLyBTZWxlY3RvcnMgLSBUaGlzIHRhYmxlIGNvbnRhaW5zIGFsbCB0aGUgc2VsZWN0b3JzIGluIHRoZSBwcm9ncmFtLiBVbmxpa2UKLSAgLy8vIElkZW50aWZpZXJUYWJsZSBhYm92ZSwgdGhpcyB0YWJsZSAqaXNuJ3QqIHBvcHVsYXRlZCBieSB0aGUgcHJlcHJvY2Vzc29yLgotICAvLy8gSXQgaXMgZGVjbGFyZWQvZXhwYW5kZWQgaGVyZSBiZWNhdXNlIGl0J3Mgcm9sZS9saWZldGltZSBpcwotICAvLy8gY29uY2VwdHVhbGx5IHNpbWlsYXIgdGhlIElkZW50aWZpZXJUYWJsZS4gSW4gYWRkaXRpb24sIHRoZSBjdXJyZW50IGNvbnRyb2wKLSAgLy8vIGZsb3cgKGluIGNsYW5nOjpQYXJzZUFTVCgpKSwgbWFrZSBpdCBjb252ZW5pZW50IHRvIHB1dCBoZXJlLgorICAvLy8gXGJyaWVmIFRoaXMgdGFibGUgY29udGFpbnMgYWxsIHRoZSBzZWxlY3RvcnMgaW4gdGhlIHByb2dyYW0uCisgIC8vLworICAvLy8gVW5saWtlIElkZW50aWZpZXJUYWJsZSBhYm92ZSwgdGhpcyB0YWJsZSAqaXNuJ3QqIHBvcHVsYXRlZCBieSB0aGUKKyAgLy8vIHByZXByb2Nlc3Nvci4gSXQgaXMgZGVjbGFyZWQvZXhwYW5kZWQgaGVyZSBiZWNhdXNlIGl0cyByb2xlL2xpZmV0aW1lIGlzCisgIC8vLyBjb25jZXB0dWFsbHkgc2ltaWxhciB0byB0aGUgSWRlbnRpZmllclRhYmxlLiBJbiBhZGRpdGlvbiwgdGhlIGN1cnJlbnQKKyAgLy8vIGNvbnRyb2wgZmxvdyAoaW4gY2xhbmc6OlBhcnNlQVNUKCkpLCBtYWtlIGl0IGNvbnZlbmllbnQgdG8gcHV0IGhlcmUuCisgIC8vLwogICAvLy8gRklYTUU6IE1ha2Ugc3VyZSB0aGUgbGlmZXRpbWUgb2YgSWRlbnRpZmllcnMvU2VsZWN0b3JzICppc24ndCogdGllZCB0bwogICAvLy8gdGhlIGxpZmV0aW1lIG9mIHRoZSBwcmVwcm9jZXNzb3IuCiAgIFNlbGVjdG9yVGFibGUgU2VsZWN0b3JzOwogCi0gIC8vLyBCdWlsdGluSW5mbyAtIEluZm9ybWF0aW9uIGFib3V0IGJ1aWx0aW5zLgorICAvLy8gXGJyaWVmIEluZm9ybWF0aW9uIGFib3V0IGJ1aWx0aW5zLgogICBCdWlsdGluOjpDb250ZXh0IEJ1aWx0aW5JbmZvOwogCi0gIC8vLyBQcmFnbWFIYW5kbGVycyAtIFRoaXMgdHJhY2tzIGFsbCBvZiB0aGUgcHJhZ21hcyB0aGF0IHRoZSBjbGllbnQgcmVnaXN0ZXJlZAorICAvLy8gXGJyaWVmIFRyYWNrcyBhbGwgb2YgdGhlIHByYWdtYXMgdGhhdCB0aGUgY2xpZW50IHJlZ2lzdGVyZWQKICAgLy8vIHdpdGggdGhpcyBwcmVwcm9jZXNzb3IuCiAgIFByYWdtYU5hbWVzcGFjZSAqUHJhZ21hSGFuZGxlcnM7CiAKQEAgLTE5Nyw2ICsyMDEsOSBAQAogICAvLy8gYXZvaWQgdGVhcmluZyB0aGUgTGV4ZXIgYW5kIGV0Yy4gZG93bikuCiAgIGJvb2wgSW5jcmVtZW50YWxQcm9jZXNzaW5nOwogCisgIC8vLyBUaGUga2luZCBvZiB0cmFuc2xhdGlvbiB1bml0IHdlIGFyZSBwcm9jZXNzaW5nLgorICBUcmFuc2xhdGlvblVuaXRLaW5kIFRVS2luZDsKKwogICAvLy8gXGJyaWVmIFRoZSBjb2RlLWNvbXBsZXRpb24gaGFuZGxlci4KICAgQ29kZUNvbXBsZXRpb25IYW5kbGVyICpDb2RlQ29tcGxldGU7CiAKQEAgLTIxNiw3ICsyMjMsNyBAQAogICAvLy8gZm9yIHByZXByb2Nlc3NpbmcuCiAgIFNvdXJjZUxvY2F0aW9uIENvZGVDb21wbGV0aW9uRmlsZUxvYzsKIAotICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlICdpbXBvcnQnIGNvbnRleHR1YWwga2V5d29yZCB3ZSBqdXN0IAorICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIFxjIGltcG9ydCBjb250ZXh0dWFsIGtleXdvcmQgd2UganVzdCAKICAgLy8vIGxleGVkLCBpZiBhbnkuCiAgIFNvdXJjZUxvY2F0aW9uIE1vZHVsZUltcG9ydExvYzsKIApAQCAtMjI2LDQ2ICsyMzMsNTMgQEAKICAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBsYXN0IHRva2VuIHdlIGxleGVkIHdhcyBhbiAnQCcuCiAgIGJvb2wgTGFzdFRva2VuV2FzQXQ7CiAKLSAgLy8vIFxicmllZiBXaGV0aGVyIHRoZSBtb2R1bGUgaW1wb3J0IGV4cGVjdGVzIGFuIGlkZW50aWZpZXIgbmV4dC4gT3RoZXJ3aXNlLAorICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhlIG1vZHVsZSBpbXBvcnQgZXhwZWN0cyBhbiBpZGVudGlmaWVyIG5leHQuIE90aGVyd2lzZSwKICAgLy8vIGl0IGV4cGVjdHMgYSAnLicgb3IgJzsnLgogICBib29sIE1vZHVsZUltcG9ydEV4cGVjdHNJZGVudGlmaWVyOwogICAKICAgLy8vIFxicmllZiBUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50bHktYWN0aXZlCi0gIC8vLyAjcHJhZ21hIGNsYW5nIGFyY19jZl9jb2RlX2F1ZGl0ZWQgYmVnaW4uCisgIC8vLyBcI3ByYWdtYSBjbGFuZyBhcmNfY2ZfY29kZV9hdWRpdGVkIGJlZ2luLgogICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFBUkNDRkNvZGVBdWRpdGVkTG9jOwogCiAgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB3ZSBoaXQgdGhlIGNvZGUtY29tcGxldGlvbiBwb2ludC4KICAgYm9vbCBDb2RlQ29tcGxldGlvblJlYWNoZWQ7CiAKICAgLy8vIFxicmllZiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2Ugd2lsbCBpbml0aWFsbHkgc2tpcCB3aGVuIGVudGVyaW5nIHRoZQotICAvLy8gbWFpbiBmaWxlLCB3aGljaCBpcyB1c2VkIHdoZW4gbG9hZGluZyBhIHByZWNvbXBpbGVkIHByZWFtYmxlLCBhbG9uZwotICAvLy8gd2l0aCBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBza2lwcGluZyB0aGlzIG51bWJlciBvZiBieXRlcyB3aWxsCi0gIC8vLyBwbGFjZSB0aGUgbGV4ZXIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKyAgLy8vIG1haW4gZmlsZSwgYWxvbmcgd2l0aCBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBza2lwcGluZyB0aGlzIG51bWJlcgorICAvLy8gb2YgYnl0ZXMgd2lsbCBwbGFjZSB0aGUgbGV4ZXIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgd2hlbiBsb2FkaW5nIGEgcHJlY29tcGlsZWQgcHJlYW1ibGUuCiAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgYm9vbD4gU2tpcE1haW5GaWxlUHJlYW1ibGU7CiAKLSAgLy8vIEN1ckxleGVyIC0gVGhpcyBpcyB0aGUgY3VycmVudCB0b3Agb2YgdGhlIHN0YWNrIHRoYXQgd2UncmUgbGV4aW5nIGZyb20gaWYKKyAgLy8vIFxicmllZiBUaGUgY3VycmVudCB0b3Agb2YgdGhlIHN0YWNrIHRoYXQgd2UncmUgbGV4aW5nIGZyb20gaWYKICAgLy8vIG5vdCBleHBhbmRpbmcgYSBtYWNybyBhbmQgd2UgYXJlIGxleGluZyBkaXJlY3RseSBmcm9tIHNvdXJjZSBjb2RlLgotICAvLy8gIE9ubHkgb25lIG9mIEN1ckxleGVyLCBDdXJQVEhMZXhlciwgb3IgQ3VyVG9rZW5MZXhlciB3aWxsIGJlIG5vbi1udWxsLgotICBPd25pbmdQdHI8TGV4ZXI+IEN1ckxleGVyOworICAvLy8KKyAgLy8vIE9ubHkgb25lIG9mIEN1ckxleGVyLCBDdXJQVEhMZXhlciwgb3IgQ3VyVG9rZW5MZXhlciB3aWxsIGJlIG5vbi1udWxsLgorICBzdGQ6OnVuaXF1ZV9wdHI8TGV4ZXI+IEN1ckxleGVyOwogCi0gIC8vLyBDdXJQVEhMZXhlciAtIFRoaXMgaXMgdGhlIGN1cnJlbnQgdG9wIG9mIHN0YWNrIHRoYXQgd2UncmUgbGV4aW5nIGZyb20gaWYKLSAgLy8vICBub3QgZXhwYW5kaW5nIGZyb20gYSBtYWNybyBhbmQgd2UgYXJlIGxleGluZyBmcm9tIGEgUFRIIGNhY2hlLgotICAvLy8gIE9ubHkgb25lIG9mIEN1ckxleGVyLCBDdXJQVEhMZXhlciwgb3IgQ3VyVG9rZW5MZXhlciB3aWxsIGJlIG5vbi1udWxsLgotICBPd25pbmdQdHI8UFRITGV4ZXI+IEN1clBUSExleGVyOworICAvLy8gXGJyaWVmIFRoZSBjdXJyZW50IHRvcCBvZiBzdGFjayB0aGF0IHdlJ3JlIGxleGluZyBmcm9tIGlmCisgIC8vLyBub3QgZXhwYW5kaW5nIGZyb20gYSBtYWNybyBhbmQgd2UgYXJlIGxleGluZyBmcm9tIGEgUFRIIGNhY2hlLgorICAvLy8KKyAgLy8vIE9ubHkgb25lIG9mIEN1ckxleGVyLCBDdXJQVEhMZXhlciwgb3IgQ3VyVG9rZW5MZXhlciB3aWxsIGJlIG5vbi1udWxsLgorICBzdGQ6OnVuaXF1ZV9wdHI8UFRITGV4ZXI+IEN1clBUSExleGVyOwogCi0gIC8vLyBDdXJQUExleGVyIC0gVGhpcyBpcyB0aGUgY3VycmVudCB0b3Agb2YgdGhlIHN0YWNrIHdoYXQgd2UncmUgbGV4aW5nIGZyb20KLSAgLy8vICBpZiBub3QgZXhwYW5kaW5nIGEgbWFjcm8uICBUaGlzIGlzIGFuIGFsaWFzIGZvciBlaXRoZXIgQ3VyTGV4ZXIgb3IKLSAgLy8vICBDdXJQVEhMZXhlci4KKyAgLy8vIFxicmllZiBUaGUgY3VycmVudCB0b3Agb2YgdGhlIHN0YWNrIHdoYXQgd2UncmUgbGV4aW5nIGZyb20KKyAgLy8vIGlmIG5vdCBleHBhbmRpbmcgYSBtYWNyby4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGFuIGFsaWFzIGZvciBlaXRoZXIgQ3VyTGV4ZXIgb3IgIEN1clBUSExleGVyLgogICBQcmVwcm9jZXNzb3JMZXhlciAqQ3VyUFBMZXhlcjsKIAotICAvLy8gQ3VyTG9va3VwIC0gVGhlIERpcmVjdG9yeUxvb2t1cCBzdHJ1Y3R1cmUgdXNlZCB0byBmaW5kIHRoZSBjdXJyZW50Ci0gIC8vLyBGaWxlRW50cnksIGlmIEN1ckxleGVyIGlzIG5vbi1udWxsIGFuZCBpZiBhcHBsaWNhYmxlLiAgVGhpcyBhbGxvd3MgdXMgdG8KLSAgLy8vIGltcGxlbWVudCBcI2luY2x1ZGVfbmV4dCBhbmQgZmluZCBkaXJlY3Rvcnktc3BlY2lmaWMgcHJvcGVydGllcy4KKyAgLy8vIFxicmllZiBVc2VkIHRvIGZpbmQgdGhlIGN1cnJlbnQgRmlsZUVudHJ5LCBpZiBDdXJMZXhlciBpcyBub24tbnVsbAorICAvLy8gYW5kIGlmIGFwcGxpY2FibGUuCisgIC8vLworICAvLy8gVGhpcyBhbGxvd3MgdXMgdG8gaW1wbGVtZW50IFwjaW5jbHVkZV9uZXh0IGFuZCBmaW5kIGRpcmVjdG9yeS1zcGVjaWZpYworICAvLy8gcHJvcGVydGllcy4KICAgY29uc3QgRGlyZWN0b3J5TG9va3VwICpDdXJEaXJMb29rdXA7CiAKLSAgLy8vIEN1clRva2VuTGV4ZXIgLSBUaGlzIGlzIHRoZSBjdXJyZW50IG1hY3JvIHdlIGFyZSBleHBhbmRpbmcsIGlmIHdlIGFyZQotICAvLy8gZXhwYW5kaW5nIGEgbWFjcm8uICBPbmUgb2YgQ3VyTGV4ZXIgYW5kIEN1clRva2VuTGV4ZXIgbXVzdCBiZSBudWxsLgotICBPd25pbmdQdHI8VG9rZW5MZXhlcj4gQ3VyVG9rZW5MZXhlcjsKKyAgLy8vIFxicmllZiBUaGUgY3VycmVudCBtYWNybyB3ZSBhcmUgZXhwYW5kaW5nLCBpZiB3ZSBhcmUgZXhwYW5kaW5nIGEgbWFjcm8uCisgIC8vLworICAvLy8gT25lIG9mIEN1ckxleGVyIGFuZCBDdXJUb2tlbkxleGVyIG11c3QgYmUgbnVsbC4KKyAgc3RkOjp1bmlxdWVfcHRyPFRva2VuTGV4ZXI+IEN1clRva2VuTGV4ZXI7CiAKICAgLy8vIFxicmllZiBUaGUga2luZCBvZiBsZXhlciB3ZSdyZSBjdXJyZW50bHkgd29ya2luZyB3aXRoLgogICBlbnVtIEN1ckxleGVyS2luZCB7CkBAIC0yNzYsMjYgKzI5MCw0OCBAQAogICAgIENMS19MZXhBZnRlck1vZHVsZUltcG9ydAogICB9IEN1ckxleGVyS2luZDsKIAotICAvLy8gSW5jbHVkZU1hY3JvU3RhY2sgLSBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBzdGFjayBvZiBmaWxlcyBjdXJyZW50bHkKKyAgLy8vIFxicmllZiBJZiB0aGUgY3VycmVudCBsZXhlciBpcyBmb3IgYSBzdWJtb2R1bGUgdGhhdCBpcyBiZWluZyBidWlsdCwgdGhpcworICAvLy8gaXMgdGhhdCBzdWJtb2R1bGUuCisgIE1vZHVsZSAqQ3VyU3VibW9kdWxlOworCisgIC8vLyBcYnJpZWYgS2VlcHMgdHJhY2sgb2YgdGhlIHN0YWNrIG9mIGZpbGVzIGN1cnJlbnRseQogICAvLy8gXCNpbmNsdWRlZCwgYW5kIG1hY3JvcyBjdXJyZW50bHkgYmVpbmcgZXhwYW5kZWQgZnJvbSwgbm90IGNvdW50aW5nCiAgIC8vLyBDdXJMZXhlci9DdXJUb2tlbkxleGVyLgogICBzdHJ1Y3QgSW5jbHVkZVN0YWNrSW5mbyB7Ci0gICAgZW51bSBDdXJMZXhlcktpbmQgICAgIEN1ckxleGVyS2luZDsKLSAgICBMZXhlciAgICAgICAgICAgICAgICAgKlRoZUxleGVyOwotICAgIFBUSExleGVyICAgICAgICAgICAgICAqVGhlUFRITGV4ZXI7Ci0gICAgUHJlcHJvY2Vzc29yTGV4ZXIgICAgICpUaGVQUExleGVyOwotICAgIFRva2VuTGV4ZXIgICAgICAgICAgICAqVGhlVG9rZW5MZXhlcjsKLSAgICBjb25zdCBEaXJlY3RvcnlMb29rdXAgKlRoZURpckxvb2t1cDsKKyAgICBlbnVtIEN1ckxleGVyS2luZCAgICAgICAgICAgQ3VyTGV4ZXJLaW5kOworICAgIE1vZHVsZSAgICAgICAgICAgICAgICAgICAgICpUaGVTdWJtb2R1bGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPExleGVyPiAgICAgIFRoZUxleGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxQVEhMZXhlcj4gICBUaGVQVEhMZXhlcjsKKyAgICBQcmVwcm9jZXNzb3JMZXhlciAgICAgICAgICAqVGhlUFBMZXhlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VG9rZW5MZXhlcj4gVGhlVG9rZW5MZXhlcjsKKyAgICBjb25zdCBEaXJlY3RvcnlMb29rdXAgICAgICAqVGhlRGlyTG9va3VwOwogCi0gICAgSW5jbHVkZVN0YWNrSW5mbyhlbnVtIEN1ckxleGVyS2luZCBLLCBMZXhlciAqTCwgUFRITGV4ZXIqIFAsCi0gICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3JMZXhlciogUFBMLAotICAgICAgICAgICAgICAgICAgICAgVG9rZW5MZXhlciogVEwsIGNvbnN0IERpcmVjdG9yeUxvb2t1cCAqRCkKLSAgICAgIDogQ3VyTGV4ZXJLaW5kKEspLCBUaGVMZXhlcihMKSwgVGhlUFRITGV4ZXIoUCksIFRoZVBQTGV4ZXIoUFBMKSwKLSAgICAgICAgVGhlVG9rZW5MZXhlcihUTCksIFRoZURpckxvb2t1cChEKSB7fQorICAgIC8vIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBjb21wbGV0ZWx5IHVzZWxlc3MgY29waWVzIG9mIHRoZSBkZWZhdWx0CisgICAgLy8gdmVyc2lvbnMsIG9ubHkgbmVlZGVkIHRvIHBhY2lmeSBNU1ZDLgorICAgIEluY2x1ZGVTdGFja0luZm8oZW51bSBDdXJMZXhlcktpbmQgQ3VyTGV4ZXJLaW5kLCBNb2R1bGUgKlRoZVN1Ym1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxMZXhlcj4gJiZUaGVMZXhlciwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQVEhMZXhlcj4gJiZUaGVQVEhMZXhlciwKKyAgICAgICAgICAgICAgICAgICAgIFByZXByb2Nlc3NvckxleGVyICpUaGVQUExleGVyLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRva2VuTGV4ZXI+ICYmVGhlVG9rZW5MZXhlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUxvb2t1cCAqVGhlRGlyTG9va3VwKQorICAgICAgICA6IEN1ckxleGVyS2luZChzdGQ6Om1vdmUoQ3VyTGV4ZXJLaW5kKSksCisgICAgICAgICAgVGhlU3VibW9kdWxlKHN0ZDo6bW92ZShUaGVTdWJtb2R1bGUpKSwgVGhlTGV4ZXIoc3RkOjptb3ZlKFRoZUxleGVyKSksCisgICAgICAgICAgVGhlUFRITGV4ZXIoc3RkOjptb3ZlKFRoZVBUSExleGVyKSksCisgICAgICAgICAgVGhlUFBMZXhlcihzdGQ6Om1vdmUoVGhlUFBMZXhlcikpLAorICAgICAgICAgIFRoZVRva2VuTGV4ZXIoc3RkOjptb3ZlKFRoZVRva2VuTGV4ZXIpKSwKKyAgICAgICAgICBUaGVEaXJMb29rdXAoc3RkOjptb3ZlKFRoZURpckxvb2t1cCkpIHt9CisgICAgSW5jbHVkZVN0YWNrSW5mbyhJbmNsdWRlU3RhY2tJbmZvICYmUkhTKQorICAgICAgICA6IEN1ckxleGVyS2luZChzdGQ6Om1vdmUoUkhTLkN1ckxleGVyS2luZCkpLAorICAgICAgICAgIFRoZVN1Ym1vZHVsZShzdGQ6Om1vdmUoUkhTLlRoZVN1Ym1vZHVsZSkpLAorICAgICAgICAgIFRoZUxleGVyKHN0ZDo6bW92ZShSSFMuVGhlTGV4ZXIpKSwKKyAgICAgICAgICBUaGVQVEhMZXhlcihzdGQ6Om1vdmUoUkhTLlRoZVBUSExleGVyKSksCisgICAgICAgICAgVGhlUFBMZXhlcihzdGQ6Om1vdmUoUkhTLlRoZVBQTGV4ZXIpKSwKKyAgICAgICAgICBUaGVUb2tlbkxleGVyKHN0ZDo6bW92ZShSSFMuVGhlVG9rZW5MZXhlcikpLAorICAgICAgICAgIFRoZURpckxvb2t1cChzdGQ6Om1vdmUoUkhTLlRoZURpckxvb2t1cCkpIHt9CiAgIH07CiAgIHN0ZDo6dmVjdG9yPEluY2x1ZGVTdGFja0luZm8+IEluY2x1ZGVNYWNyb1N0YWNrOwogCi0gIC8vLyBDYWxsYmFja3MgLSBUaGVzZSBhcmUgYWN0aW9ucyBpbnZva2VkIHdoZW4gc29tZSBwcmVwcm9jZXNzb3IgYWN0aXZpdHkgaXMKKyAgLy8vIFxicmllZiBBY3Rpb25zIGludm9rZWQgd2hlbiBzb21lIHByZXByb2Nlc3NvciBhY3Rpdml0eSBpcwogICAvLy8gZW5jb3VudGVyZWQgKGUuZy4gYSBmaWxlIGlzIFwjaW5jbHVkZWQsIGV0YykuCiAgIFBQQ2FsbGJhY2tzICpDYWxsYmFja3M7CiAKQEAgLTMwOCwxNCArMzQ0LDE2IEBACiAgIH07CiAgIFNtYWxsVmVjdG9yPE1hY3JvRXhwYW5kc0luZm8sIDI+IERlbGF5ZWRNYWNyb0V4cGFuZHNDYWxsYmFja3M7CiAKLSAgLy8vIE1hY3JvcyAtIEZvciBlYWNoIElkZW50aWZpZXJJbmZvIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCBhIG1hY3JvLCB3ZQorICAvLy8gRm9yIGVhY2ggSWRlbnRpZmllckluZm8gdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIGEgbWFjcm8sIHdlCiAgIC8vLyBrZWVwIGEgbWFwcGluZyB0byB0aGUgaGlzdG9yeSBvZiBhbGwgbWFjcm8gZGVmaW5pdGlvbnMgYW5kICN1bmRlZnMgaW4KICAgLy8vIHRoZSByZXZlcnNlIG9yZGVyICh0aGUgbGF0ZXN0IG9uZSBpcyBpbiB0aGUgaGVhZCBvZiB0aGUgbGlzdCkuCiAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IElkZW50aWZpZXJJbmZvKiwgTWFjcm9EaXJlY3RpdmUqPiBNYWNyb3M7CiAgIGZyaWVuZCBjbGFzcyBBU1RSZWFkZXI7CiAgIAogICAvLy8gXGJyaWVmIE1hY3JvcyB0aGF0IHdlIHdhbnQgdG8gd2FybiBiZWNhdXNlIHRoZXkgYXJlIG5vdCB1c2VkIGF0IHRoZSBlbmQKLSAgLy8vIG9mIHRoZSB0cmFuc2xhdGlvbiB1bml0OyB3ZSBzdG9yZSBqdXN0IHRoZWlyIFNvdXJjZUxvY2F0aW9ucyBpbnN0ZWFkCisgIC8vLyBvZiB0aGUgdHJhbnNsYXRpb24gdW5pdC4KKyAgLy8vCisgIC8vLyBXZSBzdG9yZSBqdXN0IHRoZWlyIFNvdXJjZUxvY2F0aW9ucyBpbnN0ZWFkIG9mCiAgIC8vLyBzb21ldGhpbmcgbGlrZSBNYWNyb0luZm8qLiBUaGUgYmVuZWZpdCBvZiB0aGlzIGlzIHRoYXQgd2hlbiB3ZSBhcmUKICAgLy8vIGRlc2VyaWFsaXppbmcgZnJvbSBQQ0gsIHdlIGRvbid0IG5lZWQgdG8gZGVzZXJpYWxpemUgaWRlbnRpZmllciAmIG1hY3JvcwogICAvLy8ganVzdCBzbyB0aGF0IHdlIGNhbiByZXBvcnQgdGhhdCB0aGV5IGFyZSB1bnVzZWQsIHdlIGp1c3Qgd2FybiB1c2luZwpAQCAtMzI0LDE0ICszNjIsMTMgQEAKICAgdHlwZWRlZiBsbHZtOjpTbWFsbFB0clNldDxTb3VyY2VMb2NhdGlvbiwgMzI+IFdhcm5VbnVzZWRNYWNyb0xvY3NUeTsKICAgV2FyblVudXNlZE1hY3JvTG9jc1R5IFdhcm5VbnVzZWRNYWNyb0xvY3M7CiAKLSAgLy8vIE1hY3JvQXJnQ2FjaGUgLSBUaGlzIGlzIGEgImZyZWVsaXN0IiBvZiBNYWNyb0FyZyBvYmplY3RzIHRoYXQgY2FuIGJlCisgIC8vLyBcYnJpZWYgQSAiZnJlZWxpc3QiIG9mIE1hY3JvQXJnIG9iamVjdHMgdGhhdCBjYW4gYmUKICAgLy8vIHJldXNlZCBmb3IgcXVpY2sgYWxsb2NhdGlvbi4KICAgTWFjcm9BcmdzICpNYWNyb0FyZ0NhY2hlOwogICBmcmllbmQgY2xhc3MgTWFjcm9BcmdzOwogCi0gIC8vLyBQcmFnbWFQdXNoTWFjcm9JbmZvIC0gRm9yIGVhY2ggSWRlbnRpZmllckluZm8gdXNlZCBpbiBhICNwcmFnbWEKLSAgLy8vIHB1c2hfbWFjcm8gZGlyZWN0aXZlLCB3ZSBrZWVwIGEgTWFjcm9JbmZvIHN0YWNrIHVzZWQgdG8gcmVzdG9yZQotICAvLy8gcHJldmlvdXMgbWFjcm8gdmFsdWUuCisgIC8vLyBGb3IgZWFjaCBJZGVudGlmaWVySW5mbyB1c2VkIGluIGEgXCNwcmFnbWEgcHVzaF9tYWNybyBkaXJlY3RpdmUsCisgIC8vLyB3ZSBrZWVwIGEgTWFjcm9JbmZvIHN0YWNrIHVzZWQgdG8gcmVzdG9yZSB0aGUgcHJldmlvdXMgbWFjcm8gdmFsdWUuCiAgIGxsdm06OkRlbnNlTWFwPElkZW50aWZpZXJJbmZvKiwgc3RkOjp2ZWN0b3I8TWFjcm9JbmZvKj4gPiBQcmFnbWFQdXNoTWFjcm9JbmZvOwogCiAgIC8vIFZhcmlvdXMgc3RhdGlzdGljcyB3ZSB0cmFjayBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMuCkBAIC0zNDIsMTcgKzM3OSwxOSBAQAogICB1bnNpZ25lZCBOdW1GYXN0TWFjcm9FeHBhbmRlZCwgTnVtVG9rZW5QYXN0ZSwgTnVtRmFzdFRva2VuUGFzdGU7CiAgIHVuc2lnbmVkIE51bVNraXBwZWQ7CiAKLSAgLy8vIFByZWRlZmluZXMgLSBUaGlzIHN0cmluZyBpcyB0aGUgcHJlZGVmaW5lZCBtYWNyb3MgdGhhdCBwcmVwcm9jZXNzb3IKLSAgLy8vIHNob3VsZCB1c2UgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGV0Yy4KKyAgLy8vIFxicmllZiBUaGUgcHJlZGVmaW5lZCBtYWNyb3MgdGhhdCBwcmVwcm9jZXNzb3Igc2hvdWxkIHVzZSBmcm9tIHRoZQorICAvLy8gY29tbWFuZCBsaW5lIGV0Yy4KICAgc3RkOjpzdHJpbmcgUHJlZGVmaW5lczsKIAogICAvLy8gXGJyaWVmIFRoZSBmaWxlIElEIGZvciB0aGUgcHJlcHJvY2Vzc29yIHByZWRlZmluZXMuCiAgIEZpbGVJRCBQcmVkZWZpbmVzRmlsZUlEOwogCi0gIC8vLyBUb2tlbkxleGVyQ2FjaGUgLSBDYWNoZSBtYWNybyBleHBhbmRlcnMgdG8gcmVkdWNlIG1hbGxvYyB0cmFmZmljLgorICAvLy8gXHsKKyAgLy8vIFxicmllZiBDYWNoZSBvZiBtYWNybyBleHBhbmRlcnMgdG8gcmVkdWNlIG1hbGxvYyB0cmFmZmljLgogICBlbnVtIHsgVG9rZW5MZXhlckNhY2hlU2l6ZSA9IDggfTsKICAgdW5zaWduZWQgTnVtQ2FjaGVkVG9rZW5MZXhlcnM7CiAgIFRva2VuTGV4ZXIgKlRva2VuTGV4ZXJDYWNoZVtUb2tlbkxleGVyQ2FjaGVTaXplXTsKKyAgLy8vIFx9CiAKICAgLy8vIFxicmllZiBLZWVwcyBtYWNybyBleHBhbmRlZCB0b2tlbnMgZm9yIFRva2VuTGV4ZXJzLgogICAvLwpAQCAtMzcyLDE3ICs0MTEsMjAgQEAKIHByaXZhdGU6ICAvLyBDYWNoZWQgdG9rZW5zIHN0YXRlLgogICB0eXBlZGVmIFNtYWxsVmVjdG9yPFRva2VuLCAxPiBDYWNoZWRUb2tlbnNUeTsKIAotICAvLy8gQ2FjaGVkVG9rZW5zIC0gQ2FjaGVkIHRva2VucyBhcmUgc3RvcmVkIGhlcmUgd2hlbiB3ZSBkbyBiYWNrdHJhY2tpbmcgb3IKKyAgLy8vIFxicmllZiBDYWNoZWQgdG9rZW5zIGFyZSBzdG9yZWQgaGVyZSB3aGVuIHdlIGRvIGJhY2t0cmFja2luZyBvcgogICAvLy8gbG9va2FoZWFkLiBUaGV5IGFyZSAibGV4ZWQiIGJ5IHRoZSBDYWNoaW5nTGV4KCkgbWV0aG9kLgogICBDYWNoZWRUb2tlbnNUeSBDYWNoZWRUb2tlbnM7CiAKLSAgLy8vIENhY2hlZExleFBvcyAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgY2FjaGVkIHRva2VuIHRoYXQgQ2FjaGluZ0xleCgpIHNob3VsZAotICAvLy8gImxleCIgbmV4dC4gSWYgaXQgcG9pbnRzIGJleW9uZCB0aGUgQ2FjaGVkVG9rZW5zIHZlY3RvciwgaXQgbWVhbnMgdGhhdAotICAvLy8gYSBub3JtYWwgTGV4KCkgc2hvdWxkIGJlIGludm9rZWQuCisgIC8vLyBcYnJpZWYgVGhlIHBvc2l0aW9uIG9mIHRoZSBjYWNoZWQgdG9rZW4gdGhhdCBDYWNoaW5nTGV4KCkgc2hvdWxkCisgIC8vLyAibGV4IiBuZXh0LgorICAvLy8KKyAgLy8vIElmIGl0IHBvaW50cyBiZXlvbmQgdGhlIENhY2hlZFRva2VucyB2ZWN0b3IsIGl0IG1lYW5zIHRoYXQgYSBub3JtYWwKKyAgLy8vIExleCgpIHNob3VsZCBiZSBpbnZva2VkLgogICBDYWNoZWRUb2tlbnNUeTo6c2l6ZV90eXBlIENhY2hlZExleFBvczsKIAotICAvLy8gQmFja3RyYWNrUG9zaXRpb25zIC0gU3RhY2sgb2YgYmFja3RyYWNrIHBvc2l0aW9ucywgYWxsb3dpbmcgbmVzdGVkCi0gIC8vLyBiYWNrdHJhY2tzLiBUaGUgRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zKCkgbWV0aG9kIHB1c2hlcyBhIHBvc2l0aW9uIHRvCisgIC8vLyBcYnJpZWYgU3RhY2sgb2YgYmFja3RyYWNrIHBvc2l0aW9ucywgYWxsb3dpbmcgbmVzdGVkIGJhY2t0cmFja3MuCisgIC8vLworICAvLy8gVGhlIEVuYWJsZUJhY2t0cmFja0F0VGhpc1BvcygpIG1ldGhvZCBwdXNoZXMgYSBwb3NpdGlvbiB0bwogICAvLy8gaW5kaWNhdGUgd2hlcmUgQ2FjaGVkTGV4UG9zIHNob3VsZCBiZSBzZXQgd2hlbiB0aGUgQmFja1RyYWNrKCkgbWV0aG9kIGlzCiAgIC8vLyBpbnZva2VkIChhdCB3aGljaCBwb2ludCB0aGUgbGFzdCBwb3NpdGlvbiBpcyBwb3BwZWQpLgogICBzdGQ6OnZlY3RvcjxDYWNoZWRUb2tlbnNUeTo6c2l6ZV90eXBlPiBCYWNrdHJhY2tQb3NpdGlvbnM7CkBAIC0zOTcsNyArNDM5LDcgQEAKICAgLy8vIG9mIHRoYXQgbGlzdC4KICAgTWFjcm9JbmZvQ2hhaW4gKk1JQ2hhaW5IZWFkOwogCi0gIC8vLyBNSUNhY2hlIC0gQSAiZnJlZWxpc3QiIG9mIE1hY3JvSW5mbyBvYmplY3RzIHRoYXQgY2FuIGJlIHJldXNlZCBmb3IgcXVpY2sKKyAgLy8vIEEgImZyZWVsaXN0IiBvZiBNYWNyb0luZm8gb2JqZWN0cyB0aGF0IGNhbiBiZSByZXVzZWQgZm9yIHF1aWNrCiAgIC8vLyBhbGxvY2F0aW9uLgogICBNYWNyb0luZm9DaGFpbiAqTUlDYWNoZTsKIApAQCAtNDE4LDcgKzQ2MCw4IEBACiAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mb0xvb2t1cCAqSUlMb29rdXAgPSAwLAogICAgICAgICAgICAgICAgYm9vbCBPd25zSGVhZGVyU2VhcmNoID0gZmFsc2UsCiAgICAgICAgICAgICAgICBib29sIERlbGF5SW5pdGlhbGl6YXRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgIGJvb2wgSW5jclByb2Nlc3NpbmcgPSBmYWxzZSk7CisgICAgICAgICAgICAgICBib29sIEluY3JQcm9jZXNzaW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICBUcmFuc2xhdGlvblVuaXRLaW5kIFRVS2luZCA9IFRVX0NvbXBsZXRlKTsKIAogICB+UHJlcHJvY2Vzc29yKCk7CiAKQEAgLTQ3MCw4ICs1MTMsNyBAQAogICAgIHJldHVybiBQYXJzaW5nSWZPckVsaWZEaXJlY3RpdmU7CiAgIH0KIAotICAvLy8gU2V0Q29tbWVudFJldGVudGlvblN0YXRlIC0gQ29udHJvbCB3aGV0aGVyIG9yIG5vdCB0aGUgcHJlcHJvY2Vzc29yIHJldGFpbnMKLSAgLy8vIGNvbW1lbnRzIGluIG91dHB1dC4KKyAgLy8vIFxicmllZiBDb250cm9sIHdoZXRoZXIgdGhlIHByZXByb2Nlc3NvciByZXRhaW5zIGNvbW1lbnRzIGluIG91dHB1dC4KICAgdm9pZCBTZXRDb21tZW50UmV0ZW50aW9uU3RhdGUoYm9vbCBLZWVwQ29tbWVudHMsIGJvb2wgS2VlcE1hY3JvQ29tbWVudHMpIHsKICAgICB0aGlzLT5LZWVwQ29tbWVudHMgPSBLZWVwQ29tbWVudHMgfCBLZWVwTWFjcm9Db21tZW50czsKICAgICB0aGlzLT5LZWVwTWFjcm9Db21tZW50cyA9IEtlZXBNYWNyb0NvbW1lbnRzOwpAQCAtNTAwLDI2ICs1NDIsMjkgQEAKICAgLy8vIGZhbHNlIGlmIGl0IGlzIHByb2R1Y2luZyB0b2tlbnMgdG8gYmUgY29uc3VtZWQgYnkgUGFyc2UgYW5kIFNlbWEuCiAgIGJvb2wgaXNQcmVwcm9jZXNzZWRPdXRwdXQoKSBjb25zdCB7IHJldHVybiBQcmVwcm9jZXNzZWRPdXRwdXQ7IH0KIAotICAvLy8gaXNDdXJyZW50TGV4ZXIgLSBSZXR1cm4gdHJ1ZSBpZiB3ZSBhcmUgbGV4aW5nIGRpcmVjdGx5IGZyb20gdGhlIHNwZWNpZmllZAotICAvLy8gbGV4ZXIuCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgd2UgYXJlIGxleGluZyBkaXJlY3RseSBmcm9tIHRoZSBzcGVjaWZpZWQgbGV4ZXIuCiAgIGJvb2wgaXNDdXJyZW50TGV4ZXIoY29uc3QgUHJlcHJvY2Vzc29yTGV4ZXIgKkwpIGNvbnN0IHsKICAgICByZXR1cm4gQ3VyUFBMZXhlciA9PSBMOwogICB9CiAKLSAgLy8vIGdldEN1cnJlbnRMZXhlciAtIFJldHVybiB0aGUgY3VycmVudCBsZXhlciBiZWluZyBsZXhlZCBmcm9tLiAgTm90ZQotICAvLy8gdGhhdCB0aGlzIGlnbm9yZXMgYW55IHBvdGVudGlhbGx5IGFjdGl2ZSBtYWNybyBleHBhbnNpb25zIGFuZCBfUHJhZ21hCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBjdXJyZW50IGxleGVyIGJlaW5nIGxleGVkIGZyb20uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaWdub3JlcyBhbnkgcG90ZW50aWFsbHkgYWN0aXZlIG1hY3JvIGV4cGFuc2lvbnMgYW5kIF9QcmFnbWEKICAgLy8vIGV4cGFuc2lvbnMgZ29pbmcgb24gYXQgdGhlIHRpbWUuCiAgIFByZXByb2Nlc3NvckxleGVyICpnZXRDdXJyZW50TGV4ZXIoKSBjb25zdCB7IHJldHVybiBDdXJQUExleGVyOyB9CiAKLSAgLy8vIGdldEN1cnJlbnRGaWxlTGV4ZXIgLSBSZXR1cm4gdGhlIGN1cnJlbnQgZmlsZSBsZXhlciBiZWluZyBsZXhlZCBmcm9tLgorICAvLy8gXGJyaWVmIFJldHVybiB0aGUgY3VycmVudCBmaWxlIGxleGVyIGJlaW5nIGxleGVkIGZyb20uCisgIC8vLwogICAvLy8gTm90ZSB0aGF0IHRoaXMgaWdub3JlcyBhbnkgcG90ZW50aWFsbHkgYWN0aXZlIG1hY3JvIGV4cGFuc2lvbnMgYW5kIF9QcmFnbWEKICAgLy8vIGV4cGFuc2lvbnMgZ29pbmcgb24gYXQgdGhlIHRpbWUuCiAgIFByZXByb2Nlc3NvckxleGVyICpnZXRDdXJyZW50RmlsZUxleGVyKCkgY29uc3Q7CiAKLSAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBmaWxlIElEIGZvciB0aGUgcHJlcHJvY2Vzc29yIHByZWRlZmluZXMuCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgRmlsZUlEIGZvciB0aGUgcHJlcHJvY2Vzc29yIHByZWRlZmluZXMuCiAgIEZpbGVJRCBnZXRQcmVkZWZpbmVzRmlsZUlEKCkgY29uc3QgeyByZXR1cm4gUHJlZGVmaW5lc0ZpbGVJRDsgfQogCi0gIC8vLyBnZXRQUENhbGxiYWNrcy9hZGRQUENhbGxiYWNrcyAtIEFjY2Vzc29ycyBmb3IgcHJlcHJvY2Vzc29yIGNhbGxiYWNrcy4KKyAgLy8vIFx7CisgIC8vLyBcYnJpZWYgQWNjZXNzb3JzIGZvciBwcmVwcm9jZXNzb3IgY2FsbGJhY2tzLgorICAvLy8KICAgLy8vIE5vdGUgdGhhdCB0aGlzIGNsYXNzIHRha2VzIG93bmVyc2hpcCBvZiBhbnkgUFBDYWxsYmFja3Mgb2JqZWN0IGdpdmVuIHRvCiAgIC8vLyBpdC4KICAgUFBDYWxsYmFja3MgKmdldFBQQ2FsbGJhY2tzKCkgY29uc3QgeyByZXR1cm4gQ2FsbGJhY2tzOyB9CkBAIC01MjgsOSArNTczLDEwIEBACiAgICAgICBDID0gbmV3IFBQQ2hhaW5lZENhbGxiYWNrcyhDLCBDYWxsYmFja3MpOwogICAgIENhbGxiYWNrcyA9IEM7CiAgIH0KKyAgLy8vIFx9CiAKICAgLy8vIFxicmllZiBHaXZlbiBhbiBpZGVudGlmaWVyLCByZXR1cm4gaXRzIGxhdGVzdCBNYWNyb0RpcmVjdGl2ZSBpZiBpdCBpcwotICAvLyBcI2RlZmluZWQgb3IgbnVsbCBpZiBpdCBpc24ndCBcI2RlZmluZSdkLgorICAvLy8gXCNkZWZpbmVkIG9yIG51bGwgaWYgaXQgaXNuJ3QgXCNkZWZpbmUnZC4KICAgTWFjcm9EaXJlY3RpdmUgKmdldE1hY3JvRGlyZWN0aXZlKElkZW50aWZpZXJJbmZvICpJSSkgY29uc3QgewogICAgIGlmICghSUktPmhhc01hY3JvRGVmaW5pdGlvbigpKQogICAgICAgcmV0dXJuIDA7CkBAIC01NTEsOSArNTk3LDEwIEBACiAgIH0KIAogICAvLy8gXGJyaWVmIEdpdmVuIGFuIGlkZW50aWZpZXIsIHJldHVybiB0aGUgKHByb2JhYmx5ICN1bmRlZidkKSBNYWNyb0luZm8KLSAgLy8vIHJlcHJlc2VudGluZyB0aGUgbW9zdCByZWNlbnQgbWFjcm8gZGVmaW5pdGlvbi4gT25lIGNhbiBpdGVyYXRlIG92ZXIgYWxsCi0gIC8vLyBwcmV2aW91cyBtYWNybyBkZWZpbml0aW9ucyBmcm9tIGl0LiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yCi0gIC8vLyBpZGVudGlmaWVycyB0aGF0IGhhZE1hY3JvRGVmaW5pdGlvbigpLgorICAvLy8gcmVwcmVzZW50aW5nIHRoZSBtb3N0IHJlY2VudCBtYWNybyBkZWZpbml0aW9uLgorICAvLy8KKyAgLy8vIE9uZSBjYW4gaXRlcmF0ZSBvdmVyIGFsbCBwcmV2aW91cyBtYWNybyBkZWZpbml0aW9ucyBmcm9tIHRoZSBtb3N0IHJlY2VudAorICAvLy8gb25lLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3IgaWRlbnRpZmllcnMgdGhhdCBoYWRNYWNyb0RlZmluaXRpb24oKS4KICAgTWFjcm9EaXJlY3RpdmUgKmdldE1hY3JvRGlyZWN0aXZlSGlzdG9yeShjb25zdCBJZGVudGlmaWVySW5mbyAqSUkpIGNvbnN0OwogCiAgIC8vLyBcYnJpZWYgQWRkIGEgZGlyZWN0aXZlIHRvIHRoZSBtYWNybyBkaXJlY3RpdmUgaGlzdG9yeSBmb3IgdGhpcyBpZGVudGlmaWVyLgpAQCAtNTcxLDE0ICs2MTgsMTUgQEAKICAgLy8vIFxicmllZiBTZXQgYSBNYWNyb0RpcmVjdGl2ZSB0aGF0IHdhcyBsb2FkZWQgZnJvbSBhIFBDSCBmaWxlLgogICB2b2lkIHNldExvYWRlZE1hY3JvRGlyZWN0aXZlKElkZW50aWZpZXJJbmZvICpJSSwgTWFjcm9EaXJlY3RpdmUgKk1EKTsKIAotICAvLy8gbWFjcm9faXRlcmF0b3IvbWFjcm9fYmVnaW4vbWFjcm9fZW5kIC0gVGhpcyBhbGxvd3MgeW91IHRvIHdhbGsgdGhlIG1hY3JvCi0gIC8vLyBoaXN0b3J5IHRhYmxlLiBDdXJyZW50bHkgZGVmaW5lZCBtYWNyb3MgaGF2ZQorICAvLy8gXHsKKyAgLy8vIEl0ZXJhdG9ycyBmb3IgdGhlIG1hY3JvIGhpc3RvcnkgdGFibGUuIEN1cnJlbnRseSBkZWZpbmVkIG1hY3JvcyBoYXZlCiAgIC8vLyBJZGVudGlmaWVySW5mbzo6aGFzTWFjcm9EZWZpbml0aW9uKCkgc2V0IGFuZCBhbiBlbXB0eQogICAvLy8gTWFjcm9JbmZvOjpnZXRVbmRlZkxvYygpIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LgogICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPGNvbnN0IElkZW50aWZpZXJJbmZvICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9EaXJlY3RpdmUqPjo6Y29uc3RfaXRlcmF0b3IgbWFjcm9faXRlcmF0b3I7CiAgIG1hY3JvX2l0ZXJhdG9yIG1hY3JvX2JlZ2luKGJvb2wgSW5jbHVkZUV4dGVybmFsTWFjcm9zID0gdHJ1ZSkgY29uc3Q7CiAgIG1hY3JvX2l0ZXJhdG9yIG1hY3JvX2VuZChib29sIEluY2x1ZGVFeHRlcm5hbE1hY3JvcyA9IHRydWUpIGNvbnN0OworICAvLy8gXH0KIAogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWFjcm8gZGVmaW5lZCBiZWZvcmUgXHAgTG9jIHRoYXQgaGFzCiAgIC8vLyBzcGVsbGluZyBccCBUb2tlbnMuICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWFjcm9zIHdpdGggc2FtZSBzcGVsbGluZywKQEAgLTU4Nyw4ICs2MzUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRva2VuVmFsdWU+IFRva2VucykgY29uc3Q7CiAKICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFByZWRlZmluZXMoKSBjb25zdCB7IHJldHVybiBQcmVkZWZpbmVzOyB9Ci0gIC8vLyBzZXRQcmVkZWZpbmVzIC0gU2V0IHRoZSBwcmVkZWZpbmVzIGZvciB0aGlzIFByZXByb2Nlc3Nvci4gIFRoZXNlCi0gIC8vLyBwcmVkZWZpbmVzIGFyZSBhdXRvbWF0aWNhbGx5IGluamVjdGVkIHdoZW4gcGFyc2luZyB0aGUgbWFpbiBmaWxlLgorICAvLy8gXGJyaWVmIFNldCB0aGUgcHJlZGVmaW5lcyBmb3IgdGhpcyBQcmVwcm9jZXNzb3IuCisgIC8vLworICAvLy8gVGhlc2UgcHJlZGVmaW5lcyBhcmUgYXV0b21hdGljYWxseSBpbmplY3RlZCB3aGVuIHBhcnNpbmcgdGhlIG1haW4gZmlsZS4KICAgdm9pZCBzZXRQcmVkZWZpbmVzKGNvbnN0IGNoYXIgKlApIHsgUHJlZGVmaW5lcyA9IFA7IH0KICAgdm9pZCBzZXRQcmVkZWZpbmVzKGNvbnN0IHN0ZDo6c3RyaW5nICZQKSB7IFByZWRlZmluZXMgPSBQOyB9CiAKQEAgLTU5OCwxOCArNjQ3LDIwIEBACiAgICAgcmV0dXJuICZJZGVudGlmaWVycy5nZXQoTmFtZSk7CiAgIH0KIAotICAvLy8gQWRkUHJhZ21hSGFuZGxlciAtIEFkZCB0aGUgc3BlY2lmaWVkIHByYWdtYSBoYW5kbGVyIHRvIHRoZSBwcmVwcm9jZXNzb3IuCi0gIC8vLyBJZiAnTmFtZXNwYWNlJyBpcyBub24tbnVsbCwgdGhlbiBpdCBpcyBhIHRva2VuIHJlcXVpcmVkIHRvIGV4aXN0IG9uIHRoZQorICAvLy8gXGJyaWVmIEFkZCB0aGUgc3BlY2lmaWVkIHByYWdtYSBoYW5kbGVyIHRvIHRoaXMgcHJlcHJvY2Vzc29yLgorICAvLy8KKyAgLy8vIElmIFxwIE5hbWVzcGFjZSBpcyBub24tbnVsbCwgdGhlbiBpdCBpcyBhIHRva2VuIHJlcXVpcmVkIHRvIGV4aXN0IG9uIHRoZQogICAvLy8gcHJhZ21hIGxpbmUgYmVmb3JlIHRoZSBwcmFnbWEgc3RyaW5nIHN0YXJ0cywgZS5nLiAiU1REQyIgb3IgIkdDQyIuCiAgIHZvaWQgQWRkUHJhZ21hSGFuZGxlcihTdHJpbmdSZWYgTmFtZXNwYWNlLCBQcmFnbWFIYW5kbGVyICpIYW5kbGVyKTsKICAgdm9pZCBBZGRQcmFnbWFIYW5kbGVyKFByYWdtYUhhbmRsZXIgKkhhbmRsZXIpIHsKICAgICBBZGRQcmFnbWFIYW5kbGVyKFN0cmluZ1JlZigpLCBIYW5kbGVyKTsKICAgfQogCi0gIC8vLyBSZW1vdmVQcmFnbWFIYW5kbGVyIC0gUmVtb3ZlIHRoZSBzcGVjaWZpYyBwcmFnbWEgaGFuZGxlciBmcm9tCi0gIC8vLyB0aGUgcHJlcHJvY2Vzc29yLiBJZiBccCBOYW1lc3BhY2UgaXMgbm9uLW51bGwsIHRoZW4gaXQgc2hvdWxkCi0gIC8vLyBiZSB0aGUgbmFtZXNwYWNlIHRoYXQgXHAgSGFuZGxlciB3YXMgYWRkZWQgdG8uIEl0IGlzIGFuIGVycm9yCi0gIC8vLyB0byByZW1vdmUgYSBoYW5kbGVyIHRoYXQgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQuCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBzcGVjaWZpYyBwcmFnbWEgaGFuZGxlciBmcm9tIHRoaXMgcHJlcHJvY2Vzc29yLgorICAvLy8KKyAgLy8vIElmIFxwIE5hbWVzcGFjZSBpcyBub24tbnVsbCwgdGhlbiBpdCBzaG91bGQgYmUgdGhlIG5hbWVzcGFjZSB0aGF0CisgIC8vLyBccCBIYW5kbGVyIHdhcyBhZGRlZCB0by4gSXQgaXMgYW4gZXJyb3IgdG8gcmVtb3ZlIGEgaGFuZGxlciB0aGF0CisgIC8vLyBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KICAgdm9pZCBSZW1vdmVQcmFnbWFIYW5kbGVyKFN0cmluZ1JlZiBOYW1lc3BhY2UsIFByYWdtYUhhbmRsZXIgKkhhbmRsZXIpOwogICB2b2lkIFJlbW92ZVByYWdtYUhhbmRsZXIoUHJhZ21hSGFuZGxlciAqSGFuZGxlcikgewogICAgIFJlbW92ZVByYWdtYUhhbmRsZXIoU3RyaW5nUmVmKCksIEhhbmRsZXIpOwpAQCAtNjUwLDUxICs3MDEsNTEgQEAKICAgLy8vIGFsbCBtYWNybyBleHBhbnNpb25zLCBtYWNybyBkZWZpbml0aW9ucywgZXRjLgogICB2b2lkIGNyZWF0ZVByZXByb2Nlc3NpbmdSZWNvcmQoKTsKIAotICAvLy8gRW50ZXJNYWluU291cmNlRmlsZSAtIEVudGVyIHRoZSBzcGVjaWZpZWQgRmlsZUlEIGFzIHRoZSBtYWluIHNvdXJjZSBmaWxlLAorICAvLy8gXGJyaWVmIEVudGVyIHRoZSBzcGVjaWZpZWQgRmlsZUlEIGFzIHRoZSBtYWluIHNvdXJjZSBmaWxlLAogICAvLy8gd2hpY2ggaW1wbGljaXRseSBhZGRzIHRoZSBidWlsdGluIGRlZmluZXMgZXRjLgogICB2b2lkIEVudGVyTWFpblNvdXJjZUZpbGUoKTsKIAotICAvLy8gRW5kU291cmNlRmlsZSAtIEluZm9ybSB0aGUgcHJlcHJvY2Vzc29yIGNhbGxiYWNrcyB0aGF0IHByb2Nlc3NpbmcgaXMKLSAgLy8vIGNvbXBsZXRlLgorICAvLy8gXGJyaWVmIEluZm9ybSB0aGUgcHJlcHJvY2Vzc29yIGNhbGxiYWNrcyB0aGF0IHByb2Nlc3NpbmcgaXMgY29tcGxldGUuCiAgIHZvaWQgRW5kU291cmNlRmlsZSgpOwogCi0gIC8vLyBFbnRlclNvdXJjZUZpbGUgLSBBZGQgYSBzb3VyY2UgZmlsZSB0byB0aGUgdG9wIG9mIHRoZSBpbmNsdWRlIHN0YWNrIGFuZAotICAvLy8gc3RhcnQgbGV4aW5nIHRva2VucyBmcm9tIGl0IGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLiAgRW1pdCBhbiBlcnJvcgotICAvLy8gYW5kIGRvbid0IGVudGVyIHRoZSBmaWxlIG9uIGVycm9yLgotICB2b2lkIEVudGVyU291cmNlRmlsZShGaWxlSUQgQ3VyRmlsZUlELCBjb25zdCBEaXJlY3RvcnlMb29rdXAgKkRpciwKKyAgLy8vIFxicmllZiBBZGQgYSBzb3VyY2UgZmlsZSB0byB0aGUgdG9wIG9mIHRoZSBpbmNsdWRlIHN0YWNrIGFuZAorICAvLy8gc3RhcnQgbGV4aW5nIHRva2VucyBmcm9tIGl0IGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLgorICAvLy8KKyAgLy8vIEVtaXRzIGEgZGlhZ25vc3RpYywgZG9lc24ndCBlbnRlciB0aGUgZmlsZSwgYW5kIHJldHVybnMgdHJ1ZSBvbiBlcnJvci4KKyAgYm9vbCBFbnRlclNvdXJjZUZpbGUoRmlsZUlEIEN1ckZpbGVJRCwgY29uc3QgRGlyZWN0b3J5TG9va3VwICpEaXIsCiAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CiAKLSAgLy8vIEVudGVyTWFjcm8gLSBBZGQgYSBNYWNybyB0byB0aGUgdG9wIG9mIHRoZSBpbmNsdWRlIHN0YWNrIGFuZCBzdGFydCBsZXhpbmcKLSAgLy8vIHRva2VucyBmcm9tIGl0IGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLiAgQXJncyBzcGVjaWZpZXMgdGhlCi0gIC8vLyB0b2tlbnMgaW5wdXQgdG8gYSBmdW5jdGlvbi1saWtlIG1hY3JvLgorICAvLy8gXGJyaWVmIEFkZCBhIE1hY3JvIHRvIHRoZSB0b3Agb2YgdGhlIGluY2x1ZGUgc3RhY2sgYW5kIHN0YXJ0IGxleGluZworICAvLy8gdG9rZW5zIGZyb20gaXQgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBidWZmZXIuCiAgIC8vLwotICAvLy8gSUxFbmQgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgJyknIGZvciBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8gb3IgdGhlCi0gIC8vLyBpZGVudGlmaWVyIGZvciBhbiBvYmplY3QtbGlrZSBtYWNyby4KKyAgLy8vIFxwYXJhbSBBcmdzIHNwZWNpZmllcyB0aGUgdG9rZW5zIGlucHV0IHRvIGEgZnVuY3Rpb24tbGlrZSBtYWNyby4KKyAgLy8vIFxwYXJhbSBJTEVuZCBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSAnKScgZm9yIGEgZnVuY3Rpb24tbGlrZSBtYWNybworICAvLy8gb3IgdGhlIGlkZW50aWZpZXIgZm9yIGFuIG9iamVjdC1saWtlIG1hY3JvLgogICB2b2lkIEVudGVyTWFjcm8oVG9rZW4gJklkZW50aWZpZXIsIFNvdXJjZUxvY2F0aW9uIElMRW5kLCBNYWNyb0luZm8gKk1hY3JvLAogICAgICAgICAgICAgICAgICAgTWFjcm9BcmdzICpBcmdzKTsKIAotICAvLy8gRW50ZXJUb2tlblN0cmVhbSAtIEFkZCBhICJtYWNybyIgY29udGV4dCB0byB0aGUgdG9wIG9mIHRoZSBpbmNsdWRlIHN0YWNrLAorICAvLy8gXGJyaWVmIEFkZCBhICJtYWNybyIgY29udGV4dCB0byB0aGUgdG9wIG9mIHRoZSBpbmNsdWRlIHN0YWNrLAogICAvLy8gd2hpY2ggd2lsbCBjYXVzZSB0aGUgbGV4ZXIgdG8gc3RhcnQgcmV0dXJuaW5nIHRoZSBzcGVjaWZpZWQgdG9rZW5zLgogICAvLy8KLSAgLy8vIElmIERpc2FibGVNYWNyb0V4cGFuc2lvbiBpcyB0cnVlLCB0b2tlbnMgbGV4ZWQgZnJvbSB0aGUgdG9rZW4gc3RyZWFtIHdpbGwKLSAgLy8vIG5vdCBiZSBzdWJqZWN0IHRvIGZ1cnRoZXIgbWFjcm8gZXhwYW5zaW9uLiAgT3RoZXJ3aXNlLCB0aGVzZSB0b2tlbnMgd2lsbAotICAvLy8gYmUgcmUtbWFjcm8tZXhwYW5kZWQgd2hlbi9pZiBleHBhbnNpb24gaXMgZW5hYmxlZC4KKyAgLy8vIElmIFxwIERpc2FibGVNYWNyb0V4cGFuc2lvbiBpcyB0cnVlLCB0b2tlbnMgbGV4ZWQgZnJvbSB0aGUgdG9rZW4gc3RyZWFtCisgIC8vLyB3aWxsIG5vdCBiZSBzdWJqZWN0IHRvIGZ1cnRoZXIgbWFjcm8gZXhwYW5zaW9uLiBPdGhlcndpc2UsIHRoZXNlIHRva2VucworICAvLy8gd2lsbCBiZSByZS1tYWNyby1leHBhbmRlZCB3aGVuL2lmIGV4cGFuc2lvbiBpcyBlbmFibGVkLgogICAvLy8KLSAgLy8vIElmIE93bnNUb2tlbnMgaXMgZmFsc2UsIHRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHN0cmVhbSBvZgotICAvLy8gdG9rZW5zIGhhcyBhIHBlcm1hbmVudCBvd25lciBzb21ld2hlcmUsIHNvIHRoZXkgZG8gbm90IG5lZWQgdG8gYmUgY29waWVkLgotICAvLy8gSWYgaXQgaXMgdHJ1ZSwgaXQgYXNzdW1lcyB0aGUgYXJyYXkgb2YgdG9rZW5zIGlzIGFsbG9jYXRlZCB3aXRoIG5ld1tdIGFuZAotICAvLy8gbXVzdCBiZSBmcmVlZC4KLSAgLy8vCisgIC8vLyBJZiBccCBPd25zVG9rZW5zIGlzIGZhbHNlLCB0aGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIHNwZWNpZmllZCBzdHJlYW0KKyAgLy8vIG9mIHRva2VucyBoYXMgYSBwZXJtYW5lbnQgb3duZXIgc29tZXdoZXJlLCBzbyB0aGV5IGRvIG5vdCBuZWVkIHRvIGJlCisgIC8vLyBjb3BpZWQuIElmIGl0IGlzIHRydWUsIGl0IGFzc3VtZXMgdGhlIGFycmF5IG9mIHRva2VucyBpcyBhbGxvY2F0ZWQgd2l0aAorICAvLy8gXGMgbmV3W10gYW5kIG11c3QgYmUgZnJlZWQuCiAgIHZvaWQgRW50ZXJUb2tlblN0cmVhbShjb25zdCBUb2tlbiAqVG9rcywgdW5zaWduZWQgTnVtVG9rcywKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlzYWJsZU1hY3JvRXhwYW5zaW9uLCBib29sIE93bnNUb2tlbnMpOwogCi0gIC8vLyBSZW1vdmVUb3BPZkxleGVyU3RhY2sgLSBQb3AgdGhlIGN1cnJlbnQgbGV4ZXIvbWFjcm8gZXhwIG9mZiB0aGUgdG9wIG9mIHRoZQotICAvLy8gbGV4ZXIgc3RhY2suICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgY3VycmVudAotICAvLy8gc3RhdGUgb2YgdGhlIHRvcC1vZi1zdGFjayBsZXhlciBpcyBrbm93bi4KKyAgLy8vIFxicmllZiBQb3AgdGhlIGN1cnJlbnQgbGV4ZXIvbWFjcm8gZXhwIG9mZiB0aGUgdG9wIG9mIHRoZSBsZXhlciBzdGFjay4KKyAgLy8vCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKKyAgLy8vIHRvcC1vZi1zdGFjayBsZXhlciBpcyBrbm93bi4KICAgdm9pZCBSZW1vdmVUb3BPZkxleGVyU3RhY2soKTsKIAotICAvLy8gRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zIC0gRnJvbSB0aGUgcG9pbnQgdGhhdCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGFuZAotICAvLy8gdW50aWwgQ29tbWl0QmFja3RyYWNrZWRUb2tlbnMoKSBvciBCYWNrdHJhY2soKSBpcyBjYWxsZWQsIHRoZSBQcmVwcm9jZXNzb3IKKyAgLy8vIEZyb20gdGhlIHBvaW50IHRoYXQgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBhbmQgdW50aWwKKyAgLy8vIENvbW1pdEJhY2t0cmFja2VkVG9rZW5zKCkgb3IgQmFja3RyYWNrKCkgaXMgY2FsbGVkLCB0aGUgUHJlcHJvY2Vzc29yCiAgIC8vLyBrZWVwcyB0cmFjayBvZiB0aGUgbGV4ZWQgdG9rZW5zIHNvIHRoYXQgYSBzdWJzZXF1ZW50IEJhY2t0cmFjaygpIGNhbGwgd2lsbAogICAvLy8gbWFrZSB0aGUgUHJlcHJvY2Vzc29yIHJlLWxleCB0aGUgc2FtZSB0b2tlbnMuCiAgIC8vLwpAQCAtNzA4LDE4ICs3NTksMTggQEAKICAgLy8vCiAgIHZvaWQgRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zKCk7CiAKLSAgLy8vIENvbW1pdEJhY2t0cmFja2VkVG9rZW5zIC0gRGlzYWJsZSB0aGUgbGFzdCBFbmFibGVCYWNrdHJhY2tBdFRoaXNQb3MgY2FsbC4KKyAgLy8vIFxicmllZiBEaXNhYmxlIHRoZSBsYXN0IEVuYWJsZUJhY2t0cmFja0F0VGhpc1BvcyBjYWxsLgogICB2b2lkIENvbW1pdEJhY2t0cmFja2VkVG9rZW5zKCk7CiAKLSAgLy8vIEJhY2t0cmFjayAtIE1ha2UgUHJlcHJvY2Vzc29yIHJlLWxleCB0aGUgdG9rZW5zIHRoYXQgd2VyZSBsZXhlZCBzaW5jZQorICAvLy8gXGJyaWVmIE1ha2UgUHJlcHJvY2Vzc29yIHJlLWxleCB0aGUgdG9rZW5zIHRoYXQgd2VyZSBsZXhlZCBzaW5jZQogICAvLy8gRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zKCkgd2FzIHByZXZpb3VzbHkgY2FsbGVkLgogICB2b2lkIEJhY2t0cmFjaygpOwogCi0gIC8vLyBpc0JhY2t0cmFja0VuYWJsZWQgLSBUcnVlIGlmIEVuYWJsZUJhY2t0cmFja0F0VGhpc1BvcygpIHdhcyBjYWxsZWQgYW5kCisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiBFbmFibGVCYWNrdHJhY2tBdFRoaXNQb3MoKSB3YXMgY2FsbGVkIGFuZAogICAvLy8gY2FjaGluZyBvZiB0b2tlbnMgaXMgb24uCiAgIGJvb2wgaXNCYWNrdHJhY2tFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gIUJhY2t0cmFja1Bvc2l0aW9ucy5lbXB0eSgpOyB9CiAKLSAgLy8vIExleCAtIExleCB0aGUgbmV4dCB0b2tlbiBmb3IgdGhpcyBwcmVwcm9jZXNzb3IuCisgIC8vLyBcYnJpZWYgTGV4IHRoZSBuZXh0IHRva2VuIGZvciB0aGlzIHByZXByb2Nlc3Nvci4KICAgdm9pZCBMZXgoVG9rZW4gJlJlc3VsdCk7CiAKICAgdm9pZCBMZXhBZnRlck1vZHVsZUltcG9ydChUb2tlbiAmUmVzdWx0KTsKQEAgLTc0MywxNyArNzk0LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpEaWFnbm9zdGljVGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01hY3JvRXhwYW5zaW9uKTsKIAotICAvLy8gTGV4Tm9uQ29tbWVudCAtIExleCBhIHRva2VuLiAgSWYgaXQncyBhIGNvbW1lbnQsIGtlZXAgbGV4aW5nIHVudGlsIHdlIGdldAotICAvLy8gc29tZXRoaW5nIG5vdCBhIGNvbW1lbnQuICBUaGlzIGlzIHVzZWZ1bCBpbiAtRSAtQyBtb2RlIHdoZXJlIGNvbW1lbnRzCi0gIC8vLyB3b3VsZCBmb3VsIHVwIHByZXByb2Nlc3NvciBkaXJlY3RpdmUgaGFuZGxpbmcuCisgIC8vLyBcYnJpZWYgTGV4IGEgdG9rZW4uICBJZiBpdCdzIGEgY29tbWVudCwga2VlcCBsZXhpbmcgdW50aWwgd2UgZ2V0CisgIC8vLyBzb21ldGhpbmcgbm90IGEgY29tbWVudC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWZ1bCBpbiAtRSAtQyBtb2RlIHdoZXJlIGNvbW1lbnRzIHdvdWxkIGZvdWwgdXAgcHJlcHJvY2Vzc29yCisgIC8vLyBkaXJlY3RpdmUgaGFuZGxpbmcuCiAgIHZvaWQgTGV4Tm9uQ29tbWVudChUb2tlbiAmUmVzdWx0KSB7CiAgICAgZG8KICAgICAgIExleChSZXN1bHQpOwogICAgIHdoaWxlIChSZXN1bHQuZ2V0S2luZCgpID09IHRvazo6Y29tbWVudCk7CiAgIH0KIAotICAvLy8gTGV4VW5leHBhbmRlZFRva2VuIC0gVGhpcyBpcyBqdXN0IGxpa2UgTGV4LCBidXQgdGhpcyBkaXNhYmxlcyBtYWNybwotICAvLy8gZXhwYW5zaW9uIG9mIGlkZW50aWZpZXIgdG9rZW5zLgorICAvLy8gXGJyaWVmIEp1c3QgbGlrZSBMZXgsIGJ1dCBkaXNhYmxlcyBtYWNybyBleHBhbnNpb24gb2YgaWRlbnRpZmllciB0b2tlbnMuCiAgIHZvaWQgTGV4VW5leHBhbmRlZFRva2VuKFRva2VuICZSZXN1bHQpIHsKICAgICAvLyBEaXNhYmxlIG1hY3JvIGV4cGFuc2lvbi4KICAgICBib29sIE9sZFZhbCA9IERpc2FibGVNYWNyb0V4cGFuc2lvbjsKQEAgLTc2NSwyNCArODE3LDMxIEBACiAgICAgRGlzYWJsZU1hY3JvRXhwYW5zaW9uID0gT2xkVmFsOwogICB9CiAKLSAgLy8vIExleFVuZXhwYW5kZWROb25Db21tZW50IC0gTGlrZSBMZXhOb25Db21tZW50LCBidXQgdGhpcyBkaXNhYmxlcyBtYWNybwotICAvLy8gZXhwYW5zaW9uIG9mIGlkZW50aWZpZXIgdG9rZW5zLgorICAvLy8gXGJyaWVmIExpa2UgTGV4Tm9uQ29tbWVudCwgYnV0IHRoaXMgZGlzYWJsZXMgbWFjcm8gZXhwYW5zaW9uIG9mCisgIC8vLyBpZGVudGlmaWVyIHRva2Vucy4KICAgdm9pZCBMZXhVbmV4cGFuZGVkTm9uQ29tbWVudChUb2tlbiAmUmVzdWx0KSB7CiAgICAgZG8KICAgICAgIExleFVuZXhwYW5kZWRUb2tlbihSZXN1bHQpOwogICAgIHdoaWxlIChSZXN1bHQuZ2V0S2luZCgpID09IHRvazo6Y29tbWVudCk7CiAgIH0KIAorICAvLy8gXGJyaWVmIFBhcnNlcyBhIHNpbXBsZSBpbnRlZ2VyIGxpdGVyYWwgdG8gZ2V0IGl0cyBudW1lcmljIHZhbHVlLiAgRmxvYXRpbmcKKyAgLy8vIHBvaW50IGxpdGVyYWxzIGFuZCB1c2VyIGRlZmluZWQgbGl0ZXJhbHMgYXJlIHJlamVjdGVkLiAgVXNlZCBwcmltYXJpbHkgdG8KKyAgLy8vIGhhbmRsZSBwcmFnbWFzIHRoYXQgYWNjZXB0IGludGVnZXIgYXJndW1lbnRzLgorICBib29sIHBhcnNlU2ltcGxlSW50ZWdlckxpdGVyYWwoVG9rZW4gJlRvaywgdWludDY0X3QgJlZhbHVlKTsKKwogICAvLy8gRGlzYWJsZXMgbWFjcm8gZXhwYW5zaW9uIGV2ZXJ5d2hlcmUgZXhjZXB0IGZvciBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcy4KICAgdm9pZCBTZXRNYWNyb0V4cGFuc2lvbk9ubHlJbkRpcmVjdGl2ZXMoKSB7CiAgICAgRGlzYWJsZU1hY3JvRXhwYW5zaW9uID0gdHJ1ZTsKICAgICBNYWNyb0V4cGFuc2lvbkluRGlyZWN0aXZlc092ZXJyaWRlID0gdHJ1ZTsKICAgfQogCi0gIC8vLyBMb29rQWhlYWQgLSBUaGlzIHBlZWtzIGFoZWFkIE4gdG9rZW5zIGFuZCByZXR1cm5zIHRoYXQgdG9rZW4gd2l0aG91dAotICAvLy8gY29uc3VtaW5nIGFueSB0b2tlbnMuICBMb29rQWhlYWQoMCkgcmV0dXJucyB0aGUgbmV4dCB0b2tlbiB0aGF0IHdvdWxkIGJlCi0gIC8vLyByZXR1cm5lZCBieSBMZXgoKSwgTG9va0FoZWFkKDEpIHJldHVybnMgdGhlIHRva2VuIGFmdGVyIGl0LCBldGMuICBUaGlzCi0gIC8vLyByZXR1cm5zIG5vcm1hbCB0b2tlbnMgYWZ0ZXIgcGhhc2UgNS4gIEFzIHN1Y2gsIGl0IGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcKKyAgLy8vIFxicmllZiBQZWVrcyBhaGVhZCBOIHRva2VucyBhbmQgcmV0dXJucyB0aGF0IHRva2VuIHdpdGhvdXQgY29uc3VtaW5nIGFueQorICAvLy8gdG9rZW5zLgorICAvLy8KKyAgLy8vIExvb2tBaGVhZCgwKSByZXR1cm5zIHRoZSBuZXh0IHRva2VuIHRoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgTGV4KCksCisgIC8vLyBMb29rQWhlYWQoMSkgcmV0dXJucyB0aGUgdG9rZW4gYWZ0ZXIgaXQsIGV0Yy4gIFRoaXMgcmV0dXJucyBub3JtYWwKKyAgLy8vIHRva2VucyBhZnRlciBwaGFzZSA1LiAgQXMgc3VjaCwgaXQgaXMgZXF1aXZhbGVudCB0byB1c2luZwogICAvLy8gJ0xleCcsIG5vdCAnTGV4VW5leHBhbmRlZFRva2VuJy4KICAgY29uc3QgVG9rZW4gJkxvb2tBaGVhZCh1bnNpZ25lZCBOKSB7CiAgICAgaWYgKENhY2hlZExleFBvcyArIE4gPCBDYWNoZWRUb2tlbnMuc2l6ZSgpKQpAQCAtNzkxLDggKzg1MCw5IEBACiAgICAgICByZXR1cm4gUGVla0FoZWFkKE4rMSk7CiAgIH0KIAotICAvLy8gUmV2ZXJ0Q2FjaGVkVG9rZW5zIC0gV2hlbiBiYWNrdHJhY2tpbmcgaXMgZW5hYmxlZCBhbmQgdG9rZW5zIGFyZSBjYWNoZWQsCisgIC8vLyBcYnJpZWYgV2hlbiBiYWNrdHJhY2tpbmcgaXMgZW5hYmxlZCBhbmQgdG9rZW5zIGFyZSBjYWNoZWQsCiAgIC8vLyB0aGlzIGFsbG93cyB0byByZXZlcnQgYSBzcGVjaWZpYyBudW1iZXIgb2YgdG9rZW5zLgorICAvLy8KICAgLy8vIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHRva2VucyBiZWluZyByZXZlcnRlZCBzaG91bGQgYmUgdXAgdG8gdGhlIGxhc3QKICAgLy8vIGJhY2t0cmFjayBwb3NpdGlvbiwgbm90IG1vcmUuCiAgIHZvaWQgUmV2ZXJ0Q2FjaGVkVG9rZW5zKHVuc2lnbmVkIE4pIHsKQEAgLTgwNSwyMCArODY1LDIxIEBACiAgICAgQ2FjaGVkTGV4UG9zIC09IE47CiAgIH0KIAotICAvLy8gRW50ZXJUb2tlbiAtIEVudGVycyBhIHRva2VuIGluIHRoZSB0b2tlbiBzdHJlYW0gdG8gYmUgbGV4ZWQgbmV4dC4gSWYKLSAgLy8vIEJhY2tUcmFjaygpIGlzIGNhbGxlZCBhZnRlcndhcmRzLCB0aGUgdG9rZW4gd2lsbCByZW1haW4gYXQgdGhlIGluc2VydGlvbgotICAvLy8gcG9pbnQuCisgIC8vLyBcYnJpZWYgRW50ZXJzIGEgdG9rZW4gaW4gdGhlIHRva2VuIHN0cmVhbSB0byBiZSBsZXhlZCBuZXh0LgorICAvLy8KKyAgLy8vIElmIEJhY2tUcmFjaygpIGlzIGNhbGxlZCBhZnRlcndhcmRzLCB0aGUgdG9rZW4gd2lsbCByZW1haW4gYXQgdGhlCisgIC8vLyBpbnNlcnRpb24gcG9pbnQuCiAgIHZvaWQgRW50ZXJUb2tlbihjb25zdCBUb2tlbiAmVG9rKSB7CiAgICAgRW50ZXJDYWNoaW5nTGV4TW9kZSgpOwogICAgIENhY2hlZFRva2Vucy5pbnNlcnQoQ2FjaGVkVG9rZW5zLmJlZ2luKCkrQ2FjaGVkTGV4UG9zLCBUb2spOwogICB9CiAKLSAgLy8vIEFubm90YXRlQ2FjaGVkVG9rZW5zIC0gV2Ugbm90aWZ5IHRoZSBQcmVwcm9jZXNzb3IgdGhhdCBpZiBpdCBpcyBjYWNoaW5nCi0gIC8vLyB0b2tlbnMgKGJlY2F1c2UgYmFja3RyYWNrIGlzIGVuYWJsZWQpIGl0IHNob3VsZCByZXBsYWNlIHRoZSBtb3N0IHJlY2VudAotICAvLy8gY2FjaGVkIHRva2VucyB3aXRoIHRoZSBnaXZlbiBhbm5vdGF0aW9uIHRva2VuLiBUaGlzIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3QKLSAgLy8vIGlmIGJhY2t0cmFja2luZyBpcyBub3QgZW5hYmxlZC4KKyAgLy8vIFdlIG5vdGlmeSB0aGUgUHJlcHJvY2Vzc29yIHRoYXQgaWYgaXQgaXMgY2FjaGluZyB0b2tlbnMgKGJlY2F1c2UKKyAgLy8vIGJhY2t0cmFjayBpcyBlbmFibGVkKSBpdCBzaG91bGQgcmVwbGFjZSB0aGUgbW9zdCByZWNlbnQgY2FjaGVkIHRva2VucworICAvLy8gd2l0aCB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiB0b2tlbi4gVGhpcyBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IGlmCisgIC8vLyBiYWNrdHJhY2tpbmcgaXMgbm90IGVuYWJsZWQuCiAgIC8vLwotICAvLy8gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyBqdXN0IGZvciBvcHRpbWl6YXRpb247IHNvIHRoYXQgdGhlCisgIC8vLyBOb3RlIHRoYXQgdGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGp1c3QgZm9yIG9wdGltaXphdGlvbiwgc28gdGhhdCB0aGUKICAgLy8vIGNhY2hlZCB0b2tlbnMgZG9lc24ndCBnZXQgcmUtcGFyc2VkIGFuZCByZS1yZXNvbHZlZCBhZnRlciBhIGJhY2t0cmFjayBpcwogICAvLy8gaW52b2tlZC4KICAgdm9pZCBBbm5vdGF0ZUNhY2hlZFRva2Vucyhjb25zdCBUb2tlbiAmVG9rKSB7CkBAIC04NDgsNyArOTA5LDcgQEAKICAgICAgIENhY2hlZFRva2Vuc1tDYWNoZWRMZXhQb3MtMV0gPSBUb2s7CiAgIH0KIAotICAvLy8gVHlwb0NvcnJlY3RUb2tlbiAtIFVwZGF0ZSB0aGUgY3VycmVudCB0b2tlbiB0byByZXByZXNlbnQgdGhlIHByb3ZpZGVkCisgIC8vLyBVcGRhdGUgdGhlIGN1cnJlbnQgdG9rZW4gdG8gcmVwcmVzZW50IHRoZSBwcm92aWRlZAogICAvLy8gaWRlbnRpZmllciwgaW4gb3JkZXIgdG8gY2FjaGUgYW4gYWN0aW9uIHBlcmZvcm1lZCBieSB0eXBvIGNvcnJlY3Rpb24uCiAgIHZvaWQgVHlwb0NvcnJlY3RUb2tlbihjb25zdCBUb2tlbiAmVG9rKSB7CiAgICAgYXNzZXJ0KFRvay5nZXRJZGVudGlmaWVySW5mbygpICYmICJFeHBlY3RlZCBpZGVudGlmaWVyIHRva2VuIik7CkBAIC04ODksMTEgKzk1MCwxMyBAQAogICBib29sIGlzQ29kZUNvbXBsZXRpb25FbmFibGVkKCkgY29uc3QgeyByZXR1cm4gQ29kZUNvbXBsZXRpb25GaWxlICE9IDA7IH0KIAogICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb2RlLWNvbXBsZXRpb24gcG9pbnQuCisgIC8vLwogICAvLy8gUmV0dXJucyBhbiBpbnZhbGlkIGxvY2F0aW9uIGlmIGNvZGUtY29tcGxldGlvbiBpcyBub3QgZW5hYmxlZCBvciB0aGUgZmlsZQogICAvLy8gY29udGFpbmluZyB0aGUgY29kZS1jb21wbGV0aW9uIHBvaW50IGhhcyBub3QgYmVlbiBsZXhlZCB5ZXQuCiAgIFNvdXJjZUxvY2F0aW9uIGdldENvZGVDb21wbGV0aW9uTG9jKCkgY29uc3QgeyByZXR1cm4gQ29kZUNvbXBsZXRpb25Mb2M7IH0KIAogICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBmaWxlIG9mIGNvZGUtY29tcGxldGlvbiBwb2ludC4KKyAgLy8vCiAgIC8vLyBSZXR1cm5zIGFuIGludmFsaWQgbG9jYXRpb24gaWYgY29kZS1jb21wbGV0aW9uIGlzIG5vdCBlbmFibGVkIG9yIHRoZSBmaWxlCiAgIC8vLyBjb250YWluaW5nIHRoZSBjb2RlLWNvbXBsZXRpb24gcG9pbnQgaGFzIG5vdCBiZWVuIGxleGVkIHlldC4KICAgU291cmNlTG9jYXRpb24gZ2V0Q29kZUNvbXBsZXRpb25GaWxlTG9jKCkgY29uc3QgewpAQCAtOTEzLDggKzk3Niw5IEBACiAgIH0KIAogICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudGx5LWFjdGl2ZSBcI3ByYWdtYSBjbGFuZwotICAvLy8gYXJjX2NmX2NvZGVfYXVkaXRlZCBiZWdpbi4gIFJldHVybnMgYW4gaW52YWxpZCBsb2NhdGlvbiBpZiB0aGVyZQotICAvLy8gaXMgbm8gc3VjaCBwcmFnbWEgYWN0aXZlLgorICAvLy8gYXJjX2NmX2NvZGVfYXVkaXRlZCBiZWdpbi4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGFuIGludmFsaWQgbG9jYXRpb24gaWYgdGhlcmUgaXMgbm8gc3VjaCBwcmFnbWEgYWN0aXZlLgogICBTb3VyY2VMb2NhdGlvbiBnZXRQcmFnbWFBUkNDRkNvZGVBdWRpdGVkTG9jKCkgY29uc3QgewogICAgIHJldHVybiBQcmFnbWFBUkNDRkNvZGVBdWRpdGVkTG9jOwogICB9CkBAIC05MzYsNyArMTAwMCw3IEBACiAgICAgU2tpcE1haW5GaWxlUHJlYW1ibGUuc2Vjb25kID0gU3RhcnRPZkxpbmU7CiAgIH0KIAotICAvLy8gRGlhZyAtIEZvcndhcmRpbmcgZnVuY3Rpb24gZm9yIGRpYWdub3N0aWNzLiAgVGhpcyBlbWl0cyBhIGRpYWdub3N0aWMgYXQKKyAgLy8vIEZvcndhcmRpbmcgZnVuY3Rpb24gZm9yIGRpYWdub3N0aWNzLiAgVGhpcyBlbWl0cyBhIGRpYWdub3N0aWMgYXQKICAgLy8vIHRoZSBzcGVjaWZpZWQgVG9rZW4ncyBsb2NhdGlvbiwgdHJhbnNsYXRpbmcgdGhlIHRva2VuJ3Mgc3RhcnQKICAgLy8vIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ1ZmZlciBpbnRvIGEgU291cmNlUG9zaXRpb24gb2JqZWN0IGZvciByZW5kZXJpbmcuCiAgIERpYWdub3N0aWNCdWlsZGVyIERpYWcoU291cmNlTG9jYXRpb24gTG9jLCB1bnNpZ25lZCBEaWFnSUQpIGNvbnN0IHsKQEAgLTk0Nyw3ICsxMDExLDcgQEAKICAgICByZXR1cm4gRGlhZ3MtPlJlcG9ydChUb2suZ2V0TG9jYXRpb24oKSwgRGlhZ0lEKTsKICAgfQogCi0gIC8vLyBnZXRTcGVsbGluZygpIC0gUmV0dXJuIHRoZSAnc3BlbGxpbmcnIG9mIHRoZSB0b2tlbiBhdCB0aGUgZ2l2ZW4KKyAgLy8vIFJldHVybiB0aGUgJ3NwZWxsaW5nJyBvZiB0aGUgdG9rZW4gYXQgdGhlIGdpdmVuCiAgIC8vLyBsb2NhdGlvbjsgZG9lcyBub3QgZ28gdXAgdG8gdGhlIHNwZWxsaW5nIGxvY2F0aW9uIG9yIGRvd24gdG8gdGhlCiAgIC8vLyBleHBhbnNpb24gbG9jYXRpb24uCiAgIC8vLwpAQCAtOTYwLDIxICsxMDI0LDI0IEBACiAgICAgcmV0dXJuIExleGVyOjpnZXRTcGVsbGluZyhsb2MsIGJ1ZmZlciwgU291cmNlTWdyLCBMYW5nT3B0cywgaW52YWxpZCk7CiAgIH0KIAotICAvLy8gZ2V0U3BlbGxpbmcoKSAtIFJldHVybiB0aGUgJ3NwZWxsaW5nJyBvZiB0aGUgVG9rIHRva2VuLiAgVGhlIHNwZWxsaW5nIG9mIGEKLSAgLy8vIHRva2VuIGlzIHRoZSBjaGFyYWN0ZXJzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0b2tlbiBpbiB0aGUgc291cmNlIGZpbGUKLSAgLy8vIGFmdGVyIHRyaWdyYXBoIGV4cGFuc2lvbiBhbmQgZXNjYXBlZC1uZXdsaW5lIGZvbGRpbmcuICBJbiBwYXJ0aWN1bGFyLCB0aGlzCi0gIC8vLyB3YW50cyB0byBnZXQgdGhlIHRydWUsIHVuY2Fub25pY2FsaXplZCwgc3BlbGxpbmcgb2YgdGhpbmdzIGxpa2UgZGlncmFwaHMKLSAgLy8vIFVDTnMsIGV0Yy4KKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlICdzcGVsbGluZycgb2YgdGhlIFRvayB0b2tlbi4KKyAgLy8vCisgIC8vLyBUaGUgc3BlbGxpbmcgb2YgYSB0b2tlbiBpcyB0aGUgY2hhcmFjdGVycyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgdG9rZW4gaW4KKyAgLy8vIHRoZSBzb3VyY2UgZmlsZSBhZnRlciB0cmlncmFwaCBleHBhbnNpb24gYW5kIGVzY2FwZWQtbmV3bGluZSBmb2xkaW5nLiAgSW4KKyAgLy8vIHBhcnRpY3VsYXIsIHRoaXMgd2FudHMgdG8gZ2V0IHRoZSB0cnVlLCB1bmNhbm9uaWNhbGl6ZWQsIHNwZWxsaW5nIG9mCisgIC8vLyB0aGluZ3MgbGlrZSBkaWdyYXBocywgVUNOcywgZXRjLgogICAvLy8KICAgLy8vIFxwYXJhbSBJbnZhbGlkIElmIG5vbi1udWxsLCB3aWxsIGJlIHNldCBcYyB0cnVlIGlmIGFuIGVycm9yIG9jY3Vycy4KICAgc3RkOjpzdHJpbmcgZ2V0U3BlbGxpbmcoY29uc3QgVG9rZW4gJlRvaywgYm9vbCAqSW52YWxpZCA9IDApIGNvbnN0IHsKICAgICByZXR1cm4gTGV4ZXI6OmdldFNwZWxsaW5nKFRvaywgU291cmNlTWdyLCBMYW5nT3B0cywgSW52YWxpZCk7CiAgIH0KIAotICAvLy8gZ2V0U3BlbGxpbmcgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgc3BlbGxpbmcgb2YgYSB0b2tlbiBpbnRvIGEKLSAgLy8vIHByZWFsbG9jYXRlZCBidWZmZXIsIGluc3RlYWQgb2YgYXMgYW4gc3RkOjpzdHJpbmcuICBUaGUgY2FsbGVyIGlzIHJlcXVpcmVkCi0gIC8vLyB0byBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSB0b2tlbiwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBhdCBsZWFzdAotICAvLy8gVG9rLmdldExlbmd0aCgpIGJ5dGVzIGxvbmcuICBUaGUgbGVuZ3RoIG9mIHRoZSBhY3R1YWwgcmVzdWx0IGlzIHJldHVybmVkLgorICAvLy8gXGJyaWVmIEdldCB0aGUgc3BlbGxpbmcgb2YgYSB0b2tlbiBpbnRvIGEgcHJlYWxsb2NhdGVkIGJ1ZmZlciwgaW5zdGVhZAorICAvLy8gb2YgYXMgYW4gc3RkOjpzdHJpbmcuCisgIC8vLworICAvLy8gVGhlIGNhbGxlciBpcyByZXF1aXJlZCB0byBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSB0b2tlbiwgd2hpY2ggaXMKKyAgLy8vIGd1YXJhbnRlZWQgdG8gYmUgYXQgbGVhc3QgVG9rLmdldExlbmd0aCgpIGJ5dGVzIGxvbmcuIFRoZSBsZW5ndGggb2YgdGhlCisgIC8vLyBhY3R1YWwgcmVzdWx0IGlzIHJldHVybmVkLgogICAvLy8KICAgLy8vIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgZG8gdHdvIHBvc3NpYmxlIHRoaW5nczogaXQgbWF5IGVpdGhlciBmaWxsIGluCiAgIC8vLyB0aGUgYnVmZmVyIHNwZWNpZmllZCB3aXRoIGNoYXJhY3RlcnMsIG9yIGl0IG1heSAqY2hhbmdlIHRoZSBpbnB1dCBwb2ludGVyKgpAQCAtOTg2LDggKzEwNTMsOSBAQAogICAgIHJldHVybiBMZXhlcjo6Z2V0U3BlbGxpbmcoVG9rLCBCdWZmZXIsIFNvdXJjZU1nciwgTGFuZ09wdHMsIEludmFsaWQpOwogICB9CiAKLSAgLy8vIGdldFNwZWxsaW5nIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHNwZWxsaW5nIG9mIGEgdG9rZW4gaW50byBhCi0gIC8vLyBTbWFsbFZlY3Rvci4gTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBTdHJpbmdSZWYgbWF5IG5vdCBwb2ludCB0byB0aGUKKyAgLy8vIFxicmllZiBHZXQgdGhlIHNwZWxsaW5nIG9mIGEgdG9rZW4gaW50byBhIFNtYWxsVmVjdG9yLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgU3RyaW5nUmVmIG1heSBub3QgcG9pbnQgdG8gdGhlCiAgIC8vLyBzdXBwbGllZCBidWZmZXIgaWYgYSBjb3B5IGNhbiBiZSBhdm9pZGVkLgogICBTdHJpbmdSZWYgZ2V0U3BlbGxpbmcoY29uc3QgVG9rZW4gJlRvaywKICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmQnVmZmVyLApAQCAtMTAwMCw4ICsxMDY4LDggQEAKICAgICByZXR1cm4gTGV4ZXI6OmdldFJhd1Rva2VuKExvYywgUmVzdWx0LCBTb3VyY2VNZ3IsIExhbmdPcHRzLCBJZ25vcmVXaGl0ZVNwYWNlKTsKICAgfQogCi0gIC8vLyBnZXRTcGVsbGluZ09mU2luZ2xlQ2hhcmFjdGVyTnVtZXJpY0NvbnN0YW50IC0gVG9rIGlzIGEgbnVtZXJpYyBjb25zdGFudAotICAvLy8gd2l0aCBsZW5ndGggMSwgcmV0dXJuIHRoZSBjaGFyYWN0ZXIuCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBUb2tlbiBccCBUb2sgdGhhdCBpcyBhIG51bWVyaWMgY29uc3RhbnQgd2l0aCBsZW5ndGggMSwKKyAgLy8vIHJldHVybiB0aGUgY2hhcmFjdGVyLgogICBjaGFyIGdldFNwZWxsaW5nT2ZTaW5nbGVDaGFyYWN0ZXJOdW1lcmljQ29uc3RhbnQoY29uc3QgVG9rZW4gJlRvaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkludmFsaWQgPSAwKSBjb25zdCB7CiAgICAgYXNzZXJ0KFRvay5pcyh0b2s6Om51bWVyaWNfY29uc3RhbnQpICYmCkBAIC0xMDE5LDE4ICsxMDg3LDIxIEBACiAKICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgaW1tZWRpYXRlIG1hY3JvIGV4cGFuc2lvbi4KICAgLy8vCi0gIC8vLyBUaGlzIHJvdXRpbmUgc3RhcnRzIGZyb20gYSBzb3VyY2UgbG9jYXRpb24sIGFuZCBmaW5kcyB0aGUgbmFtZSBvZiB0aGUgbWFjcm8KLSAgLy8vIHJlc3BvbnNpYmxlIGZvciBpdHMgaW1tZWRpYXRlIGV4cGFuc2lvbi4gSXQgbG9va3MgdGhyb3VnaCBhbnkgaW50ZXJ2ZW5pbmcKLSAgLy8vIG1hY3JvIGFyZ3VtZW50IGV4cGFuc2lvbnMgdG8gY29tcHV0ZSB0aGlzLiBJdCByZXR1cm5zIGEgU3RyaW5nUmVmIHdoaWNoCi0gIC8vLyByZWZlcnMgdG8gdGhlIFNvdXJjZU1hbmFnZXItb3duZWQgYnVmZmVyIG9mIHRoZSBzb3VyY2Ugd2hlcmUgdGhhdCBtYWNybwotICAvLy8gbmFtZSBpcyBzcGVsbGVkLiBUaHVzLCB0aGUgcmVzdWx0IHNob3VsZG4ndCBvdXQtbGl2ZSB0aGUgU291cmNlTWFuYWdlci4KKyAgLy8vIFRoaXMgcm91dGluZSBzdGFydHMgZnJvbSBhIHNvdXJjZSBsb2NhdGlvbiwgYW5kIGZpbmRzIHRoZSBuYW1lIG9mIHRoZQorICAvLy8gbWFjcm8gcmVzcG9uc2libGUgZm9yIGl0cyBpbW1lZGlhdGUgZXhwYW5zaW9uLiBJdCBsb29rcyB0aHJvdWdoIGFueQorICAvLy8gaW50ZXJ2ZW5pbmcgbWFjcm8gYXJndW1lbnQgZXhwYW5zaW9ucyB0byBjb21wdXRlIHRoaXMuIEl0IHJldHVybnMgYQorICAvLy8gU3RyaW5nUmVmIHRoYXQgcmVmZXJzIHRvIHRoZSBTb3VyY2VNYW5hZ2VyLW93bmVkIGJ1ZmZlciBvZiB0aGUgc291cmNlCisgIC8vLyB3aGVyZSB0aGF0IG1hY3JvIG5hbWUgaXMgc3BlbGxlZC4gVGh1cywgdGhlIHJlc3VsdCBzaG91bGRuJ3Qgb3V0LWxpdmUKKyAgLy8vIHRoZSBTb3VyY2VNYW5hZ2VyLgogICBTdHJpbmdSZWYgZ2V0SW1tZWRpYXRlTWFjcm9OYW1lKFNvdXJjZUxvY2F0aW9uIExvYykgewogICAgIHJldHVybiBMZXhlcjo6Z2V0SW1tZWRpYXRlTWFjcm9OYW1lKExvYywgU291cmNlTWdyLCBnZXRMYW5nT3B0cygpKTsKICAgfQogCi0gIC8vLyBDcmVhdGVTdHJpbmcgLSBQbG9wIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gYSBzY3JhdGNoIGJ1ZmZlciBhbmQgc2V0IHRoZQotICAvLy8gc3BlY2lmaWVkIHRva2VuJ3MgbG9jYXRpb24gYW5kIGxlbmd0aCB0byBpdC4gIElmIHNwZWNpZmllZCwgdGhlIHNvdXJjZQotICAvLy8gbG9jYXRpb24gcHJvdmlkZXMgYSBsb2NhdGlvbiBvZiB0aGUgZXhwYW5zaW9uIHBvaW50IG9mIHRoZSB0b2tlbi4KKyAgLy8vIFxicmllZiBQbG9wIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gYSBzY3JhdGNoIGJ1ZmZlciBhbmQgc2V0IHRoZQorICAvLy8gc3BlY2lmaWVkIHRva2VuJ3MgbG9jYXRpb24gYW5kIGxlbmd0aCB0byBpdC4gCisgIC8vLworICAvLy8gSWYgc3BlY2lmaWVkLCB0aGUgc291cmNlIGxvY2F0aW9uIHByb3ZpZGVzIGEgbG9jYXRpb24gb2YgdGhlIGV4cGFuc2lvbgorICAvLy8gcG9pbnQgb2YgdGhlIHRva2VuLgogICB2b2lkIENyZWF0ZVN0cmluZyhTdHJpbmdSZWYgU3RyLCBUb2tlbiAmVG9rLAogICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFeHBhbnNpb25Mb2NTdGFydCA9IFNvdXJjZUxvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEV4cGFuc2lvbkxvY0VuZCA9IFNvdXJjZUxvY2F0aW9uKCkpOwpAQCAtMTA3NSwyMyArMTE0NiwyMiBAQAogICAgIHJldHVybiBMZXhlcjo6aXNBdEVuZE9mTWFjcm9FeHBhbnNpb24obG9jLCBTb3VyY2VNZ3IsIExhbmdPcHRzLCBNYWNyb0VuZCk7CiAgIH0KIAotICAvLy8gRHVtcFRva2VuIC0gUHJpbnQgdGhlIHRva2VuIHRvIHN0ZGVyciwgdXNlZCBmb3IgZGVidWdnaW5nLgotICAvLy8KKyAgLy8vIFxicmllZiBQcmludCB0aGUgdG9rZW4gdG8gc3RkZXJyLCB1c2VkIGZvciBkZWJ1Z2dpbmcuCiAgIHZvaWQgRHVtcFRva2VuKGNvbnN0IFRva2VuICZUb2ssIGJvb2wgRHVtcEZsYWdzID0gZmFsc2UpIGNvbnN0OwogICB2b2lkIER1bXBMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0OwogICB2b2lkIER1bXBNYWNybyhjb25zdCBNYWNyb0luZm8gJk1JKSBjb25zdDsKIAotICAvLy8gQWR2YW5jZVRvVG9rZW5DaGFyYWN0ZXIgLSBHaXZlbiBhIGxvY2F0aW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBzdGFydCBvZiBhCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBsb2NhdGlvbiB0aGF0IHNwZWNpZmllcyB0aGUgc3RhcnQgb2YgYQogICAvLy8gdG9rZW4sIHJldHVybiBhIG5ldyBsb2NhdGlvbiB0aGF0IHNwZWNpZmllcyBhIGNoYXJhY3RlciB3aXRoaW4gdGhlIHRva2VuLgogICBTb3VyY2VMb2NhdGlvbiBBZHZhbmNlVG9Ub2tlbkNoYXJhY3RlcihTb3VyY2VMb2NhdGlvbiBUb2tTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hhcikgY29uc3QgewogICAgIHJldHVybiBMZXhlcjo6QWR2YW5jZVRvVG9rZW5DaGFyYWN0ZXIoVG9rU3RhcnQsIENoYXIsIFNvdXJjZU1nciwgTGFuZ09wdHMpOwogICB9CiAKLSAgLy8vIEluY3JlbWVudFBhc3RlQ291bnRlciAtIEluY3JlbWVudCB0aGUgY291bnRlcnMgZm9yIHRoZSBudW1iZXIgb2YgdG9rZW4KLSAgLy8vIHBhc3RlIG9wZXJhdGlvbnMgcGVyZm9ybWVkLiAgSWYgZmFzdCB3YXMgc3BlY2lmaWVkLCB0aGlzIGlzIGEgJ2Zhc3QgcGFzdGUnCi0gIC8vLyBjYXNlIHdlIGhhbmRsZWQuCisgIC8vLyBcYnJpZWYgSW5jcmVtZW50IHRoZSBjb3VudGVycyBmb3IgdGhlIG51bWJlciBvZiB0b2tlbiBwYXN0ZSBvcGVyYXRpb25zCisgIC8vLyBwZXJmb3JtZWQuCiAgIC8vLworICAvLy8gSWYgZmFzdCB3YXMgc3BlY2lmaWVkLCB0aGlzIGlzIGEgJ2Zhc3QgcGFzdGUnIGNhc2Ugd2UgaGFuZGxlZC4KICAgdm9pZCBJbmNyZW1lbnRQYXN0ZUNvdW50ZXIoYm9vbCBpc0Zhc3QpIHsKICAgICBpZiAoaXNGYXN0KQogICAgICAgKytOdW1GYXN0VG9rZW5QYXN0ZTsKQEAgLTExMDMsMTYgKzExNzMsMTYgQEAKIAogICBzaXplX3QgZ2V0VG90YWxNZW1vcnkoKSBjb25zdDsKIAotICAvLy8gSGFuZGxlTWljcm9zb2Z0Q29tbWVudFBhc3RlIC0gV2hlbiB0aGUgbWFjcm8gZXhwYW5kZXIgcGFzdGVzIHRvZ2V0aGVyIGEKLSAgLy8vIGNvbW1lbnQgKC8jIy8pIGluIG1pY3Jvc29mdCBtb2RlLCB0aGlzIG1ldGhvZCBoYW5kbGVzIHVwZGF0aW5nIHRoZSBjdXJyZW50Ci0gIC8vLyBzdGF0ZSwgcmV0dXJuaW5nIHRoZSB0b2tlbiBvbiB0aGUgbmV4dCBzb3VyY2UgbGluZS4KKyAgLy8vIFdoZW4gdGhlIG1hY3JvIGV4cGFuZGVyIHBhc3RlcyB0b2dldGhlciBhIGNvbW1lbnQgKC8jIy8pIGluIE1pY3Jvc29mdAorICAvLy8gbW9kZSwgdGhpcyBtZXRob2QgaGFuZGxlcyB1cGRhdGluZyB0aGUgY3VycmVudCBzdGF0ZSwgcmV0dXJuaW5nIHRoZQorICAvLy8gdG9rZW4gb24gdGhlIG5leHQgc291cmNlIGxpbmUuCiAgIHZvaWQgSGFuZGxlTWljcm9zb2Z0Q29tbWVudFBhc3RlKFRva2VuICZUb2spOwogCiAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogICAvLyBQcmVwcm9jZXNzb3IgY2FsbGJhY2sgbWV0aG9kcy4gIFRoZXNlIGFyZSBpbnZva2VkIGJ5IGEgbGV4ZXIgYXMgdmFyaW91cwogICAvLyBkaXJlY3RpdmVzIGFuZCBldmVudHMgYXJlIGZvdW5kLgogCi0gIC8vLyBMb29rVXBJZGVudGlmaWVySW5mbyAtIEdpdmVuIGEgdG9rOjpyYXdfaWRlbnRpZmllciB0b2tlbiwgbG9vayB1cCB0aGUKKyAgLy8vIEdpdmVuIGEgdG9rOjpyYXdfaWRlbnRpZmllciB0b2tlbiwgbG9vayB1cCB0aGUKICAgLy8vIGlkZW50aWZpZXIgaW5mb3JtYXRpb24gZm9yIHRoZSB0b2tlbiBhbmQgaW5zdGFsbCBpdCBpbnRvIHRoZSB0b2tlbiwKICAgLy8vIHVwZGF0aW5nIHRoZSB0b2tlbiBraW5kIGFjY29yZGluZ2x5LgogICBJZGVudGlmaWVySW5mbyAqTG9va1VwSWRlbnRpZmllckluZm8oVG9rZW4gJklkZW50aWZpZXIpIGNvbnN0OwpAQCAtMTEyMiwxNCArMTE5MiwxMyBAQAogCiBwdWJsaWM6CiAKLSAgLy8gU2V0UG9pc29uUmVhc29uIC0gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGluZGljYXRlIHRoZSByZWFzb24gZm9yCi0gIC8vIHBvaXNvbmluZyBhbiBpZGVudGlmaWVyLiBJZiB0aGF0IGlkZW50aWZpZXIgaXMgYWNjZXNzZWQgd2hpbGUKLSAgLy8gcG9pc29uZWQsIHRoZW4gdGhpcyByZWFzb24gd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKLSAgLy8gInBvaXNvbmVkIiBkaWFnbm9zdGljLgorICAvLy8gXGJyaWVmIFNwZWNpZmllcyB0aGUgcmVhc29uIGZvciBwb2lzb25pbmcgYW4gaWRlbnRpZmllci4KKyAgLy8vCisgIC8vLyBJZiB0aGF0IGlkZW50aWZpZXIgaXMgYWNjZXNzZWQgd2hpbGUgcG9pc29uZWQsIHRoZW4gdGhpcyByZWFzb24gd2lsbCBiZQorICAvLy8gdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0ICJwb2lzb25lZCIgZGlhZ25vc3RpYy4KICAgdm9pZCBTZXRQb2lzb25SZWFzb24oSWRlbnRpZmllckluZm8gKklJLCB1bnNpZ25lZCBEaWFnSUQpOwogCi0gIC8vIEhhbmRsZVBvaXNvbmVkSWRlbnRpZmllciAtIERpc3BsYXkgcmVhc29uIGZvciBwb2lzb25lZAotICAvLyBpZGVudGlmaWVyLgorICAvLy8gXGJyaWVmIERpc3BsYXkgcmVhc29uIGZvciBwb2lzb25lZCBpZGVudGlmaWVyLgogICB2b2lkIEhhbmRsZVBvaXNvbmVkSWRlbnRpZmllcihUb2tlbiAmIFRvayk7CiAKICAgdm9pZCBNYXliZUhhbmRsZVBvaXNvbmVkSWRlbnRpZmllcihUb2tlbiAmIElkZW50aWZpZXIpIHsKQEAgLTExNTUsNDUgKzEyMjQsNTMgQEAKICAgSWRlbnRpZmllckluZm8gKklkZW50X19hYm5vcm1hbF90ZXJtaW5hdGlvbiwKICAgICAgICAgICAgICAgICAgKklkZW50X19fYWJub3JtYWxfdGVybWluYXRpb24sCiAgICAgICAgICAgICAgICAgICpJZGVudF9BYm5vcm1hbFRlcm1pbmF0aW9uOworCisgIGNvbnN0IGNoYXIgKmdldEN1ckxleGVyRW5kUG9zKCk7CisKIHB1YmxpYzoKICAgdm9pZCBQb2lzb25TRUhJZGVudGlmaWVycyhib29sIFBvaXNvbiA9IHRydWUpOyAvLyBCb3JsYW5kCiAKLSAgLy8vIEhhbmRsZUlkZW50aWZpZXIgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiB0aGUgbGV4ZXIgcmVhZHMgYW4KLSAgLy8vIGlkZW50aWZpZXIgYW5kIGhhcyBmaWxsZWQgaW4gdGhlIHRva2VucyBJZGVudGlmaWVySW5mbyBtZW1iZXIuICBUaGlzCi0gIC8vLyBjYWxsYmFjayBwb3RlbnRpYWxseSBtYWNybyBleHBhbmRzIGl0IG9yIHR1cm5zIGl0IGludG8gYSBuYW1lZCB0b2tlbiAobGlrZQotICAvLy8gJ2ZvcicpLgorICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgbGV4ZXIgcmVhZHMgYW4gaWRlbnRpZmllciBhbmQgaGFzCisgIC8vLyBmaWxsZWQgaW4gdGhlIHRva2VucyBJZGVudGlmaWVySW5mbyBtZW1iZXIuIAorICAvLy8KKyAgLy8vIFRoaXMgY2FsbGJhY2sgcG90ZW50aWFsbHkgbWFjcm8gZXhwYW5kcyBpdCBvciB0dXJucyBpdCBpbnRvIGEgbmFtZWQKKyAgLy8vIHRva2VuIChsaWtlICdmb3InKS4KICAgLy8vCiAgIC8vLyBccmV0dXJucyB0cnVlIGlmIHdlIGFjdHVhbGx5IGNvbXB1dGVkIGEgdG9rZW4sIGZhbHNlIGlmIHdlIG5lZWQgdG8KICAgLy8vIGxleCBhZ2Fpbi4KICAgYm9vbCBIYW5kbGVJZGVudGlmaWVyKFRva2VuICZJZGVudGlmaWVyKTsKIAogCi0gIC8vLyBIYW5kbGVFbmRPZkZpbGUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiB0aGUgbGV4ZXIgaGl0cyB0aGUgZW5kIG9mCi0gIC8vLyB0aGUgY3VycmVudCBmaWxlLiAgVGhpcyBlaXRoZXIgcmV0dXJucyB0aGUgRU9GIHRva2VuIGFuZCByZXR1cm5zIHRydWUsIG9yCisgIC8vLyBcYnJpZWYgQ2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSBsZXhlciBoaXRzIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZmlsZS4KKyAgLy8vCisgIC8vLyBUaGlzIGVpdGhlciByZXR1cm5zIHRoZSBFT0YgdG9rZW4gYW5kIHJldHVybnMgdHJ1ZSwgb3IKICAgLy8vIHBvcHMgYSBsZXZlbCBvZmYgdGhlIGluY2x1ZGUgc3RhY2sgYW5kIHJldHVybnMgZmFsc2UsIGF0IHdoaWNoIHBvaW50IHRoZQogICAvLy8gY2xpZW50IHNob3VsZCBjYWxsIGxleCBhZ2Fpbi4KICAgYm9vbCBIYW5kbGVFbmRPZkZpbGUoVG9rZW4gJlJlc3VsdCwgYm9vbCBpc0VuZE9mTWFjcm8gPSBmYWxzZSk7CiAKLSAgLy8vIEhhbmRsZUVuZE9mVG9rZW5MZXhlciAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIHRoZSBjdXJyZW50Ci0gIC8vLyBUb2tlbkxleGVyIGhpdHMgdGhlIGVuZCBvZiBpdHMgdG9rZW4gc3RyZWFtLgorICAvLy8gXGJyaWVmIENhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgY3VycmVudCBUb2tlbkxleGVyIGhpdHMgdGhlIGVuZCBvZiBpdHMKKyAgLy8vIHRva2VuIHN0cmVhbS4KICAgYm9vbCBIYW5kbGVFbmRPZlRva2VuTGV4ZXIoVG9rZW4gJlJlc3VsdCk7CiAKLSAgLy8vIEhhbmRsZURpcmVjdGl2ZSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIHRoZSBsZXhlciBzZWVzIGEgIyB0b2tlbgotICAvLy8gYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4gIFRoaXMgY29uc3VtZXMgdGhlIGRpcmVjdGl2ZSwgbW9kaWZpZXMgdGhlCi0gIC8vLyBsZXhlci9wcmVwcm9jZXNzb3Igc3RhdGUsIGFuZCBhZHZhbmNlcyB0aGUgbGV4ZXIocykgc28gdGhhdCB0aGUgbmV4dCB0b2tlbgotICAvLy8gcmVhZCBpcyB0aGUgY29ycmVjdCBvbmUuCisgIC8vLyBcYnJpZWYgQ2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSBsZXhlciBzZWVzIGEgIyB0b2tlbiBhdCB0aGUgc3RhcnQgb2YgYQorICAvLy8gbGluZS4KKyAgLy8vCisgIC8vLyBUaGlzIGNvbnN1bWVzIHRoZSBkaXJlY3RpdmUsIG1vZGlmaWVzIHRoZSBsZXhlci9wcmVwcm9jZXNzb3Igc3RhdGUsIGFuZAorICAvLy8gYWR2YW5jZXMgdGhlIGxleGVyKHMpIHNvIHRoYXQgdGhlIG5leHQgdG9rZW4gcmVhZCBpcyB0aGUgY29ycmVjdCBvbmUuCiAgIHZvaWQgSGFuZGxlRGlyZWN0aXZlKFRva2VuICZSZXN1bHQpOwogCi0gIC8vLyBDaGVja0VuZE9mRGlyZWN0aXZlIC0gRW5zdXJlIHRoYXQgdGhlIG5leHQgdG9rZW4gaXMgYSB0b2s6OmVvZCB0b2tlbi4gIElmCi0gIC8vLyBub3QsIGVtaXQgYSBkaWFnbm9zdGljIGFuZCBjb25zdW1lIHVwIHVudGlsIHRoZSBlb2QuICBJZiBFbmFibGVNYWNyb3MgaXMKLSAgLy8vIHRydWUsIHRoZW4gd2UgY29uc2lkZXIgbWFjcm9zIHRoYXQgZXhwYW5kIHRvIHplcm8gdG9rZW5zIGFzIGJlaW5nIG9rLgorICAvLy8gXGJyaWVmIEVuc3VyZSB0aGF0IHRoZSBuZXh0IHRva2VuIGlzIGEgdG9rOjplb2QgdG9rZW4uCisgIC8vLworICAvLy8gSWYgbm90LCBlbWl0IGEgZGlhZ25vc3RpYyBhbmQgY29uc3VtZSB1cCB1bnRpbCB0aGUgZW9kLgorICAvLy8gSWYgXHAgRW5hYmxlTWFjcm9zIGlzIHRydWUsIHRoZW4gd2UgY29uc2lkZXIgbWFjcm9zIHRoYXQgZXhwYW5kIHRvIHplcm8KKyAgLy8vIHRva2VucyBhcyBiZWluZyBvay4KICAgdm9pZCBDaGVja0VuZE9mRGlyZWN0aXZlKGNvbnN0IGNoYXIgKkRpcmVjdGl2ZSwgYm9vbCBFbmFibGVNYWNyb3MgPSBmYWxzZSk7CiAKLSAgLy8vIERpc2NhcmRVbnRpbEVuZE9mRGlyZWN0aXZlIC0gUmVhZCBhbmQgZGlzY2FyZCBhbGwgdG9rZW5zIHJlbWFpbmluZyBvbiB0aGUKLSAgLy8vIGN1cnJlbnQgbGluZSB1bnRpbCB0aGUgdG9rOjplb2QgdG9rZW4gaXMgZm91bmQuCisgIC8vLyBcYnJpZWYgUmVhZCBhbmQgZGlzY2FyZCBhbGwgdG9rZW5zIHJlbWFpbmluZyBvbiB0aGUgY3VycmVudCBsaW5lIHVudGlsCisgIC8vLyB0aGUgdG9rOjplb2QgdG9rZW4gaXMgZm91bmQuCiAgIHZvaWQgRGlzY2FyZFVudGlsRW5kT2ZEaXJlY3RpdmUoKTsKIAotICAvLy8gU2F3RGF0ZU9yVGltZSAtIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBwcmVwcm9jZXNzb3IgaGFzIHNlZW4gYSB1c2Ugb2YKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIHByZXByb2Nlc3NvciBoYXMgc2VlbiBhIHVzZSBvZgogICAvLy8gX19EQVRFX18gb3IgX19USU1FX18gaW4gdGhlIGZpbGUgc28gZmFyLgogICBib29sIFNhd0RhdGVPclRpbWUoKSBjb25zdCB7CiAgICAgcmV0dXJuIERBVEVMb2MgIT0gU291cmNlTG9jYXRpb24oKSB8fCBUSU1FTG9jICE9IFNvdXJjZUxvY2F0aW9uKCk7CkBAIC0xMjM0LDE3ICsxMzExLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVNYXA6Oktub3duSGVhZGVyICpTdWdnZXN0ZWRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNraXBDYWNoZSA9IGZhbHNlKTsKIAotICAvLy8gR2V0Q3VyTG9va3VwIC0gVGhlIERpcmVjdG9yeUxvb2t1cCBzdHJ1Y3R1cmUgdXNlZCB0byBmaW5kIHRoZSBjdXJyZW50Ci0gIC8vLyBGaWxlRW50cnksIGlmIEN1ckxleGVyIGlzIG5vbi1udWxsIGFuZCBpZiBhcHBsaWNhYmxlLiAgVGhpcyBhbGxvd3MgdXMgdG8KLSAgLy8vIGltcGxlbWVudCBcI2luY2x1ZGVfbmV4dCBhbmQgZmluZCBkaXJlY3Rvcnktc3BlY2lmaWMgcHJvcGVydGllcy4KKyAgLy8vIFxicmllZiBHZXQgdGhlIERpcmVjdG9yeUxvb2t1cCBzdHJ1Y3R1cmUgdXNlZCB0byBmaW5kIHRoZSBjdXJyZW50CisgIC8vLyBGaWxlRW50cnksIGlmIEN1ckxleGVyIGlzIG5vbi1udWxsIGFuZCBpZiBhcHBsaWNhYmxlLiAKKyAgLy8vCisgIC8vLyBUaGlzIGFsbG93cyB1cyB0byBpbXBsZW1lbnQgXCNpbmNsdWRlX25leHQgYW5kIGZpbmQgZGlyZWN0b3J5LXNwZWNpZmljCisgIC8vLyBwcm9wZXJ0aWVzLgogICBjb25zdCBEaXJlY3RvcnlMb29rdXAgKkdldEN1ckRpckxvb2t1cCgpIHsgcmV0dXJuIEN1ckRpckxvb2t1cDsgfQogCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgd2UncmUgaW4gdGhlIHRvcC1sZXZlbCBmaWxlLCBub3QgaW4gYSBcI2luY2x1ZGUuCiAgIGJvb2wgaXNJblByaW1hcnlGaWxlKCkgY29uc3Q7CiAKLSAgLy8vIENvbmNhdGVuYXRlSW5jbHVkZU5hbWUgLSBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIFwjaW5jbHVkZSBuYW1lIGlzIGV4cGFuZGVkCi0gIC8vLyBmcm9tIGEgbWFjcm8gYXMgbXVsdGlwbGUgdG9rZW5zLCB3aGljaCBuZWVkIHRvIGJlIGdsdWVkIHRvZ2V0aGVyLiAgVGhpcwotICAvLy8gb2NjdXJzIGZvciBjb2RlIGxpa2U6CisgIC8vLyBcYnJpZWYgSGFuZGxlIGNhc2VzIHdoZXJlIHRoZSBcI2luY2x1ZGUgbmFtZSBpcyBleHBhbmRlZAorICAvLy8gZnJvbSBhIG1hY3JvIGFzIG11bHRpcGxlIHRva2Vucywgd2hpY2ggbmVlZCB0byBiZSBnbHVlZCB0b2dldGhlci4gCisgIC8vLworICAvLy8gVGhpcyBvY2N1cnMgZm9yIGNvZGUgbGlrZToKICAgLy8vIFxjb2RlCiAgIC8vLyAgICBcI2RlZmluZSBGT08gPHgveS5oPgogICAvLy8gICAgXCNpbmNsdWRlIEZPTwpAQCAtMTI1NywyOCArMTMzNywyNiBAQAogICBib29sIENvbmNhdGVuYXRlSW5jbHVkZU5hbWUoU21hbGxTdHJpbmc8MTI4PiAmRmlsZW5hbWVCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmRW5kKTsKIAotICAvLy8gTGV4T25PZmZTd2l0Y2ggLSBMZXggYW4gb24tb2ZmLXN3aXRjaCAoQzk5IDYuMTAuNnAyKSBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMKKyAgLy8vIFxicmllZiBMZXggYW4gb24tb2ZmLXN3aXRjaCAoQzk5IDYuMTAuNnAyKSBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMKICAgLy8vIGZvbGxvd2VkIGJ5IEVPRC4gIFJldHVybiB0cnVlIGlmIHRoZSB0b2tlbiBpcyBub3QgYSB2YWxpZCBvbi1vZmYtc3dpdGNoLgogICBib29sIExleE9uT2ZmU3dpdGNoKHRvazo6T25PZmZTd2l0Y2ggJk9PUyk7CiAKIHByaXZhdGU6CiAKICAgdm9pZCBQdXNoSW5jbHVkZU1hY3JvU3RhY2soKSB7Ci0gICAgSW5jbHVkZU1hY3JvU3RhY2sucHVzaF9iYWNrKEluY2x1ZGVTdGFja0luZm8oQ3VyTGV4ZXJLaW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckxleGVyLnRha2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJQVEhMZXhlci50YWtlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyUFBMZXhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJUb2tlbkxleGVyLnRha2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJEaXJMb29rdXApKTsKKyAgICBJbmNsdWRlTWFjcm9TdGFjay5wdXNoX2JhY2soSW5jbHVkZVN0YWNrSW5mbygKKyAgICAgICAgQ3VyTGV4ZXJLaW5kLCBDdXJTdWJtb2R1bGUsIHN0ZDo6bW92ZShDdXJMZXhlciksIHN0ZDo6bW92ZShDdXJQVEhMZXhlciksCisgICAgICAgIEN1clBQTGV4ZXIsIHN0ZDo6bW92ZShDdXJUb2tlbkxleGVyKSwgQ3VyRGlyTG9va3VwKSk7CiAgICAgQ3VyUFBMZXhlciA9IDA7CiAgIH0KIAogICB2b2lkIFBvcEluY2x1ZGVNYWNyb1N0YWNrKCkgewotICAgIEN1ckxleGVyLnJlc2V0KEluY2x1ZGVNYWNyb1N0YWNrLmJhY2soKS5UaGVMZXhlcik7Ci0gICAgQ3VyUFRITGV4ZXIucmVzZXQoSW5jbHVkZU1hY3JvU3RhY2suYmFjaygpLlRoZVBUSExleGVyKTsKKyAgICBDdXJMZXhlciA9IHN0ZDo6bW92ZShJbmNsdWRlTWFjcm9TdGFjay5iYWNrKCkuVGhlTGV4ZXIpOworICAgIEN1clBUSExleGVyID0gc3RkOjptb3ZlKEluY2x1ZGVNYWNyb1N0YWNrLmJhY2soKS5UaGVQVEhMZXhlcik7CiAgICAgQ3VyUFBMZXhlciA9IEluY2x1ZGVNYWNyb1N0YWNrLmJhY2soKS5UaGVQUExleGVyOwotICAgIEN1clRva2VuTGV4ZXIucmVzZXQoSW5jbHVkZU1hY3JvU3RhY2suYmFjaygpLlRoZVRva2VuTGV4ZXIpOworICAgIEN1clRva2VuTGV4ZXIgPSBzdGQ6Om1vdmUoSW5jbHVkZU1hY3JvU3RhY2suYmFjaygpLlRoZVRva2VuTGV4ZXIpOwogICAgIEN1ckRpckxvb2t1cCAgPSBJbmNsdWRlTWFjcm9TdGFjay5iYWNrKCkuVGhlRGlyTG9va3VwOworICAgIEN1clN1Ym1vZHVsZSA9IEluY2x1ZGVNYWNyb1N0YWNrLmJhY2soKS5UaGVTdWJtb2R1bGU7CiAgICAgQ3VyTGV4ZXJLaW5kID0gSW5jbHVkZU1hY3JvU3RhY2suYmFjaygpLkN1ckxleGVyS2luZDsKICAgICBJbmNsdWRlTWFjcm9TdGFjay5wb3BfYmFjaygpOwogICB9CkBAIC0xMzAwLDE1ICsxMzc4LDE2IEBACiAgIC8vLyBUaGlzIG1lbW9yeSB3aWxsICBiZSByZXVzZWQgZm9yIGFsbG9jYXRpbmcgbmV3IE1hY3JvSW5mbyBvYmplY3RzLgogICB2b2lkIFJlbGVhc2VNYWNyb0luZm8oTWFjcm9JbmZvKiBNSSk7CiAKLSAgLy8vIFJlYWRNYWNyb05hbWUgLSBMZXggYW5kIHZhbGlkYXRlIGEgbWFjcm8gbmFtZSwgd2hpY2ggb2NjdXJzIGFmdGVyIGEKLSAgLy8vIFwjZGVmaW5lIG9yIFwjdW5kZWYuICBUaGlzIGVtaXRzIGEgZGlhZ25vc3RpYywgc2V0cyB0aGUgdG9rZW4ga2luZCB0byBlb2QsCisgIC8vLyBcYnJpZWYgTGV4IGFuZCB2YWxpZGF0ZSBhIG1hY3JvIG5hbWUsIHdoaWNoIG9jY3VycyBhZnRlciBhCisgIC8vLyBcI2RlZmluZSBvciBcI3VuZGVmLiAKKyAgLy8vCisgIC8vLyBUaGlzIGVtaXRzIGEgZGlhZ25vc3RpYywgc2V0cyB0aGUgdG9rZW4ga2luZCB0byBlb2QsCiAgIC8vLyBhbmQgZGlzY2FyZHMgdGhlIHJlc3Qgb2YgdGhlIG1hY3JvIGxpbmUgaWYgdGhlIG1hY3JvIG5hbWUgaXMgaW52YWxpZC4KICAgdm9pZCBSZWFkTWFjcm9OYW1lKFRva2VuICZNYWNyb05hbWVUb2ssIGNoYXIgaXNEZWZpbmVVbmRlZiA9IDApOwogCi0gIC8vLyBSZWFkTWFjcm9EZWZpbml0aW9uQXJnTGlzdCAtIFRoZSAoIHN0YXJ0aW5nIGFuIGFyZ3VtZW50IGxpc3Qgb2YgYSBtYWNybwotICAvLy8gZGVmaW5pdGlvbiBoYXMganVzdCBiZWVuIHJlYWQuICBMZXggdGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBhbmQgdGhlCi0gIC8vLyBjbG9zaW5nICksIHVwZGF0aW5nIE1JIHdpdGggd2hhdCB3ZSBsZWFybiBhbmQgc2F2aW5nIGluIExhc3RUb2sgdGhlCi0gIC8vLyBsYXN0IHRva2VuIHJlYWQuCisgIC8vLyBUaGUgKCBzdGFydGluZyBhbiBhcmd1bWVudCBsaXN0IG9mIGEgbWFjcm8gZGVmaW5pdGlvbiBoYXMganVzdCBiZWVuIHJlYWQuCisgIC8vLyBMZXggdGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cyBhbmQgdGhlIGNsb3NpbmcgKSwgdXBkYXRpbmcgXHAgTUkgd2l0aAorICAvLy8gd2hhdCB3ZSBsZWFybiBhbmQgc2F2aW5nIGluIFxwIExhc3RUb2sgdGhlIGxhc3QgdG9rZW4gcmVhZC4KICAgLy8vIFJldHVybiB0cnVlIGlmIGFuIGVycm9yIG9jY3VycyBwYXJzaW5nIHRoZSBhcmcgbGlzdC4KICAgYm9vbCBSZWFkTWFjcm9EZWZpbml0aW9uQXJnTGlzdChNYWNyb0luZm8gKk1JLCBUb2tlbiYgTGFzdFRvayk7CiAKQEAgLTEzMjcsMjEgKzE0MDYsMjIgQEAKICAgLy8vIFxicmllZiBBIGZhc3QgUFRIIHZlcnNpb24gb2YgU2tpcEV4Y2x1ZGVkQ29uZGl0aW9uYWxCbG9jay4KICAgdm9pZCBQVEhTa2lwRXhjbHVkZWRDb25kaXRpb25hbEJsb2NrKCk7CiAKLSAgLy8vIEV2YWx1YXRlRGlyZWN0aXZlRXhwcmVzc2lvbiAtIEV2YWx1YXRlIGFuIGludGVnZXIgY29uc3RhbnQgZXhwcmVzc2lvbiB0aGF0Ci0gIC8vLyBtYXkgb2NjdXIgYWZ0ZXIgYSAjaWYgb3IgI2VsaWYgZGlyZWN0aXZlIGFuZCByZXR1cm4gaXQgYXMgYSBib29sLiAgSWYgdGhlCi0gIC8vLyBleHByZXNzaW9uIGlzIGVxdWl2YWxlbnQgdG8gIiFkZWZpbmVkKFgpIiByZXR1cm4gWCBpbiBJZk5EZWZNYWNyby4KKyAgLy8vIFxicmllZiBFdmFsdWF0ZSBhbiBpbnRlZ2VyIGNvbnN0YW50IGV4cHJlc3Npb24gdGhhdCBtYXkgb2NjdXIgYWZ0ZXIgYQorICAvLy8gXCNpZiBvciBcI2VsaWYgZGlyZWN0aXZlIGFuZCByZXR1cm4gaXQgYXMgYSBib29sLgorICAvLy8KKyAgLy8vIElmIHRoZSBleHByZXNzaW9uIGlzIGVxdWl2YWxlbnQgdG8gIiFkZWZpbmVkKFgpIiByZXR1cm4gWCBpbiBJZk5EZWZNYWNyby4KICAgYm9vbCBFdmFsdWF0ZURpcmVjdGl2ZUV4cHJlc3Npb24oSWRlbnRpZmllckluZm8gKiZJZk5EZWZNYWNybyk7CiAKLSAgLy8vIFJlZ2lzdGVyQnVpbHRpblByYWdtYXMgLSBJbnN0YWxsIHRoZSBzdGFuZGFyZCBwcmVwcm9jZXNzb3IgcHJhZ21hczoKKyAgLy8vIFxicmllZiBJbnN0YWxsIHRoZSBzdGFuZGFyZCBwcmVwcm9jZXNzb3IgcHJhZ21hczoKICAgLy8vIFwjcHJhZ21hIEdDQyBwb2lzb24vc3lzdGVtX2hlYWRlci9kZXBlbmRlbmN5IGFuZCBcI3ByYWdtYSBvbmNlLgogICB2b2lkIFJlZ2lzdGVyQnVpbHRpblByYWdtYXMoKTsKIAogICAvLy8gXGJyaWVmIFJlZ2lzdGVyIGJ1aWx0aW4gbWFjcm9zIHN1Y2ggYXMgX19MSU5FX18gd2l0aCB0aGUgaWRlbnRpZmllciB0YWJsZS4KICAgdm9pZCBSZWdpc3RlckJ1aWx0aW5NYWNyb3MoKTsKIAotICAvLy8gSGFuZGxlTWFjcm9FeHBhbmRlZElkZW50aWZpZXIgLSBJZiBhbiBpZGVudGlmaWVyIHRva2VuIGlzIHJlYWQgdGhhdCBpcyB0bwotICAvLy8gYmUgZXhwYW5kZWQgYXMgYSBtYWNybywgaGFuZGxlIGl0IGFuZCByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgJ1RvaycuICBJZgotICAvLy8gd2UgbGV4ZWQgYSB0b2tlbiwgcmV0dXJuIHRydWU7IG90aGVyd2lzZSB0aGUgY2FsbGVyIHNob3VsZCBsZXggYWdhaW4uCisgIC8vLyBJZiBhbiBpZGVudGlmaWVyIHRva2VuIGlzIHJlYWQgdGhhdCBpcyB0byBiZSBleHBhbmRlZCBhcyBhIG1hY3JvLCBoYW5kbGUKKyAgLy8vIGl0IGFuZCByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgJ1RvaycuICBJZiB3ZSBsZXhlZCBhIHRva2VuLCByZXR1cm4gdHJ1ZTsKKyAgLy8vIG90aGVyd2lzZSB0aGUgY2FsbGVyIHNob3VsZCBsZXggYWdhaW4uCiAgIGJvb2wgSGFuZGxlTWFjcm9FeHBhbmRlZElkZW50aWZpZXIoVG9rZW4gJlRvaywgTWFjcm9EaXJlY3RpdmUgKk1EKTsKIAogICAvLy8gXGJyaWVmIENhY2hlIG1hY3JvIGV4cGFuZGVkIHRva2VucyBmb3IgVG9rZW5MZXhlcnMuCkBAIC0xMzU0LDUyICsxNDM0LDUxIEBACiAgIHZvaWQgcmVtb3ZlQ2FjaGVkTWFjcm9FeHBhbmRlZFRva2Vuc09mTGFzdExleGVyKCk7CiAgIGZyaWVuZCB2b2lkIFRva2VuTGV4ZXI6OkV4cGFuZEZ1bmN0aW9uQXJndW1lbnRzKCk7CiAKLSAgLy8vIGlzTmV4dFBQVG9rZW5MUGFyZW4gLSBEZXRlcm1pbmUgd2hldGhlciB0aGUgbmV4dCBwcmVwcm9jZXNzb3IgdG9rZW4gdG8gYmUKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBuZXh0IHByZXByb2Nlc3NvciB0b2tlbiB0byBiZQogICAvLy8gbGV4ZWQgaXMgYSAnKCcuICBJZiBzbywgY29uc3VtZSB0aGUgdG9rZW4gYW5kIHJldHVybiB0cnVlLCBpZiBub3QsIHRoaXMKICAgLy8vIG1ldGhvZCBzaG91bGQgaGF2ZSBubyBvYnNlcnZhYmxlIHNpZGUtZWZmZWN0IG9uIHRoZSBsZXhlZCB0b2tlbnMuCiAgIGJvb2wgaXNOZXh0UFBUb2tlbkxQYXJlbigpOwogCi0gIC8vLyBSZWFkRnVuY3Rpb25MaWtlTWFjcm9BcmdzIC0gQWZ0ZXIgcmVhZGluZyAiTUFDUk8oIiwgdGhpcyBtZXRob2QgaXMKLSAgLy8vIGludm9rZWQgdG8gcmVhZCBhbGwgb2YgdGhlIGZvcm1hbCBhcmd1bWVudHMgc3BlY2lmaWVkIGZvciB0aGUgbWFjcm8KLSAgLy8vIGludm9jYXRpb24uICBUaGlzIHJldHVybnMgbnVsbCBvbiBlcnJvci4KKyAgLy8vIEFmdGVyIHJlYWRpbmcgIk1BQ1JPKCIsIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgdG8gcmVhZCBhbGwgb2YgdGhlIGZvcm1hbAorICAvLy8gYXJndW1lbnRzIHNwZWNpZmllZCBmb3IgdGhlIG1hY3JvIGludm9jYXRpb24uICBSZXR1cm5zIG51bGwgb24gZXJyb3IuCiAgIE1hY3JvQXJncyAqUmVhZEZ1bmN0aW9uTGlrZU1hY3JvQXJncyhUb2tlbiAmTWFjcm9OYW1lLCBNYWNyb0luZm8gKk1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkV4cGFuc2lvbkVuZCk7CiAKLSAgLy8vIEV4cGFuZEJ1aWx0aW5NYWNybyAtIElmIGFuIGlkZW50aWZpZXIgdG9rZW4gaXMgcmVhZCB0aGF0IGlzIHRvIGJlIGV4cGFuZGVkCisgIC8vLyBcYnJpZWYgSWYgYW4gaWRlbnRpZmllciB0b2tlbiBpcyByZWFkIHRoYXQgaXMgdG8gYmUgZXhwYW5kZWQKICAgLy8vIGFzIGEgYnVpbHRpbiBtYWNybywgaGFuZGxlIGl0IGFuZCByZXR1cm4gdGhlIG5leHQgdG9rZW4gYXMgJ1RvaycuCiAgIHZvaWQgRXhwYW5kQnVpbHRpbk1hY3JvKFRva2VuICZUb2spOwogCi0gIC8vLyBIYW5kbGVfUHJhZ21hIC0gUmVhZCBhIF9QcmFnbWEgZGlyZWN0aXZlLCBzbGljZSBpdCB1cCwgcHJvY2VzcyBpdCwgdGhlbgotICAvLy8gcmV0dXJuIHRoZSBmaXJzdCB0b2tlbiBhZnRlciB0aGUgZGlyZWN0aXZlLiAgVGhlIF9QcmFnbWEgdG9rZW4gaGFzIGp1c3QKLSAgLy8vIGJlZW4gcmVhZCBpbnRvICdUb2snLgorICAvLy8gXGJyaWVmIFJlYWQgYSBcYyBfUHJhZ21hIGRpcmVjdGl2ZSwgc2xpY2UgaXQgdXAsIHByb2Nlc3MgaXQsIHRoZW4KKyAgLy8vIHJldHVybiB0aGUgZmlyc3QgdG9rZW4gYWZ0ZXIgdGhlIGRpcmVjdGl2ZS4KKyAgLy8vIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBcYyBfUHJhZ21hIHRva2VuIGhhcyBqdXN0IGJlZW4gcmVhZCBpbnRvIFxwIFRvay4KICAgdm9pZCBIYW5kbGVfUHJhZ21hKFRva2VuICZUb2spOwogCi0gIC8vLyBIYW5kbGVNaWNyb3NvZnRfX3ByYWdtYSAtIExpa2UgSGFuZGxlX1ByYWdtYSBleGNlcHQgdGhlIHByYWdtYSB0ZXh0Ci0gIC8vLyBpcyBub3QgZW5jbG9zZWQgd2l0aGluIGEgc3RyaW5nIGxpdGVyYWwuCisgIC8vLyBcYnJpZWYgTGlrZSBIYW5kbGVfUHJhZ21hIGV4Y2VwdCB0aGUgcHJhZ21hIHRleHQgaXMgbm90IGVuY2xvc2VkIHdpdGhpbgorICAvLy8gYSBzdHJpbmcgbGl0ZXJhbC4KICAgdm9pZCBIYW5kbGVNaWNyb3NvZnRfX3ByYWdtYShUb2tlbiAmVG9rKTsKIAotICAvLy8gRW50ZXJTb3VyY2VGaWxlV2l0aExleGVyIC0gQWRkIGEgbGV4ZXIgdG8gdGhlIHRvcCBvZiB0aGUgaW5jbHVkZSBzdGFjayBhbmQKKyAgLy8vIFxicmllZiBBZGQgYSBsZXhlciB0byB0aGUgdG9wIG9mIHRoZSBpbmNsdWRlIHN0YWNrIGFuZAogICAvLy8gc3RhcnQgbGV4aW5nIHRva2VucyBmcm9tIGl0IGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLgogICB2b2lkIEVudGVyU291cmNlRmlsZVdpdGhMZXhlcihMZXhlciAqVGhlTGV4ZXIsIGNvbnN0IERpcmVjdG9yeUxvb2t1cCAqRGlyKTsKIAotICAvLy8gRW50ZXJTb3VyY2VGaWxlV2l0aFBUSCAtIEFkZCBhIGxleGVyIHRvIHRoZSB0b3Agb2YgdGhlIGluY2x1ZGUgc3RhY2sgYW5kCisgIC8vLyBcYnJpZWYgQWRkIGEgbGV4ZXIgdG8gdGhlIHRvcCBvZiB0aGUgaW5jbHVkZSBzdGFjayBhbmQKICAgLy8vIHN0YXJ0IGdldHRpbmcgdG9rZW5zIGZyb20gaXQgdXNpbmcgdGhlIFBUSCBjYWNoZS4KICAgdm9pZCBFbnRlclNvdXJjZUZpbGVXaXRoUFRIKFBUSExleGVyICpQTCwgY29uc3QgRGlyZWN0b3J5TG9va3VwICpEaXIpOwogCi0gIC8vLyBcYnJpZWYgU2V0IHRoZSBmaWxlIElEIGZvciB0aGUgcHJlcHJvY2Vzc29yIHByZWRlZmluZXMuCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBGaWxlSUQgZm9yIHRoZSBwcmVwcm9jZXNzb3IgcHJlZGVmaW5lcy4KICAgdm9pZCBzZXRQcmVkZWZpbmVzRmlsZUlEKEZpbGVJRCBGSUQpIHsKICAgICBhc3NlcnQoUHJlZGVmaW5lc0ZpbGVJRC5pc0ludmFsaWQoKSAmJiAiUHJlZGVmaW5lc0ZpbGVJRCBhbHJlYWR5IHNldCEiKTsKICAgICBQcmVkZWZpbmVzRmlsZUlEID0gRklEOwogICB9CiAKLSAgLy8vIElzRmlsZUxleGVyIC0gUmV0dXJucyB0cnVlIGlmIHdlIGFyZSBsZXhpbmcgZnJvbSBhIGZpbGUgYW5kIG5vdCBhCi0gIC8vLyAgcHJhZ21hIG9yIGEgbWFjcm8uCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHdlIGFyZSBsZXhpbmcgZnJvbSBhIGZpbGUgYW5kIG5vdCBhCisgIC8vLyBwcmFnbWEgb3IgYSBtYWNyby4KICAgc3RhdGljIGJvb2wgSXNGaWxlTGV4ZXIoY29uc3QgTGV4ZXIqIEwsIGNvbnN0IFByZXByb2Nlc3NvckxleGVyKiBQKSB7CiAgICAgcmV0dXJuIEwgPyAhTC0+aXNQcmFnbWFMZXhlcigpIDogUCAhPSAwOwogICB9CiAKICAgc3RhdGljIGJvb2wgSXNGaWxlTGV4ZXIoY29uc3QgSW5jbHVkZVN0YWNrSW5mbyYgSSkgewotICAgIHJldHVybiBJc0ZpbGVMZXhlcihJLlRoZUxleGVyLCBJLlRoZVBQTGV4ZXIpOworICAgIHJldHVybiBJc0ZpbGVMZXhlcihJLlRoZUxleGVyLmdldCgpLCBJLlRoZVBQTGV4ZXIpOwogICB9CiAKICAgYm9vbCBJc0ZpbGVMZXhlcigpIGNvbnN0IHsKQEAgLTE0NDksMjUgKzE1MjgsNiBAQAogICAvLy8gcG9pbnRzIHRvLgogICBNb2R1bGUgKmdldE1vZHVsZUZvckxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uIEZpbGVuYW1lTG9jKTsKIAotICAvLy8gXGJyaWVmIFZlcmlmeSB0aGF0IGEgcHJpdmF0ZSBoZWFkZXIgaXMgaW5jbHVkZWQgb25seSBmcm9tIHdpdGhpbiBpdHMKLSAgLy8vIG1vZHVsZS4KLSAgYm9vbCB2aW9sYXRlc1ByaXZhdGVJbmNsdWRlKE1vZHVsZSAqUmVxdWVzdGluZ01vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqSW5jRmlsZUVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZU1hcDo6TW9kdWxlSGVhZGVyUm9sZSBSb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICpSZXF1ZXN0ZWRNb2R1bGUpOwotCi0gIC8vLyBcYnJpZWYgVmVyaWZ5IHRoYXQgYSBtb2R1bGUgaW5jbHVkZXMgaGVhZGVycyBvbmx5IGZyb20gbW9kdWxlcyB0aGF0IGl0Ci0gIC8vLyBoYXMgZGVjbGFyZWQgdGhhdCBpdCB1c2VzLgotICBib29sIHZpb2xhdGVzVXNlRGVjbGFyYXRpb25zKE1vZHVsZSAqUmVxdWVzdGluZ01vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKlJlcXVlc3RlZE1vZHVsZSk7Ci0KLSAgLy8vIFxicmllZiBWZXJpZnkgdGhhdCBpdCBpcyBsZWdhbCBmb3IgdGhlIHNvdXJjZSBmaWxlIHRoYXQgXHAgRmlsZW5hbWVMb2MKLSAgLy8vIHBvaW50cyB0byB0byBpbmNsdWRlIHRoZSBmaWxlIFxwIEZpbGVuYW1lLgotICAvLy8KLSAgLy8vIFRyaWVzIHRvIHJldXNlIFxwIEluY0ZpbGVFbnQuCi0gIHZvaWQgdmVyaWZ5TW9kdWxlSW5jbHVkZShTb3VyY2VMb2NhdGlvbiBGaWxlbmFtZUxvYywgU3RyaW5nUmVmIEZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZUVudHJ5ICpJbmNGaWxlRW50KTsKLQogICAvLyBNYWNybyBoYW5kbGluZy4KICAgdm9pZCBIYW5kbGVEZWZpbmVEaXJlY3RpdmUoVG9rZW4gJlRvaywgYm9vbCBJbW1lZGlhdGVseUFmdGVyVG9wTGV2ZWxJZm5kZWYpOwogICB2b2lkIEhhbmRsZVVuZGVmRGlyZWN0aXZlKFRva2VuICZUb2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9MZXgvVG9rZW4uaCBiL2luY2x1ZGUvY2xhbmcvTGV4L1Rva2VuLmgKaW5kZXggNGY2MzkxZC4uNTgwYmIxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9MZXgvVG9rZW4uaAorKysgYi9pbmNsdWRlL2NsYW5nL0xleC9Ub2tlbi5oCkBAIC02Miw4ICs2Miw3IEBACiAgIHZvaWQgKlB0ckRhdGE7CiAKICAgLy8vIEtpbmQgLSBUaGUgYWN0dWFsIGZsYXZvciBvZiB0b2tlbiB0aGlzIGlzLgotICAvLy8KLSAgdW5zaWduZWQgc2hvcnQgS2luZDsKKyAgdG9rOjpUb2tlbktpbmQgS2luZDsKIAogICAvLy8gRmxhZ3MgLSBCaXRzIHdlIHRyYWNrIGFib3V0IHRoaXMgdG9rZW4sIG1lbWJlcnMgb2YgdGhlIFRva2VuRmxhZ3MgZW51bS4KICAgdW5zaWduZWQgY2hhciBGbGFnczsKQEAgLTgzLDEzICs4MiwxMyBAQAogICAgIElnbm9yZWRDb21tYSA9IDB4ODAgICAgLy8gVGhpcyBjb21tYSBpcyBub3QgYSBtYWNybyBhcmd1bWVudCBzZXBhcmF0b3IgKE1TKS4KICAgfTsKIAotICB0b2s6OlRva2VuS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gKHRvazo6VG9rZW5LaW5kKUtpbmQ7IH0KKyAgdG9rOjpUb2tlbktpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KICAgdm9pZCBzZXRLaW5kKHRvazo6VG9rZW5LaW5kIEspIHsgS2luZCA9IEs7IH0KIAogICAvLy8gaXMvaXNOb3QgLSBQcmVkaWNhdGVzIHRvIGNoZWNrIGlmIHRoaXMgdG9rZW4gaXMgYSBzcGVjaWZpYyBraW5kLCBhcyBpbgogICAvLy8gImlmIChUb2suaXModG9rOjpsX2JyYWNlKSkgey4uLn0iLgotICBib29sIGlzKHRvazo6VG9rZW5LaW5kIEspIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gKHVuc2lnbmVkKSBLOyB9Ci0gIGJvb2wgaXNOb3QodG9rOjpUb2tlbktpbmQgSykgY29uc3QgeyByZXR1cm4gS2luZCAhPSAodW5zaWduZWQpIEs7IH0KKyAgYm9vbCBpcyh0b2s6OlRva2VuS2luZCBLKSBjb25zdCB7IHJldHVybiBLaW5kID09IEs7IH0KKyAgYm9vbCBpc05vdCh0b2s6OlRva2VuS2luZCBLKSBjb25zdCB7IHJldHVybiBLaW5kICE9IEs7IH0KIAogICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSByYXcgaWRlbnRpZmllciAod2hlbiBsZXhpbmcKICAgLy8vIGluIHJhdyBtb2RlKSBvciBhIG5vbi1rZXl3b3JkIGlkZW50aWZpZXIgKHdoZW4gbGV4aW5nIGluIG5vbi1yYXcgbW9kZSkuCkBAIC0xNDUsOSArMTQ0LDcgQEAKICAgICBzZXRBbm5vdGF0aW9uRW5kTG9jKFIuZ2V0RW5kKCkpOwogICB9CiAKLSAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdG9rOjpnZXRUb2tlbk5hbWUoICh0b2s6OlRva2VuS2luZCkgS2luZCk7Ci0gIH0KKyAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIHRvazo6Z2V0VG9rZW5OYW1lKEtpbmQpOyB9CiAKICAgLy8vIFxicmllZiBSZXNldCBhbGwgZmxhZ3MgdG8gY2xlYXJlZC4KICAgdm9pZCBzdGFydFRva2VuKCkgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9MZXgvVG9rZW5MZXhlci5oIGIvaW5jbHVkZS9jbGFuZy9MZXgvVG9rZW5MZXhlci5oCmluZGV4IDdjOGNmZDAuLjY1OTY0M2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvTGV4L1Rva2VuTGV4ZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL0xleC9Ub2tlbkxleGVyLmgKQEAgLTgxLDYgKzgxLDE0IEBACiAgIGJvb2wgQXRTdGFydE9mTGluZSA6IDE7CiAgIGJvb2wgSGFzTGVhZGluZ1NwYWNlIDogMTsKIAorICAvLyBOZXh0VG9rR2V0c1NwYWNlIC0gV2hlbiB0aGlzIGlzIHRydWUsIHRoZSBuZXh0IHRva2VuIGFwcGVuZGVkIHRvIHRoZQorICAvLyBvdXRwdXQgbGlzdCBkdXJpbmcgZnVuY3Rpb24gYXJndW1lbnQgZXhwYW5zaW9uIHdpbGwgZ2V0IGEgbGVhZGluZyBzcGFjZSwKKyAgLy8gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGhhZCBvbmUgdG8gYmVnaW4gd2l0aCBvciBub3QuIFRoaXMgaXMgdXNlZCBmb3IKKyAgLy8gcGxhY2VtYXJrZXIgc3VwcG9ydC4gSWYgc3RpbGwgdHJ1ZSBhZnRlciBmdW5jdGlvbiBhcmd1bWVudCBleHBhbnNpb24sIHRoZQorICAvLyBsZWFkaW5nIHNwYWNlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZmlyc3QgdG9rZW4gZm9sbG93aW5nIHRoZSBtYWNybworICAvLyBleHBhbnNpb24uCisgIGJvb2wgTmV4dFRva0dldHNTcGFjZSA6IDE7CisKICAgLy8vIE93bnNUb2tlbnMgLSBUaGlzIGlzIHRydWUgaWYgdGhpcyBUb2tlbkxleGVyIGFsbG9jYXRlZCB0aGUgVG9rZW5zCiAgIC8vLyBhcnJheSwgYW5kIHRodXMgbmVlZHMgdG8gZnJlZSBpdCB3aGVuIGRlc3Ryb3llZC4gIEZvciBzaW1wbGUgb2JqZWN0LWxpa2UKICAgLy8vIG1hY3JvcyAoZm9yIGV4YW1wbGUpIHdlIGp1c3QgcG9pbnQgaW50byB0aGUgdG9rZW4gYnVmZmVyIG9mIHRoZSBtYWNybwpAQCAtMTgyLDYgKzE5MCwxMyBAQAogICB2b2lkIHVwZGF0ZUxvY0Zvck1hY3JvQXJnVG9rZW5zKFNvdXJjZUxvY2F0aW9uIEFyZ0lkU3BlbGxMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gKmJlZ2luX3Rva2VucywgVG9rZW4gKmVuZF90b2tlbnMpOwogCisgIC8vLyBSZW1vdmUgY29tbWEgYWhlYWQgb2YgX19WQV9BUkdTX18sIGlmIHByZXNlbnQsIGFjY29yZGluZyB0byBjb21waWxlcgorICAvLy8gZGlhbGVjdCBzZXR0aW5ncy4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tbWEgaXMgcmVtb3ZlZC4KKyAgYm9vbCBNYXliZVJlbW92ZUNvbW1hQmVmb3JlVmFBcmdzKFNtYWxsVmVjdG9ySW1wbDxUb2tlbj4gJlJlc3VsdFRva3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1Bhc3RlT3BlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0luZm8gKk1hY3JvLCB1bnNpZ25lZCBNYWNyb0FyZ05vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yICZQUCk7CisKICAgdm9pZCBQcm9wYWdhdGVMaW5lU3RhcnRMZWFkaW5nU3BhY2VJbmZvKFRva2VuICZSZXN1bHQpOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9NYWtlZmlsZSBiL2luY2x1ZGUvY2xhbmcvTWFrZWZpbGUKaW5kZXggNWYyMDc3ZC4uNWJhMmRkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9NYWtlZmlsZQorKysgYi9pbmNsdWRlL2NsYW5nL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogQ0xBTkdfTEVWRUwgOj0gLi4vLi4KLURJUlMgOj0gQVNUIEJhc2ljIERyaXZlciBMZXggUGFyc2UgU2VtYSBTZXJpYWxpemF0aW9uCitESVJTIDo9IEFTVCBCYXNpYyBEcml2ZXIgUGFyc2UgU2VtYSBTZXJpYWxpemF0aW9uCiAKIGluY2x1ZGUgJChDTEFOR19MRVZFTCkvTWFrZWZpbGUKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9QYXJzZS9DTWFrZUxpc3RzLnR4dCBiL2luY2x1ZGUvY2xhbmcvUGFyc2UvQ01ha2VMaXN0cy50eHQKaW5kZXggZWQ4MGMxOC4uZWM3NWY3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9QYXJzZS9DTWFrZUxpc3RzLnR4dAorKysgYi9pbmNsdWRlL2NsYW5nL1BhcnNlL0NNYWtlTGlzdHMudHh0CkBAIC0xLDE0ICsxLDQgQEAKLWNsYW5nX3RhYmxlZ2VuKEF0dHJJZGVudGlmaWVyQXJnLmluYyAtZ2VuLWNsYW5nLWF0dHItaWRlbnRpZmllci1hcmctbGlzdAorY2xhbmdfdGFibGVnZW4oQXR0clBhcnNlclN0cmluZ1N3aXRjaGVzLmluYyAtZ2VuLWNsYW5nLWF0dHItcGFyc2VyLXN0cmluZy1zd2l0Y2hlcwogICAtSSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vCiAgIFNPVVJDRSAuLi9CYXNpYy9BdHRyLnRkCi0gIFRBUkdFVCBDbGFuZ0F0dHJJZGVudGlmaWVyQXJnKQotCi1jbGFuZ190YWJsZWdlbihBdHRyVHlwZUFyZy5pbmMgLWdlbi1jbGFuZy1hdHRyLXR5cGUtYXJnLWxpc3QKLSAgLUkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uLwotICBTT1VSQ0UgLi4vQmFzaWMvQXR0ci50ZAotICBUQVJHRVQgQ2xhbmdBdHRyVHlwZUFyZykKLQotY2xhbmdfdGFibGVnZW4oQXR0ckxhdGVQYXJzZWQuaW5jIC1nZW4tY2xhbmctYXR0ci1sYXRlLXBhcnNlZC1saXN0Ci0gIC1JICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8KLSAgU09VUkNFIC4uL0Jhc2ljL0F0dHIudGQKLSAgVEFSR0VUIENsYW5nQXR0ckxhdGVQYXJzZWQpCisgIFRBUkdFVCBDbGFuZ0F0dHJQYXJzZXJTdHJpbmdTd2l0Y2hlcykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvUGFyc2UvTWFrZWZpbGUgYi9pbmNsdWRlL2NsYW5nL1BhcnNlL01ha2VmaWxlCmluZGV4IDAwZDQxZmEuLmM0NzcwMTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvUGFyc2UvTWFrZWZpbGUKKysrIGIvaW5jbHVkZS9jbGFuZy9QYXJzZS9NYWtlZmlsZQpAQCAtMSwyNSArMSwxMyBAQAogQ0xBTkdfTEVWRUwgOj0gLi4vLi4vLi4KIFREX1NSQ19ESVIgPSAkKFBST0pfU1JDX0RJUikvLi4vQmFzaWMKLUJVSUxUX1NPVVJDRVMgPSBBdHRySWRlbnRpZmllckFyZy5pbmMgQXR0ckxhdGVQYXJzZWQuaW5jIEF0dHJUeXBlQXJnLmluYworQlVJTFRfU09VUkNFUyA9IEF0dHJQYXJzZXJTdHJpbmdTd2l0Y2hlcy5pbmMKIAogVEFCTEVHRU5fSU5DX0ZJTEVTX0NPTU1PTiA9IDEKIAogaW5jbHVkZSAkKENMQU5HX0xFVkVMKS9NYWtlZmlsZQogCi0kKE9iakRpcikvQXR0cklkZW50aWZpZXJBcmcuaW5jLnRtcCA6ICQoVERfU1JDX0RJUikvQXR0ci50ZCAkKENMQU5HX1RCTEdFTikgXAorJChPYmpEaXIpL0F0dHJQYXJzZXJTdHJpbmdTd2l0Y2hlcy5pbmMudG1wIDogJChURF9TUkNfRElSKS9BdHRyLnRkICQoQ0xBTkdfVEJMR0VOKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoT2JqRGlyKS8uZGlyCi0JJChFY2hvKSAiQnVpbGRpbmcgQ2xhbmcgYXR0cmlidXRlIGlkZW50aWZpZXIgYXJndW1lbnQgdGFibGUgd2l0aCB0YmxnZW4iCi0JJChWZXJiKSAkKENsYW5nVGFibGVHZW4pIC1nZW4tY2xhbmctYXR0ci1pZGVudGlmaWVyLWFyZy1saXN0IC1vICQoY2FsbCBTWVNQQVRILCAkQCkgXAotCQktSSAkKFBST0pfU1JDX0RJUikvLi4vLi4vICQ8Ci0KLSQoT2JqRGlyKS9BdHRyVHlwZUFyZy5pbmMudG1wIDogJChURF9TUkNfRElSKS9BdHRyLnRkICQoQ0xBTkdfVEJMR0VOKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoT2JqRGlyKS8uZGlyCi0JJChFY2hvKSAiQnVpbGRpbmcgQ2xhbmcgYXR0cmlidXRlIHR5cGUgYXJndW1lbnQgdGFibGUgd2l0aCB0YmxnZW4iCi0JJChWZXJiKSAkKENsYW5nVGFibGVHZW4pIC1nZW4tY2xhbmctYXR0ci10eXBlLWFyZy1saXN0IC1vICQoY2FsbCBTWVNQQVRILCAkQCkgXAotCQktSSAkKFBST0pfU1JDX0RJUikvLi4vLi4vICQ8Ci0KLSQoT2JqRGlyKS9BdHRyTGF0ZVBhcnNlZC5pbmMudG1wIDogJChURF9TUkNfRElSKS9BdHRyLnRkICQoQ0xBTkdfVEJMR0VOKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoT2JqRGlyKS8uZGlyCi0JJChFY2hvKSAiQnVpbGRpbmcgQ2xhbmcgYXR0cmlidXRlIGxhdGUtcGFyc2VkIHRhYmxlIHdpdGggdGJsZ2VuIgotCSQoVmVyYikgJChDbGFuZ1RhYmxlR2VuKSAtZ2VuLWNsYW5nLWF0dHItbGF0ZS1wYXJzZWQtbGlzdCAtbyAkKGNhbGwgU1lTUEFUSCwgJEApIFwKKwkkKEVjaG8pICJCdWlsZGluZyBDbGFuZyBwYXJzZXItcmVsYXRlZCBhdHRyaWJ1dGUgc3RyaW5nIHN3aXRjaGVzIgorCSQoVmVyYikgJChDbGFuZ1RhYmxlR2VuKSAtZ2VuLWNsYW5nLWF0dHItcGFyc2VyLXN0cmluZy1zd2l0Y2hlcyAtbyAkKGNhbGwgU1lTUEFUSCwgJEApIFwKIAkJLUkgJChQUk9KX1NSQ19ESVIpLy4uLy4uLyAkPApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9QYXJzZS9QYXJzZXIuaCBiL2luY2x1ZGUvY2xhbmcvUGFyc2UvUGFyc2VyLmgKaW5kZXggYmQ0OTk4OC4uNDRmN2NiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9QYXJzZS9QYXJzZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL1BhcnNlL1BhcnNlci5oCkBAIC0yMSwxMSArMjEsMTEgQEAKICNpbmNsdWRlICJjbGFuZy9MZXgvUHJlcHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9EZWNsU3BlYy5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2VtYS5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1ByZXR0eVN0YWNrVHJhY2UuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU2F2ZUFuZFJlc3RvcmUuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RhY2s+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CkBAIC00MCw3ICs0MCw2IEBACiAgIGNsYXNzIFBhcnNpbmdEZWNsU3BlYzsKICAgY2xhc3MgUGFyc2luZ0RlY2xhcmF0b3I7CiAgIGNsYXNzIFBhcnNpbmdGaWVsZERlY2xhcmF0b3I7Ci0gIGNsYXNzIFByYWdtYVVudXNlZEhhbmRsZXI7CiAgIGNsYXNzIENvbG9uUHJvdGVjdGlvblJBSUlPYmplY3Q7CiAgIGNsYXNzIEluTWVzc2FnZUV4cHJlc3Npb25SQUlJT2JqZWN0OwogICBjbGFzcyBQb2lzb25TRUhJZGVudGlmaWVyc1JBSUlPYmplY3Q7CkBAIC01Miw3ICs1MSw2IEBACiAvLy8gYmVlbiByZWFkLgogLy8vCiBjbGFzcyBQYXJzZXIgOiBwdWJsaWMgQ29kZUNvbXBsZXRpb25IYW5kbGVyIHsKLSAgZnJpZW5kIGNsYXNzIFByYWdtYVVudXNlZEhhbmRsZXI7CiAgIGZyaWVuZCBjbGFzcyBDb2xvblByb3RlY3Rpb25SQUlJT2JqZWN0OwogICBmcmllbmQgY2xhc3MgSW5NZXNzYWdlRXhwcmVzc2lvblJBSUlPYmplY3Q7CiAgIGZyaWVuZCBjbGFzcyBQb2lzb25TRUhJZGVudGlmaWVyc1JBSUlPYmplY3Q7CkBAIC03Myw3ICs3MSw3IEBACiAgIFNvdXJjZUxvY2F0aW9uIFByZXZUb2tMb2NhdGlvbjsKIAogICB1bnNpZ25lZCBzaG9ydCBQYXJlbkNvdW50LCBCcmFja2V0Q291bnQsIEJyYWNlQ291bnQ7Ci0gIAorCiAgIC8vLyBBY3Rpb25zIC0gVGhlc2UgYXJlIHRoZSBjYWxsYmFja3Mgd2UgaW52b2tlIGFzIHdlIHBhcnNlIHZhcmlvdXMgY29uc3RydWN0cwogICAvLy8gaW4gdGhlIGZpbGUuCiAgIFNlbWEgJkFjdGlvbnM7CkBAIC0xMzYsMjQgKzEzNCwyOCBAQAogICBtdXRhYmxlIElkZW50aWZpZXJJbmZvICpJZGVudF9maW5hbDsKICAgbXV0YWJsZSBJZGVudGlmaWVySW5mbyAqSWRlbnRfb3ZlcnJpZGU7CiAKLSAgLy8gQysrIHR5cGUgdHJhaXQga2V5d29yZHMgdGhhdCBoYXZlIGNhbiBiZSByZXZlcnRlZCB0byBpZGVudGlmaWVycyBhbmQKLSAgLy8gc3RpbGwgdXNlZCBhcyB0eXBlIHRyYWl0cy4KLSAgbGx2bTo6U21hbGxEZW5zZU1hcDxJZGVudGlmaWVySW5mbyAqLCB0b2s6OlRva2VuS2luZD4gUmV2ZXJ0YWJsZVR5cGVUcmFpdHM7CisgIC8vIFNvbWUgdG9rZW4ga2luZHMgc3VjaCBhcyBDKysgdHlwZSB0cmFpdHMgY2FuIGJlIHJldmVydGVkIHRvIGlkZW50aWZpZXJzIGFuZAorICAvLyBzdGlsbCBnZXQgdXNlZCBhcyBrZXl3b3JkcyBkZXBlbmRpbmcgb24gY29udGV4dC4KKyAgbGx2bTo6U21hbGxEZW5zZU1hcDxjb25zdCBJZGVudGlmaWVySW5mbyAqLCB0b2s6OlRva2VuS2luZD4KKyAgQ29udGV4dHVhbEtleXdvcmRzOwogCi0gIE93bmluZ1B0cjxQcmFnbWFIYW5kbGVyPiBBbGlnbkhhbmRsZXI7Ci0gIE93bmluZ1B0cjxQcmFnbWFIYW5kbGVyPiBHQ0NWaXNpYmlsaXR5SGFuZGxlcjsKLSAgT3duaW5nUHRyPFByYWdtYUhhbmRsZXI+IE9wdGlvbnNIYW5kbGVyOwotICBPd25pbmdQdHI8UHJhZ21hSGFuZGxlcj4gUGFja0hhbmRsZXI7Ci0gIE93bmluZ1B0cjxQcmFnbWFIYW5kbGVyPiBNU1N0cnVjdEhhbmRsZXI7Ci0gIE93bmluZ1B0cjxQcmFnbWFIYW5kbGVyPiBVbnVzZWRIYW5kbGVyOwotICBPd25pbmdQdHI8UHJhZ21hSGFuZGxlcj4gV2Vha0hhbmRsZXI7Ci0gIE93bmluZ1B0cjxQcmFnbWFIYW5kbGVyPiBSZWRlZmluZUV4dG5hbWVIYW5kbGVyOwotICBPd25pbmdQdHI8UHJhZ21hSGFuZGxlcj4gRlBDb250cmFjdEhhbmRsZXI7Ci0gIE93bmluZ1B0cjxQcmFnbWFIYW5kbGVyPiBPcGVuQ0xFeHRlbnNpb25IYW5kbGVyOwotICBPd25pbmdQdHI8Q29tbWVudEhhbmRsZXI+IENvbW1lbnRTZW1hSGFuZGxlcjsKLSAgT3duaW5nUHRyPFByYWdtYUhhbmRsZXI+IE9wZW5NUEhhbmRsZXI7Ci0gIE93bmluZ1B0cjxQcmFnbWFIYW5kbGVyPiBNU0NvbW1lbnRIYW5kbGVyOwotICBPd25pbmdQdHI8UHJhZ21hSGFuZGxlcj4gTVNEZXRlY3RNaXNtYXRjaEhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBBbGlnbkhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBHQ0NWaXNpYmlsaXR5SGFuZGxlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IE9wdGlvbnNIYW5kbGVyOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gUGFja0hhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBNU1N0cnVjdEhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBVbnVzZWRIYW5kbGVyOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gV2Vha0hhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBSZWRlZmluZUV4dG5hbWVIYW5kbGVyOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gRlBDb250cmFjdEhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBPcGVuQ0xFeHRlbnNpb25IYW5kbGVyOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJhZ21hSGFuZGxlcj4gT3Blbk1QSGFuZGxlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IE1TQ29tbWVudEhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBNU0RldGVjdE1pc21hdGNoSGFuZGxlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFByYWdtYUhhbmRsZXI+IE1TUG9pbnRlcnNUb01lbWJlcnM7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcmFnbWFIYW5kbGVyPiBNU1Z0b3JEaXNwOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDb21tZW50SGFuZGxlcj4gQ29tbWVudFNlbWFIYW5kbGVyOwogCiAgIC8vLyBXaGV0aGVyIHRoZSAnPicgdG9rZW4gYWN0cyBhcyBhbiBvcGVyYXRvciBvciBub3QuIFRoaXMgd2lsbCBiZQogICAvLy8gdHJ1ZSBleGNlcHQgd2hlbiB3ZSBhcmUgcGFyc2luZyBhbiBleHByZXNzaW9uIHdpdGhpbiBhIEMrKwpAQCAtMTY3LDcgKzE2OSw3IEBACiAgIC8vLyBDb2xvblByb3RlY3Rpb25SQUlJT2JqZWN0IFJBSUkgb2JqZWN0LgogICBib29sIENvbG9uSXNTYWNyZWQ7CiAKLSAgLy8vIFxicmllZiBXaGVuIHRydWUsIHdlIGFyZSBkaXJlY3RseSBpbnNpZGUgYW4gT2JqZWN0aXZlLUMgbWVzc3NhZ2UKKyAgLy8vIFxicmllZiBXaGVuIHRydWUsIHdlIGFyZSBkaXJlY3RseSBpbnNpZGUgYW4gT2JqZWN0aXZlLUMgbWVzc2FnZQogICAvLy8gc2VuZCBleHByZXNzaW9uLgogICAvLy8KICAgLy8vIFRoaXMgaXMgbWFuYWdlZCBieSB0aGUgXGMgSW5NZXNzYWdlRXhwcmVzc2lvblJBSUlPYmplY3QgY2xhc3MsIGFuZApAQCAtMTkzLDYgKzE5NSwxMCBAQAogICAgICAgKytEZXB0aDsKICAgICAgICsrQWRkZWRMZXZlbHM7CiAgICAgfQorICAgIHZvaWQgYWRkRGVwdGgodW5zaWduZWQgRCkgeworICAgICAgRGVwdGggKz0gRDsKKyAgICAgIEFkZGVkTGV2ZWxzICs9IEQ7CisgICAgfQogICAgIHVuc2lnbmVkIGdldERlcHRoKCkgY29uc3QgeyByZXR1cm4gRGVwdGg7IH0KICAgfTsKIApAQCAtMjI5LDYgKzIzNSw5IEBACiAKICAgY29uc3QgVG9rZW4gJmdldEN1clRva2VuKCkgY29uc3QgeyByZXR1cm4gVG9rOyB9CiAgIFNjb3BlICpnZXRDdXJTY29wZSgpIGNvbnN0IHsgcmV0dXJuIEFjdGlvbnMuZ2V0Q3VyU2NvcGUoKTsgfQorICB2b2lkIGluY3JlbWVudE1TTG9jYWxNYW5nbGluZ051bWJlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQWN0aW9ucy5pbmNyZW1lbnRNU0xvY2FsTWFuZ2xpbmdOdW1iZXIoKTsKKyAgfQogCiAgIERlY2wgICpnZXRPYmpDRGVjbENvbnRleHQoKSBjb25zdCB7IHJldHVybiBBY3Rpb25zLmdldE9iakNEZWNsQ29udGV4dCgpOyB9CiAKQEAgLTI2NiwyNCArMjc1LDQwIEBACiAgIC8vLyBQYXJzZVRvcExldmVsRGVjbCAtIFBhcnNlIG9uZSB0b3AtbGV2ZWwgZGVjbGFyYXRpb24uIFJldHVybnMgdHJ1ZSBpZgogICAvLy8gdGhlIEVPRiB3YXMgZW5jb3VudGVyZWQuCiAgIGJvb2wgUGFyc2VUb3BMZXZlbERlY2woRGVjbEdyb3VwUHRyVHkgJlJlc3VsdCk7CisgIGJvb2wgUGFyc2VUb3BMZXZlbERlY2woKSB7CisgICAgRGVjbEdyb3VwUHRyVHkgUmVzdWx0OworICAgIHJldHVybiBQYXJzZVRvcExldmVsRGVjbChSZXN1bHQpOworICB9CiAKICAgLy8vIENvbnN1bWVUb2tlbiAtIENvbnN1bWUgdGhlIGN1cnJlbnQgJ3BlZWsgdG9rZW4nIGFuZCBsZXggdGhlIG5leHQgb25lLgotICAvLy8gVGhpcyBkb2VzIG5vdCB3b3JrIHdpdGggYWxsIGtpbmRzIG9mIHRva2Vuczogc3RyaW5ncyBhbmQgc3BlY2lmaWMgb3RoZXIKLSAgLy8vIHRva2VucyBtdXN0IGJlIGNvbnN1bWVkIHdpdGggY3VzdG9tIG1ldGhvZHMgYmVsb3cuICBUaGlzIHJldHVybnMgdGhlCi0gIC8vLyBsb2NhdGlvbiBvZiB0aGUgY29uc3VtZWQgdG9rZW4uCi0gIFNvdXJjZUxvY2F0aW9uIENvbnN1bWVUb2tlbihib29sIENvbnN1bWVDb2RlQ29tcGxldGlvblRvayA9IGZhbHNlKSB7Ci0gICAgYXNzZXJ0KCFpc1Rva2VuU3RyaW5nTGl0ZXJhbCgpICYmICFpc1Rva2VuUGFyZW4oKSAmJiAhaXNUb2tlbkJyYWNrZXQoKSAmJgotICAgICAgICAgICAhaXNUb2tlbkJyYWNlKCkgJiYKKyAgLy8vIFRoaXMgZG9lcyBub3Qgd29yayB3aXRoIHNwZWNpYWwgdG9rZW5zOiBzdHJpbmcgbGl0ZXJhbHMsIGNvZGUgY29tcGxldGlvbgorICAvLy8gYW5kIGJhbGFuY2VkIHRva2VucyBtdXN0IGJlIGhhbmRsZWQgdXNpbmcgdGhlIHNwZWNpZmljIGNvbnN1bWUgbWV0aG9kcy4KKyAgLy8vIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb25zdW1lZCB0b2tlbi4KKyAgU291cmNlTG9jYXRpb24gQ29uc3VtZVRva2VuKCkgeworICAgIGFzc2VydCghaXNUb2tlblNwZWNpYWwoKSAmJgogICAgICAgICAgICAiU2hvdWxkIGNvbnN1bWUgc3BlY2lhbCB0b2tlbnMgd2l0aCBDb25zdW1lKlRva2VuIik7Ci0KLSAgICBpZiAoIUNvbnN1bWVDb2RlQ29tcGxldGlvblRvayAmJiBUb2suaXModG9rOjpjb2RlX2NvbXBsZXRpb24pKQotICAgICAgcmV0dXJuIGhhbmRsZVVuZXhwZWN0ZWRDb2RlQ29tcGxldGlvblRva2VuKCk7Ci0KICAgICBQcmV2VG9rTG9jYXRpb24gPSBUb2suZ2V0TG9jYXRpb24oKTsKICAgICBQUC5MZXgoVG9rKTsKICAgICByZXR1cm4gUHJldlRva0xvY2F0aW9uOwogICB9CiAKKyAgYm9vbCBUcnlDb25zdW1lVG9rZW4odG9rOjpUb2tlbktpbmQgRXhwZWN0ZWQpIHsKKyAgICBpZiAoVG9rLmlzTm90KEV4cGVjdGVkKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBhc3NlcnQoIWlzVG9rZW5TcGVjaWFsKCkgJiYKKyAgICAgICAgICAgIlNob3VsZCBjb25zdW1lIHNwZWNpYWwgdG9rZW5zIHdpdGggQ29uc3VtZSpUb2tlbiIpOworICAgIFByZXZUb2tMb2NhdGlvbiA9IFRvay5nZXRMb2NhdGlvbigpOworICAgIFBQLkxleChUb2spOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBUcnlDb25zdW1lVG9rZW4odG9rOjpUb2tlbktpbmQgRXhwZWN0ZWQsIFNvdXJjZUxvY2F0aW9uICZMb2MpIHsKKyAgICBpZiAoIVRyeUNvbnN1bWVUb2tlbihFeHBlY3RlZCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgTG9jID0gUHJldlRva0xvY2F0aW9uOworICAgIHJldHVybiB0cnVlOworICB9CisKIHByaXZhdGU6CiAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogICAvLyBMb3ctTGV2ZWwgdG9rZW4gcGVla2luZyBhbmQgY29uc3VtcHRpb24gbWV0aG9kcy4KQEAgLTMwMSwxMiArMzI2LDE1IEBACiAgIGJvb2wgaXNUb2tlbkJyYWNlKCkgY29uc3QgewogICAgIHJldHVybiBUb2suZ2V0S2luZCgpID09IHRvazo6bF9icmFjZSB8fCBUb2suZ2V0S2luZCgpID09IHRvazo6cl9icmFjZTsKICAgfQotCiAgIC8vLyBpc1Rva2VuU3RyaW5nTGl0ZXJhbCAtIFRydWUgaWYgdGhpcyB0b2tlbiBpcyBhIHN0cmluZy1saXRlcmFsLgotICAvLy8KICAgYm9vbCBpc1Rva2VuU3RyaW5nTGl0ZXJhbCgpIGNvbnN0IHsKICAgICByZXR1cm4gdG9rOjppc1N0cmluZ0xpdGVyYWwoVG9rLmdldEtpbmQoKSk7CiAgIH0KKyAgLy8vIGlzVG9rZW5TcGVjaWFsIC0gVHJ1ZSBpZiB0aGlzIHRva2VuIHJlcXVpcmVzIHNwZWNpYWwgY29uc3VtcHRpb24gbWV0aG9kcy4KKyAgYm9vbCBpc1Rva2VuU3BlY2lhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNUb2tlblN0cmluZ0xpdGVyYWwoKSB8fCBpc1Rva2VuUGFyZW4oKSB8fCBpc1Rva2VuQnJhY2tldCgpIHx8CisgICAgICAgICAgIGlzVG9rZW5CcmFjZSgpIHx8IFRvay5pcyh0b2s6OmNvZGVfY29tcGxldGlvbik7CisgIH0KIAogICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyAnPScgb3IgaXMgYSB0eXBlIG9mICc9Jy4KICAgLy8vIEZvciB0eXBvcywgZ2l2ZSBhIGZpeGl0IHRvICc9JwpAQCAtMzE4LDE0ICszNDYsMTYgQEAKICAgU291cmNlTG9jYXRpb24gQ29uc3VtZUFueVRva2VuKGJvb2wgQ29uc3VtZUNvZGVDb21wbGV0aW9uVG9rID0gZmFsc2UpIHsKICAgICBpZiAoaXNUb2tlblBhcmVuKCkpCiAgICAgICByZXR1cm4gQ29uc3VtZVBhcmVuKCk7Ci0gICAgZWxzZSBpZiAoaXNUb2tlbkJyYWNrZXQoKSkKKyAgICBpZiAoaXNUb2tlbkJyYWNrZXQoKSkKICAgICAgIHJldHVybiBDb25zdW1lQnJhY2tldCgpOwotICAgIGVsc2UgaWYgKGlzVG9rZW5CcmFjZSgpKQorICAgIGlmIChpc1Rva2VuQnJhY2UoKSkKICAgICAgIHJldHVybiBDb25zdW1lQnJhY2UoKTsKLSAgICBlbHNlIGlmIChpc1Rva2VuU3RyaW5nTGl0ZXJhbCgpKQorICAgIGlmIChpc1Rva2VuU3RyaW5nTGl0ZXJhbCgpKQogICAgICAgcmV0dXJuIENvbnN1bWVTdHJpbmdUb2tlbigpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBDb25zdW1lVG9rZW4oQ29uc3VtZUNvZGVDb21wbGV0aW9uVG9rKTsKKyAgICBpZiAoVG9rLmlzKHRvazo6Y29kZV9jb21wbGV0aW9uKSkKKyAgICAgIHJldHVybiBDb25zdW1lQ29kZUNvbXBsZXRpb25Ub2sgPyBDb25zdW1lQ29kZUNvbXBsZXRpb25Ub2tlbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaGFuZGxlVW5leHBlY3RlZENvZGVDb21wbGV0aW9uVG9rZW4oKTsKKyAgICByZXR1cm4gQ29uc3VtZVRva2VuKCk7CiAgIH0KIAogICAvLy8gQ29uc3VtZVBhcmVuIC0gVGhpcyBjb25zdW1lIG1ldGhvZCBrZWVwcyB0aGUgcGFyZW4gY291bnQgdXAtdG8tZGF0ZS4KQEAgLTQwOCw2ICs0MzgsMjAgQEAKICAgICBUb2suc2V0S2luZCh0b2s6OmVvZik7CiAgIH0KIAorICAvLy8gXGJyaWVmIERldGVybWluZSBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIG9yIGF0IGEgdHJhbnNpdGlvbgorICAvLy8gYmV0d2VlbiBtb2R1bGVzLgorICBib29sIGlzRW9mT3JFb20oKSB7CisgICAgdG9rOjpUb2tlbktpbmQgS2luZCA9IFRvay5nZXRLaW5kKCk7CisgICAgcmV0dXJuIEtpbmQgPT0gdG9rOjplb2YgfHwgS2luZCA9PSB0b2s6OmFubm90X21vZHVsZV9iZWdpbiB8fAorICAgICAgICAgICBLaW5kID09IHRvazo6YW5ub3RfbW9kdWxlX2VuZCB8fCBLaW5kID09IHRvazo6YW5ub3RfbW9kdWxlX2luY2x1ZGU7CisgIH0KKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgYWxsIHByYWdtYSBoYW5kbGVycy4KKyAgdm9pZCBpbml0aWFsaXplUHJhZ21hSGFuZGxlcnMoKTsKKworICAvLy8gXGJyaWVmIERlc3Ryb3kgYW5kIHJlc2V0IGFsbCBwcmFnbWEgaGFuZGxlcnMuCisgIHZvaWQgcmVzZXRQcmFnbWFIYW5kbGVycygpOworCiAgIC8vLyBcYnJpZWYgSGFuZGxlIHRoZSBhbm5vdGF0aW9uIHRva2VuIHByb2R1Y2VkIGZvciAjcHJhZ21hIHVudXNlZCguLi4pCiAgIHZvaWQgSGFuZGxlUHJhZ21hVW51c2VkKCk7CiAKQEAgLTQyNyw2ICs0NzEsMTAgQEAKICAgLy8vICNwcmFnbWEgY29tbWVudC4uLgogICB2b2lkIEhhbmRsZVByYWdtYU1TQ29tbWVudCgpOwogCisgIHZvaWQgSGFuZGxlUHJhZ21hTVNQb2ludGVyc1RvTWVtYmVycygpOworCisgIHZvaWQgSGFuZGxlUHJhZ21hTVNWdG9yRGlzcCgpOworCiAgIC8vLyBcYnJpZWYgSGFuZGxlIHRoZSBhbm5vdGF0aW9uIHRva2VuIHByb2R1Y2VkIGZvcgogICAvLy8gI3ByYWdtYSBhbGlnbi4uLgogICB2b2lkIEhhbmRsZVByYWdtYUFsaWduKCk7CkBAIC01NjIsNiArNjEwLDEyIEBACiAgIC8vLyBvdGhlcndpc2UgZW1pdHMgYSBkaWFnbm9zdGljIGFuZCByZXR1cm5zIHRydWUuCiAgIGJvb2wgVHJ5S2V5d29yZElkZW50RmFsbGJhY2soYm9vbCBEaXNhYmxlS2V5d29yZCk7CiAKKyAgLy8vIFRyeUlkZW50S2V5d29yZFVwZ3JhZGUgLSBDb252ZXJ0IHRoZSBjdXJyZW50IGlkZW50aWZpZXIgdG9rZW4gYmFjayB0bworICAvLy8gaXRzIG9yaWdpbmFsIGtpbmQgYW5kIHJldHVybiB0cnVlIGlmIGl0IHdhcyBkaXNhYmxlZCBieQorICAvLy8gVHJ5S2V5d29yZElkZW50RmFsbGJhY2soKSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gVXNlIHRoaXMgdG8KKyAgLy8vIGNvbnRleHR1YWxseSBlbmFibGUga2V5d29yZHMuCisgIGJvb2wgVHJ5SWRlbnRLZXl3b3JkVXBncmFkZSgpOworCiAgIC8vLyBcYnJpZWYgR2V0IHRoZSBUZW1wbGF0ZUlkQW5ub3RhdGlvbiBmcm9tIHRoZSB0b2tlbi4KICAgVGVtcGxhdGVJZEFubm90YXRpb24gKnRha2VUZW1wbGF0ZUlkQW5ub3RhdGlvbihjb25zdCBUb2tlbiAmdG9rKTsKIApAQCAtNjQxLDEyICs2OTUsMTQgQEAKICAgLy8vIEV4cGVjdEFuZENvbnN1bWUgLSBUaGUgcGFyc2VyIGV4cGVjdHMgdGhhdCAnRXhwZWN0ZWRUb2snIGlzIG5leHQgaW4gdGhlCiAgIC8vLyBpbnB1dC4gIElmIHNvLCBpdCBpcyBjb25zdW1lZCBhbmQgZmFsc2UgaXMgcmV0dXJuZWQuCiAgIC8vLwotICAvLy8gSWYgdGhlIGlucHV0IGlzIG1hbGZvcm1lZCwgdGhpcyBlbWl0cyB0aGUgc3BlY2lmaWVkIGRpYWdub3N0aWMuICBOZXh0LCBpZgotICAvLy8gU2tpcFRvVG9rIGlzIHNwZWNpZmllZCwgaXQgY2FsbHMgU2tpcFVudGlsKFNraXBUb1RvaykuICBGaW5hbGx5LCB0cnVlIGlzCisgIC8vLyBJZiBhIHRyaXZpYWwgcHVuY3R1YXRvciBtaXNzcGVsbGluZyBpcyBlbmNvdW50ZXJlZCwgYSBGaXhJdCBlcnJvcgorICAvLy8gZGlhZ25vc3RpYyBpcyBpc3N1ZWQgYW5kIGZhbHNlIGlzIHJldHVybmVkIGFmdGVyIHJlY292ZXJ5LgorICAvLy8KKyAgLy8vIElmIHRoZSBpbnB1dCBpcyBtYWxmb3JtZWQsIHRoaXMgZW1pdHMgdGhlIHNwZWNpZmllZCBkaWFnbm9zdGljIGFuZCB0cnVlIGlzCiAgIC8vLyByZXR1cm5lZC4KLSAgYm9vbCBFeHBlY3RBbmRDb25zdW1lKHRvazo6VG9rZW5LaW5kIEV4cGVjdGVkVG9rLCB1bnNpZ25lZCBEaWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqRGlhZ01zZyA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgdG9rOjpUb2tlbktpbmQgU2tpcFRvVG9rID0gdG9rOjp1bmtub3duKTsKKyAgYm9vbCBFeHBlY3RBbmRDb25zdW1lKHRvazo6VG9rZW5LaW5kIEV4cGVjdGVkVG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGlhZyA9IGRpYWc6OmVycl9leHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkRpYWdNc2cgPSAiIik7CiAKICAgLy8vIFxicmllZiBUaGUgcGFyc2VyIGV4cGVjdHMgYSBzZW1pY29sb24gYW5kLCBpZiBwcmVzZW50LCB3aWxsIGNvbnN1bWUgaXQuCiAgIC8vLwpAQCAtNjg0LDE0ICs3NDAsMTggQEAKICAgcHVibGljOgogICAgIC8vIFBhcnNlU2NvcGUgLSBDb25zdHJ1Y3QgYSBuZXcgb2JqZWN0IHRvIG1hbmFnZSBhIHNjb3BlIGluIHRoZQogICAgIC8vIHBhcnNlciBTZWxmIHdoZXJlIHRoZSBuZXcgU2NvcGUgaXMgY3JlYXRlZCB3aXRoIHRoZSBmbGFncwotICAgIC8vIFNjb3BlRmxhZ3MsIGJ1dCBvbmx5IHdoZW4gTWFuYWdlU2NvcGUgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLiBJZgotICAgIC8vIE1hbmFnZVNjb3BlIGlzIGZhbHNlLCB0aGlzIG9iamVjdCBkb2VzIG5vdGhpbmcuCi0gICAgUGFyc2VTY29wZShQYXJzZXIgKlNlbGYsIHVuc2lnbmVkIFNjb3BlRmxhZ3MsIGJvb2wgTWFuYWdlU2NvcGUgPSB0cnVlKQorICAgIC8vIFNjb3BlRmxhZ3MsIGJ1dCBvbmx5IHdoZW4gd2UgYXJlbid0IGFib3V0IHRvIGVudGVyIGEgY29tcG91bmQgc3RhdGVtZW50LgorICAgIFBhcnNlU2NvcGUoUGFyc2VyICpTZWxmLCB1bnNpZ25lZCBTY29wZUZsYWdzLCBib29sIEVudGVyZWRTY29wZSA9IHRydWUsCisgICAgICAgICAgICAgICBib29sIEJlZm9yZUNvbXBvdW5kU3RtdCA9IGZhbHNlKQogICAgICAgOiBTZWxmKFNlbGYpIHsKLSAgICAgIGlmIChNYW5hZ2VTY29wZSkKKyAgICAgIGlmIChFbnRlcmVkU2NvcGUgJiYgIUJlZm9yZUNvbXBvdW5kU3RtdCkKICAgICAgICAgU2VsZi0+RW50ZXJTY29wZShTY29wZUZsYWdzKTsKLSAgICAgIGVsc2UKKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoQmVmb3JlQ29tcG91bmRTdG10KQorICAgICAgICAgIFNlbGYtPmluY3JlbWVudE1TTG9jYWxNYW5nbGluZ051bWJlcigpOworCiAgICAgICAgIHRoaXMtPlNlbGYgPSAwOworICAgICAgfQogICAgIH0KIAogICAgIC8vIEV4aXQgLSBFeGl0IHRoZSBzY29wZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3Qgbm93LCByYXRoZXIKQEAgLTgxOCwxMCArODc4LDEwIEBACiAgICAgTGF0ZVBhcnNlZENsYXNzKFBhcnNlciAqUCwgUGFyc2luZ0NsYXNzICpDKTsKICAgICB2aXJ0dWFsIH5MYXRlUGFyc2VkQ2xhc3MoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBQYXJzZUxleGVkTWV0aG9kRGVjbGFyYXRpb25zKCk7Ci0gICAgdmlydHVhbCB2b2lkIFBhcnNlTGV4ZWRNZW1iZXJJbml0aWFsaXplcnMoKTsKLSAgICB2aXJ0dWFsIHZvaWQgUGFyc2VMZXhlZE1ldGhvZERlZnMoKTsKLSAgICB2aXJ0dWFsIHZvaWQgUGFyc2VMZXhlZEF0dHJpYnV0ZXMoKTsKKyAgICB2b2lkIFBhcnNlTGV4ZWRNZXRob2REZWNsYXJhdGlvbnMoKSBvdmVycmlkZTsKKyAgICB2b2lkIFBhcnNlTGV4ZWRNZW1iZXJJbml0aWFsaXplcnMoKSBvdmVycmlkZTsKKyAgICB2b2lkIFBhcnNlTGV4ZWRNZXRob2REZWZzKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBQYXJzZUxleGVkQXR0cmlidXRlcygpIG92ZXJyaWRlOwogCiAgIHByaXZhdGU6CiAgICAgUGFyc2VyICpTZWxmOwpAQCAtODQ1LDcgKzkwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpCiAgICAgICA6IFNlbGYoUCksIEF0dHJOYW1lKE5hbWUpLCBBdHRyTmFtZUxvYyhMb2MpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgUGFyc2VMZXhlZEF0dHJpYnV0ZXMoKTsKKyAgICB2b2lkIFBhcnNlTGV4ZWRBdHRyaWJ1dGVzKCkgb3ZlcnJpZGU7CiAKICAgICB2b2lkIGFkZERlY2woRGVjbCAqRCkgeyBEZWNscy5wdXNoX2JhY2soRCk7IH0KICAgfTsKQEAgLTg3Nyw3ICs5MzcsNyBAQAogICAgIGV4cGxpY2l0IExleGVkTWV0aG9kKFBhcnNlciogUCwgRGVjbCAqTUQpCiAgICAgICA6IFNlbGYoUCksIEQoTUQpLCBUZW1wbGF0ZVNjb3BlKGZhbHNlKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIFBhcnNlTGV4ZWRNZXRob2REZWZzKCk7CisgICAgdm9pZCBQYXJzZUxleGVkTWV0aG9kRGVmcygpIG92ZXJyaWRlOwogICB9OwogCiAgIC8vLyBMYXRlUGFyc2VkRGVmYXVsdEFyZ3VtZW50IC0gS2VlcHMgdHJhY2sgb2YgYSBwYXJhbWV0ZXIgdGhhdCBtYXkKQEAgLTkwNyw3ICs5NjcsNyBAQAogICAgIGV4cGxpY2l0IExhdGVQYXJzZWRNZXRob2REZWNsYXJhdGlvbihQYXJzZXIgKlAsIERlY2wgKk0pCiAgICAgICA6IFNlbGYoUCksIE1ldGhvZChNKSwgVGVtcGxhdGVTY29wZShmYWxzZSksIEV4Y2VwdGlvblNwZWNUb2tlbnMoMCkgeyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgUGFyc2VMZXhlZE1ldGhvZERlY2xhcmF0aW9ucygpOworICAgIHZvaWQgUGFyc2VMZXhlZE1ldGhvZERlY2xhcmF0aW9ucygpIG92ZXJyaWRlOwogCiAgICAgUGFyc2VyKiBTZWxmOwogCkBAIC05MzgsNyArOTk4LDcgQEAKICAgICBMYXRlUGFyc2VkTWVtYmVySW5pdGlhbGl6ZXIoUGFyc2VyICpQLCBEZWNsICpGRCkKICAgICAgIDogU2VsZihQKSwgRmllbGQoRkQpIHsgfQogCi0gICAgdmlydHVhbCB2b2lkIFBhcnNlTGV4ZWRNZW1iZXJJbml0aWFsaXplcnMoKTsKKyAgICB2b2lkIFBhcnNlTGV4ZWRNZW1iZXJJbml0aWFsaXplcnMoKSBvdmVycmlkZTsKIAogICAgIFBhcnNlciAqU2VsZjsKIApAQCAtMTYwNCw5ICsxNjY0LDI3IEBACiAgICAgRFNDX2NsYXNzLCAgLy8gY2xhc3MgY29udGV4dCwgZW5hYmxlcyAnZnJpZW5kJwogICAgIERTQ190eXBlX3NwZWNpZmllciwgLy8gQysrIHR5cGUtc3BlY2lmaWVyLXNlcSBvciBDIHNwZWNpZmllci1xdWFsaWZpZXItbGlzdAogICAgIERTQ190cmFpbGluZywgLy8gQysrMTEgdHJhaWxpbmctdHlwZS1zcGVjaWZpZXIgaW4gYSB0cmFpbGluZyByZXR1cm4gdHlwZQorICAgIERTQ19hbGlhc19kZWNsYXJhdGlvbiwgLy8gQysrMTEgdHlwZS1zcGVjaWZpZXItc2VxIGluIGFuIGFsaWFzLWRlY2xhcmF0aW9uCiAgICAgRFNDX3RvcF9sZXZlbCAvLyB0b3AtbGV2ZWwvbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGNvbnRleHQKICAgfTsKIAorICAvLy8gSXMgdGhpcyBhIGNvbnRleHQgaW4gd2hpY2ggd2UgYXJlIHBhcnNpbmcganVzdCBhIHR5cGUtc3BlY2lmaWVyIChvcgorICAvLy8gdHJhaWxpbmctdHlwZS1zcGVjaWZpZXIpPworICBzdGF0aWMgYm9vbCBpc1R5cGVTcGVjaWZpZXIoRGVjbFNwZWNDb250ZXh0IERTQykgeworICAgIHN3aXRjaCAoRFNDKSB7CisgICAgY2FzZSBEU0Nfbm9ybWFsOgorICAgIGNhc2UgRFNDX2NsYXNzOgorICAgIGNhc2UgRFNDX3RvcF9sZXZlbDoKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNhc2UgRFNDX3R5cGVfc3BlY2lmaWVyOgorICAgIGNhc2UgRFNDX3RyYWlsaW5nOgorICAgIGNhc2UgRFNDX2FsaWFzX2RlY2xhcmF0aW9uOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIk1pc3NpbmcgRGVjbFNwZWNDb250ZXh0IGNhc2UiKTsKKyAgfQorCiAgIC8vLyBJbmZvcm1hdGlvbiBvbiBhIEMrKzB4IGZvci1yYW5nZS1pbml0aWFsaXplciBmb3VuZCB3aGlsZSBwYXJzaW5nIGEKICAgLy8vIGRlY2xhcmF0aW9uIHdoaWNoIHR1cm5zIG91dCB0byBiZSBhIGZvci1yYW5nZS1kZWNsYXJhdGlvbi4KICAgc3RydWN0IEZvclJhbmdlSW5pdCB7CkBAIC0xNzI2LDEyICsxODA0LDEzIEBACiAgIC8vLyBcYnJpZWYgU3RhcnRpbmcgd2l0aCBhIHNjb3BlIHNwZWNpZmllciwgaWRlbnRpZmllciwgb3IKICAgLy8vIHRlbXBsYXRlLWlkIHRoYXQgcmVmZXJzIHRvIHRoZSBjdXJyZW50IGNsYXNzLCBkZXRlcm1pbmUgd2hldGhlcgogICAvLy8gdGhpcyBpcyBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0b3IuCi0gIGJvb2wgaXNDb25zdHJ1Y3RvckRlY2xhcmF0b3IoKTsKKyAgYm9vbCBpc0NvbnN0cnVjdG9yRGVjbGFyYXRvcihib29sIFVucXVhbGlmaWVkKTsKIAogICAvLy8gXGJyaWVmIFNwZWNpZmllcyB0aGUgY29udGV4dCBpbiB3aGljaCB0eXBlLWlkL2V4cHJlc3Npb24KICAgLy8vIGRpc2FtYmlndWF0aW9uIHdpbGwgb2NjdXIuCiAgIGVudW0gVGVudGF0aXZlQ1hYVHlwZUlkQ29udGV4dCB7CiAgICAgVHlwZUlkSW5QYXJlbnMsCisgICAgVHlwZUlkVW5hbWJpZ3VvdXMsCiAgICAgVHlwZUlkQXNUZW1wbGF0ZUFyZ3VtZW50CiAgIH07CiAKQEAgLTE3NTAsNiArMTgyOSwxNiBAQAogICAgIHJldHVybiBpc1R5cGVJZEluUGFyZW5zKGlzQW1iaWd1b3VzKTsKICAgfQogCisgIC8vLyBcYnJpZWYgQ2hlY2tzIGlmIHRoZSBjdXJyZW50IHRva2VucyBmb3JtIHR5cGUtaWQgb3IgZXhwcmVzc2lvbi4KKyAgLy8vIEl0IGlzIHNpbWlsYXIgdG8gaXNUeXBlSWRJblBhcmVucyBidXQgZG9lcyBub3Qgc3VwcG9zZSB0aGF0IHR5cGUtaWQKKyAgLy8vIGlzIGluIHBhcmVudGhlc2lzLgorICBib29sIGlzVHlwZUlkVW5hbWJpZ3VvdXNseSgpIHsKKyAgICBib29sIElzQW1iaWd1b3VzOworICAgIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1cykKKyAgICAgIHJldHVybiBpc0NYWFR5cGVJZChUeXBlSWRVbmFtYmlndW91cywgSXNBbWJpZ3VvdXMpOworICAgIHJldHVybiBpc1R5cGVTcGVjaWZpZXJRdWFsaWZpZXIoKTsKKyAgfQorCiAgIC8vLyBpc0NYWERlY2xhcmF0aW9uU3RhdGVtZW50IC0gQysrLXNwZWNpYWxpemVkIGZ1bmN0aW9uIHRoYXQgZGlzYW1iaWd1YXRlcwogICAvLy8gYmV0d2VlbiBhIGRlY2xhcmF0aW9uIG9yIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50LCB3aGVuIHBhcnNpbmcgZnVuY3Rpb24KICAgLy8vIGJvZGllcy4gUmV0dXJucyB0cnVlIGZvciBkZWNsYXJhdGlvbiwgZmFsc2UgZm9yIGV4cHJlc3Npb24uCkBAIC0xOTA3LDEyICsxOTk2LDIyIEBACiAgIC8vLyBsb2NhdGlvbnMgd2hlcmUgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQuCiAgIHZvaWQgRGlhZ25vc2VBbmRTa2lwQ1hYMTFBdHRyaWJ1dGVzKCk7CiAKKyAgLy8vIFxicmllZiBQYXJzZXMgc3ludGF4LWdlbmVyaWMgYXR0cmlidXRlIGFyZ3VtZW50cyBmb3IgYXR0cmlidXRlcyB3aGljaCBhcmUKKyAgLy8vIGtub3duIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiwgYW5kIGFkZHMgdGhlbSB0byB0aGUgZ2l2ZW4gUGFyc2VkQXR0cmlidXRlcworICAvLy8gbGlzdCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGUgc3ludGF4LgorICB2b2lkIFBhcnNlQXR0cmlidXRlQXJnc0NvbW1vbihJZGVudGlmaWVySW5mbyAqQXR0ck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0dHJOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywgU291cmNlTG9jYXRpb24gKkVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlNjb3BlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBTeW50YXgpOworCiAgIHZvaWQgTWF5YmVQYXJzZUdOVUF0dHJpYnV0ZXMoRGVjbGFyYXRvciAmRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXRlUGFyc2VkQXR0ckxpc3QgKkxhdGVBdHRycyA9IDApIHsKICAgICBpZiAoVG9rLmlzKHRvazo6a3dfX19hdHRyaWJ1dGUpKSB7CiAgICAgICBQYXJzZWRBdHRyaWJ1dGVzIGF0dHJzKEF0dHJGYWN0b3J5KTsKICAgICAgIFNvdXJjZUxvY2F0aW9uIGVuZExvYzsKLSAgICAgIFBhcnNlR05VQXR0cmlidXRlcyhhdHRycywgJmVuZExvYywgTGF0ZUF0dHJzKTsKKyAgICAgIFBhcnNlR05VQXR0cmlidXRlcyhhdHRycywgJmVuZExvYywgTGF0ZUF0dHJzLCAmRCk7CiAgICAgICBELnRha2VBdHRyaWJ1dGVzKGF0dHJzLCBlbmRMb2MpOwogICAgIH0KICAgfQpAQCAtMTkyNCwxNCArMjAyMywxNiBAQAogICB9CiAgIHZvaWQgUGFyc2VHTlVBdHRyaWJ1dGVzKFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqZW5kTG9jID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZVBhcnNlZEF0dHJMaXN0ICpMYXRlQXR0cnMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZVBhcnNlZEF0dHJMaXN0ICpMYXRlQXR0cnMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdG9yICpEID0gMCk7CiAgIHZvaWQgUGFyc2VHTlVBdHRyaWJ1dGVBcmdzKElkZW50aWZpZXJJbmZvICpBdHRyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXR0ck5hbWVMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZEF0dHJpYnV0ZXMgJkF0dHJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqRW5kTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqU2NvcGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTY29wZUxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdDo6U3ludGF4IFN5bnRheCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBTeW50YXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0b3IgKkQpOwogICBJZGVudGlmaWVyTG9jICpQYXJzZUlkZW50aWZpZXJMb2MoKTsKIAogICB2b2lkIE1heWJlUGFyc2VDWFgxMUF0dHJpYnV0ZXMoRGVjbGFyYXRvciAmRCkgewpAQCAtMTk2Miw2ICsyMDYzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqRW5kTG9jID0gMCk7CiAgIHZvaWQgUGFyc2VDWFgxMUF0dHJpYnV0ZXMoUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSAmYXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKkVuZExvYyA9IDApOworICAvLy8gXGJyaWVmIFBhcnNlcyBhIEMrKy1zdHlsZSBhdHRyaWJ1dGUgYXJndW1lbnQgbGlzdC4gUmV0dXJucyB0cnVlIGlmIHRoaXMKKyAgLy8vIHJlc3VsdHMgaW4gYWRkaW5nIGFuIGF0dHJpYnV0ZSB0byB0aGUgUGFyc2VkQXR0cmlidXRlcyBsaXN0LgorICBib29sIFBhcnNlQ1hYMTFBdHRyaWJ1dGVBcmdzKElkZW50aWZpZXJJbmZvICpBdHRyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywgU291cmNlTG9jYXRpb24gKkVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqU2NvcGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFNjb3BlTG9jKTsKIAogICBJZGVudGlmaWVySW5mbyAqVHJ5UGFyc2VDWFgxMUF0dHJpYnV0ZUlkZW50aWZpZXIoU291cmNlTG9jYXRpb24gJkxvYyk7CiAKQEAgLTE5NzMsMzAgKzIwODEsMjUgQEAKICAgdm9pZCBQYXJzZU1pY3Jvc29mdEF0dHJpYnV0ZXMoUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICplbmRMb2MgPSAwKTsKICAgdm9pZCBQYXJzZU1pY3Jvc29mdERlY2xTcGVjKFBhcnNlZEF0dHJpYnV0ZXMgJkF0dHJzKTsKLSAgYm9vbCBJc1NpbXBsZU1pY3Jvc29mdERlY2xTcGVjKElkZW50aWZpZXJJbmZvICpJZGVudCk7Ci0gIHZvaWQgUGFyc2VDb21wbGV4TWljcm9zb2Z0RGVjbFNwZWMoSWRlbnRpZmllckluZm8gKklkZW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMpOwotICB2b2lkIFBhcnNlTWljcm9zb2Z0RGVjbFNwZWNXaXRoU2luZ2xlQXJnKElkZW50aWZpZXJJbmZvICpBdHRyTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXR0ck5hbWVMb2MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZEF0dHJpYnV0ZXMgJkF0dHJzKTsKKyAgYm9vbCBQYXJzZU1pY3Jvc29mdERlY2xTcGVjQXJncyhJZGVudGlmaWVySW5mbyAqQXR0ck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXR0ck5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMpOwogICB2b2lkIFBhcnNlTWljcm9zb2Z0VHlwZUF0dHJpYnV0ZXMoUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMpOwogICB2b2lkIFBhcnNlTWljcm9zb2Z0SW5oZXJpdGFuY2VDbGFzc0F0dHJpYnV0ZXMoUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMpOwogICB2b2lkIFBhcnNlQm9ybGFuZFR5cGVBdHRyaWJ1dGVzKFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzKTsKICAgdm9pZCBQYXJzZU9wZW5DTEF0dHJpYnV0ZXMoUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMpOwotICB2b2lkIFBhcnNlT3BlbkNMUXVhbGlmaWVycyhEZWNsU3BlYyAmRFMpOworICB2b2lkIFBhcnNlT3BlbkNMUXVhbGlmaWVycyhQYXJzZWRBdHRyaWJ1dGVzICZBdHRycyk7CiAKICAgVmVyc2lvblR1cGxlIFBhcnNlVmVyc2lvblR1cGxlKFNvdXJjZVJhbmdlICZSYW5nZSk7CiAgIHZvaWQgUGFyc2VBdmFpbGFiaWxpdHlBdHRyaWJ1dGUoSWRlbnRpZmllckluZm8gJkF2YWlsYWJpbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdmFpbGFiaWxpdHlMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKmVuZExvYyk7Ci0KLSAgYm9vbCBJc1RocmVhZFNhZmV0eUF0dHJpYnV0ZShTdHJpbmdSZWYgQXR0ck5hbWUpOwotICB2b2lkIFBhcnNlVGhyZWFkU2FmZXR5QXR0cmlidXRlKElkZW50aWZpZXJJbmZvICZBdHRyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyTmFtZUxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqRW5kTG9jKTsKKyAgCisgIHZvaWQgUGFyc2VPYmpDQnJpZGdlUmVsYXRlZEF0dHJpYnV0ZShJZGVudGlmaWVySW5mbyAmT2JqQ0JyaWRnZVJlbGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBPYmpDQnJpZGdlUmVsYXRlZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKmVuZExvYyk7CiAKICAgdm9pZCBQYXJzZVR5cGVUYWdGb3JEYXRhdHlwZUF0dHJpYnV0ZShJZGVudGlmaWVySW5mbyAmQXR0ck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXR0ck5hbWVMb2MsCkBAIC0yMTU0LDYgKzIyNTcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbCAqVGFnRGVjbCk7CiAgIEV4cHJSZXN1bHQgUGFyc2VDWFhNZW1iZXJJbml0aWFsaXplcihEZWNsICpELCBib29sIElzRnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmRXF1YWxMb2MpOworICB2b2lkIFBhcnNlQ1hYTWVtYmVyRGVjbGFyYXRvckJlZm9yZUluaXRpYWxpemVyKERlY2xhcmF0b3IgJkRlY2xhcmF0b3JJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnRTcGVjaWZpZXJzICZWUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByUmVzdWx0ICZCaXRmaWVsZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZVBhcnNlZEF0dHJMaXN0ICZMYXRlQXR0cnMpOwogICB2b2lkIFBhcnNlQ1hYQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbihBY2Nlc3NTcGVjaWZpZXIgQVMsIEF0dHJpYnV0ZUxpc3QgKkF0dHIsCiAgICAgICAgICAgICAgICAgY29uc3QgUGFyc2VkVGVtcGxhdGVJbmZvICZUZW1wbGF0ZUluZm8gPSBQYXJzZWRUZW1wbGF0ZUluZm8oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmdEZWNsUkFJSU9iamVjdCAqRGlhZ3NGcm9tVFBhcmFtcyA9IDApOwpAQCAtMjI5NSw5ICsyNDAyLDcgQEAKICAgRGVjbEdyb3VwUHRyVHkgUGFyc2VNb2R1bGVJbXBvcnQoU291cmNlTG9jYXRpb24gQXRMb2MpOwogCiAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotICAvLyBHTlUgRysrOiBUeXBlIFRyYWl0cyBbVHlwZS1UcmFpdHMuaHRtbCBpbiB0aGUgR0NDIG1hbnVhbF0KLSAgRXhwclJlc3VsdCBQYXJzZVVuYXJ5VHlwZVRyYWl0KCk7Ci0gIEV4cHJSZXN1bHQgUGFyc2VCaW5hcnlUeXBlVHJhaXQoKTsKKyAgLy8gQysrMTEvRysrOiBUeXBlIFRyYWl0cyBbVHlwZS1UcmFpdHMuaHRtbCBpbiB0aGUgR0NDIG1hbnVhbF0KICAgRXhwclJlc3VsdCBQYXJzZVR5cGVUcmFpdCgpOwogICAKICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCkBAIC0yMzA3LDE0ICsyNDEyLDEzIEBACiAKICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAgIC8vIFByZXByb2Nlc3NvciBjb2RlLWNvbXBsZXRpb24gcGFzcy10aHJvdWdoCi0gIHZpcnR1YWwgdm9pZCBDb2RlQ29tcGxldGVEaXJlY3RpdmUoYm9vbCBJbkNvbmRpdGlvbmFsKTsKLSAgdmlydHVhbCB2b2lkIENvZGVDb21wbGV0ZUluQ29uZGl0aW9uYWxFeGNsdXNpb24oKTsKLSAgdmlydHVhbCB2b2lkIENvZGVDb21wbGV0ZU1hY3JvTmFtZShib29sIElzRGVmaW5pdGlvbik7Ci0gIHZpcnR1YWwgdm9pZCBDb2RlQ29tcGxldGVQcmVwcm9jZXNzb3JFeHByZXNzaW9uKCk7Ci0gIHZpcnR1YWwgdm9pZCBDb2RlQ29tcGxldGVNYWNyb0FyZ3VtZW50KElkZW50aWZpZXJJbmZvICpNYWNybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9JbmZvICpNYWNyb0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFyZ3VtZW50SW5kZXgpOwotICB2aXJ0dWFsIHZvaWQgQ29kZUNvbXBsZXRlTmF0dXJhbExhbmd1YWdlKCk7CisgIHZvaWQgQ29kZUNvbXBsZXRlRGlyZWN0aXZlKGJvb2wgSW5Db25kaXRpb25hbCkgb3ZlcnJpZGU7CisgIHZvaWQgQ29kZUNvbXBsZXRlSW5Db25kaXRpb25hbEV4Y2x1c2lvbigpIG92ZXJyaWRlOworICB2b2lkIENvZGVDb21wbGV0ZU1hY3JvTmFtZShib29sIElzRGVmaW5pdGlvbikgb3ZlcnJpZGU7CisgIHZvaWQgQ29kZUNvbXBsZXRlUHJlcHJvY2Vzc29yRXhwcmVzc2lvbigpIG92ZXJyaWRlOworICB2b2lkIENvZGVDb21wbGV0ZU1hY3JvQXJndW1lbnQoSWRlbnRpZmllckluZm8gKk1hY3JvLCBNYWNyb0luZm8gKk1hY3JvSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFyZ3VtZW50SW5kZXgpIG92ZXJyaWRlOworICB2b2lkIENvZGVDb21wbGV0ZU5hdHVyYWxMYW5ndWFnZSgpIG92ZXJyaWRlOwogfTsKIAogfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0NvcmUvUmV3cml0ZVJvcGUuaCBiL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Db3JlL1Jld3JpdGVSb3BlLmgKaW5kZXggYTUxOTJlZi4uNTE2N2M1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0NvcmUvUmV3cml0ZVJvcGUuaAorKysgYi9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvQ29yZS9SZXdyaXRlUm9wZS5oCkBAIC0xNCw2ICsxNCw3IEBACiAjaWZuZGVmIExMVk1fQ0xBTkdfUkVXUklURVJPUEVfSAogI2RlZmluZSBMTFZNX0NMQU5HX1JFV1JJVEVST1BFX0gKIAorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgogI2luY2x1ZGUgPGNhc3NlcnQ+CiAjaW5jbHVkZSA8Y3N0ZGRlZj4KQEAgLTE0NCw3ICsxNDUsMTEgQEAKICAgICBpbmxpbmUgUm9wZVBpZWNlQlRyZWVJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CiAgICAgICBSb3BlUGllY2VCVHJlZUl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOwogICAgIH0KLSAgcHJpdmF0ZToKKworICAgIGxsdm06OlN0cmluZ1JlZiBwaWVjZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsbHZtOjpTdHJpbmdSZWYoJigqQ3VyUGllY2UpWzBdLCBDdXJQaWVjZS0+c2l6ZSgpKTsKKyAgICB9CisKICAgICB2b2lkIE1vdmVUb05leHRQaWVjZSgpOwogICB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvQ29yZS9Ub2tlblJld3JpdGVyLmggYi9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvQ29yZS9Ub2tlblJld3JpdGVyLmgKaW5kZXggZWMwYmI1Yi4uYzMxM2I0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0NvcmUvVG9rZW5SZXdyaXRlci5oCisrKyBiL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Db3JlL1Rva2VuUmV3cml0ZXIuaApAQCAtMTcsOSArMTcsOSBAQAogCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvVG9rZW4uaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CiAgIGNsYXNzIExhbmdPcHRpb25zOwpAQCAtNDEsNyArNDEsNyBAQAogCiAgICAgLy8vIFNjcmF0Y2hCdWYgLSBUaGlzIGlzIHRoZSBidWZmZXIgdGhhdCB3ZSBjcmVhdGUgc2NyYXRjaCB0b2tlbnMgZnJvbS4KICAgICAvLy8KLSAgICBPd25pbmdQdHI8U2NyYXRjaEJ1ZmZlcj4gU2NyYXRjaEJ1ZjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U2NyYXRjaEJ1ZmZlcj4gU2NyYXRjaEJ1ZjsKIAogICAgIFRva2VuUmV3cml0ZXIoY29uc3QgVG9rZW5SZXdyaXRlciAmKSBMTFZNX0RFTEVURURfRlVOQ1RJT047CiAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVG9rZW5SZXdyaXRlciAmKSBMTFZNX0RFTEVURURfRlVOQ1RJT047CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvRnJvbnRlbmQvRml4SXRSZXdyaXRlci5oIGIvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0Zyb250ZW5kL0ZpeEl0UmV3cml0ZXIuaAppbmRleCA0MjNmMDY2Li5mZjAzZWZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvRnJvbnRlbmQvRml4SXRSZXdyaXRlci5oCisrKyBiL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9GaXhJdFJld3JpdGVyLmgKQEAgLTExMiwxMiArMTEyLDEyIEBACiAgIC8vLyByZXR1cm5zIHRydWUpIGluZGljYXRlcyB3aGV0aGVyIHRoZSBkaWFnbm9zdGljcyBoYW5kbGVkIGJ5IHRoaXMKICAgLy8vIERpYWdub3N0aWNDb25zdW1lciBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG51bWJlciBvZiBkaWFnbm9zdGljcwogICAvLy8gcmVwb3J0ZWQgYnkgRGlhZ25vc3RpY3NFbmdpbmUuCi0gIHZpcnR1YWwgYm9vbCBJbmNsdWRlSW5EaWFnbm9zdGljQ291bnRzKCkgY29uc3Q7CisgIGJvb2wgSW5jbHVkZUluRGlhZ25vc3RpY0NvdW50cygpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vLyBIYW5kbGVEaWFnbm9zdGljIC0gSGFuZGxlIHRoaXMgZGlhZ25vc3RpYywgcmVwb3J0aW5nIGl0IHRvIHRoZSB1c2VyIG9yCiAgIC8vLyBjYXB0dXJpbmcgaXQgdG8gYSBsb2cgYXMgbmVlZGVkLgotICB2aXJ0dWFsIHZvaWQgSGFuZGxlRGlhZ25vc3RpYyhEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgRGlhZ0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKTsKKyAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBEaWFnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIEVtaXQgYSBkaWFnbm9zdGljIHZpYSB0aGUgYWRhcHRlZCBkaWFnbm9zdGljIGNsaWVudC4KICAgdm9pZCBEaWFnKFNvdXJjZUxvY2F0aW9uIExvYywgdW5zaWduZWQgRGlhZ0lEKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaCBiL2luY2x1ZGUvY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaAppbmRleCBlYTg3NmQ5Li5mYzc5MjcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1Jld3JpdGUvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9SZXdyaXRlL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5oCkBAIC0yMiwyNCArMjIsMjQgQEAKIAogY2xhc3MgSFRNTFByaW50QWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpOworICBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIEZpeEl0QWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKIHByb3RlY3RlZDoKLSAgT3duaW5nUHRyPEZpeEl0UmV3cml0ZXI+IFJld3JpdGVyOwotICBPd25pbmdQdHI8Rml4SXRPcHRpb25zPiBGaXhJdE9wdHM7CisgIHN0ZDo6dW5pcXVlX3B0cjxGaXhJdFJld3JpdGVyPiBSZXdyaXRlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPEZpeEl0T3B0aW9ucz4gRml4SXRPcHRzOwogCi0gIHZpcnR1YWwgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKTsKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBib29sIEJlZ2luU291cmNlRmlsZUFjdGlvbihDb21waWxlckluc3RhbmNlICZDSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZW5hbWUpOworICBib29sIEJlZ2luU291cmNlRmlsZUFjdGlvbihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVuYW1lKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgRW5kU291cmNlRmlsZUFjdGlvbigpOworICB2b2lkIEVuZFNvdXJjZUZpbGVBY3Rpb24oKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIGJvb2wgaGFzQVNURmlsZVN1cHBvcnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBib29sIGhhc0FTVEZpbGVTdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAogcHVibGljOgogICBGaXhJdEFjdGlvbigpOwpAQCAtNTQsMjggKzU0LDI4IEBACiAgICAgOiBXcmFwcGVyRnJvbnRlbmRBY3Rpb24oV3JhcHBlZEFjdGlvbikge30KIAogcHJvdGVjdGVkOgotICB2aXJ0dWFsIGJvb2wgQmVnaW5JbnZvY2F0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJKTsKKyAgYm9vbCBCZWdpbkludm9jYXRpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgUmV3cml0ZU9iakNBY3Rpb24gOiBwdWJsaWMgQVNURnJvbnRlbmRBY3Rpb24gewogcHJvdGVjdGVkOgotICB2aXJ0dWFsIEFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSk7CisgIEFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgUmV3cml0ZU1hY3Jvc0FjdGlvbiA6IHB1YmxpYyBQcmVwcm9jZXNzb3JGcm9udGVuZEFjdGlvbiB7CiBwcm90ZWN0ZWQ6Ci0gIHZvaWQgRXhlY3V0ZUFjdGlvbigpOworICB2b2lkIEV4ZWN1dGVBY3Rpb24oKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIFJld3JpdGVUZXN0QWN0aW9uIDogcHVibGljIFByZXByb2Nlc3NvckZyb250ZW5kQWN0aW9uIHsKIHByb3RlY3RlZDoKLSAgdm9pZCBFeGVjdXRlQWN0aW9uKCk7CisgIHZvaWQgRXhlY3V0ZUFjdGlvbigpIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgUmV3cml0ZUluY2x1ZGVzQWN0aW9uIDogcHVibGljIFByZXByb2Nlc3NvckZyb250ZW5kQWN0aW9uIHsKIHByb3RlY3RlZDoKLSAgdm9pZCBFeGVjdXRlQWN0aW9uKCk7CisgIHZvaWQgRXhlY3V0ZUFjdGlvbigpIG92ZXJyaWRlOwogfTsKIAogfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJpYnV0ZUxpc3QuaCBiL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyaWJ1dGVMaXN0LmgKaW5kZXggNTA4MDY0ZC4uMTcxZjlmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJpYnV0ZUxpc3QuaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0cmlidXRlTGlzdC5oCkBAIC0xOCw4ICsxOCw5IEBACiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTG9jYXRpb24uaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9WZXJzaW9uVHVwbGUuaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL093bmVyc2hpcC5oIgotI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCiAjaW5jbHVkZSA8Y2Fzc2VydD4KIApAQCAtMjQ1LDYgKzI0NiwyNiBAQAogICAgIEF0dHJLaW5kID0gZ2V0S2luZChnZXROYW1lKCksIGdldFNjb3BlTmFtZSgpLCBzeW50YXhVc2VkKTsKICAgfQogCisgIC8vLyBDb25zdHJ1Y3RvciBmb3Igb2JqY19icmlkZ2VfcmVsYXRlZCBhdHRyaWJ1dGVzLgorICBBdHRyaWJ1dGVMaXN0KElkZW50aWZpZXJJbmZvICphdHRyTmFtZSwgU291cmNlUmFuZ2UgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpzY29wZU5hbWUsIFNvdXJjZUxvY2F0aW9uIHNjb3BlTG9jLAorICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcm0xLAorICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcm0yLAorICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcm0zLAorICAgICAgICAgICAgICAgIFN5bnRheCBzeW50YXhVc2VkKQorICA6IEF0dHJOYW1lKGF0dHJOYW1lKSwgU2NvcGVOYW1lKHNjb3BlTmFtZSksIEF0dHJSYW5nZShhdHRyUmFuZ2UpLAorICAgIFNjb3BlTG9jKHNjb3BlTG9jKSwgRWxsaXBzaXNMb2MoKSwgTnVtQXJncygzKSwgU3ludGF4VXNlZChzeW50YXhVc2VkKSwKKyAgICBJbnZhbGlkKGZhbHNlKSwgVXNlZEFzVHlwZUF0dHIoZmFsc2UpLCBJc0F2YWlsYWJpbGl0eShmYWxzZSksCisgICAgSXNUeXBlVGFnRm9yRGF0YXR5cGUoZmFsc2UpLCBJc1Byb3BlcnR5KGZhbHNlKSwgSGFzUGFyc2VkVHlwZShmYWxzZSksCisgICAgTmV4dEluUG9zaXRpb24oMCksIE5leHRJblBvb2woMCkgeworICAgIEFyZ3NWZWN0b3IgQXJnczsKKyAgICBBcmdzLnB1c2hfYmFjayhQYXJtMSk7CisgICAgQXJncy5wdXNoX2JhY2soUGFybTIpOworICAgIEFyZ3MucHVzaF9iYWNrKFBhcm0zKTsKKyAgICBtZW1jcHkoZ2V0QXJnc0J1ZmZlcigpLCAmQXJnc1swXSwgMyAqIHNpemVvZihBcmdzVW5pb24pKTsKKyAgICBBdHRyS2luZCA9IGdldEtpbmQoZ2V0TmFtZSgpLCBnZXRTY29wZU5hbWUoKSwgc3ludGF4VXNlZCk7CisgIH0KKyAgCiAgIC8vLyBDb25zdHJ1Y3RvciBmb3IgdHlwZV90YWdfZm9yX2RhdGF0eXBlIGF0dHJpYnV0ZS4KICAgQXR0cmlidXRlTGlzdChJZGVudGlmaWVySW5mbyAqYXR0ck5hbWUsIFNvdXJjZVJhbmdlIGF0dHJSYW5nZSwKICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqc2NvcGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBzY29wZUxvYywKQEAgLTM2OCw0NCArMzg5LDYgQEAKICAgICByZXR1cm4gZ2V0QXJnKEFyZykuZ2V0PElkZW50aWZpZXJMb2MqPigpOwogICB9CiAKLSAgY2xhc3MgYXJnX2l0ZXJhdG9yIHsKLSAgICBBcmdzVW5pb24gY29uc3QgKlg7Ci0gICAgdW5zaWduZWQgSWR4OwotICBwdWJsaWM6Ci0gICAgYXJnX2l0ZXJhdG9yKEFyZ3NVbmlvbiBjb25zdCAqeCwgdW5zaWduZWQgaWR4KSA6IFgoeCksIElkeChpZHgpIHt9Ci0KLSAgICBhcmdfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7Ci0gICAgICArK0lkeDsKLSAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgYXJnX2l0ZXJhdG9yJiBJKSBjb25zdCB7Ci0gICAgICBhc3NlcnQgKFggPT0gSS5YICYmCi0gICAgICAgICAgICAgICJjb21wYXJlZCBhcmdfaXRlcmF0b3JzIGFyZSBmb3IgZGlmZmVyZW50IGFyZ3VtZW50IGxpc3RzIik7Ci0gICAgICByZXR1cm4gSWR4ID09IEkuSWR4OwotICAgIH0KLQotICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBhcmdfaXRlcmF0b3ImIEkpIGNvbnN0IHsKLSAgICAgIHJldHVybiAhb3BlcmF0b3I9PShJKTsKLSAgICB9Ci0KLSAgICBBcmdzVW5pb24gb3BlcmF0b3IqKCkgY29uc3QgewotICAgICAgcmV0dXJuIFhbSWR4XTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBnZXRBcmdOdW0oKSBjb25zdCB7Ci0gICAgICByZXR1cm4gSWR4KzE7Ci0gICAgfQotICB9OwotCi0gIGFyZ19pdGVyYXRvciBhcmdfYmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGFyZ19pdGVyYXRvcihnZXRBcmdzQnVmZmVyKCksIDApOwotICB9Ci0KLSAgYXJnX2l0ZXJhdG9yIGFyZ19lbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGFyZ19pdGVyYXRvcihnZXRBcmdzQnVmZmVyKCksIE51bUFyZ3MpOwotICB9Ci0KICAgY29uc3QgQXZhaWxhYmlsaXR5Q2hhbmdlICZnZXRBdmFpbGFiaWxpdHlJbnRyb2R1Y2VkKCkgY29uc3QgewogICAgIGFzc2VydChnZXRLaW5kKCkgPT0gQVRfQXZhaWxhYmlsaXR5ICYmICJOb3QgYW4gYXZhaWxhYmlsaXR5IGF0dHJpYnV0ZSIpOwogICAgIHJldHVybiBnZXRBdmFpbGFiaWxpdHlTbG90KEludHJvZHVjZWRTbG90KTsKQEAgLTQ2NCw5ICs0NDcsMjMgQEAKICAgLy8vIHRvIHByZXR0eSBwcmludCBpdHNlbGYuCiAgIHVuc2lnbmVkIGdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkgY29uc3Q7CiAKKyAgYm9vbCBpc1RhcmdldFNwZWNpZmljQXR0cigpIGNvbnN0OworICBib29sIGlzVHlwZUF0dHIoKSBjb25zdDsKKwogICBib29sIGhhc0N1c3RvbVBhcnNpbmcoKSBjb25zdDsKICAgdW5zaWduZWQgZ2V0TWluQXJncygpIGNvbnN0OwogICB1bnNpZ25lZCBnZXRNYXhBcmdzKCkgY29uc3Q7CisgIGJvb2wgZGlhZ25vc2VBcHBlcnRhaW5zVG8oY2xhc3MgU2VtYSAmUywgY29uc3QgRGVjbCAqRCkgY29uc3Q7CisgIGJvb2wgZGlhZ25vc2VMYW5nT3B0cyhjbGFzcyBTZW1hICZTKSBjb25zdDsKKyAgYm9vbCBleGlzdHNJblRhcmdldChjb25zdCBsbHZtOjpUcmlwbGUgJlQpIGNvbnN0OworICBib29sIGlzS25vd25Ub0dDQygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSWYgdGhlIHBhcnNlZCBhdHRyaWJ1dGUgaGFzIGEgc2VtYW50aWMgZXF1aXZhbGVudCwgYW5kIGl0IHdvdWxkCisgIC8vLyBoYXZlIGEgc2VtYW50aWMgU3BlbGxpbmcgZW51bWVyYXRpb24gKGR1ZSB0byBoYXZpbmcgc2VtYW50aWNhbGx5LWRpc3RpbmN0CisgIC8vLyBzcGVsbGluZyB2YXJpYXRpb25zKSwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGF0IHNlbWFudGljIHNwZWxsaW5nLiBJZiB0aGUKKyAgLy8vIHBhcnNlZCBhdHRyaWJ1dGUgZG9lcyBub3QgaGF2ZSBhIHNlbWFudGljIGVxdWl2YWxlbnQsIG9yIHdvdWxkIG5vdCBoYXZlCisgIC8vLyBhIFNwZWxsaW5nIGVudW1lcmF0aW9uLCB0aGUgdmFsdWUgVUlOVF9NQVggaXMgcmV0dXJuZWQuCisgIHVuc2lnbmVkIGdldFNlbWFudGljU3BlbGxpbmcoKSBjb25zdDsKIH07CiAKIC8vLyBBIGZhY3RvcnksIGZyb20gd2hpY2ggb25lIG1ha2VzIHBvb2xzLCBmcm9tIHdoaWNoIG9uZSBjcmVhdGVzCkBAIC02MDcsOCArNjA0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXgpKTsKICAgfQogCi0gIEF0dHJpYnV0ZUxpc3QgKmNyZWF0ZUludGVnZXJBdHRyaWJ1dGUoQVNUQ29udGV4dCAmQywgSWRlbnRpZmllckluZm8gKk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVG9rTG9jLCBpbnQgQXJnKTsKKyAgQXR0cmlidXRlTGlzdCAqY3JlYXRlKElkZW50aWZpZXJJbmZvICphdHRyTmFtZSwgU291cmNlUmFuZ2UgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKnNjb3BlTmFtZSwgU291cmNlTG9jYXRpb24gc2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyTG9jICpQYXJhbTEsCisgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyTG9jICpQYXJhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVyTG9jICpQYXJhbTMsCisgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpTeW50YXggc3ludGF4KSB7CisgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoQXR0cmlidXRlTGlzdCkgKyAzICogc2l6ZW9mKEFyZ3NVbmlvbik7CisgICAgdm9pZCAqbWVtb3J5ID0gYWxsb2NhdGUoc2l6ZSk7CisgICAgcmV0dXJuIGFkZChuZXcgKG1lbW9yeSkgQXR0cmlidXRlTGlzdChhdHRyTmFtZSwgYXR0clJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVOYW1lLCBzY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtMSwgUGFyYW0yLCBQYXJhbTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXgpKTsKKyAgfQogCiAgIEF0dHJpYnV0ZUxpc3QgKmNyZWF0ZVR5cGVUYWdGb3JEYXRhdHlwZSgKICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKmF0dHJOYW1lLCBTb3VyY2VSYW5nZSBhdHRyUmFuZ2UsCkBAIC02NDcsNDAgKzY1NSw2IEBACiAgIH0KIH07CiAKLS8vLyBhZGRBdHRyaWJ1dGVMaXN0cyAtIEFkZCB0d28gQXR0cmlidXRlTGlzdHMgdG9nZXRoZXIKLS8vLyBUaGUgcmlnaHQtaGFuZCBsaXN0IGlzIGFwcGVuZGVkIHRvIHRoZSBsZWZ0LWhhbmQgbGlzdCwgaWYgYW55Ci0vLy8gQSBwb2ludGVyIHRvIHRoZSBqb2luZWQgbGlzdCBpcyByZXR1cm5lZC4KLS8vLyBOb3RlOiB0aGUgbGlzdHMgYXJlIG5vdCBsZWZ0IHVubW9kaWZpZWQuCi1pbmxpbmUgQXR0cmlidXRlTGlzdCAqYWRkQXR0cmlidXRlTGlzdHMoQXR0cmlidXRlTGlzdCAqTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ICpSaWdodCkgewotICBpZiAoIUxlZnQpCi0gICAgcmV0dXJuIFJpZ2h0OwotCi0gIEF0dHJpYnV0ZUxpc3QgKm5leHQgPSBMZWZ0LCAqcHJldjsKLSAgZG8gewotICAgIHByZXYgPSBuZXh0OwotICAgIG5leHQgPSBuZXh0LT5nZXROZXh0KCk7Ci0gIH0gd2hpbGUgKG5leHQpOwotICBwcmV2LT5zZXROZXh0KFJpZ2h0KTsKLSAgcmV0dXJuIExlZnQ7Ci19Ci0KLS8vLyBDWFgxMUF0dHJpYnV0ZUxpc3QgLSBBIHdyYXBwZXIgYXJvdW5kIGEgQysrMTEgYXR0cmlidXRlIGxpc3QuCi0vLy8gU3RvcmVzLCBpbiBhZGRpdGlvbiB0byB0aGUgbGlzdCBwcm9wZXIsIHdoZXRoZXIgb3Igbm90IGFuIGFjdHVhbCBsaXN0IHdhcwotLy8vIChhcyBvcHBvc2VkIHRvIGFuIGVtcHR5IGxpc3QsIHdoaWNoIG1heSBiZSBpbGwtZm9ybWVkIGluIHNvbWUgcGxhY2VzKSBhbmQKLS8vLyB0aGUgc291cmNlIHJhbmdlIG9mIHRoZSBsaXN0Lgotc3RydWN0IENYWDExQXR0cmlidXRlTGlzdCB7IAotICBBdHRyaWJ1dGVMaXN0ICpBdHRyTGlzdDsKLSAgU291cmNlUmFuZ2UgUmFuZ2U7Ci0gIGJvb2wgSGFzQXR0cjsKLSAgQ1hYMTFBdHRyaWJ1dGVMaXN0IChBdHRyaWJ1dGVMaXN0ICphdHRyTGlzdCwgU291cmNlUmFuZ2UgcmFuZ2UsIGJvb2wgaGFzQXR0cikKLSAgICA6IEF0dHJMaXN0KGF0dHJMaXN0KSwgUmFuZ2UocmFuZ2UpLCBIYXNBdHRyIChoYXNBdHRyKSB7Ci0gIH0KLSAgQ1hYMTFBdHRyaWJ1dGVMaXN0ICgpCi0gICAgOiBBdHRyTGlzdCgwKSwgUmFuZ2UoKSwgSGFzQXR0cihmYWxzZSkgewotICB9Ci19OwotCiAvLy8gUGFyc2VkQXR0cmlidXRlcyAtIEEgY29sbGVjdGlvbiBvZiBwYXJzZWQgYXR0cmlidXRlcy4gIEN1cnJlbnRseQogLy8vIHdlIGRvbid0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgdmFyaW91cyBhdHRyaWJ1dGUgc3ludGF4ZXMsCiAvLy8gd2hpY2ggaXMgYmFzaWNhbGx5IHNpbGx5LgpAQCAtNjkzLDEwICs2NjcsNyBAQAogICAgIDogcG9vbChmYWN0b3J5KSwgbGlzdCgwKSB7CiAgIH0KIAotICBQYXJzZWRBdHRyaWJ1dGVzKFBhcnNlZEF0dHJpYnV0ZXMgJmF0dHJzKQotICAgIDogcG9vbChhdHRycy5wb29sKSwgbGlzdChhdHRycy5saXN0KSB7Ci0gICAgYXR0cnMubGlzdCA9IDA7Ci0gIH0KKyAgUGFyc2VkQXR0cmlidXRlcyhjb25zdCBQYXJzZWRBdHRyaWJ1dGVzICYpIExMVk1fREVMRVRFRF9GVU5DVElPTjsKIAogICBBdHRyaWJ1dGVQb29sICZnZXRQb29sKCkgY29uc3QgeyByZXR1cm4gcG9vbDsgfQogCkBAIC03NjcsNiArNzM4LDIwIEBACiAgICAgcmV0dXJuIGF0dHI7CiAgIH0KIAorICAvLy8gQWRkIG9iamNfYnJpZGdlX3JlbGF0ZWQgYXR0cmlidXRlLgorICBBdHRyaWJ1dGVMaXN0ICphZGROZXcoSWRlbnRpZmllckluZm8gKmF0dHJOYW1lLCBTb3VyY2VSYW5nZSBhdHRyUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqc2NvcGVOYW1lLCBTb3VyY2VMb2NhdGlvbiBzY29wZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcmFtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcmFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJMb2MgKlBhcmFtMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OlN5bnRheCBzeW50YXgpIHsKKyAgICBBdHRyaWJ1dGVMaXN0ICphdHRyID0KKyAgICAgIHBvb2wuY3JlYXRlKGF0dHJOYW1lLCBhdHRyUmFuZ2UsIHNjb3BlTmFtZSwgc2NvcGVMb2MsCisgICAgICAgICAgICAgICAgICBQYXJhbTEsIFBhcmFtMiwgUGFyYW0zLCBzeW50YXgpOworICAgIGFkZChhdHRyKTsKKyAgICByZXR1cm4gYXR0cjsKKyAgfQorCiAgIC8vLyBBZGQgdHlwZV90YWdfZm9yX2RhdGF0eXBlIGF0dHJpYnV0ZS4KICAgQXR0cmlidXRlTGlzdCAqYWRkTmV3VHlwZVRhZ0ZvckRhdGF0eXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKmF0dHJOYW1lLCBTb3VyY2VSYW5nZSBhdHRyUmFuZ2UsCkBAIC04MDgsMTUgKzc5Myw2IEBACiAgICAgcmV0dXJuIGF0dHI7CiAgIH0KIAotICBBdHRyaWJ1dGVMaXN0ICphZGROZXdJbnRlZ2VyKEFTVENvbnRleHQgJkMsIElkZW50aWZpZXJJbmZvICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGxvYywgaW50IGFyZykgewotICAgIEF0dHJpYnV0ZUxpc3QgKmF0dHIgPQotICAgICAgcG9vbC5jcmVhdGVJbnRlZ2VyQXR0cmlidXRlKEMsIG5hbWUsIGxvYywgYXJnKTsKLSAgICBhZGQoYXR0cik7Ci0gICAgcmV0dXJuIGF0dHI7Ci0gIH0KLQotCiBwcml2YXRlOgogICBtdXRhYmxlIEF0dHJpYnV0ZVBvb2wgcG9vbDsKICAgQXR0cmlidXRlTGlzdCAqbGlzdDsKQEAgLTgzMSw2ICs4MDcsNDEgQEAKICAgQUFOVF9Bcmd1bWVudElkZW50aWZpZXIKIH07CiAKKy8vLyBUaGVzZSBjb25zdGFudHMgbWF0Y2ggdGhlIGVudW1lcmF0ZWQgY2hvaWNlcyBvZgorLy8vIHdhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSBhbmQgZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUuCitlbnVtIEF0dHJpYnV0ZURlY2xLaW5kIHsKKyAgRXhwZWN0ZWRGdW5jdGlvbiwKKyAgRXhwZWN0ZWRVbmlvbiwKKyAgRXhwZWN0ZWRWYXJpYWJsZU9yRnVuY3Rpb24sCisgIEV4cGVjdGVkRnVuY3Rpb25Pck1ldGhvZCwKKyAgRXhwZWN0ZWRQYXJhbWV0ZXIsCisgIEV4cGVjdGVkRnVuY3Rpb25NZXRob2RPckJsb2NrLAorICBFeHBlY3RlZEZ1bmN0aW9uTWV0aG9kT3JDbGFzcywKKyAgRXhwZWN0ZWRGdW5jdGlvbk1ldGhvZE9yUGFyYW1ldGVyLAorICBFeHBlY3RlZENsYXNzLAorICBFeHBlY3RlZFZhcmlhYmxlLAorICBFeHBlY3RlZE1ldGhvZCwKKyAgRXhwZWN0ZWRWYXJpYWJsZUZ1bmN0aW9uT3JMYWJlbCwKKyAgRXhwZWN0ZWRGaWVsZE9yR2xvYmFsVmFyLAorICBFeHBlY3RlZFN0cnVjdCwKKyAgRXhwZWN0ZWRWYXJpYWJsZUZ1bmN0aW9uT3JUYWcsCisgIEV4cGVjdGVkVExTVmFyLAorICBFeHBlY3RlZFZhcmlhYmxlT3JGaWVsZCwKKyAgRXhwZWN0ZWRWYXJpYWJsZUZpZWxkT3JUYWcsCisgIEV4cGVjdGVkVHlwZU9yTmFtZXNwYWNlLAorICBFeHBlY3RlZE9iamVjdGl2ZUNJbnRlcmZhY2UsCisgIEV4cGVjdGVkTWV0aG9kT3JQcm9wZXJ0eSwKKyAgRXhwZWN0ZWRTdHJ1Y3RPclVuaW9uLAorICBFeHBlY3RlZFN0cnVjdE9yVW5pb25PckNsYXNzLAorICBFeHBlY3RlZFR5cGUsCisgIEV4cGVjdGVkT2JqQ0luc3RhbmNlTWV0aG9kLAorICBFeHBlY3RlZE9iakNJbnRlcmZhY2VEZWNsSW5pdE1ldGhvZCwKKyAgRXhwZWN0ZWRGdW5jdGlvblZhcmlhYmxlT3JDbGFzcywKKyAgRXhwZWN0ZWRPYmplY3RpdmVDUHJvdG9jb2wsCisgIEV4cGVjdGVkRnVuY3Rpb25HbG9iYWxWYXJNZXRob2RPclByb3BlcnR5LAorICBFeHBlY3RlZFN0cnVjdE9yVHlwZWRlZgorfTsKKwogfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU2VtYS9Db2RlQ29tcGxldGVDb25zdW1lci5oIGIvaW5jbHVkZS9jbGFuZy9TZW1hL0NvZGVDb21wbGV0ZUNvbnN1bWVyLmgKaW5kZXggNjRkZTgyYy4uMTFiZGI3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TZW1hL0NvZGVDb21wbGV0ZUNvbnN1bWVyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TZW1hL0NvZGVDb21wbGV0ZUNvbnN1bWVyLmgKQEAgLTk2NiwyMCArOTY2LDE5IEBACiAgICAgICBDQ1RVSW5mbyhuZXcgR2xvYmFsQ29kZUNvbXBsZXRpb25BbGxvY2F0b3IpIHt9CiAKICAgLy8vIFxicmllZiBQcmludHMgdGhlIGZpbmFsaXplZCBjb2RlLWNvbXBsZXRpb24gcmVzdWx0cy4KLSAgdmlydHVhbCB2b2lkIFByb2Nlc3NDb2RlQ29tcGxldGVSZXN1bHRzKFNlbWEgJlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlQ29tcGxldGlvbkNvbnRleHQgQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uUmVzdWx0ICpSZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVzdWx0cyk7CisgIHZvaWQgUHJvY2Vzc0NvZGVDb21wbGV0ZVJlc3VsdHMoU2VtYSAmUywgQ29kZUNvbXBsZXRpb25Db250ZXh0IENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUNvbXBsZXRpb25SZXN1bHQgKlJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVzdWx0cykgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIFByb2Nlc3NPdmVybG9hZENhbmRpZGF0ZXMoU2VtYSAmUywgdW5zaWduZWQgQ3VycmVudEFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGUgKkNhbmRpZGF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNhbmRpZGF0ZXMpOworICB2b2lkIFByb2Nlc3NPdmVybG9hZENhbmRpZGF0ZXMoU2VtYSAmUywgdW5zaWduZWQgQ3VycmVudEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkQ2FuZGlkYXRlICpDYW5kaWRhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2FuZGlkYXRlcykgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBDb2RlQ29tcGxldGlvbkFsbG9jYXRvciAmZ2V0QWxsb2NhdG9yKCkgeworICBDb2RlQ29tcGxldGlvbkFsbG9jYXRvciAmZ2V0QWxsb2NhdG9yKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBDQ1RVSW5mby5nZXRBbGxvY2F0b3IoKTsKICAgfQogCi0gIHZpcnR1YWwgQ29kZUNvbXBsZXRpb25UVUluZm8gJmdldENvZGVDb21wbGV0aW9uVFVJbmZvKCkgeyByZXR1cm4gQ0NUVUluZm87IH0KKyAgQ29kZUNvbXBsZXRpb25UVUluZm8gJmdldENvZGVDb21wbGV0aW9uVFVJbmZvKCkgb3ZlcnJpZGUgeyByZXR1cm4gQ0NUVUluZm87IH0KIH07CiAKIH0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZW1hL0RlY2xTcGVjLmggYi9pbmNsdWRlL2NsYW5nL1NlbWEvRGVjbFNwZWMuaAppbmRleCA4ZjZiZDE4Li4yY2QxMGRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1NlbWEvRGVjbFNwZWMuaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlbWEvRGVjbFNwZWMuaApAQCAtMjg1LDE0ICsyODUsNiBAQAogICBzdGF0aWMgY29uc3QgVFNUIFRTVF9hdXRvID0gY2xhbmc6OlRTVF9hdXRvOwogICBzdGF0aWMgY29uc3QgVFNUIFRTVF91bmtub3duX2FueXR5cGUgPSBjbGFuZzo6VFNUX3Vua25vd25fYW55dHlwZTsKICAgc3RhdGljIGNvbnN0IFRTVCBUU1RfYXRvbWljID0gY2xhbmc6OlRTVF9hdG9taWM7Ci0gIHN0YXRpYyBjb25zdCBUU1QgVFNUX2ltYWdlMWRfdCA9IGNsYW5nOjpUU1RfaW1hZ2UxZF90OwotICBzdGF0aWMgY29uc3QgVFNUIFRTVF9pbWFnZTFkX2FycmF5X3QgPSBjbGFuZzo6VFNUX2ltYWdlMWRfYXJyYXlfdDsKLSAgc3RhdGljIGNvbnN0IFRTVCBUU1RfaW1hZ2UxZF9idWZmZXJfdCA9IGNsYW5nOjpUU1RfaW1hZ2UxZF9idWZmZXJfdDsKLSAgc3RhdGljIGNvbnN0IFRTVCBUU1RfaW1hZ2UyZF90ID0gY2xhbmc6OlRTVF9pbWFnZTJkX3Q7Ci0gIHN0YXRpYyBjb25zdCBUU1QgVFNUX2ltYWdlMmRfYXJyYXlfdCA9IGNsYW5nOjpUU1RfaW1hZ2UyZF9hcnJheV90OwotICBzdGF0aWMgY29uc3QgVFNUIFRTVF9pbWFnZTNkX3QgPSBjbGFuZzo6VFNUX2ltYWdlM2RfdDsKLSAgc3RhdGljIGNvbnN0IFRTVCBUU1Rfc2FtcGxlcl90ID0gY2xhbmc6OlRTVF9zYW1wbGVyX3Q7Ci0gIHN0YXRpYyBjb25zdCBUU1QgVFNUX2V2ZW50X3QgPSBjbGFuZzo6VFNUX2V2ZW50X3Q7CiAgIHN0YXRpYyBjb25zdCBUU1QgVFNUX2Vycm9yID0gY2xhbmc6OlRTVF9lcnJvcjsKIAogICAvLyB0eXBlLXF1YWxpZmllcnMKQEAgLTUxNiw3ICs1MDgsOCBAQAogICBib29sIGhhc1RhZ0RlZmluaXRpb24oKSBjb25zdDsKIAogICAvLy8gXGJyaWVmIFR1cm4gYSB0eXBlLXNwZWNpZmllci10eXBlIGludG8gYSBzdHJpbmcgbGlrZSAiX0Jvb2wiIG9yICJ1bmlvbiIuCi0gIHN0YXRpYyBjb25zdCBjaGFyICpnZXRTcGVjaWZpZXJOYW1lKERlY2xTcGVjOjpUU1QgVCk7CisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRTcGVjaWZpZXJOYW1lKERlY2xTcGVjOjpUU1QgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CiAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRTcGVjaWZpZXJOYW1lKERlY2xTcGVjOjpUUSBRKTsKICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFNwZWNpZmllck5hbWUoRGVjbFNwZWM6OlRTUyBTKTsKICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFNwZWNpZmllck5hbWUoRGVjbFNwZWM6OlRTQyBDKTsKQEAgLTYwNCwzNiArNTk3LDQ1IEBACiAgIC8vLyBUT0RPOiB1c2UgYSBtb3JlIGdlbmVyYWwgYXBwcm9hY2ggdGhhdCBzdGlsbCBhbGxvd3MgdGhlc2UKICAgLy8vIGRpYWdub3N0aWNzIHRvIGJlIGlnbm9yZWQgd2hlbiBkZXNpcmVkLgogICBib29sIFNldFN0b3JhZ2VDbGFzc1NwZWMoU2VtYSAmUywgU0NTIFNDLCBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIComUHJldlNwZWMsIHVuc2lnbmVkICZEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLCB1bnNpZ25lZCAmRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CiAgIGJvb2wgU2V0U3RvcmFnZUNsYXNzU3BlY1RocmVhZChUU0NTIFRTQywgU291cmNlTG9jYXRpb24gTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLCB1bnNpZ25lZCAmRGlhZ0lEKTsKICAgYm9vbCBTZXRUeXBlU3BlY1dpZHRoKFRTVyBXLCBTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCwgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CiAgIGJvb2wgU2V0VHlwZVNwZWNDb21wbGV4KFRTQyBDLCBTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCk7CiAgIGJvb2wgU2V0VHlwZVNwZWNTaWduKFRTUyBTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCk7CiAgIGJvb2wgU2V0VHlwZVNwZWNUeXBlKFRTVCBULCBTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpOwogICBib29sIFNldFR5cGVTcGVjVHlwZShUU1QgVCwgU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBjaGFyIComUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIFBhcnNlZFR5cGUgUmVwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCwgUGFyc2VkVHlwZSBSZXAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpOwogICBib29sIFNldFR5cGVTcGVjVHlwZShUU1QgVCwgU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBjaGFyIComUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIERlY2wgKlJlcCwgYm9vbCBPd25lZCk7CisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIERlY2wgKlJlcCwgYm9vbCBPd25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CiAgIGJvb2wgU2V0VHlwZVNwZWNUeXBlKFRTVCBULCBTb3VyY2VMb2NhdGlvbiBUYWdLd0xvYywKICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGFnTmFtZUxvYywgY29uc3QgY2hhciAqJlByZXZTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRGlhZ0lELCBQYXJzZWRUeXBlIFJlcCk7CisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIFBhcnNlZFR5cGUgUmVwLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KTsKICAgYm9vbCBTZXRUeXBlU3BlY1R5cGUoVFNUIFQsIFNvdXJjZUxvY2F0aW9uIFRhZ0t3TG9jLAogICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUYWdOYW1lTG9jLCBjb25zdCBjaGFyIComUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIERlY2wgKlJlcCwgYm9vbCBPd25lZCk7CisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsIERlY2wgKlJlcCwgYm9vbCBPd25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CiAKICAgYm9vbCBTZXRUeXBlU3BlY1R5cGUoVFNUIFQsIFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgY2hhciAqJlByZXZTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRGlhZ0lELCBFeHByICpSZXApOworICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRGlhZ0lELCBFeHByICpSZXAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZwb2xpY3kpOwogICBib29sIFNldFR5cGVBbHRpVmVjVmVjdG9yKGJvb2wgaXNBbHRpVmVjVmVjdG9yLCBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywgdW5zaWduZWQgJkRpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywgdW5zaWduZWQgJkRpYWdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CiAgIGJvb2wgU2V0VHlwZUFsdGlWZWNQaXhlbChib29sIGlzQWx0aVZlY1BpeGVsLCBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywgdW5zaWduZWQgJkRpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywgdW5zaWduZWQgJkRpYWdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CiAgIGJvb2wgU2V0VHlwZUFsdGlWZWNCb29sKGJvb2wgaXNBbHRpVmVjQm9vbCwgU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIComUHJldlNwZWMsIHVuc2lnbmVkICZEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIComUHJldlNwZWMsIHVuc2lnbmVkICZEaWFnSUQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpOwogICBib29sIFNldFR5cGVTcGVjRXJyb3IoKTsKICAgdm9pZCBVcGRhdGVEZWNsUmVwKERlY2wgKlJlcCkgewogICAgIGFzc2VydChpc0RlY2xSZXAoKFRTVCkgVHlwZVNwZWNUeXBlKSk7CkBAIC03MDcsMjIgKzcwOSwxMiBAQAogICB2b2lkIGFkZEF0dHJpYnV0ZXMoQXR0cmlidXRlTGlzdCAqQUwpIHsKICAgICBBdHRycy5hZGRBbGwoQUwpOwogICB9Ci0gIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVMaXN0ICpBTCkgewotICAgIEF0dHJzLnNldChBTCk7Ci0gIH0KIAogICBib29sIGhhc0F0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiAhQXR0cnMuZW1wdHkoKTsgfQogCiAgIFBhcnNlZEF0dHJpYnV0ZXMgJmdldEF0dHJpYnV0ZXMoKSB7IHJldHVybiBBdHRyczsgfQogICBjb25zdCBQYXJzZWRBdHRyaWJ1dGVzICZnZXRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gQXR0cnM7IH0KIAotICAvLy8gXGJyaWVmIFJldHVybiB0aGUgY3VycmVudCBhdHRyaWJ1dGUgbGlzdCBhbmQgcmVtb3ZlIHRoZW0gZnJvbQotICAvLy8gdGhlIERlY2xTcGVjIHNvIHRoYXQgaXQgZG9lc24ndCBvd24gdGhlbS4KLSAgUGFyc2VkQXR0cmlidXRlcyB0YWtlQXR0cmlidXRlcygpIHsKLSAgICAvLyBUaGUgbm9uLWNvbnN0ICJjb3B5IiBjb25zdHJ1Y3RvciBjbGVhcnMgdGhlIG9wZXJhbmQgYXV0b21hdGljYWxseS4KLSAgICByZXR1cm4gQXR0cnM7Ci0gIH0KLQogICB2b2lkIHRha2VBdHRyaWJ1dGVzRnJvbShQYXJzZWRBdHRyaWJ1dGVzICZhdHRycykgewogICAgIEF0dHJzLnRha2VBbGxGcm9tKGF0dHJzKTsKICAgfQpAQCAtNzQzLDcgKzczNSw4IEBACiAgIC8vLyBGaW5pc2ggLSBUaGlzIGRvZXMgZmluYWwgYW5hbHlzaXMgb2YgdGhlIGRlY2xzcGVjLCBpc3N1aW5nIGRpYWdub3N0aWNzIGZvcgogICAvLy8gdGhpbmdzIGxpa2UgIl9JbWFnaW5hcnkiIChsYWNraW5nIGFuIEZQIHR5cGUpLiAgQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwKICAgLy8vIERlY2xTcGVjIGlzIGd1YXJhbnRlZWQgc2VsZi1jb25zaXN0ZW50LCBldmVuIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICB2b2lkIEZpbmlzaChEaWFnbm9zdGljc0VuZ2luZSAmRCwgUHJlcHJvY2Vzc29yICZQUCk7CisgIHZvaWQgRmluaXNoKERpYWdub3N0aWNzRW5naW5lICZELCBQcmVwcm9jZXNzb3IgJlBQLAorICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KTsKIAogICBjb25zdCBXcml0dGVuQnVpbHRpblNwZWNzJiBnZXRXcml0dGVuQnVpbHRpblNwZWNzKCkgY29uc3QgewogICAgIHJldHVybiB3cml0dGVuQlM7CkBAIC04MjgsOCArODIxLDggQEAKIAogICAvLyBOT1RFOiBWQysrIHRyZWF0cyBlbnVtcyBhcyBzaWduZWQsIGF2b2lkIHVzaW5nIE9iakNQcm9wZXJ0eUF0dHJpYnV0ZUtpbmQKICAgdW5zaWduZWQgUHJvcGVydHlBdHRyaWJ1dGVzIDogMTI7Ci0gIElkZW50aWZpZXJJbmZvICpHZXR0ZXJOYW1lOyAgICAvLyBnZXR0ZXIgbmFtZSBvZiBOVUxMIGlmIG5vIGdldHRlcgotICBJZGVudGlmaWVySW5mbyAqU2V0dGVyTmFtZTsgICAgLy8gc2V0dGVyIG5hbWUgb2YgTlVMTCBpZiBubyBzZXR0ZXIKKyAgSWRlbnRpZmllckluZm8gKkdldHRlck5hbWU7ICAgIC8vIGdldHRlciBuYW1lIG9yIE5VTEwgaWYgbm8gZ2V0dGVyCisgIElkZW50aWZpZXJJbmZvICpTZXR0ZXJOYW1lOyAgICAvLyBzZXR0ZXIgbmFtZSBvciBOVUxMIGlmIG5vIHNldHRlcgogfTsKIAogLy8vIFxicmllZiBSZXByZXNlbnRzIGEgQysrIHVucXVhbGlmaWVkLWlkIHRoYXQgaGFzIGJlZW4gcGFyc2VkLiAKQEAgLTExMTIsNyArMTEwNSw4IEBACiAgIH07CiAKICAgLy8vIFBhcmFtSW5mbyAtIEFuIGFycmF5IG9mIHBhcmFtaW5mbyBvYmplY3RzIGlzIGFsbG9jYXRlZCB3aGVuZXZlciBhIGZ1bmN0aW9uCi0gIC8vLyBkZWNsYXJhdG9yIGlzIHBhcnNlZC4gIFRoZXJlIGFyZSB0d28gaW50ZXJlc3Rpbmcgc3R5bGVzIG9mIGFyZ3VtZW50cyBoZXJlOgorICAvLy8gZGVjbGFyYXRvciBpcyBwYXJzZWQuICBUaGVyZSBhcmUgdHdvIGludGVyZXN0aW5nIHN0eWxlcyBvZiBwYXJhbWV0ZXJzCisgIC8vLyBoZXJlOgogICAvLy8gSyZSLXN0eWxlIGlkZW50aWZpZXIgbGlzdHMgYW5kIHBhcmFtZXRlciB0eXBlIGxpc3RzLiAgSyZSLXN0eWxlIGlkZW50aWZpZXIKICAgLy8vIGxpc3RzIHdpbGwgaGF2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaWRlbnRpZmllciwgYnV0IG5vIHR5cGUgaW5mb3JtYXRpb24uCiAgIC8vLyBQYXJhbWV0ZXIgdHlwZSBsaXN0cyB3aWxsIGhhdmUgdHlwZSBpbmZvIChpZiB0aGUgYWN0aW9ucyBtb2R1bGUgcHJvdmlkZXMKQEAgLTExNDQsNyArMTEzOCw3IEBACiAKICAgc3RydWN0IEZ1bmN0aW9uVHlwZUluZm8gOiBUeXBlSW5mb0NvbW1vbiB7CiAgICAgLy8vIGhhc1Byb3RvdHlwZSAtIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaGFkIGF0IGxlYXN0IG9uZSB0eXBlZAotICAgIC8vLyBhcmd1bWVudC4gIElmIHRoZSBmdW5jdGlvbiBpcyAoKSBvciAoYSxiLGMpLCB0aGVuIGl0IGhhcyBubyBwcm90b3R5cGUsCisgICAgLy8vIHBhcmFtZXRlci4gIElmIHRoZSBmdW5jdGlvbiBpcyAoKSBvciAoYSxiLGMpLCB0aGVuIGl0IGhhcyBubyBwcm90b3R5cGUsCiAgICAgLy8vIGFuZCBpcyB0cmVhdGVkIGFzIGEgSyZSLXN0eWxlIGZ1bmN0aW9uLgogICAgIHVuc2lnbmVkIGhhc1Byb3RvdHlwZSA6IDE7CiAKQEAgLTExNjcsOCArMTE2MSw4IEBACiAgICAgLy8vIEV4Y2VwdGlvblNwZWNUeXBlIC0gQW4gRXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGUgdmFsdWUuCiAgICAgdW5zaWduZWQgRXhjZXB0aW9uU3BlY1R5cGUgOiAzOwogCi0gICAgLy8vIERlbGV0ZUFyZ0luZm8gLSBJZiB0aGlzIGlzIHRydWUsIHdlIG5lZWQgdG8gZGVsZXRlW10gQXJnSW5mby4KLSAgICB1bnNpZ25lZCBEZWxldGVBcmdJbmZvIDogMTsKKyAgICAvLy8gRGVsZXRlUGFyYW1zIC0gSWYgdGhpcyBpcyB0cnVlLCB3ZSBuZWVkIHRvIGRlbGV0ZVtdIFBhcmFtcy4KKyAgICB1bnNpZ25lZCBEZWxldGVQYXJhbXMgOiAxOwogCiAgICAgLy8vIEhhc1RyYWlsaW5nUmV0dXJuVHlwZSAtIElmIHRoaXMgaXMgdHJ1ZSwgYSB0cmFpbGluZyByZXR1cm4gdHlwZSB3YXMKICAgICAvLy8gc3BlY2lmaWVkLgpAQCAtMTE4Myw5ICsxMTc3LDkgQEAKICAgICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSByaWdodCBwYXJlbnRoZXNpcyBpbiB0aGUgc291cmNlLgogICAgIHVuc2lnbmVkIFJQYXJlbkxvYzsKIAotICAgIC8vLyBOdW1BcmdzIC0gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGZvcm1hbCBhcmd1bWVudHMgcHJvdmlkZWQgZm9yIHRoZQorICAgIC8vLyBOdW1QYXJhbXMgLSBUaGlzIGlzIHRoZSBudW1iZXIgb2YgZm9ybWFsIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGJ5IHRoZQogICAgIC8vLyBkZWNsYXJhdG9yLgotICAgIHVuc2lnbmVkIE51bUFyZ3M7CisgICAgdW5zaWduZWQgTnVtUGFyYW1zOwogCiAgICAgLy8vIE51bUV4Y2VwdGlvbnMgLSBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdHlwZXMgaW4gdGhlIGR5bmFtaWMtZXhjZXB0aW9uLQogICAgIC8vLyBkZWNsLCBpZiB0aGUgZnVuY3Rpb24gaGFzIG9uZS4KQEAgLTEyMTMsMTAgKzEyMDcsMTAgQEAKICAgICAvLy8gXGJyaWVmIFRoZSBsb2NhdGlvbiBvZiB0aGUga2V5d29yZCBpbnRyb2R1Y2luZyB0aGUgc3BlYywgaWYgYW55LgogICAgIHVuc2lnbmVkIEV4Y2VwdGlvblNwZWNMb2M7CiAKLSAgICAvLy8gQXJnSW5mbyAtIFRoaXMgaXMgYSBwb2ludGVyIHRvIGEgbmV3W10nZCBhcnJheSBvZiBQYXJhbUluZm8gb2JqZWN0cyB0aGF0Ci0gICAgLy8vIGRlc2NyaWJlIHRoZSBhcmd1bWVudHMgZm9yIHRoaXMgZnVuY3Rpb24gZGVjbGFyYXRvci4gIFRoaXMgaXMgbnVsbCBpZgotICAgIC8vLyB0aGVyZSBhcmUgbm8gYXJndW1lbnRzIHNwZWNpZmllZC4KLSAgICBQYXJhbUluZm8gKkFyZ0luZm87CisgICAgLy8vIFBhcmFtcyAtIFRoaXMgaXMgYSBwb2ludGVyIHRvIGEgbmV3W10nZCBhcnJheSBvZiBQYXJhbUluZm8gb2JqZWN0cyB0aGF0CisgICAgLy8vIGRlc2NyaWJlIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBieSB0aGlzIGZ1bmN0aW9uIGRlY2xhcmF0b3IuICBudWxsIGlmCisgICAgLy8vIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzIHNwZWNpZmllZC4KKyAgICBQYXJhbUluZm8gKlBhcmFtczsKIAogICAgIHVuaW9uIHsKICAgICAgIC8vLyBcYnJpZWYgUG9pbnRlciB0byBhIG5ld1tdJ2QgYXJyYXkgb2YgVHlwZUFuZFJhbmdlIG9iamVjdHMgdGhhdApAQCAtMTIzMywzMCArMTIyNywyOCBAQAogICAgIC8vLyB0eXBlIHNwZWNpZmllZC4KICAgICBVbmlvblBhcnNlZFR5cGUgVHJhaWxpbmdSZXR1cm5UeXBlOwogCi0gICAgLy8vIFxicmllZiBSZXNldCB0aGUgYXJndW1lbnQgbGlzdCB0byBoYXZpbmcgemVybyBhcmd1bWVudHMuCisgICAgLy8vIFxicmllZiBSZXNldCB0aGUgcGFyYW1ldGVyIGxpc3QgdG8gaGF2aW5nIHplcm8gcGFyYW1ldGVycy4KICAgICAvLy8KICAgICAvLy8gVGhpcyBpcyB1c2VkIGluIHZhcmlvdXMgcGxhY2VzIGZvciBlcnJvciByZWNvdmVyeS4KLSAgICB2b2lkIGZyZWVBcmdzKCkgewotICAgICAgaWYgKERlbGV0ZUFyZ0luZm8pIHsKLSAgICAgICAgZGVsZXRlW10gQXJnSW5mbzsKLSAgICAgICAgRGVsZXRlQXJnSW5mbyA9IGZhbHNlOworICAgIHZvaWQgZnJlZVBhcmFtcygpIHsKKyAgICAgIGlmIChEZWxldGVQYXJhbXMpIHsKKyAgICAgICAgZGVsZXRlW10gUGFyYW1zOworICAgICAgICBEZWxldGVQYXJhbXMgPSBmYWxzZTsKICAgICAgIH0KLSAgICAgIE51bUFyZ3MgPSAwOworICAgICAgTnVtUGFyYW1zID0gMDsKICAgICB9CiAKICAgICB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICBpZiAoRGVsZXRlQXJnSW5mbykKLSAgICAgICAgZGVsZXRlW10gQXJnSW5mbzsKKyAgICAgIGlmIChEZWxldGVQYXJhbXMpCisgICAgICAgIGRlbGV0ZVtdIFBhcmFtczsKICAgICAgIGlmIChnZXRFeGNlcHRpb25TcGVjVHlwZSgpID09IEVTVF9EeW5hbWljKQogICAgICAgICBkZWxldGVbXSBFeGNlcHRpb25zOwogICAgIH0KIAogICAgIC8vLyBpc0tOUlByb3RvdHlwZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBLJlIgc3R5bGUgaWRlbnRpZmllciBsaXN0LAogICAgIC8vLyBsaWtlICJ2b2lkIGZvbyhhLGIsYykiLiAgSW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uLCB0aGlzIHdpbGwgYmUgZm9sbG93ZWQKLSAgICAvLy8gYnkgdGhlIGFyZ3VtZW50IHR5cGUgZGVmaW5pdGlvbnMuCi0gICAgYm9vbCBpc0tOUlByb3RvdHlwZSgpIGNvbnN0IHsKLSAgICAgIHJldHVybiAhaGFzUHJvdG90eXBlICYmIE51bUFyZ3MgIT0gMDsKLSAgICB9CisgICAgLy8vIGJ5IHRoZSBwYXJhbWV0ZXIgdHlwZSBkZWZpbml0aW9ucy4KKyAgICBib29sIGlzS05SUHJvdG90eXBlKCkgY29uc3QgeyByZXR1cm4gIWhhc1Byb3RvdHlwZSAmJiBOdW1QYXJhbXMgIT0gMDsgfQogCiAgICAgU291cmNlTG9jYXRpb24gZ2V0TFBhcmVuTG9jKCkgY29uc3QgewogICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoTFBhcmVuTG9jKTsKQEAgLTE0MjUsNyArMTQxNyw3IEBACiAgIHN0YXRpYyBEZWNsYXJhdG9yQ2h1bmsgZ2V0RnVuY3Rpb24oYm9vbCBoYXNQcm90bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQW1iaWd1b3VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbUluZm8gKkFyZ0luZm8sIHVuc2lnbmVkIE51bUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1JbmZvICpQYXJhbXMsIHVuc2lnbmVkIE51bVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVHlwZVF1YWxzLApAQCAtMjEzOSw2ICsyMTMxLDggQEAKICAgYm9vbCBTZXRTcGVjaWZpZXIoU3BlY2lmaWVyIFZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYyk7CiAKKyAgYm9vbCBpc1Vuc2V0KCkgY29uc3QgeyByZXR1cm4gU3BlY2lmaWVycyA9PSAwOyB9CisKICAgYm9vbCBpc092ZXJyaWRlU3BlY2lmaWVkKCkgY29uc3QgeyByZXR1cm4gU3BlY2lmaWVycyAmIFZTX092ZXJyaWRlOyB9CiAgIFNvdXJjZUxvY2F0aW9uIGdldE92ZXJyaWRlTG9jKCkgY29uc3QgeyByZXR1cm4gVlNfb3ZlcnJpZGVMb2M7IH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZW1hL0RlbGF5ZWREaWFnbm9zdGljLmggYi9pbmNsdWRlL2NsYW5nL1NlbWEvRGVsYXllZERpYWdub3N0aWMuaAppbmRleCA0ZjRhODdmLi45YTA1NDFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1NlbWEvRGVsYXllZERpYWdub3N0aWMuaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlbWEvRGVsYXllZERpYWdub3N0aWMuaApAQCAtMTEzLDcgKzExMyw3IEBACiAvLy8gdGhlIGNvbXBsZXRlIHBhcnNpbmcgb2YgdGhlIGN1cnJlbnQgZGVjbGFyYXRpb24uCiBjbGFzcyBEZWxheWVkRGlhZ25vc3RpYyB7CiBwdWJsaWM6Ci0gIGVudW0gRERLaW5kIHsgRGVwcmVjYXRpb24sIEFjY2VzcywgRm9yYmlkZGVuVHlwZSB9OworICBlbnVtIERES2luZCB7IERlcHJlY2F0aW9uLCBVbmF2YWlsYWJsZSwgQWNjZXNzLCBGb3JiaWRkZW5UeXBlIH07CiAKICAgdW5zaWduZWQgY2hhciBLaW5kOyAvLyBhY3R1YWxseSBhIERES2luZAogICBib29sIFRyaWdnZXJlZDsKQEAgLTEyMiwxMSArMTIyLDEzIEBACiAKICAgdm9pZCBEZXN0cm95KCk7CiAKLSAgc3RhdGljIERlbGF5ZWREaWFnbm9zdGljIG1ha2VEZXByZWNhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgIGNvbnN0IE5hbWVkRGVjbCAqRCwKLSAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKlVua25vd25PYmpDQ2xhc3MsCi0gICAgICAgICAgIGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgICpPYmpDUHJvcGVydHksCi0gICAgICAgICAgIFN0cmluZ1JlZiBNc2cpOworICBzdGF0aWMgRGVsYXllZERpYWdub3N0aWMgbWFrZUF2YWlsYWJpbGl0eShTZW1hOjpBdmFpbGFiaWxpdHlEaWFnbm9zdGljIEFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVkRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKlVua25vd25PYmpDQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgICpPYmpDUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNc2cpOworCiAKICAgc3RhdGljIERlbGF5ZWREaWFnbm9zdGljIG1ha2VBY2Nlc3MoU291cmNlTG9jYXRpb24gTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBY2Nlc3NlZEVudGl0eSAmRW50aXR5KSB7CkBAIC0xNjIsMTIgKzE2NCwxNCBAQAogICB9CiAKICAgY29uc3QgTmFtZWREZWNsICpnZXREZXByZWNhdGlvbkRlY2woKSBjb25zdCB7Ci0gICAgYXNzZXJ0KEtpbmQgPT0gRGVwcmVjYXRpb24gJiYgIk5vdCBhIGRlcHJlY2F0aW9uIGRpYWdub3N0aWMuIik7CisgICAgYXNzZXJ0KChLaW5kID09IERlcHJlY2F0aW9uIHx8IEtpbmQgPT0gVW5hdmFpbGFibGUpICYmCisgICAgICAgICAgICJOb3QgYSBkZXByZWNhdGlvbiBkaWFnbm9zdGljLiIpOwogICAgIHJldHVybiBEZXByZWNhdGlvbkRhdGEuRGVjbDsKICAgfQogCiAgIFN0cmluZ1JlZiBnZXREZXByZWNhdGlvbk1lc3NhZ2UoKSBjb25zdCB7Ci0gICAgYXNzZXJ0KEtpbmQgPT0gRGVwcmVjYXRpb24gJiYgIk5vdCBhIGRlcHJlY2F0aW9uIGRpYWdub3N0aWMuIik7CisgICAgYXNzZXJ0KChLaW5kID09IERlcHJlY2F0aW9uIHx8IEtpbmQgPT0gVW5hdmFpbGFibGUpICYmCisgICAgICAgICAgICJOb3QgYSBkZXByZWNhdGlvbiBkaWFnbm9zdGljLiIpOwogICAgIHJldHVybiBTdHJpbmdSZWYoRGVwcmVjYXRpb25EYXRhLk1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbkRhdGEuTWVzc2FnZUxlbik7CiAgIH0KQEAgLTI1Nyw3ICsyNjEsNyBAQAogICAgIGlmIChwb29sLkRpYWdub3N0aWNzLmVtcHR5KCkpIHJldHVybjsKIAogICAgIGlmIChEaWFnbm9zdGljcy5lbXB0eSgpKSB7Ci0gICAgICBEaWFnbm9zdGljcyA9IGxsdm1fbW92ZShwb29sLkRpYWdub3N0aWNzKTsKKyAgICAgIERpYWdub3N0aWNzID0gc3RkOjptb3ZlKHBvb2wuRGlhZ25vc3RpY3MpOwogICAgIH0gZWxzZSB7CiAgICAgICBEaWFnbm9zdGljcy5hcHBlbmQocG9vbC5wb29sX2JlZ2luKCksIHBvb2wucG9vbF9lbmQoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZW1hL0lkZW50aWZpZXJSZXNvbHZlci5oIGIvaW5jbHVkZS9jbGFuZy9TZW1hL0lkZW50aWZpZXJSZXNvbHZlci5oCmluZGV4IDk5ZDk0YTEuLmFiZTk3NGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU2VtYS9JZGVudGlmaWVyUmVzb2x2ZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlbWEvSWRlbnRpZmllclJlc29sdmVyLmgKQEAgLTE1MCwxMSArMTUwLDE0IEBACiAgIC8vLyBpZiAnRCcgaXMgaW4gU2NvcGUgJ1MnLCBvdGhlcndpc2UgJ1MnIGlzIGlnbm9yZWQgYW5kIGlzRGVjbEluU2NvcGUgcmV0dXJucwogICAvLy8gdHJ1ZSBpZiAnRCcgYmVsb25ncyB0byB0aGUgZ2l2ZW4gZGVjbGFyYXRpb24gY29udGV4dC4KICAgLy8vCi0gIC8vLyBccGFyYW0gRXhwbGljaXRJbnN0YW50aWF0aW9uT3JTcGVjaWFsaXphdGlvbiBXaGVuIHRydWUsIHdlIGFyZSBjaGVja2luZwotICAvLy8gd2hldGhlciB0aGUgZGVjbGFyYXRpb24gaXMgaW4gc2NvcGUgZm9yIHRoZSBwdXJwb3NlcyBvZiBleHBsaWNpdCB0ZW1wbGF0ZQotICAvLy8gaW5zdGFudGlhdGlvbiBvciBzcGVjaWFsaXphdGlvbi4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCisgIC8vLyBccGFyYW0gQWxsb3dJbmxpbmVOYW1lc3BhY2UgSWYgXGMgdHJ1ZSwgd2UgYXJlIGNoZWNraW5nIHdoZXRoZXIgYSBwcmlvcgorICAvLy8gICAgICAgIGRlY2xhcmF0aW9uIGlzIGluIHNjb3BlIGluIGEgZGVjbGFyYXRpb24gdGhhdCByZXF1aXJlcyBhIHByaW9yCisgIC8vLyAgICAgICAgZGVjbGFyYXRpb24gKGJlY2F1c2UgaXQgaXMgZWl0aGVyIGV4cGxpY2l0bHkgcXVhbGlmaWVkIG9yIGlzIGEKKyAgLy8vICAgICAgICB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIG9yIHNwZWNpYWxpemF0aW9uKS4gSW4gdGhpcyBjYXNlLCBhCisgIC8vLyAgICAgICAgZGVjbGFyYXRpb24gaXMgaW4gc2NvcGUgaWYgaXQncyBpbiB0aGUgaW5saW5lIG5hbWVzcGFjZSBzZXQgb2YgdGhlCisgIC8vLyAgICAgICAgY29udGV4dC4KICAgYm9vbCBpc0RlY2xJblNjb3BlKERlY2wgKkQsIERlY2xDb250ZXh0ICpDdHgsIFNjb3BlICpTID0gMCwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwbGljaXRJbnN0YW50aWF0aW9uT3JTcGVjaWFsaXphdGlvbiA9IGZhbHNlKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dJbmxpbmVOYW1lc3BhY2UgPSBmYWxzZSkgY29uc3Q7CiAKICAgLy8vIEFkZERlY2wgLSBMaW5rIHRoZSBkZWNsIHRvIGl0cyBzaGFkb3dlZCBkZWNsIGNoYWluLgogICB2b2lkIEFkZERlY2woTmFtZWREZWNsICpEKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU2VtYS9Mb29rdXAuaCBiL2luY2x1ZGUvY2xhbmcvU2VtYS9Mb29rdXAuaAppbmRleCAxMDVjODc5Li4wMzY0M2IwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1NlbWEvTG9va3VwLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TZW1hL0xvb2t1cC5oCkBAIC0yNTksNyArMjU5LDcgQEAKICAgfQogCiAgIExvb2t1cFJlc3VsdEtpbmQgZ2V0UmVzdWx0S2luZCgpIGNvbnN0IHsKLSAgICBzYW5pdHkoKTsKKyAgICBhc3NlcnQoc2FuaXR5KCkpOwogICAgIHJldHVybiBSZXN1bHRLaW5kOwogICB9CiAKQEAgLTYzNywxMyArNjM3LDcgQEAKICAgdm9pZCBjb25maWd1cmUoKTsKIAogICAvLyBTYW5pdHkgY2hlY2tzLgotICB2b2lkIHNhbml0eUltcGwoKSBjb25zdDsKLQotICB2b2lkIHNhbml0eSgpIGNvbnN0IHsKLSNpZm5kZWYgTkRFQlVHCi0gICAgc2FuaXR5SW1wbCgpOwotI2VuZGlmCi0gIH0KKyAgYm9vbCBzYW5pdHkoKSBjb25zdDsKIAogICBib29sIHNhbml0eUNoZWNrVW5yZXNvbHZlZCgpIGNvbnN0IHsKICAgICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZW1hL011bHRpcGxleEV4dGVybmFsU2VtYVNvdXJjZS5oIGIvaW5jbHVkZS9jbGFuZy9TZW1hL011bHRpcGxleEV4dGVybmFsU2VtYVNvdXJjZS5oCmluZGV4IGU5YmE0NzkuLjFmNTE3ZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU2VtYS9NdWx0aXBsZXhFeHRlcm5hbFNlbWFTb3VyY2UuaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlbWEvTXVsdGlwbGV4RXh0ZXJuYWxTZW1hU291cmNlLmgKQEAgLTY1LDMxICs2NSwzMSBAQAogCiAgIC8vLyBcYnJpZWYgUmVzb2x2ZSBhIGRlY2xhcmF0aW9uIElEIGludG8gYSBkZWNsYXJhdGlvbiwgcG90ZW50aWFsbHkKICAgLy8vIGJ1aWxkaW5nIGEgbmV3IGRlY2xhcmF0aW9uLgotICB2aXJ0dWFsIERlY2wgKkdldEV4dGVybmFsRGVjbCh1aW50MzJfdCBJRCk7CisgIERlY2wgKkdldEV4dGVybmFsRGVjbCh1aW50MzJfdCBJRCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZXNvbHZlIGEgc2VsZWN0b3IgSUQgaW50byBhIHNlbGVjdG9yLgotICB2aXJ0dWFsIFNlbGVjdG9yIEdldEV4dGVybmFsU2VsZWN0b3IodWludDMyX3QgSUQpOworICBTZWxlY3RvciBHZXRFeHRlcm5hbFNlbGVjdG9yKHVpbnQzMl90IElEKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMga25vd24gdG8gdGhlIGV4dGVybmFsIEFTVAogICAvLy8gc291cmNlLgotICB2aXJ0dWFsIHVpbnQzMl90IEdldE51bUV4dGVybmFsU2VsZWN0b3JzKCk7CisgIHVpbnQzMl90IEdldE51bUV4dGVybmFsU2VsZWN0b3JzKCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZXNvbHZlIHRoZSBvZmZzZXQgb2YgYSBzdGF0ZW1lbnQgaW4gdGhlIGRlY2wgc3RyZWFtIGludG8KICAgLy8vIGEgc3RhdGVtZW50LgotICB2aXJ0dWFsIFN0bXQgKkdldEV4dGVybmFsRGVjbFN0bXQodWludDY0X3QgT2Zmc2V0KTsKKyAgU3RtdCAqR2V0RXh0ZXJuYWxEZWNsU3RtdCh1aW50NjRfdCBPZmZzZXQpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgUmVzb2x2ZSB0aGUgb2Zmc2V0IG9mIGEgc2V0IG9mIEMrKyBiYXNlIHNwZWNpZmllcnMgaW4gdGhlIGRlY2wKICAgLy8vIHN0cmVhbSBpbnRvIGFuIGFycmF5IG9mIHNwZWNpZmllcnMuCi0gIHZpcnR1YWwgQ1hYQmFzZVNwZWNpZmllciAqR2V0RXh0ZXJuYWxDWFhCYXNlU3BlY2lmaWVycyh1aW50NjRfdCBPZmZzZXQpOworICBDWFhCYXNlU3BlY2lmaWVyICpHZXRFeHRlcm5hbENYWEJhc2VTcGVjaWZpZXJzKHVpbnQ2NF90IE9mZnNldCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBGaW5kIGFsbCBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUKICAgLy8vIGdpdmVuIGNvbnRleHQuCi0gIHZpcnR1YWwgYm9vbAotICBGaW5kRXh0ZXJuYWxWaXNpYmxlRGVjbHNCeU5hbWUoY29uc3QgRGVjbENvbnRleHQgKkRDLCBEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisgIGJvb2wKKyAgRmluZEV4dGVybmFsVmlzaWJsZURlY2xzQnlOYW1lKGNvbnN0IERlY2xDb250ZXh0ICpEQywgRGVjbGFyYXRpb25OYW1lIE5hbWUpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgRW5zdXJlcyB0aGF0IHRoZSB0YWJsZSBvZiBhbGwgdmlzaWJsZSBkZWNsYXJhdGlvbnMgaW5zaWRlIHRoaXMKICAgLy8vIGNvbnRleHQgaXMgdXAgdG8gZGF0ZS4KLSAgdmlydHVhbCB2b2lkIGNvbXBsZXRlVmlzaWJsZURlY2xzTWFwKGNvbnN0IERlY2xDb250ZXh0ICpEQyk7CisgIHZvaWQgY29tcGxldGVWaXNpYmxlRGVjbHNNYXAoY29uc3QgRGVjbENvbnRleHQgKkRDKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIEZpbmRzIGFsbCBkZWNsYXJhdGlvbnMgbGV4aWNhbGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIGdpdmVuCiAgIC8vLyBEZWNsQ29udGV4dCwgYWZ0ZXIgYXBwbHlpbmcgYW4gb3B0aW9uYWwgZmlsdGVyIHByZWRpY2F0ZS4KQEAgLTk5LDkgKzk5LDkgQEAKICAgLy8vIGFyZSByZXR1cm5lZC4KICAgLy8vCiAgIC8vLyBccmV0dXJuIGFuIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGUgbG9hZCBzdWNjZWVkZWQgb3IgZmFpbGVkLgotICB2aXJ0dWFsIEV4dGVybmFsTG9hZFJlc3VsdCBGaW5kRXh0ZXJuYWxMZXhpY2FsRGVjbHMoY29uc3QgRGVjbENvbnRleHQgKkRDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc0tpbmRXZVdhbnQpKERlY2w6OktpbmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxEZWNsKj4gJlJlc3VsdCk7CisgIEV4dGVybmFsTG9hZFJlc3VsdCBGaW5kRXh0ZXJuYWxMZXhpY2FsRGVjbHMoY29uc3QgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqaXNLaW5kV2VXYW50KShEZWNsOjpLaW5kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wqPiAmUmVzdWx0KSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIEZpbmRzIGFsbCBkZWNsYXJhdGlvbnMgbGV4aWNhbGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIGdpdmVuCiAgIC8vLyBEZWNsQ29udGV4dC4KQEAgLTEyMSwxMiArMTIxLDEyIEBACiAgIC8vLyBcYnJpZWYgR2V0IHRoZSBkZWNscyB0aGF0IGFyZSBjb250YWluZWQgaW4gYSBmaWxlIGluIHRoZSBPZmZzZXQvTGVuZ3RoCiAgIC8vLyByYW5nZS4gXHAgTGVuZ3RoIGNhbiBiZSAwIHRvIGluZGljYXRlIGEgcG9pbnQgYXQgXHAgT2Zmc2V0IGluc3RlYWQgb2YKICAgLy8vIGEgcmFuZ2UuIAotICB2aXJ0dWFsIHZvaWQgRmluZEZpbGVSZWdpb25EZWNscyhGaWxlSUQgRmlsZSwgdW5zaWduZWQgT2Zmc2V0LHVuc2lnbmVkIExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJkRlY2xzKTsKKyAgdm9pZCBGaW5kRmlsZVJlZ2lvbkRlY2xzKEZpbGVJRCBGaWxlLCB1bnNpZ25lZCBPZmZzZXQsdW5zaWduZWQgTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPERlY2wgKj4gJkRlY2xzKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIEdpdmVzIHRoZSBleHRlcm5hbCBBU1Qgc291cmNlIGFuIG9wcG9ydHVuaXR5IHRvIGNvbXBsZXRlCiAgIC8vLyBhbiBpbmNvbXBsZXRlIHR5cGUuCi0gIHZpcnR1YWwgdm9pZCBDb21wbGV0ZVR5cGUoVGFnRGVjbCAqVGFnKTsKKyAgdm9pZCBDb21wbGV0ZVR5cGUoVGFnRGVjbCAqVGFnKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIEdpdmVzIHRoZSBleHRlcm5hbCBBU1Qgc291cmNlIGFuIG9wcG9ydHVuaXR5IHRvIGNvbXBsZXRlIGFuCiAgIC8vLyBpbmNvbXBsZXRlIE9iamVjdGl2ZS1DIGNsYXNzLgpAQCAtMTM0LDI3ICsxMzQsMjcgQEAKICAgLy8vIFRoaXMgcm91dGluZSB3aWxsIG9ubHkgYmUgaW52b2tlZCBpZiB0aGUgImV4dGVybmFsbHkgY29tcGxldGVkIiBiaXQgaXMKICAgLy8vIHNldCBvbiB0aGUgT2JqQ0ludGVyZmFjZURlY2wgdmlhIHRoZSBmdW5jdGlvbiAKICAgLy8vIFxjIE9iakNJbnRlcmZhY2VEZWNsOjpzZXRFeHRlcm5hbGx5Q29tcGxldGVkKCkuCi0gIHZpcnR1YWwgdm9pZCBDb21wbGV0ZVR5cGUoT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzKTsKKyAgdm9pZCBDb21wbGV0ZVR5cGUoT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIExvYWRzIGNvbW1lbnQgcmFuZ2VzLgotICB2aXJ0dWFsIHZvaWQgUmVhZENvbW1lbnRzKCk7CisgIHZvaWQgUmVhZENvbW1lbnRzKCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBOb3RpZnkgRXh0ZXJuYWxBU1RTb3VyY2UgdGhhdCB3ZSBzdGFydGVkIGRlc2VyaWFsaXphdGlvbiBvZgogICAvLy8gYSBkZWNsIG9yIHR5cGUgc28gdW50aWwgRmluaXNoZWREZXNlcmlhbGl6aW5nIGlzIGNhbGxlZCB0aGVyZSBtYXkgYmUKICAgLy8vIGRlY2xzIHRoYXQgYXJlIGluaXRpYWxpemluZy4gTXVzdCBiZSBwYWlyZWQgd2l0aCBGaW5pc2hlZERlc2VyaWFsaXppbmcuCi0gIHZpcnR1YWwgdm9pZCBTdGFydGVkRGVzZXJpYWxpemluZygpOworICB2b2lkIFN0YXJ0ZWREZXNlcmlhbGl6aW5nKCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBOb3RpZnkgRXh0ZXJuYWxBU1RTb3VyY2UgdGhhdCB3ZSBmaW5pc2hlZCB0aGUgZGVzZXJpYWxpemF0aW9uIG9mCiAgIC8vLyBhIGRlY2wgb3IgdHlwZS4gTXVzdCBiZSBwYWlyZWQgd2l0aCBTdGFydGVkRGVzZXJpYWxpemluZy4KLSAgdmlydHVhbCB2b2lkIEZpbmlzaGVkRGVzZXJpYWxpemluZygpOworICB2b2lkIEZpbmlzaGVkRGVzZXJpYWxpemluZygpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgRnVuY3Rpb24gdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiB3ZSBiZWdpbiBwYXJzaW5nIGEgbmV3CiAgIC8vLyB0cmFuc2xhdGlvbiB1bml0IGludm9sdmluZyB0aGlzIGV4dGVybmFsIEFTVCBzb3VyY2UuCi0gIHZpcnR1YWwgdm9pZCBTdGFydFRyYW5zbGF0aW9uVW5pdChBU1RDb25zdW1lciAqQ29uc3VtZXIpOworICB2b2lkIFN0YXJ0VHJhbnNsYXRpb25Vbml0KEFTVENvbnN1bWVyICpDb25zdW1lcikgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBQcmludCBhbnkgc3RhdGlzdGljcyB0aGF0IGhhdmUgYmVlbiBnYXRoZXJlZCByZWdhcmRpbmcKICAgLy8vIHRoZSBleHRlcm5hbCBBU1Qgc291cmNlLgotICB2aXJ0dWFsIHZvaWQgUHJpbnRTdGF0cygpOworICB2b2lkIFByaW50U3RhdHMoKSBvdmVycmlkZTsKICAgCiAgIAogICAvLy8gXGJyaWVmIFBlcmZvcm0gbGF5b3V0IG9uIHRoZSBnaXZlbiByZWNvcmQuCkBAIC0xODQsMTYgKzE4NCwxNyBAQAogICAvLy8gYmUgbGFpZCBvdXQgYWNjb3JkaW5nIHRvIHRoZSBBQkkuCiAgIC8vLyAKICAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIHJlY29yZCBsYXlvdXQgd2FzIHByb3ZpZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gIHZpcnR1YWwgYm9vbCAKKyAgYm9vbAogICBsYXlvdXRSZWNvcmRUeXBlKGNvbnN0IFJlY29yZERlY2wgKlJlY29yZCwKICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAmU2l6ZSwgdWludDY0X3QgJkFsaWdubWVudCwKICAgICAgICAgICAgICAgICAgICBsbHZtOjpEZW5zZU1hcDxjb25zdCBGaWVsZERlY2wgKiwgdWludDY0X3Q+ICZGaWVsZE9mZnNldHMsCiAgICAgICAgICAgICAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IENYWFJlY29yZERlY2wgKiwgQ2hhclVuaXRzPiAmQmFzZU9mZnNldHMsCi0gICAgICAgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCBDaGFyVW5pdHM+ICZWaXJ0dWFsQmFzZU9mZnNldHMpOworICAgICAgICAgICAgICAgICBsbHZtOjpEZW5zZU1hcDxjb25zdCBDWFhSZWNvcmREZWNsICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cz4gJlZpcnR1YWxCYXNlT2Zmc2V0cykgb3ZlcnJpZGU7CiAKICAgLy8vIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGJ5IG1lbW9yeSBidWZmZXJzLCBicmVha2luZyBkb3duCiAgIC8vLyBieSBoZWFwLWJhY2tlZCB2ZXJzdXMgbW1hcCdlZCBtZW1vcnkuCi0gIHZpcnR1YWwgdm9pZCBnZXRNZW1vcnlCdWZmZXJTaXplcyhNZW1vcnlCdWZmZXJTaXplcyAmc2l6ZXMpIGNvbnN0OworICB2b2lkIGdldE1lbW9yeUJ1ZmZlclNpemVzKE1lbW9yeUJ1ZmZlclNpemVzICZzaXplcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAgIC8vIEV4dGVybmFsU2VtYVNvdXJjZS4KQEAgLTIwMiwyNCArMjAzLDI1IEBACiAgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZSB0aGUgc2VtYW50aWMgc291cmNlIHdpdGggdGhlIFNlbWEgaW5zdGFuY2UKICAgLy8vIGJlaW5nIHVzZWQgdG8gcGVyZm9ybSBzZW1hbnRpYyBhbmFseXNpcyBvbiB0aGUgYWJzdHJhY3Qgc3ludGF4CiAgIC8vLyB0cmVlLgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZVNlbWEoU2VtYSAmUyk7CisgIHZvaWQgSW5pdGlhbGl6ZVNlbWEoU2VtYSAmUykgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBJbmZvcm0gdGhlIHNlbWFudGljIGNvbnN1bWVyIHRoYXQgU2VtYSBpcyBubyBsb25nZXIgYXZhaWxhYmxlLgotICB2aXJ0dWFsIHZvaWQgRm9yZ2V0U2VtYSgpOworICB2b2lkIEZvcmdldFNlbWEoKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBnbG9iYWwgbWV0aG9kIHBvb2wgZm9yIGEgZ2l2ZW4KICAgLy8vIHNlbGVjdG9yLgotICB2aXJ0dWFsIHZvaWQgUmVhZE1ldGhvZFBvb2woU2VsZWN0b3IgU2VsKTsKKyAgdm9pZCBSZWFkTWV0aG9kUG9vbChTZWxlY3RvciBTZWwpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgTG9hZCB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCBhcmUga25vd24gdG8gdGhlIGV4dGVybmFsIHNvdXJjZSwKICAgLy8vIHdoaWNoIHdpbGwgYmUgdXNlZCBkdXJpbmcgdHlwbyBjb3JyZWN0aW9uLgotICB2aXJ0dWFsIHZvaWQgUmVhZEtub3duTmFtZXNwYWNlcyhTbWFsbFZlY3RvckltcGw8TmFtZXNwYWNlRGVjbCo+ICZOYW1lc3BhY2VzKTsKKyAgdm9pZAorICBSZWFkS25vd25OYW1lc3BhY2VzKFNtYWxsVmVjdG9ySW1wbDxOYW1lc3BhY2VEZWNsKj4gJk5hbWVzcGFjZXMpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgTG9hZCB0aGUgc2V0IG9mIHVzZWQgYnV0IG5vdCBkZWZpbmVkIGZ1bmN0aW9ucyBvciB2YXJpYWJsZXMgd2l0aAogICAvLy8gaW50ZXJuYWwgbGlua2FnZSwgb3IgdXNlZCBidXQgbm90IGRlZmluZWQgaW5saW5lIGZ1bmN0aW9ucy4KLSAgdmlydHVhbCB2b2lkIFJlYWRVbmRlZmluZWRCdXRVc2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkRlbnNlTWFwPE5hbWVkRGVjbCosIFNvdXJjZUxvY2F0aW9uPiAmVW5kZWZpbmVkKTsKLSAgCisgIHZvaWQgUmVhZFVuZGVmaW5lZEJ1dFVzZWQoCisgICAgICAgICAgICAgICAgbGx2bTo6RGVuc2VNYXA8TmFtZWREZWNsKiwgU291cmNlTG9jYXRpb24+ICZVbmRlZmluZWQpIG92ZXJyaWRlOworCiAgIC8vLyBcYnJpZWYgRG8gbGFzdCByZXNvcnQsIHVucXVhbGlmaWVkIGxvb2t1cCBvbiBhIExvb2t1cFJlc3VsdCB0aGF0CiAgIC8vLyBTZW1hIGNhbm5vdCBmaW5kLgogICAvLy8KQEAgLTIyOCw3ICsyMzAsNyBAQAogICAvLy8gXHBhcmFtIFMgdGhlIFNjb3BlIG9mIHRoZSBpZGVudGlmaWVyIG9jY3VycmVuY2UuCiAgIC8vLwogICAvLy8gXHJldHVybiB0cnVlIHRvIHRlbGwgU2VtYSB0byByZWNvdmVyIHVzaW5nIHRoZSBMb29rdXBSZXN1bHQuCi0gIHZpcnR1YWwgYm9vbCBMb29rdXBVbnF1YWxpZmllZChMb29rdXBSZXN1bHQgJlIsIFNjb3BlICpTKTsKKyAgYm9vbCBMb29rdXBVbnF1YWxpZmllZChMb29rdXBSZXN1bHQgJlIsIFNjb3BlICpTKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJlYWQgdGhlIHNldCBvZiB0ZW50YXRpdmUgZGVmaW5pdGlvbnMga25vd24gdG8gdGhlIGV4dGVybmFsIFNlbWEKICAgLy8vIHNvdXJjZS4KQEAgLTIzNyw4ICsyMzksOCBAQAogICAvLy8gZ2l2ZW4gdmVjdG9yIG9mIHRlbnRhdGl2ZSBkZWZpbml0aW9ucy4gTm90ZSB0aGF0IHRoaXMgcm91dGluZSBtYXkgYmUKICAgLy8vIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IHRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIHRha2UgY2FyZSBub3QgdG8KICAgLy8vIGludHJvZHVjZSB0aGUgc2FtZSBkZWNsYXJhdGlvbnMgcmVwZWF0ZWRseS4KLSAgdmlydHVhbCB2b2lkIFJlYWRUZW50YXRpdmVEZWZpbml0aW9ucyhTbWFsbFZlY3RvckltcGw8VmFyRGVjbCo+ICZEZWZzKTsKLSAgCisgIHZvaWQgUmVhZFRlbnRhdGl2ZURlZmluaXRpb25zKFNtYWxsVmVjdG9ySW1wbDxWYXJEZWNsKj4gJkRlZnMpIG92ZXJyaWRlOworCiAgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIHVudXNlZCBmaWxlLXNjb3BlIGRlY2xhcmF0aW9ucyBrbm93biB0byB0aGUKICAgLy8vIGV4dGVybmFsIFNlbWEgc291cmNlLgogICAvLy8KQEAgLTI0Niw5ICsyNDgsOSBAQAogICAvLy8gZ2l2ZW4gdmVjdG9yIG9mIGRlY2xhcmF0aW9ucy4gTm90ZSB0aGF0IHRoaXMgcm91dGluZSBtYXkgYmUKICAgLy8vIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IHRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIHRha2UgY2FyZSBub3QgdG8KICAgLy8vIGludHJvZHVjZSB0aGUgc2FtZSBkZWNsYXJhdGlvbnMgcmVwZWF0ZWRseS4KLSAgdmlydHVhbCB2b2lkIFJlYWRVbnVzZWRGaWxlU2NvcGVkRGVjbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgRGVjbGFyYXRvckRlY2wqPiAmRGVjbHMpOwotICAKKyAgdm9pZCBSZWFkVW51c2VkRmlsZVNjb3BlZERlY2xzKAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNvbnN0IERlY2xhcmF0b3JEZWNsKj4gJkRlY2xzKSBvdmVycmlkZTsKKwogICAvLy8gXGJyaWVmIFJlYWQgdGhlIHNldCBvZiBkZWxlZ2F0aW5nIGNvbnN0cnVjdG9ycyBrbm93biB0byB0aGUKICAgLy8vIGV4dGVybmFsIFNlbWEgc291cmNlLgogICAvLy8KQEAgLTI1Niw4ICsyNTgsOCBAQAogICAvLy8gZ2l2ZW4gdmVjdG9yIG9mIGRlY2xhcmF0aW9ucy4gTm90ZSB0aGF0IHRoaXMgcm91dGluZSBtYXkgYmUKICAgLy8vIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IHRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIHRha2UgY2FyZSBub3QgdG8KICAgLy8vIGludHJvZHVjZSB0aGUgc2FtZSBkZWNsYXJhdGlvbnMgcmVwZWF0ZWRseS4KLSAgdmlydHVhbCB2b2lkIFJlYWREZWxlZ2F0aW5nQ29uc3RydWN0b3JzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q1hYQ29uc3RydWN0b3JEZWNsKj4gJkRlY2xzKTsKKyAgdm9pZCBSZWFkRGVsZWdhdGluZ0NvbnN0cnVjdG9ycygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENYWENvbnN0cnVjdG9yRGVjbCo+ICZEZWNscykgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZWFkIHRoZSBzZXQgb2YgZXh0X3ZlY3RvciB0eXBlIGRlY2xhcmF0aW9ucyBrbm93biB0byB0aGUKICAgLy8vIGV4dGVybmFsIFNlbWEgc291cmNlLgpAQCAtMjY2LDcgKzI2OCw3IEBACiAgIC8vLyB0aGUgZ2l2ZW4gdmVjdG9yIG9mIGRlY2xhcmF0aW9ucy4gTm90ZSB0aGF0IHRoaXMgcm91dGluZSBtYXkgYmUKICAgLy8vIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IHRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIHRha2UgY2FyZSBub3QgdG8KICAgLy8vIGludHJvZHVjZSB0aGUgc2FtZSBkZWNsYXJhdGlvbnMgcmVwZWF0ZWRseS4KLSAgdmlydHVhbCB2b2lkIFJlYWRFeHRWZWN0b3JEZWNscyhTbWFsbFZlY3RvckltcGw8VHlwZWRlZk5hbWVEZWNsKj4gJkRlY2xzKTsKKyAgdm9pZCBSZWFkRXh0VmVjdG9yRGVjbHMoU21hbGxWZWN0b3JJbXBsPFR5cGVkZWZOYW1lRGVjbCo+ICZEZWNscykgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZWFkIHRoZSBzZXQgb2YgZHluYW1pYyBjbGFzc2VzIGtub3duIHRvIHRoZSBleHRlcm5hbCBTZW1hIHNvdXJjZS4KICAgLy8vCkBAIC0yNzQsNyArMjc2LDcgQEAKICAgLy8vIHRoZSBnaXZlbiB2ZWN0b3Igb2YgZGVjbGFyYXRpb25zLiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSBiZQogICAvLy8gaW52b2tlZCBtdWx0aXBsZSB0aW1lczsgdGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgdGFrZSBjYXJlIG5vdCB0bwogICAvLy8gaW50cm9kdWNlIHRoZSBzYW1lIGRlY2xhcmF0aW9ucyByZXBlYXRlZGx5LgotICB2aXJ0dWFsIHZvaWQgUmVhZER5bmFtaWNDbGFzc2VzKFNtYWxsVmVjdG9ySW1wbDxDWFhSZWNvcmREZWNsKj4gJkRlY2xzKTsKKyAgdm9pZCBSZWFkRHluYW1pY0NsYXNzZXMoU21hbGxWZWN0b3JJbXBsPENYWFJlY29yZERlY2wqPiAmRGVjbHMpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIGxvY2FsbHktc2NvcGVkIGV4dGVybiAiQyIgZGVjbGFyYXRpb25zIGtub3duIHRvIHRoZQogICAvLy8gZXh0ZXJuYWwgU2VtYSBzb3VyY2UuCkBAIC0yODMsNyArMjg1LDggQEAKICAgLy8vIGRlY2xhcmF0aW9ucyB0byB0aGUgZ2l2ZW4gdmVjdG9yIG9mIGRlY2xhcmF0aW9ucy4gTm90ZSB0aGF0IHRoaXMgcm91dGluZQogICAvLy8gbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IHRoZSBleHRlcm5hbCBzb3VyY2Ugc2hvdWxkIHRha2UgY2FyZSBub3QKICAgLy8vIHRvIGludHJvZHVjZSB0aGUgc2FtZSBkZWNsYXJhdGlvbnMgcmVwZWF0ZWRseS4KLSAgdmlydHVhbCB2b2lkIFJlYWRMb2NhbGx5U2NvcGVkRXh0ZXJuQ0RlY2xzKFNtYWxsVmVjdG9ySW1wbDxOYW1lZERlY2wqPiZEZWNscyk7CisgIHZvaWQgUmVhZExvY2FsbHlTY29wZWRFeHRlcm5DRGVjbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxOYW1lZERlY2wqPiAmRGVjbHMpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIHJlZmVyZW5jZWQgc2VsZWN0b3JzIGtub3duIHRvIHRoZQogICAvLy8gZXh0ZXJuYWwgU2VtYSBzb3VyY2UuCkBAIC0yOTIsOCArMjk1LDggQEAKICAgLy8vIGdpdmVuIHZlY3RvciBvZiBzZWxlY3RvcnMuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgCiAgIC8vLyBtYXkgYmUgaW52b2tlZCBtdWx0aXBsZSB0aW1lczsgdGhlIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgdGFrZSBjYXJlIG5vdCAKICAgLy8vIHRvIGludHJvZHVjZSB0aGUgc2FtZSBzZWxlY3RvcnMgcmVwZWF0ZWRseS4KLSAgdmlydHVhbCB2b2lkIFJlYWRSZWZlcmVuY2VkU2VsZWN0b3JzKFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8U2VsZWN0b3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uPiA+ICZTZWxzKTsKKyAgdm9pZCBSZWFkUmVmZXJlbmNlZFNlbGVjdG9ycyhTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPFNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uPiA+ICZTZWxzKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJlYWQgdGhlIHNldCBvZiB3ZWFrLCB1bmRlY2xhcmVkIGlkZW50aWZpZXJzIGtub3duIHRvIHRoZQogICAvLy8gZXh0ZXJuYWwgU2VtYSBzb3VyY2UuCkBAIC0zMDIsMTUgKzMwNSwxNSBAQAogICAvLy8gdGhlIGdpdmVuIHZlY3Rvci4gTm90ZSB0aGF0IHRoaXMgcm91dGluZSBtYXkgYmUgaW52b2tlZCBtdWx0aXBsZSB0aW1lczsgCiAgIC8vLyB0aGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGludHJvZHVjZSB0aGUgc2FtZSBpZGVudGlmaWVycwogICAvLy8gcmVwZWF0ZWRseS4KLSAgdmlydHVhbCB2b2lkIFJlYWRXZWFrVW5kZWNsYXJlZElkZW50aWZpZXJzKAotICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPElkZW50aWZpZXJJbmZvKiwgV2Vha0luZm8+ID4gJldJKTsKKyAgdm9pZCBSZWFkV2Vha1VuZGVjbGFyZWRJZGVudGlmaWVycygKKyAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxJZGVudGlmaWVySW5mbyosIFdlYWtJbmZvPiA+ICZXSSkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZWFkIHRoZSBzZXQgb2YgdXNlZCB2dGFibGVzIGtub3duIHRvIHRoZSBleHRlcm5hbCBTZW1hIHNvdXJjZS4KICAgLy8vCiAgIC8vLyBUaGUgZXh0ZXJuYWwgc291cmNlIHNob3VsZCBhcHBlbmQgaXRzIG93biB1c2VkIHZ0YWJsZXMgdG8gdGhlIGdpdmVuCiAgIC8vLyB2ZWN0b3IuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IHRoZSBleHRlcm5hbAogICAvLy8gc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGludHJvZHVjZSB0aGUgc2FtZSB2dGFibGVzIHJlcGVhdGVkbHkuCi0gIHZpcnR1YWwgdm9pZCBSZWFkVXNlZFZUYWJsZXMoU21hbGxWZWN0b3JJbXBsPEV4dGVybmFsVlRhYmxlVXNlPiAmVlRhYmxlcyk7CisgIHZvaWQgUmVhZFVzZWRWVGFibGVzKFNtYWxsVmVjdG9ySW1wbDxFeHRlcm5hbFZUYWJsZVVzZT4gJlZUYWJsZXMpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgUmVhZCB0aGUgc2V0IG9mIHBlbmRpbmcgaW5zdGFudGlhdGlvbnMga25vd24gdG8gdGhlIGV4dGVybmFsCiAgIC8vLyBTZW1hIHNvdXJjZS4KQEAgLTMxOSw4ICszMjIsOCBAQAogICAvLy8gZ2l2ZW4gdmVjdG9yLiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSBiZSBpbnZva2VkIG11bHRpcGxlIHRpbWVzOyB0aGUKICAgLy8vIGV4dGVybmFsIHNvdXJjZSBzaG91bGQgdGFrZSBjYXJlIG5vdCB0byBpbnRyb2R1Y2UgdGhlIHNhbWUgaW5zdGFudGlhdGlvbnMKICAgLy8vIHJlcGVhdGVkbHkuCi0gIHZpcnR1YWwgdm9pZCBSZWFkUGVuZGluZ0luc3RhbnRpYXRpb25zKAotICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPFZhbHVlRGVjbCosIFNvdXJjZUxvY2F0aW9uPiA+JiBQZW5kaW5nKTsKKyAgdm9pZCBSZWFkUGVuZGluZ0luc3RhbnRpYXRpb25zKAorICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPFZhbHVlRGVjbCosIFNvdXJjZUxvY2F0aW9uPiA+JiBQZW5kaW5nKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJlYWQgdGhlIHNldCBvZiBsYXRlIHBhcnNlZCB0ZW1wbGF0ZSBmdW5jdGlvbnMgZm9yIHRoaXMgc291cmNlLgogICAvLy8KQEAgLTMyOCwxNyArMzMxLDE4IEBACiAgIC8vLyBpbnRvIHRoZSBtYXAuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXM7IHRoZQogICAvLy8gZXh0ZXJuYWwgc291cmNlIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGludHJvZHVjZSB0aGUgc2FtZSBtYXAgZW50cmllcwogICAvLy8gcmVwZWF0ZWRseS4KLSAgdmlydHVhbCB2b2lkIFJlYWRMYXRlUGFyc2VkVGVtcGxhdGVzKAotICAgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRnVuY3Rpb25EZWNsICosIExhdGVQYXJzZWRUZW1wbGF0ZSAqPiAmTFBUTWFwKTsKKyAgdm9pZCBSZWFkTGF0ZVBhcnNlZFRlbXBsYXRlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpEZW5zZU1hcDxjb25zdCBGdW5jdGlvbkRlY2wgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXRlUGFyc2VkVGVtcGxhdGUgKj4gJkxQVE1hcCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxjb3B5ZG9jIEV4dGVybmFsU2VtYVNvdXJjZTo6Q29ycmVjdFR5cG8KICAgLy8vIFxub3RlIFJldHVybnMgdGhlIGZpcnN0IG5vbmVtcHR5IGNvcnJlY3Rpb24uCi0gIHZpcnR1YWwgVHlwb0NvcnJlY3Rpb24gQ29ycmVjdFR5cG8oY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmVHlwbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTG9va3VwS2luZCwgU2NvcGUgKlMsIENYWFNjb3BlU3BlYyAqU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ycmVjdGlvbkNhbmRpZGF0ZUNhbGxiYWNrICZDQ0MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQgKk1lbWJlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlcmluZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpPUFQpOworICBUeXBvQ29ycmVjdGlvbiBDb3JyZWN0VHlwbyhjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZUeXBvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTG9va3VwS2luZCwgU2NvcGUgKlMsIENYWFNjb3BlU3BlYyAqU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjayAmQ0NDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dCAqTWVtYmVyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbnRlcmluZ0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNPYmplY3RQb2ludGVyVHlwZSAqT1BUKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFByb2R1Y2VzIGEgZGlhZ25vc3RpYyBub3RlIGlmIG9uZSBvZiB0aGUgYXR0YWNoZWQgc291cmNlcwogICAvLy8gY29udGFpbnMgYSBjb21wbGV0ZSBkZWZpbml0aW9uIGZvciBccCBULiBRdWVyaWVzIHRoZSBzb3VyY2VzIGluIGxpc3QKQEAgLTM1MCw3ICszNTQsOCBAQAogICAvLy8gXHBhcmFtIFQgdGhlIFxjIFF1YWxUeXBlIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBjb21wbGV0ZSBhdCBccCBMb2MKICAgLy8vCiAgIC8vLyBccmV0dXJuIHRydWUgaWYgYSBkaWFnbm9zdGljIHdhcyBwcm9kdWNlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICB2aXJ0dWFsIGJvb2wgTWF5YmVEaWFnbm9zZU1pc3NpbmdDb21wbGV0ZVR5cGUoU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKTsKKyAgYm9vbCBNYXliZURpYWdub3NlTWlzc2luZ0NvbXBsZXRlVHlwZShTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCkgb3ZlcnJpZGU7CiAKICAgLy8gaXNhL2Nhc3QvZHluX2Nhc3Qgc3VwcG9ydAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE11bHRpcGxleEV4dGVybmFsU2VtYVNvdXJjZSopIHsgcmV0dXJuIHRydWU7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU2VtYS9PdmVybG9hZC5oIGIvaW5jbHVkZS9jbGFuZy9TZW1hL092ZXJsb2FkLmgKaW5kZXggYjhiZDE0YS4uNzA4NmI3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TZW1hL092ZXJsb2FkLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TZW1hL092ZXJsb2FkLmgKQEAgLTU3OSw3ICs1NzksMTEgQEAKICAgICAvLy8gKENVREEpIFRoaXMgY2FuZGlkYXRlIHdhcyBub3QgdmlhYmxlIGJlY2F1c2UgdGhlIGNhbGxlZQogICAgIC8vLyB3YXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgY2FsbGVyJ3MgdGFyZ2V0IChpLmUuIGhvc3QtPmRldmljZSwKICAgICAvLy8gZ2xvYmFsLT5ob3N0LCBkZXZpY2UtPmhvc3QpLgotICAgIG92bF9mYWlsX2JhZF90YXJnZXQKKyAgICBvdmxfZmFpbF9iYWRfdGFyZ2V0LAorCisgICAgLy8vIFRoaXMgY2FuZGlkYXRlIGZ1bmN0aW9uIHdhcyBub3QgdmlhYmxlIGJlY2F1c2UgYW4gZW5hYmxlX2lmCisgICAgLy8vIGF0dHJpYnV0ZSBkaXNhYmxlZCBpdC4KKyAgICBvdmxfZmFpbF9lbmFibGVfaWYKICAgfTsKIAogICAvLy8gT3ZlcmxvYWRDYW5kaWRhdGUgLSBBIHNpbmdsZSBjYW5kaWRhdGUgaW4gYW4gb3ZlcmxvYWQgc2V0IChDKysgMTMuMykuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1NlbWEvT3duZXJzaGlwLmggYi9pbmNsdWRlL2NsYW5nL1NlbWEvT3duZXJzaGlwLmgKaW5kZXggYjdkNzcxMC4uNGJiZWZjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TZW1hL093bmVyc2hpcC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvU2VtYS9Pd25lcnNoaXAuaApAQCAtMTU4LDYgKzE1OCw3IEBACiAKICAgICBib29sIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIEludmFsaWQ7IH0KICAgICBib29sIGlzVXNhYmxlKCkgY29uc3QgeyByZXR1cm4gIUludmFsaWQgJiYgVmFsOyB9CisgICAgYm9vbCBpc1Vuc2V0KCkgY29uc3QgeyByZXR1cm4gIUludmFsaWQgJiYgIVZhbDsgfQogCiAgICAgUHRyVHkgZ2V0KCkgY29uc3QgeyByZXR1cm4gVmFsOyB9CiAgICAgLy8gRklYTUU6IFJlcGxhY2Ugd2l0aCBnZXQuCkBAIC0xOTksNiArMjAwLDcgQEAKIAogICAgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gUHRyV2l0aEludmFsaWQgJiAweDAxOyB9CiAgICAgYm9vbCBpc1VzYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFB0cldpdGhJbnZhbGlkID4gMHgwMTsgfQorICAgIGJvb2wgaXNVbnNldCgpIGNvbnN0IHsgcmV0dXJuIFB0cldpdGhJbnZhbGlkID09IDA7IH0KIAogICAgIFB0clR5IGdldCgpIGNvbnN0IHsKICAgICAgIHZvaWQgKlZQID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KFB0cldpdGhJbnZhbGlkICYgfjB4MDEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZW1hL1ByZXR0eURlY2xTdGFja1RyYWNlLmggYi9pbmNsdWRlL2NsYW5nL1NlbWEvUHJldHR5RGVjbFN0YWNrVHJhY2UuaAppbmRleCBhYTU1NzA1Li5jMGM3NzJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1NlbWEvUHJldHR5RGVjbFN0YWNrVHJhY2UuaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlbWEvUHJldHR5RGVjbFN0YWNrVHJhY2UuaApAQCAtMzksNyArMzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1zZykKICAgICA6IFMoUyksIFRoZURlY2woRCksIExvYyhMb2MpLCBNZXNzYWdlKE1zZykge30KIAotICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOwogfTsKIAogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZW1hL1Njb3BlLmggYi9pbmNsdWRlL2NsYW5nL1NlbWEvU2NvcGUuaAppbmRleCAyNDlhNGM3Li41NGNhMmE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1NlbWEvU2NvcGUuaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlbWEvU2NvcGUuaApAQCAtMTgsNiArMTgsMTIgQEAKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiAKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK30KKwogbmFtZXNwYWNlIGNsYW5nIHsKIAogY2xhc3MgRGVjbDsKQEAgLTEwOSw2ICsxMTUsMTAgQEAKICAgLy8vIGludGVycmVsYXRlcyB3aXRoIG90aGVyIGNvbnRyb2wgZmxvdyBzdGF0ZW1lbnRzLgogICB1bnNpZ25lZCBzaG9ydCBGbGFnczsKIAorICAvLy8gXGJyaWVmIERlY2xhcmF0aW9ucyB3aXRoIHN0YXRpYyBsaW5rYWdlIGFyZSBtYW5nbGVkIHdpdGggdGhlIG51bWJlciBvZgorICAvLy8gc2NvcGVzIHNlZW4gYXMgYSBjb21wb25lbnQuCisgIHVuc2lnbmVkIHNob3J0IE1TTG9jYWxNYW5nbGluZ051bWJlcjsKKwogICAvLy8gUHJvdG90eXBlRGVwdGggLSBUaGlzIGlzIHRoZSBudW1iZXIgb2YgZnVuY3Rpb24gcHJvdG90eXBlIHNjb3BlcwogICAvLy8gZW5jbG9zaW5nIHRoaXMgc2NvcGUsIGluY2x1ZGluZyB0aGlzIHNjb3BlLgogICB1bnNpZ25lZCBzaG9ydCBQcm90b3R5cGVEZXB0aDsKQEAgLTEyMCw2ICsxMzAsNyBAQAogICAvLy8gRm5QYXJlbnQgLSBJZiB0aGlzIHNjb3BlIGhhcyBhIHBhcmVudCBzY29wZSB0aGF0IGlzIGEgZnVuY3Rpb24gYm9keSwgdGhpcwogICAvLy8gcG9pbnRlciBpcyBub24tbnVsbCBhbmQgcG9pbnRzIHRvIGl0LiAgVGhpcyBpcyB1c2VkIGZvciBsYWJlbCBwcm9jZXNzaW5nLgogICBTY29wZSAqRm5QYXJlbnQ7CisgIFNjb3BlICpNU0xvY2FsTWFuZ2xpbmdQYXJlbnQ7CiAKICAgLy8vIEJyZWFrUGFyZW50L0NvbnRpbnVlUGFyZW50IC0gVGhpcyBpcyBhIGRpcmVjdCBsaW5rIHRvIHRoZSBpbm5lcm1vc3QKICAgLy8vIEJyZWFrU2NvcGUvQ29udGludWVTY29wZSB3aGljaCBjb250YWlucyB0aGUgY29udGVudHMgb2YgdGhpcyBzY29wZQpAQCAtMTgxLDYgKzE5MiwxMSBAQAogICBjb25zdCBTY29wZSAqZ2V0Rm5QYXJlbnQoKSBjb25zdCB7IHJldHVybiBGblBhcmVudDsgfQogICBTY29wZSAqZ2V0Rm5QYXJlbnQoKSB7IHJldHVybiBGblBhcmVudDsgfQogCisgIGNvbnN0IFNjb3BlICpnZXRNU0xvY2FsTWFuZ2xpbmdQYXJlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIE1TTG9jYWxNYW5nbGluZ1BhcmVudDsKKyAgfQorICBTY29wZSAqZ2V0TVNMb2NhbE1hbmdsaW5nUGFyZW50KCkgeyByZXR1cm4gTVNMb2NhbE1hbmdsaW5nUGFyZW50OyB9CisKICAgLy8vIGdldENvbnRpbnVlUGFyZW50IC0gUmV0dXJuIHRoZSBjbG9zZXN0IHNjb3BlIHRoYXQgYSBjb250aW51ZSBzdGF0ZW1lbnQKICAgLy8vIHdvdWxkIGJlIGFmZmVjdGVkIGJ5LgogICBTY29wZSAqZ2V0Q29udGludWVQYXJlbnQoKSB7CkBAIC0yMTksMTAgKzIzNSwxMSBAQAogICAgIHJldHVybiBQcm90b3R5cGVJbmRleCsrOwogICB9CiAKLSAgdHlwZWRlZiBEZWNsU2V0VHk6Oml0ZXJhdG9yIGRlY2xfaXRlcmF0b3I7Ci0gIGRlY2xfaXRlcmF0b3IgZGVjbF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIERlY2xzSW5TY29wZS5iZWdpbigpOyB9Ci0gIGRlY2xfaXRlcmF0b3IgZGVjbF9lbmQoKSAgIGNvbnN0IHsgcmV0dXJuIERlY2xzSW5TY29wZS5lbmQoKTsgfQotICBib29sIGRlY2xfZW1wdHkoKSAgICAgICAgICBjb25zdCB7IHJldHVybiBEZWNsc0luU2NvcGUuZW1wdHkoKTsgfQorICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPERlY2xTZXRUeTo6aXRlcmF0b3I+IGRlY2xfcmFuZ2U7CisgIGRlY2xfcmFuZ2UgZGVjbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGRlY2xfcmFuZ2UoRGVjbHNJblNjb3BlLmJlZ2luKCksIERlY2xzSW5TY29wZS5lbmQoKSk7CisgIH0KKyAgYm9vbCBkZWNsX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gRGVjbHNJblNjb3BlLmVtcHR5KCk7IH0KIAogICB2b2lkIEFkZERlY2woRGVjbCAqRCkgewogICAgIERlY2xzSW5TY29wZS5pbnNlcnQoRCk7CkBAIC0yMzIsNiArMjQ5LDIyIEBACiAgICAgRGVjbHNJblNjb3BlLmVyYXNlKEQpOwogICB9CiAKKyAgdm9pZCBpbmNyZW1lbnRNU0xvY2FsTWFuZ2xpbmdOdW1iZXIoKSB7CisgICAgaWYgKFNjb3BlICpNU0xNUCA9IGdldE1TTG9jYWxNYW5nbGluZ1BhcmVudCgpKQorICAgICAgTVNMTVAtPk1TTG9jYWxNYW5nbGluZ051bWJlciArPSAxOworICB9CisKKyAgdm9pZCBkZWNyZW1lbnRNU0xvY2FsTWFuZ2xpbmdOdW1iZXIoKSB7CisgICAgaWYgKFNjb3BlICpNU0xNUCA9IGdldE1TTG9jYWxNYW5nbGluZ1BhcmVudCgpKQorICAgICAgTVNMTVAtPk1TTG9jYWxNYW5nbGluZ051bWJlciAtPSAxOworICB9CisKKyAgdW5zaWduZWQgZ2V0TVNMb2NhbE1hbmdsaW5nTnVtYmVyKCkgY29uc3QgeworICAgIGlmIChjb25zdCBTY29wZSAqTVNMTVAgPSBnZXRNU0xvY2FsTWFuZ2xpbmdQYXJlbnQoKSkKKyAgICAgIHJldHVybiBNU0xNUC0+TVNMb2NhbE1hbmdsaW5nTnVtYmVyOworICAgIHJldHVybiAxOworICB9CisKICAgLy8vIGlzRGVjbFNjb3BlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgc2NvcGUgdGhhdCB0aGUgc3BlY2lmaWVkIGRlY2wgaXMKICAgLy8vIGRlY2xhcmVkIGluLgogICBib29sIGlzRGVjbFNjb3BlKERlY2wgKkQpIHsKQEAgLTI3Myw2ICszMDYsMTggQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAorICAvLy8gaXNJbk9iamNNZXRob2RPdXRlclNjb3BlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBzY29wZSBpcyBhbgorICAvLy8gT2JqZWN0aXZlLUMgbWV0aG9kIG91dGVyIG1vc3QgYm9keS4KKyAgYm9vbCBpc0luT2JqY01ldGhvZE91dGVyU2NvcGUoKSBjb25zdCB7CisgICAgaWYgKGNvbnN0IFNjb3BlICpTID0gdGhpcykgeworICAgICAgLy8gSWYgdGhpcyBzY29wZSBpcyBhbiBvYmpjIG1ldGhvZCBzY29wZSwgdGhlbiB3ZSBzdWNjZWVkLgorICAgICAgaWYgKFMtPmdldEZsYWdzKCkgJiBPYmpDTWV0aG9kU2NvcGUpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAKICAgLy8vIGlzVGVtcGxhdGVQYXJhbVNjb3BlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBzY29wZSBpcyBhIEMrKwogICAvLy8gdGVtcGxhdGUgcGFyYW1ldGVyIHNjb3BlLgogICBib29sIGlzVGVtcGxhdGVQYXJhbVNjb3BlKCkgY29uc3QgewpAQCAtMzE2LDMyICszNjEsMjkgQEAKICAgLy8vIGlzIGEgRnVuY3Rpb25Qcm90b3R5cGVTY29wZS4KICAgYm9vbCBjb250YWluZWRJblByb3RvdHlwZVNjb3BlKCkgY29uc3Q7CiAKLSAgdHlwZWRlZiBVc2luZ0RpcmVjdGl2ZXNUeTo6aXRlcmF0b3IgdWRpcl9pdGVyYXRvcjsKLSAgdHlwZWRlZiBVc2luZ0RpcmVjdGl2ZXNUeTo6Y29uc3RfaXRlcmF0b3IgY29uc3RfdWRpcl9pdGVyYXRvcjsKLQogICB2b2lkIFB1c2hVc2luZ0RpcmVjdGl2ZShVc2luZ0RpcmVjdGl2ZURlY2wgKlVEaXIpIHsKICAgICBVc2luZ0RpcmVjdGl2ZXMucHVzaF9iYWNrKFVEaXIpOwogICB9CiAKLSAgdWRpcl9pdGVyYXRvciB1c2luZ19kaXJlY3RpdmVzX2JlZ2luKCkgewotICAgIHJldHVybiBVc2luZ0RpcmVjdGl2ZXMuYmVnaW4oKTsKLSAgfQorICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPFVzaW5nRGlyZWN0aXZlc1R5OjppdGVyYXRvcj4KKyAgICB1c2luZ19kaXJlY3RpdmVzX3JhbmdlOwogCi0gIHVkaXJfaXRlcmF0b3IgdXNpbmdfZGlyZWN0aXZlc19lbmQoKSB7Ci0gICAgcmV0dXJuIFVzaW5nRGlyZWN0aXZlcy5lbmQoKTsKLSAgfQotCi0gIGNvbnN0X3VkaXJfaXRlcmF0b3IgdXNpbmdfZGlyZWN0aXZlc19iZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gVXNpbmdEaXJlY3RpdmVzLmJlZ2luKCk7Ci0gIH0KLQotICBjb25zdF91ZGlyX2l0ZXJhdG9yIHVzaW5nX2RpcmVjdGl2ZXNfZW5kKCkgY29uc3QgewotICAgIHJldHVybiBVc2luZ0RpcmVjdGl2ZXMuZW5kKCk7CisgIHVzaW5nX2RpcmVjdGl2ZXNfcmFuZ2UgdXNpbmdfZGlyZWN0aXZlcygpIHsKKyAgICByZXR1cm4gdXNpbmdfZGlyZWN0aXZlc19yYW5nZShVc2luZ0RpcmVjdGl2ZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZ0RpcmVjdGl2ZXMuZW5kKCkpOwogICB9CiAKICAgLy8vIEluaXQgLSBUaGlzIGlzIHVzZWQgYnkgdGhlIHBhcnNlciB0byBpbXBsZW1lbnQgc2NvcGUgY2FjaGluZy4KICAgLy8vCiAgIHZvaWQgSW5pdChTY29wZSAqcGFyZW50LCB1bnNpZ25lZCBmbGFncyk7CisKKyAgLy8vIFxicmllZiBTZXRzIHVwIHRoZSBzcGVjaWZpZWQgc2NvcGUgZmxhZ3MgYW5kIGFkanVzdHMgdGhlIHNjb3BlIHN0YXRlCisgIC8vLyB2YXJpYWJsZXMgYWNjb3JkaW5nbHkuCisgIC8vLworICB2b2lkIEFkZEZsYWdzKHVuc2lnbmVkIEZsYWdzKTsKKworICB2b2lkIGR1bXBJbXBsKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OwogfTsKIAogfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZW1hL1Njb3BlSW5mby5oIGIvaW5jbHVkZS9jbGFuZy9TZW1hL1Njb3BlSW5mby5oCmluZGV4IDA2YWZlMWEuLjk4YWYzNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU2VtYS9TY29wZUluZm8uaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlbWEvU2NvcGVJbmZvLmgKQEAgLTExMCw2ICsxMTAsMjEgQEAKICAgLy8vIHdpdGggXGMgX19hdHRyaWJ1dGVfXygob2JqY19yZXF1aXJlc19zdXBlcikpLgogICBib29sIE9iakNTaG91bGRDYWxsU3VwZXI7CiAKKyAgLy8vIFRydWUgd2hlbiB0aGlzIGlzIGEgbWV0aG9kIG1hcmtlZCBhcyBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIuCisgIGJvb2wgT2JqQ0lzRGVzaWduYXRlZEluaXQ7CisgIC8vLyBUaGlzIHN0YXJ0cyB0cnVlIGZvciBhIG1ldGhvZCBtYXJrZWQgYXMgZGVzaWduYXRlZCBpbml0aWFsaXplciBhbmQgd2lsbAorICAvLy8gYmUgc2V0IHRvIGZhbHNlIGlmIHRoZXJlIGlzIGFuIGludm9jYXRpb24gdG8gYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mCisgIC8vLyB0aGUgc3VwZXIgY2xhc3MuCisgIGJvb2wgT2JqQ1dhcm5Gb3JOb0Rlc2lnbmF0ZWRJbml0Q2hhaW47CisKKyAgLy8vIFRydWUgd2hlbiB0aGlzIGlzIGFuIGluaXRpYWxpemVyIG1ldGhvZCBub3QgbWFya2VkIGFzIGEgZGVzaWduYXRlZAorICAvLy8gaW5pdGlhbGl6ZXIgd2l0aGluIGEgY2xhc3MgdGhhdCBoYXMgYXQgbGVhc3Qgb25lIGluaXRpYWxpemVyIG1hcmtlZCBhcyBhCisgIC8vLyBkZXNpZ25hdGVkIGluaXRpYWxpemVyLgorICBib29sIE9iakNJc1NlY29uZGFyeUluaXQ7CisgIC8vLyBUaGlzIHN0YXJ0cyB0cnVlIGZvciBhIHNlY29uZGFyeSBpbml0aWFsaXplciBtZXRob2QgYW5kIHdpbGwgYmUgc2V0IHRvCisgIC8vLyBmYWxzZSBpZiB0aGVyZSBpcyBhbiBpbnZvY2F0aW9uIG9mIGFuIGluaXRpYWxpemVyIG9uICdzZWxmJy4KKyAgYm9vbCBPYmpDV2FybkZvck5vSW5pdERlbGVnYXRpb247CisKICAgLy8vIFxicmllZiBVc2VkIHRvIGRldGVybWluZSBpZiBlcnJvcnMgb2NjdXJyZWQgaW4gdGhpcyBmdW5jdGlvbiBvciBibG9jay4KICAgRGlhZ25vc3RpY0Vycm9yVHJhcCBFcnJvclRyYXA7CiAKQEAgLTMxOCw2ICszMzMsMTAgQEAKICAgICAgIEhhc0luZGlyZWN0R290byhmYWxzZSksCiAgICAgICBIYXNEcm9wcGVkU3RtdChmYWxzZSksCiAgICAgICBPYmpDU2hvdWxkQ2FsbFN1cGVyKGZhbHNlKSwKKyAgICAgIE9iakNJc0Rlc2lnbmF0ZWRJbml0KGZhbHNlKSwKKyAgICAgIE9iakNXYXJuRm9yTm9EZXNpZ25hdGVkSW5pdENoYWluKGZhbHNlKSwKKyAgICAgIE9iakNJc1NlY29uZGFyeUluaXQoZmFsc2UpLAorICAgICAgT2JqQ1dhcm5Gb3JOb0luaXREZWxlZ2F0aW9uKGZhbHNlKSwKICAgICAgIEVycm9yVHJhcChEaWFnKSB7IH0KIAogICB2aXJ0dWFsIH5GdW5jdGlvblNjb3BlSW5mbygpOwpAQCAtNzA4LDEwICs3MjcsMTAgQEAKICAgLy8vIGFjdCBvZiBhbmFseXppbmcgdGhlIGVuY2xvc2luZyBmdWxsIGV4cHJlc3Npb24gKEFjdE9uRmluaXNoRnVsbEV4cHIpCiAgIC8vLyBpZiB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlIGZ1bGwgZXhwcmVzc2lvbiBpcyBub3QgaW5zdGFudGlhdGlvbi0KICAgLy8vIGRlcGVuZGVudCwgdGhlbiB3ZSBjYW4gZW50aXJlbHkgYXZvaWQgaXRzIGNhcHR1cmUuIAotICAvLy8NCi0gIC8vLyAgIGNvbnN0IGludCBuID0gMDsNCi0gIC8vLyAgIFsmXSAoYXV0byB4KSB7DQotICAvLy8gICAgICh2b2lkKStuICsgeDsNCisgIC8vLworICAvLy8gICBjb25zdCBpbnQgbiA9IDA7CisgIC8vLyAgIFsmXSAoYXV0byB4KSB7CisgIC8vLyAgICAgKHZvaWQpK24gKyB4OwogICAvLy8gICB9OwogICAvLy8gSW50ZXJlc3RpbmdseSwgdGhpcyBzdHJhdGVneSB3b3VsZCBpbnZvbHZlIGEgY2FwdHVyZSBvZiBuLCBldmVuIHRob3VnaCAKICAgLy8vIGl0J3Mgb2J2aW91c2x5IG5vdCBvZHItdXNlZCBoZXJlLCBiZWNhdXNlIHRoZSBmdWxsLWV4cHJlc3Npb24gaXMgCkBAIC03MjUsMTIgKzc0NCwxMiBAQAogICAvLy8gQmVmb3JlIGFueW9uZSBpcyB0ZW1wdGVkIHRvIGltcGxlbWVudCBhIHN0cmF0ZWd5IGZvciBub3QtY2FwdHVyaW5nICduJywKICAgLy8vIGNvbnNpZGVyIHRoZSBpbnNpZ2h0ZnVsIHdhcm5pbmcgaW46IAogICAvLy8gICAgL2NmZS1jb21taXRzL1dlZWstb2YtTW9uLTIwMTMxMTA0LzA5MjU5Ni5odG1sCi0gIC8vLyAiVGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgc2V0IG9mIGNhcHR1cmVzIGZvciBhIGxhbWJkYSBpcyBwYXJ0IG9mIHRoZSBBQkkNCi0gIC8vLyAgKHNpbmNlIGxhbWJkYSBsYXlvdXQgY2FuIGJlIG1hZGUgdmlzaWJsZSB0aHJvdWdoIGlubGluZSBmdW5jdGlvbnMgYW5kIHRoZQ0KLSAgLy8vICBsaWtlKSwgYW5kIHRoZXJlIGFyZSBubyBndWFyYW50ZWVzIGFzIHRvIHdoaWNoIGNhc2VzIHdlJ2xsIG1hbmFnZSB0byBidWlsZA0KLSAgLy8vICBhbiBsdmFsdWUtdG8tcnZhbHVlIGNvbnZlcnNpb24gaW4sIHdoZW4gcGFyc2luZyBhIHRlbXBsYXRlIC0tIHNvbWUNCi0gIC8vLyAgc2VlbWluZ2x5IGhhcm1sZXNzIGNoYW5nZSBlbHNld2hlcmUgaW4gU2VtYSBjb3VsZCBjYXVzZSB1cyB0byBzdGFydCBvciBzdG9wDQotICAvLy8gIGJ1aWxkaW5nIHN1Y2ggYSBub2RlLiBTbyB3ZSBuZWVkIGEgcnVsZSB0aGF0IGFueW9uZSBjYW4gaW1wbGVtZW50IGFuZCBnZXQNCisgIC8vLyAiVGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgc2V0IG9mIGNhcHR1cmVzIGZvciBhIGxhbWJkYSBpcyBwYXJ0IG9mIHRoZSBBQkkKKyAgLy8vICAoc2luY2UgbGFtYmRhIGxheW91dCBjYW4gYmUgbWFkZSB2aXNpYmxlIHRocm91Z2ggaW5saW5lIGZ1bmN0aW9ucyBhbmQgdGhlCisgIC8vLyAgbGlrZSksIGFuZCB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcyBhcyB0byB3aGljaCBjYXNlcyB3ZSdsbCBtYW5hZ2UgdG8gYnVpbGQKKyAgLy8vICBhbiBsdmFsdWUtdG8tcnZhbHVlIGNvbnZlcnNpb24gaW4sIHdoZW4gcGFyc2luZyBhIHRlbXBsYXRlIC0tIHNvbWUKKyAgLy8vICBzZWVtaW5nbHkgaGFybWxlc3MgY2hhbmdlIGVsc2V3aGVyZSBpbiBTZW1hIGNvdWxkIGNhdXNlIHVzIHRvIHN0YXJ0IG9yIHN0b3AKKyAgLy8vICBidWlsZGluZyBzdWNoIGEgbm9kZS4gU28gd2UgbmVlZCBhIHJ1bGUgdGhhdCBhbnlvbmUgY2FuIGltcGxlbWVudCBhbmQgZ2V0CiAgIC8vLyAgZXhhY3RseSB0aGUgc2FtZSByZXN1bHQiLgogICAvLy8gICAgCiAgIHZvaWQgbWFya1ZhcmlhYmxlRXhwckFzTm9uT0RSVXNlZChFeHByICpDYXB0dXJpbmdWYXJFeHByKSB7CkBAIC03MzgsNyArNzU3LDcgQEAKICAgICAgICAgfHwgaXNhPE1lbWJlckV4cHI+KENhcHR1cmluZ1ZhckV4cHIpKTsKICAgICBOb25PRFJVc2VkQ2FwdHVyaW5nRXhwcnMuaW5zZXJ0KENhcHR1cmluZ1ZhckV4cHIpOwogICB9Ci0gIGJvb2wgaXNWYXJpYWJsZUV4cHJNYXJrZWRBc05vbk9EUlVzZWQoRXhwciAqQ2FwdHVyaW5nVmFyRXhwcikgeworICBib29sIGlzVmFyaWFibGVFeHByTWFya2VkQXNOb25PRFJVc2VkKEV4cHIgKkNhcHR1cmluZ1ZhckV4cHIpIGNvbnN0IHsKICAgICBhc3NlcnQoaXNhPERlY2xSZWZFeHByPihDYXB0dXJpbmdWYXJFeHByKSAKICAgICAgIHx8IGlzYTxNZW1iZXJFeHByPihDYXB0dXJpbmdWYXJFeHByKSk7CiAgICAgcmV0dXJuIE5vbk9EUlVzZWRDYXB0dXJpbmdFeHBycy5jb3VudChDYXB0dXJpbmdWYXJFeHByKTsKQEAgLTc2MSwxMyArNzgwLDExIEBACiAgICAgcmV0dXJuIGdldE51bVBvdGVudGlhbFZhcmlhYmxlQ2FwdHVyZXMoKSB8fCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3RlbnRpYWxUaGlzQ2FwdHVyZUxvY2F0aW9uLmlzVmFsaWQoKTsgCiAgIH0KLSAgCi0gIC8vIFdoZW4gcGFzc2VkIHRoZSBpbmRleCwgcmV0dXJucyB0aGUgVmFyRGVjbCBhbmQgRXhwciBhc3NvY2lhdGVkIAotICAvLyB3aXRoIHRoZSBpbmRleC4KLSAgdm9pZCBnZXRQb3RlbnRpYWxWYXJpYWJsZUNhcHR1cmUodW5zaWduZWQgSWR4LCBWYXJEZWNsIComVkQsIEV4cHIgKiZFKTsKLSAKLX07CiAKKyAgLy8gV2hlbiBwYXNzZWQgdGhlIGluZGV4LCByZXR1cm5zIHRoZSBWYXJEZWNsIGFuZCBFeHByIGFzc29jaWF0ZWQKKyAgLy8gd2l0aCB0aGUgaW5kZXguCisgIHZvaWQgZ2V0UG90ZW50aWFsVmFyaWFibGVDYXB0dXJlKHVuc2lnbmVkIElkeCwgVmFyRGVjbCAqJlZELCBFeHByIComRSkgY29uc3Q7Cit9OwogCiBGdW5jdGlvblNjb3BlSW5mbzo6V2Vha09iamVjdFByb2ZpbGVUeTo6V2Vha09iamVjdFByb2ZpbGVUeSgpCiAgIDogQmFzZSgwLCBmYWxzZSksIFByb3BlcnR5KDApIHt9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1NlbWEvU2VtYS5oIGIvaW5jbHVkZS9jbGFuZy9TZW1hL1NlbWEuaAppbmRleCA0ODc5NGQ2Li5lYTkzNDRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1NlbWEvU2VtYS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvU2VtYS9TZW1hLmgKQEAgLTM4LDE3ICszOCwxOCBAQAogI2luY2x1ZGUgImNsYW5nL1NlbWEvTG9jSW5mb1R5cGUuaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL09iakNNZXRob2RMaXN0LmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9Pd25lcnNoaXAuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL1Njb3BlLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9TY29wZUluZm8uaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL1R5cG9Db3JyZWN0aW9uLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9XZWFrLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKICNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyLmgiCiAjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKQEAgLTEwMSw2ICsxMDIsNyBAQAogICBjbGFzcyBEZXBlbmRlbnREaWFnbm9zdGljOwogICBjbGFzcyBEZXNpZ25hdGVkSW5pdEV4cHI7CiAgIGNsYXNzIERlc2lnbmF0aW9uOworICBjbGFzcyBFbmFibGVJZkF0dHI7CiAgIGNsYXNzIEVudW1Db25zdGFudERlY2w7CiAgIGNsYXNzIEV4cHI7CiAgIGNsYXNzIEV4dFZlY3RvclR5cGU7CkBAIC0xNTIsNyArMTU0LDYgQEAKICAgY2xhc3MgU3RtdDsKICAgY2xhc3MgU3RyaW5nTGl0ZXJhbDsKICAgY2xhc3MgU3dpdGNoU3RtdDsKLSAgY2xhc3MgVGFyZ2V0QXR0cmlidXRlc1NlbWE7CiAgIGNsYXNzIFRlbXBsYXRlQXJndW1lbnQ7CiAgIGNsYXNzIFRlbXBsYXRlQXJndW1lbnRMaXN0OwogICBjbGFzcyBUZW1wbGF0ZUFyZ3VtZW50TG9jOwpAQCAtMjA0LDcgKzIwNSw2IEBACiBjbGFzcyBTZW1hIHsKICAgU2VtYShjb25zdCBTZW1hICYpIExMVk1fREVMRVRFRF9GVU5DVElPTjsKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU2VtYSAmKSBMTFZNX0RFTEVURURfRlVOQ1RJT047Ci0gIG11dGFibGUgY29uc3QgVGFyZ2V0QXR0cmlidXRlc1NlbWEqIFRoZVRhcmdldEF0dHJpYnV0ZXNTZW1hOwogCiAgIC8vL1xicmllZiBTb3VyY2Ugb2YgYWRkaXRpb25hbCBzZW1hbnRpYyBpbmZvcm1hdGlvbi4KICAgRXh0ZXJuYWxTZW1hU291cmNlICpFeHRlcm5hbFNvdXJjZTsKQEAgLTI2Myw2ICsyNjMsMzIgQEAKIAogICBib29sIE1TU3RydWN0UHJhZ21hT247IC8vIFRydWUgd2hlbiBcI3ByYWdtYSBtc19zdHJ1Y3Qgb24KIAorICAvLy8gXGJyaWVmIENvbnRyb2xzIG1lbWJlciBwb2ludGVyIHJlcHJlc2VudGF0aW9uIGZvcm1hdCB1bmRlciB0aGUgTVMgQUJJLgorICBMYW5nT3B0aW9uczo6UHJhZ21hTVNQb2ludGVyc1RvTWVtYmVyc0tpbmQKKyAgICAgIE1TUG9pbnRlclRvTWVtYmVyUmVwcmVzZW50YXRpb25NZXRob2Q7CisKKyAgZW51bSBQcmFnbWFWdG9yRGlzcEtpbmQgeworICAgIFBWREtfUHVzaCwgICAgICAgICAgLy8vPCAjcHJhZ21hIHZ0b3JkaXNwKHB1c2gsIG1vZGUpCisgICAgUFZES19TZXQsICAgICAgICAgICAvLy88ICNwcmFnbWEgdnRvcmRpc3AobW9kZSkKKyAgICBQVkRLX1BvcCwgICAgICAgICAgIC8vLzwgI3ByYWdtYSB2dG9yZGlzcChwb3ApCisgICAgUFZES19SZXNldCAgICAgICAgICAvLy88ICNwcmFnbWEgdnRvcmRpc3AoKQorICB9OworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0byBpbnNlcnQgdnRvcmRpc3BzIHByaW9yIHRvIHZpcnR1YWwgYmFzZXMgaW4gdGhlIE1pY3Jvc29mdAorICAvLy8gQysrIEFCSS4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCwgMSwgYW5kIDIsIHdoaWNoIG1lYW46CisgIC8vLworICAvLy8gMDogU3VwcHJlc3MgYWxsIHZ0b3JkaXNwcworICAvLy8gMTogSW5zZXJ0IHZ0b3JkaXNwcyBpbiB0aGUgcHJlc2VuY2Ugb2YgdmJhc2Ugb3ZlcnJpZGVzIGFuZCBub24tdHJpdmlhbAorICAvLy8gICAgc3RydWN0b3JzCisgIC8vLyAyOiBBbHdheXMgaW5zZXJ0IHZ0b3JkaXNwcyB0byBzdXBwb3J0IFJUVEkgb24gcGFydGlhbGx5IGNvbnN0cnVjdGVkCisgIC8vLyAgICBvYmplY3RzCisgIC8vLworICAvLy8gVGhlIHN0YWNrIGFsd2F5cyBoYXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gaXQuCisgIFNtYWxsVmVjdG9yPE1TVnRvckRpc3BBdHRyOjpNb2RlLCAyPiBWdG9yRGlzcE1vZGVTdGFjazsKKworICAvLy8gXGJyaWVmIFNvdXJjZSBsb2NhdGlvbiBmb3IgbmV3bHkgY3JlYXRlZCBpbXBsaWNpdCBNU0luaGVyaXRhbmNlQXR0cnMKKyAgU291cmNlTG9jYXRpb24gSW1wbGljaXRNU0luaGVyaXRhbmNlQXR0ckxvYzsKKwogICAvLy8gVmlzQ29udGV4dCAtIE1hbmFnZXMgdGhlIHN0YWNrIGZvciBcI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eS4KICAgdm9pZCAqVmlzQ29udGV4dDsgLy8gUmVhbGx5IGEgIlByYWdtYVZpc1N0YWNrKiIKIApAQCAtMzA3LDcgKzMzMyw3IEBACiAgIEV4dFZlY3RvckRlY2xzVHlwZSBFeHRWZWN0b3JEZWNsczsKIAogICAvLy8gRmllbGRDb2xsZWN0b3IgLSBDb2xsZWN0cyBDWFhGaWVsZERlY2xzIGR1cmluZyBwYXJzaW5nIG9mIEMrKyBjbGFzc2VzLgotICBPd25pbmdQdHI8Q1hYRmllbGRDb2xsZWN0b3I+IEZpZWxkQ29sbGVjdG9yOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hYRmllbGRDb2xsZWN0b3I+IEZpZWxkQ29sbGVjdG9yOwogCiAgIHR5cGVkZWYgbGx2bTo6U21hbGxTZXRWZWN0b3I8Y29uc3QgTmFtZWREZWNsKiwgMTY+IE5hbWVkRGVjbFNldFR5cGU7CiAKQEAgLTMxOSw3ICszNDUsNyBAQAogICAvLy8gUHVyZVZpcnR1YWxDbGFzc0RpYWdTZXQgLSBhIHNldCBvZiBjbGFzcyBkZWNsYXJhdGlvbnMgd2hpY2ggd2UgaGF2ZQogICAvLy8gZW1pdHRlZCBhIGxpc3Qgb2YgcHVyZSB2aXJ0dWFsIGZ1bmN0aW9ucy4gVXNlZCB0byBwcmV2ZW50IGVtaXR0aW5nIHRoZQogICAvLy8gc2FtZSBsaXN0IG1vcmUgdGhhbiBvbmNlLgotICBPd25pbmdQdHI8UmVjb3JkRGVjbFNldFR5PiBQdXJlVmlydHVhbENsYXNzRGlhZ1NldDsKKyAgc3RkOjp1bmlxdWVfcHRyPFJlY29yZERlY2xTZXRUeT4gUHVyZVZpcnR1YWxDbGFzc0RpYWdTZXQ7CiAKICAgLy8vIFBhcnNpbmdJbml0Rm9yQXV0b1ZhcnMgLSBhIHNldCBvZiBkZWNsYXJhdGlvbnMgd2l0aCBhdXRvIHR5cGVzIGZvciB3aGljaAogICAvLy8gd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nIHRoZSBpbml0aWFsaXplci4KQEAgLTQ4MCwxMyArNTA2LDE1IEBACiAgICAgUXVhbFR5cGUgU2F2ZWRDWFhUaGlzVHlwZU92ZXJyaWRlOwogCiAgIHB1YmxpYzoKLSAgICBDb250ZXh0UkFJSShTZW1hICZTLCBEZWNsQ29udGV4dCAqQ29udGV4dFRvUHVzaCkKKyAgICBDb250ZXh0UkFJSShTZW1hICZTLCBEZWNsQ29udGV4dCAqQ29udGV4dFRvUHVzaCwgYm9vbCBOZXdUaGlzQ29udGV4dCA9IHRydWUpCiAgICAgICA6IFMoUyksIFNhdmVkQ29udGV4dChTLkN1ckNvbnRleHQpLAogICAgICAgICBTYXZlZENvbnRleHRTdGF0ZShTLkRlbGF5ZWREaWFnbm9zdGljcy5wdXNoVW5kZWxheWVkKCkpLAogICAgICAgICBTYXZlZENYWFRoaXNUeXBlT3ZlcnJpZGUoUy5DWFhUaGlzVHlwZU92ZXJyaWRlKQogICAgIHsKICAgICAgIGFzc2VydChDb250ZXh0VG9QdXNoICYmICJwdXNoaW5nIG51bGwgY29udGV4dCIpOwogICAgICAgUy5DdXJDb250ZXh0ID0gQ29udGV4dFRvUHVzaDsKKyAgICAgIGlmIChOZXdUaGlzQ29udGV4dCkKKyAgICAgICAgUy5DWFhUaGlzVHlwZU92ZXJyaWRlID0gUXVhbFR5cGUoKTsKICAgICB9CiAKICAgICB2b2lkIHBvcCgpIHsKQEAgLTU2OSw3ICs1OTcsNyBAQAogICBSZWNvcmREZWNsICpNU1ZDR3VpZERlY2w7CiAKICAgLy8vIFxicmllZiBDYWNoZXMgaWRlbnRpZmllcnMvc2VsZWN0b3JzIGZvciBOU0ZvdW5kYXRpb24gQVBJcy4KLSAgT3duaW5nUHRyPE5TQVBJPiBOU0FQSU9iajsKKyAgc3RkOjp1bmlxdWVfcHRyPE5TQVBJPiBOU0FQSU9iajsKIAogICAvLy8gXGJyaWVmIFRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgT2JqZWN0aXZlLUMgTlNOdW1iZXIgY2xhc3MuCiAgIE9iakNJbnRlcmZhY2VEZWNsICpOU051bWJlckRlY2w7CkBAIC04MzMsNiArODYxLDcgQEAKIAogICAvLy8gUHJpdmF0ZSBIZWxwZXIgcHJlZGljYXRlIHRvIGNoZWNrIGZvciAnc2VsZicuCiAgIGJvb2wgaXNTZWxmRXhwcihFeHByICpSRXhwcik7CisgIGJvb2wgaXNTZWxmRXhwcihFeHByICpSRXhwciwgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCk7CiAKICAgLy8vIFxicmllZiBDYXVzZSB0aGUgYWN0aXZlIGRpYWdub3N0aWMgb24gdGhlIERpYWdvc3RpY3NFbmdpbmUgdG8gYmUKICAgLy8vIGVtaXR0ZWQuIFRoaXMgaXMgY2xvc2VseSBjb3VwbGVkIHRvIHRoZSBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgY2xhc3MgYW5kCkBAIC04NTYsNiArODg1LDggQEAKICAgdHlwZWRlZiBsbHZtOjpNQ0FzbVBhcnNlclNlbWFDYWxsYmFjazo6SW5saW5lQXNtSWRlbnRpZmllckluZm8KICAgICBJbmxpbmVBc21JZGVudGlmaWVySW5mbzsKIAorICB2b2lkIGFkZEltcGxpY2l0VHlwZWRlZihTdHJpbmdSZWYgTmFtZSwgUXVhbFR5cGUgVCk7CisKIHB1YmxpYzoKICAgU2VtYShQcmVwcm9jZXNzb3IgJnBwLCBBU1RDb250ZXh0ICZjdHh0LCBBU1RDb25zdW1lciAmY29uc3VtZXIsCiAgICAgICAgVHJhbnNsYXRpb25Vbml0S2luZCBUVUtpbmQgPSBUVV9Db21wbGV0ZSwKQEAgLTg3Miw3ICs5MDMsNiBAQAogCiAgIERpYWdub3N0aWNzRW5naW5lICZnZXREaWFnbm9zdGljcygpIGNvbnN0IHsgcmV0dXJuIERpYWdzOyB9CiAgIFNvdXJjZU1hbmFnZXIgJmdldFNvdXJjZU1hbmFnZXIoKSBjb25zdCB7IHJldHVybiBTb3VyY2VNZ3I7IH0KLSAgY29uc3QgVGFyZ2V0QXR0cmlidXRlc1NlbWEgJmdldFRhcmdldEF0dHJpYnV0ZXNTZW1hKCkgY29uc3Q7CiAgIFByZXByb2Nlc3NvciAmZ2V0UHJlcHJvY2Vzc29yKCkgY29uc3QgeyByZXR1cm4gUFA7IH0KICAgQVNUQ29udGV4dCAmZ2V0QVNUQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQ7IH0KICAgQVNUQ29uc3VtZXIgJmdldEFTVENvbnN1bWVyKCkgY29uc3QgeyByZXR1cm4gQ29uc3VtZXI7IH0KQEAgLTk2Nyw3ICs5OTcsNyBAQAogICB2b2lkIFB1c2hGdW5jdGlvblNjb3BlKCk7CiAgIHZvaWQgUHVzaEJsb2NrU2NvcGUoU2NvcGUgKkJsb2NrU2NvcGUsIEJsb2NrRGVjbCAqQmxvY2spOwogICBzZW1hOjpMYW1iZGFTY29wZUluZm8gKlB1c2hMYW1iZGFTY29wZSgpOwotICAKKwogICAvLy8gXGJyaWVmIFRoaXMgaXMgdXNlZCB0byBpbmZvcm0gU2VtYSB3aGF0IHRoZSBjdXJyZW50IFRlbXBsYXRlUGFyYW1ldGVyRGVwdGgKICAgLy8vIGlzIGR1cmluZyBQYXJzaW5nLiAgQ3VycmVudGx5IGl0IGlzIHVzZWQgdG8gcGFzcyBvbiB0aGUgZGVwdGgKICAgLy8vIHdoZW4gcGFyc2luZyBnZW5lcmljIGxhbWJkYSAnYXV0bycgcGFyYW1ldGVycy4KQEAgLTk4Myw2ICsxMDEzLDE4IEBACiAgICAgcmV0dXJuIEZ1bmN0aW9uU2NvcGVzLmJhY2soKTsKICAgfQogICAKKyAgc2VtYTo6RnVuY3Rpb25TY29wZUluZm8gKmdldEVuY2xvc2luZ0Z1bmN0aW9uKCkgY29uc3QgeworICAgIGlmIChGdW5jdGlvblNjb3Blcy5lbXB0eSgpKQorICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgZm9yIChpbnQgZSA9IEZ1bmN0aW9uU2NvcGVzLnNpemUoKS0xOyBlID49IDA7IC0tZSkgeworICAgICAgaWYgKGlzYTxzZW1hOjpCbG9ja1Njb3BlSW5mbz4oRnVuY3Rpb25TY29wZXNbZV0pKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIHJldHVybiBGdW5jdGlvblNjb3Blc1tlXTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBFeHByVD4KICAgdm9pZCByZWNvcmRVc2VPZkV2YWx1YXRlZFdlYWsoY29uc3QgRXhwclQgKkUsIGJvb2wgSXNSZWFkPXRydWUpIHsKICAgICBpZiAoIWlzVW5ldmFsdWF0ZWRDb250ZXh0KCkpCkBAIC0xMDg2LDYgKzExMjgsOCBAQAogICBDYW5UaHJvd1Jlc3VsdCBjYW5UaHJvdyhjb25zdCBFeHByICpFKTsKICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlJlc29sdmVFeGNlcHRpb25TcGVjKFNvdXJjZUxvY2F0aW9uIExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpGUFQpOworICB2b2lkIFVwZGF0ZUV4Y2VwdGlvblNwZWMoRnVuY3Rpb25EZWNsICpGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gJkVQSSk7CiAgIGJvb2wgQ2hlY2tTcGVjaWZpZWRFeGNlcHRpb25UeXBlKFF1YWxUeXBlICZULCBjb25zdCBTb3VyY2VSYW5nZSAmUmFuZ2UpOwogICBib29sIENoZWNrRGlzdGFudEV4Y2VwdGlvblNwZWMoUXVhbFR5cGUgVCk7CiAgIGJvb2wgQ2hlY2tFcXVpdmFsZW50RXhjZXB0aW9uU3BlYyhGdW5jdGlvbkRlY2wgKk9sZCwgRnVuY3Rpb25EZWNsICpOZXcpOwpAQCAtMTE0OCw3ICsxMTkyLDcgQEAKICAgcHVibGljOgogICAgIEJvdW5kVHlwZURpYWdub3NlcjEodW5zaWduZWQgRGlhZ0lELCBjb25zdCBUMSAmQXJnMSkKICAgICAgIDogVHlwZURpYWdub3NlcihEaWFnSUQgPT0gMCksIERpYWdJRChEaWFnSUQpLCBBcmcxKEFyZzEpIHsgfQotICAgIHZpcnR1YWwgdm9pZCBkaWFnbm9zZShTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIHsKKyAgICB2b2lkIGRpYWdub3NlKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgb3ZlcnJpZGUgewogICAgICAgaWYgKFN1cHByZXNzZWQpIHJldHVybjsKICAgICAgIFMuRGlhZyhMb2MsIERpYWdJRCkgPDwgZ2V0UHJpbnRhYmxlKEFyZzEpIDw8IFQ7CiAgICAgfQpAQCAtMTE2OCw3ICsxMjEyLDcgQEAKICAgICAgIDogVHlwZURpYWdub3NlcihEaWFnSUQgPT0gMCksIERpYWdJRChEaWFnSUQpLCBBcmcxKEFyZzEpLAogICAgICAgICBBcmcyKEFyZzIpIHsgfQogCi0gICAgdmlydHVhbCB2b2lkIGRpYWdub3NlKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgeworICAgIHZvaWQgZGlhZ25vc2UoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKSBvdmVycmlkZSB7CiAgICAgICBpZiAoU3VwcHJlc3NlZCkgcmV0dXJuOwogICAgICAgUy5EaWFnKExvYywgRGlhZ0lEKSA8PCBnZXRQcmludGFibGUoQXJnMSkgPDwgZ2V0UHJpbnRhYmxlKEFyZzIpIDw8IFQ7CiAgICAgfQpAQCAtMTE4OSw3ICsxMjMzLDcgQEAKICAgICA6IFR5cGVEaWFnbm9zZXIoRGlhZ0lEID09IDApLCBEaWFnSUQoRGlhZ0lEKSwgQXJnMShBcmcxKSwKICAgICAgIEFyZzIoQXJnMiksIEFyZzMoQXJnMykgeyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZGlhZ25vc2UoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKSB7CisgICAgdm9pZCBkaWFnbm9zZShTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIG92ZXJyaWRlIHsKICAgICAgIGlmIChTdXBwcmVzc2VkKSByZXR1cm47CiAgICAgICBTLkRpYWcoTG9jLCBEaWFnSUQpCiAgICAgICAgIDw8IGdldFByaW50YWJsZShBcmcxKSA8PCBnZXRQcmludGFibGUoQXJnMikgPDwgZ2V0UHJpbnRhYmxlKEFyZzMpIDw8IFQ7CkBAIC0xMjk5LDExICsxMzQzLDYgQEAKICAgLy8vIGZ1bmN0aW9uIHRvIHBpbiB0aGVtIG9uLiBBY3RPbkZ1bmN0aW9uRGVjbGFyYXRvciByZWFkcyB0aGlzIGxpc3QgYW5kIHBhdGNoZXMKICAgLy8vIHRoZW0gaW50byB0aGUgRnVuY3Rpb25EZWNsLgogICBzdGQ6OnZlY3RvcjxOYW1lZERlY2wqPiBEZWNsc0luUHJvdG90eXBlU2NvcGU7Ci0gIC8vLyBOb256ZXJvIGlmIHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZyBhIGZ1bmN0aW9uIGRlY2xhcmF0b3IuIFRoaXMgaXMgYSBjb3VudGVyCi0gIC8vLyBhcyBvcHBvc2VkIHRvIGEgYm9vbGVhbiBzbyB3ZSBjYW4gZGVhbCB3aXRoIG5lc3RlZCBmdW5jdGlvbiBkZWNsYXJhdG9ycwotICAvLy8gc3VjaCBhczoKLSAgLy8vICAgICB2b2lkIGYodm9pZCAoKmcpKCksIC4uLikKLSAgdW5zaWduZWQgSW5GdW5jdGlvbkRlY2xhcmF0b3I7CiAKICAgRGVjbEdyb3VwUHRyVHkgQ29udmVydERlY2xUb0RlY2xHcm91cChEZWNsICpQdHIsIERlY2wgKk93bmVkVHlwZSA9IDApOwogCkBAIC0xMzI1LDcgKzEzNjQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElJTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlICpTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAqU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSAmU3VnZ2VzdGVkVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSAmU3VnZ2VzdGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93Q2xhc3NUZW1wbGF0ZXMgPSBmYWxzZSk7CiAKICAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIHJlc3VsdCBvZiB0aGUgbmFtZSBsb29rdXAgYW5kIHJlc29sdXRpb24gcGVyZm9ybWVkCiAgIC8vLyBieSBcYyBDbGFzc2lmeU5hbWUoKS4KQEAgLTE0ODIsOCArMTUyMiw2IEBACiAgIHZvaWQgQ2hlY2tWYXJpYWJsZURlY2xhcmF0aW9uVHlwZShWYXJEZWNsICpOZXdWRCk7CiAgIHZvaWQgQ2hlY2tDb21wbGV0ZVZhcmlhYmxlRGVjbGFyYXRpb24oVmFyRGVjbCAqdmFyKTsKICAgdm9pZCBNYXliZVN1Z2dlc3RBZGRpbmdTdGF0aWNUb0RlY2woY29uc3QgRnVuY3Rpb25EZWNsICpEKTsKLSAgdm9pZCBBY3RPblN0YXJ0RnVuY3Rpb25EZWNsYXJhdG9yKCk7Ci0gIHZvaWQgQWN0T25FbmRGdW5jdGlvbkRlY2xhcmF0b3IoKTsKIAogICBOYW1lZERlY2wqIEFjdE9uRnVuY3Rpb25EZWNsYXJhdG9yKFNjb3BlKiBTLCBEZWNsYXJhdG9yJiBELCBEZWNsQ29udGV4dCogREMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLApAQCAtMTQ5MSw3ICsxNTI5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVRlbXBsYXRlUGFyYW1zQXJnIFRlbXBsYXRlUGFyYW1MaXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZBZGRUb1Njb3BlKTsKICAgYm9vbCBBZGRPdmVycmlkZGVuTWV0aG9kcyhDWFhSZWNvcmREZWNsICpEQywgQ1hYTWV0aG9kRGVjbCAqTUQpOwotICB2b2lkIGNoZWNrVm9pZFBhcmFtRGVjbChQYXJtVmFyRGVjbCAqUGFyYW0pOwogCiAgIGJvb2wgQ2hlY2tDb25zdGV4cHJGdW5jdGlvbkRlY2woY29uc3QgRnVuY3Rpb25EZWNsICpGRCk7CiAgIGJvb2wgQ2hlY2tDb25zdGV4cHJGdW5jdGlvbkJvZHkoY29uc3QgRnVuY3Rpb25EZWNsICpGRCwgU3RtdCAqQm9keSk7CkBAIC0xNTU1LDYgKzE1OTIsMTYgQEAKICAgICByZXR1cm4gRCAmJiBpc2E8T2JqQ01ldGhvZERlY2w+KEQpOwogICB9CiAKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB3ZSBjYW4gZGVsYXkgcGFyc2luZyB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIG9yCisgIC8vLyBmdW5jdGlvbiB0ZW1wbGF0ZSB1bnRpbCBpdCBpcyB1c2VkLCBhc3N1bWluZyB3ZSBkb24ndCBjYXJlIGFib3V0IGVtaXR0aW5nCisgIC8vLyBjb2RlIGZvciB0aGF0IGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgd2lsbCBiZSBcYyBmYWxzZSBpZiB3ZSBtYXkgbmVlZCB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlCisgIC8vLyBtaWRkbGUgb2YgcGFyc2luZyBhbiBleHByZXNzaW9uICh3aGVyZSBpdCdzIGltcHJhY3RpY2FsIHRvIHN3aXRjaCB0bworICAvLy8gcGFyc2luZyBhIGRpZmZlcmVudCBmdW5jdGlvbiksIGZvciBpbnN0YW5jZSwgaWYgaXQncyBjb25zdGV4cHIgaW4gQysrMTEKKyAgLy8vIG9yIGhhcyBhbiAnYXV0bycgcmV0dXJuIHR5cGUgaW4gQysrMTQuIFRoZXNlIGNhc2VzIGFyZSBlc3NlbnRpYWxseSBidWdzLgorICBib29sIGNhbkRlbGF5RnVuY3Rpb25Cb2R5KGNvbnN0IERlY2xhcmF0b3IgJkQpOworCiAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIHdoZXRoZXIgd2UgY2FuIHNraXAgcGFyc2luZyB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uCiAgIC8vLyBkZWZpbml0aW9uLCBhc3N1bWluZyB3ZSBkb24ndCBjYXJlIGFib3V0IGFuYWx5emluZyBpdHMgYm9keSBvciBlbWl0dGluZwogICAvLy8gY29kZSBmb3IgdGhhdCBmdW5jdGlvbi4KQEAgLTE2NDAsNyArMTY4Nyw4IEBACiAKICAgRGVjbCAqQnVpbGRBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKFNjb3BlICpTLCBEZWNsU3BlYyAmRFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NTcGVjaWZpZXIgQVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmREZWNsICpSZWNvcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkRGVjbCAqUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSk7CiAKICAgRGVjbCAqQnVpbGRNaWNyb3NvZnRDQW5vbnltb3VzU3RydWN0KFNjb3BlICpTLCBEZWNsU3BlYyAmRFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmREZWNsICpSZWNvcmQpOwpAQCAtMTY2NSw3ICsxNzEzLDggQEAKICAgICAgICAgICAgICAgICAgTXVsdGlUZW1wbGF0ZVBhcmFtc0FyZyBUZW1wbGF0ZVBhcmFtZXRlckxpc3RzLAogICAgICAgICAgICAgICAgICBib29sICZPd25lZERlY2wsIGJvb2wgJklzRGVwZW5kZW50LAogICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTY29wZWRFbnVtS1dMb2MsCi0gICAgICAgICAgICAgICAgIGJvb2wgU2NvcGVkRW51bVVzZXNDbGFzc1RhZywgVHlwZVJlc3VsdCBVbmRlcmx5aW5nVHlwZSk7CisgICAgICAgICAgICAgICAgIGJvb2wgU2NvcGVkRW51bVVzZXNDbGFzc1RhZywgVHlwZVJlc3VsdCBVbmRlcmx5aW5nVHlwZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBJc1R5cGVTcGVjaWZpZXIpOwogCiAgIERlY2wgKkFjdE9uVGVtcGxhdGVkRnJpZW5kVGFnKFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBGcmllbmRMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRhZ1NwZWMsIFNvdXJjZUxvY2F0aW9uIFRhZ0xvYywKQEAgLTE4MjMsMTEgKzE4NzIsMTEgQEAKICAgLy8vIGlmICdEJyBpcyBpbiBTY29wZSAnUycsIG90aGVyd2lzZSAnUycgaXMgaWdub3JlZCBhbmQgaXNEZWNsSW5TY29wZSByZXR1cm5zCiAgIC8vLyB0cnVlIGlmICdEJyBiZWxvbmdzIHRvIHRoZSBnaXZlbiBkZWNsYXJhdGlvbiBjb250ZXh0LgogICAvLy8KLSAgLy8vIFxwYXJhbSBFeHBsaWNpdEluc3RhbnRpYXRpb25PclNwZWNpYWxpemF0aW9uIFdoZW4gdHJ1ZSwgd2UgYXJlIGNoZWNraW5nCi0gIC8vLyB3aGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBpcyBpbiBzY29wZSBmb3IgdGhlIHB1cnBvc2VzIG9mIGV4cGxpY2l0IHRlbXBsYXRlCi0gIC8vLyBpbnN0YW50aWF0aW9uIG9yIHNwZWNpYWxpemF0aW9uLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KKyAgLy8vIFxwYXJhbSBBbGxvd0lubGluZU5hbWVzcGFjZSBJZiBcYyB0cnVlLCBhbGxvdyB0aGUgZGVjbGFyYXRpb24gdG8gYmUgaW4gdGhlCisgIC8vLyAgICAgICAgZW5jbG9zaW5nIG5hbWVzcGFjZSBzZXQgb2YgdGhlIGNvbnRleHQsIHJhdGhlciB0aGFuIGNvbnRhaW5lZAorICAvLy8gICAgICAgIGRpcmVjdGx5IHdpdGhpbiBpdC4KICAgYm9vbCBpc0RlY2xJblNjb3BlKE5hbWVkRGVjbCAqRCwgRGVjbENvbnRleHQgKkN0eCwgU2NvcGUgKlMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBsaWNpdEluc3RhbnRpYXRpb25PclNwZWNpYWxpemF0aW9uID0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0lubGluZU5hbWVzcGFjZSA9IGZhbHNlKTsKIAogICAvLy8gRmluZHMgdGhlIHNjb3BlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGRlY2wgY29udGV4dCwgaWYgaXQKICAgLy8vIGhhcHBlbnMgdG8gYmUgYW4gZW5jbG9zaW5nIHNjb3BlLiAgT3RoZXJ3aXNlIHJldHVybiBOVUxMLgpAQCAtMTg1OCw2ICsxOTA3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyU3BlbGxpbmdMaXN0SW5kZXgpOwogICBETExFeHBvcnRBdHRyICptZXJnZURMTEV4cG9ydEF0dHIoRGVjbCAqRCwgU291cmNlUmFuZ2UgUmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyU3BlbGxpbmdMaXN0SW5kZXgpOworICBNU0luaGVyaXRhbmNlQXR0ciAqCisgIG1lcmdlTVNJbmhlcml0YW5jZUF0dHIoRGVjbCAqRCwgU291cmNlUmFuZ2UgUmFuZ2UsIGJvb2wgQmVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXR0clNwZWxsaW5nTGlzdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBTZW1hbnRpY1NwZWxsaW5nKTsKICAgRm9ybWF0QXR0ciAqbWVyZ2VGb3JtYXRBdHRyKERlY2wgKkQsIFNvdXJjZVJhbmdlIFJhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKkZvcm1hdCwgaW50IEZvcm1hdElkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBGaXJzdEFyZywgdW5zaWduZWQgQXR0clNwZWxsaW5nTGlzdEluZGV4KTsKQEAgLTE4ODAsNyArMTkzMyw3IEBACiAgIHZvaWQgbWVyZ2VEZWNsQXR0cmlidXRlcyhOYW1lZERlY2wgKk5ldywgRGVjbCAqT2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZhaWxhYmlsaXR5TWVyZ2VLaW5kIEFNSyA9IEFNS19SZWRlY2xhcmF0aW9uKTsKICAgdm9pZCBNZXJnZVR5cGVkZWZOYW1lRGVjbChUeXBlZGVmTmFtZURlY2wgKk5ldywgTG9va3VwUmVzdWx0ICZPbGREZWNscyk7Ci0gIGJvb2wgTWVyZ2VGdW5jdGlvbkRlY2woRnVuY3Rpb25EZWNsICpOZXcsIERlY2wgKk9sZCwgU2NvcGUgKlMsCisgIGJvb2wgTWVyZ2VGdW5jdGlvbkRlY2woRnVuY3Rpb25EZWNsICpOZXcsIE5hbWVkRGVjbCAqJk9sZCwgU2NvcGUgKlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNZXJnZVR5cGVXaXRoT2xkKTsKICAgYm9vbCBNZXJnZUNvbXBhdGlibGVGdW5jdGlvbkRlY2xzKEZ1bmN0aW9uRGVjbCAqTmV3LCBGdW5jdGlvbkRlY2wgKk9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlICpTLCBib29sIE1lcmdlVHlwZVdpdGhPbGQpOwpAQCAtMTk1MSw5ICsyMDA0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlICZDb252ZXJ0ZWRUeXBlKTsKICAgYm9vbCBJc0Jsb2NrUG9pbnRlckNvbnZlcnNpb24oUXVhbFR5cGUgRnJvbVR5cGUsIFF1YWxUeXBlIFRvVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUmIENvbnZlcnRlZFR5cGUpOwotICBib29sIEZ1bmN0aW9uQXJnVHlwZXNBcmVFcXVhbChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqT2xkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKk5ld1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpBcmdQb3MgPSAwKTsKKyAgYm9vbCBGdW5jdGlvblBhcmFtVHlwZXNBcmVFcXVhbChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqT2xkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqTmV3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqQXJnUG9zID0gMCk7CiAgIHZvaWQgSGFuZGxlRnVuY3Rpb25UeXBlTWlzbWF0Y2goUGFydGlhbERpYWdub3N0aWMgJlBEaWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEZyb21UeXBlLCBRdWFsVHlwZSBUb1R5cGUpOwogCkBAIC0yMDY3LDEwICsyMTIwLDEwIEBACiAgICAgICAgICAgQWxsb3dTY29wZWRFbnVtZXJhdGlvbnMoQWxsb3dTY29wZWRFbnVtZXJhdGlvbnMpIHt9CiAKICAgICAvLy8gTWF0Y2ggYW4gaW50ZWdyYWwgb3IgKHBvc3NpYmx5IHNjb3BlZCkgZW51bWVyYXRpb24gdHlwZS4KLSAgICBib29sIG1hdGNoKFF1YWxUeXBlIFQpOworICAgIGJvb2wgbWF0Y2goUXVhbFR5cGUgVCkgb3ZlcnJpZGU7CiAKICAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIKLSAgICBkaWFnbm9zZU5vTWF0Y2goU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKSB7CisgICAgZGlhZ25vc2VOb01hdGNoKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgb3ZlcnJpZGUgewogICAgICAgcmV0dXJuIGRpYWdub3NlTm90SW50KFMsIExvYywgVCk7CiAgICAgfQogCkBAIC0yMTYwLDEzICsyMjEzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsICpBY3RpbmdDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqRnJvbSwgUXVhbFR5cGUgVG9UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGVTZXQmIENhbmRpZGF0ZVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dPYmpDQ29udmVyc2lvbk9uRXhwbGljaXQgPSBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93T2JqQ0NvbnZlcnNpb25PbkV4cGxpY2l0KTsKICAgdm9pZCBBZGRUZW1wbGF0ZUNvbnZlcnNpb25DYW5kaWRhdGUoRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkZ1bmN0aW9uVGVtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqQWN0aW5nQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqRnJvbSwgUXVhbFR5cGUgVG9UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZVNldCAmQ2FuZGlkYXRlU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd09iakNDb252ZXJzaW9uT25FeHBsaWNpdCA9IGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd09iakNDb252ZXJzaW9uT25FeHBsaWNpdCk7CiAgIHZvaWQgQWRkU3Vycm9nYXRlQ2FuZGlkYXRlKENYWENvbnZlcnNpb25EZWNsICpDb252ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQWNjZXNzUGFpciBGb3VuZERlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wgKkFjdGluZ0NvbnRleHQsCkBAIC0yMTk5LDYgKzIyNTIsMTEgQEAKICAgLy8gaWRlbnRpZmllZCBieSB0aGUgZXhwcmVzc2lvbiBFeHByCiAgIHZvaWQgTm90ZUFsbE92ZXJsb2FkQ2FuZGlkYXRlcyhFeHByKiBFLCBRdWFsVHlwZSBEZXN0VHlwZSA9IFF1YWxUeXBlKCkpOwogCisgIC8vLyBDaGVjayB0aGUgZW5hYmxlX2lmIGV4cHJlc3Npb25zIG9uIHRoZSBnaXZlbiBmdW5jdGlvbi4gUmV0dXJucyB0aGUgZmlyc3QKKyAgLy8vIGZhaWxpbmcgYXR0cmlidXRlLCBvciBOVUxMIGlmIHRoZXkgd2VyZSBhbGwgc3VjY2Vzc2Z1bC4KKyAgRW5hYmxlSWZBdHRyICpDaGVja0VuYWJsZUlmKEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24sIEFycmF5UmVmPEV4cHIgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWlzc2luZ0ltcGxpY2l0VGhpcyA9IGZhbHNlKTsKKwogICAvLyBbUG9zc2libHlBRnVuY3Rpb25UeXBlXSAgLS0+ICAgW1JldHVybl0KICAgLy8gTm9uRnVuY3Rpb25UeXBlIC0tPiBOb25GdW5jdGlvblR5cGUKICAgLy8gUiAoQSkgLS0+IFIoQSkKQEAgLTI0ODQsNiArMjU0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSVmFsdWVUaGlzLCB1bnNpZ25lZCBUaGlzUXVhbHMpOwogICBDWFhEZXN0cnVjdG9yRGVjbCAqTG9va3VwRGVzdHJ1Y3RvcihDWFhSZWNvcmREZWNsICpDbGFzcyk7CiAKKyAgYm9vbCBjaGVja0xpdGVyYWxPcGVyYXRvcklkKGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsIGNvbnN0IFVucXVhbGlmaWVkSWQgJklkKTsKICAgTGl0ZXJhbE9wZXJhdG9yTG9va3VwUmVzdWx0IExvb2t1cExpdGVyYWxPcGVyYXRvcihTY29wZSAqUywgTG9va3VwUmVzdWx0ICZSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFF1YWxUeXBlPiBBcmdUeXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1JhdywKQEAgLTI1MjcsOCArMjU4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc29jaWF0ZWRDbGFzc1NldCAmQXNzb2NpYXRlZENsYXNzZXMpOwogCiAgIHZvaWQgRmlsdGVyTG9va3VwRm9yU2NvcGUoTG9va3VwUmVzdWx0ICZSLCBEZWNsQ29udGV4dCAqQ3R4LCBTY29wZSAqUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbnNpZGVyTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4cGxpY2l0SW5zdGFudGlhdGlvbk9yU3BlY2lhbGl6YXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29uc2lkZXJMaW5rYWdlLCBib29sIEFsbG93SW5saW5lTmFtZXNwYWNlKTsKIAogICB2b2lkIERpYWdub3NlQW1iaWd1b3VzTG9va3VwKExvb2t1cFJlc3VsdCAmUmVzdWx0KTsKICAgLy9AfQpAQCAtMjU2Miw2ICsyNjIwLDkgQEAKICAgYm9vbCBjaGVja1N0cmluZ0xpdGVyYWxBcmd1bWVudEF0dHIoY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJnTnVtLCBTdHJpbmdSZWYgJlN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKkFyZ0xvY2F0aW9uID0gMCk7CisgIGJvb2wgY2hlY2tNU0luaGVyaXRhbmNlQXR0ck9uRGVmaW5pdGlvbigKKyAgICAgIENYWFJlY29yZERlY2wgKlJELCBTb3VyY2VSYW5nZSBSYW5nZSwgYm9vbCBCZXN0Q2FzZSwKKyAgICAgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBTZW1hbnRpY1NwZWxsaW5nKTsKIAogICB2b2lkIENoZWNrQWxpZ25hc1VuZGVyYWxpZ25tZW50KERlY2wgKkQpOwogCkBAIC0yNTcwLDYgKzI2MzEsMTEgQEAKICAgLy8vIGZ1bmN0aW9uIHR5cGUgdHlwZWRlZnMgYW5kIHR5cGVuYW1lIHRlbXBsYXRlIGFyZ3VtZW50cy4KICAgdm9pZCBhZGp1c3RNZW1iZXJGdW5jdGlvbkNDKFF1YWxUeXBlICZULCBib29sIElzU3RhdGljKTsKIAorICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBleHBsaWNpdCBhdHRyaWJ1dGUsIGJ1dCBvbmx5IGxvb2sgdGhyb3VnaCBwYXJlbnMuCisgIC8vIFRoZSBpbnRlbnQgaXMgdG8gbG9vayBmb3IgYW4gYXR0cmlidXRlIG9uIHRoZSBjdXJyZW50IGRlY2xhcmF0b3IsIGJ1dCBub3QKKyAgLy8gb25lIHRoYXQgY2FtZSBmcm9tIGEgdHlwZWRlZi4KKyAgYm9vbCBoYXNFeHBsaWNpdENhbGxpbmdDb252KFF1YWxUeXBlICZUKTsKKwogICAvLy8gR2V0IHRoZSBvdXRlcm1vc3QgQXR0cmlidXRlZFR5cGUgbm9kZSB0aGF0IHNldHMgYSBjYWxsaW5nIGNvbnZlbnRpb24uCiAgIC8vLyBWYWxpZCB0eXBlcyBzaG91bGQgbm90IGhhdmUgbXVsdGlwbGUgYXR0cmlidXRlcyB3aXRoIGRpZmZlcmVudCBDQ3MuCiAgIGNvbnN0IEF0dHJpYnV0ZWRUeXBlICpnZXRDYWxsaW5nQ29udkF0dHJpYnV0ZWRUeXBlKFF1YWxUeXBlIFQpIGNvbnN0OwpAQCAtMjU3OCw4ICsyNjQ0LDYgQEAKICAgU3RtdFJlc3VsdCBQcm9jZXNzU3RtdEF0dHJpYnV0ZXMoU3RtdCAqU3RtdCwgQXR0cmlidXRlTGlzdCAqQXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlKTsKIAotICB2b2lkIFdhcm5VbmRlZmluZWRNZXRob2QoU291cmNlTG9jYXRpb24gSW1wTG9jLCBPYmpDTWV0aG9kRGVjbCAqbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSW5jb21wbGV0ZUltcGwsIHVuc2lnbmVkIERpYWdJRCk7CiAgIHZvaWQgV2FybkNvbmZsaWN0aW5nVHlwZWRNZXRob2RzKE9iakNNZXRob2REZWNsICpNZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpNZXRob2REZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzUHJvdG9jb2xNZXRob2REZWNsKTsKQEAgLTI1OTcsMTUgKzI2NjEsNiBAQAogICB0eXBlZGVmIGxsdm06OlNtYWxsUHRyU2V0PFNlbGVjdG9yLCA4PiBTZWxlY3RvclNldDsKICAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxTZWxlY3RvciwgT2JqQ01ldGhvZERlY2wqPiBQcm90b2NvbHNNZXRob2RzTWFwOwogCi0gIC8vLyBDaGVja1Byb3RvY29sTWV0aG9kRGVmcyAtIFRoaXMgcm91dGluZSBjaGVja3MgdW5pbXBsZW1lbnRlZAotICAvLy8gbWV0aG9kcyBkZWNsYXJlZCBpbiBwcm90b2NvbCwgYW5kIHRob3NlIHJlZmVyZW5jZWQgYnkgaXQuCi0gIHZvaWQgQ2hlY2tQcm90b2NvbE1ldGhvZERlZnMoU291cmNlTG9jYXRpb24gSW1wTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNQcm90b2NvbERlY2wgKlBEZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIEluY29tcGxldGVJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdG9yU2V0ICZJbnNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VsZWN0b3JTZXQgJkNsc01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDQ29udGFpbmVyRGVjbCAqQ0RlY2wpOwotCiAgIC8vLyBDaGVja0ltcGxlbWVudGF0aW9uSXZhcnMgLSBUaGlzIHJvdXRpbmUgY2hlY2tzIGlmIHRoZSBpbnN0YW5jZSB2YXJpYWJsZXMKICAgLy8vIGxpc3RlZCBpbiB0aGUgaW1wbGVsZW1lbnRhdGlvbiBtYXRjaCB0aG9zZSBsaXN0ZWQgaW4gdGhlIGludGVyZmFjZS4KICAgdm9pZCBDaGVja0ltcGxlbWVudGF0aW9uSXZhcnMoT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSW1wRGVjbCwKQEAgLTI2MjEsNyArMjY3Niw4IEBACiAgIC8vLyBEaWFnbm9zZVVuaW1wbGVtZW50ZWRQcm9wZXJ0aWVzIC0gVGhpcyByb3V0aW5lIHdhcm5zIG9uIHRob3NlIHByb3BlcnRpZXMKICAgLy8vIHdoaWNoIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4KICAgdm9pZCBEaWFnbm9zZVVuaW1wbGVtZW50ZWRQcm9wZXJ0aWVzKFNjb3BlICpTLCBPYmpDSW1wbERlY2wqIElNUERlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDQ29udGFpbmVyRGVjbCAqQ0RlY2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0NvbnRhaW5lckRlY2wgKkNEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTeW50aGVzaXplUHJvcGVydGllcyk7CiAKICAgLy8vIERlZmF1bHRTeW50aGVzaXplUHJvcGVydGllcyAtIFRoaXMgcm91dGluZSBkZWZhdWx0IHN5bnRoZXNpemVzIGFsbAogICAvLy8gcHJvcGVydGllcyB3aGljaCBtdXN0IGJlIHN5bnRoZXNpemVkIGluIHRoZSBjbGFzcydzIFxAaW1wbGVtZW50YXRpb24uCkBAIC0yNjI5LDEyICsyNjg1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VEZWNsICpJRGVjbCk7CiAgIHZvaWQgRGVmYXVsdFN5bnRoZXNpemVQcm9wZXJ0aWVzKFNjb3BlICpTLCBEZWNsICpEKTsKIAotICAvLy8gQ29sbGVjdEltbWVkaWF0ZVByb3BlcnRpZXMgLSBUaGlzIHJvdXRpbmUgY29sbGVjdHMgYWxsIHByb3BlcnRpZXMgaW4KLSAgLy8vIHRoZSBjbGFzcyBhbmQgaXRzIGNvbmZvcm1pbmcgcHJvdG9jb2xzOyBidXQgbm90IHRob3NlIGl0IGl0cyBzdXBlciBjbGFzcy4KLSAgdm9pZCBDb2xsZWN0SW1tZWRpYXRlUHJvcGVydGllcyhPYmpDQ29udGFpbmVyRGVjbCAqQ0RlY2wsCi0gICAgICAgICAgICBsbHZtOjpEZW5zZU1hcDxJZGVudGlmaWVySW5mbyAqLCBPYmpDUHJvcGVydHlEZWNsKj4mIFByb3BNYXAsCi0gICAgICAgICAgICBsbHZtOjpEZW5zZU1hcDxJZGVudGlmaWVySW5mbyAqLCBPYmpDUHJvcGVydHlEZWNsKj4mIFN1cGVyUHJvcE1hcCk7Ci0gIAogICAvLy8gSXZhckJhY2tzQ3VycmVudE1ldGhvZEFjY2Vzc29yIC0gVGhpcyByb3V0aW5lIHJldHVybnMgJ3RydWUnIGlmICdJVicgaXMKICAgLy8vIGFuIGl2YXIgc3ludGhlc2l6ZWQgZm9yICdNZXRob2QnIGFuZCAnTWV0aG9kJyBpcyBhIHByb3BlcnR5IGFjY2Vzc29yCiAgIC8vLyBkZWNsYXJlZCBpbiBjbGFzcyAnSUZhY2UnLgpAQCAtMjY0Myw3ICsyNjkzLDggQEAKICAgCiAgIC8vLyBEaWFnbm9zZVVudXNlZEJhY2tpbmdJdmFySW5BY2Nlc3NvciAtIElzc3VlIGFuICd1bnVzZWQnIHdhcm5pbmcgaWYgaXZhciB3aGljaAogICAvLy8gYmFja3MgdGhlIHByb3BlcnR5IGlzIG5vdCB1c2VkIGluIHRoZSBwcm9wZXJ0eSdzIGFjY2Vzc29yLgotICB2b2lkIERpYWdub3NlVW51c2VkQmFja2luZ0l2YXJJbkFjY2Vzc29yKFNjb3BlICpTKTsKKyAgdm9pZCBEaWFnbm9zZVVudXNlZEJhY2tpbmdJdmFySW5BY2Nlc3NvcihTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpJbXBsRCk7CiAgIAogICAvLy8gR2V0SXZhckJhY2tpbmdQcm9wZXJ0eUFjY2Vzc29yIC0gSWYgbWV0aG9kIGlzIGEgcHJvcGVydHkgc2V0dGVyL2dldHRlciBhbmQKICAgLy8vIGl0IHByb3BlcnR5IGhhcyBhIGJhY2tpbmcgaXZhciwgcmV0dXJucyB0aGlzIGl2YXI7IG90aGVyd2lzZSwgcmV0dXJucyBOVUxMLgpAQCAtMjY5Miw2ICsyNzQzLDEwIEBACiAKICAgdm9pZCBEaWFnbm9zZU93bmluZ1Byb3BlcnR5R2V0dGVyU3ludGhlc2lzKGNvbnN0IE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKkQpOwogCisgIHZvaWQgRGlhZ25vc2VNaXNzaW5nRGVzaWduYXRlZEluaXRPdmVycmlkZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpJbXBsRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRkQpOworCiAgIHZvaWQgRGlhZ25vc2VEdXBsaWNhdGVJdmFycyhPYmpDSW50ZXJmYWNlRGVjbCAqSUQsIE9iakNJbnRlcmZhY2VEZWNsICpTSUQpOwogCiAgIGVudW0gTWV0aG9kTWF0Y2hTdHJhdGVneSB7CkBAIC0yNzg1LDEyICsyODQwLDYgQEAKIAogICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqU2VsZWN0b3JzRm9yVHlwb0NvcnJlY3Rpb24oU2VsZWN0b3IgU2VsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgT2JqZWN0VHlwZT1RdWFsVHlwZSgpKTsKLSAgCi0gIC8vLyBEaWFnbm9zZU1pc21hdGNoZWRNZXRob2RzSW5HbG9iYWxQb29sIC0gVGhpcyByb3V0aW5lIGdvZXMgdGhyb3VnaCBsaXN0IG9mCi0gIC8vLyBtZXRob2RzIGluIGdsb2JhbCBwb29sIGFuZCBpc3N1ZXMgZGlhZ25vc3RpYyBvbiBpZGVudGljYWwgc2VsZWN0b3JzIHdoaWNoCi0gIC8vLyBoYXZlIG1pc21hdGhjaGVkIHR5cGVzLgotICB2b2lkIERpYWdub3NlTWlzbWF0Y2hlZE1ldGhvZHNJbkdsb2JhbFBvb2woKTsKLSAgCiAgIC8vLyBMb29rdXBJbXBsZW1lbnRlZE1ldGhvZEluR2xvYmFsUG9vbCAtIFJldHVybnMgdGhlIG1ldGhvZCB3aGljaCBoYXMgYW4KICAgLy8vIGltcGxlbWVudGF0aW9uLgogICBPYmpDTWV0aG9kRGVjbCAqTG9va3VwSW1wbGVtZW50ZWRNZXRob2RJbkdsb2JhbFBvb2woU2VsZWN0b3IgU2VsKTsKQEAgLTMwODMsMTIgKzMxMzIsMTUgQEAKIAogICB2b2lkIHJlZGVsYXlEaWFnbm9zdGljcyhzZW1hOjpEZWxheWVkRGlhZ25vc3RpY1Bvb2wgJnBvb2wpOwogCi0gIHZvaWQgRW1pdERlcHJlY2F0aW9uV2FybmluZyhOYW1lZERlY2wgKkQsIFN0cmluZ1JlZiBNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKlVua25vd25PYmpDQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICAqT2JqQ1Byb3BlcnR5KTsKKyAgZW51bSBBdmFpbGFiaWxpdHlEaWFnbm9zdGljIHsgQURfRGVwcmVjYXRpb24sIEFEX1VuYXZhaWxhYmxlIH07CiAKLSAgdm9pZCBIYW5kbGVEZWxheWVkRGVwcmVjYXRpb25DaGVjayhzZW1hOjpEZWxheWVkRGlhZ25vc3RpYyAmREQsIERlY2wgKkN0eCk7CisgIHZvaWQgRW1pdEF2YWlsYWJpbGl0eVdhcm5pbmcoQXZhaWxhYmlsaXR5RGlhZ25vc3RpYyBBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkQsIFN0cmluZ1JlZiBNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqVW5rbm93bk9iakNDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICAqT2JqQ1Byb3BlcnR5KTsKKworICB2b2lkIEhhbmRsZURlbGF5ZWRBdmFpbGFiaWxpdHlDaGVjayhzZW1hOjpEZWxheWVkRGlhZ25vc3RpYyAmREQsIERlY2wgKkN0eCk7CiAKICAgYm9vbCBtYWtlVW5hdmFpbGFibGVJblN5c3RlbUhlYWRlcihTb3VyY2VMb2NhdGlvbiBsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIG1lc3NhZ2UpOwpAQCAtMzY4Miw2ICszNzM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9va3VwUmVzdWx0ICZQcmV2aW91cyk7CiAgIGJvb2wgQ2hlY2tVc2luZ0RlY2xRdWFsaWZpZXIoU291cmNlTG9jYXRpb24gVXNpbmdMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYU2NvcGVTcGVjICZTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBOYW1lTG9jKTsKIAogICBOYW1lZERlY2wgKkJ1aWxkVXNpbmdEZWNsYXJhdGlvbihTY29wZSAqUywgQWNjZXNzU3BlY2lmaWVyIEFTLApAQCAtNDIwOCwzMiArNDI2MSw2IEBACiAgIEV4cHJSZXN1bHQgQnVpbGRDWFhOb2V4Y2VwdEV4cHIoU291cmNlTG9jYXRpb24gS2V5TG9jLCBFeHByICpPcGVyYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbik7CiAKLSAgLy8vIEFjdE9uVW5hcnlUeXBlVHJhaXQgLSBQYXJzZWQgb25lIG9mIHRoZSB1bmFyeSB0eXBlIHRyYWl0IHN1cHBvcnQKLSAgLy8vIHBzZXVkby1mdW5jdGlvbnMuCi0gIEV4cHJSZXN1bHQgQWN0T25VbmFyeVR5cGVUcmFpdChVbmFyeVR5cGVUcmFpdCBPVFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBLV0xvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW4pOwotCi0gIEV4cHJSZXN1bHQgQnVpbGRVbmFyeVR5cGVUcmFpdChVbmFyeVR5cGVUcmFpdCBPVFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBLV0xvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuKTsKLQotICAvLy8gQWN0T25CaW5hcnlUeXBlVHJhaXQgLSBQYXJzZWQgb25lIG9mIHRoZSBiaWFucnkgdHlwZSB0cmFpdCBzdXBwb3J0Ci0gIC8vLyBwc2V1ZG8tZnVuY3Rpb25zLgotICBFeHByUmVzdWx0IEFjdE9uQmluYXJ5VHlwZVRyYWl0KEJpbmFyeVR5cGVUcmFpdCBPVFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gS1dMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBMaHNUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlIFJoc1R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbik7Ci0KLSAgRXhwclJlc3VsdCBCdWlsZEJpbmFyeVR5cGVUcmFpdChCaW5hcnlUeXBlVHJhaXQgQlRULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEtXTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpMaHNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpSaHNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbik7Ci0KICAgLy8vIFxicmllZiBQYXJzZWQgb25lIG9mIHRoZSB0eXBlIHRyYWl0IHN1cHBvcnQgcHNldWRvLWZ1bmN0aW9ucy4KICAgRXhwclJlc3VsdCBBY3RPblR5cGVUcmFpdChUeXBlVHJhaXQgS2luZCwgU291cmNlTG9jYXRpb24gS1dMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVHlwZT4gQXJncywKQEAgLTQ2NDcsOCArNDY3NCw3IEBACiAgIC8vCiAgIERlY2wgKkFjdE9uU3RhcnRMaW5rYWdlU3BlY2lmaWNhdGlvbihTY29wZSAqUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEV4dGVybkxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExhbmdMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTGFuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkxhbmdTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMQnJhY2VMb2MpOwogICBEZWNsICpBY3RPbkZpbmlzaExpbmthZ2VTcGVjaWZpY2F0aW9uKFNjb3BlICpTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKkxpbmthZ2VTcGVjLApAQCAtNDY3Miw4ICs0Njk4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aVRlbXBsYXRlUGFyYW1zQXJnIFRlbXBsYXRlUGFyYW1ldGVyTGlzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpCaXRmaWVsZFdpZHRoLCBjb25zdCBWaXJ0U3BlY2lmaWVycyAmVlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkNsYXNzSW5pdFN0eWxlIEluaXRTdHlsZSk7Ci0gIHZvaWQgQWN0T25DWFhJbkNsYXNzTWVtYmVySW5pdGlhbGl6ZXIoRGVjbCAqVmFyRGVjbCwgU291cmNlTG9jYXRpb24gRXF1YWxMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqSW5pdCk7CisKKyAgdm9pZCBBY3RPblN0YXJ0Q1hYSW5DbGFzc01lbWJlckluaXRpYWxpemVyKCk7CisgIHZvaWQgQWN0T25GaW5pc2hDWFhJbkNsYXNzTWVtYmVySW5pdGlhbGl6ZXIoRGVjbCAqVmFyRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFcXVhbExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpJbml0KTsKIAogICBNZW1Jbml0UmVzdWx0IEFjdE9uTWVtSW5pdGlhbGl6ZXIoRGVjbCAqQ29uc3RydWN0b3JELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUgKlMsCkBAIC00Nzk5LDYgKzQ4MjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0ICpBdHRyTGlzdCk7CiAgIHZvaWQgQWN0T25GaW5pc2hDWFhNZW1iZXJEZWNscygpOwogCisgIHZvaWQgQWN0T25SZWVudGVyQ1hYTWV0aG9kUGFyYW1ldGVyKFNjb3BlICpTLCBQYXJtVmFyRGVjbCAqUGFyYW0pOwogICB2b2lkIEFjdE9uUmVlbnRlclRlbXBsYXRlU2NvcGUoU2NvcGUgKlMsIERlY2wgKlRlbXBsYXRlKTsKICAgdm9pZCBBY3RPblJlZW50ZXJEZWNsYXJhdG9yVGVtcGxhdGVTY29wZShTY29wZSAqUywgRGVjbGFyYXRvckRlY2wgKkQpOwogICB2b2lkIEFjdE9uU3RhcnREZWxheWVkTWVtYmVyRGVjbGFyYXRpb25zKFNjb3BlICpTLCBEZWNsICpSZWNvcmQpOwpAQCAtNTE2Miw3ICs1MTkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJBbmdsZUxvYyk7CiAKICAgRGVjbFJlc3VsdCBBY3RPblZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb24oCi0gICAgICBTY29wZSAqUywgVmFyVGVtcGxhdGVEZWNsICpWYXJUZW1wbGF0ZSwgRGVjbGFyYXRvciAmRCwgVHlwZVNvdXJjZUluZm8gKkRJLAorICAgICAgU2NvcGUgKlMsIERlY2xhcmF0b3IgJkQsIFR5cGVTb3VyY2VJbmZvICpESSwKICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlS1dMb2MsIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVGVtcGxhdGVQYXJhbXMsCiAgICAgICBTdG9yYWdlQ2xhc3MgU0MsIGJvb2wgSXNQYXJ0aWFsU3BlY2lhbGl6YXRpb24pOwogCkBAIC01MzE4LDE4ICs1MzQ4LDEyIEBACiAgIC8vLyBccGFyYW0gQ29udmVydGVkIFdpbGwgcmVjZWl2ZSB0aGUgY29udmVydGVkLCBjYW5vbmljYWxpemVkIHRlbXBsYXRlCiAgIC8vLyBhcmd1bWVudHMuCiAgIC8vLwotICAvLy8KLSAgLy8vIFxwYXJhbSBFeHBhbnNpb25JbnRvRml4ZWRMaXN0IElmIG5vbi1OVUxMLCB3aWxsIGJlIHNldCB0cnVlIHRvIGluZGljYXRlCi0gIC8vLyB3aGVuIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgY29udGFpbiBhIHBhY2sgZXhwYW5zaW9uIHRoYXQgaXMgYmVpbmcKLSAgLy8vIGV4cGFuZGVkIGludG8gYSBmaXhlZCBwYXJhbWV0ZXIgbGlzdC4KLSAgLy8vCi0gIC8vLyBccmV0dXJucyBUcnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCiAgIGJvb2wgQ2hlY2tUZW1wbGF0ZUFyZ3VtZW50TGlzdChUZW1wbGF0ZURlY2wgKlRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJlRlbXBsYXRlQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUGFydGlhbFRlbXBsYXRlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUZW1wbGF0ZUFyZ3VtZW50PiAmQ29udmVydGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqRXhwYW5zaW9uSW50b0ZpeGVkTGlzdCA9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFRlbXBsYXRlQXJndW1lbnQ+ICZDb252ZXJ0ZWQpOwogCiAgIGJvb2wgQ2hlY2tUZW1wbGF0ZVR5cGVBcmd1bWVudChUZW1wbGF0ZVR5cGVQYXJtRGVjbCAqUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TG9jICZBcmcsCkBAIC02MjQ5LDEzICs2MjczLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSA9IFNvdXJjZVJhbmdlKCkpOwogCiAgICAgLy8vIFxicmllZiBOb3RlIHRoYXQgd2UgYXJlIHN1YnN0aXR1dGluZyBwcmlvciB0ZW1wbGF0ZSBhcmd1bWVudHMgaW50byBhCi0gICAgLy8vIG5vbi10eXBlIG9yIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlci4KKyAgICAvLy8gbm9uLXR5cGUgcGFyYW1ldGVyLgogICAgIEluc3RhbnRpYXRpbmdUZW1wbGF0ZShTZW1hICZTZW1hUmVmLCBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpUZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uVHlwZVRlbXBsYXRlUGFybURlY2wgKlBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBUZW1wbGF0ZUFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSk7CiAKKyAgICAvLy8gXGJyaWVmIE5vdGUgdGhhdCB3ZSBhcmUgc3Vic3RpdHV0aW5nIHByaW9yIHRlbXBsYXRlIGFyZ3VtZW50cyBpbnRvIGEKKyAgICAvLy8gdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyLgogICAgIEluc3RhbnRpYXRpbmdUZW1wbGF0ZShTZW1hICZTZW1hUmVmLCBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpUZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsICpQYXJhbSwKQEAgLTYyODcsNiArNjMxMywxNSBAQAogICAgIGJvb2wgQ2hlY2tJbnN0YW50aWF0aW9uRGVwdGgoU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBJbnN0YW50aWF0aW9uUmFuZ2UpOwogCisgICAgLy8gRklYTUU6IFJlcGxhY2UgdGhpcyB3aXRoIGEgY29uc3RydWN0b3Igb25jZSB3ZSBjYW4gdXNlIGRlbGVnYXRpbmcKKyAgICAvLyBjb25zdHJ1Y3RvcnMgaW4gbGx2bS4KKyAgICB2b2lkIEluaXRpYWxpemUoCisgICAgICAgIEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6SW5zdGFudGlhdGlvbktpbmQgS2luZCwKKyAgICAgICAgU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb24sIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSwKKyAgICAgICAgRGVjbCAqRW50aXR5LCBOYW1lZERlY2wgKlRlbXBsYXRlID0gbnVsbHB0ciwKKyAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzID0gQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4oKSwKKyAgICAgICAgc2VtYTo6VGVtcGxhdGVEZWR1Y3Rpb25JbmZvICpEZWR1Y3Rpb25JbmZvID0gbnVsbHB0cik7CisKICAgICBJbnN0YW50aWF0aW5nVGVtcGxhdGUoY29uc3QgSW5zdGFudGlhdGluZ1RlbXBsYXRlJikgTExWTV9ERUxFVEVEX0ZVTkNUSU9OOwogCiAgICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlJgpAQCAtNjkwMiw2ICs2OTM3LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKlN1YkV4cHIpOwogICAKKyAgdm9pZCBDaGVja1RvbGxGcmVlQnJpZGdlQ2FzdChRdWFsVHlwZSBjYXN0VHlwZSwgRXhwciAqY2FzdEV4cHIpOworICAKKyAgYm9vbCBjaGVja09iakNCcmlkZ2VSZWxhdGVkQ29tcG9uZW50cyhTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgRGVzdFR5cGUsIFF1YWxUeXBlIFNyY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKiZSZWxhdGVkQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01ldGhvZERlY2wgKiZDbGFzc01ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTWV0aG9kRGVjbCAqJkluc3RhbmNlTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkZWZOYW1lRGVjbCAqJlRETkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDZlRvTnMpOworICAKKyAgYm9vbCBDaGVja09iakNCcmlkZ2VSZWxhdGVkQ29udmVyc2lvbnMoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBEZXN0VHlwZSwgUXVhbFR5cGUgU3JjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqJlNyY0V4cHIpOworICAKKyAgYm9vbCBDb252ZXJzaW9uVG9PYmpDU3RyaW5nTGl0ZXJhbENoZWNrKFF1YWxUeXBlIERzdFR5cGUsIEV4cHIgKiZTcmNFeHByKTsKKyAgCiAgIGJvb2wgY2hlY2tJbml0TWV0aG9kKE9iakNNZXRob2REZWNsICptZXRob2QsIFF1YWxUeXBlIHJlY2VpdmVyVHlwZUlmQ2FsbCk7CiAKICAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBuZXcgbWV0aG9kIGlzIGEgdmFsaWQgb3ZlcnJpZGUgb2YgdGhlCkBAIC02OTY5LDYgKzcwMjAsMTcgQEAKICAgLy8vIFwjcHJhZ21hIGNvbW1lbnQoa2luZCwgImFyZyIpLgogICB2b2lkIEFjdE9uUHJhZ21hTVNDb21tZW50KFByYWdtYU1TQ29tbWVudEtpbmQgS2luZCwgU3RyaW5nUmVmIEFyZyk7CiAKKyAgLy8vIEFjdE9uUHJhZ21hTVNQb2ludGVyc1RvTWVtYmVycyAtIGNhbGxlZCBvbiB3ZWxsIGZvcm1lZCBcI3ByYWdtYQorICAvLy8gcG9pbnRlcnNfdG9fbWVtYmVycyhyZXByZXNlbnRhdGlvbiBtZXRob2RbLCBnZW5lcmFsIHB1cnBvc2UKKyAgLy8vIHJlcHJlc2VudGF0aW9uXSkuCisgIHZvaWQgQWN0T25QcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzKAorICAgICAgTGFuZ09wdGlvbnM6OlByYWdtYU1TUG9pbnRlcnNUb01lbWJlcnNLaW5kIEtpbmQsCisgICAgICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2MpOworCisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwgZm9ybWVkIFwjcHJhZ21hIHZ0b3JkaXNwKCkuCisgIHZvaWQgQWN0T25QcmFnbWFNU1Z0b3JEaXNwKFByYWdtYVZ0b3JEaXNwS2luZCBLaW5kLCBTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TVnRvckRpc3BBdHRyOjpNb2RlIFZhbHVlKTsKKwogICAvLy8gQWN0T25QcmFnbWFEZXRlY3RNaXNtYXRjaCAtIENhbGwgb24gd2VsbC1mb3JtZWQgXCNwcmFnbWEgZGV0ZWN0X21pc21hdGNoCiAgIHZvaWQgQWN0T25QcmFnbWFEZXRlY3RNaXNtYXRjaChTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIFZhbHVlKTsKIApAQCAtNzA1Miw2ICs3MTE0LDkgQEAKICAgLy8vIFxicmllZiBJbml0aWFsaXphdGlvbiBvZiBkYXRhLXNoYXJpbmcgYXR0cmlidXRlcyBzdGFjay4KICAgdm9pZCBJbml0RGF0YVNoYXJpbmdBdHRyaWJ1dGVzU3RhY2soKTsKICAgdm9pZCBEZXN0cm95RGF0YVNoYXJpbmdBdHRyaWJ1dGVzU3RhY2soKTsKKyAgRXhwclJlc3VsdCBQZXJmb3JtSW1wbGljaXRJbnRlZ2VyQ29udmVyc2lvbihTb3VyY2VMb2NhdGlvbiBPcExvYywgRXhwciAqT3ApOworICBFeHByUmVzdWx0IFZlcmlmeVBvc2l0aXZlSW50ZWdlckNvbnN0YW50SW5DbGF1c2UoRXhwciAqT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuTVBDbGF1c2VLaW5kIENLaW5kKTsKIHB1YmxpYzoKICAgLy8vIFxicmllZiBDYWxsZWQgb24gc3RhcnQgb2YgbmV3IGRhdGEgc2hhcmluZyBhdHRyaWJ1dGUgYmxvY2suCiAgIHZvaWQgU3RhcnRPcGVuTVBEU0FCbG9jayhPcGVuTVBEaXJlY3RpdmVLaW5kIEssCkBAIC03MDg2LDYgKzcxNTEsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkFTdG10LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnXCNwcmFnbWEgb21wIHNpbWQnIGFmdGVyIHBhcnNpbmcKKyAgLy8vIG9mIHRoZSBhc3NvY2lhdGVkIHN0YXRlbWVudC4KKyAgU3RtdFJlc3VsdCBBY3RPbk9wZW5NUFNpbWREaXJlY3RpdmUoQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkFTdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKworICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QU2luZ2xlRXhwckNsYXVzZShPcGVuTVBDbGF1c2VLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdpZicgY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QSWZDbGF1c2UoRXhwciAqQ29uZGl0aW9uLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CisgIC8vLyBcYnJpZWYgQ2FsbGVkIG9uIHdlbGwtZm9ybWVkICdudW1fdGhyZWFkcycgY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QTnVtVGhyZWFkc0NsYXVzZShFeHByICpOdW1UaHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpOworICAvLy8gXGJyaWVmIENhbGxlZCBvbiB3ZWxsLWZvcm1lZCAnc2FmZWxlbicgY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QU2FmZWxlbkNsYXVzZShFeHByICpMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyk7CiAKICAgT01QQ2xhdXNlICpBY3RPbk9wZW5NUFNpbXBsZUNsYXVzZShPcGVuTVBDbGF1c2VLaW5kIEtpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJndW1lbnQsCkBAIC03MTIwLDYgKzcyMTEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKKyAgLy8vIFxicmllZiBDYWxsZWQgb24gd2VsbC1mb3JtZWQgJ2NvcHlpbicgY2xhdXNlLgorICBPTVBDbGF1c2UgKkFjdE9uT3Blbk1QQ29weWluQ2xhdXNlKEFycmF5UmVmPEV4cHIgKj4gVmFyTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKTsKIAogICAvLy8gXGJyaWVmIFRoZSBraW5kIG9mIGNvbnZlcnNpb24gYmVpbmcgcGVyZm9ybWVkLgogICBlbnVtIENoZWNrZWRDb252ZXJzaW9uS2luZCB7CkBAIC03MTU1LDYgKzcyNTEsMTAgQEAKICAgLy8gZnVuY3Rpb25zIGFuZCBhcnJheXMgdG8gdGhlaXIgcmVzcGVjdGl2ZSBwb2ludGVycyAoQzk5IDYuMy4yLjEpLgogICBFeHByUmVzdWx0IFVzdWFsVW5hcnlDb252ZXJzaW9ucyhFeHByICpFKTsKIAorICAvLy8gQ2FsbEV4cHJVbmFyeUNvbnZlcnNpb25zIC0gYSBzcGVjaWFsIGNhc2Ugb2YgYW4gdW5hcnkgY29udmVyc2lvbgorICAvLy8gcGVyZm9ybWVkIG9uIGEgZnVuY3Rpb24gZGVzaWduYXRvciBvZiBhIGNhbGwgZXhwcmVzc2lvbi4KKyAgRXhwclJlc3VsdCBDYWxsRXhwclVuYXJ5Q29udmVyc2lvbnMoRXhwciAqRSk7CisKICAgLy8gRGVmYXVsdEZ1bmN0aW9uQXJyYXlDb252ZXJzaW9uIC0gY29udmVydHMgZnVuY3Rpb25zIGFuZCBhcnJheXMKICAgLy8gdG8gdGhlaXIgcmVzcGVjdGl2ZSBwb2ludGVycyAoQzk5IDYuMy4yLjEpLgogICBFeHByUmVzdWx0IERlZmF1bHRGdW5jdGlvbkFycmF5Q29udmVyc2lvbihFeHByICpFKTsKQEAgLTcyMDQsMTMgKzczMDQsMTQgQEAKICAgLy8vIGZ1bmN0aW9uLCBpc3N1aW5nIGEgZGlhZ25vc3RpYyBpZiBub3QuCiAgIHZvaWQgY2hlY2tWYXJpYWRpY0FyZ3VtZW50KGNvbnN0IEV4cHIgKkUsIFZhcmlhZGljQ2FsbFR5cGUgQ1QpOwogCisgIC8vLyBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiBleHByZXNzaW9uIGNvdWxkIGhhdmUgJy5jX3N0cigpJyBjYWxsZWQgb24gaXQuCisgIGJvb2wgaGFzQ1N0ck1ldGhvZChjb25zdCBFeHByICpFKTsKKwogICAvLy8gR2F0aGVyQXJndW1lbnRzRm9yQ2FsbCAtIENvbGxlY3RvciBhcmd1bWVudCBleHByZXNzaW9ucyBmb3IgdmFyaW91cwogICAvLy8gZm9ybSBvZiBjYWxsIHByb3RvdHlwZXMuCi0gIGJvb2wgR2F0aGVyQXJndW1lbnRzRm9yQ2FsbChTb3VyY2VMb2NhdGlvbiBDYWxsTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsICpGRGVjbCwKKyAgYm9vbCBHYXRoZXJBcmd1bWVudHNGb3JDYWxsKFNvdXJjZUxvY2F0aW9uIENhbGxMb2MsIEZ1bmN0aW9uRGVjbCAqRkRlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqUHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGaXJzdFByb3RvQXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmlyc3RQYXJhbSwgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEV4cHIgKj4gJkFsbEFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWRpY0NhbGxUeXBlIENhbGxUeXBlID0gVmFyaWFkaWNEb2VzTm90QXBwbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93RXhwbGljaXQgPSBmYWxzZSwKQEAgLTc0MzMsNiArNzUzNCwxMCBAQAogICBib29sIERpYWdub3NlQ29uZGl0aW9uYWxGb3JOdWxsKEV4cHIgKkxIU0V4cHIsIEV4cHIgKlJIU0V4cHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUXVlc3Rpb25Mb2MpOwogCisgIHZvaWQgRGlhZ25vc2VBbHdheXNOb25OdWxsUG9pbnRlcihFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcjo6TnVsbFBvaW50ZXJDb25zdGFudEtpbmQgTnVsbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRXF1YWwsIFNvdXJjZVJhbmdlIFJhbmdlKTsKKwogICAvLy8gdHlwZSBjaGVja2luZyBmb3IgdmVjdG9yIGJpbmFyeSBvcGVyYXRvcnMuCiAgIFF1YWxUeXBlIENoZWNrVmVjdG9yT3BlcmFuZHMoRXhwclJlc3VsdCAmTEhTLCBFeHByUmVzdWx0ICZSSFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLCBib29sIElzQ29tcEFzc2lnbik7CkBAIC03NDQyLDYgKzc1NDcsOCBAQAogICBRdWFsVHlwZSBDaGVja1ZlY3RvckxvZ2ljYWxPcGVyYW5kcyhFeHByUmVzdWx0ICZMSFMsIEV4cHJSZXN1bHQgJlJIUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKTsKIAorICBib29sIGlzTGF4VmVjdG9yQ29udmVyc2lvbihRdWFsVHlwZSBzcmNUeXBlLCBRdWFsVHlwZSBkZXN0VHlwZSk7CisKICAgLy8vIHR5cGUgY2hlY2tpbmcgZGVjbGFyYXRpb24gaW5pdGlhbGl6ZXJzIChDOTkgNi43LjgpCiAgIGJvb2wgQ2hlY2tGb3JDb25zdGFudEluaXRpYWxpemVyKEV4cHIgKmUsIFF1YWxUeXBlIHQpOwogCkBAIC03ODMzLDE5ICs3OTQwLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKTsKIAogICB2b2lkIGNoZWNrQ2FsbChOYW1lZERlY2wgKkZEZWNsLCBBcnJheVJlZjxjb25zdCBFeHByICo+IEFyZ3MsCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVByb3RvQXJncywgYm9vbCBJc01lbWJlckZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIFJhbmdlLAotICAgICAgICAgICAgICAgICBWYXJpYWRpY0NhbGxUeXBlIENhbGxUeXBlKTsKLQorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1QYXJhbXMsIGJvb2wgSXNNZW1iZXJGdW5jdGlvbiwgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSYW5nZSwgVmFyaWFkaWNDYWxsVHlwZSBDYWxsVHlwZSk7CiAKICAgYm9vbCBDaGVja09iakNTdHJpbmcoRXhwciAqQXJnKTsKIAogICBFeHByUmVzdWx0IENoZWNrQnVpbHRpbkZ1bmN0aW9uQ2FsbCh1bnNpZ25lZCBCdWlsdGluSUQsIENhbGxFeHByICpUaGVDYWxsKTsKIAotICBib29sIENoZWNrQVJNQnVpbHRpbkV4Y2x1c2l2ZUNhbGwodW5zaWduZWQgQnVpbHRpbklELCBDYWxsRXhwciAqVGhlQ2FsbCk7CisgIGJvb2wgQ2hlY2tBUk1CdWlsdGluRXhjbHVzaXZlQ2FsbCh1bnNpZ25lZCBCdWlsdGluSUQsIENhbGxFeHByICpUaGVDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4V2lkdGgpOworICBib29sIENoZWNrTmVvbkJ1aWx0aW5GdW5jdGlvbkNhbGwodW5zaWduZWQgQnVpbHRpbklELCBDYWxsRXhwciAqVGhlQ2FsbCk7CiAgIGJvb2wgQ2hlY2tBUk1CdWlsdGluRnVuY3Rpb25DYWxsKHVuc2lnbmVkIEJ1aWx0aW5JRCwgQ2FsbEV4cHIgKlRoZUNhbGwpOworCisgIGJvb2wgQ2hlY2tBUk02NEJ1aWx0aW5GdW5jdGlvbkNhbGwodW5zaWduZWQgQnVpbHRpbklELCBDYWxsRXhwciAqVGhlQ2FsbCk7CiAgIGJvb2wgQ2hlY2tBQXJjaDY0QnVpbHRpbkZ1bmN0aW9uQ2FsbCh1bnNpZ25lZCBCdWlsdGluSUQsIENhbGxFeHByICpUaGVDYWxsKTsKICAgYm9vbCBDaGVja01pcHNCdWlsdGluRnVuY3Rpb25DYWxsKHVuc2lnbmVkIEJ1aWx0aW5JRCwgQ2FsbEV4cHIgKlRoZUNhbGwpOworICBib29sIENoZWNrWDg2QnVpbHRpbkZ1bmN0aW9uQ2FsbCh1bnNpZ25lZCBCdWlsdGluSUQsIENhbGxFeHByICpUaGVDYWxsKTsKIAogICBib29sIFNlbWFCdWlsdGluVkFTdGFydChDYWxsRXhwciAqVGhlQ2FsbCk7CiAgIGJvb2wgU2VtYUJ1aWx0aW5Vbm9yZGVyZWRDb21wYXJlKENhbGxFeHByICpUaGVDYWxsKTsKQEAgLTc4NjAsNiArNzk3MCw3IEBACiAKIHByaXZhdGU6CiAgIGJvb2wgU2VtYUJ1aWx0aW5QcmVmZXRjaChDYWxsRXhwciAqVGhlQ2FsbCk7CisgIGJvb2wgU2VtYUJ1aWx0aW5NTVByZWZldGNoKENhbGxFeHByICpUaGVDYWxsKTsKICAgYm9vbCBTZW1hQnVpbHRpbk9iamVjdFNpemUoQ2FsbEV4cHIgKlRoZUNhbGwpOwogICBib29sIFNlbWFCdWlsdGluTG9uZ2ptcChDYWxsRXhwciAqVGhlQ2FsbCk7CiAgIEV4cHJSZXN1bHQgU2VtYUJ1aWx0aW5BdG9taWNPdmVybG9hZGVkKEV4cHJSZXN1bHQgVGhlQ2FsbFJlc3VsdCk7CkBAIC03OTAxLDkgKzgwMTIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywgU291cmNlUmFuZ2UgcmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxCaXRWZWN0b3IgJkNoZWNrZWRWYXJBcmdzKTsKIAotICB2b2lkIENoZWNrTm9uTnVsbEFyZ3VtZW50cyhjb25zdCBOb25OdWxsQXR0ciAqTm9uTnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqIGNvbnN0ICpFeHByQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ2FsbFNpdGVMb2MpOworICB2b2lkIENoZWNrQWJzb2x1dGVWYWx1ZUZ1bmN0aW9uKGNvbnN0IENhbGxFeHByICpDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKkZuSW5mbyk7CiAKICAgdm9pZCBDaGVja01lbWFjY2Vzc0FyZ3VtZW50cyhjb25zdCBDYWxsRXhwciAqQ2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCSWQsCkBAIC03OTE1LDggKzgwMjYsMTIgQEAKICAgdm9pZCBDaGVja1N0cm5jYXRBcmd1bWVudHMoY29uc3QgQ2FsbEV4cHIgKkNhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpGbk5hbWUpOwogCi0gIHZvaWQgQ2hlY2tSZXR1cm5TdGFja0FkZHIoRXhwciAqUmV0VmFsRXhwLCBRdWFsVHlwZSBsaHNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJldHVybkxvYyk7CisgIHZvaWQgQ2hlY2tSZXR1cm5WYWxFeHByKEV4cHIgKlJldFZhbEV4cCwgUXVhbFR5cGUgbGhzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUmV0dXJuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT2JqQ01ldGhvZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyVmVjICpBdHRycyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSAwKTsKKwogICB2b2lkIENoZWNrRmxvYXRDb21wYXJpc29uKFNvdXJjZUxvY2F0aW9uIExvYywgRXhwciogTEhTLCBFeHByKiBSSFMpOwogICB2b2lkIENoZWNrSW1wbGljaXRDb252ZXJzaW9ucyhFeHByICpFLCBTb3VyY2VMb2NhdGlvbiBDQyA9IFNvdXJjZUxvY2F0aW9uKCkpOwogICB2b2lkIENoZWNrRm9ySW50T3ZlcmZsb3coRXhwciAqRSk7CkBAIC03OTMwLDYgKzgwNDUsMTAgQEAKICAgdm9pZCBDaGVja0JpdEZpZWxkSW5pdGlhbGl6YXRpb24oU291cmNlTG9jYXRpb24gSW5pdExvYywgRmllbGREZWNsICpGaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqSW5pdCk7CiAKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBjb250YWlucyAnYnJlYWsnIG9yICdjb250aW51ZScKKyAgLy8vIHN0YXRlbWVudCB0aGF0IHByb2R1Y2VzIGNvbnRyb2wgZmxvdyBkaWZmZXJlbnQgZnJvbSBHQ0MuCisgIHZvaWQgQ2hlY2tCcmVha0NvbnRpbnVlQmluZGluZyhFeHByICpFKTsKKwogcHVibGljOgogICAvLy8gXGJyaWVmIFJlZ2lzdGVyIGEgbWFnaWMgaW50ZWdyYWwgY29uc3RhbnQgdG8gYmUgdXNlZCBhcyBhIHR5cGUgdGFnLgogICB2b2lkIFJlZ2lzdGVyVHlwZVRhZ0ZvckRhdGF0eXBlKGNvbnN0IElkZW50aWZpZXJJbmZvICpBcmd1bWVudEtpbmQsCkBAIC03OTU4LDcgKzgwNzcsNyBAQAogCiBwcml2YXRlOgogICAvLy8gXGJyaWVmIEEgbWFwIGZyb20gbWFnaWMgdmFsdWUgdG8gdHlwZSBpbmZvcm1hdGlvbi4KLSAgT3duaW5nUHRyPGxsdm06OkRlbnNlTWFwPFR5cGVUYWdNYWdpY1ZhbHVlLCBUeXBlVGFnRGF0YT4gPgorICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6RGVuc2VNYXA8VHlwZVRhZ01hZ2ljVmFsdWUsIFR5cGVUYWdEYXRhPj4KICAgICAgIFR5cGVUYWdGb3JEYXRhdHlwZU1hZ2ljVmFsdWVzOwogCiAgIC8vLyBcYnJpZWYgUGVmb3JtIGNoZWNrcyBvbiBhIGNhbGwgb2YgYSBmdW5jdGlvbiB3aXRoIGFyZ3VtZW50X3dpdGhfdHlwZV90YWcKQEAgLTc5OTEsNiArODExMCwxMCBAQAogICAvLy8gdGVtcGxhdGUgc3Vic3RpdHV0aW9uIG9yIGluc3RhbnRpYXRpb24uCiAgIFNjb3BlICpnZXRDdXJTY29wZSgpIGNvbnN0IHsgcmV0dXJuIEN1clNjb3BlOyB9CiAKKyAgdm9pZCBpbmNyZW1lbnRNU0xvY2FsTWFuZ2xpbmdOdW1iZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEN1clNjb3BlLT5pbmNyZW1lbnRNU0xvY2FsTWFuZ2xpbmdOdW1iZXIoKTsKKyAgfQorCiAgIElkZW50aWZpZXJJbmZvICpnZXRTdXBlcklkZW50aWZpZXIoKSBjb25zdDsKICAgSWRlbnRpZmllckluZm8gKmdldEZsb2F0MTI4SWRlbnRpZmllcigpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1NlbWEvU2VtYUludGVybmFsLmggYi9pbmNsdWRlL2NsYW5nL1NlbWEvU2VtYUludGVybmFsLmgKaW5kZXggMDFkNGNjOS4uMGIzZDMyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TZW1hL1NlbWFJbnRlcm5hbC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvU2VtYS9TZW1hSW50ZXJuYWwuaApAQCAtMjQsNDMgKzI0LDQzIEBACiBpbmxpbmUgUGFydGlhbERpYWdub3N0aWMgU2VtYTo6UERpYWcodW5zaWduZWQgRGlhZ0lEKSB7CiAgIHJldHVybiBQYXJ0aWFsRGlhZ25vc3RpYyhEaWFnSUQsIENvbnRleHQuZ2V0RGlhZ0FsbG9jYXRvcigpKTsKIH0KLQ0KLQ0KLS8vIFRoaXMgcmVxdWlyZXMgdGhlIHZhcmlhYmxlIHRvIGJlIG5vbi1kZXBlbmRlbnQgYW5kIHRoZSBpbml0aWFsaXplcg0KLS8vIHRvIG5vdCBiZSB2YWx1ZSBkZXBlbmRlbnQuDQotaW5saW5lIGJvb2wgSXNWYXJpYWJsZUFDb25zdGFudEV4cHJlc3Npb24oVmFyRGVjbCAqVmFyLCBBU1RDb250ZXh0ICZDb250ZXh0KSB7DQotICBjb25zdCBWYXJEZWNsICpEZWZWRCA9IDA7DQotICByZXR1cm4gIWlzYTxQYXJtVmFyRGVjbD4oVmFyKSAmJg0KLSAgICBWYXItPmlzVXNhYmxlSW5Db25zdGFudEV4cHJlc3Npb25zKENvbnRleHQpICYmDQotICAgIFZhci0+Z2V0QW55SW5pdGlhbGl6ZXIoRGVmVkQpICYmIERlZlZELT5jaGVja0luaXRJc0lDRSgpOyANCi19DQotDQotLy8gRGlyZWN0bHkgbWFyayBhIHZhcmlhYmxlIG9kci11c2VkLiBHaXZlbiBhIGNob2ljZSwgcHJlZmVyIHRvIHVzZSANCi0vLyBNYXJrVmFyaWFibGVSZWZlcmVuY2VkIHNpbmNlIGl0IGRvZXMgYWRkaXRpb25hbCBjaGVja3MgYW5kIHRoZW4gDQotLy8gY2FsbHMgTWFya1ZhckRlY2xPRFJVc2VkLg0KLS8vIElmIHRoZSB2YXJpYWJsZSBtdXN0IGJlIGNhcHR1cmVkOg0KLS8vICAtIGlmIEZ1bmN0aW9uU2NvcGVJbmRleFRvU3RvcEF0IGlzIG51bGwsIGNhcHR1cmUgaXQgaW4gdGhlIEN1ckNvbnRleHQNCi0vLyAgLSBlbHNlIGNhcHR1cmUgaXQgaW4gdGhlIERlY2xDb250ZXh0IHRoYXQgbWFwcyB0byB0aGUgDQotLy8gICAgKkZ1bmN0aW9uU2NvcGVJbmRleFRvU3RvcEF0IG9uIHRoZSBGdW5jdGlvblNjb3BlSW5mbyBzdGFjay4gIA0KLWlubGluZSB2b2lkIE1hcmtWYXJEZWNsT0RSVXNlZChWYXJEZWNsICpWYXIsDQotICAgIFNvdXJjZUxvY2F0aW9uIExvYywgU2VtYSAmU2VtYVJlZiwNCi0gICAgY29uc3QgdW5zaWduZWQgKmNvbnN0IEZ1bmN0aW9uU2NvcGVJbmRleFRvU3RvcEF0KSB7DQotICAvLyBLZWVwIHRyYWNrIG9mIHVzZWQgYnV0IHVuZGVmaW5lZCB2YXJpYWJsZXMuDQotICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IHN1cHByZXNzIHRoaXMgd2FybmluZyBmb3Igc3RhdGljIGRhdGEgbWVtYmVycy4NCi0gIGlmIChWYXItPmhhc0RlZmluaXRpb24oU2VtYVJlZi5Db250ZXh0KSA9PSBWYXJEZWNsOjpEZWNsYXJhdGlvbk9ubHkgJiYNCi0gICAgIVZhci0+aXNFeHRlcm5hbGx5VmlzaWJsZSgpICYmDQotICAgICEoVmFyLT5pc1N0YXRpY0RhdGFNZW1iZXIoKSAmJiBWYXItPmhhc0luaXQoKSkpIHsNCi0gICAgICBTb3VyY2VMb2NhdGlvbiAmb2xkID0gU2VtYVJlZi5VbmRlZmluZWRCdXRVc2VkW1Zhci0+Z2V0Q2Fub25pY2FsRGVjbCgpXTsNCi0gICAgICBpZiAob2xkLmlzSW52YWxpZCgpKSBvbGQgPSBMb2M7DQotICB9DQotICBRdWFsVHlwZSBDYXB0dXJlVHlwZSwgRGVjbFJlZlR5cGU7DQotICBTZW1hUmVmLnRyeUNhcHR1cmVWYXJpYWJsZShWYXIsIExvYywgU2VtYTo6VHJ5Q2FwdHVyZV9JbXBsaWNpdCwgDQotICAgIC8qRWxsaXBzaXNMb2MqLyBTb3VyY2VMb2NhdGlvbigpLA0KLSAgICAvKkJ1aWxkQW5kRGlhZ25vc2UqLyB0cnVlLCANCi0gICAgQ2FwdHVyZVR5cGUsIERlY2xSZWZUeXBlLCANCi0gICAgRnVuY3Rpb25TY29wZUluZGV4VG9TdG9wQXQpOw0KLQ0KLSAgVmFyLT5tYXJrVXNlZChTZW1hUmVmLkNvbnRleHQpOw0KKworCisvLyBUaGlzIHJlcXVpcmVzIHRoZSB2YXJpYWJsZSB0byBiZSBub24tZGVwZW5kZW50IGFuZCB0aGUgaW5pdGlhbGl6ZXIKKy8vIHRvIG5vdCBiZSB2YWx1ZSBkZXBlbmRlbnQuCitpbmxpbmUgYm9vbCBJc1ZhcmlhYmxlQUNvbnN0YW50RXhwcmVzc2lvbihWYXJEZWNsICpWYXIsIEFTVENvbnRleHQgJkNvbnRleHQpIHsKKyAgY29uc3QgVmFyRGVjbCAqRGVmVkQgPSAwOworICByZXR1cm4gIWlzYTxQYXJtVmFyRGVjbD4oVmFyKSAmJgorICAgIFZhci0+aXNVc2FibGVJbkNvbnN0YW50RXhwcmVzc2lvbnMoQ29udGV4dCkgJiYKKyAgICBWYXItPmdldEFueUluaXRpYWxpemVyKERlZlZEKSAmJiBEZWZWRC0+Y2hlY2tJbml0SXNJQ0UoKTsgCit9CisKKy8vIERpcmVjdGx5IG1hcmsgYSB2YXJpYWJsZSBvZHItdXNlZC4gR2l2ZW4gYSBjaG9pY2UsIHByZWZlciB0byB1c2UgCisvLyBNYXJrVmFyaWFibGVSZWZlcmVuY2VkIHNpbmNlIGl0IGRvZXMgYWRkaXRpb25hbCBjaGVja3MgYW5kIHRoZW4gCisvLyBjYWxscyBNYXJrVmFyRGVjbE9EUlVzZWQuCisvLyBJZiB0aGUgdmFyaWFibGUgbXVzdCBiZSBjYXB0dXJlZDoKKy8vICAtIGlmIEZ1bmN0aW9uU2NvcGVJbmRleFRvU3RvcEF0IGlzIG51bGwsIGNhcHR1cmUgaXQgaW4gdGhlIEN1ckNvbnRleHQKKy8vICAtIGVsc2UgY2FwdHVyZSBpdCBpbiB0aGUgRGVjbENvbnRleHQgdGhhdCBtYXBzIHRvIHRoZSAKKy8vICAgICpGdW5jdGlvblNjb3BlSW5kZXhUb1N0b3BBdCBvbiB0aGUgRnVuY3Rpb25TY29wZUluZm8gc3RhY2suICAKK2lubGluZSB2b2lkIE1hcmtWYXJEZWNsT0RSVXNlZChWYXJEZWNsICpWYXIsCisgICAgU291cmNlTG9jYXRpb24gTG9jLCBTZW1hICZTZW1hUmVmLAorICAgIGNvbnN0IHVuc2lnbmVkICpjb25zdCBGdW5jdGlvblNjb3BlSW5kZXhUb1N0b3BBdCkgeworICAvLyBLZWVwIHRyYWNrIG9mIHVzZWQgYnV0IHVuZGVmaW5lZCB2YXJpYWJsZXMuCisgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3Qgc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGZvciBzdGF0aWMgZGF0YSBtZW1iZXJzLgorICBpZiAoVmFyLT5oYXNEZWZpbml0aW9uKFNlbWFSZWYuQ29udGV4dCkgPT0gVmFyRGVjbDo6RGVjbGFyYXRpb25Pbmx5ICYmCisgICAgIVZhci0+aXNFeHRlcm5hbGx5VmlzaWJsZSgpICYmCisgICAgIShWYXItPmlzU3RhdGljRGF0YU1lbWJlcigpICYmIFZhci0+aGFzSW5pdCgpKSkgeworICAgICAgU291cmNlTG9jYXRpb24gJm9sZCA9IFNlbWFSZWYuVW5kZWZpbmVkQnV0VXNlZFtWYXItPmdldENhbm9uaWNhbERlY2woKV07CisgICAgICBpZiAob2xkLmlzSW52YWxpZCgpKSBvbGQgPSBMb2M7CisgIH0KKyAgUXVhbFR5cGUgQ2FwdHVyZVR5cGUsIERlY2xSZWZUeXBlOworICBTZW1hUmVmLnRyeUNhcHR1cmVWYXJpYWJsZShWYXIsIExvYywgU2VtYTo6VHJ5Q2FwdHVyZV9JbXBsaWNpdCwgCisgICAgLypFbGxpcHNpc0xvYyovIFNvdXJjZUxvY2F0aW9uKCksCisgICAgLypCdWlsZEFuZERpYWdub3NlKi8gdHJ1ZSwgCisgICAgQ2FwdHVyZVR5cGUsIERlY2xSZWZUeXBlLCAKKyAgICBGdW5jdGlvblNjb3BlSW5kZXhUb1N0b3BBdCk7CisKKyAgVmFyLT5tYXJrVXNlZChTZW1hUmVmLkNvbnRleHQpOwogfQogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1NlbWEvU2VtYUxhbWJkYS5oIGIvaW5jbHVkZS9jbGFuZy9TZW1hL1NlbWFMYW1iZGEuaAppbmRleCBjZjlmZmYxLi5mNjM2NzUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1NlbWEvU2VtYUxhbWJkYS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvU2VtYS9TZW1hTGFtYmRhLmgKQEAgLTEsMzkgKzEsMzYgQEAKLS8vPT09LS0tIFNlbWFMYW1iZGEuaCAtIExhbWJkYSBIZWxwZXIgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vDQotLy8NCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlDQotLy8NCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UNCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuDQotLy8NCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KLS8vLw0KLS8vLyBcZmlsZQ0KLS8vLyBcYnJpZWYgVGhpcyBmaWxlIHByb3ZpZGVzIHNvbWUgY29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nDQotLy8vIExhbWJkYXMuDQotLy8vDQotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCi0NCi0jaWZuZGVmIExMVk1fQ0xBTkdfU0VNQV9MQU1CREFfSA0KLSNkZWZpbmUgTExWTV9DTEFOR19TRU1BX0xBTUJEQV9IDQotI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RMYW1iZGEuaCINCi0jaW5jbHVkZSAiY2xhbmcvU2VtYS9TY29wZUluZm8uaCINCi1uYW1lc3BhY2UgY2xhbmcgew0KLSANCi0vLyBHaXZlbiBhIGxhbWJkYSdzIGNhbGwgb3BlcmF0b3IgYW5kIGEgdmFyaWFibGUgKG9yIG51bGwgZm9yICd0aGlzJyksIA0KLS8vIGNvbXB1dGUgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxhbWJkYSB0aGF0IGlzIGNhcHR1cmUtcmVhZHkgKGkuZSANCi0vLyB0aGUgZW5jbG9zaW5nIGNvbnRleHQgaXMgbm90IGRlcGVuZGVudCwgYW5kIGFsbCBpbnRlcnZlbmluZyBsYW1iZGFzIGNhbiANCi0vLyBlaXRoZXIgaW1wbGljaXRseSBvciBleHBsaWNpdGx5IGNhcHR1cmUgVmFyKQ0KLS8vIA0KLS8vIFJldHVybiB0aGUgQ2FsbE9wZXJhdG9yIG9mIHRoZSBjYXB0dXJhYmxlIGxhbWJkYSBhbmQgc2V0IGZ1bmN0aW9uIHNjb3BlIA0KLS8vIGluZGV4IHRvIHRoZSBjb3JyZWN0IGluZGV4IHdpdGhpbiB0aGUgZnVuY3Rpb24gc2NvcGUgc3RhY2sgdG8gY29ycmVzcG9uZCANCi0vLyB0byB0aGUgY2FwdHVyYWJsZSBsYW1iZGEuDQotLy8gSWYgVmFyRGVjbCAqVkQgaXMgbnVsbCwgd2UgY2hlY2sgZm9yICd0aGlzJyBjYXB0dXJlLg0KLUNYWE1ldGhvZERlY2wqIA0KLUdldElubmVybW9zdEVuY2xvc2luZ0NhcHR1cmFibGVMYW1iZGEoIA0KLSAgICBBcnJheVJlZjxzZW1hOjpGdW5jdGlvblNjb3BlSW5mbyo+IEZ1bmN0aW9uU2NvcGVzLA0KLSAgICB1bnNpZ25lZCAmRnVuY3Rpb25TY29wZUluZGV4LA0KLSAgICBEZWNsQ29udGV4dCAqY29uc3QgQ3VyQ29udGV4dCwgVmFyRGVjbCAqVkQsIFNlbWEgJlMpOw0KLQ0KLX0gLy8gY2xhbmcNCi0NCi0jZW5kaWYgLy8gTExWTV9DTEFOR19TRU1BX0xBTUJEQV9IDQorLy89PT0tLS0gU2VtYUxhbWJkYS5oIC0gTGFtYmRhIEhlbHBlciBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFRoaXMgZmlsZSBwcm92aWRlcyBzb21lIGNvbW1vbiB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgcHJvY2Vzc2luZworLy8vIExhbWJkYXMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DTEFOR19TRU1BX0xBTUJEQV9ICisjZGVmaW5lIExMVk1fQ0xBTkdfU0VNQV9MQU1CREFfSAorI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RMYW1iZGEuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL1Njb3BlSW5mby5oIgorbmFtZXNwYWNlIGNsYW5nIHsKKyAKKworLy8vIFxicmllZiBFeGFtaW5lcyB0aGUgRnVuY3Rpb25TY29wZUluZm8gc3RhY2sgdG8gZGV0ZXJtaW5lIHRoZSBuZWFyZXN0CisvLy8gZW5jbG9zaW5nIGxhbWJkYSAodG8gdGhlIGN1cnJlbnQgbGFtYmRhKSB0aGF0IGlzICdjYXB0dXJlLWNhcGFibGUnIGZvciAKKy8vLyB0aGUgdmFyaWFibGUgcmVmZXJlbmNlZCBpbiB0aGUgY3VycmVudCBsYW1iZGEgKGkuZS4gXHAgVmFyVG9DYXB0dXJlKS4KKy8vLyBJZiBzdWNjZXNzZnVsLCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIFNlbWEncyBGdW5jdGlvblNjb3BlSW5mbyBzdGFjaworLy8vIG9mIHRoZSBjYXB0dXJlLWNhcGFibGUgbGFtYmRhJ3MgTGFtYmRhU2NvcGVJbmZvLiAKKy8vLyBTZWUgSW1wbGVtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlsZWQgY29tbWVudHMuIAorCitPcHRpb25hbDx1bnNpZ25lZD4gZ2V0U3RhY2tJbmRleE9mTmVhcmVzdEVuY2xvc2luZ0NhcHR1cmVDYXBhYmxlTGFtYmRhKAorICAgIEFycmF5UmVmPGNvbnN0IHNlbWE6OkZ1bmN0aW9uU2NvcGVJbmZvICo+IEZ1bmN0aW9uU2NvcGVzLAorICAgIFZhckRlY2wgKlZhclRvQ2FwdHVyZSwgU2VtYSAmUyk7CisKK30gLy8gY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfU0VNQV9MQU1CREFfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZW1hL1R5cG9Db3JyZWN0aW9uLmggYi9pbmNsdWRlL2NsYW5nL1NlbWEvVHlwb0NvcnJlY3Rpb24uaAppbmRleCBmMGI3NzI2Li4xNmQ3MzI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1NlbWEvVHlwb0NvcnJlY3Rpb24uaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlbWEvVHlwb0NvcnJlY3Rpb24uaApAQCAtMjk0LDcgKzI5NCw3IEBACiB0ZW1wbGF0ZSA8Y2xhc3MgQz4KIGNsYXNzIERlY2xGaWx0ZXJDQ0MgOiBwdWJsaWMgQ29ycmVjdGlvbkNhbmRpZGF0ZUNhbGxiYWNrIHsKIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIHsKKyAgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGNhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uRGVjbEFzPEM+KCk7CiAgIH0KIH07CkBAIC0zMDUsMTMgKzMwNSwxNiBAQAogY2xhc3MgRnVuY3Rpb25DYWxsRmlsdGVyQ0NDIDogcHVibGljIENvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjayB7CiBwdWJsaWM6CiAgIEZ1bmN0aW9uQ2FsbEZpbHRlckNDQyhTZW1hICZTZW1hUmVmLCB1bnNpZ25lZCBOdW1BcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNFeHBsaWNpdFRlbXBsYXRlQXJncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd05vblN0YXRpY01ldGhvZHMgPSB0cnVlKTsKIAotICB2aXJ0dWFsIGJvb2wgVmFsaWRhdGVDYW5kaWRhdGUoY29uc3QgVHlwb0NvcnJlY3Rpb24gJmNhbmRpZGF0ZSk7CisgIGJvb2wgVmFsaWRhdGVDYW5kaWRhdGUoY29uc3QgVHlwb0NvcnJlY3Rpb24gJmNhbmRpZGF0ZSkgb3ZlcnJpZGU7CiAKICBwcml2YXRlOgogICB1bnNpZ25lZCBOdW1BcmdzOwogICBib29sIEhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzOworICBib29sIEFsbG93Tm9uU3RhdGljTWV0aG9kczsKKyAgRGVjbENvbnRleHQgKkN1ckNvbnRleHQ7CiB9OwogCiAvLyBAYnJpZWYgQ2FsbGJhY2sgY2xhc3MgdGhhdCBlZmZlY3RpdmVseSBkaXNhYmxlZCB0eXBvIGNvcnJlY3Rpb24KQEAgLTMyNCw3ICszMjcsNyBAQAogICAgIFdhbnRSZW1haW5pbmdLZXl3b3JkcyA9IGZhbHNlOwogICB9CiAKLSAgdmlydHVhbCBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIHsKKyAgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0FTVEJpdENvZGVzLmggYi9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vQVNUQml0Q29kZXMuaAppbmRleCAwM2Q5MDUwLi4zNTc2NWI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vQVNUQml0Q29kZXMuaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vQVNUQml0Q29kZXMuaApAQCAtMjEzLDkgKzIxMyw2IEBACiAgICAgICAvLy8gdHlwZXMgYW5kIGRlY2xzIHVzZWQgd2l0aGluIHRoZSBBU1QgZmlsZS4KICAgICAgIERFQ0xUWVBFU19CTE9DS19JRCwKIAotICAgICAgLy8vIFxicmllZiBUaGUgYmxvY2sgY29udGFpbmluZyBERUNMX1VQREFURVMgcmVjb3Jkcy4KLSAgICAgIERFQ0xfVVBEQVRFU19CTE9DS19JRCwKLSAgICAgIAogICAgICAgLy8vIFxicmllZiBUaGUgYmxvY2sgY29udGFpbmluZyB0aGUgZGV0YWlsZWQgcHJlcHJvY2Vzc2luZyByZWNvcmQuCiAgICAgICBQUkVQUk9DRVNTT1JfREVUQUlMX0JMT0NLX0lELAogICAgICAgCkBAIC0zNDksMTUgKzM0NiwxNSBAQAogICAgICAgLy8vIElEcykuCiAgICAgICBJREVOVElGSUVSX1RBQkxFID0gNSwKIAotICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdGhlIGFycmF5IG9mIGV4dGVybmFsIGRlZmluaXRpb25zLgorICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdGhlIGFycmF5IG9mIGVhZ2VybHkgZGVzZXJpYWxpemVkIGRlY2xzLgogICAgICAgLy8vCi0gICAgICAvLy8gVGhlIEFTVCBmaWxlIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgb2YgdGhlIHVubmFtZWQgZXh0ZXJuYWwKLSAgICAgIC8vLyBkZWZpbml0aW9ucyBwcmVzZW50IHdpdGhpbiB0aGUgcGFyc2VkIGhlYWRlcnMsIHN0b3JlZCBhcyBhbgotICAgICAgLy8vIGFycmF5IG9mIGRlY2xhcmF0aW9uIElEcy4gVGhlc2UgZXh0ZXJuYWwgZGVmaW5pdGlvbnMgd2lsbCBiZQorICAgICAgLy8vIFRoZSBBU1QgZmlsZSBjb250YWlucyBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCBzaG91bGQgYmUKKyAgICAgIC8vLyBlYWdlcmx5IGRlc2VyaWFsaXplZCBwcmVzZW50IHdpdGhpbiB0aGUgcGFyc2VkIGhlYWRlcnMsIHN0b3JlZCBhcyBhbgorICAgICAgLy8vIGFycmF5IG9mIGRlY2xhcmF0aW9uIElEcy4gVGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUKICAgICAgIC8vLyByZXBvcnRlZCB0byB0aGUgQVNUIGNvbnN1bWVyIGFmdGVyIHRoZSBBU1QgZmlsZSBoYXMgYmVlbgogICAgICAgLy8vIHJlYWQsIHNpbmNlIHRoZWlyIHByZXNlbmNlIGNhbiBhZmZlY3QgdGhlIHNlbWFudGljcyBvZiB0aGUKICAgICAgIC8vLyBwcm9ncmFtIChlLmcuLCBmb3IgY29kZSBnZW5lcmF0aW9uKS4KLSAgICAgIEVYVEVSTkFMX0RFRklOSVRJT05TID0gNiwKKyAgICAgIEVBR0VSTFlfREVTRVJJQUxJWkVEX0RFQ0xTID0gNiwKIAogICAgICAgLy8vIFxicmllZiBSZWNvcmQgY29kZSBmb3IgdGhlIHNldCBvZiBub24tYnVpbHRpbiwgc3BlY2lhbAogICAgICAgLy8vIHR5cGVzLgpAQCAtODQxLDcgKzgzOCw5IEBACiAgICAgICAvLy8gXGJyaWVmIEFuIEF0b21pY1R5cGUgcmVjb3JkLgogICAgICAgVFlQRV9BVE9NSUMgICAgICAgICAgICAgICAgPSA0MCwKICAgICAgIC8vLyBcYnJpZWYgQSBEZWNheWVkVHlwZSByZWNvcmQuCi0gICAgICBUWVBFX0RFQ0FZRUQgICAgICAgICAgICAgICA9IDQxCisgICAgICBUWVBFX0RFQ0FZRUQgICAgICAgICAgICAgICA9IDQxLAorICAgICAgLy8vIFxicmllZiBBbiBBZGp1c3RlZFR5cGUgcmVjb3JkLgorICAgICAgVFlQRV9BREpVU1RFRCAgICAgICAgICAgICAgPSA0MgogICAgIH07CiAKICAgICAvLy8gXGJyaWVmIFRoZSB0eXBlIElEcyBmb3Igc3BlY2lhbCB0eXBlcyBjb25zdHJ1Y3RlZCBieSBzZW1hbnRpYwpAQCAtMTMwMCwxMyArMTI5OSwxMSBAQAogICAgICAgRVhQUl9DWFhfVU5SRVNPTFZFRF9NRU1CRVIsICAgICAgICAvLyBVbnJlc29sdmVkTWVtYmVyRXhwcgogICAgICAgRVhQUl9DWFhfVU5SRVNPTFZFRF9MT09LVVAsICAgICAgICAvLyBVbnJlc29sdmVkTG9va3VwRXhwcgogCi0gICAgICBFWFBSX0NYWF9VTkFSWV9UWVBFX1RSQUlULCAgLy8gVW5hcnlUeXBlVHJhaXRFeHByCiAgICAgICBFWFBSX0NYWF9FWFBSRVNTSU9OX1RSQUlULCAgLy8gRXhwcmVzc2lvblRyYWl0RXhwcgogICAgICAgRVhQUl9DWFhfTk9FWENFUFQsICAgICAgICAgIC8vIENYWE5vZXhjZXB0RXhwcgogCiAgICAgICBFWFBSX09QQVFVRV9WQUxVRSwgICAgICAgICAgLy8gT3BhcXVlVmFsdWVFeHByCiAgICAgICBFWFBSX0JJTkFSWV9DT05ESVRJT05BTF9PUEVSQVRPUiwgIC8vIEJpbmFyeUNvbmRpdGlvbmFsT3BlcmF0b3IKLSAgICAgIEVYUFJfQklOQVJZX1RZUEVfVFJBSVQsICAgICAvLyBCaW5hcnlUeXBlVHJhaXRFeHByCiAgICAgICBFWFBSX1RZUEVfVFJBSVQsICAgICAgICAgICAgLy8gVHlwZVRyYWl0RXhwcgogICAgICAgRVhQUl9BUlJBWV9UWVBFX1RSQUlULCAgICAgIC8vIEFycmF5VHlwZVRyYWl0SW50RXhwcgogICAgICAgCkBAIC0xMzMzLDYgKzEzMzAsNyBAQAogCiAgICAgICAvLyBPcGVuTVAgZHJlY3RpdmVzCiAgICAgICBTVE1UX09NUF9QQVJBTExFTF9ESVJFQ1RJVkUsCisgICAgICBTVE1UX09NUF9TSU1EX0RJUkVDVElWRSwKIAogICAgICAgLy8gQVJDCiAgICAgICBFWFBSX09CSkNfQlJJREdFRF9DQVNULCAgICAgLy8gT2JqQ0JyaWRnZWRDYXN0RXhwcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0FTVFJlYWRlci5oIGIvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0FTVFJlYWRlci5oCmluZGV4IGQzY2NhMWEuLmIwZmRlMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RSZWFkZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vQVNUUmVhZGVyLmgKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlICJsbHZtL0FEVC9BUFNJbnQuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgogI2luY2x1ZGUgImxsdm0vQURUL01hcFZlY3Rvci5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgpAQCAtNDUsMTAgKzQ0LDExIEBACiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgogI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KIAogbmFtZXNwYWNlIGxsdm0gewogICBjbGFzcyBNZW1vcnlCdWZmZXI7CkBAIC02NCw2ICs2NCw3IEBACiBjbGFzcyBBdHRyOwogY2xhc3MgRGVjbDsKIGNsYXNzIERlY2xDb250ZXh0OworY2xhc3MgRGVmTWFjcm9EaXJlY3RpdmU7CiBjbGFzcyBEaWFnbm9zdGljT3B0aW9uczsKIGNsYXNzIE5lc3RlZE5hbWVTcGVjaWZpZXI7CiBjbGFzcyBDWFhCYXNlU3BlY2lmaWVyOwpAQCAtMTcwLDE1ICsxNzEsNTggQEAKICAgdmlydHVhbCB2b2lkIFJlYWRDb3VudGVyKGNvbnN0IHNlcmlhbGl6YXRpb246Ok1vZHVsZUZpbGUgJk0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYWx1ZSkge30KIAorICAvLy8gVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggQVNUIGZpbGUgbG9hZGVkLgorICB2aXJ0dWFsIHZvaWQgdmlzaXRNb2R1bGVGaWxlKFN0cmluZ1JlZiBGaWxlbmFtZSkge30KKwogICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFxjIEFTVFJlYWRlckxpc3RlbmVyIHdhbnRzIHRvIHJlY2VpdmUgdGhlCiAgIC8vLyBpbnB1dCBmaWxlcyBvZiB0aGUgQVNUIGZpbGUgdmlhIFxjIHZpc2l0SW5wdXRGaWxlLCBmYWxzZSBvdGhlcndpc2UuCiAgIHZpcnR1YWwgYm9vbCBuZWVkc0lucHV0RmlsZVZpc2l0YXRpb24oKSB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8vLyBcYnJpZWYgaWYgXGMgbmVlZHNJbnB1dEZpbGVWaXNpdGF0aW9uIHJldHVybnMgdHJ1ZSwgdGhpcyBpcyBjYWxsZWQgZm9yIGVhY2gKLSAgLy8vIGlucHV0IGZpbGUgb2YgdGhlIEFTVCBmaWxlLgorICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFxjIEFTVFJlYWRlckxpc3RlbmVyIHdhbnRzIHRvIHJlY2VpdmUgdGhlCisgIC8vLyBzeXN0ZW0gaW5wdXQgZmlsZXMgb2YgdGhlIEFTVCBmaWxlIHZpYSBcYyB2aXNpdElucHV0RmlsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICB2aXJ0dWFsIGJvb2wgbmVlZHNTeXN0ZW1JbnB1dEZpbGVWaXNpdGF0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgLy8vIFxicmllZiBpZiBcYyBuZWVkc0lucHV0RmlsZVZpc2l0YXRpb24gcmV0dXJucyB0cnVlLCB0aGlzIGlzIGNhbGxlZCBmb3IKKyAgLy8vIGVhY2ggbm9uLXN5c3RlbSBpbnB1dCBmaWxlIG9mIHRoZSBBU1QgRmlsZS4gSWYKKyAgLy8vIFxjIG5lZWRzU3lzdGVtSW5wdXRGaWxlVmlzaXRhdGlvbiBpcyB0cnVlLCB0aGVuIGl0IGlzIGNhbGxlZCBmb3IgYWxsCisgIC8vLyBzeXN0ZW0gaW5wdXQgZmlsZXMgYXMgd2VsbC4KICAgLy8vCiAgIC8vLyBccmV0dXJucyB0cnVlIHRvIGNvbnRpbnVlIHJlY2VpdmluZyB0aGUgbmV4dCBpbnB1dCBmaWxlLCBmYWxzZSB0byBzdG9wLgotICB2aXJ0dWFsIGJvb2wgdmlzaXRJbnB1dEZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBib29sIGlzU3lzdGVtKSB7IHJldHVybiB0cnVlO30KKyAgdmlydHVhbCBib29sIHZpc2l0SW5wdXRGaWxlKFN0cmluZ1JlZiBGaWxlbmFtZSwgYm9vbCBpc1N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPdmVycmlkZGVuKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKy8vLyBcYnJpZWYgU2ltcGxlIHdyYXBwZXIgY2xhc3MgZm9yIGNoYWluaW5nIGxpc3RlbmVycy4KK2NsYXNzIENoYWluZWRBU1RSZWFkZXJMaXN0ZW5lciA6IHB1YmxpYyBBU1RSZWFkZXJMaXN0ZW5lciB7CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RSZWFkZXJMaXN0ZW5lcj4gRmlyc3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RSZWFkZXJMaXN0ZW5lcj4gU2Vjb25kOworCitwdWJsaWM6CisgIC8vLyBUYWtlcyBvd25lcnNoaXAgb2YgXHAgRmlyc3QgYW5kIFxwIFNlY29uZC4KKyAgQ2hhaW5lZEFTVFJlYWRlckxpc3RlbmVyKEFTVFJlYWRlckxpc3RlbmVyICpGaXJzdCwgQVNUUmVhZGVyTGlzdGVuZXIgKlNlY29uZCkKKyAgICAgIDogRmlyc3QoRmlyc3QpLCBTZWNvbmQoU2Vjb25kKSB7IH0KKworICBib29sIFJlYWRGdWxsVmVyc2lvbkluZm9ybWF0aW9uKFN0cmluZ1JlZiBGdWxsVmVyc2lvbikgb3ZlcnJpZGU7CisgIGJvb2wgUmVhZExhbmd1YWdlT3B0aW9ucyhjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsIGJvb2wgQ29tcGxhaW4pIG92ZXJyaWRlOworICBib29sIFJlYWRUYXJnZXRPcHRpb25zKGNvbnN0IFRhcmdldE9wdGlvbnMgJlRhcmdldE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbikgb3ZlcnJpZGU7CisgIGJvb2wgUmVhZERpYWdub3N0aWNPcHRpb25zKGNvbnN0IERpYWdub3N0aWNPcHRpb25zICZEaWFnT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbikgb3ZlcnJpZGU7CisgIGJvb2wgUmVhZEZpbGVTeXN0ZW1PcHRpb25zKGNvbnN0IEZpbGVTeXN0ZW1PcHRpb25zICZGU09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIG92ZXJyaWRlOworCisgIGJvb2wgUmVhZEhlYWRlclNlYXJjaE9wdGlvbnMoY29uc3QgSGVhZGVyU2VhcmNoT3B0aW9ucyAmSFNPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIG92ZXJyaWRlOworICBib29sIFJlYWRQcmVwcm9jZXNzb3JPcHRpb25zKGNvbnN0IFByZXByb2Nlc3Nvck9wdGlvbnMgJlBQT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZTdWdnZXN0ZWRQcmVkZWZpbmVzKSBvdmVycmlkZTsKKworICB2b2lkIFJlYWRDb3VudGVyKGNvbnN0IHNlcmlhbGl6YXRpb246Ok1vZHVsZUZpbGUgJk0sIHVuc2lnbmVkIFZhbHVlKSBvdmVycmlkZTsKKyAgYm9vbCBuZWVkc0lucHV0RmlsZVZpc2l0YXRpb24oKSBvdmVycmlkZTsKKyAgYm9vbCBuZWVkc1N5c3RlbUlucHV0RmlsZVZpc2l0YXRpb24oKSBvdmVycmlkZTsKKyAgdm9pZCB2aXNpdE1vZHVsZUZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lKSBvdmVycmlkZTsKKyAgYm9vbCB2aXNpdElucHV0RmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsIGJvb2wgaXNTeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc092ZXJyaWRkZW4pIG92ZXJyaWRlOwogfTsKIAogLy8vIFxicmllZiBBU1RSZWFkZXJMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiB0byB2YWxpZGF0ZSB0aGUgaW5mb3JtYXRpb24gb2YKQEAgLTE5MSwxNCArMjM1LDEzIEBACiAgIFBDSFZhbGlkYXRvcihQcmVwcm9jZXNzb3IgJlBQLCBBU1RSZWFkZXIgJlJlYWRlcikKICAgICA6IFBQKFBQKSwgUmVhZGVyKFJlYWRlcikge30KIAotICB2aXJ0dWFsIGJvb2wgUmVhZExhbmd1YWdlT3B0aW9ucyhjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pOwotICB2aXJ0dWFsIGJvb2wgUmVhZFRhcmdldE9wdGlvbnMoY29uc3QgVGFyZ2V0T3B0aW9ucyAmVGFyZ2V0T3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pOwotICB2aXJ0dWFsIGJvb2wgUmVhZFByZXByb2Nlc3Nvck9wdGlvbnMoY29uc3QgUHJlcHJvY2Vzc29yT3B0aW9ucyAmUFBPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZTdWdnZXN0ZWRQcmVkZWZpbmVzKTsKLSAgdmlydHVhbCB2b2lkIFJlYWRDb3VudGVyKGNvbnN0IHNlcmlhbGl6YXRpb246Ok1vZHVsZUZpbGUgJk0sIHVuc2lnbmVkIFZhbHVlKTsKKyAgYm9vbCBSZWFkTGFuZ3VhZ2VPcHRpb25zKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIG92ZXJyaWRlOworICBib29sIFJlYWRUYXJnZXRPcHRpb25zKGNvbnN0IFRhcmdldE9wdGlvbnMgJlRhcmdldE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbikgb3ZlcnJpZGU7CisgIGJvb2wgUmVhZFByZXByb2Nlc3Nvck9wdGlvbnMoY29uc3QgUHJlcHJvY2Vzc29yT3B0aW9ucyAmUFBPcHRzLCBib29sIENvbXBsYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZTdWdnZXN0ZWRQcmVkZWZpbmVzKSBvdmVycmlkZTsKKyAgdm9pZCBSZWFkQ291bnRlcihjb25zdCBzZXJpYWxpemF0aW9uOjpNb2R1bGVGaWxlICZNLCB1bnNpZ25lZCBWYWx1ZSkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgIHZvaWQgRXJyb3IoY29uc3QgY2hhciAqTXNnKTsKQEAgLTI4NSw3ICszMjgsNyBAQAogCiBwcml2YXRlOgogICAvLy8gXGJyaWVmIFRoZSByZWNlaXZlciBvZiBzb21lIGNhbGxiYWNrcyBpbnZva2VkIGJ5IEFTVFJlYWRlci4KLSAgT3duaW5nUHRyPEFTVFJlYWRlckxpc3RlbmVyPiBMaXN0ZW5lcjsKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVFJlYWRlckxpc3RlbmVyPiBMaXN0ZW5lcjsKIAogICAvLy8gXGJyaWVmIFRoZSByZWNlaXZlciBvZiBkZXNlcmlhbGl6YXRpb24gZXZlbnRzLgogICBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lciAqRGVzZXJpYWxpemF0aW9uTGlzdGVuZXI7CkBAIC0zMTUsNyArMzU4LDcgQEAKICAgU291cmNlTG9jYXRpb24gQ3VycmVudEltcG9ydExvYzsKIAogICAvLy8gXGJyaWVmIFRoZSBnbG9iYWwgbW9kdWxlIGluZGV4LCBpZiBsb2FkZWQuCi0gIGxsdm06Ok93bmluZ1B0cjxHbG9iYWxNb2R1bGVJbmRleD4gR2xvYmFsSW5kZXg7CisgIHN0ZDo6dW5pcXVlX3B0cjxHbG9iYWxNb2R1bGVJbmRleD4gR2xvYmFsSW5kZXg7CiAKICAgLy8vIFxicmllZiBBIG1hcCBvZiBnbG9iYWwgYml0IG9mZnNldHMgdG8gdGhlIG1vZHVsZSB0aGF0IHN0b3JlcyBlbnRpdGllcwogICAvLy8gYXQgdGhvc2UgYml0IG9mZnNldHMuCkBAIC00NzEsMTggKzUxNCwyMiBAQAogICAvLy8gZ2xvYmFsIHN1Ym1vZHVsZSBJRCB0byBwcm9kdWNlIGEgbG9jYWwgSUQuCiAgIEdsb2JhbFN1Ym1vZHVsZU1hcFR5cGUgR2xvYmFsU3VibW9kdWxlTWFwOwogCisgIC8vLyBcYnJpZWYgSW5mb3JtYXRpb24gb24gYSBtYWNybyBkZWZpbml0aW9uIG9yIHVuZGVmaW5pdGlvbiB0aGF0IGlzIHZpc2libGUKKyAgLy8vIGF0IHRoZSBlbmQgb2YgYSBzdWJtb2R1bGUuCisgIHN0cnVjdCBNb2R1bGVNYWNyb0luZm87CisKICAgLy8vIFxicmllZiBBbiBlbnRpdHkgdGhhdCBoYXMgYmVlbiBoaWRkZW4uCiAgIGNsYXNzIEhpZGRlbk5hbWUgewogICBwdWJsaWM6CiAgICAgZW51bSBOYW1lS2luZCB7CiAgICAgICBEZWNsYXJhdGlvbiwKLSAgICAgIE1hY3JvVmlzaWJpbGl0eQorICAgICAgTWFjcm8KICAgICB9IEtpbmQ7CiAKICAgcHJpdmF0ZToKICAgICB1bmlvbiB7CiAgICAgICBEZWNsICpEOwotICAgICAgTWFjcm9EaXJlY3RpdmUgKk1EOworICAgICAgTW9kdWxlTWFjcm9JbmZvICpNTUk7CiAgICAgfTsKIAogICAgIElkZW50aWZpZXJJbmZvICpJZDsKQEAgLTQ5MCw4ICs1MzcsOCBAQAogICBwdWJsaWM6CiAgICAgSGlkZGVuTmFtZShEZWNsICpEKSA6IEtpbmQoRGVjbGFyYXRpb24pLCBEKEQpLCBJZCgpIHsgfQogCi0gICAgSGlkZGVuTmFtZShJZGVudGlmaWVySW5mbyAqSUksIE1hY3JvRGlyZWN0aXZlICpNRCkKLSAgICAgIDogS2luZChNYWNyb1Zpc2liaWxpdHkpLCBNRChNRCksIElkKElJKSB7IH0KKyAgICBIaWRkZW5OYW1lKElkZW50aWZpZXJJbmZvICpJSSwgTW9kdWxlTWFjcm9JbmZvICpNTUkpCisgICAgICA6IEtpbmQoTWFjcm8pLCBNTUkoTU1JKSwgSWQoSUkpIHsgfQogCiAgICAgTmFtZUtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KIApAQCAtNTAwLDE1ICs1NDcsMjEgQEAKICAgICAgIHJldHVybiBEOwogICAgIH0KIAotICAgIHN0ZDo6cGFpcjxJZGVudGlmaWVySW5mbyAqLCBNYWNyb0RpcmVjdGl2ZSAqPiBnZXRNYWNybygpIGNvbnN0IHsKLSAgICAgIGFzc2VydChnZXRLaW5kKCkgPT0gTWFjcm9WaXNpYmlsaXR5ICYmICJIaWRkZW4gbmFtZSBpcyBub3QgYSBtYWNybyEiKTsKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihJZCwgTUQpOworICAgIHN0ZDo6cGFpcjxJZGVudGlmaWVySW5mbyAqLCBNb2R1bGVNYWNyb0luZm8gKj4gZ2V0TWFjcm8oKSBjb25zdCB7CisgICAgICBhc3NlcnQoZ2V0S2luZCgpID09IE1hY3JvICYmICJIaWRkZW4gbmFtZSBpcyBub3QgYSBtYWNybyEiKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihJZCwgTU1JKTsKICAgICB9Ci19OworICB9OworCisgIHR5cGVkZWYgbGx2bTo6U21hbGxEZW5zZU1hcDxJZGVudGlmaWVySW5mbyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVNYWNyb0luZm8qPiBIaWRkZW5NYWNyb3NNYXA7CiAKICAgLy8vIFxicmllZiBBIHNldCBvZiBoaWRkZW4gZGVjbGFyYXRpb25zLgotICB0eXBlZGVmIFNtYWxsVmVjdG9yPEhpZGRlbk5hbWUsIDI+IEhpZGRlbk5hbWVzOwotICAKKyAgc3RydWN0IEhpZGRlbk5hbWVzIHsKKyAgICBTbWFsbFZlY3RvcjxEZWNsKiwgMj4gSGlkZGVuRGVjbHM7CisgICAgSGlkZGVuTWFjcm9zTWFwIEhpZGRlbk1hY3JvczsKKyAgfTsKKwogICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPE1vZHVsZSAqLCBIaWRkZW5OYW1lcz4gSGlkZGVuTmFtZXNNYXBUeXBlOwogCiAgIC8vLyBcYnJpZWYgQSBtYXBwaW5nIGZyb20gZWFjaCBvZiB0aGUgaGlkZGVuIHN1Ym1vZHVsZXMgdG8gdGhlIGRlc2VyaWFsaXplZApAQCAtNTY0LDggKzYxNyw4IEBACiAgICAgTW9kdWxlRmlsZSAqTTsKIAogICAgIHN0cnVjdCBNb2R1bGVNYWNyb0RhdGFUeSB7Ci0gICAgICBzZXJpYWxpemF0aW9uOjpHbG9iYWxNYWNyb0lEIEdNYWNJRDsKLSAgICAgIHVuc2lnbmVkIEltcG9ydExvYzsKKyAgICAgIHVpbnQzMl90IE1hY0lEOworICAgICAgc2VyaWFsaXphdGlvbjo6U3VibW9kdWxlSUQgKk92ZXJyaWRlczsKICAgICB9OwogICAgIHN0cnVjdCBQQ0hNYWNyb0RhdGFUeSB7CiAgICAgICB1aW50NjRfdCBNYWNyb0RpcmVjdGl2ZXNPZmZzZXQ7CkBAIC01NzcsMTAgKzYzMCwxMCBAQAogICAgIH07CiAKICAgICBQZW5kaW5nTWFjcm9JbmZvKE1vZHVsZUZpbGUgKk0sCi0gICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uOjpHbG9iYWxNYWNyb0lEIEdNYWNJRCwKLSAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYykgOiBNKE0pIHsKLSAgICAgIE1vZHVsZU1hY3JvRGF0YS5HTWFjSUQgPSBHTWFjSUQ7Ci0gICAgICBNb2R1bGVNYWNyb0RhdGEuSW1wb3J0TG9jID0gSW1wb3J0TG9jLmdldFJhd0VuY29kaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBNYWNJRCwKKyAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb246OlN1Ym1vZHVsZUlEICpPdmVycmlkZXMpIDogTShNKSB7CisgICAgICBNb2R1bGVNYWNyb0RhdGEuTWFjSUQgPSBNYWNJRDsKKyAgICAgIE1vZHVsZU1hY3JvRGF0YS5PdmVycmlkZXMgPSBPdmVycmlkZXM7CiAgICAgfQogCiAgICAgUGVuZGluZ01hY3JvSW5mbyhNb2R1bGVGaWxlICpNLCB1aW50NjRfdCBNYWNyb0RpcmVjdGl2ZXNPZmZzZXQpIDogTShNKSB7CkBAIC02MTAsMTAgKzY2MywxMCBAQAogICAvLy8gXGJyaWVmIFRoZSBJRHMgb2YgYWxsIGRlY2xhcmF0aW9ucyB0aGF0IGZ1bGZpbGwgdGhlIGNyaXRlcmlhIG9mCiAgIC8vLyAiaW50ZXJlc3RpbmciIGRlY2xzLgogICAvLy8KLSAgLy8vIFRoaXMgY29udGFpbnMgdGhlIGRhdGEgbG9hZGVkIGZyb20gYWxsIEVYVEVSTkFMX0RFRklOSVRJT05TIGJsb2NrcyBpbiB0aGUKLSAgLy8vIGNoYWluLiBUaGUgcmVmZXJlbmNlZCBkZWNsYXJhdGlvbnMgYXJlIGRlc2VyaWFsaXplZCBhbmQgcGFzc2VkIHRvIHRoZQotICAvLy8gY29uc3VtZXIgZWFnZXJseS4KLSAgU21hbGxWZWN0b3I8dWludDY0X3QsIDE2PiBFeHRlcm5hbERlZmluaXRpb25zOworICAvLy8gVGhpcyBjb250YWlucyB0aGUgZGF0YSBsb2FkZWQgZnJvbSBhbGwgRUFHRVJMWV9ERVNFUklBTElaRURfREVDTFMgYmxvY2tzCisgIC8vLyBpbiB0aGUgY2hhaW4uIFRoZSByZWZlcmVuY2VkIGRlY2xhcmF0aW9ucyBhcmUgZGVzZXJpYWxpemVkIGFuZCBwYXNzZWQgdG8KKyAgLy8vIHRoZSBjb25zdW1lciBlYWdlcmx5LgorICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgMTY+IEVhZ2VybHlEZXNlcmlhbGl6ZWREZWNsczsKIAogICAvLy8gXGJyaWVmIFRoZSBJRHMgb2YgYWxsIHRlbnRhdGl2ZSBkZWZpbml0aW9ucyBzdG9yZWQgaW4gdGhlIGNoYWluLgogICAvLy8KQEAgLTcxNCw5ICs3NjcsMTcgQEAKICAgLy8gXGJyaWVmIEEgbGlzdCBvZiBsYXRlIHBhcnNlZCB0ZW1wbGF0ZSBmdW5jdGlvbiBkYXRhLgogICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgMT4gTGF0ZVBhcnNlZFRlbXBsYXRlczsKIAorICBzdHJ1Y3QgSW1wb3J0ZWRTdWJtb2R1bGUgeworICAgIHNlcmlhbGl6YXRpb246OlN1Ym1vZHVsZUlEIElEOworICAgIFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYzsKKworICAgIEltcG9ydGVkU3VibW9kdWxlKHNlcmlhbGl6YXRpb246OlN1Ym1vZHVsZUlEIElELCBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MpCisgICAgICA6IElEKElEKSwgSW1wb3J0TG9jKEltcG9ydExvYykge30KKyAgfTsKKwogICAvLy8gXGJyaWVmIEEgbGlzdCBvZiBtb2R1bGVzIHRoYXQgd2VyZSBpbXBvcnRlZCBieSBwcmVjb21waWxlZCBoZWFkZXJzIG9yCiAgIC8vLyBhbnkgb3RoZXIgbm9uLW1vZHVsZSBBU1QgZmlsZS4KLSAgU21hbGxWZWN0b3I8c2VyaWFsaXphdGlvbjo6U3VibW9kdWxlSUQsIDI+IEltcG9ydGVkTW9kdWxlczsKKyAgU21hbGxWZWN0b3I8SW1wb3J0ZWRTdWJtb2R1bGUsIDI+IEltcG9ydGVkTW9kdWxlczsKICAgLy9AfQogCiAgIC8vLyBcYnJpZWYgVGhlIGRpcmVjdG9yeSB0aGF0IHRoZSBQQ0ggd2UgYXJlIHJlYWRpbmcgaXMgc3RvcmVkIGluLgpAQCAtNzMzLDYgKzc5NCwxMyBAQAogICAvLy8gXGJyaWVmIFdoZXRoZXIgdG8gYWNjZXB0IGFuIEFTVCBmaWxlIHdpdGggY29tcGlsZXIgZXJyb3JzLgogICBib29sIEFsbG93QVNUV2l0aENvbXBpbGVyRXJyb3JzOwogCisgIC8vLyBcYnJpZWYgV2hldGhlciB0byBhY2NlcHQgYW4gQVNUIGZpbGUgdGhhdCBoYXMgYSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbgorICAvLy8gZnJvbSB0aGUgY3VycmVudCBjb21waWxlciBpbnN0YW5jZS4KKyAgYm9vbCBBbGxvd0NvbmZpZ3VyYXRpb25NaXNtYXRjaDsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdmFsaWRhdGUgc3lzdGVtIGlucHV0IGZpbGVzLgorICBib29sIFZhbGlkYXRlU3lzdGVtSW5wdXRzOworCiAgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBhcmUgYWxsb3dlZCB0byB1c2UgdGhlIGdsb2JhbCBtb2R1bGUgaW5kZXguCiAgIGJvb2wgVXNlR2xvYmFsSW5kZXg7CiAKQEAgLTk3MCw2ICsxMDM4LDE4IEBACiAgIC8vLyBcYnJpZWYgUmVhZHMgYSBzdGF0ZW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIGN1cnNvci4KICAgU3RtdCAqUmVhZFN0bXRGcm9tU3RyZWFtKE1vZHVsZUZpbGUgJkYpOwogCisgIHN0cnVjdCBJbnB1dEZpbGVJbmZvIHsKKyAgICBzdGQ6OnN0cmluZyBGaWxlbmFtZTsKKyAgICBvZmZfdCBTdG9yZWRTaXplOworICAgIHRpbWVfdCBTdG9yZWRUaW1lOworICAgIGJvb2wgT3ZlcnJpZGRlbjsKKyAgfTsKKworICAvLy8gXGJyaWVmIFJlYWRzIHRoZSBzdG9yZWQgaW5mb3JtYXRpb24gYWJvdXQgYW4gaW5wdXQgZmlsZS4KKyAgSW5wdXRGaWxlSW5mbyByZWFkSW5wdXRGaWxlSW5mbyhNb2R1bGVGaWxlICZGLCB1bnNpZ25lZCBJRCk7CisgIC8vLyBcYnJpZWYgQSBjb252ZW5pZW5jZSBtZXRob2QgdG8gcmVhZCB0aGUgZmlsZW5hbWUgZnJvbSBhbiBpbnB1dCBmaWxlLgorICBzdGQ6OnN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKE1vZHVsZUZpbGUgJkYsIHVuc2lnbmVkIElEKTsKKwogICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBmaWxlIGVudHJ5IGFuZCAnb3ZlcnJpZGRlbicgYml0IGZvciBhbiBpbnB1dAogICAvLy8gZmlsZSBpbiB0aGUgZ2l2ZW4gbW9kdWxlIGZpbGUuCiAgIHNlcmlhbGl6YXRpb246OklucHV0RmlsZSBnZXRJbnB1dEZpbGUoTW9kdWxlRmlsZSAmRiwgdW5zaWduZWQgSUQsCkBAIC0xMDI4LDYgKzExMDgsMTAgQEAKICAgfTsKIAogICBRdWFsVHlwZSByZWFkVHlwZVJlY29yZCh1bnNpZ25lZCBJbmRleCk7CisgIHZvaWQgcmVhZEV4Y2VwdGlvblNwZWMoTW9kdWxlRmlsZSAmTW9kdWxlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UXVhbFR5cGU+ICZFeGNlcHRpb25TdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gJkVQSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWNvcmREYXRhICZSZWNvcmQsIHVuc2lnbmVkICZJbmRleCk7CiAgIFJlY29yZExvY2F0aW9uIFR5cGVDdXJzb3JGb3JJbmRleCh1bnNpZ25lZCBJbmRleCk7CiAgIHZvaWQgTG9hZGVkRGVjbCh1bnNpZ25lZCBJbmRleCwgRGVjbCAqRCk7CiAgIERlY2wgKlJlYWREZWNsUmVjb3JkKHNlcmlhbGl6YXRpb246OkRlY2xJRCBJRCk7CkBAIC0xMTc0LDExICsxMjU4LDIwIEBACiAgIC8vLyBBU1QgZmlsZSB0aGUgd2FzIGNyZWF0ZWQgb3V0IG9mIGFuIEFTVCB3aXRoIGNvbXBpbGVyIGVycm9ycywKICAgLy8vIG90aGVyd2lzZSBpdCB3aWxsIHJlamVjdCBpdC4KICAgLy8vCisgIC8vLyBccGFyYW0gQWxsb3dDb25maWd1cmF0aW9uTWlzbWF0Y2ggSWYgdHJ1ZSwgdGhlIEFTVCByZWFkZXIgd2lsbCBub3QgY2hlY2sKKyAgLy8vIGZvciBjb25maWd1cmF0aW9uIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIEFTVCBmaWxlIGFuZCB0aGUgaW52b2NhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gVmFsaWRhdGVTeXN0ZW1JbnB1dHMgSWYgdHJ1ZSwgdGhlIEFTVCByZWFkZXIgd2lsbCB2YWxpZGF0ZQorICAvLy8gc3lzdGVtIGlucHV0IGZpbGVzIGluIGFkZGl0aW9uIHRvIHVzZXIgaW5wdXQgZmlsZXMuIFRoaXMgaXMgb25seQorICAvLy8gbWVhbmluZ2Z1bCBpZiBccCBEaXNhYmxlVmFsaWRhdGlvbiBpcyBmYWxzZS4KKyAgLy8vCiAgIC8vLyBccGFyYW0gVXNlR2xvYmFsSW5kZXggSWYgdHJ1ZSwgdGhlIEFTVCByZWFkZXIgd2lsbCB0cnkgdG8gbG9hZCBhbmQgdXNlCiAgIC8vLyB0aGUgZ2xvYmFsIG1vZHVsZSBpbmRleC4KICAgQVNUUmVhZGVyKFByZXByb2Nlc3NvciAmUFAsIEFTVENvbnRleHQgJkNvbnRleHQsIFN0cmluZ1JlZiBpc3lzcm9vdCA9ICIiLAogICAgICAgICAgICAgYm9vbCBEaXNhYmxlVmFsaWRhdGlvbiA9IGZhbHNlLAogICAgICAgICAgICAgYm9vbCBBbGxvd0FTVFdpdGhDb21waWxlckVycm9ycyA9IGZhbHNlLAorICAgICAgICAgICAgYm9vbCBBbGxvd0NvbmZpZ3VyYXRpb25NaXNtYXRjaCA9IGZhbHNlLAorICAgICAgICAgICAgYm9vbCBWYWxpZGF0ZVN5c3RlbUlucHV0cyA9IGZhbHNlLAogICAgICAgICAgICAgYm9vbCBVc2VHbG9iYWxJbmRleCA9IHRydWUpOwogCiAgIH5BU1RSZWFkZXIoKTsKQEAgLTEyMzcsMjQgKzEzMzAsMzMgQEAKICAgLy8vIFxwYXJhbSBJbXBvcnRMb2MgVGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRoZSBpbXBvcnQgb2NjdXJzLgogICAvLy8KICAgLy8vIFxwYXJhbSBDb21wbGFpbiBXaGV0aGVyIHRvIGNvbXBsYWluIGFib3V0IGNvbmZsaWN0aW5nIG1vZHVsZSBpbXBvcnRzLgotICB2b2lkIG1ha2VNb2R1bGVWaXNpYmxlKE1vZHVsZSAqTW9kLCAKKyAgdm9pZCBtYWtlTW9kdWxlVmlzaWJsZShNb2R1bGUgKk1vZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGU6Ok5hbWVWaXNpYmlsaXR5S2luZCBOYW1lVmlzaWJpbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbik7Ci0gIAorCiAgIC8vLyBcYnJpZWYgTWFrZSB0aGUgbmFtZXMgd2l0aGluIHRoaXMgc2V0IG9mIGhpZGRlbiBuYW1lcyB2aXNpYmxlLgogICB2b2lkIG1ha2VOYW1lc1Zpc2libGUoY29uc3QgSGlkZGVuTmFtZXMgJk5hbWVzLCBNb2R1bGUgKk93bmVyKTsKLSAgCisKICAgLy8vIFxicmllZiBTZXQgdGhlIEFTVCBjYWxsYmFja3MgbGlzdGVuZXIuCiAgIHZvaWQgc2V0TGlzdGVuZXIoQVNUUmVhZGVyTGlzdGVuZXIgKmxpc3RlbmVyKSB7CiAgICAgTGlzdGVuZXIucmVzZXQobGlzdGVuZXIpOwogICB9CiAKKyAgLy8vIFxicmllZiBBZGQgYW4gQVNUIGNhbGxiYWsgbGlzdGVuZXIuCisgIC8vLworICAvLy8gVGFrZXMgb3duZXJzaGlwIG9mIFxwIEwuCisgIHZvaWQgYWRkTGlzdGVuZXIoQVNUUmVhZGVyTGlzdGVuZXIgKkwpIHsKKyAgICBpZiAoTGlzdGVuZXIpCisgICAgICBMID0gbmV3IENoYWluZWRBU1RSZWFkZXJMaXN0ZW5lcihMLCBMaXN0ZW5lci5yZWxlYXNlKCkpOworICAgIExpc3RlbmVyLnJlc2V0KEwpOworICB9CisKICAgLy8vIFxicmllZiBTZXQgdGhlIEFTVCBkZXNlcmlhbGl6YXRpb24gbGlzdGVuZXIuCiAgIHZvaWQgc2V0RGVzZXJpYWxpemF0aW9uTGlzdGVuZXIoQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIgKkxpc3RlbmVyKTsKIAogICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoaXMgQVNUIHJlYWRlciBoYXMgYSBnbG9iYWwgaW5kZXguCi0gIGJvb2wgaGFzR2xvYmFsSW5kZXgoKSBjb25zdCB7IHJldHVybiBHbG9iYWxJbmRleC5pc1ZhbGlkKCk7IH0KKyAgYm9vbCBoYXNHbG9iYWxJbmRleCgpIGNvbnN0IHsgcmV0dXJuIChib29sKUdsb2JhbEluZGV4OyB9CiAKICAgLy8vIFxicmllZiBBdHRlbXB0cyB0byBsb2FkIHRoZSBnbG9iYWwgaW5kZXguCiAgIC8vLwpAQCAtMTMyNSwyMCArMTQyNywyMCBAQAogICAvLy8KICAgLy8vIFxyZXR1cm5zIG51bGwgaWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhhdCBwcmV2ZW50ZWQgdGhlIHByZXByb2Nlc3NlZAogICAvLy8gZW50aXR5IGZyb20gYmVpbmcgbG9hZGVkLgotICB2aXJ0dWFsIFByZXByb2Nlc3NlZEVudGl0eSAqUmVhZFByZXByb2Nlc3NlZEVudGl0eSh1bnNpZ25lZCBJbmRleCk7CisgIFByZXByb2Nlc3NlZEVudGl0eSAqUmVhZFByZXByb2Nlc3NlZEVudGl0eSh1bnNpZ25lZCBJbmRleCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZXR1cm5zIGEgcGFpciBvZiBbQmVnaW4sIEVuZCkgaW5kaWNlcyBvZiBwcmVhbGxvY2F0ZWQKICAgLy8vIHByZXByb2Nlc3NlZCBlbnRpdGllcyB0aGF0IFxwIFJhbmdlIGVuY29tcGFzc2VzLgotICB2aXJ0dWFsIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+Ci0gICAgICBmaW5kUHJlcHJvY2Vzc2VkRW50aXRpZXNJblJhbmdlKFNvdXJjZVJhbmdlIFJhbmdlKTsKKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4KKyAgICAgIGZpbmRQcmVwcm9jZXNzZWRFbnRpdGllc0luUmFuZ2UoU291cmNlUmFuZ2UgUmFuZ2UpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgT3B0aW9uYWxseSByZXR1cm5zIHRydWUgb3IgZmFsc2UgaWYgdGhlIHByZWFsbG9jYXRlZCBwcmVwcm9jZXNzZWQKICAgLy8vIGVudGl0eSB3aXRoIGluZGV4IFxwIEluZGV4IGNhbWUgZnJvbSBmaWxlIFxwIEZJRC4KLSAgdmlydHVhbCBPcHRpb25hbDxib29sPiBpc1ByZXByb2Nlc3NlZEVudGl0eUluRmlsZUlEKHVuc2lnbmVkIEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEIEZJRCk7CisgIE9wdGlvbmFsPGJvb2w+IGlzUHJlcHJvY2Vzc2VkRW50aXR5SW5GaWxlSUQodW5zaWduZWQgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEIEZJRCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZWFkIHRoZSBoZWFkZXIgZmlsZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIGZpbGUgZW50cnkuCi0gIHZpcnR1YWwgSGVhZGVyRmlsZUluZm8gR2V0SGVhZGVyRmlsZUluZm8oY29uc3QgRmlsZUVudHJ5ICpGRSk7CisgIEhlYWRlckZpbGVJbmZvIEdldEhlYWRlckZpbGVJbmZvKGNvbnN0IEZpbGVFbnRyeSAqRkUpIG92ZXJyaWRlOwogCiAgIHZvaWQgUmVhZFByYWdtYURpYWdub3N0aWNNYXBwaW5ncyhEaWFnbm9zdGljc0VuZ2luZSAmRGlhZyk7CiAKQEAgLTE0NTAsNyArMTU1Miw3IEBACiAgIC8vLyBcYnJpZWYgUmVzb2x2ZSBhIGRlY2xhcmF0aW9uIElEIGludG8gYSBkZWNsYXJhdGlvbiwgcG90ZW50aWFsbHkKICAgLy8vIGJ1aWxkaW5nIGEgbmV3IGRlY2xhcmF0aW9uLgogICBEZWNsICpHZXREZWNsKHNlcmlhbGl6YXRpb246OkRlY2xJRCBJRCk7Ci0gIHZpcnR1YWwgRGVjbCAqR2V0RXh0ZXJuYWxEZWNsKHVpbnQzMl90IElEKTsKKyAgRGVjbCAqR2V0RXh0ZXJuYWxEZWNsKHVpbnQzMl90IElEKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJlYWRzIGEgZGVjbGFyYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbG9jYWwgSUQgaW4gdGhlIGdpdmVuIG1vZHVsZS4KICAgRGVjbCAqR2V0TG9jYWxEZWNsKE1vZHVsZUZpbGUgJkYsIHVpbnQzMl90IExvY2FsSUQpIHsKQEAgLTE1MDIsMTQgKzE2MDQsMTQgQEAKICAgdWludDY0X3QgcmVhZENYWEJhc2VTcGVjaWZpZXJzKE1vZHVsZUZpbGUgJk0sIGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZJZHgpOwogCi0gIHZpcnR1YWwgQ1hYQmFzZVNwZWNpZmllciAqR2V0RXh0ZXJuYWxDWFhCYXNlU3BlY2lmaWVycyh1aW50NjRfdCBPZmZzZXQpOworICBDWFhCYXNlU3BlY2lmaWVyICpHZXRFeHRlcm5hbENYWEJhc2VTcGVjaWZpZXJzKHVpbnQ2NF90IE9mZnNldCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZXNvbHZlIHRoZSBvZmZzZXQgb2YgYSBzdGF0ZW1lbnQgaW50byBhIHN0YXRlbWVudC4KICAgLy8vCiAgIC8vLyBUaGlzIG9wZXJhdGlvbiB3aWxsIHJlYWQgYSBuZXcgc3RhdGVtZW50IGZyb20gdGhlIGV4dGVybmFsCiAgIC8vLyBzb3VyY2UgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCwgYW5kIGlzIG1lYW50IHRvIGJlIHVzZWQgdmlhIGEKICAgLy8vIExhenlPZmZzZXRQdHIgKHdoaWNoIGlzIHVzZWQgYnkgRGVjbHMgZm9yIHRoZSBib2R5IG9mIGZ1bmN0aW9ucywgZXRjKS4KLSAgdmlydHVhbCBTdG10ICpHZXRFeHRlcm5hbERlY2xTdG10KHVpbnQ2NF90IE9mZnNldCk7CisgIFN0bXQgKkdldEV4dGVybmFsRGVjbFN0bXQodWludDY0X3QgT2Zmc2V0KSBvdmVycmlkZTsKIAogICAvLy8gUmVhZEJsb2NrQWJicmV2cyAtIEVudGVyIGEgc3ViYmxvY2sgb2YgdGhlIHNwZWNpZmllZCBCbG9ja0lEIHdpdGggdGhlCiAgIC8vLyBzcGVjaWZpZWQgY3Vyc29yLiAgUmVhZCB0aGUgYWJicmV2aWF0aW9ucyB0aGF0IGFyZSBhdCB0aGUgdG9wIG9mIHRoZSBibG9jawpAQCAtMTUxOSw5ICsxNjIxLDggQEAKICAgLy8vIFxicmllZiBGaW5kcyBhbGwgdGhlIHZpc2libGUgZGVjbGFyYXRpb25zIHdpdGggYSBnaXZlbiBuYW1lLgogICAvLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QganVzdCBsb2FkcyB0aGUgZW50aXJlCiAgIC8vLyBsb29rdXAgdGFibGUgYXMgdW5tYXRlcmlhbGl6ZWQgcmVmZXJlbmNlcy4KLSAgdmlydHVhbCBib29sCi0gIEZpbmRFeHRlcm5hbFZpc2libGVEZWNsc0J5TmFtZShjb25zdCBEZWNsQ29udGV4dCAqREMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWUgTmFtZSk7CisgIGJvb2wgRmluZEV4dGVybmFsVmlzaWJsZURlY2xzQnlOYW1lKGNvbnN0IERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE5hbWUpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgUmVhZCBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBsZXhpY2FsbHkgc3RvcmVkIGluIGEKICAgLy8vIGRlY2xhcmF0aW9uIGNvbnRleHQuCkBAIC0xNTM2LDQ5ICsxNjM3LDQ5IEBACiAgIC8vLwogICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmVhZGluZyB0aGUKICAgLy8vIGRlY2xhcmF0aW9ucyBmb3IgdGhpcyBkZWNsYXJhdGlvbiBjb250ZXh0LgotICB2aXJ0dWFsIEV4dGVybmFsTG9hZFJlc3VsdCBGaW5kRXh0ZXJuYWxMZXhpY2FsRGVjbHMoY29uc3QgRGVjbENvbnRleHQgKkRDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc0tpbmRXZVdhbnQpKERlY2w6OktpbmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxEZWNsKj4gJkRlY2xzKTsKKyAgRXh0ZXJuYWxMb2FkUmVzdWx0IEZpbmRFeHRlcm5hbExleGljYWxEZWNscyhjb25zdCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc0tpbmRXZVdhbnQpKERlY2w6OktpbmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8RGVjbCo+ICZEZWNscykgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBHZXQgdGhlIGRlY2xzIHRoYXQgYXJlIGNvbnRhaW5lZCBpbiBhIGZpbGUgaW4gdGhlIE9mZnNldC9MZW5ndGgKICAgLy8vIHJhbmdlLiBccCBMZW5ndGggY2FuIGJlIDAgdG8gaW5kaWNhdGUgYSBwb2ludCBhdCBccCBPZmZzZXQgaW5zdGVhZCBvZgogICAvLy8gYSByYW5nZS4KLSAgdmlydHVhbCB2b2lkIEZpbmRGaWxlUmVnaW9uRGVjbHMoRmlsZUlEIEZpbGUsIHVuc2lnbmVkIE9mZnNldCx1bnNpZ25lZCBMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxEZWNsICo+ICZEZWNscyk7CisgIHZvaWQgRmluZEZpbGVSZWdpb25EZWNscyhGaWxlSUQgRmlsZSwgdW5zaWduZWQgT2Zmc2V0LCB1bnNpZ25lZCBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8RGVjbCAqPiAmRGVjbHMpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgTm90aWZ5IEFTVFJlYWRlciB0aGF0IHdlIHN0YXJ0ZWQgZGVzZXJpYWxpemF0aW9uIG9mCiAgIC8vLyBhIGRlY2wgb3IgdHlwZSBzbyB1bnRpbCBGaW5pc2hlZERlc2VyaWFsaXppbmcgaXMgY2FsbGVkIHRoZXJlIG1heSBiZQogICAvLy8gZGVjbHMgdGhhdCBhcmUgaW5pdGlhbGl6aW5nLiBNdXN0IGJlIHBhaXJlZCB3aXRoIEZpbmlzaGVkRGVzZXJpYWxpemluZy4KLSAgdmlydHVhbCB2b2lkIFN0YXJ0ZWREZXNlcmlhbGl6aW5nKCkgeyArK051bUN1cnJlbnRFbGVtZW50c0Rlc2VyaWFsaXppbmc7IH0KKyAgdm9pZCBTdGFydGVkRGVzZXJpYWxpemluZygpIG92ZXJyaWRlIHsgKytOdW1DdXJyZW50RWxlbWVudHNEZXNlcmlhbGl6aW5nOyB9CiAKICAgLy8vIFxicmllZiBOb3RpZnkgQVNUUmVhZGVyIHRoYXQgd2UgZmluaXNoZWQgdGhlIGRlc2VyaWFsaXphdGlvbiBvZgogICAvLy8gYSBkZWNsIG9yIHR5cGUuIE11c3QgYmUgcGFpcmVkIHdpdGggU3RhcnRlZERlc2VyaWFsaXppbmcuCi0gIHZpcnR1YWwgdm9pZCBGaW5pc2hlZERlc2VyaWFsaXppbmcoKTsKKyAgdm9pZCBGaW5pc2hlZERlc2VyaWFsaXppbmcoKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIEZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gd2UgYmVnaW4gcGFyc2luZyBhIG5ldwogICAvLy8gdHJhbnNsYXRpb24gdW5pdCBpbnZvbHZpbmcgdGhpcyBleHRlcm5hbCBBU1Qgc291cmNlLgogICAvLy8KICAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm92aWRlIGFsbCBvZiB0aGUgZXh0ZXJuYWwgZGVmaW5pdGlvbnMgdG8KICAgLy8vIHRoZSBBU1RDb25zdW1lci4KLSAgdmlydHVhbCB2b2lkIFN0YXJ0VHJhbnNsYXRpb25Vbml0KEFTVENvbnN1bWVyICpDb25zdW1lcik7CisgIHZvaWQgU3RhcnRUcmFuc2xhdGlvblVuaXQoQVNUQ29uc3VtZXIgKkNvbnN1bWVyKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFByaW50IHNvbWUgc3RhdGlzdGljcyBhYm91dCBBU1QgdXNhZ2UuCi0gIHZpcnR1YWwgdm9pZCBQcmludFN0YXRzKCk7CisgIHZvaWQgUHJpbnRTdGF0cygpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgRHVtcCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQVNUIHJlYWRlciB0byBzdGFuZGFyZCBlcnJvci4KICAgdm9pZCBkdW1wKCk7CiAKICAgLy8vIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGJ5IG1lbW9yeSBidWZmZXJzLCBicmVha2luZyBkb3duCiAgIC8vLyBieSBoZWFwLWJhY2tlZCB2ZXJzdXMgbW1hcCdlZCBtZW1vcnkuCi0gIHZpcnR1YWwgdm9pZCBnZXRNZW1vcnlCdWZmZXJTaXplcyhNZW1vcnlCdWZmZXJTaXplcyAmc2l6ZXMpIGNvbnN0OworICB2b2lkIGdldE1lbW9yeUJ1ZmZlclNpemVzKE1lbW9yeUJ1ZmZlclNpemVzICZzaXplcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBJbml0aWFsaXplIHRoZSBzZW1hbnRpYyBzb3VyY2Ugd2l0aCB0aGUgU2VtYSBpbnN0YW5jZQogICAvLy8gYmVpbmcgdXNlZCB0byBwZXJmb3JtIHNlbWFudGljIGFuYWx5c2lzIG9uIHRoZSBhYnN0cmFjdCBzeW50YXgKICAgLy8vIHRyZWUuCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplU2VtYShTZW1hICZTKTsKKyAgdm9pZCBJbml0aWFsaXplU2VtYShTZW1hICZTKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIEluZm9ybSB0aGUgc2VtYW50aWMgY29uc3VtZXIgdGhhdCBTZW1hIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCi0gIHZpcnR1YWwgdm9pZCBGb3JnZXRTZW1hKCkgeyBTZW1hT2JqID0gMDsgfQorICB2b2lkIEZvcmdldFNlbWEoKSBvdmVycmlkZSB7IFNlbWFPYmogPSAwOyB9CiAKICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgSWRlbnRpZmllckluZm8gZm9yIHRoZSBuYW1lZCBpZGVudGlmaWVyLgogICAvLy8KQEAgLTE1ODcsNTYgKzE2ODgsNTcgQEAKICAgLy8vIGRlY2xhcmF0aW9ucyB3aWxsIGJlIGRlc2VyaWFsaXplZCBhbmQgaW50cm9kdWNlZCBpbnRvIHRoZSBkZWNsYXJhdGlvbgogICAvLy8gY2hhaW4gb2YgdGhlIGlkZW50aWZpZXIuCiAgIHZpcnR1YWwgSWRlbnRpZmllckluZm8gKmdldChjb25zdCBjaGFyICpOYW1lU3RhcnQsIGNvbnN0IGNoYXIgKk5hbWVFbmQpOwotICBJZGVudGlmaWVySW5mbyAqZ2V0KFN0cmluZ1JlZiBOYW1lKSB7CisgIElkZW50aWZpZXJJbmZvICpnZXQoU3RyaW5nUmVmIE5hbWUpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0KE5hbWUuYmVnaW4oKSwgTmFtZS5lbmQoKSk7CiAgIH0KIAogICAvLy8gXGJyaWVmIFJldHJpZXZlIGFuIGl0ZXJhdG9yIGludG8gdGhlIHNldCBvZiBhbGwgaWRlbnRpZmllcnMKICAgLy8vIGluIGFsbCBsb2FkZWQgQVNUIGZpbGVzLgotICB2aXJ0dWFsIElkZW50aWZpZXJJdGVyYXRvciAqZ2V0SWRlbnRpZmllcnMoKTsKKyAgSWRlbnRpZmllckl0ZXJhdG9yICpnZXRJZGVudGlmaWVycygpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgTG9hZCB0aGUgY29udGVudHMgb2YgdGhlIGdsb2JhbCBtZXRob2QgcG9vbCBmb3IgYSBnaXZlbgogICAvLy8gc2VsZWN0b3IuCi0gIHZpcnR1YWwgdm9pZCBSZWFkTWV0aG9kUG9vbChTZWxlY3RvciBTZWwpOworICB2b2lkIFJlYWRNZXRob2RQb29sKFNlbGVjdG9yIFNlbCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBMb2FkIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IGFyZSBrbm93biB0byB0aGUgZXh0ZXJuYWwgc291cmNlLAogICAvLy8gd2hpY2ggd2lsbCBiZSB1c2VkIGR1cmluZyB0eXBvIGNvcnJlY3Rpb24uCi0gIHZpcnR1YWwgdm9pZCBSZWFkS25vd25OYW1lc3BhY2VzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE5hbWVzcGFjZURlY2wgKj4gJk5hbWVzcGFjZXMpOworICB2b2lkIFJlYWRLbm93bk5hbWVzcGFjZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE5hbWVzcGFjZURlY2wgKj4gJk5hbWVzcGFjZXMpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBSZWFkVW5kZWZpbmVkQnV0VXNlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkRlbnNlTWFwPE5hbWVkRGVjbCAqLCBTb3VyY2VMb2NhdGlvbj4gJlVuZGVmaW5lZCk7CisgIHZvaWQgUmVhZFVuZGVmaW5lZEJ1dFVzZWQoCisgICAgICAgICAgICAgICBsbHZtOjpEZW5zZU1hcDxOYW1lZERlY2wgKiwgU291cmNlTG9jYXRpb24+ICZVbmRlZmluZWQpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBSZWFkVGVudGF0aXZlRGVmaW5pdGlvbnMoCi0gICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxWYXJEZWNsICo+ICZUZW50YXRpdmVEZWZzKTsKKyAgdm9pZCBSZWFkVGVudGF0aXZlRGVmaW5pdGlvbnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFZhckRlY2wgKj4gJlRlbnRhdGl2ZURlZnMpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBSZWFkVW51c2VkRmlsZVNjb3BlZERlY2xzKAotICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgRGVjbGFyYXRvckRlY2wgKj4gJkRlY2xzKTsKKyAgdm9pZCBSZWFkVW51c2VkRmlsZVNjb3BlZERlY2xzKAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgRGVjbGFyYXRvckRlY2wgKj4gJkRlY2xzKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgUmVhZERlbGVnYXRpbmdDb25zdHJ1Y3RvcnMoCi0gICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDWFhDb25zdHJ1Y3RvckRlY2wgKj4gJkRlY2xzKTsKKyAgdm9pZCBSZWFkRGVsZWdhdGluZ0NvbnN0cnVjdG9ycygKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q1hYQ29uc3RydWN0b3JEZWNsICo+ICZEZWNscykgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIFJlYWRFeHRWZWN0b3JEZWNscyhTbWFsbFZlY3RvckltcGw8VHlwZWRlZk5hbWVEZWNsICo+ICZEZWNscyk7CisgIHZvaWQgUmVhZEV4dFZlY3RvckRlY2xzKFNtYWxsVmVjdG9ySW1wbDxUeXBlZGVmTmFtZURlY2wgKj4gJkRlY2xzKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgUmVhZER5bmFtaWNDbGFzc2VzKFNtYWxsVmVjdG9ySW1wbDxDWFhSZWNvcmREZWNsICo+ICZEZWNscyk7CisgIHZvaWQgUmVhZER5bmFtaWNDbGFzc2VzKFNtYWxsVmVjdG9ySW1wbDxDWFhSZWNvcmREZWNsICo+ICZEZWNscykgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIFJlYWRMb2NhbGx5U2NvcGVkRXh0ZXJuQ0RlY2xzKAotICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TmFtZWREZWNsICo+ICZEZWNscyk7CisgIHZvaWQgUmVhZExvY2FsbHlTY29wZWRFeHRlcm5DRGVjbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE5hbWVkRGVjbCAqPiAmRGVjbHMpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBSZWFkUmVmZXJlbmNlZFNlbGVjdG9ycygKLSAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxTZWxlY3RvciwgU291cmNlTG9jYXRpb24+ID4gJlNlbHMpOworICB2b2lkIFJlYWRSZWZlcmVuY2VkU2VsZWN0b3JzKAorICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8U2VsZWN0b3IsIFNvdXJjZUxvY2F0aW9uPiA+ICZTZWxzKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgUmVhZFdlYWtVbmRlY2xhcmVkSWRlbnRpZmllcnMoCi0gICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8SWRlbnRpZmllckluZm8gKiwgV2Vha0luZm8+ID4gJldJKTsKKyAgdm9pZCBSZWFkV2Vha1VuZGVjbGFyZWRJZGVudGlmaWVycygKKyAgICAgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPElkZW50aWZpZXJJbmZvICosIFdlYWtJbmZvPiA+ICZXSSkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIFJlYWRVc2VkVlRhYmxlcyhTbWFsbFZlY3RvckltcGw8RXh0ZXJuYWxWVGFibGVVc2U+ICZWVGFibGVzKTsKKyAgdm9pZCBSZWFkVXNlZFZUYWJsZXMoU21hbGxWZWN0b3JJbXBsPEV4dGVybmFsVlRhYmxlVXNlPiAmVlRhYmxlcykgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIFJlYWRQZW5kaW5nSW5zdGFudGlhdGlvbnMoCisgIHZvaWQgUmVhZFBlbmRpbmdJbnN0YW50aWF0aW9ucygKICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxWYWx1ZURlY2wgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbj4gPiAmUGVuZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24+ID4gJlBlbmRpbmcpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBSZWFkTGF0ZVBhcnNlZFRlbXBsYXRlcygKLSAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZ1bmN0aW9uRGVjbCAqLCBMYXRlUGFyc2VkVGVtcGxhdGUgKj4gJkxQVE1hcCk7CisgIHZvaWQgUmVhZExhdGVQYXJzZWRUZW1wbGF0ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRnVuY3Rpb25EZWNsICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZVBhcnNlZFRlbXBsYXRlICo+ICZMUFRNYXApIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgTG9hZCBhIHNlbGVjdG9yIGZyb20gZGlzaywgcmVnaXN0ZXJpbmcgaXRzIElEIGlmIGl0IGV4aXN0cy4KICAgdm9pZCBMb2FkU2VsZWN0b3IoU2VsZWN0b3IgU2VsKTsKQEAgLTE2NTksNyArMTc2MSw3IEBACiAgICAgcmV0dXJuIERlY29kZUlkZW50aWZpZXJJbmZvKGdldEdsb2JhbElkZW50aWZpZXJJRChNLCBSZWNvcmRbSWR4KytdKSk7CiAgIH0KIAotICB2aXJ0dWFsIElkZW50aWZpZXJJbmZvICpHZXRJZGVudGlmaWVyKHNlcmlhbGl6YXRpb246OklkZW50aWZpZXJJRCBJRCkgeworICBJZGVudGlmaWVySW5mbyAqR2V0SWRlbnRpZmllcihzZXJpYWxpemF0aW9uOjpJZGVudGlmaWVySUQgSUQpIG92ZXJyaWRlIHsKICAgICAvLyBOb3RlIHRoYXQgd2UgYXJlIGxvYWRpbmcgYW4gaWRlbnRpZmllci4KICAgICBEZXNlcmlhbGl6aW5nIEFuSWRlbnRpZmllcih0aGlzKTsKIApAQCAtMTY3MSwxNCArMTc3MywyNyBAQAogICBzZXJpYWxpemF0aW9uOjpJZGVudGlmaWVySUQgZ2V0R2xvYmFsSWRlbnRpZmllcklEKE1vZHVsZUZpbGUgJk0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTG9jYWxJRCk7CiAKKyAgTW9kdWxlTWFjcm9JbmZvICpnZXRNb2R1bGVNYWNybyhjb25zdCBQZW5kaW5nTWFjcm9JbmZvICZQTUluZm8pOworCiAgIHZvaWQgcmVzb2x2ZVBlbmRpbmdNYWNybyhJZGVudGlmaWVySW5mbyAqSUksIGNvbnN0IFBlbmRpbmdNYWNyb0luZm8gJlBNSW5mbyk7CiAKICAgdm9pZCBpbnN0YWxsUENITWFjcm9EaXJlY3RpdmVzKElkZW50aWZpZXJJbmZvICpJSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUZpbGUgJk0sIHVpbnQ2NF90IE9mZnNldCk7CiAKLSAgdm9pZCBpbnN0YWxsSW1wb3J0ZWRNYWNybyhJZGVudGlmaWVySW5mbyAqSUksIE1hY3JvRGlyZWN0aXZlICpNRCwKKyAgdm9pZCBpbnN0YWxsSW1wb3J0ZWRNYWNybyhJZGVudGlmaWVySW5mbyAqSUksIE1vZHVsZU1hY3JvSW5mbyAqTU1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqT3duZXIpOwogCisgIHR5cGVkZWYgbGx2bTo6U21hbGxWZWN0b3I8RGVmTWFjcm9EaXJlY3RpdmUqLCAxPiBBbWJpZ3VvdXNNYWNyb3M7CisgIGxsdm06OkRlbnNlTWFwPElkZW50aWZpZXJJbmZvKiwgQW1iaWd1b3VzTWFjcm9zPiBBbWJpZ3VvdXNNYWNyb0RlZnM7CisKKyAgdm9pZAorICByZW1vdmVPdmVycmlkZGVuTWFjcm9zKElkZW50aWZpZXJJbmZvICpJSSwgQW1iaWd1b3VzTWFjcm9zICZBbWJpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxzZXJpYWxpemF0aW9uOjpTdWJtb2R1bGVJRD4gT3ZlcnJpZGVzKTsKKworICBBbWJpZ3VvdXNNYWNyb3MgKgorICByZW1vdmVPdmVycmlkZGVuTWFjcm9zKElkZW50aWZpZXJJbmZvICpJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBcnJheVJlZjxzZXJpYWxpemF0aW9uOjpTdWJtb2R1bGVJRD4gT3ZlcnJpZGVzKTsKKwogICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtYWNybyB3aXRoIHRoZSBnaXZlbiBJRC4KICAgTWFjcm9JbmZvICpnZXRNYWNybyhzZXJpYWxpemF0aW9uOjpNYWNyb0lEIElEKTsKIApAQCAtMTY4NywxMSArMTgwMiwxMSBAQAogICBzZXJpYWxpemF0aW9uOjpNYWNyb0lEIGdldEdsb2JhbE1hY3JvSUQoTW9kdWxlRmlsZSAmTSwgdW5zaWduZWQgTG9jYWxJRCk7CiAKICAgLy8vIFxicmllZiBSZWFkIHRoZSBzb3VyY2UgbG9jYXRpb24gZW50cnkgd2l0aCBpbmRleCBJRC4KLSAgdmlydHVhbCBib29sIFJlYWRTTG9jRW50cnkoaW50IElEKTsKKyAgYm9vbCBSZWFkU0xvY0VudHJ5KGludCBJRCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbW9kdWxlIGltcG9ydCBsb2NhdGlvbiBhbmQgbW9kdWxlIG5hbWUgZm9yIHRoZQogICAvLy8gZ2l2ZW4gc291cmNlIG1hbmFnZXIgZW50cnkgSUQuCi0gIHZpcnR1YWwgc3RkOjpwYWlyPFNvdXJjZUxvY2F0aW9uLCBTdHJpbmdSZWY+IGdldE1vZHVsZUltcG9ydExvYyhpbnQgSUQpOworICBzdGQ6OnBhaXI8U291cmNlTG9jYXRpb24sIFN0cmluZ1JlZj4gZ2V0TW9kdWxlSW1wb3J0TG9jKGludCBJRCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgZ2xvYmFsIHN1Ym1vZHVsZSBJRCBnaXZlbiBhIG1vZHVsZSBhbmQgaXRzIGxvY2FsIElECiAgIC8vLyBudW1iZXIuCkBAIC0xNzA1LDcgKzE4MjAsNyBAQAogICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBtb2R1bGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gbW9kdWxlIElELgogICAvLy8KICAgLy8vIE5vdGU6IG92ZXJyaWRlcyBtZXRob2QgaW4gRXh0ZXJuYWxBU1RTb3VyY2UKLSAgdmlydHVhbCBNb2R1bGUgKmdldE1vZHVsZSh1bnNpZ25lZCBJRCk7CisgIE1vZHVsZSAqZ2V0TW9kdWxlKHVuc2lnbmVkIElEKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJldHJpZXZlIGEgc2VsZWN0b3IgZnJvbSB0aGUgZ2l2ZW4gbW9kdWxlIHdpdGggaXRzIGxvY2FsIElECiAgIC8vLyBudW1iZXIuCkBAIC0xNzEzLDggKzE4MjgsOCBAQAogCiAgIFNlbGVjdG9yIERlY29kZVNlbGVjdG9yKHNlcmlhbGl6YXRpb246OlNlbGVjdG9ySUQgSWR4KTsKIAotICB2aXJ0dWFsIFNlbGVjdG9yIEdldEV4dGVybmFsU2VsZWN0b3Ioc2VyaWFsaXphdGlvbjo6U2VsZWN0b3JJRCBJRCk7Ci0gIHVpbnQzMl90IEdldE51bUV4dGVybmFsU2VsZWN0b3JzKCk7CisgIFNlbGVjdG9yIEdldEV4dGVybmFsU2VsZWN0b3Ioc2VyaWFsaXphdGlvbjo6U2VsZWN0b3JJRCBJRCkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IEdldE51bUV4dGVybmFsU2VsZWN0b3JzKCkgb3ZlcnJpZGU7CiAKICAgU2VsZWN0b3IgUmVhZFNlbGVjdG9yKE1vZHVsZUZpbGUgJk0sIGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgdW5zaWduZWQgJklkeCkgewogICAgIHJldHVybiBnZXRMb2NhbFNlbGVjdG9yKE0sIFJlY29yZFtJZHgrK10pOwpAQCAtMTgzMiw3ICsxOTQ3LDcgQEAKICAgICAgICAgICAgIlNob3VsZCBiZSBjYWxsZWQgb25seSBkdXJpbmcgc3RhdGVtZW50IHJlYWRpbmchIik7CiAgICAgLy8gU3ViZXhwcmVzc2lvbnMgYXJlIHN0b3JlZCBmcm9tIGxhc3QgdG8gZmlyc3QsIHNvIHRoZSBuZXh0IFN0bXQgd2UgbmVlZAogICAgIC8vIGlzIGF0IHRoZSBiYWNrIG9mIHRoZSBzdGFjay4KLSAgICBhc3NlcnQoIVN0bXRTdGFjay5lbXB0eSgpICYmICJSZWFkIHRvbyBtYW55IHN1YiBzdGF0ZW1lbnRzISIpOworICAgIGFzc2VydCghU3RtdFN0YWNrLmVtcHR5KCkgJiYgIlJlYWQgdG9vIG1hbnkgc3ViLXN0YXRlbWVudHMhIik7CiAgICAgcmV0dXJuIFN0bXRTdGFjay5wb3BfYmFja192YWwoKTsKICAgfQogCkBAIC0xODU1LDExICsxOTcwLDEwIEBACiAgIC8vLyBccGFyYW0gSUkgVGhlIG5hbWUgb2YgdGhlIG1hY3JvLgogICAvLy8gXHBhcmFtIE0gVGhlIG1vZHVsZSBmaWxlLgogICAvLy8gXHBhcmFtIEdNYWNJRCBUaGUgZ2xvYmFsIG1hY3JvIElEIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaWRlbnRpZmllci4KLSAgLy8vIFxwYXJhbSBJbXBvcnRMb2MgVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBtb2R1bGUgaXMgaW1wb3J0ZWQuCiAgIHZvaWQgYWRkUGVuZGluZ01hY3JvRnJvbU1vZHVsZShJZGVudGlmaWVySW5mbyAqSUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVGaWxlICpNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbjo6R2xvYmFsTWFjcm9JRCBHTWFjSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8c2VyaWFsaXphdGlvbjo6U3VibW9kdWxlSUQ+KTsKIAogICAvLy8gXGJyaWVmIEFkZCBhIG1hY3JvIHRvIGRlc2VyaWFsaXplIGl0cyBtYWNybyBkaXJlY3RpdmUgaGlzdG9yeSBmcm9tIGEgUENILgogICAvLy8KQEAgLTE4NzEsMTYgKzE5ODUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUZpbGUgKk0sIHVpbnQ2NF90IE1hY3JvRGlyZWN0aXZlc09mZnNldCk7CiAKICAgLy8vIFxicmllZiBSZWFkIHRoZSBzZXQgb2YgbWFjcm9zIGRlZmluZWQgYnkgdGhpcyBleHRlcm5hbCBtYWNybyBzb3VyY2UuCi0gIHZpcnR1YWwgdm9pZCBSZWFkRGVmaW5lZE1hY3JvcygpOworICB2b2lkIFJlYWREZWZpbmVkTWFjcm9zKCkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBVcGRhdGUgYW4gb3V0LW9mLWRhdGUgaWRlbnRpZmllci4KLSAgdmlydHVhbCB2b2lkIHVwZGF0ZU91dE9mRGF0ZUlkZW50aWZpZXIoSWRlbnRpZmllckluZm8gJklJKTsKKyAgdm9pZCB1cGRhdGVPdXRPZkRhdGVJZGVudGlmaWVyKElkZW50aWZpZXJJbmZvICZJSSkgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBOb3RlIHRoYXQgdGhpcyBpZGVudGlmaWVyIGlzIHVwLXRvLWRhdGUuCiAgIHZvaWQgbWFya0lkZW50aWZpZXJVcFRvRGF0ZShJZGVudGlmaWVySW5mbyAqSUkpOwogCiAgIC8vLyBcYnJpZWYgTG9hZCBhbGwgZXh0ZXJuYWwgdmlzaWJsZSBkZWNscyBpbiB0aGUgZ2l2ZW4gRGVjbENvbnRleHQuCi0gIHZvaWQgY29tcGxldGVWaXNpYmxlRGVjbHNNYXAoY29uc3QgRGVjbENvbnRleHQgKkRDKTsKKyAgdm9pZCBjb21wbGV0ZVZpc2libGVEZWNsc01hcChjb25zdCBEZWNsQ29udGV4dCAqREMpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIEFTVCBjb250ZXh0IHRoYXQgdGhpcyBBU1QgcmVhZGVyIHN1cHBsZW1lbnRzLgogICBBU1RDb250ZXh0ICZnZXRDb250ZXh0KCkgeyByZXR1cm4gQ29udGV4dDsgfQpAQCAtMTkxMSw4ICsyMDI1LDggQEAKICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGxsdm06OkJpdHN0cmVhbUN1cnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb246Ok1vZHVsZUZpbGUgKj4sIDg+IENvbW1lbnRzQ3Vyc29yczsKIAotICAvLy8gXGJyaWVmIExvYWRzIGNvbW1lbnRzIHJhbmdlcy4KLSAgdm9pZCBSZWFkQ29tbWVudHMoKTsKKyAgLy9SSURFcmllZiBMb2FkcyBjb21tZW50cyByYW5nZXMuCisgIHZvaWQgUmVhZENvbW1lbnRzKCkgb3ZlcnJpZGU7CiB9OwogCiAvLy8gXGJyaWVmIEhlbHBlciBjbGFzcyB0aGF0IHNhdmVzIHRoZSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiBhbmQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RXcml0ZXIuaCBiL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RXcml0ZXIuaAppbmRleCAwN2ZkZDA2Li40ZDkzYzFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vQVNUV3JpdGVyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0FTVFdyaXRlci5oCkBAIC0yNDYsMTAgKzI0NiwxMCBAQAogICAvLy8gQG5hbWUgRmx1c2hTdG10IENhY2hlcwogICAvLy8gQHsKIAotICAvLy8gXGJyaWVmIFNldCBvZiBwYXJlbnQgU3RtdHMgZm9yIHRoZSBjdXJyZW50bHkgc2VyaWFsaXppbmcgc3ViIHN0bXQuCisgIC8vLyBcYnJpZWYgU2V0IG9mIHBhcmVudCBTdG10cyBmb3IgdGhlIGN1cnJlbnRseSBzZXJpYWxpemluZyBzdWItc3RtdC4KICAgbGx2bTo6RGVuc2VTZXQ8U3RtdCAqPiBQYXJlbnRTdG10czsKIAotICAvLy8gXGJyaWVmIE9mZnNldHMgb2Ygc3ViIHN0bXRzIGFscmVhZHkgc2VyaWFsaXplZC4gVGhlIG9mZnNldCBwb2ludHMKKyAgLy8vIFxicmllZiBPZmZzZXRzIG9mIHN1Yi1zdG10cyBhbHJlYWR5IHNlcmlhbGl6ZWQuIFRoZSBvZmZzZXQgcG9pbnRzCiAgIC8vLyBqdXN0IGFmdGVyIHRoZSBzdG10IHJlY29yZC4KICAgbGx2bTo6RGVuc2VNYXA8U3RtdCAqLCB1aW50NjRfdD4gU3ViU3RtdEVudHJpZXM7CiAKQEAgLTI4Myw3ICsyODMsMzcgQEAKICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgTWFjcm9EZWZpbml0aW9uICosIHNlcmlhbGl6YXRpb246OlByZXByb2Nlc3NlZEVudGl0eUlEPgogICAgICAgTWFjcm9EZWZpbml0aW9uczsKIAotICB0eXBlZGVmIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCAyPiBVcGRhdGVSZWNvcmQ7CisgIC8vLyBBbiB1cGRhdGUgdG8gYSBEZWNsLgorICBjbGFzcyBEZWNsVXBkYXRlIHsKKyAgICAvLy8gQSBEZWNsVXBkYXRlS2luZC4KKyAgICB1bnNpZ25lZCBLaW5kOworICAgIHVuaW9uIHsKKyAgICAgIGNvbnN0IERlY2wgKkRjbDsKKyAgICAgIHZvaWQgKlR5cGU7CisgICAgICB1bnNpZ25lZCBMb2M7CisgICAgICB1bnNpZ25lZCBWYWw7CisgICAgfTsKKworICBwdWJsaWM6CisgICAgRGVjbFVwZGF0ZSh1bnNpZ25lZCBLaW5kKSA6IEtpbmQoS2luZCksIERjbCgwKSB7fQorICAgIERlY2xVcGRhdGUodW5zaWduZWQgS2luZCwgY29uc3QgRGVjbCAqRGNsKSA6IEtpbmQoS2luZCksIERjbChEY2wpIHt9CisgICAgRGVjbFVwZGF0ZSh1bnNpZ25lZCBLaW5kLCBRdWFsVHlwZSBUeXBlKQorICAgICAgICA6IEtpbmQoS2luZCksIFR5cGUoVHlwZS5nZXRBc09wYXF1ZVB0cigpKSB7fQorICAgIERlY2xVcGRhdGUodW5zaWduZWQgS2luZCwgU291cmNlTG9jYXRpb24gTG9jKQorICAgICAgICA6IEtpbmQoS2luZCksIExvYyhMb2MuZ2V0UmF3RW5jb2RpbmcoKSkge30KKyAgICBEZWNsVXBkYXRlKHVuc2lnbmVkIEtpbmQsIHVuc2lnbmVkIFZhbCkKKyAgICAgICAgOiBLaW5kKEtpbmQpLCBWYWwoVmFsKSB7fQorCisgICAgdW5zaWduZWQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKyAgICBjb25zdCBEZWNsICpnZXREZWNsKCkgY29uc3QgeyByZXR1cm4gRGNsOyB9CisgICAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFF1YWxUeXBlOjpnZXRGcm9tT3BhcXVlUHRyKFR5cGUpOyB9CisgICAgU291cmNlTG9jYXRpb24gZ2V0TG9jKCkgY29uc3QgeworICAgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoTG9jKTsKKyAgICB9CisgICAgdW5zaWduZWQgZ2V0TnVtYmVyKCkgY29uc3QgeyByZXR1cm4gVmFsOyB9CisgIH07CisKKyAgdHlwZWRlZiBTbWFsbFZlY3RvcjxEZWNsVXBkYXRlLCAxPiBVcGRhdGVSZWNvcmQ7CiAgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRGVjbCAqLCBVcGRhdGVSZWNvcmQ+IERlY2xVcGRhdGVNYXA7CiAgIC8vLyBcYnJpZWYgTWFwcGluZyBmcm9tIGRlY2xhcmF0aW9ucyB0aGF0IGNhbWUgZnJvbSBhIGNoYWluZWQgUENIIHRvIHRoZQogICAvLy8gcmVjb3JkIGNvbnRhaW5pbmcgbW9kaWZpY2F0aW9ucyB0byB0aGVtLgpAQCAtMjk3LDE2ICszMjcsMTUgQEAKICAgLy8vIFxicmllZiBEZWNsYXJhdGlvbnMgZW5jb3VudGVyZWQgdGhhdCBtaWdodCBiZSBleHRlcm5hbAogICAvLy8gZGVmaW5pdGlvbnMuCiAgIC8vLwotICAvLy8gV2Uga2VlcCB0cmFjayBvZiBleHRlcm5hbCBkZWZpbml0aW9ucyAoYXMgd2VsbCBhcyB0ZW50YXRpdmUKLSAgLy8vIGRlZmluaXRpb25zKSBhcyB3ZSBhcmUgZW1pdHRpbmcgZGVjbGFyYXRpb25zIHRvIHRoZSBBU1QKLSAgLy8vIGZpbGUuIFRoZSBBU1QgZmlsZSBjb250YWlucyBhIHNlcGFyYXRlIHJlY29yZCBmb3IgdGhlc2UgZXh0ZXJuYWwKLSAgLy8vIGRlZmluaXRpb25zLCB3aGljaCBhcmUgcHJvdmlkZWQgdG8gdGhlIEFTVCBjb25zdW1lciBieSB0aGUgQVNUCi0gIC8vLyByZWFkZXIuIFRoaXMgaXMgYmVoYXZpb3IgaXMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29wZSB3aXRoLAorICAvLy8gV2Uga2VlcCB0cmFjayBvZiBleHRlcm5hbCBkZWZpbml0aW9ucyBhbmQgb3RoZXIgJ2ludGVyZXN0aW5nJyBkZWNsYXJhdGlvbnMKKyAgLy8vIGFzIHdlIGFyZSBlbWl0dGluZyBkZWNsYXJhdGlvbnMgdG8gdGhlIEFTVCBmaWxlLiBUaGUgQVNUIGZpbGUgY29udGFpbnMgYQorICAvLy8gc2VwYXJhdGUgcmVjb3JkIGZvciB0aGVzZSBkZWNsYXJhdGlvbnMsIHdoaWNoIGFyZSBwcm92aWRlZCB0byB0aGUgQVNUCisgIC8vLyBjb25zdW1lciBieSB0aGUgQVNUIHJlYWRlci4gVGhpcyBpcyBiZWhhdmlvciBpcyByZXF1aXJlZCB0byBwcm9wZXJseSBjb3BlIHdpdGgsCiAgIC8vLyBlLmcuLCB0ZW50YXRpdmUgdmFyaWFibGUgZGVmaW5pdGlvbnMgdGhhdCBvY2N1ciB3aXRoaW4KICAgLy8vIGhlYWRlcnMuIFRoZSBkZWNsYXJhdGlvbnMgdGhlbXNlbHZlcyBhcmUgc3RvcmVkIGFzIGRlY2xhcmF0aW9uCi0gIC8vLyBJRHMsIHNpbmNlIHRoZXkgd2lsbCBiZSB3cml0dGVuIG91dCB0byBhbiBFWFRFUk5BTF9ERUZJTklUSU9OUworICAvLy8gSURzLCBzaW5jZSB0aGV5IHdpbGwgYmUgd3JpdHRlbiBvdXQgdG8gYW4gRUFHRVJMWV9ERVNFUklBTElaRURfREVDTFMKICAgLy8vIHJlY29yZC4KLSAgU21hbGxWZWN0b3I8dWludDY0X3QsIDE2PiBFeHRlcm5hbERlZmluaXRpb25zOworICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgMTY+IEVhZ2VybHlEZXNlcmlhbGl6ZWREZWNsczsKIAogICAvLy8gXGJyaWVmIERlY2xDb250ZXh0cyB0aGF0IGhhdmUgcmVjZWl2ZWQgZXh0ZW5zaW9ucyBzaW5jZSB0aGVpciBzZXJpYWxpemVkCiAgIC8vLyBmb3JtLgpAQCAtNDM4LDYgKzQ2Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01vZHVsZSk7CiAgIHZvaWQgV3JpdGVDWFhCYXNlU3BlY2lmaWVyc09mZnNldHMoKTsKICAgdm9pZCBXcml0ZVR5cGUoUXVhbFR5cGUgVCk7CisgIHVpbnQzMl90IEdlbmVyYXRlTmFtZUxvb2t1cFRhYmxlKGNvbnN0IERlY2xDb250ZXh0ICpEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+ICZMb29rdXBUYWJsZSk7CiAgIHVpbnQ2NF90IFdyaXRlRGVjbENvbnRleHRMZXhpY2FsQmxvY2soQVNUQ29udGV4dCAmQ29udGV4dCwgRGVjbENvbnRleHQgKkRDKTsKICAgdWludDY0X3QgV3JpdGVEZWNsQ29udGV4dFZpc2libGVCbG9jayhBU1RDb250ZXh0ICZDb250ZXh0LCBEZWNsQ29udGV4dCAqREMpOwogICB2b2lkIFdyaXRlVHlwZURlY2xPZmZzZXRzKCk7CkBAIC00NDgsOCArNDc5LDcgQEAKICAgdm9pZCBXcml0ZUlkZW50aWZpZXJUYWJsZShQcmVwcm9jZXNzb3IgJlBQLCBJZGVudGlmaWVyUmVzb2x2ZXIgJklkUmVzb2x2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc01vZHVsZSk7CiAgIHZvaWQgV3JpdGVBdHRyaWJ1dGVzKEFycmF5UmVmPGNvbnN0IEF0dHIqPiBBdHRycywgUmVjb3JkRGF0YUltcGwgJlJlY29yZCk7Ci0gIHZvaWQgUmVzb2x2ZURlY2xVcGRhdGVzQmxvY2tzKCk7Ci0gIHZvaWQgV3JpdGVEZWNsVXBkYXRlc0Jsb2NrcygpOworICB2b2lkIFdyaXRlRGVjbFVwZGF0ZXNCbG9ja3MoUmVjb3JkRGF0YUltcGwgJk9mZnNldHNSZWNvcmQpOwogICB2b2lkIFdyaXRlRGVjbFJlcGxhY2VtZW50c0Jsb2NrKCk7CiAgIHZvaWQgV3JpdGVEZWNsQ29udGV4dFZpc2libGVVcGRhdGUoY29uc3QgRGVjbENvbnRleHQgKkRDKTsKICAgdm9pZCBXcml0ZUZQUHJhZ21hT3B0aW9ucyhjb25zdCBGUE9wdGlvbnMgJk9wdHMpOwpAQCAtNDc1LDYgKzUwNSw3IEBACiAKICAgdm9pZCBXcml0ZURlY2xzQmxvY2tBYmJyZXZzKCk7CiAgIHZvaWQgV3JpdGVEZWNsKEFTVENvbnRleHQgJkNvbnRleHQsIERlY2wgKkQpOworICB2b2lkIEFkZEZ1bmN0aW9uRGVmaW5pdGlvbihjb25zdCBGdW5jdGlvbkRlY2wgKkZELCBSZWNvcmREYXRhICZSZWNvcmQpOwogCiAgIHZvaWQgV3JpdGVBU1RDb3JlKFNlbWEgJlNlbWFSZWYsCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBpc3lzcm9vdCwgY29uc3Qgc3RkOjpzdHJpbmcgJk91dHB1dEZpbGUsCkBAIC03MTUsMzUgKzc0NiwzNiBAQAogICBib29sIGhhc0NoYWluKCkgY29uc3QgeyByZXR1cm4gQ2hhaW47IH0KIAogICAvLyBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgotICB2b2lkIFJlYWRlckluaXRpYWxpemVkKEFTVFJlYWRlciAqUmVhZGVyKTsKLSAgdm9pZCBJZGVudGlmaWVyUmVhZChzZXJpYWxpemF0aW9uOjpJZGVudElEIElELCBJZGVudGlmaWVySW5mbyAqSUkpOwotICB2b2lkIE1hY3JvUmVhZChzZXJpYWxpemF0aW9uOjpNYWNyb0lEIElELCBNYWNyb0luZm8gKk1JKTsKLSAgdm9pZCBUeXBlUmVhZChzZXJpYWxpemF0aW9uOjpUeXBlSWR4IElkeCwgUXVhbFR5cGUgVCk7Ci0gIHZvaWQgU2VsZWN0b3JSZWFkKHNlcmlhbGl6YXRpb246OlNlbGVjdG9ySUQgSUQsIFNlbGVjdG9yIFNlbCk7CisgIHZvaWQgUmVhZGVySW5pdGlhbGl6ZWQoQVNUUmVhZGVyICpSZWFkZXIpIG92ZXJyaWRlOworICB2b2lkIElkZW50aWZpZXJSZWFkKHNlcmlhbGl6YXRpb246OklkZW50SUQgSUQsIElkZW50aWZpZXJJbmZvICpJSSkgb3ZlcnJpZGU7CisgIHZvaWQgTWFjcm9SZWFkKHNlcmlhbGl6YXRpb246Ok1hY3JvSUQgSUQsIE1hY3JvSW5mbyAqTUkpIG92ZXJyaWRlOworICB2b2lkIFR5cGVSZWFkKHNlcmlhbGl6YXRpb246OlR5cGVJZHggSWR4LCBRdWFsVHlwZSBUKSBvdmVycmlkZTsKKyAgdm9pZCBTZWxlY3RvclJlYWQoc2VyaWFsaXphdGlvbjo6U2VsZWN0b3JJRCBJRCwgU2VsZWN0b3IgU2VsKSBvdmVycmlkZTsKICAgdm9pZCBNYWNyb0RlZmluaXRpb25SZWFkKHNlcmlhbGl6YXRpb246OlByZXByb2Nlc3NlZEVudGl0eUlEIElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9EZWZpbml0aW9uICpNRCk7Ci0gIHZvaWQgTW9kdWxlUmVhZChzZXJpYWxpemF0aW9uOjpTdWJtb2R1bGVJRCBJRCwgTW9kdWxlICpNb2QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9EZWZpbml0aW9uICpNRCkgb3ZlcnJpZGU7CisgIHZvaWQgTW9kdWxlUmVhZChzZXJpYWxpemF0aW9uOjpTdWJtb2R1bGVJRCBJRCwgTW9kdWxlICpNb2QpIG92ZXJyaWRlOwogCiAgIC8vIEFTVE11dGF0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBDb21wbGV0ZWRUYWdEZWZpbml0aW9uKGNvbnN0IFRhZ0RlY2wgKkQpOwotICB2aXJ0dWFsIHZvaWQgQWRkZWRWaXNpYmxlRGVjbChjb25zdCBEZWNsQ29udGV4dCAqREMsIGNvbnN0IERlY2wgKkQpOwotICB2aXJ0dWFsIHZvaWQgQWRkZWRDWFhJbXBsaWNpdE1lbWJlcihjb25zdCBDWFhSZWNvcmREZWNsICpSRCwgY29uc3QgRGVjbCAqRCk7Ci0gIHZpcnR1YWwgdm9pZCBBZGRlZENYWFRlbXBsYXRlU3BlY2lhbGl6YXRpb24oY29uc3QgQ2xhc3NUZW1wbGF0ZURlY2wgKlRELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqRCk7Ci0gIHZpcnR1YWwgdm9pZAotICBBZGRlZENYWFRlbXBsYXRlU3BlY2lhbGl6YXRpb24oY29uc3QgVmFyVGVtcGxhdGVEZWNsICpURCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpEKTsKLSAgdmlydHVhbCB2b2lkIEFkZGVkQ1hYVGVtcGxhdGVTcGVjaWFsaXphdGlvbihjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqVEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpEKTsKLSAgdmlydHVhbCB2b2lkIERlZHVjZWRSZXR1cm5UeXBlKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQsIFF1YWxUeXBlIFJldHVyblR5cGUpOwotICB2aXJ0dWFsIHZvaWQgQ29tcGxldGVkSW1wbGljaXREZWZpbml0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCk7Ci0gIHZpcnR1YWwgdm9pZCBTdGF0aWNEYXRhTWVtYmVySW5zdGFudGlhdGVkKGNvbnN0IFZhckRlY2wgKkQpOwotICB2aXJ0dWFsIHZvaWQgQWRkZWRPYmpDQ2F0ZWdvcnlUb0ludGVyZmFjZShjb25zdCBPYmpDQ2F0ZWdvcnlEZWNsICpDYXRELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUZEKTsKLSAgdmlydHVhbCB2b2lkIEFkZGVkT2JqQ1Byb3BlcnR5SW5DbGFzc0V4dGVuc2lvbihjb25zdCBPYmpDUHJvcGVydHlEZWNsICpQcm9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICpPcmlnUHJvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0NhdGVnb3J5RGVjbCAqQ2xhc3NFeHQpOwotICB2b2lkIERlY2xhcmF0aW9uTWFya2VkVXNlZChjb25zdCBEZWNsICpEKSBMTFZNX09WRVJSSURFOworICB2b2lkIENvbXBsZXRlZFRhZ0RlZmluaXRpb24oY29uc3QgVGFnRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgQWRkZWRWaXNpYmxlRGVjbChjb25zdCBEZWNsQ29udGV4dCAqREMsIGNvbnN0IERlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEFkZGVkQ1hYSW1wbGljaXRNZW1iZXIoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsIGNvbnN0IERlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEFkZGVkQ1hYVGVtcGxhdGVTcGVjaWFsaXphdGlvbihjb25zdCBDbGFzc1RlbXBsYXRlRGVjbCAqVEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEFkZGVkQ1hYVGVtcGxhdGVTcGVjaWFsaXphdGlvbihjb25zdCBWYXJUZW1wbGF0ZURlY2wgKlRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpEKSBvdmVycmlkZTsKKyAgdm9pZCBBZGRlZENYWFRlbXBsYXRlU3BlY2lhbGl6YXRpb24oY29uc3QgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKlRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIFJlc29sdmVkRXhjZXB0aW9uU3BlYyhjb25zdCBGdW5jdGlvbkRlY2wgKkZEKSBvdmVycmlkZTsKKyAgdm9pZCBEZWR1Y2VkUmV0dXJuVHlwZShjb25zdCBGdW5jdGlvbkRlY2wgKkZELCBRdWFsVHlwZSBSZXR1cm5UeXBlKSBvdmVycmlkZTsKKyAgdm9pZCBDb21wbGV0ZWRJbXBsaWNpdERlZmluaXRpb24oY29uc3QgRnVuY3Rpb25EZWNsICpEKSBvdmVycmlkZTsKKyAgdm9pZCBTdGF0aWNEYXRhTWVtYmVySW5zdGFudGlhdGVkKGNvbnN0IFZhckRlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEZ1bmN0aW9uRGVmaW5pdGlvbkluc3RhbnRpYXRlZChjb25zdCBGdW5jdGlvbkRlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEFkZGVkT2JqQ0NhdGVnb3J5VG9JbnRlcmZhY2UoY29uc3QgT2JqQ0NhdGVnb3J5RGVjbCAqQ2F0RCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRkQpIG92ZXJyaWRlOworICB2b2lkIEFkZGVkT2JqQ1Byb3BlcnR5SW5DbGFzc0V4dGVuc2lvbihjb25zdCBPYmpDUHJvcGVydHlEZWNsICpQcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqT3JpZ1Byb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDQ2F0ZWdvcnlEZWNsICpDbGFzc0V4dCkgb3ZlcnJpZGU7CisgIHZvaWQgRGVjbGFyYXRpb25NYXJrZWRVc2VkKGNvbnN0IERlY2wgKkQpIG92ZXJyaWRlOwogfTsKIAogLy8vIFxicmllZiBBU1QgYW5kIHNlbWFudGljLWFuYWx5c2lzIGNvbnN1bWVyIHRoYXQgZ2VuZXJhdGVzIGEKQEAgLTc3MSwxMCArODAzLDEwIEBACiAgICAgICAgICAgICAgICBTdHJpbmdSZWYgaXN5c3Jvb3QsIHJhd19vc3RyZWFtICpPdXQsCiAgICAgICAgICAgICAgICBib29sIEFsbG93QVNUV2l0aEVycm9ycyA9IGZhbHNlKTsKICAgflBDSEdlbmVyYXRvcigpOwotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZVNlbWEoU2VtYSAmUykgeyBTZW1hUHRyID0gJlM7IH0KLSAgdmlydHVhbCB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDdHgpOwotICB2aXJ0dWFsIEFTVE11dGF0aW9uTGlzdGVuZXIgKkdldEFTVE11dGF0aW9uTGlzdGVuZXIoKTsKLSAgdmlydHVhbCBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lciAqR2V0QVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIoKTsKKyAgdm9pZCBJbml0aWFsaXplU2VtYShTZW1hICZTKSBvdmVycmlkZSB7IFNlbWFQdHIgPSAmUzsgfQorICB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDdHgpIG92ZXJyaWRlOworICBBU1RNdXRhdGlvbkxpc3RlbmVyICpHZXRBU1RNdXRhdGlvbkxpc3RlbmVyKCkgb3ZlcnJpZGU7CisgIEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyICpHZXRBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lcigpIG92ZXJyaWRlOwogCiAgIGJvb2wgaGFzRW1pdHRlZFBDSCgpIGNvbnN0IHsgcmV0dXJuIEhhc0VtaXR0ZWRQQ0g7IH0KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vR2xvYmFsTW9kdWxlSW5kZXguaCBiL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9HbG9iYWxNb2R1bGVJbmRleC5oCmluZGV4IDc2NDE0YmEuLjBkOTgzNWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9HbG9iYWxNb2R1bGVJbmRleC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9HbG9iYWxNb2R1bGVJbmRleC5oCkBAIC0xNywxMSArMTcsMTEgQEAKICNkZWZpbmUgTExWTV9DTEFOR19TRVJJQUxJWkFUSU9OX0dMT0JBTF9NT0RVTEVfSU5ERVhfSAogCiAjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKIG5hbWVzcGFjZSBsbHZtIHsKQEAgLTU5LDcgKzU5LDcgQEAKIGNsYXNzIEdsb2JhbE1vZHVsZUluZGV4IHsKICAgLy8vIFxicmllZiBCdWZmZXIgY29udGFpbmluZyB0aGUgaW5kZXggZmlsZSwgd2hpY2ggaXMgbGF6aWx5IGFjY2Vzc2VkIHNvIGxvbmcKICAgLy8vIGFzIHRoZSBnbG9iYWwgbW9kdWxlIGluZGV4IGlzIGxpdmUuCi0gIGxsdm06Ok93bmluZ1B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IEJ1ZmZlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyOwogCiAgIC8vLyBcYnJpZWYgVGhlIGhhc2ggdGFibGUuCiAgIC8vLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL01vZHVsZS5oIGIvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL01vZHVsZS5oCmluZGV4IDg5YzYwNGYuLjQ2OTc4NWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9Nb2R1bGUuaAorKysgYi9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vTW9kdWxlLmgKQEAgLTE4LDkgKzE4LDkgQEAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgogI2luY2x1ZGUgImNsYW5nL1NlcmlhbGl6YXRpb24vQVNUQml0Q29kZXMuaCIKICNpbmNsdWRlICJjbGFuZy9TZXJpYWxpemF0aW9uL0NvbnRpbnVvdXNSYW5nZU1hcC5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgogI2luY2x1ZGUgImxsdm0vQml0Y29kZS9CaXRzdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgY2xhbmcgewpAQCAtNTcsMTEgKzU3LDEyIEBACiAKIC8vLyBcYnJpZWYgVGhlIGlucHV0IGZpbGUgdGhhdCBoYXMgYmVlbiBsb2FkZWQgZnJvbSB0aGlzIEFTVCBmaWxlLCBhbG9uZyB3aXRoCiAvLy8gYm9vbHMgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgd2FzIGFuIG92ZXJyaWRkZW4gYnVmZmVyIG9yIGlmIGl0IHdhcwotLy8vIG91dC1vZi1kYXRlLgorLy8vIG91dC1vZi1kYXRlIG9yIG5vdC1mb3VuZC4KIGNsYXNzIElucHV0RmlsZSB7CiAgIGVudW0gewogICAgIE92ZXJyaWRkZW4gPSAxLAotICAgIE91dE9mRGF0ZSA9IDIKKyAgICBPdXRPZkRhdGUgPSAyLAorICAgIE5vdEZvdW5kID0gMwogICB9OwogICBsbHZtOjpQb2ludGVySW50UGFpcjxjb25zdCBGaWxlRW50cnkgKiwgMiwgdW5zaWduZWQ+IFZhbDsKIApAQCAtNzksOSArODAsMTYgQEAKICAgICBWYWwuc2V0UG9pbnRlckFuZEludChGaWxlLCBpbnRWYWwpOwogICB9CiAKKyAgc3RhdGljIElucHV0RmlsZSBnZXROb3RGb3VuZCgpIHsKKyAgICBJbnB1dEZpbGUgRmlsZTsKKyAgICBGaWxlLlZhbC5zZXRJbnQoTm90Rm91bmQpOworICAgIHJldHVybiBGaWxlOworICB9CisKICAgY29uc3QgRmlsZUVudHJ5ICpnZXRGaWxlKCkgY29uc3QgeyByZXR1cm4gVmFsLmdldFBvaW50ZXIoKTsgfQogICBib29sIGlzT3ZlcnJpZGRlbigpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRJbnQoKSA9PSBPdmVycmlkZGVuOyB9CiAgIGJvb2wgaXNPdXRPZkRhdGUoKSBjb25zdCB7IHJldHVybiBWYWwuZ2V0SW50KCkgPT0gT3V0T2ZEYXRlOyB9CisgIGJvb2wgaXNOb3RGb3VuZCgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRJbnQoKSA9PSBOb3RGb3VuZDsgfQogfTsKIAogLy8vIFxicmllZiBJbmZvcm1hdGlvbiBhYm91dCBhIG1vZHVsZSB0aGF0IGhhcyBiZWVuIGxvYWRlZCBieSB0aGUgQVNUUmVhZGVyLgpAQCAtMTA3LDYgKzExNSwxMCBAQAogICAvLy8gXGJyaWVmIFRoZSBmaWxlIG5hbWUgb2YgdGhlIG1vZHVsZSBmaWxlLgogICBzdGQ6OnN0cmluZyBGaWxlTmFtZTsKIAorICBzdGQ6OnN0cmluZyBnZXRUaW1lc3RhbXBGaWxlbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRmlsZU5hbWUgKyAiLnRpbWVzdGFtcCI7CisgIH0KKwogICAvLy8gXGJyaWVmIFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBuYW1lIHRoYXQgd2FzIHVzZWQgdG8gYnVpbGQgdGhlCiAgIC8vLyBwcmltYXJ5IEFTVCBmaWxlLCB3aGljaCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGZvcgogICAvLy8gcmVsb2NhdGFibGUtcGNoIHN1cHBvcnQuCkBAIC0xMzksNyArMTUxLDcgQEAKICAgCiAgIC8vLyBcYnJpZWYgVGhlIG1lbW9yeSBidWZmZXIgdGhhdCBzdG9yZXMgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoCiAgIC8vLyB0aGlzIEFTVCBmaWxlLgotICBPd25pbmdQdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBCdWZmZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IEJ1ZmZlcjsKIAogICAvLy8gXGJyaWVmIFRoZSBzaXplIG9mIHRoaXMgZmlsZSwgaW4gYml0cy4KICAgdWludDY0X3QgU2l6ZUluQml0czsKQEAgLTE1OSw2ICsxNzEsOSBAQAogICAvLy8gSWYgbW9kdWxlIEEgZGVwZW5kcyBvbiBhbmQgaW1wb3J0cyBtb2R1bGUgQiwgYm90aCBtb2R1bGVzIHdpbGwgaGF2ZSB0aGUKICAgLy8vIHNhbWUgRGlyZWN0SW1wb3J0TG9jLCBidXQgZGlmZmVyZW50IEltcG9ydExvYyAoQidzIEltcG9ydExvYyB3aWxsIGJlIGEKICAgLy8vIHNvdXJjZSBsb2NhdGlvbiBpbnNpZGUgbW9kdWxlIEEpLgorICAvLy8KKyAgLy8vIFdBUk5JTkc6IFRoaXMgaXMgbGFyZ2VseSB1c2VsZXNzLiBJdCBkb2Vzbid0IHRlbGwgeW91IHdoZW4gYSBtb2R1bGUgd2FzCisgIC8vLyBtYWRlIHZpc2libGUsIGp1c3Qgd2hlbiB0aGUgZmlyc3Qgc3VibW9kdWxlIG9mIHRoYXQgbW9kdWxlIHdhcyBpbXBvcnRlZC4KICAgU291cmNlTG9jYXRpb24gRGlyZWN0SW1wb3J0TG9jOwogCiAgIC8vLyBcYnJpZWYgVGhlIHNvdXJjZSBsb2NhdGlvbiB3aGVyZSB0aGlzIG1vZHVsZSB3YXMgZmlyc3QgaW1wb3J0ZWQuCkBAIC0xNzcsNiArMTkyLDEyIEBACiAgIC8vLyBcYnJpZWYgVGhlIGlucHV0IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBmcm9tIHRoaXMgQVNUIGZpbGUuCiAgIHN0ZDo6dmVjdG9yPElucHV0RmlsZT4gSW5wdXRGaWxlc0xvYWRlZDsKIAorICAvLy8gXGJyaWVmIElmIG5vbi16ZXJvLCBzcGVjaWZpZXMgdGhlIHRpbWUgd2hlbiB3ZSBsYXN0IHZhbGlkYXRlZCBpbnB1dAorICAvLy8gZmlsZXMuICBaZXJvIG1lYW5zIHdlIG5ldmVyIHZhbGlkYXRlZCB0aGVtLgorICAvLy8KKyAgLy8vIFRoZSB0aW1lIGlzIHNwZWNpZmllZCBpbiBzZWNvbmRzIHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgRXBvY2guCisgIHVpbnQ2NF90IElucHV0RmlsZXNWYWxpZGF0aW9uVGltZXN0YW1wOworCiAgIC8vID09PSBTb3VyY2UgTG9jYXRpb25zID09PQogCiAgIC8vLyBcYnJpZWYgQ3Vyc29yIHVzZWQgdG8gcmVhZCBzb3VyY2UgbG9jYXRpb24gZW50cmllcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvT2JqQ1JldGFpbkNvdW50LmggYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL09iakNSZXRhaW5Db3VudC5oCmluZGV4IDU5NzgyOTkuLjUwN2MyNjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvT2JqQ1JldGFpbkNvdW50LmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDUmV0YWluQ291bnQuaApAQCAtMTE0LDggKzExNCw2IEBACiAgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgaXMgbm90IG93bmVkIGFuZCBjb250cm9sbGVkIGJ5IHRoZQogICAgIC8vLyBHYXJiYWdlIGNvbGxlY3Rvci4KICAgICBHQ05vdE93bmVkU3ltYm9sLAotICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgb2JqZWN0IGlzIG5vdCBvd25lZCBhbmQgY29udHJvbGxlZCBieSBBUkMuCi0gICAgQVJDTm90T3duZWRTeW1ib2wsCiAgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgYW4gb3duZWQgb2JqZWN0IHdoZW4gdGhlCiAgICAgLy8vIHJlY2VpdmVyIGlzIGFsc28gYSB0cmFja2VkIG9iamVjdC4KICAgICBPd25lZFdoZW5UcmFja2VkUmVjZWl2ZXIsCkBAIC0xNTQsNyArMTUyLDcgQEAKICAgfQogICAKICAgYm9vbCBub3RPd25lZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gSyA9PSBOb3RPd25lZFN5bWJvbCB8fCBLID09IEFSQ05vdE93bmVkU3ltYm9sOworICAgIHJldHVybiBLID09IE5vdE93bmVkU3ltYm9sOwogICB9CiAgIAogICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmV0RWZmZWN0ICZPdGhlcikgY29uc3QgewpAQCAtMTc0LDkgKzE3Miw2IEBACiAgIHN0YXRpYyBSZXRFZmZlY3QgTWFrZUdDTm90T3duZWQoKSB7CiAgICAgcmV0dXJuIFJldEVmZmVjdChHQ05vdE93bmVkU3ltYm9sLCBPYmpDKTsKICAgfQotICBzdGF0aWMgUmV0RWZmZWN0IE1ha2VBUkNOb3RPd25lZCgpIHsKLSAgICByZXR1cm4gUmV0RWZmZWN0KEFSQ05vdE93bmVkU3ltYm9sLCBPYmpDKTsKLSAgfQogICBzdGF0aWMgUmV0RWZmZWN0IE1ha2VOb1JldCgpIHsKICAgICByZXR1cm4gUmV0RWZmZWN0KE5vUmV0KTsKICAgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5emVyT3B0aW9ucy5oIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5emVyT3B0aW9ucy5oCmluZGV4IDYxODc4MmUuLjQyYjZjYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9BbmFseXplck9wdGlvbnMuaAorKysgYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQW5hbHl6ZXJPcHRpb25zLmgKQEAgLTU0LDYgKzU0LDcgQEAKIGVudW0gQW5hbHlzaXNEaWFnQ2xpZW50cyB7CiAjZGVmaW5lIEFOQUxZU0lTX0RJQUdOT1NUSUNTKE5BTUUsIENNREZMQUcsIERFU0MsIENSRUFURk4pIFBEXyMjTkFNRSwKICNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5c2VzLmRlZiIKK1BEX05PTkUsCiBOVU1fQU5BTFlTSVNfRElBR19DTElFTlRTCiB9OwogCkBAIC0xOTgsNiArMTk5LDkgQEAKICAgLy8vIFxzYSBtYXlJbmxpbmVUZW1wbGF0ZUZ1bmN0aW9ucwogICBPcHRpb25hbDxib29sPiBJbmxpbmVUZW1wbGF0ZUZ1bmN0aW9uczsKIAorICAvLy8gXHNhIG1heUlubGluZUNYWEFsbG9jYXRvcgorICBPcHRpb25hbDxib29sPiBJbmxpbmVDWFhBbGxvY2F0b3I7CisKICAgLy8vIFxzYSBtYXlJbmxpbmVDWFhDb250YWluZXJDdG9yc0FuZER0b3JzCiAgIE9wdGlvbmFsPGJvb2w+IElubGluZUNYWENvbnRhaW5lckN0b3JzQW5kRHRvcnM7CiAKQEAgLTI5MCw2ICsyOTQsMTIgQEAKICAgLy8vIGFjY2VwdHMgdGhlIHZhbHVlcyAidHJ1ZSIgYW5kICJmYWxzZSIuCiAgIGJvb2wgbWF5SW5saW5lVGVtcGxhdGVGdW5jdGlvbnMoKTsKIAorICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhbGxvY2F0b3IgY2FsbCBtYXkgYmUgY29uc2lkZXJlZCBmb3IgaW5saW5pbmcuCisgIC8vLworICAvLy8gVGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSAnYysrLWFsbG9jYXRvci1pbmxpbmluZycgY29uZmlnIG9wdGlvbiwgd2hpY2gKKyAgLy8vIGFjY2VwdHMgdGhlIHZhbHVlcyAidHJ1ZSIgYW5kICJmYWxzZSIuCisgIGJvb2wgbWF5SW5saW5lQ1hYQWxsb2NhdG9yKCk7CisKICAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3QgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBvZiBDKysgY29udGFpbmVyCiAgIC8vLyBvYmplY3RzIG1heSBiZSBjb25zaWRlcmVkIGZvciBpbmxpbmluZy4KICAgLy8vCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvQnVnUmVwb3J0ZXIuaCBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdSZXBvcnRlci5oCmluZGV4IDk1ODRiOGIuLmNjYmM0N2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdSZXBvcnRlci5oCisrKyBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdSZXBvcnRlci5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9BbmFseXplck9wdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL0J1Z1JlcG9ydGVyVmlzaXRvci5oIgogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvUGF0aERpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0NoZWNrZXJNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZS5oIgogI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgpAQCAtNDYzLDcgKzQ2NCwxMiBAQAogICAvLy8gcmVwb3J0cy4KICAgdm9pZCBlbWl0UmVwb3J0KEJ1Z1JlcG9ydCAqUik7CiAKLSAgdm9pZCBFbWl0QmFzaWNSZXBvcnQoY29uc3QgRGVjbCAqRGVjbFdpdGhJc3N1ZSwKKyAgdm9pZCBFbWl0QmFzaWNSZXBvcnQoY29uc3QgRGVjbCAqRGVjbFdpdGhJc3N1ZSwgY29uc3QgQ2hlY2tlckJhc2UgKkNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCdWdOYW1lLCBTdHJpbmdSZWYgQnVnQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBCdWdTdHIsIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VSYW5nZT4gUmFuZ2VzID0gTm9uZSk7CisKKyAgdm9pZCBFbWl0QmFzaWNSZXBvcnQoY29uc3QgRGVjbCAqRGVjbFdpdGhJc3N1ZSwgQ2hlY2tOYW1lIENoZWNrTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEJ1Z05hbWUsIFN0cmluZ1JlZiBCdWdDYXRlZ29yeSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEJ1Z1N0ciwgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZVJhbmdlPiBSYW5nZXMgPSBOb25lKTsKQEAgLTQ3Myw3ICs0NzksOCBAQAogCiAgIC8vLyBcYnJpZWYgUmV0dXJucyBhIEJ1Z1R5cGUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kCiAgIC8vLyBjYXRlZ29yeS4KLSAgQnVnVHlwZSAqZ2V0QnVnVHlwZUZvck5hbWUoU3RyaW5nUmVmIG5hbWUsIFN0cmluZ1JlZiBjYXRlZ29yeSk7CisgIEJ1Z1R5cGUgKmdldEJ1Z1R5cGVGb3JOYW1lKENoZWNrTmFtZSBDaGVja05hbWUsIFN0cmluZ1JlZiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgY2F0ZWdvcnkpOwogfTsKIAogLy8gRklYTUU6IEdldCByaWQgb2YgR1JCdWdSZXBvcnRlci4gIEl0J3MgdGhlIHdyb25nIGFic3RyYWN0aW9uLgpAQCAtNTA1LDkgKzUxMiw4IEBACiAgIC8vLwogICAvLy8gXHJldHVybiBUcnVlIGlmIHRoZSByZXBvcnQgd2FzIHZhbGlkIGFuZCBhIHBhdGggd2FzIGdlbmVyYXRlZCwKICAgLy8vICAgICAgICAgZmFsc2UgaWYgdGhlIHJlcG9ydHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW52YWxpZC4KLSAgdmlydHVhbCBib29sIGdlbmVyYXRlUGF0aERpYWdub3N0aWMoUGF0aERpYWdub3N0aWMgJlBELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoRGlhZ25vc3RpY0NvbnN1bWVyICZQQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8QnVnUmVwb3J0Kj4gJmJ1Z1JlcG9ydHMpOworICBib29sIGdlbmVyYXRlUGF0aERpYWdub3N0aWMoUGF0aERpYWdub3N0aWMgJlBELCBQYXRoRGlhZ25vc3RpY0NvbnN1bWVyICZQQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEJ1Z1JlcG9ydCo+ICZidWdSZXBvcnRzKSBvdmVycmlkZTsKIAogICAvLy8gY2xhc3NvZiAtIFVzZWQgYnkgaXNhPD4sIGNhc3Q8PiwgYW5kIGR5bl9jYXN0PD4uCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQnVnUmVwb3J0ZXIqIFIpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdSZXBvcnRlclZpc2l0b3IuaCBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdSZXBvcnRlclZpc2l0b3IuaAppbmRleCAyZTY3MTgwLi4zMDJlMGY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvQnVnUmVwb3J0ZXJWaXNpdG9yLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL0J1Z1JlcG9ydGVyVmlzaXRvci5oCkBAIC04OSw3ICs4OSw3IEBACiAvLy8gd2lsbCBoYXZlIHRvIHByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50YXRpb24uKQogdGVtcGxhdGUgPGNsYXNzIERFUklWRUQ+CiBjbGFzcyBCdWdSZXBvcnRlclZpc2l0b3JJbXBsIDogcHVibGljIEJ1Z1JlcG9ydGVyVmlzaXRvciB7Ci0gIHZpcnR1YWwgQnVnUmVwb3J0ZXJWaXNpdG9yICpjbG9uZSgpIGNvbnN0IHsKKyAgQnVnUmVwb3J0ZXJWaXNpdG9yICpjbG9uZSgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gbmV3IERFUklWRUQoKnN0YXRpY19jYXN0PGNvbnN0IERFUklWRUQgKj4odGhpcykpOwogICB9CiB9OwpAQCAtMTE4LDEyICsxMTgsMTIgQEAKICAgICBTYXRpc2ZpZWQoZmFsc2UpLAogICAgIEVuYWJsZU51bGxGUFN1cHByZXNzaW9uKEluRW5hYmxlTnVsbEZQU3VwcHJlc3Npb24pIHt9CiAKLSAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZTsKIAogICBQYXRoRGlhZ25vc3RpY1BpZWNlICpWaXNpdE5vZGUoY29uc3QgRXhwbG9kZWROb2RlICpOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpQcmV2TiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIFRyYWNrQ29uc3RyYWludEJSVmlzaXRvcgpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgSXNaZXJvQ2hlY2soIUFzc3VtcHRpb24gJiYgQ29uc3RyYWludC5nZXRBczxMb2M+KCkpLAogICAgIElzVHJhY2tpbmdUdXJuZWRPbihmYWxzZSkge30KIAotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vLyBSZXR1cm4gdGhlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyB2aXNpdG9yLiAgVGhpcyB0YWcgd2lsbCBiZSB1c2VkCiAgIC8vLyB0byBtYWtlIGFsbCBQYXRoRGlhZ25vc3RpY1BpZWNlcyBjcmVhdGVkIGJ5IHRoaXMgdmlzaXRvci4KQEAgLTE1Myw3ICsxNTMsNyBAQAogICBQYXRoRGlhZ25vc3RpY1BpZWNlICpWaXNpdE5vZGUoY29uc3QgRXhwbG9kZWROb2RlICpOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpQcmV2TiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgLy8vIENoZWNrcyBpZiB0aGUgY29uc3RyYWludCBpcyB2YWxpZCBpbiB0aGUgY3VycmVudCBzdGF0ZS4KQEAgLTE2Niw4ICsxNjYsOCBAQAogY2xhc3MgTmlsUmVjZWl2ZXJCUlZpc2l0b3IKICAgOiBwdWJsaWMgQnVnUmVwb3J0ZXJWaXNpdG9ySW1wbDxOaWxSZWNlaXZlckJSVmlzaXRvcj4gewogcHVibGljOgotICAKLSAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZSB7CiAgICAgc3RhdGljIGludCB4ID0gMDsKICAgICBJRC5BZGRQb2ludGVyKCZ4KTsKICAgfQpAQCAtMTc1LDcgKzE3NSw3IEBACiAgIFBhdGhEaWFnbm9zdGljUGllY2UgKlZpc2l0Tm9kZShjb25zdCBFeHBsb2RlZE5vZGUgKk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKlByZXZOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIG92ZXJyaWRlOwogCiAgIC8vLyBJZiB0aGUgc3RhdGVtZW50IGlzIGEgbWVzc2FnZSBzZW5kIGV4cHJlc3Npb24gd2l0aCBuaWwgcmVjZWl2ZXIsIHJldHVybnMKICAgLy8vIHRoZSByZWNlaXZlciBleHByZXNzaW9uLiBSZXR1cm5zIE5VTEwgb3RoZXJ3aXNlLgpAQCAtMTg1LDcgKzE4NSw3IEBACiAvLy8gVmlzaXRvciB0aGF0IHRyaWVzIHRvIHJlcG9ydCBpbnRlcmVzdGluZyBkaWFnbm9zdGljcyBmcm9tIGNvbmRpdGlvbnMuCiBjbGFzcyBDb25kaXRpb25CUlZpc2l0b3IgOiBwdWJsaWMgQnVnUmVwb3J0ZXJWaXNpdG9ySW1wbDxDb25kaXRpb25CUlZpc2l0b3I+IHsKIHB1YmxpYzoKLSAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgIG92ZXJyaWRlewogICAgIHN0YXRpYyBpbnQgeCA9IDA7CiAgICAgSUQuQWRkUG9pbnRlcigmeCk7CiAgIH0KQEAgLTE5MywxMSArMTkzLDExIEBACiAgIC8vLyBSZXR1cm4gdGhlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyB2aXNpdG9yLiAgVGhpcyB0YWcgd2lsbCBiZSB1c2VkCiAgIC8vLyB0byBtYWtlIGFsbCBQYXRoRGlhZ25vc3RpY1BpZWNlcyBjcmVhdGVkIGJ5IHRoaXMgdmlzaXRvci4KICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFRhZygpOwotICAKLSAgdmlydHVhbCBQYXRoRGlhZ25vc3RpY1BpZWNlICpWaXNpdE5vZGUoY29uc3QgRXhwbG9kZWROb2RlICpOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKlByZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKTsKKworICBQYXRoRGlhZ25vc3RpY1BpZWNlICpWaXNpdE5vZGUoY29uc3QgRXhwbG9kZWROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpQcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKSBvdmVycmlkZTsKIAogICBQYXRoRGlhZ25vc3RpY1BpZWNlICpWaXNpdE5vZGVJbXBsKGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKlByZXYsCkBAIC0yNTcsMjAgKzI1NywyMCBAQAogICAgIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkICo+KCZUYWcpOwogICB9CiAKLSAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIElELkFkZFBvaW50ZXIoZ2V0VGFnKCkpOwogICB9CiAKLSAgdmlydHVhbCBQYXRoRGlhZ25vc3RpY1BpZWNlICpWaXNpdE5vZGUoY29uc3QgRXhwbG9kZWROb2RlICpOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKlByZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKSB7CisgIFBhdGhEaWFnbm9zdGljUGllY2UgKlZpc2l0Tm9kZShjb25zdCBFeHBsb2RlZE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKlByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlckNvbnRleHQgJkJSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIHZpcnR1YWwgUGF0aERpYWdub3N0aWNQaWVjZSAqZ2V0RW5kUGF0aChCdWdSZXBvcnRlckNvbnRleHQgJkJSQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpOworICBQYXRoRGlhZ25vc3RpY1BpZWNlICpnZXRFbmRQYXRoKEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKSBvdmVycmlkZTsKIH07CiAKIC8vLyBcYnJpZWYgV2hlbiBhIHJlZ2lvbiBjb250YWluaW5nIHVuZGVmaW5lZCB2YWx1ZSBvciAnMCcgdmFsdWUgaXMgcGFzc2VkIApAQCAtMjg3LDcgKzI4Nyw3IEBACiBwdWJsaWM6CiAgIFVuZGVmT3JOdWxsQXJnVmlzaXRvcihjb25zdCBNZW1SZWdpb24gKkluUikgOiBSKEluUikge30KIAotICB2aXJ0dWFsIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgeworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBzdGF0aWMgaW50IFRhZyA9IDA7CiAgICAgSUQuQWRkUG9pbnRlcigmVGFnKTsKICAgICBJRC5BZGRQb2ludGVyKFIpOwpAQCAtMjk2LDcgKzI5Niw3IEBACiAgIFBhdGhEaWFnbm9zdGljUGllY2UgKlZpc2l0Tm9kZShjb25zdCBFeHBsb2RlZE5vZGUgKk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKlByZXZOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgU3VwcHJlc3NJbmxpbmVEZWZlbnNpdmVDaGVja3NWaXNpdG9yCkBAIC0zMTksNyArMzE5LDcgQEAKIHB1YmxpYzoKICAgU3VwcHJlc3NJbmxpbmVEZWZlbnNpdmVDaGVja3NWaXNpdG9yKERlZmluZWRTVmFsIFZhbCwgY29uc3QgRXhwbG9kZWROb2RlICpOKTsKIAotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vLyBSZXR1cm4gdGhlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyB2aXNpdG9yLiAgVGhpcyB0YWcgd2lsbCBiZSB1c2VkCiAgIC8vLyB0byBtYWtlIGFsbCBQYXRoRGlhZ25vc3RpY1BpZWNlcyBjcmVhdGVkIGJ5IHRoaXMgdmlzaXRvci4KQEAgLTMyOCw3ICszMjgsNyBAQAogICBQYXRoRGlhZ25vc3RpY1BpZWNlICpWaXNpdE5vZGUoY29uc3QgRXhwbG9kZWROb2RlICpTdWNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpQcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIG92ZXJyaWRlOwogfTsKIAogbmFtZXNwYWNlIGJ1Z3JlcG9ydGVyIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdUeXBlLmggYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvQnVnVHlwZS5oCmluZGV4IDQ5ZjljODMuLjI0Yzc3ODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdUeXBlLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL0J1Z1R5cGUuaApAQCAtMTQsOCArMTQsOSBAQAogI2lmbmRlZiBMTFZNX0NMQU5HX0FOQUxZU0lTX0JVR1RZUEUKICNkZWZpbmUgTExWTV9DTEFOR19BTkFMWVNJU19CVUdUWVBFCiAKLSNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL0NvbW1vbkJ1Z0NhdGVnb3JpZXMuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9Db21tb25CdWdDYXRlZ29yaWVzLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgogI2luY2x1ZGUgPHN0cmluZz4KIApAQCAtMjksMjAgKzMwLDI1IEBACiAKIGNsYXNzIEJ1Z1R5cGUgewogcHJpdmF0ZToKKyAgY29uc3QgQ2hlY2tOYW1lIENoZWNrOwogICBjb25zdCBzdGQ6OnN0cmluZyBOYW1lOwogICBjb25zdCBzdGQ6OnN0cmluZyBDYXRlZ29yeTsKICAgYm9vbCBTdXBwcmVzc29uU2luazsKIAogICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CiBwdWJsaWM6Ci0gIEJ1Z1R5cGUoU3RyaW5nUmVmIG5hbWUsIFN0cmluZ1JlZiBjYXQpCi0gICAgOiBOYW1lKG5hbWUpLCBDYXRlZ29yeShjYXQpLCBTdXBwcmVzc29uU2luayhmYWxzZSkge30KKyAgQnVnVHlwZShjbGFzcyBDaGVja05hbWUgY2hlY2ssIFN0cmluZ1JlZiBuYW1lLCBTdHJpbmdSZWYgY2F0KQorICAgICAgOiBDaGVjayhjaGVjayksIE5hbWUobmFtZSksIENhdGVnb3J5KGNhdCksIFN1cHByZXNzb25TaW5rKGZhbHNlKSB7fQorICBCdWdUeXBlKGNvbnN0IENoZWNrZXJCYXNlICpjaGVja2VyLCBTdHJpbmdSZWYgbmFtZSwgU3RyaW5nUmVmIGNhdCkKKyAgICAgIDogQ2hlY2soY2hlY2tlci0+Z2V0Q2hlY2tOYW1lKCkpLCBOYW1lKG5hbWUpLCBDYXRlZ29yeShjYXQpLAorICAgICAgICBTdXBwcmVzc29uU2luayhmYWxzZSkge30KICAgdmlydHVhbCB+QnVnVHlwZSgpIHt9CiAKICAgLy8gRklYTUU6IFNob3VsZCB0aGVzZSBiZSBtYWRlIHN0cmluZ3MgYXMgd2VsbD8KICAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CiAgIFN0cmluZ1JlZiBnZXRDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIENhdGVnb3J5OyB9Ci0gIAorICBTdHJpbmdSZWYgZ2V0Q2hlY2tOYW1lKCkgY29uc3QgeyByZXR1cm4gQ2hlY2suZ2V0TmFtZSgpOyB9CisKICAgLy8vIGlzU3VwcHJlc3NPblNpbmsgLSBSZXR1cm5zIHRydWUgaWYgYnVnIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVnCiAgIC8vLyAgdHlwZSBzaG91bGQgYmUgc3VwcHJlc3NlZCBpZiB0aGUgZW5kIG5vZGUgb2YgdGhlIHJlcG9ydCBpcyBwb3N0LWRvbWluYXRlZAogICAvLy8gIGJ5IGEgc2luayBub2RlLgpAQCAtNTQsMTQgKzYwLDE4IEBACiAKIGNsYXNzIEJ1aWx0aW5CdWcgOiBwdWJsaWMgQnVnVHlwZSB7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRlc2M7Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKIHB1YmxpYzoKLSAgQnVpbHRpbkJ1Zyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZXNjcmlwdGlvbikKLSAgICA6IEJ1Z1R5cGUobmFtZSwgY2F0ZWdvcmllczo6TG9naWNFcnJvciksIGRlc2MoZGVzY3JpcHRpb24pIHt9Ci0gIAotICBCdWlsdGluQnVnKGNvbnN0IGNoYXIgKm5hbWUpCi0gICAgOiBCdWdUeXBlKG5hbWUsIGNhdGVnb3JpZXM6OkxvZ2ljRXJyb3IpLCBkZXNjKG5hbWUpIHt9Ci0gIAorICBCdWlsdGluQnVnKGNsYXNzIENoZWNrTmFtZSBjaGVjaywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCisgICAgICA6IEJ1Z1R5cGUoY2hlY2ssIG5hbWUsIGNhdGVnb3JpZXM6OkxvZ2ljRXJyb3IpLCBkZXNjKGRlc2NyaXB0aW9uKSB7fQorCisgIEJ1aWx0aW5CdWcoY29uc3QgQ2hlY2tlckJhc2UgKmNoZWNrZXIsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCisgICAgICA6IEJ1Z1R5cGUoY2hlY2tlciwgbmFtZSwgY2F0ZWdvcmllczo6TG9naWNFcnJvciksIGRlc2MoZGVzY3JpcHRpb24pIHt9CisKKyAgQnVpbHRpbkJ1Zyhjb25zdCBDaGVja2VyQmFzZSAqY2hlY2tlciwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgIDogQnVnVHlwZShjaGVja2VyLCBuYW1lLCBjYXRlZ29yaWVzOjpMb2dpY0Vycm9yKSwgZGVzYyhuYW1lKSB7fQorCiAgIFN0cmluZ1JlZiBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGRlc2M7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9QYXRoRGlhZ25vc3RpYy5oIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL1BhdGhEaWFnbm9zdGljLmgKaW5kZXggYjA2NzBkYS4uY2MzMTU5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL1BhdGhEaWFnbm9zdGljLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL1BhdGhEaWFnbm9zdGljLmgKQEAgLTIxLDEzICsyMSwxMyBAQAogI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclVuaW9uLmgiCiAjaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBjbGFuZyB7Ci0KK2NsYXNzIENvbmRpdGlvbmFsT3BlcmF0b3I7CiBjbGFzcyBBbmFseXNpc0RlY2xDb250ZXh0OwogY2xhc3MgQmluYXJ5T3BlcmF0b3I7CiBjbGFzcyBDb21wb3VuZFN0bXQ7CkBAIC0yMTEsNiArMjExLDkgQEAKICAgLy8vIEFzc3VtZXMgdGhlIHN0YXRlbWVudCBoYXMgYSB2YWxpZCBsb2NhdGlvbi4KICAgc3RhdGljIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gY3JlYXRlT3BlcmF0b3JMb2MoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkJPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7CisgIHN0YXRpYyBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGNyZWF0ZUNvbmRpdGlvbmFsQ29sb25Mb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbmRpdGlvbmFsT3BlcmF0b3IgKkNPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSk7CiAKICAgLy8vIEZvciBtZW1iZXIgZXhwcmVzc2lvbnMsIHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlICcuJyBvciAnLT4nLgogICAvLy8gQXNzdW1lcyB0aGUgc3RhdGVtZW50IGhhcyBhIHZhbGlkIGxvY2F0aW9uLgpAQCAtNDIwLDcgKzQyMyw3IEBACiAgICAgcmV0dXJuIFJlc3VsdDsKICAgfQogCi0gIExMVk1fQVRUUklCVVRFX1VTRUQgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OwogfTsKIAogY2xhc3MgUGF0aERpYWdub3N0aWNTcG90UGllY2UgOiBwdWJsaWMgUGF0aERpYWdub3N0aWNQaWVjZSB7CkBAIC00MzcsMTAgKzQ0MCwxMCBAQAogICAgIGlmIChhZGRQb3NSYW5nZSAmJiBQb3MuaGFzUmFuZ2UoKSkgYWRkUmFuZ2UoUG9zLmFzUmFuZ2UoKSk7CiAgIH0KIAotICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gUG9zOyB9Ci0gIHZpcnR1YWwgdm9pZCBmbGF0dGVuTG9jYXRpb25zKCkgeyBQb3MuZmxhdHRlbigpOyB9CisgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBQb3M7IH0KKyAgdm9pZCBmbGF0dGVuTG9jYXRpb25zKCkgb3ZlcnJpZGUgeyBQb3MuZmxhdHRlbigpOyB9CiAKLSAgdmlydHVhbCB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUGF0aERpYWdub3N0aWNQaWVjZSAqUCkgewogICAgIHJldHVybiBQLT5nZXRLaW5kKCkgPT0gRXZlbnQgfHwgUC0+Z2V0S2luZCgpID09IE1hY3JvOwpAQCAtNDc2LDcgKzQ3OSw3IEBACiAKICAgLy8vIFxicmllZiBTZWFyY2ggdGhlIGNhbGwgZXhwcmVzc2lvbiBmb3IgdGhlIHN5bWJvbCBTeW0gYW5kIGRpc3BhdGNoIHRoZQogICAvLy8gJ2dldE1lc3NhZ2VGb3JYKCknIG1ldGhvZHMgdG8gY29uc3RydWN0IGEgc3BlY2lmaWMgbWVzc2FnZS4KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRNZXNzYWdlKGNvbnN0IEV4cGxvZGVkTm9kZSAqTik7CisgIHN0ZDo6c3RyaW5nIGdldE1lc3NhZ2UoY29uc3QgRXhwbG9kZWROb2RlICpOKSBvdmVycmlkZTsKIAogICAvLy8gUHJvZHVjZXMgdGhlIG1lc3NhZ2Ugb2YgdGhlIGZvbGxvd2luZyBmb3JtOgogICAvLy8gICAnTXNnIHZpYSBOdGggcGFyYW1ldGVyJwpAQCAtNDk2LDcgKzQ5OSw3IEBACiAgIC8vLyBzdXBwbHkgYSBtZXNzYWdlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbnN0cnVjdCBhbiBleHRyYSBoaW50IG9uIHRoZQogICAvLy8gcmV0dXJucyBmcm9tIGFsbCB0aGUgY2FsbHMgb24gdGhlIHN0YWNrIGZyb20gdGhpcyBldmVudCB0byB0aGUgZmluYWwKICAgLy8vIGRpYWdub3N0aWMuCi0gIE93bmluZ1B0cjxTdGFja0hpbnRHZW5lcmF0b3I+IENhbGxTdGFja0hpbnQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxTdGFja0hpbnRHZW5lcmF0b3I+IENhbGxTdGFja0hpbnQ7CiAKIHB1YmxpYzoKICAgUGF0aERpYWdub3N0aWNFdmVudFBpZWNlKGNvbnN0IFBhdGhEaWFnbm9zdGljTG9jYXRpb24gJnBvcywKQEAgLTUyMCwxMCArNTIzLDggQEAKICAgYm9vbCBpc1BydW5hYmxlKCkgY29uc3QgewogICAgIHJldHVybiBJc1BydW5hYmxlLmhhc1ZhbHVlKCkgPyBJc1BydW5hYmxlLmdldFZhbHVlKCkgOiBmYWxzZTsKICAgfQotICAKLSAgYm9vbCBoYXNDYWxsU3RhY2tIaW50KCkgewotICAgIHJldHVybiBDYWxsU3RhY2tIaW50LmlzVmFsaWQoKTsKLSAgfQorCisgIGJvb2wgaGFzQ2FsbFN0YWNrSGludCgpIHsgcmV0dXJuIChib29sKUNhbGxTdGFja0hpbnQ7IH0KIAogICAvLy8gUHJvZHVjZSB0aGUgaGludCBmb3IgdGhlIGdpdmVuIG5vZGUuIFRoZSBub2RlIGNvbnRhaW5zIAogICAvLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhbGwgZm9yIHdoaWNoIHRoZSBkaWFnbm9zdGljIGNhbiBiZSBnZW5lcmF0ZWQuCkBAIC01MzMsNyArNTM0LDcgQEAKICAgICByZXR1cm4gIiI7ICAKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFBhdGhEaWFnbm9zdGljUGllY2UgKlApIHsKICAgICByZXR1cm4gUC0+Z2V0S2luZCgpID09IEV2ZW50OwpAQCAtNTc5LDcgKzU4MCw3IEBACiAgICAgQ2FsbFN0YWNrTWVzc2FnZSA9IHN0OwogICB9CiAKLSAgdmlydHVhbCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeworICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBjYWxsRW50ZXI7CiAgIH0KICAgCkBAIC01ODgsNyArNTg5LDcgQEAKICAgICBnZXRDYWxsRW50ZXJXaXRoaW5DYWxsZXJFdmVudCgpIGNvbnN0OwogICBJbnRydXNpdmVSZWZDbnRQdHI8UGF0aERpYWdub3N0aWNFdmVudFBpZWNlPiBnZXRDYWxsRXhpdEV2ZW50KCkgY29uc3Q7CiAKLSAgdmlydHVhbCB2b2lkIGZsYXR0ZW5Mb2NhdGlvbnMoKSB7CisgIHZvaWQgZmxhdHRlbkxvY2F0aW9ucygpIG92ZXJyaWRlIHsKICAgICBjYWxsRW50ZXIuZmxhdHRlbigpOwogICAgIGNhbGxSZXR1cm4uZmxhdHRlbigpOwogICAgIGZvciAoUGF0aFBpZWNlczo6aXRlcmF0b3IgSSA9IHBhdGguYmVnaW4oKSwgCkBAIC02MDEsMTAgKzYwMiwxMCBAQAogICAKICAgc3RhdGljIFBhdGhEaWFnbm9zdGljQ2FsbFBpZWNlICpjb25zdHJ1Y3QoUGF0aFBpZWNlcyAmcGllY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsICpjYWxsZXIpOwotICAKLSAgdmlydHVhbCB2b2lkIGR1bXAoKSBjb25zdDsKIAotICB2aXJ0dWFsIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIGlubGluZSBib29sIGNsYXNzb2YoY29uc3QgUGF0aERpYWdub3N0aWNQaWVjZSAqUCkgewogICAgIHJldHVybiBQLT5nZXRLaW5kKCkgPT0gQ2FsbDsKQEAgLTY1MSw3ICs2NTIsNyBAQAogCiAgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IFBhdGhEaWFnbm9zdGljTG9jYXRpb25QYWlyICZYKSB7IExQYWlycy5wdXNoX2JhY2soWCk7IH0KIAotICB2aXJ0dWFsIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCB7CisgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGdldFN0YXJ0TG9jYXRpb24oKTsKICAgfQogCkBAIC02NTksNyArNjYwLDcgQEAKICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBMUGFpcnMuYmVnaW4oKTsgfQogICBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIExQYWlycy5lbmQoKTsgfQogCi0gIHZpcnR1YWwgdm9pZCBmbGF0dGVuTG9jYXRpb25zKCkgeworICB2b2lkIGZsYXR0ZW5Mb2NhdGlvbnMoKSBvdmVycmlkZSB7CiAgICAgZm9yIChpdGVyYXRvciBJPWJlZ2luKCksIEU9ZW5kKCk7IEkhPUU7ICsrSSkgSS0+ZmxhdHRlbigpOwogICB9CiAKQEAgLTY3Miw5ICs2NzMsOSBAQAogICAgIHJldHVybiBQLT5nZXRLaW5kKCkgPT0gQ29udHJvbEZsb3c7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBQYXRoRGlhZ25vc3RpY01hY3JvUGllY2UgOiBwdWJsaWMgUGF0aERpYWdub3N0aWNTcG90UGllY2UgewpAQCAtNjg4LDcgKzY4OSw3IEBACiAgIAogICBib29sIGNvbnRhaW5zRXZlbnQoKSBjb25zdDsKIAotICB2aXJ0dWFsIHZvaWQgZmxhdHRlbkxvY2F0aW9ucygpIHsKKyAgdm9pZCBmbGF0dGVuTG9jYXRpb25zKCkgb3ZlcnJpZGUgewogICAgIFBhdGhEaWFnbm9zdGljU3BvdFBpZWNlOjpmbGF0dGVuTG9jYXRpb25zKCk7CiAgICAgZm9yIChQYXRoUGllY2VzOjppdGVyYXRvciBJID0gc3ViUGllY2VzLmJlZ2luKCksIAogICAgICAgICAgRSA9IHN1YlBpZWNlcy5lbmQoKTsgSSAhPSBFOyArK0kpICgqSSktPmZsYXR0ZW5Mb2NhdGlvbnMoKTsKQEAgLTY5OCwxNSArNjk5LDE2IEBACiAgICAgcmV0dXJuIFAtPmdldEtpbmQoKSA9PSBNYWNybzsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIC8vLyBQYXRoRGlhZ25vc3RpYyAtIFBhdGhEaWFnbm9zdGljIG9iamVjdHMgcmVwcmVzZW50IGEgc2luZ2xlIHBhdGgtc2Vuc2l0aXZlCiAvLy8gIGRpYWdub3N0aWMuICBJdCByZXByZXNlbnRzIGFuIG9yZGVyZWQtY29sbGVjdGlvbiBvZiBQYXRoRGlhZ25vc3RpY1BpZWNlcywKIC8vLyAgZWFjaCB3aGljaCByZXByZXNlbnQgdGhlIHBpZWNlcyBvZiB0aGUgcGF0aC4KIGNsYXNzIFBhdGhEaWFnbm9zdGljIDogcHVibGljIGxsdm06OkZvbGRpbmdTZXROb2RlIHsKKyAgc3RkOjpzdHJpbmcgQ2hlY2tOYW1lOwogICBjb25zdCBEZWNsICpEZWNsV2l0aElzc3VlOwogICBzdGQ6OnN0cmluZyBCdWdUeXBlOwogICBzdGQ6OnN0cmluZyBWZXJib3NlRGVzYzsKQEAgLTcyNyw4ICs3MjksOCBAQAogCiAgIFBhdGhEaWFnbm9zdGljKCkgTExWTV9ERUxFVEVEX0ZVTkNUSU9OOwogcHVibGljOgotICBQYXRoRGlhZ25vc3RpYyhjb25zdCBEZWNsICpEZWNsV2l0aElzc3VlLCBTdHJpbmdSZWYgYnVndHlwZSwKLSAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIHZlcmJvc2VEZXNjLCBTdHJpbmdSZWYgc2hvcnREZXNjLAorICBQYXRoRGlhZ25vc3RpYyhTdHJpbmdSZWYgQ2hlY2tOYW1lLCBjb25zdCBEZWNsICpEZWNsV2l0aElzc3VlLAorICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgYnVndHlwZSwgU3RyaW5nUmVmIHZlcmJvc2VEZXNjLCBTdHJpbmdSZWYgc2hvcnREZXNjLAogICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgY2F0ZWdvcnksIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gTG9jYXRpb25Ub1VuaXF1ZSwKICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbCAqRGVjbFRvVW5pcXVlKTsKIApAQCAtNzg1LDYgKzc4Nyw3IEBACiAgIFN0cmluZ1JlZiBnZXRTaG9ydERlc2NyaXB0aW9uKCkgY29uc3QgewogICAgIHJldHVybiBTaG9ydERlc2MuZW1wdHkoKSA/IFZlcmJvc2VEZXNjIDogU2hvcnREZXNjOwogICB9CisgIFN0cmluZ1JlZiBnZXRDaGVja05hbWUoKSBjb25zdCB7IHJldHVybiBDaGVja05hbWU7IH0KICAgU3RyaW5nUmVmIGdldEJ1Z1R5cGUoKSBjb25zdCB7IHJldHVybiBCdWdUeXBlOyB9CiAgIFN0cmluZ1JlZiBnZXRDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIENhdGVnb3J5OyB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyLmggYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlci5oCmluZGV4IGNmN2NmMDUuLmJlMWU5Y2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0NoZWNrZXIuaApAQCAtNDUzLDE0ICs0NTMsMjkgQEAKIH0gLy8gZW5kIGV2YWwgbmFtZXNwYWNlCiAKIGNsYXNzIENoZWNrZXJCYXNlIDogcHVibGljIFByb2dyYW1Qb2ludFRhZyB7CisgIENoZWNrTmFtZSBOYW1lOworICBmcmllbmQgY2xhc3MgOjpjbGFuZzo6ZW50bzo6Q2hlY2tlck1hbmFnZXI7CisKIHB1YmxpYzoKLSAgU3RyaW5nUmVmIGdldFRhZ0Rlc2NyaXB0aW9uKCkgY29uc3Q7CisgIFN0cmluZ1JlZiBnZXRUYWdEZXNjcmlwdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBDaGVja05hbWUgZ2V0Q2hlY2tOYW1lKCkgY29uc3Q7CiAKICAgLy8vIFNlZSBDaGVja2VyTWFuYWdlcjo6cnVuQ2hlY2tlcnNGb3JQcmludFN0YXRlLgogICB2aXJ0dWFsIHZvaWQgcHJpbnRTdGF0ZShyYXdfb3N0cmVhbSAmT3V0LCBQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5MLCBjb25zdCBjaGFyICpTZXApIGNvbnN0IHsgfQogfTsKLSAgCisKKy8vLyBEdW1wIGNoZWNrZXIgbmFtZSB0byBzdHJlYW0uCityYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT3V0LCBjb25zdCBDaGVja2VyQmFzZSAmQ2hlY2tlcik7CisKKy8vLyBUYWcgdGhhdCBjYW4gdXNlIGEgY2hlY2tlciBuYW1lIGFzIGEgbWVzc2FnZSBwcm92aWRlciAKKy8vLyAoc2VlIFNpbXBsZVByb2dyYW1Qb2ludFRhZykuCitjbGFzcyBDaGVja2VyUHJvZ3JhbVBvaW50VGFnIDogcHVibGljIFNpbXBsZVByb2dyYW1Qb2ludFRhZyB7CitwdWJsaWM6CisgIENoZWNrZXJQcm9ncmFtUG9pbnRUYWcoU3RyaW5nUmVmIENoZWNrZXJOYW1lLCBTdHJpbmdSZWYgTXNnKTsKKyAgQ2hlY2tlclByb2dyYW1Qb2ludFRhZyhjb25zdCBDaGVja2VyQmFzZSAqQ2hlY2tlciwgU3RyaW5nUmVmIE1zZyk7Cit9OworCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0hFQ0sxLCB0eXBlbmFtZSBDSEVDSzI9Y2hlY2s6Ol9Wb2lkQ2hlY2ssCiAgICAgICAgICAgdHlwZW5hbWUgQ0hFQ0szPWNoZWNrOjpfVm9pZENoZWNrLCB0eXBlbmFtZSBDSEVDSzQ9Y2hlY2s6Ol9Wb2lkQ2hlY2ssCiAgICAgICAgICAgdHlwZW5hbWUgQ0hFQ0s1PWNoZWNrOjpfVm9pZENoZWNrLCB0eXBlbmFtZSBDSEVDSzY9Y2hlY2s6Ol9Wb2lkQ2hlY2ssCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlck1hbmFnZXIuaCBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyTWFuYWdlci5oCmluZGV4IDhhZDY3YzEuLmIzNjQxMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyTWFuYWdlci5oCisrKyBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyTWFuYWdlci5oCkBAIC0xNiw4ICsxNiw4IEBACiAKICNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9Qcm9ncmFtUG9pbnQuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oIgotI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TdG9yZS5oIgogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQW5hbHl6ZXJPcHRpb25zLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N0b3JlLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgogI2luY2x1ZGUgPHZlY3Rvcj4KQEAgLTI5LDExICsyOSwxMSBAQAogCiBuYW1lc3BhY2UgZW50byB7CiAgIGNsYXNzIENoZWNrZXJCYXNlOworICBjbGFzcyBDaGVja2VyUmVnaXN0cnk7CiAgIGNsYXNzIEV4cHJFbmdpbmU7CiAgIGNsYXNzIEFuYWx5c2lzTWFuYWdlcjsKICAgY2xhc3MgQnVnUmVwb3J0ZXI7CiAgIGNsYXNzIENoZWNrZXJDb250ZXh0OwotICBjbGFzcyBTaW1wbGVDYWxsOwogICBjbGFzcyBPYmpDTWV0aG9kQ2FsbDsKICAgY2xhc3MgU1ZhbDsKICAgY2xhc3MgRXhwbG9kZWROb2RlOwpAQCAtMTMyLDkgKzEzMiwyNiBAQAogICBQU0tfRXNjYXBlT3RoZXIKIH07CiAKKy8vIFRoaXMgd3JhcHBlciBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG9ubHkgU3RyaW5nUmVmcyBvcmlnaW5hdGluZyBmcm9tIHRoZQorLy8gQ2hlY2tlclJlZ2lzdHJ5IGFyZSB1c2VkIGFzIGNoZWNrIG5hbWVzLiBXZSB3YW50IHRvIG1ha2Ugc3VyZSBhbGwgY2hlY2sKKy8vIG5hbWUgc3RyaW5ncyBoYXZlIGEgbGlmZXRpbWUgdGhhdCBrZWVwcyB0aGVtIGFsaXZlIGF0IGxlYXN0IHVudGlsIHRoZSBwYXRoCisvLyBkaWFnbm9zdGljcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorY2xhc3MgQ2hlY2tOYW1lIHsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIGZyaWVuZCBjbGFzcyA6OmNsYW5nOjplbnRvOjpDaGVja2VyUmVnaXN0cnk7CisgIGV4cGxpY2l0IENoZWNrTmFtZShTdHJpbmdSZWYgTmFtZSkgOiBOYW1lKE5hbWUpIHt9CisKK3B1YmxpYzoKKyAgQ2hlY2tOYW1lKCkge30KKyAgQ2hlY2tOYW1lKGNvbnN0IENoZWNrTmFtZSAmT3RoZXIpIDogTmFtZShPdGhlci5OYW1lKSB7fQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KK307CisKIGNsYXNzIENoZWNrZXJNYW5hZ2VyIHsKICAgY29uc3QgTGFuZ09wdGlvbnMgTGFuZ09wdHM7CiAgIEFuYWx5emVyT3B0aW9uc1JlZiBBT3B0aW9uczsKKyAgQ2hlY2tOYW1lIEN1cnJlbnRDaGVja05hbWU7CisKIHB1YmxpYzoKICAgQ2hlY2tlck1hbmFnZXIoY29uc3QgTGFuZ09wdGlvbnMgJmxhbmdPcHRzLAogICAgICAgICAgICAgICAgICBBbmFseXplck9wdGlvbnNSZWYgQU9wdGlvbnMpCkBAIC0xNDMsNiArMTYwLDkgQEAKIAogICB+Q2hlY2tlck1hbmFnZXIoKTsKIAorICB2b2lkIHNldEN1cnJlbnRDaGVja05hbWUoQ2hlY2tOYW1lIG5hbWUpIHsgQ3VycmVudENoZWNrTmFtZSA9IG5hbWU7IH0KKyAgQ2hlY2tOYW1lIGdldEN1cnJlbnRDaGVja05hbWUoKSBjb25zdCB7IHJldHVybiBDdXJyZW50Q2hlY2tOYW1lOyB9CisKICAgYm9vbCBoYXNQYXRoU2Vuc2l0aXZlQ2hlY2tlcnMoKSBjb25zdDsKIAogICB2b2lkIGZpbmlzaGVkQ2hlY2tlclJlZ2lzdHJhdGlvbigpOwpAQCAtMTY5LDYgKzE4OSw3IEBACiAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0hFQ0tFUiAqPihyZWYpOyAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQuCiAKICAgICBDSEVDS0VSICpjaGVja2VyID0gbmV3IENIRUNLRVIoKTsKKyAgICBjaGVja2VyLT5OYW1lID0gQ3VycmVudENoZWNrTmFtZTsKICAgICBDaGVja2VyRHRvcnMucHVzaF9iYWNrKENoZWNrZXJEdG9yKGNoZWNrZXIsIGRlc3RydWN0PENIRUNLRVI+KSk7CiAgICAgQ0hFQ0tFUjo6X3JlZ2lzdGVyKGNoZWNrZXIsICp0aGlzKTsKICAgICByZWYgPSBjaGVja2VyOwpAQCAtMTgzLDYgKzIwNCw3IEBACiAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0hFQ0tFUiAqPihyZWYpOyAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQuCiAKICAgICBDSEVDS0VSICpjaGVja2VyID0gbmV3IENIRUNLRVIoQU9wdHMpOworICAgIGNoZWNrZXItPk5hbWUgPSBDdXJyZW50Q2hlY2tOYW1lOwogICAgIENoZWNrZXJEdG9ycy5wdXNoX2JhY2soQ2hlY2tlckR0b3IoY2hlY2tlciwgZGVzdHJ1Y3Q8Q0hFQ0tFUj4pKTsKICAgICBDSEVDS0VSOjpfcmVnaXN0ZXIoY2hlY2tlciwgKnRoaXMpOwogICAgIHJlZiA9IGNoZWNrZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9BUFNJbnRUeXBlLmggYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9BUFNJbnRUeXBlLmgKaW5kZXggOTUwMjkwMC4uMzdiZTY5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQVBTSW50VHlwZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0FQU0ludFR5cGUuaApAQCAtMTEsNiArMTEsNyBAQAogI2RlZmluZSBMTFZNX0NMQU5HX1NBX0NPUkVfQVBTSU5UVFlQRV9ICiAKICNpbmNsdWRlICJsbHZtL0FEVC9BUFNJbnQuaCIKKyNpbmNsdWRlIDx0dXBsZT4KIAogbmFtZXNwYWNlIGNsYW5nIHsKIG5hbWVzcGFjZSBlbnRvIHsKQEAgLTk3LDEzICs5OCw4IEBACiAgIC8vLyBVbnNpZ25lZCBpbnRlZ2VycyBhcmUgY29uc2lkZXJlZCB0byBiZSBiZXR0ZXIgY29udmVyc2lvbiB0eXBlcyB0aGFuCiAgIC8vLyBzaWduZWQgaW50ZWdlcnMgb2YgdGhlIHNhbWUgd2lkdGguCiAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEFQU0ludFR5cGUgJk90aGVyKSBjb25zdCB7Ci0gICAgaWYgKEJpdFdpZHRoIDwgT3RoZXIuQml0V2lkdGgpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoQml0V2lkdGggPiBPdGhlci5CaXRXaWR0aCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIUlzVW5zaWduZWQgJiYgT3RoZXIuSXNVbnNpZ25lZCkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gc3RkOjp0aWUoQml0V2lkdGgsIElzVW5zaWduZWQpIDwKKyAgICAgICAgICAgc3RkOjp0aWUoT3RoZXIuQml0V2lkdGgsIE90aGVyLklzVW5zaWduZWQpOwogICB9CiB9OwogICAgIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQW5hbHlzaXNNYW5hZ2VyLmggYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9BbmFseXNpc01hbmFnZXIuaAppbmRleCBkN2Q4M2NlLi4xYTM5OGI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9BbmFseXNpc01hbmFnZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9BbmFseXNpc01hbmFnZXIuaApAQCAtNjUsOCArNjUsOCBAQAogICBTdG9yZU1hbmFnZXJDcmVhdG9yIGdldFN0b3JlTWFuYWdlckNyZWF0b3IoKSB7CiAgICAgcmV0dXJuIENyZWF0ZVN0b3JlTWdyOwogICB9Ci0gIAotICBBbmFseXplck9wdGlvbnMmIGdldEFuYWx5emVyT3B0aW9ucygpIHsKKworICBBbmFseXplck9wdGlvbnMmIGdldEFuYWx5emVyT3B0aW9ucygpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gb3B0aW9uczsKICAgfQogCkBAIC03NiwxNSArNzYsMTUgQEAKIAogICBDaGVja2VyTWFuYWdlciAqZ2V0Q2hlY2tlck1hbmFnZXIoKSBjb25zdCB7IHJldHVybiBDaGVja2VyTWdyOyB9CiAKLSAgdmlydHVhbCBBU1RDb250ZXh0ICZnZXRBU1RDb250ZXh0KCkgeworICBBU1RDb250ZXh0ICZnZXRBU1RDb250ZXh0KCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBDdHg7CiAgIH0KIAotICB2aXJ0dWFsIFNvdXJjZU1hbmFnZXIgJmdldFNvdXJjZU1hbmFnZXIoKSB7CisgIFNvdXJjZU1hbmFnZXIgJmdldFNvdXJjZU1hbmFnZXIoKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGdldEFTVENvbnRleHQoKS5nZXRTb3VyY2VNYW5hZ2VyKCk7CiAgIH0KIAotICB2aXJ0dWFsIERpYWdub3N0aWNzRW5naW5lICZnZXREaWFnbm9zdGljKCkgeworICBEaWFnbm9zdGljc0VuZ2luZSAmZ2V0RGlhZ25vc3RpYygpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gRGlhZ3M7CiAgIH0KIApAQCAtOTIsNyArOTIsNyBAQAogICAgIHJldHVybiBMYW5nT3B0czsKICAgfQogCi0gIEFycmF5UmVmPFBhdGhEaWFnbm9zdGljQ29uc3VtZXIqPiBnZXRQYXRoRGlhZ25vc3RpY0NvbnN1bWVycygpICB7CisgIEFycmF5UmVmPFBhdGhEaWFnbm9zdGljQ29uc3VtZXIqPiBnZXRQYXRoRGlhZ25vc3RpY0NvbnN1bWVycygpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gUGF0aENvbnN1bWVyczsKICAgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9CbG9ja0NvdW50ZXIuaCBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Jsb2NrQ291bnRlci5oCmluZGV4IDI0ODNhNzkuLmFiYjk1MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Jsb2NrQ291bnRlci5oCisrKyBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Jsb2NrQ291bnRlci5oCkBAIC0xNiw5ICsxNiw3IEBACiAjaWZuZGVmIExMVk1fQ0xBTkdfR1JfQkxPQ0tDT1VOVEVSCiAjZGVmaW5lIExMVk1fQ0xBTkdfR1JfQkxPQ0tDT1VOVEVSCiAKLW5hbWVzcGFjZSBsbHZtIHsKLSAgY2xhc3MgQnVtcFB0ckFsbG9jYXRvcjsKLX0KKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCiAKIG5hbWVzcGFjZSBjbGFuZyB7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0NhbGxFdmVudC5oIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ2FsbEV2ZW50LmgKaW5kZXggY2ZhZjA4NS4uZDM0N2JlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ2FsbEV2ZW50LmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ2FsbEV2ZW50LmgKQEAgLTMzLDkgKzMzLDYgQEAKIAogZW51bSBDYWxsRXZlbnRLaW5kIHsKICAgQ0VfRnVuY3Rpb24sCi0gIENFX0Jsb2NrLAotICBDRV9CRUdfU0lNUExFX0NBTExTID0gQ0VfRnVuY3Rpb24sCi0gIENFX0VORF9TSU1QTEVfQ0FMTFMgPSBDRV9CbG9jaywKICAgQ0VfQ1hYTWVtYmVyLAogICBDRV9DWFhNZW1iZXJPcGVyYXRvciwKICAgQ0VfQ1hYRGVzdHJ1Y3RvciwKQEAgLTQ1LDYgKzQyLDcgQEAKICAgQ0VfQ1hYQWxsb2NhdG9yLAogICBDRV9CRUdfRlVOQ1RJT05fQ0FMTFMgPSBDRV9GdW5jdGlvbiwKICAgQ0VfRU5EX0ZVTkNUSU9OX0NBTExTID0gQ0VfQ1hYQWxsb2NhdG9yLAorICBDRV9CbG9jaywKICAgQ0VfT2JqQ01lc3NhZ2UKIH07CiAKQEAgLTM0NCwyMyArMzQyLDE2IEBACiAgIC8vIEl0ZXJhdG9yIGFjY2VzcyB0byBmb3JtYWwgcGFyYW1ldGVycyBhbmQgdGhlaXIgdHlwZXMuCiBwcml2YXRlOgogICB0eXBlZGVmIHN0ZDo6Y29uc3RfbWVtX2Z1bl90PFF1YWxUeXBlLCBQYXJtVmFyRGVjbD4gZ2V0X3R5cGVfZnVuOwotICAKLXB1YmxpYzoKLSAgdHlwZWRlZiBjb25zdCBQYXJtVmFyRGVjbCAqIGNvbnN0ICpwYXJhbV9pdGVyYXRvcjsKIAotICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoZSBjYWxsJ3MgZm9ybWFsIHBhcmFtZXRlcnMuCitwdWJsaWM6CisgIC8vLyBSZXR1cm4gY2FsbCdzIGZvcm1hbCBwYXJhbWV0ZXJzLgogICAvLy8KICAgLy8vIFJlbWVtYmVyIHRoYXQgdGhlIG51bWJlciBvZiBmb3JtYWwgcGFyYW1ldGVycyBtYXkgbm90IG1hdGNoIHRoZSBudW1iZXIKICAgLy8vIG9mIGFyZ3VtZW50cyBmb3IgYWxsIGNhbGxzLiBIb3dldmVyLCB0aGUgZmlyc3QgcGFyYW1ldGVyIHdpbGwgYWx3YXlzCiAgIC8vLyBjb3JyZXNwb25kIHdpdGggdGhlIGFyZ3VtZW50IHZhbHVlIHJldHVybmVkIGJ5IFxjIGdldEFyZ1NWYWwoMCkuCi0gIC8vLwotICAvLy8gSWYgdGhlIGNhbGwgaGFzIG5vIGFjY2Vzc2libGUgZGVjbGFyYXRpb24sIFxjIHBhcmFtX2JlZ2luKCkgd2lsbCBiZSBlcXVhbAotICAvLy8gdG8gXGMgcGFyYW1fZW5kKCkuCi0gIHZpcnR1YWwgcGFyYW1faXRlcmF0b3IgcGFyYW1fYmVnaW4oKSBjb25zdCA9IDA7Ci0gIC8vLyBcc2EgcGFyYW1fYmVnaW4oKQotICB2aXJ0dWFsIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2VuZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBBcnJheVJlZjxQYXJtVmFyRGVjbCo+IHBhcmFtZXRlcnMoKSBjb25zdCA9IDA7CiAKLSAgdHlwZWRlZiBsbHZtOjptYXBwZWRfaXRlcmF0b3I8cGFyYW1faXRlcmF0b3IsIGdldF90eXBlX2Z1bj4KKyAgdHlwZWRlZiBsbHZtOjptYXBwZWRfaXRlcmF0b3I8QXJyYXlSZWY8UGFybVZhckRlY2wqPjo6aXRlcmF0b3IsIGdldF90eXBlX2Z1bj4KICAgICBwYXJhbV90eXBlX2l0ZXJhdG9yOwogCiAgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHR5cGVzIG9mIHRoZSBjYWxsJ3MgZm9ybWFsIHBhcmFtZXRlcnMuCkBAIC0zNjksMTcgKzM2MCwxOCBAQAogICAvLy8gZGVmaW5pdGlvbiBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSBwdWJsaWMgaW50ZXJmYWNlLCBhbmQgcHJvYmFibHkgaGFzCiAgIC8vLyBtb3JlIGFubm90YXRpb25zLgogICBwYXJhbV90eXBlX2l0ZXJhdG9yIHBhcmFtX3R5cGVfYmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxsdm06Om1hcF9pdGVyYXRvcihwYXJhbV9iZWdpbigpLAorICAgIHJldHVybiBsbHZtOjptYXBfaXRlcmF0b3IocGFyYW1ldGVycygpLmJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdHlwZV9mdW4oJlBhcm1WYXJEZWNsOjpnZXRUeXBlKSk7CiAgIH0KICAgLy8vIFxzYSBwYXJhbV90eXBlX2JlZ2luKCkKICAgcGFyYW1fdHlwZV9pdGVyYXRvciBwYXJhbV90eXBlX2VuZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbGx2bTo6bWFwX2l0ZXJhdG9yKHBhcmFtX2VuZCgpLCBnZXRfdHlwZV9mdW4oJlBhcm1WYXJEZWNsOjpnZXRUeXBlKSk7CisgICAgcmV0dXJuIGxsdm06Om1hcF9pdGVyYXRvcihwYXJhbWV0ZXJzKCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdHlwZV9mdW4oJlBhcm1WYXJEZWNsOjpnZXRUeXBlKSk7CiAgIH0KIAogICAvLyBGb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkKICAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPdXQpIGNvbnN0OwotICBMTFZNX0FUVFJJQlVURV9VU0VEIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKIH07CiAKIApAQCAtMzk4LDExICszOTAsMTEgQEAKIHB1YmxpYzoKICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMsIGJ1dCB0aGV5IG11c3QgcmV0dXJuCiAgIC8vIGEgRnVuY3Rpb25EZWNsLgotICB2aXJ0dWFsIGNvbnN0IEZ1bmN0aW9uRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsKKyAgY29uc3QgRnVuY3Rpb25EZWNsICpnZXREZWNsKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBjYXN0PEZ1bmN0aW9uRGVjbD4oQ2FsbEV2ZW50OjpnZXREZWNsKCkpOwogICB9CiAKLSAgdmlydHVhbCBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgUnVudGltZURlZmluaXRpb24gZ2V0UnVudGltZURlZmluaXRpb24oKSBjb25zdCBvdmVycmlkZSB7CiAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGdldERlY2woKTsKICAgICAvLyBOb3RlIHRoYXQgdGhlIEFuYWx5c2lzRGVjbENvbnRleHQgd2lsbCBoYXZlIHRoZSBGdW5jdGlvbkRlY2wgd2l0aAogICAgIC8vIHRoZSBkZWZpbml0aW9uIChpZiBvbmUgZXhpc3RzKS4KQEAgLTQxNywxMyArNDA5LDEyIEBACiAgICAgcmV0dXJuIFJ1bnRpbWVEZWZpbml0aW9uKCk7CiAgIH0KIAotICB2aXJ0dWFsIGJvb2wgYXJndW1lbnRzTWF5RXNjYXBlKCkgY29uc3Q7CisgIGJvb2wgYXJndW1lbnRzTWF5RXNjYXBlKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIGdldEluaXRpYWxTdGFja0ZyYW1lQ29udGVudHMoY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKkNhbGxlZUN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ3NUeSAmQmluZGluZ3MpIGNvbnN0OworICB2b2lkIGdldEluaXRpYWxTdGFja0ZyYW1lQ29udGVudHMoY29uc3QgU3RhY2tGcmFtZUNvbnRleHQgKkNhbGxlZUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzVHkgJkJpbmRpbmdzKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgY29uc3Q7Ci0gIHZpcnR1YWwgcGFyYW1faXRlcmF0b3IgcGFyYW1fZW5kKCkgY29uc3Q7CisgIEFycmF5UmVmPFBhcm1WYXJEZWNsICo+IHBhcmFtZXRlcnMoKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENhbGxFdmVudCAqQ0EpIHsKICAgICByZXR1cm4gQ0EtPmdldEtpbmQoKSA+PSBDRV9CRUdfRlVOQ1RJT05fQ0FMTFMgJiYKQEAgLTQzMSw0OSArNDIyLDM2IEBACiAgIH0KIH07CiAKLS8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGNhbGwgdG8gYSBub24tQysrIGZ1bmN0aW9uLCB3cml0dGVuIGFzIGEgQ2FsbEV4cHIuCi1jbGFzcyBTaW1wbGVDYWxsIDogcHVibGljIEFueUZ1bmN0aW9uQ2FsbCB7CisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBDIGZ1bmN0aW9uIG9yIHN0YXRpYyBDKysgbWVtYmVyIGZ1bmN0aW9uIGNhbGwuCisvLy8KKy8vLyBFeGFtcGxlOiBcYyBmdW4oKQorY2xhc3MgU2ltcGxlRnVuY3Rpb25DYWxsIDogcHVibGljIEFueUZ1bmN0aW9uQ2FsbCB7CisgIGZyaWVuZCBjbGFzcyBDYWxsRXZlbnRNYW5hZ2VyOworCiBwcm90ZWN0ZWQ6Ci0gIFNpbXBsZUNhbGwoY29uc3QgQ2FsbEV4cHIgKkNFLCBQcm9ncmFtU3RhdGVSZWYgU3QsCi0gICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4KQorICBTaW1wbGVGdW5jdGlvbkNhbGwoY29uc3QgQ2FsbEV4cHIgKkNFLCBQcm9ncmFtU3RhdGVSZWYgU3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpCiAgICAgOiBBbnlGdW5jdGlvbkNhbGwoQ0UsIFN0LCBMQ3R4KSB7fQotICBTaW1wbGVDYWxsKGNvbnN0IFNpbXBsZUNhbGwgJk90aGVyKSA6IEFueUZ1bmN0aW9uQ2FsbChPdGhlcikge30KKyAgU2ltcGxlRnVuY3Rpb25DYWxsKGNvbnN0IFNpbXBsZUZ1bmN0aW9uQ2FsbCAmT3RoZXIpCisgICAgOiBBbnlGdW5jdGlvbkNhbGwoT3RoZXIpIHt9CisgIHZvaWQgY2xvbmVUbyh2b2lkICpEZXN0KSBjb25zdCBvdmVycmlkZSB7CisgICAgbmV3IChEZXN0KSBTaW1wbGVGdW5jdGlvbkNhbGwoKnRoaXMpOworICB9CiAKIHB1YmxpYzoKICAgdmlydHVhbCBjb25zdCBDYWxsRXhwciAqZ2V0T3JpZ2luRXhwcigpIGNvbnN0IHsKICAgICByZXR1cm4gY2FzdDxDYWxsRXhwcj4oQW55RnVuY3Rpb25DYWxsOjpnZXRPcmlnaW5FeHByKCkpOwogICB9CiAKLSAgdmlydHVhbCBjb25zdCBGdW5jdGlvbkRlY2wgKmdldERlY2woKSBjb25zdDsKKyAgY29uc3QgRnVuY3Rpb25EZWNsICpnZXREZWNsKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeyByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXROdW1BcmdzKCk7IH0KKyAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0TnVtQXJncygpOyB9CiAKLSAgdmlydHVhbCBjb25zdCBFeHByICpnZXRBcmdFeHByKHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgIGNvbnN0IEV4cHIgKmdldEFyZ0V4cHIodW5zaWduZWQgSW5kZXgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXRBcmcoSW5kZXgpOwogICB9CiAKLSAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDYWxsRXZlbnQgKkNBKSB7Ci0gICAgcmV0dXJuIENBLT5nZXRLaW5kKCkgPj0gQ0VfQkVHX1NJTVBMRV9DQUxMUyAmJgotICAgICAgICAgICBDQS0+Z2V0S2luZCgpIDw9IENFX0VORF9TSU1QTEVfQ0FMTFM7Ci0gIH0KLX07Ci0KLS8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIEMgZnVuY3Rpb24gb3Igc3RhdGljIEMrKyBtZW1iZXIgZnVuY3Rpb24gY2FsbC4KLS8vLwotLy8vIEV4YW1wbGU6IFxjIGZ1bigpCi1jbGFzcyBGdW5jdGlvbkNhbGwgOiBwdWJsaWMgU2ltcGxlQ2FsbCB7Ci0gIGZyaWVuZCBjbGFzcyBDYWxsRXZlbnRNYW5hZ2VyOwotCi1wcm90ZWN0ZWQ6Ci0gIEZ1bmN0aW9uQ2FsbChjb25zdCBDYWxsRXhwciAqQ0UsIFByb2dyYW1TdGF0ZVJlZiBTdCwKLSAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkKLSAgICA6IFNpbXBsZUNhbGwoQ0UsIFN0LCBMQ3R4KSB7fQotCi0gIEZ1bmN0aW9uQ2FsbChjb25zdCBGdW5jdGlvbkNhbGwgJk90aGVyKSA6IFNpbXBsZUNhbGwoT3RoZXIpIHt9Ci0gIHZpcnR1YWwgdm9pZCBjbG9uZVRvKHZvaWQgKkRlc3QpIGNvbnN0IHsgbmV3IChEZXN0KSBGdW5jdGlvbkNhbGwoKnRoaXMpOyB9Ci0KLXB1YmxpYzoKLSAgdmlydHVhbCBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBDRV9GdW5jdGlvbjsgfQorICBLaW5kIGdldEtpbmQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDRV9GdW5jdGlvbjsgfQogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ2FsbEV2ZW50ICpDQSkgewogICAgIHJldHVybiBDQS0+Z2V0S2luZCgpID09IENFX0Z1bmN0aW9uOwpAQCAtNDgzLDQ3ICs0NjEsNTYgQEAKIC8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIGNhbGwgdG8gYSBibG9jay4KIC8vLwogLy8vIEV4YW1wbGU6IDx0dD5eeyAvKiAuLi4gKi8gfSgpPC90dD4KLWNsYXNzIEJsb2NrQ2FsbCA6IHB1YmxpYyBTaW1wbGVDYWxsIHsKK2NsYXNzIEJsb2NrQ2FsbCA6IHB1YmxpYyBDYWxsRXZlbnQgewogICBmcmllbmQgY2xhc3MgQ2FsbEV2ZW50TWFuYWdlcjsKIAogcHJvdGVjdGVkOgogICBCbG9ja0NhbGwoY29uc3QgQ2FsbEV4cHIgKkNFLCBQcm9ncmFtU3RhdGVSZWYgU3QsCiAgICAgICAgICAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpCi0gICAgOiBTaW1wbGVDYWxsKENFLCBTdCwgTEN0eCkge30KKyAgICA6IENhbGxFdmVudChDRSwgU3QsIExDdHgpIHt9CiAKLSAgQmxvY2tDYWxsKGNvbnN0IEJsb2NrQ2FsbCAmT3RoZXIpIDogU2ltcGxlQ2FsbChPdGhlcikge30KLSAgdmlydHVhbCB2b2lkIGNsb25lVG8odm9pZCAqRGVzdCkgY29uc3QgeyBuZXcgKERlc3QpIEJsb2NrQ2FsbCgqdGhpcyk7IH0KKyAgQmxvY2tDYWxsKGNvbnN0IEJsb2NrQ2FsbCAmT3RoZXIpIDogQ2FsbEV2ZW50KE90aGVyKSB7fQorICB2b2lkIGNsb25lVG8odm9pZCAqRGVzdCkgY29uc3Qgb3ZlcnJpZGUgeyBuZXcgKERlc3QpIEJsb2NrQ2FsbCgqdGhpcyk7IH0KIAotICB2aXJ0dWFsIHZvaWQgZ2V0RXh0cmFJbnZhbGlkYXRlZFZhbHVlcyhWYWx1ZUxpc3QgJlZhbHVlcykgY29uc3Q7CisgIHZvaWQgZ2V0RXh0cmFJbnZhbGlkYXRlZFZhbHVlcyhWYWx1ZUxpc3QgJlZhbHVlcykgY29uc3Qgb3ZlcnJpZGU7CiAKIHB1YmxpYzoKKyAgdmlydHVhbCBjb25zdCBDYWxsRXhwciAqZ2V0T3JpZ2luRXhwcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDYWxsRXhwcj4oQ2FsbEV2ZW50OjpnZXRPcmlnaW5FeHByKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0TnVtQXJncygpOyB9CisKKyAgY29uc3QgRXhwciAqZ2V0QXJnRXhwcih1bnNpZ25lZCBJbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBnZXRPcmlnaW5FeHByKCktPmdldEFyZyhJbmRleCk7CisgIH0KKwogICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZSBvZiB0aGUgYmxvY2suCiAgIC8vLwogICAvLy8gVGhpcyBtYXkgYmUgTlVMTCBpZiB0aGUgYmxvY2sncyBvcmlnaW4gaXMgdW5rbm93bi4KICAgY29uc3QgQmxvY2tEYXRhUmVnaW9uICpnZXRCbG9ja1JlZ2lvbigpIGNvbnN0OwogCi0gIC8vLyBcYnJpZWYgR2V0cyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGJsb2NrLgotICAvLy8KLSAgLy8vIFRoaXMgaXMgbm90IGFuIG92ZXJyaWRlIG9mIGdldERlY2woKSBiZWNhdXNlIEFueUZ1bmN0aW9uQ2FsbCBoYXMgYWxyZWFkeQotICAvLy8gYXNzdW1lZCB0aGF0IGl0J3MgYSBGdW5jdGlvbkRlY2wuCi0gIGNvbnN0IEJsb2NrRGVjbCAqZ2V0QmxvY2tEZWNsKCkgY29uc3QgeworICBjb25zdCBCbG9ja0RlY2wgKmdldERlY2woKSBjb25zdCBvdmVycmlkZSB7CiAgICAgY29uc3QgQmxvY2tEYXRhUmVnaW9uICpCUiA9IGdldEJsb2NrUmVnaW9uKCk7CiAgICAgaWYgKCFCUikKICAgICAgIHJldHVybiAwOwogICAgIHJldHVybiBCUi0+Z2V0RGVjbCgpOwogICB9CiAKLSAgdmlydHVhbCBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gUnVudGltZURlZmluaXRpb24oZ2V0QmxvY2tEZWNsKCkpOworICBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUnVudGltZURlZmluaXRpb24oZ2V0RGVjbCgpKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBnZXRJbml0aWFsU3RhY2tGcmFtZUNvbnRlbnRzKGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzVHkgJkJpbmRpbmdzKSBjb25zdDsKKyAgYm9vbCBhcmd1bWVudHNNYXlFc2NhcGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KIAotICB2aXJ0dWFsIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgY29uc3Q7Ci0gIHZpcnR1YWwgcGFyYW1faXRlcmF0b3IgcGFyYW1fZW5kKCkgY29uc3Q7CisgIHZvaWQgZ2V0SW5pdGlhbFN0YWNrRnJhbWVDb250ZW50cyhjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqQ2FsbGVlQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ3NUeSAmQmluZGluZ3MpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gQ0VfQmxvY2s7IH0KKyAgQXJyYXlSZWY8UGFybVZhckRlY2wqPiBwYXJhbWV0ZXJzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgS2luZCBnZXRLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQ0VfQmxvY2s7IH0KIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENhbGxFdmVudCAqQ0EpIHsKICAgICByZXR1cm4gQ0EtPmdldEtpbmQoKSA9PSBDRV9CbG9jazsKQEAgLTUzNCw3ICs1MjEsNyBAQAogLy8vIGl0IGlzIHdyaXR0ZW4uCiBjbGFzcyBDWFhJbnN0YW5jZUNhbGwgOiBwdWJsaWMgQW55RnVuY3Rpb25DYWxsIHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIGdldEV4dHJhSW52YWxpZGF0ZWRWYWx1ZXMoVmFsdWVMaXN0ICZWYWx1ZXMpIGNvbnN0OworICB2b2lkIGdldEV4dHJhSW52YWxpZGF0ZWRWYWx1ZXMoVmFsdWVMaXN0ICZWYWx1ZXMpIGNvbnN0IG92ZXJyaWRlOwogCiAgIENYWEluc3RhbmNlQ2FsbChjb25zdCBDYWxsRXhwciAqQ0UsIFByb2dyYW1TdGF0ZVJlZiBTdCwKICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkKQEAgLTU1MywxMiArNTQwLDEyIEBACiAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGltcGxpY2l0ICd0aGlzJyBvYmplY3QuCiAgIHZpcnR1YWwgU1ZhbCBnZXRDWFhUaGlzVmFsKCkgY29uc3Q7CiAKLSAgdmlydHVhbCBjb25zdCBGdW5jdGlvbkRlY2wgKmdldERlY2woKSBjb25zdDsKKyAgY29uc3QgRnVuY3Rpb25EZWNsICpnZXREZWNsKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0OworICBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBnZXRJbml0aWFsU3RhY2tGcmFtZUNvbnRlbnRzKGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzVHkgJkJpbmRpbmdzKSBjb25zdDsKKyAgdm9pZCBnZXRJbml0aWFsU3RhY2tGcmFtZUNvbnRlbnRzKGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nc1R5ICZCaW5kaW5ncykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDYWxsRXZlbnQgKkNBKSB7CiAgICAgcmV0dXJuIENBLT5nZXRLaW5kKCkgPj0gQ0VfQkVHX0NYWF9JTlNUQU5DRV9DQUxMUyAmJgpAQCAtNTc4LDI4ICs1NjUsMjggQEAKICAgICA6IENYWEluc3RhbmNlQ2FsbChDRSwgU3QsIExDdHgpIHt9CiAKICAgQ1hYTWVtYmVyQ2FsbChjb25zdCBDWFhNZW1iZXJDYWxsICZPdGhlcikgOiBDWFhJbnN0YW5jZUNhbGwoT3RoZXIpIHt9Ci0gIHZpcnR1YWwgdm9pZCBjbG9uZVRvKHZvaWQgKkRlc3QpIGNvbnN0IHsgbmV3IChEZXN0KSBDWFhNZW1iZXJDYWxsKCp0aGlzKTsgfQorICB2b2lkIGNsb25lVG8odm9pZCAqRGVzdCkgY29uc3Qgb3ZlcnJpZGUgeyBuZXcgKERlc3QpIENYWE1lbWJlckNhbGwoKnRoaXMpOyB9CiAKIHB1YmxpYzoKICAgdmlydHVhbCBjb25zdCBDWFhNZW1iZXJDYWxsRXhwciAqZ2V0T3JpZ2luRXhwcigpIGNvbnN0IHsKICAgICByZXR1cm4gY2FzdDxDWFhNZW1iZXJDYWxsRXhwcj4oQ1hYSW5zdGFuY2VDYWxsOjpnZXRPcmlnaW5FeHByKCkpOwogICB9CiAKLSAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIGlmIChjb25zdCBDYWxsRXhwciAqQ0UgPSBnZXRPcmlnaW5FeHByKCkpCiAgICAgICByZXR1cm4gQ0UtPmdldE51bUFyZ3MoKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIHZpcnR1YWwgY29uc3QgRXhwciAqZ2V0QXJnRXhwcih1bnNpZ25lZCBJbmRleCkgY29uc3QgeworICBjb25zdCBFeHByICpnZXRBcmdFeHByKHVuc2lnbmVkIEluZGV4KSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0QXJnKEluZGV4KTsKICAgfQogCi0gIHZpcnR1YWwgY29uc3QgRXhwciAqZ2V0Q1hYVGhpc0V4cHIoKSBjb25zdDsKLSAgCi0gIHZpcnR1YWwgUnVudGltZURlZmluaXRpb24gZ2V0UnVudGltZURlZmluaXRpb24oKSBjb25zdDsKKyAgY29uc3QgRXhwciAqZ2V0Q1hYVGhpc0V4cHIoKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIENFX0NYWE1lbWJlcjsgfQorICBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0IG92ZXJyaWRlOworCisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIENFX0NYWE1lbWJlcjsgfQogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ2FsbEV2ZW50ICpDQSkgewogICAgIHJldHVybiBDQS0+Z2V0S2luZCgpID09IENFX0NYWE1lbWJlcjsKQEAgLTYyMCw3ICs2MDcsNyBAQAogCiAgIENYWE1lbWJlck9wZXJhdG9yQ2FsbChjb25zdCBDWFhNZW1iZXJPcGVyYXRvckNhbGwgJk90aGVyKQogICAgIDogQ1hYSW5zdGFuY2VDYWxsKE90aGVyKSB7fQotICB2aXJ0dWFsIHZvaWQgY2xvbmVUbyh2b2lkICpEZXN0KSBjb25zdCB7CisgIHZvaWQgY2xvbmVUbyh2b2lkICpEZXN0KSBjb25zdCBvdmVycmlkZSB7CiAgICAgbmV3IChEZXN0KSBDWFhNZW1iZXJPcGVyYXRvckNhbGwoKnRoaXMpOwogICB9CiAKQEAgLTYyOSwxNiArNjE2LDE2IEBACiAgICAgcmV0dXJuIGNhc3Q8Q1hYT3BlcmF0b3JDYWxsRXhwcj4oQ1hYSW5zdGFuY2VDYWxsOjpnZXRPcmlnaW5FeHByKCkpOwogICB9CiAKLSAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBnZXRPcmlnaW5FeHByKCktPmdldE51bUFyZ3MoKSAtIDE7CiAgIH0KLSAgdmlydHVhbCBjb25zdCBFeHByICpnZXRBcmdFeHByKHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgIGNvbnN0IEV4cHIgKmdldEFyZ0V4cHIodW5zaWduZWQgSW5kZXgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXRBcmcoSW5kZXggKyAxKTsKICAgfQogCi0gIHZpcnR1YWwgY29uc3QgRXhwciAqZ2V0Q1hYVGhpc0V4cHIoKSBjb25zdDsKKyAgY29uc3QgRXhwciAqZ2V0Q1hYVGhpc0V4cHIoKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIENFX0NYWE1lbWJlck9wZXJhdG9yOyB9CisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIENFX0NYWE1lbWJlck9wZXJhdG9yOyB9CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDYWxsRXZlbnQgKkNBKSB7CiAgICAgcmV0dXJuIENBLT5nZXRLaW5kKCkgPT0gQ0VfQ1hYTWVtYmVyT3BlcmF0b3I7CkBAIC02NzEsMjMgKzY1OCwyMyBAQAogICB9CiAKICAgQ1hYRGVzdHJ1Y3RvckNhbGwoY29uc3QgQ1hYRGVzdHJ1Y3RvckNhbGwgJk90aGVyKSA6IENYWEluc3RhbmNlQ2FsbChPdGhlcikge30KLSAgdmlydHVhbCB2b2lkIGNsb25lVG8odm9pZCAqRGVzdCkgY29uc3QgeyBuZXcgKERlc3QpIENYWERlc3RydWN0b3JDYWxsKCp0aGlzKTsgfQorICB2b2lkIGNsb25lVG8odm9pZCAqRGVzdCkgY29uc3Qgb3ZlcnJpZGUge25ldyAoRGVzdCkgQ1hYRGVzdHJ1Y3RvckNhbGwoKnRoaXMpO30KIAogcHVibGljOgotICB2aXJ0dWFsIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3QgeyByZXR1cm4gTG9jYXRpb247IH0KLSAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeyByZXR1cm4gMDsgfQorICBTb3VyY2VSYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIExvY2F0aW9uOyB9CisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAwOyB9CiAKLSAgdmlydHVhbCBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0OworICBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGltcGxpY2l0ICd0aGlzJyBvYmplY3QuCi0gIHZpcnR1YWwgU1ZhbCBnZXRDWFhUaGlzVmFsKCkgY29uc3Q7CisgIFNWYWwgZ2V0Q1hYVGhpc1ZhbCgpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGNhbGwgdG8gYSBiYXNlIGNsYXNzIGRlc3RydWN0b3IuCiAgIGJvb2wgaXNCYXNlRGVzdHJ1Y3RvcigpIGNvbnN0IHsKICAgICByZXR1cm4gRHRvckRhdGFUeTo6Z2V0RnJvbU9wYXF1ZVZhbHVlKERhdGEpLmdldEludCgpOwogICB9CiAKLSAgdmlydHVhbCBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBDRV9DWFhEZXN0cnVjdG9yOyB9CisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIENFX0NYWERlc3RydWN0b3I7IH0KIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENhbGxFdmVudCAqQ0EpIHsKICAgICByZXR1cm4gQ0EtPmdldEtpbmQoKSA9PSBDRV9DWFhEZXN0cnVjdG9yOwpAQCAtNzE1LDMyICs3MDIsMzIgQEAKICAgfQogCiAgIENYWENvbnN0cnVjdG9yQ2FsbChjb25zdCBDWFhDb25zdHJ1Y3RvckNhbGwgJk90aGVyKSA6IEFueUZ1bmN0aW9uQ2FsbChPdGhlcil7fQotICB2aXJ0dWFsIHZvaWQgY2xvbmVUbyh2b2lkICpEZXN0KSBjb25zdCB7IG5ldyAoRGVzdCkgQ1hYQ29uc3RydWN0b3JDYWxsKCp0aGlzKTsgfQorICB2b2lkIGNsb25lVG8odm9pZCAqRGVzdCkgY29uc3Qgb3ZlcnJpZGUgeyBuZXcgKERlc3QpIENYWENvbnN0cnVjdG9yQ2FsbCgqdGhpcyk7IH0KIAotICB2aXJ0dWFsIHZvaWQgZ2V0RXh0cmFJbnZhbGlkYXRlZFZhbHVlcyhWYWx1ZUxpc3QgJlZhbHVlcykgY29uc3Q7CisgIHZvaWQgZ2V0RXh0cmFJbnZhbGlkYXRlZFZhbHVlcyhWYWx1ZUxpc3QgJlZhbHVlcykgY29uc3Qgb3ZlcnJpZGU7CiAKIHB1YmxpYzoKICAgdmlydHVhbCBjb25zdCBDWFhDb25zdHJ1Y3RFeHByICpnZXRPcmlnaW5FeHByKCkgY29uc3QgewogICAgIHJldHVybiBjYXN0PENYWENvbnN0cnVjdEV4cHI+KEFueUZ1bmN0aW9uQ2FsbDo6Z2V0T3JpZ2luRXhwcigpKTsKICAgfQogCi0gIHZpcnR1YWwgY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpnZXREZWNsKCkgY29uc3QgeworICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKmdldERlY2woKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0Q29uc3RydWN0b3IoKTsKICAgfQogCi0gIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IHsgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0TnVtQXJncygpOyB9CisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBnZXRPcmlnaW5FeHByKCktPmdldE51bUFyZ3MoKTsgfQogCi0gIHZpcnR1YWwgY29uc3QgRXhwciAqZ2V0QXJnRXhwcih1bnNpZ25lZCBJbmRleCkgY29uc3QgeworICBjb25zdCBFeHByICpnZXRBcmdFeHByKHVuc2lnbmVkIEluZGV4KSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0QXJnKEluZGV4KTsKICAgfQogCiAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGltcGxpY2l0ICd0aGlzJyBvYmplY3QuCiAgIFNWYWwgZ2V0Q1hYVGhpc1ZhbCgpIGNvbnN0OwogCi0gIHZpcnR1YWwgdm9pZCBnZXRJbml0aWFsU3RhY2tGcmFtZUNvbnRlbnRzKGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzVHkgJkJpbmRpbmdzKSBjb25zdDsKKyAgdm9pZCBnZXRJbml0aWFsU3RhY2tGcmFtZUNvbnRlbnRzKGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nc1R5ICZCaW5kaW5ncykgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBDRV9DWFhDb25zdHJ1Y3RvcjsgfQorICBLaW5kIGdldEtpbmQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDRV9DWFhDb25zdHJ1Y3RvcjsgfQogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ2FsbEV2ZW50ICpDQSkgewogICAgIHJldHVybiBDQS0+Z2V0S2luZCgpID09IENFX0NYWENvbnN0cnVjdG9yOwpAQCAtNzU5LDI5ICs3NDYsMjkgQEAKICAgICA6IEFueUZ1bmN0aW9uQ2FsbChFLCBTdCwgTEN0eCkge30KIAogICBDWFhBbGxvY2F0b3JDYWxsKGNvbnN0IENYWEFsbG9jYXRvckNhbGwgJk90aGVyKSA6IEFueUZ1bmN0aW9uQ2FsbChPdGhlcikge30KLSAgdmlydHVhbCB2b2lkIGNsb25lVG8odm9pZCAqRGVzdCkgY29uc3QgeyBuZXcgKERlc3QpIENYWEFsbG9jYXRvckNhbGwoKnRoaXMpOyB9CisgIHZvaWQgY2xvbmVUbyh2b2lkICpEZXN0KSBjb25zdCBvdmVycmlkZSB7IG5ldyAoRGVzdCkgQ1hYQWxsb2NhdG9yQ2FsbCgqdGhpcyk7IH0KIAogcHVibGljOgogICB2aXJ0dWFsIGNvbnN0IENYWE5ld0V4cHIgKmdldE9yaWdpbkV4cHIoKSBjb25zdCB7CiAgICAgcmV0dXJuIGNhc3Q8Q1hYTmV3RXhwcj4oQW55RnVuY3Rpb25DYWxsOjpnZXRPcmlnaW5FeHByKCkpOwogICB9CiAKLSAgdmlydHVhbCBjb25zdCBGdW5jdGlvbkRlY2wgKmdldERlY2woKSBjb25zdCB7CisgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXRPcGVyYXRvck5ldygpOwogICB9CiAKLSAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBnZXRPcmlnaW5FeHByKCktPmdldE51bVBsYWNlbWVudEFyZ3MoKSArIDE7CiAgIH0KIAotICB2aXJ0dWFsIGNvbnN0IEV4cHIgKmdldEFyZ0V4cHIodW5zaWduZWQgSW5kZXgpIGNvbnN0IHsKKyAgY29uc3QgRXhwciAqZ2V0QXJnRXhwcih1bnNpZ25lZCBJbmRleCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBvZiBhbiBhbGxvY2F0b3IgY2FsbCBpcyB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGlvbi4KICAgICBpZiAoSW5kZXggPT0gMCkKICAgICAgIHJldHVybiAwOwogICAgIHJldHVybiBnZXRPcmlnaW5FeHByKCktPmdldFBsYWNlbWVudEFyZyhJbmRleCAtIDEpOwogICB9CiAKLSAgdmlydHVhbCBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBDRV9DWFhBbGxvY2F0b3I7IH0KKyAgS2luZCBnZXRLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQ0VfQ1hYQWxsb2NhdG9yOyB9CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDYWxsRXZlbnQgKkNFKSB7CiAgICAgcmV0dXJuIENFLT5nZXRLaW5kKCkgPT0gQ0VfQ1hYQWxsb2NhdG9yOwpAQCAtODE0LDkgKzgwMSw5IEBACiAgIH0KIAogICBPYmpDTWV0aG9kQ2FsbChjb25zdCBPYmpDTWV0aG9kQ2FsbCAmT3RoZXIpIDogQ2FsbEV2ZW50KE90aGVyKSB7fQotICB2aXJ0dWFsIHZvaWQgY2xvbmVUbyh2b2lkICpEZXN0KSBjb25zdCB7IG5ldyAoRGVzdCkgT2JqQ01ldGhvZENhbGwoKnRoaXMpOyB9CisgIHZvaWQgY2xvbmVUbyh2b2lkICpEZXN0KSBjb25zdCBvdmVycmlkZSB7IG5ldyAoRGVzdCkgT2JqQ01ldGhvZENhbGwoKnRoaXMpOyB9CiAKLSAgdmlydHVhbCB2b2lkIGdldEV4dHJhSW52YWxpZGF0ZWRWYWx1ZXMoVmFsdWVMaXN0ICZWYWx1ZXMpIGNvbnN0OworICB2b2lkIGdldEV4dHJhSW52YWxpZGF0ZWRWYWx1ZXMoVmFsdWVMaXN0ICZWYWx1ZXMpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vLyBDaGVjayBpZiB0aGUgc2VsZWN0b3IgbWF5IGhhdmUgbXVsdGlwbGUgZGVmaW5pdGlvbnMgKG1heSBoYXZlIG92ZXJyaWRlcykuCiAgIHZpcnR1YWwgYm9vbCBjYW5CZU92ZXJyaWRlbkluU3ViY2xhc3MoT2JqQ0ludGVyZmFjZURlY2wgKklEZWNsLApAQCAtODI2LDEzICs4MTMsMTMgQEAKICAgdmlydHVhbCBjb25zdCBPYmpDTWVzc2FnZUV4cHIgKmdldE9yaWdpbkV4cHIoKSBjb25zdCB7CiAgICAgcmV0dXJuIGNhc3Q8T2JqQ01lc3NhZ2VFeHByPihDYWxsRXZlbnQ6OmdldE9yaWdpbkV4cHIoKSk7CiAgIH0KLSAgdmlydHVhbCBjb25zdCBPYmpDTWV0aG9kRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsKKyAgY29uc3QgT2JqQ01ldGhvZERlY2wgKmdldERlY2woKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGdldE9yaWdpbkV4cHIoKS0+Z2V0TWV0aG9kRGVjbCgpOwogICB9Ci0gIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IHsKKyAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXROdW1BcmdzKCk7CiAgIH0KLSAgdmlydHVhbCBjb25zdCBFeHByICpnZXRBcmdFeHByKHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgIGNvbnN0IEV4cHIgKmdldEFyZ0V4cHIodW5zaWduZWQgSW5kZXgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gZ2V0T3JpZ2luRXhwcigpLT5nZXRBcmcoSW5kZXgpOwogICB9CiAKQEAgLTg0Niw3ICs4MzMsNyBAQAogICAgIHJldHVybiBnZXRPcmlnaW5FeHByKCktPmdldFNlbGVjdG9yKCk7CiAgIH0KIAotICB2aXJ0dWFsIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Q7CisgIFNvdXJjZVJhbmdlIGdldFNvdXJjZVJhbmdlKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZXIgYXQgdGhlIHRpbWUgb2YgdGhpcyBjYWxsLgogICBTVmFsIGdldFJlY2VpdmVyU1ZhbCgpIGNvbnN0OwpAQCAtODgzLDE1ICs4NzAsMTYgQEAKICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIG1lc3NhZ2Uga2luZCIpOwogICB9CiAKLSAgdmlydHVhbCBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0OworICBSdW50aW1lRGVmaW5pdGlvbiBnZXRSdW50aW1lRGVmaW5pdGlvbigpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBnZXRJbml0aWFsU3RhY2tGcmFtZUNvbnRlbnRzKGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpDYWxsZWVDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzVHkgJkJpbmRpbmdzKSBjb25zdDsKKyAgYm9vbCBhcmd1bWVudHNNYXlFc2NhcGUoKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHBhcmFtX2l0ZXJhdG9yIHBhcmFtX2JlZ2luKCkgY29uc3Q7Ci0gIHZpcnR1YWwgcGFyYW1faXRlcmF0b3IgcGFyYW1fZW5kKCkgY29uc3Q7CisgIHZvaWQgZ2V0SW5pdGlhbFN0YWNrRnJhbWVDb250ZW50cyhjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqQ2FsbGVlQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ3NUeSAmQmluZGluZ3MpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gQ0VfT2JqQ01lc3NhZ2U7IH0KKyAgQXJyYXlSZWY8UGFybVZhckRlY2wqPiBwYXJhbWV0ZXJzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgS2luZCBnZXRLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQ0VfT2JqQ01lc3NhZ2U7IH0KIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENhbGxFdmVudCAqQ0EpIHsKICAgICByZXR1cm4gQ0EtPmdldEtpbmQoKSA9PSBDRV9PYmpDTWVzc2FnZTsKQEAgLTkxMSw2ICs4OTksNyBAQAogCiAgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jOwogICBTbWFsbFZlY3Rvcjx2b2lkICosIDg+IENhY2hlOworICB0eXBlZGVmIFNpbXBsZUZ1bmN0aW9uQ2FsbCBDYWxsRXZlbnRUZW1wbGF0ZVR5OwogCiAgIHZvaWQgcmVjbGFpbShjb25zdCB2b2lkICpNZW1vcnkpIHsKICAgICBDYWNoZS5wdXNoX2JhY2soY29uc3RfY2FzdDx2b2lkICo+KE1lbW9yeSkpOwpAQCAtOTE5LDI0ICs5MDgsMzAgQEAKICAgLy8vIFJldHVybnMgbWVtb3J5IHRoYXQgY2FuIGJlIGluaXRpYWxpemVkIGFzIGEgQ2FsbEV2ZW50LgogICB2b2lkICphbGxvY2F0ZSgpIHsKICAgICBpZiAoQ2FjaGUuZW1wdHkoKSkKLSAgICAgIHJldHVybiBBbGxvYy5BbGxvY2F0ZTxGdW5jdGlvbkNhbGw+KCk7CisgICAgICByZXR1cm4gQWxsb2MuQWxsb2NhdGU8Q2FsbEV2ZW50VGVtcGxhdGVUeT4oKTsKICAgICBlbHNlCiAgICAgICByZXR1cm4gQ2FjaGUucG9wX2JhY2tfdmFsKCk7CiAgIH0KIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnPgogICBUICpjcmVhdGUoQXJnIEEsIFByb2dyYW1TdGF0ZVJlZiBTdCwgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4KSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoVCkgPT0gc2l6ZW9mKENhbGxFdmVudFRlbXBsYXRlVHkpLAorICAgICAgICAgICAgICAgICAgIkNhbGxFdmVudCBzdWJjbGFzc2VzIGFyZSBub3QgYWxsIHRoZSBzYW1lIHNpemUiKTsKICAgICByZXR1cm4gbmV3IChhbGxvY2F0ZSgpKSBUKEEsIFN0LCBMQ3R4KTsKICAgfQogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgogICBUICpjcmVhdGUoQXJnMSBBMSwgQXJnMiBBMiwgUHJvZ3JhbVN0YXRlUmVmIFN0LCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA9PSBzaXplb2YoQ2FsbEV2ZW50VGVtcGxhdGVUeSksCisgICAgICAgICAgICAgICAgICAiQ2FsbEV2ZW50IHN1YmNsYXNzZXMgYXJlIG5vdCBhbGwgdGhlIHNhbWUgc2l6ZSIpOwogICAgIHJldHVybiBuZXcgKGFsbG9jYXRlKCkpIFQoQTEsIEEyLCBTdCwgTEN0eCk7CiAgIH0KIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMz4KICAgVCAqY3JlYXRlKEFyZzEgQTEsIEFyZzIgQTIsIEFyZzMgQTMsIFByb2dyYW1TdGF0ZVJlZiBTdCwKICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCkgeworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQpID09IHNpemVvZihDYWxsRXZlbnRUZW1wbGF0ZVR5KSwKKyAgICAgICAgICAgICAgICAgICJDYWxsRXZlbnQgc3ViY2xhc3NlcyBhcmUgbm90IGFsbCB0aGUgc2FtZSBzaXplIik7CiAgICAgcmV0dXJuIG5ldyAoYWxsb2NhdGUoKSkgVChBMSwgQTIsIEEzLCBTdCwgTEN0eCk7CiAgIH0KIApAQCAtOTQ0LDYgKzkzOSw4IEBACiAgICAgICAgICAgICB0eXBlbmFtZSBBcmc0PgogICBUICpjcmVhdGUoQXJnMSBBMSwgQXJnMiBBMiwgQXJnMyBBMywgQXJnNCBBNCwgUHJvZ3JhbVN0YXRlUmVmIFN0LAogICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4KSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoVCkgPT0gc2l6ZW9mKENhbGxFdmVudFRlbXBsYXRlVHkpLAorICAgICAgICAgICAgICAgICAgIkNhbGxFdmVudCBzdWJjbGFzc2VzIGFyZSBub3QgYWxsIHRoZSBzYW1lIHNpemUiKTsKICAgICByZXR1cm4gbmV3IChhbGxvY2F0ZSgpKSBUKEExLCBBMiwgQTMsIEE0LCBTdCwgTEN0eCk7CiAgIH0KIApAQCAtOTg5LDcgKzk4Niw4IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIENhbGxFdmVudFJlZjxUPiBDYWxsRXZlbnQ6OmNsb25lV2l0aFN0YXRlKFByb2dyYW1TdGF0ZVJlZiBOZXdTdGF0ZSkgY29uc3QgewogICBhc3NlcnQoaXNhPFQ+KCp0aGlzKSAmJiAiQ2xvbmluZyB0byB1bnJlbGF0ZWQgdHlwZSIpOwotICBhc3NlcnQoc2l6ZW9mKFQpID09IHNpemVvZihDYWxsRXZlbnQpICYmICJTdWJjbGFzc2VzIG1heSBub3QgYWRkIGZpZWxkcyIpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA9PSBzaXplb2YoQ2FsbEV2ZW50KSwKKyAgICAgICAgICAgICAgICAiU3ViY2xhc3NlcyBtYXkgbm90IGFkZCBmaWVsZHMiKTsKIAogICBpZiAoTmV3U3RhdGUgPT0gU3RhdGUpCiAgICAgcmV0dXJuIGNhc3Q8VD4odGhpcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Db3JlRW5naW5lLmggYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Db3JlRW5naW5lLmgKaW5kZXggYTJlMjExZS4uMTRhMDQxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ29yZUVuZ2luZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0NvcmVFbmdpbmUuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9FeHBsb2RlZEdyYXBoLmgiCiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0Z1bmN0aW9uU3VtbWFyeS5oIgogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Xb3JrTGlzdC5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGNsYW5nIHsKIApAQCAtNjAsMTIgKzYwLDEyIEBACiAgIFN1YkVuZ2luZSYgU3ViRW5nOwogCiAgIC8vLyBHIC0gVGhlIHNpbXVsYXRpb24gZ3JhcGguICBFYWNoIG5vZGUgaXMgYSAobG9jYXRpb24sc3RhdGUpIHBhaXIuCi0gIE93bmluZ1B0cjxFeHBsb2RlZEdyYXBoPiBHOworICBzdGQ6OnVuaXF1ZV9wdHI8RXhwbG9kZWRHcmFwaD4gRzsKIAogICAvLy8gV0xpc3QgLSBBIHNldCBvZiBxdWV1ZWQgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUKICAgLy8vICB3b3JrbGlzdCBhbGdvcml0aG0uICBJdCBpcyB1cCB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgV0xpc3QgdG8gZGVjaWRlCiAgIC8vLyAgdGhlIG9yZGVyIHRoYXQgbm9kZXMgYXJlIHByb2Nlc3NlZC4KLSAgT3duaW5nUHRyPFdvcmtMaXN0PiBXTGlzdDsKKyAgc3RkOjp1bmlxdWVfcHRyPFdvcmtMaXN0PiBXTGlzdDsKIAogICAvLy8gQkNvdW50ZXJGYWN0b3J5IC0gQSBmYWN0b3J5IG9iamVjdCBmb3IgY3JlYXRlZCBCbG9ja0NvdW50ZXIgb2JqZWN0cy4KICAgLy8vICAgVGhlc2UgYXJlIHVzZWQgdG8gcmVjb3JkIGZvciBrZXkgbm9kZXMgaW4gdGhlIEV4cGxvZGVkR3JhcGggdGhlCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogICAvLy8gdGFrZUdyYXBoIC0gUmV0dXJucyB0aGUgZXhwbG9kZWQgZ3JhcGguICBPd25lcnNoaXAgb2YgdGhlIGdyYXBoIGlzCiAgIC8vLyAgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxlci4KLSAgRXhwbG9kZWRHcmFwaCogdGFrZUdyYXBoKCkgeyByZXR1cm4gRy50YWtlKCk7IH0KKyAgRXhwbG9kZWRHcmFwaCAqdGFrZUdyYXBoKCkgeyByZXR1cm4gRy5yZWxlYXNlKCk7IH0KIAogICAvLy8gRXhlY3V0ZVdvcmtMaXN0IC0gUnVuIHRoZSB3b3JrbGlzdCBhbGdvcml0aG0gZm9yIGEgbWF4aW11bSBudW1iZXIgb2YKICAgLy8vICBzdGVwcy4gIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBzdGlsbCBzaW11bGF0aW9uIHN0YXRlIG9uIHRoZSB3b3JrbGlzdC4KQEAgLTMxMiw3ICszMTIsNyBAQAogLy8vIFxjbGFzcyBOb2RlQnVpbGRlcldpdGhTaW5rcwogLy8vIFxicmllZiBUaGlzIG5vZGUgYnVpbGRlciBrZWVwcyB0cmFjayBvZiB0aGUgZ2VuZXJhdGVkIHNpbmsgbm9kZXMuCiBjbGFzcyBOb2RlQnVpbGRlcldpdGhTaW5rczogcHVibGljIE5vZGVCdWlsZGVyIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogcHJvdGVjdGVkOgogICBTbWFsbFZlY3RvcjxFeHBsb2RlZE5vZGUqLCAyPiBzaW5rc0dlbmVyYXRlZDsKICAgUHJvZ3JhbVBvaW50ICZMb2NhdGlvbjsKQEAgLTM5OSw3ICszOTksNyBAQAogLy8vIFxicmllZiBCcmFuY2hOb2RlQnVpbGRlciBpcyByZXNwb25zaWJsZSBmb3IgY29uc3RydWN0aW5nIHRoZSBub2RlcwogLy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR3byBicmFuY2hlcyBvZiB0aGUgaWYgc3RhdGVtZW50IC0gdHJ1ZSBhbmQgZmFsc2UuCiBjbGFzcyBCcmFuY2hOb2RlQnVpbGRlcjogcHVibGljIE5vZGVCdWlsZGVyIHsKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogICBjb25zdCBDRkdCbG9jayAqRHN0VDsKICAgY29uc3QgQ0ZHQmxvY2sgKkRzdEY7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0V4cGxvZGVkR3JhcGguaCBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0V4cGxvZGVkR3JhcGguaAppbmRleCBiZjE3Y2Q4Li43MDYwODFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9FeHBsb2RlZEdyYXBoLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvRXhwbG9kZWRHcmFwaC5oCkBAIC0yNywxMSArMjcsMTEgQEAKICNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGNsYW5nIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0V4cHJFbmdpbmUuaCBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0V4cHJFbmdpbmUuaAppbmRleCBkODlkZmZlLi4yZmJlNTY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9FeHByRW5naW5lLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvRXhwckVuZ2luZS5oCkBAIC00Myw3ICs0Myw2IEBACiAKIGNsYXNzIEFuYWx5c2lzTWFuYWdlcjsKIGNsYXNzIENhbGxFdmVudDsKLWNsYXNzIFNpbXBsZUNhbGw7CiBjbGFzcyBDWFhDb25zdHJ1Y3RvckNhbGw7CiAKIGNsYXNzIEV4cHJFbmdpbmUgOiBwdWJsaWMgU3ViRW5naW5lIHsKQEAgLTEyMyw3ICsxMjIsNyBAQAogICAvLy8gZ2V0Q29udGV4dCAtIFJldHVybiB0aGUgQVNUQ29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBhbmFseXNpcy4KICAgQVNUQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIEFNZ3IuZ2V0QVNUQ29udGV4dCgpOyB9CiAKLSAgdmlydHVhbCBBbmFseXNpc01hbmFnZXIgJmdldEFuYWx5c2lzTWFuYWdlcigpIHsgcmV0dXJuIEFNZ3I7IH0KKyAgQW5hbHlzaXNNYW5hZ2VyICZnZXRBbmFseXNpc01hbmFnZXIoKSBvdmVycmlkZSB7IHJldHVybiBBTWdyOyB9CiAKICAgQ2hlY2tlck1hbmFnZXIgJmdldENoZWNrZXJNYW5hZ2VyKCkgY29uc3QgewogICAgIHJldHVybiAqQU1nci5nZXRDaGVja2VyTWFuYWdlcigpOwpAQCAtMTU1LDcgKzE1NCw3IEBACiAKICAgLy8vIGdldEluaXRpYWxTdGF0ZSAtIFJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZSB1c2VkIGZvciB0aGUgcm9vdCB2ZXJ0ZXgKICAgLy8vICBpbiB0aGUgRXhwbG9kZWRHcmFwaC4KLSAgUHJvZ3JhbVN0YXRlUmVmIGdldEluaXRpYWxTdGF0ZShjb25zdCBMb2NhdGlvbkNvbnRleHQgKkluaXRMb2MpOworICBQcm9ncmFtU3RhdGVSZWYgZ2V0SW5pdGlhbFN0YXRlKGNvbnN0IExvY2F0aW9uQ29udGV4dCAqSW5pdExvYykgb3ZlcnJpZGU7CiAKICAgRXhwbG9kZWRHcmFwaCYgZ2V0R3JhcGgoKSB7IHJldHVybiBHOyB9CiAgIGNvbnN0IEV4cGxvZGVkR3JhcGgmIGdldEdyYXBoKCkgY29uc3QgeyByZXR1cm4gRzsgfQpAQCAtMTkzLDcgKzE5Miw3IEBACiAgIC8vLyBwcm9jZXNzQ0ZHRWxlbWVudCAtIENhbGxlZCBieSBDb3JlRW5naW5lLiBVc2VkIHRvIGdlbmVyYXRlIG5ldyBzdWNjZXNzb3IKICAgLy8vICBub2RlcyBieSBwcm9jZXNzaW5nIHRoZSAnZWZmZWN0cycgb2YgYSBDRkcgZWxlbWVudC4KICAgdm9pZCBwcm9jZXNzQ0ZHRWxlbWVudChjb25zdCBDRkdFbGVtZW50IEUsIEV4cGxvZGVkTm9kZSAqUHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdG10SWR4LCBOb2RlQnVpbGRlckNvbnRleHQgKkN0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3RtdElkeCwgTm9kZUJ1aWxkZXJDb250ZXh0ICpDdHgpIG92ZXJyaWRlOwogCiAgIHZvaWQgUHJvY2Vzc1N0bXQoY29uc3QgQ0ZHU3RtdCBTLCBFeHBsb2RlZE5vZGUgKlByZWQpOwogCkBAIC0yMDEsNyArMjAwLDkgQEAKIAogICB2b2lkIFByb2Nlc3NJbXBsaWNpdER0b3IoY29uc3QgQ0ZHSW1wbGljaXREdG9yIEQsIEV4cGxvZGVkTm9kZSAqUHJlZCk7CiAKLSAgdm9pZCBQcm9jZXNzQXV0b21hdGljT2JqRHRvcihjb25zdCBDRkdBdXRvbWF0aWNPYmpEdG9yIEQsIAorICB2b2lkIFByb2Nlc3NOZXdBbGxvY2F0b3IoY29uc3QgQ1hYTmV3RXhwciAqTkUsIEV4cGxvZGVkTm9kZSAqUHJlZCk7CisKKyAgdm9pZCBQcm9jZXNzQXV0b21hdGljT2JqRHRvcihjb25zdCBDRkdBdXRvbWF0aWNPYmpEdG9yIEQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLCBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CiAgIHZvaWQgUHJvY2Vzc0RlbGV0ZUR0b3IoY29uc3QgQ0ZHRGVsZXRlRHRvciBELAogICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwgRXhwbG9kZWROb2RlU2V0ICZEc3QpOwpAQCAtMjEzLDEwICsyMTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKIAogICAvLy8gQ2FsbGVkIGJ5IENvcmVFbmdpbmUgd2hlbiBwcm9jZXNzaW5nIHRoZSBlbnRyYW5jZSBvZiBhIENGR0Jsb2NrLgotICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NGR0Jsb2NrRW50cmFuY2UoY29uc3QgQmxvY2tFZGdlICZMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZUJ1aWxkZXJXaXRoU2lua3MgJm5vZGVCdWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkKTsKLSAgCisgIHZvaWQgcHJvY2Vzc0NGR0Jsb2NrRW50cmFuY2UoY29uc3QgQmxvY2tFZGdlICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVCdWlsZGVyV2l0aFNpbmtzICZub2RlQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQpIG92ZXJyaWRlOworIAogICAvLy8gUHJvY2Vzc0JyYW5jaCAtIENhbGxlZCBieSBDb3JlRW5naW5lLiAgVXNlZCB0byBnZW5lcmF0ZSBzdWNjZXNzb3IKICAgLy8vICBub2RlcyBieSBwcm9jZXNzaW5nIHRoZSAnZWZmZWN0cycgb2YgYSBicmFuY2ggY29uZGl0aW9uLgogICB2b2lkIHByb2Nlc3NCcmFuY2goY29uc3QgU3RtdCAqQ29uZGl0aW9uLCBjb25zdCBTdG10ICpUZXJtLCAKQEAgLTIyNCw3ICsyMjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkLAogICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqRHN0VCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGR0Jsb2NrICpEc3RGKTsKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGR0Jsb2NrICpEc3RGKSBvdmVycmlkZTsKIAogICAvLy8gQ2FsbGVkIGJ5IENvcmVFbmdpbmUuICBVc2VkIHRvIHByb2Nlc3NpbmcgYnJhbmNoaW5nIGJlaGF2aW9yCiAgIC8vLyBhdCBzdGF0aWMgaW5pdGFsaXplcnMuCkBAIC0yMzMsMjAgKzIzNCwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqRHN0VCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKkRzdEYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqRHN0Rikgb3ZlcnJpZGU7CiAKICAgLy8vIHByb2Nlc3NJbmRpcmVjdEdvdG8gLSBDYWxsZWQgYnkgQ29yZUVuZ2luZS4gIFVzZWQgdG8gZ2VuZXJhdGUgc3VjY2Vzc29yCiAgIC8vLyAgbm9kZXMgYnkgcHJvY2Vzc2luZyB0aGUgJ2VmZmVjdHMnIG9mIGEgY29tcHV0ZWQgZ290byBqdW1wLgotICB2b2lkIHByb2Nlc3NJbmRpcmVjdEdvdG8oSW5kaXJlY3RHb3RvTm9kZUJ1aWxkZXImIGJ1aWxkZXIpOworICB2b2lkIHByb2Nlc3NJbmRpcmVjdEdvdG8oSW5kaXJlY3RHb3RvTm9kZUJ1aWxkZXImIGJ1aWxkZXIpIG92ZXJyaWRlOwogCiAgIC8vLyBQcm9jZXNzU3dpdGNoIC0gQ2FsbGVkIGJ5IENvcmVFbmdpbmUuICBVc2VkIHRvIGdlbmVyYXRlIHN1Y2Nlc3NvcgogICAvLy8gIG5vZGVzIGJ5IHByb2Nlc3NpbmcgdGhlICdlZmZlY3RzJyBvZiBhIHN3aXRjaCBzdGF0ZW1lbnQuCi0gIHZvaWQgcHJvY2Vzc1N3aXRjaChTd2l0Y2hOb2RlQnVpbGRlciYgYnVpbGRlcik7CisgIHZvaWQgcHJvY2Vzc1N3aXRjaChTd2l0Y2hOb2RlQnVpbGRlciYgYnVpbGRlcikgb3ZlcnJpZGU7CiAKICAgLy8vIENhbGxlZCBieSBDb3JlRW5naW5lLiAgVXNlZCB0byBnZW5lcmF0ZSBlbmQtb2YtcGF0aAogICAvLy8gbm9kZXMgd2hlbiB0aGUgY29udHJvbCByZWFjaGVzIHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4KICAgdm9pZCBwcm9jZXNzRW5kT2ZGdW5jdGlvbihOb2RlQnVpbGRlckNvbnRleHQmIEJDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlICpQcmVkKSBvdmVycmlkZTsKIAogICAvLy8gUmVtb3ZlIGRlYWQgYmluZGluZ3Mvc3ltYm9scyBiZWZvcmUgZXhpdGluZyBhIGZ1bmN0aW9uLgogICB2b2lkIHJlbW92ZURlYWRPbkVuZE9mRnVuY3Rpb24oTm9kZUJ1aWxkZXJDb250ZXh0JiBCQywKQEAgLTI1NCwyMiArMjU1LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CiAKICAgLy8vIEdlbmVyYXRlIHRoZSBlbnRyeSBub2RlIG9mIHRoZSBjYWxsZWUuCi0gIHZvaWQgcHJvY2Vzc0NhbGxFbnRlcihDYWxsRW50ZXIgQ0UsIEV4cGxvZGVkTm9kZSAqUHJlZCk7CisgIHZvaWQgcHJvY2Vzc0NhbGxFbnRlcihDYWxsRW50ZXIgQ0UsIEV4cGxvZGVkTm9kZSAqUHJlZCkgb3ZlcnJpZGU7CiAKICAgLy8vIEdlbmVyYXRlIHRoZSBzZXF1ZW5jZSBvZiBub2RlcyB0aGF0IHNpbXVsYXRlIHRoZSBjYWxsIGV4aXQgYW5kIHRoZSBwb3N0CiAgIC8vLyB2aXNpdCBmb3IgQ2FsbEV4cHIuCi0gIHZvaWQgcHJvY2Vzc0NhbGxFeGl0KEV4cGxvZGVkTm9kZSAqUHJlZCk7CisgIHZvaWQgcHJvY2Vzc0NhbGxFeGl0KEV4cGxvZGVkTm9kZSAqUHJlZCkgb3ZlcnJpZGU7CiAKICAgLy8vIENhbGxlZCBieSBDb3JlRW5naW5lIHdoZW4gdGhlIGFuYWx5c2lzIHdvcmtsaXN0IGhhcyB0ZXJtaW5hdGVkLgotICB2b2lkIHByb2Nlc3NFbmRXb3JrbGlzdChib29sIGhhc1dvcmtSZW1haW5pbmcpOworICB2b2lkIHByb2Nlc3NFbmRXb3JrbGlzdChib29sIGhhc1dvcmtSZW1haW5pbmcpIG92ZXJyaWRlOwogCiAgIC8vLyBldmFsQXNzdW1lIC0gQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCBieSB0aGUgQ29uc3RyYWludE1hbmFnZXIgd2hlbgogICAvLy8gIG1ha2luZyBhc3N1bXB0aW9ucyBhYm91dCBzdGF0ZSB2YWx1ZXMuCi0gIFByb2dyYW1TdGF0ZVJlZiBwcm9jZXNzQXNzdW1lKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU1ZhbCBjb25kLGJvb2wgYXNzdW1wdGlvbik7CisgIFByb2dyYW1TdGF0ZVJlZiBwcm9jZXNzQXNzdW1lKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU1ZhbCBjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzc3VtcHRpb24pIG92ZXJyaWRlOwogCiAgIC8vLyB3YW50c1JlZ2lvbkNoYW5nZVVwZGF0ZSAtIENhbGxlZCBieSBQcm9ncmFtU3RhdGVNYW5hZ2VyIHRvIGRldGVybWluZSBpZiBhCiAgIC8vLyAgcmVnaW9uIGNoYW5nZSBzaG91bGQgdHJpZ2dlciBhIHByb2Nlc3NSZWdpb25DaGFuZ2VzIHVwZGF0ZS4KLSAgYm9vbCB3YW50c1JlZ2lvbkNoYW5nZVVwZGF0ZShQcm9ncmFtU3RhdGVSZWYgc3RhdGUpOworICBib29sIHdhbnRzUmVnaW9uQ2hhbmdlVXBkYXRlKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSkgb3ZlcnJpZGU7CiAKICAgLy8vIHByb2Nlc3NSZWdpb25DaGFuZ2VzIC0gQ2FsbGVkIGJ5IFByb2dyYW1TdGF0ZU1hbmFnZXIgd2hlbmV2ZXIgYSBjaGFuZ2UgaXMgbWFkZQogICAvLy8gIHRvIHRoZSBzdG9yZS4gVXNlZCB0byB1cGRhdGUgY2hlY2tlcnMgdGhhdCB0cmFjayByZWdpb24gdmFsdWVzLgpAQCAtMjc4LDEzICsyODAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0ZWRTeW1ib2xzICppbnZhbGlkYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgTWVtUmVnaW9uICo+IEV4cGxpY2l0UmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgTWVtUmVnaW9uICo+IFJlZ2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAqQ2FsbCk7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAqQ2FsbCkgb3ZlcnJpZGU7CiAKICAgLy8vIHByaW50U3RhdGUgLSBDYWxsZWQgYnkgUHJvZ3JhbVN0YXRlTWFuYWdlciB0byBwcmludCBjaGVja2VyLXNwZWNpZmljIGRhdGEuCiAgIHZvaWQgcHJpbnRTdGF0ZShyYXdfb3N0cmVhbSAmT3V0LCBQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOTCwgY29uc3QgY2hhciAqU2VwKTsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5MLCBjb25zdCBjaGFyICpTZXApIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgUHJvZ3JhbVN0YXRlTWFuYWdlciYgZ2V0U3RhdGVNYW5hZ2VyKCkgeyByZXR1cm4gU3RhdGVNZ3I7IH0KKyAgUHJvZ3JhbVN0YXRlTWFuYWdlciYgZ2V0U3RhdGVNYW5hZ2VyKCkgb3ZlcnJpZGUgeyByZXR1cm4gU3RhdGVNZ3I7IH0KIAogICBTdG9yZU1hbmFnZXImIGdldFN0b3JlTWFuYWdlcigpIHsgcmV0dXJuIFN0YXRlTWdyLmdldFN0b3JlTWFuYWdlcigpOyB9CiAKQEAgLTQyMCw2ICs0MjIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RtdCAqUywgYm9vbCBJc0Jhc2VEdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsIEV4cGxvZGVkTm9kZVNldCAmRHN0KTsKIAorICB2b2lkIFZpc2l0Q1hYTmV3QWxsb2NhdG9yQ2FsbChjb25zdCBDWFhOZXdFeHByICpDTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpOworCiAgIHZvaWQgVmlzaXRDWFhOZXdFeHByKGNvbnN0IENYWE5ld0V4cHIgKkNORSwgRXhwbG9kZWROb2RlICpQcmVkLAogICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCk7CiAKQEAgLTQ3NSwxNyArNDgxLDE3IEBACiAKICAgLy8vIENhbGwgUG9pbnRlckVzY2FwZSBjYWxsYmFjayB3aGVuIGEgdmFsdWUgZXNjYXBlcyBhcyBhIHJlc3VsdCBvZiBiaW5kLgogICBQcm9ncmFtU3RhdGVSZWYgcHJvY2Vzc1BvaW50ZXJFc2NhcGVkT25CaW5kKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVmFsIExvYywgU1ZhbCBWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWYWwgTG9jLCBTVmFsIFZhbCkgb3ZlcnJpZGU7CiAgIC8vLyBDYWxsIFBvaW50ZXJFc2NhcGUgY2FsbGJhY2sgd2hlbiBhIHZhbHVlIGVzY2FwZXMgYXMgYSByZXN1bHQgb2YKICAgLy8vIHJlZ2lvbiBpbnZhbGlkYXRpb24uCiAgIC8vLyBccGFyYW1baW5dIElUcmFpdHMgU3BlY2lmaWVzIGludmFsaWRhdGlvbiB0cmFpdHMgZm9yIHJlZ2lvbnMvc3ltYm9scy4KICAgUHJvZ3JhbVN0YXRlUmVmIG5vdGlmeUNoZWNrZXJzT2ZQb2ludGVyRXNjYXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRlZFN5bWJvbHMgKkludmFsaWRhdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IE1lbVJlZ2lvbiAqPiBFeHBsaWNpdFJlZ2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgTWVtUmVnaW9uICo+IFJlZ2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV2ZW50ICpDYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lvbkFuZFN5bWJvbEludmFsaWRhdGlvblRyYWl0cyAmSVRyYWl0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRlZFN5bWJvbHMgKkludmFsaWRhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgTWVtUmVnaW9uICo+IEV4cGxpY2l0UmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IE1lbVJlZ2lvbiAqPiBSZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV2ZW50ICpDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uQW5kU3ltYm9sSW52YWxpZGF0aW9uVHJhaXRzICZJVHJhaXRzKSBvdmVycmlkZTsKIAogcHVibGljOgogICAvLyBGSVhNRTogJ3RhZycgc2hvdWxkIGJlIHJlbW92ZWQsIGFuZCBhIExvY2F0aW9uQ29udGV4dCBzaG91bGQgYmUgdXNlZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvTWVtUmVnaW9uLmggYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9NZW1SZWdpb24uaAppbmRleCBjYzc5MGMxLi5lMzE3M2EwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9NZW1SZWdpb24uaAorKysgYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9NZW1SZWdpb24uaApAQCAtMjMsMTMgKzIzLDEwIEBACiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFscy5oIgogI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKICNpbmNsdWRlIDxzdHJpbmc+CiAKLW5hbWVzcGFjZSBsbHZtIHsKLWNsYXNzIEJ1bXBQdHJBbGxvY2F0b3I7Ci19Ci0KIG5hbWVzcGFjZSBjbGFuZyB7CiAKIGNsYXNzIExvY2F0aW9uQ29udGV4dDsKQEAgLTIwNCwxMiArMjAxLDEyIEBACiAgICAgYXNzZXJ0KGNsYXNzb2YodGhpcykpOwogICB9CiAKLSAgTWVtUmVnaW9uTWFuYWdlciogZ2V0TWVtUmVnaW9uTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIE1ncjsgfQorICBNZW1SZWdpb25NYW5hZ2VyKiBnZXRNZW1SZWdpb25NYW5hZ2VyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gTWdyOyB9CiAKIHB1YmxpYzoKLSAgYm9vbCBpc0JvdW5kYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIAotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworICBib29sIGlzQm91bmRhYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uICpSKSB7CiAgICAgS2luZCBrID0gUi0+Z2V0S2luZCgpOwpAQCAtMjQzLDkgKzI0MCw5IEBACiAgICAgOiBHbG9iYWxzU3BhY2VSZWdpb24obWdyLCBTdGF0aWNHbG9iYWxTcGFjZVJlZ2lvbktpbmQpLCBDUihjcikge30KIAogcHVibGljOgotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OwotICAKLSAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOwogCiAgIGNvbnN0IENvZGVUZXh0UmVnaW9uICpnZXRDb2RlUmVnaW9uKCkgY29uc3QgeyByZXR1cm4gQ1I7IH0KIApAQCAtMjg2LDcgKzI4Myw3IEBACiAKIHB1YmxpYzoKIAotICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uICpSKSB7CiAgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBHbG9iYWxTeXN0ZW1TcGFjZVJlZ2lvbktpbmQ7CkBAIC0zMDYsNyArMzAzLDcgQEAKIAogcHVibGljOgogCi0gIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24gKlIpIHsKICAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IEdsb2JhbEltbXV0YWJsZVNwYWNlUmVnaW9uS2luZDsKQEAgLTMyNCw3ICszMjEsNyBAQAogCiBwdWJsaWM6CiAKLSAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiAqUikgewogICAgIHJldHVybiBSLT5nZXRLaW5kKCkgPT0gR2xvYmFsSW50ZXJuYWxTcGFjZVJlZ2lvbktpbmQ7CkBAIC0zMzksNyArMzM2LDcgQEAKICAgICA6IE1lbVNwYWNlUmVnaW9uKG1nciwgSGVhcFNwYWNlUmVnaW9uS2luZCkge30KIHB1YmxpYzoKIAotICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uICpSKSB7CiAgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBIZWFwU3BhY2VSZWdpb25LaW5kOwpAQCAtMzUzLDcgKzM1MCw3IEBACiAgICAgOiBNZW1TcGFjZVJlZ2lvbihtZ3IsIFVua25vd25TcGFjZVJlZ2lvbktpbmQpIHt9CiBwdWJsaWM6CiAKLSAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiAqUikgewogICAgIHJldHVybiBSLT5nZXRLaW5kKCkgPT0gVW5rbm93blNwYWNlUmVnaW9uS2luZDsKQEAgLTM3Myw3ICszNzAsNyBAQAogcHVibGljOiAgCiAgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpnZXRTdGFja0ZyYW1lKCkgY29uc3QgeyByZXR1cm4gU0ZDOyB9CiAgIAotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uICpSKSB7CiAgICAgS2luZCBrID0gUi0+Z2V0S2luZCgpOwpAQCAtMzg5LDcgKzM4Niw3IEBACiAgICAgOiBTdGFja1NwYWNlUmVnaW9uKG1nciwgU3RhY2tMb2NhbHNTcGFjZVJlZ2lvbktpbmQsIHNmYykge30KIHB1YmxpYzoKIAotICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uICpSKSB7CiAgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBTdGFja0xvY2Fsc1NwYWNlUmVnaW9uS2luZDsKQEAgLTQwNCw3ICs0MDEsNyBAQAogICAgIDogU3RhY2tTcGFjZVJlZ2lvbihtZ3IsIFN0YWNrQXJndW1lbnRzU3BhY2VSZWdpb25LaW5kLCBzZmMpIHt9CiBwdWJsaWM6CiAKLSAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiAqUikgewogICAgIHJldHVybiBSLT5nZXRLaW5kKCkgPT0gU3RhY2tBcmd1bWVudHNTcGFjZVJlZ2lvbktpbmQ7CkBAIC00MzAsOSArNDI3LDkgQEAKICAgICByZXR1cm4gVW5rbm93blZhbCgpOwogICB9CiAKLSAgTWVtUmVnaW9uTWFuYWdlciogZ2V0TWVtUmVnaW9uTWFuYWdlcigpIGNvbnN0OworICBNZW1SZWdpb25NYW5hZ2VyKiBnZXRNZW1SZWdpb25NYW5hZ2VyKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBib29sIGlzU3ViUmVnaW9uT2YoY29uc3QgTWVtUmVnaW9uKiBSKSBjb25zdDsKKyAgYm9vbCBpc1N1YlJlZ2lvbk9mKGNvbnN0IE1lbVJlZ2lvbiogUikgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24qIFIpIHsKICAgICByZXR1cm4gUi0+Z2V0S2luZCgpID4gRU5EX01FTVNQQUNFUzsKQEAgLTQ1OSwxNiArNDU2LDE2IEBACiAKICAgY29uc3QgRXhwciAqZ2V0RXhwcigpIGNvbnN0IHsgcmV0dXJuIEV4OyB9CiAKLSAgYm9vbCBpc0JvdW5kYWJsZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBpc0JvdW5kYWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICBEZWZpbmVkT3JVbmtub3duU1ZhbCBnZXRFeHRlbnQoU1ZhbEJ1aWxkZXIgJnN2YWxCdWlsZGVyKSBjb25zdDsKKyAgRGVmaW5lZE9yVW5rbm93blNWYWwgZ2V0RXh0ZW50KFNWYWxCdWlsZGVyICZzdmFsQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdDsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgdm9pZCBQcm9maWxlUmVnaW9uKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElELCBjb25zdCBFeHByICpFeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDbnQsIGNvbnN0IE1lbVJlZ2lvbiAqc3VwZXJSZWdpb24pOwogCi0gIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24qIFIpIHsKICAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IEFsbG9jYVJlZ2lvbktpbmQ7CkBAIC00NzgsNyArNDc1LDcgQEAKIC8vLyBUeXBlZFJlZ2lvbiAtIEFuIGFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyByZWdpb25zIHRoYXQgYXJlIHR5cGVkLgogY2xhc3MgVHlwZWRSZWdpb24gOiBwdWJsaWMgU3ViUmVnaW9uIHsKIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOwogcHJvdGVjdGVkOgogICBUeXBlZFJlZ2lvbihjb25zdCBNZW1SZWdpb24qIHNSZWcsIEtpbmQgaykgOiBTdWJSZWdpb24oc1JlZywgaykge30KIApAQCAtNDg5LDcgKzQ4Niw3IEBACiAgICAgcmV0dXJuIGdldExvY2F0aW9uVHlwZSgpLmdldERlc3VnYXJlZFR5cGUoQ29udGV4dCk7CiAgIH0KIAotICBib29sIGlzQm91bmRhYmxlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIGlzQm91bmRhYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CiAgICAgdW5zaWduZWQgayA9IFItPmdldEtpbmQoKTsKQEAgLTUwMCwxNCArNDk3LDE0IEBACiAvLy8gVHlwZWRWYWx1ZVJlZ2lvbiAtIEFuIGFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyByZWdpb25zIGhhdmluZyBhIHR5cGVkIHZhbHVlLgogY2xhc3MgVHlwZWRWYWx1ZVJlZ2lvbiA6IHB1YmxpYyBUeXBlZFJlZ2lvbiB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKIHByb3RlY3RlZDoKICAgVHlwZWRWYWx1ZVJlZ2lvbihjb25zdCBNZW1SZWdpb24qIHNSZWcsIEtpbmQgaykgOiBUeXBlZFJlZ2lvbihzUmVnLCBrKSB7fQogCiBwdWJsaWM6CiAgIHZpcnR1YWwgUXVhbFR5cGUgZ2V0VmFsdWVUeXBlKCkgY29uc3QgPSAwOwogCi0gIHZpcnR1YWwgUXVhbFR5cGUgZ2V0TG9jYXRpb25UeXBlKCkgY29uc3QgeworICBRdWFsVHlwZSBnZXRMb2NhdGlvblR5cGUoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gRklYTUU6IFdlIGNhbiBwb3NzaWJseSBvcHRpbWl6ZSB0aGlzIGxhdGVyIHRvIGNhY2hlIHRoaXMgdmFsdWUuCiAgICAgUXVhbFR5cGUgVCA9IGdldFZhbHVlVHlwZSgpOwogICAgIEFTVENvbnRleHQgJmN0eCA9IGdldENvbnRleHQoKTsKQEAgLTUyMSw3ICs1MTgsNyBAQAogICAgIHJldHVybiBULmdldFR5cGVQdHJPck51bGwoKSA/IFQuZ2V0RGVzdWdhcmVkVHlwZShDb250ZXh0KSA6IFQ7CiAgIH0KIAotICBEZWZpbmVkT3JVbmtub3duU1ZhbCBnZXRFeHRlbnQoU1ZhbEJ1aWxkZXIgJnN2YWxCdWlsZGVyKSBjb25zdDsKKyAgRGVmaW5lZE9yVW5rbm93blNWYWwgZ2V0RXh0ZW50KFNWYWxCdWlsZGVyICZzdmFsQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24qIFIpIHsKICAgICB1bnNpZ25lZCBrID0gUi0+Z2V0S2luZCgpOwpAQCAtNTMyLDEyICs1MjksMTIgQEAKIAogY2xhc3MgQ29kZVRleHRSZWdpb24gOiBwdWJsaWMgVHlwZWRSZWdpb24gewogcHVibGljOgotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiBwcm90ZWN0ZWQ6CiAgIENvZGVUZXh0UmVnaW9uKGNvbnN0IE1lbVJlZ2lvbiAqc3JlZywgS2luZCBrKSA6IFR5cGVkUmVnaW9uKHNyZWcsIGspIHt9CiBwdWJsaWM6Ci0gIGJvb2wgaXNCb3VuZGFibGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIAorICBib29sIGlzQm91bmRhYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKwogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiogUikgewogICAgIEtpbmQgayA9IFItPmdldEtpbmQoKTsKICAgICByZXR1cm4gayA+PSBGdW5jdGlvblRleHRSZWdpb25LaW5kICYmIGsgPD0gQmxvY2tUZXh0UmVnaW9uS2luZDsKQEAgLTU1Miw4ICs1NDksOCBAQAogICAgIDogQ29kZVRleHRSZWdpb24oc3JlZywgRnVuY3Rpb25UZXh0UmVnaW9uS2luZCksIEZEKGZkKSB7CiAgICAgYXNzZXJ0KGlzYTxPYmpDTWV0aG9kRGVjbD4oZmQpIHx8IGlzYTxGdW5jdGlvbkRlY2w+KGZkKSk7CiAgIH0KLSAgCi0gIFF1YWxUeXBlIGdldExvY2F0aW9uVHlwZSgpIGNvbnN0IHsKKworICBRdWFsVHlwZSBnZXRMb2NhdGlvblR5cGUoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgY29uc3QgQVNUQ29udGV4dCAmQ3R4ID0gZ2V0Q29udGV4dCgpOwogICAgIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEZEKSkgewogICAgICAgcmV0dXJuIEN0eC5nZXRQb2ludGVyVHlwZShELT5nZXRUeXBlKCkpOwpAQCAtNTcwLDExICs1NjcsMTEgQEAKICAgY29uc3QgTmFtZWREZWNsICpnZXREZWNsKCkgY29uc3QgewogICAgIHJldHVybiBGRDsKICAgfQotICAgIAotICB2aXJ0dWFsIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7Ci0gIAotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0OwotICAKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3Qgb3ZlcnJpZGU7CisKICAgc3RhdGljIHZvaWQgUHJvZmlsZVJlZ2lvbihsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCwgY29uc3QgTmFtZWREZWNsICpGRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24qKTsKICAgCkBAIC02MDIsNyArNTk5LDcgQEAKICAgICA6IENvZGVUZXh0UmVnaW9uKHNyZWcsIEJsb2NrVGV4dFJlZ2lvbktpbmQpLCBCRChiZCksIEFDKGFjKSwgbG9jVHkobFR5KSB7fQogCiBwdWJsaWM6Ci0gIFF1YWxUeXBlIGdldExvY2F0aW9uVHlwZSgpIGNvbnN0IHsKKyAgUXVhbFR5cGUgZ2V0TG9jYXRpb25UeXBlKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBsb2NUeTsKICAgfQogICAKQEAgLTYxMSwxMSArNjA4LDExIEBACiAgIH0KIAogICBBbmFseXNpc0RlY2xDb250ZXh0ICpnZXRBbmFseXNpc0RlY2xDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQUM7IH0KLSAgICAKLSAgdmlydHVhbCB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OwotICAKLSAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdDsKLSAgCisKKyAgdmlydHVhbCB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3Qgb3ZlcnJpZGU7CisKICAgc3RhdGljIHZvaWQgUHJvZmlsZVJlZ2lvbihsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCwgY29uc3QgQmxvY2tEZWNsICpCRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsVHlwZSwgY29uc3QgQW5hbHlzaXNEZWNsQ29udGV4dCosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtUmVnaW9uKik7CkBAIC02NTAsOCArNjQ3LDggQEAKICAgCiAgIGNvbnN0IEJsb2NrRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIEJDLT5nZXREZWNsKCk7IH0KIAotICBRdWFsVHlwZSBnZXRMb2NhdGlvblR5cGUoKSBjb25zdCB7IHJldHVybiBCQy0+Z2V0TG9jYXRpb25UeXBlKCk7IH0KLSAgCisgIFF1YWxUeXBlIGdldExvY2F0aW9uVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEJDLT5nZXRMb2NhdGlvblR5cGUoKTsgfQorCiAgIGNsYXNzIHJlZmVyZW5jZWRfdmFyc19pdGVyYXRvciB7CiAgICAgY29uc3QgTWVtUmVnaW9uICogY29uc3QgKlI7CiAgICAgY29uc3QgTWVtUmVnaW9uICogY29uc3QgKk9yaWdpbmFsUjsKQEAgLTY4OCwxMSArNjg1LDExIEBACiAgICAgICAKICAgcmVmZXJlbmNlZF92YXJzX2l0ZXJhdG9yIHJlZmVyZW5jZWRfdmFyc19iZWdpbigpIGNvbnN0OwogICByZWZlcmVuY2VkX3ZhcnNfaXRlcmF0b3IgcmVmZXJlbmNlZF92YXJzX2VuZCgpIGNvbnN0OyAgCi0gICAgCi0gIHZpcnR1YWwgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKLSAgICAKLSAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdDsKLSAgICAKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3Qgb3ZlcnJpZGU7CisKICAgc3RhdGljIHZvaWQgUHJvZmlsZVJlZ2lvbihsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiwgY29uc3QgQmxvY2tUZXh0UmVnaW9uICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICosIHVuc2lnbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbVJlZ2lvbiAqKTsKQEAgLTcyMywxNyArNzIwLDE3IEBACiAgICAgcmV0dXJuIHN5bTsKICAgfQogCi0gIGJvb2wgaXNCb3VuZGFibGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgaXNCb3VuZGFibGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKLSAgRGVmaW5lZE9yVW5rbm93blNWYWwgZ2V0RXh0ZW50KFNWYWxCdWlsZGVyICZzdmFsQnVpbGRlcikgY29uc3Q7CisgIERlZmluZWRPclVua25vd25TVmFsIGdldEV4dGVudChTVmFsQnVpbGRlciAmc3ZhbEJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3Q7CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIHZvaWQgUHJvZmlsZVJlZ2lvbihsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZWYgc3ltLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbVJlZ2lvbiogc3VwZXJSZWdpb24pOwogCi0gIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24qIFIpIHsKICAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IFN5bWJvbGljUmVnaW9uS2luZDsKQEAgLTc1NywxOSArNzU0LDE5IEBACiAKICAgY29uc3QgU3RyaW5nTGl0ZXJhbCogZ2V0U3RyaW5nTGl0ZXJhbCgpIGNvbnN0IHsgcmV0dXJuIFN0cjsgfQogCi0gIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0IHsKKyAgUXVhbFR5cGUgZ2V0VmFsdWVUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBTdHItPmdldFR5cGUoKTsKICAgfQogCi0gIERlZmluZWRPclVua25vd25TVmFsIGdldEV4dGVudChTVmFsQnVpbGRlciAmc3ZhbEJ1aWxkZXIpIGNvbnN0OworICBEZWZpbmVkT3JVbmtub3duU1ZhbCBnZXRFeHRlbnQoU1ZhbEJ1aWxkZXIgJnN2YWxCdWlsZGVyKSBjb25zdCBvdmVycmlkZTsKIAotICBib29sIGlzQm91bmRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgYm9vbCBpc0JvdW5kYWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiAKLSAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCB7CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIFByb2ZpbGVSZWdpb24oSUQsIFN0ciwgc3VwZXJSZWdpb24pOwogICB9CiAKLSAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiogUikgewogICAgIHJldHVybiBSLT5nZXRLaW5kKCkgPT0gU3RyaW5nUmVnaW9uS2luZDsKQEAgLTc5MiwxOSArNzg5LDE5IEBACiBwdWJsaWM6CiAgIAogICBjb25zdCBPYmpDU3RyaW5nTGl0ZXJhbCogZ2V0T2JqQ1N0cmluZ0xpdGVyYWwoKSBjb25zdCB7IHJldHVybiBTdHI7IH0KLSAgCi0gIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0IHsKKworICBRdWFsVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFN0ci0+Z2V0VHlwZSgpOwogICB9Ci0gIAotICBib29sIGlzQm91bmRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgCi0gIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3QgeworCisgIGJvb2wgaXNCb3VuZGFibGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIFByb2ZpbGVSZWdpb24oSUQsIFN0ciwgc3VwZXJSZWdpb24pOwogICB9Ci0gIAotICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OwotICAKKworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOworCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CiAgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBPYmpDU3RyaW5nUmVnaW9uS2luZDsKICAgfQpAQCAtODI1LDE1ICs4MjIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21wb3VuZExpdGVyYWxFeHByICpDTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24qIHN1cGVyUmVnaW9uKTsKIHB1YmxpYzoKLSAgUXVhbFR5cGUgZ2V0VmFsdWVUeXBlKCkgY29uc3QgeworICBRdWFsVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIENMLT5nZXRUeXBlKCk7CiAgIH0KIAotICBib29sIGlzQm91bmRhYmxlKCkgY29uc3QgeyByZXR1cm4gIUNMLT5pc0ZpbGVTY29wZSgpOyB9CisgIGJvb2wgaXNCb3VuZGFibGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAhQ0wtPmlzRmlsZVNjb3BlKCk7IH0KIAotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0OworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgY29uc3QgQ29tcG91bmRMaXRlcmFsRXhwciAqZ2V0TGl0ZXJhbEV4cHIoKSBjb25zdCB7IHJldHVybiBDTDsgfQogCkBAIC04NTQsNyArODUxLDcgQEAKIAogcHVibGljOgogICBjb25zdCBEZWNsICpnZXREZWNsKCkgY29uc3QgeyByZXR1cm4gRDsgfQotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0OworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CiAgICAgdW5zaWduZWQgayA9IFItPmdldEtpbmQoKTsKQEAgLTg3NCwyNyArODcxLDI3IEBACiAgICAgRGVjbFJlZ2lvbjo6UHJvZmlsZVJlZ2lvbihJRCwgVkQsIHN1cGVyUmVnaW9uLCBWYXJSZWdpb25LaW5kKTsKICAgfQogCi0gIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3Q7CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgY29uc3Qgb3ZlcnJpZGU7CiAKIHB1YmxpYzoKICAgY29uc3QgVmFyRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8VmFyRGVjbD4oRCk7IH0KIAogICBjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqZ2V0U3RhY2tGcmFtZSgpIGNvbnN0OwotICAKLSAgUXVhbFR5cGUgZ2V0VmFsdWVUeXBlKCkgY29uc3QgeworCisgIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBGSVhNRTogV2UgY2FuIGNhY2hlIHRoaXMgaWYgbmVlZGVkLgogICAgIHJldHVybiBnZXREZWNsKCktPmdldFR5cGUoKTsKICAgfQogCi0gIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24qIFIpIHsKICAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IFZhclJlZ2lvbktpbmQ7CiAgIH0KIAotICBib29sIGNhblByaW50UHJldHR5QXNFeHByKCkgY29uc3Q7CisgIGJvb2wgY2FuUHJpbnRQcmV0dHlBc0V4cHIoKSBjb25zdCBvdmVycmlkZTsKIAotICB2b2lkIHByaW50UHJldHR5QXNFeHByKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgcHJpbnRQcmV0dHlBc0V4cHIocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIH07CiAgIAogLy8vIENYWFRoaXNSZWdpb24gLSBSZXByZXNlbnRzIHRoZSByZWdpb24gZm9yIHRoZSBpbXBsaWNpdCAndGhpcycgcGFyYW1ldGVyCkBAIC05MTAsMTUgKzkwNywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvaW50ZXJUeXBlICpQVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24gKnNSZWcpOwogCi0gIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGU7CiAKLXB1YmxpYzogIAotICBRdWFsVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCB7CitwdWJsaWM6CisgIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gUXVhbFR5cGUoVGhpc1BvaW50ZXJUeSwgMCk7CiAgIH0KIAotICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OwotICAKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKKwogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiogUikgewogICAgIHJldHVybiBSLT5nZXRLaW5kKCkgPT0gQ1hYVGhpc1JlZ2lvbktpbmQ7CiAgIH0KQEAgLTkzNiwxMiArOTMzLDEyIEBACiBwdWJsaWM6CiAgIGNvbnN0IEZpZWxkRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RmllbGREZWNsPihEKTsgfQogCi0gIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0IHsKKyAgUXVhbFR5cGUgZ2V0VmFsdWVUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIEZJWE1FOiBXZSBjYW4gY2FjaGUgdGhpcyBpZiBuZWVkZWQuCiAgICAgcmV0dXJuIGdldERlY2woKS0+Z2V0VHlwZSgpOwogICB9CiAKLSAgRGVmaW5lZE9yVW5rbm93blNWYWwgZ2V0RXh0ZW50KFNWYWxCdWlsZGVyICZzdmFsQnVpbGRlcikgY29uc3Q7CisgIERlZmluZWRPclVua25vd25TVmFsIGdldEV4dGVudChTVmFsQnVpbGRlciAmc3ZhbEJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHN0YXRpYyB2b2lkIFByb2ZpbGVSZWdpb24obGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQsIGNvbnN0IEZpZWxkRGVjbCAqRkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtUmVnaW9uKiBzdXBlclJlZ2lvbikgewpAQCAtOTUyLDEyICs5NDksMTIgQEAKICAgICByZXR1cm4gUi0+Z2V0S2luZCgpID09IEZpZWxkUmVnaW9uS2luZDsKICAgfQogCi0gIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgYm9vbCBjYW5QcmludFByZXR0eSgpIGNvbnN0OwotICB2b2lkIHByaW50UHJldHR5KHJhd19vc3RyZWFtICZvcykgY29uc3Q7Ci0gIGJvb2wgY2FuUHJpbnRQcmV0dHlBc0V4cHIoKSBjb25zdDsKLSAgdm9pZCBwcmludFByZXR0eUFzRXhwcihyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworICBib29sIGNhblByaW50UHJldHR5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnRQcmV0dHkocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBjYW5QcmludFByZXR0eUFzRXhwcigpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHByaW50UHJldHR5QXNFeHByKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBPYmpDSXZhclJlZ2lvbiA6IHB1YmxpYyBEZWNsUmVnaW9uIHsKQEAgLTk3MSwxMiArOTY4LDEyIEBACiAKIHB1YmxpYzoKICAgY29uc3QgT2JqQ0l2YXJEZWNsICpnZXREZWNsKCkgY29uc3Q7Ci0gIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0OworICBRdWFsVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKIAotICBib29sIGNhblByaW50UHJldHR5QXNFeHByKCkgY29uc3Q7Ci0gIHZvaWQgcHJpbnRQcmV0dHlBc0V4cHIocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgYm9vbCBjYW5QcmludFByZXR0eUFzRXhwcigpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHByaW50UHJldHR5QXNFeHByKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiogUikgewogICAgIHJldHVybiBSLT5nZXRLaW5kKCkgPT0gT2JqQ0l2YXJSZWdpb25LaW5kOwpAQCAtMTAyOSw3ICsxMDI2LDcgQEAKIAogICBOb25Mb2MgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBJbmRleDsgfQogCi0gIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0IHsKKyAgUXVhbFR5cGUgZ2V0VmFsdWVUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBFbGVtZW50VHlwZTsKICAgfQogCkBAIC0xMDM5LDkgKzEwMzYsOSBAQAogICAvLy8gQ29tcHV0ZSB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYXJyYXkuIFRoZSBhcnJheSBtaWdodCBhbHNvIGJlIGEgc3Vib2JqZWN0LgogICBSZWdpb25SYXdPZmZzZXQgZ2V0QXNBcnJheU9mZnNldCgpIGNvbnN0OwogCi0gIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdDsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1lbVJlZ2lvbiogUikgewogICAgIHJldHVybiBSLT5nZXRLaW5kKCkgPT0gRWxlbWVudFJlZ2lvbktpbmQ7CkBAIC0xMDYzLDEzICsxMDYwLDEzIEBACiBwdWJsaWM6CiAgIGNvbnN0IEV4cHIgKmdldEV4cHIoKSBjb25zdCB7IHJldHVybiBFeDsgfQogCi0gIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0IHsKKyAgUXVhbFR5cGUgZ2V0VmFsdWVUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBFeC0+Z2V0VHlwZSgpOwogICB9CiAKLSAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIAotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWVtUmVnaW9uKiBSKSB7CiAgICAgcmV0dXJuIFItPmdldEtpbmQoKSA9PSBDWFhUZW1wT2JqZWN0UmVnaW9uS2luZDsKQEAgLTEwOTQsMTkgKzEwOTEsMTkgQEAKICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqZ2V0RGVjbCgpIGNvbnN0IHsgcmV0dXJuIERhdGEuZ2V0UG9pbnRlcigpOyB9CiAgIGJvb2wgaXNWaXJ0dWFsKCkgY29uc3QgeyByZXR1cm4gRGF0YS5nZXRJbnQoKTsgfQogCi0gIFF1YWxUeXBlIGdldFZhbHVlVHlwZSgpIGNvbnN0OworICBRdWFsVHlwZSBnZXRWYWx1ZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKIAotICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZW1SZWdpb24gKnJlZ2lvbikgewogICAgIHJldHVybiByZWdpb24tPmdldEtpbmQoKSA9PSBDWFhCYXNlT2JqZWN0UmVnaW9uS2luZDsKICAgfQogCi0gIGJvb2wgY2FuUHJpbnRQcmV0dHlBc0V4cHIoKSBjb25zdDsKLSAgCi0gIHZvaWQgcHJpbnRQcmV0dHlBc0V4cHIocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgYm9vbCBjYW5QcmludFByZXR0eUFzRXhwcigpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgcHJpbnRQcmV0dHlBc0V4cHIocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFJlZ2lvblR5PgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlLmggYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGUuaAppbmRleCAwMzczOWVkLi40ZDM0NWViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGUuaAorKysgYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGUuaApAQCAtMjUsMTAgKzI1LDEwIEBACiAjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0ltbXV0YWJsZU1hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgogCiBuYW1lc3BhY2UgbGx2bSB7CiBjbGFzcyBBUFNJbnQ7Ci1jbGFzcyBCdW1wUHRyQWxsb2NhdG9yOwogfQogCiBuYW1lc3BhY2UgY2xhbmcgewpAQCAtNDQxLDggKzQ0MSw4IEBACiAgIFN1YkVuZ2luZSAqRW5nOyAvKiBDYW4gYmUgbnVsbC4gKi8KIAogICBFbnZpcm9ubWVudE1hbmFnZXIgICAgICAgICAgICAgICAgICAgRW52TWdyOwotICBPd25pbmdQdHI8U3RvcmVNYW5hZ2VyPiAgICAgICAgICAgICAgU3RvcmVNZ3I7Ci0gIE93bmluZ1B0cjxDb25zdHJhaW50TWFuYWdlcj4gICAgICAgICBDb25zdHJhaW50TWdyOworICBzdGQ6OnVuaXF1ZV9wdHI8U3RvcmVNYW5hZ2VyPiAgICAgICAgU3RvcmVNZ3I7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb25zdHJhaW50TWFuYWdlcj4gICBDb25zdHJhaW50TWdyOwogCiAgIFByb2dyYW1TdGF0ZTo6R2VuZXJpY0RhdGFNYXA6OkZhY3RvcnkgICAgIEdETUZhY3Rvcnk7CiAKQEAgLTQ1NCwxMCArNDU0LDEwIEBACiAgIGxsdm06OkZvbGRpbmdTZXQ8UHJvZ3JhbVN0YXRlPiBTdGF0ZVNldDsKIAogICAvLy8gT2JqZWN0IHRoYXQgbWFuYWdlcyB0aGUgZGF0YSBmb3IgYWxsIGNyZWF0ZWQgU1ZhbHMuCi0gIE93bmluZ1B0cjxTVmFsQnVpbGRlcj4gc3ZhbEJ1aWxkZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxTVmFsQnVpbGRlcj4gc3ZhbEJ1aWxkZXI7CiAKICAgLy8vIE1hbmFnZXMgbWVtb3J5IGZvciBjcmVhdGVkIENhbGxFdmVudHMuCi0gIE93bmluZ1B0cjxDYWxsRXZlbnRNYW5hZ2VyPiBDYWxsRXZlbnRNZ3I7CisgIHN0ZDo6dW5pcXVlX3B0cjxDYWxsRXZlbnRNYW5hZ2VyPiBDYWxsRXZlbnRNZ3I7CiAKICAgLy8vIEEgQnVtcFB0ckFsbG9jYXRvciB0byBhbGxvY2F0ZSBzdGF0ZXMuCiAgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jOwpAQCAtNjc2LDEwICs2NzYsOCBAQAogaW5saW5lIFNWYWwgUHJvZ3JhbVN0YXRlOjpnZXRMVmFsdWUoY29uc3QgSW5kaXJlY3RGaWVsZERlY2wgKkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVmFsIEJhc2UpIGNvbnN0IHsKICAgU3RvcmVNYW5hZ2VyICZTTSA9ICpnZXRTdGF0ZU1hbmFnZXIoKS5TdG9yZU1ncjsKLSAgZm9yIChJbmRpcmVjdEZpZWxkRGVjbDo6Y2hhaW5faXRlcmF0b3IgSSA9IEQtPmNoYWluX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBELT5jaGFpbl9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIEJhc2UgPSBTTS5nZXRMVmFsdWVGaWVsZChjYXN0PEZpZWxkRGVjbD4oKkkpLCBCYXNlKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogRC0+Y2hhaW4oKSkgeworICAgIEJhc2UgPSBTTS5nZXRMVmFsdWVGaWVsZChjYXN0PEZpZWxkRGVjbD4oSSksIEJhc2UpOwogICB9CiAKICAgcmV0dXJuIEJhc2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGVUcmFpdC5oIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlVHJhaXQuaAppbmRleCBlYjUyYWU0Li44ODA5OGVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Qcm9ncmFtU3RhdGVUcmFpdC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1Byb2dyYW1TdGF0ZVRyYWl0LmgKQEAgLTE4LDEwICsxOCwxMCBAQAogI2lmbmRlZiBMTFZNX0NMQU5HX0dSX1BST0dSQU1TVEFURVRSQUlUX0gKICNkZWZpbmUgTExWTV9DTEFOR19HUl9QUk9HUkFNU1RBVEVUUkFJVF9ICiAKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgogCiBuYW1lc3BhY2UgbGx2bSB7Ci0gIGNsYXNzIEJ1bXBQdHJBbGxvY2F0b3I7CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBELCB0eXBlbmFtZSBJPiBjbGFzcyBJbW11dGFibGVNYXA7CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBJPiBjbGFzcyBJbW11dGFibGVTZXQ7CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBJbW11dGFibGVMaXN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbEJ1aWxkZXIuaCBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxCdWlsZGVyLmgKaW5kZXggYzVkMGE5Mi4uNWRhMWRkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU1ZhbEJ1aWxkZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TVmFsQnVpbGRlci5oCkBAIC04OCw3ICs4OCw3IEBACiAKICAgdmlydHVhbCBTVmFsIGV2YWxDb21wbGVtZW50KE5vbkxvYyB2YWwpID0gMDsKIAotICAvLy8gQ3JlYXRlIGEgbmV3IHZhbHVlIHdoaWNoIHJlcHJlc2VudHMgYSBiaW5hcnkgZXhwcmVzc2lvbiB3aXRoIHR3byBub24KKyAgLy8vIENyZWF0ZSBhIG5ldyB2YWx1ZSB3aGljaCByZXByZXNlbnRzIGEgYmluYXJ5IGV4cHJlc3Npb24gd2l0aCB0d28gbm9uLQogICAvLy8gbG9jYXRpb24gb3BlcmFuZHMuCiAgIHZpcnR1YWwgU1ZhbCBldmFsQmluT3BOTihQcm9ncmFtU3RhdGVSZWYgc3RhdGUsIEJpbmFyeU9wZXJhdG9yOjpPcGNvZGUgb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25Mb2MgbGhzLCBOb25Mb2MgcmhzLCBRdWFsVHlwZSByZXN1bHRUeSkgPSAwOwpAQCAtOTksNyArOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jIGxocywgTG9jIHJocywgUXVhbFR5cGUgcmVzdWx0VHkpID0gMDsKIAogICAvLy8gQ3JlYXRlIGEgbmV3IHZhbHVlIHdoaWNoIHJlcHJlc2VudHMgYSBiaW5hcnkgZXhwcmVzc2lvbiB3aXRoIGEgbWVtb3J5Ci0gIC8vLyBsb2NhdGlvbiBhbmQgbm9uIGxvY2F0aW9uIG9wZXJhbmRzLiBGb3IgZXhhbXBsZSwgdGhpcyB3b3VsZCBiZSB1c2VkIHRvCisgIC8vLyBsb2NhdGlvbiBhbmQgbm9uLWxvY2F0aW9uIG9wZXJhbmRzLiBGb3IgZXhhbXBsZSwgdGhpcyB3b3VsZCBiZSB1c2VkIHRvCiAgIC8vLyBldmFsdWF0ZSBhIHBvaW50ZXIgYXJpdGhtZXRpYyBvcGVyYXRpb24uCiAgIHZpcnR1YWwgU1ZhbCBldmFsQmluT3BMTihQcm9ncmFtU3RhdGVSZWYgc3RhdGUsIEJpbmFyeU9wZXJhdG9yOjpPcGNvZGUgb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2MgbGhzLCBOb25Mb2MgcmhzLCBRdWFsVHlwZSByZXN1bHRUeSkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3RvcmUuaCBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N0b3JlLmgKaW5kZXggNTMwZGFlNS4uYTZkYTJlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3RvcmUuaAorKysgYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TdG9yZS5oCkBAIC0yMjMsNyArMjIzLDcgQEAKICAgICBGaW5kVW5pcXVlQmluZGluZyhTeW1ib2xSZWYgc3ltKSA6IFN5bShzeW0pLCBCaW5kaW5nKDApLCBGaXJzdCh0cnVlKSB7fQogCiAgICAgYm9vbCBIYW5kbGVCaW5kaW5nKFN0b3JlTWFuYWdlciYgU01nciwgU3RvcmUgc3RvcmUsIGNvbnN0IE1lbVJlZ2lvbiogUiwKLSAgICAgICAgICAgICAgICAgICAgICAgU1ZhbCB2YWwpOworICAgICAgICAgICAgICAgICAgICAgICBTVmFsIHZhbCkgb3ZlcnJpZGU7CiAgICAgTExWTV9FWFBMSUNJVCBvcGVyYXRvciBib29sKCkgeyByZXR1cm4gRmlyc3QgJiYgQmluZGluZzsgfQogICAgIGNvbnN0IE1lbVJlZ2lvbiAqZ2V0UmVnaW9uKCkgeyByZXR1cm4gQmluZGluZzsgfQogICB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3ltYm9sTWFuYWdlci5oIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3ltYm9sTWFuYWdlci5oCmluZGV4IDkxNGIyYmUuLmU0OTFmYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1N5bWJvbE1hbmFnZXIuaAorKysgYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9TeW1ib2xNYW5hZ2VyLmgKQEAgLTIzLDEyICsyMyw5IEBACiAjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgogCi1uYW1lc3BhY2UgbGx2bSB7Ci1jbGFzcyBCdW1wUHRyQWxsb2NhdG9yOwotfQotCiBuYW1lc3BhY2UgY2xhbmcgewogICBjbGFzcyBBU1RDb250ZXh0OwogICBjbGFzcyBTdGFja0ZyYW1lQ29udGV4dDsKQEAgLTEwNSw3ICsxMDIsNyBAQAogLy8vIFxicmllZiBBIHN5bWJvbCByZXByZXNlbnRpbmcgZGF0YSB3aGljaCBjYW4gYmUgc3RvcmVkIGluIGEgbWVtb3J5IGxvY2F0aW9uCiAvLy8gKHJlZ2lvbikuCiBjbGFzcyBTeW1ib2xEYXRhIDogcHVibGljIFN5bUV4cHIgewotICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CiAgIGNvbnN0IFN5bWJvbElEIFN5bTsKIAogcHJvdGVjdGVkOgpAQCAtMTM4LDEzICsxMzUsMTMgQEAKICAgICBwcm9maWxlLkFkZFBvaW50ZXIoUik7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBwcm9maWxlKSB7CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBwcm9maWxlKSBvdmVycmlkZSB7CiAgICAgUHJvZmlsZShwcm9maWxlLCBSKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIAotICBRdWFsVHlwZSBnZXRUeXBlKCkgY29uc3Q7CisgIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdCBvdmVycmlkZTsKIAogICAvLyBJbXBsZW1lbnQgaXNhPFQ+IHN1cHBvcnQuCiAgIHN0YXRpYyBpbmxpbmUgYm9vbCBjbGFzc29mKGNvbnN0IFN5bUV4cHIgKlNFKSB7CkBAIC0xNzMsOSArMTcwLDkgQEAKICAgdW5zaWduZWQgZ2V0Q291bnQoKSBjb25zdCB7IHJldHVybiBDb3VudDsgfQogICBjb25zdCB2b2lkICpnZXRUYWcoKSBjb25zdCB7IHJldHVybiBTeW1ib2xUYWc7IH0KIAotICBRdWFsVHlwZSBnZXRUeXBlKCkgY29uc3Q7CisgIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBwcm9maWxlLCBjb25zdCBTdG10ICpTLAogICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIHVuc2lnbmVkIENvdW50LCBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHgsCkBAIC0xODgsNyArMTg1LDcgQEAKICAgICBwcm9maWxlLkFkZFBvaW50ZXIoU3ltYm9sVGFnKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIHByb2ZpbGUpIHsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIHByb2ZpbGUpIG92ZXJyaWRlIHsKICAgICBQcm9maWxlKHByb2ZpbGUsIFMsIFQsIENvdW50LCBMQ3R4LCBTeW1ib2xUYWcpOwogICB9CiAKQEAgLTIxMSw5ICsyMDgsOSBAQAogICBTeW1ib2xSZWYgZ2V0UGFyZW50U3ltYm9sKCkgY29uc3QgeyByZXR1cm4gcGFyZW50U3ltYm9sOyB9CiAgIGNvbnN0IFR5cGVkVmFsdWVSZWdpb24gKmdldFJlZ2lvbigpIGNvbnN0IHsgcmV0dXJuIFI7IH0KIAotICBRdWFsVHlwZSBnZXRUeXBlKCkgY29uc3Q7CisgIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RhdGljIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBwcm9maWxlLCBTeW1ib2xSZWYgcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR5cGVkVmFsdWVSZWdpb24gKnIpIHsKQEAgLTIyMiw3ICsyMTksNyBAQAogICAgIHByb2ZpbGUuQWRkUG9pbnRlcihwYXJlbnQpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgcHJvZmlsZSkgeworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgcHJvZmlsZSkgb3ZlcnJpZGUgewogICAgIFByb2ZpbGUocHJvZmlsZSwgcGFyZW50U3ltYm9sLCBSKTsKICAgfQogCkBAIC0yNDQsMTYgKzI0MSwxNiBAQAogCiAgIGNvbnN0IFN1YlJlZ2lvbiAqZ2V0UmVnaW9uKCkgY29uc3QgeyByZXR1cm4gUjsgfQogCi0gIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdDsKKyAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIHByb2ZpbGUsIGNvbnN0IFN1YlJlZ2lvbiAqUikgewogICAgIHByb2ZpbGUuQWRkSW50ZWdlcigodW5zaWduZWQpIEV4dGVudEtpbmQpOwogICAgIHByb2ZpbGUuQWRkUG9pbnRlcihSKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIHByb2ZpbGUpIHsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIHByb2ZpbGUpIG92ZXJyaWRlIHsKICAgICBQcm9maWxlKHByb2ZpbGUsIFIpOwogICB9CiAKQEAgLTI4Myw5ICsyODAsOSBAQAogICB1bnNpZ25lZCBnZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIENvdW50OyB9CiAgIGNvbnN0IHZvaWQgKmdldFRhZygpIGNvbnN0IHsgcmV0dXJuIFRhZzsgfQogCi0gIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdDsKKyAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIHByb2ZpbGUsIGNvbnN0IE1lbVJlZ2lvbiAqUiwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpTLCBRdWFsVHlwZSBULCB1bnNpZ25lZCBDb3VudCwKQEAgLTI5OCw3ICsyOTUsNyBAQAogICAgIHByb2ZpbGUuQWRkUG9pbnRlcihUYWcpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgcHJvZmlsZSkgeworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgcHJvZmlsZSkgb3ZlcnJpZGUgewogICAgIFByb2ZpbGUocHJvZmlsZSwgUiwgUywgVCwgQ291bnQsIFRhZyk7CiAgIH0KIApAQCAtMzIwLDExICszMTcsMTEgQEAKICAgU3ltYm9sQ2FzdChjb25zdCBTeW1FeHByICpJbiwgUXVhbFR5cGUgRnJvbSwgUXVhbFR5cGUgVG8pIDoKICAgICBTeW1FeHByKENhc3RTeW1ib2xLaW5kKSwgT3BlcmFuZChJbiksIEZyb21UeShGcm9tKSwgVG9UeShUbykgeyB9CiAKLSAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFRvVHk7IH0KKyAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFRvVHk7IH0KIAogICBjb25zdCBTeW1FeHByICpnZXRPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZDsgfQogCi0gIHZpcnR1YWwgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdDsKKyAgdm9pZCBkdW1wVG9TdHJlYW0ocmF3X29zdHJlYW0gJm9zKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElELAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN5bUV4cHIgKkluLCBRdWFsVHlwZSBGcm9tLCBRdWFsVHlwZSBUbykgewpAQCAtMzM0LDcgKzMzMSw3IEBACiAgICAgSUQuQWRkKFRvKTsKICAgfQogCi0gIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEJiBJRCkgeworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIG92ZXJyaWRlIHsKICAgICBQcm9maWxlKElELCBPcGVyYW5kLCBGcm9tVHksIFRvVHkpOwogICB9CiAKQEAgLTM1Niw3ICszNTMsNyBAQAogcHVibGljOgogICAvLyBGSVhNRTogV2UgcHJvYmFibHkgbmVlZCB0byBtYWtlIHRoaXMgb3V0LW9mLWxpbmUgdG8gYXZvaWQgcmVkdW5kYW50CiAgIC8vIGdlbmVyYXRpb24gb2YgdmlydHVhbCBmdW5jdGlvbnMuCi0gIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUOyB9CisgIFF1YWxUeXBlIGdldFR5cGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBUOyB9CiAKICAgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBPcDsgfQogCkBAIC0zNzcsNyArMzc0LDcgQEAKICAgICAgICAgICAgICBjb25zdCBsbHZtOjpBUFNJbnQmIHJocywgUXVhbFR5cGUgdCkKICAgICA6IEJpbmFyeVN5bUV4cHIoU3ltSW50S2luZCwgb3AsIHQpLCBMSFMobGhzKSwgUkhTKHJocykge30KIAotICB2aXJ0dWFsIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgY29uc3QgU3ltRXhwciAqZ2V0TEhTKCkgY29uc3QgeyByZXR1cm4gTEhTOyB9CiAgIGNvbnN0IGxsdm06OkFQU0ludCAmZ2V0UkhTKCkgY29uc3QgeyByZXR1cm4gUkhTOyB9CkBAIC0zOTIsNyArMzg5LDcgQEAKICAgICBJRC5BZGQodCk7CiAgIH0KIAotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIHsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBvdmVycmlkZSB7CiAgICAgUHJvZmlsZShJRCwgTEhTLCBnZXRPcGNvZGUoKSwgUkhTLCBnZXRUeXBlKCkpOwogICB9CiAKQEAgLTQxMiw3ICs0MDksNyBAQAogICAgICAgICAgICAgIGNvbnN0IFN5bUV4cHIgKnJocywgUXVhbFR5cGUgdCkKICAgICA6IEJpbmFyeVN5bUV4cHIoSW50U3ltS2luZCwgb3AsIHQpLCBMSFMobGhzKSwgUkhTKHJocykge30KIAotICB2aXJ0dWFsIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Q7CisgIHZvaWQgZHVtcFRvU3RyZWFtKHJhd19vc3RyZWFtICZvcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgY29uc3QgU3ltRXhwciAqZ2V0UkhTKCkgY29uc3QgeyByZXR1cm4gUkhTOyB9CiAgIGNvbnN0IGxsdm06OkFQU0ludCAmZ2V0TEhTKCkgY29uc3QgeyByZXR1cm4gTEhTOyB9CkBAIC00MjcsNyArNDI0LDcgQEAKICAgICBJRC5BZGQodCk7CiAgIH0KIAotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIHsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBvdmVycmlkZSB7CiAgICAgUHJvZmlsZShJRCwgTEhTLCBnZXRPcGNvZGUoKSwgUkhTLCBnZXRUeXBlKCkpOwogICB9CiAKQEAgLTQ1MCw3ICs0NDcsNyBAQAogICBjb25zdCBTeW1FeHByICpnZXRMSFMoKSBjb25zdCB7IHJldHVybiBMSFM7IH0KICAgY29uc3QgU3ltRXhwciAqZ2V0UkhTKCkgY29uc3QgeyByZXR1cm4gUkhTOyB9CiAKLSAgdmlydHVhbCB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworICB2b2lkIGR1bXBUb1N0cmVhbShyYXdfb3N0cmVhbSAmb3MpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHN0YXRpYyB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQsIGNvbnN0IFN5bUV4cHIgKmxocywKICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwgY29uc3QgU3ltRXhwciAqcmhzLCBRdWFsVHlwZSB0KSB7CkBAIC00NjEsNyArNDU4LDcgQEAKICAgICBJRC5BZGQodCk7CiAgIH0KIAotICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCYgSUQpIHsKKyAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBvdmVycmlkZSB7CiAgICAgUHJvZmlsZShJRCwgTEhTLCBnZXRPcGNvZGUoKSwgUkhTLCBnZXRUeXBlKCkpOwogICB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5hbHlzaXNDb25zdW1lci5oIGIvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9BbmFseXNpc0NvbnN1bWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlNWQzZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5hbHlzaXNDb25zdW1lci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vPT09LS0tIEFuYWx5c2lzQ29uc3VtZXIuaCAtIEZyb250LWVuZCBBbmFseXNpcyBFbmdpbmUgSG9va3MgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgY29udGFpbnMgdGhlIGZ1bmN0aW9ucyBuZWNlc3NhcnkgZm9yIGEgZnJvbnQtZW5kIHRvIHJ1biB2YXJpb3VzCisvLyBhbmFseXNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ0xBTkdfR1JfQU5BTFlTSVNDT05TVU1FUl9ICisjZGVmaW5lIExMVk1fQ0xBTkdfR1JfQU5BTFlTSVNDT05TVU1FUl9ICisKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29uc3VtZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9BbmFseXplck9wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL1BhdGhEaWFnbm9zdGljLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgY2xhbmcgeworCitjbGFzcyBQcmVwcm9jZXNzb3I7CitjbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKKworbmFtZXNwYWNlIGVudG8geworY2xhc3MgQ2hlY2tlck1hbmFnZXI7CisKK2NsYXNzIEFuYWx5c2lzQVNUQ29uc3VtZXIgOiBwdWJsaWMgQVNUQ29uc3VtZXIgeworcHVibGljOgorICB2aXJ0dWFsIHZvaWQgQWRkRGlhZ25vc3RpY0NvbnN1bWVyKFBhdGhEaWFnbm9zdGljQ29uc3VtZXIgKkNvbnN1bWVyKSA9IDA7Cit9OworCisvLy8gQ3JlYXRlQW5hbHlzaXNDb25zdW1lciAtIENyZWF0ZXMgYW4gQVNUQ29uc3VtZXIgdG8gcnVuIHZhcmlvdXMgY29kZQorLy8vIGFuYWx5c2lzIHBhc3Nlcy4gIChUaGUgc2V0IG9mIGFuYWx5c2VzIHJ1biBpcyBjb250cm9sbGVkIGJ5IGNvbW1hbmQtbGluZQorLy8vIG9wdGlvbnMuKQorQW5hbHlzaXNBU1RDb25zdW1lciAqQ3JlYXRlQW5hbHlzaXNDb25zdW1lcihjb25zdCBQcmVwcm9jZXNzb3IgJnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFseXplck9wdGlvbnNSZWYgb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IHBsdWdpbnMpOworCit9IC8vIGVuZCBHUiBuYW1lc3BhY2UKKworfSAvLyBlbmQgY2xhbmcgbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaCBiL2luY2x1ZGUvY2xhbmcvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmgKaW5kZXggODM4YWM5Mi4uMjFlY2ZjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaAorKysgYi9pbmNsdWRlL2NsYW5nL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5oCkBAIC0yMiw4ICsyMiw4IEBACiAKIGNsYXNzIEFuYWx5c2lzQWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpOworICBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZTsKIH07CiAKIHZvaWQgcHJpbnRDaGVja2VySGVscChyYXdfb3N0cmVhbSAmT1MsIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBwbHVnaW5zKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Bcmd1bWVudHNBZGp1c3RlcnMuaCBiL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Bcmd1bWVudHNBZGp1c3RlcnMuaAppbmRleCA3MWFjZWY4Li43NjVlN2QyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQXJndW1lbnRzQWRqdXN0ZXJzLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0FyZ3VtZW50c0FkanVzdGVycy5oCkBAIC00OSwxMyArNDksMTMgQEAKIC8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgQXJndW1lbnRzQWRqdXN0ZXIgaW50ZXJmYWNlIGFuZCBjb252ZXJ0cyBpbnB1dAogLy8vIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gdGhlICJzeW50YXggY2hlY2sgb25seSIgdmFyaWFudC4KIGNsYXNzIENsYW5nU3ludGF4T25seUFkanVzdGVyIDogcHVibGljIEFyZ3VtZW50c0FkanVzdGVyIHsKLSAgdmlydHVhbCBDb21tYW5kTGluZUFyZ3VtZW50cyBBZGp1c3QoY29uc3QgQ29tbWFuZExpbmVBcmd1bWVudHMgJkFyZ3MpOworICBDb21tYW5kTGluZUFyZ3VtZW50cyBBZGp1c3QoY29uc3QgQ29tbWFuZExpbmVBcmd1bWVudHMgJkFyZ3MpIG92ZXJyaWRlOwogfTsKIAogLy8vIFxicmllZiBBbiBhcmd1bWVudCBhZGp1c3RlciB3aGljaCByZW1vdmVzIG91dHB1dC1yZWxhdGVkIGNvbW1hbmQgbGluZQogLy8vIGFyZ3VtZW50cy4KIGNsYXNzIENsYW5nU3RyaXBPdXRwdXRBZGp1c3RlciA6IHB1YmxpYyBBcmd1bWVudHNBZGp1c3RlciB7Ci0gIHZpcnR1YWwgQ29tbWFuZExpbmVBcmd1bWVudHMgQWRqdXN0KGNvbnN0IENvbW1hbmRMaW5lQXJndW1lbnRzICZBcmdzKTsKKyAgQ29tbWFuZExpbmVBcmd1bWVudHMgQWRqdXN0KGNvbnN0IENvbW1hbmRMaW5lQXJndW1lbnRzICZBcmdzKSBvdmVycmlkZTsKIH07CiAKIH0gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQ29tbW9uT3B0aW9uc1BhcnNlci5oIGIvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0NvbW1vbk9wdGlvbnNQYXJzZXIuaAppbmRleCBlYWZmZTQzLi4xZjMyY2Q4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQ29tbW9uT3B0aW9uc1BhcnNlci5oCisrKyBiL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Db21tb25PcHRpb25zUGFyc2VyLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNkZWZpbmUgTExWTV9UT09MU19DTEFOR19JTkNMVURFX0NMQU5HX1RPT0xJTkdfQ09NTU9OT1BUSU9OU1BBUlNFUl9ICiAKICNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKIAogbmFtZXNwYWNlIGNsYW5nIHsKIG5hbWVzcGFjZSB0b29saW5nIHsKQEAgLTQ2LDEzICs0NywxNCBAQAogLy8vIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6dG9vbGluZzsKIC8vLyB1c2luZyBuYW1lc3BhY2UgbGx2bTsKIC8vLworLy8vIHN0YXRpYyBjbDo6T3B0aW9uQ2F0ZWdvcnkgTXlUb29sQ2F0ZWdvcnkoIk15IHRvb2wgb3B0aW9ucyIpOwogLy8vIHN0YXRpYyBjbDo6ZXh0cmFoZWxwIENvbW1vbkhlbHAoQ29tbW9uT3B0aW9uc1BhcnNlcjo6SGVscE1lc3NhZ2UpOwogLy8vIHN0YXRpYyBjbDo6ZXh0cmFoZWxwIE1vcmVIZWxwKCJcbk1vcmUgaGVscCB0ZXh0Li4uIik7CiAvLy8gc3RhdGljIGNsOm9wdDxib29sPiBZb3VyT3duT3B0aW9uKC4uLik7CiAvLy8gLi4uCiAvLy8KIC8vLyBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIHsKLS8vLyAgIENvbW1vbk9wdGlvbnNQYXJzZXIgT3B0aW9uc1BhcnNlcihhcmdjLCBhcmd2KTsKKy8vLyAgIENvbW1vbk9wdGlvbnNQYXJzZXIgT3B0aW9uc1BhcnNlcihhcmdjLCBhcmd2LCBNeVRvb2xDYXRlZ29yeSk7CiAvLy8gICBDbGFuZ1Rvb2wgVG9vbChPcHRpb25zUGFyc2VyLmdldENvbXBpbGF0aW9ucygpLAogLy8vICAgICAgICAgICAgICAgICAgT3B0aW9uc1BhcnNlci5nZXRTb3VyY2VQYXRoTGlzdGkoKSk7CiAvLy8gICByZXR1cm4gVG9vbC5ydW4obmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5PGNsYW5nOjpTeW50YXhPbmx5QWN0aW9uPigpKTsKQEAgLTYxLDEwICs2MywxNiBAQAogY2xhc3MgQ29tbW9uT3B0aW9uc1BhcnNlciB7CiBwdWJsaWM6CiAgIC8vLyBcYnJpZWYgUGFyc2VzIGNvbW1hbmQtbGluZSwgaW5pdGlhbGl6ZXMgYSBjb21waWxhdGlvbiBkYXRhYmFzZS4KKyAgLy8vCiAgIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGNhbiBjaGFuZ2UgYXJnYyBhbmQgYXJndiBjb250ZW50cywgZS5nLiBjb25zdW1lCiAgIC8vLyBjb21tYW5kLWxpbmUgb3B0aW9ucyB1c2VkIGZvciBjcmVhdGluZyBGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2UuCisgIC8vLworICAvLy8gQWxsIG9wdGlvbnMgbm90IGJlbG9uZ2luZyB0byBccCBDYXRlZ29yeSBiZWNvbWUgaGlkZGVuLgorICAvLy8KICAgLy8vIFRoaXMgY29uc3RydWN0b3IgZXhpdHMgcHJvZ3JhbSBpbiBjYXNlIG9mIGVycm9yLgotICBDb21tb25PcHRpb25zUGFyc2VyKGludCAmYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKk92ZXJ2aWV3ID0gMCk7CisgIENvbW1vbk9wdGlvbnNQYXJzZXIoaW50ICZhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpjbDo6T3B0aW9uQ2F0ZWdvcnkgJkNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk92ZXJ2aWV3ID0gMCk7CiAKICAgLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxvYWRlZCBjb21waWxhdGlvbnMgZGF0YWJhc2UuCiAgIENvbXBpbGF0aW9uRGF0YWJhc2UgJmdldENvbXBpbGF0aW9ucygpIHsKQEAgLTc5LDcgKzg3LDcgQEAKICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEhlbHBNZXNzYWdlOwogCiBwcml2YXRlOgotICBPd25pbmdQdHI8Q29tcGlsYXRpb25EYXRhYmFzZT4gQ29tcGlsYXRpb25zOworICBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsYXRpb25EYXRhYmFzZT4gQ29tcGlsYXRpb25zOwogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU291cmNlUGF0aExpc3Q7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZS5oIGIvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2UuaAppbmRleCA4Y2NhMzI5Li5kMWU3MjlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlLmgKQEAgLTMwLDkgKzMwLDkgQEAKIAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKICNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgogI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKQEAgLTQyLDggKzQyLDggQEAKIC8vLyBcYnJpZWYgU3BlY2lmaWVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgY29tbWFuZCBvZiBhIGNvbXBpbGF0aW9uLgogc3RydWN0IENvbXBpbGVDb21tYW5kIHsKICAgQ29tcGlsZUNvbW1hbmQoKSB7fQotICBDb21waWxlQ29tbWFuZChUd2luZSBEaXJlY3RvcnksIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBDb21tYW5kTGluZSkKLSAgICA6IERpcmVjdG9yeShEaXJlY3Rvcnkuc3RyKCkpLCBDb21tYW5kTGluZShDb21tYW5kTGluZSkge30KKyAgQ29tcGlsZUNvbW1hbmQoVHdpbmUgRGlyZWN0b3J5LCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29tbWFuZExpbmUpCisgICAgICA6IERpcmVjdG9yeShEaXJlY3Rvcnkuc3RyKCkpLCBDb21tYW5kTGluZShzdGQ6Om1vdmUoQ29tbWFuZExpbmUpKSB7fQogCiAgIC8vLyBcYnJpZWYgVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRoZSBjb21tYW5kIHdhcyBleGVjdXRlZCBmcm9tLgogICBzdGQ6OnN0cmluZyBEaXJlY3Rvcnk7CkBAIC0xNjYsNyArMTY2LDcgQEAKICAgLy8vIFRoZSBhcmd1bWVudCBsaXN0IGlzIG1lYW50IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBub3JtYWwgbGx2bSBjb21tYW5kIGxpbmUKICAgLy8vIHBhcnNpbmcgaW4gbWFpbiBtZXRob2RzLgogICAvLy8gaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIC8vLyAgIE93bmluZ1B0cjxGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2U+IENvbXBpbGF0aW9ucygKKyAgLy8vICAgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ29tcGlsYXRpb25EYXRhYmFzZT4gQ29tcGlsYXRpb25zKAogICAvLy8gICAgIEZpeGVkQ29tcGlsYXRpb25EYXRhYmFzZTo6bG9hZEZyb21Db21tYW5kTGluZShhcmdjLCBhcmd2KSk7CiAgIC8vLyAgIGNsOjpQYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgLy8vICAgLi4uCkBAIC0xOTAsMTkgKzE5MCwxOSBAQAogICAvLy8gV2lsbCBhbHdheXMgcmV0dXJuIGEgdmVjdG9yIHdpdGggb25lIGVudHJ5IHRoYXQgY29udGFpbnMgdGhlIGRpcmVjdG9yeQogICAvLy8gYW5kIGNvbW1hbmQgbGluZSBzcGVjaWZpZWQgYXQgY29uc3RydWN0aW9uIHdpdGggImNsYW5nLXRvb2wiIGFzIGFyZ3ZbMF0KICAgLy8vIGFuZCAnRmlsZVBhdGgnIGFzIHBvc2l0aW9uYWwgYXJndW1lbnQuCi0gIHZpcnR1YWwgc3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmQ+IGdldENvbXBpbGVDb21tYW5kcygKLSAgICBTdHJpbmdSZWYgRmlsZVBhdGgpIGNvbnN0OworICBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZD4KKyAgZ2V0Q29tcGlsZUNvbW1hbmRzKFN0cmluZ1JlZiBGaWxlUGF0aCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBmaWxlcyBhdmFpbGFibGUgaW4gdGhlIGNvbXBpbGF0aW9uIGRhdGFiYXNlLgogICAvLy8KICAgLy8vIE5vdGU6IFRoaXMgaXMgYWx3YXlzIGFuIGVtcHR5IGxpc3QgZm9yIHRoZSBmaXhlZCBjb21waWxhdGlvbiBkYXRhYmFzZS4KLSAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0QWxsRmlsZXMoKSBjb25zdDsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldEFsbEZpbGVzKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBSZXR1cm5zIGFsbCBjb21waWxlIGNvbW1hbmRzIGZvciBhbGwgdGhlIGZpbGVzIGluIHRoZSBjb21waWxhdGlvbgogICAvLy8gZGF0YWJhc2UuCiAgIC8vLwogICAvLy8gTm90ZTogVGhpcyBpcyBhbHdheXMgYW4gZW1wdHkgbGlzdCBmb3IgdGhlIGZpeGVkIGNvbXBpbGF0aW9uIGRhdGFiYXNlLgotICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPiBnZXRBbGxDb21waWxlQ29tbWFuZHMoKSBjb25zdDsKKyAgc3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmQ+IGdldEFsbENvbXBpbGVDb21tYW5kcygpIGNvbnN0IG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAvLy8gVGhpcyBpcyBidWlsdCB1cCB0byBjb250YWluIGEgc2luZ2xlIGVudHJ5IHZlY3RvciB0byBiZSByZXR1cm5lZCBmcm9tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvRmlsZU1hdGNoVHJpZS5oIGIvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0ZpbGVNYXRjaFRyaWUuaAppbmRleCBlNTMxODU0Li5iZTM3YmFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvRmlsZU1hdGNoVHJpZS5oCisrKyBiL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9GaWxlTWF0Y2hUcmllLmgKQEAgLTE2LDggKzE2LDggQEAKICNkZWZpbmUgTExWTV9DTEFOR19UT09MSU5HX0ZJTEVfTUFUQ0hfVFJJRV9ICiAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKQEAgLTc5LDcgKzc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZFcnJvcikgY29uc3Q7CiBwcml2YXRlOgogICBGaWxlTWF0Y2hUcmllTm9kZSAqUm9vdDsKLSAgT3duaW5nUHRyPFBhdGhDb21wYXJhdG9yPiBDb21wYXJhdG9yOworICBzdGQ6OnVuaXF1ZV9wdHI8UGF0aENvbXBhcmF0b3I+IENvbXBhcmF0b3I7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9KU09OQ29tcGlsYXRpb25EYXRhYmFzZS5oIGIvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0pTT05Db21waWxhdGlvbkRhdGFiYXNlLmgKaW5kZXggZTNmMTQ5Yi4uMWIzMzM1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0pTT05Db21waWxhdGlvbkRhdGFiYXNlLmgKKysrIGIvaW5jbHVkZS9jbGFuZy9Ub29saW5nL0pTT05Db21waWxhdGlvbkRhdGFiYXNlLmgKQEAgLTE4LDEyICsxOCwxMiBAQAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKICNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2UuaCIKICNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0ZpbGVNYXRjaFRyaWUuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MUGFyc2VyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKQEAgLTY3LDE3ICs2NywxNyBAQAogICAvLy8KICAgLy8vIEZJWE1FOiBDdXJyZW50bHkgRmlsZVBhdGggbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoIGluc2lkZSB0aGUKICAgLy8vIHNvdXJjZSBkaXJlY3Rvcnkgd2hpY2ggZG9lcyBub3QgaGF2ZSBzeW1saW5rcyByZXNvbHZlZC4KLSAgdmlydHVhbCBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZD4gZ2V0Q29tcGlsZUNvbW1hbmRzKAotICAgIFN0cmluZ1JlZiBGaWxlUGF0aCkgY29uc3Q7CisgIHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPgorICBnZXRDb21waWxlQ29tbWFuZHMoU3RyaW5nUmVmIEZpbGVQYXRoKSBjb25zdCBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIGZpbGVzIGF2YWlsYWJsZSBpbiB0aGUgY29tcGlsYXRpb24gZGF0YWJhc2UuCiAgIC8vLwogICAvLy8gVGhlc2UgYXJlIHRoZSAnZmlsZScgZW50cmllcyBvZiB0aGUgSlNPTiBvYmplY3RzLgotICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXRBbGxGaWxlcygpIGNvbnN0OworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0QWxsRmlsZXMoKSBjb25zdCBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJldHVybnMgYWxsIGNvbXBpbGUgY29tbWFuZHMgZm9yIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGNvbXBpbGF0aW9uCiAgIC8vLyBkYXRhYmFzZS4KLSAgdmlydHVhbCBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZD4gZ2V0QWxsQ29tcGlsZUNvbW1hbmRzKCkgY29uc3Q7CisgIHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPiBnZXRBbGxDb21waWxlQ29tbWFuZHMoKSBjb25zdCBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgSlNPTiBjb21waWxhdGlvbiBkYXRhYmFzZSBvbiBhIG1lbW9yeSBidWZmZXIuCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogICBGaWxlTWF0Y2hUcmllIE1hdGNoVHJpZTsKIAotICBPd25pbmdQdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBEYXRhYmFzZTsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gRGF0YWJhc2U7CiAgIGxsdm06OlNvdXJjZU1nciBTTTsKICAgbGx2bTo6eWFtbDo6U3RyZWFtIFlBTUxTdHJlYW07CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlZmFjdG9yaW5nLmggYi9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcuaAppbmRleCA0M2VjOWFjLi5jZDJmYjlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcuaAorKysgYi9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmcuaApAQCAtODMsMTYgKzgzLDE2IEBACiAKICAgLy8vIFxicmllZiBDcmVhdGVzIGEgUmVwbGFjZW1lbnQgb2YgdGhlIHJhbmdlIFtTdGFydCwgU3RhcnQrTGVuZ3RoKSB3aXRoCiAgIC8vLyBSZXBsYWNlbWVudFRleHQuCi0gIFJlcGxhY2VtZW50KFNvdXJjZU1hbmFnZXIgJlNvdXJjZXMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0LCB1bnNpZ25lZCBMZW5ndGgsCisgIFJlcGxhY2VtZW50KGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNvdXJjZXMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0LCB1bnNpZ25lZCBMZW5ndGgsCiAgICAgICAgICAgICAgIFN0cmluZ1JlZiBSZXBsYWNlbWVudFRleHQpOwogCiAgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhIFJlcGxhY2VtZW50IG9mIHRoZSBnaXZlbiByYW5nZSB3aXRoIFJlcGxhY2VtZW50VGV4dC4KLSAgUmVwbGFjZW1lbnQoU291cmNlTWFuYWdlciAmU291cmNlcywgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSYW5nZSwKKyAgUmVwbGFjZW1lbnQoY29uc3QgU291cmNlTWFuYWdlciAmU291cmNlcywgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSYW5nZSwKICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlcGxhY2VtZW50VGV4dCk7CiAKICAgLy8vIFxicmllZiBDcmVhdGVzIGEgUmVwbGFjZW1lbnQgb2YgdGhlIG5vZGUgd2l0aCBSZXBsYWNlbWVudFRleHQuCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlPgotICBSZXBsYWNlbWVudChTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLCBjb25zdCBOb2RlICZOb2RlVG9SZXBsYWNlLAorICBSZXBsYWNlbWVudChjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLCBjb25zdCBOb2RlICZOb2RlVG9SZXBsYWNlLAogICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVwbGFjZW1lbnRUZXh0KTsKIAogICAvLy8gXGJyaWVmIFJldHVybnMgd2hldGhlciB0aGlzIHJlcGxhY2VtZW50IGNhbiBiZSBhcHBsaWVkIHRvIGEgZmlsZS4KQEAgLTExNSw5ICsxMTUsMTAgQEAKICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKIAogIHByaXZhdGU6Ci0gIHZvaWQgc2V0RnJvbVNvdXJjZUxvY2F0aW9uKFNvdXJjZU1hbmFnZXIgJlNvdXJjZXMsIFNvdXJjZUxvY2F0aW9uIFN0YXJ0LAorICB2b2lkIHNldEZyb21Tb3VyY2VMb2NhdGlvbihjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLCBTb3VyY2VMb2NhdGlvbiBTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGVuZ3RoLCBTdHJpbmdSZWYgUmVwbGFjZW1lbnRUZXh0KTsKLSAgdm9pZCBzZXRGcm9tU291cmNlUmFuZ2UoU291cmNlTWFuYWdlciAmU291cmNlcywgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSYW5nZSwKKyAgdm9pZCBzZXRGcm9tU291cmNlUmFuZ2UoY29uc3QgU291cmNlTWFuYWdlciAmU291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlcGxhY2VtZW50VGV4dCk7CiAKICAgc3RkOjpzdHJpbmcgRmlsZVBhdGg7CkBAIC0yMzAsOCArMjMxLDggQEAKIH07CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlPgotUmVwbGFjZW1lbnQ6OlJlcGxhY2VtZW50KFNvdXJjZU1hbmFnZXIgJlNvdXJjZXMsIGNvbnN0IE5vZGUgJk5vZGVUb1JlcGxhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlcGxhY2VtZW50VGV4dCkgeworUmVwbGFjZW1lbnQ6OlJlcGxhY2VtZW50KGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTm9kZSAmTm9kZVRvUmVwbGFjZSwgU3RyaW5nUmVmIFJlcGxhY2VtZW50VGV4dCkgewogICBjb25zdCBDaGFyU291cmNlUmFuZ2UgUmFuZ2UgPQogICAgICAgQ2hhclNvdXJjZVJhbmdlOjpnZXRUb2tlblJhbmdlKE5vZGVUb1JlcGxhY2UtPmdldFNvdXJjZVJhbmdlKCkpOwogICBzZXRGcm9tU291cmNlUmFuZ2UoU291cmNlcywgUmFuZ2UsIFJlcGxhY2VtZW50VGV4dCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVmYWN0b3JpbmdDYWxsYmFja3MuaCBiL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZ0NhbGxiYWNrcy5oCmluZGV4IGM1MDBmMzUuLjE5ZjI3NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZ0NhbGxiYWNrcy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZ0NhbGxiYWNrcy5oCkBAIC01Miw3ICs1Miw3IEBACiBjbGFzcyBSZXBsYWNlU3RtdFdpdGhUZXh0IDogcHVibGljIFJlZmFjdG9yaW5nQ2FsbGJhY2sgewogcHVibGljOgogICBSZXBsYWNlU3RtdFdpdGhUZXh0KFN0cmluZ1JlZiBGcm9tSWQsIFN0cmluZ1JlZiBUb1RleHQpOwotICB2aXJ0dWFsIHZvaWQgcnVuKGNvbnN0IGFzdF9tYXRjaGVyczo6TWF0Y2hGaW5kZXI6Ok1hdGNoUmVzdWx0ICZSZXN1bHQpOworICB2b2lkIHJ1bihjb25zdCBhc3RfbWF0Y2hlcnM6Ok1hdGNoRmluZGVyOjpNYXRjaFJlc3VsdCAmUmVzdWx0KSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgc3RkOjpzdHJpbmcgRnJvbUlkOwpAQCAtNjQsNyArNjQsNyBAQAogY2xhc3MgUmVwbGFjZVN0bXRXaXRoU3RtdCA6IHB1YmxpYyBSZWZhY3RvcmluZ0NhbGxiYWNrIHsKIHB1YmxpYzoKICAgUmVwbGFjZVN0bXRXaXRoU3RtdChTdHJpbmdSZWYgRnJvbUlkLCBTdHJpbmdSZWYgVG9JZCk7Ci0gIHZpcnR1YWwgdm9pZCBydW4oY29uc3QgYXN0X21hdGNoZXJzOjpNYXRjaEZpbmRlcjo6TWF0Y2hSZXN1bHQgJlJlc3VsdCk7CisgIHZvaWQgcnVuKGNvbnN0IGFzdF9tYXRjaGVyczo6TWF0Y2hGaW5kZXI6Ok1hdGNoUmVzdWx0ICZSZXN1bHQpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICBzdGQ6OnN0cmluZyBGcm9tSWQ7CkBAIC03Nyw3ICs3Nyw3IEBACiBjbGFzcyBSZXBsYWNlSWZTdG10V2l0aEl0c0JvZHkgOiBwdWJsaWMgUmVmYWN0b3JpbmdDYWxsYmFjayB7CiBwdWJsaWM6CiAgIFJlcGxhY2VJZlN0bXRXaXRoSXRzQm9keShTdHJpbmdSZWYgSWQsIGJvb2wgUGlja1RydWVCcmFuY2gpOwotICB2aXJ0dWFsIHZvaWQgcnVuKGNvbnN0IGFzdF9tYXRjaGVyczo6TWF0Y2hGaW5kZXI6Ok1hdGNoUmVzdWx0ICZSZXN1bHQpOworICB2b2lkIHJ1bihjb25zdCBhc3RfbWF0Y2hlcnM6Ok1hdGNoRmluZGVyOjpNYXRjaFJlc3VsdCAmUmVzdWx0KSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgc3RkOjpzdHJpbmcgSWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVwbGFjZW1lbnRzWWFtbC5oIGIvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1JlcGxhY2VtZW50c1lhbWwuaAppbmRleCAxOGQzMjU5Li5hYzlmNDY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvUmVwbGFjZW1lbnRzWWFtbC5oCisrKyBiL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9SZXBsYWNlbWVudHNZYW1sLmgKQEAgLTE4LDI2ICsxOCwxNCBAQAogCiAjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCi0jaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIExMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoY2xhbmc6OnRvb2xpbmc6OlJlcGxhY2VtZW50KQogCiBuYW1lc3BhY2UgbGx2bSB7CiBuYW1lc3BhY2UgeWFtbCB7CiAKLS8vLyBcYnJpZWYgU2NhbGFyVHJhaXRzIHRvIHJlYWQvd3JpdGUgc3RkOjpzdHJpbmcgb2JqZWN0cy4KLXRlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJUcmFpdHM8c3RkOjpzdHJpbmc+IHsKLSAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IHN0ZDo6c3RyaW5nICZWYWwsIHZvaWQgKiwgbGx2bTo6cmF3X29zdHJlYW0gJk91dCkgewotICAgIE91dCA8PCBWYWw7Ci0gIH0KLQotICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiBTY2FsYXIsIHZvaWQgKiwgc3RkOjpzdHJpbmcgJlZhbCkgewotICAgIFZhbCA9IFNjYWxhcjsKLSAgICByZXR1cm4gU3RyaW5nUmVmKCk7Ci0gIH0KLX07Ci0KIC8vLyBcYnJpZWYgU3BlY2lhbGl6ZWQgTWFwcGluZ1RyYWl0cyB0byBkZXNjcmliZSBob3cgYSBSZXBsYWNlbWVudCBpcwogLy8vIChkZSlzZXJpYWxpemVkLgogdGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8Y2xhbmc6OnRvb2xpbmc6OlJlcGxhY2VtZW50PiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvVG9vbGluZy5oIGIvaW5jbHVkZS9jbGFuZy9Ub29saW5nL1Rvb2xpbmcuaAppbmRleCBkZTUwN2E3Li4wOTdhN2E4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYW5nL1Rvb2xpbmcvVG9vbGluZy5oCisrKyBiL2luY2x1ZGUvY2xhbmcvVG9vbGluZy9Ub29saW5nLmgKQEAgLTgwLDcgKzgwLDcgQEAKIAogICAvLy8gXGJyaWVmIEludm9rZXMgdGhlIGNvbXBpbGVyIHdpdGggYSBGcm9udGVuZEFjdGlvbiBjcmVhdGVkIGJ5IGNyZWF0ZSgpLgogICBib29sIHJ1bkludm9jYXRpb24oY2xhbmc6OkNvbXBpbGVySW52b2NhdGlvbiAqSW52b2NhdGlvbiwgRmlsZU1hbmFnZXIgKkZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY0NvbnN1bWVyICpEaWFnQ29uc3VtZXIpOworICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY0NvbnN1bWVyICpEaWFnQ29uc3VtZXIpIG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgUmV0dXJucyBhIG5ldyBjbGFuZzo6RnJvbnRlbmRBY3Rpb24uCiAgIC8vLwpAQCAtMTg2LDcgKzE4Niw3IEBACiAgIC8vLyBccGFyYW0gRkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBDbGFzcyB0YWtlcyBvd25lcnNoaXAuCiAgIC8vLyBccGFyYW0gRmlsZXMgVGhlIEZpbGVNYW5hZ2VyIHVzZWQgZm9yIHRoZSBleGVjdXRpb24uIENsYXNzIGRvZXMgbm90IHRha2UKICAgLy8vIG93bmVyc2hpcC4KLSAgVG9vbEludm9jYXRpb24oQXJyYXlSZWY8c3RkOjpzdHJpbmc+IENvbW1hbmRMaW5lLCBGcm9udGVuZEFjdGlvbiAqRkFjdGlvbiwKKyAgVG9vbEludm9jYXRpb24oc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IENvbW1hbmRMaW5lLCBGcm9udGVuZEFjdGlvbiAqRkFjdGlvbiwKICAgICAgICAgICAgICAgICAgRmlsZU1hbmFnZXIgKkZpbGVzKTsKIAogICAvLy8gXGJyaWVmIENyZWF0ZSBhIHRvb2wgaW52b2NhdGlvbi4KQEAgLTE5NCw3ICsxOTQsNyBAQAogICAvLy8gXHBhcmFtIENvbW1hbmRMaW5lIFRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGNsYW5nLgogICAvLy8gXHBhcmFtIEFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLgogICAvLy8gXHBhcmFtIEZpbGVzIFRoZSBGaWxlTWFuYWdlciB1c2VkIGZvciB0aGUgZXhlY3V0aW9uLgotICBUb29sSW52b2NhdGlvbihBcnJheVJlZjxzdGQ6OnN0cmluZz4gQ29tbWFuZExpbmUsIFRvb2xBY3Rpb24gKkFjdGlvbiwKKyAgVG9vbEludm9jYXRpb24oc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IENvbW1hbmRMaW5lLCBUb29sQWN0aW9uICpBY3Rpb24sCiAgICAgICAgICAgICAgICAgIEZpbGVNYW5hZ2VyICpGaWxlcyk7CiAKICAgflRvb2xJbnZvY2F0aW9uKCk7CkBAIC0zMDYsNyArMzA2LDcgQEAKIEZyb250ZW5kQWN0aW9uRmFjdG9yeSAqbmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5KCkgewogICBjbGFzcyBTaW1wbGVGcm9udGVuZEFjdGlvbkZhY3RvcnkgOiBwdWJsaWMgRnJvbnRlbmRBY3Rpb25GYWN0b3J5IHsKICAgcHVibGljOgotICAgIHZpcnR1YWwgY2xhbmc6OkZyb250ZW5kQWN0aW9uICpjcmVhdGUoKSB7IHJldHVybiBuZXcgVDsgfQorICAgIGNsYW5nOjpGcm9udGVuZEFjdGlvbiAqY3JlYXRlKCkgb3ZlcnJpZGUgeyByZXR1cm4gbmV3IFQ7IH0KICAgfTsKIAogICByZXR1cm4gbmV3IFNpbXBsZUZyb250ZW5kQWN0aW9uRmFjdG9yeTsKQEAgLTMyMSw3ICszMjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlRmlsZUNhbGxiYWNrcyAqQ2FsbGJhY2tzKQogICAgICAgOiBDb25zdW1lckZhY3RvcnkoQ29uc3VtZXJGYWN0b3J5KSwgQ2FsbGJhY2tzKENhbGxiYWNrcykge30KIAotICAgIHZpcnR1YWwgY2xhbmc6OkZyb250ZW5kQWN0aW9uICpjcmVhdGUoKSB7CisgICAgY2xhbmc6OkZyb250ZW5kQWN0aW9uICpjcmVhdGUoKSBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gbmV3IENvbnN1bWVyRmFjdG9yeUFkYXB0b3IoQ29uc3VtZXJGYWN0b3J5LCBDYWxsYmFja3MpOwogICAgIH0KIApAQCAtMzMzLDIwICszMzMsMjAgQEAKICAgICAgICAgOiBDb25zdW1lckZhY3RvcnkoQ29uc3VtZXJGYWN0b3J5KSwgQ2FsbGJhY2tzKENhbGxiYWNrcykge30KIAogICAgICAgY2xhbmc6OkFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihjbGFuZzo6Q29tcGlsZXJJbnN0YW5jZSAmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBDb25zdW1lckZhY3RvcnktPm5ld0FTVENvbnN1bWVyKCk7CiAgICAgICB9CiAKICAgICBwcm90ZWN0ZWQ6Ci0gICAgICB2aXJ0dWFsIGJvb2wgQmVnaW5Tb3VyY2VGaWxlQWN0aW9uKENvbXBpbGVySW5zdGFuY2UgJkNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZW5hbWUpIExMVk1fT1ZFUlJJREUgeworICAgICAgYm9vbCBCZWdpblNvdXJjZUZpbGVBY3Rpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZW5hbWUpIG92ZXJyaWRlIHsKICAgICAgICAgaWYgKCFjbGFuZzo6QVNURnJvbnRlbmRBY3Rpb246OkJlZ2luU291cmNlRmlsZUFjdGlvbihDSSwgRmlsZW5hbWUpKQogICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgaWYgKENhbGxiYWNrcyAhPSBOVUxMKQogICAgICAgICAgIHJldHVybiBDYWxsYmFja3MtPmhhbmRsZUJlZ2luU291cmNlKENJLCBGaWxlbmFtZSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQotICAgICAgdmlydHVhbCB2b2lkIEVuZFNvdXJjZUZpbGVBY3Rpb24oKSBMTFZNX09WRVJSSURFIHsKKyAgICAgIHZvaWQgRW5kU291cmNlRmlsZUFjdGlvbigpIG92ZXJyaWRlIHsKICAgICAgICAgaWYgKENhbGxiYWNrcyAhPSBOVUxMKQogICAgICAgICAgIENhbGxiYWNrcy0+aGFuZGxlRW5kU291cmNlKCk7CiAgICAgICAgIGNsYW5nOjpBU1RGcm9udGVuZEFjdGlvbjo6RW5kU291cmNlRmlsZUFjdGlvbigpOwpkaWZmIC0tZ2l0IGEvbGliL0FSQ01pZ3JhdGUvQVJDTVQuY3BwIGIvbGliL0FSQ01pZ3JhdGUvQVJDTVQuY3BwCmluZGV4IDNlNDI5YmUuLjE3OGVjODQgMTAwNjQ0Ci0tLSBhL2xpYi9BUkNNaWdyYXRlL0FSQ01ULmNwcAorKysgYi9saWIvQVJDTWlncmF0ZS9BUkNNVC5jcHAKQEAgLTEwMyw4ICsxMDMsOCBAQAogICAgIDogRGlhZ3MoZGlhZ3MpLCBEaWFnQ2xpZW50KGNsaWVudCksIENhcHR1cmVkRGlhZ3MoY2FwdHVyZWREaWFncyksCiAgICAgICBIYXNCZWd1blNvdXJjZUZpbGUoZmFsc2UpIHsgfQogCi0gIHZpcnR1YWwgdm9pZCBCZWdpblNvdXJjZUZpbGUoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlcHJvY2Vzc29yICpQUCkgeworICB2b2lkIEJlZ2luU291cmNlRmlsZShjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlcHJvY2Vzc29yICpQUCkgb3ZlcnJpZGUgewogICAgIC8vIFBhc3MgQmVnaW5Tb3VyY2VGaWxlIG1lc3NhZ2Ugb250byBEaWFnQ2xpZW50IG9uIGZpcnN0IGNhbGwuCiAgICAgLy8gVGhlIGNvcnJlc3BvbmRpbmcgRW5kU291cmNlRmlsZSBjYWxsIHdpbGwgYmUgbWFkZSBmcm9tIGFuCiAgICAgLy8gZXhwbGljaXQgY2FsbCB0byBGaW5pc2hDYXB0dXJlLgpAQCAtMTI4LDggKzEyOCw4IEBACiAgICAgYXNzZXJ0KCFIYXNCZWd1blNvdXJjZUZpbGUgJiYgIkZpbmlzaENhcHR1cmUgbm90IGNhbGxlZCEiKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpYyAmSW5mbykgeworICB2b2lkIEhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpYyAmSW5mbykgb3ZlcnJpZGUgewogICAgIGlmIChEaWFnbm9zdGljSURzOjppc0FSQ0RpYWdub3N0aWMoSW5mby5nZXRJRCgpKSB8fAogICAgICAgICBsZXZlbCA+PSBEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3IgfHwgbGV2ZWwgPT0gRGlhZ25vc3RpY3NFbmdpbmU6Ok5vdGUpIHsKICAgICAgIGlmIChJbmZvLmdldExvY2F0aW9uKCkuaXNWYWxpZCgpKQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAKIHN0YXRpYyBDb21waWxlckludm9jYXRpb24gKgogY3JlYXRlSW52b2NhdGlvbkZvck1pZ3JhdGlvbihDb21waWxlckludm9jYXRpb24gJm9yaWdDSSkgewotICBPd25pbmdQdHI8Q29tcGlsZXJJbnZvY2F0aW9uPiBDSW52b2s7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb21waWxlckludm9jYXRpb24+IENJbnZvazsKICAgQ0ludm9rLnJlc2V0KG5ldyBDb21waWxlckludm9jYXRpb24ob3JpZ0NJKSk7CiAgIFByZXByb2Nlc3Nvck9wdGlvbnMgJlBQT3B0cyA9IENJbnZvay0+Z2V0UHJlcHJvY2Vzc29yT3B0cygpOwogICBpZiAoIVBQT3B0cy5JbXBsaWNpdFBDSEluY2x1ZGUuZW1wdHkoKSkgewpAQCAtMjA0LDExICsyMDQsMTEgQEAKICAgICAgIFdhcm5PcHRzLnB1c2hfYmFjaygqSSk7CiAgIH0KICAgV2Fybk9wdHMucHVzaF9iYWNrKCJlcnJvcj1hcmMtdW5zYWZlLXJldGFpbmVkLWFzc2lnbiIpOwotICBDSW52b2stPmdldERpYWdub3N0aWNPcHRzKCkuV2FybmluZ3MgPSBsbHZtX21vdmUoV2Fybk9wdHMpOworICBDSW52b2stPmdldERpYWdub3N0aWNPcHRzKCkuV2FybmluZ3MgPSBzdGQ6Om1vdmUoV2Fybk9wdHMpOwogCiAgIENJbnZvay0+Z2V0TGFuZ09wdHMoKS0+T2JqQ0FSQ1dlYWsgPSBIYXNBUkNSdW50aW1lKG9yaWdDSSk7CiAKLSAgcmV0dXJuIENJbnZvay50YWtlKCk7CisgIHJldHVybiBDSW52b2sucmVsZWFzZSgpOwogfQogCiBzdGF0aWMgdm9pZCBlbWl0UHJlbWlncmF0aW9uRXJyb3JzKGNvbnN0IENhcHR1cmVkRGlhZ0xpc3QgJmFyY0RpYWdzLApAQCAtMjQ2LDcgKzI0Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb0ZpbmFsaXplUmVtb3ZhbCk7CiAgIGFzc2VydCghdHJhbnNmb3Jtcy5lbXB0eSgpKTsKIAotICBPd25pbmdQdHI8Q29tcGlsZXJJbnZvY2F0aW9uPiBDSW52b2s7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb21waWxlckludm9jYXRpb24+IENJbnZvazsKICAgQ0ludm9rLnJlc2V0KGNyZWF0ZUludm9jYXRpb25Gb3JNaWdyYXRpb24ob3JpZ0NJKSk7CiAgIENJbnZvay0+Z2V0RnJvbnRlbmRPcHRzKCkuSW5wdXRzLmNsZWFyKCk7CiAgIENJbnZvay0+Z2V0RnJvbnRlbmRPcHRzKCkuSW5wdXRzLnB1c2hfYmFjayhJbnB1dCk7CkBAIC0yNjMsOCArMjYzLDggQEAKICAgQ2FwdHVyZURpYWdub3N0aWNDb25zdW1lciBlcnJSZWMoKkRpYWdzLCAqRGlhZ0NsaWVudCwgY2FwdHVyZWREaWFncyk7CiAgIERpYWdzLT5zZXRDbGllbnQoJmVyclJlYywgLypTaG91bGRPd25DbGllbnQ9Ki9mYWxzZSk7CiAKLSAgT3duaW5nUHRyPEFTVFVuaXQ+IFVuaXQoCi0gICAgICBBU1RVbml0OjpMb2FkRnJvbUNvbXBpbGVySW52b2NhdGlvbkFjdGlvbihDSW52b2sudGFrZSgpLCBEaWFncykpOworICBzdGQ6OnVuaXF1ZV9wdHI8QVNUVW5pdD4gVW5pdCgKKyAgICAgIEFTVFVuaXQ6OkxvYWRGcm9tQ29tcGlsZXJJbnZvY2F0aW9uQWN0aW9uKENJbnZvay5yZWxlYXNlKCksIERpYWdzKSk7CiAgIGlmICghVW5pdCkgewogICAgIGVyclJlYy5GaW5pc2hDYXB0dXJlKCk7CiAgICAgcmV0dXJuIHRydWU7CkBAIC0zMTAsOCArMzEwLDExIEBACiAgIFRyYW5zZm9ybUFjdGlvbnMgdGVzdEFjdCgqRGlhZ3MsIGNhcHR1cmVkRGlhZ3MsIEN0eCwgVW5pdC0+Z2V0UHJlcHJvY2Vzc29yKCkpOwogICBNaWdyYXRpb25QYXNzIHBhc3MoQ3R4LCBPcmlnR0NNb2RlLCBVbml0LT5nZXRTZW1hKCksIHRlc3RBY3QsIGNhcHR1cmVkRGlhZ3MsCiAgICAgICAgICAgICAgICAgICAgICBBUkNNVE1hY3JvTG9jcyk7Ci0gIHBhc3Muc2V0TlNBbGxvY1JlYWxsb2NFcnJvcihOb05TQWxsb2NSZWFsbG9jRXJyb3IpOwogICBwYXNzLnNldE5vRmluYWxpemVSZW1vdmFsKE5vRmluYWxpemVSZW1vdmFsKTsKKyAgRGlhZ3MtPnNldERpYWdub3N0aWNNYXBwaW5nKGRpYWc6OmVycl9hcmNtdF9uc2FsbG9jX3JlYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb05TQWxsb2NSZWFsbG9jRXJyb3IgPyBkaWFnOjpNQVBfV0FSTklORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGlhZzo6TUFQX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSk7CiAKICAgZm9yICh1bnNpZ25lZCBpPTAsIGUgPSB0cmFuc2Zvcm1zLnNpemUoKTsgaSAhPSBlOyArK2kpCiAgICAgdHJhbnNmb3Jtc1tpXShwYXNzKTsKQEAgLTQxNiw0NCArNDE5LDYgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIGFyY210OjpnZXRGaWxlUmVtYXBwaW5nc0Zyb21GaWxlTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZyxzdGQ6OnN0cmluZz4gPiAmcmVtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdHJpbmdSZWY+IHJlbWFwRmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljQ29uc3VtZXIgKkRpYWdDbGllbnQpIHsKLSAgYm9vbCBoYXNFcnJvck9jY3VycmVkID0gZmFsc2U7Ci0gIGxsdm06OlN0cmluZ01hcDxib29sPiBVbmlxdWVyOwotCi0gIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljSURzPiBEaWFnSUQobmV3IERpYWdub3N0aWNJRHMoKSk7Ci0gIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MoCi0gICAgICBuZXcgRGlhZ25vc3RpY3NFbmdpbmUoRGlhZ0lELCBuZXcgRGlhZ25vc3RpY09wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0NsaWVudCwgLypTaG91bGRPd25DbGllbnQ9Ki9mYWxzZSkpOwotCi0gIGZvciAoQXJyYXlSZWY8U3RyaW5nUmVmPjo6aXRlcmF0b3IKLSAgICAgICAgIEkgPSByZW1hcEZpbGVzLmJlZ2luKCksIEUgPSByZW1hcEZpbGVzLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIFN0cmluZ1JlZiBmaWxlID0gKkk7Ci0KLSAgICBGaWxlUmVtYXBwZXIgcmVtYXBwZXI7Ci0gICAgYm9vbCBlcnIgPSByZW1hcHBlci5pbml0RnJvbUZpbGUoZmlsZSwgKkRpYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaWdub3JlSWZGaWxlc0NoYW5nZWQ9Ki90cnVlKTsKLSAgICBoYXNFcnJvck9jY3VycmVkID0gaGFzRXJyb3JPY2N1cnJlZCB8fCBlcnI7Ci0gICAgaWYgKGVycikKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgUHJlcHJvY2Vzc29yT3B0aW9ucyBQUE9wdHM7Ci0gICAgcmVtYXBwZXIuYXBwbHlNYXBwaW5ncyhQUE9wdHMpOwotICAgIGZvciAoUHJlcHJvY2Vzc29yT3B0aW9uczo6cmVtYXBwZWRfZmlsZV9pdGVyYXRvcgotICAgICAgICAgICBSSSA9IFBQT3B0cy5yZW1hcHBlZF9maWxlX2JlZ2luKCksIFJFID0gUFBPcHRzLnJlbWFwcGVkX2ZpbGVfZW5kKCk7Ci0gICAgICAgICAgIFJJICE9IFJFOyArK1JJKSB7Ci0gICAgICBib29sICZpbnNlcnRlZCA9IFVuaXF1ZXJbUkktPmZpcnN0XTsKLSAgICAgIGlmIChpbnNlcnRlZCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBpbnNlcnRlZCA9IHRydWU7Ci0gICAgICByZW1hcC5wdXNoX2JhY2soKlJJKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gaGFzRXJyb3JPY2N1cnJlZDsKLX0KIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIC8vIENvbGxlY3RUcmFuc2Zvcm1BY3Rpb25zLgpAQCAtNDY4LDggKzQzMyw4IEBACiAgIEFSQ01UTWFjcm9UcmFja2VyUFBDYWxsYmFja3Moc3RkOjp2ZWN0b3I8U291cmNlTG9jYXRpb24+ICZBUkNNVE1hY3JvTG9jcykKICAgICA6IEFSQ01UTWFjcm9Mb2NzKEFSQ01UTWFjcm9Mb2NzKSB7IH0KIAotICB2aXJ0dWFsIHZvaWQgTWFjcm9FeHBhbmRzKGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSYW5nZSwgY29uc3QgTWFjcm9BcmdzICpBcmdzKSB7CisgIHZvaWQgTWFjcm9FeHBhbmRzKGNvbnN0IFRva2VuICZNYWNyb05hbWVUb2ssIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCwKKyAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUmFuZ2UsIGNvbnN0IE1hY3JvQXJncyAqQXJncykgb3ZlcnJpZGUgewogICAgIGlmIChNYWNyb05hbWVUb2suZ2V0SWRlbnRpZmllckluZm8oKS0+Z2V0TmFtZSgpID09IGdldEFSQ01UTWFjcm9OYW1lKCkpCiAgICAgICBBUkNNVE1hY3JvTG9jcy5wdXNoX2JhY2soTWFjcm9OYW1lVG9rLmdldExvY2F0aW9uKCkpOwogICB9CkBAIC00ODIsOCArNDQ3LDggQEAKICAgQVJDTVRNYWNyb1RyYWNrZXJBY3Rpb24oc3RkOjp2ZWN0b3I8U291cmNlTG9jYXRpb24+ICZBUkNNVE1hY3JvTG9jcykKICAgICA6IEFSQ01UTWFjcm9Mb2NzKEFSQ01UTWFjcm9Mb2NzKSB7IH0KIAotICB2aXJ0dWFsIEFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgeworICBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKSBvdmVycmlkZSB7CiAgICAgQ0kuZ2V0UHJlcHJvY2Vzc29yKCkuYWRkUFBDYWxsYmFja3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQVJDTVRNYWNyb1RyYWNrZXJQUENhbGxiYWNrcyhBUkNNVE1hY3JvTG9jcykpOwogICAgIHJldHVybiBuZXcgQVNUQ29uc3VtZXIoKTsKQEAgLTUwNiwxNCArNDcxLDE0IEBACiAgICAgICBMaXN0ZW5lci0+ZmluaXNoKCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgaW5zZXJ0KFNvdXJjZUxvY2F0aW9uIGxvYywgU3RyaW5nUmVmIHRleHQpIHsKKyAgdm9pZCBpbnNlcnQoU291cmNlTG9jYXRpb24gbG9jLCBTdHJpbmdSZWYgdGV4dCkgb3ZlcnJpZGUgewogICAgIGJvb2wgZXJyID0gcmV3cml0ZXIuSW5zZXJ0VGV4dChsb2MsIHRleHQsIC8qSW5zZXJ0QWZ0ZXI9Ki90cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmluZGVudE5ld0xpbmVzPSovdHJ1ZSk7CiAgICAgaWYgKCFlcnIgJiYgTGlzdGVuZXIpCiAgICAgICBMaXN0ZW5lci0+aW5zZXJ0KGxvYywgdGV4dCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKENoYXJTb3VyY2VSYW5nZSByYW5nZSkgeworICB2b2lkIHJlbW92ZShDaGFyU291cmNlUmFuZ2UgcmFuZ2UpIG92ZXJyaWRlIHsKICAgICBSZXdyaXRlcjo6UmV3cml0ZU9wdGlvbnMgcmVtb3ZlT3B0czsKICAgICByZW1vdmVPcHRzLkluY2x1ZGVJbnNlcnRzQXRCZWdpbk9mUmFuZ2UgPSBmYWxzZTsKICAgICByZW1vdmVPcHRzLkluY2x1ZGVJbnNlcnRzQXRFbmRPZlJhbmdlID0gZmFsc2U7CkBAIC01MjQsOCArNDg5LDggQEAKICAgICAgIExpc3RlbmVyLT5yZW1vdmUocmFuZ2UpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGluY3JlYXNlSW5kZW50YXRpb24oQ2hhclNvdXJjZVJhbmdlIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gcGFyZW50SW5kZW50KSB7CisgIHZvaWQgaW5jcmVhc2VJbmRlbnRhdGlvbihDaGFyU291cmNlUmFuZ2UgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gcGFyZW50SW5kZW50KSBvdmVycmlkZSB7CiAgICAgcmV3cml0ZXIuSW5jcmVhc2VJbmRlbnRhdGlvbihyYW5nZSwgcGFyZW50SW5kZW50KTsKICAgfQogfTsKQEAgLTU1MCw3ICs1MTUsNyBAQAogCiBib29sIE1pZ3JhdGlvblByb2Nlc3M6OmFwcGx5VHJhbnNmb3JtKFRyYW5zZm9ybUZuIHRyYW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXdyaXRlTGlzdGVuZXIgKmxpc3RlbmVyKSB7Ci0gIE93bmluZ1B0cjxDb21waWxlckludm9jYXRpb24+IENJbnZvazsKKyAgc3RkOjp1bmlxdWVfcHRyPENvbXBpbGVySW52b2NhdGlvbj4gQ0ludm9rOwogICBDSW52b2sucmVzZXQoY3JlYXRlSW52b2NhdGlvbkZvck1pZ3JhdGlvbihPcmlnQ0kpKTsKICAgQ0ludm9rLT5nZXREaWFnbm9zdGljT3B0cygpLklnbm9yZVdhcm5pbmdzID0gdHJ1ZTsKIApAQCAtNTY5LDEyICs1MzQsMTEgQEAKICAgQ2FwdHVyZURpYWdub3N0aWNDb25zdW1lciBlcnJSZWMoKkRpYWdzLCAqRGlhZ0NsaWVudCwgY2FwdHVyZWREaWFncyk7CiAgIERpYWdzLT5zZXRDbGllbnQoJmVyclJlYywgLypTaG91bGRPd25DbGllbnQ9Ki9mYWxzZSk7CiAKLSAgT3duaW5nUHRyPEFSQ01UTWFjcm9UcmFja2VyQWN0aW9uPiBBU1RBY3Rpb247CisgIHN0ZDo6dW5pcXVlX3B0cjxBUkNNVE1hY3JvVHJhY2tlckFjdGlvbj4gQVNUQWN0aW9uOwogICBBU1RBY3Rpb24ucmVzZXQobmV3IEFSQ01UTWFjcm9UcmFja2VyQWN0aW9uKEFSQ01UTWFjcm9Mb2NzKSk7CiAKLSAgT3duaW5nUHRyPEFTVFVuaXQ+IFVuaXQoCi0gICAgICBBU1RVbml0OjpMb2FkRnJvbUNvbXBpbGVySW52b2NhdGlvbkFjdGlvbihDSW52b2sudGFrZSgpLCBEaWFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVEFjdGlvbi5nZXQoKSkpOworICBzdGQ6OnVuaXF1ZV9wdHI8QVNUVW5pdD4gVW5pdChBU1RVbml0OjpMb2FkRnJvbUNvbXBpbGVySW52b2NhdGlvbkFjdGlvbigKKyAgICAgIENJbnZvay5yZWxlYXNlKCksIERpYWdzLCBBU1RBY3Rpb24uZ2V0KCkpKTsKICAgaWYgKCFVbml0KSB7CiAgICAgZXJyUmVjLkZpbmlzaENhcHR1cmUoKTsKICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2xpYi9BUkNNaWdyYXRlL0FuZHJvaWQubWsgYi9saWIvQVJDTWlncmF0ZS9BbmRyb2lkLm1rCmluZGV4IDZhYmRkZDguLjgzNGY1NzMgMTAwNjQ0Ci0tLSBhL2xpYi9BUkNNaWdyYXRlL0FuZHJvaWQubWsKKysrIGIvbGliL0FSQ01pZ3JhdGUvQW5kcm9pZC5tawpAQCAtOSw2ICs5LDcgQEAKICAgQXR0cnMuaW5jIFwKICAgQXR0ckxpc3QuaW5jIFwKICAgQXR0clBhcnNlZEF0dHJMaXN0LmluYyAgICBcCisgIEF0dHJWaXNpdG9yLmluYyBcCiAgIENvbW1lbnRDb21tYW5kTGlzdC5pbmMgXAogICBDb21tZW50Tm9kZXMuaW5jIFwKICAgRGVjbE5vZGVzLmluYyBcCmRpZmYgLS1naXQgYS9saWIvQVJDTWlncmF0ZS9DTWFrZUxpc3RzLnR4dCBiL2xpYi9BUkNNaWdyYXRlL0NNYWtlTGlzdHMudHh0CmluZGV4IGM1NTI2MTIuLmU1ZWM2MDcgMTAwNjQ0Ci0tLSBhL2xpYi9BUkNNaWdyYXRlL0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9BUkNNaWdyYXRlL0NNYWtlTGlzdHMudHh0CkBAIC0xLDMgKzEsNyBAQAorc2V0KExMVk1fTElOS19DT01QT05FTlRTCisgIFN1cHBvcnQKKyAgKQorCiBhZGRfY2xhbmdfbGlicmFyeShjbGFuZ0FSQ01pZ3JhdGUKICAgQVJDTVQuY3BwCiAgIEFSQ01UQWN0aW9ucy5jcHAKQEAgLTE5LDI2ICsyMywxNiBAQAogICBUcmFuc1plcm9PdXRQcm9wc0luRGVhbGxvYy5jcHAKICAgVHJhbnNmb3JtQWN0aW9ucy5jcHAKICAgVHJhbnNmb3Jtcy5jcHAKLSAgKQogCi1hZGRfZGVwZW5kZW5jaWVzKGNsYW5nQVJDTWlncmF0ZQotICBDbGFuZ0F0dHJDbGFzc2VzCi0gIENsYW5nQXR0ckxpc3QKLSAgQ2xhbmdBdHRyUGFyc2VkQXR0ckxpc3QKLSAgQ2xhbmdDb21tZW50Tm9kZXMKLSAgQ2xhbmdEZWNsTm9kZXMKLSAgQ2xhbmdEaWFnbm9zdGljQ29tbW9uCi0gIENsYW5nRGlhZ25vc3RpY0dyb3VwcwotICBDbGFuZ0RpYWdub3N0aWNTZW1hCi0gIENsYW5nU3RtdE5vZGVzCi0gICkKLQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNsYW5nQVJDTWlncmF0ZQotICBjbGFuZ0Jhc2ljCisgIExJTktfTElCUwogICBjbGFuZ0FTVAotICBjbGFuZ1BhcnNlCisgIGNsYW5nQW5hbHlzaXMKKyAgY2xhbmdCYXNpYworICBjbGFuZ0VkaXQKICAgY2xhbmdGcm9udGVuZAorICBjbGFuZ0xleAogICBjbGFuZ1Jld3JpdGVDb3JlCi0gIGNsYW5nUmV3cml0ZUZyb250ZW5kCisgIGNsYW5nU2VtYQorICBjbGFuZ1NlcmlhbGl6YXRpb24KICAgY2xhbmdTdGF0aWNBbmFseXplckNoZWNrZXJzCiAgICkKZGlmZiAtLWdpdCBhL2xpYi9BUkNNaWdyYXRlL0ZpbGVSZW1hcHBlci5jcHAgYi9saWIvQVJDTWlncmF0ZS9GaWxlUmVtYXBwZXIuY3BwCmluZGV4IGExNDIyNmUuLmUxY2ViYzcgMTAwNjQ0Ci0tLSBhL2xpYi9BUkNNaWdyYXRlL0ZpbGVSZW1hcHBlci5jcHAKKysrIGIvbGliL0FSQ01pZ3JhdGUvRmlsZVJlbWFwcGVyLmNwcApAQCAtMzYsOCArMzYsNyBAQAogICBhc3NlcnQoVG9Gcm9tTWFwcGluZ3MuZW1wdHkoKSk7CiAgIGlmICghb3V0cHV0RGlyLmVtcHR5KCkpIHsKICAgICBzdGQ6OnN0cmluZyBpbmZvRmlsZSA9IGdldFJlbWFwSW5mb0ZpbGUob3V0cHV0RGlyKTsKLSAgICBib29sIGV4aXN0ZWQ7Ci0gICAgbGx2bTo6c3lzOjpmczo6cmVtb3ZlKGluZm9GaWxlLCBleGlzdGVkKTsKKyAgICBsbHZtOjpzeXM6OmZzOjpyZW1vdmUoaW5mb0ZpbGUpOwogICB9CiB9CiAKQEAgLTY1LDggKzY0LDggQEAKICAgICByZXR1cm4gZmFsc2U7CiAKICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IEZpbGVFbnRyeSAqLCBjb25zdCBGaWxlRW50cnkgKj4gPiBwYWlyczsKLSAgCi0gIE93bmluZ1B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IGZpbGVCdWY7CisKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gZmlsZUJ1ZjsKICAgaWYgKGxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZShpbmZvRmlsZS5jX3N0cigpLCBmaWxlQnVmKSkKICAgICByZXR1cm4gcmVwb3J0KCJFcnJvciBvcGVuaW5nIGZpbGU6ICIgKyBpbmZvRmlsZSwgRGlhZyk7CiAgIApAQCAtMTEyLDggKzExMSw3IEBACiBib29sIEZpbGVSZW1hcHBlcjo6Zmx1c2hUb0Rpc2soU3RyaW5nUmVmIG91dHB1dERpciwgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWcpIHsKICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN5czsKIAotICBib29sIGV4aXN0ZWQ7Ci0gIGlmIChmczo6Y3JlYXRlX2RpcmVjdG9yeShvdXRwdXREaXIsIGV4aXN0ZWQpICE9IGxsdm06OmVycmM6OnN1Y2Nlc3MpCisgIGlmIChmczo6Y3JlYXRlX2RpcmVjdG9yeShvdXRwdXREaXIpICE9IGxsdm06OmVycmM6OnN1Y2Nlc3MpCiAgICAgcmV0dXJuIHJlcG9ydCgiQ291bGQgbm90IGNyZWF0ZSBkaXJlY3Rvcnk6ICIgKyBvdXRwdXREaXIsIERpYWcpOwogCiAgIHN0ZDo6c3RyaW5nIGluZm9GaWxlID0gZ2V0UmVtYXBJbmZvRmlsZShvdXRwdXREaXIpOwpAQCAtMTI1LDggKzEyMyw3IEBACiAKICAgc3RkOjpzdHJpbmcgZXJyTXNnOwogICBzdGQ6OnN0cmluZyBpbmZvRmlsZSA9IG91dHB1dFBhdGg7Ci0gIGxsdm06OnJhd19mZF9vc3RyZWFtIGluZm9PdXQoaW5mb0ZpbGUuY19zdHIoKSwgZXJyTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6OkZfQmluYXJ5KTsKKyAgbGx2bTo6cmF3X2ZkX29zdHJlYW0gaW5mb091dChpbmZvRmlsZS5jX3N0cigpLCBlcnJNc2csIGxsdm06OnN5czo6ZnM6OkZfTm9uZSk7CiAgIGlmICghZXJyTXNnLmVtcHR5KCkpCiAgICAgcmV0dXJuIHJlcG9ydChlcnJNc2csIERpYWcpOwogCkBAIC0xODIsOCArMTc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgRGlhZyk7CiAKICAgICBzdGQ6OnN0cmluZyBlcnJNc2c7Ci0gICAgbGx2bTo6cmF3X2ZkX29zdHJlYW0gT3V0KG9yaWdGRS0+Z2V0TmFtZSgpLCBlcnJNc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6OkZfQmluYXJ5KTsKKyAgICBsbHZtOjpyYXdfZmRfb3N0cmVhbSBPdXQob3JpZ0ZFLT5nZXROYW1lKCksIGVyck1zZywgbGx2bTo6c3lzOjpmczo6Rl9Ob25lKTsKICAgICBpZiAoIWVyck1zZy5lbXB0eSgpKQogICAgICAgcmV0dXJuIHJlcG9ydChlcnJNc2csIERpYWcpOwogCkBAIC0yNzIsOSArMjY4LDcgQEAKIH0KIAogYm9vbCBGaWxlUmVtYXBwZXI6OnJlcG9ydChjb25zdCBUd2luZSAmZXJyLCBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZykgewotICBTbWFsbFN0cmluZzwxMjg+IGJ1ZjsKLSAgdW5zaWduZWQgSUQgPSBEaWFnLmdldERpYWdub3N0aWNJRHMoKS0+Z2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNJRHM6OkVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRvU3RyaW5nUmVmKGJ1ZikpOwotICBEaWFnLlJlcG9ydChJRCk7CisgIERpYWcuUmVwb3J0KERpYWcuZ2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNzRW5naW5lOjpFcnJvciwgIiUwIikpCisgICAgICA8PCBlcnIuc3RyKCk7CiAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbGliL0FSQ01pZ3JhdGUvSW50ZXJuYWxzLmggYi9saWIvQVJDTWlncmF0ZS9JbnRlcm5hbHMuaAppbmRleCAzNjkwYzgzLi5kODdkMWVjIDEwMDY0NAotLS0gYS9saWIvQVJDTWlncmF0ZS9JbnRlcm5hbHMuaAorKysgYi9saWIvQVJDTWlncmF0ZS9JbnRlcm5hbHMuaApAQCAtOTUsNiArOTUsOCBAQAogICAgIHJldHVybiBDYXB0dXJlZERpYWdzLmhhc0RpYWdub3N0aWMoSURzLCByYW5nZSk7CiAgIH0KIAorICBEaWFnbm9zdGljQnVpbGRlciByZXBvcnQoU291cmNlTG9jYXRpb24gbG9jLCB1bnNpZ25lZCBkaWFnSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSByYW5nZSA9IFNvdXJjZVJhbmdlKCkpOwogICB2b2lkIHJlcG9ydEVycm9yKFN0cmluZ1JlZiBlcnJvciwgU291cmNlTG9jYXRpb24gbG9jLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIHJhbmdlID0gU291cmNlUmFuZ2UoKSk7CiAgIHZvaWQgcmVwb3J0V2FybmluZyhTdHJpbmdSZWYgd2FybmluZywgU291cmNlTG9jYXRpb24gbG9jLApAQCAtMTYxLDggKzE2Myw2IEBACiAgIGNvbnN0IENhcHR1cmVkRGlhZ0xpc3QgJmdldERpYWdzKCkgY29uc3QgeyByZXR1cm4gQ2FwdHVyZWREaWFnczsgfQogCiAgIGJvb2wgaXNHQ01pZ3JhdGlvbigpIGNvbnN0IHsgcmV0dXJuIE9yaWdHQ01vZGUgIT0gTGFuZ09wdGlvbnM6Ok5vbkdDOyB9Ci0gIGJvb2wgbm9OU0FsbG9jUmVhbGxvY0Vycm9yKCkgY29uc3QgeyByZXR1cm4gTWlnT3B0aW9ucy5Ob05TQWxsb2NSZWFsbG9jRXJyb3I7IH0KLSAgdm9pZCBzZXROU0FsbG9jUmVhbGxvY0Vycm9yKGJvb2wgdmFsKSB7IE1pZ09wdGlvbnMuTm9OU0FsbG9jUmVhbGxvY0Vycm9yID0gdmFsOyB9CiAgIGJvb2wgbm9GaW5hbGl6ZVJlbW92YWwoKSBjb25zdCB7IHJldHVybiBNaWdPcHRpb25zLk5vRmluYWxpemVSZW1vdmFsOyB9CiAgIHZvaWQgc2V0Tm9GaW5hbGl6ZVJlbW92YWwoYm9vbCB2YWwpIHtNaWdPcHRpb25zLk5vRmluYWxpemVSZW1vdmFsID0gdmFsOyB9CiAKZGlmZiAtLWdpdCBhL2xpYi9BUkNNaWdyYXRlL09iakNNVC5jcHAgYi9saWIvQVJDTWlncmF0ZS9PYmpDTVQuY3BwCmluZGV4IGNhYzBmYjAuLjNhZTY3MjQgMTAwNjQ0Ci0tLSBhL2xpYi9BUkNNaWdyYXRlL09iakNNVC5jcHAKKysrIGIvbGliL0FSQ01pZ3JhdGUvT2JqQ01ULmNwcApAQCAtOCwxMiArOCwxNSBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgIlRyYW5zZm9ybXMuaCIKKyNpbmNsdWRlICJjbGFuZy9BUkNNaWdyYXRlL0FSQ01ULmgiCiAjaW5jbHVkZSAiY2xhbmcvQVJDTWlncmF0ZS9BUkNNVEFjdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29uc3VtZXIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9BdHRyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL05TQVBJLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL1BhcmVudE1hcC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9SZWN1cnNpdmVBU1RWaXNpdG9yLmgiCisjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvRG9tYWluU3BlY2lmaWMvQ29jb2FDb252ZW50aW9ucy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0ZpbGVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvRWRpdC9Db21taXQuaCIKICNpbmNsdWRlICJjbGFuZy9FZGl0L0VkaXRlZFNvdXJjZS5oIgpAQCAtMjQsMTEgKzI3LDExIEBACiAjaW5jbHVkZSAiY2xhbmcvTGV4L1BQQ29uZGl0aW9uYWxEaXJlY3RpdmVSZWNvcmQuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvUHJlcHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAiY2xhbmcvUmV3cml0ZS9Db3JlL1Jld3JpdGVyLmgiCi0jaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvRG9tYWluU3BlY2lmaWMvQ29jb2FDb252ZW50aW9ucy5oIgogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL09iakNSZXRhaW5Db3VudC5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9BdHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Tb3VyY2VNZ3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFBhcnNlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiB1c2luZyBuYW1lc3BhY2UgYXJjbXQ7CkBAIC00NSw3ICs0OCw2IEBACiAgIAogICB2b2lkIG1pZ3JhdGVEZWNsKERlY2wgKkQpOwogICB2b2lkIG1pZ3JhdGVPYmpDSW50ZXJmYWNlRGVjbChBU1RDb250ZXh0ICZDdHgsIE9iakNDb250YWluZXJEZWNsICpEKTsKLSAgdm9pZCBtaWdyYXRlRGVwcmVjYXRlZEFubm90YXRpb24oQVNUQ29udGV4dCAmQ3R4LCBPYmpDQ2F0ZWdvcnlEZWNsICpDYXREZWNsKTsKICAgdm9pZCBtaWdyYXRlUHJvdG9jb2xDb25mb3JtYW5jZShBU1RDb250ZXh0ICZDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSW1wRGVjbCk7CiAgIHZvaWQgQ2FjaGVPYmpDTlNJbnRlZ2VyVHlwZWRlZmVkKGNvbnN0IFR5cGVkZWZEZWNsICpUeXBlZGVmRGNsKTsKQEAgLTc2LDE0ICs3OCwxOCBAQAogICAKICAgdm9pZCBtaWdyYXRlQWRkTWV0aG9kQW5ub3RhdGlvbihBU1RDb250ZXh0ICZDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ldGhvZERlY2wpOworCisgIHZvaWQgaW5mZXJEZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKEFTVENvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSW1wbEQpOworCiBwdWJsaWM6CiAgIHN0ZDo6c3RyaW5nIE1pZ3JhdGVEaXI7CiAgIHVuc2lnbmVkIEFTVE1pZ3JhdGVBY3Rpb25zOwogICBGaWxlSUQgRmlsZUlkOwogICBjb25zdCBUeXBlZGVmRGVjbCAqTlNJbnRlZ2VyVHlwZWRlZmVkOwogICBjb25zdCBUeXBlZGVmRGVjbCAqTlNVSW50ZWdlclR5cGVkZWZlZDsKLSAgT3duaW5nUHRyPE5TQVBJPiBOU0FQSU9iajsKLSAgT3duaW5nUHRyPGVkaXQ6OkVkaXRlZFNvdXJjZT4gRWRpdG9yOworICBzdGQ6OnVuaXF1ZV9wdHI8TlNBUEk+IE5TQVBJT2JqOworICBzdGQ6OnVuaXF1ZV9wdHI8ZWRpdDo6RWRpdGVkU291cmNlPiBFZGl0b3I7CiAgIEZpbGVSZW1hcHBlciAmUmVtYXBwZXI7CiAgIEZpbGVNYW5hZ2VyICZGaWxlTWdyOwogICBjb25zdCBQUENvbmRpdGlvbmFsRGlyZWN0aXZlUmVjb3JkICpQUFJlYzsKQEAgLTExNCwyNiArMTIwLDI2IEBACiAgIH0KIAogcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDb250ZXh0KSB7CisgIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDb250ZXh0KSBvdmVycmlkZSB7CiAgICAgTlNBUElPYmoucmVzZXQobmV3IE5TQVBJKENvbnRleHQpKTsKICAgICBFZGl0b3IucmVzZXQobmV3IGVkaXQ6OkVkaXRlZFNvdXJjZShDb250ZXh0LmdldFNvdXJjZU1hbmFnZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LmdldExhbmdPcHRzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBSZWMsIGZhbHNlKSk7CiAgIH0KIAotICB2aXJ0dWFsIGJvb2wgSGFuZGxlVG9wTGV2ZWxEZWNsKERlY2xHcm91cFJlZiBERykgeworICBib29sIEhhbmRsZVRvcExldmVsRGVjbChEZWNsR3JvdXBSZWYgREcpIG92ZXJyaWRlIHsKICAgICBmb3IgKERlY2xHcm91cFJlZjo6aXRlcmF0b3IgSSA9IERHLmJlZ2luKCksIEUgPSBERy5lbmQoKTsgSSAhPSBFOyArK0kpCiAgICAgICBtaWdyYXRlRGVjbCgqSSk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KLSAgdmlydHVhbCB2b2lkIEhhbmRsZUludGVyZXN0aW5nRGVjbChEZWNsR3JvdXBSZWYgREcpIHsKKyAgdm9pZCBIYW5kbGVJbnRlcmVzdGluZ0RlY2woRGVjbEdyb3VwUmVmIERHKSBvdmVycmlkZSB7CiAgICAgLy8gSWdub3JlIGRlY2xzIGZyb20gdGhlIFBDSC4KICAgfQotICB2aXJ0dWFsIHZvaWQgSGFuZGxlVG9wTGV2ZWxEZWNsSW5PYmpDQ29udGFpbmVyKERlY2xHcm91cFJlZiBERykgeworICB2b2lkIEhhbmRsZVRvcExldmVsRGVjbEluT2JqQ0NvbnRhaW5lcihEZWNsR3JvdXBSZWYgREcpIG92ZXJyaWRlIHsKICAgICBPYmpDTWlncmF0ZUFTVENvbnN1bWVyOjpIYW5kbGVUb3BMZXZlbERlY2woREcpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDdHgpOworICB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDdHgpIG92ZXJyaWRlOwogCiAgIGJvb2wgY2FuTW9kaWZ5RmlsZShTdHJpbmdSZWYgUGF0aCkgewogICAgIGlmIChXaGl0ZUxpc3RGaWxlbmFtZXMuZW1wdHkoKSkKQEAgLTE0MSw2ICsxNDcsMzAgQEAKICAgICByZXR1cm4gV2hpdGVMaXN0RmlsZW5hbWVzLmZpbmQobGx2bTo6c3lzOjpwYXRoOjpmaWxlbmFtZShQYXRoKSkKICAgICAgICAgIT0gV2hpdGVMaXN0RmlsZW5hbWVzLmVuZCgpOwogICB9CisgIGJvb2wgY2FuTW9kaWZ5RmlsZShjb25zdCBGaWxlRW50cnkgKkZFKSB7CisgICAgaWYgKCFGRSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gY2FuTW9kaWZ5RmlsZShGRS0+Z2V0TmFtZSgpKTsKKyAgfQorICBib29sIGNhbk1vZGlmeUZpbGUoRmlsZUlEIEZJRCkgeworICAgIGlmIChGSUQuaXNJbnZhbGlkKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGNhbk1vZGlmeUZpbGUoUFAuZ2V0U291cmNlTWFuYWdlcigpLmdldEZpbGVFbnRyeUZvcklEKEZJRCkpOworICB9CisKKyAgYm9vbCBjYW5Nb2RpZnkoY29uc3QgRGVjbCAqRCkgeworICAgIGlmICghRCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoY29uc3QgT2JqQ0NhdGVnb3J5SW1wbERlY2wgKkNhdEltcGwgPSBkeW5fY2FzdDxPYmpDQ2F0ZWdvcnlJbXBsRGVjbD4oRCkpCisgICAgICByZXR1cm4gY2FuTW9kaWZ5KENhdEltcGwtPmdldENhdGVnb3J5RGVjbCgpKTsKKyAgICBpZiAoY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSW1wbCA9IGR5bl9jYXN0PE9iakNJbXBsZW1lbnRhdGlvbkRlY2w+KEQpKQorICAgICAgcmV0dXJuIGNhbk1vZGlmeShJbXBsLT5nZXRDbGFzc0ludGVyZmFjZSgpKTsKKyAgICBpZiAoY29uc3QgT2JqQ01ldGhvZERlY2wgKk1EID0gZHluX2Nhc3Q8T2JqQ01ldGhvZERlY2w+KEQpKQorICAgICAgcmV0dXJuIGNhbk1vZGlmeShjYXN0PERlY2w+KE1ELT5nZXREZWNsQ29udGV4dCgpKSk7CisKKyAgICBGaWxlSUQgRklEID0gUFAuZ2V0U291cmNlTWFuYWdlcigpLmdldEZpbGVJRChELT5nZXRMb2NhdGlvbigpKTsKKyAgICByZXR1cm4gY2FuTW9kaWZ5RmlsZShGSUQpOworICB9CiB9OwogCiB9CkBAIC0yMjMsNyArMjUzLDcgQEAKIAogY2xhc3MgQm9keU1pZ3JhdG9yIDogcHVibGljIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8Qm9keU1pZ3JhdG9yPiB7CiAgIE9iakNNaWdyYXRlQVNUQ29uc3VtZXIgJkNvbnN1bWVyOwotICBPd25pbmdQdHI8UGFyZW50TWFwPiBQTWFwOworICBzdGQ6OnVuaXF1ZV9wdHI8UGFyZW50TWFwPiBQTWFwOwogCiBwdWJsaWM6CiAgIEJvZHlNaWdyYXRvcihPYmpDTWlncmF0ZUFTVENvbnN1bWVyICZjb25zdW1lcikgOiBDb25zdW1lcihjb25zdW1lcikgeyB9CkBAIC0yOTQsNyArMzI0LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpQcm9wZXJ0eU1lbW9yeUF0dHJpYnV0ZShBU1RDb250ZXh0ICZDb250ZXh0LCBRdWFsVHlwZSBBcmdUeXBlKSB7CiAgIFF1YWxpZmllcnM6Ok9iakNMaWZldGltZSBwcm9wZXJ0eUxpZmV0aW1lID0gQXJnVHlwZS5nZXRPYmpDTGlmZXRpbWUoKTsKICAgYm9vbCBSZXRhaW5hYmxlT2JqZWN0ID0gQXJnVHlwZS0+aXNPYmpDUmV0YWluYWJsZVR5cGUoKTsKLSAgaWYgKFJldGFpbmFibGVPYmplY3QgJiYgcHJvcGVydHlMaWZldGltZSA9PSBRdWFsaWZpZXJzOjpPQ0xfU3Ryb25nKSB7CisgIGlmIChSZXRhaW5hYmxlT2JqZWN0ICYmCisgICAgICAocHJvcGVydHlMaWZldGltZSA9PSBRdWFsaWZpZXJzOjpPQ0xfU3Ryb25nCisgICAgICAgfHwgcHJvcGVydHlMaWZldGltZSA9PSBRdWFsaWZpZXJzOjpPQ0xfTm9uZSkpIHsKICAgICBpZiAoY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpPYmpQdHJUeSA9CiAgICAgICAgIEFyZ1R5cGUtPmdldEFzPE9iakNPYmplY3RQb2ludGVyVHlwZT4oKSkgewogICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKklEZWNsID0gT2JqUHRyVHktPmdldE9iamVjdFR5cGUoKS0+Z2V0SW50ZXJmYWNlKCk7CkBAIC0zMDIsNyArMzM0LDcgQEAKICAgICAgICAgICBJRGVjbC0+bG9va3VwTmVzdGVkUHJvdG9jb2woJkNvbnRleHQuSWRlbnRzLmdldCgiTlNDb3B5aW5nIikpKQogICAgICAgICByZXR1cm4gImNvcHkiOwogICAgICAgZWxzZQotICAgICAgICByZXR1cm4gInJldGFpbiI7CisgICAgICAgIHJldHVybiAic3Ryb25nIjsKICAgICB9CiAgICAgZWxzZSBpZiAoQXJnVHlwZS0+aXNCbG9ja1BvaW50ZXJUeXBlKCkpCiAgICAgICByZXR1cm4gImNvcHkiOwpAQCAtMzExLDcgKzM0Myw3IEBACiAgICAgLy8gbG9va2luZyBpbnRvIHNldHRlcidzIGltcGxlbWVudGF0aW9uIGZvciBiYWNraW5nIHdlYWsgaXZhci4KICAgICByZXR1cm4gIndlYWsiOwogICBlbHNlIGlmIChSZXRhaW5hYmxlT2JqZWN0KQotICAgIHJldHVybiBBcmdUeXBlLT5pc0Jsb2NrUG9pbnRlclR5cGUoKSA/ICJjb3B5IiA6ICJyZXRhaW4iOworICAgIHJldHVybiBBcmdUeXBlLT5pc0Jsb2NrUG9pbnRlclR5cGUoKSA/ICJjb3B5IiA6ICJzdHJvbmciOwogICByZXR1cm4gMDsKIH0KIApAQCAtMzQ0LDIzICszNzYsMjMgQEAKICAgICBQcm9wZXJ0eVN0cmluZyArPSBQcm9wZXJ0eU5hbWVTdHJpbmc7CiAgIH0KICAgLy8gUHJvcGVydHkgd2l0aCBubyBzZXR0ZXIgbWF5IGJlIHN1Z2dlc3RlZCBhcyBhICdyZWFkb25seScgcHJvcGVydHkuCi0gIGlmICghU2V0dGVyKSB7CisgIGlmICghU2V0dGVyKQogICAgIGFwcGVuZF9hdHRyKFByb3BlcnR5U3RyaW5nLCAicmVhZG9ubHkiLCBMUGFyZW5BZGRlZCk7Ci0gICAgUXVhbFR5cGUgUmVzVHlwZSA9IENvbnRleHQuZ2V0Q2Fub25pY2FsVHlwZShHZXR0ZXItPmdldFJlc3VsdFR5cGUoKSk7Ci0gICAgaWYgKGNvbnN0IGNoYXIgKk1lbW9yeU1hbmFnZW1lbnRBdHRyID0gUHJvcGVydHlNZW1vcnlBdHRyaWJ1dGUoQ29udGV4dCwgUmVzVHlwZSkpCi0gICAgICBhcHBlbmRfYXR0cihQcm9wZXJ0eVN0cmluZywgTWVtb3J5TWFuYWdlbWVudEF0dHIsIExQYXJlbkFkZGVkKTsKLSAgfQorICAKICAgCiAgIC8vIFNob3J0IGNpcmN1aXQgJ2RlbGVnYXRlJyBwcm9wZXJ0aWVzIHRoYXQgY29udGFpbiB0aGUgbmFtZSAiZGVsZWdhdGUiIG9yCiAgIC8vICJkYXRhU291cmNlIiwgb3IgaGF2ZSBleGFjdCBuYW1lICJ0YXJnZXQiIHRvIGhhdmUgJ2Fzc2lnbicgYXR0cmlidXRlLgogICBpZiAoUHJvcGVydHlOYW1lLmVxdWFscygidGFyZ2V0IikgfHwKICAgICAgIChQcm9wZXJ0eU5hbWUuZmluZCgiZGVsZWdhdGUiKSAhPSBTdHJpbmdSZWY6Om5wb3MpIHx8CiAgICAgICAoUHJvcGVydHlOYW1lLmZpbmQoImRhdGFTb3VyY2UiKSAhPSBTdHJpbmdSZWY6Om5wb3MpKSB7Ci0gICAgUXVhbFR5cGUgUVQgPSBHZXR0ZXItPmdldFJlc3VsdFR5cGUoKTsKKyAgICBRdWFsVHlwZSBRVCA9IEdldHRlci0+Z2V0UmV0dXJuVHlwZSgpOwogICAgIGlmICghUVQtPmlzUmVhbFR5cGUoKSkKICAgICAgIGFwcGVuZF9hdHRyKFByb3BlcnR5U3RyaW5nLCAiYXNzaWduIiwgTFBhcmVuQWRkZWQpOwotICB9Ci0gIGVsc2UgaWYgKFNldHRlcikgeworICB9IGVsc2UgaWYgKCFTZXR0ZXIpIHsKKyAgICBRdWFsVHlwZSBSZXNUeXBlID0gQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKEdldHRlci0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgICBpZiAoY29uc3QgY2hhciAqTWVtb3J5TWFuYWdlbWVudEF0dHIgPSBQcm9wZXJ0eU1lbW9yeUF0dHJpYnV0ZShDb250ZXh0LCBSZXNUeXBlKSkKKyAgICAgIGFwcGVuZF9hdHRyKFByb3BlcnR5U3RyaW5nLCBNZW1vcnlNYW5hZ2VtZW50QXR0ciwgTFBhcmVuQWRkZWQpOworICB9IGVsc2UgewogICAgIGNvbnN0IFBhcm1WYXJEZWNsICphcmdEZWNsID0gKlNldHRlci0+cGFyYW1fYmVnaW4oKTsKICAgICBRdWFsVHlwZSBBcmdUeXBlID0gQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKGFyZ0RlY2wtPmdldFR5cGUoKSk7CiAgICAgaWYgKGNvbnN0IGNoYXIgKk1lbW9yeU1hbmFnZW1lbnRBdHRyID0gUHJvcGVydHlNZW1vcnlBdHRyaWJ1dGUoQ29udGV4dCwgQXJnVHlwZSkpCkBAIC0zNjgsNyArNDAwLDcgQEAKICAgfQogICBpZiAoTFBhcmVuQWRkZWQpCiAgICAgUHJvcGVydHlTdHJpbmcgKz0gJyknOwotICBRdWFsVHlwZSBSVCA9IEdldHRlci0+Z2V0UmVzdWx0VHlwZSgpOworICBRdWFsVHlwZSBSVCA9IEdldHRlci0+Z2V0UmV0dXJuVHlwZSgpOwogICBpZiAoIWlzYTxUeXBlZGVmVHlwZT4oUlQpKSB7CiAgICAgLy8gc3RyaXAgb2ZmIGFueSBBUkMgbGlmZXRpbWUgcXVhbGlmaWVyLgogICAgIFF1YWxUeXBlIENhblJlc3VsdFR5ID0gQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKFJUKTsKQEAgLTQxOSwyMSArNDUxLDI3IEBACiAgICAgLy8gR2V0IGxvY2F0aW9uIHBhc3QgJzsnCiAgICAgRW5kTG9jID0gRW5kTG9jLmdldExvY1dpdGhPZmZzZXQoMSk7CiAgICAgU291cmNlTG9jYXRpb24gQmVnaW5PZlNldHRlckRjbExvYyA9IFNldHRlci0+Z2V0TG9jU3RhcnQoKTsKLSAgICAvLyBGSVhNRS4gVGhpcyBhc3N1bWVzIHRoYXQgc2V0dGVyIGRlY2w7IGlzIGltbWVkaWF0ZWx5IHByZWNlZWRlZCBieSBlb2xuLgorICAgIC8vIEZJWE1FLiBUaGlzIGFzc3VtZXMgdGhhdCBzZXR0ZXIgZGVjbDsgaXMgaW1tZWRpYXRlbHkgcHJlY2VkZWQgYnkgZW9sbi4KICAgICAvLyBJdCBpcyB0cnlpbmcgdG8gcmVtb3ZlIHRoZSBzZXR0ZXIgbWV0aG9kIGRlY2wuIGxpbmUgZW50aXJlbHkuCiAgICAgQmVnaW5PZlNldHRlckRjbExvYyA9IEJlZ2luT2ZTZXR0ZXJEY2xMb2MuZ2V0TG9jV2l0aE9mZnNldCgtMSk7CiAgICAgY29tbWl0LnJlbW92ZShTb3VyY2VSYW5nZShCZWdpbk9mU2V0dGVyRGNsTG9jLCBFbmRMb2MpKTsKICAgfQogfQogCitzdGF0aWMgYm9vbCBJc0NhdGVnb3J5TmFtZVdpdGhEZXByZWNhdGVkU3VmZml4KE9iakNDb250YWluZXJEZWNsICpEKSB7CisgIGlmIChPYmpDQ2F0ZWdvcnlEZWNsICpDYXREZWNsID0gZHluX2Nhc3Q8T2JqQ0NhdGVnb3J5RGVjbD4oRCkpIHsKKyAgICBTdHJpbmdSZWYgTmFtZSA9IENhdERlY2wtPmdldE5hbWUoKTsKKyAgICByZXR1cm4gTmFtZS5lbmRzd2l0aCgiRGVwcmVjYXRlZCIpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBPYmpDTWlncmF0ZUFTVENvbnN1bWVyOjptaWdyYXRlT2JqQ0ludGVyZmFjZURlY2woQVNUQ29udGV4dCAmQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0NvbnRhaW5lckRlY2wgKkQpIHsKLSAgaWYgKEQtPmlzRGVwcmVjYXRlZCgpKQorICBpZiAoRC0+aXNEZXByZWNhdGVkKCkgfHwgSXNDYXRlZ29yeU5hbWVXaXRoRGVwcmVjYXRlZFN1ZmZpeChEKSkKICAgICByZXR1cm47Ci0gIAotICBmb3IgKE9iakNDb250YWluZXJEZWNsOjptZXRob2RfaXRlcmF0b3IgTSA9IEQtPm1ldGhfYmVnaW4oKSwgTUVuZCA9IEQtPm1ldGhfZW5kKCk7Ci0gICAgICAgTSAhPSBNRW5kOyArK00pIHsKLSAgICBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kID0gKCpNKTsKKyAgICAKKyAgZm9yIChhdXRvICpNZXRob2QgOiBELT5tZXRob2RzKCkpIHsKICAgICBpZiAoTWV0aG9kLT5pc0RlcHJlY2F0ZWQoKSkKICAgICAgIGNvbnRpbnVlOwogICAgIGJvb2wgUHJvcGVydHlJbmZlcnJlZCA9IG1pZ3JhdGVQcm9wZXJ0eShDdHgsIEQsIE1ldGhvZCk7CkBAIC00NDgsNDggKzQ4NiwxMyBAQAogICBpZiAoIShBU1RNaWdyYXRlQWN0aW9ucyAmIEZyb250ZW5kT3B0aW9uczo6T2JqQ01UX1JldHVybnNJbm5lclBvaW50ZXJQcm9wZXJ0eSkpCiAgICAgcmV0dXJuOwogICAKLSAgZm9yIChPYmpDQ29udGFpbmVyRGVjbDo6cHJvcF9pdGVyYXRvciBQID0gRC0+cHJvcF9iZWdpbigpLAotICAgICAgIEUgPSBELT5wcm9wX2VuZCgpOyBQICE9IEU7ICsrUCkgewotICAgIE9iakNQcm9wZXJ0eURlY2wgKlByb3AgPSAqUDsKKyAgZm9yIChhdXRvICpQcm9wIDogRC0+cHJvcGVydGllcygpKSB7CiAgICAgaWYgKChBU1RNaWdyYXRlQWN0aW9ucyAmIEZyb250ZW5kT3B0aW9uczo6T2JqQ01UX0Fubm90YXRpb24pICYmCiAgICAgICAgICFQcm9wLT5pc0RlcHJlY2F0ZWQoKSkKICAgICAgIG1pZ3JhdGVQcm9wZXJ0eU5zUmV0dXJuc0lubmVyUG9pbnRlcihDdHgsIFByb3ApOwogICB9CiB9CiAKLXZvaWQgT2JqQ01pZ3JhdGVBU1RDb25zdW1lcjo6bWlncmF0ZURlcHJlY2F0ZWRBbm5vdGF0aW9uKEFTVENvbnRleHQgJkN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0NhdGVnb3J5RGVjbCAqQ2F0RGVjbCkgewotICBTdHJpbmdSZWYgTmFtZSA9IENhdERlY2wtPmdldE5hbWUoKTsKLSAgaWYgKCFOYW1lLmVuZHN3aXRoKCJEZXByZWNhdGVkIikpCi0gICAgcmV0dXJuOwotICAKLSAgaWYgKCFDdHguSWRlbnRzLmdldCgiREVQUkVDQVRFRCIpLmhhc01hY3JvRGVmaW5pdGlvbigpKQotICAgIHJldHVybjsKLSAgCi0gIE9iakNDb250YWluZXJEZWNsICpEID0gY2FzdDxPYmpDQ29udGFpbmVyRGVjbD4oQ2F0RGVjbCk7Ci0gIAotICBmb3IgKE9iakNDb250YWluZXJEZWNsOjptZXRob2RfaXRlcmF0b3IgTSA9IEQtPm1ldGhfYmVnaW4oKSwgTUVuZCA9IEQtPm1ldGhfZW5kKCk7Ci0gICAgICAgTSAhPSBNRW5kOyArK00pIHsKLSAgICBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kID0gKCpNKTsKLSAgICBpZiAoTWV0aG9kLT5pc0RlcHJlY2F0ZWQoKSB8fCBNZXRob2QtPmlzSW1wbGljaXQoKSkKLSAgICAgIGNvbnRpbnVlOwotICAgIC8vIEFubm90YXRlIHdpdGggREVQUkVDQVRFRAotICAgIGVkaXQ6OkNvbW1pdCBjb21taXQoKkVkaXRvcik7Ci0gICAgY29tbWl0Lmluc2VydEJlZm9yZShNZXRob2QtPmdldExvY0VuZCgpLCAiIERFUFJFQ0FURUQiKTsKLSAgICBFZGl0b3ItPmNvbW1pdChjb21taXQpOwotICB9Ci0gIGZvciAoT2JqQ0NvbnRhaW5lckRlY2w6OnByb3BfaXRlcmF0b3IgUCA9IEQtPnByb3BfYmVnaW4oKSwKLSAgICAgICBFID0gRC0+cHJvcF9lbmQoKTsgUCAhPSBFOyArK1ApIHsKLSAgICBPYmpDUHJvcGVydHlEZWNsICpQcm9wID0gKlA7Ci0gICAgaWYgKFByb3AtPmlzRGVwcmVjYXRlZCgpKQotICAgICAgY29udGludWU7Ci0gICAgLy8gQW5ub3RhdGUgd2l0aCBERVBSRUNBVEVECi0gICAgZWRpdDo6Q29tbWl0IGNvbW1pdCgqRWRpdG9yKTsKLSAgICBjb21taXQuaW5zZXJ0QWZ0ZXJUb2tlbihQcm9wLT5nZXRMb2NFbmQoKSwgIiBERVBSRUNBVEVEIik7Ci0gICAgRWRpdG9yLT5jb21taXQoY29tbWl0KTsKLSAgfQotfQotCiBzdGF0aWMgYm9vbAogQ2xhc3NJbXBsZW1lbnRzQWxsTWV0aG9kc0FuZFByb3BlcnRpZXMoQVNUQ29udGV4dCAmQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpJbXBEZWNsLApAQCAtNTAwLDkgKzUwMyw3IEBACiAgIC8vIGluIGNsYXNzIGludGVyZmFjZS4KICAgYm9vbCBIYXNBdGxlYXN0T25lUmVxdWlyZWRQcm9wZXJ0eSA9IGZhbHNlOwogICBpZiAoY29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqUERlY2wgPSBQcm90b2NvbC0+Z2V0RGVmaW5pdGlvbigpKQotICAgIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvcF9pdGVyYXRvciBQID0gUERlY2wtPnByb3BfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBQRGVjbC0+cHJvcF9lbmQoKTsgUCAhPSBFOyArK1ApIHsKLSAgICAgIE9iakNQcm9wZXJ0eURlY2wgKlByb3BlcnR5ID0gKlA7CisgICAgZm9yIChjb25zdCBhdXRvICpQcm9wZXJ0eSA6IFBEZWNsLT5wcm9wZXJ0aWVzKCkpIHsKICAgICAgIGlmIChQcm9wZXJ0eS0+Z2V0UHJvcGVydHlJbXBsZW1lbnRhdGlvbigpID09IE9iakNQcm9wZXJ0eURlY2w6Ok9wdGlvbmFsKQogICAgICAgICBjb250aW51ZTsKICAgICAgIEhhc0F0bGVhc3RPbmVSZXF1aXJlZFByb3BlcnR5ID0gdHJ1ZTsKQEAgLTUzMiw5ICs1MzMsNyBAQAogICBpZiAoY29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqUERlY2wgPSBQcm90b2NvbC0+Z2V0RGVmaW5pdGlvbigpKSB7CiAgICAgaWYgKFBEZWNsLT5tZXRoX2JlZ2luKCkgPT0gUERlY2wtPm1ldGhfZW5kKCkpCiAgICAgICByZXR1cm4gSGFzQXRsZWFzdE9uZVJlcXVpcmVkUHJvcGVydHk7Ci0gICAgZm9yIChPYmpDQ29udGFpbmVyRGVjbDo6bWV0aG9kX2l0ZXJhdG9yIE0gPSBQRGVjbC0+bWV0aF9iZWdpbigpLAotICAgICAgICAgTUVuZCA9IFBEZWNsLT5tZXRoX2VuZCgpOyBNICE9IE1FbmQ7ICsrTSkgewotICAgICAgT2JqQ01ldGhvZERlY2wgKk1EID0gKCpNKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKk1EIDogUERlY2wtPm1ldGhvZHMoKSkgewogICAgICAgaWYgKE1ELT5pc0ltcGxpY2l0KCkpCiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgaWYgKE1ELT5nZXRJbXBsZW1lbnRhdGlvbkNvbnRyb2woKSA9PSBPYmpDTWV0aG9kRGVjbDo6T3B0aW9uYWwpCkBAIC02MzIsNyArNjMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKklzRGVjbCovdHJ1ZSk7CiAgIGlmICghRW5kT2ZFbnVtRGNsTG9jLmlzSW52YWxpZCgpKSB7CiAgICAgU291cmNlTG9jYXRpb24gQmVnaW5PZkVudW1EY2xMb2MgPSBFbnVtRGNsLT5nZXRMb2NTdGFydCgpOwotICAgIC8vIEZJWE1FLiBUaGlzIGFzc3VtZXMgdGhhdCBlbnVtIGRlY2w7IGlzIGltbWVkaWF0ZWx5IHByZWNlZWRlZCBieSBlb2xuLgorICAgIC8vIEZJWE1FLiBUaGlzIGFzc3VtZXMgdGhhdCBlbnVtIGRlY2w7IGlzIGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGVvbG4uCiAgICAgLy8gSXQgaXMgdHJ5aW5nIHRvIHJlbW92ZSB0aGUgZW51bSBkZWNsLiBsaW5lcyBlbnRpcmVseS4KICAgICBCZWdpbk9mRW51bURjbExvYyA9IEJlZ2luT2ZFbnVtRGNsTG9jLmdldExvY1dpdGhPZmZzZXQoLTEpOwogICAgIGNvbW1pdC5yZW1vdmUoU291cmNlUmFuZ2UoQmVnaW5PZkVudW1EY2xMb2MsIEVuZE9mRW51bURjbExvYykpOwpAQCAtNjYwLDkgKzY1OSw3IEBACiAgIGJvb2wgUG93ZXJPZlR3byA9IHRydWU7CiAgIGJvb2wgQWxsSGV4ZGVjaW1hbEVudW1lcmF0b3IgPSB0cnVlOwogICB1aW50NjRfdCBNYXhQb3dlck9mVHdvVmFsID0gMDsKLSAgZm9yIChFbnVtRGVjbDo6ZW51bWVyYXRvcl9pdGVyYXRvciBFSSA9IEVudW1EY2wtPmVudW1lcmF0b3JfYmVnaW4oKSwKLSAgICAgICBFRSA9IEVudW1EY2wtPmVudW1lcmF0b3JfZW5kKCk7IEVJICE9IEVFOyArK0VJKSB7Ci0gICAgRW51bUNvbnN0YW50RGVjbCAqRW51bWVyYXRvciA9ICgqRUkpOworICBmb3IgKGF1dG8gRW51bWVyYXRvciA6IEVudW1EY2wtPmVudW1lcmF0b3JzKCkpIHsKICAgICBjb25zdCBFeHByICpJbml0RXhwciA9IEVudW1lcmF0b3ItPmdldEluaXRFeHByKCk7CiAgICAgaWYgKCFJbml0RXhwcikgewogICAgICAgUG93ZXJPZlR3byA9IGZhbHNlOwpAQCAtNzQ5LDYgKzc0Niw4IEBACiAgICAgaWYgKCFEcm9wSXQpCiAgICAgICBNaW5pbWFsQ29uZm9ybWluZ1Byb3RvY29scy5wdXNoX2JhY2soVGFyZ2V0UERlY2wpOwogICB9CisgIGlmIChNaW5pbWFsQ29uZm9ybWluZ1Byb3RvY29scy5lbXB0eSgpKQorICAgIHJldHVybjsKICAgZWRpdDo6Q29tbWl0IGNvbW1pdCgqRWRpdG9yKTsKICAgcmV3cml0ZVRvT2JqQ0ludGVyZmFjZURlY2woSURlY2wsIE1pbmltYWxDb25mb3JtaW5nUHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTlNBUElPYmosIGNvbW1pdCk7CkBAIC04MzUsNyArODM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpPTSkgewogICBTb3VyY2VSYW5nZSBSOwogICBzdGQ6OnN0cmluZyBDbGFzc1N0cmluZzsKLSAgaWYgKFR5cGVTb3VyY2VJbmZvICpUU0luZm8gPSAgT00tPmdldFJlc3VsdFR5cGVTb3VyY2VJbmZvKCkpIHsKKyAgaWYgKFR5cGVTb3VyY2VJbmZvICpUU0luZm8gPSBPTS0+Z2V0UmV0dXJuVHlwZVNvdXJjZUluZm8oKSkgewogICAgIFR5cGVMb2MgVEwgPSBUU0luZm8tPmdldFR5cGVMb2MoKTsKICAgICBSID0gU291cmNlUmFuZ2UoVEwuZ2V0QmVnaW5Mb2MoKSwgVEwuZ2V0RW5kTG9jKCkpOwogICAgIENsYXNzU3RyaW5nID0gImluc3RhbmNldHlwZSI7CkBAIC04NTUsNyArODU0LDcgQEAKICAgT2JqQ0ludGVyZmFjZURlY2wgKklEZWNsID0gT00tPmdldENsYXNzSW50ZXJmYWNlKCk7CiAgIFNvdXJjZVJhbmdlIFI7CiAgIHN0ZDo6c3RyaW5nIENsYXNzU3RyaW5nOwotICBpZiAoVHlwZVNvdXJjZUluZm8gKlRTSW5mbyA9ICBPTS0+Z2V0UmVzdWx0VHlwZVNvdXJjZUluZm8oKSkgeworICBpZiAoVHlwZVNvdXJjZUluZm8gKlRTSW5mbyA9IE9NLT5nZXRSZXR1cm5UeXBlU291cmNlSW5mbygpKSB7CiAgICAgVHlwZUxvYyBUTCA9IFRTSW5mby0+Z2V0VHlwZUxvYygpOwogICAgIFIgPSBTb3VyY2VSYW5nZShUTC5nZXRCZWdpbkxvYygpLCBUTC5nZXRFbmRMb2MoKSk7IHsKICAgICAgIENsYXNzU3RyaW5nICA9IElEZWNsLT5nZXROYW1lKCk7CkBAIC04OTMsMTQgKzg5MiwxNCBAQAogICAgICAgbWlncmF0ZUZhY3RvcnlNZXRob2QoQ3R4LCBDRGVjbCwgT00sIE9JVF9TaW5nbGV0b24pOwogICAgICAgcmV0dXJuOwogICAgIGNhc2UgT0lUX0luaXQ6Ci0gICAgICBpZiAoT00tPmdldFJlc3VsdFR5cGUoKS0+aXNPYmpDSWRUeXBlKCkpCisgICAgICBpZiAoT00tPmdldFJldHVyblR5cGUoKS0+aXNPYmpDSWRUeXBlKCkpCiAgICAgICAgIFJlcGxhY2VXaXRoSW5zdGFuY2V0eXBlKCp0aGlzLCBPTSk7CiAgICAgICByZXR1cm47CiAgICAgY2FzZSBPSVRfUmV0dXJuc1NlbGY6CiAgICAgICBtaWdyYXRlRmFjdG9yeU1ldGhvZChDdHgsIENEZWNsLCBPTSwgT0lUX1JldHVybnNTZWxmKTsKICAgICAgIHJldHVybjsKICAgfQotICBpZiAoIU9NLT5nZXRSZXN1bHRUeXBlKCktPmlzT2JqQ0lkVHlwZSgpKQorICBpZiAoIU9NLT5nZXRSZXR1cm5UeXBlKCktPmlzT2JqQ0lkVHlwZSgpKQogICAgIHJldHVybjsKICAgCiAgIE9iakNJbnRlcmZhY2VEZWNsICpJRGVjbCA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPihDRGVjbCk7CkBAIC0xMDM0LDcgKzEwMzMsNyBAQAogICAgICAgTWV0aG9kLT5wYXJhbV9zaXplKCkgIT0gMCkKICAgICByZXR1cm4gZmFsc2U7CiAgIC8vIElzIHRoaXMgbWV0aG9kIGNhbmRpZGF0ZSB0byBiZSBhIGdldHRlcj8KLSAgUXVhbFR5cGUgR1JUID0gTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCk7CisgIFF1YWxUeXBlIEdSVCA9IE1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpOwogICBpZiAoR1JULT5pc1ZvaWRUeXBlKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogICAKQEAgLTEwODcsNyArMTA4Niw3IEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgCiAgICAgLy8gSXMgdGhpcyBhIHZhbGlkIHNldHRlciwgbWF0Y2hpbmcgdGhlIHRhcmdldCBnZXR0ZXI/Ci0gICAgUXVhbFR5cGUgU1JUID0gU2V0dGVyTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgUXVhbFR5cGUgU1JUID0gU2V0dGVyTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCk7CiAgICAgaWYgKCFTUlQtPmlzVm9pZFR5cGUoKSkKICAgICAgIHJldHVybiBmYWxzZTsKICAgICBjb25zdCBQYXJtVmFyRGVjbCAqYXJnRGVjbCA9ICpTZXR0ZXJNZXRob2QtPnBhcmFtX2JlZ2luKCk7CkBAIC0xMTI4LDggKzExMjcsOCBAQAogICAgICAgIU9NLT5pc0luc3RhbmNlTWV0aG9kKCkgfHwKICAgICAgIE9NLT5oYXNBdHRyPE9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0cj4oKSkKICAgICByZXR1cm47Ci0gIAotICBRdWFsVHlwZSBSVCA9IE9NLT5nZXRSZXN1bHRUeXBlKCk7CisKKyAgUXVhbFR5cGUgUlQgPSBPTS0+Z2V0UmV0dXJuVHlwZSgpOwogICBpZiAoIVR5cGVJc0lubmVyUG9pbnRlcihSVCkgfHwKICAgICAgICFDdHguSWRlbnRzLmdldCgiTlNfUkVUVVJOU19JTk5FUl9QT0lOVEVSIikuaGFzTWFjcm9EZWZpbml0aW9uKCkpCiAgICAgcmV0dXJuOwpAQCAtMTE1MywxNCArMTE1MiwxMSBAQAogCiB2b2lkIE9iakNNaWdyYXRlQVNUQ29uc3VtZXI6Om1pZ3JhdGVBbGxNZXRob2RJbnN0YWNlVHlwZShBU1RDb250ZXh0ICZDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0NvbnRhaW5lckRlY2wgKkNEZWNsKSB7Ci0gIGlmIChDRGVjbC0+aXNEZXByZWNhdGVkKCkpCisgIGlmIChDRGVjbC0+aXNEZXByZWNhdGVkKCkgfHwgSXNDYXRlZ29yeU5hbWVXaXRoRGVwcmVjYXRlZFN1ZmZpeChDRGVjbCkpCiAgICAgcmV0dXJuOwogICAKICAgLy8gbWlncmF0ZSBtZXRob2RzIHdoaWNoIGNhbiBoYXZlIGluc3RhbmNldHlwZSBhcyB0aGVpciByZXN1bHQgdHlwZS4KLSAgZm9yIChPYmpDQ29udGFpbmVyRGVjbDo6bWV0aG9kX2l0ZXJhdG9yIE0gPSBDRGVjbC0+bWV0aF9iZWdpbigpLAotICAgICAgIE1FbmQgPSBDRGVjbC0+bWV0aF9lbmQoKTsKLSAgICAgICBNICE9IE1FbmQ7ICsrTSkgewotICAgIE9iakNNZXRob2REZWNsICpNZXRob2QgPSAoKk0pOworICBmb3IgKGF1dG8gKk1ldGhvZCA6IENEZWNsLT5tZXRob2RzKCkpIHsKICAgICBpZiAoTWV0aG9kLT5pc0RlcHJlY2F0ZWQoKSkKICAgICAgIGNvbnRpbnVlOwogICAgIG1pZ3JhdGVNZXRob2RJbnN0YW5jZVR5cGUoQ3R4LCBDRGVjbCwgTWV0aG9kKTsKQEAgLTExNzIsOCArMTE2OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpPTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0luc3RhbmNlVHlwZUZhbWlseSBPSVRfRmFtaWx5KSB7CiAgIGlmIChPTS0+aXNJbnN0YW5jZU1ldGhvZCgpIHx8Ci0gICAgICBPTS0+Z2V0UmVzdWx0VHlwZSgpID09IEN0eC5nZXRPYmpDSW5zdGFuY2VUeXBlKCkgfHwKLSAgICAgICFPTS0+Z2V0UmVzdWx0VHlwZSgpLT5pc09iakNJZFR5cGUoKSkKKyAgICAgIE9NLT5nZXRSZXR1cm5UeXBlKCkgPT0gQ3R4LmdldE9iakNJbnN0YW5jZVR5cGUoKSB8fAorICAgICAgIU9NLT5nZXRSZXR1cm5UeXBlKCktPmlzT2JqQ0lkVHlwZSgpKQogICAgIHJldHVybjsKICAgCiAgIC8vIENhbmRpZGF0ZSBmYWN0b3J5IG1ldGhvZHMgYXJlICsgKGlkKSBOYU1lWFhYIDogLi4uIHdoaWNoIGJlbG9uZyB0byBhIGNsYXNzCkBAIC0xMzY1LDEzICsxMzYxLDEzIEBACiAgICAgICAgcGUgPSBGdW5jRGVjbC0+cGFyYW1fZW5kKCk7IHBpICE9IHBlOyArK3BpLCArK2kpIHsKICAgICBjb25zdCBQYXJtVmFyRGVjbCAqcGQgPSAqcGk7CiAgICAgQXJnRWZmZWN0IEFFID0gQUVBcmdzW2ldOwotICAgIGlmIChBRSA9PSBEZWNSZWYgJiYgIXBkLT5nZXRBdHRyPENGQ29uc3VtZWRBdHRyPigpICYmCisgICAgaWYgKEFFID09IERlY1JlZiAmJiAhcGQtPmhhc0F0dHI8Q0ZDb25zdW1lZEF0dHI+KCkgJiYKICAgICAgICAgQ3R4LklkZW50cy5nZXQoIkNGX0NPTlNVTUVEIikuaGFzTWFjcm9EZWZpbml0aW9uKCkpIHsKICAgICAgIGVkaXQ6OkNvbW1pdCBjb21taXQoKkVkaXRvcik7CiAgICAgICBjb21taXQuaW5zZXJ0QmVmb3JlKHBkLT5nZXRMb2NhdGlvbigpLCAiQ0ZfQ09OU1VNRUQgIik7CiAgICAgICBFZGl0b3ItPmNvbW1pdChjb21taXQpOwogICAgIH0KLSAgICBlbHNlIGlmIChBRSA9PSBEZWNSZWZNc2cgJiYgIXBkLT5nZXRBdHRyPE5TQ29uc3VtZWRBdHRyPigpICYmCisgICAgZWxzZSBpZiAoQUUgPT0gRGVjUmVmTXNnICYmICFwZC0+aGFzQXR0cjxOU0NvbnN1bWVkQXR0cj4oKSAmJgogICAgICAgICAgICAgIEN0eC5JZGVudHMuZ2V0KCJOU19DT05TVU1FRCIpLmhhc01hY3JvRGVmaW5pdGlvbigpKSB7CiAgICAgICBlZGl0OjpDb21taXQgY29tbWl0KCpFZGl0b3IpOwogICAgICAgY29tbWl0Lmluc2VydEJlZm9yZShwZC0+Z2V0TG9jYXRpb24oKSwgIk5TX0NPTlNVTUVEICIpOwpAQCAtMTM4OSwxMSArMTM4NSwxMSBAQAogICAgIHJldHVybiBDRl9CUklER0lOR19OT05FOwogICAgIAogICBDYWxsRWZmZWN0cyBDRSAgPSBDYWxsRWZmZWN0czo6Z2V0RWZmZWN0KEZ1bmNEZWNsKTsKLSAgYm9vbCBGdW5jSXNSZXR1cm5Bbm5vdGF0ZWQgPSAoRnVuY0RlY2wtPmdldEF0dHI8Q0ZSZXR1cm5zUmV0YWluZWRBdHRyPigpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmNEZWNsLT5nZXRBdHRyPENGUmV0dXJuc05vdFJldGFpbmVkQXR0cj4oKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jRGVjbC0+Z2V0QXR0cjxOU1JldHVybnNSZXRhaW5lZEF0dHI+KCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY0RlY2wtPmdldEF0dHI8TlNSZXR1cm5zTm90UmV0YWluZWRBdHRyPigpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmNEZWNsLT5nZXRBdHRyPE5TUmV0dXJuc0F1dG9yZWxlYXNlZEF0dHI+KCkpOworICBib29sIEZ1bmNJc1JldHVybkFubm90YXRlZCA9IChGdW5jRGVjbC0+aGFzQXR0cjxDRlJldHVybnNSZXRhaW5lZEF0dHI+KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY0RlY2wtPmhhc0F0dHI8Q0ZSZXR1cm5zTm90UmV0YWluZWRBdHRyPigpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmNEZWNsLT5oYXNBdHRyPE5TUmV0dXJuc1JldGFpbmVkQXR0cj4oKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jRGVjbC0+aGFzQXR0cjxOU1JldHVybnNOb3RSZXRhaW5lZEF0dHI+KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY0RlY2wtPmhhc0F0dHI8TlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0cj4oKSk7CiAgIAogICAvLyBUcml2aWFsIGNhc2Ugb2Ygd2hlbiBmdW5jaXRvbiBpcyBhbm5vdGF0ZWQgYW5kIGhhcyBubyBhcmd1bWVudC4KICAgaWYgKEZ1bmNJc1JldHVybkFubm90YXRlZCAmJiBGdW5jRGVjbC0+Z2V0TnVtUGFyYW1zKCkgPT0gMCkKQEAgLTE0MDUsNyArMTQwMSw3IEBACiAgICAgaWYgKFJldC5nZXRPYmpLaW5kKCkgPT0gUmV0RWZmZWN0OjpDRiAmJgogICAgICAgICAoUmV0LmlzT3duZWQoKSB8fCBSZXQubm90T3duZWQoKSkpCiAgICAgICBSZXR1cm5DRkF1ZGl0ZWQgPSB0cnVlOwotICAgIGVsc2UgaWYgKCFBdWRpdGVkVHlwZShGdW5jRGVjbC0+Z2V0UmVzdWx0VHlwZSgpKSkKKyAgICBlbHNlIGlmICghQXVkaXRlZFR5cGUoRnVuY0RlY2wtPmdldFJldHVyblR5cGUoKSkpCiAgICAgICByZXR1cm4gQ0ZfQlJJREdJTkdfTk9ORTsKICAgfQogICAKQEAgLTE0MTksNyArMTQxNSw3IEBACiAgICAgY29uc3QgUGFybVZhckRlY2wgKnBkID0gKnBpOwogICAgIEFyZ0VmZmVjdCBBRSA9IEFFQXJnc1tpXTsKICAgICBpZiAoQUUgPT0gRGVjUmVmIC8qQ0ZDb25zdW1lZCBhbm5vdGF0ZWQqLyB8fCBBRSA9PSBJbmNSZWYpIHsKLSAgICAgIGlmIChBRSA9PSBEZWNSZWYgJiYgIXBkLT5nZXRBdHRyPENGQ29uc3VtZWRBdHRyPigpKQorICAgICAgaWYgKEFFID09IERlY1JlZiAmJiAhcGQtPmhhc0F0dHI8Q0ZDb25zdW1lZEF0dHI+KCkpCiAgICAgICAgIEFyZ0NGQXVkaXRlZCA9IHRydWU7CiAgICAgICBlbHNlIGlmIChBRSA9PSBJbmNSZWYpCiAgICAgICAgIEFyZ0NGQXVkaXRlZCA9IHRydWU7CkBAIC0xNDQ0LDEyICsxNDQwLDggQEAKICAgICByZXR1cm47CiAgIAogICAvLyBtaWdyYXRlIG1ldGhvZHMgd2hpY2ggY2FuIGhhdmUgaW5zdGFuY2V0eXBlIGFzIHRoZWlyIHJlc3VsdCB0eXBlLgotICBmb3IgKE9iakNDb250YWluZXJEZWNsOjptZXRob2RfaXRlcmF0b3IgTSA9IENEZWNsLT5tZXRoX2JlZ2luKCksCi0gICAgICAgTUVuZCA9IENEZWNsLT5tZXRoX2VuZCgpOwotICAgICAgIE0gIT0gTUVuZDsgKytNKSB7Ci0gICAgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCA9ICgqTSk7CisgIGZvciAoY29uc3QgYXV0byAqTWV0aG9kIDogQ0RlY2wtPm1ldGhvZHMoKSkKICAgICBtaWdyYXRlQ0ZBbm5vdGF0aW9uKEN0eCwgTWV0aG9kKTsKLSAgfQogfQogCiB2b2lkIE9iakNNaWdyYXRlQVNUQ29uc3VtZXI6OkFkZENGQW5ub3RhdGlvbnMoQVNUQ29udGV4dCAmQ3R4LApAQCAtMTQ5OCw3ICsxNDkwLDcgQEAKICAgICAgICBwZSA9IE1ldGhvZERlY2wtPnBhcmFtX2VuZCgpOyBwaSAhPSBwZTsgKytwaSwgKytpKSB7CiAgICAgY29uc3QgUGFybVZhckRlY2wgKnBkID0gKnBpOwogICAgIEFyZ0VmZmVjdCBBRSA9IEFFQXJnc1tpXTsKLSAgICBpZiAoQUUgPT0gRGVjUmVmICYmICFwZC0+Z2V0QXR0cjxDRkNvbnN1bWVkQXR0cj4oKSAmJgorICAgIGlmIChBRSA9PSBEZWNSZWYgJiYgIXBkLT5oYXNBdHRyPENGQ29uc3VtZWRBdHRyPigpICYmCiAgICAgICAgIEN0eC5JZGVudHMuZ2V0KCJDRl9DT05TVU1FRCIpLmhhc01hY3JvRGVmaW5pdGlvbigpKSB7CiAgICAgICBlZGl0OjpDb21taXQgY29tbWl0KCpFZGl0b3IpOwogICAgICAgY29tbWl0Lmluc2VydEJlZm9yZShwZC0+Z2V0TG9jYXRpb24oKSwgIkNGX0NPTlNVTUVEICIpOwpAQCAtMTUxNCwxNCArMTUwNiwxNCBAQAogICAgIHJldHVybjsKICAgCiAgIENhbGxFZmZlY3RzIENFICA9IENhbGxFZmZlY3RzOjpnZXRFZmZlY3QoTWV0aG9kRGVjbCk7Ci0gIGJvb2wgTWV0aG9kSXNSZXR1cm5Bbm5vdGF0ZWQgPSAoTWV0aG9kRGVjbC0+Z2V0QXR0cjxDRlJldHVybnNSZXRhaW5lZEF0dHI+KCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZWNsLT5nZXRBdHRyPENGUmV0dXJuc05vdFJldGFpbmVkQXR0cj4oKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlY2wtPmdldEF0dHI8TlNSZXR1cm5zUmV0YWluZWRBdHRyPigpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbC0+Z2V0QXR0cjxOU1JldHVybnNOb3RSZXRhaW5lZEF0dHI+KCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZWNsLT5nZXRBdHRyPE5TUmV0dXJuc0F1dG9yZWxlYXNlZEF0dHI+KCkpOworICBib29sIE1ldGhvZElzUmV0dXJuQW5ub3RhdGVkID0gKE1ldGhvZERlY2wtPmhhc0F0dHI8Q0ZSZXR1cm5zUmV0YWluZWRBdHRyPigpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbC0+aGFzQXR0cjxDRlJldHVybnNOb3RSZXRhaW5lZEF0dHI+KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZWNsLT5oYXNBdHRyPE5TUmV0dXJuc1JldGFpbmVkQXR0cj4oKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlY2wtPmhhc0F0dHI8TlNSZXR1cm5zTm90UmV0YWluZWRBdHRyPigpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbC0+aGFzQXR0cjxOU1JldHVybnNBdXRvcmVsZWFzZWRBdHRyPigpKTsKICAgCiAgIGlmIChDRS5nZXRSZWNlaXZlcigpID09ICBEZWNSZWZNc2cgJiYKLSAgICAgICFNZXRob2REZWNsLT5nZXRBdHRyPE5TQ29uc3VtZXNTZWxmQXR0cj4oKSAmJgorICAgICAgIU1ldGhvZERlY2wtPmhhc0F0dHI8TlNDb25zdW1lc1NlbGZBdHRyPigpICYmCiAgICAgICBNZXRob2REZWNsLT5nZXRNZXRob2RGYW1pbHkoKSAhPSBPTUZfaW5pdCAmJgogICAgICAgTWV0aG9kRGVjbC0+Z2V0TWV0aG9kRmFtaWx5KCkgIT0gT01GX3JlbGVhc2UgJiYKICAgICAgIEN0eC5JZGVudHMuZ2V0KCJOU19DT05TVU1FU19TRUxGIikuaGFzTWFjcm9EZWZpbml0aW9uKCkpIHsKQEAgLTE1NDIsOCArMTUzNCw3IEBACiAgICAgICAgIChSZXQuaXNPd25lZCgpIHx8IFJldC5ub3RPd25lZCgpKSkgewogICAgICAgQWRkQ0ZBbm5vdGF0aW9ucyhDdHgsIENFLCBNZXRob2REZWNsLCBmYWxzZSk7CiAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKCFBdWRpdGVkVHlwZShNZXRob2REZWNsLT5nZXRSZXN1bHRUeXBlKCkpKQorICAgIH0gZWxzZSBpZiAoIUF1ZGl0ZWRUeXBlKE1ldGhvZERlY2wtPmdldFJldHVyblR5cGUoKSkpCiAgICAgICByZXR1cm47CiAgIH0KICAgCkBAIC0xNTU1LDcgKzE1NDYsNyBAQAogICAgICAgIHBlID0gTWV0aG9kRGVjbC0+cGFyYW1fZW5kKCk7IHBpICE9IHBlOyArK3BpLCArK2kpIHsKICAgICBjb25zdCBQYXJtVmFyRGVjbCAqcGQgPSAqcGk7CiAgICAgQXJnRWZmZWN0IEFFID0gQUVBcmdzW2ldOwotICAgIGlmICgoQUUgPT0gRGVjUmVmICYmICFwZC0+Z2V0QXR0cjxDRkNvbnN1bWVkQXR0cj4oKSkgfHwgQUUgPT0gSW5jUmVmIHx8CisgICAgaWYgKChBRSA9PSBEZWNSZWYgJiYgIXBkLT5oYXNBdHRyPENGQ29uc3VtZWRBdHRyPigpKSB8fCBBRSA9PSBJbmNSZWYgfHwKICAgICAgICAgIUF1ZGl0ZWRUeXBlKHBkLT5nZXRUeXBlKCkpKSB7CiAgICAgICBBZGRDRkFubm90YXRpb25zKEN0eCwgQ0UsIE1ldGhvZERlY2wsIE1ldGhvZElzUmV0dXJuQW5ub3RhdGVkKTsKICAgICAgIHJldHVybjsKQEAgLTE1NjUsNiArMTU1Niw1MyBAQAogfQogCiBuYW1lc3BhY2UgeworY2xhc3MgU3VwZXJJbml0Q2hlY2tlciA6IHB1YmxpYyBSZWN1cnNpdmVBU1RWaXNpdG9yPFN1cGVySW5pdENoZWNrZXI+IHsKK3B1YmxpYzoKKyAgYm9vbCBzaG91bGRWaXNpdFRlbXBsYXRlSW5zdGFudGlhdGlvbnMoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBib29sIHNob3VsZFdhbGtUeXBlc09mVHlwZUxvY3MoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgVmlzaXRPYmpDTWVzc2FnZUV4cHIoT2JqQ01lc3NhZ2VFeHByICpFKSB7CisgICAgaWYgKEUtPmdldFJlY2VpdmVyS2luZCgpID09IE9iakNNZXNzYWdlRXhwcjo6U3VwZXJJbnN0YW5jZSkgeworICAgICAgaWYgKEUtPmdldE1ldGhvZEZhbWlseSgpID09IE9NRl9pbml0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9Cit9OworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK3N0YXRpYyBib29sIGhhc1N1cGVySW5pdENhbGwoY29uc3QgT2JqQ01ldGhvZERlY2wgKk1EKSB7CisgIHJldHVybiAhU3VwZXJJbml0Q2hlY2tlcigpLlRyYXZlcnNlU3RtdChNRC0+Z2V0Qm9keSgpKTsKK30KKwordm9pZCBPYmpDTWlncmF0ZUFTVENvbnN1bWVyOjppbmZlckRlc2lnbmF0ZWRJbml0aWFsaXplcnMoCisgICAgQVNUQ29udGV4dCAmQ3R4LAorICAgIGNvbnN0IE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKkltcGxEKSB7CisKKyAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklGYWNlID0gSW1wbEQtPmdldENsYXNzSW50ZXJmYWNlKCk7CisgIGlmICghSUZhY2UgfHwgSUZhY2UtPmhhc0Rlc2lnbmF0ZWRJbml0aWFsaXplcnMoKSkKKyAgICByZXR1cm47CisgIGlmICghQ3R4LklkZW50cy5nZXQoIk5TX0RFU0lHTkFURURfSU5JVElBTElaRVIiKS5oYXNNYWNyb0RlZmluaXRpb24oKSkKKyAgICByZXR1cm47CisKKyAgZm9yIChjb25zdCBhdXRvICpNRCA6IEltcGxELT5pbnN0YW5jZV9tZXRob2RzKCkpIHsKKyAgICBpZiAoTUQtPmlzRGVwcmVjYXRlZCgpIHx8CisgICAgICAgIE1ELT5nZXRNZXRob2RGYW1pbHkoKSAhPSBPTUZfaW5pdCB8fAorICAgICAgICBNRC0+aXNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJGb3JUaGVJbnRlcmZhY2UoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpJRmFjZU0gPSBJRmFjZS0+Z2V0TWV0aG9kKE1ELT5nZXRTZWxlY3RvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNJbnN0YW5jZT0qL3RydWUpOworICAgIGlmICghSUZhY2VNKQorICAgICAgY29udGludWU7CisgICAgaWYgKGhhc1N1cGVySW5pdENhbGwoTUQpKSB7CisgICAgICBlZGl0OjpDb21taXQgY29tbWl0KCpFZGl0b3IpOworICAgICAgY29tbWl0Lmluc2VydChJRmFjZU0tPmdldExvY0VuZCgpLCAiIE5TX0RFU0lHTkFURURfSU5JVElBTElaRVIiKTsKKyAgICAgIEVkaXRvci0+Y29tbWl0KGNvbW1pdCk7CisgICAgfQorICB9Cit9CisKK25hbWVzcGFjZSB7CiAKIGNsYXNzIFJld3JpdGVzUmVjZWl2ZXIgOiBwdWJsaWMgZWRpdDo6RWRpdHNSZWNlaXZlciB7CiAgIFJld3JpdGVyICZSZXdyaXRlOwpAQCAtMTU3MiwxNCArMTYxMCw5MiBAQAogcHVibGljOgogICBSZXdyaXRlc1JlY2VpdmVyKFJld3JpdGVyICZSZXdyaXRlKSA6IFJld3JpdGUoUmV3cml0ZSkgeyB9CiAKLSAgdmlydHVhbCB2b2lkIGluc2VydChTb3VyY2VMb2NhdGlvbiBsb2MsIFN0cmluZ1JlZiB0ZXh0KSB7CisgIHZvaWQgaW5zZXJ0KFNvdXJjZUxvY2F0aW9uIGxvYywgU3RyaW5nUmVmIHRleHQpIG92ZXJyaWRlIHsKICAgICBSZXdyaXRlLkluc2VydFRleHQobG9jLCB0ZXh0KTsKICAgfQotICB2aXJ0dWFsIHZvaWQgcmVwbGFjZShDaGFyU291cmNlUmFuZ2UgcmFuZ2UsIFN0cmluZ1JlZiB0ZXh0KSB7CisgIHZvaWQgcmVwbGFjZShDaGFyU291cmNlUmFuZ2UgcmFuZ2UsIFN0cmluZ1JlZiB0ZXh0KSBvdmVycmlkZSB7CiAgICAgUmV3cml0ZS5SZXBsYWNlVGV4dChyYW5nZS5nZXRCZWdpbigpLCBSZXdyaXRlLmdldFJhbmdlU2l6ZShyYW5nZSksIHRleHQpOwogICB9CiB9OwogCitjbGFzcyBKU09ORWRpdFdyaXRlciA6IHB1YmxpYyBlZGl0OjpFZGl0c1JlY2VpdmVyIHsKKyAgU291cmNlTWFuYWdlciAmU291cmNlTWdyOworICBsbHZtOjpyYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgSlNPTkVkaXRXcml0ZXIoU291cmNlTWFuYWdlciAmU00sIGxsdm06OnJhd19vc3RyZWFtICZPUykKKyAgICA6IFNvdXJjZU1ncihTTSksIE9TKE9TKSB7CisgICAgT1MgPDwgIltcbiI7CisgIH0KKyAgfkpTT05FZGl0V3JpdGVyKCkgeworICAgIE9TIDw8ICJdXG4iOworICB9CisKK3ByaXZhdGU6CisgIHN0cnVjdCBFbnRyeVdyaXRlciB7CisgICAgU291cmNlTWFuYWdlciAmU291cmNlTWdyOworICAgIGxsdm06OnJhd19vc3RyZWFtICZPUzsKKworICAgIEVudHJ5V3JpdGVyKFNvdXJjZU1hbmFnZXIgJlNNLCBsbHZtOjpyYXdfb3N0cmVhbSAmT1MpCisgICAgICA6IFNvdXJjZU1ncihTTSksIE9TKE9TKSB7CisgICAgICBPUyA8PCAiIHtcbiI7CisgICAgfQorICAgIH5FbnRyeVdyaXRlcigpIHsKKyAgICAgIE9TIDw8ICIgfSxcbiI7CisgICAgfQorCisgICAgdm9pZCB3cml0ZUxvYyhTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgICAgIEZpbGVJRCBGSUQ7CisgICAgICB1bnNpZ25lZCBPZmZzZXQ7CisgICAgICBzdGQ6OnRpZShGSUQsIE9mZnNldCkgPSBTb3VyY2VNZ3IuZ2V0RGVjb21wb3NlZExvYyhMb2MpOworICAgICAgYXNzZXJ0KCFGSUQuaXNJbnZhbGlkKCkpOworICAgICAgU21hbGxTdHJpbmc8MjAwPiBQYXRoID0KKyAgICAgICAgICBTdHJpbmdSZWYoU291cmNlTWdyLmdldEZpbGVFbnRyeUZvcklEKEZJRCktPmdldE5hbWUoKSk7CisgICAgICBsbHZtOjpzeXM6OmZzOjptYWtlX2Fic29sdXRlKFBhdGgpOworICAgICAgT1MgPDwgIiAgXCJmaWxlXCI6IFwiIjsKKyAgICAgIE9TLndyaXRlX2VzY2FwZWQoUGF0aC5zdHIoKSkgPDwgIlwiLFxuIjsKKyAgICAgIE9TIDw8ICIgIFwib2Zmc2V0XCI6ICIgPDwgT2Zmc2V0IDw8ICIsXG4iOworICAgIH0KKworICAgIHZvaWQgd3JpdGVSZW1vdmUoQ2hhclNvdXJjZVJhbmdlIFJhbmdlKSB7CisgICAgICBhc3NlcnQoUmFuZ2UuaXNDaGFyUmFuZ2UoKSk7CisgICAgICBzdGQ6OnBhaXI8RmlsZUlELCB1bnNpZ25lZD4gQmVnaW4gPQorICAgICAgICAgIFNvdXJjZU1nci5nZXREZWNvbXBvc2VkTG9jKFJhbmdlLmdldEJlZ2luKCkpOworICAgICAgc3RkOjpwYWlyPEZpbGVJRCwgdW5zaWduZWQ+IEVuZCA9CisgICAgICAgICAgU291cmNlTWdyLmdldERlY29tcG9zZWRMb2MoUmFuZ2UuZ2V0RW5kKCkpOworICAgICAgYXNzZXJ0KEJlZ2luLmZpcnN0ID09IEVuZC5maXJzdCk7CisgICAgICBhc3NlcnQoQmVnaW4uc2Vjb25kIDw9IEVuZC5zZWNvbmQpOworICAgICAgdW5zaWduZWQgTGVuZ3RoID0gRW5kLnNlY29uZCAtIEJlZ2luLnNlY29uZDsKKworICAgICAgT1MgPDwgIiAgXCJyZW1vdmVcIjogIiA8PCBMZW5ndGggPDwgIixcbiI7CisgICAgfQorCisgICAgdm9pZCB3cml0ZVRleHQoU3RyaW5nUmVmIFRleHQpIHsKKyAgICAgIE9TIDw8ICIgIFwidGV4dFwiOiBcIiI7CisgICAgICBPUy53cml0ZV9lc2NhcGVkKFRleHQpIDw8ICJcIixcbiI7CisgICAgfQorICB9OworIAorICB2b2lkIGluc2VydChTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBUZXh0KSBvdmVycmlkZSB7CisgICAgRW50cnlXcml0ZXIgV3JpdGVyKFNvdXJjZU1nciwgT1MpOworICAgIFdyaXRlci53cml0ZUxvYyhMb2MpOworICAgIFdyaXRlci53cml0ZVRleHQoVGV4dCk7CisgIH0KKworICB2b2lkIHJlcGxhY2UoQ2hhclNvdXJjZVJhbmdlIFJhbmdlLCBTdHJpbmdSZWYgVGV4dCkgb3ZlcnJpZGUgeworICAgIEVudHJ5V3JpdGVyIFdyaXRlcihTb3VyY2VNZ3IsIE9TKTsKKyAgICBXcml0ZXIud3JpdGVMb2MoUmFuZ2UuZ2V0QmVnaW4oKSk7CisgICAgV3JpdGVyLndyaXRlUmVtb3ZlKFJhbmdlKTsKKyAgICBXcml0ZXIud3JpdGVUZXh0KFRleHQpOworICB9CisKKyAgdm9pZCByZW1vdmUoQ2hhclNvdXJjZVJhbmdlIFJhbmdlKSBvdmVycmlkZSB7CisgICAgRW50cnlXcml0ZXIgV3JpdGVyKFNvdXJjZU1nciwgT1MpOworICAgIFdyaXRlci53cml0ZUxvYyhSYW5nZS5nZXRCZWdpbigpKTsKKyAgICBXcml0ZXIud3JpdGVSZW1vdmUoUmFuZ2UpOworICB9Cit9OworCiB9CiAKIHN0YXRpYyBib29sCkBAIC0xNTkzLDkgKzE3MDksOSBAQAogICAgICAgaWYgKEZJLmdldEZpbGVDaGFyYWN0ZXJpc3RpYygpID09IFNyY01ncjo6Q19FeHRlcm5DU3lzdGVtKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIGlmIChGSS5nZXRGaWxlQ2hhcmFjdGVyaXN0aWMoKSA9PSBTcmNNZ3I6OkNfU3lzdGVtKSB7Ci0gICAgICAgIC8vIFRoaXMgZmlsZSBpcyBpbiBhIHN5c3RlbSBoZWFkZXIgZGlyZWN0b3J5LiBDb250aW51ZSB3aXRoIGNvbW1pdGluZyBjaGFuZ2UKLSAgICAgICAgLy8gb25seSBpZiBpdCBpcyBhIHVzZXIgc3BlY2lmaWVkIHN5c3RlbSBkaXJlY3RvcnkgYmVjYXVzZSB1c2VyIHB1dCBhCi0gICAgICAgIC8vIC5zeXN0ZW1fZnJhbWV3b3JrIGZpbGUgaW4gdGhlIGZyYW1ld29yayBkaXJlY3RvcnkuCisgICAgICAgIC8vIFRoaXMgZmlsZSBpcyBpbiBhIHN5c3RlbSBoZWFkZXIgZGlyZWN0b3J5LiBDb250aW51ZSBjb21taXR0aW5nCisgICAgICAgIC8vIGNoYW5nZSBvbmx5IGlmIGl0J3MgYSB1c2VyLXNwZWNpZmllZCBzeXN0ZW0gZGlyZWN0b3J5IGJlY2F1c2UgdXNlcgorICAgICAgICAvLyBwdXQgYSAuc3lzdGVtX2ZyYW1ld29yayBmaWxlIGluIHRoZSBmcmFtZXdvcmsgZGlyZWN0b3J5LgogICAgICAgICBTdHJpbmdSZWYgRGlyZWN0b3J5KGZpbGUtPmdldERpcigpLT5nZXROYW1lKCkpOwogICAgICAgICBzaXplX3QgSXggPSBEaXJlY3RvcnkucmZpbmQoIi5mcmFtZXdvcmsiKTsKICAgICAgICAgaWYgKEl4ID09IFN0cmluZ1JlZjo6bnBvcykKQEAgLTE2MjQsMjIgKzE3NDAsMjUgQEAKICAgICAgICAgfQogICAgICAgCiAgICAgICBpZiAoT2JqQ0ludGVyZmFjZURlY2wgKkNEZWNsID0gZHluX2Nhc3Q8T2JqQ0ludGVyZmFjZURlY2w+KCpEKSkKLSAgICAgICAgbWlncmF0ZU9iakNJbnRlcmZhY2VEZWNsKEN0eCwgQ0RlY2wpOworICAgICAgICBpZiAoY2FuTW9kaWZ5KENEZWNsKSkKKyAgICAgICAgICBtaWdyYXRlT2JqQ0ludGVyZmFjZURlY2woQ3R4LCBDRGVjbCk7CiAgICAgICBpZiAoT2JqQ0NhdGVnb3J5RGVjbCAqQ2F0RGVjbCA9IGR5bl9jYXN0PE9iakNDYXRlZ29yeURlY2w+KCpEKSkgewotICAgICAgICBtaWdyYXRlT2JqQ0ludGVyZmFjZURlY2woQ3R4LCBDYXREZWNsKTsKLSAgICAgICAgaWYgKEFTVE1pZ3JhdGVBY3Rpb25zICYgRnJvbnRlbmRPcHRpb25zOjpPYmpDTVRfQW5ub3RhdGlvbikKLSAgICAgICAgICBtaWdyYXRlRGVwcmVjYXRlZEFubm90YXRpb24oQ3R4LCBDYXREZWNsKTsKKyAgICAgICAgaWYgKGNhbk1vZGlmeShDYXREZWNsKSkKKyAgICAgICAgICBtaWdyYXRlT2JqQ0ludGVyZmFjZURlY2woQ3R4LCBDYXREZWNsKTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYgKE9iakNQcm90b2NvbERlY2wgKlBEZWNsID0gZHluX2Nhc3Q8T2JqQ1Byb3RvY29sRGVjbD4oKkQpKQotICAgICAgICBPYmpDUHJvdG9jb2xEZWNscy5pbnNlcnQoUERlY2wpOworICAgICAgICBPYmpDUHJvdG9jb2xEZWNscy5pbnNlcnQoUERlY2wtPmdldENhbm9uaWNhbERlY2woKSk7CiAgICAgICBlbHNlIGlmIChjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpJbXBEZWNsID0KICAgICAgICAgICAgICAgIGR5bl9jYXN0PE9iakNJbXBsZW1lbnRhdGlvbkRlY2w+KCpEKSkgewotICAgICAgICBpZiAoQVNUTWlncmF0ZUFjdGlvbnMgJiBGcm9udGVuZE9wdGlvbnM6Ok9iakNNVF9Qcm90b2NvbENvbmZvcm1hbmNlKQorICAgICAgICBpZiAoKEFTVE1pZ3JhdGVBY3Rpb25zICYgRnJvbnRlbmRPcHRpb25zOjpPYmpDTVRfUHJvdG9jb2xDb25mb3JtYW5jZSkgJiYKKyAgICAgICAgICAgIGNhbk1vZGlmeShJbXBEZWNsKSkKICAgICAgICAgICBtaWdyYXRlUHJvdG9jb2xDb25mb3JtYW5jZShDdHgsIEltcERlY2wpOwogICAgICAgfQogICAgICAgZWxzZSBpZiAoY29uc3QgRW51bURlY2wgKkVEID0gZHluX2Nhc3Q8RW51bURlY2w+KCpEKSkgewogICAgICAgICBpZiAoIShBU1RNaWdyYXRlQWN0aW9ucyAmIEZyb250ZW5kT3B0aW9uczo6T2JqQ01UX05zTWFjcm9zKSkKICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCFjYW5Nb2RpZnkoRUQpKQorICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBEZWNsQ29udGV4dDo6ZGVjbF9pdGVyYXRvciBOID0gRDsKICAgICAgICAgaWYgKCsrTiAhPSBERW5kKSB7CiAgICAgICAgICAgY29uc3QgVHlwZWRlZkRlY2wgKlREID0gZHluX2Nhc3Q8VHlwZWRlZkRlY2w+KCpOKTsKQEAgLTE2NTIsNiArMTc3MSw4IEBACiAgICAgICBlbHNlIGlmIChjb25zdCBUeXBlZGVmRGVjbCAqVEQgPSBkeW5fY2FzdDxUeXBlZGVmRGVjbD4oKkQpKSB7CiAgICAgICAgIGlmICghKEFTVE1pZ3JhdGVBY3Rpb25zICYgRnJvbnRlbmRPcHRpb25zOjpPYmpDTVRfTnNNYWNyb3MpKQogICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIWNhbk1vZGlmeShURCkpCisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIE4gPSBEOwogICAgICAgICBpZiAoKytOID09IERFbmQpCiAgICAgICAgICAgY29udGludWU7CkBAIC0xNjczLDIzICsxNzk0LDQ5IEBACiAgICAgICAgIENhY2hlT2JqQ05TSW50ZWdlclR5cGVkZWZlZChURCk7CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPigqRCkpIHsKLSAgICAgICAgaWYgKEFTVE1pZ3JhdGVBY3Rpb25zICYgRnJvbnRlbmRPcHRpb25zOjpPYmpDTVRfQW5ub3RhdGlvbikKKyAgICAgICAgaWYgKChBU1RNaWdyYXRlQWN0aW9ucyAmIEZyb250ZW5kT3B0aW9uczo6T2JqQ01UX0Fubm90YXRpb24pICYmCisgICAgICAgICAgICBjYW5Nb2RpZnkoRkQpKQogICAgICAgICAgIG1pZ3JhdGVDRkFubm90YXRpb24oQ3R4LCBGRCk7CiAgICAgICB9CiAgICAgICAKICAgICAgIGlmIChPYmpDQ29udGFpbmVyRGVjbCAqQ0RlY2wgPSBkeW5fY2FzdDxPYmpDQ29udGFpbmVyRGVjbD4oKkQpKSB7CisgICAgICAgIGJvb2wgQ2FuTW9kaWZ5ID0gY2FuTW9kaWZ5KENEZWNsKTsKICAgICAgICAgLy8gbWlncmF0ZSBtZXRob2RzIHdoaWNoIGNhbiBoYXZlIGluc3RhbmNldHlwZSBhcyB0aGVpciByZXN1bHQgdHlwZS4KLSAgICAgICAgaWYgKEFTVE1pZ3JhdGVBY3Rpb25zICYgRnJvbnRlbmRPcHRpb25zOjpPYmpDTVRfSW5zdGFuY2V0eXBlKQorICAgICAgICBpZiAoKEFTVE1pZ3JhdGVBY3Rpb25zICYgRnJvbnRlbmRPcHRpb25zOjpPYmpDTVRfSW5zdGFuY2V0eXBlKSAmJgorICAgICAgICAgICAgQ2FuTW9kaWZ5KQogICAgICAgICAgIG1pZ3JhdGVBbGxNZXRob2RJbnN0YWNlVHlwZShDdHgsIENEZWNsKTsKICAgICAgICAgLy8gYW5ub3RhdGUgbWV0aG9kcyB3aXRoIENGIGFubm90YXRpb25zLgotICAgICAgICBpZiAoQVNUTWlncmF0ZUFjdGlvbnMgJiBGcm9udGVuZE9wdGlvbnM6Ok9iakNNVF9Bbm5vdGF0aW9uKQorICAgICAgICBpZiAoKEFTVE1pZ3JhdGVBY3Rpb25zICYgRnJvbnRlbmRPcHRpb25zOjpPYmpDTVRfQW5ub3RhdGlvbikgJiYKKyAgICAgICAgICAgIENhbk1vZGlmeSkKICAgICAgICAgICBtaWdyYXRlQVJDU2FmZUFubm90YXRpb24oQ3R4LCBDRGVjbCk7CiAgICAgICB9CisKKyAgICAgIGlmIChjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICoKKyAgICAgICAgICAgIEltcGxEID0gZHluX2Nhc3Q8T2JqQ0ltcGxlbWVudGF0aW9uRGVjbD4oKkQpKSB7CisgICAgICAgIGlmICgoQVNUTWlncmF0ZUFjdGlvbnMgJiBGcm9udGVuZE9wdGlvbnM6Ok9iakNNVF9EZXNpZ25hdGVkSW5pdGlhbGl6ZXIpICYmCisgICAgICAgICAgICBjYW5Nb2RpZnkoSW1wbEQpKQorICAgICAgICAgIGluZmVyRGVzaWduYXRlZEluaXRpYWxpemVycyhDdHgsIEltcGxEKTsKKyAgICAgIH0KICAgICB9CiAgICAgaWYgKEFTVE1pZ3JhdGVBY3Rpb25zICYgRnJvbnRlbmRPcHRpb25zOjpPYmpDTVRfQW5ub3RhdGlvbikKICAgICAgIEFubm90YXRlSW1wbGljaXRCcmlkZ2luZyhDdHgpOwogICB9CiAgIAorIGlmIChJc091dHB1dEZpbGUpIHsKKyAgIHN0ZDo6c3RyaW5nIEVycm9yOworICAgbGx2bTo6cmF3X2ZkX29zdHJlYW0gT1MoTWlncmF0ZURpci5jX3N0cigpLCBFcnJvciwgbGx2bTo6c3lzOjpmczo6Rl9Ob25lKTsKKyAgICBpZiAoIUVycm9yLmVtcHR5KCkpIHsKKyAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFncyA9IEN0eC5nZXREaWFnbm9zdGljcygpOworICAgICAgRGlhZ3MuUmVwb3J0KERpYWdzLmdldEN1c3RvbURpYWdJRChEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3IsICIlMCIpKQorICAgICAgICAgIDw8IEVycm9yOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgSlNPTkVkaXRXcml0ZXIgV3JpdGVyKEN0eC5nZXRTb3VyY2VNYW5hZ2VyKCksIE9TKTsKKyAgIEVkaXRvci0+YXBwbHlSZXdyaXRlcyhXcml0ZXIpOworICAgcmV0dXJuOworIH0KKwogICBSZXdyaXRlciByZXdyaXRlcihDdHguZ2V0U291cmNlTWFuYWdlcigpLCBDdHguZ2V0TGFuZ09wdHMoKSk7CiAgIFJld3JpdGVzUmVjZWl2ZXIgUmVjKHJld3JpdGVyKTsKICAgRWRpdG9yLT5hcHBseVJld3JpdGVzKFJlYyk7CkBAIC0xNzAyLDggKzE4NDksNiBAQAogICAgIGFzc2VydChmaWxlKTsKICAgICBpZiAoSXNSZWFsbHlBU3lzdGVtSGVhZGVyKEN0eCwgZmlsZSwgRklEKSkKICAgICAgIGNvbnRpbnVlOwotICAgIGlmICghY2FuTW9kaWZ5RmlsZShmaWxlLT5nZXROYW1lKCkpKQotICAgICAgY29udGludWU7CiAgICAgU21hbGxTdHJpbmc8NTEyPiBuZXdUZXh0OwogICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gdmVjT1MobmV3VGV4dCk7CiAgICAgYnVmLndyaXRlKHZlY09TKTsKQEAgLTE3NzMsMyArMTkxOCwyNDUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNPdXRwdXRGaWxlPSovdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoaXRlTGlzdCk7CiB9CisKK25hbWVzcGFjZSB7CitzdHJ1Y3QgRWRpdEVudHJ5IHsKKyAgY29uc3QgRmlsZUVudHJ5ICpGaWxlOworICB1bnNpZ25lZCBPZmZzZXQ7CisgIHVuc2lnbmVkIFJlbW92ZUxlbjsKKyAgc3RkOjpzdHJpbmcgVGV4dDsKKworICBFZGl0RW50cnkoKSA6IEZpbGUoKSwgT2Zmc2V0KCksIFJlbW92ZUxlbigpIHt9Cit9OworfQorCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88RWRpdEVudHJ5PiB7CisgIHN0YXRpYyBpbmxpbmUgRWRpdEVudHJ5IGdldEVtcHR5S2V5KCkgeworICAgIEVkaXRFbnRyeSBFbnRyeTsKKyAgICBFbnRyeS5PZmZzZXQgPSB1bnNpZ25lZCgtMSk7CisgICAgcmV0dXJuIEVudHJ5OworICB9CisgIHN0YXRpYyBpbmxpbmUgRWRpdEVudHJ5IGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICBFZGl0RW50cnkgRW50cnk7CisgICAgRW50cnkuT2Zmc2V0ID0gdW5zaWduZWQoLTIpOworICAgIHJldHVybiBFbnRyeTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEVkaXRFbnRyeSYgVmFsKSB7CisgICAgbGx2bTo6Rm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgICBJRC5BZGRQb2ludGVyKFZhbC5GaWxlKTsKKyAgICBJRC5BZGRJbnRlZ2VyKFZhbC5PZmZzZXQpOworICAgIElELkFkZEludGVnZXIoVmFsLlJlbW92ZUxlbik7CisgICAgSUQuQWRkU3RyaW5nKFZhbC5UZXh0KTsKKyAgICByZXR1cm4gSUQuQ29tcHV0ZUhhc2goKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IEVkaXRFbnRyeSAmTEhTLCBjb25zdCBFZGl0RW50cnkgJlJIUykgeworICAgIHJldHVybiBMSFMuRmlsZSA9PSBSSFMuRmlsZSAmJgorICAgICAgICBMSFMuT2Zmc2V0ID09IFJIUy5PZmZzZXQgJiYKKyAgICAgICAgTEhTLlJlbW92ZUxlbiA9PSBSSFMuUmVtb3ZlTGVuICYmCisgICAgICAgIExIUy5UZXh0ID09IFJIUy5UZXh0OworICB9Cit9OworfQorCituYW1lc3BhY2UgeworY2xhc3MgUmVtYXBGaWxlUGFyc2VyIHsKKyAgRmlsZU1hbmFnZXIgJkZpbGVNZ3I7CisKK3B1YmxpYzoKKyAgUmVtYXBGaWxlUGFyc2VyKEZpbGVNYW5hZ2VyICZGaWxlTWdyKSA6IEZpbGVNZ3IoRmlsZU1ncikgeyB9CisKKyAgYm9vbCBwYXJzZShTdHJpbmdSZWYgRmlsZSwgU21hbGxWZWN0b3JJbXBsPEVkaXRFbnRyeT4gJkVudHJpZXMpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6eWFtbDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IEZpbGVCdWY7CisgICAgaWYgKGxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZShGaWxlLCBGaWxlQnVmKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgbGx2bTo6U291cmNlTWdyIFNNOworICAgIFN0cmVhbSBZQU1MU3RyZWFtKEZpbGVCdWYucmVsZWFzZSgpLCBTTSk7CisgICAgZG9jdW1lbnRfaXRlcmF0b3IgSSA9IFlBTUxTdHJlYW0uYmVnaW4oKTsKKyAgICBpZiAoSSA9PSBZQU1MU3RyZWFtLmVuZCgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgTm9kZSAqUm9vdCA9IEktPmdldFJvb3QoKTsKKyAgICBpZiAoIVJvb3QpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIFNlcXVlbmNlTm9kZSAqU2VxTm9kZSA9IGR5bl9jYXN0PFNlcXVlbmNlTm9kZT4oUm9vdCk7CisgICAgaWYgKCFTZXFOb2RlKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBmb3IgKFNlcXVlbmNlTm9kZTo6aXRlcmF0b3IKKyAgICAgICAgICAgQUkgPSBTZXFOb2RlLT5iZWdpbigpLCBBRSA9IFNlcU5vZGUtPmVuZCgpOyBBSSAhPSBBRTsgKytBSSkgeworICAgICAgTWFwcGluZ05vZGUgKk1hcE5vZGUgPSBkeW5fY2FzdDxNYXBwaW5nTm9kZT4oJipBSSk7CisgICAgICBpZiAoIU1hcE5vZGUpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgcGFyc2VFZGl0KE1hcE5vZGUsIEVudHJpZXMpOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIHBhcnNlRWRpdChsbHZtOjp5YW1sOjpNYXBwaW5nTm9kZSAqTm9kZSwKKyAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEVkaXRFbnRyeT4gJkVudHJpZXMpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6eWFtbDsKKyAgICBFZGl0RW50cnkgRW50cnk7CisgICAgYm9vbCBJZ25vcmUgPSBmYWxzZTsKKworICAgIGZvciAoTWFwcGluZ05vZGU6Oml0ZXJhdG9yCisgICAgICAgICAgIEtWSSA9IE5vZGUtPmJlZ2luKCksIEtWRSA9IE5vZGUtPmVuZCgpOyBLVkkgIT0gS1ZFOyArK0tWSSkgeworICAgICAgU2NhbGFyTm9kZSAqS2V5U3RyaW5nID0gZHluX2Nhc3Q8U2NhbGFyTm9kZT4oKCpLVkkpLmdldEtleSgpKTsKKyAgICAgIGlmICghS2V5U3RyaW5nKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIFNtYWxsU3RyaW5nPDEwPiBLZXlTdG9yYWdlOworICAgICAgU3RyaW5nUmVmIEtleSA9IEtleVN0cmluZy0+Z2V0VmFsdWUoS2V5U3RvcmFnZSk7CisKKyAgICAgIFNjYWxhck5vZGUgKlZhbHVlU3RyaW5nID0gZHluX2Nhc3Q8U2NhbGFyTm9kZT4oKCpLVkkpLmdldFZhbHVlKCkpOworICAgICAgaWYgKCFWYWx1ZVN0cmluZykKKyAgICAgICAgY29udGludWU7CisgICAgICBTbWFsbFN0cmluZzw2ND4gVmFsdWVTdG9yYWdlOworICAgICAgU3RyaW5nUmVmIFZhbCA9IFZhbHVlU3RyaW5nLT5nZXRWYWx1ZShWYWx1ZVN0b3JhZ2UpOworCisgICAgICBpZiAoS2V5ID09ICJmaWxlIikgeworICAgICAgICBjb25zdCBGaWxlRW50cnkgKkZFID0gRmlsZU1nci5nZXRGaWxlKFZhbCk7CisgICAgICAgIGlmICghRkUpCisgICAgICAgICAgSWdub3JlID0gdHJ1ZTsKKyAgICAgICAgRW50cnkuRmlsZSA9IEZFOworICAgICAgfSBlbHNlIGlmIChLZXkgPT0gIm9mZnNldCIpIHsKKyAgICAgICAgaWYgKFZhbC5nZXRBc0ludGVnZXIoMTAsIEVudHJ5Lk9mZnNldCkpCisgICAgICAgICAgSWdub3JlID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoS2V5ID09ICJyZW1vdmUiKSB7CisgICAgICAgIGlmIChWYWwuZ2V0QXNJbnRlZ2VyKDEwLCBFbnRyeS5SZW1vdmVMZW4pKQorICAgICAgICAgIElnbm9yZSA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKEtleSA9PSAidGV4dCIpIHsKKyAgICAgICAgRW50cnkuVGV4dCA9IFZhbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIUlnbm9yZSkKKyAgICAgIEVudHJpZXMucHVzaF9iYWNrKEVudHJ5KTsKKyAgfQorfTsKK30KKworc3RhdGljIGJvb2wgcmVwb3J0RGlhZyhjb25zdCBUd2luZSAmRXJyLCBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZykgeworICBEaWFnLlJlcG9ydChEaWFnLmdldEN1c3RvbURpYWdJRChEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3IsICIlMCIpKQorICAgICAgPDwgRXJyLnN0cigpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGFwcGx5RWRpdHNUb1RlbXAoY29uc3QgRmlsZUVudHJ5ICpGRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEVkaXRFbnRyeT4gRWRpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTWFuYWdlciAmRmlsZU1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFnKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzeXM7CisKKyAgU291cmNlTWFuYWdlciBTTShEaWFnLCBGaWxlTWdyKTsKKyAgRmlsZUlEIEZJRCA9IFNNLmNyZWF0ZUZpbGVJRChGRSwgU291cmNlTG9jYXRpb24oKSwgU3JjTWdyOjpDX1VzZXIpOworICBMYW5nT3B0aW9ucyBMYW5nT3B0czsKKyAgZWRpdDo6RWRpdGVkU291cmNlIEVkaXRvcihTTSwgTGFuZ09wdHMpOworICBmb3IgKEFycmF5UmVmPEVkaXRFbnRyeT46Oml0ZXJhdG9yCisgICAgICAgIEkgPSBFZGl0cy5iZWdpbigpLCBFID0gRWRpdHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgRWRpdEVudHJ5ICZFbnRyeSA9ICpJOworICAgIGFzc2VydChFbnRyeS5GaWxlID09IEZFKTsKKyAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPQorICAgICAgICBTTS5nZXRMb2NGb3JTdGFydE9mRmlsZShGSUQpLmdldExvY1dpdGhPZmZzZXQoRW50cnkuT2Zmc2V0KTsKKyAgICBDaGFyU291cmNlUmFuZ2UgUmFuZ2U7CisgICAgaWYgKEVudHJ5LlJlbW92ZUxlbiAhPSAwKSB7CisgICAgICBSYW5nZSA9IENoYXJTb3VyY2VSYW5nZTo6Z2V0Q2hhclJhbmdlKExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jLmdldExvY1dpdGhPZmZzZXQoRW50cnkuUmVtb3ZlTGVuKSk7CisgICAgfQorCisgICAgZWRpdDo6Q29tbWl0IGNvbW1pdChFZGl0b3IpOworICAgIGlmIChSYW5nZS5pc0ludmFsaWQoKSkgeworICAgICAgY29tbWl0Lmluc2VydChMb2MsIEVudHJ5LlRleHQpOworICAgIH0gZWxzZSBpZiAoRW50cnkuVGV4dC5lbXB0eSgpKSB7CisgICAgICBjb21taXQucmVtb3ZlKFJhbmdlKTsKKyAgICB9IGVsc2UgeworICAgICAgY29tbWl0LnJlcGxhY2UoUmFuZ2UsIEVudHJ5LlRleHQpOworICAgIH0KKyAgICBFZGl0b3IuY29tbWl0KGNvbW1pdCk7CisgIH0KKworICBSZXdyaXRlciByZXdyaXRlcihTTSwgTGFuZ09wdHMpOworICBSZXdyaXRlc1JlY2VpdmVyIFJlYyhyZXdyaXRlcik7CisgIEVkaXRvci5hcHBseVJld3JpdGVzKFJlYyk7CisKKyAgY29uc3QgUmV3cml0ZUJ1ZmZlciAqQnVmID0gcmV3cml0ZXIuZ2V0UmV3cml0ZUJ1ZmZlckZvcihGSUQpOworICBTbWFsbFN0cmluZzw1MTI+IE5ld1RleHQ7CisgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gT1MoTmV3VGV4dCk7CisgIEJ1Zi0+d3JpdGUoT1MpOworICBPUy5mbHVzaCgpOworCisgIFNtYWxsU3RyaW5nPDY0PiBUZW1wUGF0aDsKKyAgaW50IEZEOworICBpZiAoZnM6OmNyZWF0ZVRlbXBvcmFyeUZpbGUocGF0aDo6ZmlsZW5hbWUoRkUtPmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOjpleHRlbnNpb24oRkUtPmdldE5hbWUoKSksIEZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcFBhdGgpKSB7CisgICAgcmVwb3J0RGlhZygiQ291bGQgbm90IGNyZWF0ZSBmaWxlOiAiICsgVGVtcFBhdGguc3RyKCksIERpYWcpOworICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICB9CisKKyAgbGx2bTo6cmF3X2ZkX29zdHJlYW0gVG1wT3V0KEZELCAvKnNob3VsZENsb3NlPSovdHJ1ZSk7CisgIFRtcE91dC53cml0ZShOZXdUZXh0LmRhdGEoKSwgTmV3VGV4dC5zaXplKCkpOworICBUbXBPdXQuY2xvc2UoKTsKKworICByZXR1cm4gVGVtcFBhdGguc3RyKCk7Cit9CisKK2Jvb2wgYXJjbXQ6OmdldEZpbGVSZW1hcHBpbmdzRnJvbUZpbGVMaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLHN0ZDo6c3RyaW5nPiA+ICZyZW1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN0cmluZ1JlZj4gcmVtYXBGaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNDb25zdW1lciAqRGlhZ0NsaWVudCkgeworICBib29sIGhhc0Vycm9yT2NjdXJyZWQgPSBmYWxzZTsKKworICBGaWxlU3lzdGVtT3B0aW9ucyBGU09wdHM7CisgIEZpbGVNYW5hZ2VyIEZpbGVNZ3IoRlNPcHRzKTsKKyAgUmVtYXBGaWxlUGFyc2VyIFBhcnNlcihGaWxlTWdyKTsKKworICBJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY0lEcz4gRGlhZ0lEKG5ldyBEaWFnbm9zdGljSURzKCkpOworICBJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY3NFbmdpbmU+IERpYWdzKAorICAgICAgbmV3IERpYWdub3N0aWNzRW5naW5lKERpYWdJRCwgbmV3IERpYWdub3N0aWNPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdDbGllbnQsIC8qU2hvdWxkT3duQ2xpZW50PSovZmFsc2UpKTsKKworICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpbGVFbnRyeSAqLCBzdGQ6OnZlY3RvcjxFZGl0RW50cnk+ID4KKyAgICAgIEZpbGVFZGl0RW50cmllc1R5OworICBGaWxlRWRpdEVudHJpZXNUeSBGaWxlRWRpdEVudHJpZXM7CisKKyAgbGx2bTo6RGVuc2VTZXQ8RWRpdEVudHJ5PiBFbnRyaWVzU2V0OworCisgIGZvciAoQXJyYXlSZWY8U3RyaW5nUmVmPjo6aXRlcmF0b3IKKyAgICAgICAgIEkgPSByZW1hcEZpbGVzLmJlZ2luKCksIEUgPSByZW1hcEZpbGVzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIFNtYWxsVmVjdG9yPEVkaXRFbnRyeSwgMTY+IEVudHJpZXM7CisgICAgaWYgKFBhcnNlci5wYXJzZSgqSSwgRW50cmllcykpCisgICAgICBjb250aW51ZTsKKworICAgIGZvciAoU21hbGxWZWN0b3JJbXBsPEVkaXRFbnRyeT46Oml0ZXJhdG9yCisgICAgICAgICAgIEVJID0gRW50cmllcy5iZWdpbigpLCBFRSA9IEVudHJpZXMuZW5kKCk7IEVJICE9IEVFOyArK0VJKSB7CisgICAgICBFZGl0RW50cnkgJkVudHJ5ID0gKkVJOworICAgICAgaWYgKCFFbnRyeS5GaWxlKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIHN0ZDo6cGFpcjxsbHZtOjpEZW5zZVNldDxFZGl0RW50cnk+OjppdGVyYXRvciwgYm9vbD4KKyAgICAgICAgSW5zZXJ0ID0gRW50cmllc1NldC5pbnNlcnQoRW50cnkpOworICAgICAgaWYgKCFJbnNlcnQuc2Vjb25kKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgRmlsZUVkaXRFbnRyaWVzW0VudHJ5LkZpbGVdLnB1c2hfYmFjayhFbnRyeSk7CisgICAgfQorICB9CisKKyAgZm9yIChGaWxlRWRpdEVudHJpZXNUeTo6aXRlcmF0b3IKKyAgICAgICAgIEkgPSBGaWxlRWRpdEVudHJpZXMuYmVnaW4oKSwgRSA9IEZpbGVFZGl0RW50cmllcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBzdGQ6OnN0cmluZyBUZW1wRmlsZSA9IGFwcGx5RWRpdHNUb1RlbXAoSS0+Zmlyc3QsIEktPnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU1nciwgKkRpYWdzKTsKKyAgICBpZiAoVGVtcEZpbGUuZW1wdHkoKSkgeworICAgICAgaGFzRXJyb3JPY2N1cnJlZCA9IHRydWU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICByZW1hcC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoSS0+Zmlyc3QtPmdldE5hbWUoKSwgVGVtcEZpbGUpKTsKKyAgfQorCisgIHJldHVybiBoYXNFcnJvck9jY3VycmVkOworfQpkaWZmIC0tZ2l0IGEvbGliL0FSQ01pZ3JhdGUvUGxpc3RSZXBvcnRlci5jcHAgYi9saWIvQVJDTWlncmF0ZS9QbGlzdFJlcG9ydGVyLmNwcAppbmRleCAxNDRiYTJlLi4yNjMyNDE3IDEwMDY0NAotLS0gYS9saWIvQVJDTWlncmF0ZS9QbGlzdFJlcG9ydGVyLmNwcAorKysgYi9saWIvQVJDTWlncmF0ZS9QbGlzdFJlcG9ydGVyLmNwcApAQCAtOSw4NyArOSwxMiBAQAogCiAjaW5jbHVkZSAiSW50ZXJuYWxzLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRmlsZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9QbGlzdFN1cHBvcnQuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvTGV4L0xleGVyLmgiCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiB1c2luZyBuYW1lc3BhY2UgYXJjbXQ7Ci0KLS8vIEZJWE1FOiBUaGlzIGR1cGxpY2F0ZXMgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbGl0eSBmcm9tIFBsaXN0RGlhZ25vc3RpY3MuY3BwLAotLy8gaXQgd291bGQgYmUgam9sbHkgZ29vZCBpZiB0aGVyZSB3YXMgYSByZXVzYWJsZSBQbGlzdFdyaXRlciBvciBzb21ldGhpbmcuCi0KLXR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8RmlsZUlELCB1bnNpZ25lZD4gRklETWFwOwotCi1zdGF0aWMgdm9pZCBBZGRGSUQoRklETWFwICZGSURzLCBTbWFsbFZlY3RvckltcGw8RmlsZUlEPiAmViwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwgU291cmNlTG9jYXRpb24gTCkgewotCi0gIEZpbGVJRCBGSUQgPSBTTS5nZXRGaWxlSUQoU00uZ2V0RXhwYW5zaW9uTG9jKEwpKTsKLSAgRklETWFwOjppdGVyYXRvciBJID0gRklEcy5maW5kKEZJRCk7Ci0gIGlmIChJICE9IEZJRHMuZW5kKCkpIHJldHVybjsKLSAgRklEc1tGSURdID0gVi5zaXplKCk7Ci0gIFYucHVzaF9iYWNrKEZJRCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBHZXRGSUQoY29uc3QgRklETWFwJiBGSURzLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKLSAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCkgewotICBGaWxlSUQgRklEID0gU00uZ2V0RmlsZUlEKFNNLmdldEV4cGFuc2lvbkxvYyhMKSk7Ci0gIEZJRE1hcDo6Y29uc3RfaXRlcmF0b3IgSSA9IEZJRHMuZmluZChGSUQpOwotICBhc3NlcnQoSSAhPSBGSURzLmVuZCgpKTsKLSAgcmV0dXJuIEktPnNlY29uZDsKLX0KLQotc3RhdGljIHJhd19vc3RyZWFtJiBJbmRlbnQocmF3X29zdHJlYW0mIG8sIGNvbnN0IHVuc2lnbmVkIGluZGVudCkgewotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW5kZW50OyArK2kpIG8gPDwgJyAnOwotICByZXR1cm4gbzsKLX0KLQotc3RhdGljIHZvaWQgRW1pdExvY2F0aW9uKHJhd19vc3RyZWFtJiBvLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwgY29uc3QgRklETWFwICZGTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRlbnQsIGJvb2wgZXh0ZW5kID0gZmFsc2UpIHsKLQotICBGdWxsU291cmNlTG9jIExvYyhTTS5nZXRFeHBhbnNpb25Mb2MoTCksIGNvbnN0X2Nhc3Q8U291cmNlTWFuYWdlciY+KFNNKSk7Ci0KLSAgLy8gQWRkIGluIHRoZSBsZW5ndGggb2YgdGhlIHRva2VuLCBzbyB0aGF0IHdlIGNvdmVyIG11bHRpLWNoYXIgdG9rZW5zLgotICB1bnNpZ25lZCBvZmZzZXQgPQotICAgIGV4dGVuZCA/IExleGVyOjpNZWFzdXJlVG9rZW5MZW5ndGgoTG9jLCBTTSwgTGFuZ09wdHMpIC0gMSA6IDA7Ci0KLSAgSW5kZW50KG8sIGluZGVudCkgPDwgIjxkaWN0PlxuIjsKLSAgSW5kZW50KG8sIGluZGVudCkgPDwgIiA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4iCi0gICAgICAgICAgICAgICAgICAgIDw8IExvYy5nZXRFeHBhbnNpb25MaW5lTnVtYmVyKCkgPDwgIjwvaW50ZWdlcj5cbiI7Ci0gIEluZGVudChvLCBpbmRlbnQpIDw8ICIgPGtleT5jb2w8L2tleT48aW50ZWdlcj4iCi0gICAgICAgICAgICAgICAgICAgIDw8IExvYy5nZXRFeHBhbnNpb25Db2x1bW5OdW1iZXIoKSArIG9mZnNldCA8PCAiPC9pbnRlZ2VyPlxuIjsKLSAgSW5kZW50KG8sIGluZGVudCkgPDwgIiA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4iCi0gICAgICAgICAgICAgICAgICAgIDw8IEdldEZJRChGTSwgU00sIExvYykgPDwgIjwvaW50ZWdlcj5cbiI7Ci0gIEluZGVudChvLCBpbmRlbnQpIDw8ICI8L2RpY3Q+XG4iOwotfQotCi1zdGF0aWMgdm9pZCBFbWl0UmFuZ2UocmF3X29zdHJlYW0mIG8sIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICBDaGFyU291cmNlUmFuZ2UgUiwgY29uc3QgRklETWFwICZGTSwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRlbnQpIHsKLSAgSW5kZW50KG8sIGluZGVudCkgPDwgIjxhcnJheT5cbiI7Ci0gIEVtaXRMb2NhdGlvbihvLCBTTSwgTGFuZ09wdHMsIFIuZ2V0QmVnaW4oKSwgRk0sIGluZGVudCsxKTsKLSAgRW1pdExvY2F0aW9uKG8sIFNNLCBMYW5nT3B0cywgUi5nZXRFbmQoKSwgRk0sIGluZGVudCsxLCBSLmlzVG9rZW5SYW5nZSgpKTsKLSAgSW5kZW50KG8sIGluZGVudCkgPDwgIjwvYXJyYXk+XG4iOwotfQotCi1zdGF0aWMgcmF3X29zdHJlYW0mIEVtaXRTdHJpbmcocmF3X29zdHJlYW0mIG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIHMpIHsKLSAgbyA8PCAiPHN0cmluZz4iOwotICBmb3IgKFN0cmluZ1JlZjo6Y29uc3RfaXRlcmF0b3IgST1zLmJlZ2luKCksIEU9cy5lbmQoKTsgSSE9RTsgKytJKSB7Ci0gICAgY2hhciBjID0gKkk7Ci0gICAgc3dpdGNoIChjKSB7Ci0gICAgZGVmYXVsdDogICBvIDw8IGM7IGJyZWFrOwotICAgIGNhc2UgJyYnOiAgbyA8PCAiJmFtcDsiOyBicmVhazsKLSAgICBjYXNlICc8JzogIG8gPDwgIiZsdDsiOyBicmVhazsKLSAgICBjYXNlICc+JzogIG8gPDwgIiZndDsiOyBicmVhazsKLSAgICBjYXNlICdcJyc6IG8gPDwgIiZhcG9zOyI7IGJyZWFrOwotICAgIGNhc2UgJ1wiJzogbyA8PCAiJnF1b3Q7IjsgYnJlYWs7Ci0gICAgfQotICB9Ci0gIG8gPDwgIjwvc3RyaW5nPiI7Ci0gIHJldHVybiBvOwotfQordXNpbmcgbmFtZXNwYWNlIG1hcmt1cDsKIAogdm9pZCBhcmNtdDo6d3JpdGVBUkNEaWFnc1RvUGxpc3QoY29uc3Qgc3RkOjpzdHJpbmcgJm91dFBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdG9yZWREaWFnbm9zdGljPiBkaWFncywKQEAgLTExNiwxNyArNDEsMTQgQEAKICAgfQogCiAgIHN0ZDo6c3RyaW5nIGVyck1zZzsKLSAgbGx2bTo6cmF3X2ZkX29zdHJlYW0gbyhvdXRQYXRoLmNfc3RyKCksIGVyck1zZyk7CisgIGxsdm06OnJhd19mZF9vc3RyZWFtIG8ob3V0UGF0aC5jX3N0cigpLCBlcnJNc2csIGxsdm06OnN5czo6ZnM6OkZfVGV4dCk7CiAgIGlmICghZXJyTXNnLmVtcHR5KCkpIHsKICAgICBsbHZtOjplcnJzKCkgPDwgImVycm9yOiBjb3VsZCBub3QgY3JlYXRlIGZpbGU6ICIgPDwgb3V0UGF0aCA8PCAnXG4nOwogICAgIHJldHVybjsKICAgfQogCiAgIC8vIFdyaXRlIHRoZSBwbGlzdCBoZWFkZXIuCi0gIG8gPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIgotICAiPCFET0NUWVBFIHBsaXN0IFBVQkxJQyBcIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTlwiICIKLSAgIlwiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZFwiPlxuIgotICAiPHBsaXN0IHZlcnNpb249XCIxLjBcIj5cbiI7CisgIG8gPDwgUGxpc3RIZWFkZXI7CiAKICAgLy8gV3JpdGUgdGhlIHJvb3Qgb2JqZWN0OiBhIDxkaWN0PiBjb250YWluaW5nLi4uCiAgIC8vICAtICJmaWxlcyIsIGFuIDxhcnJheT4gbWFwcGluZyBmcm9tIEZJRHMgdG8gZmlsZSBuYW1lcwpkaWZmIC0tZ2l0IGEvbGliL0FSQ01pZ3JhdGUvVHJhbnNBUElVc2VzLmNwcCBiL2xpYi9BUkNNaWdyYXRlL1RyYW5zQVBJVXNlcy5jcHAKaW5kZXggYTA5OTRhNi4uNTQ0Y2IwYSAxMDA2NDQKLS0tIGEvbGliL0FSQ01pZ3JhdGUvVHJhbnNBUElVc2VzLmNwcAorKysgYi9saWIvQVJDTWlncmF0ZS9UcmFuc0FQSVVzZXMuY3BwCkBAIC02Niw4ICs2Niw3IEBACiAgICAgICAgIHNlbE5hbWUgPSAiZ2V0QXJndW1lbnQiOwogICAgICAgZWxzZSBpZiAoRS0+Z2V0U2VsZWN0b3IoKSA9PSBzZXRBcmd1bWVudFNlbCkKICAgICAgICAgc2VsTmFtZSA9ICJzZXRBcmd1bWVudCI7Ci0KLSAgICAgIGlmIChzZWxOYW1lLmVtcHR5KCkpCisgICAgICBlbHNlCiAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICBFeHByICpwYXJtID0gRS0+Z2V0QXJnKDApLT5JZ25vcmVQYXJlbkNhc3RzKCk7CkBAIC03NSwxMyArNzQsMTIgQEAKICAgICAgIGlmIChwb2ludGVlLmlzTnVsbCgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgICAgaWYgKHBvaW50ZWUuZ2V0T2JqQ0xpZmV0aW1lKCkgPiBRdWFsaWZpZXJzOjpPQ0xfRXhwbGljaXROb25lKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGVyciA9ICJOU0ludm9jYXRpb24ncyAiOwotICAgICAgICBlcnIgKz0gc2VsTmFtZTsKLSAgICAgICAgZXJyICs9ICIgaXMgbm90IHNhZmUgdG8gYmUgdXNlZCB3aXRoIGFuIG9iamVjdCB3aXRoIG93bmVyc2hpcCBvdGhlciAiCi0gICAgICAgICAgICAidGhhbiBfX3Vuc2FmZV91bnJldGFpbmVkIjsKLSAgICAgICAgUGFzcy5UQS5yZXBvcnRFcnJvcihlcnIsIHBhcm0tPmdldExvY1N0YXJ0KCksIHBhcm0tPmdldFNvdXJjZVJhbmdlKCkpOwotICAgICAgfQorICAgICAgaWYgKHBvaW50ZWUuZ2V0T2JqQ0xpZmV0aW1lKCkgPiBRdWFsaWZpZXJzOjpPQ0xfRXhwbGljaXROb25lKQorICAgICAgICBQYXNzLlRBLnJlcG9ydChwYXJtLT5nZXRMb2NTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfYXJjbXRfbnNpbnZvY2F0aW9uX293bmVyc2hpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFybS0+Z2V0U291cmNlUmFuZ2UoKSkKKyAgICAgICAgICAgIDw8IHNlbE5hbWU7CisKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL0FSQ01pZ3JhdGUvVHJhbnNCbG9ja09iakNWYXJpYWJsZS5jcHAgYi9saWIvQVJDTWlncmF0ZS9UcmFuc0Jsb2NrT2JqQ1ZhcmlhYmxlLmNwcAppbmRleCA5N2M0ZTM0Li5mYWM2YTg0IDEwMDY0NAotLS0gYS9saWIvQVJDTWlncmF0ZS9UcmFuc0Jsb2NrT2JqQ1ZhcmlhYmxlLmNwcAorKysgYi9saWIvQVJDTWlncmF0ZS9UcmFuc0Jsb2NrT2JqQ1ZhcmlhYmxlLmNwcApAQCAtNzgsMTAgKzc4LDkgQEAKICAgYm9vbCBWaXNpdEJsb2NrRGVjbChCbG9ja0RlY2wgKmJsb2NrKSB7CiAgICAgU21hbGxWZWN0b3I8VmFyRGVjbCAqLCA0PiBCbG9ja1ZhcnM7CiAgICAgCi0gICAgZm9yIChCbG9ja0RlY2w6OmNhcHR1cmVfaXRlcmF0b3IKLSAgICAgICAgICAgSSA9IGJsb2NrLT5jYXB0dXJlX2JlZ2luKCksIEUgPSBibG9jay0+Y2FwdHVyZV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIFZhckRlY2wgKnZhciA9IEktPmdldFZhcmlhYmxlKCk7Ci0gICAgICBpZiAoSS0+aXNCeVJlZigpICYmCisgICAgZm9yIChjb25zdCBhdXRvICZJIDogYmxvY2stPmNhcHR1cmVzKCkpIHsKKyAgICAgIFZhckRlY2wgKnZhciA9IEkuZ2V0VmFyaWFibGUoKTsKKyAgICAgIGlmIChJLmlzQnlSZWYoKSAmJgogICAgICAgICAgIHZhci0+Z2V0VHlwZSgpLT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpICYmCiAgICAgICAgICAgaXNJbXBsaWNpdFN0cm9uZyh2YXItPmdldFR5cGUoKSkpIHsKICAgICAgICAgQmxvY2tWYXJzLnB1c2hfYmFjayh2YXIpOwpkaWZmIC0tZ2l0IGEvbGliL0FSQ01pZ3JhdGUvVHJhbnNFbXB0eVN0YXRlbWVudHNBbmREZWFsbG9jLmNwcCBiL2xpYi9BUkNNaWdyYXRlL1RyYW5zRW1wdHlTdGF0ZW1lbnRzQW5kRGVhbGxvYy5jcHAKaW5kZXggZmZiNjM4Zi4uMzFmMTljZSAxMDA2NDQKLS0tIGEvbGliL0FSQ01pZ3JhdGUvVHJhbnNFbXB0eVN0YXRlbWVudHNBbmREZWFsbG9jLmNwcAorKysgYi9saWIvQVJDTWlncmF0ZS9UcmFuc0VtcHR5U3RhdGVtZW50c0FuZERlYWxsb2MuY3BwCkBAIC04OSw5ICs4OSw4IEBACiAgIGJvb2wgVmlzaXRDb21wb3VuZFN0bXQoQ29tcG91bmRTdG10ICpTKSB7CiAgICAgaWYgKFMtPmJvZHlfZW1wdHkoKSkKICAgICAgIHJldHVybiBmYWxzZTsgLy8gd2FzIGFscmVhZHkgZW1wdHksIG5vdCBiZWNhdXNlIG9mIHRyYW5zZm9ybWF0aW9ucy4KLSAgICBmb3IgKENvbXBvdW5kU3RtdDo6Ym9keV9pdGVyYXRvcgotICAgICAgICAgICBJID0gUy0+Ym9keV9iZWdpbigpLCBFID0gUy0+Ym9keV9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgICBpZiAoIVZpc2l0KCpJKSkKKyAgICBmb3IgKGF1dG8gKkkgOiBTLT5ib2R5KCkpCisgICAgICBpZiAoIVZpc2l0KEkpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTE2Nyw5ICsxNjYsOCBAQAogICB9CiAKICAgYm9vbCBWaXNpdENvbXBvdW5kU3RtdChDb21wb3VuZFN0bXQgKlMpIHsKLSAgICBmb3IgKENvbXBvdW5kU3RtdDo6Ym9keV9pdGVyYXRvcgotICAgICAgICAgICBJID0gUy0+Ym9keV9iZWdpbigpLCBFID0gUy0+Ym9keV9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgICBjaGVjaygqSSk7CisgICAgZm9yIChhdXRvICpJIDogUy0+Ym9keSgpKQorICAgICAgY2hlY2soSSk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIApAQCAtMTg5LDkgKzE4Nyw4IEBACiAKIHN0YXRpYyBib29sIGlzQm9keUVtcHR5KENvbXBvdW5kU3RtdCAqYm9keSwgQVNUQ29udGV4dCAmQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U291cmNlTG9jYXRpb24+ICZNYWNyb0xvY3MpIHsKLSAgZm9yIChDb21wb3VuZFN0bXQ6OmJvZHlfaXRlcmF0b3IKLSAgICAgICAgIEkgPSBib2R5LT5ib2R5X2JlZ2luKCksIEUgPSBib2R5LT5ib2R5X2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBpZiAoIUVtcHR5Q2hlY2tlcihDdHgsIE1hY3JvTG9jcykuVmlzaXQoKkkpKQorICBmb3IgKGF1dG8gKkkgOiBib2R5LT5ib2R5KCkpCisgICAgaWYgKCFFbXB0eUNoZWNrZXIoQ3R4LCBNYWNyb0xvY3MpLlZpc2l0KEkpKQogICAgICAgcmV0dXJuIGZhbHNlOwogCiAgIHJldHVybiB0cnVlOwpAQCAtMjEwLDEwICsyMDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgRSA9IGltcGxfaXRlcmF0b3IoREMtPmRlY2xzX2VuZCgpKTsgSSAhPSBFOyArK0kpIHsKICAgICBPYmpDTWV0aG9kRGVjbCAqRGVhbGxvY00gPSAwOwogICAgIE9iakNNZXRob2REZWNsICpGaW5hbGl6ZU0gPSAwOwotICAgIGZvciAoT2JqQ0ltcGxlbWVudGF0aW9uRGVjbDo6aW5zdG1ldGhfaXRlcmF0b3IKLSAgICAgICAgICAgTUkgPSBJLT5pbnN0bWV0aF9iZWdpbigpLAotICAgICAgICAgICBNRSA9IEktPmluc3RtZXRoX2VuZCgpOyBNSSAhPSBNRTsgKytNSSkgewotICAgICAgT2JqQ01ldGhvZERlY2wgKk1EID0gKk1JOworICAgIGZvciAoYXV0byAqTUQgOiBJLT5pbnN0YW5jZV9tZXRob2RzKCkpIHsKICAgICAgIGlmICghTUQtPmhhc0JvZHkoKSkKICAgICAgICAgY29udGludWU7CiAgIApkaWZmIC0tZ2l0IGEvbGliL0FSQ01pZ3JhdGUvVHJhbnNHQ0F0dHJzLmNwcCBiL2xpYi9BUkNNaWdyYXRlL1RyYW5zR0NBdHRycy5jcHAKaW5kZXggZDhiZTFhZS4uY2JiM2QxMiAxMDA2NDQKLS0tIGEvbGliL0FSQ01pZ3JhdGUvVHJhbnNHQ0F0dHJzLmNwcAorKysgYi9saWIvQVJDTWlncmF0ZS9UcmFuc0dDQXR0cnMuY3BwCkBAIC0xMzQsOCArMTM0LDcgQEAKICAgICAgIHJldHVybiBoYXNPYmpDSW1wbChDb250RCk7CiAKICAgICBpZiAoQ1hYUmVjb3JkRGVjbCAqUkQgPSBkeW5fY2FzdDxDWFhSZWNvcmREZWNsPihEKSkgewotICAgICAgZm9yIChDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IKLSAgICAgICAgICAgICBNSSA9IFJELT5tZXRob2RfYmVnaW4oKSwgTUUgPSBSRC0+bWV0aG9kX2VuZCgpOyBNSSAhPSBNRTsgKytNSSkgeworICAgICAgZm9yIChjb25zdCBhdXRvICpNSSA6IFJELT5tZXRob2RzKCkpIHsKICAgICAgICAgaWYgKE1JLT5pc091dE9mTGluZSgpKQogICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQpAQCAtMTY0LDggKzE2Myw3IEBACiAgICAgaWYgKCFEKQogICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgZm9yIChEZWNsOjpyZWRlY2xfaXRlcmF0b3IKLSAgICAgICAgICAgSSA9IEQtPnJlZGVjbHNfYmVnaW4oKSwgRSA9IEQtPnJlZGVjbHNfZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIGZvciAoYXV0byBJIDogRC0+cmVkZWNscygpKQogICAgICAgaWYgKCFpc0luTWFpbkZpbGUoSS0+Z2V0TG9jYXRpb24oKSkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAKZGlmZiAtLWdpdCBhL2xpYi9BUkNNaWdyYXRlL1RyYW5zR0NDYWxscy5jcHAgYi9saWIvQVJDTWlncmF0ZS9UcmFuc0dDQ2FsbHMuY3BwCmluZGV4IDI0OWYyMGYuLjQwMWU3ODggMTAwNjQ0Ci0tLSBhL2xpYi9BUkNNaWdyYXRlL1RyYW5zR0NDYWxscy5jcHAKKysrIGIvbGliL0FSQ01pZ3JhdGUvVHJhbnNHQ0NhbGxzLmNwcApAQCAtMzgsMTQgKzM4LDggQEAKICAgICBUcmFuc2Zvcm1BY3Rpb25zICZUQSA9IE1pZ3JhdGVDdHguUGFzcy5UQTsKIAogICAgIGlmIChNaWdyYXRlQ3R4LmlzR0NPd25lZE5vbk9iakMoRS0+Z2V0VHlwZSgpKSkgewotICAgICAgaWYgKE1pZ3JhdGVDdHguUGFzcy5ub05TQWxsb2NSZWFsbG9jRXJyb3IoKSkKLSAgICAgICAgVEEucmVwb3J0V2FybmluZygiY2FsbCByZXR1cm5zIHBvaW50ZXIgdG8gR0MgbWFuYWdlZCBtZW1vcnk7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgIml0IHdpbGwgYmVjb21lIHVubWFuYWdlZCBpbiBBUkMiLAotICAgICAgICAgICAgICAgICAgICAgICBFLT5nZXRMb2NTdGFydCgpLCBFLT5nZXRTb3VyY2VSYW5nZSgpKTsKLSAgICAgIGVsc2UgCi0gICAgICAgIFRBLnJlcG9ydEVycm9yKCJjYWxsIHJldHVybnMgcG9pbnRlciB0byBHQyBtYW5hZ2VkIG1lbW9yeTsgIgotICAgICAgICAgICAgICAgICAgICAgICAiaXQgd2lsbCBiZWNvbWUgdW5tYW5hZ2VkIGluIEFSQyIsCi0gICAgICAgICAgICAgICAgICAgICAgIEUtPmdldExvY1N0YXJ0KCksIEUtPmdldFNvdXJjZVJhbmdlKCkpOworICAgICAgVEEucmVwb3J0KEUtPmdldExvY1N0YXJ0KCksIGRpYWc6OmVycl9hcmNtdF9uc2FsbG9jX3JlYWxsb2MsCisgICAgICAgICAgICAgICAgRS0+Z2V0U291cmNlUmFuZ2UoKSk7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9BUkNNaWdyYXRlL1RyYW5zUHJvcGVydGllcy5jcHAgYi9saWIvQVJDTWlncmF0ZS9UcmFuc1Byb3BlcnRpZXMuY3BwCmluZGV4IGI2ZGRjNDMuLmUxOGRhOTcgMTAwNjQ0Ci0tLSBhL2xpYi9BUkNNaWdyYXRlL1RyYW5zUHJvcGVydGllcy5jcHAKKysrIGIvbGliL0FSQ01pZ3JhdGUvVHJhbnNQcm9wZXJ0aWVzLmNwcApAQCAtNzUsMTcgKzc1LDE1IEBACiAKICAgc3RhdGljIHZvaWQgY29sbGVjdFByb3BlcnRpZXMoT2JqQ0NvbnRhaW5lckRlY2wgKkQsIEF0UHJvcERlY2xzVHkgJkF0UHJvcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0UHJvcERlY2xzVHkgKlByZXZBdFByb3BzID0gMCkgewotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnByb3BfaXRlcmF0b3IKLSAgICAgICAgICAgcHJvcEkgPSBELT5wcm9wX2JlZ2luKCksCi0gICAgICAgICAgIHByb3BFID0gRC0+cHJvcF9lbmQoKTsgcHJvcEkgIT0gcHJvcEU7ICsrcHJvcEkpIHsKLSAgICAgIGlmIChwcm9wSS0+Z2V0QXRMb2MoKS5pc0ludmFsaWQoKSkKKyAgICBmb3IgKGF1dG8gKlByb3AgOiBELT5wcm9wZXJ0aWVzKCkpIHsKKyAgICAgIGlmIChQcm9wLT5nZXRBdExvYygpLmlzSW52YWxpZCgpKQogICAgICAgICBjb250aW51ZTsKLSAgICAgIHVuc2lnbmVkIFJhd0xvYyA9IHByb3BJLT5nZXRBdExvYygpLmdldFJhd0VuY29kaW5nKCk7CisgICAgICB1bnNpZ25lZCBSYXdMb2MgPSBQcm9wLT5nZXRBdExvYygpLmdldFJhd0VuY29kaW5nKCk7CiAgICAgICBpZiAoUHJldkF0UHJvcHMpCiAgICAgICAgIGlmIChQcmV2QXRQcm9wcy0+ZmluZChSYXdMb2MpICE9IFByZXZBdFByb3BzLT5lbmQoKSkKICAgICAgICAgICBjb250aW51ZTsKICAgICAgIFByb3BzVHkgJnByb3BzID0gQXRQcm9wc1tSYXdMb2NdOwotICAgICAgcHJvcHMucHVzaF9iYWNrKCpwcm9wSSk7CisgICAgICBwcm9wcy5wdXNoX2JhY2soUHJvcCk7CiAgICAgfQogICB9CiAKQEAgLTE0MSwxMiArMTM5LDggQEAKIAogICAgIEF0UHJvcERlY2xzVHkgQXRFeHRQcm9wczsKICAgICAvLyBMb29rIHRocm91Z2ggZXh0ZW5zaW9ucy4KLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjp2aXNpYmxlX2V4dGVuc2lvbnNfaXRlcmF0b3IKLSAgICAgICAgICAgZXh0ID0gaWZhY2UtPnZpc2libGVfZXh0ZW5zaW9uc19iZWdpbigpLAotICAgICAgICAgICBleHRFbmQgPSBpZmFjZS0+dmlzaWJsZV9leHRlbnNpb25zX2VuZCgpOwotICAgICAgICAgZXh0ICE9IGV4dEVuZDsgKytleHQpIHsKLSAgICAgIGNvbGxlY3RQcm9wZXJ0aWVzKCpleHQsIEF0RXh0UHJvcHMsICZBdFByb3BzKTsKLSAgICB9CisgICAgZm9yIChhdXRvICpFeHQgOiBpZmFjZS0+dmlzaWJsZV9leHRlbnNpb25zKCkpCisgICAgICBjb2xsZWN0UHJvcGVydGllcyhFeHQsIEF0RXh0UHJvcHMsICZBdFByb3BzKTsKIAogICAgIGZvciAoQXRQcm9wRGVjbHNUeTo6aXRlcmF0b3IKICAgICAgICAgICAgSSA9IEF0RXh0UHJvcHMuYmVnaW4oKSwgRSA9IEF0RXh0UHJvcHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CkBAIC0zNTMsMTQgKzM0Nyw2IEBACiAgICAgcmV0dXJuIGZhbHNlOyAgICAKICAgfQogCi0gIGJvb2wgaGFzQWxsSXZhcnNCYWNrZWQoUHJvcHNUeSAmcHJvcHMpIGNvbnN0IHsKLSAgICBmb3IgKFByb3BzVHk6Oml0ZXJhdG9yIEkgPSBwcm9wcy5iZWdpbigpLCBFID0gcHJvcHMuZW5kKCk7IEkgIT0gRTsgKytJKQotICAgICAgaWYgKCFpc1VzZXJEZWNsYXJlZChJLT5JdmFyRCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KICAgLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBhbGwgZGVjbGFyYXRpb25zIGluIHRoZSBAcHJvcGVydHkgaGF2ZSBHQyBfX3dlYWsuCiAgIGJvb2wgaGFzR0NXZWFrKFByb3BzVHkgJnByb3BzLCBTb3VyY2VMb2NhdGlvbiBhdExvYykgY29uc3QgewogICAgIGlmICghUGFzcy5pc0dDTWlncmF0aW9uKCkpCmRpZmYgLS1naXQgYS9saWIvQVJDTWlncmF0ZS9UcmFuc1JldGFpblJlbGVhc2VEZWFsbG9jLmNwcCBiL2xpYi9BUkNNaWdyYXRlL1RyYW5zUmV0YWluUmVsZWFzZURlYWxsb2MuY3BwCmluZGV4IDQ0NmEyODQuLjVkYjVmYTAgMTAwNjQ0Ci0tLSBhL2xpYi9BUkNNaWdyYXRlL1RyYW5zUmV0YWluUmVsZWFzZURlYWxsb2MuY3BwCisrKyBiL2xpYi9BUkNNaWdyYXRlL1RyYW5zUmV0YWluUmVsZWFzZURlYWxsb2MuY3BwCkBAIC0zOCw3ICszOCw3IEBACiAgIE1pZ3JhdGlvblBhc3MgJlBhc3M7CiAKICAgRXhwclNldCBSZW1vdmFibGVzOwotICBPd25pbmdQdHI8UGFyZW50TWFwPiBTdG10TWFwOworICBzdGQ6OnVuaXF1ZV9wdHI8UGFyZW50TWFwPiBTdG10TWFwOwogCiAgIFNlbGVjdG9yIERlbGVnYXRlU2VsLCBGaW5hbGl6ZVNlbDsKIApAQCAtMjEyLDcgKzIxMiw3IEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBTdG10ICpwcmV2U3RtdCwgKm5leHRTdG10OwotICAgIGxsdm06OnRpZShwcmV2U3RtdCwgbmV4dFN0bXQpID0gZ2V0UHJldmlvdXNBbmROZXh0U3RtdChFKTsKKyAgICBzdGQ6OnRpZShwcmV2U3RtdCwgbmV4dFN0bXQpID0gZ2V0UHJldmlvdXNBbmROZXh0U3RtdChFKTsKIAogICAgIHJldHVybiBpc1BsdXNPbmVBc3NpZ25Ub1ZhcihwcmV2U3RtdCwgUmVmRCkgfHwKICAgICAgICAgICAgaXNQbHVzT25lQXNzaWduVG9WYXIobmV4dFN0bXQsIFJlZkQpOwpkaWZmIC0tZ2l0IGEvbGliL0FSQ01pZ3JhdGUvVHJhbnNVbmJyaWRnZWRDYXN0cy5jcHAgYi9saWIvQVJDTWlncmF0ZS9UcmFuc1VuYnJpZGdlZENhc3RzLmNwcAppbmRleCA3YjM2MGM2Li4wYWEwYzg5IDEwMDY0NAotLS0gYS9saWIvQVJDTWlncmF0ZS9UcmFuc1VuYnJpZGdlZENhc3RzLmNwcAorKysgYi9saWIvQVJDTWlncmF0ZS9UcmFuc1VuYnJpZGdlZENhc3RzLmNwcApAQCAtNjAsMTAgKzYwLDEwIEBACiBjbGFzcyBVbmJyaWRnZWRDYXN0UmV3cml0ZXIgOiBwdWJsaWMgUmVjdXJzaXZlQVNUVmlzaXRvcjxVbmJyaWRnZWRDYXN0UmV3cml0ZXI+ewogICBNaWdyYXRpb25QYXNzICZQYXNzOwogICBJZGVudGlmaWVySW5mbyAqU2VsZklJOwotICBPd25pbmdQdHI8UGFyZW50TWFwPiBTdG10TWFwOworICBzdGQ6OnVuaXF1ZV9wdHI8UGFyZW50TWFwPiBTdG10TWFwOwogICBEZWNsICpQYXJlbnREOwogICBTdG10ICpCb2R5OwotICBtdXRhYmxlIE93bmluZ1B0cjxFeHByU2V0PiBSZW1vdmFibGVzOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxFeHByU2V0PiBSZW1vdmFibGVzOwogCiBwdWJsaWM6CiAgIFVuYnJpZGdlZENhc3RSZXdyaXRlcihNaWdyYXRpb25QYXNzICZwYXNzKSA6IFBhc3MocGFzcyksIFBhcmVudEQoMCksIEJvZHkoMCkgewpAQCAtMTMzLDExICsxMzMsMTEgQEAKICAgICBFeHByICppbm5lciA9IEUtPklnbm9yZVBhcmVuQ2FzdHMoKTsKICAgICBpZiAoQ2FsbEV4cHIgKmNhbGxFID0gZHluX2Nhc3Q8Q2FsbEV4cHI+KGlubmVyKSkgewogICAgICAgaWYgKEZ1bmN0aW9uRGVjbCAqRkQgPSBjYWxsRS0+Z2V0RGlyZWN0Q2FsbGVlKCkpIHsKLSAgICAgICAgaWYgKEZELT5nZXRBdHRyPENGUmV0dXJuc1JldGFpbmVkQXR0cj4oKSkgeworICAgICAgICBpZiAoRkQtPmhhc0F0dHI8Q0ZSZXR1cm5zUmV0YWluZWRBdHRyPigpKSB7CiAgICAgICAgICAgY2FzdFRvT2JqQ09iamVjdChFLCAvKnJldGFpbmVkPSovdHJ1ZSk7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGlmIChGRC0+Z2V0QXR0cjxDRlJldHVybnNOb3RSZXRhaW5lZEF0dHI+KCkpIHsKKyAgICAgICAgaWYgKEZELT5oYXNBdHRyPENGUmV0dXJuc05vdFJldGFpbmVkQXR0cj4oKSkgewogICAgICAgICAgIGNhc3RUb09iakNPYmplY3QoRSwgLypyZXRhaW5lZD0qL2ZhbHNlKTsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTI4Myw3ICsyODMsNyBAQAogICAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IEUtPmdldEV4cHJMb2MoKTsKICAgICBhc3NlcnQoTG9jLmlzTWFjcm9JRCgpKTsKICAgICBTb3VyY2VMb2NhdGlvbiBNYWNyb0JlZ2luLCBNYWNyb0VuZDsKLSAgICBsbHZtOjp0aWUoTWFjcm9CZWdpbiwgTWFjcm9FbmQpID0gU00uZ2V0SW1tZWRpYXRlRXhwYW5zaW9uUmFuZ2UoTG9jKTsKKyAgICBzdGQ6OnRpZShNYWNyb0JlZ2luLCBNYWNyb0VuZCkgPSBTTS5nZXRJbW1lZGlhdGVFeHBhbnNpb25SYW5nZShMb2MpOwogICAgIFNvdXJjZVJhbmdlIFN1YlJhbmdlID0gRS0+Z2V0U3ViRXhwcigpLT5JZ25vcmVQYXJlbkltcENhc3RzKCktPmdldFNvdXJjZVJhbmdlKCk7CiAgICAgU291cmNlTG9jYXRpb24gSW5uZXJCZWdpbiA9IFNNLmdldEltbWVkaWF0ZU1hY3JvQ2FsbGVyTG9jKFN1YlJhbmdlLmdldEJlZ2luKCkpOwogICAgIFNvdXJjZUxvY2F0aW9uIElubmVyRW5kID0gU00uZ2V0SW1tZWRpYXRlTWFjcm9DYWxsZXJMb2MoU3ViUmFuZ2UuZ2V0RW5kKCkpOwpAQCAtNDM5LDcgKzQzOSw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGkgPCBjYWxsRS0+Z2V0TnVtQXJncygpICYmIGkgPCBGRC0+Z2V0TnVtUGFyYW1zKCkpIHsKICAgICAgICAgICBQYXJtVmFyRGVjbCAqUEQgPSBGRC0+Z2V0UGFyYW1EZWNsKGkpOwotICAgICAgICAgIGlmIChQRC0+Z2V0QXR0cjxDRkNvbnN1bWVkQXR0cj4oKSkgeworICAgICAgICAgIGlmIChQRC0+aGFzQXR0cjxDRkNvbnN1bWVkQXR0cj4oKSkgewogICAgICAgICAgICAgaXNDb25zdW1lZCA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvQVJDTWlncmF0ZS9UcmFuc1plcm9PdXRQcm9wc0luRGVhbGxvYy5jcHAgYi9saWIvQVJDTWlncmF0ZS9UcmFuc1plcm9PdXRQcm9wc0luRGVhbGxvYy5jcHAKaW5kZXggNGQwODhlMC4uM2JlOWZiMiAxMDA2NDQKLS0tIGEvbGliL0FSQ01pZ3JhdGUvVHJhbnNaZXJvT3V0UHJvcHNJbkRlYWxsb2MuY3BwCisrKyBiL2xpYi9BUkNNaWdyYXRlL1RyYW5zWmVyb091dFByb3BzSW5EZWFsbG9jLmNwcApAQCAtMTEzLDIzICsxMTMsMjEgQEAKIAogICAgIC8vIEZvciBhICdkZWFsbG9jJyBtZXRob2QgdXNlLCBmaW5kIGFsbCBwcm9wZXJ0eSBpbXBsZW1lbnRhdGlvbnMgaW4KICAgICAvLyB0aGlzIGNsYXNzIGltcGxlbWVudGF0aW9uLgotICAgIGZvciAoT2JqQ0ltcGxEZWNsOjpwcm9waW1wbF9pdGVyYXRvcgotICAgICAgICAgICBJID0gSU1ELT5wcm9waW1wbF9iZWdpbigpLCBFSSA9IElNRC0+cHJvcGltcGxfZW5kKCk7IEkgIT0gRUk7ICsrSSkgewotICAgICAgICBPYmpDUHJvcGVydHlJbXBsRGVjbCAqUElEID0gKkk7Ci0gICAgICAgIGlmIChQSUQtPmdldFByb3BlcnR5SW1wbGVtZW50YXRpb24oKSA9PQotICAgICAgICAgICAgT2JqQ1Byb3BlcnR5SW1wbERlY2w6OlN5bnRoZXNpemUpIHsKLSAgICAgICAgICBPYmpDUHJvcGVydHlEZWNsICpQRCA9IFBJRC0+Z2V0UHJvcGVydHlEZWNsKCk7Ci0gICAgICAgICAgT2JqQ01ldGhvZERlY2wgKnNldHRlck0gPSBQRC0+Z2V0U2V0dGVyTWV0aG9kRGVjbCgpOwotICAgICAgICAgIGlmICghKHNldHRlck0gJiYgc2V0dGVyTS0+aXNEZWZpbmVkKCkpKSB7Ci0gICAgICAgICAgICBPYmpDUHJvcGVydHlEZWNsOjpQcm9wZXJ0eUF0dHJpYnV0ZUtpbmQgQXR0cktpbmQgPSAKLSAgICAgICAgICAgICAgUEQtPmdldFByb3BlcnR5QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICBpZiAoQXR0cktpbmQgJiAKLSAgICAgICAgICAgICAgICAgIChPYmpDUHJvcGVydHlEZWNsOjpPQkpDX1BSX3JldGFpbiB8IAotICAgICAgICAgICAgICAgICAgIE9iakNQcm9wZXJ0eURlY2w6Ok9CSkNfUFJfY29weSAgIHwKLSAgICAgICAgICAgICAgICAgICBPYmpDUHJvcGVydHlEZWNsOjpPQkpDX1BSX3N0cm9uZykpCi0gICAgICAgICAgICAgICAgU3ludGhlc2l6ZWRQcm9wZXJ0aWVzW1BEXSA9IFBJRDsKLSAgICAgICAgICB9CisgICAgZm9yIChhdXRvICpQSUQgOiBJTUQtPnByb3BlcnR5X2ltcGxzKCkpIHsKKyAgICAgIGlmIChQSUQtPmdldFByb3BlcnR5SW1wbGVtZW50YXRpb24oKSA9PQorICAgICAgICAgIE9iakNQcm9wZXJ0eUltcGxEZWNsOjpTeW50aGVzaXplKSB7CisgICAgICAgIE9iakNQcm9wZXJ0eURlY2wgKlBEID0gUElELT5nZXRQcm9wZXJ0eURlY2woKTsKKyAgICAgICAgT2JqQ01ldGhvZERlY2wgKnNldHRlck0gPSBQRC0+Z2V0U2V0dGVyTWV0aG9kRGVjbCgpOworICAgICAgICBpZiAoIShzZXR0ZXJNICYmIHNldHRlck0tPmlzRGVmaW5lZCgpKSkgeworICAgICAgICAgIE9iakNQcm9wZXJ0eURlY2w6OlByb3BlcnR5QXR0cmlidXRlS2luZCBBdHRyS2luZCA9IAorICAgICAgICAgICAgUEQtPmdldFByb3BlcnR5QXR0cmlidXRlcygpOworICAgICAgICAgICAgaWYgKEF0dHJLaW5kICYgCisgICAgICAgICAgICAgICAgKE9iakNQcm9wZXJ0eURlY2w6Ok9CSkNfUFJfcmV0YWluIHwgCisgICAgICAgICAgICAgICAgICBPYmpDUHJvcGVydHlEZWNsOjpPQkpDX1BSX2NvcHkgICB8CisgICAgICAgICAgICAgICAgICBPYmpDUHJvcGVydHlEZWNsOjpPQkpDX1BSX3N0cm9uZykpCisgICAgICAgICAgICAgIFN5bnRoZXNpemVkUHJvcGVydGllc1tQRF0gPSBQSUQ7CiAgICAgICAgIH0KKyAgICAgIH0KICAgICB9CiAKICAgICAvLyBOb3csIHJlbW92ZSBhbGwgemVyb2luZyBvZiBpdmFycyBldGMuCmRpZmYgLS1naXQgYS9saWIvQVJDTWlncmF0ZS9UcmFuc2Zvcm1BY3Rpb25zLmNwcCBiL2xpYi9BUkNNaWdyYXRlL1RyYW5zZm9ybUFjdGlvbnMuY3BwCmluZGV4IDJmZDA2MTkuLmU2MjY4YTEgMTAwNjQ0Ci0tLSBhL2xpYi9BUkNNaWdyYXRlL1RyYW5zZm9ybUFjdGlvbnMuY3BwCisrKyBiL2xpYi9BUkNNaWdyYXRlL1RyYW5zZm9ybUFjdGlvbnMuY3BwCkBAIC02NzMsNjAgKzY3MywzNSBAQAogICBzdGF0aWNfY2FzdDxUcmFuc2Zvcm1BY3Rpb25zSW1wbCo+KEltcGwpLT5hcHBseVJld3JpdGVzKHJlY2VpdmVyKTsKIH0KIAotdm9pZCBUcmFuc2Zvcm1BY3Rpb25zOjpyZXBvcnRFcnJvcihTdHJpbmdSZWYgZXJyb3IsIFNvdXJjZUxvY2F0aW9uIGxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgcmFuZ2UpIHsKLSAgYXNzZXJ0KCFzdGF0aWNfY2FzdDxUcmFuc2Zvcm1BY3Rpb25zSW1wbCo+KEltcGwpLT5pc0luVHJhbnNhY3Rpb24oKSAmJgorRGlhZ25vc3RpY0J1aWxkZXIgVHJhbnNmb3JtQWN0aW9uczo6cmVwb3J0KFNvdXJjZUxvY2F0aW9uIGxvYywgdW5zaWduZWQgZGlhZ0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIHJhbmdlKSB7CisgIGFzc2VydCghc3RhdGljX2Nhc3Q8VHJhbnNmb3JtQWN0aW9uc0ltcGwgKj4oSW1wbCktPmlzSW5UcmFuc2FjdGlvbigpICYmCiAgICAgICAgICAiRXJyb3JzIHNob3VsZCBiZSBlbWl0dGVkIG91dCBvZiBhIHRyYW5zYWN0aW9uIik7CiAKLSAgU291cmNlTWFuYWdlciAmU00gPSBzdGF0aWNfY2FzdDxUcmFuc2Zvcm1BY3Rpb25zSW1wbCo+KEltcGwpLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFTVENvbnRleHQoKS5nZXRTb3VyY2VNYW5hZ2VyKCk7Ci0gIGlmIChTTS5pc0luU3lzdGVtSGVhZGVyKFNNLmdldEV4cGFuc2lvbkxvYyhsb2MpKSkKLSAgICByZXR1cm47Ci0KLSAgLy8gRklYTUU6IFVzZSBhIGN1c3RvbSBjYXRlZ29yeSBuYW1lIHRvIGRpc3Rpbmd1aXNoIHJld3JpdGVyIGVycm9ycy4KLSAgc3RkOjpzdHJpbmcgcmV3cml0ZUVyciA9ICJbcmV3cml0ZXJdICI7Ci0gIHJld3JpdGVFcnIgKz0gZXJyb3I7Ci0gIHVuc2lnbmVkIGRpYWdJRAotICAgICA9IERpYWdzLmdldERpYWdub3N0aWNJRHMoKS0+Z2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNJRHM6OkVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVFcnIpOwotICBEaWFncy5SZXBvcnQobG9jLCBkaWFnSUQpIDw8IHJhbmdlOwotICBSZXBvcnRlZEVycm9ycyA9IHRydWU7CisgIFNvdXJjZU1hbmFnZXIgJlNNID0gc3RhdGljX2Nhc3Q8VHJhbnNmb3JtQWN0aW9uc0ltcGwgKj4oSW1wbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRBU1RDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNvdXJjZU1hbmFnZXIoKTsKKyAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIEwgPSBEaWFncy5nZXREaWFnbm9zdGljTGV2ZWwoZGlhZ0lkLCBsb2MpOworICAvLyBUT0RPOiBNb3ZlIHRoaXMgY2hlY2sgdG8gdGhlIGNhbGxlciB0byBlbnN1cmUgY29uc2lzdGVudCBub3RlIGF0dGFjaG1lbnRzLgorICBpZiAoTCA9PSBEaWFnbm9zdGljc0VuZ2luZTo6SWdub3JlZCB8fAorICAgICAgU00uaXNJblN5c3RlbUhlYWRlcihTTS5nZXRFeHBhbnNpb25Mb2MobG9jKSkpCisgICAgcmV0dXJuIERpYWdub3N0aWNCdWlsZGVyOjpnZXRFbXB0eSgpOworICBpZiAoTCA+PSBEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3IpCisgICAgUmVwb3J0ZWRFcnJvcnMgPSB0cnVlOworICByZXR1cm4gRGlhZ3MuUmVwb3J0KGxvYywgZGlhZ0lkKSA8PCByYW5nZTsKIH0KIAotdm9pZCBUcmFuc2Zvcm1BY3Rpb25zOjpyZXBvcnRXYXJuaW5nKFN0cmluZ1JlZiB3YXJuaW5nLCBTb3VyY2VMb2NhdGlvbiBsb2MsCit2b2lkIFRyYW5zZm9ybUFjdGlvbnM6OnJlcG9ydEVycm9yKFN0cmluZ1JlZiBtZXNzYWdlLCBTb3VyY2VMb2NhdGlvbiBsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIHJhbmdlKSB7Ci0gIGFzc2VydCghc3RhdGljX2Nhc3Q8VHJhbnNmb3JtQWN0aW9uc0ltcGwqPihJbXBsKS0+aXNJblRyYW5zYWN0aW9uKCkgJiYKLSAgICAgICAgICJXYXJuaW5nIHNob3VsZCBiZSBlbWl0dGVkIG91dCBvZiBhIHRyYW5zYWN0aW9uIik7Ci0gIAotICBTb3VyY2VNYW5hZ2VyICZTTSA9IHN0YXRpY19jYXN0PFRyYW5zZm9ybUFjdGlvbnNJbXBsKj4oSW1wbCktPgotICAgIGdldEFTVENvbnRleHQoKS5nZXRTb3VyY2VNYW5hZ2VyKCk7Ci0gIGlmIChTTS5pc0luU3lzdGVtSGVhZGVyKFNNLmdldEV4cGFuc2lvbkxvYyhsb2MpKSkKLSAgICByZXR1cm47Ci0gIAotICAvLyBGSVhNRTogVXNlIGEgY3VzdG9tIGNhdGVnb3J5IG5hbWUgdG8gZGlzdGluZ3Vpc2ggcmV3cml0ZXIgZXJyb3JzLgotICBzdGQ6OnN0cmluZyByZXdyaXRlcldhcm4gPSAiW3Jld3JpdGVyXSAiOwotICByZXdyaXRlcldhcm4gKz0gd2FybmluZzsKLSAgdW5zaWduZWQgZGlhZ0lECi0gID0gRGlhZ3MuZ2V0RGlhZ25vc3RpY0lEcygpLT5nZXRDdXN0b21EaWFnSUQoRGlhZ25vc3RpY0lEczo6V2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlcldhcm4pOwotICBEaWFncy5SZXBvcnQobG9jLCBkaWFnSUQpIDw8IHJhbmdlOworICByZXBvcnQobG9jLCBkaWFnOjplcnJfbXRfbWVzc2FnZSwgcmFuZ2UpIDw8IG1lc3NhZ2U7CiB9CiAKLXZvaWQgVHJhbnNmb3JtQWN0aW9uczo6cmVwb3J0Tm90ZShTdHJpbmdSZWYgbm90ZSwgU291cmNlTG9jYXRpb24gbG9jLAordm9pZCBUcmFuc2Zvcm1BY3Rpb25zOjpyZXBvcnRXYXJuaW5nKFN0cmluZ1JlZiBtZXNzYWdlLCBTb3VyY2VMb2NhdGlvbiBsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgcmFuZ2UpIHsKKyAgcmVwb3J0KGxvYywgZGlhZzo6d2Fybl9tdF9tZXNzYWdlLCByYW5nZSkgPDwgbWVzc2FnZTsKK30KKwordm9pZCBUcmFuc2Zvcm1BY3Rpb25zOjpyZXBvcnROb3RlKFN0cmluZ1JlZiBtZXNzYWdlLCBTb3VyY2VMb2NhdGlvbiBsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgcmFuZ2UpIHsKLSAgYXNzZXJ0KCFzdGF0aWNfY2FzdDxUcmFuc2Zvcm1BY3Rpb25zSW1wbCo+KEltcGwpLT5pc0luVHJhbnNhY3Rpb24oKSAmJgotICAgICAgICAgIkVycm9ycyBzaG91bGQgYmUgZW1pdHRlZCBvdXQgb2YgYSB0cmFuc2FjdGlvbiIpOwotCi0gIFNvdXJjZU1hbmFnZXIgJlNNID0gc3RhdGljX2Nhc3Q8VHJhbnNmb3JtQWN0aW9uc0ltcGwqPihJbXBsKS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBU1RDb250ZXh0KCkuZ2V0U291cmNlTWFuYWdlcigpOwotICBpZiAoU00uaXNJblN5c3RlbUhlYWRlcihTTS5nZXRFeHBhbnNpb25Mb2MobG9jKSkpCi0gICAgcmV0dXJuOwotCi0gIC8vIEZJWE1FOiBVc2UgYSBjdXN0b20gY2F0ZWdvcnkgbmFtZSB0byBkaXN0aW5ndWlzaCByZXdyaXRlciBlcnJvcnMuCi0gIHN0ZDo6c3RyaW5nIHJld3JpdGVOb3RlID0gIltyZXdyaXRlcl0gIjsKLSAgcmV3cml0ZU5vdGUgKz0gbm90ZTsKLSAgdW5zaWduZWQgZGlhZ0lECi0gICAgID0gRGlhZ3MuZ2V0RGlhZ25vc3RpY0lEcygpLT5nZXRDdXN0b21EaWFnSUQoRGlhZ25vc3RpY0lEczo6Tm90ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlTm90ZSk7Ci0gIERpYWdzLlJlcG9ydChsb2MsIGRpYWdJRCkgPDwgcmFuZ2U7CisgIHJlcG9ydChsb2MsIGRpYWc6Om5vdGVfbXRfbWVzc2FnZSwgcmFuZ2UpIDw8IG1lc3NhZ2U7CiB9CmRpZmYgLS1naXQgYS9saWIvQVJDTWlncmF0ZS9UcmFuc2Zvcm1zLmNwcCBiL2xpYi9BUkNNaWdyYXRlL1RyYW5zZm9ybXMuY3BwCmluZGV4IDY3OWI5MjQuLmMzNDljYjUgMTAwNjQ0Ci0tLSBhL2xpYi9BUkNNaWdyYXRlL1RyYW5zZm9ybXMuY3BwCisrKyBiL2xpYi9BUkNNaWdyYXRlL1RyYW5zZm9ybXMuY3BwCkBAIC04OCw3ICs4OCw3IEBACiAgIGlmIChjb25zdCBDYWxsRXhwciAqCiAgICAgICAgIGNhbGxFID0gZHluX2Nhc3Q8Q2FsbEV4cHI+KEUtPklnbm9yZVBhcmVuQ2FzdHMoKSkpIHsKICAgICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGNhbGxFLT5nZXREaXJlY3RDYWxsZWUoKSkgewotICAgICAgaWYgKEZELT5nZXRBdHRyPENGUmV0dXJuc1JldGFpbmVkQXR0cj4oKSkKKyAgICAgIGlmIChGRC0+aGFzQXR0cjxDRlJldHVybnNSZXRhaW5lZEF0dHI+KCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICBpZiAoRkQtPmlzR2xvYmFsKCkgJiYKQEAgLTI2NCw5ICsyNjQsOCBAQAogICB9CiAgIAogICBib29sIFZpc2l0Q29tcG91bmRTdG10KENvbXBvdW5kU3RtdCAqUykgewotICAgIGZvciAoQ29tcG91bmRTdG10Ojpib2R5X2l0ZXJhdG9yCi0gICAgICAgIEkgPSBTLT5ib2R5X2JlZ2luKCksIEUgPSBTLT5ib2R5X2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICAgIG1hcmsoKkkpOworICAgIGZvciAoYXV0byAqSSA6IFMtPmJvZHkoKSkKKyAgICAgIG1hcmsoSSk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KICAgCkBAIC01MzgsMTUgKzUzNywxMiBAQAogICBpbXBsX2l0ZXJhdG9yOwogICBmb3IgKGltcGxfaXRlcmF0b3IgSSA9IGltcGxfaXRlcmF0b3IoREMtPmRlY2xzX2JlZ2luKCkpLAogICAgICAgIEUgPSBpbXBsX2l0ZXJhdG9yKERDLT5kZWNsc19lbmQoKSk7IEkgIT0gRTsgKytJKSB7Ci0gICAgZm9yIChPYmpDSW1wbGVtZW50YXRpb25EZWNsOjppbnN0bWV0aF9pdGVyYXRvcgotICAgICAgICAgTUkgPSBJLT5pbnN0bWV0aF9iZWdpbigpLAotICAgICAgICAgTUUgPSBJLT5pbnN0bWV0aF9lbmQoKTsgTUkgIT0gTUU7ICsrTUkpIHsKLSAgICAgIE9iakNNZXRob2REZWNsICpNRCA9ICpNSTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKk1EIDogSS0+aW5zdGFuY2VfbWV0aG9kcygpKSB7CiAgICAgICBpZiAoIU1ELT5oYXNCb2R5KCkpCiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgCiAgICAgICBpZiAoTUQtPmlzSW5zdGFuY2VNZXRob2QoKSAmJiBNRC0+Z2V0U2VsZWN0b3IoKSA9PSBGaW5hbGl6ZVNlbCkgewotICAgICAgICBPYmpDTWV0aG9kRGVjbCAqRmluYWxpemVNID0gTUQ7CisgICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpGaW5hbGl6ZU0gPSBNRDsKICAgICAgICAgVHJhbnNhY3Rpb24gVHJhbnMoVEEpOwogICAgICAgICBUQS5pbnNlcnQoRmluYWxpemVNLT5nZXRTb3VyY2VSYW5nZSgpLmdldEJlZ2luKCksIAogICAgICAgICAgICAgICAgICAgIiNpZiAhX19oYXNfZmVhdHVyZShvYmpjX2FyYylcbiIpOwpkaWZmIC0tZ2l0IGEvbGliL0FSQ01pZ3JhdGUvVHJhbnNmb3Jtcy5oIGIvbGliL0FSQ01pZ3JhdGUvVHJhbnNmb3Jtcy5oCmluZGV4IGVhYjVlODUuLjU0YmU1YjUgMTAwNjQ0Ci0tLSBhL2xpYi9BUkNNaWdyYXRlL1RyYW5zZm9ybXMuaAorKysgYi9saWIvQVJDTWlncmF0ZS9UcmFuc2Zvcm1zLmgKQEAgLTEyNywyOSArMTI3LDI5IEBACiAKIGNsYXNzIFByb3BlcnR5UmV3cml0ZVRyYXZlcnNlciA6IHB1YmxpYyBBU1RUcmF2ZXJzZXIgewogcHVibGljOgotICB2aXJ0dWFsIHZvaWQgdHJhdmVyc2VPYmpDSW1wbGVtZW50YXRpb24oT2JqQ0ltcGxlbWVudGF0aW9uQ29udGV4dCAmSW1wbEN0eCk7CisgIHZvaWQgdHJhdmVyc2VPYmpDSW1wbGVtZW50YXRpb24oT2JqQ0ltcGxlbWVudGF0aW9uQ29udGV4dCAmSW1wbEN0eCkgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBCbG9ja09iakNWYXJpYWJsZVRyYXZlcnNlciA6IHB1YmxpYyBBU1RUcmF2ZXJzZXIgewogcHVibGljOgotICB2aXJ0dWFsIHZvaWQgdHJhdmVyc2VCb2R5KEJvZHlDb250ZXh0ICZCb2R5Q3R4KTsKKyAgdm9pZCB0cmF2ZXJzZUJvZHkoQm9keUNvbnRleHQgJkJvZHlDdHgpIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgUHJvdGVjdGVkU2NvcGVUcmF2ZXJzZXIgOiBwdWJsaWMgQVNUVHJhdmVyc2VyIHsKIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHRyYXZlcnNlQm9keShCb2R5Q29udGV4dCAmQm9keUN0eCk7CisgIHZvaWQgdHJhdmVyc2VCb2R5KEJvZHlDb250ZXh0ICZCb2R5Q3R4KSBvdmVycmlkZTsKIH07CiAKIC8vIEdDIHRyYW5zZm9ybWF0aW9ucwogCiBjbGFzcyBHQ0F0dHJzVHJhdmVyc2VyIDogcHVibGljIEFTVFRyYXZlcnNlciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCB0cmF2ZXJzZVRVKE1pZ3JhdGlvbkNvbnRleHQgJk1pZ3JhdGVDdHgpOworICB2b2lkIHRyYXZlcnNlVFUoTWlncmF0aW9uQ29udGV4dCAmTWlncmF0ZUN0eCkgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBHQ0NvbGxlY3RhYmxlQ2FsbHNUcmF2ZXJzZXIgOiBwdWJsaWMgQVNUVHJhdmVyc2VyIHsKIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHRyYXZlcnNlQm9keShCb2R5Q29udGV4dCAmQm9keUN0eCk7CisgIHZvaWQgdHJhdmVyc2VCb2R5KEJvZHlDb250ZXh0ICZCb2R5Q3R4KSBvdmVycmlkZTsKIH07CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCmRpZmYgLS1naXQgYS9saWIvQVNUL0FQVmFsdWUuY3BwIGIvbGliL0FTVC9BUFZhbHVlLmNwcAppbmRleCA1NDE4MzZiLi4wNDk1MThlIDEwMDY0NAotLS0gYS9saWIvQVNUL0FQVmFsdWUuY3BwCisrKyBiL2xpYi9BU1QvQVBWYWx1ZS5jcHAKQEAgLTM0LDcgKzM0LDcgQEAKIAogc3RydWN0IEFQVmFsdWU6OkxWIDogTFZCYXNlIHsKICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIElubGluZVBhdGhTcGFjZSA9Ci0gICAgICAoTWF4U2l6ZSAtIHNpemVvZihMVkJhc2UpKSAvIHNpemVvZihMVmFsdWVQYXRoRW50cnkpOworICAgICAgKERhdGFTaXplIC0gc2l6ZW9mKExWQmFzZSkpIC8gc2l6ZW9mKExWYWx1ZVBhdGhFbnRyeSk7CiAKICAgLy8vIFBhdGggLSBUaGUgc2VxdWVuY2Ugb2YgYmFzZSBjbGFzc2VzLCBmaWVsZHMgYW5kIGFycmF5IGluZGljZXMgdG8gZm9sbG93IHRvCiAgIC8vLyB3YWxrIGZyb20gQmFzZSB0byB0aGUgc3Vib2JqZWN0LiBXaGVuIHBlcmZvcm1pbmcgR0NDLXN0eWxlIGZvbGRpbmcsIHRoZXJlCkBAIC03NSw3ICs3NSw3IEBACiAKIHN0cnVjdCBBUFZhbHVlOjpNZW1iZXJQb2ludGVyRGF0YSA6IE1lbWJlclBvaW50ZXJCYXNlIHsKICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIElubGluZVBhdGhTcGFjZSA9Ci0gICAgICAoTWF4U2l6ZSAtIHNpemVvZihNZW1iZXJQb2ludGVyQmFzZSkpIC8gc2l6ZW9mKGNvbnN0IENYWFJlY29yZERlY2wqKTsKKyAgICAgIChEYXRhU2l6ZSAtIHNpemVvZihNZW1iZXJQb2ludGVyQmFzZSkpIC8gc2l6ZW9mKGNvbnN0IENYWFJlY29yZERlY2wqKTsKICAgdHlwZWRlZiBjb25zdCBDWFhSZWNvcmREZWNsICpQYXRoRWxlbTsKICAgdW5pb24gewogICAgIFBhdGhFbGVtIFBhdGhbSW5saW5lUGF0aFNwYWNlXTsKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgIGJyZWFrOwogICBjYXNlIFZlY3RvcjoKICAgICBNYWtlVmVjdG9yKCk7Ci0gICAgc2V0VmVjdG9yKCgoY29uc3QgVmVjICopKGNvbnN0IGNoYXIgKilSSFMuRGF0YSktPkVsdHMsCisgICAgc2V0VmVjdG9yKCgoY29uc3QgVmVjICopKGNvbnN0IGNoYXIgKilSSFMuRGF0YS5idWZmZXIpLT5FbHRzLAogICAgICAgICAgICAgICBSSFMuZ2V0VmVjdG9yTGVuZ3RoKCkpOwogICAgIGJyZWFrOwogICBjYXNlIENvbXBsZXhJbnQ6CkBAIC0xODgsMjcgKzE4OCwyNyBAQAogCiB2b2lkIEFQVmFsdWU6OkRlc3Ryb3lEYXRhQW5kTWFrZVVuaW5pdCgpIHsKICAgaWYgKEtpbmQgPT0gSW50KQotICAgICgoQVBTSW50KikoY2hhciopRGF0YSktPn5BUFNJbnQoKTsKKyAgICAoKEFQU0ludCopKGNoYXIqKURhdGEuYnVmZmVyKS0+fkFQU0ludCgpOwogICBlbHNlIGlmIChLaW5kID09IEZsb2F0KQotICAgICgoQVBGbG9hdCopKGNoYXIqKURhdGEpLT5+QVBGbG9hdCgpOworICAgICgoQVBGbG9hdCopKGNoYXIqKURhdGEuYnVmZmVyKS0+fkFQRmxvYXQoKTsKICAgZWxzZSBpZiAoS2luZCA9PSBWZWN0b3IpCi0gICAgKChWZWMqKShjaGFyKilEYXRhKS0+flZlYygpOworICAgICgoVmVjKikoY2hhciopRGF0YS5idWZmZXIpLT5+VmVjKCk7CiAgIGVsc2UgaWYgKEtpbmQgPT0gQ29tcGxleEludCkKLSAgICAoKENvbXBsZXhBUFNJbnQqKShjaGFyKilEYXRhKS0+fkNvbXBsZXhBUFNJbnQoKTsKKyAgICAoKENvbXBsZXhBUFNJbnQqKShjaGFyKilEYXRhLmJ1ZmZlciktPn5Db21wbGV4QVBTSW50KCk7CiAgIGVsc2UgaWYgKEtpbmQgPT0gQ29tcGxleEZsb2F0KQotICAgICgoQ29tcGxleEFQRmxvYXQqKShjaGFyKilEYXRhKS0+fkNvbXBsZXhBUEZsb2F0KCk7CisgICAgKChDb21wbGV4QVBGbG9hdCopKGNoYXIqKURhdGEuYnVmZmVyKS0+fkNvbXBsZXhBUEZsb2F0KCk7CiAgIGVsc2UgaWYgKEtpbmQgPT0gTFZhbHVlKQotICAgICgoTFYqKShjaGFyKilEYXRhKS0+fkxWKCk7CisgICAgKChMViopKGNoYXIqKURhdGEuYnVmZmVyKS0+fkxWKCk7CiAgIGVsc2UgaWYgKEtpbmQgPT0gQXJyYXkpCi0gICAgKChBcnIqKShjaGFyKilEYXRhKS0+fkFycigpOworICAgICgoQXJyKikoY2hhciopRGF0YS5idWZmZXIpLT5+QXJyKCk7CiAgIGVsc2UgaWYgKEtpbmQgPT0gU3RydWN0KQotICAgICgoU3RydWN0RGF0YSopKGNoYXIqKURhdGEpLT5+U3RydWN0RGF0YSgpOworICAgICgoU3RydWN0RGF0YSopKGNoYXIqKURhdGEuYnVmZmVyKS0+flN0cnVjdERhdGEoKTsKICAgZWxzZSBpZiAoS2luZCA9PSBVbmlvbikKLSAgICAoKFVuaW9uRGF0YSopKGNoYXIqKURhdGEpLT5+VW5pb25EYXRhKCk7CisgICAgKChVbmlvbkRhdGEqKShjaGFyKilEYXRhLmJ1ZmZlciktPn5VbmlvbkRhdGEoKTsKICAgZWxzZSBpZiAoS2luZCA9PSBNZW1iZXJQb2ludGVyKQotICAgICgoTWVtYmVyUG9pbnRlckRhdGEqKShjaGFyKilEYXRhKS0+fk1lbWJlclBvaW50ZXJEYXRhKCk7CisgICAgKChNZW1iZXJQb2ludGVyRGF0YSopKGNoYXIqKURhdGEuYnVmZmVyKS0+fk1lbWJlclBvaW50ZXJEYXRhKCk7CiAgIGVsc2UgaWYgKEtpbmQgPT0gQWRkckxhYmVsRGlmZikKLSAgICAoKEFkZHJMYWJlbERpZmZEYXRhKikoY2hhciopRGF0YSktPn5BZGRyTGFiZWxEaWZmRGF0YSgpOworICAgICgoQWRkckxhYmVsRGlmZkRhdGEqKShjaGFyKilEYXRhLmJ1ZmZlciktPn5BZGRyTGFiZWxEaWZmRGF0YSgpOwogICBLaW5kID0gVW5pbml0aWFsaXplZDsKIH0KIApAQCAtMjM5LDE5ICsyMzksMjAgQEAKICAgICAgICAgICAgInNhbWUgc2l6ZS4iKTsKICAgICByZXR1cm4gZ2V0Q29tcGxleEludFJlYWwoKS5uZWVkc0NsZWFudXAoKTsKICAgY2FzZSBMVmFsdWU6Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTFYgKj4oRGF0YSktPmhhc1BhdGhQdHIoKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBMViAqPihEYXRhLmJ1ZmZlciktPmhhc1BhdGhQdHIoKTsKICAgY2FzZSBNZW1iZXJQb2ludGVyOgotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IE1lbWJlclBvaW50ZXJEYXRhICo+KERhdGEpLT5oYXNQYXRoUHRyKCk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVtYmVyUG9pbnRlckRhdGEgKj4oRGF0YS5idWZmZXIpCisgICAgICAgIC0+aGFzUGF0aFB0cigpOwogICB9CiAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gQVBWYWx1ZSBraW5kISIpOwogfQogCiB2b2lkIEFQVmFsdWU6OnN3YXAoQVBWYWx1ZSAmUkhTKSB7CiAgIHN0ZDo6c3dhcChLaW5kLCBSSFMuS2luZCk7Ci0gIGNoYXIgVG1wRGF0YVtNYXhTaXplXTsKLSAgbWVtY3B5KFRtcERhdGEsIERhdGEsIE1heFNpemUpOwotICBtZW1jcHkoRGF0YSwgUkhTLkRhdGEsIE1heFNpemUpOwotICBtZW1jcHkoUkhTLkRhdGEsIFRtcERhdGEsIE1heFNpemUpOworICBjaGFyIFRtcERhdGFbRGF0YVNpemVdOworICBtZW1jcHkoVG1wRGF0YSwgRGF0YS5idWZmZXIsIERhdGFTaXplKTsKKyAgbWVtY3B5KERhdGEuYnVmZmVyLCBSSFMuRGF0YS5idWZmZXIsIERhdGFTaXplKTsKKyAgbWVtY3B5KFJIUy5EYXRhLmJ1ZmZlciwgVG1wRGF0YSwgRGF0YVNpemUpOwogfQogCiB2b2lkIEFQVmFsdWU6OmR1bXAoKSBjb25zdCB7CkBAIC00OTgsOCArNDk5LDcgQEAKICAgICAgICAgRmlyc3QgPSBmYWxzZTsKICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGSSA9IFJELT5maWVsZF9iZWdpbigpOwotICAgICAgICAgRkkgIT0gUkQtPmZpZWxkX2VuZCgpOyArK0ZJKSB7CisgICAgZm9yIChjb25zdCBhdXRvICpGSSA6IFJELT5maWVsZHMoKSkgewogICAgICAgaWYgKCFGaXJzdCkKICAgICAgICAgT3V0IDw8ICIsICI7CiAgICAgICBpZiAoRkktPmlzVW5uYW1lZEJpdGZpZWxkKCkpIGNvbnRpbnVlOwpAQCAtNTQ2LDM5ICs1NDYsMzkgQEAKIAogY29uc3QgQVBWYWx1ZTo6TFZhbHVlQmFzZSBBUFZhbHVlOjpnZXRMVmFsdWVCYXNlKCkgY29uc3QgewogICBhc3NlcnQoaXNMVmFsdWUoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICByZXR1cm4gKChjb25zdCBMViopKGNvbnN0IHZvaWQqKURhdGEpLT5CYXNlQW5kSXNPbmVQYXN0VGhlRW5kLmdldFBvaW50ZXIoKTsKKyAgcmV0dXJuICgoY29uc3QgTFYqKShjb25zdCB2b2lkKilEYXRhLmJ1ZmZlciktPkJhc2VBbmRJc09uZVBhc3RUaGVFbmQuZ2V0UG9pbnRlcigpOwogfQogCiBib29sIEFQVmFsdWU6OmlzTFZhbHVlT25lUGFzdFRoZUVuZCgpIGNvbnN0IHsKICAgYXNzZXJ0KGlzTFZhbHVlKCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKLSAgcmV0dXJuICgoY29uc3QgTFYqKShjb25zdCB2b2lkKilEYXRhKS0+QmFzZUFuZElzT25lUGFzdFRoZUVuZC5nZXRJbnQoKTsKKyAgcmV0dXJuICgoY29uc3QgTFYqKShjb25zdCB2b2lkKilEYXRhLmJ1ZmZlciktPkJhc2VBbmRJc09uZVBhc3RUaGVFbmQuZ2V0SW50KCk7CiB9CiAKIENoYXJVbml0cyAmQVBWYWx1ZTo6Z2V0TFZhbHVlT2Zmc2V0KCkgewogICBhc3NlcnQoaXNMVmFsdWUoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICByZXR1cm4gKChMViopKHZvaWQqKURhdGEpLT5PZmZzZXQ7CisgIHJldHVybiAoKExWKikodm9pZCopRGF0YS5idWZmZXIpLT5PZmZzZXQ7CiB9CiAKIGJvb2wgQVBWYWx1ZTo6aGFzTFZhbHVlUGF0aCgpIGNvbnN0IHsKICAgYXNzZXJ0KGlzTFZhbHVlKCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKLSAgcmV0dXJuICgoY29uc3QgTFYqKShjb25zdCBjaGFyKilEYXRhKS0+aGFzUGF0aCgpOworICByZXR1cm4gKChjb25zdCBMViopKGNvbnN0IGNoYXIqKURhdGEuYnVmZmVyKS0+aGFzUGF0aCgpOwogfQogCiBBcnJheVJlZjxBUFZhbHVlOjpMVmFsdWVQYXRoRW50cnk+IEFQVmFsdWU6OmdldExWYWx1ZVBhdGgoKSBjb25zdCB7CiAgIGFzc2VydChpc0xWYWx1ZSgpICYmIGhhc0xWYWx1ZVBhdGgoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICBjb25zdCBMViAmTFZhbCA9ICooKGNvbnN0IExWKikoY29uc3QgY2hhciopRGF0YSk7CisgIGNvbnN0IExWICZMVmFsID0gKigoY29uc3QgTFYqKShjb25zdCBjaGFyKilEYXRhLmJ1ZmZlcik7CiAgIHJldHVybiBBcnJheVJlZjxMVmFsdWVQYXRoRW50cnk+KExWYWwuZ2V0UGF0aCgpLCBMVmFsLlBhdGhMZW5ndGgpOwogfQogCiB1bnNpZ25lZCBBUFZhbHVlOjpnZXRMVmFsdWVDYWxsSW5kZXgoKSBjb25zdCB7CiAgIGFzc2VydChpc0xWYWx1ZSgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gIHJldHVybiAoKGNvbnN0IExWKikoY29uc3QgY2hhciopRGF0YSktPkNhbGxJbmRleDsKKyAgcmV0dXJuICgoY29uc3QgTFYqKShjb25zdCBjaGFyKilEYXRhLmJ1ZmZlciktPkNhbGxJbmRleDsKIH0KIAogdm9pZCBBUFZhbHVlOjpzZXRMVmFsdWUoTFZhbHVlQmFzZSBCLCBjb25zdCBDaGFyVW5pdHMgJk8sIE5vTFZhbHVlUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENhbGxJbmRleCkgewogICBhc3NlcnQoaXNMVmFsdWUoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICBMViAmTFZhbCA9ICooKExWKikoY2hhciopRGF0YSk7CisgIExWICZMVmFsID0gKigoTFYqKShjaGFyKilEYXRhLmJ1ZmZlcik7CiAgIExWYWwuQmFzZUFuZElzT25lUGFzdFRoZUVuZC5zZXRQb2ludGVyKEIpOwogICBMVmFsLkJhc2VBbmRJc09uZVBhc3RUaGVFbmQuc2V0SW50KGZhbHNlKTsKICAgTFZhbC5PZmZzZXQgPSBPOwpAQCAtNTkwLDcgKzU5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxMVmFsdWVQYXRoRW50cnk+IFBhdGgsIGJvb2wgSXNPbmVQYXN0VGhlRW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2FsbEluZGV4KSB7CiAgIGFzc2VydChpc0xWYWx1ZSgpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gIExWICZMVmFsID0gKigoTFYqKShjaGFyKilEYXRhKTsKKyAgTFYgJkxWYWwgPSAqKChMViopKGNoYXIqKURhdGEuYnVmZmVyKTsKICAgTFZhbC5CYXNlQW5kSXNPbmVQYXN0VGhlRW5kLnNldFBvaW50ZXIoQik7CiAgIExWYWwuQmFzZUFuZElzT25lUGFzdFRoZUVuZC5zZXRJbnQoSXNPbmVQYXN0VGhlRW5kKTsKICAgTFZhbC5PZmZzZXQgPSBPOwpAQCAtNjAxLDM5ICs2MDEsNDIgQEAKIAogY29uc3QgVmFsdWVEZWNsICpBUFZhbHVlOjpnZXRNZW1iZXJQb2ludGVyRGVjbCgpIGNvbnN0IHsKICAgYXNzZXJ0KGlzTWVtYmVyUG9pbnRlcigpICYmICJJbnZhbGlkIGFjY2Vzc29yIik7Ci0gIGNvbnN0IE1lbWJlclBvaW50ZXJEYXRhICZNUEQgPSAqKChjb25zdCBNZW1iZXJQb2ludGVyRGF0YSopKGNvbnN0IGNoYXIqKURhdGEpOworICBjb25zdCBNZW1iZXJQb2ludGVyRGF0YSAmTVBEID0KKyAgICAgICooKGNvbnN0IE1lbWJlclBvaW50ZXJEYXRhICopKGNvbnN0IGNoYXIgKilEYXRhLmJ1ZmZlcik7CiAgIHJldHVybiBNUEQuTWVtYmVyQW5kSXNEZXJpdmVkTWVtYmVyLmdldFBvaW50ZXIoKTsKIH0KIAogYm9vbCBBUFZhbHVlOjppc01lbWJlclBvaW50ZXJUb0Rlcml2ZWRNZW1iZXIoKSBjb25zdCB7CiAgIGFzc2VydChpc01lbWJlclBvaW50ZXIoKSAmJiAiSW52YWxpZCBhY2Nlc3NvciIpOwotICBjb25zdCBNZW1iZXJQb2ludGVyRGF0YSAmTVBEID0gKigoY29uc3QgTWVtYmVyUG9pbnRlckRhdGEqKShjb25zdCBjaGFyKilEYXRhKTsKKyAgY29uc3QgTWVtYmVyUG9pbnRlckRhdGEgJk1QRCA9CisgICAgICAqKChjb25zdCBNZW1iZXJQb2ludGVyRGF0YSAqKShjb25zdCBjaGFyICopRGF0YS5idWZmZXIpOwogICByZXR1cm4gTVBELk1lbWJlckFuZElzRGVyaXZlZE1lbWJlci5nZXRJbnQoKTsKIH0KIAogQXJyYXlSZWY8Y29uc3QgQ1hYUmVjb3JkRGVjbCo+IEFQVmFsdWU6OmdldE1lbWJlclBvaW50ZXJQYXRoKCkgY29uc3QgewogICBhc3NlcnQoaXNNZW1iZXJQb2ludGVyKCkgJiYgIkludmFsaWQgYWNjZXNzb3IiKTsKLSAgY29uc3QgTWVtYmVyUG9pbnRlckRhdGEgJk1QRCA9ICooKGNvbnN0IE1lbWJlclBvaW50ZXJEYXRhKikoY29uc3QgY2hhciopRGF0YSk7CisgIGNvbnN0IE1lbWJlclBvaW50ZXJEYXRhICZNUEQgPQorICAgICAgKigoY29uc3QgTWVtYmVyUG9pbnRlckRhdGEgKikoY29uc3QgY2hhciAqKURhdGEuYnVmZmVyKTsKICAgcmV0dXJuIEFycmF5UmVmPGNvbnN0IENYWFJlY29yZERlY2wqPihNUEQuZ2V0UGF0aCgpLCBNUEQuUGF0aExlbmd0aCk7CiB9CiAKIHZvaWQgQVBWYWx1ZTo6TWFrZUxWYWx1ZSgpIHsKICAgYXNzZXJ0KGlzVW5pbml0KCkgJiYgIkJhZCBzdGF0ZSBjaGFuZ2UiKTsKLSAgYXNzZXJ0KHNpemVvZihMVikgPD0gTWF4U2l6ZSAmJiAiTFYgdG9vIGJpZyIpOwotICBuZXcgKCh2b2lkKikoY2hhciopRGF0YSkgTFYoKTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoTFYpIDw9IERhdGFTaXplLCAiTFYgdG9vIGJpZyIpOworICBuZXcgKCh2b2lkKikoY2hhciopRGF0YS5idWZmZXIpIExWKCk7CiAgIEtpbmQgPSBMVmFsdWU7CiB9CiAKIHZvaWQgQVBWYWx1ZTo6TWFrZUFycmF5KHVuc2lnbmVkIEluaXRFbHRzLCB1bnNpZ25lZCBTaXplKSB7CiAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7Ci0gIG5ldyAoKHZvaWQqKShjaGFyKilEYXRhKSBBcnIoSW5pdEVsdHMsIFNpemUpOworICBuZXcgKCh2b2lkKikoY2hhciopRGF0YS5idWZmZXIpIEFycihJbml0RWx0cywgU2l6ZSk7CiAgIEtpbmQgPSBBcnJheTsKIH0KIAogdm9pZCBBUFZhbHVlOjpNYWtlTWVtYmVyUG9pbnRlcihjb25zdCBWYWx1ZURlY2wgKk1lbWJlciwgYm9vbCBJc0Rlcml2ZWRNZW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IENYWFJlY29yZERlY2wqPiBQYXRoKSB7CiAgIGFzc2VydChpc1VuaW5pdCgpICYmICJCYWQgc3RhdGUgY2hhbmdlIik7Ci0gIE1lbWJlclBvaW50ZXJEYXRhICpNUEQgPSBuZXcgKCh2b2lkKikoY2hhciopRGF0YSkgTWVtYmVyUG9pbnRlckRhdGE7CisgIE1lbWJlclBvaW50ZXJEYXRhICpNUEQgPSBuZXcgKCh2b2lkKikoY2hhciopRGF0YS5idWZmZXIpIE1lbWJlclBvaW50ZXJEYXRhOwogICBLaW5kID0gTWVtYmVyUG9pbnRlcjsKICAgTVBELT5NZW1iZXJBbmRJc0Rlcml2ZWRNZW1iZXIuc2V0UG9pbnRlcihNZW1iZXIpOwogICBNUEQtPk1lbWJlckFuZElzRGVyaXZlZE1lbWJlci5zZXRJbnQoSXNEZXJpdmVkTWVtYmVyKTsKZGlmZiAtLWdpdCBhL2xpYi9BU1QvQVNUQ29udGV4dC5jcHAgYi9saWIvQVNUL0FTVENvbnRleHQuY3BwCmluZGV4IGEwM2NmOWUuLjNlZDJhOWYgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvQVNUQ29udGV4dC5jcHAKKysrIGIvbGliL0FTVC9BU1RDb250ZXh0LmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgImNsYW5nL0FTVC9SZWNvcmRMYXlvdXQuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvUmVjdXJzaXZlQVNUVmlzaXRvci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1ZUYWJsZUJ1aWxkZXIuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9CdWlsdGlucy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgiCkBAIC02Miw2ICs2MywxMyBAQAogUmF3Q29tbWVudCAqQVNUQ29udGV4dDo6Z2V0UmF3Q29tbWVudEZvckRlY2xOb0NhY2hlKGNvbnN0IERlY2wgKkQpIGNvbnN0IHsKICAgaWYgKCFDb21tZW50c0xvYWRlZCAmJiBFeHRlcm5hbFNvdXJjZSkgewogICAgIEV4dGVybmFsU291cmNlLT5SZWFkQ29tbWVudHMoKTsKKworI2lmbmRlZiBOREVCVUcKKyAgICBBcnJheVJlZjxSYXdDb21tZW50ICo+IFJhd0NvbW1lbnRzID0gQ29tbWVudHMuZ2V0Q29tbWVudHMoKTsKKyAgICBhc3NlcnQoc3RkOjppc19zb3J0ZWQoUmF3Q29tbWVudHMuYmVnaW4oKSwgUmF3Q29tbWVudHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJlZm9yZVRoYW5Db21wYXJlPFJhd0NvbW1lbnQ+KFNvdXJjZU1ncikpKTsKKyNlbmRpZgorCiAgICAgQ29tbWVudHNMb2FkZWQgPSB0cnVlOwogICB9CiAKQEAgLTEzNywxMSArMTQ1LDIzIEBACiAgICAgRGVjbExvYyA9IEQtPmdldExvY1N0YXJ0KCk7CiAgIGVsc2UgewogICAgIERlY2xMb2MgPSBELT5nZXRMb2NhdGlvbigpOwotICAgIC8vIElmIGxvY2F0aW9uIG9mIHRoZSB0eXBlZGVmIG5hbWUgaXMgaW4gYSBtYWNybywgaXQgaXMgYmVjYXVzZSBiZWluZwotICAgIC8vIGRlY2xhcmVkIHZpYSBhIG1hY3JvLiBUcnkgdXNpbmcgZGVjbGFyYXRpb24ncyBzdGFydGluZyBsb2NhdGlvbgotICAgIC8vIGFzIHRoZSAiZGVjbGFyYXRpb24gbG9jYXRpb24iLgotICAgIGlmIChEZWNsTG9jLmlzTWFjcm9JRCgpICYmIGlzYTxUeXBlZGVmRGVjbD4oRCkpCi0gICAgICBEZWNsTG9jID0gRC0+Z2V0TG9jU3RhcnQoKTsKKyAgICBpZiAoRGVjbExvYy5pc01hY3JvSUQoKSkgeworICAgICAgaWYgKGlzYTxUeXBlZGVmRGVjbD4oRCkpIHsKKyAgICAgICAgLy8gSWYgbG9jYXRpb24gb2YgdGhlIHR5cGVkZWYgbmFtZSBpcyBpbiBhIG1hY3JvLCBpdCBpcyBiZWNhdXNlIGJlaW5nCisgICAgICAgIC8vIGRlY2xhcmVkIHZpYSBhIG1hY3JvLiBUcnkgdXNpbmcgZGVjbGFyYXRpb24ncyBzdGFydGluZyBsb2NhdGlvbiBhcworICAgICAgICAvLyB0aGUgImRlY2xhcmF0aW9uIGxvY2F0aW9uIi4KKyAgICAgICAgRGVjbExvYyA9IEQtPmdldExvY1N0YXJ0KCk7CisgICAgICB9IGVsc2UgaWYgKGNvbnN0IFRhZ0RlY2wgKlREID0gZHluX2Nhc3Q8VGFnRGVjbD4oRCkpIHsKKyAgICAgICAgLy8gSWYgbG9jYXRpb24gb2YgdGhlIHRhZyBkZWNsIGlzIGluc2lkZSBhIG1hY3JvLCBidXQgdGhlIHNwZWxsaW5nIG9mCisgICAgICAgIC8vIHRoZSB0YWcgbmFtZSBjb21lcyBmcm9tIGEgbWFjcm8gYXJndW1lbnQsIGl0IGxvb2tzIGxpa2UgYSBzcGVjaWFsCisgICAgICAgIC8vIG1hY3JvIGxpa2UgTlNfRU5VTSBpcyBiZWluZyB1c2VkIHRvIGRlZmluZSB0aGUgdGFnIGRlY2wuICBJbiB0aGF0CisgICAgICAgIC8vIGNhc2UsIGFkanVzdCB0aGUgc291cmNlIGxvY2F0aW9uIHRvIHRoZSBleHBhbnNpb24gbG9jIHNvIHRoYXQgd2UgY2FuCisgICAgICAgIC8vIGF0dGFjaCB0aGUgY29tbWVudCB0byB0aGUgdGFnIGRlY2wuCisgICAgICAgIGlmIChTb3VyY2VNZ3IuaXNNYWNyb0FyZ0V4cGFuc2lvbihEZWNsTG9jKSAmJgorICAgICAgICAgICAgVEQtPmlzQ29tcGxldGVEZWZpbml0aW9uKCkpCisgICAgICAgICAgRGVjbExvYyA9IFNvdXJjZU1nci5nZXRFeHBhbnNpb25Mb2MoRGVjbExvYyk7CisgICAgICB9CisgICAgfQogICB9CiAKICAgLy8gSWYgdGhlIGRlY2xhcmF0aW9uIGRvZXNuJ3QgbWFwIGRpcmVjdGx5IHRvIGEgbG9jYXRpb24gaW4gYSBmaWxlLCB3ZQpAQCAtMzMxLDExICszNTEsOSBAQAogICAvLyBTZWFyY2ggZm9yIGNvbW1lbnRzIGF0dGFjaGVkIHRvIGRlY2xhcmF0aW9ucyBpbiB0aGUgcmVkZWNsYXJhdGlvbiBjaGFpbi4KICAgY29uc3QgUmF3Q29tbWVudCAqUkMgPSBOVUxMOwogICBjb25zdCBEZWNsICpPcmlnaW5hbERlY2xGb3JSQyA9IE5VTEw7Ci0gIGZvciAoRGVjbDo6cmVkZWNsX2l0ZXJhdG9yIEkgPSBELT5yZWRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBELT5yZWRlY2xzX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7CisgIGZvciAoYXV0byBJIDogRC0+cmVkZWNscygpKSB7CiAgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRGVjbCAqLCBSYXdDb21tZW50QW5kQ2FjaGVGbGFncz46Oml0ZXJhdG9yIFBvcyA9Ci0gICAgICAgIFJlZGVjbENvbW1lbnRzLmZpbmQoKkkpOworICAgICAgICBSZWRlY2xDb21tZW50cy5maW5kKEkpOwogICAgIGlmIChQb3MgIT0gUmVkZWNsQ29tbWVudHMuZW5kKCkpIHsKICAgICAgIGNvbnN0IFJhd0NvbW1lbnRBbmRDYWNoZUZsYWdzICZSYXcgPSBQb3MtPnNlY29uZDsKICAgICAgIGlmIChSYXcuZ2V0S2luZCgpICE9IFJhd0NvbW1lbnRBbmRDYWNoZUZsYWdzOjpOb0NvbW1lbnRJbkRlY2wpIHsKQEAgLTM0NCwxNiArMzYyLDE2IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICBSQyA9IGdldFJhd0NvbW1lbnRGb3JEZWNsTm9DYWNoZSgqSSk7Ci0gICAgICBPcmlnaW5hbERlY2xGb3JSQyA9ICpJOworICAgICAgUkMgPSBnZXRSYXdDb21tZW50Rm9yRGVjbE5vQ2FjaGUoSSk7CisgICAgICBPcmlnaW5hbERlY2xGb3JSQyA9IEk7CiAgICAgICBSYXdDb21tZW50QW5kQ2FjaGVGbGFncyBSYXc7CiAgICAgICBpZiAoUkMpIHsKICAgICAgICAgUmF3LnNldFJhdyhSQyk7CiAgICAgICAgIFJhdy5zZXRLaW5kKFJhd0NvbW1lbnRBbmRDYWNoZUZsYWdzOjpGcm9tRGVjbCk7CiAgICAgICB9IGVsc2UKICAgICAgICAgUmF3LnNldEtpbmQoUmF3Q29tbWVudEFuZENhY2hlRmxhZ3M6Ok5vQ29tbWVudEluRGVjbCk7Ci0gICAgICBSYXcuc2V0T3JpZ2luYWxEZWNsKCpJKTsKLSAgICAgIFJlZGVjbENvbW1lbnRzWypJXSA9IFJhdzsKKyAgICAgIFJhdy5zZXRPcmlnaW5hbERlY2woSSk7CisgICAgICBSZWRlY2xDb21tZW50c1tJXSA9IFJhdzsKICAgICAgIGlmIChSQykKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMzcxLDEwICszODksOCBAQAogICBSYXcuc2V0S2luZChSYXdDb21tZW50QW5kQ2FjaGVGbGFnczo6RnJvbVJlZGVjbCk7CiAgIFJhdy5zZXRPcmlnaW5hbERlY2woT3JpZ2luYWxEZWNsRm9yUkMpOwogCi0gIGZvciAoRGVjbDo6cmVkZWNsX2l0ZXJhdG9yIEkgPSBELT5yZWRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBELT5yZWRlY2xzX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgUmF3Q29tbWVudEFuZENhY2hlRmxhZ3MgJlIgPSBSZWRlY2xDb21tZW50c1sqSV07CisgIGZvciAoYXV0byBJIDogRC0+cmVkZWNscygpKSB7CisgICAgUmF3Q29tbWVudEFuZENhY2hlRmxhZ3MgJlIgPSBSZWRlY2xDb21tZW50c1tJXTsKICAgICBpZiAoUi5nZXRLaW5kKCkgPT0gUmF3Q29tbWVudEFuZENhY2hlRmxhZ3M6Ok5vQ29tbWVudEluRGVjbCkKICAgICAgIFIgPSBSYXc7CiAgIH0KQEAgLTM5MCwxMCArNDA2LDcgQEAKICAgICBpZiAoIUlEKQogICAgICAgcmV0dXJuOwogICAgIC8vIEFkZCByZWRlY2xhcmVkIG1ldGhvZCBoZXJlLgotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6Omtub3duX2V4dGVuc2lvbnNfaXRlcmF0b3IKLSAgICAgICAgICAgRXh0ID0gSUQtPmtub3duX2V4dGVuc2lvbnNfYmVnaW4oKSwKLSAgICAgICAgICAgRXh0RW5kID0gSUQtPmtub3duX2V4dGVuc2lvbnNfZW5kKCk7Ci0gICAgICAgICBFeHQgIT0gRXh0RW5kOyArK0V4dCkgeworICAgIGZvciAoY29uc3QgYXV0byAqRXh0IDogSUQtPmtub3duX2V4dGVuc2lvbnMoKSkgewogICAgICAgaWYgKE9iakNNZXRob2REZWNsICpSZWRlY2xhcmVkTWV0aG9kID0KICAgICAgICAgICAgIEV4dC0+Z2V0TWV0aG9kKE9iakNNZXRob2QtPmdldFNlbGVjdG9yKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01ldGhvZC0+aXNJbnN0YW5jZU1ldGhvZCgpKSkKQEAgLTQ4NCwxMSArNDk3LDEwIEBACiAgICAgICBpZiAoIShSRCA9IFJELT5nZXREZWZpbml0aW9uKCkpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgIC8vIENoZWNrIG5vbi12aXJ0dWFsIGJhc2VzLgotICAgICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPQotICAgICAgICAgICBSRC0+YmFzZXNfYmVnaW4oKSwgRSA9IFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgICAgaWYgKEktPmlzVmlydHVhbCgpIHx8IChJLT5nZXRBY2Nlc3NTcGVjaWZpZXIoKSAhPSBBU19wdWJsaWMpKQorICAgICAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPmJhc2VzKCkpIHsKKyAgICAgICAgaWYgKEkuaXNWaXJ0dWFsKCkgfHwgKEkuZ2V0QWNjZXNzU3BlY2lmaWVyKCkgIT0gQVNfcHVibGljKSkKICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgUXVhbFR5cGUgVHkgPSBJLT5nZXRUeXBlKCk7CisgICAgICAgIFF1YWxUeXBlIFR5ID0gSS5nZXRUeXBlKCk7CiAgICAgICAgIGlmIChUeS5pc051bGwoKSkKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKk5vblZpcnR1YWxCYXNlID0gVHktPmdldEFzQ1hYUmVjb3JkRGVjbCgpKSB7CkBAIC01MDAsMTEgKzUxMiwxMCBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgICAvLyBDaGVjayB2aXJ0dWFsIGJhc2VzLgotICAgICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPQotICAgICAgICAgICBSRC0+dmJhc2VzX2JlZ2luKCksIEUgPSBSRC0+dmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgICBpZiAoSS0+Z2V0QWNjZXNzU3BlY2lmaWVyKCkgIT0gQVNfcHVibGljKQorICAgICAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPnZiYXNlcygpKSB7CisgICAgICAgIGlmIChJLmdldEFjY2Vzc1NwZWNpZmllcigpICE9IEFTX3B1YmxpYykKICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgUXVhbFR5cGUgVHkgPSBJLT5nZXRUeXBlKCk7CisgICAgICAgIFF1YWxUeXBlIFR5ID0gSS5nZXRUeXBlKCk7CiAgICAgICAgIGlmIChUeS5pc051bGwoKSkKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKlZpcnR1YWxCYXNlID0gVHktPmdldEFzQ1hYUmVjb3JkRGVjbCgpKSB7CkBAIC02NjcsNiArNjc4LDcgQEAKICAgc3dpdGNoIChULmdldENYWEFCSSgpLmdldEtpbmQoKSkgewogICBjYXNlIFRhcmdldENYWEFCSTo6R2VuZXJpY0FSTToKICAgY2FzZSBUYXJnZXRDWFhBQkk6OmlPUzoKKyAgY2FzZSBUYXJnZXRDWFhBQkk6OmlPUzY0OgogICAgIHJldHVybiBDcmVhdGVBUk1DWFhBQkkoKnRoaXMpOwogICBjYXNlIFRhcmdldENYWEFCSTo6R2VuZXJpY0FBcmNoNjQ6IC8vIFNhbWUgYXMgSXRhbml1bSBhdCB0aGlzIGxldmVsCiAgIGNhc2UgVGFyZ2V0Q1hYQUJJOjpHZW5lcmljSXRhbml1bToKQEAgLTc4MiwxMSArNzk0LDcgQEAKICAgICAgICBBICE9IEFFbmQ7ICsrQSkKICAgICBBLT5zZWNvbmQtPn5BdHRyVmVjKCk7CiAKLSAgZm9yIChsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsQ29udGV4dCAqLCBNYW5nbGVOdW1iZXJpbmdDb250ZXh0ICo+OjppdGVyYXRvcgotICAgICAgICAgICBJID0gTWFuZ2xlTnVtYmVyaW5nQ29udGV4dHMuYmVnaW4oKSwKLSAgICAgICAgICAgRSA9IE1hbmdsZU51bWJlcmluZ0NvbnRleHRzLmVuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKQotICAgIGRlbGV0ZSBJLT5zZWNvbmQ7CisgIGxsdm06OkRlbGV0ZUNvbnRhaW5lclNlY29uZHMoTWFuZ2xlTnVtYmVyaW5nQ29udGV4dHMpOwogfQogCiB2b2lkIEFTVENvbnRleHQ6OkFkZERlYWxsb2NhdGlvbih2b2lkICgqQ2FsbGJhY2spKHZvaWQqKSwgdm9pZCAqRGF0YSkgewpAQCAtNzk0LDggKzgwMiw4IEBACiB9CiAKIHZvaWQKLUFTVENvbnRleHQ6OnNldEV4dGVybmFsU291cmNlKE93bmluZ1B0cjxFeHRlcm5hbEFTVFNvdXJjZT4gJlNvdXJjZSkgewotICBFeHRlcm5hbFNvdXJjZS5yZXNldChTb3VyY2UudGFrZSgpKTsKK0FTVENvbnRleHQ6OnNldEV4dGVybmFsU291cmNlKEludHJ1c2l2ZVJlZkNudFB0cjxFeHRlcm5hbEFTVFNvdXJjZT4gU291cmNlKSB7CisgIEV4dGVybmFsU291cmNlID0gU291cmNlOwogfQogCiB2b2lkIEFTVENvbnRleHQ6OlByaW50U3RhdHMoKSBjb25zdCB7CkBAIC04NDksNyArODU3LDcgQEAKICAgICAgICAgICAgICAgIDw8IE51bUltcGxpY2l0RGVzdHJ1Y3RvcnMKICAgICAgICAgICAgICAgIDw8ICIgaW1wbGljaXQgZGVzdHJ1Y3RvcnMgY3JlYXRlZFxuIjsKIAotICBpZiAoRXh0ZXJuYWxTb3VyY2UuZ2V0KCkpIHsKKyAgaWYgKEV4dGVybmFsU291cmNlKSB7CiAgICAgbGx2bTo6ZXJycygpIDw8ICJcbiI7CiAgICAgRXh0ZXJuYWxTb3VyY2UtPlByaW50U3RhdHMoKTsKICAgfQpAQCAtODU3LDQ1ICs4NjUsNDcgQEAKICAgQnVtcEFsbG9jLlByaW50U3RhdHMoKTsKIH0KIAorUmVjb3JkRGVjbCAqQVNUQ29udGV4dDo6YnVpbGRJbXBsaWNpdFJlY29yZChTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkRGVjbDo6VGFnS2luZCBUSykgY29uc3QgeworICBTb3VyY2VMb2NhdGlvbiBMb2M7CisgIFJlY29yZERlY2wgKk5ld0RlY2w7CisgIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1cykKKyAgICBOZXdEZWNsID0gQ1hYUmVjb3JkRGVjbDo6Q3JlYXRlKCp0aGlzLCBUSywgZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpLCBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2MsICZJZGVudHMuZ2V0KE5hbWUpKTsKKyAgZWxzZQorICAgIE5ld0RlY2wgPSBSZWNvcmREZWNsOjpDcmVhdGUoKnRoaXMsIFRLLCBnZXRUcmFuc2xhdGlvblVuaXREZWNsKCksIExvYywgTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklkZW50cy5nZXQoTmFtZSkpOworICBOZXdEZWNsLT5zZXRJbXBsaWNpdCgpOworICByZXR1cm4gTmV3RGVjbDsKK30KKworVHlwZWRlZkRlY2wgKkFTVENvbnRleHQ6OmJ1aWxkSW1wbGljaXRUeXBlZGVmKFF1YWxUeXBlIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgVHlwZVNvdXJjZUluZm8gKlRJbmZvID0gZ2V0VHJpdmlhbFR5cGVTb3VyY2VJbmZvKFQpOworICBUeXBlZGVmRGVjbCAqTmV3RGVjbCA9IFR5cGVkZWZEZWNsOjpDcmVhdGUoCisgICAgICBjb25zdF9jYXN0PEFTVENvbnRleHQgJj4oKnRoaXMpLCBnZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCisgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCAmSWRlbnRzLmdldChOYW1lKSwgVEluZm8pOworICBOZXdEZWNsLT5zZXRJbXBsaWNpdCgpOworICByZXR1cm4gTmV3RGVjbDsKK30KKwogVHlwZWRlZkRlY2wgKkFTVENvbnRleHQ6OmdldEludDEyOERlY2woKSBjb25zdCB7Ci0gIGlmICghSW50MTI4RGVjbCkgewotICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbyA9IGdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhJbnQxMjhUeSk7Ci0gICAgSW50MTI4RGVjbCA9IFR5cGVkZWZEZWNsOjpDcmVhdGUoY29uc3RfY2FzdDxBU1RDb250ZXh0ICY+KCp0aGlzKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWRlbnRzLmdldCgiX19pbnQxMjhfdCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJbmZvKTsKLSAgfQotICAKKyAgaWYgKCFJbnQxMjhEZWNsKQorICAgIEludDEyOERlY2wgPSBidWlsZEltcGxpY2l0VHlwZWRlZihJbnQxMjhUeSwgIl9faW50MTI4X3QiKTsKICAgcmV0dXJuIEludDEyOERlY2w7CiB9CiAKIFR5cGVkZWZEZWNsICpBU1RDb250ZXh0OjpnZXRVSW50MTI4RGVjbCgpIGNvbnN0IHsKLSAgaWYgKCFVSW50MTI4RGVjbCkgewotICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbyA9IGdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhVbnNpZ25lZEludDEyOFR5KTsKLSAgICBVSW50MTI4RGVjbCA9IFR5cGVkZWZEZWNsOjpDcmVhdGUoY29uc3RfY2FzdDxBU1RDb250ZXh0ICY+KCp0aGlzKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWRlbnRzLmdldCgiX191aW50MTI4X3QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSW5mbyk7Ci0gIH0KLSAgCisgIGlmICghVUludDEyOERlY2wpCisgICAgVUludDEyOERlY2wgPSBidWlsZEltcGxpY2l0VHlwZWRlZihVbnNpZ25lZEludDEyOFR5LCAiX191aW50MTI4X3QiKTsKICAgcmV0dXJuIFVJbnQxMjhEZWNsOwogfQogCiBUeXBlRGVjbCAqQVNUQ29udGV4dDo6Z2V0RmxvYXQxMjhTdHViVHlwZSgpIGNvbnN0IHsKICAgYXNzZXJ0KExhbmdPcHRzLkNQbHVzUGx1cyAmJiAic2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBjKysiKTsKLSAgaWYgKCFGbG9hdDEyOFN0dWJEZWNsKSB7Ci0gICAgRmxvYXQxMjhTdHViRGVjbCA9IENYWFJlY29yZERlY2w6OkNyZWF0ZShjb25zdF9jYXN0PEFTVENvbnRleHQgJj4oKnRoaXMpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUS19TdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJZGVudHMuZ2V0KCJfX2Zsb2F0MTI4IikpOwotICB9Ci0gIAorICBpZiAoIUZsb2F0MTI4U3R1YkRlY2wpCisgICAgRmxvYXQxMjhTdHViRGVjbCA9IGJ1aWxkSW1wbGljaXRSZWNvcmQoIl9fZmxvYXQxMjgiKTsKKwogICByZXR1cm4gRmxvYXQxMjhTdHViRGVjbDsKIH0KIApAQCAtMTYxOCw3ICsxNjI4LDcgQEAKICAgfQogICBjYXNlIFR5cGU6Ok1lbWJlclBvaW50ZXI6IHsKICAgICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUID0gY2FzdDxNZW1iZXJQb2ludGVyVHlwZT4oVCk7Ci0gICAgbGx2bTo6dGllKFdpZHRoLCBBbGlnbikgPSBBQkktPmdldE1lbWJlclBvaW50ZXJXaWR0aEFuZEFsaWduKE1QVCk7CisgICAgc3RkOjp0aWUoV2lkdGgsIEFsaWduKSA9IEFCSS0+Z2V0TWVtYmVyUG9pbnRlcldpZHRoQW5kQWxpZ24oTVBUKTsKICAgICBicmVhazsKICAgfQogICBjYXNlIFR5cGU6OkNvbXBsZXg6IHsKQEAgLTE2MzIsOCArMTY0Miw5IEBACiAgIH0KICAgY2FzZSBUeXBlOjpPYmpDT2JqZWN0OgogICAgIHJldHVybiBnZXRUeXBlSW5mbyhjYXN0PE9iakNPYmplY3RUeXBlPihUKS0+Z2V0QmFzZVR5cGUoKS5nZXRUeXBlUHRyKCkpOworICBjYXNlIFR5cGU6OkFkanVzdGVkOgogICBjYXNlIFR5cGU6OkRlY2F5ZWQ6Ci0gICAgcmV0dXJuIGdldFR5cGVJbmZvKGNhc3Q8RGVjYXllZFR5cGU+KFQpLT5nZXREZWNheWVkVHlwZSgpLmdldFR5cGVQdHIoKSk7CisgICAgcmV0dXJuIGdldFR5cGVJbmZvKGNhc3Q8QWRqdXN0ZWRUeXBlPihUKS0+Z2V0QWRqdXN0ZWRUeXBlKCkuZ2V0VHlwZVB0cigpKTsKICAgY2FzZSBUeXBlOjpPYmpDSW50ZXJmYWNlOiB7CiAgICAgY29uc3QgT2JqQ0ludGVyZmFjZVR5cGUgKk9iakNJID0gY2FzdDxPYmpDSW50ZXJmYWNlVHlwZT4oVCk7CiAgICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZMYXlvdXQgPSBnZXRBU1RPYmpDSW50ZXJmYWNlTGF5b3V0KE9iakNJLT5nZXREZWNsKCkpOwpAQCAtMTc2MSwxMyArMTc3MiwxOCBAQAogICBpZiAoVGFyZ2V0LT5nZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4Y29yZSkKICAgICByZXR1cm4gQUJJQWxpZ247ICAvLyBOZXZlciBvdmVyYWxpZ24gb24gWENvcmUuCiAKKyAgY29uc3QgVHlwZWRlZlR5cGUgKlRUID0gVC0+Z2V0QXM8VHlwZWRlZlR5cGU+KCk7CisKICAgLy8gRG91YmxlIGFuZCBsb25nIGxvbmcgc2hvdWxkIGJlIG5hdHVyYWxseSBhbGlnbmVkIGlmIHBvc3NpYmxlLgotICBpZiAoY29uc3QgQ29tcGxleFR5cGUqIENUID0gVC0+Z2V0QXM8Q29tcGxleFR5cGU+KCkpCisgIGlmIChjb25zdCBDb21wbGV4VHlwZSAqQ1QgPSBULT5nZXRBczxDb21wbGV4VHlwZT4oKSkKICAgICBUID0gQ1QtPmdldEVsZW1lbnRUeXBlKCkuZ2V0VHlwZVB0cigpOwogICBpZiAoVC0+aXNTcGVjaWZpY0J1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlOjpEb3VibGUpIHx8CiAgICAgICBULT5pc1NwZWNpZmljQnVpbHRpblR5cGUoQnVpbHRpblR5cGU6OkxvbmdMb25nKSB8fAogICAgICAgVC0+aXNTcGVjaWZpY0J1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlOjpVTG9uZ0xvbmcpKQotICAgIHJldHVybiBzdGQ6Om1heChBQklBbGlnbiwgKHVuc2lnbmVkKWdldFR5cGVTaXplKFQpKTsKKyAgICAvLyBEb24ndCBpbmNyZWFzZSB0aGUgYWxpZ25tZW50IGlmIGFuIGFsaWdubWVudCBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZCBvbiBhCisgICAgLy8gdHlwZWRlZiBkZWNsYXJhdGlvbi4KKyAgICBpZiAoIVRUIHx8ICFUVC0+Z2V0RGVjbCgpLT5nZXRNYXhBbGlnbm1lbnQoKSkKKyAgICAgIHJldHVybiBzdGQ6Om1heChBQklBbGlnbiwgKHVuc2lnbmVkKWdldFR5cGVTaXplKFQpKTsKIAogICByZXR1cm4gQUJJQWxpZ247CiB9CkBAIC0xNzk2LDkgKzE4MTIsOCBAQAogICBpZiAoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKlN1cGVyQ2xhc3MgPSBPSS0+Z2V0U3VwZXJDbGFzcygpKQogICAgIERlZXBDb2xsZWN0T2JqQ0l2YXJzKFN1cGVyQ2xhc3MsIGZhbHNlLCBJdmFycyk7CiAgIGlmICghbGVhZkNsYXNzKSB7Ci0gICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6aXZhcl9pdGVyYXRvciBJID0gT0ktPml2YXJfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBPSS0+aXZhcl9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgICBJdmFycy5wdXNoX2JhY2soKkkpOworICAgIGZvciAoY29uc3QgYXV0byAqSSA6IE9JLT5pdmFycygpKQorICAgICAgSXZhcnMucHVzaF9iYWNrKEkpOwogICB9IGVsc2UgewogICAgIE9iakNJbnRlcmZhY2VEZWNsICpJRGVjbCA9IGNvbnN0X2Nhc3Q8T2JqQ0ludGVyZmFjZURlY2wgKj4oT0kpOwogICAgIGZvciAoY29uc3QgT2JqQ0l2YXJEZWNsICpJdiA9IElEZWNsLT5hbGxfZGVjbGFyZWRfaXZhcl9iZWdpbigpOyBJdjsgCkBAIC0xODE0LDI0ICsxODI5LDE3IEBACiAgIGlmIChjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqT0kgPSBkeW5fY2FzdDxPYmpDSW50ZXJmYWNlRGVjbD4oQ0RlY2wpKSB7CiAgICAgLy8gV2UgY2FuIHVzZSBwcm90b2NvbF9pdGVyYXRvciBoZXJlIGluc3RlYWQgb2YKICAgICAvLyBhbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9pdGVyYXRvciBzaW5jZSB3ZSBhcmUgd2Fsa2luZyBhbGwgY2F0ZWdvcmllcy4gICAgCi0gICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6YWxsX3Byb3RvY29sX2l0ZXJhdG9yIFAgPSBPSS0+YWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgIFBFID0gT0ktPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2VuZCgpOyBQICE9IFBFOyArK1ApIHsKLSAgICAgIE9iakNQcm90b2NvbERlY2wgKlByb3RvID0gKCpQKTsKKyAgICBmb3IgKGF1dG8gKlByb3RvIDogT0ktPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29scygpKSB7CiAgICAgICBQcm90b2NvbHMuaW5zZXJ0KFByb3RvLT5nZXRDYW5vbmljYWxEZWNsKCkpOwotICAgICAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBQID0gUHJvdG8tPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgICAgIFBFID0gUHJvdG8tPnByb3RvY29sX2VuZCgpOyBQICE9IFBFOyArK1ApIHsKLSAgICAgICAgUHJvdG9jb2xzLmluc2VydCgoKlApLT5nZXRDYW5vbmljYWxEZWNsKCkpOwotICAgICAgICBDb2xsZWN0SW5oZXJpdGVkUHJvdG9jb2xzKCpQLCBQcm90b2NvbHMpOworICAgICAgZm9yIChhdXRvICpQIDogUHJvdG8tPnByb3RvY29scygpKSB7CisgICAgICAgIFByb3RvY29scy5pbnNlcnQoUC0+Z2V0Q2Fub25pY2FsRGVjbCgpKTsKKyAgICAgICAgQ29sbGVjdEluaGVyaXRlZFByb3RvY29scyhQLCBQcm90b2NvbHMpOwogICAgICAgfQogICAgIH0KICAgICAKICAgICAvLyBDYXRlZ29yaWVzIG9mIHRoaXMgSW50ZXJmYWNlLgotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnZpc2libGVfY2F0ZWdvcmllc19pdGVyYXRvcgotICAgICAgICAgICBDYXQgPSBPSS0+dmlzaWJsZV9jYXRlZ29yaWVzX2JlZ2luKCksCi0gICAgICAgICAgIENhdEVuZCA9IE9JLT52aXNpYmxlX2NhdGVnb3JpZXNfZW5kKCk7Ci0gICAgICAgICBDYXQgIT0gQ2F0RW5kOyArK0NhdCkgewotICAgICAgQ29sbGVjdEluaGVyaXRlZFByb3RvY29scygqQ2F0LCBQcm90b2NvbHMpOwotICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gKkNhdCA6IE9JLT52aXNpYmxlX2NhdGVnb3JpZXMoKSkKKyAgICAgIENvbGxlY3RJbmhlcml0ZWRQcm90b2NvbHMoQ2F0LCBQcm90b2NvbHMpOwogCiAgICAgaWYgKE9iakNJbnRlcmZhY2VEZWNsICpTRCA9IE9JLT5nZXRTdXBlckNsYXNzKCkpCiAgICAgICB3aGlsZSAoU0QpIHsKQEAgLTE4MzksMjIgKzE4NDcsMTYgQEAKICAgICAgICAgU0QgPSBTRC0+Z2V0U3VwZXJDbGFzcygpOwogICAgICAgfQogICB9IGVsc2UgaWYgKGNvbnN0IE9iakNDYXRlZ29yeURlY2wgKk9DID0gZHluX2Nhc3Q8T2JqQ0NhdGVnb3J5RGVjbD4oQ0RlY2wpKSB7Ci0gICAgZm9yIChPYmpDQ2F0ZWdvcnlEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBQID0gT0MtPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgICBQRSA9IE9DLT5wcm90b2NvbF9lbmQoKTsgUCAhPSBQRTsgKytQKSB7Ci0gICAgICBPYmpDUHJvdG9jb2xEZWNsICpQcm90byA9ICgqUCk7CisgICAgZm9yIChhdXRvICpQcm90byA6IE9DLT5wcm90b2NvbHMoKSkgewogICAgICAgUHJvdG9jb2xzLmluc2VydChQcm90by0+Z2V0Q2Fub25pY2FsRGVjbCgpKTsKLSAgICAgIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUCA9IFByb3RvLT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICBQRSA9IFByb3RvLT5wcm90b2NvbF9lbmQoKTsgUCAhPSBQRTsgKytQKQotICAgICAgICBDb2xsZWN0SW5oZXJpdGVkUHJvdG9jb2xzKCpQLCBQcm90b2NvbHMpOworICAgICAgZm9yIChjb25zdCBhdXRvICpQIDogUHJvdG8tPnByb3RvY29scygpKQorICAgICAgICBDb2xsZWN0SW5oZXJpdGVkUHJvdG9jb2xzKFAsIFByb3RvY29scyk7CiAgICAgfQogICB9IGVsc2UgaWYgKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKk9QID0gZHluX2Nhc3Q8T2JqQ1Byb3RvY29sRGVjbD4oQ0RlY2wpKSB7Ci0gICAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBQID0gT1AtPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgICBQRSA9IE9QLT5wcm90b2NvbF9lbmQoKTsgUCAhPSBQRTsgKytQKSB7Ci0gICAgICBPYmpDUHJvdG9jb2xEZWNsICpQcm90byA9ICgqUCk7CisgICAgZm9yIChhdXRvICpQcm90byA6IE9QLT5wcm90b2NvbHMoKSkgewogICAgICAgUHJvdG9jb2xzLmluc2VydChQcm90by0+Z2V0Q2Fub25pY2FsRGVjbCgpKTsKLSAgICAgIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUCA9IFByb3RvLT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICBQRSA9IFByb3RvLT5wcm90b2NvbF9lbmQoKTsgUCAhPSBQRTsgKytQKQotICAgICAgICBDb2xsZWN0SW5oZXJpdGVkUHJvdG9jb2xzKCpQLCBQcm90b2NvbHMpOworICAgICAgZm9yIChjb25zdCBhdXRvICpQIDogUHJvdG8tPnByb3RvY29scygpKQorICAgICAgICBDb2xsZWN0SW5oZXJpdGVkUHJvdG9jb2xzKFAsIFByb3RvY29scyk7CiAgICAgfQogICB9CiB9CkBAIC0xODYyLDEyICsxODY0LDggQEAKIHVuc2lnbmVkIEFTVENvbnRleHQ6OkNvdW50Tm9uQ2xhc3NJdmFycyhjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqT0kpIGNvbnN0IHsKICAgdW5zaWduZWQgY291bnQgPSAwOyAgCiAgIC8vIENvdW50IGl2YXJzIGRlY2xhcmVkIGluIGNsYXNzIGV4dGVuc2lvbi4KLSAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6a25vd25fZXh0ZW5zaW9uc19pdGVyYXRvcgotICAgICAgICAgRXh0ID0gT0ktPmtub3duX2V4dGVuc2lvbnNfYmVnaW4oKSwKLSAgICAgICAgIEV4dEVuZCA9IE9JLT5rbm93bl9leHRlbnNpb25zX2VuZCgpOwotICAgICAgIEV4dCAhPSBFeHRFbmQ7ICsrRXh0KSB7CisgIGZvciAoY29uc3QgYXV0byAqRXh0IDogT0ktPmtub3duX2V4dGVuc2lvbnMoKSkKICAgICBjb3VudCArPSBFeHQtPml2YXJfc2l6ZSgpOwotICB9CiAgIAogICAvLyBDb3VudCBpdmFyIGRlZmluZWQgaW4gdGhpcyBjbGFzcydzIGltcGxlbWVudGF0aW9uLiAgVGhpcwogICAvLyBpbmNsdWRlcyBzeW50aGVzaXplZCBpdmFycy4KQEAgLTIwODAsMTIgKzIwNzgsMTIgQEAKIAogICBRdWFsVHlwZSBSZXN1bHQ7CiAgIGlmIChjb25zdCBGdW5jdGlvbk5vUHJvdG9UeXBlICpGTlBUID0gZHluX2Nhc3Q8RnVuY3Rpb25Ob1Byb3RvVHlwZT4oVCkpIHsKLSAgICBSZXN1bHQgPSBnZXRGdW5jdGlvbk5vUHJvdG9UeXBlKEZOUFQtPmdldFJlc3VsdFR5cGUoKSwgSW5mbyk7CisgICAgUmVzdWx0ID0gZ2V0RnVuY3Rpb25Ob1Byb3RvVHlwZShGTlBULT5nZXRSZXR1cm5UeXBlKCksIEluZm8pOwogICB9IGVsc2UgewogICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpGUFQgPSBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihUKTsKICAgICBGdW5jdGlvblByb3RvVHlwZTo6RXh0UHJvdG9JbmZvIEVQSSA9IEZQVC0+Z2V0RXh0UHJvdG9JbmZvKCk7CiAgICAgRVBJLkV4dEluZm8gPSBJbmZvOwotICAgIFJlc3VsdCA9IGdldEZ1bmN0aW9uVHlwZShGUFQtPmdldFJlc3VsdFR5cGUoKSwgRlBULT5nZXRBcmdUeXBlcygpLCBFUEkpOworICAgIFJlc3VsdCA9IGdldEZ1bmN0aW9uVHlwZShGUFQtPmdldFJldHVyblR5cGUoKSwgRlBULT5nZXRQYXJhbVR5cGVzKCksIEVQSSk7CiAgIH0KIAogICByZXR1cm4gY2FzdDxGdW5jdGlvblR5cGU+KFJlc3VsdC5nZXRUeXBlUHRyKCkpOwpAQCAtMjA5Nyw3ICsyMDk1LDcgQEAKICAgd2hpbGUgKHRydWUpIHsKICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0gRkQtPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwogICAgIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gRVBJID0gRlBULT5nZXRFeHRQcm90b0luZm8oKTsKLSAgICBGRC0+c2V0VHlwZShnZXRGdW5jdGlvblR5cGUoUmVzdWx0VHlwZSwgRlBULT5nZXRBcmdUeXBlcygpLCBFUEkpKTsKKyAgICBGRC0+c2V0VHlwZShnZXRGdW5jdGlvblR5cGUoUmVzdWx0VHlwZSwgRlBULT5nZXRQYXJhbVR5cGVzKCksIEVQSSkpOwogICAgIGlmIChGdW5jdGlvbkRlY2wgKk5leHQgPSBGRC0+Z2V0UHJldmlvdXNEZWNsKCkpCiAgICAgICBGRCA9IE5leHQ7CiAgICAgZWxzZQpAQCAtMjE2MywxNSArMjE2MSwzMCBAQAogICByZXR1cm4gUXVhbFR5cGUoTmV3LCAwKTsKIH0KIAorUXVhbFR5cGUgQVNUQ29udGV4dDo6Z2V0QWRqdXN0ZWRUeXBlKFF1YWxUeXBlIE9yaWcsIFF1YWxUeXBlIE5ldykgY29uc3QgeworICBsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEIElEOworICBBZGp1c3RlZFR5cGU6OlByb2ZpbGUoSUQsIE9yaWcsIE5ldyk7CisgIHZvaWQgKkluc2VydFBvcyA9IDA7CisgIEFkanVzdGVkVHlwZSAqQVQgPSBBZGp1c3RlZFR5cGVzLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIEluc2VydFBvcyk7CisgIGlmIChBVCkKKyAgICByZXR1cm4gUXVhbFR5cGUoQVQsIDApOworCisgIFF1YWxUeXBlIENhbm9uaWNhbCA9IGdldENhbm9uaWNhbFR5cGUoTmV3KTsKKworICAvLyBHZXQgdGhlIG5ldyBpbnNlcnQgcG9zaXRpb24gZm9yIHRoZSBub2RlIHdlIGNhcmUgYWJvdXQuCisgIEFUID0gQWRqdXN0ZWRUeXBlcy5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJbnNlcnRQb3MpOworICBhc3NlcnQoQVQgPT0gMCAmJiAiU2hvdWxkbid0IGJlIGluIHRoZSBtYXAhIik7CisKKyAgQVQgPSBuZXcgKCp0aGlzLCBUeXBlQWxpZ25tZW50KQorICAgICAgQWRqdXN0ZWRUeXBlKFR5cGU6OkFkanVzdGVkLCBPcmlnLCBOZXcsIENhbm9uaWNhbCk7CisgIFR5cGVzLnB1c2hfYmFjayhBVCk7CisgIEFkanVzdGVkVHlwZXMuSW5zZXJ0Tm9kZShBVCwgSW5zZXJ0UG9zKTsKKyAgcmV0dXJuIFF1YWxUeXBlKEFULCAwKTsKK30KKwogUXVhbFR5cGUgQVNUQ29udGV4dDo6Z2V0RGVjYXllZFR5cGUoUXVhbFR5cGUgVCkgY29uc3QgewogICBhc3NlcnQoKFQtPmlzQXJyYXlUeXBlKCkgfHwgVC0+aXNGdW5jdGlvblR5cGUoKSkgJiYgIlQgZG9lcyBub3QgZGVjYXkiKTsKIAotICBsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEIElEOwotICBEZWNheWVkVHlwZTo6UHJvZmlsZShJRCwgVCk7Ci0gIHZvaWQgKkluc2VydFBvcyA9IDA7Ci0gIGlmIChEZWNheWVkVHlwZSAqRFQgPSBEZWNheWVkVHlwZXMuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSW5zZXJ0UG9zKSkKLSAgICByZXR1cm4gUXVhbFR5cGUoRFQsIDApOwotCiAgIFF1YWxUeXBlIERlY2F5ZWQ7CiAKICAgLy8gQzk5IDYuNy41LjNwNzoKQEAgLTIxODksMTcgKzIyMDIsMjMgQEAKICAgaWYgKFQtPmlzRnVuY3Rpb25UeXBlKCkpCiAgICAgRGVjYXllZCA9IGdldFBvaW50ZXJUeXBlKFQpOwogCisgIGxsdm06OkZvbGRpbmdTZXROb2RlSUQgSUQ7CisgIEFkanVzdGVkVHlwZTo6UHJvZmlsZShJRCwgVCwgRGVjYXllZCk7CisgIHZvaWQgKkluc2VydFBvcyA9IDA7CisgIEFkanVzdGVkVHlwZSAqQVQgPSBBZGp1c3RlZFR5cGVzLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIEluc2VydFBvcyk7CisgIGlmIChBVCkKKyAgICByZXR1cm4gUXVhbFR5cGUoQVQsIDApOworCiAgIFF1YWxUeXBlIENhbm9uaWNhbCA9IGdldENhbm9uaWNhbFR5cGUoRGVjYXllZCk7CiAKICAgLy8gR2V0IHRoZSBuZXcgaW5zZXJ0IHBvc2l0aW9uIGZvciB0aGUgbm9kZSB3ZSBjYXJlIGFib3V0LgotICBEZWNheWVkVHlwZSAqTmV3SVAgPSBEZWNheWVkVHlwZXMuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSW5zZXJ0UG9zKTsKLSAgYXNzZXJ0KE5ld0lQID09IDAgJiYgIlNob3VsZG4ndCBiZSBpbiB0aGUgbWFwISIpOyAodm9pZClOZXdJUDsKKyAgQVQgPSBBZGp1c3RlZFR5cGVzLkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIEluc2VydFBvcyk7CisgIGFzc2VydChBVCA9PSAwICYmICJTaG91bGRuJ3QgYmUgaW4gdGhlIG1hcCEiKTsKIAotICBEZWNheWVkVHlwZSAqTmV3ID0KLSAgICAgIG5ldyAoKnRoaXMsIFR5cGVBbGlnbm1lbnQpIERlY2F5ZWRUeXBlKFQsIERlY2F5ZWQsIENhbm9uaWNhbCk7Ci0gIFR5cGVzLnB1c2hfYmFjayhOZXcpOwotICBEZWNheWVkVHlwZXMuSW5zZXJ0Tm9kZShOZXcsIEluc2VydFBvcyk7Ci0gIHJldHVybiBRdWFsVHlwZShOZXcsIDApOworICBBVCA9IG5ldyAoKnRoaXMsIFR5cGVBbGlnbm1lbnQpIERlY2F5ZWRUeXBlKFQsIERlY2F5ZWQsIENhbm9uaWNhbCk7CisgIFR5cGVzLnB1c2hfYmFjayhBVCk7CisgIEFkanVzdGVkVHlwZXMuSW5zZXJ0Tm9kZShBVCwgSW5zZXJ0UG9zKTsKKyAgcmV0dXJuIFF1YWxUeXBlKEFULCAwKTsKIH0KIAogLy8vIGdldEJsb2NrUG9pbnRlclR5cGUgLSBSZXR1cm4gdGhlIHVuaXF1ZWQgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIGZvcgpAQCAtMjc5OCw4ICsyODE3LDYgQEAKICAgICAgICAgICBULmdldE9iakNMaWZldGltZSgpID09IFF1YWxpZmllcnM6Ok9DTF9FeHBsaWNpdE5vbmUpOwogfQogCi0vLy8gZ2V0RnVuY3Rpb25UeXBlIC0gUmV0dXJuIGEgbm9ybWFsIGZ1bmN0aW9uIHR5cGUgd2l0aCBhIHR5cGVkIGFyZ3VtZW50Ci0vLy8gbGlzdC4gIGlzVmFyaWFkaWMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGxpc3QgaW5jbHVkZXMgJy4uLicuCiBRdWFsVHlwZQogQVNUQ29udGV4dDo6Z2V0RnVuY3Rpb25UeXBlKFF1YWxUeXBlIFJlc3VsdFR5LCBBcnJheVJlZjxRdWFsVHlwZT4gQXJnQXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyAmRVBJKSBjb25zdCB7CkBAIC0yODczLDcgKzI4OTAsNyBAQAogICB9IGVsc2UgaWYgKEVQSS5FeGNlcHRpb25TcGVjVHlwZSA9PSBFU1RfVW5ldmFsdWF0ZWQpIHsKICAgICBTaXplICs9IHNpemVvZihGdW5jdGlvbkRlY2wqKTsKICAgfQotICBpZiAoRVBJLkNvbnN1bWVkQXJndW1lbnRzKQorICBpZiAoRVBJLkNvbnN1bWVkUGFyYW1ldGVycykKICAgICBTaXplICs9IE51bUFyZ3MgKiBzaXplb2YoYm9vbCk7CiAKICAgRnVuY3Rpb25Qcm90b1R5cGUgKkZUUCA9IChGdW5jdGlvblByb3RvVHlwZSopIEFsbG9jYXRlKFNpemUsIFR5cGVBbGlnbm1lbnQpOwpAQCAtMzUwNyw2ICszNTI0LDU2IEBACiAgIHJldHVybiBRdWFsVHlwZShULCAwKTsKIH0KIAorLy8vIE9iakNPYmplY3RBZG9wdHNRVHlwZVByb3RvY29scyAtIENoZWNrcyB0aGF0IHByb3RvY29scyBpbiBJQydzCisvLy8gcHJvdG9jb2wgbGlzdCBhZG9wdCBhbGwgcHJvdG9jb2xzIGluIFFUJ3MgcXVhbGlmaWVkLWlkIHByb3RvY29sCisvLy8gbGlzdC4KK2Jvb2wgQVNUQ29udGV4dDo6T2JqQ09iamVjdEFkb3B0c1FUeXBlUHJvdG9jb2xzKFF1YWxUeXBlIFFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKklDKSB7CisgIGlmICghUVQtPmlzT2JqQ1F1YWxpZmllZElkVHlwZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIGlmIChjb25zdCBPYmpDT2JqZWN0UG9pbnRlclR5cGUgKk9QVCA9IFFULT5nZXRBczxPYmpDT2JqZWN0UG9pbnRlclR5cGU+KCkpIHsKKyAgICAvLyBJZiBib3RoIHRoZSByaWdodCBhbmQgbGVmdCBzaWRlcyBoYXZlIHF1YWxpZmllcnMuCisgICAgZm9yIChhdXRvICpQcm90byA6IE9QVC0+cXVhbHMoKSkgeworICAgICAgaWYgKCFJQy0+Q2xhc3NJbXBsZW1lbnRzUHJvdG9jb2woUHJvdG8sIGZhbHNlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBRSWRQcm90b2NvbHNBZG9wdE9iakNPYmplY3RQcm90b2NvbHMgLSBDaGVja3MgdGhhdCBwcm90b2NvbHMgaW4KKy8vLyBRVCdzIHF1YWxpZmllZC1pZCBwcm90b2NvbCBsaXN0IGFkb3B0IGFsbCBwcm90b2NvbHMgaW4gSURlY2wncyBsaXN0CisvLy8gb2YgcHJvdG9jb2xzLgorYm9vbCBBU1RDb250ZXh0OjpRSWRQcm90b2NvbHNBZG9wdE9iakNPYmplY3RQcm90b2NvbHMoUXVhbFR5cGUgUVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDSW50ZXJmYWNlRGVjbCAqSURlY2wpIHsKKyAgaWYgKCFRVC0+aXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBjb25zdCBPYmpDT2JqZWN0UG9pbnRlclR5cGUgKk9QVCA9IFFULT5nZXRBczxPYmpDT2JqZWN0UG9pbnRlclR5cGU+KCk7CisgIGlmICghT1BUKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFJRGVjbC0+aGFzRGVmaW5pdGlvbigpKQorICAgIHJldHVybiBmYWxzZTsKKyAgbGx2bTo6U21hbGxQdHJTZXQ8T2JqQ1Byb3RvY29sRGVjbCAqLCA4PiBJbmhlcml0ZWRQcm90b2NvbHM7CisgIENvbGxlY3RJbmhlcml0ZWRQcm90b2NvbHMoSURlY2wsIEluaGVyaXRlZFByb3RvY29scyk7CisgIGlmIChJbmhlcml0ZWRQcm90b2NvbHMuZW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgICAgICAKKyAgZm9yIChhdXRvICpQSSA6IEluaGVyaXRlZFByb3RvY29scykgeworICAgIC8vIElmIGJvdGggdGhlIHJpZ2h0IGFuZCBsZWZ0IHNpZGVzIGhhdmUgcXVhbGlmaWVycy4KKyAgICBib29sIEFkb3B0cyA9IGZhbHNlOworICAgIGZvciAoYXV0byAqUHJvdG8gOiBPUFQtPnF1YWxzKCkpIHsKKyAgICAgIC8vIHJldHVybiAndHJ1ZScgaWYgJypQSScgaXMgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBvZiBQcm90bworICAgICAgaWYgKChBZG9wdHMgPSBQcm90b2NvbENvbXBhdGlibGVXaXRoUHJvdG9jb2woUEksIFByb3RvKSkpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIUFkb3B0cykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwogLy8vIGdldE9iakNPYmplY3RQb2ludGVyVHlwZSAtIFJldHVybiBhIE9iakNPYmplY3RQb2ludGVyVHlwZSB0eXBlIGZvcgogLy8vIHRoZSBnaXZlbiBvYmplY3QgdHlwZS4KIFF1YWxUeXBlIEFTVENvbnRleHQ6OmdldE9iakNPYmplY3RQb2ludGVyVHlwZShRdWFsVHlwZSBPYmplY3RUKSBjb25zdCB7CkBAIC00NDc5LDIyICs0NTQ2LDEwIEBACiAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgUmVjb3JkRGVjbCAqCi1DcmVhdGVSZWNvcmREZWNsKGNvbnN0IEFTVENvbnRleHQgJkN0eCwgUmVjb3JkRGVjbDo6VGFnS2luZCBUSywKLSAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQgKkRDLCBJZGVudGlmaWVySW5mbyAqSWQpIHsKLSAgU291cmNlTG9jYXRpb24gTG9jOwotICBpZiAoQ3R4LmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKQotICAgIHJldHVybiBDWFhSZWNvcmREZWNsOjpDcmVhdGUoQ3R4LCBUSywgREMsIExvYywgTG9jLCBJZCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gUmVjb3JkRGVjbDo6Q3JlYXRlKEN0eCwgVEssIERDLCBMb2MsIExvYywgSWQpOwotfQotCiAvLyBnZXRDRkNvbnN0YW50U3RyaW5nVHlwZSAtIFJldHVybiB0aGUgdHlwZSB1c2VkIGZvciBjb25zdGFudCBDRlN0cmluZ3MuCiBRdWFsVHlwZSBBU1RDb250ZXh0OjpnZXRDRkNvbnN0YW50U3RyaW5nVHlwZSgpIGNvbnN0IHsKICAgaWYgKCFDRkNvbnN0YW50U3RyaW5nVHlwZURlY2wpIHsKLSAgICBDRkNvbnN0YW50U3RyaW5nVHlwZURlY2wgPQotICAgICAgQ3JlYXRlUmVjb3JkRGVjbCgqdGhpcywgVFRLX1N0cnVjdCwgVFVEZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAmSWRlbnRzLmdldCgiTlNDb25zdGFudFN0cmluZyIpKTsKKyAgICBDRkNvbnN0YW50U3RyaW5nVHlwZURlY2wgPSBidWlsZEltcGxpY2l0UmVjb3JkKCJOU0NvbnN0YW50U3RyaW5nIik7CiAgICAgQ0ZDb25zdGFudFN0cmluZ1R5cGVEZWNsLT5zdGFydERlZmluaXRpb24oKTsKIAogICAgIFF1YWxUeXBlIEZpZWxkVHlwZXNbNF07CkBAIC00NTI5LDggKzQ1ODQsNyBAQAogCiBRdWFsVHlwZSBBU1RDb250ZXh0OjpnZXRPYmpDU3VwZXJUeXBlKCkgY29uc3QgewogICBpZiAoT2JqQ1N1cGVyVHlwZS5pc051bGwoKSkgewotICAgIFJlY29yZERlY2wgKk9iakNTdXBlclR5cGVEZWNsICA9Ci0gICAgICBDcmVhdGVSZWNvcmREZWNsKCp0aGlzLCBUVEtfU3RydWN0LCBUVURlY2wsICZJZGVudHMuZ2V0KCJvYmpjX3N1cGVyIikpOworICAgIFJlY29yZERlY2wgKk9iakNTdXBlclR5cGVEZWNsID0gYnVpbGRJbXBsaWNpdFJlY29yZCgib2JqY19zdXBlciIpOwogICAgIFRVRGVjbC0+YWRkRGVjbChPYmpDU3VwZXJUeXBlRGVjbCk7CiAgICAgT2JqQ1N1cGVyVHlwZSA9IGdldFRhZ0RlY2xUeXBlKE9iakNTdXBlclR5cGVEZWNsKTsKICAgfQpAQCAtNDU0NywxMiArNDYwMSwxMSBAQAogICBpZiAoQmxvY2tEZXNjcmlwdG9yVHlwZSkKICAgICByZXR1cm4gZ2V0VGFnRGVjbFR5cGUoQmxvY2tEZXNjcmlwdG9yVHlwZSk7CiAKLSAgUmVjb3JkRGVjbCAqVDsKKyAgUmVjb3JkRGVjbCAqUkQ7CiAgIC8vIEZJWE1FOiBOZWVkcyB0aGUgRmxhZ0FwcGxlQmxvY2sgYml0LgotICBUID0gQ3JlYXRlUmVjb3JkRGVjbCgqdGhpcywgVFRLX1N0cnVjdCwgVFVEZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAmSWRlbnRzLmdldCgiX19ibG9ja19kZXNjcmlwdG9yIikpOwotICBULT5zdGFydERlZmluaXRpb24oKTsKLSAgCisgIFJEID0gYnVpbGRJbXBsaWNpdFJlY29yZCgiX19ibG9ja19kZXNjcmlwdG9yIik7CisgIFJELT5zdGFydERlZmluaXRpb24oKTsKKwogICBRdWFsVHlwZSBGaWVsZFR5cGVzW10gPSB7CiAgICAgVW5zaWduZWRMb25nVHksCiAgICAgVW5zaWduZWRMb25nVHksCkBAIC00NTY0LDIwICs0NjE3LDE3IEBACiAgIH07CiAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBGaWVsZERlY2wgKkZpZWxkID0gRmllbGREZWNsOjpDcmVhdGUoKnRoaXMsIFQsIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJZGVudHMuZ2V0KEZpZWxkTmFtZXNbaV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFR5cGVzW2ldLCAvKlRJbmZvPSovMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypCaXRXaWR0aD0qLzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qTXV0YWJsZT0qL2ZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ0lTX05vSW5pdCk7CisgICAgRmllbGREZWNsICpGaWVsZCA9IEZpZWxkRGVjbDo6Q3JlYXRlKAorICAgICAgICAqdGhpcywgUkQsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICZJZGVudHMuZ2V0KEZpZWxkTmFtZXNbaV0pLCBGaWVsZFR5cGVzW2ldLCAvKlRJbmZvPSovMCwKKyAgICAgICAgLypCaXRXaWR0aD0qLzAsIC8qTXV0YWJsZT0qL2ZhbHNlLCBJQ0lTX05vSW5pdCk7CiAgICAgRmllbGQtPnNldEFjY2VzcyhBU19wdWJsaWMpOwotICAgIFQtPmFkZERlY2woRmllbGQpOworICAgIFJELT5hZGREZWNsKEZpZWxkKTsKICAgfQogCi0gIFQtPmNvbXBsZXRlRGVmaW5pdGlvbigpOworICBSRC0+Y29tcGxldGVEZWZpbml0aW9uKCk7CiAKLSAgQmxvY2tEZXNjcmlwdG9yVHlwZSA9IFQ7CisgIEJsb2NrRGVzY3JpcHRvclR5cGUgPSBSRDsKIAogICByZXR1cm4gZ2V0VGFnRGVjbFR5cGUoQmxvY2tEZXNjcmlwdG9yVHlwZSk7CiB9CkBAIC00NTg2LDEyICs0NjM2LDExIEBACiAgIGlmIChCbG9ja0Rlc2NyaXB0b3JFeHRlbmRlZFR5cGUpCiAgICAgcmV0dXJuIGdldFRhZ0RlY2xUeXBlKEJsb2NrRGVzY3JpcHRvckV4dGVuZGVkVHlwZSk7CiAKLSAgUmVjb3JkRGVjbCAqVDsKKyAgUmVjb3JkRGVjbCAqUkQ7CiAgIC8vIEZJWE1FOiBOZWVkcyB0aGUgRmxhZ0FwcGxlQmxvY2sgYml0LgotICBUID0gQ3JlYXRlUmVjb3JkRGVjbCgqdGhpcywgVFRLX1N0cnVjdCwgVFVEZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAmSWRlbnRzLmdldCgiX19ibG9ja19kZXNjcmlwdG9yX3dpdGhjb3B5ZGlzcG9zZSIpKTsKLSAgVC0+c3RhcnREZWZpbml0aW9uKCk7Ci0gIAorICBSRCA9IGJ1aWxkSW1wbGljaXRSZWNvcmQoIl9fYmxvY2tfZGVzY3JpcHRvcl93aXRoY29weWRpc3Bvc2UiKTsKKyAgUkQtPnN0YXJ0RGVmaW5pdGlvbigpOworCiAgIFF1YWxUeXBlIEZpZWxkVHlwZXNbXSA9IHsKICAgICBVbnNpZ25lZExvbmdUeSwKICAgICBVbnNpZ25lZExvbmdUeSwKQEAgLTQ2MDcsMjEgKzQ2NTYsMTggQEAKICAgfTsKIAogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIEZpZWxkRGVjbCAqRmllbGQgPSBGaWVsZERlY2w6OkNyZWF0ZSgqdGhpcywgVCwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklkZW50cy5nZXQoRmllbGROYW1lc1tpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkVHlwZXNbaV0sIC8qVEluZm89Ki8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkJpdFdpZHRoPSovMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNdXRhYmxlPSovZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDSVNfTm9Jbml0KTsKKyAgICBGaWVsZERlY2wgKkZpZWxkID0gRmllbGREZWNsOjpDcmVhdGUoCisgICAgICAgICp0aGlzLCBSRCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgJklkZW50cy5nZXQoRmllbGROYW1lc1tpXSksIEZpZWxkVHlwZXNbaV0sIC8qVEluZm89Ki8wLAorICAgICAgICAvKkJpdFdpZHRoPSovMCwKKyAgICAgICAgLypNdXRhYmxlPSovZmFsc2UsIElDSVNfTm9Jbml0KTsKICAgICBGaWVsZC0+c2V0QWNjZXNzKEFTX3B1YmxpYyk7Ci0gICAgVC0+YWRkRGVjbChGaWVsZCk7CisgICAgUkQtPmFkZERlY2woRmllbGQpOwogICB9CiAKLSAgVC0+Y29tcGxldGVEZWZpbml0aW9uKCk7CisgIFJELT5jb21wbGV0ZURlZmluaXRpb24oKTsKIAotICBCbG9ja0Rlc2NyaXB0b3JFeHRlbmRlZFR5cGUgPSBUOwotCisgIEJsb2NrRGVzY3JpcHRvckV4dGVuZGVkVHlwZSA9IFJEOwogICByZXR1cm4gZ2V0VGFnRGVjbFR5cGUoQmxvY2tEZXNjcmlwdG9yRXh0ZW5kZWRUeXBlKTsKIH0KIApAQCAtNDY5MSwxMiArNDczNyw4IEBACiAKIFR5cGVkZWZEZWNsICpBU1RDb250ZXh0OjpnZXRPYmpDSW5zdGFuY2VUeXBlRGVjbCgpIHsKICAgaWYgKCFPYmpDSW5zdGFuY2VUeXBlRGVjbCkKLSAgICBPYmpDSW5zdGFuY2VUeXBlRGVjbCA9IFR5cGVkZWZEZWNsOjpDcmVhdGUoKnRoaXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWRlbnRzLmdldCgiaW5zdGFuY2V0eXBlIiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhnZXRPYmpDSWRUeXBlKCkpKTsKKyAgICBPYmpDSW5zdGFuY2VUeXBlRGVjbCA9CisgICAgICAgIGJ1aWxkSW1wbGljaXRUeXBlZGVmKGdldE9iakNJZFR5cGUoKSwgImluc3RhbmNldHlwZSIpOwogICByZXR1cm4gT2JqQ0luc3RhbmNlVHlwZURlY2w7CiB9CiAKQEAgLTQ3NDIsMjEgKzQ3ODQsMTkgQEAKICAgICAgIEV4cHItPmdldFR5cGUoKS0+Z2V0QXM8QmxvY2tQb2ludGVyVHlwZT4oKS0+Z2V0UG9pbnRlZVR5cGUoKTsKICAgLy8gRW5jb2RlIHJlc3VsdCB0eXBlLgogICBpZiAoZ2V0TGFuZ09wdHMoKS5FbmNvZGVFeHRlbmRlZEJsb2NrU2lnKQotICAgIGdldE9iakNFbmNvZGluZ0Zvck1ldGhvZFBhcmFtZXRlcihEZWNsOjpPQkpDX1RRX05vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tUeS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpLT5nZXRSZXN1bHRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUywgdHJ1ZSAvKkV4dGVuZGVkKi8pOworICAgIGdldE9iakNFbmNvZGluZ0Zvck1ldGhvZFBhcmFtZXRlcigKKyAgICAgICAgRGVjbDo6T0JKQ19UUV9Ob25lLCBCbG9ja1R5LT5nZXRBczxGdW5jdGlvblR5cGU+KCktPmdldFJldHVyblR5cGUoKSwgUywKKyAgICAgICAgdHJ1ZSAvKkV4dGVuZGVkKi8pOwogICBlbHNlCi0gICAgZ2V0T2JqQ0VuY29kaW5nRm9yVHlwZShCbG9ja1R5LT5nZXRBczxGdW5jdGlvblR5cGU+KCktPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFMpOworICAgIGdldE9iakNFbmNvZGluZ0ZvclR5cGUoQmxvY2tUeS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpLT5nZXRSZXR1cm5UeXBlKCksIFMpOwogICAvLyBDb21wdXRlIHNpemUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgIC8vIFN0YXJ0IHdpdGggY29tcHV0aW5nIHNpemUgb2YgYSBwb2ludGVyIGluIG51bWJlciBvZiBieXRlcy4KICAgLy8gRklYTUU6IFRoZXJlIG1pZ2h0KHNob3VsZCkgYmUgYSBiZXR0ZXIgd2F5IG9mIGRvaW5nIHRoaXMgY29tcHV0YXRpb24hCiAgIFNvdXJjZUxvY2F0aW9uIExvYzsKICAgQ2hhclVuaXRzIFB0clNpemUgPSBnZXRUeXBlU2l6ZUluQ2hhcnMoVm9pZFB0clR5KTsKICAgQ2hhclVuaXRzIFBhcm1PZmZzZXQgPSBQdHJTaXplOwotICBmb3IgKEJsb2NrRGVjbDo6cGFyYW1fY29uc3RfaXRlcmF0b3IgUEkgPSBEZWNsLT5wYXJhbV9iZWdpbigpLAotICAgICAgIEUgPSBEZWNsLT5wYXJhbV9lbmQoKTsgUEkgIT0gRTsgKytQSSkgewotICAgIFF1YWxUeXBlIFBUeXBlID0gKCpQSSktPmdldFR5cGUoKTsKKyAgZm9yIChhdXRvIFBJIDogRGVjbC0+cGFyYW1zKCkpIHsKKyAgICBRdWFsVHlwZSBQVHlwZSA9IFBJLT5nZXRUeXBlKCk7CiAgICAgQ2hhclVuaXRzIHN6ID0gZ2V0T2JqQ0VuY29kaW5nVHlwZVNpemUoUFR5cGUpOwogICAgIGlmIChzei5pc1plcm8oKSkKICAgICAgIGNvbnRpbnVlOwpAQCAtNDc3MCw5ICs0ODEwLDcgQEAKICAgCiAgIC8vIEFyZ3VtZW50IHR5cGVzLgogICBQYXJtT2Zmc2V0ID0gUHRyU2l6ZTsKLSAgZm9yIChCbG9ja0RlY2w6OnBhcmFtX2NvbnN0X2l0ZXJhdG9yIFBJID0gRGVjbC0+cGFyYW1fYmVnaW4oKSwgRSA9Ci0gICAgICAgRGVjbC0+cGFyYW1fZW5kKCk7IFBJICE9IEU7ICsrUEkpIHsKLSAgICBQYXJtVmFyRGVjbCAqUFZEZWNsID0gKlBJOworICBmb3IgKGF1dG8gUFZEZWNsIDogRGVjbC0+cGFyYW1zKCkpIHsKICAgICBRdWFsVHlwZSBQVHlwZSA9IFBWRGVjbC0+Z2V0T3JpZ2luYWxUeXBlKCk7IAogICAgIGlmIChjb25zdCBBcnJheVR5cGUgKkFUID0KICAgICAgICAgICBkeW5fY2FzdDxBcnJheVR5cGU+KFBUeXBlLT5nZXRDYW5vbmljYWxUeXBlSW50ZXJuYWwoKSkpIHsKQEAgLTQ3OTcsMTIgKzQ4MzUsMTEgQEAKIGJvb2wgQVNUQ29udGV4dDo6Z2V0T2JqQ0VuY29kaW5nRm9yRnVuY3Rpb25EZWNsKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nJiBTKSB7CiAgIC8vIEVuY29kZSByZXN1bHQgdHlwZS4KLSAgZ2V0T2JqQ0VuY29kaW5nRm9yVHlwZShEZWNsLT5nZXRSZXN1bHRUeXBlKCksIFMpOworICBnZXRPYmpDRW5jb2RpbmdGb3JUeXBlKERlY2wtPmdldFJldHVyblR5cGUoKSwgUyk7CiAgIENoYXJVbml0cyBQYXJtT2Zmc2V0OwogICAvLyBDb21wdXRlIHNpemUgb2YgYWxsIHBhcmFtZXRlcnMuCi0gIGZvciAoRnVuY3Rpb25EZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBQSSA9IERlY2wtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgRSA9IERlY2wtPnBhcmFtX2VuZCgpOyBQSSAhPSBFOyArK1BJKSB7Ci0gICAgUXVhbFR5cGUgUFR5cGUgPSAoKlBJKS0+Z2V0VHlwZSgpOworICBmb3IgKGF1dG8gUEkgOiBEZWNsLT5wYXJhbXMoKSkgeworICAgIFF1YWxUeXBlIFBUeXBlID0gUEktPmdldFR5cGUoKTsKICAgICBDaGFyVW5pdHMgc3ogPSBnZXRPYmpDRW5jb2RpbmdUeXBlU2l6ZShQVHlwZSk7CiAgICAgaWYgKHN6LmlzWmVybygpKQogICAgICAgY29udGludWU7CkBAIC00ODE1LDkgKzQ4NTIsNyBAQAogICBQYXJtT2Zmc2V0ID0gQ2hhclVuaXRzOjpaZXJvKCk7CiAKICAgLy8gQXJndW1lbnQgdHlwZXMuCi0gIGZvciAoRnVuY3Rpb25EZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBQSSA9IERlY2wtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgRSA9IERlY2wtPnBhcmFtX2VuZCgpOyBQSSAhPSBFOyArK1BJKSB7Ci0gICAgUGFybVZhckRlY2wgKlBWRGVjbCA9ICpQSTsKKyAgZm9yIChhdXRvIFBWRGVjbCA6IERlY2wtPnBhcmFtcygpKSB7CiAgICAgUXVhbFR5cGUgUFR5cGUgPSBQVkRlY2wtPmdldE9yaWdpbmFsVHlwZSgpOwogICAgIGlmIChjb25zdCBBcnJheVR5cGUgKkFUID0KICAgICAgICAgICBkeW5fY2FzdDxBcnJheVR5cGU+KFBUeXBlLT5nZXRDYW5vbmljYWxUeXBlSW50ZXJuYWwoKSkpIHsKQEAgLTQ4NTksOCArNDg5NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHRlbmRlZCkgY29uc3QgewogICAvLyBGSVhNRTogVGhpcyBpcyBub3QgdmVyeSBlZmZpY2llbnQuCiAgIC8vIEVuY29kZSByZXR1cm4gdHlwZS4KLSAgZ2V0T2JqQ0VuY29kaW5nRm9yTWV0aG9kUGFyYW1ldGVyKERlY2wtPmdldE9iakNEZWNsUXVhbGlmaWVyKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbC0+Z2V0UmVzdWx0VHlwZSgpLCBTLCBFeHRlbmRlZCk7CisgIGdldE9iakNFbmNvZGluZ0Zvck1ldGhvZFBhcmFtZXRlcihEZWNsLT5nZXRPYmpDRGVjbFF1YWxpZmllcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbC0+Z2V0UmV0dXJuVHlwZSgpLCBTLCBFeHRlbmRlZCk7CiAgIC8vIENvbXB1dGUgc2l6ZSBvZiBhbGwgcGFyYW1ldGVycy4KICAgLy8gU3RhcnQgd2l0aCBjb21wdXRpbmcgc2l6ZSBvZiBhIHBvaW50ZXIgaW4gbnVtYmVyIG9mIGJ5dGVzLgogICAvLyBGSVhNRTogVGhlcmUgbWlnaHQoc2hvdWxkKSBiZSBhIGJldHRlciB3YXkgb2YgZG9pbmcgdGhpcyBjb21wdXRhdGlvbiEKQEAgLTQ5MDcsNiArNDk0MiwyNiBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKK09iakNQcm9wZXJ0eUltcGxEZWNsICoKK0FTVENvbnRleHQ6OmdldE9iakNQcm9wZXJ0eUltcGxEZWNsRm9yUHJvcGVydHlEZWNsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICpQRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbCAqQ29udGFpbmVyKSBjb25zdCB7CisgIGlmICghQ29udGFpbmVyKQorICAgIHJldHVybiAwOworICBpZiAoY29uc3QgT2JqQ0NhdGVnb3J5SW1wbERlY2wgKkNJRCA9CisgICAgICBkeW5fY2FzdDxPYmpDQ2F0ZWdvcnlJbXBsRGVjbD4oQ29udGFpbmVyKSkgeworICAgIGZvciAoYXV0byAqUElEIDogQ0lELT5wcm9wZXJ0eV9pbXBscygpKQorICAgICAgaWYgKFBJRC0+Z2V0UHJvcGVydHlEZWNsKCkgPT0gUEQpCisgICAgICAgIHJldHVybiBQSUQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKk9JRD1jYXN0PE9iakNJbXBsZW1lbnRhdGlvbkRlY2w+KENvbnRhaW5lcik7CisgICAgICBmb3IgKGF1dG8gKlBJRCA6IE9JRC0+cHJvcGVydHlfaW1wbHMoKSkKKyAgICAgICAgaWYgKFBJRC0+Z2V0UHJvcGVydHlEZWNsKCkgPT0gUEQpCisgICAgICAgICAgcmV0dXJuIFBJRDsKKyAgICB9CisgIHJldHVybiAwOworfQorCiAvLy8gZ2V0T2JqQ0VuY29kaW5nRm9yUHJvcGVydHlEZWNsIC0gUmV0dXJuIHRoZSBlbmNvZGVkIHR5cGUgZm9yIHRoaXMKIC8vLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbi4gSWYgbm9uLU5VTEwsIENvbnRhaW5lciBtdXN0IGJlIGVpdGhlciBhbgogLy8vIE9iakNDYXRlZ29yeUltcGxEZWNsIG9yIE9iakNJbXBsZW1lbnRhdGlvbkRlY2w7IGl0IHNob3VsZCBvbmx5IGJlCkBAIC00OTM5LDM3ICs0OTk0LDEyIEBACiAgIGJvb2wgRHluYW1pYyA9IGZhbHNlOwogICBPYmpDUHJvcGVydHlJbXBsRGVjbCAqU3ludGhlc2l6ZVBJRCA9IDA7CiAKLSAgLy8gRklYTUU6IER1cGxpY2F0ZWQgY29kZSBkdWUgdG8gcG9vciBhYnN0cmFjdGlvbi4KLSAgaWYgKENvbnRhaW5lcikgewotICAgIGlmIChjb25zdCBPYmpDQ2F0ZWdvcnlJbXBsRGVjbCAqQ0lEID0KLSAgICAgICAgZHluX2Nhc3Q8T2JqQ0NhdGVnb3J5SW1wbERlY2w+KENvbnRhaW5lcikpIHsKLSAgICAgIGZvciAoT2JqQ0NhdGVnb3J5SW1wbERlY2w6OnByb3BpbXBsX2l0ZXJhdG9yCi0gICAgICAgICAgICAgaSA9IENJRC0+cHJvcGltcGxfYmVnaW4oKSwgZSA9IENJRC0+cHJvcGltcGxfZW5kKCk7Ci0gICAgICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgICAgIE9iakNQcm9wZXJ0eUltcGxEZWNsICpQSUQgPSAqaTsKLSAgICAgICAgaWYgKFBJRC0+Z2V0UHJvcGVydHlEZWNsKCkgPT0gUEQpIHsKLSAgICAgICAgICBpZiAoUElELT5nZXRQcm9wZXJ0eUltcGxlbWVudGF0aW9uKCk9PU9iakNQcm9wZXJ0eUltcGxEZWNsOjpEeW5hbWljKSB7Ci0gICAgICAgICAgICBEeW5hbWljID0gdHJ1ZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3ludGhlc2l6ZVBJRCA9IFBJRDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqT0lEPWNhc3Q8T2JqQ0ltcGxlbWVudGF0aW9uRGVjbD4oQ29udGFpbmVyKTsKLSAgICAgIGZvciAoT2JqQ0NhdGVnb3J5SW1wbERlY2w6OnByb3BpbXBsX2l0ZXJhdG9yCi0gICAgICAgICAgICAgaSA9IE9JRC0+cHJvcGltcGxfYmVnaW4oKSwgZSA9IE9JRC0+cHJvcGltcGxfZW5kKCk7Ci0gICAgICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgICAgIE9iakNQcm9wZXJ0eUltcGxEZWNsICpQSUQgPSAqaTsKLSAgICAgICAgaWYgKFBJRC0+Z2V0UHJvcGVydHlEZWNsKCkgPT0gUEQpIHsKLSAgICAgICAgICBpZiAoUElELT5nZXRQcm9wZXJ0eUltcGxlbWVudGF0aW9uKCk9PU9iakNQcm9wZXJ0eUltcGxEZWNsOjpEeW5hbWljKSB7Ci0gICAgICAgICAgICBEeW5hbWljID0gdHJ1ZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3ludGhlc2l6ZVBJRCA9IFBJRDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9CisgIGlmIChPYmpDUHJvcGVydHlJbXBsRGVjbCAqUHJvcGVydHlJbXBEZWNsID0KKyAgICAgIGdldE9iakNQcm9wZXJ0eUltcGxEZWNsRm9yUHJvcGVydHlEZWNsKFBELCBDb250YWluZXIpKSB7CisgICAgaWYgKFByb3BlcnR5SW1wRGVjbC0+Z2V0UHJvcGVydHlJbXBsZW1lbnRhdGlvbigpID09IE9iakNQcm9wZXJ0eUltcGxEZWNsOjpEeW5hbWljKQorICAgICAgRHluYW1pYyA9IHRydWU7CisgICAgZWxzZQorICAgICAgU3ludGhlc2l6ZVBJRCA9IFByb3BlcnR5SW1wRGVjbDsKICAgfQogCiAgIC8vIEZJWE1FOiBUaGlzIGlzIG5vdCB2ZXJ5IGVmZmljaWVudC4KQEAgLTQ5ODgsNiArNTAxOCw4IEBACiAgICAgICBTICs9ICIsQyI7CiAgICAgaWYgKFBELT5nZXRQcm9wZXJ0eUF0dHJpYnV0ZXMoKSAmIE9iakNQcm9wZXJ0eURlY2w6Ok9CSkNfUFJfcmV0YWluKQogICAgICAgUyArPSAiLCYiOworICAgIGlmIChQRC0+Z2V0UHJvcGVydHlBdHRyaWJ1dGVzKCkgJiBPYmpDUHJvcGVydHlEZWNsOjpPQkpDX1BSX3dlYWspCisgICAgICBTICs9ICIsVyI7CiAgIH0gZWxzZSB7CiAgICAgc3dpdGNoIChQRC0+Z2V0U2V0dGVyS2luZCgpKSB7CiAgICAgY2FzZSBPYmpDUHJvcGVydHlEZWNsOjpBc3NpZ246IGJyZWFrOwpAQCAtNTMyMiw5ICs1MzU0LDcgQEAKICAgICAgIGlmICghUkRlY2wtPmlzVW5pb24oKSkgewogICAgICAgICBnZXRPYmpDRW5jb2RpbmdGb3JTdHJ1Y3R1cmVJbXBsKFJEZWNsLCBTLCBGRCk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEZpZWxkID0gUkRlY2wtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRFbmQgPSBSRGVjbC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgICAgICAgRmllbGQgIT0gRmllbGRFbmQ7ICsrRmllbGQpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICpGaWVsZCA6IFJEZWNsLT5maWVsZHMoKSkgewogICAgICAgICAgIGlmIChGRCkgewogICAgICAgICAgICAgUyArPSAnIic7CiAgICAgICAgICAgICBTICs9IEZpZWxkLT5nZXROYW1lQXNTdHJpbmcoKTsKQEAgLTUzMzQsNyArNTM2NCw3IEBACiAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGJpdC1maWVsZHMuCiAgICAgICAgICAgaWYgKEZpZWxkLT5pc0JpdEZpZWxkKCkpIHsKICAgICAgICAgICAgIGdldE9iakNFbmNvZGluZ0ZvclR5cGVJbXBsKEZpZWxkLT5nZXRUeXBlKCksIFMsIGZhbHNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkZpZWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkKTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUXVhbFR5cGUgcXQgPSBGaWVsZC0+Z2V0VHlwZSgpOwogICAgICAgICAgICAgZ2V0TGVnYWN5SW50ZWdyYWxUeXBlRW5jb2RpbmcocXQpOwpAQCAtNTM1OCwzNyArNTM4OCwzOCBAQAogICAgICAgCiAgICAgICBTICs9ICc8JzsKICAgICAgIC8vIEJsb2NrIHJldHVybiB0eXBlCi0gICAgICBnZXRPYmpDRW5jb2RpbmdGb3JUeXBlSW1wbChGVC0+Z2V0UmVzdWx0VHlwZSgpLCBTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuZFBvaW50ZWRUb1N0cnVjdHVyZXMsIEV4cGFuZFN0cnVjdHVyZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogT3V0ZXJtb3N0VHlwZSAqLywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZ1Byb3BlcnR5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIFN0cnVjdEZpZWxkICovLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZUJsb2NrUGFyYW1ldGVycywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGVDbGFzc05hbWVzKTsKKyAgICAgIGdldE9iakNFbmNvZGluZ0ZvclR5cGVJbXBsKAorICAgICAgICAgIEZULT5nZXRSZXR1cm5UeXBlKCksIFMsIEV4cGFuZFBvaW50ZWRUb1N0cnVjdHVyZXMsIEV4cGFuZFN0cnVjdHVyZXMsCisgICAgICAgICAgRkQsIGZhbHNlIC8qIE91dGVybW9zdFR5cGUgKi8sIEVuY29kaW5nUHJvcGVydHksCisgICAgICAgICAgZmFsc2UgLyogU3RydWN0RmllbGQgKi8sIEVuY29kZUJsb2NrUGFyYW1ldGVycywgRW5jb2RlQ2xhc3NOYW1lcyk7CiAgICAgICAvLyBCbG9jayBzZWxmCiAgICAgICBTICs9ICJAPyI7CiAgICAgICAvLyBCbG9jayBwYXJhbWV0ZXJzCiAgICAgICBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGVCkpIHsKLSAgICAgICAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6YXJnX3R5cGVfaXRlcmF0b3IgSSA9IEZQVC0+YXJnX3R5cGVfYmVnaW4oKSwKLSAgICAgICAgICAgICAgIEUgPSBGUFQtPmFyZ190eXBlX2VuZCgpOyBJICYmIChJICE9IEUpOyArK0kpIHsKLSAgICAgICAgICBnZXRPYmpDRW5jb2RpbmdGb3JUeXBlSW1wbCgqSSwgUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5kUG9pbnRlZFRvU3RydWN0dXJlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5kU3RydWN0dXJlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIE91dGVybW9zdFR5cGUgKi8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kaW5nUHJvcGVydHksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIFN0cnVjdEZpZWxkICovLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGVCbG9ja1BhcmFtZXRlcnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZUNsYXNzTmFtZXMpOwotICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmSSA6IEZQVC0+cGFyYW1fdHlwZXMoKSkKKyAgICAgICAgICBnZXRPYmpDRW5jb2RpbmdGb3JUeXBlSW1wbCgKKyAgICAgICAgICAgICAgSSwgUywgRXhwYW5kUG9pbnRlZFRvU3RydWN0dXJlcywgRXhwYW5kU3RydWN0dXJlcywgRkQsCisgICAgICAgICAgICAgIGZhbHNlIC8qIE91dGVybW9zdFR5cGUgKi8sIEVuY29kaW5nUHJvcGVydHksCisgICAgICAgICAgICAgIGZhbHNlIC8qIFN0cnVjdEZpZWxkICovLCBFbmNvZGVCbG9ja1BhcmFtZXRlcnMsIEVuY29kZUNsYXNzTmFtZXMpOwogICAgICAgfQogICAgICAgUyArPSAnPic7CiAgICAgfQogICAgIHJldHVybjsKICAgfQogCi0gIGNhc2UgVHlwZTo6T2JqQ09iamVjdDoKKyAgY2FzZSBUeXBlOjpPYmpDT2JqZWN0OiB7CisgICAgLy8gaGFjayB0byBtYXRjaCBsZWdhY3kgZW5jb2Rpbmcgb2YgKmlkIGFuZCAqQ2xhc3MKKyAgICBRdWFsVHlwZSBUeSA9IGdldE9iakNPYmplY3RQb2ludGVyVHlwZShDVCk7CisgICAgaWYgKFR5LT5pc09iakNJZFR5cGUoKSkgeworICAgICAgUyArPSAie29iamNfb2JqZWN0PX0iOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmIChUeS0+aXNPYmpDQ2xhc3NUeXBlKCkpIHsKKyAgICAgIFMgKz0gIntvYmpjX2NsYXNzPX0iOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICAKICAgY2FzZSBUeXBlOjpPYmpDSW50ZXJmYWNlOiB7CiAgICAgLy8gSWdub3JlIHByb3RvY29sIHF1YWxpZmllcnMgd2hlbiBtYW5nbGluZyBhdCB0aGlzIGxldmVsLgogICAgIFQgPSBULT5jYXN0QXM8T2JqQ09iamVjdFR5cGU+KCktPmdldEJhc2VUeXBlKCk7CkBAIC01NDQwLDEwICs1NDcxLDkgQEAKICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvIGV4dGVuZGVkIGVuY29kaW5nIG9mIHByb3RvY29sIHF1YWxpZmVyIGxpc3QKICAgICAgICAgLy8gT25seSB3aGVuIGRvaW5nIGl2YXIgb3IgcHJvcGVydHkgZW5jb2RpbmcuCiAgICAgICAgIFMgKz0gJyInOwotICAgICAgICBmb3IgKE9iakNPYmplY3RQb2ludGVyVHlwZTo6cXVhbF9pdGVyYXRvciBJID0gT1BULT5xdWFsX2JlZ2luKCksCi0gICAgICAgICAgICAgRSA9IE9QVC0+cXVhbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICpJIDogT1BULT5xdWFscygpKSB7CiAgICAgICAgICAgUyArPSAnPCc7Ci0gICAgICAgICAgUyArPSAoKkkpLT5nZXROYW1lQXNTdHJpbmcoKTsKKyAgICAgICAgICBTICs9IEktPmdldE5hbWVBc1N0cmluZygpOwogICAgICAgICAgIFMgKz0gJz4nOwogICAgICAgICB9CiAgICAgICAgIFMgKz0gJyInOwpAQCAtNTQ4NiwxMCArNTUxNiw5IEBACiAgICAgICAgIChGRCB8fCBFbmNvZGluZ1Byb3BlcnR5IHx8IEVuY29kZUNsYXNzTmFtZXMpKSB7CiAgICAgICBTICs9ICciJzsKICAgICAgIFMgKz0gT1BULT5nZXRJbnRlcmZhY2VEZWNsKCktPmdldElkZW50aWZpZXIoKS0+Z2V0TmFtZSgpOwotICAgICAgZm9yIChPYmpDT2JqZWN0UG9pbnRlclR5cGU6OnF1YWxfaXRlcmF0b3IgSSA9IE9QVC0+cXVhbF9iZWdpbigpLAotICAgICAgICAgICBFID0gT1BULT5xdWFsX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgZm9yIChjb25zdCBhdXRvICpJIDogT1BULT5xdWFscygpKSB7CiAgICAgICAgIFMgKz0gJzwnOwotICAgICAgICBTICs9ICgqSSktPmdldE5hbWVBc1N0cmluZygpOworICAgICAgICBTICs9IEktPmdldE5hbWVBc1N0cmluZygpOwogICAgICAgICBTICs9ICc+JzsKICAgICAgIH0KICAgICAgIFMgKz0gJyInOwpAQCAtNTU0MiwxMSArNTU3MSw5IEBACiAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmbGF5b3V0ID0gZ2V0QVNUUmVjb3JkTGF5b3V0KFJEZWNsKTsKIAogICBpZiAoQ1hYUmVjKSB7Ci0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yCi0gICAgICAgICAgIEJJID0gQ1hYUmVjLT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICBCRSA9IENYWFJlYy0+YmFzZXNfZW5kKCk7IEJJICE9IEJFOyArK0JJKSB7Ci0gICAgICBpZiAoIUJJLT5pc1ZpcnR1YWwoKSkgewotICAgICAgICBDWFhSZWNvcmREZWNsICpiYXNlID0gQkktPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZCSSA6IENYWFJlYy0+YmFzZXMoKSkgeworICAgICAgaWYgKCFCSS5pc1ZpcnR1YWwoKSkgeworICAgICAgICBDWFhSZWNvcmREZWNsICpiYXNlID0gQkkuZ2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKICAgICAgICAgaWYgKGJhc2UtPmlzRW1wdHkoKSkKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgdWludDY0X3Qgb2ZmcyA9IHRvQml0cyhsYXlvdXQuZ2V0QmFzZUNsYXNzT2Zmc2V0KGJhc2UpKTsKQEAgLTU1NjYsMTAgKzU1OTMsOCBAQAogICB9CiAKICAgaWYgKENYWFJlYyAmJiBpbmNsdWRlVkJhc2VzKSB7Ci0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yCi0gICAgICAgICAgIEJJID0gQ1hYUmVjLT52YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgQkUgPSBDWFhSZWMtPnZiYXNlc19lbmQoKTsgQkkgIT0gQkU7ICsrQkkpIHsKLSAgICAgIENYWFJlY29yZERlY2wgKmJhc2UgPSBCSS0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkJJIDogQ1hYUmVjLT52YmFzZXMoKSkgeworICAgICAgQ1hYUmVjb3JkRGVjbCAqYmFzZSA9IEJJLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CiAgICAgICBpZiAoYmFzZS0+aXNFbXB0eSgpKQogICAgICAgICBjb250aW51ZTsKICAgICAgIHVpbnQ2NF90IG9mZnMgPSB0b0JpdHMobGF5b3V0LmdldFZCYXNlQ2xhc3NPZmZzZXQoYmFzZSkpOwpAQCAtNTU4Nyw3ICs1NjEyLDkgQEAKICAgICBzaXplID0gbGF5b3V0LmdldFNpemUoKTsKICAgfQogCisjaWZuZGVmIE5ERUJVRwogICB1aW50NjRfdCBDdXJPZmZzID0gMDsKKyNlbmRpZgogICBzdGQ6Om11bHRpbWFwPHVpbnQ2NF90LCBOYW1lZERlY2wgKj46Oml0ZXJhdG9yCiAgICAgQ3VyTGF5T2JqID0gRmllbGRPckJhc2VPZmZzZXRzLmJlZ2luKCk7CiAKQEAgLTU2MDEsNyArNTYyOCw5IEBACiAgICAgICBTICs9ICciJzsKICAgICB9CiAgICAgUyArPSAiXl4/IjsKKyNpZm5kZWYgTkRFQlVHCiAgICAgQ3VyT2ZmcyArPSBnZXRUeXBlU2l6ZShWb2lkUHRyVHkpOworI2VuZGlmCiAgIH0KIAogICBpZiAoIVJEZWNsLT5oYXNGbGV4aWJsZUFycmF5TWVtYmVyKCkpIHsKQEAgLTU2MTIsOCArNTY0MSw4IEBACiAgIH0KIAogICBmb3IgKDsgQ3VyTGF5T2JqICE9IEZpZWxkT3JCYXNlT2Zmc2V0cy5lbmQoKTsgKytDdXJMYXlPYmopIHsKKyNpZm5kZWYgTkRFQlVHCiAgICAgYXNzZXJ0KEN1ck9mZnMgPD0gQ3VyTGF5T2JqLT5maXJzdCk7Ci0KICAgICBpZiAoQ3VyT2ZmcyA8IEN1ckxheU9iai0+Zmlyc3QpIHsKICAgICAgIHVpbnQ2NF90IHBhZGRpbmcgPSBDdXJMYXlPYmotPmZpcnN0IC0gQ3VyT2ZmczsgCiAgICAgICAvLyBGSVhNRTogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgd2F5IHRvIGluZGljYXRlIGluIHRoZSBlbmNvZGluZyB0aGF0CkBAIC01NjI1LDYgKzU2NTQsNyBAQAogICAgICAgLy8gbG9uZ2VyIHRoZW4gdGhvdWdoLgogICAgICAgQ3VyT2ZmcyArPSBwYWRkaW5nOwogICAgIH0KKyNlbmRpZgogCiAgICAgTmFtZWREZWNsICpkY2wgPSBDdXJMYXlPYmotPnNlY29uZDsKICAgICBpZiAoZGNsID09IDApCkBAIC01NjM3LDcgKzU2NjcsOSBAQAogICAgICAgLy8gbWFraW5nIHRoZSBlbmNvZGluZyB0eXBlIGJpZ2dlciB0aGFuIGl0IHJlYWxseSBpcy4KICAgICAgIGdldE9iakNFbmNvZGluZ0ZvclN0cnVjdHVyZUltcGwoYmFzZSwgUywgRkQsIC8qaW5jbHVkZVZCYXNlcyovZmFsc2UpOwogICAgICAgYXNzZXJ0KCFiYXNlLT5pc0VtcHR5KCkpOworI2lmbmRlZiBOREVCVUcKICAgICAgIEN1ck9mZnMgKz0gdG9CaXRzKGdldEFTVFJlY29yZExheW91dChiYXNlKS5nZXROb25WaXJ0dWFsU2l6ZSgpKTsKKyNlbmRpZgogICAgIH0gZWxzZSB7CiAgICAgICBGaWVsZERlY2wgKmZpZWxkID0gY2FzdDxGaWVsZERlY2w+KGRjbCk7CiAgICAgICBpZiAoRkQpIHsKQEAgLTU2NDgsNyArNTY4MCw5IEBACiAKICAgICAgIGlmIChmaWVsZC0+aXNCaXRGaWVsZCgpKSB7CiAgICAgICAgIEVuY29kZUJpdEZpZWxkKHRoaXMsIFMsIGZpZWxkLT5nZXRUeXBlKCksIGZpZWxkKTsKKyNpZm5kZWYgTkRFQlVHCiAgICAgICAgIEN1ck9mZnMgKz0gZmllbGQtPmdldEJpdFdpZHRoVmFsdWUoKnRoaXMpOworI2VuZGlmCiAgICAgICB9IGVsc2UgewogICAgICAgICBRdWFsVHlwZSBxdCA9IGZpZWxkLT5nZXRUeXBlKCk7CiAgICAgICAgIGdldExlZ2FjeUludGVncmFsVHlwZUVuY29kaW5nKHF0KTsKQEAgLTU2NTYsNyArNTY5MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qT3V0ZXJtb3N0VHlwZSovZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRW5jb2RpbmdQcm9wZXJ0eSovZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qU3RydWN0RmllbGQqL3RydWUpOworI2lmbmRlZiBOREVCVUcKICAgICAgICAgQ3VyT2ZmcyArPSBnZXRUeXBlU2l6ZShmaWVsZC0+Z2V0VHlwZSgpKTsKKyNlbmRpZgogICAgICAgfQogICAgIH0KICAgfQpAQCAtNTY4MiwyNCArNTcxOCwxNSBAQAogICBpZiAoIU9iakNJZERlY2wpIHsKICAgICBRdWFsVHlwZSBUID0gZ2V0T2JqQ09iamVjdFR5cGUoT2JqQ0J1aWx0aW5JZFR5LCAwLCAwKTsKICAgICBUID0gZ2V0T2JqQ09iamVjdFBvaW50ZXJUeXBlKFQpOwotICAgIFR5cGVTb3VyY2VJbmZvICpJZEluZm8gPSBnZXRUcml2aWFsVHlwZVNvdXJjZUluZm8oVCk7Ci0gICAgT2JqQ0lkRGVjbCA9IFR5cGVkZWZEZWNsOjpDcmVhdGUoY29uc3RfY2FzdDxBU1RDb250ZXh0ICY+KCp0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWRlbnRzLmdldCgiaWQiKSwgSWRJbmZvKTsKKyAgICBPYmpDSWREZWNsID0gYnVpbGRJbXBsaWNpdFR5cGVkZWYoVCwgImlkIik7CiAgIH0KLSAgCiAgIHJldHVybiBPYmpDSWREZWNsOwogfQogCiBUeXBlZGVmRGVjbCAqQVNUQ29udGV4dDo6Z2V0T2JqQ1NlbERlY2woKSBjb25zdCB7CiAgIGlmICghT2JqQ1NlbERlY2wpIHsKLSAgICBRdWFsVHlwZSBTZWxUID0gZ2V0UG9pbnRlclR5cGUoT2JqQ0J1aWx0aW5TZWxUeSk7Ci0gICAgVHlwZVNvdXJjZUluZm8gKlNlbEluZm8gPSBnZXRUcml2aWFsVHlwZVNvdXJjZUluZm8oU2VsVCk7Ci0gICAgT2JqQ1NlbERlY2wgPSBUeXBlZGVmRGVjbDo6Q3JlYXRlKGNvbnN0X2Nhc3Q8QVNUQ29udGV4dCAmPigqdGhpcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uVW5pdERlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklkZW50cy5nZXQoIlNFTCIpLCBTZWxJbmZvKTsKKyAgICBRdWFsVHlwZSBUID0gZ2V0UG9pbnRlclR5cGUoT2JqQ0J1aWx0aW5TZWxUeSk7CisgICAgT2JqQ1NlbERlY2wgPSBidWlsZEltcGxpY2l0VHlwZWRlZihULCAiU0VMIik7CiAgIH0KICAgcmV0dXJuIE9iakNTZWxEZWNsOwogfQpAQCAtNTcwOCwxMyArNTczNSw4IEBACiAgIGlmICghT2JqQ0NsYXNzRGVjbCkgewogICAgIFF1YWxUeXBlIFQgPSBnZXRPYmpDT2JqZWN0VHlwZShPYmpDQnVpbHRpbkNsYXNzVHksIDAsIDApOwogICAgIFQgPSBnZXRPYmpDT2JqZWN0UG9pbnRlclR5cGUoVCk7Ci0gICAgVHlwZVNvdXJjZUluZm8gKkNsYXNzSW5mbyA9IGdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhUKTsKLSAgICBPYmpDQ2xhc3NEZWNsID0gVHlwZWRlZkRlY2w6OkNyZWF0ZShjb25zdF9jYXN0PEFTVENvbnRleHQgJj4oKnRoaXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uVW5pdERlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJZGVudHMuZ2V0KCJDbGFzcyIpLCBDbGFzc0luZm8pOworICAgIE9iakNDbGFzc0RlY2wgPSBidWlsZEltcGxpY2l0VHlwZWRlZihULCAiQ2xhc3MiKTsKICAgfQotICAKICAgcmV0dXJuIE9iakNDbGFzc0RlY2w7CiB9CiAKQEAgLTU3MzcsMzcgKzU3NTksMjAgQEAKIAogc3RhdGljIFR5cGVkZWZEZWNsICpDcmVhdGVDaGFyUHRyQnVpbHRpblZhTGlzdERlY2woY29uc3QgQVNUQ29udGV4dCAqQ29udGV4dCkgewogICAvLyB0eXBlZGVmIGNoYXIqIF9fYnVpbHRpbl92YV9saXN0OwotICBRdWFsVHlwZSBDaGFyUHRyVHlwZSA9IENvbnRleHQtPmdldFBvaW50ZXJUeXBlKENvbnRleHQtPkNoYXJUeSk7Ci0gIFR5cGVTb3VyY2VJbmZvICpUSW5mbwotICAgID0gQ29udGV4dC0+Z2V0VHJpdmlhbFR5cGVTb3VyY2VJbmZvKENoYXJQdHJUeXBlKTsKLQotICBUeXBlZGVmRGVjbCAqVmFMaXN0VHlwZURlY2wKLSAgICA9IFR5cGVkZWZEZWNsOjpDcmVhdGUoY29uc3RfY2FzdDxBU1RDb250ZXh0ICY+KCpDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC0+Z2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29udGV4dC0+SWRlbnRzLmdldCgiX19idWlsdGluX3ZhX2xpc3QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVEluZm8pOwotICByZXR1cm4gVmFMaXN0VHlwZURlY2w7CisgIFF1YWxUeXBlIFQgPSBDb250ZXh0LT5nZXRQb2ludGVyVHlwZShDb250ZXh0LT5DaGFyVHkpOworICByZXR1cm4gQ29udGV4dC0+YnVpbGRJbXBsaWNpdFR5cGVkZWYoVCwgIl9fYnVpbHRpbl92YV9saXN0Iik7CiB9CiAKIHN0YXRpYyBUeXBlZGVmRGVjbCAqQ3JlYXRlVm9pZFB0ckJ1aWx0aW5WYUxpc3REZWNsKGNvbnN0IEFTVENvbnRleHQgKkNvbnRleHQpIHsKICAgLy8gdHlwZWRlZiB2b2lkKiBfX2J1aWx0aW5fdmFfbGlzdDsKLSAgUXVhbFR5cGUgVm9pZFB0clR5cGUgPSBDb250ZXh0LT5nZXRQb2ludGVyVHlwZShDb250ZXh0LT5Wb2lkVHkpOwotICBUeXBlU291cmNlSW5mbyAqVEluZm8KLSAgICA9IENvbnRleHQtPmdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhWb2lkUHRyVHlwZSk7Ci0KLSAgVHlwZWRlZkRlY2wgKlZhTGlzdFR5cGVEZWNsCi0gICAgPSBUeXBlZGVmRGVjbDo6Q3JlYXRlKGNvbnN0X2Nhc3Q8QVNUQ29udGV4dCAmPigqQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFRyYW5zbGF0aW9uVW5pdERlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvbnRleHQtPklkZW50cy5nZXQoIl9fYnVpbHRpbl92YV9saXN0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRJbmZvKTsKLSAgcmV0dXJuIFZhTGlzdFR5cGVEZWNsOworICBRdWFsVHlwZSBUID0gQ29udGV4dC0+Z2V0UG9pbnRlclR5cGUoQ29udGV4dC0+Vm9pZFR5KTsKKyAgcmV0dXJuIENvbnRleHQtPmJ1aWxkSW1wbGljaXRUeXBlZGVmKFQsICJfX2J1aWx0aW5fdmFfbGlzdCIpOwogfQogCiBzdGF0aWMgVHlwZWRlZkRlY2wgKgogQ3JlYXRlQUFyY2g2NEFCSUJ1aWx0aW5WYUxpc3REZWNsKGNvbnN0IEFTVENvbnRleHQgKkNvbnRleHQpIHsKLSAgUmVjb3JkRGVjbCAqVmFMaXN0VGFnRGVjbDsKKyAgLy8gc3RydWN0IF9fdmFfbGlzdAorICBSZWNvcmREZWNsICpWYUxpc3RUYWdEZWNsID0gQ29udGV4dC0+YnVpbGRJbXBsaWNpdFJlY29yZCgiX192YV9saXN0Iik7CiAgIGlmIChDb250ZXh0LT5nZXRMYW5nT3B0cygpLkNQbHVzUGx1cykgewogICAgIC8vIG5hbWVzcGFjZSBzdGQgeyBzdHJ1Y3QgX192YV9saXN0IHsKICAgICBOYW1lc3BhY2VEZWNsICpOUzsKQEAgLTU3NzYsMTcgKzU3ODEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSW5saW5lKi9mYWxzZSwgU291cmNlTG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCAmQ29udGV4dC0+SWRlbnRzLmdldCgic3RkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypQcmV2RGVjbCovMCk7Ci0KLSAgICBWYUxpc3RUYWdEZWNsID0gQ1hYUmVjb3JkRGVjbDo6Q3JlYXRlKCpDb250ZXh0LCBUVEtfU3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC0+Z2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb250ZXh0LT5JZGVudHMuZ2V0KCJfX3ZhX2xpc3QiKSk7CisgICAgTlMtPnNldEltcGxpY2l0KCk7CiAgICAgVmFMaXN0VGFnRGVjbC0+c2V0RGVjbENvbnRleHQoTlMpOwotICB9IGVsc2UgewotICAgIC8vIHN0cnVjdCBfX3ZhX2xpc3QKLSAgICBWYUxpc3RUYWdEZWNsID0gQ3JlYXRlUmVjb3JkRGVjbCgqQ29udGV4dCwgVFRLX1N0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC0+Z2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29udGV4dC0+SWRlbnRzLmdldCgiX192YV9saXN0IikpOwogICB9CiAKICAgVmFMaXN0VGFnRGVjbC0+c3RhcnREZWZpbml0aW9uKCk7CkBAIC01ODM0LDIzICs1ODMwLDE0IEBACiAgIENvbnRleHQtPlZhTGlzdFRhZ1R5ID0gVmFMaXN0VGFnVHlwZTsKIAogICAvLyB9IF9fYnVpbHRpbl92YV9saXN0OwotICBUeXBlZGVmRGVjbCAqVmFMaXN0VHlwZWRlZkRlY2wKLSAgICA9IFR5cGVkZWZEZWNsOjpDcmVhdGUoY29uc3RfY2FzdDxBU1RDb250ZXh0ICY+KCpDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC0+Z2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29udGV4dC0+SWRlbnRzLmdldCgiX19idWlsdGluX3ZhX2xpc3QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC0+Z2V0VHJpdmlhbFR5cGVTb3VyY2VJbmZvKFZhTGlzdFRhZ1R5cGUpKTsKLQotICByZXR1cm4gVmFMaXN0VHlwZWRlZkRlY2w7CisgIHJldHVybiBDb250ZXh0LT5idWlsZEltcGxpY2l0VHlwZWRlZihWYUxpc3RUYWdUeXBlLCAiX19idWlsdGluX3ZhX2xpc3QiKTsKIH0KIAogc3RhdGljIFR5cGVkZWZEZWNsICpDcmVhdGVQb3dlckFCSUJ1aWx0aW5WYUxpc3REZWNsKGNvbnN0IEFTVENvbnRleHQgKkNvbnRleHQpIHsKICAgLy8gdHlwZWRlZiBzdHJ1Y3QgX192YV9saXN0X3RhZyB7CiAgIFJlY29yZERlY2wgKlZhTGlzdFRhZ0RlY2w7CiAKLSAgVmFMaXN0VGFnRGVjbCA9IENyZWF0ZVJlY29yZERlY2woKkNvbnRleHQsIFRUS19TdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFRyYW5zbGF0aW9uVW5pdERlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvbnRleHQtPklkZW50cy5nZXQoIl9fdmFfbGlzdF90YWciKSk7CisgIFZhTGlzdFRhZ0RlY2wgPSBDb250ZXh0LT5idWlsZEltcGxpY2l0UmVjb3JkKCJfX3ZhX2xpc3RfdGFnIik7CiAgIFZhTGlzdFRhZ0RlY2wtPnN0YXJ0RGVmaW5pdGlvbigpOwogCiAgIGNvbnN0IHNpemVfdCBOdW1GaWVsZHMgPSA1OwpAQCAtNTg5NSwxMiArNTg4Miw5IEBACiAgIENvbnRleHQtPlZhTGlzdFRhZ1R5ID0gVmFMaXN0VGFnVHlwZTsKIAogICAvLyB9IF9fdmFfbGlzdF90YWc7Ci0gIFR5cGVkZWZEZWNsICpWYUxpc3RUYWdUeXBlZGVmRGVjbAotICAgID0gVHlwZWRlZkRlY2w6OkNyZWF0ZShjb25zdF9jYXN0PEFTVENvbnRleHQgJj4oKkNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LT5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZDb250ZXh0LT5JZGVudHMuZ2V0KCJfX3ZhX2xpc3RfdGFnIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhWYUxpc3RUYWdUeXBlKSk7CisgIFR5cGVkZWZEZWNsICpWYUxpc3RUYWdUeXBlZGVmRGVjbCA9CisgICAgICBDb250ZXh0LT5idWlsZEltcGxpY2l0VHlwZWRlZihWYUxpc3RUYWdUeXBlLCAiX192YV9saXN0X3RhZyIpOworCiAgIFF1YWxUeXBlIFZhTGlzdFRhZ1R5cGVkZWZUeXBlID0KICAgICBDb250ZXh0LT5nZXRUeXBlZGVmVHlwZShWYUxpc3RUYWdUeXBlZGVmRGVjbCk7CiAKQEAgLTU5MDksMjUgKzU4OTMsMTQgQEAKICAgUXVhbFR5cGUgVmFMaXN0VGFnQXJyYXlUeXBlCiAgICAgPSBDb250ZXh0LT5nZXRDb25zdGFudEFycmF5VHlwZShWYUxpc3RUYWdUeXBlZGVmVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUsIEFycmF5VHlwZTo6Tm9ybWFsLCAwKTsKLSAgVHlwZVNvdXJjZUluZm8gKlRJbmZvCi0gICAgPSBDb250ZXh0LT5nZXRUcml2aWFsVHlwZVNvdXJjZUluZm8oVmFMaXN0VGFnQXJyYXlUeXBlKTsKLSAgVHlwZWRlZkRlY2wgKlZhTGlzdFR5cGVkZWZEZWNsCi0gICAgPSBUeXBlZGVmRGVjbDo6Q3JlYXRlKGNvbnN0X2Nhc3Q8QVNUQ29udGV4dCAmPigqQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFRyYW5zbGF0aW9uVW5pdERlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvbnRleHQtPklkZW50cy5nZXQoIl9fYnVpbHRpbl92YV9saXN0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRJbmZvKTsKLQotICByZXR1cm4gVmFMaXN0VHlwZWRlZkRlY2w7CisgIHJldHVybiBDb250ZXh0LT5idWlsZEltcGxpY2l0VHlwZWRlZihWYUxpc3RUYWdBcnJheVR5cGUsICJfX2J1aWx0aW5fdmFfbGlzdCIpOwogfQogCiBzdGF0aWMgVHlwZWRlZkRlY2wgKgogQ3JlYXRlWDg2XzY0QUJJQnVpbHRpblZhTGlzdERlY2woY29uc3QgQVNUQ29udGV4dCAqQ29udGV4dCkgewogICAvLyB0eXBlZGVmIHN0cnVjdCBfX3ZhX2xpc3RfdGFnIHsKICAgUmVjb3JkRGVjbCAqVmFMaXN0VGFnRGVjbDsKLSAgVmFMaXN0VGFnRGVjbCA9IENyZWF0ZVJlY29yZERlY2woKkNvbnRleHQsIFRUS19TdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFRyYW5zbGF0aW9uVW5pdERlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvbnRleHQtPklkZW50cy5nZXQoIl9fdmFfbGlzdF90YWciKSk7CisgIFZhTGlzdFRhZ0RlY2wgPSBDb250ZXh0LT5idWlsZEltcGxpY2l0UmVjb3JkKCJfX3ZhX2xpc3RfdGFnIik7CiAgIFZhTGlzdFRhZ0RlY2wtPnN0YXJ0RGVmaW5pdGlvbigpOwogCiAgIGNvbnN0IHNpemVfdCBOdW1GaWVsZHMgPSA0OwpAQCAtNTk2OSwxMiArNTk0Miw5IEBACiAgIENvbnRleHQtPlZhTGlzdFRhZ1R5ID0gVmFMaXN0VGFnVHlwZTsKIAogICAvLyB9IF9fdmFfbGlzdF90YWc7Ci0gIFR5cGVkZWZEZWNsICpWYUxpc3RUYWdUeXBlZGVmRGVjbAotICAgID0gVHlwZWRlZkRlY2w6OkNyZWF0ZShjb25zdF9jYXN0PEFTVENvbnRleHQgJj4oKkNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LT5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZDb250ZXh0LT5JZGVudHMuZ2V0KCJfX3ZhX2xpc3RfdGFnIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhWYUxpc3RUYWdUeXBlKSk7CisgIFR5cGVkZWZEZWNsICpWYUxpc3RUYWdUeXBlZGVmRGVjbCA9CisgICAgICBDb250ZXh0LT5idWlsZEltcGxpY2l0VHlwZWRlZihWYUxpc3RUYWdUeXBlLCAiX192YV9saXN0X3RhZyIpOworCiAgIFF1YWxUeXBlIFZhTGlzdFRhZ1R5cGVkZWZUeXBlID0KICAgICBDb250ZXh0LT5nZXRUeXBlZGVmVHlwZShWYUxpc3RUYWdUeXBlZGVmRGVjbCk7CiAKQEAgLTU5ODMsMTYgKzU5NTMsNyBAQAogICBRdWFsVHlwZSBWYUxpc3RUYWdBcnJheVR5cGUKICAgICA9IENvbnRleHQtPmdldENvbnN0YW50QXJyYXlUeXBlKFZhTGlzdFRhZ1R5cGVkZWZUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplLCBBcnJheVR5cGU6Ok5vcm1hbCwwKTsKLSAgVHlwZVNvdXJjZUluZm8gKlRJbmZvCi0gICAgPSBDb250ZXh0LT5nZXRUcml2aWFsVHlwZVNvdXJjZUluZm8oVmFMaXN0VGFnQXJyYXlUeXBlKTsKLSAgVHlwZWRlZkRlY2wgKlZhTGlzdFR5cGVkZWZEZWNsCi0gICAgPSBUeXBlZGVmRGVjbDo6Q3JlYXRlKGNvbnN0X2Nhc3Q8QVNUQ29udGV4dCAmPigqQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFRyYW5zbGF0aW9uVW5pdERlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvbnRleHQtPklkZW50cy5nZXQoIl9fYnVpbHRpbl92YV9saXN0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRJbmZvKTsKLQotICByZXR1cm4gVmFMaXN0VHlwZWRlZkRlY2w7CisgIHJldHVybiBDb250ZXh0LT5idWlsZEltcGxpY2l0VHlwZWRlZihWYUxpc3RUYWdBcnJheVR5cGUsICJfX2J1aWx0aW5fdmFfbGlzdCIpOwogfQogCiBzdGF0aWMgVHlwZWRlZkRlY2wgKkNyZWF0ZVBOYUNsQUJJQnVpbHRpblZhTGlzdERlY2woY29uc3QgQVNUQ29udGV4dCAqQ29udGV4dCkgewpAQCAtNjAwMSwxOSArNTk2MiwxMyBAQAogICBRdWFsVHlwZSBJbnRBcnJheVR5cGUKICAgICA9IENvbnRleHQtPmdldENvbnN0YW50QXJyYXlUeXBlKENvbnRleHQtPkludFR5LAogCQkJCSAgICBTaXplLCBBcnJheVR5cGU6Ok5vcm1hbCwgMCk7Ci0gIFR5cGVkZWZEZWNsICpWYUxpc3RUeXBlZGVmRGVjbAotICAgID0gVHlwZWRlZkRlY2w6OkNyZWF0ZShjb25zdF9jYXN0PEFTVENvbnRleHQgJj4oKkNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LT5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZDb250ZXh0LT5JZGVudHMuZ2V0KCJfX2J1aWx0aW5fdmFfbGlzdCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LT5nZXRUcml2aWFsVHlwZVNvdXJjZUluZm8oSW50QXJyYXlUeXBlKSk7Ci0KLSAgcmV0dXJuIFZhTGlzdFR5cGVkZWZEZWNsOworICByZXR1cm4gQ29udGV4dC0+YnVpbGRJbXBsaWNpdFR5cGVkZWYoSW50QXJyYXlUeXBlLCAiX19idWlsdGluX3ZhX2xpc3QiKTsKIH0KIAogc3RhdGljIFR5cGVkZWZEZWNsICoKIENyZWF0ZUFBUENTQUJJQnVpbHRpblZhTGlzdERlY2woY29uc3QgQVNUQ29udGV4dCAqQ29udGV4dCkgewotICBSZWNvcmREZWNsICpWYUxpc3REZWNsOworICAvLyBzdHJ1Y3QgX192YV9saXN0CisgIFJlY29yZERlY2wgKlZhTGlzdERlY2wgPSBDb250ZXh0LT5idWlsZEltcGxpY2l0UmVjb3JkKCJfX3ZhX2xpc3QiKTsKICAgaWYgKENvbnRleHQtPmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKSB7CiAgICAgLy8gbmFtZXNwYWNlIHN0ZCB7IHN0cnVjdCBfX3ZhX2xpc3QgewogICAgIE5hbWVzcGFjZURlY2wgKk5TOwpAQCAtNjAyMiwxOSArNTk3Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypJbmxpbmUqL2ZhbHNlLCBTb3VyY2VMb2NhdGlvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksICZDb250ZXh0LT5JZGVudHMuZ2V0KCJzdGQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlByZXZEZWNsKi8wKTsKLQotICAgIFZhTGlzdERlY2wgPSBDWFhSZWNvcmREZWNsOjpDcmVhdGUoKkNvbnRleHQsIFRUS19TdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LT5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvbnRleHQtPklkZW50cy5nZXQoIl9fdmFfbGlzdCIpKTsKLQorICAgIE5TLT5zZXRJbXBsaWNpdCgpOwogICAgIFZhTGlzdERlY2wtPnNldERlY2xDb250ZXh0KE5TKTsKLQotICB9IGVsc2UgewotICAgIC8vIHN0cnVjdCBfX3ZhX2xpc3QgewotICAgIFZhTGlzdERlY2wgPSBDcmVhdGVSZWNvcmREZWNsKCpDb250ZXh0LCBUVEtfU3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFRyYW5zbGF0aW9uVW5pdERlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29udGV4dC0+SWRlbnRzLmdldCgiX192YV9saXN0IikpOwogICB9CiAKICAgVmFMaXN0RGVjbC0+c3RhcnREZWZpbml0aW9uKCk7CkBAIC02MDU3LDI2ICs2MDAxLDE1IEBACiAgIFZhTGlzdERlY2wtPmNvbXBsZXRlRGVmaW5pdGlvbigpOwogCiAgIC8vIHR5cGVkZWYgc3RydWN0IF9fdmFfbGlzdCBfX2J1aWx0aW5fdmFfbGlzdDsKLSAgVHlwZVNvdXJjZUluZm8gKlRJbmZvCi0gICAgPSBDb250ZXh0LT5nZXRUcml2aWFsVHlwZVNvdXJjZUluZm8oQ29udGV4dC0+Z2V0UmVjb3JkVHlwZShWYUxpc3REZWNsKSk7Ci0KLSAgVHlwZWRlZkRlY2wgKlZhTGlzdFR5cGVEZWNsCi0gICAgPSBUeXBlZGVmRGVjbDo6Q3JlYXRlKGNvbnN0X2Nhc3Q8QVNUQ29udGV4dCAmPigqQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFRyYW5zbGF0aW9uVW5pdERlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvbnRleHQtPklkZW50cy5nZXQoIl9fYnVpbHRpbl92YV9saXN0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRJbmZvKTsKLQotICByZXR1cm4gVmFMaXN0VHlwZURlY2w7CisgIFF1YWxUeXBlIFQgPSBDb250ZXh0LT5nZXRSZWNvcmRUeXBlKFZhTGlzdERlY2wpOworICByZXR1cm4gQ29udGV4dC0+YnVpbGRJbXBsaWNpdFR5cGVkZWYoVCwgIl9fYnVpbHRpbl92YV9saXN0Iik7CiB9CiAKIHN0YXRpYyBUeXBlZGVmRGVjbCAqCiBDcmVhdGVTeXN0ZW1aQnVpbHRpblZhTGlzdERlY2woY29uc3QgQVNUQ29udGV4dCAqQ29udGV4dCkgewogICAvLyB0eXBlZGVmIHN0cnVjdCBfX3ZhX2xpc3RfdGFnIHsKICAgUmVjb3JkRGVjbCAqVmFMaXN0VGFnRGVjbDsKLSAgVmFMaXN0VGFnRGVjbCA9IENyZWF0ZVJlY29yZERlY2woKkNvbnRleHQsIFRUS19TdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFRyYW5zbGF0aW9uVW5pdERlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvbnRleHQtPklkZW50cy5nZXQoIl9fdmFfbGlzdF90YWciKSk7CisgIFZhTGlzdFRhZ0RlY2wgPSBDb250ZXh0LT5idWlsZEltcGxpY2l0UmVjb3JkKCJfX3ZhX2xpc3RfdGFnIik7CiAgIFZhTGlzdFRhZ0RlY2wtPnN0YXJ0RGVmaW5pdGlvbigpOwogCiAgIGNvbnN0IHNpemVfdCBOdW1GaWVsZHMgPSA0OwpAQCAtNjExOCwxMiArNjA1MSw4IEBACiAgIENvbnRleHQtPlZhTGlzdFRhZ1R5ID0gVmFMaXN0VGFnVHlwZTsKIAogICAvLyB9IF9fdmFfbGlzdF90YWc7Ci0gIFR5cGVkZWZEZWNsICpWYUxpc3RUYWdUeXBlZGVmRGVjbAotICAgID0gVHlwZWRlZkRlY2w6OkNyZWF0ZShjb25zdF9jYXN0PEFTVENvbnRleHQgJj4oKkNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LT5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZDb250ZXh0LT5JZGVudHMuZ2V0KCJfX3ZhX2xpc3RfdGFnIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhWYUxpc3RUYWdUeXBlKSk7CisgIFR5cGVkZWZEZWNsICpWYUxpc3RUYWdUeXBlZGVmRGVjbCA9CisgICAgICBDb250ZXh0LT5idWlsZEltcGxpY2l0VHlwZWRlZihWYUxpc3RUYWdUeXBlLCAiX192YV9saXN0X3RhZyIpOwogICBRdWFsVHlwZSBWYUxpc3RUYWdUeXBlZGVmVHlwZSA9CiAgICAgQ29udGV4dC0+Z2V0VHlwZWRlZlR5cGUoVmFMaXN0VGFnVHlwZWRlZkRlY2wpOwogCkBAIC02MTMyLDE2ICs2MDYxLDggQEAKICAgUXVhbFR5cGUgVmFMaXN0VGFnQXJyYXlUeXBlCiAgICAgPSBDb250ZXh0LT5nZXRDb25zdGFudEFycmF5VHlwZShWYUxpc3RUYWdUeXBlZGVmVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSwgQXJyYXlUeXBlOjpOb3JtYWwsMCk7Ci0gIFR5cGVTb3VyY2VJbmZvICpUSW5mbwotICAgID0gQ29udGV4dC0+Z2V0VHJpdmlhbFR5cGVTb3VyY2VJbmZvKFZhTGlzdFRhZ0FycmF5VHlwZSk7Ci0gIFR5cGVkZWZEZWNsICpWYUxpc3RUeXBlZGVmRGVjbAotICAgID0gVHlwZWRlZkRlY2w6OkNyZWF0ZShjb25zdF9jYXN0PEFTVENvbnRleHQgJj4oKkNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LT5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZDb250ZXh0LT5JZGVudHMuZ2V0KCJfX2J1aWx0aW5fdmFfbGlzdCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUSW5mbyk7CiAKLSAgcmV0dXJuIFZhTGlzdFR5cGVkZWZEZWNsOworICByZXR1cm4gQ29udGV4dC0+YnVpbGRJbXBsaWNpdFR5cGVkZWYoVmFMaXN0VGFnQXJyYXlUeXBlLCAiX19idWlsdGluX3ZhX2xpc3QiKTsKIH0KIAogc3RhdGljIFR5cGVkZWZEZWNsICpDcmVhdGVWYUxpc3REZWNsKGNvbnN0IEFTVENvbnRleHQgKkNvbnRleHQsCkBAIC02MTY5LDggKzYwOTAsMTAgQEAKIH0KIAogVHlwZWRlZkRlY2wgKkFTVENvbnRleHQ6OmdldEJ1aWx0aW5WYUxpc3REZWNsKCkgY29uc3QgewotICBpZiAoIUJ1aWx0aW5WYUxpc3REZWNsKQorICBpZiAoIUJ1aWx0aW5WYUxpc3REZWNsKSB7CiAgICAgQnVpbHRpblZhTGlzdERlY2wgPSBDcmVhdGVWYUxpc3REZWNsKHRoaXMsIFRhcmdldC0+Z2V0QnVpbHRpblZhTGlzdEtpbmQoKSk7CisgICAgYXNzZXJ0KEJ1aWx0aW5WYUxpc3REZWNsLT5pc0ltcGxpY2l0KCkpOworICB9CiAKICAgcmV0dXJuIEJ1aWx0aW5WYUxpc3REZWNsOwogfQpAQCAtNjQ1NCw5ICs2Mzc3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDUHJvdG9jb2xEZWNsICpyUHJvdG8pIGNvbnN0IHsKICAgaWYgKGRlY2xhcmVzU2FtZUVudGl0eShsUHJvdG8sIHJQcm90bykpCiAgICAgcmV0dXJuIHRydWU7Ci0gIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUEkgPSByUHJvdG8tPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgRSA9IHJQcm90by0+cHJvdG9jb2xfZW5kKCk7IFBJICE9IEU7ICsrUEkpCi0gICAgaWYgKFByb3RvY29sQ29tcGF0aWJsZVdpdGhQcm90b2NvbChsUHJvdG8sICpQSSkpCisgIGZvciAoYXV0byAqUEkgOiByUHJvdG8tPnByb3RvY29scygpKQorICAgIGlmIChQcm90b2NvbENvbXBhdGlibGVXaXRoUHJvdG9jb2wobFByb3RvLCBQSSkpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgcmV0dXJuIGZhbHNlOwogfQpAQCAtNjQ2OSwxMyArNjM5MSw5IEBACiAgIGNvbnN0IE9iakNPYmplY3RQb2ludGVyVHlwZSAqcmhzT1BUID0gcmhzLT5nZXRBczxPYmpDT2JqZWN0UG9pbnRlclR5cGU+KCk7CiAgIGFzc2VydCAoKGxoc1FJRCAmJiByaHNPUFQpICYmICJPYmpDUXVhbGlmaWVkQ2xhc3NUeXBlc0FyZUNvbXBhdGlibGUiKTsKICAgCi0gIGZvciAoT2JqQ09iamVjdFBvaW50ZXJUeXBlOjpxdWFsX2l0ZXJhdG9yIEkgPSBsaHNRSUQtPnF1YWxfYmVnaW4oKSwKLSAgICAgICBFID0gbGhzUUlELT5xdWFsX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICBmb3IgKGF1dG8gKmxoc1Byb3RvIDogbGhzUUlELT5xdWFscygpKSB7CiAgICAgYm9vbCBtYXRjaCA9IGZhbHNlOwotICAgIE9iakNQcm90b2NvbERlY2wgKmxoc1Byb3RvID0gKkk7Ci0gICAgZm9yIChPYmpDT2JqZWN0UG9pbnRlclR5cGU6OnF1YWxfaXRlcmF0b3IgSiA9IHJoc09QVC0+cXVhbF9iZWdpbigpLAotICAgICAgICAgRSA9IHJoc09QVC0+cXVhbF9lbmQoKTsgSiAhPSBFOyArK0opIHsKLSAgICAgIE9iakNQcm90b2NvbERlY2wgKnJoc1Byb3RvID0gKko7CisgICAgZm9yIChhdXRvICpyaHNQcm90byA6IHJoc09QVC0+cXVhbHMoKSkgewogICAgICAgaWYgKFByb3RvY29sQ29tcGF0aWJsZVdpdGhQcm90b2NvbChsaHNQcm90bywgcmhzUHJvdG8pKSB7CiAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgYnJlYWs7CkBAIC02NTA4LDEyICs2NDI2LDExIEBACiAgICAgICAvLyBJZiB0aGUgUkhTIGlzIGEgdW5xdWFsaWZpZWQgaW50ZXJmYWNlIHBvaW50ZXIgIk5TU3RyaW5nKiIsCiAgICAgICAvLyBtYWtlIHN1cmUgd2UgY2hlY2sgdGhlIGNsYXNzIGhpZXJhcmNoeS4KICAgICAgIGlmIChPYmpDSW50ZXJmYWNlRGVjbCAqcmhzSUQgPSByaHNPUFQtPmdldEludGVyZmFjZURlY2woKSkgewotICAgICAgICBmb3IgKE9iakNPYmplY3RQb2ludGVyVHlwZTo6cXVhbF9pdGVyYXRvciBJID0gbGhzUUlELT5xdWFsX2JlZ2luKCksCi0gICAgICAgICAgICAgRSA9IGxoc1FJRC0+cXVhbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgZm9yIChhdXRvICpJIDogbGhzUUlELT5xdWFscygpKSB7CiAgICAgICAgICAgLy8gd2hlbiBjb21wYXJpbmcgYW4gaWQ8UD4gb24gbGhzIHdpdGggYSBzdGF0aWMgdHlwZSBvbiByaHMsCiAgICAgICAgICAgLy8gc2VlIGlmIHN0YXRpYyBjbGFzcyBpbXBsZW1lbnRzIGFsbCBvZiBpZCdzIHByb3RvY29scywgZGlyZWN0bHkgb3IKICAgICAgICAgICAvLyB0aHJvdWdoIGl0cyBzdXBlciBjbGFzcyBhbmQgY2F0ZWdvcmllcy4KLSAgICAgICAgICBpZiAoIXJoc0lELT5DbGFzc0ltcGxlbWVudHNQcm90b2NvbCgqSSwgdHJ1ZSkpCisgICAgICAgICAgaWYgKCFyaHNJRC0+Q2xhc3NJbXBsZW1lbnRzUHJvdG9jb2woSSwgdHJ1ZSkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTY1MjEsMTcgKzY0MzgsMTMgQEAKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAvLyBCb3RoIHRoZSByaWdodCBhbmQgbGVmdCBzaWRlcyBoYXZlIHF1YWxpZmllcnMuCi0gICAgZm9yIChPYmpDT2JqZWN0UG9pbnRlclR5cGU6OnF1YWxfaXRlcmF0b3IgSSA9IGxoc1FJRC0+cXVhbF9iZWdpbigpLAotICAgICAgICAgRSA9IGxoc1FJRC0+cXVhbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIE9iakNQcm90b2NvbERlY2wgKmxoc1Byb3RvID0gKkk7CisgICAgZm9yIChhdXRvICpsaHNQcm90byA6IGxoc1FJRC0+cXVhbHMoKSkgewogICAgICAgYm9vbCBtYXRjaCA9IGZhbHNlOwogCiAgICAgICAvLyB3aGVuIGNvbXBhcmluZyBhbiBpZDxQPiBvbiBsaHMgd2l0aCBhIHN0YXRpYyB0eXBlIG9uIHJocywKICAgICAgIC8vIHNlZSBpZiBzdGF0aWMgY2xhc3MgaW1wbGVtZW50cyBhbGwgb2YgaWQncyBwcm90b2NvbHMsIGRpcmVjdGx5IG9yCiAgICAgICAvLyB0aHJvdWdoIGl0cyBzdXBlciBjbGFzcyBhbmQgY2F0ZWdvcmllcy4KLSAgICAgIGZvciAoT2JqQ09iamVjdFBvaW50ZXJUeXBlOjpxdWFsX2l0ZXJhdG9yIEogPSByaHNPUFQtPnF1YWxfYmVnaW4oKSwKLSAgICAgICAgICAgRSA9IHJoc09QVC0+cXVhbF9lbmQoKTsgSiAhPSBFOyArK0opIHsKLSAgICAgICAgT2JqQ1Byb3RvY29sRGVjbCAqcmhzUHJvdG8gPSAqSjsKKyAgICAgIGZvciAoYXV0byAqcmhzUHJvdG8gOiByaHNPUFQtPnF1YWxzKCkpIHsKICAgICAgICAgaWYgKFByb3RvY29sQ29tcGF0aWJsZVdpdGhQcm90b2NvbChsaHNQcm90bywgcmhzUHJvdG8pIHx8CiAgICAgICAgICAgICAoY29tcGFyZSAmJiBQcm90b2NvbENvbXBhdGlibGVXaXRoUHJvdG9jb2wocmhzUHJvdG8sIGxoc1Byb3RvKSkpIHsKICAgICAgICAgICBtYXRjaCA9IHRydWU7CkBAIC02NTQxLDEyICs2NDU0LDExIEBACiAgICAgICAvLyBJZiB0aGUgUkhTIGlzIGEgcXVhbGlmaWVkIGludGVyZmFjZSBwb2ludGVyICJOU1N0cmluZzxQPioiLAogICAgICAgLy8gbWFrZSBzdXJlIHdlIGNoZWNrIHRoZSBjbGFzcyBoaWVyYXJjaHkuCiAgICAgICBpZiAoT2JqQ0ludGVyZmFjZURlY2wgKnJoc0lEID0gcmhzT1BULT5nZXRJbnRlcmZhY2VEZWNsKCkpIHsKLSAgICAgICAgZm9yIChPYmpDT2JqZWN0UG9pbnRlclR5cGU6OnF1YWxfaXRlcmF0b3IgSSA9IGxoc1FJRC0+cXVhbF9iZWdpbigpLAotICAgICAgICAgICAgIEUgPSBsaHNRSUQtPnF1YWxfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIGZvciAoYXV0byAqSSA6IGxoc1FJRC0+cXVhbHMoKSkgewogICAgICAgICAgIC8vIHdoZW4gY29tcGFyaW5nIGFuIGlkPFA+IG9uIGxocyB3aXRoIGEgc3RhdGljIHR5cGUgb24gcmhzLAogICAgICAgICAgIC8vIHNlZSBpZiBzdGF0aWMgY2xhc3MgaW1wbGVtZW50cyBhbGwgb2YgaWQncyBwcm90b2NvbHMsIGRpcmVjdGx5IG9yCiAgICAgICAgICAgLy8gdGhyb3VnaCBpdHMgc3VwZXIgY2xhc3MgYW5kIGNhdGVnb3JpZXMuCi0gICAgICAgICAgaWYgKHJoc0lELT5DbGFzc0ltcGxlbWVudHNQcm90b2NvbCgqSSwgdHJ1ZSkpIHsKKyAgICAgICAgICBpZiAocmhzSUQtPkNsYXNzSW1wbGVtZW50c1Byb3RvY29sKEksIHRydWUpKSB7CiAgICAgICAgICAgICBtYXRjaCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CkBAIC02NTY1LDkgKzY0NzcsNyBAQAogICBpZiAoY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpsaHNPUFQgPQogICAgICAgICBsaHMtPmdldEFzT2JqQ0ludGVyZmFjZVBvaW50ZXJUeXBlKCkpIHsKICAgICAvLyBJZiBib3RoIHRoZSByaWdodCBhbmQgbGVmdCBzaWRlcyBoYXZlIHF1YWxpZmllcnMuCi0gICAgZm9yIChPYmpDT2JqZWN0UG9pbnRlclR5cGU6OnF1YWxfaXRlcmF0b3IgSSA9IGxoc09QVC0+cXVhbF9iZWdpbigpLAotICAgICAgICAgRSA9IGxoc09QVC0+cXVhbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIE9iakNQcm90b2NvbERlY2wgKmxoc1Byb3RvID0gKkk7CisgICAgZm9yIChhdXRvICpsaHNQcm90byA6IGxoc09QVC0+cXVhbHMoKSkgewogICAgICAgYm9vbCBtYXRjaCA9IGZhbHNlOwogCiAgICAgICAvLyB3aGVuIGNvbXBhcmluZyBhbiBpZDxQPiBvbiByaHMgd2l0aCBhIHN0YXRpYyB0eXBlIG9uIGxocywKQEAgLTY1NzUsOSArNjQ4NSw3IEBACiAgICAgICAvLyB0aHJvdWdoIGl0cyBzdXBlciBjbGFzcyBhbmQgY2F0ZWdvcmllcy4KICAgICAgIC8vIEZpcnN0LCBsaHMgcHJvdG9jb2xzIGluIHRoZSBxdWFsaWZpZXIgbGlzdCBtdXN0IGJlIGZvdW5kLCBkaXJlY3QKICAgICAgIC8vIG9yIGluZGlyZWN0IGluIHJocydzIHF1YWxpZmllciBsaXN0IG9yIGl0IGlzIGEgbWlzbWF0Y2guCi0gICAgICBmb3IgKE9iakNPYmplY3RQb2ludGVyVHlwZTo6cXVhbF9pdGVyYXRvciBKID0gcmhzUUlELT5xdWFsX2JlZ2luKCksCi0gICAgICAgICAgIEUgPSByaHNRSUQtPnF1YWxfZW5kKCk7IEogIT0gRTsgKytKKSB7Ci0gICAgICAgIE9iakNQcm90b2NvbERlY2wgKnJoc1Byb3RvID0gKko7CisgICAgICBmb3IgKGF1dG8gKnJoc1Byb3RvIDogcmhzUUlELT5xdWFscygpKSB7CiAgICAgICAgIGlmIChQcm90b2NvbENvbXBhdGlibGVXaXRoUHJvdG9jb2wobGhzUHJvdG8sIHJoc1Byb3RvKSB8fAogICAgICAgICAgICAgKGNvbXBhcmUgJiYgUHJvdG9jb2xDb21wYXRpYmxlV2l0aFByb3RvY29sKHJoc1Byb3RvLCBsaHNQcm90bykpKSB7CiAgICAgICAgICAgbWF0Y2ggPSB0cnVlOwpAQCAtNjU5OCwxNCArNjUwNiw5IEBACiAgICAgICAvLyBhc3N1bWUgdGhhdCBpdCBpcyBtaXNtYXRjaC4KICAgICAgIGlmIChMSFNJbmhlcml0ZWRQcm90b2NvbHMuZW1wdHkoKSAmJiBsaHNPUFQtPnF1YWxfZW1wdHkoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgZm9yIChsbHZtOjpTbWFsbFB0clNldDxPYmpDUHJvdG9jb2xEZWNsKiw4Pjo6aXRlcmF0b3IgSSA9Ci0gICAgICAgICAgIExIU0luaGVyaXRlZFByb3RvY29scy5iZWdpbigpLAotICAgICAgICAgICBFID0gTEhTSW5oZXJpdGVkUHJvdG9jb2xzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgZm9yIChhdXRvICpsaHNQcm90byA6IExIU0luaGVyaXRlZFByb3RvY29scykgewogICAgICAgICBib29sIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgIE9iakNQcm90b2NvbERlY2wgKmxoc1Byb3RvID0gKCpJKTsKLSAgICAgICAgZm9yIChPYmpDT2JqZWN0UG9pbnRlclR5cGU6OnF1YWxfaXRlcmF0b3IgSiA9IHJoc1FJRC0+cXVhbF9iZWdpbigpLAotICAgICAgICAgICAgIEUgPSByaHNRSUQtPnF1YWxfZW5kKCk7IEogIT0gRTsgKytKKSB7Ci0gICAgICAgICAgT2JqQ1Byb3RvY29sRGVjbCAqcmhzUHJvdG8gPSAqSjsKKyAgICAgICAgZm9yIChhdXRvICpyaHNQcm90byA6IHJoc1FJRC0+cXVhbHMoKSkgewogICAgICAgICAgIGlmIChQcm90b2NvbENvbXBhdGlibGVXaXRoUHJvdG9jb2wobGhzUHJvdG8sIHJoc1Byb3RvKSB8fAogICAgICAgICAgICAgICAoY29tcGFyZSAmJiBQcm90b2NvbENvbXBhdGlibGVXaXRoUHJvdG9jb2wocmhzUHJvdG8sIGxoc1Byb3RvKSkpIHsKICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKQEAgLTY3OTgsMTYgKzY3MDEsOSBAQAogICAgICAgaWYgKFN1cGVyQ2xhc3NJbmhlcml0ZWRQcm90b2NvbHMuZW1wdHkoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgCi0gICAgICBmb3IgKE9iakNPYmplY3RUeXBlOjpxdWFsX2l0ZXJhdG9yIExIU1BJID0gTEhTLT5xdWFsX2JlZ2luKCksCi0gICAgICAgICAgIExIU1BFID0gTEhTLT5xdWFsX2VuZCgpOwotICAgICAgICAgICBMSFNQSSAhPSBMSFNQRTsgTEhTUEkrKykgewotICAgICAgICBib29sIFN1cGVySW1wbGVtZW50c1Byb3RvY29sID0gZmFsc2U7Ci0gICAgICAgIE9iakNQcm90b2NvbERlY2wgKkxIU1Byb3RvID0gKCpMSFNQSSk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGxsdm06OlNtYWxsUHRyU2V0PE9iakNQcm90b2NvbERlY2wqLDg+OjppdGVyYXRvciBJID0KLSAgICAgICAgICAgICBTdXBlckNsYXNzSW5oZXJpdGVkUHJvdG9jb2xzLmJlZ2luKCksCi0gICAgICAgICAgICAgRSA9IFN1cGVyQ2xhc3NJbmhlcml0ZWRQcm90b2NvbHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICAgICAgT2JqQ1Byb3RvY29sRGVjbCAqU3VwZXJDbGFzc1Byb3RvID0gKCpJKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAqTEhTUHJvdG8gOiBMSFMtPnF1YWxzKCkpIHsKKyAgICAgICAgYm9vbCBTdXBlckltcGxlbWVudHNQcm90b2NvbCA9IGZhbHNlOyAgICAgICAgCisgICAgICAgIGZvciAoYXV0byAqU3VwZXJDbGFzc1Byb3RvIDogU3VwZXJDbGFzc0luaGVyaXRlZFByb3RvY29scykgewogICAgICAgICAgIGlmIChTdXBlckNsYXNzUHJvdG8tPmxvb2t1cFByb3RvY29sTmFtZWQoTEhTUHJvdG8tPmdldElkZW50aWZpZXIoKSkpIHsKICAgICAgICAgICAgIFN1cGVySW1wbGVtZW50c1Byb3RvY29sID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjgyMSwxNyArNjcxNywxMyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGZvciAoT2JqQ09iamVjdFR5cGU6OnF1YWxfaXRlcmF0b3IgTEhTUEkgPSBMSFMtPnF1YWxfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNQRSA9IExIUy0+cXVhbF9lbmQoKTsKLSAgICAgICBMSFNQSSAhPSBMSFNQRTsgTEhTUEkrKykgeworICBmb3IgKGNvbnN0IGF1dG8gKkxIU1BJIDogTEhTLT5xdWFscygpKSB7CiAgICAgYm9vbCBSSFNJbXBsZW1lbnRzUHJvdG9jb2wgPSBmYWxzZTsKIAogICAgIC8vIElmIHRoZSBSSFMgZG9lc24ndCBpbXBsZW1lbnQgdGhlIHByb3RvY29sIG9uIHRoZSBsZWZ0LCB0aGUgdHlwZXMKICAgICAvLyBhcmUgaW5jb21wYXRpYmxlLgotICAgIGZvciAoT2JqQ09iamVjdFR5cGU6OnF1YWxfaXRlcmF0b3IgUkhTUEkgPSBSSFMtPnF1YWxfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIU1BFID0gUkhTLT5xdWFsX2VuZCgpOwotICAgICAgICAgUkhTUEkgIT0gUkhTUEU7IFJIU1BJKyspIHsKLSAgICAgIGlmICgoKlJIU1BJKS0+bG9va3VwUHJvdG9jb2xOYW1lZCgoKkxIU1BJKS0+Z2V0SWRlbnRpZmllcigpKSkgeworICAgIGZvciAoYXV0byAqUkhTUEkgOiBSSFMtPnF1YWxzKCkpIHsKKyAgICAgIGlmIChSSFNQSS0+bG9va3VwUHJvdG9jb2xOYW1lZChMSFNQSS0+Z2V0SWRlbnRpZmllcigpKSkgewogICAgICAgICBSSFNJbXBsZW1lbnRzUHJvdG9jb2wgPSB0cnVlOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTY4OTEsOSArNjc4Myw4IEBACiAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpVVCA9IFQtPmdldEFzVW5pb25UeXBlKCkpIHsKICAgICBSZWNvcmREZWNsICpVRCA9IFVULT5nZXREZWNsKCk7CiAgICAgaWYgKFVELT5oYXNBdHRyPFRyYW5zcGFyZW50VW5pb25BdHRyPigpKSB7Ci0gICAgICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIGl0ID0gVUQtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICAgIGl0ZW5kID0gVUQtPmZpZWxkX2VuZCgpOyBpdCAhPSBpdGVuZDsgKytpdCkgewotICAgICAgICBRdWFsVHlwZSBFVCA9IGl0LT5nZXRUeXBlKCkuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CisgICAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBVRC0+ZmllbGRzKCkpIHsKKyAgICAgICAgUXVhbFR5cGUgRVQgPSBJLT5nZXRUeXBlKCkuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CiAgICAgICAgIFF1YWxUeXBlIE1UID0gbWVyZ2VUeXBlcyhFVCwgU3ViVHlwZSwgT2ZCbG9ja1BvaW50ZXIsIFVucXVhbGlmaWVkKTsKICAgICAgICAgaWYgKCFNVC5pc051bGwoKSkKICAgICAgICAgICByZXR1cm4gTVQ7CkBAIC02OTA0LDExICs2Nzk1LDExIEBACiAgIHJldHVybiBRdWFsVHlwZSgpOwogfQogCi0vLy8gbWVyZ2VGdW5jdGlvbkFyZ3VtZW50VHlwZXMgLSBtZXJnZSB0d28gdHlwZXMgd2hpY2ggYXBwZWFyIGFzIGZ1bmN0aW9uCi0vLy8gYXJndW1lbnQgdHlwZXMKLVF1YWxUeXBlIEFTVENvbnRleHQ6Om1lcmdlRnVuY3Rpb25Bcmd1bWVudFR5cGVzKFF1YWxUeXBlIGxocywgUXVhbFR5cGUgcmhzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT2ZCbG9ja1BvaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVucXVhbGlmaWVkKSB7CisvLy8gbWVyZ2VGdW5jdGlvblBhcmFtZXRlclR5cGVzIC0gbWVyZ2UgdHdvIHR5cGVzIHdoaWNoIGFwcGVhciBhcyBmdW5jdGlvbgorLy8vIHBhcmFtZXRlciB0eXBlcworUXVhbFR5cGUgQVNUQ29udGV4dDo6bWVyZ2VGdW5jdGlvblBhcmFtZXRlclR5cGVzKFF1YWxUeXBlIGxocywgUXVhbFR5cGUgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT2ZCbG9ja1BvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVbnF1YWxpZmllZCkgewogICAvLyBHTlUgZXh0ZW5zaW9uOiB0d28gdHlwZXMgYXJlIGNvbXBhdGlibGUgaWYgdGhleSBhcHBlYXIgYXMgYSBmdW5jdGlvbgogICAvLyBhcmd1bWVudCwgb25lIG9mIHRoZSB0eXBlcyBpcyBhIHRyYW5zcGFyZW50IHVuaW9uIHR5cGUgYW5kIHRoZSBvdGhlcgogICAvLyB0eXBlIGlzIGNvbXBhdGlibGUgd2l0aCBhIHVuaW9uIG1lbWJlcgpAQCAtNjkzOCwyMyArNjgyOSwyMyBAQAogICAvLyBDaGVjayByZXR1cm4gdHlwZQogICBRdWFsVHlwZSByZXRUeXBlOwogICBpZiAoT2ZCbG9ja1BvaW50ZXIpIHsKLSAgICBRdWFsVHlwZSBSSFMgPSByYmFzZS0+Z2V0UmVzdWx0VHlwZSgpOwotICAgIFF1YWxUeXBlIExIUyA9IGxiYXNlLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgUXVhbFR5cGUgUkhTID0gcmJhc2UtPmdldFJldHVyblR5cGUoKTsKKyAgICBRdWFsVHlwZSBMSFMgPSBsYmFzZS0+Z2V0UmV0dXJuVHlwZSgpOwogICAgIGJvb2wgVW5xdWFsaWZpZWRSZXN1bHQgPSBVbnF1YWxpZmllZDsKICAgICBpZiAoIVVucXVhbGlmaWVkUmVzdWx0KQogICAgICAgVW5xdWFsaWZpZWRSZXN1bHQgPSAoIVJIUy5oYXNRdWFsaWZpZXJzKCkgJiYgTEhTLmhhc1F1YWxpZmllcnMoKSk7CiAgICAgcmV0VHlwZSA9IG1lcmdlVHlwZXMoTEhTLCBSSFMsIHRydWUsIFVucXVhbGlmaWVkUmVzdWx0LCB0cnVlKTsKICAgfQogICBlbHNlCi0gICAgcmV0VHlwZSA9IG1lcmdlVHlwZXMobGJhc2UtPmdldFJlc3VsdFR5cGUoKSwgcmJhc2UtPmdldFJlc3VsdFR5cGUoKSwgZmFsc2UsCisgICAgcmV0VHlwZSA9IG1lcmdlVHlwZXMobGJhc2UtPmdldFJldHVyblR5cGUoKSwgcmJhc2UtPmdldFJldHVyblR5cGUoKSwgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVW5xdWFsaWZpZWQpOwogICBpZiAocmV0VHlwZS5pc051bGwoKSkgcmV0dXJuIFF1YWxUeXBlKCk7CiAgIAogICBpZiAoVW5xdWFsaWZpZWQpCiAgICAgcmV0VHlwZSA9IHJldFR5cGUuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CiAKLSAgQ2FuUXVhbFR5cGUgTFJldFR5cGUgPSBnZXRDYW5vbmljYWxUeXBlKGxiYXNlLT5nZXRSZXN1bHRUeXBlKCkpOwotICBDYW5RdWFsVHlwZSBSUmV0VHlwZSA9IGdldENhbm9uaWNhbFR5cGUocmJhc2UtPmdldFJlc3VsdFR5cGUoKSk7CisgIENhblF1YWxUeXBlIExSZXRUeXBlID0gZ2V0Q2Fub25pY2FsVHlwZShsYmFzZS0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgQ2FuUXVhbFR5cGUgUlJldFR5cGUgPSBnZXRDYW5vbmljYWxUeXBlKHJiYXNlLT5nZXRSZXR1cm5UeXBlKCkpOwogICBpZiAoVW5xdWFsaWZpZWQpIHsKICAgICBMUmV0VHlwZSA9IExSZXRUeXBlLmdldFVucXVhbGlmaWVkVHlwZSgpOwogICAgIFJSZXRUeXBlID0gUlJldFR5cGUuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CkBAIC02OTk4LDExICs2ODg5LDggQEAKICAgaWYgKGxwcm90byAmJiBycHJvdG8pIHsgLy8gdHdvIEM5OSBzdHlsZSBmdW5jdGlvbiBwcm90b3R5cGVzCiAgICAgYXNzZXJ0KCFscHJvdG8tPmhhc0V4Y2VwdGlvblNwZWMoKSAmJiAhcnByb3RvLT5oYXNFeGNlcHRpb25TcGVjKCkgJiYKICAgICAgICAgICAgIkMrKyBzaG91bGRuJ3QgYmUgaGVyZSIpOwotICAgIHVuc2lnbmVkIGxwcm90b19uYXJncyA9IGxwcm90by0+Z2V0TnVtQXJncygpOwotICAgIHVuc2lnbmVkIHJwcm90b19uYXJncyA9IHJwcm90by0+Z2V0TnVtQXJncygpOwotCi0gICAgLy8gQ29tcGF0aWJsZSBmdW5jdGlvbnMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMKLSAgICBpZiAobHByb3RvX25hcmdzICE9IHJwcm90b19uYXJncykKKyAgICAvLyBDb21wYXRpYmxlIGZ1bmN0aW9ucyBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAgICBpZiAobHByb3RvLT5nZXROdW1QYXJhbXMoKSAhPSBycHJvdG8tPmdldE51bVBhcmFtcygpKQogICAgICAgcmV0dXJuIFF1YWxUeXBlKCk7CiAKICAgICAvLyBWYXJpYWRpYyBhbmQgbm9uLXZhcmlhZGljIGZ1bmN0aW9ucyBhcmVuJ3QgY29tcGF0aWJsZQpAQCAtNzAxNSwyOSArNjkwMywyOSBAQAogICAgIGlmIChMYW5nT3B0cy5PYmpDQXV0b1JlZkNvdW50ICYmCiAgICAgICAgICFGdW5jdGlvblR5cGVzTWF0Y2hPbk5TQ29uc3VtZWRBdHRycyhycHJvdG8sIGxwcm90bykpCiAgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKLSAgICAgIAotICAgIC8vIENoZWNrIGFyZ3VtZW50IGNvbXBhdGliaWxpdHkKKworICAgIC8vIENoZWNrIHBhcmFtZXRlciB0eXBlIGNvbXBhdGliaWxpdHkKICAgICBTbWFsbFZlY3RvcjxRdWFsVHlwZSwgMTA+IHR5cGVzOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBscHJvdG9fbmFyZ3M7IGkrKykgewotICAgICAgUXVhbFR5cGUgbGFyZ3R5cGUgPSBscHJvdG8tPmdldEFyZ1R5cGUoaSkuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7Ci0gICAgICBRdWFsVHlwZSByYXJndHlwZSA9IHJwcm90by0+Z2V0QXJnVHlwZShpKS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKLSAgICAgIFF1YWxUeXBlIGFyZ3R5cGUgPSBtZXJnZUZ1bmN0aW9uQXJndW1lbnRUeXBlcyhsYXJndHlwZSwgcmFyZ3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2ZCbG9ja1BvaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5xdWFsaWZpZWQpOwotICAgICAgaWYgKGFyZ3R5cGUuaXNOdWxsKCkpIHJldHVybiBRdWFsVHlwZSgpOwotICAgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgbiA9IGxwcm90by0+Z2V0TnVtUGFyYW1zKCk7IGkgPCBuOyBpKyspIHsKKyAgICAgIFF1YWxUeXBlIGxQYXJhbVR5cGUgPSBscHJvdG8tPmdldFBhcmFtVHlwZShpKS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKKyAgICAgIFF1YWxUeXBlIHJQYXJhbVR5cGUgPSBycHJvdG8tPmdldFBhcmFtVHlwZShpKS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKKyAgICAgIFF1YWxUeXBlIHBhcmFtVHlwZSA9IG1lcmdlRnVuY3Rpb25QYXJhbWV0ZXJUeXBlcygKKyAgICAgICAgICBsUGFyYW1UeXBlLCByUGFyYW1UeXBlLCBPZkJsb2NrUG9pbnRlciwgVW5xdWFsaWZpZWQpOworICAgICAgaWYgKHBhcmFtVHlwZS5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIFF1YWxUeXBlKCk7CisKICAgICAgIGlmIChVbnF1YWxpZmllZCkKLSAgICAgICAgYXJndHlwZSA9IGFyZ3R5cGUuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7Ci0gICAgICAKLSAgICAgIHR5cGVzLnB1c2hfYmFjayhhcmd0eXBlKTsKKyAgICAgICAgcGFyYW1UeXBlID0gcGFyYW1UeXBlLmdldFVucXVhbGlmaWVkVHlwZSgpOworCisgICAgICB0eXBlcy5wdXNoX2JhY2socGFyYW1UeXBlKTsKICAgICAgIGlmIChVbnF1YWxpZmllZCkgewotICAgICAgICBsYXJndHlwZSA9IGxhcmd0eXBlLmdldFVucXVhbGlmaWVkVHlwZSgpOwotICAgICAgICByYXJndHlwZSA9IHJhcmd0eXBlLmdldFVucXVhbGlmaWVkVHlwZSgpOworICAgICAgICBsUGFyYW1UeXBlID0gbFBhcmFtVHlwZS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKKyAgICAgICAgclBhcmFtVHlwZSA9IHJQYXJhbVR5cGUuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CiAgICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChnZXRDYW5vbmljYWxUeXBlKGFyZ3R5cGUpICE9IGdldENhbm9uaWNhbFR5cGUobGFyZ3R5cGUpKQorCisgICAgICBpZiAoZ2V0Q2Fub25pY2FsVHlwZShwYXJhbVR5cGUpICE9IGdldENhbm9uaWNhbFR5cGUobFBhcmFtVHlwZSkpCiAgICAgICAgIGFsbExUeXBlcyA9IGZhbHNlOwotICAgICAgaWYgKGdldENhbm9uaWNhbFR5cGUoYXJndHlwZSkgIT0gZ2V0Q2Fub25pY2FsVHlwZShyYXJndHlwZSkpCisgICAgICBpZiAoZ2V0Q2Fub25pY2FsVHlwZShwYXJhbVR5cGUpICE9IGdldENhbm9uaWNhbFR5cGUoclBhcmFtVHlwZSkpCiAgICAgICAgIGFsbFJUeXBlcyA9IGZhbHNlOwogICAgIH0KICAgICAgIApAQCAtNzA2MSwyMCArNjk0OSwxOSBAQAogICAgIC8vIFRoZSBvbmx5IHR5cGVzIGFjdHVhbGx5IGFmZmVjdGVkIGFyZSBwcm9tb3RhYmxlIGludGVnZXIKICAgICAvLyB0eXBlcyBhbmQgZmxvYXRzLCB3aGljaCB3b3VsZCBiZSBwYXNzZWQgYXMgYSBkaWZmZXJlbnQKICAgICAvLyB0eXBlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBwcm90b3R5cGUgaXMgdmlzaWJsZS4KLSAgICB1bnNpZ25lZCBwcm90b19uYXJncyA9IHByb3RvLT5nZXROdW1BcmdzKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb3RvX25hcmdzOyArK2kpIHsKLSAgICAgIFF1YWxUeXBlIGFyZ1R5ID0gcHJvdG8tPmdldEFyZ1R5cGUoaSk7Ci0gICAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBuID0gcHJvdG8tPmdldE51bVBhcmFtcygpOyBpIDwgbjsgKytpKSB7CisgICAgICBRdWFsVHlwZSBwYXJhbVR5ID0gcHJvdG8tPmdldFBhcmFtVHlwZShpKTsKKwogICAgICAgLy8gTG9vayBhdCB0aGUgY29udmVydGVkIHR5cGUgb2YgZW51bSB0eXBlcywgc2luY2UgdGhhdCBpcyB0aGUgdHlwZSB1c2VkCiAgICAgICAvLyB0byBwYXNzIGVudW0gdmFsdWVzLgotICAgICAgaWYgKGNvbnN0IEVudW1UeXBlICpFbnVtID0gYXJnVHktPmdldEFzPEVudW1UeXBlPigpKSB7Ci0gICAgICAgIGFyZ1R5ID0gRW51bS0+Z2V0RGVjbCgpLT5nZXRJbnRlZ2VyVHlwZSgpOwotICAgICAgICBpZiAoYXJnVHkuaXNOdWxsKCkpCisgICAgICBpZiAoY29uc3QgRW51bVR5cGUgKkVudW0gPSBwYXJhbVR5LT5nZXRBczxFbnVtVHlwZT4oKSkgeworICAgICAgICBwYXJhbVR5ID0gRW51bS0+Z2V0RGVjbCgpLT5nZXRJbnRlZ2VyVHlwZSgpOworICAgICAgICBpZiAocGFyYW1UeS5pc051bGwoKSkKICAgICAgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKICAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGFyZ1R5LT5pc1Byb21vdGFibGVJbnRlZ2VyVHlwZSgpIHx8Ci0gICAgICAgICAgZ2V0Q2Fub25pY2FsVHlwZShhcmdUeSkuZ2V0VW5xdWFsaWZpZWRUeXBlKCkgPT0gRmxvYXRUeSkKKworICAgICAgaWYgKHBhcmFtVHktPmlzUHJvbW90YWJsZUludGVnZXJUeXBlKCkgfHwKKyAgICAgICAgICBnZXRDYW5vbmljYWxUeXBlKHBhcmFtVHkpLmdldFVucXVhbGlmaWVkVHlwZSgpID09IEZsb2F0VHkpCiAgICAgICAgIHJldHVybiBRdWFsVHlwZSgpOwogICAgIH0KIApAQCAtNzA4Myw3ICs2OTcwLDcgQEAKIAogICAgIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gRVBJID0gcHJvdG8tPmdldEV4dFByb3RvSW5mbygpOwogICAgIEVQSS5FeHRJbmZvID0gZWluZm87Ci0gICAgcmV0dXJuIGdldEZ1bmN0aW9uVHlwZShyZXRUeXBlLCBwcm90by0+Z2V0QXJnVHlwZXMoKSwgRVBJKTsKKyAgICByZXR1cm4gZ2V0RnVuY3Rpb25UeXBlKHJldFR5cGUsIHByb3RvLT5nZXRQYXJhbVR5cGVzKCksIEVQSSk7CiAgIH0KIAogICBpZiAoYWxsTFR5cGVzKSByZXR1cm4gbGhzOwpAQCAtNzM4NywxOCArNzI3NCwxNiBAQAogYm9vbCBBU1RDb250ZXh0OjpGdW5jdGlvblR5cGVzTWF0Y2hPbk5TQ29uc3VtZWRBdHRycygKICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRnJvbUZ1bmN0aW9uVHlwZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqVG9GdW5jdGlvblR5cGUpIHsKLSAgaWYgKEZyb21GdW5jdGlvblR5cGUtPmhhc0FueUNvbnN1bWVkQXJncygpICE9IAotICAgICAgVG9GdW5jdGlvblR5cGUtPmhhc0FueUNvbnN1bWVkQXJncygpKQorICBpZiAoRnJvbUZ1bmN0aW9uVHlwZS0+aGFzQW55Q29uc3VtZWRQYXJhbXMoKSAhPQorICAgICAgVG9GdW5jdGlvblR5cGUtPmhhc0FueUNvbnN1bWVkUGFyYW1zKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogICBGdW5jdGlvblByb3RvVHlwZTo6RXh0UHJvdG9JbmZvIEZyb21FUEkgPSAKICAgICBGcm9tRnVuY3Rpb25UeXBlLT5nZXRFeHRQcm90b0luZm8oKTsKICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBUb0VQSSA9IAogICAgIFRvRnVuY3Rpb25UeXBlLT5nZXRFeHRQcm90b0luZm8oKTsKLSAgaWYgKEZyb21FUEkuQ29uc3VtZWRBcmd1bWVudHMgJiYgVG9FUEkuQ29uc3VtZWRBcmd1bWVudHMpCi0gICAgZm9yICh1bnNpZ25lZCBBcmdJZHggPSAwLCBOdW1BcmdzID0gRnJvbUZ1bmN0aW9uVHlwZS0+Z2V0TnVtQXJncygpOwotICAgICAgICAgQXJnSWR4ICE9IE51bUFyZ3M7ICsrQXJnSWR4KSAgewotICAgICAgaWYgKEZyb21FUEkuQ29uc3VtZWRBcmd1bWVudHNbQXJnSWR4XSAhPSAKLSAgICAgICAgICBUb0VQSS5Db25zdW1lZEFyZ3VtZW50c1tBcmdJZHhdKQorICBpZiAoRnJvbUVQSS5Db25zdW1lZFBhcmFtZXRlcnMgJiYgVG9FUEkuQ29uc3VtZWRQYXJhbWV0ZXJzKQorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIG4gPSBGcm9tRnVuY3Rpb25UeXBlLT5nZXROdW1QYXJhbXMoKTsgaSAhPSBuOyArK2kpIHsKKyAgICAgIGlmIChGcm9tRVBJLkNvbnN1bWVkUGFyYW1ldGVyc1tpXSAhPSBUb0VQSS5Db25zdW1lZFBhcmFtZXRlcnNbaV0pCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIHJldHVybiB0cnVlOwpAQCAtNzQxNiwxMCArNzMwMSwxMCBAQAogICBpZiAoUkhTQ2FuLT5pc0Z1bmN0aW9uVHlwZSgpKSB7CiAgICAgaWYgKCFMSFNDYW4tPmlzRnVuY3Rpb25UeXBlKCkpCiAgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKLSAgICBRdWFsVHlwZSBPbGRSZXR1cm5UeXBlID0gCi0gICAgICBjYXN0PEZ1bmN0aW9uVHlwZT4oUkhTQ2FuLmdldFR5cGVQdHIoKSktPmdldFJlc3VsdFR5cGUoKTsKKyAgICBRdWFsVHlwZSBPbGRSZXR1cm5UeXBlID0KKyAgICAgICAgY2FzdDxGdW5jdGlvblR5cGU+KFJIU0Nhbi5nZXRUeXBlUHRyKCkpLT5nZXRSZXR1cm5UeXBlKCk7CiAgICAgUXVhbFR5cGUgTmV3UmV0dXJuVHlwZSA9Ci0gICAgICBjYXN0PEZ1bmN0aW9uVHlwZT4oTEhTQ2FuLmdldFR5cGVQdHIoKSktPmdldFJlc3VsdFR5cGUoKTsKKyAgICAgICAgY2FzdDxGdW5jdGlvblR5cGU+KExIU0Nhbi5nZXRUeXBlUHRyKCkpLT5nZXRSZXR1cm5UeXBlKCk7CiAgICAgUXVhbFR5cGUgUmVzUmV0dXJuVHlwZSA9IAogICAgICAgbWVyZ2VPYmpDR0NRdWFsaWZpZXJzKE5ld1JldHVyblR5cGUsIE9sZFJldHVyblR5cGUpOwogICAgIGlmIChSZXNSZXR1cm5UeXBlLmlzTnVsbCgpKQpAQCAtNzQzMiw3ICs3MzE3LDcgQEAKICAgICAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBFUEkgPSBGUFQtPmdldEV4dFByb3RvSW5mbygpOwogICAgICAgICBFUEkuRXh0SW5mbyA9IGdldEZ1bmN0aW9uRXh0SW5mbyhMSFMpOwogICAgICAgICBRdWFsVHlwZSBSZXN1bHRUeXBlID0KLSAgICAgICAgICAgIGdldEZ1bmN0aW9uVHlwZShPbGRSZXR1cm5UeXBlLCBGUFQtPmdldEFyZ1R5cGVzKCksIEVQSSk7CisgICAgICAgICAgICBnZXRGdW5jdGlvblR5cGUoT2xkUmV0dXJuVHlwZSwgRlBULT5nZXRQYXJhbVR5cGVzKCksIEVQSSk7CiAgICAgICAgIHJldHVybiBSZXN1bHRUeXBlOwogICAgICAgfQogICAgIH0KQEAgLTc1NzMsNiArNzQ1OCwxOSBAQAogICAgICAgYXNzZXJ0KEhvd0xvbmcgPD0gMiAmJiAiQ2FuJ3QgaGF2ZSBMTExMIG1vZGlmaWVyIik7CiAgICAgICArK0hvd0xvbmc7CiAgICAgICBicmVhazsKKyAgICBjYXNlICdXJzoKKyAgICAgIC8vIFRoaXMgbW9kaWZpZXIgcmVwcmVzZW50cyBpbnQ2NCB0eXBlLgorICAgICAgYXNzZXJ0KEhvd0xvbmcgPT0gMCAmJiAiQ2FuJ3QgdXNlIGJvdGggJ0wnIGFuZCAnVycgbW9kaWZpZXJzISIpOworICAgICAgc3dpdGNoIChDb250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRJbnQ2NFR5cGUoKSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBpbnRlZ2VyIHR5cGUiKTsKKyAgICAgIGNhc2UgVGFyZ2V0SW5mbzo6U2lnbmVkTG9uZzoKKyAgICAgICAgSG93TG9uZyA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUYXJnZXRJbmZvOjpTaWduZWRMb25nTG9uZzoKKyAgICAgICAgSG93TG9uZyA9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KICAgfQogCkBAIC03ODM0LDcgKzc3MzIsNyBAQAogICByZXR1cm4gZ2V0RnVuY3Rpb25UeXBlKFJlc1R5cGUsIEFyZ1R5cGVzLCBFUEkpOwogfQogCi1HVkFMaW5rYWdlIEFTVENvbnRleHQ6OkdldEdWQUxpbmthZ2VGb3JGdW5jdGlvbihjb25zdCBGdW5jdGlvbkRlY2wgKkZEKSB7CitHVkFMaW5rYWdlIEFTVENvbnRleHQ6OkdldEdWQUxpbmthZ2VGb3JGdW5jdGlvbihjb25zdCBGdW5jdGlvbkRlY2wgKkZEKSBjb25zdCB7CiAgIGlmICghRkQtPmlzRXh0ZXJuYWxseVZpc2libGUoKSkKICAgICByZXR1cm4gR1ZBX0ludGVybmFsOwogCkBAIC03ODQ2LDcgKzc3NDQsNyBAQAogICAgIGJyZWFrOwogCiAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlZmluaXRpb246Ci0gICAgcmV0dXJuIEdWQV9FeHBsaWNpdFRlbXBsYXRlSW5zdGFudGlhdGlvbjsKKyAgICByZXR1cm4gR1ZBX1N0cm9uZ09EUjsKIAogICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWNsYXJhdGlvbjoKICAgY2FzZSBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uOgpAQCAtNzg1Nyw3ICs3NzU1LDcgQEAKICAgaWYgKCFGRC0+aXNJbmxpbmVkKCkpCiAgICAgcmV0dXJuIEV4dGVybmFsOwogCi0gIGlmICgoIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmICFnZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUpIHx8CisgIGlmICgoIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmICFnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQpIHx8CiAgICAgICBGRC0+aGFzQXR0cjxHTlVJbmxpbmVBdHRyPigpKSB7CiAgICAgLy8gR05VIG9yIEM5OSBpbmxpbmUgc2VtYW50aWNzLiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHN5bWJvbCBzaG91bGQgYmUKICAgICAvLyBleHRlcm5hbGx5IHZpc2libGUuCkBAIC03ODc4LDYgKzc3NzYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWNsYXJhdGlvbikKICAgICByZXR1cm4gR1ZBX0M5OUlubGluZTsKIAorICAvLyBGdW5jdGlvbnMgc3BlY2lmaWVkIHdpdGggZXh0ZXJuIGFuZCBpbmxpbmUgaW4gLWZtcy1jb21wYXRpYmlsaXR5IG1vZGUKKyAgLy8gZm9yY2libHkgZ2V0IGVtaXR0ZWQuICBXaGlsZSB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24gY2Fubm90IGJlIGxhdGVyCisgIC8vIHJlcGxhY2VkLCB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBjYW5ub3QgYmUgZGlzY2FyZGVkLgorICBpZiAoRkQtPmdldE1vc3RSZWNlbnREZWNsKCktPmlzTVNFeHRlcm5JbmxpbmUoKSkKKyAgICByZXR1cm4gR1ZBX1N0cm9uZ09EUjsKKwogICByZXR1cm4gR1ZBX0NYWElubGluZTsKIH0KIApAQCAtNzg5NSw3ICs3Nzk5LDcgQEAKICAgLy8gRmFsbCB0aHJvdWdoIHRvIHRyZWF0IHRoaXMgbGlrZSBhbnkgb3RoZXIgaW5zdGFudGlhdGlvbi4KIAogICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWZpbml0aW9uOgotICAgIHJldHVybiBHVkFfRXhwbGljaXRUZW1wbGF0ZUluc3RhbnRpYXRpb247CisgICAgcmV0dXJuIEdWQV9TdHJvbmdPRFI7CiAKICAgY2FzZSBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uOgogICAgIHJldHVybiBHVkFfVGVtcGxhdGVJbnN0YW50aWF0aW9uOwpAQCAtNzk5NiwxMiArNzkwMCwyMyBAQAogICByZXR1cm4gQUJJLT5pc05lYXJseUVtcHR5KFJEKTsKIH0KIAorVlRhYmxlQ29udGV4dEJhc2UgKkFTVENvbnRleHQ6OmdldFZUYWJsZUNvbnRleHQoKSB7CisgIGlmICghVlRDb250ZXh0LmdldCgpKSB7CisgICAgaWYgKFRhcmdldC0+Z2V0Q1hYQUJJKCkuaXNNaWNyb3NvZnQoKSkKKyAgICAgIFZUQ29udGV4dC5yZXNldChuZXcgTWljcm9zb2Z0VlRhYmxlQ29udGV4dCgqdGhpcykpOworICAgIGVsc2UKKyAgICAgIFZUQ29udGV4dC5yZXNldChuZXcgSXRhbml1bVZUYWJsZUNvbnRleHQoKnRoaXMpKTsKKyAgfQorICByZXR1cm4gVlRDb250ZXh0LmdldCgpOworfQorCiBNYW5nbGVDb250ZXh0ICpBU1RDb250ZXh0OjpjcmVhdGVNYW5nbGVDb250ZXh0KCkgewogICBzd2l0Y2ggKFRhcmdldC0+Z2V0Q1hYQUJJKCkuZ2V0S2luZCgpKSB7CiAgIGNhc2UgVGFyZ2V0Q1hYQUJJOjpHZW5lcmljQUFyY2g2NDoKICAgY2FzZSBUYXJnZXRDWFhBQkk6OkdlbmVyaWNJdGFuaXVtOgogICBjYXNlIFRhcmdldENYWEFCSTo6R2VuZXJpY0FSTToKICAgY2FzZSBUYXJnZXRDWFhBQkk6OmlPUzoKKyAgY2FzZSBUYXJnZXRDWFhBQkk6OmlPUzY0OgogICAgIHJldHVybiBJdGFuaXVtTWFuZ2xlQ29udGV4dDo6Y3JlYXRlKCp0aGlzLCBnZXREaWFnbm9zdGljcygpKTsKICAgY2FzZSBUYXJnZXRDWFhBQkk6Ok1pY3Jvc29mdDoKICAgICByZXR1cm4gTWljcm9zb2Z0TWFuZ2xlQ29udGV4dDo6Y3JlYXRlKCp0aGlzLCBnZXREaWFnbm9zdGljcygpKTsKQEAgLTgwNzEsNiArNzk4NiwxNyBAQAogICByZXR1cm4gSSAhPSBNYW5nbGVOdW1iZXJzLmVuZCgpID8gSS0+c2Vjb25kIDogMTsKIH0KIAordm9pZCBBU1RDb250ZXh0OjpzZXRTdGF0aWNMb2NhbE51bWJlcihjb25zdCBWYXJEZWNsICpWRCwgdW5zaWduZWQgTnVtYmVyKSB7CisgIGlmIChOdW1iZXIgPiAxKQorICAgIFN0YXRpY0xvY2FsTnVtYmVyc1tWRF0gPSBOdW1iZXI7Cit9CisKK3Vuc2lnbmVkIEFTVENvbnRleHQ6OmdldFN0YXRpY0xvY2FsTnVtYmVyKGNvbnN0IFZhckRlY2wgKlZEKSBjb25zdCB7CisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IFZhckRlY2wgKiwgdW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvciBJID0KKyAgICAgIFN0YXRpY0xvY2FsTnVtYmVycy5maW5kKFZEKTsKKyAgcmV0dXJuIEkgIT0gU3RhdGljTG9jYWxOdW1iZXJzLmVuZCgpID8gSS0+c2Vjb25kIDogMTsKK30KKwogTWFuZ2xlTnVtYmVyaW5nQ29udGV4dCAmCiBBU1RDb250ZXh0OjpnZXRNYW5nbGluZ051bWJlckNvbnRleHQoY29uc3QgRGVjbENvbnRleHQgKkRDKSB7CiAgIGFzc2VydChMYW5nT3B0cy5DUGx1c1BsdXMpOyAgLy8gV2UgZG9uJ3QgbmVlZCBtYW5nbGluZyBudW1iZXJzIGZvciBwbGFpbiBDLgpAQCAtODIzMCw4ICs4MTU2LDcgQEAKICAgaWYgKE1ldGhvZERlY2wtPmdldE9iakNEZWNsUXVhbGlmaWVyKCkgIT0KICAgICAgIE1ldGhvZEltcGwtPmdldE9iakNEZWNsUXVhbGlmaWVyKCkpCiAgICAgcmV0dXJuIGZhbHNlOwotICBpZiAoIWhhc1NhbWVUeXBlKE1ldGhvZERlY2wtPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICBNZXRob2RJbXBsLT5nZXRSZXN1bHRUeXBlKCkpKQorICBpZiAoIWhhc1NhbWVUeXBlKE1ldGhvZERlY2wtPmdldFJldHVyblR5cGUoKSwgTWV0aG9kSW1wbC0+Z2V0UmV0dXJuVHlwZSgpKSkKICAgICByZXR1cm4gZmFsc2U7CiAgIAogICBpZiAoTWV0aG9kRGVjbC0+cGFyYW1fc2l6ZSgpICE9IE1ldGhvZEltcGwtPnBhcmFtX3NpemUoKSkKZGlmZiAtLWdpdCBhL2xpYi9BU1QvQVNURGlhZ25vc3RpYy5jcHAgYi9saWIvQVNUL0FTVERpYWdub3N0aWMuY3BwCmluZGV4IGZjZThmNjQuLjdjNmJlYzQgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvQVNURGlhZ25vc3RpYy5jcHAKKysrIGIvbGliL0FTVC9BU1REaWFnbm9zdGljLmNwcApAQCAtMTIsNiArMTIsNyBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KICNpbmNsdWRlICJjbGFuZy9BU1QvQVNURGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0F0dHIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbE9iakMuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJDWFguaCIKQEAgLTUxLDYgKzUyLDExIEBACiAgICAgICBRVCA9IEFULT5kZXN1Z2FyKCk7CiAgICAgICBjb250aW51ZTsKICAgICB9CisgICAgLy8gLi4ub3IgYW4gYWRqdXN0ZWQgdHlwZS4uLgorICAgIGlmIChjb25zdCBBZGp1c3RlZFR5cGUgKkFUID0gZHluX2Nhc3Q8QWRqdXN0ZWRUeXBlPihUeSkpIHsKKyAgICAgIFFUID0gQVQtPmRlc3VnYXIoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KICAgICAvLyAuLi4gb3IgYW4gYXV0byB0eXBlLgogICAgIGlmIChjb25zdCBBdXRvVHlwZSAqQVQgPSBkeW5fY2FzdDxBdXRvVHlwZT4oVHkpKSB7CiAgICAgICBpZiAoIUFULT5pc1N1Z2FyZWQoKSkKQEAgLTM1NCw2ICszNjAsMTQgQEAKICAgICAgIE5lZWRRdW90ZXMgPSBmYWxzZTsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBjYXNlIERpYWdub3N0aWNzRW5naW5lOjpha19hdHRyOiB7CisgICAgICBjb25zdCBBdHRyICpBdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXR0ciAqPihWYWwpOworICAgICAgYXNzZXJ0KEF0ICYmICJSZWNlaXZlZCBudWxsIEF0dHIgb2JqZWN0ISIpOworICAgICAgT1MgPDwgJ1wnJyA8PCBBdC0+Z2V0U3BlbGxpbmcoKSA8PCAnXCcnOworICAgICAgTmVlZFF1b3RlcyA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorCiAgIH0KIAogICBPUy5mbHVzaCgpOwpAQCAtMTM0OSw4ICsxMzYzLDcgQEAKICAgICAgICAgRnJvbVR5cGUuZ2V0TG9jYWxVbnF1YWxpZmllZFR5cGUoKSA9PQogICAgICAgICBUb1R5cGUuZ2V0TG9jYWxVbnF1YWxpZmllZFR5cGUoKSkgewogICAgICAgUXVhbGlmaWVycyBGcm9tUXVhbCA9IEZyb21UeXBlLmdldExvY2FsUXVhbGlmaWVycygpLAotICAgICAgICAgICAgICAgICBUb1F1YWwgPSBUb1R5cGUuZ2V0TG9jYWxRdWFsaWZpZXJzKCksCi0gICAgICAgICAgICAgICAgIENvbW1vblF1YWw7CisgICAgICAgICAgICAgICAgIFRvUXVhbCA9IFRvVHlwZS5nZXRMb2NhbFF1YWxpZmllcnMoKTsKICAgICAgIFByaW50UXVhbGlmaWVycyhGcm9tUXVhbCwgVG9RdWFsKTsKICAgICAgIEZyb21UeXBlLmdldExvY2FsVW5xdWFsaWZpZWRUeXBlKCkucHJpbnQoT1MsIFBvbGljeSk7CiAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9saWIvQVNUL0FTVER1bXBlci5jcHAgYi9saWIvQVNUL0FTVER1bXBlci5jcHAKaW5kZXggMmY0MDI1NS4uZGNmYmEzZSAxMDA2NDQKLS0tIGEvbGliL0FTVC9BU1REdW1wZXIuY3BwCisrKyBiL2xpYi9BU1QvQVNURHVtcGVyLmNwcApAQCAtMzIsMTIgKzMyLDIzIEBACiAKIG5hbWVzcGFjZSAgewogICAvLyBDb2xvcnMgdXNlZCBmb3IgdmFyaW91cyBwYXJ0cyBvZiB0aGUgQVNUIGR1bXAKKyAgLy8gRG8gbm90IHVzZSBib2xkIHllbGxvdyBmb3IgYW55IHRleHQuICBJdCBpcyBoYXJkIHRvIHJlYWQgb24gd2hpdGUgc2NyZWVucy4KIAogICBzdHJ1Y3QgVGVybWluYWxDb2xvciB7CiAgICAgcmF3X29zdHJlYW06OkNvbG9ycyBDb2xvcjsKICAgICBib29sIEJvbGQ7CiAgIH07CiAKKyAgLy8gUmVkICAgICAgICAgICAtIENhc3RDb2xvcgorICAvLyBHcmVlbiAgICAgICAgIC0gVHlwZUNvbG9yCisgIC8vIEJvbGQgR3JlZW4gICAgLSBEZWNsS2luZE5hbWVDb2xvciwgVW5kZXNlcmlhbGl6ZWRDb2xvcgorICAvLyBZZWxsb3cgICAgICAgIC0gQWRkcmVzc0NvbG9yLCBMb2NhdGlvbkNvbG9yCisgIC8vIEJsdWUgICAgICAgICAgLSBDb21tZW50Q29sb3IsIE51bGxDb2xvciwgSW5kZW50Q29sb3IKKyAgLy8gQm9sZCBCbHVlICAgICAtIEF0dHJDb2xvcgorICAvLyBCb2xkIE1hZ2VudGEgIC0gU3RtdENvbG9yCisgIC8vIEN5YW4gICAgICAgICAgLSBWYWx1ZUtpbmRDb2xvciwgT2JqZWN0S2luZENvbG9yCisgIC8vIEJvbGQgQ3lhbiAgICAgLSBWYWx1ZUNvbG9yLCBEZWNsTmFtZUNvbG9yCisKICAgLy8gRGVjbCBraW5kIG5hbWVzIChWYXJEZWNsLCBGdW5jdGlvbkRlY2wsIGV0YykKICAgc3RhdGljIGNvbnN0IFRlcm1pbmFsQ29sb3IgRGVjbEtpbmROYW1lQ29sb3IgPSB7IHJhd19vc3RyZWFtOjpHUkVFTiwgdHJ1ZSB9OwogICAvLyBBdHRyIG5hbWVzIChDbGVhbnVwQXR0ciwgR3VhcmRlZEJ5QXR0ciwgZXRjKQpAQCAtNDUsNyArNTYsNyBAQAogICAvLyBTdGF0ZW1lbnQgbmFtZXMgKERlY2xTdG10LCBJbXBsaWNpdENhc3RFeHByLCBldGMpCiAgIHN0YXRpYyBjb25zdCBUZXJtaW5hbENvbG9yIFN0bXRDb2xvciA9IHsgcmF3X29zdHJlYW06Ok1BR0VOVEEsIHRydWUgfTsKICAgLy8gQ29tbWVudCBuYW1lcyAoRnVsbENvbW1lbnQsIFBhcmFncmFwaENvbW1lbnQsIFRleHRDb21tZW50LCBldGMpCi0gIHN0YXRpYyBjb25zdCBUZXJtaW5hbENvbG9yIENvbW1lbnRDb2xvciA9IHsgcmF3X29zdHJlYW06OllFTExPVywgdHJ1ZSB9OworICBzdGF0aWMgY29uc3QgVGVybWluYWxDb2xvciBDb21tZW50Q29sb3IgPSB7IHJhd19vc3RyZWFtOjpCTFVFLCBmYWxzZSB9OwogCiAgIC8vIFR5cGUgbmFtZXMgKGludCwgZmxvYXQsIGV0YywgcGx1cyB1c2VyIGRlZmluZWQgdHlwZXMpCiAgIHN0YXRpYyBjb25zdCBUZXJtaW5hbENvbG9yIFR5cGVDb2xvciA9IHsgcmF3X29zdHJlYW06OkdSRUVOLCBmYWxzZSB9OwpAQCAtMTM4LDYgKzE0OSwzOCBAQAogICAgICAgfQogICAgIH07CiAKKyAgICBjbGFzcyBDaGlsZER1bXBlciB7CisgICAgICBBU1REdW1wZXIgJkR1bXBlcjsKKworICAgICAgY29uc3QgRGVjbCAqUHJldjsKKyAgICAgIGJvb2wgUHJldlJlZjsKKyAgICBwdWJsaWM6CisgICAgICBDaGlsZER1bXBlcihBU1REdW1wZXIgJkR1bXBlcikgOiBEdW1wZXIoRHVtcGVyKSwgUHJldigwKSB7fQorICAgICAgfkNoaWxkRHVtcGVyKCkgeworICAgICAgICBpZiAoUHJldikgeworICAgICAgICAgIER1bXBlci5sYXN0Q2hpbGQoKTsKKyAgICAgICAgICBkdW1wKDApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCB0YWtlIGFuIGFyYml0cmFyeSBjYWxsYWJsZSBhcyB0aGUgZHVtcGluZyBhY3Rpb24uCisgICAgICB2b2lkIGR1bXAoY29uc3QgRGVjbCAqRCwgYm9vbCBSZWYgPSBmYWxzZSkgeworICAgICAgICBpZiAoUHJldikgeworICAgICAgICAgIGlmIChQcmV2UmVmKQorICAgICAgICAgICAgRHVtcGVyLmR1bXBEZWNsUmVmKFByZXYpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIER1bXBlci5kdW1wRGVjbChQcmV2KTsKKyAgICAgICAgfQorICAgICAgICBQcmV2ID0gRDsKKyAgICAgICAgUHJldlJlZiA9IFJlZjsKKyAgICAgIH0KKyAgICAgIHZvaWQgZHVtcFJlZihjb25zdCBEZWNsICpEKSB7IGR1bXAoRCwgdHJ1ZSk7IH0KKworICAgICAgLy8gR2l2ZSB1cCBvd25lcnNoaXAgb2YgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlLiBCeSBjYWxsaW5nIHRoaXMsCisgICAgICAvLyB0aGUgY2FsbGVyIHRha2VzIGJhY2sgcmVzcG9uc2liaWxpdHkgZm9yIGNhbGxpbmcgbGFzdENoaWxkKCkuCisgICAgICB2b2lkIHJlbGVhc2UoKSB7IGR1bXAoMCk7IH0KKyAgICB9OworCiAgIHB1YmxpYzoKICAgICBBU1REdW1wZXIocmF3X29zdHJlYW0gJk9TLCBjb25zdCBDb21tYW5kVHJhaXRzICpUcmFpdHMsCiAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgKlNNKQpAQCAtMjExLDYgKzI1NCwxMyBAQAogICAgIHZvaWQgVmlzaXRUeXBlQWxpYXNUZW1wbGF0ZURlY2woY29uc3QgVHlwZUFsaWFzVGVtcGxhdGVEZWNsICpEKTsKICAgICB2b2lkIFZpc2l0Q1hYUmVjb3JkRGVjbChjb25zdCBDWFhSZWNvcmREZWNsICpEKTsKICAgICB2b2lkIFZpc2l0U3RhdGljQXNzZXJ0RGVjbChjb25zdCBTdGF0aWNBc3NlcnREZWNsICpEKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTcGVjaWFsaXphdGlvbkRlY2w+CisgICAgdm9pZCBWaXNpdFRlbXBsYXRlRGVjbFNwZWNpYWxpemF0aW9uKENoaWxkRHVtcGVyICZDaGlsZHJlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BlY2lhbGl6YXRpb25EZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIER1bXBFeHBsaWNpdEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRHVtcFJlZk9ubHkpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRlbXBsYXRlRGVjbD4KKyAgICB2b2lkIFZpc2l0VGVtcGxhdGVEZWNsKGNvbnN0IFRlbXBsYXRlRGVjbCAqRCwgYm9vbCBEdW1wRXhwbGljaXRJbnN0KTsKICAgICB2b2lkIFZpc2l0RnVuY3Rpb25UZW1wbGF0ZURlY2woY29uc3QgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkQpOwogICAgIHZvaWQgVmlzaXRDbGFzc1RlbXBsYXRlRGVjbChjb25zdCBDbGFzc1RlbXBsYXRlRGVjbCAqRCk7CiAgICAgdm9pZCBWaXNpdENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2woCkBAIC01MDAsMTcgKzU1MCwxNCBAQAogdm9pZCBBU1REdW1wZXI6OmR1bXBEZWNsQ29udGV4dChjb25zdCBEZWNsQ29udGV4dCAqREMpIHsKICAgaWYgKCFEQykKICAgICByZXR1cm47Ci0gIGJvb2wgSGFzVW5kZXNlcmlhbGl6ZWREZWNscyA9IERDLT5oYXNFeHRlcm5hbExleGljYWxTdG9yYWdlKCk7Ci0gIGZvciAoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgSSA9IERDLT5ub2xvYWRfZGVjbHNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gREMtPm5vbG9hZF9kZWNsc19lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIE5leHQgPSBJOwotICAgICsrTmV4dDsKLSAgICBpZiAoTmV4dCA9PSBFICYmICFIYXNVbmRlc2VyaWFsaXplZERlY2xzKQotICAgICAgbGFzdENoaWxkKCk7Ci0gICAgZHVtcERlY2woKkkpOwotICB9Ci0gIGlmIChIYXNVbmRlc2VyaWFsaXplZERlY2xzKSB7CisKKyAgQ2hpbGREdW1wZXIgQ2hpbGRyZW4oKnRoaXMpOworICBmb3IgKGF1dG8gKkQgOiBEQy0+bm9sb2FkX2RlY2xzKCkpCisgICAgQ2hpbGRyZW4uZHVtcChEKTsKKworICBpZiAoREMtPmhhc0V4dGVybmFsTGV4aWNhbFN0b3JhZ2UoKSkgeworICAgIENoaWxkcmVuLnJlbGVhc2UoKTsKKwogICAgIGxhc3RDaGlsZCgpOwogICAgIEluZGVudFNjb3BlIEluZGVudCgqdGhpcyk7CiAgICAgQ29sb3JTY29wZSBDb2xvcigqdGhpcywgVW5kZXNlcmlhbGl6ZWRDb2xvcik7CkBAIC01NjksNiArNjE2LDcgQEAKICAgSW5kZW50U2NvcGUgSW5kZW50KCp0aGlzKTsKICAgewogICAgIENvbG9yU2NvcGUgQ29sb3IoKnRoaXMsIEF0dHJDb2xvcik7CisKICAgICBzd2l0Y2ggKEEtPmdldEtpbmQoKSkgewogI2RlZmluZSBBVFRSKFgpIGNhc2UgYXR0cjo6WDogT1MgPDwgI1g7IGJyZWFrOwogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0F0dHJMaXN0LmluYyIKQEAgLTU3OSw2ICs2MjcsOCBAQAogICBkdW1wUG9pbnRlcihBKTsKICAgZHVtcFNvdXJjZVJhbmdlKEEtPmdldFJhbmdlKCkpOwogI2luY2x1ZGUgImNsYW5nL0FTVC9BdHRyRHVtcC5pbmMiCisgIGlmIChBLT5pc0ltcGxpY2l0KCkpCisgICAgT1MgPDwgIiBJbXBsaWNpdCI7CiB9CiAKIHN0YXRpYyB2b2lkIGR1bXBQcmV2aW91c0RlY2xJbXBsKHJhd19vc3RyZWFtICZPUywgLi4uKSB7fQpAQCAtNzQyLDEzICs3OTIsMTUgQEAKICAgICBPUyA8PCAiIHBhcmVudCAiIDw8IGNhc3Q8RGVjbD4oRC0+Z2V0RGVjbENvbnRleHQoKSk7CiAgIGR1bXBQcmV2aW91c0RlY2woT1MsIEQpOwogICBkdW1wU291cmNlUmFuZ2UoRC0+Z2V0U291cmNlUmFuZ2UoKSk7CisgIE9TIDw8ICcgJzsKKyAgZHVtcExvY2F0aW9uKEQtPmdldExvY2F0aW9uKCkpOwogICBpZiAoTW9kdWxlICpNID0gRC0+Z2V0T3duaW5nTW9kdWxlKCkpCiAgICAgT1MgPDwgIiBpbiAiIDw8IE0tPmdldEZ1bGxNb2R1bGVOYW1lKCk7CiAgIGlmIChjb25zdCBOYW1lZERlY2wgKk5EID0gZHluX2Nhc3Q8TmFtZWREZWNsPihEKSkKICAgICBpZiAoTkQtPmlzSGlkZGVuKCkpCiAgICAgICBPUyA8PCAiIGhpZGRlbiI7CiAKLSAgYm9vbCBIYXNBdHRycyA9IEQtPmF0dHJfYmVnaW4oKSAhPSBELT5hdHRyX2VuZCgpOworICBib29sIEhhc0F0dHJzID0gRC0+aGFzQXR0cnMoKTsKICAgY29uc3QgRnVsbENvbW1lbnQgKkNvbW1lbnQgPQogICAgICAgRC0+Z2V0QVNUQ29udGV4dCgpLmdldExvY2FsQ29tbWVudEZvckRlY2xVbmNhY2hlZChEKTsKICAgLy8gRGVjbHMgd2l0aGluIGZ1bmN0aW9ucyBhcmUgdmlzaXRlZCBieSB0aGUgYm9keQpAQCAtODI0LDEzICs4NzYsMTAgQEAKIHZvaWQgQVNURHVtcGVyOjpWaXNpdEluZGlyZWN0RmllbGREZWNsKGNvbnN0IEluZGlyZWN0RmllbGREZWNsICpEKSB7CiAgIGR1bXBOYW1lKEQpOwogICBkdW1wVHlwZShELT5nZXRUeXBlKCkpOwotICBmb3IgKEluZGlyZWN0RmllbGREZWNsOjpjaGFpbl9pdGVyYXRvciBJID0gRC0+Y2hhaW5fYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IEQtPmNoYWluX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgaWYgKEkgKyAxID09IEUpCi0gICAgICBsYXN0Q2hpbGQoKTsKLSAgICBkdW1wRGVjbFJlZigqSSk7Ci0gIH0KKworICBDaGlsZER1bXBlciBDaGlsZHJlbigqdGhpcyk7CisgIGZvciAoYXV0byAqQ2hpbGQgOiBELT5jaGFpbigpKQorICAgIENoaWxkcmVuLmR1bXBSZWYoQ2hpbGQpOwogfQogCiB2b2lkIEFTVER1bXBlcjo6VmlzaXRGdW5jdGlvbkRlY2woY29uc3QgRnVuY3Rpb25EZWNsICpEKSB7CkBAIC0xMDE2LDE1ICsxMDY1LDEzIEBACiAgIGlmICghRC0+aXNDb21wbGV0ZURlZmluaXRpb24oKSkKICAgICByZXR1cm47CiAKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IEQtPmJhc2VzX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IEQtPmJhc2VzKCkpIHsKICAgICBJbmRlbnRTY29wZSBJbmRlbnQoKnRoaXMpOwotICAgIGlmIChJLT5pc1ZpcnR1YWwoKSkKKyAgICBpZiAoSS5pc1ZpcnR1YWwoKSkKICAgICAgIE9TIDw8ICJ2aXJ0dWFsICI7Ci0gICAgZHVtcEFjY2Vzc1NwZWNpZmllcihJLT5nZXRBY2Nlc3NTcGVjaWZpZXIoKSk7Ci0gICAgZHVtcFR5cGUoSS0+Z2V0VHlwZSgpKTsKLSAgICBpZiAoSS0+aXNQYWNrRXhwYW5zaW9uKCkpCisgICAgZHVtcEFjY2Vzc1NwZWNpZmllcihJLmdldEFjY2Vzc1NwZWNpZmllcigpKTsKKyAgICBkdW1wVHlwZShJLmdldFR5cGUoKSk7CisgICAgaWYgKEkuaXNQYWNrRXhwYW5zaW9uKCkpCiAgICAgICBPUyA8PCAiLi4uIjsKICAgfQogfQpAQCAtMTAzNSw2MyArMTA4Miw2OSBAQAogICBkdW1wU3RtdChELT5nZXRNZXNzYWdlKCkpOwogfQogCi12b2lkIEFTVER1bXBlcjo6VmlzaXRGdW5jdGlvblRlbXBsYXRlRGVjbChjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRCkgewotICBkdW1wTmFtZShEKTsKLSAgZHVtcFRlbXBsYXRlUGFyYW1ldGVycyhELT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSk7Ci0gIGR1bXBEZWNsKEQtPmdldFRlbXBsYXRlZERlY2woKSk7Ci0gIGZvciAoRnVuY3Rpb25UZW1wbGF0ZURlY2w6OnNwZWNfaXRlcmF0b3IgSSA9IEQtPnNwZWNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRC0+c3BlY19lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIEZ1bmN0aW9uVGVtcGxhdGVEZWNsOjpzcGVjX2l0ZXJhdG9yIE5leHQgPSBJOwotICAgICsrTmV4dDsKLSAgICBpZiAoTmV4dCA9PSBFKQotICAgICAgbGFzdENoaWxkKCk7Ci0gICAgc3dpdGNoIChJLT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpKSB7Ci0gICAgY2FzZSBUU0tfVW5kZWNsYXJlZDoKLSAgICBjYXNlIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb246Cit0ZW1wbGF0ZTx0eXBlbmFtZSBTcGVjaWFsaXphdGlvbkRlY2w+Cit2b2lkIEFTVER1bXBlcjo6VmlzaXRUZW1wbGF0ZURlY2xTcGVjaWFsaXphdGlvbihDaGlsZER1bXBlciAmQ2hpbGRyZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTcGVjaWFsaXphdGlvbkRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIER1bXBFeHBsaWNpdEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIER1bXBSZWZPbmx5KSB7CisgIGJvb2wgRHVtcGVkQW55ID0gZmFsc2U7CisgIGZvciAoYXV0byAqUmVkZWNsV2l0aEJhZFR5cGUgOiBELT5yZWRlY2xzKCkpIHsKKyAgICAvLyBGSVhNRTogVGhlIHJlZGVjbHMoKSByYW5nZSBzb21ldGltZXMgaGFzIGVsZW1lbnRzIG9mIGEgbGVzcy1zcGVjaWZpYworICAgIC8vIHR5cGUuIChJbiBwYXJ0aWN1bGFyLCBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsOjpyZWRlY2xzKCkgZ2l2ZXMKKyAgICAvLyB1cyBUYWdEZWNscywgYW5kIHNob3VsZCBnaXZlIENYWFJlY29yZERlY2xzKS4KKyAgICBhdXRvICpSZWRlY2wgPSBkeW5fY2FzdDxTcGVjaWFsaXphdGlvbkRlY2w+KFJlZGVjbFdpdGhCYWRUeXBlKTsKKyAgICBpZiAoIVJlZGVjbCkgeworICAgICAgLy8gRm91bmQgdGhlIGluamVjdGVkLWNsYXNzLW5hbWUgZm9yIGEgY2xhc3MgdGVtcGxhdGUuIFRoaXMgd2lsbCBiZSBkdW1wZWQKKyAgICAgIC8vIGFzIHBhcnQgb2YgaXRzIHN1cnJvdW5kaW5nIGNsYXNzIHNvIHdlIGRvbid0IG5lZWQgdG8gZHVtcCBpdCBoZXJlLgorICAgICAgYXNzZXJ0KGlzYTxDWFhSZWNvcmREZWNsPihSZWRlY2xXaXRoQmFkVHlwZSkgJiYKKyAgICAgICAgICAgICAiZXhwZWN0ZWQgYW4gaW5qZWN0ZWQtY2xhc3MtbmFtZSIpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc3dpdGNoIChSZWRlY2wtPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkpIHsKICAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWNsYXJhdGlvbjoKICAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWZpbml0aW9uOgotICAgICAgaWYgKEQgPT0gRC0+Z2V0Q2Fub25pY2FsRGVjbCgpKQotICAgICAgICBkdW1wRGVjbCgqSSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGR1bXBEZWNsUmVmKCpJKTsKKyAgICAgIGlmICghRHVtcEV4cGxpY2l0SW5zdCkKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBGYWxsIHRocm91Z2guCisgICAgY2FzZSBUU0tfVW5kZWNsYXJlZDoKKyAgICBjYXNlIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb246CisgICAgICBDaGlsZHJlbi5kdW1wKFJlZGVjbCwgRHVtcFJlZk9ubHkpOworICAgICAgRHVtcGVkQW55ID0gdHJ1ZTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246Ci0gICAgICBkdW1wRGVjbFJlZigqSSk7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KKworICAvLyBFbnN1cmUgd2UgZHVtcCBhdCBsZWFzdCBvbmUgZGVjbCBmb3IgZWFjaCBzcGVjaWFsaXphdGlvbi4KKyAgaWYgKCFEdW1wZWRBbnkpCisgICAgQ2hpbGRyZW4uZHVtcFJlZihEKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVGVtcGxhdGVEZWNsPgordm9pZCBBU1REdW1wZXI6OlZpc2l0VGVtcGxhdGVEZWNsKGNvbnN0IFRlbXBsYXRlRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIER1bXBFeHBsaWNpdEluc3QpIHsKKyAgZHVtcE5hbWUoRCk7CisgIGR1bXBUZW1wbGF0ZVBhcmFtZXRlcnMoRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkpOworCisgIENoaWxkRHVtcGVyIENoaWxkcmVuKCp0aGlzKTsKKyAgQ2hpbGRyZW4uZHVtcChELT5nZXRUZW1wbGF0ZWREZWNsKCkpOworCisgIGZvciAoYXV0byAqQ2hpbGQgOiBELT5zcGVjaWFsaXphdGlvbnMoKSkKKyAgICBWaXNpdFRlbXBsYXRlRGVjbFNwZWNpYWxpemF0aW9uKENoaWxkcmVuLCBDaGlsZCwgRHVtcEV4cGxpY2l0SW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFELT5pc0Nhbm9uaWNhbERlY2woKSk7Cit9CisKK3ZvaWQgQVNURHVtcGVyOjpWaXNpdEZ1bmN0aW9uVGVtcGxhdGVEZWNsKGNvbnN0IEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpEKSB7CisgIC8vIEZJWE1FOiBXZSBkb24ndCBhZGQgYSBkZWNsYXJhdGlvbiBvZiBhIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uCisgIC8vIHRvIGl0cyBjb250ZXh0IHdoZW4gaXQncyBleHBsaWNpdGx5IGluc3RhbnRpYXRlZCwgc28gZHVtcCBleHBsaWNpdAorICAvLyBpbnN0YW50aWF0aW9ucyB3aGVuIHdlIGR1bXAgdGhlIHRlbXBsYXRlIGl0c2VsZi4KKyAgVmlzaXRUZW1wbGF0ZURlY2woRCwgdHJ1ZSk7CiB9CiAKIHZvaWQgQVNURHVtcGVyOjpWaXNpdENsYXNzVGVtcGxhdGVEZWNsKGNvbnN0IENsYXNzVGVtcGxhdGVEZWNsICpEKSB7Ci0gIGR1bXBOYW1lKEQpOwotICBkdW1wVGVtcGxhdGVQYXJhbWV0ZXJzKEQtPmdldFRlbXBsYXRlUGFyYW1ldGVycygpKTsKLQotICBDbGFzc1RlbXBsYXRlRGVjbDo6c3BlY19pdGVyYXRvciBJID0gRC0+c3BlY19iZWdpbigpOwotICBDbGFzc1RlbXBsYXRlRGVjbDo6c3BlY19pdGVyYXRvciBFID0gRC0+c3BlY19lbmQoKTsKLSAgaWYgKEkgPT0gRSkKLSAgICBsYXN0Q2hpbGQoKTsKLSAgZHVtcERlY2woRC0+Z2V0VGVtcGxhdGVkRGVjbCgpKTsKLSAgZm9yICg7IEkgIT0gRTsgKytJKSB7Ci0gICAgQ2xhc3NUZW1wbGF0ZURlY2w6OnNwZWNfaXRlcmF0b3IgTmV4dCA9IEk7Ci0gICAgKytOZXh0OwotICAgIGlmIChOZXh0ID09IEUpCi0gICAgICBsYXN0Q2hpbGQoKTsKLSAgICBzd2l0Y2ggKEktPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkpIHsKLSAgICBjYXNlIFRTS19VbmRlY2xhcmVkOgotICAgIGNhc2UgVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbjoKLSAgICAgIGlmIChEID09IEQtPmdldENhbm9uaWNhbERlY2woKSkKLSAgICAgICAgZHVtcERlY2woKkkpOwotICAgICAgZWxzZQotICAgICAgICBkdW1wRGVjbFJlZigqSSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uOgotICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uOgotICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlZmluaXRpb246Ci0gICAgICBkdW1wRGVjbFJlZigqSSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KKyAgVmlzaXRUZW1wbGF0ZURlY2woRCwgZmFsc2UpOwogfQogCiB2b2lkIEFTVER1bXBlcjo6VmlzaXRDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKApAQCAtMTExNCwzNCArMTE2Nyw3IEBACiB9CiAKIHZvaWQgQVNURHVtcGVyOjpWaXNpdFZhclRlbXBsYXRlRGVjbChjb25zdCBWYXJUZW1wbGF0ZURlY2wgKkQpIHsKLSAgZHVtcE5hbWUoRCk7Ci0gIGR1bXBUZW1wbGF0ZVBhcmFtZXRlcnMoRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkpOwotCi0gIFZhclRlbXBsYXRlRGVjbDo6c3BlY19pdGVyYXRvciBJID0gRC0+c3BlY19iZWdpbigpOwotICBWYXJUZW1wbGF0ZURlY2w6OnNwZWNfaXRlcmF0b3IgRSA9IEQtPnNwZWNfZW5kKCk7Ci0gIGlmIChJID09IEUpCi0gICAgbGFzdENoaWxkKCk7Ci0gIGR1bXBEZWNsKEQtPmdldFRlbXBsYXRlZERlY2woKSk7Ci0gIGZvciAoOyBJICE9IEU7ICsrSSkgewotICAgIFZhclRlbXBsYXRlRGVjbDo6c3BlY19pdGVyYXRvciBOZXh0ID0gSTsKLSAgICArK05leHQ7Ci0gICAgaWYgKE5leHQgPT0gRSkKLSAgICAgIGxhc3RDaGlsZCgpOwotICAgIHN3aXRjaCAoSS0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSkgewotICAgIGNhc2UgVFNLX1VuZGVjbGFyZWQ6Ci0gICAgY2FzZSBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uOgotICAgICAgaWYgKEQgPT0gRC0+Z2V0Q2Fub25pY2FsRGVjbCgpKQotICAgICAgICBkdW1wRGVjbCgqSSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGR1bXBEZWNsUmVmKCpJKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246Ci0gICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVjbGFyYXRpb246Ci0gICAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVmaW5pdGlvbjoKLSAgICAgIGR1bXBEZWNsUmVmKCpJKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQorICBWaXNpdFRlbXBsYXRlRGVjbChELCBmYWxzZSk7CiB9CiAKIHZvaWQgQVNURHVtcGVyOjpWaXNpdFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKApAQCAtMTE2NCw4ICsxMTkwLDEwIEBACiAgIGlmIChELT5pc1BhcmFtZXRlclBhY2soKSkKICAgICBPUyA8PCAiIC4uLiI7CiAgIGR1bXBOYW1lKEQpOwotICBpZiAoRC0+aGFzRGVmYXVsdEFyZ3VtZW50KCkpCi0gICAgZHVtcFR5cGUoRC0+Z2V0RGVmYXVsdEFyZ3VtZW50KCkpOworICBpZiAoRC0+aGFzRGVmYXVsdEFyZ3VtZW50KCkpIHsKKyAgICBsYXN0Q2hpbGQoKTsKKyAgICBkdW1wVGVtcGxhdGVBcmd1bWVudChELT5nZXREZWZhdWx0QXJndW1lbnQoKSk7CisgIH0KIH0KIAogdm9pZCBBU1REdW1wZXI6OlZpc2l0Tm9uVHlwZVRlbXBsYXRlUGFybURlY2woY29uc3QgTm9uVHlwZVRlbXBsYXRlUGFybURlY2wgKkQpIHsKQEAgLTExNzMsOCArMTIwMSwxMCBAQAogICBpZiAoRC0+aXNQYXJhbWV0ZXJQYWNrKCkpCiAgICAgT1MgPDwgIiAuLi4iOwogICBkdW1wTmFtZShEKTsKLSAgaWYgKEQtPmhhc0RlZmF1bHRBcmd1bWVudCgpKQotICAgIGR1bXBTdG10KEQtPmdldERlZmF1bHRBcmd1bWVudCgpKTsKKyAgaWYgKEQtPmhhc0RlZmF1bHRBcmd1bWVudCgpKSB7CisgICAgbGFzdENoaWxkKCk7CisgICAgZHVtcFRlbXBsYXRlQXJndW1lbnQoRC0+Z2V0RGVmYXVsdEFyZ3VtZW50KCkpOworICB9CiB9CiAKIHZvaWQgQVNURHVtcGVyOjpWaXNpdFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCgKQEAgLTExODMsOCArMTIxMywxMCBAQAogICAgIE9TIDw8ICIgLi4uIjsKICAgZHVtcE5hbWUoRCk7CiAgIGR1bXBUZW1wbGF0ZVBhcmFtZXRlcnMoRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkpOwotICBpZiAoRC0+aGFzRGVmYXVsdEFyZ3VtZW50KCkpCisgIGlmIChELT5oYXNEZWZhdWx0QXJndW1lbnQoKSkgeworICAgIGxhc3RDaGlsZCgpOwogICAgIGR1bXBUZW1wbGF0ZUFyZ3VtZW50TG9jKEQtPmdldERlZmF1bHRBcmd1bWVudCgpKTsKKyAgfQogfQogCiB2b2lkIEFTVER1bXBlcjo6VmlzaXRVc2luZ0RlY2woY29uc3QgVXNpbmdEZWNsICpEKSB7CkBAIC0xMjQxLDggKzEyNzMsNiBAQAogICBkdW1wVHlwZShELT5nZXRUeXBlKCkpOwogICBpZiAoRC0+Z2V0U3ludGhlc2l6ZSgpKQogICAgIE9TIDw8ICIgc3ludGhlc2l6ZSI7Ci0gIGlmIChELT5nZXRCYWNraW5nSXZhclJlZmVyZW5jZWRJbkFjY2Vzc29yKCkpCi0gICAgT1MgPDwgIiBCYWNraW5nSXZhclJlZmVyZW5jZWRJbkFjY2Vzc29yIjsKIAogICBzd2l0Y2ggKEQtPmdldEFjY2Vzc0NvbnRyb2woKSkgewogICBjYXNlIE9iakNJdmFyRGVjbDo6Tm9uZToKQEAgLTEyNjksNyArMTI5OSw3IEBACiAgIGVsc2UKICAgICBPUyA8PCAiICsiOwogICBkdW1wTmFtZShEKTsKLSAgZHVtcFR5cGUoRC0+Z2V0UmVzdWx0VHlwZSgpKTsKKyAgZHVtcFR5cGUoRC0+Z2V0UmV0dXJuVHlwZSgpKTsKIAogICBib29sIE9sZE1vcmVDaGlsZHJlbiA9IGhhc01vcmVDaGlsZHJlbigpOwogICBib29sIElzVmFyaWFkaWMgPSBELT5pc1ZhcmlhZGljKCk7CkBAIC0xMzI3LDI4ICsxMzU3LDIwIEBACiAKIHZvaWQgQVNURHVtcGVyOjpWaXNpdE9iakNQcm90b2NvbERlY2woY29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqRCkgewogICBkdW1wTmFtZShEKTsKLSAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBJID0gRC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRC0+cHJvdG9jb2xfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoSSArIDEgPT0gRSkKLSAgICAgIGxhc3RDaGlsZCgpOwotICAgIGR1bXBEZWNsUmVmKCpJKTsKLSAgfQorCisgIENoaWxkRHVtcGVyIENoaWxkcmVuKCp0aGlzKTsKKyAgZm9yIChhdXRvICpDaGlsZCA6IEQtPnByb3RvY29scygpKQorICAgIENoaWxkcmVuLmR1bXBSZWYoQ2hpbGQpOwogfQogCiB2b2lkIEFTVER1bXBlcjo6VmlzaXRPYmpDSW50ZXJmYWNlRGVjbChjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqRCkgewogICBkdW1wTmFtZShEKTsKICAgZHVtcERlY2xSZWYoRC0+Z2V0U3VwZXJDbGFzcygpLCAic3VwZXIiKTsKLSAgaWYgKEQtPnByb3RvY29sX2JlZ2luKCkgPT0gRC0+cHJvdG9jb2xfZW5kKCkpCi0gICAgbGFzdENoaWxkKCk7Ci0gIGR1bXBEZWNsUmVmKEQtPmdldEltcGxlbWVudGF0aW9uKCkpOwotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBJID0gRC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IEQtPnByb3RvY29sX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgaWYgKEkgKyAxID09IEUpCi0gICAgICBsYXN0Q2hpbGQoKTsKLSAgICBkdW1wRGVjbFJlZigqSSk7Ci0gIH0KKworICBDaGlsZER1bXBlciBDaGlsZHJlbigqdGhpcyk7CisgIENoaWxkcmVuLmR1bXBSZWYoRC0+Z2V0SW1wbGVtZW50YXRpb24oKSk7CisgIGZvciAoYXV0byAqQ2hpbGQgOiBELT5wcm90b2NvbHMoKSkKKyAgICBDaGlsZHJlbi5kdW1wUmVmKENoaWxkKTsKIH0KIAogdm9pZCBBU1REdW1wZXI6OlZpc2l0T2JqQ0ltcGxlbWVudGF0aW9uRGVjbChjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpEKSB7CkBAIC0xNDI3LDkgKzE0NDksOCBAQAogfQogCiB2b2lkIEFTVER1bXBlcjo6VmlzaXRCbG9ja0RlY2woY29uc3QgQmxvY2tEZWNsICpEKSB7Ci0gIGZvciAoQmxvY2tEZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBJID0gRC0+cGFyYW1fYmVnaW4oKSwgRSA9IEQtPnBhcmFtX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKQotICAgIGR1bXBEZWNsKCpJKTsKKyAgZm9yIChhdXRvIEkgOiBELT5wYXJhbXMoKSkKKyAgICBkdW1wRGVjbChJKTsKIAogICBpZiAoRC0+aXNWYXJpYWRpYygpKSB7CiAgICAgSW5kZW50U2NvcGUgSW5kZW50KCp0aGlzKTsKQEAgLTE0NDAsMjAgKzE0NjEsMTkgQEAKICAgICBJbmRlbnRTY29wZSBJbmRlbnQoKnRoaXMpOwogICAgIE9TIDw8ICJjYXB0dXJlIHRoaXMiOwogICB9Ci0gIGZvciAoQmxvY2tEZWNsOjpjYXB0dXJlX2l0ZXJhdG9yIEkgPSBELT5jYXB0dXJlX2JlZ2luKCksIEUgPSBELT5jYXB0dXJlX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IEQtPmNhcHR1cmVzKCkpIHsKICAgICBJbmRlbnRTY29wZSBJbmRlbnQoKnRoaXMpOwogICAgIE9TIDw8ICJjYXB0dXJlIjsKLSAgICBpZiAoSS0+aXNCeVJlZigpKQorICAgIGlmIChJLmlzQnlSZWYoKSkKICAgICAgIE9TIDw8ICIgYnlyZWYiOwotICAgIGlmIChJLT5pc05lc3RlZCgpKQorICAgIGlmIChJLmlzTmVzdGVkKCkpCiAgICAgICBPUyA8PCAiIG5lc3RlZCI7Ci0gICAgaWYgKEktPmdldFZhcmlhYmxlKCkpIHsKKyAgICBpZiAoSS5nZXRWYXJpYWJsZSgpKSB7CiAgICAgICBPUyA8PCAnICc7Ci0gICAgICBkdW1wQmFyZURlY2xSZWYoSS0+Z2V0VmFyaWFibGUoKSk7CisgICAgICBkdW1wQmFyZURlY2xSZWYoSS5nZXRWYXJpYWJsZSgpKTsKICAgICB9Ci0gICAgaWYgKEktPmhhc0NvcHlFeHByKCkpCi0gICAgICBkdW1wU3RtdChJLT5nZXRDb3B5RXhwcigpKTsKKyAgICBpZiAoSS5oYXNDb3B5RXhwcigpKQorICAgICAgZHVtcFN0bXQoSS5nZXRDb3B5RXhwcigpKTsKICAgfQogICBsYXN0Q2hpbGQoKTsKICAgZHVtcFN0bXQoRC0+Z2V0Qm9keSgpKTsKQEAgLTE4MzgsNyArMTg1OCw4IEBACiAKIHZvaWQgQVNURHVtcGVyOjpWaXNpdE9iakNNZXNzYWdlRXhwcihjb25zdCBPYmpDTWVzc2FnZUV4cHIgKk5vZGUpIHsKICAgVmlzaXRFeHByKE5vZGUpOwotICBPUyA8PCAiIHNlbGVjdG9yPSIgPDwgTm9kZS0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpOworICBPUyA8PCAiIHNlbGVjdG9yPSI7CisgIE5vZGUtPmdldFNlbGVjdG9yKCkucHJpbnQoT1MpOwogICBzd2l0Y2ggKE5vZGUtPmdldFJlY2VpdmVyS2luZCgpKSB7CiAgIGNhc2UgT2JqQ01lc3NhZ2VFeHByOjpJbnN0YW5jZToKICAgICBicmVhazsKQEAgLTE4NjAsNyArMTg4MSw4IEBACiAKIHZvaWQgQVNURHVtcGVyOjpWaXNpdE9iakNCb3hlZEV4cHIoY29uc3QgT2JqQ0JveGVkRXhwciAqTm9kZSkgewogICBWaXNpdEV4cHIoTm9kZSk7Ci0gIE9TIDw8ICIgc2VsZWN0b3I9IiA8PCBOb2RlLT5nZXRCb3hpbmdNZXRob2QoKS0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpOworICBPUyA8PCAiIHNlbGVjdG9yPSI7CisgIE5vZGUtPmdldEJveGluZ01ldGhvZCgpLT5nZXRTZWxlY3RvcigpLnByaW50KE9TKTsKIH0KIAogdm9pZCBBU1REdW1wZXI6OlZpc2l0T2JqQ0F0Q2F0Y2hTdG10KGNvbnN0IE9iakNBdENhdGNoU3RtdCAqTm9kZSkgewpAQCAtMTg3OSw3ICsxOTAxLDggQEAKIHZvaWQgQVNURHVtcGVyOjpWaXNpdE9iakNTZWxlY3RvckV4cHIoY29uc3QgT2JqQ1NlbGVjdG9yRXhwciAqTm9kZSkgewogICBWaXNpdEV4cHIoTm9kZSk7CiAKLSAgT1MgPDwgIiAiIDw8IE5vZGUtPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKTsKKyAgT1MgPDwgIiAiOworICBOb2RlLT5nZXRTZWxlY3RvcigpLnByaW50KE9TKTsKIH0KIAogdm9pZCBBU1REdW1wZXI6OlZpc2l0T2JqQ1Byb3RvY29sRXhwcihjb25zdCBPYmpDUHJvdG9jb2xFeHByICpOb2RlKSB7CkBAIC0xODkzLDEzICsxOTE2LDEzIEBACiAgIGlmIChOb2RlLT5pc0ltcGxpY2l0UHJvcGVydHkoKSkgewogICAgIE9TIDw8ICIgS2luZD1NZXRob2RSZWYgR2V0dGVyPVwiIjsKICAgICBpZiAoTm9kZS0+Z2V0SW1wbGljaXRQcm9wZXJ0eUdldHRlcigpKQotICAgICAgT1MgPDwgTm9kZS0+Z2V0SW1wbGljaXRQcm9wZXJ0eUdldHRlcigpLT5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCk7CisgICAgICBOb2RlLT5nZXRJbXBsaWNpdFByb3BlcnR5R2V0dGVyKCktPmdldFNlbGVjdG9yKCkucHJpbnQoT1MpOwogICAgIGVsc2UKICAgICAgIE9TIDw8ICIobnVsbCkiOwogCiAgICAgT1MgPDwgIlwiIFNldHRlcj1cIiI7CiAgICAgaWYgKE9iakNNZXRob2REZWNsICpTZXR0ZXIgPSBOb2RlLT5nZXRJbXBsaWNpdFByb3BlcnR5U2V0dGVyKCkpCi0gICAgICBPUyA8PCBTZXR0ZXItPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKTsKKyAgICAgIFNldHRlci0+Z2V0U2VsZWN0b3IoKS5wcmludChPUyk7CiAgICAgZWxzZQogICAgICAgT1MgPDwgIihudWxsKSI7CiAgICAgT1MgPDwgIlwiIjsKQEAgLTE5MjYsNyArMTk0OSw3IEBACiAgIGVsc2UKICAgICBPUyA8PCAiIEtpbmQ9RGljdGlvbmFyeVN1YnNjcmlwdCBHZXR0ZXJGb3JEaWN0aW9uYXJ5PVwiIjsKICAgaWYgKE5vZGUtPmdldEF0SW5kZXhNZXRob2REZWNsKCkpCi0gICAgT1MgPDwgTm9kZS0+Z2V0QXRJbmRleE1ldGhvZERlY2woKS0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpOworICAgIE5vZGUtPmdldEF0SW5kZXhNZXRob2REZWNsKCktPmdldFNlbGVjdG9yKCkucHJpbnQoT1MpOwogICBlbHNlCiAgICAgT1MgPDwgIihudWxsKSI7CiAKQEAgLTE5MzUsNyArMTk1OCw3IEBACiAgIGVsc2UKICAgICBPUyA8PCAiXCIgU2V0dGVyRm9yRGljdGlvbmFyeT1cIiI7CiAgIGlmIChOb2RlLT5zZXRBdEluZGV4TWV0aG9kRGVjbCgpKQotICAgIE9TIDw8IE5vZGUtPnNldEF0SW5kZXhNZXRob2REZWNsKCktPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKTsKKyAgICBOb2RlLT5zZXRBdEluZGV4TWV0aG9kRGVjbCgpLT5nZXRTZWxlY3RvcigpLnByaW50KE9TKTsKICAgZWxzZQogICAgIE9TIDw8ICIobnVsbCkiOwogfQpAQCAtMjA1NCw3ICsyMDc3LDcgQEAKICAgICAgIE9TIDw8ICIgUGFyYW09XCIiIDw8IEMtPmdldFBhcmFtTmFtZUFzV3JpdHRlbigpIDw8ICJcIiI7CiAgIH0KIAotICBpZiAoQy0+aXNQYXJhbUluZGV4VmFsaWQoKSkKKyAgaWYgKEMtPmlzUGFyYW1JbmRleFZhbGlkKCkgJiYgIUMtPmlzVmFyQXJnUGFyYW0oKSkKICAgICBPUyA8PCAiIFBhcmFtSW5kZXg9IiA8PCBDLT5nZXRQYXJhbUluZGV4KCk7CiB9CiAKQEAgLTIwOTUsMjcgKzIxMTgsMjUgQEAKIC8vIERlY2wgbWV0aG9kIGltcGxlbWVudGF0aW9ucwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAotdm9pZCBEZWNsOjpkdW1wKCkgY29uc3QgewotICBkdW1wKGxsdm06OmVycnMoKSk7Ci19CitMTFZNX0RVTVBfTUVUSE9EIHZvaWQgRGVjbDo6ZHVtcCgpIGNvbnN0IHsgZHVtcChsbHZtOjplcnJzKCkpOyB9CiAKLXZvaWQgRGVjbDo6ZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKK0xMVk1fRFVNUF9NRVRIT0Qgdm9pZCBEZWNsOjpkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3QgewogICBBU1REdW1wZXIgUChPUywgJmdldEFTVENvbnRleHQoKS5nZXRDb21tZW50Q29tbWFuZFRyYWl0cygpLAogICAgICAgICAgICAgICAmZ2V0QVNUQ29udGV4dCgpLmdldFNvdXJjZU1hbmFnZXIoKSk7CiAgIFAuZHVtcERlY2wodGhpcyk7CiB9CiAKLXZvaWQgRGVjbDo6ZHVtcENvbG9yKCkgY29uc3QgeworTExWTV9EVU1QX01FVEhPRCB2b2lkIERlY2w6OmR1bXBDb2xvcigpIGNvbnN0IHsKICAgQVNURHVtcGVyIFAobGx2bTo6ZXJycygpLCAmZ2V0QVNUQ29udGV4dCgpLmdldENvbW1lbnRDb21tYW5kVHJhaXRzKCksCiAgICAgICAgICAgICAgICZnZXRBU1RDb250ZXh0KCkuZ2V0U291cmNlTWFuYWdlcigpLCAvKlNob3dDb2xvcnMqL3RydWUpOwogICBQLmR1bXBEZWNsKHRoaXMpOwogfQogCi12b2lkIERlY2xDb250ZXh0OjpkdW1wTG9va3VwcygpIGNvbnN0IHsKK0xMVk1fRFVNUF9NRVRIT0Qgdm9pZCBEZWNsQ29udGV4dDo6ZHVtcExvb2t1cHMoKSBjb25zdCB7CiAgIGR1bXBMb29rdXBzKGxsdm06OmVycnMoKSk7CiB9CiAKLXZvaWQgRGVjbENvbnRleHQ6OmR1bXBMb29rdXBzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworTExWTV9EVU1QX01FVEhPRCB2b2lkIERlY2xDb250ZXh0OjpkdW1wTG9va3VwcyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKICAgY29uc3QgRGVjbENvbnRleHQgKkRDID0gdGhpczsKICAgd2hpbGUgKCFEQy0+aXNUcmFuc2xhdGlvblVuaXQoKSkKICAgICBEQyA9IERDLT5nZXRQYXJlbnQoKTsKQEAgLTIxMjgsMjEgKzIxNDksMjEgQEAKIC8vIFN0bXQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAotdm9pZCBTdG10OjpkdW1wKFNvdXJjZU1hbmFnZXIgJlNNKSBjb25zdCB7CitMTFZNX0RVTVBfTUVUSE9EIHZvaWQgU3RtdDo6ZHVtcChTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3QgewogICBkdW1wKGxsdm06OmVycnMoKSwgU00pOwogfQogCi12b2lkIFN0bXQ6OmR1bXAocmF3X29zdHJlYW0gJk9TLCBTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3QgeworTExWTV9EVU1QX01FVEhPRCB2b2lkIFN0bXQ6OmR1bXAocmF3X29zdHJlYW0gJk9TLCBTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3QgewogICBBU1REdW1wZXIgUChPUywgMCwgJlNNKTsKICAgUC5kdW1wU3RtdCh0aGlzKTsKIH0KIAotdm9pZCBTdG10OjpkdW1wKCkgY29uc3QgeworTExWTV9EVU1QX01FVEhPRCB2b2lkIFN0bXQ6OmR1bXAoKSBjb25zdCB7CiAgIEFTVER1bXBlciBQKGxsdm06OmVycnMoKSwgMCwgMCk7CiAgIFAuZHVtcFN0bXQodGhpcyk7CiB9CiAKLXZvaWQgU3RtdDo6ZHVtcENvbG9yKCkgY29uc3QgeworTExWTV9EVU1QX01FVEhPRCB2b2lkIFN0bXQ6OmR1bXBDb2xvcigpIGNvbnN0IHsKICAgQVNURHVtcGVyIFAobGx2bTo6ZXJycygpLCAwLCAwLCAvKlNob3dDb2xvcnMqL3RydWUpOwogICBQLmR1bXBTdG10KHRoaXMpOwogfQpAQCAtMjE1MSwxMSArMjE3Miw5IEBACiAvLyBDb21tZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKLXZvaWQgQ29tbWVudDo6ZHVtcCgpIGNvbnN0IHsKLSAgZHVtcChsbHZtOjplcnJzKCksIDAsIDApOwotfQorTExWTV9EVU1QX01FVEhPRCB2b2lkIENvbW1lbnQ6OmR1bXAoKSBjb25zdCB7IGR1bXAobGx2bTo6ZXJycygpLCAwLCAwKTsgfQogCi12b2lkIENvbW1lbnQ6OmR1bXAoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworTExWTV9EVU1QX01FVEhPRCB2b2lkIENvbW1lbnQ6OmR1bXAoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCkgY29uc3QgewogICBkdW1wKGxsdm06OmVycnMoKSwgJkNvbnRleHQuZ2V0Q29tbWVudENvbW1hbmRUcmFpdHMoKSwKICAgICAgICAmQ29udGV4dC5nZXRTb3VyY2VNYW5hZ2VyKCkpOwogfQpAQCAtMjE2Nyw3ICsyMTg2LDcgQEAKICAgRC5kdW1wRnVsbENvbW1lbnQoRkMpOwogfQogCi12b2lkIENvbW1lbnQ6OmR1bXBDb2xvcigpIGNvbnN0IHsKK0xMVk1fRFVNUF9NRVRIT0Qgdm9pZCBDb21tZW50OjpkdW1wQ29sb3IoKSBjb25zdCB7CiAgIGNvbnN0IEZ1bGxDb21tZW50ICpGQyA9IGR5bl9jYXN0PEZ1bGxDb21tZW50Pih0aGlzKTsKICAgQVNURHVtcGVyIEQobGx2bTo6ZXJycygpLCAwLCAwLCAvKlNob3dDb2xvcnMqL3RydWUpOwogICBELmR1bXBGdWxsQ29tbWVudChGQyk7CmRpZmYgLS1naXQgYS9saWIvQVNUL0FTVEltcG9ydGVyLmNwcCBiL2xpYi9BU1QvQVNUSW1wb3J0ZXIuY3BwCmluZGV4IGUxNjAxNWIuLmFjZTUyNmUgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvQVNUSW1wb3J0ZXIuY3BwCisrKyBiL2xpYi9BU1QvQVNUSW1wb3J0ZXIuY3BwCkBAIC00MDcsMTAgKzQwNywxMSBAQAogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGJyZWFrOwogICAKKyAgY2FzZSBUeXBlOjpBZGp1c3RlZDoKICAgY2FzZSBUeXBlOjpEZWNheWVkOgogICAgIGlmICghSXNTdHJ1Y3R1cmFsbHlFcXVpdmFsZW50KENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxEZWNheWVkVHlwZT4oVDEpLT5nZXRQb2ludGVlVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8RGVjYXllZFR5cGU+KFQyKS0+Z2V0UG9pbnRlZVR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxBZGp1c3RlZFR5cGU+KFQxKS0+Z2V0T3JpZ2luYWxUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxBZGp1c3RlZFR5cGU+KFQyKS0+Z2V0T3JpZ2luYWxUeXBlKCkpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGJyZWFrOwogCkBAIC01MzQsMTIgKzUzNSwxMSBAQAogICBjYXNlIFR5cGU6OkZ1bmN0aW9uUHJvdG86IHsKICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqUHJvdG8xID0gY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oVDEpOwogICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpQcm90bzIgPSBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihUMik7Ci0gICAgaWYgKFByb3RvMS0+Z2V0TnVtQXJncygpICE9IFByb3RvMi0+Z2V0TnVtQXJncygpKQorICAgIGlmIChQcm90bzEtPmdldE51bVBhcmFtcygpICE9IFByb3RvMi0+Z2V0TnVtUGFyYW1zKCkpCiAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IFByb3RvMS0+Z2V0TnVtQXJncygpOyBJICE9IE47ICsrSSkgewotICAgICAgaWYgKCFJc1N0cnVjdHVyYWxseUVxdWl2YWxlbnQoQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90bzEtPmdldEFyZ1R5cGUoSSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90bzItPmdldEFyZ1R5cGUoSSkpKQorICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBQcm90bzEtPmdldE51bVBhcmFtcygpOyBJICE9IE47ICsrSSkgeworICAgICAgaWYgKCFJc1N0cnVjdHVyYWxseUVxdWl2YWxlbnQoQ29udGV4dCwgUHJvdG8xLT5nZXRQYXJhbVR5cGUoSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90bzItPmdldFBhcmFtVHlwZShJKSkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKFByb3RvMS0+aXNWYXJpYWRpYygpICE9IFByb3RvMi0+aXNWYXJpYWRpYygpKQpAQCAtNTcwLDkgKzU3MCw4IEBACiAgIGNhc2UgVHlwZTo6RnVuY3Rpb25Ob1Byb3RvOiB7CiAgICAgY29uc3QgRnVuY3Rpb25UeXBlICpGdW5jdGlvbjEgPSBjYXN0PEZ1bmN0aW9uVHlwZT4oVDEpOwogICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRnVuY3Rpb24yID0gY2FzdDxGdW5jdGlvblR5cGU+KFQyKTsKLSAgICBpZiAoIUlzU3RydWN0dXJhbGx5RXF1aXZhbGVudChDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjEtPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjItPmdldFJlc3VsdFR5cGUoKSkpCisgICAgaWYgKCFJc1N0cnVjdHVyYWxseUVxdWl2YWxlbnQoQ29udGV4dCwgRnVuY3Rpb24xLT5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24yLT5nZXRSZXR1cm5UeXBlKCkpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgaWYgKEZ1bmN0aW9uMS0+Z2V0RXh0SW5mbygpICE9IEZ1bmN0aW9uMi0+Z2V0RXh0SW5mbygpKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC05MzEsMTAgKzkzMCw4IEBACiAgICAgcmV0dXJuIE5vbmU7CiAKICAgdW5zaWduZWQgSW5kZXggPSAwOwotICBmb3IgKERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIEQgPSBPd25lci0+bm9sb2FkX2RlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVuZCA9IE93bmVyLT5ub2xvYWRfZGVjbHNfZW5kKCk7Ci0gICAgICAgRCAhPSBERW5kOyArK0QpIHsKLSAgICBGaWVsZERlY2wgKkYgPSBkeW5fY2FzdDxGaWVsZERlY2w+KCpEKTsKKyAgZm9yIChjb25zdCBhdXRvICpEIDogT3duZXItPm5vbG9hZF9kZWNscygpKSB7CisgICAgY29uc3QgYXV0byAqRiA9IGR5bl9jYXN0PEZpZWxkRGVjbD4oRCk7CiAgICAgaWYgKCFGIHx8ICFGLT5pc0Fub255bW91c1N0cnVjdE9yVW5pb24oKSkKICAgICAgIGNvbnRpbnVlOwogCkBAIC0xNTg2LDcgKzE1ODMsNyBAQAogQVNUTm9kZUltcG9ydGVyOjpWaXNpdEZ1bmN0aW9uTm9Qcm90b1R5cGUoY29uc3QgRnVuY3Rpb25Ob1Byb3RvVHlwZSAqVCkgewogICAvLyBGSVhNRTogV2hhdCBoYXBwZW5zIGlmIHdlJ3JlIGltcG9ydGluZyBhIGZ1bmN0aW9uIHdpdGhvdXQgYSBwcm90b3R5cGUgCiAgIC8vIGludG8gQysrPyBTaG91bGQgd2UgbWFrZSBpdCB2YXJpYWRpYz8KLSAgUXVhbFR5cGUgVG9SZXN1bHRUeXBlID0gSW1wb3J0ZXIuSW1wb3J0KFQtPmdldFJlc3VsdFR5cGUoKSk7CisgIFF1YWxUeXBlIFRvUmVzdWx0VHlwZSA9IEltcG9ydGVyLkltcG9ydChULT5nZXRSZXR1cm5UeXBlKCkpOwogICBpZiAoVG9SZXN1bHRUeXBlLmlzTnVsbCgpKQogICAgIHJldHVybiBRdWFsVHlwZSgpOwogCkBAIC0xNTk1LDE2ICsxNTkyLDE0IEBACiB9CiAKIFF1YWxUeXBlIEFTVE5vZGVJbXBvcnRlcjo6VmlzaXRGdW5jdGlvblByb3RvVHlwZShjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqVCkgewotICBRdWFsVHlwZSBUb1Jlc3VsdFR5cGUgPSBJbXBvcnRlci5JbXBvcnQoVC0+Z2V0UmVzdWx0VHlwZSgpKTsKKyAgUXVhbFR5cGUgVG9SZXN1bHRUeXBlID0gSW1wb3J0ZXIuSW1wb3J0KFQtPmdldFJldHVyblR5cGUoKSk7CiAgIGlmIChUb1Jlc3VsdFR5cGUuaXNOdWxsKCkpCiAgICAgcmV0dXJuIFF1YWxUeXBlKCk7CiAgIAogICAvLyBJbXBvcnQgYXJndW1lbnQgdHlwZXMKICAgU21hbGxWZWN0b3I8UXVhbFR5cGUsIDQ+IEFyZ1R5cGVzOwotICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjphcmdfdHlwZV9pdGVyYXRvciBBID0gVC0+YXJnX3R5cGVfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVuZCA9IFQtPmFyZ190eXBlX2VuZCgpOwotICAgICAgIEEgIT0gQUVuZDsgKytBKSB7Ci0gICAgUXVhbFR5cGUgQXJnVHlwZSA9IEltcG9ydGVyLkltcG9ydCgqQSk7CisgIGZvciAoY29uc3QgYXV0byAmQSA6IFQtPnBhcmFtX3R5cGVzKCkpIHsKKyAgICBRdWFsVHlwZSBBcmdUeXBlID0gSW1wb3J0ZXIuSW1wb3J0KEEpOwogICAgIGlmIChBcmdUeXBlLmlzTnVsbCgpKQogICAgICAgcmV0dXJuIFF1YWxUeXBlKCk7CiAgICAgQXJnVHlwZXMucHVzaF9iYWNrKEFyZ1R5cGUpOwpAQCAtMTYxMiwxMCArMTYwNyw4IEBACiAgIAogICAvLyBJbXBvcnQgZXhjZXB0aW9uIHR5cGVzCiAgIFNtYWxsVmVjdG9yPFF1YWxUeXBlLCA0PiBFeGNlcHRpb25UeXBlczsKLSAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6ZXhjZXB0aW9uX2l0ZXJhdG9yIEUgPSBULT5leGNlcHRpb25fYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFbmQgPSBULT5leGNlcHRpb25fZW5kKCk7Ci0gICAgICAgRSAhPSBFRW5kOyArK0UpIHsKLSAgICBRdWFsVHlwZSBFeGNlcHRpb25UeXBlID0gSW1wb3J0ZXIuSW1wb3J0KCpFKTsKKyAgZm9yIChjb25zdCBhdXRvICZFIDogVC0+ZXhjZXB0aW9ucygpKSB7CisgICAgUXVhbFR5cGUgRXhjZXB0aW9uVHlwZSA9IEltcG9ydGVyLkltcG9ydChFKTsKICAgICBpZiAoRXhjZXB0aW9uVHlwZS5pc051bGwoKSkKICAgICAgIHJldHVybiBRdWFsVHlwZSgpOwogICAgIEV4Y2VwdGlvblR5cGVzLnB1c2hfYmFjayhFeGNlcHRpb25UeXBlKTsKQEAgLTE2MzEsNyArMTYyNCw3IEBACiAgIFRvRVBJLlJlZlF1YWxpZmllciA9IEZyb21FUEkuUmVmUXVhbGlmaWVyOwogICBUb0VQSS5OdW1FeGNlcHRpb25zID0gRXhjZXB0aW9uVHlwZXMuc2l6ZSgpOwogICBUb0VQSS5FeGNlcHRpb25zID0gRXhjZXB0aW9uVHlwZXMuZGF0YSgpOwotICBUb0VQSS5Db25zdW1lZEFyZ3VtZW50cyA9IEZyb21FUEkuQ29uc3VtZWRBcmd1bWVudHM7CisgIFRvRVBJLkNvbnN1bWVkUGFyYW1ldGVycyA9IEZyb21FUEkuQ29uc3VtZWRQYXJhbWV0ZXJzOwogICBUb0VQSS5FeGNlcHRpb25TcGVjVHlwZSA9IEZyb21FUEkuRXhjZXB0aW9uU3BlY1R5cGU7CiAgIFRvRVBJLk5vZXhjZXB0RXhwciA9IEltcG9ydGVyLkltcG9ydChGcm9tRVBJLk5vZXhjZXB0RXhwcik7CiAgIFRvRVBJLkV4Y2VwdGlvblNwZWNEZWNsID0gY2FzdF9vcl9udWxsPEZ1bmN0aW9uRGVjbD4oCkBAIC0xNzg3LDExICsxNzgwLDkgQEAKICAgICByZXR1cm4gUXVhbFR5cGUoKTsKIAogICBTbWFsbFZlY3RvcjxPYmpDUHJvdG9jb2xEZWNsICosIDQ+IFByb3RvY29sczsKLSAgZm9yIChPYmpDT2JqZWN0VHlwZTo6cXVhbF9pdGVyYXRvciBQID0gVC0+cXVhbF9iZWdpbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRW5kID0gVC0+cXVhbF9lbmQoKTsKLSAgICAgICBQICE9IFBFbmQ7ICsrUCkgeworICBmb3IgKGF1dG8gKlAgOiBULT5xdWFscygpKSB7CiAgICAgT2JqQ1Byb3RvY29sRGVjbCAqUHJvdG9jb2wKLSAgICAgID0gZHluX2Nhc3Rfb3JfbnVsbDxPYmpDUHJvdG9jb2xEZWNsPihJbXBvcnRlci5JbXBvcnQoKlApKTsKKyAgICAgID0gZHluX2Nhc3Rfb3JfbnVsbDxPYmpDUHJvdG9jb2xEZWNsPihJbXBvcnRlci5JbXBvcnQoUCkpOwogICAgIGlmICghUHJvdG9jb2wpCiAgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKICAgICBQcm90b2NvbHMucHVzaF9iYWNrKFByb3RvY29sKTsKQEAgLTE5MDksMTEgKzE5MDAsOCBAQAogICAgIHJldHVybjsKICAgfQogICAKLSAgZm9yIChEZWNsQ29udGV4dDo6ZGVjbF9pdGVyYXRvciBGcm9tID0gRnJvbURDLT5kZWNsc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb21FbmQgPSBGcm9tREMtPmRlY2xzX2VuZCgpOwotICAgICAgIEZyb20gIT0gRnJvbUVuZDsKLSAgICAgICArK0Zyb20pCi0gICAgSW1wb3J0ZXIuSW1wb3J0KCpGcm9tKTsKKyAgZm9yIChhdXRvICpGcm9tIDogRnJvbURDLT5kZWNscygpKQorICAgIEltcG9ydGVyLkltcG9ydChGcm9tKTsKIH0KIAogYm9vbCBBU1ROb2RlSW1wb3J0ZXI6OkltcG9ydERlZmluaXRpb24oUmVjb3JkRGVjbCAqRnJvbSwgUmVjb3JkRGVjbCAqVG8sIApAQCAtMTk0Niw2ICsxOTM0LDcgQEAKICAgICBUb0RhdGEuSGFzUHJvdGVjdGVkRmllbGRzID0gRnJvbURhdGEuSGFzUHJvdGVjdGVkRmllbGRzOwogICAgIFRvRGF0YS5IYXNQdWJsaWNGaWVsZHMgPSBGcm9tRGF0YS5IYXNQdWJsaWNGaWVsZHM7CiAgICAgVG9EYXRhLkhhc011dGFibGVGaWVsZHMgPSBGcm9tRGF0YS5IYXNNdXRhYmxlRmllbGRzOworICAgIFRvRGF0YS5IYXNWYXJpYW50TWVtYmVycyA9IEZyb21EYXRhLkhhc1ZhcmlhbnRNZW1iZXJzOwogICAgIFRvRGF0YS5IYXNPbmx5Q01lbWJlcnMgPSBGcm9tRGF0YS5IYXNPbmx5Q01lbWJlcnM7CiAgICAgVG9EYXRhLkhhc0luQ2xhc3NJbml0aWFsaXplciA9IEZyb21EYXRhLkhhc0luQ2xhc3NJbml0aWFsaXplcjsKICAgICBUb0RhdGEuSGFzVW5pbml0aWFsaXplZFJlZmVyZW5jZU1lbWJlcgpAQCAtMTk4NiwyOSArMTk3NSwyNSBAQAogICAgIFRvRGF0YS5Jc0xhbWJkYSA9IEZyb21EYXRhLklzTGFtYmRhOwogCiAgICAgU21hbGxWZWN0b3I8Q1hYQmFzZVNwZWNpZmllciAqLCA0PiBCYXNlczsKLSAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgCi0gICAgICAgICAgICAgICAgICBCYXNlMSA9IEZyb21DWFgtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICBGcm9tQmFzZUVuZCA9IEZyb21DWFgtPmJhc2VzX2VuZCgpOwotICAgICAgICAgQmFzZTEgIT0gRnJvbUJhc2VFbmQ7Ci0gICAgICAgICArK0Jhc2UxKSB7Ci0gICAgICBRdWFsVHlwZSBUID0gSW1wb3J0ZXIuSW1wb3J0KEJhc2UxLT5nZXRUeXBlKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmQmFzZTEgOiBGcm9tQ1hYLT5iYXNlcygpKSB7CisgICAgICBRdWFsVHlwZSBUID0gSW1wb3J0ZXIuSW1wb3J0KEJhc2UxLmdldFR5cGUoKSk7CiAgICAgICBpZiAoVC5pc051bGwoKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOwotICAgICAgaWYgKEJhc2UxLT5pc1BhY2tFeHBhbnNpb24oKSkKLSAgICAgICAgRWxsaXBzaXNMb2MgPSBJbXBvcnRlci5JbXBvcnQoQmFzZTEtPmdldEVsbGlwc2lzTG9jKCkpOworICAgICAgaWYgKEJhc2UxLmlzUGFja0V4cGFuc2lvbigpKQorICAgICAgICBFbGxpcHNpc0xvYyA9IEltcG9ydGVyLkltcG9ydChCYXNlMS5nZXRFbGxpcHNpc0xvYygpKTsKIAogICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIGRlZmluaXRpb24gZm9yIHRoZSBiYXNlLgotICAgICAgSW1wb3J0RGVmaW5pdGlvbklmTmVlZGVkKEJhc2UxLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpKTsKKyAgICAgIEltcG9ydERlZmluaXRpb25JZk5lZWRlZChCYXNlMS5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpKTsKICAgICAgICAgCiAgICAgICBCYXNlcy5wdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgIG5ldyAoSW1wb3J0ZXIuZ2V0VG9Db250ZXh0KCkpIAotICAgICAgICAgICAgICAgICAgICAgIENYWEJhc2VTcGVjaWZpZXIoSW1wb3J0ZXIuSW1wb3J0KEJhc2UxLT5nZXRTb3VyY2VSYW5nZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UxLT5pc1ZpcnR1YWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UxLT5pc0Jhc2VPZkNsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlMS0+Z2V0QWNjZXNzU3BlY2lmaWVyQXNXcml0dGVuKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydGVyLkltcG9ydChCYXNlMS0+Z2V0VHlwZVNvdXJjZUluZm8oKSksCisgICAgICAgICAgICAgICAgICAgICAgQ1hYQmFzZVNwZWNpZmllcihJbXBvcnRlci5JbXBvcnQoQmFzZTEuZ2V0U291cmNlUmFuZ2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlMS5pc1ZpcnR1YWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UxLmlzQmFzZU9mQ2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UxLmdldEFjY2Vzc1NwZWNpZmllckFzV3JpdHRlbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRlci5JbXBvcnQoQmFzZTEuZ2V0VHlwZVNvdXJjZUluZm8oKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGxpcHNpc0xvYykpOwogICAgIH0KICAgICBpZiAoIUJhc2VzLmVtcHR5KCkpCkBAIC0yNTM4LDYgKzI1MjMsMjEgQEAKICAgICAgICAgfSBlbHNlIGlmICghRC0+aXNDb21wbGV0ZURlZmluaXRpb24oKSkgewogICAgICAgICAgIC8vIFdlIGhhdmUgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoaXMgdHlwZSwgc28gYWRvcHQgdGhhdCBmb3J3YXJkCiAgICAgICAgICAgLy8gZGVjbGFyYXRpb24gcmF0aGVyIHRoYW4gYnVpbGRpbmcgYSBuZXcgb25lLgorICAgICAgICAgICAgCisgICAgICAgICAgLy8gSWYgb25lIG9yIGJvdGggY2FuIGJlIGNvbXBsZXRlZCBmcm9tIGV4dGVybmFsIHN0b3JhZ2UgdGhlbiB0cnkgb25lCisgICAgICAgICAgLy8gbGFzdCB0aW1lIHRvIGNvbXBsZXRlIGFuZCBjb21wYXJlIHRoZW0gYmVmb3JlIGRvaW5nIHRoaXMuCisgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoRm91bmRSZWNvcmQtPmhhc0V4dGVybmFsTGV4aWNhbFN0b3JhZ2UoKSAmJgorICAgICAgICAgICAgICAhRm91bmRSZWNvcmQtPmlzQ29tcGxldGVEZWZpbml0aW9uKCkpCisgICAgICAgICAgICBGb3VuZFJlY29yZC0+Z2V0QVNUQ29udGV4dCgpLmdldEV4dGVybmFsU291cmNlKCktPkNvbXBsZXRlVHlwZShGb3VuZFJlY29yZCk7CisgICAgICAgICAgaWYgKEQtPmhhc0V4dGVybmFsTGV4aWNhbFN0b3JhZ2UoKSkKKyAgICAgICAgICAgIEQtPmdldEFTVENvbnRleHQoKS5nZXRFeHRlcm5hbFNvdXJjZSgpLT5Db21wbGV0ZVR5cGUoRCk7CisgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoRm91bmRSZWNvcmQtPmlzQ29tcGxldGVEZWZpbml0aW9uKCkgJiYKKyAgICAgICAgICAgICAgRC0+aXNDb21wbGV0ZURlZmluaXRpb24oKSAmJgorICAgICAgICAgICAgICAhSXNTdHJ1Y3R1cmFsTWF0Y2goRCwgRm91bmRSZWNvcmQpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIAogICAgICAgICAgIEFkb3B0RGVjbCA9IEZvdW5kUmVjb3JkOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgaWYgKCFTZWFyY2hOYW1lKSB7CkBAIC0yNzE2LDcgKzI3MTYsNyBAQAogICAgICAgICBGcm9tRVBJLk5vZXhjZXB0RXhwcikgewogICAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBEZWZhdWx0RVBJOwogICAgICAgRnJvbVR5ID0gSW1wb3J0ZXIuZ2V0RnJvbUNvbnRleHQoKS5nZXRGdW5jdGlvblR5cGUoCi0gICAgICAgICAgRnJvbUZQVC0+Z2V0UmVzdWx0VHlwZSgpLCBGcm9tRlBULT5nZXRBcmdUeXBlcygpLCBEZWZhdWx0RVBJKTsKKyAgICAgICAgICBGcm9tRlBULT5nZXRSZXR1cm5UeXBlKCksIEZyb21GUFQtPmdldFBhcmFtVHlwZXMoKSwgRGVmYXVsdEVQSSk7CiAgICAgICB1c2VkRGlmZmVyZW50RXhjZXB0aW9uU3BlYyA9IHRydWU7CiAgICAgfQogICB9CkBAIC0yNzI4LDkgKzI3MjgsOCBAQAogICAKICAgLy8gSW1wb3J0IHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzLgogICBTbWFsbFZlY3RvcjxQYXJtVmFyRGVjbCAqLCA4PiBQYXJhbWV0ZXJzOwotICBmb3IgKEZ1bmN0aW9uRGVjbDo6cGFyYW1faXRlcmF0b3IgUCA9IEQtPnBhcmFtX2JlZ2luKCksIFBFbmQgPSBELT5wYXJhbV9lbmQoKTsKLSAgICAgICBQICE9IFBFbmQ7ICsrUCkgewotICAgIFBhcm1WYXJEZWNsICpUb1AgPSBjYXN0X29yX251bGw8UGFybVZhckRlY2w+KEltcG9ydGVyLkltcG9ydCgqUCkpOworICBmb3IgKGF1dG8gUCA6IEQtPnBhcmFtcygpKSB7CisgICAgUGFybVZhckRlY2wgKlRvUCA9IGNhc3Rfb3JfbnVsbDxQYXJtVmFyRGVjbD4oSW1wb3J0ZXIuSW1wb3J0KFApKTsKICAgICBpZiAoIVRvUCkKICAgICAgIHJldHVybiAwOwogICAgIApAQCAtMjgzOCwxMCArMjgzNyw4IEBACiAgICAgcmV0dXJuIDA7CiAKICAgdW5zaWduZWQgSW5kZXggPSAxOwotICBmb3IgKERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIEQgPSBPd25lci0+bm9sb2FkX2RlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVuZCA9IE93bmVyLT5ub2xvYWRfZGVjbHNfZW5kKCk7Ci0gICAgICAgRCAhPSBERW5kOyArK0QpIHsKLSAgICBpZiAoKkQgPT0gRikKKyAgZm9yIChjb25zdCBhdXRvICpEIDogT3duZXItPm5vbG9hZF9kZWNscygpKSB7CisgICAgaWYgKEQgPT0gRikKICAgICAgIHJldHVybiBJbmRleDsKIAogICAgIGlmIChpc2E8RmllbGREZWNsPigqRCkgfHwgaXNhPEluZGlyZWN0RmllbGREZWNsPigqRCkpCkBAIC0yOTUzLDkgKzI5NTAsOCBAQAogICAgIG5ldyAoSW1wb3J0ZXIuZ2V0VG9Db250ZXh0KCkpTmFtZWREZWNsKltELT5nZXRDaGFpbmluZ1NpemUoKV07CiAKICAgdW5zaWduZWQgaSA9IDA7Ci0gIGZvciAoSW5kaXJlY3RGaWVsZERlY2w6OmNoYWluX2l0ZXJhdG9yIFBJID0gRC0+Y2hhaW5fYmVnaW4oKSwKLSAgICAgICBQRSA9IEQtPmNoYWluX2VuZCgpOyBQSSAhPSBQRTsgKytQSSkgewotICAgIERlY2wqIEQgPSBJbXBvcnRlci5JbXBvcnQoKlBJKTsKKyAgZm9yIChhdXRvICpQSSA6IEQtPmNoYWluKCkpIHsKKyAgICBEZWNsICpEID0gSW1wb3J0ZXIuSW1wb3J0KFBJKTsKICAgICBpZiAoIUQpCiAgICAgICByZXR1cm4gMDsKICAgICBOYW1lZENoYWluW2krK10gPSBjYXN0PE5hbWVkRGVjbD4oRCk7CkBAIC0zMDE0LDggKzMwMTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0ZXIuSW1wb3J0KEQtPmdldElubmVyTG9jU3RhcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jLCBOYW1lLmdldEFzSWRlbnRpZmllckluZm8oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULCBUSW5mbywgRC0+Z2V0QWNjZXNzQ29udHJvbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFdpZHRoLCBELT5nZXRTeW50aGVzaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC0+Z2V0QmFja2luZ0l2YXJSZWZlcmVuY2VkSW5BY2Nlc3NvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRXaWR0aCwgRC0+Z2V0U3ludGhlc2l6ZSgpKTsKICAgVG9JdmFyLT5zZXRMZXhpY2FsRGVjbENvbnRleHQoTGV4aWNhbERDKTsKICAgSW1wb3J0ZXIuSW1wb3J0ZWQoRCwgVG9JdmFyKTsKICAgTGV4aWNhbERDLT5hZGREZWNsSW50ZXJuYWwoVG9JdmFyKTsKQEAgLTMyMTUsMTEgKzMyMTAsMTEgQEAKICAgICAgICAgY29udGludWU7CiAKICAgICAgIC8vIENoZWNrIHJldHVybiB0eXBlcy4KLSAgICAgIGlmICghSW1wb3J0ZXIuSXNTdHJ1Y3R1cmFsbHlFcXVpdmFsZW50KEQtPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvdW5kTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCkpKSB7CisgICAgICBpZiAoIUltcG9ydGVyLklzU3RydWN0dXJhbGx5RXF1aXZhbGVudChELT5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3VuZE1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpKSkgewogICAgICAgICBJbXBvcnRlci5Ub0RpYWcoTG9jLCBkaWFnOjplcnJfb2RyX29iamNfbWV0aG9kX3Jlc3VsdF90eXBlX2luY29uc2lzdGVudCkKLSAgICAgICAgICA8PCBELT5pc0luc3RhbmNlTWV0aG9kKCkgPDwgTmFtZQotICAgICAgICAgIDw8IEQtPmdldFJlc3VsdFR5cGUoKSA8PCBGb3VuZE1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpOworICAgICAgICAgICAgPDwgRC0+aXNJbnN0YW5jZU1ldGhvZCgpIDw8IE5hbWUgPDwgRC0+Z2V0UmV0dXJuVHlwZSgpCisgICAgICAgICAgICA8PCBGb3VuZE1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpOwogICAgICAgICBJbXBvcnRlci5Ub0RpYWcoRm91bmRNZXRob2QtPmdldExvY2F0aW9uKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6bm90ZV9vZHJfb2JqY19tZXRob2RfaGVyZSkKICAgICAgICAgICA8PCBELT5pc0luc3RhbmNlTWV0aG9kKCkgPDwgTmFtZTsKQEAgLTMyNzAsMzYgKzMyNjUsMjUgQEAKICAgfQogCiAgIC8vIEltcG9ydCB0aGUgcmVzdWx0IHR5cGUuCi0gIFF1YWxUeXBlIFJlc3VsdFR5ID0gSW1wb3J0ZXIuSW1wb3J0KEQtPmdldFJlc3VsdFR5cGUoKSk7CisgIFF1YWxUeXBlIFJlc3VsdFR5ID0gSW1wb3J0ZXIuSW1wb3J0KEQtPmdldFJldHVyblR5cGUoKSk7CiAgIGlmIChSZXN1bHRUeS5pc051bGwoKSkKICAgICByZXR1cm4gMDsKIAotICBUeXBlU291cmNlSW5mbyAqUmVzdWx0VEluZm8gPSBJbXBvcnRlci5JbXBvcnQoRC0+Z2V0UmVzdWx0VHlwZVNvdXJjZUluZm8oKSk7CisgIFR5cGVTb3VyY2VJbmZvICpSZXR1cm5USW5mbyA9IEltcG9ydGVyLkltcG9ydChELT5nZXRSZXR1cm5UeXBlU291cmNlSW5mbygpKTsKIAotICBPYmpDTWV0aG9kRGVjbCAqVG9NZXRob2QKLSAgICA9IE9iakNNZXRob2REZWNsOjpDcmVhdGUoSW1wb3J0ZXIuZ2V0VG9Db250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0ZXIuSW1wb3J0KEQtPmdldExvY0VuZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS5nZXRPYmpDU2VsZWN0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0VHksIFJlc3VsdFRJbmZvLCBEQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC0+aXNJbnN0YW5jZU1ldGhvZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBELT5pc1ZhcmlhZGljKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQtPmlzUHJvcGVydHlBY2Nlc3NvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBELT5pc0ltcGxpY2l0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQtPmlzRGVmaW5lZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBELT5nZXRJbXBsZW1lbnRhdGlvbkNvbnRyb2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC0+aGFzUmVsYXRlZFJlc3VsdFR5cGUoKSk7CisgIE9iakNNZXRob2REZWNsICpUb01ldGhvZCA9IE9iakNNZXRob2REZWNsOjpDcmVhdGUoCisgICAgICBJbXBvcnRlci5nZXRUb0NvbnRleHQoKSwgTG9jLCBJbXBvcnRlci5JbXBvcnQoRC0+Z2V0TG9jRW5kKCkpLAorICAgICAgTmFtZS5nZXRPYmpDU2VsZWN0b3IoKSwgUmVzdWx0VHksIFJldHVyblRJbmZvLCBEQywgRC0+aXNJbnN0YW5jZU1ldGhvZCgpLAorICAgICAgRC0+aXNWYXJpYWRpYygpLCBELT5pc1Byb3BlcnR5QWNjZXNzb3IoKSwgRC0+aXNJbXBsaWNpdCgpLCBELT5pc0RlZmluZWQoKSwKKyAgICAgIEQtPmdldEltcGxlbWVudGF0aW9uQ29udHJvbCgpLCBELT5oYXNSZWxhdGVkUmVzdWx0VHlwZSgpKTsKIAogICAvLyBGSVhNRTogV2hlbiB3ZSBkZWNpZGUgdG8gbWVyZ2UgbWV0aG9kIGRlZmluaXRpb25zLCB3ZSdsbCBuZWVkIHRvCiAgIC8vIGRlYWwgd2l0aCBpbXBsaWNpdCBwYXJhbWV0ZXJzLgogCiAgIC8vIEltcG9ydCB0aGUgcGFyYW1ldGVycwogICBTbWFsbFZlY3RvcjxQYXJtVmFyRGVjbCAqLCA1PiBUb1BhcmFtczsKLSAgZm9yIChPYmpDTWV0aG9kRGVjbDo6cGFyYW1faXRlcmF0b3IgRnJvbVAgPSBELT5wYXJhbV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9tUEVuZCA9IEQtPnBhcmFtX2VuZCgpOwotICAgICAgIEZyb21QICE9IEZyb21QRW5kOyAKLSAgICAgICArK0Zyb21QKSB7Ci0gICAgUGFybVZhckRlY2wgKlRvUCA9IGNhc3Rfb3JfbnVsbDxQYXJtVmFyRGVjbD4oSW1wb3J0ZXIuSW1wb3J0KCpGcm9tUCkpOworICBmb3IgKGF1dG8gKkZyb21QIDogRC0+cGFyYW1zKCkpIHsKKyAgICBQYXJtVmFyRGVjbCAqVG9QID0gY2FzdF9vcl9udWxsPFBhcm1WYXJEZWNsPihJbXBvcnRlci5JbXBvcnQoRnJvbVApKTsKICAgICBpZiAoIVRvUCkKICAgICAgIHJldHVybiAwOwogICAgIApAQCAtMzU1OCwxMiArMzU0Miw4IEBACiAgIAogICAvLyBJbXBvcnQgY2F0ZWdvcmllcy4gV2hlbiB0aGUgY2F0ZWdvcmllcyB0aGVtc2VsdmVzIGFyZSBpbXBvcnRlZCwgdGhleSdsbAogICAvLyBob29rIHRoZW1zZWx2ZXMgaW50byB0aGlzIGludGVyZmFjZS4KLSAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6a25vd25fY2F0ZWdvcmllc19pdGVyYXRvcgotICAgICAgICAgQ2F0ID0gRnJvbS0+a25vd25fY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgQ2F0RW5kID0gRnJvbS0+a25vd25fY2F0ZWdvcmllc19lbmQoKTsKLSAgICAgICBDYXQgIT0gQ2F0RW5kOyArK0NhdCkgewotICAgIEltcG9ydGVyLkltcG9ydCgqQ2F0KTsKLSAgfQorICBmb3IgKGF1dG8gKkNhdCA6IEZyb20tPmtub3duX2NhdGVnb3JpZXMoKSkKKyAgICBJbXBvcnRlci5JbXBvcnQoQ2F0KTsKICAgCiAgIC8vIElmIHdlIGhhdmUgYW4gQGltcGxlbWVudGF0aW9uLCBpbXBvcnQgaXQgYXMgd2VsbC4KICAgaWYgKEZyb20tPmdldEltcGxlbWVudGF0aW9uKCkpIHsKQEAgLTQyNDAsOCArNDIyMCw3IEBACiAgICAgcmV0dXJuIDA7CiAKICAgVmFyVGVtcGxhdGVEZWNsICpEMiA9IFZhclRlbXBsYXRlRGVjbDo6Q3JlYXRlKAotICAgICAgSW1wb3J0ZXIuZ2V0VG9Db250ZXh0KCksIERDLCBMb2MsIE5hbWUsIFRlbXBsYXRlUGFyYW1zLCBEMlRlbXBsYXRlZCwKLSAgICAgIC8qUHJldkRlY2w9Ki8wKTsKKyAgICAgIEltcG9ydGVyLmdldFRvQ29udGV4dCgpLCBEQywgTG9jLCBOYW1lLCBUZW1wbGF0ZVBhcmFtcywgRDJUZW1wbGF0ZWQpOwogICBEMlRlbXBsYXRlZC0+c2V0RGVzY3JpYmVkVmFyVGVtcGxhdGUoRDIpOwogCiAgIEQyLT5zZXRBY2Nlc3MoRC0+Z2V0QWNjZXNzKCkpOwpkaWZmIC0tZ2l0IGEvbGliL0FTVC9BU1RUeXBlVHJhaXRzLmNwcCBiL2xpYi9BU1QvQVNUVHlwZVRyYWl0cy5jcHAKaW5kZXggYWU0N2VhOS4uMDJkODJkOCAxMDA2NDQKLS0tIGEvbGliL0FTVC9BU1RUeXBlVHJhaXRzLmNwcAorKysgYi9saWIvQVNUL0FTVFR5cGVUcmFpdHMuY3BwCkBAIC0zOSwxOCArMzksMjQgQEAKICNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZU5vZGVzLmRlZiIKIH07CiAKLWJvb2wgQVNUTm9kZUtpbmQ6OmlzQmFzZU9mKEFTVE5vZGVLaW5kIE90aGVyKSBjb25zdCB7Ci0gIHJldHVybiBpc0Jhc2VPZihLaW5kSWQsIE90aGVyLktpbmRJZCk7Citib29sIEFTVE5vZGVLaW5kOjppc0Jhc2VPZihBU1ROb2RlS2luZCBPdGhlciwgdW5zaWduZWQgKkRpc3RhbmNlKSBjb25zdCB7CisgIHJldHVybiBpc0Jhc2VPZihLaW5kSWQsIE90aGVyLktpbmRJZCwgRGlzdGFuY2UpOwogfQogCiBib29sIEFTVE5vZGVLaW5kOjppc1NhbWUoQVNUTm9kZUtpbmQgT3RoZXIpIGNvbnN0IHsKICAgcmV0dXJuIEtpbmRJZCAhPSBOS0lfTm9uZSAmJiBLaW5kSWQgPT0gT3RoZXIuS2luZElkOwogfQogCi1ib29sIEFTVE5vZGVLaW5kOjppc0Jhc2VPZihOb2RlS2luZElkIEJhc2UsIE5vZGVLaW5kSWQgRGVyaXZlZCkgeworYm9vbCBBU1ROb2RlS2luZDo6aXNCYXNlT2YoTm9kZUtpbmRJZCBCYXNlLCBOb2RlS2luZElkIERlcml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqRGlzdGFuY2UpIHsKICAgaWYgKEJhc2UgPT0gTktJX05vbmUgfHwgRGVyaXZlZCA9PSBOS0lfTm9uZSkgcmV0dXJuIGZhbHNlOwotICB3aGlsZSAoRGVyaXZlZCAhPSBCYXNlICYmIERlcml2ZWQgIT0gTktJX05vbmUpCisgIHVuc2lnbmVkIERpc3QgPSAwOworICB3aGlsZSAoRGVyaXZlZCAhPSBCYXNlICYmIERlcml2ZWQgIT0gTktJX05vbmUpIHsKICAgICBEZXJpdmVkID0gQWxsS2luZEluZm9bRGVyaXZlZF0uUGFyZW50SWQ7CisgICAgKytEaXN0OworICB9CisgIGlmIChEaXN0YW5jZSkKKyAgICAqRGlzdGFuY2UgPSBEaXN0OwogICByZXR1cm4gRGVyaXZlZCA9PSBCYXNlOwogfQogCmRpZmYgLS1naXQgYS9saWIvQVNUL0FuZHJvaWQubWsgYi9saWIvQVNUL0FuZHJvaWQubWsKaW5kZXggMjVlYjQ4ZS4uOWQwYzAwNSAxMDA2NDQKLS0tIGEvbGliL0FTVC9BbmRyb2lkLm1rCisrKyBiL2xpYi9BU1QvQW5kcm9pZC5tawpAQCAtMTAsNiArMTAsNyBAQAogCUF0dHJJbXBsLmluYwlcCiAJQXR0ckxpc3QuaW5jCVwKIAlBdHRycy5pbmMJXAorICAgICAgICBBdHRyVmlzaXRvci5pbmMgXAogCUNvbW1lbnRDb21tYW5kSW5mby5pbmMgXAogCUNvbW1lbnRDb21tYW5kTGlzdC5pbmMgXAogCUNvbW1lbnRIVE1MTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2VzLmluYyBcCmRpZmYgLS1naXQgYS9saWIvQVNUL0F0dHJJbXBsLmNwcCBiL2xpYi9BU1QvQXR0ckltcGwuY3BwCmluZGV4IDdhZjNjOGIuLjBiZjZiY2QgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvQXR0ckltcGwuY3BwCisrKyBiL2xpYi9BU1QvQXR0ckltcGwuY3BwCkBAIC0yNCw2ICsyNCw0IEBACiAKIHZvaWQgSW5oZXJpdGFibGVQYXJhbUF0dHI6OmFuY2hvcigpIHsgfQogCi12b2lkIE1TSW5oZXJpdGFuY2VBdHRyOjphbmNob3IoKSB7IH0KLQogI2luY2x1ZGUgImNsYW5nL0FTVC9BdHRySW1wbC5pbmMiCmRpZmYgLS1naXQgYS9saWIvQVNUL0NNYWtlTGlzdHMudHh0IGIvbGliL0FTVC9DTWFrZUxpc3RzLnR4dAppbmRleCA0NjFlOGIzLi45MDA2YmU2IDEwMDY0NAotLS0gYS9saWIvQVNUL0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9BU1QvQ01ha2VMaXN0cy50eHQKQEAgLTU3LDI5ICs1Nyw4IEBACiAgIFR5cGVQcmludGVyLmNwcAogICBWVGFibGVCdWlsZGVyLmNwcAogICBWVFRCdWlsZGVyLmNwcAotICApCiAKLWFkZF9kZXBlbmRlbmNpZXMoY2xhbmdBU1QKLSAgQ2xhbmdBUk1OZW9uCi0gIENsYW5nQXR0ckNsYXNzZXMKLSAgQ2xhbmdBdHRyTGlzdAotICBDbGFuZ0F0dHJJbXBsCi0gIENsYW5nQXR0ckR1bXAKLSAgQ2xhbmdDb21tZW50Q29tbWFuZEluZm8KLSAgQ2xhbmdDb21tZW50Q29tbWFuZExpc3QKLSAgQ2xhbmdDb21tZW50Tm9kZXMKLSAgQ2xhbmdDb21tZW50SFRNTFRhZ3MKLSAgQ2xhbmdDb21tZW50SFRNTFRhZ3NQcm9wZXJ0aWVzCi0gIENsYW5nQ29tbWVudEhUTUxOYW1lZENoYXJhY3RlclJlZmVyZW5jZXMKLSAgQ2xhbmdEZWNsTm9kZXMKLSAgQ2xhbmdEaWFnbm9zdGljQVNUCi0gIENsYW5nRGlhZ25vc3RpY0NvbW1lbnQKLSAgQ2xhbmdEaWFnbm9zdGljQ29tbW9uCi0gIENsYW5nRGlhZ25vc3RpY1NlbWEKLSAgQ2xhbmdTdG10Tm9kZXMKLSAgKQotCi10YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmdBU1QKKyAgTElOS19MSUJTCiAgIGNsYW5nQmFzaWMKICAgY2xhbmdMZXgKICAgKQpkaWZmIC0tZ2l0IGEvbGliL0FTVC9DWFhJbmhlcml0YW5jZS5jcHAgYi9saWIvQVNUL0NYWEluaGVyaXRhbmNlLmNwcAppbmRleCBiNTEwMTRiLi5lZWYwNDNjIDEwMDY0NAotLS0gYS9saWIvQVNUL0NYWEluaGVyaXRhbmNlLmNwcAorKysgYi9saWIvQVNUL0NYWEluaGVyaXRhbmNlLmNwcApAQCAtMzUsMTYgKzM1LDEyIEBACiAgIHN0ZDo6Y29weShEZWNscy5iZWdpbigpLCBEZWNscy5lbmQoKSwgRGVjbHNGb3VuZCk7CiB9CiAKLUNYWEJhc2VQYXRoczo6ZGVjbF9pdGVyYXRvciBDWFhCYXNlUGF0aHM6OmZvdW5kX2RlY2xzX2JlZ2luKCkgeworQ1hYQmFzZVBhdGhzOjpkZWNsX3JhbmdlIENYWEJhc2VQYXRoczo6Zm91bmRfZGVjbHMoKSB7CiAgIGlmIChOdW1EZWNsc0ZvdW5kID09IDApCiAgICAgQ29tcHV0ZURlY2xzRm91bmQoKTsKLSAgcmV0dXJuIERlY2xzRm91bmQ7Ci19CiAKLUNYWEJhc2VQYXRoczo6ZGVjbF9pdGVyYXRvciBDWFhCYXNlUGF0aHM6OmZvdW5kX2RlY2xzX2VuZCgpIHsKLSAgaWYgKE51bURlY2xzRm91bmQgPT0gMCkKLSAgICBDb21wdXRlRGVjbHNGb3VuZCgpOwotICByZXR1cm4gRGVjbHNGb3VuZCArIE51bURlY2xzRm91bmQ7CisgIHJldHVybiBkZWNsX3JhbmdlKGRlY2xfaXRlcmF0b3IoRGVjbHNGb3VuZCksCisgICAgICAgICAgICAgICAgICAgIGRlY2xfaXRlcmF0b3IoRGVjbHNGb3VuZCArIE51bURlY2xzRm91bmQpKTsKIH0KIAogLy8vIGlzQW1iaWd1b3VzIC0gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzZXQgb2YgcGF0aHMgcHJvdmlkZWQgaXMKQEAgLTE0MSw5ICsxMzcsOCBAQAogICBjb25zdCBDWFhSZWNvcmREZWNsICpSZWNvcmQgPSB0aGlzOwogICBib29sIEFsbE1hdGNoZXMgPSB0cnVlOwogICB3aGlsZSAodHJ1ZSkgewotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvcgotICAgICAgICAgICBJID0gUmVjb3JkLT5iYXNlc19iZWdpbigpLCBFID0gUmVjb3JkLT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIGNvbnN0IFJlY29yZFR5cGUgKlR5ID0gSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpOworICAgIGZvciAoY29uc3QgYXV0byAmSSA6IFJlY29yZC0+YmFzZXMoKSkgeworICAgICAgY29uc3QgUmVjb3JkVHlwZSAqVHkgPSBJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKTsKICAgICAgIGlmICghVHkpIHsKICAgICAgICAgaWYgKEFsbG93U2hvcnRDaXJjdWl0KSByZXR1cm4gZmFsc2U7CiAgICAgICAgIEFsbE1hdGNoZXMgPSBmYWxzZTsKQEAgLTE4NiwxNCArMTgxLDExIEBACiAgIEFjY2Vzc1NwZWNpZmllciBBY2Nlc3NUb0hlcmUgPSBTY3JhdGNoUGF0aC5BY2Nlc3M7CiAgIGJvb2wgSXNGaXJzdFN0ZXAgPSBTY3JhdGNoUGF0aC5lbXB0eSgpOwogCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBCYXNlU3BlYyA9IFJlY29yZC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgIEJhc2VTcGVjRW5kID0gUmVjb3JkLT5iYXNlc19lbmQoKTsgCi0gICAgICAgQmFzZVNwZWMgIT0gQmFzZVNwZWNFbmQ7IAotICAgICAgICsrQmFzZVNwZWMpIHsKKyAgZm9yIChjb25zdCBhdXRvICZCYXNlU3BlYyA6IFJlY29yZC0+YmFzZXMoKSkgewogICAgIC8vIEZpbmQgdGhlIHJlY29yZCBvZiB0aGUgYmFzZSBjbGFzcyBzdWJvYmplY3RzIGZvciB0aGlzIHR5cGUuCi0gICAgUXVhbFR5cGUgQmFzZVR5cGUgPSBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoQmFzZVNwZWMtPmdldFR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7Ci0gICAgCisgICAgUXVhbFR5cGUgQmFzZVR5cGUgPQorICAgICAgICBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoQmFzZVNwZWMuZ2V0VHlwZSgpKS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKKwogICAgIC8vIEMrKyBbdGVtcC5kZXBdcDM6CiAgICAgLy8gICBJbiB0aGUgZGVmaW5pdGlvbiBvZiBhIGNsYXNzIHRlbXBsYXRlIG9yIGEgbWVtYmVyIG9mIGEgY2xhc3MgdGVtcGxhdGUsCiAgICAgLy8gICBpZiBhIGJhc2UgY2xhc3Mgb2YgdGhlIGNsYXNzIHRlbXBsYXRlIGRlcGVuZHMgb24gYSB0ZW1wbGF0ZS1wYXJhbWV0ZXIsCkBAIC0yMDgsNyArMjAwLDcgQEAKICAgICBzdGQ6OnBhaXI8Ym9vbCwgdW5zaWduZWQ+JiBTdWJvYmplY3RzID0gQ2xhc3NTdWJvYmplY3RzW0Jhc2VUeXBlXTsKICAgICBib29sIFZpc2l0QmFzZSA9IHRydWU7CiAgICAgYm9vbCBTZXRWaXJ0dWFsID0gZmFsc2U7Ci0gICAgaWYgKEJhc2VTcGVjLT5pc1ZpcnR1YWwoKSkgeworICAgIGlmIChCYXNlU3BlYy5pc1ZpcnR1YWwoKSkgewogICAgICAgVmlzaXRCYXNlID0gIVN1Ym9iamVjdHMuZmlyc3Q7CiAgICAgICBTdWJvYmplY3RzLmZpcnN0ID0gdHJ1ZTsKICAgICAgIGlmIChpc0RldGVjdGluZ1ZpcnR1YWwoKSAmJiBEZXRlY3RlZFZpcnR1YWwgPT0gMCkgewpAQCAtMjIzLDkgKzIxNSw5IEBACiAgICAgaWYgKGlzUmVjb3JkaW5nUGF0aHMoKSkgewogICAgICAgLy8gQWRkIHRoaXMgYmFzZSBzcGVjaWZpZXIgdG8gdGhlIGN1cnJlbnQgcGF0aC4KICAgICAgIENYWEJhc2VQYXRoRWxlbWVudCBFbGVtZW50OwotICAgICAgRWxlbWVudC5CYXNlID0gJipCYXNlU3BlYzsKKyAgICAgIEVsZW1lbnQuQmFzZSA9ICZCYXNlU3BlYzsKICAgICAgIEVsZW1lbnQuQ2xhc3MgPSBSZWNvcmQ7Ci0gICAgICBpZiAoQmFzZVNwZWMtPmlzVmlydHVhbCgpKQorICAgICAgaWYgKEJhc2VTcGVjLmlzVmlydHVhbCgpKQogICAgICAgICBFbGVtZW50LlN1Ym9iamVjdE51bWJlciA9IDA7CiAgICAgICBlbHNlCiAgICAgICAgIEVsZW1lbnQuU3Vib2JqZWN0TnVtYmVyID0gU3Vib2JqZWN0cy5zZWNvbmQ7CkBAIC0yNDcsMTYgKzIzOSwxNiBAQAogICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBvdmVyYWxsIGFjY2VzcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBtb3N0IHJlc3RyaWN0aXZlCiAgICAgICAvLyAgICBhY2Nlc3MgaW4gdGhlIHNlcXVlbmNlLgogICAgICAgaWYgKElzRmlyc3RTdGVwKQotICAgICAgICBTY3JhdGNoUGF0aC5BY2Nlc3MgPSBCYXNlU3BlYy0+Z2V0QWNjZXNzU3BlY2lmaWVyKCk7CisgICAgICAgIFNjcmF0Y2hQYXRoLkFjY2VzcyA9IEJhc2VTcGVjLmdldEFjY2Vzc1NwZWNpZmllcigpOwogICAgICAgZWxzZQogICAgICAgICBTY3JhdGNoUGF0aC5BY2Nlc3MgPSBDWFhSZWNvcmREZWNsOjpNZXJnZUFjY2VzcyhBY2Nlc3NUb0hlcmUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VTcGVjLT5nZXRBY2Nlc3NTcGVjaWZpZXIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVNwZWMuZ2V0QWNjZXNzU3BlY2lmaWVyKCkpOwogICAgIH0KICAgICAKICAgICAvLyBUcmFjayB3aGV0aGVyIHRoZXJlJ3MgYSBwYXRoIGludm9sdmluZyB0aGlzIHNwZWNpZmljIGJhc2UuCiAgICAgYm9vbCBGb3VuZFBhdGhUaHJvdWdoQmFzZSA9IGZhbHNlOwogICAgIAotICAgIGlmIChCYXNlTWF0Y2hlcyhCYXNlU3BlYywgU2NyYXRjaFBhdGgsIFVzZXJEYXRhKSkgeworICAgIGlmIChCYXNlTWF0Y2hlcygmQmFzZVNwZWMsIFNjcmF0Y2hQYXRoLCBVc2VyRGF0YSkpIHsKICAgICAgIC8vIFdlJ3ZlIGZvdW5kIGEgcGF0aCB0aGF0IHRlcm1pbmF0ZXMgYXQgdGhpcyBiYXNlLgogICAgICAgRm91bmRQYXRoID0gRm91bmRQYXRoVGhyb3VnaEJhc2UgPSB0cnVlOwogICAgICAgaWYgKGlzUmVjb3JkaW5nUGF0aHMoKSkgewpAQCAtMjY5LDcgKzI2MSw3IEBACiAgICAgICB9CiAgICAgfSBlbHNlIGlmIChWaXNpdEJhc2UpIHsKICAgICAgIENYWFJlY29yZERlY2wgKkJhc2VSZWNvcmQKLSAgICAgICAgPSBjYXN0PENYWFJlY29yZERlY2w+KEJhc2VTcGVjLT5nZXRUeXBlKCktPmNhc3RBczxSZWNvcmRUeXBlPigpCisgICAgICAgID0gY2FzdDxDWFhSZWNvcmREZWNsPihCYXNlU3BlYy5nZXRUeXBlKCktPmNhc3RBczxSZWNvcmRUeXBlPigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0RGVjbCgpKTsKICAgICAgIGlmIChsb29rdXBJbkJhc2VzKENvbnRleHQsIEJhc2VSZWNvcmQsIEJhc2VNYXRjaGVzLCBVc2VyRGF0YSkpIHsKICAgICAgICAgLy8gQysrIFtjbGFzcy5tZW1iZXIubG9va3VwXXAyOgpAQCAtNTAxLDE0ICs0OTMsMTMgQEAKICAgICBTdWJvYmplY3ROdW1iZXIKICAgICAgID0gKytTdWJvYmplY3RDb3VudFtjYXN0PENYWFJlY29yZERlY2w+KFJELT5nZXRDYW5vbmljYWxEZWNsKCkpXTsKIAotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgQmFzZSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgQmFzZUVuZCA9IFJELT5iYXNlc19lbmQoKTsgQmFzZSAhPSBCYXNlRW5kOyArK0Jhc2UpIHsKLSAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBCYXNlLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKKyAgZm9yIChjb25zdCBhdXRvICZCYXNlIDogUkQtPmJhc2VzKCkpIHsKKyAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBCYXNlLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkgewogICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSBjYXN0PENYWFJlY29yZERlY2w+KFJULT5nZXREZWNsKCkpOwogICAgICAgaWYgKCFCYXNlRGVjbC0+aXNQb2x5bW9ycGhpYygpKQogICAgICAgICBjb250aW51ZTsKIAotICAgICAgaWYgKE92ZXJyaWRlcnMuZW1wdHkoKSAmJiAhQmFzZS0+aXNWaXJ0dWFsKCkpIHsKKyAgICAgIGlmIChPdmVycmlkZXJzLmVtcHR5KCkgJiYgIUJhc2UuaXNWaXJ0dWFsKCkpIHsKICAgICAgICAgLy8gVGhlcmUgYXJlIG5vIG90aGVyIG92ZXJyaWRlcnMgb2YgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zLAogICAgICAgICAvLyBzbyBsZXQgdGhlIGJhc2UgY2xhc3MgZmlsbCBpbiBvdXIgb3ZlcnJpZGVycyBmb3IgdXMuCiAgICAgICAgIENvbGxlY3QoQmFzZURlY2wsIGZhbHNlLCBJblZpcnR1YWxTdWJvYmplY3QsIE92ZXJyaWRlcnMpOwpAQCAtNTIyLDcgKzUxMyw3IEBACiAgICAgICAvLyBpdHMgYmFzZSBjbGFzc2VzKSBtb3JlIHRoYW4gb25jZS4KICAgICAgIENYWEZpbmFsT3ZlcnJpZGVyTWFwIENvbXB1dGVkQmFzZU92ZXJyaWRlcnM7CiAgICAgICBDWFhGaW5hbE92ZXJyaWRlck1hcCAqQmFzZU92ZXJyaWRlcnMgPSAmQ29tcHV0ZWRCYXNlT3ZlcnJpZGVyczsKLSAgICAgIGlmIChCYXNlLT5pc1ZpcnR1YWwoKSkgeworICAgICAgaWYgKEJhc2UuaXNWaXJ0dWFsKCkpIHsKICAgICAgICAgQ1hYRmluYWxPdmVycmlkZXJNYXAgKiZNeVZpcnR1YWxPdmVycmlkZXJzID0gVmlydHVhbE92ZXJyaWRlcnNbQmFzZURlY2xdOwogICAgICAgICBCYXNlT3ZlcnJpZGVycyA9IE15VmlydHVhbE92ZXJyaWRlcnM7CiAgICAgICAgIGlmICghTXlWaXJ0dWFsT3ZlcnJpZGVycykgewpAQCAtNTUxLDEwICs1NDIsNyBAQAogICAgIH0KICAgfQogCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6bWV0aG9kX2l0ZXJhdG9yIE0gPSBSRC0+bWV0aG9kX2JlZ2luKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRW5kID0gUkQtPm1ldGhvZF9lbmQoKTsKLSAgICAgICBNICE9IE1FbmQ7Ci0gICAgICAgKytNKSB7CisgIGZvciAoYXV0byAqTSA6IFJELT5tZXRob2RzKCkpIHsKICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdmlydHVhbCBtZXRob2RzLgogICAgIGlmICghTS0+aXNWaXJ0dWFsKCkpCiAgICAgICBjb250aW51ZTsKQEAgLTcwMiwxMyArNjkwLDEyIEBACiAgIGlmIChMYXlvdXQuaXNQcmltYXJ5QmFzZVZpcnR1YWwoKSkKICAgICBCYXNlcy5pbnNlcnQoTGF5b3V0LmdldFByaW1hcnlCYXNlKCkpOwogCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBhc3NlcnQoIUktPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCkgJiYKKyAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPmJhc2VzKCkpIHsKKyAgICBhc3NlcnQoIUkuZ2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSAmJgogICAgICAgICAgICAiQ2Fubm90IGdldCBpbmRpcmVjdCBwcmltYXJ5IGJhc2VzIGZvciBjbGFzcyB3aXRoIGRlcGVuZGVudCBiYXNlcy4iKTsKIAogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0KLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5jYXN0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKKyAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS5nZXRUeXBlKCktPmNhc3RBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogCiAgICAgLy8gT25seSBiYXNlcyB3aXRoIHZpcnR1YWwgYmFzZXMgcGFydGljaXBhdGUgaW4gY29tcHV0aW5nIHRoZQogICAgIC8vIGluZGlyZWN0IHByaW1hcnkgdmlydHVhbCBiYXNlIGNsYXNzZXMuCkBAIC03MjUsMTMgKzcxMiwxMiBAQAogICBpZiAoIWdldE51bVZCYXNlcygpKQogICAgIHJldHVybjsKIAotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IGJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IGJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGFzc2VydCghSS0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSAmJgorICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBiYXNlcygpKSB7CisgICAgYXNzZXJ0KCFJLmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCkgJiYKICAgICAgICAgICAgIkNhbm5vdCBnZXQgaW5kaXJlY3QgcHJpbWFyeSBiYXNlcyBmb3IgY2xhc3Mgd2l0aCBkZXBlbmRlbnQgYmFzZXMuIik7CiAKICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9Ci0gICAgICBjYXN0PENYWFJlY29yZERlY2w+KEktPmdldFR5cGUoKS0+Y2FzdEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICBjYXN0PENYWFJlY29yZERlY2w+KEkuZ2V0VHlwZSgpLT5jYXN0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKIAogICAgIC8vIE9ubHkgYmFzZXMgd2l0aCB2aXJ0dWFsIGJhc2VzIHBhcnRpY2lwYXRlIGluIGNvbXB1dGluZyB0aGUKICAgICAvLyBpbmRpcmVjdCBwcmltYXJ5IHZpcnR1YWwgYmFzZSBjbGFzc2VzLgpkaWZmIC0tZ2l0IGEvbGliL0FTVC9Db21tZW50LmNwcCBiL2xpYi9BU1QvQ29tbWVudC5jcHAKaW5kZXggZjI0YTIzZC4uYjBiMjM1MSAxMDA2NDQKLS0tIGEvbGliL0FTVC9Db21tZW50LmNwcAorKysgYi9saWIvQVNUL0NvbW1lbnQuY3BwCkBAIC0xNTksNyArMTU5LDcgQEAKICAgICBLaW5kID0gRnVuY3Rpb25LaW5kOwogICAgIFBhcmFtVmFycyA9IEFycmF5UmVmPGNvbnN0IFBhcm1WYXJEZWNsICo+KEZELT5wYXJhbV9iZWdpbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZELT5nZXROdW1QYXJhbXMoKSk7Ci0gICAgUmVzdWx0VHlwZSA9IEZELT5nZXRSZXN1bHRUeXBlKCk7CisgICAgUmV0dXJuVHlwZSA9IEZELT5nZXRSZXR1cm5UeXBlKCk7CiAgICAgdW5zaWduZWQgTnVtTGlzdHMgPSBGRC0+Z2V0TnVtVGVtcGxhdGVQYXJhbWV0ZXJMaXN0cygpOwogICAgIGlmIChOdW1MaXN0cyAhPSAwKSB7CiAgICAgICBUZW1wbGF0ZUtpbmQgPSBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uOwpAQCAtMTgwLDcgKzE4MCw3IEBACiAgICAgS2luZCA9IEZ1bmN0aW9uS2luZDsKICAgICBQYXJhbVZhcnMgPSBBcnJheVJlZjxjb25zdCBQYXJtVmFyRGVjbCAqPihNRC0+cGFyYW1fYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRC0+cGFyYW1fc2l6ZSgpKTsKLSAgICBSZXN1bHRUeXBlID0gTUQtPmdldFJlc3VsdFR5cGUoKTsKKyAgICBSZXR1cm5UeXBlID0gTUQtPmdldFJldHVyblR5cGUoKTsKICAgICBJc09iakNNZXRob2QgPSB0cnVlOwogICAgIElzSW5zdGFuY2VNZXRob2QgPSBNRC0+aXNJbnN0YW5jZU1ldGhvZCgpOwogICAgIElzQ2xhc3NNZXRob2QgPSAhSXNJbnN0YW5jZU1ldGhvZDsKQEAgLTE5Myw3ICsxOTMsNyBAQAogICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBGVEQtPmdldFRlbXBsYXRlZERlY2woKTsKICAgICBQYXJhbVZhcnMgPSBBcnJheVJlZjxjb25zdCBQYXJtVmFyRGVjbCAqPihGRC0+cGFyYW1fYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRC0+Z2V0TnVtUGFyYW1zKCkpOwotICAgIFJlc3VsdFR5cGUgPSBGRC0+Z2V0UmVzdWx0VHlwZSgpOworICAgIFJldHVyblR5cGUgPSBGRC0+Z2V0UmV0dXJuVHlwZSgpOwogICAgIFRlbXBsYXRlUGFyYW1ldGVycyA9IEZURC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCk7CiAgICAgYnJlYWs7CiAgIH0KQEAgLTI1MSw2ICsyNTEsMTYgQEAKICAgICAgICAgVEwgPSBQb2ludGVyVEwuZ2V0UG9pbnRlZUxvYygpLmdldFVucXVhbGlmaWVkTG9jKCk7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQorICAgICAgLy8gTG9vayB0aHJvdWdoIHJlZmVyZW5jZSB0eXBlcy4KKyAgICAgIGlmIChSZWZlcmVuY2VUeXBlTG9jIFJlZmVyZW5jZVRMID0gVEwuZ2V0QXM8UmVmZXJlbmNlVHlwZUxvYz4oKSkgeworICAgICAgICBUTCA9IFJlZmVyZW5jZVRMLmdldFBvaW50ZWVMb2MoKS5nZXRVbnF1YWxpZmllZExvYygpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIC8vIExvb2sgdGhyb3VnaCBhZGp1c3RlZCB0eXBlcy4KKyAgICAgIGlmIChBZGp1c3RlZFR5cGVMb2MgQVRMID0gVEwuZ2V0QXM8QWRqdXN0ZWRUeXBlTG9jPigpKSB7CisgICAgICAgIFRMID0gQVRMLmdldE9yaWdpbmFsTG9jKCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQogICAgICAgaWYgKEJsb2NrUG9pbnRlclR5cGVMb2MgQmxvY2tQb2ludGVyVEwgPQogICAgICAgICAgICAgICBUTC5nZXRBczxCbG9ja1BvaW50ZXJUeXBlTG9jPigpKSB7CiAgICAgICAgIFRMID0gQmxvY2tQb2ludGVyVEwuZ2V0UG9pbnRlZUxvYygpLmdldFVucXVhbGlmaWVkTG9jKCk7CkBAIC0yNjEsMTMgKzI3MSwzOSBAQAogICAgICAgICBUTCA9IE1lbWJlclBvaW50ZXJUTC5nZXRQb2ludGVlTG9jKCkuZ2V0VW5xdWFsaWZpZWRMb2MoKTsKICAgICAgICAgY29udGludWU7CiAgICAgICB9CisgICAgICBpZiAoRWxhYm9yYXRlZFR5cGVMb2MgRVRMID0gVEwuZ2V0QXM8RWxhYm9yYXRlZFR5cGVMb2M+KCkpIHsKKyAgICAgICAgVEwgPSBFVEwuZ2V0TmFtZWRUeXBlTG9jKCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQogICAgICAgLy8gSXMgdGhpcyBhIHR5cGVkZWYgZm9yIGEgZnVuY3Rpb24gdHlwZT8KICAgICAgIGlmIChGdW5jdGlvblR5cGVMb2MgRlRMID0gVEwuZ2V0QXM8RnVuY3Rpb25UeXBlTG9jPigpKSB7CiAgICAgICAgIEtpbmQgPSBGdW5jdGlvbktpbmQ7CiAgICAgICAgIEFycmF5UmVmPFBhcm1WYXJEZWNsICo+IFBhcmFtcyA9IEZUTC5nZXRQYXJhbXMoKTsKICAgICAgICAgUGFyYW1WYXJzID0gQXJyYXlSZWY8Y29uc3QgUGFybVZhckRlY2wgKj4oUGFyYW1zLmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLnNpemUoKSk7Ci0gICAgICAgIFJlc3VsdFR5cGUgPSBGVEwuZ2V0UmVzdWx0TG9jKCkuZ2V0VHlwZSgpOworICAgICAgICBSZXR1cm5UeXBlID0gRlRMLmdldFJldHVybkxvYygpLmdldFR5cGUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGVMb2MgU1RMID0KKyAgICAgICAgICAgICAgVEwuZ2V0QXM8VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGVMb2M+KCkpIHsKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHR5cGVkZWYgdG8gYSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aXRoIGV4YWN0bHkgb25lCisgICAgICAgIC8vIHRlbXBsYXRlIGFyZ3VtZW50IG9mIGEgZnVuY3Rpb24gdHlwZSwgdGhpcyBsb29rcyBsaWtlIHN0ZDo6ZnVuY3Rpb24sCisgICAgICAgIC8vIGJvb3N0OjpmdW5jdGlvbiwgb3Igb3RoZXIgZnVuY3Rpb24gd3JhcHBlci4gIFRyZWF0IHRoZXNlIHR5cGVkZWZzIGFzCisgICAgICAgIC8vIGZ1bmN0aW9ucy4KKyAgICAgICAgaWYgKFNUTC5nZXROdW1BcmdzKCkgIT0gMSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgVGVtcGxhdGVBcmd1bWVudExvYyBNYXliZUZ1bmN0aW9uID0gU1RMLmdldEFyZ0xvYygwKTsKKyAgICAgICAgaWYgKE1heWJlRnVuY3Rpb24uZ2V0QXJndW1lbnQoKS5nZXRLaW5kKCkgIT0gVGVtcGxhdGVBcmd1bWVudDo6VHlwZSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgVHlwZVNvdXJjZUluZm8gKk1heWJlRnVuY3Rpb25UU0kgPSBNYXliZUZ1bmN0aW9uLmdldFR5cGVTb3VyY2VJbmZvKCk7CisgICAgICAgIFR5cGVMb2MgVEwgPSBNYXliZUZ1bmN0aW9uVFNJLT5nZXRUeXBlTG9jKCkuZ2V0VW5xdWFsaWZpZWRMb2MoKTsKKyAgICAgICAgaWYgKEZ1bmN0aW9uVHlwZUxvYyBGVEwgPSBUTC5nZXRBczxGdW5jdGlvblR5cGVMb2M+KCkpIHsKKyAgICAgICAgICBLaW5kID0gRnVuY3Rpb25LaW5kOworICAgICAgICAgIEFycmF5UmVmPFBhcm1WYXJEZWNsICo+IFBhcmFtcyA9IEZUTC5nZXRQYXJhbXMoKTsKKyAgICAgICAgICBQYXJhbVZhcnMgPSBBcnJheVJlZjxjb25zdCBQYXJtVmFyRGVjbCAqPihQYXJhbXMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5zaXplKCkpOworICAgICAgICAgIFJldHVyblR5cGUgPSBGVEwuZ2V0UmV0dXJuTG9jKCkuZ2V0VHlwZSgpOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9saWIvQVNUL0NvbW1lbnRDb21tYW5kVHJhaXRzLmNwcCBiL2xpYi9BU1QvQ29tbWVudENvbW1hbmRUcmFpdHMuY3BwCmluZGV4IDAxYmQxMmUuLjg4NzlhYWMgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvQ29tbWVudENvbW1hbmRUcmFpdHMuY3BwCisrKyBiL2xpYi9BU1QvQ29tbWVudENvbW1hbmRUcmFpdHMuY3BwCkBAIC00Myw0NyArNDMsNDIgQEAKICAgcmV0dXJuIGdldFJlZ2lzdGVyZWRDb21tYW5kSW5mbyhDb21tYW5kSUQpOwogfQogCi1zdGF0aWMgdm9pZAotSGVscGVyVHlwb0NvcnJlY3RDb21tYW5kSW5mbyhTbWFsbFZlY3RvckltcGw8Y29uc3QgQ29tbWFuZEluZm8gKj4gJkJlc3RDb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVHlwbywgY29uc3QgQ29tbWFuZEluZm8gKkNvbW1hbmQpIHsKLSAgY29uc3QgdW5zaWduZWQgTWF4RWRpdERpc3RhbmNlID0gMTsKLSAgdW5zaWduZWQgQmVzdEVkaXREaXN0YW5jZSA9IE1heEVkaXREaXN0YW5jZSArIDE7Ci0gIFN0cmluZ1JlZiBOYW1lID0gQ29tbWFuZC0+TmFtZTsKLSAgCi0gIHVuc2lnbmVkIE1pblBvc3NpYmxlRWRpdERpc3RhbmNlID0gYWJzKChpbnQpTmFtZS5zaXplKCkgLSAoaW50KVR5cG8uc2l6ZSgpKTsKLSAgaWYgKE1pblBvc3NpYmxlRWRpdERpc3RhbmNlID4gMCAmJgotICAgICAgVHlwby5zaXplKCkgLyBNaW5Qb3NzaWJsZUVkaXREaXN0YW5jZSA8IDEpCi0gICAgcmV0dXJuOwotICB1bnNpZ25lZCBFZGl0RGlzdGFuY2UgPSBUeXBvLmVkaXRfZGlzdGFuY2UoTmFtZSwgdHJ1ZSwgTWF4RWRpdERpc3RhbmNlKTsKLSAgaWYgKEVkaXREaXN0YW5jZSA+IE1heEVkaXREaXN0YW5jZSkKLSAgICByZXR1cm47Ci0gIGlmIChFZGl0RGlzdGFuY2UgPT0gQmVzdEVkaXREaXN0YW5jZSkKLSAgICBCZXN0Q29tbWFuZC5wdXNoX2JhY2soQ29tbWFuZCk7Ci0gIGVsc2UgaWYgKEVkaXREaXN0YW5jZSA8IEJlc3RFZGl0RGlzdGFuY2UpIHsKLSAgICBCZXN0Q29tbWFuZC5jbGVhcigpOwotICAgIEJlc3RDb21tYW5kLnB1c2hfYmFjayhDb21tYW5kKTsKLSAgICBCZXN0RWRpdERpc3RhbmNlID0gRWRpdERpc3RhbmNlOwotICB9Ci19Ci0KIGNvbnN0IENvbW1hbmRJbmZvICoKIENvbW1hbmRUcmFpdHM6OmdldFR5cG9Db3JyZWN0Q29tbWFuZEluZm8oU3RyaW5nUmVmIFR5cG8pIGNvbnN0IHsKLSAgLy8gc2luZ2xlIGNoYXJhY3RlciBjb21tYW5kIGltcG9zdHVyZXMsIHN1Y2ggYXMgXHQgb3IgXG4gbXVzdCBub3QgZ28KKyAgLy8gU2luZ2xlLWNoYXJhY3RlciBjb21tYW5kIGltcG9zdHVyZXMsIHN1Y2ggYXMgXHQgb3IgXG4sIHNob3VsZCBub3QgZ28KICAgLy8gdGhyb3VnaCB0aGUgZml4aXQgbG9naWMuCiAgIGlmIChUeXBvLnNpemUoKSA8PSAxKQotICAgIHJldHVybiBOVUxMOwotICAKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICAvLyBUaGUgbWF4aW11bSBlZGl0IGRpc3RhbmNlIHdlJ3JlIHByZXBhcmVkIHRvIGFjY2VwdC4KKyAgY29uc3QgdW5zaWduZWQgTWF4RWRpdERpc3RhbmNlID0gMTsKKworICB1bnNpZ25lZCBCZXN0RWRpdERpc3RhbmNlID0gTWF4RWRpdERpc3RhbmNlOwogICBTbWFsbFZlY3Rvcjxjb25zdCBDb21tYW5kSW5mbyAqLCAyPiBCZXN0Q29tbWFuZDsKLSAgCi0gIGNvbnN0IGludCBOdW1PZkNvbW1hbmRzID0gbGx2bTo6YXJyYXlfbGVuZ3Rob2YoQ29tbWFuZHMpOwotICBmb3IgKGludCBpID0gMDsgaSA8IE51bU9mQ29tbWFuZHM7IGkrKykKLSAgICBIZWxwZXJUeXBvQ29ycmVjdENvbW1hbmRJbmZvKEJlc3RDb21tYW5kLCBUeXBvLCAmQ29tbWFuZHNbaV0pOwotICAKLSAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZ2lzdGVyZWRDb21tYW5kcy5zaXplKCk7IGkgIT0gZTsgKytpKQotICAgIGlmICghUmVnaXN0ZXJlZENvbW1hbmRzW2ldLT5Jc1Vua25vd25Db21tYW5kKQotICAgICAgSGVscGVyVHlwb0NvcnJlY3RDb21tYW5kSW5mbyhCZXN0Q29tbWFuZCwgVHlwbywgUmVnaXN0ZXJlZENvbW1hbmRzW2ldKTsKLSAgCi0gIHJldHVybiAoQmVzdENvbW1hbmQuc2l6ZSgpICE9IDEpID8gTlVMTCA6IEJlc3RDb21tYW5kWzBdOworCisgIGF1dG8gQ29uc2lkZXJDb3JyZWN0aW9uID0gWyZdKGNvbnN0IENvbW1hbmRJbmZvICpDb21tYW5kKSB7CisgICAgU3RyaW5nUmVmIE5hbWUgPSBDb21tYW5kLT5OYW1lOworCisgICAgdW5zaWduZWQgTWluUG9zc2libGVFZGl0RGlzdGFuY2UgPSBhYnMoKGludClOYW1lLnNpemUoKSAtIChpbnQpVHlwby5zaXplKCkpOworICAgIGlmIChNaW5Qb3NzaWJsZUVkaXREaXN0YW5jZSA8PSBCZXN0RWRpdERpc3RhbmNlKSB7CisgICAgICB1bnNpZ25lZCBFZGl0RGlzdGFuY2UgPSBUeXBvLmVkaXRfZGlzdGFuY2UoTmFtZSwgdHJ1ZSwgQmVzdEVkaXREaXN0YW5jZSk7CisgICAgICBpZiAoRWRpdERpc3RhbmNlIDwgQmVzdEVkaXREaXN0YW5jZSkgeworICAgICAgICBCZXN0RWRpdERpc3RhbmNlID0gRWRpdERpc3RhbmNlOworICAgICAgICBCZXN0Q29tbWFuZC5jbGVhcigpOworICAgICAgfQorICAgICAgaWYgKEVkaXREaXN0YW5jZSA9PSBCZXN0RWRpdERpc3RhbmNlKQorICAgICAgICBCZXN0Q29tbWFuZC5wdXNoX2JhY2soQ29tbWFuZCk7CisgICAgfQorICB9OworCisgIGZvciAoY29uc3QgYXV0byAmQ29tbWFuZCA6IENvbW1hbmRzKQorICAgIENvbnNpZGVyQ29ycmVjdGlvbigmQ29tbWFuZCk7CisKKyAgZm9yIChjb25zdCBhdXRvICpDb21tYW5kIDogUmVnaXN0ZXJlZENvbW1hbmRzKQorICAgIGlmICghQ29tbWFuZC0+SXNVbmtub3duQ29tbWFuZCkKKyAgICAgIENvbnNpZGVyQ29ycmVjdGlvbihDb21tYW5kKTsKKworICByZXR1cm4gQmVzdENvbW1hbmQuc2l6ZSgpID09IDEgPyBCZXN0Q29tbWFuZFswXSA6IG51bGxwdHI7CiB9CiAKIENvbW1hbmRJbmZvICpDb21tYW5kVHJhaXRzOjpjcmVhdGVDb21tYW5kSW5mb1dpdGhOYW1lKFN0cmluZ1JlZiBDb21tYW5kTmFtZSkgewpkaWZmIC0tZ2l0IGEvbGliL0FTVC9Db21tZW50TGV4ZXIuY3BwIGIvbGliL0FTVC9Db21tZW50TGV4ZXIuY3BwCmluZGV4IDAxZWQzY2UuLjc5MmE4MzIgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvQ29tbWVudExleGVyLmNwcAorKysgYi9saWIvQVNUL0NvbW1lbnRMZXhlci5jcHAKQEAgLTI2OCw2ICsyNjgsMTkgQEAKICAgICAKIH0gLy8gdW5uYW1lZCBuYW1lc3BhY2UKIAordm9pZCBMZXhlcjo6Zm9ybVRva2VuV2l0aENoYXJzKFRva2VuICZSZXN1bHQsIGNvbnN0IGNoYXIgKlRva0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBLaW5kKSB7CisgIGNvbnN0IHVuc2lnbmVkIFRva0xlbiA9IFRva0VuZCAtIEJ1ZmZlclB0cjsKKyAgUmVzdWx0LnNldExvY2F0aW9uKGdldFNvdXJjZUxvY2F0aW9uKEJ1ZmZlclB0cikpOworICBSZXN1bHQuc2V0S2luZChLaW5kKTsKKyAgUmVzdWx0LnNldExlbmd0aChUb2tMZW4pOworI2lmbmRlZiBOREVCVUcKKyAgUmVzdWx0LlRleHRQdHIgPSAiPFVOU0VUPiI7CisgIFJlc3VsdC5JbnRWYWwgPSA3OworI2VuZGlmCisgIEJ1ZmZlclB0ciA9IFRva0VuZDsKK30KKwogdm9pZCBMZXhlcjo6bGV4Q29tbWVudFRleHQoVG9rZW4gJlQpIHsKICAgYXNzZXJ0KENvbW1lbnRTdGF0ZSA9PSBMQ1NfSW5zaWRlQkNQTENvbW1lbnQgfHwKICAgICAgICAgIENvbW1lbnRTdGF0ZSA9PSBMQ1NfSW5zaWRlQ0NvbW1lbnQpOwpkaWZmIC0tZ2l0IGEvbGliL0FTVC9Db21tZW50U2VtYS5jcHAgYi9saWIvQVNUL0NvbW1lbnRTZW1hLmNwcAppbmRleCAxYzYyMjJmLi5lNTFmODc4IDEwMDY0NAotLS0gYS9saWIvQVNUL0NvbW1lbnRTZW1hLmNwcAorKysgYi9saWIvQVNUL0NvbW1lbnRTZW1hLmNwcApAQCAtNjgsOCArNjgsMTIgQEAKICAgQ29tbWFuZC0+c2V0UGFyYWdyYXBoKFBhcmFncmFwaCk7CiAgIGNoZWNrQmxvY2tDb21tYW5kRW1wdHlQYXJhZ3JhcGgoQ29tbWFuZCk7CiAgIGNoZWNrQmxvY2tDb21tYW5kRHVwbGljYXRlKENvbW1hbmQpOwotICBjaGVja1JldHVybnNDb21tYW5kKENvbW1hbmQpOwotICBjaGVja0RlcHJlY2F0ZWRDb21tYW5kKENvbW1hbmQpOworICBpZiAoVGhpc0RlY2xJbmZvKSB7CisgICAgLy8gVGhlc2UgY2hlY2tzIG9ubHkgbWFrZSBzZW5zZSBpZiB0aGUgY29tbWVudCBpcyBhdHRhY2hlZCB0byBhCisgICAgLy8gZGVjbGFyYXRpb24uCisgICAgY2hlY2tSZXR1cm5zQ29tbWFuZChDb21tYW5kKTsKKyAgICBjaGVja0RlcHJlY2F0ZWRDb21tYW5kKENvbW1hbmQpOworICB9CiB9CiAKIFBhcmFtQ29tbWFuZENvbW1lbnQgKlNlbWE6OmFjdE9uUGFyYW1Db21tYW5kU3RhcnQoCkBAIC0xMjIsNyArMTI2LDcgQEAKICAgICA8PCAoRGlhZ1NlbGVjdC0xKSA8PCAoRGlhZ1NlbGVjdC0xKQogICAgIDw8IENvbW1lbnQtPmdldFNvdXJjZVJhbmdlKCk7CiB9Ci0gIAorCiB2b2lkIFNlbWE6OmNoZWNrQ29udGFpbmVyRGVjbFZlcmJhdGltTGluZShjb25zdCBCbG9ja0NvbW1hbmRDb21tZW50ICpDb21tZW50KSB7CiAgIGNvbnN0IENvbW1hbmRJbmZvICpJbmZvID0gVHJhaXRzLmdldENvbW1hbmRJbmZvKENvbW1lbnQtPmdldENvbW1hbmRJRCgpKTsKICAgaWYgKCFJbmZvLT5Jc1JlY29yZExpa2VEZWNsYXJhdGlvbkNvbW1hbmQpCkBAIC01NTgsOCArNTYyLDExIEBACiB2b2lkIFNlbWE6OmNoZWNrUmV0dXJuc0NvbW1hbmQoY29uc3QgQmxvY2tDb21tYW5kQ29tbWVudCAqQ29tbWFuZCkgewogICBpZiAoIVRyYWl0cy5nZXRDb21tYW5kSW5mbyhDb21tYW5kLT5nZXRDb21tYW5kSUQoKSktPklzUmV0dXJuc0NvbW1hbmQpCiAgICAgcmV0dXJuOworCisgIGFzc2VydChUaGlzRGVjbEluZm8gJiYgInNob3VsZCBub3QgY2FsbCB0aGlzIGNoZWNrIG9uIGEgYmFyZSBjb21tZW50Iik7CisKICAgaWYgKGlzRnVuY3Rpb25EZWNsKCkpIHsKLSAgICBpZiAoVGhpc0RlY2xJbmZvLT5SZXN1bHRUeXBlLT5pc1ZvaWRUeXBlKCkpIHsKKyAgICBpZiAoVGhpc0RlY2xJbmZvLT5SZXR1cm5UeXBlLT5pc1ZvaWRUeXBlKCkpIHsKICAgICAgIHVuc2lnbmVkIERpYWdLaW5kOwogICAgICAgc3dpdGNoIChUaGlzRGVjbEluZm8tPkNvbW1lbnREZWNsLT5nZXRLaW5kKCkpIHsKICAgICAgIGRlZmF1bHQ6CkBAIC01ODYsNyArNTkzLDcgQEAKICAgfQogICBlbHNlIGlmIChpc09iakNQcm9wZXJ0eURlY2woKSkKICAgICByZXR1cm47Ci0gIAorCiAgIERpYWcoQ29tbWFuZC0+Z2V0TG9jYXRpb24oKSwKICAgICAgICBkaWFnOjp3YXJuX2RvY19yZXR1cm5zX25vdF9hdHRhY2hlZF90b19hX2Z1bmN0aW9uX2RlY2wpCiAgICAgPDwgQ29tbWFuZC0+Z2V0Q29tbWFuZE1hcmtlcigpCkBAIC02MzYsNiArNjQzLDggQEAKICAgaWYgKCFUcmFpdHMuZ2V0Q29tbWFuZEluZm8oQ29tbWFuZC0+Z2V0Q29tbWFuZElEKCkpLT5Jc0RlcHJlY2F0ZWRDb21tYW5kKQogICAgIHJldHVybjsKIAorICBhc3NlcnQoVGhpc0RlY2xJbmZvICYmICJzaG91bGQgbm90IGNhbGwgdGhpcyBjaGVjayBvbiBhIGJhcmUgY29tbWVudCIpOworCiAgIGNvbnN0IERlY2wgKkQgPSBUaGlzRGVjbEluZm8tPkNvbW1lbnREZWNsOwogICBpZiAoIUQpCiAgICAgcmV0dXJuOwpAQCAtNzgzLDExICs3OTIsMTQgQEAKIH0KIAogYm9vbCBTZW1hOjppc0Z1bmN0aW9uT3JNZXRob2RWYXJpYWRpYygpIHsKLSAgaWYgKCFpc0FueUZ1bmN0aW9uRGVjbCgpICYmICFpc09iakNNZXRob2REZWNsKCkpCisgIGlmICghaXNBbnlGdW5jdGlvbkRlY2woKSAmJiAhaXNPYmpDTWV0aG9kRGVjbCgpICYmICFpc0Z1bmN0aW9uVGVtcGxhdGVEZWNsKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9CiAgICAgICAgIGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oVGhpc0RlY2xJbmZvLT5DdXJyZW50RGVjbCkpCiAgICAgcmV0dXJuIEZELT5pc1ZhcmlhZGljKCk7CisgIGlmIChjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRlREID0KKyAgICAgICAgZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KFRoaXNEZWNsSW5mby0+Q3VycmVudERlY2wpKQorICAgIHJldHVybiBGVEQtPmdldFRlbXBsYXRlZERlY2woKS0+aXNWYXJpYWRpYygpOwogICBpZiAoY29uc3QgT2JqQ01ldGhvZERlY2wgKk1EID0KICAgICAgICAgZHluX2Nhc3Q8T2JqQ01ldGhvZERlY2w+KFRoaXNEZWNsSW5mby0+Q3VycmVudERlY2wpKQogICAgIHJldHVybiBNRC0+aXNWYXJpYWRpYygpOwpAQCAtODEyLDcgKzgyNCw3IEBACiAgIH0KICAgcmV0dXJuIGZhbHNlOwogfQotICAKKwogYm9vbCBTZW1hOjppc09iakNQcm9wZXJ0eURlY2woKSB7CiAgIGlmICghVGhpc0RlY2xJbmZvKQogICAgIHJldHVybiBmYWxzZTsKQEAgLTgzNCw4ICs4NDYsOCBAQAogICAgIHJldHVybiBmYWxzZTsKICAgaWYgKCFUaGlzRGVjbEluZm8tPklzRmlsbGVkKQogICAgIGluc3BlY3RUaGlzRGVjbCgpOwotICByZXR1cm4gaXNVbmlvbkRlY2woKSB8fCBpc0NsYXNzT3JTdHJ1Y3REZWNsKCkgCi0gICAgICAgICB8fCBpc09iakNJbnRlcmZhY2VEZWNsKCkgfHwgaXNPYmpDUHJvdG9jb2xEZWNsKCk7CisgIHJldHVybiBpc1VuaW9uRGVjbCgpIHx8IGlzQ2xhc3NPclN0cnVjdERlY2woKSB8fCBpc09iakNJbnRlcmZhY2VEZWNsKCkgfHwKKyAgICAgICAgIGlzT2JqQ1Byb3RvY29sRGVjbCgpOwogfQogCiBib29sIFNlbWE6OmlzVW5pb25EZWNsKCkgewpAQCAtODQ4LDcgKzg2MCw3IEBACiAgICAgcmV0dXJuIFJELT5pc1VuaW9uKCk7CiAgIHJldHVybiBmYWxzZTsKIH0KLSAgCisKIGJvb2wgU2VtYTo6aXNDbGFzc09yU3RydWN0RGVjbCgpIHsKICAgaWYgKCFUaGlzRGVjbEluZm8pCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtODU4LDcgKzg3MCw3IEBACiAgICAgICAgICBpc2E8UmVjb3JkRGVjbD4oVGhpc0RlY2xJbmZvLT5DdXJyZW50RGVjbCkgJiYKICAgICAgICAgICFpc1VuaW9uRGVjbCgpOwogfQotICAKKwogYm9vbCBTZW1hOjppc0NsYXNzVGVtcGxhdGVEZWNsKCkgewogICBpZiAoIVRoaXNEZWNsSW5mbykKICAgICByZXR1cm4gZmFsc2U7CkBAIC04NzQsNyArODg2LDcgQEAKICAgaWYgKCFUaGlzRGVjbEluZm8tPklzRmlsbGVkKQogICAgIGluc3BlY3RUaGlzRGVjbCgpOwogICByZXR1cm4gVGhpc0RlY2xJbmZvLT5DdXJyZW50RGVjbCAmJgotICAoaXNhPEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihUaGlzRGVjbEluZm8tPkN1cnJlbnREZWNsKSk7CisgICAgICAgICAoaXNhPEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihUaGlzRGVjbEluZm8tPkN1cnJlbnREZWNsKSk7CiB9CiAKIGJvb2wgU2VtYTo6aXNPYmpDSW50ZXJmYWNlRGVjbCgpIHsKQEAgLTg4NSw3ICs4OTcsNyBAQAogICByZXR1cm4gVGhpc0RlY2xJbmZvLT5DdXJyZW50RGVjbCAmJgogICAgICAgICAgaXNhPE9iakNJbnRlcmZhY2VEZWNsPihUaGlzRGVjbEluZm8tPkN1cnJlbnREZWNsKTsKIH0KLSAgCisKIGJvb2wgU2VtYTo6aXNPYmpDUHJvdG9jb2xEZWNsKCkgewogICBpZiAoIVRoaXNEZWNsSW5mbykKICAgICByZXR1cm4gZmFsc2U7CkBAIC04OTQsNyArOTA2LDcgQEAKICAgcmV0dXJuIFRoaXNEZWNsSW5mby0+Q3VycmVudERlY2wgJiYKICAgICAgICAgIGlzYTxPYmpDUHJvdG9jb2xEZWNsPihUaGlzRGVjbEluZm8tPkN1cnJlbnREZWNsKTsKIH0KLSAgCisKIEFycmF5UmVmPGNvbnN0IFBhcm1WYXJEZWNsICo+IFNlbWE6OmdldFBhcmFtVmFycygpIHsKICAgaWYgKCFUaGlzRGVjbEluZm8tPklzRmlsbGVkKQogICAgIGluc3BlY3RUaGlzRGVjbCgpOwpkaWZmIC0tZ2l0IGEvbGliL0FTVC9EZWNsLmNwcCBiL2xpYi9BU1QvRGVjbC5jcHAKaW5kZXggNmJkOTg1OC4uMTU0MTBmMCAxMDA2NDQKLS0tIGEvbGliL0FTVC9EZWNsLmNwcAorKysgYi9saWIvQVNUL0RlY2wuY3BwCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVExhbWJkYS5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RNdXRhdGlvbkxpc3RlbmVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0F0dHIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgpAQCAtMjksNyArMzAsNiBAQAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NwZWNpZmllcnMuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKQEAgLTE1OCw4ICsxNTgsNyBAQAogLy8vIERvZXMgdGhlIGdpdmVuIGRlY2xhcmF0aW9uIGhhdmUgbWVtYmVyIHNwZWNpYWxpemF0aW9uIGluZm9ybWF0aW9uLAogLy8vIGFuZCBpZiBzbywgaXMgaXQgYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24/CiB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RhdGljIHR5cGVuYW1lCi1sbHZtOjplbmFibGVfaWZfYzwhbGx2bTo6aXNfYmFzZV9vZjxSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2wsIFQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgIGJvb2w+Ojp0eXBlCitzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19iYXNlX29mPFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbCwgVD46OnZhbHVlLCBib29sPjo6dHlwZQogaXNFeHBsaWNpdE1lbWJlclNwZWNpYWxpemF0aW9uKGNvbnN0IFQgKkQpIHsKICAgaWYgKGNvbnN0IE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbyAqbWVtYmVyID0KICAgICAgICAgRC0+Z2V0TWVtYmVyU3BlY2lhbGl6YXRpb25JbmZvKCkpIHsKQEAgLTIwOSwxMSArMjA4LDggQEAKICAgLy8gSWYgd2UncmUgb24gTWFjIE9TIFgsIGFuICdhdmFpbGFiaWxpdHknIGZvciBNYWMgT1MgWCBhdHRyaWJ1dGUKICAgLy8gaW1wbGllcyB2aXNpYmlsaXR5KGRlZmF1bHQpLgogICBpZiAoRC0+Z2V0QVNUQ29udGV4dCgpLmdldFRhcmdldEluZm8oKS5nZXRUcmlwbGUoKS5pc09TRGFyd2luKCkpIHsKLSAgICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8QXZhaWxhYmlsaXR5QXR0cj4gCi0gICAgICAgICAgICAgIEEgPSBELT5zcGVjaWZpY19hdHRyX2JlZ2luPEF2YWlsYWJpbGl0eUF0dHI+KCksCi0gICAgICAgICAgIEFFbmQgPSBELT5zcGVjaWZpY19hdHRyX2VuZDxBdmFpbGFiaWxpdHlBdHRyPigpOwotICAgICAgICAgQSAhPSBBRW5kOyArK0EpCi0gICAgICBpZiAoKCpBKS0+Z2V0UGxhdGZvcm0oKS0+Z2V0TmFtZSgpLmVxdWFscygibWFjb3N4IikpCisgICAgZm9yIChjb25zdCBhdXRvICpBIDogRC0+c3BlY2lmaWNfYXR0cnM8QXZhaWxhYmlsaXR5QXR0cj4oKSkKKyAgICAgIGlmIChBLT5nZXRQbGF0Zm9ybSgpLT5nZXROYW1lKCkuZXF1YWxzKCJtYWNvc3giKSkKICAgICAgICAgcmV0dXJuIERlZmF1bHRWaXNpYmlsaXR5OwogICB9CiAKQEAgLTUxMiw5ICs1MDgsOSBAQAogICByZXR1cm4gRmlyc3QtPmlzSW5FeHRlcm5DQ29udGV4dCgpOwogfQogCi1zdGF0aWMgYm9vbCBpc1NpbmdsZUxpbmVFeHRlcm5DKGNvbnN0IERlY2wgJkQpIHsKK3N0YXRpYyBib29sIGlzU2luZ2xlTGluZUxhbmd1YWdlTGlua2FnZShjb25zdCBEZWNsICZEKSB7CiAgIGlmIChjb25zdCBMaW5rYWdlU3BlY0RlY2wgKlNEID0gZHluX2Nhc3Q8TGlua2FnZVNwZWNEZWNsPihELmdldERlY2xDb250ZXh0KCkpKQotICAgIGlmIChTRC0+Z2V0TGFuZ3VhZ2UoKSA9PSBMaW5rYWdlU3BlY0RlY2w6OmxhbmdfYyAmJiAhU0QtPmhhc0JyYWNlcygpKQorICAgIGlmICghU0QtPmhhc0JyYWNlcygpKQogICAgICAgcmV0dXJuIHRydWU7CiAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTU0OCw3ICs1NDQsNyBAQAogCiAgICAgICBpZiAoVmFyLT5nZXRTdG9yYWdlQ2xhc3MoKSAhPSBTQ19FeHRlcm4gJiYKICAgICAgICAgICBWYXItPmdldFN0b3JhZ2VDbGFzcygpICE9IFNDX1ByaXZhdGVFeHRlcm4gJiYKLSAgICAgICAgICAhaXNTaW5nbGVMaW5lRXh0ZXJuQygqVmFyKSkKKyAgICAgICAgICAhaXNTaW5nbGVMaW5lTGFuZ3VhZ2VMaW5rYWdlKCpWYXIpKQogICAgICAgICByZXR1cm4gTGlua2FnZUluZm86OmludGVybmFsKCk7CiAgICAgfQogCkBAIC01NjEsMTYgKzU1NywxMCBAQAogICAgICAgaWYgKFByZXZWYXItPmdldFN0b3JhZ2VDbGFzcygpID09IFNDX1N0YXRpYykKICAgICAgICAgcmV0dXJuIExpbmthZ2VJbmZvOjppbnRlcm5hbCgpOwogICAgIH0KLSAgfSBlbHNlIGlmIChpc2E8RnVuY3Rpb25EZWNsPihEKSB8fCBpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpKSB7CisgIH0gZWxzZSBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGdW5jdGlvbiA9IEQtPmdldEFzRnVuY3Rpb24oKSkgewogICAgIC8vIEMrKyBbdGVtcF1wNDoKICAgICAvLyAgIEEgbm9uLW1lbWJlciBmdW5jdGlvbiB0ZW1wbGF0ZSBjYW4gaGF2ZSBpbnRlcm5hbCBsaW5rYWdlOyBhbnkKICAgICAvLyAgIG90aGVyIHRlbXBsYXRlIG5hbWUgc2hhbGwgaGF2ZSBleHRlcm5hbCBsaW5rYWdlLgotICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24gPSAwOwotICAgIGlmIChjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRnVuVG1wbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpKQotICAgICAgRnVuY3Rpb24gPSBGdW5UbXBsLT5nZXRUZW1wbGF0ZWREZWNsKCk7Ci0gICAgZWxzZQotICAgICAgRnVuY3Rpb24gPSBjYXN0PEZ1bmN0aW9uRGVjbD4oRCk7CiAKICAgICAvLyBFeHBsaWNpdGx5IGRlY2xhcmVkIHN0YXRpYy4KICAgICBpZiAoRnVuY3Rpb24tPmdldENhbm9uaWNhbERlY2woKS0+Z2V0U3RvcmFnZUNsYXNzKCkgPT0gU0NfU3RhdGljKQpAQCAtNzgyLDExICs3NzIsMTggQEAKICAgLy8gcmVhbGx5IGhhdmUgbGlua2FnZSwgYnV0IGl0J3MgY29udmVuaWVudCB0byBzYXkgdGhleSBkbyBmb3IgdGhlCiAgIC8vIHB1cnBvc2VzIG9mIGNhbGN1bGF0aW5nIGxpbmthZ2Ugb2YgcG9pbnRlci10by1kYXRhLW1lbWJlcgogICAvLyB0ZW1wbGF0ZSBhcmd1bWVudHMuCisgIC8vCisgIC8vIFRlbXBsYXRlcyBhbHNvIGRvbid0IG9mZmljaWFsbHkgaGF2ZSBsaW5rYWdlLCBidXQgc2luY2Ugd2UgaWdub3JlCisgIC8vIHRoZSBDKysgc3RhbmRhcmQgYW5kIGxvb2sgYXQgdGVtcGxhdGUgYXJndW1lbnRzIHdoZW4gZGV0ZXJtaW5pbmcKKyAgLy8gbGlua2FnZSBhbmQgdmlzaWJpbGl0eSBvZiBhIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCB3ZSBtaWdodCBoaXQKKyAgLy8gYSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0IHdheS4gSWYgd2UgZG8sIHdlIG5lZWQgdG8KKyAgLy8gY29uc2lkZXIgaXRzIGxpbmthZ2UuCiAgIGlmICghKGlzYTxDWFhNZXRob2REZWNsPihEKSB8fAogICAgICAgICBpc2E8VmFyRGVjbD4oRCkgfHwKICAgICAgICAgaXNhPEZpZWxkRGVjbD4oRCkgfHwKICAgICAgICAgaXNhPEluZGlyZWN0RmllbGREZWNsPihEKSB8fAotICAgICAgICBpc2E8VGFnRGVjbD4oRCkpKQorICAgICAgICBpc2E8VGFnRGVjbD4oRCkgfHwKKyAgICAgICAgaXNhPFRlbXBsYXRlRGVjbD4oRCkpKQogICAgIHJldHVybiBMaW5rYWdlSW5mbzo6bm9uZSgpOwogCiAgIExpbmthZ2VJbmZvIExWOwpAQCAtMTI0MiwxNiArMTIzOSwxMyBAQAogCiAgICAgLy8gV2UgaGF2ZSBqdXN0IGNvbXB1dGVkIHRoZSBsaW5rYWdlIGZvciB0aGlzIGRlY2wuIEJ5IGluZHVjdGlvbiB3ZSBrbm93CiAgICAgLy8gdGhhdCBhbGwgb3RoZXIgY29tcHV0ZWQgbGlua2FnZXMgbWF0Y2gsIGNoZWNrIHRoYXQgdGhlIG9uZSB3ZSBqdXN0Ci0gICAgLy8gY29tcHV0ZWQKLSAgICAvLyBhbHNvIGRvZXMuCisgICAgLy8gY29tcHV0ZWQgYWxzbyBkb2VzLgogICAgIE5hbWVkRGVjbCAqT2xkID0gTlVMTDsKLSAgICBmb3IgKE5hbWVkRGVjbDo6cmVkZWNsX2l0ZXJhdG9yIEkgPSBELT5yZWRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRC0+cmVkZWNsc19lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgICBOYW1lZERlY2wgKlQgPSBjYXN0PE5hbWVkRGVjbD4oKkkpOworICAgIGZvciAoYXV0byBJIDogRC0+cmVkZWNscygpKSB7CisgICAgICBOYW1lZERlY2wgKlQgPSBjYXN0PE5hbWVkRGVjbD4oSSk7CiAgICAgICBpZiAoVCA9PSBEKQogICAgICAgICBjb250aW51ZTsKLSAgICAgIGlmIChULT5oYXNDYWNoZWRMaW5rYWdlKCkpIHsKKyAgICAgIGlmICghVC0+aXNJbnZhbGlkRGVjbCgpICYmIFQtPmhhc0NhY2hlZExpbmthZ2UoKSkgewogICAgICAgICBPbGQgPSBUOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTEyNzAsMTMgKzEyNjQsOSBAQAogfQogCiBzdGQ6OnN0cmluZyBOYW1lZERlY2w6OmdldFF1YWxpZmllZE5hbWVBc1N0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuIGdldFF1YWxpZmllZE5hbWVBc1N0cmluZyhnZXRBU1RDb250ZXh0KCkuZ2V0UHJpbnRpbmdQb2xpY3koKSk7Ci19Ci0KLXN0ZDo6c3RyaW5nIE5hbWVkRGVjbDo6Z2V0UXVhbGlmaWVkTmFtZUFzU3RyaW5nKGNvbnN0IFByaW50aW5nUG9saWN5ICZQKSBjb25zdCB7CiAgIHN0ZDo6c3RyaW5nIFF1YWxOYW1lOwogICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gT1MoUXVhbE5hbWUpOwotICBwcmludFF1YWxpZmllZE5hbWUoT1MsIFApOworICBwcmludFF1YWxpZmllZE5hbWUoT1MsIGdldEFTVENvbnRleHQoKS5nZXRQcmludGluZ1BvbGljeSgpKTsKICAgcmV0dXJuIE9TLnN0cigpOwogfQogCkBAIC0xMzE0LDEyICsxMzA0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQKTsKICAgICB9IGVsc2UgaWYgKGNvbnN0IE5hbWVzcGFjZURlY2wgKk5EID0gZHluX2Nhc3Q8TmFtZXNwYWNlRGVjbD4oKkkpKSB7CiAgICAgICBpZiAoTkQtPmlzQW5vbnltb3VzTmFtZXNwYWNlKCkpCi0gICAgICAgIE9TIDw8ICI8YW5vbnltb3VzIG5hbWVzcGFjZT4iOworICAgICAgICBPUyA8PCAiKGFub255bW91cyBuYW1lc3BhY2UpIjsKICAgICAgIGVsc2UKICAgICAgICAgT1MgPDwgKk5EOwogICAgIH0gZWxzZSBpZiAoY29uc3QgUmVjb3JkRGVjbCAqUkQgPSBkeW5fY2FzdDxSZWNvcmREZWNsPigqSSkpIHsKICAgICAgIGlmICghUkQtPmdldElkZW50aWZpZXIoKSkKLSAgICAgICAgT1MgPDwgIjxhbm9ueW1vdXMgIiA8PCBSRC0+Z2V0S2luZE5hbWUoKSA8PCAnPic7CisgICAgICAgIE9TIDw8ICIoYW5vbnltb3VzICIgPDwgUkQtPmdldEtpbmROYW1lKCkgPDwgJyknOwogICAgICAgZWxzZQogICAgICAgICBPUyA8PCAqUkQ7CiAgICAgfSBlbHNlIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPigqSSkpIHsKQEAgLTEzNTIsNyArMTM0Miw3IEBACiAgIGlmIChnZXREZWNsTmFtZSgpKQogICAgIE9TIDw8ICp0aGlzOwogICBlbHNlCi0gICAgT1MgPDwgIjxhbm9ueW1vdXM+IjsKKyAgICBPUyA8PCAiKGFub255bW91cykiOwogfQogCiB2b2lkIE5hbWVkRGVjbDo6Z2V0TmFtZUZvckRpYWdub3N0aWMocmF3X29zdHJlYW0gJk9TLApAQCAtMTM5Miw2ICsxMzgyLDcgQEAKICAgaWYgKGlzYTxPYmpDTWV0aG9kRGVjbD4odGhpcykpCiAgICAgcmV0dXJuIGZhbHNlOwogCisgIC8vIEZJWE1FOiBJcyB0aGlzIGNvcnJlY3QgaWYgb25lIG9mIHRoZSBkZWNscyBjb21lcyBmcm9tIGFuIGlubGluZSBuYW1lc3BhY2U/CiAgIGlmIChpc2E8T2JqQ0ludGVyZmFjZURlY2w+KHRoaXMpICYmIGlzYTxPYmpDQ29tcGF0aWJsZUFsaWFzRGVjbD4oT2xkRCkpCiAgICAgcmV0dXJuIHRydWU7CiAKQEAgLTE0MTgsMTQgKzE0MDksMTkgQEAKIAogICAvLyBBIHR5cGVkZWYgb2YgYW4gT2JqZWN0aXZlLUMgY2xhc3MgdHlwZSBjYW4gcmVwbGFjZSBhbiBPYmplY3RpdmUtQyBjbGFzcwogICAvLyBkZWNsYXJhdGlvbiBvciBkZWZpbml0aW9uLCBhbmQgdmljZSB2ZXJzYS4KKyAgLy8gRklYTUU6IElzIHRoaXMgY29ycmVjdCBpZiBvbmUgb2YgdGhlIGRlY2xzIGNvbWVzIGZyb20gYW4gaW5saW5lIG5hbWVzcGFjZT8KICAgaWYgKChpc2E8VHlwZWRlZk5hbWVEZWNsPih0aGlzKSAmJiBpc2E8T2JqQ0ludGVyZmFjZURlY2w+KE9sZEQpKSB8fAogICAgICAgKGlzYTxPYmpDSW50ZXJmYWNlRGVjbD4odGhpcykgJiYgaXNhPFR5cGVkZWZOYW1lRGVjbD4oT2xkRCkpKQogICAgIHJldHVybiB0cnVlOwotICAKKwogICAvLyBGb3Igbm9uLWZ1bmN0aW9uIGRlY2xhcmF0aW9ucywgaWYgdGhlIGRlY2xhcmF0aW9ucyBhcmUgb2YgdGhlCi0gIC8vIHNhbWUga2luZCB0aGVuIHRoaXMgbXVzdCBiZSBhIHJlZGVjbGFyYXRpb24sIG9yIHNlbWFudGljIGFuYWx5c2lzCi0gIC8vIHdvdWxkIG5vdCBoYXZlIGdpdmVuIHVzIHRoZSBuZXcgZGVjbGFyYXRpb24uCi0gIHJldHVybiB0aGlzLT5nZXRLaW5kKCkgPT0gT2xkRC0+Z2V0S2luZCgpOworICAvLyBzYW1lIGtpbmQgYW5kIGhhdmUgdGhlIHNhbWUgcGFyZW50IHRoZW4gdGhpcyBtdXN0IGJlIGEgcmVkZWNsYXJhdGlvbiwKKyAgLy8gb3Igc2VtYW50aWMgYW5hbHlzaXMgd291bGQgbm90IGhhdmUgZ2l2ZW4gdXMgdGhlIG5ldyBkZWNsYXJhdGlvbi4KKyAgLy8gTm90ZSB0aGF0IGlubGluZSBuYW1lc3BhY2VzIGNhbiBnaXZlIHVzIHR3byBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgc2FtZQorICAvLyBuYW1lIGFuZCBraW5kIGluIHRoZSBzYW1lIHNjb3BlIGJ1dCBkaWZmZXJlbnQgY29udGV4dHMuCisgIHJldHVybiB0aGlzLT5nZXRLaW5kKCkgPT0gT2xkRC0+Z2V0S2luZCgpICYmCisgICAgICAgICB0aGlzLT5nZXREZWNsQ29udGV4dCgpLT5nZXRSZWRlY2xDb250ZXh0KCktPkVxdWFscygKKyAgICAgICAgICAgICBPbGRELT5nZXREZWNsQ29udGV4dCgpLT5nZXRSZWRlY2xDb250ZXh0KCkpOwogfQogCiBib29sIE5hbWVkRGVjbDo6aGFzTGlua2FnZSgpIGNvbnN0IHsKQEAgLTE0NTMsMTEgKzE0NDksOSBAQAogCiAgIGlmIChpc2E8RmllbGREZWNsPihEKSB8fCBpc2E8SW5kaXJlY3RGaWVsZERlY2w+KEQpIHx8IGlzYTxNU1Byb3BlcnR5RGVjbD4oRCkpCiAgICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpc2E8Q1hYTWV0aG9kRGVjbD4oRCkpCi0gICAgcmV0dXJuIGNhc3Q8Q1hYTWV0aG9kRGVjbD4oRCktPmlzSW5zdGFuY2UoKTsKLSAgaWYgKGlzYTxGdW5jdGlvblRlbXBsYXRlRGVjbD4oRCkpCi0gICAgcmV0dXJuIGNhc3Q8Q1hYTWV0aG9kRGVjbD4oY2FzdDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0VGVtcGxhdGVkRGVjbCgpKS0+aXNJbnN0YW5jZSgpOworICBpZiAoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPQorICAgICAgICAgIGR5bl9jYXN0X29yX251bGw8Q1hYTWV0aG9kRGVjbD4oRC0+Z2V0QXNGdW5jdGlvbigpKSkKKyAgICByZXR1cm4gTUQtPmlzSW5zdGFuY2UoKTsKICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC0xNTc0LDcgKzE1NjgsOSBAQAogU291cmNlUmFuZ2UgRGVjbGFyYXRvckRlY2w6OmdldFNvdXJjZVJhbmdlKCkgY29uc3QgewogICBTb3VyY2VMb2NhdGlvbiBSYW5nZUVuZCA9IGdldExvY2F0aW9uKCk7CiAgIGlmIChUeXBlU291cmNlSW5mbyAqVEluZm8gPSBnZXRUeXBlU291cmNlSW5mbygpKSB7Ci0gICAgaWYgKHR5cGVJc1Bvc3RmaXgoVEluZm8tPmdldFR5cGUoKSkpCisgICAgLy8gSWYgdGhlIGRlY2xhcmF0aW9uIGhhcyBubyBuYW1lIG9yIHRoZSB0eXBlIGV4dGVuZHMgcGFzdCB0aGUgbmFtZSB0YWtlIHRoZQorICAgIC8vIGVuZCBsb2NhdGlvbiBvZiB0aGUgdHlwZS4KKyAgICBpZiAoIWdldERlY2xOYW1lKCkgfHwgdHlwZUlzUG9zdGZpeChUSW5mby0+Z2V0VHlwZSgpKSkKICAgICAgIFJhbmdlRW5kID0gVEluZm8tPmdldFR5cGVMb2MoKS5nZXRTb3VyY2VSYW5nZSgpLmdldEVuZCgpOwogICB9CiAgIHJldHVybiBTb3VyY2VSYW5nZShnZXRPdXRlckxvY1N0YXJ0KCksIFJhbmdlRW5kKTsKQEAgLTE2MjQsOCArMTYyMCwxMCBAQAogICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywgSWRlbnRpZmllckluZm8gKklkLCBRdWFsVHlwZSBULAogICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVEluZm8sIFN0b3JhZ2VDbGFzcyBTQykKICAgICA6IERlY2xhcmF0b3JEZWNsKERLLCBEQywgSWRMb2MsIElkLCBULCBUSW5mbywgU3RhcnRMb2MpLCBJbml0KCkgewotICBhc3NlcnQoc2l6ZW9mKFZhckRlY2xCaXRmaWVsZHMpIDw9IHNpemVvZih1bnNpZ25lZCkpOwotICBhc3NlcnQoc2l6ZW9mKFBhcm1WYXJEZWNsQml0ZmllbGRzKSA8PSBzaXplb2YodW5zaWduZWQpKTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoVmFyRGVjbEJpdGZpZWxkcykgPD0gc2l6ZW9mKHVuc2lnbmVkKSwKKyAgICAgICAgICAgICAgICAiVmFyRGVjbEJpdGZpZWxkcyB0b28gbGFyZ2UhIik7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFBhcm1WYXJEZWNsQml0ZmllbGRzKSA8PSBzaXplb2YodW5zaWduZWQpLAorICAgICAgICAgICAgICAgICJQYXJtVmFyRGVjbEJpdGZpZWxkcyB0b28gbGFyZ2UhIik7CiAgIEFsbEJpdHMgPSAwOwogICBWYXJEZWNsQml0cy5TQ2xhc3MgPSBTQzsKICAgLy8gRXZlcnl0aGluZyBlbHNlIGlzIGltcGxpY2l0bHkgaW5pdGlhbGl6ZWQgdG8gZmFsc2UuCkBAIC0xNjM1LDEzICsxNjMzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMLCBTb3VyY2VMb2NhdGlvbiBJZEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLCBRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyAqVEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUNsYXNzIFMpIHsKLSAgcmV0dXJuIG5ldyAoQykgVmFyRGVjbChWYXIsIERDLCBTdGFydEwsIElkTCwgSWQsIFQsIFRJbmZvLCBTKTsKKyAgcmV0dXJuIG5ldyAoQywgREMpIFZhckRlY2woVmFyLCBEQywgU3RhcnRMLCBJZEwsIElkLCBULCBUSW5mbywgUyk7CiB9CiAKIFZhckRlY2wgKlZhckRlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihWYXJEZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgVmFyRGVjbChWYXIsIDAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIDAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUoKSwgMCwgU0NfTm9uZSk7CisgIHJldHVybiBuZXcgKEMsIElEKSBWYXJEZWNsKFZhciwgMCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUoKSwgMCwgU0NfTm9uZSk7CiB9CiAKIHZvaWQgVmFyRGVjbDo6c2V0U3RvcmFnZUNsYXNzKFN0b3JhZ2VDbGFzcyBTQykgewpAQCAtMTc3NSw3ICsxNzcyLDcgQEAKICAgLy8gICBBIGRlY2xhcmF0aW9uIGRpcmVjdGx5IGNvbnRhaW5lZCBpbiBhIGxpbmthZ2Utc3BlY2lmaWNhdGlvbiBpcyB0cmVhdGVkCiAgIC8vICAgYXMgaWYgaXQgY29udGFpbnMgdGhlIGV4dGVybiBzcGVjaWZpZXIgZm9yIHRoZSBwdXJwb3NlIG9mIGRldGVybWluaW5nCiAgIC8vICAgdGhlIGxpbmthZ2Ugb2YgdGhlIGRlY2xhcmVkIG5hbWUgYW5kIHdoZXRoZXIgaXQgaXMgYSBkZWZpbml0aW9uLgotICBpZiAoaXNTaW5nbGVMaW5lRXh0ZXJuQygqdGhpcykpCisgIGlmIChpc1NpbmdsZUxpbmVMYW5ndWFnZUxpbmthZ2UoKnRoaXMpKQogICAgIHJldHVybiBEZWNsYXJhdGlvbk9ubHk7CiAKICAgLy8gQzk5IDYuOS4ycDI6CkBAIC0xNzk4LDIzICsxNzk1LDIxIEBACiAKICAgVmFyRGVjbCAqTGFzdFRlbnRhdGl2ZSA9IDA7CiAgIFZhckRlY2wgKkZpcnN0ID0gZ2V0Rmlyc3REZWNsKCk7Ci0gIGZvciAocmVkZWNsX2l0ZXJhdG9yIEkgPSBGaXJzdC0+cmVkZWNsc19iZWdpbigpLCBFID0gRmlyc3QtPnJlZGVjbHNfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBLaW5kID0gKCpJKS0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpOworICBmb3IgKGF1dG8gSSA6IEZpcnN0LT5yZWRlY2xzKCkpIHsKKyAgICBLaW5kID0gSS0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpOwogICAgIGlmIChLaW5kID09IERlZmluaXRpb24pCiAgICAgICByZXR1cm4gMDsKICAgICBlbHNlIGlmIChLaW5kID09IFRlbnRhdGl2ZURlZmluaXRpb24pCi0gICAgICBMYXN0VGVudGF0aXZlID0gKkk7CisgICAgICBMYXN0VGVudGF0aXZlID0gSTsKICAgfQogICByZXR1cm4gTGFzdFRlbnRhdGl2ZTsKIH0KIAogVmFyRGVjbCAqVmFyRGVjbDo6Z2V0RGVmaW5pdGlvbihBU1RDb250ZXh0ICZDKSB7CiAgIFZhckRlY2wgKkZpcnN0ID0gZ2V0Rmlyc3REZWNsKCk7Ci0gIGZvciAocmVkZWNsX2l0ZXJhdG9yIEkgPSBGaXJzdC0+cmVkZWNsc19iZWdpbigpLCBFID0gRmlyc3QtPnJlZGVjbHNfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoKCpJKS0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbihDKSA9PSBEZWZpbml0aW9uKQotICAgICAgcmV0dXJuICpJOworICBmb3IgKGF1dG8gSSA6IEZpcnN0LT5yZWRlY2xzKCkpIHsKKyAgICBpZiAoSS0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbihDKSA9PSBEZWZpbml0aW9uKQorICAgICAgcmV0dXJuIEk7CiAgIH0KICAgcmV0dXJuIDA7CiB9CkBAIC0xODIzLDkgKzE4MTgsOCBAQAogICBEZWZpbml0aW9uS2luZCBLaW5kID0gRGVjbGFyYXRpb25Pbmx5OwogICAKICAgY29uc3QgVmFyRGVjbCAqRmlyc3QgPSBnZXRGaXJzdERlY2woKTsKLSAgZm9yIChyZWRlY2xfaXRlcmF0b3IgSSA9IEZpcnN0LT5yZWRlY2xzX2JlZ2luKCksIEUgPSBGaXJzdC0+cmVkZWNsc19lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIEtpbmQgPSBzdGQ6Om1heChLaW5kLCAoKkkpLT5pc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKEMpKTsKKyAgZm9yIChhdXRvIEkgOiBGaXJzdC0+cmVkZWNscygpKSB7CisgICAgS2luZCA9IHN0ZDo6bWF4KEtpbmQsIEktPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oQykpOwogICAgIGlmIChLaW5kID09IERlZmluaXRpb24pCiAgICAgICBicmVhazsKICAgfQpAQCAtMTgzNCwxMyArMTgyOCwxMSBAQAogfQogCiBjb25zdCBFeHByICpWYXJEZWNsOjpnZXRBbnlJbml0aWFsaXplcihjb25zdCBWYXJEZWNsIComRCkgY29uc3QgewotICByZWRlY2xfaXRlcmF0b3IgSSA9IHJlZGVjbHNfYmVnaW4oKSwgRSA9IHJlZGVjbHNfZW5kKCk7Ci0gIHdoaWxlIChJICE9IEUgJiYgIUktPmdldEluaXQoKSkKLSAgICArK0k7Ci0KLSAgaWYgKEkgIT0gRSkgewotICAgIEQgPSAqSTsKLSAgICByZXR1cm4gSS0+Z2V0SW5pdCgpOworICBmb3IgKGF1dG8gSSA6IHJlZGVjbHMoKSkgeworICAgIGlmIChhdXRvIEV4cHIgPSBJLT5nZXRJbml0KCkpIHsKKyAgICAgIEQgPSBJOworICAgICAgcmV0dXJuIEV4cHI7CisgICAgfQogICB9CiAgIHJldHVybiAwOwogfQpAQCAtMTg2NSwxMCArMTg1Nyw5IEBACiAgIGlmICghaXNTdGF0aWNEYXRhTWVtYmVyKCkpCiAgICAgcmV0dXJuIDA7CiAgIAotICBmb3IgKFZhckRlY2w6OnJlZGVjbF9pdGVyYXRvciBSRCA9IHJlZGVjbHNfYmVnaW4oKSwgUkRFbmQgPSByZWRlY2xzX2VuZCgpOwotICAgICAgIFJEICE9IFJERW5kOyArK1JEKSB7CisgIGZvciAoYXV0byBSRCA6IHJlZGVjbHMoKSkgewogICAgIGlmIChSRC0+Z2V0TGV4aWNhbERlY2xDb250ZXh0KCktPmlzRmlsZUNvbnRleHQoKSkKLSAgICAgIHJldHVybiAqUkQ7CisgICAgICByZXR1cm4gUkQ7CiAgIH0KICAgCiAgIHJldHVybiAwOwpAQCAtMjEwOCw4ICsyMDk5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBUeXBlU291cmNlSW5mbyAqVEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlQ2xhc3MgUywgRXhwciAqRGVmQXJnKSB7Ci0gIHJldHVybiBuZXcgKEMpIFBhcm1WYXJEZWNsKFBhcm1WYXIsIERDLCBTdGFydExvYywgSWRMb2MsIElkLCBULCBUSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUywgRGVmQXJnKTsKKyAgcmV0dXJuIG5ldyAoQywgREMpIFBhcm1WYXJEZWNsKFBhcm1WYXIsIERDLCBTdGFydExvYywgSWRMb2MsIElkLCBULCBUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMsIERlZkFyZyk7CiB9CiAKIFF1YWxUeXBlIFBhcm1WYXJEZWNsOjpnZXRPcmlnaW5hbFR5cGUoKSBjb25zdCB7CkBAIC0yMTIxLDkgKzIxMTIsOCBAQAogfQogCiBQYXJtVmFyRGVjbCAqUGFybVZhckRlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihQYXJtVmFyRGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIFBhcm1WYXJEZWNsKFBhcm1WYXIsIDAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUXVhbFR5cGUoKSwgMCwgU0NfTm9uZSwgMCk7CisgIHJldHVybiBuZXcgKEMsIElEKSBQYXJtVmFyRGVjbChQYXJtVmFyLCAwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUXVhbFR5cGUoKSwgMCwgU0NfTm9uZSwgMCk7CiB9CiAKIFNvdXJjZVJhbmdlIFBhcm1WYXJEZWNsOjpnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IHsKQEAgLTIxOTYsOSArMjE4Niw5IEBACiB9CiAKIGJvb2wgRnVuY3Rpb25EZWNsOjpoYXNCb2R5KGNvbnN0IEZ1bmN0aW9uRGVjbCAqJkRlZmluaXRpb24pIGNvbnN0IHsKLSAgZm9yIChyZWRlY2xfaXRlcmF0b3IgSSA9IHJlZGVjbHNfYmVnaW4oKSwgRSA9IHJlZGVjbHNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgIGZvciAoYXV0byBJIDogcmVkZWNscygpKSB7CiAgICAgaWYgKEktPkJvZHkgfHwgSS0+SXNMYXRlVGVtcGxhdGVQYXJzZWQpIHsKLSAgICAgIERlZmluaXRpb24gPSAqSTsKKyAgICAgIERlZmluaXRpb24gPSBJOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICB9CkBAIC0yMjIxLDEwICsyMjExLDEwIEBACiB9CiAKIGJvb2wgRnVuY3Rpb25EZWNsOjppc0RlZmluZWQoY29uc3QgRnVuY3Rpb25EZWNsIComRGVmaW5pdGlvbikgY29uc3QgewotICBmb3IgKHJlZGVjbF9pdGVyYXRvciBJID0gcmVkZWNsc19iZWdpbigpLCBFID0gcmVkZWNsc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgZm9yIChhdXRvIEkgOiByZWRlY2xzKCkpIHsKICAgICBpZiAoSS0+SXNEZWxldGVkIHx8IEktPklzRGVmYXVsdGVkIHx8IEktPkJvZHkgfHwgSS0+SXNMYXRlVGVtcGxhdGVQYXJzZWQgfHwKICAgICAgICAgSS0+aGFzQXR0cjxBbGlhc0F0dHI+KCkpIHsKLSAgICAgIERlZmluaXRpb24gPSBJLT5Jc0RlbGV0ZWQgPyBJLT5nZXRDYW5vbmljYWxEZWNsKCkgOiAqSTsKKyAgICAgIERlZmluaXRpb24gPSBJLT5Jc0RlbGV0ZWQgPyBJLT5nZXRDYW5vbmljYWxEZWNsKCkgOiBJOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICB9CkBAIC0yMzAzLDExICsyMjkzLDEyIEBACiAgICAgICAgICBnZXREZWNsTmFtZSgpLmdldENYWE92ZXJsb2FkZWRPcGVyYXRvcigpID09IE9PX0FycmF5X05ldyB8fAogICAgICAgICAgZ2V0RGVjbE5hbWUoKS5nZXRDWFhPdmVybG9hZGVkT3BlcmF0b3IoKSA9PSBPT19BcnJheV9EZWxldGUpOwogCi0gIGlmIChpc2E8Q1hYUmVjb3JkRGVjbD4oZ2V0RGVjbENvbnRleHQoKSkpIHJldHVybiBmYWxzZTsKLSAgYXNzZXJ0KGdldERlY2xDb250ZXh0KCktPmdldFJlZGVjbENvbnRleHQoKS0+aXNUcmFuc2xhdGlvblVuaXQoKSk7CisgIGlmICghZ2V0RGVjbENvbnRleHQoKS0+Z2V0UmVkZWNsQ29udGV4dCgpLT5pc1RyYW5zbGF0aW9uVW5pdCgpKQorICAgIHJldHVybiBmYWxzZTsKIAogICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqcHJvdG8gPSBnZXRUeXBlKCktPmNhc3RBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKLSAgaWYgKHByb3RvLT5nZXROdW1BcmdzKCkgIT0gMiB8fCBwcm90by0+aXNWYXJpYWRpYygpKSByZXR1cm4gZmFsc2U7CisgIGlmIChwcm90by0+Z2V0TnVtUGFyYW1zKCkgIT0gMiB8fCBwcm90by0+aXNWYXJpYWRpYygpKQorICAgIHJldHVybiBmYWxzZTsKIAogICBBU1RDb250ZXh0ICZDb250ZXh0ID0KICAgICBjYXN0PFRyYW5zbGF0aW9uVW5pdERlY2w+KGdldERlY2xDb250ZXh0KCktPmdldFJlZGVjbENvbnRleHQoKSkKQEAgLTIzMTUsNyArMjMwNiw3IEBACiAKICAgLy8gVGhlIHJlc3VsdCB0eXBlIGFuZCBmaXJzdCBhcmd1bWVudCB0eXBlIGFyZSBjb25zdGFudCBhY3Jvc3MgYWxsCiAgIC8vIHRoZXNlIG9wZXJhdG9ycy4gIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBleGFjdGx5IHZvaWQqLgotICByZXR1cm4gKHByb3RvLT5nZXRBcmdUeXBlKDEpLmdldENhbm9uaWNhbFR5cGUoKSA9PSBDb250ZXh0LlZvaWRQdHJUeSk7CisgIHJldHVybiAocHJvdG8tPmdldFBhcmFtVHlwZSgxKS5nZXRDYW5vbmljYWxUeXBlKCkgPT0gQ29udGV4dC5Wb2lkUHRyVHkpOwogfQogCiBzdGF0aWMgYm9vbCBpc05hbWVzcGFjZVN0ZChjb25zdCBEZWNsQ29udGV4dCAqREMpIHsKQEAgLTIzMzUsMjAgKzIzMjYsMjMgQEAKIAogICBpZiAoaXNhPENYWFJlY29yZERlY2w+KGdldERlY2xDb250ZXh0KCkpKQogICAgIHJldHVybiBmYWxzZTsKLSAgYXNzZXJ0KGdldERlY2xDb250ZXh0KCktPmdldFJlZGVjbENvbnRleHQoKS0+aXNUcmFuc2xhdGlvblVuaXQoKSk7CisKKyAgLy8gVGhpcyBjYW4gb25seSBmYWlsIGZvciBhbiBpbnZhbGlkICdvcGVyYXRvciBuZXcnIGRlY2xhcmF0aW9uLgorICBpZiAoIWdldERlY2xDb250ZXh0KCktPmdldFJlZGVjbENvbnRleHQoKS0+aXNUcmFuc2xhdGlvblVuaXQoKSkKKyAgICByZXR1cm4gZmFsc2U7CiAKICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9IGdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwotICBpZiAoRlBULT5nZXROdW1BcmdzKCkgPiAyIHx8IEZQVC0+aXNWYXJpYWRpYygpKQorICBpZiAoRlBULT5nZXROdW1QYXJhbXMoKSA+IDIgfHwgRlBULT5pc1ZhcmlhZGljKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIC8vIElmIHRoaXMgaXMgYSBzaW5nbGUtcGFyYW1ldGVyIGZ1bmN0aW9uLCBpdCBtdXN0IGJlIGEgcmVwbGFjZWFibGUgZ2xvYmFsCiAgIC8vIGFsbG9jYXRpb24gb3IgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uLgotICBpZiAoRlBULT5nZXROdW1BcmdzKCkgPT0gMSkKKyAgaWYgKEZQVC0+Z2V0TnVtUGFyYW1zKCkgPT0gMSkKICAgICByZXR1cm4gdHJ1ZTsKIAogICAvLyBPdGhlcndpc2UsIHdlJ3JlIGxvb2tpbmcgZm9yIGEgc2Vjb25kIHBhcmFtZXRlciB3aG9zZSB0eXBlIGlzCiAgIC8vICdjb25zdCBzdGQ6Om5vdGhyb3dfdCAmJywgb3IsIGluIEMrKzF5LCAnc3RkOjpzaXplX3QnLgotICBRdWFsVHlwZSBUeSA9IEZQVC0+Z2V0QXJnVHlwZSgxKTsKKyAgUXVhbFR5cGUgVHkgPSBGUFQtPmdldFBhcmFtVHlwZSgxKTsKICAgQVNUQ29udGV4dCAmQ3R4ID0gZ2V0QVNUQ29udGV4dCgpOwogICBpZiAoQ3R4LmdldExhbmdPcHRzKCkuU2l6ZWREZWFsbG9jYXRpb24gJiYKICAgICAgIEN0eC5oYXNTYW1lVHlwZShUeSwgQ3R4LmdldFNpemVUeXBlKCkpKQpAQCAtMjM3NiwxMCArMjM3MCwxMiBAQAogICAgIHJldHVybiAwOwogICBpZiAoaXNhPENYWFJlY29yZERlY2w+KGdldERlY2xDb250ZXh0KCkpKQogICAgIHJldHVybiAwOwotICBhc3NlcnQoZ2V0RGVjbENvbnRleHQoKS0+Z2V0UmVkZWNsQ29udGV4dCgpLT5pc1RyYW5zbGF0aW9uVW5pdCgpKTsKKworICBpZiAoIWdldERlY2xDb250ZXh0KCktPmdldFJlZGVjbENvbnRleHQoKS0+aXNUcmFuc2xhdGlvblVuaXQoKSkKKyAgICByZXR1cm4gMDsKIAogICBpZiAoZ2V0TnVtUGFyYW1zKCkgIT0gMiB8fCBpc1ZhcmlhZGljKCkgfHwKLSAgICAgICFDdHguaGFzU2FtZVR5cGUoZ2V0VHlwZSgpLT5jYXN0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCktPmdldEFyZ1R5cGUoMSksCisgICAgICAhQ3R4Lmhhc1NhbWVUeXBlKGdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpLT5nZXRQYXJhbVR5cGUoMSksCiAgICAgICAgICAgICAgICAgICAgICAgIEN0eC5nZXRTaXplVHlwZSgpKSkKICAgICByZXR1cm4gMDsKIApAQCAtMjQ4OCw3ICsyNDg0LDcgQEAKIAogICAvLyBJZiB0aGUgZnVuY3Rpb24gaXMgbWFya2VkICJvdmVybG9hZGFibGUiLCBpdCBoYXMgYSBkaWZmZXJlbnQgbWFuZ2xlZCBuYW1lCiAgIC8vIGFuZCBpcyBub3QgdGhlIEMgbGlicmFyeSBmdW5jdGlvbi4KLSAgaWYgKGdldEF0dHI8T3ZlcmxvYWRhYmxlQXR0cj4oKSkKKyAgaWYgKGhhc0F0dHI8T3ZlcmxvYWRhYmxlQXR0cj4oKSkKICAgICByZXR1cm4gMDsKIAogICBpZiAoIUNvbnRleHQuQnVpbHRpbkluZm8uaXNQcmVkZWZpbmVkTGliRnVuY3Rpb24oQnVpbHRpbklEKSkKQEAgLTI1MTAsMTEgKzI1MDYsOCBAQAogLy8vIGJhc2VkIG9uIGl0cyBGdW5jdGlvblR5cGUuICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgdGhlIFBhcmFtSW5mbyBhcnJheQogLy8vIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQuCiB1bnNpZ25lZCBGdW5jdGlvbkRlY2w6OmdldE51bVBhcmFtcygpIGNvbnN0IHsKLSAgY29uc3QgRnVuY3Rpb25UeXBlICpGVCA9IGdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uVHlwZT4oKTsKLSAgaWYgKGlzYTxGdW5jdGlvbk5vUHJvdG9UeXBlPihGVCkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGVCktPmdldE51bUFyZ3MoKTsKLQorICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0gZ2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKKyAgcmV0dXJuIEZQVCA/IEZQVC0+Z2V0TnVtUGFyYW1zKCkgOiAwOwogfQogCiB2b2lkIEZ1bmN0aW9uRGVjbDo6c2V0UGFyYW1zKEFTVENvbnRleHQgJkMsCkBAIC0yNTQyLDM4ICsyNTM1LDQ5IEBACiAvLy8gZ2V0TWluUmVxdWlyZWRBcmd1bWVudHMgLSBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBhcmd1bWVudHMKIC8vLyBuZWVkZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLiBUaGlzIG1heSBiZSBmZXdlciB0aGFuIHRoZSBudW1iZXIgb2YKIC8vLyBmdW5jdGlvbiBwYXJhbWV0ZXJzLCBpZiBzb21lIG9mIHRoZSBwYXJhbWV0ZXJzIGhhdmUgZGVmYXVsdAotLy8vIGFyZ3VtZW50cyAoaW4gQysrKSBvciB0aGUgbGFzdCBwYXJhbWV0ZXIgaXMgYSBwYXJhbWV0ZXIgcGFjay4KKy8vLyBhcmd1bWVudHMgKGluIEMrKykgb3IgYXJlIHBhcmFtZXRlciBwYWNrcyAoQysrMTEpLgogdW5zaWduZWQgRnVuY3Rpb25EZWNsOjpnZXRNaW5SZXF1aXJlZEFyZ3VtZW50cygpIGNvbnN0IHsKICAgaWYgKCFnZXRBU1RDb250ZXh0KCkuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMpCiAgICAgcmV0dXJuIGdldE51bVBhcmFtcygpOwotICAKLSAgdW5zaWduZWQgTnVtUmVxdWlyZWRBcmdzID0gZ2V0TnVtUGFyYW1zKCk7ICAKLSAgCi0gIC8vIElmIHRoZSBsYXN0IHBhcmFtZXRlciBpcyBhIHBhcmFtZXRlciBwYWNrLCB3ZSBkb24ndCBuZWVkIGFuIGFyZ3VtZW50IGZvciAKLSAgLy8gaXQuCi0gIGlmIChOdW1SZXF1aXJlZEFyZ3MgPiAwICYmCi0gICAgICBnZXRQYXJhbURlY2woTnVtUmVxdWlyZWRBcmdzIC0gMSktPmlzUGFyYW1ldGVyUGFjaygpKQotICAgIC0tTnVtUmVxdWlyZWRBcmdzOwotICAgICAgCi0gIC8vIElmIHRoaXMgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgYXJndW1lbnQsIHdlIGRvbid0IG5lZWQgYW4gYXJndW1lbnQgZm9yCi0gIC8vIGl0LgotICB3aGlsZSAoTnVtUmVxdWlyZWRBcmdzID4gMCAmJgotICAgICAgICAgZ2V0UGFyYW1EZWNsKE51bVJlcXVpcmVkQXJncy0xKS0+aGFzRGVmYXVsdEFyZygpKQotICAgIC0tTnVtUmVxdWlyZWRBcmdzOwogCi0gIC8vIFdlIG1pZ2h0IGhhdmUgcGFyYW1ldGVyIHBhY2tzIGJlZm9yZSB0aGUgZW5kLiBUaGVzZSBjYW4ndCBiZSBkZWR1Y2VkLAotICAvLyBidXQgdGhleSBjYW4gc3RpbGwgaGFuZGxlIG11bHRpcGxlIGFyZ3VtZW50cy4KLSAgdW5zaWduZWQgQXJnSWR4ID0gTnVtUmVxdWlyZWRBcmdzOwotICB3aGlsZSAoQXJnSWR4ID4gMCkgewotICAgIGlmIChnZXRQYXJhbURlY2woQXJnSWR4IC0gMSktPmlzUGFyYW1ldGVyUGFjaygpKQotICAgICAgTnVtUmVxdWlyZWRBcmdzID0gQXJnSWR4OwotICAgIAotICAgIC0tQXJnSWR4OwotICB9Ci0gIAorICB1bnNpZ25lZCBOdW1SZXF1aXJlZEFyZ3MgPSAwOworICBmb3IgKGF1dG8gKlBhcmFtIDogcGFyYW1zKCkpCisgICAgaWYgKCFQYXJhbS0+aXNQYXJhbWV0ZXJQYWNrKCkgJiYgIVBhcmFtLT5oYXNEZWZhdWx0QXJnKCkpCisgICAgICArK051bVJlcXVpcmVkQXJnczsKICAgcmV0dXJuIE51bVJlcXVpcmVkQXJnczsKIH0KIAorLy8vIFxicmllZiBUaGUgY29tYmluYXRpb24gb2YgdGhlIGV4dGVybiBhbmQgaW5saW5lIGtleXdvcmRzIHVuZGVyIE1TVkMgZm9yY2VzCisvLy8gdGhlIGZ1bmN0aW9uIHRvIGJlIHJlcXVpcmVkLgorLy8vCisvLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgd2Ugd2lsbCBvbmx5IGdldCBjYWxsZWQgd2hlbiBpc0lubGluZWQoKQorLy8vIHdvdWxkIHJldHVybiB0cnVlIGZvciB0aGlzIEZ1bmN0aW9uRGVjbC4KK2Jvb2wgRnVuY3Rpb25EZWNsOjppc01TRXh0ZXJuSW5saW5lKCkgY29uc3QgeworICBhc3NlcnQoaXNJbmxpbmVkKCkgJiYgImV4cGVjdGVkIHRvIGdldCBjYWxsZWQgb24gYW4gaW5saW5lZCBmdW5jdGlvbiEiKTsKKworICBjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0ID0gZ2V0QVNUQ29udGV4dCgpOworICBpZiAoIUNvbnRleHQuZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0KQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSB0aGlzOyBGRDsgRkQgPSBGRC0+Z2V0UHJldmlvdXNEZWNsKCkpCisgICAgaWYgKEZELT5nZXRTdG9yYWdlQ2xhc3MoKSA9PSBTQ19FeHRlcm4pCisgICAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHJlZGVjbEZvcmNlc0RlZk1TVkMoY29uc3QgRnVuY3Rpb25EZWNsICpSZWRlY2wpIHsKKyAgaWYgKFJlZGVjbC0+Z2V0U3RvcmFnZUNsYXNzKCkgIT0gU0NfRXh0ZXJuKQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBSZWRlY2wtPmdldFByZXZpb3VzRGVjbCgpOyBGRDsKKyAgICAgICBGRCA9IEZELT5nZXRQcmV2aW91c0RlY2woKSkKKyAgICBpZiAoRkQtPmdldFN0b3JhZ2VDbGFzcygpID09IFNDX0V4dGVybikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwogc3RhdGljIGJvb2wgUmVkZWNsRm9yY2VzRGVmQzk5KGNvbnN0IEZ1bmN0aW9uRGVjbCAqUmVkZWNsKSB7CiAgIC8vIE9ubHkgY29uc2lkZXIgZmlsZS1zY29wZSBkZWNsYXJhdGlvbnMgaW4gdGhpcyB0ZXN0LgogICBpZiAoIVJlZGVjbC0+Z2V0TGV4aWNhbERlY2xDb250ZXh0KCktPmlzVHJhbnNsYXRpb25Vbml0KCkpCkBAIC0yNTkzLDcgKzI1OTcsNyBAQAogLy8vIFxicmllZiBGb3IgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbiBDIG9yIEMrKywgZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcwogLy8vIGRlY2xhcmF0aW9uIGNhdXNlcyB0aGUgZGVmaW5pdGlvbiB0byBiZSBleHRlcm5hbGx5IHZpc2libGUuCiAvLy8KLS8vLyBTcGVjaWZpY2FsbHksIHRoaXMgZGV0ZXJtaW5lcyBpZiBhZGRpbmcgdGhlIGN1cnJlbnQgZGVjbGFyYXRpb24gdG8gdGhlIHNldAorLy8vIEZvciBpbnN0YW5jZSwgdGhpcyBkZXRlcm1pbmVzIGlmIGFkZGluZyB0aGUgY3VycmVudCBkZWNsYXJhdGlvbiB0byB0aGUgc2V0CiAvLy8gb2YgcmVkZWNsYXJhdGlvbnMgb2YgdGhlIGdpdmVuIGZ1bmN0aW9ucyBjYXVzZXMKIC8vLyBpc0lubGluZURlZmluaXRpb25FeHRlcm5hbGx5VmlzaWJsZSB0byBjaGFuZ2UgZnJvbSBmYWxzZSB0byB0cnVlLgogYm9vbCBGdW5jdGlvbkRlY2w6OmRvZXNEZWNsYXJhdGlvbkZvcmNlRXh0ZXJuYWxseVZpc2libGVEZWZpbml0aW9uKCkgY29uc3QgewpAQCAtMjYwMiw2ICsyNjA2LDEzIEBACiAKICAgQVNUQ29udGV4dCAmQ29udGV4dCA9IGdldEFTVENvbnRleHQoKTsKIAorICBpZiAoQ29udGV4dC5nZXRMYW5nT3B0cygpLk1TVkNDb21wYXQpIHsKKyAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkRlZmluaXRpb247CisgICAgaWYgKGhhc0JvZHkoRGVmaW5pdGlvbikgJiYgRGVmaW5pdGlvbi0+aXNJbmxpbmVkKCkgJiYKKyAgICAgICAgcmVkZWNsRm9yY2VzRGVmTVNWQyh0aGlzKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisKICAgaWYgKENvbnRleHQuZ2V0TGFuZ09wdHMoKS5HTlVJbmxpbmUgfHwgaGFzQXR0cjxHTlVJbmxpbmVBdHRyPigpKSB7CiAgICAgLy8gV2l0aCBHTlUgaW5saW5pbmcsIGEgZGVjbGFyYXRpb24gd2l0aCAnaW5saW5lJyBidXQgbm90ICdleHRlcm4nLCBmb3JjZXMKICAgICAvLyBhbiBleHRlcm5hbGx5IHZpc2libGUgZGVmaW5pdGlvbi4KQEAgLTI2ODMsOSArMjY5NCw3IEBACiAgICAgCiAgICAgLy8gSWYgYW55IGRlY2xhcmF0aW9uIGlzICdpbmxpbmUnIGJ1dCBub3QgJ2V4dGVybicsIHRoZW4gdGhpcyBkZWZpbml0aW9uCiAgICAgLy8gaXMgZXh0ZXJuYWxseSB2aXNpYmxlLgotICAgIGZvciAocmVkZWNsX2l0ZXJhdG9yIFJlZGVjbCA9IHJlZGVjbHNfYmVnaW4oKSwgUmVkZWNsRW5kID0gcmVkZWNsc19lbmQoKTsKLSAgICAgICAgIFJlZGVjbCAhPSBSZWRlY2xFbmQ7Ci0gICAgICAgICArK1JlZGVjbCkgeworICAgIGZvciAoYXV0byBSZWRlY2wgOiByZWRlY2xzKCkpIHsKICAgICAgIGlmIChSZWRlY2wtPmlzSW5saW5lU3BlY2lmaWVkKCkgJiYgCiAgICAgICAgICAgUmVkZWNsLT5nZXRTdG9yYWdlQ2xhc3MoKSAhPSBTQ19FeHRlcm4pCiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMjcwMiwxMCArMjcxMSw4IEBACiAgIC8vICAgWy4uLl0gSWYgYWxsIG9mIHRoZSBmaWxlIHNjb3BlIGRlY2xhcmF0aW9ucyBmb3IgYSBmdW5jdGlvbiBpbiBhIAogICAvLyAgIHRyYW5zbGF0aW9uIHVuaXQgaW5jbHVkZSB0aGUgaW5saW5lIGZ1bmN0aW9uIHNwZWNpZmllciB3aXRob3V0IGV4dGVybiwgCiAgIC8vICAgdGhlbiB0aGUgZGVmaW5pdGlvbiBpbiB0aGF0IHRyYW5zbGF0aW9uIHVuaXQgaXMgYW4gaW5saW5lIGRlZmluaXRpb24uCi0gIGZvciAocmVkZWNsX2l0ZXJhdG9yIFJlZGVjbCA9IHJlZGVjbHNfYmVnaW4oKSwgUmVkZWNsRW5kID0gcmVkZWNsc19lbmQoKTsKLSAgICAgICBSZWRlY2wgIT0gUmVkZWNsRW5kOwotICAgICAgICsrUmVkZWNsKSB7Ci0gICAgaWYgKFJlZGVjbEZvcmNlc0RlZkM5OSgqUmVkZWNsKSkKKyAgZm9yIChhdXRvIFJlZGVjbCA6IHJlZGVjbHMoKSkgeworICAgIGlmIChSZWRlY2xGb3JjZXNEZWZDOTkoUmVkZWNsKSkKICAgICAgIHJldHVybiB0cnVlOwogICB9CiAgIApAQCAtMjgyNCwxNCArMjgzMSwzNCBAQAogICAvLyBIYW5kbGUgY2xhc3Mgc2NvcGUgZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gc3BlY2lhbCBjYXNlLgogICBpZiAoZ2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSA9PSBUU0tfRXhwbGljaXRTcGVjaWFsaXphdGlvbikKICAgICByZXR1cm4gZ2V0Q2xhc3NTY29wZVNwZWNpYWxpemF0aW9uUGF0dGVybigpOworICAKKyAgLy8gSWYgdGhpcyBpcyBhIGdlbmVyaWMgbGFtYmRhIGNhbGwgb3BlcmF0b3Igc3BlY2lhbGl6YXRpb24sIGl0cyAKKyAgLy8gaW5zdGFudGlhdGlvbiBwYXR0ZXJuIGlzIGFsd2F5cyBpdHMgcHJpbWFyeSB0ZW1wbGF0ZSdzIHBhdHRlcm4KKyAgLy8gZXZlbiBpZiBpdHMgcHJpbWFyeSB0ZW1wbGF0ZSB3YXMgaW5zdGFudGlhdGVkIGZyb20gYW5vdGhlciAKKyAgLy8gbWVtYmVyIHRlbXBsYXRlICh3aGljaCBoYXBwZW5zIHdpdGggbmVzdGVkIGdlbmVyaWMgbGFtYmRhcykuCisgIC8vIFNpbmNlIGEgbGFtYmRhJ3MgY2FsbCBvcGVyYXRvcidzIGJvZHkgaXMgdHJhbnNmb3JtZWQgZWFnZXJseSwgCisgIC8vIHdlIGRvbid0IGhhdmUgdG8gZ28gaHVudGluZyBmb3IgYSBwcm90b3R5cGUgZGVmaW5pdGlvbiB0ZW1wbGF0ZSAKKyAgLy8gKGkuZS4gaW5zdGFudGlhdGVkLWZyb20tbWVtYmVyLXRlbXBsYXRlKSB0byB1c2UgYXMgYW4gaW5zdGFudGlhdGlvbiAKKyAgLy8gcGF0dGVybi4KIAorICBpZiAoaXNHZW5lcmljTGFtYmRhQ2FsbE9wZXJhdG9yU3BlY2lhbGl6YXRpb24oCisgICAgICAgICAgZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4odGhpcykpKSB7CisgICAgYXNzZXJ0KGdldFByaW1hcnlUZW1wbGF0ZSgpICYmICJBIGdlbmVyaWMgbGFtYmRhIHNwZWNpYWxpemF0aW9uIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVkIGZyb20gYSBwcmltYXJ5IGNhbGwgb3BlcmF0b3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGUiKTsKKyAgICBhc3NlcnQoZ2V0UHJpbWFyeVRlbXBsYXRlKCktPmdldFRlbXBsYXRlZERlY2woKS0+Z2V0Qm9keSgpICYmCisgICAgICAgICAgICJBIGdlbmVyaWMgbGFtYmRhIGNhbGwgb3BlcmF0b3IgdGVtcGxhdGUgbXVzdCBhbHdheXMgaGF2ZSBhIGJvZHkgLSAiCisgICAgICAgICAgICJldmVuIGlmIGluc3RhbnRpYXRlZCBmcm9tIGEgcHJvdG90eXBlIChpLmUuIGFzIHdyaXR0ZW4pIG1lbWJlciAiCisgICAgICAgICAgICJ0ZW1wbGF0ZSIpOworICAgIHJldHVybiBnZXRQcmltYXJ5VGVtcGxhdGUoKS0+Z2V0VGVtcGxhdGVkRGVjbCgpOworICB9CisgIAogICBpZiAoRnVuY3Rpb25UZW1wbGF0ZURlY2wgKlByaW1hcnkgPSBnZXRQcmltYXJ5VGVtcGxhdGUoKSkgewogICAgIHdoaWxlIChQcmltYXJ5LT5nZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyVGVtcGxhdGUoKSkgewogICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgYSBwb2ludCB3aGVyZSB0aGUgdXNlciBwcm92aWRlZCBhIHNwZWNpYWxpemF0aW9uIG9mCiAgICAgICAvLyB0aGlzIHRlbXBsYXRlLCB3ZSdyZSBkb25lIGxvb2tpbmcuCiAgICAgICBpZiAoUHJpbWFyeS0+aXNNZW1iZXJTcGVjaWFsaXphdGlvbigpKQogICAgICAgICBicmVhazsKLSAgICAgIAogICAgICAgUHJpbWFyeSA9IFByaW1hcnktPmdldEluc3RhbnRpYXRlZEZyb21NZW1iZXJUZW1wbGF0ZSgpOwogICAgIH0KICAgICAKQEAgLTMxMDEsMTQgKzMxMjgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLCBRdWFsVHlwZSBULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVEluZm8sIEV4cHIgKkJXLCBib29sIE11dGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluQ2xhc3NJbml0U3R5bGUgSW5pdFN0eWxlKSB7Ci0gIHJldHVybiBuZXcgKEMpIEZpZWxkRGVjbChEZWNsOjpGaWVsZCwgREMsIFN0YXJ0TG9jLCBJZExvYywgSWQsIFQsIFRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQlcsIE11dGFibGUsIEluaXRTdHlsZSk7CisgIHJldHVybiBuZXcgKEMsIERDKSBGaWVsZERlY2woRGVjbDo6RmllbGQsIERDLCBTdGFydExvYywgSWRMb2MsIElkLCBULCBUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVywgTXV0YWJsZSwgSW5pdFN0eWxlKTsKIH0KIAogRmllbGREZWNsICpGaWVsZERlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihGaWVsZERlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBGaWVsZERlY2woRmllbGQsIDAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFF1YWxUeXBlKCksIDAsIDAsIGZhbHNlLCBJQ0lTX05vSW5pdCk7CisgIHJldHVybiBuZXcgKEMsIElEKSBGaWVsZERlY2woRmllbGQsIDAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUXVhbFR5cGUoKSwgMCwgMCwgZmFsc2UsIElDSVNfTm9Jbml0KTsKIH0KIAogYm9vbCBGaWVsZERlY2w6OmlzQW5vbnltb3VzU3RydWN0T3JVbmlvbigpIGNvbnN0IHsKQEAgLTMxOTEsOCArMzIxNyw4IEBACiAgIGlmIChDWFhSZWNvcmREZWNsICpEID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4odGhpcykpIHsKICAgICBzdHJ1Y3QgQ1hYUmVjb3JkRGVjbDo6RGVmaW5pdGlvbkRhdGEgKkRhdGEgPSAKICAgICAgIG5ldyAoZ2V0QVNUQ29udGV4dCgpKSBzdHJ1Y3QgQ1hYUmVjb3JkRGVjbDo6RGVmaW5pdGlvbkRhdGEoRCk7Ci0gICAgZm9yIChyZWRlY2xfaXRlcmF0b3IgSSA9IHJlZGVjbHNfYmVnaW4oKSwgRSA9IHJlZGVjbHNfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPigqSSktPkRlZmluaXRpb25EYXRhID0gRGF0YTsKKyAgICBmb3IgKGF1dG8gSSA6IHJlZGVjbHMoKSkKKyAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSSktPkRlZmluaXRpb25EYXRhID0gRGF0YTsKICAgfQogfQogCkBAIC0zMjI0LDEwICszMjUwLDkgQEAKICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKkNYWFJEID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4odGhpcykpCiAgICAgcmV0dXJuIENYWFJELT5nZXREZWZpbml0aW9uKCk7CiAKLSAgZm9yIChyZWRlY2xfaXRlcmF0b3IgUiA9IHJlZGVjbHNfYmVnaW4oKSwgUkVuZCA9IHJlZGVjbHNfZW5kKCk7Ci0gICAgICAgUiAhPSBSRW5kOyArK1IpCisgIGZvciAoYXV0byBSIDogcmVkZWNscygpKQogICAgIGlmIChSLT5pc0NvbXBsZXRlRGVmaW5pdGlvbigpKQotICAgICAgcmV0dXJuICpSOworICAgICAgcmV0dXJuIFI7CiAKICAgcmV0dXJuIDA7CiB9CkBAIC0zMjc1LDIxICszMzAwLDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVjbCAqUHJldkRlY2wsIGJvb2wgSXNTY29wZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU2NvcGVkVXNpbmdDbGFzc1RhZywgYm9vbCBJc0ZpeGVkKSB7Ci0gIEVudW1EZWNsICpFbnVtID0gbmV3IChDKSBFbnVtRGVjbChEQywgU3RhcnRMb2MsIElkTG9jLCBJZCwgUHJldkRlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc1Njb3BlZCwgSXNTY29wZWRVc2luZ0NsYXNzVGFnLCBJc0ZpeGVkKTsKKyAgRW51bURlY2wgKkVudW0gPSBuZXcgKEMsIERDKSBFbnVtRGVjbChEQywgU3RhcnRMb2MsIElkTG9jLCBJZCwgUHJldkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNTY29wZWQsIElzU2NvcGVkVXNpbmdDbGFzc1RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0ZpeGVkKTsKICAgRW51bS0+TWF5SGF2ZU91dE9mRGF0ZURlZiA9IEMuZ2V0TGFuZ09wdHMoKS5Nb2R1bGVzOwogICBDLmdldFR5cGVEZWNsVHlwZShFbnVtLCBQcmV2RGVjbCk7CiAgIHJldHVybiBFbnVtOwogfQogCiBFbnVtRGVjbCAqRW51bURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihFbnVtRGVjbCkpOwotICBFbnVtRGVjbCAqRW51bSA9IG5ldyAoTWVtKSBFbnVtRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgRW51bURlY2wgKkVudW0gPSBuZXcgKEMsIElEKSBFbnVtRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICBFbnVtLT5NYXlIYXZlT3V0T2ZEYXRlRGVmID0gQy5nZXRMYW5nT3B0cygpLk1vZHVsZXM7CiAgIHJldHVybiBFbnVtOwogfQogCitTb3VyY2VSYW5nZSBFbnVtRGVjbDo6Z2V0SW50ZWdlclR5cGVSYW5nZSgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IFR5cGVTb3VyY2VJbmZvICpUSSA9IGdldEludGVnZXJUeXBlU291cmNlSW5mbygpKQorICAgIHJldHVybiBUSS0+Z2V0VHlwZUxvYygpLmdldFNvdXJjZVJhbmdlKCk7CisgIHJldHVybiBTb3VyY2VSYW5nZSgpOworfQorCiB2b2lkIEVudW1EZWNsOjpjb21wbGV0ZURlZmluaXRpb24oUXVhbFR5cGUgTmV3VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBOZXdQcm9tb3Rpb25UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVBvc2l0aXZlQml0cywKQEAgLTMzNTMsOCArMzM4NCw4IEBACiBSZWNvcmREZWNsICpSZWNvcmREZWNsOjpDcmVhdGUoY29uc3QgQVNUQ29udGV4dCAmQywgVGFnS2luZCBUSywgRGVjbENvbnRleHQgKkRDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLCBTb3VyY2VMb2NhdGlvbiBJZExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFJlY29yZERlY2wqIFByZXZEZWNsKSB7Ci0gIFJlY29yZERlY2wqIFIgPSBuZXcgKEMpIFJlY29yZERlY2woUmVjb3JkLCBUSywgREMsIFN0YXJ0TG9jLCBJZExvYywgSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldkRlY2wpOworICBSZWNvcmREZWNsKiBSID0gbmV3IChDLCBEQykgUmVjb3JkRGVjbChSZWNvcmQsIFRLLCBEQywgU3RhcnRMb2MsIElkTG9jLCBJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldkRlY2wpOwogICBSLT5NYXlIYXZlT3V0T2ZEYXRlRGVmID0gQy5nZXRMYW5nT3B0cygpLk1vZHVsZXM7CiAKICAgQy5nZXRUeXBlRGVjbFR5cGUoUiwgUHJldkRlY2wpOwpAQCAtMzM2Miw5ICszMzkzLDggQEAKIH0KIAogUmVjb3JkRGVjbCAqUmVjb3JkRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKGNvbnN0IEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKFJlY29yZERlY2wpKTsKLSAgUmVjb3JkRGVjbCAqUiA9IG5ldyAoTWVtKSBSZWNvcmREZWNsKFJlY29yZCwgVFRLX1N0cnVjdCwgMCwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIDAsIDApOworICBSZWNvcmREZWNsICpSID0gbmV3IChDLCBJRCkgUmVjb3JkRGVjbChSZWNvcmQsIFRUS19TdHJ1Y3QsIDAsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIDAsIDApOwogICBSLT5NYXlIYXZlT3V0T2ZEYXRlRGVmID0gQy5nZXRMYW5nT3B0cygpLk1vZHVsZXM7CiAgIHJldHVybiBSOwogfQpAQCAtMzQyNyw3ICszNDU3LDcgQEAKICAgaWYgKERlY2xzLmVtcHR5KCkpCiAgICAgcmV0dXJuOwogCi0gIGxsdm06OnRpZShGaXJzdERlY2wsIExhc3REZWNsKSA9IEJ1aWxkRGVjbENoYWluKERlY2xzLAorICBzdGQ6OnRpZShGaXJzdERlY2wsIExhc3REZWNsKSA9IEJ1aWxkRGVjbENoYWluKERlY2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRmllbGRzQWxyZWFkeUxvYWRlZD0qL2ZhbHNlKTsKIH0KIApAQCAtMzQ2OSwxMCArMzQ5OSw5IEBACiB9CiAKIGJvb2wgQmxvY2tEZWNsOjpjYXB0dXJlc1ZhcmlhYmxlKGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlKSBjb25zdCB7Ci0gIGZvciAoY2FwdHVyZV9jb25zdF9pdGVyYXRvcgotICAgICAgICAgaSA9IGNhcHR1cmVfYmVnaW4oKSwgZSA9IGNhcHR1cmVfZW5kKCk7IGkgIT0gZTsgKytpKQorICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBjYXB0dXJlcygpKQogICAgIC8vIE9ubHkgYXV0byB2YXJzIGNhbiBiZSBjYXB0dXJlZCwgc28gbm8gcmVkZWNsYXJhdGlvbiB3b3JyaWVzLgotICAgIGlmIChpLT5nZXRWYXJpYWJsZSgpID09IHZhcmlhYmxlKQorICAgIGlmIChJLmdldFZhcmlhYmxlKCkgPT0gdmFyaWFibGUpCiAgICAgICByZXR1cm4gdHJ1ZTsKIAogICByZXR1cm4gZmFsc2U7CkBAIC0zNDg5LDMzICszNTE4LDMyIEBACiB2b2lkIFRyYW5zbGF0aW9uVW5pdERlY2w6OmFuY2hvcigpIHsgfQogCiBUcmFuc2xhdGlvblVuaXREZWNsICpUcmFuc2xhdGlvblVuaXREZWNsOjpDcmVhdGUoQVNUQ29udGV4dCAmQykgewotICByZXR1cm4gbmV3IChDKSBUcmFuc2xhdGlvblVuaXREZWNsKEMpOworICByZXR1cm4gbmV3IChDLCAoRGVjbENvbnRleHQqKTApIFRyYW5zbGF0aW9uVW5pdERlY2woQyk7CiB9CiAKIHZvaWQgTGFiZWxEZWNsOjphbmNob3IoKSB7IH0KIAogTGFiZWxEZWNsICpMYWJlbERlY2w6OkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkZW50TCwgSWRlbnRpZmllckluZm8gKklJKSB7Ci0gIHJldHVybiBuZXcgKEMpIExhYmVsRGVjbChEQywgSWRlbnRMLCBJSSwgMCwgSWRlbnRMKTsKKyAgcmV0dXJuIG5ldyAoQywgREMpIExhYmVsRGVjbChEQywgSWRlbnRMLCBJSSwgMCwgSWRlbnRMKTsKIH0KIAogTGFiZWxEZWNsICpMYWJlbERlY2w6OkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkZW50TCwgSWRlbnRpZmllckluZm8gKklJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBHbnVMYWJlbEwpIHsKICAgYXNzZXJ0KEdudUxhYmVsTCAhPSBJZGVudEwgJiYgIlVzZSB0aGlzIG9ubHkgZm9yIEdOVSBsb2NhbCBsYWJlbHMiKTsKLSAgcmV0dXJuIG5ldyAoQykgTGFiZWxEZWNsKERDLCBJZGVudEwsIElJLCAwLCBHbnVMYWJlbEwpOworICByZXR1cm4gbmV3IChDLCBEQykgTGFiZWxEZWNsKERDLCBJZGVudEwsIElJLCAwLCBHbnVMYWJlbEwpOwogfQogCiBMYWJlbERlY2wgKkxhYmVsRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKExhYmVsRGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIExhYmVsRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCAwLCAwLCBTb3VyY2VMb2NhdGlvbigpKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIExhYmVsRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCAwLCAwLCBTb3VyY2VMb2NhdGlvbigpKTsKIH0KIAogdm9pZCBWYWx1ZURlY2w6OmFuY2hvcigpIHsgfQogCiBib29sIFZhbHVlRGVjbDo6aXNXZWFrKCkgY29uc3QgewotICBmb3IgKGF0dHJfaXRlcmF0b3IgSSA9IGF0dHJfYmVnaW4oKSwgRSA9IGF0dHJfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgIGlmIChpc2E8V2Vha0F0dHI+KCpJKSB8fCBpc2E8V2Vha1JlZkF0dHI+KCpJKSkKKyAgZm9yIChjb25zdCBhdXRvICpJIDogYXR0cnMoKSkKKyAgICBpZiAoaXNhPFdlYWtBdHRyPihJKSB8fCBpc2E8V2Vha1JlZkF0dHI+KEkpKQogICAgICAgcmV0dXJuIHRydWU7CiAKICAgcmV0dXJuIGlzV2Vha0ltcG9ydGVkKCk7CkBAIC0zNTI3LDEzICszNTU1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFR5cGUpIHsKLSAgcmV0dXJuIG5ldyAoQykgSW1wbGljaXRQYXJhbURlY2woREMsIElkTG9jLCBJZCwgVHlwZSk7CisgIHJldHVybiBuZXcgKEMsIERDKSBJbXBsaWNpdFBhcmFtRGVjbChEQywgSWRMb2MsIElkLCBUeXBlKTsKIH0KIAotSW1wbGljaXRQYXJhbURlY2wgKkltcGxpY2l0UGFyYW1EZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgCitJbXBsaWNpdFBhcmFtRGVjbCAqSW1wbGljaXRQYXJhbURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoSW1wbGljaXRQYXJhbURlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBJbXBsaWNpdFBhcmFtRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCAwLCBRdWFsVHlwZSgpKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIEltcGxpY2l0UGFyYW1EZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIDAsIFF1YWxUeXBlKCkpOwogfQogCiBGdW5jdGlvbkRlY2wgKkZ1bmN0aW9uRGVjbDo6Q3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKQEAgLTM1NDEsNjYgKzM1NjgsNTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUNsYXNzIFNDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzSW5saW5lU3BlY2lmaWVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0lubGluZVNwZWNpZmllZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNXcml0dGVuUHJvdG90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQ29uc3RleHByU3BlY2lmaWVkKSB7Ci0gIEZ1bmN0aW9uRGVjbCAqTmV3ID0gbmV3IChDKSBGdW5jdGlvbkRlY2woRnVuY3Rpb24sIERDLCBTdGFydExvYywgTmFtZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCwgVEluZm8sIFNDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5saW5lU3BlY2lmaWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uc3RleHByU3BlY2lmaWVkKTsKKyAgRnVuY3Rpb25EZWNsICpOZXcgPQorICAgICAgbmV3IChDLCBEQykgRnVuY3Rpb25EZWNsKEZ1bmN0aW9uLCBEQywgU3RhcnRMb2MsIE5hbWVJbmZvLCBULCBUSW5mbywgU0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbmxpbmVTcGVjaWZpZWQsIGlzQ29uc3RleHByU3BlY2lmaWVkKTsKICAgTmV3LT5IYXNXcml0dGVuUHJvdG90eXBlID0gaGFzV3JpdHRlblByb3RvdHlwZTsKICAgcmV0dXJuIE5ldzsKIH0KIAogRnVuY3Rpb25EZWNsICpGdW5jdGlvbkRlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihGdW5jdGlvbkRlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBGdW5jdGlvbkRlY2woRnVuY3Rpb24sIDAsIFNvdXJjZUxvY2F0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWVJbmZvKCksIFF1YWxUeXBlKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDX05vbmUsIGZhbHNlLCBmYWxzZSk7CisgIHJldHVybiBuZXcgKEMsIElEKSBGdW5jdGlvbkRlY2woRnVuY3Rpb24sIDAsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lSW5mbygpLCBRdWFsVHlwZSgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDX05vbmUsIGZhbHNlLCBmYWxzZSk7CiB9CiAKIEJsb2NrRGVjbCAqQmxvY2tEZWNsOjpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBMKSB7Ci0gIHJldHVybiBuZXcgKEMpIEJsb2NrRGVjbChEQywgTCk7CisgIHJldHVybiBuZXcgKEMsIERDKSBCbG9ja0RlY2woREMsIEwpOwogfQogCiBCbG9ja0RlY2wgKkJsb2NrRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKEJsb2NrRGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIEJsb2NrRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpKTsKLX0KLQotTVNQcm9wZXJ0eURlY2wgKk1TUHJvcGVydHlEZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKE1TUHJvcGVydHlEZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgTVNQcm9wZXJ0eURlY2woMCwgU291cmNlTG9jYXRpb24oKSwgRGVjbGFyYXRpb25OYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUoKSwgMCwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIEJsb2NrRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpKTsKIH0KIAogQ2FwdHVyZWREZWNsICpDYXB0dXJlZERlY2w6OkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVBhcmFtcykgewotICB1bnNpZ25lZCBTaXplID0gc2l6ZW9mKENhcHR1cmVkRGVjbCkgKyBOdW1QYXJhbXMgKiBzaXplb2YoSW1wbGljaXRQYXJhbURlY2wqKTsKLSAgcmV0dXJuIG5ldyAoQy5BbGxvY2F0ZShTaXplKSkgQ2FwdHVyZWREZWNsKERDLCBOdW1QYXJhbXMpOworICByZXR1cm4gbmV3IChDLCBEQywgTnVtUGFyYW1zICogc2l6ZW9mKEltcGxpY2l0UGFyYW1EZWNsICopKQorICAgICAgQ2FwdHVyZWREZWNsKERDLCBOdW1QYXJhbXMpOwogfQogCiBDYXB0dXJlZERlY2wgKkNhcHR1cmVkRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1QYXJhbXMpIHsKLSAgdW5zaWduZWQgU2l6ZSA9IHNpemVvZihDYXB0dXJlZERlY2wpICsgTnVtUGFyYW1zICogc2l6ZW9mKEltcGxpY2l0UGFyYW1EZWNsKik7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgU2l6ZSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgQ2FwdHVyZWREZWNsKDAsIE51bVBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVBhcmFtcykgeworICByZXR1cm4gbmV3IChDLCBJRCwgTnVtUGFyYW1zICogc2l6ZW9mKEltcGxpY2l0UGFyYW1EZWNsICopKQorICAgICAgQ2FwdHVyZWREZWNsKDAsIE51bVBhcmFtcyk7CiB9CiAKIEVudW1Db25zdGFudERlY2wgKkVudW1Db25zdGFudERlY2w6OkNyZWF0ZShBU1RDb250ZXh0ICZDLCBFbnVtRGVjbCAqQ0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsIFF1YWxUeXBlIFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqRSwgY29uc3QgbGx2bTo6QVBTSW50ICZWKSB7Ci0gIHJldHVybiBuZXcgKEMpIEVudW1Db25zdGFudERlY2woQ0QsIEwsIElkLCBULCBFLCBWKTsKKyAgcmV0dXJuIG5ldyAoQywgQ0QpIEVudW1Db25zdGFudERlY2woQ0QsIEwsIElkLCBULCBFLCBWKTsKIH0KIAogRW51bUNvbnN0YW50RGVjbCAqCiBFbnVtQ29uc3RhbnREZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoRW51bUNvbnN0YW50RGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIEVudW1Db25zdGFudERlY2woMCwgU291cmNlTG9jYXRpb24oKSwgMCwgUXVhbFR5cGUoKSwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBUFNJbnQoKSk7CisgIHJldHVybiBuZXcgKEMsIElEKSBFbnVtQ29uc3RhbnREZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIDAsIFF1YWxUeXBlKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFQU0ludCgpKTsKIH0KIAogdm9pZCBJbmRpcmVjdEZpZWxkRGVjbDo6YW5jaG9yKCkgeyB9CkBAIC0zNjA5LDE0ICszNjIzLDEzIEBACiBJbmRpcmVjdEZpZWxkRGVjbDo6Q3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgU291cmNlTG9jYXRpb24gTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLCBRdWFsVHlwZSBULCBOYW1lZERlY2wgKipDSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ0hTKSB7Ci0gIHJldHVybiBuZXcgKEMpIEluZGlyZWN0RmllbGREZWNsKERDLCBMLCBJZCwgVCwgQ0gsIENIUyk7CisgIHJldHVybiBuZXcgKEMsIERDKSBJbmRpcmVjdEZpZWxkRGVjbChEQywgTCwgSWQsIFQsIENILCBDSFMpOwogfQogCiBJbmRpcmVjdEZpZWxkRGVjbCAqSW5kaXJlY3RGaWVsZERlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoSW5kaXJlY3RGaWVsZERlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBJbmRpcmVjdEZpZWxkRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBEZWNsYXJhdGlvbk5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSgpLCAwLCAwKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIEluZGlyZWN0RmllbGREZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIERlY2xhcmF0aW9uTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUoKSwgMCwgMCk7CiB9CiAKIFNvdXJjZVJhbmdlIEVudW1Db25zdGFudERlY2w6OmdldFNvdXJjZVJhbmdlKCkgY29uc3QgewpAQCAtMzYzMSwyNiArMzY0NCwyNCBAQAogVHlwZWRlZkRlY2wgKlR5cGVkZWZEZWNsOjpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIFNvdXJjZUxvY2F0aW9uIElkTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLCBUeXBlU291cmNlSW5mbyAqVEluZm8pIHsKLSAgcmV0dXJuIG5ldyAoQykgVHlwZWRlZkRlY2woREMsIFN0YXJ0TG9jLCBJZExvYywgSWQsIFRJbmZvKTsKKyAgcmV0dXJuIG5ldyAoQywgREMpIFR5cGVkZWZEZWNsKERDLCBTdGFydExvYywgSWRMb2MsIElkLCBUSW5mbyk7CiB9CiAKIHZvaWQgVHlwZWRlZk5hbWVEZWNsOjphbmNob3IoKSB7IH0KIAogVHlwZWRlZkRlY2wgKlR5cGVkZWZEZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoVHlwZWRlZkRlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBUeXBlZGVmRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCAwLCAwKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIFR5cGVkZWZEZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIDAsIDApOwogfQogCiBUeXBlQWxpYXNEZWNsICpUeXBlQWxpYXNEZWNsOjpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvKSB7Ci0gIHJldHVybiBuZXcgKEMpIFR5cGVBbGlhc0RlY2woREMsIFN0YXJ0TG9jLCBJZExvYywgSWQsIFRJbmZvKTsKKyAgcmV0dXJuIG5ldyAoQywgREMpIFR5cGVBbGlhc0RlY2woREMsIFN0YXJ0TG9jLCBJZExvYywgSWQsIFRJbmZvKTsKIH0KIAogVHlwZUFsaWFzRGVjbCAqVHlwZUFsaWFzRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKFR5cGVBbGlhc0RlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBUeXBlQWxpYXNEZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIDAsIDApOworICByZXR1cm4gbmV3IChDLCBJRCkgVHlwZUFsaWFzRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCAwLCAwKTsKIH0KIAogU291cmNlUmFuZ2UgVHlwZWRlZkRlY2w6OmdldFNvdXJjZVJhbmdlKCkgY29uc3QgewpAQCAtMzY3NSwyNCArMzY4NiwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgKlN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBc21Mb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKSB7Ci0gIHJldHVybiBuZXcgKEMpIEZpbGVTY29wZUFzbURlY2woREMsIFN0ciwgQXNtTG9jLCBSUGFyZW5Mb2MpOworICByZXR1cm4gbmV3IChDLCBEQykgRmlsZVNjb3BlQXNtRGVjbChEQywgU3RyLCBBc21Mb2MsIFJQYXJlbkxvYyk7CiB9CiAKLUZpbGVTY29wZUFzbURlY2wgKkZpbGVTY29wZUFzbURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCAKK0ZpbGVTY29wZUFzbURlY2wgKkZpbGVTY29wZUFzbURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKEZpbGVTY29wZUFzbURlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBGaWxlU2NvcGVBc21EZWNsKDAsIDAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCkpOworICByZXR1cm4gbmV3IChDLCBJRCkgRmlsZVNjb3BlQXNtRGVjbCgwLCAwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKTsKIH0KIAogdm9pZCBFbXB0eURlY2w6OmFuY2hvcigpIHt9CiAKIEVtcHR5RGVjbCAqRW1wdHlEZWNsOjpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCBTb3VyY2VMb2NhdGlvbiBMKSB7Ci0gIHJldHVybiBuZXcgKEMpIEVtcHR5RGVjbChEQywgTCk7CisgIHJldHVybiBuZXcgKEMsIERDKSBFbXB0eURlY2woREMsIEwpOwogfQogCiBFbXB0eURlY2wgKkVtcHR5RGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKEVtcHR5RGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIEVtcHR5RGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIEVtcHR5RGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpKTsKIH0KIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTM3MzAsMzAgKzM3MzksMjggQEAKICAgKnJlaW50ZXJwcmV0X2Nhc3Q8U291cmNlTG9jYXRpb24gKj4odGhpcyArIDEpID0gRW5kTG9jOwogfQogCi1JbXBvcnREZWNsICpJbXBvcnREZWNsOjpDcmVhdGUoQVNUQ29udGV4dCAmQywgRGVjbENvbnRleHQgKkRDLCAKK0ltcG9ydERlY2wgKkltcG9ydERlY2w6OkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsIE1vZHVsZSAqSW1wb3J0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlTG9jYXRpb24+IElkZW50aWZpZXJMb2NzKSB7Ci0gIHZvaWQgKk1lbSA9IEMuQWxsb2NhdGUoc2l6ZW9mKEltcG9ydERlY2wpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckxvY3Muc2l6ZSgpICogc2l6ZW9mKFNvdXJjZUxvY2F0aW9uKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgSW1wb3J0RGVjbChEQywgU3RhcnRMb2MsIEltcG9ydGVkLCBJZGVudGlmaWVyTG9jcyk7CisgIHJldHVybiBuZXcgKEMsIERDLCBJZGVudGlmaWVyTG9jcy5zaXplKCkgKiBzaXplb2YoU291cmNlTG9jYXRpb24pKQorICAgICAgSW1wb3J0RGVjbChEQywgU3RhcnRMb2MsIEltcG9ydGVkLCBJZGVudGlmaWVyTG9jcyk7CiB9CiAKLUltcG9ydERlY2wgKkltcG9ydERlY2w6OkNyZWF0ZUltcGxpY2l0KEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywgCitJbXBvcnREZWNsICpJbXBvcnREZWNsOjpDcmVhdGVJbXBsaWNpdChBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqSW1wb3J0ZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICpJbXBvcnRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykgewotICB2b2lkICpNZW0gPSBDLkFsbG9jYXRlKHNpemVvZihJbXBvcnREZWNsKSArIHNpemVvZihTb3VyY2VMb2NhdGlvbikpOwotICBJbXBvcnREZWNsICpJbXBvcnQgPSBuZXcgKE1lbSkgSW1wb3J0RGVjbChEQywgU3RhcnRMb2MsIEltcG9ydGVkLCBFbmRMb2MpOworICBJbXBvcnREZWNsICpJbXBvcnQgPQorICAgICAgbmV3IChDLCBEQywgc2l6ZW9mKFNvdXJjZUxvY2F0aW9uKSkgSW1wb3J0RGVjbChEQywgU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydGVkLCBFbmRMb2MpOwogICBJbXBvcnQtPnNldEltcGxpY2l0KCk7CiAgIHJldHVybiBJbXBvcnQ7CiB9CiAKIEltcG9ydERlY2wgKkltcG9ydERlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Mb2NhdGlvbnMpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoSW1wb3J0RGVjbCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1Mb2NhdGlvbnMgKiBzaXplb2YoU291cmNlTG9jYXRpb24pKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgSW1wb3J0RGVjbChFbXB0eVNoZWxsKCkpOyAgCisgIHJldHVybiBuZXcgKEMsIElELCBOdW1Mb2NhdGlvbnMgKiBzaXplb2YoU291cmNlTG9jYXRpb24pKQorICAgICAgSW1wb3J0RGVjbChFbXB0eVNoZWxsKCkpOwogfQogCiBBcnJheVJlZjxTb3VyY2VMb2NhdGlvbj4gSW1wb3J0RGVjbDo6Z2V0SWRlbnRpZmllckxvY3MoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9saWIvQVNUL0RlY2xCYXNlLmNwcCBiL2xpYi9BU1QvRGVjbEJhc2UuY3BwCmluZGV4IDEyMWM1YTYuLjFkZTFmZTIgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvRGVjbEJhc2UuY3BwCisrKyBiL2xpYi9BU1QvRGVjbEJhc2UuY3BwCkBAIC00NSwyNSArNDUsMzAgQEAKICAgZ2V0QVNUQ29udGV4dCgpLmdldEV4dGVybmFsU291cmNlKCktPnVwZGF0ZU91dE9mRGF0ZUlkZW50aWZpZXIoSUkpOwogfQogCi12b2lkICpEZWNsOjpBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSkgewordm9pZCAqRGVjbDo6b3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IFNpemUsIGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQsIHN0ZDo6c2l6ZV90IEV4dHJhKSB7CiAgIC8vIEFsbG9jYXRlIGFuIGV4dHJhIDggYnl0ZXMgd29ydGggb2Ygc3RvcmFnZSwgd2hpY2ggZW5zdXJlcyB0aGF0IHRoZQogICAvLyByZXN1bHRpbmcgcG9pbnRlciB3aWxsIHN0aWxsIGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAgdm9pZCAqU3RhcnQgPSBDb250ZXh0LkFsbG9jYXRlKFNpemUgKyA4KTsKKyAgdm9pZCAqU3RhcnQgPSBDb250ZXh0LkFsbG9jYXRlKFNpemUgKyBFeHRyYSArIDgpOwogICB2b2lkICpSZXN1bHQgPSAoY2hhciopU3RhcnQgKyA4OwotICAKKwogICB1bnNpZ25lZCAqUHJlZml4UHRyID0gKHVuc2lnbmVkICopUmVzdWx0IC0gMjsKLSAgCisKICAgLy8gWmVybyBvdXQgdGhlIGZpcnN0IDQgYnl0ZXM7IHRoaXMgaXMgdXNlZCB0byBzdG9yZSB0aGUgb3duaW5nIG1vZHVsZSBJRC4KICAgUHJlZml4UHRyWzBdID0gMDsKLSAgCisKICAgLy8gU3RvcmUgdGhlIGdsb2JhbCBkZWNsYXJhdGlvbiBJRCBpbiB0aGUgc2Vjb25kIDQgYnl0ZXMuCiAgIFByZWZpeFB0clsxXSA9IElEOwotICAKKwogICByZXR1cm4gUmVzdWx0OwogfQogCit2b2lkICpEZWNsOjpvcGVyYXRvciBuZXcoc3RkOjpzaXplX3QgU2l6ZSwgY29uc3QgQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpQYXJlbnQsIHN0ZDo6c2l6ZV90IEV4dHJhKSB7CisgIGFzc2VydCghUGFyZW50IHx8ICZQYXJlbnQtPmdldFBhcmVudEFTVENvbnRleHQoKSA9PSAmQ3R4KTsKKyAgcmV0dXJuIDo6b3BlcmF0b3IgbmV3KFNpemUgKyBFeHRyYSwgQ3R4KTsKK30KKwogTW9kdWxlICpEZWNsOjpnZXRPd25pbmdNb2R1bGVTbG93KCkgY29uc3QgewogICBhc3NlcnQoaXNGcm9tQVNURmlsZSgpICYmICJOb3QgZnJvbSBBU1QgZmlsZT8iKTsKICAgcmV0dXJuIGdldEFTVENvbnRleHQoKS5nZXRFeHRlcm5hbFNvdXJjZSgpLT5nZXRNb2R1bGUoZ2V0T3duaW5nTW9kdWxlSUQoKSk7CkBAIC04MCw2ICs4NSw3IEBACiAKIHZvaWQgRGVjbDo6c2V0SW52YWxpZERlY2woYm9vbCBJbnZhbGlkKSB7CiAgIEludmFsaWREZWNsID0gSW52YWxpZDsKKyAgYXNzZXJ0KCFpc2E8VGFnRGVjbD4odGhpcykgfHwgIWNhc3Q8VGFnRGVjbD4odGhpcyktPmlzQ29tcGxldGVEZWZpbml0aW9uKCkpOwogICBpZiAoSW52YWxpZCAmJiAhaXNhPFBhcm1WYXJEZWNsPih0aGlzKSkgewogICAgIC8vIERlZmVuc2l2ZSBtYW5ldXZlciBmb3IgaWxsLWZvcm1lZCBjb2RlOiB3ZSdyZSBsaWtlbHkgbm90IHRvIG1ha2UgaXQgdG8KICAgICAvLyBhIHBvaW50IHdoZXJlIHdlIHNldCB0aGUgYWNjZXNzIHNwZWNpZmllciwgc28gZGVmYXVsdCBpdCB0byAicHVibGljIgpAQCAtMTUzLDExICsxNTksMTIgQEAKICAgcmV0dXJuIGlzVGVtcGxhdGVQYXJhbWV0ZXJQYWNrKCk7CiB9CiAKLWJvb2wgRGVjbDo6aXNGdW5jdGlvbk9yRnVuY3Rpb25UZW1wbGF0ZSgpIGNvbnN0IHsKLSAgaWYgKGNvbnN0IFVzaW5nU2hhZG93RGVjbCAqVUQgPSBkeW5fY2FzdDxVc2luZ1NoYWRvd0RlY2w+KHRoaXMpKQotICAgIHJldHVybiBVRC0+Z2V0VGFyZ2V0RGVjbCgpLT5pc0Z1bmN0aW9uT3JGdW5jdGlvblRlbXBsYXRlKCk7Ci0KLSAgcmV0dXJuIGlzYTxGdW5jdGlvbkRlY2w+KHRoaXMpIHx8IGlzYTxGdW5jdGlvblRlbXBsYXRlRGVjbD4odGhpcyk7CitGdW5jdGlvbkRlY2wgKkRlY2w6OmdldEFzRnVuY3Rpb24oKSB7CisgIGlmIChGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPih0aGlzKSkKKyAgICByZXR1cm4gRkQ7CisgIGlmIChjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRlREID0gZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KHRoaXMpKQorICAgIHJldHVybiBGVEQtPmdldFRlbXBsYXRlZERlY2woKTsKKyAgcmV0dXJuIDA7CiB9CiAKIGJvb2wgRGVjbDo6aXNUZW1wbGF0ZURlY2woKSBjb25zdCB7CkBAIC0zMDYsNyArMzEzLDcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIAogICAvLyBDaGVjayByZWRlY2xhcmF0aW9ucy4KLSAgZm9yIChyZWRlY2xfaXRlcmF0b3IgSSA9IHJlZGVjbHNfYmVnaW4oKSwgRSA9IHJlZGVjbHNfZW5kKCk7IEkgIT0gRTsgKytJKQorICBmb3IgKGF1dG8gSSA6IHJlZGVjbHMoKSkKICAgICBpZiAoSS0+UmVmZXJlbmNlZCkKICAgICAgIHJldHVybiB0cnVlOwogCkBAIC00MDEsOCArNDA4LDggQEAKICAgQXZhaWxhYmlsaXR5UmVzdWx0IFJlc3VsdCA9IEFSX0F2YWlsYWJsZTsKICAgc3RkOjpzdHJpbmcgUmVzdWx0TWVzc2FnZTsKIAotICBmb3IgKGF0dHJfaXRlcmF0b3IgQSA9IGF0dHJfYmVnaW4oKSwgQUVuZCA9IGF0dHJfZW5kKCk7IEEgIT0gQUVuZDsgKytBKSB7Ci0gICAgaWYgKERlcHJlY2F0ZWRBdHRyICpEZXByZWNhdGVkID0gZHluX2Nhc3Q8RGVwcmVjYXRlZEF0dHI+KCpBKSkgeworICBmb3IgKGNvbnN0IGF1dG8gKkEgOiBhdHRycygpKSB7CisgICAgaWYgKGNvbnN0IGF1dG8gKkRlcHJlY2F0ZWQgPSBkeW5fY2FzdDxEZXByZWNhdGVkQXR0cj4oQSkpIHsKICAgICAgIGlmIChSZXN1bHQgPj0gQVJfRGVwcmVjYXRlZCkKICAgICAgICAgY29udGludWU7CiAKQEAgLTQxMywxMyArNDIwLDEzIEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAKLSAgICBpZiAoVW5hdmFpbGFibGVBdHRyICpVbmF2YWlsYWJsZSA9IGR5bl9jYXN0PFVuYXZhaWxhYmxlQXR0cj4oKkEpKSB7CisgICAgaWYgKGNvbnN0IGF1dG8gKlVuYXZhaWxhYmxlID0gZHluX2Nhc3Q8VW5hdmFpbGFibGVBdHRyPihBKSkgewogICAgICAgaWYgKE1lc3NhZ2UpCiAgICAgICAgICpNZXNzYWdlID0gVW5hdmFpbGFibGUtPmdldE1lc3NhZ2UoKTsKICAgICAgIHJldHVybiBBUl9VbmF2YWlsYWJsZTsKICAgICB9CiAKLSAgICBpZiAoQXZhaWxhYmlsaXR5QXR0ciAqQXZhaWxhYmlsaXR5ID0gZHluX2Nhc3Q8QXZhaWxhYmlsaXR5QXR0cj4oKkEpKSB7CisgICAgaWYgKGNvbnN0IGF1dG8gKkF2YWlsYWJpbGl0eSA9IGR5bl9jYXN0PEF2YWlsYWJpbGl0eUF0dHI+KEEpKSB7CiAgICAgICBBdmFpbGFiaWxpdHlSZXN1bHQgQVIgPSBDaGVja0F2YWlsYWJpbGl0eShnZXRBU1RDb250ZXh0KCksIEF2YWlsYWJpbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UpOwogCkBAIC00NzUsMTEgKzQ4MiwxMSBAQAogICBpZiAoIWNhbkJlV2Vha0ltcG9ydGVkKElzRGVmaW5pdGlvbikpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGZvciAoYXR0cl9pdGVyYXRvciBBID0gYXR0cl9iZWdpbigpLCBBRW5kID0gYXR0cl9lbmQoKTsgQSAhPSBBRW5kOyArK0EpIHsKLSAgICBpZiAoaXNhPFdlYWtJbXBvcnRBdHRyPigqQSkpCisgIGZvciAoY29uc3QgYXV0byAqQSA6IGF0dHJzKCkpIHsKKyAgICBpZiAoaXNhPFdlYWtJbXBvcnRBdHRyPihBKSkKICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgaWYgKEF2YWlsYWJpbGl0eUF0dHIgKkF2YWlsYWJpbGl0eSA9IGR5bl9jYXN0PEF2YWlsYWJpbGl0eUF0dHI+KCpBKSkgeworICAgIGlmIChjb25zdCBhdXRvICpBdmFpbGFiaWxpdHkgPSBkeW5fY2FzdDxBdmFpbGFiaWxpdHlBdHRyPihBKSkgewogICAgICAgaWYgKENoZWNrQXZhaWxhYmlsaXR5KGdldEFTVENvbnRleHQoKSwgQXZhaWxhYmlsaXR5LCAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEFSX05vdFlldEludHJvZHVjZWQpCiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNjYyLDcgKzY2OSw3IEBACiAgIHJldHVybiBTb3VyY2VMb2NhdGlvbigpOwogfQogCi12b2lkIERlY2w6OkNoZWNrQWNjZXNzRGVjbENvbnRleHQoKSBjb25zdCB7Citib29sIERlY2w6OkFjY2Vzc0RlY2xDb250ZXh0U2FuaXR5KCkgY29uc3QgewogI2lmbmRlZiBOREVCVUcKICAgLy8gU3VwcHJlc3MgdGhpcyBjaGVjayBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBob2xkOgogICAvLyAxLiB0aGlzIGlzIHRoZSB0cmFuc2xhdGlvbiB1bml0IChhbmQgdGh1cyBoYXMgbm8gcGFyZW50KQpAQCAtNjg0LDE2ICs2OTEsMzUgQEAKICAgICAgIC8vIEFTX25vbmUgYXMgYWNjZXNzIHNwZWNpZmllci4KICAgICAgIGlzYTxDWFhSZWNvcmREZWNsPih0aGlzKSB8fAogICAgICAgaXNhPENsYXNzU2NvcGVGdW5jdGlvblNwZWNpYWxpemF0aW9uRGVjbD4odGhpcykpCi0gICAgcmV0dXJuOworICAgIHJldHVybiB0cnVlOwogCiAgIGFzc2VydChBY2Nlc3MgIT0gQVNfbm9uZSAmJgogICAgICAgICAgIkFjY2VzcyBzcGVjaWZpZXIgaXMgQVNfbm9uZSBpbnNpZGUgYSByZWNvcmQgZGVjbCIpOwogI2VuZGlmCisgIHJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgRGVjbDo6S2luZCBnZXRLaW5kKGNvbnN0IERlY2wgKkQpIHsgcmV0dXJuIEQtPmdldEtpbmQoKTsgfQogc3RhdGljIERlY2w6OktpbmQgZ2V0S2luZChjb25zdCBEZWNsQ29udGV4dCAqREMpIHsgcmV0dXJuIERDLT5nZXREZWNsS2luZCgpOyB9CiAKK2NvbnN0IEZ1bmN0aW9uVHlwZSAqRGVjbDo6Z2V0RnVuY3Rpb25UeXBlKGJvb2wgQmxvY2tzVG9vKSBjb25zdCB7CisgIFF1YWxUeXBlIFR5OworICBpZiAoY29uc3QgVmFsdWVEZWNsICpEID0gZHluX2Nhc3Q8VmFsdWVEZWNsPih0aGlzKSkKKyAgICBUeSA9IEQtPmdldFR5cGUoKTsKKyAgZWxzZSBpZiAoY29uc3QgVHlwZWRlZk5hbWVEZWNsICpEID0gZHluX2Nhc3Q8VHlwZWRlZk5hbWVEZWNsPih0aGlzKSkKKyAgICBUeSA9IEQtPmdldFVuZGVybHlpbmdUeXBlKCk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKKworICBpZiAoVHktPmlzRnVuY3Rpb25Qb2ludGVyVHlwZSgpKQorICAgIFR5ID0gVHktPmdldEFzPFBvaW50ZXJUeXBlPigpLT5nZXRQb2ludGVlVHlwZSgpOworICBlbHNlIGlmIChCbG9ja3NUb28gJiYgVHktPmlzQmxvY2tQb2ludGVyVHlwZSgpKQorICAgIFR5ID0gVHktPmdldEFzPEJsb2NrUG9pbnRlclR5cGU+KCktPmdldFBvaW50ZWVUeXBlKCk7CisKKyAgcmV0dXJuIFR5LT5nZXRBczxGdW5jdGlvblR5cGU+KCk7Cit9CisKKwogLy8vIFN0YXJ0aW5nIGF0IGEgZ2l2ZW4gY29udGV4dCAoYSBEZWNsIG9yIERlY2xDb250ZXh0KSwgbG9vayBmb3IgYQogLy8vIGNvZGUgY29udGV4dCB0aGF0IGlzIG5vdCBhIGNsb3N1cmUgKGEgbGFtYmRhLCBibG9jaywgZXRjLikuCiB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RhdGljIERlY2wgKmdldE5vbkNsb3N1cmVDb250ZXh0KFQgKkQpIHsKQEAgLTkzOSwxMyArOTY1LDEyIEBACiAvLy8gXGJyaWVmIFdlIGhhdmUganVzdCBhY3F1aXJlZCBleHRlcm5hbCB2aXNpYmxlIHN0b3JhZ2UsIGFuZCB3ZSBhbHJlYWR5IGhhdmUKIC8vLyBidWlsdCBhIGxvb2t1cCBtYXAuIEZvciBldmVyeSBuYW1lIGluIHRoZSBtYXAsIHB1bGwgaW4gdGhlIG5ldyBuYW1lcyBmcm9tCiAvLy8gdGhlIGV4dGVybmFsIHN0b3JhZ2UuCi12b2lkIERlY2xDb250ZXh0OjpyZWNvbmNpbGVFeHRlcm5hbFZpc2libGVTdG9yYWdlKCkgewordm9pZCBEZWNsQ29udGV4dDo6cmVjb25jaWxlRXh0ZXJuYWxWaXNpYmxlU3RvcmFnZSgpIGNvbnN0IHsKICAgYXNzZXJ0KE5lZWRUb1JlY29uY2lsZUV4dGVybmFsVmlzaWJsZVN0b3JhZ2UgJiYgTG9va3VwUHRyLmdldFBvaW50ZXIoKSk7CiAgIE5lZWRUb1JlY29uY2lsZUV4dGVybmFsVmlzaWJsZVN0b3JhZ2UgPSBmYWxzZTsKIAotICBTdG9yZWREZWNsc01hcCAmTWFwID0gKkxvb2t1cFB0ci5nZXRQb2ludGVyKCk7Ci0gIGZvciAoU3RvcmVkRGVjbHNNYXA6Oml0ZXJhdG9yIEkgPSBNYXAuYmVnaW4oKTsgSSAhPSBNYXAuZW5kKCk7ICsrSSkKLSAgICBJLT5zZWNvbmQuc2V0SGFzRXh0ZXJuYWxEZWNscygpOworICBmb3IgKGF1dG8gJkxvb2t1cCA6ICpMb29rdXBQdHIuZ2V0UG9pbnRlcigpKQorICAgIExvb2t1cC5zZWNvbmQuc2V0SGFzRXh0ZXJuYWxEZWNscygpOwogfQogCiAvLy8gXGJyaWVmIExvYWQgdGhlIGRlY2xhcmF0aW9ucyB3aXRoaW4gdGhpcyBsZXhpY2FsIHN0b3JhZ2UgZnJvbSBhbgpAQCAtOTgyLDggKzEwMDcsOCBAQAogICAvLyBTcGxpY2UgdGhlIG5ld2x5LXJlYWQgZGVjbGFyYXRpb25zIGludG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAogICAvLyBvZiBkZWNsYXJhdGlvbnMuCiAgIERlY2wgKkV4dGVybmFsRmlyc3QsICpFeHRlcm5hbExhc3Q7Ci0gIGxsdm06OnRpZShFeHRlcm5hbEZpcnN0LCBFeHRlcm5hbExhc3QpID0gQnVpbGREZWNsQ2hhaW4oRGVjbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzQWxyZWFkeUxvYWRlZCk7CisgIHN0ZDo6dGllKEV4dGVybmFsRmlyc3QsIEV4dGVybmFsTGFzdCkgPQorICAgICAgQnVpbGREZWNsQ2hhaW4oRGVjbHMsIEZpZWxkc0FscmVhZHlMb2FkZWQpOwogICBFeHRlcm5hbExhc3QtPk5leHRJbkNvbnRleHRBbmRCaXRzLnNldFBvaW50ZXIoRmlyc3REZWNsKTsKICAgRmlyc3REZWNsID0gRXh0ZXJuYWxGaXJzdDsKICAgaWYgKCFMYXN0RGVjbCkKQEAgLTk5Nyw2ICsxMDIyLDggQEAKICAgU3RvcmVkRGVjbHNNYXAgKk1hcDsKICAgaWYgKCEoTWFwID0gREMtPkxvb2t1cFB0ci5nZXRQb2ludGVyKCkpKQogICAgIE1hcCA9IERDLT5DcmVhdGVTdG9yZWREZWNsc01hcChDb250ZXh0KTsKKyAgaWYgKERDLT5OZWVkVG9SZWNvbmNpbGVFeHRlcm5hbFZpc2libGVTdG9yYWdlKQorICAgIERDLT5yZWNvbmNpbGVFeHRlcm5hbFZpc2libGVTdG9yYWdlKCk7CiAKICAgKCpNYXApW05hbWVdLnJlbW92ZUV4dGVybmFsRGVjbHMoKTsKIApAQCAtMTAxMSw2ICsxMDM4LDggQEAKICAgU3RvcmVkRGVjbHNNYXAgKk1hcDsKICAgaWYgKCEoTWFwID0gREMtPkxvb2t1cFB0ci5nZXRQb2ludGVyKCkpKQogICAgIE1hcCA9IERDLT5DcmVhdGVTdG9yZWREZWNsc01hcChDb250ZXh0KTsKKyAgaWYgKERDLT5OZWVkVG9SZWNvbmNpbGVFeHRlcm5hbFZpc2libGVTdG9yYWdlKQorICAgIERDLT5yZWNvbmNpbGVFeHRlcm5hbFZpc2libGVTdG9yYWdlKCk7CiAKICAgU3RvcmVkRGVjbHNMaXN0ICZMaXN0ID0gKCpNYXApW05hbWVdOwogCkBAIC0xMDUwLDE0ICsxMDc5LDkgQEAKICAgcmV0dXJuIExpc3QuZ2V0TG9va3VwUmVzdWx0KCk7CiB9CiAKLURlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIERlY2xDb250ZXh0Ojpub2xvYWRfZGVjbHNfYmVnaW4oKSBjb25zdCB7Ci0gIHJldHVybiBkZWNsX2l0ZXJhdG9yKEZpcnN0RGVjbCk7Ci19Ci0KIERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIERlY2xDb250ZXh0OjpkZWNsc19iZWdpbigpIGNvbnN0IHsKICAgaWYgKGhhc0V4dGVybmFsTGV4aWNhbFN0b3JhZ2UoKSkKICAgICBMb2FkTGV4aWNhbERlY2xzRnJvbUV4dGVybmFsU3RvcmFnZSgpOwotCiAgIHJldHVybiBkZWNsX2l0ZXJhdG9yKEZpcnN0RGVjbCk7CiB9CiAKQEAgLTExODcsNiArMTIxMSwxMCBAQAogLy8vIGJ1aWxkTG9va3VwIC0gQnVpbGQgdGhlIGxvb2t1cCBkYXRhIHN0cnVjdHVyZSB3aXRoIGFsbCBvZiB0aGUKIC8vLyBkZWNsYXJhdGlvbnMgaW4gdGhpcyBEZWNsQ29udGV4dCAoYW5kIGFueSBvdGhlciBjb250ZXh0cyBsaW5rZWQKIC8vLyB0byBpdCBvciB0cmFuc3BhcmVudCBjb250ZXh0cyBuZXN0ZWQgd2l0aGluIGl0KSBhbmQgcmV0dXJuIGl0LgorLy8vCisvLy8gTm90ZSB0aGF0IHRoZSBwcm9kdWNlZCBtYXAgbWF5IG1pc3Mgb3V0IGRlY2xhcmF0aW9ucyBmcm9tIGFuCisvLy8gZXh0ZXJuYWwgc291cmNlLiBJZiBpdCBkb2VzLCB0aG9zZSBlbnRyaWVzIHdpbGwgYmUgbWFya2VkIHdpdGgKKy8vLyB0aGUgJ2hhc0V4dGVybmFsRGVjbHMnIGZsYWcuCiBTdG9yZWREZWNsc01hcCAqRGVjbENvbnRleHQ6OmJ1aWxkTG9va3VwKCkgewogICBhc3NlcnQodGhpcyA9PSBnZXRQcmltYXJ5Q29udGV4dCgpICYmICJidWlsZExvb2t1cCBjYWxsZWQgb24gbm9uLXByaW1hcnkgREMiKTsKIApAQCAtMTIwMiw3ICsxMjMwLDYgQEAKIAogICAvLyBXZSBubyBsb25nZXIgaGF2ZSBhbnkgbGF6eSBkZWNscy4KICAgTG9va3VwUHRyLnNldEludChmYWxzZSk7Ci0gIE5lZWRUb1JlY29uY2lsZUV4dGVybmFsVmlzaWJsZVN0b3JhZ2UgPSBmYWxzZTsKICAgcmV0dXJuIExvb2t1cFB0ci5nZXRQb2ludGVyKCk7CiB9CiAKQEAgLTEyNTEsMTEgKzEyNzgsMTMgQEAKICAgICByZXR1cm4gUHJpbWFyeUNvbnRleHQtPmxvb2t1cChOYW1lKTsKIAogICBpZiAoaGFzRXh0ZXJuYWxWaXNpYmxlU3RvcmFnZSgpKSB7CisgICAgaWYgKE5lZWRUb1JlY29uY2lsZUV4dGVybmFsVmlzaWJsZVN0b3JhZ2UpCisgICAgICByZWNvbmNpbGVFeHRlcm5hbFZpc2libGVTdG9yYWdlKCk7CisKICAgICBTdG9yZWREZWNsc01hcCAqTWFwID0gTG9va3VwUHRyLmdldFBvaW50ZXIoKTsKKwogICAgIGlmIChMb29rdXBQdHIuZ2V0SW50KCkpCiAgICAgICBNYXAgPSBidWlsZExvb2t1cCgpOwotICAgIGVsc2UgaWYgKE5lZWRUb1JlY29uY2lsZUV4dGVybmFsVmlzaWJsZVN0b3JhZ2UpCi0gICAgICByZWNvbmNpbGVFeHRlcm5hbFZpc2libGVTdG9yYWdlKCk7CiAKICAgICBpZiAoIU1hcCkKICAgICAgIE1hcCA9IENyZWF0ZVN0b3JlZERlY2xzTWFwKGdldFBhcmVudEFTVENvbnRleHQoKSk7CkBAIC0xMjY3LDcgKzEyOTYsNyBAQAogICAgICAgcmV0dXJuIFIuZmlyc3QtPnNlY29uZC5nZXRMb29rdXBSZXN1bHQoKTsKIAogICAgIEV4dGVybmFsQVNUU291cmNlICpTb3VyY2UgPSBnZXRQYXJlbnRBU1RDb250ZXh0KCkuZ2V0RXh0ZXJuYWxTb3VyY2UoKTsKLSAgICBpZiAoU291cmNlLT5GaW5kRXh0ZXJuYWxWaXNpYmxlRGVjbHNCeU5hbWUodGhpcywgTmFtZSkgfHwgUi5zZWNvbmQpIHsKKyAgICBpZiAoU291cmNlLT5GaW5kRXh0ZXJuYWxWaXNpYmxlRGVjbHNCeU5hbWUodGhpcywgTmFtZSkgfHwgIVIuc2Vjb25kKSB7CiAgICAgICBpZiAoU3RvcmVkRGVjbHNNYXAgKk1hcCA9IExvb2t1cFB0ci5nZXRQb2ludGVyKCkpIHsKICAgICAgICAgU3RvcmVkRGVjbHNNYXA6Oml0ZXJhdG9yIEkgPSBNYXAtPmZpbmQoTmFtZSk7CiAgICAgICAgIGlmIChJICE9IE1hcC0+ZW5kKCkpCkBAIC0xNTAyLDEzICsxNTMxLDEzIEBACiAKIC8vLyBSZXR1cm5zIGl0ZXJhdG9yIHJhbmdlIFtGaXJzdCwgTGFzdCkgb2YgVXNpbmdEaXJlY3RpdmVEZWNscyBzdG9yZWQgd2l0aGluCiAvLy8gdGhpcyBjb250ZXh0LgotRGVjbENvbnRleHQ6OnVkaXJfaXRlcmF0b3JfcmFuZ2UKLURlY2xDb250ZXh0OjpnZXRVc2luZ0RpcmVjdGl2ZXMoKSBjb25zdCB7CitEZWNsQ29udGV4dDo6dWRpcl9yYW5nZSBEZWNsQ29udGV4dDo6dXNpbmdfZGlyZWN0aXZlcygpIGNvbnN0IHsKICAgLy8gRklYTUU6IFVzZSBzb21ldGhpbmcgbW9yZSBlZmZpY2llbnQgdGhhbiBub3JtYWwgbG9va3VwIGZvciB1c2luZwogICAvLyBkaXJlY3RpdmVzLiBJbiBDKyssIHVzaW5nIGRpcmVjdGl2ZXMgYXJlIGxvb2tlZCB1cCBtb3JlIHRoYW4gYW55dGhpbmcgZWxzZS4KICAgbG9va3VwX2NvbnN0X3Jlc3VsdCBSZXN1bHQgPSBsb29rdXAoVXNpbmdEaXJlY3RpdmVEZWNsOjpnZXROYW1lKCkpOwotICByZXR1cm4gdWRpcl9pdGVyYXRvcl9yYW5nZShyZWludGVycHJldF9jYXN0PHVkaXJfaXRlcmF0b3I+KFJlc3VsdC5iZWdpbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1ZGlyX2l0ZXJhdG9yPihSZXN1bHQuZW5kKCkpKTsKKyAgcmV0dXJuIHVkaXJfcmFuZ2UoCisgICAgICByZWludGVycHJldF9jYXN0PFVzaW5nRGlyZWN0aXZlRGVjbCAqY29uc3QgKj4oUmVzdWx0LmJlZ2luKCkpLAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxVc2luZ0RpcmVjdGl2ZURlY2wgKmNvbnN0ICo+KFJlc3VsdC5lbmQoKSkpOwogfQogCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpkaWZmIC0tZ2l0IGEvbGliL0FTVC9EZWNsQ1hYLmNwcCBiL2xpYi9BU1QvRGVjbENYWC5jcHAKaW5kZXggYTE3YWJkZC4uZDBlYzRiOSAxMDA2NDQKLS0tIGEvbGliL0FTVC9EZWNsQ1hYLmNwcAorKysgYi9saWIvQVNUL0RlY2xDWFguY3BwCkBAIC0zMSw4ICszMSw3IEBACiB2b2lkIEFjY2Vzc1NwZWNEZWNsOjphbmNob3IoKSB7IH0KIAogQWNjZXNzU3BlY0RlY2wgKkFjY2Vzc1NwZWNEZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoQWNjZXNzU3BlY0RlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBBY2Nlc3NTcGVjRGVjbChFbXB0eVNoZWxsKCkpOworICByZXR1cm4gbmV3IChDLCBJRCkgQWNjZXNzU3BlY0RlY2woRW1wdHlTaGVsbCgpKTsKIH0KIAogdm9pZCBMYXp5QVNUVW5yZXNvbHZlZFNldDo6Z2V0RnJvbUV4dGVybmFsU291cmNlKEFTVENvbnRleHQgJkMpIGNvbnN0IHsKQEAgLTUxLDcgKzUwLDcgQEAKICAgICBBZ2dyZWdhdGUodHJ1ZSksIFBsYWluT2xkRGF0YSh0cnVlKSwgRW1wdHkodHJ1ZSksIFBvbHltb3JwaGljKGZhbHNlKSwKICAgICBBYnN0cmFjdChmYWxzZSksIElzU3RhbmRhcmRMYXlvdXQodHJ1ZSksIEhhc05vTm9uRW1wdHlCYXNlcyh0cnVlKSwKICAgICBIYXNQcml2YXRlRmllbGRzKGZhbHNlKSwgSGFzUHJvdGVjdGVkRmllbGRzKGZhbHNlKSwgSGFzUHVibGljRmllbGRzKGZhbHNlKSwKLSAgICBIYXNNdXRhYmxlRmllbGRzKGZhbHNlKSwgSGFzT25seUNNZW1iZXJzKHRydWUpLAorICAgIEhhc011dGFibGVGaWVsZHMoZmFsc2UpLCBIYXNWYXJpYW50TWVtYmVycyhmYWxzZSksIEhhc09ubHlDTWVtYmVycyh0cnVlKSwKICAgICBIYXNJbkNsYXNzSW5pdGlhbGl6ZXIoZmFsc2UpLCBIYXNVbmluaXRpYWxpemVkUmVmZXJlbmNlTWVtYmVyKGZhbHNlKSwKICAgICBOZWVkT3ZlcmxvYWRSZXNvbHV0aW9uRm9yTW92ZUNvbnN0cnVjdG9yKGZhbHNlKSwKICAgICBOZWVkT3ZlcmxvYWRSZXNvbHV0aW9uRm9yTW92ZUFzc2lnbm1lbnQoZmFsc2UpLApAQCAtOTUsOCArOTQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCogUHJldkRlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWxheVR5cGVDcmVhdGlvbikgewotICBDWFhSZWNvcmREZWNsKiBSID0gbmV3IChDKSBDWFhSZWNvcmREZWNsKENYWFJlY29yZCwgVEssIERDLCBTdGFydExvYywgSWRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQsIFByZXZEZWNsKTsKKyAgQ1hYUmVjb3JkRGVjbCAqUiA9IG5ldyAoQywgREMpIENYWFJlY29yZERlY2woQ1hYUmVjb3JkLCBUSywgREMsIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZExvYywgSWQsIFByZXZEZWNsKTsKICAgUi0+TWF5SGF2ZU91dE9mRGF0ZURlZiA9IEMuZ2V0TGFuZ09wdHMoKS5Nb2R1bGVzOwogCiAgIC8vIEZJWE1FOiBEZWxheVR5cGVDcmVhdGlvbiBzZWVtcyBsaWtlIHN1Y2ggYSBoYWNrCkBAIC0xMDksOCArMTA4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqSW5mbywgU291cmNlTG9jYXRpb24gTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVwZW5kZW50LCBib29sIElzR2VuZXJpYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFtYmRhQ2FwdHVyZURlZmF1bHQgQ2FwdHVyZURlZmF1bHQpIHsKLSAgQ1hYUmVjb3JkRGVjbCogUiA9IG5ldyAoQykgQ1hYUmVjb3JkRGVjbChDWFhSZWNvcmQsIFRUS19DbGFzcywgREMsIExvYywgTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICBDWFhSZWNvcmREZWNsICpSID0KKyAgICAgIG5ldyAoQywgREMpIENYWFJlY29yZERlY2woQ1hYUmVjb3JkLCBUVEtfQ2xhc3MsIERDLCBMb2MsIExvYywgMCwgMCk7CiAgIFItPklzQmVpbmdEZWZpbmVkID0gdHJ1ZTsKICAgUi0+RGVmaW5pdGlvbkRhdGEgPSBuZXcgKEMpIHN0cnVjdCBMYW1iZGFEZWZpbml0aW9uRGF0YShSLCBJbmZvLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbnQsIApAQCAtMTI0LDEwICsxMjMsOCBAQAogCiBDWFhSZWNvcmREZWNsICoKIENYWFJlY29yZERlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihDWFhSZWNvcmREZWNsKSk7Ci0gIENYWFJlY29yZERlY2wgKlIgPSBuZXcgKE1lbSkgQ1hYUmVjb3JkRGVjbChDWFhSZWNvcmQsIFRUS19TdHJ1Y3QsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7CisgIENYWFJlY29yZERlY2wgKlIgPSBuZXcgKEMsIElEKSBDWFhSZWNvcmREZWNsKAorICAgICAgQ1hYUmVjb3JkLCBUVEtfU3RydWN0LCAwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCAwLCAwKTsKICAgUi0+TWF5SGF2ZU91dE9mRGF0ZURlZiA9IGZhbHNlOwogICByZXR1cm4gUjsKIH0KQEAgLTIwNSwxOSArMjAyLDE3IEBACiAgICAgICBkYXRhKCkuSGFzTm9uTGl0ZXJhbFR5cGVGaWVsZHNPckJhc2VzID0gdHJ1ZTsKICAgICAKICAgICAvLyBOb3cgZ28gdGhyb3VnaCBhbGwgdmlydHVhbCBiYXNlcyBvZiB0aGlzIGJhc2UgYW5kIGFkZCB0aGVtLgotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBWQmFzZSA9Ci0gICAgICAgICAgQmFzZUNsYXNzRGVjbC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgICBFID0gQmFzZUNsYXNzRGVjbC0+dmJhc2VzX2VuZCgpOyBWQmFzZSAhPSBFOyArK1ZCYXNlKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZWQmFzZSA6IEJhc2VDbGFzc0RlY2wtPnZiYXNlcygpKSB7CiAgICAgICAvLyBBZGQgdGhpcyBiYXNlIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gdGhlIGxpc3QuCi0gICAgICBpZiAoU2VlblZCYXNlVHlwZXMuaW5zZXJ0KEMuZ2V0Q2Fub25pY2FsVHlwZShWQmFzZS0+Z2V0VHlwZSgpKSkpIHsKLSAgICAgICAgVkJhc2VzLnB1c2hfYmFjayhWQmFzZSk7CisgICAgICBpZiAoU2VlblZCYXNlVHlwZXMuaW5zZXJ0KEMuZ2V0Q2Fub25pY2FsVHlwZShWQmFzZS5nZXRUeXBlKCkpKSkgeworICAgICAgICBWQmFzZXMucHVzaF9iYWNrKCZWQmFzZSk7CiAKICAgICAgICAgLy8gQysrMTEgW2NsYXNzLmNvcHldcDg6CiAgICAgICAgIC8vICAgVGhlIGltcGxpY2l0bHktZGVjbGFyZWQgY29weSBjb25zdHJ1Y3RvciBmb3IgYSBjbGFzcyBYIHdpbGwgaGF2ZQogICAgICAgICAvLyAgIHRoZSBmb3JtICdYOjpYKGNvbnN0IFgmKScgaWYgZWFjaCBbLi4uXSB2aXJ0dWFsIGJhc2UgY2xhc3MgQiBvZiBYCiAgICAgICAgIC8vICAgaGFzIGEgY29weSBjb25zdHJ1Y3RvciB3aG9zZSBmaXJzdCBwYXJhbWV0ZXIgaXMgb2YgdHlwZQogICAgICAgICAvLyAgICdjb25zdCBCJicgb3IgJ2NvbnN0IHZvbGF0aWxlIEImJyBbLi4uXQotICAgICAgICBpZiAoQ1hYUmVjb3JkRGVjbCAqVkJhc2VEZWNsID0gVkJhc2UtPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCkpCisgICAgICAgIGlmIChDWFhSZWNvcmREZWNsICpWQmFzZURlY2wgPSBWQmFzZS5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpKQogICAgICAgICAgIGlmICghVkJhc2VEZWNsLT5oYXNDb3B5Q29uc3RydWN0b3JXaXRoQ29uc3RQYXJhbSgpKQogICAgICAgICAgICAgZGF0YSgpLkltcGxpY2l0Q29weUNvbnN0cnVjdG9ySGFzQ29uc3RQYXJhbSA9IGZhbHNlOwogICAgICAgfQpAQCAtNTMyLDggKzUyNywxMSBAQAogICBpZiAoQ1hYRGVzdHJ1Y3RvckRlY2wgKkREID0gZHluX2Nhc3Q8Q1hYRGVzdHJ1Y3RvckRlY2w+KEQpKSB7CiAgICAgU01LaW5kIHw9IFNNRl9EZXN0cnVjdG9yOwogCi0gICAgaWYgKCFERC0+aXNJbXBsaWNpdCgpKQorICAgIGlmIChERC0+aXNVc2VyUHJvdmlkZWQoKSkKICAgICAgIGRhdGEoKS5IYXNJcnJlbGV2YW50RGVzdHJ1Y3RvciA9IGZhbHNlOworICAgIC8vIElmIHRoZSBkZXN0cnVjdG9yIGlzIGV4cGxpY2l0bHkgZGVmYXVsdGVkIGFuZCBub3QgdHJpdmlhbCBvciBub3QgcHVibGljCisgICAgLy8gb3IgaWYgdGhlIGRlc3RydWN0b3IgaXMgZGVsZXRlZCwgd2UgY2xlYXIgSGFzSXJyZWxldmFudERlc3RydWN0b3IgaW4KKyAgICAvLyBmaW5pc2hlZERlZmF1bHRlZE9yRGVsZXRlZE1lbWJlci4KIAogICAgIC8vIEMrKzExIFtjbGFzcy5kdG9yXXA1OgogICAgIC8vICAgQSBkZXN0cnVjdG9yIGlzIHRyaXZpYWwgaWYgWy4uLl0gdGhlIGRlc3RydWN0b3IgaXMgbm90IHZpcnR1YWwuCkBAIC02NTYsNyArNjU0LDEzIEBACiAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJlc2VuY2Ugb2YgbXV0YWJsZSBmaWVsZHMuCiAgICAgaWYgKEZpZWxkLT5pc011dGFibGUoKSkKICAgICAgIGRhdGEoKS5IYXNNdXRhYmxlRmllbGRzID0gdHJ1ZTsKLSAgICAKKworICAgIC8vIEMrKzExIFtjbGFzcy51bmlvbl1wOCwgRFIxNDYwOgorICAgIC8vICAgSWYgWCBpcyBhIHVuaW9uLCBhIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIgb2YgWCB0aGF0IGlzIG5vdCBhbiBhbm9ueW1vdXMKKyAgICAvLyAgIHVuaW9uIGlzIGEgdmFyaWFudCBtZW1iZXIgb2YgWC4KKyAgICBpZiAoaXNVbmlvbigpICYmICFGaWVsZC0+aXNBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKCkpCisgICAgICBkYXRhKCkuSGFzVmFyaWFudE1lbWJlcnMgPSB0cnVlOworCiAgICAgLy8gQysrMHggW2NsYXNzXXA5OgogICAgIC8vICAgQSBQT0Qgc3RydWN0IGlzIGEgY2xhc3MgdGhhdCBpcyBib3RoIGEgdHJpdmlhbCBjbGFzcyBhbmQgYSAKICAgICAvLyAgIHN0YW5kYXJkLWxheW91dCBjbGFzcywgYW5kIGhhcyBubyBub24tc3RhdGljIGRhdGEgbWVtYmVycyBvZiB0eXBlIApAQCAtNjkyLDcgKzY5Niw5IEBACiAgICAgaWYgKCFULT5pc0xpdGVyYWxUeXBlKENvbnRleHQpIHx8IFQuaXNWb2xhdGlsZVF1YWxpZmllZCgpKQogICAgICAgZGF0YSgpLkhhc05vbkxpdGVyYWxUeXBlRmllbGRzT3JCYXNlcyA9IHRydWU7CiAKLSAgICBpZiAoRmllbGQtPmhhc0luQ2xhc3NJbml0aWFsaXplcigpKSB7CisgICAgaWYgKEZpZWxkLT5oYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSB8fAorICAgICAgICAoRmllbGQtPmlzQW5vbnltb3VzU3RydWN0T3JVbmlvbigpICYmCisgICAgICAgICBGaWVsZC0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKS0+aGFzSW5DbGFzc0luaXRpYWxpemVyKCkpKSB7CiAgICAgICBkYXRhKCkuSGFzSW5DbGFzc0luaXRpYWxpemVyID0gdHJ1ZTsKIAogICAgICAgLy8gQysrMTEgW2NsYXNzXXA1OgpAQCAtODA5LDE1ICs4MTUsMTMgQEAKICAgICAgICAgLy8gVmlydHVhbCBiYXNlcyBhbmQgdmlydHVhbCBtZXRob2RzIG1ha2UgYSBjbGFzcyBub24tZW1wdHksIGJ1dCB0aGV5CiAgICAgICAgIC8vIGFsc28gbWFrZSBpdCBub24tc3RhbmRhcmQtbGF5b3V0IHNvIHdlIG5lZWRuJ3QgY2hlY2sgaGVyZS4KICAgICAgICAgLy8gQSBub24tZW1wdHkgYmFzZSBjbGFzcyBtYXkgbGVhdmUgdGhlIGNsYXNzIHN0YW5kYXJkLWxheW91dCwgYnV0IG5vdAotICAgICAgICAvLyBpZiB3ZSBoYXZlIGFycml2ZWQgaGVyZSwgYW5kIGhhdmUgYXQgbGVhc3Qgb24gbm9uLXN0YXRpYyBkYXRhCisgICAgICAgIC8vIGlmIHdlIGhhdmUgYXJyaXZlZCBoZXJlLCBhbmQgaGF2ZSBhdCBsZWFzdCBvbmUgbm9uLXN0YXRpYyBkYXRhCiAgICAgICAgIC8vIG1lbWJlci4gSWYgSXNTdGFuZGFyZExheW91dCByZW1haW5zIHRydWUsIHRoZW4gdGhlIGZpcnN0IG5vbi1zdGF0aWMKICAgICAgICAgLy8gZGF0YSBtZW1iZXIgbXVzdCBjb21lIHRocm91Z2ggaGVyZSB3aXRoIEVtcHR5IHN0aWxsIHRydWUsIGFuZCBFbXB0eQogICAgICAgICAvLyB3aWxsIHN1YnNlcXVlbnRseSBiZSBzZXQgdG8gZmFsc2UgYmVsb3cuCiAgICAgICAgIGlmIChkYXRhKCkuSXNTdGFuZGFyZExheW91dCAmJiBkYXRhKCkuRW1wdHkpIHsKLSAgICAgICAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgQkkgPSBiYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRSA9IGJhc2VzX2VuZCgpOwotICAgICAgICAgICAgICAgQkkgIT0gQkU7ICsrQkkpIHsKLSAgICAgICAgICAgIGlmIChDb250ZXh0Lmhhc1NhbWVVbnF1YWxpZmllZFR5cGUoQkktPmdldFR5cGUoKSwgVCkpIHsKKyAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJkJJIDogYmFzZXMoKSkgeworICAgICAgICAgICAgaWYgKENvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShCSS5nZXRUeXBlKCksIFQpKSB7CiAgICAgICAgICAgICAgIGRhdGEoKS5Jc1N0YW5kYXJkTGF5b3V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtODYyLDYgKzg2NiwxMyBAQAogICAgICAgICBpZiAoRmllbGRSZWMtPmhhc1VuaW5pdGlhbGl6ZWRSZWZlcmVuY2VNZW1iZXIoKSAmJgogICAgICAgICAgICAgIUZpZWxkLT5oYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSkKICAgICAgICAgICBkYXRhKCkuSGFzVW5pbml0aWFsaXplZFJlZmVyZW5jZU1lbWJlciA9IHRydWU7CisKKyAgICAgICAgLy8gQysrMTEgW2NsYXNzLnVuaW9uXXA4LCBEUjE0NjA6CisgICAgICAgIC8vICAgYSBub24tc3RhdGljIGRhdGEgbWVtYmVyIG9mIGFuIGFub255bW91cyB1bmlvbiB0aGF0IGlzIGEgbWVtYmVyIG9mCisgICAgICAgIC8vICAgWCBpcyBhbHNvIGEgdmFyaWFudCBtZW1iZXIgb2YgWC4KKyAgICAgICAgaWYgKEZpZWxkUmVjLT5oYXNWYXJpYW50TWVtYmVycygpICYmCisgICAgICAgICAgICBGaWVsZC0+aXNBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKCkpCisgICAgICAgICAgZGF0YSgpLkhhc1ZhcmlhbnRNZW1iZXJzID0gdHJ1ZTsKICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgLy8gQmFzZSBlbGVtZW50IHR5cGUgb2YgZmllbGQgaXMgYSBub24tY2xhc3MgdHlwZS4KQEAgLTkyOCw5ICs5MzksMTEgQEAKICAgICBlbHNlIGlmIChDb25zdHJ1Y3Rvci0+aXNDb25zdGV4cHIoKSkKICAgICAgIC8vIFdlIG1heSBub3cga25vdyB0aGF0IHRoZSBjb25zdHJ1Y3RvciBpcyBjb25zdGV4cHIuCiAgICAgICBkYXRhKCkuSGFzQ29uc3RleHByTm9uQ29weU1vdmVDb25zdHJ1Y3RvciA9IHRydWU7Ci0gIH0gZWxzZSBpZiAoaXNhPENYWERlc3RydWN0b3JEZWNsPihEKSkKKyAgfSBlbHNlIGlmIChpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KEQpKSB7CiAgICAgU01LaW5kIHw9IFNNRl9EZXN0cnVjdG9yOwotICBlbHNlIGlmIChELT5pc0NvcHlBc3NpZ25tZW50T3BlcmF0b3IoKSkKKyAgICBpZiAoIUQtPmlzVHJpdmlhbCgpIHx8IEQtPmdldEFjY2VzcygpICE9IEFTX3B1YmxpYyB8fCBELT5pc0RlbGV0ZWQoKSkKKyAgICAgIGRhdGEoKS5IYXNJcnJlbGV2YW50RGVzdHJ1Y3RvciA9IGZhbHNlOworICB9IGVsc2UgaWYgKEQtPmlzQ29weUFzc2lnbm1lbnRPcGVyYXRvcigpKQogICAgIFNNS2luZCB8PSBTTUZfQ29weUFzc2lnbm1lbnQ7CiAgIGVsc2UgaWYgKEQtPmlzTW92ZUFzc2lnbm1lbnRPcGVyYXRvcigpKQogICAgIFNNS2luZCB8PSBTTUZfTW92ZUFzc2lnbm1lbnQ7CkBAIC0xMDE4LDEzICsxMDMxLDkgQEAKIH0KIAogc3RhdGljIENhblF1YWxUeXBlIEdldENvbnZlcnNpb25UeXBlKEFTVENvbnRleHQgJkNvbnRleHQsIE5hbWVkRGVjbCAqQ29udikgewotICBRdWFsVHlwZSBUOwotICBpZiAoaXNhPFVzaW5nU2hhZG93RGVjbD4oQ29udikpCi0gICAgQ29udiA9IGNhc3Q8VXNpbmdTaGFkb3dEZWNsPihDb252KS0+Z2V0VGFyZ2V0RGVjbCgpOwotICBpZiAoRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkNvbnZUZW1wID0gZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KENvbnYpKQotICAgIFQgPSBDb252VGVtcC0+Z2V0VGVtcGxhdGVkRGVjbCgpLT5nZXRSZXN1bHRUeXBlKCk7Ci0gIGVsc2UgCi0gICAgVCA9IGNhc3Q8Q1hYQ29udmVyc2lvbkRlY2w+KENvbnYpLT5nZXRDb252ZXJzaW9uVHlwZSgpOworICBRdWFsVHlwZSBUID0KKyAgICAgIGNhc3Q8Q1hYQ29udmVyc2lvbkRlY2w+KENvbnYtPmdldFVuZGVybHlpbmdEZWNsKCktPmdldEFzRnVuY3Rpb24oKSkKKyAgICAgICAgICAtPmdldENvbnZlcnNpb25UeXBlKCk7CiAgIHJldHVybiBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoVCk7CiB9CiAKQEAgLTEwODcsMTQgKzEwOTYsMTMgQEAKICAgfQogCiAgIC8vIENvbGxlY3QgaW5mb3JtYXRpb24gcmVjdXJzaXZlbHkgZnJvbSBhbnkgYmFzZSBjbGFzc2VzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IKLSAgICAgICAgIEkgPSBSZWNvcmQtPmJhc2VzX2JlZ2luKCksIEUgPSBSZWNvcmQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGNvbnN0IFJlY29yZFR5cGUgKlJUID0gSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpOworICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSZWNvcmQtPmJhc2VzKCkpIHsKKyAgICBjb25zdCBSZWNvcmRUeXBlICpSVCA9IEkuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpOwogICAgIGlmICghUlQpIGNvbnRpbnVlOwogCiAgICAgQWNjZXNzU3BlY2lmaWVyIEJhc2VBY2Nlc3MKLSAgICAgID0gQ1hYUmVjb3JkRGVjbDo6TWVyZ2VBY2Nlc3MoQWNjZXNzLCBJLT5nZXRBY2Nlc3NTcGVjaWZpZXIoKSk7Ci0gICAgYm9vbCBCYXNlSW5WaXJ0dWFsID0gSW5WaXJ0dWFsIHx8IEktPmlzVmlydHVhbCgpOworICAgICAgPSBDWFhSZWNvcmREZWNsOjpNZXJnZUFjY2VzcyhBY2Nlc3MsIEkuZ2V0QWNjZXNzU3BlY2lmaWVyKCkpOworICAgIGJvb2wgQmFzZUluVmlydHVhbCA9IEluVmlydHVhbCB8fCBJLmlzVmlydHVhbCgpOwogCiAgICAgQ1hYUmVjb3JkRGVjbCAqQmFzZSA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oUlQtPmdldERlY2woKSk7CiAgICAgQ29sbGVjdFZpc2libGVDb252ZXJzaW9ucyhDb250ZXh0LCBCYXNlLCBCYXNlSW5WaXJ0dWFsLCBCYXNlQWNjZXNzLApAQCAtMTEzMCwxMyArMTEzOCwxMiBAQAogICAgIEhpZGRlblR5cGVzLmluc2VydChHZXRDb252ZXJzaW9uVHlwZShDb250ZXh0LCBDb252SS5nZXREZWNsKCkpKTsKIAogICAvLyBSZWN1cnNpdmVseSBjb2xsZWN0IGNvbnZlcnNpb25zIGZyb20gYmFzZSBjbGFzc2VzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IKLSAgICAgICAgIEkgPSBSZWNvcmQtPmJhc2VzX2JlZ2luKCksIEUgPSBSZWNvcmQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGNvbnN0IFJlY29yZFR5cGUgKlJUID0gSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpOworICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSZWNvcmQtPmJhc2VzKCkpIHsKKyAgICBjb25zdCBSZWNvcmRUeXBlICpSVCA9IEkuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpOwogICAgIGlmICghUlQpIGNvbnRpbnVlOwogCiAgICAgQ29sbGVjdFZpc2libGVDb252ZXJzaW9ucyhDb250ZXh0LCBjYXN0PENYWFJlY29yZERlY2w+KFJULT5nZXREZWNsKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSS0+aXNWaXJ0dWFsKCksIEktPmdldEFjY2Vzc1NwZWNpZmllcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSS5pc1ZpcnR1YWwoKSwgSS5nZXRBY2Nlc3NTcGVjaWZpZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpZGRlblR5cGVzLCBPdXRwdXQsIFZCYXNlQ3MsIEhpZGRlblZCYXNlQ3MpOwogICB9CiAKQEAgLTEzMTcsMTEgKzEzMjQsOSBAQAogICAgICAgaXNEZXBlbmRlbnRDb250ZXh0KCkpCiAgICAgcmV0dXJuIGZhbHNlOwogICAKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEIgPSBiYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVuZCA9IGJhc2VzX2VuZCgpOwotICAgICAgIEIgIT0gQkVuZDsgKytCKSB7CisgIGZvciAoY29uc3QgYXV0byAmQiA6IGJhc2VzKCkpIHsKICAgICBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCAKLSAgICAgID0gY2FzdDxDWFhSZWNvcmREZWNsPihCLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oQi5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CiAgICAgaWYgKEJhc2VEZWNsLT5pc0Fic3RyYWN0KCkpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtMTM4Myw5ICsxMzg4LDggQEAKICAgICAgIHJldHVybiBNRDsKICAgfQogCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICBFID0gUkQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGNvbnN0IFJlY29yZFR5cGUgKlJUID0gSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpOworICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSRC0+YmFzZXMoKSkgeworICAgIGNvbnN0IFJlY29yZFR5cGUgKlJUID0gSS5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCk7CiAgICAgaWYgKCFSVCkKICAgICAgIGNvbnRpbnVlOwogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2UgPSBjYXN0PENYWFJlY29yZERlY2w+KFJULT5nZXREZWNsKCkpOwpAQCAtMTQwNCwxNyArMTQwOCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlQ2xhc3MgU0MsIGJvb2wgaXNJbmxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0NvbnN0ZXhwciwgU291cmNlTG9jYXRpb24gRW5kTG9jYXRpb24pIHsKLSAgcmV0dXJuIG5ldyAoQykgQ1hYTWV0aG9kRGVjbChDWFhNZXRob2QsIFJELCBTdGFydExvYywgTmFtZUluZm8sIFQsIFRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDLCBpc0lubGluZSwgaXNDb25zdGV4cHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kTG9jYXRpb24pOworICByZXR1cm4gbmV3IChDLCBSRCkgQ1hYTWV0aG9kRGVjbChDWFhNZXRob2QsIFJELCBTdGFydExvYywgTmFtZUluZm8sIFQsIFRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQywgaXNJbmxpbmUsIGlzQ29uc3RleHByLCBFbmRMb2NhdGlvbik7CiB9CiAKIENYWE1ldGhvZERlY2wgKkNYWE1ldGhvZERlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihDWFhNZXRob2REZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgQ1hYTWV0aG9kRGVjbChDWFhNZXRob2QsIDAsIFNvdXJjZUxvY2F0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lSW5mbygpLCBRdWFsVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU0NfTm9uZSwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSk7CisgIHJldHVybiBuZXcgKEMsIElEKSBDWFhNZXRob2REZWNsKENYWE1ldGhvZCwgMCwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lSW5mbygpLCBRdWFsVHlwZSgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ19Ob25lLCBmYWxzZSwgZmFsc2UsIFNvdXJjZUxvY2F0aW9uKCkpOwogfQogCiBib29sIENYWE1ldGhvZERlY2w6OmlzVXN1YWxEZWFsbG9jYXRpb25GdW5jdGlvbigpIGNvbnN0IHsKQEAgLTE2NzcsOSArMTY3OCw5IEBACiAKIENYWENvbnN0cnVjdG9yRGVjbCAqCiBDWFhDb25zdHJ1Y3RvckRlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihDWFhDb25zdHJ1Y3RvckRlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBDWFhDb25zdHJ1Y3RvckRlY2woMCwgU291cmNlTG9jYXRpb24oKSxEZWNsYXJhdGlvbk5hbWVJbmZvKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlKCksIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsZmFsc2UpOworICByZXR1cm4gbmV3IChDLCBJRCkgQ1hYQ29uc3RydWN0b3JEZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lSW5mbygpLCBRdWFsVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKIH0KIAogQ1hYQ29uc3RydWN0b3JEZWNsICoKQEAgLTE2OTIsOSArMTY5Myw5IEBACiAgIGFzc2VydChOYW1lSW5mby5nZXROYW1lKCkuZ2V0TmFtZUtpbmQoKQogICAgICAgICAgPT0gRGVjbGFyYXRpb25OYW1lOjpDWFhDb25zdHJ1Y3Rvck5hbWUgJiYKICAgICAgICAgICJOYW1lIG11c3QgcmVmZXIgdG8gYSBjb25zdHJ1Y3RvciIpOwotICByZXR1cm4gbmV3IChDKSBDWFhDb25zdHJ1Y3RvckRlY2woUkQsIFN0YXJ0TG9jLCBOYW1lSW5mbywgVCwgVEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4cGxpY2l0LCBpc0lubGluZSwgaXNJbXBsaWNpdGx5RGVjbGFyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbnN0ZXhwcik7CisgIHJldHVybiBuZXcgKEMsIFJEKSBDWFhDb25zdHJ1Y3RvckRlY2woUkQsIFN0YXJ0TG9jLCBOYW1lSW5mbywgVCwgVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHBsaWNpdCwgaXNJbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbXBsaWNpdGx5RGVjbGFyZWQsIGlzQ29uc3RleHByKTsKIH0KIAogQ1hYQ29uc3RydWN0b3JEZWNsICpDWFhDb25zdHJ1Y3RvckRlY2w6OmdldFRhcmdldENvbnN0cnVjdG9yKCkgY29uc3QgewpAQCAtMTgyNyw5ICsxODI4LDggQEAKIAogQ1hYRGVzdHJ1Y3RvckRlY2wgKgogQ1hYRGVzdHJ1Y3RvckRlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihDWFhEZXN0cnVjdG9yRGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIENYWERlc3RydWN0b3JEZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIERlY2xhcmF0aW9uTmFtZUluZm8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUoKSwgMCwgZmFsc2UsIGZhbHNlKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIENYWERlc3RydWN0b3JEZWNsKAorICAgICAgMCwgU291cmNlTG9jYXRpb24oKSwgRGVjbGFyYXRpb25OYW1lSW5mbygpLCBRdWFsVHlwZSgpLCAwLCBmYWxzZSwgZmFsc2UpOwogfQogCiBDWFhEZXN0cnVjdG9yRGVjbCAqCkBAIC0xODQxLDE4ICsxODQxLDE4IEBACiAgIGFzc2VydChOYW1lSW5mby5nZXROYW1lKCkuZ2V0TmFtZUtpbmQoKQogICAgICAgICAgPT0gRGVjbGFyYXRpb25OYW1lOjpDWFhEZXN0cnVjdG9yTmFtZSAmJgogICAgICAgICAgIk5hbWUgbXVzdCByZWZlciB0byBhIGRlc3RydWN0b3IiKTsKLSAgcmV0dXJuIG5ldyAoQykgQ1hYRGVzdHJ1Y3RvckRlY2woUkQsIFN0YXJ0TG9jLCBOYW1lSW5mbywgVCwgVEluZm8sIGlzSW5saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ltcGxpY2l0bHlEZWNsYXJlZCk7CisgIHJldHVybiBuZXcgKEMsIFJEKSBDWFhEZXN0cnVjdG9yRGVjbChSRCwgU3RhcnRMb2MsIE5hbWVJbmZvLCBULCBUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5saW5lLCBpc0ltcGxpY2l0bHlEZWNsYXJlZCk7CiB9CiAKIHZvaWQgQ1hYQ29udmVyc2lvbkRlY2w6OmFuY2hvcigpIHsgfQogCiBDWFhDb252ZXJzaW9uRGVjbCAqCiBDWFhDb252ZXJzaW9uRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKENYWENvbnZlcnNpb25EZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgQ1hYQ29udmVyc2lvbkRlY2woMCwgU291cmNlTG9jYXRpb24oKSwgRGVjbGFyYXRpb25OYW1lSW5mbygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlKCksIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSk7CisgIHJldHVybiBuZXcgKEMsIElEKSBDWFhDb252ZXJzaW9uRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lSW5mbygpLCBRdWFsVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCkpOwogfQogCiBDWFhDb252ZXJzaW9uRGVjbCAqCkBAIC0xODY1LDkgKzE4NjUsOSBAQAogICBhc3NlcnQoTmFtZUluZm8uZ2V0TmFtZSgpLmdldE5hbWVLaW5kKCkKICAgICAgICAgID09IERlY2xhcmF0aW9uTmFtZTo6Q1hYQ29udmVyc2lvbkZ1bmN0aW9uTmFtZSAmJgogICAgICAgICAgIk5hbWUgbXVzdCByZWZlciB0byBhIGNvbnZlcnNpb24gZnVuY3Rpb24iKTsKLSAgcmV0dXJuIG5ldyAoQykgQ1hYQ29udmVyc2lvbkRlY2woUkQsIFN0YXJ0TG9jLCBOYW1lSW5mbywgVCwgVEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5saW5lLCBpc0V4cGxpY2l0LCBpc0NvbnN0ZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kTG9jYXRpb24pOworICByZXR1cm4gbmV3IChDLCBSRCkgQ1hYQ29udmVyc2lvbkRlY2woUkQsIFN0YXJ0TG9jLCBOYW1lSW5mbywgVCwgVEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lubGluZSwgaXNFeHBsaWNpdCwgaXNDb25zdGV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2NhdGlvbik7CiB9CiAKIGJvb2wgQ1hYQ29udmVyc2lvbkRlY2w6OmlzTGFtYmRhVG9CbG9ja1BvaW50ZXJDb252ZXJzaW9uKCkgY29uc3QgewpAQCAtMTg4MywxMyArMTg4MywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMYW5nTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZUlEcyBMYW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0JyYWNlcykgewotICByZXR1cm4gbmV3IChDKSBMaW5rYWdlU3BlY0RlY2woREMsIEV4dGVybkxvYywgTGFuZ0xvYywgTGFuZywgSGFzQnJhY2VzKTsKKyAgcmV0dXJuIG5ldyAoQywgREMpIExpbmthZ2VTcGVjRGVjbChEQywgRXh0ZXJuTG9jLCBMYW5nTG9jLCBMYW5nLCBIYXNCcmFjZXMpOwogfQogCi1MaW5rYWdlU3BlY0RlY2wgKkxpbmthZ2VTcGVjRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKExpbmthZ2VTcGVjRGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIExpbmthZ2VTcGVjRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5nX2MsIGZhbHNlKTsKK0xpbmthZ2VTcGVjRGVjbCAqTGlua2FnZVNwZWNEZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIExpbmthZ2VTcGVjRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmdfYywgZmFsc2UpOwogfQogCiB2b2lkIFVzaW5nRGlyZWN0aXZlRGVjbDo6YW5jaG9yKCkgeyB9CkBAIC0xOTAzLDE2ICsxOTAzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpDb21tb25BbmNlc3RvcikgewogICBpZiAoTmFtZXNwYWNlRGVjbCAqTlMgPSBkeW5fY2FzdF9vcl9udWxsPE5hbWVzcGFjZURlY2w+KFVzZWQpKQogICAgIFVzZWQgPSBOUy0+Z2V0T3JpZ2luYWxOYW1lc3BhY2UoKTsKLSAgcmV0dXJuIG5ldyAoQykgVXNpbmdEaXJlY3RpdmVEZWNsKERDLCBMLCBOYW1lc3BhY2VMb2MsIFF1YWxpZmllckxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50TG9jLCBVc2VkLCBDb21tb25BbmNlc3Rvcik7CisgIHJldHVybiBuZXcgKEMsIERDKSBVc2luZ0RpcmVjdGl2ZURlY2woREMsIEwsIE5hbWVzcGFjZUxvYywgUXVhbGlmaWVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50TG9jLCBVc2VkLCBDb21tb25BbmNlc3Rvcik7CiB9CiAKLVVzaW5nRGlyZWN0aXZlRGVjbCAqCi1Vc2luZ0RpcmVjdGl2ZURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihVc2luZ0RpcmVjdGl2ZURlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBVc2luZ0RpcmVjdGl2ZURlY2woMCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCAwLCAwKTsKK1VzaW5nRGlyZWN0aXZlRGVjbCAqVXNpbmdEaXJlY3RpdmVEZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIFVzaW5nRGlyZWN0aXZlRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCAwLCAwKTsKIH0KIAogTmFtZXNwYWNlRGVjbCAqVXNpbmdEaXJlY3RpdmVEZWNsOjpnZXROb21pbmF0ZWROYW1lc3BhY2UoKSB7CkBAIC0xOTIyLDggKzE5MjEsNiBAQAogICByZXR1cm4gY2FzdF9vcl9udWxsPE5hbWVzcGFjZURlY2w+KE5vbWluYXRlZE5hbWVzcGFjZSk7CiB9CiAKLXZvaWQgTmFtZXNwYWNlRGVjbDo6YW5jaG9yKCkgeyB9Ci0KIE5hbWVzcGFjZURlY2w6Ok5hbWVzcGFjZURlY2woRGVjbENvbnRleHQgKkRDLCBib29sIElubGluZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywgSWRlbnRpZmllckluZm8gKklkLApAQCAtMTk0MSwxMyArMTkzOCwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5saW5lLCBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYywgSWRlbnRpZmllckluZm8gKklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZURlY2wgKlByZXZEZWNsKSB7Ci0gIHJldHVybiBuZXcgKEMpIE5hbWVzcGFjZURlY2woREMsIElubGluZSwgU3RhcnRMb2MsIElkTG9jLCBJZCwgUHJldkRlY2wpOworICByZXR1cm4gbmV3IChDLCBEQykgTmFtZXNwYWNlRGVjbChEQywgSW5saW5lLCBTdGFydExvYywgSWRMb2MsIElkLCBQcmV2RGVjbCk7CiB9CiAKIE5hbWVzcGFjZURlY2wgKk5hbWVzcGFjZURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihOYW1lc3BhY2VEZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgTmFtZXNwYWNlRGVjbCgwLCBmYWxzZSwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIE5hbWVzcGFjZURlY2woMCwgZmFsc2UsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworfQorCitOYW1lc3BhY2VEZWNsICpOYW1lc3BhY2VEZWNsOjpnZXROZXh0UmVkZWNsYXJhdGlvbigpIHsKKyAgcmV0dXJuIFJlZGVjbExpbmsuZ2V0TmV4dCgpOworfQorTmFtZXNwYWNlRGVjbCAqTmFtZXNwYWNlRGVjbDo6Z2V0UHJldmlvdXNEZWNsSW1wbCgpIHsKKyAgcmV0dXJuIGdldFByZXZpb3VzRGVjbCgpOworfQorTmFtZXNwYWNlRGVjbCAqTmFtZXNwYWNlRGVjbDo6Z2V0TW9zdFJlY2VudERlY2xJbXBsKCkgeworICByZXR1cm4gZ2V0TW9zdFJlY2VudERlY2woKTsKIH0KIAogdm9pZCBOYW1lc3BhY2VBbGlhc0RlY2w6OmFuY2hvcigpIHsgfQpAQCAtMTk2MSwyNCArMTk2NywyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKk5hbWVzcGFjZSkgewogICBpZiAoTmFtZXNwYWNlRGVjbCAqTlMgPSBkeW5fY2FzdF9vcl9udWxsPE5hbWVzcGFjZURlY2w+KE5hbWVzcGFjZSkpCiAgICAgTmFtZXNwYWNlID0gTlMtPmdldE9yaWdpbmFsTmFtZXNwYWNlKCk7Ci0gIHJldHVybiBuZXcgKEMpIE5hbWVzcGFjZUFsaWFzRGVjbChEQywgVXNpbmdMb2MsIEFsaWFzTG9jLCBBbGlhcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZXJMb2MsIElkZW50TG9jLCBOYW1lc3BhY2UpOworICByZXR1cm4gbmV3IChDLCBEQykgTmFtZXNwYWNlQWxpYXNEZWNsKERDLCBVc2luZ0xvYywgQWxpYXNMb2MsIEFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxpZmllckxvYywgSWRlbnRMb2MsIE5hbWVzcGFjZSk7CiB9CiAKIE5hbWVzcGFjZUFsaWFzRGVjbCAqCiBOYW1lc3BhY2VBbGlhc0RlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihOYW1lc3BhY2VBbGlhc0RlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBOYW1lc3BhY2VBbGlhc0RlY2woMCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgMCk7CisgIHJldHVybiBuZXcgKEMsIElEKSBOYW1lc3BhY2VBbGlhc0RlY2woMCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgMCk7CiB9CiAKIHZvaWQgVXNpbmdTaGFkb3dEZWNsOjphbmNob3IoKSB7IH0KIAogVXNpbmdTaGFkb3dEZWNsICoKIFVzaW5nU2hhZG93RGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKFVzaW5nU2hhZG93RGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIFVzaW5nU2hhZG93RGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCAwLCAwKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIFVzaW5nU2hhZG93RGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCAwLCAwKTsKIH0KIAogVXNpbmdEZWNsICpVc2luZ1NoYWRvd0RlY2w6OmdldFVzaW5nRGVjbCgpIGNvbnN0IHsKQEAgLTIwMjYsMTMgKzIwMzAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBRdWFsaWZpZXJMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTmFtZUluZm8gJk5hbWVJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1R5cGVuYW1lKSB7Ci0gIHJldHVybiBuZXcgKEMpIFVzaW5nRGVjbChEQywgVUwsIFF1YWxpZmllckxvYywgTmFtZUluZm8sIEhhc1R5cGVuYW1lKTsKKyAgcmV0dXJuIG5ldyAoQywgREMpIFVzaW5nRGVjbChEQywgVUwsIFF1YWxpZmllckxvYywgTmFtZUluZm8sIEhhc1R5cGVuYW1lKTsKIH0KIAogVXNpbmdEZWNsICpVc2luZ0RlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihVc2luZ0RlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBVc2luZ0RlY2woMCwgU291cmNlTG9jYXRpb24oKSwgTmVzdGVkTmFtZVNwZWNpZmllckxvYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWVJbmZvKCksIGZhbHNlKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIFVzaW5nRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lSW5mbygpLCBmYWxzZSk7CiB9CiAKIFNvdXJjZVJhbmdlIFVzaW5nRGVjbDo6Z2V0U291cmNlUmFuZ2UoKSBjb25zdCB7CkBAIC0yMDQ4LDE1ICsyMDUxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBVc2luZ0xvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbGFyYXRpb25OYW1lSW5mbyAmTmFtZUluZm8pIHsKLSAgcmV0dXJuIG5ldyAoQykgVW5yZXNvbHZlZFVzaW5nVmFsdWVEZWNsKERDLCBDLkRlcGVuZGVudFR5LCBVc2luZ0xvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxpZmllckxvYywgTmFtZUluZm8pOworICByZXR1cm4gbmV3IChDLCBEQykgVW5yZXNvbHZlZFVzaW5nVmFsdWVEZWNsKERDLCBDLkRlcGVuZGVudFR5LCBVc2luZ0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZXJMb2MsIE5hbWVJbmZvKTsKIH0KIAogVW5yZXNvbHZlZFVzaW5nVmFsdWVEZWNsICoKIFVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKFVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIFVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbCgwLCBRdWFsVHlwZSgpLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKCksCisgIHJldHVybiBuZXcgKEMsIElEKSBVbnJlc29sdmVkVXNpbmdWYWx1ZURlY2woMCwgUXVhbFR5cGUoKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZUluZm8oKSk7CiB9CiAKQEAgLTIwNzUsMjAgKzIwNzcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MgUXVhbGlmaWVyTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGFyZ2V0TmFtZUxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSBUYXJnZXROYW1lKSB7Ci0gIHJldHVybiBuZXcgKEMpIFVucmVzb2x2ZWRVc2luZ1R5cGVuYW1lRGVjbChEQywgVXNpbmdMb2MsIFR5cGVuYW1lTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVyTG9jLCBUYXJnZXROYW1lTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TmFtZS5nZXRBc0lkZW50aWZpZXJJbmZvKCkpOworICByZXR1cm4gbmV3IChDLCBEQykgVW5yZXNvbHZlZFVzaW5nVHlwZW5hbWVEZWNsKAorICAgICAgREMsIFVzaW5nTG9jLCBUeXBlbmFtZUxvYywgUXVhbGlmaWVyTG9jLCBUYXJnZXROYW1lTG9jLAorICAgICAgVGFyZ2V0TmFtZS5nZXRBc0lkZW50aWZpZXJJbmZvKCkpOwogfQogCiBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wgKgogVW5yZXNvbHZlZFVzaW5nVHlwZW5hbWVEZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2woMCwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIFVucmVzb2x2ZWRVc2luZ1R5cGVuYW1lRGVjbCgKKyAgICAgIDAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoKSwKKyAgICAgIFNvdXJjZUxvY2F0aW9uKCksIDApOwogfQogCiB2b2lkIFN0YXRpY0Fzc2VydERlY2w6OmFuY2hvcigpIHsgfQpAQCAtMjA5OSwxNSArMjA5NywyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgKk1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRmFpbGVkKSB7Ci0gIHJldHVybiBuZXcgKEMpIFN0YXRpY0Fzc2VydERlY2woREMsIFN0YXRpY0Fzc2VydExvYywgQXNzZXJ0RXhwciwgTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUGFyZW5Mb2MsIEZhaWxlZCk7CisgIHJldHVybiBuZXcgKEMsIERDKSBTdGF0aWNBc3NlcnREZWNsKERDLCBTdGF0aWNBc3NlcnRMb2MsIEFzc2VydEV4cHIsIE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQYXJlbkxvYywgRmFpbGVkKTsKIH0KIAotU3RhdGljQXNzZXJ0RGVjbCAqU3RhdGljQXNzZXJ0RGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIAorU3RhdGljQXNzZXJ0RGVjbCAqU3RhdGljQXNzZXJ0RGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoU3RhdGljQXNzZXJ0RGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIFN0YXRpY0Fzc2VydERlY2woMCwgU291cmNlTG9jYXRpb24oKSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIGZhbHNlKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIFN0YXRpY0Fzc2VydERlY2woMCwgU291cmNlTG9jYXRpb24oKSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgZmFsc2UpOworfQorCitNU1Byb3BlcnR5RGVjbCAqTVNQcm9wZXJ0eURlY2w6OkNyZWF0ZShBU1RDb250ZXh0ICZDLCBEZWNsQ29udGV4dCAqREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMLCBEZWNsYXJhdGlvbk5hbWUgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpHZXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqU2V0dGVyKSB7CisgIHJldHVybiBuZXcgKEMsIERDKSBNU1Byb3BlcnR5RGVjbChEQywgTCwgTiwgVCwgVEluZm8sIFN0YXJ0TCwgR2V0dGVyLCBTZXR0ZXIpOworfQorCitNU1Byb3BlcnR5RGVjbCAqTVNQcm9wZXJ0eURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIE1TUHJvcGVydHlEZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIERlY2xhcmF0aW9uTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUoKSwgMCwgU291cmNlTG9jYXRpb24oKSwgMCwgMCk7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICpnZXRBY2Nlc3NOYW1lKEFjY2Vzc1NwZWNpZmllciBBUykgewpkaWZmIC0tZ2l0IGEvbGliL0FTVC9EZWNsRnJpZW5kLmNwcCBiL2xpYi9BU1QvRGVjbEZyaWVuZC5jcHAKaW5kZXggMWM2MzlkNi4uMDIzNzRjNyAxMDA2NDQKLS0tIGEvbGliL0FTVC9EZWNsRnJpZW5kLmNwcAorKysgYi9saWIvQVNUL0RlY2xGcmllbmQuY3BwCkBAIC00NiwyMSArNDYsMTcgQEAKICAgfQogI2VuZGlmCiAKLSAgc3RkOjpzaXplX3QgU2l6ZSA9IHNpemVvZihGcmllbmREZWNsKQotICAgICsgRnJpZW5kVHlwZVRQTGlzdHMuc2l6ZSgpICogc2l6ZW9mKFRlbXBsYXRlUGFyYW1ldGVyTGlzdCopOwotICB2b2lkICpNZW0gPSBDLkFsbG9jYXRlKFNpemUpOwotICBGcmllbmREZWNsICpGRCA9IG5ldyAoTWVtKSBGcmllbmREZWNsKERDLCBMLCBGcmllbmQsIEZyaWVuZEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJpZW5kVHlwZVRQTGlzdHMpOworICBzdGQ6OnNpemVfdCBFeHRyYSA9IEZyaWVuZFR5cGVUUExpc3RzLnNpemUoKSAqIHNpemVvZihUZW1wbGF0ZVBhcmFtZXRlckxpc3QqKTsKKyAgRnJpZW5kRGVjbCAqRkQgPSBuZXcgKEMsIERDLCBFeHRyYSkgRnJpZW5kRGVjbChEQywgTCwgRnJpZW5kLCBGcmllbmRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyaWVuZFR5cGVUUExpc3RzKTsKICAgY2FzdDxDWFhSZWNvcmREZWNsPihEQyktPnB1c2hGcmllbmREZWNsKEZEKTsKICAgcmV0dXJuIEZEOwogfQogCiBGcmllbmREZWNsICpGcmllbmREZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRnJpZW5kVHlwZU51bVRQTGlzdHMpIHsKLSAgc3RkOjpzaXplX3QgU2l6ZSA9IHNpemVvZihGcmllbmREZWNsKQotICAgICsgRnJpZW5kVHlwZU51bVRQTGlzdHMgKiBzaXplb2YoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0Kik7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgU2l6ZSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgRnJpZW5kRGVjbChFbXB0eVNoZWxsKCksIEZyaWVuZFR5cGVOdW1UUExpc3RzKTsKKyAgc3RkOjpzaXplX3QgRXh0cmEgPSBGcmllbmRUeXBlTnVtVFBMaXN0cyAqIHNpemVvZihUZW1wbGF0ZVBhcmFtZXRlckxpc3QqKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQsIEV4dHJhKSBGcmllbmREZWNsKEVtcHR5U2hlbGwoKSwgRnJpZW5kVHlwZU51bVRQTGlzdHMpOwogfQogCiBGcmllbmREZWNsICpDWFhSZWNvcmREZWNsOjpnZXRGaXJzdEZyaWVuZCgpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL2xpYi9BU1QvRGVjbE9iakMuY3BwIGIvbGliL0FTVC9EZWNsT2JqQy5jcHAKaW5kZXggYjJiNWI3MC4uYzUzZGJhMyAxMDA2NDQKLS0tIGEvbGliL0FTVC9EZWNsT2JqQy5jcHAKKysrIGIvbGliL0FTVC9EZWNsT2JqQy5jcHAKQEAgLTExMiwxMSArMTEyLDcgQEAKICAgaWYgKGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRCA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPih0aGlzKSkgewogICAgIC8vIEFsc28gbG9vayBpbnRvIGNhdGVnb3JpZXMsIGluY2x1ZGluZyBjbGFzcyBleHRlbnNpb25zLCBsb29raW5nCiAgICAgLy8gZm9yIGEgdXNlciBkZWNsYXJlZCBpbnN0YW5jZSBtZXRob2QuCi0gICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6dmlzaWJsZV9jYXRlZ29yaWVzX2l0ZXJhdG9yCi0gICAgICAgICBDYXQgPSBJRC0+dmlzaWJsZV9jYXRlZ29yaWVzX2JlZ2luKCksCi0gICAgICAgICBDYXRFbmQgPSBJRC0+dmlzaWJsZV9jYXRlZ29yaWVzX2VuZCgpOwotICAgICAgICAgQ2F0ICE9IENhdEVuZDsKLSAgICAgICAgICsrQ2F0KSB7CisgICAgZm9yIChjb25zdCBhdXRvICpDYXQgOiBJRC0+dmlzaWJsZV9jYXRlZ29yaWVzKCkpIHsKICAgICAgIGlmIChPYmpDTWV0aG9kRGVjbCAqTUQgPSBDYXQtPmdldEluc3RhbmNlTWV0aG9kKFNlbCkpCiAgICAgICAgIGlmICghTUQtPmlzSW1wbGljaXQoKSkKICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEyNSw4ICsxMjEsNyBAQAogICAgICAgLy8gQWxzbyBzZWFyY2ggdGhyb3VnaCB0aGUgY2F0ZWdvcmllcyBsb29raW5nIGZvciBhICdyZWFkd3JpdGUnIGRlY2xhcmF0aW9uCiAgICAgICAvLyBvZiB0aGlzIHByb3BlcnR5LiBJZiBvbmUgZm91bmQsIHByZXN1bWFibHkgYSBzZXR0ZXIgd2lsbCBiZSBwcm92aWRlZAogICAgICAgLy8gKHByb3BlcnRpZXMgZGVjbGFyZWQgaW4gY2F0ZWdvcmllcyB3aWxsIG5vdCBnZXQgYXV0by1zeW50aGVzaXplZCkuCi0gICAgICBmb3IgKE9iakNDb250YWluZXJEZWNsOjpwcm9wX2l0ZXJhdG9yIFAgPSBDYXQtPnByb3BfYmVnaW4oKSwKLSAgICAgICAgICAgRSA9IENhdC0+cHJvcF9lbmQoKTsgUCAhPSBFOyArK1ApCisgICAgICBmb3IgKGNvbnN0IGF1dG8gKlAgOiBDYXQtPnByb3BlcnRpZXMoKSkKICAgICAgICAgaWYgKFAtPmdldElkZW50aWZpZXIoKSA9PSBQcm9wZXJ0eS0+Z2V0SWRlbnRpZmllcigpKSB7CiAgICAgICAgICAgaWYgKFAtPmdldFByb3BlcnR5QXR0cmlidXRlcygpICYgT2JqQ1Byb3BlcnR5RGVjbDo6T0JKQ19QUl9yZWFkd3JpdGUpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEzNSwxMyArMTMwLDEwIEBACiAgICAgfQogICAgIAogICAgIC8vIEFsc28gbG9vayBpbnRvIHByb3RvY29scywgZm9yIGEgdXNlciBkZWNsYXJlZCBpbnN0YW5jZSBtZXRob2QuCi0gICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6YWxsX3Byb3RvY29sX2l0ZXJhdG9yIFAgPQotICAgICAgICAgSUQtPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2JlZ2luKCksCi0gICAgICAgICBQRSA9IElELT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9lbmQoKTsgUCAhPSBQRTsgKytQKSB7Ci0gICAgICBPYmpDUHJvdG9jb2xEZWNsICpQcm90byA9ICgqUCk7CisgICAgZm9yIChjb25zdCBhdXRvICpQcm90byA6IElELT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbHMoKSkKICAgICAgIGlmIChQcm90by0+SGFzVXNlckRlY2xhcmVkU2V0dGVyTWV0aG9kKFByb3BlcnR5KSkKICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQorCiAgICAgLy8gQW5kIGluIGl0cyBzdXBlciBjbGFzcy4KICAgICBPYmpDSW50ZXJmYWNlRGVjbCAqT1NDID0gSUQtPmdldFN1cGVyQ2xhc3MoKTsKICAgICB3aGlsZSAoT1NDKSB7CkBAIC0xNTEsMTEgKzE0Myw5IEBACiAgICAgfQogICB9CiAgIGlmIChjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRCA9IGR5bl9jYXN0PE9iakNQcm90b2NvbERlY2w+KHRoaXMpKQotICAgIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUEkgPSBQRC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBQRC0+cHJvdG9jb2xfZW5kKCk7IFBJICE9IEU7ICsrUEkpIHsKLSAgICAgIGlmICgoKlBJKS0+SGFzVXNlckRlY2xhcmVkU2V0dGVyTWV0aG9kKFByb3BlcnR5KSkKKyAgICBmb3IgKGNvbnN0IGF1dG8gKlBJIDogUEQtPnByb3RvY29scygpKQorICAgICAgaWYgKFBJLT5IYXNVc2VyRGVjbGFyZWRTZXR0ZXJNZXRob2QoUHJvcGVydHkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9CiAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtMjA5LDI5ICsxOTksMjMgQEAKICAgICAgIGJyZWFrOwogICAgIGNhc2UgRGVjbDo6T2JqQ1Byb3RvY29sOiB7CiAgICAgICBjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQSUQgPSBjYXN0PE9iakNQcm90b2NvbERlY2w+KHRoaXMpOwotICAgICAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBJID0gUElELT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICBFID0gUElELT5wcm90b2NvbF9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgICAgIGlmIChPYmpDUHJvcGVydHlEZWNsICpQID0gKCpJKS0+RmluZFByb3BlcnR5RGVjbGFyYXRpb24oUHJvcGVydHlJZCkpCisgICAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBQSUQtPnByb3RvY29scygpKQorICAgICAgICBpZiAoT2JqQ1Byb3BlcnR5RGVjbCAqUCA9IEktPkZpbmRQcm9wZXJ0eURlY2xhcmF0aW9uKFByb3BlcnR5SWQpKQogICAgICAgICAgIHJldHVybiBQOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgRGVjbDo6T2JqQ0ludGVyZmFjZTogewogICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKk9JRCA9IGNhc3Q8T2JqQ0ludGVyZmFjZURlY2w+KHRoaXMpOwogICAgICAgLy8gTG9vayB0aHJvdWdoIGNhdGVnb3JpZXMgKGJ1dCBub3QgZXh0ZW5zaW9ucykuCi0gICAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjp2aXNpYmxlX2NhdGVnb3JpZXNfaXRlcmF0b3IKLSAgICAgICAgICAgICBDYXQgPSBPSUQtPnZpc2libGVfY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgICAgIENhdEVuZCA9IE9JRC0+dmlzaWJsZV9jYXRlZ29yaWVzX2VuZCgpOwotICAgICAgICAgICBDYXQgIT0gQ2F0RW5kOyArK0NhdCkgeworICAgICAgZm9yIChjb25zdCBhdXRvICpDYXQgOiBPSUQtPnZpc2libGVfY2F0ZWdvcmllcygpKSB7CiAgICAgICAgIGlmICghQ2F0LT5Jc0NsYXNzRXh0ZW5zaW9uKCkpCiAgICAgICAgICAgaWYgKE9iakNQcm9wZXJ0eURlY2wgKlAgPSBDYXQtPkZpbmRQcm9wZXJ0eURlY2xhcmF0aW9uKFByb3BlcnR5SWQpKQogICAgICAgICAgICAgcmV0dXJuIFA7CiAgICAgICB9CiAKICAgICAgIC8vIExvb2sgdGhyb3VnaCBwcm90b2NvbHMuCi0gICAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjphbGxfcHJvdG9jb2xfaXRlcmF0b3IKLSAgICAgICAgICAgIEkgPSBPSUQtPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2JlZ2luKCksCi0gICAgICAgICAgICBFID0gT0lELT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgICAgIGlmIChPYmpDUHJvcGVydHlEZWNsICpQID0gKCpJKS0+RmluZFByb3BlcnR5RGVjbGFyYXRpb24oUHJvcGVydHlJZCkpCisgICAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBPSUQtPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29scygpKQorICAgICAgICBpZiAoT2JqQ1Byb3BlcnR5RGVjbCAqUCA9IEktPkZpbmRQcm9wZXJ0eURlY2xhcmF0aW9uKFByb3BlcnR5SWQpKQogICAgICAgICAgIHJldHVybiBQOwogCiAgICAgICAvLyBGaW5hbGx5LCBjaGVjayB0aGUgc3VwZXIgY2xhc3MuCkBAIC0yNDMsMTEgKzIyNyw5IEBACiAgICAgICBjb25zdCBPYmpDQ2F0ZWdvcnlEZWNsICpPQ0QgPSBjYXN0PE9iakNDYXRlZ29yeURlY2w+KHRoaXMpOwogICAgICAgLy8gTG9vayB0aHJvdWdoIHByb3RvY29scy4KICAgICAgIGlmICghT0NELT5Jc0NsYXNzRXh0ZW5zaW9uKCkpCi0gICAgICAgIGZvciAoT2JqQ0NhdGVnb3J5RGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IKLSAgICAgICAgICAgICAgSSA9IE9DRC0+cHJvdG9jb2xfYmVnaW4oKSwgRSA9IE9DRC0+cHJvdG9jb2xfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgICAgICBpZiAoT2JqQ1Byb3BlcnR5RGVjbCAqUCA9ICgqSSktPkZpbmRQcm9wZXJ0eURlY2xhcmF0aW9uKFByb3BlcnR5SWQpKQotICAgICAgICAgIHJldHVybiBQOwotCisgICAgICAgIGZvciAoY29uc3QgYXV0byAqSSA6IE9DRC0+cHJvdG9jb2xzKCkpCisgICAgICAgICAgaWYgKE9iakNQcm9wZXJ0eURlY2wgKlAgPSBJLT5GaW5kUHJvcGVydHlEZWNsYXJhdGlvbihQcm9wZXJ0eUlkKSkKKyAgICAgICAgICAgIHJldHVybiBQOwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CkBAIC0yNzUsMTAgKzI1Nyw4IEBACiAgICAgcmV0dXJuIFBEOwogCiAgIC8vIExvb2sgdGhyb3VnaCBwcm90b2NvbHMuCi0gIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OmFsbF9wcm90b2NvbF9pdGVyYXRvcgotICAgICAgICBJID0gYWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgRSA9IGFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBpZiAoT2JqQ1Byb3BlcnR5RGVjbCAqUCA9ICgqSSktPkZpbmRQcm9wZXJ0eURlY2xhcmF0aW9uKFByb3BlcnR5SWQpKQorICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBhbGxfcmVmZXJlbmNlZF9wcm90b2NvbHMoKSkKKyAgICBpZiAoT2JqQ1Byb3BlcnR5RGVjbCAqUCA9IEktPkZpbmRQcm9wZXJ0eURlY2xhcmF0aW9uKFByb3BlcnR5SWQpKQogICAgICAgcmV0dXJuIFA7CiAKICAgcmV0dXJuIDA7CkBAIC0yODYsMTYgKzI2NiwxMiBAQAogCiB2b2lkIE9iakNJbnRlcmZhY2VEZWNsOjpjb2xsZWN0UHJvcGVydGllc1RvSW1wbGVtZW50KFByb3BlcnR5TWFwICZQTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZWNsT3JkZXIgJlBPKSBjb25zdCB7Ci0gIGZvciAoT2JqQ0NvbnRhaW5lckRlY2w6OnByb3BfaXRlcmF0b3IgUCA9IHByb3BfYmVnaW4oKSwKLSAgICAgIEUgPSBwcm9wX2VuZCgpOyBQICE9IEU7ICsrUCkgewotICAgIE9iakNQcm9wZXJ0eURlY2wgKlByb3AgPSAqUDsKKyAgZm9yIChhdXRvICpQcm9wIDogcHJvcGVydGllcygpKSB7CiAgICAgUE1bUHJvcC0+Z2V0SWRlbnRpZmllcigpXSA9IFByb3A7CiAgICAgUE8ucHVzaF9iYWNrKFByb3ApOwogICB9Ci0gIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OmFsbF9wcm90b2NvbF9pdGVyYXRvcgotICAgICAgUEkgPSBhbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9iZWdpbigpLAotICAgICAgRSA9IGFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2VuZCgpOyBQSSAhPSBFOyArK1BJKQotICAgICgqUEkpLT5jb2xsZWN0UHJvcGVydGllc1RvSW1wbGVtZW50KFBNLCBQTyk7CisgIGZvciAoY29uc3QgYXV0byAqUEkgOiBhbGxfcmVmZXJlbmNlZF9wcm90b2NvbHMoKSkKKyAgICBQSS0+Y29sbGVjdFByb3BlcnRpZXNUb0ltcGxlbWVudChQTSwgUE8pOwogICAvLyBOb3RlLCB0aGUgcHJvcGVydGllcyBkZWNsYXJlZCBvbmx5IGluIGNsYXNzIGV4dGVuc2lvbnMgYXJlIHN0aWxsIGNvcGllZAogICAvLyBpbnRvIHRoZSBtYWluIEBpbnRlcmZhY2UncyBwcm9wZXJ0eSBsaXN0LCBhbmQgdGhlcmVmb3JlIHdlIGRvbid0CiAgIC8vIGV4cGxpY2l0bHksIGhhdmUgdG8gc2VhcmNoIGNsYXNzIGV4dGVuc2lvbiBwcm9wZXJ0aWVzLgpAQCAtMzQxLDEwICszMTcsNyBAQAogICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRXh0TnVtOyBpKyspIHsKICAgICBib29sIHByb3RvY29sRXhpc3RzID0gZmFsc2U7CiAgICAgT2JqQ1Byb3RvY29sRGVjbCAqUHJvdG9JbkV4dGVuc2lvbiA9IEV4dExpc3RbaV07Ci0gICAgZm9yIChhbGxfcHJvdG9jb2xfaXRlcmF0b3IKLSAgICAgICAgICBwID0gYWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgICBlID0gYWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfZW5kKCk7IHAgIT0gZTsgKytwKSB7Ci0gICAgICBPYmpDUHJvdG9jb2xEZWNsICpQcm90byA9ICgqcCk7CisgICAgZm9yIChhdXRvICpQcm90byA6IGFsbF9yZWZlcmVuY2VkX3Byb3RvY29scygpKSB7CiAgICAgICBpZiAoQy5Qcm90b2NvbENvbXBhdGlibGVXaXRoUHJvdG9jb2woUHJvdG9JbkV4dGVuc2lvbiwgUHJvdG8pKSB7CiAgICAgICAgIHByb3RvY29sRXhpc3RzID0gdHJ1ZTsKICAgICAgICAgYnJlYWs7CkBAIC0zNjAsMTQgKzMzMywxMTYgQEAKICAgICByZXR1cm47CiAKICAgLy8gTWVyZ2UgUHJvdG9jb2xSZWZzIGludG8gY2xhc3MncyBwcm90b2NvbCBsaXN0OwotICBmb3IgKGFsbF9wcm90b2NvbF9pdGVyYXRvciBwID0gYWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfYmVnaW4oKSwgCi0gICAgICAgIGUgPSBhbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9lbmQoKTsgcCAhPSBlOyArK3ApIHsKLSAgICBQcm90b2NvbFJlZnMucHVzaF9iYWNrKCpwKTsKKyAgZm9yIChhdXRvICpQIDogYWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xzKCkpIHsKKyAgICBQcm90b2NvbFJlZnMucHVzaF9iYWNrKFApOwogICB9CiAKICAgZGF0YSgpLkFsbFJlZmVyZW5jZWRQcm90b2NvbHMuc2V0KFByb3RvY29sUmVmcy5kYXRhKCksIFByb3RvY29sUmVmcy5zaXplKCksQyk7CiB9CiAKK2NvbnN0IE9iakNJbnRlcmZhY2VEZWNsICoKK09iakNJbnRlcmZhY2VEZWNsOjpmaW5kSW50ZXJmYWNlV2l0aERlc2lnbmF0ZWRJbml0aWFsaXplcnMoKSBjb25zdCB7CisgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRmFjZSA9IHRoaXM7CisgIHdoaWxlIChJRmFjZSkgeworICAgIGlmIChJRmFjZS0+aGFzRGVzaWduYXRlZEluaXRpYWxpemVycygpKQorICAgICAgcmV0dXJuIElGYWNlOworICAgIGlmICghSUZhY2UtPmluaGVyaXRzRGVzaWduYXRlZEluaXRpYWxpemVycygpKQorICAgICAgYnJlYWs7CisgICAgSUZhY2UgPSBJRmFjZS0+Z2V0U3VwZXJDbGFzcygpOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBpc0ludHJvZHVjaW5nSW5pdGlhbGl6ZXJzKGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpEKSB7CisgIGZvciAoY29uc3QgYXV0byAqTUQgOiBELT5pbnN0YW5jZV9tZXRob2RzKCkpIHsKKyAgICBpZiAoTUQtPmdldE1ldGhvZEZhbWlseSgpID09IE9NRl9pbml0ICYmICFNRC0+aXNPdmVycmlkaW5nKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8gKkV4dCA6IEQtPnZpc2libGVfZXh0ZW5zaW9ucygpKSB7CisgICAgZm9yIChjb25zdCBhdXRvICpNRCA6IEV4dC0+aW5zdGFuY2VfbWV0aG9kcygpKSB7CisgICAgICBpZiAoTUQtPmdldE1ldGhvZEZhbWlseSgpID09IE9NRl9pbml0ICYmICFNRC0+aXNPdmVycmlkaW5nKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgT2JqQ0ludGVyZmFjZURlY2w6OmluaGVyaXRzRGVzaWduYXRlZEluaXRpYWxpemVycygpIGNvbnN0IHsKKyAgc3dpdGNoIChkYXRhKCkuSW5oZXJpdGVkRGVzaWduYXRlZEluaXRpYWxpemVycykgeworICBjYXNlIERlZmluaXRpb25EYXRhOjpJRElfSW5oZXJpdGVkOgorICAgIHJldHVybiB0cnVlOworICBjYXNlIERlZmluaXRpb25EYXRhOjpJRElfTm90SW5oZXJpdGVkOgorICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBEZWZpbml0aW9uRGF0YTo6SURJX1Vua25vd246IHsKKyAgICAvLyBJZiB0aGUgY2xhc3MgaW50cm9kdWNlZCBpbml0aWFsaXplcnMgd2UgY29uc2VydmF0aXZlbHkgYXNzdW1lIHRoYXQgd2UKKyAgICAvLyBkb24ndCBrbm93IGlmIGFueSBvZiB0aGVtIGlzIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciB0byBhdm9pZCBwb3NzaWJsZQorICAgIC8vIG1pc2xlYWRpbmcgd2FybmluZ3MuCisgICAgaWYgKGlzSW50cm9kdWNpbmdJbml0aWFsaXplcnModGhpcykpIHsKKyAgICAgIGRhdGEoKS5Jbmhlcml0ZWREZXNpZ25hdGVkSW5pdGlhbGl6ZXJzID0gRGVmaW5pdGlvbkRhdGE6OklESV9Ob3RJbmhlcml0ZWQ7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGRhdGEoKS5Jbmhlcml0ZWREZXNpZ25hdGVkSW5pdGlhbGl6ZXJzID0gRGVmaW5pdGlvbkRhdGE6OklESV9Jbmhlcml0ZWQ7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgfQorCisgIGxsdm1fdW5yZWFjaGFibGUoInVuZXhwZWN0ZWQgSW5oZXJpdGVkRGVzaWduYXRlZEluaXRpYWxpemVycyB2YWx1ZSIpOworfQorCit2b2lkIE9iakNJbnRlcmZhY2VEZWNsOjpnZXREZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKAorICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxjb25zdCBPYmpDTWV0aG9kRGVjbCAqPiAmTWV0aG9kcykgY29uc3QgeworICAvLyBDaGVjayBmb3IgYSBjb21wbGV0ZSBkZWZpbml0aW9uIGFuZCByZWNvdmVyIGlmIG5vdCBzby4KKyAgaWYgKCFpc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCkpCisgICAgcmV0dXJuOworICBpZiAoZGF0YSgpLkV4dGVybmFsbHlDb21wbGV0ZWQpCisgICAgTG9hZEV4dGVybmFsRGVmaW5pdGlvbigpOworCisgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRmFjZT0gZmluZEludGVyZmFjZVdpdGhEZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKCk7CisgIGlmICghSUZhY2UpCisgICAgcmV0dXJuOworCisgIGZvciAoY29uc3QgYXV0byAqTUQgOiBJRmFjZS0+aW5zdGFuY2VfbWV0aG9kcygpKQorICAgIGlmIChNRC0+aXNUaGlzRGVjbGFyYXRpb25BRGVzaWduYXRlZEluaXRpYWxpemVyKCkpCisgICAgICBNZXRob2RzLnB1c2hfYmFjayhNRCk7CisgIGZvciAoY29uc3QgYXV0byAqRXh0IDogSUZhY2UtPnZpc2libGVfZXh0ZW5zaW9ucygpKSB7CisgICAgZm9yIChjb25zdCBhdXRvICpNRCA6IEV4dC0+aW5zdGFuY2VfbWV0aG9kcygpKQorICAgICAgaWYgKE1ELT5pc1RoaXNEZWNsYXJhdGlvbkFEZXNpZ25hdGVkSW5pdGlhbGl6ZXIoKSkKKyAgICAgICAgTWV0aG9kcy5wdXNoX2JhY2soTUQpOworICB9Cit9CisKK2Jvb2wgT2JqQ0ludGVyZmFjZURlY2w6OmlzRGVzaWduYXRlZEluaXRpYWxpemVyKFNlbGVjdG9yIFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKipJbml0TWV0aG9kKSBjb25zdCB7CisgIC8vIENoZWNrIGZvciBhIGNvbXBsZXRlIGRlZmluaXRpb24gYW5kIHJlY292ZXIgaWYgbm90IHNvLgorICBpZiAoIWlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChkYXRhKCkuRXh0ZXJuYWxseUNvbXBsZXRlZCkKKyAgICBMb2FkRXh0ZXJuYWxEZWZpbml0aW9uKCk7CisKKyAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklGYWNlPSBmaW5kSW50ZXJmYWNlV2l0aERlc2lnbmF0ZWRJbml0aWFsaXplcnMoKTsKKyAgaWYgKCFJRmFjZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGNvbnN0IE9iakNNZXRob2REZWNsICpNRCA9IElGYWNlLT5nZXRJbnN0YW5jZU1ldGhvZChTZWwpKSB7CisgICAgaWYgKE1ELT5pc1RoaXNEZWNsYXJhdGlvbkFEZXNpZ25hdGVkSW5pdGlhbGl6ZXIoKSkgeworICAgICAgaWYgKEluaXRNZXRob2QpCisgICAgICAgICpJbml0TWV0aG9kID0gTUQ7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgZm9yIChjb25zdCBhdXRvICpFeHQgOiBJRmFjZS0+dmlzaWJsZV9leHRlbnNpb25zKCkpIHsKKyAgICBpZiAoY29uc3QgT2JqQ01ldGhvZERlY2wgKk1EID0gRXh0LT5nZXRJbnN0YW5jZU1ldGhvZChTZWwpKSB7CisgICAgICBpZiAoTUQtPmlzVGhpc0RlY2xhcmF0aW9uQURlc2lnbmF0ZWRJbml0aWFsaXplcigpKSB7CisgICAgICAgIGlmIChJbml0TWV0aG9kKQorICAgICAgICAgICpJbml0TWV0aG9kID0gTUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQgT2JqQ0ludGVyZmFjZURlY2w6OmFsbG9jYXRlRGVmaW5pdGlvbkRhdGEoKSB7CiAgIGFzc2VydCghaGFzRGVmaW5pdGlvbigpICYmICJPYmpDIGNsYXNzIGFscmVhZHkgaGFzIGEgZGVmaW5pdGlvbiIpOwogICBEYXRhLnNldFBvaW50ZXIobmV3IChnZXRBU1RDb250ZXh0KCkpIERlZmluaXRpb25EYXRhKCkpOwpAQCAtMzgyLDkgKzQ1Nyw4IEBACiAgIGFsbG9jYXRlRGVmaW5pdGlvbkRhdGEoKTsKIAogICAvLyBVcGRhdGUgYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGRlZmluaXRpb24uCi0gIGZvciAocmVkZWNsX2l0ZXJhdG9yIFJEID0gcmVkZWNsc19iZWdpbigpLCBSREVuZCA9IHJlZGVjbHNfZW5kKCk7Ci0gICAgICAgUkQgIT0gUkRFbmQ7ICsrUkQpIHsKLSAgICBpZiAoKlJEICE9IHRoaXMpCisgIGZvciAoYXV0byBSRCA6IHJlZGVjbHMoKSkgeworICAgIGlmIChSRCAhPSB0aGlzKQogICAgICAgUkQtPkRhdGEgPSBEYXRhOwogICB9CiB9CkBAIC00MDUsMTAgKzQ3OSw3IEBACiAgICAgICByZXR1cm4gSTsKICAgICB9CiAKLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjp2aXNpYmxlX2V4dGVuc2lvbnNfaXRlcmF0b3IKLSAgICAgICAgICAgRXh0ID0gQ2xhc3NEZWNsLT52aXNpYmxlX2V4dGVuc2lvbnNfYmVnaW4oKSwKLSAgICAgICAgICAgRXh0RW5kID0gQ2xhc3NEZWNsLT52aXNpYmxlX2V4dGVuc2lvbnNfZW5kKCk7Ci0gICAgICAgICBFeHQgIT0gRXh0RW5kOyArK0V4dCkgeworICAgIGZvciAoY29uc3QgYXV0byAqRXh0IDogQ2xhc3NEZWNsLT52aXNpYmxlX2V4dGVuc2lvbnMoKSkgewogICAgICAgaWYgKE9iakNJdmFyRGVjbCAqSSA9IEV4dC0+Z2V0SXZhckRlY2woSUQpKSB7CiAgICAgICAgIGNsc0RlY2xhcmVkID0gQ2xhc3NEZWNsOwogICAgICAgICByZXR1cm4gSTsKQEAgLTQ0MywxMSArNTE0LDkgQEAKIAogT2JqQ1Byb3RvY29sRGVjbCAqCiBPYmpDSW50ZXJmYWNlRGVjbDo6bG9va3VwTmVzdGVkUHJvdG9jb2woSWRlbnRpZmllckluZm8gKk5hbWUpIHsKLSAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6YWxsX3Byb3RvY29sX2l0ZXJhdG9yIFAgPQotICAgICAgIGFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2JlZ2luKCksIFBFID0gYWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfZW5kKCk7Ci0gICAgICAgUCAhPSBQRTsgKytQKQotICAgIGlmICgoKlApLT5sb29rdXBQcm90b2NvbE5hbWVkKE5hbWUpKQotICAgICAgcmV0dXJuICgqUCk7CisgIGZvciAoYXV0byAqUCA6IGFsbF9yZWZlcmVuY2VkX3Byb3RvY29scygpKQorICAgIGlmIChQLT5sb29rdXBQcm90b2NvbE5hbWVkKE5hbWUpKQorICAgICAgcmV0dXJuIFA7CiAgIE9iakNJbnRlcmZhY2VEZWNsICpTdXBlckNsYXNzID0gZ2V0U3VwZXJDbGFzcygpOwogICByZXR1cm4gU3VwZXJDbGFzcyA/IFN1cGVyQ2xhc3MtPmxvb2t1cE5lc3RlZFByb3RvY29sKE5hbWUpIDogTlVMTDsKIH0KQEAgLTQ1Nyw5ICs1MjYsMTEgQEAKIC8vLyBXaGVuIGFyZ3VtZW50IGNhdGVnb3J5ICJDIiBpcyBzcGVjaWZpZWQsIGFueSBpbXBsaWNpdCBtZXRob2QgZm91bmQKIC8vLyBpbiB0aGlzIGNhdGVnb3J5IGlzIGlnbm9yZWQuCiBPYmpDTWV0aG9kRGVjbCAqT2JqQ0ludGVyZmFjZURlY2w6Omxvb2t1cE1ldGhvZChTZWxlY3RvciBTZWwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNoYWxsb3dDYXRlZ29yeUxvb2t1cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDQ2F0ZWdvcnlEZWNsICpDKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNoYWxsb3dDYXRlZ29yeUxvb2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9sbG93U3VwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDQ2F0ZWdvcnlEZWNsICpDKSBjb25zdAorewogICAvLyBGSVhNRTogU2hvdWxkIG1ha2Ugc3VyZSBubyBjYWxsZXJzIGV2ZXIgZG8gdGhpcy4KICAgaWYgKCFoYXNEZWZpbml0aW9uKCkpCiAgICAgcmV0dXJuIDA7CkBAIC00NzAsMjQgKzU0MSwxOSBAQAogICBpZiAoZGF0YSgpLkV4dGVybmFsbHlDb21wbGV0ZWQpCiAgICAgTG9hZEV4dGVybmFsRGVmaW5pdGlvbigpOwogCi0gIHdoaWxlIChDbGFzc0RlY2wgIT0gTlVMTCkgeworICB3aGlsZSAoQ2xhc3NEZWNsKSB7CiAgICAgaWYgKChNZXRob2REZWNsID0gQ2xhc3NEZWNsLT5nZXRNZXRob2QoU2VsLCBpc0luc3RhbmNlKSkpCiAgICAgICByZXR1cm4gTWV0aG9kRGVjbDsKIAogICAgIC8vIERpZG4ndCBmaW5kIG9uZSB5ZXQgLSBsb29rIHRocm91Z2ggcHJvdG9jb2xzLgotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnByb3RvY29sX2l0ZXJhdG9yIEkgPSBDbGFzc0RlY2wtPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IENsYXNzRGVjbC0+cHJvdG9jb2xfZW5kKCk7Ci0gICAgICAgICAgIEkgIT0gRTsgKytJKQotICAgICAgaWYgKChNZXRob2REZWNsID0gKCpJKS0+bG9va3VwTWV0aG9kKFNlbCwgaXNJbnN0YW5jZSkpKQorICAgIGZvciAoY29uc3QgYXV0byAqSSA6IENsYXNzRGVjbC0+cHJvdG9jb2xzKCkpCisgICAgICBpZiAoKE1ldGhvZERlY2wgPSBJLT5sb29rdXBNZXRob2QoU2VsLCBpc0luc3RhbmNlKSkpCiAgICAgICAgIHJldHVybiBNZXRob2REZWNsOwogICAgIAogICAgIC8vIERpZG4ndCBmaW5kIG9uZSB5ZXQgLSBub3cgbG9vayB0aHJvdWdoIGNhdGVnb3JpZXMuCi0gICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6dmlzaWJsZV9jYXRlZ29yaWVzX2l0ZXJhdG9yCi0gICAgICAgICBDYXQgPSBDbGFzc0RlY2wtPnZpc2libGVfY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgQ2F0RW5kID0gQ2xhc3NEZWNsLT52aXNpYmxlX2NhdGVnb3JpZXNfZW5kKCk7Ci0gICAgICAgICBDYXQgIT0gQ2F0RW5kOyArK0NhdCkgeworICAgIGZvciAoY29uc3QgYXV0byAqQ2F0IDogQ2xhc3NEZWNsLT52aXNpYmxlX2NhdGVnb3JpZXMoKSkgewogICAgICAgaWYgKChNZXRob2REZWNsID0gQ2F0LT5nZXRNZXRob2QoU2VsLCBpc0luc3RhbmNlKSkpCi0gICAgICAgIGlmIChDICE9ICgqQ2F0KSB8fCAhTWV0aG9kRGVjbC0+aXNJbXBsaWNpdCgpKQorICAgICAgICBpZiAoQyAhPSBDYXQgfHwgIU1ldGhvZERlY2wtPmlzSW1wbGljaXQoKSkKICAgICAgICAgICByZXR1cm4gTWV0aG9kRGVjbDsKIAogICAgICAgaWYgKCFzaGFsbG93Q2F0ZWdvcnlMb29rdXApIHsKQEAgLTQ5NywxMSArNTYzLDE1IEBACiAgICAgICAgIGZvciAoT2JqQ0xpc3Q8T2JqQ1Byb3RvY29sRGVjbD46Oml0ZXJhdG9yIEkgPSBQcm90b2NvbHMuYmVnaW4oKSwKICAgICAgICAgICAgICBFID0gUHJvdG9jb2xzLmVuZCgpOyBJICE9IEU7ICsrSSkKICAgICAgICAgICBpZiAoKE1ldGhvZERlY2wgPSAoKkkpLT5sb29rdXBNZXRob2QoU2VsLCBpc0luc3RhbmNlKSkpCi0gICAgICAgICAgICBpZiAoQyAhPSAoKkNhdCkgfHwgIU1ldGhvZERlY2wtPmlzSW1wbGljaXQoKSkKKyAgICAgICAgICAgIGlmIChDICE9IENhdCB8fCAhTWV0aG9kRGVjbC0+aXNJbXBsaWNpdCgpKQogICAgICAgICAgICAgICByZXR1cm4gTWV0aG9kRGVjbDsKICAgICAgIH0KICAgICB9Ci0gIAorCisgICAgaWYgKCFmb2xsb3dTdXBlcikKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8gR2V0IHRoZSBzdXBlciBjbGFzcyAoaWYgYW55KS4KICAgICBDbGFzc0RlY2wgPSBDbGFzc0RlY2wtPmdldFN1cGVyQ2xhc3MoKTsKICAgfQogICByZXR1cm4gTlVMTDsKQEAgLTU1MCwzMSArNjIwLDM4IEBACiAvLyBPYmpDTWV0aG9kRGVjbAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAotT2JqQ01ldGhvZERlY2wgKk9iakNNZXRob2REZWNsOjpDcmVhdGUoQVNUQ29udGV4dCAmQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGJlZ2luTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gZW5kTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsSW5mbywgUXVhbFR5cGUgVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpSZXN1bHRUSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpjb250ZXh0RGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWYXJpYWRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQcm9wZXJ0eUFjY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0ltcGxpY2l0bHlEZWNsYXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZWZpbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wbGVtZW50YXRpb25Db250cm9sIGltcENvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1JlbGF0ZWRSZXN1bHRUeXBlKSB7Ci0gIHJldHVybiBuZXcgKEMpIE9iakNNZXRob2REZWNsKGJlZ2luTG9jLCBlbmRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbEluZm8sIFQsIFJlc3VsdFRJbmZvLCBjb250ZXh0RGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbnN0YW5jZSwgaXNWYXJpYWRpYywgaXNQcm9wZXJ0eUFjY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ltcGxpY2l0bHlEZWNsYXJlZCwgaXNEZWZpbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNSZWxhdGVkUmVzdWx0VHlwZSk7CitPYmpDTWV0aG9kRGVjbCAqT2JqQ01ldGhvZERlY2w6OkNyZWF0ZSgKKyAgICBBU1RDb250ZXh0ICZDLCBTb3VyY2VMb2NhdGlvbiBiZWdpbkxvYywgU291cmNlTG9jYXRpb24gZW5kTG9jLAorICAgIFNlbGVjdG9yIFNlbEluZm8sIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpSZXR1cm5USW5mbywKKyAgICBEZWNsQ29udGV4dCAqY29udGV4dERlY2wsIGJvb2wgaXNJbnN0YW5jZSwgYm9vbCBpc1ZhcmlhZGljLAorICAgIGJvb2wgaXNQcm9wZXJ0eUFjY2Vzc29yLCBib29sIGlzSW1wbGljaXRseURlY2xhcmVkLCBib29sIGlzRGVmaW5lZCwKKyAgICBJbXBsZW1lbnRhdGlvbkNvbnRyb2wgaW1wQ29udHJvbCwgYm9vbCBIYXNSZWxhdGVkUmVzdWx0VHlwZSkgeworICByZXR1cm4gbmV3IChDLCBjb250ZXh0RGVjbCkgT2JqQ01ldGhvZERlY2woCisgICAgICBiZWdpbkxvYywgZW5kTG9jLCBTZWxJbmZvLCBULCBSZXR1cm5USW5mbywgY29udGV4dERlY2wsIGlzSW5zdGFuY2UsCisgICAgICBpc1ZhcmlhZGljLCBpc1Byb3BlcnR5QWNjZXNzb3IsIGlzSW1wbGljaXRseURlY2xhcmVkLCBpc0RlZmluZWQsCisgICAgICBpbXBDb250cm9sLCBIYXNSZWxhdGVkUmVzdWx0VHlwZSk7CiB9CiAKIE9iakNNZXRob2REZWNsICpPYmpDTWV0aG9kRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKE9iakNNZXRob2REZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgT2JqQ01ldGhvZERlY2woU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IoKSwgUXVhbFR5cGUoKSwgMCwgMCk7CisgIHJldHVybiBuZXcgKEMsIElEKSBPYmpDTWV0aG9kRGVjbChTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IoKSwgUXVhbFR5cGUoKSwgMCwgMCk7Cit9CisKK2Jvb2wgT2JqQ01ldGhvZERlY2w6OmlzVGhpc0RlY2xhcmF0aW9uQURlc2lnbmF0ZWRJbml0aWFsaXplcigpIGNvbnN0IHsKKyAgcmV0dXJuIGdldE1ldGhvZEZhbWlseSgpID09IE9NRl9pbml0ICYmCisgICAgICBoYXNBdHRyPE9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJBdHRyPigpOworfQorCitib29sIE9iakNNZXRob2REZWNsOjppc0Rlc2lnbmF0ZWRJbml0aWFsaXplckZvclRoZUludGVyZmFjZSgKKyAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqKkluaXRNZXRob2QpIGNvbnN0IHsKKyAgaWYgKGdldE1ldGhvZEZhbWlseSgpICE9IE9NRl9pbml0KQorICAgIHJldHVybiBmYWxzZTsKKyAgY29uc3QgRGVjbENvbnRleHQgKkRDID0gZ2V0RGVjbENvbnRleHQoKTsKKyAgaWYgKGlzYTxPYmpDUHJvdG9jb2xEZWNsPihEQykpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklEID0gZ2V0Q2xhc3NJbnRlcmZhY2UoKSkKKyAgICByZXR1cm4gSUQtPmlzRGVzaWduYXRlZEluaXRpYWxpemVyKGdldFNlbGVjdG9yKCksIEluaXRNZXRob2QpOworICByZXR1cm4gZmFsc2U7CiB9CiAKIFN0bXQgKk9iakNNZXRob2REZWNsOjpnZXRCb2R5KCkgY29uc3QgewpAQCAtNzMwLDcgKzgwNyw3IEBACiAgIC8vIGluaXQgb25seSBoYXMgYSBjb252ZW50aW9uYWwgbWVhbmluZyBmb3IgYW4gaW5zdGFuY2UgbWV0aG9kLCBhbmQKICAgLy8gaXQgaGFzIHRvIHJldHVybiBhbiBvYmplY3QuCiAgIGNhc2UgT01GX2luaXQ6Ci0gICAgaWYgKCFpc0luc3RhbmNlTWV0aG9kKCkgfHwgIWdldFJlc3VsdFR5cGUoKS0+aXNPYmpDT2JqZWN0UG9pbnRlclR5cGUoKSkKKyAgICBpZiAoIWlzSW5zdGFuY2VNZXRob2QoKSB8fCAhZ2V0UmV0dXJuVHlwZSgpLT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpKQogICAgICAgZmFtaWx5ID0gT01GX05vbmU7CiAgICAgYnJlYWs7CiAKQEAgLTc0MCw3ICs4MTcsNyBAQAogICBjYXNlIE9NRl9jb3B5OgogICBjYXNlIE9NRl9tdXRhYmxlQ29weToKICAgY2FzZSBPTUZfbmV3OgotICAgIGlmICghZ2V0UmVzdWx0VHlwZSgpLT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpKQorICAgIGlmICghZ2V0UmV0dXJuVHlwZSgpLT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpKQogICAgICAgZmFtaWx5ID0gT01GX05vbmU7CiAgICAgYnJlYWs7CiAKQEAgLTc1NywxNSArODM0LDE0IEBACiAgICAgYnJlYWs7CiAgICAgICAKICAgY2FzZSBPTUZfcGVyZm9ybVNlbGVjdG9yOgotICAgIGlmICghaXNJbnN0YW5jZU1ldGhvZCgpIHx8Ci0gICAgICAgICFnZXRSZXN1bHRUeXBlKCktPmlzT2JqQ0lkVHlwZSgpKQorICAgIGlmICghaXNJbnN0YW5jZU1ldGhvZCgpIHx8ICFnZXRSZXR1cm5UeXBlKCktPmlzT2JqQ0lkVHlwZSgpKQogICAgICAgZmFtaWx5ID0gT01GX05vbmU7CiAgICAgZWxzZSB7CiAgICAgICB1bnNpZ25lZCBub1BhcmFtcyA9IHBhcmFtX3NpemUoKTsKICAgICAgIGlmIChub1BhcmFtcyA8IDEgfHwgbm9QYXJhbXMgPiAzKQogICAgICAgICBmYW1pbHkgPSBPTUZfTm9uZTsKICAgICAgIGVsc2UgewotICAgICAgICBPYmpDTWV0aG9kRGVjbDo6YXJnX3R5cGVfaXRlcmF0b3IgaXQgPSBhcmdfdHlwZV9iZWdpbigpOworICAgICAgICBPYmpDTWV0aG9kRGVjbDo6cGFyYW1fdHlwZV9pdGVyYXRvciBpdCA9IHBhcmFtX3R5cGVfYmVnaW4oKTsKICAgICAgICAgUXVhbFR5cGUgQXJnVCA9ICgqaXQpOwogICAgICAgICBpZiAoIUFyZ1QtPmlzT2JqQ1NlbFR5cGUoKSkgewogICAgICAgICAgIGZhbWlseSA9IE9NRl9Ob25lOwpAQCAtODM4LDcgKzkxNCw3IEBACiAgIHNldFNlbGZEZWNsKHNlbGYpOwogCiAgIGlmIChzZWxmSXNDb25zdW1lZCkKLSAgICBzZWxmLT5hZGRBdHRyKG5ldyAoQ29udGV4dCkgTlNDb25zdW1lZEF0dHIoU291cmNlTG9jYXRpb24oKSwgQ29udGV4dCkpOworICAgIHNlbGYtPmFkZEF0dHIoTlNDb25zdW1lZEF0dHI6OkNyZWF0ZUltcGxpY2l0KENvbnRleHQpKTsKIAogICBpZiAoc2VsZklzUHNldWRvU3Ryb25nKQogICAgIHNlbGYtPnNldEFSQ1BzZXVkb1N0cm9uZyh0cnVlKTsKQEAgLTg1NSw4ICs5MzEsOCBAQAogICAgIHJldHVybiBDRC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKTsKICAgaWYgKE9iakNJbXBsRGVjbCAqSU1EID0gZHluX2Nhc3Q8T2JqQ0ltcGxEZWNsPihnZXREZWNsQ29udGV4dCgpKSkKICAgICByZXR1cm4gSU1ELT5nZXRDbGFzc0ludGVyZmFjZSgpOwotCi0gIGFzc2VydCghaXNhPE9iakNQcm90b2NvbERlY2w+KGdldERlY2xDb250ZXh0KCkpICYmICJJdCdzIGEgcHJvdG9jb2wgbWV0aG9kIik7CisgIGlmIChpc2E8T2JqQ1Byb3RvY29sRGVjbD4oZ2V0RGVjbENvbnRleHQoKSkpCisgICAgcmV0dXJuIDA7CiAgIGxsdm1fdW5yZWFjaGFibGUoInVua25vd24gbWV0aG9kIGNvbnRleHQiKTsKIH0KIApAQCAtODg2LDEwICs5NjIsOCBAQAogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgZm9yIChPYmpDQ2F0ZWdvcnlEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBQID0gQ2F0ZWdvcnktPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRW5kID0gQ2F0ZWdvcnktPnByb3RvY29sX2VuZCgpOwotICAgICAgICAgUCAhPSBQRW5kOyArK1ApCi0gICAgICBDb2xsZWN0T3ZlcnJpZGRlbk1ldGhvZHNSZWN1cnNlKCpQLCBNZXRob2QsIE1ldGhvZHMsIE1vdmVkVG9TdXBlcik7CisgICAgZm9yIChjb25zdCBhdXRvICpQIDogQ2F0ZWdvcnktPnByb3RvY29scygpKQorICAgICAgQ29sbGVjdE92ZXJyaWRkZW5NZXRob2RzUmVjdXJzZShQLCBNZXRob2QsIE1ldGhvZHMsIE1vdmVkVG9TdXBlcik7CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTkwNiwyNiArOTgwLDE3IEBACiAgICAgfQogCiAgIGlmIChjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQcm90b2NvbCA9IGR5bl9jYXN0PE9iakNQcm90b2NvbERlY2w+KENvbnRhaW5lcikpewotICAgIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUCA9IFByb3RvY29sLT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVuZCA9IFByb3RvY29sLT5wcm90b2NvbF9lbmQoKTsKLSAgICAgICAgIFAgIT0gUEVuZDsgKytQKQotICAgICAgQ29sbGVjdE92ZXJyaWRkZW5NZXRob2RzUmVjdXJzZSgqUCwgTWV0aG9kLCBNZXRob2RzLCBNb3ZlZFRvU3VwZXIpOworICAgIGZvciAoY29uc3QgYXV0byAqUCA6IFByb3RvY29sLT5wcm90b2NvbHMoKSkKKyAgICAgIENvbGxlY3RPdmVycmlkZGVuTWV0aG9kc1JlY3Vyc2UoUCwgTWV0aG9kLCBNZXRob2RzLCBNb3ZlZFRvU3VwZXIpOwogICB9CiAKICAgaWYgKGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICoKICAgICAgICAgSW50ZXJmYWNlID0gZHluX2Nhc3Q8T2JqQ0ludGVyZmFjZURlY2w+KENvbnRhaW5lcikpIHsKLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBQID0gSW50ZXJmYWNlLT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFbmQgPSBJbnRlcmZhY2UtPnByb3RvY29sX2VuZCgpOwotICAgICAgICAgUCAhPSBQRW5kOyArK1ApCi0gICAgICBDb2xsZWN0T3ZlcnJpZGRlbk1ldGhvZHNSZWN1cnNlKCpQLCBNZXRob2QsIE1ldGhvZHMsIE1vdmVkVG9TdXBlcik7CisgICAgZm9yIChjb25zdCBhdXRvICpQIDogSW50ZXJmYWNlLT5wcm90b2NvbHMoKSkKKyAgICAgIENvbGxlY3RPdmVycmlkZGVuTWV0aG9kc1JlY3Vyc2UoUCwgTWV0aG9kLCBNZXRob2RzLCBNb3ZlZFRvU3VwZXIpOwogCi0gICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6a25vd25fY2F0ZWdvcmllc19pdGVyYXRvcgotICAgICAgICAgICBDYXQgPSBJbnRlcmZhY2UtPmtub3duX2NhdGVnb3JpZXNfYmVnaW4oKSwKLSAgICAgICAgICAgQ2F0RW5kID0gSW50ZXJmYWNlLT5rbm93bl9jYXRlZ29yaWVzX2VuZCgpOwotICAgICAgICAgQ2F0ICE9IENhdEVuZDsgKytDYXQpIHsKLSAgICAgIENvbGxlY3RPdmVycmlkZGVuTWV0aG9kc1JlY3Vyc2UoKkNhdCwgTWV0aG9kLCBNZXRob2RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZlZFRvU3VwZXIpOwotICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gKkNhdCA6IEludGVyZmFjZS0+a25vd25fY2F0ZWdvcmllcygpKQorICAgICAgQ29sbGVjdE92ZXJyaWRkZW5NZXRob2RzUmVjdXJzZShDYXQsIE1ldGhvZCwgTWV0aG9kcywgTW92ZWRUb1N1cGVyKTsKIAogICAgIGlmIChjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqU3VwZXIgPSBJbnRlcmZhY2UtPmdldFN1cGVyQ2xhc3MoKSkKICAgICAgIHJldHVybiBDb2xsZWN0T3ZlcnJpZGRlbk1ldGhvZHNSZWN1cnNlKFN1cGVyLCBNZXRob2QsIE1ldGhvZHMsCkBAIC0xMDE2LDEzICsxMDgxLDExIEBACiAgICAgCiAgICAgYm9vbCBJc0dldHRlciA9IChOdW1BcmdzID09IDApOwogCi0gICAgZm9yIChPYmpDQ29udGFpbmVyRGVjbDo6cHJvcF9pdGVyYXRvciBJID0gQ29udGFpbmVyLT5wcm9wX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gQ29udGFpbmVyLT5wcm9wX2VuZCgpOwotICAgICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICAgIFNlbGVjdG9yIE5leHRTZWwgPSBJc0dldHRlciA/ICgqSSktPmdldEdldHRlck5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCpJKS0+Z2V0U2V0dGVyTmFtZSgpOworICAgIGZvciAoY29uc3QgYXV0byAqSSA6IENvbnRhaW5lci0+cHJvcGVydGllcygpKSB7CisgICAgICBTZWxlY3RvciBOZXh0U2VsID0gSXNHZXR0ZXIgPyBJLT5nZXRHZXR0ZXJOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEktPmdldFNldHRlck5hbWUoKTsKICAgICAgIGlmIChOZXh0U2VsID09IFNlbCkKLSAgICAgICAgcmV0dXJuICpJOworICAgICAgICByZXR1cm4gSTsKICAgICB9CiAKICAgICBsbHZtX3VucmVhY2hhYmxlKCJNYXJrZWQgYXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBidXQgbm8gcHJvcGVydHkgZm91bmQhIik7CkBAIC0xMDU1LDE5ICsxMTE4LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDSW50ZXJmYWNlRGVjbCAqUHJldkRlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDbGFzc0xvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbnRlcm5hbCl7Ci0gIE9iakNJbnRlcmZhY2VEZWNsICpSZXN1bHQgPSBuZXcgKEMpIE9iakNJbnRlcmZhY2VEZWNsKERDLCBhdExvYywgSWQsIENsYXNzTG9jLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldkRlY2wsIGlzSW50ZXJuYWwpOworICBPYmpDSW50ZXJmYWNlRGVjbCAqUmVzdWx0ID0gbmV3IChDLCBEQykKKyAgICAgIE9iakNJbnRlcmZhY2VEZWNsKERDLCBhdExvYywgSWQsIENsYXNzTG9jLCBQcmV2RGVjbCwgaXNJbnRlcm5hbCk7CiAgIFJlc3VsdC0+RGF0YS5zZXRJbnQoIUMuZ2V0TGFuZ09wdHMoKS5Nb2R1bGVzKTsKICAgQy5nZXRPYmpDSW50ZXJmYWNlVHlwZShSZXN1bHQsIFByZXZEZWNsKTsKICAgcmV0dXJuIFJlc3VsdDsKIH0KIAotT2JqQ0ludGVyZmFjZURlY2wgKk9iakNJbnRlcmZhY2VEZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgCitPYmpDSW50ZXJmYWNlRGVjbCAqT2JqQ0ludGVyZmFjZURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoT2JqQ0ludGVyZmFjZURlY2wpKTsKLSAgT2JqQ0ludGVyZmFjZURlY2wgKlJlc3VsdCA9IG5ldyAoTWVtKSBPYmpDSW50ZXJmYWNlRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UpOworICBPYmpDSW50ZXJmYWNlRGVjbCAqUmVzdWx0ID0gbmV3IChDLCBJRCkgT2JqQ0ludGVyZmFjZURlY2woMCwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSk7CiAgIFJlc3VsdC0+RGF0YS5zZXRJbnQoIUMuZ2V0TGFuZ09wdHMoKS5Nb2R1bGVzKTsKICAgcmV0dXJuIFJlc3VsdDsKIH0KQEAgLTExMDMsNiArMTE2NSwyMyBAQAogICBkYXRhKCkuRXh0ZXJuYWxseUNvbXBsZXRlZCA9IHRydWU7CiB9CiAKK3ZvaWQgT2JqQ0ludGVyZmFjZURlY2w6OnNldEhhc0Rlc2lnbmF0ZWRJbml0aWFsaXplcnMoKSB7CisgIC8vIENoZWNrIGZvciBhIGNvbXBsZXRlIGRlZmluaXRpb24gYW5kIHJlY292ZXIgaWYgbm90IHNvLgorICBpZiAoIWlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkKKyAgICByZXR1cm47CisgIGRhdGEoKS5IYXNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJzID0gdHJ1ZTsKK30KKworYm9vbCBPYmpDSW50ZXJmYWNlRGVjbDo6aGFzRGVzaWduYXRlZEluaXRpYWxpemVycygpIGNvbnN0IHsKKyAgLy8gQ2hlY2sgZm9yIGEgY29tcGxldGUgZGVmaW5pdGlvbiBhbmQgcmVjb3ZlciBpZiBub3Qgc28uCisgIGlmICghaXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGRhdGEoKS5FeHRlcm5hbGx5Q29tcGxldGVkKQorICAgIExvYWRFeHRlcm5hbERlZmluaXRpb24oKTsKKworICByZXR1cm4gZGF0YSgpLkhhc0Rlc2lnbmF0ZWRJbml0aWFsaXplcnM7Cit9CisKIE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKk9iakNJbnRlcmZhY2VEZWNsOjpnZXRJbXBsZW1lbnRhdGlvbigpIGNvbnN0IHsKICAgaWYgKGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpEZWYgPSBnZXREZWZpbml0aW9uKCkpIHsKICAgICBpZiAoZGF0YSgpLkV4dGVybmFsbHlDb21wbGV0ZWQpCkBAIC0xMTU3LDEwICsxMjM2LDcgQEAKICAgICAgICAgY3VySXZhci0+c2V0TmV4dEl2YXIoKkkpOwogICAgIH0KIAotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6Omtub3duX2V4dGVuc2lvbnNfaXRlcmF0b3IKLSAgICAgICAgICAgRXh0ID0ga25vd25fZXh0ZW5zaW9uc19iZWdpbigpLAotICAgICAgICAgICBFeHRFbmQgPSBrbm93bl9leHRlbnNpb25zX2VuZCgpOwotICAgICAgICAgRXh0ICE9IEV4dEVuZDsgKytFeHQpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkV4dCA6IGtub3duX2V4dGVuc2lvbnMoKSkgewogICAgICAgaWYgKCFFeHQtPml2YXJfZW1wdHkoKSkgewogICAgICAgICBPYmpDQ2F0ZWdvcnlEZWNsOjppdmFyX2l0ZXJhdG9yCiAgICAgICAgICAgSSA9IEV4dC0+aXZhcl9iZWdpbigpLApAQCAtMTE4NCwxOSArMTI2MCwxNyBAQAogICAgIGRhdGEoKS5JdmFyTGlzdE1pc3NpbmdJbXBsZW1lbnRhdGlvbiA9IGZhbHNlOwogICAgIGlmICghSW1wbERlY2wtPml2YXJfZW1wdHkoKSkgewogICAgICAgU21hbGxWZWN0b3I8U3ludGhlc2l6ZUl2YXJDaHVuaywgMTY+IGxheW91dDsKLSAgICAgIGZvciAoT2JqQ0ltcGxlbWVudGF0aW9uRGVjbDo6aXZhcl9pdGVyYXRvciBJID0gSW1wbERlY2wtPml2YXJfYmVnaW4oKSwKLSAgICAgICAgICAgRSA9IEltcGxEZWNsLT5pdmFyX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgICBPYmpDSXZhckRlY2wgKklWID0gKkk7CisgICAgICBmb3IgKGF1dG8gKklWIDogSW1wbERlY2wtPml2YXJzKCkpIHsKICAgICAgICAgaWYgKElWLT5nZXRTeW50aGVzaXplKCkgJiYgIUlWLT5pc0ludmFsaWREZWNsKCkpIHsKICAgICAgICAgICBsYXlvdXQucHVzaF9iYWNrKFN5bnRoZXNpemVJdmFyQ2h1bmsoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWLT5nZXRBU1RDb250ZXh0KCkuZ2V0VHlwZVNpemUoSVYtPmdldFR5cGUoKSksIElWKSk7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFkYXRhKCkuSXZhckxpc3QpCi0gICAgICAgICAgZGF0YSgpLkl2YXJMaXN0ID0gKkk7CisgICAgICAgICAgZGF0YSgpLkl2YXJMaXN0ID0gSVY7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICBjdXJJdmFyLT5zZXROZXh0SXZhcigqSSk7Ci0gICAgICAgIGN1ckl2YXIgPSAqSTsKKyAgICAgICAgICBjdXJJdmFyLT5zZXROZXh0SXZhcihJVik7CisgICAgICAgIGN1ckl2YXIgPSBJVjsKICAgICAgIH0KICAgICAgIAogICAgICAgaWYgKCFsYXlvdXQuZW1wdHkoKSkgewpAQCAtMTIyOCwyMyArMTMwMiwxNiBAQAogICBpZiAoZGF0YSgpLkV4dGVybmFsbHlDb21wbGV0ZWQpCiAgICAgTG9hZEV4dGVybmFsRGVmaW5pdGlvbigpOwogCi0gIGZvciAodmlzaWJsZV9jYXRlZ29yaWVzX2l0ZXJhdG9yIENhdCA9IHZpc2libGVfY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRFbmQgPSB2aXNpYmxlX2NhdGVnb3JpZXNfZW5kKCk7Ci0gICAgICAgQ2F0ICE9IENhdEVuZDsKLSAgICAgICArK0NhdCkgeworICBmb3IgKGF1dG8gKkNhdCA6IHZpc2libGVfY2F0ZWdvcmllcygpKQogICAgIGlmIChDYXQtPmdldElkZW50aWZpZXIoKSA9PSBDYXRlZ29yeUlkKQotICAgICAgcmV0dXJuICpDYXQ7Ci0gIH0KKyAgICAgIHJldHVybiBDYXQ7CiAgIAogICByZXR1cm4gMDsKIH0KIAogT2JqQ01ldGhvZERlY2wgKgogT2JqQ0ludGVyZmFjZURlY2w6OmdldENhdGVnb3J5SW5zdGFuY2VNZXRob2QoU2VsZWN0b3IgU2VsKSBjb25zdCB7Ci0gIGZvciAodmlzaWJsZV9jYXRlZ29yaWVzX2l0ZXJhdG9yIENhdCA9IHZpc2libGVfY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRFbmQgPSB2aXNpYmxlX2NhdGVnb3JpZXNfZW5kKCk7Ci0gICAgICAgQ2F0ICE9IENhdEVuZDsKLSAgICAgICArK0NhdCkgeworICBmb3IgKGNvbnN0IGF1dG8gKkNhdCA6IHZpc2libGVfY2F0ZWdvcmllcygpKSB7CiAgICAgaWYgKE9iakNDYXRlZ29yeUltcGxEZWNsICpJbXBsID0gQ2F0LT5nZXRJbXBsZW1lbnRhdGlvbigpKQogICAgICAgaWYgKE9iakNNZXRob2REZWNsICpNRCA9IEltcGwtPmdldEluc3RhbmNlTWV0aG9kKFNlbCkpCiAgICAgICAgIHJldHVybiBNRDsKQEAgLTEyNTQsMTAgKzEzMjEsNyBAQAogfQogCiBPYmpDTWV0aG9kRGVjbCAqT2JqQ0ludGVyZmFjZURlY2w6OmdldENhdGVnb3J5Q2xhc3NNZXRob2QoU2VsZWN0b3IgU2VsKSBjb25zdCB7Ci0gIGZvciAodmlzaWJsZV9jYXRlZ29yaWVzX2l0ZXJhdG9yIENhdCA9IHZpc2libGVfY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRFbmQgPSB2aXNpYmxlX2NhdGVnb3JpZXNfZW5kKCk7Ci0gICAgICAgQ2F0ICE9IENhdEVuZDsKLSAgICAgICArK0NhdCkgeworICBmb3IgKGNvbnN0IGF1dG8gKkNhdCA6IHZpc2libGVfY2F0ZWdvcmllcygpKSB7CiAgICAgaWYgKE9iakNDYXRlZ29yeUltcGxEZWNsICpJbXBsID0gQ2F0LT5nZXRJbXBsZW1lbnRhdGlvbigpKQogICAgICAgaWYgKE9iakNNZXRob2REZWNsICpNRCA9IEltcGwtPmdldENsYXNzTWV0aG9kKFNlbCkpCiAgICAgICAgIHJldHVybiBNRDsKQEAgLTEyNzcsOSArMTM0MSw4IEBACiAgIAogICBPYmpDSW50ZXJmYWNlRGVjbCAqSURlY2wgPSB0aGlzOwogICAvLyAxc3QsIGxvb2sgdXAgdGhlIGNsYXNzLgotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjpwcm90b2NvbF9pdGVyYXRvcgotICAgICAgICBQSSA9IElEZWNsLT5wcm90b2NvbF9iZWdpbigpLCBFID0gSURlY2wtPnByb3RvY29sX2VuZCgpOyBQSSAhPSBFOyArK1BJKXsKLSAgICBpZiAoZ2V0QVNUQ29udGV4dCgpLlByb3RvY29sQ29tcGF0aWJsZVdpdGhQcm90b2NvbChsUHJvdG8sICpQSSkpCisgIGZvciAoYXV0byAqUEkgOiBJRGVjbC0+cHJvdG9jb2xzKCkpeworICAgIGlmIChnZXRBU1RDb250ZXh0KCkuUHJvdG9jb2xDb21wYXRpYmxlV2l0aFByb3RvY29sKGxQcm90bywgUEkpKQogICAgICAgcmV0dXJuIHRydWU7CiAgICAgLy8gVGhpcyBpcyBkdWJpb3VzIGFuZCBpcyBhZGRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggZ2NjLiAgSW4gZ2NjLCBpdCBpcwogICAgIC8vIGFsc28gYWxsb3dlZCBhc3NpZ25pbmcgYSBwcm90b2NvbC1xdWFsaWZpZWQgJ2lkJyB0eXBlIHRvIGEgTEhTIG9iamVjdApAQCAtMTI4OCwyMCArMTM1MSwxNSBAQAogICAgIC8vIEZJWE1FOiBUcmVhdCB0aGlzIGFzIGFuIGV4dGVuc2lvbiwgYW5kIGZsYWcgdGhpcyBhcyBhbiBlcnJvciB3aGVuIEdDQwogICAgIC8vIGV4dGVuc2lvbnMgYXJlIG5vdCBlbmFibGVkLgogICAgIGlmIChSSFNJc1F1YWxpZmllZElEICYmCi0gICAgICAgIGdldEFTVENvbnRleHQoKS5Qcm90b2NvbENvbXBhdGlibGVXaXRoUHJvdG9jb2woKlBJLCBsUHJvdG8pKQorICAgICAgICBnZXRBU1RDb250ZXh0KCkuUHJvdG9jb2xDb21wYXRpYmxlV2l0aFByb3RvY29sKFBJLCBsUHJvdG8pKQogICAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAogICAvLyAybmQsIGxvb2sgdXAgdGhlIGNhdGVnb3J5LgogICBpZiAobG9va3VwQ2F0ZWdvcnkpCi0gICAgZm9yICh2aXNpYmxlX2NhdGVnb3JpZXNfaXRlcmF0b3IgQ2F0ID0gdmlzaWJsZV9jYXRlZ29yaWVzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0RW5kID0gdmlzaWJsZV9jYXRlZ29yaWVzX2VuZCgpOwotICAgICAgICAgQ2F0ICE9IENhdEVuZDsKLSAgICAgICAgICsrQ2F0KSB7Ci0gICAgICBmb3IgKE9iakNDYXRlZ29yeURlY2w6OnByb3RvY29sX2l0ZXJhdG9yIFBJID0gQ2F0LT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gQ2F0LT5wcm90b2NvbF9lbmQoKTsKLSAgICAgICAgICAgUEkgIT0gRTsgKytQSSkKLSAgICAgICAgaWYgKGdldEFTVENvbnRleHQoKS5Qcm90b2NvbENvbXBhdGlibGVXaXRoUHJvdG9jb2wobFByb3RvLCAqUEkpKQorICAgIGZvciAoY29uc3QgYXV0byAqQ2F0IDogdmlzaWJsZV9jYXRlZ29yaWVzKCkpIHsKKyAgICAgIGZvciAoYXV0byAqUEkgOiBDYXQtPnByb3RvY29scygpKQorICAgICAgICBpZiAoZ2V0QVNUQ29udGV4dCgpLlByb3RvY29sQ29tcGF0aWJsZVdpdGhQcm90b2NvbChsUHJvdG8sIFBJKSkKICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTEzMjUsOCArMTM4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBJZGVudGlmaWVySW5mbyAqSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQsIFR5cGVTb3VyY2VJbmZvICpUSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbCBhYywgRXhwciAqQlcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3ludGhlc2l6ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmFja2luZ0l2YXJSZWZlcmVuY2VkSW5BY2Nlc3NvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5bnRoZXNpemVkKSB7CiAgIGlmIChEQykgewogICAgIC8vIEl2YXIncyBjYW4gb25seSBhcHBlYXIgaW4gaW50ZXJmYWNlcywgaW1wbGVtZW50YXRpb25zICh2aWEgc3ludGhlc2l6ZWQKICAgICAvLyBwcm9wZXJ0aWVzKSwgYW5kIGNsYXNzIGV4dGVuc2lvbnMgKHZpYSBkaXJlY3QgZGVjbGFyYXRpb24sIG9yIHN5bnRoZXNpemVkCkBAIC0xMzUzLDE0ICsxNDEwLDEzIEBACiAgICAgSUQtPnNldEl2YXJMaXN0KDApOwogICB9CiAKLSAgcmV0dXJuIG5ldyAoQykgT2JqQ0l2YXJEZWNsKERDLCBTdGFydExvYywgSWRMb2MsIElkLCBULCBUSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjLCBCVywgc3ludGhlc2l6ZWQsIGJhY2tpbmdJdmFyUmVmZXJlbmNlZEluQWNjZXNzb3IpOworICByZXR1cm4gbmV3IChDLCBEQykgT2JqQ0l2YXJEZWNsKERDLCBTdGFydExvYywgSWRMb2MsIElkLCBULCBUSW5mbywgYWMsIEJXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoZXNpemVkKTsKIH0KIAogT2JqQ0l2YXJEZWNsICpPYmpDSXZhckRlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihPYmpDSXZhckRlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBPYmpDSXZhckRlY2woMCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUoKSwgMCwgT2JqQ0l2YXJEZWNsOjpOb25lLCAwLCBmYWxzZSwgZmFsc2UpOworICByZXR1cm4gbmV3IChDLCBJRCkgT2JqQ0l2YXJEZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUoKSwgMCwgT2JqQ0l2YXJEZWNsOjpOb25lLCAwLCBmYWxzZSk7CiB9CiAKIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpPYmpDSXZhckRlY2w6OmdldENvbnRhaW5pbmdJbnRlcmZhY2UoKSBjb25zdCB7CkBAIC0xMzk3LDE0ICsxNDUzLDEzIEBACiAqT2JqQ0F0RGVmc0ZpZWxkRGVjbDo6Q3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsICBTb3VyY2VMb2NhdGlvbiBJZExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklkLCBRdWFsVHlwZSBULCBFeHByICpCVykgewotICByZXR1cm4gbmV3IChDKSBPYmpDQXREZWZzRmllbGREZWNsKERDLCBTdGFydExvYywgSWRMb2MsIElkLCBULCBCVyk7CisgIHJldHVybiBuZXcgKEMsIERDKSBPYmpDQXREZWZzRmllbGREZWNsKERDLCBTdGFydExvYywgSWRMb2MsIElkLCBULCBCVyk7CiB9CiAKLU9iakNBdERlZnNGaWVsZERlY2wgKk9iakNBdERlZnNGaWVsZERlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCAKK09iakNBdERlZnNGaWVsZERlY2wgKk9iakNBdERlZnNGaWVsZERlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKE9iakNBdERlZnNGaWVsZERlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBPYmpDQXREZWZzRmllbGREZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBRdWFsVHlwZSgpLCAwKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIE9iakNBdERlZnNGaWVsZERlY2woMCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUXVhbFR5cGUoKSwgMCk7CiB9CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCkBAIC0xNDI5LDE3ICsxNDg0LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gbmFtZUxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBhdFN0YXJ0TG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNQcm90b2NvbERlY2wgKlByZXZEZWNsKSB7Ci0gIE9iakNQcm90b2NvbERlY2wgKlJlc3VsdCAKLSAgICA9IG5ldyAoQykgT2JqQ1Byb3RvY29sRGVjbChEQywgSWQsIG5hbWVMb2MsIGF0U3RhcnRMb2MsIFByZXZEZWNsKTsKKyAgT2JqQ1Byb3RvY29sRGVjbCAqUmVzdWx0ID0KKyAgICAgIG5ldyAoQywgREMpIE9iakNQcm90b2NvbERlY2woREMsIElkLCBuYW1lTG9jLCBhdFN0YXJ0TG9jLCBQcmV2RGVjbCk7CiAgIFJlc3VsdC0+RGF0YS5zZXRJbnQoIUMuZ2V0TGFuZ09wdHMoKS5Nb2R1bGVzKTsKICAgcmV0dXJuIFJlc3VsdDsKIH0KIAotT2JqQ1Byb3RvY29sRGVjbCAqT2JqQ1Byb3RvY29sRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIAorT2JqQ1Byb3RvY29sRGVjbCAqT2JqQ1Byb3RvY29sRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoT2JqQ1Byb3RvY29sRGVjbCkpOwotICBPYmpDUHJvdG9jb2xEZWNsICpSZXN1bHQgPSBuZXcgKE1lbSkgT2JqQ1Byb3RvY29sRGVjbCgwLCAwLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCAwKTsKKyAgT2JqQ1Byb3RvY29sRGVjbCAqUmVzdWx0ID0KKyAgICAgIG5ldyAoQywgSUQpIE9iakNQcm90b2NvbERlY2woMCwgMCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgMCk7CiAgIFJlc3VsdC0+RGF0YS5zZXRJbnQoIUMuZ2V0TGFuZ09wdHMoKS5Nb2R1bGVzKTsKICAgcmV0dXJuIFJlc3VsdDsKIH0KQEAgLTE0NTAsOCArMTUwNCw4IEBACiAgIGlmIChOYW1lID09IGdldElkZW50aWZpZXIoKSkKICAgICByZXR1cm4gUERlY2w7CiAKLSAgZm9yIChwcm90b2NvbF9pdGVyYXRvciBJID0gcHJvdG9jb2xfYmVnaW4oKSwgRSA9IHByb3RvY29sX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBpZiAoKFBEZWNsID0gKCpJKS0+bG9va3VwUHJvdG9jb2xOYW1lZChOYW1lKSkpCisgIGZvciAoYXV0byAqSSA6IHByb3RvY29scygpKQorICAgIGlmICgoUERlY2wgPSBJLT5sb29rdXBQcm90b2NvbE5hbWVkKE5hbWUpKSkKICAgICAgIHJldHVybiBQRGVjbDsKIAogICByZXR1cm4gTlVMTDsKQEAgLTE0NzIsOCArMTUyNiw4IEBACiAgIGlmICgoTWV0aG9kRGVjbCA9IGdldE1ldGhvZChTZWwsIGlzSW5zdGFuY2UpKSkKICAgICByZXR1cm4gTWV0aG9kRGVjbDsKIAotICBmb3IgKHByb3RvY29sX2l0ZXJhdG9yIEkgPSBwcm90b2NvbF9iZWdpbigpLCBFID0gcHJvdG9jb2xfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgIGlmICgoTWV0aG9kRGVjbCA9ICgqSSktPmxvb2t1cE1ldGhvZChTZWwsIGlzSW5zdGFuY2UpKSkKKyAgZm9yIChjb25zdCBhdXRvICpJIDogcHJvdG9jb2xzKCkpCisgICAgaWYgKChNZXRob2REZWNsID0gSS0+bG9va3VwTWV0aG9kKFNlbCwgaXNJbnN0YW5jZSkpKQogICAgICAgcmV0dXJuIE1ldGhvZERlY2w7CiAgIHJldHVybiBOVUxMOwogfQpAQCAtMTQ4OCw4ICsxNTQyLDcgQEAKICAgYWxsb2NhdGVEZWZpbml0aW9uRGF0YSgpOwogICAKICAgLy8gVXBkYXRlIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIHdpdGggYSBwb2ludGVyIHRvIHRoZSBkZWZpbml0aW9uLgotICBmb3IgKHJlZGVjbF9pdGVyYXRvciBSRCA9IHJlZGVjbHNfYmVnaW4oKSwgUkRFbmQgPSByZWRlY2xzX2VuZCgpOwotICAgICAgIFJEICE9IFJERW5kOyArK1JEKQorICBmb3IgKGF1dG8gUkQgOiByZWRlY2xzKCkpCiAgICAgUkQtPkRhdGEgPSB0aGlzLT5EYXRhOwogfQogCkBAIC0xNDk3LDE3ICsxNTUwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZWNsT3JkZXIgJlBPKSBjb25zdCB7CiAgIAogICBpZiAoY29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqUERlY2wgPSBnZXREZWZpbml0aW9uKCkpIHsKLSAgICBmb3IgKE9iakNQcm90b2NvbERlY2w6OnByb3BfaXRlcmF0b3IgUCA9IFBEZWNsLT5wcm9wX2JlZ2luKCksCi0gICAgICAgICBFID0gUERlY2wtPnByb3BfZW5kKCk7IFAgIT0gRTsgKytQKSB7Ci0gICAgICBPYmpDUHJvcGVydHlEZWNsICpQcm9wID0gKlA7CisgICAgZm9yIChhdXRvICpQcm9wIDogUERlY2wtPnByb3BlcnRpZXMoKSkgewogICAgICAgLy8gSW5zZXJ0IGludG8gUE0gaWYgbm90IHRoZXJlIGFscmVhZHkuCiAgICAgICBQTS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUHJvcC0+Z2V0SWRlbnRpZmllcigpLCBQcm9wKSk7CiAgICAgICBQTy5wdXNoX2JhY2soUHJvcCk7CiAgICAgfQogICAgIC8vIFNjYW4gdGhyb3VnaCBwcm90b2NvbCdzIHByb3RvY29scy4KLSAgICBmb3IgKE9iakNQcm90b2NvbERlY2w6OnByb3RvY29sX2l0ZXJhdG9yIFBJID0gUERlY2wtPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgICBFID0gUERlY2wtPnByb3RvY29sX2VuZCgpOyBQSSAhPSBFOyArK1BJKQotICAgICAgKCpQSSktPmNvbGxlY3RQcm9wZXJ0aWVzVG9JbXBsZW1lbnQoUE0sIFBPKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKlBJIDogUERlY2wtPnByb3RvY29scygpKQorICAgICAgUEktPmNvbGxlY3RQcm9wZXJ0aWVzVG9JbXBsZW1lbnQoUE0sIFBPKTsKICAgfQogfQogCkBAIC0xNTE3LDkgKzE1NjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xQcm9wZXJ0eU1hcCAmUE0pIGNvbnN0IHsKICAgaWYgKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlBEZWNsID0gZ2V0RGVmaW5pdGlvbigpKSB7CiAgICAgYm9vbCBNYXRjaEZvdW5kID0gZmFsc2U7Ci0gICAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjpwcm9wX2l0ZXJhdG9yIFAgPSBQRGVjbC0+cHJvcF9iZWdpbigpLAotICAgICAgICAgRSA9IFBEZWNsLT5wcm9wX2VuZCgpOyBQICE9IEU7ICsrUCkgewotICAgICAgT2JqQ1Byb3BlcnR5RGVjbCAqUHJvcCA9ICpQOworICAgIGZvciAoYXV0byAqUHJvcCA6IFBEZWNsLT5wcm9wZXJ0aWVzKCkpIHsKICAgICAgIGlmIChQcm9wID09IFByb3BlcnR5KQogICAgICAgICBjb250aW51ZTsKICAgICAgIGlmIChQcm9wLT5nZXRJZGVudGlmaWVyKCkgPT0gUHJvcGVydHktPmdldElkZW50aWZpZXIoKSkgewpAQCAtMTUzMCw5ICsxNTc4LDggQEAKICAgICB9CiAgICAgLy8gU2NhbiB0aHJvdWdoIHByb3RvY29sJ3MgcHJvdG9jb2xzIHdoaWNoIGRpZCBub3QgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5LgogICAgIGlmICghTWF0Y2hGb3VuZCkKLSAgICAgIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUEkgPSBQRGVjbC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgICAgRSA9IFBEZWNsLT5wcm90b2NvbF9lbmQoKTsgUEkgIT0gRTsgKytQSSkKLSAgICAgICAgKCpQSSktPmNvbGxlY3RJbmhlcml0ZWRQcm90b2NvbFByb3BlcnRpZXMoUHJvcGVydHksIFBNKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAqUEkgOiBQRGVjbC0+cHJvdG9jb2xzKCkpCisgICAgICAgIFBJLT5jb2xsZWN0SW5oZXJpdGVkUHJvdG9jb2xQcm9wZXJ0aWVzKFByb3BlcnR5LCBQTSk7CiAgIH0KIH0KIApAQCAtMTU0MywxNyArMTU5MCwxNiBAQAogdm9pZCBPYmpDQ2F0ZWdvcnlEZWNsOjphbmNob3IoKSB7IH0KIAogT2JqQ0NhdGVnb3J5RGVjbCAqT2JqQ0NhdGVnb3J5RGVjbDo6Q3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdExvYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXRMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQ2xhc3NOYW1lTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIENhdGVnb3J5TmFtZUxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKklEZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEl2YXJMQnJhY2VMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSXZhclJCcmFjZUxvYykgewotICBPYmpDQ2F0ZWdvcnlEZWNsICpDYXREZWNsID0gbmV3IChDKSBPYmpDQ2F0ZWdvcnlEZWNsKERDLCBBdExvYywgQ2xhc3NOYW1lTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5TmFtZUxvYywgSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXZhckxCcmFjZUxvYywgSXZhclJCcmFjZUxvYyk7CisgIE9iakNDYXRlZ29yeURlY2wgKkNhdERlY2wgPQorICAgICAgbmV3IChDLCBEQykgT2JqQ0NhdGVnb3J5RGVjbChEQywgQXRMb2MsIENsYXNzTmFtZUxvYywgQ2F0ZWdvcnlOYW1lTG9jLCBJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURlY2wsIEl2YXJMQnJhY2VMb2MsIEl2YXJSQnJhY2VMb2MpOwogICBpZiAoSURlY2wpIHsKICAgICAvLyBMaW5rIHRoaXMgY2F0ZWdvcnkgaW50byBpdHMgY2xhc3MncyBjYXRlZ29yeSBsaXN0LgogICAgIENhdERlY2wtPk5leHRDbGFzc0NhdGVnb3J5ID0gSURlY2wtPmdldENhdGVnb3J5TGlzdFJhdygpOwpAQCAtMTU2NywxMSArMTYxMywxMCBAQAogICByZXR1cm4gQ2F0RGVjbDsKIH0KIAotT2JqQ0NhdGVnb3J5RGVjbCAqT2JqQ0NhdGVnb3J5RGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIAorT2JqQ0NhdGVnb3J5RGVjbCAqT2JqQ0NhdGVnb3J5RGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoT2JqQ0NhdGVnb3J5RGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIE9iakNDYXRlZ29yeURlY2woMCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIDAsIDApOworICByZXR1cm4gbmV3IChDLCBJRCkgT2JqQ0NhdGVnb3J5RGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCAwLCAwKTsKIH0KIAogT2JqQ0NhdGVnb3J5SW1wbERlY2wgKk9iakNDYXRlZ29yeURlY2w6OmdldEltcGxlbWVudGF0aW9uKCkgY29uc3QgewpAQCAtMTU5OSwxNSArMTY0NCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDYXRlZ29yeU5hbWVMb2MpIHsKICAgaWYgKENsYXNzSW50ZXJmYWNlICYmIENsYXNzSW50ZXJmYWNlLT5oYXNEZWZpbml0aW9uKCkpCiAgICAgQ2xhc3NJbnRlcmZhY2UgPSBDbGFzc0ludGVyZmFjZS0+Z2V0RGVmaW5pdGlvbigpOwotICByZXR1cm4gbmV3IChDKSBPYmpDQ2F0ZWdvcnlJbXBsRGVjbChEQywgSWQsIENsYXNzSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTG9jLCBhdFN0YXJ0TG9jLCBDYXRlZ29yeU5hbWVMb2MpOworICByZXR1cm4gbmV3IChDLCBEQykgT2JqQ0NhdGVnb3J5SW1wbERlY2woREMsIElkLCBDbGFzc0ludGVyZmFjZSwgbmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0U3RhcnRMb2MsIENhdGVnb3J5TmFtZUxvYyk7CiB9CiAKIE9iakNDYXRlZ29yeUltcGxEZWNsICpPYmpDQ2F0ZWdvcnlJbXBsRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoT2JqQ0NhdGVnb3J5SW1wbERlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBPYmpDQ2F0ZWdvcnlJbXBsRGVjbCgwLCAwLCAwLCBTb3VyY2VMb2NhdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIE9iakNDYXRlZ29yeUltcGxEZWNsKDAsIDAsIDAsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpKTsKIH0KIAogT2JqQ0NhdGVnb3J5RGVjbCAqT2JqQ0NhdGVnb3J5SW1wbERlY2w6OmdldENhdGVnb3J5RGVjbCgpIGNvbnN0IHsKQEAgLTE2NDksMTIgKzE2OTMsMTAgQEAKIC8vLwogT2JqQ1Byb3BlcnR5SW1wbERlY2wgKk9iakNJbXBsRGVjbDo6CiBGaW5kUHJvcGVydHlJbXBsSXZhckRlY2woSWRlbnRpZmllckluZm8gKml2YXJJZCkgY29uc3QgewotICBmb3IgKHByb3BpbXBsX2l0ZXJhdG9yIGkgPSBwcm9waW1wbF9iZWdpbigpLCBlID0gcHJvcGltcGxfZW5kKCk7IGkgIT0gZTsgKytpKXsKLSAgICBPYmpDUHJvcGVydHlJbXBsRGVjbCAqUElEID0gKmk7CisgIGZvciAoYXV0byAqUElEIDogcHJvcGVydHlfaW1wbHMoKSkKICAgICBpZiAoUElELT5nZXRQcm9wZXJ0eUl2YXJEZWNsKCkgJiYKICAgICAgICAgUElELT5nZXRQcm9wZXJ0eUl2YXJEZWNsKCktPmdldElkZW50aWZpZXIoKSA9PSBpdmFySWQpCiAgICAgICByZXR1cm4gUElEOwotICB9CiAgIHJldHVybiAwOwogfQogCkBAIC0xNjY0LDExICsxNzA2LDkgQEAKIC8vLwogT2JqQ1Byb3BlcnR5SW1wbERlY2wgKk9iakNJbXBsRGVjbDo6CiBGaW5kUHJvcGVydHlJbXBsRGVjbChJZGVudGlmaWVySW5mbyAqSWQpIGNvbnN0IHsKLSAgZm9yIChwcm9waW1wbF9pdGVyYXRvciBpID0gcHJvcGltcGxfYmVnaW4oKSwgZSA9IHByb3BpbXBsX2VuZCgpOyBpICE9IGU7ICsraSl7Ci0gICAgT2JqQ1Byb3BlcnR5SW1wbERlY2wgKlBJRCA9ICppOworICBmb3IgKGF1dG8gKlBJRCA6IHByb3BlcnR5X2ltcGxzKCkpCiAgICAgaWYgKFBJRC0+Z2V0UHJvcGVydHlEZWNsKCktPmdldElkZW50aWZpZXIoKSA9PSBJZCkKICAgICAgIHJldHVybiBQSUQ7Ci0gIH0KICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE2OTUsMTYgKzE3MzUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJdmFyUkJyYWNlTG9jKSB7CiAgIGlmIChDbGFzc0ludGVyZmFjZSAmJiBDbGFzc0ludGVyZmFjZS0+aGFzRGVmaW5pdGlvbigpKQogICAgIENsYXNzSW50ZXJmYWNlID0gQ2xhc3NJbnRlcmZhY2UtPmdldERlZmluaXRpb24oKTsKLSAgcmV0dXJuIG5ldyAoQykgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbChEQywgQ2xhc3NJbnRlcmZhY2UsIFN1cGVyRGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTG9jLCBhdFN0YXJ0TG9jLCBzdXBlckxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdmFyTEJyYWNlTG9jLCBJdmFyUkJyYWNlTG9jKTsKKyAgcmV0dXJuIG5ldyAoQywgREMpIE9iakNJbXBsZW1lbnRhdGlvbkRlY2woREMsIENsYXNzSW50ZXJmYWNlLCBTdXBlckRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMb2MsIGF0U3RhcnRMb2MsIHN1cGVyTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdmFyTEJyYWNlTG9jLCBJdmFyUkJyYWNlTG9jKTsKIH0KIAogT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqCiBPYmpDSW1wbGVtZW50YXRpb25EZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCkpOwotICByZXR1cm4gbmV3IChNZW0pIE9iakNJbXBsZW1lbnRhdGlvbkRlY2woMCwgMCwgMCwgU291cmNlTG9jYXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIE9iakNJbXBsZW1lbnRhdGlvbkRlY2woMCwgMCwgMCwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSk7CiB9CiAKIHZvaWQgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbDo6c2V0SXZhckluaXRpYWxpemVycyhBU1RDb250ZXh0ICZDLApAQCAtMTczNywxMyArMTc3NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VEZWNsKiBBbGlhc2VkQ2xhc3MpIHsKLSAgcmV0dXJuIG5ldyAoQykgT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2woREMsIEwsIElkLCBBbGlhc2VkQ2xhc3MpOworICByZXR1cm4gbmV3IChDLCBEQykgT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2woREMsIEwsIElkLCBBbGlhc2VkQ2xhc3MpOwogfQogCiBPYmpDQ29tcGF0aWJsZUFsaWFzRGVjbCAqCiBPYmpDQ29tcGF0aWJsZUFsaWFzRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKE9iakNDb21wYXRpYmxlQWxpYXNEZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2woMCwgU291cmNlTG9jYXRpb24oKSwgMCwgMCk7CisgIHJldHVybiBuZXcgKEMsIElEKSBPYmpDQ29tcGF0aWJsZUFsaWFzRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCAwLCAwKTsKIH0KIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTE3NTksMTUgKzE3OTcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlDb250cm9sIHByb3BDb250cm9sKSB7Ci0gIHJldHVybiBuZXcgKEMpIE9iakNQcm9wZXJ0eURlY2woREMsIEwsIElkLCBBdExvYywgTFBhcmVuTG9jLCBUKTsKKyAgcmV0dXJuIG5ldyAoQywgREMpIE9iakNQcm9wZXJ0eURlY2woREMsIEwsIElkLCBBdExvYywgTFBhcmVuTG9jLCBUKTsKIH0KIAotT2JqQ1Byb3BlcnR5RGVjbCAqT2JqQ1Byb3BlcnR5RGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIAorT2JqQ1Byb3BlcnR5RGVjbCAqT2JqQ1Byb3BlcnR5RGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqIE1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKE9iakNQcm9wZXJ0eURlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBPYmpDUHJvcGVydHlEZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIDAsIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgIHJldHVybiBuZXcgKEMsIElEKSBPYmpDUHJvcGVydHlEZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIDAsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIDApOwogfQogCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtMTc4MiwxNSArMTgxOCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2luZCBQSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJdmFyRGVjbCAqaXZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGl2YXJMb2MpIHsKLSAgcmV0dXJuIG5ldyAoQykgT2JqQ1Byb3BlcnR5SW1wbERlY2woREMsIGF0TG9jLCBMLCBwcm9wZXJ0eSwgUEssIGl2YXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2YXJMb2MpOworICByZXR1cm4gbmV3IChDLCBEQykgT2JqQ1Byb3BlcnR5SW1wbERlY2woREMsIGF0TG9jLCBMLCBwcm9wZXJ0eSwgUEssIGl2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmFyTG9jKTsKIH0KIAotT2JqQ1Byb3BlcnR5SW1wbERlY2wgKk9iakNQcm9wZXJ0eUltcGxEZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgCitPYmpDUHJvcGVydHlJbXBsRGVjbCAqT2JqQ1Byb3BlcnR5SW1wbERlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoT2JqQ1Byb3BlcnR5SW1wbERlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBPYmpDUHJvcGVydHlJbXBsRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIER5bmFtaWMsIDAsIFNvdXJjZUxvY2F0aW9uKCkpOworICByZXR1cm4gbmV3IChDLCBJRCkgT2JqQ1Byb3BlcnR5SW1wbERlY2woMCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIER5bmFtaWMsIDAsIFNvdXJjZUxvY2F0aW9uKCkpOwogfQogCiBTb3VyY2VSYW5nZSBPYmpDUHJvcGVydHlJbXBsRGVjbDo6Z2V0U291cmNlUmFuZ2UoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9saWIvQVNUL0RlY2xPcGVuTVAuY3BwIGIvbGliL0FTVC9EZWNsT3Blbk1QLmNwcAppbmRleCAwZDE5NWY3Li4zN2Q0YWUyIDEwMDY0NAotLS0gYS9saWIvQVNUL0RlY2xPcGVuTVAuY3BwCisrKyBiL2xpYi9BU1QvRGVjbE9wZW5NUC5jcHAKQEAgLTEyLDggKzEyLDggQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQmFzZS5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xCYXNlLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xPcGVuTVAuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgogCkBAIC0yOSwxMiArMjksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQgKkRDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gVkwpIHsKLSAgdW5zaWduZWQgU2l6ZSA9IHNpemVvZihPTVBUaHJlYWRQcml2YXRlRGVjbCkgKwotICAgICAgICAgICAgICAgICAgKFZMLnNpemUoKSAqIHNpemVvZihFeHByICopKTsKLQotICB2b2lkICpNZW0gPSBDLkFsbG9jYXRlKFNpemUsIGxsdm06OmFsaWduT2Y8T01QVGhyZWFkUHJpdmF0ZURlY2w+KCkpOwotICBPTVBUaHJlYWRQcml2YXRlRGVjbCAqRCA9IG5ldyAoTWVtKSBPTVBUaHJlYWRQcml2YXRlRGVjbChPTVBUaHJlYWRQcml2YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQywgTCk7CisgIE9NUFRocmVhZFByaXZhdGVEZWNsICpEID0gbmV3IChDLCBEQywgVkwuc2l6ZSgpICogc2l6ZW9mKEV4cHIgKikpCisgICAgICBPTVBUaHJlYWRQcml2YXRlRGVjbChPTVBUaHJlYWRQcml2YXRlLCBEQywgTCk7CiAgIEQtPk51bVZhcnMgPSBWTC5zaXplKCk7CiAgIEQtPnNldFZhcnMoVkwpOwogICByZXR1cm4gRDsKQEAgLTQzLDExICszOSw4IEBACiBPTVBUaHJlYWRQcml2YXRlRGVjbCAqT01QVGhyZWFkUHJpdmF0ZURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOKSB7Ci0gIHVuc2lnbmVkIFNpemUgPSBzaXplb2YoT01QVGhyZWFkUHJpdmF0ZURlY2wpICsgKE4gKiBzaXplb2YoRXhwciAqKSk7Ci0KLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBTaXplKTsKLSAgT01QVGhyZWFkUHJpdmF0ZURlY2wgKkQgPSBuZXcgKE1lbSkgT01QVGhyZWFkUHJpdmF0ZURlY2woT01QVGhyZWFkUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgU291cmNlTG9jYXRpb24oKSk7CisgIE9NUFRocmVhZFByaXZhdGVEZWNsICpEID0gbmV3IChDLCBJRCwgTiAqIHNpemVvZihFeHByICopKQorICAgICAgT01QVGhyZWFkUHJpdmF0ZURlY2woT01QVGhyZWFkUHJpdmF0ZSwgMCwgU291cmNlTG9jYXRpb24oKSk7CiAgIEQtPk51bVZhcnMgPSBOOwogICByZXR1cm4gRDsKIH0KZGlmZiAtLWdpdCBhL2xpYi9BU1QvRGVjbFByaW50ZXIuY3BwIGIvbGliL0FTVC9EZWNsUHJpbnRlci5jcHAKaW5kZXggNzY3ZjY2Mi4uYTU3NTMyYyAxMDA2NDQKLS0tIGEvbGliL0FTVC9EZWNsUHJpbnRlci5jcHAKKysrIGIvbGliL0FTVC9EZWNsUHJpbnRlci5jcHAKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIGVsc2UgaWYgKGNvbnN0IEFycmF5VHlwZSogQVR5ID0gZHluX2Nhc3Q8QXJyYXlUeXBlPihCYXNlVHlwZSkpCiAgICAgICBCYXNlVHlwZSA9IEFUeS0+Z2V0RWxlbWVudFR5cGUoKTsKICAgICBlbHNlIGlmIChjb25zdCBGdW5jdGlvblR5cGUqIEZUeSA9IEJhc2VUeXBlLT5nZXRBczxGdW5jdGlvblR5cGU+KCkpCi0gICAgICBCYXNlVHlwZSA9IEZUeS0+Z2V0UmVzdWx0VHlwZSgpOworICAgICAgQmFzZVR5cGUgPSBGVHktPmdldFJldHVyblR5cGUoKTsKICAgICBlbHNlIGlmIChjb25zdCBWZWN0b3JUeXBlICpWVHkgPSBCYXNlVHlwZS0+Z2V0QXM8VmVjdG9yVHlwZT4oKSkKICAgICAgIEJhc2VUeXBlID0gVlR5LT5nZXRFbGVtZW50VHlwZSgpOwogICAgIGVsc2UgaWYgKGNvbnN0IFJlZmVyZW5jZVR5cGUgKlJUeSA9IEJhc2VUeXBlLT5nZXRBczxSZWZlcmVuY2VUeXBlPigpKQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAgIH0KIH0KIAotdm9pZCBEZWNsQ29udGV4dDo6ZHVtcERlY2xDb250ZXh0KCkgY29uc3QgeworTExWTV9EVU1QX01FVEhPRCB2b2lkIERlY2xDb250ZXh0OjpkdW1wRGVjbENvbnRleHQoKSBjb25zdCB7CiAgIC8vIEdldCB0aGUgdHJhbnNsYXRpb24gdW5pdAogICBjb25zdCBEZWNsQ29udGV4dCAqREMgPSB0aGlzOwogICB3aGlsZSAoIURDLT5pc1RyYW5zbGF0aW9uVW5pdCgpKQpAQCAtMjM4LDE3ICsyMzgsNiBAQAogICAgIGlmIChELT5pc0ltcGxpY2l0KCkpCiAgICAgICBjb250aW51ZTsKIAotICAgIC8vIEZJWE1FOiBVZ2x5IGhhY2sgc28gd2UgZG9uJ3QgcHJldHR5LXByaW50IHRoZSBidWlsdGluIGRlY2xhcmF0aW9uCi0gICAgLy8gb2YgX19idWlsdGluX3ZhX2xpc3Qgb3IgX19bdV1pbnQxMjhfdC4gIFRoZXJlIHNob3VsZCBiZSBzb21lIG90aGVyIHdheQotICAgIC8vIHRvIGNoZWNrIHRoYXQuCi0gICAgaWYgKE5hbWVkRGVjbCAqTkQgPSBkeW5fY2FzdDxOYW1lZERlY2w+KCpEKSkgewotICAgICAgaWYgKElkZW50aWZpZXJJbmZvICpJSSA9IE5ELT5nZXRJZGVudGlmaWVyKCkpIHsKLSAgICAgICAgaWYgKElJLT5pc1N0cigiX19idWlsdGluX3ZhX2xpc3QiKSB8fAotICAgICAgICAgICAgSUktPmlzU3RyKCJfX2ludDEyOF90IikgfHwgSUktPmlzU3RyKCJfX3VpbnQxMjhfdCIpKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgIH0KLQogICAgIC8vIFRoZSBuZXh0IGJpdHMgb2YgY29kZSBoYW5kbGVzIHN0dWZmIGxpa2UgInN0cnVjdCB7aW50IHg7fSBhLGIiOyB3ZSdyZQogICAgIC8vIGZvcmNlZCB0byBtZXJnZSB0aGUgZGVjbGFyYXRpb25zIGJlY2F1c2UgdGhlcmUncyBubyBvdGhlciB3YXkgdG8KICAgICAvLyByZWZlciB0byB0aGUgc3RydWN0IGluIHF1ZXN0aW9uLiAgVGhpcyBsaW1pdGVkIG1lcmdpbmcgaXMgc2FmZSB3aXRob3V0CkBAIC0zOTYsNiArMzg1LDcgQEAKIAogdm9pZCBEZWNsUHJpbnRlcjo6VmlzaXRGdW5jdGlvbkRlY2woRnVuY3Rpb25EZWNsICpEKSB7CiAgIENYWENvbnN0cnVjdG9yRGVjbCAqQ0RlY2wgPSBkeW5fY2FzdDxDWFhDb25zdHJ1Y3RvckRlY2w+KEQpOworICBDWFhDb252ZXJzaW9uRGVjbCAqQ29udmVyc2lvbkRlY2wgPSBkeW5fY2FzdDxDWFhDb252ZXJzaW9uRGVjbD4oRCk7CiAgIGlmICghUG9saWN5LlN1cHByZXNzU3BlY2lmaWVycykgewogICAgIHN3aXRjaCAoRC0+Z2V0U3RvcmFnZUNsYXNzKCkpIHsKICAgICBjYXNlIFNDX05vbmU6IGJyZWFrOwpAQCAtNDA5LDcgKzM5OSw5IEBACiAgICAgaWYgKEQtPmlzSW5saW5lU3BlY2lmaWVkKCkpICBPdXQgPDwgImlubGluZSAiOwogICAgIGlmIChELT5pc1ZpcnR1YWxBc1dyaXR0ZW4oKSkgT3V0IDw8ICJ2aXJ0dWFsICI7CiAgICAgaWYgKEQtPmlzTW9kdWxlUHJpdmF0ZSgpKSAgICBPdXQgPDwgIl9fbW9kdWxlX3ByaXZhdGVfXyAiOwotICAgIGlmIChDRGVjbCAmJiBDRGVjbC0+aXNFeHBsaWNpdFNwZWNpZmllZCgpKQorICAgIGlmIChELT5pc0NvbnN0ZXhwcigpICYmICFELT5pc0V4cGxpY2l0bHlEZWZhdWx0ZWQoKSkgT3V0IDw8ICJjb25zdGV4cHIgIjsKKyAgICBpZiAoKENEZWNsICYmIENEZWNsLT5pc0V4cGxpY2l0U3BlY2lmaWVkKCkpIHx8CisgICAgICAgIChDb252ZXJzaW9uRGVjbCAmJiBDb252ZXJzaW9uRGVjbC0+aXNFeHBsaWNpdCgpKSkKICAgICAgIE91dCA8PCAiZXhwbGljaXQgIjsKICAgfQogCkBAIC00MjMsOCArNDE1LDcgQEAKICAgICBUeSA9IFBULT5nZXRJbm5lclR5cGUoKTsKICAgfQogCi0gIGlmIChpc2E8RnVuY3Rpb25UeXBlPihUeSkpIHsKLSAgICBjb25zdCBGdW5jdGlvblR5cGUgKkFGVCA9IFR5LT5nZXRBczxGdW5jdGlvblR5cGU+KCk7CisgIGlmIChjb25zdCBGdW5jdGlvblR5cGUgKkFGVCA9IFR5LT5nZXRBczxGdW5jdGlvblR5cGU+KCkpIHsKICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlQgPSAwOwogICAgIGlmIChELT5oYXNXcml0dGVuUHJvdG90eXBlKCkpCiAgICAgICBGVCA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihBRlQpOwpAQCAtNDU5LDYgKzQ1MCwxNyBAQAogICAgICAgICBQcm90byArPSAiIHZvbGF0aWxlIjsKICAgICAgIGlmIChGVC0+aXNSZXN0cmljdCgpKQogICAgICAgICBQcm90byArPSAiIHJlc3RyaWN0IjsKKworICAgICAgc3dpdGNoIChGVC0+Z2V0UmVmUXVhbGlmaWVyKCkpIHsKKyAgICAgIGNhc2UgUlFfTm9uZToKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFJRX0xWYWx1ZToKKyAgICAgICAgUHJvdG8gKz0gIiAmIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFJRX1JWYWx1ZToKKyAgICAgICAgUHJvdG8gKz0gIiAmJiI7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KIAogICAgIGlmIChGVCAmJiBGVC0+aGFzRHluYW1pY0V4Y2VwdGlvblNwZWMoKSkgewpAQCAtNDg4LDEwICs0OTAsNyBAQAogCiAgICAgaWYgKENEZWNsKSB7CiAgICAgICBib29sIEhhc0luaXRpYWxpemVyTGlzdCA9IGZhbHNlOwotICAgICAgZm9yIChDWFhDb25zdHJ1Y3RvckRlY2w6OmluaXRfY29uc3RfaXRlcmF0b3IgQiA9IENEZWNsLT5pbml0X2JlZ2luKCksCi0gICAgICAgICAgIEUgPSBDRGVjbC0+aW5pdF9lbmQoKTsKLSAgICAgICAgICAgQiAhPSBFOyArK0IpIHsKLSAgICAgICAgQ1hYQ3RvckluaXRpYWxpemVyICpCTUluaXRpYWxpemVyID0gKCpCKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAqQk1Jbml0aWFsaXplciA6IENEZWNsLT5pbml0cygpKSB7CiAgICAgICAgIGlmIChCTUluaXRpYWxpemVyLT5pc0luQ2xhc3NNZW1iZXJJbml0aWFsaXplcigpKQogICAgICAgICAgIGNvbnRpbnVlOwogCkBAIC01NDcsMTYgKzU0NiwxOCBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBPdXQgPDwgIikiOworICAgICAgICBpZiAoQk1Jbml0aWFsaXplci0+aXNQYWNrRXhwYW5zaW9uKCkpCisgICAgICAgICAgT3V0IDw8ICIuLi4iOwogICAgICAgfQotICAgICAgaWYgKCFQcm90by5lbXB0eSgpKQotICAgICAgICBPdXQgPDwgUHJvdG87Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKCFDb252ZXJzaW9uRGVjbCAmJiAhaXNhPENYWERlc3RydWN0b3JEZWNsPihEKSkgewogICAgICAgaWYgKEZUICYmIEZULT5oYXNUcmFpbGluZ1JldHVybigpKSB7CiAgICAgICAgIE91dCA8PCAiYXV0byAiIDw8IFByb3RvIDw8ICIgLT4gIjsKICAgICAgICAgUHJvdG8uY2xlYXIoKTsKICAgICAgIH0KLSAgICAgIEFGVC0+Z2V0UmVzdWx0VHlwZSgpLnByaW50KE91dCwgUG9saWN5LCBQcm90byk7CisgICAgICBBRlQtPmdldFJldHVyblR5cGUoKS5wcmludChPdXQsIFBvbGljeSwgUHJvdG8pOworICAgICAgUHJvdG8uY2xlYXIoKTsKICAgICB9CisgICAgT3V0IDw8IFByb3RvOwogICB9IGVsc2UgewogICAgIFR5LnByaW50KE91dCwgUG9saWN5LCBQcm90byk7CiAgIH0KQEAgLTg4NCwxMCArODg1LDkgQEAKIHZvaWQgRGVjbFByaW50ZXI6OlZpc2l0RnVuY3Rpb25UZW1wbGF0ZURlY2woRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkQpIHsKICAgaWYgKFByaW50SW5zdGFudGlhdGlvbikgewogICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zID0gRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCk7Ci0gICAgZm9yIChGdW5jdGlvblRlbXBsYXRlRGVjbDo6c3BlY19pdGVyYXRvciBJID0gRC0+c3BlY19iZWdpbigpLCBFID0gRC0+c3BlY19lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgICBQcmludFRlbXBsYXRlUGFyYW1ldGVycyhQYXJhbXMsICgqSSktPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25BcmdzKCkpOwotICAgICAgVmlzaXQoKkkpOworICAgIGZvciAoYXV0byAqSSA6IEQtPnNwZWNpYWxpemF0aW9ucygpKSB7CisgICAgICBQcmludFRlbXBsYXRlUGFyYW1ldGVycyhQYXJhbXMsIEktPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25BcmdzKCkpOworICAgICAgVmlzaXQoSSk7CiAgICAgfQogICB9CiAKQEAgLTg5NywxMCArODk3LDkgQEAKIHZvaWQgRGVjbFByaW50ZXI6OlZpc2l0Q2xhc3NUZW1wbGF0ZURlY2woQ2xhc3NUZW1wbGF0ZURlY2wgKkQpIHsKICAgaWYgKFByaW50SW5zdGFudGlhdGlvbikgewogICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zID0gRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCk7Ci0gICAgZm9yIChDbGFzc1RlbXBsYXRlRGVjbDo6c3BlY19pdGVyYXRvciBJID0gRC0+c3BlY19iZWdpbigpLCBFID0gRC0+c3BlY19lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgICBQcmludFRlbXBsYXRlUGFyYW1ldGVycyhQYXJhbXMsICYoKkkpLT5nZXRUZW1wbGF0ZUFyZ3MoKSk7Ci0gICAgICBWaXNpdCgqSSk7CisgICAgZm9yIChhdXRvICpJIDogRC0+c3BlY2lhbGl6YXRpb25zKCkpIHsKKyAgICAgIFByaW50VGVtcGxhdGVQYXJhbWV0ZXJzKFBhcmFtcywgJkktPmdldFRlbXBsYXRlQXJncygpKTsKKyAgICAgIFZpc2l0KEkpOwogICAgICAgT3V0IDw8ICdcbic7CiAgICAgfQogICB9CkBAIC05MTcsMTkgKzkxNiwxOSBAQAogICAgIE91dCA8PCAiLSAiOwogICBlbHNlCiAgICAgT3V0IDw8ICIrICI7Ci0gIGlmICghT01ELT5nZXRSZXN1bHRUeXBlKCkuaXNOdWxsKCkpCi0gICAgT3V0IDw8ICcoJyA8PCBPTUQtPmdldEFTVENvbnRleHQoKS5nZXRVbnF1YWxpZmllZE9iakNQb2ludGVyVHlwZShPTUQtPmdldFJlc3VsdFR5cGUoKSkuCi0gICAgICAgICAgICAgICAgICAgIGdldEFzU3RyaW5nKFBvbGljeSkgPDwgIikiOworICBpZiAoIU9NRC0+Z2V0UmV0dXJuVHlwZSgpLmlzTnVsbCgpKQorICAgIE91dCA8PCAnKCcgPDwgT01ELT5nZXRBU1RDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgICAuZ2V0VW5xdWFsaWZpZWRPYmpDUG9pbnRlclR5cGUoT01ELT5nZXRSZXR1cm5UeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgLmdldEFzU3RyaW5nKFBvbGljeSkgPDwgIikiOwogCiAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBPTUQtPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKTsKICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MsIGxhc3RQb3MgPSAwOwotICBmb3IgKE9iakNNZXRob2REZWNsOjpwYXJhbV9pdGVyYXRvciBQSSA9IE9NRC0+cGFyYW1fYmVnaW4oKSwKLSAgICAgICBFID0gT01ELT5wYXJhbV9lbmQoKTsgUEkgIT0gRTsgKytQSSkgeworICBmb3IgKGNvbnN0IGF1dG8gKlBJIDogT01ELT5wYXJhbXMoKSkgewogICAgIC8vIEZJWE1FOiBzZWxlY3RvciBpcyBtaXNzaW5nIGhlcmUhCiAgICAgcG9zID0gbmFtZS5maW5kX2ZpcnN0X29mKCc6JywgbGFzdFBvcyk7CiAgICAgT3V0IDw8ICIgIiA8PCBuYW1lLnN1YnN0cihsYXN0UG9zLCBwb3MgLSBsYXN0UG9zKTsKLSAgICBPdXQgPDwgIjooIiA8PCAoKlBJKS0+Z2V0QVNUQ29udGV4dCgpLmdldFVucXVhbGlmaWVkT2JqQ1BvaW50ZXJUeXBlKCgqUEkpLT5nZXRUeXBlKCkpLgotICAgICAgICAgICAgICAgICAgICAgIGdldEFzU3RyaW5nKFBvbGljeSkgPDwgJyknIDw8ICoqUEk7CisgICAgT3V0IDw8ICI6KCIgPDwgUEktPmdldEFTVENvbnRleHQoKS5nZXRVbnF1YWxpZmllZE9iakNQb2ludGVyVHlwZShQSS0+Z2V0VHlwZSgpKS4KKyAgICAgICAgICAgICAgICAgICAgICBnZXRBc1N0cmluZyhQb2xpY3kpIDw8ICcpJyA8PCAqUEk7CiAgICAgbGFzdFBvcyA9IHBvcyArIDE7CiAgIH0KIApAQCAtOTYwLDEwICs5NTksOSBAQAogICBpZiAoT0lELT5pdmFyX3NpemUoKSA+IDApIHsKICAgICBPdXQgPDwgIntcbiI7CiAgICAgSW5kZW50YXRpb24gKz0gUG9saWN5LkluZGVudGF0aW9uOwotICAgIGZvciAoT2JqQ0ltcGxlbWVudGF0aW9uRGVjbDo6aXZhcl9pdGVyYXRvciBJID0gT0lELT5pdmFyX2JlZ2luKCksCi0gICAgICAgICBFID0gT0lELT5pdmFyX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGZvciAoY29uc3QgYXV0byAqSSA6IE9JRC0+aXZhcnMoKSkgewogICAgICAgSW5kZW50KCkgPDwgSS0+Z2V0QVNUQ29udGV4dCgpLmdldFVucXVhbGlmaWVkT2JqQ1BvaW50ZXJUeXBlKEktPmdldFR5cGUoKSkuCi0gICAgICAgICAgICAgICAgICAgIGdldEFzU3RyaW5nKFBvbGljeSkgPDwgJyAnIDw8ICoqSSA8PCAiO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgZ2V0QXNTdHJpbmcoUG9saWN5KSA8PCAnICcgPDwgKkkgPDwgIjtcbiI7CiAgICAgfQogICAgIEluZGVudGF0aW9uIC09IFBvbGljeS5JbmRlbnRhdGlvbjsKICAgICBPdXQgPDwgIn1cbiI7CkBAIC05OTksMTAgKzk5NywxMCBAQAogICAgIE91dCA8PCAie1xuIjsKICAgICBlb2xuT3V0ID0gdHJ1ZTsKICAgICBJbmRlbnRhdGlvbiArPSBQb2xpY3kuSW5kZW50YXRpb247Ci0gICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6aXZhcl9pdGVyYXRvciBJID0gT0lELT5pdmFyX2JlZ2luKCksCi0gICAgICAgICBFID0gT0lELT5pdmFyX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgSW5kZW50KCkgPDwgSS0+Z2V0QVNUQ29udGV4dCgpLmdldFVucXVhbGlmaWVkT2JqQ1BvaW50ZXJUeXBlKEktPmdldFR5cGUoKSkuCi0gICAgICAgICAgICAgICAgICAgIGdldEFzU3RyaW5nKFBvbGljeSkgPDwgJyAnIDw8ICoqSSA8PCAiO1xuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBPSUQtPml2YXJzKCkpIHsKKyAgICAgIEluZGVudCgpIDw8IEktPmdldEFTVENvbnRleHQoKQorICAgICAgICAgICAgICAgICAgICAgIC5nZXRVbnF1YWxpZmllZE9iakNQb2ludGVyVHlwZShJLT5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgLmdldEFzU3RyaW5nKFBvbGljeSkgPDwgJyAnIDw8ICpJIDw8ICI7XG4iOwogICAgIH0KICAgICBJbmRlbnRhdGlvbiAtPSBQb2xpY3kuSW5kZW50YXRpb247CiAgICAgT3V0IDw8ICJ9XG4iOwpAQCAtMTA1MSwxMSArMTA0OSw5IEBACiAgIGlmIChQSUQtPml2YXJfc2l6ZSgpID4gMCkgewogICAgIE91dCA8PCAie1xuIjsKICAgICBJbmRlbnRhdGlvbiArPSBQb2xpY3kuSW5kZW50YXRpb247Ci0gICAgZm9yIChPYmpDQ2F0ZWdvcnlEZWNsOjppdmFyX2l0ZXJhdG9yIEkgPSBQSUQtPml2YXJfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBQSUQtPml2YXJfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgZm9yIChjb25zdCBhdXRvICpJIDogUElELT5pdmFycygpKQogICAgICAgSW5kZW50KCkgPDwgSS0+Z2V0QVNUQ29udGV4dCgpLmdldFVucXVhbGlmaWVkT2JqQ1BvaW50ZXJUeXBlKEktPmdldFR5cGUoKSkuCi0gICAgICAgICAgICAgICAgICAgIGdldEFzU3RyaW5nKFBvbGljeSkgPDwgJyAnIDw8ICoqSSA8PCAiO1xuIjsKLSAgICB9CisgICAgICAgICAgICAgICAgICAgIGdldEFzU3RyaW5nKFBvbGljeSkgPDwgJyAnIDw8ICpJIDw8ICI7XG4iOwogICAgIEluZGVudGF0aW9uIC09IFBvbGljeS5JbmRlbnRhdGlvbjsKICAgICBPdXQgPDwgIn1cbiI7CiAgIH0KQEAgLTEwOTAsMTMgKzEwODYsMTMgQEAKICAgICB9CiAKICAgICBpZiAoUERlY2wtPmdldFByb3BlcnR5QXR0cmlidXRlcygpICYgT2JqQ1Byb3BlcnR5RGVjbDo6T0JKQ19QUl9nZXR0ZXIpIHsKLSAgICAgIE91dCA8PCAoZmlyc3QgPyAnICcgOiAnLCcpIDw8ICJnZXR0ZXIgPSAiCi0gICAgICAgICAgPDwgUERlY2wtPmdldEdldHRlck5hbWUoKS5nZXRBc1N0cmluZygpOworICAgICAgT3V0IDw8IChmaXJzdCA/ICcgJyA6ICcsJykgPDwgImdldHRlciA9ICI7CisgICAgICBQRGVjbC0+Z2V0R2V0dGVyTmFtZSgpLnByaW50KE91dCk7CiAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgIH0KICAgICBpZiAoUERlY2wtPmdldFByb3BlcnR5QXR0cmlidXRlcygpICYgT2JqQ1Byb3BlcnR5RGVjbDo6T0JKQ19QUl9zZXR0ZXIpIHsKLSAgICAgIE91dCA8PCAoZmlyc3QgPyAnICcgOiAnLCcpIDw8ICJzZXR0ZXIgPSAiCi0gICAgICAgICAgPDwgUERlY2wtPmdldFNldHRlck5hbWUoKS5nZXRBc1N0cmluZygpOworICAgICAgT3V0IDw8IChmaXJzdCA/ICcgJyA6ICcsJykgPDwgInNldHRlciA9ICI7CisgICAgICBQRGVjbC0+Z2V0U2V0dGVyTmFtZSgpLnByaW50KE91dCk7CiAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL0FTVC9EZWNsVGVtcGxhdGUuY3BwIGIvbGliL0FTVC9EZWNsVGVtcGxhdGUuY3BwCmluZGV4IDcxNzJmYjcuLmZjNzNlNmYgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvRGVjbFRlbXBsYXRlLmNwcAorKysgYi9saWIvQVNUL0RlY2xUZW1wbGF0ZS5jcHAKQEAgLTIyOSwxNCArMjI5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpEZWNsKSB7CiAgIEFkb3B0VGVtcGxhdGVQYXJhbWV0ZXJMaXN0KFBhcmFtcywgY2FzdDxEZWNsQ29udGV4dD4oRGVjbCkpOwotICByZXR1cm4gbmV3IChDKSBGdW5jdGlvblRlbXBsYXRlRGVjbChEQywgTCwgTmFtZSwgUGFyYW1zLCBEZWNsKTsKKyAgcmV0dXJuIG5ldyAoQywgREMpIEZ1bmN0aW9uVGVtcGxhdGVEZWNsKERDLCBMLCBOYW1lLCBQYXJhbXMsIERlY2wpOwogfQogCiBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRnVuY3Rpb25UZW1wbGF0ZURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoRnVuY3Rpb25UZW1wbGF0ZURlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBGdW5jdGlvblRlbXBsYXRlRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBEZWNsYXJhdGlvbk5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIEZ1bmN0aW9uVGVtcGxhdGVEZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIERlY2xhcmF0aW9uTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCk7CiB9CiAKIFJlZGVjbGFyYWJsZVRlbXBsYXRlRGVjbDo6Q29tbW9uQmFzZSAqCkBAIC0zMDgsMTUgKzMwNywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpEZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NUZW1wbGF0ZURlY2wgKlByZXZEZWNsKSB7CiAgIEFkb3B0VGVtcGxhdGVQYXJhbWV0ZXJMaXN0KFBhcmFtcywgY2FzdDxEZWNsQ29udGV4dD4oRGVjbCkpOwotICBDbGFzc1RlbXBsYXRlRGVjbCAqTmV3ID0gbmV3IChDKSBDbGFzc1RlbXBsYXRlRGVjbChEQywgTCwgTmFtZSwgUGFyYW1zLCBEZWNsKTsKKyAgQ2xhc3NUZW1wbGF0ZURlY2wgKk5ldyA9CisgICAgICBuZXcgKEMsIERDKSBDbGFzc1RlbXBsYXRlRGVjbChEQywgTCwgTmFtZSwgUGFyYW1zLCBEZWNsKTsKICAgTmV3LT5zZXRQcmV2aW91c0RlY2woUHJldkRlY2wpOwogICByZXR1cm4gTmV3OwogfQogCiBDbGFzc1RlbXBsYXRlRGVjbCAqQ2xhc3NUZW1wbGF0ZURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKENsYXNzVGVtcGxhdGVEZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgQ2xhc3NUZW1wbGF0ZURlY2woRW1wdHlTaGVsbCgpKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIENsYXNzVGVtcGxhdGVEZWNsKEVtcHR5U2hlbGwoKSk7CiB9CiAKIHZvaWQgQ2xhc3NUZW1wbGF0ZURlY2w6OkxvYWRMYXp5U3BlY2lhbGl6YXRpb25zKCkgY29uc3QgewpAQCAtNDcxLDcgKzQ3MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEQsIHVuc2lnbmVkIFAsIElkZW50aWZpZXJJbmZvICpJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBUeXBlbmFtZSwgYm9vbCBQYXJhbWV0ZXJQYWNrKSB7CiAgIFRlbXBsYXRlVHlwZVBhcm1EZWNsICpUVFBEZWNsID0KLSAgICBuZXcgKEMpIFRlbXBsYXRlVHlwZVBhcm1EZWNsKERDLCBLZXlMb2MsIE5hbWVMb2MsIElkLCBUeXBlbmFtZSk7CisgICAgbmV3IChDLCBEQykgVGVtcGxhdGVUeXBlUGFybURlY2woREMsIEtleUxvYywgTmFtZUxvYywgSWQsIFR5cGVuYW1lKTsKICAgUXVhbFR5cGUgVFRQVHlwZSA9IEMuZ2V0VGVtcGxhdGVUeXBlUGFybVR5cGUoRCwgUCwgUGFyYW1ldGVyUGFjaywgVFRQRGVjbCk7CiAgIFRUUERlY2wtPlR5cGVGb3JEZWNsID0gVFRQVHlwZS5nZXRUeXBlUHRyKCk7CiAgIHJldHVybiBUVFBEZWNsOwpAQCAtNDc5LDkgKzQ3OCw4IEBACiAKIFRlbXBsYXRlVHlwZVBhcm1EZWNsICoKIFRlbXBsYXRlVHlwZVBhcm1EZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoY29uc3QgQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoVGVtcGxhdGVUeXBlUGFybURlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBUZW1wbGF0ZVR5cGVQYXJtRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGZhbHNlKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQpIFRlbXBsYXRlVHlwZVBhcm1EZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBmYWxzZSk7CiB9CiAKIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlVHlwZVBhcm1EZWNsOjpnZXREZWZhdWx0QXJndW1lbnRMb2MoKSBjb25zdCB7CkBAIC01NDQsOCArNTQyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRCwgdW5zaWduZWQgUCwgSWRlbnRpZmllckluZm8gKklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBib29sIFBhcmFtZXRlclBhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUSW5mbykgewotICByZXR1cm4gbmV3IChDKSBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbChEQywgU3RhcnRMb2MsIElkTG9jLCBELCBQLCBJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCwgUGFyYW1ldGVyUGFjaywgVEluZm8pOworICByZXR1cm4gbmV3IChDLCBEQykgTm9uVHlwZVRlbXBsYXRlUGFybURlY2woREMsIFN0YXJ0TG9jLCBJZExvYywgRCwgUCwgSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULCBQYXJhbWV0ZXJQYWNrLCBUSW5mbyk7CiB9CiAKIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsICoKQEAgLTU1NywzNCArNTU1LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFF1YWxUeXBlICpFeHBhbmRlZFR5cGVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtRXhwYW5kZWRUeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKipFeHBhbmRlZFRJbmZvcykgewotICB1bnNpZ25lZCBTaXplID0gc2l6ZW9mKE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsKSAKLSAgICAgICAgICAgICAgICArIE51bUV4cGFuZGVkVHlwZXMgKiAyICogc2l6ZW9mKHZvaWQqKTsKLSAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShTaXplKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbChEQywgU3RhcnRMb2MsIElkTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQsIFAsIElkLCBULCBUSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRlZFR5cGVzLCBOdW1FeHBhbmRlZFR5cGVzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRlZFRJbmZvcyk7CisgIHVuc2lnbmVkIEV4dHJhID0gTnVtRXhwYW5kZWRUeXBlcyAqIDIgKiBzaXplb2Yodm9pZCopOworICByZXR1cm4gbmV3IChDLCBEQywgRXh0cmEpIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsKAorICAgICAgREMsIFN0YXJ0TG9jLCBJZExvYywgRCwgUCwgSWQsIFQsIFRJbmZvLAorICAgICAgRXhwYW5kZWRUeXBlcywgTnVtRXhwYW5kZWRUeXBlcywgRXhwYW5kZWRUSW5mb3MpOwogfQogCiBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCAqCiBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgc2l6ZW9mKE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgTm9uVHlwZVRlbXBsYXRlUGFybURlY2woMCwgU291cmNlTG9jYXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgMCwgMCwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUoKSwgZmFsc2UsIDApOworICByZXR1cm4gbmV3IChDLCBJRCkgTm9uVHlwZVRlbXBsYXRlUGFybURlY2woMCwgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSgpLCBmYWxzZSwgMCk7CiB9CiAKIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsICoKIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUV4cGFuZGVkVHlwZXMpIHsKLSAgdW5zaWduZWQgU2l6ZSA9IHNpemVvZihOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCkgCi0gICAgICAgICAgICAgICAgKyBOdW1FeHBhbmRlZFR5cGVzICogMiAqIHNpemVvZih2b2lkKik7Ci0gIAotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIFNpemUpOwotICByZXR1cm4gbmV3IChNZW0pIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIDAsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUoKSwgMCwgMCwgTnVtRXhwYW5kZWRUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgdW5zaWduZWQgRXh0cmEgPSBOdW1FeHBhbmRlZFR5cGVzICogMiAqIHNpemVvZih2b2lkKik7CisgIHJldHVybiBuZXcgKEMsIElELCBFeHRyYSkgTm9uVHlwZVRlbXBsYXRlUGFybURlY2woCisgICAgICAwLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCAwLCAwLCAwLCBRdWFsVHlwZSgpLCAwLAorICAgICAgMCwgTnVtRXhwYW5kZWRUeXBlcywgMCk7CiB9CiAKIFNvdXJjZVJhbmdlIE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsOjpnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IHsKQEAgLTYyNCw4ICs2MTQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwgdW5zaWduZWQgRCwgdW5zaWduZWQgUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUGFyYW1ldGVyUGFjaywgSWRlbnRpZmllckluZm8gKklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpQYXJhbXMpIHsKLSAgcmV0dXJuIG5ldyAoQykgVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsKERDLCBMLCBELCBQLCBQYXJhbWV0ZXJQYWNrLCBJZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMpOworICByZXR1cm4gbmV3IChDLCBEQykgVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsKERDLCBMLCBELCBQLCBQYXJhbWV0ZXJQYWNrLCBJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMpOwogfQogCiBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKgpAQCAtNjM0LDI4ICs2MjQsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICo+IEV4cGFuc2lvbnMpIHsKLSAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShzaXplb2YoVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRlbXBsYXRlUGFyYW1ldGVyTGlzdCopICogRXhwYW5zaW9ucy5zaXplKCkpOwotICByZXR1cm4gbmV3IChNZW0pIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbChEQywgTCwgRCwgUCwgSWQsIFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwYW5zaW9ucy5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbnMuZGF0YSgpKTsKKyAgcmV0dXJuIG5ldyAoQywgREMsIHNpemVvZihUZW1wbGF0ZVBhcmFtZXRlckxpc3QqKSAqIEV4cGFuc2lvbnMuc2l6ZSgpKQorICAgICAgVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsKERDLCBMLCBELCBQLCBJZCwgUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvbnMuc2l6ZSgpLCBFeHBhbnNpb25zLmRhdGEoKSk7CiB9CiAKIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCAqCiBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2woMCwgU291cmNlTG9jYXRpb24oKSwgMCwgMCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICByZXR1cm4gbmV3IChDLCBJRCkgVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIDAsIDAsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOwogfQogCiBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKgogVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywgdW5zaWduZWQgSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1FeHBhbnNpb25zKSB7Ci0gIHVuc2lnbmVkIFNpemUgPSBzaXplb2YoVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsKSArCi0gICAgICAgICAgICAgICAgICBzaXplb2YoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0KikgKiBOdW1FeHBhbnNpb25zOwotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIFNpemUpOwotICByZXR1cm4gbmV3IChNZW0pIFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCAwLCAwLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1FeHBhbnNpb25zLCAwKTsKKyAgcmV0dXJuIG5ldyAoQywgSUQsIHNpemVvZihUZW1wbGF0ZVBhcmFtZXRlckxpc3QqKSAqIE51bUV4cGFuc2lvbnMpCisgICAgICBUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2woMCwgU291cmNlTG9jYXRpb24oKSwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1FeHBhbnNpb25zLCAwKTsKIH0KIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTczNCwxMyArNzE5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAqQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1BcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpQcmV2RGVjbCkgewotICBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpSZXN1bHQKLSAgICA9IG5ldyAoQ29udGV4dClDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSywgREMsIFN0YXJ0TG9jLCBJZExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpYWxpemVkVGVtcGxhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzLCBOdW1BcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldkRlY2wpOworICBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpSZXN1bHQgPQorICAgICAgbmV3IChDb250ZXh0LCBEQykgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCgKKyAgICAgICAgICBDb250ZXh0LCBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb24sIFRLLCBEQywgU3RhcnRMb2MsIElkTG9jLAorICAgICAgICAgIFNwZWNpYWxpemVkVGVtcGxhdGUsIEFyZ3MsIE51bUFyZ3MsIFByZXZEZWNsKTsKICAgUmVzdWx0LT5NYXlIYXZlT3V0T2ZEYXRlRGVmID0gZmFsc2U7CiAKICAgQ29udGV4dC5nZXRUeXBlRGVjbFR5cGUoUmVzdWx0LCBQcmV2RGVjbCk7CkBAIC03NDgsMTIgKzczMCwxMCBAQAogfQogCiBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICoKLUNsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCAKK0NsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElEKSB7Ci0gIHZvaWQgKk1lbSA9IEFsbG9jYXRlRGVzZXJpYWxpemVkRGVjbChDLCBJRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCkpOwogICBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpSZXN1bHQgPQotICAgIG5ldyAoTWVtKSBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbik7CisgICAgbmV3IChDLCBJRCkgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbChDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb24pOwogICBSZXN1bHQtPk1heUhhdmVPdXRPZkRhdGVEZWYgPSBmYWxzZTsKICAgcmV0dXJuIFJlc3VsdDsKIH0KQEAgLTg1NSwxNCArODM1LDEwIEBACiAgIGNvbnN0IEFTVFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqQVNUQXJnSW5mb3MgPQogICAgIEFTVFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbzo6Q3JlYXRlKENvbnRleHQsIEFyZ0luZm9zKTsKIAotICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUmVzdWx0Ci0gICAgPSBuZXcgKENvbnRleHQpQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2woQ29udGV4dCwgVEssIERDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBJZExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lhbGl6ZWRUZW1wbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzLCBOdW1BcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVEFyZ0luZm9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZEZWNsKTsKKyAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKlJlc3VsdCA9IG5ldyAoQ29udGV4dCwgREMpCisgICAgICBDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbChDb250ZXh0LCBUSywgREMsIFN0YXJ0TG9jLCBJZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcywgU3BlY2lhbGl6ZWRUZW1wbGF0ZSwgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUFyZ3MsIEFTVEFyZ0luZm9zLCBQcmV2RGVjbCk7CiAgIFJlc3VsdC0+c2V0U3BlY2lhbGl6YXRpb25LaW5kKFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uKTsKICAgUmVzdWx0LT5NYXlIYXZlT3V0T2ZEYXRlRGVmID0gZmFsc2U7CiAKQEAgLTg3MywxMCArODQ5LDggQEAKIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICoKIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCAKLSAgICAgICAgICAgICAgICBzaXplb2YoQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wpKTsKLSAgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKlJlc3VsdAotICAgID0gbmV3IChNZW0pIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsKCk7CisgIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICpSZXN1bHQgPQorICAgICAgbmV3IChDLCBJRCkgQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2woKTsKICAgUmVzdWx0LT5NYXlIYXZlT3V0T2ZEYXRlRGVmID0gZmFsc2U7CiAgIHJldHVybiBSZXN1bHQ7CiB9CkBAIC04OTQsMTUgKzg2OCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKipQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyaWVuZFVuaW9uIEZyaWVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRkxvYykgewotICBGcmllbmRUZW1wbGF0ZURlY2wgKlJlc3VsdAotICAgID0gbmV3IChDb250ZXh0KSBGcmllbmRUZW1wbGF0ZURlY2woREMsIEwsIE5QYXJhbXMsIFBhcmFtcywgRnJpZW5kLCBGTG9jKTsKLSAgcmV0dXJuIFJlc3VsdDsKKyAgcmV0dXJuIG5ldyAoQ29udGV4dCwgREMpIEZyaWVuZFRlbXBsYXRlRGVjbChEQywgTCwgTlBhcmFtcywgUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyaWVuZCwgRkxvYyk7CiB9CiAKIEZyaWVuZFRlbXBsYXRlRGVjbCAqRnJpZW5kVGVtcGxhdGVEZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoRnJpZW5kVGVtcGxhdGVEZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgRnJpZW5kVGVtcGxhdGVEZWNsKEVtcHR5U2hlbGwoKSk7CisgIHJldHVybiBuZXcgKEMsIElEKSBGcmllbmRUZW1wbGF0ZURlY2woRW1wdHlTaGVsbCgpKTsKIH0KIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTkxNiwxNCArODg4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkRlY2wpIHsKICAgQWRvcHRUZW1wbGF0ZVBhcmFtZXRlckxpc3QoUGFyYW1zLCBEQyk7Ci0gIHJldHVybiBuZXcgKEMpIFR5cGVBbGlhc1RlbXBsYXRlRGVjbChEQywgTCwgTmFtZSwgUGFyYW1zLCBEZWNsKTsKKyAgcmV0dXJuIG5ldyAoQywgREMpIFR5cGVBbGlhc1RlbXBsYXRlRGVjbChEQywgTCwgTmFtZSwgUGFyYW1zLCBEZWNsKTsKIH0KIAogVHlwZUFsaWFzVGVtcGxhdGVEZWNsICpUeXBlQWxpYXNUZW1wbGF0ZURlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woQywgSUQsIHNpemVvZihUeXBlQWxpYXNUZW1wbGF0ZURlY2wpKTsKLSAgcmV0dXJuIG5ldyAoTWVtKSBUeXBlQWxpYXNUZW1wbGF0ZURlY2woMCwgU291cmNlTG9jYXRpb24oKSwgRGVjbGFyYXRpb25OYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICByZXR1cm4gbmV3IChDLCBJRCkgVHlwZUFsaWFzVGVtcGxhdGVEZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIERlY2xhcmF0aW9uTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOwogfQogCiB2b2lkIFR5cGVBbGlhc1RlbXBsYXRlRGVjbDo6RGVhbGxvY2F0ZUNvbW1vbih2b2lkICpQdHIpIHsKQEAgLTk0NSwxMCArOTE2LDggQEAKIENsYXNzU2NvcGVGdW5jdGlvblNwZWNpYWxpemF0aW9uRGVjbCAqCiBDbGFzc1Njb3BlRnVuY3Rpb25TcGVjaWFsaXphdGlvbkRlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCAKLSAgICAgICAgICAgICAgICBzaXplb2YoQ2xhc3NTY29wZUZ1bmN0aW9uU3BlY2lhbGl6YXRpb25EZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgQ2xhc3NTY29wZUZ1bmN0aW9uU3BlY2lhbGl6YXRpb25EZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvKCkpOworICByZXR1cm4gbmV3IChDLCBJRCkgQ2xhc3NTY29wZUZ1bmN0aW9uU3BlY2lhbGl6YXRpb25EZWNsKAorICAgICAgMCwgU291cmNlTG9jYXRpb24oKSwgMCwgZmFsc2UsIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbygpKTsKIH0KIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTk3MiwyMCArOTQxLDE2IEBACiBWYXJUZW1wbGF0ZURlY2wgKlZhclRlbXBsYXRlRGVjbDo6Q3JlYXRlKEFTVENvbnRleHQgJkMsIERlY2xDb250ZXh0ICpEQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwgRGVjbGFyYXRpb25OYW1lIE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkRlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhclRlbXBsYXRlRGVjbCAqUHJldkRlY2wpIHsKLSAgVmFyVGVtcGxhdGVEZWNsICpOZXcgPSBuZXcgKEMpIFZhclRlbXBsYXRlRGVjbChEQywgTCwgTmFtZSwgUGFyYW1zLCBEZWNsKTsKLSAgTmV3LT5zZXRQcmV2aW91c0RlY2woUHJldkRlY2wpOwotICByZXR1cm4gTmV3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJEZWNsICpEZWNsKSB7CisgIHJldHVybiBuZXcgKEMsIERDKSBWYXJUZW1wbGF0ZURlY2woREMsIEwsIE5hbWUsIFBhcmFtcywgRGVjbCk7CiB9CiAKIFZhclRlbXBsYXRlRGVjbCAqVmFyVGVtcGxhdGVEZWNsOjpDcmVhdGVEZXNlcmlhbGl6ZWQoQVNUQ29udGV4dCAmQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSUQpIHsKLSAgdm9pZCAqTWVtID0gQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoVmFyVGVtcGxhdGVEZWNsKSk7Ci0gIHJldHVybiBuZXcgKE1lbSkgVmFyVGVtcGxhdGVEZWNsKEVtcHR5U2hlbGwoKSk7CisgIHJldHVybiBuZXcgKEMsIElEKSBWYXJUZW1wbGF0ZURlY2woRW1wdHlTaGVsbCgpKTsKIH0KIAotLy8gVE9ETzogVW5pZnkgYWNjcm9zcyBjbGFzcywgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIHRlbXBsYXRlcz8KKy8vIFRPRE86IFVuaWZ5IGFjcm9zcyBjbGFzcywgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIHRlbXBsYXRlcz8KIC8vICAgICAgIE1heSByZXF1aXJlIG1vdmluZyB0aGlzIGFuZCBDb21tb24gdG8gUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsLgogdm9pZCBWYXJUZW1wbGF0ZURlY2w6OkxvYWRMYXp5U3BlY2lhbGl6YXRpb25zKCkgY29uc3QgewogICBDb21tb24gKkNvbW1vblB0ciA9IGdldENvbW1vblB0cigpOwpAQCAtMTExMSwyMCArMTA3NiwxNCBAQAogICAgIFNvdXJjZUxvY2F0aW9uIElkTG9jLCBWYXJUZW1wbGF0ZURlY2wgKlNwZWNpYWxpemVkVGVtcGxhdGUsIFF1YWxUeXBlIFQsCiAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvLCBTdG9yYWdlQ2xhc3MgUywgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAqQXJncywKICAgICB1bnNpZ25lZCBOdW1BcmdzKSB7Ci0gIFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpSZXN1bHQgPSBuZXcgKENvbnRleHQpCi0gICAgICBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbChDb250ZXh0LCBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uLCBEQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBJZExvYywgU3BlY2lhbGl6ZWRUZW1wbGF0ZSwgVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJbmZvLCBTLCBBcmdzLCBOdW1BcmdzKTsKLSAgcmV0dXJuIFJlc3VsdDsKKyAgcmV0dXJuIG5ldyAoQ29udGV4dCwgREMpIFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKAorICAgICAgQ29udGV4dCwgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbiwgREMsIFN0YXJ0TG9jLCBJZExvYywKKyAgICAgIFNwZWNpYWxpemVkVGVtcGxhdGUsIFQsIFRJbmZvLCBTLCBBcmdzLCBOdW1BcmdzKTsKIH0KIAogVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKgogVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w6OkNyZWF0ZURlc2VyaWFsaXplZChBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPQotICAgICAgQWxsb2NhdGVEZXNlcmlhbGl6ZWREZWNsKEMsIElELCBzaXplb2YoVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wpKTsKLSAgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKlJlc3VsdCA9Ci0gICAgICBuZXcgKE1lbSkgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2woVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbik7Ci0gIHJldHVybiBSZXN1bHQ7CisgIHJldHVybiBuZXcgKEMsIElEKSBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbChWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uKTsKIH0KIAogdm9pZCBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbDo6Z2V0TmFtZUZvckRpYWdub3N0aWMoCkBAIC0xMTgzLDcgKzExNDIsNyBAQAogICAgID0gQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvOjpDcmVhdGUoQ29udGV4dCwgQXJnSW5mb3MpOwogCiAgIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUmVzdWx0ID0KLSAgICAgIG5ldyAoQ29udGV4dCkgVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsKAorICAgICAgbmV3IChDb250ZXh0LCBEQykgVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsKAogICAgICAgICAgIENvbnRleHQsIERDLCBTdGFydExvYywgSWRMb2MsIFBhcmFtcywgU3BlY2lhbGl6ZWRUZW1wbGF0ZSwgVCwgVEluZm8sCiAgICAgICAgICAgUywgQXJncywgTnVtQXJncywgQVNUQXJnSW5mb3MpOwogICBSZXN1bHQtPnNldFNwZWNpYWxpemF0aW9uS2luZChUU0tfRXhwbGljaXRTcGVjaWFsaXphdGlvbik7CkBAIC0xMTkzLDkgKzExNTIsNSBAQAogVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsICoKIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbDo6Q3JlYXRlRGVzZXJpYWxpemVkKEFTVENvbnRleHQgJkMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJRCkgewotICB2b2lkICpNZW0gPSBBbGxvY2F0ZURlc2VyaWFsaXplZERlY2woCi0gICAgICBDLCBJRCwgc2l6ZW9mKFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCkpOwotICBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKlJlc3VsdCA9Ci0gICAgICBuZXcgKE1lbSkgVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsKCk7Ci0gIHJldHVybiBSZXN1bHQ7CisgIHJldHVybiBuZXcgKEMsIElEKSBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2woKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9BU1QvRGVjbGFyYXRpb25OYW1lLmNwcCBiL2xpYi9BU1QvRGVjbGFyYXRpb25OYW1lLmNwcAppbmRleCBlMDY0ZTIzLi5mOTA0MWMwIDEwMDY0NAotLS0gYS9saWIvQVNUL0RlY2xhcmF0aW9uTmFtZS5jcHAKKysrIGIvbGliL0FTVC9EZWNsYXJhdGlvbk5hbWUuY3BwCkBAIC0xNDMsMTMgKzE0MywxNiBAQAogICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6T2JqQ1plcm9BcmdTZWxlY3RvcjoKICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6Ok9iakNPbmVBcmdTZWxlY3RvcjoKICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6Ok9iakNNdWx0aUFyZ1NlbGVjdG9yOgotICAgIHJldHVybiBPUyA8PCBOLmdldE9iakNTZWxlY3RvcigpLmdldEFzU3RyaW5nKCk7CisgICAgTi5nZXRPYmpDU2VsZWN0b3IoKS5wcmludChPUyk7CisgICAgcmV0dXJuIE9TOwogCiAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhDb25zdHJ1Y3Rvck5hbWU6IHsKICAgICBRdWFsVHlwZSBDbGFzc1R5cGUgPSBOLmdldENYWE5hbWVUeXBlKCk7CiAgICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKkNsYXNzUmVjID0gQ2xhc3NUeXBlLT5nZXRBczxSZWNvcmRUeXBlPigpKQogICAgICAgcmV0dXJuIE9TIDw8ICpDbGFzc1JlYy0+Z2V0RGVjbCgpOwotICAgIHJldHVybiBPUyA8PCBDbGFzc1R5cGUuZ2V0QXNTdHJpbmcoKTsKKyAgICBMYW5nT3B0aW9ucyBMTzsKKyAgICBMTy5DUGx1c1BsdXMgPSB0cnVlOworICAgIHJldHVybiBPUyA8PCBDbGFzc1R5cGUuZ2V0QXNTdHJpbmcoUHJpbnRpbmdQb2xpY3koTE8pKTsKICAgfQogCiAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhEZXN0cnVjdG9yTmFtZTogewpAQCAtMTU3LDcgKzE2MCw5IEBACiAgICAgUXVhbFR5cGUgVHlwZSA9IE4uZ2V0Q1hYTmFtZVR5cGUoKTsKICAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUmVjID0gVHlwZS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkKICAgICAgIHJldHVybiBPUyA8PCAqUmVjLT5nZXREZWNsKCk7Ci0gICAgcmV0dXJuIE9TIDw8IFR5cGUuZ2V0QXNTdHJpbmcoKTsKKyAgICBMYW5nT3B0aW9ucyBMTzsKKyAgICBMTy5DUGx1c1BsdXMgPSB0cnVlOworICAgIHJldHVybiBPUyA8PCBUeXBlLmdldEFzU3RyaW5nKFByaW50aW5nUG9saWN5KExPKSk7CiAgIH0KIAogICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYT3BlcmF0b3JOYW1lOiB7CkBAIC0xODQsNyArMTg5LDEwIEBACiAgICAgUXVhbFR5cGUgVHlwZSA9IE4uZ2V0Q1hYTmFtZVR5cGUoKTsKICAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUmVjID0gVHlwZS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkKICAgICAgIHJldHVybiBPUyA8PCAqUmVjLT5nZXREZWNsKCk7Ci0gICAgcmV0dXJuIE9TIDw8IFR5cGUuZ2V0QXNTdHJpbmcoKTsKKyAgICBMYW5nT3B0aW9ucyBMTzsKKyAgICBMTy5DUGx1c1BsdXMgPSB0cnVlOworICAgIExPLkJvb2wgPSB0cnVlOworICAgIHJldHVybiBPUyA8PCBUeXBlLmdldEFzU3RyaW5nKFByaW50aW5nUG9saWN5KExPKSk7CiAgIH0KICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWFVzaW5nRGlyZWN0aXZlOgogICAgIHJldHVybiBPUyA8PCAiPHVzaW5nLWRpcmVjdGl2ZT4iOwpAQCAtNTM3LDcgKzU0NSwxMCBAQAogICAgICAgICBPUyA8PCAnfic7CiAgICAgICBlbHNlIGlmIChOYW1lLmdldE5hbWVLaW5kKCkgPT0gRGVjbGFyYXRpb25OYW1lOjpDWFhDb252ZXJzaW9uRnVuY3Rpb25OYW1lKQogICAgICAgICBPUyA8PCAib3BlcmF0b3IgIjsKLSAgICAgIE9TIDw8IFRJbmZvLT5nZXRUeXBlKCkuZ2V0QXNTdHJpbmcoKTsKKyAgICAgIExhbmdPcHRpb25zIExPOworICAgICAgTE8uQ1BsdXNQbHVzID0gdHJ1ZTsKKyAgICAgIExPLkJvb2wgPSB0cnVlOworICAgICAgT1MgPDwgVEluZm8tPmdldFR5cGUoKS5nZXRBc1N0cmluZyhQcmludGluZ1BvbGljeShMTykpOwogICAgIH0gZWxzZQogICAgICAgT1MgPDwgTmFtZTsKICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9saWIvQVNUL0V4cHIuY3BwIGIvbGliL0FTVC9FeHByLmNwcAppbmRleCA5MDU1ZGRhLi4yZjVmMTRmIDEwMDY0NAotLS0gYS9saWIvQVNUL0V4cHIuY3BwCisrKyBiL2xpYi9BU1QvRXhwci5jcHAKQEAgLTEwNSwzNyArMTA1LDYgQEAKICAgcmV0dXJuIEU7CiB9CiAKLWNvbnN0IEV4cHIgKgotRXhwcjo6ZmluZE1hdGVyaWFsaXplZFRlbXBvcmFyeShjb25zdCBNYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHIgKiZNVEUpIGNvbnN0IHsKLSAgY29uc3QgRXhwciAqRSA9IHRoaXM7Ci0KLSAgLy8gVGhpcyBtaWdodCBiZSBhIGRlZmF1bHQgaW5pdGlhbGl6ZXIgZm9yIGEgcmVmZXJlbmNlIG1lbWJlci4gV2FsayBvdmVyIHRoZQotICAvLyB3cmFwcGVyIG5vZGUgZm9yIHRoYXQuCi0gIGlmIChjb25zdCBDWFhEZWZhdWx0SW5pdEV4cHIgKkRBRSA9IGR5bl9jYXN0PENYWERlZmF1bHRJbml0RXhwcj4oRSkpCi0gICAgRSA9IERBRS0+Z2V0RXhwcigpOwotCi0gIC8vIExvb2sgdGhyb3VnaCBzaW5nbGUtZWxlbWVudCBpbml0IGxpc3RzIHRoYXQgY2xhaW0gdG8gYmUgbHZhbHVlcy4gVGhleSdyZQotICAvLyBqdXN0IHN5bnRhY3RpYyB3cmFwcGVycyBpbiB0aGlzIGNhc2UuCi0gIGlmIChjb25zdCBJbml0TGlzdEV4cHIgKklMRSA9IGR5bl9jYXN0PEluaXRMaXN0RXhwcj4oRSkpIHsKLSAgICBpZiAoSUxFLT5nZXROdW1Jbml0cygpID09IDEgJiYgSUxFLT5pc0dMVmFsdWUoKSkgewotICAgICAgRSA9IElMRS0+Z2V0SW5pdCgwKTsKLSAgICAgIGlmIChjb25zdCBDWFhEZWZhdWx0SW5pdEV4cHIgKkRBRSA9IGR5bl9jYXN0PENYWERlZmF1bHRJbml0RXhwcj4oRSkpCi0gICAgICAgIEUgPSBEQUUtPmdldEV4cHIoKTsKLSAgICB9Ci0gIH0KLQotICAvLyBMb29rIHRocm91Z2ggZXhwcmVzc2lvbnMgZm9yIG1hdGVyaWFsaXplZCB0ZW1wb3JhcmllcyAoZm9yIG5vdykuCi0gIGlmIChjb25zdCBNYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHIgKk0KLSAgICAgID0gZHluX2Nhc3Q8TWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByPihFKSkgewotICAgIE1URSA9IE07Ci0gICAgRSA9IE0tPkdldFRlbXBvcmFyeUV4cHIoKTsKLSAgfQotCi0gIGlmIChjb25zdCBDWFhEZWZhdWx0QXJnRXhwciAqREFFID0gZHluX2Nhc3Q8Q1hYRGVmYXVsdEFyZ0V4cHI+KEUpKQotICAgIEUgPSBEQUUtPmdldEV4cHIoKTsKLSAgcmV0dXJuIEU7Ci19Ci0KIC8vLyBpc0tub3duVG9IYXZlQm9vbGVhblZhbHVlIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBpbnRlZ2VyIGV4cHJlc3Npb24KIC8vLyB0aGF0IGlzIGtub3duIHRvIHJldHVybiAwIG9yIDEuICBUaGlzIGhhcHBlbnMgZm9yIF9Cb29sL2Jvb2wgZXhwcmVzc2lvbnMKIC8vLyBidXQgYWxzbyBpbnQgZXhwcmVzc2lvbnMgd2hpY2ggYXJlIHByb2R1Y2VkIGJ5IHRoaW5ncyBsaWtlIGNvbXBhcmlzb25zIGluCkBAIC00ODQsNyArNDUzLDcgQEAKIAogICBpZiAoSVQgPT0gUHJlZGVmaW5lZEV4cHI6OkZ1bmNETmFtZSkgewogICAgIGlmIChjb25zdCBOYW1lZERlY2wgKk5EID0gZHluX2Nhc3Q8TmFtZWREZWNsPihDdXJyZW50RGVjbCkpIHsKLSAgICAgIE93bmluZ1B0cjxNYW5nbGVDb250ZXh0PiBNQzsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNYW5nbGVDb250ZXh0PiBNQzsKICAgICAgIE1DLnJlc2V0KENvbnRleHQuY3JlYXRlTWFuZ2xlQ29udGV4dCgpKTsKIAogICAgICAgaWYgKE1DLT5zaG91bGRNYW5nbGVEZWNsTmFtZShORCkpIHsKQEAgLTYxOSwxMyArNTg4LDE1IEBACiAgICAgLy8gbm90IGEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4KICAgICBpZiAoKGlzYTxDWFhNZXRob2REZWNsPihGRCkgJiYKICAgICAgICAgIGNhc3Q8Q1hYTWV0aG9kRGVjbD4oRkQpLT5nZXRQYXJlbnQoKS0+aXNMYW1iZGEoKSkgfHwKLSAgICAgICAgKEZUICYmIEZULT5nZXRSZXN1bHRUeXBlKCktPmdldEFzPEF1dG9UeXBlPigpKSkKKyAgICAgICAgKEZUICYmIEZULT5nZXRSZXR1cm5UeXBlKCktPmdldEFzPEF1dG9UeXBlPigpKSkKICAgICAgIFByb3RvID0gImF1dG8gIiArIFByb3RvOwotICAgIGVsc2UgaWYgKEZUICYmIEZULT5nZXRSZXN1bHRUeXBlKCktPmdldEFzPERlY2x0eXBlVHlwZT4oKSkKLSAgICAgIEZULT5nZXRSZXN1bHRUeXBlKCktPmdldEFzPERlY2x0eXBlVHlwZT4oKS0+Z2V0VW5kZXJseWluZ1R5cGUoKQorICAgIGVsc2UgaWYgKEZUICYmIEZULT5nZXRSZXR1cm5UeXBlKCktPmdldEFzPERlY2x0eXBlVHlwZT4oKSkKKyAgICAgIEZULT5nZXRSZXR1cm5UeXBlKCkKKyAgICAgICAgICAtPmdldEFzPERlY2x0eXBlVHlwZT4oKQorICAgICAgICAgIC0+Z2V0VW5kZXJseWluZ1R5cGUoKQogICAgICAgICAgIC5nZXRBc1N0cmluZ0ludGVybmFsKFByb3RvLCBQb2xpY3kpOwogICAgIGVsc2UgaWYgKCFpc2E8Q1hYQ29uc3RydWN0b3JEZWNsPihGRCkgJiYgIWlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oRkQpKQotICAgICAgQUZULT5nZXRSZXN1bHRUeXBlKCkuZ2V0QXNTdHJpbmdJbnRlcm5hbChQcm90bywgUG9saWN5KTsKKyAgICAgIEFGVC0+Z2V0UmV0dXJuVHlwZSgpLmdldEFzU3RyaW5nSW50ZXJuYWwoUHJvdG8sIFBvbGljeSk7CiAKICAgICBPdXQgPDwgUHJvdG87CiAKQEAgLTY1OCw3ICs2MjksNyBAQAogICAgICAgT3V0IDw8ICcoJyA8PCAqQ0lEIDw8ICcpJzsKIAogICAgIE91dCA8PCAgJyAnOwotICAgIE91dCA8PCBNRC0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpOworICAgIE1ELT5nZXRTZWxlY3RvcigpLnByaW50KE91dCk7CiAgICAgT3V0IDw8ICAnXSc7CiAKICAgICBPdXQuZmx1c2goKTsKQEAgLTgxMCw2ICs3ODEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0tpbmQgS2luZCwgYm9vbCBQYXNjYWwsIFF1YWxUeXBlIFR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZUxvY2F0aW9uICpMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtU3RycykgeworICBhc3NlcnQoQy5nZXRBc0NvbnN0YW50QXJyYXlUeXBlKFR5KSAmJgorICAgICAgICAgIlN0cmluZ0xpdGVyYWwgbXVzdCBiZSBvZiBjb25zdGFudCBhcnJheSB0eXBlISIpOworCiAgIC8vIEFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgdGhlIFN0cmluZ0xpdGVyYWwgcGx1cyBhbiBhcnJheSBvZiBsb2NhdGlvbnMgZm9yCiAgIC8vIGFueSBjb25jYXRlbmF0ZWQgc3RyaW5nIHRva2Vucy4KICAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShzaXplb2YoU3RyaW5nTGl0ZXJhbCkrCkBAIC0xMjE1LDkgKzExODksOSBAQAogICB0aGlzLT5OdW1BcmdzID0gTnVtQXJnczsKIH0KIAotLy8vIGlzQnVpbHRpbkNhbGwgLSBJZiB0aGlzIGlzIGEgY2FsbCB0byBhIGJ1aWx0aW4sIHJldHVybiB0aGUgYnVpbHRpbiBJRC4gIElmCisvLy8gZ2V0QnVpbHRpbkNhbGxlZSAtIElmIHRoaXMgaXMgYSBjYWxsIHRvIGEgYnVpbHRpbiwgcmV0dXJuIHRoZSBidWlsdGluIElELiBJZgogLy8vIG5vdCwgcmV0dXJuIDAuCi11bnNpZ25lZCBDYWxsRXhwcjo6aXNCdWlsdGluQ2FsbCgpIGNvbnN0IHsKK3Vuc2lnbmVkIENhbGxFeHByOjpnZXRCdWlsdGluQ2FsbGVlKCkgY29uc3QgewogICAvLyBBbGwgc2ltcGxlIGZ1bmN0aW9uIGNhbGxzIChlLmcuIGZ1bmMoKSkgYXJlIGltcGxpY2l0bHkgY2FzdCB0byBwb2ludGVyIHRvCiAgIC8vIGZ1bmN0aW9uLiBBcyBhIHJlc3VsdCwgd2UgdHJ5IGFuZCBvYnRhaW4gdGhlIERlY2xSZWZFeHByIGZyb20gdGhlCiAgIC8vIEltcGxpY2l0Q2FzdEV4cHIuCkBAIC0xMjQwLDcgKzEyMTQsNyBAQAogfQogCiBib29sIENhbGxFeHByOjppc1VuZXZhbHVhdGVkQnVpbHRpbkNhbGwoQVNUQ29udGV4dCAmQ3R4KSBjb25zdCB7Ci0gIGlmICh1bnNpZ25lZCBCSSA9IGlzQnVpbHRpbkNhbGwoKSkKKyAgaWYgKHVuc2lnbmVkIEJJID0gZ2V0QnVpbHRpbkNhbGxlZSgpKQogICAgIHJldHVybiBDdHguQnVpbHRpbkluZm8uaXNVbmV2YWx1YXRlZChCSSk7CiAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTEyNTYsNyArMTIzMCw3IEBACiAgICAgQ2FsbGVlVHlwZSA9IEV4cHI6OmZpbmRCb3VuZE1lbWJlclR5cGUoZ2V0Q2FsbGVlKCkpOwogICAgIAogICBjb25zdCBGdW5jdGlvblR5cGUgKkZuVHlwZSA9IENhbGxlZVR5cGUtPmNhc3RBczxGdW5jdGlvblR5cGU+KCk7Ci0gIHJldHVybiBGblR5cGUtPmdldFJlc3VsdFR5cGUoKTsKKyAgcmV0dXJuIEZuVHlwZS0+Z2V0UmV0dXJuVHlwZSgpOwogfQogCiBTb3VyY2VMb2NhdGlvbiBDYWxsRXhwcjo6Z2V0TG9jU3RhcnQoKSBjb25zdCB7CkBAIC0xNDIxLDcgKzEzOTUsNyBAQAogICByZXR1cm4gRW5kTG9jOwogfQogCi12b2lkIENhc3RFeHByOjpDaGVja0Nhc3RDb25zaXN0ZW5jeSgpIGNvbnN0IHsKK2Jvb2wgQ2FzdEV4cHI6OkNhc3RDb25zaXN0ZW5jeSgpIGNvbnN0IHsKICAgc3dpdGNoIChnZXRDYXN0S2luZCgpKSB7CiAgIGNhc2UgQ0tfRGVyaXZlZFRvQmFzZToKICAgY2FzZSBDS19VbmNoZWNrZWREZXJpdmVkVG9CYXNlOgpAQCAtMTQ3NCw2ICsxNDQ4LDExIEBACiAgICAgYXNzZXJ0KGdldFN1YkV4cHIoKS0+Z2V0VHlwZSgpLT5pc0Z1bmN0aW9uVHlwZSgpKTsKICAgICBnb3RvIENoZWNrTm9CYXNlUGF0aDsKIAorICBjYXNlIENLX0FkZHJlc3NTcGFjZUNvbnZlcnNpb246CisgICAgYXNzZXJ0KGdldFR5cGUoKS0+aXNQb2ludGVyVHlwZSgpKTsKKyAgICBhc3NlcnQoZ2V0U3ViRXhwcigpLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5cGUoKSk7CisgICAgYXNzZXJ0KGdldFR5cGUoKS0+Z2V0UG9pbnRlZVR5cGUoKS5nZXRBZGRyZXNzU3BhY2UoKSAhPQorICAgICAgICAgICBnZXRTdWJFeHByKCktPmdldFR5cGUoKS0+Z2V0UG9pbnRlZVR5cGUoKS5nZXRBZGRyZXNzU3BhY2UoKSk7CiAgIC8vIFRoZXNlIHNob3VsZCBub3QgaGF2ZSBhbiBpbmhlcml0YW5jZSBwYXRoLgogICBjYXNlIENLX0R5bmFtaWM6CiAgIGNhc2UgQ0tfVG9VbmlvbjoKQEAgLTE1MjQsNiArMTUwMyw3IEBACiAgICAgYXNzZXJ0KHBhdGhfZW1wdHkoKSAmJiAiQ2FzdCBraW5kIHNob3VsZCBub3QgaGF2ZSBhIGJhc2UgcGF0aCEiKTsKICAgICBicmVhazsKICAgfQorICByZXR1cm4gdHJ1ZTsKIH0KIAogY29uc3QgY2hhciAqQ2FzdEV4cHI6OmdldENhc3RLaW5kTmFtZSgpIGNvbnN0IHsKQEAgLTE2MjUsNyArMTYwNSw3IEBACiAgIGNhc2UgQ0tfQVJDUmVjbGFpbVJldHVybmVkT2JqZWN0OgogICAgIHJldHVybiAiQVJDUmVjbGFpbVJldHVybmVkT2JqZWN0IjsKICAgY2FzZSBDS19BUkNFeHRlbmRCbG9ja09iamVjdDoKLSAgICByZXR1cm4gIkFSQ0NFeHRlbmRCbG9ja09iamVjdCI7CisgICAgcmV0dXJuICJBUkNFeHRlbmRCbG9ja09iamVjdCI7CiAgIGNhc2UgQ0tfQXRvbWljVG9Ob25BdG9taWM6CiAgICAgcmV0dXJuICJBdG9taWNUb05vbkF0b21pYyI7CiAgIGNhc2UgQ0tfTm9uQXRvbWljVG9BdG9taWM6CkBAIC0xNjM2LDYgKzE2MTYsOCBAQAogICAgIHJldHVybiAiQnVpbHRpbkZuVG9GblB0ciI7CiAgIGNhc2UgQ0tfWmVyb1RvT0NMRXZlbnQ6CiAgICAgcmV0dXJuICJaZXJvVG9PQ0xFdmVudCI7CisgIGNhc2UgQ0tfQWRkcmVzc1NwYWNlQ29udmVyc2lvbjoKKyAgICByZXR1cm4gIkFkZHJlc3NTcGFjZUNvbnZlcnNpb24iOwogICB9CiAKICAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIGNhc3Qga2luZCEiKTsKQEAgLTE4NjcsMTIgKzE4NDksMTIgQEAKIEV4cHIgKkluaXRMaXN0RXhwcjo6dXBkYXRlSW5pdChjb25zdCBBU1RDb250ZXh0ICZDLCB1bnNpZ25lZCBJbml0LCBFeHByICpleHByKSB7CiAgIGlmIChJbml0ID49IEluaXRFeHBycy5zaXplKCkpIHsKICAgICBJbml0RXhwcnMuaW5zZXJ0KEMsIEluaXRFeHBycy5lbmQoKSwgSW5pdCAtIEluaXRFeHBycy5zaXplKCkgKyAxLCAwKTsKLSAgICBJbml0RXhwcnMuYmFjaygpID0gZXhwcjsKKyAgICBzZXRJbml0KEluaXQsIGV4cHIpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgRXhwciAqUmVzdWx0ID0gY2FzdF9vcl9udWxsPEV4cHI+KEluaXRFeHByc1tJbml0XSk7Ci0gIEluaXRFeHByc1tJbml0XSA9IGV4cHI7CisgIHNldEluaXQoSW5pdCwgZXhwcik7CiAgIHJldHVybiBSZXN1bHQ7CiB9CiAKQEAgLTE4OTIsNyArMTg3NCwxMSBAQAogICBjb25zdCBBcnJheVR5cGUgKkFUID0gZ2V0VHlwZSgpLT5nZXRBc0FycmF5VHlwZVVuc2FmZSgpOwogICBpZiAoIUFUIHx8ICFBVC0+Z2V0RWxlbWVudFR5cGUoKS0+aXNJbnRlZ2VyVHlwZSgpKQogICAgIHJldHVybiBmYWxzZTsKLSAgY29uc3QgRXhwciAqSW5pdCA9IGdldEluaXQoMCktPklnbm9yZVBhcmVucygpOworICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgZ2V0SW5pdCgpIHRvIHJldHVybiBudWxsLgorICBjb25zdCBFeHByICpJbml0ID0gZ2V0SW5pdCgwKTsKKyAgaWYgKCFJbml0KQorICAgIHJldHVybiBmYWxzZTsKKyAgSW5pdCA9IEluaXQtPklnbm9yZVBhcmVucygpOwogICByZXR1cm4gaXNhPFN0cmluZ0xpdGVyYWw+KEluaXQpIHx8IGlzYTxPYmpDRW5jb2RlRXhwcj4oSW5pdCk7CiB9CiAKQEAgLTIwNzgsMTUgKzIwNjQsMjIgQEAKICAgICByZXR1cm4gdHJ1ZTsKIAogICBjYXNlIENYWE9wZXJhdG9yQ2FsbEV4cHJDbGFzczogewotICAgIC8vIFdlIHdhcm4gYWJvdXQgb3BlcmF0b3I9PSBhbmQgb3BlcmF0b3IhPSBldmVuIHdoZW4gdXNlci1kZWZpbmVkIG9wZXJhdG9yCisgICAgLy8gV2FybiBhYm91dCBvcGVyYXRvciA9PSwhPSw8LD4sPD0sIGFuZCA+PSBldmVuIHdoZW4gdXNlci1kZWZpbmVkIG9wZXJhdG9yCiAgICAgLy8gb3ZlcmxvYWRzIGFzIHRoZXJlIGlzIG5vIHJlYXNvbmFibGUgd2F5IHRvIGRlZmluZSB0aGVzZSBzdWNoIHRoYXQgdGhleQogICAgIC8vIGhhdmUgbm9uLXRyaXZpYWwsIGRlc2lyYWJsZSBzaWRlLWVmZmVjdHMuIFNlZSB0aGUgLVd1bnVzZWQtY29tcGFyaXNvbgotICAgIC8vIHdhcm5pbmc6IHRoZXNlIG9wZXJhdG9ycyBhcmUgY29tbW9ubHkgdHlwbydlZCwgYW5kIHNvIHdhcm5pbmcgb24gdGhlbQorICAgIC8vIHdhcm5pbmc6IG9wZXJhdG9ycyA9PSBhbmQgIT0gYXJlIGNvbW1vbmx5IHR5cG8nZWQsIGFuZCBzbyB3YXJuaW5nIG9uIHRoZW0KICAgICAvLyBwcm92aWRlcyBhZGRpdGlvbmFsIHZhbHVlIGFzIHdlbGwuIElmIHRoaXMgbGlzdCBpcyB1cGRhdGVkLAogICAgIC8vIERpYWdub3NlVW51c2VkQ29tcGFyaXNvbiBzaG91bGQgYmUgYXMgd2VsbC4KICAgICBjb25zdCBDWFhPcGVyYXRvckNhbGxFeHByICpPcCA9IGNhc3Q8Q1hYT3BlcmF0b3JDYWxsRXhwcj4odGhpcyk7Ci0gICAgaWYgKE9wLT5nZXRPcGVyYXRvcigpID09IE9PX0VxdWFsRXF1YWwgfHwKLSAgICAgICAgT3AtPmdldE9wZXJhdG9yKCkgPT0gT09fRXhjbGFpbUVxdWFsKSB7CisgICAgc3dpdGNoIChPcC0+Z2V0T3BlcmF0b3IoKSkgeworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIE9PX0VxdWFsRXF1YWw6CisgICAgY2FzZSBPT19FeGNsYWltRXF1YWw6CisgICAgY2FzZSBPT19MZXNzOgorICAgIGNhc2UgT09fR3JlYXRlcjoKKyAgICBjYXNlIE9PX0dyZWF0ZXJFcXVhbDoKKyAgICBjYXNlIE9PX0xlc3NFcXVhbDoKICAgICAgIFdhcm5FID0gdGhpczsKICAgICAgIExvYyA9IE9wLT5nZXRPcGVyYXRvckxvYygpOwogICAgICAgUjEgPSBPcC0+Z2V0U291cmNlUmFuZ2UoKTsKQEAgLTIxMDYsOCArMjA5OSw4IEBACiAgICAgICAvLwogICAgICAgLy8gTm90ZTogSWYgbmV3IGNhc2VzIGFyZSBhZGRlZCBoZXJlLCBEaWFnbm9zZVVudXNlZEV4cHJSZXN1bHQgc2hvdWxkIGJlCiAgICAgICAvLyB1cGRhdGVkIHRvIG1hdGNoIGZvciBRb0kuCi0gICAgICBpZiAoRkQtPmdldEF0dHI8V2FyblVudXNlZFJlc3VsdEF0dHI+KCkgfHwKLSAgICAgICAgICBGRC0+Z2V0QXR0cjxQdXJlQXR0cj4oKSB8fCBGRC0+Z2V0QXR0cjxDb25zdEF0dHI+KCkpIHsKKyAgICAgIGlmIChGRC0+aGFzQXR0cjxXYXJuVW51c2VkUmVzdWx0QXR0cj4oKSB8fAorICAgICAgICAgIEZELT5oYXNBdHRyPFB1cmVBdHRyPigpIHx8IEZELT5oYXNBdHRyPENvbnN0QXR0cj4oKSkgewogICAgICAgICBXYXJuRSA9IHRoaXM7CiAgICAgICAgIExvYyA9IENFLT5nZXRDYWxsZWUoKS0+Z2V0TG9jU3RhcnQoKTsKICAgICAgICAgUjEgPSBDRS0+Z2V0Q2FsbGVlKCktPmdldFNvdXJjZVJhbmdlKCk7CkBAIC0yMTUyLDcgKzIxNDUsNyBAQAogICAgIH0KIAogICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpNRCA9IE1FLT5nZXRNZXRob2REZWNsKCk7Ci0gICAgaWYgKE1EICYmIE1ELT5nZXRBdHRyPFdhcm5VbnVzZWRSZXN1bHRBdHRyPigpKSB7CisgICAgaWYgKE1EICYmIE1ELT5oYXNBdHRyPFdhcm5VbnVzZWRSZXN1bHRBdHRyPigpKSB7CiAgICAgICBXYXJuRSA9IHRoaXM7CiAgICAgICBMb2MgPSBnZXRFeHByTG9jKCk7CiAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTI4MjEsOCArMjgxNCw2IEBACiAgIGNhc2UgQ1hYVGhpc0V4cHJDbGFzczoKICAgY2FzZSBDWFhTY2FsYXJWYWx1ZUluaXRFeHByQ2xhc3M6CiAgIGNhc2UgVHlwZVRyYWl0RXhwckNsYXNzOgotICBjYXNlIFVuYXJ5VHlwZVRyYWl0RXhwckNsYXNzOgotICBjYXNlIEJpbmFyeVR5cGVUcmFpdEV4cHJDbGFzczoKICAgY2FzZSBBcnJheVR5cGVUcmFpdEV4cHJDbGFzczoKICAgY2FzZSBFeHByZXNzaW9uVHJhaXRFeHByQ2xhc3M6CiAgIGNhc2UgQ1hYTm9leGNlcHRFeHByQ2xhc3M6CkBAIC0zMDU1LDcgKzMwNDYsNyBAQAogRXhwcjo6aXNOdWxsUG9pbnRlckNvbnN0YW50KEFTVENvbnRleHQgJkN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdWxsUG9pbnRlckNvbnN0YW50VmFsdWVEZXBlbmRlbmNlIE5QQykgY29uc3QgewogICBpZiAoaXNWYWx1ZURlcGVuZGVudCgpICYmCi0gICAgICAoIUN0eC5nZXRMYW5nT3B0cygpLkNQbHVzUGx1czExIHx8IEN0eC5nZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUpKSB7CisgICAgICAoIUN0eC5nZXRMYW5nT3B0cygpLkNQbHVzUGx1czExIHx8IEN0eC5nZXRMYW5nT3B0cygpLk1TVkNDb21wYXQpKSB7CiAgICAgc3dpdGNoIChOUEMpIHsKICAgICBjYXNlIE5QQ19OZXZlclZhbHVlRGVwZW5kZW50OgogICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCB2YWx1ZSBkZXBlbmRlbnQgZXhwcmVzc2lvbiEiKTsKQEAgLTMxNDEsOCArMzEzMiw3IEBACiAgICAgY29uc3QgSW50ZWdlckxpdGVyYWwgKkxpdCA9IGR5bl9jYXN0PEludGVnZXJMaXRlcmFsPih0aGlzKTsKICAgICBpZiAoTGl0ICYmICFMaXQtPmdldFZhbHVlKCkpCiAgICAgICByZXR1cm4gTlBDS19aZXJvTGl0ZXJhbDsKLSAgICBlbHNlIGlmICghQ3R4LmdldExhbmdPcHRzKCkuTWljcm9zb2Z0TW9kZSB8fAotICAgICAgICAgICAgICFpc0NYWDk4SW50ZWdyYWxDb25zdGFudEV4cHIoQ3R4KSkKKyAgICBlbHNlIGlmICghQ3R4LmdldExhbmdPcHRzKCkuTVNWQ0NvbXBhdCB8fCAhaXNDWFg5OEludGVncmFsQ29uc3RhbnRFeHByKEN0eCkpCiAgICAgICByZXR1cm4gTlBDS19Ob3ROdWxsOwogICB9IGVsc2UgewogICAgIC8vIElmIHdlIGhhdmUgYW4gaW50ZWdlciBjb25zdGFudCBleHByZXNzaW9uLCB3ZSBuZWVkIHRvICpldmFsdWF0ZSogaXQgYW5kCkBAIC0zODA2LDMwICszNzk2LDIxIEBACiAKIEV4cHIgKkRlc2lnbmF0ZWRJbml0RXhwcjo6Z2V0QXJyYXlJbmRleChjb25zdCBEZXNpZ25hdG9yJiBEKSBjb25zdCB7CiAgIGFzc2VydChELktpbmQgPT0gRGVzaWduYXRvcjo6QXJyYXlEZXNpZ25hdG9yICYmICJSZXF1aXJlcyBhcnJheSBkZXNpZ25hdG9yIik7Ci0gIGNoYXIgKlB0ciA9IHN0YXRpY19jYXN0PGNoYXIgKj4oCi0gICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQgKj4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCAqPih0aGlzKSkpOwotICBQdHIgKz0gc2l6ZW9mKERlc2lnbmF0ZWRJbml0RXhwcik7Ci0gIFN0bXQgKipTdWJFeHBycyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCoqPihyZWludGVycHJldF9jYXN0PHZvaWQqKj4oUHRyKSk7CisgIFN0bXQgKmNvbnN0ICpTdWJFeHBycyA9IHJlaW50ZXJwcmV0X2Nhc3Q8U3RtdCAqY29uc3QgKj4odGhpcyArIDEpOwogICByZXR1cm4gY2FzdDxFeHByPigqKFN1YkV4cHJzICsgRC5BcnJheU9yUmFuZ2UuSW5kZXggKyAxKSk7CiB9CiAKIEV4cHIgKkRlc2lnbmF0ZWRJbml0RXhwcjo6Z2V0QXJyYXlSYW5nZVN0YXJ0KGNvbnN0IERlc2lnbmF0b3IgJkQpIGNvbnN0IHsKICAgYXNzZXJ0KEQuS2luZCA9PSBEZXNpZ25hdG9yOjpBcnJheVJhbmdlRGVzaWduYXRvciAmJgogICAgICAgICAgIlJlcXVpcmVzIGFycmF5IHJhbmdlIGRlc2lnbmF0b3IiKTsKLSAgY2hhciAqUHRyID0gc3RhdGljX2Nhc3Q8Y2hhciAqPigKLSAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCAqPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkICo+KHRoaXMpKSk7Ci0gIFB0ciArPSBzaXplb2YoRGVzaWduYXRlZEluaXRFeHByKTsKLSAgU3RtdCAqKlN1YkV4cHJzID0gcmVpbnRlcnByZXRfY2FzdDxTdG10Kio+KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPihQdHIpKTsKKyAgU3RtdCAqY29uc3QgKlN1YkV4cHJzID0gcmVpbnRlcnByZXRfY2FzdDxTdG10ICpjb25zdCAqPih0aGlzICsgMSk7CiAgIHJldHVybiBjYXN0PEV4cHI+KCooU3ViRXhwcnMgKyBELkFycmF5T3JSYW5nZS5JbmRleCArIDEpKTsKIH0KIAogRXhwciAqRGVzaWduYXRlZEluaXRFeHByOjpnZXRBcnJheVJhbmdlRW5kKGNvbnN0IERlc2lnbmF0b3IgJkQpIGNvbnN0IHsKICAgYXNzZXJ0KEQuS2luZCA9PSBEZXNpZ25hdG9yOjpBcnJheVJhbmdlRGVzaWduYXRvciAmJgogICAgICAgICAgIlJlcXVpcmVzIGFycmF5IHJhbmdlIGRlc2lnbmF0b3IiKTsKLSAgY2hhciAqUHRyID0gc3RhdGljX2Nhc3Q8Y2hhciAqPigKLSAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCAqPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkICo+KHRoaXMpKSk7Ci0gIFB0ciArPSBzaXplb2YoRGVzaWduYXRlZEluaXRFeHByKTsKLSAgU3RtdCAqKlN1YkV4cHJzID0gcmVpbnRlcnByZXRfY2FzdDxTdG10Kio+KHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPihQdHIpKTsKKyAgU3RtdCAqY29uc3QgKlN1YkV4cHJzID0gcmVpbnRlcnByZXRfY2FzdDxTdG10ICpjb25zdCAqPih0aGlzICsgMSk7CiAgIHJldHVybiBjYXN0PEV4cHI+KCooU3ViRXhwcnMgKyBELkFycmF5T3JSYW5nZS5JbmRleCArIDIpKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL0FTVC9FeHByQ1hYLmNwcCBiL2xpYi9BU1QvRXhwckNYWC5jcHAKaW5kZXggMzczOGMwZS4uZWU0OTkyNSAxMDA2NDQKLS0tIGEvbGliL0FTVC9FeHByQ1hYLmNwcAorKysgYi9saWIvQVNUL0V4cHJDWFguY3BwCkBAIC0xMDgsMTAgKzEwOCw4IEBACiAgICAgcmV0dXJuIFV1aWRGb3JSRDsKICAgfQogCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6cmVkZWNsX2l0ZXJhdG9yIEkgPSBSRC0+cmVkZWNsc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gUkQtPnJlZGVjbHNfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpCi0gICAgaWYgKFV1aWRBdHRyICpVdWlkID0gSS0+Z2V0QXR0cjxVdWlkQXR0cj4oKSkKKyAgZm9yIChhdXRvIEkgOiBSRC0+cmVkZWNscygpKQorICAgIGlmIChhdXRvIFV1aWQgPSBJLT5nZXRBdHRyPFV1aWRBdHRyPigpKQogICAgICAgcmV0dXJuIFV1aWQ7CiAKICAgcmV0dXJuIDA7CkBAIC0xMjkxLDE2ICsxMjg5LDExIEBACiAgICAgTmFtZWREZWNsICpkZWNsID0gKmJlZ2luOwogICAgIGlmIChpc2E8VW5yZXNvbHZlZFVzaW5nVmFsdWVEZWNsPihkZWNsKSkKICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoaXNhPFVzaW5nU2hhZG93RGVjbD4oZGVjbCkpCi0gICAgICBkZWNsID0gY2FzdDxVc2luZ1NoYWRvd0RlY2w+KGRlY2wpLT5nZXRVbmRlcmx5aW5nRGVjbCgpOwogCiAgICAgLy8gVW5yZXNvbHZlZCBtZW1iZXIgZXhwcmVzc2lvbnMgc2hvdWxkIG9ubHkgY29udGFpbiBtZXRob2RzIGFuZAogICAgIC8vIG1ldGhvZCB0ZW1wbGF0ZXMuCi0gICAgYXNzZXJ0KGlzYTxDWFhNZXRob2REZWNsPihkZWNsKSB8fCBpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KGRlY2wpKTsKLQotICAgIGlmIChpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KGRlY2wpKQotICAgICAgZGVjbCA9IGNhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KGRlY2wpLT5nZXRUZW1wbGF0ZWREZWNsKCk7Ci0gICAgaWYgKGNhc3Q8Q1hYTWV0aG9kRGVjbD4oZGVjbCktPmlzU3RhdGljKCkpCisgICAgaWYgKGNhc3Q8Q1hYTWV0aG9kRGVjbD4oZGVjbC0+Z2V0VW5kZXJseWluZ0RlY2woKS0+Z2V0QXNGdW5jdGlvbigpKQorICAgICAgICAgICAgLT5pc1N0YXRpYygpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICB9IHdoaWxlICgrK2JlZ2luICE9IGVuZCk7CiAKZGlmZiAtLWdpdCBhL2xpYi9BU1QvRXhwckNsYXNzaWZpY2F0aW9uLmNwcCBiL2xpYi9BU1QvRXhwckNsYXNzaWZpY2F0aW9uLmNwcAppbmRleCA1NGY3N2VmLi41NWI5ZjEzIDEwMDY0NAotLS0gYS9saWIvQVNUL0V4cHJDbGFzc2lmaWNhdGlvbi5jcHAKKysrIGIvbGliL0FTVC9FeHByQ2xhc3NpZmljYXRpb24uY3BwCkBAIC0xNjUsOCArMTY1LDYgQEAKICAgY2FzZSBFeHByOjpGbG9hdGluZ0xpdGVyYWxDbGFzczoKICAgY2FzZSBFeHByOjpDWFhOb2V4Y2VwdEV4cHJDbGFzczoKICAgY2FzZSBFeHByOjpDWFhTY2FsYXJWYWx1ZUluaXRFeHByQ2xhc3M6Ci0gIGNhc2UgRXhwcjo6VW5hcnlUeXBlVHJhaXRFeHByQ2xhc3M6Ci0gIGNhc2UgRXhwcjo6QmluYXJ5VHlwZVRyYWl0RXhwckNsYXNzOgogICBjYXNlIEV4cHI6OlR5cGVUcmFpdEV4cHJDbGFzczoKICAgY2FzZSBFeHByOjpBcnJheVR5cGVUcmFpdEV4cHJDbGFzczoKICAgY2FzZSBFeHByOjpFeHByZXNzaW9uVHJhaXRFeHByQ2xhc3M6CkBAIC0zNDgsNyArMzQ2LDcgQEAKICAgY2FzZSBFeHByOjpPYmpDTWVzc2FnZUV4cHJDbGFzczoKICAgICBpZiAoY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCA9CiAgICAgICAgICAgY2FzdDxPYmpDTWVzc2FnZUV4cHI+KEUpLT5nZXRNZXRob2REZWNsKCkpIHsKLSAgICAgIENsOjpLaW5kcyBraW5kID0gQ2xhc3NpZnlVbm5hbWVkKEN0eCwgTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCkpOworICAgICAgQ2w6OktpbmRzIGtpbmQgPSBDbGFzc2lmeVVubmFtZWQoQ3R4LCBNZXRob2QtPmdldFJldHVyblR5cGUoKSk7CiAgICAgICByZXR1cm4gKGtpbmQgPT0gQ2w6OkNMX1BSVmFsdWUpID8gQ2w6OkNMX09iakNNZXNzYWdlUlZhbHVlIDoga2luZDsKICAgICB9CiAgICAgcmV0dXJuIENsOjpDTF9QUlZhbHVlOwpAQCAtNTQzLDEwICs1NDEsMjEgQEAKICAgICAgICAgICJUaGlzIGlzIG9ubHkgcmVsZXZhbnQgZm9yIEMrKy4iKTsKIAogICAvLyBDKysgW2V4cHIuY29uZF1wMgotICAvLyAgIElmIGVpdGhlciB0aGUgc2Vjb25kIG9yIHRoZSB0aGlyZCBvcGVyYW5kIGhhcyB0eXBlIChjdikgdm9pZCwgWy4uLl0KLSAgLy8gICB0aGUgcmVzdWx0IFsuLi5dIGlzIGEgcHJ2YWx1ZS4KLSAgaWYgKFRydWUtPmdldFR5cGUoKS0+aXNWb2lkVHlwZSgpIHx8IEZhbHNlLT5nZXRUeXBlKCktPmlzVm9pZFR5cGUoKSkKKyAgLy8gICBJZiBlaXRoZXIgdGhlIHNlY29uZCBvciB0aGUgdGhpcmQgb3BlcmFuZCBoYXMgdHlwZSAoY3YpIHZvaWQsCisgIC8vICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgc2hhbGwgaG9sZDoKKyAgaWYgKFRydWUtPmdldFR5cGUoKS0+aXNWb2lkVHlwZSgpIHx8IEZhbHNlLT5nZXRUeXBlKCktPmlzVm9pZFR5cGUoKSkgeworICAgIC8vIFRoZSBzZWNvbmQgb3IgdGhlIHRoaXJkIG9wZXJhbmQgKGJ1dCBub3QgYm90aCkgaXMgYSAocG9zc2libHkKKyAgICAvLyBwYXJlbnRoZXNpemVkKSB0aHJvdy1leHByZXNzaW9uOyB0aGUgcmVzdWx0IGlzIG9mIHRoZSBbLi4uXSB2YWx1ZQorICAgIC8vIGNhdGVnb3J5IG9mIHRoZSBvdGhlci4KKyAgICBib29sIFRydWVJc1Rocm93ID0gaXNhPENYWFRocm93RXhwcj4oVHJ1ZS0+SWdub3JlUGFyZW5JbXBDYXN0cygpKTsKKyAgICBib29sIEZhbHNlSXNUaHJvdyA9IGlzYTxDWFhUaHJvd0V4cHI+KEZhbHNlLT5JZ25vcmVQYXJlbkltcENhc3RzKCkpOworICAgIGlmIChjb25zdCBFeHByICpOb25UaHJvdyA9IFRydWVJc1Rocm93ID8gKEZhbHNlSXNUaHJvdyA/IDAgICAgOiBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChGYWxzZUlzVGhyb3cgPyBUcnVlIDogMCkpCisgICAgICByZXR1cm4gQ2xhc3NpZnlJbnRlcm5hbChDdHgsIE5vblRocm93KTsKKworICAgIC8vICAgW090aGVyd2lzZV0gdGhlIHJlc3VsdCBbLi4uXSBpcyBhIHBydmFsdWUuCiAgICAgcmV0dXJuIENsOjpDTF9QUlZhbHVlOworICB9CiAKICAgLy8gTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYWxyZWFkeSBwZXJmb3JtZWQgYWxsIGNvbnZlcnNpb25zCiAgIC8vIGFjY29yZGluZyB0byBbZXhwci5jb25kXXAzLgpkaWZmIC0tZ2l0IGEvbGliL0FTVC9FeHByQ29uc3RhbnQuY3BwIGIvbGliL0FTVC9FeHByQ29uc3RhbnQuY3BwCmluZGV4IDM5MGNmZTkuLjljNjkwODAgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvRXhwckNvbnN0YW50LmNwcAorKysgYi9saWIvQVNUL0V4cHJDb25zdGFudC5jcHAKQEAgLTQ3NCwxMyArNDc0LDMwIEBACiAKICAgICAgIC8vLyBFdmFsdWF0ZSBpbiBhbnkgd2F5IHdlIGtub3cgaG93LiBEb24ndCB3b3JyeSBhYm91dCBzaWRlLWVmZmVjdHMgdGhhdAogICAgICAgLy8vIGNhbid0IGJlIG1vZGVsZWQuCi0gICAgICBFTV9JZ25vcmVTaWRlRWZmZWN0cworICAgICAgRU1fSWdub3JlU2lkZUVmZmVjdHMsCisKKyAgICAgIC8vLyBFdmFsdWF0ZSBhcyBhIGNvbnN0YW50IGV4cHJlc3Npb24uIFN0b3AgaWYgd2UgZmluZCB0aGF0IHRoZSBleHByZXNzaW9uCisgICAgICAvLy8gaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbi4gU29tZSBleHByZXNzaW9ucyBjYW4gYmUgcmV0cmllZCBpbiB0aGUKKyAgICAgIC8vLyBvcHRpbWl6ZXIgaWYgd2UgZG9uJ3QgY29uc3RhbnQgZm9sZCB0aGVtIGhlcmUsIGJ1dCBpbiBhbiB1bmV2YWx1YXRlZAorICAgICAgLy8vIGNvbnRleHQgd2UgdHJ5IHRvIGZvbGQgdGhlbSBpbW1lZGlhdGVseSBzaW5jZSB0aGUgb3B0aW1pemVyIG5ldmVyCisgICAgICAvLy8gZ2V0cyBhIGNoYW5jZSB0byBsb29rIGF0IGl0LgorICAgICAgRU1fQ29uc3RhbnRFeHByZXNzaW9uVW5ldmFsdWF0ZWQsCisKKyAgICAgIC8vLyBFdmFsdWF0ZSBhcyBhIHBvdGVudGlhbCBjb25zdGFudCBleHByZXNzaW9uLiBLZWVwIGdvaW5nIGlmIHdlIGhpdCBhCisgICAgICAvLy8gY29uc3RydWN0IHRoYXQgd2UgY2FuJ3QgZXZhbHVhdGUgeWV0IChiZWNhdXNlIHdlIGRvbid0IHlldCBrbm93IHRoZQorICAgICAgLy8vIHZhbHVlIG9mIHNvbWV0aGluZykgYnV0IHN0b3AgaWYgd2UgaGl0IHNvbWV0aGluZyB0aGF0IGNvdWxkIG5ldmVyIGJlCisgICAgICAvLy8gYSBjb25zdGFudCBleHByZXNzaW9uLiBTb21lIGV4cHJlc3Npb25zIGNhbiBiZSByZXRyaWVkIGluIHRoZQorICAgICAgLy8vIG9wdGltaXplciBpZiB3ZSBkb24ndCBjb25zdGFudCBmb2xkIHRoZW0gaGVyZSwgYnV0IGluIGFuIHVuZXZhbHVhdGVkCisgICAgICAvLy8gY29udGV4dCB3ZSB0cnkgdG8gZm9sZCB0aGVtIGltbWVkaWF0ZWx5IHNpbmNlIHRoZSBvcHRpbWl6ZXIgbmV2ZXIKKyAgICAgIC8vLyBnZXRzIGEgY2hhbmNlIHRvIGxvb2sgYXQgaXQuCisgICAgICBFTV9Qb3RlbnRpYWxDb25zdGFudEV4cHJlc3Npb25VbmV2YWx1YXRlZAogICAgIH0gRXZhbE1vZGU7CiAKICAgICAvLy8gQXJlIHdlIGNoZWNraW5nIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gaXMgYSBwb3RlbnRpYWwgY29uc3RhbnQKICAgICAvLy8gZXhwcmVzc2lvbj8KICAgICBib29sIGNoZWNraW5nUG90ZW50aWFsQ29uc3RhbnRFeHByZXNzaW9uKCkgY29uc3QgewotICAgICAgcmV0dXJuIEV2YWxNb2RlID09IEVNX1BvdGVudGlhbENvbnN0YW50RXhwcmVzc2lvbjsKKyAgICAgIHJldHVybiBFdmFsTW9kZSA9PSBFTV9Qb3RlbnRpYWxDb25zdGFudEV4cHJlc3Npb24gfHwKKyAgICAgICAgICAgICBFdmFsTW9kZSA9PSBFTV9Qb3RlbnRpYWxDb25zdGFudEV4cHJlc3Npb25VbmV2YWx1YXRlZDsKICAgICB9CiAKICAgICAvLy8gQXJlIHdlIGNoZWNraW5nIGFuIGV4cHJlc3Npb24gZm9yIG92ZXJmbG93PwpAQCAtNTczLDYgKzU5MCw4IEBACiAgICAgICAgICAgICAvLyBzb21lIGxhdGVyIHByb2JsZW0uCiAgICAgICAgICAgY2FzZSBFTV9Db25zdGFudEV4cHJlc3Npb246CiAgICAgICAgICAgY2FzZSBFTV9Qb3RlbnRpYWxDb25zdGFudEV4cHJlc3Npb246CisgICAgICAgICAgY2FzZSBFTV9Db25zdGFudEV4cHJlc3Npb25VbmV2YWx1YXRlZDoKKyAgICAgICAgICBjYXNlIEVNX1BvdGVudGlhbENvbnN0YW50RXhwcmVzc2lvblVuZXZhbHVhdGVkOgogICAgICAgICAgICAgSGFzQWN0aXZlRGlhZ25vc3RpYyA9IGZhbHNlOwogICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsRGlhZ25vc3RpYygpOwogICAgICAgICAgIH0KQEAgLTY0NCwxMSArNjYzLDEzIEBACiAgICAgYm9vbCBrZWVwRXZhbHVhdGluZ0FmdGVyU2lkZUVmZmVjdCgpIHsKICAgICAgIHN3aXRjaCAoRXZhbE1vZGUpIHsKICAgICAgIGNhc2UgRU1fUG90ZW50aWFsQ29uc3RhbnRFeHByZXNzaW9uOgorICAgICAgY2FzZSBFTV9Qb3RlbnRpYWxDb25zdGFudEV4cHJlc3Npb25VbmV2YWx1YXRlZDoKICAgICAgIGNhc2UgRU1fRXZhbHVhdGVGb3JPdmVyZmxvdzoKICAgICAgIGNhc2UgRU1fSWdub3JlU2lkZUVmZmVjdHM6CiAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICBjYXNlIEVNX0NvbnN0YW50RXhwcmVzc2lvbjoKKyAgICAgIGNhc2UgRU1fQ29uc3RhbnRFeHByZXNzaW9uVW5ldmFsdWF0ZWQ6CiAgICAgICBjYXNlIEVNX0NvbnN0YW50Rm9sZDoKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQpAQCAtNjcwLDEwICs2OTEsMTIgQEAKIAogICAgICAgc3dpdGNoIChFdmFsTW9kZSkgewogICAgICAgY2FzZSBFTV9Qb3RlbnRpYWxDb25zdGFudEV4cHJlc3Npb246CisgICAgICBjYXNlIEVNX1BvdGVudGlhbENvbnN0YW50RXhwcmVzc2lvblVuZXZhbHVhdGVkOgogICAgICAgY2FzZSBFTV9FdmFsdWF0ZUZvck92ZXJmbG93OgogICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgICAgY2FzZSBFTV9Db25zdGFudEV4cHJlc3Npb246CisgICAgICBjYXNlIEVNX0NvbnN0YW50RXhwcmVzc2lvblVuZXZhbHVhdGVkOgogICAgICAgY2FzZSBFTV9Db25zdGFudEZvbGQ6CiAgICAgICBjYXNlIEVNX0lnbm9yZVNpZGVFZmZlY3RzOgogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC02OTYsNyArNzE5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8uRXZhbFN0YXR1cy5EaWFnLT5lbXB0eSgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAhSW5mby5FdmFsU3RhdHVzLkhhc1NpZGVFZmZlY3RzKSwKICAgICAgICAgT2xkTW9kZShJbmZvLkV2YWxNb2RlKSB7Ci0gICAgICBpZiAoRW5hYmxlZCAmJiBJbmZvLkV2YWxNb2RlID09IEV2YWxJbmZvOjpFTV9Db25zdGFudEV4cHJlc3Npb24pCisgICAgICBpZiAoRW5hYmxlZCAmJgorICAgICAgICAgIChJbmZvLkV2YWxNb2RlID09IEV2YWxJbmZvOjpFTV9Db25zdGFudEV4cHJlc3Npb24gfHwKKyAgICAgICAgICAgSW5mby5FdmFsTW9kZSA9PSBFdmFsSW5mbzo6RU1fQ29uc3RhbnRFeHByZXNzaW9uVW5ldmFsdWF0ZWQpKQogICAgICAgICBJbmZvLkV2YWxNb2RlID0gRXZhbEluZm86OkVNX0NvbnN0YW50Rm9sZDsKICAgICB9CiAgICAgdm9pZCBrZWVwRGlhZ25vc3RpY3MoKSB7IEVuYWJsZWQgPSBmYWxzZTsgfQpAQCAtMTE0MSw3ICsxMTY2LDcgQEAKIAogLy8vIFNob3VsZCB0aGlzIGNhbGwgZXhwcmVzc2lvbiBiZSB0cmVhdGVkIGFzIGEgc3RyaW5nIGxpdGVyYWw/CiBzdGF0aWMgYm9vbCBJc1N0cmluZ0xpdGVyYWxDYWxsKGNvbnN0IENhbGxFeHByICpFKSB7Ci0gIHVuc2lnbmVkIEJ1aWx0aW4gPSBFLT5pc0J1aWx0aW5DYWxsKCk7CisgIHVuc2lnbmVkIEJ1aWx0aW4gPSBFLT5nZXRCdWlsdGluQ2FsbGVlKCk7CiAgIHJldHVybiAoQnVpbHRpbiA9PSBCdWlsdGluOjpCSV9fYnVpbHRpbl9fX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nIHx8CiAgICAgICAgICAgQnVpbHRpbiA9PSBCdWlsdGluOjpCSV9fYnVpbHRpbl9fX05TU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKTsKIH0KQEAgLTEzMzgsOCArMTM2Myw3IEBACiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgIH0KLSAgICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEkgPSBSRC0+ZmllbGRfYmVnaW4oKSwgRSA9IFJELT5maWVsZF9lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgZm9yIChjb25zdCBhdXRvICpJIDogUkQtPmZpZWxkcygpKSB7CiAgICAgICBpZiAoIUNoZWNrQ29uc3RhbnRFeHByZXNzaW9uKEluZm8sIERpYWdMb2MsIEktPmdldFR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUuZ2V0U3RydWN0RmllbGQoSS0+Z2V0RmllbGRJbmRleCgpKSkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE4MDcsOSArMTgzMSw4IEBACiBzdGF0aWMgYm9vbCBIYW5kbGVMVmFsdWVJbmRpcmVjdE1lbWJlcihFdmFsSW5mbyAmSW5mbywgY29uc3QgRXhwciAqRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWYWx1ZSAmTFZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZGlyZWN0RmllbGREZWNsICpJRkQpIHsKLSAgZm9yIChJbmRpcmVjdEZpZWxkRGVjbDo6Y2hhaW5faXRlcmF0b3IgQyA9IElGRC0+Y2hhaW5fYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0UgPSBJRkQtPmNoYWluX2VuZCgpOyBDICE9IENFOyArK0MpCi0gICAgaWYgKCFIYW5kbGVMVmFsdWVNZW1iZXIoSW5mbywgRSwgTFZhbCwgY2FzdDxGaWVsZERlY2w+KCpDKSkpCisgIGZvciAoY29uc3QgYXV0byAqQyA6IElGRC0+Y2hhaW4oKSkKKyAgICBpZiAoIUhhbmRsZUxWYWx1ZU1lbWJlcihJbmZvLCBFLCBMVmFsLCBjYXN0PEZpZWxkRGVjbD4oQykpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTMwOTIsMTQgKzMxMTUsMTggQEAKICAgICBSZXN1bHQuc2V0KFZELCBJbmZvLkN1cnJlbnRDYWxsLT5JbmRleCk7CiAgICAgQVBWYWx1ZSAmVmFsID0gSW5mby5DdXJyZW50Q2FsbC0+Y3JlYXRlVGVtcG9yYXJ5KFZELCB0cnVlKTsKIAotICAgIGlmICghVkQtPmdldEluaXQoKSkgeworICAgIGNvbnN0IEV4cHIgKkluaXRFID0gVkQtPmdldEluaXQoKTsKKyAgICBpZiAoIUluaXRFKSB7CiAgICAgICBJbmZvLkRpYWcoRC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6bm90ZV9jb25zdGV4cHJfdW5pbml0aWFsaXplZCkKICAgICAgICAgPDwgZmFsc2UgPDwgVkQtPmdldFR5cGUoKTsKICAgICAgIFZhbCA9IEFQVmFsdWUoKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIUV2YWx1YXRlSW5QbGFjZShWYWwsIEluZm8sIFJlc3VsdCwgVkQtPmdldEluaXQoKSkpIHsKKyAgICBpZiAoSW5pdEUtPmlzVmFsdWVEZXBlbmRlbnQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghRXZhbHVhdGVJblBsYWNlKFZhbCwgSW5mbywgUmVzdWx0LCBJbml0RSkpIHsKICAgICAgIC8vIFdpcGUgb3V0IGFueSBwYXJ0aWFsbHktY29tcHV0ZWQgdmFsdWUsIHRvIGFsbG93IHRyYWNraW5nIHRoYXQgdGhpcwogICAgICAgLy8gZXZhbHVhdGlvbiBmYWlsZWQuCiAgICAgICBWYWwgPSBBUFZhbHVlKCk7CkBAIC0zMjkxLDEzICszMzE4LDEyIEBACiAKICAgY2FzZSBTdG10OjpEZWNsU3RtdENsYXNzOiB7CiAgICAgY29uc3QgRGVjbFN0bXQgKkRTID0gY2FzdDxEZWNsU3RtdD4oUyk7Ci0gICAgZm9yIChEZWNsU3RtdDo6Y29uc3RfZGVjbF9pdGVyYXRvciBEY2xJdCA9IERTLT5kZWNsX2JlZ2luKCksCi0gICAgICAgICAgIERjbEVuZCA9IERTLT5kZWNsX2VuZCgpOyBEY2xJdCAhPSBEY2xFbmQ7ICsrRGNsSXQpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkRjbEl0IDogRFMtPmRlY2xzKCkpIHsKICAgICAgIC8vIEVhY2ggZGVjbGFyYXRpb24gaW5pdGlhbGl6YXRpb24gaXMgaXRzIG93biBmdWxsLWV4cHJlc3Npb24uCiAgICAgICAvLyBGSVhNRTogVGhpcyBpc24ndCBxdWl0ZSByaWdodDsgaWYgd2UncmUgcGVyZm9ybWluZyBhZ2dyZWdhdGUKICAgICAgIC8vIGluaXRpYWxpemF0aW9uLCBlYWNoIGJyYWNlZCBzdWJleHByZXNzaW9uIGlzIGl0cyBvd24gZnVsbC1leHByZXNzaW9uLgogICAgICAgRnVsbEV4cHJlc3Npb25SQUlJIFNjb3BlKEluZm8pOwotICAgICAgaWYgKCFFdmFsdWF0ZURlY2woSW5mbywgKkRjbEl0KSAmJiAhSW5mby5rZWVwRXZhbHVhdGluZ0FmdGVyRmFpbHVyZSgpKQorICAgICAgaWYgKCFFdmFsdWF0ZURlY2woSW5mbywgRGNsSXQpICYmICFJbmZvLmtlZXBFdmFsdWF0aW5nQWZ0ZXJGYWlsdXJlKCkpCiAgICAgICAgIHJldHVybiBFU1JfRmFpbGVkOwogICAgIH0KICAgICByZXR1cm4gRVNSX1N1Y2NlZWRlZDsKQEAgLTMzMTUsOSArMzM0MSw4IEBACiAgICAgQmxvY2tTY29wZVJBSUkgU2NvcGUoSW5mbyk7CiAKICAgICBjb25zdCBDb21wb3VuZFN0bXQgKkNTID0gY2FzdDxDb21wb3VuZFN0bXQ+KFMpOwotICAgIGZvciAoQ29tcG91bmRTdG10Ojpjb25zdF9ib2R5X2l0ZXJhdG9yIEJJID0gQ1MtPmJvZHlfYmVnaW4oKSwKLSAgICAgICAgICAgQkUgPSBDUy0+Ym9keV9lbmQoKTsgQkkgIT0gQkU7ICsrQkkpIHsKLSAgICAgIEV2YWxTdG10UmVzdWx0IEVTUiA9IEV2YWx1YXRlU3RtdChSZXN1bHQsIEluZm8sICpCSSwgQ2FzZSk7CisgICAgZm9yIChjb25zdCBhdXRvICpCSSA6IENTLT5ib2R5KCkpIHsKKyAgICAgIEV2YWxTdG10UmVzdWx0IEVTUiA9IEV2YWx1YXRlU3RtdChSZXN1bHQsIEluZm8sIEJJLCBDYXNlKTsKICAgICAgIGlmIChFU1IgPT0gRVNSX1N1Y2NlZWRlZCkKICAgICAgICAgQ2FzZSA9IDA7CiAgICAgICBlbHNlIGlmIChFU1IgIT0gRVNSX0Nhc2VOb3RGb3VuZCkKQEAgLTM1OTMsNyArMzYxOCw3IEBACiAKICAgRXZhbFN0bXRSZXN1bHQgRVNSID0gRXZhbHVhdGVTdG10KFJlc3VsdCwgSW5mbywgQm9keSk7CiAgIGlmIChFU1IgPT0gRVNSX1N1Y2NlZWRlZCkgewotICAgIGlmIChDYWxsZWUtPmdldFJlc3VsdFR5cGUoKS0+aXNWb2lkVHlwZSgpKQorICAgIGlmIChDYWxsZWUtPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHlwZSgpKQogICAgICAgcmV0dXJuIHRydWU7CiAgICAgSW5mby5EaWFnKENhbGxlZS0+Z2V0TG9jRW5kKCksIGRpYWc6Om5vdGVfY29uc3RleHByX25vX3JldHVybik7CiAgIH0KQEAgLTM2NTksMTUgKzM2ODQsMTQgQEAKICNpZm5kZWYgTkRFQlVHCiAgIENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgQmFzZUl0ID0gUkQtPmJhc2VzX2JlZ2luKCk7CiAjZW5kaWYKLSAgZm9yIChDWFhDb25zdHJ1Y3RvckRlY2w6OmluaXRfY29uc3RfaXRlcmF0b3IgSSA9IERlZmluaXRpb24tPmluaXRfYmVnaW4oKSwKLSAgICAgICBFID0gRGVmaW5pdGlvbi0+aW5pdF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogRGVmaW5pdGlvbi0+aW5pdHMoKSkgewogICAgIExWYWx1ZSBTdWJvYmplY3QgPSBUaGlzOwogICAgIEFQVmFsdWUgKlZhbHVlID0gJlJlc3VsdDsKIAogICAgIC8vIERldGVybWluZSB0aGUgc3Vib2JqZWN0IHRvIGluaXRpYWxpemUuCiAgICAgRmllbGREZWNsICpGRCA9IDA7Ci0gICAgaWYgKCgqSSktPmlzQmFzZUluaXRpYWxpemVyKCkpIHsKLSAgICAgIFF1YWxUeXBlIEJhc2VUeXBlKCgqSSktPmdldEJhc2VDbGFzcygpLCAwKTsKKyAgICBpZiAoSS0+aXNCYXNlSW5pdGlhbGl6ZXIoKSkgeworICAgICAgUXVhbFR5cGUgQmFzZVR5cGUoSS0+Z2V0QmFzZUNsYXNzKCksIDApOwogI2lmbmRlZiBOREVCVUcKICAgICAgIC8vIE5vbi12aXJ0dWFsIGJhc2UgY2xhc3NlcyBhcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG9yZGVyIGluIHRoZSBjbGFzcwogICAgICAgLy8gZGVmaW5pdGlvbi4gV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHZpcnR1YWwgYmFzZSBjbGFzc2VzLgpAQCAtMzY3NiwxMiArMzcwMCwxMiBAQAogICAgICAgICAgICAgICJiYXNlIGNsYXNzIGluaXRpYWxpemVycyBub3QgaW4gZXhwZWN0ZWQgb3JkZXIiKTsKICAgICAgICsrQmFzZUl0OwogI2VuZGlmCi0gICAgICBpZiAoIUhhbmRsZUxWYWx1ZURpcmVjdEJhc2UoSW5mbywgKCpJKS0+Z2V0SW5pdCgpLCBTdWJvYmplY3QsIFJELAorICAgICAgaWYgKCFIYW5kbGVMVmFsdWVEaXJlY3RCYXNlKEluZm8sIEktPmdldEluaXQoKSwgU3Vib2JqZWN0LCBSRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVHlwZS0+Z2V0QXNDWFhSZWNvcmREZWNsKCksICZMYXlvdXQpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICBWYWx1ZSA9ICZSZXN1bHQuZ2V0U3RydWN0QmFzZShCYXNlc1NlZW4rKyk7Ci0gICAgfSBlbHNlIGlmICgoRkQgPSAoKkkpLT5nZXRNZW1iZXIoKSkpIHsKLSAgICAgIGlmICghSGFuZGxlTFZhbHVlTWVtYmVyKEluZm8sICgqSSktPmdldEluaXQoKSwgU3Vib2JqZWN0LCBGRCwgJkxheW91dCkpCisgICAgfSBlbHNlIGlmICgoRkQgPSBJLT5nZXRNZW1iZXIoKSkpIHsKKyAgICAgIGlmICghSGFuZGxlTFZhbHVlTWVtYmVyKEluZm8sIEktPmdldEluaXQoKSwgU3Vib2JqZWN0LCBGRCwgJkxheW91dCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIGlmIChSRC0+aXNVbmlvbigpKSB7CiAgICAgICAgIFJlc3VsdCA9IEFQVmFsdWUoRkQpOwpAQCAtMzY4OSwxMyArMzcxMywxMSBAQAogICAgICAgfSBlbHNlIHsKICAgICAgICAgVmFsdWUgPSAmUmVzdWx0LmdldFN0cnVjdEZpZWxkKEZELT5nZXRGaWVsZEluZGV4KCkpOwogICAgICAgfQotICAgIH0gZWxzZSBpZiAoSW5kaXJlY3RGaWVsZERlY2wgKklGRCA9ICgqSSktPmdldEluZGlyZWN0TWVtYmVyKCkpIHsKKyAgICB9IGVsc2UgaWYgKEluZGlyZWN0RmllbGREZWNsICpJRkQgPSBJLT5nZXRJbmRpcmVjdE1lbWJlcigpKSB7CiAgICAgICAvLyBXYWxrIHRoZSBpbmRpcmVjdCBmaWVsZCBkZWNsJ3MgY2hhaW4gdG8gZmluZCB0aGUgb2JqZWN0IHRvIGluaXRpYWxpemUsCiAgICAgICAvLyBhbmQgbWFrZSBzdXJlIHdlJ3ZlIGluaXRpYWxpemVkIGV2ZXJ5IHN0ZXAgYWxvbmcgaXQuCi0gICAgICBmb3IgKEluZGlyZWN0RmllbGREZWNsOjpjaGFpbl9pdGVyYXRvciBDID0gSUZELT5jaGFpbl9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0UgPSBJRkQtPmNoYWluX2VuZCgpOwotICAgICAgICAgICBDICE9IENFOyArK0MpIHsKLSAgICAgICAgRkQgPSBjYXN0PEZpZWxkRGVjbD4oKkMpOworICAgICAgZm9yIChhdXRvICpDIDogSUZELT5jaGFpbigpKSB7CisgICAgICAgIEZEID0gY2FzdDxGaWVsZERlY2w+KEMpOwogICAgICAgICBDWFhSZWNvcmREZWNsICpDRCA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oRkQtPmdldFBhcmVudCgpKTsKICAgICAgICAgLy8gU3dpdGNoIHRoZSB1bmlvbiBmaWVsZCBpZiBpdCBkaWZmZXJzLiBUaGlzIGhhcHBlbnMgaWYgd2UgaGFkCiAgICAgICAgIC8vIHByZWNlZGluZyB6ZXJvLWluaXRpYWxpemF0aW9uLCBhbmQgd2UncmUgbm93IGluaXRpYWxpemluZyBhIHVuaW9uCkBAIC0zNzEwLDcgKzM3MzIsNyBAQAogICAgICAgICAgICAgKlZhbHVlID0gQVBWYWx1ZShBUFZhbHVlOjpVbmluaXRTdHJ1Y3QoKSwgQ0QtPmdldE51bUJhc2VzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGlzdGFuY2UoQ0QtPmZpZWxkX2JlZ2luKCksIENELT5maWVsZF9lbmQoKSkpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghSGFuZGxlTFZhbHVlTWVtYmVyKEluZm8sICgqSSktPmdldEluaXQoKSwgU3Vib2JqZWN0LCBGRCkpCisgICAgICAgIGlmICghSGFuZGxlTFZhbHVlTWVtYmVyKEluZm8sIEktPmdldEluaXQoKSwgU3Vib2JqZWN0LCBGRCkpCiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBpZiAoQ0QtPmlzVW5pb24oKSkKICAgICAgICAgICBWYWx1ZSA9ICZWYWx1ZS0+Z2V0VW5pb25WYWx1ZSgpOwpAQCAtMzcyMiw4ICszNzQ0LDggQEAKICAgICB9CiAKICAgICBGdWxsRXhwcmVzc2lvblJBSUkgSW5pdFNjb3BlKEluZm8pOwotICAgIGlmICghRXZhbHVhdGVJblBsYWNlKCpWYWx1ZSwgSW5mbywgU3Vib2JqZWN0LCAoKkkpLT5nZXRJbml0KCkpIHx8Ci0gICAgICAgIChGRCAmJiBGRC0+aXNCaXRGaWVsZCgpICYmICF0cnVuY2F0ZUJpdGZpZWxkVmFsdWUoSW5mbywgKCpJKS0+Z2V0SW5pdCgpLAorICAgIGlmICghRXZhbHVhdGVJblBsYWNlKCpWYWx1ZSwgSW5mbywgU3Vib2JqZWN0LCBJLT5nZXRJbml0KCkpIHx8CisgICAgICAgIChGRCAmJiBGRC0+aXNCaXRGaWVsZCgpICYmICF0cnVuY2F0ZUJpdGZpZWxkVmFsdWUoSW5mbywgSS0+Z2V0SW5pdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpWYWx1ZSwgRkQpKSkgewogICAgICAgLy8gSWYgd2UncmUgY2hlY2tpbmcgZm9yIGEgcG90ZW50aWFsIGNvbnN0YW50IGV4cHJlc3Npb24sIGV2YWx1YXRlIGFsbAogICAgICAgLy8gaW5pdGlhbGl6ZXJzIGV2ZW4gaWYgc29tZSBvZiB0aGVtIGZhaWwuCkBAIC0zNzQyLDE1ICszNzY0LDE0IEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogbmFtZXNwYWNlIHsKIAotLy8gRklYTUU6IFJldFR5IGlzIGFsd2F5cyBib29sLiBSZW1vdmUgaXQuCi10ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZCwgdHlwZW5hbWUgUmV0VHk9Ym9vbD4KK3RlbXBsYXRlIDxjbGFzcyBEZXJpdmVkPgogY2xhc3MgRXhwckV2YWx1YXRvckJhc2UKLSAgOiBwdWJsaWMgQ29uc3RTdG10VmlzaXRvcjxEZXJpdmVkLCBSZXRUeT4geworICA6IHB1YmxpYyBDb25zdFN0bXRWaXNpdG9yPERlcml2ZWQsIGJvb2w+IHsKIHByaXZhdGU6Ci0gIFJldFR5IERlcml2ZWRTdWNjZXNzKGNvbnN0IEFQVmFsdWUgJlYsIGNvbnN0IEV4cHIgKkUpIHsKKyAgYm9vbCBEZXJpdmVkU3VjY2Vzcyhjb25zdCBBUFZhbHVlICZWLCBjb25zdCBFeHByICpFKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlcml2ZWQqPih0aGlzKS0+U3VjY2VzcyhWLCBFKTsKICAgfQotICBSZXRUeSBEZXJpdmVkWmVyb0luaXRpYWxpemF0aW9uKGNvbnN0IEV4cHIgKkUpIHsKKyAgYm9vbCBEZXJpdmVkWmVyb0luaXRpYWxpemF0aW9uKGNvbnN0IEV4cHIgKkUpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpLT5aZXJvSW5pdGlhbGl6YXRpb24oRSk7CiAgIH0KIApAQCAtMzc5NSwxNCArMzgxNiwxNCBAQAogCiBwcm90ZWN0ZWQ6CiAgIEV2YWxJbmZvICZJbmZvOwotICB0eXBlZGVmIENvbnN0U3RtdFZpc2l0b3I8RGVyaXZlZCwgUmV0VHk+IFN0bXRWaXNpdG9yVHk7CisgIHR5cGVkZWYgQ29uc3RTdG10VmlzaXRvcjxEZXJpdmVkLCBib29sPiBTdG10VmlzaXRvclR5OwogICB0eXBlZGVmIEV4cHJFdmFsdWF0b3JCYXNlIEV4cHJFdmFsdWF0b3JCYXNlVHk7CiAKICAgT3B0aW9uYWxEaWFnbm9zdGljIENDRURpYWcoY29uc3QgRXhwciAqRSwgZGlhZzo6a2luZCBEKSB7CiAgICAgcmV0dXJuIEluZm8uQ0NFRGlhZyhFLCBEKTsKICAgfQogCi0gIFJldFR5IFplcm9Jbml0aWFsaXphdGlvbihjb25zdCBFeHByICpFKSB7IHJldHVybiBFcnJvcihFKTsgfQorICBib29sIFplcm9Jbml0aWFsaXphdGlvbihjb25zdCBFeHByICpFKSB7IHJldHVybiBFcnJvcihFKTsgfQogCiBwdWJsaWM6CiAgIEV4cHJFdmFsdWF0b3JCYXNlKEV2YWxJbmZvICZJbmZvKSA6IEluZm8oSW5mbykge30KQEAgLTM4MTksMjggKzM4NDAsMjggQEAKICAgICByZXR1cm4gRXJyb3IoRSwgZGlhZzo6bm90ZV9pbnZhbGlkX3N1YmV4cHJfaW5fY29uc3RfZXhwcik7CiAgIH0KIAotICBSZXRUeSBWaXNpdFN0bXQoY29uc3QgU3RtdCAqKSB7CisgIGJvb2wgVmlzaXRTdG10KGNvbnN0IFN0bXQgKikgewogICAgIGxsdm1fdW5yZWFjaGFibGUoIkV4cHJlc3Npb24gZXZhbHVhdG9yIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIHN0bXRzIik7CiAgIH0KLSAgUmV0VHkgVmlzaXRFeHByKGNvbnN0IEV4cHIgKkUpIHsKKyAgYm9vbCBWaXNpdEV4cHIoY29uc3QgRXhwciAqRSkgewogICAgIHJldHVybiBFcnJvcihFKTsKICAgfQogCi0gIFJldFR5IFZpc2l0UGFyZW5FeHByKGNvbnN0IFBhcmVuRXhwciAqRSkKKyAgYm9vbCBWaXNpdFBhcmVuRXhwcihjb25zdCBQYXJlbkV4cHIgKkUpCiAgICAgeyByZXR1cm4gU3RtdFZpc2l0b3JUeTo6VmlzaXQoRS0+Z2V0U3ViRXhwcigpKTsgfQotICBSZXRUeSBWaXNpdFVuYXJ5RXh0ZW5zaW9uKGNvbnN0IFVuYXJ5T3BlcmF0b3IgKkUpCisgIGJvb2wgVmlzaXRVbmFyeUV4dGVuc2lvbihjb25zdCBVbmFyeU9wZXJhdG9yICpFKQogICAgIHsgcmV0dXJuIFN0bXRWaXNpdG9yVHk6OlZpc2l0KEUtPmdldFN1YkV4cHIoKSk7IH0KLSAgUmV0VHkgVmlzaXRVbmFyeVBsdXMoY29uc3QgVW5hcnlPcGVyYXRvciAqRSkKKyAgYm9vbCBWaXNpdFVuYXJ5UGx1cyhjb25zdCBVbmFyeU9wZXJhdG9yICpFKQogICAgIHsgcmV0dXJuIFN0bXRWaXNpdG9yVHk6OlZpc2l0KEUtPmdldFN1YkV4cHIoKSk7IH0KLSAgUmV0VHkgVmlzaXRDaG9vc2VFeHByKGNvbnN0IENob29zZUV4cHIgKkUpCisgIGJvb2wgVmlzaXRDaG9vc2VFeHByKGNvbnN0IENob29zZUV4cHIgKkUpCiAgICAgeyByZXR1cm4gU3RtdFZpc2l0b3JUeTo6VmlzaXQoRS0+Z2V0Q2hvc2VuU3ViRXhwcigpKTsgfQotICBSZXRUeSBWaXNpdEdlbmVyaWNTZWxlY3Rpb25FeHByKGNvbnN0IEdlbmVyaWNTZWxlY3Rpb25FeHByICpFKQorICBib29sIFZpc2l0R2VuZXJpY1NlbGVjdGlvbkV4cHIoY29uc3QgR2VuZXJpY1NlbGVjdGlvbkV4cHIgKkUpCiAgICAgeyByZXR1cm4gU3RtdFZpc2l0b3JUeTo6VmlzaXQoRS0+Z2V0UmVzdWx0RXhwcigpKTsgfQotICBSZXRUeSBWaXNpdFN1YnN0Tm9uVHlwZVRlbXBsYXRlUGFybUV4cHIoY29uc3QgU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtRXhwciAqRSkKKyAgYm9vbCBWaXNpdFN1YnN0Tm9uVHlwZVRlbXBsYXRlUGFybUV4cHIoY29uc3QgU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtRXhwciAqRSkKICAgICB7IHJldHVybiBTdG10VmlzaXRvclR5OjpWaXNpdChFLT5nZXRSZXBsYWNlbWVudCgpKTsgfQotICBSZXRUeSBWaXNpdENYWERlZmF1bHRBcmdFeHByKGNvbnN0IENYWERlZmF1bHRBcmdFeHByICpFKQorICBib29sIFZpc2l0Q1hYRGVmYXVsdEFyZ0V4cHIoY29uc3QgQ1hYRGVmYXVsdEFyZ0V4cHIgKkUpCiAgICAgeyByZXR1cm4gU3RtdFZpc2l0b3JUeTo6VmlzaXQoRS0+Z2V0RXhwcigpKTsgfQotICBSZXRUeSBWaXNpdENYWERlZmF1bHRJbml0RXhwcihjb25zdCBDWFhEZWZhdWx0SW5pdEV4cHIgKkUpIHsKKyAgYm9vbCBWaXNpdENYWERlZmF1bHRJbml0RXhwcihjb25zdCBDWFhEZWZhdWx0SW5pdEV4cHIgKkUpIHsKICAgICAvLyBUaGUgaW5pdGlhbGl6ZXIgbWF5IG5vdCBoYXZlIGJlZW4gcGFyc2VkIHlldCwgb3IgbWlnaHQgYmUgZXJyb25lb3VzLgogICAgIGlmICghRS0+Z2V0RXhwcigpKQogICAgICAgcmV0dXJuIEVycm9yKEUpOwpAQCAtMzg0OCwxOSArMzg2OSwxOSBAQAogICB9CiAgIC8vIFdlIGNhbm5vdCBjcmVhdGUgYW55IG9iamVjdHMgZm9yIHdoaWNoIGNsZWFudXBzIGFyZSByZXF1aXJlZCwgc28gdGhlcmUgaXMKICAgLy8gbm90aGluZyB0byBkbyBoZXJlOyBhbGwgY2xlYW51cHMgbXVzdCBjb21lIGZyb20gdW5ldmFsdWF0ZWQgc3ViZXhwcmVzc2lvbnMuCi0gIFJldFR5IFZpc2l0RXhwcldpdGhDbGVhbnVwcyhjb25zdCBFeHByV2l0aENsZWFudXBzICpFKQorICBib29sIFZpc2l0RXhwcldpdGhDbGVhbnVwcyhjb25zdCBFeHByV2l0aENsZWFudXBzICpFKQogICAgIHsgcmV0dXJuIFN0bXRWaXNpdG9yVHk6OlZpc2l0KEUtPmdldFN1YkV4cHIoKSk7IH0KIAotICBSZXRUeSBWaXNpdENYWFJlaW50ZXJwcmV0Q2FzdEV4cHIoY29uc3QgQ1hYUmVpbnRlcnByZXRDYXN0RXhwciAqRSkgeworICBib29sIFZpc2l0Q1hYUmVpbnRlcnByZXRDYXN0RXhwcihjb25zdCBDWFhSZWludGVycHJldENhc3RFeHByICpFKSB7CiAgICAgQ0NFRGlhZyhFLCBkaWFnOjpub3RlX2NvbnN0ZXhwcl9pbnZhbGlkX2Nhc3QpIDw8IDA7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlcml2ZWQqPih0aGlzKS0+VmlzaXRDYXN0RXhwcihFKTsKICAgfQotICBSZXRUeSBWaXNpdENYWER5bmFtaWNDYXN0RXhwcihjb25zdCBDWFhEeW5hbWljQ2FzdEV4cHIgKkUpIHsKKyAgYm9vbCBWaXNpdENYWER5bmFtaWNDYXN0RXhwcihjb25zdCBDWFhEeW5hbWljQ2FzdEV4cHIgKkUpIHsKICAgICBDQ0VEaWFnKEUsIGRpYWc6Om5vdGVfY29uc3RleHByX2ludmFsaWRfY2FzdCkgPDwgMTsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpLT5WaXNpdENhc3RFeHByKEUpOwogICB9CiAKLSAgUmV0VHkgVmlzaXRCaW5hcnlPcGVyYXRvcihjb25zdCBCaW5hcnlPcGVyYXRvciAqRSkgeworICBib29sIFZpc2l0QmluYXJ5T3BlcmF0b3IoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkUpIHsKICAgICBzd2l0Y2ggKEUtPmdldE9wY29kZSgpKSB7CiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBFcnJvcihFKTsKQEAgLTM4ODIsNyArMzkwMyw3IEBACiAgICAgfQogICB9CiAKLSAgUmV0VHkgVmlzaXRCaW5hcnlDb25kaXRpb25hbE9wZXJhdG9yKGNvbnN0IEJpbmFyeUNvbmRpdGlvbmFsT3BlcmF0b3IgKkUpIHsKKyAgYm9vbCBWaXNpdEJpbmFyeUNvbmRpdGlvbmFsT3BlcmF0b3IoY29uc3QgQmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvciAqRSkgewogICAgIC8vIEV2YWx1YXRlIGFuZCBjYWNoZSB0aGUgY29tbW9uIGV4cHJlc3Npb24uIFdlIHRyZWF0IGl0IGFzIGEgdGVtcG9yYXJ5LAogICAgIC8vIGV2ZW4gdGhvdWdoIGl0J3Mgbm90IHF1aXRlIHRoZSBzYW1lIHRoaW5nLgogICAgIGlmICghRXZhbHVhdGUoSW5mby5DdXJyZW50Q2FsbC0+Y3JlYXRlVGVtcG9yYXJ5KEUtPmdldE9wYXF1ZVZhbHVlKCksIGZhbHNlKSwKQEAgLTM4OTIsNyArMzkxMyw3IEBACiAgICAgcmV0dXJuIEhhbmRsZUNvbmRpdGlvbmFsT3BlcmF0b3IoRSk7CiAgIH0KIAotICBSZXRUeSBWaXNpdENvbmRpdGlvbmFsT3BlcmF0b3IoY29uc3QgQ29uZGl0aW9uYWxPcGVyYXRvciAqRSkgeworICBib29sIFZpc2l0Q29uZGl0aW9uYWxPcGVyYXRvcihjb25zdCBDb25kaXRpb25hbE9wZXJhdG9yICpFKSB7CiAgICAgYm9vbCBJc0JjcENhbGwgPSBmYWxzZTsKICAgICAvLyBJZiB0aGUgY29uZGl0aW9uIChpZ25vcmluZyBwYXJlbnMpIGlzIGEgX19idWlsdGluX2NvbnN0YW50X3AgY2FsbCwKICAgICAvLyB0aGUgcmVzdWx0IGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBpZiBpdCBjYW4gYmUgZm9sZGVkIHdpdGhvdXQKQEAgLTM5MDAsNyArMzkyMSw3IEBACiAgICAgLy8gZm9yIGRpc2N1c3Npb24uCiAgICAgaWYgKGNvbnN0IENhbGxFeHByICpDYWxsQ0UgPQogICAgICAgICAgIGR5bl9jYXN0PENhbGxFeHByPihFLT5nZXRDb25kKCktPklnbm9yZVBhcmVuQ2FzdHMoKSkpCi0gICAgICBpZiAoQ2FsbENFLT5pc0J1aWx0aW5DYWxsKCkgPT0gQnVpbHRpbjo6QklfX2J1aWx0aW5fY29uc3RhbnRfcCkKKyAgICAgIGlmIChDYWxsQ0UtPmdldEJ1aWx0aW5DYWxsZWUoKSA9PSBCdWlsdGluOjpCSV9fYnVpbHRpbl9jb25zdGFudF9wKQogICAgICAgICBJc0JjcENhbGwgPSB0cnVlOwogCiAgICAgLy8gQWx3YXlzIGFzc3VtZSBfX2J1aWx0aW5fY29uc3RhbnRfcCguLi4pID8gLi4uIDogLi4uIGlzIGEgcG90ZW50aWFsCkBAIC0zOTE3LDcgKzM5MzgsNyBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgUmV0VHkgVmlzaXRPcGFxdWVWYWx1ZUV4cHIoY29uc3QgT3BhcXVlVmFsdWVFeHByICpFKSB7CisgIGJvb2wgVmlzaXRPcGFxdWVWYWx1ZUV4cHIoY29uc3QgT3BhcXVlVmFsdWVFeHByICpFKSB7CiAgICAgaWYgKEFQVmFsdWUgKlZhbHVlID0gSW5mby5DdXJyZW50Q2FsbC0+Z2V0VGVtcG9yYXJ5KEUpKQogICAgICAgcmV0dXJuIERlcml2ZWRTdWNjZXNzKCpWYWx1ZSwgRSk7CiAKQEAgLTM5MzEsNyArMzk1Miw3IEBACiAgICAgcmV0dXJuIFN0bXRWaXNpdG9yVHk6OlZpc2l0KFNvdXJjZSk7CiAgIH0KIAotICBSZXRUeSBWaXNpdENhbGxFeHByKGNvbnN0IENhbGxFeHByICpFKSB7CisgIGJvb2wgVmlzaXRDYWxsRXhwcihjb25zdCBDYWxsRXhwciAqRSkgewogICAgIGNvbnN0IEV4cHIgKkNhbGxlZSA9IEUtPmdldENhbGxlZSgpLT5JZ25vcmVQYXJlbnMoKTsKICAgICBRdWFsVHlwZSBDYWxsZWVUeXBlID0gQ2FsbGVlLT5nZXRUeXBlKCk7CiAKQEAgLTQwMTYsMjggKzQwMzcsMjggQEAKICAgICByZXR1cm4gRGVyaXZlZFN1Y2Nlc3MoUmVzdWx0LCBFKTsKICAgfQogCi0gIFJldFR5IFZpc2l0Q29tcG91bmRMaXRlcmFsRXhwcihjb25zdCBDb21wb3VuZExpdGVyYWxFeHByICpFKSB7CisgIGJvb2wgVmlzaXRDb21wb3VuZExpdGVyYWxFeHByKGNvbnN0IENvbXBvdW5kTGl0ZXJhbEV4cHIgKkUpIHsKICAgICByZXR1cm4gU3RtdFZpc2l0b3JUeTo6VmlzaXQoRS0+Z2V0SW5pdGlhbGl6ZXIoKSk7CiAgIH0KLSAgUmV0VHkgVmlzaXRJbml0TGlzdEV4cHIoY29uc3QgSW5pdExpc3RFeHByICpFKSB7CisgIGJvb2wgVmlzaXRJbml0TGlzdEV4cHIoY29uc3QgSW5pdExpc3RFeHByICpFKSB7CiAgICAgaWYgKEUtPmdldE51bUluaXRzKCkgPT0gMCkKICAgICAgIHJldHVybiBEZXJpdmVkWmVyb0luaXRpYWxpemF0aW9uKEUpOwogICAgIGlmIChFLT5nZXROdW1Jbml0cygpID09IDEpCiAgICAgICByZXR1cm4gU3RtdFZpc2l0b3JUeTo6VmlzaXQoRS0+Z2V0SW5pdCgwKSk7CiAgICAgcmV0dXJuIEVycm9yKEUpOwogICB9Ci0gIFJldFR5IFZpc2l0SW1wbGljaXRWYWx1ZUluaXRFeHByKGNvbnN0IEltcGxpY2l0VmFsdWVJbml0RXhwciAqRSkgeworICBib29sIFZpc2l0SW1wbGljaXRWYWx1ZUluaXRFeHByKGNvbnN0IEltcGxpY2l0VmFsdWVJbml0RXhwciAqRSkgewogICAgIHJldHVybiBEZXJpdmVkWmVyb0luaXRpYWxpemF0aW9uKEUpOwogICB9Ci0gIFJldFR5IFZpc2l0Q1hYU2NhbGFyVmFsdWVJbml0RXhwcihjb25zdCBDWFhTY2FsYXJWYWx1ZUluaXRFeHByICpFKSB7CisgIGJvb2wgVmlzaXRDWFhTY2FsYXJWYWx1ZUluaXRFeHByKGNvbnN0IENYWFNjYWxhclZhbHVlSW5pdEV4cHIgKkUpIHsKICAgICByZXR1cm4gRGVyaXZlZFplcm9Jbml0aWFsaXphdGlvbihFKTsKICAgfQotICBSZXRUeSBWaXNpdENYWE51bGxQdHJMaXRlcmFsRXhwcihjb25zdCBDWFhOdWxsUHRyTGl0ZXJhbEV4cHIgKkUpIHsKKyAgYm9vbCBWaXNpdENYWE51bGxQdHJMaXRlcmFsRXhwcihjb25zdCBDWFhOdWxsUHRyTGl0ZXJhbEV4cHIgKkUpIHsKICAgICByZXR1cm4gRGVyaXZlZFplcm9Jbml0aWFsaXphdGlvbihFKTsKICAgfQogCiAgIC8vLyBBIG1lbWJlciBleHByZXNzaW9uIHdoZXJlIHRoZSBvYmplY3QgaXMgYSBwcnZhbHVlIGlzIGl0c2VsZiBhIHBydmFsdWUuCi0gIFJldFR5IFZpc2l0TWVtYmVyRXhwcihjb25zdCBNZW1iZXJFeHByICpFKSB7CisgIGJvb2wgVmlzaXRNZW1iZXJFeHByKGNvbnN0IE1lbWJlckV4cHIgKkUpIHsKICAgICBhc3NlcnQoIUUtPmlzQXJyb3coKSAmJiAibWlzc2luZyBjYWxsIHRvIGJvdW5kIG1lbWJlciBmdW5jdGlvbj8iKTsKIAogICAgIEFQVmFsdWUgVmFsOwpAQCAtNDA2MSw3ICs0MDgyLDcgQEAKICAgICAgICAgICAgRGVyaXZlZFN1Y2Nlc3MoUmVzdWx0LCBFKTsKICAgfQogCi0gIFJldFR5IFZpc2l0Q2FzdEV4cHIoY29uc3QgQ2FzdEV4cHIgKkUpIHsKKyAgYm9vbCBWaXNpdENhc3RFeHByKGNvbnN0IENhc3RFeHByICpFKSB7CiAgICAgc3dpdGNoIChFLT5nZXRDYXN0S2luZCgpKSB7CiAgICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwpAQCAtNDA5MywxMyArNDExNCwxMyBAQAogICAgIHJldHVybiBFcnJvcihFKTsKICAgfQogCi0gIFJldFR5IFZpc2l0VW5hcnlQb3N0SW5jKGNvbnN0IFVuYXJ5T3BlcmF0b3IgKlVPKSB7CisgIGJvb2wgVmlzaXRVbmFyeVBvc3RJbmMoY29uc3QgVW5hcnlPcGVyYXRvciAqVU8pIHsKICAgICByZXR1cm4gVmlzaXRVbmFyeVBvc3RJbmNEZWMoVU8pOwogICB9Ci0gIFJldFR5IFZpc2l0VW5hcnlQb3N0RGVjKGNvbnN0IFVuYXJ5T3BlcmF0b3IgKlVPKSB7CisgIGJvb2wgVmlzaXRVbmFyeVBvc3REZWMoY29uc3QgVW5hcnlPcGVyYXRvciAqVU8pIHsKICAgICByZXR1cm4gVmlzaXRVbmFyeVBvc3RJbmNEZWMoVU8pOwogICB9Ci0gIFJldFR5IFZpc2l0VW5hcnlQb3N0SW5jRGVjKGNvbnN0IFVuYXJ5T3BlcmF0b3IgKlVPKSB7CisgIGJvb2wgVmlzaXRVbmFyeVBvc3RJbmNEZWMoY29uc3QgVW5hcnlPcGVyYXRvciAqVU8pIHsKICAgICBpZiAoIUluZm8uZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxeSAmJiAhSW5mby5rZWVwRXZhbHVhdGluZ0FmdGVyRmFpbHVyZSgpKQogICAgICAgcmV0dXJuIEVycm9yKFVPKTsKIApAQCAtNDExMyw3ICs0MTM0LDcgQEAKICAgICByZXR1cm4gRGVyaXZlZFN1Y2Nlc3MoUlZhbCwgVU8pOwogICB9CiAKLSAgUmV0VHkgVmlzaXRTdG10RXhwcihjb25zdCBTdG10RXhwciAqRSkgeworICBib29sIFZpc2l0U3RtdEV4cHIoY29uc3QgU3RtdEV4cHIgKkUpIHsKICAgICAvLyBXZSB3aWxsIGhhdmUgY2hlY2tlZCB0aGUgZnVsbC1leHByZXNzaW9ucyBpbnNpZGUgdGhlIHN0YXRlbWVudCBleHByZXNzaW9uCiAgICAgLy8gd2hlbiB0aGV5IHdlcmUgY29tcGxldGVkLCBhbmQgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGVtIGFnYWluIG5vdy4KICAgICBpZiAoSW5mby5jaGVja2luZ0Zvck92ZXJmbG93KCkpCkBAIC00MTYyLDExICs0MTgzLDExIEBACiBuYW1lc3BhY2UgewogdGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4KIGNsYXNzIExWYWx1ZUV4cHJFdmFsdWF0b3JCYXNlCi0gIDogcHVibGljIEV4cHJFdmFsdWF0b3JCYXNlPERlcml2ZWQsIGJvb2w+IHsKKyAgOiBwdWJsaWMgRXhwckV2YWx1YXRvckJhc2U8RGVyaXZlZD4gewogcHJvdGVjdGVkOgogICBMVmFsdWUgJlJlc3VsdDsKICAgdHlwZWRlZiBMVmFsdWVFeHByRXZhbHVhdG9yQmFzZSBMVmFsdWVFeHByRXZhbHVhdG9yQmFzZVR5OwotICB0eXBlZGVmIEV4cHJFdmFsdWF0b3JCYXNlPERlcml2ZWQsIGJvb2w+IEV4cHJFdmFsdWF0b3JCYXNlVHk7CisgIHR5cGVkZWYgRXhwckV2YWx1YXRvckJhc2U8RGVyaXZlZD4gRXhwckV2YWx1YXRvckJhc2VUeTsKIAogICBib29sIFN1Y2Nlc3MoQVBWYWx1ZTo6TFZhbHVlQmFzZSBCKSB7CiAgICAgUmVzdWx0LnNldChCKTsKQEAgLTQ1ODQsNyArNDYwNSw3IEBACiAKIG5hbWVzcGFjZSB7CiBjbGFzcyBQb2ludGVyRXhwckV2YWx1YXRvcgotICA6IHB1YmxpYyBFeHByRXZhbHVhdG9yQmFzZTxQb2ludGVyRXhwckV2YWx1YXRvciwgYm9vbD4geworICA6IHB1YmxpYyBFeHByRXZhbHVhdG9yQmFzZTxQb2ludGVyRXhwckV2YWx1YXRvcj4gewogICBMVmFsdWUgJlJlc3VsdDsKIAogICBib29sIFN1Y2Nlc3MoY29uc3QgRXhwciAqRSkgewpAQCAtNDc2OSw3ICs0NzkwLDcgQEAKICAgaWYgKElzU3RyaW5nTGl0ZXJhbENhbGwoRSkpCiAgICAgcmV0dXJuIFN1Y2Nlc3MoRSk7CiAKLSAgc3dpdGNoIChFLT5pc0J1aWx0aW5DYWxsKCkpIHsKKyAgc3dpdGNoIChFLT5nZXRCdWlsdGluQ2FsbGVlKCkpIHsKICAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9hZGRyZXNzb2Y6CiAgICAgcmV0dXJuIEV2YWx1YXRlTFZhbHVlKEUtPmdldEFyZygwKSwgUmVzdWx0LCBJbmZvKTsKIApAQCAtNDc4NCw3ICs0ODA1LDcgQEAKIAogbmFtZXNwYWNlIHsKIGNsYXNzIE1lbWJlclBvaW50ZXJFeHByRXZhbHVhdG9yCi0gIDogcHVibGljIEV4cHJFdmFsdWF0b3JCYXNlPE1lbWJlclBvaW50ZXJFeHByRXZhbHVhdG9yLCBib29sPiB7CisgIDogcHVibGljIEV4cHJFdmFsdWF0b3JCYXNlPE1lbWJlclBvaW50ZXJFeHByRXZhbHVhdG9yPiB7CiAgIE1lbWJlclB0ciAmUmVzdWx0OwogCiAgIGJvb2wgU3VjY2Vzcyhjb25zdCBWYWx1ZURlY2wgKkQpIHsKQEAgLTQ4NzIsNyArNDg5Myw3IEBACiAKIG5hbWVzcGFjZSB7CiAgIGNsYXNzIFJlY29yZEV4cHJFdmFsdWF0b3IKLSAgOiBwdWJsaWMgRXhwckV2YWx1YXRvckJhc2U8UmVjb3JkRXhwckV2YWx1YXRvciwgYm9vbD4geworICA6IHB1YmxpYyBFeHByRXZhbHVhdG9yQmFzZTxSZWNvcmRFeHByRXZhbHVhdG9yPiB7CiAgICAgY29uc3QgTFZhbHVlICZUaGlzOwogICAgIEFQVmFsdWUgJlJlc3VsdDsKICAgcHVibGljOgpAQCAtNDkyNSwxNCArNDk0NiwxMyBAQAogICAgIH0KICAgfQogCi0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgSSA9IFJELT5maWVsZF9iZWdpbigpLCBFbmQgPSBSRC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgSSAhPSBFbmQ7ICsrSSkgeworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBSRC0+ZmllbGRzKCkpIHsKICAgICAvLyAtLSBpZiBUIGlzIGEgcmVmZXJlbmNlIHR5cGUsIG5vIGluaXRpYWxpemF0aW9uIGlzIHBlcmZvcm1lZC4KICAgICBpZiAoSS0+Z2V0VHlwZSgpLT5pc1JlZmVyZW5jZVR5cGUoKSkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgTFZhbHVlIFN1Ym9iamVjdCA9IFRoaXM7Ci0gICAgaWYgKCFIYW5kbGVMVmFsdWVNZW1iZXIoSW5mbywgRSwgU3Vib2JqZWN0LCAqSSwgJkxheW91dCkpCisgICAgaWYgKCFIYW5kbGVMVmFsdWVNZW1iZXIoSW5mbywgRSwgU3Vib2JqZWN0LCBJLCAmTGF5b3V0KSkKICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIEltcGxpY2l0VmFsdWVJbml0RXhwciBWSUUoSS0+Z2V0VHlwZSgpKTsKQEAgLTUwNDAsOCArNTA2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgc3RkOjpkaXN0YW5jZShSRC0+ZmllbGRfYmVnaW4oKSwgUkQtPmZpZWxkX2VuZCgpKSk7CiAgIHVuc2lnbmVkIEVsZW1lbnRObyA9IDA7CiAgIGJvb2wgU3VjY2VzcyA9IHRydWU7Ci0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRmllbGQgPSBSRC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICBGaWVsZEVuZCA9IFJELT5maWVsZF9lbmQoKTsgRmllbGQgIT0gRmllbGRFbmQ7ICsrRmllbGQpIHsKKyAgZm9yIChjb25zdCBhdXRvICpGaWVsZCA6IFJELT5maWVsZHMoKSkgewogICAgIC8vIEFub255bW91cyBiaXQtZmllbGRzIGFyZSBub3QgY29uc2lkZXJlZCBtZW1iZXJzIG9mIHRoZSBjbGFzcyBmb3IKICAgICAvLyBwdXJwb3NlcyBvZiBhZ2dyZWdhdGUgaW5pdGlhbGl6YXRpb24uCiAgICAgaWYgKEZpZWxkLT5pc1VubmFtZWRCaXRmaWVsZCgpKQpAQCAtNTA1NCw3ICs1MDczLDcgQEAKICAgICAvLyBGSVhNRTogRGlhZ25vc3RpY3MgaGVyZSBzaG91bGQgcG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUgaW5pdGlhbGl6ZXIKICAgICAvLyBsaXN0LCBub3QgdGhlIHN0YXJ0LgogICAgIGlmICghSGFuZGxlTFZhbHVlTWVtYmVyKEluZm8sIEhhdmVJbml0ID8gRS0+Z2V0SW5pdChFbGVtZW50Tm8pIDogRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJvYmplY3QsICpGaWVsZCwgJkxheW91dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vib2JqZWN0LCBGaWVsZCwgJkxheW91dCkpCiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAvLyBQZXJmb3JtIGFuIGltcGxpY2l0IHZhbHVlLWluaXRpYWxpemF0aW9uIGZvciBtZW1iZXJzIGJleW9uZCB0aGUgZW5kIG9mCkBAIC01MDY5LDcgKzUwODgsNyBAQAogICAgIEFQVmFsdWUgJkZpZWxkVmFsID0gUmVzdWx0LmdldFN0cnVjdEZpZWxkKEZpZWxkLT5nZXRGaWVsZEluZGV4KCkpOwogICAgIGlmICghRXZhbHVhdGVJblBsYWNlKEZpZWxkVmFsLCBJbmZvLCBTdWJvYmplY3QsIEluaXQpIHx8CiAgICAgICAgIChGaWVsZC0+aXNCaXRGaWVsZCgpICYmICF0cnVuY2F0ZUJpdGZpZWxkVmFsdWUoSW5mbywgSW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFZhbCwgKkZpZWxkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFZhbCwgRmllbGQpKSkgewogICAgICAgaWYgKCFJbmZvLmtlZXBFdmFsdWF0aW5nQWZ0ZXJGYWlsdXJlKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIFN1Y2Nlc3MgPSBmYWxzZTsKQEAgLTUwODksMTYgKzUxMDgsMTUgQEAKICAgICBpZiAoIVJlc3VsdC5pc1VuaW5pdCgpKQogICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICBpZiAoWmVyb0luaXQpCi0gICAgICByZXR1cm4gWmVyb0luaXRpYWxpemF0aW9uKEUpOwotCi0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBGRC0+Z2V0UGFyZW50KCk7Ci0gICAgaWYgKFJELT5pc1VuaW9uKCkpCi0gICAgICBSZXN1bHQgPSBBUFZhbHVlKChGaWVsZERlY2wqKTApOwotICAgIGVsc2UKLSAgICAgIFJlc3VsdCA9IEFQVmFsdWUoQVBWYWx1ZTo6VW5pbml0U3RydWN0KCksIFJELT5nZXROdW1CYXNlcygpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmRpc3RhbmNlKFJELT5maWVsZF9iZWdpbigpLCBSRC0+ZmllbGRfZW5kKCkpKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBXZSBjYW4gZ2V0IGhlcmUgaW4gdHdvIGRpZmZlcmVudCB3YXlzOgorICAgIC8vICAxKSBXZSdyZSBwZXJmb3JtaW5nIHZhbHVlLWluaXRpYWxpemF0aW9uLCBhbmQgc2hvdWxkIHplcm8taW5pdGlhbGl6ZQorICAgIC8vICAgICB0aGUgb2JqZWN0LCBvcgorICAgIC8vICAyKSBXZSdyZSBwZXJmb3JtaW5nIGRlZmF1bHQtaW5pdGlhbGl6YXRpb24gb2YgYW4gb2JqZWN0IHdpdGggYSB0cml2aWFsCisgICAgLy8gICAgIGNvbnN0ZXhwciBkZWZhdWx0IGNvbnN0cnVjdG9yLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBzdGFydCB0aGUKKyAgICAvLyAgICAgbGlmZXRpbWVzIG9mIGFsbCB0aGUgYmFzZSBzdWJvYmplY3RzICh0aGVyZSBjYW4gYmUgbm8gZGF0YSBtZW1iZXIKKyAgICAvLyAgICAgc3Vib2JqZWN0cyBpbiB0aGlzIGNhc2UpIHBlciBbYmFzaWMubGlmZV1wMS4KKyAgICAvLyBFaXRoZXIgd2F5LCBaZXJvSW5pdGlhbGl6YXRpb24gaXMgYXBwcm9wcmlhdGUuCisgICAgcmV0dXJuIFplcm9Jbml0aWFsaXphdGlvbihFKTsKICAgfQogCiAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRGVmaW5pdGlvbiA9IDA7CkBAIC01MjM1LDcgKzUyNTMsNyBAQAogCiBuYW1lc3BhY2UgewogICBjbGFzcyBWZWN0b3JFeHByRXZhbHVhdG9yCi0gIDogcHVibGljIEV4cHJFdmFsdWF0b3JCYXNlPFZlY3RvckV4cHJFdmFsdWF0b3IsIGJvb2w+IHsKKyAgOiBwdWJsaWMgRXhwckV2YWx1YXRvckJhc2U8VmVjdG9yRXhwckV2YWx1YXRvcj4gewogICAgIEFQVmFsdWUgJlJlc3VsdDsKICAgcHVibGljOgogCkBAIC01NDE2LDcgKzU0MzQsNyBAQAogCiBuYW1lc3BhY2UgewogICBjbGFzcyBBcnJheUV4cHJFdmFsdWF0b3IKLSAgOiBwdWJsaWMgRXhwckV2YWx1YXRvckJhc2U8QXJyYXlFeHByRXZhbHVhdG9yLCBib29sPiB7CisgIDogcHVibGljIEV4cHJFdmFsdWF0b3JCYXNlPEFycmF5RXhwckV2YWx1YXRvcj4gewogICAgIGNvbnN0IExWYWx1ZSAmVGhpczsKICAgICBBUFZhbHVlICZSZXN1bHQ7CiAgIHB1YmxpYzoKQEAgLTU1NzgsMTkgKzU1OTYsOSBAQAogICAgIGlmIChIYWRaZXJvSW5pdCkKICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgaWYgKFplcm9Jbml0KSB7Ci0gICAgICBJbXBsaWNpdFZhbHVlSW5pdEV4cHIgVklFKFR5cGUpOwotICAgICAgcmV0dXJuIEV2YWx1YXRlSW5QbGFjZSgqVmFsdWUsIEluZm8sIFN1Ym9iamVjdCwgJlZJRSk7Ci0gICAgfQotCi0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBGRC0+Z2V0UGFyZW50KCk7Ci0gICAgaWYgKFJELT5pc1VuaW9uKCkpCi0gICAgICAqVmFsdWUgPSBBUFZhbHVlKChGaWVsZERlY2wqKTApOwotICAgIGVsc2UKLSAgICAgICpWYWx1ZSA9Ci0gICAgICAgICAgQVBWYWx1ZShBUFZhbHVlOjpVbmluaXRTdHJ1Y3QoKSwgUkQtPmdldE51bUJhc2VzKCksCi0gICAgICAgICAgICAgICAgICBzdGQ6OmRpc3RhbmNlKFJELT5maWVsZF9iZWdpbigpLCBSRC0+ZmllbGRfZW5kKCkpKTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBTZWUgUmVjb3JkRXhwckV2YWx1YXRvcjo6VmlzaXRDWFhDb25zdHJ1Y3RFeHByIGZvciBleHBsYW5hdGlvbi4KKyAgICBJbXBsaWNpdFZhbHVlSW5pdEV4cHIgVklFKFR5cGUpOworICAgIHJldHVybiBFdmFsdWF0ZUluUGxhY2UoKlZhbHVlLCBJbmZvLCBTdWJvYmplY3QsICZWSUUpOwogICB9CiAKICAgY29uc3QgRnVuY3Rpb25EZWNsICpEZWZpbml0aW9uID0gMDsKQEAgLTU2MjEsNyArNTYyOSw3IEBACiAKIG5hbWVzcGFjZSB7CiBjbGFzcyBJbnRFeHByRXZhbHVhdG9yCi0gIDogcHVibGljIEV4cHJFdmFsdWF0b3JCYXNlPEludEV4cHJFdmFsdWF0b3IsIGJvb2w+IHsKKyAgOiBwdWJsaWMgRXhwckV2YWx1YXRvckJhc2U8SW50RXhwckV2YWx1YXRvcj4gewogICBBUFZhbHVlICZSZXN1bHQ7CiBwdWJsaWM6CiAgIEludEV4cHJFdmFsdWF0b3IoRXZhbEluZm8gJmluZm8sIEFQVmFsdWUgJnJlc3VsdCkKQEAgLTU3MjcsMTQgKzU3MzUsNiBAQAogICAgIHJldHVybiBaZXJvSW5pdGlhbGl6YXRpb24oRSk7CiAgIH0KIAotICBib29sIFZpc2l0VW5hcnlUeXBlVHJhaXRFeHByKGNvbnN0IFVuYXJ5VHlwZVRyYWl0RXhwciAqRSkgewotICAgIHJldHVybiBTdWNjZXNzKEUtPmdldFZhbHVlKCksIEUpOwotICB9Ci0KLSAgYm9vbCBWaXNpdEJpbmFyeVR5cGVUcmFpdEV4cHIoY29uc3QgQmluYXJ5VHlwZVRyYWl0RXhwciAqRSkgewotICAgIHJldHVybiBTdWNjZXNzKEUtPmdldFZhbHVlKCksIEUpOwotICB9Ci0KICAgYm9vbCBWaXNpdFR5cGVUcmFpdEV4cHIoY29uc3QgVHlwZVRyYWl0RXhwciAqRSkgewogICAgIHJldHVybiBTdWNjZXNzKEUtPmdldFZhbHVlKCksIEUpOwogICB9CkBAIC01OTc1LDcgKzU5NzUsNyBAQAogfQogCiBib29sIEludEV4cHJFdmFsdWF0b3I6OlZpc2l0Q2FsbEV4cHIoY29uc3QgQ2FsbEV4cHIgKkUpIHsKLSAgc3dpdGNoICh1bnNpZ25lZCBCdWlsdGluT3AgPSBFLT5pc0J1aWx0aW5DYWxsKCkpIHsKKyAgc3dpdGNoICh1bnNpZ25lZCBCdWlsdGluT3AgPSBFLT5nZXRCdWlsdGluQ2FsbGVlKCkpIHsKICAgZGVmYXVsdDoKICAgICByZXR1cm4gRXhwckV2YWx1YXRvckJhc2VUeTo6VmlzaXRDYWxsRXhwcihFKTsKIApAQCAtNTk5NCw3ICs1OTk0LDE3IEBACiAKICAgICAvLyBFeHByZXNzaW9uIGhhZCBubyBzaWRlIGVmZmVjdHMsIGJ1dCB3ZSBjb3VsZG4ndCBzdGF0aWNhbGx5IGRldGVybWluZSB0aGUKICAgICAvLyBzaXplIG9mIHRoZSByZWZlcmVuY2VkIG9iamVjdC4KLSAgICByZXR1cm4gRXJyb3IoRSk7CisgICAgc3dpdGNoIChJbmZvLkV2YWxNb2RlKSB7CisgICAgY2FzZSBFdmFsSW5mbzo6RU1fQ29uc3RhbnRFeHByZXNzaW9uOgorICAgIGNhc2UgRXZhbEluZm86OkVNX1BvdGVudGlhbENvbnN0YW50RXhwcmVzc2lvbjoKKyAgICBjYXNlIEV2YWxJbmZvOjpFTV9Db25zdGFudEZvbGQ6CisgICAgY2FzZSBFdmFsSW5mbzo6RU1fRXZhbHVhdGVGb3JPdmVyZmxvdzoKKyAgICBjYXNlIEV2YWxJbmZvOjpFTV9JZ25vcmVTaWRlRWZmZWN0czoKKyAgICAgIHJldHVybiBFcnJvcihFKTsKKyAgICBjYXNlIEV2YWxJbmZvOjpFTV9Db25zdGFudEV4cHJlc3Npb25VbmV2YWx1YXRlZDoKKyAgICBjYXNlIEV2YWxJbmZvOjpFTV9Qb3RlbnRpYWxDb25zdGFudEV4cHJlc3Npb25VbmV2YWx1YXRlZDoKKyAgICAgIHJldHVybiBTdWNjZXNzKC0xVUxMLCBFKTsKKyAgICB9CiAgIH0KIAogICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2Jzd2FwMTY6CkBAIC03MTIwLDYgKzcxMzAsNyBAQAogICBjYXNlIENLX0J1aWx0aW5GblRvRm5QdHI6CiAgIGNhc2UgQ0tfWmVyb1RvT0NMRXZlbnQ6CiAgIGNhc2UgQ0tfTm9uQXRvbWljVG9BdG9taWM6CisgIGNhc2UgQ0tfQWRkcmVzc1NwYWNlQ29udmVyc2lvbjoKICAgICBsbHZtX3VucmVhY2hhYmxlKCJpbnZhbGlkIGNhc3Qga2luZCBmb3IgaW50ZWdyYWwgdmFsdWUiKTsKIAogICBjYXNlIENLX0JpdENhc3Q6CkBAIC03MjU4LDcgKzcyNjksNyBAQAogCiBuYW1lc3BhY2UgewogY2xhc3MgRmxvYXRFeHByRXZhbHVhdG9yCi0gIDogcHVibGljIEV4cHJFdmFsdWF0b3JCYXNlPEZsb2F0RXhwckV2YWx1YXRvciwgYm9vbD4geworICA6IHB1YmxpYyBFeHByRXZhbHVhdG9yQmFzZTxGbG9hdEV4cHJFdmFsdWF0b3I+IHsKICAgQVBGbG9hdCAmUmVzdWx0OwogcHVibGljOgogICBGbG9hdEV4cHJFdmFsdWF0b3IoRXZhbEluZm8gJmluZm8sIEFQRmxvYXQgJnJlc3VsdCkKQEAgLTczMTksNyArNzMzMCw3IEBACiB9CiAKIGJvb2wgRmxvYXRFeHByRXZhbHVhdG9yOjpWaXNpdENhbGxFeHByKGNvbnN0IENhbGxFeHByICpFKSB7Ci0gIHN3aXRjaCAoRS0+aXNCdWlsdGluQ2FsbCgpKSB7CisgIHN3aXRjaCAoRS0+Z2V0QnVpbHRpbkNhbGxlZSgpKSB7CiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIEV4cHJFdmFsdWF0b3JCYXNlVHk6OlZpc2l0Q2FsbEV4cHIoRSk7CiAKQEAgLTc0NzQsNyArNzQ4NSw3IEBACiAKIG5hbWVzcGFjZSB7CiBjbGFzcyBDb21wbGV4RXhwckV2YWx1YXRvcgotICA6IHB1YmxpYyBFeHByRXZhbHVhdG9yQmFzZTxDb21wbGV4RXhwckV2YWx1YXRvciwgYm9vbD4geworICA6IHB1YmxpYyBFeHByRXZhbHVhdG9yQmFzZTxDb21wbGV4RXhwckV2YWx1YXRvcj4gewogICBDb21wbGV4VmFsdWUgJlJlc3VsdDsKIAogcHVibGljOgpAQCAtNzU5Miw2ICs3NjAzLDcgQEAKICAgY2FzZSBDS19CdWlsdGluRm5Ub0ZuUHRyOgogICBjYXNlIENLX1plcm9Ub09DTEV2ZW50OgogICBjYXNlIENLX05vbkF0b21pY1RvQXRvbWljOgorICBjYXNlIENLX0FkZHJlc3NTcGFjZUNvbnZlcnNpb246CiAgICAgbGx2bV91bnJlYWNoYWJsZSgiaW52YWxpZCBjYXN0IGtpbmQgZm9yIGNvbXBsZXggdmFsdWUiKTsKIAogICBjYXNlIENLX0xWYWx1ZVRvUlZhbHVlOgpAQCAtNzg1OCw3ICs3ODcwLDcgQEAKIAogbmFtZXNwYWNlIHsKIGNsYXNzIEF0b21pY0V4cHJFdmFsdWF0b3IgOgotICAgIHB1YmxpYyBFeHByRXZhbHVhdG9yQmFzZTxBdG9taWNFeHByRXZhbHVhdG9yLCBib29sPiB7CisgICAgcHVibGljIEV4cHJFdmFsdWF0b3JCYXNlPEF0b21pY0V4cHJFdmFsdWF0b3I+IHsKICAgQVBWYWx1ZSAmUmVzdWx0OwogcHVibGljOgogICBBdG9taWNFeHByRXZhbHVhdG9yKEV2YWxJbmZvICZJbmZvLCBBUFZhbHVlICZSZXN1bHQpCkBAIC03ODk4LDcgKzc5MTAsNyBAQAogCiBuYW1lc3BhY2UgewogY2xhc3MgVm9pZEV4cHJFdmFsdWF0b3IKLSAgOiBwdWJsaWMgRXhwckV2YWx1YXRvckJhc2U8Vm9pZEV4cHJFdmFsdWF0b3IsIGJvb2w+IHsKKyAgOiBwdWJsaWMgRXhwckV2YWx1YXRvckJhc2U8Vm9pZEV4cHJFdmFsdWF0b3I+IHsKIHB1YmxpYzoKICAgVm9pZEV4cHJFdmFsdWF0b3IoRXZhbEluZm8gJkluZm8pIDogRXhwckV2YWx1YXRvckJhc2VUeShJbmZvKSB7fQogCkBAIC04MDAwLDYgKzgwMTIsOCBAQAogLy8vIGFuIG9iamVjdCBjYW4gaW5kaXJlY3RseSByZWZlciB0byBzdWJvYmplY3RzIHdoaWNoIHdlcmUgaW5pdGlhbGl6ZWQgZWFybGllci4KIHN0YXRpYyBib29sIEV2YWx1YXRlSW5QbGFjZShBUFZhbHVlICZSZXN1bHQsIEV2YWxJbmZvICZJbmZvLCBjb25zdCBMVmFsdWUgJlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqRSwgYm9vbCBBbGxvd05vbkxpdGVyYWxUeXBlcykgeworICBhc3NlcnQoIUUtPmlzVmFsdWVEZXBlbmRlbnQoKSk7CisKICAgaWYgKCFBbGxvd05vbkxpdGVyYWxUeXBlcyAmJiAhQ2hlY2tMaXRlcmFsVHlwZShJbmZvLCBFLCAmVGhpcykpCiAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC04MDE5LDYgKzgwMzMsOSBAQAogLy8vIEV2YWx1YXRlQXNSVmFsdWUgLSBUcnkgdG8gZXZhbHVhdGUgdGhpcyBleHByZXNzaW9uLCBwZXJmb3JtaW5nIGFuIGltcGxpY2l0CiAvLy8gbHZhbHVlLXRvLXJ2YWx1ZSBjYXN0IGlmIGl0IGlzIGFuIGx2YWx1ZS4KIHN0YXRpYyBib29sIEV2YWx1YXRlQXNSVmFsdWUoRXZhbEluZm8gJkluZm8sIGNvbnN0IEV4cHIgKkUsIEFQVmFsdWUgJlJlc3VsdCkgeworICBpZiAoRS0+Z2V0VHlwZSgpLmlzTnVsbCgpKQorICAgIHJldHVybiBmYWxzZTsKKwogICBpZiAoIUNoZWNrTGl0ZXJhbFR5cGUoSW5mbywgRSkpCiAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC04MDQ2LDYgKzgwNjMsMTMgQEAKICAgICBJc0NvbnN0ID0gdHJ1ZTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQorCisgIC8vIFRoaXMgY2FzZSBzaG91bGQgYmUgcmFyZSwgYnV0IHdlIG5lZWQgdG8gY2hlY2sgaXQgYmVmb3JlIHdlIGNoZWNrIG9uCisgIC8vIHRoZSB0eXBlIGJlbG93LgorICBpZiAoRXhwLT5nZXRUeXBlKCkuaXNOdWxsKCkpIHsKKyAgICBJc0NvbnN0ID0gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KICAgCiAgIC8vIEZJWE1FOiBFdmFsdWF0aW5nIHZhbHVlcyBvZiBsYXJnZSBhcnJheSBhbmQgcmVjb3JkIHR5cGVzIGNhbiBjYXVzZQogICAvLyBwZXJmb3JtYW5jZSBwcm9ibGVtcy4gT25seSBkbyBzbyBpbiBDKysxMSBmb3Igbm93LgpAQCAtODMwMywxMCArODMyNywyMCBAQAogICBjYXNlIEV4cHI6Ok1hdGVyaWFsaXplVGVtcG9yYXJ5RXhwckNsYXNzOgogICBjYXNlIEV4cHI6OlBzZXVkb09iamVjdEV4cHJDbGFzczoKICAgY2FzZSBFeHByOjpBdG9taWNFeHByQ2xhc3M6Ci0gIGNhc2UgRXhwcjo6SW5pdExpc3RFeHByQ2xhc3M6CiAgIGNhc2UgRXhwcjo6TGFtYmRhRXhwckNsYXNzOgogICAgIHJldHVybiBJQ0VEaWFnKElLX05vdElDRSwgRS0+Z2V0TG9jU3RhcnQoKSk7CiAKKyAgY2FzZSBFeHByOjpJbml0TGlzdEV4cHJDbGFzczogeworICAgIC8vIEMrKzAzIFtkY2wuaW5pdF1wMTM6IElmIFQgaXMgYSBzY2FsYXIgdHlwZSwgdGhlbiBhIGRlY2xhcmF0aW9uIG9mIHRoZQorICAgIC8vIGZvcm0gIlQgeCA9IHsgYSB9OyIgaXMgZXF1aXZhbGVudCB0byAiVCB4ID0gYTsiLgorICAgIC8vIFVubGVzcyB3ZSdyZSBpbml0aWFsaXppbmcgYSByZWZlcmVuY2UsIFQgaXMgYSBzY2FsYXIgYXMgaXQgaXMga25vd24gdG8gYmUKKyAgICAvLyBvZiBpbnRlZ3JhbCBvciBlbnVtZXJhdGlvbiB0eXBlLgorICAgIGlmIChFLT5pc1JWYWx1ZSgpKQorICAgICAgaWYgKGNhc3Q8SW5pdExpc3RFeHByPihFKS0+Z2V0TnVtSW5pdHMoKSA9PSAxKQorICAgICAgICByZXR1cm4gQ2hlY2tJQ0UoY2FzdDxJbml0TGlzdEV4cHI+KEUpLT5nZXRJbml0KDApLCBDdHgpOworICAgIHJldHVybiBJQ0VEaWFnKElLX05vdElDRSwgRS0+Z2V0TG9jU3RhcnQoKSk7CisgIH0KKwogICBjYXNlIEV4cHI6OlNpemVPZlBhY2tFeHByQ2xhc3M6CiAgIGNhc2UgRXhwcjo6R05VTnVsbEV4cHJDbGFzczoKICAgICAvLyBHQ0MgY29uc2lkZXJzIHRoZSBHTlUgX19udWxsIHZhbHVlIHRvIGJlIGFuIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb24uCkBAIC04MzI1LDggKzgzNTksNiBAQAogICBjYXNlIEV4cHI6Ok9iakNCb29sTGl0ZXJhbEV4cHJDbGFzczoKICAgY2FzZSBFeHByOjpDWFhCb29sTGl0ZXJhbEV4cHJDbGFzczoKICAgY2FzZSBFeHByOjpDWFhTY2FsYXJWYWx1ZUluaXRFeHByQ2xhc3M6Ci0gIGNhc2UgRXhwcjo6VW5hcnlUeXBlVHJhaXRFeHByQ2xhc3M6Ci0gIGNhc2UgRXhwcjo6QmluYXJ5VHlwZVRyYWl0RXhwckNsYXNzOgogICBjYXNlIEV4cHI6OlR5cGVUcmFpdEV4cHJDbGFzczoKICAgY2FzZSBFeHByOjpBcnJheVR5cGVUcmFpdEV4cHJDbGFzczoKICAgY2FzZSBFeHByOjpFeHByZXNzaW9uVHJhaXRFeHByQ2xhc3M6CkBAIC04MzM4LDcgKzgzNzAsNyBAQAogICAgIC8vIGNvbnN0YW50IGV4cHJlc3Npb25zLCBidXQgdGhleSBjYW4gbmV2ZXIgYmUgSUNFcyBiZWNhdXNlIGFuIElDRSBjYW5ub3QKICAgICAvLyBjb250YWluIGFuIG9wZXJhbmQgb2YgKHBvaW50ZXIgdG8pIGZ1bmN0aW9uIHR5cGUuCiAgICAgY29uc3QgQ2FsbEV4cHIgKkNFID0gY2FzdDxDYWxsRXhwcj4oRSk7Ci0gICAgaWYgKENFLT5pc0J1aWx0aW5DYWxsKCkpCisgICAgaWYgKENFLT5nZXRCdWlsdGluQ2FsbGVlKCkpCiAgICAgICByZXR1cm4gQ2hlY2tFdmFsSW5JQ0UoRSwgQ3R4KTsKICAgICByZXR1cm4gSUNFRGlhZyhJS19Ob3RJQ0UsIEUtPmdldExvY1N0YXJ0KCkpOwogICB9CkBAIC04NTU1LDcgKzg1ODcsNyBAQAogICAgIC8vIGV4dGVuc2lvbi4gIFNlZSBHQ0MgUFIzODM3NyBmb3IgZGlzY3Vzc2lvbi4KICAgICBpZiAoY29uc3QgQ2FsbEV4cHIgKkNhbGxDRQogICAgICAgICA9IGR5bl9jYXN0PENhbGxFeHByPihFeHAtPmdldENvbmQoKS0+SWdub3JlUGFyZW5DYXN0cygpKSkKLSAgICAgIGlmIChDYWxsQ0UtPmlzQnVpbHRpbkNhbGwoKSA9PSBCdWlsdGluOjpCSV9fYnVpbHRpbl9jb25zdGFudF9wKQorICAgICAgaWYgKENhbGxDRS0+Z2V0QnVpbHRpbkNhbGxlZSgpID09IEJ1aWx0aW46OkJJX19idWlsdGluX2NvbnN0YW50X3ApCiAgICAgICAgIHJldHVybiBDaGVja0V2YWxJbklDRShFLCBDdHgpOwogICAgIElDRURpYWcgQ29uZFJlc3VsdCA9IENoZWNrSUNFKEV4cC0+Z2V0Q29uZCgpLCBDdHgpOwogICAgIGlmIChDb25kUmVzdWx0LktpbmQgPT0gSUtfTm90SUNFKQpAQCAtODY2NSw2ICs4Njk3LDI4IEBACiAgIHJldHVybiBJc0NvbnN0RXhwcjsKIH0KIAorYm9vbCBFeHByOjpFdmFsdWF0ZVdpdGhTdWJzdGl0dXRpb24oQVBWYWx1ZSAmVmFsdWUsIEFTVENvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8Y29uc3QgRXhwcio+IEFyZ3MpIGNvbnN0IHsKKyAgRXhwcjo6RXZhbFN0YXR1cyBTdGF0dXM7CisgIEV2YWxJbmZvIEluZm8oQ3R4LCBTdGF0dXMsIEV2YWxJbmZvOjpFTV9Db25zdGFudEV4cHJlc3Npb25VbmV2YWx1YXRlZCk7CisKKyAgQXJnVmVjdG9yIEFyZ1ZhbHVlcyhBcmdzLnNpemUoKSk7CisgIGZvciAoQXJyYXlSZWY8Y29uc3QgRXhwcio+OjppdGVyYXRvciBJID0gQXJncy5iZWdpbigpLCBFID0gQXJncy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmICghRXZhbHVhdGUoQXJnVmFsdWVzW0kgLSBBcmdzLmJlZ2luKCldLCBJbmZvLCAqSSkpCisgICAgICAvLyBJZiBldmFsdWF0aW9uIGZhaWxzLCB0aHJvdyBhd2F5IHRoZSBhcmd1bWVudCBlbnRpcmVseS4KKyAgICAgIEFyZ1ZhbHVlc1tJIC0gQXJncy5iZWdpbigpXSA9IEFQVmFsdWUoKTsKKyAgICBpZiAoSW5mby5FdmFsU3RhdHVzLkhhc1NpZGVFZmZlY3RzKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQnVpbGQgZmFrZSBjYWxsIHRvIENhbGxlZS4KKyAgQ2FsbFN0YWNrRnJhbWUgRnJhbWUoSW5mbywgQ2FsbGVlLT5nZXRMb2NhdGlvbigpLCBDYWxsZWUsIC8qVGhpcyovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgQXJnVmFsdWVzLmRhdGEoKSk7CisgIHJldHVybiBFdmFsdWF0ZShWYWx1ZSwgSW5mbywgdGhpcykgJiYgIUluZm8uRXZhbFN0YXR1cy5IYXNTaWRlRWZmZWN0czsKK30KKwogYm9vbCBFeHByOjppc1BvdGVudGlhbENvbnN0YW50RXhwcihjb25zdCBGdW5jdGlvbkRlY2wgKkZELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGlhbERpYWdub3N0aWNBdD4gJkRpYWdzKSB7CkBAIC04NzA1LDMgKzg3NTksMjcgQEAKIAogICByZXR1cm4gRGlhZ3MuZW1wdHkoKTsKIH0KKworYm9vbCBFeHByOjppc1BvdGVudGlhbENvbnN0YW50RXhwclVuZXZhbHVhdGVkKEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWFsRGlhZ25vc3RpY0F0PiAmRGlhZ3MpIHsKKyAgRXhwcjo6RXZhbFN0YXR1cyBTdGF0dXM7CisgIFN0YXR1cy5EaWFnID0gJkRpYWdzOworCisgIEV2YWxJbmZvIEluZm8oRkQtPmdldEFTVENvbnRleHQoKSwgU3RhdHVzLAorICAgICAgICAgICAgICAgIEV2YWxJbmZvOjpFTV9Qb3RlbnRpYWxDb25zdGFudEV4cHJlc3Npb25VbmV2YWx1YXRlZCk7CisKKyAgLy8gRmFicmljYXRlIGEgY2FsbCBzdGFjayBmcmFtZSB0byBnaXZlIHRoZSBhcmd1bWVudHMgYSBwbGF1c2libGUgY292ZXIgc3RvcnkuCisgIEFycmF5UmVmPGNvbnN0IEV4cHIqPiBBcmdzOworICBBcmdWZWN0b3IgQXJnVmFsdWVzKDApOworICBib29sIFN1Y2Nlc3MgPSBFdmFsdWF0ZUFyZ3MoQXJncywgQXJnVmFsdWVzLCBJbmZvKTsKKyAgKHZvaWQpU3VjY2VzczsKKyAgYXNzZXJ0KFN1Y2Nlc3MgJiYKKyAgICAgICAgICJGYWlsZWQgdG8gc2V0IHVwIGFyZ3VtZW50cyBmb3IgcG90ZW50aWFsIGNvbnN0YW50IGV2YWx1YXRpb24iKTsKKyAgQ2FsbFN0YWNrRnJhbWUgRnJhbWUoSW5mbywgU291cmNlTG9jYXRpb24oKSwgRkQsIDAsIEFyZ1ZhbHVlcy5kYXRhKCkpOworCisgIEFQVmFsdWUgUmVzdWx0U2NyYXRjaDsKKyAgRXZhbHVhdGUoUmVzdWx0U2NyYXRjaCwgSW5mbywgRSk7CisgIHJldHVybiBEaWFncy5lbXB0eSgpOworfQpkaWZmIC0tZ2l0IGEvbGliL0FTVC9Jbmhlcml0Vml6LmNwcCBiL2xpYi9BU1QvSW5oZXJpdFZpei5jcHAKaW5kZXggM2Q2NDMxMC4uODRjYzE2NyAxMDA2NDQKLS0tIGEvbGliL0FTVC9Jbmhlcml0Vml6LmNwcAorKysgYi9saWIvQVNUL0luaGVyaXRWaXouY3BwCkBAIC05MywyNiArOTMsMjUgQEAKICAgLy8gRGlzcGxheSB0aGUgYmFzZSBjbGFzc2VzLgogICBjb25zdCBDWFhSZWNvcmREZWNsICpEZWNsCiAgICAgPSBzdGF0aWNfY2FzdDxjb25zdCBDWFhSZWNvcmREZWNsICo+KFR5cGUtPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7Ci0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBCYXNlID0gRGVjbC0+YmFzZXNfYmVnaW4oKTsKLSAgICAgICBCYXNlICE9IERlY2wtPmJhc2VzX2VuZCgpOyArK0Jhc2UpIHsKLSAgICBRdWFsVHlwZSBDYW5vbkJhc2VUeXBlID0gQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKEJhc2UtPmdldFR5cGUoKSk7CisgIGZvciAoY29uc3QgYXV0byAmQmFzZSA6IERlY2wtPmJhc2VzKCkpIHsKKyAgICBRdWFsVHlwZSBDYW5vbkJhc2VUeXBlID0gQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKEJhc2UuZ2V0VHlwZSgpKTsKIAogICAgIC8vIElmIHRoaXMgaXMgbm90IHZpcnR1YWwgaW5oZXJpdGFuY2UsIGJ1bXAgdGhlIGRpcmVjdCBiYXNlCiAgICAgLy8gY291bnQgZm9yIHRoZSB0eXBlLgotICAgIGlmICghQmFzZS0+aXNWaXJ0dWFsKCkpCisgICAgaWYgKCFCYXNlLmlzVmlydHVhbCgpKQogICAgICAgKytEaXJlY3RCYXNlQ291bnRbQ2Fub25CYXNlVHlwZV07CiAKICAgICAvLyBXcml0ZSBvdXQgdGhlIG5vZGUgKGlmIHdlIG5lZWQgdG8pLgotICAgIFdyaXRlTm9kZShCYXNlLT5nZXRUeXBlKCksIEJhc2UtPmlzVmlydHVhbCgpKTsKKyAgICBXcml0ZU5vZGUoQmFzZS5nZXRUeXBlKCksIEJhc2UuaXNWaXJ0dWFsKCkpOwogCiAgICAgLy8gV3JpdGUgb3V0IHRoZSBlZGdlLgogICAgIE91dCA8PCAiICAiOwogICAgIFdyaXRlTm9kZVJlZmVyZW5jZShUeXBlLCBGcm9tVmlydHVhbCk7CiAgICAgT3V0IDw8ICIgLT4gIjsKLSAgICBXcml0ZU5vZGVSZWZlcmVuY2UoQmFzZS0+Z2V0VHlwZSgpLCBCYXNlLT5pc1ZpcnR1YWwoKSk7CisgICAgV3JpdGVOb2RlUmVmZXJlbmNlKEJhc2UuZ2V0VHlwZSgpLCBCYXNlLmlzVmlydHVhbCgpKTsKIAogICAgIC8vIFdyaXRlIG91dCBlZGdlIGF0dHJpYnV0ZXMgdG8gc2hvdyB0aGUga2luZCBvZiBpbmhlcml0YW5jZS4KLSAgICBpZiAoQmFzZS0+aXNWaXJ0dWFsKCkpIHsKKyAgICBpZiAoQmFzZS5pc1ZpcnR1YWwoKSkgewogICAgICAgT3V0IDw8ICIgWyBzdHlsZT1cImRhc2hlZFwiIF0iOwogICAgIH0KICAgICBPdXQgPDwgIjsiOwpkaWZmIC0tZ2l0IGEvbGliL0FTVC9JdGFuaXVtQ1hYQUJJLmNwcCBiL2xpYi9BU1QvSXRhbml1bUNYWEFCSS5jcHAKaW5kZXggNTc4NDY2MC4uZmZhMmRkYyAxMDA2NDQKLS0tIGEvbGliL0FTVC9JdGFuaXVtQ1hYQUJJLmNwcAorKysgYi9saWIvQVNUL0l0YW5pdW1DWFhBQkkuY3BwCkBAIC0zMywxMiArMzMsMTcgQEAKIC8vLyBsaXRlcmFscyB3aXRoaW4gYSBwYXJ0aWN1bGFyIGNvbnRleHQuCiBjbGFzcyBJdGFuaXVtTnVtYmVyaW5nQ29udGV4dCA6IHB1YmxpYyBNYW5nbGVOdW1iZXJpbmdDb250ZXh0IHsKICAgbGx2bTo6RGVuc2VNYXA8SWRlbnRpZmllckluZm8qLCB1bnNpZ25lZD4gVmFyTWFuZ2xpbmdOdW1iZXJzOworICBsbHZtOjpEZW5zZU1hcDxJZGVudGlmaWVySW5mbyosIHVuc2lnbmVkPiBUYWdNYW5nbGluZ051bWJlcnM7CiAKIHB1YmxpYzoKICAgLy8vIFZhcmlhYmxlIGRlY2xzIGFyZSBudW1iZXJlZCBieSBpZGVudGlmaWVyLgotICB2aXJ0dWFsIHVuc2lnbmVkIGdldE1hbmdsaW5nTnVtYmVyKGNvbnN0IFZhckRlY2wgKlZEKSB7CisgIHVuc2lnbmVkIGdldE1hbmdsaW5nTnVtYmVyKGNvbnN0IFZhckRlY2wgKlZELCB1bnNpZ25lZCkgb3ZlcnJpZGUgewogICAgIHJldHVybiArK1Zhck1hbmdsaW5nTnVtYmVyc1tWRC0+Z2V0SWRlbnRpZmllcigpXTsKICAgfQorCisgIHVuc2lnbmVkIGdldE1hbmdsaW5nTnVtYmVyKGNvbnN0IFRhZ0RlY2wgKlRELCB1bnNpZ25lZCkgb3ZlcnJpZGUgeworICAgIHJldHVybiArK1RhZ01hbmdsaW5nTnVtYmVyc1tURC0+Z2V0SWRlbnRpZmllcigpXTsKKyAgfQogfTsKIAogY2xhc3MgSXRhbml1bUNYWEFCSSA6IHB1YmxpYyBDWFhBQkkgewpAQCAtNDgsNyArNTMsNyBAQAogICBJdGFuaXVtQ1hYQUJJKEFTVENvbnRleHQgJkN0eCkgOiBDb250ZXh0KEN0eCkgeyB9CiAKICAgc3RkOjpwYWlyPHVpbnQ2NF90LCB1bnNpZ25lZD4KLSAgZ2V0TWVtYmVyUG9pbnRlcldpZHRoQW5kQWxpZ24oY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCkgY29uc3QgeworICBnZXRNZW1iZXJQb2ludGVyV2lkdGhBbmRBbGlnbihjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSBjb25zdCBvdmVycmlkZSB7CiAgICAgY29uc3QgVGFyZ2V0SW5mbyAmVGFyZ2V0ID0gQ29udGV4dC5nZXRUYXJnZXRJbmZvKCk7CiAgICAgVGFyZ2V0SW5mbzo6SW50VHlwZSBQdHJEaWZmID0gVGFyZ2V0LmdldFB0ckRpZmZUeXBlKDApOwogICAgIHVpbnQ2NF90IFdpZHRoID0gVGFyZ2V0LmdldFR5cGVXaWR0aChQdHJEaWZmKTsKQEAgLTU4LDEzICs2MywxNyBAQAogICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihXaWR0aCwgQWxpZ24pOwogICB9CiAKLSAgQ2FsbGluZ0NvbnYgZ2V0RGVmYXVsdE1ldGhvZENhbGxDb252KGJvb2wgaXNWYXJpYWRpYykgY29uc3QgeworICBDYWxsaW5nQ29udiBnZXREZWZhdWx0TWV0aG9kQ2FsbENvbnYoYm9vbCBpc1ZhcmlhZGljKSBjb25zdCBvdmVycmlkZSB7CisgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUID0gQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkuZ2V0VHJpcGxlKCk7CisgICAgaWYgKCFpc1ZhcmlhZGljICYmIFQuaXNXaW5kb3dzR05VRW52aXJvbm1lbnQoKSAmJgorICAgICAgICBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NikKKyAgICAgIHJldHVybiBDQ19YODZUaGlzQ2FsbDsKICAgICByZXR1cm4gQ0NfQzsKICAgfQogCiAgIC8vIFdlIGNoZWF0IGFuZCBqdXN0IGNoZWNrIHRoYXQgdGhlIGNsYXNzIGhhcyBhIHZ0YWJsZSBwb2ludGVyLCBhbmQgdGhhdCBpdCdzCiAgIC8vIG9ubHkgYmlnIGVub3VnaCB0byBoYXZlIGEgdnRhYmxlIHBvaW50ZXIgYW5kIG5vdGhpbmcgbW9yZSAob3IgbGVzcykuCi0gIGJvb2wgaXNOZWFybHlFbXB0eShjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgY29uc3QgeworICBib29sIGlzTmVhcmx5RW1wdHkoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIGNvbnN0IG92ZXJyaWRlIHsKIAogICAgIC8vIENoZWNrIHRoYXQgdGhlIGNsYXNzIGhhcyBhIHZ0YWJsZSBwb2ludGVyLgogICAgIGlmICghUkQtPmlzRHluYW1pY0NsYXNzKCkpCkBAIC03Niw3ICs4NSw3IEBACiAgICAgcmV0dXJuIExheW91dC5nZXROb25WaXJ0dWFsU2l6ZSgpID09IFBvaW50ZXJTaXplOwogICB9CiAKLSAgdmlydHVhbCBNYW5nbGVOdW1iZXJpbmdDb250ZXh0ICpjcmVhdGVNYW5nbGVOdW1iZXJpbmdDb250ZXh0KCkgY29uc3QgeworICBNYW5nbGVOdW1iZXJpbmdDb250ZXh0ICpjcmVhdGVNYW5nbGVOdW1iZXJpbmdDb250ZXh0KCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBuZXcgSXRhbml1bU51bWJlcmluZ0NvbnRleHQoKTsKICAgfQogfTsKZGlmZiAtLWdpdCBhL2xpYi9BU1QvSXRhbml1bU1hbmdsZS5jcHAgYi9saWIvQVNUL0l0YW5pdW1NYW5nbGUuY3BwCmluZGV4IDA2MjFkN2IuLjI3YmEyYmUgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvSXRhbml1bU1hbmdsZS5jcHAKKysrIGIvbGliL0FTVC9JdGFuaXVtTWFuZ2xlLmNwcApAQCAtMTEsNyArMTEsNyBAQAogLy8gd2hpY2ggaXMgdXNlZCBpbiBHQ0MgMy4yIGFuZCBuZXdlciAoYW5kIG1hbnkgY29tcGlsZXJzIHRoYXQgYXJlCiAvLyBBQkktY29tcGF0aWJsZSB3aXRoIEdDQyk6CiAvLwotLy8gICBodHRwOi8vd3d3LmNvZGVzb3VyY2VyeS5jb20vcHVibGljL2N4eC1hYmkvYWJpLmh0bWwKKy8vICAgaHR0cDovL21lbnRvcmVtYmVkZGVkLmdpdGh1Yi5pby9jeHgtYWJpL2FiaS5odG1sI21hbmdsaW5nCiAvLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KICNpbmNsdWRlICJjbGFuZy9BU1QvTWFuZ2xlLmgiCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbE9iakMuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRXhwckNYWC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByT2JqQy5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jLmgiCkBAIC0xMDEsMTEgKzEwMiwxOCBAQAogICBjb25zdCBGdW5jdGlvbkRlY2wgKmZuID0gZHluX2Nhc3Rfb3JfbnVsbDxGdW5jdGlvbkRlY2w+KGRlY2wpOwogICByZXR1cm4gKGZuID8gZ2V0U3RydWN0b3IoZm4pIDogZGVjbCk7CiB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKK3N0YXRpYyBib29sIGlzTGFtYmRhKGNvbnN0IE5hbWVkRGVjbCAqTkQpIHsKKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUmVjb3JkID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4oTkQpOworICBpZiAoIVJlY29yZCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIFJlY29yZC0+aXNMYW1iZGEoKTsKK30KKwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIFVua25vd25Bcml0eSA9IH4wVTsKIAogY2xhc3MgSXRhbml1bU1hbmdsZUNvbnRleHRJbXBsIDogcHVibGljIEl0YW5pdW1NYW5nbGVDb250ZXh0IHsKLSAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgVGFnRGVjbCAqLCB1aW50NjRfdD4gQW5vblN0cnVjdElkczsKICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgRGVjbENvbnRleHQqLCBJZGVudGlmaWVySW5mbyo+IERpc2NyaW1pbmF0b3JLZXlUeTsKICAgbGx2bTo6RGVuc2VNYXA8RGlzY3JpbWluYXRvcktleVR5LCB1bnNpZ25lZD4gRGlzY3JpbWluYXRvcjsKICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgTmFtZWREZWNsKiwgdW5zaWduZWQ+IFVuaXF1aWZpZXI7CkBAIC0xMTUsNTIgKzEyMyw0NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKQogICAgICAgOiBJdGFuaXVtTWFuZ2xlQ29udGV4dChDb250ZXh0LCBEaWFncykge30KIAotICB1aW50NjRfdCBnZXRBbm9ueW1vdXNTdHJ1Y3RJZChjb25zdCBUYWdEZWNsICpURCkgewotICAgIHN0ZDo6cGFpcjxsbHZtOjpEZW5zZU1hcDxjb25zdCBUYWdEZWNsICosCi0gICAgICB1aW50NjRfdD46Oml0ZXJhdG9yLCBib29sPiBSZXN1bHQgPQotICAgICAgQW5vblN0cnVjdElkcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoVEQsIEFub25TdHJ1Y3RJZHMuc2l6ZSgpKSk7Ci0gICAgcmV0dXJuIFJlc3VsdC5maXJzdC0+c2Vjb25kOwotICB9Ci0KICAgLy8vIEBuYW1lIE1hbmdsZXIgRW50cnkgUG9pbnRzCiAgIC8vLyBAewogCi0gIGJvb2wgc2hvdWxkTWFuZ2xlQ1hYTmFtZShjb25zdCBOYW1lZERlY2wgKkQpOwotICB2b2lkIG1hbmdsZUNYWE5hbWUoY29uc3QgTmFtZWREZWNsICpELCByYXdfb3N0cmVhbSAmKTsKLSAgdm9pZCBtYW5nbGVUaHVuayhjb25zdCBDWFhNZXRob2REZWNsICpNRCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBUaHVua0luZm8gJlRodW5rLAotICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpOworICBib29sIHNob3VsZE1hbmdsZUNYWE5hbWUoY29uc3QgTmFtZWREZWNsICpEKSBvdmVycmlkZTsKKyAgYm9vbCBzaG91bGRNYW5nbGVTdHJpbmdMaXRlcmFsKGNvbnN0IFN0cmluZ0xpdGVyYWwgKikgb3ZlcnJpZGUgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB2b2lkIG1hbmdsZUNYWE5hbWUoY29uc3QgTmFtZWREZWNsICpELCByYXdfb3N0cmVhbSAmKSBvdmVycmlkZTsKKyAgdm9pZCBtYW5nbGVUaHVuayhjb25zdCBDWFhNZXRob2REZWNsICpNRCwgY29uc3QgVGh1bmtJbmZvICZUaHVuaywKKyAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmKSBvdmVycmlkZTsKICAgdm9pZCBtYW5nbGVDWFhEdG9yVGh1bmsoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkRELCBDWFhEdG9yVHlwZSBUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaGlzQWRqdXN0bWVudCAmVGhpc0FkanVzdG1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpOwotICB2b2lkIG1hbmdsZVJlZmVyZW5jZVRlbXBvcmFyeShjb25zdCBWYXJEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmKTsKLSAgdm9pZCBtYW5nbGVDWFhWVGFibGUoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsCi0gICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpOwotICB2b2lkIG1hbmdsZUNYWFZUVChjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKLSAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZVJlZmVyZW5jZVRlbXBvcmFyeShjb25zdCBWYXJEZWNsICpELCByYXdfb3N0cmVhbSAmKSBvdmVycmlkZTsKKyAgdm9pZCBtYW5nbGVDWFhWVGFibGUoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZUNYWFZUVChjb25zdCBDWFhSZWNvcmREZWNsICpSRCwgcmF3X29zdHJlYW0gJikgb3ZlcnJpZGU7CiAgIHZvaWQgbWFuZ2xlQ1hYQ3RvclZUYWJsZShjb25zdCBDWFhSZWNvcmREZWNsICpSRCwgaW50NjRfdCBPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJik7Ci0gIHZvaWQgbWFuZ2xlQ1hYUlRUSShRdWFsVHlwZSBULCByYXdfb3N0cmVhbSAmKTsKLSAgdm9pZCBtYW5nbGVDWFhSVFRJTmFtZShRdWFsVHlwZSBULCByYXdfb3N0cmVhbSAmKTsKLSAgdm9pZCBtYW5nbGVUeXBlTmFtZShRdWFsVHlwZSBULCByYXdfb3N0cmVhbSAmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlR5cGUsIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZUNYWFJUVEkoUXVhbFR5cGUgVCwgcmF3X29zdHJlYW0gJikgb3ZlcnJpZGU7CisgIHZvaWQgbWFuZ2xlQ1hYUlRUSU5hbWUoUXVhbFR5cGUgVCwgcmF3X29zdHJlYW0gJikgb3ZlcnJpZGU7CisgIHZvaWQgbWFuZ2xlVHlwZU5hbWUoUXVhbFR5cGUgVCwgcmF3X29zdHJlYW0gJikgb3ZlcnJpZGU7CiAgIHZvaWQgbWFuZ2xlQ1hYQ3Rvcihjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsIENYWEN0b3JUeXBlIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmKTsKKyAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOwogICB2b2lkIG1hbmdsZUNYWER0b3IoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkQsIENYWER0b3JUeXBlIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmKTsKKyAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOwogCi0gIHZvaWQgbWFuZ2xlU3RhdGljR3VhcmRWYXJpYWJsZShjb25zdCBWYXJEZWNsICpELCByYXdfb3N0cmVhbSAmKTsKLSAgdm9pZCBtYW5nbGVEeW5hbWljSW5pdGlhbGl6ZXIoY29uc3QgVmFyRGVjbCAqRCwgcmF3X29zdHJlYW0gJk91dCk7Ci0gIHZvaWQgbWFuZ2xlRHluYW1pY0F0RXhpdERlc3RydWN0b3IoY29uc3QgVmFyRGVjbCAqRCwgcmF3X29zdHJlYW0gJk91dCk7Ci0gIHZvaWQgbWFuZ2xlSXRhbml1bVRocmVhZExvY2FsSW5pdChjb25zdCBWYXJEZWNsICpELCByYXdfb3N0cmVhbSAmKTsKLSAgdm9pZCBtYW5nbGVJdGFuaXVtVGhyZWFkTG9jYWxXcmFwcGVyKGNvbnN0IFZhckRlY2wgKkQsIHJhd19vc3RyZWFtICYpOworICB2b2lkIG1hbmdsZVN0YXRpY0d1YXJkVmFyaWFibGUoY29uc3QgVmFyRGVjbCAqRCwgcmF3X29zdHJlYW0gJikgb3ZlcnJpZGU7CisgIHZvaWQgbWFuZ2xlRHluYW1pY0luaXRpYWxpemVyKGNvbnN0IFZhckRlY2wgKkQsIHJhd19vc3RyZWFtICZPdXQpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZUR5bmFtaWNBdEV4aXREZXN0cnVjdG9yKGNvbnN0IFZhckRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCkgb3ZlcnJpZGU7CisgIHZvaWQgbWFuZ2xlSXRhbml1bVRocmVhZExvY2FsSW5pdChjb25zdCBWYXJEZWNsICpELCByYXdfb3N0cmVhbSAmKSBvdmVycmlkZTsKKyAgdm9pZCBtYW5nbGVJdGFuaXVtVGhyZWFkTG9jYWxXcmFwcGVyKGNvbnN0IFZhckRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmKSBvdmVycmlkZTsKKworICB2b2lkIG1hbmdsZVN0cmluZ0xpdGVyYWwoY29uc3QgU3RyaW5nTGl0ZXJhbCAqLCByYXdfb3N0cmVhbSAmKSBvdmVycmlkZTsKIAogICBib29sIGdldE5leHREaXNjcmltaW5hdG9yKGNvbnN0IE5hbWVkRGVjbCAqTkQsIHVuc2lnbmVkICZkaXNjKSB7CiAgICAgLy8gTGFtYmRhIGNsb3N1cmUgdHlwZXMgYXJlIGFscmVhZHkgbnVtYmVyZWQuCi0gICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4oTkQpKQotICAgICAgaWYgKFJELT5pc0xhbWJkYSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGlzTGFtYmRhKE5EKSkKKyAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIC8vIEFub255bW91cyB0YWdzIGFyZSBhbHJlYWR5IG51bWJlcmVkLgogICAgIGlmIChjb25zdCBUYWdEZWNsICpUYWcgPSBkeW5fY2FzdDxUYWdEZWNsPihORCkpIHsKQEAgLTUzOCwxNCArNTQwLDYgQEAKICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBib29sIGlzTGFtYmRhKGNvbnN0IE5hbWVkRGVjbCAqTkQpIHsKLSAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUmVjb3JkID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4oTkQpOwotICBpZiAoIVJlY29yZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICByZXR1cm4gUmVjb3JkLT5pc0xhbWJkYSgpOwotfQotCiB2b2lkIENYWE5hbWVNYW5nbGVyOjptYW5nbGVOYW1lKGNvbnN0IE5hbWVkRGVjbCAqTkQpIHsKICAgLy8gIDxuYW1lPiA6Oj0gPG5lc3RlZC1uYW1lPgogICAvLyAgICAgICAgIDo6PSA8dW5zY29wZWQtbmFtZT4KQEAgLTgzMyw2ICs4MjcsNyBAQAogICAgIHN3aXRjaCAodHlwZS0+Z2V0VHlwZUNsYXNzKCkpIHsKICAgICBjYXNlIFR5cGU6OkJ1aWx0aW46CiAgICAgY2FzZSBUeXBlOjpDb21wbGV4OgorICAgIGNhc2UgVHlwZTo6QWRqdXN0ZWQ6CiAgICAgY2FzZSBUeXBlOjpEZWNheWVkOgogICAgIGNhc2UgVHlwZTo6UG9pbnRlcjoKICAgICBjYXNlIFR5cGU6OkJsb2NrUG9pbnRlcjoKQEAgLTEwMzIsMTAgKzEwMjcsOSBAQAogICBhc3NlcnQoUkQtPmlzQW5vbnltb3VzU3RydWN0T3JVbmlvbigpICYmCiAgICAgICAgICAiRXhwZWN0ZWQgYW5vbnltb3VzIHN0cnVjdCBvciB1bmlvbiEiKTsKICAgCi0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgSSA9IFJELT5maWVsZF9iZWdpbigpLCBFID0gUkQtPmZpZWxkX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7CisgIGZvciAoY29uc3QgYXV0byAqSSA6IFJELT5maWVsZHMoKSkgewogICAgIGlmIChJLT5nZXRJZGVudGlmaWVyKCkpCi0gICAgICByZXR1cm4gKkk7CisgICAgICByZXR1cm4gSTsKICAgICAKICAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBJLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCkpCiAgICAgICBpZiAoY29uc3QgRmllbGREZWNsICpOYW1lZERhdGFNZW1iZXIgPSAKQEAgLTExNDgsNyArMTE0Miw3IEBACiAgICAgfQogCiAgICAgLy8gR2V0IGEgdW5pcXVlIGlkIGZvciB0aGUgYW5vbnltb3VzIHN0cnVjdC4KLSAgICB1aW50NjRfdCBBbm9uU3RydWN0SWQgPSBDb250ZXh0LmdldEFub255bW91c1N0cnVjdElkKFREKTsKKyAgICB1bnNpZ25lZCBBbm9uU3RydWN0SWQgPSBDb250ZXh0LmdldEFub255bW91c1N0cnVjdElkKFREKTsKIAogICAgIC8vIE1hbmdsZSBpdCBhcyBhIHNvdXJjZSBuYW1lIGluIHRoZSBmb3JtCiAgICAgLy8gW25dICRfPGlkPgpAQCAtMTkxOSw3ICsxOTEzLDcgQEAKICAgLy8gICAgICAgICAgICAgICAgIDo6PSB4ICAjIGxvbmcgbG9uZywgX19pbnQ2NAogICAvLyAgICAgICAgICAgICAgICAgOjo9IHkgICMgdW5zaWduZWQgbG9uZyBsb25nLCBfX2ludDY0CiAgIC8vICAgICAgICAgICAgICAgICA6Oj0gbiAgIyBfX2ludDEyOAotICAvLyBVTlNVUFBPUlRFRDogICAgOjo9IG8gICMgdW5zaWduZWQgX19pbnQxMjgKKyAgLy8gICAgICAgICAgICAgICAgIDo6PSBvICAjIHVuc2lnbmVkIF9faW50MTI4CiAgIC8vICAgICAgICAgICAgICAgICA6Oj0gZiAgIyBmbG9hdAogICAvLyAgICAgICAgICAgICAgICAgOjo9IGQgICMgZG91YmxlCiAgIC8vICAgICAgICAgICAgICAgICA6Oj0gZSAgIyBsb25nIGRvdWJsZSwgX19mbG9hdDgwCkBAIC0yMDEyLDExICsyMDA2LDExIEBACiAgIC8vIDxiYXJlLWZ1bmN0aW9uLXR5cGU+IDo6PSA8c2lnbmF0dXJlIHR5cGU+KwogICBpZiAoTWFuZ2xlUmV0dXJuVHlwZSkgewogICAgIEZ1bmN0aW9uVHlwZURlcHRoLmVudGVyUmVzdWx0VHlwZSgpOwotICAgIG1hbmdsZVR5cGUoUHJvdG8tPmdldFJlc3VsdFR5cGUoKSk7CisgICAgbWFuZ2xlVHlwZShQcm90by0+Z2V0UmV0dXJuVHlwZSgpKTsKICAgICBGdW5jdGlvblR5cGVEZXB0aC5sZWF2ZVJlc3VsdFR5cGUoKTsKICAgfQogCi0gIGlmIChQcm90by0+Z2V0TnVtQXJncygpID09IDAgJiYgIVByb3RvLT5pc1ZhcmlhZGljKCkpIHsKKyAgaWYgKFByb3RvLT5nZXROdW1QYXJhbXMoKSA9PSAwICYmICFQcm90by0+aXNWYXJpYWRpYygpKSB7CiAgICAgLy8gICA8YnVpbHRpbi10eXBlPiA6Oj0gdiAgICMgdm9pZAogICAgIE91dCA8PCAndic7CiAKQEAgLTIwMjQsMTAgKzIwMTgsOCBAQAogICAgIHJldHVybjsKICAgfQogCi0gIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yIEFyZyA9IFByb3RvLT5hcmdfdHlwZV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdFbmQgPSBQcm90by0+YXJnX3R5cGVfZW5kKCk7Ci0gICAgICAgQXJnICE9IEFyZ0VuZDsgKytBcmcpCi0gICAgbWFuZ2xlVHlwZShDb250ZXh0LmdldEFTVENvbnRleHQoKS5nZXRTaWduYXR1cmVQYXJhbWV0ZXJUeXBlKCpBcmcpKTsKKyAgZm9yIChjb25zdCBhdXRvICZBcmcgOiBQcm90by0+cGFyYW1fdHlwZXMoKSkKKyAgICBtYW5nbGVUeXBlKENvbnRleHQuZ2V0QVNUQ29udGV4dCgpLmdldFNpZ25hdHVyZVBhcmFtZXRlclR5cGUoQXJnKSk7CiAKICAgRnVuY3Rpb25UeXBlRGVwdGgucG9wKHNhdmVkKTsKIApAQCAtMjE2MSw4ICsyMTUzLDE3IEBACiAgIGNvbnN0IGNoYXIgKkVsdE5hbWUgPSAwOwogICBpZiAoVC0+Z2V0VmVjdG9yS2luZCgpID09IFZlY3RvclR5cGU6Ok5lb25Qb2x5VmVjdG9yKSB7CiAgICAgc3dpdGNoIChjYXN0PEJ1aWx0aW5UeXBlPihFbHRUeXBlKS0+Z2V0S2luZCgpKSB7Ci0gICAgY2FzZSBCdWlsdGluVHlwZTo6U0NoYXI6ICAgICBFbHROYW1lID0gInBvbHk4X3QiOyBicmVhazsKLSAgICBjYXNlIEJ1aWx0aW5UeXBlOjpTaG9ydDogICAgIEVsdE5hbWUgPSAicG9seTE2X3QiOyBicmVhazsKKyAgICBjYXNlIEJ1aWx0aW5UeXBlOjpTQ2hhcjoKKyAgICBjYXNlIEJ1aWx0aW5UeXBlOjpVQ2hhcjoKKyAgICAgIEVsdE5hbWUgPSAicG9seThfdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJ1aWx0aW5UeXBlOjpTaG9ydDoKKyAgICBjYXNlIEJ1aWx0aW5UeXBlOjpVU2hvcnQ6CisgICAgICBFbHROYW1lID0gInBvbHkxNl90IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQnVpbHRpblR5cGU6OlVMb25nTG9uZzoKKyAgICAgIEVsdE5hbWUgPSAicG9seTY0X3QiOworICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgidW5leHBlY3RlZCBOZW9uIHBvbHlub21pYWwgdmVjdG9yIGVsZW1lbnQgdHlwZSIpOwogICAgIH0KICAgfSBlbHNlIHsKQEAgLTIxNzUsNiArMjE3Niw3IEBACiAgICAgY2FzZSBCdWlsdGluVHlwZTo6VUludDogICAgICBFbHROYW1lID0gInVpbnQzMl90IjsgYnJlYWs7CiAgICAgY2FzZSBCdWlsdGluVHlwZTo6TG9uZ0xvbmc6ICBFbHROYW1lID0gImludDY0X3QiOyBicmVhazsKICAgICBjYXNlIEJ1aWx0aW5UeXBlOjpVTG9uZ0xvbmc6IEVsdE5hbWUgPSAidWludDY0X3QiOyBicmVhazsKKyAgICBjYXNlIEJ1aWx0aW5UeXBlOjpEb3VibGU6ICAgIEVsdE5hbWUgPSAiZmxvYXQ2NF90IjsgYnJlYWs7CiAgICAgY2FzZSBCdWlsdGluVHlwZTo6RmxvYXQ6ICAgICBFbHROYW1lID0gImZsb2F0MzJfdCI7IGJyZWFrOwogICAgIGNhc2UgQnVpbHRpblR5cGU6OkhhbGY6ICAgICAgRWx0TmFtZSA9ICJmbG9hdDE2X3QiO2JyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC0yMjAyLDYgKzIyMDQsNyBAQAogICAgIHJldHVybiAiSW50MTYiOwogICBjYXNlIEJ1aWx0aW5UeXBlOjpJbnQ6CiAgICAgcmV0dXJuICJJbnQzMiI7CisgIGNhc2UgQnVpbHRpblR5cGU6Okxvbmc6CiAgIGNhc2UgQnVpbHRpblR5cGU6OkxvbmdMb25nOgogICAgIHJldHVybiAiSW50NjQiOwogICBjYXNlIEJ1aWx0aW5UeXBlOjpVQ2hhcjoKQEAgLTIyMTAsNiArMjIxMyw3IEBACiAgICAgcmV0dXJuICJVaW50MTYiOwogICBjYXNlIEJ1aWx0aW5UeXBlOjpVSW50OgogICAgIHJldHVybiAiVWludDMyIjsKKyAgY2FzZSBCdWlsdGluVHlwZTo6VUxvbmc6CiAgIGNhc2UgQnVpbHRpblR5cGU6OlVMb25nTG9uZzoKICAgICByZXR1cm4gIlVpbnQ2NCI7CiAgIGNhc2UgQnVpbHRpblR5cGU6OkhhbGY6CkBAIC0yMjQ1LDcgKzIyNDksNyBAQAogICAgIGNhc2UgQnVpbHRpblR5cGU6OlVTaG9ydDoKICAgICAgIEVsdE5hbWUgPSAiUG9seTE2IjsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgQnVpbHRpblR5cGU6OlVMb25nTG9uZzoKKyAgICBjYXNlIEJ1aWx0aW5UeXBlOjpVTG9uZzoKICAgICAgIEVsdE5hbWUgPSAiUG9seTY0IjsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC0yMjcwLDggKzIyNzQsMTIgQEAKIHZvaWQgQ1hYTmFtZU1hbmdsZXI6Om1hbmdsZVR5cGUoY29uc3QgVmVjdG9yVHlwZSAqVCkgewogICBpZiAoKFQtPmdldFZlY3RvcktpbmQoKSA9PSBWZWN0b3JUeXBlOjpOZW9uVmVjdG9yIHx8CiAgICAgICAgVC0+Z2V0VmVjdG9yS2luZCgpID09IFZlY3RvclR5cGU6Ok5lb25Qb2x5VmVjdG9yKSkgewotICAgIGlmIChnZXRBU1RDb250ZXh0KCkuZ2V0VGFyZ2V0SW5mbygpLmdldFRyaXBsZSgpLmdldEFyY2goKSA9PQotICAgICAgICBsbHZtOjpUcmlwbGU6OmFhcmNoNjQpCisgICAgbGx2bTo6VHJpcGxlIFRhcmdldCA9IGdldEFTVENvbnRleHQoKS5nZXRUYXJnZXRJbmZvKCkuZ2V0VHJpcGxlKCk7CisgICAgbGx2bTo6VHJpcGxlOjpBcmNoVHlwZSBBcmNoID0KKyAgICAgICAgZ2V0QVNUQ29udGV4dCgpLmdldFRhcmdldEluZm8oKS5nZXRUcmlwbGUoKS5nZXRBcmNoKCk7CisgICAgaWYgKEFyY2ggPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0IHx8CisgICAgICAgIEFyY2ggPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0X2JlIHx8CisgICAgICAgIChBcmNoID09IGxsdm06OlRyaXBsZTo6YXJtNjQgJiYgIVRhcmdldC5pc09TRGFyd2luKCkpKQogICAgICAgbWFuZ2xlQUFyY2g2NE5lb25WZWN0b3JUeXBlKFQpOwogICAgIGVsc2UKICAgICAgIG1hbmdsZU5lb25WZWN0b3JUeXBlKFQpOwpAQCAtMjMxMSw5ICsyMzE5LDggQEAKICAgICBTbWFsbFN0cmluZzw2ND4gUXVhbFN0cjsKICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIFF1YWxPUyhRdWFsU3RyKTsKICAgICBRdWFsT1MgPDwgIm9iamNwcm90byI7Ci0gICAgT2JqQ09iamVjdFR5cGU6OnF1YWxfaXRlcmF0b3IgaSA9IFQtPnF1YWxfYmVnaW4oKSwgZSA9IFQtPnF1YWxfZW5kKCk7Ci0gICAgZm9yICggOyBpICE9IGU7ICsraSkgewotICAgICAgU3RyaW5nUmVmIG5hbWUgPSAoKmkpLT5nZXROYW1lKCk7CisgICAgZm9yIChjb25zdCBhdXRvICpJIDogVC0+cXVhbHMoKSkgeworICAgICAgU3RyaW5nUmVmIG5hbWUgPSBJLT5nZXROYW1lKCk7CiAgICAgICBRdWFsT1MgPDwgbmFtZS5zaXplKCkgPDwgbmFtZTsKICAgICB9CiAgICAgUXVhbE9TLmZsdXNoKCk7CkBAIC0yNDM4LDcgKzI0NDUsNyBAQAogfQogCiB2b2lkIENYWE5hbWVNYW5nbGVyOjptYW5nbGVUeXBlKGNvbnN0IEF0b21pY1R5cGUgKlQpIHsKLSAgLy8gPHR5cGU+IDo6PSBVIDxzb3VyY2UtbmFtZT4gPHR5cGU+CSMgdmVuZG9yIGV4dGVuZGVkIHR5cGUgcXVhbGlmaWVyCisgIC8vIDx0eXBlPiA6Oj0gVSA8c291cmNlLW5hbWU+IDx0eXBlPiAgIyB2ZW5kb3IgZXh0ZW5kZWQgdHlwZSBxdWFsaWZpZXIKICAgLy8gKFVudGlsIHRoZXJlJ3MgYSBzdGFuZGFyZGl6ZWQgbWFuZ2xpbmcuLi4pCiAgIE91dCA8PCAiVTdfQXRvbWljIjsKICAgbWFuZ2xlVHlwZShULT5nZXRWYWx1ZVR5cGUoKSk7CkBAIC0yNTgxLDggKzI1ODgsNiBAQAogICBjYXNlIEV4cHI6OlNodWZmbGVWZWN0b3JFeHByQ2xhc3M6CiAgIGNhc2UgRXhwcjo6Q29udmVydFZlY3RvckV4cHJDbGFzczoKICAgY2FzZSBFeHByOjpTdG10RXhwckNsYXNzOgotICBjYXNlIEV4cHI6OlVuYXJ5VHlwZVRyYWl0RXhwckNsYXNzOgotICBjYXNlIEV4cHI6OkJpbmFyeVR5cGVUcmFpdEV4cHJDbGFzczoKICAgY2FzZSBFeHByOjpUeXBlVHJhaXRFeHByQ2xhc3M6CiAgIGNhc2UgRXhwcjo6QXJyYXlUeXBlVHJhaXRFeHByQ2xhc3M6CiAgIGNhc2UgRXhwcjo6RXhwcmVzc2lvblRyYWl0RXhwckNsYXNzOgpAQCAtMzc4OSw2ICszNzk0LDEwIEBACiAgIG1hbmdsZUNYWFJUVElOYW1lKFR5LCBPdXQpOwogfQogCit2b2lkIEl0YW5pdW1NYW5nbGVDb250ZXh0SW1wbDo6bWFuZ2xlU3RyaW5nTGl0ZXJhbChjb25zdCBTdHJpbmdMaXRlcmFsICosIHJhd19vc3RyZWFtICYpIHsKKyAgbGx2bV91bnJlYWNoYWJsZSgiQ2FuJ3QgbWFuZ2xlIHN0cmluZyBsaXRlcmFscyIpOworfQorCiBJdGFuaXVtTWFuZ2xlQ29udGV4dCAqCiBJdGFuaXVtTWFuZ2xlQ29udGV4dDo6Y3JlYXRlKEFTVENvbnRleHQgJkNvbnRleHQsIERpYWdub3N0aWNzRW5naW5lICZEaWFncykgewogICByZXR1cm4gbmV3IEl0YW5pdW1NYW5nbGVDb250ZXh0SW1wbChDb250ZXh0LCBEaWFncyk7CmRpZmYgLS1naXQgYS9saWIvQVNUL01hbmdsZS5jcHAgYi9saWIvQVNUL01hbmdsZS5jcHAKaW5kZXggMjMxZWYwMy4uZmRjMDBlMyAxMDA2NDQKLS0tIGEvbGliL0FTVC9NYW5nbGUuY3BwCisrKyBiL2xpYi9BU1QvTWFuZ2xlLmNwcApAQCAtMTEsMTMgKzExLDEzIEBACiAvLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KICNpbmNsdWRlICJjbGFuZy9BU1QvQXR0ci5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9NYW5nbGUuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbE9iakMuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvTWFuZ2xlLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQUJJLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1RhcmdldEluZm8uaCIKQEAgLTY0LDcgKzY0LDcgQEAKIHN0YXRpYyBTdGRPckZhc3RDQyBnZXRTdGRPckZhc3RDYWxsTWFuZ2xpbmcoY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZWREZWNsICpORCkgewogICBjb25zdCBUYXJnZXRJbmZvICZUSSA9IENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpOwotICBsbHZtOjpUcmlwbGUgVHJpcGxlID0gVEkuZ2V0VHJpcGxlKCk7CisgIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlID0gVEkuZ2V0VHJpcGxlKCk7CiAgIGlmICghVHJpcGxlLmlzT1NXaW5kb3dzKCkgfHwgVHJpcGxlLmdldEFyY2goKSAhPSBsbHZtOjpUcmlwbGU6Ong4NikKICAgICByZXR1cm4gU09GX09USEVSOwogCkBAIC0xNjMsMTMgKzE2Myw5IEBACiAgIGlmIChjb25zdCBDWFhNZXRob2REZWNsICpNRCA9IGR5bl9jYXN0PENYWE1ldGhvZERlY2w+KEZEKSkKICAgICBpZiAoIU1ELT5pc1N0YXRpYygpKQogICAgICAgKytBcmdXb3JkczsKLSAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6YXJnX3R5cGVfaXRlcmF0b3IgQXJnID0gUHJvdG8tPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgICBBcmdFbmQgPSBQcm90by0+YXJnX3R5cGVfZW5kKCk7Ci0gICAgICAgQXJnICE9IEFyZ0VuZDsgKytBcmcpIHsKLSAgICBRdWFsVHlwZSBBVCA9ICpBcmc7CisgIGZvciAoY29uc3QgYXV0byAmQVQgOiBQcm90by0+cGFyYW1fdHlwZXMoKSkKICAgICAvLyBTaXplIHNob3VsZCBiZSBhbGlnbmVkIHRvIERXT1JEIGJvdW5kYXJ5CiAgICAgQXJnV29yZHMgKz0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KEFTVENvbnRleHQuZ2V0VHlwZVNpemUoQVQpLCAzMikgLyAzMjsKLSAgfQogICBPdXQgPDwgNCAqIEFyZ1dvcmRzOwogfQogCkBAIC0yNDYsNyArMjQyLDkgQEAKICAgT1MgPDwgKE1ELT5pc0luc3RhbmNlTWV0aG9kKCkgPyAnLScgOiAnKycpIDw8ICdbJyA8PCBDRC0+Z2V0TmFtZSgpOwogICBpZiAoY29uc3QgT2JqQ0NhdGVnb3J5SW1wbERlY2wgKkNJRCA9IGR5bl9jYXN0PE9iakNDYXRlZ29yeUltcGxEZWNsPihDRCkpCiAgICAgT1MgPDwgJygnIDw8ICpDSUQgPDwgJyknOwotICBPUyA8PCAnICcgPDwgTUQtPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKSA8PCAnXSc7CisgIE9TIDw8ICcgJzsKKyAgTUQtPmdldFNlbGVjdG9yKCkucHJpbnQoT1MpOworICBPUyA8PCAnXSc7CiAgIAogICBPdXQgPDwgT1Muc3RyKCkuc2l6ZSgpIDw8IE9TLnN0cigpOwogfQpkaWZmIC0tZ2l0IGEvbGliL0FTVC9NYW5nbGVOdW1iZXJpbmdDb250ZXh0LmNwcCBiL2xpYi9BU1QvTWFuZ2xlTnVtYmVyaW5nQ29udGV4dC5jcHAKaW5kZXggOTFlZjBlMi4uYjQ2YTA4NSAxMDA2NDQKLS0tIGEvbGliL0FTVC9NYW5nbGVOdW1iZXJpbmdDb250ZXh0LmNwcAorKysgYi9saWIvQVNUL01hbmdsZU51bWJlcmluZ0NvbnRleHQuY3BwCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgPSBDYWxsT3BlcmF0b3ItPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CiAgIEFTVENvbnRleHQgJkNvbnRleHQgPSBDYWxsT3BlcmF0b3ItPmdldEFTVENvbnRleHQoKTsKIAotICBRdWFsVHlwZSBLZXkgPSBDb250ZXh0LmdldEZ1bmN0aW9uVHlwZShDb250ZXh0LlZvaWRUeSwgUHJvdG8tPmdldEFyZ1R5cGVzKCksCisgIFF1YWxUeXBlIEtleSA9IENvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKENvbnRleHQuVm9pZFR5LCBQcm90by0+Z2V0UGFyYW1UeXBlcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblByb3RvVHlwZTo6RXh0UHJvdG9JbmZvKCkpOwogICBLZXkgPSBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoS2V5KTsKICAgcmV0dXJuICsrTWFuZ2xpbmdOdW1iZXJzW0tleS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpXTsKQEAgLTM4LDYgKzM4LDggQEAKIH0KIAogdW5zaWduZWQKLU1hbmdsZU51bWJlcmluZ0NvbnRleHQ6OmdldE1hbmdsaW5nTnVtYmVyKGNvbnN0IFRhZ0RlY2wgKlREKSB7Ci0gIHJldHVybiArK1RhZ01hbmdsaW5nTnVtYmVyc1tURC0+Z2V0SWRlbnRpZmllcigpXTsKK01hbmdsZU51bWJlcmluZ0NvbnRleHQ6OmdldFN0YXRpY0xvY2FsTnVtYmVyKGNvbnN0IFZhckRlY2wgKlZEKSB7CisgIC8vIEZJWE1FOiBDb21wdXRlIGEgQmxvY2tQb2ludGVyVHlwZT8gIE5vdCBvYnZpb3VzIGhvdy4KKyAgY29uc3QgVHlwZSAqVHkgPSAwOworICByZXR1cm4gKytNYW5nbGluZ051bWJlcnNbVHldOwogfQpkaWZmIC0tZ2l0IGEvbGliL0FTVC9NaWNyb3NvZnRDWFhBQkkuY3BwIGIvbGliL0FTVC9NaWNyb3NvZnRDWFhBQkkuY3BwCmluZGV4IDRhOTNlYTEuLjM1OWU4NjQgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvTWljcm9zb2Z0Q1hYQUJJLmNwcAorKysgYi9saWIvQVNUL01pY3Jvc29mdENYWEFCSS5jcHAKQEAgLTEzLDggKzEzLDggQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJDWFhBQkkuaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvQXR0ci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0F0dHIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9NYW5nbGVOdW1iZXJpbmdDb250ZXh0LmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL1JlY29yZExheW91dC5oIgpAQCAtMjgsMTUgKzI4LDE1IEBACiAvLy8gXGJyaWVmIE51bWJlcnMgdGhpbmdzIHdoaWNoIG5lZWQgdG8gY29ycmVzcG9uZCBhY3Jvc3MgbXVsdGlwbGUgVFVzLgogLy8vIFR5cGljYWxseSB0aGVzZSBhcmUgdGhpbmdzIGxpa2Ugc3RhdGljIGxvY2FscywgbGFtYmRhcywgb3IgYmxvY2tzLgogY2xhc3MgTWljcm9zb2Z0TnVtYmVyaW5nQ29udGV4dCA6IHB1YmxpYyBNYW5nbGVOdW1iZXJpbmdDb250ZXh0IHsKLSAgdW5zaWduZWQgTnVtU3RhdGljTG9jYWxzOwotCiBwdWJsaWM6Ci0gIE1pY3Jvc29mdE51bWJlcmluZ0NvbnRleHQoKSA6IE51bVN0YXRpY0xvY2FscygwKSB7IH0KKyAgdW5zaWduZWQgZ2V0TWFuZ2xpbmdOdW1iZXIoY29uc3QgVmFyRGVjbCAqVkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1TTG9jYWxNYW5nbGluZ051bWJlcikgb3ZlcnJpZGUgeworICAgIHJldHVybiBNU0xvY2FsTWFuZ2xpbmdOdW1iZXI7CisgIH0KIAotICAvLy8gU3RhdGljIGxvY2FscyBhcmUgbnVtYmVyZWQgYnkgc291cmNlIG9yZGVyLgotICB2aXJ0dWFsIHVuc2lnbmVkIGdldE1hbmdsaW5nTnVtYmVyKGNvbnN0IFZhckRlY2wgKlZEKSB7Ci0gICAgYXNzZXJ0KFZELT5pc1N0YXRpY0xvY2FsKCkpOwotICAgIHJldHVybiArK051bVN0YXRpY0xvY2FsczsKKyAgdW5zaWduZWQgZ2V0TWFuZ2xpbmdOdW1iZXIoY29uc3QgVGFnRGVjbCAqVEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1TTG9jYWxNYW5nbGluZ051bWJlcikgb3ZlcnJpZGUgeworICAgIHJldHVybiBNU0xvY2FsTWFuZ2xpbmdOdW1iZXI7CiAgIH0KIH07CiAKQEAgLTQ2LDE2ICs0NiwxNiBAQAogICBNaWNyb3NvZnRDWFhBQkkoQVNUQ29udGV4dCAmQ3R4KSA6IENvbnRleHQoQ3R4KSB7IH0KIAogICBzdGQ6OnBhaXI8dWludDY0X3QsIHVuc2lnbmVkPgotICBnZXRNZW1iZXJQb2ludGVyV2lkdGhBbmRBbGlnbihjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSBjb25zdDsKKyAgZ2V0TWVtYmVyUG9pbnRlcldpZHRoQW5kQWxpZ24oY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgQ2FsbGluZ0NvbnYgZ2V0RGVmYXVsdE1ldGhvZENhbGxDb252KGJvb2wgaXNWYXJpYWRpYykgY29uc3QgeworICBDYWxsaW5nQ29udiBnZXREZWZhdWx0TWV0aG9kQ2FsbENvbnYoYm9vbCBpc1ZhcmlhZGljKSBjb25zdCBvdmVycmlkZSB7CiAgICAgaWYgKCFpc1ZhcmlhZGljICYmCiAgICAgICAgIENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldFRyaXBsZSgpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NikKICAgICAgIHJldHVybiBDQ19YODZUaGlzQ2FsbDsKICAgICByZXR1cm4gQ0NfQzsKICAgfQogCi0gIGJvb2wgaXNOZWFybHlFbXB0eShjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgY29uc3QgeworICBib29sIGlzTmVhcmx5RW1wdHkoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBGSVhNRTogQXVkaXQgdGhlIGNvcm5lcnMKICAgICBpZiAoIVJELT5pc0R5bmFtaWNDbGFzcygpKQogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjksNyArNjksNyBAQAogICAgICAgTGF5b3V0LmdldE5vblZpcnR1YWxTaXplKCkgPT0gUG9pbnRlclNpemUgKiAyOwogICB9ICAgIAogCi0gIE1hbmdsZU51bWJlcmluZ0NvbnRleHQgKmNyZWF0ZU1hbmdsZU51bWJlcmluZ0NvbnRleHQoKSBjb25zdCB7CisgIE1hbmdsZU51bWJlcmluZ0NvbnRleHQgKmNyZWF0ZU1hbmdsZU51bWJlcmluZ0NvbnRleHQoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIG5ldyBNaWNyb3NvZnROdW1iZXJpbmdDb250ZXh0KCk7CiAgIH0KIH07CkBAIC05MiwyNiArOTIsMjcgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgTVNJbmhlcml0YW5jZU1vZGVsIE1TSW5oZXJpdGFuY2VBdHRyVG9Nb2RlbChhdHRyOjpLaW5kIEtpbmQpIHsKLSAgc3dpdGNoIChLaW5kKSB7Ci0gIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoImV4cGVjdGVkIE1TIGluaGVyaXRhbmNlIGF0dHJpYnV0ZSIpOwotICBjYXNlIGF0dHI6OlNpbmdsZUluaGVyaXRhbmNlOiAgICAgIHJldHVybiBNU0lNX1NpbmdsZTsKLSAgY2FzZSBhdHRyOjpNdWx0aXBsZUluaGVyaXRhbmNlOiAgICByZXR1cm4gTVNJTV9NdWx0aXBsZTsKLSAgY2FzZSBhdHRyOjpWaXJ0dWFsSW5oZXJpdGFuY2U6ICAgICByZXR1cm4gTVNJTV9WaXJ0dWFsOwotICBjYXNlIGF0dHI6OlVuc3BlY2lmaWVkSW5oZXJpdGFuY2U6IHJldHVybiBNU0lNX1Vuc3BlY2lmaWVkOwotICB9CitNU0luaGVyaXRhbmNlQXR0cjo6U3BlbGxpbmcgQ1hYUmVjb3JkRGVjbDo6Y2FsY3VsYXRlSW5oZXJpdGFuY2VNb2RlbCgpIGNvbnN0IHsKKyAgaWYgKCFoYXNEZWZpbml0aW9uKCkpCisgICAgcmV0dXJuIE1TSW5oZXJpdGFuY2VBdHRyOjpLZXl3b3JkX3Vuc3BlY2lmaWVkX2luaGVyaXRhbmNlOworICBpZiAoZ2V0TnVtVkJhc2VzKCkgPiAwKQorICAgIHJldHVybiBNU0luaGVyaXRhbmNlQXR0cjo6S2V5d29yZF92aXJ0dWFsX2luaGVyaXRhbmNlOworICBpZiAodXNlc011bHRpcGxlSW5oZXJpdGFuY2VNb2RlbCh0aGlzKSkKKyAgICByZXR1cm4gTVNJbmhlcml0YW5jZUF0dHI6OktleXdvcmRfbXVsdGlwbGVfaW5oZXJpdGFuY2U7CisgIHJldHVybiBNU0luaGVyaXRhbmNlQXR0cjo6S2V5d29yZF9zaW5nbGVfaW5oZXJpdGFuY2U7CiB9CiAKLU1TSW5oZXJpdGFuY2VNb2RlbCBDWFhSZWNvcmREZWNsOjpnZXRNU0luaGVyaXRhbmNlTW9kZWwoKSBjb25zdCB7Ci0gIGlmIChBdHRyICpJQSA9IHRoaXMtPmdldEF0dHI8TVNJbmhlcml0YW5jZUF0dHI+KCkpCi0gICAgcmV0dXJuIE1TSW5oZXJpdGFuY2VBdHRyVG9Nb2RlbChJQS0+Z2V0S2luZCgpKTsKLSAgLy8gSWYgdGhlcmUgd2FzIG5vIGV4cGxpY2l0IGF0dHJpYnV0ZSwgdGhlIHJlY29yZCBtdXN0IGJlIGRlZmluZWQgYWxyZWFkeSwgYW5kCi0gIC8vIHdlIGNhbiBmaWd1cmUgb3V0IHRoZSBpbmhlcml0YW5jZSBtb2RlbCBmcm9tIGl0cyBvdGhlciBwcm9wZXJ0aWVzLgotICBpZiAodGhpcy0+Z2V0TnVtVkJhc2VzKCkgPiAwKQotICAgIHJldHVybiBNU0lNX1ZpcnR1YWw7Ci0gIGlmICh1c2VzTXVsdGlwbGVJbmhlcml0YW5jZU1vZGVsKHRoaXMpKQotICAgIHJldHVybiB0aGlzLT5pc1BvbHltb3JwaGljKCkgPyBNU0lNX011bHRpcGxlUG9seW1vcnBoaWMgOiBNU0lNX011bHRpcGxlOwotICByZXR1cm4gdGhpcy0+aXNQb2x5bW9ycGhpYygpID8gTVNJTV9TaW5nbGVQb2x5bW9ycGhpYyA6IE1TSU1fU2luZ2xlOworTVNJbmhlcml0YW5jZUF0dHI6OlNwZWxsaW5nCitDWFhSZWNvcmREZWNsOjpnZXRNU0luaGVyaXRhbmNlTW9kZWwoKSBjb25zdCB7CisgIE1TSW5oZXJpdGFuY2VBdHRyICpJQSA9IGdldEF0dHI8TVNJbmhlcml0YW5jZUF0dHI+KCk7CisgIGFzc2VydChJQSAmJiAiRXhwZWN0ZWQgTVNJbmhlcml0YW5jZUF0dHIgb24gdGhlIENYWFJlY29yZERlY2whIik7CisgIHJldHVybiBJQS0+Z2V0U2VtYW50aWNTcGVsbGluZygpOworfQorCitNU1Z0b3JEaXNwQXR0cjo6TW9kZSBDWFhSZWNvcmREZWNsOjpnZXRNU1Z0b3JEaXNwTW9kZSgpIGNvbnN0IHsKKyAgaWYgKE1TVnRvckRpc3BBdHRyICpWREEgPSBnZXRBdHRyPE1TVnRvckRpc3BBdHRyPigpKQorICAgIHJldHVybiBWREEtPmdldFZ0b3JEaXNwTW9kZSgpOworICByZXR1cm4gTVNWdG9yRGlzcEF0dHI6Ok1vZGUoZ2V0QVNUQ29udGV4dCgpLmdldExhbmdPcHRzKCkuVnRvckRpc3BNb2RlKTsKIH0KIAogLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBvaW50ZXIgYW5kIGludGVnZXIgc2xvdHMgdXNlZCB0byByZXByZXNlbnQgYSBtZW1iZXIKQEAgLTEzMyw0OSArMTM0LDMyIEBACiAvLyAgICAgLy8gb2Zmc2V0LgogLy8gICAgIGludCBOb25WaXJ0dWFsQmFzZUFkanVzdG1lbnQ7CiAvLworLy8gICAgIC8vIFRoZSBvZmZzZXQgb2YgdGhlIHZiLXRhYmxlIHBvaW50ZXIgd2l0aGluIHRoZSBvYmplY3QuICBPbmx5IG5lZWRlZCBmb3IKKy8vICAgICAvLyBpbmNvbXBsZXRlIHR5cGVzLgorLy8gICAgIGludCBWQlB0ck9mZnNldDsKKy8vCiAvLyAgICAgLy8gQW4gb2Zmc2V0IHdpdGhpbiB0aGUgdmItdGFibGUgdGhhdCBzZWxlY3RzIHRoZSB2aXJ0dWFsIGJhc2UgY29udGFpbmluZwogLy8gICAgIC8vIHRoZSBtZW1iZXIuICBMb2FkaW5nIGZyb20gdGhpcyBvZmZzZXQgcHJvZHVjZXMgYSBuZXcgb2Zmc2V0IHRoYXQgaXMKIC8vICAgICAvLyBhZGRlZCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgdmItdGFibGUgcG9pbnRlciB0byBwcm9kdWNlIHRoZSBiYXNlLgogLy8gICAgIGludCBWaXJ0dWFsQmFzZUFkanVzdG1lbnRPZmZzZXQ7Ci0vLwotLy8gICAgIC8vIFRoZSBvZmZzZXQgb2YgdGhlIHZiLXRhYmxlIHBvaW50ZXIgd2l0aGluIHRoZSBvYmplY3QuICBPbmx5IG5lZWRlZCBmb3IKLS8vICAgICAvLyBpbmNvbXBsZXRlIHR5cGVzLgotLy8gICAgIGludCBWQlB0ck9mZnNldDsKIC8vICAgfTsKIHN0YXRpYyBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPgogZ2V0TVNNZW1iZXJQb2ludGVyU2xvdHMoY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCkgewotICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IE1QVC0+Z2V0Q2xhc3MoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7Ci0gIE1TSW5oZXJpdGFuY2VNb2RlbCBJbmhlcml0YW5jZSA9IFJELT5nZXRNU0luaGVyaXRhbmNlTW9kZWwoKTsKLSAgdW5zaWduZWQgUHRyczsKKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBNUFQtPmdldE1vc3RSZWNlbnRDWFhSZWNvcmREZWNsKCk7CisgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBJbmhlcml0YW5jZSA9IFJELT5nZXRNU0luaGVyaXRhbmNlTW9kZWwoKTsKKyAgdW5zaWduZWQgUHRycyA9IDA7CiAgIHVuc2lnbmVkIEludHMgPSAwOwotICBpZiAoTVBULT5pc01lbWJlckZ1bmN0aW9uUG9pbnRlcigpKSB7Ci0gICAgLy8gTWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBhIHN0cnVjdCBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIgZm9sbG93ZWQgYnkgYQotICAgIC8vIHZhcmlhYmxlIG51bWJlciBvZiBpbnRzIGRlcGVuZGluZyBvbiB0aGUgaW5oZXJpdGFuY2UgbW9kZWwgdXNlZC4gIFRoZQotICAgIC8vIGZ1bmN0aW9uIHBvaW50ZXIgaXMgYSByZWFsIGZ1bmN0aW9uIGlmIGl0IGlzIG5vbi12aXJ0dWFsIGFuZCBhIHZmdGFibGUKLSAgICAvLyBzbG90IHRodW5rIGlmIGl0IGlzIHZpcnR1YWwuICBUaGUgaW50cyBzZWxlY3QgdGhlIG9iamVjdCBiYXNlIHBhc3NlZCBmb3IKLSAgICAvLyB0aGUgJ3RoaXMnIHBvaW50ZXIuCi0gICAgUHRycyA9IDE7ICAvLyBGaXJzdCBzbG90IGlzIGFsd2F5cyBhIGZ1bmN0aW9uIHBvaW50ZXIuCi0gICAgc3dpdGNoIChJbmhlcml0YW5jZSkgewotICAgIGNhc2UgTVNJTV9VbnNwZWNpZmllZDogKytJbnRzOyAgLy8gVkJUYWJsZU9mZnNldAotICAgIGNhc2UgTVNJTV9WaXJ0dWFsOiAgICAgKytJbnRzOyAgLy8gVmlydHVhbEJhc2VBZGp1c3RtZW50T2Zmc2V0Ci0gICAgY2FzZSBNU0lNX011bHRpcGxlUG9seW1vcnBoaWM6Ci0gICAgY2FzZSBNU0lNX011bHRpcGxlOiAgICArK0ludHM7ICAvLyBOb25WaXJ0dWFsQmFzZUFkanVzdG1lbnQKLSAgICBjYXNlIE1TSU1fU2luZ2xlUG9seW1vcnBoaWM6Ci0gICAgY2FzZSBNU0lNX1NpbmdsZTogICAgICBicmVhazsgICAvLyBOb3RoaW5nCi0gICAgfQotICB9IGVsc2UgewotICAgIC8vIERhdGEgcG9pbnRlcnMgYXJlIGFuIGFnZ3JlZ2F0ZSBvZiBpbnRzLiAgVGhlIGZpcnN0IGludCBpcyBhbiBvZmZzZXQKLSAgICAvLyBmb2xsb3dlZCBieSB2YnRhYmxlLXJlbGF0ZWQgb2Zmc2V0cy4KLSAgICBQdHJzID0gMDsKLSAgICBzd2l0Y2ggKEluaGVyaXRhbmNlKSB7Ci0gICAgY2FzZSBNU0lNX1Vuc3BlY2lmaWVkOiArK0ludHM7ICAvLyBWQlRhYmxlT2Zmc2V0Ci0gICAgY2FzZSBNU0lNX1ZpcnR1YWw6ICAgICArK0ludHM7ICAvLyBWaXJ0dWFsQmFzZUFkanVzdG1lbnRPZmZzZXQKLSAgICBjYXNlIE1TSU1fTXVsdGlwbGVQb2x5bW9ycGhpYzoKLSAgICBjYXNlIE1TSU1fTXVsdGlwbGU6ICAgICAgICAgICAgIC8vIE5vdGhpbmcKLSAgICBjYXNlIE1TSU1fU2luZ2xlUG9seW1vcnBoaWM6Ci0gICAgY2FzZSBNU0lNX1NpbmdsZTogICAgICArK0ludHM7ICAvLyBGaWVsZCBvZmZzZXQKLSAgICB9Ci0gIH0KKyAgaWYgKE1QVC0+aXNNZW1iZXJGdW5jdGlvblBvaW50ZXIoKSkKKyAgICBQdHJzID0gMTsKKyAgZWxzZQorICAgIEludHMgPSAxOworICBpZiAoTVNJbmhlcml0YW5jZUF0dHI6Omhhc05WT2Zmc2V0RmllbGQoTVBULT5pc01lbWJlckZ1bmN0aW9uUG9pbnRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5oZXJpdGFuY2UpKQorICAgIEludHMrKzsKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlB0ck9mZnNldEZpZWxkKEluaGVyaXRhbmNlKSkKKyAgICBJbnRzKys7CisgIGlmIChNU0luaGVyaXRhbmNlQXR0cjo6aGFzVkJUYWJsZU9mZnNldEZpZWxkKEluaGVyaXRhbmNlKSkKKyAgICBJbnRzKys7CiAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihQdHJzLCBJbnRzKTsKIH0KIApAQCAtMTg1LDE0ICsxNjksMjYgQEAKICAgYXNzZXJ0KFRhcmdldC5nZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgfHwKICAgICAgICAgIFRhcmdldC5nZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQpOwogICB1bnNpZ25lZCBQdHJzLCBJbnRzOwotICBsbHZtOjp0aWUoUHRycywgSW50cykgPSBnZXRNU01lbWJlclBvaW50ZXJTbG90cyhNUFQpOworICBzdGQ6OnRpZShQdHJzLCBJbnRzKSA9IGdldE1TTWVtYmVyUG9pbnRlclNsb3RzKE1QVCk7CiAgIC8vIFRoZSBub21pbmFsIHN0cnVjdCBpcyBsYWlkIG91dCB3aXRoIHBvaW50ZXJzIGZvbGxvd2VkIGJ5IGludHMgYW5kIGFsaWduZWQKICAgLy8gdG8gYSBwb2ludGVyIHdpZHRoIGlmIGFueSBhcmUgcHJlc2VudCBhbmQgYW4gaW50IHdpZHRoIG90aGVyd2lzZS4KICAgdW5zaWduZWQgUHRyU2l6ZSA9IFRhcmdldC5nZXRQb2ludGVyV2lkdGgoMCk7CiAgIHVuc2lnbmVkIEludFNpemUgPSBUYXJnZXQuZ2V0SW50V2lkdGgoKTsKICAgdWludDY0X3QgV2lkdGggPSBQdHJzICogUHRyU2l6ZSArIEludHMgKiBJbnRTaXplOwotICB1bnNpZ25lZCBBbGlnbiA9IFB0cnMgPiAwID8gVGFyZ2V0LmdldFBvaW50ZXJBbGlnbigwKSA6IFRhcmdldC5nZXRJbnRBbGlnbigpOwotICBXaWR0aCA9IGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChXaWR0aCwgQWxpZ24pOworICB1bnNpZ25lZCBBbGlnbjsKKworICAvLyBXaGVuIE1TVkMgZG9lcyB4ODZfMzIgcmVjb3JkIGxheW91dCwgaXQgYWxpZ25zIGFnZ3JlZ2F0ZSBtZW1iZXIgcG9pbnRlcnMgdG8KKyAgLy8gOCBieXRlcy4gIEhvd2V2ZXIsIF9fYWxpZ25vZiB1c3VhbGx5IHJldHVybnMgNCBmb3IgZGF0YSBtZW1wdHJzIGFuZCA4IGZvcgorICAvLyBmdW5jdGlvbiBtZW1wdHJzLgorICBpZiAoUHRycyArIEludHMgPiAxICYmIFRhcmdldC5nZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYpCisgICAgQWxpZ24gPSA4ICogODsKKyAgZWxzZSBpZiAoUHRycykKKyAgICBBbGlnbiA9IFRhcmdldC5nZXRQb2ludGVyQWxpZ24oMCk7CisgIGVsc2UKKyAgICBBbGlnbiA9IFRhcmdldC5nZXRJbnRBbGlnbigpOworCisgIGlmIChUYXJnZXQuZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0KQorICAgIFdpZHRoID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KFdpZHRoLCBBbGlnbik7CiAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihXaWR0aCwgQWxpZ24pOwogfQogCmRpZmYgLS1naXQgYS9saWIvQVNUL01pY3Jvc29mdE1hbmdsZS5jcHAgYi9saWIvQVNUL01pY3Jvc29mdE1hbmdsZS5jcHAKaW5kZXggNTI1NjUwMS4uMDYxZmMxMyAxMDA2NDQKLS0tIGEvbGliL0FTVC9NaWNyb3NvZnRNYW5nbGUuY3BwCisrKyBiL2xpYi9BU1QvTWljcm9zb2Z0TWFuZ2xlLmNwcApAQCAtMTQsMTcgKzE0LDIxIEBACiAjaW5jbHVkZSAiY2xhbmcvQVNUL01hbmdsZS5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0F0dHIuaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvQ2hhclVuaXRzLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0NYWEluaGVyaXRhbmNlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0NoYXJVbml0cy5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbE9iakMuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRXhwckNYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9WVGFibGVCdWlsZGVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQUJJLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpY09wdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogCkBAIC03MSwxMCArNzUsMTAwIEBACiAgIHJldHVybiBmbjsKIH0KIAorc3RhdGljIGJvb2wgaXNMYW1iZGEoY29uc3QgTmFtZWREZWNsICpORCkgeworICBjb25zdCBDWFhSZWNvcmREZWNsICpSZWNvcmQgPSBkeW5fY2FzdDxDWFhSZWNvcmREZWNsPihORCk7CisgIGlmICghUmVjb3JkKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gUmVjb3JkLT5pc0xhbWJkYSgpOworfQorCisvLy8gTWljcm9zb2Z0TWFuZ2xlQ29udGV4dEltcGwgLSBPdmVycmlkZXMgdGhlIGRlZmF1bHQgTWFuZ2xlQ29udGV4dCBmb3IgdGhlCisvLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgQUJJLgorY2xhc3MgTWljcm9zb2Z0TWFuZ2xlQ29udGV4dEltcGwgOiBwdWJsaWMgTWljcm9zb2Z0TWFuZ2xlQ29udGV4dCB7CisgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IERlY2xDb250ZXh0ICosIElkZW50aWZpZXJJbmZvICo+IERpc2NyaW1pbmF0b3JLZXlUeTsKKyAgbGx2bTo6RGVuc2VNYXA8RGlzY3JpbWluYXRvcktleVR5LCB1bnNpZ25lZD4gRGlzY3JpbWluYXRvcjsKKyAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgTmFtZWREZWNsKiwgdW5zaWduZWQ+IFVuaXF1aWZpZXI7CisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IENYWFJlY29yZERlY2wgKiwgdW5zaWduZWQ+IExhbWJkYUlkczsKKworcHVibGljOgorICBNaWNyb3NvZnRNYW5nbGVDb250ZXh0SW1wbChBU1RDb250ZXh0ICZDb250ZXh0LCBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpCisgICAgICA6IE1pY3Jvc29mdE1hbmdsZUNvbnRleHQoQ29udGV4dCwgRGlhZ3MpIHt9CisgIGJvb2wgc2hvdWxkTWFuZ2xlQ1hYTmFtZShjb25zdCBOYW1lZERlY2wgKkQpIG92ZXJyaWRlOworICBib29sIHNob3VsZE1hbmdsZVN0cmluZ0xpdGVyYWwoY29uc3QgU3RyaW5nTGl0ZXJhbCAqU0wpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZUNYWE5hbWUoY29uc3QgTmFtZWREZWNsICpELCByYXdfb3N0cmVhbSAmT3V0KSBvdmVycmlkZTsKKyAgdm9pZCBtYW5nbGVWaXJ0dWFsTWVtUHRyVGh1bmsoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQsIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZVRodW5rKGNvbnN0IENYWE1ldGhvZERlY2wgKk1ELCBjb25zdCBUaHVua0luZm8gJlRodW5rLAorICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZUNYWER0b3JUaHVuayhjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqREQsIENYWER0b3JUeXBlIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRoaXNBZGp1c3RtZW50ICZUaGlzQWRqdXN0bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJikgb3ZlcnJpZGU7CisgIHZvaWQgbWFuZ2xlQ1hYVkZUYWJsZShjb25zdCBDWFhSZWNvcmREZWNsICpEZXJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqPiBCYXNlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPdXQpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZUNYWFZCVGFibGUoY29uc3QgQ1hYUmVjb3JkRGVjbCAqRGVyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IENYWFJlY29yZERlY2wgKj4gQmFzZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT3V0KSBvdmVycmlkZTsKKyAgdm9pZCBtYW5nbGVDWFhSVFRJKFF1YWxUeXBlIFQsIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZUNYWFJUVElOYW1lKFF1YWxUeXBlIFQsIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZVR5cGVOYW1lKFF1YWxUeXBlIFQsIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZUNYWEN0b3IoY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpELCBDWFhDdG9yVHlwZSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJikgb3ZlcnJpZGU7CisgIHZvaWQgbWFuZ2xlQ1hYRHRvcihjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRCwgQ1hYRHRvclR5cGUgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZVJlZmVyZW5jZVRlbXBvcmFyeShjb25zdCBWYXJEZWNsICosIHJhd19vc3RyZWFtICYpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZVN0YXRpY0d1YXJkVmFyaWFibGUoY29uc3QgVmFyRGVjbCAqRCwgcmF3X29zdHJlYW0gJk91dCkgb3ZlcnJpZGU7CisgIHZvaWQgbWFuZ2xlRHluYW1pY0luaXRpYWxpemVyKGNvbnN0IFZhckRlY2wgKkQsIHJhd19vc3RyZWFtICZPdXQpIG92ZXJyaWRlOworICB2b2lkIG1hbmdsZUR5bmFtaWNBdEV4aXREZXN0cnVjdG9yKGNvbnN0IFZhckRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCkgb3ZlcnJpZGU7CisgIHZvaWQgbWFuZ2xlU3RyaW5nTGl0ZXJhbChjb25zdCBTdHJpbmdMaXRlcmFsICpTTCwgcmF3X29zdHJlYW0gJk91dCkgb3ZlcnJpZGU7CisgIGJvb2wgZ2V0TmV4dERpc2NyaW1pbmF0b3IoY29uc3QgTmFtZWREZWNsICpORCwgdW5zaWduZWQgJmRpc2MpIHsKKyAgICAvLyBMYW1iZGEgY2xvc3VyZSB0eXBlcyBhcmUgYWxyZWFkeSBudW1iZXJlZC4KKyAgICBpZiAoaXNMYW1iZGEoTkQpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3QgRGVjbENvbnRleHQgKkRDID0gZ2V0RWZmZWN0aXZlRGVjbENvbnRleHQoTkQpOworICAgIGlmICghREMtPmlzRnVuY3Rpb25Pck1ldGhvZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVXNlIHRoZSBjYW5vbmljYWwgbnVtYmVyIGZvciBleHRlcm5hbGx5IHZpc2libGUgZGVjbHMuCisgICAgaWYgKE5ELT5pc0V4dGVybmFsbHlWaXNpYmxlKCkpIHsKKyAgICAgIGRpc2MgPSBnZXRBU1RDb250ZXh0KCkuZ2V0TWFuZ2xpbmdOdW1iZXIoTkQpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQW5vbnltb3VzIHRhZ3MgYXJlIGFscmVhZHkgbnVtYmVyZWQuCisgICAgaWYgKGNvbnN0IFRhZ0RlY2wgKlRhZyA9IGR5bl9jYXN0PFRhZ0RlY2w+KE5EKSkgeworICAgICAgaWYgKFRhZy0+Z2V0TmFtZSgpLmVtcHR5KCkgJiYgIVRhZy0+Z2V0VHlwZWRlZk5hbWVGb3JBbm9uRGVjbCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTWFrZSB1cCBhIHJlYXNvbmFibGUgbnVtYmVyIGZvciBpbnRlcm5hbCBkZWNscy4KKyAgICB1bnNpZ25lZCAmZGlzY3JpbWluYXRvciA9IFVuaXF1aWZpZXJbTkRdOworICAgIGlmICghZGlzY3JpbWluYXRvcikKKyAgICAgIGRpc2NyaW1pbmF0b3IgPSArK0Rpc2NyaW1pbmF0b3Jbc3RkOjptYWtlX3BhaXIoREMsIE5ELT5nZXRJZGVudGlmaWVyKCkpXTsKKyAgICBkaXNjID0gZGlzY3JpbWluYXRvcjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHVuc2lnbmVkIGdldExhbWJkYUlkKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7CisgICAgYXNzZXJ0KFJELT5pc0xhbWJkYSgpICYmICJSRCBtdXN0IGJlIGEgbGFtYmRhISIpOworICAgIGFzc2VydCghUkQtPmlzRXh0ZXJuYWxseVZpc2libGUoKSAmJiAiUkQgbXVzdCBub3QgYmUgdmlzaWJsZSEiKTsKKyAgICBhc3NlcnQoUkQtPmdldExhbWJkYU1hbmdsaW5nTnVtYmVyKCkgPT0gMCAmJgorICAgICAgICAgICAiUkQgbXVzdCBub3QgaGF2ZSBhIG1hbmdsaW5nIG51bWJlciEiKTsKKyAgICBzdGQ6OnBhaXI8bGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCB1bnNpZ25lZD46Oml0ZXJhdG9yLCBib29sPgorICAgICAgICBSZXN1bHQgPSBMYW1iZGFJZHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFJELCBMYW1iZGFJZHMuc2l6ZSgpKSk7CisgICAgcmV0dXJuIFJlc3VsdC5maXJzdC0+c2Vjb25kOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgbWFuZ2xlSW5pdEZpbmlTdHViKGNvbnN0IFZhckRlY2wgKkQsIHJhd19vc3RyZWFtICZPdXQsIGNoYXIgQ2hhckNvZGUpOworfTsKKwogLy8vIE1pY3Jvc29mdENYWE5hbWVNYW5nbGVyIC0gTWFuYWdlIHRoZSBtYW5nbGluZyBvZiBhIHNpbmdsZSBuYW1lIGZvciB0aGUKIC8vLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBBQkkuCiBjbGFzcyBNaWNyb3NvZnRDWFhOYW1lTWFuZ2xlciB7Ci0gIE1hbmdsZUNvbnRleHQgJkNvbnRleHQ7CisgIE1pY3Jvc29mdE1hbmdsZUNvbnRleHRJbXBsICZDb250ZXh0OwogICByYXdfb3N0cmVhbSAmT3V0OwogCiAgIC8vLyBUaGUgInN0cnVjdG9yIiBpcyB0aGUgdG9wLWxldmVsIGRlY2xhcmF0aW9uIGJlaW5nIG1hbmdsZWQsIGlmCkBAIC05OSwxNCArMTkzLDE0IEBACiBwdWJsaWM6CiAgIGVudW0gUXVhbGlmaWVyTWFuZ2xlTW9kZSB7IFFNTV9Ecm9wLCBRTU1fTWFuZ2xlLCBRTU1fRXNjYXBlLCBRTU1fUmVzdWx0IH07CiAKLSAgTWljcm9zb2Z0Q1hYTmFtZU1hbmdsZXIoTWFuZ2xlQ29udGV4dCAmQywgcmF3X29zdHJlYW0gJk91dF8pCisgIE1pY3Jvc29mdENYWE5hbWVNYW5nbGVyKE1pY3Jvc29mdE1hbmdsZUNvbnRleHRJbXBsICZDLCByYXdfb3N0cmVhbSAmT3V0XykKICAgICA6IENvbnRleHQoQyksIE91dChPdXRfKSwKICAgICAgIFN0cnVjdG9yKDApLCBTdHJ1Y3RvclR5cGUoLTEpLAogICAgICAgVXNlTmFtZUJhY2tSZWZlcmVuY2VzKHRydWUpLAogICAgICAgUG9pbnRlcnNBcmU2NEJpdChDLmdldEFTVENvbnRleHQoKS5nZXRUYXJnZXRJbmZvKCkuZ2V0UG9pbnRlcldpZHRoKDApID09CiAgICAgICAgICAgICAgICAgICAgICAgIDY0KSB7IH0KIAotICBNaWNyb3NvZnRDWFhOYW1lTWFuZ2xlcihNYW5nbGVDb250ZXh0ICZDLCByYXdfb3N0cmVhbSAmT3V0XywKKyAgTWljcm9zb2Z0Q1hYTmFtZU1hbmdsZXIoTWljcm9zb2Z0TWFuZ2xlQ29udGV4dEltcGwgJkMsIHJhd19vc3RyZWFtICZPdXRfLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRCwgQ1hYRHRvclR5cGUgVHlwZSkKICAgICA6IENvbnRleHQoQyksIE91dChPdXRfKSwKICAgICAgIFN0cnVjdG9yKGdldFN0cnVjdG9yKEQpKSwgU3RydWN0b3JUeXBlKFR5cGUpLApAQCAtMTE4LDE1ICsyMTIsMjAgQEAKIAogICB2b2lkIG1hbmdsZShjb25zdCBOYW1lZERlY2wgKkQsIFN0cmluZ1JlZiBQcmVmaXggPSAiXDAxPyIpOwogICB2b2lkIG1hbmdsZU5hbWUoY29uc3QgTmFtZWREZWNsICpORCk7Ci0gIHZvaWQgbWFuZ2xlRGVjbGFyYXRpb24oY29uc3QgTmFtZWREZWNsICpORCk7CiAgIHZvaWQgbWFuZ2xlRnVuY3Rpb25FbmNvZGluZyhjb25zdCBGdW5jdGlvbkRlY2wgKkZEKTsKICAgdm9pZCBtYW5nbGVWYXJpYWJsZUVuY29kaW5nKGNvbnN0IFZhckRlY2wgKlZEKTsKKyAgdm9pZCBtYW5nbGVNZW1iZXJEYXRhUG9pbnRlcihjb25zdCBDWFhSZWNvcmREZWNsICpSRCwgY29uc3QgVmFsdWVEZWNsICpWRCk7CisgIHZvaWQgbWFuZ2xlTWVtYmVyRnVuY3Rpb25Qb2ludGVyKGNvbnN0IENYWFJlY29yZERlY2wgKlJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhNZXRob2REZWNsICpNRCk7CisgIHZvaWQgbWFuZ2xlVmlydHVhbE1lbVB0clRodW5rKAorICAgICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQsCisgICAgICBjb25zdCBNaWNyb3NvZnRWVGFibGVDb250ZXh0OjpNZXRob2RWRlRhYmxlTG9jYXRpb24gJk1MKTsKICAgdm9pZCBtYW5nbGVOdW1iZXIoaW50NjRfdCBOdW1iZXIpOwogICB2b2lkIG1hbmdsZVR5cGUoUXVhbFR5cGUgVCwgU291cmNlUmFuZ2UgUmFuZ2UsCiAgICAgICAgICAgICAgICAgICBRdWFsaWZpZXJNYW5nbGVNb2RlIFFNTSA9IFFNTV9NYW5nbGUpOwogICB2b2lkIG1hbmdsZUZ1bmN0aW9uVHlwZShjb25zdCBGdW5jdGlvblR5cGUgKlQsIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yY2VJbnN0TWV0aG9kID0gZmFsc2UpOwotICB2b2lkIG1hbmdsZVBvc3RmaXgoY29uc3QgRGVjbENvbnRleHQgKkRDLCBib29sIE5vRnVuY3Rpb24gPSBmYWxzZSk7CisgIHZvaWQgbWFuZ2xlTmVzdGVkTmFtZShjb25zdCBOYW1lZERlY2wgKk5EKTsKIAogcHJpdmF0ZToKICAgdm9pZCBkaXNhYmxlQmFja1JlZmVyZW5jZXMoKSB7IFVzZU5hbWVCYWNrUmVmZXJlbmNlcyA9IGZhbHNlOyB9CkBAIC0xMzgsMTMgKzIzNywxMyBAQAogICB2b2lkIG1hbmdsZU9wZXJhdG9yTmFtZShPdmVybG9hZGVkT3BlcmF0b3JLaW5kIE9PLCBTb3VyY2VMb2NhdGlvbiBMb2MpOwogICB2b2lkIG1hbmdsZUNYWER0b3JUeXBlKENYWER0b3JUeXBlIFQpOwogICB2b2lkIG1hbmdsZVF1YWxpZmllcnMoUXVhbGlmaWVycyBRdWFscywgYm9vbCBJc01lbWJlcik7Ci0gIHZvaWQgbWFuZ2xlUG9pbnRlclF1YWxpZmllcnMoUXVhbGlmaWVycyBRdWFscyk7CisgIHZvaWQgbWFuZ2xlUG9pbnRlckNWUXVhbGlmaWVycyhRdWFsaWZpZXJzIFF1YWxzKTsKKyAgdm9pZCBtYW5nbGVQb2ludGVyRXh0UXVhbGlmaWVycyhRdWFsaWZpZXJzIFF1YWxzLCBjb25zdCBUeXBlICpQb2ludGVlVHlwZSk7CiAKICAgdm9pZCBtYW5nbGVVbnNjb3BlZFRlbXBsYXRlTmFtZShjb25zdCBUZW1wbGF0ZURlY2wgKk5EKTsKICAgdm9pZCBtYW5nbGVUZW1wbGF0ZUluc3RhbnRpYXRpb25OYW1lKGNvbnN0IFRlbXBsYXRlRGVjbCAqVEQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MpOwogICB2b2lkIG1hbmdsZU9iakNNZXRob2ROYW1lKGNvbnN0IE9iakNNZXRob2REZWNsICpNRCk7Ci0gIHZvaWQgbWFuZ2xlTG9jYWxOYW1lKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQpOwogCiAgIHZvaWQgbWFuZ2xlQXJndW1lbnRUeXBlKFF1YWxUeXBlIFQsIFNvdXJjZVJhbmdlIFJhbmdlKTsKIApAQCAtMTU3LDcgKzI1Niw3IEBACiAjdW5kZWYgQUJTVFJBQ1RfVFlQRQogI3VuZGVmIE5PTl9DQU5PTklDQUxfVFlQRQogI3VuZGVmIFRZUEUKLSAgCisKICAgdm9pZCBtYW5nbGVUeXBlKGNvbnN0IFRhZ0RlY2wgKlREKTsKICAgdm9pZCBtYW5nbGVEZWNheWVkQXJyYXlUeXBlKGNvbnN0IEFycmF5VHlwZSAqVCk7CiAgIHZvaWQgbWFuZ2xlQXJyYXlUeXBlKGNvbnN0IEFycmF5VHlwZSAqVCk7CkBAIC0xNzEsNDcgKzI3MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MpOwogICB2b2lkIG1hbmdsZVRlbXBsYXRlQXJnKGNvbnN0IFRlbXBsYXRlRGVjbCAqVEQsIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJlRBKTsKIH07Ci0KLS8vLyBNaWNyb3NvZnRNYW5nbGVDb250ZXh0SW1wbCAtIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBNYW5nbGVDb250ZXh0IGZvciB0aGUKLS8vLyBNaWNyb3NvZnQgVmlzdWFsIEMrKyBBQkkuCi1jbGFzcyBNaWNyb3NvZnRNYW5nbGVDb250ZXh0SW1wbCA6IHB1YmxpYyBNaWNyb3NvZnRNYW5nbGVDb250ZXh0IHsKLXB1YmxpYzoKLSAgTWljcm9zb2Z0TWFuZ2xlQ29udGV4dEltcGwoQVNUQ29udGV4dCAmQ29udGV4dCwgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKQotICAgICAgOiBNaWNyb3NvZnRNYW5nbGVDb250ZXh0KENvbnRleHQsIERpYWdzKSB7fQotICB2aXJ0dWFsIGJvb2wgc2hvdWxkTWFuZ2xlQ1hYTmFtZShjb25zdCBOYW1lZERlY2wgKkQpOwotICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYTmFtZShjb25zdCBOYW1lZERlY2wgKkQsIHJhd19vc3RyZWFtICZPdXQpOwotICB2aXJ0dWFsIHZvaWQgbWFuZ2xlVmlydHVhbE1lbVB0clRodW5rKGNvbnN0IENYWE1ldGhvZERlY2wgKk1ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldEluVkZUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmKTsKLSAgdmlydHVhbCB2b2lkIG1hbmdsZVRodW5rKGNvbnN0IENYWE1ldGhvZERlY2wgKk1ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGh1bmtJbmZvICZUaHVuaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpOwotICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYRHRvclRodW5rKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpERCwgQ1hYRHRvclR5cGUgVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaGlzQWRqdXN0bWVudCAmVGhpc0FkanVzdG1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJik7Ci0gIHZpcnR1YWwgdm9pZCBtYW5nbGVDWFhWRlRhYmxlKGNvbnN0IENYWFJlY29yZERlY2wgKkRlcml2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IENYWFJlY29yZERlY2wgKj4gQmFzZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPdXQpOwotICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYVkJUYWJsZShjb25zdCBDWFhSZWNvcmREZWNsICpEZXJpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBDWFhSZWNvcmREZWNsICo+IEJhc2VQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT3V0KTsKLSAgdmlydHVhbCB2b2lkIG1hbmdsZUNYWFJUVEkoUXVhbFR5cGUgVCwgcmF3X29zdHJlYW0gJik7Ci0gIHZpcnR1YWwgdm9pZCBtYW5nbGVDWFhSVFRJTmFtZShRdWFsVHlwZSBULCByYXdfb3N0cmVhbSAmKTsKLSAgdmlydHVhbCB2b2lkIG1hbmdsZVR5cGVOYW1lKFF1YWxUeXBlIFQsIHJhd19vc3RyZWFtICYpOwotICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYQ3Rvcihjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsIENYWEN0b3JUeXBlIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICYpOwotICB2aXJ0dWFsIHZvaWQgbWFuZ2xlQ1hYRHRvcihjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRCwgQ1hYRHRvclR5cGUgVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJik7Ci0gIHZpcnR1YWwgdm9pZCBtYW5nbGVSZWZlcmVuY2VUZW1wb3JhcnkoY29uc3QgVmFyRGVjbCAqLCByYXdfb3N0cmVhbSAmKTsKLSAgdmlydHVhbCB2b2lkIG1hbmdsZVN0YXRpY0d1YXJkVmFyaWFibGUoY29uc3QgVmFyRGVjbCAqRCwgcmF3X29zdHJlYW0gJk91dCk7Ci0gIHZpcnR1YWwgdm9pZCBtYW5nbGVEeW5hbWljSW5pdGlhbGl6ZXIoY29uc3QgVmFyRGVjbCAqRCwgcmF3X29zdHJlYW0gJk91dCk7Ci0gIHZpcnR1YWwgdm9pZCBtYW5nbGVEeW5hbWljQXRFeGl0RGVzdHJ1Y3Rvcihjb25zdCBWYXJEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCk7Ci0KLXByaXZhdGU6Ci0gIHZvaWQgbWFuZ2xlSW5pdEZpbmlTdHViKGNvbnN0IFZhckRlY2wgKkQsIHJhd19vc3RyZWFtICZPdXQsIGNoYXIgQ2hhckNvZGUpOwotfTsKLQogfQogCiBib29sIE1pY3Jvc29mdE1hbmdsZUNvbnRleHRJbXBsOjpzaG91bGRNYW5nbGVDWFhOYW1lKGNvbnN0IE5hbWVkRGVjbCAqRCkgewpAQCAtMjY3LDYgKzMyNSwxMyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbAorTWljcm9zb2Z0TWFuZ2xlQ29udGV4dEltcGw6OnNob3VsZE1hbmdsZVN0cmluZ0xpdGVyYWwoY29uc3QgU3RyaW5nTGl0ZXJhbCAqU0wpIHsKKyAgcmV0dXJuIFNMLT5pc0FzY2lpKCkgfHwgU0wtPmlzV2lkZSgpOworICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIGJlIHVwZGF0ZWQgd2hlbiBNU1ZDIGdhaW5zIHN1cHBvcnQgZm9yIFVuaWNvZGUKKyAgLy8gbGl0ZXJhbHMuCit9CisKIHZvaWQgTWljcm9zb2Z0Q1hYTmFtZU1hbmdsZXI6Om1hbmdsZShjb25zdCBOYW1lZERlY2wgKkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFByZWZpeCkgewogICAvLyBNU1ZDIGRvZXNuJ3QgbWFuZ2xlIEMrKyBuYW1lcyB0aGUgc2FtZSB3YXkgaXQgbWFuZ2xlcyBleHRlcm4gIkMiIG5hbWVzLgpAQCAtMzI0LDcgKzM4OSw3IEBACiAgIC8vICAgICAgICAgICAgICAgICA6Oj0gMiAgIyBwdWJsaWMgc3RhdGljIG1lbWJlcgogICAvLyAgICAgICAgICAgICAgICAgOjo9IDMgICMgZ2xvYmFsCiAgIC8vICAgICAgICAgICAgICAgICA6Oj0gNCAgIyBzdGF0aWMgbG9jYWwKLSAgCisKICAgLy8gVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgZW5jb2RpbmcgKGFmdGVyIHRoZSBuYW1lKSBpcyB0aGUgc3RvcmFnZSBjbGFzcy4KICAgaWYgKFZELT5pc1N0YXRpY0RhdGFNZW1iZXIoKSkgewogICAgIC8vIElmIGl0J3MgYSBzdGF0aWMgbWVtYmVyLCBpdCBhbHNvIGVuY29kZXMgdGhlIGFjY2VzcyBsZXZlbC4KQEAgLTM0NSwxMiArNDEwLDEyIEBACiAgIC8vIFBvaW50ZXJzIGFuZCByZWZlcmVuY2VzIGFyZSBvZGQuIFRoZSB0eXBlIG9mICdpbnQgKiBjb25zdCBmb287JyBnZXRzCiAgIC8vIG1hbmdsZWQgYXMgJ1FBSEEnIGluc3RlYWQgb2YgJ1BBSEInLCBmb3IgZXhhbXBsZS4KICAgVHlwZUxvYyBUTCA9IFZELT5nZXRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCk7Ci0gIFF1YWxUeXBlIFR5ID0gVEwuZ2V0VHlwZSgpOworICBRdWFsVHlwZSBUeSA9IFZELT5nZXRUeXBlKCk7CiAgIGlmIChUeS0+aXNQb2ludGVyVHlwZSgpIHx8IFR5LT5pc1JlZmVyZW5jZVR5cGUoKSB8fAogICAgICAgVHktPmlzTWVtYmVyUG9pbnRlclR5cGUoKSkgewogICAgIG1hbmdsZVR5cGUoVHksIFRMLmdldFNvdXJjZVJhbmdlKCksIFFNTV9Ecm9wKTsKLSAgICBpZiAoUG9pbnRlcnNBcmU2NEJpdCkKLSAgICAgIE91dCA8PCAnRSc7CisgICAgbWFuZ2xlUG9pbnRlckV4dFF1YWxpZmllcnMoCisgICAgICAgIFR5LmdldERlc3VnYXJlZFR5cGUoZ2V0QVNUQ29udGV4dCgpKS5nZXRMb2NhbFF1YWxpZmllcnMoKSwgMCk7CiAgICAgaWYgKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQgPSBUeS0+Z2V0QXM8TWVtYmVyUG9pbnRlclR5cGU+KCkpIHsKICAgICAgIG1hbmdsZVF1YWxpZmllcnMoTVBULT5nZXRQb2ludGVlVHlwZSgpLmdldFF1YWxpZmllcnMoKSwgdHJ1ZSk7CiAgICAgICAvLyBNZW1iZXIgcG9pbnRlcnMgYXJlIHN1ZmZpeGVkIHdpdGggYSBiYWNrIHJlZmVyZW5jZSB0byB0aGUgbWVtYmVyCkBAIC0zNzEsMjAgKzQzNiwxMzAgQEAKICAgfQogfQogCit2b2lkIE1pY3Jvc29mdENYWE5hbWVNYW5nbGVyOjptYW5nbGVNZW1iZXJEYXRhUG9pbnRlcihjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlRGVjbCAqVkQpIHsKKyAgLy8gPG1lbWJlci1kYXRhLXBvaW50ZXI+IDo6PSA8aW50ZWdlci1saXRlcmFsPgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgOjo9ICRGIDxudW1iZXI+IDxudW1iZXI+CisgIC8vICAgICAgICAgICAgICAgICAgICAgICA6Oj0gJEcgPG51bWJlcj4gPG51bWJlcj4gPG51bWJlcj4KKworICBpbnQ2NF90IEZpZWxkT2Zmc2V0OworICBpbnQ2NF90IFZCVGFibGVPZmZzZXQ7CisgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBJTSA9IFJELT5nZXRNU0luaGVyaXRhbmNlTW9kZWwoKTsKKyAgaWYgKFZEKSB7CisgICAgRmllbGRPZmZzZXQgPSBnZXRBU1RDb250ZXh0KCkuZ2V0RmllbGRPZmZzZXQoVkQpOworICAgIGFzc2VydChGaWVsZE9mZnNldCAlIGdldEFTVENvbnRleHQoKS5nZXRDaGFyV2lkdGgoKSA9PSAwICYmCisgICAgICAgICAgICJjYW5ub3QgdGFrZSBhZGRyZXNzIG9mIGJpdGZpZWxkIik7CisgICAgRmllbGRPZmZzZXQgLz0gZ2V0QVNUQ29udGV4dCgpLmdldENoYXJXaWR0aCgpOworCisgICAgVkJUYWJsZU9mZnNldCA9IDA7CisgIH0gZWxzZSB7CisgICAgRmllbGRPZmZzZXQgPSBSRC0+bnVsbEZpZWxkT2Zmc2V0SXNaZXJvKCkgPyAwIDogLTE7CisKKyAgICBWQlRhYmxlT2Zmc2V0ID0gLTE7CisgIH0KKworICBjaGFyIENvZGUgPSAnXDAnOworICBzd2l0Y2ggKElNKSB7CisgIGNhc2UgTVNJbmhlcml0YW5jZUF0dHI6OktleXdvcmRfc2luZ2xlX2luaGVyaXRhbmNlOiAgICAgIENvZGUgPSAnMCc7IGJyZWFrOworICBjYXNlIE1TSW5oZXJpdGFuY2VBdHRyOjpLZXl3b3JkX211bHRpcGxlX2luaGVyaXRhbmNlOiAgICBDb2RlID0gJzAnOyBicmVhazsKKyAgY2FzZSBNU0luaGVyaXRhbmNlQXR0cjo6S2V5d29yZF92aXJ0dWFsX2luaGVyaXRhbmNlOiAgICAgQ29kZSA9ICdGJzsgYnJlYWs7CisgIGNhc2UgTVNJbmhlcml0YW5jZUF0dHI6OktleXdvcmRfdW5zcGVjaWZpZWRfaW5oZXJpdGFuY2U6IENvZGUgPSAnRyc7IGJyZWFrOworICB9CisKKyAgT3V0IDw8ICckJyA8PCBDb2RlOworCisgIG1hbmdsZU51bWJlcihGaWVsZE9mZnNldCk7CisKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlB0ck9mZnNldEZpZWxkKElNKSkKKyAgICBtYW5nbGVOdW1iZXIoMCk7CisgIGlmIChNU0luaGVyaXRhbmNlQXR0cjo6aGFzVkJUYWJsZU9mZnNldEZpZWxkKElNKSkKKyAgICBtYW5nbGVOdW1iZXIoVkJUYWJsZU9mZnNldCk7Cit9CisKK3ZvaWQKK01pY3Jvc29mdENYWE5hbWVNYW5nbGVyOjptYW5nbGVNZW1iZXJGdW5jdGlvblBvaW50ZXIoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWE1ldGhvZERlY2wgKk1EKSB7CisgIC8vIDxtZW1iZXItZnVuY3Rpb24tcG9pbnRlcj4gOjo9ICQxPyA8bmFtZT4KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gJEg/IDxuYW1lPiA8bnVtYmVyPgorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6PSAkST8gPG5hbWU+IDxudW1iZXI+IDxudW1iZXI+CisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgOjo9ICRKPyA8bmFtZT4gPG51bWJlcj4gPG51bWJlcj4gPG51bWJlcj4KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gJDBBQAorCisgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBJTSA9IFJELT5nZXRNU0luaGVyaXRhbmNlTW9kZWwoKTsKKworICAvLyBUaGUgbnVsbCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlciBpcyAkMEFAIGluIGZ1bmN0aW9uIHRlbXBsYXRlcyBhbmQgY3Jhc2hlcworICAvLyBNU1ZDIHdoZW4gdXNlZCBpbiBjbGFzcyB0ZW1wbGF0ZXMsIHNvIHdlIGRvbid0IGtub3cgd2hhdCB0aGV5IHJlYWxseSBsb29rCisgIC8vIGxpa2UuCisgIGlmICghTUQpIHsKKyAgICBPdXQgPDwgIiQwQUAiOworICAgIHJldHVybjsKKyAgfQorCisgIGNoYXIgQ29kZSA9ICdcMCc7CisgIHN3aXRjaCAoSU0pIHsKKyAgY2FzZSBNU0luaGVyaXRhbmNlQXR0cjo6S2V5d29yZF9zaW5nbGVfaW5oZXJpdGFuY2U6ICAgICAgQ29kZSA9ICcxJzsgYnJlYWs7CisgIGNhc2UgTVNJbmhlcml0YW5jZUF0dHI6OktleXdvcmRfbXVsdGlwbGVfaW5oZXJpdGFuY2U6ICAgIENvZGUgPSAnSCc7IGJyZWFrOworICBjYXNlIE1TSW5oZXJpdGFuY2VBdHRyOjpLZXl3b3JkX3ZpcnR1YWxfaW5oZXJpdGFuY2U6ICAgICBDb2RlID0gJ0knOyBicmVhazsKKyAgY2FzZSBNU0luaGVyaXRhbmNlQXR0cjo6S2V5d29yZF91bnNwZWNpZmllZF9pbmhlcml0YW5jZTogQ29kZSA9ICdKJzsgYnJlYWs7CisgIH0KKworICBPdXQgPDwgJyQnIDw8IENvZGUgPDwgJz8nOworCisgIC8vIElmIG5vbi12aXJ0dWFsLCBtYW5nbGUgdGhlIG5hbWUuICBJZiB2aXJ0dWFsLCBtYW5nbGUgYXMgYSB2aXJ0dWFsIG1lbXB0cgorICAvLyB0aHVuay4KKyAgdWludDY0X3QgTlZPZmZzZXQgPSAwOworICB1aW50NjRfdCBWQlRhYmxlT2Zmc2V0ID0gMDsKKyAgaWYgKE1ELT5pc1ZpcnR1YWwoKSkgeworICAgIE1pY3Jvc29mdFZUYWJsZUNvbnRleHQgKlZUQ29udGV4dCA9CisgICAgICAgIGNhc3Q8TWljcm9zb2Z0VlRhYmxlQ29udGV4dD4oZ2V0QVNUQ29udGV4dCgpLmdldFZUYWJsZUNvbnRleHQoKSk7CisgICAgY29uc3QgTWljcm9zb2Z0VlRhYmxlQ29udGV4dDo6TWV0aG9kVkZUYWJsZUxvY2F0aW9uICZNTCA9CisgICAgICAgIFZUQ29udGV4dC0+Z2V0TWV0aG9kVkZUYWJsZUxvY2F0aW9uKEdsb2JhbERlY2woTUQpKTsKKyAgICBtYW5nbGVWaXJ0dWFsTWVtUHRyVGh1bmsoTUQsIE1MKTsKKyAgICBOVk9mZnNldCA9IE1MLlZGUHRyT2Zmc2V0LmdldFF1YW50aXR5KCk7CisgICAgVkJUYWJsZU9mZnNldCA9IE1MLlZCVGFibGVJbmRleCAqIDQ7CisgICAgaWYgKE1MLlZCYXNlKSB7CisgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MgPSBDb250ZXh0LmdldERpYWdzKCk7CisgICAgICB1bnNpZ25lZCBEaWFnSUQgPSBEaWFncy5nZXRDdXN0b21EaWFnSUQoCisgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkVycm9yLAorICAgICAgICAgICJjYW5ub3QgbWFuZ2xlIHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMgZnJvbSB2aXJ0dWFsIGJhc2VzIik7CisgICAgICBEaWFncy5SZXBvcnQoTUQtPmdldExvY2F0aW9uKCksIERpYWdJRCk7CisgICAgfQorICB9IGVsc2UgeworICAgIG1hbmdsZU5hbWUoTUQpOworICAgIG1hbmdsZUZ1bmN0aW9uRW5jb2RpbmcoTUQpOworICB9CisKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNOVk9mZnNldEZpZWxkKC8qSXNNZW1iZXJGdW5jdGlvbj0qL3RydWUsIElNKSkKKyAgICBtYW5nbGVOdW1iZXIoTlZPZmZzZXQpOworICBpZiAoTVNJbmhlcml0YW5jZUF0dHI6Omhhc1ZCUHRyT2Zmc2V0RmllbGQoSU0pKQorICAgIG1hbmdsZU51bWJlcigwKTsKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlRhYmxlT2Zmc2V0RmllbGQoSU0pKQorICAgIG1hbmdsZU51bWJlcihWQlRhYmxlT2Zmc2V0KTsKK30KKwordm9pZCBNaWNyb3NvZnRDWFhOYW1lTWFuZ2xlcjo6bWFuZ2xlVmlydHVhbE1lbVB0clRodW5rKAorICAgIGNvbnN0IENYWE1ldGhvZERlY2wgKk1ELAorICAgIGNvbnN0IE1pY3Jvc29mdFZUYWJsZUNvbnRleHQ6Ok1ldGhvZFZGVGFibGVMb2NhdGlvbiAmTUwpIHsKKyAgLy8gR2V0IHRoZSB2ZnRhYmxlIG9mZnNldC4KKyAgQ2hhclVuaXRzIFBvaW50ZXJXaWR0aCA9IGdldEFTVENvbnRleHQoKS50b0NoYXJVbml0c0Zyb21CaXRzKAorICAgICAgZ2V0QVNUQ29udGV4dCgpLmdldFRhcmdldEluZm8oKS5nZXRQb2ludGVyV2lkdGgoMCkpOworICB1aW50NjRfdCBPZmZzZXRJblZGVGFibGUgPSBNTC5JbmRleCAqIFBvaW50ZXJXaWR0aC5nZXRRdWFudGl0eSgpOworCisgIE91dCA8PCAiP185IjsKKyAgbWFuZ2xlTmFtZShNRC0+Z2V0UGFyZW50KCkpOworICBPdXQgPDwgIiRCIjsKKyAgbWFuZ2xlTnVtYmVyKE9mZnNldEluVkZUYWJsZSk7CisgIE91dCA8PCAnQSc7CisgIE91dCA8PCAoUG9pbnRlcnNBcmU2NEJpdCA/ICdBJyA6ICdFJyk7Cit9CisKIHZvaWQgTWljcm9zb2Z0Q1hYTmFtZU1hbmdsZXI6Om1hbmdsZU5hbWUoY29uc3QgTmFtZWREZWNsICpORCkgewogICAvLyA8bmFtZT4gOjo9IDx1bnNjb3BlZC1uYW1lPiB7WzxuYW1lZC1zY29wZT5dKyB8IFs8bmVzdGVkLW5hbWU+XX0/IEAKLSAgY29uc3QgRGVjbENvbnRleHQgKkRDID0gTkQtPmdldERlY2xDb250ZXh0KCk7CiAKICAgLy8gQWx3YXlzIHN0YXJ0IHdpdGggdGhlIHVucXVhbGlmaWVkIG5hbWUuCi0gIG1hbmdsZVVucXVhbGlmaWVkTmFtZShORCk7ICAgIAorICBtYW5nbGVVbnF1YWxpZmllZE5hbWUoTkQpOwogCi0gIC8vIElmIHRoaXMgaXMgYW4gZXh0ZXJuIHZhcmlhYmxlIGRlY2xhcmVkIGxvY2FsbHksIHRoZSByZWxldmFudCBEZWNsQ29udGV4dAotICAvLyBpcyB0aGF0IG9mIHRoZSBjb250YWluaW5nIG5hbWVzcGFjZSwgb3IgdGhlIHRyYW5zbGF0aW9uIHVuaXQuCi0gIGlmIChpc2E8RnVuY3Rpb25EZWNsPihEQykgJiYgTkQtPmhhc0xpbmthZ2UoKSkKLSAgICB3aGlsZSAoIURDLT5pc05hbWVzcGFjZSgpICYmICFEQy0+aXNUcmFuc2xhdGlvblVuaXQoKSkKLSAgICAgIERDID0gREMtPmdldFBhcmVudCgpOwotCi0gIG1hbmdsZVBvc3RmaXgoREMpOworICBtYW5nbGVOZXN0ZWROYW1lKE5EKTsKIAogICAvLyBUZXJtaW5hdGUgdGhlIHdob2xlIG5hbWUgd2l0aCBhbiAnQCcuCiAgIE91dCA8PCAnQCc7CkBAIC00MzgsNiArNjEzLDEzIEBACiAgICAgcmV0dXJuIFNwZWMtPmdldFNwZWNpYWxpemVkVGVtcGxhdGUoKTsKICAgfQogCisgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSB2YXJpYWJsZSB0ZW1wbGF0ZS4KKyAgaWYgKGNvbnN0IFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpTcGVjID0KKyAgICAgICAgICBkeW5fY2FzdDxWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbD4oTkQpKSB7CisgICAgVGVtcGxhdGVBcmdzID0gJlNwZWMtPmdldFRlbXBsYXRlQXJncygpOworICAgIHJldHVybiBTcGVjLT5nZXRTcGVjaWFsaXplZFRlbXBsYXRlKCk7CisgIH0KKwogICByZXR1cm4gMDsKIH0KIApAQCAtNDYxLDcgKzY0Myw2IEBACiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gV2UgaGF2ZSBhIGNsYXNzIHRlbXBsYXRlLgogICAgIC8vIEhlcmUgY29tZXMgdGhlIHRyaWNreSB0aGluZzogaWYgd2UgbmVlZCB0byBtYW5nbGUgc29tZXRoaW5nIGxpa2UKICAgICAvLyAgIHZvaWQgZm9vKEE6Olg8WT4sIEI6Olg8WT4pLAogICAgIC8vIHRoZSBYPFk+IHBhcnQgaXMgYWxpYXNlZC4gSG93ZXZlciwgaWYgeW91IG5lZWQgdG8gbWFuZ2xlCkBAIC01MDYsMTcgKzY4NywzMSBAQAogICAgICAgICBtYW5nbGVTb3VyY2VOYW1lKElJLT5nZXROYW1lKCkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBPdGhlcndpc2UsIGFuIGFub255bW91cyBlbnRpdHkuICBXZSBtdXN0IGhhdmUgYSBkZWNsYXJhdGlvbi4KICAgICAgIGFzc2VydChORCAmJiAibWFuZ2xpbmcgZW1wdHkgbmFtZSB3aXRob3V0IGRlY2xhcmF0aW9uIik7Ci0gICAgICAKKwogICAgICAgaWYgKGNvbnN0IE5hbWVzcGFjZURlY2wgKk5TID0gZHluX2Nhc3Q8TmFtZXNwYWNlRGVjbD4oTkQpKSB7CiAgICAgICAgIGlmIChOUy0+aXNBbm9ueW1vdXNOYW1lc3BhY2UoKSkgewogICAgICAgICAgIE91dCA8PCAiP0FAIjsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQotICAgICAgCisKKyAgICAgIGlmIChjb25zdCBWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KE5EKSkgeworICAgICAgICAvLyBXZSBtdXN0IGhhdmUgYW4gYW5vbnltb3VzIHVuaW9uIG9yIHN0cnVjdCBkZWNsYXJhdGlvbi4KKyAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBWRC0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKKyAgICAgICAgYXNzZXJ0KFJEICYmICJleHBlY3RlZCB2YXJpYWJsZSBkZWNsIHRvIGhhdmUgYSByZWNvcmQgdHlwZSIpOworICAgICAgICAvLyBBbm9ueW1vdXMgdHlwZXMgd2l0aCBubyB0YWcgb3IgdHlwZWRlZiBnZXQgdGhlIG5hbWUgb2YgdGhlaXIKKyAgICAgICAgLy8gZGVjbGFyYXRvciBtYW5nbGVkIGluLiAgSWYgdGhleSBoYXZlIG5vIGRlY2xhcmF0b3IsIG51bWJlciB0aGVtIHdpdGgKKyAgICAgICAgLy8gYSAkUyBwcmVmaXguCisgICAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDY0PiBOYW1lKCIkUyIpOworICAgICAgICAvLyBHZXQgYSB1bmlxdWUgaWQgZm9yIHRoZSBhbm9ueW1vdXMgc3RydWN0LgorICAgICAgICBOYW1lICs9IGxsdm06OnV0b3N0cihDb250ZXh0LmdldEFub255bW91c1N0cnVjdElkKFJEKSArIDEpOworICAgICAgICBtYW5nbGVTb3VyY2VOYW1lKE5hbWUuc3RyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKwogICAgICAgLy8gV2UgbXVzdCBoYXZlIGFuIGFub255bW91cyBzdHJ1Y3QuCiAgICAgICBjb25zdCBUYWdEZWNsICpURCA9IGNhc3Q8VGFnRGVjbD4oTkQpOwogICAgICAgaWYgKGNvbnN0IFR5cGVkZWZOYW1lRGVjbCAqRCA9IFRELT5nZXRUeXBlZGVmTmFtZUZvckFub25EZWNsKCkpIHsKQEAgLTUyOCwyNiArNzIzLDQzIEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogCisgICAgICBpZiAoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUmVjb3JkID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4oVEQpKSB7CisgICAgICAgIGlmIChSZWNvcmQtPmlzTGFtYmRhKCkpIHsKKyAgICAgICAgICBsbHZtOjpTbWFsbFN0cmluZzwxMD4gTmFtZSgiPGxhbWJkYV8iKTsKKyAgICAgICAgICB1bnNpZ25lZCBMYW1iZGFJZDsKKyAgICAgICAgICBpZiAoUmVjb3JkLT5nZXRMYW1iZGFNYW5nbGluZ051bWJlcigpKQorICAgICAgICAgICAgTGFtYmRhSWQgPSBSZWNvcmQtPmdldExhbWJkYU1hbmdsaW5nTnVtYmVyKCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgTGFtYmRhSWQgPSBDb250ZXh0LmdldExhbWJkYUlkKFJlY29yZCk7CisKKyAgICAgICAgICBOYW1lICs9IGxsdm06OnV0b3N0cihMYW1iZGFJZCk7CisgICAgICAgICAgTmFtZSArPSAiPiI7CisKKyAgICAgICAgICBtYW5nbGVTb3VyY2VOYW1lKE5hbWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDY0PiBOYW1lKCI8dW5uYW1lZC10eXBlLSIpOwogICAgICAgaWYgKFRELT5oYXNEZWNsYXJhdG9yRm9yQW5vbkRlY2woKSkgewogICAgICAgICAvLyBBbm9ueW1vdXMgdHlwZXMgd2l0aCBubyB0YWcgb3IgdHlwZWRlZiBnZXQgdGhlIG5hbWUgb2YgdGhlaXIKLSAgICAgICAgLy8gZGVjbGFyYXRvciBtYW5nbGVkIGluLgotICAgICAgICBsbHZtOjpTbWFsbFN0cmluZzw2ND4gTmFtZSgiPHVubmFtZWQtdHlwZS0iKTsKKyAgICAgICAgLy8gZGVjbGFyYXRvciBtYW5nbGVkIGluIGlmIHRoZXkgaGF2ZSBvbmUuCiAgICAgICAgIE5hbWUgKz0gVEQtPmdldERlY2xhcmF0b3JGb3JBbm9uRGVjbCgpLT5nZXROYW1lKCk7Ci0gICAgICAgIE5hbWUgKz0gIj4iOwotICAgICAgICBtYW5nbGVTb3VyY2VOYW1lKE5hbWUuc3RyKCkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQW5vbnltb3VzIHR5cGVzIHdpdGggbm8gdGFnLCBubyB0eXBlZGVmLCBvciBkZWNsYXJhdG9yIGdldAotICAgICAgICAvLyAnPHVubmFtZWQtdGFnPicuCi0gICAgICAgIG1hbmdsZVNvdXJjZU5hbWUoIjx1bm5hbWVkLXRhZz4iKTsKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBudW1iZXIgdGhlIHR5cGVzIHVzaW5nIGEgJFMgcHJlZml4LgorICAgICAgICBOYW1lICs9ICIkUyI7CisgICAgICAgIE5hbWUgKz0gbGx2bTo6dXRvc3RyKENvbnRleHQuZ2V0QW5vbnltb3VzU3RydWN0SWQoVEQpKTsKICAgICAgIH0KKyAgICAgIE5hbWUgKz0gIj4iOworICAgICAgbWFuZ2xlU291cmNlTmFtZShOYW1lLnN0cigpKTsKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICAgIAorCiAgICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6Ok9iakNaZXJvQXJnU2VsZWN0b3I6CiAgICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6Ok9iakNPbmVBcmdTZWxlY3RvcjoKICAgICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6T2JqQ011bHRpQXJnU2VsZWN0b3I6CiAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJDYW4ndCBtYW5nbGUgT2JqZWN0aXZlLUMgc2VsZWN0b3IgbmFtZXMgaGVyZSEiKTsKLSAgICAgIAorCiAgICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWENvbnN0cnVjdG9yTmFtZToKICAgICAgIGlmIChORCA9PSBTdHJ1Y3RvcikgewogICAgICAgICBhc3NlcnQoU3RydWN0b3JUeXBlID09IEN0b3JfQ29tcGxldGUgJiYKQEAgLTU1NSw3ICs3NjcsNyBAQAogICAgICAgfQogICAgICAgT3V0IDw8ICI/MCI7CiAgICAgICBicmVhazsKLSAgICAgIAorCiAgICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWERlc3RydWN0b3JOYW1lOgogICAgICAgaWYgKE5EID09IFN0cnVjdG9yKQogICAgICAgICAvLyBJZiB0aGUgbmFtZWQgZGVjbCBpcyB0aGUgQysrIGRlc3RydWN0b3Igd2UncmUgbWFuZ2xpbmcsCkBAIC01NjYsMTcgKzc3OCwxNyBAQAogICAgICAgICAvLyBjbGFzcyB3aXRoIGEgZGVzdHJ1Y3RvciBpcyBkZWNsYXJlZCB3aXRoaW4gYSBkZXN0cnVjdG9yLgogICAgICAgICBtYW5nbGVDWFhEdG9yVHlwZShEdG9yX0Jhc2UpOwogICAgICAgYnJlYWs7Ci0gICAgICAKKwogICAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhDb252ZXJzaW9uRnVuY3Rpb25OYW1lOgogICAgICAgLy8gPG9wZXJhdG9yLW5hbWU+IDo6PSA/QiAjIChjYXN0KQogICAgICAgLy8gVGhlIHRhcmdldCB0eXBlIGlzIGVuY29kZWQgYXMgdGhlIHJldHVybiB0eXBlLgogICAgICAgT3V0IDw8ICI/QiI7CiAgICAgICBicmVhazsKLSAgICAgIAorCiAgICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWE9wZXJhdG9yTmFtZToKICAgICAgIG1hbmdsZU9wZXJhdG9yTmFtZShOYW1lLmdldENYWE92ZXJsb2FkZWRPcGVyYXRvcigpLCBORC0+Z2V0TG9jYXRpb24oKSk7CiAgICAgICBicmVhazsKLSAgICAgIAorCiAgICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWExpdGVyYWxPcGVyYXRvck5hbWU6IHsKICAgICAgIC8vIEZJWE1FOiBXYXMgdGhpcyBhZGRlZCBpbiBWUzIwMTA/IERvZXMgTVMgZXZlbiBrbm93IGhvdyB0byBtYW5nbGUgdGhpcz8KICAgICAgIERpYWdub3N0aWNzRW5naW5lIERpYWdzID0gQ29udGV4dC5nZXREaWFncygpOwpAQCAtNTg1LDUxICs3OTcsNTMgQEAKICAgICAgIERpYWdzLlJlcG9ydChORC0+Z2V0TG9jYXRpb24oKSwgRGlhZ0lEKTsKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICAgIAorCiAgICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWFVzaW5nRGlyZWN0aXZlOgogICAgICAgbGx2bV91bnJlYWNoYWJsZSgiQ2FuJ3QgbWFuZ2xlIGEgdXNpbmcgZGlyZWN0aXZlIG5hbWUhIik7CiAgIH0KIH0KIAotdm9pZCBNaWNyb3NvZnRDWFhOYW1lTWFuZ2xlcjo6bWFuZ2xlUG9zdGZpeChjb25zdCBEZWNsQ29udGV4dCAqREMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9GdW5jdGlvbikgewordm9pZCBNaWNyb3NvZnRDWFhOYW1lTWFuZ2xlcjo6bWFuZ2xlTmVzdGVkTmFtZShjb25zdCBOYW1lZERlY2wgKk5EKSB7CiAgIC8vIDxwb3N0Zml4PiA6Oj0gPHVucXVhbGlmaWVkLW5hbWU+IFs8cG9zdGZpeD5dCiAgIC8vICAgICAgICAgICA6Oj0gPHN1YnN0aXR1dGlvbj4gWzxwb3N0Zml4Pl0KKyAgaWYgKGlzTGFtYmRhKE5EKSkKKyAgICByZXR1cm47CiAKLSAgaWYgKCFEQykgcmV0dXJuOworICBjb25zdCBEZWNsQ29udGV4dCAqREMgPSBORC0+Z2V0RGVjbENvbnRleHQoKTsKIAotICB3aGlsZSAoaXNhPExpbmthZ2VTcGVjRGVjbD4oREMpKQorICB3aGlsZSAoIURDLT5pc1RyYW5zbGF0aW9uVW5pdCgpKSB7CisgICAgaWYgKGlzYTxUYWdEZWNsPihORCkgfHwgaXNhPFZhckRlY2w+KE5EKSkgeworICAgICAgdW5zaWduZWQgRGlzYzsKKyAgICAgIGlmIChDb250ZXh0LmdldE5leHREaXNjcmltaW5hdG9yKE5ELCBEaXNjKSkgeworICAgICAgICBPdXQgPDwgJz8nOworICAgICAgICBtYW5nbGVOdW1iZXIoRGlzYyk7CisgICAgICAgIE91dCA8PCAnPyc7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvbnN0IEJsb2NrRGVjbCAqQkQgPSBkeW5fY2FzdDxCbG9ja0RlY2w+KERDKSkgeworICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgRGlhZ3MgPSBDb250ZXh0LmdldERpYWdzKCk7CisgICAgICB1bnNpZ25lZCBEaWFnSUQgPQorICAgICAgICAgIERpYWdzLmdldEN1c3RvbURpYWdJRChEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgbWFuZ2xlIGEgbG9jYWwgaW5zaWRlIHRoaXMgYmxvY2sgeWV0Iik7CisgICAgICBEaWFncy5SZXBvcnQoQkQtPmdldExvY2F0aW9uKCksIERpYWdJRCk7CisKKyAgICAgIC8vIEZJWE1FOiBUaGlzIGlzIGNvbXBsZXRlbHksIHV0dGVybHksIHdyb25nOyBzZWUgSXRhbml1bU1hbmdsZQorICAgICAgLy8gZm9yIGhvdyB0aGlzIHNob3VsZCBiZSBkb25lLgorICAgICAgT3V0IDw8ICJfX2Jsb2NrX2ludm9rZSIgPDwgQ29udGV4dC5nZXRCbG9ja0lkKEJELCBmYWxzZSk7CisgICAgICBPdXQgPDwgJ0AnOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmIChjb25zdCBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kID0gZHluX2Nhc3Q8T2JqQ01ldGhvZERlY2w+KERDKSkgeworICAgICAgbWFuZ2xlT2JqQ01ldGhvZE5hbWUoTWV0aG9kKTsKKyAgICB9IGVsc2UgaWYgKGlzYTxOYW1lZERlY2w+KERDKSkgeworICAgICAgTkQgPSBjYXN0PE5hbWVkRGVjbD4oREMpOworICAgICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KE5EKSkgeworICAgICAgICBtYW5nbGUoRkQsICI/Iik7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlCisgICAgICAgIG1hbmdsZVVucXVhbGlmaWVkTmFtZShORCk7CisgICAgfQogICAgIERDID0gREMtPmdldFBhcmVudCgpOwotCi0gIGlmIChEQy0+aXNUcmFuc2xhdGlvblVuaXQoKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGNvbnN0IEJsb2NrRGVjbCAqQkQgPSBkeW5fY2FzdDxCbG9ja0RlY2w+KERDKSkgewotICAgIERpYWdub3N0aWNzRW5naW5lIERpYWdzID0gQ29udGV4dC5nZXREaWFncygpOwotICAgIHVuc2lnbmVkIERpYWdJRCA9IERpYWdzLmdldEN1c3RvbURpYWdJRChEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3IsCi0gICAgICAiY2Fubm90IG1hbmdsZSBhIGxvY2FsIGluc2lkZSB0aGlzIGJsb2NrIHlldCIpOwotICAgIERpYWdzLlJlcG9ydChCRC0+Z2V0TG9jYXRpb24oKSwgRGlhZ0lEKTsKLQotICAgIC8vIEZJWE1FOiBUaGlzIGlzIGNvbXBsZXRlbHksIHV0dGVybHksIHdyb25nOyBzZWUgSXRhbml1bU1hbmdsZQotICAgIC8vIGZvciBob3cgdGhpcyBzaG91bGQgYmUgZG9uZS4KLSAgICBPdXQgPDwgIl9fYmxvY2tfaW52b2tlIiA8PCBDb250ZXh0LmdldEJsb2NrSWQoQkQsIGZhbHNlKTsKLSAgICBPdXQgPDwgJ0AnOwotICAgIHJldHVybiBtYW5nbGVQb3N0Zml4KERDLT5nZXRQYXJlbnQoKSwgTm9GdW5jdGlvbik7Ci0gIH0gZWxzZSBpZiAoaXNhPENhcHR1cmVkRGVjbD4oREMpKSB7Ci0gICAgLy8gU2tpcCBDYXB0dXJlZERlY2wgY29udGV4dC4KLSAgICBtYW5nbGVQb3N0Zml4KERDLT5nZXRQYXJlbnQoKSwgTm9GdW5jdGlvbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKE5vRnVuY3Rpb24gJiYgKGlzYTxGdW5jdGlvbkRlY2w+KERDKSB8fCBpc2E8T2JqQ01ldGhvZERlY2w+KERDKSkpCi0gICAgcmV0dXJuOwotICBlbHNlIGlmIChjb25zdCBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kID0gZHluX2Nhc3Q8T2JqQ01ldGhvZERlY2w+KERDKSkKLSAgICBtYW5nbGVPYmpDTWV0aG9kTmFtZShNZXRob2QpOwotICBlbHNlIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKkZ1bmMgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KERDKSkKLSAgICBtYW5nbGVMb2NhbE5hbWUoRnVuYyk7Ci0gIGVsc2UgewotICAgIG1hbmdsZVVucXVhbGlmaWVkTmFtZShjYXN0PE5hbWVkRGVjbD4oREMpKTsKLSAgICBtYW5nbGVQb3N0Zml4KERDLT5nZXRQYXJlbnQoKSwgTm9GdW5jdGlvbik7CiAgIH0KIH0KIApAQCAtNzY4LDcgKzk4Miw3IEBACiAgIGNhc2UgT09fQXJyYXlfTmV3OiBPdXQgPDwgIj9fVSI7IGJyZWFrOwogICAvLyA8b3BlcmF0b3ItbmFtZT4gOjo9ID9fViAjIGRlbGV0ZVtdCiAgIGNhc2UgT09fQXJyYXlfRGVsZXRlOiBPdXQgPDwgIj9fViI7IGJyZWFrOwotICAgIAorCiAgIGNhc2UgT09fQ29uZGl0aW9uYWw6IHsKICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MgPSBDb250ZXh0LmdldERpYWdzKCk7CiAgICAgdW5zaWduZWQgRGlhZ0lEID0gRGlhZ3MuZ2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNzRW5naW5lOjpFcnJvciwKQEAgLTc3Niw3ICs5OTAsNyBAQAogICAgIERpYWdzLlJlcG9ydChMb2MsIERpYWdJRCk7CiAgICAgYnJlYWs7CiAgIH0KLSAgICAKKwogICBjYXNlIE9PX05vbmU6CiAgIGNhc2UgTlVNX09WRVJMT0FERURfT1BFUkFUT1JTOgogICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vdCBhbiBvdmVybG9hZGVkIG9wZXJhdG9yIik7CkBAIC04MDMsNDQgKzEwMTcsNiBAQAogICBDb250ZXh0Lm1hbmdsZU9iakNNZXRob2ROYW1lKE1ELCBPdXQpOwogfQogCi0vLyBGaW5kIG91dCBob3cgbWFueSBmdW5jdGlvbiBkZWNscyBsaXZlIGFib3ZlIHRoaXMgb25lIGFuZCByZXR1cm4gYW4gaW50ZWdlcgotLy8gc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgbnVtYmVyIGluIGEgbnVtYmVyZWQgYW5vbnltb3VzIHNjb3BlLgotLy8gVE9ETzogTWVtb2l6ZS4KLXN0YXRpYyB1bnNpZ25lZCBnZXRMb2NhbE5lc3RpbmdMZXZlbChjb25zdCBGdW5jdGlvbkRlY2wgKkZEKSB7Ci0gIGNvbnN0IERlY2xDb250ZXh0ICpEQyA9IEZELT5nZXRQYXJlbnQoKTsKLSAgaW50IGxldmVsID0gMTsKLQotICB3aGlsZSAoREMgJiYgIURDLT5pc1RyYW5zbGF0aW9uVW5pdCgpKSB7Ci0gICAgaWYgKGlzYTxGdW5jdGlvbkRlY2w+KERDKSB8fCBpc2E8T2JqQ01ldGhvZERlY2w+KERDKSkgbGV2ZWwrKzsKLSAgICBEQyA9IERDLT5nZXRQYXJlbnQoKTsKLSAgfQotCi0gIHJldHVybiAyKmxldmVsOwotfQotCi12b2lkIE1pY3Jvc29mdENYWE5hbWVNYW5nbGVyOjptYW5nbGVMb2NhbE5hbWUoY29uc3QgRnVuY3Rpb25EZWNsICpGRCkgewotICAvLyA8bmVzdGVkLW5hbWU+IDo6PSA8bnVtYmVyZWQtYW5vbnltb3VzLXNjb3BlPiA/IDxtYW5nbGVkLW5hbWU+Ci0gIC8vIDxudW1iZXJlZC1hbm9ueW1vdXMtc2NvcGU+IDo6PSA/IDxudW1iZXI+Ci0gIC8vIEV2ZW4gdGhvdWdoIHRoZSBuYW1lIGlzIHJlbmRlcmVkIGluIHJldmVyc2Ugb3JkZXIgKGUuZy4KLSAgLy8gQTo6Qjo6QyBpcyByZW5kZXJlZCBhcyBDQEJAQSksIFZDIG51bWJlcnMgdGhlIHNjb3BlcyBmcm9tIG91dGVybW9zdCB0bwotICAvLyBpbm5lcm1vc3QuIFNvIGEgbWV0aG9kIGJhciBpbiBjbGFzcyBDIGxvY2FsIHRvIGZ1bmN0aW9uIGZvbyBnZXRzIG1hbmdsZWQKLSAgLy8gYXMgc29tZXRoaW5nIGxpa2U6Ci0gIC8vID9iYXJAQ0A/MT8/Zm9vQEBZQVhYWkBRQUVYWFoKLSAgLy8gVGhpcyBpcyBtb3JlIGFwcGFyZW50IHdoZW4geW91IGhhdmUgYSB0eXBlIG5lc3RlZCBpbnNpZGUgYSBtZXRob2Qgb2YgYQotICAvLyB0eXBlIG5lc3RlZCBpbnNpZGUgYSBmdW5jdGlvbi4gQSBtZXRob2QgYmF6IGluIGNsYXNzIEQgbG9jYWwgdG8gbWV0aG9kCi0gIC8vIGJhciBvZiBjbGFzcyBDIGxvY2FsIHRvIGZ1bmN0aW9uIGZvbyBnZXRzIG1hbmdsZWQgYXM6Ci0gIC8vID9iYXpAREA/Mz8/YmFyQENAPzE/P2Zvb0BAWUFYWFpAUUFFWFhaQFFBRVhYWgotICAvLyBUaGlzIHNjaGVtZSBpcyBnZW5lcmFsIGVub3VnaCB0byBzdXBwb3J0IEdDQy1zdHlsZSBuZXN0ZWQKLSAgLy8gZnVuY3Rpb25zLiBZb3UgY291bGQgaGF2ZSBhIG1ldGhvZCBiYXogb2YgY2xhc3MgQyBpbnNpZGUgYSBmdW5jdGlvbiBiYXIKLSAgLy8gaW5zaWRlIGEgZnVuY3Rpb24gZm9vLCBsaWtlIHNvOgotICAvLyA/YmF6QENAPzM/P2JhckA/MT8/Zm9vQEBZQVhYWkBZQVhYWkBRQUVYWFoKLSAgdW5zaWduZWQgTmVzdExldmVsID0gZ2V0TG9jYWxOZXN0aW5nTGV2ZWwoRkQpOwotICBPdXQgPDwgJz8nOwotICBtYW5nbGVOdW1iZXIoTmVzdExldmVsKTsKLSAgT3V0IDw8ICc/JzsKLSAgbWFuZ2xlKEZELCAiPyIpOwotfQotCiB2b2lkIE1pY3Jvc29mdENYWE5hbWVNYW5nbGVyOjptYW5nbGVUZW1wbGF0ZUluc3RhbnRpYXRpb25OYW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVEZWNsICpURCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MpIHsKQEAgLTkyNSwyMCArMTEwMSwyNSBAQAogICAgIDw8IEUtPmdldFN0bXRDbGFzc05hbWUoKSA8PCBFLT5nZXRTb3VyY2VSYW5nZSgpOwogfQogCi12b2lkCi1NaWNyb3NvZnRDWFhOYW1lTWFuZ2xlcjo6bWFuZ2xlVGVtcGxhdGVBcmdzKGNvbnN0IFRlbXBsYXRlRGVjbCAqVEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncykgewotICAvLyA8dGVtcGxhdGUtYXJncz4gOjo9IHs8dHlwZT4gfCA8aW50ZWdlci1saXRlcmFsPn0rIEAKLSAgdW5zaWduZWQgTnVtVGVtcGxhdGVBcmdzID0gVGVtcGxhdGVBcmdzLnNpemUoKTsKLSAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bVRlbXBsYXRlQXJnczsgKytpKSB7Ci0gICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmVEEgPSBUZW1wbGF0ZUFyZ3NbaV07Cit2b2lkIE1pY3Jvc29mdENYWE5hbWVNYW5nbGVyOjptYW5nbGVUZW1wbGF0ZUFyZ3MoCisgICAgY29uc3QgVGVtcGxhdGVEZWNsICpURCwgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncykgeworICAvLyA8dGVtcGxhdGUtYXJncz4gOjo9IDx0ZW1wbGF0ZS1hcmc+KyBACisgIGZvciAoY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmVEEgOiBUZW1wbGF0ZUFyZ3MuYXNBcnJheSgpKQogICAgIG1hbmdsZVRlbXBsYXRlQXJnKFRELCBUQSk7Ci0gIH0KICAgT3V0IDw8ICdAJzsKIH0KIAogdm9pZCBNaWNyb3NvZnRDWFhOYW1lTWFuZ2xlcjo6bWFuZ2xlVGVtcGxhdGVBcmcoY29uc3QgVGVtcGxhdGVEZWNsICpURCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJlRBKSB7CisgIC8vIDx0ZW1wbGF0ZS1hcmc+IDo6PSA8dHlwZT4KKyAgLy8gICAgICAgICAgICAgICAgOjo9IDxpbnRlZ2VyLWxpdGVyYWw+CisgIC8vICAgICAgICAgICAgICAgIDo6PSA8bWVtYmVyLWRhdGEtcG9pbnRlcj4KKyAgLy8gICAgICAgICAgICAgICAgOjo9IDxtZW1iZXItZnVuY3Rpb24tcG9pbnRlcj4KKyAgLy8gICAgICAgICAgICAgICAgOjo9ICRFPyA8bmFtZT4gPHR5cGUtZW5jb2Rpbmc+CisgIC8vICAgICAgICAgICAgICAgIDo6PSAkMT8gPG5hbWU+IDx0eXBlLWVuY29kaW5nPgorICAvLyAgICAgICAgICAgICAgICA6Oj0gJDBBQAorICAvLyAgICAgICAgICAgICAgICA6Oj0gPHRlbXBsYXRlLWFyZ3M+CisKICAgc3dpdGNoIChUQS5nZXRLaW5kKCkpIHsKICAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpOdWxsOgogICAgIGxsdm1fdW5yZWFjaGFibGUoIkNhbid0IG1hbmdsZSBudWxsIHRlbXBsYXRlIGFyZ3VtZW50cyEiKTsKQEAgLTk1MSwxNiArMTEzMiwzOCBAQAogICB9CiAgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6RGVjbGFyYXRpb246IHsKICAgICBjb25zdCBOYW1lZERlY2wgKk5EID0gY2FzdDxOYW1lZERlY2w+KFRBLmdldEFzRGVjbCgpKTsKLSAgICBtYW5nbGUoTkQsIFRBLmlzRGVjbEZvclJlZmVyZW5jZVBhcmFtKCkgPyAiJEU/IiA6ICIkMT8iKTsKKyAgICBpZiAoaXNhPEZpZWxkRGVjbD4oTkQpIHx8IGlzYTxJbmRpcmVjdEZpZWxkRGVjbD4oTkQpKSB7CisgICAgICBtYW5nbGVNZW1iZXJEYXRhUG9pbnRlcigKKyAgICAgICAgICBjYXN0PENYWFJlY29yZERlY2w+KE5ELT5nZXREZWNsQ29udGV4dCgpKS0+Z2V0TW9zdFJlY2VudERlY2woKSwKKyAgICAgICAgICBjYXN0PFZhbHVlRGVjbD4oTkQpKTsKKyAgICB9IGVsc2UgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KE5EKSkgeworICAgICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPihGRCk7CisgICAgICBpZiAoTUQgJiYgTUQtPmlzSW5zdGFuY2UoKSkKKyAgICAgICAgbWFuZ2xlTWVtYmVyRnVuY3Rpb25Qb2ludGVyKE1ELT5nZXRQYXJlbnQoKS0+Z2V0TW9zdFJlY2VudERlY2woKSwgTUQpOworICAgICAgZWxzZQorICAgICAgICBtYW5nbGUoRkQsICIkMT8iKTsKKyAgICB9IGVsc2UgeworICAgICAgbWFuZ2xlKE5ELCBUQS5pc0RlY2xGb3JSZWZlcmVuY2VQYXJhbSgpID8gIiRFPyIgOiAiJDE/Iik7CisgICAgfQogICAgIGJyZWFrOwogICB9CiAgIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6SW50ZWdyYWw6CiAgICAgbWFuZ2xlSW50ZWdlckxpdGVyYWwoVEEuZ2V0QXNJbnRlZ3JhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRBLmdldEludGVncmFsVHlwZSgpLT5pc0Jvb2xlYW5UeXBlKCkpOwogICAgIGJyZWFrOwotICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6Ok51bGxQdHI6Ci0gICAgT3V0IDw8ICIkMEFAIjsKKyAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpOdWxsUHRyOiB7CisgICAgUXVhbFR5cGUgVCA9IFRBLmdldE51bGxQdHJUeXBlKCk7CisgICAgaWYgKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQgPSBULT5nZXRBczxNZW1iZXJQb2ludGVyVHlwZT4oKSkgeworICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBNUFQtPmdldE1vc3RSZWNlbnRDWFhSZWNvcmREZWNsKCk7CisgICAgICBpZiAoTVBULT5pc01lbWJlckZ1bmN0aW9uUG9pbnRlclR5cGUoKSkKKyAgICAgICAgbWFuZ2xlTWVtYmVyRnVuY3Rpb25Qb2ludGVyKFJELCAwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbWFuZ2xlTWVtYmVyRGF0YVBvaW50ZXIoUkQsIDApOworICAgIH0gZWxzZSB7CisgICAgICBPdXQgPDwgIiQwQUAiOworICAgIH0KICAgICBicmVhazsKKyAgfQogICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OkV4cHJlc3Npb246CiAgICAgbWFuZ2xlRXhwcmVzc2lvbihUQS5nZXRBc0V4cHIoKSk7CiAgICAgYnJlYWs7CkBAIC0xMDU5LDEzICsxMjYyLDI1IEBACiAgIC8vIEZJWE1FOiBGb3Igbm93LCBqdXN0IGRyb3AgYWxsIGV4dGVuc2lvbiBxdWFsaWZpZXJzIG9uIHRoZSBmbG9vci4KIH0KIAotdm9pZCBNaWNyb3NvZnRDWFhOYW1lTWFuZ2xlcjo6bWFuZ2xlUG9pbnRlclF1YWxpZmllcnMoUXVhbGlmaWVycyBRdWFscykgewotICAvLyA8cG9pbnRlci1jdnItcXVhbGlmaWVycz4gOjo9IFAgICMgbm8gcXVhbGlmaWVycwotICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgOjo9IFEgICMgY29uc3QKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIDo6PSBSICAjIHZvbGF0aWxlCi0gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gUyAgIyBjb25zdCB2b2xhdGlsZQordm9pZAorTWljcm9zb2Z0Q1hYTmFtZU1hbmdsZXI6Om1hbmdsZVBvaW50ZXJFeHRRdWFsaWZpZXJzKFF1YWxpZmllcnMgUXVhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSAqUG9pbnRlZVR5cGUpIHsKKyAgYm9vbCBIYXNSZXN0cmljdCA9IFF1YWxzLmhhc1Jlc3RyaWN0KCk7CisgIGlmIChQb2ludGVyc0FyZTY0Qml0ICYmICghUG9pbnRlZVR5cGUgfHwgIVBvaW50ZWVUeXBlLT5pc0Z1bmN0aW9uVHlwZSgpKSkKKyAgICBPdXQgPDwgJ0UnOworCisgIGlmIChIYXNSZXN0cmljdCkKKyAgICBPdXQgPDwgJ0knOworfQorCit2b2lkIE1pY3Jvc29mdENYWE5hbWVNYW5nbGVyOjptYW5nbGVQb2ludGVyQ1ZRdWFsaWZpZXJzKFF1YWxpZmllcnMgUXVhbHMpIHsKKyAgLy8gPHBvaW50ZXItY3YtcXVhbGlmaWVycz4gOjo9IFAgICMgbm8gcXVhbGlmaWVycworICAvLyAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gUSAgIyBjb25zdAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gUiAgIyB2b2xhdGlsZQorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICA6Oj0gUyAgIyBjb25zdCB2b2xhdGlsZQogICBib29sIEhhc0NvbnN0ID0gUXVhbHMuaGFzQ29uc3QoKSwKICAgICAgICBIYXNWb2xhdGlsZSA9IFF1YWxzLmhhc1ZvbGF0aWxlKCk7CisKICAgaWYgKEhhc0NvbnN0ICYmIEhhc1ZvbGF0aWxlKSB7CiAgICAgT3V0IDw8ICdTJzsKICAgfSBlbHNlIGlmIChIYXNWb2xhdGlsZSkgewpAQCAtMTE2NSw4ICsxMzgwLDEwIEBACiAgIH0KIAogICAvLyBXZSBoYXZlIHRvIG1hbmdsZSB0aGVzZSBub3csIHdoaWxlIHdlIHN0aWxsIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uLgotICBpZiAoSXNQb2ludGVyKQotICAgIG1hbmdsZVBvaW50ZXJRdWFsaWZpZXJzKFF1YWxzKTsKKyAgaWYgKElzUG9pbnRlcikgeworICAgIG1hbmdsZVBvaW50ZXJDVlF1YWxpZmllcnMoUXVhbHMpOworICAgIG1hbmdsZVBvaW50ZXJFeHRRdWFsaWZpZXJzKFF1YWxzLCBULT5nZXRQb2ludGVlVHlwZSgpLmdldFR5cGVQdHIoKSk7CisgIH0KICAgY29uc3QgVHlwZSAqdHkgPSBULmdldFR5cGVQdHIoKTsKIAogICBzd2l0Y2ggKHR5LT5nZXRUeXBlQ2xhc3MoKSkgewpAQCAtMTI1NCw3ICsxNDcxLDcgQEAKICAgY2FzZSBCdWlsdGluVHlwZTo6T0NMSW1hZ2UzZDogT3V0IDw8ICJQQVVvY2xfaW1hZ2UzZEBAIjsgYnJlYWs7CiAgIGNhc2UgQnVpbHRpblR5cGU6Ok9DTFNhbXBsZXI6IE91dCA8PCAiUEFVb2NsX3NhbXBsZXJAQCI7IGJyZWFrOwogICBjYXNlIEJ1aWx0aW5UeXBlOjpPQ0xFdmVudDogT3V0IDw8ICJQQVVvY2xfZXZlbnRAQCI7IGJyZWFrOwotIAorCiAgIGNhc2UgQnVpbHRpblR5cGU6Ok51bGxQdHI6IE91dCA8PCAiJCRUIjsgYnJlYWs7CiAKICAgY2FzZSBCdWlsdGluVHlwZTo6Q2hhcjE2OgpAQCAtMTMwNiw5ICsxNTIzLDkgQEAKICAgLy8gSWYgdGhpcyBpcyBhIEMrKyBpbnN0YW5jZSBtZXRob2QsIG1hbmdsZSB0aGUgQ1ZSIHF1YWxpZmllcnMgZm9yIHRoZQogICAvLyB0aGlzIHBvaW50ZXIuCiAgIGlmIChJc0luc3RNZXRob2QpIHsKLSAgICBpZiAoUG9pbnRlcnNBcmU2NEJpdCkKLSAgICAgIE91dCA8PCAnRSc7Ci0gICAgbWFuZ2xlUXVhbGlmaWVycyhRdWFsaWZpZXJzOjpmcm9tQ1ZSTWFzayhQcm90by0+Z2V0VHlwZVF1YWxzKCkpLCBmYWxzZSk7CisgICAgUXVhbGlmaWVycyBRdWFscyA9IFF1YWxpZmllcnM6OmZyb21DVlJNYXNrKFByb3RvLT5nZXRUeXBlUXVhbHMoKSk7CisgICAgbWFuZ2xlUG9pbnRlckV4dFF1YWxpZmllcnMoUXVhbHMsIDApOworICAgIG1hbmdsZVF1YWxpZmllcnMoUXVhbHMsIGZhbHNlKTsKICAgfQogCiAgIG1hbmdsZUNhbGxpbmdDb252ZW50aW9uKFQpOwpAQCAtMTMyNywyMyArMTU0NCwzMCBAQAogICAgIH0KICAgICBPdXQgPDwgJ0AnOwogICB9IGVsc2UgewotICAgIFF1YWxUeXBlIFJlc3VsdFR5cGUgPSBQcm90by0+Z2V0UmVzdWx0VHlwZSgpOwotICAgIGlmIChSZXN1bHRUeXBlLT5pc1ZvaWRUeXBlKCkpCi0gICAgICBSZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKLSAgICBtYW5nbGVUeXBlKFJlc3VsdFR5cGUsIFJhbmdlLCBRTU1fUmVzdWx0KTsKKyAgICBRdWFsVHlwZSBSZXN1bHRUeXBlID0gUHJvdG8tPmdldFJldHVyblR5cGUoKTsKKyAgICBpZiAoY29uc3QgYXV0byAqQVQgPQorICAgICAgICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxBdXRvVHlwZT4oUmVzdWx0VHlwZS0+Z2V0Q29udGFpbmVkQXV0b1R5cGUoKSkpIHsKKyAgICAgIE91dCA8PCAnPyc7CisgICAgICBtYW5nbGVRdWFsaWZpZXJzKFJlc3VsdFR5cGUuZ2V0TG9jYWxRdWFsaWZpZXJzKCksIC8qSXNNZW1iZXI9Ki9mYWxzZSk7CisgICAgICBPdXQgPDwgJz8nOworICAgICAgbWFuZ2xlU291cmNlTmFtZShBVC0+aXNEZWNsdHlwZUF1dG8oKSA/ICI8ZGVjbHR5cGUtYXV0bz4iIDogIjxhdXRvPiIpOworICAgICAgT3V0IDw8ICdAJzsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKFJlc3VsdFR5cGUtPmlzVm9pZFR5cGUoKSkKKyAgICAgICAgUmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CisgICAgICBtYW5nbGVUeXBlKFJlc3VsdFR5cGUsIFJhbmdlLCBRTU1fUmVzdWx0KTsKKyAgICB9CiAgIH0KIAogICAvLyA8YXJndW1lbnQtbGlzdD4gOjo9IFggIyB2b2lkCiAgIC8vICAgICAgICAgICAgICAgICA6Oj0gPHR5cGU+KyBACiAgIC8vICAgICAgICAgICAgICAgICA6Oj0gPHR5cGU+KiBaICMgdmFyYXJncwotICBpZiAoUHJvdG8tPmdldE51bUFyZ3MoKSA9PSAwICYmICFQcm90by0+aXNWYXJpYWRpYygpKSB7CisgIGlmIChQcm90by0+Z2V0TnVtUGFyYW1zKCkgPT0gMCAmJiAhUHJvdG8tPmlzVmFyaWFkaWMoKSkgewogICAgIE91dCA8PCAnWCc7CiAgIH0gZWxzZSB7CiAgICAgLy8gSGFwcGVucyBmb3IgZnVuY3Rpb24gcG9pbnRlciB0eXBlIGFyZ3VtZW50cyBmb3IgZXhhbXBsZS4KLSAgICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjphcmdfdHlwZV9pdGVyYXRvciBBcmcgPSBQcm90by0+YXJnX3R5cGVfYmVnaW4oKSwKLSAgICAgICAgIEFyZ0VuZCA9IFByb3RvLT5hcmdfdHlwZV9lbmQoKTsKLSAgICAgICAgIEFyZyAhPSBBcmdFbmQ7ICsrQXJnKQotICAgICAgbWFuZ2xlQXJndW1lbnRUeXBlKCpBcmcsIFJhbmdlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkFyZyA6IFByb3RvLT5wYXJhbV90eXBlcygpKQorICAgICAgbWFuZ2xlQXJndW1lbnRUeXBlKEFyZywgUmFuZ2UpOwogICAgIC8vIDxidWlsdGluLXR5cGU+ICAgICAgOjo9IFogICMgZWxsaXBzaXMKICAgICBpZiAoUHJvdG8tPmlzVmFyaWFkaWMoKSkKICAgICAgIE91dCA8PCAnWic7CkBAIC0xNDY1LDcgKzE2ODksNyBAQAogLy8gPHVuaW9uLXR5cGU+ICA6Oj0gVCA8bmFtZT4KIC8vIDxzdHJ1Y3QtdHlwZT4gOjo9IFUgPG5hbWU+CiAvLyA8Y2xhc3MtdHlwZT4gIDo6PSBWIDxuYW1lPgotLy8gPGVudW0tdHlwZT4gICA6Oj0gVyA8c2l6ZT4gPG5hbWU+CisvLyA8ZW51bS10eXBlPiAgIDo6PSBXNCA8bmFtZT4KIHZvaWQgTWljcm9zb2Z0Q1hYTmFtZU1hbmdsZXI6Om1hbmdsZVR5cGUoY29uc3QgRW51bVR5cGUgKlQsIFNvdXJjZVJhbmdlKSB7CiAgIG1hbmdsZVR5cGUoY2FzdDxUYWdUeXBlPihUKS0+Z2V0RGVjbCgpKTsKIH0KQEAgLTE0ODUsOSArMTcwOSw3IEBACiAgICAgICBPdXQgPDwgJ1YnOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBUVEtfRW51bToKLSAgICAgIE91dCA8PCAnVyc7Ci0gICAgICBPdXQgPDwgZ2V0QVNUQ29udGV4dCgpLmdldFR5cGVTaXplSW5DaGFycygKLSAgICAgICAgICAgICAgICBjYXN0PEVudW1EZWNsPihURCktPmdldEludGVnZXJUeXBlKCkpLmdldFF1YW50aXR5KCk7CisgICAgICBPdXQgPDwgIlc0IjsKICAgICAgIGJyZWFrOwogICB9CiAgIG1hbmdsZU5hbWUoVEQpOwpAQCAtMTUwMyw3ICsxNzI1LDcgQEAKIHZvaWQgTWljcm9zb2Z0Q1hYTmFtZU1hbmdsZXI6Om1hbmdsZURlY2F5ZWRBcnJheVR5cGUoY29uc3QgQXJyYXlUeXBlICpUKSB7CiAgIC8vIFRoaXMgaXNuJ3QgYSByZWN1cnNpdmUgbWFuZ2xpbmcsIHNvIG5vdyB3ZSBoYXZlIHRvIGRvIGl0IGFsbCBpbiB0aGlzCiAgIC8vIG9uZSBjYWxsLgotICBtYW5nbGVQb2ludGVyUXVhbGlmaWVycyhULT5nZXRFbGVtZW50VHlwZSgpLmdldFF1YWxpZmllcnMoKSk7CisgIG1hbmdsZVBvaW50ZXJDVlF1YWxpZmllcnMoVC0+Z2V0RWxlbWVudFR5cGUoKS5nZXRRdWFsaWZpZXJzKCkpOwogICBtYW5nbGVUeXBlKFQtPmdldEVsZW1lbnRUeXBlKCksIFNvdXJjZVJhbmdlKCkpOwogfQogdm9pZCBNaWNyb3NvZnRDWFhOYW1lTWFuZ2xlcjo6bWFuZ2xlVHlwZShjb25zdCBDb25zdGFudEFycmF5VHlwZSAqVCwKQEAgLTE1NzUsOCArMTc5Nyw2IEBACiAgICAgbWFuZ2xlTmFtZShULT5nZXRDbGFzcygpLT5jYXN0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKICAgICBtYW5nbGVGdW5jdGlvblR5cGUoRlBULCAwLCB0cnVlKTsKICAgfSBlbHNlIHsKLSAgICBpZiAoUG9pbnRlcnNBcmU2NEJpdCAmJiAhVC0+Z2V0UG9pbnRlZVR5cGUoKS0+aXNGdW5jdGlvblR5cGUoKSkKLSAgICAgIE91dCA8PCAnRSc7CiAgICAgbWFuZ2xlUXVhbGlmaWVycyhQb2ludGVlVHlwZS5nZXRRdWFsaWZpZXJzKCksIHRydWUpOwogICAgIG1hbmdsZU5hbWUoVC0+Z2V0Q2xhc3MoKS0+Y2FzdEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CiAgICAgbWFuZ2xlVHlwZShQb2ludGVlVHlwZSwgUmFuZ2UsIFFNTV9Ecm9wKTsKQEAgLTE2MDQsNDIgKzE4MjQsMzcgQEAKIAogLy8gPHR5cGU+IDo6PSA8cG9pbnRlci10eXBlPgogLy8gPHBvaW50ZXItdHlwZT4gOjo9IEU/IDxwb2ludGVyLWN2ci1xdWFsaWZpZXJzPiA8Y3ZyLXF1YWxpZmllcnM+IDx0eXBlPgotLy8gICAgICAgICAgICAgICAgICAgICAgICMgdGhlIEUgaXMgcmVxdWlyZWQgZm9yIDY0LWJpdCBub24gc3RhdGljIHBvaW50ZXJzCisvLyAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgRSBpcyByZXF1aXJlZCBmb3IgNjQtYml0IG5vbi1zdGF0aWMgcG9pbnRlcnMKIHZvaWQgTWljcm9zb2Z0Q1hYTmFtZU1hbmdsZXI6Om1hbmdsZVR5cGUoY29uc3QgUG9pbnRlclR5cGUgKlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlKSB7CiAgIFF1YWxUeXBlIFBvaW50ZWVUeSA9IFQtPmdldFBvaW50ZWVUeXBlKCk7Ci0gIGlmIChQb2ludGVyc0FyZTY0Qml0ICYmICFULT5nZXRQb2ludGVlVHlwZSgpLT5pc0Z1bmN0aW9uVHlwZSgpKQotICAgIE91dCA8PCAnRSc7CiAgIG1hbmdsZVR5cGUoUG9pbnRlZVR5LCBSYW5nZSk7CiB9CiB2b2lkIE1pY3Jvc29mdENYWE5hbWVNYW5nbGVyOjptYW5nbGVUeXBlKGNvbnN0IE9iakNPYmplY3RQb2ludGVyVHlwZSAqVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUmFuZ2UpIHsKICAgLy8gT2JqZWN0IHBvaW50ZXJzIG5ldmVyIGhhdmUgcXVhbGlmaWVycy4KICAgT3V0IDw8ICdBJzsKLSAgaWYgKFBvaW50ZXJzQXJlNjRCaXQgJiYgIVQtPmdldFBvaW50ZWVUeXBlKCktPmlzRnVuY3Rpb25UeXBlKCkpCi0gICAgT3V0IDw8ICdFJzsKKyAgbWFuZ2xlUG9pbnRlckV4dFF1YWxpZmllcnMoUXVhbGlmaWVycygpLCBULT5nZXRQb2ludGVlVHlwZSgpLmdldFR5cGVQdHIoKSk7CiAgIG1hbmdsZVR5cGUoVC0+Z2V0UG9pbnRlZVR5cGUoKSwgUmFuZ2UpOwogfQogCiAvLyA8dHlwZT4gOjo9IDxyZWZlcmVuY2UtdHlwZT4KIC8vIDxyZWZlcmVuY2UtdHlwZT4gOjo9IEEgRT8gPGN2ci1xdWFsaWZpZXJzPiA8dHlwZT4KLS8vICAgICAgICAgICAgICAgICAjIHRoZSBFIGlzIHJlcXVpcmVkIGZvciA2NC1iaXQgbm9uIHN0YXRpYyBsdmFsdWUgcmVmZXJlbmNlcworLy8gICAgICAgICAgICAgICAgICMgdGhlIEUgaXMgcmVxdWlyZWQgZm9yIDY0LWJpdCBub24tc3RhdGljIGx2YWx1ZSByZWZlcmVuY2VzCiB2b2lkIE1pY3Jvc29mdENYWE5hbWVNYW5nbGVyOjptYW5nbGVUeXBlKGNvbnN0IExWYWx1ZVJlZmVyZW5jZVR5cGUgKlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlKSB7CiAgIE91dCA8PCAnQSc7Ci0gIGlmIChQb2ludGVyc0FyZTY0Qml0ICYmICFULT5nZXRQb2ludGVlVHlwZSgpLT5pc0Z1bmN0aW9uVHlwZSgpKQotICAgIE91dCA8PCAnRSc7CisgIG1hbmdsZVBvaW50ZXJFeHRRdWFsaWZpZXJzKFF1YWxpZmllcnMoKSwgVC0+Z2V0UG9pbnRlZVR5cGUoKS5nZXRUeXBlUHRyKCkpOwogICBtYW5nbGVUeXBlKFQtPmdldFBvaW50ZWVUeXBlKCksIFJhbmdlKTsKIH0KIAogLy8gPHR5cGU+IDo6PSA8ci12YWx1ZS1yZWZlcmVuY2UtdHlwZT4KIC8vIDxyLXZhbHVlLXJlZmVyZW5jZS10eXBlPiA6Oj0gJCRRIEU/IDxjdnItcXVhbGlmaWVycz4gPHR5cGU+Ci0vLyAgICAgICAgICAgICAgICAgIyB0aGUgRSBpcyByZXF1aXJlZCBmb3IgNjQtYml0IG5vbiBzdGF0aWMgcnZhbHVlIHJlZmVyZW5jZXMKKy8vICAgICAgICAgICAgICAgICAjIHRoZSBFIGlzIHJlcXVpcmVkIGZvciA2NC1iaXQgbm9uLXN0YXRpYyBydmFsdWUgcmVmZXJlbmNlcwogdm9pZCBNaWNyb3NvZnRDWFhOYW1lTWFuZ2xlcjo6bWFuZ2xlVHlwZShjb25zdCBSVmFsdWVSZWZlcmVuY2VUeXBlICpULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSYW5nZSkgewogICBPdXQgPDwgIiQkUSI7Ci0gIGlmIChQb2ludGVyc0FyZTY0Qml0ICYmICFULT5nZXRQb2ludGVlVHlwZSgpLT5pc0Z1bmN0aW9uVHlwZSgpKQotICAgIE91dCA8PCAnRSc7CisgIG1hbmdsZVBvaW50ZXJFeHRRdWFsaWZpZXJzKFF1YWxpZmllcnMoKSwgVC0+Z2V0UG9pbnRlZVR5cGUoKS5nZXRUeXBlUHRyKCkpOwogICBtYW5nbGVUeXBlKFQtPmdldFBvaW50ZWVUeXBlKCksIFJhbmdlKTsKIH0KIApAQCAtMTgwNCw2ICsyMDE5LDggQEAKIH0KIAogdm9pZCBNaWNyb3NvZnRDWFhOYW1lTWFuZ2xlcjo6bWFuZ2xlVHlwZShjb25zdCBBdXRvVHlwZSAqVCwgU291cmNlUmFuZ2UgUmFuZ2UpIHsKKyAgYXNzZXJ0KFQtPmdldERlZHVjZWRUeXBlKCkuaXNOdWxsKCkgJiYgImV4cGVjdGluZyBhIGRlcGVuZGVudCB0eXBlISIpOworCiAgIERpYWdub3N0aWNzRW5naW5lICZEaWFncyA9IENvbnRleHQuZ2V0RGlhZ3MoKTsKICAgdW5zaWduZWQgRGlhZ0lEID0gRGlhZ3MuZ2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNzRW5naW5lOjpFcnJvciwKICAgICAiY2Fubm90IG1hbmdsZSB0aGlzICdhdXRvJyB0eXBlIHlldCIpOwpAQCAtMTkyMywxNyArMjE0MCwxNyBAQAogICB9CiB9CiAKLXZvaWQgTWljcm9zb2Z0TWFuZ2xlQ29udGV4dEltcGw6Om1hbmdsZVZpcnR1YWxNZW1QdHJUaHVuaygKLSAgICBjb25zdCBDWFhNZXRob2REZWNsICpNRCwgdWludDY0X3QgT2Zmc2V0SW5WRlRhYmxlLCByYXdfb3N0cmVhbSAmT3V0KSB7Ci0gIGJvb2wgSXM2NEJpdCA9IGdldEFTVENvbnRleHQoKS5nZXRUYXJnZXRJbmZvKCkuZ2V0UG9pbnRlcldpZHRoKDApID09IDY0Owordm9pZAorTWljcm9zb2Z0TWFuZ2xlQ29udGV4dEltcGw6Om1hbmdsZVZpcnR1YWxNZW1QdHJUaHVuayhjb25zdCBDWFhNZXRob2REZWNsICpNRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk91dCkgeworICBNaWNyb3NvZnRWVGFibGVDb250ZXh0ICpWVENvbnRleHQgPQorICAgICAgY2FzdDxNaWNyb3NvZnRWVGFibGVDb250ZXh0PihnZXRBU1RDb250ZXh0KCkuZ2V0VlRhYmxlQ29udGV4dCgpKTsKKyAgY29uc3QgTWljcm9zb2Z0VlRhYmxlQ29udGV4dDo6TWV0aG9kVkZUYWJsZUxvY2F0aW9uICZNTCA9CisgICAgICBWVENvbnRleHQtPmdldE1ldGhvZFZGVGFibGVMb2NhdGlvbihHbG9iYWxEZWNsKE1EKSk7CiAKICAgTWljcm9zb2Z0Q1hYTmFtZU1hbmdsZXIgTWFuZ2xlcigqdGhpcywgT3V0KTsKLSAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAiXDAxPz9fOSI7Ci0gIE1hbmdsZXIubWFuZ2xlTmFtZShNRC0+Z2V0UGFyZW50KCkpOwotICBNYW5nbGVyLmdldFN0cmVhbSgpIDw8ICIkQiI7Ci0gIE1hbmdsZXIubWFuZ2xlTnVtYmVyKE9mZnNldEluVkZUYWJsZSk7Ci0gIE1hbmdsZXIuZ2V0U3RyZWFtKCkgPDwgIkEiOwotICBNYW5nbGVyLmdldFN0cmVhbSgpIDw8IChJczY0Qml0ID8gIkEiIDogIkUiKTsKKyAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAiXDAxPyI7CisgIE1hbmdsZXIubWFuZ2xlVmlydHVhbE1lbVB0clRodW5rKE1ELCBNTCk7CiB9CiAKIHZvaWQgTWljcm9zb2Z0TWFuZ2xlQ29udGV4dEltcGw6Om1hbmdsZVRodW5rKGNvbnN0IENYWE1ldGhvZERlY2wgKk1ELApAQCAtMjA1MCw3ICsyMjY3LDE2IEBACiAKIHZvaWQgTWljcm9zb2Z0TWFuZ2xlQ29udGV4dEltcGw6Om1hbmdsZVN0YXRpY0d1YXJkVmFyaWFibGUoY29uc3QgVmFyRGVjbCAqVkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPdXQpIHsKLSAgLy8gPGd1YXJkLW5hbWU+IDo6PSA/X0IgPHBvc3RmaXg+IEA1MQorICAvLyBUT0RPOiBUaGlzIGlzIG5vdCBjb3JyZWN0LCBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdCB0byBNU1ZDMjAxMy4gIE1TVkMyMDEzCisgIC8vIHV0aWxpemVzIHRocmVhZCBsb2NhbCB2YXJpYWJsZXMgdG8gaW1wbGVtZW50IHRocmVhZCBzYWZlLCByZS1lbnRyYW50CisgIC8vIGluaXRpYWxpemF0aW9uIGZvciBzdGF0aWNzLiAgVGhleSBubyBsb25nZXIgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuCisgIC8vIGV4dGVybmFsbHkgdmlzaWJsZSBhbmQgbm9uLWV4dGVybmFsbHkgdmlzaWJsZSBzdGF0aWMgd2l0aCByZXNwZWN0IHRvCisgIC8vIG1hbmdsaW5nLCB0aGV5IGFsbCBnZXQgJFRTUyA8bnVtYmVyPi4KKyAgLy8KKyAgLy8gTi5CLiBUaGlzIG1lYW5zIHRoYXQgdGhleSBjYW4gZ2V0IG1vcmUgdGhhbiAzMiBzdGF0aWMgdmFyaWFibGUgZ3VhcmRzIGluIGEKKyAgLy8gc2NvcGUuICBJdCBhbHNvIG1lYW5zIHRoYXQgdGhleSBicm9rZSBjb21wYXRpYmlsaXR5IHdpdGggdGhlaXIgb3duIEFCSS4KKworICAvLyA8Z3VhcmQtbmFtZT4gOjo9ID9fQiA8cG9zdGZpeD4gQDUgPHNjb3BlLWRlcHRoPgogICAvLyAgICAgICAgICAgICAgOjo9ID8kUyA8Z3VhcmQtbnVtPiBAIDxwb3N0Zml4PiBANElBCiAKICAgLy8gVGhlIGZpcnN0IG1hbmdsaW5nIGlzIHdoYXQgTVNWQyB1c2VzIHRvIGd1YXJkIHN0YXRpYyBsb2NhbHMgaW4gaW5saW5lCkBAIC0yMDY0LDggKzIyOTAsMTcgQEAKICAgYm9vbCBWaXNpYmxlID0gVkQtPmlzRXh0ZXJuYWxseVZpc2libGUoKTsKICAgLy8gPG9wZXJhdG9yLW5hbWU+IDo6PSA/X0IgIyBsb2NhbCBzdGF0aWMgZ3VhcmQKICAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAoVmlzaWJsZSA/ICJcMDE/P19CIiA6ICJcMDE/JFMxQCIpOwotICBNYW5nbGVyLm1hbmdsZVBvc3RmaXgoVkQtPmdldERlY2xDb250ZXh0KCkpOwotICBNYW5nbGVyLmdldFN0cmVhbSgpIDw8IChWaXNpYmxlID8gIkA1MSIgOiAiQDRJQSIpOworICB1bnNpZ25lZCBTY29wZURlcHRoID0gMDsKKyAgaWYgKFZpc2libGUgJiYgIWdldE5leHREaXNjcmltaW5hdG9yKFZELCBTY29wZURlcHRoKSkKKyAgICAvLyBJZiB3ZSBkbyBub3QgaGF2ZSBhIGRpc2NyaW1pbmF0b3IgYW5kIGFyZSBlbWl0dGluZyBhIGd1YXJkIHZhcmlhYmxlIGZvcgorICAgIC8vIHVzZSBhdCBnbG9iYWwgc2NvcGUsIHRoZW4gbWFuZ2xpbmcgdGhlIG5lc3RlZCBuYW1lIHdpbGwgbm90IGJlIGVub3VnaCB0bworICAgIC8vIHJlbW92ZSBhbWJpZ3VpdGllcy4KKyAgICBNYW5nbGVyLm1hbmdsZShWRCwgIiIpOworICBlbHNlCisgICAgTWFuZ2xlci5tYW5nbGVOZXN0ZWROYW1lKFZEKTsKKyAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAoVmlzaWJsZSA/ICJANSIgOiAiQDRJQSIpOworICBpZiAoU2NvcGVEZXB0aCkKKyAgICBNYW5nbGVyLm1hbmdsZU51bWJlcihTY29wZURlcHRoKTsKIH0KIAogdm9pZCBNaWNyb3NvZnRNYW5nbGVDb250ZXh0SW1wbDo6bWFuZ2xlSW5pdEZpbmlTdHViKGNvbnN0IFZhckRlY2wgKkQsCkBAIC0yMDc0LDYgKzIzMDksMTAgQEAKICAgTWljcm9zb2Z0Q1hYTmFtZU1hbmdsZXIgTWFuZ2xlcigqdGhpcywgT3V0KTsKICAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAiXDAxPz9fXyIgPDwgQ2hhckNvZGU7CiAgIE1hbmdsZXIubWFuZ2xlTmFtZShEKTsKKyAgaWYgKEQtPmlzU3RhdGljRGF0YU1lbWJlcigpKSB7CisgICAgTWFuZ2xlci5tYW5nbGVWYXJpYWJsZUVuY29kaW5nKEQpOworICAgIE1hbmdsZXIuZ2V0U3RyZWFtKCkgPDwgJ0AnOworICB9CiAgIC8vIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIGNsYXNzIG1hbmdsaW5nLiAgVGhlc2Ugc3R1YnMgYXJlIGdsb2JhbCwgbm9uLXZhcmlhZGljLAogICAvLyBjZGVjbCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gdm9pZCBhbmQgdGFrZSBubyBhcmdzLgogICBNYW5nbGVyLmdldFN0cmVhbSgpIDw8ICJZQVhYWiI7CkBAIC0yMDkyLDYgKzIzMzEsMTcyIEBACiAgIG1hbmdsZUluaXRGaW5pU3R1YihELCBPdXQsICdGJyk7CiB9CiAKK3ZvaWQgTWljcm9zb2Z0TWFuZ2xlQ29udGV4dEltcGw6Om1hbmdsZVN0cmluZ0xpdGVyYWwoY29uc3QgU3RyaW5nTGl0ZXJhbCAqU0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPdXQpIHsKKyAgLy8gPGNoYXItdHlwZT4gOjo9IDAgICAjIGNoYXIKKyAgLy8gICAgICAgICAgICAgOjo9IDEgICAjIHdjaGFyX3QKKyAgLy8gICAgICAgICAgICAgOjo9ID8/PyAjIGNoYXIxNl90L2NoYXIzMl90IHdpbGwgbmVlZCBhIG1hbmdsaW5nIHRvby4uLgorICAvLworICAvLyA8bGl0ZXJhbC1sZW5ndGg+IDo6PSA8bm9uLW5lZ2F0aXZlIGludGVnZXI+ICAjIHRoZSBsZW5ndGggb2YgdGhlIGxpdGVyYWwKKyAgLy8KKyAgLy8gPGVuY29kZWQtY3JjPiAgICA6Oj0gPGhleCBkaWdpdD4rIEAgICAgICAgICAgIyBjcmMgb2YgdGhlIGxpdGVyYWwgaW5jbHVkaW5nCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbnVsbC10ZXJtaW5hdG9yCisgIC8vCisgIC8vIDxlbmNvZGVkLXN0cmluZz4gOjo9IDxzaW1wbGUgY2hhcmFjdGVyPiAgICAgICAgICAgIyB1bmludGVyZXN0aW5nIGNoYXJhY3RlcgorICAvLyAgICAgICAgICAgICAgICAgIDo6PSAnPyQnIDxoZXggZGlnaXQ+IDxoZXggZGlnaXQ+ICMgdGhlc2UgdHdvIG5pYmJsZXMKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVuY29kZSB0aGUgYnl0ZSBmb3IgdGhlCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXIKKyAgLy8gICAgICAgICAgICAgICAgICA6Oj0gJz8nIFthLXpdICAgICAgICAgICAgICAgICAgICAjIFx4ZTEgLSBceGZhCisgIC8vICAgICAgICAgICAgICAgICAgOjo9ICc/JyBbQS1aXSAgICAgICAgICAgICAgICAgICAgIyBceGMxIC0gXHhkYQorICAvLyAgICAgICAgICAgICAgICAgIDo6PSAnPycgWzAtOV0gICAgICAgICAgICAgICAgICAgICMgWywvXDouIFxuXHQnLV0KKyAgLy8KKyAgLy8gPGxpdGVyYWw+IDo6PSAnPz9fQ0BfJyA8Y2hhci10eXBlPiA8bGl0ZXJhbC1sZW5ndGg+IDxlbmNvZGVkLWNyYz4KKyAgLy8gICAgICAgICAgICAgICA8ZW5jb2RlZC1zdHJpbmc+ICdAJworICBNaWNyb3NvZnRDWFhOYW1lTWFuZ2xlciBNYW5nbGVyKCp0aGlzLCBPdXQpOworICBNYW5nbGVyLmdldFN0cmVhbSgpIDw8ICJcMDE/P19DQF8iOworCisgIC8vIDxjaGFyLXR5cGU+OiBUaGUgImtpbmQiIG9mIHN0cmluZyBsaXRlcmFsIGlzIGVuY29kZWQgaW50byB0aGUgbWFuZ2xlZCBuYW1lLgorICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIGJlIHVwZGF0ZWQgd2hlbiBNU1ZDIGdhaW5zIHN1cHBvcnQgZm9yIHVuaWNvZGUKKyAgLy8gbGl0ZXJhbHMuCisgIGlmIChTTC0+aXNBc2NpaSgpKQorICAgIE1hbmdsZXIuZ2V0U3RyZWFtKCkgPDwgJzAnOworICBlbHNlIGlmIChTTC0+aXNXaWRlKCkpCisgICAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAnMSc7CisgIGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmV4cGVjdGVkIHN0cmluZyBsaXRlcmFsIGtpbmQhIik7CisKKyAgLy8gPGxpdGVyYWwtbGVuZ3RoPjogVGhlIG5leHQgcGFydCBvZiB0aGUgbWFuZ2xlZCBuYW1lIGNvbnNpc3RzIG9mIHRoZSBsZW5ndGgKKyAgLy8gb2YgdGhlIHN0cmluZy4KKyAgLy8gVGhlIFN0cmluZ0xpdGVyYWwgZG9lcyBub3QgY29uc2lkZXIgdGhlIE5VTCB0ZXJtaW5hdG9yIGJ5dGUocykgYnV0IHRoZQorICAvLyBtYW5nbGluZyBkb2VzLgorICAvLyBOLkIuIFRoZSBsZW5ndGggaXMgaW4gdGVybXMgb2YgYnl0ZXMsIG5vdCBjaGFyYWN0ZXJzLgorICBNYW5nbGVyLm1hbmdsZU51bWJlcihTTC0+Z2V0Qnl0ZUxlbmd0aCgpICsgU0wtPmdldENoYXJCeXRlV2lkdGgoKSk7CisKKyAgLy8gV2Ugd2lsbCB1c2UgdGhlICJSb2Nrc29mdF50bSBNb2RlbCBDUkMgQWxnb3JpdGhtIiB0byBkZXNjcmliZSB0aGUKKyAgLy8gcHJvcGVydGllcyBvZiBvdXIgQ1JDOgorICAvLyAgIFdpZHRoICA6IDMyCisgIC8vICAgUG9seSAgIDogMDRDMTFEQjcKKyAgLy8gICBJbml0ICAgOiBGRkZGRkZGRgorICAvLyAgIFJlZkluICA6IFRydWUKKyAgLy8gICBSZWZPdXQgOiBUcnVlCisgIC8vICAgWG9yT3V0IDogMDAwMDAwMDAKKyAgLy8gICBDaGVjayAgOiAzNDBCQzZEOQorICB1aW50MzJfdCBDUkMgPSAweEZGRkZGRkZGVTsKKworICBhdXRvIFVwZGF0ZUNSQyA9IFsmQ1JDXShjaGFyIEJ5dGUpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICBib29sIEJpdCA9IENSQyAmIDB4ODAwMDAwMDBVOworICAgICAgaWYgKEJ5dGUgJiAoMVUgPDwgaSkpCisgICAgICAgIEJpdCA9ICFCaXQ7CisgICAgICBDUkMgPDw9IDE7CisgICAgICBpZiAoQml0KQorICAgICAgICBDUkMgXj0gMHgwNEMxMURCN1U7CisgICAgfQorICB9OworCisgIGF1dG8gR2V0TGl0dGxlRW5kaWFuQnl0ZSA9IFsmTWFuZ2xlciwgJlNMXSh1bnNpZ25lZCBJbmRleCkgeworICAgIHVuc2lnbmVkIENoYXJCeXRlV2lkdGggPSBTTC0+Z2V0Q2hhckJ5dGVXaWR0aCgpOworICAgIHVpbnQzMl90IENvZGVVbml0ID0gU0wtPmdldENvZGVVbml0KEluZGV4IC8gQ2hhckJ5dGVXaWR0aCk7CisgICAgdW5zaWduZWQgT2Zmc2V0SW5Db2RlVW5pdCA9IEluZGV4ICUgQ2hhckJ5dGVXaWR0aDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oKENvZGVVbml0ID4+ICg4ICogT2Zmc2V0SW5Db2RlVW5pdCkpICYgMHhmZik7CisgIH07CisKKyAgYXV0byBHZXRCaWdFbmRpYW5CeXRlID0gWyZNYW5nbGVyLCAmU0xdKHVuc2lnbmVkIEluZGV4KSB7CisgICAgdW5zaWduZWQgQ2hhckJ5dGVXaWR0aCA9IFNMLT5nZXRDaGFyQnl0ZVdpZHRoKCk7CisgICAgdWludDMyX3QgQ29kZVVuaXQgPSBTTC0+Z2V0Q29kZVVuaXQoSW5kZXggLyBDaGFyQnl0ZVdpZHRoKTsKKyAgICB1bnNpZ25lZCBPZmZzZXRJbkNvZGVVbml0ID0gKENoYXJCeXRlV2lkdGggLSAxKSAtIChJbmRleCAlIENoYXJCeXRlV2lkdGgpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjaGFyPigoQ29kZVVuaXQgPj4gKDggKiBPZmZzZXRJbkNvZGVVbml0KSkgJiAweGZmKTsKKyAgfTsKKworICAvLyBDUkMgYWxsIHRoZSBieXRlcyBvZiB0aGUgU3RyaW5nTGl0ZXJhbC4KKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFNMLT5nZXRCeXRlTGVuZ3RoKCk7IEkgIT0gRTsgKytJKQorICAgIFVwZGF0ZUNSQyhHZXRMaXR0bGVFbmRpYW5CeXRlKEkpKTsKKworICAvLyBUaGUgTlVMIHRlcm1pbmF0b3IgYnl0ZShzKSB3ZXJlIG5vdCBwcmVzZW50IGVhcmxpZXIsCisgIC8vIHdlIG5lZWQgdG8gbWFudWFsbHkgcHJvY2VzcyB0aG9zZSBieXRlcyBpbnRvIHRoZSBDUkMuCisgIGZvciAodW5zaWduZWQgTnVsbFRlcm1pbmF0b3IgPSAwOyBOdWxsVGVybWluYXRvciA8IFNMLT5nZXRDaGFyQnl0ZVdpZHRoKCk7CisgICAgICAgKytOdWxsVGVybWluYXRvcikKKyAgICBVcGRhdGVDUkMoJ1x4MDAnKTsKKworICAvLyBUaGUgbGl0ZXJhdHVyZSByZWZlcnMgdG8gdGhlIHByb2Nlc3Mgb2YgcmV2ZXJzaW5nIHRoZSBiaXRzIGluIHRoZSBmaW5hbCBDUkMKKyAgLy8gb3V0cHV0IGFzICJyZWZsZWN0aW9uIi4KKyAgQ1JDID0gbGx2bTo6cmV2ZXJzZUJpdHMoQ1JDKTsKKworICAvLyA8ZW5jb2RlZC1jcmM+OiBUaGUgQ1JDIGlzIGVuY29kZWQgdXRpbGl6aW5nIHRoZSBzdGFuZGFyZCBudW1iZXIgbWFuZ2xpbmcKKyAgLy8gc2NoZW1lLgorICBNYW5nbGVyLm1hbmdsZU51bWJlcihDUkMpOworCisgIC8vIDxlbmNvZGVkLXN0cmluZz46IFRoZSBtYW5nbGVkIG5hbWUgYWxzbyBjb250YWlucyB0aGUgZmlyc3QgMzIgX2NoYXJhY3RlcnNfCisgIC8vIChpbmNsdWRpbmcgbnVsbC10ZXJtaW5hdG9yIGJ5dGVzKSBvZiB0aGUgU3RyaW5nTGl0ZXJhbC4KKyAgLy8gRWFjaCBjaGFyYWN0ZXIgaXMgZW5jb2RlZCBieSBzcGxpdHRpbmcgdGhlbSBpbnRvIGJ5dGVzIGFuZCB0aGVuIGVuY29kaW5nCisgIC8vIHRoZSBjb25zdGl0dWVudCBieXRlcy4KKyAgYXV0byBNYW5nbGVCeXRlID0gWyZNYW5nbGVyXShjaGFyIEJ5dGUpIHsKKyAgICAvLyBUaGVyZSBhcmUgZml2ZSBkaWZmZXJlbnQgbWFuZ2xpbmdzIGZvciBjaGFyYWN0ZXJzOgorICAgIC8vIC0gW2EtekEtWjAtOV8kXTogQSBvbmUtdG8tb25lIG1hcHBpbmcuCisgICAgLy8gLSA/W2Etel06IFRoZSByYW5nZSBmcm9tIFx4ZTEgdG8gXHhmYS4KKyAgICAvLyAtID9bQS1aXTogVGhlIHJhbmdlIGZyb20gXHhjMSB0byBceGRhLgorICAgIC8vIC0gP1swLTldOiBUaGUgc2V0IG9mIFssL1w6LiBcblx0Jy1dLgorICAgIC8vIC0gPyRYWDogQSBmYWxsYmFjayB3aGljaCBtYXBzIG5pYmJsZXMuCisgICAgaWYgKGlzSWRlbnRpZmllckJvZHkoQnl0ZSwgLypBbGxvd0RvbGxhcj0qL3RydWUpKSB7CisgICAgICBNYW5nbGVyLmdldFN0cmVhbSgpIDw8IEJ5dGU7CisgICAgfSBlbHNlIGlmIChpc0xldHRlcihCeXRlICYgMHg3ZikpIHsKKyAgICAgIE1hbmdsZXIuZ2V0U3RyZWFtKCkgPDwgJz8nIDw8IHN0YXRpY19jYXN0PGNoYXI+KEJ5dGUgJiAweDdmKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChCeXRlKSB7CisgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgIE1hbmdsZXIuZ2V0U3RyZWFtKCkgPDwgIj8wIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAiPzEiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAiPzIiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgICBNYW5nbGVyLmdldFN0cmVhbSgpIDw8ICI/MyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgIE1hbmdsZXIuZ2V0U3RyZWFtKCkgPDwgIj80IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAiPzUiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAiPzYiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAiPzciOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAiPzgiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICBNYW5nbGVyLmdldFN0cmVhbSgpIDw8ICI/OSI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCAiPyQiOworICAgICAgICAgIE1hbmdsZXIuZ2V0U3RyZWFtKCkgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4oJ0EnICsgKChCeXRlID4+IDQpICYgMHhmKSk7CisgICAgICAgICAgTWFuZ2xlci5nZXRTdHJlYW0oKSA8PCBzdGF0aWNfY2FzdDxjaGFyPignQScgKyAoQnl0ZSAmIDB4ZikpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfTsKKworICAvLyBFbmZvcmNlIG91ciAzMiBjaGFyYWN0ZXIgbWF4LgorICB1bnNpZ25lZCBOdW1DaGFyc1RvTWFuZ2xlID0gc3RkOjptaW4oMzJVLCBTTC0+Z2V0TGVuZ3RoKCkpOworICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gTnVtQ2hhcnNUb01hbmdsZSAqIFNMLT5nZXRDaGFyQnl0ZVdpZHRoKCk7IEkgIT0gRTsKKyAgICAgICArK0kpCisgICAgTWFuZ2xlQnl0ZShHZXRCaWdFbmRpYW5CeXRlKEkpKTsKKworICAvLyBFbmNvZGUgdGhlIE5VTCB0ZXJtaW5hdG9yIGlmIHRoZXJlIGlzIHJvb20uCisgIGlmIChOdW1DaGFyc1RvTWFuZ2xlIDwgMzIpCisgICAgZm9yICh1bnNpZ25lZCBOdWxsVGVybWluYXRvciA9IDA7IE51bGxUZXJtaW5hdG9yIDwgU0wtPmdldENoYXJCeXRlV2lkdGgoKTsKKyAgICAgICAgICsrTnVsbFRlcm1pbmF0b3IpCisgICAgICBNYW5nbGVCeXRlKDApOworCisgIE1hbmdsZXIuZ2V0U3RyZWFtKCkgPDwgJ0AnOworfQorCiBNaWNyb3NvZnRNYW5nbGVDb250ZXh0ICoKIE1pY3Jvc29mdE1hbmdsZUNvbnRleHQ6OmNyZWF0ZShBU1RDb250ZXh0ICZDb250ZXh0LCBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpIHsKICAgcmV0dXJuIG5ldyBNaWNyb3NvZnRNYW5nbGVDb250ZXh0SW1wbChDb250ZXh0LCBEaWFncyk7CmRpZmYgLS1naXQgYS9saWIvQVNUL1Jhd0NvbW1lbnRMaXN0LmNwcCBiL2xpYi9BU1QvUmF3Q29tbWVudExpc3QuY3BwCmluZGV4IDFmYTdjZWEuLjI0YjEyOWEgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvUmF3Q29tbWVudExpc3QuY3BwCisrKyBiL2xpYi9BU1QvUmF3Q29tbWVudExpc3QuY3BwCkBAIC05NSwxMCArOTUsOSBAQAogICB1bnNpZ25lZCBCZWdpbk9mZnNldDsKICAgdW5zaWduZWQgRW5kT2Zmc2V0OwogCi0gIGxsdm06OnRpZShCZWdpbkZpbGVJRCwgQmVnaW5PZmZzZXQpID0KKyAgc3RkOjp0aWUoQmVnaW5GaWxlSUQsIEJlZ2luT2Zmc2V0KSA9CiAgICAgICBTb3VyY2VNZ3IuZ2V0RGVjb21wb3NlZExvYyhSYW5nZS5nZXRCZWdpbigpKTsKLSAgbGx2bTo6dGllKEVuZEZpbGVJRCwgRW5kT2Zmc2V0KSA9Ci0gICAgICBTb3VyY2VNZ3IuZ2V0RGVjb21wb3NlZExvYyhSYW5nZS5nZXRFbmQoKSk7CisgIHN0ZDo6dGllKEVuZEZpbGVJRCwgRW5kT2Zmc2V0KSA9IFNvdXJjZU1nci5nZXREZWNvbXBvc2VkTG9jKFJhbmdlLmdldEVuZCgpKTsKIAogICBjb25zdCB1bnNpZ25lZCBMZW5ndGggPSBFbmRPZmZzZXQgLSBCZWdpbk9mZnNldDsKICAgaWYgKExlbmd0aCA8IDIpCkBAIC0yNTIsMyArMjUxLDE1IEBACiAgICAgQ29tbWVudHMucHVzaF9iYWNrKG5ldyAoQWxsb2NhdG9yKSBSYXdDb21tZW50KFJDKSk7CiAgIH0KIH0KKwordm9pZCBSYXdDb21tZW50TGlzdDo6YWRkRGVzZXJpYWxpemVkQ29tbWVudHMoQXJyYXlSZWY8UmF3Q29tbWVudCAqPiBEZXNlcmlhbGl6ZWRDb21tZW50cykgeworICBzdGQ6OnZlY3RvcjxSYXdDb21tZW50ICo+IE1lcmdlZENvbW1lbnRzOworICBNZXJnZWRDb21tZW50cy5yZXNlcnZlKENvbW1lbnRzLnNpemUoKSArIERlc2VyaWFsaXplZENvbW1lbnRzLnNpemUoKSk7CisKKyAgc3RkOjptZXJnZShDb21tZW50cy5iZWdpbigpLCBDb21tZW50cy5lbmQoKSwKKyAgICAgICAgICAgICBEZXNlcmlhbGl6ZWRDb21tZW50cy5iZWdpbigpLCBEZXNlcmlhbGl6ZWRDb21tZW50cy5lbmQoKSwKKyAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoTWVyZ2VkQ29tbWVudHMpLAorICAgICAgICAgICAgIEJlZm9yZVRoYW5Db21wYXJlPFJhd0NvbW1lbnQ+KFNvdXJjZU1ncikpOworICBzdGQ6OnN3YXAoQ29tbWVudHMsIE1lcmdlZENvbW1lbnRzKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL0FTVC9SZWNvcmRMYXlvdXQuY3BwIGIvbGliL0FTVC9SZWNvcmRMYXlvdXQuY3BwCmluZGV4IDcxZTQ0ZWMuLjlkNDZjYzYgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvUmVjb3JkTGF5b3V0LmNwcAorKysgYi9saWIvQVNUL1JlY29yZExheW91dC5jcHAKQEAgLTI5LDEwICsyOSwxMyBAQAogfQogCiBBU1RSZWNvcmRMYXlvdXQ6OkFTVFJlY29yZExheW91dChjb25zdCBBU1RDb250ZXh0ICZDdHgsIENoYXJVbml0cyBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIGFsaWdubWVudCwgQ2hhclVuaXRzIGRhdGFzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIGFsaWdubWVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgcmVxdWlyZWRBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgZGF0YXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCAqZmllbGRvZmZzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmllbGRjb3VudCkKLSAgOiBTaXplKHNpemUpLCBEYXRhU2l6ZShkYXRhc2l6ZSksIEFsaWdubWVudChhbGlnbm1lbnQpLCBGaWVsZE9mZnNldHMoMCksCisgIDogU2l6ZShzaXplKSwgRGF0YVNpemUoZGF0YXNpemUpLCBBbGlnbm1lbnQoYWxpZ25tZW50KSwKKyAgICBSZXF1aXJlZEFsaWdubWVudChyZXF1aXJlZEFsaWdubWVudCksIEZpZWxkT2Zmc2V0cygwKSwKICAgICBGaWVsZENvdW50KGZpZWxkY291bnQpLCBDWFhJbmZvKDApIHsKICAgaWYgKEZpZWxkQ291bnQgPiAwKSAgewogICAgIEZpZWxkT2Zmc2V0cyA9IG5ldyAoQ3R4KSB1aW50NjRfdFtGaWVsZENvdW50XTsKQEAgLTQzLDIxICs0NiwyNCBAQAogLy8gQ29uc3RydWN0b3IgZm9yIEMrKyByZWNvcmRzLgogQVNUUmVjb3JkTGF5b3V0OjpBU1RSZWNvcmRMYXlvdXQoY29uc3QgQVNUQ29udGV4dCAmQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIHNpemUsIENoYXJVbml0cyBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgcmVxdWlyZWRBbGlnbm1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc093blZGUHRyLCBib29sIGhhc0V4dGVuZGFibGVWRlB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyB2YnB0cm9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBkYXRhc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90ICpmaWVsZG9mZnNldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmaWVsZGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIG5vbnZpcnR1YWxzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIG5vbnZpcnR1YWxhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBub252aXJ0dWFsYWxpZ25tZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIFNpemVPZkxhcmdlc3RFbXB0eVN1Ym9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlByaW1hcnlCYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1ByaW1hcnlCYXNlVmlydHVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VTaGFyaW5nVkJQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsaWduQWZ0ZXJWQmFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1plcm9TaXplZFN1Yk9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTGVhZHNXaXRoWmVyb1NpemVkQmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2VPZmZzZXRzTWFwVHkmIEJhc2VPZmZzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVkJhc2VPZmZzZXRzTWFwVHkmIFZCYXNlT2Zmc2V0cykKLSAgOiBTaXplKHNpemUpLCBEYXRhU2l6ZShkYXRhc2l6ZSksIEFsaWdubWVudChhbGlnbm1lbnQpLCBGaWVsZE9mZnNldHMoMCksCisgIDogU2l6ZShzaXplKSwgRGF0YVNpemUoZGF0YXNpemUpLCBBbGlnbm1lbnQoYWxpZ25tZW50KSwKKyAgICBSZXF1aXJlZEFsaWdubWVudChyZXF1aXJlZEFsaWdubWVudCksIEZpZWxkT2Zmc2V0cygwKSwKICAgICBGaWVsZENvdW50KGZpZWxkY291bnQpLCBDWFhJbmZvKG5ldyAoQ3R4KSBDWFhSZWNvcmRMYXlvdXRJbmZvKQogewogICBpZiAoRmllbGRDb3VudCA+IDApICB7CkBAIC02OCw3ICs3NCw3IEBACiAgIENYWEluZm8tPlByaW1hcnlCYXNlLnNldFBvaW50ZXIoUHJpbWFyeUJhc2UpOwogICBDWFhJbmZvLT5QcmltYXJ5QmFzZS5zZXRJbnQoSXNQcmltYXJ5QmFzZVZpcnR1YWwpOwogICBDWFhJbmZvLT5Ob25WaXJ0dWFsU2l6ZSA9IG5vbnZpcnR1YWxzaXplOwotICBDWFhJbmZvLT5Ob25WaXJ0dWFsQWxpZ24gPSBub252aXJ0dWFsYWxpZ247CisgIENYWEluZm8tPk5vblZpcnR1YWxBbGlnbm1lbnQgPSBub252aXJ0dWFsYWxpZ25tZW50OwogICBDWFhJbmZvLT5TaXplT2ZMYXJnZXN0RW1wdHlTdWJvYmplY3QgPSBTaXplT2ZMYXJnZXN0RW1wdHlTdWJvYmplY3Q7CiAgIENYWEluZm8tPkJhc2VPZmZzZXRzID0gQmFzZU9mZnNldHM7CiAgIENYWEluZm8tPlZCYXNlT2Zmc2V0cyA9IFZCYXNlT2Zmc2V0czsKQEAgLTc2LDcgKzgyLDggQEAKICAgQ1hYSW5mby0+VkJQdHJPZmZzZXQgPSB2YnB0cm9mZnNldDsKICAgQ1hYSW5mby0+SGFzRXh0ZW5kYWJsZVZGUHRyID0gaGFzRXh0ZW5kYWJsZVZGUHRyOwogICBDWFhJbmZvLT5CYXNlU2hhcmluZ1ZCUHRyID0gQmFzZVNoYXJpbmdWQlB0cjsKLSAgQ1hYSW5mby0+QWxpZ25BZnRlclZCYXNlcyA9IEFsaWduQWZ0ZXJWQmFzZXM7CisgIENYWEluZm8tPkhhc1plcm9TaXplZFN1Yk9iamVjdCA9IEhhc1plcm9TaXplZFN1Yk9iamVjdDsKKyAgQ1hYSW5mby0+TGVhZHNXaXRoWmVyb1NpemVkQmFzZSA9IExlYWRzV2l0aFplcm9TaXplZEJhc2U7CiAKIAogI2lmbmRlZiBOREVCVUcKZGlmZiAtLWdpdCBhL2xpYi9BU1QvUmVjb3JkTGF5b3V0QnVpbGRlci5jcHAgYi9saWIvQVNUL1JlY29yZExheW91dEJ1aWxkZXIuY3BwCmluZGV4IDQzOTBlNjYuLmNlNTVkMmUgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvUmVjb3JkTGF5b3V0QnVpbGRlci5jcHAKKysrIGIvbGliL0FTVC9SZWNvcmRMYXlvdXRCdWlsZGVyLmNwcApAQCAtMTQwLDEwICsxNDAsOSBAQAogCiB2b2lkIEVtcHR5U3Vib2JqZWN0TWFwOjpDb21wdXRlRW1wdHlTdWJvYmplY3RTaXplcygpIHsKICAgLy8gQ2hlY2sgdGhlIGJhc2VzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IENsYXNzLT5iYXNlc19iZWdpbigpLAotICAgICAgIEUgPSBDbGFzcy0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IENsYXNzLT5iYXNlcygpKSB7CiAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPQotICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICBjYXN0PENYWFJlY29yZERlY2w+KEkuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogCiAgICAgQ2hhclVuaXRzIEVtcHR5U2l6ZTsKICAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCA9IENvbnRleHQuZ2V0QVNUUmVjb3JkTGF5b3V0KEJhc2VEZWNsKTsKQEAgLTE2MCw5ICsxNTksNyBAQAogICB9CiAKICAgLy8gQ2hlY2sgdGhlIGZpZWxkcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBJID0gQ2xhc3MtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgRSA9IENsYXNzLT5maWVsZF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLQorICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBDbGFzcy0+ZmllbGRzKCkpIHsKICAgICBjb25zdCBSZWNvcmRUeXBlICpSVCA9CiAgICAgICBDb250ZXh0LmdldEJhc2VFbGVtZW50VHlwZShJLT5nZXRUeXBlKCkpLT5nZXRBczxSZWNvcmRUeXBlPigpOwogCkBAIC0zNDgsMTMgKzM0NSwxMiBAQAogICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCA9IENvbnRleHQuZ2V0QVNUUmVjb3JkTGF5b3V0KFJEKTsKIAogICAvLyBUcmF2ZXJzZSBhbGwgbm9uLXZpcnR1YWwgYmFzZXMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoSS0+aXNWaXJ0dWFsKCkpCisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT5iYXNlcygpKSB7CisgICAgaWYgKEkuaXNWaXJ0dWFsKCkpCiAgICAgICBjb250aW51ZTsKIAogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0KLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKIAogICAgIENoYXJVbml0cyBCYXNlT2Zmc2V0ID0gT2Zmc2V0ICsgTGF5b3V0LmdldEJhc2VDbGFzc09mZnNldChCYXNlRGVjbCk7CiAgICAgaWYgKCFDYW5QbGFjZUZpZWxkU3Vib2JqZWN0QXRPZmZzZXQoQmFzZURlY2wsIENsYXNzLCBCYXNlT2Zmc2V0KSkKQEAgLTM2MywxMCArMzU5LDkgQEAKIAogICBpZiAoUkQgPT0gQ2xhc3MpIHsKICAgICAvLyBUaGlzIGlzIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MsIHRyYXZlcnNlIHZpcnR1YWwgYmFzZXMgYXMgd2VsbC4KLSAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT52YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBSRC0+dmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT52YmFzZXMoKSkgewogICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqVkJhc2VEZWNsID0KLSAgICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CiAgICAgICAKICAgICAgIENoYXJVbml0cyBWQmFzZU9mZnNldCA9IE9mZnNldCArIExheW91dC5nZXRWQmFzZUNsYXNzT2Zmc2V0KFZCYXNlRGVjbCk7CiAgICAgICBpZiAoIUNhblBsYWNlRmllbGRTdWJvYmplY3RBdE9mZnNldChWQmFzZURlY2wsIENsYXNzLCBWQmFzZU9mZnNldCkpCkBAIC00NjAsMTMgKzQ1NSwxMiBAQAogICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCA9IENvbnRleHQuZ2V0QVNUUmVjb3JkTGF5b3V0KFJEKTsKIAogICAvLyBUcmF2ZXJzZSBhbGwgbm9uLXZpcnR1YWwgYmFzZXMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoSS0+aXNWaXJ0dWFsKCkpCisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT5iYXNlcygpKSB7CisgICAgaWYgKEkuaXNWaXJ0dWFsKCkpCiAgICAgICBjb250aW51ZTsKIAogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0KLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKIAogICAgIENoYXJVbml0cyBCYXNlT2Zmc2V0ID0gT2Zmc2V0ICsgTGF5b3V0LmdldEJhc2VDbGFzc09mZnNldChCYXNlRGVjbCk7CiAgICAgVXBkYXRlRW1wdHlGaWVsZFN1Ym9iamVjdHMoQmFzZURlY2wsIENsYXNzLCBCYXNlT2Zmc2V0KTsKQEAgLTQ3NCwxMCArNDY4LDkgQEAKIAogICBpZiAoUkQgPT0gQ2xhc3MpIHsKICAgICAvLyBUaGlzIGlzIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MsIHRyYXZlcnNlIHZpcnR1YWwgYmFzZXMgYXMgd2VsbC4KLSAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT52YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBSRC0+dmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT52YmFzZXMoKSkgewogICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqVkJhc2VEZWNsID0KLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKICAgICAgIAogICAgICAgQ2hhclVuaXRzIFZCYXNlT2Zmc2V0ID0gT2Zmc2V0ICsgTGF5b3V0LmdldFZCYXNlQ2xhc3NPZmZzZXQoVkJhc2VEZWNsKTsKICAgICAgIFVwZGF0ZUVtcHR5RmllbGRTdWJvYmplY3RzKFZCYXNlRGVjbCwgQ2xhc3MsIFZCYXNlT2Zmc2V0KTsKQEAgLTc4MywxNiArNzc2LDE1IEBACiAKIHZvaWQKIFJlY29yZExheW91dEJ1aWxkZXI6OlNlbGVjdFByaW1hcnlWQmFzZShjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgewotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgRSA9IFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBhc3NlcnQoIUktPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCkgJiYKKyAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPmJhc2VzKCkpIHsKKyAgICBhc3NlcnQoIUkuZ2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSAmJgogICAgICAgICAgICAiQ2Fubm90IGxheW91dCBjbGFzcyB3aXRoIGRlcGVuZGVudCBiYXNlcy4iKTsKIAogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2UgPQotICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICBjYXN0PENYWFJlY29yZERlY2w+KEkuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogCiAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIG5lYXJseSBlbXB0eSB2aXJ0dWFsIGJhc2UuCi0gICAgaWYgKEktPmlzVmlydHVhbCgpICYmIENvbnRleHQuaXNOZWFybHlFbXB0eShCYXNlKSkgeworICAgIGlmIChJLmlzVmlydHVhbCgpICYmIENvbnRleHQuaXNOZWFybHlFbXB0eShCYXNlKSkgewogICAgICAgLy8gSWYgaXQncyBub3QgYW4gaW5kaXJlY3QgcHJpbWFyeSBiYXNlLCB0aGVuIHdlJ3ZlIGZvdW5kIG91ciBwcmltYXJ5CiAgICAgICAvLyBiYXNlLgogICAgICAgaWYgKCFJbmRpcmVjdFByaW1hcnlCYXNlcy5jb3VudChCYXNlKSkgewpAQCAtODI1LDE0ICs4MTcsMTMgQEAKICAgLy8gSWYgdGhlIHJlY29yZCBoYXMgYSBkeW5hbWljIGJhc2UgY2xhc3MsIGF0dGVtcHQgdG8gY2hvb3NlIGEgcHJpbWFyeSBiYXNlCiAgIC8vIGNsYXNzLiBJdCBpcyB0aGUgZmlyc3QgKGluIGRpcmVjdCBiYXNlIGNsYXNzIG9yZGVyKSBub24tdmlydHVhbCBkeW5hbWljCiAgIC8vIGJhc2UgY2xhc3MsIGlmIG9uZSBleGlzdHMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBpID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICBlID0gUkQtPmJhc2VzX2VuZCgpOyBpICE9IGU7ICsraSkgeworICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSRC0+YmFzZXMoKSkgewogICAgIC8vIElnbm9yZSB2aXJ0dWFsIGJhc2VzLgotICAgIGlmIChpLT5pc1ZpcnR1YWwoKSkKKyAgICBpZiAoSS5pc1ZpcnR1YWwoKSkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZSA9Ci0gICAgICBjYXN0PENYWFJlY29yZERlY2w+KGktPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKKyAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CiAKICAgICBpZiAoQmFzZS0+aXNEeW5hbWljQ2xhc3MoKSkgewogICAgICAgLy8gV2UgZm91bmQgaXQuCkBAIC05MTgsMTIgKzkwOSwxMSBAQAogICB9CiAKICAgLy8gTm93IGdvIHRocm91Z2ggYWxsIGRpcmVjdCBiYXNlcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICBFID0gUkQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGJvb2wgSXNWaXJ0dWFsID0gSS0+aXNWaXJ0dWFsKCk7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT5iYXNlcygpKSB7CisgICAgYm9vbCBJc1ZpcnR1YWwgPSBJLmlzVmlydHVhbCgpOwogICAgIAogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0KLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKICAgICAKICAgICBJbmZvLT5CYXNlcy5wdXNoX2JhY2soQ29tcHV0ZUJhc2VTdWJvYmplY3RJbmZvKEJhc2VEZWNsLCBJc1ZpcnR1YWwsIEluZm8pKTsKICAgfQpAQCAtOTQ0LDEyICs5MzQsMTEgQEAKIH0KIAogdm9pZCBSZWNvcmRMYXlvdXRCdWlsZGVyOjpDb21wdXRlQmFzZVN1Ym9iamVjdEluZm8oY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICBFID0gUkQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGJvb2wgSXNWaXJ0dWFsID0gSS0+aXNWaXJ0dWFsKCk7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT5iYXNlcygpKSB7CisgICAgYm9vbCBJc1ZpcnR1YWwgPSBJLmlzVmlydHVhbCgpOwogCiAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPQotICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICBjYXN0PENYWFJlY29yZERlY2w+KEkuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogICAgIAogICAgIC8vIENvbXB1dGUgdGhlIGJhc2Ugc3Vib2JqZWN0IGluZm8gZm9yIHRoaXMgYmFzZS4KICAgICBCYXNlU3Vib2JqZWN0SW5mbyAqSW5mbyA9IENvbXB1dGVCYXNlU3Vib2JqZWN0SW5mbyhCYXNlRGVjbCwgSXNWaXJ0dWFsLCAwKTsKQEAgLTEwMzMsMTUgKzEwMjIsMTMgQEAKICAgfQogCiAgIC8vIE5vdyBsYXkgb3V0IHRoZSBub24tdmlydHVhbCBiYXNlcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBSRC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT5iYXNlcygpKSB7CiAKICAgICAvLyBJZ25vcmUgdmlydHVhbCBiYXNlcy4KLSAgICBpZiAoSS0+aXNWaXJ0dWFsKCkpCisgICAgaWYgKEkuaXNWaXJ0dWFsKCkpCiAgICAgICBjb250aW51ZTsKIAotICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0KLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5jYXN0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKKyAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9IEkuZ2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKIAogICAgIC8vIFNraXAgdGhlIHByaW1hcnkgYmFzZSwgYmVjYXVzZSB3ZSd2ZSBhbHJlYWR5IGxhaWQgaXQgb3V0LiAgVGhlCiAgICAgLy8gIVByaW1hcnlCYXNlSXNWaXJ0dWFsIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSBhCkBAIC0xMTE4LDE1ICsxMTA1LDEzIEBACiAgICAgUHJpbWFyeUJhc2VJc1ZpcnR1YWwgPSBMYXlvdXQuaXNQcmltYXJ5QmFzZVZpcnR1YWwoKTsKICAgfQogCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICBFID0gUkQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGFzc2VydCghSS0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSAmJgorICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSRC0+YmFzZXMoKSkgeworICAgIGFzc2VydCghSS5nZXRUeXBlKCktPmlzRGVwZW5kZW50VHlwZSgpICYmCiAgICAgICAgICAgICJDYW5ub3QgbGF5b3V0IGNsYXNzIHdpdGggZGVwZW5kZW50IGJhc2VzLiIpOwogCi0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPQotICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLT5nZXRUeXBlKCktPmNhc3RBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0gSS5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOwogCi0gICAgaWYgKEktPmlzVmlydHVhbCgpKSB7CisgICAgaWYgKEkuaXNWaXJ0dWFsKCkpIHsKICAgICAgIGlmIChQcmltYXJ5QmFzZSAhPSBCYXNlRGVjbCB8fCAhUHJpbWFyeUJhc2VJc1ZpcnR1YWwpIHsKICAgICAgICAgYm9vbCBJbmRpcmVjdFByaW1hcnlCYXNlID0gSW5kaXJlY3RQcmltYXJ5QmFzZXMuY291bnQoQmFzZURlY2wpOwogCkBAIC0xMTkxLDcgKzExNzYsNyBAQAogICAgIH0KICAgfQogICAKLSAgQ2hhclVuaXRzIFVucGFja2VkQmFzZUFsaWduID0gTGF5b3V0LmdldE5vblZpcnR1YWxBbGlnbigpOworICBDaGFyVW5pdHMgVW5wYWNrZWRCYXNlQWxpZ24gPSBMYXlvdXQuZ2V0Tm9uVmlydHVhbEFsaWdubWVudCgpOwogICBDaGFyVW5pdHMgQmFzZUFsaWduID0gKFBhY2tlZCkgPyBDaGFyVW5pdHM6Ok9uZSgpIDogVW5wYWNrZWRCYXNlQWxpZ247CiAgCiAgIC8vIElmIHdlIGhhdmUgYW4gZW1wdHkgYmFzZSBjbGFzcywgdHJ5IHRvIHBsYWNlIGl0IGF0IG9mZnNldCAwLgpAQCAtMTMyNiwyMiArMTMxMSwyMCBAQAogCiAjaWZuZGVmIE5ERUJVRwogICAvLyBDaGVjayB0aGF0IHdlIGhhdmUgYmFzZSBvZmZzZXRzIGZvciBhbGwgYmFzZXMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoSS0+aXNWaXJ0dWFsKCkpCisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT5iYXNlcygpKSB7CisgICAgaWYgKEkuaXNWaXJ0dWFsKCkpCiAgICAgICBjb250aW51ZTsKIAogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0KLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKIAogICAgIGFzc2VydChCYXNlcy5jb3VudChCYXNlRGVjbCkgJiYgIkRpZCBub3QgZmluZCBiYXNlIG9mZnNldCEiKTsKICAgfQogCiAgIC8vIEFuZCBhbGwgdmlydHVhbCBiYXNlcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IFJELT52YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT52YmFzZXMoKSkgewogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0KLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKIAogICAgIGFzc2VydChWQmFzZXMuY291bnQoQmFzZURlY2wpICYmICJEaWQgbm90IGZpbmQgYmFzZSBvZmZzZXQhIik7CiAgIH0KQEAgLTEzNzQsOSArMTM1Nyw4IEBACiB2b2lkIFJlY29yZExheW91dEJ1aWxkZXI6OkxheW91dEZpZWxkcyhjb25zdCBSZWNvcmREZWNsICpEKSB7CiAgIC8vIExheW91dCBlYWNoIGZpZWxkLCBmb3Igbm93LCBqdXN0IHNlcXVlbnRpYWxseSwgcmVzcGVjdGluZyBhbGlnbm1lbnQuICBJbgogICAvLyB0aGUgZnV0dXJlLCB0aGlzIHdpbGwgbmVlZCB0byBiZSB0d2Vha2FibGUgYnkgdGFyZ2V0cy4KLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGaWVsZCA9IEQtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgRmllbGRFbmQgPSBELT5maWVsZF9lbmQoKTsgRmllbGQgIT0gRmllbGRFbmQ7ICsrRmllbGQpCi0gICAgTGF5b3V0RmllbGQoKkZpZWxkKTsKKyAgZm9yIChjb25zdCBhdXRvICpGaWVsZCA6IEQtPmZpZWxkcygpKQorICAgIExheW91dEZpZWxkKEZpZWxkKTsKIH0KIAogdm9pZCBSZWNvcmRMYXlvdXRCdWlsZGVyOjpMYXlvdXRXaWRlQml0RmllbGQodWludDY0X3QgRmllbGRTaXplLApAQCAtMTQ1MiwxMjcgKzE0MzQsMjI0IEBACiAgIHVpbnQ2NF90IFR5cGVTaXplID0gRmllbGRJbmZvLmZpcnN0OwogICB1bnNpZ25lZCBGaWVsZEFsaWduID0gRmllbGRJbmZvLnNlY29uZDsKIAorICAvLyBVbmZpbGxlZEJpdHNJbkxhc3RVbml0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUKKyAgLy8gbGFzdCBhbGxvY2F0ZWQgYml0ZmllbGQgKGkuZS4gdGhlIGZpcnN0IGJpdCBvZmZzZXQgYXZhaWxhYmxlIGZvcgorICAvLyBiaXRmaWVsZHMpIGFuZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgc2l6ZSBpbiBiaXRzIChpLmUuIHRoZQorICAvLyBmaXJzdCBiaXQgb2Zmc2V0IGF2YWlsYWJsZSBmb3Igbm9uLWJpdGZpZWxkcykuICBUaGUgY3VycmVudCBkYXRhCisgIC8vIHNpemUgaW4gYml0cyBpcyBhbHdheXMgYSBtdWx0aXBsZSBvZiB0aGUgY2hhciBzaXplOyBhZGRpdGlvbmFsbHksCisgIC8vIGZvciBtc19zdHJ1Y3QgcmVjb3JkcyBpdCdzIGFsc28gYSBtdWx0aXBsZSBvZiB0aGUKKyAgLy8gTGFzdEJpdGZpZWxkVHlwZVNpemUgKGlmIHNldCkuCisKKyAgLy8gVGhlIHN0cnVjdC1sYXlvdXQgYWxnb3JpdGhtIGlzIGRpY3RhdGVkIGJ5IHRoZSBwbGF0Zm9ybSBBQkksCisgIC8vIHdoaWNoIGluIHByaW5jaXBsZSBjb3VsZCB1c2UgYWxtb3N0IGFueSBydWxlcyBpdCBsaWtlcy4gIEluCisgIC8vIHByYWN0aWNlLCBVTklYeSB0YXJnZXRzIHRlbmQgdG8gaW5oZXJpdCB0aGUgYWxnb3JpdGhtIGRlc2NyaWJlZAorICAvLyBpbiB0aGUgU3lzdGVtIFYgZ2VuZXJpYyBBQkkuICBUaGUgYmFzaWMgYml0ZmllbGQgbGF5b3V0IHJ1bGUgaW4KKyAgLy8gU3lzdGVtIFYgaXMgdG8gcGxhY2UgYml0ZmllbGRzIGF0IHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgb2Zmc2V0CisgIC8vIHdoZXJlIHRoZSBlbnRpcmUgYml0ZmllbGQgd291bGQgZml0IGluIGFuIGFsaWduZWQgc3RvcmFnZSB1bml0IG9mCisgIC8vIHRoZSBkZWNsYXJlZCB0eXBlOyBpdCdzIG9rYXkgaWYgYW4gZWFybGllciBvciBsYXRlciBub24tYml0ZmllbGQKKyAgLy8gaXMgYWxsb2NhdGVkIGluIHRoZSBzYW1lIHN0b3JhZ2UgdW5pdC4gIEhvd2V2ZXIsIHNvbWUgdGFyZ2V0cworICAvLyAodGhvc2UgdGhhdCAhdXNlQml0RmllbGRUeXBlQWxpZ25tZW50KCksIGUuZy4gQVJNIEFQQ1MpIGRvbid0CisgIC8vIHJlcXVpcmUgdGhpcyBzdG9yYWdlIHVuaXQgdG8gYmUgYWxpZ25lZCwgYW5kIHRoZXJlZm9yZSBhbHdheXMgcHV0CisgIC8vIHRoZSBiaXRmaWVsZCBhdCB0aGUgbmV4dCBhdmFpbGFibGUgYml0IG9mZnNldC4KKworICAvLyBtc19zdHJ1Y3QgYmFzaWNhbGx5IHJlcXVlc3RzIGEgY29tcGxldGUgcmVwbGFjZW1lbnQgb2YgdGhlCisgIC8vIHBsYXRmb3JtIEFCSSdzIHN0cnVjdC1sYXlvdXQgYWxnb3JpdGhtLCB3aXRoIHRoZSBoaWdoLWxldmVsIGdvYWwKKyAgLy8gb2YgZHVwbGljYXRpbmcgTVNWQydzIGxheW91dC4gIEZvciBub24tYml0ZmllbGRzLCB0aGlzIGZvbGxvd3MKKyAgLy8gdGhlIHRoZSBzdGFuZGFyZCBhbGdvcml0aG0uICBUaGUgYmFzaWMgYml0ZmllbGQgbGF5b3V0IHJ1bGUgaXMgdG8KKyAgLy8gYWxsb2NhdGUgYW4gZW50aXJlIHVuaXQgb2YgdGhlIGJpdGZpZWxkJ3MgZGVjbGFyZWQgdHlwZQorICAvLyAoZS5nLiAndW5zaWduZWQgbG9uZycpLCB0aGVuIHBhcmNlbCBpdCB1cCBhbW9uZyBzdWNjZXNzaXZlCisgIC8vIGJpdGZpZWxkcyB3aG9zZSBkZWNsYXJlZCB0eXBlcyBoYXZlIHRoZSBzYW1lIHNpemUsIG1ha2luZyBhIG5ldworICAvLyB1bml0IGFzIHNvb24gYXMgdGhlIGxhc3QgY2FuIG5vIGxvbmdlciBzdG9yZSB0aGUgd2hvbGUgdmFsdWUuCisgIC8vIFNpbmNlIGl0IGNvbXBsZXRlbHkgcmVwbGFjZXMgdGhlIHBsYXRmb3JtIEFCSSdzIGFsZ29yaXRobSwKKyAgLy8gc2V0dGluZ3MgbGlrZSAhdXNlQml0RmllbGRUeXBlQWxpZ25tZW50KCkgZG8gbm90IGFwcGx5LgorCisgIC8vIEEgemVyby13aWR0aCBiaXRmaWVsZCBmb3JjZXMgdGhlIHVzZSBvZiBhIG5ldyBzdG9yYWdlIHVuaXQgZm9yCisgIC8vIGxhdGVyIGJpdGZpZWxkcy4gIEluIGdlbmVyYWwsIHRoaXMgb2NjdXJzIGJ5IHJvdW5kaW5nIHVwIHRoZQorICAvLyBjdXJyZW50IHNpemUgb2YgdGhlIHN0cnVjdCBhcyBpZiB0aGUgYWxnb3JpdGhtIHdlcmUgYWJvdXQgdG8KKyAgLy8gcGxhY2UgYSBub24tYml0ZmllbGQgb2YgdGhlIGZpZWxkJ3MgZm9ybWFsIHR5cGUuICBVc3VhbGx5IHRoaXMKKyAgLy8gZG9lcyBub3QgY2hhbmdlIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHN0cnVjdCBpdHNlbGYsIGJ1dCBpdCBkb2VzCisgIC8vIG9uIHNvbWUgdGFyZ2V0cyAodGhvc2UgdGhhdCB1c2VaZXJvTGVuZ3RoQml0ZmllbGRBbGlnbm1lbnQoKSwKKyAgLy8gZS5nLiBBUk0pLiAgSW4gbXNfc3RydWN0IGxheW91dCwgemVyby13aWR0aCBiaXRmaWVsZHMgYXJlCisgIC8vIGlnbm9yZWQgdW5sZXNzIHRoZXkgZm9sbG93IGEgbm9uLXplcm8td2lkdGggYml0ZmllbGQuCisKKyAgLy8gQSBmaWVsZCBhbGlnbm1lbnQgcmVzdHJpY3Rpb24gKGUuZy4gZnJvbSAjcHJhZ21hIHBhY2spIG9yCisgIC8vIHNwZWNpZmljYXRpb24gKGUuZy4gZnJvbSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKSkpIGNoYW5nZXMgdGhlCisgIC8vIGZvcm1hbCBhbGlnbm1lbnQgb2YgdGhlIGZpZWxkLiAgRm9yIFN5c3RlbSBWLCB0aGlzIGFsdGVycyB0aGUKKyAgLy8gcmVxdWlyZWQgYWxpZ25tZW50IG9mIHRoZSBub3Rpb25hbCBzdG9yYWdlIHVuaXQgdGhhdCBtdXN0IGNvbnRhaW4KKyAgLy8gdGhlIGJpdGZpZWxkLiAgRm9yIG1zX3N0cnVjdCwgdGhpcyBvbmx5IGFmZmVjdHMgdGhlIHBsYWNlbWVudCBvZgorICAvLyBuZXcgc3RvcmFnZSB1bml0cy4gIEluIGJvdGggY2FzZXMsIHRoZSBlZmZlY3Qgb2YgI3ByYWdtYSBwYWNrIGlzCisgIC8vIGlnbm9yZWQgb24gemVyby13aWR0aCBiaXRmaWVsZHMuCisKKyAgLy8gT24gU3lzdGVtIFYsIGEgcGFja2VkIGZpZWxkIChlLmcuIGZyb20gI3ByYWdtYSBwYWNrIG9yCisgIC8vIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpKSBhbHdheXMgdXNlcyB0aGUgbmV4dCBhdmFpbGFibGUgYml0CisgIC8vIG9mZnNldC4KKworICAvLyBJbiBhbiBtc19zdHJ1Y3Qgc3RydWN0LCB0aGUgYWxpZ25tZW50IG9mIGEgZnVuZGFtZW50YWwgdHlwZSBpcworICAvLyBhbHdheXMgZXF1YWwgdG8gaXRzIHNpemUuICBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBtaW1pYworICAvLyB0aGUgaTM4NiBhbGlnbm1lbnQgcnVsZXMgb24gdGFyZ2V0cyB3aGljaCBtaWdodCBub3QgZnVsbHkgYWxpZ24KKyAgLy8gYWxsIHR5cGVzIChlLmcuIERhcndpbiBQUEMzMiwgd2hlcmUgYWxpZ25vZihsb25nIGxvbmcpID09IDQpLgorCisgIC8vIEZpcnN0LCBzb21lIHNpbXBsZSBib29ra2VlcGluZyB0byBwZXJmb3JtIGZvciBtc19zdHJ1Y3Qgc3RydWN0cy4KICAgaWYgKElzTXNTdHJ1Y3QpIHsKLSAgICAvLyBUaGUgZmllbGQgYWxpZ25tZW50IGZvciBpbnRlZ2VyIHR5cGVzIGluIG1zX3N0cnVjdCBzdHJ1Y3RzIGlzCi0gICAgLy8gYWx3YXlzIHRoZSBzaXplLgorICAgIC8vIFRoZSBmaWVsZCBhbGlnbm1lbnQgZm9yIGludGVnZXIgdHlwZXMgaXMgYWx3YXlzIHRoZSBzaXplLgogICAgIEZpZWxkQWxpZ24gPSBUeXBlU2l6ZTsKLSAgICAvLyBJZ25vcmUgemVyby1sZW5ndGggYml0ZmllbGRzIGFmdGVyIG5vbi1iaXRmaWVsZHMgaW4gbXNfc3RydWN0IHN0cnVjdHMuCi0gICAgaWYgKCFGaWVsZFNpemUgJiYgIUxhc3RCaXRmaWVsZFR5cGVTaXplKQotICAgICAgRmllbGRBbGlnbiA9IDE7Ci0gICAgLy8gSWYgYSBiaXRmaWVsZCBpcyBmb2xsb3dlZCBieSBhIGJpdGZpZWxkIG9mIGEgZGlmZmVyZW50IHNpemUsIGRvbid0Ci0gICAgLy8gcGFjayB0aGUgYml0cyB0b2dldGhlciBpbiBtc19zdHJ1Y3Qgc3RydWN0cy4KKworICAgIC8vIElmIHRoZSBwcmV2aW91cyBmaWVsZCB3YXMgbm90IGEgYml0ZmllbGQsIG9yIHdhcyBhIGJpdGZpZWxkCisgICAgLy8gd2l0aCBhIGRpZmZlcmVudCBzdG9yYWdlIHVuaXQgc2l6ZSwgd2UncmUgZG9uZSB3aXRoIHRoYXQKKyAgICAvLyBzdG9yYWdlIHVuaXQuCiAgICAgaWYgKExhc3RCaXRmaWVsZFR5cGVTaXplICE9IFR5cGVTaXplKSB7CisgICAgICAvLyBBbHNvLCBpZ25vcmUgemVyby1sZW5ndGggYml0ZmllbGRzIGFmdGVyIG5vbi1iaXRmaWVsZHMuCisgICAgICBpZiAoIUxhc3RCaXRmaWVsZFR5cGVTaXplICYmICFGaWVsZFNpemUpCisgICAgICAgIEZpZWxkQWxpZ24gPSAxOworCiAgICAgICBVbmZpbGxlZEJpdHNJbkxhc3RVbml0ID0gMDsKICAgICAgIExhc3RCaXRmaWVsZFR5cGVTaXplID0gMDsKICAgICB9CiAgIH0KIAotICB1aW50NjRfdCBVbnBhZGRlZEZpZWxkT2Zmc2V0ID0gZ2V0RGF0YVNpemVJbkJpdHMoKSAtIFVuZmlsbGVkQml0c0luTGFzdFVuaXQ7Ci0gIHVpbnQ2NF90IEZpZWxkT2Zmc2V0ID0gSXNVbmlvbiA/IDAgOiBVbnBhZGRlZEZpZWxkT2Zmc2V0OwotCi0gIGJvb2wgWmVyb0xlbmd0aEJpdGZpZWxkID0gZmFsc2U7Ci0gIGlmICghQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkudXNlQml0RmllbGRUeXBlQWxpZ25tZW50KCkgJiYKLSAgICAgIENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLnVzZVplcm9MZW5ndGhCaXRmaWVsZEFsaWdubWVudCgpICYmCi0gICAgICBGaWVsZFNpemUgPT0gMCkgewotICAgIC8vIFRoZSBhbGlnbm1lbnQgb2YgYSB6ZXJvLWxlbmd0aCBiaXRmaWVsZCBhZmZlY3RzIHRoZSBhbGlnbm1lbnQKLSAgICAvLyBvZiB0aGUgbmV4dCBtZW1iZXIuICBUaGUgYWxpZ25tZW50IGlzIHRoZSBtYXggb2YgdGhlIHplcm8gCi0gICAgLy8gbGVuZ3RoIGJpdGZpZWxkJ3MgYWxpZ25tZW50IGFuZCBhIHRhcmdldCBzcGVjaWZpYyBmaXhlZCB2YWx1ZS4KLSAgICBaZXJvTGVuZ3RoQml0ZmllbGQgPSB0cnVlOwotICAgIHVuc2lnbmVkIFplcm9MZW5ndGhCaXRmaWVsZEJvdW5kYXJ5ID0KLSAgICAgIENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldFplcm9MZW5ndGhCaXRmaWVsZEJvdW5kYXJ5KCk7Ci0gICAgaWYgKFplcm9MZW5ndGhCaXRmaWVsZEJvdW5kYXJ5ID4gRmllbGRBbGlnbikKLSAgICAgIEZpZWxkQWxpZ24gPSBaZXJvTGVuZ3RoQml0ZmllbGRCb3VuZGFyeTsKLSAgfQotCisgIC8vIElmIHRoZSBmaWVsZCBpcyB3aWRlciB0aGFuIGl0cyBkZWNsYXJlZCB0eXBlLCBpdCBmb2xsb3dzCisgIC8vIGRpZmZlcmVudCBydWxlcyBpbiBhbGwgY2FzZXMuCiAgIGlmIChGaWVsZFNpemUgPiBUeXBlU2l6ZSkgewogICAgIExheW91dFdpZGVCaXRGaWVsZChGaWVsZFNpemUsIFR5cGVTaXplLCBGaWVsZFBhY2tlZCwgRCk7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgLy8gVGhlIGFsaWduIGlmIHRoZSBmaWVsZCBpcyBub3QgcGFja2VkLiBUaGlzIGlzIHRvIGNoZWNrIGlmIHRoZSBhdHRyaWJ1dGUKLSAgLy8gd2FzIHVubmVjZXNzYXJ5ICgtV3BhY2tlZCkuCisgIC8vIENvbXB1dGUgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBvZmZzZXQuCisgIHVpbnQ2NF90IEZpZWxkT2Zmc2V0ID0KKyAgICBJc1VuaW9uID8gMCA6IChnZXREYXRhU2l6ZUluQml0cygpIC0gVW5maWxsZWRCaXRzSW5MYXN0VW5pdCk7CisKKyAgLy8gSGFuZGxlIHRhcmdldHMgdGhhdCBkb24ndCBob25vciBiaXRmaWVsZCB0eXBlIGFsaWdubWVudC4KKyAgaWYgKCFJc01zU3RydWN0ICYmICFDb250ZXh0LmdldFRhcmdldEluZm8oKS51c2VCaXRGaWVsZFR5cGVBbGlnbm1lbnQoKSkgeworICAgIC8vIFNvbWUgc3VjaCB0YXJnZXRzIGRvIGhvbm9yIGl0IG9uIHplcm8td2lkdGggYml0ZmllbGRzLgorICAgIGlmIChGaWVsZFNpemUgPT0gMCAmJgorICAgICAgICBDb250ZXh0LmdldFRhcmdldEluZm8oKS51c2VaZXJvTGVuZ3RoQml0ZmllbGRBbGlnbm1lbnQoKSkgeworICAgICAgLy8gVGhlIGFsaWdubWVudCB0byByb3VuZCB1cCB0byBpcyB0aGUgbWF4IG9mIHRoZSBmaWVsZCdzIG5hdHVyYWwKKyAgICAgIC8vIGFsaWdubWVudCBhbmQgYSB0YXJnZXQtc3BlY2lmaWMgZml4ZWQgdmFsdWUgKHNvbWV0aW1lcyB6ZXJvKS4KKyAgICAgIHVuc2lnbmVkIFplcm9MZW5ndGhCaXRmaWVsZEJvdW5kYXJ5ID0KKyAgICAgICAgQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkuZ2V0WmVyb0xlbmd0aEJpdGZpZWxkQm91bmRhcnkoKTsKKyAgICAgIEZpZWxkQWxpZ24gPSBzdGQ6Om1heChGaWVsZEFsaWduLCBaZXJvTGVuZ3RoQml0ZmllbGRCb3VuZGFyeSk7CisKKyAgICAvLyBJZiB0aGF0IGRvZXNuJ3QgYXBwbHksIGp1c3QgaWdub3JlIHRoZSBmaWVsZCBhbGlnbm1lbnQuCisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkQWxpZ24gPSAxOworICAgIH0KKyAgfQorCisgIC8vIFJlbWVtYmVyIHRoZSBhbGlnbm1lbnQgd2Ugd291bGQgaGF2ZSB1c2VkIGlmIHRoZSBmaWVsZCB3ZXJlIG5vdCBwYWNrZWQuCiAgIHVuc2lnbmVkIFVucGFja2VkRmllbGRBbGlnbiA9IEZpZWxkQWxpZ247Ci0gIHVpbnQ2NF90IFVucGFja2VkRmllbGRPZmZzZXQgPSBGaWVsZE9mZnNldDsKLSAgaWYgKCFDb250ZXh0LmdldFRhcmdldEluZm8oKS51c2VCaXRGaWVsZFR5cGVBbGlnbm1lbnQoKSAmJiAhWmVyb0xlbmd0aEJpdGZpZWxkKQotICAgIFVucGFja2VkRmllbGRBbGlnbiA9IDE7CiAKLSAgaWYgKEZpZWxkUGFja2VkIHx8IAotICAgICAgKCFDb250ZXh0LmdldFRhcmdldEluZm8oKS51c2VCaXRGaWVsZFR5cGVBbGlnbm1lbnQoKSAmJiAhWmVyb0xlbmd0aEJpdGZpZWxkKSkKKyAgLy8gSWdub3JlIHRoZSBmaWVsZCBhbGlnbm1lbnQgaWYgdGhlIGZpZWxkIGlzIHBhY2tlZCB1bmxlc3MgaXQgaGFzIHplcm8tc2l6ZS4KKyAgaWYgKCFJc01zU3RydWN0ICYmIEZpZWxkUGFja2VkICYmIEZpZWxkU2l6ZSAhPSAwKQogICAgIEZpZWxkQWxpZ24gPSAxOwotICBGaWVsZEFsaWduID0gc3RkOjptYXgoRmllbGRBbGlnbiwgRC0+Z2V0TWF4QWxpZ25tZW50KCkpOwotICBVbnBhY2tlZEZpZWxkQWxpZ24gPSBzdGQ6Om1heChVbnBhY2tlZEZpZWxkQWxpZ24sIEQtPmdldE1heEFsaWdubWVudCgpKTsKIAotICAvLyBUaGUgbWF4aW11bSBmaWVsZCBhbGlnbm1lbnQgb3ZlcnJpZGVzIHRoZSBhbGlnbmVkIGF0dHJpYnV0ZS4KLSAgaWYgKCFNYXhGaWVsZEFsaWdubWVudC5pc1plcm8oKSAmJiBGaWVsZFNpemUgIT0gMCkgeworICAvLyBCdXQsIGlmIHRoZXJlJ3MgYW4gJ2FsaWduZWQnIGF0dHJpYnV0ZSBvbiB0aGUgZmllbGQsIGhvbm9yIHRoYXQuCisgIGlmICh1bnNpZ25lZCBFeHBsaWNpdEZpZWxkQWxpZ24gPSBELT5nZXRNYXhBbGlnbm1lbnQoKSkgeworICAgIEZpZWxkQWxpZ24gPSBzdGQ6Om1heChGaWVsZEFsaWduLCBFeHBsaWNpdEZpZWxkQWxpZ24pOworICAgIFVucGFja2VkRmllbGRBbGlnbiA9IHN0ZDo6bWF4KFVucGFja2VkRmllbGRBbGlnbiwgRXhwbGljaXRGaWVsZEFsaWduKTsKKyAgfQorCisgIC8vIEJ1dCwgaWYgdGhlcmUncyBhICNwcmFnbWEgcGFjayBpbiBwbGF5LCB0aGF0IHRha2VzIHByZWNlZGVudCBvdmVyCisgIC8vIGV2ZW4gdGhlICdhbGlnbmVkJyBhdHRyaWJ1dGUsIGZvciBub24temVyby13aWR0aCBiaXRmaWVsZHMuCisgIGlmICghTWF4RmllbGRBbGlnbm1lbnQuaXNaZXJvKCkgJiYgRmllbGRTaXplKSB7CiAgICAgdW5zaWduZWQgTWF4RmllbGRBbGlnbm1lbnRJbkJpdHMgPSBDb250ZXh0LnRvQml0cyhNYXhGaWVsZEFsaWdubWVudCk7CiAgICAgRmllbGRBbGlnbiA9IHN0ZDo6bWluKEZpZWxkQWxpZ24sIE1heEZpZWxkQWxpZ25tZW50SW5CaXRzKTsKICAgICBVbnBhY2tlZEZpZWxkQWxpZ24gPSBzdGQ6Om1pbihVbnBhY2tlZEZpZWxkQWxpZ24sIE1heEZpZWxkQWxpZ25tZW50SW5CaXRzKTsKICAgfQogCi0gIC8vIG1zX3N0cnVjdCBiaXRmaWVsZHMgYWx3YXlzIGhhdmUgdG8gc3RhcnQgYXQgYSByb3VuZCBhbGlnbm1lbnQuCi0gIGlmIChJc01zU3RydWN0ICYmICFMYXN0Qml0ZmllbGRUeXBlU2l6ZSkgewotICAgIEZpZWxkT2Zmc2V0ID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KEZpZWxkT2Zmc2V0LCBGaWVsZEFsaWduKTsKLSAgICBVbnBhY2tlZEZpZWxkT2Zmc2V0ID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KFVucGFja2VkRmllbGRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnBhY2tlZEZpZWxkQWxpZ24pOworICAvLyBGb3IgcHVycG9zZXMgb2YgZGlhZ25vc3RpY3MsIHdlJ3JlIGdvaW5nIHRvIHNpbXVsdGFuZW91c2x5CisgIC8vIGNvbXB1dGUgdGhlIGZpZWxkIG9mZnNldHMgdGhhdCB3ZSB3b3VsZCBoYXZlIHVzZWQgaWYgd2Ugd2VyZW4ndAorICAvLyBhZGRpbmcgYW55IGFsaWdubWVudCBwYWRkaW5nIG9yIGlmIHRoZSBmaWVsZCB3ZXJlbid0IHBhY2tlZC4KKyAgdWludDY0X3QgVW5wYWRkZWRGaWVsZE9mZnNldCA9IEZpZWxkT2Zmc2V0OworICB1aW50NjRfdCBVbnBhY2tlZEZpZWxkT2Zmc2V0ID0gRmllbGRPZmZzZXQ7CisKKyAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBhZGQgcGFkZGluZyB0byBmaXQgdGhlIGJpdGZpZWxkIHdpdGhpbiBhbgorICAvLyBhbGxvY2F0aW9uIHVuaXQgd2l0aCB0aGUgcmlnaHQgc2l6ZSBhbmQgYWxpZ25tZW50LiAgVGhlIHJ1bGVzIGFyZQorICAvLyBzb21ld2hhdCBkaWZmZXJlbnQgaGVyZSBmb3IgbXNfc3RydWN0IHN0cnVjdHMuCisgIGlmIChJc01zU3RydWN0KSB7CisgICAgLy8gSWYgaXQncyBub3QgYSB6ZXJvLXdpZHRoIGJpdGZpZWxkLCBhbmQgd2UgY2FuIGZpdCB0aGUgYml0ZmllbGQKKyAgICAvLyBpbnRvIHRoZSBhY3RpdmUgc3RvcmFnZSB1bml0IChhbmQgd2UgaGF2ZW4ndCBhbHJlYWR5IGRlY2lkZWQgdG8KKyAgICAvLyBzdGFydCBhIG5ldyBzdG9yYWdlIHVuaXQpLCBqdXN0IGRvIHNvLCByZWdhcmRsZXNzIG9mIGFueSBvdGhlcgorICAgIC8vIG90aGVyIGNvbnNpZGVyYXRpb24uICBPdGhlcndpc2UsIHJvdW5kIHVwIHRvIHRoZSByaWdodCBhbGlnbm1lbnQuCisgICAgaWYgKEZpZWxkU2l6ZSA9PSAwIHx8IEZpZWxkU2l6ZSA+IFVuZmlsbGVkQml0c0luTGFzdFVuaXQpIHsKKyAgICAgIEZpZWxkT2Zmc2V0ID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KEZpZWxkT2Zmc2V0LCBGaWVsZEFsaWduKTsKKyAgICAgIFVucGFja2VkRmllbGRPZmZzZXQgPSBsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoVW5wYWNrZWRGaWVsZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5wYWNrZWRGaWVsZEFsaWduKTsKKyAgICAgIFVuZmlsbGVkQml0c0luTGFzdFVuaXQgPSAwOworICAgIH0KKworICB9IGVsc2UgeworICAgIC8vICNwcmFnbWEgcGFjaywgd2l0aCBhbnkgdmFsdWUsIHN1cHByZXNzZXMgdGhlIGluc2VydGlvbiBvZiBwYWRkaW5nLgorICAgIGJvb2wgQWxsb3dQYWRkaW5nID0gTWF4RmllbGRBbGlnbm1lbnQuaXNaZXJvKCk7CisKKyAgICAvLyBDb21wdXRlIHRoZSByZWFsIG9mZnNldC4KKyAgICBpZiAoRmllbGRTaXplID09IDAgfHwgCisgICAgICAgIChBbGxvd1BhZGRpbmcgJiYKKyAgICAgICAgIChGaWVsZE9mZnNldCAmIChGaWVsZEFsaWduLTEpKSArIEZpZWxkU2l6ZSA+IFR5cGVTaXplKSkgeworICAgICAgRmllbGRPZmZzZXQgPSBsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoRmllbGRPZmZzZXQsIEZpZWxkQWxpZ24pOworICAgIH0KKworICAgIC8vIFJlcGVhdCB0aGUgY29tcHV0YXRpb24gZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuCisgICAgaWYgKEZpZWxkU2l6ZSA9PSAwIHx8CisgICAgICAgIChBbGxvd1BhZGRpbmcgJiYKKyAgICAgICAgIChVbnBhY2tlZEZpZWxkT2Zmc2V0ICYgKFVucGFja2VkRmllbGRBbGlnbi0xKSkgKyBGaWVsZFNpemUgPiBUeXBlU2l6ZSkpCisgICAgICBVbnBhY2tlZEZpZWxkT2Zmc2V0ID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KFVucGFja2VkRmllbGRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucGFja2VkRmllbGRBbGlnbik7CiAgIH0KIAotICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGFkZCBwYWRkaW5nIHRvIGdpdmUgdGhlIGZpZWxkIHRoZSBjb3JyZWN0IGFsaWdubWVudC4KLSAgaWYgKEZpZWxkU2l6ZSA9PSAwIHx8IAotICAgICAgKE1heEZpZWxkQWxpZ25tZW50LmlzWmVybygpICYmCi0gICAgICAgKEZpZWxkT2Zmc2V0ICYgKEZpZWxkQWxpZ24tMSkpICsgRmllbGRTaXplID4gVHlwZVNpemUpKQotICAgIEZpZWxkT2Zmc2V0ID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KEZpZWxkT2Zmc2V0LCBGaWVsZEFsaWduKTsKLQotICBpZiAoRmllbGRTaXplID09IDAgfHwKLSAgICAgIChNYXhGaWVsZEFsaWdubWVudC5pc1plcm8oKSAmJgotICAgICAgIChVbnBhY2tlZEZpZWxkT2Zmc2V0ICYgKFVucGFja2VkRmllbGRBbGlnbi0xKSkgKyBGaWVsZFNpemUgPiBUeXBlU2l6ZSkpCi0gICAgVW5wYWNrZWRGaWVsZE9mZnNldCA9IGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChVbnBhY2tlZEZpZWxkT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5wYWNrZWRGaWVsZEFsaWduKTsKLQotICAvLyBQYWRkaW5nIG1lbWJlcnMgZG9uJ3QgYWZmZWN0IG92ZXJhbGwgYWxpZ25tZW50LCB1bmxlc3MgemVybyBsZW5ndGggYml0ZmllbGQKLSAgLy8gYWxpZ25tZW50IGlzIGVuYWJsZWQuCi0gIGlmICghRC0+Z2V0SWRlbnRpZmllcigpICYmCi0gICAgICAhQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkudXNlWmVyb0xlbmd0aEJpdGZpZWxkQWxpZ25tZW50KCkgJiYKLSAgICAgICFJc01zU3RydWN0KQotICAgIEZpZWxkQWxpZ24gPSBVbnBhY2tlZEZpZWxkQWxpZ24gPSAxOwotCisgIC8vIElmIHdlJ3JlIHVzaW5nIGV4dGVybmFsIGxheW91dCwgZ2l2ZSB0aGUgZXh0ZXJuYWwgbGF5b3V0IGEgY2hhbmNlCisgIC8vIHRvIG92ZXJyaWRlIHRoaXMgaW5mb3JtYXRpb24uCiAgIGlmIChFeHRlcm5hbExheW91dCkKICAgICBGaWVsZE9mZnNldCA9IHVwZGF0ZUV4dGVybmFsRmllbGRPZmZzZXQoRCwgRmllbGRPZmZzZXQpOwogCi0gIC8vIFBsYWNlIHRoaXMgZmllbGQgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgIC8vIE9rYXksIHBsYWNlIHRoZSBiaXRmaWVsZCBhdCB0aGUgY2FsY3VsYXRlZCBvZmZzZXQuCiAgIEZpZWxkT2Zmc2V0cy5wdXNoX2JhY2soRmllbGRPZmZzZXQpOwogCisgIC8vIEJvb2trZWVwaW5nOgorCisgIC8vIEFub255bW91cyBtZW1iZXJzIGRvbid0IGFmZmVjdCB0aGUgb3ZlcmFsbCByZWNvcmQgYWxpZ25tZW50LAorICAvLyBleGNlcHQgb24gdGFyZ2V0cyB3aGVyZSB0aGV5IGRvLgorICBpZiAoIUlzTXNTdHJ1Y3QgJiYKKyAgICAgICFDb250ZXh0LmdldFRhcmdldEluZm8oKS51c2VaZXJvTGVuZ3RoQml0ZmllbGRBbGlnbm1lbnQoKSAmJgorICAgICAgIUQtPmdldElkZW50aWZpZXIoKSkKKyAgICBGaWVsZEFsaWduID0gVW5wYWNrZWRGaWVsZEFsaWduID0gMTsKKworICAvLyBEaWFnbm9zZSBkaWZmZXJlbmNlcyBpbiBsYXlvdXQgZHVlIHRvIHBhZGRpbmcgb3IgcGFja2luZy4KICAgaWYgKCFFeHRlcm5hbExheW91dCkKICAgICBDaGVja0ZpZWxkUGFkZGluZyhGaWVsZE9mZnNldCwgVW5wYWRkZWRGaWVsZE9mZnNldCwgVW5wYWNrZWRGaWVsZE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICBVbnBhY2tlZEZpZWxkQWxpZ24sIEZpZWxkUGFja2VkLCBEKTsKIAogICAvLyBVcGRhdGUgRGF0YVNpemUgdG8gaW5jbHVkZSB0aGUgbGFzdCBieXRlIGNvbnRhaW5pbmcgKHBhcnQgb2YpIHRoZSBiaXRmaWVsZC4KKworICAvLyBGb3IgdW5pb25zLCB0aGlzIGlzIGp1c3QgYSBtYXggb3BlcmF0aW9uLCBhcyB1c3VhbC4KICAgaWYgKElzVW5pb24pIHsKICAgICAvLyBGSVhNRTogSSB0aGluayBGaWVsZFNpemUgc2hvdWxkIGJlIFR5cGVTaXplIGhlcmUuCiAgICAgc2V0RGF0YVNpemUoc3RkOjptYXgoZ2V0RGF0YVNpemVJbkJpdHMoKSwgRmllbGRTaXplKSk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKElzTXNTdHJ1Y3QgJiYgRmllbGRTaXplKSB7Ci0gICAgICAvLyBVbmRlciBtc19zdHJ1Y3QsIGEgYml0ZmllbGQgYWx3YXlzIHRha2VzIHVwIHNwYWNlIGVxdWFsIHRvIHRoZSBzaXplCi0gICAgICAvLyBvZiB0aGUgdHlwZS4gIFdlIGNhbid0IGp1c3QgY2hhbmdlIHRoZSBhbGlnbm1lbnQgY29tcHV0YXRpb24gb24gdGhlCi0gICAgICAvLyBvdGhlciBjb2RlcGF0aCBiZWNhdXNlIG9mIHRoZSB3YXkgdGhpcyBpbnRlcmFjdHMgd2l0aCAjcHJhZ21hIHBhY2s6Ci0gICAgICAvLyBpbiBhIHBhY2tlZCBzdHJ1Y3QsIHdlIG5lZWQgdG8gYWxsb2NhdGUgbWlzYWxpZ25lZCBzcGFjZSBpbiB0aGUKLSAgICAgIC8vIHN0cnVjdCB0byBob2xkIHRoZSBiaXRmaWVsZC4KLSAgICAgIGlmICghVW5maWxsZWRCaXRzSW5MYXN0VW5pdCkgewotICAgICAgICBzZXREYXRhU2l6ZShGaWVsZE9mZnNldCArIFR5cGVTaXplKTsKLSAgICAgICAgVW5maWxsZWRCaXRzSW5MYXN0VW5pdCA9IFR5cGVTaXplIC0gRmllbGRTaXplOwotICAgICAgfSBlbHNlIGlmIChVbmZpbGxlZEJpdHNJbkxhc3RVbml0IDwgRmllbGRTaXplKSB7Ci0gICAgICAgIHNldERhdGFTaXplKGdldERhdGFTaXplSW5CaXRzKCkgKyBUeXBlU2l6ZSk7Ci0gICAgICAgIFVuZmlsbGVkQml0c0luTGFzdFVuaXQgPSBUeXBlU2l6ZSAtIEZpZWxkU2l6ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFVuZmlsbGVkQml0c0luTGFzdFVuaXQgLT0gRmllbGRTaXplOwotICAgICAgfQotICAgICAgTGFzdEJpdGZpZWxkVHlwZVNpemUgPSBUeXBlU2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgdWludDY0X3QgTmV3U2l6ZUluQml0cyA9IEZpZWxkT2Zmc2V0ICsgRmllbGRTaXplOwotICAgICAgdWludDY0X3QgQml0ZmllbGRBbGlnbm1lbnQgPSBDb250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRDaGFyQWxpZ24oKTsKLSAgICAgIHNldERhdGFTaXplKGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChOZXdTaXplSW5CaXRzLCBCaXRmaWVsZEFsaWdubWVudCkpOwotICAgICAgVW5maWxsZWRCaXRzSW5MYXN0VW5pdCA9IGdldERhdGFTaXplSW5CaXRzKCkgLSBOZXdTaXplSW5CaXRzOwotICAgICAgTGFzdEJpdGZpZWxkVHlwZVNpemUgPSAwOworCisgIC8vIEZvciBub24temVyby13aWR0aCBiaXRmaWVsZHMgaW4gbXNfc3RydWN0IHN0cnVjdHMsIGFsbG9jYXRlIGEgbmV3CisgIC8vIHN0b3JhZ2UgdW5pdCBpZiBuZWNlc3NhcnkuCisgIH0gZWxzZSBpZiAoSXNNc1N0cnVjdCAmJiBGaWVsZFNpemUpIHsKKyAgICAvLyBXZSBzaG91bGQgaGF2ZSBjbGVhcmVkIFVuZmlsbGVkQml0c0luTGFzdFVuaXQgaW4gZXZlcnkgY2FzZQorICAgIC8vIHdoZXJlIHdlIGNoYW5nZWQgc3RvcmFnZSB1bml0cy4KKyAgICBpZiAoIVVuZmlsbGVkQml0c0luTGFzdFVuaXQpIHsKKyAgICAgIHNldERhdGFTaXplKEZpZWxkT2Zmc2V0ICsgVHlwZVNpemUpOworICAgICAgVW5maWxsZWRCaXRzSW5MYXN0VW5pdCA9IFR5cGVTaXplOwogICAgIH0KKyAgICBVbmZpbGxlZEJpdHNJbkxhc3RVbml0IC09IEZpZWxkU2l6ZTsKKyAgICBMYXN0Qml0ZmllbGRUeXBlU2l6ZSA9IFR5cGVTaXplOworCisgIC8vIE90aGVyd2lzZSwgYnVtcCB0aGUgZGF0YSBzaXplIHVwIHRvIGluY2x1ZGUgdGhlIGJpdGZpZWxkLAorICAvLyBpbmNsdWRpbmcgcGFkZGluZyB1cCB0byBjaGFyIGFsaWdubWVudCwgYW5kIHRoZW4gcmVtZW1iZXIgaG93CisgIC8vIGJpdHMgd2UgZGlkbid0IHVzZS4KKyAgfSBlbHNlIHsKKyAgICB1aW50NjRfdCBOZXdTaXplSW5CaXRzID0gRmllbGRPZmZzZXQgKyBGaWVsZFNpemU7CisgICAgdWludDY0X3QgQ2hhckFsaWdubWVudCA9IENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldENoYXJBbGlnbigpOworICAgIHNldERhdGFTaXplKGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChOZXdTaXplSW5CaXRzLCBDaGFyQWxpZ25tZW50KSk7CisgICAgVW5maWxsZWRCaXRzSW5MYXN0VW5pdCA9IGdldERhdGFTaXplSW5CaXRzKCkgLSBOZXdTaXplSW5CaXRzOworCisgICAgLy8gVGhlIG9ubHkgdGltZSB3ZSBjYW4gZ2V0IGhlcmUgZm9yIGFuIG1zX3N0cnVjdCBpcyBpZiB0aGlzIGlzIGEKKyAgICAvLyB6ZXJvLXdpZHRoIGJpdGZpZWxkLCB3aGljaCBkb2Vzbid0IGNvdW50IGFzIGFueXRoaW5nIGZvciB0aGUKKyAgICAvLyBwdXJwb3NlcyBvZiB1bmZpbGxlZCBiaXRzLgorICAgIExhc3RCaXRmaWVsZFR5cGVTaXplID0gMDsKICAgfQogCiAgIC8vIFVwZGF0ZSB0aGUgc2l6ZS4KQEAgLTE4NzgsMjAgKzE5NTcsMTggQEAKICAgaWYgKCFSRC0+aXNFeHRlcm5hbGx5VmlzaWJsZSgpKQogICAgIHJldHVybiAwOwogCi0gIC8vIFRlbXBsYXRlIGluc3RhbnRpYXRpb25zIGRvbid0IGhhdmUga2V5IGZ1bmN0aW9ucyxzZWUgSXRhbml1bSBDKysgQUJJIDUuMi42LgorICAvLyBUZW1wbGF0ZSBpbnN0YW50aWF0aW9ucyBkb24ndCBoYXZlIGtleSBmdW5jdGlvbnMgcGVyIEl0YW5pdW0gQysrIEFCSSA1LjIuNi4KICAgLy8gU2FtZSBiZWhhdmlvciBhcyBHQ0MuCiAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIFRTSyA9IFJELT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpOwogICBpZiAoVFNLID09IFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb24gfHwKKyAgICAgIFRTSyA9PSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVjbGFyYXRpb24gfHwKICAgICAgIFRTSyA9PSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVmaW5pdGlvbikKICAgICByZXR1cm4gMDsKIAogICBib29sIGFsbG93SW5saW5lRnVuY3Rpb25zID0KICAgICBDb250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRDWFhBQkkoKS5jYW5LZXlGdW5jdGlvbkJlSW5saW5lKCk7CiAKLSAgZm9yIChDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IgSSA9IFJELT5tZXRob2RfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBSRC0+bWV0aG9kX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGNvbnN0IENYWE1ldGhvZERlY2wgKk1EID0gKkk7Ci0KKyAgZm9yIChjb25zdCBhdXRvICpNRCA6IFJELT5tZXRob2RzKCkpIHsKICAgICBpZiAoIU1ELT5pc1ZpcnR1YWwoKSkKICAgICAgIGNvbnRpbnVlOwogCkBAIC0xOTg1LDcgKzIwNjIsNyBAQAogLy8KIC8vICogVGhlIGFsaWdubWVudCBvZiBiaXRmaWVsZHMgaW4gdW5pb25zIGlzIGlnbm9yZWQgd2hlbiBjb21wdXRpbmcgdGhlCiAvLyAgIGFsaWdubWVudCBvZiB0aGUgdW5pb24uCi0vLyAqIFRoZSBleGlzdGFuY2Ugb2YgemVyby13aWR0aCBiaXRmaWVsZCB0aGF0IG9jY3VycyBhZnRlciBhbnl0aGluZyBvdGhlciB0aGFuCisvLyAqIFRoZSBleGlzdGVuY2Ugb2YgemVyby13aWR0aCBiaXRmaWVsZCB0aGF0IG9jY3VycyBhZnRlciBhbnl0aGluZyBvdGhlciB0aGFuCiAvLyAgIGEgbm9uLXplcm8gbGVuZ3RoIGJpdGZpZWxkIGlzIGlnbm9yZWQuCiAvLyAqIFRoZSBJdGFuaXVtIGVxdWl2YWxlbnQgdnRhYmxlIHBvaW50ZXJzIGFyZSBzcGxpdCBpbnRvIGEgdmZwdHIgKHZpcnR1YWwKIC8vICAgZnVuY3Rpb24gcG9pbnRlcikgYW5kIGEgdmJwdHIgKHZpcnR1YWwgYmFzZSBwb2ludGVyKS4gIFRoZXkgY2FuIGVhY2ggYmUKQEAgLTIwMTQsMTUgKzIwOTEsMzIgQEAKIC8vICAgb25lLgogLy8gKiBUaGUgbGFzdCB6ZXJvIHNpemUgdmlydHVhbCBiYXNlIG1heSBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0LgogLy8gICBhbmQgY2FuIHBvdGVudGlhbGx5IGFsaWFzIGEgemVybyBzaXplZCB0eXBlIGluIHRoZSBuZXh0IHN0cnVjdC4KLS8vICogSWYgdGhlIGxhc3QgZmllbGQgaXMgYSBub24temVybyBsZW5ndGggYml0ZmllbGQgYW5kIHdlIGhhdmUgYW55IHZpcnR1YWwKLS8vICAgYmFzZXMgdGhlbiBzb21lIGV4dHJhIHBhZGRpbmcgaXMgYWRkZWQgYmVmb3JlIHRoZSB2aXJ0dWFsIGJhc2VzIGZvciBubwotLy8gICBvYnZpb3VzIHJlYXNvbi4KKy8vICogSWYgdGhlIGxhc3QgZmllbGQgaXMgYSBub24temVybyBsZW5ndGggYml0ZmllbGQsIGFsbCB2aXJ0dWFsIGJhc2VzIHdpbGwKKy8vICAgaGF2ZSBleHRyYSBwYWRkaW5nIGFkZGVkIGJlZm9yZSB0aGVtIGZvciBubyBvYnZpb3VzIHJlYXNvbi4gIFRoZSBwYWRkaW5nCisvLyAgIGhhcyB0aGUgc2FtZSBudW1iZXIgb2YgYml0cyBhcyB0aGUgdHlwZSBvZiB0aGUgYml0ZmllbGQuCiAvLyAqIFdoZW4gbGF5aW5nIG91dCBlbXB0eSBub24tdmlydHVhbCBiYXNlcywgYW4gZXh0cmEgYnl0ZSBvZiBwYWRkaW5nIGlzIGFkZGVkCiAvLyAgIGlmIHRoZSBub24tdmlydHVhbCBiYXNlIGJlZm9yZSB0aGUgZW1wdHkgbm9uLXZpcnR1YWwgYmFzZSBoYXMgYSB2YnB0ci4KLQorLy8gKiBUaGUgQUJJIGF0dGVtcHRzIHRvIGF2b2lkIGFsaWFzaW5nIG9mIHplcm8gc2l6ZWQgYmFzZXMgYnkgYWRkaW5nIHBhZGRpbmcKKy8vICAgYmV0d2VlbiBiYXNlcyBvciB2YmFzZXMgd2l0aCBzcGVjaWZpYyBwcm9wZXJ0aWVzLiAgVGhlIGNyaXRlcmlhIGZvcgorLy8gICBhZGRpdGlvbmFsIHBhZGRpbmcgYmV0d2VlbiB0d28gYmFzZXMgaXMgdGhhdCB0aGUgZmlyc3QgYmFzZSBpcyB6ZXJvIHNpemVkCisvLyAgIG9yIGhhcyBhIHplcm8gc2l6ZWQgc3Vib2JqZWN0IGFuZCB0aGUgc2Vjb25kIGJhc2UgaXMgemVybyBzaXplZCBvciBsZWFkcworLy8gICB3aXRoIGEgemVybyBzaXplZCBiYXNlIChzaGFyaW5nIG9mIHZmcHRycyBjYW4gcmVvcmRlciB0aGUgbGF5b3V0IG9mIHRoZQorLy8gICBzbyB0aGUgbGVhZGluZyBiYXNlIGlzIG5vdCBhbHdheXMgdGhlIGZpcnN0IG9uZSBkZWNsYXJlZCkuICBUaGUgcGFkZGluZworLy8gICBhZGRlZCBmb3IgYmFzZXMgaXMgMSBieXRlLiAgVGhlIHBhZGRpbmcgYWRkZWQgZm9yIHZiYXNlcyBkZXBlbmRzIG9uIHRoZQorLy8gICBhbGlnbm1lbnQgb2YgdGhlIG9iamVjdCBidXQgaXMgYXQgbGVhc3QgNCBieXRlcyAoaW4gYm90aCAzMiBhbmQgNjQgYml0CisvLyAgIG1vZGVzKS4KKy8vICogVGhlcmUgaXMgbm8gY29uY2VwdCBvZiBub24tdmlydHVhbCBhbGlnbm1lbnQgb3IgYW55IGRpc3RpbmN0aW9uIGJldHdlZW4KKy8vICAgZGF0YSBzaXplIGFuZCBub24tdmlydHVhbCBzaXplLgorLy8gKiBfX2RlY2xzcGVjKGFsaWduKSBvbiBiaXRmaWVsZHMgaGFzIHRoZSBlZmZlY3Qgb2YgY2hhbmdpbmcgdGhlIGJpdGZpZWxkJ3MKKy8vICAgYWxpZ25tZW50IGluc3RlYWQgb2YgaXRzIHJlcXVpcmVkIGFsaWdubWVudC4gIFRoaXMgaGFzIGltcGxpY2F0aW9ucyBvbiBob3cKKy8vICAgaXQgaW50ZXJhY3RzIHdpdGggcHJhZ2FtIHBhY2suCiAKIG5hbWVzcGFjZSB7CiBzdHJ1Y3QgTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlciB7CisgIHN0cnVjdCBFbGVtZW50SW5mbyB7CisgICAgQ2hhclVuaXRzIFNpemU7CisgICAgQ2hhclVuaXRzIEFsaWdubWVudDsKKyAgfTsKICAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxjb25zdCBDWFhSZWNvcmREZWNsICosIENoYXJVbml0cz4gQmFzZU9mZnNldHNNYXBUeTsKICAgTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcihjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KSA6IENvbnRleHQoQ29udGV4dCkge30KIHByaXZhdGU6CkBAIC0yMDMwLDE5ICsyMTI0LDIwIEBACiAgIExMVk1fREVMRVRFRF9GVU5DVElPTjsKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlciAmKSBMTFZNX0RFTEVURURfRlVOQ1RJT047CiBwdWJsaWM6Ci0KICAgdm9pZCBsYXlvdXQoY29uc3QgUmVjb3JkRGVjbCAqUkQpOwogICB2b2lkIGN4eExheW91dChjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7CiAgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZXMgc2l6ZSBhbmQgYWxpZ25tZW50IGFuZCBob25vcnMgc29tZSBmbGFncy4KICAgdm9pZCBpbml0aWFsaXplTGF5b3V0KGNvbnN0IFJlY29yZERlY2wgKlJEKTsKICAgLy8vIFxicmllZiBJbml0aWFsaXplZCBDKysgbGF5b3V0LCBjb21wdXRlIGFsaWdubWVudCBhbmQgdmlydHVhbCBhbGlnbm1lbnQgYW5kCi0gIC8vLyBleGlzdGFuY2Ugb2YgdmZwdHJzIGFuZCB2YnB0cnMuICBBbGlnbm1lbnQgaXMgbmVlZGVkIGJlZm9yZSB0aGUgdmZwdHIgaXMKKyAgLy8vIGV4aXN0ZW5jZSBvZiB2ZnB0cnMgYW5kIHZicHRycy4gIEFsaWdubWVudCBpcyBuZWVkZWQgYmVmb3JlIHRoZSB2ZnB0ciBpcwogICAvLy8gbGFpZCBvdXQuCiAgIHZvaWQgaW5pdGlhbGl6ZUNYWExheW91dChjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7Ci0gIHZvaWQgbGF5b3V0VkZQdHIoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOwogICB2b2lkIGxheW91dE5vblZpcnR1YWxCYXNlcyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7Ci0gIHZvaWQgbGF5b3V0Tm9uVmlydHVhbEJhc2UoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOwotICB2b2lkIGxheW91dFZCUHRyKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKTsKKyAgdm9pZCBsYXlvdXROb25WaXJ0dWFsQmFzZShjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkJhc2VMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0IComUHJldmlvdXNCYXNlTGF5b3V0KTsKKyAgdm9pZCBpbmplY3RWRlB0cihjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7CisgIHZvaWQgaW5qZWN0VkJQdHIoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOwogICAvLy8gXGJyaWVmIExheXMgb3V0IHRoZSBmaWVsZHMgb2YgdGhlIHJlY29yZC4gIEFsc28gcm91bmRzIHNpemUgdXAgdG8KICAgLy8vIGFsaWdubWVudC4KICAgdm9pZCBsYXlvdXRGaWVsZHMoY29uc3QgUmVjb3JkRGVjbCAqUkQpOwpAQCAtMjA1MiwyMiArMjE0NywxNSBAQAogICAvLy8gc3BlY2lhbCBjYXNlcyBhc3NvY2lhdGVkIHdpdGggemVyby13aWR0aCBiaXQtZmllbGRzLgogICB2b2lkIGxheW91dFplcm9XaWR0aEJpdEZpZWxkKGNvbnN0IEZpZWxkRGVjbCAqRkQpOwogICB2b2lkIGxheW91dFZpcnR1YWxCYXNlcyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7Ci0gIHZvaWQgbGF5b3V0VmlydHVhbEJhc2UoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsIGJvb2wgSGFzVnRvcmRpc3ApOwotICAvLy8gXGJyaWVmIEZsdXNoZXMgdGhlIGxhenkgdmlydHVhbCBiYXNlIGFuZCBjb25kaXRpb25hbGx5IHJvdW5kcyB1cCB0bwotICAvLy8gYWxpZ25tZW50LgotICB2b2lkIGZpbmFsaXplQ1hYTGF5b3V0KGNvbnN0IENYWFJlY29yZERlY2wgKlJEKTsKLSAgdm9pZCBob25vckRlY2xzcGVjQWxpZ24oY29uc3QgUmVjb3JkRGVjbCAqUkQpOwotCi0gIC8vLyBcYnJpZWYgVXBkYXRlcyB0aGUgYWxpZ25tZW50IG9mIHRoZSB0eXBlLiAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHRha2UgYW55Ci0gIC8vLyBwcm9wZXJ0aWVzIChzdWNoIGFzIHBhY2tlZG5lc3MpIGludG8gYWNjb3VudC4gIGdldEFkanVzdGVkRmllbGRJbmZvKCkKLSAgLy8vIGFkanVzdGVzIGZvciBwYWNrZWRuZXNzLgotICB2b2lkIHVwZGF0ZUFsaWdubWVudChDaGFyVW5pdHMgTmV3QWxpZ25tZW50KSB7Ci0gICAgQWxpZ25tZW50ID0gc3RkOjptYXgoQWxpZ25tZW50LCBOZXdBbGlnbm1lbnQpOwotICB9Ci0gIC8vLyBcYnJpZWYgR2V0cyB0aGUgc2l6ZSBhbmQgYWxpZ25tZW50IHRha2luZyBhdHRyaWJ1dGVzIGludG8gYWNjb3VudC4KLSAgc3RkOjpwYWlyPENoYXJVbml0cywgQ2hhclVuaXRzPiBnZXRBZGp1c3RlZEZpZWxkSW5mbyhjb25zdCBGaWVsZERlY2wgKkZEKTsKLSAgLy8vIFxicmllZiBQbGFjZXMgYSBmaWVsZCBhdCBvZmZzZXQgMC4KLSAgdm9pZCBwbGFjZUZpZWxkQXRaZXJvKCkgeyBGaWVsZE9mZnNldHMucHVzaF9iYWNrKDApOyB9CisgIHZvaWQgZmluYWxpemVMYXlvdXQoY29uc3QgUmVjb3JkRGVjbCAqUkQpOworICAvLy8gXGJyaWVmIEdldHMgdGhlIHNpemUgYW5kIGFsaWdubWVudCBvZiBhIGJhc2UgdGFraW5nIHByYWdtYSBwYWNrIGFuZAorICAvLy8gX19kZWNsc3BlYyhhbGlnbikgaW50byBhY2NvdW50LgorICBFbGVtZW50SW5mbyBnZXRBZGp1c3RlZEVsZW1lbnRJbmZvKGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXNCYXNlID0gdHJ1ZSk7CisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgc2l6ZSBhbmQgYWxpZ25tZW50IG9mIGEgZmllbGQgdGFraW5nIHByYWdtYSAgcGFjayBhbmQKKyAgLy8vIF9fZGVjbHNwZWMoYWxpZ24pIGludG8gYWNjb3VudC4gIEl0IGFsc28gdXBkYXRlcyBSZXF1aXJlZEFsaWdubWVudCBhcyBhCisgIC8vLyBzaWRlIGVmZmVjdCBiZWNhdXNlIGl0IGlzIG1vc3QgY29udmVuaWVudCB0byBkbyBzbyBoZXJlLgorICBFbGVtZW50SW5mbyBnZXRBZGp1c3RlZEVsZW1lbnRJbmZvKGNvbnN0IEZpZWxkRGVjbCAqRkQpOwogICAvLy8gXGJyaWVmIFBsYWNlcyBhIGZpZWxkIGF0IGFuIG9mZnNldCBpbiBDaGFyVW5pdHMuCiAgIHZvaWQgcGxhY2VGaWVsZEF0T2Zmc2V0KENoYXJVbml0cyBGaWVsZE9mZnNldCkgewogICAgIEZpZWxkT2Zmc2V0cy5wdXNoX2JhY2soQ29udGV4dC50b0JpdHMoRmllbGRPZmZzZXQpKTsKQEAgLTIwNzksMzM0ICsyMTY3LDI4OSBAQAogICAvLy8gXGJyaWVmIENvbXB1dGUgdGhlIHNldCBvZiB2aXJ0dWFsIGJhc2VzIGZvciB3aGljaCB2dG9yZGlzcHMgYXJlIHJlcXVpcmVkLgogICBsbHZtOjpTbWFsbFB0clNldDxjb25zdCBDWFhSZWNvcmREZWNsICosIDI+CiAgIGNvbXB1dGVWdG9yRGlzcFNldChjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7Ci0KICAgY29uc3QgQVNUQ29udGV4dCAmQ29udGV4dDsKICAgLy8vIFxicmllZiBUaGUgc2l6ZSBvZiB0aGUgcmVjb3JkIGJlaW5nIGxhaWQgb3V0LgogICBDaGFyVW5pdHMgU2l6ZTsKKyAgLy8vIFxicmllZiBUaGUgbm9uLXZpcnR1YWwgc2l6ZSBvZiB0aGUgcmVjb3JkIGxheW91dC4KKyAgQ2hhclVuaXRzIE5vblZpcnR1YWxTaXplOworICAvLy8gXGJyaWVmIFRoZSBkYXRhIHNpemUgb2YgdGhlIHJlY29yZCBsYXlvdXQuCisgIENoYXJVbml0cyBEYXRhU2l6ZTsKICAgLy8vIFxicmllZiBUaGUgY3VycmVudCBhbGlnbm1lbnQgb2YgdGhlIHJlY29yZCBsYXlvdXQuCiAgIENoYXJVbml0cyBBbGlnbm1lbnQ7Ci0gIC8vLyBcYnJpZWYgVGhlIGNvbGxlY3Rpb24gb2YgZmllbGQgb2Zmc2V0cy4KLSAgU21hbGxWZWN0b3I8dWludDY0X3QsIDE2PiBGaWVsZE9mZnNldHM7CiAgIC8vLyBcYnJpZWYgVGhlIG1heGltdW0gYWxsb3dlZCBmaWVsZCBhbGlnbm1lbnQuIFRoaXMgaXMgc2V0IGJ5ICNwcmFnbWEgcGFjay4KICAgQ2hhclVuaXRzIE1heEZpZWxkQWxpZ25tZW50OwotICAvLy8gXGJyaWVmIEFsaWdubWVudCBkb2VzIG5vdCBvY2N1ciBmb3IgdmlydHVhbCBiYXNlcyB1bmxlc3Mgc29tZXRoaW5nCi0gIC8vLyBmb3JjZXMgaXQgdG8gYnkgZXhwbGljaXRseSB1c2luZyBfX2RlY2xzcGVjKGFsaWduKCkpCi0gIGJvb2wgQWxpZ25BZnRlclZCYXNlcyA6IDE7Ci0gIGJvb2wgSXNVbmlvbiA6IDE7Ci0gIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgbGFzdCBmaWVsZCBsYWlkIG91dCB3YXMgYSBiaXRmaWVsZCBhbmQgd2FzIG5vdCAwCi0gIC8vLyB3aWR0aC4KLSAgYm9vbCBMYXN0RmllbGRJc05vblplcm9XaWR0aEJpdGZpZWxkIDogMTsKKyAgLy8vIFxicmllZiBUaGUgYWxpZ25tZW50IHRoYXQgdGhpcyByZWNvcmQgbXVzdCBvYmV5LiAgVGhpcyBpcyBpbXBvc2VkIGJ5CisgIC8vLyBfX2RlY2xzcGVjKGFsaWduKCkpIG9uIHRoZSByZWNvcmQgaXRzZWxmIG9yIG9uZSBvZiBpdHMgZmllbGRzIG9yIGJhc2VzLgorICBDaGFyVW5pdHMgUmVxdWlyZWRBbGlnbm1lbnQ7CiAgIC8vLyBcYnJpZWYgVGhlIHNpemUgb2YgdGhlIGFsbG9jYXRpb24gb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgYml0ZmllbGQuCiAgIC8vLyBUaGlzIHZhbHVlIGlzbid0IG1lYW5pbmdmdWwgdW5sZXNzIExhc3RGaWVsZElzTm9uWmVyb1dpZHRoQml0ZmllbGQKICAgLy8vIGlzIHRydWUuCiAgIENoYXJVbml0cyBDdXJyZW50Qml0ZmllbGRTaXplOwotICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGJpdHMgaW4gb3VyIGxhc3QgYml0ZmllbGQgYWxsb2NhdGlvbi4KLSAgLy8vIFRoaXMgdmFsdWUgaXNuJ3QgbWVhbmluZ2Z1bCB1bmxlc3MgTGFzdEZpZWxkSXNOb25aZXJvV2lkdGhCaXRmaWVsZCBpcwotICAvLy8gdHJ1ZS4KLSAgdW5zaWduZWQgUmVtYWluaW5nQml0c0luRmllbGQ7Ci0KLSAgLy8vIFxicmllZiBUaGUgZGF0YSBhbGlnbm1lbnQgb2YgdGhlIHJlY29yZCBsYXlvdXQuCi0gIENoYXJVbml0cyBEYXRhU2l6ZTsKLSAgLy8vIFxicmllZiBUaGUgYWxpZ25tZW50IG9mIHRoZSBub24tdmlydHVhbCBwb3J0aW9uIG9mIHRoZSByZWNvcmQgbGF5b3V0Ci0gIC8vLyB3aXRob3V0IHRoZSBpbXBhY3Qgb2YgdGhlIHZpcnR1YWwgcG9pbnRlcnMuCi0gIC8vLyBPbmx5IHVzZWQgZm9yIEMrKyBsYXlvdXRzLgotICBDaGFyVW5pdHMgQmFzZXNBbmRGaWVsZHNBbGlnbm1lbnQ7Ci0gIC8vLyBcYnJpZWYgVGhlIGFsaWdubWVudCBvZiB0aGUgbm9uLXZpcnR1YWwgcG9ydGlvbiBvZiB0aGUgcmVjb3JkIGxheW91dAotICAvLy8gT25seSB1c2VkIGZvciBDKysgbGF5b3V0cy4KLSAgQ2hhclVuaXRzIE5vblZpcnR1YWxBbGlnbm1lbnQ7Ci0gIC8vLyBcYnJpZWYgVGhlIGFkZGl0aW9uYWwgYWxpZ25tZW50IGltcG9zZWQgYnkgdGhlIHZpcnR1YWwgYmFzZXMuCi0gIENoYXJVbml0cyBWaXJ0dWFsQWxpZ25tZW50OworICAvLy8gXGJyaWVmIE9mZnNldCB0byB0aGUgdmlydHVhbCBiYXNlIHRhYmxlIHBvaW50ZXIgKGlmIG9uZSBleGlzdHMpLgorICBDaGFyVW5pdHMgVkJQdHJPZmZzZXQ7CisgIC8vLyBcYnJpZWYgVGhlIHNpemUgYW5kIGFsaWdubWVudCBpbmZvIG9mIGEgcG9pbnRlci4KKyAgRWxlbWVudEluZm8gUG9pbnRlckluZm87CiAgIC8vLyBcYnJpZWYgVGhlIHByaW1hcnkgYmFzZSBjbGFzcyAoaWYgb25lIGV4aXN0cykuCiAgIGNvbnN0IENYWFJlY29yZERlY2wgKlByaW1hcnlCYXNlOwogICAvLy8gXGJyaWVmIFRoZSBjbGFzcyB3ZSBzaGFyZSBvdXIgdmItcG9pbnRlciB3aXRoLgogICBjb25zdCBDWFhSZWNvcmREZWNsICpTaGFyZWRWQlB0ckJhc2U7Ci0gIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgY2xhc3MgaGFzIGEgdmZ0YWJsZSBwb2ludGVyIHRoYXQgY2FuIGJlIGV4dGVuZGVkCi0gIC8vLyBieSB0aGlzIGNsYXNzIG9yIGNsYXNzZXMgZGVyaXZlZCBmcm9tIGl0LiAgU3VjaCBhIHZmcHRyIHdpbGwgYWx3YXlzIG9jY3VyCi0gIC8vLyBhdCBvZmZzZXQgMC4KLSAgYm9vbCBIYXNFeHRlbmRhYmxlVkZQdHIgOiAxOwotICAvLy8gXGJyaWVmIFRydWUgaWYgdGhlIGNsYXNzIGhhcyBhIChub3QgbmVjZXNzYXJpbHkgaXRzIG93bikgdmJ0YWJsZSBwb2ludGVyLgotICBib29sIEhhc1ZCUHRyIDogMTsKLSAgLy8vIFxicmllZiBPZmZzZXQgdG8gdGhlIHZpcnR1YWwgYmFzZSB0YWJsZSBwb2ludGVyIChpZiBvbmUgZXhpc3RzKS4KLSAgQ2hhclVuaXRzIFZCUHRyT2Zmc2V0OworICAvLy8gXGJyaWVmIFRoZSBjb2xsZWN0aW9uIG9mIGZpZWxkIG9mZnNldHMuCisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCAxNj4gRmllbGRPZmZzZXRzOwogICAvLy8gXGJyaWVmIEJhc2UgY2xhc3NlcyBhbmQgdGhlaXIgb2Zmc2V0cyBpbiB0aGUgcmVjb3JkLgogICBCYXNlT2Zmc2V0c01hcFR5IEJhc2VzOwogICAvLy8gXGJyaWVmIHZpcnR1YWwgYmFzZSBjbGFzc2VzIGFuZCB0aGVpciBvZmZzZXRzIGluIHRoZSByZWNvcmQuCiAgIEFTVFJlY29yZExheW91dDo6VkJhc2VPZmZzZXRzTWFwVHkgVkJhc2VzOwotICAvLy8gXGJyaWVmIFRoZSBzaXplIG9mIGEgcG9pbnRlci4KLSAgQ2hhclVuaXRzIFBvaW50ZXJTaXplOwotICAvLy8gXGJyaWVmIFRoZSBhbGlnbm1lbnQgb2YgYSBwb2ludGVyLgotICBDaGFyVW5pdHMgUG9pbnRlckFsaWdubWVudDsKLSAgLy8vIFxicmllZiBIb2xkcyBhbiBlbXB0eSBiYXNlIHdlIGhhdmVuJ3QgeWV0IGxhaWQgb3V0LgotICBjb25zdCBDWFhSZWNvcmREZWNsICpMYXp5RW1wdHlCYXNlOwotICAvLy8gXGJyaWVmIExldHMgdXMga25vdyBpZiB0aGUgbGFzdCBiYXNlIHdlIGxhaWQgb3V0IHdhcyBlbXB0eS4gIE9ubHkgdXNlZAotICAvLy8gd2hlbiBhZGp1c3RpbmcgdGhlIHBsYWNlbWVudCBvZiBhIGxhc3QgemVyby1zaXplZCBiYXNlIGluIDY0IGJpdCBtb2RlLgotICBib29sIExhc3RCYXNlV2FzRW1wdHk7CisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiByZW1haW5pbmcgYml0cyBpbiBvdXIgbGFzdCBiaXRmaWVsZCBhbGxvY2F0aW9uLgorICAvLy8gVGhpcyB2YWx1ZSBpc24ndCBtZWFuaW5nZnVsIHVubGVzcyBMYXN0RmllbGRJc05vblplcm9XaWR0aEJpdGZpZWxkIGlzCisgIC8vLyB0cnVlLgorICB1bnNpZ25lZCBSZW1haW5pbmdCaXRzSW5GaWVsZDsKKyAgYm9vbCBJc1VuaW9uIDogMTsKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBsYXN0IGZpZWxkIGxhaWQgb3V0IHdhcyBhIGJpdGZpZWxkIGFuZCB3YXMgbm90IDAKKyAgLy8vIHdpZHRoLgorICBib29sIExhc3RGaWVsZElzTm9uWmVyb1dpZHRoQml0ZmllbGQgOiAxOworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhlIGNsYXNzIGhhcyBpdHMgb3duIHZmdGFibGUgcG9pbnRlci4KKyAgYm9vbCBIYXNPd25WRlB0ciA6IDE7CisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGUgY2xhc3MgaGFzIGEgdmJ0YWJsZSBwb2ludGVyLgorICBib29sIEhhc1ZCUHRyIDogMTsKICAgLy8vIFxicmllZiBMZXRzIHVzIGtub3cgaWYgd2UncmUgaW4gNjQtYml0IG1vZGUKLSAgYm9vbCBJczY0Qml0TW9kZTsKLSAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBsYXN0IG5vbi12aXJ0dWFsIGJhc2UgaGFzIGEgdmJwdHIuCi0gIGJvb2wgTGFzdE5vblZpcnR1YWxCYXNlSGFzVkJQdHI7CisgIGJvb2wgSXM2NEJpdE1vZGUgOiAxOworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBjbGFzcyBjb250YWlucyBhIHplcm8gc2l6ZWQgbWVtYmVyIG9yIGJhc2Ugb3IgYSBiYXNlCisgIC8vLyB3aXRoIGEgemVybyBzaXplZCBtZW1iZXIgb3IgYmFzZS4gIE9ubHkgdXNlZCBmb3IgTVMtQUJJLgorICBib29sIEhhc1plcm9TaXplZFN1Yk9iamVjdCA6IDE7CisgIC8vLyBcYnJpZWYgVHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIHplcm8gc2l6ZWQgb3IgZmlyc3QgYmFzZSBpcyB6ZXJvIHNpemVkIG9yCisgIC8vLyBoYXMgdGhpcyBwcm9wZXJ0eS4gIE9ubHkgdXNlZCBmb3IgTVMtQUJJLgorICBib29sIExlYWRzV2l0aFplcm9TaXplZEJhc2UgOiAxOwogfTsKIH0gLy8gbmFtZXNwYWNlCiAKLXN0ZDo6cGFpcjxDaGFyVW5pdHMsIENoYXJVbml0cz4KLU1pY3Jvc29mdFJlY29yZExheW91dEJ1aWxkZXI6OmdldEFkanVzdGVkRmllbGRJbmZvKGNvbnN0IEZpZWxkRGVjbCAqRkQpIHsKLSAgc3RkOjpwYWlyPENoYXJVbml0cywgQ2hhclVuaXRzPiBGaWVsZEluZm8gPQotICAgICAgQ29udGV4dC5nZXRUeXBlSW5mb0luQ2hhcnMoRkQtPmdldFR5cGUoKSk7Ci0KLSAgLy8gSWYgd2UncmUgbm90IG9uIHdpbjMyIGFuZCB1c2luZyBtc19zdHJ1Y3QgdGhlIGZpZWxkIGFsaWdubWVudCB3aWxsIGJlIHdyb25nCi0gIC8vIGZvciA2NCBiaXQgdHlwZXMsIHNvIHdlIGZpeCB0aGF0IGhlcmUuCi0gIGlmIChGRC0+Z2V0QVNUQ29udGV4dCgpLmdldFRhcmdldEluZm8oKS5nZXRUcmlwbGUoKS5nZXRPUygpICE9Ci0gICAgICBsbHZtOjpUcmlwbGU6OldpbjMyKSB7Ci0gICAgUXVhbFR5cGUgVCA9IENvbnRleHQuZ2V0QmFzZUVsZW1lbnRUeXBlKEZELT5nZXRUeXBlKCkpOwotICAgIGlmIChjb25zdCBCdWlsdGluVHlwZSAqQlR5ID0gVC0+Z2V0QXM8QnVpbHRpblR5cGU+KCkpIHsKLSAgICAgIENoYXJVbml0cyBUeXBlU2l6ZSA9IENvbnRleHQuZ2V0VHlwZVNpemVJbkNoYXJzKEJUeSk7Ci0gICAgICBpZiAoVHlwZVNpemUgPiBGaWVsZEluZm8uc2Vjb25kKQotICAgICAgICBGaWVsZEluZm8uc2Vjb25kID0gVHlwZVNpemU7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmVzcGVjdCBwYWNrZWQgYXR0cmlidXRlLgotICBpZiAoRkQtPmhhc0F0dHI8UGFja2VkQXR0cj4oKSkKLSAgICBGaWVsZEluZm8uc2Vjb25kID0gQ2hhclVuaXRzOjpPbmUoKTsKLSAgLy8gUmVzcGVjdCBwYWNrIHByYWdtYS4KLSAgZWxzZSBpZiAoIU1heEZpZWxkQWxpZ25tZW50LmlzWmVybygpKQotICAgIEZpZWxkSW5mby5zZWNvbmQgPSBzdGQ6Om1pbihGaWVsZEluZm8uc2Vjb25kLCBNYXhGaWVsZEFsaWdubWVudCk7Ci0gIC8vIFJlc3BlY3QgYWxpZ25tZW50IGF0dHJpYnV0ZXMuCi0gIGlmICh1bnNpZ25lZCBmaWVsZEFsaWduID0gRkQtPmdldE1heEFsaWdubWVudCgpKSB7Ci0gICAgQ2hhclVuaXRzIEZpZWxkQWxpZ24gPSBDb250ZXh0LnRvQ2hhclVuaXRzRnJvbUJpdHMoZmllbGRBbGlnbik7Ci0gICAgQWxpZ25BZnRlclZCYXNlcyA9IHRydWU7Ci0gICAgRmllbGRJbmZvLnNlY29uZCA9IHN0ZDo6bWF4KEZpZWxkSW5mby5zZWNvbmQsIEZpZWxkQWxpZ24pOwotICB9Ci0gIHJldHVybiBGaWVsZEluZm87CitNaWNyb3NvZnRSZWNvcmRMYXlvdXRCdWlsZGVyOjpFbGVtZW50SW5mbworTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6Z2V0QWRqdXN0ZWRFbGVtZW50SW5mbygKKyAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCwgYm9vbCBBc0Jhc2UpIHsKKyAgRWxlbWVudEluZm8gSW5mbzsKKyAgSW5mby5BbGlnbm1lbnQgPSBMYXlvdXQuZ2V0QWxpZ25tZW50KCk7CisgIC8vIFJlc3BlY3QgcHJhZ21hIHBhY2suCisgIGlmICghTWF4RmllbGRBbGlnbm1lbnQuaXNaZXJvKCkpCisgICAgSW5mby5BbGlnbm1lbnQgPSBzdGQ6Om1pbihJbmZvLkFsaWdubWVudCwgTWF4RmllbGRBbGlnbm1lbnQpOworICAvLyBUcmFjayB6ZXJvLXNpemVkIHN1Ym9iamVjdHMgaGVyZSB3aGVyZSBpdCdzIGFscmVhZHkgYXZhaWxhYmxlLgorICBpZiAoTGF5b3V0Lmhhc1plcm9TaXplZFN1Yk9iamVjdCgpKQorICAgIEhhc1plcm9TaXplZFN1Yk9iamVjdCA9IHRydWU7CisgIC8vIFJlc3BlY3QgcmVxdWlyZWQgYWxpZ25tZW50LCB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIG1heSBoYXZlIGFkanVzdGVkCisgIC8vIHRoZSBhbGlnbm1lbnQgaW4gdGhlIGNhc2Ugb2YgcHJhZ2FtIHBhY2suICBOb3RlIHRoYXQgdGhlIHJlcXVpcmVkIGFsaWdubWVudAorICAvLyBkb2Vzbid0IGFjdHVhbGx5IGFwcGx5IHRvIHRoZSBzdHJ1Y3QgYWxpZ25tZW50IGF0IHRoaXMgcG9pbnQuCisgIEFsaWdubWVudCA9IHN0ZDo6bWF4KEFsaWdubWVudCwgSW5mby5BbGlnbm1lbnQpOworICBJbmZvLkFsaWdubWVudCA9IHN0ZDo6bWF4KEluZm8uQWxpZ25tZW50LCBMYXlvdXQuZ2V0UmVxdWlyZWRBbGlnbm1lbnQoKSk7CisgIEluZm8uU2l6ZSA9IEFzQmFzZSA/IExheW91dC5nZXROb25WaXJ0dWFsU2l6ZSgpIDogTGF5b3V0LmdldFNpemUoKTsKKyAgcmV0dXJuIEluZm87CiB9CiAKLXZvaWQgTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6aW5pdGlhbGl6ZUxheW91dChjb25zdCBSZWNvcmREZWNsICpSRCkgewotICBJc1VuaW9uID0gUkQtPmlzVW5pb24oKTsKLSAgSXM2NEJpdE1vZGUgPSBDb250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRQb2ludGVyV2lkdGgoMCkgPT0gNjQ7Ci0KLSAgU2l6ZSA9IENoYXJVbml0czo6WmVybygpOwotICBBbGlnbm1lbnQgPSBDaGFyVW5pdHM6Ok9uZSgpOwotICBBbGlnbkFmdGVyVkJhc2VzID0gZmFsc2U7Ci0KLSAgLy8gQ29tcHV0ZSB0aGUgbWF4aW11bSBmaWVsZCBhbGlnbm1lbnQuCi0gIE1heEZpZWxkQWxpZ25tZW50ID0gQ2hhclVuaXRzOjpaZXJvKCk7Ci0gIC8vIEhvbm9yIHRoZSBkZWZhdWx0IHN0cnVjdCBwYWNraW5nIG1heGltdW0gYWxpZ25tZW50IGZsYWcuCi0gIGlmICh1bnNpZ25lZCBEZWZhdWx0TWF4RmllbGRBbGlnbm1lbnQgPSBDb250ZXh0LmdldExhbmdPcHRzKCkuUGFja1N0cnVjdCkKLSAgICBNYXhGaWVsZEFsaWdubWVudCA9IENoYXJVbml0czo6ZnJvbVF1YW50aXR5KERlZmF1bHRNYXhGaWVsZEFsaWdubWVudCk7Ci0gIC8vIEhvbm9yIHRoZSBwYWNraW5nIGF0dHJpYnV0ZS4KLSAgaWYgKGNvbnN0IE1heEZpZWxkQWxpZ25tZW50QXR0ciAqTUZBQSA9IFJELT5nZXRBdHRyPE1heEZpZWxkQWxpZ25tZW50QXR0cj4oKSkKLSAgICBNYXhGaWVsZEFsaWdubWVudCA9IENvbnRleHQudG9DaGFyVW5pdHNGcm9tQml0cyhNRkFBLT5nZXRBbGlnbm1lbnQoKSk7Ci0gIC8vIFBhY2tlZCBhdHRyaWJ1dGUgZm9yY2VzIG1heCBmaWVsZCBhbGlnbm1lbnQgdG8gYmUgMS4KLSAgaWYgKFJELT5oYXNBdHRyPFBhY2tlZEF0dHI+KCkpCi0gICAgTWF4RmllbGRBbGlnbm1lbnQgPSBDaGFyVW5pdHM6Ok9uZSgpOworTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6RWxlbWVudEluZm8KK01pY3Jvc29mdFJlY29yZExheW91dEJ1aWxkZXI6OmdldEFkanVzdGVkRWxlbWVudEluZm8oCisgICAgY29uc3QgRmllbGREZWNsICpGRCkgeworICBFbGVtZW50SW5mbyBJbmZvOworICBzdGQ6OnRpZShJbmZvLlNpemUsIEluZm8uQWxpZ25tZW50KSA9CisgICAgICBDb250ZXh0LmdldFR5cGVJbmZvSW5DaGFycyhGRC0+Z2V0VHlwZSgpKTsKKyAgLy8gUmVzcGVjdCBhbGlnbiBhdHRyaWJ1dGVzLgorICBDaGFyVW5pdHMgRmllbGRSZXF1aXJlZEFsaWdubWVudCA9IAorICAgICAgQ29udGV4dC50b0NoYXJVbml0c0Zyb21CaXRzKEZELT5nZXRNYXhBbGlnbm1lbnQoKSk7CisgIC8vIFJlc3BlY3QgYXR0cmlidXRlcyBhcHBsaWVkIHRvIHN1Ym9iamVjdHMgb2YgdGhlIGZpZWxkLgorICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPQorICAgICAgRkQtPmdldFR5cGUoKS0+Z2V0QmFzZUVsZW1lbnRUeXBlVW5zYWZlKCktPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKKyAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCA9IENvbnRleHQuZ2V0QVNUUmVjb3JkTGF5b3V0KFJULT5nZXREZWNsKCkpOworICAgIC8vIEdldCB0aGUgZWxlbWVudCBpbmZvIGZvciBhIGxheW91dCwgcmVzcGVjdGluZyBwYWNrLgorICAgIEluZm8uQWxpZ25tZW50ID0gZ2V0QWRqdXN0ZWRFbGVtZW50SW5mbyhMYXlvdXQsIGZhbHNlKS5BbGlnbm1lbnQ7CisgICAgLy8gQ2FwdHVyZSByZXF1aXJlZCBhbGlnbm1lbnQgYXMgYSBzaWRlLWVmZmVjdC4KKyAgICBSZXF1aXJlZEFsaWdubWVudCA9IHN0ZDo6bWF4KFJlcXVpcmVkQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0LmdldFJlcXVpcmVkQWxpZ25tZW50KCkpOworICB9IGVsc2UgeworICAgIGlmIChGRC0+aXNCaXRGaWVsZCgpICYmIEZELT5nZXRNYXhBbGlnbm1lbnQoKSAhPSAwKQorICAgICAgSW5mby5BbGlnbm1lbnQgPSBzdGQ6Om1heChJbmZvLkFsaWdubWVudCwgRmllbGRSZXF1aXJlZEFsaWdubWVudCk7CisgICAgLy8gUmVzcGVjdCBwcmFnbWEgcGFjay4KKyAgICBpZiAoIU1heEZpZWxkQWxpZ25tZW50LmlzWmVybygpKQorICAgICAgSW5mby5BbGlnbm1lbnQgPSBzdGQ6Om1pbihJbmZvLkFsaWdubWVudCwgTWF4RmllbGRBbGlnbm1lbnQpOworICB9CisgIC8vIFJlc3BlY3QgcGFja2VkIGZpZWxkIGF0dHJpYnV0ZS4KKyAgaWYgKEZELT5oYXNBdHRyPFBhY2tlZEF0dHI+KCkpCisgICAgSW5mby5BbGlnbm1lbnQgPSBDaGFyVW5pdHM6Ok9uZSgpOworICAvLyBUYWtlIHJlcXVpcmVkIGFsaWdubWVudCBpbnRvIGFjY291bnQuICBfX2RlY2xzcGVjKGFsaWduKSBvbiBiaXRmaWVsZHMKKyAgLy8gaW1wYWN0cyB0aGUgYWxpZ25tZW50IHJhdGhlciB0aGFuIHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuCisgIGlmICghRkQtPmlzQml0RmllbGQoKSkgeworICAgIEluZm8uQWxpZ25tZW50ID0gc3RkOjptYXgoSW5mby5BbGlnbm1lbnQsIEZpZWxkUmVxdWlyZWRBbGlnbm1lbnQpOworICAgIC8vIENhcHR1cmUgcmVxdWlyZWQgYWxpZ25tZW50IGFzIGEgc2lkZS1lZmZlY3QuCisgICAgUmVxdWlyZWRBbGlnbm1lbnQgPSBzdGQ6Om1heChSZXF1aXJlZEFsaWdubWVudCwgRmllbGRSZXF1aXJlZEFsaWdubWVudCk7CisgIH0KKyAgLy8gVE9ETzogQWRkIGEgU2VtYSB3YXJuaW5nIHRoYXQgTVMgaWdub3JlcyBiaXRmaWVsZCBhbGlnbm1lbnQgaW4gdW5pb25zLgorICBpZiAoIShGRC0+aXNCaXRGaWVsZCgpICYmIElzVW5pb24pKSB7CisgICAgQWxpZ25tZW50ID0gc3RkOjptYXgoQWxpZ25tZW50LCBJbmZvLkFsaWdubWVudCk7CisgICAgaWYgKCFNYXhGaWVsZEFsaWdubWVudC5pc1plcm8oKSkKKyAgICAgIEFsaWdubWVudCA9IHN0ZDo6bWluKEFsaWdubWVudCwgTWF4RmllbGRBbGlnbm1lbnQpOworICB9CisgIHJldHVybiBJbmZvOwogfQogCiB2b2lkIE1pY3Jvc29mdFJlY29yZExheW91dEJ1aWxkZXI6OmxheW91dChjb25zdCBSZWNvcmREZWNsICpSRCkgewogICBpbml0aWFsaXplTGF5b3V0KFJEKTsKICAgbGF5b3V0RmllbGRzKFJEKTsKLSAgaG9ub3JEZWNsc3BlY0FsaWduKFJEKTsKKyAgRGF0YVNpemUgPSBTaXplID0gU2l6ZS5Sb3VuZFVwVG9BbGlnbm1lbnQoQWxpZ25tZW50KTsKKyAgUmVxdWlyZWRBbGlnbm1lbnQgPSBzdGQ6Om1heCgKKyAgICAgIFJlcXVpcmVkQWxpZ25tZW50LCBDb250ZXh0LnRvQ2hhclVuaXRzRnJvbUJpdHMoUkQtPmdldE1heEFsaWdubWVudCgpKSk7CisgIGZpbmFsaXplTGF5b3V0KFJEKTsKIH0KIAogdm9pZCBNaWNyb3NvZnRSZWNvcmRMYXlvdXRCdWlsZGVyOjpjeHhMYXlvdXQoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKICAgaW5pdGlhbGl6ZUxheW91dChSRCk7CiAgIGluaXRpYWxpemVDWFhMYXlvdXQoUkQpOwotICBsYXlvdXRWRlB0cihSRCk7CiAgIGxheW91dE5vblZpcnR1YWxCYXNlcyhSRCk7Ci0gIGxheW91dFZCUHRyKFJEKTsKICAgbGF5b3V0RmllbGRzKFJEKTsKLSAgRGF0YVNpemUgPSBTaXplOwotICBOb25WaXJ0dWFsQWxpZ25tZW50ID0gQWxpZ25tZW50OworICBpbmplY3RWQlB0cihSRCk7CisgIGluamVjdFZGUHRyKFJEKTsKKyAgaWYgKEhhc093blZGUHRyIHx8IChIYXNWQlB0ciAmJiAhU2hhcmVkVkJQdHJCYXNlKSkKKyAgICBBbGlnbm1lbnQgPSBzdGQ6Om1heChBbGlnbm1lbnQsIFBvaW50ZXJJbmZvLkFsaWdubWVudCk7CisgIE5vblZpcnR1YWxTaXplID0gU2l6ZSA9IFNpemUuUm91bmRVcFRvQWxpZ25tZW50KEFsaWdubWVudCk7CisgIFJlcXVpcmVkQWxpZ25tZW50ID0gc3RkOjptYXgoCisgICAgICBSZXF1aXJlZEFsaWdubWVudCwgQ29udGV4dC50b0NoYXJVbml0c0Zyb21CaXRzKFJELT5nZXRNYXhBbGlnbm1lbnQoKSkpOwogICBsYXlvdXRWaXJ0dWFsQmFzZXMoUkQpOwotICBmaW5hbGl6ZUNYWExheW91dChSRCk7Ci0gIGhvbm9yRGVjbHNwZWNBbGlnbihSRCk7CisgIGZpbmFsaXplTGF5b3V0KFJEKTsKK30KKwordm9pZCBNaWNyb3NvZnRSZWNvcmRMYXlvdXRCdWlsZGVyOjppbml0aWFsaXplTGF5b3V0KGNvbnN0IFJlY29yZERlY2wgKlJEKSB7CisgIElzVW5pb24gPSBSRC0+aXNVbmlvbigpOworICBJczY0Qml0TW9kZSA9IENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldFBvaW50ZXJXaWR0aCgwKSA9PSA2NDsKKyAgU2l6ZSA9IENoYXJVbml0czo6WmVybygpOworICBBbGlnbm1lbnQgPSBDaGFyVW5pdHM6Ok9uZSgpOworICAvLyBJbiA2NC1iaXQgbW9kZSB3ZSBhbHdheXMgcGVyZm9ybSBhbiBhbGlnbm1lbnQgc3RlcCBhZnRlciBsYXlpbmcgb3V0IHZiYXNlcy4KKyAgLy8gSW4gMzItYml0IG1vZGUgd2UgZG8gbm90LiAgVGhlIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHBlcmZvcm0gYWxpZ25tZW50CisgIC8vIGNoZWNrcyB0aGUgUmVxdWlyZWRBbGlnbm1lbnQgZmllbGQgYW5kIHBlcmZvcm1zIGFsaWdubWVudCBpZiBpdCBpc24ndCAwLgorICBSZXF1aXJlZEFsaWdubWVudCA9IElzNjRCaXRNb2RlID8gQ2hhclVuaXRzOjpPbmUoKSA6IENoYXJVbml0czo6WmVybygpOworICAvLyBDb21wdXRlIHRoZSBtYXhpbXVtIGZpZWxkIGFsaWdubWVudC4KKyAgTWF4RmllbGRBbGlnbm1lbnQgPSBDaGFyVW5pdHM6Olplcm8oKTsKKyAgLy8gSG9ub3IgdGhlIGRlZmF1bHQgc3RydWN0IHBhY2tpbmcgbWF4aW11bSBhbGlnbm1lbnQgZmxhZy4KKyAgaWYgKHVuc2lnbmVkIERlZmF1bHRNYXhGaWVsZEFsaWdubWVudCA9IENvbnRleHQuZ2V0TGFuZ09wdHMoKS5QYWNrU3RydWN0KQorICAgICAgTWF4RmllbGRBbGlnbm1lbnQgPSBDaGFyVW5pdHM6OmZyb21RdWFudGl0eShEZWZhdWx0TWF4RmllbGRBbGlnbm1lbnQpOworICAvLyBIb25vciB0aGUgcGFja2luZyBhdHRyaWJ1dGUuICBUaGUgTVMtQUJJIGlnbm9yZXMgcHJhZ21hIHBhY2sgaWYgaXRzIGxhcmdlcgorICAvLyB0aGFuIHRoZSBwb2ludGVyIHNpemUuCisgIGlmIChjb25zdCBNYXhGaWVsZEFsaWdubWVudEF0dHIgKk1GQUEgPSBSRC0+Z2V0QXR0cjxNYXhGaWVsZEFsaWdubWVudEF0dHI+KCkpeworICAgIHVuc2lnbmVkIFBhY2tlZEFsaWdubWVudCA9IE1GQUEtPmdldEFsaWdubWVudCgpOworICAgIGlmIChQYWNrZWRBbGlnbm1lbnQgPD0gQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkuZ2V0UG9pbnRlcldpZHRoKDApKQorICAgICAgTWF4RmllbGRBbGlnbm1lbnQgPSBDb250ZXh0LnRvQ2hhclVuaXRzRnJvbUJpdHMoUGFja2VkQWxpZ25tZW50KTsKKyAgfQorICAvLyBQYWNrZWQgYXR0cmlidXRlIGZvcmNlcyBtYXggZmllbGQgYWxpZ25tZW50IHRvIGJlIDEuCisgIGlmIChSRC0+aGFzQXR0cjxQYWNrZWRBdHRyPigpKQorICAgIE1heEZpZWxkQWxpZ25tZW50ID0gQ2hhclVuaXRzOjpPbmUoKTsKIH0KIAogdm9pZAogTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6aW5pdGlhbGl6ZUNYWExheW91dChjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgewotICAvLyBDYWxjdWxhdGUgcG9pbnRlciBzaXplIGFuZCBhbGlnbm1lbnQuCi0gIFBvaW50ZXJTaXplID0KLSAgICAgIENvbnRleHQudG9DaGFyVW5pdHNGcm9tQml0cyhDb250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRQb2ludGVyV2lkdGgoMCkpOwotICBQb2ludGVyQWxpZ25tZW50ID0gUG9pbnRlclNpemU7Ci0gIGlmICghTWF4RmllbGRBbGlnbm1lbnQuaXNaZXJvKCkpCi0gICAgUG9pbnRlckFsaWdubWVudCA9IHN0ZDo6bWluKFBvaW50ZXJBbGlnbm1lbnQsIE1heEZpZWxkQWxpZ25tZW50KTsKLQotICAvLyBJbml0aWFsaXplIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYXNlcy4KKyAgSGFzWmVyb1NpemVkU3ViT2JqZWN0ID0gZmFsc2U7CisgIExlYWRzV2l0aFplcm9TaXplZEJhc2UgPSBmYWxzZTsKKyAgSGFzT3duVkZQdHIgPSBmYWxzZTsKICAgSGFzVkJQdHIgPSBmYWxzZTsKLSAgSGFzRXh0ZW5kYWJsZVZGUHRyID0gZmFsc2U7Ci0gIFNoYXJlZFZCUHRyQmFzZSA9IDA7CiAgIFByaW1hcnlCYXNlID0gMDsKLSAgVmlydHVhbEFsaWdubWVudCA9IENoYXJVbml0czo6T25lKCk7Ci0gIEFsaWduQWZ0ZXJWQmFzZXMgPSBJczY0Qml0TW9kZTsKLQotICAvLyBJZiB0aGUgcmVjb3JkIGhhcyBhIGR5bmFtaWMgYmFzZSBjbGFzcywgYXR0ZW1wdCB0byBjaG9vc2UgYSBwcmltYXJ5IGJhc2UKLSAgLy8gY2xhc3MuIEl0IGlzIHRoZSBmaXJzdCAoaW4gZGlyZWN0IGJhc2UgY2xhc3Mgb3JkZXIpIG5vbi12aXJ0dWFsIGR5bmFtaWMKLSAgLy8gYmFzZSBjbGFzcywgaWYgb25lIGV4aXN0cy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIGkgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBSRC0+YmFzZXNfZW5kKCk7Ci0gICAgICAgaSAhPSBlOyArK2kpIHsKLSAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9Ci0gICAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oaS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwotICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0ID0gQ29udGV4dC5nZXRBU1RSZWNvcmRMYXlvdXQoQmFzZURlY2wpOwotICAgIC8vIEhhbmRsZSBmb3JjZWQgYWxpZ25tZW50LgotICAgIGlmIChMYXlvdXQuZ2V0QWxpZ25BZnRlclZCYXNlcygpKQotICAgICAgQWxpZ25BZnRlclZCYXNlcyA9IHRydWU7Ci0gICAgLy8gSGFuZGxlIHZpcnR1YWwgYmFzZXMuCi0gICAgaWYgKGktPmlzVmlydHVhbCgpKSB7Ci0gICAgICBWaXJ0dWFsQWxpZ25tZW50ID0gc3RkOjptYXgoVmlydHVhbEFsaWdubWVudCwgTGF5b3V0LmdldEFsaWdubWVudCgpKTsKLSAgICAgIEhhc1ZCUHRyID0gdHJ1ZTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAvLyBXZSBsb2NhdGVkIGEgcHJpbWFyeSBiYXNlIGNsYXNzIQotICAgIGlmICghUHJpbWFyeUJhc2UgJiYgTGF5b3V0Lmhhc0V4dGVuZGFibGVWRlB0cigpKSB7Ci0gICAgICBQcmltYXJ5QmFzZSA9IEJhc2VEZWNsOwotICAgICAgSGFzRXh0ZW5kYWJsZVZGUHRyID0gdHJ1ZTsKLSAgICB9Ci0gICAgLy8gV2UgbG9jYXRlZCBhIGJhc2UgdG8gc2hhcmUgYSBWQlB0ciB3aXRoIQotICAgIGlmICghU2hhcmVkVkJQdHJCYXNlICYmIExheW91dC5oYXNWQlB0cigpKSB7Ci0gICAgICBTaGFyZWRWQlB0ckJhc2UgPSBCYXNlRGVjbDsKLSAgICAgIEhhc1ZCUHRyID0gdHJ1ZTsKLSAgICB9Ci0gICAgdXBkYXRlQWxpZ25tZW50KExheW91dC5nZXRBbGlnbm1lbnQoKSk7Ci0gIH0KLQotICAvLyBVc2UgTGF5b3V0RmllbGRzIHRvIGNvbXB1dGUgdGhlIGFsaWdubWVudCBvZiB0aGUgZmllbGRzLiAgVGhlIGxheW91dAotICAvLyBpcyBkaXNjYXJkZWQuICBUaGlzIGlzIHRoZSBzaW1wbGVzdCB3YXkgdG8gZ2V0IGFsbCBvZiB0aGUgYml0LWZpZWxkCi0gIC8vIGJlaGF2aW9yIGNvcnJlY3QgYW5kIGlzIG5vdCBhY3R1YWxseSB2ZXJ5IGV4cGVuc2l2ZS4KLSAgbGF5b3V0RmllbGRzKFJEKTsKLSAgU2l6ZSA9IENoYXJVbml0czo6WmVybygpOwotICBCYXNlc0FuZEZpZWxkc0FsaWdubWVudCA9IEFsaWdubWVudDsKLSAgRmllbGRPZmZzZXRzLmNsZWFyKCk7Ci19Ci0KLXZvaWQgTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6bGF5b3V0VkZQdHIoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKLSAgLy8gSWYgd2UgaGF2ZSBhIHByaW1hcnkgYmFzZSB0aGVuIG91ciBWRlB0ciB3YXMgYWxyZWFkeSBsYWlkIG91dAotICBpZiAoUHJpbWFyeUJhc2UpCi0gICAgcmV0dXJuOwotCi0gIC8vIExvb2sgYXQgYWxsIG9mIG91ciBtZXRob2RzIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIGEgVkZQdHIuICBXZSBuZWVkIGEKLSAgLy8gdmZwdHIgaWYgd2UgZGVmaW5lIGEgbmV3IHZpcnR1YWwgZnVuY3Rpb24uCi0gIGlmICghSGFzRXh0ZW5kYWJsZVZGUHRyICYmIFJELT5pc0R5bmFtaWNDbGFzcygpKQotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6bWV0aG9kX2l0ZXJhdG9yIGkgPSBSRC0+bWV0aG9kX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFJELT5tZXRob2RfZW5kKCk7Ci0gICAgICAgICAhSGFzRXh0ZW5kYWJsZVZGUHRyICYmIGkgIT0gZTsgKytpKQotICAgICAgSGFzRXh0ZW5kYWJsZVZGUHRyID0gaS0+aXNWaXJ0dWFsKCkgJiYgaS0+c2l6ZV9vdmVycmlkZGVuX21ldGhvZHMoKSA9PSAwOwotICBpZiAoIUhhc0V4dGVuZGFibGVWRlB0cikKLSAgICByZXR1cm47Ci0KLSAgLy8gTVNWQyAzMiAoYnV0IG5vdCA2NCkgcG90ZW50aWFsbHkgb3Zlci1hbGlnbnMgdGhlIHZmLXRhYmxlIHBvaW50ZXIgYnkgZ2l2aW5nCi0gIC8vIGl0IHRoZSBtYXggYWxpZ25tZW50IG9mIGFsbCB0aGUgbm9uLXZpcnR1YWwgZGF0YSBpbiB0aGUgY2xhc3MuICBUaGUKLSAgLy8gcmVzdWx0aW5nIGxheW91dCBpcyBlc3NlbnRpYWxseSB7IHZmdGJsLCB7IG52ZGF0YSB9IH0uICBUaGlzIGlzIGNvbXBsZXRlbHkKLSAgLy8gdW5uZWNlc3NhcnksIGJ1dCB3ZSdyZSBub3QgaGVyZSB0byBwYXNzIGp1ZGdtZW50LgotICB1cGRhdGVBbGlnbm1lbnQoUG9pbnRlckFsaWdubWVudCk7Ci0gIGlmIChJczY0Qml0TW9kZSkKLSAgICBTaXplID0gU2l6ZS5Sb3VuZFVwVG9BbGlnbm1lbnQoUG9pbnRlckFsaWdubWVudCkgKyBQb2ludGVyU2l6ZTsKLSAgZWxzZQotICAgIFNpemUgPSBTaXplLlJvdW5kVXBUb0FsaWdubWVudChQb2ludGVyQWxpZ25tZW50KSArIEFsaWdubWVudDsKKyAgU2hhcmVkVkJQdHJCYXNlID0gMDsKKyAgLy8gQ2FsY3VsYXRlIHBvaW50ZXIgc2l6ZSBhbmQgYWxpZ25tZW50LiAgVGhlc2UgYXJlIHVzZWQgZm9yIHZmcHRyIGFuZCB2YnBydAorICAvLyBpbmplY3Rpb24uCisgIFBvaW50ZXJJbmZvLlNpemUgPQorICAgICAgQ29udGV4dC50b0NoYXJVbml0c0Zyb21CaXRzKENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldFBvaW50ZXJXaWR0aCgwKSk7CisgIFBvaW50ZXJJbmZvLkFsaWdubWVudCA9IFBvaW50ZXJJbmZvLlNpemU7CisgIC8vIFJlc3BlY3QgcHJhZ21hIHBhY2suCisgIGlmICghTWF4RmllbGRBbGlnbm1lbnQuaXNaZXJvKCkpCisgICAgUG9pbnRlckluZm8uQWxpZ25tZW50ID0gc3RkOjptaW4oUG9pbnRlckluZm8uQWxpZ25tZW50LCBNYXhGaWVsZEFsaWdubWVudCk7CiB9CiAKIHZvaWQKIE1pY3Jvc29mdFJlY29yZExheW91dEJ1aWxkZXI6OmxheW91dE5vblZpcnR1YWxCYXNlcyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgewotICBMYXp5RW1wdHlCYXNlID0gMDsKLSAgTGFzdEJhc2VXYXNFbXB0eSA9IGZhbHNlOwotICBMYXN0Tm9uVmlydHVhbEJhc2VIYXNWQlB0ciA9IGZhbHNlOwotCi0gIC8vIExheSBvdXQgdGhlIHByaW1hcnkgYmFzZSBmaXJzdC4KLSAgaWYgKFByaW1hcnlCYXNlKQotICAgIGxheW91dE5vblZpcnR1YWxCYXNlKFByaW1hcnlCYXNlKTsKLQorICAvLyBUaGUgTVMtQUJJIGxheXMgb3V0IGFsbCBiYXNlcyB0aGF0IGNvbnRhaW4gbGVhZGluZyB2ZnB0cnMgYmVmb3JlIGl0IGxheXMKKyAgLy8gb3V0IGFueSBiYXNlcyB0aGF0IGRvIG5vdCBjb250YWluIHZmcHRycy4gIFdlIGltcGxlbWVudCB0aGlzIGFzIHR3byBwYXNzZXMKKyAgLy8gb3ZlciB0aGUgYmFzZXMuICBUaGlzIGFwcHJvYWNoIGd1YXJhbnRlZXMgdGhhdCB0aGUgcHJpbWFyeSBiYXNlIGlzIGxhaWQgb3V0CisgIC8vIGZpcnN0LiAgV2UgdXNlIHRoZXNlIHBhc3NlcyB0byBjYWxjdWxhdGUgc29tZSBhZGRpdGlvbmFsIGFnZ3JlZ2F0ZWQKKyAgLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhc2VzLCBzdWNoIGFzIHJlcXJ1aWVkIGFsaWdubWVudCBhbmQgdGhlIHByZXNlbmNlIG9mCisgIC8vIHplcm8gc2l6ZWQgbWVtYmVycy4KKyAgY29uc3QgQVNUUmVjb3JkTGF5b3V0KiBQcmV2aW91c0Jhc2VMYXlvdXQgPSAwOwogICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGJhc2VzIGFuZCBsYXkgb3V0IHRoZSBub24tdmlydHVhbCBvbmVzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgaSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFJELT5iYXNlc19lbmQoKTsKLSAgICAgICBpICE9IGU7ICsraSkgewotICAgIGlmIChpLT5pc1ZpcnR1YWwoKSkKKyAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPmJhc2VzKCkpIHsKKyAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9IEkuZ2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKKyAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkJhc2VMYXlvdXQgPSBDb250ZXh0LmdldEFTVFJlY29yZExheW91dChCYXNlRGVjbCk7CisgICAgLy8gTWFyayBhbmQgc2tpcCB2aXJ0dWFsIGJhc2VzLgorICAgIGlmIChJLmlzVmlydHVhbCgpKSB7CisgICAgICBIYXNWQlB0ciA9IHRydWU7CiAgICAgICBjb250aW51ZTsKLSAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9Ci0gICAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oaS0+Z2V0VHlwZSgpLT5jYXN0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKLSAgICBpZiAoQmFzZURlY2wgIT0gUHJpbWFyeUJhc2UpCi0gICAgICBsYXlvdXROb25WaXJ0dWFsQmFzZShCYXNlRGVjbCk7Ci0gIH0KLX0KLQotdm9pZAotTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6bGF5b3V0Tm9uVmlydHVhbEJhc2UoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKLSAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICpMYXlvdXQgPSBSRCA/ICZDb250ZXh0LmdldEFTVFJlY29yZExheW91dChSRCkgOiAwOwotCi0gIC8vIElmIHdlIGhhdmUgYSBsYXp5IGVtcHR5IGJhc2Ugd2UgaGF2ZW4ndCBsYWlkIG91dCB5ZXQsIGRvIHRoYXQgbm93LgotICBpZiAoTGF6eUVtcHR5QmFzZSkgewotICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF6eUxheW91dCA9Ci0gICAgICAgIENvbnRleHQuZ2V0QVNUUmVjb3JkTGF5b3V0KExhenlFbXB0eUJhc2UpOwotICAgIFNpemUgPSBTaXplLlJvdW5kVXBUb0FsaWdubWVudChMYXp5TGF5b3V0LmdldEFsaWdubWVudCgpKTsKLSAgICAvLyBJZiB0aGUgbGFzdCBub24tdmlydHVhbCBiYXNlIGhhcyBhIHZicHRyIHdlIGFkZCBhIGJ5dGUgb2YgcGFkZGluZyBmb3Igbm8KLSAgICAvLyBvYnZpb3VzIHJlYXNvbi4KLSAgICBpZiAoTGFzdE5vblZpcnR1YWxCYXNlSGFzVkJQdHIpCi0gICAgICBTaXplKys7Ci0gICAgQmFzZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKExhenlFbXB0eUJhc2UsIFNpemUpKTsKLSAgICAvLyBFbXB0eSBiYXNlcyBvbmx5IGNvbnN1bWUgc3BhY2Ugd2hlbiBmb2xsb3dlZCBieSBhbm90aGVyIGVtcHR5IGJhc2UuCi0gICAgaWYgKFJEICYmIExheW91dC0+Z2V0Tm9uVmlydHVhbFNpemUoKS5pc1plcm8oKSkgewotICAgICAgTGFzdEJhc2VXYXNFbXB0eSA9IHRydWU7Ci0gICAgICBTaXplKys7CiAgICAgfQotICAgIExhenlFbXB0eUJhc2UgPSAwOwotICAgIExhc3ROb25WaXJ0dWFsQmFzZUhhc1ZCUHRyID0gZmFsc2U7CisgICAgLy8gVHJhY2sgUmVxdWlyZWRBbGlnbm1lbnQgZm9yIGFsbCBiYXNlcyBpbiB0aGlzIHBhc3MuCisgICAgUmVxdWlyZWRBbGlnbm1lbnQgPSBzdGQ6Om1heChSZXF1aXJlZEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VMYXlvdXQuZ2V0UmVxdWlyZWRBbGlnbm1lbnQoKSk7CisgICAgLy8gQ2hlY2sgZm8gYSBiYXNlIHRvIHNoYXJlIGEgVkJQdHIgd2l0aC4KKyAgICBpZiAoIVNoYXJlZFZCUHRyQmFzZSAmJiBCYXNlTGF5b3V0Lmhhc1ZCUHRyKCkpIHsKKyAgICAgIFNoYXJlZFZCUHRyQmFzZSA9IEJhc2VEZWNsOworICAgICAgSGFzVkJQdHIgPSB0cnVlOworICAgIH0KKyAgICAvLyBPbmx5IGxheSBvdXQgYmFzZXMgd2l0aCBleHRlbmRhYmxlIFZGUHRycyBvbiB0aGUgZmlyc3QgcGFzcy4KKyAgICBpZiAoIUJhc2VMYXlvdXQuaGFzRXh0ZW5kYWJsZVZGUHRyKCkpCisgICAgICBjb250aW51ZTsKKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgcHJpbWFyeSBiYXNlLCB0aGlzIG9uZSBxdWFsaWZpZXMuCisgICAgaWYgKCFQcmltYXJ5QmFzZSkgeworICAgICAgUHJpbWFyeUJhc2UgPSBCYXNlRGVjbDsKKyAgICAgIExlYWRzV2l0aFplcm9TaXplZEJhc2UgPSBCYXNlTGF5b3V0LmxlYWRzV2l0aFplcm9TaXplZEJhc2UoKTsKKyAgICB9CisgICAgLy8gTGF5IG91dCB0aGUgYmFzZS4KKyAgICBsYXlvdXROb25WaXJ0dWFsQmFzZShCYXNlRGVjbCwgQmFzZUxheW91dCwgUHJldmlvdXNCYXNlTGF5b3V0KTsKICAgfQotCi0gIC8vIFJEIGlzIG51bGwgd2hlbiBmbHVzaGluZyB0aGUgZmluYWwgbGF6eSBiYXNlLgotICBpZiAoIVJEKQotICAgIHJldHVybjsKLQotICBpZiAoTGF5b3V0LT5nZXROb25WaXJ0dWFsU2l6ZSgpLmlzWmVybygpKSB7Ci0gICAgTGF6eUVtcHR5QmFzZSA9IFJEOwotICAgIHJldHVybjsKKyAgLy8gRmlndXJlIG91dCBpZiB3ZSBuZWVkIGEgZnJlc2ggVkZQdHIgZm9yIHRoaXMgY2xhc3MuCisgIGlmICghUHJpbWFyeUJhc2UgJiYgUkQtPmlzRHluYW1pY0NsYXNzKCkpCisgICAgZm9yIChDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IgaSA9IFJELT5tZXRob2RfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gUkQtPm1ldGhvZF9lbmQoKTsKKyAgICAgICAgICFIYXNPd25WRlB0ciAmJiBpICE9IGU7ICsraSkKKyAgICAgIEhhc093blZGUHRyID0gaS0+aXNWaXJ0dWFsKCkgJiYgaS0+c2l6ZV9vdmVycmlkZGVuX21ldGhvZHMoKSA9PSAwOworICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgcHJpbWFyeSBiYXNlIHRoZW4gd2UgaGF2ZSBhIGxlYWRpbmcgb2JqZWN0IHRoYXQgY291bGQKKyAgLy8gaXRzZWxmIGxlYWQgd2l0aCBhIHplcm8tc2l6ZWQgb2JqZWN0LCBzb21ldGhpbmcgd2UgdHJhY2suCisgIGJvb2wgQ2hlY2tMZWFkaW5nTGF5b3V0ID0gIVByaW1hcnlCYXNlOworICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGJhc2VzIGFuZCBsYXkgb3V0IHRoZSBub24tdmlydHVhbCBvbmVzLgorICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSRC0+YmFzZXMoKSkgeworICAgIGlmIChJLmlzVmlydHVhbCgpKQorICAgICAgY29udGludWU7CisgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSBJLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZCYXNlTGF5b3V0ID0gQ29udGV4dC5nZXRBU1RSZWNvcmRMYXlvdXQoQmFzZURlY2wpOworICAgIC8vIE9ubHkgbGF5IG91dCBiYXNlcyB3aXRob3V0IGV4dGVuZGFibGUgVkZQdHJzIG9uIHRoZSBzZWNvbmQgcGFzcy4KKyAgICBpZiAoQmFzZUxheW91dC5oYXNFeHRlbmRhYmxlVkZQdHIoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGxheW91dCwgY2hlY2sgdG8gc2VlIGlmIGl0IGxlYWRzIHdpdGggYSB6ZXJvIHNpemVkCisgICAgLy8gb2JqZWN0LiAgSWYgaXQgZG9lcywgc28gZG8gd2UuCisgICAgaWYgKENoZWNrTGVhZGluZ0xheW91dCkgeworICAgICAgQ2hlY2tMZWFkaW5nTGF5b3V0ID0gZmFsc2U7CisgICAgICBMZWFkc1dpdGhaZXJvU2l6ZWRCYXNlID0gQmFzZUxheW91dC5sZWFkc1dpdGhaZXJvU2l6ZWRCYXNlKCk7CisgICAgfQorICAgIC8vIExheSBvdXQgdGhlIGJhc2UuCisgICAgbGF5b3V0Tm9uVmlydHVhbEJhc2UoQmFzZURlY2wsIEJhc2VMYXlvdXQsIFByZXZpb3VzQmFzZUxheW91dCk7CiAgIH0KLQotICAvLyBJbnNlcnQgdGhlIGJhc2UgaGVyZS4KLSAgQ2hhclVuaXRzIEJhc2VPZmZzZXQgPSBTaXplLlJvdW5kVXBUb0FsaWdubWVudChMYXlvdXQtPmdldEFsaWdubWVudCgpKTsKLSAgQmFzZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFJELCBCYXNlT2Zmc2V0KSk7Ci0gIFNpemUgPSBCYXNlT2Zmc2V0ICsgTGF5b3V0LT5nZXREYXRhU2l6ZSgpOwotICAvLyBOb3RlOiB3ZSBkb24ndCB1cGRhdGUgYWxpZ25tZW50IGhlcmUgYmVjYXVzZSBpdCB3YXMgYWNjb3VudGVkCi0gIC8vIGZvciBkdXJpbmcgaW5pdGFsaXphdGlvbi4KLSAgTGFzdEJhc2VXYXNFbXB0eSA9IGZhbHNlOwotICBMYXN0Tm9uVmlydHVhbEJhc2VIYXNWQlB0ciA9IExheW91dC0+aGFzVkJQdHIoKTsKLX0KLQotdm9pZCBNaWNyb3NvZnRSZWNvcmRMYXlvdXRCdWlsZGVyOjpsYXlvdXRWQlB0cihjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgeworICAvLyBTZXQgb3VyIFZCUHRyb2Zmc2V0IGlmIHdlIGtub3cgaXQgYXQgdGhpcyBwb2ludC4KICAgaWYgKCFIYXNWQlB0cikKICAgICBWQlB0ck9mZnNldCA9IENoYXJVbml0czo6ZnJvbVF1YW50aXR5KC0xKTsKICAgZWxzZSBpZiAoU2hhcmVkVkJQdHJCYXNlKSB7CiAgICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZMYXlvdXQgPSBDb250ZXh0LmdldEFTVFJlY29yZExheW91dChTaGFyZWRWQlB0ckJhc2UpOwogICAgIFZCUHRyT2Zmc2V0ID0gQmFzZXNbU2hhcmVkVkJQdHJCYXNlXSArIExheW91dC5nZXRWQlB0ck9mZnNldCgpOwotICB9IGVsc2UgewotICAgIFZCUHRyT2Zmc2V0ID0gU2l6ZS5Sb3VuZFVwVG9BbGlnbm1lbnQoUG9pbnRlckFsaWdubWVudCk7Ci0gICAgQ2hhclVuaXRzIE9sZFNpemUgPSBTaXplOwotICAgIFNpemUgPSBWQlB0ck9mZnNldCArIFBvaW50ZXJTaXplOwotICAgIGlmIChCYXNlc0FuZEZpZWxkc0FsaWdubWVudCA8PSBQb2ludGVyQWxpZ25tZW50KSB7Ci0gICAgICAvLyBIYW5kbGUgc3RyYW5nZSBwYWRkaW5nIHJ1bGVzIGZvciB0aGUgbGF6aWx5IHBsYWNlZCBiYXNlLiAgSSBoYXZlIG5vCi0gICAgICAvLyBleHBsYW5hdGlvbiBmb3Igd2h5IHRoZSBsYXN0IHZpcnR1YWwgYmFzZSBpcyBwYWRkZWQgaW4gc3VjaCBhbiBvZGQgd2F5LgotICAgICAgLy8gVHdvIHRoaW5ncyB0byBub3RlIGFib3V0IHRoaXMgcGFkZGluZyBhcmUgdGhhdCB0aGUgcnVsZXMgYXJlIGRpZmZlcmVudAotICAgICAgLy8gaWYgdGhlIGFsaWdubWVudCBvZiB0aGUgYmFzZXMrZmllbGRzIGlzIDw9IHRvIHRoZSBhbGlnbmVtbnQgb2YgYQotICAgICAgLy8gcG9pbnRlciBhbmQgdGhhdCB0aGUgcnVsZSBpbiA2NC1iaXQgbW9kZSBiZWhhdmVzIGRpZmZlcmVudGx5IGRlcGVuZGluZwotICAgICAgLy8gb24gaWYgdGhlIHNlY29uZCB0byBsYXN0IGJhc2Ugd2FzIGFsc28gemVybyBzaXplZC4KLSAgICAgIFNpemUgKz0gT2xkU2l6ZSAlIEJhc2VzQW5kRmllbGRzQWxpZ25tZW50LmdldFF1YW50aXR5KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChJczY0Qml0TW9kZSkKLSAgICAgICAgU2l6ZSArPSBMYXN0QmFzZVdhc0VtcHR5ID8gQ2hhclVuaXRzOjpPbmUoKSA6IENoYXJVbml0czo6WmVybygpOwotICAgICAgZWxzZQotICAgICAgICBTaXplID0gT2xkU2l6ZSArIEJhc2VzQW5kRmllbGRzQWxpZ25tZW50OwotICAgIH0KLSAgICB1cGRhdGVBbGlnbm1lbnQoUG9pbnRlckFsaWdubWVudCk7CiAgIH0KK30KIAotICAvLyBGbHVzaCB0aGUgbGF6eSBlbXB0eSBiYXNlLgotICBsYXlvdXROb25WaXJ0dWFsQmFzZSgwKTsKK3ZvaWQgTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6bGF5b3V0Tm9uVmlydHVhbEJhc2UoCisgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wsCisgICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZCYXNlTGF5b3V0LAorICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAqJlByZXZpb3VzQmFzZUxheW91dCkgeworICAvLyBJbnNlcnQgcGFkZGluZyBiZXR3ZWVuIHR3byBiYXNlcyBpZiB0aGUgbGVmdCBmaXJzdCBvbmUgaXMgemVybyBzaXplZCBvcgorICAvLyBjb250YWlucyBhIHplcm8gc2l6ZWQgc3Vib2JqZWN0IGFuZCB0aGUgcmlnaHQgaXMgemVybyBzaXplZCBvciBvbmUgbGVhZHMKKyAgLy8gd2l0aCBhIHplcm8gc2l6ZWQgYmFzZS4KKyAgaWYgKFByZXZpb3VzQmFzZUxheW91dCAmJiBQcmV2aW91c0Jhc2VMYXlvdXQtPmhhc1plcm9TaXplZFN1Yk9iamVjdCgpICYmCisgICAgICBCYXNlTGF5b3V0LmxlYWRzV2l0aFplcm9TaXplZEJhc2UoKSkKKyAgICBTaXplKys7CisgIEVsZW1lbnRJbmZvIEluZm8gPSBnZXRBZGp1c3RlZEVsZW1lbnRJbmZvKEJhc2VMYXlvdXQpOworICBDaGFyVW5pdHMgQmFzZU9mZnNldCA9IFNpemUuUm91bmRVcFRvQWxpZ25tZW50KEluZm8uQWxpZ25tZW50KTsKKyAgQmFzZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEJhc2VEZWNsLCBCYXNlT2Zmc2V0KSk7CisgIFNpemUgPSBCYXNlT2Zmc2V0ICsgQmFzZUxheW91dC5nZXROb25WaXJ0dWFsU2l6ZSgpOworICBQcmV2aW91c0Jhc2VMYXlvdXQgPSAmQmFzZUxheW91dDsKKyAgVkJQdHJPZmZzZXQgPSBTaXplOwogfQogCiB2b2lkIE1pY3Jvc29mdFJlY29yZExheW91dEJ1aWxkZXI6OmxheW91dEZpZWxkcyhjb25zdCBSZWNvcmREZWNsICpSRCkgewogICBMYXN0RmllbGRJc05vblplcm9XaWR0aEJpdGZpZWxkID0gZmFsc2U7Ci0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRmllbGQgPSBSRC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEVuZCA9IFJELT5maWVsZF9lbmQoKTsKLSAgICAgICBGaWVsZCAhPSBGaWVsZEVuZDsgKytGaWVsZCkKLSAgICBsYXlvdXRGaWVsZCgqRmllbGQpOwotICBTaXplID0gU2l6ZS5Sb3VuZFVwVG9BbGlnbm1lbnQoQWxpZ25tZW50KTsKKyAgZm9yIChjb25zdCBhdXRvICpGaWVsZCA6IFJELT5maWVsZHMoKSkKKyAgICBsYXlvdXRGaWVsZChGaWVsZCk7CiB9CiAKIHZvaWQgTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6bGF5b3V0RmllbGQoY29uc3QgRmllbGREZWNsICpGRCkgewpAQCAtMjQxNSwyMCArMjQ1OCwxNCBAQAogICAgIHJldHVybjsKICAgfQogICBMYXN0RmllbGRJc05vblplcm9XaWR0aEJpdGZpZWxkID0gZmFsc2U7Ci0KLSAgc3RkOjpwYWlyPENoYXJVbml0cywgQ2hhclVuaXRzPiBGaWVsZEluZm8gPSBnZXRBZGp1c3RlZEZpZWxkSW5mbyhGRCk7Ci0gIENoYXJVbml0cyBGaWVsZFNpemUgPSBGaWVsZEluZm8uZmlyc3Q7Ci0gIENoYXJVbml0cyBGaWVsZEFsaWduID0gRmllbGRJbmZvLnNlY29uZDsKLQotICB1cGRhdGVBbGlnbm1lbnQoRmllbGRBbGlnbik7CisgIEVsZW1lbnRJbmZvIEluZm8gPSBnZXRBZGp1c3RlZEVsZW1lbnRJbmZvKEZEKTsKICAgaWYgKElzVW5pb24pIHsKLSAgICBwbGFjZUZpZWxkQXRaZXJvKCk7Ci0gICAgU2l6ZSA9IHN0ZDo6bWF4KFNpemUsIEZpZWxkU2l6ZSk7CisgICAgcGxhY2VGaWVsZEF0T2Zmc2V0KENoYXJVbml0czo6WmVybygpKTsKKyAgICBTaXplID0gc3RkOjptYXgoU2l6ZSwgSW5mby5TaXplKTsKICAgfSBlbHNlIHsKLSAgICAvLyBSb3VuZCB1cCB0aGUgY3VycmVudCByZWNvcmQgc2l6ZSB0byB0aGUgZmllbGQncyBhbGlnbm1lbnQgYm91bmRhcnkuCi0gICAgQ2hhclVuaXRzIEZpZWxkT2Zmc2V0ID0gU2l6ZS5Sb3VuZFVwVG9BbGlnbm1lbnQoRmllbGRBbGlnbik7CisgICAgQ2hhclVuaXRzIEZpZWxkT2Zmc2V0ID0gU2l6ZS5Sb3VuZFVwVG9BbGlnbm1lbnQoSW5mby5BbGlnbm1lbnQpOwogICAgIHBsYWNlRmllbGRBdE9mZnNldChGaWVsZE9mZnNldCk7Ci0gICAgU2l6ZSA9IEZpZWxkT2Zmc2V0ICsgRmllbGRTaXplOworICAgIFNpemUgPSBGaWVsZE9mZnNldCArIEluZm8uU2l6ZTsKICAgfQogfQogCkBAIC0yNDM4LDM5ICsyNDc1LDMxIEBACiAgICAgbGF5b3V0WmVyb1dpZHRoQml0RmllbGQoRkQpOwogICAgIHJldHVybjsKICAgfQotCi0gIHN0ZDo6cGFpcjxDaGFyVW5pdHMsIENoYXJVbml0cz4gRmllbGRJbmZvID0gZ2V0QWRqdXN0ZWRGaWVsZEluZm8oRkQpOwotICBDaGFyVW5pdHMgRmllbGRTaXplID0gRmllbGRJbmZvLmZpcnN0OwotICBDaGFyVW5pdHMgRmllbGRBbGlnbiA9IEZpZWxkSW5mby5zZWNvbmQ7Ci0KKyAgRWxlbWVudEluZm8gSW5mbyA9IGdldEFkanVzdGVkRWxlbWVudEluZm8oRkQpOwogICAvLyBDbGFtcCB0aGUgYml0ZmllbGQgdG8gYSBjb250YWluYWJsZSBzaXplIGZvciB0aGUgc2FrZSBvZiBiZWluZyBhYmxlCiAgIC8vIHRvIGxheSB0aGVtIG91dC4gIFNlbWEgd2lsbCB0aHJvdyBhbiBlcnJvci4KLSAgaWYgKFdpZHRoID4gQ29udGV4dC50b0JpdHMoRmllbGRTaXplKSkKLSAgICBXaWR0aCA9IENvbnRleHQudG9CaXRzKEZpZWxkU2l6ZSk7Ci0KKyAgaWYgKFdpZHRoID4gQ29udGV4dC50b0JpdHMoSW5mby5TaXplKSkKKyAgICBXaWR0aCA9IENvbnRleHQudG9CaXRzKEluZm8uU2l6ZSk7CiAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGJpdGZpZWxkIGZpdHMgaW50byBhbiBleGlzdGluZyBhbGxvY2F0aW9uLiAgTm90ZToKICAgLy8gTVNWQyByZWZ1c2VzIHRvIHBhY2sgYml0ZmllbGRzIG9mIGZvcm1hbCB0eXBlcyB3aXRoIGRpZmZlcmVudCBzaXplcwogICAvLyBpbnRvIHRoZSBzYW1lIGFsbG9jYXRpb24uCiAgIGlmICghSXNVbmlvbiAmJiBMYXN0RmllbGRJc05vblplcm9XaWR0aEJpdGZpZWxkICYmCi0gICAgICBDdXJyZW50Qml0ZmllbGRTaXplID09IEZpZWxkU2l6ZSAmJiBXaWR0aCA8PSBSZW1haW5pbmdCaXRzSW5GaWVsZCkgeworICAgICAgQ3VycmVudEJpdGZpZWxkU2l6ZSA9PSBJbmZvLlNpemUgJiYgV2lkdGggPD0gUmVtYWluaW5nQml0c0luRmllbGQpIHsKICAgICBwbGFjZUZpZWxkQXRCaXRPZmZzZXQoQ29udGV4dC50b0JpdHMoU2l6ZSkgLSBSZW1haW5pbmdCaXRzSW5GaWVsZCk7CiAgICAgUmVtYWluaW5nQml0c0luRmllbGQgLT0gV2lkdGg7CiAgICAgcmV0dXJuOwogICB9Ci0KICAgTGFzdEZpZWxkSXNOb25aZXJvV2lkdGhCaXRmaWVsZCA9IHRydWU7Ci0gIEN1cnJlbnRCaXRmaWVsZFNpemUgPSBGaWVsZFNpemU7CisgIEN1cnJlbnRCaXRmaWVsZFNpemUgPSBJbmZvLlNpemU7CiAgIGlmIChJc1VuaW9uKSB7Ci0gICAgcGxhY2VGaWVsZEF0WmVybygpOwotICAgIFNpemUgPSBzdGQ6Om1heChTaXplLCBGaWVsZFNpemUpOwotICAgIC8vIFRPRE86IEFkZCBhIFNlbWEgd2FybmluZyB0aGF0IE1TIGlnbm9yZXMgYml0ZmllbGQgYWxpZ25tZW50IGluIHVuaW9ucy4KKyAgICBwbGFjZUZpZWxkQXRPZmZzZXQoQ2hhclVuaXRzOjpaZXJvKCkpOworICAgIFNpemUgPSBzdGQ6Om1heChTaXplLCBJbmZvLlNpemUpOwogICB9IGVsc2UgewogICAgIC8vIEFsbG9jYXRlIGEgbmV3IGJsb2NrIG9mIG1lbW9yeSBhbmQgcGxhY2UgdGhlIGJpdGZpZWxkIGluIGl0LgotICAgIENoYXJVbml0cyBGaWVsZE9mZnNldCA9IFNpemUuUm91bmRVcFRvQWxpZ25tZW50KEZpZWxkQWxpZ24pOworICAgIENoYXJVbml0cyBGaWVsZE9mZnNldCA9IFNpemUuUm91bmRVcFRvQWxpZ25tZW50KEluZm8uQWxpZ25tZW50KTsKICAgICBwbGFjZUZpZWxkQXRPZmZzZXQoRmllbGRPZmZzZXQpOwotICAgIFNpemUgPSBGaWVsZE9mZnNldCArIEZpZWxkU2l6ZTsKLSAgICB1cGRhdGVBbGlnbm1lbnQoRmllbGRBbGlnbik7Ci0gICAgUmVtYWluaW5nQml0c0luRmllbGQgPSBDb250ZXh0LnRvQml0cyhGaWVsZFNpemUpIC0gV2lkdGg7CisgICAgU2l6ZSA9IEZpZWxkT2Zmc2V0ICsgSW5mby5TaXplOworICAgIFJlbWFpbmluZ0JpdHNJbkZpZWxkID0gQ29udGV4dC50b0JpdHMoSW5mby5TaXplKSAtIFdpZHRoOwogICB9CiB9CiAKQEAgLTI0NzgsMTIwICsyNTA3LDEzOSBAQAogTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6bGF5b3V0WmVyb1dpZHRoQml0RmllbGQoY29uc3QgRmllbGREZWNsICpGRCkgewogICAvLyBaZXJvLXdpZHRoIGJpdGZpZWxkcyBhcmUgaWdub3JlZCB1bmxlc3MgdGhleSBmb2xsb3cgYSBub24temVyby13aWR0aAogICAvLyBiaXRmaWVsZC4KLSAgc3RkOjpwYWlyPENoYXJVbml0cywgQ2hhclVuaXRzPiBGaWVsZEluZm8gPSBnZXRBZGp1c3RlZEZpZWxkSW5mbyhGRCk7Ci0gIENoYXJVbml0cyBGaWVsZFNpemUgPSBGaWVsZEluZm8uZmlyc3Q7Ci0gIENoYXJVbml0cyBGaWVsZEFsaWduID0gRmllbGRJbmZvLnNlY29uZDsKLQogICBpZiAoIUxhc3RGaWVsZElzTm9uWmVyb1dpZHRoQml0ZmllbGQpIHsKICAgICBwbGFjZUZpZWxkQXRPZmZzZXQoSXNVbmlvbiA/IENoYXJVbml0czo6WmVybygpIDogU2l6ZSk7CiAgICAgLy8gVE9ETzogQWRkIGEgU2VtYSB3YXJuaW5nIHRoYXQgTVMgaWdub3JlcyBhbGlnbm1lbnQgZm9yIHplcm8KLSAgICAvLyBzaXplZCBiaXRmaWVsZHMgdGhhdCBvY2N1ciBhZnRlciB6ZXJvLXNpemUgYml0ZmllbGRzIG9yIG5vbiBiaXRmaWVsZHMuCisgICAgLy8gc2l6ZWQgYml0ZmllbGRzIHRoYXQgb2NjdXIgYWZ0ZXIgemVyby1zaXplIGJpdGZpZWxkcyBvciBub24tYml0ZmllbGRzLgogICAgIHJldHVybjsKICAgfQotCiAgIExhc3RGaWVsZElzTm9uWmVyb1dpZHRoQml0ZmllbGQgPSBmYWxzZTsKKyAgRWxlbWVudEluZm8gSW5mbyA9IGdldEFkanVzdGVkRWxlbWVudEluZm8oRkQpOwogICBpZiAoSXNVbmlvbikgewotICAgIHBsYWNlRmllbGRBdFplcm8oKTsKLSAgICBTaXplID0gc3RkOjptYXgoU2l6ZSwgRmllbGRTaXplKTsKKyAgICBwbGFjZUZpZWxkQXRPZmZzZXQoQ2hhclVuaXRzOjpaZXJvKCkpOworICAgIFNpemUgPSBzdGQ6Om1heChTaXplLCBJbmZvLlNpemUpOwogICB9IGVsc2UgewogICAgIC8vIFJvdW5kIHVwIHRoZSBjdXJyZW50IHJlY29yZCBzaXplIHRvIHRoZSBmaWVsZCdzIGFsaWdubWVudCBib3VuZGFyeS4KLSAgICBDaGFyVW5pdHMgRmllbGRPZmZzZXQgPSBTaXplLlJvdW5kVXBUb0FsaWdubWVudChGaWVsZEFsaWduKTsKKyAgICBDaGFyVW5pdHMgRmllbGRPZmZzZXQgPSBTaXplLlJvdW5kVXBUb0FsaWdubWVudChJbmZvLkFsaWdubWVudCk7CiAgICAgcGxhY2VGaWVsZEF0T2Zmc2V0KEZpZWxkT2Zmc2V0KTsKICAgICBTaXplID0gRmllbGRPZmZzZXQ7Ci0gICAgdXBkYXRlQWxpZ25tZW50KEZpZWxkQWxpZ24pOwogICB9CiB9CiAKK3ZvaWQgTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6aW5qZWN0VkJQdHIoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKKyAgaWYgKCFIYXNWQlB0ciB8fCBTaGFyZWRWQlB0ckJhc2UpCisgICAgcmV0dXJuOworICAvLyBJbmplY3QgdGhlIFZCUG9pbnRlciBhdCB0aGUgaW5qZWN0aW9uIHNpdGUuCisgIENoYXJVbml0cyBJbmplY3Rpb25TaXRlID0gVkJQdHJPZmZzZXQ7CisgIC8vIEJ1dCBiZWZvcmUgd2UgZG8sIG1ha2Ugc3VyZSBpdCdzIHByb3Blcmx5IGFsaWduZWQuCisgIFZCUHRyT2Zmc2V0ID0gVkJQdHJPZmZzZXQuUm91bmRVcFRvQWxpZ25tZW50KFBvaW50ZXJJbmZvLkFsaWdubWVudCk7CisgIC8vIERldGVybWluZSB3aGVyZSB0aGUgZmlyc3QgZmllbGQgc2hvdWxkIGJlIGxhaWQgb3V0IGFmdGVyIHRoZSB2YnB0ci4KKyAgQ2hhclVuaXRzIEZpZWxkU3RhcnQgPSBWQlB0ck9mZnNldCArIFBvaW50ZXJJbmZvLlNpemU7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBhbW91bnQgd2UgcHVzaCB0aGUgZmllbGRzIGJhY2sgYnkgaXMgYSBtdWx0aXBsZSBvZiB0aGUKKyAgLy8gYWxpZ25tZW50LgorICBDaGFyVW5pdHMgT2Zmc2V0ID0gKEZpZWxkU3RhcnQgLSBJbmplY3Rpb25TaXRlKS5Sb3VuZFVwVG9BbGlnbm1lbnQoCisgICAgICBzdGQ6Om1heChSZXF1aXJlZEFsaWdubWVudCwgQWxpZ25tZW50KSk7CisgIC8vIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBvYmplY3QgYW5kIHB1c2ggYmFjayBhbGwgZmllbGRzIGJ5IHRoZSBvZmZzZXQKKyAgLy8gYW1vdW50LgorICBTaXplICs9IE9mZnNldDsKKyAgZm9yIChTbWFsbFZlY3Rvcjx1aW50NjRfdCwgMTY+OjppdGVyYXRvciBpID0gRmllbGRPZmZzZXRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZpZWxkT2Zmc2V0cy5lbmQoKTsKKyAgICAgICBpICE9IGU7ICsraSkKKyAgICAqaSArPSBDb250ZXh0LnRvQml0cyhPZmZzZXQpOworICBmb3IgKEJhc2VPZmZzZXRzTWFwVHk6Oml0ZXJhdG9yIGkgPSBCYXNlcy5iZWdpbigpLCBlID0gQmFzZXMuZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpCisgICAgICAgaWYgKGktPnNlY29uZCA+PSBJbmplY3Rpb25TaXRlKQorICAgICAgICAgaS0+c2Vjb25kICs9IE9mZnNldDsKK30KKwordm9pZCBNaWNyb3NvZnRSZWNvcmRMYXlvdXRCdWlsZGVyOjppbmplY3RWRlB0cihjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgeworICBpZiAoIUhhc093blZGUHRyKQorICAgIHJldHVybjsKKyAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGFtb3VudCB3ZSBwdXNoIHRoZSBzdHJ1Y3QgYmFjayBieSBpcyBhIG11bHRpcGxlIG9mIHRoZQorICAvLyBhbGlnbm1lbnQuCisgIENoYXJVbml0cyBPZmZzZXQgPSBQb2ludGVySW5mby5TaXplLlJvdW5kVXBUb0FsaWdubWVudCgKKyAgICAgIHN0ZDo6bWF4KFJlcXVpcmVkQWxpZ25tZW50LCBBbGlnbm1lbnQpKTsKKyAgLy8gSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIG9iamVjdCBhbmQgcHVzaCBiYWNrIGFsbCBmaWVsZHMsIHRoZSB2YnB0ciBhbmQgYWxsCisgIC8vIGJhc2VzIGJ5IHRoZSBvZmZzZXQgYW1vdW50LgorICBTaXplICs9IE9mZnNldDsKKyAgZm9yIChTbWFsbFZlY3RvckltcGw8dWludDY0X3Q+OjppdGVyYXRvciBpID0gRmllbGRPZmZzZXRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEZpZWxkT2Zmc2V0cy5lbmQoKTsKKyAgICAgICBpICE9IGU7ICsraSkKKyAgICAqaSArPSBDb250ZXh0LnRvQml0cyhPZmZzZXQpOworICBpZiAoSGFzVkJQdHIpCisgICAgVkJQdHJPZmZzZXQgKz0gT2Zmc2V0OworICBmb3IgKEJhc2VPZmZzZXRzTWFwVHk6Oml0ZXJhdG9yIGkgPSBCYXNlcy5iZWdpbigpLCBlID0gQmFzZXMuZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpCisgICAgaS0+c2Vjb25kICs9IE9mZnNldDsKK30KKwogdm9pZCBNaWNyb3NvZnRSZWNvcmRMYXlvdXRCdWlsZGVyOjpsYXlvdXRWaXJ0dWFsQmFzZXMoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKICAgaWYgKCFIYXNWQlB0cikKICAgICByZXR1cm47Ci0KLSAgdXBkYXRlQWxpZ25tZW50KFZpcnR1YWxBbGlnbm1lbnQpOwotCi0gIC8vIFplcm8tc2l6ZWQgdi1iYXNlcyBvYmV5IHRoZSBhbGlnbm1lbnQgYXR0cmlidXRlIHNvIGFwcGx5IGl0IGhlcmUuICBUaGUKLSAgLy8gYWxpZ25tZW50IGF0dHJpYnV0ZSBpcyBub3JtYWxseSBhY2NvdW50ZWQgZm9yIGluIEZpbmFsaXplTGF5b3V0LgotICBpZiAodW5zaWduZWQgTWF4QWxpZ24gPSBSRC0+Z2V0TWF4QWxpZ25tZW50KCkpCi0gICAgdXBkYXRlQWxpZ25tZW50KENvbnRleHQudG9DaGFyVW5pdHNGcm9tQml0cyhNYXhBbGlnbikpOwotCi0gIGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IENYWFJlY29yZERlY2wgKiwgMj4gSGFzVnRvcmRpc3AgPQorICAvLyBWdG9yZGlzcHMgYXJlIGFsd2F5cyA0IGJ5dGVzIChldmVuIGluIDY0LWJpdCBtb2RlKQorICBDaGFyVW5pdHMgVnRvckRpc3BTaXplID0gQ2hhclVuaXRzOjpmcm9tUXVhbnRpdHkoNCk7CisgIENoYXJVbml0cyBWdG9yRGlzcEFsaWdubWVudCA9IFZ0b3JEaXNwU2l6ZTsKKyAgLy8gdnRvcmRpc3BzIHJlc3BlY3QgcHJhZ21hIHBhY2suCisgIGlmICghTWF4RmllbGRBbGlnbm1lbnQuaXNaZXJvKCkpCisgICAgVnRvckRpc3BBbGlnbm1lbnQgPSBzdGQ6Om1pbihWdG9yRGlzcEFsaWdubWVudCwgTWF4RmllbGRBbGlnbm1lbnQpOworICAvLyBUaGUgYWxpZ25tZW50IG9mIHRoZSB2dG9yZGlzcCBpcyBhdCBsZWFzdCB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IG9mIHRoZQorICAvLyBlbnRpcmUgcmVjb3JkLiAgVGhpcyByZXF1aXJlbWVudCBtYXkgYmUgcHJlc2VudCB0byBzdXBwb3J0IHZ0b3JkaXNwCisgIC8vIGluamVjdGlvbi4KKyAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPnZiYXNlcygpKSB7CisgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSBJLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZCYXNlTGF5b3V0ID0gQ29udGV4dC5nZXRBU1RSZWNvcmRMYXlvdXQoQmFzZURlY2wpOworICAgIFJlcXVpcmVkQWxpZ25tZW50ID0KKyAgICAgICAgc3RkOjptYXgoUmVxdWlyZWRBbGlnbm1lbnQsIEJhc2VMYXlvdXQuZ2V0UmVxdWlyZWRBbGlnbm1lbnQoKSk7CisgIH0KKyAgVnRvckRpc3BBbGlnbm1lbnQgPSBzdGQ6Om1heChWdG9yRGlzcEFsaWdubWVudCwgUmVxdWlyZWRBbGlnbm1lbnQpOworICAvLyBDb21wdXRlIHRoZSB2dG9yZGlzcCBzZXQuCisgIGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IENYWFJlY29yZERlY2wgKiwgMj4gSGFzVnRvcmRpc3BTZXQgPQogICAgICAgY29tcHV0ZVZ0b3JEaXNwU2V0KFJEKTsKLQotICAvLyBJZiB0aGUgbGFzdCBmaWVsZCB3ZSBsYWlkIG91dCB3YXMgYSBub24temVybyBsZW5ndGggYml0ZmllbGQgdGhlbiBhZGQgc29tZQotICAvLyBleHRyYSBwYWRkaW5nIGZvciBubyBvYnZpb3VzIHJlYXNvbi4KLSAgaWYgKExhc3RGaWVsZElzTm9uWmVyb1dpZHRoQml0ZmllbGQpCi0gICAgU2l6ZSArPSBDdXJyZW50Qml0ZmllbGRTaXplOwotCiAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdmlydHVhbCBiYXNlcyBhbmQgbGF5IHRoZW0gb3V0LgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgaSA9IFJELT52YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBSRC0+dmJhc2VzX2VuZCgpOwotICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPQotICAgICAgICBjYXN0PENYWFJlY29yZERlY2w+KGktPmdldFR5cGUoKS0+Y2FzdEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7Ci0gICAgbGF5b3V0VmlydHVhbEJhc2UoQmFzZURlY2wsIEhhc1Z0b3JkaXNwLmNvdW50KEJhc2VEZWNsKSk7CisgIGNvbnN0IEFTVFJlY29yZExheW91dCogUHJldmlvdXNCYXNlTGF5b3V0ID0gMDsKKyAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPnZiYXNlcygpKSB7CisgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSBJLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZCYXNlTGF5b3V0ID0gQ29udGV4dC5nZXRBU1RSZWNvcmRMYXlvdXQoQmFzZURlY2wpOworICAgIGJvb2wgSGFzVnRvcmRpc3AgPSBIYXNWdG9yZGlzcFNldC5jb3VudChCYXNlRGVjbCk7CisgICAgLy8gSWYgdGhlIGxhc3QgZmllbGQgd2UgbGFpZCBvdXQgd2FzIGEgbm9uLXplcm8gbGVuZ3RoIGJpdGZpZWxkIHRoZW4gYWRkCisgICAgLy8gc29tZSBleHRyYSBwYWRkaW5nIGZvciBubyBvYnZpb3VzIHJlYXNvbi4KKyAgICBpZiAoTGFzdEZpZWxkSXNOb25aZXJvV2lkdGhCaXRmaWVsZCkKKyAgICAgIFNpemUgKz0gQ3VycmVudEJpdGZpZWxkU2l6ZTsKKyAgICAvLyBJbnNlcnQgcGFkZGluZyBiZXR3ZWVuIHR3byBiYXNlcyBpZiB0aGUgbGVmdCBmaXJzdCBvbmUgaXMgemVybyBzaXplZCBvcgorICAgIC8vIGNvbnRhaW5zIGEgemVybyBzaXplZCBzdWJvYmplY3QgYW5kIHRoZSByaWdodCBpcyB6ZXJvIHNpemVkIG9yIG9uZSBsZWFkcworICAgIC8vIHdpdGggYSB6ZXJvIHNpemVkIGJhc2UuICBUaGUgcGFkZGluZyBiZXR3ZWVuIHZpcnR1YWwgYmFzZXMgaXMgNAorICAgIC8vIGJ5dGVzIChpbiBib3RoIDMyIGFuZCA2NCBiaXRzIG1vZGVzKSBhbmQgYWx3YXlzIGludm9sdmVzIHJvdW5kaW5nIHVwIHRvCisgICAgLy8gdGhlIHJlcXVpcmVkIGFsaWdubWVudCwgd2UgZG9uJ3Qga25vdyB3aHkuCisgICAgaWYgKFByZXZpb3VzQmFzZUxheW91dCAmJiBQcmV2aW91c0Jhc2VMYXlvdXQtPmhhc1plcm9TaXplZFN1Yk9iamVjdCgpICYmCisgICAgICAgIEJhc2VMYXlvdXQubGVhZHNXaXRoWmVyb1NpemVkQmFzZSgpKQorICAgICAgU2l6ZSA9IFNpemUuUm91bmRVcFRvQWxpZ25tZW50KFZ0b3JEaXNwQWxpZ25tZW50KSArIFZ0b3JEaXNwU2l6ZTsKKyAgICAvLyBJbnNlcnQgdGhlIHZ0b3JkaXNwLgorICAgIGlmIChIYXNWdG9yZGlzcCkKKyAgICAgIFNpemUgPSBTaXplLlJvdW5kVXBUb0FsaWdubWVudChWdG9yRGlzcEFsaWdubWVudCkgKyBWdG9yRGlzcFNpemU7CisgICAgLy8gSW5zZXJ0IHRoZSB2aXJ0dWFsIGJhc2UuCisgICAgSGFzWmVyb1NpemVkU3ViT2JqZWN0ID0gZmFsc2U7CisgICAgRWxlbWVudEluZm8gSW5mbyA9IGdldEFkanVzdGVkRWxlbWVudEluZm8oQmFzZUxheW91dCk7CisgICAgQ2hhclVuaXRzIEJhc2VPZmZzZXQgPSBTaXplLlJvdW5kVXBUb0FsaWdubWVudChJbmZvLkFsaWdubWVudCk7CisgICAgVkJhc2VzLmluc2VydChzdGQ6Om1ha2VfcGFpcihCYXNlRGVjbCwKKyAgICAgICAgQVNUUmVjb3JkTGF5b3V0OjpWQmFzZUluZm8oQmFzZU9mZnNldCwgSGFzVnRvcmRpc3ApKSk7CisgICAgU2l6ZSA9IEJhc2VPZmZzZXQgKyBCYXNlTGF5b3V0LmdldE5vblZpcnR1YWxTaXplKCk7CisgICAgUHJldmlvdXNCYXNlTGF5b3V0ID0gJkJhc2VMYXlvdXQ7CiAgIH0KIH0KIAotdm9pZCBNaWNyb3NvZnRSZWNvcmRMYXlvdXRCdWlsZGVyOjpsYXlvdXRWaXJ0dWFsQmFzZShjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNWdG9yZGlzcCkgewotICBpZiAoTGF6eUVtcHR5QmFzZSkgewotICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF6eUxheW91dCA9Ci0gICAgICAgIENvbnRleHQuZ2V0QVNUUmVjb3JkTGF5b3V0KExhenlFbXB0eUJhc2UpOwotICAgIFNpemUgPSBTaXplLlJvdW5kVXBUb0FsaWdubWVudChMYXp5TGF5b3V0LmdldEFsaWdubWVudCgpKTsKLSAgICBWQmFzZXMuaW5zZXJ0KAotICAgICAgICBzdGQ6Om1ha2VfcGFpcihMYXp5RW1wdHlCYXNlLCBBU1RSZWNvcmRMYXlvdXQ6OlZCYXNlSW5mbyhTaXplLCBmYWxzZSkpKTsKLSAgICAvLyBFbXB0eSBiYXNlcyBvbmx5IGNvbnN1bWUgc3BhY2Ugd2hlbiBmb2xsb3dlZCBieSBhbm90aGVyIGVtcHR5IGJhc2UuCi0gICAgLy8gVGhlIHNwYWNlIGNvbnN1bWVkIGlzIGluIGFuIEFsaWdubWVudCBzaXplZC9hbGlnbmVkIGJsb2NrIGFuZCB0aGUgdi1iYXNlCi0gICAgLy8gaXMgcGxhY2VkIGF0IGl0cyBhbGlnbm1lbnQgb2Zmc2V0IGludG8gdGhlIGNodW5rLCB1bmxlc3MgaXRzIGFsaWdubWVudAotICAgIC8vIGlzIGxlc3MgdGhhbiA0IGJ5dGVzLCBhdCB3aGljaCBpdCBpcyBwbGFjZWQgYXQgNCBieXRlIG9mZnNldCBpbiB0aGUKLSAgICAvLyBjaHVuay4gIFdlIGhhdmUgbm8gaWRlYSB3aHkuCi0gICAgaWYgKFJEICYmIENvbnRleHQuZ2V0QVNUUmVjb3JkTGF5b3V0KFJEKS5nZXROb25WaXJ0dWFsU2l6ZSgpLmlzWmVybygpKQotICAgICAgU2l6ZSA9IFNpemUuUm91bmRVcFRvQWxpZ25tZW50KEFsaWdubWVudCkgKyBDaGFyVW5pdHM6OmZyb21RdWFudGl0eSg0KTsKLSAgICBMYXp5RW1wdHlCYXNlID0gMDsKLSAgfQotCi0gIC8vIFJEIGlzIG51bGwgd2hlbiBmbHVzaGluZyB0aGUgZmluYWwgbGF6eSB2aXJ0dWFsIGJhc2UuCi0gIGlmICghUkQpCi0gICAgcmV0dXJuOwotCi0gIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0ID0gQ29udGV4dC5nZXRBU1RSZWNvcmRMYXlvdXQoUkQpOwotICBpZiAoTGF5b3V0LmdldE5vblZpcnR1YWxTaXplKCkuaXNaZXJvKCkgJiYgIUhhc1Z0b3JkaXNwKSB7Ci0gICAgTGF6eUVtcHR5QmFzZSA9IFJEOwotICAgIHJldHVybjsKLSAgfQotCi0gIENoYXJVbml0cyBCYXNlTlZTaXplID0gTGF5b3V0LmdldE5vblZpcnR1YWxTaXplKCk7Ci0gIENoYXJVbml0cyBCYXNlQWxpZ24gPSBMYXlvdXQuZ2V0QWxpZ25tZW50KCk7Ci0KLSAgLy8gdnRvcmRpc3BzIGFyZSBhbHdheXMgNCBieXRlcyAoZXZlbiBpbiA2NC1iaXQgbW9kZSkKLSAgaWYgKEhhc1Z0b3JkaXNwKQotICAgIFNpemUgPSBTaXplLlJvdW5kVXBUb0FsaWdubWVudChBbGlnbm1lbnQpICsgQ2hhclVuaXRzOjpmcm9tUXVhbnRpdHkoNCk7Ci0gIFNpemUgPSBTaXplLlJvdW5kVXBUb0FsaWdubWVudChCYXNlQWxpZ24pOwotCi0gIC8vIEluc2VydCB0aGUgYmFzZSBoZXJlLgotICBDaGFyVW5pdHMgQmFzZU9mZnNldCA9IFNpemUuUm91bmRVcFRvQWxpZ25tZW50KEJhc2VBbGlnbik7Ci0gIFZCYXNlcy5pbnNlcnQoCi0gICAgICBzdGQ6Om1ha2VfcGFpcihSRCwgQVNUUmVjb3JkTGF5b3V0OjpWQmFzZUluZm8oQmFzZU9mZnNldCwgSGFzVnRvcmRpc3ApKSk7Ci0gIFNpemUgPSBCYXNlT2Zmc2V0ICsgQmFzZU5WU2l6ZTsKLSAgLy8gTm90ZTogd2UgZG9uJ3QgdXBkYXRlIGFsaWdubWVudCBoZXJlIGJlY2F1c2UgaXQgd2FzIGFjY291bnRlZCBmb3IgaW4KLSAgLy8gSW5pdGlhbGl6ZUxheW91dC4KLX0KLQotdm9pZCBNaWNyb3NvZnRSZWNvcmRMYXlvdXRCdWlsZGVyOjpmaW5hbGl6ZUNYWExheW91dChjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgewotICAvLyBGbHVzaCB0aGUgbGF6eSB2aXJ0dWFsIGJhc2UuCi0gIGxheW91dFZpcnR1YWxCYXNlKDAsIGZhbHNlKTsKLQotICBpZiAoUkQtPnZiYXNlc19iZWdpbigpID09IFJELT52YmFzZXNfZW5kKCkgfHwgQWxpZ25BZnRlclZCYXNlcykKK3ZvaWQgTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6ZmluYWxpemVMYXlvdXQoY29uc3QgUmVjb3JkRGVjbCAqUkQpIHsKKyAgLy8gUmVzcGVjdCByZXF1aXJlZCBhbGlnbm1lbnQuICBOb3RlIHRoYXQgaW4gMzItYml0IG1vZGUgUmVxdWlyZWQgYWxpZ25tZW50CisgIC8vIG1heSBiZSAwIG5hZCBjYXVzZSBzaXplIG5vdCB0byBiZSB1cGRhdGVkLgorICBEYXRhU2l6ZSA9IFNpemU7CisgIGlmICghUmVxdWlyZWRBbGlnbm1lbnQuaXNaZXJvKCkpIHsKKyAgICBBbGlnbm1lbnQgPSBzdGQ6Om1heChBbGlnbm1lbnQsIFJlcXVpcmVkQWxpZ25tZW50KTsKICAgICBTaXplID0gU2l6ZS5Sb3VuZFVwVG9BbGlnbm1lbnQoQWxpZ25tZW50KTsKLQotICBpZiAoU2l6ZS5pc1plcm8oKSkKKyAgfQorICAvLyBaZXJvLXNpemVkIHN0cnVjdHVyZXMgaGF2ZSBzaXplIGVxdWFsIHRvIHRoZWlyIGFsaWdubWVudC4KKyAgaWYgKFNpemUuaXNaZXJvKCkpIHsKKyAgICBIYXNaZXJvU2l6ZWRTdWJPYmplY3QgPSB0cnVlOworICAgIExlYWRzV2l0aFplcm9TaXplZEJhc2UgPSB0cnVlOwogICAgIFNpemUgPSBBbGlnbm1lbnQ7Ci19Ci0KLXZvaWQgTWljcm9zb2Z0UmVjb3JkTGF5b3V0QnVpbGRlcjo6aG9ub3JEZWNsc3BlY0FsaWduKGNvbnN0IFJlY29yZERlY2wgKlJEKSB7Ci0gIGlmICh1bnNpZ25lZCBNYXhBbGlnbiA9IFJELT5nZXRNYXhBbGlnbm1lbnQoKSkgewotICAgIEFsaWduQWZ0ZXJWQmFzZXMgPSB0cnVlOwotICAgIHVwZGF0ZUFsaWdubWVudChDb250ZXh0LnRvQ2hhclVuaXRzRnJvbUJpdHMoTWF4QWxpZ24pKTsKLSAgICBTaXplID0gU2l6ZS5Sb3VuZFVwVG9BbGlnbm1lbnQoQWxpZ25tZW50KTsKICAgfQogfQogCkBAIC0yNjAyLDM3ICsyNjUwLDUzIEBACiAgICAgcmV0dXJuIHRydWU7CiAgIC8vIElmIGFueSBvZiBhIHZpcnR1YWwgYmFzZXMgbm9uLXZpcnR1YWwgYmFzZXMgKHJlY3Vyc2l2ZWx5KSByZXF1aXJlcyBhCiAgIC8vIHZ0b3JkaXNwIHRoYW4gc28gZG9lcyB0aGlzIHZpcnR1YWwgYmFzZS4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIGkgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBSRC0+YmFzZXNfZW5kKCk7Ci0gICAgICAgaSAhPSBlOyArK2kpCi0gICAgaWYgKCFpLT5pc1ZpcnR1YWwoKSAmJgorICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSRC0+YmFzZXMoKSkKKyAgICBpZiAoIUkuaXNWaXJ0dWFsKCkgJiYKICAgICAgICAgUmVxdWlyZXNWdG9yZGlzcCgKICAgICAgICAgICAgIEhhc1Z0b3JkaXNwLAotICAgICAgICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihpLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSkpKQorICAgICAgICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKSkpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgcmV0dXJuIGZhbHNlOwogfQogCiBsbHZtOjpTbWFsbFB0clNldDxjb25zdCBDWFhSZWNvcmREZWNsICosIDI+CiBNaWNyb3NvZnRSZWNvcmRMYXlvdXRCdWlsZGVyOjpjb21wdXRlVnRvckRpc3BTZXQoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKLSAgbGx2bTo6U21hbGxQdHJTZXQ8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCAyPiBIYXNWdG9yZGlzcDsKKyAgbGx2bTo6U21hbGxQdHJTZXQ8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCAyPiBIYXNWdG9yZGlzcFNldDsKKworICAvLyAvdmQwIG9yICNwcmFnbWEgdnRvcmRpc3AoMCk6IE5ldmVyIHVzZSB2dG9yZGlzcHMgd2hlbiB1c2VkIGFzIGEgdmJhc2UuCisgIGlmIChSRC0+Z2V0TVNWdG9yRGlzcE1vZGUoKSA9PSBNU1Z0b3JEaXNwQXR0cjo6TmV2ZXIpCisgICAgcmV0dXJuIEhhc1Z0b3JkaXNwU2V0OworCisgIC8vIC92ZDIgb3IgI3ByYWdtYSB2dG9yZGlzcCgyKTogQWx3YXlzIHVzZSB2dG9yZGlzcHMgZm9yIHZpcnR1YWwgYmFzZXMgd2l0aAorICAvLyB2ZnRhYmxlcy4KKyAgaWYgKFJELT5nZXRNU1Z0b3JEaXNwTW9kZSgpID09IE1TVnRvckRpc3BBdHRyOjpGb3JWRlRhYmxlKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPnZiYXNlcygpKSB7CisgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9IEkuZ2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKKyAgICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0ID0gQ29udGV4dC5nZXRBU1RSZWNvcmRMYXlvdXQoQmFzZURlY2wpOworICAgICAgaWYgKExheW91dC5oYXNFeHRlbmRhYmxlVkZQdHIoKSkKKyAgICAgICAgSGFzVnRvcmRpc3BTZXQuaW5zZXJ0KEJhc2VEZWNsKTsKKyAgICB9CisgICAgcmV0dXJuIEhhc1Z0b3JkaXNwU2V0OworICB9CisKKyAgLy8gL3ZkMSBvciAjcHJhZ21hIHZ0b3JkaXNwKDEpOiBUcnkgdG8gZ3Vlc3MgYmFzZWQgb24gd2hldGhlciB3ZSB0aGluayBpdCdzCisgIC8vIHBvc3NpYmxlIGZvciBhIHBhcnRpYWxseSBjb25zdHJ1Y3RlZCBvYmplY3Qgd2l0aCB2aXJ0dWFsIGJhc2Ugb3ZlcnJpZGVzIHRvCisgIC8vIGVzY2FwZSBhIG5vbi10cml2aWFsIGNvbnN0cnVjdG9yLgorICBhc3NlcnQoUkQtPmdldE1TVnRvckRpc3BNb2RlKCkgPT0gTVNWdG9yRGlzcEF0dHI6OkZvclZCYXNlT3ZlcnJpZGUpOwogCiAgIC8vIElmIGFueSBvZiBvdXIgYmFzZXMgbmVlZCBhIHZ0b3JkaXNwIGZvciB0aGlzIHR5cGUsIHNvIGRvIHdlLiAgQ2hlY2sgb3VyCiAgIC8vIGRpcmVjdCBiYXNlcyBmb3IgdnRvcmRpc3AgcmVxdWlyZW1lbnRzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgaSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFJELT5iYXNlc19lbmQoKTsKLSAgICAgICBpICE9IGU7ICsraSkgeworICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSRC0+YmFzZXMoKSkgewogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0KLSAgICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihpLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CiAgICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZMYXlvdXQgPSBDb250ZXh0LmdldEFTVFJlY29yZExheW91dChCYXNlRGVjbCk7CiAgICAgZm9yIChBU1RSZWNvcmRMYXlvdXQ6OlZCYXNlT2Zmc2V0c01hcFR5Ojpjb25zdF9pdGVyYXRvcgogICAgICAgICAgICAgIGJpID0gTGF5b3V0LmdldFZCYXNlT2Zmc2V0c01hcCgpLmJlZ2luKCksCiAgICAgICAgICAgICAgYmUgPSBMYXlvdXQuZ2V0VkJhc2VPZmZzZXRzTWFwKCkuZW5kKCk7CiAgICAgICAgICBiaSAhPSBiZTsgKytiaSkKICAgICAgIGlmIChiaS0+c2Vjb25kLmhhc1Z0b3JEaXNwKCkpCi0gICAgICAgIEhhc1Z0b3JkaXNwLmluc2VydChiaS0+Zmlyc3QpOworICAgICAgICBIYXNWdG9yZGlzcFNldC5pbnNlcnQoYmktPmZpcnN0KTsKICAgfQotCiAgIC8vIElmIHdlIGRlZmluZSBhIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgYW5kIG92ZXJyaWRlIGEgZnVuY3Rpb24gdGhhdCBpcwogICAvLyBkZWZpbmVkIGluIGEgdmlydHVhbCBiYXNlJ3MgdnRhYmxlLCB0aGF0IHZpcnR1YWwgYmFzZXMgbmVlZCBhIHZ0b3JkaXNwLgogICAvLyBIZXJlIHdlIGNvbGxlY3QgYSBsaXN0IG9mIGNsYXNzZXMgd2l0aCB2dGFibGVzIGZvciB3aGljaCBvdXIgdmlydHVhbCBiYXNlcwpAQCAtMjY0MywzNiArMjcwNywzMSBAQAogICBpZiAoUkQtPmhhc1VzZXJEZWNsYXJlZENvbnN0cnVjdG9yKCkgfHwgUkQtPmhhc1VzZXJEZWNsYXJlZERlc3RydWN0b3IoKSkgewogICAgIGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IENYWE1ldGhvZERlY2wgKiwgOD4gV29yazsKICAgICAvLyBTZWVkIHRoZSB3b3JraW5nIHNldCB3aXRoIG91ciBub24tZGVzdHJ1Y3RvciB2aXJ0dWFsIG1ldGhvZHMuCi0gICAgZm9yIChDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IgaSA9IFJELT5tZXRob2RfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gUkQtPm1ldGhvZF9lbmQoKTsKLSAgICAgICAgIGkgIT0gZTsgKytpKQotICAgICAgaWYgKCgqaSktPmlzVmlydHVhbCgpICYmICFpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KCppKSkKLSAgICAgICAgV29yay5pbnNlcnQoKmkpOworICAgIGZvciAoY29uc3QgYXV0byAqSSA6IFJELT5tZXRob2RzKCkpCisgICAgICBpZiAoSS0+aXNWaXJ0dWFsKCkgJiYgIWlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oSSkpCisgICAgICAgIFdvcmsuaW5zZXJ0KEkpOwogICAgIHdoaWxlICghV29yay5lbXB0eSgpKSB7CiAgICAgICBjb25zdCBDWFhNZXRob2REZWNsICpNRCA9ICpXb3JrLmJlZ2luKCk7CiAgICAgICBDWFhNZXRob2REZWNsOjptZXRob2RfaXRlcmF0b3IgaSA9IE1ELT5iZWdpbl9vdmVycmlkZGVuX21ldGhvZHMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gTUQtPmVuZF9vdmVycmlkZGVuX21ldGhvZHMoKTsKICAgICAgIGlmIChpID09IGUpCiAgICAgICAgIC8vIElmIGEgdmlydHVhbCBtZXRob2QgaGFzIG5vLW92ZXJyaWRlcyBpdCBsaXZlcyBpbiBpdHMgcGFyZW50J3MgdnRhYmxlLgotICAgICAgICBIYXNWdG9yZGlzcC5pbnNlcnQoTUQtPmdldFBhcmVudCgpKTsKKyAgICAgICAgSGFzVnRvcmRpc3BTZXQuaW5zZXJ0KE1ELT5nZXRQYXJlbnQoKSk7CiAgICAgICBlbHNlCiAgICAgICAgIFdvcmsuaW5zZXJ0KGksIGUpOwogICAgICAgLy8gV2UndmUgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGlzIGVsZW1lbnQsIHJlbW92ZSBpdCBmcm9tIHRoZSB3b3JraW5nIHNldC4KICAgICAgIFdvcmsuZXJhc2UoTUQpOwogICAgIH0KICAgfQotCiAgIC8vIFJlLWNoZWNrIGFsbCBvZiBvdXIgdmJhc2VzIGZvciB2dG9yZGlzcCByZXF1aXJlbWVudHMgKGluIGNhc2UgdGhlaXIKICAgLy8gbm9uLXZpcnR1YWwgYmFzZXMgaGF2ZSB2dG9yZGlzcCByZXF1aXJlbWVudHMpLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgaSA9IFJELT52YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBSRC0+dmJhc2VzX2VuZCgpOwotICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSAgaS0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKLSAgICBpZiAoIUhhc1Z0b3JkaXNwLmNvdW50KEJhc2VEZWNsKSAmJiBSZXF1aXJlc1Z0b3JkaXNwKEhhc1Z0b3JkaXNwLCBCYXNlRGVjbCkpCi0gICAgICBIYXNWdG9yZGlzcC5pbnNlcnQoQmFzZURlY2wpOworICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSRC0+dmJhc2VzKCkpIHsKKyAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9ICBJLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgICAgaWYgKCFIYXNWdG9yZGlzcFNldC5jb3VudChCYXNlRGVjbCkgJiYKKyAgICAgICAgUmVxdWlyZXNWdG9yZGlzcChIYXNWdG9yZGlzcFNldCwgQmFzZURlY2wpKQorICAgICAgSGFzVnRvcmRpc3BTZXQuaW5zZXJ0KEJhc2VEZWNsKTsKICAgfQotCi0gIHJldHVybiBIYXNWdG9yZGlzcDsKKyAgcmV0dXJuIEhhc1Z0b3JkaXNwU2V0OwogfQogCiAvLy8gXGJyaWVmIEdldCBvciBjb21wdXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXlvdXQgb2YgdGhlIHNwZWNpZmllZCByZWNvcmQKQEAgLTI2ODQsMTkgKzI3NDMsMjAgQEAKICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4oRCkpIHsKICAgICBCdWlsZGVyLmN4eExheW91dChSRCk7CiAgICAgcmV0dXJuIG5ldyAoKnRoaXMpIEFTVFJlY29yZExheW91dCgKLSAgICAgICAgKnRoaXMsIEJ1aWxkZXIuU2l6ZSwgQnVpbGRlci5BbGlnbm1lbnQsCi0gICAgICAgIEJ1aWxkZXIuSGFzRXh0ZW5kYWJsZVZGUHRyICYmICFCdWlsZGVyLlByaW1hcnlCYXNlLAotICAgICAgICBCdWlsZGVyLkhhc0V4dGVuZGFibGVWRlB0ciwKLSAgICAgICAgQnVpbGRlci5WQlB0ck9mZnNldCwgQnVpbGRlci5EYXRhU2l6ZSwgQnVpbGRlci5GaWVsZE9mZnNldHMuZGF0YSgpLAotICAgICAgICBCdWlsZGVyLkZpZWxkT2Zmc2V0cy5zaXplKCksIEJ1aWxkZXIuRGF0YVNpemUsCi0gICAgICAgIEJ1aWxkZXIuTm9uVmlydHVhbEFsaWdubWVudCwgQ2hhclVuaXRzOjpaZXJvKCksIEJ1aWxkZXIuUHJpbWFyeUJhc2UsCi0gICAgICAgIGZhbHNlLCBCdWlsZGVyLlNoYXJlZFZCUHRyQmFzZSwgQnVpbGRlci5BbGlnbkFmdGVyVkJhc2VzLCBCdWlsZGVyLkJhc2VzLAotICAgICAgICBCdWlsZGVyLlZCYXNlcyk7CisgICAgICAgICp0aGlzLCBCdWlsZGVyLlNpemUsIEJ1aWxkZXIuQWxpZ25tZW50LCBCdWlsZGVyLlJlcXVpcmVkQWxpZ25tZW50LAorICAgICAgICBCdWlsZGVyLkhhc093blZGUHRyLAorICAgICAgICBCdWlsZGVyLkhhc093blZGUHRyIHx8IEJ1aWxkZXIuUHJpbWFyeUJhc2UsCisgICAgICAgIEJ1aWxkZXIuVkJQdHJPZmZzZXQsIEJ1aWxkZXIuTm9uVmlydHVhbFNpemUsIEJ1aWxkZXIuRmllbGRPZmZzZXRzLmRhdGEoKSwKKyAgICAgICAgQnVpbGRlci5GaWVsZE9mZnNldHMuc2l6ZSgpLCBCdWlsZGVyLk5vblZpcnR1YWxTaXplLAorICAgICAgICBCdWlsZGVyLkFsaWdubWVudCwgQ2hhclVuaXRzOjpaZXJvKCksIEJ1aWxkZXIuUHJpbWFyeUJhc2UsCisgICAgICAgIGZhbHNlLCBCdWlsZGVyLlNoYXJlZFZCUHRyQmFzZSwKKyAgICAgICAgQnVpbGRlci5IYXNaZXJvU2l6ZWRTdWJPYmplY3QsIEJ1aWxkZXIuTGVhZHNXaXRoWmVyb1NpemVkQmFzZSwKKyAgICAgICAgQnVpbGRlci5CYXNlcywgQnVpbGRlci5WQmFzZXMpOwogICB9IGVsc2UgewogICAgIEJ1aWxkZXIubGF5b3V0KEQpOwogICAgIHJldHVybiBuZXcgKCp0aGlzKSBBU1RSZWNvcmRMYXlvdXQoCi0gICAgICAgICp0aGlzLCBCdWlsZGVyLlNpemUsIEJ1aWxkZXIuQWxpZ25tZW50LCBCdWlsZGVyLlNpemUsCi0gICAgICAgIEJ1aWxkZXIuRmllbGRPZmZzZXRzLmRhdGEoKSwgQnVpbGRlci5GaWVsZE9mZnNldHMuc2l6ZSgpKTsKKyAgICAgICAgKnRoaXMsIEJ1aWxkZXIuU2l6ZSwgQnVpbGRlci5BbGlnbm1lbnQsIEJ1aWxkZXIuUmVxdWlyZWRBbGlnbm1lbnQsCisgICAgICAgIEJ1aWxkZXIuU2l6ZSwgQnVpbGRlci5GaWVsZE9mZnNldHMuZGF0YSgpLCBCdWlsZGVyLkZpZWxkT2Zmc2V0cy5zaXplKCkpOwogICB9CiB9CiAKQEAgLTI3NDcsNiArMjgwNyw4IEBACiAgICAgTmV3RW50cnkgPQogICAgICAgbmV3ICgqdGhpcykgQVNUUmVjb3JkTGF5b3V0KCp0aGlzLCBCdWlsZGVyLmdldFNpemUoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5BbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypSZXF1aXJlZEFsaWdubWVudCA6IHVzZWQgYnkgTVMtQUJJKSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5BbGlnbm1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5IYXNPd25WRlB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRC0+aXNEeW5hbWljQ2xhc3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHM6OmZyb21RdWFudGl0eSgtMSksCkBAIC0yNzU4LDcgKzI4MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5U3Vib2JqZWN0cy5TaXplT2ZMYXJnZXN0RW1wdHlTdWJvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5QcmltYXJ5QmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLlByaW1hcnlCYXNlSXNWaXJ0dWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIuQmFzZXMsIEJ1aWxkZXIuVkJhc2VzKTsKICAgfSBlbHNlIHsKICAgICBSZWNvcmRMYXlvdXRCdWlsZGVyIEJ1aWxkZXIoKnRoaXMsIC8qRW1wdHlTdWJvYmplY3RzPSovMCk7CkBAIC0yNzY3LDYgKzI4MjksOCBAQAogICAgIE5ld0VudHJ5ID0KICAgICAgIG5ldyAoKnRoaXMpIEFTVFJlY29yZExheW91dCgqdGhpcywgQnVpbGRlci5nZXRTaXplKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIuQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qUmVxdWlyZWRBbGlnbm1lbnQgOiB1c2VkIGJ5IE1TLUFCSSkqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIuQWxpZ25tZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIuZ2V0U2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIuRmllbGRPZmZzZXRzLmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLkZpZWxkT2Zmc2V0cy5zaXplKCkpOwpAQCAtMjgzMCwxMCArMjg5NCw4IEBACiAgICAgY29uc3QgSW5kaXJlY3RGaWVsZERlY2wgKklGRCA9IGNhc3Q8SW5kaXJlY3RGaWVsZERlY2w+KFZEKTsKIAogICAgIE9mZnNldEluQml0cyA9IDA7Ci0gICAgZm9yIChJbmRpcmVjdEZpZWxkRGVjbDo6Y2hhaW5faXRlcmF0b3IgQ0kgPSBJRkQtPmNoYWluX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0UgPSBJRkQtPmNoYWluX2VuZCgpOwotICAgICAgICAgQ0kgIT0gQ0U7ICsrQ0kpCi0gICAgICBPZmZzZXRJbkJpdHMgKz0gOjpnZXRGaWVsZE9mZnNldCgqdGhpcywgY2FzdDxGaWVsZERlY2w+KCpDSSkpOworICAgIGZvciAoY29uc3QgYXV0byAqQ0kgOiBJRkQtPmNoYWluKCkpCisgICAgICBPZmZzZXRJbkJpdHMgKz0gOjpnZXRGaWVsZE9mZnNldCgqdGhpcywgY2FzdDxGaWVsZERlY2w+KENJKSk7CiAgIH0KIAogICByZXR1cm4gT2Zmc2V0SW5CaXRzOwpAQCAtMjg3Niw2ICsyOTM4LDggQEAKICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICpOZXdFbnRyeSA9CiAgICAgbmV3ICgqdGhpcykgQVNUUmVjb3JkTGF5b3V0KCp0aGlzLCBCdWlsZGVyLmdldFNpemUoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIuQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlJlcXVpcmVkQWxpZ25tZW50IDogdXNlZCBieSBNUy1BQkkpKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5BbGlnbm1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIuZ2V0RGF0YVNpemUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5GaWVsZE9mZnNldHMuZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLkZpZWxkT2Zmc2V0cy5zaXplKCkpOwpAQCAtMjkyOCwxOSArMjk5MiwyNyBAQAogICAgIE9TIDw8ICcoJyA8PCAqUkQgPDwgIiB2ZnRhYmxlIHBvaW50ZXIpXG4iOwogICB9CiAKLSAgLy8gRHVtcCAobm9uLXZpcnR1YWwpIGJhc2VzCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICBFID0gUkQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGFzc2VydCghSS0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSAmJgorICAvLyBDb2xsZWN0IG52YmFzZXMuCisgIFNtYWxsVmVjdG9yPGNvbnN0IENYWFJlY29yZERlY2wgKiwgND4gQmFzZXM7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT5iYXNlcygpKSB7CisgICAgYXNzZXJ0KCFJLmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCkgJiYKICAgICAgICAgICAgIkNhbm5vdCBsYXlvdXQgY2xhc3Mgd2l0aCBkZXBlbmRlbnQgYmFzZXMuIik7Ci0gICAgaWYgKEktPmlzVmlydHVhbCgpKQotICAgICAgY29udGludWU7CisgICAgaWYgKCFJLmlzVmlydHVhbCgpKQorICAgICAgQmFzZXMucHVzaF9iYWNrKEkuZ2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKSk7CisgIH0KIAotICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2UgPQotICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgIC8vIFNvcnQgbnZiYXNlcyBieSBvZmZzZXQuCisgIHN0ZDo6c3RhYmxlX3NvcnQoQmFzZXMuYmVnaW4oKSwgQmFzZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgWyZdKGNvbnN0IENYWFJlY29yZERlY2wgKkwsIGNvbnN0IENYWFJlY29yZERlY2wgKlIpIHsKKyAgICByZXR1cm4gTGF5b3V0LmdldEJhc2VDbGFzc09mZnNldChMKSA8IExheW91dC5nZXRCYXNlQ2xhc3NPZmZzZXQoUik7CisgIH0pOwogCisgIC8vIER1bXAgKG5vbi12aXJ0dWFsKSBiYXNlcworICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBDWFhSZWNvcmREZWNsICo+OjppdGVyYXRvciBJID0gQmFzZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IEJhc2VzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZSA9ICpJOwogICAgIENoYXJVbml0cyBCYXNlT2Zmc2V0ID0gT2Zmc2V0ICsgTGF5b3V0LmdldEJhc2VDbGFzc09mZnNldChCYXNlKTsKLQogICAgIER1bXBDWFhSZWNvcmRMYXlvdXQoT1MsIEJhc2UsIEMsIEJhc2VPZmZzZXQsIEluZGVudExldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgQmFzZSA9PSBQcmltYXJ5QmFzZSA/ICIocHJpbWFyeSBiYXNlKSIgOiAiKGJhc2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIC8qSW5jbHVkZVZpcnR1YWxCYXNlcz0qL2ZhbHNlKTsKQEAgLTI5NzksMTEgKzMwNTEsMTAgQEAKICAgLy8gRHVtcCB2aXJ0dWFsIGJhc2VzLgogICBjb25zdCBBU1RSZWNvcmRMYXlvdXQ6OlZCYXNlT2Zmc2V0c01hcFR5ICZ2dG9yZGlzcHMgPSAKICAgICBMYXlvdXQuZ2V0VkJhc2VPZmZzZXRzTWFwKCk7Ci0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPnZiYXNlc19iZWdpbigpLAotICAgICAgICAgRSA9IFJELT52YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgYXNzZXJ0KEktPmlzVmlydHVhbCgpICYmICJGb3VuZCBub24tdmlydHVhbCBjbGFzcyEiKTsKKyAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPnZiYXNlcygpKSB7CisgICAgYXNzZXJ0KEkuaXNWaXJ0dWFsKCkgJiYgIkZvdW5kIG5vbi12aXJ0dWFsIGNsYXNzISIpOwogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlZCYXNlID0KLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKIAogICAgIENoYXJVbml0cyBWQmFzZU9mZnNldCA9IE9mZnNldCArIExheW91dC5nZXRWQmFzZUNsYXNzT2Zmc2V0KFZCYXNlKTsKIApAQCAtMzAwNiw3ICszMDc3LDcgQEAKIAogICBQcmludEluZGVudE5vT2Zmc2V0KE9TLCBJbmRlbnRMZXZlbCAtIDEpOwogICBPUyA8PCAiIG52c2l6ZT0iIDw8IExheW91dC5nZXROb25WaXJ0dWFsU2l6ZSgpLmdldFF1YW50aXR5KCk7Ci0gIE9TIDw8ICIsIG52YWxpZ249IiA8PCBMYXlvdXQuZ2V0Tm9uVmlydHVhbEFsaWduKCkuZ2V0UXVhbnRpdHkoKSA8PCAiXVxuIjsKKyAgT1MgPDwgIiwgbnZhbGlnbj0iIDw8IExheW91dC5nZXROb25WaXJ0dWFsQWxpZ25tZW50KCkuZ2V0UXVhbnRpdHkoKSA8PCAiXVxuIjsKICAgT1MgPDwgJ1xuJzsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL0FTVC9TdG10LmNwcCBiL2xpYi9BU1QvU3RtdC5jcHAKaW5kZXggZGU4NTE2MS4uYTAzZWYwMCAxMDA2NDQKLS0tIGEvbGliL0FTVC9TdG10LmNwcAorKysgYi9saWIvQVNUL1N0bXQuY3BwCkBAIC04MDMsNyArODAzLDcgQEAKIEV4cHIgKkNYWEZvclJhbmdlU3RtdDo6Z2V0UmFuZ2VJbml0KCkgewogICBEZWNsU3RtdCAqUmFuZ2VTdG10ID0gZ2V0UmFuZ2VTdG10KCk7CiAgIFZhckRlY2wgKlJhbmdlRGVjbCA9IGR5bl9jYXN0X29yX251bGw8VmFyRGVjbD4oUmFuZ2VTdG10LT5nZXRTaW5nbGVEZWNsKCkpOwotICBhc3NlcnQoUmFuZ2VEZWNsICYmJiAiZm9yLXJhbmdlIHNob3VsZCBoYXZlIGEgc2luZ2xlIHZhciBkZWNsIik7CisgIGFzc2VydChSYW5nZURlY2wgJiYgImZvci1yYW5nZSBzaG91bGQgaGF2ZSBhIHNpbmdsZSB2YXIgZGVjbCIpOwogICByZXR1cm4gUmFuZ2VEZWNsLT5nZXRJbml0KCk7CiB9CiAKQEAgLTExMDAsMTUgKzExMDAsMTQgQEAKIH0KIAogYm9vbCBDYXB0dXJlZFN0bXQ6OmNhcHR1cmVzVmFyaWFibGUoY29uc3QgVmFyRGVjbCAqVmFyKSBjb25zdCB7Ci0gIGZvciAoY29uc3RfY2FwdHVyZV9pdGVyYXRvciBJID0gY2FwdHVyZV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IGNhcHR1cmVfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgaWYgKCFJLT5jYXB0dXJlc1ZhcmlhYmxlKCkpCisgIGZvciAoY29uc3QgYXV0byAmSSA6IGNhcHR1cmVzKCkpIHsKKyAgICBpZiAoIUkuY2FwdHVyZXNWYXJpYWJsZSgpKQogICAgICAgY29udGludWU7CiAKICAgICAvLyBUaGlzIGRvZXMgbm90IGhhbmRsZSB2YXJpYWJsZSByZWRlY2xhcmF0aW9ucy4gVGhpcyBzaG91bGQgYmUKICAgICAvLyBleHRlbmRlZCB0byBjYXB0dXJlIHZhcmlhYmxlcyB3aXRoIHJlZGVjbGFyYXRpb25zLCBmb3IgZXhhbXBsZQogICAgIC8vIGEgdGhyZWFkLXByaXZhdGUgdmFyaWFibGUgaW4gT3Blbk1QLgotICAgIGlmIChJLT5nZXRDYXB0dXJlZFZhcigpID09IFZhcikKKyAgICBpZiAoSS5nZXRDYXB0dXJlZFZhcigpID09IFZhcikKICAgICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTExMzAsOCArMTEyOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IFZMKSB7Ci0gIHZvaWQgKk1lbSA9IEMuQWxsb2NhdGUoc2l6ZW9mKE9NUFByaXZhdGVDbGF1c2UpICsgc2l6ZW9mKEV4cHIgKikgKiBWTC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6YWxpZ25PZjxPTVBQcml2YXRlQ2xhdXNlPigpKTsKKyAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoc2l6ZW9mKE9NUFByaXZhdGVDbGF1c2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjphbGlnbk9mPEV4cHIgKj4oKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFeHByICopICogVkwuc2l6ZSgpKTsKICAgT01QUHJpdmF0ZUNsYXVzZSAqQ2xhdXNlID0gbmV3IChNZW0pIE9NUFByaXZhdGVDbGF1c2UoU3RhcnRMb2MsIExQYXJlbkxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kTG9jLCBWTC5zaXplKCkpOwogICBDbGF1c2UtPnNldFZhclJlZnMoVkwpOwpAQCAtMTE0MCw4ICsxMTQwLDkgQEAKIAogT01QUHJpdmF0ZUNsYXVzZSAqT01QUHJpdmF0ZUNsYXVzZTo6Q3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE4pIHsKLSAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShzaXplb2YoT01QUHJpdmF0ZUNsYXVzZSkgKyBzaXplb2YoRXhwciAqKSAqIE4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6YWxpZ25PZjxPTVBQcml2YXRlQ2xhdXNlPigpKTsKKyAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoc2l6ZW9mKE9NUFByaXZhdGVDbGF1c2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjphbGlnbk9mPEV4cHIgKj4oKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFeHByICopICogTik7CiAgIHJldHVybiBuZXcgKE1lbSkgT01QUHJpdmF0ZUNsYXVzZShOKTsKIH0KIApAQCAtMTE1MCw5ICsxMTUxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gVkwpIHsKLSAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShzaXplb2YoT01QRmlyc3Rwcml2YXRlQ2xhdXNlKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEV4cHIgKikgKiBWTC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6YWxpZ25PZjxPTVBGaXJzdHByaXZhdGVDbGF1c2U+KCkpOworICB2b2lkICpNZW0gPSBDLkFsbG9jYXRlKGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChzaXplb2YoT01QRmlyc3Rwcml2YXRlQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6YWxpZ25PZjxFeHByICo+KCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRXhwciAqKSAqIFZMLnNpemUoKSk7CiAgIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSAqQ2xhdXNlID0gbmV3IChNZW0pIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZShTdGFydExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQYXJlbkxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZExvYywKQEAgLTExNjMsOCArMTE2NCw5IEBACiAKIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSAqT01QRmlyc3Rwcml2YXRlQ2xhdXNlOjpDcmVhdGVFbXB0eShjb25zdCBBU1RDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE4pIHsKLSAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShzaXplb2YoT01QRmlyc3Rwcml2YXRlQ2xhdXNlKSArIHNpemVvZihFeHByICopICogTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjphbGlnbk9mPE9NUEZpcnN0cHJpdmF0ZUNsYXVzZT4oKSk7CisgIHZvaWQgKk1lbSA9IEMuQWxsb2NhdGUobGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KHNpemVvZihPTVBGaXJzdHByaXZhdGVDbGF1c2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjphbGlnbk9mPEV4cHIgKj4oKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFeHByICopICogTik7CiAgIHJldHVybiBuZXcgKE1lbSkgT01QRmlyc3Rwcml2YXRlQ2xhdXNlKE4pOwogfQogCkBAIC0xMTczLDggKzExNzUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBWTCkgewotICB2b2lkICpNZW0gPSBDLkFsbG9jYXRlKHNpemVvZihPTVBTaGFyZWRDbGF1c2UpICsgc2l6ZW9mKEV4cHIgKikgKiBWTC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6YWxpZ25PZjxPTVBTaGFyZWRDbGF1c2U+KCkpOworICB2b2lkICpNZW0gPSBDLkFsbG9jYXRlKGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChzaXplb2YoT01QU2hhcmVkQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6YWxpZ25PZjxFeHByICo+KCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRXhwciAqKSAqIFZMLnNpemUoKSk7CiAgIE9NUFNoYXJlZENsYXVzZSAqQ2xhdXNlID0gbmV3IChNZW0pIE9NUFNoYXJlZENsYXVzZShTdGFydExvYywgTFBhcmVuTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kTG9jLCBWTC5zaXplKCkpOwogICBDbGF1c2UtPnNldFZhclJlZnMoVkwpOwpAQCAtMTE4MywxNSArMTE4NiwzOCBAQAogCiBPTVBTaGFyZWRDbGF1c2UgKk9NUFNoYXJlZENsYXVzZTo6Q3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOKSB7Ci0gIHZvaWQgKk1lbSA9IEMuQWxsb2NhdGUoc2l6ZW9mKE9NUFNoYXJlZENsYXVzZSkgKyBzaXplb2YoRXhwciAqKSAqIE4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6YWxpZ25PZjxPTVBTaGFyZWRDbGF1c2U+KCkpOworICB2b2lkICpNZW0gPSBDLkFsbG9jYXRlKGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChzaXplb2YoT01QU2hhcmVkQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6YWxpZ25PZjxFeHByICo+KCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRXhwciAqKSAqIE4pOwogICByZXR1cm4gbmV3IChNZW0pIE9NUFNoYXJlZENsYXVzZShOKTsKIH0KIAorT01QQ29weWluQ2xhdXNlICpPTVBDb3B5aW5DbGF1c2U6OkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEV4cHIgKj4gVkwpIHsKKyAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoc2l6ZW9mKE9NUENvcHlpbkNsYXVzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmFsaWduT2Y8RXhwciAqPigpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEV4cHIgKikgKiBWTC5zaXplKCkpOworICBPTVBDb3B5aW5DbGF1c2UgKkNsYXVzZSA9IG5ldyAoTWVtKSBPTVBDb3B5aW5DbGF1c2UoU3RhcnRMb2MsIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZExvYywgVkwuc2l6ZSgpKTsKKyAgQ2xhdXNlLT5zZXRWYXJSZWZzKFZMKTsKKyAgcmV0dXJuIENsYXVzZTsKK30KKworT01QQ29weWluQ2xhdXNlICpPTVBDb3B5aW5DbGF1c2U6OkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTikgeworICB2b2lkICpNZW0gPSBDLkFsbG9jYXRlKGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChzaXplb2YoT01QQ29weWluQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6YWxpZ25PZjxFeHByICo+KCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRXhwciAqKSAqIE4pOworICByZXR1cm4gbmV3IChNZW0pIE9NUENvcHlpbkNsYXVzZShOKTsKK30KKwogdm9pZCBPTVBFeGVjdXRhYmxlRGlyZWN0aXZlOjpzZXRDbGF1c2VzKEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzKSB7Ci0gIGFzc2VydChDbGF1c2VzLnNpemUoKSA9PSB0aGlzLT5DbGF1c2VzLnNpemUoKSAmJgorICBhc3NlcnQoQ2xhdXNlcy5zaXplKCkgPT0gZ2V0TnVtQ2xhdXNlcygpICYmCiAgICAgICAgICAiTnVtYmVyIG9mIGNsYXVzZXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBwcmVhbGxvY2F0ZWQgYnVmZmVyIik7Ci0gIHN0ZDo6Y29weShDbGF1c2VzLmJlZ2luKCksIENsYXVzZXMuZW5kKCksIHRoaXMtPkNsYXVzZXMuYmVnaW4oKSk7CisgIHN0ZDo6Y29weShDbGF1c2VzLmJlZ2luKCksIENsYXVzZXMuZW5kKCksIGdldENsYXVzZXMoKS5iZWdpbigpKTsKIH0KIAogT01QUGFyYWxsZWxEaXJlY3RpdmUgKk9NUFBhcmFsbGVsRGlyZWN0aXZlOjpDcmVhdGUoCkBAIC0xMjAwLDkgKzEyMjYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQXNzb2NpYXRlZFN0bXQpIHsKLSAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShzaXplb2YoT01QUGFyYWxsZWxEaXJlY3RpdmUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoT01QQ2xhdXNlICopICogQ2xhdXNlcy5zaXplKCkgKyBzaXplb2YoU3RtdCAqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjphbGlnbk9mPE9NUFBhcmFsbGVsRGlyZWN0aXZlPigpKTsKKyAgdW5zaWduZWQgU2l6ZSA9IGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChzaXplb2YoT01QUGFyYWxsZWxEaXJlY3RpdmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmFsaWduT2Y8T01QQ2xhdXNlICo+KCkpOworICB2b2lkICpNZW0gPSBDLkFsbG9jYXRlKFNpemUgKyBzaXplb2YoT01QQ2xhdXNlICopICogQ2xhdXNlcy5zaXplKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTdG10ICopKTsKICAgT01QUGFyYWxsZWxEaXJlY3RpdmUgKkRpciA9IG5ldyAoTWVtKSBPTVBQYXJhbGxlbERpcmVjdGl2ZShTdGFydExvYywgRW5kTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXVzZXMuc2l6ZSgpKTsKICAgRGlyLT5zZXRDbGF1c2VzKENsYXVzZXMpOwpAQCAtMTIxMSwxMCArMTIzOCwzOSBAQAogfQogCiBPTVBQYXJhbGxlbERpcmVjdGl2ZSAqT01QUGFyYWxsZWxEaXJlY3RpdmU6OkNyZWF0ZUVtcHR5KGNvbnN0IEFTVENvbnRleHQgJkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5U2hlbGwpIHsKLSAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShzaXplb2YoT01QUGFyYWxsZWxEaXJlY3RpdmUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoT01QQ2xhdXNlICopICogTiArIHNpemVvZihTdG10ICopLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmFsaWduT2Y8T01QUGFyYWxsZWxEaXJlY3RpdmU+KCkpOwotICByZXR1cm4gbmV3IChNZW0pIE9NUFBhcmFsbGVsRGlyZWN0aXZlKE4pOworICB1bnNpZ25lZCBTaXplID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KHNpemVvZihPTVBQYXJhbGxlbERpcmVjdGl2ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6YWxpZ25PZjxPTVBDbGF1c2UgKj4oKSk7CisgIHZvaWQgKk1lbSA9IEMuQWxsb2NhdGUoU2l6ZSArIHNpemVvZihPTVBDbGF1c2UgKikgKiBOdW1DbGF1c2VzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU3RtdCAqKSk7CisgIHJldHVybiBuZXcgKE1lbSkgT01QUGFyYWxsZWxEaXJlY3RpdmUoTnVtQ2xhdXNlcyk7CiB9CisKK09NUFNpbWREaXJlY3RpdmUgKk9NUFNpbWREaXJlY3RpdmU6OkNyZWF0ZShjb25zdCBBU1RDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpBc3NvY2lhdGVkU3RtdCkgeworICB1bnNpZ25lZCBTaXplID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KHNpemVvZihPTVBTaW1kRGlyZWN0aXZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjphbGlnbk9mPE9NUENsYXVzZSAqPigpKTsKKyAgdm9pZCAqTWVtID0gQy5BbGxvY2F0ZShTaXplICsgc2l6ZW9mKE9NUENsYXVzZSAqKSAqIENsYXVzZXMuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU3RtdCAqKSk7CisgIE9NUFNpbWREaXJlY3RpdmUgKkRpciA9IG5ldyAoTWVtKSBPTVBTaW1kRGlyZWN0aXZlKFN0YXJ0TG9jLCBFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIENsYXVzZXMuc2l6ZSgpKTsKKyAgRGlyLT5zZXRDbGF1c2VzKENsYXVzZXMpOworICBEaXItPnNldEFzc29jaWF0ZWRTdG10KEFzc29jaWF0ZWRTdG10KTsKKyAgcmV0dXJuIERpcjsKK30KKworT01QU2ltZERpcmVjdGl2ZSAqT01QU2ltZERpcmVjdGl2ZTo6Q3JlYXRlRW1wdHkoY29uc3QgQVNUQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbXB0eVNoZWxsKSB7CisgIHVuc2lnbmVkIFNpemUgPSBsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoc2l6ZW9mKE9NUFNpbWREaXJlY3RpdmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmFsaWduT2Y8T01QQ2xhdXNlICo+KCkpOworICB2b2lkICpNZW0gPSBDLkFsbG9jYXRlKFNpemUgKyBzaXplb2YoT01QQ2xhdXNlICopICogTnVtQ2xhdXNlcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFN0bXQgKikpOworICByZXR1cm4gbmV3IChNZW0pIE9NUFNpbWREaXJlY3RpdmUoQ29sbGFwc2VkTnVtLCBOdW1DbGF1c2VzKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL0FTVC9TdG10UHJpbnRlci5jcHAgYi9saWIvQVNUL1N0bXRQcmludGVyLmNwcAppbmRleCAwZWNiNWI1Li43YWQ1NDkxIDEwMDY0NAotLS0gYS9saWIvQVNUL1N0bXRQcmludGVyLmNwcAorKysgYi9saWIvQVNUL1N0bXRQcmludGVyLmNwcApAQCAtNzAsNiArNzAsNyBAQAogICAgIHZvaWQgUHJpbnRDYWxsQXJncyhDYWxsRXhwciAqRSk7CiAgICAgdm9pZCBQcmludFJhd1NFSEV4Y2VwdEhhbmRsZXIoU0VIRXhjZXB0U3RtdCAqUyk7CiAgICAgdm9pZCBQcmludFJhd1NFSEZpbmFsbHlTdG10KFNFSEZpbmFsbHlTdG10ICpTKTsKKyAgICB2b2lkIFByaW50T01QRXhlY3V0YWJsZURpcmVjdGl2ZShPTVBFeGVjdXRhYmxlRGlyZWN0aXZlICpTKTsKIAogICAgIHZvaWQgUHJpbnRFeHByKEV4cHIgKkUpIHsKICAgICAgIGlmIChFKQpAQCAtODksNyArOTAsNyBAQAogICAgICAgICAgIHJldHVybjsKICAgICAgIGVsc2UgU3RtdFZpc2l0b3I8U3RtdFByaW50ZXI+OjpWaXNpdChTKTsKICAgICB9Ci0gICAgCisKICAgICB2b2lkIFZpc2l0U3RtdChTdG10ICpOb2RlKSBMTFZNX0FUVFJJQlVURV9VTlVTRUQgewogICAgICAgSW5kZW50KCkgPDwgIjw8dW5rbm93biBzdG10IHR5cGU+PlxuIjsKICAgICB9CkBAIC0xMTMsOSArMTE0LDggQEAKIC8vLyB3aXRoIG5vIG5ld2xpbmUgYWZ0ZXIgdGhlIH0uCiB2b2lkIFN0bXRQcmludGVyOjpQcmludFJhd0NvbXBvdW5kU3RtdChDb21wb3VuZFN0bXQgKk5vZGUpIHsKICAgT1MgPDwgIntcbiI7Ci0gIGZvciAoQ29tcG91bmRTdG10Ojpib2R5X2l0ZXJhdG9yIEkgPSBOb2RlLT5ib2R5X2JlZ2luKCksIEUgPSBOb2RlLT5ib2R5X2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKQotICAgIFByaW50U3RtdCgqSSk7CisgIGZvciAoYXV0byAqSSA6IE5vZGUtPmJvZHkoKSkKKyAgICBQcmludFN0bXQoSSk7CiAKICAgSW5kZW50KCkgPDwgIn0iOwogfQpAQCAtMTI1LDExICsxMjUsNyBAQAogfQogCiB2b2lkIFN0bXRQcmludGVyOjpQcmludFJhd0RlY2xTdG10KGNvbnN0IERlY2xTdG10ICpTKSB7Ci0gIERlY2xTdG10Ojpjb25zdF9kZWNsX2l0ZXJhdG9yIEJlZ2luID0gUy0+ZGVjbF9iZWdpbigpLCBFbmQgPSBTLT5kZWNsX2VuZCgpOwotICBTbWFsbFZlY3RvcjxEZWNsKiwgMj4gRGVjbHM7Ci0gIGZvciAoIDsgQmVnaW4gIT0gRW5kOyArK0JlZ2luKQotICAgIERlY2xzLnB1c2hfYmFjaygqQmVnaW4pOwotCisgIFNtYWxsVmVjdG9yPERlY2wqLCAyPiBEZWNscyhTLT5kZWNscygpKTsKICAgRGVjbDo6cHJpbnRHcm91cChEZWNscy5kYXRhKCksIERlY2xzLnNpemUoKSwgT1MsIFBvbGljeSwgSW5kZW50TGV2ZWwpOwogfQogCkBAIC0zMzAsNyArMzI2LDggQEAKICAgUHJpbnRFeHByKE5vZGUtPmdldFJhbmdlSW5pdCgpKTsKICAgT1MgPDwgIikge1xuIjsKICAgUHJpbnRTdG10KE5vZGUtPmdldEJvZHkoKSk7Ci0gIEluZGVudCgpIDw8ICJ9XG4iOworICBJbmRlbnQoKSA8PCAifSI7CisgIGlmIChQb2xpY3kuSW5jbHVkZU5ld2xpbmVzKSBPUyA8PCAiXG4iOwogfQogCiB2b2lkIFN0bXRQcmludGVyOjpWaXNpdE1TRGVwZW5kZW50RXhpc3RzU3RtdChNU0RlcGVuZGVudEV4aXN0c1N0bXQgKk5vZGUpIHsKQEAgLTM1MCwyMSArMzQ3LDI1IEBACiB9CiAKIHZvaWQgU3RtdFByaW50ZXI6OlZpc2l0R290b1N0bXQoR290b1N0bXQgKk5vZGUpIHsKLSAgSW5kZW50KCkgPDwgImdvdG8gIiA8PCBOb2RlLT5nZXRMYWJlbCgpLT5nZXROYW1lKCkgPDwgIjtcbiI7CisgIEluZGVudCgpIDw8ICJnb3RvICIgPDwgTm9kZS0+Z2V0TGFiZWwoKS0+Z2V0TmFtZSgpIDw8ICI7IjsKKyAgaWYgKFBvbGljeS5JbmNsdWRlTmV3bGluZXMpIE9TIDw8ICJcbiI7CiB9CiAKIHZvaWQgU3RtdFByaW50ZXI6OlZpc2l0SW5kaXJlY3RHb3RvU3RtdChJbmRpcmVjdEdvdG9TdG10ICpOb2RlKSB7CiAgIEluZGVudCgpIDw8ICJnb3RvICoiOwogICBQcmludEV4cHIoTm9kZS0+Z2V0VGFyZ2V0KCkpOwotICBPUyA8PCAiO1xuIjsKKyAgT1MgPDwgIjsiOworICBpZiAoUG9saWN5LkluY2x1ZGVOZXdsaW5lcykgT1MgPDwgIlxuIjsKIH0KIAogdm9pZCBTdG10UHJpbnRlcjo6VmlzaXRDb250aW51ZVN0bXQoQ29udGludWVTdG10ICpOb2RlKSB7Ci0gIEluZGVudCgpIDw8ICJjb250aW51ZTtcbiI7CisgIEluZGVudCgpIDw8ICJjb250aW51ZTsiOworICBpZiAoUG9saWN5LkluY2x1ZGVOZXdsaW5lcykgT1MgPDwgIlxuIjsKIH0KIAogdm9pZCBTdG10UHJpbnRlcjo6VmlzaXRCcmVha1N0bXQoQnJlYWtTdG10ICpOb2RlKSB7Ci0gIEluZGVudCgpIDw8ICJicmVhaztcbiI7CisgIEluZGVudCgpIDw8ICJicmVhazsiOworICBpZiAoUG9saWN5LkluY2x1ZGVOZXdsaW5lcykgT1MgPDwgIlxuIjsKIH0KIAogCkBAIC0zNzQsNyArMzc1LDggQEAKICAgICBPUyA8PCAiICI7CiAgICAgUHJpbnRFeHByKE5vZGUtPmdldFJldFZhbHVlKCkpOwogICB9Ci0gIE9TIDw8ICI7XG4iOworICBPUyA8PCAiOyI7CisgIGlmIChQb2xpY3kuSW5jbHVkZU5ld2xpbmVzKSBPUyA8PCAiXG4iOwogfQogCiAKQEAgLTQzNyw3ICs0MzksOCBAQAogICAgIFZpc2l0U3RyaW5nTGl0ZXJhbChOb2RlLT5nZXRDbG9iYmVyU3RyaW5nTGl0ZXJhbChpKSk7CiAgIH0KIAotICBPUyA8PCAiKTtcbiI7CisgIE9TIDw8ICIpOyI7CisgIGlmIChQb2xpY3kuSW5jbHVkZU5ld2xpbmVzKSBPUyA8PCAiXG4iOwogfQogCiB2b2lkIFN0bXRQcmludGVyOjpWaXNpdE1TQXNtU3RtdChNU0FzbVN0bXQgKk5vZGUpIHsKQEAgLTU4NiwxNiArNTg5LDM2IEBACiBuYW1lc3BhY2UgewogY2xhc3MgT01QQ2xhdXNlUHJpbnRlciA6IHB1YmxpYyBPTVBDbGF1c2VWaXNpdG9yPE9NUENsYXVzZVByaW50ZXI+IHsKICAgcmF3X29zdHJlYW0gJk9TOworICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5OwogICAvLy8gXGJyaWVmIFByb2Nlc3MgY2xhdXNlcyB3aXRoIGxpc3Qgb2YgdmFyaWFibGVzLgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgdm9pZCBWaXNpdE9NUENsYXVzZUxpc3QoVCAqTm9kZSwgY2hhciBTdGFydFN5bSk7CiBwdWJsaWM6Ci0gIE9NUENsYXVzZVByaW50ZXIocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7IH0KKyAgT01QQ2xhdXNlUHJpbnRlcihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpCisgICAgOiBPUyhPUyksIFBvbGljeShQb2xpY3kpIHsgfQogI2RlZmluZSBPUEVOTVBfQ0xBVVNFKE5hbWUsIENsYXNzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgdm9pZCBWaXNpdCMjQ2xhc3MoQ2xhc3MgKlMpOwogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKIH07CiAKK3ZvaWQgT01QQ2xhdXNlUHJpbnRlcjo6VmlzaXRPTVBJZkNsYXVzZShPTVBJZkNsYXVzZSAqTm9kZSkgeworICBPUyA8PCAiaWYoIjsKKyAgTm9kZS0+Z2V0Q29uZGl0aW9uKCktPnByaW50UHJldHR5KE9TLCAwLCBQb2xpY3ksIDApOworICBPUyA8PCAiKSI7Cit9CisKK3ZvaWQgT01QQ2xhdXNlUHJpbnRlcjo6VmlzaXRPTVBOdW1UaHJlYWRzQ2xhdXNlKE9NUE51bVRocmVhZHNDbGF1c2UgKk5vZGUpIHsKKyAgT1MgPDwgIm51bV90aHJlYWRzKCI7CisgIE5vZGUtPmdldE51bVRocmVhZHMoKS0+cHJpbnRQcmV0dHkoT1MsIDAsIFBvbGljeSwgMCk7CisgIE9TIDw8ICIpIjsKK30KKwordm9pZCBPTVBDbGF1c2VQcmludGVyOjpWaXNpdE9NUFNhZmVsZW5DbGF1c2UoT01QU2FmZWxlbkNsYXVzZSAqTm9kZSkgeworICBPUyA8PCAic2FmZWxlbigiOworICBOb2RlLT5nZXRTYWZlbGVuKCktPnByaW50UHJldHR5KE9TLCAwLCBQb2xpY3ksIDApOworICBPUyA8PCAiKSI7Cit9CisKIHZvaWQgT01QQ2xhdXNlUHJpbnRlcjo6VmlzaXRPTVBEZWZhdWx0Q2xhdXNlKE9NUERlZmF1bHRDbGF1c2UgKk5vZGUpIHsKICAgT1MgPDwgImRlZmF1bHQoIgogICAgICA8PCBnZXRPcGVuTVBTaW1wbGVDbGF1c2VUeXBlTmFtZShPTVBDX2RlZmF1bHQsIE5vZGUtPmdldERlZmF1bHRLaW5kKCkpCkBAIC02MDYsOSArNjI5LDE1IEBACiB2b2lkIE9NUENsYXVzZVByaW50ZXI6OlZpc2l0T01QQ2xhdXNlTGlzdChUICpOb2RlLCBjaGFyIFN0YXJ0U3ltKSB7CiAgIGZvciAodHlwZW5hbWUgVDo6dmFybGlzdF9pdGVyYXRvciBJID0gTm9kZS0+dmFybGlzdF9iZWdpbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IE5vZGUtPnZhcmxpc3RfZW5kKCk7Ci0gICAgICAgICBJICE9IEU7ICsrSSkKLSAgICBPUyA8PCAoSSA9PSBOb2RlLT52YXJsaXN0X2JlZ2luKCkgPyBTdGFydFN5bSA6ICcsJykKLSAgICAgICA8PCAqY2FzdDxOYW1lZERlY2w+KGNhc3Q8RGVjbFJlZkV4cHI+KCpJKS0+Z2V0RGVjbCgpKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKERlY2xSZWZFeHByICpEUkUgPSBkeW5fY2FzdDxEZWNsUmVmRXhwcj4oKkkpKSB7CisgICAgICBPUyA8PCAoSSA9PSBOb2RlLT52YXJsaXN0X2JlZ2luKCkgPyBTdGFydFN5bSA6ICcsJyk7CisgICAgICBjYXN0PE5hbWVkRGVjbD4oRFJFLT5nZXREZWNsKCkpLT5wcmludFF1YWxpZmllZE5hbWUoT1MpOworICAgIH0gZWxzZSB7CisgICAgICBPUyA8PCAoSSA9PSBOb2RlLT52YXJsaXN0X2JlZ2luKCkgPyBTdGFydFN5bSA6ICcsJyk7CisgICAgICAoKkkpLT5wcmludFByZXR0eShPUywgMCwgUG9saWN5LCAwKTsKKyAgICB9CisgIH0KIH0KIAogdm9pZCBPTVBDbGF1c2VQcmludGVyOjpWaXNpdE9NUFByaXZhdGVDbGF1c2UoT01QUHJpdmF0ZUNsYXVzZSAqTm9kZSkgewpAQCAtNjM1LDE3ICs2NjQsMjMgQEAKICAgfQogfQogCit2b2lkIE9NUENsYXVzZVByaW50ZXI6OlZpc2l0T01QQ29weWluQ2xhdXNlKE9NUENvcHlpbkNsYXVzZSAqTm9kZSkgeworICBpZiAoIU5vZGUtPnZhcmxpc3RfZW1wdHkoKSkgeworICAgIE9TIDw8ICJjb3B5aW4iOworICAgIFZpc2l0T01QQ2xhdXNlTGlzdChOb2RlLCAnKCcpOworICAgIE9TIDw8ICIpIjsKKyAgfQorfQorCiB9CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAvLyAgT3Blbk1QIGRpcmVjdGl2ZXMgcHJpbnRpbmcgbWV0aG9kcwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAotdm9pZCBTdG10UHJpbnRlcjo6VmlzaXRPTVBQYXJhbGxlbERpcmVjdGl2ZShPTVBQYXJhbGxlbERpcmVjdGl2ZSAqTm9kZSkgewotICBJbmRlbnQoKSA8PCAiI3ByYWdtYSBvbXAgcGFyYWxsZWwgIjsKLQotICBPTVBDbGF1c2VQcmludGVyIFByaW50ZXIoT1MpOwotICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcyA9IE5vZGUtPmNsYXVzZXMoKTsKK3ZvaWQgU3RtdFByaW50ZXI6OlByaW50T01QRXhlY3V0YWJsZURpcmVjdGl2ZShPTVBFeGVjdXRhYmxlRGlyZWN0aXZlICpTKSB7CisgIE9NUENsYXVzZVByaW50ZXIgUHJpbnRlcihPUywgUG9saWN5KTsKKyAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMgPSBTLT5jbGF1c2VzKCk7CiAgIGZvciAoQXJyYXlSZWY8T01QQ2xhdXNlICo+OjppdGVyYXRvciBJID0gQ2xhdXNlcy5iZWdpbigpLCBFID0gQ2xhdXNlcy5lbmQoKTsKICAgICAgICBJICE9IEU7ICsrSSkKICAgICBpZiAoKkkgJiYgISgqSSktPmlzSW1wbGljaXQoKSkgewpAQCAtNjUzLDEzICs2ODgsMjQgQEAKICAgICAgIE9TIDw8ICcgJzsKICAgICB9CiAgIE9TIDw8ICJcbiI7Ci0gIGlmIChOb2RlLT5nZXRBc3NvY2lhdGVkU3RtdCgpKSB7Ci0gICAgYXNzZXJ0KGlzYTxDYXB0dXJlZFN0bXQ+KE5vZGUtPmdldEFzc29jaWF0ZWRTdG10KCkpICYmCisgIGlmIChTLT5nZXRBc3NvY2lhdGVkU3RtdCgpKSB7CisgICAgYXNzZXJ0KGlzYTxDYXB0dXJlZFN0bXQ+KFMtPmdldEFzc29jaWF0ZWRTdG10KCkpICYmCiAgICAgICAgICAgICJFeHBlY3RlZCBjYXB0dXJlZCBzdGF0ZW1lbnQhIik7Ci0gICAgU3RtdCAqQ1MgPSBjYXN0PENhcHR1cmVkU3RtdD4oTm9kZS0+Z2V0QXNzb2NpYXRlZFN0bXQoKSktPmdldENhcHR1cmVkU3RtdCgpOworICAgIFN0bXQgKkNTID0gY2FzdDxDYXB0dXJlZFN0bXQ+KFMtPmdldEFzc29jaWF0ZWRTdG10KCkpLT5nZXRDYXB0dXJlZFN0bXQoKTsKICAgICBQcmludFN0bXQoQ1MpOwogICB9CiB9CisKK3ZvaWQgU3RtdFByaW50ZXI6OlZpc2l0T01QUGFyYWxsZWxEaXJlY3RpdmUoT01QUGFyYWxsZWxEaXJlY3RpdmUgKk5vZGUpIHsKKyAgSW5kZW50KCkgPDwgIiNwcmFnbWEgb21wIHBhcmFsbGVsICI7CisgIFByaW50T01QRXhlY3V0YWJsZURpcmVjdGl2ZShOb2RlKTsKK30KKwordm9pZCBTdG10UHJpbnRlcjo6VmlzaXRPTVBTaW1kRGlyZWN0aXZlKE9NUFNpbWREaXJlY3RpdmUgKk5vZGUpIHsKKyAgSW5kZW50KCkgPDwgIiNwcmFnbWEgb21wIHNpbWQgIjsKKyAgUHJpbnRPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKE5vZGUpOworfQorCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogLy8gIEV4cHIgcHJpbnRpbmcgbWV0aG9kcy4KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCkBAIC03MDksMTMgKzc1NSwxNSBAQAogdm9pZCBTdG10UHJpbnRlcjo6VmlzaXRPYmpDUHJvcGVydHlSZWZFeHByKE9iakNQcm9wZXJ0eVJlZkV4cHIgKk5vZGUpIHsKICAgaWYgKE5vZGUtPmlzU3VwZXJSZWNlaXZlcigpKQogICAgIE9TIDw8ICJzdXBlci4iOwotICBlbHNlIGlmIChOb2RlLT5nZXRCYXNlKCkpIHsKKyAgZWxzZSBpZiAoTm9kZS0+aXNPYmplY3RSZWNlaXZlcigpICYmIE5vZGUtPmdldEJhc2UoKSkgewogICAgIFByaW50RXhwcihOb2RlLT5nZXRCYXNlKCkpOwogICAgIE9TIDw8ICIuIjsKKyAgfSBlbHNlIGlmIChOb2RlLT5pc0NsYXNzUmVjZWl2ZXIoKSAmJiBOb2RlLT5nZXRDbGFzc1JlY2VpdmVyKCkpIHsKKyAgICBPUyA8PCBOb2RlLT5nZXRDbGFzc1JlY2VpdmVyKCktPmdldE5hbWUoKSA8PCAiLiI7CiAgIH0KIAogICBpZiAoTm9kZS0+aXNJbXBsaWNpdFByb3BlcnR5KCkpCi0gICAgT1MgPDwgTm9kZS0+Z2V0SW1wbGljaXRQcm9wZXJ0eUdldHRlcigpLT5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCk7CisgICAgTm9kZS0+Z2V0SW1wbGljaXRQcm9wZXJ0eUdldHRlcigpLT5nZXRTZWxlY3RvcigpLnByaW50KE9TKTsKICAgZWxzZQogICAgIE9TIDw8IE5vZGUtPmdldEV4cGxpY2l0UHJvcGVydHkoKS0+Z2V0TmFtZSgpOwogfQpAQCAtMTA0MSw3ICsxMDg5LDcgQEAKICAgUHJpbnRFeHByKE5vZGUtPmdldEluaXRpYWxpemVyKCkpOwogfQogdm9pZCBTdG10UHJpbnRlcjo6VmlzaXRJbXBsaWNpdENhc3RFeHByKEltcGxpY2l0Q2FzdEV4cHIgKk5vZGUpIHsKLSAgLy8gTm8gbmVlZCB0byBwcmludCBhbnl0aGluZywgc2ltcGx5IGZvcndhcmQgdG8gdGhlIHN1YiBleHByZXNzaW9uLgorICAvLyBObyBuZWVkIHRvIHByaW50IGFueXRoaW5nLCBzaW1wbHkgZm9yd2FyZCB0byB0aGUgc3ViZXhwcmVzc2lvbi4KICAgUHJpbnRFeHByKE5vZGUtPmdldFN1YkV4cHIoKSk7CiB9CiB2b2lkIFN0bXRQcmludGVyOjpWaXNpdEJpbmFyeU9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yICpOb2RlKSB7CkBAIC0xMjc5LDYgKzEzMjcsMTIgQEAKIH0KIAogdm9pZCBTdG10UHJpbnRlcjo6VmlzaXRDWFhNZW1iZXJDYWxsRXhwcihDWFhNZW1iZXJDYWxsRXhwciAqTm9kZSkgeworICAvLyBJZiB3ZSBoYXZlIGEgY29udmVyc2lvbiBvcGVyYXRvciBjYWxsIG9ubHkgcHJpbnQgdGhlIGFyZ3VtZW50LgorICBDWFhNZXRob2REZWNsICpNRCA9IE5vZGUtPmdldE1ldGhvZERlY2woKTsKKyAgaWYgKE1EICYmIGlzYTxDWFhDb252ZXJzaW9uRGVjbD4oTUQpKSB7CisgICAgUHJpbnRFeHByKE5vZGUtPmdldEltcGxpY2l0T2JqZWN0QXJndW1lbnQoKSk7CisgICAgcmV0dXJuOworICB9CiAgIFZpc2l0Q2FsbEV4cHIoY2FzdDxDYWxsRXhwcj4oTm9kZSkpOwogfQogCkBAIC0xNDkwLDE2ICsxNTQ0LDE0IEBACiAgICAgT1MgPDwgIiAoIjsKICAgICBDWFhNZXRob2REZWNsICpNZXRob2QgPSBOb2RlLT5nZXRDYWxsT3BlcmF0b3IoKTsKICAgICBOZWVkQ29tbWEgPSBmYWxzZTsKLSAgICBmb3IgKENYWE1ldGhvZERlY2w6OnBhcmFtX2l0ZXJhdG9yIFAgPSBNZXRob2QtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRW5kID0gTWV0aG9kLT5wYXJhbV9lbmQoKTsKLSAgICAgICAgIFAgIT0gUEVuZDsgKytQKSB7CisgICAgZm9yIChhdXRvIFAgOiBNZXRob2QtPnBhcmFtcygpKSB7CiAgICAgICBpZiAoTmVlZENvbW1hKSB7CiAgICAgICAgIE9TIDw8ICIsICI7CiAgICAgICB9IGVsc2UgewogICAgICAgICBOZWVkQ29tbWEgPSB0cnVlOwogICAgICAgfQotICAgICAgc3RkOjpzdHJpbmcgUGFyYW1TdHIgPSAoKlApLT5nZXROYW1lQXNTdHJpbmcoKTsKLSAgICAgICgqUCktPmdldE9yaWdpbmFsVHlwZSgpLnByaW50KE9TLCBQb2xpY3ksIFBhcmFtU3RyKTsKKyAgICAgIHN0ZDo6c3RyaW5nIFBhcmFtU3RyID0gUC0+Z2V0TmFtZUFzU3RyaW5nKCk7CisgICAgICBQLT5nZXRPcmlnaW5hbFR5cGUoKS5wcmludChPUywgUG9saWN5LCBQYXJhbVN0cik7CiAgICAgfQogICAgIGlmIChNZXRob2QtPmlzVmFyaWFkaWMoKSkgewogICAgICAgaWYgKE5lZWRDb21tYSkKQEAgLTE1MjAsNyArMTU3Miw3IEBACiAgICAgLy8gUHJpbnQgdGhlIHRyYWlsaW5nIHJldHVybiB0eXBlIGlmIGl0IHdhcyBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZS4KICAgICBpZiAoTm9kZS0+aGFzRXhwbGljaXRSZXN1bHRUeXBlKCkpIHsKICAgICAgIE9TIDw8ICIgLT4gIjsKLSAgICAgIFByb3RvLT5nZXRSZXN1bHRUeXBlKCkucHJpbnQoT1MsIFBvbGljeSk7CisgICAgICBQcm90by0+Z2V0UmV0dXJuVHlwZSgpLnByaW50KE9TLCBQb2xpY3kpOwogICAgIH0KICAgfQogCkBAIC0xNjI1LDcgKzE2NzcsNyBAQAogfQogCiB2b2lkIFN0bXRQcmludGVyOjpWaXNpdEV4cHJXaXRoQ2xlYW51cHMoRXhwcldpdGhDbGVhbnVwcyAqRSkgewotICAvLyBKdXN0IGZvcndhcmQgdG8gdGhlIHN1YiBleHByZXNzaW9uLgorICAvLyBKdXN0IGZvcndhcmQgdG8gdGhlIHN1YmV4cHJlc3Npb24uCiAgIFByaW50RXhwcihFLT5nZXRTdWJFeHByKCkpOwogfQogCkBAIC0xNjc1LDc0ICsxNzI3LDE1IEBACiAgICAgICAgIE9TLCBOb2RlLT5nZXRUZW1wbGF0ZUFyZ3MoKSwgTm9kZS0+Z2V0TnVtVGVtcGxhdGVBcmdzKCksIFBvbGljeSk7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICpnZXRUeXBlVHJhaXROYW1lKFVuYXJ5VHlwZVRyYWl0IFVUVCkgewotICBzd2l0Y2ggKFVUVCkgewotICBjYXNlIFVUVF9IYXNOb3Rocm93QXNzaWduOiAgICAgIHJldHVybiAiX19oYXNfbm90aHJvd19hc3NpZ24iOwotICBjYXNlIFVUVF9IYXNOb3Rocm93TW92ZUFzc2lnbjogIHJldHVybiAiX19oYXNfbm90aHJvd19tb3ZlX2Fzc2lnbiI7Ci0gIGNhc2UgVVRUX0hhc05vdGhyb3dDb25zdHJ1Y3RvcjogcmV0dXJuICJfX2hhc19ub3Rocm93X2NvbnN0cnVjdG9yIjsKLSAgY2FzZSBVVFRfSGFzTm90aHJvd0NvcHk6ICAgICAgICAgIHJldHVybiAiX19oYXNfbm90aHJvd19jb3B5IjsKLSAgY2FzZSBVVFRfSGFzVHJpdmlhbEFzc2lnbjogICAgICByZXR1cm4gIl9faGFzX3RyaXZpYWxfYXNzaWduIjsKLSAgY2FzZSBVVFRfSGFzVHJpdmlhbE1vdmVBc3NpZ246ICAgICAgcmV0dXJuICJfX2hhc190cml2aWFsX21vdmVfYXNzaWduIjsKLSAgY2FzZSBVVFRfSGFzVHJpdmlhbE1vdmVDb25zdHJ1Y3RvcjogcmV0dXJuICJfX2hhc190cml2aWFsX21vdmVfY29uc3RydWN0b3IiOwotICBjYXNlIFVUVF9IYXNUcml2aWFsRGVmYXVsdENvbnN0cnVjdG9yOiByZXR1cm4gIl9faGFzX3RyaXZpYWxfY29uc3RydWN0b3IiOwotICBjYXNlIFVUVF9IYXNUcml2aWFsQ29weTogICAgICAgICAgcmV0dXJuICJfX2hhc190cml2aWFsX2NvcHkiOwotICBjYXNlIFVUVF9IYXNUcml2aWFsRGVzdHJ1Y3RvcjogIHJldHVybiAiX19oYXNfdHJpdmlhbF9kZXN0cnVjdG9yIjsKLSAgY2FzZSBVVFRfSGFzVmlydHVhbERlc3RydWN0b3I6ICByZXR1cm4gIl9faGFzX3ZpcnR1YWxfZGVzdHJ1Y3RvciI7Ci0gIGNhc2UgVVRUX0lzQWJzdHJhY3Q6ICAgICAgICAgICAgcmV0dXJuICJfX2lzX2Fic3RyYWN0IjsKLSAgY2FzZSBVVFRfSXNBcml0aG1ldGljOiAgICAgICAgICAgIHJldHVybiAiX19pc19hcml0aG1ldGljIjsKLSAgY2FzZSBVVFRfSXNBcnJheTogICAgICAgICAgICAgICAgIHJldHVybiAiX19pc19hcnJheSI7Ci0gIGNhc2UgVVRUX0lzQ2xhc3M6ICAgICAgICAgICAgICAgcmV0dXJuICJfX2lzX2NsYXNzIjsKLSAgY2FzZSBVVFRfSXNDb21wbGV0ZVR5cGU6ICAgICAgICAgIHJldHVybiAiX19pc19jb21wbGV0ZV90eXBlIjsKLSAgY2FzZSBVVFRfSXNDb21wb3VuZDogICAgICAgICAgICAgIHJldHVybiAiX19pc19jb21wb3VuZCI7Ci0gIGNhc2UgVVRUX0lzQ29uc3Q6ICAgICAgICAgICAgICAgICByZXR1cm4gIl9faXNfY29uc3QiOwotICBjYXNlIFVUVF9Jc0VtcHR5OiAgICAgICAgICAgICAgIHJldHVybiAiX19pc19lbXB0eSI7Ci0gIGNhc2UgVVRUX0lzRW51bTogICAgICAgICAgICAgICAgcmV0dXJuICJfX2lzX2VudW0iOwotICBjYXNlIFVUVF9Jc0ZpbmFsOiAgICAgICAgICAgICAgICAgcmV0dXJuICJfX2lzX2ZpbmFsIjsKLSAgY2FzZSBVVFRfSXNGbG9hdGluZ1BvaW50OiAgICAgICAgIHJldHVybiAiX19pc19mbG9hdGluZ19wb2ludCI7Ci0gIGNhc2UgVVRUX0lzRnVuY3Rpb246ICAgICAgICAgICAgICByZXR1cm4gIl9faXNfZnVuY3Rpb24iOwotICBjYXNlIFVUVF9Jc0Z1bmRhbWVudGFsOiAgICAgICAgICAgcmV0dXJuICJfX2lzX2Z1bmRhbWVudGFsIjsKLSAgY2FzZSBVVFRfSXNJbnRlZ3JhbDogICAgICAgICAgICAgIHJldHVybiAiX19pc19pbnRlZ3JhbCI7Ci0gIGNhc2UgVVRUX0lzSW50ZXJmYWNlQ2xhc3M6ICAgICAgICByZXR1cm4gIl9faXNfaW50ZXJmYWNlX2NsYXNzIjsKLSAgY2FzZSBVVFRfSXNMaXRlcmFsOiAgICAgICAgICAgICAgIHJldHVybiAiX19pc19saXRlcmFsIjsKLSAgY2FzZSBVVFRfSXNMdmFsdWVSZWZlcmVuY2U6ICAgICAgIHJldHVybiAiX19pc19sdmFsdWVfcmVmZXJlbmNlIjsKLSAgY2FzZSBVVFRfSXNNZW1iZXJGdW5jdGlvblBvaW50ZXI6IHJldHVybiAiX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlciI7Ci0gIGNhc2UgVVRUX0lzTWVtYmVyT2JqZWN0UG9pbnRlcjogICByZXR1cm4gIl9faXNfbWVtYmVyX29iamVjdF9wb2ludGVyIjsKLSAgY2FzZSBVVFRfSXNNZW1iZXJQb2ludGVyOiAgICAgICAgIHJldHVybiAiX19pc19tZW1iZXJfcG9pbnRlciI7Ci0gIGNhc2UgVVRUX0lzT2JqZWN0OiAgICAgICAgICAgICAgICByZXR1cm4gIl9faXNfb2JqZWN0IjsKLSAgY2FzZSBVVFRfSXNQT0Q6ICAgICAgICAgICAgICAgICByZXR1cm4gIl9faXNfcG9kIjsKLSAgY2FzZSBVVFRfSXNQb2ludGVyOiAgICAgICAgICAgICAgIHJldHVybiAiX19pc19wb2ludGVyIjsKLSAgY2FzZSBVVFRfSXNQb2x5bW9ycGhpYzogICAgICAgICByZXR1cm4gIl9faXNfcG9seW1vcnBoaWMiOwotICBjYXNlIFVUVF9Jc1JlZmVyZW5jZTogICAgICAgICAgICAgcmV0dXJuICJfX2lzX3JlZmVyZW5jZSI7Ci0gIGNhc2UgVVRUX0lzUnZhbHVlUmVmZXJlbmNlOiAgICAgICByZXR1cm4gIl9faXNfcnZhbHVlX3JlZmVyZW5jZSI7Ci0gIGNhc2UgVVRUX0lzU2NhbGFyOiAgICAgICAgICAgICAgICByZXR1cm4gIl9faXNfc2NhbGFyIjsKLSAgY2FzZSBVVFRfSXNTZWFsZWQ6ICAgICAgICAgICAgICAgIHJldHVybiAiX19pc19zZWFsZWQiOwotICBjYXNlIFVUVF9Jc1NpZ25lZDogICAgICAgICAgICAgICAgcmV0dXJuICJfX2lzX3NpZ25lZCI7Ci0gIGNhc2UgVVRUX0lzU3RhbmRhcmRMYXlvdXQ6ICAgICAgICByZXR1cm4gIl9faXNfc3RhbmRhcmRfbGF5b3V0IjsKLSAgY2FzZSBVVFRfSXNUcml2aWFsOiAgICAgICAgICAgICAgIHJldHVybiAiX19pc190cml2aWFsIjsKLSAgY2FzZSBVVFRfSXNUcml2aWFsbHlDb3B5YWJsZTogICAgIHJldHVybiAiX19pc190cml2aWFsbHlfY29weWFibGUiOwotICBjYXNlIFVUVF9Jc1VuaW9uOiAgICAgICAgICAgICAgIHJldHVybiAiX19pc191bmlvbiI7Ci0gIGNhc2UgVVRUX0lzVW5zaWduZWQ6ICAgICAgICAgICAgICByZXR1cm4gIl9faXNfdW5zaWduZWQiOwotICBjYXNlIFVUVF9Jc1ZvaWQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuICJfX2lzX3ZvaWQiOwotICBjYXNlIFVUVF9Jc1ZvbGF0aWxlOiAgICAgICAgICAgICAgcmV0dXJuICJfX2lzX3ZvbGF0aWxlIjsKLSAgfQotICBsbHZtX3VucmVhY2hhYmxlKCJUeXBlIHRyYWl0IG5vdCBjb3ZlcmVkIGJ5IHN3aXRjaCBzdGF0ZW1lbnQiKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmdldFR5cGVUcmFpdE5hbWUoQmluYXJ5VHlwZVRyYWl0IEJUVCkgewotICBzd2l0Y2ggKEJUVCkgewotICBjYXNlIEJUVF9Jc0Jhc2VPZjogICAgICAgICAgICAgIHJldHVybiAiX19pc19iYXNlX29mIjsKLSAgY2FzZSBCVFRfSXNDb252ZXJ0aWJsZTogICAgICAgICByZXR1cm4gIl9faXNfY29udmVydGlibGUiOwotICBjYXNlIEJUVF9Jc1NhbWU6ICAgICAgICAgICAgICAgIHJldHVybiAiX19pc19zYW1lIjsKLSAgY2FzZSBCVFRfVHlwZUNvbXBhdGlibGU6ICAgICAgICByZXR1cm4gIl9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AiOwotICBjYXNlIEJUVF9Jc0NvbnZlcnRpYmxlVG86ICAgICAgIHJldHVybiAiX19pc19jb252ZXJ0aWJsZV90byI7Ci0gIGNhc2UgQlRUX0lzVHJpdmlhbGx5QXNzaWduYWJsZTogcmV0dXJuICJfX2lzX3RyaXZpYWxseV9hc3NpZ25hYmxlIjsKLSAgfQotICBsbHZtX3VucmVhY2hhYmxlKCJCaW5hcnkgdHlwZSB0cmFpdCBub3QgY292ZXJlZCBieSBzd2l0Y2giKTsKLX0KLQogc3RhdGljIGNvbnN0IGNoYXIgKmdldFR5cGVUcmFpdE5hbWUoVHlwZVRyYWl0IFRUKSB7CiAgIHN3aXRjaCAoVFQpIHsKLSAgY2FzZSBjbGFuZzo6VFRfSXNUcml2aWFsbHlDb25zdHJ1Y3RpYmxlOnJldHVybiAiX19pc190cml2aWFsbHlfY29uc3RydWN0aWJsZSI7CisjZGVmaW5lIFRZUEVfVFJBSVRfMShTcGVsbGluZywgTmFtZSwgS2V5KSBcCitjYXNlIGNsYW5nOjpVVFRfIyNOYW1lOiByZXR1cm4gI1NwZWxsaW5nOworI2RlZmluZSBUWVBFX1RSQUlUXzIoU3BlbGxpbmcsIE5hbWUsIEtleSkgXAorY2FzZSBjbGFuZzo6QlRUXyMjTmFtZTogcmV0dXJuICNTcGVsbGluZzsKKyNkZWZpbmUgVFlQRV9UUkFJVF9OKFNwZWxsaW5nLCBOYW1lLCBLZXkpIFwKKyAgY2FzZSBjbGFuZzo6VFRfIyNOYW1lOiByZXR1cm4gI1NwZWxsaW5nOworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Rva2VuS2luZHMuZGVmIgogICB9CiAgIGxsdm1fdW5yZWFjaGFibGUoIlR5cGUgdHJhaXQgbm90IGNvdmVyZWQgYnkgc3dpdGNoIik7CiB9CkBAIC0xNzYzLDIwICsxNzU2LDYgQEAKICAgbGx2bV91bnJlYWNoYWJsZSgiRXhwcmVzc2lvbiB0eXBlIHRyYWl0IG5vdCBjb3ZlcmVkIGJ5IHN3aXRjaCIpOwogfQogCi12b2lkIFN0bXRQcmludGVyOjpWaXNpdFVuYXJ5VHlwZVRyYWl0RXhwcihVbmFyeVR5cGVUcmFpdEV4cHIgKkUpIHsKLSAgT1MgPDwgZ2V0VHlwZVRyYWl0TmFtZShFLT5nZXRUcmFpdCgpKSA8PCAnKCc7Ci0gIEUtPmdldFF1ZXJpZWRUeXBlKCkucHJpbnQoT1MsIFBvbGljeSk7Ci0gIE9TIDw8ICcpJzsKLX0KLQotdm9pZCBTdG10UHJpbnRlcjo6VmlzaXRCaW5hcnlUeXBlVHJhaXRFeHByKEJpbmFyeVR5cGVUcmFpdEV4cHIgKkUpIHsKLSAgT1MgPDwgZ2V0VHlwZVRyYWl0TmFtZShFLT5nZXRUcmFpdCgpKSA8PCAnKCc7Ci0gIEUtPmdldExoc1R5cGUoKS5wcmludChPUywgUG9saWN5KTsKLSAgT1MgPDwgJywnOwotICBFLT5nZXRSaHNUeXBlKCkucHJpbnQoT1MsIFBvbGljeSk7Ci0gIE9TIDw8ICcpJzsKLX0KLQogdm9pZCBTdG10UHJpbnRlcjo6VmlzaXRUeXBlVHJhaXRFeHByKFR5cGVUcmFpdEV4cHIgKkUpIHsKICAgT1MgPDwgZ2V0VHlwZVRyYWl0TmFtZShFLT5nZXRUcmFpdCgpKSA8PCAiKCI7CiAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBFLT5nZXROdW1BcmdzKCk7IEkgIT0gTjsgKytJKSB7CkBAIC0xODgxLDcgKzE4NjAsOSBAQAogfQogCiB2b2lkIFN0bXRQcmludGVyOjpWaXNpdE9iakNTZWxlY3RvckV4cHIoT2JqQ1NlbGVjdG9yRXhwciAqTm9kZSkgewotICBPUyA8PCAiQHNlbGVjdG9yKCIgPDwgTm9kZS0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpIDw8ICcpJzsKKyAgT1MgPDwgIkBzZWxlY3RvcigiOworICBOb2RlLT5nZXRTZWxlY3RvcigpLnByaW50KE9TKTsKKyAgT1MgPDwgJyknOwogfQogCiB2b2lkIFN0bXRQcmludGVyOjpWaXNpdE9iakNQcm90b2NvbEV4cHIoT2JqQ1Byb3RvY29sRXhwciAqTm9kZSkgewpkaWZmIC0tZ2l0IGEvbGliL0FTVC9TdG10UHJvZmlsZS5jcHAgYi9saWIvQVNUL1N0bXRQcm9maWxlLmNwcAppbmRleCA2ODA1ZTYyLi4wN2VkODZhIDEwMDY0NAotLS0gYS9saWIvQVNUL1N0bXRQcm9maWxlLmNwcAorKysgYi9saWIvQVNUL1N0bXRQcm9maWxlLmNwcApAQCAtNzksOSArNzksOCBAQAogCiB2b2lkIFN0bXRQcm9maWxlcjo6VmlzaXREZWNsU3RtdChjb25zdCBEZWNsU3RtdCAqUykgewogICBWaXNpdFN0bXQoUyk7Ci0gIGZvciAoRGVjbFN0bXQ6OmNvbnN0X2RlY2xfaXRlcmF0b3IgRCA9IFMtPmRlY2xfYmVnaW4oKSwgREVuZCA9IFMtPmRlY2xfZW5kKCk7Ci0gICAgICAgRCAhPSBERW5kOyArK0QpCi0gICAgVmlzaXREZWNsKCpEKTsKKyAgZm9yIChjb25zdCBhdXRvICpEIDogUy0+ZGVjbHMoKSkKKyAgICBWaXNpdERlY2woRCk7CiB9CiAKIHZvaWQgU3RtdFByb2ZpbGVyOjpWaXNpdE51bGxTdG10KGNvbnN0IE51bGxTdG10ICpTKSB7CkBAIC0yNjUsMTQgKzI2NCwyNyBAQAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKIH07CiAKK3ZvaWQgT01QQ2xhdXNlUHJvZmlsZXI6OlZpc2l0T01QSWZDbGF1c2UoY29uc3QgT01QSWZDbGF1c2UgKkMpIHsKKyAgaWYgKEMtPmdldENvbmRpdGlvbigpKQorICAgIFByb2ZpbGVyLT5WaXNpdFN0bXQoQy0+Z2V0Q29uZGl0aW9uKCkpOworfQorCit2b2lkIE9NUENsYXVzZVByb2ZpbGVyOjpWaXNpdE9NUE51bVRocmVhZHNDbGF1c2UoY29uc3QgT01QTnVtVGhyZWFkc0NsYXVzZSAqQykgeworICBpZiAoQy0+Z2V0TnVtVGhyZWFkcygpKQorICAgIFByb2ZpbGVyLT5WaXNpdFN0bXQoQy0+Z2V0TnVtVGhyZWFkcygpKTsKK30KKwordm9pZCBPTVBDbGF1c2VQcm9maWxlcjo6VmlzaXRPTVBTYWZlbGVuQ2xhdXNlKGNvbnN0IE9NUFNhZmVsZW5DbGF1c2UgKkMpIHsKKyAgaWYgKEMtPmdldFNhZmVsZW4oKSkKKyAgICBQcm9maWxlci0+VmlzaXRTdG10KEMtPmdldFNhZmVsZW4oKSk7Cit9CisKIHZvaWQgT01QQ2xhdXNlUHJvZmlsZXI6OlZpc2l0T01QRGVmYXVsdENsYXVzZShjb25zdCBPTVBEZWZhdWx0Q2xhdXNlICpDKSB7IH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIHZvaWQgT01QQ2xhdXNlUHJvZmlsZXI6OlZpc2l0T01QQ2xhdXNlTGlzdChUICpOb2RlKSB7Ci0gIGZvciAodHlwZW5hbWUgVDo6dmFybGlzdF9jb25zdF9pdGVyYXRvciBJID0gTm9kZS0+dmFybGlzdF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IE5vZGUtPnZhcmxpc3RfZW5kKCk7Ci0gICAgICAgICBJICE9IEU7ICsrSSkKLSAgICBQcm9maWxlci0+VmlzaXRTdG10KCpJKTsKKyAgZm9yIChhdXRvICpJIDogTm9kZS0+dmFybGlzdHMoKSkKKyAgICBQcm9maWxlci0+VmlzaXRTdG10KEkpOwogfQogCiB2b2lkIE9NUENsYXVzZVByb2ZpbGVyOjpWaXNpdE9NUFByaXZhdGVDbGF1c2UoY29uc3QgT01QUHJpdmF0ZUNsYXVzZSAqQykgewpAQCAtMjg1LDEwICsyOTcsMTMgQEAKIHZvaWQgT01QQ2xhdXNlUHJvZmlsZXI6OlZpc2l0T01QU2hhcmVkQ2xhdXNlKGNvbnN0IE9NUFNoYXJlZENsYXVzZSAqQykgewogICBWaXNpdE9NUENsYXVzZUxpc3QoQyk7CiB9Cit2b2lkIE9NUENsYXVzZVByb2ZpbGVyOjpWaXNpdE9NUENvcHlpbkNsYXVzZShjb25zdCBPTVBDb3B5aW5DbGF1c2UgKkMpIHsKKyAgVmlzaXRPTVBDbGF1c2VMaXN0KEMpOworfQogfQogCiB2b2lkCi1TdG10UHJvZmlsZXI6OlZpc2l0T01QUGFyYWxsZWxEaXJlY3RpdmUoY29uc3QgT01QUGFyYWxsZWxEaXJlY3RpdmUgKlMpIHsKK1N0bXRQcm9maWxlcjo6VmlzaXRPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKGNvbnN0IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgKlMpIHsKICAgVmlzaXRTdG10KFMpOwogICBPTVBDbGF1c2VQcm9maWxlciBQKHRoaXMpOwogICBBcnJheVJlZjxPTVBDbGF1c2UgKj4gQ2xhdXNlcyA9IFMtPmNsYXVzZXMoKTsKQEAgLTI5OCw2ICszMTMsMTQgQEAKICAgICAgIFAuVmlzaXQoKkkpOwogfQogCit2b2lkIFN0bXRQcm9maWxlcjo6VmlzaXRPTVBQYXJhbGxlbERpcmVjdGl2ZShjb25zdCBPTVBQYXJhbGxlbERpcmVjdGl2ZSAqUykgeworICBWaXNpdE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUyk7Cit9CisKK3ZvaWQgU3RtdFByb2ZpbGVyOjpWaXNpdE9NUFNpbWREaXJlY3RpdmUoY29uc3QgT01QU2ltZERpcmVjdGl2ZSAqUykgeworICBWaXNpdE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoUyk7Cit9CisKIHZvaWQgU3RtdFByb2ZpbGVyOjpWaXNpdEV4cHIoY29uc3QgRXhwciAqUykgewogICBWaXNpdFN0bXQoUyk7CiB9CkBAIC05NDgsMTkgKzk3MSw2IEBACiAgIFZpc2l0T3ZlcmxvYWRFeHByKFMpOwogfQogCi12b2lkIFN0bXRQcm9maWxlcjo6VmlzaXRVbmFyeVR5cGVUcmFpdEV4cHIoY29uc3QgVW5hcnlUeXBlVHJhaXRFeHByICpTKSB7Ci0gIFZpc2l0RXhwcihTKTsKLSAgSUQuQWRkSW50ZWdlcihTLT5nZXRUcmFpdCgpKTsKLSAgVmlzaXRUeXBlKFMtPmdldFF1ZXJpZWRUeXBlKCkpOwotfQotCi12b2lkIFN0bXRQcm9maWxlcjo6VmlzaXRCaW5hcnlUeXBlVHJhaXRFeHByKGNvbnN0IEJpbmFyeVR5cGVUcmFpdEV4cHIgKlMpIHsKLSAgVmlzaXRFeHByKFMpOwotICBJRC5BZGRJbnRlZ2VyKFMtPmdldFRyYWl0KCkpOwotICBWaXNpdFR5cGUoUy0+Z2V0TGhzVHlwZSgpKTsKLSAgVmlzaXRUeXBlKFMtPmdldFJoc1R5cGUoKSk7Ci19Ci0KIHZvaWQgU3RtdFByb2ZpbGVyOjpWaXNpdFR5cGVUcmFpdEV4cHIoY29uc3QgVHlwZVRyYWl0RXhwciAqUykgewogICBWaXNpdEV4cHIoUyk7CiAgIElELkFkZEludGVnZXIoUy0+Z2V0VHJhaXQoKSk7CmRpZmYgLS1naXQgYS9saWIvQVNUL1RlbXBsYXRlQmFzZS5jcHAgYi9saWIvQVNUL1RlbXBsYXRlQmFzZS5jcHAKaW5kZXggMTZlZmI3OS4uNTJmOTViZiAxMDA2NDQKLS0tIGEvbGliL0FTVC9UZW1wbGF0ZUJhc2UuY3BwCisrKyBiL2xpYi9BU1QvVGVtcGxhdGVCYXNlLmNwcApAQCAtMzQ1LDcgKzM0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPdXQpIGNvbnN0IHsKICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKICAgY2FzZSBOdWxsOgotICAgIE91dCA8PCAiPG5vIHZhbHVlPiI7CisgICAgT3V0IDw8ICIobm8gdmFsdWUpIjsKICAgICBicmVhazsKICAgICAKICAgY2FzZSBUeXBlOiB7CkBAIC0zNjIsNyArMzYyLDcgQEAKICAgICAgIC8vIEZJWE1FOiBkaXN0aW5ndWlzaCBiZXR3ZWVuIHBvaW50ZXIgYW5kIHJlZmVyZW5jZSBhcmdzPwogICAgICAgTkQtPnByaW50UXVhbGlmaWVkTmFtZShPdXQpOwogICAgIH0gZWxzZSB7Ci0gICAgICBPdXQgPDwgIjxhbm9ueW1vdXM+IjsKKyAgICAgIE91dCA8PCAiKGFub255bW91cykiOwogICAgIH0KICAgICBicmVhazsKICAgfQpAQCAtNTExLDYgKzUxMSw4IEBACiBjb25zdCBBU1RUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gKgogQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvOjpDcmVhdGUoQVNUQ29udGV4dCAmQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAmTGlzdCkgeworICBhc3NlcnQobGx2bTo6YWxpZ25PZjxBU1RUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8+KCkgPj0KKyAgICAgICAgIGxsdm06OmFsaWduT2Y8VGVtcGxhdGVBcmd1bWVudExvYz4oKSk7CiAgIHN0ZDo6c2l6ZV90IHNpemUgPSBBU1RUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm86OnNpemVGb3IoTGlzdC5zaXplKCkpOwogICB2b2lkICpNZW0gPSBDLkFsbG9jYXRlKHNpemUsIGxsdm06OmFsaWduT2Y8QVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvPigpKTsKICAgQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvICpUQUkgPSBuZXcgKE1lbSkgQVNUVGVtcGxhdGVBcmd1bWVudExpc3RJbmZvKCk7CmRpZmYgLS1naXQgYS9saWIvQVNUL1R5cGUuY3BwIGIvbGliL0FTVC9UeXBlLmNwcAppbmRleCA3NDIxYmFlLi5kYzNmY2M4IDEwMDY0NAotLS0gYS9saWIvQVNUL1R5cGUuY3BwCisrKyBiL2xpYi9BU1QvVHlwZS5jcHAKQEAgLTQyMiw2ICs0MjIsMTAgQEAKICAgICByZXR1cm4gQlBULT5nZXRQb2ludGVlVHlwZSgpOwogICBpZiAoY29uc3QgUmVmZXJlbmNlVHlwZSAqUlQgPSBnZXRBczxSZWZlcmVuY2VUeXBlPigpKQogICAgIHJldHVybiBSVC0+Z2V0UG9pbnRlZVR5cGUoKTsKKyAgaWYgKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQgPSBnZXRBczxNZW1iZXJQb2ludGVyVHlwZT4oKSkKKyAgICByZXR1cm4gTVBULT5nZXRQb2ludGVlVHlwZSgpOworICBpZiAoY29uc3QgRGVjYXllZFR5cGUgKkRUID0gZ2V0QXM8RGVjYXllZFR5cGU+KCkpCisgICAgcmV0dXJuIERULT5nZXRQb2ludGVlVHlwZSgpOwogICByZXR1cm4gUXVhbFR5cGUoKTsKIH0KIApAQCAtNTg1LDcgKzU4OSw3IEBACiAgICAgICByZXR1cm4gVmlzaXQoVC0+Z2V0RWxlbWVudFR5cGUoKSk7CiAgICAgfQogICAgIEF1dG9UeXBlICpWaXNpdEZ1bmN0aW9uVHlwZShjb25zdCBGdW5jdGlvblR5cGUgKlQpIHsKLSAgICAgIHJldHVybiBWaXNpdChULT5nZXRSZXN1bHRUeXBlKCkpOworICAgICAgcmV0dXJuIFZpc2l0KFQtPmdldFJldHVyblR5cGUoKSk7CiAgICAgfQogICAgIEF1dG9UeXBlICpWaXNpdFBhcmVuVHlwZShjb25zdCBQYXJlblR5cGUgKlQpIHsKICAgICAgIHJldHVybiBWaXNpdChULT5nZXRJbm5lclR5cGUoKSk7CkBAIC01OTMsNiArNTk3LDkgQEAKICAgICBBdXRvVHlwZSAqVmlzaXRBdHRyaWJ1dGVkVHlwZShjb25zdCBBdHRyaWJ1dGVkVHlwZSAqVCkgewogICAgICAgcmV0dXJuIFZpc2l0KFQtPmdldE1vZGlmaWVkVHlwZSgpKTsKICAgICB9CisgICAgQXV0b1R5cGUgKlZpc2l0QWRqdXN0ZWRUeXBlKGNvbnN0IEFkanVzdGVkVHlwZSAqVCkgeworICAgICAgcmV0dXJuIFZpc2l0KFQtPmdldE9yaWdpbmFsVHlwZSgpKTsKKyAgICB9CiAgIH07CiB9CiAKQEAgLTE1MTYsNyArMTUyMyw3IEBACiAgIGNhc2UgVUxvbmc6ICAgICAgICAgICAgIHJldHVybiAidW5zaWduZWQgbG9uZyI7CiAgIGNhc2UgVUxvbmdMb25nOiAgICAgICAgIHJldHVybiAidW5zaWduZWQgbG9uZyBsb25nIjsKICAgY2FzZSBVSW50MTI4OiAgICAgICAgICAgcmV0dXJuICJ1bnNpZ25lZCBfX2ludDEyOCI7Ci0gIGNhc2UgSGFsZjogICAgICAgICAgICAgIHJldHVybiAiaGFsZiI7CisgIGNhc2UgSGFsZjogICAgICAgICAgICAgIHJldHVybiBQb2xpY3kuSGFsZiA/ICJoYWxmIiA6ICJfX2ZwMTYiOwogICBjYXNlIEZsb2F0OiAgICAgICAgICAgICByZXR1cm4gImZsb2F0IjsKICAgY2FzZSBEb3VibGU6ICAgICAgICAgICAgcmV0dXJuICJkb3VibGUiOwogICBjYXNlIExvbmdEb3VibGU6ICAgICAgICByZXR1cm4gImxvbmcgZG91YmxlIjsKQEAgLTE1ODIsNDEgKzE1ODksMzcgQEAKICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBjYWxsaW5nIGNvbnZlbnRpb24uIik7CiB9CiAKLUZ1bmN0aW9uUHJvdG9UeXBlOjpGdW5jdGlvblByb3RvVHlwZShRdWFsVHlwZSByZXN1bHQsIEFycmF5UmVmPFF1YWxUeXBlPiBhcmdzLAorRnVuY3Rpb25Qcm90b1R5cGU6OkZ1bmN0aW9uUHJvdG9UeXBlKFF1YWxUeXBlIHJlc3VsdCwgQXJyYXlSZWY8UXVhbFR5cGU+IHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBjYW5vbmljYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0UHJvdG9JbmZvICZlcGkpCi0gIDogRnVuY3Rpb25UeXBlKEZ1bmN0aW9uUHJvdG8sIHJlc3VsdCwgZXBpLlR5cGVRdWFscywKLSAgICAgICAgICAgICAgICAgY2Fub25pY2FsLAotICAgICAgICAgICAgICAgICByZXN1bHQtPmlzRGVwZW5kZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICByZXN1bHQtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgcmVzdWx0LT5pc1ZhcmlhYmx5TW9kaWZpZWRUeXBlKCksCi0gICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpLAotICAgICAgICAgICAgICAgICBlcGkuRXh0SW5mbyksCi0gICAgTnVtQXJncyhhcmdzLnNpemUoKSksIE51bUV4Y2VwdGlvbnMoZXBpLk51bUV4Y2VwdGlvbnMpLAotICAgIEV4Y2VwdGlvblNwZWNUeXBlKGVwaS5FeGNlcHRpb25TcGVjVHlwZSksCi0gICAgSGFzQW55Q29uc3VtZWRBcmdzKGVwaS5Db25zdW1lZEFyZ3VtZW50cyAhPSAwKSwKLSAgICBWYXJpYWRpYyhlcGkuVmFyaWFkaWMpLCBIYXNUcmFpbGluZ1JldHVybihlcGkuSGFzVHJhaWxpbmdSZXR1cm4pLAotICAgIFJlZlF1YWxpZmllcihlcGkuUmVmUXVhbGlmaWVyKQotewotICBhc3NlcnQoTnVtQXJncyA9PSBhcmdzLnNpemUoKSAmJiAiZnVuY3Rpb24gaGFzIHRvbyBtYW55IHBhcmFtZXRlcnMiKTsKKyAgICA6IEZ1bmN0aW9uVHlwZShGdW5jdGlvblByb3RvLCByZXN1bHQsIGVwaS5UeXBlUXVhbHMsIGNhbm9uaWNhbCwKKyAgICAgICAgICAgICAgICAgICByZXN1bHQtPmlzRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+aXNWYXJpYWJseU1vZGlmaWVkVHlwZSgpLAorICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29udGFpbnNVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaygpLCBlcGkuRXh0SW5mbyksCisgICAgICBOdW1QYXJhbXMocGFyYW1zLnNpemUoKSksIE51bUV4Y2VwdGlvbnMoZXBpLk51bUV4Y2VwdGlvbnMpLAorICAgICAgRXhjZXB0aW9uU3BlY1R5cGUoZXBpLkV4Y2VwdGlvblNwZWNUeXBlKSwKKyAgICAgIEhhc0FueUNvbnN1bWVkUGFyYW1zKGVwaS5Db25zdW1lZFBhcmFtZXRlcnMgIT0gMCksIFZhcmlhZGljKGVwaS5WYXJpYWRpYyksCisgICAgICBIYXNUcmFpbGluZ1JldHVybihlcGkuSGFzVHJhaWxpbmdSZXR1cm4pLCBSZWZRdWFsaWZpZXIoZXBpLlJlZlF1YWxpZmllcikgeworICBhc3NlcnQoTnVtUGFyYW1zID09IHBhcmFtcy5zaXplKCkgJiYgImZ1bmN0aW9uIGhhcyB0b28gbWFueSBwYXJhbWV0ZXJzIik7CiAKICAgLy8gRmlsbCBpbiB0aGUgdHJhaWxpbmcgYXJndW1lbnQgYXJyYXkuCiAgIFF1YWxUeXBlICphcmdTbG90ID0gcmVpbnRlcnByZXRfY2FzdDxRdWFsVHlwZSo+KHRoaXMrMSk7Ci0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtQXJnczsgKytpKSB7Ci0gICAgaWYgKGFyZ3NbaV0tPmlzRGVwZW5kZW50VHlwZSgpKQorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVBhcmFtczsgKytpKSB7CisgICAgaWYgKHBhcmFtc1tpXS0+aXNEZXBlbmRlbnRUeXBlKCkpCiAgICAgICBzZXREZXBlbmRlbnQoKTsKLSAgICBlbHNlIGlmIChhcmdzW2ldLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCkpCisgICAgZWxzZSBpZiAocGFyYW1zW2ldLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCkpCiAgICAgICBzZXRJbnN0YW50aWF0aW9uRGVwZW5kZW50KCk7Ci0gICAgCi0gICAgaWYgKGFyZ3NbaV0tPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSkKKworICAgIGlmIChwYXJhbXNbaV0tPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSkKICAgICAgIHNldENvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKTsKIAotICAgIGFyZ1Nsb3RbaV0gPSBhcmdzW2ldOworICAgIGFyZ1Nsb3RbaV0gPSBwYXJhbXNbaV07CiAgIH0KIAogICBpZiAoZ2V0RXhjZXB0aW9uU3BlY1R5cGUoKSA9PSBFU1RfRHluYW1pYykgewogICAgIC8vIEZpbGwgaW4gdGhlIGV4Y2VwdGlvbiBhcnJheS4KLSAgICBRdWFsVHlwZSAqZXhuU2xvdCA9IGFyZ1Nsb3QgKyBOdW1BcmdzOworICAgIFF1YWxUeXBlICpleG5TbG90ID0gYXJnU2xvdCArIE51bVBhcmFtczsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZXBpLk51bUV4Y2VwdGlvbnM7IGkgIT0gZTsgKytpKSB7CiAgICAgICBpZiAoZXBpLkV4Y2VwdGlvbnNbaV0tPmlzRGVwZW5kZW50VHlwZSgpKQogICAgICAgICBzZXREZXBlbmRlbnQoKTsKQEAgLTE2MzAsNyArMTYzMyw3IEBACiAgICAgfQogICB9IGVsc2UgaWYgKGdldEV4Y2VwdGlvblNwZWNUeXBlKCkgPT0gRVNUX0NvbXB1dGVkTm9leGNlcHQpIHsKICAgICAvLyBTdG9yZSB0aGUgbm9leGNlcHQgZXhwcmVzc2lvbiBhbmQgY29udGV4dC4KLSAgICBFeHByICoqbm9leFNsb3QgPSByZWludGVycHJldF9jYXN0PEV4cHIqKj4oYXJnU2xvdCArIE51bUFyZ3MpOworICAgIEV4cHIgKipub2V4U2xvdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXhwciAqKj4oYXJnU2xvdCArIE51bVBhcmFtcyk7CiAgICAgKm5vZXhTbG90ID0gZXBpLk5vZXhjZXB0RXhwcjsKICAgICAKICAgICBpZiAoZXBpLk5vZXhjZXB0RXhwcikgewpAQCAtMTY0Myw3ICsxNjQ2LDggQEAKICAgfSBlbHNlIGlmIChnZXRFeGNlcHRpb25TcGVjVHlwZSgpID09IEVTVF9Vbmluc3RhbnRpYXRlZCkgewogICAgIC8vIFN0b3JlIHRoZSBmdW5jdGlvbiBkZWNsIGZyb20gd2hpY2ggd2Ugd2lsbCByZXNvbHZlIG91cgogICAgIC8vIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgotICAgIEZ1bmN0aW9uRGVjbCAqKnNsb3QgPSByZWludGVycHJldF9jYXN0PEZ1bmN0aW9uRGVjbCoqPihhcmdTbG90ICsgTnVtQXJncyk7CisgICAgRnVuY3Rpb25EZWNsICoqc2xvdCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RnVuY3Rpb25EZWNsICoqPihhcmdTbG90ICsgTnVtUGFyYW1zKTsKICAgICBzbG90WzBdID0gZXBpLkV4Y2VwdGlvblNwZWNEZWNsOwogICAgIHNsb3RbMV0gPSBlcGkuRXhjZXB0aW9uU3BlY1RlbXBsYXRlOwogICAgIC8vIFRoaXMgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gZG9lc24ndCBtYWtlIHRoZSB0eXBlIGRlcGVuZGVudCwgYmVjYXVzZQpAQCAtMTY1MSwxNCArMTY1NSwxNSBAQAogICB9IGVsc2UgaWYgKGdldEV4Y2VwdGlvblNwZWNUeXBlKCkgPT0gRVNUX1VuZXZhbHVhdGVkKSB7CiAgICAgLy8gU3RvcmUgdGhlIGZ1bmN0aW9uIGRlY2wgZnJvbSB3aGljaCB3ZSB3aWxsIHJlc29sdmUgb3VyCiAgICAgLy8gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uCi0gICAgRnVuY3Rpb25EZWNsICoqc2xvdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RnVuY3Rpb25EZWNsKio+KGFyZ1Nsb3QgKyBOdW1BcmdzKTsKKyAgICBGdW5jdGlvbkRlY2wgKipzbG90ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxGdW5jdGlvbkRlY2wgKio+KGFyZ1Nsb3QgKyBOdW1QYXJhbXMpOwogICAgIHNsb3RbMF0gPSBlcGkuRXhjZXB0aW9uU3BlY0RlY2w7CiAgIH0KIAotICBpZiAoZXBpLkNvbnN1bWVkQXJndW1lbnRzKSB7Ci0gICAgYm9vbCAqY29uc3VtZWRBcmdzID0gY29uc3RfY2FzdDxib29sKj4oZ2V0Q29uc3VtZWRBcmdzQnVmZmVyKCkpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtQXJnczsgKytpKQotICAgICAgY29uc3VtZWRBcmdzW2ldID0gZXBpLkNvbnN1bWVkQXJndW1lbnRzW2ldOworICBpZiAoZXBpLkNvbnN1bWVkUGFyYW1ldGVycykgeworICAgIGJvb2wgKmNvbnN1bWVkUGFyYW1zID0gY29uc3RfY2FzdDxib29sICo+KGdldENvbnN1bWVkUGFyYW1zQnVmZmVyKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtUGFyYW1zOyArK2kpCisgICAgICBjb25zdW1lZFBhcmFtc1tpXSA9IGVwaS5Db25zdW1lZFBhcmFtZXRlcnNbaV07CiAgIH0KIH0KIApAQCAtMTY4NiwxNiArMTY5MSw0MSBAQAogICByZXR1cm4gdmFsdWUuZ2V0Qm9vbFZhbHVlKCkgPyBOUl9Ob3Rocm93IDogTlJfVGhyb3c7CiB9CiAKK2Jvb2wgRnVuY3Rpb25Qcm90b1R5cGU6OmlzTm90aHJvdyhjb25zdCBBU1RDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXN1bHRJZkRlcGVuZGVudCkgY29uc3QgeworICBFeGNlcHRpb25TcGVjaWZpY2F0aW9uVHlwZSBFU1QgPSBnZXRFeGNlcHRpb25TcGVjVHlwZSgpOworICBhc3NlcnQoRVNUICE9IEVTVF9VbmV2YWx1YXRlZCAmJiBFU1QgIT0gRVNUX1VuaW5zdGFudGlhdGVkKTsKKyAgaWYgKEVTVCA9PSBFU1RfRHluYW1pY05vbmUgfHwgRVNUID09IEVTVF9CYXNpY05vZXhjZXB0KQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChFU1QgPT0gRVNUX0R5bmFtaWMgJiYgUmVzdWx0SWZEZXBlbmRlbnQgPT0gdHJ1ZSkgeworICAgIC8vIEEgZHluYW1pYyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpcyB0aHJvd2luZyB1bmxlc3MgZXZlcnkgZXhjZXB0aW9uCisgICAgLy8gdHlwZSBpcyBhbiAodW5leHBhbmRlZCkgcGFjayBleHBhbnNpb24gdHlwZS4KKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gTnVtRXhjZXB0aW9uczsgSSAhPSBOOyArK0kpCisgICAgICBpZiAoIWdldEV4Y2VwdGlvblR5cGUoSSktPmdldEFzPFBhY2tFeHBhbnNpb25UeXBlPigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIFJlc3VsdElmRGVwZW5kZW50OworICB9CisKKyAgaWYgKEVTVCAhPSBFU1RfQ29tcHV0ZWROb2V4Y2VwdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgTm9leGNlcHRSZXN1bHQgTlIgPSBnZXROb2V4Y2VwdFNwZWMoQ3R4KTsKKyAgaWYgKE5SID09IE5SX0RlcGVuZGVudCkKKyAgICByZXR1cm4gUmVzdWx0SWZEZXBlbmRlbnQ7CisgIHJldHVybiBOUiA9PSBOUl9Ob3Rocm93OworfQorCiBib29sIEZ1bmN0aW9uUHJvdG9UeXBlOjppc1RlbXBsYXRlVmFyaWFkaWMoKSBjb25zdCB7Ci0gIGZvciAodW5zaWduZWQgQXJnSWR4ID0gZ2V0TnVtQXJncygpOyBBcmdJZHg7IC0tQXJnSWR4KQotICAgIGlmIChpc2E8UGFja0V4cGFuc2lvblR5cGU+KGdldEFyZ1R5cGUoQXJnSWR4IC0gMSkpKQorICBmb3IgKHVuc2lnbmVkIEFyZ0lkeCA9IGdldE51bVBhcmFtcygpOyBBcmdJZHg7IC0tQXJnSWR4KQorICAgIGlmIChpc2E8UGFja0V4cGFuc2lvblR5cGU+KGdldFBhcmFtVHlwZShBcmdJZHggLSAxKSkpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgCiAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBGdW5jdGlvblByb3RvVHlwZTo6UHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwgUXVhbFR5cGUgUmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRdWFsVHlwZSAqQXJnVHlzLCB1bnNpZ25lZCBOdW1BcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRdWFsVHlwZSAqQXJnVHlzLCB1bnNpZ25lZCBOdW1QYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4dFByb3RvSW5mbyAmZXBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU1RDb250ZXh0ICZDb250ZXh0KSB7CiAKQEAgLTE3MTcsNyArMTc0Nyw3IEBACiAgIC8vIHdoZXRoZXIgdGhlIGZvbGxvd2luZyBib29sIGlzIHRoZSBFSCBzcGVjIG9yIHBhcnQgb2YgdGhlIGFyZ3VtZW50cy4KIAogICBJRC5BZGRQb2ludGVyKFJlc3VsdC5nZXRBc09wYXF1ZVB0cigpKTsKLSAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1BcmdzOyArK2kpCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtUGFyYW1zOyArK2kpCiAgICAgSUQuQWRkUG9pbnRlcihBcmdUeXNbaV0uZ2V0QXNPcGFxdWVQdHIoKSk7CiAgIC8vIFRoaXMgbWV0aG9kIGlzIHJlbGF0aXZlbHkgcGVyZm9ybWFuY2Ugc2Vuc2l0aXZlLCBzbyBhcyBhIHBlcmZvcm1hbmNlCiAgIC8vIHNob3J0Y3V0LCB1c2Ugb25lIEFkZEludGVnZXIgY2FsbCBpbnN0ZWFkIG9mIGZvdXIgZm9yIHRoZSBuZXh0IGZvdXIKQEAgLTE3NDAsOSArMTc3MCw5IEBACiAgICAgICAgICAgICAgZXBpLkV4Y2VwdGlvblNwZWNUeXBlID09IEVTVF9VbmV2YWx1YXRlZCkgewogICAgIElELkFkZFBvaW50ZXIoZXBpLkV4Y2VwdGlvblNwZWNEZWNsLT5nZXRDYW5vbmljYWxEZWNsKCkpOwogICB9Ci0gIGlmIChlcGkuQ29uc3VtZWRBcmd1bWVudHMpIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUFyZ3M7ICsraSkKLSAgICAgIElELkFkZEJvb2xlYW4oZXBpLkNvbnN1bWVkQXJndW1lbnRzW2ldKTsKKyAgaWYgKGVwaS5Db25zdW1lZFBhcmFtZXRlcnMpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVBhcmFtczsgKytpKQorICAgICAgSUQuQWRkQm9vbGVhbihlcGkuQ29uc3VtZWRQYXJhbWV0ZXJzW2ldKTsKICAgfQogICBlcGkuRXh0SW5mby5Qcm9maWxlKElEKTsKICAgSUQuQWRkQm9vbGVhbihlcGkuSGFzVHJhaWxpbmdSZXR1cm4pOwpAQCAtMTc1MCw3ICsxNzgwLDcgQEAKIAogdm9pZCBGdW5jdGlvblByb3RvVHlwZTo6UHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVNUQ29udGV4dCAmQ3R4KSB7Ci0gIFByb2ZpbGUoSUQsIGdldFJlc3VsdFR5cGUoKSwgYXJnX3R5cGVfYmVnaW4oKSwgTnVtQXJncywgZ2V0RXh0UHJvdG9JbmZvKCksCisgIFByb2ZpbGUoSUQsIGdldFJldHVyblR5cGUoKSwgcGFyYW1fdHlwZV9iZWdpbigpLCBOdW1QYXJhbXMsIGdldEV4dFByb3RvSW5mbygpLAogICAgICAgICAgIEN0eCk7CiB9CiAKQEAgLTE4MTksMTEgKzE4NDksOSBAQAogICAgIGRlY2woY29uc3RfY2FzdDxUYWdEZWNsKj4oRCkpIHt9CiAKIHN0YXRpYyBUYWdEZWNsICpnZXRJbnRlcmVzdGluZ1RhZ0RlY2woVGFnRGVjbCAqZGVjbCkgewotICBmb3IgKFRhZ0RlY2w6OnJlZGVjbF9pdGVyYXRvciBJID0gZGVjbC0+cmVkZWNsc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gZGVjbC0+cmVkZWNsc19lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgeworICBmb3IgKGF1dG8gSSA6IGRlY2wtPnJlZGVjbHMoKSkgewogICAgIGlmIChJLT5pc0NvbXBsZXRlRGVmaW5pdGlvbigpIHx8IEktPmlzQmVpbmdEZWZpbmVkKCkpCi0gICAgICByZXR1cm4gKkk7CisgICAgICByZXR1cm4gSTsKICAgfQogICAvLyBJZiB0aGVyZSdzIG5vIGRlZmluaXRpb24gKG5vdCBldmVuIGluIHByb2dyZXNzKSwgcmV0dXJuIHdoYXQgd2UgaGF2ZS4KICAgcmV0dXJuIGRlY2w7CkBAIC0yMjAwLDEzICsyMjI4LDEyIEBACiAgIGNhc2UgVHlwZTo6RXh0VmVjdG9yOgogICAgIHJldHVybiBDYWNoZTo6Z2V0KGNhc3Q8VmVjdG9yVHlwZT4oVCktPmdldEVsZW1lbnRUeXBlKCkpOwogICBjYXNlIFR5cGU6OkZ1bmN0aW9uTm9Qcm90bzoKLSAgICByZXR1cm4gQ2FjaGU6OmdldChjYXN0PEZ1bmN0aW9uVHlwZT4oVCktPmdldFJlc3VsdFR5cGUoKSk7CisgICAgcmV0dXJuIENhY2hlOjpnZXQoY2FzdDxGdW5jdGlvblR5cGU+KFQpLT5nZXRSZXR1cm5UeXBlKCkpOwogICBjYXNlIFR5cGU6OkZ1bmN0aW9uUHJvdG86IHsKICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0gY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oVCk7Ci0gICAgQ2FjaGVkUHJvcGVydGllcyByZXN1bHQgPSBDYWNoZTo6Z2V0KEZQVC0+Z2V0UmVzdWx0VHlwZSgpKTsKLSAgICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjphcmdfdHlwZV9pdGVyYXRvciBhaSA9IEZQVC0+YXJnX3R5cGVfYmVnaW4oKSwKLSAgICAgICAgICAgYWUgPSBGUFQtPmFyZ190eXBlX2VuZCgpOyBhaSAhPSBhZTsgKythaSkKLSAgICAgIHJlc3VsdCA9IG1lcmdlKHJlc3VsdCwgQ2FjaGU6OmdldCgqYWkpKTsKKyAgICBDYWNoZWRQcm9wZXJ0aWVzIHJlc3VsdCA9IENhY2hlOjpnZXQoRlBULT5nZXRSZXR1cm5UeXBlKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmYWkgOiBGUFQtPnBhcmFtX3R5cGVzKCkpCisgICAgICByZXN1bHQgPSBtZXJnZShyZXN1bHQsIENhY2hlOjpnZXQoYWkpKTsKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAgIGNhc2UgVHlwZTo6T2JqQ0ludGVyZmFjZTogewpAQCAtMjI4NSwxMyArMjMxMiwxMiBAQAogICBjYXNlIFR5cGU6OkV4dFZlY3RvcjoKICAgICByZXR1cm4gY29tcHV0ZUxpbmthZ2VJbmZvKGNhc3Q8VmVjdG9yVHlwZT4oVCktPmdldEVsZW1lbnRUeXBlKCkpOwogICBjYXNlIFR5cGU6OkZ1bmN0aW9uTm9Qcm90bzoKLSAgICByZXR1cm4gY29tcHV0ZUxpbmthZ2VJbmZvKGNhc3Q8RnVuY3Rpb25UeXBlPihUKS0+Z2V0UmVzdWx0VHlwZSgpKTsKKyAgICByZXR1cm4gY29tcHV0ZUxpbmthZ2VJbmZvKGNhc3Q8RnVuY3Rpb25UeXBlPihUKS0+Z2V0UmV0dXJuVHlwZSgpKTsKICAgY2FzZSBUeXBlOjpGdW5jdGlvblByb3RvOiB7CiAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9IGNhc3Q8RnVuY3Rpb25Qcm90b1R5cGU+KFQpOwotICAgIExpbmthZ2VJbmZvIExWID0gY29tcHV0ZUxpbmthZ2VJbmZvKEZQVC0+Z2V0UmVzdWx0VHlwZSgpKTsKLSAgICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjphcmdfdHlwZV9pdGVyYXRvciBhaSA9IEZQVC0+YXJnX3R5cGVfYmVnaW4oKSwKLSAgICAgICAgICAgYWUgPSBGUFQtPmFyZ190eXBlX2VuZCgpOyBhaSAhPSBhZTsgKythaSkKLSAgICAgIExWLm1lcmdlKGNvbXB1dGVMaW5rYWdlSW5mbygqYWkpKTsKKyAgICBMaW5rYWdlSW5mbyBMViA9IGNvbXB1dGVMaW5rYWdlSW5mbyhGUFQtPmdldFJldHVyblR5cGUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZhaSA6IEZQVC0+cGFyYW1fdHlwZXMoKSkKKyAgICAgIExWLm1lcmdlKGNvbXB1dGVMaW5rYWdlSW5mbyhhaSkpOwogICAgIHJldHVybiBMVjsKICAgfQogICBjYXNlIFR5cGU6Ok9iakNJbnRlcmZhY2U6CkBAIC0yNDQxLDMgKzI0NjcsNyBAQAogCiAgIHJldHVybiBES19ub25lOwogfQorCitDWFhSZWNvcmREZWNsICpNZW1iZXJQb2ludGVyVHlwZTo6Z2V0TW9zdFJlY2VudENYWFJlY29yZERlY2woKSBjb25zdCB7CisgIHJldHVybiBnZXRDbGFzcygpLT5nZXRBc0NYWFJlY29yZERlY2woKS0+Z2V0TW9zdFJlY2VudERlY2woKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9BU1QvVHlwZVByaW50ZXIuY3BwIGIvbGliL0FTVC9UeXBlUHJpbnRlci5jcHAKaW5kZXggNTcxZTNkYi4uODllYzhkNiAxMDA2NDQKLS0tIGEvbGliL0FTVC9UeXBlUHJpbnRlci5jcHAKKysrIGIvbGliL0FTVC9UeXBlUHJpbnRlci5jcHAKQEAgLTIwNCw2ICsyMDQsNyBAQAogICAgICAgTmVlZEFSQ1N0cm9uZ1F1YWxpZmllciA9IHRydWU7CiAgICAgICAvLyBGYWxsIHRocm91Z2gKICAgICAgIAorICAgIGNhc2UgVHlwZTo6QWRqdXN0ZWQ6CiAgICAgY2FzZSBUeXBlOjpEZWNheWVkOgogICAgIGNhc2UgVHlwZTo6UG9pbnRlcjoKICAgICBjYXNlIFR5cGU6OkJsb2NrUG9pbnRlcjoKQEAgLTQ3MSwxMiArNDcyLDIxIEBACiAgIHByaW50QWZ0ZXIoVC0+Z2V0RWxlbWVudFR5cGUoKSwgT1MpOwogfQogCit2b2lkIFR5cGVQcmludGVyOjpwcmludEFkanVzdGVkQmVmb3JlKGNvbnN0IEFkanVzdGVkVHlwZSAqVCwgcmF3X29zdHJlYW0gJk9TKSB7CisgIC8vIFByaW50IHRoZSBhZGp1c3RlZCByZXByZXNlbnRhdGlvbiwgb3RoZXJ3aXNlIHRoZSBhZGp1c3RtZW50IHdpbGwgYmUKKyAgLy8gaW52aXNpYmxlLgorICBwcmludEJlZm9yZShULT5nZXRBZGp1c3RlZFR5cGUoKSwgT1MpOworfQordm9pZCBUeXBlUHJpbnRlcjo6cHJpbnRBZGp1c3RlZEFmdGVyKGNvbnN0IEFkanVzdGVkVHlwZSAqVCwgcmF3X29zdHJlYW0gJk9TKSB7CisgIHByaW50QWZ0ZXIoVC0+Z2V0QWRqdXN0ZWRUeXBlKCksIE9TKTsKK30KKwogdm9pZCBUeXBlUHJpbnRlcjo6cHJpbnREZWNheWVkQmVmb3JlKGNvbnN0IERlY2F5ZWRUeXBlICpULCByYXdfb3N0cmVhbSAmT1MpIHsKICAgLy8gUHJpbnQgYXMgdGhvdWdoIGl0J3MgYSBwb2ludGVyLgotICBwcmludEJlZm9yZShULT5nZXREZWNheWVkVHlwZSgpLCBPUyk7CisgIHByaW50QWRqdXN0ZWRCZWZvcmUoVCwgT1MpOwogfQogdm9pZCBUeXBlUHJpbnRlcjo6cHJpbnREZWNheWVkQWZ0ZXIoY29uc3QgRGVjYXllZFR5cGUgKlQsIHJhd19vc3RyZWFtICZPUykgewotICBwcmludEFmdGVyKFQtPmdldERlY2F5ZWRUeXBlKCksIE9TKTsKKyAgcHJpbnRBZGp1c3RlZEFmdGVyKFQsIE9TKTsKIH0KIAogdm9pZCBUeXBlUHJpbnRlcjo6cHJpbnREZXBlbmRlbnRTaXplZEFycmF5QmVmb3JlKApAQCAtNTk4LDcgKzYwOCw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gSWYgbmVlZGVkIGZvciBwcmVjZWRlbmNlIHJlYXNvbnMsIHdyYXAgdGhlIGlubmVyIHBhcnQgaW4gZ3JvdXBpbmcgcGFyZW5zLgogICAgIFNhdmVBbmRSZXN0b3JlPGJvb2w+IFByZXZQSElzRW1wdHkoSGFzRW1wdHlQbGFjZUhvbGRlciwgZmFsc2UpOwotICAgIHByaW50QmVmb3JlKFQtPmdldFJlc3VsdFR5cGUoKSwgT1MpOworICAgIHByaW50QmVmb3JlKFQtPmdldFJldHVyblR5cGUoKSwgT1MpOwogICAgIGlmICghUHJldlBISXNFbXB0eS5nZXQoKSkKICAgICAgIE9TIDw8ICcoJzsKICAgfQpAQCAtNjE0LDE3ICs2MjQsMTcgQEAKICAgT1MgPDwgJygnOwogICB7CiAgICAgUGFyYW1Qb2xpY3lSQUlJIFBhcmFtUG9saWN5KFBvbGljeSk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFQtPmdldE51bUFyZ3MoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVC0+Z2V0TnVtUGFyYW1zKCk7IGkgIT0gZTsgKytpKSB7CiAgICAgICBpZiAoaSkgT1MgPDwgIiwgIjsKLSAgICAgIHByaW50KFQtPmdldEFyZ1R5cGUoaSksIE9TLCBTdHJpbmdSZWYoKSk7CisgICAgICBwcmludChULT5nZXRQYXJhbVR5cGUoaSksIE9TLCBTdHJpbmdSZWYoKSk7CiAgICAgfQogICB9CiAgIAogICBpZiAoVC0+aXNWYXJpYWRpYygpKSB7Ci0gICAgaWYgKFQtPmdldE51bUFyZ3MoKSkKKyAgICBpZiAoVC0+Z2V0TnVtUGFyYW1zKCkpCiAgICAgICBPUyA8PCAiLCAiOwogICAgIE9TIDw8ICIuLi4iOwotICB9IGVsc2UgaWYgKFQtPmdldE51bUFyZ3MoKSA9PSAwICYmICFQb2xpY3kuTGFuZ09wdHMuQ1BsdXNQbHVzKSB7CisgIH0gZWxzZSBpZiAoVC0+Z2V0TnVtUGFyYW1zKCkgPT0gMCAmJiAhUG9saWN5LkxhbmdPcHRzLkNQbHVzUGx1cykgewogICAgIC8vIERvIG5vdCBlbWl0IGludCgpIGlmIHdlIGhhdmUgYSBwcm90bywgZW1pdCAnaW50KHZvaWQpJy4KICAgICBPUyA8PCAidm9pZCI7CiAgIH0KQEAgLTcwMywxNyArNzEzLDE3IEBACiAgIFQtPnByaW50RXhjZXB0aW9uU3BlY2lmaWNhdGlvbihPUywgUG9saWN5KTsKIAogICBpZiAoVC0+aGFzVHJhaWxpbmdSZXR1cm4oKSkgewotICAgIE9TIDw8ICIgLT4gIjsgCi0gICAgcHJpbnQoVC0+Z2V0UmVzdWx0VHlwZSgpLCBPUywgU3RyaW5nUmVmKCkpOworICAgIE9TIDw8ICIgLT4gIjsKKyAgICBwcmludChULT5nZXRSZXR1cm5UeXBlKCksIE9TLCBTdHJpbmdSZWYoKSk7CiAgIH0gZWxzZQotICAgIHByaW50QWZ0ZXIoVC0+Z2V0UmVzdWx0VHlwZSgpLCBPUyk7CisgICAgcHJpbnRBZnRlcihULT5nZXRSZXR1cm5UeXBlKCksIE9TKTsKIH0KIAogdm9pZCBUeXBlUHJpbnRlcjo6cHJpbnRGdW5jdGlvbk5vUHJvdG9CZWZvcmUoY29uc3QgRnVuY3Rpb25Ob1Byb3RvVHlwZSAqVCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsgCiAgIC8vIElmIG5lZWRlZCBmb3IgcHJlY2VkZW5jZSByZWFzb25zLCB3cmFwIHRoZSBpbm5lciBwYXJ0IGluIGdyb3VwaW5nIHBhcmVucy4KICAgU2F2ZUFuZFJlc3RvcmU8Ym9vbD4gUHJldlBISXNFbXB0eShIYXNFbXB0eVBsYWNlSG9sZGVyLCBmYWxzZSk7Ci0gIHByaW50QmVmb3JlKFQtPmdldFJlc3VsdFR5cGUoKSwgT1MpOworICBwcmludEJlZm9yZShULT5nZXRSZXR1cm5UeXBlKCksIE9TKTsKICAgaWYgKCFQcmV2UEhJc0VtcHR5LmdldCgpKQogICAgIE9TIDw8ICcoJzsKIH0KQEAgLTcyNyw3ICs3MzcsNyBAQAogICBPUyA8PCAiKCkiOwogICBpZiAoVC0+Z2V0Tm9SZXR1cm5BdHRyKCkpCiAgICAgT1MgPDwgIiBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIjsKLSAgcHJpbnRBZnRlcihULT5nZXRSZXN1bHRUeXBlKCksIE9TKTsKKyAgcHJpbnRBZnRlcihULT5nZXRSZXR1cm5UeXBlKCksIE9TKTsKIH0KIAogdm9pZCBUeXBlUHJpbnRlcjo6cHJpbnRUeXBlU3BlYyhjb25zdCBOYW1lZERlY2wgKkQsIHJhd19vc3RyZWFtICZPUykgewpAQCAtODM4LDcgKzg0OCw3IEBACiAgICAgaWYgKE5TLT5nZXRJZGVudGlmaWVyKCkpCiAgICAgICBPUyA8PCBOUy0+Z2V0TmFtZSgpIDw8ICI6OiI7CiAgICAgZWxzZQotICAgICAgT1MgPDwgIjxhbm9ueW1vdXM+OjoiOworICAgICAgT1MgPDwgIihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6IjsKICAgfSBlbHNlIGlmIChDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpTcGVjCiAgICAgICAgICAgICAgICA9IGR5bl9jYXN0PENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+KERDKSkgewogICAgIEluY2x1ZGVTdHJvbmdMaWZldGltZVJBSUkgU3Ryb25nKFBvbGljeSk7CkBAIC04OTAsMTMgKzkwMCwxMyBAQAogICAgIE9TIDw8IFR5cGVkZWYtPmdldElkZW50aWZpZXIoKS0+Z2V0TmFtZSgpOwogICB9IGVsc2UgewogICAgIC8vIE1ha2UgYW4gdW5hbWJpZ3VvdXMgcmVwcmVzZW50YXRpb24gZm9yIGFub255bW91cyB0eXBlcywgZS5nLgotICAgIC8vICAgPGFub255bW91cyBlbnVtIGF0IC91c3IvaW5jbHVkZS9zdHJpbmcuaDoxMjA6OT4KKyAgICAvLyAgIChhbm9ueW1vdXMgZW51bSBhdCAvdXNyL2luY2x1ZGUvc3RyaW5nLmg6MTIwOjkpCiAgICAgCiAgICAgaWYgKGlzYTxDWFhSZWNvcmREZWNsPihEKSAmJiBjYXN0PENYWFJlY29yZERlY2w+KEQpLT5pc0xhbWJkYSgpKSB7Ci0gICAgICBPUyA8PCAiPGxhbWJkYSI7CisgICAgICBPUyA8PCAiKGxhbWJkYSI7CiAgICAgICBIYXNLaW5kRGVjb3JhdGlvbiA9IHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgIE9TIDw8ICI8YW5vbnltb3VzIjsKKyAgICAgIE9TIDw8ICIoYW5vbnltb3VzIjsKICAgICB9CiAgICAgCiAgICAgaWYgKFBvbGljeS5Bbm9ueW1vdXNUYWdMb2NhdGlvbnMpIHsKQEAgLTkxNSw3ICs5MjUsNyBAQAogICAgICAgfQogICAgIH0KICAgICAKLSAgICBPUyA8PCAnPic7CisgICAgT1MgPDwgJyknOwogICB9CiAKICAgLy8gSWYgdGhpcyBpcyBhIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCBwcmludCB0aGUgdGVtcGxhdGUKQEAgLTEyNDksMTMgKzEyNTksMTIgQEAKICAgcHJpbnQoVC0+Z2V0QmFzZVR5cGUoKSwgT1MsIFN0cmluZ1JlZigpKTsKICAgT1MgPDwgJzwnOwogICBib29sIGlzRmlyc3QgPSB0cnVlOwotICBmb3IgKE9iakNPYmplY3RUeXBlOjpxdWFsX2l0ZXJhdG9yCi0gICAgICAgICBJID0gVC0+cXVhbF9iZWdpbigpLCBFID0gVC0+cXVhbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogVC0+cXVhbHMoKSkgewogICAgIGlmIChpc0ZpcnN0KQogICAgICAgaXNGaXJzdCA9IGZhbHNlOwogICAgIGVsc2UKICAgICAgIE9TIDw8ICcsJzsKLSAgICBPUyA8PCAoKkkpLT5nZXROYW1lKCk7CisgICAgT1MgPDwgSS0+Z2V0TmFtZSgpOwogICB9CiAgIE9TIDw8ICc+JzsKICAgc3BhY2VCZWZvcmVQbGFjZUhvbGRlcihPUyk7CkBAIC0xMjcxLDEyICsxMjgwLDEyIEBACiAgIFQtPmdldFBvaW50ZWVUeXBlKCkuZ2V0TG9jYWxRdWFsaWZpZXJzKCkucHJpbnQoT1MsIFBvbGljeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYXBwZW5kU3BhY2VJZk5vbkVtcHR5PSovdHJ1ZSk7CiAKKyAgYXNzZXJ0KCFULT5pc09iakNTZWxUeXBlKCkpOworCiAgIGlmIChULT5pc09iakNJZFR5cGUoKSB8fCBULT5pc09iakNRdWFsaWZpZWRJZFR5cGUoKSkKICAgICBPUyA8PCAiaWQiOwogICBlbHNlIGlmIChULT5pc09iakNDbGFzc1R5cGUoKSB8fCBULT5pc09iakNRdWFsaWZpZWRDbGFzc1R5cGUoKSkKICAgICBPUyA8PCAiQ2xhc3MiOwotICBlbHNlIGlmIChULT5pc09iakNTZWxUeXBlKCkpCi0gICAgT1MgPDwgIlNFTCI7CiAgIGVsc2UKICAgICBPUyA8PCBULT5nZXRJbnRlcmZhY2VEZWNsKCktPmdldE5hbWUoKTsKICAgCkBAIC0xMjkyLDcgKzEzMDEsOCBAQAogICAgIE9TIDw8ICc+JzsKICAgfQogICAKLSAgaWYgKCFULT5pc09iakNJZFR5cGUoKSAmJiAhVC0+aXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkpIHsKKyAgaWYgKCFULT5pc09iakNJZFR5cGUoKSAmJiAhVC0+aXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkgJiYKKyAgICAgICFULT5pc09iakNDbGFzc1R5cGUoKSAmJiAhVC0+aXNPYmpDUXVhbGlmaWVkQ2xhc3NUeXBlKCkpIHsKICAgICBPUyA8PCAiICoiOyAvLyBEb24ndCBmb3JnZXQgdGhlIGltcGxpY2l0IHBvaW50ZXIuCiAgIH0gZWxzZSB7CiAgICAgc3BhY2VCZWZvcmVQbGFjZUhvbGRlcihPUyk7CkBAIC0xNDEzLDEzICsxNDIzLDEwIEBACiAgIHByaW50KGxsdm06OmVycnMoKSwgUHJpbnRpbmdQb2xpY3koTE8pLCAiaWRlbnRpZmllciIpOwogICBsbHZtOjplcnJzKCkgPDwgJ1xuJzsKIH0KLXZvaWQgUXVhbFR5cGU6OmR1bXAoKSBjb25zdCB7Ci0gIGR1bXAoMCk7Ci19CiAKLXZvaWQgVHlwZTo6ZHVtcCgpIGNvbnN0IHsKLSAgUXVhbFR5cGUodGhpcywgMCkuZHVtcCgpOwotfQorTExWTV9EVU1QX01FVEhPRCB2b2lkIFF1YWxUeXBlOjpkdW1wKCkgY29uc3QgeyBkdW1wKDApOyB9CisKK0xMVk1fRFVNUF9NRVRIT0Qgdm9pZCBUeXBlOjpkdW1wKCkgY29uc3QgeyBRdWFsVHlwZSh0aGlzLCAwKS5kdW1wKCk7IH0KIAogc3RkOjpzdHJpbmcgUXVhbGlmaWVyczo6Z2V0QXNTdHJpbmcoKSBjb25zdCB7CiAgIExhbmdPcHRpb25zIExPOwpkaWZmIC0tZ2l0IGEvbGliL0FTVC9WVFRCdWlsZGVyLmNwcCBiL2xpYi9BU1QvVlRUQnVpbGRlci5jcHAKaW5kZXggNWNhNGU4Ni4uYzIxM2QxYyAxMDA2NDQKLS0tIGEvbGliL0FTVC9WVFRCdWlsZGVyLmNwcAorKysgYi9saWIvQVNUL1ZUVEJ1aWxkZXIuY3BwCkBAIC01NiwxNSArNTYsMTMgQEAKIHZvaWQgVlRUQnVpbGRlcjo6TGF5b3V0U2Vjb25kYXJ5VlRUcyhCYXNlU3Vib2JqZWN0IEJhc2UpIHsKICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBCYXNlLmdldEJhc2UoKTsKIAotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgIEUgPSBSRC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgCisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT5iYXNlcygpKSB7ICAgIAogICAgIC8vIERvbid0IGxheW91dCB2aXJ0dWFsIGJhc2VzLgotICAgIGlmIChJLT5pc1ZpcnR1YWwoKSkKKyAgICBpZiAoSS5pc1ZpcnR1YWwoKSkKICAgICAgICAgY29udGludWU7CiAKICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9Ci0gICAgICBjYXN0PENYWFJlY29yZERlY2w+KEktPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKKyAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CiAKICAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCA9IEN0eC5nZXRBU1RSZWNvcmRMYXlvdXQoUkQpOwogICAgIENoYXJVbml0cyBCYXNlT2Zmc2V0ID0gQmFzZS5nZXRCYXNlT2Zmc2V0KCkgKyAKQEAgLTg4LDEwICs4Niw5IEBACiAgIGlmICghUkQtPmdldE51bVZCYXNlcygpICYmICFCYXNlSXNNb3JhbGx5VmlydHVhbCkKICAgICByZXR1cm47CiAKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICBFID0gUkQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSRC0+YmFzZXMoKSkgewogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0KLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKIAogICAgIC8vIEl0YW5pdW0gQysrIEFCSSAyLjYuMjoKICAgICAvLyAgIFNlY29uZGFyeSB2aXJ0dWFsIHBvaW50ZXJzIGFyZSBwcmVzZW50IGZvciBhbGwgYmFzZXMgd2l0aCBlaXRoZXIKQEAgLTEwNiw3ICsxMDMsNyBAQAogICAgIGJvb2wgQmFzZURlY2xJc01vcmFsbHlWaXJ0dWFsID0gQmFzZUlzTW9yYWxseVZpcnR1YWw7CiAgICAgYm9vbCBCYXNlRGVjbElzTm9uVmlydHVhbFByaW1hcnlCYXNlID0gZmFsc2U7CiAgICAgQ2hhclVuaXRzIEJhc2VPZmZzZXQ7Ci0gICAgaWYgKEktPmlzVmlydHVhbCgpKSB7CisgICAgaWYgKEkuaXNWaXJ0dWFsKCkpIHsKICAgICAgIC8vIElnbm9yZSB2aXJ0dWFsIGJhc2VzIHRoYXQgd2UndmUgYWxyZWFkeSB2aXNpdGVkLgogICAgICAgaWYgKCFWQmFzZXMuaW5zZXJ0KEJhc2VEZWNsKSkKICAgICAgICAgY29udGludWU7CkBAIC0xNTMsMTMgKzE1MCwxMiBAQAogCiB2b2lkIFZUVEJ1aWxkZXI6OkxheW91dFZpcnR1YWxWVFRzKGNvbnN0IENYWFJlY29yZERlY2wgKlJELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXNpdGVkVmlydHVhbEJhc2VzU2V0VHkgJlZCYXNlcykgewotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgIEUgPSBSRC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT5iYXNlcygpKSB7CiAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSAKLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKICAgICAKICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgdmlydHVhbCBiYXNlLgotICAgIGlmIChJLT5pc1ZpcnR1YWwoKSkgeworICAgIGlmIChJLmlzVmlydHVhbCgpKSB7CiAgICAgICAvLyBDaGVjayBpZiB3ZSd2ZSBzZWVuIHRoaXMgYmFzZSBiZWZvcmUuCiAgICAgICBpZiAoIVZCYXNlcy5pbnNlcnQoQmFzZURlY2wpKQogICAgICAgICBjb250aW51ZTsKZGlmZiAtLWdpdCBhL2xpYi9BU1QvVlRhYmxlQnVpbGRlci5jcHAgYi9saWIvQVNUL1ZUYWJsZUJ1aWxkZXIuY3BwCmluZGV4IDVmN2FlMGYuLmM2YjM4ZDMgMTAwNjQ0Ci0tLSBhL2xpYi9BU1QvVlRhYmxlQnVpbGRlci5jcHAKKysrIGIvbGliL0FTVC9WVGFibGVCdWlsZGVyLmNwcApAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgImNsYW5nL0FTVC9DWFhJbmhlcml0YW5jZS5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9SZWNvcmRMYXlvdXQuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgpAQCAtMjY4LDExICsyNjksMTEgQEAKICAgY29uc3QgRnVuY3Rpb25UeXBlICpEZXJpdmVkRlQgPSBEZXJpdmVkTUQtPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpOwogICAKICAgLy8gQ2Fub25pY2FsaXplIHRoZSByZXR1cm4gdHlwZXMuCi0gIENhblF1YWxUeXBlIENhbkRlcml2ZWRSZXR1cm5UeXBlID0gCi0gICAgQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKERlcml2ZWRGVC0+Z2V0UmVzdWx0VHlwZSgpKTsKLSAgQ2FuUXVhbFR5cGUgQ2FuQmFzZVJldHVyblR5cGUgPSAKLSAgICBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoQmFzZUZULT5nZXRSZXN1bHRUeXBlKCkpOwotICAKKyAgQ2FuUXVhbFR5cGUgQ2FuRGVyaXZlZFJldHVyblR5cGUgPQorICAgICAgQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKERlcml2ZWRGVC0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgQ2FuUXVhbFR5cGUgQ2FuQmFzZVJldHVyblR5cGUgPQorICAgICAgQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKEJhc2VGVC0+Z2V0UmV0dXJuVHlwZSgpKTsKKwogICBhc3NlcnQoQ2FuRGVyaXZlZFJldHVyblR5cGUtPmdldFR5cGVDbGFzcygpID09IAogICAgICAgICAgQ2FuQmFzZVJldHVyblR5cGUtPmdldFR5cGVDbGFzcygpICYmIAogICAgICAgICAgIlR5cGVzIG11c3QgaGF2ZSBzYW1lIHR5cGUgY2xhc3MhIik7CkBAIC0zMzcsMTMgKzMzOCwxMiBAQAogICAgIE9mZnNldEluTGF5b3V0Q2xhc3M7CiAgIAogICAvLyBUcmF2ZXJzZSBvdXIgYmFzZXMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9IEktPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgIGZvciAoY29uc3QgYXV0byAmQiA6IFJELT5iYXNlcygpKSB7CisgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSBCLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CiAKICAgICBDaGFyVW5pdHMgQmFzZU9mZnNldDsKICAgICBDaGFyVW5pdHMgQmFzZU9mZnNldEluTGF5b3V0Q2xhc3M7Ci0gICAgaWYgKEktPmlzVmlydHVhbCgpKSB7CisgICAgaWYgKEIuaXNWaXJ0dWFsKCkpIHsKICAgICAgIC8vIENoZWNrIGlmIHdlJ3ZlIHZpc2l0ZWQgdGhpcyB2aXJ0dWFsIGJhc2UgYmVmb3JlLgogICAgICAgaWYgKFN1Ym9iamVjdE9mZnNldHMuY291bnQoc3RkOjptYWtlX3BhaXIoQmFzZURlY2wsIDApKSkKICAgICAgICAgY29udGludWU7CkBAIC0zNjMsNyArMzYzLDcgQEAKICAgICB9CiAKICAgICBDb21wdXRlQmFzZU9mZnNldHMoQmFzZVN1Ym9iamVjdChCYXNlRGVjbCwgQmFzZU9mZnNldCksIAotICAgICAgICAgICAgICAgICAgICAgICBJLT5pc1ZpcnR1YWwoKSwgQmFzZU9mZnNldEluTGF5b3V0Q2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICBCLmlzVmlydHVhbCgpLCBCYXNlT2Zmc2V0SW5MYXlvdXRDbGFzcywgCiAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym9iamVjdE9mZnNldHMsIFN1Ym9iamVjdExheW91dENsYXNzT2Zmc2V0cywgCiAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym9iamVjdENvdW50cyk7CiAgIH0KQEAgLTM3NCwxNiArMzc0LDE1IEBACiAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gQmFzZS5nZXRCYXNlKCk7CiAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0ID0gQ29udGV4dC5nZXRBU1RSZWNvcmRMYXlvdXQoUkQpOwogCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9IEktPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgIGZvciAoY29uc3QgYXV0byAmQiA6IFJELT5iYXNlcygpKSB7CisgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSBCLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CiAgICAgCiAgICAgLy8gSWdub3JlIGJhc2VzIHRoYXQgZG9uJ3QgaGF2ZSBhbnkgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zLgogICAgIGlmICghQmFzZURlY2wtPmlzUG9seW1vcnBoaWMoKSkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgQ2hhclVuaXRzIEJhc2VPZmZzZXQ7Ci0gICAgaWYgKEktPmlzVmlydHVhbCgpKSB7CisgICAgaWYgKEIuaXNWaXJ0dWFsKCkpIHsKICAgICAgIGlmICghVmlzaXRlZFZpcnR1YWxCYXNlcy5pbnNlcnQoQmFzZURlY2wpKSB7CiAgICAgICAgIC8vIFdlJ3ZlIHZpc2l0ZWQgdGhpcyBiYXNlIGJlZm9yZS4KICAgICAgICAgY29udGludWU7CkBAIC0zOTcsMjEgKzM5NiwyMiBAQAogICAgIGR1bXAoT3V0LCBCYXNlU3Vib2JqZWN0KEJhc2VEZWNsLCBCYXNlT2Zmc2V0KSwgVmlzaXRlZFZpcnR1YWxCYXNlcyk7CiAgIH0KIAotICBPdXQgPDwgIkZpbmFsIG92ZXJyaWRlcnMgZm9yICgiIDw8IFJELT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKSA8PCAiLCAiOworICBPdXQgPDwgIkZpbmFsIG92ZXJyaWRlcnMgZm9yICgiOworICBSRC0+cHJpbnRRdWFsaWZpZWROYW1lKE91dCk7CisgIE91dCA8PCAiLCAiOwogICBPdXQgPDwgQmFzZS5nZXRCYXNlT2Zmc2V0KCkuZ2V0UXVhbnRpdHkoKSA8PCAiKVxuIjsKIAogICAvLyBOb3cgZHVtcCB0aGUgb3ZlcnJpZGVycyBmb3IgdGhpcyBiYXNlIHN1Ym9iamVjdC4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IgSSA9IFJELT5tZXRob2RfYmVnaW4oKSwgCi0gICAgICAgRSA9IFJELT5tZXRob2RfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPSAqSTsKLQorICBmb3IgKGNvbnN0IGF1dG8gKk1EIDogUkQtPm1ldGhvZHMoKSkgewogICAgIGlmICghTUQtPmlzVmlydHVhbCgpKQogICAgICAgY29udGludWU7CiAgIAogICAgIE92ZXJyaWRlckluZm8gT3ZlcnJpZGVyID0gZ2V0T3ZlcnJpZGVyKE1ELCBCYXNlLmdldEJhc2VPZmZzZXQoKSk7CiAKLSAgICBPdXQgPDwgIiAgIiA8PCBNRC0+Z2V0UXVhbGlmaWVkTmFtZUFzU3RyaW5nKCkgPDwgIiAtICgiOwotICAgIE91dCA8PCBPdmVycmlkZXIuTWV0aG9kLT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKTsKKyAgICBPdXQgPDwgIiAgIjsKKyAgICBNRC0+cHJpbnRRdWFsaWZpZWROYW1lKE91dCk7CisgICAgT3V0IDw8ICIgLSAoIjsKKyAgICBPdmVycmlkZXIuTWV0aG9kLT5wcmludFF1YWxpZmllZE5hbWUoT3V0KTsKICAgICBPdXQgPDwgIiwgIiA8PCBPdmVycmlkZXIuT2Zmc2V0LmdldFF1YW50aXR5KCkgPDwgJyknOwogCiAgICAgQmFzZU9mZnNldCBPZmZzZXQ7CkBAIC00MjAsOCArNDIwLDEwIEBACiAKICAgICBpZiAoIU9mZnNldC5pc0VtcHR5KCkpIHsKICAgICAgIE91dCA8PCAiIFtyZXQtYWRqOiAiOwotICAgICAgaWYgKE9mZnNldC5WaXJ0dWFsQmFzZSkKLSAgICAgICAgT3V0IDw8IE9mZnNldC5WaXJ0dWFsQmFzZS0+Z2V0UXVhbGlmaWVkTmFtZUFzU3RyaW5nKCkgPDwgIiB2YmFzZSwgIjsKKyAgICAgIGlmIChPZmZzZXQuVmlydHVhbEJhc2UpIHsKKyAgICAgICAgT2Zmc2V0LlZpcnR1YWxCYXNlLT5wcmludFF1YWxpZmllZE5hbWUoT3V0KTsKKyAgICAgICAgT3V0IDw8ICIgdmJhc2UsICI7CisgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICBPdXQgPDwgT2Zmc2V0Lk5vblZpcnR1YWxPZmZzZXQuZ2V0UXVhbnRpdHkoKSA8PCAiIG52XSI7CiAgICAgfQpAQCAtNDcyLDEwICs0NzQsMTAgQEAKICAgLy8gbGlzdCBoZXJlIGJlY2F1c2UgdGhlcmUgaXNuJ3QgbmVjZXNzYXJpbHkgYW4gaW5oZXJpdGFuY2UKICAgLy8gcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHR3byBtZXRob2RzLgogICBpZiAoTFQtPmdldFR5cGVRdWFscygpICE9IFJULT5nZXRUeXBlUXVhbHMoKSB8fAotICAgICAgTFQtPmdldE51bUFyZ3MoKSAhPSBSVC0+Z2V0TnVtQXJncygpKQorICAgICAgTFQtPmdldE51bVBhcmFtcygpICE9IFJULT5nZXROdW1QYXJhbXMoKSkKICAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBMVC0+Z2V0TnVtQXJncygpOyBJICE9IEU7ICsrSSkKLSAgICBpZiAoTFQtPmdldEFyZ1R5cGUoSSkgIT0gUlQtPmdldEFyZ1R5cGUoSSkpCisgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBMVC0+Z2V0TnVtUGFyYW1zKCk7IEkgIT0gRTsgKytJKQorICAgIGlmIChMVC0+Z2V0UGFyYW1UeXBlKEkpICE9IFJULT5nZXRQYXJhbVR5cGUoSSkpCiAgICAgICByZXR1cm4gZmFsc2U7CiAgIHJldHVybiB0cnVlOwogfQpAQCAtNjg0LDEwICs2ODYsNyBAQAogICB9CiAgIAogICAvLyBBZGQgdGhlIHZjYWxsIG9mZnNldHMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6bWV0aG9kX2l0ZXJhdG9yIEkgPSBSRC0+bWV0aG9kX2JlZ2luKCksCi0gICAgICAgRSA9IFJELT5tZXRob2RfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPSAqSTsKLSAgICAKKyAgZm9yIChjb25zdCBhdXRvICpNRCA6IFJELT5tZXRob2RzKCkpIHsKICAgICBpZiAoIU1ELT5pc1ZpcnR1YWwoKSkKICAgICAgIGNvbnRpbnVlOwogCkBAIC03MTUsMTMgKzcxNCwxMSBAQAogICB9CiAKICAgLy8gQW5kIGl0ZXJhdGUgb3ZlciBhbGwgbm9uLXZpcnR1YWwgYmFzZXMgKGlnbm9yaW5nIHRoZSBwcmltYXJ5IGJhc2UpLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgIEUgPSBSRC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gIAotICAgIGlmIChJLT5pc1ZpcnR1YWwoKSkKKyAgZm9yIChjb25zdCBhdXRvICZCIDogUkQtPmJhc2VzKCkpIHsgIAorICAgIGlmIChCLmlzVmlydHVhbCgpKQogICAgICAgY29udGludWU7CiAKLSAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9IEktPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSBCLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CiAgICAgaWYgKEJhc2VEZWNsID09IFByaW1hcnlCYXNlKQogICAgICAgY29udGludWU7CiAKQEAgLTc0MSwxMiArNzM4LDExIEBACiAgICAgQ29udGV4dC5nZXRBU1RSZWNvcmRMYXlvdXQoTGF5b3V0Q2xhc3MpOwogCiAgIC8vIEFkZCB2YmFzZSBvZmZzZXRzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgIEUgPSBSRC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSBJLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOworICBmb3IgKGNvbnN0IGF1dG8gJkIgOiBSRC0+YmFzZXMoKSkgeworICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0gQi5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOwogCiAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHZpcnR1YWwgYmFzZSB0aGF0IHdlIGhhdmVuJ3QgdmlzaXRlZCBiZWZvcmUuCi0gICAgaWYgKEktPmlzVmlydHVhbCgpICYmIFZpc2l0ZWRWaXJ0dWFsQmFzZXMuaW5zZXJ0KEJhc2VEZWNsKSkgeworICAgIGlmIChCLmlzVmlydHVhbCgpICYmIFZpc2l0ZWRWaXJ0dWFsQmFzZXMuaW5zZXJ0KEJhc2VEZWNsKSkgewogICAgICAgQ2hhclVuaXRzIE9mZnNldCA9IAogICAgICAgICBMYXlvdXRDbGFzc0xheW91dC5nZXRWQmFzZUNsYXNzT2Zmc2V0KEJhc2VEZWNsKSAtIE9mZnNldEluTGF5b3V0Q2xhc3M7CiAKQEAgLTE1MDksMTAgKzE1MDUsNyBAQAogICBOZXdWaXJ0dWFsRnVuY3Rpb25zVHkgTmV3VmlydHVhbEZ1bmN0aW9uczsKIAogICAvLyBOb3cgZ28gdGhyb3VnaCBhbGwgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zIGFuZCBhZGQgdGhlbS4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IgSSA9IFJELT5tZXRob2RfYmVnaW4oKSwKLSAgICAgICBFID0gUkQtPm1ldGhvZF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBDWFhNZXRob2REZWNsICpNRCA9ICpJOwotICAKKyAgZm9yIChjb25zdCBhdXRvICpNRCA6IFJELT5tZXRob2RzKCkpIHsKICAgICBpZiAoIU1ELT5pc1ZpcnR1YWwoKSkKICAgICAgIGNvbnRpbnVlOwogCkBAIC0xNzU5LDEzICsxNzUyLDEyIEBACiAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0ID0gQ29udGV4dC5nZXRBU1RSZWNvcmRMYXlvdXQoUkQpOwogICBjb25zdCBDWFhSZWNvcmREZWNsICpQcmltYXJ5QmFzZSA9IExheW91dC5nZXRQcmltYXJ5QmFzZSgpOwogICAKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICBFID0gUkQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICBmb3IgKGNvbnN0IGF1dG8gJkIgOiBSRC0+YmFzZXMoKSkgewogICAgIC8vIElnbm9yZSB2aXJ0dWFsIGJhc2VzLCB3ZSdsbCBlbWl0IHRoZW0gbGF0ZXIuCi0gICAgaWYgKEktPmlzVmlydHVhbCgpKQorICAgIGlmIChCLmlzVmlydHVhbCgpKQogICAgICAgY29udGludWU7CiAgICAgCi0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSBJLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOworICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0gQi5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOwogCiAgICAgLy8gSWdub3JlIGJhc2VzIHRoYXQgZG9uJ3QgaGF2ZSBhIHZ0YWJsZS4KICAgICBpZiAoIUJhc2VEZWNsLT5pc0R5bmFtaWNDbGFzcygpKQpAQCAtMTgzOCwxMyArMTgzMCwxMiBAQAogICB9CiAKICAgLy8gVHJhdmVyc2UgYmFzZXMsIGxvb2tpbmcgZm9yIG1vcmUgcHJpbWFyeSB2aXJ0dWFsIGJhc2VzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgIEUgPSBSRC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSBJLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOworICBmb3IgKGNvbnN0IGF1dG8gJkIgOiBSRC0+YmFzZXMoKSkgeworICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0gQi5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOwogCiAgICAgQ2hhclVuaXRzIEJhc2VPZmZzZXRJbkxheW91dENsYXNzOwogICAgIAotICAgIGlmIChJLT5pc1ZpcnR1YWwoKSkgeworICAgIGlmIChCLmlzVmlydHVhbCgpKSB7CiAgICAgICBpZiAoIVZCYXNlcy5pbnNlcnQoQmFzZURlY2wpKQogICAgICAgICBjb250aW51ZTsKICAgICAgIApAQCAtMTg2OCwxMyArMTg1OSwxMiBAQAogICAvLyAgIFRoZW4gY29tZSB0aGUgdmlydHVhbCBiYXNlIHZpcnR1YWwgdGFibGVzLCBhbHNvIGluIGluaGVyaXRhbmNlIGdyYXBoCiAgIC8vICAgb3JkZXIsIGFuZCBhZ2FpbiBleGNsdWRpbmcgcHJpbWFyeSBiYXNlcyAod2hpY2ggc2hhcmUgdmlydHVhbCB0YWJsZXMgd2l0aAogICAvLyAgIHRoZSBjbGFzc2VzIGZvciB3aGljaCB0aGV5IGFyZSBwcmltYXJ5KS4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICBFID0gUkQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0gSS0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKKyAgZm9yIChjb25zdCBhdXRvICZCIDogUkQtPmJhc2VzKCkpIHsKKyAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9IEIuZ2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKIAogICAgIC8vIENoZWNrIGlmIHRoaXMgYmFzZSBuZWVkcyBhIHZ0YWJsZS4gKElmIGl0J3MgdmlydHVhbCwgbm90IGEgcHJpbWFyeSBiYXNlCiAgICAgLy8gb2Ygc29tZSBvdGhlciBjbGFzcywgYW5kIHdlIGhhdmVuJ3QgdmlzaXRlZCBpdCBiZWZvcmUpLgotICAgIGlmIChJLT5pc1ZpcnR1YWwoKSAmJiBCYXNlRGVjbC0+aXNEeW5hbWljQ2xhc3MoKSAmJiAKKyAgICBpZiAoQi5pc1ZpcnR1YWwoKSAmJiBCYXNlRGVjbC0+aXNEeW5hbWljQ2xhc3MoKSAmJiAKICAgICAgICAgIVByaW1hcnlWaXJ0dWFsQmFzZXMuY291bnQoQmFzZURlY2wpICYmIFZCYXNlcy5pbnNlcnQoQmFzZURlY2wpKSB7CiAgICAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJk1vc3REZXJpdmVkQ2xhc3NMYXlvdXQgPQogICAgICAgICBDb250ZXh0LmdldEFTVFJlY29yZExheW91dChNb3N0RGVyaXZlZENsYXNzKTsKQEAgLTE5MDAsMjEgKzE4OTAsNiBAQAogICB9CiB9CiAKLXN0cnVjdCBJdGFuaXVtVGh1bmtJbmZvQ29tcGFyYXRvciB7Ci0gIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgVGh1bmtJbmZvICZMSFMsIGNvbnN0IFRodW5rSW5mbyAmUkhTKSB7Ci0gICAgYXNzZXJ0KExIUy5NZXRob2QgPT0gMCk7Ci0gICAgYXNzZXJ0KFJIUy5NZXRob2QgPT0gMCk7Ci0KLSAgICBpZiAoTEhTLlRoaXMgIT0gUkhTLlRoaXMpCi0gICAgICByZXR1cm4gTEhTLlRoaXMgPCBSSFMuVGhpczsKLQotICAgIGlmIChMSFMuUmV0dXJuICE9IFJIUy5SZXR1cm4pCi0gICAgICByZXR1cm4gTEhTLlJldHVybiA8IFJIUy5SZXR1cm47Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX07Ci0KIC8vLyBkdW1wTGF5b3V0IC0gRHVtcCB0aGUgdnRhYmxlIGxheW91dC4KIHZvaWQgSXRhbml1bVZUYWJsZUJ1aWxkZXI6OmR1bXBMYXlvdXQocmF3X29zdHJlYW0gJk91dCkgewogICAvLyBGSVhNRTogd3JpdGUgbW9yZSB0ZXN0cyB0aGF0IGFjdHVhbGx5IHVzZSB0aGUgZHVtcExheW91dCBvdXRwdXQgdG8gcHJldmVudApAQCAtMTkyMiwxMiArMTg5NywxMyBAQAogCiAgIGlmIChpc0J1aWxkaW5nQ29uc3RydWN0b3JWVGFibGUoKSkgewogICAgIE91dCA8PCAiQ29uc3RydWN0aW9uIHZ0YWJsZSBmb3IgKCciOwotICAgIE91dCA8PCBNb3N0RGVyaXZlZENsYXNzLT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKSA8PCAiJywgIjsKKyAgICBNb3N0RGVyaXZlZENsYXNzLT5wcmludFF1YWxpZmllZE5hbWUoT3V0KTsKKyAgICBPdXQgPDwgIicsICI7CiAgICAgT3V0IDw8IE1vc3REZXJpdmVkQ2xhc3NPZmZzZXQuZ2V0UXVhbnRpdHkoKSA8PCAiKSBpbiAnIjsKLSAgICBPdXQgPDwgTGF5b3V0Q2xhc3MtPmdldFF1YWxpZmllZE5hbWVBc1N0cmluZygpOworICAgIExheW91dENsYXNzLT5wcmludFF1YWxpZmllZE5hbWUoT3V0KTsKICAgfSBlbHNlIHsKICAgICBPdXQgPDwgIlZ0YWJsZSBmb3IgJyI7Ci0gICAgT3V0IDw8IE1vc3REZXJpdmVkQ2xhc3MtPmdldFF1YWxpZmllZE5hbWVBc1N0cmluZygpOworICAgIE1vc3REZXJpdmVkQ2xhc3MtPnByaW50UXVhbGlmaWVkTmFtZShPdXQpOwogICB9CiAgIE91dCA8PCAiJyAoIiA8PCBDb21wb25lbnRzLnNpemUoKSA8PCAiIGVudHJpZXMpLlxuIjsKIApAQCAtMTk3Myw3ICsxOTQ5LDggQEAKICAgICAgIGJyZWFrOwogICAgIAogICAgIGNhc2UgVlRhYmxlQ29tcG9uZW50OjpDS19SVFRJOgotICAgICAgT3V0IDw8IENvbXBvbmVudC5nZXRSVFRJRGVjbCgpLT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKSA8PCAiIFJUVEkiOworICAgICAgQ29tcG9uZW50LmdldFJUVElEZWNsKCktPnByaW50UXVhbGlmaWVkTmFtZShPdXQpOworICAgICAgT3V0IDw8ICIgUlRUSSI7CiAgICAgICBicmVhazsKICAgICAKICAgICBjYXNlIFZUYWJsZUNvbXBvbmVudDo6Q0tfRnVuY3Rpb25Qb2ludGVyOiB7CkBAIC0yMDI4LDcgKzIwMDUsNyBAQAogICAgICAgCiAgICAgICBjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqREQgPSBDb21wb25lbnQuZ2V0RGVzdHJ1Y3RvckRlY2woKTsKICAgICAgIAotICAgICAgT3V0IDw8IERELT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKTsKKyAgICAgIERELT5wcmludFF1YWxpZmllZE5hbWUoT3V0KTsKICAgICAgIGlmIChJc0NvbXBsZXRlKQogICAgICAgICBPdXQgPDwgIigpIFtjb21wbGV0ZV0iOwogICAgICAgZWxzZQpAQCAtMjA3OCw3ICsyMDU1LDggQEAKICAgICAgICAgY29uc3QgQmFzZVN1Ym9iamVjdCAmQmFzZSA9IAogICAgICAgICAgIEFkZHJlc3NQb2ludHNCeUluZGV4LmZpbmQoTmV4dEluZGV4KS0+c2Vjb25kOwogICAgICAgICAKLSAgICAgICAgT3V0IDw8ICIgICAgICAgLS0gKCIgPDwgQmFzZS5nZXRCYXNlKCktPmdldFF1YWxpZmllZE5hbWVBc1N0cmluZygpOworICAgICAgICBPdXQgPDwgIiAgICAgICAtLSAoIjsKKyAgICAgICAgQmFzZS5nZXRCYXNlKCktPnByaW50UXVhbGlmaWVkTmFtZShPdXQpOwogICAgICAgICBPdXQgPDwgIiwgIiA8PCBCYXNlLmdldEJhc2VPZmZzZXQoKS5nZXRRdWFudGl0eSgpOwogICAgICAgICBPdXQgPDwgIikgdnRhYmxlIGFkZHJlc3MgLS1cbiI7CiAgICAgICB9IGVsc2UgewpAQCAtMjEyNCw3ICsyMTAyLDggQEAKICAgICB9CiAgICAgCiAgICAgT3V0IDw8ICJWaXJ0dWFsIGJhc2Ugb2Zmc2V0IG9mZnNldHMgZm9yICciOwotICAgIE91dCA8PCBNb3N0RGVyaXZlZENsYXNzLT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKSA8PCAiJyAoIjsKKyAgICBNb3N0RGVyaXZlZENsYXNzLT5wcmludFF1YWxpZmllZE5hbWUoT3V0KTsKKyAgICBPdXQgPDwgIicgKCI7CiAgICAgT3V0IDw8IENsYXNzTmFtZXNBbmRPZmZzZXRzLnNpemUoKTsKICAgICBPdXQgPDwgKENsYXNzTmFtZXNBbmRPZmZzZXRzLnNpemUoKSA9PSAxID8gIiBlbnRyeSIgOiAiIGVudHJpZXMiKSA8PCAiKS5cbiI7CiAKQEAgLTIxNTgsNyArMjEzNywxMCBAQAogCiAgICAgICBUaHVua0luZm9WZWN0b3JUeSBUaHVua3NWZWN0b3IgPSBUaHVua3NbTURdOwogICAgICAgc3RkOjpzb3J0KFRodW5rc1ZlY3Rvci5iZWdpbigpLCBUaHVua3NWZWN0b3IuZW5kKCksCi0gICAgICAgICAgICAgICAgSXRhbml1bVRodW5rSW5mb0NvbXBhcmF0b3IoKSk7CisgICAgICAgICAgICAgICAgW10oY29uc3QgVGh1bmtJbmZvICZMSFMsIGNvbnN0IFRodW5rSW5mbyAmUkhTKSB7CisgICAgICAgIGFzc2VydChMSFMuTWV0aG9kID09IDAgJiYgUkhTLk1ldGhvZCA9PSAwKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dGllKExIUy5UaGlzLCBMSFMuUmV0dXJuKSA8IHN0ZDo6dGllKFJIUy5UaGlzLCBSSFMuUmV0dXJuKTsKKyAgICAgIH0pOwogCiAgICAgICBPdXQgPDwgIlRodW5rcyBmb3IgJyIgPDwgTWV0aG9kTmFtZSA8PCAiJyAoIiA8PCBUaHVua3NWZWN0b3Iuc2l6ZSgpOwogICAgICAgT3V0IDw8IChUaHVua3NWZWN0b3Iuc2l6ZSgpID09IDEgPyAiIGVudHJ5IiA6ICIgZW50cmllcyIpIDw8ICIpLlxuIjsKQEAgLTIyMDMsMTAgKzIxODUsNyBAQAogICAvLyBTdG9yZSB0aGVtIGluIGEgbWFwIGtleWVkIGJ5IHRoZSBpbmRleCBzbyB3ZSdsbCBnZXQgYSBzb3J0ZWQgdGFibGUuCiAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnN0cmluZz4gSW5kaWNlc01hcDsKIAotICBmb3IgKENYWFJlY29yZERlY2w6Om1ldGhvZF9pdGVyYXRvciBpID0gTW9zdERlcml2ZWRDbGFzcy0+bWV0aG9kX2JlZ2luKCksCi0gICAgICAgZSA9IE1vc3REZXJpdmVkQ2xhc3MtPm1ldGhvZF9lbmQoKTsgaSAhPSBlOyArK2kpIHsKLSAgICBjb25zdCBDWFhNZXRob2REZWNsICpNRCA9ICppOwotICAgIAorICBmb3IgKGNvbnN0IGF1dG8gKk1EIDogTW9zdERlcml2ZWRDbGFzcy0+bWV0aG9kcygpKSB7CiAgICAgLy8gV2Ugb25seSB3YW50IHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9ucy4KICAgICBpZiAoIU1ELT5pc1ZpcnR1YWwoKSkKICAgICAgIGNvbnRpbnVlOwpAQCAtMjIzMCw3ICsyMjA5LDcgQEAKICAgLy8gUHJpbnQgdGhlIHZ0YWJsZSBpbmRpY2VzIGZvciBhbGwgdGhlIG1lbWJlciBmdW5jdGlvbnMuCiAgIGlmICghSW5kaWNlc01hcC5lbXB0eSgpKSB7CiAgICAgT3V0IDw8ICJWVGFibGUgaW5kaWNlcyBmb3IgJyI7Ci0gICAgT3V0IDw8IE1vc3REZXJpdmVkQ2xhc3MtPmdldFF1YWxpZmllZE5hbWVBc1N0cmluZygpOworICAgIE1vc3REZXJpdmVkQ2xhc3MtPnByaW50UXVhbGlmaWVkTmFtZShPdXQpOwogICAgIE91dCA8PCAiJyAoIiA8PCBJbmRpY2VzTWFwLnNpemUoKSA8PCAiIGVudHJpZXMpLlxuIjsKIAogICAgIGZvciAoc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgSSA9IEluZGljZXNNYXAuYmVnaW4oKSwKQEAgLTIyNDUsMTcgKzIyMjQsNiBAQAogCiAgIE91dCA8PCAnXG4nOwogfQotCi1zdHJ1Y3QgVlRhYmxlVGh1bmtzQ29tcGFyYXRvciB7Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBWVGFibGVMYXlvdXQ6OlZUYWJsZVRodW5rVHkgJkxIUywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFZUYWJsZUxheW91dDo6VlRhYmxlVGh1bmtUeSAmUkhTKSB7Ci0gICAgaWYgKExIUy5maXJzdCA9PSBSSFMuZmlyc3QpIHsKLSAgICAgIGFzc2VydChMSFMuc2Vjb25kID09IFJIUy5zZWNvbmQgJiYKLSAgICAgICAgICAgICAiRGlmZmVyZW50IHRodW5rcyBzaG91bGQgaGF2ZSB1bmlxdWUgaW5kaWNlcyEiKTsKLSAgICB9Ci0gICAgcmV0dXJuIExIUy5maXJzdCA8IFJIUy5maXJzdDsKLSAgfQotfTsKIH0KIAogVlRhYmxlTGF5b3V0OjpWVGFibGVMYXlvdXQodWludDY0X3QgTnVtVlRhYmxlQ29tcG9uZW50cywKQEAgLTIyNzYsMTQgKzIyNDQsMTggQEAKICAgICAgICAgICAgIHRoaXMtPlZUYWJsZVRodW5rcy5nZXQoKSk7CiAgIHN0ZDo6c29ydCh0aGlzLT5WVGFibGVUaHVua3MuZ2V0KCksCiAgICAgICAgICAgICB0aGlzLT5WVGFibGVUaHVua3MuZ2V0KCkgKyBOdW1WVGFibGVUaHVua3MsCi0gICAgICAgICAgICBWVGFibGVUaHVua3NDb21wYXJhdG9yKCkpOworICAgICAgICAgICAgW10oY29uc3QgVlRhYmxlTGF5b3V0OjpWVGFibGVUaHVua1R5ICZMSFMsCisgICAgICAgICAgICAgICBjb25zdCBWVGFibGVMYXlvdXQ6OlZUYWJsZVRodW5rVHkgJlJIUykgeworICAgIGFzc2VydCgoTEhTLmZpcnN0ICE9IFJIUy5maXJzdCB8fCBMSFMuc2Vjb25kID09IFJIUy5zZWNvbmQpICYmCisgICAgICAgICAgICJEaWZmZXJlbnQgdGh1bmtzIHNob3VsZCBoYXZlIHVuaXF1ZSBpbmRpY2VzISIpOworICAgIHJldHVybiBMSFMuZmlyc3QgPCBSSFMuZmlyc3Q7CisgIH0pOwogfQogCiBWVGFibGVMYXlvdXQ6On5WVGFibGVMYXlvdXQoKSB7IH0KIAogSXRhbml1bVZUYWJsZUNvbnRleHQ6Okl0YW5pdW1WVGFibGVDb250ZXh0KEFTVENvbnRleHQgJkNvbnRleHQpCi0gIDogSXNNaWNyb3NvZnRBQkkoQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkuZ2V0Q1hYQUJJKCkuaXNNaWNyb3NvZnQoKSkgewotfQorICAgIDogVlRhYmxlQ29udGV4dEJhc2UoLypNUz0qL2ZhbHNlKSB7fQogCiBJdGFuaXVtVlRhYmxlQ29udGV4dDo6fkl0YW5pdW1WVGFibGVDb250ZXh0KCkgewogICBsbHZtOjpEZWxldGVDb250YWluZXJTZWNvbmRzKFZUYWJsZUxheW91dHMpOwpAQCAtMjM0OCw4ICsyMzIwLDYgQEAKIAogdm9pZAogSXRhbml1bVZUYWJsZUNvbnRleHQ6OmNvbXB1dGVWVGFibGVSZWxhdGVkSW5mb3JtYXRpb24oY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKLSAgYXNzZXJ0KCFJc01pY3Jvc29mdEFCSSAmJiAiU2hvdWxkbid0IGJlIGNhbGxlZCBpbiB0aGlzIEFCSSEiKTsKLQogICBjb25zdCBWVGFibGVMYXlvdXQgKiZFbnRyeSA9IFZUYWJsZUxheW91dHNbUkRdOwogCiAgIC8vIENoZWNrIGlmIHdlJ3ZlIGNvbXB1dGVkIHRoaXMgaW5mb3JtYXRpb24gYmVmb3JlLgpAQCAtMjQ0NCw2ICsyNDE0LDkgQEAKICAgdHlwZWRlZiBsbHZtOjpEZW5zZU1hcDxHbG9iYWxEZWNsLCBNZXRob2RWRlRhYmxlTG9jYXRpb24+CiAgICAgTWV0aG9kVkZUYWJsZUxvY2F0aW9uc1R5OwogCisgIHR5cGVkZWYgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8TWV0aG9kVkZUYWJsZUxvY2F0aW9uc1R5Ojpjb25zdF9pdGVyYXRvcj4KKyAgICBtZXRob2RfbG9jYXRpb25zX3JhbmdlOworCiBwcml2YXRlOgogICAvLy8gVlRhYmxlcyAtIEdsb2JhbCB2dGFibGUgaW5mb3JtYXRpb24uCiAgIE1pY3Jvc29mdFZUYWJsZUNvbnRleHQgJlZUYWJsZXM7CkBAIC0yNDU3LDcgKzI0MzAsNyBAQAogCiAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTW9zdERlcml2ZWRDbGFzc0xheW91dDsKIAotICBWRlB0ckluZm8gV2hpY2hWRlB0cjsKKyAgY29uc3QgVlB0ckluZm8gJldoaWNoVkZQdHI7CiAKICAgLy8vIEZpbmFsT3ZlcnJpZGVycyAtIFRoZSBmaW5hbCBvdmVycmlkZXJzIG9mIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MuCiAgIGNvbnN0IEZpbmFsT3ZlcnJpZGVycyBPdmVycmlkZXJzOwpAQCAtMjUyMSwxMSArMjQ5NCw4IEBACiAgIH0KIAogICAvLy8gQ29tcHV0ZVRoaXNPZmZzZXQgLSBSZXR1cm5zIHRoZSAndGhpcycgYXJndW1lbnQgb2Zmc2V0IGZvciB0aGUgZ2l2ZW4KLSAgLy8vIG1ldGhvZCBpbiB0aGUgZ2l2ZW4gc3Vib2JqZWN0LCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAvLy8gTW9zdERlcml2ZWRDbGFzcy4KLSAgQ2hhclVuaXRzIENvbXB1dGVUaGlzT2Zmc2V0KGNvbnN0IENYWE1ldGhvZERlY2wgKk1ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVN1Ym9iamVjdCBCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluYWxPdmVycmlkZXJzOjpPdmVycmlkZXJJbmZvIE92ZXJyaWRlcik7CisgIC8vLyBtZXRob2QsIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1vc3REZXJpdmVkQ2xhc3MuCisgIENoYXJVbml0cyBDb21wdXRlVGhpc09mZnNldChGaW5hbE92ZXJyaWRlcnM6Ok92ZXJyaWRlckluZm8gT3ZlcnJpZGVyKTsKIAogICB2b2lkIENhbGN1bGF0ZVZ0b3JkaXNwQWRqdXN0bWVudChGaW5hbE92ZXJyaWRlcnM6Ok92ZXJyaWRlckluZm8gT3ZlcnJpZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgVGhpc09mZnNldCwgVGhpc0FkanVzdG1lbnQgJlRBKTsKQEAgLTI1MzMsMTcgKzI1MDMsMjEgQEAKICAgLy8vIEFkZE1ldGhvZCAtIEFkZCBhIHNpbmdsZSB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbiB0byB0aGUgdmZ0YWJsZQogICAvLy8gY29tcG9uZW50cyB2ZWN0b3IuCiAgIHZvaWQgQWRkTWV0aG9kKGNvbnN0IENYWE1ldGhvZERlY2wgKk1ELCBUaHVua0luZm8gVEkpIHsKKyAgICBpZiAoIVRJLmlzRW1wdHkoKSkgeworICAgICAgVlRhYmxlVGh1bmtzW0NvbXBvbmVudHMuc2l6ZSgpXSA9IFRJOworICAgICAgQWRkVGh1bmsoTUQsIFRJKTsKKyAgICB9CiAgICAgaWYgKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpERCA9IGR5bl9jYXN0PENYWERlc3RydWN0b3JEZWNsPihNRCkpIHsKICAgICAgIGFzc2VydChUSS5SZXR1cm4uaXNFbXB0eSgpICYmCiAgICAgICAgICAgICAgIkRlc3RydWN0b3IgY2FuJ3QgaGF2ZSByZXR1cm4gYWRqdXN0bWVudCEiKTsKICAgICAgIENvbXBvbmVudHMucHVzaF9iYWNrKFZUYWJsZUNvbXBvbmVudDo6TWFrZURlbGV0aW5nRHRvcihERCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIVRJLmlzRW1wdHkoKSkKLSAgICAgICAgVlRhYmxlVGh1bmtzW0NvbXBvbmVudHMuc2l6ZSgpXSA9IFRJOwogICAgICAgQ29tcG9uZW50cy5wdXNoX2JhY2soVlRhYmxlQ29tcG9uZW50OjpNYWtlRnVuY3Rpb24oTUQpKTsKICAgICB9CiAgIH0KIAorICBib29sIE5lZWRzUmV0dXJuQWRqdXN0aW5nVGh1bmsoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQpOworCiAgIC8vLyBBZGRNZXRob2RzIC0gQWRkIHRoZSBtZXRob2RzIG9mIHRoaXMgYmFzZSBzdWJvYmplY3QgYW5kIHRoZSByZWxldmFudAogICAvLy8gc3ViYmFzZXMgdG8gdGhlIHZmdGFibGUgd2UncmUgY3VycmVudGx5IGxheWluZyBvdXQuCiAgIHZvaWQgQWRkTWV0aG9kcyhCYXNlU3Vib2JqZWN0IEJhc2UsIHVuc2lnbmVkIEJhc2VEZXB0aCwKQEAgLTI1NTcsNiArMjUzMSw3IEBACiAgICAgQmFzZXNTZXRWZWN0b3JUeSBWaXNpdGVkQmFzZXM7CiAgICAgQWRkTWV0aG9kcyhCYXNlU3Vib2JqZWN0KE1vc3REZXJpdmVkQ2xhc3MsIENoYXJVbml0czo6WmVybygpKSwgMCwgMCwKICAgICAgICAgICAgICAgIFZpc2l0ZWRCYXNlcyk7CisgICAgYXNzZXJ0KENvbXBvbmVudHMuc2l6ZSgpICYmICJ2ZnRhYmxlIGNhbid0IGJlIGVtcHR5Iik7CiAKICAgICBhc3NlcnQoTWV0aG9kVkZUYWJsZUxvY2F0aW9ucy5lbXB0eSgpKTsKICAgICBmb3IgKE1ldGhvZEluZm9NYXBUeTo6Y29uc3RfaXRlcmF0b3IgSSA9IE1ldGhvZEluZm9NYXAuYmVnaW4oKSwKQEAgLTI1NjcsOCArMjU0Miw4IEBACiAgICAgICAvLyBhbmQgdGhlIGVudHJpZXMgc2hhZG93ZWQgYnkgcmV0dXJuIGFkanVzdGluZyB0aHVua3MuCiAgICAgICBpZiAoTUQtPmdldFBhcmVudCgpICE9IE1vc3REZXJpdmVkQ2xhc3MgfHwgTUkuU2hhZG93ZWQpCiAgICAgICAgIGNvbnRpbnVlOwotICAgICAgTWV0aG9kVkZUYWJsZUxvY2F0aW9uIExvYyhNSS5WQlRhYmxlSW5kZXgsIFdoaWNoVkZQdHIuTGFzdFZCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGljaFZGUHRyLlZGUHRyT2Zmc2V0LCBNSS5WRlRhYmxlSW5kZXgpOworICAgICAgTWV0aG9kVkZUYWJsZUxvY2F0aW9uIExvYyhNSS5WQlRhYmxlSW5kZXgsIFdoaWNoVkZQdHIuZ2V0VkJhc2VXaXRoVlB0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGljaFZGUHRyLk5vblZpcnR1YWxPZmZzZXQsIE1JLlZGVGFibGVJbmRleCk7CiAgICAgICBpZiAoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkREID0gZHluX2Nhc3Q8Q1hYRGVzdHJ1Y3RvckRlY2w+KE1EKSkgewogICAgICAgICBNZXRob2RWRlRhYmxlTG9jYXRpb25zW0dsb2JhbERlY2woREQsIER0b3JfRGVsZXRpbmcpXSA9IExvYzsKICAgICAgIH0gZWxzZSB7CkBAIC0yNTg2LDEyICsyNTYxLDEyIEBACiAKIHB1YmxpYzoKICAgVkZUYWJsZUJ1aWxkZXIoTWljcm9zb2Z0VlRhYmxlQ29udGV4dCAmVlRhYmxlcywKLSAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTW9zdERlcml2ZWRDbGFzcywgVkZQdHJJbmZvIFdoaWNoKQorICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpNb3N0RGVyaXZlZENsYXNzLCBjb25zdCBWUHRySW5mbyAqV2hpY2gpCiAgICAgICA6IFZUYWJsZXMoVlRhYmxlcyksCiAgICAgICAgIENvbnRleHQoTW9zdERlcml2ZWRDbGFzcy0+Z2V0QVNUQ29udGV4dCgpKSwKICAgICAgICAgTW9zdERlcml2ZWRDbGFzcyhNb3N0RGVyaXZlZENsYXNzKSwKICAgICAgICAgTW9zdERlcml2ZWRDbGFzc0xheW91dChDb250ZXh0LmdldEFTVFJlY29yZExheW91dChNb3N0RGVyaXZlZENsYXNzKSksCi0gICAgICAgIFdoaWNoVkZQdHIoV2hpY2gpLAorICAgICAgICBXaGljaFZGUHRyKCpXaGljaCksCiAgICAgICAgIE92ZXJyaWRlcnMoTW9zdERlcml2ZWRDbGFzcywgQ2hhclVuaXRzKCksIE1vc3REZXJpdmVkQ2xhc3MpIHsKICAgICBMYXlvdXRWRlRhYmxlKCk7CiAKQEAgLTI2MDUsMTIgKzI1ODAsOSBAQAogCiAgIFRodW5rc01hcFR5Ojpjb25zdF9pdGVyYXRvciB0aHVua3NfZW5kKCkgY29uc3QgeyByZXR1cm4gVGh1bmtzLmVuZCgpOyB9CiAKLSAgTWV0aG9kVkZUYWJsZUxvY2F0aW9uc1R5Ojpjb25zdF9pdGVyYXRvciB2dGFibGVfaW5kaWNlc19iZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gTWV0aG9kVkZUYWJsZUxvY2F0aW9ucy5iZWdpbigpOwotICB9Ci0KLSAgTWV0aG9kVkZUYWJsZUxvY2F0aW9uc1R5Ojpjb25zdF9pdGVyYXRvciB2dGFibGVfaW5kaWNlc19lbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIE1ldGhvZFZGVGFibGVMb2NhdGlvbnMuZW5kKCk7CisgIG1ldGhvZF9sb2NhdGlvbnNfcmFuZ2UgdnRhYmxlX2xvY2F0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWV0aG9kX2xvY2F0aW9uc19yYW5nZShNZXRob2RWRlRhYmxlTG9jYXRpb25zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kVkZUYWJsZUxvY2F0aW9ucy5lbmQoKSk7CiAgIH0KIAogICB1aW50NjRfdCBnZXROdW1WVGFibGVDb21wb25lbnRzKCkgY29uc3QgeyByZXR1cm4gQ29tcG9uZW50cy5zaXplKCk7IH0KQEAgLTI2MzQsNiArMjYwNiw4IEBACiAgIHZvaWQgZHVtcExheW91dChyYXdfb3N0cmVhbSAmKTsKIH07CiAKK30gLy8gZW5kIG5hbWVzcGFjZQorCiAvLy8gSW5pdGlhbE92ZXJyaWRkZW5EZWZpbml0aW9uQ29sbGVjdG9yIC0gRmluZHMgdGhlIHNldCBvZiBsZWFzdCBkZXJpdmVkIGJhc2VzCiAvLy8gdGhhdCBkZWZpbmUgdGhlIGdpdmVuIG1ldGhvZC4KIHN0cnVjdCBJbml0aWFsT3ZlcnJpZGRlbkRlZmluaXRpb25Db2xsZWN0b3IgewpAQCAtMjY1NSwxNCArMjYyOSwxOCBAQAogfQogCiBDaGFyVW5pdHMKLVZGVGFibGVCdWlsZGVyOjpDb21wdXRlVGhpc09mZnNldChjb25zdCBDWFhNZXRob2REZWNsICpNRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlU3Vib2JqZWN0IEJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluYWxPdmVycmlkZXJzOjpPdmVycmlkZXJJbmZvIE92ZXJyaWRlcikgeworVkZUYWJsZUJ1aWxkZXI6OkNvbXB1dGVUaGlzT2Zmc2V0KEZpbmFsT3ZlcnJpZGVyczo6T3ZlcnJpZGVySW5mbyBPdmVycmlkZXIpIHsKICAgSW5pdGlhbE92ZXJyaWRkZW5EZWZpbml0aW9uQ29sbGVjdG9yIENvbGxlY3RvcjsKLSAgdmlzaXRBbGxPdmVycmlkZGVuTWV0aG9kcyhNRCwgQ29sbGVjdG9yKTsKKyAgdmlzaXRBbGxPdmVycmlkZGVuTWV0aG9kcyhPdmVycmlkZXIuTWV0aG9kLCBDb2xsZWN0b3IpOworCisgIC8vIElmIHRoZXJlIGFyZSBubyBvdmVycmlkZXMgdGhlbiAndGhpcycgaXMgbG9jYXRlZAorICAvLyBpbiB0aGUgYmFzZSB0aGF0IGRlZmluZXMgdGhlIG1ldGhvZC4KKyAgaWYgKENvbGxlY3Rvci5CYXNlcy5zaXplKCkgPT0gMCkKKyAgICByZXR1cm4gT3ZlcnJpZGVyLk9mZnNldDsKIAogICBDWFhCYXNlUGF0aHMgUGF0aHM7Ci0gIEJhc2UuZ2V0QmFzZSgpLT5sb29rdXBJbkJhc2VzKEJhc2VJblNldCwgJkNvbGxlY3Rvci5CYXNlcywgUGF0aHMpOworICBPdmVycmlkZXIuTWV0aG9kLT5nZXRQYXJlbnQoKS0+bG9va3VwSW5CYXNlcyhCYXNlSW5TZXQsICZDb2xsZWN0b3IuQmFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhzKTsKIAogICAvLyBUaGlzIHdpbGwgaG9sZCB0aGUgc21hbGxlc3QgdGhpcyBvZmZzZXQgYW1vbmcgb3ZlcnJpZGVlcyBvZiBNRC4KICAgLy8gVGhpcyBpbXBsaWVzIHRoYXQgYW4gb2Zmc2V0IG9mIGEgbm9uLXZpcnR1YWwgYmFzZSB3aWxsIGRvbWluYXRlIGFuIG9mZnNldApAQCAtMjY3NCw3ICsyNjUyLDcgQEAKICAgZm9yIChDWFhCYXNlUGF0aHM6OnBhdGhzX2l0ZXJhdG9yIEkgPSBQYXRocy5iZWdpbigpLCBFID0gUGF0aHMuZW5kKCk7CiAgICAgICAgSSAhPSBFOyArK0kpIHsKICAgICBjb25zdCBDWFhCYXNlUGF0aCAmUGF0aCA9ICgqSSk7Ci0gICAgQ2hhclVuaXRzIFRoaXNPZmZzZXQgPSBCYXNlLmdldEJhc2VPZmZzZXQoKTsKKyAgICBDaGFyVW5pdHMgVGhpc09mZnNldCA9IE92ZXJyaWRlci5PZmZzZXQ7CiAgICAgQ2hhclVuaXRzIExhc3RWQmFzZU9mZnNldDsKIAogICAgIC8vIEZvciBlYWNoIHBhdGggZnJvbSB0aGUgb3ZlcnJpZGVyIHRvIHRoZSBwYXJlbnRzIG9mIHRoZSBvdmVycmlkZGVuIG1ldGhvZHMsCkBAIC0yNzA1LDE2ICsyNjgzLDE2IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oTUQpKSB7CisgICAgaWYgKGlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oT3ZlcnJpZGVyLk1ldGhvZCkpIHsKICAgICAgIGlmIChMYXN0VkJhc2VPZmZzZXQuaXNaZXJvKCkpIHsKICAgICAgICAgLy8gSWYgYSAiQmFzZSIgY2xhc3MgaGFzIGF0IGxlYXN0IG9uZSBub24tdmlydHVhbCBiYXNlIHdpdGggYSB2aXJ0dWFsCiAgICAgICAgIC8vIGRlc3RydWN0b3IsIHRoZSAiQmFzZSIgdmlydHVhbCBkZXN0cnVjdG9yIHdpbGwgdGFrZSB0aGUgYWRkcmVzcwogICAgICAgICAvLyBvZiB0aGUgIkJhc2UiIHN1Ym9iamVjdCBhcyB0aGUgInRoaXMiIGFyZ3VtZW50LgotICAgICAgICByZXR1cm4gQmFzZS5nZXRCYXNlT2Zmc2V0KCk7CisgICAgICAgIFRoaXNPZmZzZXQgPSBPdmVycmlkZXIuT2Zmc2V0OwogICAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQSB2aXJ0dWFsIGRlc3RydWN0b3Igb2YgYSB2aXJ0dWFsIGJhc2UgdGFrZXMgdGhlIGFkZHJlc3Mgb2YgdGhlCiAgICAgICAgIC8vIHZpcnR1YWwgYmFzZSBzdWJvYmplY3QgYXMgdGhlICJ0aGlzIiBhcmd1bWVudC4KLSAgICAgICAgcmV0dXJuIExhc3RWQmFzZU9mZnNldDsKKyAgICAgICAgVGhpc09mZnNldCA9IExhc3RWQmFzZU9mZnNldDsKICAgICAgIH0KICAgICB9CiAKQEAgLTI3MzQsNyArMjcxMiw3IEBACiAgIGNvbnN0IEFTVFJlY29yZExheW91dDo6VkJhc2VPZmZzZXRzTWFwVHkgJlZCYXNlTWFwID0KICAgICAgIE1vc3REZXJpdmVkQ2xhc3NMYXlvdXQuZ2V0VkJhc2VPZmZzZXRzTWFwKCk7CiAgIGNvbnN0IEFTVFJlY29yZExheW91dDo6VkJhc2VPZmZzZXRzTWFwVHk6OmNvbnN0X2l0ZXJhdG9yICZWQmFzZU1hcEVudHJ5ID0KLSAgICAgIFZCYXNlTWFwLmZpbmQoV2hpY2hWRlB0ci5MYXN0VkJhc2UpOworICAgICAgVkJhc2VNYXAuZmluZChXaGljaFZGUHRyLmdldFZCYXNlV2l0aFZQdHIoKSk7CiAgIGFzc2VydChWQmFzZU1hcEVudHJ5ICE9IFZCYXNlTWFwLmVuZCgpKTsKIAogICAvLyBDaGVjayBpZiB3ZSBuZWVkIGEgdnRvcmRpc3AgYWRqdXN0bWVudCBhdCBhbGwuCkBAIC0yNzQ0LDcgKzI3MjIsNyBAQAogICBDaGFyVW5pdHMgVkZQdHJWQmFzZU9mZnNldCA9IFZCYXNlTWFwRW50cnktPnNlY29uZC5WQmFzZU9mZnNldDsKICAgLy8gVGhlIGltcGxpY2l0IHZ0b3JkaXNwIGZpZWxkIGlzIGxvY2F0ZWQgcmlnaHQgYmVmb3JlIHRoZSB2YmFzZS4KICAgVEEuVmlydHVhbC5NaWNyb3NvZnQuVnRvcmRpc3BPZmZzZXQgPQotICAgICAgKFZGUHRyVkJhc2VPZmZzZXQgLSBXaGljaFZGUHRyLlZGUHRyRnVsbE9mZnNldCkuZ2V0UXVhbnRpdHkoKSAtIDQ7CisgICAgICAoVkZQdHJWQmFzZU9mZnNldCAtIFdoaWNoVkZQdHIuRnVsbE9mZnNldEluTURDKS5nZXRRdWFudGl0eSgpIC0gNDsKIAogICAvLyBJZiB0aGUgZmluYWwgb3ZlcnJpZGVyIGlzIGRlZmluZWQgaW4gZWl0aGVyOgogICAvLyAtIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3Mgb3IgaXRzIG5vbi12aXJ0dWFsIGJhc2Ugb3IKQEAgLTI3NTYsMTMgKzI3MzQsMTMgQEAKIAogICBjb25zdCBDWFhSZWNvcmREZWNsICpPdmVycmlkZXJWQmFzZSA9CiAgICAgICBDb21wdXRlQmFzZU9mZnNldChDb250ZXh0LCBPdmVycmlkZXJSRCwgTW9zdERlcml2ZWRDbGFzcykuVmlydHVhbEJhc2U7Ci0gIGlmICghT3ZlcnJpZGVyVkJhc2UgfHwgT3ZlcnJpZGVyVkJhc2UgPT0gV2hpY2hWRlB0ci5MYXN0VkJhc2UpCisgIGlmICghT3ZlcnJpZGVyVkJhc2UgfHwgT3ZlcnJpZGVyVkJhc2UgPT0gV2hpY2hWRlB0ci5nZXRWQmFzZVdpdGhWUHRyKCkpCiAgICAgcmV0dXJuOwogCiAgIC8vIE90aGVyd2lzZSwgd2UgbmVlZCB0byBkbyB1c2UgdGhlIGR5bmFtaWMgb2Zmc2V0IG9mIHRoZSBmaW5hbCBvdmVycmlkZXIKICAgLy8gaW4gb3JkZXIgdG8gZ2V0ICJ0aGlzIiBhZGp1c3RtZW50IHJpZ2h0LgogICBUQS5WaXJ0dWFsLk1pY3Jvc29mdC5WQlB0ck9mZnNldCA9Ci0gICAgICAoVkZQdHJWQmFzZU9mZnNldCArIFdoaWNoVkZQdHIuVkZQdHJPZmZzZXQgLQorICAgICAgKFZGUHRyVkJhc2VPZmZzZXQgKyBXaGljaFZGUHRyLk5vblZpcnR1YWxPZmZzZXQgLQogICAgICAgIE1vc3REZXJpdmVkQ2xhc3NMYXlvdXQuZ2V0VkJQdHJPZmZzZXQoKSkuZ2V0UXVhbnRpdHkoKTsKICAgVEEuVmlydHVhbC5NaWNyb3NvZnQuVkJPZmZzZXRPZmZzZXQgPQogICAgICAgQ29udGV4dC5nZXRUeXBlU2l6ZUluQ2hhcnMoQ29udGV4dC5JbnRUeSkuZ2V0UXVhbnRpdHkoKSAqCkBAIC0yNzc3LDI1ICsyNzU1LDIwIEBACiAgIC8vIFB1dCB0aGUgdmlydHVhbCBtZXRob2RzIGludG8gVmlydHVhbE1ldGhvZHMgaW4gdGhlIHByb3BlciBvcmRlcjoKICAgLy8gMSkgR3JvdXAgb3ZlcmxvYWRzIGJ5IGRlY2xhcmF0aW9uIG5hbWUuIE5ldyBncm91cHMgYXJlIGFkZGVkIHRvIHRoZQogICAvLyAgICB2ZnRhYmxlIGluIHRoZSBvcmRlciBvZiB0aGVpciBmaXJzdCBkZWNsYXJhdGlvbnMgaW4gdGhpcyBjbGFzcwotICAvLyAgICAoaW5jbHVkaW5nIG92ZXJyaWRlcykuCisgIC8vICAgIChpbmNsdWRpbmcgb3ZlcnJpZGVzIGFuZCBub24tdmlydHVhbCBtZXRob2RzKS4KICAgLy8gMikgSW4gZWFjaCBncm91cCwgbmV3IG92ZXJsb2FkcyBhcHBlYXIgaW4gdGhlIHJldmVyc2Ugb3JkZXIgb2YgZGVjbGFyYXRpb24uCiAgIHR5cGVkZWYgU21hbGxWZWN0b3I8Y29uc3QgQ1hYTWV0aG9kRGVjbCAqLCAxPiBNZXRob2RHcm91cDsKICAgU21hbGxWZWN0b3I8TWV0aG9kR3JvdXAsIDEwPiBHcm91cHM7CiAgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8RGVjbGFyYXRpb25OYW1lLCB1bnNpZ25lZD4gVmlzaXRlZEdyb3VwSW5kaWNlc1R5OwogICBWaXNpdGVkR3JvdXBJbmRpY2VzVHkgVmlzaXRlZEdyb3VwSW5kaWNlczsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IgSSA9IFJELT5tZXRob2RfYmVnaW4oKSwKLSAgICAgICBFID0gUkQtPm1ldGhvZF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBDWFhNZXRob2REZWNsICpNRCA9ICpJOwotICAgIGlmICghTUQtPmlzVmlydHVhbCgpKQotICAgICAgY29udGludWU7Ci0KKyAgZm9yIChjb25zdCBhdXRvICpNRCA6IFJELT5tZXRob2RzKCkpIHsKICAgICBWaXNpdGVkR3JvdXBJbmRpY2VzVHk6Oml0ZXJhdG9yIEo7CiAgICAgYm9vbCBJbnNlcnRlZDsKLSAgICBsbHZtOjp0aWUoSiwgSW5zZXJ0ZWQpID0gVmlzaXRlZEdyb3VwSW5kaWNlcy5pbnNlcnQoCisgICAgc3RkOjp0aWUoSiwgSW5zZXJ0ZWQpID0gVmlzaXRlZEdyb3VwSW5kaWNlcy5pbnNlcnQoCiAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKE1ELT5nZXREZWNsTmFtZSgpLCBHcm91cHMuc2l6ZSgpKSk7CiAgICAgaWYgKEluc2VydGVkKQotICAgICAgR3JvdXBzLnB1c2hfYmFjayhNZXRob2RHcm91cCgxLCBNRCkpOwotICAgIGVsc2UKKyAgICAgIEdyb3Vwcy5wdXNoX2JhY2soTWV0aG9kR3JvdXAoKSk7CisgICAgaWYgKE1ELT5pc1ZpcnR1YWwoKSkKICAgICAgIEdyb3Vwc1tKLT5zZWNvbmRdLnB1c2hfYmFjayhNRCk7CiAgIH0KIApAQCAtMjgwMyw2ICsyNzc2LDMyIEBACiAgICAgVmlydHVhbE1ldGhvZHMuYXBwZW5kKEdyb3Vwc1tJXS5yYmVnaW4oKSwgR3JvdXBzW0ldLnJlbmQoKSk7CiB9CiAKKy8vLyBXZSBuZWVkIGEgcmV0dXJuIGFkanVzdGluZyB0aHVuayBmb3IgdGhpcyBtZXRob2QgaWYgaXRzIHJldHVybiB0eXBlIGlzCisvLy8gbm90IHRyaXZpYWxseSBjb252ZXJ0aWJsZSB0byB0aGUgcmV0dXJuIHR5cGUgb2YgYW55IG9mIGl0cyBvdmVycmlkZGVuCisvLy8gbWV0aG9kcy4KK2Jvb2wgVkZUYWJsZUJ1aWxkZXI6Ok5lZWRzUmV0dXJuQWRqdXN0aW5nVGh1bmsoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQpIHsKKyAgT3ZlcnJpZGRlbk1ldGhvZHNTZXRUeSBPdmVycmlkZGVuTWV0aG9kczsKKyAgQ29tcHV0ZUFsbE92ZXJyaWRkZW5NZXRob2RzKE1ELCBPdmVycmlkZGVuTWV0aG9kcyk7CisgIGZvciAoT3ZlcnJpZGRlbk1ldGhvZHNTZXRUeTo6aXRlcmF0b3IgSSA9IE92ZXJyaWRkZW5NZXRob2RzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IE92ZXJyaWRkZW5NZXRob2RzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqT3ZlcnJpZGRlbk1EID0gKkk7CisgICAgQmFzZU9mZnNldCBBZGp1c3RtZW50ID0KKyAgICAgICAgQ29tcHV0ZVJldHVybkFkanVzdG1lbnRCYXNlT2Zmc2V0KENvbnRleHQsIE1ELCBPdmVycmlkZGVuTUQpOworICAgIGlmICghQWRqdXN0bWVudC5pc0VtcHR5KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlzRGlyZWN0VkJhc2UoY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZSwgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKKyAgZm9yIChjb25zdCBhdXRvICZCIDogUkQtPmJhc2VzKCkpIHsKKyAgICBpZiAoQi5pc1ZpcnR1YWwoKSAmJiBCLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCkgPT0gQmFzZSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBWRlRhYmxlQnVpbGRlcjo6QWRkTWV0aG9kcyhCYXNlU3Vib2JqZWN0IEJhc2UsIHVuc2lnbmVkIEJhc2VEZXB0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTGFzdFZCYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlc1NldFZlY3RvclR5ICZWaXNpdGVkQmFzZXMpIHsKQEAgLTI4MTYsOSArMjgxNSw5IEBACiAgIC8vIHRoZSBvbmUgZGVmaW5lZCBieSB0aGUgdmZwdHIgYmFzZSBwYXRoIG9yIHRoZSBwcmltYXJ5IGJhc2Ugb2YgdGhlIGN1cnJlbnQgY2xhc3MuCiAgIGNvbnN0IENYWFJlY29yZERlY2wgKk5leHRCYXNlID0gMCwgKk5leHRMYXN0VkJhc2UgPSBMYXN0VkJhc2U7CiAgIENoYXJVbml0cyBOZXh0QmFzZU9mZnNldDsKLSAgaWYgKEJhc2VEZXB0aCA8IFdoaWNoVkZQdHIuUGF0aFRvQmFzZVdpdGhWRlB0ci5zaXplKCkpIHsKLSAgICBOZXh0QmFzZSA9IFdoaWNoVkZQdHIuUGF0aFRvQmFzZVdpdGhWRlB0cltCYXNlRGVwdGhdOwotICAgIGlmIChMYXlvdXQuZ2V0VkJhc2VPZmZzZXRzTWFwKCkuY291bnQoTmV4dEJhc2UpKSB7CisgIGlmIChCYXNlRGVwdGggPCBXaGljaFZGUHRyLlBhdGhUb0Jhc2VXaXRoVlB0ci5zaXplKCkpIHsKKyAgICBOZXh0QmFzZSA9IFdoaWNoVkZQdHIuUGF0aFRvQmFzZVdpdGhWUHRyW0Jhc2VEZXB0aF07CisgICAgaWYgKGlzRGlyZWN0VkJhc2UoTmV4dEJhc2UsIFJEKSkgewogICAgICAgTmV4dExhc3RWQmFzZSA9IE5leHRCYXNlOwogICAgICAgTmV4dEJhc2VPZmZzZXQgPSBNb3N0RGVyaXZlZENsYXNzTGF5b3V0LmdldFZCYXNlQ2xhc3NPZmZzZXQoTmV4dEJhc2UpOwogICAgIH0gZWxzZSB7CkBAIC0yODU2LDEzICsyODU1LDIxIEBACiAKICAgICBGaW5hbE92ZXJyaWRlcnM6Ok92ZXJyaWRlckluZm8gT3ZlcnJpZGVyID0KICAgICAgICAgT3ZlcnJpZGVycy5nZXRPdmVycmlkZXIoTUQsIEJhc2UuZ2V0QmFzZU9mZnNldCgpKTsKLSAgICBUaGlzQWRqdXN0bWVudCBUaGlzQWRqdXN0bWVudE9mZnNldDsKLSAgICBib29sIEZvcmNlVGh1bmsgPSBmYWxzZTsKKyAgICBjb25zdCBDWFhNZXRob2REZWNsICpPdmVycmlkZXJNRCA9IE92ZXJyaWRlci5NZXRob2Q7CisgICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqT3ZlcnJpZGRlbk1EID0KKyAgICAgICAgRmluZE5lYXJlc3RPdmVycmlkZGVuTWV0aG9kKE1ELCBWaXNpdGVkQmFzZXMpOwogCi0gICAgLy8gQ2hlY2sgaWYgdGhpcyB2aXJ0dWFsIG1lbWJlciBmdW5jdGlvbiBvdmVycmlkZXMKLSAgICAvLyBhIG1ldGhvZCBpbiBvbmUgb2YgdGhlIHZpc2l0ZWQgYmFzZXMuCi0gICAgaWYgKGNvbnN0IENYWE1ldGhvZERlY2wgKk92ZXJyaWRkZW5NRCA9Ci0gICAgICAgICAgICBGaW5kTmVhcmVzdE92ZXJyaWRkZW5NZXRob2QoTUQsIFZpc2l0ZWRCYXNlcykpIHsKKyAgICBUaGlzQWRqdXN0bWVudCBUaGlzQWRqdXN0bWVudE9mZnNldDsKKyAgICBib29sIFJldHVybkFkanVzdGluZ1RodW5rID0gZmFsc2U7CisgICAgQ2hhclVuaXRzIFRoaXNPZmZzZXQgPSBDb21wdXRlVGhpc09mZnNldChPdmVycmlkZXIpOworICAgIFRoaXNBZGp1c3RtZW50T2Zmc2V0Lk5vblZpcnR1YWwgPQorICAgICAgICAoVGhpc09mZnNldCAtIFdoaWNoVkZQdHIuRnVsbE9mZnNldEluTURDKS5nZXRRdWFudGl0eSgpOworICAgIGlmICgoT3ZlcnJpZGRlbk1EIHx8IE92ZXJyaWRlck1EICE9IE1EKSAmJgorICAgICAgICBXaGljaFZGUHRyLmdldFZCYXNlV2l0aFZQdHIoKSkKKyAgICAgIENhbGN1bGF0ZVZ0b3JkaXNwQWRqdXN0bWVudChPdmVycmlkZXIsIFRoaXNPZmZzZXQsIFRoaXNBZGp1c3RtZW50T2Zmc2V0KTsKKworICAgIGlmIChPdmVycmlkZGVuTUQpIHsKKyAgICAgIC8vIElmIE1EIG92ZXJyaWRlcyBhbnl0aGluZyBpbiB0aGlzIHZmdGFibGUsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBlbnRyaWVzLgogICAgICAgTWV0aG9kSW5mb01hcFR5OjppdGVyYXRvciBPdmVycmlkZGVuTURJdGVyYXRvciA9CiAgICAgICAgICAgTWV0aG9kSW5mb01hcC5maW5kKE92ZXJyaWRkZW5NRCk7CiAKQEAgLTI4NzIsMjMgKzI4NzksNyBAQAogCiAgICAgICBNZXRob2RJbmZvICZPdmVycmlkZGVuTWV0aG9kSW5mbyA9IE92ZXJyaWRkZW5NREl0ZXJhdG9yLT5zZWNvbmQ7CiAKLSAgICAgIC8vIENyZWF0ZSBhIHRoaXMtYWRqdXN0aW5nIHRodW5rIGlmIG5lZWRlZC4KLSAgICAgIENoYXJVbml0cyBUSSA9IENvbXB1dGVUaGlzT2Zmc2V0KE1ELCBCYXNlLCBPdmVycmlkZXIpOwotICAgICAgaWYgKFRJICE9IFdoaWNoVkZQdHIuVkZQdHJGdWxsT2Zmc2V0KSB7Ci0gICAgICAgIFRoaXNBZGp1c3RtZW50T2Zmc2V0Lk5vblZpcnR1YWwgPQotICAgICAgICAgICAgKFRJIC0gV2hpY2hWRlB0ci5WRlB0ckZ1bGxPZmZzZXQpLmdldFF1YW50aXR5KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChXaGljaFZGUHRyLkxhc3RWQmFzZSkKLSAgICAgICAgQ2FsY3VsYXRlVnRvcmRpc3BBZGp1c3RtZW50KE92ZXJyaWRlciwgVEksIFRoaXNBZGp1c3RtZW50T2Zmc2V0KTsKLQotICAgICAgaWYgKCFUaGlzQWRqdXN0bWVudE9mZnNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgVlRhYmxlVGh1bmtzW092ZXJyaWRkZW5NZXRob2RJbmZvLlZGVGFibGVJbmRleF0uVGhpcyA9Ci0gICAgICAgICAgICBUaGlzQWRqdXN0bWVudE9mZnNldDsKLSAgICAgICAgQWRkVGh1bmsoTUQsIFZUYWJsZVRodW5rc1tPdmVycmlkZGVuTWV0aG9kSW5mby5WRlRhYmxlSW5kZXhdKTsKLSAgICAgIH0KLQotICAgICAgaWYgKE1ELT5nZXRSZXN1bHRUeXBlKCkgPT0gT3ZlcnJpZGRlbk1ELT5nZXRSZXN1bHRUeXBlKCkpIHsKKyAgICAgIGlmICghTmVlZHNSZXR1cm5BZGp1c3RpbmdUaHVuayhNRCkpIHsKICAgICAgICAgLy8gTm8gcmV0dXJuIGFkanVzdG1lbnQgbmVlZGVkIC0ganVzdCByZXBsYWNlIHRoZSBvdmVycmlkZGVuIG1ldGhvZCBpbmZvCiAgICAgICAgIC8vIHdpdGggdGhlIGN1cnJlbnQgaW5mby4KICAgICAgICAgTWV0aG9kSW5mbyBNSShPdmVycmlkZGVuTWV0aG9kSW5mby5WQlRhYmxlSW5kZXgsCkBAIC0yODk5LDMzICsyODkwLDE3IEBACiAgICAgICAgICAgICAgICAiU2hvdWxkIG5vdCBoYXZlIG1ldGhvZCBpbmZvIGZvciB0aGlzIG1ldGhvZCB5ZXQhIik7CiAgICAgICAgIE1ldGhvZEluZm9NYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE1ELCBNSSkpOwogICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEluIGNhc2Ugd2UgbmVlZCBhIHJldHVybiBhZGp1c3RtZW50LCB3ZSdsbCBhZGQgYSBuZXcgc2xvdCBmb3IKLSAgICAgICAgLy8gdGhlIG92ZXJyaWRlciBhbmQgcHV0IGEgcmV0dXJuLWFkanVzdGluZyB0aHVuayB3aGVyZSB0aGUgb3ZlcnJpZGRlbgotICAgICAgICAvLyBtZXRob2Qgd2FzIGluIHRoZSB2ZnRhYmxlLgotICAgICAgICAvLyBGb3Igbm93LCBqdXN0IG1hcmsgdGhlIG92ZXJyaWRlbiBtZXRob2QgYXMgc2hhZG93ZWQgYnkgYSBuZXcgc2xvdC4KLSAgICAgICAgT3ZlcnJpZGRlbk1ldGhvZEluZm8uU2hhZG93ZWQgPSB0cnVlOwotICAgICAgICBGb3JjZVRodW5rID0gdHJ1ZTsKLQotICAgICAgICAvLyBBbHNvIGFwcGx5IHRoaXMgYWRqdXN0bWVudCB0byB0aGUgc2hhZG93ZWQgc2xvdHMuCi0gICAgICAgIGlmICghVGhpc0FkanVzdG1lbnRPZmZzZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgTyhOXjIpLCBjYW4gYmUgTyhOKS4KLSAgICAgICAgICBjb25zdCBDWFhNZXRob2REZWNsICpTdWJPdmVycmlkZSA9IE92ZXJyaWRkZW5NRDsKLSAgICAgICAgICB3aGlsZSAoKFN1Yk92ZXJyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgICBGaW5kTmVhcmVzdE92ZXJyaWRkZW5NZXRob2QoU3ViT3ZlcnJpZGUsIFZpc2l0ZWRCYXNlcykpKSB7Ci0gICAgICAgICAgICBNZXRob2RJbmZvTWFwVHk6Oml0ZXJhdG9yIFN1Yk92ZXJyaWRlSXRlcmF0b3IgPQotICAgICAgICAgICAgICAgIE1ldGhvZEluZm9NYXAuZmluZChTdWJPdmVycmlkZSk7Ci0gICAgICAgICAgICBpZiAoU3ViT3ZlcnJpZGVJdGVyYXRvciA9PSBNZXRob2RJbmZvTWFwLmVuZCgpKQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIE1ldGhvZEluZm8gJlN1Yk92ZXJyaWRlTUkgPSBTdWJPdmVycmlkZUl0ZXJhdG9yLT5zZWNvbmQ7Ci0gICAgICAgICAgICBhc3NlcnQoU3ViT3ZlcnJpZGVNSS5TaGFkb3dlZCk7Ci0gICAgICAgICAgICBWVGFibGVUaHVua3NbU3ViT3ZlcnJpZGVNSS5WRlRhYmxlSW5kZXhdLlRoaXMgPQotICAgICAgICAgICAgICAgIFRoaXNBZGp1c3RtZW50T2Zmc2V0OwotICAgICAgICAgICAgQWRkVGh1bmsoTUQsIFZUYWJsZVRodW5rc1tTdWJPdmVycmlkZU1JLlZGVGFibGVJbmRleF0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQogICAgICAgfQotICAgIH0gZWxzZSBpZiAoQmFzZS5nZXRCYXNlT2Zmc2V0KCkgIT0gV2hpY2hWRlB0ci5WRlB0ckZ1bGxPZmZzZXQgfHwKKworICAgICAgLy8gSW4gY2FzZSB3ZSBuZWVkIGEgcmV0dXJuIGFkanVzdG1lbnQsIHdlJ2xsIGFkZCBhIG5ldyBzbG90IGZvcgorICAgICAgLy8gdGhlIG92ZXJyaWRlci4gTWFyayB0aGUgb3ZlcnJpZGVuIG1ldGhvZCBhcyBzaGFkb3dlZCBieSB0aGUgbmV3IHNsb3QuCisgICAgICBPdmVycmlkZGVuTWV0aG9kSW5mby5TaGFkb3dlZCA9IHRydWU7CisKKyAgICAgIC8vIEZvcmNlIGEgc3BlY2lhbCBuYW1lIG1hbmdsaW5nIGZvciBhIHJldHVybi1hZGp1c3RpbmcgdGh1bmsKKyAgICAgIC8vIHVubGVzcyB0aGUgbWV0aG9kIGlzIHRoZSBmaW5hbCBvdmVycmlkZXIgd2l0aG91dCB0aGlzIGFkanVzdG1lbnQuCisgICAgICBSZXR1cm5BZGp1c3RpbmdUaHVuayA9CisgICAgICAgICAgIShNRCA9PSBPdmVycmlkZXJNRCAmJiBUaGlzQWRqdXN0bWVudE9mZnNldC5pc0VtcHR5KCkpOworICAgIH0gZWxzZSBpZiAoQmFzZS5nZXRCYXNlT2Zmc2V0KCkgIT0gV2hpY2hWRlB0ci5GdWxsT2Zmc2V0SW5NREMgfHwKICAgICAgICAgICAgICAgIE1ELT5zaXplX292ZXJyaWRkZW5fbWV0aG9kcygpKSB7CiAgICAgICAvLyBTa2lwIG1ldGhvZHMgdGhhdCBkb24ndCBiZWxvbmcgdG8gdGhlIHZmdGFibGUgb2YgdGhlIGN1cnJlbnQgY2xhc3MsCiAgICAgICAvLyBlLmcuIGVhY2ggbWV0aG9kIHRoYXQgd2Fzbid0IHNlZW4gaW4gYW55IG9mIHRoZSB2aXNpdGVkIHN1Yi1iYXNlcwpAQCAtMjk0Myw4ICsyOTE4LDYgQEAKICAgICAgICAgICAgIlNob3VsZCBub3QgaGF2ZSBtZXRob2QgaW5mbyBmb3IgdGhpcyBtZXRob2QgeWV0ISIpOwogICAgIE1ldGhvZEluZm9NYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE1ELCBNSSkpOwogCi0gICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqT3ZlcnJpZGVyTUQgPSBPdmVycmlkZXIuTWV0aG9kOwotCiAgICAgLy8gQ2hlY2sgaWYgdGhpcyBvdmVycmlkZXIgbmVlZHMgYSByZXR1cm4gYWRqdXN0bWVudC4KICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgZm9yIHB1cmUgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zLgogICAgIEJhc2VPZmZzZXQgUmV0dXJuQWRqdXN0bWVudE9mZnNldDsKQEAgLTI5NTQsNyArMjkyNyw3IEBACiAgICAgICAgICAgQ29tcHV0ZVJldHVybkFkanVzdG1lbnRCYXNlT2Zmc2V0KENvbnRleHQsIE92ZXJyaWRlck1ELCBNRCk7CiAgICAgfQogICAgIGlmICghUmV0dXJuQWRqdXN0bWVudE9mZnNldC5pc0VtcHR5KCkpIHsKLSAgICAgIEZvcmNlVGh1bmsgPSB0cnVlOworICAgICAgUmV0dXJuQWRqdXN0aW5nVGh1bmsgPSB0cnVlOwogICAgICAgUmV0dXJuQWRqdXN0bWVudC5Ob25WaXJ0dWFsID0KICAgICAgICAgICBSZXR1cm5BZGp1c3RtZW50T2Zmc2V0Lk5vblZpcnR1YWxPZmZzZXQuZ2V0UXVhbnRpdHkoKTsKICAgICAgIGlmIChSZXR1cm5BZGp1c3RtZW50T2Zmc2V0LlZpcnR1YWxCYXNlKSB7CkBAIC0yOTY5LDQwICsyOTQyLDMwIEBACiAgICAgfQogCiAgICAgQWRkTWV0aG9kKE92ZXJyaWRlck1ELCBUaHVua0luZm8oVGhpc0FkanVzdG1lbnRPZmZzZXQsIFJldHVybkFkanVzdG1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yY2VUaHVuayA/IE1EIDogMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkFkanVzdGluZ1RodW5rID8gTUQgOiAwKSk7CiAgIH0KIH0KIAotdm9pZCBQcmludEJhc2VQYXRoKGNvbnN0IFZGUHRySW5mbzo6QmFzZVBhdGggJlBhdGgsIHJhd19vc3RyZWFtICZPdXQpIHsKLSAgZm9yIChWRlB0ckluZm86OkJhc2VQYXRoOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIEkgPSBQYXRoLnJiZWdpbigpLAorc3RhdGljIHZvaWQgUHJpbnRCYXNlUGF0aChjb25zdCBWUHRySW5mbzo6QmFzZVBhdGggJlBhdGgsIHJhd19vc3RyZWFtICZPdXQpIHsKKyAgZm9yIChWUHRySW5mbzo6QmFzZVBhdGg6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgSSA9IFBhdGgucmJlZ2luKCksCiAgICAgICAgRSA9IFBhdGgucmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIE91dCA8PCAiJyIgPDwgKCpJKS0+Z2V0UXVhbGlmaWVkTmFtZUFzU3RyaW5nKCkgPDwgIicgaW4gIjsKKyAgICBPdXQgPDwgIiciOworICAgICgqSSktPnByaW50UXVhbGlmaWVkTmFtZShPdXQpOworICAgIE91dCA8PCAiJyBpbiAiOwogICB9CiB9CiAKLXN0cnVjdCBNaWNyb3NvZnRUaHVua0luZm9TdGFibGVTb3J0Q29tcGFyYXRvciB7Ci0gIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgVGh1bmtJbmZvICZMSFMsIGNvbnN0IFRodW5rSW5mbyAmUkhTKSB7Ci0gICAgaWYgKExIUy5UaGlzICE9IFJIUy5UaGlzKQotICAgICAgcmV0dXJuIExIUy5UaGlzIDwgUkhTLlRoaXM7Ci0KLSAgICBpZiAoTEhTLlJldHVybiAhPSBSSFMuUmV0dXJuKQotICAgICAgcmV0dXJuIExIUy5SZXR1cm4gPCBSSFMuUmV0dXJuOwotCi0gICAgLy8gS2VlcCBkaWZmZXJlbnQgdGh1bmtzIHdpdGggdGhlIHNhbWUgYWRqdXN0bWVudHMgaW4gdGhlIG9yZGVyIHRoZXkKLSAgICAvLyB3ZXJlIHB1dCBpbnRvIHRoZSB2ZWN0b3IuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19OwotCiBzdGF0aWMgdm9pZCBkdW1wTWljcm9zb2Z0VGh1bmtBZGp1c3RtZW50KGNvbnN0IFRodW5rSW5mbyAmVEksIHJhd19vc3RyZWFtICZPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29udGludWVGaXJzdExpbmUpIHsKICAgY29uc3QgUmV0dXJuQWRqdXN0bWVudCAmUiA9IFRJLlJldHVybjsKICAgYm9vbCBNdWx0aWxpbmUgPSBmYWxzZTsKLSAgY29uc3QgY2hhciAqTGluZVByZWZpeCA9ICJcbiAgICAgICAgIjsKLSAgaWYgKCFSLmlzRW1wdHkoKSkgeworICBjb25zdCBjaGFyICpMaW5lUHJlZml4ID0gIlxuICAgICAgICI7CisgIGlmICghUi5pc0VtcHR5KCkgfHwgVEkuTWV0aG9kKSB7CiAgICAgaWYgKCFDb250aW51ZUZpcnN0TGluZSkKICAgICAgIE91dCA8PCBMaW5lUHJlZml4OwotICAgIE91dCA8PCAiW3JldHVybiBhZGp1c3RtZW50OiAiOworICAgIE91dCA8PCAiW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICciCisgICAgICAgIDw8IFRJLk1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpLmdldENhbm9uaWNhbFR5cGUoKS5nZXRBc1N0cmluZygpCisgICAgICAgIDw8ICInKTogIjsKICAgICBpZiAoUi5WaXJ0dWFsLk1pY3Jvc29mdC5WQlB0ck9mZnNldCkKICAgICAgIE91dCA8PCAidmJwdHIgYXQgb2Zmc2V0ICIgPDwgUi5WaXJ0dWFsLk1pY3Jvc29mdC5WQlB0ck9mZnNldCA8PCAiLCAiOwogICAgIGlmIChSLlZpcnR1YWwuTWljcm9zb2Z0LlZCSW5kZXgpCkBAIC0zMDIxLDcgKzI5ODQsNyBAQAogICAgICAgT3V0IDw8ICJ2dG9yZGlzcCBhdCAiIDw8IFQuVmlydHVhbC5NaWNyb3NvZnQuVnRvcmRpc3BPZmZzZXQgPDwgIiwgIjsKICAgICAgIGlmIChULlZpcnR1YWwuTWljcm9zb2Z0LlZCUHRyT2Zmc2V0KSB7CiAgICAgICAgIE91dCA8PCAidmJwdHIgYXQgIiA8PCBULlZpcnR1YWwuTWljcm9zb2Z0LlZCUHRyT2Zmc2V0Ci0gICAgICAgICAgICA8PCAiIHRvIHRoZSBsZWZ0LCAiOworICAgICAgICAgICAgPDwgIiB0byB0aGUgbGVmdCwiOwogICAgICAgICBhc3NlcnQoVC5WaXJ0dWFsLk1pY3Jvc29mdC5WQk9mZnNldE9mZnNldCA+IDApOwogICAgICAgICBPdXQgPDwgTGluZVByZWZpeCA8PCAiIHZib2Zmc2V0IGF0ICIKICAgICAgICAgICAgIDw8IFQuVmlydHVhbC5NaWNyb3NvZnQuVkJPZmZzZXRPZmZzZXQgPDwgIiBpbiB0aGUgdmJ0YWJsZSwgIjsKQEAgLTMwMzMsOSArMjk5NiwxMSBAQAogCiB2b2lkIFZGVGFibGVCdWlsZGVyOjpkdW1wTGF5b3V0KHJhd19vc3RyZWFtICZPdXQpIHsKICAgT3V0IDw8ICJWRlRhYmxlIGZvciAiOwotICBQcmludEJhc2VQYXRoKFdoaWNoVkZQdHIuUGF0aFRvQmFzZVdpdGhWRlB0ciwgT3V0KTsKLSAgT3V0IDw8ICInIiA8PCBNb3N0RGVyaXZlZENsYXNzLT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKTsKLSAgT3V0IDw8ICInICgiIDw8IENvbXBvbmVudHMuc2l6ZSgpIDw8ICIgZW50cmllcykuXG4iOworICBQcmludEJhc2VQYXRoKFdoaWNoVkZQdHIuUGF0aFRvQmFzZVdpdGhWUHRyLCBPdXQpOworICBPdXQgPDwgIiciOworICBNb3N0RGVyaXZlZENsYXNzLT5wcmludFF1YWxpZmllZE5hbWUoT3V0KTsKKyAgT3V0IDw8ICInICgiIDw8IENvbXBvbmVudHMuc2l6ZSgpCisgICAgICA8PCAoQ29tcG9uZW50cy5zaXplKCkgPT0gMSA/ICIgZW50cnkiIDogIiBlbnRyaWVzIikgPDwgIikuXG4iOwogCiAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBDb21wb25lbnRzLnNpemUoKTsgSSAhPSBFOyArK0kpIHsKICAgICBPdXQgPDwgbGx2bTo6Zm9ybWF0KCIlNGQgfCAiLCBJKTsKQEAgLTMwNDUsMTIgKzMwMTAsMTUgQEAKICAgICAvLyBEdW1wIHRoZSBjb21wb25lbnQuCiAgICAgc3dpdGNoIChDb21wb25lbnQuZ2V0S2luZCgpKSB7CiAgICAgY2FzZSBWVGFibGVDb21wb25lbnQ6OkNLX1JUVEk6Ci0gICAgICBPdXQgPDwgQ29tcG9uZW50LmdldFJUVElEZWNsKCktPmdldFF1YWxpZmllZE5hbWVBc1N0cmluZygpIDw8ICIgUlRUSSI7CisgICAgICBDb21wb25lbnQuZ2V0UlRUSURlY2woKS0+cHJpbnRRdWFsaWZpZWROYW1lKE91dCk7CisgICAgICBPdXQgPDwgIiBSVFRJIjsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBWVGFibGVDb21wb25lbnQ6OkNLX0Z1bmN0aW9uUG9pbnRlcjogewogICAgICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPSBDb21wb25lbnQuZ2V0RnVuY3Rpb25EZWNsKCk7CiAKKyAgICAgIC8vIEZJWE1FOiBGaWd1cmUgb3V0IGhvdyB0byBwcmludCB0aGUgcmVhbCB0aHVuayB0eXBlLCBzaW5jZSB0aGV5IGNhbgorICAgICAgLy8gZGlmZmVyIGluIHRoZSByZXR1cm4gdHlwZS4KICAgICAgIHN0ZDo6c3RyaW5nIFN0ciA9IFByZWRlZmluZWRFeHByOjpDb21wdXRlTmFtZSgKICAgICAgICAgICBQcmVkZWZpbmVkRXhwcjo6UHJldHR5RnVuY3Rpb25Ob1ZpcnR1YWwsIE1EKTsKICAgICAgIE91dCA8PCBTdHI7CkBAIC0zMDcyLDcgKzMwNDAsNyBAQAogICAgIGNhc2UgVlRhYmxlQ29tcG9uZW50OjpDS19EZWxldGluZ0R0b3JQb2ludGVyOiB7CiAgICAgICBjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqREQgPSBDb21wb25lbnQuZ2V0RGVzdHJ1Y3RvckRlY2woKTsKIAotICAgICAgT3V0IDw8IERELT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKTsKKyAgICAgIERELT5wcmludFF1YWxpZmllZE5hbWUoT3V0KTsKICAgICAgIE91dCA8PCAiKCkgW3NjYWxhciBkZWxldGluZ10iOwogCiAgICAgICBpZiAoREQtPmlzUHVyZSgpKQpAQCAtMzEyNCw3ICszMDkyLDExIEBACiAKICAgICAgIFRodW5rSW5mb1ZlY3RvclR5IFRodW5rc1ZlY3RvciA9IFRodW5rc1tNRF07CiAgICAgICBzdGQ6OnN0YWJsZV9zb3J0KFRodW5rc1ZlY3Rvci5iZWdpbigpLCBUaHVua3NWZWN0b3IuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgIE1pY3Jvc29mdFRodW5rSW5mb1N0YWJsZVNvcnRDb21wYXJhdG9yKCkpOworICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBUaHVua0luZm8gJkxIUywgY29uc3QgVGh1bmtJbmZvICZSSFMpIHsKKyAgICAgICAgLy8gS2VlcCBkaWZmZXJlbnQgdGh1bmtzIHdpdGggdGhlIHNhbWUgYWRqdXN0bWVudHMgaW4gdGhlIG9yZGVyIHRoZXkKKyAgICAgICAgLy8gd2VyZSBwdXQgaW50byB0aGUgdmVjdG9yLgorICAgICAgICByZXR1cm4gc3RkOjp0aWUoTEhTLlRoaXMsIExIUy5SZXR1cm4pIDwgc3RkOjp0aWUoUkhTLlRoaXMsIFJIUy5SZXR1cm4pOworICAgICAgfSk7CiAKICAgICAgIE91dCA8PCAiVGh1bmtzIGZvciAnIiA8PCBNZXRob2ROYW1lIDw8ICInICgiIDw8IFRodW5rc1ZlY3Rvci5zaXplKCk7CiAgICAgICBPdXQgPDwgKFRodW5rc1ZlY3Rvci5zaXplKCkgPT0gMSA/ICIgZW50cnkiIDogIiBlbnRyaWVzIikgPDwgIikuXG4iOwpAQCAtMzE0MCwxMjMgKzMxMTIsMTY5IEBACiAgICAgICBPdXQgPDwgJ1xuJzsKICAgICB9CiAgIH0KLX0KKworICBPdXQuZmx1c2goKTsKIH0KIAotdm9pZCBNaWNyb3NvZnRWVGFibGVDb250ZXh0OjplbnVtZXJhdGVWRlB0cnMoCi0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTW9zdERlcml2ZWRDbGFzcywKLSAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJk1vc3REZXJpdmVkQ2xhc3NMYXlvdXQsIEJhc2VTdWJvYmplY3QgQmFzZSwKLSAgICBjb25zdCBDWFhSZWNvcmREZWNsICpMYXN0VkJhc2UsCi0gICAgY29uc3QgVkZQdHJJbmZvOjpCYXNlUGF0aCAmUGF0aEZyb21Db21wbGV0ZUNsYXNzLAotICAgIEJhc2VzU2V0VmVjdG9yVHkgJlZpc2l0ZWRWQmFzZXMsCi0gICAgVkZQdHJMaXN0VHkgJlJlc3VsdCkgewotICBjb25zdCBDWFhSZWNvcmREZWNsICpDdXJyZW50Q2xhc3MgPSBCYXNlLmdldEJhc2UoKTsKLSAgQ2hhclVuaXRzIE9mZnNldEluQ29tcGxldGVDbGFzcyA9IEJhc2UuZ2V0QmFzZU9mZnNldCgpOwotICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkN1cnJlbnRDbGFzc0xheW91dCA9Ci0gICAgICBDb250ZXh0LmdldEFTVFJlY29yZExheW91dChDdXJyZW50Q2xhc3MpOwotCi0gIGlmIChDdXJyZW50Q2xhc3NMYXlvdXQuaGFzT3duVkZQdHIoKSkgewotICAgIGlmIChMYXN0VkJhc2UpIHsKLSAgICAgIHVpbnQ2NF90IFZCSW5kZXggPSBnZXRWQlRhYmxlSW5kZXgoTW9zdERlcml2ZWRDbGFzcywgTGFzdFZCYXNlKTsKLSAgICAgIGFzc2VydChWQkluZGV4ID4gMCAmJiAidmJhc2VzIG11c3QgaGF2ZSB2YmluZGV4ISIpOwotICAgICAgQ2hhclVuaXRzIFZGUHRyT2Zmc2V0ID0KLSAgICAgICAgICBPZmZzZXRJbkNvbXBsZXRlQ2xhc3MgLQotICAgICAgICAgIE1vc3REZXJpdmVkQ2xhc3NMYXlvdXQuZ2V0VkJhc2VDbGFzc09mZnNldChMYXN0VkJhc2UpOwotICAgICAgUmVzdWx0LnB1c2hfYmFjayhWRlB0ckluZm8oVkJJbmRleCwgTGFzdFZCYXNlLCBWRlB0ck9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhGcm9tQ29tcGxldGVDbGFzcywgT2Zmc2V0SW5Db21wbGV0ZUNsYXNzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFJlc3VsdC5wdXNoX2JhY2soVkZQdHJJbmZvKE9mZnNldEluQ29tcGxldGVDbGFzcywgUGF0aEZyb21Db21wbGV0ZUNsYXNzKSk7Ci0gICAgfQorc3RhdGljIGJvb2wgc2V0c0ludGVyc2VjdChjb25zdCBsbHZtOjpTbWFsbFB0clNldDxjb25zdCBDWFhSZWNvcmREZWNsICosIDQ+ICZBLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpBcnJheVJlZjxjb25zdCBDWFhSZWNvcmREZWNsICo+ICZCKSB7CisgIGZvciAobGx2bTo6QXJyYXlSZWY8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqPjo6aXRlcmF0b3IgSSA9IEIuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gQi5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmIChBLmNvdW50KCpJKSkKKyAgICAgIHJldHVybiB0cnVlOwogICB9CisgIHJldHVybiBmYWxzZTsKK30KIAotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IEN1cnJlbnRDbGFzcy0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICBFID0gQ3VycmVudENsYXNzLT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9IEktPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CitzdGF0aWMgYm9vbCByZWJ1Y2tldFBhdGhzKFZQdHJJbmZvVmVjdG9yICZQYXRocyk7CiAKLSAgICBDaGFyVW5pdHMgTmV4dEJhc2VPZmZzZXQ7Ci0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTmV4dExhc3RWQmFzZTsKLSAgICBpZiAoSS0+aXNWaXJ0dWFsKCkpIHsKLSAgICAgIGlmICghVmlzaXRlZFZCYXNlcy5pbnNlcnQoQmFzZURlY2wpKQorLy8vIFByb2R1Y2VzIE1TVkMtY29tcGF0aWJsZSB2YnRhYmxlIGRhdGEuICBUaGUgc3ltYm9scyBwcm9kdWNlZCBieSB0aGlzCisvLy8gYWxnb3JpdGhtIG1hdGNoIHRob3NlIHByb2R1Y2VkIGJ5IE1TVkMgMjAxMiBhbmQgbmV3ZXIsIHdoaWNoIGlzIGRpZmZlcmVudAorLy8vIGZyb20gTVNWQyAyMDEwLgorLy8vCisvLy8gTVNWQyAyMDEyIGFwcGVhcnMgdG8gbWluaW1pemUgdGhlIHZidGFibGUgbmFtZXMgdXNpbmcgdGhlIGZvbGxvd2luZworLy8vIGFsZ29yaXRobS4gIEZpcnN0LCB3YWxrIHRoZSBjbGFzcyBoaWVyYXJjaHkgaW4gdGhlIHVzdWFsIG9yZGVyLCBkZXB0aCBmaXJzdCwKKy8vLyBsZWZ0IHRvIHJpZ2h0LCB0byBmaW5kIGFsbCBvZiB0aGUgc3Vib2JqZWN0cyB3aGljaCBjb250YWluIGEgdmJwdHIgZmllbGQuCisvLy8gVmlzaXRpbmcgZWFjaCBjbGFzcyBub2RlIHlpZWxkcyBhIGxpc3Qgb2YgaW5oZXJpdGFuY2UgcGF0aHMgdG8gdmJwdHJzLiAgRWFjaAorLy8vIHJlY29yZCB3aXRoIGEgdmJwdHIgY3JlYXRlcyBhbiBpbml0aWFsbHkgZW1wdHkgcGF0aC4KKy8vLworLy8vIFRvIGNvbWJpbmUgcGF0aHMgZnJvbSBjaGlsZCBub2RlcywgdGhlIHBhdGhzIGFyZSBjb21wYXJlZCB0byBjaGVjayBmb3IKKy8vLyBhbWJpZ3VpdHkuICBQYXRocyBhcmUgImFtYmlndW91cyIgaWYgbXVsdGlwbGUgcGF0aHMgaGF2ZSB0aGUgc2FtZSBzZXQgb2YKKy8vLyBjb21wb25lbnRzIGluIHRoZSBzYW1lIG9yZGVyLiAgRWFjaCBncm91cCBvZiBhbWJpZ3VvdXMgcGF0aHMgaXMgZXh0ZW5kZWQgYnkKKy8vLyBhcHBlbmRpbmcgdGhlIGNsYXNzIG9mIHRoZSBiYXNlIGZyb20gd2hpY2ggaXQgY2FtZS4gIElmIHRoZSBjdXJyZW50IGNsYXNzCisvLy8gbm9kZSBwcm9kdWNlZCBhbiBhbWJpZ3VvdXMgcGF0aCwgaXRzIHBhdGggaXMgZXh0ZW5kZWQgd2l0aCB0aGUgY3VycmVudCBjbGFzcy4KKy8vLyBBZnRlciBleHRlbmRpbmcgcGF0aHMsIE1TVkMgYWdhaW4gY2hlY2tzIGZvciBhbWJpZ3VpdHksIGFuZCBleHRlbmRzIGFueQorLy8vIGFtYmlndW91cyBwYXRoIHdoaWNoIHdhc24ndCBhbHJlYWR5IGV4dGVuZGVkLiAgQmVjYXVzZSBlYWNoIG5vZGUgeWllbGRzIGFuCisvLy8gdW5hbWJpZ3VvdXMgc2V0IG9mIHBhdGhzLCBNU1ZDIGRvZXNuJ3QgbmVlZCB0byBleHRlbmQgYW55IHBhdGggbW9yZSB0aGFuIG9uY2UKKy8vLyB0byBwcm9kdWNlIGFuIHVuYW1iaWd1b3VzIHNldCBvZiBwYXRocy4KKy8vLworLy8vIFRPRE86IFByZXN1bWFibHkgdmZ0YWJsZXMgdXNlIHRoZSBzYW1lIGFsZ29yaXRobS4KK3ZvaWQgTWljcm9zb2Z0VlRhYmxlQ29udGV4dDo6Y29tcHV0ZVZUYWJsZVBhdGhzKGJvb2wgRm9yVkJUYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQdHJJbmZvVmVjdG9yICZQYXRocykgeworICBhc3NlcnQoUGF0aHMuZW1wdHkoKSk7CisgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0ID0gQ29udGV4dC5nZXRBU1RSZWNvcmRMYXlvdXQoUkQpOworCisgIC8vIEJhc2UgY2FzZTogdGhpcyBzdWJvYmplY3QgaGFzIGl0cyBvd24gdnB0ci4KKyAgaWYgKEZvclZCVGFibGVzID8gTGF5b3V0Lmhhc093blZCUHRyKCkgOiBMYXlvdXQuaGFzT3duVkZQdHIoKSkKKyAgICBQYXRocy5wdXNoX2JhY2sobmV3IFZQdHJJbmZvKFJEKSk7CisKKyAgLy8gUmVjdXJzaXZlIGNhc2U6IGdldCBhbGwgdGhlIHZidGFibGVzIGZyb20gb3VyIGJhc2VzIGFuZCByZW1vdmUgYW55dGhpbmcKKyAgLy8gdGhhdCBzaGFyZXMgYSB2aXJ0dWFsIGJhc2UuCisgIGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IENYWFJlY29yZERlY2wqLCA0PiBWQmFzZXNTZWVuOworICBmb3IgKGNvbnN0IGF1dG8gJkIgOiBSRC0+YmFzZXMoKSkgeworICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2UgPSBCLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgICAgaWYgKEIuaXNWaXJ0dWFsKCkgJiYgVkJhc2VzU2Vlbi5jb3VudChCYXNlKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKCFCYXNlLT5pc0R5bmFtaWNDbGFzcygpKQorICAgICAgY29udGludWU7CisKKyAgICBjb25zdCBWUHRySW5mb1ZlY3RvciAmQmFzZVBhdGhzID0KKyAgICAgICAgRm9yVkJUYWJsZXMgPyBlbnVtZXJhdGVWQlRhYmxlcyhCYXNlKSA6IGdldFZGUHRyT2Zmc2V0cyhCYXNlKTsKKworICAgIGZvciAoVlB0ckluZm9WZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIElJID0gQmFzZVBhdGhzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUUgPSBCYXNlUGF0aHMuZW5kKCk7CisgICAgICAgICBJSSAhPSBFRTsgKytJSSkgeworICAgICAgVlB0ckluZm8gKkJhc2VJbmZvID0gKklJOworCisgICAgICAvLyBEb24ndCBpbmNsdWRlIHRoZSBwYXRoIGlmIGl0IGdvZXMgdGhyb3VnaCBhIHZpcnR1YWwgYmFzZSB0aGF0IHdlJ3ZlCisgICAgICAvLyBhbHJlYWR5IGluY2x1ZGVkLgorICAgICAgaWYgKHNldHNJbnRlcnNlY3QoVkJhc2VzU2VlbiwgQmFzZUluZm8tPkNvbnRhaW5pbmdWQmFzZXMpKQogICAgICAgICBjb250aW51ZTsKLSAgICAgIE5leHRCYXNlT2Zmc2V0ID0gTW9zdERlcml2ZWRDbGFzc0xheW91dC5nZXRWQmFzZUNsYXNzT2Zmc2V0KEJhc2VEZWNsKTsKLSAgICAgIE5leHRMYXN0VkJhc2UgPSBCYXNlRGVjbDsKLSAgICB9IGVsc2UgewotICAgICAgTmV4dEJhc2VPZmZzZXQgPSBPZmZzZXRJbkNvbXBsZXRlQ2xhc3MgKwotICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50Q2xhc3NMYXlvdXQuZ2V0QmFzZUNsYXNzT2Zmc2V0KEJhc2VEZWNsKTsKLSAgICAgIE5leHRMYXN0VkJhc2UgPSBMYXN0VkJhc2U7CisKKyAgICAgIC8vIENvcHkgdGhlIHBhdGggYW5kIGFkanVzdCBpdCBhcyBuZWNlc3NhcnkuCisgICAgICBWUHRySW5mbyAqUCA9IG5ldyBWUHRySW5mbygqQmFzZUluZm8pOworCisgICAgICAvLyBXZSBtYW5nbGUgQmFzZSBpbnRvIHRoZSBwYXRoIGlmIHRoZSBwYXRoIHdvdWxkJ3ZlIGJlZW4gYW1iaWd1b3VzIGFuZCBpdAorICAgICAgLy8gd2Fzbid0IGFscmVhZHkgZXh0ZW5kZWQgd2l0aCBCYXNlLgorICAgICAgaWYgKFAtPk1hbmdsZWRQYXRoLmVtcHR5KCkgfHwgUC0+TWFuZ2xlZFBhdGguYmFjaygpICE9IEJhc2UpCisgICAgICAgIFAtPk5leHRCYXNlVG9NYW5nbGUgPSBCYXNlOworCisgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBmdWxsIHBhdGguCisgICAgICAvLyBGSVhNRTogV2h5IGRvIHdlIG5lZWQgdGhpcz8KKyAgICAgIFAtPlBhdGhUb0Jhc2VXaXRoVlB0ci5pbnNlcnQoUC0+UGF0aFRvQmFzZVdpdGhWUHRyLmJlZ2luKCksIEJhc2UpOworCisgICAgICAvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGRlcml2ZWQgY2xhc3MgdWx0aW1hdGVseSB1c2VzIHRoZSB2dGFibGUsIGFuZCB3aGF0CisgICAgICAvLyB0aGUgZnVsbCBhZGp1c3RtZW50IGlzIGZyb20gdGhlIE1EQyB0byB0aGlzIHZ0YWJsZS4gIFRoZSBhZGp1c3RtZW50IGlzCisgICAgICAvLyBjYXB0dXJlZCBieSBhbiBvcHRpb25hbCB2YmFzZSBhbmQgYSBub24tdmlydHVhbCBvZmZzZXQuCisgICAgICBpZiAoQmFzZSA9PSAoRm9yVkJUYWJsZXMgPyBMYXlvdXQuZ2V0QmFzZVNoYXJpbmdWQlB0cigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBMYXlvdXQuZ2V0UHJpbWFyeUJhc2UoKSkpCisgICAgICAgIFAtPlJldXNpbmdCYXNlID0gUkQ7CisgICAgICBpZiAoQi5pc1ZpcnR1YWwoKSkKKyAgICAgICAgUC0+Q29udGFpbmluZ1ZCYXNlcy5wdXNoX2JhY2soQmFzZSk7CisgICAgICBlbHNlIGlmIChQLT5Db250YWluaW5nVkJhc2VzLmVtcHR5KCkpCisgICAgICAgIFAtPk5vblZpcnR1YWxPZmZzZXQgKz0gTGF5b3V0LmdldEJhc2VDbGFzc09mZnNldChCYXNlKTsKKworICAgICAgLy8gVXBkYXRlIHRoZSBmdWxsIG9mZnNldCBpbiB0aGUgTURDLgorICAgICAgUC0+RnVsbE9mZnNldEluTURDID0gUC0+Tm9uVmlydHVhbE9mZnNldDsKKyAgICAgIGlmIChjb25zdCBDWFhSZWNvcmREZWNsICpWQiA9IFAtPmdldFZCYXNlV2l0aFZQdHIoKSkKKyAgICAgICAgUC0+RnVsbE9mZnNldEluTURDICs9IExheW91dC5nZXRWQmFzZUNsYXNzT2Zmc2V0KFZCKTsKKworICAgICAgUGF0aHMucHVzaF9iYWNrKFApOwogICAgIH0KIAotICAgIFZGUHRySW5mbzo6QmFzZVBhdGggTmV3UGF0aCA9IFBhdGhGcm9tQ29tcGxldGVDbGFzczsKLSAgICBOZXdQYXRoLnB1c2hfYmFjayhCYXNlRGVjbCk7Ci0gICAgQmFzZVN1Ym9iamVjdCBOZXh0QmFzZShCYXNlRGVjbCwgTmV4dEJhc2VPZmZzZXQpOworICAgIGlmIChCLmlzVmlydHVhbCgpKQorICAgICAgVkJhc2VzU2Vlbi5pbnNlcnQoQmFzZSk7CiAKLSAgICBlbnVtZXJhdGVWRlB0cnMoTW9zdERlcml2ZWRDbGFzcywgTW9zdERlcml2ZWRDbGFzc0xheW91dCwgTmV4dEJhc2UsCi0gICAgICAgICAgICAgICAgICAgIE5leHRMYXN0VkJhc2UsIE5ld1BhdGgsIFZpc2l0ZWRWQmFzZXMsIFJlc3VsdCk7CisgICAgLy8gQWZ0ZXIgdmlzaXRpbmcgYW55IGRpcmVjdCBiYXNlLCB3ZSd2ZSB0cmFuc2l0aXZlbHkgdmlzaXRlZCBhbGwgb2YgaXRzCisgICAgLy8gbW9yYWxseSB2aXJ0dWFsIGJhc2VzLgorICAgIGZvciAoY29uc3QgYXV0byAmVkIgOiBCYXNlLT52YmFzZXMoKSkKKyAgICAgIFZCYXNlc1NlZW4uaW5zZXJ0KFZCLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCkpOwogICB9CisKKyAgLy8gU29ydCB0aGUgcGF0aHMgaW50byBidWNrZXRzLCBhbmQgaWYgYW55IG9mIHRoZW0gYXJlIGFtYmlndW91cywgZXh0ZW5kIGFsbAorICAvLyBwYXRocyBpbiBhbWJpZ3VvdXMgYnVja2V0cy4KKyAgYm9vbCBDaGFuZ2VkID0gdHJ1ZTsKKyAgd2hpbGUgKENoYW5nZWQpCisgICAgQ2hhbmdlZCA9IHJlYnVja2V0UGF0aHMoUGF0aHMpOwogfQogCi0vLy8gQ2FsY3VsYXRlUGF0aFRvTWFuZ2xlIC0gQ2FsY3VsYXRlIHRoZSBzdWJzZXQgb2YgcmVjb3JkcyB0aGF0IHNob3VsZCBiZSB1c2VkCi0vLy8gdG8gbWFuZ2xlIHRoZSB2ZnRhYmxlIGZvciB0aGUgZ2l2ZW4gdmZwdHIuCi0vLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGEgY2xhc3MgaGFzIG11bHRpcGxlIHZmdGFibGVzLgotc3RhdGljIHZvaWQKLUNhbGN1bGF0ZVBhdGhUb01hbmdsZShjb25zdCBDWFhSZWNvcmREZWNsICpSRCwgVkZQdHJJbmZvICZWRlB0cikgewotICAvLyBGSVhNRTogSW4gc29tZSByYXJlIGNhc2VzIHRoaXMgY29kZSBwcm9kdWNlcyBhIHNsaWdodGx5IGluY29ycmVjdCBtYW5nbGluZy4KLSAgLy8gSXQncyB2ZXJ5IGxpa2VseSB0aGF0IHRoZSB2YnRhYmxlIG1hbmdsaW5nIGNvZGUgY2FuIGJlIGFkanVzdGVkIHRvIG1hbmdsZQotICAvLyBib3RoIHZmdGFibGVzIGFuZCB2YnRhYmxlcyBjb3JyZWN0bHkuCi0KLSAgVkZQdHJJbmZvOjpCYXNlUGF0aCAmRnVsbFBhdGggPSBWRlB0ci5QYXRoVG9CYXNlV2l0aFZGUHRyOwotICBpZiAoRnVsbFBhdGguZW1wdHkoKSkgewotICAgIC8vIE1hbmdsZSB0aGUgY2xhc3MncyBvd24gdmZ0YWJsZS4KLSAgICBhc3NlcnQoUkQtPmdldE51bVZCYXNlcygpICYmCi0gICAgICAgICAgICJTb21ldGhpbmcncyB3cm9uZzogaWYgdGhlIG1vc3QgZGVyaXZlZCAiCi0gICAgICAgICAgICJjbGFzcyBoYXMgbW9yZSB0aGFuIG9uZSB2ZnRhYmxlLCBpdCBjYW4gb25seSBoYXZlIGl0cyBvd24gIgotICAgICAgICAgICAidmZ0YWJsZSBpZiBpdCBoYXMgdmJhc2VzIik7Ci0gICAgVkZQdHIuUGF0aFRvTWFuZ2xlLnB1c2hfYmFjayhSRCk7Ci0gICAgcmV0dXJuOworc3RhdGljIGJvb2wgZXh0ZW5kUGF0aChWUHRySW5mbyAqUCkgeworICBpZiAoUC0+TmV4dEJhc2VUb01hbmdsZSkgeworICAgIFAtPk1hbmdsZWRQYXRoLnB1c2hfYmFjayhQLT5OZXh0QmFzZVRvTWFuZ2xlKTsKKyAgICBQLT5OZXh0QmFzZVRvTWFuZ2xlID0gMDsgIC8vIFByZXZlbnQgdGhlIHBhdGggZnJvbSBiZWluZyBleHRlbmRlZCB0d2ljZS4KKyAgICByZXR1cm4gdHJ1ZTsKICAgfQotCi0gIHVuc2lnbmVkIEJlZ2luID0gMDsKLQotICAvLyBGaXJzdCwgc2tpcCBhbGwgdGhlIGJhc2VzIGJlZm9yZSB0aGUgdmJhc2UuCi0gIGlmIChWRlB0ci5MYXN0VkJhc2UpIHsKLSAgICB3aGlsZSAoRnVsbFBhdGhbQmVnaW5dICE9IFZGUHRyLkxhc3RWQmFzZSkgewotICAgICAgQmVnaW4rKzsKLSAgICAgIGFzc2VydChCZWdpbiA8IEZ1bGxQYXRoLnNpemUoKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVGhlbiwgcHV0IHRoZSByZXN0IG9mIHRoZSBiYXNlIHBhdGggaW4gdGhlIHJldmVyc2Ugb3JkZXIuCi0gIGZvciAodW5zaWduZWQgSSA9IEZ1bGxQYXRoLnNpemUoKTsgSSAhPSBCZWdpbjsgLS1JKSB7Ci0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQ3VyQmFzZSA9IEZ1bGxQYXRoW0kgLSAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICpJdHNCYXNlID0gKEkgPT0gMSkgPyBSRCA6IEZ1bGxQYXRoW0kgLSAyXTsKLSAgICBib29sIEJhc2VJc1ZpcnR1YWwgPSBmYWxzZTsKLSAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSiA9IEl0c0Jhc2UtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICBGID0gSXRzQmFzZS0+YmFzZXNfZW5kKCk7IEogIT0gRjsgKytKKSB7Ci0gICAgICBpZiAoSi0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKSA9PSBDdXJCYXNlKSB7Ci0gICAgICAgIEJhc2VJc1ZpcnR1YWwgPSBKLT5pc1ZpcnR1YWwoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2hvdWxkIHNraXAgdGhlIGN1cnJlbnQgYmFzZSBpZiBpdCBpcyBhIG5vbi12aXJ0dWFsIGJhc2Ugd2l0aCBubyBzaWJsaW5ncy4KLSAgICBpZiAoQmFzZUlzVmlydHVhbCB8fCBJdHNCYXNlLT5nZXROdW1CYXNlcygpICE9IDEpCi0gICAgICBWRlB0ci5QYXRoVG9NYW5nbGUucHVzaF9iYWNrKEN1ckJhc2UpOwotICB9CisgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBNaWNyb3NvZnRWVGFibGVDb250ZXh0OjplbnVtZXJhdGVWRlB0cnMoCi0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqRm9yQ2xhc3MsCi0gICAgTWljcm9zb2Z0VlRhYmxlQ29udGV4dDo6VkZQdHJMaXN0VHkgJlJlc3VsdCkgewotICBSZXN1bHQuY2xlYXIoKTsKLSAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZDbGFzc0xheW91dCA9IENvbnRleHQuZ2V0QVNUUmVjb3JkTGF5b3V0KEZvckNsYXNzKTsKLSAgQmFzZXNTZXRWZWN0b3JUeSBWaXNpdGVkVkJhc2VzOwotICBlbnVtZXJhdGVWRlB0cnMoRm9yQ2xhc3MsIENsYXNzTGF5b3V0LAotICAgICAgICAgICAgICAgICAgQmFzZVN1Ym9iamVjdChGb3JDbGFzcywgQ2hhclVuaXRzOjpaZXJvKCkpLCAwLAotICAgICAgICAgICAgICAgICAgVkZQdHJJbmZvOjpCYXNlUGF0aCgpLCBWaXNpdGVkVkJhc2VzLCBSZXN1bHQpOwotICBpZiAoUmVzdWx0LnNpemUoKSA+IDEpIHsKLSAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gUmVzdWx0LnNpemUoKTsgSSAhPSBFOyArK0kpCi0gICAgICBDYWxjdWxhdGVQYXRoVG9NYW5nbGUoRm9yQ2xhc3MsIFJlc3VsdFtJXSk7CitzdGF0aWMgYm9vbCByZWJ1Y2tldFBhdGhzKFZQdHJJbmZvVmVjdG9yICZQYXRocykgeworICAvLyBXaGF0IHdlJ3JlIGVzc2VudGlhbGx5IGRvaW5nIGhlcmUgaXMgYnVja2V0aW5nIHRvZ2V0aGVyIGFtYmlndW91cyBwYXRocy4KKyAgLy8gQW55IGJ1Y2tldCB3aXRoIG1vcmUgdGhhbiBvbmUgcGF0aCBpbiBpdCBnZXRzIGV4dGVuZGVkIGJ5IE5leHRCYXNlLCB3aGljaAorICAvLyBpcyB1c3VhbGx5IHRoZSBkaXJlY3QgYmFzZSBvZiB0aGUgaW5oZXJpdGVkIHRoZSB2YnB0ci4gIFRoaXMgY29kZSB1c2VzIGEKKyAgLy8gc29ydGVkIHZlY3RvciB0byBpbXBsZW1lbnQgYSBtdWx0aXNldCB0byBmb3JtIHRoZSBidWNrZXRzLiAgTm90ZSB0aGF0IHRoZQorICAvLyBvcmRlcmluZyBpcyBiYXNlZCBvbiBwb2ludGVycywgYnV0IGl0IGRvZXNuJ3QgY2hhbmdlIG91ciBvdXRwdXQgb3JkZXIuICBUaGUKKyAgLy8gY3VycmVudCBhbGdvcml0aG0gaXMgZGVzaWduZWQgdG8gbWF0Y2ggTVNWQyAyMDEyJ3MgbmFtZXMuCisgIFZQdHJJbmZvVmVjdG9yIFBhdGhzU29ydGVkKFBhdGhzKTsKKyAgc3RkOjpzb3J0KFBhdGhzU29ydGVkLmJlZ2luKCksIFBhdGhzU29ydGVkLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgVlB0ckluZm8gKkxIUywgY29uc3QgVlB0ckluZm8gKlJIUykgeworICAgIHJldHVybiBMSFMtPk1hbmdsZWRQYXRoIDwgUkhTLT5NYW5nbGVkUGF0aDsKKyAgfSk7CisgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICBmb3IgKHNpemVfdCBJID0gMCwgRSA9IFBhdGhzU29ydGVkLnNpemUoKTsgSSAhPSBFOykgeworICAgIC8vIFNjYW4gZm9yd2FyZCB0byBmaW5kIHRoZSBlbmQgb2YgdGhlIGJ1Y2tldC4KKyAgICBzaXplX3QgQnVja2V0U3RhcnQgPSBJOworICAgIGRvIHsKKyAgICAgICsrSTsKKyAgICB9IHdoaWxlIChJICE9IEUgJiYgUGF0aHNTb3J0ZWRbQnVja2V0U3RhcnRdLT5NYW5nbGVkUGF0aCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aHNTb3J0ZWRbSV0tPk1hbmdsZWRQYXRoKTsKKworICAgIC8vIElmIHRoaXMgYnVja2V0IGhhcyBtdWx0aXBsZSBwYXRocywgZXh0ZW5kIHRoZW0gYWxsLgorICAgIGlmIChJIC0gQnVja2V0U3RhcnQgPiAxKSB7CisgICAgICBmb3IgKHNpemVfdCBJSSA9IEJ1Y2tldFN0YXJ0OyBJSSAhPSBJOyArK0lJKQorICAgICAgICBDaGFuZ2VkIHw9IGV4dGVuZFBhdGgoUGF0aHNTb3J0ZWRbSUldKTsKKyAgICAgIGFzc2VydChDaGFuZ2VkICYmICJubyBwYXRocyB3ZXJlIGV4dGVuZGVkIHRvIGZpeCBhbWJpZ3VpdHkiKTsKKyAgICB9CiAgIH0KKyAgcmV0dXJuIENoYW5nZWQ7Cit9CisKK01pY3Jvc29mdFZUYWJsZUNvbnRleHQ6On5NaWNyb3NvZnRWVGFibGVDb250ZXh0KCkgeworICBsbHZtOjpEZWxldGVDb250YWluZXJTZWNvbmRzKFZGUHRyTG9jYXRpb25zKTsKKyAgbGx2bTo6RGVsZXRlQ29udGFpbmVyU2Vjb25kcyhWRlRhYmxlTGF5b3V0cyk7CisgIGxsdm06OkRlbGV0ZUNvbnRhaW5lclNlY29uZHMoVkJhc2VJbmZvKTsKIH0KIAogdm9pZCBNaWNyb3NvZnRWVGFibGVDb250ZXh0Ojpjb21wdXRlVlRhYmxlUmVsYXRlZEluZm9ybWF0aW9uKApAQCAtMzI2OSwyNCArMzI4NywzMSBAQAogCiAgIGNvbnN0IFZUYWJsZUxheW91dDo6QWRkcmVzc1BvaW50c01hcFR5IEVtcHR5QWRkcmVzc1BvaW50c01hcDsKIAotICBWRlB0ckxpc3RUeSAmVkZQdHJzID0gVkZQdHJMb2NhdGlvbnNbUkRdOwotICBlbnVtZXJhdGVWRlB0cnMoUkQsIFZGUHRycyk7CisgIFZQdHJJbmZvVmVjdG9yICpWRlB0cnMgPSBuZXcgVlB0ckluZm9WZWN0b3IoKTsKKyAgY29tcHV0ZVZUYWJsZVBhdGhzKC8qRm9yVkJUYWJsZXM9Ki9mYWxzZSwgUkQsICpWRlB0cnMpOworICBWRlB0ckxvY2F0aW9uc1tSRF0gPSBWRlB0cnM7CiAKICAgTWV0aG9kVkZUYWJsZUxvY2F0aW9uc1R5IE5ld01ldGhvZExvY2F0aW9uczsKLSAgZm9yIChWRlB0ckxpc3RUeTo6aXRlcmF0b3IgSSA9IFZGUHRycy5iZWdpbigpLCBFID0gVkZQdHJzLmVuZCgpOworICBmb3IgKFZQdHJJbmZvVmVjdG9yOjppdGVyYXRvciBJID0gVkZQdHJzLT5iZWdpbigpLCBFID0gVkZQdHJzLT5lbmQoKTsKICAgICAgICBJICE9IEU7ICsrSSkgewogICAgIFZGVGFibGVCdWlsZGVyIEJ1aWxkZXIoKnRoaXMsIFJELCAqSSk7CiAKLSAgICBWRlRhYmxlSWRUeSBpZChSRCwgSS0+VkZQdHJGdWxsT2Zmc2V0KTsKKyAgICBWRlRhYmxlSWRUeSBpZChSRCwgKCpJKS0+RnVsbE9mZnNldEluTURDKTsKICAgICBhc3NlcnQoVkZUYWJsZUxheW91dHMuY291bnQoaWQpID09IDApOwogICAgIFNtYWxsVmVjdG9yPFZUYWJsZUxheW91dDo6VlRhYmxlVGh1bmtUeSwgMT4gVlRhYmxlVGh1bmtzKAogICAgICAgICBCdWlsZGVyLnZ0YWJsZV90aHVua3NfYmVnaW4oKSwgQnVpbGRlci52dGFibGVfdGh1bmtzX2VuZCgpKTsKICAgICBWRlRhYmxlTGF5b3V0c1tpZF0gPSBuZXcgVlRhYmxlTGF5b3V0KAogICAgICAgICBCdWlsZGVyLmdldE51bVZUYWJsZUNvbXBvbmVudHMoKSwgQnVpbGRlci52dGFibGVfY29tcG9uZW50X2JlZ2luKCksCiAgICAgICAgIFZUYWJsZVRodW5rcy5zaXplKCksIFZUYWJsZVRodW5rcy5kYXRhKCksIEVtcHR5QWRkcmVzc1BvaW50c01hcCwgdHJ1ZSk7Ci0gICAgTmV3TWV0aG9kTG9jYXRpb25zLmluc2VydChCdWlsZGVyLnZ0YWJsZV9pbmRpY2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLnZ0YWJsZV9pbmRpY2VzX2VuZCgpKTsKICAgICBUaHVua3MuaW5zZXJ0KEJ1aWxkZXIudGh1bmtzX2JlZ2luKCksIEJ1aWxkZXIudGh1bmtzX2VuZCgpKTsKKworICAgIGZvciAoY29uc3QgYXV0byAmTG9jIDogQnVpbGRlci52dGFibGVfbG9jYXRpb25zKCkpIHsKKyAgICAgIEdsb2JhbERlY2wgR0QgPSBMb2MuZmlyc3Q7CisgICAgICBNZXRob2RWRlRhYmxlTG9jYXRpb24gTmV3TG9jID0gTG9jLnNlY29uZDsKKyAgICAgIGF1dG8gTSA9IE5ld01ldGhvZExvY2F0aW9ucy5maW5kKEdEKTsKKyAgICAgIGlmIChNID09IE5ld01ldGhvZExvY2F0aW9ucy5lbmQoKSB8fCBOZXdMb2MgPCBNLT5zZWNvbmQpCisgICAgICAgIE5ld01ldGhvZExvY2F0aW9uc1tHRF0gPSBOZXdMb2M7CisgICAgfQogICB9CiAKICAgTWV0aG9kVkZUYWJsZUxvY2F0aW9ucy5pbnNlcnQoTmV3TWV0aG9kTG9jYXRpb25zLmJlZ2luKCksCkBAIC0zMzI0LDggKzMzNDksMTAgQEAKICAgLy8gUHJpbnQgdGhlIHZ0YWJsZSBpbmRpY2VzIGZvciBhbGwgdGhlIG1lbWJlciBmdW5jdGlvbnMuCiAgIGlmICghSW5kaWNlc01hcC5lbXB0eSgpKSB7CiAgICAgT3V0IDw8ICJWRlRhYmxlIGluZGljZXMgZm9yICI7Ci0gICAgT3V0IDw8ICInIiA8PCBSRC0+Z2V0UXVhbGlmaWVkTmFtZUFzU3RyaW5nKCk7Ci0gICAgT3V0IDw8ICInICgiIDw8IEluZGljZXNNYXAuc2l6ZSgpIDw8ICIgZW50cmllcykuXG4iOworICAgIE91dCA8PCAiJyI7CisgICAgUkQtPnByaW50UXVhbGlmaWVkTmFtZShPdXQpOworICAgIE91dCA8PCAiJyAoIiA8PCBJbmRpY2VzTWFwLnNpemUoKQorICAgICAgICA8PCAoSW5kaWNlc01hcC5zaXplKCkgPT0gMSA/ICIgZW50cnkiIDogIiBlbnRyaWVzIikgPDwgIikuXG4iOwogCiAgICAgQ2hhclVuaXRzIExhc3RWRlB0ck9mZnNldCA9IENoYXJVbml0czo6ZnJvbVF1YW50aXR5KC0xKTsKICAgICB1aW50NjRfdCBMYXN0VkJJbmRleCA9IDA7CkBAIC0zMzUyLDQ5ICszMzc5LDY2IEBACiAgICAgfQogICAgIE91dCA8PCAnXG4nOwogICB9CisKKyAgT3V0LmZsdXNoKCk7CiB9CiAKLXZvaWQgTWljcm9zb2Z0VlRhYmxlQ29udGV4dDo6Y29tcHV0ZVZCVGFibGVSZWxhdGVkSW5mb3JtYXRpb24oCitjb25zdCBWaXJ0dWFsQmFzZUluZm8gKk1pY3Jvc29mdFZUYWJsZUNvbnRleHQ6OmNvbXB1dGVWQlRhYmxlUmVsYXRlZEluZm9ybWF0aW9uKAogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7Ci0gIGlmIChDb21wdXRlZFZCVGFibGVJbmRpY2VzLmNvdW50KFJEKSkKLSAgICByZXR1cm47Ci0gIENvbXB1dGVkVkJUYWJsZUluZGljZXMuaW5zZXJ0KFJEKTsKKyAgVmlydHVhbEJhc2VJbmZvICpWQkk7CiAKLSAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZMYXlvdXQgPSBDb250ZXh0LmdldEFTVFJlY29yZExheW91dChSRCk7Ci0gIEJhc2VzU2V0VmVjdG9yVHkgVmlzaXRlZEJhc2VzOworICB7CisgICAgLy8gR2V0IG9yIGNyZWF0ZSBhIFZCSSBmb3IgUkQuICBEb24ndCBob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBEZW5zZU1hcCBjZWxsLAorICAgIC8vIGFzIGl0IG1heSBiZSBtb2RpZmllZCBhbmQgcmVoYXNoZWQgdW5kZXIgdXMuCisgICAgVmlydHVhbEJhc2VJbmZvIComRW50cnkgPSBWQmFzZUluZm9bUkRdOworICAgIGlmIChFbnRyeSkKKyAgICAgIHJldHVybiBFbnRyeTsKKyAgICBFbnRyeSA9IFZCSSA9IG5ldyBWaXJ0dWFsQmFzZUluZm8oKTsKKyAgfQorCisgIGNvbXB1dGVWVGFibGVQYXRocygvKkZvclZCVGFibGVzPSovdHJ1ZSwgUkQsIFZCSS0+VkJQdHJQYXRocyk7CiAKICAgLy8gRmlyc3QsIHNlZSBpZiB0aGUgRGVyaXZlZCBjbGFzcyBzaGFyZWQgdGhlIHZicHRyIHdpdGggYSBub24tdmlydHVhbCBiYXNlLgorICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCA9IENvbnRleHQuZ2V0QVNUUmVjb3JkTGF5b3V0KFJEKTsKICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKlZCUHRyQmFzZSA9IExheW91dC5nZXRCYXNlU2hhcmluZ1ZCUHRyKCkpIHsKLSAgICAvLyBJZiB0aGUgRGVyaXZlZCBjbGFzcyBzaGFyZXMgdGhlIHZicHRyIHdpdGggYSBub24tdmlydHVhbCBiYXNlLAotICAgIC8vIGl0IGluaGVyaXRzIGl0cyB2YmFzZSBpbmRpY2VzLgotICAgIGNvbXB1dGVWQlRhYmxlUmVsYXRlZEluZm9ybWF0aW9uKFZCUHRyQmFzZSk7Ci0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBWQlB0ckJhc2UtPnZiYXNlc19iZWdpbigpLAotICAgICAgICAgRSA9IFZCUHRyQmFzZS0+dmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqU3ViVkJhc2UgPSBJLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOwotICAgICAgYXNzZXJ0KFZCVGFibGVJbmRpY2VzLmNvdW50KENsYXNzUGFpclR5KFZCUHRyQmFzZSwgU3ViVkJhc2UpKSk7Ci0gICAgICBWQlRhYmxlSW5kaWNlc1tDbGFzc1BhaXJUeShSRCwgU3ViVkJhc2UpXSA9Ci0gICAgICAgICAgVkJUYWJsZUluZGljZXNbQ2xhc3NQYWlyVHkoVkJQdHJCYXNlLCBTdWJWQmFzZSldOwotICAgICAgVmlzaXRlZEJhc2VzLmluc2VydChTdWJWQmFzZSk7Ci0gICAgfQorICAgIC8vIElmIHRoZSBEZXJpdmVkIGNsYXNzIHNoYXJlcyB0aGUgdmJwdHIgd2l0aCBhIG5vbi12aXJ0dWFsIGJhc2UsIHRoZSBzaGFyZWQKKyAgICAvLyB2aXJ0dWFsIGJhc2VzIGNvbWUgZmlyc3Qgc28gdGhhdCB0aGUgbGF5b3V0IGlzIHRoZSBzYW1lLgorICAgIGNvbnN0IFZpcnR1YWxCYXNlSW5mbyAqQmFzZUluZm8gPQorICAgICAgICBjb21wdXRlVkJUYWJsZVJlbGF0ZWRJbmZvcm1hdGlvbihWQlB0ckJhc2UpOworICAgIFZCSS0+VkJUYWJsZUluZGljZXMuaW5zZXJ0KEJhc2VJbmZvLT5WQlRhYmxlSW5kaWNlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VJbmZvLT5WQlRhYmxlSW5kaWNlcy5lbmQoKSk7CiAgIH0KIAogICAvLyBOZXcgdmJhc2VzIGFyZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSB2YnRhYmxlLgogICAvLyBTa2lwIHRoZSBzZWxmIGVudHJ5IGFuZCB2YmFzZXMgdmlzaXRlZCBpbiB0aGUgbm9uLXZpcnR1YWwgYmFzZSwgaWYgYW55LgotICB1bnNpZ25lZCBWQlRhYmxlSW5kZXggPSAxICsgVmlzaXRlZEJhc2VzLnNpemUoKTsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IFJELT52YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQ3VyVkJhc2UgPSBJLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOwotICAgIGlmIChWaXNpdGVkQmFzZXMuaW5zZXJ0KEN1clZCYXNlKSkKLSAgICAgIFZCVGFibGVJbmRpY2VzW0NsYXNzUGFpclR5KFJELCBDdXJWQmFzZSldID0gVkJUYWJsZUluZGV4Kys7CisgIHVuc2lnbmVkIFZCVGFibGVJbmRleCA9IDEgKyBWQkktPlZCVGFibGVJbmRpY2VzLnNpemUoKTsKKyAgZm9yIChjb25zdCBhdXRvICZWQiA6IFJELT52YmFzZXMoKSkgeworICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkN1clZCYXNlID0gVkIuZ2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKKyAgICBpZiAoIVZCSS0+VkJUYWJsZUluZGljZXMuY291bnQoQ3VyVkJhc2UpKQorICAgICAgVkJJLT5WQlRhYmxlSW5kaWNlc1tDdXJWQmFzZV0gPSBWQlRhYmxlSW5kZXgrKzsKICAgfQorCisgIHJldHVybiBWQkk7CiB9CiAKLWNvbnN0IE1pY3Jvc29mdFZUYWJsZUNvbnRleHQ6OlZGUHRyTGlzdFR5ICYKK3Vuc2lnbmVkIE1pY3Jvc29mdFZUYWJsZUNvbnRleHQ6OmdldFZCVGFibGVJbmRleChjb25zdCBDWFhSZWNvcmREZWNsICpEZXJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlZCYXNlKSB7CisgIGNvbnN0IFZpcnR1YWxCYXNlSW5mbyAqVkJJbmZvID0gY29tcHV0ZVZCVGFibGVSZWxhdGVkSW5mb3JtYXRpb24oRGVyaXZlZCk7CisgIGFzc2VydChWQkluZm8tPlZCVGFibGVJbmRpY2VzLmNvdW50KFZCYXNlKSk7CisgIHJldHVybiBWQkluZm8tPlZCVGFibGVJbmRpY2VzLmZpbmQoVkJhc2UpLT5zZWNvbmQ7Cit9CisKK2NvbnN0IFZQdHJJbmZvVmVjdG9yICYKK01pY3Jvc29mdFZUYWJsZUNvbnRleHQ6OmVudW1lcmF0ZVZCVGFibGVzKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7CisgIHJldHVybiBjb21wdXRlVkJUYWJsZVJlbGF0ZWRJbmZvcm1hdGlvbihSRCktPlZCUHRyUGF0aHM7Cit9CisKK2NvbnN0IFZQdHJJbmZvVmVjdG9yICYKIE1pY3Jvc29mdFZUYWJsZUNvbnRleHQ6OmdldFZGUHRyT2Zmc2V0cyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgewogICBjb21wdXRlVlRhYmxlUmVsYXRlZEluZm9ybWF0aW9uKFJEKTsKIAogICBhc3NlcnQoVkZQdHJMb2NhdGlvbnMuY291bnQoUkQpICYmICJDb3VsZG4ndCBmaW5kIHZmcHRyIGxvY2F0aW9ucyIpOwotICByZXR1cm4gVkZQdHJMb2NhdGlvbnNbUkRdOworICByZXR1cm4gKlZGUHRyTG9jYXRpb25zW1JEXTsKIH0KIAogY29uc3QgVlRhYmxlTGF5b3V0ICYKZGlmZiAtLWdpdCBhL2xpYi9BU1RNYXRjaGVycy9BU1RNYXRjaEZpbmRlci5jcHAgYi9saWIvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hGaW5kZXIuY3BwCmluZGV4IGY2ZGNiOTcuLjcyYTlkMDMgMTAwNjQ0Ci0tLSBhL2xpYi9BU1RNYXRjaGVycy9BU1RNYXRjaEZpbmRlci5jcHAKKysrIGIvbGliL0FTVE1hdGNoZXJzL0FTVE1hdGNoRmluZGVyLmNwcApAQCAtNTgsMTEgKzU4LDggQEAKICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyIEJvdW5kTm9kZXM7CiAKICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgTWF0Y2hLZXkgJk90aGVyKSBjb25zdCB7Ci0gICAgaWYgKE1hdGNoZXJJRCAhPSBPdGhlci5NYXRjaGVySUQpCi0gICAgICByZXR1cm4gTWF0Y2hlcklEIDwgT3RoZXIuTWF0Y2hlcklEOwotICAgIGlmIChOb2RlICE9IE90aGVyLk5vZGUpCi0gICAgICByZXR1cm4gTm9kZSA8IE90aGVyLk5vZGU7Ci0gICAgcmV0dXJuIEJvdW5kTm9kZXMgPCBPdGhlci5Cb3VuZE5vZGVzOworICAgIHJldHVybiBzdGQ6OnRpZShNYXRjaGVySUQsIE5vZGUsIEJvdW5kTm9kZXMpIDwKKyAgICAgICAgICAgc3RkOjp0aWUoT3RoZXIuTWF0Y2hlcklELCBPdGhlci5Ob2RlLCBPdGhlci5Cb3VuZE5vZGVzKTsKICAgfQogfTsKIApAQCAtMjcyLDggKzI2OSw4IEBACiAgIC8vIHRyYXZlcnNhbCBzaG91bGQgY29udGludWUgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zLgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgYm9vbCB0cmF2ZXJzZShjb25zdCBUICZOb2RlKSB7Ci0gICAgVE9PTElOR19DT01QSUxFX0FTU0VSVChJc0Jhc2VUeXBlPFQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlX2Nhbl9vbmx5X2JlX2luc3RhbnRpYXRlZF93aXRoX2Jhc2VfdHlwZSk7CisgICAgc3RhdGljX2Fzc2VydChJc0Jhc2VUeXBlPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ0cmF2ZXJzZSBjYW4gb25seSBiZSBpbnN0YW50aWF0ZWQgd2l0aCBiYXNlIHR5cGUiKTsKICAgICBpZiAoIW1hdGNoKE5vZGUpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIHJldHVybiBiYXNlVHJhdmVyc2UoTm9kZSk7CkBAIC00MTAsMzYgKzQwNywzNiBAQAogICAgIHJldHVybiBWaXNpdG9yLmZpbmRNYXRjaChOb2RlKTsKICAgfQogCi0gIHZpcnR1YWwgYm9vbCBjbGFzc0lzRGVyaXZlZEZyb20oY29uc3QgQ1hYUmVjb3JkRGVjbCAqRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWF0Y2hlcjxOYW1lZERlY2w+ICZCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcik7CisgIGJvb2wgY2xhc3NJc0Rlcml2ZWRGcm9tKGNvbnN0IENYWFJlY29yZERlY2wgKkRlY2xhcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXRjaGVyPE5hbWVkRGVjbD4gJkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlcikgb3ZlcnJpZGU7CiAKICAgLy8gSW1wbGVtZW50cyBBU1RNYXRjaEZpbmRlcjo6bWF0Y2hlc0NoaWxkT2YuCi0gIHZpcnR1YWwgYm9vbCBtYXRjaGVzQ2hpbGRPZihjb25zdCBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZSAmTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IER5blR5cGVkTWF0Y2hlciAmTWF0Y2hlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYXZlcnNhbEtpbmQgVHJhdmVyc2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZEtpbmQgQmluZCkgeworICBib29sIG1hdGNoZXNDaGlsZE9mKGNvbnN0IGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlICZOb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IER5blR5cGVkTWF0Y2hlciAmTWF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgVHJhdmVyc2FsS2luZCBUcmF2ZXJzYWwsCisgICAgICAgICAgICAgICAgICAgICAgQmluZEtpbmQgQmluZCkgb3ZlcnJpZGUgewogICAgIGlmIChSZXN1bHRDYWNoZS5zaXplKCkgPiBNYXhNZW1vaXphdGlvbkVudHJpZXMpCiAgICAgICBSZXN1bHRDYWNoZS5jbGVhcigpOwogICAgIHJldHVybiBtZW1vaXplZE1hdGNoZXNSZWN1cnNpdmVseShOb2RlLCBNYXRjaGVyLCBCdWlsZGVyLCAxLCBUcmF2ZXJzYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmQpOwogICB9CiAgIC8vIEltcGxlbWVudHMgQVNUTWF0Y2hGaW5kZXI6Om1hdGNoZXNEZXNjZW5kYW50T2YuCi0gIHZpcnR1YWwgYm9vbCBtYXRjaGVzRGVzY2VuZGFudE9mKGNvbnN0IGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlICZOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZEtpbmQgQmluZCkgeworICBib29sIG1hdGNoZXNEZXNjZW5kYW50T2YoY29uc3QgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgJk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kS2luZCBCaW5kKSBvdmVycmlkZSB7CiAgICAgaWYgKFJlc3VsdENhY2hlLnNpemUoKSA+IE1heE1lbW9pemF0aW9uRW50cmllcykKICAgICAgIFJlc3VsdENhY2hlLmNsZWFyKCk7CiAgICAgcmV0dXJuIG1lbW9pemVkTWF0Y2hlc1JlY3Vyc2l2ZWx5KE5vZGUsIE1hdGNoZXIsIEJ1aWxkZXIsIElOVF9NQVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRLX0FzSXMsIEJpbmQpOwogICB9CiAgIC8vIEltcGxlbWVudHMgQVNUTWF0Y2hGaW5kZXI6Om1hdGNoZXNBbmNlc3Rvck9mLgotICB2aXJ0dWFsIGJvb2wgbWF0Y2hlc0FuY2VzdG9yT2YoY29uc3QgYXN0X3R5cGVfdHJhaXRzOjpEeW5UeXBlZE5vZGUgJk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgKkJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmNlc3Rvck1hdGNoTW9kZSBNYXRjaE1vZGUpIHsKKyAgYm9vbCBtYXRjaGVzQW5jZXN0b3JPZihjb25zdCBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZSAmTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEeW5UeXBlZE1hdGNoZXIgJk1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFuY2VzdG9yTWF0Y2hNb2RlIE1hdGNoTW9kZSkgb3ZlcnJpZGUgewogICAgIC8vIFJlc2V0IHRoZSBjYWNoZSBvdXRzaWRlIG9mIHRoZSByZWN1cnNpdmUgY2FsbCB0byBtYWtlIHN1cmUgd2UKICAgICAvLyBkb24ndCBpbnZhbGlkYXRlIGFueSBpdGVyYXRvcnMuCiAgICAgaWYgKFJlc3VsdENhY2hlLnNpemUoKSA+IE1heE1lbW9pemF0aW9uRW50cmllcykKQEAgLTQ2OSw3ICs0NjYsNyBAQAogICB9CiAKICAgLy8gSW1wbGVtZW50cyBBU1RNYXRjaEZpbmRlcjo6Z2V0QVNUQ29udGV4dC4KLSAgdmlydHVhbCBBU1RDb250ZXh0ICZnZXRBU1RDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gKkFjdGl2ZUFTVENvbnRleHQ7IH0KKyAgQVNUQ29udGV4dCAmZ2V0QVNUQ29udGV4dCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICpBY3RpdmVBU1RDb250ZXh0OyB9CiAKICAgYm9vbCBzaG91bGRWaXNpdFRlbXBsYXRlSW5zdGFudGlhdGlvbnMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CiAgIGJvb2wgc2hvdWxkVmlzaXRJbXBsaWNpdENvZGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CkBAIC01NzYsNyArNTczLDcgQEAKICAgICAgIDogQ29udGV4dChDb250ZXh0KSwKICAgICAgICAgQ2FsbGJhY2soQ2FsbGJhY2spIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgdmlzaXRNYXRjaChjb25zdCBCb3VuZE5vZGVzJiBCb3VuZE5vZGVzVmlldykgeworICAgIHZvaWQgdmlzaXRNYXRjaChjb25zdCBCb3VuZE5vZGVzJiBCb3VuZE5vZGVzVmlldykgb3ZlcnJpZGUgewogICAgICAgQ2FsbGJhY2stPnJ1bihNYXRjaEZpbmRlcjo6TWF0Y2hSZXN1bHQoQm91bmROb2Rlc1ZpZXcsIENvbnRleHQpKTsKICAgICB9CiAKQEAgLTY2NywxMSArNjY0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyKSB7CiAgIGlmICghRGVjbGFyYXRpb24tPmhhc0RlZmluaXRpb24oKSkKICAgICByZXR1cm4gZmFsc2U7Ci0gIHR5cGVkZWYgQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBCYXNlSXRlcmF0b3I7Ci0gIGZvciAoQmFzZUl0ZXJhdG9yIEl0ID0gRGVjbGFyYXRpb24tPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgIEVuZCA9IERlY2xhcmF0aW9uLT5iYXNlc19lbmQoKTsKLSAgICAgICBJdCAhPSBFbmQ7ICsrSXQpIHsKLSAgICBjb25zdCBUeXBlICpUeXBlTm9kZSA9IEl0LT5nZXRUeXBlKCkuZ2V0VHlwZVB0cigpOworICBmb3IgKGNvbnN0IGF1dG8gJkl0IDogRGVjbGFyYXRpb24tPmJhc2VzKCkpIHsKKyAgICBjb25zdCBUeXBlICpUeXBlTm9kZSA9IEl0LmdldFR5cGUoKS5nZXRUeXBlUHRyKCk7CiAKICAgICBpZiAodHlwZUhhc01hdGNoaW5nQWxpYXMoVHlwZU5vZGUsIEJhc2UsIEJ1aWxkZXIpKQogICAgICAgcmV0dXJuIHRydWU7CkBAIC03NDksNyArNzQzLDcgQEAKICAgICAgIDogRmluZGVyKEZpbmRlciksIFBhcnNpbmdEb25lKFBhcnNpbmdEb25lKSB7fQogCiBwcml2YXRlOgotICB2aXJ0dWFsIHZvaWQgSGFuZGxlVHJhbnNsYXRpb25Vbml0KEFTVENvbnRleHQgJkNvbnRleHQpIHsKKyAgdm9pZCBIYW5kbGVUcmFuc2xhdGlvblVuaXQoQVNUQ29udGV4dCAmQ29udGV4dCkgb3ZlcnJpZGUgewogICAgIGlmIChQYXJzaW5nRG9uZSAhPSBOVUxMKSB7CiAgICAgICBQYXJzaW5nRG9uZS0+cnVuKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzSW50ZXJuYWwuY3BwIGIvbGliL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzSW50ZXJuYWwuY3BwCmluZGV4IGQxNWViNTQuLjQ3YjhiNmQgMTAwNjQ0Ci0tLSBhL2xpYi9BU1RNYXRjaGVycy9BU1RNYXRjaGVyc0ludGVybmFsLmNwcAorKysgYi9saWIvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnNJbnRlcm5hbC5jcHAKQEAgLTM0LDYgKzM0LDI2IEBACiAgIH0KIH0KIAorYm9vbCBOb3RVbmFyeU9wZXJhdG9yKGNvbnN0IGFzdF90eXBlX3RyYWl0czo6RHluVHlwZWROb2RlIER5bk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwgQm91bmROb2Rlc1RyZWVCdWlsZGVyICpCdWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPER5blR5cGVkTWF0Y2hlcj4gSW5uZXJNYXRjaGVycykgeworICBpZiAoSW5uZXJNYXRjaGVycy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gVGhlICd1bmxlc3MnIG1hdGNoZXIgd2lsbCBhbHdheXMgZGlzY2FyZCB0aGUgcmVzdWx0OgorICAvLyBJZiB0aGUgaW5uZXIgbWF0Y2hlciBkb2Vzbid0IG1hdGNoLCB1bmxlc3MgcmV0dXJucyB0cnVlLAorICAvLyBidXQgdGhlIGlubmVyIG1hdGNoZXIgY2Fubm90IGhhdmUgYm91bmQgYW55dGhpbmcuCisgIC8vIElmIHRoZSBpbm5lciBtYXRjaGVyIG1hdGNoZXMsIHRoZSByZXN1bHQgaXMgZmFsc2UsIGFuZAorICAvLyBhbnkgcG9zc2libGUgYmluZGluZyB3aWxsIGJlIGRpc2NhcmRlZC4KKyAgLy8gV2Ugc3RpbGwgbmVlZCB0byBoYW5kIGluIGFsbCB0aGUgYm91bmQgbm9kZXMgdXAgdG8gdGhpcworICAvLyBwb2ludCBzbyB0aGUgaW5uZXIgbWF0Y2hlciBjYW4gZGVwZW5kIG9uIGJvdW5kIG5vZGVzLAorICAvLyBhbmQgd2UgbmVlZCB0byBhY3RpdmVseSBkaXNjYXJkIHRoZSBib3VuZCBub2Rlcywgb3RoZXJ3aXNlCisgIC8vIHRoZSBpbm5lciBtYXRjaGVyIHdpbGwgcmVzZXQgdGhlIGJvdW5kIG5vZGVzIGlmIGl0IGRvZXNuJ3QKKyAgLy8gbWF0Y2gsIGJ1dCB0aGlzIHdvdWxkIGJlIGludmVyc2VkIGJ5ICd1bmxlc3MnLgorICBCb3VuZE5vZGVzVHJlZUJ1aWxkZXIgRGlzY2FyZCgqQnVpbGRlcik7CisgIHJldHVybiAhSW5uZXJNYXRjaGVyc1swXS5tYXRjaGVzKER5bk5vZGUsIEZpbmRlciwgJkRpc2NhcmQpOworfQorCiBib29sIEFsbE9mVmFyaWFkaWNPcGVyYXRvcihjb25zdCBhc3RfdHlwZV90cmFpdHM6OkR5blR5cGVkTm9kZSBEeW5Ob2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUTWF0Y2hGaW5kZXIgKkZpbmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNUcmVlQnVpbGRlciAqQnVpbGRlciwKZGlmZiAtLWdpdCBhL2xpYi9BU1RNYXRjaGVycy9DTWFrZUxpc3RzLnR4dCBiL2xpYi9BU1RNYXRjaGVycy9DTWFrZUxpc3RzLnR4dAppbmRleCA0YTM5MGE4Li44YThlOGMzIDEwMDY0NAotLS0gYS9saWIvQVNUTWF0Y2hlcnMvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL0FTVE1hdGNoZXJzL0NNYWtlTGlzdHMudHh0CkBAIC01LDE5ICs1LDcgQEAKIGFkZF9jbGFuZ19saWJyYXJ5KGNsYW5nQVNUTWF0Y2hlcnMKICAgQVNUTWF0Y2hGaW5kZXIuY3BwCiAgIEFTVE1hdGNoZXJzSW50ZXJuYWwuY3BwCi0gICkKIAotYWRkX2RlcGVuZGVuY2llcyhjbGFuZ0FTVE1hdGNoZXJzCi0gIENsYW5nQXR0ckNsYXNzZXMKLSAgQ2xhbmdBdHRySW1wbAotICBDbGFuZ0F0dHJMaXN0Ci0gIENsYW5nQ29tbWVudE5vZGVzCi0gIENsYW5nRGVjbE5vZGVzCi0gIENsYW5nRGlhZ25vc3RpY0NvbW1vbgotICBDbGFuZ1N0bXROb2RlcwotICApCi0KLXRhcmdldF9saW5rX2xpYnJhcmllcyhjbGFuZ0FTVE1hdGNoZXJzCi0gIGNsYW5nQmFzaWMKKyAgTElOS19MSUJTCiAgIGNsYW5nQVNUCiAgICkKZGlmZiAtLWdpdCBhL2xpYi9BU1RNYXRjaGVycy9EeW5hbWljL0NNYWtlTGlzdHMudHh0IGIvbGliL0FTVE1hdGNoZXJzL0R5bmFtaWMvQ01ha2VMaXN0cy50eHQKaW5kZXggODQzMzQxYi4uYzBkODBhZCAxMDA2NDQKLS0tIGEvbGliL0FTVE1hdGNoZXJzL0R5bmFtaWMvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL0FTVE1hdGNoZXJzL0R5bmFtaWMvQ01ha2VMaXN0cy50eHQKQEAgLTUsMTIgKzUsOSBAQAogICBWYXJpYW50VmFsdWUuY3BwCiAgIFBhcnNlci5jcHAKICAgUmVnaXN0cnkuY3BwCi0gICkKIAotYWRkX2RlcGVuZGVuY2llcyhjbGFuZ0R5bmFtaWNBU1RNYXRjaGVycworICBMSU5LX0xJQlMKKyAgY2xhbmdBU1QKICAgY2xhbmdBU1RNYXRjaGVycwotICApCi0KLXRhcmdldF9saW5rX2xpYnJhcmllcyhjbGFuZ0R5bmFtaWNBU1RNYXRjaGVycwotICBjbGFuZ0FTVE1hdGNoZXJzCisgIGNsYW5nQmFzaWMKICAgKQpkaWZmIC0tZ2l0IGEvbGliL0FTVE1hdGNoZXJzL0R5bmFtaWMvTWFyc2hhbGxlcnMuaCBiL2xpYi9BU1RNYXRjaGVycy9EeW5hbWljL01hcnNoYWxsZXJzLmgKaW5kZXggYWUwYzMwMC4uNzcyNjgwNyAxMDA2NDQKLS0tIGEvbGliL0FTVE1hdGNoZXJzL0R5bmFtaWMvTWFyc2hhbGxlcnMuaAorKysgYi9saWIvQVNUTWF0Y2hlcnMvRHluYW1pYy9NYXJzaGFsbGVycy5oCkBAIC0yMCwxNCArMjAsMTIgQEAKICNpZm5kZWYgTExWTV9DTEFOR19BU1RfTUFUQ0hFUlNfRFlOQU1JQ19NQVJTSEFMTEVSU19ICiAjZGVmaW5lIExMVk1fQ0xBTkdfQVNUX01BVENIRVJTX0RZTkFNSUNfTUFSU0hBTExFUlNfSAogCi0jaW5jbHVkZSA8c3RyaW5nPgotCiAjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnMuaCIKICNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL0RpYWdub3N0aWNzLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvRHluYW1pYy9WYXJpYW50VmFsdWUuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIGFzdF9tYXRjaGVycyB7CkBAIC0zNSw2ICszMyw0NiBAQAogCiBuYW1lc3BhY2UgaW50ZXJuYWwgewogCitzdHJ1Y3QgQXJnS2luZCB7CisgIGVudW0gS2luZCB7CisgICAgQUtfTWF0Y2hlciwKKyAgICBBS19VbnNpZ25lZCwKKyAgICBBS19TdHJpbmcKKyAgfTsKKyAgQXJnS2luZChLaW5kIEspCisgICAgICA6IEsoSykge30KKyAgQXJnS2luZChhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIE1hdGNoZXJLaW5kKQorICAgICAgOiBLKEFLX01hdGNoZXIpLCBNYXRjaGVyS2luZChNYXRjaGVyS2luZCkge30KKworICBzdGQ6OnN0cmluZyBhc1N0cmluZygpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGdldEFyZ0tpbmQoKSkgeworICAgIGNhc2UgQUtfTWF0Y2hlcjoKKyAgICAgIHJldHVybiAoVHdpbmUoIk1hdGNoZXI8IikgKyBNYXRjaGVyS2luZC5hc1N0cmluZ1JlZigpICsgIj4iKS5zdHIoKTsKKyAgICBjYXNlIEFLX1Vuc2lnbmVkOgorICAgICAgcmV0dXJuICJ1bnNpZ25lZCI7CisgICAgY2FzZSBBS19TdHJpbmc6CisgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoInVuaGFuZGxlZCBBcmdLaW5kIik7CisgIH0KKworICBLaW5kIGdldEFyZ0tpbmQoKSBjb25zdCB7IHJldHVybiBLOyB9CisgIGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQgZ2V0TWF0Y2hlcktpbmQoKSBjb25zdCB7CisgICAgYXNzZXJ0KEsgPT0gQUtfTWF0Y2hlcik7CisgICAgcmV0dXJuIE1hdGNoZXJLaW5kOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQXJnS2luZCAmT3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoSyA9PSBBS19NYXRjaGVyICYmIE90aGVyLksgPT0gQUtfTWF0Y2hlcikKKyAgICAgIHJldHVybiBNYXRjaGVyS2luZCA8IE90aGVyLk1hdGNoZXJLaW5kOworICAgIHJldHVybiBLIDwgT3RoZXIuSzsKKyAgfQorCitwcml2YXRlOgorICBLaW5kIEs7CisgIGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQgTWF0Y2hlcktpbmQ7Cit9OworCiAvLy8gXGJyaWVmIEhlbHBlciB0ZW1wbGF0ZSBjbGFzcyB0byBqdXN0IGZyb20gYXJndW1lbnQgdHlwZSB0byB0aGUgcmlnaHQgaXMvZ2V0CiAvLy8gICBmdW5jdGlvbnMgaW4gVmFyaWFudFZhbHVlLgogLy8vIFVzZWQgdG8gdmVyaWZ5IGFuZCBleHRyYWN0IHRoZSBtYXRjaGVyIGFyZ3VtZW50cyBiZWxvdy4KQEAgLTQzLDExICs4MSwxMyBAQAogfTsKIAogdGVtcGxhdGUgPD4gc3RydWN0IEFyZ1R5cGVUcmFpdHM8c3RkOjpzdHJpbmc+IHsKLSAgc3RhdGljIFN0cmluZ1JlZiBhc1N0cmluZygpIHsgcmV0dXJuICJTdHJpbmciOyB9CiAgIHN0YXRpYyBib29sIGlzKGNvbnN0IFZhcmlhbnRWYWx1ZSAmVmFsdWUpIHsgcmV0dXJuIFZhbHVlLmlzU3RyaW5nKCk7IH0KICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXQoY29uc3QgVmFyaWFudFZhbHVlICZWYWx1ZSkgewogICAgIHJldHVybiBWYWx1ZS5nZXRTdHJpbmcoKTsKICAgfQorICBzdGF0aWMgQXJnS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBBcmdLaW5kKEFyZ0tpbmQ6OkFLX1N0cmluZyk7CisgIH0KIH07CiAKIHRlbXBsYXRlIDw+CkBAIC01NSw0NiArOTUsOTUgQEAKIH07CiAKIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgQXJnVHlwZVRyYWl0czxhc3RfbWF0Y2hlcnM6OmludGVybmFsOjpNYXRjaGVyPFQ+ID4gewotICBzdGF0aWMgc3RkOjpzdHJpbmcgYXNTdHJpbmcoKSB7Ci0gICAgcmV0dXJuIChUd2luZSgiTWF0Y2hlcjwiKSArCi0gICAgICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VD4oKS5hc1N0cmluZ1JlZigpICsKLSAgICAgICAgICAgICI+Iikuc3RyKCk7Ci0gIH0KICAgc3RhdGljIGJvb2wgaXMoY29uc3QgVmFyaWFudFZhbHVlICZWYWx1ZSkgewogICAgIHJldHVybiBWYWx1ZS5pc01hdGNoZXIoKSAmJiBWYWx1ZS5nZXRNYXRjaGVyKCkuaGFzVHlwZWRNYXRjaGVyPFQ+KCk7CiAgIH0KICAgc3RhdGljIGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6Ok1hdGNoZXI8VD4gZ2V0KGNvbnN0IFZhcmlhbnRWYWx1ZSAmVmFsdWUpIHsKICAgICByZXR1cm4gVmFsdWUuZ2V0TWF0Y2hlcigpLmdldFR5cGVkTWF0Y2hlcjxUPigpOwogICB9CisgIHN0YXRpYyBBcmdLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIEFyZ0tpbmQoYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPFQ+KCkpOworICB9CiB9OwogCiB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgQXJnVHlwZVRyYWl0czx1bnNpZ25lZD4gewotICBzdGF0aWMgc3RkOjpzdHJpbmcgYXNTdHJpbmcoKSB7IHJldHVybiAiVW5zaWduZWQiOyB9CiAgIHN0YXRpYyBib29sIGlzKGNvbnN0IFZhcmlhbnRWYWx1ZSAmVmFsdWUpIHsgcmV0dXJuIFZhbHVlLmlzVW5zaWduZWQoKTsgfQogICBzdGF0aWMgdW5zaWduZWQgZ2V0KGNvbnN0IFZhcmlhbnRWYWx1ZSAmVmFsdWUpIHsKICAgICByZXR1cm4gVmFsdWUuZ2V0VW5zaWduZWQoKTsKICAgfQorICBzdGF0aWMgQXJnS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBBcmdLaW5kKEFyZ0tpbmQ6OkFLX1Vuc2lnbmVkKTsKKyAgfQogfTsKIAotLy8vIFxicmllZiBHZW5lcmljIE1hdGNoZXJDcmVhdGUgaW50ZXJmYWNlLgorLy8vIFxicmllZiBNYXRjaGVyIGRlc2NyaXB0b3IgaW50ZXJmYWNlLgogLy8vCi0vLy8gUHJvdmlkZXMgYSBcYyBydW4oKSBtZXRob2QgdGhhdCBjb25zdHJ1Y3RzIHRoZSBtYXRjaGVyIGZyb20gdGhlIHByb3ZpZGVkCi0vLy8gYXJndW1lbnRzLgotY2xhc3MgTWF0Y2hlckNyZWF0ZUNhbGxiYWNrIHsKKy8vLyBQcm92aWRlcyBhIFxjIGNyZWF0ZSgpIG1ldGhvZCB0aGF0IGNvbnN0cnVjdHMgdGhlIG1hdGNoZXIgZnJvbSB0aGUgcHJvdmlkZWQKKy8vLyBhcmd1bWVudHMsIGFuZCB2YXJpb3VzIG90aGVyIG1ldGhvZHMgZm9yIHR5cGUgaW50cm9zcGVjdGlvbi4KK2NsYXNzIE1hdGNoZXJEZXNjcmlwdG9yIHsKIHB1YmxpYzoKLSAgdmlydHVhbCB+TWF0Y2hlckNyZWF0ZUNhbGxiYWNrKCkge30KLSAgdmlydHVhbCBWYXJpYW50TWF0Y2hlciBydW4oY29uc3QgU291cmNlUmFuZ2UgJk5hbWVSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VyVmFsdWU+IEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzICpFcnJvcikgY29uc3QgPSAwOworICB2aXJ0dWFsIH5NYXRjaGVyRGVzY3JpcHRvcigpIHt9CisgIHZpcnR1YWwgVmFyaWFudE1hdGNoZXIgY3JlYXRlKGNvbnN0IFNvdXJjZVJhbmdlICZOYW1lUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlclZhbHVlPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBtYXRjaGVyIGlzIHZhcmlhZGljLiBWYXJpYWRpYyBtYXRjaGVycyBjYW4gdGFrZSBhbnkKKyAgLy8vIG51bWJlciBvZiBhcmd1bWVudHMsIGJ1dCB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS4KKyAgdmlydHVhbCBib29sIGlzVmFyaWFkaWMoKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgYWNjZXB0ZWQgYnkgdGhlIG1hdGNoZXIgaWYgbm90IHZhcmlhZGljLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCA9IDA7CisKKyAgLy8vIEdpdmVuIHRoYXQgdGhlIG1hdGNoZXIgaXMgYmVpbmcgY29udmVydGVkIHRvIHR5cGUgXHAgVGhpc0tpbmQsIGFwcGVuZCB0aGUKKyAgLy8vIHNldCBvZiBhcmd1bWVudCB0eXBlcyBhY2NlcHRlZCBmb3IgYXJndW1lbnQgXHAgQXJnTm8gdG8gXHAgQXJnS2luZHMuCisgIC8vIEZJWE1FOiBXZSBzaG91bGQgcHJvdmlkZSB0aGUgYWJpbGl0eSB0byBjb25zdHJhaW4gdGhlIG91dHB1dCBvZiB0aGlzCisgIC8vIGZ1bmN0aW9uIGJhc2VkIG9uIHRoZSB0eXBlcyBvZiBvdGhlciBtYXRjaGVyIGFyZ3VtZW50cy4KKyAgdmlydHVhbCB2b2lkIGdldEFyZ0tpbmRzKGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQgVGhpc0tpbmQsIHVuc2lnbmVkIEFyZ05vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXJnS2luZD4gJkFyZ0tpbmRzKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybnMgd2hldGhlciB0aGlzIG1hdGNoZXIgaXMgY29udmVydGlibGUgdG8gdGhlIGdpdmVuIHR5cGUuICBJZiBpdCBpcworICAvLy8gc28gY29udmVydGlibGUsIHN0b3JlIGluICpTcGVjaWZpY2l0eSBhIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgIC8vLyAic3BlY2lmaWNpdHkiIG9mIHRoZSBjb252ZXJ0ZWQgbWF0Y2hlciB0byB0aGUgZ2l2ZW4gY29udGV4dCwgYW5kIGluCisgIC8vLyAqTGVhc3REZXJpdmVkS2luZCB0aGUgbGVhc3QgZGVyaXZlZCBtYXRjaGVyIGtpbmQgd2hpY2ggd291bGQgcmVzdWx0IGluIHRoZQorICAvLy8gc2FtZSBtYXRjaGVyIG92ZXJsb2FkLiAgWmVybyBzcGVjaWZpY2l0eSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGNvbnZlcnNpb24KKyAgLy8vIHdvdWxkIHByb2R1Y2UgYSB0cml2aWFsIG1hdGNoZXIgdGhhdCB3aWxsIGVpdGhlciBhbHdheXMgb3IgbmV2ZXIgbWF0Y2guCisgIC8vLyBTdWNoIG1hdGNoZXJzIGFyZSBleGNsdWRlZCBmcm9tIGNvZGUgY29tcGxldGlvbiByZXN1bHRzLgorICB2aXJ0dWFsIGJvb2wgaXNDb252ZXJ0aWJsZVRvKAorICAgICAgYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBLaW5kLCB1bnNpZ25lZCAqU3BlY2lmaWNpdHkgPSAwLAorICAgICAgYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCAqTGVhc3REZXJpdmVkS2luZCA9IDApIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBtYXRjaGVyIHdpbGwsIGdpdmVuIGEgbWF0Y2hlciBvZiBhbnkgdHlwZSBULCB5aWVsZCBhCisgIC8vLyBtYXRjaGVyIG9mIHR5cGUgVC4KKyAgdmlydHVhbCBib29sIGlzUG9seW1vcnBoaWMoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogfTsKIAoraW5saW5lIGJvb2wgaXNSZXRLaW5kQ29udmVydGlibGVUbygKKyAgICBsbHZtOjpBcnJheVJlZjxhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kPiBSZXRLaW5kcywKKyAgICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIEtpbmQsIHVuc2lnbmVkICpTcGVjaWZpY2l0eSwKKyAgICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kICpMZWFzdERlcml2ZWRLaW5kKSB7CisgIGZvciAobGx2bTo6QXJyYXlSZWY8YXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZD46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgIGkgPSBSZXRLaW5kcy5iZWdpbigpLAorICAgICAgICAgICBlID0gUmV0S2luZHMuZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2kpIHsKKyAgICB1bnNpZ25lZCBEaXN0YW5jZTsKKyAgICBpZiAoaS0+aXNCYXNlT2YoS2luZCwgJkRpc3RhbmNlKSkgeworICAgICAgaWYgKFNwZWNpZmljaXR5KQorICAgICAgICAqU3BlY2lmaWNpdHkgPSAxMDAgLSBEaXN0YW5jZTsKKyAgICAgIGlmIChMZWFzdERlcml2ZWRLaW5kKQorICAgICAgICAqTGVhc3REZXJpdmVkS2luZCA9ICppOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwogLy8vIFxicmllZiBTaW1wbGUgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24uIE1hcnNoYWxsZXIgYW5kIGZ1bmN0aW9uIGFyZSBwcm92aWRlZC4KIC8vLwogLy8vIFRoaXMgY2xhc3Mgd3JhcHMgYSBmdW5jdGlvbiBvZiBhcmJpdHJhcnkgc2lnbmF0dXJlIGFuZCBhIG1hcnNoYWxsZXIKLS8vLyBmdW5jdGlvbiBpbnRvIGEgTWF0Y2hlckNyZWF0ZUNhbGxiYWNrLgorLy8vIGZ1bmN0aW9uIGludG8gYSBNYXRjaGVyRGVzY3JpcHRvci4KIC8vLyBUaGUgbWFyc2hhbGxlciBpcyBpbiBjaGFyZ2Ugb2YgdGFraW5nIHRoZSBWYXJpYW50VmFsdWUgYXJndW1lbnRzLCBjaGVja2luZwogLy8vIHRoZWlyIHR5cGVzLCB1bnBhY2tpbmcgdGhlbSBhbmQgY2FsbGluZyB0aGUgdW5kZXJseWluZyBmdW5jdGlvbi4KLWNsYXNzIEZpeGVkQXJnQ291bnRNYXRjaGVyQ3JlYXRlQ2FsbGJhY2sgOiBwdWJsaWMgTWF0Y2hlckNyZWF0ZUNhbGxiYWNrIHsKK2NsYXNzIEZpeGVkQXJnQ291bnRNYXRjaGVyRGVzY3JpcHRvciA6IHB1YmxpYyBNYXRjaGVyRGVzY3JpcHRvciB7CiBwdWJsaWM6CiAgIHR5cGVkZWYgVmFyaWFudE1hdGNoZXIgKCpNYXJzaGFsbGVyVHlwZSkodm9pZCAoKkZ1bmMpKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1hdGNoZXJOYW1lLApAQCAtMTA1LDY0ICsxOTQsNDIgQEAKICAgLy8vIFxwYXJhbSBNYXJzaGFsbGVyIEZ1bmN0aW9uIHRvIHVucGFjayB0aGUgYXJndW1lbnRzIGFuZCBjYWxsIFxjIEZ1bmMKICAgLy8vIFxwYXJhbSBGdW5jIE1hdGNoZXIgY29uc3RydWN0IGZ1bmN0aW9uLiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0CiAgIC8vLyAgIGNvbXBpbGUtdGltZSBtYXRjaGVyIGV4cHJlc3Npb25zIHdvdWxkIHVzZSB0byBjcmVhdGUgdGhlIG1hdGNoZXIuCi0gIEZpeGVkQXJnQ291bnRNYXRjaGVyQ3JlYXRlQ2FsbGJhY2soTWFyc2hhbGxlclR5cGUgTWFyc2hhbGxlciwgdm9pZCAoKkZ1bmMpKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1hdGNoZXJOYW1lKQotICAgICAgOiBNYXJzaGFsbGVyKE1hcnNoYWxsZXIpLCBGdW5jKEZ1bmMpLCBNYXRjaGVyTmFtZShNYXRjaGVyTmFtZSkge30KKyAgLy8vIFxwYXJhbSBSZXRLaW5kcyBUaGUgbGlzdCBvZiBtYXRjaGVyIHR5cGVzIHRvIHdoaWNoIHRoZSBtYXRjaGVyIGlzCisgIC8vLyAgIGNvbnZlcnRpYmxlLgorICAvLy8gXHBhcmFtIEFyZ0tpbmRzIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoaXMgbWF0Y2hlciB0YWtlcy4KKyAgRml4ZWRBcmdDb3VudE1hdGNoZXJEZXNjcmlwdG9yKAorICAgICAgTWFyc2hhbGxlclR5cGUgTWFyc2hhbGxlciwgdm9pZCAoKkZ1bmMpKCksIFN0cmluZ1JlZiBNYXRjaGVyTmFtZSwKKyAgICAgIGxsdm06OkFycmF5UmVmPGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQ+IFJldEtpbmRzLAorICAgICAgbGx2bTo6QXJyYXlSZWY8QXJnS2luZD4gQXJnS2luZHMpCisgICAgICA6IE1hcnNoYWxsZXIoTWFyc2hhbGxlciksIEZ1bmMoRnVuYyksIE1hdGNoZXJOYW1lKE1hdGNoZXJOYW1lKSwKKyAgICAgICAgUmV0S2luZHMoUmV0S2luZHMuYmVnaW4oKSwgUmV0S2luZHMuZW5kKCkpLAorICAgICAgICBBcmdLaW5kcyhBcmdLaW5kcy5iZWdpbigpLCBBcmdLaW5kcy5lbmQoKSkge30KIAotICBWYXJpYW50TWF0Y2hlciBydW4oY29uc3QgU291cmNlUmFuZ2UgJk5hbWVSYW5nZSwgQXJyYXlSZWY8UGFyc2VyVmFsdWU+IEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpIGNvbnN0IHsKKyAgVmFyaWFudE1hdGNoZXIgY3JlYXRlKGNvbnN0IFNvdXJjZVJhbmdlICZOYW1lUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZXJWYWx1ZT4gQXJncywgRGlhZ25vc3RpY3MgKkVycm9yKSBjb25zdCB7CiAgICAgcmV0dXJuIE1hcnNoYWxsZXIoRnVuYywgTWF0Y2hlck5hbWUsIE5hbWVSYW5nZSwgQXJncywgRXJyb3IpOwogICB9CiAKKyAgYm9vbCBpc1ZhcmlhZGljKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IHsgcmV0dXJuIEFyZ0tpbmRzLnNpemUoKTsgfQorICB2b2lkIGdldEFyZ0tpbmRzKGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQgVGhpc0tpbmQsIHVuc2lnbmVkIEFyZ05vLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFyZ0tpbmQ+ICZLaW5kcykgY29uc3QgeworICAgIEtpbmRzLnB1c2hfYmFjayhBcmdLaW5kc1tBcmdOb10pOworICB9CisgIGJvb2wgaXNDb252ZXJ0aWJsZVRvKGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQgS2luZCwgdW5zaWduZWQgKlNwZWNpZmljaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kICpMZWFzdERlcml2ZWRLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIGlzUmV0S2luZENvbnZlcnRpYmxlVG8oUmV0S2luZHMsIEtpbmQsIFNwZWNpZmljaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYXN0RGVyaXZlZEtpbmQpOworICB9CisKIHByaXZhdGU6CiAgIGNvbnN0IE1hcnNoYWxsZXJUeXBlIE1hcnNoYWxsZXI7CiAgIHZvaWQgKCogY29uc3QgRnVuYykoKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgTWF0Y2hlck5hbWU7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQ+IFJldEtpbmRzOworICBjb25zdCBzdGQ6OnZlY3RvcjxBcmdLaW5kPiBBcmdLaW5kczsKIH07CiAKLS8vLyBcYnJpZWYgU2ltcGxlIGNhbGxiYWNrIGltcGxlbWVudGF0aW9uLiBGcmVlIGZ1bmN0aW9uIGlzIHdyYXBwZWQuCi0vLy8KLS8vLyBUaGlzIGNsYXNzIHNpbXBseSB3cmFwcyBhIGZyZWUgZnVuY3Rpb24gd2l0aCB0aGUgcmlnaHQgc2lnbmF0dXJlIHRvIGV4cG9ydAotLy8vIGl0IGFzIGEgTWF0Y2hlckNyZWF0ZUNhbGxiYWNrLgotLy8vIFRoaXMgYWxsb3dzIHVzIHRvIGhhdmUgb25lIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgZm9yIGFzIG1hbnkgZnJlZQotLy8vIGZ1bmN0aW9ucyBhcyB3ZSB3YW50LCByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgYW5kIHNpemUgb2YgdGhlCi0vLy8gb2JqZWN0IGZpbGUuCi1jbGFzcyBGcmVlRnVuY01hdGNoZXJDcmVhdGVDYWxsYmFjayA6IHB1YmxpYyBNYXRjaGVyQ3JlYXRlQ2FsbGJhY2sgewotcHVibGljOgotICB0eXBlZGVmIFZhcmlhbnRNYXRjaGVyICgqUnVuRnVuYykoU3RyaW5nUmVmIE1hdGNoZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlUmFuZ2UgJk5hbWVSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlclZhbHVlPiBBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3MgKkVycm9yKTsKLQotICBGcmVlRnVuY01hdGNoZXJDcmVhdGVDYWxsYmFjayhSdW5GdW5jIEZ1bmMsIFN0cmluZ1JlZiBNYXRjaGVyTmFtZSkKLSAgICAgIDogRnVuYyhGdW5jKSwgTWF0Y2hlck5hbWUoTWF0Y2hlck5hbWUuc3RyKCkpIHt9Ci0KLSAgVmFyaWFudE1hdGNoZXIgcnVuKGNvbnN0IFNvdXJjZVJhbmdlICZOYW1lUmFuZ2UsIEFycmF5UmVmPFBhcnNlclZhbHVlPiBBcmdzLAotICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3MgKkVycm9yKSBjb25zdCB7Ci0gICAgcmV0dXJuIEZ1bmMoTWF0Y2hlck5hbWUsIE5hbWVSYW5nZSwgQXJncywgRXJyb3IpOwotICB9Ci0KLXByaXZhdGU6Ci0gIGNvbnN0IFJ1bkZ1bmMgRnVuYzsKLSAgY29uc3Qgc3RkOjpzdHJpbmcgTWF0Y2hlck5hbWU7Ci19OwotCi0vLy8gXGJyaWVmIEhlbHBlciBtYWNyb3MgdG8gY2hlY2sgdGhlIGFyZ3VtZW50cyBvbiBhbGwgbWFyc2hhbGxlciBmdW5jdGlvbnMuCi0jZGVmaW5lIENIRUNLX0FSR19DT1VOVChjb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoQXJncy5zaXplKCkgIT0gY291bnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBFcnJvci0+YWRkRXJyb3IoTmFtZVJhbmdlLCBFcnJvci0+RVRfUmVnaXN0cnlXcm9uZ0FyZ0NvdW50KSAgICAgICAgICAgICAgICBcCi0gICAgICAgIDw8IGNvdW50IDw8IEFyZ3Muc2l6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBWYXJpYW50TWF0Y2hlcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIENIRUNLX0FSR19UWVBFKGluZGV4LCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoIUFyZ1R5cGVUcmFpdHM8dHlwZT46OmlzKEFyZ3NbaW5kZXhdLlZhbHVlKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBFcnJvci0+YWRkRXJyb3IoQXJnc1tpbmRleF0uUmFuZ2UsIEVycm9yLT5FVF9SZWdpc3RyeVdyb25nQXJnVHlwZSkgICAgICAgICBcCi0gICAgICAgIDw8IChpbmRleCArIDEpIDw8IEFyZ1R5cGVUcmFpdHM8dHlwZT46OmFzU3RyaW5nKCkgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICA8PCBBcmdzW2luZGV4XS5WYWx1ZS5nZXRUeXBlQXNTdHJpbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gVmFyaWFudE1hdGNoZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQogLy8vIFxicmllZiBIZWxwZXIgbWV0aG9kcyB0byBleHRyYWN0IGFuZCBtZXJnZSBhbGwgcG9zc2libGUgdHlwZWQgbWF0Y2hlcnMKIC8vLyBvdXQgb2YgdGhlIHBvbHltb3JwaGljIG9iamVjdC4KIHRlbXBsYXRlIDxjbGFzcyBQb2x5TWF0Y2hlcj4KQEAgLTE5MywxMCArMjYwLDE3OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgewogICBzdGQ6OnZlY3RvcjxEeW5UeXBlZE1hdGNoZXI+IE1hdGNoZXJzOwogICBtZXJnZVBvbHlNYXRjaGVycyhQb2x5TWF0Y2hlciwgTWF0Y2hlcnMsIHR5cGVuYW1lIFQ6OlJldHVyblR5cGVzKCkpOwotICBWYXJpYW50TWF0Y2hlciBPdXQgPSBWYXJpYW50TWF0Y2hlcjo6UG9seW1vcnBoaWNNYXRjaGVyKE1hdGNoZXJzKTsKKyAgVmFyaWFudE1hdGNoZXIgT3V0ID0gVmFyaWFudE1hdGNoZXI6OlBvbHltb3JwaGljTWF0Y2hlcihzdGQ6Om1vdmUoTWF0Y2hlcnMpKTsKICAgcmV0dXJuIE91dDsKIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdm9pZCBidWlsZFJldHVyblR5cGVWZWN0b3JGcm9tVHlwZUxpc3QoCisgICAgc3RkOjp2ZWN0b3I8YXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZD4gJlJldFR5cGVzKSB7CisgIFJldFR5cGVzLnB1c2hfYmFjaygKKyAgICAgIGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQ6OmdldEZyb21Ob2RlS2luZDx0eXBlbmFtZSBUOjpoZWFkPigpKTsKKyAgYnVpbGRSZXR1cm5UeXBlVmVjdG9yRnJvbVR5cGVMaXN0PHR5cGVuYW1lIFQ6OnRhaWw+KFJldFR5cGVzKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkCitidWlsZFJldHVyblR5cGVWZWN0b3JGcm9tVHlwZUxpc3Q8YXN0X21hdGNoZXJzOjppbnRlcm5hbDo6RW1wdHlUeXBlTGlzdD4oCisgICAgc3RkOjp2ZWN0b3I8YXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZD4gJlJldFR5cGVzKSB7fQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBCdWlsZFJldHVyblR5cGVWZWN0b3IgeworICBzdGF0aWMgdm9pZCBidWlsZChzdGQ6OnZlY3Rvcjxhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kPiAmUmV0VHlwZXMpIHsKKyAgICBidWlsZFJldHVyblR5cGVWZWN0b3JGcm9tVHlwZUxpc3Q8dHlwZW5hbWUgVDo6UmV0dXJuVHlwZXM+KFJldFR5cGVzKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQnVpbGRSZXR1cm5UeXBlVmVjdG9yPGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6Ok1hdGNoZXI8VD4gPiB7CisgIHN0YXRpYyB2b2lkIGJ1aWxkKHN0ZDo6dmVjdG9yPGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQ+ICZSZXRUeXBlcykgeworICAgIFJldFR5cGVzLnB1c2hfYmFjayhhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VD4oKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEJ1aWxkUmV0dXJuVHlwZVZlY3Rvcjxhc3RfbWF0Y2hlcnM6OmludGVybmFsOjpCaW5kYWJsZU1hdGNoZXI8VD4gPiB7CisgIHN0YXRpYyB2b2lkIGJ1aWxkKHN0ZDo6dmVjdG9yPGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQ+ICZSZXRUeXBlcykgeworICAgIFJldFR5cGVzLnB1c2hfYmFjayhhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8VD4oKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVmFyaWFkaWMgbWFyc2hhbGxlciBmdW5jdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRULCB0eXBlbmFtZSBBcmdULAorICAgICAgICAgIFJlc3VsdFQgKCpGdW5jKShBcnJheVJlZjxjb25zdCBBcmdUICo+KT4KK1ZhcmlhbnRNYXRjaGVyCit2YXJpYWRpY01hdGNoZXJEZXNjcmlwdG9yKFN0cmluZ1JlZiBNYXRjaGVyTmFtZSwgY29uc3QgU291cmNlUmFuZ2UgJk5hbWVSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VyVmFsdWU+IEFyZ3MsIERpYWdub3N0aWNzICpFcnJvcikgeworICBBcmdUICoqSW5uZXJBcmdzID0gbmV3IEFyZ1QgKltBcmdzLnNpemUoKV0oKTsKKworICBib29sIEhhc0Vycm9yID0gZmFsc2U7CisgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gQXJncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgdHlwZWRlZiBBcmdUeXBlVHJhaXRzPEFyZ1Q+IEFyZ1RyYWl0czsKKyAgICBjb25zdCBQYXJzZXJWYWx1ZSAmQXJnID0gQXJnc1tpXTsKKyAgICBjb25zdCBWYXJpYW50VmFsdWUgJlZhbHVlID0gQXJnLlZhbHVlOworICAgIGlmICghQXJnVHJhaXRzOjppcyhWYWx1ZSkpIHsKKyAgICAgIEVycm9yLT5hZGRFcnJvcihBcmcuUmFuZ2UsIEVycm9yLT5FVF9SZWdpc3RyeVdyb25nQXJnVHlwZSkKKyAgICAgICAgICA8PCAoaSArIDEpIDw8IEFyZ1RyYWl0czo6Z2V0S2luZCgpLmFzU3RyaW5nKCkgPDwgVmFsdWUuZ2V0VHlwZUFzU3RyaW5nKCk7CisgICAgICBIYXNFcnJvciA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgSW5uZXJBcmdzW2ldID0gbmV3IEFyZ1QoQXJnVHJhaXRzOjpnZXQoVmFsdWUpKTsKKyAgfQorCisgIFZhcmlhbnRNYXRjaGVyIE91dDsKKyAgaWYgKCFIYXNFcnJvcikgeworICAgIE91dCA9IG91dHZhbHVlVG9WYXJpYW50TWF0Y2hlcigKKyAgICAgICAgRnVuYyhBcnJheVJlZjxjb25zdCBBcmdUICo+KElubmVyQXJncywgQXJncy5zaXplKCkpKSk7CisgIH0KKworICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IEFyZ3Muc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgIGRlbGV0ZSBJbm5lckFyZ3NbaV07CisgIH0KKyAgZGVsZXRlW10gSW5uZXJBcmdzOworICByZXR1cm4gT3V0OworfQorCisvLy8gXGJyaWVmIE1hdGNoZXIgZGVzY3JpcHRvciBmb3IgdmFyaWFkaWMgZnVuY3Rpb25zLgorLy8vCisvLy8gVGhpcyBjbGFzcyBzaW1wbHkgd3JhcHMgYSBWYXJpYWRpY0Z1bmN0aW9uIHdpdGggdGhlIHJpZ2h0IHNpZ25hdHVyZSB0byBleHBvcnQKKy8vLyBpdCBhcyBhIE1hdGNoZXJEZXNjcmlwdG9yLgorLy8vIFRoaXMgYWxsb3dzIHVzIHRvIGhhdmUgb25lIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgZm9yIGFzIG1hbnkgZnJlZQorLy8vIGZ1bmN0aW9ucyBhcyB3ZSB3YW50LCByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgYW5kIHNpemUgb2YgdGhlCisvLy8gb2JqZWN0IGZpbGUuCitjbGFzcyBWYXJpYWRpY0Z1bmNNYXRjaGVyRGVzY3JpcHRvciA6IHB1YmxpYyBNYXRjaGVyRGVzY3JpcHRvciB7CitwdWJsaWM6CisgIHR5cGVkZWYgVmFyaWFudE1hdGNoZXIgKCpSdW5GdW5jKShTdHJpbmdSZWYgTWF0Y2hlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VSYW5nZSAmTmFtZVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VyVmFsdWU+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRULCB0eXBlbmFtZSBBcmdULAorICAgICAgICAgICAgUmVzdWx0VCAoKkYpKEFycmF5UmVmPGNvbnN0IEFyZ1QgKj4pPgorICBWYXJpYWRpY0Z1bmNNYXRjaGVyRGVzY3JpcHRvcihsbHZtOjpWYXJpYWRpY0Z1bmN0aW9uPFJlc3VsdFQsIEFyZ1QsIEY+IEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNYXRjaGVyTmFtZSkKKyAgICAgIDogRnVuYygmdmFyaWFkaWNNYXRjaGVyRGVzY3JpcHRvcjxSZXN1bHRULCBBcmdULCBGPiksCisgICAgICAgIE1hdGNoZXJOYW1lKE1hdGNoZXJOYW1lLnN0cigpKSwKKyAgICAgICAgQXJnc0tpbmQoQXJnVHlwZVRyYWl0czxBcmdUPjo6Z2V0S2luZCgpKSB7CisgICAgQnVpbGRSZXR1cm5UeXBlVmVjdG9yPFJlc3VsdFQ+OjpidWlsZChSZXRLaW5kcyk7CisgIH0KKworICBWYXJpYW50TWF0Y2hlciBjcmVhdGUoY29uc3QgU291cmNlUmFuZ2UgJk5hbWVSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlclZhbHVlPiBBcmdzLCBEaWFnbm9zdGljcyAqRXJyb3IpIGNvbnN0IHsKKyAgICByZXR1cm4gRnVuYyhNYXRjaGVyTmFtZSwgTmFtZVJhbmdlLCBBcmdzLCBFcnJvcik7CisgIH0KKworICBib29sIGlzVmFyaWFkaWMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7IHJldHVybiAwOyB9CisgIHZvaWQgZ2V0QXJnS2luZHMoYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBUaGlzS2luZCwgdW5zaWduZWQgQXJnTm8sCisgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXJnS2luZD4gJktpbmRzKSBjb25zdCB7CisgICAgS2luZHMucHVzaF9iYWNrKEFyZ3NLaW5kKTsKKyAgfQorICBib29sIGlzQ29udmVydGlibGVUbyhhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIEtpbmQsIHVuc2lnbmVkICpTcGVjaWZpY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCAqTGVhc3REZXJpdmVkS2luZCkgY29uc3QgeworICAgIHJldHVybiBpc1JldEtpbmRDb252ZXJ0aWJsZVRvKFJldEtpbmRzLCBLaW5kLCBTcGVjaWZpY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFzdERlcml2ZWRLaW5kKTsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBSdW5GdW5jIEZ1bmM7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIE1hdGNoZXJOYW1lOworICBzdGQ6OnZlY3Rvcjxhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kPiBSZXRLaW5kczsKKyAgY29uc3QgQXJnS2luZCBBcmdzS2luZDsKK307CisKKy8vLyBcYnJpZWYgUmV0dXJuIENLX1RyaXZpYWwgd2hlbiBhcHByb3ByaWF0ZSBmb3IgVmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVycy4KK2NsYXNzIER5bkNhc3RBbGxPZk1hdGNoZXJEZXNjcmlwdG9yIDogcHVibGljIFZhcmlhZGljRnVuY01hdGNoZXJEZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEJhc2VULCB0eXBlbmFtZSBEZXJpdmVkVD4KKyAgRHluQ2FzdEFsbE9mTWF0Y2hlckRlc2NyaXB0b3IoCisgICAgICBhc3RfbWF0Y2hlcnM6OmludGVybmFsOjpWYXJpYWRpY0R5bkNhc3RBbGxPZk1hdGNoZXI8QmFzZVQsIERlcml2ZWRUPiBGdW5jLAorICAgICAgU3RyaW5nUmVmIE1hdGNoZXJOYW1lKQorICAgICAgOiBWYXJpYWRpY0Z1bmNNYXRjaGVyRGVzY3JpcHRvcihGdW5jLCBNYXRjaGVyTmFtZSksCisgICAgICAgIERlcml2ZWRLaW5kKGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQ6OmdldEZyb21Ob2RlS2luZDxEZXJpdmVkVD4oKSkgeworICB9CisKKyAgYm9vbAorICBpc0NvbnZlcnRpYmxlVG8oYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCBLaW5kLCB1bnNpZ25lZCAqU3BlY2lmaWNpdHksCisgICAgICAgICAgICAgICAgYXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZCAqTGVhc3REZXJpdmVkS2luZCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIC8vIElmIEtpbmQgaXMgbm90IGEgYmFzZSBvZiBEZXJpdmVkS2luZCwgZWl0aGVyIERlcml2ZWRLaW5kIGlzIGEgYmFzZSBvZgorICAgIC8vIEtpbmQgKGluIHdoaWNoIGNhc2UgdGhlIG1hdGNoIHdpbGwgYWx3YXlzIHN1Y2NlZWQpIG9yIEtpbmQgYW5kCisgICAgLy8gRGVyaXZlZEtpbmQgYXJlIHVucmVsYXRlZCAoaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGFsd2F5cyBmYWlsKSwgc28gc2V0CisgICAgLy8gU3BlY2lmaWNpdHkgdG8gMC4KKyAgICBpZiAoVmFyaWFkaWNGdW5jTWF0Y2hlckRlc2NyaXB0b3I6OmlzQ29udmVydGlibGVUbyhLaW5kLCBTcGVjaWZpY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFzdERlcml2ZWRLaW5kKSkgeworICAgICAgaWYgKEtpbmQuaXNTYW1lKERlcml2ZWRLaW5kKSB8fCAhS2luZC5pc0Jhc2VPZihEZXJpdmVkS2luZCkpIHsKKyAgICAgICAgaWYgKFNwZWNpZmljaXR5KQorICAgICAgICAgICpTcGVjaWZpY2l0eSA9IDA7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBjb25zdCBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIERlcml2ZWRLaW5kOworfTsKKworLy8vIFxicmllZiBIZWxwZXIgbWFjcm9zIHRvIGNoZWNrIHRoZSBhcmd1bWVudHMgb24gYWxsIG1hcnNoYWxsZXIgZnVuY3Rpb25zLgorI2RlZmluZSBDSEVDS19BUkdfQ09VTlQoY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKEFyZ3Muc2l6ZSgpICE9IGNvdW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRXJyb3ItPmFkZEVycm9yKE5hbWVSYW5nZSwgRXJyb3ItPkVUX1JlZ2lzdHJ5V3JvbmdBcmdDb3VudCkgICAgICAgICAgICAgICAgXAorICAgICAgICA8PCBjb3VudCA8PCBBcmdzLnNpemUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gVmFyaWFudE1hdGNoZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBDSEVDS19BUkdfVFlQRShpbmRleCwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCFBcmdUeXBlVHJhaXRzPHR5cGU+OjppcyhBcmdzW2luZGV4XS5WYWx1ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRXJyb3ItPmFkZEVycm9yKEFyZ3NbaW5kZXhdLlJhbmdlLCBFcnJvci0+RVRfUmVnaXN0cnlXcm9uZ0FyZ1R5cGUpICAgICAgICAgXAorICAgICAgICA8PCAoaW5kZXggKyAxKSA8PCBBcmdUeXBlVHJhaXRzPHR5cGU+OjpnZXRLaW5kKCkuYXNTdHJpbmcoKSAgICAgICAgICAgIFwKKyAgICAgICAgPDwgQXJnc1tpbmRleF0uVmFsdWUuZ2V0VHlwZUFzU3RyaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIFZhcmlhbnRNYXRjaGVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKwogLy8vIFxicmllZiAwLWFyZyBtYXJzaGFsbGVyIGZ1bmN0aW9uLgogdGVtcGxhdGUgPHR5cGVuYW1lIFJldHVyblR5cGU+CiBzdGF0aWMgVmFyaWFudE1hdGNoZXIgbWF0Y2hlck1hcnNoYWxsMCh2b2lkICgqRnVuYykoKSwgU3RyaW5nUmVmIE1hdGNoZXJOYW1lLApAQCAtMjM5LDQyICs0NzQsNiBAQAogI3VuZGVmIENIRUNLX0FSR19DT1VOVAogI3VuZGVmIENIRUNLX0FSR19UWVBFCiAKLS8vLyBcYnJpZWYgVmFyaWFkaWMgbWFyc2hhbGxlciBmdW5jdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRULCB0eXBlbmFtZSBBcmdULAotICAgICAgICAgIFJlc3VsdFQgKCpGdW5jKShBcnJheVJlZjxjb25zdCBBcmdUICo+KT4KLVZhcmlhbnRNYXRjaGVyCi12YXJpYWRpY01hdGNoZXJDcmVhdGVDYWxsYmFjayhTdHJpbmdSZWYgTWF0Y2hlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VSYW5nZSAmTmFtZVJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VyVmFsdWU+IEFyZ3MsIERpYWdub3N0aWNzICpFcnJvcikgewotICBBcmdUICoqSW5uZXJBcmdzID0gbmV3IEFyZ1QgKltBcmdzLnNpemUoKV0oKTsKLQotICBib29sIEhhc0Vycm9yID0gZmFsc2U7Ci0gIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gQXJncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgdHlwZWRlZiBBcmdUeXBlVHJhaXRzPEFyZ1Q+IEFyZ1RyYWl0czsKLSAgICBjb25zdCBQYXJzZXJWYWx1ZSAmQXJnID0gQXJnc1tpXTsKLSAgICBjb25zdCBWYXJpYW50VmFsdWUgJlZhbHVlID0gQXJnLlZhbHVlOwotICAgIGlmICghQXJnVHJhaXRzOjppcyhWYWx1ZSkpIHsKLSAgICAgIEVycm9yLT5hZGRFcnJvcihBcmcuUmFuZ2UsIEVycm9yLT5FVF9SZWdpc3RyeVdyb25nQXJnVHlwZSkKLSAgICAgICAgICA8PCAoaSArIDEpIDw8IEFyZ1RyYWl0czo6YXNTdHJpbmcoKSA8PCBWYWx1ZS5nZXRUeXBlQXNTdHJpbmcoKTsKLSAgICAgIEhhc0Vycm9yID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBJbm5lckFyZ3NbaV0gPSBuZXcgQXJnVChBcmdUcmFpdHM6OmdldChWYWx1ZSkpOwotICB9Ci0KLSAgVmFyaWFudE1hdGNoZXIgT3V0OwotICBpZiAoIUhhc0Vycm9yKSB7Ci0gICAgT3V0ID0gb3V0dmFsdWVUb1ZhcmlhbnRNYXRjaGVyKAotICAgICAgICBGdW5jKEFycmF5UmVmPGNvbnN0IEFyZ1QgKj4oSW5uZXJBcmdzLCBBcmdzLnNpemUoKSkpKTsKLSAgfQotCi0gIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gQXJncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgZGVsZXRlIElubmVyQXJnc1tpXTsKLSAgfQotICBkZWxldGVbXSBJbm5lckFyZ3M7Ci0gIHJldHVybiBPdXQ7Ci19Ci0KIC8vLyBcYnJpZWYgSGVscGVyIGNsYXNzIHVzZWQgdG8gY29sbGVjdCBhbGwgdGhlIHBvc3NpYmxlIG92ZXJsb2FkcyBvZiBhbgogLy8vICAgYXJndW1lbnQgYWRhcHRhdGl2ZSBtYXRjaGVyIGZ1bmN0aW9uLgogdGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZSBUb0FyZywgdHlwZW5hbWUgRnJvbUFyZz4gY2xhc3MgQXJndW1lbnRBZGFwdGVyVCwKQEAgLTI4Miw3ICs0ODEsNyBAQAogY2xhc3MgQWRhcHRhdGl2ZU92ZXJsb2FkQ29sbGVjdG9yIHsKIHB1YmxpYzoKICAgQWRhcHRhdGl2ZU92ZXJsb2FkQ29sbGVjdG9yKFN0cmluZ1JlZiBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWF0Y2hlckNyZWF0ZUNhbGxiYWNrICo+ICZPdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYXRjaGVyRGVzY3JpcHRvciAqPiAmT3V0KQogICAgICAgOiBOYW1lKE5hbWUpLCBPdXQoT3V0KSB7CiAgICAgY29sbGVjdChGcm9tVHlwZXMoKSk7CiAgIH0KQEAgLTI5NiwzMyArNDk1LDMyIEBACiAKICAgLy8vIFxicmllZiBSZWN1cnNpdmUgY2FzZS4gR2V0IHRoZSBvdmVybG9hZCBmb3IgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIGFuZAogICAvLy8gICByZWN1cnNlIHRvIHRoZSB0YWlsLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbVR5cGVMaXN0PiBpbmxpbmUgdm9pZCBjb2xsZWN0KEZyb21UeXBlTGlzdCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tVHlwZUxpc3Q+CisgIGlubGluZSB2b2lkIGNvbGxlY3QoRnJvbVR5cGVMaXN0KTsKIAogICBjb25zdCBTdHJpbmdSZWYgTmFtZTsKLSAgc3RkOjp2ZWN0b3I8TWF0Y2hlckNyZWF0ZUNhbGxiYWNrICo+ICZPdXQ7CisgIHN0ZDo6dmVjdG9yPE1hdGNoZXJEZXNjcmlwdG9yICo+ICZPdXQ7CiB9OwogCi0vLy8gXGJyaWVmIE1hdGNoZXJDcmVhdGVDYWxsYmFjayB0aGF0IHdyYXBzIG11bHRpcGxlICJvdmVybG9hZHMiIG9mIHRoZSBzYW1lCisvLy8gXGJyaWVmIE1hdGNoZXJEZXNjcmlwdG9yIHRoYXQgd3JhcHMgbXVsdGlwbGUgIm92ZXJsb2FkcyIgb2YgdGhlIHNhbWUKIC8vLyAgIG1hdGNoZXIuCiAvLy8KIC8vLyBJdCB3aWxsIHRyeSBldmVyeSBvdmVybG9hZCBhbmQgZ2VuZXJhdGUgYXBwcm9wcmlhdGUgZXJyb3JzIGZvciB3aGVuIG5vbmUgb3IKIC8vLyBtb3JlIHRoYW4gb25lIG92ZXJsb2FkcyBtYXRjaCB0aGUgYXJndW1lbnRzLgotY2xhc3MgT3ZlcmxvYWRlZE1hdGNoZXJDcmVhdGVDYWxsYmFjayA6IHB1YmxpYyBNYXRjaGVyQ3JlYXRlQ2FsbGJhY2sgeworY2xhc3MgT3ZlcmxvYWRlZE1hdGNoZXJEZXNjcmlwdG9yIDogcHVibGljIE1hdGNoZXJEZXNjcmlwdG9yIHsKIHB1YmxpYzoKLSAgT3ZlcmxvYWRlZE1hdGNoZXJDcmVhdGVDYWxsYmFjayhBcnJheVJlZjxNYXRjaGVyQ3JlYXRlQ2FsbGJhY2sgKj4gQ2FsbGJhY2tzKQotICAgICAgOiBPdmVybG9hZHMoQ2FsbGJhY2tzKSB7fQorICBPdmVybG9hZGVkTWF0Y2hlckRlc2NyaXB0b3IoQXJyYXlSZWY8TWF0Y2hlckRlc2NyaXB0b3IgKj4gQ2FsbGJhY2tzKQorICAgICAgOiBPdmVybG9hZHMoQ2FsbGJhY2tzLmJlZ2luKCksIENhbGxiYWNrcy5lbmQoKSkge30KIAotICB2aXJ0dWFsIH5PdmVybG9hZGVkTWF0Y2hlckNyZWF0ZUNhbGxiYWNrKCkgewotICAgIGxsdm06OkRlbGV0ZUNvbnRhaW5lclBvaW50ZXJzKE92ZXJsb2Fkcyk7Ci0gIH0KKyAgdmlydHVhbCB+T3ZlcmxvYWRlZE1hdGNoZXJEZXNjcmlwdG9yKCkge30KIAotICB2aXJ0dWFsIFZhcmlhbnRNYXRjaGVyIHJ1bihjb25zdCBTb3VyY2VSYW5nZSAmTmFtZVJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZXJWYWx1ZT4gQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3MgKkVycm9yKSBjb25zdCB7CisgIHZpcnR1YWwgVmFyaWFudE1hdGNoZXIgY3JlYXRlKGNvbnN0IFNvdXJjZVJhbmdlICZOYW1lUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlclZhbHVlPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpIGNvbnN0IHsKICAgICBzdGQ6OnZlY3RvcjxWYXJpYW50TWF0Y2hlcj4gQ29uc3RydWN0ZWQ7CiAgICAgRGlhZ25vc3RpY3M6Ok92ZXJsb2FkQ29udGV4dCBDdHgoRXJyb3IpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gT3ZlcmxvYWRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKLSAgICAgIFZhcmlhbnRNYXRjaGVyIFN1Yk1hdGNoZXIgPSBPdmVybG9hZHNbaV0tPnJ1bihOYW1lUmFuZ2UsIEFyZ3MsIEVycm9yKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJk8gOiBPdmVybG9hZHMpIHsKKyAgICAgIFZhcmlhbnRNYXRjaGVyIFN1Yk1hdGNoZXIgPSBPLT5jcmVhdGUoTmFtZVJhbmdlLCBBcmdzLCBFcnJvcik7CiAgICAgICBpZiAoIVN1Yk1hdGNoZXIuaXNOdWxsKCkpIHsKICAgICAgICAgQ29uc3RydWN0ZWQucHVzaF9iYWNrKFN1Yk1hdGNoZXIpOwogICAgICAgfQpAQCAtMzM5LDIwICs1MzcsNjcgQEAKICAgICByZXR1cm4gQ29uc3RydWN0ZWRbMF07CiAgIH0KIAorICBib29sIGlzVmFyaWFkaWMoKSBjb25zdCB7CisgICAgYm9vbCBPdmVybG9hZDBWYXJpYWRpYyA9IE92ZXJsb2Fkc1swXS0+aXNWYXJpYWRpYygpOworI2lmbmRlZiBOREVCVUcKKyAgICBmb3IgKGNvbnN0IGF1dG8gJk8gOiBPdmVybG9hZHMpIHsKKyAgICAgIGFzc2VydChPdmVybG9hZDBWYXJpYWRpYyA9PSBPLT5pc1ZhcmlhZGljKCkpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBPdmVybG9hZDBWYXJpYWRpYzsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7CisgICAgdW5zaWduZWQgT3ZlcmxvYWQwTnVtQXJncyA9IE92ZXJsb2Fkc1swXS0+Z2V0TnVtQXJncygpOworI2lmbmRlZiBOREVCVUcKKyAgICBmb3IgKGNvbnN0IGF1dG8gJk8gOiBPdmVybG9hZHMpIHsKKyAgICAgIGFzc2VydChPdmVybG9hZDBOdW1BcmdzID09IE8tPmdldE51bUFyZ3MoKSk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIE92ZXJsb2FkME51bUFyZ3M7CisgIH0KKworICB2b2lkIGdldEFyZ0tpbmRzKGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQgVGhpc0tpbmQsIHVuc2lnbmVkIEFyZ05vLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEFyZ0tpbmQ+ICZLaW5kcykgY29uc3QgeworICAgIGZvciAoY29uc3QgYXV0byAmTyA6IE92ZXJsb2FkcykgeworICAgICAgaWYgKE8tPmlzQ29udmVydGlibGVUbyhUaGlzS2luZCkpCisgICAgICAgIE8tPmdldEFyZ0tpbmRzKFRoaXNLaW5kLCBBcmdObywgS2luZHMpOworICAgIH0KKyAgfQorCisgIGJvb2wgaXNDb252ZXJ0aWJsZVRvKGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQgS2luZCwgdW5zaWduZWQgKlNwZWNpZmljaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kICpMZWFzdERlcml2ZWRLaW5kKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBhdXRvICZPIDogT3ZlcmxvYWRzKSB7CisgICAgICBpZiAoTy0+aXNDb252ZXJ0aWJsZVRvKEtpbmQsIFNwZWNpZmljaXR5LCBMZWFzdERlcml2ZWRLaW5kKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxNYXRjaGVyQ3JlYXRlQ2FsbGJhY2sgKj4gT3ZlcmxvYWRzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TWF0Y2hlckRlc2NyaXB0b3I+PiBPdmVybG9hZHM7CiB9OwogCiAvLy8gXGJyaWVmIFZhcmlhZGljIG9wZXJhdG9yIG1hcnNoYWxsZXIgZnVuY3Rpb24uCi1jbGFzcyBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlckNyZWF0ZUNhbGxiYWNrIDogcHVibGljIE1hdGNoZXJDcmVhdGVDYWxsYmFjayB7CitjbGFzcyBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlckRlc2NyaXB0b3IgOiBwdWJsaWMgTWF0Y2hlckRlc2NyaXB0b3IgewogcHVibGljOgogICB0eXBlZGVmIGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OlZhcmlhZGljT3BlcmF0b3JGdW5jdGlvbiBWYXJGdW5jOwotICBWYXJpYWRpY09wZXJhdG9yTWF0Y2hlckNyZWF0ZUNhbGxiYWNrKFZhckZ1bmMgRnVuYywgU3RyaW5nUmVmIE1hdGNoZXJOYW1lKQotICAgICAgOiBGdW5jKEZ1bmMpLCBNYXRjaGVyTmFtZShNYXRjaGVyTmFtZSkge30KKyAgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXJEZXNjcmlwdG9yKHVuc2lnbmVkIE1pbkNvdW50LCB1bnNpZ25lZCBNYXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhckZ1bmMgRnVuYywgU3RyaW5nUmVmIE1hdGNoZXJOYW1lKQorICAgICAgOiBNaW5Db3VudChNaW5Db3VudCksIE1heENvdW50KE1heENvdW50KSwgRnVuYyhGdW5jKSwKKyAgICAgICAgTWF0Y2hlck5hbWUoTWF0Y2hlck5hbWUpIHt9CiAKLSAgdmlydHVhbCBWYXJpYW50TWF0Y2hlciBydW4oY29uc3QgU291cmNlUmFuZ2UgJk5hbWVSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VyVmFsdWU+IEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzICpFcnJvcikgY29uc3QgeworICB2aXJ0dWFsIFZhcmlhbnRNYXRjaGVyIGNyZWF0ZShjb25zdCBTb3VyY2VSYW5nZSAmTmFtZVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZXJWYWx1ZT4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3MgKkVycm9yKSBjb25zdCB7CisgICAgaWYgKEFyZ3Muc2l6ZSgpIDwgTWluQ291bnQgfHwgTWF4Q291bnQgPCBBcmdzLnNpemUoKSkgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgTWF4U3RyID0KKyAgICAgICAgICAoTWF4Q291bnQgPT0gVUlOVF9NQVggPyAiIiA6IFR3aW5lKE1heENvdW50KSkuc3RyKCk7CisgICAgICBFcnJvci0+YWRkRXJyb3IoTmFtZVJhbmdlLCBFcnJvci0+RVRfUmVnaXN0cnlXcm9uZ0FyZ0NvdW50KQorICAgICAgICAgIDw8ICgiKCIgKyBUd2luZShNaW5Db3VudCkgKyAiLCAiICsgTWF4U3RyICsgIikiKSA8PCBBcmdzLnNpemUoKTsKKyAgICAgIHJldHVybiBWYXJpYW50TWF0Y2hlcigpOworICAgIH0KKwogICAgIHN0ZDo6dmVjdG9yPFZhcmlhbnRNYXRjaGVyPiBJbm5lckFyZ3M7CiAgICAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBBcmdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKICAgICAgIGNvbnN0IFBhcnNlclZhbHVlICZBcmcgPSBBcmdzW2ldOwpAQCAtMzY0LDg1ICs2MDksMTIzIEBACiAgICAgICB9CiAgICAgICBJbm5lckFyZ3MucHVzaF9iYWNrKFZhbHVlLmdldE1hdGNoZXIoKSk7CiAgICAgfQotICAgIHJldHVybiBWYXJpYW50TWF0Y2hlcjo6VmFyaWFkaWNPcGVyYXRvck1hdGNoZXIoRnVuYywgSW5uZXJBcmdzKTsKKyAgICByZXR1cm4gVmFyaWFudE1hdGNoZXI6OlZhcmlhZGljT3BlcmF0b3JNYXRjaGVyKEZ1bmMsIHN0ZDo6bW92ZShJbm5lckFyZ3MpKTsKICAgfQogCisgIGJvb2wgaXNWYXJpYWRpYygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgdW5zaWduZWQgZ2V0TnVtQXJncygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgdm9pZCBnZXRBcmdLaW5kcyhhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kIFRoaXNLaW5kLCB1bnNpZ25lZCBBcmdObywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxBcmdLaW5kPiAmS2luZHMpIGNvbnN0IHsKKyAgICBLaW5kcy5wdXNoX2JhY2soVGhpc0tpbmQpOworICB9CisgIGJvb2wgaXNDb252ZXJ0aWJsZVRvKGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQgS2luZCwgdW5zaWduZWQgKlNwZWNpZmljaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBhc3RfdHlwZV90cmFpdHM6OkFTVE5vZGVLaW5kICpMZWFzdERlcml2ZWRLaW5kKSBjb25zdCB7CisgICAgaWYgKFNwZWNpZmljaXR5KQorICAgICAgKlNwZWNpZmljaXR5ID0gMTsKKyAgICBpZiAoTGVhc3REZXJpdmVkS2luZCkKKyAgICAgICpMZWFzdERlcml2ZWRLaW5kID0gS2luZDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIGlzUG9seW1vcnBoaWMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKIHByaXZhdGU6CisgIGNvbnN0IHVuc2lnbmVkIE1pbkNvdW50OworICBjb25zdCB1bnNpZ25lZCBNYXhDb3VudDsKICAgY29uc3QgVmFyRnVuYyBGdW5jOwogICBjb25zdCBTdHJpbmdSZWYgTWF0Y2hlck5hbWU7CiB9OwogCi0KIC8vLyBIZWxwZXIgZnVuY3Rpb25zIHRvIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgbWFyc2hhbGxlciBmdW5jdGlvbnMuCiAvLy8gVGhleSBkZXRlY3QgdGhlIG51bWJlciBvZiBhcmd1bWVudHMsIGFyZ3VtZW50cyB0eXBlcyBhbmQgcmV0dXJuIHR5cGUuCiAKIC8vLyBcYnJpZWYgMC1hcmcgb3ZlcmxvYWQKIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXR1cm5UeXBlPgotTWF0Y2hlckNyZWF0ZUNhbGxiYWNrICptYWtlTWF0Y2hlckF1dG9NYXJzaGFsbChSZXR1cm5UeXBlICgqRnVuYykoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1hdGNoZXJOYW1lKSB7Ci0gIHJldHVybiBuZXcgRml4ZWRBcmdDb3VudE1hdGNoZXJDcmVhdGVDYWxsYmFjaygKK01hdGNoZXJEZXNjcmlwdG9yICptYWtlTWF0Y2hlckF1dG9NYXJzaGFsbChSZXR1cm5UeXBlICgqRnVuYykoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTWF0Y2hlck5hbWUpIHsKKyAgc3RkOjp2ZWN0b3I8YXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZD4gUmV0VHlwZXM7CisgIEJ1aWxkUmV0dXJuVHlwZVZlY3RvcjxSZXR1cm5UeXBlPjo6YnVpbGQoUmV0VHlwZXMpOworICByZXR1cm4gbmV3IEZpeGVkQXJnQ291bnRNYXRjaGVyRGVzY3JpcHRvcigKICAgICAgIG1hdGNoZXJNYXJzaGFsbDA8UmV0dXJuVHlwZT4sIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAoKikoKT4oRnVuYyksCi0gICAgICBNYXRjaGVyTmFtZSk7CisgICAgICBNYXRjaGVyTmFtZSwgUmV0VHlwZXMsIGxsdm06OkFycmF5UmVmPEFyZ0tpbmQ+KCkpOwogfQogCiAvLy8gXGJyaWVmIDEtYXJnIG92ZXJsb2FkCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmV0dXJuVHlwZSwgdHlwZW5hbWUgQXJnVHlwZTE+Ci1NYXRjaGVyQ3JlYXRlQ2FsbGJhY2sgKm1ha2VNYXRjaGVyQXV0b01hcnNoYWxsKFJldHVyblR5cGUgKCpGdW5jKShBcmdUeXBlMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNYXRjaGVyTmFtZSkgewotICByZXR1cm4gbmV3IEZpeGVkQXJnQ291bnRNYXRjaGVyQ3JlYXRlQ2FsbGJhY2soCitNYXRjaGVyRGVzY3JpcHRvciAqbWFrZU1hdGNoZXJBdXRvTWFyc2hhbGwoUmV0dXJuVHlwZSAoKkZ1bmMpKEFyZ1R5cGUxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTWF0Y2hlck5hbWUpIHsKKyAgc3RkOjp2ZWN0b3I8YXN0X3R5cGVfdHJhaXRzOjpBU1ROb2RlS2luZD4gUmV0VHlwZXM7CisgIEJ1aWxkUmV0dXJuVHlwZVZlY3RvcjxSZXR1cm5UeXBlPjo6YnVpbGQoUmV0VHlwZXMpOworICBBcmdLaW5kIEFLID0gQXJnVHlwZVRyYWl0czxBcmdUeXBlMT46OmdldEtpbmQoKTsKKyAgcmV0dXJuIG5ldyBGaXhlZEFyZ0NvdW50TWF0Y2hlckRlc2NyaXB0b3IoCiAgICAgICBtYXRjaGVyTWFyc2hhbGwxPFJldHVyblR5cGUsIEFyZ1R5cGUxPiwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAoKikoKT4oRnVuYyksIE1hdGNoZXJOYW1lKTsKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAoKikoKT4oRnVuYyksIE1hdGNoZXJOYW1lLCBSZXRUeXBlcywgQUspOwogfQogCiAvLy8gXGJyaWVmIDItYXJnIG92ZXJsb2FkCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmV0dXJuVHlwZSwgdHlwZW5hbWUgQXJnVHlwZTEsIHR5cGVuYW1lIEFyZ1R5cGUyPgotTWF0Y2hlckNyZWF0ZUNhbGxiYWNrICptYWtlTWF0Y2hlckF1dG9NYXJzaGFsbChSZXR1cm5UeXBlICgqRnVuYykoQXJnVHlwZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdUeXBlMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNYXRjaGVyTmFtZSkgewotICByZXR1cm4gbmV3IEZpeGVkQXJnQ291bnRNYXRjaGVyQ3JlYXRlQ2FsbGJhY2soCitNYXRjaGVyRGVzY3JpcHRvciAqbWFrZU1hdGNoZXJBdXRvTWFyc2hhbGwoUmV0dXJuVHlwZSAoKkZ1bmMpKEFyZ1R5cGUxLCBBcmdUeXBlMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1hdGNoZXJOYW1lKSB7CisgIHN0ZDo6dmVjdG9yPGFzdF90eXBlX3RyYWl0czo6QVNUTm9kZUtpbmQ+IFJldFR5cGVzOworICBCdWlsZFJldHVyblR5cGVWZWN0b3I8UmV0dXJuVHlwZT46OmJ1aWxkKFJldFR5cGVzKTsKKyAgQXJnS2luZCBBS3NbXSA9IHsgQXJnVHlwZVRyYWl0czxBcmdUeXBlMT46OmdldEtpbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgQXJnVHlwZVRyYWl0czxBcmdUeXBlMj46OmdldEtpbmQoKSB9OworICByZXR1cm4gbmV3IEZpeGVkQXJnQ291bnRNYXRjaGVyRGVzY3JpcHRvcigKICAgICAgIG1hdGNoZXJNYXJzaGFsbDI8UmV0dXJuVHlwZSwgQXJnVHlwZTEsIEFyZ1R5cGUyPiwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAoKikoKT4oRnVuYyksIE1hdGNoZXJOYW1lKTsKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAoKikoKT4oRnVuYyksIE1hdGNoZXJOYW1lLCBSZXRUeXBlcywgQUtzKTsKIH0KIAogLy8vIFxicmllZiBWYXJpYWRpYyBvdmVybG9hZC4KIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRULCB0eXBlbmFtZSBBcmdULAogICAgICAgICAgIFJlc3VsdFQgKCpGdW5jKShBcnJheVJlZjxjb25zdCBBcmdUICo+KT4KLU1hdGNoZXJDcmVhdGVDYWxsYmFjayAqCitNYXRjaGVyRGVzY3JpcHRvciAqCiBtYWtlTWF0Y2hlckF1dG9NYXJzaGFsbChsbHZtOjpWYXJpYWRpY0Z1bmN0aW9uPFJlc3VsdFQsIEFyZ1QsIEZ1bmM+IFZhckZ1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTWF0Y2hlck5hbWUpIHsKLSAgcmV0dXJuIG5ldyBGcmVlRnVuY01hdGNoZXJDcmVhdGVDYWxsYmFjaygKLSAgICAgICZ2YXJpYWRpY01hdGNoZXJDcmVhdGVDYWxsYmFjazxSZXN1bHRULCBBcmdULCBGdW5jPiwgTWF0Y2hlck5hbWUpOworICByZXR1cm4gbmV3IFZhcmlhZGljRnVuY01hdGNoZXJEZXNjcmlwdG9yKFZhckZ1bmMsIE1hdGNoZXJOYW1lKTsKK30KKworLy8vIFxicmllZiBPdmVybG9hZCBmb3IgVmFyaWFkaWNEeW5DYXN0QWxsT2ZNYXRjaGVycy4KKy8vLworLy8vIE5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dCBEeW5DYXN0QWxsT2ZNYXRjaGVyRGVzY3JpcHRvciBnaXZlcyB1cyBiZXR0ZXIKKy8vLyBjb21wbGV0aW9uIHJlc3VsdHMgZm9yIHRoYXQgdHlwZSBvZiBtYXRjaGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIEJhc2VULCB0eXBlbmFtZSBEZXJpdmVkVD4KK01hdGNoZXJEZXNjcmlwdG9yICoKK21ha2VNYXRjaGVyQXV0b01hcnNoYWxsKGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OlZhcmlhZGljRHluQ2FzdEFsbE9mTWF0Y2hlcjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVCwgRGVyaXZlZFQ+IFZhckZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTWF0Y2hlck5hbWUpIHsKKyAgcmV0dXJuIG5ldyBEeW5DYXN0QWxsT2ZNYXRjaGVyRGVzY3JpcHRvcihWYXJGdW5jLCBNYXRjaGVyTmFtZSk7CiB9CiAKIC8vLyBcYnJpZWYgQXJndW1lbnQgYWRhcHRhdGl2ZSBvdmVybG9hZC4KIHRlbXBsYXRlIDx0ZW1wbGF0ZSA8dHlwZW5hbWUgVG9BcmcsIHR5cGVuYW1lIEZyb21Bcmc+IGNsYXNzIEFyZ3VtZW50QWRhcHRlclQsCiAgICAgICAgICAgdHlwZW5hbWUgRnJvbVR5cGVzLCB0eXBlbmFtZSBUb1R5cGVzPgotTWF0Y2hlckNyZWF0ZUNhbGxiYWNrICoKK01hdGNoZXJEZXNjcmlwdG9yICoKIG1ha2VNYXRjaGVyQXV0b01hcnNoYWxsKGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6OkFyZ3VtZW50QWRhcHRpbmdNYXRjaGVyRnVuYzwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudEFkYXB0ZXJULCBGcm9tVHlwZXMsIFRvVHlwZXM+LAogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1hdGNoZXJOYW1lKSB7Ci0gIHN0ZDo6dmVjdG9yPE1hdGNoZXJDcmVhdGVDYWxsYmFjayAqPiBPdmVybG9hZHM7CisgIHN0ZDo6dmVjdG9yPE1hdGNoZXJEZXNjcmlwdG9yICo+IE92ZXJsb2FkczsKICAgQWRhcHRhdGl2ZU92ZXJsb2FkQ29sbGVjdG9yPEFyZ3VtZW50QWRhcHRlclQsIEZyb21UeXBlcywgVG9UeXBlcz4oTWF0Y2hlck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2Fkcyk7Ci0gIHJldHVybiBuZXcgT3ZlcmxvYWRlZE1hdGNoZXJDcmVhdGVDYWxsYmFjayhPdmVybG9hZHMpOworICByZXR1cm4gbmV3IE92ZXJsb2FkZWRNYXRjaGVyRGVzY3JpcHRvcihPdmVybG9hZHMpOwogfQogCiB0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lIFRvQXJnLCB0eXBlbmFtZSBGcm9tQXJnPiBjbGFzcyBBcmd1bWVudEFkYXB0ZXJULAogICAgICAgICAgIHR5cGVuYW1lIEZyb21UeXBlcywgdHlwZW5hbWUgVG9UeXBlcz4KIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tVHlwZUxpc3Q+Ci1pbmxpbmUgdm9pZAotQWRhcHRhdGl2ZU92ZXJsb2FkQ29sbGVjdG9yPEFyZ3VtZW50QWRhcHRlclQsIEZyb21UeXBlcywgVG9UeXBlcz46OmNvbGxlY3QoCi0gICAgRnJvbVR5cGVMaXN0KSB7CitpbmxpbmUgdm9pZCBBZGFwdGF0aXZlT3ZlcmxvYWRDb2xsZWN0b3I8QXJndW1lbnRBZGFwdGVyVCwgRnJvbVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvVHlwZXM+Ojpjb2xsZWN0KEZyb21UeXBlTGlzdCkgewogICBPdXQucHVzaF9iYWNrKG1ha2VNYXRjaGVyQXV0b01hcnNoYWxsKAogICAgICAgJkFkYXB0YXRpdmVGdW5jOjp0ZW1wbGF0ZSBjcmVhdGU8dHlwZW5hbWUgRnJvbVR5cGVMaXN0OjpoZWFkPiwgTmFtZSkpOwogICBjb2xsZWN0KHR5cGVuYW1lIEZyb21UeXBlTGlzdDo6dGFpbCgpKTsKIH0KIAogLy8vIFxicmllZiBWYXJpYWRpYyBvcGVyYXRvciBvdmVybG9hZC4KLU1hdGNoZXJDcmVhdGVDYWxsYmFjayAqbWFrZU1hdGNoZXJBdXRvTWFyc2hhbGwoCi0gICAgYXN0X21hdGNoZXJzOjppbnRlcm5hbDo6VmFyaWFkaWNPcGVyYXRvck1hdGNoZXJGdW5jIEZ1bmMsCi0gICAgU3RyaW5nUmVmIE1hdGNoZXJOYW1lKSB7Ci0gIHJldHVybiBuZXcgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXJDcmVhdGVDYWxsYmFjayhGdW5jLkZ1bmMsIE1hdGNoZXJOYW1lKTsKK3RlbXBsYXRlIDx1bnNpZ25lZCBNaW5Db3VudCwgdW5zaWduZWQgTWF4Q291bnQ+CitNYXRjaGVyRGVzY3JpcHRvciAqCittYWtlTWF0Y2hlckF1dG9NYXJzaGFsbChhc3RfbWF0Y2hlcnM6OmludGVybmFsOjpWYXJpYWRpY09wZXJhdG9yTWF0Y2hlckZ1bmM8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluQ291bnQsIE1heENvdW50PiBGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1hdGNoZXJOYW1lKSB7CisgIHJldHVybiBuZXcgVmFyaWFkaWNPcGVyYXRvck1hdGNoZXJEZXNjcmlwdG9yKE1pbkNvdW50LCBNYXhDb3VudCwgRnVuYy5GdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyTmFtZSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbApkaWZmIC0tZ2l0IGEvbGliL0FTVE1hdGNoZXJzL0R5bmFtaWMvUGFyc2VyLmNwcCBiL2xpYi9BU1RNYXRjaGVycy9EeW5hbWljL1BhcnNlci5jcHAKaW5kZXggZGY5NTk2ZS4uMjRmZmRjZCAxMDA2NDQKLS0tIGEvbGliL0FTVE1hdGNoZXJzL0R5bmFtaWMvUGFyc2VyLmNwcAorKysgYi9saWIvQVNUTWF0Y2hlcnMvRHluYW1pYy9QYXJzZXIuY3BwCkBAIC0xMiwxMyArMTIsMTMgQEAKIC8vLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KICNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1BhcnNlci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvUmVnaXN0cnkuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9DaGFySW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIGFzdF9tYXRjaGVycyB7CkBAIC0yOCwxNSArMjgsMTYgQEAKIHN0cnVjdCBQYXJzZXI6OlRva2VuSW5mbyB7CiAgIC8vLyBcYnJpZWYgRGlmZmVyZW50IHBvc3NpYmxlIHRva2Vucy4KICAgZW51bSBUb2tlbktpbmQgewotICAgIFRLX0VvZiA9IDAsCi0gICAgVEtfT3BlblBhcmVuID0gMSwKLSAgICBUS19DbG9zZVBhcmVuID0gMiwKLSAgICBUS19Db21tYSA9IDMsCi0gICAgVEtfUGVyaW9kID0gNCwKLSAgICBUS19MaXRlcmFsID0gNSwKLSAgICBUS19JZGVudCA9IDYsCi0gICAgVEtfSW52YWxpZENoYXIgPSA3LAotICAgIFRLX0Vycm9yID0gOAorICAgIFRLX0VvZiwKKyAgICBUS19PcGVuUGFyZW4sCisgICAgVEtfQ2xvc2VQYXJlbiwKKyAgICBUS19Db21tYSwKKyAgICBUS19QZXJpb2QsCisgICAgVEtfTGl0ZXJhbCwKKyAgICBUS19JZGVudCwKKyAgICBUS19JbnZhbGlkQ2hhciwKKyAgICBUS19FcnJvciwKKyAgICBUS19Db2RlQ29tcGxldGlvbgogICB9OwogCiAgIC8vLyBcYnJpZWYgU29tZSBrbm93biBpZGVudGlmaWVycy4KQEAgLTU2LDcgKzU3LDE1IEBACiBjbGFzcyBQYXJzZXI6OkNvZGVUb2tlbml6ZXIgewogcHVibGljOgogICBleHBsaWNpdCBDb2RlVG9rZW5pemVyKFN0cmluZ1JlZiBNYXRjaGVyQ29kZSwgRGlhZ25vc3RpY3MgKkVycm9yKQotICAgICAgOiBDb2RlKE1hdGNoZXJDb2RlKSwgU3RhcnRPZkxpbmUoTWF0Y2hlckNvZGUpLCBMaW5lKDEpLCBFcnJvcihFcnJvcikgeworICAgICAgOiBDb2RlKE1hdGNoZXJDb2RlKSwgU3RhcnRPZkxpbmUoTWF0Y2hlckNvZGUpLCBMaW5lKDEpLCBFcnJvcihFcnJvciksCisgICAgICAgIENvZGVDb21wbGV0aW9uTG9jYXRpb24oMCkgeworICAgIE5leHRUb2tlbiA9IGdldE5leHRUb2tlbigpOworICB9CisKKyAgQ29kZVRva2VuaXplcihTdHJpbmdSZWYgTWF0Y2hlckNvZGUsIERpYWdub3N0aWNzICpFcnJvciwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2RlQ29tcGxldGlvbk9mZnNldCkKKyAgICAgIDogQ29kZShNYXRjaGVyQ29kZSksIFN0YXJ0T2ZMaW5lKE1hdGNoZXJDb2RlKSwgTGluZSgxKSwgRXJyb3IoRXJyb3IpLAorICAgICAgICBDb2RlQ29tcGxldGlvbkxvY2F0aW9uKE1hdGNoZXJDb2RlLmRhdGEoKSArIENvZGVDb21wbGV0aW9uT2Zmc2V0KSB7CiAgICAgTmV4dFRva2VuID0gZ2V0TmV4dFRva2VuKCk7CiAgIH0KIApAQCAtNzgsNiArODcsMTMgQEAKICAgICBUb2tlbkluZm8gUmVzdWx0OwogICAgIFJlc3VsdC5SYW5nZS5TdGFydCA9IGN1cnJlbnRMb2NhdGlvbigpOwogCisgICAgaWYgKENvZGVDb21wbGV0aW9uTG9jYXRpb24gJiYgQ29kZUNvbXBsZXRpb25Mb2NhdGlvbiA8PSBDb2RlLmRhdGEoKSkgeworICAgICAgUmVzdWx0LktpbmQgPSBUb2tlbkluZm86OlRLX0NvZGVDb21wbGV0aW9uOworICAgICAgUmVzdWx0LlRleHQgPSBTdHJpbmdSZWYoQ29kZUNvbXBsZXRpb25Mb2NhdGlvbiwgMCk7CisgICAgICBDb2RlQ29tcGxldGlvbkxvY2F0aW9uID0gMDsKKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorCiAgICAgaWYgKENvZGUuZW1wdHkoKSkgewogICAgICAgUmVzdWx0LktpbmQgPSBUb2tlbkluZm86OlRLX0VvZjsKICAgICAgIFJlc3VsdC5UZXh0ID0gIiI7CkBAIC0xMjIsOCArMTM4LDIxIEBACiAgICAgICBpZiAoaXNBbHBoYW51bWVyaWMoQ29kZVswXSkpIHsKICAgICAgICAgLy8gUGFyc2UgYW4gaWRlbnRpZmllcgogICAgICAgICBzaXplX3QgVG9rZW5MZW5ndGggPSAxOwotICAgICAgICB3aGlsZSAoVG9rZW5MZW5ndGggPCBDb2RlLnNpemUoKSAmJiBpc0FscGhhbnVtZXJpYyhDb2RlW1Rva2VuTGVuZ3RoXSkpCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgLy8gQSBjb2RlIGNvbXBsZXRpb24gbG9jYXRpb24gaW4vaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gaWRlbnRpZmllciB3aWxsCisgICAgICAgICAgLy8gY2F1c2UgdGhlIHBvcnRpb24gb2YgdGhlIGlkZW50aWZpZXIgYmVmb3JlIHRoZSBjb2RlIGNvbXBsZXRpb24KKyAgICAgICAgICAvLyBsb2NhdGlvbiB0byBiZWNvbWUgYSBjb2RlIGNvbXBsZXRpb24gdG9rZW4uCisgICAgICAgICAgaWYgKENvZGVDb21wbGV0aW9uTG9jYXRpb24gPT0gQ29kZS5kYXRhKCkgKyBUb2tlbkxlbmd0aCkgeworICAgICAgICAgICAgQ29kZUNvbXBsZXRpb25Mb2NhdGlvbiA9IDA7CisgICAgICAgICAgICBSZXN1bHQuS2luZCA9IFRva2VuSW5mbzo6VEtfQ29kZUNvbXBsZXRpb247CisgICAgICAgICAgICBSZXN1bHQuVGV4dCA9IENvZGUuc3Vic3RyKDAsIFRva2VuTGVuZ3RoKTsKKyAgICAgICAgICAgIENvZGUgPSBDb2RlLmRyb3BfZnJvbnQoVG9rZW5MZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKFRva2VuTGVuZ3RoID09IENvZGUuc2l6ZSgpIHx8ICFpc0FscGhhbnVtZXJpYyhDb2RlW1Rva2VuTGVuZ3RoXSkpCisgICAgICAgICAgICBicmVhazsKICAgICAgICAgICArK1Rva2VuTGVuZ3RoOworICAgICAgICB9CiAgICAgICAgIFJlc3VsdC5LaW5kID0gVG9rZW5JbmZvOjpUS19JZGVudDsKICAgICAgICAgUmVzdWx0LlRleHQgPSBDb2RlLnN1YnN0cigwLCBUb2tlbkxlbmd0aCk7CiAgICAgICAgIENvZGUgPSBDb2RlLmRyb3BfZnJvbnQoVG9rZW5MZW5ndGgpOwpAQCAtMjI0LDEwICsyNTMsMjcgQEAKICAgdW5zaWduZWQgTGluZTsKICAgRGlhZ25vc3RpY3MgKkVycm9yOwogICBUb2tlbkluZm8gTmV4dFRva2VuOworICBjb25zdCBjaGFyICpDb2RlQ29tcGxldGlvbkxvY2F0aW9uOwogfTsKIAogUGFyc2VyOjpTZW1hOjp+U2VtYSgpIHt9CiAKK3N0cnVjdCBQYXJzZXI6OlNjb3BlZENvbnRleHRFbnRyeSB7CisgIFBhcnNlciAqUDsKKworICBTY29wZWRDb250ZXh0RW50cnkoUGFyc2VyICpQLCBNYXRjaGVyQ3RvciBDKSA6IFAoUCkgeworICAgIFAtPkNvbnRleHRTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQywgMHUpKTsKKyAgfQorCisgIH5TY29wZWRDb250ZXh0RW50cnkoKSB7CisgICAgUC0+Q29udGV4dFN0YWNrLnBvcF9iYWNrKCk7CisgIH0KKworICB2b2lkIG5leHRBcmcoKSB7CisgICAgKytQLT5Db250ZXh0U3RhY2suYmFjaygpLnNlY29uZDsKKyAgfQorfTsKKwogLy8vIFxicmllZiBQYXJzZSBhbmQgdmFsaWRhdGUgYSBtYXRjaGVyIGV4cHJlc3Npb24uCiAvLy8gXHJldHVybiBcYyB0cnVlIG9uIHN1Y2Nlc3MsIGluIHdoaWNoIGNhc2UgXGMgVmFsdWUgaGFzIHRoZSBtYXRjaGVyIHBhcnNlZC4KIC8vLyAgIElmIHRoZSBpbnB1dCBpcyBtYWxmb3JtZWQsIG9yIHNvbWUgYXJndW1lbnQgaGFzIGFuIGVycm9yLCBpdApAQCAtMjQyLDMyICsyODgsNDMgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAorICBsbHZtOjpPcHRpb25hbDxNYXRjaGVyQ3Rvcj4gQ3RvciA9CisgICAgICBTLT5sb29rdXBNYXRjaGVyQ3RvcihOYW1lVG9rZW4uVGV4dCwgTmFtZVRva2VuLlJhbmdlLCBFcnJvcik7CiAgIHN0ZDo6dmVjdG9yPFBhcnNlclZhbHVlPiBBcmdzOwogICBUb2tlbkluZm8gRW5kVG9rZW47Ci0gIHdoaWxlIChUb2tlbml6ZXItPm5leHRUb2tlbktpbmQoKSAhPSBUb2tlbkluZm86OlRLX0VvZikgewotICAgIGlmIChUb2tlbml6ZXItPm5leHRUb2tlbktpbmQoKSA9PSBUb2tlbkluZm86OlRLX0Nsb3NlUGFyZW4pIHsKLSAgICAgIC8vIEVuZCBvZiBhcmdzLgotICAgICAgRW5kVG9rZW4gPSBUb2tlbml6ZXItPmNvbnN1bWVOZXh0VG9rZW4oKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoQXJncy5zaXplKCkgPiAwKSB7Ci0gICAgICAvLyBXZSBtdXN0IGZpbmQgYSAsIHRva2VuIHRvIGNvbnRpbnVlLgotICAgICAgY29uc3QgVG9rZW5JbmZvIENvbW1hVG9rZW4gPSBUb2tlbml6ZXItPmNvbnN1bWVOZXh0VG9rZW4oKTsKLSAgICAgIGlmIChDb21tYVRva2VuLktpbmQgIT0gVG9rZW5JbmZvOjpUS19Db21tYSkgewotICAgICAgICBFcnJvci0+YWRkRXJyb3IoQ29tbWFUb2tlbi5SYW5nZSwgRXJyb3ItPkVUX1BhcnNlck5vQ29tbWEpCi0gICAgICAgICAgICA8PCBDb21tYVRva2VuLlRleHQ7CisKKyAgeworICAgIFNjb3BlZENvbnRleHRFbnRyeSBTQ0UodGhpcywgQ3RvciA/ICpDdG9yIDogMCk7CisKKyAgICB3aGlsZSAoVG9rZW5pemVyLT5uZXh0VG9rZW5LaW5kKCkgIT0gVG9rZW5JbmZvOjpUS19Fb2YpIHsKKyAgICAgIGlmIChUb2tlbml6ZXItPm5leHRUb2tlbktpbmQoKSA9PSBUb2tlbkluZm86OlRLX0Nsb3NlUGFyZW4pIHsKKyAgICAgICAgLy8gRW5kIG9mIGFyZ3MuCisgICAgICAgIEVuZFRva2VuID0gVG9rZW5pemVyLT5jb25zdW1lTmV4dFRva2VuKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKEFyZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICAvLyBXZSBtdXN0IGZpbmQgYSAsIHRva2VuIHRvIGNvbnRpbnVlLgorICAgICAgICBjb25zdCBUb2tlbkluZm8gQ29tbWFUb2tlbiA9IFRva2VuaXplci0+Y29uc3VtZU5leHRUb2tlbigpOworICAgICAgICBpZiAoQ29tbWFUb2tlbi5LaW5kICE9IFRva2VuSW5mbzo6VEtfQ29tbWEpIHsKKyAgICAgICAgICBFcnJvci0+YWRkRXJyb3IoQ29tbWFUb2tlbi5SYW5nZSwgRXJyb3ItPkVUX1BhcnNlck5vQ29tbWEpCisgICAgICAgICAgICAgIDw8IENvbW1hVG9rZW4uVGV4dDsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgRGlhZ25vc3RpY3M6OkNvbnRleHQgQ3R4KERpYWdub3N0aWNzOjpDb250ZXh0OjpNYXRjaGVyQXJnLCBFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lVG9rZW4uVGV4dCwgTmFtZVRva2VuLlJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3Muc2l6ZSgpICsgMSk7CisgICAgICBQYXJzZXJWYWx1ZSBBcmdWYWx1ZTsKKyAgICAgIEFyZ1ZhbHVlLlRleHQgPSBUb2tlbml6ZXItPnBlZWtOZXh0VG9rZW4oKS5UZXh0OworICAgICAgQXJnVmFsdWUuUmFuZ2UgPSBUb2tlbml6ZXItPnBlZWtOZXh0VG9rZW4oKS5SYW5nZTsKKyAgICAgIGlmICghcGFyc2VFeHByZXNzaW9uSW1wbCgmQXJnVmFsdWUuVmFsdWUpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KKworICAgICAgQXJncy5wdXNoX2JhY2soQXJnVmFsdWUpOworICAgICAgU0NFLm5leHRBcmcoKTsKICAgICB9Ci0KLSAgICBEaWFnbm9zdGljczo6Q29udGV4dCBDdHgoRGlhZ25vc3RpY3M6OkNvbnRleHQ6Ok1hdGNoZXJBcmcsIEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lVG9rZW4uVGV4dCwgTmFtZVRva2VuLlJhbmdlLCBBcmdzLnNpemUoKSArIDEpOwotICAgIFBhcnNlclZhbHVlIEFyZ1ZhbHVlOwotICAgIEFyZ1ZhbHVlLlRleHQgPSBUb2tlbml6ZXItPnBlZWtOZXh0VG9rZW4oKS5UZXh0OwotICAgIEFyZ1ZhbHVlLlJhbmdlID0gVG9rZW5pemVyLT5wZWVrTmV4dFRva2VuKCkuUmFuZ2U7Ci0gICAgaWYgKCFwYXJzZUV4cHJlc3Npb25JbXBsKCZBcmdWYWx1ZS5WYWx1ZSkpIHJldHVybiBmYWxzZTsKLQotICAgIEFyZ3MucHVzaF9iYWNrKEFyZ1ZhbHVlKTsKICAgfQogCiAgIGlmIChFbmRUb2tlbi5LaW5kID09IFRva2VuSW5mbzo6VEtfRW9mKSB7CkBAIC0yODAsNiArMzM3LDExIEBACiAgICAgLy8gUGFyc2UgLmJpbmQoImZvbyIpCiAgICAgVG9rZW5pemVyLT5jb25zdW1lTmV4dFRva2VuKCk7ICAvLyBjb25zdW1lIHRoZSBwZXJpb2QuCiAgICAgY29uc3QgVG9rZW5JbmZvIEJpbmRUb2tlbiA9IFRva2VuaXplci0+Y29uc3VtZU5leHRUb2tlbigpOworICAgIGlmIChCaW5kVG9rZW4uS2luZCA9PSBUb2tlbkluZm86OlRLX0NvZGVDb21wbGV0aW9uKSB7CisgICAgICBhZGRDb21wbGV0aW9uKEJpbmRUb2tlbiwgImJpbmQoXCIiLCAiYmluZCIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIGNvbnN0IFRva2VuSW5mbyBPcGVuVG9rZW4gPSBUb2tlbml6ZXItPmNvbnN1bWVOZXh0VG9rZW4oKTsKICAgICBjb25zdCBUb2tlbkluZm8gSURUb2tlbiA9IFRva2VuaXplci0+Y29uc3VtZU5leHRUb2tlbigpOwogICAgIGNvbnN0IFRva2VuSW5mbyBDbG9zZVRva2VuID0gVG9rZW5pemVyLT5jb25zdW1lTmV4dFRva2VuKCk7CkBAIC0zMDYsMTkgKzM2OCw1NSBAQAogICAgIEJpbmRJRCA9IElEVG9rZW4uVmFsdWUuZ2V0U3RyaW5nKCk7CiAgIH0KIAorICBpZiAoIUN0b3IpCisgICAgcmV0dXJuIGZhbHNlOworCiAgIC8vIE1lcmdlIHRoZSBzdGFydCBhbmQgZW5kIGluZm9zLgogICBEaWFnbm9zdGljczo6Q29udGV4dCBDdHgoRGlhZ25vc3RpY3M6OkNvbnRleHQ6OkNvbnN0cnVjdE1hdGNoZXIsIEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVRva2VuLlRleHQsIE5hbWVUb2tlbi5SYW5nZSk7CiAgIFNvdXJjZVJhbmdlIE1hdGNoZXJSYW5nZSA9IE5hbWVUb2tlbi5SYW5nZTsKICAgTWF0Y2hlclJhbmdlLkVuZCA9IEVuZFRva2VuLlJhbmdlLkVuZDsKICAgVmFyaWFudE1hdGNoZXIgUmVzdWx0ID0gUy0+YWN0T25NYXRjaGVyRXhwcmVzc2lvbigKLSAgICAgIE5hbWVUb2tlbi5UZXh0LCBNYXRjaGVyUmFuZ2UsIEJpbmRJRCwgQXJncywgRXJyb3IpOworICAgICAgKkN0b3IsIE1hdGNoZXJSYW5nZSwgQmluZElELCBBcmdzLCBFcnJvcik7CiAgIGlmIChSZXN1bHQuaXNOdWxsKCkpIHJldHVybiBmYWxzZTsKIAogICAqVmFsdWUgPSBSZXN1bHQ7CiAgIHJldHVybiB0cnVlOwogfQogCisvLyBJZiB0aGUgcHJlZml4IG9mIHRoaXMgY29tcGxldGlvbiBtYXRjaGVzIHRoZSBjb21wbGV0aW9uIHRva2VuLCBhZGQgaXQgdG8KKy8vIENvbXBsZXRpb25zIG1pbnVzIHRoZSBwcmVmaXguCit2b2lkIFBhcnNlcjo6YWRkQ29tcGxldGlvbihjb25zdCBUb2tlbkluZm8gJkNvbXBUb2tlbiwgU3RyaW5nUmVmIFR5cGVkVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEZWNsKSB7CisgIGlmIChUeXBlZFRleHQuc2l6ZSgpID49IENvbXBUb2tlbi5UZXh0LnNpemUoKSAmJgorICAgICAgVHlwZWRUZXh0LnN1YnN0cigwLCBDb21wVG9rZW4uVGV4dC5zaXplKCkpID09IENvbXBUb2tlbi5UZXh0KSB7CisgICAgQ29tcGxldGlvbnMucHVzaF9iYWNrKAorICAgICAgICBNYXRjaGVyQ29tcGxldGlvbihUeXBlZFRleHQuc3Vic3RyKENvbXBUb2tlbi5UZXh0LnNpemUoKSksIERlY2wpKTsKKyAgfQorfQorCit2b2lkIFBhcnNlcjo6YWRkRXhwcmVzc2lvbkNvbXBsZXRpb25zKCkgeworICBjb25zdCBUb2tlbkluZm8gQ29tcFRva2VuID0gVG9rZW5pemVyLT5jb25zdW1lTmV4dFRva2VuKCk7CisgIGFzc2VydChDb21wVG9rZW4uS2luZCA9PSBUb2tlbkluZm86OlRLX0NvZGVDb21wbGV0aW9uKTsKKworICAvLyBXZSBjYW5ub3QgY29tcGxldGUgY29kZSBpZiB0aGVyZSBpcyBhbiBpbnZhbGlkIGVsZW1lbnQgb24gdGhlIGNvbnRleHQKKyAgLy8gc3RhY2suCisgIGZvciAoQ29udGV4dFN0YWNrVHk6Oml0ZXJhdG9yIEkgPSBDb250ZXh0U3RhY2suYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IENvbnRleHRTdGFjay5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmICghSS0+Zmlyc3QpCisgICAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnZlY3RvcjxNYXRjaGVyQ29tcGxldGlvbj4gUmVnQ29tcGxldGlvbnMgPQorICAgICAgUmVnaXN0cnk6OmdldENvbXBsZXRpb25zKENvbnRleHRTdGFjayk7CisgIGZvciAoc3RkOjp2ZWN0b3I8TWF0Y2hlckNvbXBsZXRpb24+OjppdGVyYXRvciBJID0gUmVnQ29tcGxldGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBSZWdDb21wbGV0aW9ucy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGFkZENvbXBsZXRpb24oQ29tcFRva2VuLCBJLT5UeXBlZFRleHQsIEktPk1hdGNoZXJEZWNsKTsKKyAgfQorfQorCiAvLy8gXGJyaWVmIFBhcnNlIGFuIDxFeHByZXNzc2lvbj4KIGJvb2wgUGFyc2VyOjpwYXJzZUV4cHJlc3Npb25JbXBsKFZhcmlhbnRWYWx1ZSAqVmFsdWUpIHsKICAgc3dpdGNoIChUb2tlbml6ZXItPm5leHRUb2tlbktpbmQoKSkgewpAQCAtMzI5LDYgKzQyNywxMCBAQAogICBjYXNlIFRva2VuSW5mbzo6VEtfSWRlbnQ6CiAgICAgcmV0dXJuIHBhcnNlTWF0Y2hlckV4cHJlc3Npb25JbXBsKFZhbHVlKTsKIAorICBjYXNlIFRva2VuSW5mbzo6VEtfQ29kZUNvbXBsZXRpb246CisgICAgYWRkRXhwcmVzc2lvbkNvbXBsZXRpb25zKCk7CisgICAgcmV0dXJuIGZhbHNlOworCiAgIGNhc2UgVG9rZW5JbmZvOjpUS19Fb2Y6CiAgICAgRXJyb3ItPmFkZEVycm9yKFRva2VuaXplci0+Y29uc3VtZU5leHRUb2tlbigpLlJhbmdlLAogICAgICAgICAgICAgICAgICAgICBFcnJvci0+RVRfUGFyc2VyTm9Db2RlKTsKQEAgLTM1OCwxNiArNDYwLDIxIEBACiBjbGFzcyBSZWdpc3RyeVNlbWEgOiBwdWJsaWMgUGFyc2VyOjpTZW1hIHsKIHB1YmxpYzoKICAgdmlydHVhbCB+UmVnaXN0cnlTZW1hKCkge30KLSAgVmFyaWFudE1hdGNoZXIgYWN0T25NYXRjaGVyRXhwcmVzc2lvbihTdHJpbmdSZWYgTWF0Y2hlck5hbWUsCisgIGxsdm06Ok9wdGlvbmFsPE1hdGNoZXJDdG9yPiBsb29rdXBNYXRjaGVyQ3RvcihTdHJpbmdSZWYgTWF0Y2hlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VSYW5nZSAmTmFtZVJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3MgKkVycm9yKSB7CisgICAgcmV0dXJuIFJlZ2lzdHJ5Ojpsb29rdXBNYXRjaGVyQ3RvcihNYXRjaGVyTmFtZSwgTmFtZVJhbmdlLCBFcnJvcik7CisgIH0KKyAgVmFyaWFudE1hdGNoZXIgYWN0T25NYXRjaGVyRXhwcmVzc2lvbihNYXRjaGVyQ3RvciBDdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZVJhbmdlICZOYW1lUmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEJpbmRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZXJWYWx1ZT4gQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpIHsKICAgICBpZiAoQmluZElELmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBSZWdpc3RyeTo6Y29uc3RydWN0TWF0Y2hlcihNYXRjaGVyTmFtZSwgTmFtZVJhbmdlLCBBcmdzLCBFcnJvcik7CisgICAgICByZXR1cm4gUmVnaXN0cnk6OmNvbnN0cnVjdE1hdGNoZXIoQ3RvciwgTmFtZVJhbmdlLCBBcmdzLCBFcnJvcik7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBSZWdpc3RyeTo6Y29uc3RydWN0Qm91bmRNYXRjaGVyKE1hdGNoZXJOYW1lLCBOYW1lUmFuZ2UsIEJpbmRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MsIEVycm9yKTsKKyAgICAgIHJldHVybiBSZWdpc3RyeTo6Y29uc3RydWN0Qm91bmRNYXRjaGVyKEN0b3IsIE5hbWVSYW5nZSwgQmluZElELCBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IpOwogICAgIH0KICAgfQogfTsKQEAgLTM5MCw2ICs0OTcsMTggQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0ZDo6dmVjdG9yPE1hdGNoZXJDb21wbGV0aW9uPgorUGFyc2VyOjpjb21wbGV0ZUV4cHJlc3Npb24oU3RyaW5nUmVmIENvZGUsIHVuc2lnbmVkIENvbXBsZXRpb25PZmZzZXQpIHsKKyAgRGlhZ25vc3RpY3MgRXJyb3I7CisgIENvZGVUb2tlbml6ZXIgVG9rZW5pemVyKENvZGUsICZFcnJvciwgQ29tcGxldGlvbk9mZnNldCk7CisgIFJlZ2lzdHJ5U2VtYSBTOworICBQYXJzZXIgUCgmVG9rZW5pemVyLCAmUywgJkVycm9yKTsKKyAgVmFyaWFudFZhbHVlIER1bW15OworICBQLnBhcnNlRXhwcmVzc2lvbkltcGwoJkR1bW15KTsKKworICByZXR1cm4gUC5Db21wbGV0aW9uczsKK30KKwogbGx2bTo6T3B0aW9uYWw8RHluVHlwZWRNYXRjaGVyPgogUGFyc2VyOjpwYXJzZU1hdGNoZXJFeHByZXNzaW9uKFN0cmluZ1JlZiBDb2RlLCBEaWFnbm9zdGljcyAqRXJyb3IpIHsKICAgUmVnaXN0cnlTZW1hIFM7CmRpZmYgLS1naXQgYS9saWIvQVNUTWF0Y2hlcnMvRHluYW1pYy9SZWdpc3RyeS5jcHAgYi9saWIvQVNUTWF0Y2hlcnMvRHluYW1pYy9SZWdpc3RyeS5jcHAKaW5kZXggNzBlOTU2ZS4uNjA4OWI0NSAxMDA2NDQKLS0tIGEvbGliL0FTVE1hdGNoZXJzL0R5bmFtaWMvUmVnaXN0cnkuY3BwCisrKyBiL2xpYi9BU1RNYXRjaGVycy9EeW5hbWljL1JlZ2lzdHJ5LmNwcApAQCAtMTMsMjMgKzEzLDI0IEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1JlZ2lzdHJ5LmgiCi0KLSNpbmNsdWRlIDx1dGlsaXR5PgotCiAjaW5jbHVkZSAiTWFyc2hhbGxlcnMuaCIKICNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVycy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK3VzaW5nIG5hbWVzcGFjZSBjbGFuZzo6YXN0X3R5cGVfdHJhaXRzOwogCiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIGFzdF9tYXRjaGVycyB7CiBuYW1lc3BhY2UgZHluYW1pYyB7CiBuYW1lc3BhY2UgewogCi11c2luZyBpbnRlcm5hbDo6TWF0Y2hlckNyZWF0ZUNhbGxiYWNrOwordXNpbmcgaW50ZXJuYWw6Ok1hdGNoZXJEZXNjcmlwdG9yOwogCi10eXBlZGVmIGxsdm06OlN0cmluZ01hcDxjb25zdCBNYXRjaGVyQ3JlYXRlQ2FsbGJhY2sgKj4gQ29uc3RydWN0b3JNYXA7Cit0eXBlZGVmIGxsdm06OlN0cmluZ01hcDxjb25zdCBNYXRjaGVyRGVzY3JpcHRvciAqPiBDb25zdHJ1Y3Rvck1hcDsKIGNsYXNzIFJlZ2lzdHJ5TWFwcyB7CiBwdWJsaWM6CiAgIFJlZ2lzdHJ5TWFwcygpOwpAQCAtMzgsMTIgKzM5LDEyIEBACiAgIGNvbnN0IENvbnN0cnVjdG9yTWFwICZjb25zdHJ1Y3RvcnMoKSBjb25zdCB7IHJldHVybiBDb25zdHJ1Y3RvcnM7IH0KIAogcHJpdmF0ZToKLSAgdm9pZCByZWdpc3Rlck1hdGNoZXIoU3RyaW5nUmVmIE1hdGNoZXJOYW1lLCBNYXRjaGVyQ3JlYXRlQ2FsbGJhY2sgKkNhbGxiYWNrKTsKKyAgdm9pZCByZWdpc3Rlck1hdGNoZXIoU3RyaW5nUmVmIE1hdGNoZXJOYW1lLCBNYXRjaGVyRGVzY3JpcHRvciAqQ2FsbGJhY2spOwogICBDb25zdHJ1Y3Rvck1hcCBDb25zdHJ1Y3RvcnM7CiB9OwogCiB2b2lkIFJlZ2lzdHJ5TWFwczo6cmVnaXN0ZXJNYXRjaGVyKFN0cmluZ1JlZiBNYXRjaGVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hlckNyZWF0ZUNhbGxiYWNrICpDYWxsYmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyRGVzY3JpcHRvciAqQ2FsbGJhY2spIHsKICAgYXNzZXJ0KENvbnN0cnVjdG9ycy5maW5kKE1hdGNoZXJOYW1lKSA9PSBDb25zdHJ1Y3RvcnMuZW5kKCkpOwogICBDb25zdHJ1Y3RvcnNbTWF0Y2hlck5hbWVdID0gQ2FsbGJhY2s7CiB9CkBAIC01OCwxNCArNTksMTQgQEAKIAogI2RlZmluZSBSRUdJU1RFUl9PVkVSTE9BREVEXzIobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTWF0Y2hlckNyZWF0ZUNhbGxiYWNrICpDYWxsYmFja3NbXSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1hdGNoZXJEZXNjcmlwdG9yICpDYWxsYmFja3NbXSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGludGVybmFsOjptYWtlTWF0Y2hlckF1dG9NYXJzaGFsbChTUEVDSUZJQ19NQVRDSEVSX09WRVJMT0FEKG5hbWUsIDApLCAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI25hbWUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgaW50ZXJuYWw6Om1ha2VNYXRjaGVyQXV0b01hcnNoYWxsKFNQRUNJRklDX01BVENIRVJfT1ZFUkxPQUQobmFtZSwgMSksICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHJlZ2lzdGVyTWF0Y2hlcigjbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgbmV3IGludGVybmFsOjpPdmVybG9hZGVkTWF0Y2hlckNyZWF0ZUNhbGxiYWNrKENhbGxiYWNrcykpOyBcCisgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRlcm5hbDo6T3ZlcmxvYWRlZE1hdGNoZXJEZXNjcmlwdG9yKENhbGxiYWNrcykpOyAgICAgXAogICB9IHdoaWxlICgwKQogCiAvLy8gXGJyaWVmIEdlbmVyYXRlIGEgcmVnaXN0cnkgbWFwIHdpdGggYWxsIHRoZSBrbm93biBtYXRjaGVycy4KQEAgLTc2LDExICs3Nyw5IEBACiAgIC8vIG9mS2luZAogICAvLwogICAvLyBQb2x5bW9ycGhpYyArIGFyZ3VtZW50IG92ZXJsb2FkOgotICAvLyB1bmxlc3MKICAgLy8gZmluZEFsbAogICAvLwogICAvLyBPdGhlcjoKLSAgLy8gbG9jCiAgIC8vIGVxdWFscwogICAvLyBlcXVhbHNOb2RlCiAKQEAgLTg5LDYgKzg4LDcgQEAKICAgUkVHSVNURVJfT1ZFUkxPQURFRF8yKGhhc1R5cGUpOwogICBSRUdJU1RFUl9PVkVSTE9BREVEXzIoaXNEZXJpdmVkRnJvbSk7CiAgIFJFR0lTVEVSX09WRVJMT0FERURfMihpc1NhbWVPckRlcml2ZWRGcm9tKTsKKyAgUkVHSVNURVJfT1ZFUkxPQURFRF8yKGxvYyk7CiAgIFJFR0lTVEVSX09WRVJMT0FERURfMihwb2ludHNUbyk7CiAgIFJFR0lTVEVSX09WRVJMT0FERURfMihyZWZlcmVuY2VzKTsKICAgUkVHSVNURVJfT1ZFUkxPQURFRF8yKHRoaXNQb2ludGVyVHlwZSk7CkBAIC0xMTMsNiArMTEzLDcgQEAKICAgUkVHSVNURVJfTUFUQ0hFUihidWlsdGluVHlwZSk7CiAgIFJFR0lTVEVSX01BVENIRVIoY1N0eWxlQ2FzdEV4cHIpOwogICBSRUdJU1RFUl9NQVRDSEVSKGNhbGxFeHByKTsKKyAgUkVHSVNURVJfTUFUQ0hFUihjYXNlU3RtdCk7CiAgIFJFR0lTVEVSX01BVENIRVIoY2FzdEV4cHIpOwogICBSRUdJU1RFUl9NQVRDSEVSKGNhdGNoU3RtdCk7CiAgIFJFR0lTVEVSX01BVENIRVIoY2hhcmFjdGVyTGl0ZXJhbCk7CkBAIC0xMzMsNyArMTM0LDkgQEAKICAgUkVHSVNURVJfTUFUQ0hFUihkZWNsQ291bnRJcyk7CiAgIFJFR0lTVEVSX01BVENIRVIoZGVjbFJlZkV4cHIpOwogICBSRUdJU1RFUl9NQVRDSEVSKGRlY2xTdG10KTsKKyAgUkVHSVNURVJfTUFUQ0hFUihkZWNsYXJhdG9yRGVjbCk7CiAgIFJFR0lTVEVSX01BVENIRVIoZGVmYXVsdEFyZ0V4cHIpOworICBSRUdJU1RFUl9NQVRDSEVSKGRlZmF1bHRTdG10KTsKICAgUkVHSVNURVJfTUFUQ0hFUihkZWxldGVFeHByKTsKICAgUkVHSVNURVJfTUFUQ0hFUihkZXBlbmRlbnRTaXplZEFycmF5VHlwZSk7CiAgIFJFR0lTVEVSX01BVENIRVIoZGVzdHJ1Y3RvckRlY2wpOwpAQCAtMTQzLDE1ICsxNDYsMjAgQEAKICAgUkVHSVNURVJfTUFUQ0hFUihlbGFib3JhdGVkVHlwZSk7CiAgIFJFR0lTVEVSX01BVENIRVIoZW51bUNvbnN0YW50RGVjbCk7CiAgIFJFR0lTVEVSX01BVENIRVIoZW51bURlY2wpOworICBSRUdJU1RFUl9NQVRDSEVSKGVxdWFsc0JvdW5kTm9kZSk7CiAgIFJFR0lTVEVSX01BVENIRVIoZXhwbGljaXRDYXN0RXhwcik7CiAgIFJFR0lTVEVSX01BVENIRVIoZXhwcik7CisgIFJFR0lTVEVSX01BVENIRVIoZXhwcldpdGhDbGVhbnVwcyk7CiAgIFJFR0lTVEVSX01BVENIRVIoZmllbGREZWNsKTsKICAgUkVHSVNURVJfTUFUQ0hFUihmbG9hdExpdGVyYWwpOwogICBSRUdJU1RFUl9NQVRDSEVSKGZvckVhY2gpOworICBSRUdJU1RFUl9NQVRDSEVSKGZvckVhY2hDb25zdHJ1Y3RvckluaXRpYWxpemVyKTsKICAgUkVHSVNURVJfTUFUQ0hFUihmb3JFYWNoRGVzY2VuZGFudCk7CisgIFJFR0lTVEVSX01BVENIRVIoZm9yRWFjaFN3aXRjaENhc2UpOwogICBSRUdJU1RFUl9NQVRDSEVSKGZvckZpZWxkKTsKICAgUkVHSVNURVJfTUFUQ0hFUihmb3JSYW5nZVN0bXQpOwogICBSRUdJU1RFUl9NQVRDSEVSKGZvclN0bXQpOworICBSRUdJU1RFUl9NQVRDSEVSKGZyaWVuZERlY2wpOwogICBSRUdJU1RFUl9NQVRDSEVSKGZ1bmN0aW9uRGVjbCk7CiAgIFJFR0lTVEVSX01BVENIRVIoZnVuY3Rpb25UZW1wbGF0ZURlY2wpOwogICBSRUdJU1RFUl9NQVRDSEVSKGZ1bmN0aW9uVHlwZSk7CkBAIC0xNzAsNiArMTc4LDcgQEAKICAgUkVHSVNURVJfTUFUQ0hFUihoYXNCYXNlKTsKICAgUkVHSVNURVJfTUFUQ0hFUihoYXNCb2R5KTsKICAgUkVHSVNURVJfTUFUQ0hFUihoYXNDYW5vbmljYWxUeXBlKTsKKyAgUkVHSVNURVJfTUFUQ0hFUihoYXNDYXNlQ29uc3RhbnQpOwogICBSRUdJU1RFUl9NQVRDSEVSKGhhc0NvbmRpdGlvbik7CiAgIFJFR0lTVEVSX01BVENIRVIoaGFzQ29uZGl0aW9uVmFyaWFibGVTdGF0ZW1lbnQpOwogICBSRUdJU1RFUl9NQVRDSEVSKGhhc0RlY2xDb250ZXh0KTsKQEAgLTIwMyw2ICsyMTIsNyBAQAogICBSRUdJU1RFUl9NQVRDSEVSKGhhc1RhcmdldERlY2wpOwogICBSRUdJU1RFUl9NQVRDSEVSKGhhc1RlbXBsYXRlQXJndW1lbnQpOwogICBSRUdJU1RFUl9NQVRDSEVSKGhhc1RydWVFeHByZXNzaW9uKTsKKyAgUkVHSVNURVJfTUFUQ0hFUihoYXNUeXBlTG9jKTsKICAgUkVHSVNURVJfTUFUQ0hFUihoYXNVbmFyeU9wZXJhbmQpOwogICBSRUdJU1RFUl9NQVRDSEVSKGhhc1ZhbHVlVHlwZSk7CiAgIFJFR0lTVEVSX01BVENIRVIoaWZTdG10KTsKQEAgLTIxNSwxMiArMjI1LDE1IEBACiAgIFJFR0lTVEVSX01BVENIRVIoaW5uZXJUeXBlKTsKICAgUkVHSVNURVJfTUFUQ0hFUihpbnRlZ2VyTGl0ZXJhbCk7CiAgIFJFR0lTVEVSX01BVENIRVIoaXNBcnJvdyk7CisgIFJFR0lTVEVSX01BVENIRVIoaXNDb25zdCk7CiAgIFJFR0lTVEVSX01BVENIRVIoaXNDb25zdFF1YWxpZmllZCk7CiAgIFJFR0lTVEVSX01BVENIRVIoaXNEZWZpbml0aW9uKTsKICAgUkVHSVNURVJfTUFUQ0hFUihpc0V4cGxpY2l0VGVtcGxhdGVTcGVjaWFsaXphdGlvbik7CisgIFJFR0lTVEVSX01BVENIRVIoaXNFeHByKTsKICAgUkVHSVNURVJfTUFUQ0hFUihpc0V4dGVybkMpOwogICBSRUdJU1RFUl9NQVRDSEVSKGlzSW1wbGljaXQpOwogICBSRUdJU1RFUl9NQVRDSEVSKGlzSW50ZWdlcik7CisgIFJFR0lTVEVSX01BVENIRVIoaXNMaXN0SW5pdGlhbGl6YXRpb24pOwogICBSRUdJU1RFUl9NQVRDSEVSKGlzT3ZlcnJpZGUpOwogICBSRUdJU1RFUl9NQVRDSEVSKGlzUHJpdmF0ZSk7CiAgIFJFR0lTVEVSX01BVENIRVIoaXNQcm90ZWN0ZWQpOwpAQCAtMjUyLDYgKzI2NSw3IEBACiAgIFJFR0lTVEVSX01BVENIRVIob3BlcmF0b3JDYWxsRXhwcik7CiAgIFJFR0lTVEVSX01BVENIRVIocGFyYW1ldGVyQ291bnRJcyk7CiAgIFJFR0lTVEVSX01BVENIRVIocGFyZW5UeXBlKTsKKyAgUkVHSVNURVJfTUFUQ0hFUihwYXJtVmFyRGVjbCk7CiAgIFJFR0lTVEVSX01BVENIRVIocG9pbnRlZSk7CiAgIFJFR0lTVEVSX01BVENIRVIocG9pbnRlclR5cGUpOwogICBSRUdJU1RFUl9NQVRDSEVSKHF1YWxUeXBlKTsKQEAgLTI3NSw2ICsyODksNyBAQAogICBSRUdJU1RFUl9NQVRDSEVSKHN3aXRjaENhc2UpOwogICBSRUdJU1RFUl9NQVRDSEVSKHN3aXRjaFN0bXQpOwogICBSRUdJU1RFUl9NQVRDSEVSKHRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlKTsKKyAgUkVHSVNURVJfTUFUQ0hFUih0ZW1wb3JhcnlPYmplY3RFeHByKTsKICAgUkVHSVNURVJfTUFUQ0hFUih0aGlzRXhwcik7CiAgIFJFR0lTVEVSX01BVENIRVIodGhyb3VnaFVzaW5nRGVjbCk7CiAgIFJFR0lTVEVSX01BVENIRVIodGhyb3dFeHByKTsKQEAgLTI4NSw2ICszMDAsMTAgQEAKICAgUkVHSVNURVJfTUFUQ0hFUih0eXBlZGVmVHlwZSk7CiAgIFJFR0lTVEVSX01BVENIRVIodW5hcnlFeHByT3JUeXBlVHJhaXRFeHByKTsKICAgUkVHSVNURVJfTUFUQ0hFUih1bmFyeU9wZXJhdG9yKTsKKyAgUkVHSVNURVJfTUFUQ0hFUih1bmFyeVRyYW5zZm9ybVR5cGUpOworICBSRUdJU1RFUl9NQVRDSEVSKHVubGVzcyk7CisgIFJFR0lTVEVSX01BVENIRVIodW5yZXNvbHZlZENvbnN0cnVjdEV4cHIpOworICBSRUdJU1RFUl9NQVRDSEVSKHVucmVzb2x2ZWRVc2luZ1ZhbHVlRGVjbCk7CiAgIFJFR0lTVEVSX01BVENIRVIodXNlckRlZmluZWRMaXRlcmFsKTsKICAgUkVHSVNURVJfTUFUQ0hFUih1c2luZ0RlY2wpOwogICBSRUdJU1RFUl9NQVRDSEVSKHZhckRlY2wpOwpAQCAtMzA2LDI3ICszMjUsMTgwIEBACiB9IC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogLy8gc3RhdGljCi1WYXJpYW50TWF0Y2hlciBSZWdpc3RyeTo6Y29uc3RydWN0TWF0Y2hlcihTdHJpbmdSZWYgTWF0Y2hlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VSYW5nZSAmTmFtZVJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VyVmFsdWU+IEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpIHsKK2xsdm06Ok9wdGlvbmFsPE1hdGNoZXJDdG9yPgorUmVnaXN0cnk6Omxvb2t1cE1hdGNoZXJDdG9yKFN0cmluZ1JlZiBNYXRjaGVyTmFtZSwgY29uc3QgU291cmNlUmFuZ2UgJk5hbWVSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IpIHsKICAgQ29uc3RydWN0b3JNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KICAgICAgIFJlZ2lzdHJ5RGF0YS0+Y29uc3RydWN0b3JzKCkuZmluZChNYXRjaGVyTmFtZSk7CiAgIGlmIChpdCA9PSBSZWdpc3RyeURhdGEtPmNvbnN0cnVjdG9ycygpLmVuZCgpKSB7CiAgICAgRXJyb3ItPmFkZEVycm9yKE5hbWVSYW5nZSwgRXJyb3ItPkVUX1JlZ2lzdHJ5Tm90Rm91bmQpIDw8IE1hdGNoZXJOYW1lOwotICAgIHJldHVybiBWYXJpYW50TWF0Y2hlcigpOworICAgIHJldHVybiBsbHZtOjpPcHRpb25hbDxNYXRjaGVyQ3Rvcj4oKTsKICAgfQogCi0gIHJldHVybiBpdC0+c2Vjb25kLT5ydW4oTmFtZVJhbmdlLCBBcmdzLCBFcnJvcik7CisgIHJldHVybiBpdC0+c2Vjb25kOworfQorCituYW1lc3BhY2UgeworCitsbHZtOjpyYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChsbHZtOjpyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxBU1ROb2RlS2luZD4gJktTKSB7CisgIHVuc2lnbmVkIENvdW50ID0gMDsKKyAgZm9yIChzdGQ6OnNldDxBU1ROb2RlS2luZD46OmNvbnN0X2l0ZXJhdG9yIEkgPSBLUy5iZWdpbigpLCBFID0gS1MuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSSAhPSBLUy5iZWdpbigpKQorICAgICAgT1MgPDwgInwiOworICAgIGlmIChDb3VudCsrID09IDMpIHsKKyAgICAgIE9TIDw8ICIuLi4iOworICAgICAgYnJlYWs7CisgICAgfQorICAgIE9TIDw8ICpJOworICB9CisgIHJldHVybiBPUzsKK30KKworc3RydWN0IFJldmVyc2VTcGVjaWZpY2l0eVRoZW5OYW1lIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6cGFpcjx1bnNpZ25lZCwgc3RkOjpzdHJpbmc+ICZBLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPHVuc2lnbmVkLCBzdGQ6OnN0cmluZz4gJkIpIGNvbnN0IHsKKyAgICByZXR1cm4gQS5maXJzdCA+IEIuZmlyc3QgfHwgKEEuZmlyc3QgPT0gQi5maXJzdCAmJiBBLnNlY29uZCA8IEIuc2Vjb25kKTsKKyAgfQorfTsKKworfQorCitzdGQ6OnZlY3RvcjxNYXRjaGVyQ29tcGxldGlvbj4gUmVnaXN0cnk6OmdldENvbXBsZXRpb25zKAorICAgIGxsdm06OkFycmF5UmVmPHN0ZDo6cGFpcjxNYXRjaGVyQ3RvciwgdW5zaWduZWQ+ID4gQ29udGV4dCkgeworICBBU1ROb2RlS2luZCBJbml0aWFsVHlwZXNbXSA9IHsKKyAgICBBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPERlY2w+KCksCisgICAgQVNUTm9kZUtpbmQ6OmdldEZyb21Ob2RlS2luZDxRdWFsVHlwZT4oKSwKKyAgICBBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPFR5cGU+KCksCisgICAgQVNUTm9kZUtpbmQ6OmdldEZyb21Ob2RlS2luZDxTdG10PigpLAorICAgIEFTVE5vZGVLaW5kOjpnZXRGcm9tTm9kZUtpbmQ8TmVzdGVkTmFtZVNwZWNpZmllcj4oKSwKKyAgICBBU1ROb2RlS2luZDo6Z2V0RnJvbU5vZGVLaW5kPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+KCksCisgICAgQVNUTm9kZUtpbmQ6OmdldEZyb21Ob2RlS2luZDxUeXBlTG9jPigpCisgIH07CisgIGxsdm06OkFycmF5UmVmPEFTVE5vZGVLaW5kPiBJbml0aWFsVHlwZXNSZWYoSW5pdGlhbFR5cGVzKTsKKworICAvLyBTdGFydGluZyB3aXRoIHRoZSBhYm92ZSBzZWVkIG9mIGFjY2VwdGFibGUgdG9wLWxldmVsIG1hdGNoZXIgdHlwZXMsIGNvbXB1dGUKKyAgLy8gdGhlIGFjY2VwdGFibGUgdHlwZSBzZXQgZm9yIHRoZSBhcmd1bWVudCBpbmRpY2F0ZWQgYnkgZWFjaCBjb250ZXh0IGVsZW1lbnQuCisgIHN0ZDo6c2V0PEFTVE5vZGVLaW5kPiBUeXBlU2V0KEluaXRpYWxUeXBlc1JlZi5iZWdpbigpLCBJbml0aWFsVHlwZXNSZWYuZW5kKCkpOworICBmb3IgKGxsdm06OkFycmF5UmVmPHN0ZDo6cGFpcjxNYXRjaGVyQ3RvciwgdW5zaWduZWQ+ID46Oml0ZXJhdG9yCisgICAgICAgICAgIEN0eEkgPSBDb250ZXh0LmJlZ2luKCksCisgICAgICAgICAgIEN0eEUgPSBDb250ZXh0LmVuZCgpOworICAgICAgIEN0eEkgIT0gQ3R4RTsgKytDdHhJKSB7CisgICAgc3RkOjp2ZWN0b3I8aW50ZXJuYWw6OkFyZ0tpbmQ+IE5leHRUeXBlU2V0OworICAgIGZvciAoc3RkOjpzZXQ8QVNUTm9kZUtpbmQ+OjppdGVyYXRvciBJID0gVHlwZVNldC5iZWdpbigpLCBFID0gVHlwZVNldC5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoQ3R4SS0+Zmlyc3QtPmlzQ29udmVydGlibGVUbygqSSkgJiYKKyAgICAgICAgICAoQ3R4SS0+Zmlyc3QtPmlzVmFyaWFkaWMoKSB8fAorICAgICAgICAgICBDdHhJLT5zZWNvbmQgPCBDdHhJLT5maXJzdC0+Z2V0TnVtQXJncygpKSkKKyAgICAgICAgQ3R4SS0+Zmlyc3QtPmdldEFyZ0tpbmRzKCpJLCBDdHhJLT5zZWNvbmQsIE5leHRUeXBlU2V0KTsKKyAgICB9CisgICAgVHlwZVNldC5jbGVhcigpOworICAgIGZvciAoc3RkOjp2ZWN0b3I8aW50ZXJuYWw6OkFyZ0tpbmQ+OjppdGVyYXRvciBJID0gTmV4dFR5cGVTZXQuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IE5leHRUeXBlU2V0LmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChJLT5nZXRBcmdLaW5kKCkgPT0gaW50ZXJuYWw6OkFyZ0tpbmQ6OkFLX01hdGNoZXIpCisgICAgICAgIFR5cGVTZXQuaW5zZXJ0KEktPmdldE1hdGNoZXJLaW5kKCkpOworICAgIH0KKyAgfQorCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpwYWlyPHVuc2lnbmVkLCBzdGQ6OnN0cmluZz4sIE1hdGNoZXJDb21wbGV0aW9uLAorICAgICAgICAgICAgICAgICAgIFJldmVyc2VTcGVjaWZpY2l0eVRoZW5OYW1lPiBDb21wbGV0aW9uc1R5OworICBDb21wbGV0aW9uc1R5IENvbXBsZXRpb25zOworCisgIC8vIFR5cGVTZXQgbm93IGNvbnRhaW5zIHRoZSBsaXN0IG9mIGFjY2VwdGFibGUgdHlwZXMgZm9yIHRoZSBhcmd1bWVudCB3ZSBhcmUKKyAgLy8gY29tcGxldGluZy4gIFNlYXJjaCB0aGUgcmVnaXN0cnkgZm9yIGFjY2VwdGFibGUgbWF0Y2hlcnMuCisgIGZvciAoQ29uc3RydWN0b3JNYXA6OmNvbnN0X2l0ZXJhdG9yIEkgPSBSZWdpc3RyeURhdGEtPmNvbnN0cnVjdG9ycygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBSZWdpc3RyeURhdGEtPmNvbnN0cnVjdG9ycygpLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgc3RkOjpzZXQ8QVNUTm9kZUtpbmQ+IFJldEtpbmRzOworICAgIHVuc2lnbmVkIE51bUFyZ3MgPSBJLT5zZWNvbmQtPmlzVmFyaWFkaWMoKSA/IDEgOiBJLT5zZWNvbmQtPmdldE51bUFyZ3MoKTsKKyAgICBib29sIElzUG9seW1vcnBoaWMgPSBJLT5zZWNvbmQtPmlzUG9seW1vcnBoaWMoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnRlcm5hbDo6QXJnS2luZD4gPiBBcmdzS2luZHMoTnVtQXJncyk7CisgICAgdW5zaWduZWQgTWF4U3BlY2lmaWNpdHkgPSAwOworICAgIGZvciAoc3RkOjpzZXQ8QVNUTm9kZUtpbmQ+OjppdGVyYXRvciBUSSA9IFR5cGVTZXQuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEUgPSBUeXBlU2V0LmVuZCgpOworICAgICAgICAgVEkgIT0gVEU7ICsrVEkpIHsKKyAgICAgIHVuc2lnbmVkIFNwZWNpZmljaXR5OworICAgICAgQVNUTm9kZUtpbmQgTGVhc3REZXJpdmVkS2luZDsKKyAgICAgIGlmIChJLT5zZWNvbmQtPmlzQ29udmVydGlibGVUbygqVEksICZTcGVjaWZpY2l0eSwgJkxlYXN0RGVyaXZlZEtpbmQpKSB7CisgICAgICAgIGlmIChNYXhTcGVjaWZpY2l0eSA8IFNwZWNpZmljaXR5KQorICAgICAgICAgIE1heFNwZWNpZmljaXR5ID0gU3BlY2lmaWNpdHk7CisgICAgICAgIFJldEtpbmRzLmluc2VydChMZWFzdERlcml2ZWRLaW5kKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBBcmcgPSAwOyBBcmcgIT0gTnVtQXJnczsgKytBcmcpCisgICAgICAgICAgSS0+c2Vjb25kLT5nZXRBcmdLaW5kcygqVEksIEFyZywgQXJnc0tpbmRzW0FyZ10pOworICAgICAgICBpZiAoSXNQb2x5bW9ycGhpYykKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIVJldEtpbmRzLmVtcHR5KCkgJiYgTWF4U3BlY2lmaWNpdHkgPiAwKSB7CisgICAgICBzdGQ6OnN0cmluZyBEZWNsOworICAgICAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIE9TKERlY2wpOworCisgICAgICBpZiAoSXNQb2x5bW9ycGhpYykgeworICAgICAgICBPUyA8PCAiTWF0Y2hlcjxUPiAiIDw8IEktPmZpcnN0KCkgPDwgIihNYXRjaGVyPFQ+IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE9TIDw8ICJNYXRjaGVyPCIgPDwgUmV0S2luZHMgPDwgIj4gIiA8PCBJLT5maXJzdCgpIDw8ICIoIjsKKyAgICAgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnRlcm5hbDo6QXJnS2luZD4gPjo6aXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgS0kgPSBBcmdzS2luZHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgS0UgPSBBcmdzS2luZHMuZW5kKCk7CisgICAgICAgICAgICAgS0kgIT0gS0U7ICsrS0kpIHsKKyAgICAgICAgICBpZiAoS0kgIT0gQXJnc0tpbmRzLmJlZ2luKCkpCisgICAgICAgICAgICBPUyA8PCAiLCAiOworICAgICAgICAgIC8vIFRoaXMgY3VycmVudGx5IGFzc3VtZXMgdGhhdCBhIG1hdGNoZXIgbWF5IG5vdCBvdmVybG9hZCBhCisgICAgICAgICAgLy8gbm9uLW1hdGNoZXIsIGFuZCBhbGwgbm9uLW1hdGNoZXIgb3ZlcmxvYWRzIGhhdmUgaWRlbnRpY2FsCisgICAgICAgICAgLy8gYXJndW1lbnRzLgorICAgICAgICAgIGlmICgoKktJKVswXS5nZXRBcmdLaW5kKCkgPT0gaW50ZXJuYWw6OkFyZ0tpbmQ6OkFLX01hdGNoZXIpIHsKKyAgICAgICAgICAgIHN0ZDo6c2V0PEFTVE5vZGVLaW5kPiBNYXRjaGVyS2luZHM7CisgICAgICAgICAgICBzdGQ6OnRyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICBLSS0+YmVnaW4oKSwgS0ktPmVuZCgpLAorICAgICAgICAgICAgICAgIHN0ZDo6aW5zZXJ0ZXIoTWF0Y2hlcktpbmRzLCBNYXRjaGVyS2luZHMuZW5kKCkpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWVtX2Z1bl9yZWYoJmludGVybmFsOjpBcmdLaW5kOjpnZXRNYXRjaGVyS2luZCkpOworICAgICAgICAgICAgT1MgPDwgIk1hdGNoZXI8IiA8PCBNYXRjaGVyS2luZHMgPDwgIj4iOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPUyA8PCAoKktJKVswXS5hc1N0cmluZygpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKEktPnNlY29uZC0+aXNWYXJpYWRpYygpKQorICAgICAgICBPUyA8PCAiLi4uIjsKKyAgICAgIE9TIDw8ICIpIjsKKworICAgICAgc3RkOjpzdHJpbmcgVHlwZWRUZXh0ID0gSS0+Zmlyc3QoKTsKKyAgICAgIFR5cGVkVGV4dCArPSAiKCI7CisgICAgICBpZiAoQXJnc0tpbmRzLmVtcHR5KCkpCisgICAgICAgIFR5cGVkVGV4dCArPSAiKSI7CisgICAgICBlbHNlIGlmIChBcmdzS2luZHNbMF1bMF0uZ2V0QXJnS2luZCgpID09IGludGVybmFsOjpBcmdLaW5kOjpBS19TdHJpbmcpCisgICAgICAgIFR5cGVkVGV4dCArPSAiXCIiOworCisgICAgICBDb21wbGV0aW9uc1tzdGQ6Om1ha2VfcGFpcihNYXhTcGVjaWZpY2l0eSwgSS0+Zmlyc3QoKSldID0KKyAgICAgICAgICBNYXRjaGVyQ29tcGxldGlvbihUeXBlZFRleHQsIE9TLnN0cigpKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnZlY3RvcjxNYXRjaGVyQ29tcGxldGlvbj4gUmV0VmFsOworICBmb3IgKENvbXBsZXRpb25zVHk6Oml0ZXJhdG9yIEkgPSBDb21wbGV0aW9ucy5iZWdpbigpLCBFID0gQ29tcGxldGlvbnMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgUmV0VmFsLnB1c2hfYmFjayhJLT5zZWNvbmQpOworICByZXR1cm4gUmV0VmFsOwogfQogCiAvLyBzdGF0aWMKLVZhcmlhbnRNYXRjaGVyIFJlZ2lzdHJ5Ojpjb25zdHJ1Y3RCb3VuZE1hdGNoZXIoU3RyaW5nUmVmIE1hdGNoZXJOYW1lLAorVmFyaWFudE1hdGNoZXIgUmVnaXN0cnk6OmNvbnN0cnVjdE1hdGNoZXIoTWF0Y2hlckN0b3IgQ3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZVJhbmdlICZOYW1lUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQYXJzZXJWYWx1ZT4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzICpFcnJvcikgeworICByZXR1cm4gQ3Rvci0+Y3JlYXRlKE5hbWVSYW5nZSwgQXJncywgRXJyb3IpOworfQorCisvLyBzdGF0aWMKK1ZhcmlhbnRNYXRjaGVyIFJlZ2lzdHJ5Ojpjb25zdHJ1Y3RCb3VuZE1hdGNoZXIoTWF0Y2hlckN0b3IgQ3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlUmFuZ2UgJk5hbWVSYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEJpbmRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VyVmFsdWU+IEFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzICpFcnJvcikgewotICBWYXJpYW50TWF0Y2hlciBPdXQgPSBjb25zdHJ1Y3RNYXRjaGVyKE1hdGNoZXJOYW1lLCBOYW1lUmFuZ2UsIEFyZ3MsIEVycm9yKTsKKyAgVmFyaWFudE1hdGNoZXIgT3V0ID0gY29uc3RydWN0TWF0Y2hlcihDdG9yLCBOYW1lUmFuZ2UsIEFyZ3MsIEVycm9yKTsKICAgaWYgKE91dC5pc051bGwoKSkgcmV0dXJuIE91dDsKIAogICBsbHZtOjpPcHRpb25hbDxEeW5UeXBlZE1hdGNoZXI+IFJlc3VsdCA9IE91dC5nZXRTaW5nbGVNYXRjaGVyKCk7CmRpZmYgLS1naXQgYS9saWIvQVNUTWF0Y2hlcnMvRHluYW1pYy9WYXJpYW50VmFsdWUuY3BwIGIvbGliL0FTVE1hdGNoZXJzL0R5bmFtaWMvVmFyaWFudFZhbHVlLmNwcAppbmRleCAzZTQ5ZTFiLi45YzcyNjJlIDEwMDY0NAotLS0gYS9saWIvQVNUTWF0Y2hlcnMvRHluYW1pYy9WYXJpYW50VmFsdWUuY3BwCisrKyBiL2xpYi9BU1RNYXRjaGVycy9EeW5hbWljL1ZhcmlhbnRWYWx1ZS5jcHAKQEAgLTEzLDcgKzEzLDYgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1ZhcmlhbnRWYWx1ZS5oIgotCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgogCkBAIC0zOCw3ICszNyw4IEBACiAgIH0KIAogICB2aXJ0dWFsIHZvaWQgbWFrZVR5cGVkTWF0Y2hlcihNYXRjaGVyT3BzICZPcHMpIGNvbnN0IHsKLSAgICBpZiAoT3BzLmNhbkNvbnN0cnVjdEZyb20oTWF0Y2hlcikpCisgICAgYm9vbCBJZ25vcmU7CisgICAgaWYgKE9wcy5jYW5Db25zdHJ1Y3RGcm9tKE1hdGNoZXIsIElnbm9yZSkpCiAgICAgICBPcHMuY29uc3RydWN0RnJvbShNYXRjaGVyKTsKICAgfQogCkBAIC00OCw4ICs0OCw4IEBACiAKIGNsYXNzIFZhcmlhbnRNYXRjaGVyOjpQb2x5bW9ycGhpY1BheWxvYWQgOiBwdWJsaWMgVmFyaWFudE1hdGNoZXI6OlBheWxvYWQgewogcHVibGljOgotICBQb2x5bW9ycGhpY1BheWxvYWQoQXJyYXlSZWY8RHluVHlwZWRNYXRjaGVyPiBNYXRjaGVyc0luKQotICAgICAgOiBNYXRjaGVycyhNYXRjaGVyc0luKSB7fQorICBQb2x5bW9ycGhpY1BheWxvYWQoc3RkOjp2ZWN0b3I8RHluVHlwZWRNYXRjaGVyPiBNYXRjaGVyc0luKQorICAgICAgOiBNYXRjaGVycyhzdGQ6Om1vdmUoTWF0Y2hlcnNJbikpIHt9CiAKICAgdmlydHVhbCB+UG9seW1vcnBoaWNQYXlsb2FkKCkge30KIApAQCAtNzAsMTUgKzcwLDI1IEBACiAgIH0KIAogICB2aXJ0dWFsIHZvaWQgbWFrZVR5cGVkTWF0Y2hlcihNYXRjaGVyT3BzICZPcHMpIGNvbnN0IHsKKyAgICBib29sIEZvdW5kSXNFeGFjdCA9IGZhbHNlOwogICAgIGNvbnN0IER5blR5cGVkTWF0Y2hlciAqRm91bmQgPSBOVUxMOworICAgIGludCBOdW1Gb3VuZCA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBNYXRjaGVycy5zaXplKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgICBpZiAoT3BzLmNhbkNvbnN0cnVjdEZyb20oTWF0Y2hlcnNbaV0pKSB7Ci0gICAgICAgIGlmIChGb3VuZCkKLSAgICAgICAgICByZXR1cm47CisgICAgICBib29sIElzRXhhY3RNYXRjaDsKKyAgICAgIGlmIChPcHMuY2FuQ29uc3RydWN0RnJvbShNYXRjaGVyc1tpXSwgSXNFeGFjdE1hdGNoKSkgeworICAgICAgICBpZiAoRm91bmQpIHsKKyAgICAgICAgICBpZiAoRm91bmRJc0V4YWN0KSB7CisgICAgICAgICAgICBhc3NlcnQoIUlzRXhhY3RNYXRjaCAmJiAiV2Ugc2hvdWxkIG5vdCBoYXZlIHR3byBleGFjdCBtYXRjaGVzLiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIEZvdW5kID0gJk1hdGNoZXJzW2ldOworICAgICAgICBGb3VuZElzRXhhY3QgPSBJc0V4YWN0TWF0Y2g7CisgICAgICAgICsrTnVtRm91bmQ7CiAgICAgICB9CiAgICAgfQotICAgIGlmIChGb3VuZCkKKyAgICAvLyBXZSBvbmx5IHN1Y2NlZWQgaWYgd2UgZm91bmQgZXhhY3RseSBvbmUsIG9yIGlmIHdlIGZvdW5kIGFuIGV4YWN0IG1hdGNoLgorICAgIGlmIChGb3VuZCAmJiAoRm91bmRJc0V4YWN0IHx8IE51bUZvdW5kID09IDEpKQogICAgICAgT3BzLmNvbnN0cnVjdEZyb20oKkZvdW5kKTsKICAgfQogCkBAIC04OCw4ICs5OCw4IEBACiBjbGFzcyBWYXJpYW50TWF0Y2hlcjo6VmFyaWFkaWNPcFBheWxvYWQgOiBwdWJsaWMgVmFyaWFudE1hdGNoZXI6OlBheWxvYWQgewogcHVibGljOgogICBWYXJpYWRpY09wUGF5bG9hZChhc3RfbWF0Y2hlcnM6OmludGVybmFsOjpWYXJpYWRpY09wZXJhdG9yRnVuY3Rpb24gRnVuYywKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFyaWFudE1hdGNoZXI+IEFyZ3MpCi0gICAgICA6IEZ1bmMoRnVuYyksIEFyZ3MoQXJncykge30KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmFyaWFudE1hdGNoZXI+IEFyZ3MpCisgICAgICA6IEZ1bmMoRnVuYyksIEFyZ3Moc3RkOjptb3ZlKEFyZ3MpKSB7fQogCiAgIHZpcnR1YWwgbGx2bTo6T3B0aW9uYWw8RHluVHlwZWRNYXRjaGVyPiBnZXRTaW5nbGVNYXRjaGVyKCkgY29uc3QgewogICAgIHJldHVybiBsbHZtOjpPcHRpb25hbDxEeW5UeXBlZE1hdGNoZXI+KCk7CkBAIC0xMjEsMTQgKzEzMSwxNCBAQAogfQogCiBWYXJpYW50TWF0Y2hlcgotVmFyaWFudE1hdGNoZXI6OlBvbHltb3JwaGljTWF0Y2hlcihBcnJheVJlZjxEeW5UeXBlZE1hdGNoZXI+IE1hdGNoZXJzKSB7Ci0gIHJldHVybiBWYXJpYW50TWF0Y2hlcihuZXcgUG9seW1vcnBoaWNQYXlsb2FkKE1hdGNoZXJzKSk7CitWYXJpYW50TWF0Y2hlcjo6UG9seW1vcnBoaWNNYXRjaGVyKHN0ZDo6dmVjdG9yPER5blR5cGVkTWF0Y2hlcj4gTWF0Y2hlcnMpIHsKKyAgcmV0dXJuIFZhcmlhbnRNYXRjaGVyKG5ldyBQb2x5bW9ycGhpY1BheWxvYWQoc3RkOjptb3ZlKE1hdGNoZXJzKSkpOwogfQogCiBWYXJpYW50TWF0Y2hlciBWYXJpYW50TWF0Y2hlcjo6VmFyaWFkaWNPcGVyYXRvck1hdGNoZXIoCiAgICAgYXN0X21hdGNoZXJzOjppbnRlcm5hbDo6VmFyaWFkaWNPcGVyYXRvckZ1bmN0aW9uIEZ1bmMsCi0gICAgQXJyYXlSZWY8VmFyaWFudE1hdGNoZXI+IEFyZ3MpIHsKLSAgcmV0dXJuIFZhcmlhbnRNYXRjaGVyKG5ldyBWYXJpYWRpY09wUGF5bG9hZChGdW5jLCBBcmdzKSk7CisgICAgc3RkOjp2ZWN0b3I8VmFyaWFudE1hdGNoZXI+IEFyZ3MpIHsKKyAgcmV0dXJuIFZhcmlhbnRNYXRjaGVyKG5ldyBWYXJpYWRpY09wUGF5bG9hZChGdW5jLCBzdGQ6Om1vdmUoQXJncykpKTsKIH0KIAogbGx2bTo6T3B0aW9uYWw8RHluVHlwZWRNYXRjaGVyPiBWYXJpYW50TWF0Y2hlcjo6Z2V0U2luZ2xlTWF0Y2hlcigpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9BbmFseXNpc0RlY2xDb250ZXh0LmNwcCBiL2xpYi9BbmFseXNpcy9BbmFseXNpc0RlY2xDb250ZXh0LmNwcAppbmRleCA0NjVmMGMzLi5jOTBkOTQ3IDEwMDY0NAotLS0gYS9saWIvQW5hbHlzaXMvQW5hbHlzaXNEZWNsQ29udGV4dC5jcHAKKysrIGIvbGliL0FuYWx5c2lzL0FuYWx5c2lzRGVjbENvbnRleHQuY3BwCkBAIC0yOCw4ICsyOCw4IEBACiAjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvU3VwcG9ydC9CdW1wVmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TYXZlQW5kUmVzdG9yZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiAKQEAgLTY4LDcgKzY4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZEluaXRpYWxpemVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZFRlbXBvcmFyeUR0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3ludGhlc2l6ZUJvZGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZFN0YXRpY0luaXRCcmFuY2gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRTdGF0aWNJbml0QnJhbmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkQ1hYTmV3QWxsb2NhdG9yKQogICA6IFN5bnRoZXNpemVCb2RpZXMoc3ludGhlc2l6ZUJvZGllcykKIHsKICAgY2ZnQnVpbGRPcHRpb25zLlBydW5lVHJpdmlhbGx5RmFsc2VFZGdlcyA9ICF1c2VVbm9wdGltaXplZENGRzsKQEAgLTc2LDEyICs3NywxMSBAQAogICBjZmdCdWlsZE9wdGlvbnMuQWRkSW5pdGlhbGl6ZXJzID0gYWRkSW5pdGlhbGl6ZXJzOwogICBjZmdCdWlsZE9wdGlvbnMuQWRkVGVtcG9yYXJ5RHRvcnMgPSBhZGRUZW1wb3JhcnlEdG9yczsKICAgY2ZnQnVpbGRPcHRpb25zLkFkZFN0YXRpY0luaXRCcmFuY2hlcyA9IGFkZFN0YXRpY0luaXRCcmFuY2g7CisgIGNmZ0J1aWxkT3B0aW9ucy5BZGRDWFhOZXdBbGxvY2F0b3IgPSBhZGRDWFhOZXdBbGxvY2F0b3I7CiB9CiAKIHZvaWQgQW5hbHlzaXNEZWNsQ29udGV4dE1hbmFnZXI6OmNsZWFyKCkgewotICBmb3IgKENvbnRleHRNYXA6Oml0ZXJhdG9yIEkgPSBDb250ZXh0cy5iZWdpbigpLCBFID0gQ29udGV4dHMuZW5kKCk7IEkhPUU7ICsrSSkKLSAgICBkZWxldGUgSS0+c2Vjb25kOwotICBDb250ZXh0cy5jbGVhcigpOworICBsbHZtOjpEZWxldGVDb250YWluZXJTZWNvbmRzKENvbnRleHRzKTsKIH0KIAogc3RhdGljIEJvZHlGYXJtICZnZXRCb2R5RmFybShBU1RDb250ZXh0ICZDKSB7CkBAIC05NCwxNCArOTQsMjEgQEAKICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEQpKSB7CiAgICAgU3RtdCAqQm9keSA9IEZELT5nZXRCb2R5KCk7CiAgICAgaWYgKCFCb2R5ICYmIE1hbmFnZXIgJiYgTWFuYWdlci0+c3ludGhlc2l6ZUJvZGllcygpKSB7Ci0gICAgICBJc0F1dG9zeW50aGVzaXplZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZ2V0Qm9keUZhcm0oZ2V0QVNUQ29udGV4dCgpKS5nZXRCb2R5KEZEKTsKKyAgICAgIEJvZHkgPSBnZXRCb2R5RmFybShnZXRBU1RDb250ZXh0KCkpLmdldEJvZHkoRkQpOworICAgICAgaWYgKEJvZHkpCisgICAgICAgIElzQXV0b3N5bnRoZXNpemVkID0gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIEJvZHk7CiAgIH0KLSAgZWxzZSBpZiAoY29uc3QgT2JqQ01ldGhvZERlY2wgKk1EID0gZHluX2Nhc3Q8T2JqQ01ldGhvZERlY2w+KEQpKQotICAgIHJldHVybiBNRC0+Z2V0Qm9keSgpOwotICBlbHNlIGlmIChjb25zdCBCbG9ja0RlY2wgKkJEID0gZHluX2Nhc3Q8QmxvY2tEZWNsPihEKSkKKyAgZWxzZSBpZiAoY29uc3QgT2JqQ01ldGhvZERlY2wgKk1EID0gZHluX2Nhc3Q8T2JqQ01ldGhvZERlY2w+KEQpKSB7CisgICAgU3RtdCAqQm9keSA9IE1ELT5nZXRCb2R5KCk7CisgICAgaWYgKCFCb2R5ICYmIE1hbmFnZXIgJiYgTWFuYWdlci0+c3ludGhlc2l6ZUJvZGllcygpKSB7CisgICAgICBCb2R5ID0gZ2V0Qm9keUZhcm0oZ2V0QVNUQ29udGV4dCgpKS5nZXRCb2R5KE1EKTsKKyAgICAgIGlmIChCb2R5KQorICAgICAgICBJc0F1dG9zeW50aGVzaXplZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBCb2R5OworICB9IGVsc2UgaWYgKGNvbnN0IEJsb2NrRGVjbCAqQkQgPSBkeW5fY2FzdDxCbG9ja0RlY2w+KEQpKQogICAgIHJldHVybiBCRC0+Z2V0Qm9keSgpOwogICBlbHNlIGlmIChjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRnVuVG1wbAogICAgICAgICAgICA9IGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpKQpAQCAtMTI2LDkgKzEzMyw4IEBACiAgICAgcmV0dXJuIE1ELT5nZXRTZWxmRGVjbCgpOwogICBpZiAoY29uc3QgQmxvY2tEZWNsICpCRCA9IGR5bl9jYXN0PEJsb2NrRGVjbD4oRCkpIHsKICAgICAvLyBTZWUgaWYgJ3NlbGYnIHdhcyBjYXB0dXJlZCBieSB0aGUgYmxvY2suCi0gICAgZm9yIChCbG9ja0RlY2w6OmNhcHR1cmVfY29uc3RfaXRlcmF0b3IgaXQgPSBCRC0+Y2FwdHVyZV9iZWdpbigpLAotICAgICAgICAgZXQgPSBCRC0+Y2FwdHVyZV9lbmQoKTsgaXQgIT0gZXQ7ICsraXQpIHsKLSAgICAgIGNvbnN0IFZhckRlY2wgKlZEID0gaXQtPmdldFZhcmlhYmxlKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogQkQtPmNhcHR1cmVzKCkpIHsKKyAgICAgIGNvbnN0IFZhckRlY2wgKlZEID0gSS5nZXRWYXJpYWJsZSgpOwogICAgICAgaWYgKFZELT5nZXROYW1lKCkgPT0gInNlbGYiKQogICAgICAgICByZXR1cm4gZHluX2Nhc3Q8SW1wbGljaXRQYXJhbURlY2w+KFZEKTsKICAgICB9ICAgIApAQCAtMjM1LDEwICsyNDEsOCBAQAogICBpZiAoIVBNKSB7CiAgICAgUE0ucmVzZXQobmV3IFBhcmVudE1hcChnZXRCb2R5KCkpKTsKICAgICBpZiAoY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpDID0gZHluX2Nhc3Q8Q1hYQ29uc3RydWN0b3JEZWNsPihnZXREZWNsKCkpKSB7Ci0gICAgICBmb3IgKENYWENvbnN0cnVjdG9yRGVjbDo6aW5pdF9jb25zdF9pdGVyYXRvciBJID0gQy0+aW5pdF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IEMtPmluaXRfZW5kKCk7Ci0gICAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgICAgIFBNLT5hZGRTdG10KCgqSSktPmdldEluaXQoKSk7CisgICAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBDLT5pbml0cygpKSB7CisgICAgICAgIFBNLT5hZGRTdG10KEktPmdldEluaXQoKSk7CiAgICAgICB9CiAgICAgfQogICAgIGlmIChidWlsdENGRykKQEAgLTQzNSw3ICs0MzksNyBAQAogICB9CiB9CiAKLXZvaWQgTG9jYXRpb25Db250ZXh0OjpkdW1wU3RhY2soKSBjb25zdCB7CitMTFZNX0RVTVBfTUVUSE9EIHZvaWQgTG9jYXRpb25Db250ZXh0OjpkdW1wU3RhY2soKSBjb25zdCB7CiAgIGR1bXBTdGFjayhsbHZtOjplcnJzKCkpOwogfQogCkBAIC00NTQsMTEgKzQ1OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVtcFZlY3RvckNvbnRleHQgJmJjKQogICA6IEJFVmFscyhiZXZhbHMpLCBCQyhiYykge30KIAotICBib29sIElzVHJhY2tlZERlY2woY29uc3QgVmFyRGVjbCAqVkQpIHsKLSAgICBjb25zdCBEZWNsQ29udGV4dCAqREMgPSBWRC0+Z2V0RGVjbENvbnRleHQoKTsKLSAgICByZXR1cm4gSWdub3JlZENvbnRleHRzLmNvdW50KERDKSA9PSAwOwotICB9Ci0KICAgdm9pZCBWaXNpdFN0bXQoU3RtdCAqUykgewogICAgIGZvciAoU3RtdDo6Y2hpbGRfcmFuZ2UgSSA9IFMtPmNoaWxkcmVuKCk7IEk7ICsrSSkKICAgICAgIGlmIChTdG10ICpjaGlsZCA9ICpJKQpAQCAtNTA2LDkgKzUwNSw4IEBACiAgIG5ldyAoQlYpIERlY2xWZWMoQkMsIDEwKTsKIAogICAvLyBHbyB0aHJvdWdoIHRoZSBjYXB0dXJlIGxpc3QuCi0gIGZvciAoQmxvY2tEZWNsOjpjYXB0dXJlX2NvbnN0X2l0ZXJhdG9yIENJID0gQkQtPmNhcHR1cmVfYmVnaW4oKSwKLSAgICAgICBDRSA9IEJELT5jYXB0dXJlX2VuZCgpOyBDSSAhPSBDRTsgKytDSSkgewotICAgIEJWLT5wdXNoX2JhY2soQ0ktPmdldFZhcmlhYmxlKCksIEJDKTsKKyAgZm9yIChjb25zdCBhdXRvICZDSSA6IEJELT5jYXB0dXJlcygpKSB7CisgICAgQlYtPnB1c2hfYmFjayhDSS5nZXRWYXJpYWJsZSgpLCBCQyk7CiAgIH0KIAogICAvLyBGaW5kIHRoZSByZWZlcmVuY2VkIGdsb2JhbC9zdGF0aWMgdmFyaWFibGVzLgpAQCAtNTQ4LDE1ICs1NDYsMTMgQEAKICAgLy8gUmVsZWFzZSB0aGUgbWFuYWdlZCBhbmFseXNlcy4KICAgaWYgKE1hbmFnZWRBbmFseXNlcykgewogICAgIE1hbmFnZWRBbmFseXNpc01hcCAqTSA9IChNYW5hZ2VkQW5hbHlzaXNNYXAqKSBNYW5hZ2VkQW5hbHlzZXM7Ci0gICAgZm9yIChNYW5hZ2VkQW5hbHlzaXNNYXA6Oml0ZXJhdG9yIEkgPSBNLT5iZWdpbigpLCBFID0gTS0+ZW5kKCk7IEkhPUU7ICsrSSkKLSAgICAgIGRlbGV0ZSBJLT5zZWNvbmQ7ICAKKyAgICBsbHZtOjpEZWxldGVDb250YWluZXJTZWNvbmRzKCpNKTsKICAgICBkZWxldGUgTTsKICAgfQogfQogCiBBbmFseXNpc0RlY2xDb250ZXh0TWFuYWdlcjo6fkFuYWx5c2lzRGVjbENvbnRleHRNYW5hZ2VyKCkgewotICBmb3IgKENvbnRleHRNYXA6Oml0ZXJhdG9yIEkgPSBDb250ZXh0cy5iZWdpbigpLCBFID0gQ29udGV4dHMuZW5kKCk7IEkhPUU7ICsrSSkKLSAgICBkZWxldGUgSS0+c2Vjb25kOworICBsbHZtOjpEZWxldGVDb250YWluZXJTZWNvbmRzKENvbnRleHRzKTsKIH0KIAogTG9jYXRpb25Db250ZXh0Ojp+TG9jYXRpb25Db250ZXh0KCkge30KZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9BbmRyb2lkLm1rIGIvbGliL0FuYWx5c2lzL0FuZHJvaWQubWsKaW5kZXggOGE3MzY5MC4uOGNjYmYzZSAxMDA2NDQKLS0tIGEvbGliL0FuYWx5c2lzL0FuZHJvaWQubWsKKysrIGIvbGliL0FuYWx5c2lzL0FuZHJvaWQubWsKQEAgLTgsNiArOCw3IEBACiBUQkxHRU5fVEFCTEVTIDo9IFwKICAgQXR0ckxpc3QuaW5jIFwKICAgQXR0cnMuaW5jIFwKKyAgQXR0clZpc2l0b3IuaW5jIFwKICAgQ29tbWVudENvbW1hbmRMaXN0LmluYyBcCiAgIENvbW1lbnROb2Rlcy5pbmMgXAogICBEZWNsTm9kZXMuaW5jIFwKZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9Cb2R5RmFybS5jcHAgYi9saWIvQW5hbHlzaXMvQm9keUZhcm0uY3BwCmluZGV4IDRkNWMyZWUuLjAzOTkxMWUgMTAwNjQ0Ci0tLSBhL2xpYi9BbmFseXNpcy9Cb2R5RmFybS5jcHAKKysrIGIvbGliL0FuYWx5c2lzL0JvZHlGYXJtLmNwcApAQCAtMzUsOCArMzUsNyBAQAogICAvLyByZXR1cm5zIHZvaWQuCiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpGVCA9CiAgIEJQVC0+Z2V0UG9pbnRlZVR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7Ci0gIGlmICghRlQgfHwgIUZULT5nZXRSZXN1bHRUeXBlKCktPmlzVm9pZFR5cGUoKSAgfHwKLSAgICAgIEZULT5nZXROdW1BcmdzKCkgIT0gMCkKKyAgaWYgKCFGVCB8fCAhRlQtPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHlwZSgpIHx8IEZULT5nZXROdW1QYXJhbXMoKSAhPSAwKQogICAgIHJldHVybiBmYWxzZTsKIAogICByZXR1cm4gdHJ1ZTsKQEAgLTc0LDYgKzczLDkgQEAKICAgCiAgIC8vLyBDcmVhdGUgYW4gT2JqZWN0aXZlLUMgYm9vbCBsaXRlcmFsLgogICBPYmpDQm9vbExpdGVyYWxFeHByICptYWtlT2JqQ0Jvb2woYm9vbCBWYWwpOworCisgIC8vLyBDcmVhdGUgYW4gT2JqZWN0aXZlLUMgaXZhciByZWZlcmVuY2UuCisgIE9iakNJdmFyUmVmRXhwciAqbWFrZU9iakNJdmFyUmVmKGNvbnN0IEV4cHIgKkJhc2UsIGNvbnN0IE9iakNJdmFyRGVjbCAqSVZhcik7CiAgIAogICAvLy8gQ3JlYXRlIGEgUmV0dXJuIHN0YXRlbWVudC4KICAgUmV0dXJuU3RtdCAqbWFrZVJldHVybihjb25zdCBFeHByICpSZXRWYWwpOwpAQCAtMTQ3LDYgKzE0OSwxNSBAQAogICByZXR1cm4gbmV3IChDKSBPYmpDQm9vbExpdGVyYWxFeHByKFZhbCwgVHksIFNvdXJjZUxvY2F0aW9uKCkpOwogfQogCitPYmpDSXZhclJlZkV4cHIgKkFTVE1ha2VyOjptYWtlT2JqQ0l2YXJSZWYoY29uc3QgRXhwciAqQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSXZhckRlY2wgKklWYXIpIHsKKyAgcmV0dXJuIG5ldyAoQykgT2JqQ0l2YXJSZWZFeHByKGNvbnN0X2Nhc3Q8T2JqQ0l2YXJEZWNsKj4oSVZhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVmFyLT5nZXRUeXBlKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBjb25zdF9jYXN0PEV4cHIqPihCYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYXJyb3c9Ki90cnVlLCAvKmZyZWU9Ki9mYWxzZSk7Cit9CisKKwogUmV0dXJuU3RtdCAqQVNUTWFrZXI6Om1ha2VSZXR1cm4oY29uc3QgRXhwciAqUmV0VmFsKSB7CiAgIHJldHVybiBuZXcgKEMpIFJldHVyblN0bXQoU291cmNlTG9jYXRpb24oKSwgY29uc3RfY2FzdDxFeHByKj4oUmV0VmFsKSwgMCk7CiB9CkBAIC0yNzgsOCArMjg5LDggQEAKICAgLy8gICAgcmV0dXJuIFlFUzsKICAgLy8gICB9CiAgIC8vICAgZWxzZSByZXR1cm4gTk87Ci0gIAotICBRdWFsVHlwZSBSZXN1bHRUeSA9IEQtPmdldFJlc3VsdFR5cGUoKTsKKworICBRdWFsVHlwZSBSZXN1bHRUeSA9IEQtPmdldFJldHVyblR5cGUoKTsKICAgYm9vbCBpc0Jvb2xlYW4gPSBSZXN1bHRUeS0+aXNCb29sZWFuVHlwZSgpOwogICBpZiAoIWlzQm9vbGVhbiAmJiAhUmVzdWx0VHktPmlzSW50ZWdyYWxUeXBlKEMpKQogICAgIHJldHVybiAwOwpAQCAtMzc0LDMgKzM4NSw4NyBAQAogICByZXR1cm4gVmFsLmdldFZhbHVlKCk7CiB9CiAKK3N0YXRpYyBTdG10ICpjcmVhdGVPYmpDUHJvcGVydHlHZXR0ZXIoQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICpQcm9wKSB7CisgIC8vIEZpcnN0LCBmaW5kIHRoZSBiYWNraW5nIGl2YXIuCisgIGNvbnN0IE9iakNJdmFyRGVjbCAqSVZhciA9IFByb3AtPmdldFByb3BlcnR5SXZhckRlY2woKTsKKyAgaWYgKCFJVmFyKQorICAgIHJldHVybiAwOworCisgIC8vIElnbm9yZSB3ZWFrIHZhcmlhYmxlcywgd2hpY2ggaGF2ZSBzcGVjaWFsIGJlaGF2aW9yLgorICBpZiAoUHJvcC0+Z2V0UHJvcGVydHlBdHRyaWJ1dGVzKCkgJiBPYmpDUHJvcGVydHlEZWNsOjpPQkpDX1BSX3dlYWspCisgICAgcmV0dXJuIDA7CisKKyAgLy8gTG9vayB0byBzZWUgaWYgU2VtYSBoYXMgc3ludGhlc2l6ZWQgYSBib2R5IGZvciB1cy4gVGhpcyBoYXBwZW5zIGluCisgIC8vIE9iamVjdGl2ZS1DKysgYmVjYXVzZSB0aGUgcmV0dXJuIHZhbHVlIG1heSBiZSBhIEMrKyBjbGFzcyB0eXBlIHdpdGggYQorICAvLyBub24tdHJpdmlhbCBjb3B5IGNvbnN0cnVjdG9yLiBXZSBjYW4gb25seSBkbyB0aGlzIGlmIHdlIGNhbiBmaW5kIHRoZQorICAvLyBAc3ludGhlc2l6ZSBmb3IgdGhpcyBwcm9wZXJ0eSwgdGhvdWdoIChvciBpZiB3ZSBrbm93IGl0J3MgYmVlbiBhdXRvLQorICAvLyBzeW50aGVzaXplZCkuCisgIGNvbnN0IE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKkltcGxEZWNsID0KKyAgICBJVmFyLT5nZXRDb250YWluaW5nSW50ZXJmYWNlKCktPmdldEltcGxlbWVudGF0aW9uKCk7CisgIGlmIChJbXBsRGVjbCkgeworICAgIGZvciAoY29uc3QgYXV0byAqSSA6IEltcGxEZWNsLT5wcm9wZXJ0eV9pbXBscygpKSB7CisgICAgICBpZiAoSS0+Z2V0UHJvcGVydHlEZWNsKCkgIT0gUHJvcCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmIChJLT5nZXRHZXR0ZXJDWFhDb25zdHJ1Y3RvcigpKSB7CisgICAgICAgIEFTVE1ha2VyIE0oQ3R4KTsKKyAgICAgICAgcmV0dXJuIE0ubWFrZVJldHVybihJLT5nZXRHZXR0ZXJDWFhDb25zdHJ1Y3RvcigpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgcHJvcGVydHkgaXMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaXZhciwgb3IgYQorICAvLyByZWZlcmVuY2UgdG8gaXQsIGFuZCB0aGF0IGl0IGlzIGVpdGhlciBhbiBvYmplY3QgcG9pbnRlciBvciB0cml2aWFsbHkKKyAgLy8gY29weWFibGUuCisgIGlmICghQ3R4Lmhhc1NhbWVVbnF1YWxpZmllZFR5cGUoSVZhci0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3AtPmdldFR5cGUoKS5nZXROb25SZWZlcmVuY2VUeXBlKCkpKQorICAgIHJldHVybiAwOworICBpZiAoIUlWYXItPmdldFR5cGUoKS0+aXNPYmpDTGlmZXRpbWVUeXBlKCkgJiYKKyAgICAgICFJVmFyLT5nZXRUeXBlKCkuaXNUcml2aWFsbHlDb3B5YWJsZVR5cGUoQ3R4KSkKKyAgICByZXR1cm4gMDsKKworICAvLyBHZW5lcmF0ZSBvdXIgYm9keToKKyAgLy8gICByZXR1cm4gc2VsZi0+X2l2YXI7CisgIEFTVE1ha2VyIE0oQ3R4KTsKKworICBjb25zdCBWYXJEZWNsICpzZWxmVmFyID0gUHJvcC0+Z2V0R2V0dGVyTWV0aG9kRGVjbCgpLT5nZXRTZWxmRGVjbCgpOworCisgIEV4cHIgKmxvYWRlZElWYXIgPQorICAgIE0ubWFrZU9iakNJdmFyUmVmKAorICAgICAgTS5tYWtlTHZhbHVlVG9SdmFsdWUoCisgICAgICAgIE0ubWFrZURlY2xSZWZFeHByKHNlbGZWYXIpLAorICAgICAgICBzZWxmVmFyLT5nZXRUeXBlKCkpLAorICAgICAgSVZhcik7CisKKyAgaWYgKCFQcm9wLT5nZXRUeXBlKCktPmlzUmVmZXJlbmNlVHlwZSgpKQorICAgIGxvYWRlZElWYXIgPSBNLm1ha2VMdmFsdWVUb1J2YWx1ZShsb2FkZWRJVmFyLCBJVmFyLT5nZXRUeXBlKCkpOworCisgIHJldHVybiBNLm1ha2VSZXR1cm4obG9hZGVkSVZhcik7Cit9CisKK1N0bXQgKkJvZHlGYXJtOjpnZXRCb2R5KGNvbnN0IE9iakNNZXRob2REZWNsICpEKSB7CisgIC8vIFdlIGN1cnJlbnRseSBvbmx5IGtub3cgaG93IHRvIHN5bnRoZXNpemUgcHJvcGVydHkgYWNjZXNzb3JzLgorICBpZiAoIUQtPmlzUHJvcGVydHlBY2Nlc3NvcigpKQorICAgIHJldHVybiAwOworCisgIEQgPSBELT5nZXRDYW5vbmljYWxEZWNsKCk7CisKKyAgT3B0aW9uYWw8U3RtdCAqPiAmVmFsID0gQm9kaWVzW0RdOworICBpZiAoVmFsLmhhc1ZhbHVlKCkpCisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZSgpOworICBWYWwgPSAwOworCisgIGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgKlByb3AgPSBELT5maW5kUHJvcGVydHlEZWNsKCk7CisgIGlmICghUHJvcCkKKyAgICByZXR1cm4gMDsKKworICAvLyBGb3Igbm93LCB3ZSBvbmx5IHN5bnRoZXNpemUgZ2V0dGVycy4KKyAgaWYgKEQtPnBhcmFtX3NpemUoKSAhPSAwKQorICAgIHJldHVybiAwOworCisgIFZhbCA9IGNyZWF0ZU9iakNQcm9wZXJ0eUdldHRlcihDLCBQcm9wKTsKKworICByZXR1cm4gVmFsLmdldFZhbHVlKCk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9Cb2R5RmFybS5oIGIvbGliL0FuYWx5c2lzL0JvZHlGYXJtLmgKaW5kZXggOTZmNjFkZi4uMmQyMDBmYiAxMDA2NDQKLS0tIGEvbGliL0FuYWx5c2lzL0JvZHlGYXJtLmgKKysrIGIvbGliL0FuYWx5c2lzL0JvZHlGYXJtLmgKQEAgLTI0LDYgKzI0LDggQEAKIGNsYXNzIEFTVENvbnRleHQ7CiBjbGFzcyBEZWNsOwogY2xhc3MgRnVuY3Rpb25EZWNsOworY2xhc3MgT2JqQ01ldGhvZERlY2w7CitjbGFzcyBPYmpDUHJvcGVydHlEZWNsOwogY2xhc3MgU3RtdDsKICAgCiBjbGFzcyBCb2R5RmFybSB7CkBAIC0zMiw3ICszNCwxMCBAQAogICAKICAgLy8vIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBib2RpZXMgZm9yIG9yZGluYXJ5IGZ1bmN0aW9ucy4KICAgU3RtdCAqZ2V0Qm9keShjb25zdCBGdW5jdGlvbkRlY2wgKkQpOwotICAKKworICAvLy8gRmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIGJvZGllcyBmb3IgT2JqZWN0aXZlLUMgcHJvcGVydGllcy4KKyAgU3RtdCAqZ2V0Qm9keShjb25zdCBPYmpDTWV0aG9kRGVjbCAqRCk7CisKIHByaXZhdGU6CiAgIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRGVjbCAqLCBPcHRpb25hbDxTdG10ICo+ID4gQm9keU1hcDsKIApkaWZmIC0tZ2l0IGEvbGliL0FuYWx5c2lzL0NGRy5jcHAgYi9saWIvQW5hbHlzaXMvQ0ZHLmNwcAppbmRleCA4YjhjNTczLi40MDBjMjAyIDEwMDY0NAotLS0gYS9saWIvQW5hbHlzaXMvQ0ZHLmNwcAorKysgYi9saWIvQW5hbHlzaXMvQ0ZHLmNwcApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10VmlzaXRvci5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdC5oIgpAQCAtMjkxLDcgKzI5MSw3IEBACiAgIHR5cGVkZWYgQmxvY2tTY29wZVBvc1BhaXIgSnVtcFNvdXJjZTsKIAogICBBU1RDb250ZXh0ICpDb250ZXh0OwotICBPd25pbmdQdHI8Q0ZHPiBjZmc7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRkc+IGNmZzsKIAogICBDRkdCbG9jayAqQmxvY2s7CiAgIENGR0Jsb2NrICpTdWNjOwpAQCAtMzYzLDYgKzM2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFN0bXRDaG9pY2UgYXNjKTsKICAgQ0ZHQmxvY2sgKlZpc2l0Q1hYQ2F0Y2hTdG10KENYWENhdGNoU3RtdCAqUyk7CiAgIENGR0Jsb2NrICpWaXNpdENYWENvbnN0cnVjdEV4cHIoQ1hYQ29uc3RydWN0RXhwciAqQywgQWRkU3RtdENob2ljZSBhc2MpOworICBDRkdCbG9jayAqVmlzaXRDWFhOZXdFeHByKENYWE5ld0V4cHIgKkRFLCBBZGRTdG10Q2hvaWNlIGFzYyk7CiAgIENGR0Jsb2NrICpWaXNpdENYWERlbGV0ZUV4cHIoQ1hYRGVsZXRlRXhwciAqREUsIEFkZFN0bXRDaG9pY2UgYXNjKTsKICAgQ0ZHQmxvY2sgKlZpc2l0Q1hYRm9yUmFuZ2VTdG10KENYWEZvclJhbmdlU3RtdCAqUyk7CiAgIENGR0Jsb2NrICpWaXNpdENYWEZ1bmN0aW9uYWxDYXN0RXhwcihDWFhGdW5jdGlvbmFsQ2FzdEV4cHIgKkUsCkBAIC00NTksNiArNDYwLDkgQEAKICAgdm9pZCBhcHBlbmRJbml0aWFsaXplcihDRkdCbG9jayAqQiwgQ1hYQ3RvckluaXRpYWxpemVyICpJKSB7CiAgICAgQi0+YXBwZW5kSW5pdGlhbGl6ZXIoSSwgY2ZnLT5nZXRCdW1wVmVjdG9yQ29udGV4dCgpKTsKICAgfQorICB2b2lkIGFwcGVuZE5ld0FsbG9jYXRvcihDRkdCbG9jayAqQiwgQ1hYTmV3RXhwciAqTkUpIHsKKyAgICBCLT5hcHBlbmROZXdBbGxvY2F0b3IoTkUsIGNmZy0+Z2V0QnVtcFZlY3RvckNvbnRleHQoKSk7CisgIH0KICAgdm9pZCBhcHBlbmRCYXNlRHRvcihDRkdCbG9jayAqQiwgY29uc3QgQ1hYQmFzZVNwZWNpZmllciAqQlMpIHsKICAgICBCLT5hcHBlbmRCYXNlRHRvcihCUywgY2ZnLT5nZXRCdW1wVmVjdG9yQ29udGV4dCgpKTsKICAgfQpAQCAtNDc5LDggKzQ4MywxNiBAQAogICB2b2lkIHByZXBlbmRBdXRvbWF0aWNPYmpEdG9yc1dpdGhUZXJtaW5hdG9yKENGR0Jsb2NrICpCbGssCiAgICAgICBMb2NhbFNjb3BlOjpjb25zdF9pdGVyYXRvciBCLCBMb2NhbFNjb3BlOjpjb25zdF9pdGVyYXRvciBFKTsKIAotICB2b2lkIGFkZFN1Y2Nlc3NvcihDRkdCbG9jayAqQiwgQ0ZHQmxvY2sgKlMpIHsKLSAgICBCLT5hZGRTdWNjZXNzb3IoUywgY2ZnLT5nZXRCdW1wVmVjdG9yQ29udGV4dCgpKTsKKyAgdm9pZCBhZGRTdWNjZXNzb3IoQ0ZHQmxvY2sgKkIsIENGR0Jsb2NrICpTLCBib29sIElzUmVhY2hhYmxlID0gdHJ1ZSkgeworICAgIEItPmFkZFN1Y2Nlc3NvcihDRkdCbG9jazo6QWRqYWNlbnRCbG9jayhTLCBJc1JlYWNoYWJsZSksCisgICAgICAgICAgICAgICAgICAgIGNmZy0+Z2V0QnVtcFZlY3RvckNvbnRleHQoKSk7CisgIH0KKworICAvLy8gQWRkIGEgcmVhY2hhYmxlIHN1Y2Nlc3NvciB0byBhIGJsb2NrLCB3aXRoIHRoZSBhbHRlcm5hdGUgdmFyaWFudCB0aGF0IGlzCisgIC8vLyB1bnJlYWNoYWJsZS4KKyAgdm9pZCBhZGRTdWNjZXNzb3IoQ0ZHQmxvY2sgKkIsIENGR0Jsb2NrICpSZWFjaGFibGVCbG9jaywgQ0ZHQmxvY2sgKkFsdEJsb2NrKSB7CisgICAgQi0+YWRkU3VjY2Vzc29yKENGR0Jsb2NrOjpBZGphY2VudEJsb2NrKFJlYWNoYWJsZUJsb2NrLCBBbHRCbG9jayksCisgICAgICAgICAgICAgICAgICAgIGNmZy0+Z2V0QnVtcFZlY3RvckNvbnRleHQoKSk7CiAgIH0KIAogICAvLy8gVHJ5IGFuZCBldmFsdWF0ZSBhbiBleHByZXNzaW9uIHRvIGFuIGludGVnZXIgY29uc3RhbnQuCkBAIC03MTIsNyArNzI0LDcgQEAKICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGVudHJ5IGJsb2NrIHRoYXQgaGFzIG5vIHByZWRlY2Vzc29ycy4KICAgY2ZnLT5zZXRFbnRyeShjcmVhdGVCbG9jaygpKTsKIAotICByZXR1cm4gY2ZnLnRha2UoKTsKKyAgcmV0dXJuIGNmZy5yZWxlYXNlKCk7CiB9CiAKIC8vLyBjcmVhdGVCbG9jayAtIFVzZWQgdG8gbGF6aWx5IGNyZWF0ZSBibG9ja3MgdGhhdCBhcmUgY29ubmVjdGVkCkBAIC03MzAsNyArNzQyLDcgQEAKIENGR0Jsb2NrICpDRkdCdWlsZGVyOjpjcmVhdGVOb1JldHVybkJsb2NrKCkgewogICBDRkdCbG9jayAqQiA9IGNyZWF0ZUJsb2NrKGZhbHNlKTsKICAgQi0+c2V0SGFzTm9SZXR1cm5FbGVtZW50KCk7Ci0gIGFkZFN1Y2Nlc3NvcihCLCAmY2ZnLT5nZXRFeGl0KCkpOworICBhZGRTdWNjZXNzb3IoQiwgJmNmZy0+Z2V0RXhpdCgpLCBTdWNjKTsKICAgcmV0dXJuIEI7CiB9CiAKQEAgLTg2OCwzMCArODgwLDI3IEBACiAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gREQtPmdldFBhcmVudCgpOwogCiAgIC8vIEF0IHRoZSBlbmQgZGVzdHJveSB2aXJ0dWFsIGJhc2Ugb2JqZWN0cy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIFZJID0gUkQtPnZiYXNlc19iZWdpbigpLAotICAgICAgVkUgPSBSRC0+dmJhc2VzX2VuZCgpOyBWSSAhPSBWRTsgKytWSSkgewotICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkNEID0gVkktPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgIGZvciAoY29uc3QgYXV0byAmVkkgOiBSRC0+dmJhc2VzKCkpIHsKKyAgICBjb25zdCBDWFhSZWNvcmREZWNsICpDRCA9IFZJLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CiAgICAgaWYgKCFDRC0+aGFzVHJpdmlhbERlc3RydWN0b3IoKSkgewogICAgICAgYXV0b0NyZWF0ZUJsb2NrKCk7Ci0gICAgICBhcHBlbmRCYXNlRHRvcihCbG9jaywgVkkpOworICAgICAgYXBwZW5kQmFzZUR0b3IoQmxvY2ssICZWSSk7CiAgICAgfQogICB9CiAKICAgLy8gQmVmb3JlIHZpcnR1YWwgYmFzZXMgZGVzdHJveSBkaXJlY3QgYmFzZSBvYmplY3RzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgQkkgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgIEJFID0gUkQtPmJhc2VzX2VuZCgpOyBCSSAhPSBCRTsgKytCSSkgewotICAgIGlmICghQkktPmlzVmlydHVhbCgpKSB7Ci0gICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpDRCA9IEJJLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOworICBmb3IgKGNvbnN0IGF1dG8gJkJJIDogUkQtPmJhc2VzKCkpIHsKKyAgICBpZiAoIUJJLmlzVmlydHVhbCgpKSB7CisgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpDRCA9IEJJLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CiAgICAgICBpZiAoIUNELT5oYXNUcml2aWFsRGVzdHJ1Y3RvcigpKSB7CiAgICAgICAgIGF1dG9DcmVhdGVCbG9jaygpOwotICAgICAgICBhcHBlbmRCYXNlRHRvcihCbG9jaywgQkkpOworICAgICAgICBhcHBlbmRCYXNlRHRvcihCbG9jaywgJkJJKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICAvLyBGaXJzdCBkZXN0cm95IG1lbWJlciBvYmplY3RzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEZJID0gUkQtPmZpZWxkX2JlZ2luKCksCi0gICAgICBGRSA9IFJELT5maWVsZF9lbmQoKTsgRkkgIT0gRkU7ICsrRkkpIHsKKyAgZm9yIChhdXRvICpGSSA6IFJELT5maWVsZHMoKSkgewogICAgIC8vIENoZWNrIGZvciBjb25zdGFudCBzaXplIGFycmF5LiBTZXQgdHlwZSB0byBhcnJheSBlbGVtZW50IHR5cGUuCiAgICAgUXVhbFR5cGUgUVQgPSBGSS0+Z2V0VHlwZSgpOwogICAgIGlmIChjb25zdCBDb25zdGFudEFycmF5VHlwZSAqQVQgPSBDb250ZXh0LT5nZXRBc0NvbnN0YW50QXJyYXlUeXBlKFFUKSkgewpAQCAtOTAzLDcgKzkxMiw3IEBACiAgICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKkNEID0gUVQtPmdldEFzQ1hYUmVjb3JkRGVjbCgpKQogICAgICAgaWYgKCFDRC0+aGFzVHJpdmlhbERlc3RydWN0b3IoKSkgewogICAgICAgICBhdXRvQ3JlYXRlQmxvY2soKTsKLSAgICAgICAgYXBwZW5kTWVtYmVyRHRvcihCbG9jaywgKkZJKTsKKyAgICAgICAgYXBwZW5kTWVtYmVyRHRvcihCbG9jaywgRkkpOwogICAgICAgfQogICB9CiB9CkBAIC05MzAsOSArOTM5LDggQEAKIAogICAvLyBGb3IgY29tcG91bmQgc3RhdGVtZW50IHdlIHdpbGwgYmUgY3JlYXRpbmcgZXhwbGljaXQgc2NvcGUuCiAgIGlmIChDb21wb3VuZFN0bXQgKkNTID0gZHluX2Nhc3Q8Q29tcG91bmRTdG10PihTKSkgewotICAgIGZvciAoQ29tcG91bmRTdG10Ojpib2R5X2l0ZXJhdG9yIEJJID0gQ1MtPmJvZHlfYmVnaW4oKSwgQkUgPSBDUy0+Ym9keV9lbmQoKQotICAgICAgICA7IEJJICE9IEJFOyArK0JJKSB7Ci0gICAgICBTdG10ICpTSSA9ICgqQkkpLT5zdHJpcExhYmVsTGlrZVN0YXRlbWVudHMoKTsKKyAgICBmb3IgKGF1dG8gKkJJIDogQ1MtPmJvZHkoKSkgeworICAgICAgU3RtdCAqU0kgPSBCSS0+c3RyaXBMYWJlbExpa2VTdGF0ZW1lbnRzKCk7CiAgICAgICBpZiAoRGVjbFN0bXQgKkRTID0gZHluX2Nhc3Q8RGVjbFN0bXQ+KFNJKSkKICAgICAgICAgU2NvcGUgPSBhZGRMb2NhbFNjb3BlRm9yRGVjbFN0bXQoRFMsIFNjb3BlKTsKICAgICB9CkBAIC05NTIsMTEgKzk2MCw5IEBACiAgIGlmICghQnVpbGRPcHRzLkFkZEltcGxpY2l0RHRvcnMpCiAgICAgcmV0dXJuIFNjb3BlOwogCi0gIGZvciAoRGVjbFN0bXQ6OmRlY2xfaXRlcmF0b3IgREkgPSBEUy0+ZGVjbF9iZWdpbigpLCBERSA9IERTLT5kZWNsX2VuZCgpCi0gICAgICA7IERJICE9IERFOyArK0RJKSB7Ci0gICAgaWYgKFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oKkRJKSkKKyAgZm9yIChhdXRvICpESSA6IERTLT5kZWNscygpKQorICAgIGlmIChWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KERJKSkKICAgICAgIFNjb3BlID0gYWRkTG9jYWxTY29wZUZvclZhckRlY2woVkQsIFNjb3BlKTsKLSAgfQogICByZXR1cm4gU2NvcGU7CiB9CiAKQEAgLTExMjIsNiArMTEyOCw5IEBACiAgICAgY2FzZSBTdG10OjpDWFhDb25zdHJ1Y3RFeHByQ2xhc3M6CiAgICAgICByZXR1cm4gVmlzaXRDWFhDb25zdHJ1Y3RFeHByKGNhc3Q8Q1hYQ29uc3RydWN0RXhwcj4oUyksIGFzYyk7CiAKKyAgICBjYXNlIFN0bXQ6OkNYWE5ld0V4cHJDbGFzczoKKyAgICAgIHJldHVybiBWaXNpdENYWE5ld0V4cHIoY2FzdDxDWFhOZXdFeHByPihTKSwgYXNjKTsKKwogICAgIGNhc2UgU3RtdDo6Q1hYRGVsZXRlRXhwckNsYXNzOgogICAgICAgcmV0dXJuIFZpc2l0Q1hYRGVsZXRlRXhwcihjYXN0PENYWERlbGV0ZUV4cHI+KFMpLCBhc2MpOwogCkBAIC0xMjkzLDcgKzEzMDIsNyBAQAogICBkbyB7CiAgICAgaWYgKEJpbmFyeU9wZXJhdG9yICpCX1JIUyA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihSSFMpKQogICAgICAgaWYgKEJfUkhTLT5pc0xvZ2ljYWxPcCgpKSB7Ci0gICAgICAgIGxsdm06OnRpZShSSFNCbG9jaywgRXhpdEJsb2NrKSA9CisgICAgICAgIHN0ZDo6dGllKFJIU0Jsb2NrLCBFeGl0QmxvY2spID0KICAgICAgICAgICBWaXNpdExvZ2ljYWxPcGVyYXRvcihCX1JIUywgVGVybSwgVHJ1ZUJsb2NrLCBGYWxzZUJsb2NrKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0xMzExLDggKzEzMjAsOCBAQAogICAgIGVsc2UgewogICAgICAgUkhTQmxvY2stPnNldFRlcm1pbmF0b3IoVGVybSk7CiAgICAgICBUcnlSZXN1bHQgS25vd25WYWwgPSB0cnlFdmFsdWF0ZUJvb2woUkhTKTsKLSAgICAgIGFkZFN1Y2Nlc3NvcihSSFNCbG9jaywgS25vd25WYWwuaXNGYWxzZSgpID8gTlVMTCA6IFRydWVCbG9jayk7Ci0gICAgICBhZGRTdWNjZXNzb3IoUkhTQmxvY2ssIEtub3duVmFsLmlzVHJ1ZSgpID8gTlVMTCA6IEZhbHNlQmxvY2spOworICAgICAgYWRkU3VjY2Vzc29yKFJIU0Jsb2NrLCBUcnVlQmxvY2ssICFLbm93blZhbC5pc0ZhbHNlKCkpOworICAgICAgYWRkU3VjY2Vzc29yKFJIU0Jsb2NrLCBGYWxzZUJsb2NrLCAhS25vd25WYWwuaXNUcnVlKCkpOwogICAgIH0KIAogICAgIEJsb2NrID0gUkhTQmxvY2s7CkBAIC0xMzU1LDEyICsxMzY0LDEyIEBACiAKICAgLy8gTm93IGxpbmsgdGhlIExIU0Jsb2NrIHdpdGggUkhTQmxvY2suCiAgIGlmIChCLT5nZXRPcGNvZGUoKSA9PSBCT19MT3IpIHsKLSAgICBhZGRTdWNjZXNzb3IoTEhTQmxvY2ssIEtub3duVmFsLmlzRmFsc2UoKSA/IE5VTEwgOiBUcnVlQmxvY2spOwotICAgIGFkZFN1Y2Nlc3NvcihMSFNCbG9jaywgS25vd25WYWwuaXNUcnVlKCkgPyBOVUxMIDogUkhTQmxvY2spOworICAgIGFkZFN1Y2Nlc3NvcihMSFNCbG9jaywgVHJ1ZUJsb2NrLCAhS25vd25WYWwuaXNGYWxzZSgpKTsKKyAgICBhZGRTdWNjZXNzb3IoTEhTQmxvY2ssIFJIU0Jsb2NrLCAhS25vd25WYWwuaXNUcnVlKCkpOwogICB9IGVsc2UgewogICAgIGFzc2VydChCLT5nZXRPcGNvZGUoKSA9PSBCT19MQW5kKTsKLSAgICBhZGRTdWNjZXNzb3IoTEhTQmxvY2ssIEtub3duVmFsLmlzRmFsc2UoKSA/IE5VTEwgOiBSSFNCbG9jayk7Ci0gICAgYWRkU3VjY2Vzc29yKExIU0Jsb2NrLCBLbm93blZhbC5pc1RydWUoKSA/IE5VTEwgOiBGYWxzZUJsb2NrKTsKKyAgICBhZGRTdWNjZXNzb3IoTEhTQmxvY2ssIFJIU0Jsb2NrLCAhS25vd25WYWwuaXNGYWxzZSgpKTsKKyAgICBhZGRTdWNjZXNzb3IoTEhTQmxvY2ssIEZhbHNlQmxvY2ssICFLbm93blZhbC5pc1RydWUoKSk7CiAgIH0KIAogICByZXR1cm4gc3RkOjptYWtlX3BhaXIoRW50cnlMSFNCbG9jaywgRXhpdEJsb2NrKTsKQEAgLTE2MTksOCArMTYyOCw4IEBACiAKICAgLy8gU2VlIGlmIHRoaXMgaXMgYSBrbm93biBjb25zdGFudC4KICAgY29uc3QgVHJ5UmVzdWx0JiBLbm93blZhbCA9IHRyeUV2YWx1YXRlQm9vbChDLT5nZXRDb25kKCkpOwotICBhZGRTdWNjZXNzb3IoQmxvY2ssIEtub3duVmFsLmlzRmFsc2UoKSA/IE5VTEwgOiBMSFNCbG9jayk7Ci0gIGFkZFN1Y2Nlc3NvcihCbG9jaywgS25vd25WYWwuaXNUcnVlKCkgPyBOVUxMIDogUkhTQmxvY2spOworICBhZGRTdWNjZXNzb3IoQmxvY2ssIExIU0Jsb2NrLCAhS25vd25WYWwuaXNGYWxzZSgpKTsKKyAgYWRkU3VjY2Vzc29yKEJsb2NrLCBSSFNCbG9jaywgIUtub3duVmFsLmlzVHJ1ZSgpKTsKICAgQmxvY2stPnNldFRlcm1pbmF0b3IoQyk7CiAgIEV4cHIgKmNvbmRFeHByID0gQy0+Z2V0Q29uZCgpOwogCkBAIC0xODY1LDkgKzE4NzQsMTAgQEAKICAgLy8gU2VlIGlmIHRoaXMgaXMgYSBrbm93biBjb25zdGFudC4KICAgY29uc3QgVHJ5UmVzdWx0ICZLbm93blZhbCA9IHRyeUV2YWx1YXRlQm9vbChJLT5nZXRDb25kKCkpOwogCi0gIC8vIE5vdyBhZGQgdGhlIHN1Y2Nlc3NvcnMuCi0gIGFkZFN1Y2Nlc3NvcihCbG9jaywgS25vd25WYWwuaXNGYWxzZSgpID8gTlVMTCA6IFRoZW5CbG9jayk7Ci0gIGFkZFN1Y2Nlc3NvcihCbG9jaywgS25vd25WYWwuaXNUcnVlKCk/IE5VTEwgOiBFbHNlQmxvY2spOworICAvLyBBZGQgdGhlIHN1Y2Nlc3NvcnMuICBJZiB3ZSBrbm93IHRoYXQgc3BlY2lmaWMgYnJhbmNoZXMgYXJlCisgIC8vIHVucmVhY2hhYmxlLCBpbmZvcm0gYWRkU3VjY2Vzc29yKCkgb2YgdGhhdCBrbm93bGVkZ2UuCisgIGFkZFN1Y2Nlc3NvcihCbG9jaywgVGhlbkJsb2NrLCAvKiBpc1JlYWNoYWJsZSA9ICovICFLbm93blZhbC5pc0ZhbHNlKCkpOworICBhZGRTdWNjZXNzb3IoQmxvY2ssIEVsc2VCbG9jaywgLyogaXNSZWFjaGFibGUgPSAqLyAhS25vd25WYWwuaXNUcnVlKCkpOwogCiAgIC8vIEFkZCB0aGUgY29uZGl0aW9uIGFzIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGUgbmV3IGJsb2NrLiAgVGhpcyBtYXkgY3JlYXRlCiAgIC8vIG5ldyBibG9ja3MgYXMgdGhlIGNvbmRpdGlvbiBtYXkgY29udGFpbiBjb250cm9sLWZsb3cuICBBbnkgbmV3bHkgY3JlYXRlZApAQCAtMjA3OCw3ICsyMDg4LDcgQEAKICAgICBpZiAoQmluYXJ5T3BlcmF0b3IgKkNvbmQgPQogICAgICAgICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxCaW5hcnlPcGVyYXRvcj4oQyA/IEMtPklnbm9yZVBhcmVucygpIDogMCkpCiAgICAgICBpZiAoQ29uZC0+aXNMb2dpY2FsT3AoKSkgewotICAgICAgICBsbHZtOjp0aWUoRW50cnlDb25kaXRpb25CbG9jaywgRXhpdENvbmRpdGlvbkJsb2NrKSA9CisgICAgICAgIHN0ZDo6dGllKEVudHJ5Q29uZGl0aW9uQmxvY2ssIEV4aXRDb25kaXRpb25CbG9jaykgPQogICAgICAgICAgIFZpc2l0TG9naWNhbE9wZXJhdG9yKENvbmQsIEYsIEJvZHlCbG9jaywgTG9vcFN1Y2Nlc3Nvcik7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQpAQCAtMjM5NCw5ICsyNDA0LDggQEAKICAgICAvLyBtb3JlIG9wdGltYWwgQ0ZHIHJlcHJlc2VudGF0aW9uLgogICAgIGlmIChCaW5hcnlPcGVyYXRvciAqQ29uZCA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihDLT5JZ25vcmVQYXJlbnMoKSkpCiAgICAgICBpZiAoQ29uZC0+aXNMb2dpY2FsT3AoKSkgewotICAgICAgICBsbHZtOjp0aWUoRW50cnlDb25kaXRpb25CbG9jaywgRXhpdENvbmRpdGlvbkJsb2NrKSA9Ci0gICAgICAgICAgVmlzaXRMb2dpY2FsT3BlcmF0b3IoQ29uZCwgVywgQm9keUJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdWNjZXNzb3IpOworICAgICAgICBzdGQ6OnRpZShFbnRyeUNvbmRpdGlvbkJsb2NrLCBFeGl0Q29uZGl0aW9uQmxvY2spID0KKyAgICAgICAgICAgIFZpc2l0TG9naWNhbE9wZXJhdG9yKENvbmQsIFcsIEJvZHlCbG9jaywgTG9vcFN1Y2Nlc3Nvcik7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogCkBAIC0yNzI2LDggKzI3MzUsOCBAQAogICBTd2l0Y2hBbHdheXNIYXNTdWNjZXNzb3IgfD0gc3dpdGNoRXhjbHVzaXZlbHlDb3ZlcmVkOwogICBTd2l0Y2hBbHdheXNIYXNTdWNjZXNzb3IgfD0gVGVybWluYXRvci0+aXNBbGxFbnVtQ2FzZXNDb3ZlcmVkKCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlcm1pbmF0b3ItPmdldFN3aXRjaENhc2VMaXN0KCk7Ci0gIGFkZFN1Y2Nlc3NvcihTd2l0Y2hUZXJtaW5hdGVkQmxvY2ssCi0gICAgICAgICAgICAgICBTd2l0Y2hBbHdheXNIYXNTdWNjZXNzb3IgPyAwIDogRGVmYXVsdENhc2VCbG9jayk7CisgIGFkZFN1Y2Nlc3NvcihTd2l0Y2hUZXJtaW5hdGVkQmxvY2ssIERlZmF1bHRDYXNlQmxvY2ssCisgICAgICAgICAgICAgICAhU3dpdGNoQWx3YXlzSGFzU3VjY2Vzc29yKTsKIAogICAvLyBBZGQgdGhlIHRlcm1pbmF0b3IgYW5kIGNvbmRpdGlvbiBpbiB0aGUgc3dpdGNoIGJsb2NrLgogICBTd2l0Y2hUZXJtaW5hdGVkQmxvY2stPnNldFRlcm1pbmF0b3IoVGVybWluYXRvcik7CkBAIC0yODI4LDEwICsyODM3LDkgQEAKICAgLy8gQWRkIHRoaXMgYmxvY2sgdG8gdGhlIGxpc3Qgb2Ygc3VjY2Vzc29ycyBmb3IgdGhlIGJsb2NrIHdpdGggdGhlIHN3aXRjaAogICAvLyBzdGF0ZW1lbnQuCiAgIGFzc2VydChTd2l0Y2hUZXJtaW5hdGVkQmxvY2spOwotICBhZGRTdWNjZXNzb3IoU3dpdGNoVGVybWluYXRlZEJsb2NrLAorICBhZGRTdWNjZXNzb3IoU3dpdGNoVGVybWluYXRlZEJsb2NrLCBDYXNlQmxvY2ssCiAgICAgICAgICAgICAgICBzaG91bGRBZGRDYXNlKHN3aXRjaEV4Y2x1c2l2ZWx5Q292ZXJlZCwgc3dpdGNoQ29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MsICpDb250ZXh0KQotICAgICAgICAgICAgICAgPyBDYXNlQmxvY2sgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1MsICpDb250ZXh0KSk7CiAKICAgLy8gV2Ugc2V0IEJsb2NrIHRvIE5VTEwgdG8gYWxsb3cgbGF6eSBjcmVhdGlvbiBvZiBhIG5ldyBibG9jayAoaWYgbmVjZXNzYXJ5KQogICBCbG9jayA9IE5VTEw7CkBAIC0zMTI0LDYgKzMxMzIsMjMgQEAKICAgcmV0dXJuIFZpc2l0Q2hpbGRyZW4oQyk7CiB9CiAKK0NGR0Jsb2NrICpDRkdCdWlsZGVyOjpWaXNpdENYWE5ld0V4cHIoQ1hYTmV3RXhwciAqTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFN0bXRDaG9pY2UgYXNjKSB7CisKKyAgYXV0b0NyZWF0ZUJsb2NrKCk7CisgIGFwcGVuZFN0bXQoQmxvY2ssIE5FKTsKKworICBpZiAoTkUtPmdldEluaXRpYWxpemVyKCkpCisgICAgQmxvY2sgPSBWaXNpdChORS0+Z2V0SW5pdGlhbGl6ZXIoKSk7CisgIGlmIChCdWlsZE9wdHMuQWRkQ1hYTmV3QWxsb2NhdG9yKQorICAgIGFwcGVuZE5ld0FsbG9jYXRvcihCbG9jaywgTkUpOworICBpZiAoTkUtPmlzQXJyYXkoKSkKKyAgICBCbG9jayA9IFZpc2l0KE5FLT5nZXRBcnJheVNpemUoKSk7CisgIGZvciAoQ1hYTmV3RXhwcjo6YXJnX2l0ZXJhdG9yIEkgPSBORS0+cGxhY2VtZW50X2FyZ19iZWdpbigpLAorICAgICAgIEUgPSBORS0+cGxhY2VtZW50X2FyZ19lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgQmxvY2sgPSBWaXNpdCgqSSk7CisgIHJldHVybiBCbG9jazsKK30KIAogQ0ZHQmxvY2sgKkNGR0J1aWxkZXI6OlZpc2l0Q1hYRGVsZXRlRXhwcihDWFhEZWxldGVFeHByICpERSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkU3RtdENob2ljZSBhc2MpIHsKQEAgLTMzMjAsMTAgKzMzNDUsMTIgQEAKICAgICAvLyBhIG5ldyBibG9jayBmb3IgdGhlIGRlc3RydWN0b3Igd2hpY2ggZG9lcyBub3QgaGF2ZSBhcyBhIHN1Y2Nlc3NvcgogICAgIC8vIGFueXRoaW5nIGJ1aWx0IHRodXMgZmFyLiBDb250cm9sIHdvbid0IGZsb3cgb3V0IG9mIHRoaXMgYmxvY2suCiAgICAgY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkR0b3IgPSBFLT5nZXRUZW1wb3JhcnkoKS0+Z2V0RGVzdHJ1Y3RvcigpOwotICAgIGlmIChEdG9yLT5pc05vUmV0dXJuKCkpCisgICAgaWYgKER0b3ItPmlzTm9SZXR1cm4oKSkgeworICAgICAgU3VjYyA9IEI7CiAgICAgICBCbG9jayA9IGNyZWF0ZU5vUmV0dXJuQmxvY2soKTsKLSAgICBlbHNlCisgICAgfSBlbHNlIHsKICAgICAgIGF1dG9DcmVhdGVCbG9jaygpOworICAgIH0KIAogICAgIGFwcGVuZFRlbXBvcmFyeUR0b3IoQmxvY2ssIEUpOwogICAgIEIgPSBCbG9jazsKQEAgLTMzNzIsMTIgKzMzOTksMTMgQEAKIAogICBCbG9jayA9IGNyZWF0ZUJsb2NrKGZhbHNlKTsKICAgQmxvY2stPnNldFRlcm1pbmF0b3IoQ0ZHVGVybWluYXRvcihFLCB0cnVlKSk7CisgIGFzc2VydChCbG9jay0+Z2V0VGVybWluYXRvcigpLmlzVGVtcG9yYXJ5RHRvcnNCcmFuY2goKSk7CiAKICAgLy8gU2VlIGlmIHRoaXMgaXMgYSBrbm93biBjb25zdGFudC4KICAgY29uc3QgVHJ5UmVzdWx0ICZLbm93blZhbCA9IHRyeUV2YWx1YXRlQm9vbChFLT5nZXRDb25kKCkpOwogCiAgIGlmIChMSFNCbG9jaykgewotICAgIGFkZFN1Y2Nlc3NvcihCbG9jaywgS25vd25WYWwuaXNGYWxzZSgpID8gTlVMTCA6IExIU0Jsb2NrKTsKKyAgICBhZGRTdWNjZXNzb3IoQmxvY2ssIExIU0Jsb2NrLCAhS25vd25WYWwuaXNGYWxzZSgpKTsKICAgfSBlbHNlIGlmIChLbm93blZhbC5pc0ZhbHNlKCkpIHsKICAgICBhZGRTdWNjZXNzb3IoQmxvY2ssIE5VTEwpOwogICB9IGVsc2UgewpAQCAtMzM4Nyw3ICszNDE1LDggQEAKIAogICBpZiAoIVJIU0Jsb2NrKQogICAgIFJIU0Jsb2NrID0gQ29uZmx1ZW5jZUJsb2NrOwotICBhZGRTdWNjZXNzb3IoQmxvY2ssIEtub3duVmFsLmlzVHJ1ZSgpID8gTlVMTCA6IFJIU0Jsb2NrKTsKKworICBhZGRTdWNjZXNzb3IoQmxvY2ssIFJIU0Jsb2NrLCAhS25vd25WYWwuaXNUcnVlKCkpOwogCiAgIHJldHVybiBCbG9jazsKIH0KQEAgLTM0MjYsNiArMzQ1NSw3IEBACiAgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CiAgICAgY2FzZSBDRkdFbGVtZW50OjpTdGF0ZW1lbnQ6CiAgICAgY2FzZSBDRkdFbGVtZW50OjpJbml0aWFsaXplcjoKKyAgICBjYXNlIENGR0VsZW1lbnQ6Ok5ld0FsbG9jYXRvcjoKICAgICAgIGxsdm1fdW5yZWFjaGFibGUoImdldERlc3RydWN0b3JEZWNsIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJJbXBsaWNpdER0b3JzIik7CiAgICAgY2FzZSBDRkdFbGVtZW50OjpBdXRvbWF0aWNPYmplY3REdG9yOiB7CkBAIC0zNDcwLDEzICszNTAwLDM3IEBACiB9CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyBGaWx0ZXJlZCB3YWxraW5nIG9mIHRoZSBDRkcuCisvLyBDRkdCbG9jayBvcGVyYXRpb25zLgogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAorQ0ZHQmxvY2s6OkFkamFjZW50QmxvY2s6OkFkamFjZW50QmxvY2soQ0ZHQmxvY2sgKkIsIGJvb2wgSXNSZWFjaGFibGUpCisgIDogUmVhY2hhYmxlQmxvY2soSXNSZWFjaGFibGUgPyBCIDogMCksCisgICAgVW5yZWFjaGFibGVCbG9jayghSXNSZWFjaGFibGUgPyBCIDogMCwKKyAgICAgICAgICAgICAgICAgICAgIEIgJiYgSXNSZWFjaGFibGUgPyBBQl9Ob3JtYWwgOiBBQl9VbnJlYWNoYWJsZSkge30KKworQ0ZHQmxvY2s6OkFkamFjZW50QmxvY2s6OkFkamFjZW50QmxvY2soQ0ZHQmxvY2sgKkIsIENGR0Jsb2NrICpBbHRlcm5hdGVCbG9jaykKKyAgOiBSZWFjaGFibGVCbG9jayhCKSwKKyAgICBVbnJlYWNoYWJsZUJsb2NrKEIgPT0gQWx0ZXJuYXRlQmxvY2sgPyAwIDogQWx0ZXJuYXRlQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICBCID09IEFsdGVybmF0ZUJsb2NrID8gQUJfQWx0ZXJuYXRlIDogQUJfTm9ybWFsKSB7fQorCit2b2lkIENGR0Jsb2NrOjphZGRTdWNjZXNzb3IoQWRqYWNlbnRCbG9jayBTdWNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bXBWZWN0b3JDb250ZXh0ICZDKSB7CisgIGlmIChDRkdCbG9jayAqQiA9IFN1Y2MuZ2V0UmVhY2hhYmxlQmxvY2soKSkKKyAgICBCLT5QcmVkcy5wdXNoX2JhY2soQWRqYWNlbnRCbG9jayh0aGlzLCBTdWNjLmlzUmVhY2hhYmxlKCkpLCBDKTsKKworICBpZiAoQ0ZHQmxvY2sgKlVucmVhY2hhYmxlQiA9IFN1Y2MuZ2V0UG9zc2libHlVbnJlYWNoYWJsZUJsb2NrKCkpCisgICAgVW5yZWFjaGFibGVCLT5QcmVkcy5wdXNoX2JhY2soQWRqYWNlbnRCbG9jayh0aGlzLCBmYWxzZSksIEMpOworCisgIFN1Y2NzLnB1c2hfYmFjayhTdWNjLCBDKTsKK30KKwogYm9vbCBDRkdCbG9jazo6RmlsdGVyRWRnZShjb25zdCBDRkdCbG9jazo6RmlsdGVyT3B0aW9ucyAmRiwKICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKkZyb20sIGNvbnN0IENGR0Jsb2NrICpUbykgewogCi0gIGlmIChUbyAmJiBGLklnbm9yZURlZmF1bHRzV2l0aENvdmVyZWRFbnVtcykgeworICBpZiAoRi5JZ25vcmVOdWxsUHJlZGVjZXNzb3JzICYmICFGcm9tKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChUbyAmJiBGcm9tICYmIEYuSWdub3JlRGVmYXVsdHNXaXRoQ292ZXJlZEVudW1zKSB7CiAgICAgLy8gSWYgdGhlICdUbycgaGFzIG5vIGxhYmVsIG9yIGlzIGxhYmVsZWQgYnV0IHRoZSBsYWJlbCBpc24ndCBhCiAgICAgLy8gQ2FzZVN0bXQgdGhlbiBmaWx0ZXIgdGhpcyBlZGdlLgogICAgIGlmIChjb25zdCBTd2l0Y2hTdG10ICpTID0KQEAgLTM1NzIsNyArMzYyNiw3IEBACiAgIHZvaWQgc2V0QmxvY2tJRChzaWduZWQgaSkgeyBjdXJyZW50QmxvY2sgPSBpOyB9CiAgIHZvaWQgc2V0U3RtdElEKHVuc2lnbmVkIGkpIHsgY3VyclN0bXQgPSBpOyB9CiAKLSAgdmlydHVhbCBib29sIGhhbmRsZWRTdG10KFN0bXQgKlMsIHJhd19vc3RyZWFtICZPUykgeworICBib29sIGhhbmRsZWRTdG10KFN0bXQgKlMsIHJhd19vc3RyZWFtICZPUykgb3ZlcnJpZGUgewogICAgIFN0bXRNYXBUeTo6aXRlcmF0b3IgSSA9IFN0bXRNYXAuZmluZChTKTsKIAogICAgIGlmIChJID09IFN0bXRNYXAuZW5kKCkpCkBAIC0zNjE1LDcgKzM2NjksOSBAQAogcHVibGljOgogICBDRkdCbG9ja1Rlcm1pbmF0b3JQcmludChyYXdfb3N0cmVhbSAmb3MsIFN0bXRQcmludGVySGVscGVyKiBoZWxwZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpCi0gICAgOiBPUyhvcyksIEhlbHBlcihoZWxwZXIpLCBQb2xpY3koUG9saWN5KSB7fQorICAgIDogT1Mob3MpLCBIZWxwZXIoaGVscGVyKSwgUG9saWN5KFBvbGljeSkgeworICAgIHRoaXMtPlBvbGljeS5JbmNsdWRlTmV3bGluZXMgPSBmYWxzZTsKKyAgfQogCiAgIHZvaWQgVmlzaXRJZlN0bXQoSWZTdG10ICpJKSB7CiAgICAgT1MgPDwgImlmICI7CkBAIC0zNzA1LDYgKzM3NjEsMTMgQEAKICAgdm9pZCBWaXNpdEV4cHIoRXhwciAqRSkgewogICAgIEUtPnByaW50UHJldHR5KE9TLCBIZWxwZXIsIFBvbGljeSk7CiAgIH0KKworcHVibGljOgorICB2b2lkIHByaW50KENGR1Rlcm1pbmF0b3IgVCkgeworICAgIGlmIChULmlzVGVtcG9yYXJ5RHRvcnNCcmFuY2goKSkKKyAgICAgIE9TIDw8ICIoVGVtcCBEdG9yKSAiOworICAgIFZpc2l0KFQuZ2V0U3RtdCgpKTsKKyAgfQogfTsKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIApAQCAtMzc4Nyw2ICszODUwLDExIEBACiAgICAgT1MgPDwgIi5+IiA8PCBULT5nZXRBc0NYWFJlY29yZERlY2woKS0+Z2V0TmFtZSgpLnN0cigpIDw8ICIoKSI7CiAgICAgT1MgPDwgIiAoSW1wbGljaXQgZGVzdHJ1Y3RvcilcbiI7CiAKKyAgfSBlbHNlIGlmIChPcHRpb25hbDxDRkdOZXdBbGxvY2F0b3I+IE5FID0gRS5nZXRBczxDRkdOZXdBbGxvY2F0b3I+KCkpIHsKKyAgICBPUyA8PCAiQ0ZHTmV3QWxsb2NhdG9yKCI7CisgICAgaWYgKGNvbnN0IENYWE5ld0V4cHIgKkFsbG9jRXhwciA9IE5FLT5nZXRBbGxvY2F0b3JFeHByKCkpCisgICAgICBBbGxvY0V4cHItPmdldFR5cGUoKS5wcmludChPUywgUHJpbnRpbmdQb2xpY3koSGVscGVyLmdldExhbmdPcHRzKCkpKTsKKyAgICBPUyA8PCAiKVxuIjsKICAgfSBlbHNlIGlmIChPcHRpb25hbDxDRkdEZWxldGVEdG9yPiBERSA9IEUuZ2V0QXM8Q0ZHRGVsZXRlRHRvcj4oKSkgewogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gREUtPmdldENYWFJlY29yZERlY2woKTsKICAgICBpZiAoIVJEKQpAQCAtMzgzNSw2ICszOTAzLDggQEAKICAgICBPUyA8PCAiIChFWElUKV1cbiI7CiAgIGVsc2UgaWYgKCZCID09IGNmZy0+Z2V0SW5kaXJlY3RHb3RvQmxvY2soKSkKICAgICBPUyA8PCAiIChJTkRJUkVDVCBHT1RPIERJU1BBVENIKV1cbiI7CisgIGVsc2UgaWYgKEIuaGFzTm9SZXR1cm5FbGVtZW50KCkpCisgICAgT1MgPDwgIiAoTk9SRVRVUk4pXVxuIjsKICAgZWxzZQogICAgIE9TIDw8ICJdXG4iOwogICAKQEAgLTM5MDMsNyArMzk3Myw3IEBACiAKICAgICBQcmludGluZ1BvbGljeSBQUChIZWxwZXIuZ2V0TGFuZ09wdHMoKSk7CiAgICAgQ0ZHQmxvY2tUZXJtaW5hdG9yUHJpbnQgVFByaW50ZXIoT1MsICZIZWxwZXIsIFBQKTsKLSAgICBUUHJpbnRlci5WaXNpdChjb25zdF9jYXN0PFN0bXQqPihCLmdldFRlcm1pbmF0b3IoKS5nZXRTdG10KCkpKTsKKyAgICBUUHJpbnRlci5wcmludChCLmdldFRlcm1pbmF0b3IoKSk7CiAgICAgT1MgPDwgJ1xuJzsKICAgICAKICAgICBpZiAoU2hvd0NvbG9ycykKQEAgLTM5MzEsNyArNDAwMSwxNiBAQAogICAgICAgICBpZiAoaSAlIDEwID09IDgpCiAgICAgICAgICAgT1MgPDwgIlxuICAgICAiOwogCi0gICAgICAgIE9TIDw8ICIgQiIgPDwgKCpJKS0+Z2V0QmxvY2tJRCgpOworICAgICAgICBDRkdCbG9jayAqQiA9ICpJOworICAgICAgICBib29sIFJlYWNoYWJsZSA9IHRydWU7CisgICAgICAgIGlmICghQikgeworICAgICAgICAgIFJlYWNoYWJsZSA9IGZhbHNlOworICAgICAgICAgIEIgPSBJLT5nZXRQb3NzaWJseVVucmVhY2hhYmxlQmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIE9TIDw8ICIgQiIgPDwgQi0+Z2V0QmxvY2tJRCgpOworICAgICAgICBpZiAoIVJlYWNoYWJsZSkKKyAgICAgICAgICBPUyA8PCAiKFVucmVhY2hhYmxlKSI7CiAgICAgICB9CiAgICAgICAKICAgICAgIGlmIChTaG93Q29sb3JzKQpAQCAtMzk2MCwxMiArNDAzOSwyNCBAQAogICAgICAgICBpZiAoaSAlIDEwID09IDgpCiAgICAgICAgICAgT1MgPDwgIlxuICAgICI7CiAKLSAgICAgICAgaWYgKCpJKQotICAgICAgICAgIE9TIDw8ICIgQiIgPDwgKCpJKS0+Z2V0QmxvY2tJRCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgT1MgIDw8ICIgTlVMTCI7CisgICAgICAgIENGR0Jsb2NrICpCID0gKkk7CisKKyAgICAgICAgYm9vbCBSZWFjaGFibGUgPSB0cnVlOworICAgICAgICBpZiAoIUIpIHsKKyAgICAgICAgICBSZWFjaGFibGUgPSBmYWxzZTsKKyAgICAgICAgICBCID0gSS0+Z2V0UG9zc2libHlVbnJlYWNoYWJsZUJsb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQikgeworICAgICAgICAgIE9TIDw8ICIgQiIgPDwgQi0+Z2V0QmxvY2tJRCgpOworICAgICAgICAgIGlmICghUmVhY2hhYmxlKQorICAgICAgICAgICAgT1MgPDwgIihVbnJlYWNoYWJsZSkiOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIE9TIDw8ICIgTlVMTCI7CisgICAgICAgIH0KICAgICAgIH0KLSAgICAgIAorCiAgICAgICBpZiAoU2hvd0NvbG9ycykKICAgICAgICAgT1MucmVzZXRDb2xvcigpOwogICAgICAgT1MgPDwgJ1xuJzsKQEAgLTQwMjAsMTAgKzQxMTEsMTAgQEAKIHZvaWQgQ0ZHQmxvY2s6OnByaW50VGVybWluYXRvcihyYXdfb3N0cmVhbSAmT1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxPKSBjb25zdCB7CiAgIENGR0Jsb2NrVGVybWluYXRvclByaW50IFRQcmludGVyKE9TLCBOVUxMLCBQcmludGluZ1BvbGljeShMTykpOwotICBUUHJpbnRlci5WaXNpdChjb25zdF9jYXN0PFN0bXQqPihnZXRUZXJtaW5hdG9yKCkuZ2V0U3RtdCgpKSk7CisgIFRQcmludGVyLnByaW50KGdldFRlcm1pbmF0b3IoKSk7CiB9CiAKLVN0bXQgKkNGR0Jsb2NrOjpnZXRUZXJtaW5hdG9yQ29uZGl0aW9uKCkgeworU3RtdCAqQ0ZHQmxvY2s6OmdldFRlcm1pbmF0b3JDb25kaXRpb24oYm9vbCBTdHJpcFBhcmVucykgewogICBTdG10ICpUZXJtaW5hdG9yID0gdGhpcy0+VGVybWluYXRvcjsKICAgaWYgKCFUZXJtaW5hdG9yKQogICAgIHJldHVybiBOVUxMOwpAQCAtNDA4Miw2ICs0MTczLDkgQEAKICAgICAgIHJldHVybiBUZXJtaW5hdG9yOwogICB9CiAKKyAgaWYgKCFTdHJpcFBhcmVucykKKyAgICByZXR1cm4gRTsKKwogICByZXR1cm4gRSA/IEUtPklnbm9yZVBhcmVucygpIDogTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL0FuYWx5c2lzL0NGR1JlYWNoYWJpbGl0eUFuYWx5c2lzLmNwcCBiL2xpYi9BbmFseXNpcy9DRkdSZWFjaGFiaWxpdHlBbmFseXNpcy5jcHAKaW5kZXggNDkyZTY2Zi4uNGFlMTM1ZiAxMDA2NDQKLS0tIGEvbGliL0FuYWx5c2lzL0NGR1JlYWNoYWJpbGl0eUFuYWx5c2lzLmNwcAorKysgYi9saWIvQW5hbHlzaXMvQ0ZHUmVhY2hhYmlsaXR5QW5hbHlzaXMuY3BwCkBAIC02OSw3ICs2OSw4IEBACiAgICAgLy8gQWRkIHRoZSBwcmVkZWNlc3NvcnMgdG8gdGhlIHdvcmtsaXN0LgogICAgIGZvciAoQ0ZHQmxvY2s6OmNvbnN0X3ByZWRfaXRlcmF0b3IgaSA9IGJsb2NrLT5wcmVkX2JlZ2luKCksIAogICAgICAgICAgZSA9IGJsb2NrLT5wcmVkX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgICAgd29ya2xpc3QucHVzaF9iYWNrKCppKTsKKyAgICAgIGlmICgqaSkKKyAgICAgICAgd29ya2xpc3QucHVzaF9iYWNrKCppKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9DTWFrZUxpc3RzLnR4dCBiL2xpYi9BbmFseXNpcy9DTWFrZUxpc3RzLnR4dAppbmRleCBkZWFiOGYxLi45NjMwYmMwIDEwMDY0NAotLS0gYS9saWIvQW5hbHlzaXMvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL0FuYWx5c2lzL0NNYWtlTGlzdHMudHh0CkBAIC0xLDMgKzEsOCBAQAorc2V0KExMVk1fTElOS19DT01QT05FTlRTCisgIE1DCisgIFN1cHBvcnQKKyAgKQorCiBhZGRfY2xhbmdfbGlicmFyeShjbGFuZ0FuYWx5c2lzCiAgIEFuYWx5c2lzRGVjbENvbnRleHQuY3BwCiAgIEJvZHlGYXJtLmNwcApAQCAtMTksMTkgKzI0LDggQEAKICAgU2NhbmZGb3JtYXRTdHJpbmcuY3BwCiAgIFRocmVhZFNhZmV0eS5jcHAKICAgVW5pbml0aWFsaXplZFZhbHVlcy5jcHAKLSAgKQogCi1hZGRfZGVwZW5kZW5jaWVzKGNsYW5nQW5hbHlzaXMKLSAgQ2xhbmdBdHRyQ2xhc3NlcwotICBDbGFuZ0F0dHJMaXN0Ci0gIENsYW5nQ29tbWVudE5vZGVzCi0gIENsYW5nRGlhZ25vc3RpY0NvbW1vbgotICBDbGFuZ0RlY2xOb2RlcwotICBDbGFuZ0RpYWdub3N0aWNBbmFseXNpcwotICBDbGFuZ1N0bXROb2RlcwotICApCi0KLXRhcmdldF9saW5rX2xpYnJhcmllcyhjbGFuZ0FuYWx5c2lzCisgIExJTktfTElCUwogICBjbGFuZ0Jhc2ljCiAgIGNsYW5nQVNUCiAgICkKZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9DYWxsR3JhcGguY3BwIGIvbGliL0FuYWx5c2lzL0NhbGxHcmFwaC5jcHAKaW5kZXggMzM4NzAxNS4uNjQ5YmE1NyAxMDA2NDQKLS0tIGEvbGliL0FuYWx5c2lzL0NhbGxHcmFwaC5jcHAKKysrIGIvbGliL0FuYWx5c2lzL0NhbGxHcmFwaC5jcHAKQEAgLTk1LDkgKzk1LDggQEAKICAgaWYgKEJsb2NrRGVjbCAqQkQgPSBkeW5fY2FzdDxCbG9ja0RlY2w+KEQpKQogICAgIGFkZE5vZGVGb3JEZWNsKEJELCB0cnVlKTsKIAotICBmb3IgKERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIEkgPSBELT5kZWNsc19iZWdpbigpLCBFID0gRC0+ZGVjbHNfZW5kKCk7Ci0gICAgICAgSSE9RTsgKytJKQotICAgIGlmIChEZWNsQ29udGV4dCAqREMgPSBkeW5fY2FzdDxEZWNsQ29udGV4dD4oKkkpKQorICBmb3IgKGF1dG8gKkkgOiBELT5kZWNscygpKQorICAgIGlmIChhdXRvICpEQyA9IGR5bl9jYXN0PERlY2xDb250ZXh0PihJKSkKICAgICAgIGFkZE5vZGVzRm9yQmxvY2tzKERDKTsKIH0KIApAQCAtMTA2LDEyICsxMDUsNyBAQAogfQogCiBDYWxsR3JhcGg6On5DYWxsR3JhcGgoKSB7Ci0gIGlmICghRnVuY3Rpb25NYXAuZW1wdHkoKSkgewotICAgIGZvciAoRnVuY3Rpb25NYXBUeTo6aXRlcmF0b3IgSSA9IEZ1bmN0aW9uTWFwLmJlZ2luKCksIEUgPSBGdW5jdGlvbk1hcC5lbmQoKTsKLSAgICAgICAgSSAhPSBFOyArK0kpCi0gICAgICBkZWxldGUgSS0+c2Vjb25kOwotICAgIEZ1bmN0aW9uTWFwLmNsZWFyKCk7Ci0gIH0KKyAgbGx2bTo6RGVsZXRlQ29udGFpbmVyU2Vjb25kcyhGdW5jdGlvbk1hcCk7CiB9CiAKIGJvb2wgQ2FsbEdyYXBoOjppbmNsdWRlSW5HcmFwaChjb25zdCBEZWNsICpEKSB7CmRpZmYgLS1naXQgYS9saWIvQW5hbHlzaXMvQ29uc3VtZWQuY3BwIGIvbGliL0FuYWx5c2lzL0NvbnN1bWVkLmNwcAppbmRleCBiMzNjOGQ4Li43YjZhZDU3IDEwMDY0NAotLS0gYS9saWIvQW5hbHlzaXMvQ29uc3VtZWQuY3BwCisrKyBiL2xpYi9BbmFseXNpcy9Db25zdW1lZC5jcHAKQEAgLTE3LDIwICsxNywyMCBAQAogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQ1hYLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJDWFguaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvUmVjdXJzaXZlQVNUVmlzaXRvci5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10VmlzaXRvci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10Q1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRWaXNpdG9yLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKKyNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Db25zdW1lZC5oIgogI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL1Bvc3RPcmRlckNGR1ZpZXcuaCIKICNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNpc0NvbnRleHQuaCIKICNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9DRkcuaCIKLSNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNlcy9Db25zdW1lZC5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZXJhdG9yS2luZHMuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5oIgogI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAKIC8vIFRPRE86IEFkanVzdCBzdGF0ZXMgb2YgYXJncyB0byBjb25zdHJ1Y3RvcnMgaW4gdGhlIHNhbWUgd2F5IHRoYXQgYXJndW1lbnRzIHRvCiAvLyAgICAgICBmdW5jdGlvbiBjYWxscyBhcmUgaGFuZGxlZC4KQEAgLTE0Myw2ICsxNDMsNyBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKKwogc3RhdGljIGJvb2wgaXNDb25zdW1hYmxlVHlwZShjb25zdCBRdWFsVHlwZSAmUVQpIHsKICAgaWYgKFFULT5pc1BvaW50ZXJUeXBlKCkgfHwgUVQtPmlzUmVmZXJlbmNlVHlwZSgpKQogICAgIHJldHVybiBmYWxzZTsKQEAgLTE1Myw2ICsxNTQsMjMgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgYm9vbCBpc0F1dG9DYXN0VHlwZShjb25zdCBRdWFsVHlwZSAmUVQpIHsKKyAgaWYgKFFULT5pc1BvaW50ZXJUeXBlKCkgfHwgUVQtPmlzUmVmZXJlbmNlVHlwZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBRVC0+Z2V0QXNDWFhSZWNvcmREZWNsKCkpCisgICAgcmV0dXJuIFJELT5oYXNBdHRyPENvbnN1bWFibGVBdXRvQ2FzdEF0dHI+KCk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpc1NldE9uUmVhZFB0clR5cGUoY29uc3QgUXVhbFR5cGUgJlFUKSB7CisgIGlmIChjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IFFULT5nZXRQb2ludGVlQ1hYUmVjb3JkRGVjbCgpKQorICAgIHJldHVybiBSRC0+aGFzQXR0cjxDb25zdW1hYmxlU2V0T25SZWFkQXR0cj4oKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisKIHN0YXRpYyBib29sIGlzS25vd25TdGF0ZShDb25zdW1lZFN0YXRlIFN0YXRlKSB7CiAgIHN3aXRjaCAoU3RhdGUpIHsKICAgY2FzZSBDU19VbmNvbnN1bWVkOgpAQCAtMTY1LDE5ICsxODMsMTYgQEAKICAgbGx2bV91bnJlYWNoYWJsZSgiaW52YWxpZCBlbnVtIik7CiB9CiAKLXN0YXRpYyBib29sIGlzUlZhbHVlUmVmaXNoKFF1YWxUeXBlIFBhcmFtVHlwZSkgewotICByZXR1cm4gUGFyYW1UeXBlLT5pc1JWYWx1ZVJlZmVyZW5jZVR5cGUoKSB8fAotICAgICAgICAoUGFyYW1UeXBlLT5pc0xWYWx1ZVJlZmVyZW5jZVR5cGUoKSAmJgotICAgICAgICAgIWNhc3Q8TFZhbHVlUmVmZXJlbmNlVHlwZT4oCi0gICAgICAgICAgIFBhcmFtVHlwZS5nZXRDYW5vbmljYWxUeXBlKCkpLT5pc1NwZWxsZWRBc0xWYWx1ZSgpKTsKK3N0YXRpYyBib29sIGlzUlZhbHVlUmVmKFF1YWxUeXBlIFBhcmFtVHlwZSkgeworICByZXR1cm4gUGFyYW1UeXBlLT5pc1JWYWx1ZVJlZmVyZW5jZVR5cGUoKTsKIH0KIAogc3RhdGljIGJvb2wgaXNUZXN0aW5nRnVuY3Rpb24oY29uc3QgRnVuY3Rpb25EZWNsICpGdW5EZWNsKSB7CiAgIHJldHVybiBGdW5EZWNsLT5oYXNBdHRyPFRlc3RUeXBlc3RhdGVBdHRyPigpOwogfQogCi1zdGF0aWMgYm9vbCBpc1ZhbHVlVHlwZShRdWFsVHlwZSBQYXJhbVR5cGUpIHsKLSAgcmV0dXJuICEoUGFyYW1UeXBlLT5pc1BvaW50ZXJUeXBlKCkgfHwgUGFyYW1UeXBlLT5pc1JlZmVyZW5jZVR5cGUoKSk7CitzdGF0aWMgYm9vbCBpc1BvaW50ZXJPclJlZihRdWFsVHlwZSBQYXJhbVR5cGUpIHsKKyAgcmV0dXJuIFBhcmFtVHlwZS0+aXNQb2ludGVyVHlwZSgpIHx8IFBhcmFtVHlwZS0+aXNSZWZlcmVuY2VUeXBlKCk7CiB9CiAKIHN0YXRpYyBDb25zdW1lZFN0YXRlIG1hcENvbnN1bWFibGVBdHRyU3RhdGUoY29uc3QgUXVhbFR5cGUgUVQpIHsKQEAgLTQ1NSwxNSArNDcwLDI5IEBACiAgIENvbnN1bWVkQW5hbHl6ZXIgJkFuYWx5emVyOwogICBDb25zdW1lZFN0YXRlTWFwICpTdGF0ZU1hcDsKICAgTWFwVHlwZSBQcm9wYWdhdGlvbk1hcDsKLSAgdm9pZCBmb3J3YXJkSW5mbyhjb25zdCBTdG10ICpGcm9tLCBjb25zdCBTdG10ICpUbyk7Ci0gIGJvb2wgaXNMaWtlTW92ZUFzc2lnbm1lbnQoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTWV0aG9kRGVjbCk7Ci0gIHZvaWQgcHJvcGFnYXRlUmV0dXJuVHlwZShjb25zdCBTdG10ICpDYWxsLCBjb25zdCBGdW5jdGlvbkRlY2wgKkZ1biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFJldHVyblR5cGUpOworCisgIEluZm9FbnRyeSBmaW5kSW5mbyhjb25zdCBFeHByICpFKSB7CisgICAgcmV0dXJuIFByb3BhZ2F0aW9uTWFwLmZpbmQoRS0+SWdub3JlUGFyZW5zKCkpOworICB9CisgIENvbnN0SW5mb0VudHJ5IGZpbmRJbmZvKGNvbnN0IEV4cHIgKkUpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJvcGFnYXRpb25NYXAuZmluZChFLT5JZ25vcmVQYXJlbnMoKSk7CisgIH0KKyAgdm9pZCBpbnNlcnRJbmZvKGNvbnN0IEV4cHIgKkUsIGNvbnN0IFByb3BhZ2F0aW9uSW5mbyAmUEkpIHsKKyAgICBQcm9wYWdhdGlvbk1hcC5pbnNlcnQoUGFpclR5cGUoRS0+SWdub3JlUGFyZW5zKCksIFBJKSk7CisgIH0KKworICB2b2lkIGZvcndhcmRJbmZvKGNvbnN0IEV4cHIgKkZyb20sIGNvbnN0IEV4cHIgKlRvKTsKKyAgdm9pZCBjb3B5SW5mbyhjb25zdCBFeHByICpGcm9tLCBjb25zdCBFeHByICpUbywgQ29uc3VtZWRTdGF0ZSBDUyk7CisgIENvbnN1bWVkU3RhdGUgZ2V0SW5mbyhjb25zdCBFeHByICpGcm9tKTsKKyAgdm9pZCBzZXRJbmZvKGNvbnN0IEV4cHIgKlRvLCBDb25zdW1lZFN0YXRlIE5TKTsKKyAgdm9pZCBwcm9wYWdhdGVSZXR1cm5UeXBlKGNvbnN0IEV4cHIgKkNhbGwsIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRnVuKTsKIAogcHVibGljOgogICB2b2lkIGNoZWNrQ2FsbGFiaWxpdHkoY29uc3QgUHJvcGFnYXRpb25JbmZvICZQSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRnVuRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEJsYW1lTG9jKTsKKyAgYm9vbCBoYW5kbGVDYWxsKGNvbnN0IENhbGxFeHByICpDYWxsLCBjb25zdCBFeHByICpPYmpBcmcsCisgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkZ1bkQpOwogICAKICAgdm9pZCBWaXNpdEJpbmFyeU9wZXJhdG9yKGNvbnN0IEJpbmFyeU9wZXJhdG9yICpCaW5PcCk7CiAgIHZvaWQgVmlzaXRDYWxsRXhwcihjb25zdCBDYWxsRXhwciAqQ2FsbCk7CkBAIC00ODUsOCArNTE0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lZFN0YXRlTWFwICpTdGF0ZU1hcCkKICAgICAgIDogQUMoQUMpLCBBbmFseXplcihBbmFseXplciksIFN0YXRlTWFwKFN0YXRlTWFwKSB7fQogICAKLSAgUHJvcGFnYXRpb25JbmZvIGdldEluZm8oY29uc3QgU3RtdCAqU3RtdE5vZGUpIGNvbnN0IHsKLSAgICBDb25zdEluZm9FbnRyeSBFbnRyeSA9IFByb3BhZ2F0aW9uTWFwLmZpbmQoU3RtdE5vZGUpOworICBQcm9wYWdhdGlvbkluZm8gZ2V0SW5mbyhjb25zdCBFeHByICpTdG10Tm9kZSkgY29uc3QgeworICAgIENvbnN0SW5mb0VudHJ5IEVudHJ5ID0gZmluZEluZm8oU3RtdE5vZGUpOwogICAgIAogICAgIGlmIChFbnRyeSAhPSBQcm9wYWdhdGlvbk1hcC5lbmQoKSkKICAgICAgIHJldHVybiBFbnRyeS0+c2Vjb25kOwpAQCAtNDk5LDc2ICs1MjgsMTg3IEBACiAgIH0KIH07CiAKKwordm9pZCBDb25zdW1lZFN0bXRWaXNpdG9yOjpmb3J3YXJkSW5mbyhjb25zdCBFeHByICpGcm9tLCBjb25zdCBFeHByICpUbykgeworICBJbmZvRW50cnkgRW50cnkgPSBmaW5kSW5mbyhGcm9tKTsKKyAgaWYgKEVudHJ5ICE9IFByb3BhZ2F0aW9uTWFwLmVuZCgpKQorICAgIGluc2VydEluZm8oVG8sIEVudHJ5LT5zZWNvbmQpOworfQorCisKKy8vIENyZWF0ZSBhIG5ldyBzdGF0ZSBmb3IgVG8sIHdoaWNoIGlzIGluaXRpYWxpemVkIHRvIHRoZSBzdGF0ZSBvZiBGcm9tLgorLy8gSWYgTlMgaXMgbm90IENTX05vbmUsIHNldHMgdGhlIHN0YXRlIG9mIEZyb20gdG8gTlMuCit2b2lkIENvbnN1bWVkU3RtdFZpc2l0b3I6OmNvcHlJbmZvKGNvbnN0IEV4cHIgKkZyb20sIGNvbnN0IEV4cHIgKlRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lZFN0YXRlIE5TKSB7CisgIEluZm9FbnRyeSBFbnRyeSA9IGZpbmRJbmZvKEZyb20pOworICBpZiAoRW50cnkgIT0gUHJvcGFnYXRpb25NYXAuZW5kKCkpIHsKKyAgICBQcm9wYWdhdGlvbkluZm8mIFBJbmZvID0gRW50cnktPnNlY29uZDsKKyAgICBDb25zdW1lZFN0YXRlIENTID0gUEluZm8uZ2V0QXNTdGF0ZShTdGF0ZU1hcCk7CisgICAgaWYgKENTICE9IENTX05vbmUpCisgICAgICBpbnNlcnRJbmZvKFRvLCBQcm9wYWdhdGlvbkluZm8oQ1MpKTsKKyAgICBpZiAoTlMgIT0gQ1NfTm9uZSAmJiBQSW5mby5pc1BvaW50ZXJUb1ZhbHVlKCkpCisgICAgICBzZXRTdGF0ZUZvclZhck9yVG1wKFN0YXRlTWFwLCBQSW5mbywgTlMpOworICB9Cit9CisKKworLy8gR2V0IHRoZSBDb25zdW1lZFN0YXRlIGZvciBGcm9tCitDb25zdW1lZFN0YXRlIENvbnN1bWVkU3RtdFZpc2l0b3I6OmdldEluZm8oY29uc3QgRXhwciAqRnJvbSkgeworICBJbmZvRW50cnkgRW50cnkgPSBmaW5kSW5mbyhGcm9tKTsKKyAgaWYgKEVudHJ5ICE9IFByb3BhZ2F0aW9uTWFwLmVuZCgpKSB7CisgICAgUHJvcGFnYXRpb25JbmZvJiBQSW5mbyA9IEVudHJ5LT5zZWNvbmQ7CisgICAgcmV0dXJuIFBJbmZvLmdldEFzU3RhdGUoU3RhdGVNYXApOworICB9CisgIHJldHVybiBDU19Ob25lOworfQorCisKKy8vIElmIHdlIGFscmVhZHkgaGF2ZSBpbmZvIGZvciBUbyB0aGVuIHVwZGF0ZSBpdCwgb3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBlbnRyeS4KK3ZvaWQgQ29uc3VtZWRTdG10VmlzaXRvcjo6c2V0SW5mbyhjb25zdCBFeHByICpUbywgQ29uc3VtZWRTdGF0ZSBOUykgeworICBJbmZvRW50cnkgRW50cnkgPSBmaW5kSW5mbyhUbyk7CisgIGlmIChFbnRyeSAhPSBQcm9wYWdhdGlvbk1hcC5lbmQoKSkgeworICAgIFByb3BhZ2F0aW9uSW5mbyYgUEluZm8gPSBFbnRyeS0+c2Vjb25kOworICAgIGlmIChQSW5mby5pc1BvaW50ZXJUb1ZhbHVlKCkpCisgICAgICBzZXRTdGF0ZUZvclZhck9yVG1wKFN0YXRlTWFwLCBQSW5mbywgTlMpOworICB9IGVsc2UgaWYgKE5TICE9IENTX05vbmUpIHsKKyAgICAgaW5zZXJ0SW5mbyhUbywgUHJvcGFnYXRpb25JbmZvKE5TKSk7CisgIH0KK30KKworCisKIHZvaWQgQ29uc3VtZWRTdG10VmlzaXRvcjo6Y2hlY2tDYWxsYWJpbGl0eShjb25zdCBQcm9wYWdhdGlvbkluZm8gJlBJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRnVuRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBCbGFtZUxvYykgewogICBhc3NlcnQoIVBJbmZvLmlzVGVzdCgpKTsKLSAgCi0gIGlmICghRnVuRGVjbC0+aGFzQXR0cjxDYWxsYWJsZVdoZW5BdHRyPigpKQotICAgIHJldHVybjsKLSAgCisKICAgY29uc3QgQ2FsbGFibGVXaGVuQXR0ciAqQ1dBdHRyID0gRnVuRGVjbC0+Z2V0QXR0cjxDYWxsYWJsZVdoZW5BdHRyPigpOwotICAKKyAgaWYgKCFDV0F0dHIpCisgICAgcmV0dXJuOworCiAgIGlmIChQSW5mby5pc1ZhcigpKSB7CiAgICAgQ29uc3VtZWRTdGF0ZSBWYXJTdGF0ZSA9IFN0YXRlTWFwLT5nZXRTdGF0ZShQSW5mby5nZXRWYXIoKSk7Ci0gICAgCisKICAgICBpZiAoVmFyU3RhdGUgPT0gQ1NfTm9uZSB8fCBpc0NhbGxhYmxlSW5TdGF0ZShDV0F0dHIsIFZhclN0YXRlKSkKICAgICAgIHJldHVybjsKLSAgICAKKwogICAgIEFuYWx5emVyLldhcm5pbmdzSGFuZGxlci53YXJuVXNlSW5JbnZhbGlkU3RhdGUoCiAgICAgICBGdW5EZWNsLT5nZXROYW1lQXNTdHJpbmcoKSwgUEluZm8uZ2V0VmFyKCktPmdldE5hbWVBc1N0cmluZygpLAogICAgICAgc3RhdGVUb1N0cmluZyhWYXJTdGF0ZSksIEJsYW1lTG9jKTsKLSAgICAKKwogICB9IGVsc2UgewogICAgIENvbnN1bWVkU3RhdGUgVG1wU3RhdGUgPSBQSW5mby5nZXRBc1N0YXRlKFN0YXRlTWFwKTsKLSAgICAKKwogICAgIGlmIChUbXBTdGF0ZSA9PSBDU19Ob25lIHx8IGlzQ2FsbGFibGVJblN0YXRlKENXQXR0ciwgVG1wU3RhdGUpKQogICAgICAgcmV0dXJuOwotICAgIAorCiAgICAgQW5hbHl6ZXIuV2FybmluZ3NIYW5kbGVyLndhcm5Vc2VPZlRlbXBJbkludmFsaWRTdGF0ZSgKICAgICAgIEZ1bkRlY2wtPmdldE5hbWVBc1N0cmluZygpLCBzdGF0ZVRvU3RyaW5nKFRtcFN0YXRlKSwgQmxhbWVMb2MpOwogICB9CiB9CiAKLXZvaWQgQ29uc3VtZWRTdG10VmlzaXRvcjo6Zm9yd2FyZEluZm8oY29uc3QgU3RtdCAqRnJvbSwgY29uc3QgU3RtdCAqVG8pIHsKLSAgSW5mb0VudHJ5IEVudHJ5ID0gUHJvcGFnYXRpb25NYXAuZmluZChGcm9tKTsKLSAgCi0gIGlmIChFbnRyeSAhPSBQcm9wYWdhdGlvbk1hcC5lbmQoKSkKLSAgICBQcm9wYWdhdGlvbk1hcC5pbnNlcnQoUGFpclR5cGUoVG8sIEVudHJ5LT5zZWNvbmQpKTsKKworLy8gRmFjdG9ycyBvdXQgY29tbW9uIGJlaGF2aW9yIGZvciBmdW5jdGlvbiwgbWV0aG9kLCBhbmQgb3BlcmF0b3IgY2FsbHMuCisvLyBDaGVjayBwYXJhbWV0ZXJzIGFuZCBzZXQgcGFyYW1ldGVyIHN0YXRlIGlmIG5lY2Vzc2FyeS4KKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdGUgb2YgT2JqQXJnIGlzIHNldCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBDb25zdW1lZFN0bXRWaXNpdG9yOjpoYW5kbGVDYWxsKGNvbnN0IENhbGxFeHByICpDYWxsLCBjb25zdCBFeHByICpPYmpBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGdW5EKSB7CisgIHVuc2lnbmVkIE9mZnNldCA9IDA7CisgIGlmIChpc2E8Q1hYT3BlcmF0b3JDYWxsRXhwcj4oQ2FsbCkgJiYgaXNhPENYWE1ldGhvZERlY2w+KEZ1bkQpKQorICAgIE9mZnNldCA9IDE7ICAvLyBmaXJzdCBhcmd1bWVudCBpcyAndGhpcycKKworICAvLyBjaGVjayBleHBsaWNpdCBwYXJhbWV0ZXJzCisgIGZvciAodW5zaWduZWQgSW5kZXggPSBPZmZzZXQ7IEluZGV4IDwgQ2FsbC0+Z2V0TnVtQXJncygpOyArK0luZGV4KSB7CisgICAgLy8gU2tpcCB2YXJpYWJsZSBhcmd1bWVudCBsaXN0cy4KKyAgICBpZiAoSW5kZXggLSBPZmZzZXQgPj0gRnVuRC0+Z2V0TnVtUGFyYW1zKCkpCisgICAgICBicmVhazsKKworICAgIGNvbnN0IFBhcm1WYXJEZWNsICpQYXJhbSA9IEZ1bkQtPmdldFBhcmFtRGVjbChJbmRleCAtIE9mZnNldCk7CisgICAgUXVhbFR5cGUgUGFyYW1UeXBlID0gUGFyYW0tPmdldFR5cGUoKTsKKworICAgIEluZm9FbnRyeSBFbnRyeSA9IGZpbmRJbmZvKENhbGwtPmdldEFyZyhJbmRleCkpOworCisgICAgaWYgKEVudHJ5ID09IFByb3BhZ2F0aW9uTWFwLmVuZCgpIHx8IEVudHJ5LT5zZWNvbmQuaXNUZXN0KCkpCisgICAgICBjb250aW51ZTsKKyAgICBQcm9wYWdhdGlvbkluZm8gUEluZm8gPSBFbnRyeS0+c2Vjb25kOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcGFyYW1ldGVyIGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlLgorICAgIGlmIChQYXJhbVR5cGVzdGF0ZUF0dHIgKlBUQSA9IFBhcmFtLT5nZXRBdHRyPFBhcmFtVHlwZXN0YXRlQXR0cj4oKSkgeworICAgICAgQ29uc3VtZWRTdGF0ZSBQYXJhbVN0YXRlID0gUEluZm8uZ2V0QXNTdGF0ZShTdGF0ZU1hcCk7CisgICAgICBDb25zdW1lZFN0YXRlIEV4cGVjdGVkU3RhdGUgPSBtYXBQYXJhbVR5cGVzdGF0ZUF0dHJTdGF0ZShQVEEpOworCisgICAgICBpZiAoUGFyYW1TdGF0ZSAhPSBFeHBlY3RlZFN0YXRlKQorICAgICAgICBBbmFseXplci5XYXJuaW5nc0hhbmRsZXIud2FyblBhcmFtVHlwZXN0YXRlTWlzbWF0Y2goCisgICAgICAgICAgQ2FsbC0+Z2V0QXJnKEluZGV4KS0+Z2V0RXhwckxvYygpLAorICAgICAgICAgIHN0YXRlVG9TdHJpbmcoRXhwZWN0ZWRTdGF0ZSksIHN0YXRlVG9TdHJpbmcoUGFyYW1TdGF0ZSkpOworICAgIH0KKworICAgIGlmICghKEVudHJ5LT5zZWNvbmQuaXNWYXIoKSB8fCBFbnRyeS0+c2Vjb25kLmlzVG1wKCkpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBBZGp1c3Qgc3RhdGUgb24gdGhlIGNhbGxlciBzaWRlLgorICAgIGlmIChpc1JWYWx1ZVJlZihQYXJhbVR5cGUpKQorICAgICAgc2V0U3RhdGVGb3JWYXJPclRtcChTdGF0ZU1hcCwgUEluZm8sIGNvbnN1bWVkOjpDU19Db25zdW1lZCk7CisgICAgZWxzZSBpZiAoUmV0dXJuVHlwZXN0YXRlQXR0ciAqUlQgPSBQYXJhbS0+Z2V0QXR0cjxSZXR1cm5UeXBlc3RhdGVBdHRyPigpKQorICAgICAgc2V0U3RhdGVGb3JWYXJPclRtcChTdGF0ZU1hcCwgUEluZm8sIG1hcFJldHVyblR5cGVzdGF0ZUF0dHJTdGF0ZShSVCkpOworICAgIGVsc2UgaWYgKGlzUG9pbnRlck9yUmVmKFBhcmFtVHlwZSkgJiYKKyAgICAgICAgICAgICAoIVBhcmFtVHlwZS0+Z2V0UG9pbnRlZVR5cGUoKS5pc0NvbnN0UXVhbGlmaWVkKCkgfHwKKyAgICAgICAgICAgICAgaXNTZXRPblJlYWRQdHJUeXBlKFBhcmFtVHlwZSkpKQorICAgICAgc2V0U3RhdGVGb3JWYXJPclRtcChTdGF0ZU1hcCwgUEluZm8sIGNvbnN1bWVkOjpDU19Vbmtub3duKTsKKyAgfQorCisgIGlmICghT2JqQXJnKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBjaGVjayBpbXBsaWNpdCAnc2VsZicgcGFyYW1ldGVyLCBpZiBwcmVzZW50CisgIEluZm9FbnRyeSBFbnRyeSA9IGZpbmRJbmZvKE9iakFyZyk7CisgIGlmIChFbnRyeSAhPSBQcm9wYWdhdGlvbk1hcC5lbmQoKSkgeworICAgIFByb3BhZ2F0aW9uSW5mbyBQSW5mbyA9IEVudHJ5LT5zZWNvbmQ7CisgICAgY2hlY2tDYWxsYWJpbGl0eShQSW5mbywgRnVuRCwgQ2FsbC0+Z2V0RXhwckxvYygpKTsKKworICAgIGlmIChTZXRUeXBlc3RhdGVBdHRyICpTVEEgPSBGdW5ELT5nZXRBdHRyPFNldFR5cGVzdGF0ZUF0dHI+KCkpIHsKKyAgICAgIGlmIChQSW5mby5pc1ZhcigpKSB7CisgICAgICAgIFN0YXRlTWFwLT5zZXRTdGF0ZShQSW5mby5nZXRWYXIoKSwgbWFwU2V0VHlwZXN0YXRlQXR0clN0YXRlKFNUQSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKFBJbmZvLmlzVG1wKCkpIHsKKyAgICAgICAgU3RhdGVNYXAtPnNldFN0YXRlKFBJbmZvLmdldFRtcCgpLCBtYXBTZXRUeXBlc3RhdGVBdHRyU3RhdGUoU1RBKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChpc1Rlc3RpbmdGdW5jdGlvbihGdW5EKSAmJiBQSW5mby5pc1ZhcigpKSB7CisgICAgICBQcm9wYWdhdGlvbk1hcC5pbnNlcnQoUGFpclR5cGUoQ2FsbCwKKyAgICAgICAgUHJvcGFnYXRpb25JbmZvKFBJbmZvLmdldFZhcigpLCB0ZXN0c0ZvcihGdW5EKSkpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIENvbnN1bWVkU3RtdFZpc2l0b3I6OmlzTGlrZU1vdmVBc3NpZ25tZW50KAotICBjb25zdCBDWFhNZXRob2REZWNsICpNZXRob2REZWNsKSB7Ci0gIAotICByZXR1cm4gTWV0aG9kRGVjbC0+aXNNb3ZlQXNzaWdubWVudE9wZXJhdG9yKCkgfHwKLSAgICAgICAgIChNZXRob2REZWNsLT5nZXRPdmVybG9hZGVkT3BlcmF0b3IoKSA9PSBPT19FcXVhbCAmJgotICAgICAgICAgIE1ldGhvZERlY2wtPmdldE51bVBhcmFtcygpID09IDEgJiYKLSAgICAgICAgICBNZXRob2REZWNsLT5nZXRQYXJhbURlY2woMCktPmdldFR5cGUoKS0+aXNSVmFsdWVSZWZlcmVuY2VUeXBlKCkpOwotfQogCi12b2lkIENvbnN1bWVkU3RtdFZpc2l0b3I6OnByb3BhZ2F0ZVJldHVyblR5cGUoY29uc3QgU3RtdCAqQ2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkZ1biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBSZXR1cm5UeXBlKSB7Ci0gIGlmIChpc0NvbnN1bWFibGVUeXBlKFJldHVyblR5cGUpKSB7Ci0gICAgCit2b2lkIENvbnN1bWVkU3RtdFZpc2l0b3I6OnByb3BhZ2F0ZVJldHVyblR5cGUoY29uc3QgRXhwciAqQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkZ1bikgeworICBRdWFsVHlwZSBSZXRUeXBlID0gRnVuLT5nZXRDYWxsUmVzdWx0VHlwZSgpOworICBpZiAoUmV0VHlwZS0+aXNSZWZlcmVuY2VUeXBlKCkpCisgICAgUmV0VHlwZSA9IFJldFR5cGUtPmdldFBvaW50ZWVUeXBlKCk7CisKKyAgaWYgKGlzQ29uc3VtYWJsZVR5cGUoUmV0VHlwZSkpIHsKICAgICBDb25zdW1lZFN0YXRlIFJldHVyblN0YXRlOwotICAgIAotICAgIGlmIChGdW4tPmhhc0F0dHI8UmV0dXJuVHlwZXN0YXRlQXR0cj4oKSkKLSAgICAgIFJldHVyblN0YXRlID0gbWFwUmV0dXJuVHlwZXN0YXRlQXR0clN0YXRlKAotICAgICAgICBGdW4tPmdldEF0dHI8UmV0dXJuVHlwZXN0YXRlQXR0cj4oKSk7CisgICAgaWYgKFJldHVyblR5cGVzdGF0ZUF0dHIgKlJUQSA9IEZ1bi0+Z2V0QXR0cjxSZXR1cm5UeXBlc3RhdGVBdHRyPigpKQorICAgICAgUmV0dXJuU3RhdGUgPSBtYXBSZXR1cm5UeXBlc3RhdGVBdHRyU3RhdGUoUlRBKTsKICAgICBlbHNlCi0gICAgICBSZXR1cm5TdGF0ZSA9IG1hcENvbnN1bWFibGVBdHRyU3RhdGUoUmV0dXJuVHlwZSk7CisgICAgICBSZXR1cm5TdGF0ZSA9IG1hcENvbnN1bWFibGVBdHRyU3RhdGUoUmV0VHlwZSk7CiAgICAgCiAgICAgUHJvcGFnYXRpb25NYXAuaW5zZXJ0KFBhaXJUeXBlKENhbGwsIFByb3BhZ2F0aW9uSW5mbyhSZXR1cm5TdGF0ZSkpKTsKICAgfQogfQogCisKIHZvaWQgQ29uc3VtZWRTdG10VmlzaXRvcjo6VmlzaXRCaW5hcnlPcGVyYXRvcihjb25zdCBCaW5hcnlPcGVyYXRvciAqQmluT3ApIHsKICAgc3dpdGNoIChCaW5PcC0+Z2V0T3Bjb2RlKCkpIHsKICAgY2FzZSBCT19MQW5kOgogICBjYXNlIEJPX0xPciA6IHsKLSAgICBJbmZvRW50cnkgTEVudHJ5ID0gUHJvcGFnYXRpb25NYXAuZmluZChCaW5PcC0+Z2V0TEhTKCkpLAotICAgICAgICAgICAgICBSRW50cnkgPSBQcm9wYWdhdGlvbk1hcC5maW5kKEJpbk9wLT5nZXRSSFMoKSk7CisgICAgSW5mb0VudHJ5IExFbnRyeSA9IGZpbmRJbmZvKEJpbk9wLT5nZXRMSFMoKSksCisgICAgICAgICAgICAgIFJFbnRyeSA9IGZpbmRJbmZvKEJpbk9wLT5nZXRSSFMoKSk7CiAgICAgCiAgICAgVmFyVGVzdFJlc3VsdCBMVGVzdCwgUlRlc3Q7CiAgICAgCkBAIC02MDUsNjkgKzc0NSwzMiBAQAogICB9CiB9CiAKK3N0YXRpYyBib29sIGlzU3RkTmFtZXNwYWNlKGNvbnN0IERlY2xDb250ZXh0ICpEQykgeworICBpZiAoIURDLT5pc05hbWVzcGFjZSgpKSByZXR1cm4gZmFsc2U7CisgIHdoaWxlIChEQy0+Z2V0UGFyZW50KCktPmlzTmFtZXNwYWNlKCkpCisgICAgREMgPSBEQy0+Z2V0UGFyZW50KCk7CisgIGNvbnN0IE5hbWVzcGFjZURlY2wgKk5EID0gZHluX2Nhc3Q8TmFtZXNwYWNlRGVjbD4oREMpOworCisgIHJldHVybiBORCAmJiBORC0+Z2V0TmFtZSgpID09ICJzdGQiICYmCisgICAgICAgICBORC0+Z2V0RGVjbENvbnRleHQoKS0+aXNUcmFuc2xhdGlvblVuaXQoKTsKK30KKwogdm9pZCBDb25zdW1lZFN0bXRWaXNpdG9yOjpWaXNpdENhbGxFeHByKGNvbnN0IENhbGxFeHByICpDYWxsKSB7Ci0gIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKkZ1bkRlY2wgPQotICAgIGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb25EZWNsPihDYWxsLT5nZXREaXJlY3RDYWxsZWUoKSkpIHsKLSAgICAKLSAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRoZSBzdGQ6Om1vdmUgZnVuY3Rpb24uCi0gICAgLy8gVE9ETzogTWFrZSB0aGlzIG1vcmUgc3BlY2lmaWMuIChEZWZlcnJlZCkKLSAgICBpZiAoRnVuRGVjbC0+Z2V0TmFtZUFzU3RyaW5nKCkgPT0gIm1vdmUiKSB7Ci0gICAgICBmb3J3YXJkSW5mbyhDYWxsLT5nZXRBcmcoMCksIENhbGwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICB1bnNpZ25lZCBPZmZzZXQgPSBDYWxsLT5nZXROdW1BcmdzKCkgLSBGdW5EZWNsLT5nZXROdW1QYXJhbXMoKTsKLSAgICAKLSAgICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gT2Zmc2V0OyBJbmRleCA8IENhbGwtPmdldE51bUFyZ3MoKTsgKytJbmRleCkgewotICAgICAgY29uc3QgUGFybVZhckRlY2wgKlBhcmFtID0gRnVuRGVjbC0+Z2V0UGFyYW1EZWNsKEluZGV4IC0gT2Zmc2V0KTsKLSAgICAgIFF1YWxUeXBlIFBhcmFtVHlwZSA9IFBhcmFtLT5nZXRUeXBlKCk7Ci0gICAgICAKLSAgICAgIEluZm9FbnRyeSBFbnRyeSA9IFByb3BhZ2F0aW9uTWFwLmZpbmQoQ2FsbC0+Z2V0QXJnKEluZGV4KSk7Ci0gICAgICAKLSAgICAgIGlmIChFbnRyeSA9PSBQcm9wYWdhdGlvbk1hcC5lbmQoKSB8fCBFbnRyeS0+c2Vjb25kLmlzVGVzdCgpKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIAotICAgICAgUHJvcGFnYXRpb25JbmZvIFBJbmZvID0gRW50cnktPnNlY29uZDsKLSAgICAgIAotICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcGFyYW1ldGVyIGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlLgotICAgICAgCi0gICAgICBpZiAoUGFyYW0tPmhhc0F0dHI8UGFyYW1UeXBlc3RhdGVBdHRyPigpKSB7Ci0gICAgICAgIENvbnN1bWVkU3RhdGUgUGFyYW1TdGF0ZSA9IFBJbmZvLmdldEFzU3RhdGUoU3RhdGVNYXApOwotICAgICAgICAKLSAgICAgICAgQ29uc3VtZWRTdGF0ZSBFeHBlY3RlZFN0YXRlID0KLSAgICAgICAgICBtYXBQYXJhbVR5cGVzdGF0ZUF0dHJTdGF0ZShQYXJhbS0+Z2V0QXR0cjxQYXJhbVR5cGVzdGF0ZUF0dHI+KCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKFBhcmFtU3RhdGUgIT0gRXhwZWN0ZWRTdGF0ZSkKLSAgICAgICAgICBBbmFseXplci5XYXJuaW5nc0hhbmRsZXIud2FyblBhcmFtVHlwZXN0YXRlTWlzbWF0Y2goCi0gICAgICAgICAgICBDYWxsLT5nZXRBcmcoSW5kZXggLSBPZmZzZXQpLT5nZXRFeHByTG9jKCksCi0gICAgICAgICAgICBzdGF0ZVRvU3RyaW5nKEV4cGVjdGVkU3RhdGUpLCBzdGF0ZVRvU3RyaW5nKFBhcmFtU3RhdGUpKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKCEoRW50cnktPnNlY29uZC5pc1ZhcigpIHx8IEVudHJ5LT5zZWNvbmQuaXNUbXAoKSkpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgCi0gICAgICAvLyBBZGp1c3Qgc3RhdGUgb24gdGhlIGNhbGxlciBzaWRlLgotICAgICAgCi0gICAgICBpZiAoaXNSVmFsdWVSZWZpc2goUGFyYW1UeXBlKSkgewotICAgICAgICBzZXRTdGF0ZUZvclZhck9yVG1wKFN0YXRlTWFwLCBQSW5mbywgY29uc3VtZWQ6OkNTX0NvbnN1bWVkKTsKLSAgICAgICAgCi0gICAgICB9IGVsc2UgaWYgKFBhcmFtLT5oYXNBdHRyPFJldHVyblR5cGVzdGF0ZUF0dHI+KCkpIHsKLSAgICAgICAgc2V0U3RhdGVGb3JWYXJPclRtcChTdGF0ZU1hcCwgUEluZm8sCi0gICAgICAgICAgbWFwUmV0dXJuVHlwZXN0YXRlQXR0clN0YXRlKFBhcmFtLT5nZXRBdHRyPFJldHVyblR5cGVzdGF0ZUF0dHI+KCkpKTsKLSAgICAgICAgCi0gICAgICB9IGVsc2UgaWYgKCFpc1ZhbHVlVHlwZShQYXJhbVR5cGUpICYmCi0gICAgICAgICAgICAgICAgICFQYXJhbVR5cGUtPmdldFBvaW50ZWVUeXBlKCkuaXNDb25zdFF1YWxpZmllZCgpKSB7Ci0gICAgICAgIAotICAgICAgICBzZXRTdGF0ZUZvclZhck9yVG1wKFN0YXRlTWFwLCBQSW5mbywgY29uc3VtZWQ6OkNTX1Vua25vd24pOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBRdWFsVHlwZSBSZXRUeXBlID0gRnVuRGVjbC0+Z2V0Q2FsbFJlc3VsdFR5cGUoKTsKLSAgICBpZiAoUmV0VHlwZS0+aXNSZWZlcmVuY2VUeXBlKCkpCi0gICAgICBSZXRUeXBlID0gUmV0VHlwZS0+Z2V0UG9pbnRlZVR5cGUoKTsKLSAgICAKLSAgICBwcm9wYWdhdGVSZXR1cm5UeXBlKENhbGwsIEZ1bkRlY2wsIFJldFR5cGUpOworICBjb25zdCBGdW5jdGlvbkRlY2wgKkZ1bkRlY2wgPSBDYWxsLT5nZXREaXJlY3RDYWxsZWUoKTsKKyAgaWYgKCFGdW5EZWNsKQorICAgIHJldHVybjsKKworICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRoZSBzdGQ6Om1vdmUgZnVuY3Rpb24uCisgIC8vIFRPRE86IE1ha2UgdGhpcyBtb3JlIHNwZWNpZmljLiAoRGVmZXJyZWQpCisgIGlmIChDYWxsLT5nZXROdW1BcmdzKCkgPT0gMSAmJgorICAgICAgRnVuRGVjbC0+Z2V0TmFtZUFzU3RyaW5nKCkgPT0gIm1vdmUiICYmCisgICAgICBpc1N0ZE5hbWVzcGFjZShGdW5EZWNsLT5nZXREZWNsQ29udGV4dCgpKSkgeworICAgIGNvcHlJbmZvKENhbGwtPmdldEFyZygwKSwgQ2FsbCwgQ1NfQ29uc3VtZWQpOworICAgIHJldHVybjsKICAgfQorCisgIGhhbmRsZUNhbGwoQ2FsbCwgMCwgRnVuRGVjbCk7CisgIHByb3BhZ2F0ZVJldHVyblR5cGUoQ2FsbCwgRnVuRGVjbCk7CiB9CiAKIHZvaWQgQ29uc3VtZWRTdG10VmlzaXRvcjo6VmlzaXRDYXN0RXhwcihjb25zdCBDYXN0RXhwciAqQ2FzdCkgewpAQCAtNjc3LDcgKzc4MCw3IEBACiB2b2lkIENvbnN1bWVkU3RtdFZpc2l0b3I6OlZpc2l0Q1hYQmluZFRlbXBvcmFyeUV4cHIoCiAgIGNvbnN0IENYWEJpbmRUZW1wb3JhcnlFeHByICpUZW1wKSB7CiAgIAotICBJbmZvRW50cnkgRW50cnkgPSBQcm9wYWdhdGlvbk1hcC5maW5kKFRlbXAtPmdldFN1YkV4cHIoKSk7CisgIEluZm9FbnRyeSBFbnRyeSA9IGZpbmRJbmZvKFRlbXAtPmdldFN1YkV4cHIoKSk7CiAgIAogICBpZiAoRW50cnkgIT0gUHJvcGFnYXRpb25NYXAuZW5kKCkgJiYgIUVudHJ5LT5zZWNvbmQuaXNUZXN0KCkpIHsKICAgICBTdGF0ZU1hcC0+c2V0U3RhdGUoVGVtcCwgRW50cnktPnNlY29uZC5nZXRBc1N0YXRlKFN0YXRlTWFwKSk7CkBAIC02OTUsMTY4ICs3OTgsNjAgQEAKICAgICByZXR1cm47CiAgIAogICAvLyBGSVhNRTogV2hhdCBzaG91bGQgaGFwcGVuIGlmIHNvbWVvbmUgYW5ub3RhdGVzIHRoZSBtb3ZlIGNvbnN0cnVjdG9yPwotICBpZiAoQ29uc3RydWN0b3ItPmhhc0F0dHI8UmV0dXJuVHlwZXN0YXRlQXR0cj4oKSkgewotICAgIC8vIFRPRE86IEFkanVzdCBzdGF0ZSBvZiBhcmdzIGFwcHJvcHJpYXRlbHkuCi0gICAgCi0gICAgUmV0dXJuVHlwZXN0YXRlQXR0ciAqUlRBdHRyID0gQ29uc3RydWN0b3ItPmdldEF0dHI8UmV0dXJuVHlwZXN0YXRlQXR0cj4oKTsKLSAgICBDb25zdW1lZFN0YXRlIFJldFN0YXRlID0gbWFwUmV0dXJuVHlwZXN0YXRlQXR0clN0YXRlKFJUQXR0cik7CisgIGlmIChSZXR1cm5UeXBlc3RhdGVBdHRyICpSVEEgPSBDb25zdHJ1Y3Rvci0+Z2V0QXR0cjxSZXR1cm5UeXBlc3RhdGVBdHRyPigpKSB7CisgICAgLy8gVE9ETzogQWRqdXN0IHN0YXRlIG9mIGFyZ3MgYXBwcm9wcmlhdGVseS4gICAgCisgICAgQ29uc3VtZWRTdGF0ZSBSZXRTdGF0ZSA9IG1hcFJldHVyblR5cGVzdGF0ZUF0dHJTdGF0ZShSVEEpOwogICAgIFByb3BhZ2F0aW9uTWFwLmluc2VydChQYWlyVHlwZShDYWxsLCBQcm9wYWdhdGlvbkluZm8oUmV0U3RhdGUpKSk7Ci0gICAgCiAgIH0gZWxzZSBpZiAoQ29uc3RydWN0b3ItPmlzRGVmYXVsdENvbnN0cnVjdG9yKCkpIHsKLSAgICAKICAgICBQcm9wYWdhdGlvbk1hcC5pbnNlcnQoUGFpclR5cGUoQ2FsbCwKICAgICAgIFByb3BhZ2F0aW9uSW5mbyhjb25zdW1lZDo6Q1NfQ29uc3VtZWQpKSk7Ci0gICAgCiAgIH0gZWxzZSBpZiAoQ29uc3RydWN0b3ItPmlzTW92ZUNvbnN0cnVjdG9yKCkpIHsKLSAgICAKLSAgICBJbmZvRW50cnkgRW50cnkgPSBQcm9wYWdhdGlvbk1hcC5maW5kKENhbGwtPmdldEFyZygwKSk7Ci0gICAgCi0gICAgaWYgKEVudHJ5ICE9IFByb3BhZ2F0aW9uTWFwLmVuZCgpKSB7Ci0gICAgICBQcm9wYWdhdGlvbkluZm8gUEluZm8gPSBFbnRyeS0+c2Vjb25kOwotICAgICAgCi0gICAgICBpZiAoUEluZm8uaXNWYXIoKSkgewotICAgICAgICBjb25zdCBWYXJEZWNsKiBWYXIgPSBQSW5mby5nZXRWYXIoKTsKLSAgICAgICAgCi0gICAgICAgIFByb3BhZ2F0aW9uTWFwLmluc2VydChQYWlyVHlwZShDYWxsLAotICAgICAgICAgIFByb3BhZ2F0aW9uSW5mbyhTdGF0ZU1hcC0+Z2V0U3RhdGUoVmFyKSkpKTsKLSAgICAgICAgCi0gICAgICAgIFN0YXRlTWFwLT5zZXRTdGF0ZShWYXIsIGNvbnN1bWVkOjpDU19Db25zdW1lZCk7Ci0gICAgICAgIAotICAgICAgfSBlbHNlIGlmIChQSW5mby5pc1RtcCgpKSB7Ci0gICAgICAgIGNvbnN0IENYWEJpbmRUZW1wb3JhcnlFeHByICpUbXAgPSBQSW5mby5nZXRUbXAoKTsKLSAgICAgICAgCi0gICAgICAgIFByb3BhZ2F0aW9uTWFwLmluc2VydChQYWlyVHlwZShDYWxsLAotICAgICAgICAgIFByb3BhZ2F0aW9uSW5mbyhTdGF0ZU1hcC0+Z2V0U3RhdGUoVG1wKSkpKTsKLSAgICAgICAgCi0gICAgICAgIFN0YXRlTWFwLT5zZXRTdGF0ZShUbXAsIGNvbnN1bWVkOjpDU19Db25zdW1lZCk7Ci0gICAgICAgIAotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUHJvcGFnYXRpb25NYXAuaW5zZXJ0KFBhaXJUeXBlKENhbGwsIFBJbmZvKSk7Ci0gICAgICB9Ci0gICAgfQorICAgIGNvcHlJbmZvKENhbGwtPmdldEFyZygwKSwgQ2FsbCwgQ1NfQ29uc3VtZWQpOwogICB9IGVsc2UgaWYgKENvbnN0cnVjdG9yLT5pc0NvcHlDb25zdHJ1Y3RvcigpKSB7Ci0gICAgZm9yd2FyZEluZm8oQ2FsbC0+Z2V0QXJnKDApLCBDYWxsKTsKLSAgICAKKyAgICAvLyBDb3B5IHN0YXRlIGZyb20gYXJnLiAgSWYgc2V0U3RhdGVPblJlYWQgdGhlbiBzZXQgYXJnIHRvIENTX1Vua25vd24uCisgICAgQ29uc3VtZWRTdGF0ZSBOUyA9CisgICAgICBpc1NldE9uUmVhZFB0clR5cGUoQ29uc3RydWN0b3ItPmdldFRoaXNUeXBlKEN1cnJDb250ZXh0KSkgPworICAgICAgQ1NfVW5rbm93biA6IENTX05vbmU7CisgICAgY29weUluZm8oQ2FsbC0+Z2V0QXJnKDApLCBDYWxsLCBOUyk7CiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETzogQWRqdXN0IHN0YXRlIG9mIGFyZ3MgYXBwcm9wcmlhdGVseS4KLSAgICAKICAgICBDb25zdW1lZFN0YXRlIFJldFN0YXRlID0gbWFwQ29uc3VtYWJsZUF0dHJTdGF0ZShUaGlzVHlwZSk7CiAgICAgUHJvcGFnYXRpb25NYXAuaW5zZXJ0KFBhaXJUeXBlKENhbGwsIFByb3BhZ2F0aW9uSW5mbyhSZXRTdGF0ZSkpKTsKICAgfQogfQogCisKIHZvaWQgQ29uc3VtZWRTdG10VmlzaXRvcjo6VmlzaXRDWFhNZW1iZXJDYWxsRXhwcigKLSAgY29uc3QgQ1hYTWVtYmVyQ2FsbEV4cHIgKkNhbGwpIHsKLSAgCi0gIFZpc2l0Q2FsbEV4cHIoQ2FsbCk7Ci0gIAotICBJbmZvRW50cnkgRW50cnkgPSBQcm9wYWdhdGlvbk1hcC5maW5kKENhbGwtPmdldENhbGxlZSgpLT5JZ25vcmVQYXJlbnMoKSk7Ci0gIAotICBpZiAoRW50cnkgIT0gUHJvcGFnYXRpb25NYXAuZW5kKCkpIHsKLSAgICBQcm9wYWdhdGlvbkluZm8gUEluZm8gPSBFbnRyeS0+c2Vjb25kOwotICAgIGNvbnN0IENYWE1ldGhvZERlY2wgKk1ldGhvZERlY2wgPSBDYWxsLT5nZXRNZXRob2REZWNsKCk7Ci0gICAgCi0gICAgY2hlY2tDYWxsYWJpbGl0eShQSW5mbywgTWV0aG9kRGVjbCwgQ2FsbC0+Z2V0RXhwckxvYygpKTsKLSAgICAKLSAgICBpZiAoUEluZm8uaXNWYXIoKSkgewotICAgICAgaWYgKGlzVGVzdGluZ0Z1bmN0aW9uKE1ldGhvZERlY2wpKQotICAgICAgICBQcm9wYWdhdGlvbk1hcC5pbnNlcnQoUGFpclR5cGUoQ2FsbCwKLSAgICAgICAgICBQcm9wYWdhdGlvbkluZm8oUEluZm8uZ2V0VmFyKCksIHRlc3RzRm9yKE1ldGhvZERlY2wpKSkpOwotICAgICAgZWxzZSBpZiAoTWV0aG9kRGVjbC0+aGFzQXR0cjxTZXRUeXBlc3RhdGVBdHRyPigpKQotICAgICAgICBTdGF0ZU1hcC0+c2V0U3RhdGUoUEluZm8uZ2V0VmFyKCksCi0gICAgICAgICAgbWFwU2V0VHlwZXN0YXRlQXR0clN0YXRlKE1ldGhvZERlY2wtPmdldEF0dHI8U2V0VHlwZXN0YXRlQXR0cj4oKSkpOwotICAgIH0gZWxzZSBpZiAoUEluZm8uaXNUbXAoKSAmJiBNZXRob2REZWNsLT5oYXNBdHRyPFNldFR5cGVzdGF0ZUF0dHI+KCkpIHsKLSAgICAgIFN0YXRlTWFwLT5zZXRTdGF0ZShQSW5mby5nZXRUbXAoKSwKLSAgICAgICAgbWFwU2V0VHlwZXN0YXRlQXR0clN0YXRlKE1ldGhvZERlY2wtPmdldEF0dHI8U2V0VHlwZXN0YXRlQXR0cj4oKSkpOwotICAgIH0KLSAgfQorICAgIGNvbnN0IENYWE1lbWJlckNhbGxFeHByICpDYWxsKSB7CisgIENYWE1ldGhvZERlY2wqIE1EID0gQ2FsbC0+Z2V0TWV0aG9kRGVjbCgpOworICBpZiAoIU1EKQorICAgIHJldHVybjsKKworICBoYW5kbGVDYWxsKENhbGwsIENhbGwtPmdldEltcGxpY2l0T2JqZWN0QXJndW1lbnQoKSwgTUQpOworICBwcm9wYWdhdGVSZXR1cm5UeXBlKENhbGwsIE1EKTsKIH0KIAorCiB2b2lkIENvbnN1bWVkU3RtdFZpc2l0b3I6OlZpc2l0Q1hYT3BlcmF0b3JDYWxsRXhwcigKLSAgY29uc3QgQ1hYT3BlcmF0b3JDYWxsRXhwciAqQ2FsbCkgewotICAKKyAgICBjb25zdCBDWFhPcGVyYXRvckNhbGxFeHByICpDYWxsKSB7CisKICAgY29uc3QgRnVuY3Rpb25EZWNsICpGdW5EZWNsID0KICAgICBkeW5fY2FzdF9vcl9udWxsPEZ1bmN0aW9uRGVjbD4oQ2FsbC0+Z2V0RGlyZWN0Q2FsbGVlKCkpOwotICAKICAgaWYgKCFGdW5EZWNsKSByZXR1cm47Ci0gICAgCi0gIGlmIChpc2E8Q1hYTWV0aG9kRGVjbD4oRnVuRGVjbCkgJiYKLSAgICAgIGlzTGlrZU1vdmVBc3NpZ25tZW50KGNhc3Q8Q1hYTWV0aG9kRGVjbD4oRnVuRGVjbCkpKSB7Ci0gICAgCi0gICAgSW5mb0VudHJ5IExFbnRyeSA9IFByb3BhZ2F0aW9uTWFwLmZpbmQoQ2FsbC0+Z2V0QXJnKDApKTsKLSAgICBJbmZvRW50cnkgUkVudHJ5ID0gUHJvcGFnYXRpb25NYXAuZmluZChDYWxsLT5nZXRBcmcoMSkpOwotICAgIAotICAgIFByb3BhZ2F0aW9uSW5mbyBMUEluZm8sIFJQSW5mbzsKLSAgICAKLSAgICBpZiAoTEVudHJ5ICE9IFByb3BhZ2F0aW9uTWFwLmVuZCgpICYmCi0gICAgICAgIFJFbnRyeSAhPSBQcm9wYWdhdGlvbk1hcC5lbmQoKSkgewotICAgICAgCi0gICAgICBMUEluZm8gPSBMRW50cnktPnNlY29uZDsKLSAgICAgIFJQSW5mbyA9IFJFbnRyeS0+c2Vjb25kOwotICAgICAgCi0gICAgICBpZiAoTFBJbmZvLmlzUG9pbnRlclRvVmFsdWUoKSAmJiBSUEluZm8uaXNQb2ludGVyVG9WYWx1ZSgpKSB7Ci0gICAgICAgIHNldFN0YXRlRm9yVmFyT3JUbXAoU3RhdGVNYXAsIExQSW5mbywgUlBJbmZvLmdldEFzU3RhdGUoU3RhdGVNYXApKTsKLSAgICAgICAgUHJvcGFnYXRpb25NYXAuaW5zZXJ0KFBhaXJUeXBlKENhbGwsIExQSW5mbykpOwotICAgICAgICBzZXRTdGF0ZUZvclZhck9yVG1wKFN0YXRlTWFwLCBSUEluZm8sIGNvbnN1bWVkOjpDU19Db25zdW1lZCk7Ci0gICAgICAgIAotICAgICAgfSBlbHNlIGlmIChSUEluZm8uaXNTdGF0ZSgpKSB7Ci0gICAgICAgIHNldFN0YXRlRm9yVmFyT3JUbXAoU3RhdGVNYXAsIExQSW5mbywgUlBJbmZvLmdldFN0YXRlKCkpOwotICAgICAgICBQcm9wYWdhdGlvbk1hcC5pbnNlcnQoUGFpclR5cGUoQ2FsbCwgTFBJbmZvKSk7Ci0gICAgICAgIAotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2V0U3RhdGVGb3JWYXJPclRtcChTdGF0ZU1hcCwgUlBJbmZvLCBjb25zdW1lZDo6Q1NfQ29uc3VtZWQpOwotICAgICAgfQotICAgICAgCi0gICAgfSBlbHNlIGlmIChMRW50cnkgIT0gUHJvcGFnYXRpb25NYXAuZW5kKCkgJiYKLSAgICAgICAgICAgICAgIFJFbnRyeSA9PSBQcm9wYWdhdGlvbk1hcC5lbmQoKSkgewotICAgICAgCi0gICAgICBMUEluZm8gPSBMRW50cnktPnNlY29uZDsKLSAgICAgIAotICAgICAgYXNzZXJ0KCFMUEluZm8uaXNUZXN0KCkpOwotICAgICAgCi0gICAgICBpZiAoTFBJbmZvLmlzUG9pbnRlclRvVmFsdWUoKSkgewotICAgICAgICBzZXRTdGF0ZUZvclZhck9yVG1wKFN0YXRlTWFwLCBMUEluZm8sIGNvbnN1bWVkOjpDU19Vbmtub3duKTsKLSAgICAgICAgUHJvcGFnYXRpb25NYXAuaW5zZXJ0KFBhaXJUeXBlKENhbGwsIExQSW5mbykpOwotICAgICAgICAKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFByb3BhZ2F0aW9uTWFwLmluc2VydChQYWlyVHlwZShDYWxsLAotICAgICAgICAgIFByb3BhZ2F0aW9uSW5mbyhjb25zdW1lZDo6Q1NfVW5rbm93bikpKTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0gZWxzZSBpZiAoTEVudHJ5ID09IFByb3BhZ2F0aW9uTWFwLmVuZCgpICYmCi0gICAgICAgICAgICAgICBSRW50cnkgIT0gUHJvcGFnYXRpb25NYXAuZW5kKCkpIHsKLSAgICAgIAotICAgICAgUlBJbmZvID0gUkVudHJ5LT5zZWNvbmQ7Ci0gICAgICAKLSAgICAgIGlmIChSUEluZm8uaXNQb2ludGVyVG9WYWx1ZSgpKQotICAgICAgICBzZXRTdGF0ZUZvclZhck9yVG1wKFN0YXRlTWFwLCBSUEluZm8sIGNvbnN1bWVkOjpDU19Db25zdW1lZCk7Ci0gICAgfQotICAgIAotICB9IGVsc2UgewotICAgIAotICAgIFZpc2l0Q2FsbEV4cHIoQ2FsbCk7Ci0gICAgCi0gICAgSW5mb0VudHJ5IEVudHJ5ID0gUHJvcGFnYXRpb25NYXAuZmluZChDYWxsLT5nZXRBcmcoMCkpOwotICAgIAotICAgIGlmIChFbnRyeSAhPSBQcm9wYWdhdGlvbk1hcC5lbmQoKSkgewotICAgICAgUHJvcGFnYXRpb25JbmZvIFBJbmZvID0gRW50cnktPnNlY29uZDsKLSAgICAgIAotICAgICAgY2hlY2tDYWxsYWJpbGl0eShQSW5mbywgRnVuRGVjbCwgQ2FsbC0+Z2V0RXhwckxvYygpKTsKLSAgICAgIAotICAgICAgaWYgKFBJbmZvLmlzVmFyKCkpIHsKLSAgICAgICAgaWYgKGlzVGVzdGluZ0Z1bmN0aW9uKEZ1bkRlY2wpKQotICAgICAgICAgIFByb3BhZ2F0aW9uTWFwLmluc2VydChQYWlyVHlwZShDYWxsLAotICAgICAgICAgICAgUHJvcGFnYXRpb25JbmZvKFBJbmZvLmdldFZhcigpLCB0ZXN0c0ZvcihGdW5EZWNsKSkpKTsKLSAgICAgICAgZWxzZSBpZiAoRnVuRGVjbC0+aGFzQXR0cjxTZXRUeXBlc3RhdGVBdHRyPigpKQotICAgICAgICAgIFN0YXRlTWFwLT5zZXRTdGF0ZShQSW5mby5nZXRWYXIoKSwKLSAgICAgICAgICAgIG1hcFNldFR5cGVzdGF0ZUF0dHJTdGF0ZShGdW5EZWNsLT5nZXRBdHRyPFNldFR5cGVzdGF0ZUF0dHI+KCkpKTsKLSAgICAgICAgCi0gICAgICB9IGVsc2UgaWYgKFBJbmZvLmlzVG1wKCkgJiYgRnVuRGVjbC0+aGFzQXR0cjxTZXRUeXBlc3RhdGVBdHRyPigpKSB7Ci0gICAgICAgIFN0YXRlTWFwLT5zZXRTdGF0ZShQSW5mby5nZXRUbXAoKSwKLSAgICAgICAgICBtYXBTZXRUeXBlc3RhdGVBdHRyU3RhdGUoRnVuRGVjbC0+Z2V0QXR0cjxTZXRUeXBlc3RhdGVBdHRyPigpKSk7Ci0gICAgfQotICAgIH0KKworICBpZiAoQ2FsbC0+Z2V0T3BlcmF0b3IoKSA9PSBPT19FcXVhbCkgeworICAgIENvbnN1bWVkU3RhdGUgQ1MgPSBnZXRJbmZvKENhbGwtPmdldEFyZygxKSk7CisgICAgaWYgKCFoYW5kbGVDYWxsKENhbGwsIENhbGwtPmdldEFyZygwKSwgRnVuRGVjbCkpCisgICAgICBzZXRJbmZvKENhbGwtPmdldEFyZygwKSwgQ1MpOworICAgIHJldHVybjsKICAgfQorCisgIGlmIChjb25zdCBDWFhNZW1iZXJDYWxsRXhwciAqTUNhbGwgPSBkeW5fY2FzdDxDWFhNZW1iZXJDYWxsRXhwcj4oQ2FsbCkpCisgICAgaGFuZGxlQ2FsbChNQ2FsbCwgTUNhbGwtPmdldEltcGxpY2l0T2JqZWN0QXJndW1lbnQoKSwgRnVuRGVjbCk7CisgIGVsc2UKKyAgICBoYW5kbGVDYWxsKENhbGwsIENhbGwtPmdldEFyZygwKSwgRnVuRGVjbCk7CisKKyAgcHJvcGFnYXRlUmV0dXJuVHlwZShDYWxsLCBGdW5EZWNsKTsKIH0KIAogdm9pZCBDb25zdW1lZFN0bXRWaXNpdG9yOjpWaXNpdERlY2xSZWZFeHByKGNvbnN0IERlY2xSZWZFeHByICpEZWNsUmVmKSB7CkBAIC04NjYsMTEgKzg2MSw5IEBACiB9CiAKIHZvaWQgQ29uc3VtZWRTdG10VmlzaXRvcjo6VmlzaXREZWNsU3RtdChjb25zdCBEZWNsU3RtdCAqRGVjbFMpIHsKLSAgZm9yIChEZWNsU3RtdDo6Y29uc3RfZGVjbF9pdGVyYXRvciBESSA9IERlY2xTLT5kZWNsX2JlZ2luKCksCi0gICAgICAgREUgPSBEZWNsUy0+ZGVjbF9lbmQoKTsgREkgIT0gREU7ICsrREkpIHsKLSAgICAKLSAgICBpZiAoaXNhPFZhckRlY2w+KCpESSkpIFZpc2l0VmFyRGVjbChjYXN0PFZhckRlY2w+KCpESSkpOwotICB9CisgIGZvciAoY29uc3QgYXV0byAqREkgOiBEZWNsUy0+ZGVjbHMoKSkgICAgCisgICAgaWYgKGlzYTxWYXJEZWNsPihESSkpCisgICAgICBWaXNpdFZhckRlY2woY2FzdDxWYXJEZWNsPihESSkpOwogICAKICAgaWYgKERlY2xTLT5pc1NpbmdsZURlY2woKSkKICAgICBpZiAoY29uc3QgVmFyRGVjbCAqVmFyID0gZHluX2Nhc3Rfb3JfbnVsbDxWYXJEZWNsPihEZWNsUy0+Z2V0U2luZ2xlRGVjbCgpKSkKQEAgLTg5MiwyMiArODg1LDE2IEBACiAgIFF1YWxUeXBlIFBhcmFtVHlwZSA9IFBhcmFtLT5nZXRUeXBlKCk7CiAgIENvbnN1bWVkU3RhdGUgUGFyYW1TdGF0ZSA9IGNvbnN1bWVkOjpDU19Ob25lOwogICAKLSAgaWYgKFBhcmFtLT5oYXNBdHRyPFBhcmFtVHlwZXN0YXRlQXR0cj4oKSkgewotICAgIGNvbnN0IFBhcmFtVHlwZXN0YXRlQXR0ciAqUFRBdHRyID0gUGFyYW0tPmdldEF0dHI8UGFyYW1UeXBlc3RhdGVBdHRyPigpOwotICAgIFBhcmFtU3RhdGUgPSBtYXBQYXJhbVR5cGVzdGF0ZUF0dHJTdGF0ZShQVEF0dHIpOwotICAgIAotICB9IGVsc2UgaWYgKGlzQ29uc3VtYWJsZVR5cGUoUGFyYW1UeXBlKSkgewotICAgIFBhcmFtU3RhdGUgPSBtYXBDb25zdW1hYmxlQXR0clN0YXRlKFBhcmFtVHlwZSk7Ci0gICAgCi0gIH0gZWxzZSBpZiAoaXNSVmFsdWVSZWZpc2goUGFyYW1UeXBlKSAmJgotICAgICAgICAgICAgIGlzQ29uc3VtYWJsZVR5cGUoUGFyYW1UeXBlLT5nZXRQb2ludGVlVHlwZSgpKSkgewotICAgIAotICAgIFBhcmFtU3RhdGUgPSBtYXBDb25zdW1hYmxlQXR0clN0YXRlKFBhcmFtVHlwZS0+Z2V0UG9pbnRlZVR5cGUoKSk7Ci0gICAgCi0gIH0gZWxzZSBpZiAoUGFyYW1UeXBlLT5pc1JlZmVyZW5jZVR5cGUoKSAmJgotICAgICAgICAgICAgIGlzQ29uc3VtYWJsZVR5cGUoUGFyYW1UeXBlLT5nZXRQb2ludGVlVHlwZSgpKSkgeworICBpZiAoY29uc3QgUGFyYW1UeXBlc3RhdGVBdHRyICpQVEEgPSBQYXJhbS0+Z2V0QXR0cjxQYXJhbVR5cGVzdGF0ZUF0dHI+KCkpCisgICAgUGFyYW1TdGF0ZSA9IG1hcFBhcmFtVHlwZXN0YXRlQXR0clN0YXRlKFBUQSk7ICAgIAorICBlbHNlIGlmIChpc0NvbnN1bWFibGVUeXBlKFBhcmFtVHlwZSkpCisgICAgUGFyYW1TdGF0ZSA9IG1hcENvbnN1bWFibGVBdHRyU3RhdGUoUGFyYW1UeXBlKTsgICAgCisgIGVsc2UgaWYgKGlzUlZhbHVlUmVmKFBhcmFtVHlwZSkgJiYKKyAgICAgICAgICAgaXNDb25zdW1hYmxlVHlwZShQYXJhbVR5cGUtPmdldFBvaW50ZWVUeXBlKCkpKQorICAgIFBhcmFtU3RhdGUgPSBtYXBDb25zdW1hYmxlQXR0clN0YXRlKFBhcmFtVHlwZS0+Z2V0UG9pbnRlZVR5cGUoKSk7ICAgIAorICBlbHNlIGlmIChQYXJhbVR5cGUtPmlzUmVmZXJlbmNlVHlwZSgpICYmCisgICAgICAgICAgIGlzQ29uc3VtYWJsZVR5cGUoUGFyYW1UeXBlLT5nZXRQb2ludGVlVHlwZSgpKSkKICAgICBQYXJhbVN0YXRlID0gY29uc3VtZWQ6OkNTX1Vua25vd247Ci0gIH0KICAgCiAgIGlmIChQYXJhbVN0YXRlICE9IENTX05vbmUpCiAgICAgU3RhdGVNYXAtPnNldFN0YXRlKFBhcmFtLCBQYXJhbVN0YXRlKTsKQEAgLTkxNyw3ICs5MDQsNyBAQAogICBDb25zdW1lZFN0YXRlIEV4cGVjdGVkU3RhdGUgPSBBbmFseXplci5nZXRFeHBlY3RlZFJldHVyblN0YXRlKCk7CiAgIAogICBpZiAoRXhwZWN0ZWRTdGF0ZSAhPSBDU19Ob25lKSB7Ci0gICAgSW5mb0VudHJ5IEVudHJ5ID0gUHJvcGFnYXRpb25NYXAuZmluZChSZXQtPmdldFJldFZhbHVlKCkpOworICAgIEluZm9FbnRyeSBFbnRyeSA9IGZpbmRJbmZvKFJldC0+Z2V0UmV0VmFsdWUoKSk7CiAgICAgCiAgICAgaWYgKEVudHJ5ICE9IFByb3BhZ2F0aW9uTWFwLmVuZCgpKSB7CiAgICAgICBDb25zdW1lZFN0YXRlIFJldFN0YXRlID0gRW50cnktPnNlY29uZC5nZXRBc1N0YXRlKFN0YXRlTWFwKTsKQEAgLTkzNCw3ICs5MjEsNyBAQAogfQogCiB2b2lkIENvbnN1bWVkU3RtdFZpc2l0b3I6OlZpc2l0VW5hcnlPcGVyYXRvcihjb25zdCBVbmFyeU9wZXJhdG9yICpVT3ApIHsKLSAgSW5mb0VudHJ5IEVudHJ5ID0gUHJvcGFnYXRpb25NYXAuZmluZChVT3AtPmdldFN1YkV4cHIoKS0+SWdub3JlUGFyZW5zKCkpOworICBJbmZvRW50cnkgRW50cnkgPSBmaW5kSW5mbyhVT3AtPmdldFN1YkV4cHIoKSk7CiAgIGlmIChFbnRyeSA9PSBQcm9wYWdhdGlvbk1hcC5lbmQoKSkgcmV0dXJuOwogICAKICAgc3dpdGNoIChVT3AtPmdldE9wY29kZSgpKSB7CkBAIC05NTYsOCArOTQzLDcgQEAKIHZvaWQgQ29uc3VtZWRTdG10VmlzaXRvcjo6VmlzaXRWYXJEZWNsKGNvbnN0IFZhckRlY2wgKlZhcikgewogICBpZiAoaXNDb25zdW1hYmxlVHlwZShWYXItPmdldFR5cGUoKSkpIHsKICAgICBpZiAoVmFyLT5oYXNJbml0KCkpIHsKLSAgICAgIE1hcFR5cGU6Oml0ZXJhdG9yIFZJVCA9IFByb3BhZ2F0aW9uTWFwLmZpbmQoCi0gICAgICAgIFZhci0+Z2V0SW5pdCgpLT5JZ25vcmVJbXBsaWNpdCgpKTsKKyAgICAgIE1hcFR5cGU6Oml0ZXJhdG9yIFZJVCA9IGZpbmRJbmZvKFZhci0+Z2V0SW5pdCgpLT5JZ25vcmVJbXBsaWNpdCgpKTsKICAgICAgIGlmIChWSVQgIT0gUHJvcGFnYXRpb25NYXAuZW5kKCkpIHsKICAgICAgICAgUHJvcGFnYXRpb25JbmZvIFBJbmZvID0gVklULT5zZWNvbmQ7CiAgICAgICAgIENvbnN1bWVkU3RhdGUgU3QgPSBQSW5mby5nZXRBc1N0YXRlKFN0YXRlTWFwKTsKQEAgLTExNTgsMjQgKzExNDQsMjEgQEAKIHZvaWQgQ29uc3VtZWRTdGF0ZU1hcDo6Y2hlY2tQYXJhbXNGb3JSZXR1cm5UeXBlc3RhdGUoU291cmNlTG9jYXRpb24gQmxhbWVMb2MsCiAgIENvbnN1bWVkV2FybmluZ3NIYW5kbGVyQmFzZSAmV2FybmluZ3NIYW5kbGVyKSBjb25zdCB7CiAgIAotICBDb25zdW1lZFN0YXRlIEV4cGVjdGVkU3RhdGU7Ci0gIAogICBmb3IgKFZhck1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yIERNSSA9IFZhck1hcC5iZWdpbigpLCBETUUgPSBWYXJNYXAuZW5kKCk7CiAgICAgICAgRE1JICE9IERNRTsgKytETUkpIHsKICAgICAKICAgICBpZiAoaXNhPFBhcm1WYXJEZWNsPihETUktPmZpcnN0KSkgewogICAgICAgY29uc3QgUGFybVZhckRlY2wgKlBhcmFtID0gY2FzdDxQYXJtVmFyRGVjbD4oRE1JLT5maXJzdCk7CisgICAgICBjb25zdCBSZXR1cm5UeXBlc3RhdGVBdHRyICpSVEEgPSBQYXJhbS0+Z2V0QXR0cjxSZXR1cm5UeXBlc3RhdGVBdHRyPigpOwogICAgICAgCi0gICAgICBpZiAoIVBhcmFtLT5oYXNBdHRyPFJldHVyblR5cGVzdGF0ZUF0dHI+KCkpIGNvbnRpbnVlOworICAgICAgaWYgKCFSVEEpCisgICAgICAgIGNvbnRpbnVlOwogICAgICAgCi0gICAgICBFeHBlY3RlZFN0YXRlID0KLSAgICAgICAgbWFwUmV0dXJuVHlwZXN0YXRlQXR0clN0YXRlKFBhcmFtLT5nZXRBdHRyPFJldHVyblR5cGVzdGF0ZUF0dHI+KCkpOwotICAgICAgCi0gICAgICBpZiAoRE1JLT5zZWNvbmQgIT0gRXhwZWN0ZWRTdGF0ZSkgeworICAgICAgQ29uc3VtZWRTdGF0ZSBFeHBlY3RlZFN0YXRlID0gbWFwUmV0dXJuVHlwZXN0YXRlQXR0clN0YXRlKFJUQSk7ICAgICAgCisgICAgICBpZiAoRE1JLT5zZWNvbmQgIT0gRXhwZWN0ZWRTdGF0ZSkKICAgICAgICAgV2FybmluZ3NIYW5kbGVyLndhcm5QYXJhbVJldHVyblR5cGVzdGF0ZU1pc21hdGNoKEJsYW1lTG9jLAogICAgICAgICAgIFBhcmFtLT5nZXROYW1lQXNTdHJpbmcoKSwgc3RhdGVUb1N0cmluZyhFeHBlY3RlZFN0YXRlKSwKICAgICAgICAgICBzdGF0ZVRvU3RyaW5nKERNSS0+c2Vjb25kKSk7Ci0gICAgICB9CiAgICAgfQogICB9CiB9CkBAIC0xMjg2LDkgKzEyNjksNyBAQAogICB9IGVsc2UKICAgICBSZXR1cm5UeXBlID0gRC0+Z2V0Q2FsbFJlc3VsdFR5cGUoKTsKIAotICBpZiAoRC0+aGFzQXR0cjxSZXR1cm5UeXBlc3RhdGVBdHRyPigpKSB7Ci0gICAgY29uc3QgUmV0dXJuVHlwZXN0YXRlQXR0ciAqUlRTQXR0ciA9IEQtPmdldEF0dHI8UmV0dXJuVHlwZXN0YXRlQXR0cj4oKTsKLQorICBpZiAoY29uc3QgUmV0dXJuVHlwZXN0YXRlQXR0ciAqUlRTQXR0ciA9IEQtPmdldEF0dHI8UmV0dXJuVHlwZXN0YXRlQXR0cj4oKSkgewogICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gUmV0dXJuVHlwZS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CiAgICAgaWYgKCFSRCB8fCAhUkQtPmhhc0F0dHI8Q29uc3VtYWJsZUF0dHI+KCkpIHsKICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBwcm9wYWdhdGVzCkBAIC0xMzAwLDIyICsxMjgxLDI3IEBACiAgICAgICBFeHBlY3RlZFJldHVyblN0YXRlID0gQ1NfTm9uZTsKICAgICB9IGVsc2UKICAgICAgIEV4cGVjdGVkUmV0dXJuU3RhdGUgPSBtYXBSZXR1cm5UeXBlc3RhdGVBdHRyU3RhdGUoUlRTQXR0cik7Ci0gIH0gZWxzZSBpZiAoaXNDb25zdW1hYmxlVHlwZShSZXR1cm5UeXBlKSkKLSAgICBFeHBlY3RlZFJldHVyblN0YXRlID0gbWFwQ29uc3VtYWJsZUF0dHJTdGF0ZShSZXR1cm5UeXBlKTsKKyAgfSBlbHNlIGlmIChpc0NvbnN1bWFibGVUeXBlKFJldHVyblR5cGUpKSB7CisgICAgaWYgKGlzQXV0b0Nhc3RUeXBlKFJldHVyblR5cGUpKSAgIC8vIFdlIGNhbiBhdXRvLWNhc3QgdGhlIHN0YXRlIHRvIHRoZQorICAgICAgRXhwZWN0ZWRSZXR1cm5TdGF0ZSA9IENTX05vbmU7ICAvLyBleHBlY3RlZCBzdGF0ZS4KKyAgICBlbHNlCisgICAgICBFeHBlY3RlZFJldHVyblN0YXRlID0gbWFwQ29uc3VtYWJsZUF0dHJTdGF0ZShSZXR1cm5UeXBlKTsKKyAgfQogICBlbHNlCiAgICAgRXhwZWN0ZWRSZXR1cm5TdGF0ZSA9IENTX05vbmU7CiB9CiAKIGJvb2wgQ29uc3VtZWRBbmFseXplcjo6c3BsaXRTdGF0ZShjb25zdCBDRkdCbG9jayAqQ3VyckJsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN1bWVkU3RtdFZpc2l0b3IgJlZpc2l0b3IpIHsKLSAgCi0gIE93bmluZ1B0cjxDb25zdW1lZFN0YXRlTWFwPiBGYWxzZVN0YXRlcyhuZXcgQ29uc3VtZWRTdGF0ZU1hcCgqQ3VyclN0YXRlcykpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDb25zdW1lZFN0YXRlTWFwPiBGYWxzZVN0YXRlcygKKyAgICAgIG5ldyBDb25zdW1lZFN0YXRlTWFwKCpDdXJyU3RhdGVzKSk7CiAgIFByb3BhZ2F0aW9uSW5mbyBQSW5mbzsKICAgCiAgIGlmIChjb25zdCBJZlN0bXQgKklmTm9kZSA9CiAgICAgZHluX2Nhc3Rfb3JfbnVsbDxJZlN0bXQ+KEN1cnJCbG9jay0+Z2V0VGVybWluYXRvcigpLmdldFN0bXQoKSkpIHsKICAgICAKLSAgICBjb25zdCBTdG10ICpDb25kID0gSWZOb2RlLT5nZXRDb25kKCk7CisgICAgY29uc3QgRXhwciAqQ29uZCA9IElmTm9kZS0+Z2V0Q29uZCgpOwogICAgIAogICAgIFBJbmZvID0gVmlzaXRvci5nZXRJbmZvKENvbmQpOwogICAgIGlmICghUEluZm8uaXNWYWxpZCgpICYmIGlzYTxCaW5hcnlPcGVyYXRvcj4oQ29uZCkpCkBAIC0xMzg0LDggKzEzNzAsOCBAQAogICAgIGRlbGV0ZSBDdXJyU3RhdGVzOwogICAgIAogICBpZiAoKisrU0kpCi0gICAgQmxvY2tJbmZvLmFkZEluZm8oKlNJLCBGYWxzZVN0YXRlcy50YWtlKCkpOwotICAKKyAgICBCbG9ja0luZm8uYWRkSW5mbygqU0ksIEZhbHNlU3RhdGVzLnJlbGVhc2UoKSk7CisKICAgQ3VyclN0YXRlcyA9IE5VTEw7CiAgIHJldHVybiB0cnVlOwogfQpAQCAtMTQxMCw5ICsxMzk2LDggQEAKICAgQ29uc3VtZWRTdG10VmlzaXRvciBWaXNpdG9yKEFDLCAqdGhpcywgQ3VyclN0YXRlcyk7CiAgIAogICAvLyBBZGQgYWxsIHRyYWNrYWJsZSBwYXJhbWV0ZXJzIHRvIHRoZSBzdGF0ZSBtYXAuCi0gIGZvciAoRnVuY3Rpb25EZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBQSSA9IEQtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgUEUgPSBELT5wYXJhbV9lbmQoKTsgUEkgIT0gUEU7ICsrUEkpIHsKLSAgICBWaXNpdG9yLlZpc2l0UGFybVZhckRlY2woKlBJKTsKKyAgZm9yIChhdXRvIFBJIDogRC0+cGFyYW1zKCkpIHsKKyAgICBWaXNpdG9yLlZpc2l0UGFybVZhckRlY2woUEkpOwogICB9CiAgIAogICAvLyBWaXNpdCBhbGwgb2YgdGhlIGZ1bmN0aW9uJ3MgYmFzaWMgYmxvY2tzLgpkaWZmIC0tZ2l0IGEvbGliL0FuYWx5c2lzL0xpdmVWYXJpYWJsZXMuY3BwIGIvbGliL0FuYWx5c2lzL0xpdmVWYXJpYWJsZXMuY3BwCmluZGV4IDllNWVjNTUuLmIyNmQ0ZmIgMTAwNjQ0Ci0tLSBhL2xpYi9BbmFseXNpcy9MaXZlVmFyaWFibGVzLmNwcAorKysgYi9saWIvQW5hbHlzaXMvTGl2ZVZhcmlhYmxlcy5jcHAKQEAgLTM3LDcgKzM3LDYgQEAKICAgICAgIFBPVihDdHguZ2V0QW5hbHlzaXM8UG9zdE9yZGVyQ0ZHVmlldz4oKSkge30KICAgCiAgIHZvaWQgZW5xdWV1ZUJsb2NrKGNvbnN0IENGR0Jsb2NrICpibG9jayk7Ci0gIHZvaWQgZW5xdWV1ZVN1Y2Nlc3NvcnMoY29uc3QgQ0ZHQmxvY2sgKmJsb2NrKTsKICAgdm9pZCBlbnF1ZXVlUHJlZGVjZXNzb3JzKGNvbnN0IENGR0Jsb2NrICpibG9jayk7CiAKICAgY29uc3QgQ0ZHQmxvY2sgKmRlcXVldWUoKTsKQEAgLTUzLDE5ICs1Miw2IEBACiAgICAgd29ya2xpc3QucHVzaF9iYWNrKGJsb2NrKTsKICAgfQogfQotICAKLXZvaWQgRGF0YWZsb3dXb3JrbGlzdDo6ZW5xdWV1ZVN1Y2Nlc3NvcnMoY29uc3QgY2xhbmc6OkNGR0Jsb2NrICpibG9jaykgewotICBjb25zdCB1bnNpZ25lZCBPbGRXb3JrbGlzdFNpemUgPSB3b3JrbGlzdC5zaXplKCk7Ci0gIGZvciAoQ0ZHQmxvY2s6OmNvbnN0X3N1Y2NfaXRlcmF0b3IgSSA9IGJsb2NrLT5zdWNjX2JlZ2luKCksCi0gICAgICAgRSA9IGJsb2NrLT5zdWNjX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGVucXVldWVCbG9jaygqSSk7Ci0gIH0KLQotICBpZiAoT2xkV29ya2xpc3RTaXplID09IDAgfHwgT2xkV29ya2xpc3RTaXplID09IHdvcmtsaXN0LnNpemUoKSkKLSAgICByZXR1cm47Ci0KLSAgc29ydFdvcmtsaXN0KCk7Ci19CiAKIHZvaWQgRGF0YWZsb3dXb3JrbGlzdDo6ZW5xdWV1ZVByZWRlY2Vzc29ycyhjb25zdCBjbGFuZzo6Q0ZHQmxvY2sgKmJsb2NrKSB7CiAgIGNvbnN0IHVuc2lnbmVkIE9sZFdvcmtsaXN0U2l6ZSA9IHdvcmtsaXN0LnNpemUoKTsKQEAgLTM3Miw3ICszNTgsNyBAQAogCiB2b2lkIFRyYW5zZmVyRnVuY3Rpb25zOjpWaXNpdEJsb2NrRXhwcihCbG9ja0V4cHIgKkJFKSB7CiAgIEFuYWx5c2lzRGVjbENvbnRleHQ6OnJlZmVyZW5jZWRfZGVjbHNfaXRlcmF0b3IgSSwgRTsKLSAgbGx2bTo6dGllKEksIEUpID0KKyAgc3RkOjp0aWUoSSwgRSkgPQogICAgIExWLmFuYWx5c2lzQ29udGV4dC5nZXRSZWZlcmVuY2VkQmxvY2tWYXJzKEJFLT5nZXRCbG9ja0RlY2woKSk7CiAgIGZvciAoIDsgSSAhPSBFIDsgKytJKSB7CiAgICAgY29uc3QgVmFyRGVjbCAqVkQgPSAqSTsKQEAgLTM4OSw5ICszNzUsOCBAQAogfQogCiB2b2lkIFRyYW5zZmVyRnVuY3Rpb25zOjpWaXNpdERlY2xTdG10KERlY2xTdG10ICpEUykgewotICBmb3IgKERlY2xTdG10OjpkZWNsX2l0ZXJhdG9yIERJPURTLT5kZWNsX2JlZ2luKCksIERFID0gRFMtPmRlY2xfZW5kKCk7Ci0gICAgICAgREkgIT0gREU7ICsrREkpCi0gICAgaWYgKFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oKkRJKSkgeworICBmb3IgKGNvbnN0IGF1dG8gKkRJIDogRFMtPmRlY2xzKCkpCisgICAgaWYgKGNvbnN0IGF1dG8gKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oREkpKSB7CiAgICAgICBpZiAoIWlzQWx3YXlzQWxpdmUoVkQpKQogICAgICAgICB2YWwubGl2ZURlY2xzID0gTFYuRFNldEZhY3QucmVtb3ZlKHZhbC5saXZlRGVjbHMsIFZEKTsKICAgICB9CkBAIC01ODEsMTYgKzU2Niw2IEBACiAgIHJldHVybiBuZXcgTGl2ZVZhcmlhYmxlcyhMVik7CiB9CiAKLXN0YXRpYyBib29sIGNvbXBhcmVfZW50cmllcyhjb25zdCBDRkdCbG9jayAqQSwgY29uc3QgQ0ZHQmxvY2sgKkIpIHsKLSAgcmV0dXJuIEEtPmdldEJsb2NrSUQoKSA8IEItPmdldEJsb2NrSUQoKTsKLX0KLQotc3RhdGljIGJvb2wgY29tcGFyZV92ZF9lbnRyaWVzKGNvbnN0IERlY2wgKkEsIGNvbnN0IERlY2wgKkIpIHsKLSAgU291cmNlTG9jYXRpb24gQUxvYyA9IEEtPmdldExvY1N0YXJ0KCk7Ci0gIFNvdXJjZUxvY2F0aW9uIEJMb2MgPSBCLT5nZXRMb2NTdGFydCgpOwotICByZXR1cm4gQUxvYy5nZXRSYXdFbmNvZGluZygpIDwgQkxvYy5nZXRSYXdFbmNvZGluZygpOwotfQotCiB2b2lkIExpdmVWYXJpYWJsZXM6OmR1bXBCbG9ja0xpdmVuZXNzKGNvbnN0IFNvdXJjZU1hbmFnZXIgJk0pIHsKICAgZ2V0SW1wbChpbXBsKS5kdW1wQmxvY2tMaXZlbmVzcyhNKTsKIH0KQEAgLTYwMiw3ICs1NzcsOSBAQAogICAgICAgIGl0ICE9IGVpOyArK2l0KSB7CiAgICAgdmVjLnB1c2hfYmFjayhpdC0+Zmlyc3QpOyAgICAKICAgfQotICBzdGQ6OnNvcnQodmVjLmJlZ2luKCksIHZlYy5lbmQoKSwgY29tcGFyZV9lbnRyaWVzKTsKKyAgc3RkOjpzb3J0KHZlYy5iZWdpbigpLCB2ZWMuZW5kKCksIFtdKGNvbnN0IENGR0Jsb2NrICpBLCBjb25zdCBDRkdCbG9jayAqQikgeworICAgIHJldHVybiBBLT5nZXRCbG9ja0lEKCkgPCBCLT5nZXRCbG9ja0lEKCk7CisgIH0pOwogCiAgIHN0ZDo6dmVjdG9yPGNvbnN0IFZhckRlY2wqPiBkZWNsVmVjOwogCkBAIC02MTksOSArNTk2LDExIEBACiAgICAgICAgICAgc2UgPSB2YWxzLmxpdmVEZWNscy5lbmQoKTsgc2kgIT0gc2U7ICsrc2kpIHsKICAgICAgIGRlY2xWZWMucHVzaF9iYWNrKCpzaSk7ICAgICAgCiAgICAgfQotICAgIAotICAgIHN0ZDo6c29ydChkZWNsVmVjLmJlZ2luKCksIGRlY2xWZWMuZW5kKCksIGNvbXBhcmVfdmRfZW50cmllcyk7Ci0gICAgCisKKyAgICBzdGQ6OnNvcnQoZGVjbFZlYy5iZWdpbigpLCBkZWNsVmVjLmVuZCgpLCBbXShjb25zdCBEZWNsICpBLCBjb25zdCBEZWNsICpCKSB7CisgICAgICByZXR1cm4gQS0+Z2V0TG9jU3RhcnQoKSA8IEItPmdldExvY1N0YXJ0KCk7CisgICAgfSk7CisKICAgICBmb3IgKHN0ZDo6dmVjdG9yPGNvbnN0IFZhckRlY2wqPjo6aXRlcmF0b3IgZGkgPSBkZWNsVmVjLmJlZ2luKCksCiAgICAgICAgICBkZSA9IGRlY2xWZWMuZW5kKCk7IGRpICE9IGRlOyArK2RpKSB7CiAgICAgICBsbHZtOjplcnJzKCkgPDwgIiAiIDw8ICgqZGkpLT5nZXREZWNsTmFtZSgpLmdldEFzU3RyaW5nKCkKZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9OT1RJQ0UgYi9saWIvQW5hbHlzaXMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjkyMDRlLi4wMDAwMDAwCi0tLSBhL2xpYi9BbmFseXNpcy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUxMVk0gUmVsZWFzZSBMaWNlbnNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVVuaXZlcnNpdHkgb2YgSWxsaW5vaXMvTkNTQQotT3BlbiBTb3VyY2UgTGljZW5zZQotCi1Db3B5cmlnaHQgKGMpIDIwMDctMjAxMSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IFVyYmFuYS1DaGFtcGFpZ24uCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1EZXZlbG9wZWQgYnk6Ci0KLSAgICBMTFZNIFRlYW0KLQotICAgIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgYXQgVXJiYW5hLUNoYW1wYWlnbgotCi0gICAgaHR0cDovL2xsdm0ub3JnCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKLXRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIHdpdGgKLXRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KLXVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCi1vZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8KLXNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMuCi0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzIGluIHRoZQotICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQotICAgICogTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIExMVk0gVGVhbSwgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdAotICAgICAgVXJiYW5hLUNoYW1wYWlnbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvCi0gICAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYwotICAgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKLUZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1DT05UUklCVVRPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi1PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIFdJVEggVEhFCi1TT0ZUV0FSRS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1UaGUgTExWTSBzb2Z0d2FyZSBjb250YWlucyBjb2RlIHdyaXR0ZW4gYnkgdGhpcmQgcGFydGllcy4gIFN1Y2ggc29mdHdhcmUgd2lsbAotaGF2ZSBpdHMgb3duIGluZGl2aWR1YWwgTElDRU5TRS5UWFQgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGl0IGFwcGVhcnMuCi1UaGlzIGZpbGUgd2lsbCBkZXNjcmliZSB0aGUgY29weXJpZ2h0cywgbGljZW5zZSwgYW5kIHJlc3RyaWN0aW9ucyB3aGljaCBhcHBseQotdG8gdGhhdCBjb2RlLgotCi1UaGUgZGlzY2xhaW1lciBvZiB3YXJyYW50eSBpbiB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSBMaWNlbnNlCi1hcHBsaWVzIHRvIGFsbCBjb2RlIGluIHRoZSBMTFZNIERpc3RyaWJ1dGlvbiwgYW5kIG5vdGhpbmcgaW4gYW55IG9mIHRoZQotb3RoZXIgbGljZW5zZXMgZ2l2ZXMgcGVybWlzc2lvbiB0byB1c2UgdGhlIG5hbWVzIG9mIHRoZSBMTFZNIFRlYW0gb3IgdGhlCi1Vbml2ZXJzaXR5IG9mIElsbGlub2lzIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotU29mdHdhcmUuCi0KLVRoZSBmb2xsb3dpbmcgcGllY2VzIG9mIHNvZnR3YXJlIGhhdmUgYWRkaXRpb25hbCBvciBhbHRlcm5hdGUgY29weXJpZ2h0cywKLWxpY2Vuc2VzLCBhbmQvb3IgcmVzdHJpY3Rpb25zOgotCi1Qcm9ncmFtICAgICAgICAgICAgIERpcmVjdG9yeQotLS0tLS0tLSAgICAgICAgICAgICAtLS0tLS0tLS0KLTxub25lIHlldD4KZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9Qcm9ncmFtUG9pbnQuY3BwIGIvbGliL0FuYWx5c2lzL1Byb2dyYW1Qb2ludC5jcHAKaW5kZXggN2Q2N2U4YS4uMjZiNTliYiAxMDA2NDQKLS0tIGEvbGliL0FuYWx5c2lzL1Byb2dyYW1Qb2ludC5jcHAKKysrIGIvbGliL0FuYWx5c2lzL1Byb2dyYW1Qb2ludC5jcHAKQEAgLTQzLDkgKzQzLDEwIEBACiAgIH0KIH0KIAotU2ltcGxlUHJvZ3JhbVBvaW50VGFnOjpTaW1wbGVQcm9ncmFtUG9pbnRUYWcoU3RyaW5nUmVmIGRlc2NyaXB0aW9uKQotICA6IGRlc2MoZGVzY3JpcHRpb24pIHt9CitTaW1wbGVQcm9ncmFtUG9pbnRUYWc6OlNpbXBsZVByb2dyYW1Qb2ludFRhZyhTdHJpbmdSZWYgTXNnUHJvdmlkZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1zZykKKyAgOiBEZXNjKChNc2dQcm92aWRlciArICIgOiAiICsgTXNnKS5zdHIoKSkge30KIAogU3RyaW5nUmVmIFNpbXBsZVByb2dyYW1Qb2ludFRhZzo6Z2V0VGFnRGVzY3JpcHRpb24oKSBjb25zdCB7Ci0gIHJldHVybiBkZXNjOworICByZXR1cm4gRGVzYzsKIH0KZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9Qc2V1ZG9Db25zdGFudEFuYWx5c2lzLmNwcCBiL2xpYi9BbmFseXNpcy9Qc2V1ZG9Db25zdGFudEFuYWx5c2lzLmNwcAppbmRleCA1ZDY1OWNlLi4zMTRjZTdjIDEwMDY0NAotLS0gYS9saWIvQW5hbHlzaXMvUHNldWRvQ29uc3RhbnRBbmFseXNpcy5jcHAKKysrIGIvbGliL0FuYWx5c2lzL1BzZXVkb0NvbnN0YW50QW5hbHlzaXMuY3BwCkBAIC0xNzEsMTAgKzE3MSw5IEBACiAgICAgY2FzZSBTdG10OjpEZWNsU3RtdENsYXNzOiB7CiAgICAgICBjb25zdCBEZWNsU3RtdCAqRFMgPSBjYXN0PERlY2xTdG10PihIZWFkKTsKICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBlYWNoIGRlY2wgYW5kIHNlZSBpZiBhbnkgb2YgdGhlbSBjb250YWluIHJlZmVyZW5jZSBkZWNscwotICAgICAgZm9yIChEZWNsU3RtdDo6Y29uc3RfZGVjbF9pdGVyYXRvciBJID0gRFMtPmRlY2xfYmVnaW4oKSwKLSAgICAgICAgICBFID0gRFMtPmRlY2xfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBEUy0+ZGVjbHMoKSkgewogICAgICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgVmFyRGVjbHMKLSAgICAgICAgY29uc3QgVmFyRGVjbCAqVkQgPSBkeW5fY2FzdDxWYXJEZWNsPigqSSk7CisgICAgICAgIGNvbnN0IFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oSSk7CiAgICAgICAgIGlmICghVkQpCiAgICAgICAgICAgY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9SZWFjaGFibGVDb2RlLmNwcCBiL2xpYi9BbmFseXNpcy9SZWFjaGFibGVDb2RlLmNwcAppbmRleCBhMmQxOWMwLi4zY2M4YWU0IDEwMDY0NAotLS0gYS9saWIvQW5hbHlzaXMvUmVhY2hhYmxlQ29kZS5jcHAKKysrIGIvbGliL0FuYWx5c2lzL1JlYWNoYWJsZUNvZGUuY3BwCkBAIC0xMywxMCArMTMsMTIgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNlcy9SZWFjaGFibGVDb2RlLmgiCisjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3Nvci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJDWFguaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRXhwck9iakMuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdENYWC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9QYXJlbnRNYXAuaCIKICNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9BbmFseXNpc0NvbnRleHQuaCIKICNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9DRkcuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCkBAIC0yNSwzNiArMjcsMzI0IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIAotbmFtZXNwYWNlIHsKLWNsYXNzIERlYWRDb2RlU2NhbiB7Ci0gIGxsdm06OkJpdFZlY3RvciBWaXNpdGVkOwotICBsbHZtOjpCaXRWZWN0b3IgJlJlYWNoYWJsZTsKLSAgU21hbGxWZWN0b3I8Y29uc3QgQ0ZHQmxvY2sgKiwgMTA+IFdvcmtMaXN0OwotICAKLSAgdHlwZWRlZiBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgQ0ZHQmxvY2sgKiwgY29uc3QgU3RtdCAqPiwgMTI+Ci0gICAgICBEZWZlcnJlZExvY3NUeTsKLSAgCi0gIERlZmVycmVkTG9jc1R5IERlZmVycmVkTG9jczsKLSAgCi1wdWJsaWM6Ci0gIERlYWRDb2RlU2NhbihsbHZtOjpCaXRWZWN0b3IgJnJlYWNoYWJsZSkKLSAgICA6IFZpc2l0ZWQocmVhY2hhYmxlLnNpemUoKSksCi0gICAgICBSZWFjaGFibGUocmVhY2hhYmxlKSB7fQotICAKLSAgdm9pZCBlbnF1ZXVlKGNvbnN0IENGR0Jsb2NrICpibG9jayk7ICAKLSAgdW5zaWduZWQgc2NhbkJhY2t3YXJkcyhjb25zdCBDRkdCbG9jayAqU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhbmc6OnJlYWNoYWJsZV9jb2RlOjpDYWxsYmFjayAmQ0IpOwotICAKLSAgYm9vbCBpc0RlYWRDb2RlUm9vdChjb25zdCBDRkdCbG9jayAqQmxvY2spOwotICAKLSAgY29uc3QgU3RtdCAqZmluZERlYWRDb2RlKGNvbnN0IENGR0Jsb2NrICpCbG9jayk7Ci0gIAotICB2b2lkIHJlcG9ydERlYWRDb2RlKGNvbnN0IFN0bXQgKlMsCi0gICAgICAgICAgICAgICAgICAgICAgY2xhbmc6OnJlYWNoYWJsZV9jb2RlOjpDYWxsYmFjayAmQ0IpOwotfTsKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDb3JlIFJlYWNoYWJpbGl0eSBBbmFseXNpcyByb3V0aW5lcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3N0YXRpYyBib29sIGlzRW51bUNvbnN0YW50KGNvbnN0IEV4cHIgKkV4KSB7CisgIGNvbnN0IERlY2xSZWZFeHByICpEUiA9IGR5bl9jYXN0PERlY2xSZWZFeHByPihFeCk7CisgIGlmICghRFIpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gaXNhPEVudW1Db25zdGFudERlY2w+KERSLT5nZXREZWNsKCkpOwogfQogCi12b2lkIERlYWRDb2RlU2Nhbjo6ZW5xdWV1ZShjb25zdCBDRkdCbG9jayAqYmxvY2spIHsgIAorc3RhdGljIGJvb2wgaXNUcml2aWFsRXhwcmVzc2lvbihjb25zdCBFeHByICpFeCkgeworICBFeCA9IEV4LT5JZ25vcmVQYXJlbkNhc3RzKCk7CisgIHJldHVybiBpc2E8SW50ZWdlckxpdGVyYWw+KEV4KSB8fCBpc2E8U3RyaW5nTGl0ZXJhbD4oRXgpIHx8CisgICAgICAgICBpc2E8Q1hYQm9vbExpdGVyYWxFeHByPihFeCkgfHwgaXNhPE9iakNCb29sTGl0ZXJhbEV4cHI+KEV4KSB8fAorICAgICAgICAgaXNhPENoYXJhY3RlckxpdGVyYWw+KEV4KSB8fAorICAgICAgICAgaXNFbnVtQ29uc3RhbnQoRXgpOworfQorCitzdGF0aWMgYm9vbCBpc1RyaXZpYWxEb1doaWxlKGNvbnN0IENGR0Jsb2NrICpCLCBjb25zdCBTdG10ICpTKSB7CisgIC8vIENoZWNrIGlmIHRoZSBibG9jayBlbmRzIHdpdGggYSBkby4uLndoaWxlKCkgYW5kIHNlZSBpZiAnUycgaXMgdGhlCisgIC8vIGNvbmRpdGlvbi4KKyAgaWYgKGNvbnN0IFN0bXQgKlRlcm0gPSBCLT5nZXRUZXJtaW5hdG9yKCkpIHsKKyAgICBpZiAoY29uc3QgRG9TdG10ICpEUyA9IGR5bl9jYXN0PERvU3RtdD4oVGVybSkpIHsKKyAgICAgIGNvbnN0IEV4cHIgKkNvbmQgPSBEUy0+Z2V0Q29uZCgpLT5JZ25vcmVQYXJlbkNhc3RzKCk7CisgICAgICByZXR1cm4gQ29uZCA9PSBTICYmIGlzVHJpdmlhbEV4cHJlc3Npb24oQ29uZCk7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgaXNEZWFkUmV0dXJuKGNvbnN0IENGR0Jsb2NrICpCLCBjb25zdCBTdG10ICpTKSB7CisgIC8vIExvb2sgdG8gc2VlIGlmIHRoZSBibG9jayBlbmRzIHdpdGggYSAncmV0dXJuJywgYW5kIHNlZSBpZiAnUycKKyAgLy8gaXMgYSBzdWJzdGF0ZW1lbnQuICBUaGUgJ3JldHVybicgbWF5IG5vdCBiZSB0aGUgbGFzdCBlbGVtZW50IGluCisgIC8vIHRoZSBibG9jayBiZWNhdXNlIG9mIGRlc3RydWN0b3JzLgorICBmb3IgKENGR0Jsb2NrOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIEkgPSBCLT5yYmVnaW4oKSwgRSA9IEItPnJlbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmIChPcHRpb25hbDxDRkdTdG10PiBDUyA9IEktPmdldEFzPENGR1N0bXQ+KCkpIHsKKyAgICAgIGlmIChjb25zdCBSZXR1cm5TdG10ICpSUyA9IGR5bl9jYXN0PFJldHVyblN0bXQ+KENTLT5nZXRTdG10KCkpKSB7CisgICAgICAgIGlmIChSUyA9PSBTKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoY29uc3QgRXhwciAqUkUgPSBSUy0+Z2V0UmV0VmFsdWUoKSkgeworICAgICAgICAgIFJFID0gUkUtPklnbm9yZVBhcmVuQ2FzdHMoKTsKKyAgICAgICAgICBpZiAoUkUgPT0gUykKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIFBhcmVudE1hcCBQTShjb25zdF9jYXN0PEV4cHIqPihSRSkpOworICAgICAgICAgIC8vIElmICdTJyBpcyBpbiB0aGUgUGFyZW50TWFwLCBpdCBpcyBhIHN1YmV4cHJlc3Npb24gb2YKKyAgICAgICAgICAvLyB0aGUgcmV0dXJuIHN0YXRlbWVudC4gIE5vdGUgYWxzbyB0aGF0IHdlIGFyZSByZXN0cmljdGluZworICAgICAgICAgIC8vIHRvIGxvb2tpbmcgYXQgcmV0dXJuIHN0YXRlbWVudHMgaW4gdGhlIHNhbWUgQ0ZHQmxvY2ssCisgICAgICAgICAgLy8gc28gdGhpcyB3aWxsIGludGVudGlvbmFsbHkgbm90IGNhdGNoIGNhc2VzIHdoZXJlIHRoZQorICAgICAgICAgIC8vIHJldHVybiBzdGF0ZW1lbnQgY29udGFpbnMgbmVzdGVkIGNvbnRyb2wtZmxvdy4KKyAgICAgICAgICByZXR1cm4gUE0uZ2V0UGFyZW50KFMpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgU291cmNlTG9jYXRpb24gZ2V0VG9wTW9zdE1hY3JvKFNvdXJjZUxvY2F0aW9uIExvYywgU291cmNlTWFuYWdlciAmU00pIHsKKyAgYXNzZXJ0KExvYy5pc01hY3JvSUQoKSk7CisgIFNvdXJjZUxvY2F0aW9uIExhc3Q7CisgIHdoaWxlIChMb2MuaXNNYWNyb0lEKCkpIHsKKyAgICBMYXN0ID0gTG9jOworICAgIExvYyA9IFNNLmdldEltbWVkaWF0ZU1hY3JvQ2FsbGVyTG9jKExvYyk7CisgIH0KKyAgcmV0dXJuIExhc3Q7Cit9CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHN0YXRlbWVudCBpcyBleHBhbmRlZCBmcm9tIGEgY29uZmlndXJhdGlvbiBtYWNyby4KK3N0YXRpYyBib29sIGlzRXhwYW5kZWRGcm9tQ29uZmlndXJhdGlvbk1hY3JvKGNvbnN0IFN0bXQgKlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3IgJlBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJZ25vcmVZRVNfTk8gPSBmYWxzZSkgeworICAvLyBGSVhNRTogVGhpcyBpcyBub3QgdmVyeSBwcmVjaXNlLiAgSGVyZSB3ZSBqdXN0IGNoZWNrIHRvIHNlZSBpZiB0aGUKKyAgLy8gdmFsdWUgY29tZXMgZnJvbSBhIG1hY3JvLCBidXQgd2UgY2FuIGRvIG11Y2ggYmV0dGVyLiAgVGhpcyBpcyBsaWtlbHkKKyAgLy8gdG8gYmUgb3ZlciBjb25zZXJ2YXRpdmUuICBUaGlzIGxvZ2ljIGlzIGZhY3RvcmVkIGludG8gYSBzZXBhcmF0ZSBmdW5jdGlvbgorICAvLyBzbyB0aGF0IHdlIGNhbiByZWZpbmUgaXQgbGF0ZXIuCisgIFNvdXJjZUxvY2F0aW9uIEwgPSBTLT5nZXRMb2NTdGFydCgpOworICBpZiAoTC5pc01hY3JvSUQoKSkgeworICAgIGlmIChJZ25vcmVZRVNfTk8pIHsKKyAgICAgIC8vIFRoZSBPYmplY3RpdmUtQyBjb25zdGFudCAnWUVTJyBhbmQgJ05PJworICAgICAgLy8gYXJlIGRlZmluZWQgYXMgbWFjcm9zLiAgRG8gbm90IHRyZWF0IHRoZW0KKyAgICAgIC8vIGFzIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgorICAgICAgU291cmNlTWFuYWdlciAmU00gPSBQUC5nZXRTb3VyY2VNYW5hZ2VyKCk7CisgICAgICBTb3VyY2VMb2NhdGlvbiBUb3BMID0gZ2V0VG9wTW9zdE1hY3JvKEwsIFNNKTsKKyAgICAgIFN0cmluZ1JlZiBNYWNyb05hbWUgPSBQUC5nZXRJbW1lZGlhdGVNYWNyb05hbWUoVG9wTCk7CisgICAgICBpZiAoTWFjcm9OYW1lID09ICJZRVMiIHx8IE1hY3JvTmFtZSA9PSAiTk8iKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgaXNDb25maWd1cmF0aW9uVmFsdWUoY29uc3QgVmFsdWVEZWNsICpELCBQcmVwcm9jZXNzb3IgJlBQKTsKKworLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdGVtZW50IHJlcHJlc2VudHMgYSBjb25maWd1cmF0aW9uIHZhbHVlLgorLy8vCisvLy8gQSBjb25maWd1cmF0aW9uIHZhbHVlIGlzIHNvbWV0aGluZyB1c3VhbGx5IGRldGVybWluZWQgYXQgY29tcGlsZS10aW1lCisvLy8gdG8gY29uZGl0aW9uYWxseSBhbHdheXMgZXhlY3V0ZSBzb21lIGJyYW5jaC4gIFN1Y2ggZ3VhcmRzIGFyZSBmb3IKKy8vLyAic29tZXRpbWVzIHVucmVhY2hhYmxlIiBjb2RlLiAgU3VjaCBjb2RlIGlzIHVzdWFsbHkgbm90IGludGVyZXN0aW5nCisvLy8gdG8gcmVwb3J0IGFzIHVucmVhY2hhYmxlLCBhbmQgbWF5IG1hc2sgdHJ1bHkgdW5yZWFjaGFibGUgY29kZSB3aXRoaW4KKy8vLyB0aG9zZSBibG9ja3MuCitzdGF0aWMgYm9vbCBpc0NvbmZpZ3VyYXRpb25WYWx1ZShjb25zdCBTdG10ICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcHJvY2Vzc29yICZQUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlICpTaWxlbmNlYWJsZUNvbmRWYWwgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlSW50ZWdlcnMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBXcmFwcGVkSW5QYXJlbnMgPSBmYWxzZSkgeworICBpZiAoIVMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFNwZWNpYWwgY2FzZSBsb29raW5nIGZvciB0aGUgc2lnaWwgJygpJyBhcm91bmQgYW4gaW50ZWdlciBsaXRlcmFsLgorICBpZiAoY29uc3QgUGFyZW5FeHByICpQRSA9IGR5bl9jYXN0PFBhcmVuRXhwcj4oUykpCisgICAgaWYgKCFQRS0+Z2V0TG9jU3RhcnQoKS5pc01hY3JvSUQoKSkKKyAgICAgIHJldHVybiBpc0NvbmZpZ3VyYXRpb25WYWx1ZShQRS0+Z2V0U3ViRXhwcigpLCBQUCwgU2lsZW5jZWFibGVDb25kVmFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlSW50ZWdlcnMsIHRydWUpOworCisgIGlmIChjb25zdCBFeHByICpFeCA9IGR5bl9jYXN0PEV4cHI+KFMpKQorICAgIFMgPSBFeC0+SWdub3JlUGFyZW5DYXN0cygpOworCisgIGJvb2wgSWdub3JlWUVTX05PID0gZmFsc2U7CisKKyAgc3dpdGNoIChTLT5nZXRTdG10Q2xhc3MoKSkgeworICAgIGNhc2UgU3RtdDo6Q2FsbEV4cHJDbGFzczogeworICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpDYWxsZWUgPQorICAgICAgICBkeW5fY2FzdF9vcl9udWxsPEZ1bmN0aW9uRGVjbD4oY2FzdDxDYWxsRXhwcj4oUyktPmdldENhbGxlZURlY2woKSk7CisgICAgICByZXR1cm4gQ2FsbGVlID8gQ2FsbGVlLT5pc0NvbnN0ZXhwcigpIDogZmFsc2U7CisgICAgfQorICAgIGNhc2UgU3RtdDo6RGVjbFJlZkV4cHJDbGFzczoKKyAgICAgIHJldHVybiBpc0NvbmZpZ3VyYXRpb25WYWx1ZShjYXN0PERlY2xSZWZFeHByPihTKS0+Z2V0RGVjbCgpLCBQUCk7CisgICAgY2FzZSBTdG10OjpPYmpDQm9vbExpdGVyYWxFeHByQ2xhc3M6CisgICAgICBJZ25vcmVZRVNfTk8gPSB0cnVlOworICAgICAgLy8gRmFsbHRocm91Z2guCisgICAgY2FzZSBTdG10OjpDWFhCb29sTGl0ZXJhbEV4cHJDbGFzczoKKyAgICBjYXNlIFN0bXQ6OkludGVnZXJMaXRlcmFsQ2xhc3M6IHsKKyAgICAgIGNvbnN0IEV4cHIgKkUgPSBjYXN0PEV4cHI+KFMpOworICAgICAgaWYgKEluY2x1ZGVJbnRlZ2VycykgeworICAgICAgICBpZiAoU2lsZW5jZWFibGVDb25kVmFsICYmICFTaWxlbmNlYWJsZUNvbmRWYWwtPmdldEJlZ2luKCkuaXNWYWxpZCgpKQorICAgICAgICAgICpTaWxlbmNlYWJsZUNvbmRWYWwgPSBFLT5nZXRTb3VyY2VSYW5nZSgpOworICAgICAgICByZXR1cm4gV3JhcHBlZEluUGFyZW5zIHx8IGlzRXhwYW5kZWRGcm9tQ29uZmlndXJhdGlvbk1hY3JvKEUsIFBQLCBJZ25vcmVZRVNfTk8pOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjYXNlIFN0bXQ6Ok1lbWJlckV4cHJDbGFzczoKKyAgICAgIHJldHVybiBpc0NvbmZpZ3VyYXRpb25WYWx1ZShjYXN0PE1lbWJlckV4cHI+KFMpLT5nZXRNZW1iZXJEZWNsKCksIFBQKTsKKyAgICBjYXNlIFN0bXQ6OlVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwckNsYXNzOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBTdG10OjpCaW5hcnlPcGVyYXRvckNsYXNzOiB7CisgICAgICBjb25zdCBCaW5hcnlPcGVyYXRvciAqQiA9IGNhc3Q8QmluYXJ5T3BlcmF0b3I+KFMpOworICAgICAgLy8gT25seSBpbmNsdWRlIHJhdyBpbnRlZ2VycyAobm90IGVudW1zKSBhcyBjb25maWd1cmF0aW9uCisgICAgICAvLyB2YWx1ZXMgaWYgdGhleSBhcmUgdXNlZCBpbiBhIGxvZ2ljYWwgb3IgY29tcGFyaXNvbiBvcGVyYXRvcgorICAgICAgLy8gKG5vdCBhcml0aG1ldGljKS4KKyAgICAgIEluY2x1ZGVJbnRlZ2VycyAmPSAoQi0+aXNMb2dpY2FsT3AoKSB8fCBCLT5pc0NvbXBhcmlzb25PcCgpKTsKKyAgICAgIHJldHVybiBpc0NvbmZpZ3VyYXRpb25WYWx1ZShCLT5nZXRMSFMoKSwgUFAsIFNpbGVuY2VhYmxlQ29uZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlSW50ZWdlcnMpIHx8CisgICAgICAgICAgICAgaXNDb25maWd1cmF0aW9uVmFsdWUoQi0+Z2V0UkhTKCksIFBQLCBTaWxlbmNlYWJsZUNvbmRWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZUludGVnZXJzKTsKKyAgICB9CisgICAgY2FzZSBTdG10OjpVbmFyeU9wZXJhdG9yQ2xhc3M6IHsKKyAgICAgIGNvbnN0IFVuYXJ5T3BlcmF0b3IgKlVPID0gY2FzdDxVbmFyeU9wZXJhdG9yPihTKTsKKyAgICAgIGlmIChTaWxlbmNlYWJsZUNvbmRWYWwpIAorICAgICAgICAqU2lsZW5jZWFibGVDb25kVmFsID0gVU8tPmdldFNvdXJjZVJhbmdlKCk7ICAgICAgCisgICAgICByZXR1cm4gVU8tPmdldE9wY29kZSgpID09IFVPX0xOb3QgJiYKKyAgICAgICAgICAgICBpc0NvbmZpZ3VyYXRpb25WYWx1ZShVTy0+Z2V0U3ViRXhwcigpLCBQUCwgU2lsZW5jZWFibGVDb25kVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGVJbnRlZ2VycywgV3JhcHBlZEluUGFyZW5zKTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitzdGF0aWMgYm9vbCBpc0NvbmZpZ3VyYXRpb25WYWx1ZShjb25zdCBWYWx1ZURlY2wgKkQsIFByZXByb2Nlc3NvciAmUFApIHsKKyAgaWYgKGNvbnN0IEVudW1Db25zdGFudERlY2wgKkVEID0gZHluX2Nhc3Q8RW51bUNvbnN0YW50RGVjbD4oRCkpCisgICAgcmV0dXJuIGlzQ29uZmlndXJhdGlvblZhbHVlKEVELT5nZXRJbml0RXhwcigpLCBQUCk7CisgIGlmIChjb25zdCBWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KEQpKSB7CisgICAgLy8gQXMgYSBoZXVyaXN0aWMsIHRyZWF0IGdsb2JhbHMgYXMgY29uZmlndXJhdGlvbiB2YWx1ZXMuICBOb3RlCisgICAgLy8gdGhhdCB3ZSBvbmx5IHdpbGwgZ2V0IGhlcmUgaWYgU2VtYSBldmFsdWF0ZWQgdGhpcworICAgIC8vIGNvbmRpdGlvbiB0byBhIGNvbnN0YW50IGV4cHJlc3Npb24sIHdoaWNoIG1lYW5zIHRoZSBnbG9iYWwKKyAgICAvLyBoYWQgdG8gYmUgZGVjbGFyZWQgaW4gYSB3YXkgdG8gYmUgYSB0cnVseSBjb25zdGFudCB2YWx1ZS4KKyAgICAvLyBXZSBjb3VsZCBnZW5lcmFsaXplIHRoaXMgdG8gbG9jYWwgdmFyaWFibGVzLCBidXQgaXQgaXNuJ3QKKyAgICAvLyBjbGVhciBpZiB0aG9zZSB0cnVseSByZXByZXNlbnQgY29uZmlndXJhdGlvbiB2YWx1ZXMgdGhhdAorICAgIC8vIGdhdGUgdW5yZWFjaGFibGUgY29kZS4KKyAgICBpZiAoIVZELT5oYXNMb2NhbFN0b3JhZ2UoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gQXMgYSBoZXVyaXN0aWMsIGxvY2FscyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgJ2NvbnN0JyBleHBsaWNpdGx5CisgICAgLy8gY2FuIGJlIHRyZWF0ZWQgYXMgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXMgd2VsbC4KKyAgICByZXR1cm4gVkQtPmdldFR5cGUoKS5pc0xvY2FsQ29uc3RRdWFsaWZpZWQoKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgd2Ugc2hvdWxkIGFsd2F5cyBleHBsb3JlIGFsbCBzdWNjZXNzb3JzIG9mIGEgYmxvY2suCitzdGF0aWMgYm9vbCBzaG91bGRUcmVhdFN1Y2Nlc3NvcnNBc1JlYWNoYWJsZShjb25zdCBDRkdCbG9jayAqQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXByb2Nlc3NvciAmUFApIHsKKyAgaWYgKGNvbnN0IFN0bXQgKlRlcm0gPSBCLT5nZXRUZXJtaW5hdG9yKCkpIHsKKyAgICBpZiAoaXNhPFN3aXRjaFN0bXQ+KFRlcm0pKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gU3BlY2lhbGx5IGhhbmRsZSAnfHwnIGFuZCAnJiYnLgorICAgIGlmIChpc2E8QmluYXJ5T3BlcmF0b3I+KFRlcm0pKSB7CisgICAgICByZXR1cm4gaXNDb25maWd1cmF0aW9uVmFsdWUoVGVybSwgUFApOworICAgIH0KKyAgfQorCisgIGNvbnN0IFN0bXQgKkNvbmQgPSBCLT5nZXRUZXJtaW5hdG9yQ29uZGl0aW9uKC8qIHN0cmlwUGFyZW5zICovIGZhbHNlKTsKKyAgcmV0dXJuIGlzQ29uZmlndXJhdGlvblZhbHVlKENvbmQsIFBQKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNjYW5Gcm9tQmxvY2soY29uc3QgQ0ZHQmxvY2sgKlN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Qml0VmVjdG9yICZSZWFjaGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3IgKlBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlU29tZXRpbWVzVW5yZWFjaGFibGVFZGdlcykgeworICB1bnNpZ25lZCBjb3VudCA9IDA7CisgIAorICAvLyBQcmVwIHdvcmsgcXVldWUKKyAgU21hbGxWZWN0b3I8Y29uc3QgQ0ZHQmxvY2sqLCAzMj4gV0w7CisgIAorICAvLyBUaGUgZW50cnkgYmxvY2sgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIG1hcmtlZCByZWFjaGFibGUKKyAgLy8gYnkgdGhlIGNhbGxlci4KKyAgaWYgKCFSZWFjaGFibGVbU3RhcnQtPmdldEJsb2NrSUQoKV0pIHsKKyAgICArK2NvdW50OworICAgIFJlYWNoYWJsZVtTdGFydC0+Z2V0QmxvY2tJRCgpXSA9IHRydWU7CisgIH0KKyAgCisgIFdMLnB1c2hfYmFjayhTdGFydCk7CisgIAorICAvLyBGaW5kIHRoZSByZWFjaGFibGUgYmxvY2tzIGZyb20gJ1N0YXJ0Jy4KKyAgd2hpbGUgKCFXTC5lbXB0eSgpKSB7CisgICAgY29uc3QgQ0ZHQmxvY2sgKml0ZW0gPSBXTC5wb3BfYmFja192YWwoKTsKKworICAgIC8vIFRoZXJlIGFyZSBjYXNlcyB3aGVyZSB3ZSB3YW50IHRvIHRyZWF0IGFsbCBzdWNjZXNzb3JzIGFzIHJlYWNoYWJsZS4KKyAgICAvLyBUaGUgaWRlYSBpcyB0aGF0IHNvbWUgInNvbWV0aW1lcyB1bnJlYWNoYWJsZSIgY29kZSBpcyBub3QgaW50ZXJlc3RpbmcsCisgICAgLy8gYW5kIHRoYXQgd2Ugc2hvdWxkIGZvcmdlIGFoZWFkIGFuZCBleHBsb3JlIHRob3NlIGJyYW5jaGVzIGFueXdheS4KKyAgICAvLyBUaGlzIGFsbG93cyB1cyB0byBwb3RlbnRpYWxseSB1bmNvdmVyIHNvbWUgImFsd2F5cyB1bnJlYWNoYWJsZSIgY29kZQorICAgIC8vIHdpdGhpbiB0aGUgInNvbWV0aW1lcyB1bnJlYWNoYWJsZSIgY29kZS4KKyAgICAvLyBMb29rIGF0IHRoZSBzdWNjZXNzb3JzIGFuZCBtYXJrIHRoZW4gcmVhY2hhYmxlLgorICAgIE9wdGlvbmFsPGJvb2w+IFRyZWF0QWxsU3VjY2Vzc29yc0FzUmVhY2hhYmxlOworICAgIGlmICghSW5jbHVkZVNvbWV0aW1lc1VucmVhY2hhYmxlRWRnZXMpCisgICAgICBUcmVhdEFsbFN1Y2Nlc3NvcnNBc1JlYWNoYWJsZSA9IGZhbHNlOworCisgICAgZm9yIChDRkdCbG9jazo6Y29uc3Rfc3VjY19pdGVyYXRvciBJID0gaXRlbS0+c3VjY19iZWdpbigpLCAKKyAgICAgICAgIEUgPSBpdGVtLT5zdWNjX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgY29uc3QgQ0ZHQmxvY2sgKkIgPSAqSTsKKyAgICAgIGlmICghQikgZG8geworICAgICAgICBjb25zdCBDRkdCbG9jayAqVUIgPSBJLT5nZXRQb3NzaWJseVVucmVhY2hhYmxlQmxvY2soKTsKKyAgICAgICAgaWYgKCFVQikKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIVRyZWF0QWxsU3VjY2Vzc29yc0FzUmVhY2hhYmxlLmhhc1ZhbHVlKCkpIHsKKyAgICAgICAgICBhc3NlcnQoUFApOworICAgICAgICAgIFRyZWF0QWxsU3VjY2Vzc29yc0FzUmVhY2hhYmxlID0KKyAgICAgICAgICAgIHNob3VsZFRyZWF0U3VjY2Vzc29yc0FzUmVhY2hhYmxlKGl0ZW0sICpQUCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoVHJlYXRBbGxTdWNjZXNzb3JzQXNSZWFjaGFibGUuZ2V0VmFsdWUoKSkgeworICAgICAgICAgIEIgPSBVQjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgd2hpbGUgKGZhbHNlKTsKKworICAgICAgaWYgKEIpIHsKKyAgICAgICAgdW5zaWduZWQgYmxvY2tJRCA9IEItPmdldEJsb2NrSUQoKTsKKyAgICAgICAgaWYgKCFSZWFjaGFibGVbYmxvY2tJRF0pIHsKKyAgICAgICAgICBSZWFjaGFibGUuc2V0KGJsb2NrSUQpOworICAgICAgICAgIFdMLnB1c2hfYmFjayhCKTsKKyAgICAgICAgICArK2NvdW50OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIHVuc2lnbmVkIHNjYW5NYXliZVJlYWNoYWJsZUZyb21CbG9jayhjb25zdCBDRkdCbG9jayAqU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXByb2Nlc3NvciAmUFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkJpdFZlY3RvciAmUmVhY2hhYmxlKSB7CisgIHJldHVybiBzY2FuRnJvbUJsb2NrKFN0YXJ0LCBSZWFjaGFibGUsICZQUCwgdHJ1ZSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEZWFkIENvZGUgU2Nhbm5lci4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSB7CisgIGNsYXNzIERlYWRDb2RlU2NhbiB7CisgICAgbGx2bTo6Qml0VmVjdG9yIFZpc2l0ZWQ7CisgICAgbGx2bTo6Qml0VmVjdG9yICZSZWFjaGFibGU7CisgICAgU21hbGxWZWN0b3I8Y29uc3QgQ0ZHQmxvY2sgKiwgMTA+IFdvcmtMaXN0OworICAgIFByZXByb2Nlc3NvciAmUFA7CisKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBDRkdCbG9jayAqLCBjb25zdCBTdG10ICo+LCAxMj4KKyAgICBEZWZlcnJlZExvY3NUeTsKKworICAgIERlZmVycmVkTG9jc1R5IERlZmVycmVkTG9jczsKKworICBwdWJsaWM6CisgICAgRGVhZENvZGVTY2FuKGxsdm06OkJpdFZlY3RvciAmcmVhY2hhYmxlLCBQcmVwcm9jZXNzb3IgJlBQKQorICAgIDogVmlzaXRlZChyZWFjaGFibGUuc2l6ZSgpKSwKKyAgICAgIFJlYWNoYWJsZShyZWFjaGFibGUpLAorICAgICAgUFAoUFApIHt9CisKKyAgICB2b2lkIGVucXVldWUoY29uc3QgQ0ZHQmxvY2sgKmJsb2NrKTsKKyAgICB1bnNpZ25lZCBzY2FuQmFja3dhcmRzKGNvbnN0IENGR0Jsb2NrICpTdGFydCwKKyAgICBjbGFuZzo6cmVhY2hhYmxlX2NvZGU6OkNhbGxiYWNrICZDQik7CisKKyAgICBib29sIGlzRGVhZENvZGVSb290KGNvbnN0IENGR0Jsb2NrICpCbG9jayk7CisKKyAgICBjb25zdCBTdG10ICpmaW5kRGVhZENvZGUoY29uc3QgQ0ZHQmxvY2sgKkJsb2NrKTsKKworICAgIHZvaWQgcmVwb3J0RGVhZENvZGUoY29uc3QgQ0ZHQmxvY2sgKkIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpTLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xhbmc6OnJlYWNoYWJsZV9jb2RlOjpDYWxsYmFjayAmQ0IpOworICB9OworfQorCit2b2lkIERlYWRDb2RlU2Nhbjo6ZW5xdWV1ZShjb25zdCBDRkdCbG9jayAqYmxvY2spIHsKICAgdW5zaWduZWQgYmxvY2tJRCA9IGJsb2NrLT5nZXRCbG9ja0lEKCk7CiAgIGlmIChSZWFjaGFibGVbYmxvY2tJRF0gfHwgVmlzaXRlZFtibG9ja0lEXSkKICAgICByZXR1cm47CkBAIC02NCw5ICszNTQsOSBAQAogCiBib29sIERlYWRDb2RlU2Nhbjo6aXNEZWFkQ29kZVJvb3QoY29uc3QgY2xhbmc6OkNGR0Jsb2NrICpCbG9jaykgewogICBib29sIGlzRGVhZFJvb3QgPSB0cnVlOwotICAKKwogICBmb3IgKENGR0Jsb2NrOjpjb25zdF9wcmVkX2l0ZXJhdG9yIEkgPSBCbG9jay0+cHJlZF9iZWdpbigpLAotICAgICAgICBFID0gQmxvY2stPnByZWRfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgRSA9IEJsb2NrLT5wcmVkX2VuZCgpOyBJICE9IEU7ICsrSSkgewogICAgIGlmIChjb25zdCBDRkdCbG9jayAqUHJlZEJsb2NrID0gKkkpIHsKICAgICAgIHVuc2lnbmVkIGJsb2NrSUQgPSBQcmVkQmxvY2stPmdldEJsb2NrSUQoKTsKICAgICAgIGlmIChWaXNpdGVkW2Jsb2NrSURdKSB7CkBAIC04MSw3ICszNzEsNyBAQAogICAgICAgfQogICAgIH0KICAgfQotICAKKwogICByZXR1cm4gaXNEZWFkUm9vdDsKIH0KIApAQCAtMTAwLDExICszOTAsMTMgQEAKICAgICAgIGlmIChpc1ZhbGlkRGVhZFN0bXQoUykpCiAgICAgICAgIHJldHVybiBTOwogICAgIH0KLSAgCisKICAgaWYgKENGR1Rlcm1pbmF0b3IgVCA9IEJsb2NrLT5nZXRUZXJtaW5hdG9yKCkpIHsKLSAgICBjb25zdCBTdG10ICpTID0gVC5nZXRTdG10KCk7Ci0gICAgaWYgKGlzVmFsaWREZWFkU3RtdChTKSkKLSAgICAgIHJldHVybiBTOyAgICAKKyAgICBpZiAoIVQuaXNUZW1wb3JhcnlEdG9yc0JyYW5jaCgpKSB7CisgICAgICBjb25zdCBTdG10ICpTID0gVC5nZXRTdG10KCk7CisgICAgICBpZiAoaXNWYWxpZERlYWRTdG10KFMpKQorICAgICAgICByZXR1cm4gUzsKKyAgICB9CiAgIH0KIAogICByZXR1cm4gMDsKQEAgLTEyNCw3ICs0MTYsNyBAQAogCiAgIHVuc2lnbmVkIGNvdW50ID0gMDsKICAgZW5xdWV1ZShTdGFydCk7Ci0gIAorCiAgIHdoaWxlICghV29ya0xpc3QuZW1wdHkoKSkgewogICAgIGNvbnN0IENGR0Jsb2NrICpCbG9jayA9IFdvcmtMaXN0LnBvcF9iYWNrX3ZhbCgpOwogCkBAIC0xMzUsNyArNDI3LDcgQEAKIAogICAgIC8vIExvb2sgZm9yIGFueSBkZWFkIGNvZGUgd2l0aGluIHRoZSBibG9jay4KICAgICBjb25zdCBTdG10ICpTID0gZmluZERlYWRDb2RlKEJsb2NrKTsKLSAgICAKKwogICAgIGlmICghUykgewogICAgICAgLy8gTm8gZGVhZCBjb2RlLiAgUG9zc2libHkgYW4gZW1wdHkgYmxvY2suICBMb29rIGF0IGRlYWQgcHJlZGVjZXNzb3JzLgogICAgICAgZm9yIChDRkdCbG9jazo6Y29uc3RfcHJlZF9pdGVyYXRvciBJID0gQmxvY2stPnByZWRfYmVnaW4oKSwKQEAgLTE0NSwxNiArNDM3LDE2IEBACiAgICAgICB9CiAgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgCisKICAgICAvLyBTcGVjaWFsbHkgaGFuZGxlIG1hY3JvLWV4cGFuZGVkIGNvZGUuCiAgICAgaWYgKFMtPmdldExvY1N0YXJ0KCkuaXNNYWNyb0lEKCkpIHsKLSAgICAgIGNvdW50ICs9IGNsYW5nOjpyZWFjaGFibGVfY29kZTo6U2NhblJlYWNoYWJsZUZyb21CbG9jayhCbG9jaywgUmVhY2hhYmxlKTsKKyAgICAgIGNvdW50ICs9IHNjYW5NYXliZVJlYWNoYWJsZUZyb21CbG9jayhCbG9jaywgUFAsIFJlYWNoYWJsZSk7CiAgICAgICBjb250aW51ZTsKICAgICB9CiAKICAgICBpZiAoaXNEZWFkQ29kZVJvb3QoQmxvY2spKSB7Ci0gICAgICByZXBvcnREZWFkQ29kZShTLCBDQik7Ci0gICAgICBjb3VudCArPSBjbGFuZzo6cmVhY2hhYmxlX2NvZGU6OlNjYW5SZWFjaGFibGVGcm9tQmxvY2soQmxvY2ssIFJlYWNoYWJsZSk7CisgICAgICByZXBvcnREZWFkQ29kZShCbG9jaywgUywgQ0IpOworICAgICAgY291bnQgKz0gc2Nhbk1heWJlUmVhY2hhYmxlRnJvbUJsb2NrKEJsb2NrLCBQUCwgUmVhY2hhYmxlKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAvLyBSZWNvcmQgdGhpcyBzdGF0ZW1lbnQgYXMgdGhlIHBvc3NpYmx5IGJlc3QgbG9jYXRpb24gaW4gYQpAQCAtMTY5LDE1ICs0NjEsMTUgQEAKICAgaWYgKCFEZWZlcnJlZExvY3MuZW1wdHkoKSkgewogICAgIGxsdm06OmFycmF5X3BvZF9zb3J0KERlZmVycmVkTG9jcy5iZWdpbigpLCBEZWZlcnJlZExvY3MuZW5kKCksIFNyY0NtcCk7CiAgICAgZm9yIChEZWZlcnJlZExvY3NUeTo6aXRlcmF0b3IgSSA9IERlZmVycmVkTG9jcy5iZWdpbigpLAotICAgICAgICAgIEUgPSBEZWZlcnJlZExvY3MuZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBjb25zdCBDRkdCbG9jayAqYmxvY2sgPSBJLT5maXJzdDsKLSAgICAgIGlmIChSZWFjaGFibGVbYmxvY2stPmdldEJsb2NrSUQoKV0pCisgICAgICAgICBFID0gRGVmZXJyZWRMb2NzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgY29uc3QgQ0ZHQmxvY2sgKkJsb2NrID0gSS0+Zmlyc3Q7CisgICAgICBpZiAoUmVhY2hhYmxlW0Jsb2NrLT5nZXRCbG9ja0lEKCldKQogICAgICAgICBjb250aW51ZTsKLSAgICAgIHJlcG9ydERlYWRDb2RlKEktPnNlY29uZCwgQ0IpOwotICAgICAgY291bnQgKz0gY2xhbmc6OnJlYWNoYWJsZV9jb2RlOjpTY2FuUmVhY2hhYmxlRnJvbUJsb2NrKGJsb2NrLCBSZWFjaGFibGUpOworICAgICAgcmVwb3J0RGVhZENvZGUoQmxvY2ssIEktPnNlY29uZCwgQ0IpOworICAgICAgY291bnQgKz0gc2Nhbk1heWJlUmVhY2hhYmxlRnJvbUJsb2NrKEJsb2NrLCBQUCwgUmVhY2hhYmxlKTsKICAgICB9CiAgIH0KLSAgICAKKwogICByZXR1cm4gY291bnQ7CiB9CiAKQEAgLTIwOCw3ICs1MDAsNyBAQAogICAgIGNhc2UgRXhwcjo6QmluYXJ5Q29uZGl0aW9uYWxPcGVyYXRvckNsYXNzOgogICAgIGNhc2UgRXhwcjo6Q29uZGl0aW9uYWxPcGVyYXRvckNsYXNzOiB7CiAgICAgICBjb25zdCBBYnN0cmFjdENvbmRpdGlvbmFsT3BlcmF0b3IgKkNPID0KLSAgICAgICAgY2FzdDxBYnN0cmFjdENvbmRpdGlvbmFsT3BlcmF0b3I+KFMpOworICAgICAgY2FzdDxBYnN0cmFjdENvbmRpdGlvbmFsT3BlcmF0b3I+KFMpOwogICAgICAgcmV0dXJuIENPLT5nZXRRdWVzdGlvbkxvYygpOwogICAgIH0KICAgICBjYXNlIEV4cHI6Ok1lbWJlckV4cHJDbGFzczogewpAQCAtMjQ2LDYxICs1MzgsODYgQEAKICAgcmV0dXJuIFMtPmdldExvY1N0YXJ0KCk7CiB9CiAKLXZvaWQgRGVhZENvZGVTY2FuOjpyZXBvcnREZWFkQ29kZShjb25zdCBTdG10ICpTLAordm9pZCBEZWFkQ29kZVNjYW46OnJlcG9ydERlYWRDb2RlKGNvbnN0IENGR0Jsb2NrICpCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0bXQgKlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhbmc6OnJlYWNoYWJsZV9jb2RlOjpDYWxsYmFjayAmQ0IpIHsKKyAgLy8gQ2xhc3NpZnkgdGhlIHVucmVhY2hhYmxlIGNvZGUgZm91bmQsIG9yIHN1cHByZXNzIGl0IGluIHNvbWUgY2FzZXMuCisgIHJlYWNoYWJsZV9jb2RlOjpVbnJlYWNoYWJsZUtpbmQgVUsgPSByZWFjaGFibGVfY29kZTo6VUtfT3RoZXI7CisKKyAgaWYgKGlzYTxCcmVha1N0bXQ+KFMpKSB7CisgICAgVUsgPSByZWFjaGFibGVfY29kZTo6VUtfQnJlYWs7CisgIH0KKyAgZWxzZSBpZiAoaXNUcml2aWFsRG9XaGlsZShCLCBTKSkgeworICAgIHJldHVybjsKKyAgfQorICBlbHNlIGlmIChpc0RlYWRSZXR1cm4oQiwgUykpIHsKKyAgICBVSyA9IHJlYWNoYWJsZV9jb2RlOjpVS19SZXR1cm47CisgIH0KKworICBTb3VyY2VSYW5nZSBTaWxlbmNlYWJsZUNvbmRWYWw7CisKKyAgaWYgKFVLID09IHJlYWNoYWJsZV9jb2RlOjpVS19PdGhlcikgeworICAgIC8vIENoZWNrIGlmIHRoZSBkZWFkIGNvZGUgaXMgcGFydCBvZiB0aGUgImxvb3AgdGFyZ2V0IiBvZgorICAgIC8vIGEgZm9yL2Zvci1yYW5nZSBsb29wLiAgVGhpcyBpcyB0aGUgYmxvY2sgdGhhdCBjb250YWlucworICAgIC8vIHRoZSBpbmNyZW1lbnQgY29kZS4KKyAgICBpZiAoY29uc3QgU3RtdCAqTG9vcFRhcmdldCA9IEItPmdldExvb3BUYXJnZXQoKSkgeworICAgICAgU291cmNlTG9jYXRpb24gTG9jID0gTG9vcFRhcmdldC0+Z2V0TG9jU3RhcnQoKTsKKyAgICAgIFNvdXJjZVJhbmdlIFIxKExvYywgTG9jKSwgUjI7CisKKyAgICAgIGlmIChjb25zdCBGb3JTdG10ICpGUyA9IGR5bl9jYXN0PEZvclN0bXQ+KExvb3BUYXJnZXQpKSB7CisgICAgICAgIGNvbnN0IEV4cHIgKkluYyA9IEZTLT5nZXRJbmMoKTsKKyAgICAgICAgTG9jID0gSW5jLT5nZXRMb2NTdGFydCgpOworICAgICAgICBSMiA9IEluYy0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgIH0KKworICAgICAgQ0IuSGFuZGxlVW5yZWFjaGFibGUocmVhY2hhYmxlX2NvZGU6OlVLX0xvb3BfSW5jcmVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jLCBTb3VyY2VSYW5nZSgpLCBTb3VyY2VSYW5nZShMb2MsIExvYyksIFIyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgLy8gQ2hlY2sgaWYgdGhlIGRlYWQgYmxvY2sgaGFzIGEgcHJlZGVjZXNzb3Igd2hvc2UgYnJhbmNoIGhhcworICAgIC8vIGEgY29uZmlndXJhdGlvbiB2YWx1ZSB0aGF0ICpjb3VsZCogYmUgbW9kaWZpZWQgdG8KKyAgICAvLyBzaWxlbmNlIHRoZSB3YXJuaW5nLgorICAgIENGR0Jsb2NrOjpjb25zdF9wcmVkX2l0ZXJhdG9yIFBJID0gQi0+cHJlZF9iZWdpbigpOworICAgIGlmIChQSSAhPSBCLT5wcmVkX2VuZCgpKSB7CisgICAgICBpZiAoY29uc3QgQ0ZHQmxvY2sgKlByZWRCbG9jayA9IFBJLT5nZXRQb3NzaWJseVVucmVhY2hhYmxlQmxvY2soKSkgeworICAgICAgICBjb25zdCBTdG10ICpUZXJtQ29uZCA9CisgICAgICAgICAgICBQcmVkQmxvY2stPmdldFRlcm1pbmF0b3JDb25kaXRpb24oLyogc3RyaXAgcGFyZW5zICovIGZhbHNlKTsKKyAgICAgICAgaXNDb25maWd1cmF0aW9uVmFsdWUoVGVybUNvbmQsIFBQLCAmU2lsZW5jZWFibGVDb25kVmFsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKwogICBTb3VyY2VSYW5nZSBSMSwgUjI7CiAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IEdldFVucmVhY2hhYmxlTG9jKFMsIFIxLCBSMik7Ci0gIENCLkhhbmRsZVVucmVhY2hhYmxlKExvYywgUjEsIFIyKTsKKyAgQ0IuSGFuZGxlVW5yZWFjaGFibGUoVUssIExvYywgU2lsZW5jZWFibGVDb25kVmFsLCBSMSwgUjIpOwogfQogCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUmVhY2hhYmlsaXR5IEFQSXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCiBuYW1lc3BhY2UgY2xhbmcgeyBuYW1lc3BhY2UgcmVhY2hhYmxlX2NvZGUgewogCi12b2lkIENhbGxiYWNrOjphbmNob3IoKSB7IH0gIAordm9pZCBDYWxsYmFjazo6YW5jaG9yKCkgeyB9CiAKIHVuc2lnbmVkIFNjYW5SZWFjaGFibGVGcm9tQmxvY2soY29uc3QgQ0ZHQmxvY2sgKlN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCaXRWZWN0b3IgJlJlYWNoYWJsZSkgewotICB1bnNpZ25lZCBjb3VudCA9IDA7Ci0gIAotICAvLyBQcmVwIHdvcmsgcXVldWUKLSAgU21hbGxWZWN0b3I8Y29uc3QgQ0ZHQmxvY2sqLCAzMj4gV0w7Ci0gIAotICAvLyBUaGUgZW50cnkgYmxvY2sgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIG1hcmtlZCByZWFjaGFibGUKLSAgLy8gYnkgdGhlIGNhbGxlci4KLSAgaWYgKCFSZWFjaGFibGVbU3RhcnQtPmdldEJsb2NrSUQoKV0pIHsKLSAgICArK2NvdW50OwotICAgIFJlYWNoYWJsZVtTdGFydC0+Z2V0QmxvY2tJRCgpXSA9IHRydWU7Ci0gIH0KLSAgCi0gIFdMLnB1c2hfYmFjayhTdGFydCk7Ci0gIAotICAvLyBGaW5kIHRoZSByZWFjaGFibGUgYmxvY2tzIGZyb20gJ1N0YXJ0Jy4KLSAgd2hpbGUgKCFXTC5lbXB0eSgpKSB7Ci0gICAgY29uc3QgQ0ZHQmxvY2sgKml0ZW0gPSBXTC5wb3BfYmFja192YWwoKTsKLSAgICAKLSAgICAvLyBMb29rIGF0IHRoZSBzdWNjZXNzb3JzIGFuZCBtYXJrIHRoZW4gcmVhY2hhYmxlLgotICAgIGZvciAoQ0ZHQmxvY2s6OmNvbnN0X3N1Y2NfaXRlcmF0b3IgSSA9IGl0ZW0tPnN1Y2NfYmVnaW4oKSwgCi0gICAgICAgICBFID0gaXRlbS0+c3VjY19lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgICBpZiAoY29uc3QgQ0ZHQmxvY2sgKkIgPSAqSSkgewotICAgICAgICB1bnNpZ25lZCBibG9ja0lEID0gQi0+Z2V0QmxvY2tJRCgpOwotICAgICAgICBpZiAoIVJlYWNoYWJsZVtibG9ja0lEXSkgewotICAgICAgICAgIFJlYWNoYWJsZS5zZXQoYmxvY2tJRCk7Ci0gICAgICAgICAgV0wucHVzaF9iYWNrKEIpOwotICAgICAgICAgICsrY291bnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgfQotICByZXR1cm4gY291bnQ7CisgIHJldHVybiBzY2FuRnJvbUJsb2NrKFN0YXJ0LCBSZWFjaGFibGUsIC8qIFNvdXJjZU1hbmFnZXIqICovIDAsIGZhbHNlKTsKIH0KLSAgCi12b2lkIEZpbmRVbnJlYWNoYWJsZUNvZGUoQW5hbHlzaXNEZWNsQ29udGV4dCAmQUMsIENhbGxiYWNrICZDQikgeworCit2b2lkIEZpbmRVbnJlYWNoYWJsZUNvZGUoQW5hbHlzaXNEZWNsQ29udGV4dCAmQUMsIFByZXByb2Nlc3NvciAmUFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2sgJkNCKSB7CisKICAgQ0ZHICpjZmcgPSBBQy5nZXRDRkcoKTsKICAgaWYgKCFjZmcpCiAgICAgcmV0dXJuOwogCi0gIC8vIFNjYW4gZm9yIHJlYWNoYWJsZSBibG9ja3MgZnJvbSB0aGUgZW50cmFuY2Ugb2YgdGhlIENGRy4gIAorICAvLyBTY2FuIGZvciByZWFjaGFibGUgYmxvY2tzIGZyb20gdGhlIGVudHJhbmNlIG9mIHRoZSBDRkcuCiAgIC8vIElmIHRoZXJlIGFyZSBubyB1bnJlYWNoYWJsZSBibG9ja3MsIHdlJ3JlIGRvbmUuCiAgIGxsdm06OkJpdFZlY3RvciByZWFjaGFibGUoY2ZnLT5nZXROdW1CbG9ja0lEcygpKTsKLSAgdW5zaWduZWQgbnVtUmVhY2hhYmxlID0gU2NhblJlYWNoYWJsZUZyb21CbG9jaygmY2ZnLT5nZXRFbnRyeSgpLCByZWFjaGFibGUpOworICB1bnNpZ25lZCBudW1SZWFjaGFibGUgPQorICAgIHNjYW5NYXliZVJlYWNoYWJsZUZyb21CbG9jaygmY2ZnLT5nZXRFbnRyeSgpLCBQUCwgcmVhY2hhYmxlKTsKICAgaWYgKG51bVJlYWNoYWJsZSA9PSBjZmctPmdldE51bUJsb2NrSURzKCkpCiAgICAgcmV0dXJuOwogICAKQEAgLTMwOSw3ICs2MjYsNyBAQAogICBpZiAoIUFDLmdldENGR0J1aWxkT3B0aW9ucygpLkFkZEVIRWRnZXMpIHsKICAgICBmb3IgKENGRzo6dHJ5X2Jsb2NrX2l0ZXJhdG9yIEkgPSBjZmctPnRyeV9ibG9ja3NfYmVnaW4oKSwKICAgICAgICAgIEUgPSBjZmctPnRyeV9ibG9ja3NfZW5kKCkgOyBJICE9IEU7ICsrSSkgewotICAgICAgbnVtUmVhY2hhYmxlICs9IFNjYW5SZWFjaGFibGVGcm9tQmxvY2soKkksIHJlYWNoYWJsZSk7CisgICAgICBudW1SZWFjaGFibGUgKz0gc2Nhbk1heWJlUmVhY2hhYmxlRnJvbUJsb2NrKCpJLCBQUCwgcmVhY2hhYmxlKTsKICAgICB9CiAgICAgaWYgKG51bVJlYWNoYWJsZSA9PSBjZmctPmdldE51bUJsb2NrSURzKCkpCiAgICAgICByZXR1cm47CkBAIC0zMjMsNyArNjQwLDcgQEAKICAgICBpZiAocmVhY2hhYmxlW2Jsb2NrLT5nZXRCbG9ja0lEKCldKQogICAgICAgY29udGludWU7CiAgICAgCi0gICAgRGVhZENvZGVTY2FuIERTKHJlYWNoYWJsZSk7CisgICAgRGVhZENvZGVTY2FuIERTKHJlYWNoYWJsZSwgUFApOwogICAgIG51bVJlYWNoYWJsZSArPSBEUy5zY2FuQmFja3dhcmRzKGJsb2NrLCBDQik7CiAgICAgCiAgICAgaWYgKG51bVJlYWNoYWJsZSA9PSBjZmctPmdldE51bUJsb2NrSURzKCkpCmRpZmYgLS1naXQgYS9saWIvQW5hbHlzaXMvU2NhbmZGb3JtYXRTdHJpbmcuY3BwIGIvbGliL0FuYWx5c2lzL1NjYW5mRm9ybWF0U3RyaW5nLmNwcAppbmRleCBmNWNlODRmLi4zZmY3ZjBhIDEwMDY0NAotLS0gYS9saWIvQW5hbHlzaXMvU2NhbmZGb3JtYXRTdHJpbmcuY3BwCisrKyBiL2xpYi9BbmFseXNpcy9TY2FuZkZvcm1hdFN0cmluZy5jcHAKQEAgLTM3OSwyMSArMzc5LDIzIEBACiAgIHJldHVybiBBcmdUeXBlKCk7CiB9CiAKLWJvb2wgU2NhbmZTcGVjaWZpZXI6OmZpeFR5cGUoUXVhbFR5cGUgUVQsIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0LAorYm9vbCBTY2FuZlNwZWNpZmllcjo6Zml4VHlwZShRdWFsVHlwZSBRVCwgUXVhbFR5cGUgUmF3UVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RDb250ZXh0ICZDdHgpIHsKLSAgaWYgKCFRVC0+aXNQb2ludGVyVHlwZSgpKQotICAgIHJldHVybiBmYWxzZTsKIAogICAvLyAlbiBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlciBjb252ZXJzaW9uIHNwZWNpZmllcnM7IGRvbid0IHRyeSB0byBmaXggaXQuCiAgIGlmIChDUy5nZXRLaW5kKCkgPT0gQ29udmVyc2lvblNwZWNpZmllcjo6bkFyZykKICAgICByZXR1cm4gZmFsc2U7CiAKKyAgaWYgKCFRVC0+aXNQb2ludGVyVHlwZSgpKQorICAgIHJldHVybiBmYWxzZTsKKwogICBRdWFsVHlwZSBQVCA9IFFULT5nZXRQb2ludGVlVHlwZSgpOwogCiAgIC8vIElmIGl0J3MgYW4gZW51bSwgZ2V0IGl0cyB1bmRlcmx5aW5nIHR5cGUuCi0gIGlmIChjb25zdCBFbnVtVHlwZSAqRVR5ID0gUVQtPmdldEFzPEVudW1UeXBlPigpKQotICAgIFFUID0gRVR5LT5nZXREZWNsKCktPmdldEludGVnZXJUeXBlKCk7Ci0gIAorICBpZiAoY29uc3QgRW51bVR5cGUgKkVUeSA9IFBULT5nZXRBczxFbnVtVHlwZT4oKSkKKyAgICBQVCA9IEVUeS0+Z2V0RGVjbCgpLT5nZXRJbnRlZ2VyVHlwZSgpOworCiAgIGNvbnN0IEJ1aWx0aW5UeXBlICpCVCA9IFBULT5nZXRBczxCdWlsdGluVHlwZT4oKTsKICAgaWYgKCFCVCkKICAgICByZXR1cm4gZmFsc2U7CkBAIC00MDUsNiArNDA3LDE1IEBACiAgICAgICBMTS5zZXRLaW5kKExlbmd0aE1vZGlmaWVyOjpBc1dpZGVDaGFyKTsKICAgICBlbHNlCiAgICAgICBMTS5zZXRLaW5kKExlbmd0aE1vZGlmaWVyOjpOb25lKTsKKworICAgIC8vIElmIHdlIGtub3cgdGhlIHRhcmdldCBhcnJheSBsZW5ndGgsIHdlIGNhbiB1c2UgaXQgYXMgYSBmaWVsZCB3aWR0aC4KKyAgICBpZiAoY29uc3QgQ29uc3RhbnRBcnJheVR5cGUgKkNBVCA9IEN0eC5nZXRBc0NvbnN0YW50QXJyYXlUeXBlKFJhd1FUKSkgeworICAgICAgaWYgKENBVC0+Z2V0U2l6ZU1vZGlmaWVyKCkgPT0gQXJyYXlUeXBlOjpOb3JtYWwpCisgICAgICAgIEZpZWxkV2lkdGggPSBPcHRpb25hbEFtb3VudChPcHRpb25hbEFtb3VudDo6Q29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVQtPmdldFNpemUoKS5nZXRaRXh0VmFsdWUoKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgMCwgZmFsc2UpOworCisgICAgfQogICAgIHJldHVybiB0cnVlOwogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9UaHJlYWRTYWZldHkuY3BwIGIvbGliL0FuYWx5c2lzL1RocmVhZFNhZmV0eS5jcHAKaW5kZXggNmUwZTE3My4uZmQ4MDRlYiAxMDA2NDQKLS0tIGEvbGliL0FuYWx5c2lzL1RocmVhZFNhZmV0eS5jcHAKKysrIGIvbGliL0FuYWx5c2lzL1RocmVhZFNhZmV0eS5jcHAKQEAgLTE3MiwxMiArMTcyLDkgQEAKICAgICBjb25zdCBFeHByKiBjb25zdCogRnVuQXJnczsgICAgLy8gRnVuY3Rpb24gYXJndW1lbnRzCiAgICAgQ2FsbGluZ0NvbnRleHQqICAgIFByZXZDdHg7ICAgIC8vIFRoZSBwcmV2aW91cyBjb250ZXh0OyBvciAwIGlmIG5vbmUuCiAKLSAgICBDYWxsaW5nQ29udGV4dChjb25zdCBOYW1lZERlY2wgKkQgPSAwLCBjb25zdCBFeHByICpTID0gMCwKLSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOID0gMCwgY29uc3QgRXhwciogY29uc3QgKkEgPSAwLAotICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb250ZXh0ICpQID0gMCkKLSAgICAgIDogQXR0ckRlY2woRCksIFNlbGZBcmcoUyksIFNlbGZBcnJvdyhmYWxzZSksCi0gICAgICAgIE51bUFyZ3MoTiksIEZ1bkFyZ3MoQSksIFByZXZDdHgoUCkKLSAgICB7IH0KKyAgICBDYWxsaW5nQ29udGV4dChjb25zdCBOYW1lZERlY2wgKkQpCisgICAgICAgIDogQXR0ckRlY2woRCksIFNlbGZBcmcoMCksIFNlbGZBcnJvdyhmYWxzZSksIE51bUFyZ3MoMCksIEZ1bkFyZ3MoMCksCisgICAgICAgICAgUHJldkN0eCgwKSB7fQogICB9OwogCiAgIHR5cGVkZWYgU21hbGxWZWN0b3I8U0V4cHJOb2RlLCA0PiBOb2RlVmVjdG9yOwpAQCAtMTg4LDQ0ICsxODUsNDEgQEAKICAgTm9kZVZlY3RvciBOb2RlVmVjOwogCiBwcml2YXRlOgorICB1bnNpZ25lZCBtYWtlKEV4cHJPcCBPLCB1bnNpZ25lZCBGID0gMCwgY29uc3Qgdm9pZCAqRCA9IDApIHsKKyAgICBOb2RlVmVjLnB1c2hfYmFjayhTRXhwck5vZGUoTywgRiwgRCkpOworICAgIHJldHVybiBOb2RlVmVjLnNpemUoKSAtIDE7CisgIH0KKwogICB1bnNpZ25lZCBtYWtlTm9wKCkgewotICAgIE5vZGVWZWMucHVzaF9iYWNrKFNFeHByTm9kZShFT1BfTm9wLCAwLCAwKSk7Ci0gICAgcmV0dXJuIE5vZGVWZWMuc2l6ZSgpLTE7CisgICAgcmV0dXJuIG1ha2UoRU9QX05vcCk7CiAgIH0KIAogICB1bnNpZ25lZCBtYWtlV2lsZGNhcmQoKSB7Ci0gICAgTm9kZVZlYy5wdXNoX2JhY2soU0V4cHJOb2RlKEVPUF9XaWxkY2FyZCwgMCwgMCkpOwotICAgIHJldHVybiBOb2RlVmVjLnNpemUoKS0xOworICAgIHJldHVybiBtYWtlKEVPUF9XaWxkY2FyZCk7CiAgIH0KIAogICB1bnNpZ25lZCBtYWtlVW5pdmVyc2FsKCkgewotICAgIE5vZGVWZWMucHVzaF9iYWNrKFNFeHByTm9kZShFT1BfVW5pdmVyc2FsLCAwLCAwKSk7Ci0gICAgcmV0dXJuIE5vZGVWZWMuc2l6ZSgpLTE7CisgICAgcmV0dXJuIG1ha2UoRU9QX1VuaXZlcnNhbCk7CiAgIH0KIAogICB1bnNpZ25lZCBtYWtlTmFtZWRWYXIoY29uc3QgTmFtZWREZWNsICpEKSB7Ci0gICAgTm9kZVZlYy5wdXNoX2JhY2soU0V4cHJOb2RlKEVPUF9OVmFyLCAwLCBEKSk7Ci0gICAgcmV0dXJuIE5vZGVWZWMuc2l6ZSgpLTE7CisgICAgcmV0dXJuIG1ha2UoRU9QX05WYXIsIDAsIEQpOwogICB9CiAKICAgdW5zaWduZWQgbWFrZUxvY2FsVmFyKGNvbnN0IE5hbWVkRGVjbCAqRCkgewotICAgIE5vZGVWZWMucHVzaF9iYWNrKFNFeHByTm9kZShFT1BfTFZhciwgMCwgRCkpOwotICAgIHJldHVybiBOb2RlVmVjLnNpemUoKS0xOworICAgIHJldHVybiBtYWtlKEVPUF9MVmFyLCAwLCBEKTsKICAgfQogCiAgIHVuc2lnbmVkIG1ha2VUaGlzKCkgewotICAgIE5vZGVWZWMucHVzaF9iYWNrKFNFeHByTm9kZShFT1BfVGhpcywgMCwgMCkpOwotICAgIHJldHVybiBOb2RlVmVjLnNpemUoKS0xOworICAgIHJldHVybiBtYWtlKEVPUF9UaGlzKTsKICAgfQogCiAgIHVuc2lnbmVkIG1ha2VEb3QoY29uc3QgTmFtZWREZWNsICpELCBib29sIEFycm93KSB7Ci0gICAgTm9kZVZlYy5wdXNoX2JhY2soU0V4cHJOb2RlKEVPUF9Eb3QsIEFycm93ID8gMSA6IDAsIEQpKTsKLSAgICByZXR1cm4gTm9kZVZlYy5zaXplKCktMTsKKyAgICByZXR1cm4gbWFrZShFT1BfRG90LCBBcnJvdyA/IDEgOiAwLCBEKTsKICAgfQogCiAgIHVuc2lnbmVkIG1ha2VDYWxsKHVuc2lnbmVkIE51bUFyZ3MsIGNvbnN0IE5hbWVkRGVjbCAqRCkgewotICAgIE5vZGVWZWMucHVzaF9iYWNrKFNFeHByTm9kZShFT1BfQ2FsbCwgTnVtQXJncywgRCkpOwotICAgIHJldHVybiBOb2RlVmVjLnNpemUoKS0xOworICAgIHJldHVybiBtYWtlKEVPUF9DYWxsLCBOdW1BcmdzLCBEKTsKICAgfQogCiAgIC8vIEdyYWIgdGhlIHZlcnkgZmlyc3QgZGVjbGFyYXRpb24gb2YgdmlydHVhbCBtZXRob2QgRApAQCAtMjQyLDI4ICsyMzYsMjMgQEAKICAgfQogCiAgIHVuc2lnbmVkIG1ha2VNQ2FsbCh1bnNpZ25lZCBOdW1BcmdzLCBjb25zdCBDWFhNZXRob2REZWNsICpEKSB7Ci0gICAgTm9kZVZlYy5wdXNoX2JhY2soU0V4cHJOb2RlKEVPUF9NQ2FsbCwgTnVtQXJncywgZ2V0Rmlyc3RWaXJ0dWFsRGVjbChEKSkpOwotICAgIHJldHVybiBOb2RlVmVjLnNpemUoKS0xOworICAgIHJldHVybiBtYWtlKEVPUF9NQ2FsbCwgTnVtQXJncywgZ2V0Rmlyc3RWaXJ0dWFsRGVjbChEKSk7CiAgIH0KIAogICB1bnNpZ25lZCBtYWtlSW5kZXgoKSB7Ci0gICAgTm9kZVZlYy5wdXNoX2JhY2soU0V4cHJOb2RlKEVPUF9JbmRleCwgMCwgMCkpOwotICAgIHJldHVybiBOb2RlVmVjLnNpemUoKS0xOworICAgIHJldHVybiBtYWtlKEVPUF9JbmRleCk7CiAgIH0KIAogICB1bnNpZ25lZCBtYWtlVW5hcnkoKSB7Ci0gICAgTm9kZVZlYy5wdXNoX2JhY2soU0V4cHJOb2RlKEVPUF9VbmFyeSwgMCwgMCkpOwotICAgIHJldHVybiBOb2RlVmVjLnNpemUoKS0xOworICAgIHJldHVybiBtYWtlKEVPUF9VbmFyeSk7CiAgIH0KIAogICB1bnNpZ25lZCBtYWtlQmluYXJ5KCkgewotICAgIE5vZGVWZWMucHVzaF9iYWNrKFNFeHByTm9kZShFT1BfQmluYXJ5LCAwLCAwKSk7Ci0gICAgcmV0dXJuIE5vZGVWZWMuc2l6ZSgpLTE7CisgICAgcmV0dXJuIG1ha2UoRU9QX0JpbmFyeSk7CiAgIH0KIAogICB1bnNpZ25lZCBtYWtlVW5rbm93bih1bnNpZ25lZCBBcml0eSkgewotICAgIE5vZGVWZWMucHVzaF9iYWNrKFNFeHByTm9kZShFT1BfVW5rbm93biwgQXJpdHksIDApKTsKLSAgICByZXR1cm4gTm9kZVZlYy5zaXplKCktMTsKKyAgICByZXR1cm4gbWFrZShFT1BfVW5rbm93biwgQXJpdHkpOwogICB9CiAKICAgaW5saW5lIGJvb2wgaXNDYWxsZWVBcnJvdyhjb25zdCBFeHByICpFKSB7CkBAIC0yNzcsNyArMjY2LDcgQEAKICAgLy8vIGVuc3VyZSB0aGF0IHRoZSBvcmlnaW5hbCBleHByZXNzaW9uIGlzIGEgdmFsaWQgbXV0ZXggZXhwcmVzc2lvbi4KICAgLy8vCiAgIC8vLyBORGVyZWYgcmV0dXJucyB0aGUgbnVtYmVyIG9mIERlcmVmZW5jZSBhbmQgQWRkcmVzc09mIG9wZXJhdGlvbnMKLSAgLy8vIHByZWNlZWRpbmcgdGhlIEV4cHI7IHRoaXMgaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBwcmV0dHktcHJpbnQKKyAgLy8vIHByZWNlZGluZyB0aGUgRXhwcjsgdGhpcyBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHByZXR0eS1wcmludAogICAvLy8gU0V4cHJzIHdpdGggLiBvciAtPi4KICAgdW5zaWduZWQgYnVpbGRTRXhwcihjb25zdCBFeHByICpFeHAsIENhbGxpbmdDb250ZXh0KiBDYWxsQ3R4LAogICAgICAgICAgICAgICAgICAgICAgIGludCogTkRlcmVmID0gMCkgewpAQCAtNTc1LDE1ICs1NjQsMTUgQEAKIAogICAvLy8gSXNzdWUgYSB3YXJuaW5nIGFib3V0IGFuIGludmFsaWQgbG9jayBleHByZXNzaW9uCiAgIHN0YXRpYyB2b2lkIHdhcm5JbnZhbGlkTG9jayhUaHJlYWRTYWZldHlIYW5kbGVyICZIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqTXV0ZXhFeHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpEZWNsRXhwLCBjb25zdCBOYW1lZERlY2wqIEQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKk11dGV4RXhwLCBjb25zdCBFeHByICpEZWNsRXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZWREZWNsICpELCBTdHJpbmdSZWYgS2luZCkgewogICAgIFNvdXJjZUxvY2F0aW9uIExvYzsKICAgICBpZiAoRGVjbEV4cCkKICAgICAgIExvYyA9IERlY2xFeHAtPmdldEV4cHJMb2MoKTsKIAogICAgIC8vIEZJWE1FOiBhZGQgYSBub3RlIGFib3V0IHRoZSBhdHRyaWJ1dGUgbG9jYXRpb24gaW4gTXV0ZXhFeHAgb3IgRAogICAgIGlmIChMb2MuaXNWYWxpZCgpKQotICAgICAgSGFuZGxlci5oYW5kbGVJbnZhbGlkTG9ja0V4cChMb2MpOworICAgICAgSGFuZGxlci5oYW5kbGVJbnZhbGlkTG9ja0V4cChLaW5kLCBMb2MpOwogICB9CiAKICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNFeHByICZvdGhlcikgY29uc3QgewpAQCAtNzE2LDI3ICs3MDUsMTYgQEAKICAgfQogfTsKIAotCi0KIC8vLyBcYnJpZWYgQSBzaG9ydCBsaXN0IG9mIFNFeHBycwogY2xhc3MgTXV0ZXhJRExpc3QgOiBwdWJsaWMgU21hbGxWZWN0b3I8U0V4cHIsIDM+IHsKIHB1YmxpYzoKLSAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGlzdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIFNFeHByCi0gIC8vLyBQZXJmb3JtcyBhIGxpbmVhciBzZWFyY2gsIGJlY2F1c2UgdGhlc2UgbGlzdHMgYXJlIGFsbW9zdCBhbHdheXMgdmVyeSBzbWFsbC4KLSAgYm9vbCBjb250YWlucyhjb25zdCBTRXhwciYgTSkgewotICAgIGZvciAoaXRlcmF0b3IgST1iZWdpbigpLEU9ZW5kKCk7IEkgIT0gRTsgKytJKQotICAgICAgaWYgKCgqSSkgPT0gTSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8vIFxicmllZiBQdXNoIE0gb250byBsaXN0LCBidWQgZGlzY2FyZCBkdXBsaWNhdGVzCisgIC8vLyBcYnJpZWYgUHVzaCBNIG9udG8gbGlzdCwgYnV0IGRpc2NhcmQgZHVwbGljYXRlcy4KICAgdm9pZCBwdXNoX2JhY2tfbm9kdXAoY29uc3QgU0V4cHImIE0pIHsKLSAgICBpZiAoIWNvbnRhaW5zKE0pKSBwdXNoX2JhY2soTSk7CisgICAgaWYgKGVuZCgpID09IHN0ZDo6ZmluZChiZWdpbigpLCBlbmQoKSwgTSkpCisgICAgICBwdXNoX2JhY2soTSk7CiAgIH0KIH07CiAKLQotCiAvLy8gXGJyaWVmIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdGhhdCBzdG9yZXMgaW5mbyBhYm91dCB0aGUgbW9zdCByZWNlbnQKIC8vLyBhY2NxdWlyZSBvZiBhIExvY2suCiAvLy8KQEAgLTE0NTAsOSArMTQyOCwxMCBAQAogcHVibGljOgogICBUaHJlYWRTYWZldHlBbmFseXplcihUaHJlYWRTYWZldHlIYW5kbGVyICZIKSA6IEhhbmRsZXIoSCkge30KIAotICB2b2lkIGFkZExvY2soRmFjdFNldCAmRlNldCwgY29uc3QgU0V4cHIgJk11dGV4LCBjb25zdCBMb2NrRGF0YSAmTERhdCk7Ci0gIHZvaWQgcmVtb3ZlTG9jayhGYWN0U2V0ICZGU2V0LCBjb25zdCBTRXhwciAmTXV0ZXgsCi0gICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBVbmxvY2tMb2MsIGJvb2wgRnVsbHlSZW1vdmU9ZmFsc2UpOworICB2b2lkIGFkZExvY2soRmFjdFNldCAmRlNldCwgY29uc3QgU0V4cHIgJk11dGV4LCBjb25zdCBMb2NrRGF0YSAmTERhdCwKKyAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEaWFnS2luZCk7CisgIHZvaWQgcmVtb3ZlTG9jayhGYWN0U2V0ICZGU2V0LCBjb25zdCBTRXhwciAmTXV0ZXgsIFNvdXJjZUxvY2F0aW9uIFVubG9ja0xvYywKKyAgICAgICAgICAgICAgICAgIGJvb2wgRnVsbHlSZW1vdmUsIExvY2tLaW5kIEtpbmQsIFN0cmluZ1JlZiBEaWFnS2luZCk7CiAKICAgdGVtcGxhdGUgPHR5cGVuYW1lIEF0dHJUeXBlPgogICB2b2lkIGdldE11dGV4SURzKE11dGV4SURMaXN0ICZNdHhzLCBBdHRyVHlwZSAqQXR0ciwgRXhwciAqRXhwLApAQCAtMTQ4NSwxMiArMTQ2NCw4OSBAQAogICB2b2lkIHJ1bkFuYWx5c2lzKEFuYWx5c2lzRGVjbENvbnRleHQgJkFDKTsKIH07CiAKKy8vLyBcYnJpZWYgR2V0cyB0aGUgdmFsdWUgZGVjbCBwb2ludGVyIGZyb20gRGVjbFJlZkV4cHJzIG9yIE1lbWJlckV4cHJzLgorc3RhdGljIGNvbnN0IFZhbHVlRGVjbCAqZ2V0VmFsdWVEZWNsKGNvbnN0IEV4cHIgKkV4cCkgeworICBpZiAoY29uc3QgYXV0byAqQ0UgPSBkeW5fY2FzdDxJbXBsaWNpdENhc3RFeHByPihFeHApKQorICAgIHJldHVybiBnZXRWYWx1ZURlY2woQ0UtPmdldFN1YkV4cHIoKSk7CisKKyAgaWYgKGNvbnN0IGF1dG8gKkRSID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KEV4cCkpCisgICAgcmV0dXJuIERSLT5nZXREZWNsKCk7CisKKyAgaWYgKGNvbnN0IGF1dG8gKk1FID0gZHluX2Nhc3Q8TWVtYmVyRXhwcj4oRXhwKSkKKyAgICByZXR1cm4gTUUtPmdldE1lbWJlckRlY2woKTsKKworICByZXR1cm4gbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5PgorY2xhc3MgaGFzX2FyZ19pdGVyYXRvciB7CisgIHR5cGVkZWYgY2hhciB5ZXNbMV07CisgIHR5cGVkZWYgY2hhciBub1syXTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5uZXI+CisgIHN0YXRpYyB5ZXMmIHRlc3QoSW5uZXIgKkksIGRlY2x0eXBlKEktPmFyZ3NfYmVnaW4oKSkgKiA9IG51bGxwdHIpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZT4KKyAgc3RhdGljIG5vJiB0ZXN0KC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzaXplb2YodGVzdDxUeT4obnVsbHB0cikpID09IHNpemVvZih5ZXMpOworfTsKKworc3RhdGljIFN0cmluZ1JlZiBDbGFzc2lmeURpYWdub3N0aWMoY29uc3QgQ2FwYWJpbGl0eUF0dHIgKkEpIHsKKyAgcmV0dXJuIEEtPmdldE5hbWUoKTsKK30KKworc3RhdGljIFN0cmluZ1JlZiBDbGFzc2lmeURpYWdub3N0aWMoUXVhbFR5cGUgVkRUKSB7CisgIC8vIFdlIG5lZWQgdG8gbG9vayBhdCB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIHRvIGRldGVybWluZQorICAvLyB3aGljaCBpdCBpcy4gVGhlIHR5cGUgc2hvdWxkIGVpdGhlciBiZSBhIHJlY29yZCBvciBhIHR5cGVkZWYsIG9yIGEgcG9pbnRlcgorICAvLyBvciByZWZlcmVuY2UgdGhlcmVvZi4KKyAgaWYgKGNvbnN0IGF1dG8gKlJUID0gVkRULT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CisgICAgaWYgKGNvbnN0IGF1dG8gKlJEID0gUlQtPmdldERlY2woKSkKKyAgICAgIGlmIChjb25zdCBhdXRvICpDQSA9IFJELT5nZXRBdHRyPENhcGFiaWxpdHlBdHRyPigpKQorICAgICAgICByZXR1cm4gQ2xhc3NpZnlEaWFnbm9zdGljKENBKTsKKyAgfSBlbHNlIGlmIChjb25zdCBhdXRvICpUVCA9IFZEVC0+Z2V0QXM8VHlwZWRlZlR5cGU+KCkpIHsKKyAgICBpZiAoY29uc3QgYXV0byAqVEQgPSBUVC0+Z2V0RGVjbCgpKQorICAgICAgaWYgKGNvbnN0IGF1dG8gKkNBID0gVEQtPmdldEF0dHI8Q2FwYWJpbGl0eUF0dHI+KCkpCisgICAgICAgIHJldHVybiBDbGFzc2lmeURpYWdub3N0aWMoQ0EpOworICB9IGVsc2UgaWYgKFZEVC0+aXNQb2ludGVyVHlwZSgpIHx8IFZEVC0+aXNSZWZlcmVuY2VUeXBlKCkpCisgICAgcmV0dXJuIENsYXNzaWZ5RGlhZ25vc3RpYyhWRFQtPmdldFBvaW50ZWVUeXBlKCkpOworCisgIHJldHVybiAibXV0ZXgiOworfQorCitzdGF0aWMgU3RyaW5nUmVmIENsYXNzaWZ5RGlhZ25vc3RpYyhjb25zdCBWYWx1ZURlY2wgKlZEKSB7CisgIGFzc2VydChWRCAmJiAiTm8gVmFsdWVEZWNsIHBhc3NlZCIpOworCisgIC8vIFRoZSBWYWx1ZURlY2wgaXMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgbXV0ZXggb3Igcm9sZSAoaG9wZWZ1bGx5KS4KKyAgcmV0dXJuIENsYXNzaWZ5RGlhZ25vc3RpYyhWRC0+Z2V0VHlwZSgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEF0dHJUeT4KK3N0YXRpYyB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhaGFzX2FyZ19pdGVyYXRvcjxBdHRyVHk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWY+Ojp0eXBlCitDbGFzc2lmeURpYWdub3N0aWMoY29uc3QgQXR0clR5ICpBKSB7CisgIGlmIChjb25zdCBWYWx1ZURlY2wgKlZEID0gZ2V0VmFsdWVEZWNsKEEtPmdldEFyZygpKSkKKyAgICByZXR1cm4gQ2xhc3NpZnlEaWFnbm9zdGljKFZEKTsKKyAgcmV0dXJuICJtdXRleCI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBdHRyVHk+CitzdGF0aWMgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX2FyZ19pdGVyYXRvcjxBdHRyVHk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWY+Ojp0eXBlCitDbGFzc2lmeURpYWdub3N0aWMoY29uc3QgQXR0clR5ICpBKSB7CisgIGZvciAoYXV0byBJID0gQS0+YXJnc19iZWdpbigpLCBFID0gQS0+YXJnc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoY29uc3QgVmFsdWVEZWNsICpWRCA9IGdldFZhbHVlRGVjbCgqSSkpCisgICAgICByZXR1cm4gQ2xhc3NpZnlEaWFnbm9zdGljKFZEKTsKKyAgfQorICByZXR1cm4gIm11dGV4IjsKK30KIAogLy8vIFxicmllZiBBZGQgYSBuZXcgbG9jayB0byB0aGUgbG9ja3NldCwgd2FybmluZyBpZiB0aGUgbG9jayBpcyBhbHJlYWR5IHRoZXJlLgogLy8vIFxwYXJhbSBNdXRleCAtLSB0aGUgTXV0ZXggZXhwcmVzc2lvbiBmb3IgdGhlIGxvY2sKIC8vLyBccGFyYW0gTERhdCAgLS0gdGhlIExvY2tEYXRhIGZvciB0aGUgbG9jawogdm9pZCBUaHJlYWRTYWZldHlBbmFseXplcjo6YWRkTG9jayhGYWN0U2V0ICZGU2V0LCBjb25zdCBTRXhwciAmTXV0ZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2tEYXRhICZMRGF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2tEYXRhICZMRGF0LCBTdHJpbmdSZWYgRGlhZ0tpbmQpIHsKICAgLy8gRklYTUU6IGRlYWwgd2l0aCBhY3F1aXJlZCBiZWZvcmUvYWZ0ZXIgYW5ub3RhdGlvbnMuCiAgIC8vIEZJWE1FOiBEb24ndCBhbHdheXMgd2FybiB3aGVuIHdlIGhhdmUgc3VwcG9ydCBmb3IgcmVlbnRyYW50IGxvY2tzLgogICBpZiAoTXV0ZXguc2hvdWxkSWdub3JlKCkpCkBAIC0xNDk4LDcgKzE1NTQsNyBAQAogCiAgIGlmIChGU2V0LmZpbmRMb2NrKEZhY3RNYW4sIE11dGV4KSkgewogICAgIGlmICghTERhdC5Bc3NlcnRlZCkKLSAgICAgIEhhbmRsZXIuaGFuZGxlRG91YmxlTG9jayhNdXRleC50b1N0cmluZygpLCBMRGF0LkFjcXVpcmVMb2MpOworICAgICAgSGFuZGxlci5oYW5kbGVEb3VibGVMb2NrKERpYWdLaW5kLCBNdXRleC50b1N0cmluZygpLCBMRGF0LkFjcXVpcmVMb2MpOwogICB9IGVsc2UgewogICAgIEZTZXQuYWRkTG9jayhGYWN0TWFuLCBNdXRleCwgTERhdCk7CiAgIH0KQEAgLTE1MDgsMTYgKzE1NjQsMjQgQEAKIC8vLyBcYnJpZWYgUmVtb3ZlIGEgbG9jayBmcm9tIHRoZSBsb2Nrc2V0LCB3YXJuaW5nIGlmIHRoZSBsb2NrIGlzIG5vdCB0aGVyZS4KIC8vLyBccGFyYW0gTXV0ZXggVGhlIGxvY2sgZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NrIHRvIGJlIHJlbW92ZWQKIC8vLyBccGFyYW0gVW5sb2NrTG9jIFRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIHVubG9jayAob25seSB1c2VkIGluIGVycm9yIG1zZykKLXZvaWQgVGhyZWFkU2FmZXR5QW5hbHl6ZXI6OnJlbW92ZUxvY2soRmFjdFNldCAmRlNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0V4cHIgJk11dGV4LAordm9pZCBUaHJlYWRTYWZldHlBbmFseXplcjo6cmVtb3ZlTG9jayhGYWN0U2V0ICZGU2V0LCBjb25zdCBTRXhwciAmTXV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFVubG9ja0xvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGdWxseVJlbW92ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZ1bGx5UmVtb3ZlLCBMb2NrS2luZCBSZWNlaXZlZEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEaWFnS2luZCkgewogICBpZiAoTXV0ZXguc2hvdWxkSWdub3JlKCkpCiAgICAgcmV0dXJuOwogCiAgIGNvbnN0IExvY2tEYXRhICpMRGF0ID0gRlNldC5maW5kTG9jayhGYWN0TWFuLCBNdXRleCk7CiAgIGlmICghTERhdCkgewotICAgIEhhbmRsZXIuaGFuZGxlVW5tYXRjaGVkVW5sb2NrKE11dGV4LnRvU3RyaW5nKCksIFVubG9ja0xvYyk7CisgICAgSGFuZGxlci5oYW5kbGVVbm1hdGNoZWRVbmxvY2soRGlhZ0tpbmQsIE11dGV4LnRvU3RyaW5nKCksIFVubG9ja0xvYyk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gR2VuZXJpYyBsb2NrIHJlbW92YWwgZG9lc24ndCBjYXJlIGFib3V0IGxvY2sga2luZCBtaXNtYXRjaGVzLCBidXQKKyAgLy8gb3RoZXJ3aXNlIGRpYWdub3NlIHdoZW4gdGhlIGxvY2sga2luZHMgYXJlIG1pc21hdGNoZWQuCisgIGlmIChSZWNlaXZlZEtpbmQgIT0gTEtfR2VuZXJpYyAmJiBMRGF0LT5MS2luZCAhPSBSZWNlaXZlZEtpbmQpIHsKKyAgICBIYW5kbGVyLmhhbmRsZUluY29ycmVjdFVubG9ja0tpbmQoRGlhZ0tpbmQsIE11dGV4LnRvU3RyaW5nKCksIExEYXQtPkxLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNlaXZlZEtpbmQsIFVubG9ja0xvYyk7CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTE1MzIsOCArMTU5Niw4IEBACiAgICAgICAvLyBXZSdyZSByZWxlYXNpbmcgdGhlIHVuZGVybHlpbmcgbXV0ZXgsIGJ1dCBub3QgZGVzdHJveWluZyB0aGUKICAgICAgIC8vIG1hbmFnaW5nIG9iamVjdC4gIFdhcm4gb24gZHVhbCByZWxlYXNlLgogICAgICAgaWYgKCFGU2V0LmZpbmRMb2NrKEZhY3RNYW4sIExEYXQtPlVuZGVybHlpbmdNdXRleCkpIHsKLSAgICAgICAgSGFuZGxlci5oYW5kbGVVbm1hdGNoZWRVbmxvY2soTERhdC0+VW5kZXJseWluZ011dGV4LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVubG9ja0xvYyk7CisgICAgICAgIEhhbmRsZXIuaGFuZGxlVW5tYXRjaGVkVW5sb2NrKAorICAgICAgICAgICAgRGlhZ0tpbmQsIExEYXQtPlVuZGVybHlpbmdNdXRleC50b1N0cmluZygpLCBVbmxvY2tMb2MpOwogICAgICAgfQogICAgICAgRlNldC5yZW1vdmVMb2NrKEZhY3RNYW4sIExEYXQtPlVuZGVybHlpbmdNdXRleCk7CiAgICAgICByZXR1cm47CkBAIC0xNTU1LDcgKzE2MTksNyBAQAogICAgIC8vIFRoZSBtdXRleCBoZWxkIGlzIHRoZSAidGhpcyIgb2JqZWN0LgogICAgIFNFeHByIE11KDAsIEV4cCwgRCwgU2VsZkRlY2wpOwogICAgIGlmICghTXUuaXNWYWxpZCgpKQotICAgICAgU0V4cHI6Ondhcm5JbnZhbGlkTG9jayhIYW5kbGVyLCAwLCBFeHAsIEQpOworICAgICAgU0V4cHI6Ondhcm5JbnZhbGlkTG9jayhIYW5kbGVyLCAwLCBFeHAsIEQsIENsYXNzaWZ5RGlhZ25vc3RpYyhBdHRyKSk7CiAgICAgZWxzZQogICAgICAgTXR4cy5wdXNoX2JhY2tfbm9kdXAoTXUpOwogICAgIHJldHVybjsKQEAgLTE1NjQsNyArMTYyOCw3IEBACiAgIGZvciAoaXRlcmF0b3JfdHlwZSBJPUF0dHItPmFyZ3NfYmVnaW4oKSwgRT1BdHRyLT5hcmdzX2VuZCgpOyBJICE9IEU7ICsrSSkgewogICAgIFNFeHByIE11KCpJLCBFeHAsIEQsIFNlbGZEZWNsKTsKICAgICBpZiAoIU11LmlzVmFsaWQoKSkKLSAgICAgIFNFeHByOjp3YXJuSW52YWxpZExvY2soSGFuZGxlciwgKkksIEV4cCwgRCk7CisgICAgICBTRXhwcjo6d2FybkludmFsaWRMb2NrKEhhbmRsZXIsICpJLCBFeHAsIEQsIENsYXNzaWZ5RGlhZ25vc3RpYyhBdHRyKSk7CiAgICAgZWxzZQogICAgICAgTXR4cy5wdXNoX2JhY2tfbm9kdXAoTXUpOwogICB9CkBAIC0xNjk3LDYgKzE3NjEsNyBAQAogICBib29sIE5lZ2F0ZSA9IGZhbHNlOwogICBjb25zdCBDRkdCbG9ja0luZm8gKlByZWRCbG9ja0luZm8gPSAmQmxvY2tJbmZvW1ByZWRCbG9jay0+Z2V0QmxvY2tJRCgpXTsKICAgY29uc3QgTG9jYWxWYXJDb250ZXh0ICZMVmFyQ3R4ID0gUHJlZEJsb2NrSW5mby0+RXhpdENvbnRleHQ7CisgIFN0cmluZ1JlZiBDYXBEaWFnS2luZCA9ICJtdXRleCI7CiAKICAgQ2FsbEV4cHIgKkV4cCA9CiAgICAgY29uc3RfY2FzdDxDYWxsRXhwcio+KGdldFRyeWxvY2tDYWxsRXhwcihDb25kLCBMVmFyQ3R4LCBOZWdhdGUpKTsKQEAgLTE3MjAsNiArMTc4NSw3IEBACiAgICAgICAgICAgY2FzdDxFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyPihBdHRyKTsKICAgICAgICAgZ2V0TXV0ZXhJRHMoRXhjbHVzaXZlTG9ja3NUb0FkZCwgQSwgRXhwLCBGdW5EZWNsLAogICAgICAgICAgICAgICAgICAgICBQcmVkQmxvY2ssIEN1cnJCbG9jaywgQS0+Z2V0U3VjY2Vzc1ZhbHVlKCksIE5lZ2F0ZSk7CisgICAgICAgIENhcERpYWdLaW5kID0gQ2xhc3NpZnlEaWFnbm9zdGljKEEpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2UgYXR0cjo6U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uOiB7CkBAIC0xNzI3LDYgKzE3OTMsNyBAQAogICAgICAgICAgIGNhc3Q8U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0cj4oQXR0cik7CiAgICAgICAgIGdldE11dGV4SURzKFNoYXJlZExvY2tzVG9BZGQsIEEsIEV4cCwgRnVuRGVjbCwKICAgICAgICAgICAgICAgICAgICAgUHJlZEJsb2NrLCBDdXJyQmxvY2ssIEEtPmdldFN1Y2Nlc3NWYWx1ZSgpLCBOZWdhdGUpOworICAgICAgICBDYXBEaWFnS2luZCA9IENsYXNzaWZ5RGlhZ25vc3RpYyhBKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBkZWZhdWx0OgpAQCAtMTczNiwxNyArMTgwMywxMyBAQAogCiAgIC8vIEFkZCBhbmQgcmVtb3ZlIGxvY2tzLgogICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBFeHAtPmdldEV4cHJMb2MoKTsKLSAgZm9yICh1bnNpZ25lZCBpPTAsbj1FeGNsdXNpdmVMb2Nrc1RvQWRkLnNpemUoKTsgaTxuOyArK2kpIHsKLSAgICBhZGRMb2NrKFJlc3VsdCwgRXhjbHVzaXZlTG9ja3NUb0FkZFtpXSwKLSAgICAgICAgICAgIExvY2tEYXRhKExvYywgTEtfRXhjbHVzaXZlKSk7Ci0gIH0KLSAgZm9yICh1bnNpZ25lZCBpPTAsbj1TaGFyZWRMb2Nrc1RvQWRkLnNpemUoKTsgaTxuOyArK2kpIHsKLSAgICBhZGRMb2NrKFJlc3VsdCwgU2hhcmVkTG9ja3NUb0FkZFtpXSwKLSAgICAgICAgICAgIExvY2tEYXRhKExvYywgTEtfU2hhcmVkKSk7Ci0gIH0KKyAgZm9yIChjb25zdCBhdXRvICZFeGNsdXNpdmVMb2NrVG9BZGQgOiBFeGNsdXNpdmVMb2Nrc1RvQWRkKQorICAgIGFkZExvY2soUmVzdWx0LCBFeGNsdXNpdmVMb2NrVG9BZGQsIExvY2tEYXRhKExvYywgTEtfRXhjbHVzaXZlKSwKKyAgICAgICAgICAgIENhcERpYWdLaW5kKTsKKyAgZm9yIChjb25zdCBhdXRvICZTaGFyZWRMb2NrVG9BZGQgOiBTaGFyZWRMb2Nrc1RvQWRkKQorICAgIGFkZExvY2soUmVzdWx0LCBTaGFyZWRMb2NrVG9BZGQsIExvY2tEYXRhKExvYywgTEtfU2hhcmVkKSwgQ2FwRGlhZ0tpbmQpOwogfQogCi0KIC8vLyBcYnJpZWYgV2UgdXNlIHRoaXMgY2xhc3MgdG8gdmlzaXQgZGlmZmVyZW50IHR5cGVzIG9mIGV4cHJlc3Npb25zIGluCiAvLy8gQ0ZHQmxvY2tzLCBhbmQgYnVpbGQgdXAgdGhlIGxvY2tzZXQuCiAvLy8gQW4gZXhwcmVzc2lvbiBtYXkgY2F1c2UgdXMgdG8gYWRkIG9yIHJlbW92ZSBsb2NrcyBmcm9tIHRoZSBsb2Nrc2V0LCBvciBlbHNlCkBAIC0xNzYxLDExICsxODI0LDEyIEBACiAgIHVuc2lnbmVkIEN0eEluZGV4OwogCiAgIC8vIEhlbHBlciBmdW5jdGlvbnMKLSAgY29uc3QgVmFsdWVEZWNsICpnZXRWYWx1ZURlY2woY29uc3QgRXhwciAqRXhwKTsKIAogICB2b2lkIHdhcm5JZk11dGV4Tm90SGVsZChjb25zdCBOYW1lZERlY2wgKkQsIGNvbnN0IEV4cHIgKkV4cCwgQWNjZXNzS2luZCBBSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqTXV0ZXhFeHAsIFByb3RlY3RlZE9wZXJhdGlvbktpbmQgUE9LKTsKLSAgdm9pZCB3YXJuSWZNdXRleEhlbGQoY29uc3QgTmFtZWREZWNsICpELCBjb25zdCBFeHByICpFeHAsIEV4cHIgKk11dGV4RXhwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqTXV0ZXhFeHAsIFByb3RlY3RlZE9wZXJhdGlvbktpbmQgUE9LLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGlhZ0tpbmQpOworICB2b2lkIHdhcm5JZk11dGV4SGVsZChjb25zdCBOYW1lZERlY2wgKkQsIGNvbnN0IEV4cHIgKkV4cCwgRXhwciAqTXV0ZXhFeHAsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEaWFnS2luZCk7CiAKICAgdm9pZCBjaGVja0FjY2Vzcyhjb25zdCBFeHByICpFeHAsIEFjY2Vzc0tpbmQgQUspOwogICB2b2lkIGNoZWNrUHRBY2Nlc3MoY29uc3QgRXhwciAqRXhwLCBBY2Nlc3NLaW5kIEFLKTsKQEAgLTE3ODksMzEgKzE4NTMsMTcgQEAKICAgdm9pZCBWaXNpdERlY2xTdG10KERlY2xTdG10ICpTKTsKIH07CiAKLQotLy8vIFxicmllZiBHZXRzIHRoZSB2YWx1ZSBkZWNsIHBvaW50ZXIgZnJvbSBEZWNsUmVmRXhwcnMgb3IgTWVtYmVyRXhwcnMKLWNvbnN0IFZhbHVlRGVjbCAqQnVpbGRMb2Nrc2V0OjpnZXRWYWx1ZURlY2woY29uc3QgRXhwciAqRXhwKSB7Ci0gIGlmIChjb25zdCBJbXBsaWNpdENhc3RFeHByICpDRSA9IGR5bl9jYXN0PEltcGxpY2l0Q2FzdEV4cHI+KEV4cCkpCi0gICAgcmV0dXJuIGdldFZhbHVlRGVjbChDRS0+Z2V0U3ViRXhwcigpKTsKLQotICBpZiAoY29uc3QgRGVjbFJlZkV4cHIgKkRSID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KEV4cCkpCi0gICAgcmV0dXJuIERSLT5nZXREZWNsKCk7Ci0KLSAgaWYgKGNvbnN0IE1lbWJlckV4cHIgKk1FID0gZHluX2Nhc3Q8TWVtYmVyRXhwcj4oRXhwKSkKLSAgICByZXR1cm4gTUUtPmdldE1lbWJlckRlY2woKTsKLQotICByZXR1cm4gMDsKLX0KLQogLy8vIFxicmllZiBXYXJuIGlmIHRoZSBMU2V0IGRvZXMgbm90IGNvbnRhaW4gYSBsb2NrIHN1ZmZpY2llbnQgdG8gcHJvdGVjdCBhY2Nlc3MKIC8vLyBvZiBhdCBsZWFzdCB0aGUgcGFzc2VkIGluIEFjY2Vzc0tpbmQuCiB2b2lkIEJ1aWxkTG9ja3NldDo6d2FybklmTXV0ZXhOb3RIZWxkKGNvbnN0IE5hbWVkRGVjbCAqRCwgY29uc3QgRXhwciAqRXhwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NLaW5kIEFLLCBFeHByICpNdXRleEV4cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdGVjdGVkT3BlcmF0aW9uS2luZCBQT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdGVjdGVkT3BlcmF0aW9uS2luZCBQT0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEaWFnS2luZCkgewogICBMb2NrS2luZCBMSyA9IGdldExvY2tLaW5kRnJvbUFjY2Vzc0tpbmQoQUspOwogCiAgIFNFeHByIE11dGV4KE11dGV4RXhwLCBFeHAsIEQpOwogICBpZiAoIU11dGV4LmlzVmFsaWQoKSkgewotICAgIFNFeHByOjp3YXJuSW52YWxpZExvY2soQW5hbHl6ZXItPkhhbmRsZXIsIE11dGV4RXhwLCBFeHAsIEQpOworICAgIFNFeHByOjp3YXJuSW52YWxpZExvY2soQW5hbHl6ZXItPkhhbmRsZXIsIE11dGV4RXhwLCBFeHAsIEQsIERpYWdLaW5kKTsKICAgICByZXR1cm47CiAgIH0gZWxzZSBpZiAoTXV0ZXguc2hvdWxkSWdub3JlKCkpIHsKICAgICByZXR1cm47CkBAIC0xODI5LDQwICsxODc5LDM4IEBACiAgICAgICBMRGF0ID0gJkZFbnRyeS0+TERhdDsKICAgICAgIHN0ZDo6c3RyaW5nIFBhcnRNYXRjaFN0ciA9IEZFbnRyeS0+TXV0SUQudG9TdHJpbmcoKTsKICAgICAgIFN0cmluZ1JlZiAgIFBhcnRNYXRjaE5hbWUoUGFydE1hdGNoU3RyKTsKLSAgICAgIEFuYWx5emVyLT5IYW5kbGVyLmhhbmRsZU11dGV4Tm90SGVsZChELCBQT0ssIE11dGV4LnRvU3RyaW5nKCksIExLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cC0+Z2V0RXhwckxvYygpLCAmUGFydE1hdGNoTmFtZSk7CisgICAgICBBbmFseXplci0+SGFuZGxlci5oYW5kbGVNdXRleE5vdEhlbGQoRGlhZ0tpbmQsIEQsIFBPSywgTXV0ZXgudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSywgRXhwLT5nZXRFeHByTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBhcnRNYXRjaE5hbWUpOwogICAgIH0gZWxzZSB7CiAgICAgICAvLyBXYXJuIHRoYXQgdGhlcmUncyBubyBtYXRjaCBhdCBhbGwuCi0gICAgICBBbmFseXplci0+SGFuZGxlci5oYW5kbGVNdXRleE5vdEhlbGQoRCwgUE9LLCBNdXRleC50b1N0cmluZygpLCBMSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHAtPmdldEV4cHJMb2MoKSk7CisgICAgICBBbmFseXplci0+SGFuZGxlci5oYW5kbGVNdXRleE5vdEhlbGQoRGlhZ0tpbmQsIEQsIFBPSywgTXV0ZXgudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSywgRXhwLT5nZXRFeHByTG9jKCkpOwogICAgIH0KICAgICBOb0Vycm9yID0gZmFsc2U7CiAgIH0KICAgLy8gTWFrZSBzdXJlIHRoZSBtdXRleCB3ZSBmb3VuZCBpcyB0aGUgcmlnaHQga2luZC4KICAgaWYgKE5vRXJyb3IgJiYgTERhdCAmJiAhTERhdC0+aXNBdExlYXN0KExLKSkKLSAgICBBbmFseXplci0+SGFuZGxlci5oYW5kbGVNdXRleE5vdEhlbGQoRCwgUE9LLCBNdXRleC50b1N0cmluZygpLCBMSywKKyAgICBBbmFseXplci0+SGFuZGxlci5oYW5kbGVNdXRleE5vdEhlbGQoRGlhZ0tpbmQsIEQsIFBPSywgTXV0ZXgudG9TdHJpbmcoKSwgTEssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cC0+Z2V0RXhwckxvYygpKTsKIH0KIAogLy8vIFxicmllZiBXYXJuIGlmIHRoZSBMU2V0IGNvbnRhaW5zIHRoZSBnaXZlbiBsb2NrLgotdm9pZCBCdWlsZExvY2tzZXQ6Ondhcm5JZk11dGV4SGVsZChjb25zdCBOYW1lZERlY2wgKkQsIGNvbnN0IEV4cHIqIEV4cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqTXV0ZXhFeHApIHsKK3ZvaWQgQnVpbGRMb2Nrc2V0Ojp3YXJuSWZNdXRleEhlbGQoY29uc3QgTmFtZWREZWNsICpELCBjb25zdCBFeHByICpFeHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKk11dGV4RXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGlhZ0tpbmQpIHsKICAgU0V4cHIgTXV0ZXgoTXV0ZXhFeHAsIEV4cCwgRCk7CiAgIGlmICghTXV0ZXguaXNWYWxpZCgpKSB7Ci0gICAgU0V4cHI6Ondhcm5JbnZhbGlkTG9jayhBbmFseXplci0+SGFuZGxlciwgTXV0ZXhFeHAsIEV4cCwgRCk7CisgICAgU0V4cHI6Ondhcm5JbnZhbGlkTG9jayhBbmFseXplci0+SGFuZGxlciwgTXV0ZXhFeHAsIEV4cCwgRCwgRGlhZ0tpbmQpOwogICAgIHJldHVybjsKICAgfQogCiAgIExvY2tEYXRhKiBMRGF0ID0gRlNldC5maW5kTG9jayhBbmFseXplci0+RmFjdE1hbiwgTXV0ZXgpOwotICBpZiAoTERhdCkgewotICAgIHN0ZDo6c3RyaW5nIERlY2xOYW1lID0gRC0+Z2V0TmFtZUFzU3RyaW5nKCk7Ci0gICAgU3RyaW5nUmVmICAgRGVjbE5hbWVTUiAoRGVjbE5hbWUpOwotICAgIEFuYWx5emVyLT5IYW5kbGVyLmhhbmRsZUZ1bkV4Y2x1ZGVzTG9jayhEZWNsTmFtZVNSLCBNdXRleC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHAtPmdldEV4cHJMb2MoKSk7Ci0gIH0KKyAgaWYgKExEYXQpCisgICAgQW5hbHl6ZXItPkhhbmRsZXIuaGFuZGxlRnVuRXhjbHVkZXNMb2NrKAorICAgICAgICBEaWFnS2luZCwgRC0+Z2V0TmFtZUFzU3RyaW5nKCksIE11dGV4LnRvU3RyaW5nKCksIEV4cC0+Z2V0RXhwckxvYygpKTsKIH0KIAotCiAvLy8gXGJyaWVmIENoZWNrcyBndWFyZGVkX2J5IGFuZCBwdF9ndWFyZGVkX2J5IGF0dHJpYnV0ZXMuCiAvLy8gV2hlbmV2ZXIgd2UgaWRlbnRpZnkgYW4gYWNjZXNzIChyZWFkIG9yIHdyaXRlKSB0byBhIERlY2xSZWZFeHByIHRoYXQgaXMKIC8vLyBtYXJrZWQgd2l0aCBndWFyZGVkX2J5LCB3ZSBtdXN0IGVuc3VyZSB0aGUgYXBwcm9wcmlhdGUgbXV0ZXhlcyBhcmUgaGVsZC4KQEAgLTE4NzksMTAgKzE5MjcsOCBAQAogICB9CiAKICAgaWYgKGNvbnN0IEFycmF5U3Vic2NyaXB0RXhwciAqQUUgPSBkeW5fY2FzdDxBcnJheVN1YnNjcmlwdEV4cHI+KEV4cCkpIHsKLSAgICBpZiAoQW5hbHl6ZXItPkhhbmRsZXIuaXNzdWVCZXRhV2FybmluZ3MoKSkgewotICAgICAgY2hlY2tQdEFjY2VzcyhBRS0+Z2V0TEhTKCksIEFLKTsKLSAgICAgIHJldHVybjsKLSAgICB9CisgICAgY2hlY2tQdEFjY2VzcyhBRS0+Z2V0TEhTKCksIEFLKTsKKyAgICByZXR1cm47CiAgIH0KIAogICBpZiAoY29uc3QgTWVtYmVyRXhwciAqTUUgPSBkeW5fY2FzdDxNZW1iZXJFeHByPihFeHApKSB7CkBAIC0xODk2LDU1ICsxOTQyLDQ4IEBACiAgIGlmICghRCB8fCAhRC0+aGFzQXR0cnMoKSkKICAgICByZXR1cm47CiAKLSAgaWYgKEQtPmdldEF0dHI8R3VhcmRlZFZhckF0dHI+KCkgJiYgRlNldC5pc0VtcHR5KCkpCi0gICAgQW5hbHl6ZXItPkhhbmRsZXIuaGFuZGxlTm9NdXRleEhlbGQoRCwgUE9LX1ZhckFjY2VzcywgQUssCisgIGlmIChELT5oYXNBdHRyPEd1YXJkZWRWYXJBdHRyPigpICYmIEZTZXQuaXNFbXB0eSgpKQorICAgIEFuYWx5emVyLT5IYW5kbGVyLmhhbmRsZU5vTXV0ZXhIZWxkKCJtdXRleCIsIEQsIFBPS19WYXJBY2Nlc3MsIEFLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cC0+Z2V0RXhwckxvYygpKTsKIAotICBjb25zdCBBdHRyVmVjICZBcmdBdHRycyA9IEQtPmdldEF0dHJzKCk7Ci0gIGZvciAodW5zaWduZWQgaSA9IDAsIFNpemUgPSBBcmdBdHRycy5zaXplKCk7IGkgPCBTaXplOyArK2kpCi0gICAgaWYgKEd1YXJkZWRCeUF0dHIgKkdCQXR0ciA9IGR5bl9jYXN0PEd1YXJkZWRCeUF0dHI+KEFyZ0F0dHJzW2ldKSkKLSAgICAgIHdhcm5JZk11dGV4Tm90SGVsZChELCBFeHAsIEFLLCBHQkF0dHItPmdldEFyZygpLCBQT0tfVmFyQWNjZXNzKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogRC0+c3BlY2lmaWNfYXR0cnM8R3VhcmRlZEJ5QXR0cj4oKSkKKyAgICB3YXJuSWZNdXRleE5vdEhlbGQoRCwgRXhwLCBBSywgSS0+Z2V0QXJnKCksIFBPS19WYXJBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIENsYXNzaWZ5RGlhZ25vc3RpYyhJKSk7CiB9CiAKIC8vLyBcYnJpZWYgQ2hlY2tzIHB0X2d1YXJkZWRfYnkgYW5kIHB0X2d1YXJkZWRfdmFyIGF0dHJpYnV0ZXMuCiB2b2lkIEJ1aWxkTG9ja3NldDo6Y2hlY2tQdEFjY2Vzcyhjb25zdCBFeHByICpFeHAsIEFjY2Vzc0tpbmQgQUspIHsKLSAgaWYgKEFuYWx5emVyLT5IYW5kbGVyLmlzc3VlQmV0YVdhcm5pbmdzKCkpIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgaWYgKGNvbnN0IFBhcmVuRXhwciAqUEUgPSBkeW5fY2FzdDxQYXJlbkV4cHI+KEV4cCkpIHsKLSAgICAgICAgRXhwID0gUEUtPmdldFN1YkV4cHIoKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoY29uc3QgQ2FzdEV4cHIgKkNFID0gZHluX2Nhc3Q8Q2FzdEV4cHI+KEV4cCkpIHsKLSAgICAgICAgaWYgKENFLT5nZXRDYXN0S2luZCgpID09IENLX0FycmF5VG9Qb2ludGVyRGVjYXkpIHsKLSAgICAgICAgICAvLyBJZiBpdCdzIGFuIGFjdHVhbCBhcnJheSwgYW5kIG5vdCBhIHBvaW50ZXIsIHRoZW4gaXQncyBlbGVtZW50cwotICAgICAgICAgIC8vIGFyZSBwcm90ZWN0ZWQgYnkgR1VBUkRFRF9CWSwgbm90IFBUX0dVQVJERURfQlk7Ci0gICAgICAgICAgY2hlY2tBY2Nlc3MoQ0UtPmdldFN1YkV4cHIoKSwgQUspOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBFeHAgPSBDRS0+Z2V0U3ViRXhwcigpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChjb25zdCBQYXJlbkV4cHIgKlBFID0gZHluX2Nhc3Q8UGFyZW5FeHByPihFeHApKSB7CisgICAgICBFeHAgPSBQRS0+Z2V0U3ViRXhwcigpOworICAgICAgY29udGludWU7CiAgICAgfQorICAgIGlmIChjb25zdCBDYXN0RXhwciAqQ0UgPSBkeW5fY2FzdDxDYXN0RXhwcj4oRXhwKSkgeworICAgICAgaWYgKENFLT5nZXRDYXN0S2luZCgpID09IENLX0FycmF5VG9Qb2ludGVyRGVjYXkpIHsKKyAgICAgICAgLy8gSWYgaXQncyBhbiBhY3R1YWwgYXJyYXksIGFuZCBub3QgYSBwb2ludGVyLCB0aGVuIGl0J3MgZWxlbWVudHMKKyAgICAgICAgLy8gYXJlIHByb3RlY3RlZCBieSBHVUFSREVEX0JZLCBub3QgUFRfR1VBUkRFRF9CWTsKKyAgICAgICAgY2hlY2tBY2Nlc3MoQ0UtPmdldFN1YkV4cHIoKSwgQUspOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBFeHAgPSBDRS0+Z2V0U3ViRXhwcigpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGJyZWFrOwogICB9Ci0gIGVsc2UKLSAgICBFeHAgPSBFeHAtPklnbm9yZVBhcmVuQ2FzdHMoKTsKIAogICBjb25zdCBWYWx1ZURlY2wgKkQgPSBnZXRWYWx1ZURlY2woRXhwKTsKICAgaWYgKCFEIHx8ICFELT5oYXNBdHRycygpKQogICAgIHJldHVybjsKIAotICBpZiAoRC0+Z2V0QXR0cjxQdEd1YXJkZWRWYXJBdHRyPigpICYmIEZTZXQuaXNFbXB0eSgpKQotICAgIEFuYWx5emVyLT5IYW5kbGVyLmhhbmRsZU5vTXV0ZXhIZWxkKEQsIFBPS19WYXJEZXJlZmVyZW5jZSwgQUssCisgIGlmIChELT5oYXNBdHRyPFB0R3VhcmRlZFZhckF0dHI+KCkgJiYgRlNldC5pc0VtcHR5KCkpCisgICAgQW5hbHl6ZXItPkhhbmRsZXIuaGFuZGxlTm9NdXRleEhlbGQoIm11dGV4IiwgRCwgUE9LX1ZhckRlcmVmZXJlbmNlLCBBSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHAtPmdldEV4cHJMb2MoKSk7CiAKLSAgY29uc3QgQXR0clZlYyAmQXJnQXR0cnMgPSBELT5nZXRBdHRycygpOwotICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBTaXplID0gQXJnQXR0cnMuc2l6ZSgpOyBpIDwgU2l6ZTsgKytpKQotICAgIGlmIChQdEd1YXJkZWRCeUF0dHIgKkdCQXR0ciA9IGR5bl9jYXN0PFB0R3VhcmRlZEJ5QXR0cj4oQXJnQXR0cnNbaV0pKQotICAgICAgd2FybklmTXV0ZXhOb3RIZWxkKEQsIEV4cCwgQUssIEdCQXR0ci0+Z2V0QXJnKCksIFBPS19WYXJEZXJlZmVyZW5jZSk7CisgIGZvciAoYXV0byBjb25zdCAqSSA6IEQtPnNwZWNpZmljX2F0dHJzPFB0R3VhcmRlZEJ5QXR0cj4oKSkKKyAgICB3YXJuSWZNdXRleE5vdEhlbGQoRCwgRXhwLCBBSywgSS0+Z2V0QXJnKCksIFBPS19WYXJEZXJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NpZnlEaWFnbm9zdGljKEkpKTsKIH0KIAotCiAvLy8gXGJyaWVmIFByb2Nlc3MgYSBmdW5jdGlvbiBjYWxsLCBtZXRob2QgY2FsbCwgY29uc3RydWN0b3IgY2FsbCwKIC8vLyBvciBkZXN0cnVjdG9yIGNhbGwuICBUaGlzIGludm9sdmVzIGxvb2tpbmcgYXQgdGhlIGF0dHJpYnV0ZXMgb24gdGhlCiAvLy8gY29ycmVzcG9uZGluZyBmdW5jdGlvbi9tZXRob2QvY29uc3RydWN0b3IvZGVzdHJ1Y3RvciwgaXNzdWluZyB3YXJuaW5ncywKQEAgLTE5NTgsMjYgKzE5OTcsMjIgQEAKIHZvaWQgQnVpbGRMb2Nrc2V0OjpoYW5kbGVDYWxsKEV4cHIgKkV4cCwgY29uc3QgTmFtZWREZWNsICpELCBWYXJEZWNsICpWRCkgewogICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBFeHAtPmdldEV4cHJMb2MoKTsKICAgY29uc3QgQXR0clZlYyAmQXJnQXR0cnMgPSBELT5nZXRBdHRycygpOwotICBNdXRleElETGlzdCBFeGNsdXNpdmVMb2Nrc1RvQWRkOwotICBNdXRleElETGlzdCBTaGFyZWRMb2Nrc1RvQWRkOwotICBNdXRleElETGlzdCBMb2Nrc1RvUmVtb3ZlOworICBNdXRleElETGlzdCBFeGNsdXNpdmVMb2Nrc1RvQWRkLCBTaGFyZWRMb2Nrc1RvQWRkOworICBNdXRleElETGlzdCBFeGNsdXNpdmVMb2Nrc1RvUmVtb3ZlLCBTaGFyZWRMb2Nrc1RvUmVtb3ZlLCBHZW5lcmljTG9ja3NUb1JlbW92ZTsKKyAgU3RyaW5nUmVmIENhcERpYWdLaW5kID0gIm11dGV4IjsKIAogICBmb3IodW5zaWduZWQgaSA9IDA7IGkgPCBBcmdBdHRycy5zaXplKCk7ICsraSkgewogICAgIEF0dHIgKkF0ID0gY29uc3RfY2FzdDxBdHRyKj4oQXJnQXR0cnNbaV0pOwogICAgIHN3aXRjaCAoQXQtPmdldEtpbmQoKSkgewotICAgICAgLy8gV2hlbiB3ZSBlbmNvdW50ZXIgYW4gZXhjbHVzaXZlIGxvY2sgZnVuY3Rpb24sIHdlIG5lZWQgdG8gYWRkIHRoZSBsb2NrCi0gICAgICAvLyB0byBvdXIgbG9ja3NldCB3aXRoIGtpbmQgZXhjbHVzaXZlLgotICAgICAgY2FzZSBhdHRyOjpFeGNsdXNpdmVMb2NrRnVuY3Rpb246IHsKLSAgICAgICAgRXhjbHVzaXZlTG9ja0Z1bmN0aW9uQXR0ciAqQSA9IGNhc3Q8RXhjbHVzaXZlTG9ja0Z1bmN0aW9uQXR0cj4oQXQpOwotICAgICAgICBBbmFseXplci0+Z2V0TXV0ZXhJRHMoRXhjbHVzaXZlTG9ja3NUb0FkZCwgQSwgRXhwLCBELCBWRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQorICAgICAgLy8gV2hlbiB3ZSBlbmNvdW50ZXIgYSBsb2NrIGZ1bmN0aW9uLCB3ZSBuZWVkIHRvIGFkZCB0aGUgbG9jayB0byBvdXIKKyAgICAgIC8vIGxvY2tzZXQuCisgICAgICBjYXNlIGF0dHI6OkFjcXVpcmVDYXBhYmlsaXR5OiB7CisgICAgICAgIGF1dG8gKkEgPSBjYXN0PEFjcXVpcmVDYXBhYmlsaXR5QXR0cj4oQXQpOworICAgICAgICBBbmFseXplci0+Z2V0TXV0ZXhJRHMoQS0+aXNTaGFyZWQoKSA/IFNoYXJlZExvY2tzVG9BZGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFeGNsdXNpdmVMb2Nrc1RvQWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSwgRXhwLCBELCBWRCk7CiAKLSAgICAgIC8vIFdoZW4gd2UgZW5jb3VudGVyIGEgc2hhcmVkIGxvY2sgZnVuY3Rpb24sIHdlIG5lZWQgdG8gYWRkIHRoZSBsb2NrCi0gICAgICAvLyB0byBvdXIgbG9ja3NldCB3aXRoIGtpbmQgc2hhcmVkLgotICAgICAgY2FzZSBhdHRyOjpTaGFyZWRMb2NrRnVuY3Rpb246IHsKLSAgICAgICAgU2hhcmVkTG9ja0Z1bmN0aW9uQXR0ciAqQSA9IGNhc3Q8U2hhcmVkTG9ja0Z1bmN0aW9uQXR0cj4oQXQpOwotICAgICAgICBBbmFseXplci0+Z2V0TXV0ZXhJRHMoU2hhcmVkTG9ja3NUb0FkZCwgQSwgRXhwLCBELCBWRCk7CisgICAgICAgIENhcERpYWdLaW5kID0gQ2xhc3NpZnlEaWFnbm9zdGljKEEpOwogICAgICAgICBicmVhazsKICAgICAgIH0KIApAQCAtMTk4OSwxMCArMjAyNCwxMCBAQAogCiAgICAgICAgIE11dGV4SURMaXN0IEFzc2VydExvY2tzOwogICAgICAgICBBbmFseXplci0+Z2V0TXV0ZXhJRHMoQXNzZXJ0TG9ja3MsIEEsIEV4cCwgRCwgVkQpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGk9MCxuPUFzc2VydExvY2tzLnNpemUoKTsgaTxuOyArK2kpIHsKLSAgICAgICAgICBBbmFseXplci0+YWRkTG9jayhGU2V0LCBBc3NlcnRMb2Nrc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NrRGF0YShMb2MsIExLX0V4Y2x1c2l2ZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJkFzc2VydExvY2sgOiBBc3NlcnRMb2NrcykKKyAgICAgICAgICBBbmFseXplci0+YWRkTG9jayhGU2V0LCBBc3NlcnRMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2tEYXRhKExvYywgTEtfRXhjbHVzaXZlLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NpZnlEaWFnbm9zdGljKEEpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIGF0dHI6OkFzc2VydFNoYXJlZExvY2s6IHsKQEAgLTIwMDAsMzYgKzIwMzUsMzUgQEAKIAogICAgICAgICBNdXRleElETGlzdCBBc3NlcnRMb2NrczsKICAgICAgICAgQW5hbHl6ZXItPmdldE11dGV4SURzKEFzc2VydExvY2tzLCBBLCBFeHAsIEQsIFZEKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpPTAsbj1Bc3NlcnRMb2Nrcy5zaXplKCk7IGk8bjsgKytpKSB7Ci0gICAgICAgICAgQW5hbHl6ZXItPmFkZExvY2soRlNldCwgQXNzZXJ0TG9ja3NbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9ja0RhdGEoTG9jLCBMS19TaGFyZWQsIGZhbHNlLCB0cnVlKSk7Ci0gICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZBc3NlcnRMb2NrIDogQXNzZXJ0TG9ja3MpCisgICAgICAgICAgQW5hbHl6ZXItPmFkZExvY2soRlNldCwgQXNzZXJ0TG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NrRGF0YShMb2MsIExLX1NoYXJlZCwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzaWZ5RGlhZ25vc3RpYyhBKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogCiAgICAgICAvLyBXaGVuIHdlIGVuY291bnRlciBhbiB1bmxvY2sgZnVuY3Rpb24sIHdlIG5lZWQgdG8gcmVtb3ZlIHVubG9ja2VkCiAgICAgICAvLyBtdXRleGVzIGZyb20gdGhlIGxvY2tzZXQsIGFuZCBmbGFnIGEgd2FybmluZyBpZiB0aGV5IGFyZSBub3QgdGhlcmUuCi0gICAgICBjYXNlIGF0dHI6OlVubG9ja0Z1bmN0aW9uOiB7Ci0gICAgICAgIFVubG9ja0Z1bmN0aW9uQXR0ciAqQSA9IGNhc3Q8VW5sb2NrRnVuY3Rpb25BdHRyPihBdCk7Ci0gICAgICAgIEFuYWx5emVyLT5nZXRNdXRleElEcyhMb2Nrc1RvUmVtb3ZlLCBBLCBFeHAsIEQsIFZEKTsKKyAgICAgIGNhc2UgYXR0cjo6UmVsZWFzZUNhcGFiaWxpdHk6IHsKKyAgICAgICAgYXV0byAqQSA9IGNhc3Q8UmVsZWFzZUNhcGFiaWxpdHlBdHRyPihBdCk7CisgICAgICAgIGlmIChBLT5pc0dlbmVyaWMoKSkKKyAgICAgICAgICBBbmFseXplci0+Z2V0TXV0ZXhJRHMoR2VuZXJpY0xvY2tzVG9SZW1vdmUsIEEsIEV4cCwgRCwgVkQpOworICAgICAgICBlbHNlIGlmIChBLT5pc1NoYXJlZCgpKQorICAgICAgICAgIEFuYWx5emVyLT5nZXRNdXRleElEcyhTaGFyZWRMb2Nrc1RvUmVtb3ZlLCBBLCBFeHAsIEQsIFZEKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIEFuYWx5emVyLT5nZXRNdXRleElEcyhFeGNsdXNpdmVMb2Nrc1RvUmVtb3ZlLCBBLCBFeHAsIEQsIFZEKTsKKworICAgICAgICBDYXBEaWFnS2luZCA9IENsYXNzaWZ5RGlhZ25vc3RpYyhBKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKLSAgICAgIGNhc2UgYXR0cjo6RXhjbHVzaXZlTG9ja3NSZXF1aXJlZDogewotICAgICAgICBFeGNsdXNpdmVMb2Nrc1JlcXVpcmVkQXR0ciAqQSA9IGNhc3Q8RXhjbHVzaXZlTG9ja3NSZXF1aXJlZEF0dHI+KEF0KTsKKyAgICAgIGNhc2UgYXR0cjo6UmVxdWlyZXNDYXBhYmlsaXR5OiB7CisgICAgICAgIFJlcXVpcmVzQ2FwYWJpbGl0eUF0dHIgKkEgPSBjYXN0PFJlcXVpcmVzQ2FwYWJpbGl0eUF0dHI+KEF0KTsKIAotICAgICAgICBmb3IgKEV4Y2x1c2l2ZUxvY2tzUmVxdWlyZWRBdHRyOjphcmdzX2l0ZXJhdG9yCi0gICAgICAgICAgICAgSSA9IEEtPmFyZ3NfYmVnaW4oKSwgRSA9IEEtPmFyZ3NfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgICAgICAgIHdhcm5JZk11dGV4Tm90SGVsZChELCBFeHAsIEFLX1dyaXR0ZW4sICpJLCBQT0tfRnVuY3Rpb25DYWxsKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgYXR0cjo6U2hhcmVkTG9ja3NSZXF1aXJlZDogewotICAgICAgICBTaGFyZWRMb2Nrc1JlcXVpcmVkQXR0ciAqQSA9IGNhc3Q8U2hhcmVkTG9ja3NSZXF1aXJlZEF0dHI+KEF0KTsKLQotICAgICAgICBmb3IgKFNoYXJlZExvY2tzUmVxdWlyZWRBdHRyOjphcmdzX2l0ZXJhdG9yIEkgPSBBLT5hcmdzX2JlZ2luKCksCisgICAgICAgIGZvciAoUmVxdWlyZXNDYXBhYmlsaXR5QXR0cjo6YXJnc19pdGVyYXRvciBJID0gQS0+YXJnc19iZWdpbigpLAogICAgICAgICAgICAgIEUgPSBBLT5hcmdzX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICAgICAgICB3YXJuSWZNdXRleE5vdEhlbGQoRCwgRXhwLCBBS19SZWFkLCAqSSwgUE9LX0Z1bmN0aW9uQ2FsbCk7CisgICAgICAgICAgd2FybklmTXV0ZXhOb3RIZWxkKEQsIEV4cCwgQS0+aXNTaGFyZWQoKSA/IEFLX1JlYWQgOiBBS19Xcml0dGVuLCAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9LX0Z1bmN0aW9uQ2FsbCwgQ2xhc3NpZnlEaWFnbm9zdGljKEEpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKQEAgLTIwMzgsMTIgKzIwNzIsMTIgQEAKIAogICAgICAgICBmb3IgKExvY2tzRXhjbHVkZWRBdHRyOjphcmdzX2l0ZXJhdG9yIEkgPSBBLT5hcmdzX2JlZ2luKCksCiAgICAgICAgICAgICBFID0gQS0+YXJnc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgICAgICB3YXJuSWZNdXRleEhlbGQoRCwgRXhwLCAqSSk7CisgICAgICAgICAgd2FybklmTXV0ZXhIZWxkKEQsIEV4cCwgKkksIENsYXNzaWZ5RGlhZ25vc3RpYyhBKSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKLSAgICAgIC8vIElnbm9yZSBvdGhlciAobm9uIHRocmVhZC1zYWZldHkpIGF0dHJpYnV0ZXMKKyAgICAgIC8vIElnbm9yZSBhdHRyaWJ1dGVzIHVucmVsYXRlZCB0byB0aHJlYWQtc2FmZXR5CiAgICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9CkBAIC0yMDU0LDIwICsyMDg4LDE4IEBACiAgIGlmIChWRCkgewogICAgIGlmIChjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkNEID0gZHluX2Nhc3Q8Y29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsPihEKSkgewogICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCogUEQgPSBDRC0+Z2V0UGFyZW50KCk7Ci0gICAgICBpZiAoUEQgJiYgUEQtPmdldEF0dHI8U2NvcGVkTG9ja2FibGVBdHRyPigpKQorICAgICAgaWYgKFBEICYmIFBELT5oYXNBdHRyPFNjb3BlZExvY2thYmxlQXR0cj4oKSkKICAgICAgICAgaXNTY29wZWRWYXIgPSB0cnVlOwogICAgIH0KICAgfQogCiAgIC8vIEFkZCBsb2Nrcy4KLSAgZm9yICh1bnNpZ25lZCBpPTAsbj1FeGNsdXNpdmVMb2Nrc1RvQWRkLnNpemUoKTsgaTxuOyArK2kpIHsKLSAgICBBbmFseXplci0+YWRkTG9jayhGU2V0LCBFeGNsdXNpdmVMb2Nrc1RvQWRkW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2tEYXRhKExvYywgTEtfRXhjbHVzaXZlLCBpc1Njb3BlZFZhcikpOwotICB9Ci0gIGZvciAodW5zaWduZWQgaT0wLG49U2hhcmVkTG9ja3NUb0FkZC5zaXplKCk7IGk8bjsgKytpKSB7Ci0gICAgQW5hbHl6ZXItPmFkZExvY2soRlNldCwgU2hhcmVkTG9ja3NUb0FkZFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NrRGF0YShMb2MsIExLX1NoYXJlZCwgaXNTY29wZWRWYXIpKTsKLSAgfQorICBmb3IgKGNvbnN0IGF1dG8gJk0gOiBFeGNsdXNpdmVMb2Nrc1RvQWRkKQorICAgIEFuYWx5emVyLT5hZGRMb2NrKEZTZXQsIE0sIExvY2tEYXRhKExvYywgTEtfRXhjbHVzaXZlLCBpc1Njb3BlZFZhciksCisgICAgICAgICAgICAgICAgICAgICAgQ2FwRGlhZ0tpbmQpOworICBmb3IgKGNvbnN0IGF1dG8gJk0gOiBTaGFyZWRMb2Nrc1RvQWRkKQorICAgIEFuYWx5emVyLT5hZGRMb2NrKEZTZXQsIE0sIExvY2tEYXRhKExvYywgTEtfU2hhcmVkLCBpc1Njb3BlZFZhciksCisgICAgICAgICAgICAgICAgICAgICAgQ2FwRGlhZ0tpbmQpOwogCiAgIC8vIEFkZCB0aGUgbWFuYWdpbmcgb2JqZWN0IGFzIGEgZHVtbXkgbXV0ZXgsIG1hcHBlZCB0byB0aGUgdW5kZXJseWluZyBtdXRleC4KICAgLy8gRklYTUUgLS0gdGhpcyBkb2Vzbid0IHdvcmsgaWYgd2UgYWNxdWlyZSBtdWx0aXBsZSBsb2Nrcy4KQEAgLTIwNzYsMjIgKzIxMDgsMjMgQEAKICAgICBEZWNsUmVmRXhwciBEUkUoVkQsIGZhbHNlLCBWRC0+Z2V0VHlwZSgpLCBWS19MVmFsdWUsIFZELT5nZXRMb2NhdGlvbigpKTsKICAgICBTRXhwciBTTXV0ZXgoJkRSRSwgMCwgMCk7CiAKLSAgICBmb3IgKHVuc2lnbmVkIGk9MCxuPUV4Y2x1c2l2ZUxvY2tzVG9BZGQuc2l6ZSgpOyBpPG47ICsraSkgewotICAgICAgQW5hbHl6ZXItPmFkZExvY2soRlNldCwgU011dGV4LCBMb2NrRGF0YShNTG9jLCBMS19FeGNsdXNpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1c2l2ZUxvY2tzVG9BZGRbaV0pKTsKLSAgICB9Ci0gICAgZm9yICh1bnNpZ25lZCBpPTAsbj1TaGFyZWRMb2Nrc1RvQWRkLnNpemUoKTsgaTxuOyArK2kpIHsKLSAgICAgIEFuYWx5emVyLT5hZGRMb2NrKEZTZXQsIFNNdXRleCwgTG9ja0RhdGEoTUxvYywgTEtfU2hhcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRMb2Nrc1RvQWRkW2ldKSk7Ci0gICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmTSA6IEV4Y2x1c2l2ZUxvY2tzVG9BZGQpCisgICAgICBBbmFseXplci0+YWRkTG9jayhGU2V0LCBTTXV0ZXgsIExvY2tEYXRhKE1Mb2MsIExLX0V4Y2x1c2l2ZSwgTSksCisgICAgICAgICAgICAgICAgICAgICAgICBDYXBEaWFnS2luZCk7CisgICAgZm9yIChjb25zdCBhdXRvICZNIDogU2hhcmVkTG9ja3NUb0FkZCkKKyAgICAgIEFuYWx5emVyLT5hZGRMb2NrKEZTZXQsIFNNdXRleCwgTG9ja0RhdGEoTUxvYywgTEtfU2hhcmVkLCBNKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhcERpYWdLaW5kKTsKICAgfQogCiAgIC8vIFJlbW92ZSBsb2Nrcy4KICAgLy8gRklYTUUgLS0gc2hvdWxkIG9ubHkgZnVsbHkgcmVtb3ZlIGlmIHRoZSBhdHRyaWJ1dGUgcmVmZXJzIHRvICd0aGlzJy4KICAgYm9vbCBEdG9yID0gaXNhPENYWERlc3RydWN0b3JEZWNsPihEKTsKLSAgZm9yICh1bnNpZ25lZCBpPTAsbj1Mb2Nrc1RvUmVtb3ZlLnNpemUoKTsgaTxuOyArK2kpIHsKLSAgICBBbmFseXplci0+cmVtb3ZlTG9jayhGU2V0LCBMb2Nrc1RvUmVtb3ZlW2ldLCBMb2MsIER0b3IpOwotICB9CisgIGZvciAoY29uc3QgYXV0byAmTSA6IEV4Y2x1c2l2ZUxvY2tzVG9SZW1vdmUpCisgICAgQW5hbHl6ZXItPnJlbW92ZUxvY2soRlNldCwgTSwgTG9jLCBEdG9yLCBMS19FeGNsdXNpdmUsIENhcERpYWdLaW5kKTsKKyAgZm9yIChjb25zdCBhdXRvICZNIDogU2hhcmVkTG9ja3NUb1JlbW92ZSkKKyAgICBBbmFseXplci0+cmVtb3ZlTG9jayhGU2V0LCBNLCBMb2MsIER0b3IsIExLX1NoYXJlZCwgQ2FwRGlhZ0tpbmQpOworICBmb3IgKGNvbnN0IGF1dG8gJk0gOiBHZW5lcmljTG9ja3NUb1JlbW92ZSkKKyAgICBBbmFseXplci0+cmVtb3ZlTG9jayhGU2V0LCBNLCBMb2MsIER0b3IsIExLX0dlbmVyaWMsIENhcERpYWdLaW5kKTsKIH0KIAogCkBAIC0yMTY4LDExICsyMjAxLDkgQEAKICAgICAgIGNhc2UgT09fU3RhcjoKICAgICAgIGNhc2UgT09fQXJyb3c6CiAgICAgICBjYXNlIE9PX1N1YnNjcmlwdDogewotICAgICAgICBpZiAoQW5hbHl6ZXItPkhhbmRsZXIuaXNzdWVCZXRhV2FybmluZ3MoKSkgewotICAgICAgICAgIGNvbnN0IEV4cHIgKk9iaiA9IE9FLT5nZXRBcmcoMCk7Ci0gICAgICAgICAgY2hlY2tBY2Nlc3MoT2JqLCBBS19SZWFkKTsKLSAgICAgICAgICBjaGVja1B0QWNjZXNzKE9iaiwgQUtfUmVhZCk7Ci0gICAgICAgIH0KKyAgICAgICAgY29uc3QgRXhwciAqT2JqID0gT0UtPmdldEFyZygwKTsKKyAgICAgICAgY2hlY2tBY2Nlc3MoT2JqLCBBS19SZWFkKTsKKyAgICAgICAgY2hlY2tQdEFjY2VzcyhPYmosIEFLX1JlYWQpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGRlZmF1bHQ6IHsKQEAgLTIyNTQsOSArMjI4NSw4IEBACiAgICAgaWYgKEkxICE9IEZTZXQxLmVuZCgpKSB7CiAgICAgICBjb25zdCBMb2NrRGF0YSogTERhdDEgPSAmRmFjdE1hblsqSTFdLkxEYXQ7CiAgICAgICBpZiAoTERhdDEtPkxLaW5kICE9IExEYXQyLkxLaW5kKSB7Ci0gICAgICAgIEhhbmRsZXIuaGFuZGxlRXhjbHVzaXZlQW5kU2hhcmVkKEZTZXQyTXV0ZXgudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERhdDIuQWNxdWlyZUxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERhdDEtPkFjcXVpcmVMb2MpOworICAgICAgICBIYW5kbGVyLmhhbmRsZUV4Y2x1c2l2ZUFuZFNoYXJlZCgibXV0ZXgiLCBGU2V0Mk11dGV4LnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEYXQyLkFjcXVpcmVMb2MsIExEYXQxLT5BY3F1aXJlTG9jKTsKICAgICAgICAgaWYgKE1vZGlmeSAmJiBMRGF0MS0+TEtpbmQgIT0gTEtfRXhjbHVzaXZlKSB7CiAgICAgICAgICAgLy8gVGFrZSB0aGUgZXhjbHVzaXZlIGxvY2ssIHdoaWNoIGlzIHRoZSBvbmUgaW4gRlNldDIuCiAgICAgICAgICAgKkkxID0gKkk7CkBAIC0yMjcyLDE1ICsyMzAyLDE0IEBACiAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHNjb3BlZCBsb2NrIHRoYXQgbWFuYWdlcyBhbm90aGVyIG11dGV4LCBhbmQgaWYgdGhlCiAgICAgICAgICAgLy8gdW5kZXJseWluZyBtdXRleCBpcyBzdGlsbCBoZWxkLCB0aGVuIHdhcm4gYWJvdXQgdGhlIHVuZGVybHlpbmcKICAgICAgICAgICAvLyBtdXRleC4KLSAgICAgICAgICBIYW5kbGVyLmhhbmRsZU11dGV4SGVsZEVuZE9mU2NvcGUoTERhdDIuVW5kZXJseWluZ011dGV4LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEYXQyLkFjcXVpcmVMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5Mb2MsIExFSzEpOworICAgICAgICAgIEhhbmRsZXIuaGFuZGxlTXV0ZXhIZWxkRW5kT2ZTY29wZSgibXV0ZXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRGF0Mi5VbmRlcmx5aW5nTXV0ZXgudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERhdDIuQWNxdWlyZUxvYywgSm9pbkxvYywgTEVLMSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGVsc2UgaWYgKCFMRGF0Mi5NYW5hZ2VkICYmICFGU2V0Mk11dGV4LmlzVW5pdmVyc2FsKCkgJiYgIUxEYXQyLkFzc2VydGVkKQotICAgICAgICBIYW5kbGVyLmhhbmRsZU11dGV4SGVsZEVuZE9mU2NvcGUoRlNldDJNdXRleC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERhdDIuQWNxdWlyZUxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5Mb2MsIExFSzEpOworICAgICAgICBIYW5kbGVyLmhhbmRsZU11dGV4SGVsZEVuZE9mU2NvcGUoIm11dGV4IiwgRlNldDJNdXRleC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERhdDIuQWNxdWlyZUxvYywgSm9pbkxvYywgTEVLMSk7CiAgICAgfQogICB9CiAKQEAgLTIyOTYsMTUgKzIzMjUsMTQgQEAKICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc2NvcGVkIGxvY2sgdGhhdCBtYW5hZ2VzIGFub3RoZXIgbXV0ZXgsIGFuZCBpZiB0aGUKICAgICAgICAgICAvLyB1bmRlcmx5aW5nIG11dGV4IGlzIHN0aWxsIGhlbGQsIHRoZW4gd2FybiBhYm91dCB0aGUgdW5kZXJseWluZwogICAgICAgICAgIC8vIG11dGV4LgotICAgICAgICAgIEhhbmRsZXIuaGFuZGxlTXV0ZXhIZWxkRW5kT2ZTY29wZShMRGF0MS5VbmRlcmx5aW5nTXV0ZXgudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTERhdDEuQWNxdWlyZUxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkxvYywgTEVLMSk7CisgICAgICAgICAgSGFuZGxlci5oYW5kbGVNdXRleEhlbGRFbmRPZlNjb3BlKCJtdXRleCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExEYXQxLlVuZGVybHlpbmdNdXRleC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRGF0MS5BY3F1aXJlTG9jLCBKb2luTG9jLCBMRUsxKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZSBpZiAoIUxEYXQxLk1hbmFnZWQgJiYgIUZTZXQxTXV0ZXguaXNVbml2ZXJzYWwoKSAmJiAhTERhdDEuQXNzZXJ0ZWQpCi0gICAgICAgIEhhbmRsZXIuaGFuZGxlTXV0ZXhIZWxkRW5kT2ZTY29wZShGU2V0MU11dGV4LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRGF0MS5BY3F1aXJlTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkxvYywgTEVLMik7CisgICAgICAgIEhhbmRsZXIuaGFuZGxlTXV0ZXhIZWxkRW5kT2ZTY29wZSgibXV0ZXgiLCBGU2V0MU11dGV4LnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRGF0MS5BY3F1aXJlTG9jLCBKb2luTG9jLCBMRUsyKTsKICAgICAgIGlmIChNb2RpZnkpCiAgICAgICAgIEZTZXQxLnJlbW92ZUxvY2soRmFjdE1hbiwgRlNldDFNdXRleCk7CiAgICAgfQpAQCAtMjM0Miw3ICsyMzcwLDcgQEAKIAogICBpZiAoIUQpCiAgICAgcmV0dXJuOyAgLy8gSWdub3JlIGFub255bW91cyBmdW5jdGlvbnMgZm9yIG5vdy4KLSAgaWYgKEQtPmdldEF0dHI8Tm9UaHJlYWRTYWZldHlBbmFseXNpc0F0dHI+KCkpCisgIGlmIChELT5oYXNBdHRyPE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyPigpKQogICAgIHJldHVybjsKICAgLy8gRklYTUU6IERvIHNvbWV0aGluZyBhIGJpdCBtb3JlIGludGVsbGlnZW50IGluc2lkZSBjb25zdHJ1Y3RvciBhbmQKICAgLy8gZGVzdHJ1Y3RvciBjb2RlLiAgQ29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBtdXN0IGFzc3VtZSB1bmlxdWUgYWNjZXNzCkBAIC0yMzg1LDE4ICsyNDEzLDE3IEBACiAKICAgICBNdXRleElETGlzdCBFeGNsdXNpdmVMb2Nrc1RvQWRkOwogICAgIE11dGV4SURMaXN0IFNoYXJlZExvY2tzVG9BZGQ7CisgICAgU3RyaW5nUmVmIENhcERpYWdLaW5kID0gIm11dGV4IjsKIAogICAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IEQtPmdldExvY2F0aW9uKCk7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEFyZ0F0dHJzLnNpemUoKTsgKytpKSB7CiAgICAgICBBdHRyICpBdHRyID0gQXJnQXR0cnNbaV07CiAgICAgICBMb2MgPSBBdHRyLT5nZXRMb2NhdGlvbigpOwotICAgICAgaWYgKEV4Y2x1c2l2ZUxvY2tzUmVxdWlyZWRBdHRyICpBCi0gICAgICAgICAgICA9IGR5bl9jYXN0PEV4Y2x1c2l2ZUxvY2tzUmVxdWlyZWRBdHRyPihBdHRyKSkgewotICAgICAgICBnZXRNdXRleElEcyhFeGNsdXNpdmVMb2Nrc1RvQWRkLCBBLCAoRXhwciopIDAsIEQpOwotICAgICAgfSBlbHNlIGlmIChTaGFyZWRMb2Nrc1JlcXVpcmVkQXR0ciAqQQotICAgICAgICAgICAgICAgICAgID0gZHluX2Nhc3Q8U2hhcmVkTG9ja3NSZXF1aXJlZEF0dHI+KEF0dHIpKSB7Ci0gICAgICAgIGdldE11dGV4SURzKFNoYXJlZExvY2tzVG9BZGQsIEEsIChFeHByKikgMCwgRCk7Ci0gICAgICB9IGVsc2UgaWYgKFVubG9ja0Z1bmN0aW9uQXR0ciAqQSA9IGR5bl9jYXN0PFVubG9ja0Z1bmN0aW9uQXR0cj4oQXR0cikpIHsKKyAgICAgIGlmIChSZXF1aXJlc0NhcGFiaWxpdHlBdHRyICpBID0gZHluX2Nhc3Q8UmVxdWlyZXNDYXBhYmlsaXR5QXR0cj4oQXR0cikpIHsKKyAgICAgICAgZ2V0TXV0ZXhJRHMoQS0+aXNTaGFyZWQoKSA/IFNoYXJlZExvY2tzVG9BZGQgOiBFeGNsdXNpdmVMb2Nrc1RvQWRkLCBBLAorICAgICAgICAgICAgICAgICAgICAwLCBEKTsKKyAgICAgICAgQ2FwRGlhZ0tpbmQgPSBDbGFzc2lmeURpYWdub3N0aWMoQSk7CisgICAgICB9IGVsc2UgaWYgKGF1dG8gKkEgPSBkeW5fY2FzdDxSZWxlYXNlQ2FwYWJpbGl0eUF0dHI+KEF0dHIpKSB7CiAgICAgICAgIC8vIFVOTE9DS19GVU5DVElPTigpIGlzIHVzZWQgdG8gaGlkZSB0aGUgdW5kZXJseWluZyBsb2NrIGltcGxlbWVudGF0aW9uLgogICAgICAgICAvLyBXZSBtdXN0IGlnbm9yZSBzdWNoIG1ldGhvZHMuCiAgICAgICAgIGlmIChBLT5hcmdzX3NpemUoKSA9PSAwKQpAQCAtMjQwNCwxNiArMjQzMSwxNCBAQAogICAgICAgICAvLyBGSVhNRSAtLSBkZWFsIHdpdGggZXhjbHVzaXZlIHZzLiBzaGFyZWQgdW5sb2NrIGZ1bmN0aW9ucz8KICAgICAgICAgZ2V0TXV0ZXhJRHMoRXhjbHVzaXZlTG9ja3NUb0FkZCwgQSwgKEV4cHIqKSAwLCBEKTsKICAgICAgICAgZ2V0TXV0ZXhJRHMoTG9ja3NSZWxlYXNlZCwgQSwgKEV4cHIqKSAwLCBEKTsKLSAgICAgIH0gZWxzZSBpZiAoRXhjbHVzaXZlTG9ja0Z1bmN0aW9uQXR0ciAqQQotICAgICAgICAgICAgICAgICAgID0gZHluX2Nhc3Q8RXhjbHVzaXZlTG9ja0Z1bmN0aW9uQXR0cj4oQXR0cikpIHsKKyAgICAgICAgQ2FwRGlhZ0tpbmQgPSBDbGFzc2lmeURpYWdub3N0aWMoQSk7CisgICAgICB9IGVsc2UgaWYgKGF1dG8gKkEgPSBkeW5fY2FzdDxBY3F1aXJlQ2FwYWJpbGl0eUF0dHI+KEF0dHIpKSB7CiAgICAgICAgIGlmIChBLT5hcmdzX3NpemUoKSA9PSAwKQogICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZ2V0TXV0ZXhJRHMoRXhjbHVzaXZlTG9ja3NBY3F1aXJlZCwgQSwgKEV4cHIqKSAwLCBEKTsKLSAgICAgIH0gZWxzZSBpZiAoU2hhcmVkTG9ja0Z1bmN0aW9uQXR0ciAqQQotICAgICAgICAgICAgICAgICAgID0gZHluX2Nhc3Q8U2hhcmVkTG9ja0Z1bmN0aW9uQXR0cj4oQXR0cikpIHsKLSAgICAgICAgaWYgKEEtPmFyZ3Nfc2l6ZSgpID09IDApCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICBnZXRNdXRleElEcyhTaGFyZWRMb2Nrc0FjcXVpcmVkLCBBLCAoRXhwciopIDAsIEQpOworICAgICAgICBnZXRNdXRleElEcyhBLT5pc1NoYXJlZCgpID8gU2hhcmVkTG9ja3NBY3F1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRXhjbHVzaXZlTG9ja3NBY3F1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgQSwgbnVsbHB0ciwgRCk7CisgICAgICAgIENhcERpYWdLaW5kID0gQ2xhc3NpZnlEaWFnbm9zdGljKEEpOwogICAgICAgfSBlbHNlIGlmIChpc2E8RXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0cj4oQXR0cikpIHsKICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGNoZWNrIHRyeWxvY2sgZnVuY3Rpb25zIGZvciBub3cKICAgICAgICAgcmV0dXJuOwpAQCAtMjQyNCwxNCArMjQ0OSwxMiBAQAogICAgIH0KIAogICAgIC8vIEZJWE1FIC0tIExvYyBjYW4gYmUgd3JvbmcgaGVyZS4KLSAgICBmb3IgKHVuc2lnbmVkIGk9MCxuPUV4Y2x1c2l2ZUxvY2tzVG9BZGQuc2l6ZSgpOyBpPG47ICsraSkgewotICAgICAgYWRkTG9jayhJbml0aWFsTG9ja3NldCwgRXhjbHVzaXZlTG9ja3NUb0FkZFtpXSwKLSAgICAgICAgICAgICAgTG9ja0RhdGEoTG9jLCBMS19FeGNsdXNpdmUpKTsKLSAgICB9Ci0gICAgZm9yICh1bnNpZ25lZCBpPTAsbj1TaGFyZWRMb2Nrc1RvQWRkLnNpemUoKTsgaTxuOyArK2kpIHsKLSAgICAgIGFkZExvY2soSW5pdGlhbExvY2tzZXQsIFNoYXJlZExvY2tzVG9BZGRbaV0sCi0gICAgICAgICAgICAgIExvY2tEYXRhKExvYywgTEtfU2hhcmVkKSk7Ci0gICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmRXhjbHVzaXZlTG9ja1RvQWRkIDogRXhjbHVzaXZlTG9ja3NUb0FkZCkKKyAgICAgIGFkZExvY2soSW5pdGlhbExvY2tzZXQsIEV4Y2x1c2l2ZUxvY2tUb0FkZCwgTG9ja0RhdGEoTG9jLCBMS19FeGNsdXNpdmUpLAorICAgICAgICAgICAgICBDYXBEaWFnS2luZCk7CisgICAgZm9yIChjb25zdCBhdXRvICZTaGFyZWRMb2NrVG9BZGQgOiBTaGFyZWRMb2Nrc1RvQWRkKQorICAgICAgYWRkTG9jayhJbml0aWFsTG9ja3NldCwgU2hhcmVkTG9ja1RvQWRkLCBMb2NrRGF0YShMb2MsIExLX1NoYXJlZCksCisgICAgICAgICAgICAgIENhcERpYWdLaW5kKTsKICAgfQogCiAgIGZvciAoUG9zdE9yZGVyQ0ZHVmlldzo6aXRlcmF0b3IgSSA9IFNvcnRlZEdyYXBoLT5iZWdpbigpLApkaWZmIC0tZ2l0IGEvbGliL0FuYWx5c2lzL1VuaW5pdGlhbGl6ZWRWYWx1ZXMuY3BwIGIvbGliL0FuYWx5c2lzL1VuaW5pdGlhbGl6ZWRWYWx1ZXMuY3BwCmluZGV4IDMzMmMwMmMuLjI5YzE3YzMgMTAwNjQ0Ci0tLSBhL2xpYi9BbmFseXNpcy9VbmluaXRpYWxpemVkVmFsdWVzLmNwcAorKysgYi9saWIvQW5hbHlzaXMvVW5pbml0aWFsaXplZFZhbHVlcy5jcHAKQEAgLTM3Myw5ICszNzMsOCBAQAogfQogCiB2b2lkIENsYXNzaWZ5UmVmczo6VmlzaXREZWNsU3RtdChEZWNsU3RtdCAqRFMpIHsKLSAgZm9yIChEZWNsU3RtdDo6ZGVjbF9pdGVyYXRvciBESSA9IERTLT5kZWNsX2JlZ2luKCksIERFID0gRFMtPmRlY2xfZW5kKCk7Ci0gICAgICAgREkgIT0gREU7ICsrREkpIHsKLSAgICBWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KCpESSk7CisgIGZvciAoYXV0byAqREkgOiBEUy0+ZGVjbHMoKSkgeworICAgIFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oREkpOwogICAgIGlmIChWRCAmJiBpc1RyYWNrZWRWYXIoVkQpKQogICAgICAgaWYgKGNvbnN0IERlY2xSZWZFeHByICpEUkUgPSBnZXRTZWxmSW5pdEV4cHIoVkQpKQogICAgICAgICBDbGFzc2lmaWNhdGlvbltEUkVdID0gU2VsZkluaXQ7CkBAIC01MzUsNiArNTM0LDkgQEAKICAgICAgIGZvciAoQ0ZHQmxvY2s6OmNvbnN0X3ByZWRfaXRlcmF0b3IgSSA9IEItPnByZWRfYmVnaW4oKSwgRSA9IEItPnByZWRfZW5kKCk7CiAgICAgICAgICAgIEkgIT0gRTsgKytJKSB7CiAgICAgICAgIGNvbnN0IENGR0Jsb2NrICpQcmVkID0gKkk7CisgICAgICAgIGlmICghUHJlZCkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCiAgICAgICAgIFZhbHVlIEF0UHJlZEV4aXQgPSB2YWxzLmdldFZhbHVlKFByZWQsIEIsIHZkKTsKICAgICAgICAgaWYgKEF0UHJlZEV4aXQgPT0gSW5pdGlhbGl6ZWQpCiAgICAgICAgICAgLy8gVGhpcyBibG9jayBpbml0aWFsaXplcyB0aGUgdmFyaWFibGUuCkBAIC02MzAsMTIgKzYzMiwxMSBAQAogCiB2b2lkIFRyYW5zZmVyRnVuY3Rpb25zOjpWaXNpdEJsb2NrRXhwcihCbG9ja0V4cHIgKmJlKSB7CiAgIGNvbnN0IEJsb2NrRGVjbCAqYmQgPSBiZS0+Z2V0QmxvY2tEZWNsKCk7Ci0gIGZvciAoQmxvY2tEZWNsOjpjYXB0dXJlX2NvbnN0X2l0ZXJhdG9yIGkgPSBiZC0+Y2FwdHVyZV9iZWdpbigpLAotICAgICAgICBlID0gYmQtPmNhcHR1cmVfZW5kKCkgOyBpICE9IGU7ICsraSkgewotICAgIGNvbnN0IFZhckRlY2wgKnZkID0gaS0+Z2V0VmFyaWFibGUoKTsKKyAgZm9yIChjb25zdCBhdXRvICZJIDogYmQtPmNhcHR1cmVzKCkpIHsKKyAgICBjb25zdCBWYXJEZWNsICp2ZCA9IEkuZ2V0VmFyaWFibGUoKTsKICAgICBpZiAoIWlzVHJhY2tlZFZhcih2ZCkpCiAgICAgICBjb250aW51ZTsKLSAgICBpZiAoaS0+aXNCeVJlZigpKSB7CisgICAgaWYgKEkuaXNCeVJlZigpKSB7CiAgICAgICB2YWxzW3ZkXSA9IEluaXRpYWxpemVkOwogICAgICAgY29udGludWU7CiAgICAgfQpAQCAtNjkxLDkgKzY5Miw4IEBACiB9CiAKIHZvaWQgVHJhbnNmZXJGdW5jdGlvbnM6OlZpc2l0RGVjbFN0bXQoRGVjbFN0bXQgKkRTKSB7Ci0gIGZvciAoRGVjbFN0bXQ6OmRlY2xfaXRlcmF0b3IgREkgPSBEUy0+ZGVjbF9iZWdpbigpLCBERSA9IERTLT5kZWNsX2VuZCgpOwotICAgICAgIERJICE9IERFOyArK0RJKSB7Ci0gICAgVmFyRGVjbCAqVkQgPSBkeW5fY2FzdDxWYXJEZWNsPigqREkpOworICBmb3IgKGF1dG8gKkRJIDogRFMtPmRlY2xzKCkpIHsKKyAgICBWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KERJKTsKICAgICBpZiAoVkQgJiYgaXNUcmFja2VkVmFyKFZEKSkgewogICAgICAgaWYgKGdldFNlbGZJbml0RXhwcihWRCkpIHsKICAgICAgICAgLy8gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIHNvbGVseSBvZiBhIHJlZmVyZW5jZSB0byBpdHNlbGYsIHdlCkBAIC03NTEsNiArNzUxLDggQEAKICAgZm9yIChDRkdCbG9jazo6Y29uc3RfcHJlZF9pdGVyYXRvciBJID0gYmxvY2stPnByZWRfYmVnaW4oKSwKICAgICAgICBFID0gYmxvY2stPnByZWRfZW5kKCk7IEkgIT0gRTsgKytJKSB7CiAgICAgY29uc3QgQ0ZHQmxvY2sgKnByZWQgPSAqSTsKKyAgICBpZiAoIXByZWQpCisgICAgICBjb250aW51ZTsKICAgICBpZiAod2FzQW5hbHl6ZWRbcHJlZC0+Z2V0QmxvY2tJRCgpXSkgewogICAgICAgdmFscy5tZXJnZUludG9TY3JhdGNoKHZhbHMuZ2V0VmFsdWVWZWN0b3IocHJlZCksIGlzRmlyc3QpOwogICAgICAgaXNGaXJzdCA9IGZhbHNlOwpAQCAtNzg3LDggKzc4OSw4IEBACiAgIC8vLyBUaGUgY3VycmVudCBibG9jayB0byBzY3JpYmJsZSB1c2UgaW5mb3JtYXRpb24uCiAgIHVuc2lnbmVkIGN1cnJlbnRCbG9jazsKIAotICB2aXJ0dWFsIHZvaWQgaGFuZGxlVXNlT2ZVbmluaXRWYXJpYWJsZShjb25zdCBWYXJEZWNsICp2ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pbml0VXNlICZ1c2UpIHsKKyAgdm9pZCBoYW5kbGVVc2VPZlVuaW5pdFZhcmlhYmxlKGNvbnN0IFZhckRlY2wgKnZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pbml0VXNlICZ1c2UpIG92ZXJyaWRlIHsKICAgICBoYWRVc2VbY3VycmVudEJsb2NrXSA9IHRydWU7CiAgICAgaGFkQW55VXNlID0gdHJ1ZTsKICAgfQpAQCAtNzk2LDcgKzc5OCw3IEBACiAgIC8vLyBDYWxsZWQgd2hlbiB0aGUgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBhbmFseXNpcyBkZXRlY3RzIHRoZQogICAvLy8gaWRpb20gJ2ludCB4ID0geCcuICBBbGwgb3RoZXIgdXNlcyBvZiAneCcgd2l0aGluIHRoZSBpbml0aWFsaXplcgogICAvLy8gYXJlIGhhbmRsZWQgYnkgaGFuZGxlVXNlT2ZVbmluaXRWYXJpYWJsZS4KLSAgdmlydHVhbCB2b2lkIGhhbmRsZVNlbGZJbml0KGNvbnN0IFZhckRlY2wgKnZkKSB7CisgIHZvaWQgaGFuZGxlU2VsZkluaXQoY29uc3QgVmFyRGVjbCAqdmQpIG92ZXJyaWRlIHsKICAgICBoYWRVc2VbY3VycmVudEJsb2NrXSA9IHRydWU7CiAgICAgaGFkQW55VXNlID0gdHJ1ZTsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL0Jhc2ljL0FuZHJvaWQubWsgYi9saWIvQmFzaWMvQW5kcm9pZC5tawppbmRleCAyNDA3YTAwLi41NGU2MWMyIDEwMDY0NAotLS0gYS9saWIvQmFzaWMvQW5kcm9pZC5taworKysgYi9saWIvQmFzaWMvQW5kcm9pZC5tawpAQCAtNiw2ICs2LDcgQEAKIGluY2x1ZGUgJChDTEVBUl9UQkxHRU5fVkFSUykKIAogVEJMR0VOX1RBQkxFUyA6PSBcCisgIEF0dHJIYXNBdHRyaWJ1dGVJbXBsLmluYyBcCiAgIERpYWdub3N0aWNBU1RLaW5kcy5pbmMgXAogICBEaWFnbm9zdGljQW5hbHlzaXNLaW5kcy5pbmMgXAogICBEaWFnbm9zdGljQ29tbWVudEtpbmRzLmluYyBcCkBAIC0yMSw2ICsyMiw3IEBACiAgIGFybV9uZW9uLmluYwogCiBjbGFuZ19iYXNpY19TUkNfRklMRVMgOj0gXAorICBBdHRyaWJ1dGVzLmNwcCBcCiAgIEJ1aWx0aW5zLmNwcCBcCiAgIENoYXJJbmZvLmNwcCBcCiAgIERpYWdub3N0aWMuY3BwIFwKQEAgLTM5LDcgKzQxLDggQEAKICAgVGFyZ2V0cy5jcHAgXAogICBUb2tlbktpbmRzLmNwcCBcCiAgIFZlcnNpb24uY3BwIFwKLSAgVmVyc2lvblR1cGxlLmNwcAorICBWZXJzaW9uVHVwbGUuY3BwIFwKKyAgVmlydHVhbEZpbGVTeXN0ZW0uY3BwCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNsYW5nX2Jhc2ljX1NSQ19GSUxFUykKIApkaWZmIC0tZ2l0IGEvbGliL0Jhc2ljL0F0dHJpYnV0ZXMuY3BwIGIvbGliL0Jhc2ljL0F0dHJpYnV0ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNWFkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvQmFzaWMvQXR0cmlidXRlcy5jcHAKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTd2l0Y2guaCIKK3VzaW5nIG5hbWVzcGFjZSBjbGFuZzsKKworYm9vbCBjbGFuZzo6aGFzQXR0cmlidXRlKEF0dHJTeW50YXggU3ludGF4LCBjb25zdCBJZGVudGlmaWVySW5mbyAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWRlbnRpZmllckluZm8gKkF0dHIsIGNvbnN0IGxsdm06OlRyaXBsZSAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgU3RyaW5nUmVmIE5hbWUgPSBBdHRyLT5nZXROYW1lKCk7CisgIC8vIE5vcm1hbGl6ZSB0aGUgYXR0cmlidXRlIG5hbWUsIF9fZm9vX18gYmVjb21lcyBmb28uCisgIGlmIChOYW1lLnNpemUoKSA+PSA0ICYmIE5hbWUuc3RhcnRzd2l0aCgiX18iKSAmJiBOYW1lLmVuZHN3aXRoKCJfXyIpKQorICAgIE5hbWUgPSBOYW1lLnN1YnN0cigyLCBOYW1lLnNpemUoKSAtIDQpOworCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQXR0ckhhc0F0dHJpYnV0ZUltcGwuaW5jIgorCisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2xpYi9CYXNpYy9CdWlsdGlucy5jcHAgYi9saWIvQmFzaWMvQnVpbHRpbnMuY3BwCmluZGV4IGM4NGRkNmQuLjJmZDAwZGQwIDEwMDY0NAotLS0gYS9saWIvQmFzaWMvQnVpbHRpbnMuY3BwCisrKyBiL2xpYi9CYXNpYy9CdWlsdGlucy5jcHAKQEAgLTk3LDQwICs5NywzNSBAQAogICBUYWJsZS5nZXQoR2V0UmVjb3JkKElEKS5OYW1lKS5zZXRCdWlsdGluSUQoMCk7CiB9CiAKLWJvb2wKLUJ1aWx0aW46OkNvbnRleHQ6OmlzUHJpbnRmTGlrZSh1bnNpZ25lZCBJRCwgdW5zaWduZWQgJkZvcm1hdElkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZIYXNWQUxpc3RBcmcpIHsKLSAgY29uc3QgY2hhciAqUHJpbnRmID0gc3RycGJyayhHZXRSZWNvcmQoSUQpLkF0dHJpYnV0ZXMsICJwUCIpOwotICBpZiAoIVByaW50ZikKK2Jvb2wgQnVpbHRpbjo6Q29udGV4dDo6aXNMaWtlKHVuc2lnbmVkIElELCB1bnNpZ25lZCAmRm9ybWF0SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSGFzVkFMaXN0QXJnLCBjb25zdCBjaGFyICpGbXQpIGNvbnN0IHsKKyAgYXNzZXJ0KEZtdCAmJiAiTm90IHBhc3NlZCBhIGZvcm1hdCBzdHJpbmciKTsKKyAgYXNzZXJ0KDo6c3RybGVuKEZtdCkgPT0gMiAmJgorICAgICAgICAgIkZvcm1hdCBzdHJpbmcgbmVlZHMgdG8gYmUgdHdvIGNoYXJhY3RlcnMgbG9uZyIpOworICBhc3NlcnQoOjp0b3VwcGVyKEZtdFswXSkgPT0gRm10WzFdICYmCisgICAgICAgICAiRm9ybWF0IHN0cmluZyBpcyBub3QgaW4gdGhlIGZvcm0gXCJ4WFwiIik7CisKKyAgY29uc3QgY2hhciAqTGlrZSA9IDo6c3RycGJyayhHZXRSZWNvcmQoSUQpLkF0dHJpYnV0ZXMsIEZtdCk7CisgIGlmICghTGlrZSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgSGFzVkFMaXN0QXJnID0gKCpQcmludGYgPT0gJ1AnKTsKKyAgSGFzVkFMaXN0QXJnID0gKCpMaWtlID09IEZtdFsxXSk7CiAKLSAgKytQcmludGY7Ci0gIGFzc2VydCgqUHJpbnRmID09ICc6JyAmJiAicCBvciBQIHNwZWNpZmllciBtdXN0IGhhdmUgYmUgZm9sbG93ZWQgYnkgYSAnOiciKTsKLSAgKytQcmludGY7CisgICsrTGlrZTsKKyAgYXNzZXJ0KCpMaWtlID09ICc6JyAmJiAiRm9ybWF0IHNwZWNpZmllciBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgJzonIik7CisgICsrTGlrZTsKIAotICBhc3NlcnQoc3RyY2hyKFByaW50ZiwgJzonKSAmJiAicHJpbnRmIHNwZWNpZmllciBtdXN0IGVuZCB3aXRoIGEgJzonIik7Ci0gIEZvcm1hdElkeCA9IHN0cnRvbChQcmludGYsIDAsIDEwKTsKKyAgYXNzZXJ0KDo6c3RyY2hyKExpa2UsICc6JykgJiYgIkZvcm1hdCBzcGVjaWZpZXIgbXVzdCBlbmQgd2l0aCBhICc6JyIpOworICBGb3JtYXRJZHggPSA6OnN0cnRvbChMaWtlLCAwLCAxMCk7CiAgIHJldHVybiB0cnVlOwogfQogCi0vLyBGSVhNRTogUmVmYWN0b3Igd2l0aCBpc1ByaW50Zkxpa2UuCi1ib29sCi1CdWlsdGluOjpDb250ZXh0Ojppc1NjYW5mTGlrZSh1bnNpZ25lZCBJRCwgdW5zaWduZWQgJkZvcm1hdElkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhc1ZBTGlzdEFyZykgewotICBjb25zdCBjaGFyICpTY2FuZiA9IHN0cnBicmsoR2V0UmVjb3JkKElEKS5BdHRyaWJ1dGVzLCAic1MiKTsKLSAgaWYgKCFTY2FuZikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgSGFzVkFMaXN0QXJnID0gKCpTY2FuZiA9PSAnUycpOwotCi0gICsrU2NhbmY7Ci0gIGFzc2VydCgqU2NhbmYgPT0gJzonICYmICJzIG9yIFMgc3BlY2lmaWVyIG11c3QgaGF2ZSBiZSBmb2xsb3dlZCBieSBhICc6JyIpOwotICArK1NjYW5mOwotCi0gIGFzc2VydChzdHJjaHIoU2NhbmYsICc6JykgJiYgInByaW50ZiBzcGVjaWZpZXIgbXVzdCBlbmQgd2l0aCBhICc6JyIpOwotICBGb3JtYXRJZHggPSBzdHJ0b2woU2NhbmYsIDAsIDEwKTsKLSAgcmV0dXJuIHRydWU7Citib29sIEJ1aWx0aW46OkNvbnRleHQ6OmlzUHJpbnRmTGlrZSh1bnNpZ25lZCBJRCwgdW5zaWduZWQgJkZvcm1hdElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhc1ZBTGlzdEFyZykgeworICByZXR1cm4gaXNMaWtlKElELCBGb3JtYXRJZHgsIEhhc1ZBTGlzdEFyZywgInBQIik7CiB9CiAKK2Jvb2wgQnVpbHRpbjo6Q29udGV4dDo6aXNTY2FuZkxpa2UodW5zaWduZWQgSUQsIHVuc2lnbmVkICZGb3JtYXRJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkhhc1ZBTGlzdEFyZykgeworICByZXR1cm4gaXNMaWtlKElELCBGb3JtYXRJZHgsIEhhc1ZBTGlzdEFyZywgInNTIik7Cit9CmRpZmYgLS1naXQgYS9saWIvQmFzaWMvQ01ha2VMaXN0cy50eHQgYi9saWIvQmFzaWMvQ01ha2VMaXN0cy50eHQKaW5kZXggMzQxMTE2OS4uMDQ0OGZkYiAxMDA2NDQKLS0tIGEvbGliL0Jhc2ljL0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9CYXNpYy9DTWFrZUxpc3RzLnR4dApAQCAtMSw2ICsxLDEwIEBACi1zZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMgbWMpCitzZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMKKyAgTUMKKyAgU3VwcG9ydAorICApCiAKIGFkZF9jbGFuZ19saWJyYXJ5KGNsYW5nQmFzaWMKKyAgQXR0cmlidXRlcy5jcHAKICAgQnVpbHRpbnMuY3BwCiAgIENoYXJJbmZvLmNwcAogICBEaWFnbm9zdGljLmNwcApAQCAtMjAsNiArMjQsNyBAQAogICBUb2tlbktpbmRzLmNwcAogICBWZXJzaW9uLmNwcAogICBWZXJzaW9uVHVwbGUuY3BwCisgIFZpcnR1YWxGaWxlU3lzdGVtLmNwcAogICApCiAKICMgRGV0ZXJtaW5lIFN1YnZlcnNpb24gcmV2aXNpb24uCkBAIC0yOSwxNyArMzQsMTUgQEAKICAgZmluZF9wYWNrYWdlKFN1YnZlcnNpb24pCiBlbmRpZigpCiBpZiAoU3VidmVyc2lvbl9GT1VORCBBTkQgRVhJU1RTICIke0NMQU5HX1NPVVJDRV9ESVJ9Ly5zdm4iKQotICAjIENyZWF0ZSBjdXN0b20gdGFyZ2V0IHRvIGdlbmVyYXRlIHRoZSBTdWJ2ZXJzaW9uIHZlcnNpb24gaW5jbHVkZS4KLSAgYWRkX2N1c3RvbV90YXJnZXQoY2xhbmdfcmV2aXNpb25fdGFnICBBTEwKLSAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLURGSVJTVF9TT1VSQ0VfRElSPSR7TExWTV9NQUlOX1NSQ19ESVJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1ERklSU1RfUkVQT1NJVE9SWT1MTFZNX1JFUE9TSVRPUlkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURTRUNPTkRfU09VUkNFX0RJUj0ke0NMQU5HX1NPVVJDRV9ESVJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EU0VDT05EX1JFUE9TSVRPUlk9U1ZOX1JFUE9TSVRPUlkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURIRUFERVJfRklMRT0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vU1ZOVmVyc2lvbi5pbmMKLSAgIC1QICR7TExWTV9NQUlOX1NSQ19ESVJ9L2NtYWtlL21vZHVsZXMvR2V0U1ZOLmNtYWtlKQorICBzZXQoRklSU1RfU09VUkNFX0RJUiAke0xMVk1fTUFJTl9TUkNfRElSfSkKKyAgc2V0KEZJUlNUX1JFUE9TSVRPUlkgTExWTV9SRVBPU0lUT1JZKQorICBzZXQoU0VDT05EX1NPVVJDRV9ESVIgJHtDTEFOR19TT1VSQ0VfRElSfSkKKyAgc2V0KFNFQ09ORF9SRVBPU0lUT1JZIFNWTl9SRVBPU0lUT1JZKQorICBzZXQoSEVBREVSX0ZJTEUgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1NWTlZlcnNpb24uaW5jKQorICBpbmNsdWRlKEdldFNWTikKIAogICAjIE1hcmsgdGhlIGdlbmVyYXRlZCBoZWFkZXIgYXMgYmVpbmcgZ2VuZXJhdGVkLgotbWVzc2FnZShTVEFUVVMgIkV4cGVjdGluZyBoZWFkZXIgdG8gZ28gaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1NWTlZlcnNpb24uaW5jIikKKyAgbWVzc2FnZShTVEFUVVMgIkV4cGVjdGluZyBoZWFkZXIgdG8gZ28gaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1NWTlZlcnNpb24uaW5jIikKICAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9TVk5WZXJzaW9uLmluYwogICAgIFBST1BFUlRJRVMgR0VORVJBVEVEIFRSVUUKICAgICAgICAgICAgICAgIEhFQURFUl9GSUxFX09OTFkgVFJVRSkKQEAgLTQ5LDI1ICs1MiwzIEBACiAgICAgUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICJIQVZFX1NWTl9WRVJTSU9OX0lOQyIpCiAKIGVuZGlmKCkKLQotYWRkX2RlcGVuZGVuY2llcyhjbGFuZ0Jhc2ljCi0gIENsYW5nQVJNTmVvbgotICBDbGFuZ0F0dHJMaXN0Ci0gIENsYW5nRGlhZ25vc3RpY0FuYWx5c2lzCi0gIENsYW5nRGlhZ25vc3RpY0FTVAotICBDbGFuZ0RpYWdub3N0aWNDb21tZW50Ci0gIENsYW5nRGlhZ25vc3RpY0NvbW1vbgotICBDbGFuZ0RpYWdub3N0aWNEcml2ZXIKLSAgQ2xhbmdEaWFnbm9zdGljRnJvbnRlbmQKLSAgQ2xhbmdEaWFnbm9zdGljR3JvdXBzCi0gIENsYW5nRGlhZ25vc3RpY0luZGV4TmFtZQotICBDbGFuZ0RpYWdub3N0aWNMZXgKLSAgQ2xhbmdEaWFnbm9zdGljUGFyc2UKLSAgQ2xhbmdEaWFnbm9zdGljU2VtYQotICBDbGFuZ0RpYWdub3N0aWNTZXJpYWxpemF0aW9uCi0gICkKLQotIyBjbGFuZ0Jhc2ljIGRlcGVuZHMgb24gdGhlIHZlcnNpb24uCi1pZiAoU3VidmVyc2lvbl9GT1VORCBBTkQgRVhJU1RTICIke0NMQU5HX1NPVVJDRV9ESVJ9Ly5zdm4iKQotICBhZGRfZGVwZW5kZW5jaWVzKGNsYW5nQmFzaWMgY2xhbmdfcmV2aXNpb25fdGFnKQotZW5kaWYoKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9CYXNpYy9EaWFnbm9zdGljLmNwcCBiL2xpYi9CYXNpYy9EaWFnbm9zdGljLmNwcAppbmRleCA0NWQ0YjUzLi5mNTA3NTQ4IDEwMDY0NAotLS0gYS9saWIvQmFzaWMvRGlhZ25vc3RpYy5jcHAKKysrIGIvbGliL0Jhc2ljL0RpYWdub3N0aWMuY3BwCkBAIC0yMjIsNyArMjIyLDcgQEAKIAogICAvLyBDcmVhdGUgYSBuZXcgc3RhdGUvcG9pbnQgYW5kIGZpdCBpdCBpbnRvIHRoZSB2ZWN0b3Igb2YgRGlhZ1N0YXRlUG9pbnRzCiAgIC8vIHNvIHRoYXQgdGhlIHZlY3RvciBpcyBhbHdheXMgb3JkZXJlZCBhY2NvcmRpbmcgdG8gbG9jYXRpb24uCi0gIFBvcy0+TG9jLmlzQmVmb3JlSW5UcmFuc2xhdGlvblVuaXRUaGFuKExvYyk7CisgIGFzc2VydChQb3MtPkxvYy5pc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0VGhhbihMb2MpKTsKICAgRGlhZ1N0YXRlcy5wdXNoX2JhY2soKlBvcy0+U3RhdGUpOwogICBEaWFnU3RhdGUgKk5ld1N0YXRlID0gJkRpYWdTdGF0ZXMuYmFjaygpOwogICBHZXRDdXJEaWFnU3RhdGUoKS0+c2V0TWFwcGluZ0luZm8oRGlhZywgTWFwcGluZ0luZm8pOwpAQCAtMjQ1LDI0ICsyNDUsNiBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgRGlhZ25vc3RpY3NFbmdpbmU6OnNldERpYWdub3N0aWNXYXJuaW5nQXNFcnJvcihkaWFnOjpraW5kIERpYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbmFibGVkKSB7Ci0gIC8vIElmIHdlIGFyZSBlbmFibGluZyB0aGlzIGZlYXR1cmUsIGp1c3Qgc2V0IHRoZSBkaWFnbm9zdGljIG1hcHBpbmdzIHRvIG1hcCB0bwotICAvLyBlcnJvcnMuCi0gIGlmIChFbmFibGVkKSAKLSAgICBzZXREaWFnbm9zdGljTWFwcGluZyhEaWFnLCBkaWFnOjpNQVBfRVJST1IsIFNvdXJjZUxvY2F0aW9uKCkpOwotCi0gIC8vIE90aGVyd2lzZSwgd2Ugd2FudCB0byBzZXQgdGhlIGRpYWdub3N0aWMgbWFwcGluZydzICJubyBXZXJyb3IiIGJpdCwgYW5kCi0gIC8vIHBvdGVudGlhbGx5IGRvd25ncmFkZSBhbnl0aGluZyBhbHJlYWR5IG1hcHBlZCB0byBiZSBhIHdhcm5pbmcuCi0gIERpYWdub3N0aWNNYXBwaW5nSW5mbyAmSW5mbyA9IEdldEN1ckRpYWdTdGF0ZSgpLT5nZXRPckFkZE1hcHBpbmdJbmZvKERpYWcpOwotCi0gIGlmIChJbmZvLmdldE1hcHBpbmcoKSA9PSBkaWFnOjpNQVBfRVJST1IgfHwKLSAgICAgIEluZm8uZ2V0TWFwcGluZygpID09IGRpYWc6Ok1BUF9GQVRBTCkKLSAgICBJbmZvLnNldE1hcHBpbmcoZGlhZzo6TUFQX1dBUk5JTkcpOwotCi0gIEluZm8uc2V0Tm9XYXJuaW5nQXNFcnJvcih0cnVlKTsKLX0KLQogYm9vbCBEaWFnbm9zdGljc0VuZ2luZTo6c2V0RGlhZ25vc3RpY0dyb3VwV2FybmluZ0FzRXJyb3IoU3RyaW5nUmVmIEdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbmFibGVkKSB7CiAgIC8vIElmIHdlIGFyZSBlbmFibGluZyB0aGlzIGZlYXR1cmUsIGp1c3Qgc2V0IHRoZSBkaWFnbm9zdGljIG1hcHBpbmdzIHRvIG1hcCB0bwpAQCAtMjkzLDIzICsyNzUsNiBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgRGlhZ25vc3RpY3NFbmdpbmU6OnNldERpYWdub3N0aWNFcnJvckFzRmF0YWwoZGlhZzo6a2luZCBEaWFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVuYWJsZWQpIHsKLSAgLy8gSWYgd2UgYXJlIGVuYWJsaW5nIHRoaXMgZmVhdHVyZSwganVzdCBzZXQgdGhlIGRpYWdub3N0aWMgbWFwcGluZ3MgdG8gbWFwIHRvCi0gIC8vIGVycm9ycy4KLSAgaWYgKEVuYWJsZWQpCi0gICAgc2V0RGlhZ25vc3RpY01hcHBpbmcoRGlhZywgZGlhZzo6TUFQX0ZBVEFMLCBTb3VyY2VMb2NhdGlvbigpKTsKLSAgCi0gIC8vIE90aGVyd2lzZSwgd2Ugd2FudCB0byBzZXQgdGhlIGRpYWdub3N0aWMgbWFwcGluZydzICJubyBXZXJyb3IiIGJpdCwgYW5kCi0gIC8vIHBvdGVudGlhbGx5IGRvd25ncmFkZSBhbnl0aGluZyBhbHJlYWR5IG1hcHBlZCB0byBiZSBhIHdhcm5pbmcuCi0gIERpYWdub3N0aWNNYXBwaW5nSW5mbyAmSW5mbyA9IEdldEN1ckRpYWdTdGF0ZSgpLT5nZXRPckFkZE1hcHBpbmdJbmZvKERpYWcpOwotICAKLSAgaWYgKEluZm8uZ2V0TWFwcGluZygpID09IGRpYWc6Ok1BUF9GQVRBTCkKLSAgICBJbmZvLnNldE1hcHBpbmcoZGlhZzo6TUFQX0VSUk9SKTsKLSAgCi0gIEluZm8uc2V0Tm9FcnJvckFzRmF0YWwodHJ1ZSk7Ci19Ci0KIGJvb2wgRGlhZ25vc3RpY3NFbmdpbmU6OnNldERpYWdub3N0aWNHcm91cEVycm9yQXNGYXRhbChTdHJpbmdSZWYgR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbmFibGVkKSB7CiAgIC8vIElmIHdlIGFyZSBlbmFibGluZyB0aGlzIGZlYXR1cmUsIGp1c3Qgc2V0IHRoZSBkaWFnbm9zdGljIG1hcHBpbmdzIHRvIG1hcCB0bwpAQCAtNjM5LDYgKzYwNCwxNyBAQAogICB9CiB9CiAKKy8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZnJpZW5kbHkgZGVzY3JpcHRpb24gZm9yIGEgdG9rZW4ga2luZCB0aGF0IHdpbGwgYXBwZWFyCisvLy8gd2l0aG91dCBxdW90ZXMgaW4gZGlhZ25vc3RpYyBtZXNzYWdlcy4gVGhlc2Ugc3RyaW5ncyBtYXkgYmUgdHJhbnNsYXRhYmxlIGluCisvLy8gZnV0dXJlLgorc3RhdGljIGNvbnN0IGNoYXIgKmdldFRva2VuRGVzY0ZvckRpYWdub3N0aWModG9rOjpUb2tlbktpbmQgS2luZCkgeworICBzd2l0Y2ggKEtpbmQpIHsKKyAgY2FzZSB0b2s6OmlkZW50aWZpZXI6CisgICAgcmV0dXJuICJpZGVudGlmaWVyIjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsKKyAgfQorfQogCiAvLy8gRm9ybWF0RGlhZ25vc3RpYyAtIEZvcm1hdCB0aGlzIGRpYWdub3N0aWMgaW50byBhIHN0cmluZywgc3Vic3RpdHV0aW5nIHRoZQogLy8vIGZvcm1hbCBhcmd1bWVudHMgaW50byB0aGUgJTAgc2xvdHMuICBUaGUgcmVzdWx0IGlzIGFwcGVuZGVkIG9udG8gdGhlIFN0cgpAQCAtODEyLDYgKzc4OCwyOCBAQAogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgfQorICAgIC8vIC0tLS0gVE9LRU4gU1BFTExJTkdTIC0tLS0KKyAgICBjYXNlIERpYWdub3N0aWNzRW5naW5lOjpha190b2tlbmtpbmQ6IHsKKyAgICAgIHRvazo6VG9rZW5LaW5kIEtpbmQgPSBzdGF0aWNfY2FzdDx0b2s6OlRva2VuS2luZD4oZ2V0UmF3QXJnKEFyZ05vKSk7CisgICAgICBhc3NlcnQoTW9kaWZpZXJMZW4gPT0gMCAmJiAiTm8gbW9kaWZpZXJzIGZvciB0b2tlbiBraW5kcyB5ZXQiKTsKKworICAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPdXQoT3V0U3RyKTsKKyAgICAgIGlmIChjb25zdCBjaGFyICpTID0gdG9rOjpnZXRQdW5jdHVhdG9yU3BlbGxpbmcoS2luZCkpCisgICAgICAgIC8vIFF1b3RlZCB0b2tlbiBzcGVsbGluZyBmb3IgcHVuY3R1YXRvcnMuCisgICAgICAgIE91dCA8PCAnXCcnIDw8IFMgPDwgJ1wnJzsKKyAgICAgIGVsc2UgaWYgKGNvbnN0IGNoYXIgKlMgPSB0b2s6OmdldEtleXdvcmRTcGVsbGluZyhLaW5kKSkKKyAgICAgICAgLy8gVW5xdW90ZWQgdG9rZW4gc3BlbGxpbmcgZm9yIGtleXdvcmRzLgorICAgICAgICBPdXQgPDwgUzsKKyAgICAgIGVsc2UgaWYgKGNvbnN0IGNoYXIgKlMgPSBnZXRUb2tlbkRlc2NGb3JEaWFnbm9zdGljKEtpbmQpKQorICAgICAgICAvLyBVbnF1b3RlZCB0cmFuc2xhdGFibGUgdG9rZW4gbmFtZS4KKyAgICAgICAgT3V0IDw8IFM7CisgICAgICBlbHNlIGlmIChjb25zdCBjaGFyICpTID0gdG9rOjpnZXRUb2tlbk5hbWUoS2luZCkpCisgICAgICAgIC8vIERlYnVnIG5hbWUsIHNob3VsZG4ndCBhcHBlYXIgaW4gdXNlci1mYWNpbmcgZGlhZ25vc3RpY3MuCisgICAgICAgIE91dCA8PCAnPCcgPDwgUyA8PCAnPic7CisgICAgICBlbHNlCisgICAgICAgIE91dCA8PCAiKG51bGwpIjsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICAvLyAtLS0tIE5BTUVTIGFuZCBUWVBFUyAtLS0tCiAgICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6YWtfaWRlbnRpZmllcmluZm86IHsKICAgICAgIGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSA9IGdldEFyZ0lkZW50aWZpZXIoQXJnTm8pOwpAQCAtODMyLDYgKzgzMCw3IEBACiAgICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6YWtfbmFtZWRkZWNsOgogICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6OmFrX25lc3RlZG5hbWVzcGVjOgogICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6OmFrX2RlY2xjb250ZXh0OgorICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6OmFrX2F0dHI6CiAgICAgICBnZXREaWFncygpLT5Db252ZXJ0QXJnVG9TdHJpbmcoS2luZCwgZ2V0UmF3QXJnKEFyZ05vKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllciwgTW9kaWZpZXJMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJndW1lbnQsIEFyZ3VtZW50TGVuLApkaWZmIC0tZ2l0IGEvbGliL0Jhc2ljL0RpYWdub3N0aWNJRHMuY3BwIGIvbGliL0Jhc2ljL0RpYWdub3N0aWNJRHMuY3BwCmluZGV4IDlkOTlmYmUuLmNmNjkzM2EgMTAwNjQ0Ci0tLSBhL2xpYi9CYXNpYy9EaWFnbm9zdGljSURzLmNwcAorKysgYi9saWIvQmFzaWMvRGlhZ25vc3RpY0lEcy5jcHAKQEAgLTE1LDggKzE1LDggQEAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9BbGxEaWFnbm9zdGljcy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWNDYXRlZ29yaWVzLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgotI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgogI2luY2x1ZGUgPG1hcD4KIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKQEAgLTMwLDkgKzMwLDEwIEBACiAvLyBEaWFnbm9zdGljIGNsYXNzZXMuCiBlbnVtIHsKICAgQ0xBU1NfTk9URSAgICAgICA9IDB4MDEsCi0gIENMQVNTX1dBUk5JTkcgICAgPSAweDAyLAotICBDTEFTU19FWFRFTlNJT04gID0gMHgwMywKLSAgQ0xBU1NfRVJST1IgICAgICA9IDB4MDQKKyAgQ0xBU1NfUkVNQVJLICAgICA9IDB4MDIsCisgIENMQVNTX1dBUk5JTkcgICAgPSAweDAzLAorICBDTEFTU19FWFRFTlNJT04gID0gMHgwNCwKKyAgQ0xBU1NfRVJST1IgICAgICA9IDB4MDUKIH07CiAKIHN0cnVjdCBTdGF0aWNEaWFnSW5mb1JlYyB7CkBAIC0xMTEsNyArMTEyLDcgQEAKICAgICByZXR1cm4gMDsKIAogICAvLyBDb21wdXRlIHRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdGVkIGRpYWdub3N0aWMgaW4gdGhlIHN0YXRpYyB0YWJsZS4KLSAgLy8gMS4gQWRkIHRoZSBudW1iZXIgb2YgZGlhZ25vc3RpY3MgaW4gZWFjaCBjYXRlZ29yeSBwcmVjZWVkaW5nIHRoZQorICAvLyAxLiBBZGQgdGhlIG51bWJlciBvZiBkaWFnbm9zdGljcyBpbiBlYWNoIGNhdGVnb3J5IHByZWNlZGluZyB0aGUKICAgLy8gICAgZGlhZ25vc3RpYyBhbmQgb2YgdGhlIGNhdGVnb3J5IHRoZSBkaWFnbm9zdGljIGlzIGluLiBUaGlzIGdpdmVzIHVzCiAgIC8vICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNhdGVnb3J5IGluIHRoZSB0YWJsZS4KICAgLy8gMi4gU3VidHJhY3QgdGhlIG51bWJlciBvZiBJRHMgaW4gZWFjaCBjYXRlZ29yeSBmcm9tIG91ciBJRC4gVGhpcyBnaXZlcyB1cwpAQCAtMzExLDEwICszMTIsMTMgQEAKIC8vLyBnZXRDdXN0b21EaWFnSUQgLSBSZXR1cm4gYW4gSUQgZm9yIGEgZGlhZ25vc3RpYyB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZQogLy8vIGFuZCBsZXZlbC4gIElmIHRoaXMgaXMgdGhlIGZpcnN0IHJlcXVlc3QgZm9yIHRoaXMgZGlhZ25vc3RpYywgaXQgaXMKIC8vLyByZWdpc3RlcmVkIGFuZCBjcmVhdGVkLCBvdGhlcndpc2UgdGhlIGV4aXN0aW5nIElEIGlzIHJldHVybmVkLgotdW5zaWduZWQgRGlhZ25vc3RpY0lEczo6Z2V0Q3VzdG9tRGlhZ0lEKExldmVsIEwsIFN0cmluZ1JlZiBNZXNzYWdlKSB7CisvLy8KKy8vLyBccGFyYW0gRm9ybWF0U3RyaW5nIEEgZml4ZWQgZGlhZ25vc3RpYyBmb3JtYXQgc3RyaW5nIHRoYXQgd2lsbCBiZSBoYXNoZWQgYW5kCisvLy8gbWFwcGVkIHRvIGEgdW5pcXVlIERpYWdJRC4KK3Vuc2lnbmVkIERpYWdub3N0aWNJRHM6OmdldEN1c3RvbURpYWdJRChMZXZlbCBMLCBTdHJpbmdSZWYgRm9ybWF0U3RyaW5nKSB7CiAgIGlmIChDdXN0b21EaWFnSW5mbyA9PSAwKQogICAgIEN1c3RvbURpYWdJbmZvID0gbmV3IGRpYWc6OkN1c3RvbURpYWdJbmZvKCk7Ci0gIHJldHVybiBDdXN0b21EaWFnSW5mby0+Z2V0T3JDcmVhdGVEaWFnSUQoTCwgTWVzc2FnZSwgKnRoaXMpOworICByZXR1cm4gQ3VzdG9tRGlhZ0luZm8tPmdldE9yQ3JlYXRlRGlhZ0lEKEwsIEZvcm1hdFN0cmluZywgKnRoaXMpOwogfQogCiAKQEAgLTQwNiw2ICs0MTAsOSBAQAogICBjYXNlIGRpYWc6Ok1BUF9JR05PUkU6CiAgICAgUmVzdWx0ID0gRGlhZ25vc3RpY0lEczo6SWdub3JlZDsKICAgICBicmVhazsKKyAgY2FzZSBkaWFnOjpNQVBfUkVNQVJLOgorICAgIFJlc3VsdCA9IERpYWdub3N0aWNJRHM6OlJlbWFyazsKKyAgICBicmVhazsKICAgY2FzZSBkaWFnOjpNQVBfV0FSTklORzoKICAgICBSZXN1bHQgPSBEaWFnbm9zdGljSURzOjpXYXJuaW5nOwogICAgIGJyZWFrOwpAQCAtNDIyLDYgKzQyOSwxMSBAQAogICAgICAgIU1hcHBpbmdJbmZvLmlzVXNlcigpKQogICAgIFJlc3VsdCA9IERpYWdub3N0aWNJRHM6Oldhcm5pbmc7CiAKKyAgLy8gRGlhZ25vc3RpY3Mgb2YgY2xhc3MgUkVNQVJLIGFyZSBlaXRoZXIgcHJpbnRlZCBhcyByZW1hcmtzIG9yIGluIGNhc2UgdGhleQorICAvLyBoYXZlIGJlZW4gYWRkZWQgdG8gLVdlcnJvciB0aGV5IGFyZSBwcmludGVkIGFzIGVycm9ycy4KKyAgaWYgKERpYWdDbGFzcyA9PSBDTEFTU19SRU1BUksgJiYgUmVzdWx0ID09IERpYWdub3N0aWNJRHM6Oldhcm5pbmcpCisgICAgUmVzdWx0ID0gRGlhZ25vc3RpY0lEczo6UmVtYXJrOworCiAgIC8vIElnbm9yZSAtcGVkYW50aWMgZGlhZ25vc3RpY3MgaW5zaWRlIF9fZXh0ZW5zaW9uX18gYmxvY2tzLgogICAvLyAoVGhlIGRpYWdub3N0aWNzIGNvbnRyb2xsZWQgYnkgLXBlZGFudGljIGFyZSB0aGUgZXh0ZW5zaW9uIGRpYWdub3N0aWNzCiAgIC8vIHRoYXQgYXJlIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQuKQpkaWZmIC0tZ2l0IGEvbGliL0Jhc2ljL0ZpbGVNYW5hZ2VyLmNwcCBiL2xpYi9CYXNpYy9GaWxlTWFuYWdlci5jcHAKaW5kZXggYWY5YjI2Ni4uNTc5YzgxOCAxMDA2NDQKLS0tIGEvbGliL0Jhc2ljL0ZpbGVNYW5hZ2VyLmNwcAorKysgYi9saWIvQmFzaWMvRmlsZU1hbmFnZXIuY3BwCkBAIC0zMCwxOSArMzAsNiBAQAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdHJpbmc+CiAKLS8vIEZJWE1FOiBUaGlzIGlzIHRlcnJpYmxlLCB3ZSBuZWVkIHRoaXMgZm9yIDo6Y2xvc2UuCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLSNlbHNlCi0jaW5jbHVkZSA8aW8uaD4KLSNpZm5kZWYgU19JU0ZJRk8KLSNkZWZpbmUgU19JU0ZJRk8oeCkgKDApCi0jZW5kaWYKLSNlbmRpZgotI2lmIGRlZmluZWQoTExWTV9PTl9VTklYKQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2VuZGlmCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiAKIC8vIEZJWE1FOiBFbmhhbmNlIGxpYnN5c3RlbSB0byBzdXBwb3J0IGlub2RlIGFuZCBvdGhlciBmaWVsZHMuCkBAIC01Niw2MyArNDMsMjQgQEAKIC8vLyByZXByZXNlbnQgYSBmaWxlbmFtZSB0aGF0IGRvZXNuJ3QgZXhpc3Qgb24gdGhlIGRpc2suCiAjZGVmaW5lIE5PTl9FWElTVEVOVF9GSUxFIHJlaW50ZXJwcmV0X2Nhc3Q8RmlsZUVudHJ5Kj4oKGludHB0cl90KS0xKQogCi0KLUZpbGVFbnRyeTo6fkZpbGVFbnRyeSgpIHsKLSAgLy8gSWYgdGhpcyBGaWxlRW50cnkgb3ducyBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciB0aGF0IG5ldmVyIGdvdCB1c2VkLCBjbG9zZQotICAvLyBpdC4KLSAgaWYgKEZEICE9IC0xKSA6OmNsb3NlKEZEKTsKLX0KLQotY2xhc3MgRmlsZU1hbmFnZXI6OlVuaXF1ZURpckNvbnRhaW5lciB7Ci0gIC8vLyBVbmlxdWVEaXJzIC0gQ2FjaGUgZnJvbSBJRCdzIHRvIGV4aXN0aW5nIGRpcmVjdG9yaWVzL2ZpbGVzLgotICBzdGQ6Om1hcDxsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRCwgRGlyZWN0b3J5RW50cnk+IFVuaXF1ZURpcnM7Ci0KLXB1YmxpYzoKLSAgLy8vIGdldERpcmVjdG9yeSAtIFJldHVybiBhbiBleGlzdGluZyBEaXJlY3RvcnlFbnRyeSB3aXRoIHRoZSBnaXZlbgotICAvLy8gSUQncyBpZiB0aGVyZSBpcyBhbHJlYWR5IG9uZTsgb3RoZXJ3aXNlIGNyZWF0ZSBhbmQgcmV0dXJuIGEKLSAgLy8vIGRlZmF1bHQtY29uc3RydWN0ZWQgRGlyZWN0b3J5RW50cnkuCi0gIERpcmVjdG9yeUVudHJ5ICZnZXREaXJlY3RvcnkoY29uc3QgbGx2bTo6c3lzOjpmczo6VW5pcXVlSUQgJlVuaXF1ZUlEKSB7Ci0gICAgcmV0dXJuIFVuaXF1ZURpcnNbVW5pcXVlSURdOwotICB9Ci0KLSAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBVbmlxdWVEaXJzLnNpemUoKTsgfQotfTsKLQotY2xhc3MgRmlsZU1hbmFnZXI6OlVuaXF1ZUZpbGVDb250YWluZXIgewotICAvLy8gVW5pcXVlRmlsZXMgLSBDYWNoZSBmcm9tIElEJ3MgdG8gZXhpc3RpbmcgZGlyZWN0b3JpZXMvZmlsZXMuCi0gIHN0ZDo6c2V0PEZpbGVFbnRyeT4gVW5pcXVlRmlsZXM7Ci0KLXB1YmxpYzoKLSAgLy8vIGdldEZpbGUgLSBSZXR1cm4gYW4gZXhpc3RpbmcgRmlsZUVudHJ5IHdpdGggdGhlIGdpdmVuIElEJ3MgaWYKLSAgLy8vIHRoZXJlIGlzIGFscmVhZHkgb25lOyBvdGhlcndpc2UgY3JlYXRlIGFuZCByZXR1cm4gYQotICAvLy8gZGVmYXVsdC1jb25zdHJ1Y3RlZCBGaWxlRW50cnkuCi0gIEZpbGVFbnRyeSAmZ2V0RmlsZShsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRCBVbmlxdWVJRCwgYm9vbCBJc05hbWVkUGlwZSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5QQ0gpIHsKLSAgICByZXR1cm4gY29uc3RfY2FzdDxGaWxlRW50cnkgJj4oCi0gICAgICAgICpVbmlxdWVGaWxlcy5pbnNlcnQoRmlsZUVudHJ5KFVuaXF1ZUlELCBJc05hbWVkUGlwZSwgSW5QQ0gpKS5maXJzdCk7Ci0gIH0KLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFVuaXF1ZUZpbGVzLnNpemUoKTsgfQotCi0gIHZvaWQgZXJhc2UoY29uc3QgRmlsZUVudHJ5ICpFbnRyeSkgeyBVbmlxdWVGaWxlcy5lcmFzZSgqRW50cnkpOyB9Ci19OwotCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogLy8gQ29tbW9uIGxvZ2ljLgogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAotRmlsZU1hbmFnZXI6OkZpbGVNYW5hZ2VyKGNvbnN0IEZpbGVTeXN0ZW1PcHRpb25zICZGU08pCi0gIDogRmlsZVN5c3RlbU9wdHMoRlNPKSwKLSAgICBVbmlxdWVSZWFsRGlycygqbmV3IFVuaXF1ZURpckNvbnRhaW5lcigpKSwKLSAgICBVbmlxdWVSZWFsRmlsZXMoKm5ldyBVbmlxdWVGaWxlQ29udGFpbmVyKCkpLAorRmlsZU1hbmFnZXI6OkZpbGVNYW5hZ2VyKGNvbnN0IEZpbGVTeXN0ZW1PcHRpb25zICZGU08sCisgICAgICAgICAgICAgICAgICAgICAgICAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gRlMpCisgIDogRlMoRlMpLCBGaWxlU3lzdGVtT3B0cyhGU08pLAogICAgIFNlZW5EaXJFbnRyaWVzKDY0KSwgU2VlbkZpbGVFbnRyaWVzKDY0KSwgTmV4dEZpbGVVSUQoMCkgewogICBOdW1EaXJMb29rdXBzID0gTnVtRmlsZUxvb2t1cHMgPSAwOwogICBOdW1EaXJDYWNoZU1pc3NlcyA9IE51bUZpbGVDYWNoZU1pc3NlcyA9IDA7CisKKyAgLy8gSWYgdGhlIGNhbGxlciBkb2Vzbid0IHByb3ZpZGUgYSB2aXJ0dWFsIGZpbGUgc3lzdGVtLCBqdXN0IGdyYWIgdGhlIHJlYWwKKyAgLy8gZmlsZSBzeXN0ZW0uCisgIGlmICghRlMpCisgICAgdGhpcy0+RlMgPSB2ZnM6OmdldFJlYWxGaWxlU3lzdGVtKCk7CiB9CiAKIEZpbGVNYW5hZ2VyOjp+RmlsZU1hbmFnZXIoKSB7Ci0gIGRlbGV0ZSAmVW5pcXVlUmVhbERpcnM7Ci0gIGRlbGV0ZSAmVW5pcXVlUmVhbEZpbGVzOwogICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVmlydHVhbEZpbGVFbnRyaWVzLnNpemUoKTsgaSAhPSBlOyArK2kpCiAgICAgZGVsZXRlIFZpcnR1YWxGaWxlRW50cmllc1tpXTsKICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZpcnR1YWxEaXJlY3RvcnlFbnRyaWVzLnNpemUoKTsgaSAhPSBlOyArK2kpCkBAIC0xMjMsNyArNzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXRCZWdpbm5pbmcpIHsKICAgYXNzZXJ0KHN0YXRDYWNoZSAmJiAiTm8gc3RhdCBjYWNoZSBwcm92aWRlZD8iKTsKICAgaWYgKEF0QmVnaW5uaW5nIHx8IFN0YXRDYWNoZS5nZXQoKSA9PSAwKSB7Ci0gICAgc3RhdENhY2hlLT5zZXROZXh0U3RhdENhY2hlKFN0YXRDYWNoZS50YWtlKCkpOworICAgIHN0YXRDYWNoZS0+c2V0TmV4dFN0YXRDYWNoZShTdGF0Q2FjaGUucmVsZWFzZSgpKTsKICAgICBTdGF0Q2FjaGUucmVzZXQoc3RhdENhY2hlKTsKICAgICByZXR1cm47CiAgIH0KQEAgLTI1Niw4ICsyMDQsNyBAQAogICAvLyBzYW1lIGlub2RlICh0aGlzIG9jY3VycyBvbiBVbml4LWxpa2Ugc3lzdGVtcyB3aGVuIG9uZSBkaXIgaXMKICAgLy8gc3ltbGlua2VkIHRvIGFub3RoZXIsIGZvciBleGFtcGxlKSBvciB0aGUgc2FtZSBwYXRoIChvbgogICAvLyBXaW5kb3dzKS4KLSAgRGlyZWN0b3J5RW50cnkgJlVERSA9Ci0gICAgICBVbmlxdWVSZWFsRGlycy5nZXREaXJlY3RvcnkoRGF0YS5VbmlxdWVJRCk7CisgIERpcmVjdG9yeUVudHJ5ICZVREUgPSBVbmlxdWVSZWFsRGlyc1tEYXRhLlVuaXF1ZUlEXTsKIAogICBOYW1lZERpckVudC5zZXRWYWx1ZSgmVURFKTsKICAgaWYgKCFVREUuZ2V0TmFtZSgpKSB7CkBAIC0zMDksMTAgKzI1Niw5IEBACiAgIC8vIEZJWE1FOiBUaGlzIHdpbGwgcmVkdWNlIHRoZSAjIHN5c2NhbGxzLgogCiAgIC8vIE5vcGUsIHRoZXJlIGlzbid0LiAgQ2hlY2sgdG8gc2VlIGlmIHRoZSBmaWxlIGV4aXN0cy4KLSAgaW50IEZpbGVEZXNjcmlwdG9yID0gLTE7CisgIHZmczo6RmlsZSAqRiA9IDA7CiAgIEZpbGVEYXRhIERhdGE7Ci0gIGlmIChnZXRTdGF0VmFsdWUoSW50ZXJuZEZpbGVOYW1lLCBEYXRhLCB0cnVlLAotICAgICAgICAgICAgICAgICAgIG9wZW5GaWxlID8gJkZpbGVEZXNjcmlwdG9yIDogMCkpIHsKKyAgaWYgKGdldFN0YXRWYWx1ZShJbnRlcm5kRmlsZU5hbWUsIERhdGEsIHRydWUsIG9wZW5GaWxlID8gJkYgOiAwKSkgewogICAgIC8vIFRoZXJlJ3Mgbm8gcmVhbCBmaWxlIGF0IHRoZSBnaXZlbiBwYXRoLgogICAgIGlmICghQ2FjaGVGYWlsdXJlKQogICAgICAgU2VlbkZpbGVFbnRyaWVzLmVyYXNlKEZpbGVuYW1lKTsKQEAgLTMyMCwzNCArMjY2LDMyIEBACiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBpZiAoRmlsZURlc2NyaXB0b3IgIT0gLTEgJiYgIW9wZW5GaWxlKSB7Ci0gICAgY2xvc2UoRmlsZURlc2NyaXB0b3IpOwotICAgIEZpbGVEZXNjcmlwdG9yID0gLTE7Ci0gIH0KKyAgYXNzZXJ0KChvcGVuRmlsZSB8fCAhRikgJiYgInVuZGVzaXJlZCBvcGVuIGZpbGUiKTsKIAogICAvLyBJdCBleGlzdHMuICBTZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IG9wZW5lZCBhIGZpbGUgd2l0aCB0aGUgc2FtZSBpbm9kZS4KICAgLy8gVGhpcyBvY2N1cnMgd2hlbiBvbmUgZGlyIGlzIHN5bWxpbmtlZCB0byBhbm90aGVyLCBmb3IgZXhhbXBsZS4KLSAgRmlsZUVudHJ5ICZVRkUgPQotICAgICAgVW5pcXVlUmVhbEZpbGVzLmdldEZpbGUoRGF0YS5VbmlxdWVJRCwgRGF0YS5Jc05hbWVkUGlwZSwgRGF0YS5JblBDSCk7CisgIEZpbGVFbnRyeSAmVUZFID0gVW5pcXVlUmVhbEZpbGVzW0RhdGEuVW5pcXVlSURdOwogCiAgIE5hbWVkRmlsZUVudC5zZXRWYWx1ZSgmVUZFKTsKLSAgaWYgKFVGRS5nZXROYW1lKCkpIHsgLy8gQWxyZWFkeSBoYXZlIGFuIGVudHJ5IHdpdGggdGhpcyBpbm9kZSwgcmV0dXJuIGl0LgorICBpZiAoVUZFLmlzVmFsaWQoKSkgeyAvLyBBbHJlYWR5IGhhdmUgYW4gZW50cnkgd2l0aCB0aGlzIGlub2RlLCByZXR1cm4gaXQuCiAgICAgLy8gSWYgdGhlIHN0YXQgcHJvY2VzcyBvcGVuZWQgdGhlIGZpbGUsIGNsb3NlIGl0IHRvIGF2b2lkIGEgRkQgbGVhay4KLSAgICBpZiAoRmlsZURlc2NyaXB0b3IgIT0gLTEpCi0gICAgICBjbG9zZShGaWxlRGVzY3JpcHRvcik7CisgICAgaWYgKEYpCisgICAgICBkZWxldGUgRjsKIAogICAgIHJldHVybiAmVUZFOwogICB9CiAKLSAgLy8gT3RoZXJ3aXNlLCB3ZSBkb24ndCBoYXZlIHRoaXMgZGlyZWN0b3J5IHlldCwgYWRkIGl0LgotICAvLyBGSVhNRTogQ2hhbmdlIHRoZSBuYW1lIHRvIGJlIGEgY2hhciogdGhhdCBwb2ludHMgYmFjayB0byB0aGUKLSAgLy8gJ1NlZW5GaWxlRW50cmllcycga2V5LgotICBVRkUuTmFtZSAgICA9IEludGVybmRGaWxlTmFtZTsKKyAgLy8gT3RoZXJ3aXNlLCB3ZSBkb24ndCBoYXZlIHRoaXMgZmlsZSB5ZXQsIGFkZCBpdC4KKyAgVUZFLk5hbWUgICAgPSBEYXRhLk5hbWU7CiAgIFVGRS5TaXplID0gRGF0YS5TaXplOwogICBVRkUuTW9kVGltZSA9IERhdGEuTW9kVGltZTsKICAgVUZFLkRpciAgICAgPSBEaXJJbmZvOwogICBVRkUuVUlEICAgICA9IE5leHRGaWxlVUlEKys7Ci0gIFVGRS5GRCAgICAgID0gRmlsZURlc2NyaXB0b3I7CisgIFVGRS5VbmlxdWVJRCA9IERhdGEuVW5pcXVlSUQ7CisgIFVGRS5Jc05hbWVkUGlwZSA9IERhdGEuSXNOYW1lZFBpcGU7CisgIFVGRS5JblBDSCA9IERhdGEuSW5QQ0g7CisgIFVGRS5GaWxlLnJlc2V0KEYpOworICBVRkUuSXNWYWxpZCA9IHRydWU7CiAgIHJldHVybiAmVUZFOwogfQogCkBAIC0zODYsMjEgKzMzMCwyMyBAQAogICBpZiAoZ2V0U3RhdFZhbHVlKEludGVybmRGaWxlTmFtZSwgRGF0YSwgdHJ1ZSwgMCkgPT0gMCkgewogICAgIERhdGEuU2l6ZSA9IFNpemU7CiAgICAgRGF0YS5Nb2RUaW1lID0gTW9kaWZpY2F0aW9uVGltZTsKLSAgICBVRkUgPSAmVW5pcXVlUmVhbEZpbGVzLmdldEZpbGUoRGF0YS5VbmlxdWVJRCwgRGF0YS5Jc05hbWVkUGlwZSwgRGF0YS5JblBDSCk7CisgICAgVUZFID0gJlVuaXF1ZVJlYWxGaWxlc1tEYXRhLlVuaXF1ZUlEXTsKIAogICAgIE5hbWVkRmlsZUVudC5zZXRWYWx1ZShVRkUpOwogCiAgICAgLy8gSWYgd2UgaGFkIGFscmVhZHkgb3BlbmVkIHRoaXMgZmlsZSwgY2xvc2UgaXQgbm93IHNvIHdlIGRvbid0CiAgICAgLy8gbGVhayB0aGUgZGVzY3JpcHRvci4gV2UncmUgbm90IGdvaW5nIHRvIHVzZSB0aGUgZmlsZQogICAgIC8vIGRlc2NyaXB0b3IgYW55d2F5LCBzaW5jZSB0aGlzIGlzIGEgdmlydHVhbCBmaWxlLgotICAgIGlmIChVRkUtPkZEICE9IC0xKSB7Ci0gICAgICBjbG9zZShVRkUtPkZEKTsKLSAgICAgIFVGRS0+RkQgPSAtMTsKLSAgICB9CisgICAgaWYgKFVGRS0+RmlsZSkKKyAgICAgIFVGRS0+Y2xvc2VGaWxlKCk7CiAKICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYW4gZW50cnkgd2l0aCB0aGlzIGlub2RlLCByZXR1cm4gaXQuCi0gICAgaWYgKFVGRS0+Z2V0TmFtZSgpKQorICAgIGlmIChVRkUtPmlzVmFsaWQoKSkKICAgICAgIHJldHVybiBVRkU7CisKKyAgICBVRkUtPlVuaXF1ZUlEID0gRGF0YS5VbmlxdWVJRDsKKyAgICBVRkUtPklzTmFtZWRQaXBlID0gRGF0YS5Jc05hbWVkUGlwZTsKKyAgICBVRkUtPkluUENIID0gRGF0YS5JblBDSDsKICAgfQogCiAgIGlmICghVUZFKSB7CkBAIC00MTQsNyArMzYwLDcgQEAKICAgVUZFLT5Nb2RUaW1lID0gTW9kaWZpY2F0aW9uVGltZTsKICAgVUZFLT5EaXIgICAgID0gRGlySW5mbzsKICAgVUZFLT5VSUQgICAgID0gTmV4dEZpbGVVSUQrKzsKLSAgVUZFLT5GRCAgICAgID0gLTE7CisgIFVGRS0+RmlsZS5yZXNldCgpOwogICByZXR1cm4gVUZFOwogfQogCkBAIC00MzMsNyArMzc5LDcgQEAKIGxsdm06Ok1lbW9yeUJ1ZmZlciAqRmlsZU1hbmFnZXI6OgogZ2V0QnVmZmVyRm9yRmlsZShjb25zdCBGaWxlRW50cnkgKkVudHJ5LCBzdGQ6OnN0cmluZyAqRXJyb3JTdHIsCiAgICAgICAgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSkgewotICBPd25pbmdQdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBSZXN1bHQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IFJlc3VsdDsKICAgbGx2bTo6ZXJyb3JfY29kZSBlYzsKIAogICB1aW50NjRfdCBGaWxlU2l6ZSA9IEVudHJ5LT5nZXRTaXplKCk7CkBAIC00NDQsNTAgKzM5MCw0OCBAQAogCiAgIGNvbnN0IGNoYXIgKkZpbGVuYW1lID0gRW50cnktPmdldE5hbWUoKTsKICAgLy8gSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSBvcGVuLCB1c2UgdGhlIG9wZW4gZmlsZSBkZXNjcmlwdG9yLgotICBpZiAoRW50cnktPkZEICE9IC0xKSB7Ci0gICAgZWMgPSBsbHZtOjpNZW1vcnlCdWZmZXI6OmdldE9wZW5GaWxlKEVudHJ5LT5GRCwgRmlsZW5hbWUsIFJlc3VsdCwgRmlsZVNpemUpOworICBpZiAoRW50cnktPkZpbGUpIHsKKyAgICBlYyA9IEVudHJ5LT5GaWxlLT5nZXRCdWZmZXIoRmlsZW5hbWUsIFJlc3VsdCwgRmlsZVNpemUpOwogICAgIGlmIChFcnJvclN0cikKICAgICAgICpFcnJvclN0ciA9IGVjLm1lc3NhZ2UoKTsKLQotICAgIGNsb3NlKEVudHJ5LT5GRCk7Ci0gICAgRW50cnktPkZEID0gLTE7Ci0gICAgcmV0dXJuIFJlc3VsdC50YWtlKCk7CisgICAgRW50cnktPmNsb3NlRmlsZSgpOworICAgIHJldHVybiBSZXN1bHQucmVsZWFzZSgpOwogICB9CiAKICAgLy8gT3RoZXJ3aXNlLCBvcGVuIHRoZSBmaWxlLgogCiAgIGlmIChGaWxlU3lzdGVtT3B0cy5Xb3JraW5nRGlyLmVtcHR5KCkpIHsKLSAgICBlYyA9IGxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZShGaWxlbmFtZSwgUmVzdWx0LCBGaWxlU2l6ZSk7CisgICAgZWMgPSBGUy0+Z2V0QnVmZmVyRm9yRmlsZShGaWxlbmFtZSwgUmVzdWx0LCBGaWxlU2l6ZSk7CiAgICAgaWYgKGVjICYmIEVycm9yU3RyKQogICAgICAgKkVycm9yU3RyID0gZWMubWVzc2FnZSgpOwotICAgIHJldHVybiBSZXN1bHQudGFrZSgpOworICAgIHJldHVybiBSZXN1bHQucmVsZWFzZSgpOwogICB9CiAKICAgU21hbGxTdHJpbmc8MTI4PiBGaWxlUGF0aChFbnRyeS0+Z2V0TmFtZSgpKTsKICAgRml4dXBSZWxhdGl2ZVBhdGgoRmlsZVBhdGgpOwotICBlYyA9IGxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZShGaWxlUGF0aC5zdHIoKSwgUmVzdWx0LCBGaWxlU2l6ZSk7CisgIGVjID0gRlMtPmdldEJ1ZmZlckZvckZpbGUoRmlsZVBhdGguc3RyKCksIFJlc3VsdCwgRmlsZVNpemUpOwogICBpZiAoZWMgJiYgRXJyb3JTdHIpCiAgICAgKkVycm9yU3RyID0gZWMubWVzc2FnZSgpOwotICByZXR1cm4gUmVzdWx0LnRha2UoKTsKKyAgcmV0dXJuIFJlc3VsdC5yZWxlYXNlKCk7CiB9CiAKIGxsdm06Ok1lbW9yeUJ1ZmZlciAqRmlsZU1hbmFnZXI6OgogZ2V0QnVmZmVyRm9yRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsIHN0ZDo6c3RyaW5nICpFcnJvclN0cikgewotICBPd25pbmdQdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBSZXN1bHQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IFJlc3VsdDsKICAgbGx2bTo6ZXJyb3JfY29kZSBlYzsKICAgaWYgKEZpbGVTeXN0ZW1PcHRzLldvcmtpbmdEaXIuZW1wdHkoKSkgewotICAgIGVjID0gbGx2bTo6TWVtb3J5QnVmZmVyOjpnZXRGaWxlKEZpbGVuYW1lLCBSZXN1bHQpOworICAgIGVjID0gRlMtPmdldEJ1ZmZlckZvckZpbGUoRmlsZW5hbWUsIFJlc3VsdCk7CiAgICAgaWYgKGVjICYmIEVycm9yU3RyKQogICAgICAgKkVycm9yU3RyID0gZWMubWVzc2FnZSgpOwotICAgIHJldHVybiBSZXN1bHQudGFrZSgpOworICAgIHJldHVybiBSZXN1bHQucmVsZWFzZSgpOwogICB9CiAKICAgU21hbGxTdHJpbmc8MTI4PiBGaWxlUGF0aChGaWxlbmFtZSk7CiAgIEZpeHVwUmVsYXRpdmVQYXRoKEZpbGVQYXRoKTsKLSAgZWMgPSBsbHZtOjpNZW1vcnlCdWZmZXI6OmdldEZpbGUoRmlsZVBhdGguY19zdHIoKSwgUmVzdWx0KTsKKyAgZWMgPSBGUy0+Z2V0QnVmZmVyRm9yRmlsZShGaWxlUGF0aC5jX3N0cigpLCBSZXN1bHQpOwogICBpZiAoZWMgJiYgRXJyb3JTdHIpCiAgICAgKkVycm9yU3RyID0gZWMubWVzc2FnZSgpOwotICByZXR1cm4gUmVzdWx0LnRha2UoKTsKKyAgcmV0dXJuIFJlc3VsdC5yZWxlYXNlKCk7CiB9CiAKIC8vLyBnZXRTdGF0VmFsdWUgLSBHZXQgdGhlICdzdGF0JyBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwYXRoLApAQCAtNDk2LDI2ICs0NDAsMjkgQEAKIC8vLyBmYWxzZSBpZiBpdCdzIGFuIGV4aXN0ZW50IHJlYWwgZmlsZS4gIElmIEZpbGVEZXNjcmlwdG9yIGlzIE5VTEwsCiAvLy8gZG8gZGlyZWN0b3J5IGxvb2stdXAgaW5zdGVhZCBvZiBmaWxlIGxvb2stdXAuCiBib29sIEZpbGVNYW5hZ2VyOjpnZXRTdGF0VmFsdWUoY29uc3QgY2hhciAqUGF0aCwgRmlsZURhdGEgJkRhdGEsIGJvb2wgaXNGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqRmlsZURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZnM6OkZpbGUgKipGKSB7CiAgIC8vIEZJWE1FOiBGaWxlU3lzdGVtT3B0cyBzaG91bGRuJ3QgYmUgcGFzc2VkIGluIGhlcmUsIGFsbCBwYXRocyBzaG91bGQgYmUKICAgLy8gYWJzb2x1dGUhCiAgIGlmIChGaWxlU3lzdGVtT3B0cy5Xb3JraW5nRGlyLmVtcHR5KCkpCi0gICAgcmV0dXJuIEZpbGVTeXN0ZW1TdGF0Q2FjaGU6OmdldChQYXRoLCBEYXRhLCBpc0ZpbGUsIEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdENhY2hlLmdldCgpKTsKKyAgICByZXR1cm4gRmlsZVN5c3RlbVN0YXRDYWNoZTo6Z2V0KFBhdGgsIERhdGEsIGlzRmlsZSwgRixTdGF0Q2FjaGUuZ2V0KCksICpGUyk7CiAKICAgU21hbGxTdHJpbmc8MTI4PiBGaWxlUGF0aChQYXRoKTsKICAgRml4dXBSZWxhdGl2ZVBhdGgoRmlsZVBhdGgpOwogCi0gIHJldHVybiBGaWxlU3lzdGVtU3RhdENhY2hlOjpnZXQoRmlsZVBhdGguY19zdHIoKSwgRGF0YSwgaXNGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yLCBTdGF0Q2FjaGUuZ2V0KCkpOworICByZXR1cm4gRmlsZVN5c3RlbVN0YXRDYWNoZTo6Z2V0KEZpbGVQYXRoLmNfc3RyKCksIERhdGEsIGlzRmlsZSwgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0Q2FjaGUuZ2V0KCksICpGUyk7CiB9CiAKIGJvb2wgRmlsZU1hbmFnZXI6OmdldE5vbmNhY2hlZFN0YXRWYWx1ZShTdHJpbmdSZWYgUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpzeXM6OmZzOjpmaWxlX3N0YXR1cyAmUmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmZzOjpTdGF0dXMgJlJlc3VsdCkgewogICBTbWFsbFN0cmluZzwxMjg+IEZpbGVQYXRoKFBhdGgpOwogICBGaXh1cFJlbGF0aXZlUGF0aChGaWxlUGF0aCk7CiAKLSAgcmV0dXJuIGxsdm06OnN5czo6ZnM6OnN0YXR1cyhGaWxlUGF0aC5jX3N0cigpLCBSZXN1bHQpOworICBsbHZtOjpFcnJvck9yPHZmczo6U3RhdHVzPiBTID0gRlMtPnN0YXR1cyhGaWxlUGF0aC5jX3N0cigpKTsKKyAgaWYgKCFTKQorICAgIHJldHVybiB0cnVlOworICBSZXN1bHQgPSAqUzsKKyAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIEZpbGVNYW5hZ2VyOjppbnZhbGlkYXRlQ2FjaGUoY29uc3QgRmlsZUVudHJ5ICpFbnRyeSkgewpAQCAtNTI2LDcgKzQ3Myw3IEBACiAgIC8vIEZpbGVFbnRyeSBpbnZhbGlkYXRpb24gc2hvdWxkIG5vdCBibG9jayBmdXR1cmUgb3B0aW1pemF0aW9ucyBpbiB0aGUgZmlsZQogICAvLyBjYWNoZXMuIFBvc3NpYmxlIGFsdGVybmF0aXZlcyBhcmUgY2FjaGUgdHJ1bmNhdGlvbiAoaW52YWxpZGF0ZSBsYXN0IE4pIG9yCiAgIC8vIGludmFsaWRhdGlvbiBvZiB0aGUgd2hvbGUgY2FjaGUuCi0gIFVuaXF1ZVJlYWxGaWxlcy5lcmFzZShFbnRyeSk7CisgIFVuaXF1ZVJlYWxGaWxlcy5lcmFzZShFbnRyeS0+Z2V0VW5pcXVlSUQoKSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGliL0Jhc2ljL0ZpbGVTeXN0ZW1TdGF0Q2FjaGUuY3BwIGIvbGliL0Jhc2ljL0ZpbGVTeXN0ZW1TdGF0Q2FjaGUuY3BwCmluZGV4IDdhMDFiZmYuLjlkODc5OTkgMTAwNjQ0Ci0tLSBhL2xpYi9CYXNpYy9GaWxlU3lzdGVtU3RhdENhY2hlLmNwcAorKysgYi9saWIvQmFzaWMvRmlsZVN5c3RlbVN0YXRDYWNoZS5jcHAKQEAgLTEyLDcgKzEyLDcgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9GaWxlU3lzdGVtU3RhdENhY2hlLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9WaXJ0dWFsRmlsZVN5c3RlbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCiAKIC8vIEZJWE1FOiBUaGlzIGlzIHRlcnJpYmxlLCB3ZSBuZWVkIHRoaXMgZm9yIDo6Y2xvc2UuCkBAIC0zMCwxMyArMzAsMTQgQEAKIAogdm9pZCBGaWxlU3lzdGVtU3RhdENhY2hlOjphbmNob3IoKSB7IH0KIAotc3RhdGljIHZvaWQgY29weVN0YXR1c1RvRmlsZURhdGEoY29uc3QgbGx2bTo6c3lzOjpmczo6ZmlsZV9zdGF0dXMgJlN0YXR1cywKK3N0YXRpYyB2b2lkIGNvcHlTdGF0dXNUb0ZpbGVEYXRhKGNvbnN0IHZmczo6U3RhdHVzICZTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGF0YSAmRGF0YSkgeworICBEYXRhLk5hbWUgPSBTdGF0dXMuZ2V0TmFtZSgpOwogICBEYXRhLlNpemUgPSBTdGF0dXMuZ2V0U2l6ZSgpOwogICBEYXRhLk1vZFRpbWUgPSBTdGF0dXMuZ2V0TGFzdE1vZGlmaWNhdGlvblRpbWUoKS50b0Vwb2NoVGltZSgpOwogICBEYXRhLlVuaXF1ZUlEID0gU3RhdHVzLmdldFVuaXF1ZUlEKCk7Ci0gIERhdGEuSXNEaXJlY3RvcnkgPSBpc19kaXJlY3RvcnkoU3RhdHVzKTsKLSAgRGF0YS5Jc05hbWVkUGlwZSA9IFN0YXR1cy50eXBlKCkgPT0gbGx2bTo6c3lzOjpmczo6ZmlsZV90eXBlOjpmaWZvX2ZpbGU7CisgIERhdGEuSXNEaXJlY3RvcnkgPSBTdGF0dXMuaXNEaXJlY3RvcnkoKTsKKyAgRGF0YS5Jc05hbWVkUGlwZSA9IFN0YXR1cy5nZXRUeXBlKCkgPT0gbGx2bTo6c3lzOjpmczo6ZmlsZV90eXBlOjpmaWZvX2ZpbGU7CiAgIERhdGEuSW5QQ0ggPSBmYWxzZTsKIH0KIApAQCAtNTAsMjIgKzUxLDIzIEBACiAvLy8gaW1wbGVtZW50YXRpb24gY2FuIG9wdGlvbmFsbHkgZmlsbCBpbiBGaWxlRGVzY3JpcHRvciB3aXRoIGEgdmFsaWQKIC8vLyBkZXNjcmlwdG9yIGFuZCB0aGUgY2xpZW50IGd1YXJhbnRlZXMgdGhhdCBpdCB3aWxsIGNsb3NlIGl0LgogYm9vbCBGaWxlU3lzdGVtU3RhdENhY2hlOjpnZXQoY29uc3QgY2hhciAqUGF0aCwgRmlsZURhdGEgJkRhdGEsIGJvb2wgaXNGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpGaWxlRGVzY3JpcHRvciwgRmlsZVN5c3RlbVN0YXRDYWNoZSAqQ2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZmczo6RmlsZSAqKkYsIEZpbGVTeXN0ZW1TdGF0Q2FjaGUgKkNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmZzOjpGaWxlU3lzdGVtICZGUykgewogICBMb29rdXBSZXN1bHQgUjsKICAgYm9vbCBpc0ZvckRpciA9ICFpc0ZpbGU7CiAKICAgLy8gSWYgd2UgaGF2ZSBhIGNhY2hlLCB1c2UgaXQgdG8gcmVzb2x2ZSB0aGUgc3RhdCBxdWVyeS4KICAgaWYgKENhY2hlKQotICAgIFIgPSBDYWNoZS0+Z2V0U3RhdChQYXRoLCBEYXRhLCBpc0ZpbGUsIEZpbGVEZXNjcmlwdG9yKTsKLSAgZWxzZSBpZiAoaXNGb3JEaXIgfHwgIUZpbGVEZXNjcmlwdG9yKSB7CisgICAgUiA9IENhY2hlLT5nZXRTdGF0KFBhdGgsIERhdGEsIGlzRmlsZSwgRiwgRlMpOworICBlbHNlIGlmIChpc0ZvckRpciB8fCAhRikgewogICAgIC8vIElmIHRoaXMgaXMgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90IG5lZWRlZCBhbmQgd2UgaGF2ZQogICAgIC8vIG5vIGNhY2hlLCBqdXN0IGdvIHRvIHRoZSBmaWxlIHN5c3RlbS4KLSAgICBsbHZtOjpzeXM6OmZzOjpmaWxlX3N0YXR1cyBTdGF0dXM7Ci0gICAgaWYgKGxsdm06OnN5czo6ZnM6OnN0YXR1cyhQYXRoLCBTdGF0dXMpKSB7CisgICAgbGx2bTo6RXJyb3JPcjx2ZnM6OlN0YXR1cz4gU3RhdHVzID0gRlMuc3RhdHVzKFBhdGgpOworICAgIGlmICghU3RhdHVzKSB7CiAgICAgICBSID0gQ2FjaGVNaXNzaW5nOwogICAgIH0gZWxzZSB7CiAgICAgICBSID0gQ2FjaGVFeGlzdHM7Ci0gICAgICBjb3B5U3RhdHVzVG9GaWxlRGF0YShTdGF0dXMsIERhdGEpOworICAgICAgY29weVN0YXR1c1RvRmlsZURhdGEoKlN0YXR1cywgRGF0YSk7CiAgICAgfQogICB9IGVsc2UgewogICAgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBnbyB0byB0aGUgZmlsZXN5c3RlbS4gIFdlIGNhbiBhbHdheXMganVzdCB1c2UKQEAgLTc1LDcgKzc3LDggQEAKICAgICAvLwogICAgIC8vIEJlY2F1c2Ugb2YgdGhpcywgY2hlY2sgdG8gc2VlIGlmIHRoZSBmaWxlIGV4aXN0cyB3aXRoICdvcGVuJy4gIElmIHRoZQogICAgIC8vIG9wZW4gc3VjY2VlZHMsIHVzZSBmc3RhdCB0byBnZXQgdGhlIHN0YXQgaW5mby4KLSAgICBsbHZtOjplcnJvcl9jb2RlIEVDID0gbGx2bTo6c3lzOjpmczo6b3BlbkZpbGVGb3JSZWFkKFBhdGgsICpGaWxlRGVzY3JpcHRvcik7CisgICAgc3RkOjp1bmlxdWVfcHRyPHZmczo6RmlsZT4gT3duZWRGaWxlOworICAgIGxsdm06OmVycm9yX2NvZGUgRUMgPSBGUy5vcGVuRmlsZUZvclJlYWQoUGF0aCwgT3duZWRGaWxlKTsKIAogICAgIGlmIChFQykgewogICAgICAgLy8gSWYgdGhlIG9wZW4gZmFpbHMsIG91ciAic3RhdCIgZmFpbHMuCkBAIC04NCwxNiArODcsMTYgQEAKICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIG9wZW4gc3VjY2VlZGVkLiAgRG8gYW4gZnN0YXQgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbgogICAgICAgLy8gYWJvdXQgdGhlIGZpbGUuICBXZSdsbCBlbmQgdXAgcmV0dXJuaW5nIHRoZSBvcGVuIGZpbGUgZGVzY3JpcHRvciB0byB0aGUKICAgICAgIC8vIGNsaWVudCB0byBkbyB3aGF0IHRoZXkgcGxlYXNlIHdpdGggaXQuCi0gICAgICBsbHZtOjpzeXM6OmZzOjpmaWxlX3N0YXR1cyBTdGF0dXM7Ci0gICAgICBpZiAoIWxsdm06OnN5czo6ZnM6OnN0YXR1cygqRmlsZURlc2NyaXB0b3IsIFN0YXR1cykpIHsKKyAgICAgIGxsdm06OkVycm9yT3I8dmZzOjpTdGF0dXM+IFN0YXR1cyA9IE93bmVkRmlsZS0+c3RhdHVzKCk7CisgICAgICBpZiAoU3RhdHVzKSB7CiAgICAgICAgIFIgPSBDYWNoZUV4aXN0czsKLSAgICAgICAgY29weVN0YXR1c1RvRmlsZURhdGEoU3RhdHVzLCBEYXRhKTsKKyAgICAgICAgY29weVN0YXR1c1RvRmlsZURhdGEoKlN0YXR1cywgRGF0YSk7CisgICAgICAgICpGID0gT3duZWRGaWxlLnJlbGVhc2UoKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGZzdGF0IHJhcmVseSBmYWlscy4gIElmIGl0IGRvZXMsIGNsYWltIHRoZSBpbml0aWFsIG9wZW4gZGlkbid0CiAgICAgICAgIC8vIHN1Y2NlZWQuCiAgICAgICAgIFIgPSBDYWNoZU1pc3Npbmc7Ci0gICAgICAgIDo6Y2xvc2UoKkZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICAgKkZpbGVEZXNjcmlwdG9yID0gLTE7CisgICAgICAgICpGID0gMDsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTEwNSw5ICsxMDgsOSBAQAogICAvLyBkZW1hbmRzLgogICBpZiAoRGF0YS5Jc0RpcmVjdG9yeSAhPSBpc0ZvckRpcikgewogICAgIC8vIElmIG5vdCwgY2xvc2UgdGhlIGZpbGUgaWYgb3BlbmVkLgotICAgIGlmIChGaWxlRGVzY3JpcHRvciAmJiAqRmlsZURlc2NyaXB0b3IgIT0gLTEpIHsKLSAgICAgIDo6Y2xvc2UoKkZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICpGaWxlRGVzY3JpcHRvciA9IC0xOworICAgIGlmIChGICYmICpGKSB7CisgICAgICAoKkYpLT5jbG9zZSgpOworICAgICAgKkYgPSAwOwogICAgIH0KICAgICAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTExOCw4ICsxMjEsOCBAQAogCiBNZW1vcml6ZVN0YXRDYWxsczo6TG9va3VwUmVzdWx0CiBNZW1vcml6ZVN0YXRDYWxsczo6Z2V0U3RhdChjb25zdCBjaGFyICpQYXRoLCBGaWxlRGF0YSAmRGF0YSwgYm9vbCBpc0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKkZpbGVEZXNjcmlwdG9yKSB7Ci0gIExvb2t1cFJlc3VsdCBSZXN1bHQgPSBzdGF0Q2hhaW5lZChQYXRoLCBEYXRhLCBpc0ZpbGUsIEZpbGVEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZmczo6RmlsZSAqKkYsIHZmczo6RmlsZVN5c3RlbSAmRlMpIHsKKyAgTG9va3VwUmVzdWx0IFJlc3VsdCA9IHN0YXRDaGFpbmVkKFBhdGgsIERhdGEsIGlzRmlsZSwgRiwgRlMpOwogCiAgIC8vIERvIG5vdCBjYWNoZSBmYWlsZWQgc3RhdHMsIGl0IGlzIGVhc3kgdG8gY29uc3RydWN0IGNvbW1vbiBpbmNvbnNpc3RlbnQKICAgLy8gc2l0dWF0aW9ucyBpZiB3ZSBkbywgYW5kIHRoZXkgYXJlIG5vdCBpbXBvcnRhbnQgZm9yIFBDSCBwZXJmb3JtYW5jZSAod2hpY2gKZGlmZiAtLWdpdCBhL2xpYi9CYXNpYy9JZGVudGlmaWVyVGFibGUuY3BwIGIvbGliL0Jhc2ljL0lkZW50aWZpZXJUYWJsZS5jcHAKaW5kZXggNTAwZTczMi4uM2I4YWVlYyAxMDA2NDQKLS0tIGEvbGliL0Jhc2ljL0lkZW50aWZpZXJUYWJsZS5jcHAKKysrIGIvbGliL0Jhc2ljL0lkZW50aWZpZXJUYWJsZS5jcHAKQEAgLTEzLDggKzEzLDggQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKLSNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0NoYXJJbmZvLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgpAQCAtNjAsNyArNjAsNyBAQAogICBjbGFzcyBFbXB0eUxvb2t1cEl0ZXJhdG9yIDogcHVibGljIElkZW50aWZpZXJJdGVyYXRvcgogICB7CiAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIFN0cmluZ1JlZiBOZXh0KCkgeyByZXR1cm4gU3RyaW5nUmVmKCk7IH0KKyAgICBTdHJpbmdSZWYgTmV4dCgpIG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZ1JlZigpOyB9CiAgIH07CiB9CiAKQEAgLTEwNSw2ICsxMDUsNyBAQAogICAgIEtFWUFSQyA9IDB4ODAwLAogICAgIEtFWU5PTVMgPSAweDAxMDAwLAogICAgIFdDSEFSU1VQUE9SVCA9IDB4MDIwMDAsCisgICAgSEFMRlNVUFBPUlQgPSAweDA0MDAwLAogICAgIEtFWUFMTCA9ICgweGZmZmYgJiB+S0VZTk9NUykgLy8gQmVjYXVzZSBLRVlOT01TIGlzIHVzZWQgdG8gZXhjbHVkZS4KICAgfTsKIH0KQEAgLTEyOSw2ICsxMzAsNyBAQAogICBlbHNlIGlmIChMYW5nT3B0cy5NaWNyb3NvZnRFeHQgJiYgKEZsYWdzICYgS0VZTVMpKSBBZGRSZXN1bHQgPSAxOwogICBlbHNlIGlmIChMYW5nT3B0cy5Cb3JsYW5kICYmIChGbGFncyAmIEtFWUJPUkxBTkQpKSBBZGRSZXN1bHQgPSAxOwogICBlbHNlIGlmIChMYW5nT3B0cy5Cb29sICYmIChGbGFncyAmIEJPT0xTVVBQT1JUKSkgQWRkUmVzdWx0ID0gMjsKKyAgZWxzZSBpZiAoTGFuZ09wdHMuSGFsZiAmJiAoRmxhZ3MgJiBIQUxGU1VQUE9SVCkpIEFkZFJlc3VsdCA9IDI7CiAgIGVsc2UgaWYgKExhbmdPcHRzLldDaGFyICYmIChGbGFncyAmIFdDSEFSU1VQUE9SVCkpIEFkZFJlc3VsdCA9IDI7CiAgIGVsc2UgaWYgKExhbmdPcHRzLkFsdGlWZWMgJiYgKEZsYWdzICYgS0VZQUxUSVZFQykpIEFkZFJlc3VsdCA9IDI7CiAgIGVsc2UgaWYgKExhbmdPcHRzLk9wZW5DTCAmJiAoRmxhZ3MgJiBLRVlPUEVOQ0wpKSBBZGRSZXN1bHQgPSAyOwpAQCAtMTM5LDggKzE0MSw4IEBACiAgIGVsc2UgaWYgKExhbmdPcHRzLk9iakMyICYmIChGbGFncyAmIEtFWUFSQykpIEFkZFJlc3VsdCA9IDI7CiAgIGVsc2UgaWYgKExhbmdPcHRzLkNQbHVzUGx1cyAmJiAoRmxhZ3MgJiBLRVlDWFgxMSkpIEFkZFJlc3VsdCA9IDM7CiAKLSAgLy8gRG9uJ3QgYWRkIHRoaXMga2V5d29yZCB1bmRlciBNaWNyb3NvZnRNb2RlLgotICBpZiAoTGFuZ09wdHMuTWljcm9zb2Z0TW9kZSAmJiAoRmxhZ3MgJiBLRVlOT01TKSkKKyAgLy8gRG9uJ3QgYWRkIHRoaXMga2V5d29yZCB1bmRlciBNU1ZDQ29tcGF0LgorICBpZiAoTGFuZ09wdHMuTVNWQ0NvbXBhdCAmJiAoRmxhZ3MgJiBLRVlOT01TKSkKICAgICAgcmV0dXJuOwogICAvLyBEb24ndCBhZGQgdGhpcyBrZXl3b3JkIGlmIGRpc2FibGVkIGluIHRoaXMgbGFuZ3VhZ2UuCiAgIGlmIChBZGRSZXN1bHQgPT0gMCkgcmV0dXJuOwpAQCAtMzk4LDYgKzQwMCwxMCBAQAogICByZXR1cm4gZ2V0TXVsdGlLZXl3b3JkU2VsZWN0b3IoKS0+Z2V0TmFtZSgpOwogfQogCit2b2lkIFNlbGVjdG9yOjpwcmludChsbHZtOjpyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgT1MgPDwgZ2V0QXNTdHJpbmcoKTsKK30KKwogLy8vIEludGVycHJldGluZyB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIHRoZSBub3JtYWwgQ2FtZWxDYXNlCiAvLy8gY29udmVudGlvbnMsIGRldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBzdHJpbmcgc3RhcnRzIHdpdGggdGhlCiAvLy8gZ2l2ZW4gIndvcmQiLCB3aGljaCBpcyBhc3N1bWVkIHRvIGVuZCBpbiBhIGxvd2VyY2FzZSBsZXR0ZXIuCmRpZmYgLS1naXQgYS9saWIvQmFzaWMvTW9kdWxlLmNwcCBiL2xpYi9CYXNpYy9Nb2R1bGUuY3BwCmluZGV4IGQwOGNlZjEuLjIzN2M3ODkgMTAwNjQ0Ci0tLSBhL2xpYi9CYXNpYy9Nb2R1bGUuY3BwCisrKyBiL2xpYi9CYXNpYy9Nb2R1bGUuY3BwCkBAIC0yNCwyMCArMjQsMjEgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogCi1Nb2R1bGU6Ok1vZHVsZShTdHJpbmdSZWYgTmFtZSwgU291cmNlTG9jYXRpb24gRGVmaW5pdGlvbkxvYywgTW9kdWxlICpQYXJlbnQsIAorTW9kdWxlOjpNb2R1bGUoU3RyaW5nUmVmIE5hbWUsIFNvdXJjZUxvY2F0aW9uIERlZmluaXRpb25Mb2MsIE1vZHVsZSAqUGFyZW50LAogICAgICAgICAgICAgICAgYm9vbCBJc0ZyYW1ld29yaywgYm9vbCBJc0V4cGxpY2l0KQogICA6IE5hbWUoTmFtZSksIERlZmluaXRpb25Mb2MoRGVmaW5pdGlvbkxvYyksIFBhcmVudChQYXJlbnQpLAogICAgIFVtYnJlbGxhKCksIEFTVEZpbGUoMCksIElzQXZhaWxhYmxlKHRydWUpLCBJc0Zyb21Nb2R1bGVGaWxlKGZhbHNlKSwKICAgICBJc0ZyYW1ld29yayhJc0ZyYW1ld29yayksIElzRXhwbGljaXQoSXNFeHBsaWNpdCksIElzU3lzdGVtKGZhbHNlKSwKLSAgICBJbmZlclN1Ym1vZHVsZXMoZmFsc2UpLCBJbmZlckV4cGxpY2l0U3VibW9kdWxlcyhmYWxzZSksIAorICAgIElzRXh0ZXJuQyhmYWxzZSksIEluZmVyU3VibW9kdWxlcyhmYWxzZSksIEluZmVyRXhwbGljaXRTdWJtb2R1bGVzKGZhbHNlKSwKICAgICBJbmZlckV4cG9ydFdpbGRjYXJkKGZhbHNlKSwgQ29uZmlnTWFjcm9zRXhoYXVzdGl2ZShmYWxzZSksCi0gICAgTmFtZVZpc2liaWxpdHkoSGlkZGVuKQoteyAKKyAgICBOYW1lVmlzaWJpbGl0eShIaWRkZW4pIHsKICAgaWYgKFBhcmVudCkgewogICAgIGlmICghUGFyZW50LT5pc0F2YWlsYWJsZSgpKQogICAgICAgSXNBdmFpbGFibGUgPSBmYWxzZTsKICAgICBpZiAoUGFyZW50LT5Jc1N5c3RlbSkKICAgICAgIElzU3lzdGVtID0gdHJ1ZTsKKyAgICBpZiAoUGFyZW50LT5Jc0V4dGVybkMpCisgICAgICBJc0V4dGVybkMgPSB0cnVlOwogICAgIAogICAgIFBhcmVudC0+U3ViTW9kdWxlSW5kZXhbTmFtZV0gPSBQYXJlbnQtPlN1Yk1vZHVsZXMuc2l6ZSgpOwogICAgIFBhcmVudC0+U3ViTW9kdWxlcy5wdXNoX2JhY2sodGhpcyk7CkBAIC02OSwxMSArNzAsMTUgQEAKIAogYm9vbAogTW9kdWxlOjppc0F2YWlsYWJsZShjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsIGNvbnN0IFRhcmdldEluZm8gJlRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgUmVxdWlyZW1lbnQgJlJlcSkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICBSZXF1aXJlbWVudCAmUmVxLCBIZWFkZXJEaXJlY3RpdmUgJk1pc3NpbmdIZWFkZXIpIGNvbnN0IHsKICAgaWYgKElzQXZhaWxhYmxlKQogICAgIHJldHVybiB0cnVlOwogCiAgIGZvciAoY29uc3QgTW9kdWxlICpDdXJyZW50ID0gdGhpczsgQ3VycmVudDsgQ3VycmVudCA9IEN1cnJlbnQtPlBhcmVudCkgeworICAgIGlmICghQ3VycmVudC0+TWlzc2luZ0hlYWRlcnMuZW1wdHkoKSkgeworICAgICAgTWlzc2luZ0hlYWRlciA9IEN1cnJlbnQtPk1pc3NpbmdIZWFkZXJzLmZyb250KCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBDdXJyZW50LT5SZXF1aXJlbWVudHMuc2l6ZSgpOyBJICE9IE47ICsrSSkgewogICAgICAgaWYgKGhhc0ZlYXR1cmUoQ3VycmVudC0+UmVxdWlyZW1lbnRzW0ldLmZpcnN0LCBMYW5nT3B0cywgVGFyZ2V0KSAhPQogICAgICAgICAgICAgICBDdXJyZW50LT5SZXF1aXJlbWVudHNbSV0uc2Vjb25kKSB7CmRpZmYgLS1naXQgYS9saWIvQmFzaWMvT3Blbk1QS2luZHMuY3BwIGIvbGliL0Jhc2ljL09wZW5NUEtpbmRzLmNwcAppbmRleCAxMzUwOTM0Li5lYzA5ZGUxIDEwMDY0NAotLS0gYS9saWIvQmFzaWMvT3Blbk1QS2luZHMuY3BwCisrKyBiL2xpYi9CYXNpYy9PcGVuTVBLaW5kcy5jcHAKQEAgLTc3LDkgKzc3LDEzIEBACiAgICAgICAgICAgICAgLkRlZmF1bHQoT01QQ19ERUZBVUxUX3Vua25vd24pOwogICBjYXNlIE9NUENfdW5rbm93bjoKICAgY2FzZSBPTVBDX3RocmVhZHByaXZhdGU6CisgIGNhc2UgT01QQ19pZjoKKyAgY2FzZSBPTVBDX251bV90aHJlYWRzOgorICBjYXNlIE9NUENfc2FmZWxlbjoKICAgY2FzZSBPTVBDX3ByaXZhdGU6CiAgIGNhc2UgT01QQ19maXJzdHByaXZhdGU6CiAgIGNhc2UgT01QQ19zaGFyZWQ6CisgIGNhc2UgT01QQ19jb3B5aW46CiAgIGNhc2UgTlVNX09QRU5NUF9DTEFVU0VTOgogICAgIGJyZWFrOwogICB9CkBAIC0xMDAsOSArMTA0LDEzIEBACiAgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBPcGVuTVAgJ2RlZmF1bHQnIGNsYXVzZSB0eXBlIik7CiAgIGNhc2UgT01QQ191bmtub3duOgogICBjYXNlIE9NUENfdGhyZWFkcHJpdmF0ZToKKyAgY2FzZSBPTVBDX2lmOgorICBjYXNlIE9NUENfbnVtX3RocmVhZHM6CisgIGNhc2UgT01QQ19zYWZlbGVuOgogICBjYXNlIE9NUENfcHJpdmF0ZToKICAgY2FzZSBPTVBDX2ZpcnN0cHJpdmF0ZToKICAgY2FzZSBPTVBDX3NoYXJlZDoKKyAgY2FzZSBPTVBDX2NvcHlpbjoKICAgY2FzZSBOVU1fT1BFTk1QX0NMQVVTRVM6CiAgICAgYnJlYWs7CiAgIH0KQEAgLTEyMyw2ICsxMzEsMTUgQEAKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBicmVhazsKKyAgY2FzZSBPTVBEX3NpbWQ6CisgICAgc3dpdGNoIChDS2luZCkgeworI2RlZmluZSBPUEVOTVBfU0lNRF9DTEFVU0UoTmFtZSkgXAorICAgIGNhc2UgT01QQ18jI05hbWU6IHJldHVybiB0cnVlOworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOwogICBjYXNlIE9NUERfdW5rbm93bjoKICAgY2FzZSBPTVBEX3RocmVhZHByaXZhdGU6CiAgIGNhc2UgT01QRF90YXNrOgpkaWZmIC0tZ2l0IGEvbGliL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmNwcCBiL2xpYi9CYXNpYy9Tb3VyY2VMb2NhdGlvbi5jcHAKaW5kZXggMTgyMjA5MS4uMGMwNmE0OCAxMDA2NDQKLS0tIGEvbGliL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmNwcAorKysgYi9saWIvQmFzaWMvU291cmNlTG9jYXRpb24uY3BwCkBAIC02MSwxNCArNjEsMTUgQEAKICAgT1MgPDwgJz4nOwogfQogCi1zdGQ6OnN0cmluZyBTb3VyY2VMb2NhdGlvbjo6cHJpbnRUb1N0cmluZyhjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3QgeworTExWTV9EVU1QX01FVEhPRCBzdGQ6OnN0cmluZworU291cmNlTG9jYXRpb246OnByaW50VG9TdHJpbmcoY29uc3QgU291cmNlTWFuYWdlciAmU00pIGNvbnN0IHsKICAgc3RkOjpzdHJpbmcgUzsKICAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIE9TKFMpOwogICBwcmludChPUywgU00pOwogICByZXR1cm4gT1Muc3RyKCk7CiB9CiAKLXZvaWQgU291cmNlTG9jYXRpb246OmR1bXAoY29uc3QgU291cmNlTWFuYWdlciAmU00pIGNvbnN0IHsKK0xMVk1fRFVNUF9NRVRIT0Qgdm9pZCBTb3VyY2VMb2NhdGlvbjo6ZHVtcChjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3QgewogICBwcmludChsbHZtOjplcnJzKCksIFNNKTsKIH0KIApAQCAtMTIyLDcgKzEyMyw3IEBACiAgIHJldHVybiBTcmNNZ3ItPmlzQmVmb3JlSW5UcmFuc2xhdGlvblVuaXQoKnRoaXMsIExvYyk7CiB9CiAKLXZvaWQgRnVsbFNvdXJjZUxvYzo6ZHVtcCgpIGNvbnN0IHsKK0xMVk1fRFVNUF9NRVRIT0Qgdm9pZCBGdWxsU291cmNlTG9jOjpkdW1wKCkgY29uc3QgewogICBTb3VyY2VMb2NhdGlvbjo6ZHVtcCgqU3JjTWdyKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL0Jhc2ljL1NvdXJjZU1hbmFnZXIuY3BwIGIvbGliL0Jhc2ljL1NvdXJjZU1hbmFnZXIuY3BwCmluZGV4IDlkNzk1NTEuLmI3OGU5ZjUgMTAwNjQ0Ci0tLSBhL2xpYi9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmNwcAorKysgYi9saWIvQmFzaWMvU291cmNlTWFuYWdlci5jcHAKQEAgLTQwNCwxMCArNDA0LDcgQEAKICAgZGVsZXRlIEZha2VCdWZmZXJGb3JSZWNvdmVyeTsKICAgZGVsZXRlIEZha2VDb250ZW50Q2FjaGVGb3JSZWNvdmVyeTsKIAotICBmb3IgKGxsdm06OkRlbnNlTWFwPEZpbGVJRCwgTWFjcm9BcmdzTWFwICo+OjppdGVyYXRvcgotICAgICAgICAgSSA9IE1hY3JvQXJnc0NhY2hlTWFwLmJlZ2luKCksRSA9IE1hY3JvQXJnc0NhY2hlTWFwLmVuZCgpOyBJIT1FOyArK0kpIHsKLSAgICBkZWxldGUgSS0+c2Vjb25kOwotICB9CisgIGxsdm06OkRlbGV0ZUNvbnRhaW5lclNlY29uZHMoTWFjcm9BcmdzQ2FjaGVNYXApOwogfQogCiB2b2lkIFNvdXJjZU1hbmFnZXI6OmNsZWFySURUYWJsZXMoKSB7CkBAIC0xMzgxLDMxICsxMzc4LDYgQEAKICAgICB9CiAgIH0KIAotICAvLyBJZiB0aGUgc3ByZWFkIGlzIGxhcmdlLCBkbyBhICJyYWRpeCIgdGVzdCBhcyBvdXIgaW5pdGlhbCBndWVzcywgYmFzZWQgb24KLSAgLy8gdGhlIGFzc3VtcHRpb24gdGhhdCBsaW5lcyBhdmVyYWdlIHRvIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgbGVuZ3RoLgotICAvLyBOT1RFOiBUaGlzIGlzIGN1cnJlbnRseSBkaXNhYmxlZCwgYXMgaXQgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHByb2ZpdGFibGUgaW4KLSAgLy8gaW5pdGlhbCBtZWFzdXJlbWVudHMuCi0gIGlmICgwICYmIFNvdXJjZUxpbmVDYWNoZUVuZC1Tb3VyY2VMaW5lQ2FjaGUgPiAyMCkgewotICAgIHVuc2lnbmVkIEZpbGVMZW4gPSBDb250ZW50LT5Tb3VyY2VMaW5lQ2FjaGVbQ29udGVudC0+TnVtTGluZXMtMV07Ci0KLSAgICAvLyBUYWtlIGEgc3RhYiBhdCBndWVzc2luZyB3aGVyZSBpdCBpcy4KLSAgICB1bnNpZ25lZCBBcHByb3hQb3MgPSBDb250ZW50LT5OdW1MaW5lcypRdWVyaWVkRmlsZVBvcyAvIEZpbGVMZW47Ci0KLSAgICAvLyBDaGVjayBmb3IgLTEwIGFuZCArMTAgbGluZXMuCi0gICAgdW5zaWduZWQgTG93ZXJCb3VuZCA9IHN0ZDo6bWF4KGludChBcHByb3hQb3MtMTApLCAwKTsKLSAgICB1bnNpZ25lZCBVcHBlckJvdW5kID0gc3RkOjptaW4oQXBwcm94UG9zKzEwLCBGaWxlTGVuKTsKLQotICAgIC8vIElmIHRoZSBjb21wdXRlZCBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gdGhlIHF1ZXJ5IGxvY2F0aW9uLCBtb3ZlIGl0IGluLgotICAgIGlmIChTb3VyY2VMaW5lQ2FjaGUgPCBTb3VyY2VMaW5lQ2FjaGVTdGFydCtMb3dlckJvdW5kICYmCi0gICAgICAgIFNvdXJjZUxpbmVDYWNoZVN0YXJ0W0xvd2VyQm91bmRdIDwgUXVlcmllZEZpbGVQb3MpCi0gICAgICBTb3VyY2VMaW5lQ2FjaGUgPSBTb3VyY2VMaW5lQ2FjaGVTdGFydCtMb3dlckJvdW5kOwotCi0gICAgLy8gSWYgdGhlIGNvbXB1dGVkIHVwcGVyIGJvdW5kIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcXVlcnkgbG9jYXRpb24sIG1vdmUgaXQuCi0gICAgaWYgKFNvdXJjZUxpbmVDYWNoZUVuZCA+IFNvdXJjZUxpbmVDYWNoZVN0YXJ0K1VwcGVyQm91bmQgJiYKLSAgICAgICAgU291cmNlTGluZUNhY2hlU3RhcnRbVXBwZXJCb3VuZF0gPj0gUXVlcmllZEZpbGVQb3MpCi0gICAgICBTb3VyY2VMaW5lQ2FjaGVFbmQgPSBTb3VyY2VMaW5lQ2FjaGVTdGFydCtVcHBlckJvdW5kOwotICB9Ci0KICAgdW5zaWduZWQgKlBvcwogICAgID0gc3RkOjpsb3dlcl9ib3VuZChTb3VyY2VMaW5lQ2FjaGUsIFNvdXJjZUxpbmVDYWNoZUVuZCwgUXVlcmllZEZpbGVQb3MpOwogICB1bnNpZ25lZCBMaW5lTm8gPSBQb3MtU291cmNlTGluZUNhY2hlU3RhcnQ7CkBAIC0xNTgzLDcgKzE1NTUsNyBAQAogICByZXR1cm4gRkkuZ2V0SW5jbHVkZUxvYygpLmlzSW52YWxpZCgpOwogfQogCi0vLy8gXGJyaWVmIFRoZSBzaXplIG9mIHRoZSBTTG9jRW50eSB0aGF0IFxhcmcgRklEIHJlcHJlc2VudHMuCisvLy8gXGJyaWVmIFRoZSBzaXplIG9mIHRoZSBTTG9jRW50cnkgdGhhdCBccCBGSUQgcmVwcmVzZW50cy4KIHVuc2lnbmVkIFNvdXJjZU1hbmFnZXI6OmdldEZpbGVJRFNpemUoRmlsZUlEIEZJRCkgY29uc3QgewogICBib29sIEludmFsaWQgPSBmYWxzZTsKICAgY29uc3QgU3JjTWdyOjpTTG9jRW50cnkgJkVudHJ5ID0gZ2V0U0xvY0VudHJ5KEZJRCwgJkludmFsaWQpOwpAQCAtMTg5Myw3ICsxODY1LDcgQEAKIAogICAgIEZpbGVJRCBTcGVsbEZJRDsgLy8gQ3VycmVudCBGaWxlSUQgaW4gdGhlIHNwZWxsaW5nIHJhbmdlLgogICAgIHVuc2lnbmVkIFNwZWxsUmVsYXRpdmVPZmZzOwotICAgIGxsdm06OnRpZShTcGVsbEZJRCwgU3BlbGxSZWxhdGl2ZU9mZnMpID0gZ2V0RGVjb21wb3NlZExvYyhTcGVsbExvYyk7CisgICAgc3RkOjp0aWUoU3BlbGxGSUQsIFNwZWxsUmVsYXRpdmVPZmZzKSA9IGdldERlY29tcG9zZWRMb2MoU3BlbGxMb2MpOwogICAgIHdoaWxlICgxKSB7CiAgICAgICBjb25zdCBTTG9jRW50cnkgJkVudHJ5ID0gZ2V0U0xvY0VudHJ5KFNwZWxsRklEKTsKICAgICAgIHVuc2lnbmVkIFNwZWxsRklEQmVnaW5PZmZzID0gRW50cnkuZ2V0T2Zmc2V0KCk7CkBAIC0xOTcyLDcgKzE5NDQsNyBAQAogCiAgIEZpbGVJRCBGSUQ7CiAgIHVuc2lnbmVkIE9mZnNldDsKLSAgbGx2bTo6dGllKEZJRCwgT2Zmc2V0KSA9IGdldERlY29tcG9zZWRMb2MoTG9jKTsKKyAgc3RkOjp0aWUoRklELCBPZmZzZXQpID0gZ2V0RGVjb21wb3NlZExvYyhMb2MpOwogICBpZiAoRklELmlzSW52YWxpZCgpKQogICAgIHJldHVybiBMb2M7CiAKZGlmZiAtLWdpdCBhL2xpYi9CYXNpYy9UYXJnZXRJbmZvLmNwcCBiL2xpYi9CYXNpYy9UYXJnZXRJbmZvLmNwcAppbmRleCBlOTkzMDU1Li4wMWVjZWQyIDEwMDY0NAotLS0gYS9saWIvQmFzaWMvVGFyZ2V0SW5mby5jcHAKKysrIGIvbGliL0Jhc2ljL1RhcmdldEluZm8uY3BwCkBAIC02OSw4ICs2OSw3IEBACiAgIEZsb2F0Rm9ybWF0ID0gJmxsdm06OkFQRmxvYXQ6OklFRUVzaW5nbGU7CiAgIERvdWJsZUZvcm1hdCA9ICZsbHZtOjpBUEZsb2F0OjpJRUVFZG91YmxlOwogICBMb25nRG91YmxlRm9ybWF0ID0gJmxsdm06OkFQRmxvYXQ6OklFRUVkb3VibGU7Ci0gIERlc2NyaXB0aW9uU3RyaW5nID0gIkUtcDozMjozMjozMi1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItIgotICAgICAgICAgICAgICAgICAgICAgICJpNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC1uMzIiOworICBEZXNjcmlwdGlvblN0cmluZyA9IDA7CiAgIFVzZXJMYWJlbFByZWZpeCA9ICJfIjsKICAgTUNvdW50TmFtZSA9ICJtY291bnQiOwogICBSZWdQYXJtTWF4ID0gMDsKQEAgLTgzLDggKzgyLDEwIEBACiAgIC8vIERlZmF1bHQgdG8gbm90IHVzaW5nIGZwMnJldCBmb3IgX19Db21wbGV4IGxvbmcgZG91YmxlCiAgIENvbXBsZXhMb25nRG91YmxlVXNlc0ZQMlJldCA9IGZhbHNlOwogCi0gIC8vIERlZmF1bHQgdG8gdXNpbmcgdGhlIEl0YW5pdW0gQUJJLgotICBUaGVDWFhBQkkuc2V0KFRhcmdldENYWEFCSTo6R2VuZXJpY0l0YW5pdW0pOworICAvLyBTZXQgdGhlIEMrKyBBQkkgYmFzZWQgb24gdGhlIHRyaXBsZS4KKyAgVGhlQ1hYQUJJLnNldChUcmlwbGUuaXNLbm93bldpbmRvd3NNU1ZDRW52aXJvbm1lbnQoKQorICAgICAgICAgICAgICAgICAgICA/IFRhcmdldENYWEFCSTo6TWljcm9zb2Z0CisgICAgICAgICAgICAgICAgICAgIDogVGFyZ2V0Q1hYQUJJOjpHZW5lcmljSXRhbml1bSk7CiAKICAgLy8gRGVmYXVsdCB0byBhbiBlbXB0eSBhZGRyZXNzIHNwYWNlIG1hcC4KICAgQWRkclNwYWNlTWFwID0gJkRlZmF1bHRBZGRyU3BhY2VNYXA7CkBAIC0yNDUsNyArMjQ2LDE0IEBACiAgICAgTG9uZ0xvbmdXaWR0aCA9IExvbmdMb25nQWxpZ24gPSAxMjg7CiAgICAgSGFsZldpZHRoID0gSGFsZkFsaWduID0gMTY7CiAgICAgRmxvYXRXaWR0aCA9IEZsb2F0QWxpZ24gPSAzMjsKLSAgICBEb3VibGVXaWR0aCA9IERvdWJsZUFsaWduID0gNjQ7CisgICAgCisgICAgLy8gRW1iZWRkZWQgMzItYml0IHRhcmdldHMgKE9wZW5DTCBFUCkgbWlnaHQgaGF2ZSBkb3VibGUgQyB0eXBlIAorICAgIC8vIGRlZmluZWQgYXMgZmxvYXQuIExldCdzIG5vdCBvdmVycmlkZSB0aGlzIGFzIGl0IG1pZ2h0IGxlYWQgCisgICAgLy8gdG8gZ2VuZXJhdGluZyBpbGxlZ2FsIGNvZGUgdGhhdCB1c2VzIDY0Yml0IGRvdWJsZXMuCisgICAgaWYgKERvdWJsZVdpZHRoICE9IEZsb2F0V2lkdGgpIHsKKyAgICAgIERvdWJsZVdpZHRoID0gRG91YmxlQWxpZ24gPSA2NDsKKyAgICAgIERvdWJsZUZvcm1hdCA9ICZsbHZtOjpBUEZsb2F0OjpJRUVFZG91YmxlOworICAgIH0KICAgICBMb25nRG91YmxlV2lkdGggPSBMb25nRG91YmxlQWxpZ24gPSAxMjg7CiAKICAgICBhc3NlcnQoUG9pbnRlcldpZHRoID09IDMyIHx8IFBvaW50ZXJXaWR0aCA9PSA2NCk7CkBAIC0yNjAsNyArMjY4LDYgQEAKIAogICAgIEhhbGZGb3JtYXQgPSAmbGx2bTo6QVBGbG9hdDo6SUVFRWhhbGY7CiAgICAgRmxvYXRGb3JtYXQgPSAmbGx2bTo6QVBGbG9hdDo6SUVFRXNpbmdsZTsKLSAgICBEb3VibGVGb3JtYXQgPSAmbGx2bTo6QVBGbG9hdDo6SUVFRWRvdWJsZTsKICAgICBMb25nRG91YmxlRm9ybWF0ID0gJmxsdm06OkFQRmxvYXQ6OklFRUVxdWFkOwogICB9CiB9CkBAIC00ODMsNiArNDkwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RyYWludEluZm8gJkluZm8pIGNvbnN0IHsKICAgY29uc3QgY2hhciAqTmFtZSA9IEluZm8uQ29uc3RyYWludFN0ci5jX3N0cigpOwogCisgIGlmICghKk5hbWUpCisgICAgcmV0dXJuIGZhbHNlOworCiAgIHdoaWxlICgqTmFtZSkgewogICAgIHN3aXRjaCAoKk5hbWUpIHsKICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbGliL0Jhc2ljL1RhcmdldHMuY3BwIGIvbGliL0Jhc2ljL1RhcmdldHMuY3BwCmluZGV4IDhlNzYxMzAuLmZkNTljMDAgMTAwNjQ0Ci0tLSBhL2xpYi9CYXNpYy9UYXJnZXRzLmNwcAorKysgYi9saWIvQmFzaWMvVGFyZ2V0cy5jcHAKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRCdWlsdGlucy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1RhcmdldE9wdGlvbnMuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9BUEZsb2F0LmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgiCkBAIC0yOSw2ICsyOCw3IEBACiAjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb25NYWNoTy5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTc0LDggKzc0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0PTA7CiBwdWJsaWM6CiAgIE9TVGFyZ2V0SW5mbyhjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkgOiBUZ3RJbmZvKFRyaXBsZSkge30KLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBUZ3RJbmZvOjpnZXRUYXJnZXREZWZpbmVzKE9wdHMsIEJ1aWxkZXIpOwogICAgIGdldE9TRGVmaW5lcyhPcHRzLCBUZ3RJbmZvOjpnZXRUcmlwbGUoKSwgQnVpbGRlcik7CiAgIH0KQEAgLTkwLDcgKzkwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvblR1cGxlICZQbGF0Zm9ybU1pblZlcnNpb24pIHsKICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUFBMRV9DQ19fIiwgIjYwMDAiKTsKICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUFBMRV9fIik7Ci0gIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fTUFDSF9fIik7CiAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIk9CSkNfTkVXX1BST1BFUlRJRVMiKTsKICAgLy8gQWRkcmVzc1Nhbml0aXplciBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIHNvdXJjZSBmb3J0aWZpY2F0aW9uLCB3aGljaCBpcyBvbgogICAvLyBieSBkZWZhdWx0IG9uIERhcndpbi4KQEAgLTEzOCwzOSArMTM3LDM3IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgLy8gSWYgdGhlcmUncyBhbiBlbnZpcm9ubWVudCBzcGVjaWZpZWQgaW4gdGhlIHRyaXBsZSwgdGhhdCBtZWFucyB3ZSdyZSBkZWFsaW5nCi0gIC8vIHdpdGggYW4gZW1iZWRkZWQgdmFyaWFudCBvZiBzb21lIHNvcnQgYW5kIGRvbid0IHdhbnQgdGhlIHBsYXRmb3JtCi0gIC8vIHZlcnNpb24tbWluIGRlZmluZXMsIHNvIG9ubHkgYWRkIHRoZW0gaWYgdGhlcmUncyBub3Qgb25lLgotICBpZiAoVHJpcGxlLmdldEVudmlyb25tZW50TmFtZSgpLmVtcHR5KCkpIHsKLSAgICAvLyBTZXQgdGhlIGFwcHJvcHJpYXRlIE9TIHZlcnNpb24gZGVmaW5lLgotICAgIGlmIChUcmlwbGUuaXNpT1MoKSkgewotICAgICAgYXNzZXJ0KE1haiA8IDEwICYmIE1pbiA8IDEwMCAmJiBSZXYgPCAxMDAgJiYgIkludmFsaWQgdmVyc2lvbiEiKTsKLSAgICAgIGNoYXIgU3RyWzZdOwotICAgICAgU3RyWzBdID0gJzAnICsgTWFqOwotICAgICAgU3RyWzFdID0gJzAnICsgKE1pbiAvIDEwKTsKLSAgICAgIFN0clsyXSA9ICcwJyArIChNaW4gJSAxMCk7Ci0gICAgICBTdHJbM10gPSAnMCcgKyAoUmV2IC8gMTApOwotICAgICAgU3RyWzRdID0gJzAnICsgKFJldiAlIDEwKTsKLSAgICAgIFN0cls1XSA9ICdcMCc7Ci0gICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0VOVklST05NRU5UX0lQSE9ORV9PU19WRVJTSU9OX01JTl9SRVFVSVJFRF9fIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTm90ZSB0aGF0IHRoZSBEcml2ZXIgYWxsb3dzIHZlcnNpb25zIHdoaWNoIGFyZW4ndCByZXByZXNlbnRhYmxlIGluIHRoZQotICAgICAgLy8gZGVmaW5lIChiZWNhdXNlIHdlIG9ubHkgZ2V0IGEgc2luZ2xlIGRpZ2l0IGZvciB0aGUgbWlub3IgYW5kIG1pY3JvCi0gICAgICAvLyByZXZpc2lvbiBudW1iZXJzKS4gU28sIHdlIGxpbWl0IHRoZW0gdG8gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZQotICAgICAgLy8gdmVyc2lvbi4KLSAgICAgIGFzc2VydChUcmlwbGUuZ2V0RW52aXJvbm1lbnROYW1lKCkuZW1wdHkoKSAmJiAiSW52YWxpZCBlbnZpcm9ubWVudCEiKTsKLSAgICAgIGFzc2VydChNYWogPCAxMDAgJiYgTWluIDwgMTAwICYmIFJldiA8IDEwMCAmJiAiSW52YWxpZCB2ZXJzaW9uISIpOwotICAgICAgY2hhciBTdHJbNV07Ci0gICAgICBTdHJbMF0gPSAnMCcgKyAoTWFqIC8gMTApOwotICAgICAgU3RyWzFdID0gJzAnICsgKE1haiAlIDEwKTsKLSAgICAgIFN0clsyXSA9ICcwJyArIHN0ZDo6bWluKE1pbiwgOVUpOwotICAgICAgU3RyWzNdID0gJzAnICsgc3RkOjptaW4oUmV2LCA5VSk7Ci0gICAgICBTdHJbNF0gPSAnXDAnOwotICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19FTlZJUk9OTUVOVF9NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRF9fIiwgU3RyKTsKLSAgICB9CisgIC8vIFNldCB0aGUgYXBwcm9wcmlhdGUgT1MgdmVyc2lvbiBkZWZpbmUuCisgIGlmIChUcmlwbGUuaXNpT1MoKSkgeworICAgIGFzc2VydChNYWogPCAxMCAmJiBNaW4gPCAxMDAgJiYgUmV2IDwgMTAwICYmICJJbnZhbGlkIHZlcnNpb24hIik7CisgICAgY2hhciBTdHJbNl07CisgICAgU3RyWzBdID0gJzAnICsgTWFqOworICAgIFN0clsxXSA9ICcwJyArIChNaW4gLyAxMCk7CisgICAgU3RyWzJdID0gJzAnICsgKE1pbiAlIDEwKTsKKyAgICBTdHJbM10gPSAnMCcgKyAoUmV2IC8gMTApOworICAgIFN0cls0XSA9ICcwJyArIChSZXYgJSAxMCk7CisgICAgU3RyWzVdID0gJ1wwJzsKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0VOVklST05NRU5UX0lQSE9ORV9PU19WRVJTSU9OX01JTl9SRVFVSVJFRF9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cik7CisgIH0gZWxzZSBpZiAoVHJpcGxlLmlzTWFjT1NYKCkpIHsKKyAgICAvLyBOb3RlIHRoYXQgdGhlIERyaXZlciBhbGxvd3MgdmVyc2lvbnMgd2hpY2ggYXJlbid0IHJlcHJlc2VudGFibGUgaW4gdGhlCisgICAgLy8gZGVmaW5lIChiZWNhdXNlIHdlIG9ubHkgZ2V0IGEgc2luZ2xlIGRpZ2l0IGZvciB0aGUgbWlub3IgYW5kIG1pY3JvCisgICAgLy8gcmV2aXNpb24gbnVtYmVycykuIFNvLCB3ZSBsaW1pdCB0aGVtIHRvIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUKKyAgICAvLyB2ZXJzaW9uLgorICAgIGFzc2VydChNYWogPCAxMDAgJiYgTWluIDwgMTAwICYmIFJldiA8IDEwMCAmJiAiSW52YWxpZCB2ZXJzaW9uISIpOworICAgIGNoYXIgU3RyWzVdOworICAgIFN0clswXSA9ICcwJyArIChNYWogLyAxMCk7CisgICAgU3RyWzFdID0gJzAnICsgKE1haiAlIDEwKTsKKyAgICBTdHJbMl0gPSAnMCcgKyBzdGQ6Om1pbihNaW4sIDlVKTsKKyAgICBTdHJbM10gPSAnMCcgKyBzdGQ6Om1pbihSZXYsIDlVKTsKKyAgICBTdHJbNF0gPSAnXDAnOworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fRU5WSVJPTk1FTlRfTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRURfXyIsIFN0cik7CiAgIH0KIAorICAvLyBUZWxsIHVzZXJzIGFib3V0IHRoZSBrZXJuZWwgaWYgdGhlcmUgaXMgb25lLgorICBpZiAoVHJpcGxlLmlzT1NEYXJ3aW4oKSkKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX01BQ0hfXyIpOworCiAgIFBsYXRmb3JtTWluVmVyc2lvbiA9IFZlcnNpb25UdXBsZShNYWosIE1pbiwgUmV2KTsKIH0KIApAQCAtMTc4LDggKzE3NSw4IEBACiB0ZW1wbGF0ZTx0eXBlbmFtZSBUYXJnZXQ+CiBjbGFzcyBEYXJ3aW5UYXJnZXRJbmZvIDogcHVibGljIE9TVGFyZ2V0SW5mbzxUYXJnZXQ+IHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIGdldE9TRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0T1NEZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKKyAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgZ2V0RGFyd2luRGVmaW5lcyhCdWlsZGVyLCBPcHRzLCBUcmlwbGUsIHRoaXMtPlBsYXRmb3JtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPlBsYXRmb3JtTWluVmVyc2lvbik7CiAgIH0KQEAgLTE5MCw3ICsxODcsNyBAQAogICAgIHRoaXMtPk1Db3VudE5hbWUgPSAiXDAxbWNvdW50IjsKICAgfQogCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgaXNWYWxpZFNlY3Rpb25TcGVjaWZpZXIoU3RyaW5nUmVmIFNSKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGlzVmFsaWRTZWN0aW9uU3BlY2lmaWVyKFN0cmluZ1JlZiBTUikgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIExldCBNQ1NlY3Rpb25NYWNoTyB2YWxpZGF0ZSB0aGlzLgogICAgIFN0cmluZ1JlZiBTZWdtZW50LCBTZWN0aW9uOwogICAgIHVuc2lnbmVkIFRBQSwgU3R1YlNpemU7CkBAIC0xOTksNyArMTk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUEsIEhhc1RBQSwgU3R1YlNpemUpOwogICB9CiAKLSAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRTdGF0aWNJbml0U2VjdGlvblNwZWNpZmllcigpIGNvbnN0IHsKKyAgY29uc3QgY2hhciAqZ2V0U3RhdGljSW5pdFNlY3Rpb25TcGVjaWZpZXIoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gRklYTUU6IFdlIHNob3VsZCByZXR1cm4gMCB3aGVuIGJ1aWxkaW5nIGtleHRzLgogICAgIHJldHVybiAiX19URVhULF9fU3RhdGljSW5pdCxyZWd1bGFyLHB1cmVfaW5zdHJ1Y3Rpb25zIjsKICAgfQpAQCAtMjA3LDcgKzIwNCw3IEBACiAgIC8vLyBEYXJ3aW4gZG9lcyBub3Qgc3VwcG9ydCBwcm90ZWN0ZWQgdmlzaWJpbGl0eS4gIERhcndpbidzICJkZWZhdWx0IgogICAvLy8gaXMgdmVyeSBzaW1pbGFyIHRvIEVMRidzICJwcm90ZWN0ZWQiOyAgRGFyd2luIHJlcXVpcmVzIGEgIndlYWsiCiAgIC8vLyBhdHRyaWJ1dGUgb24gZGVjbGFyYXRpb25zIHRoYXQgY2FuIGJlIGR5bmFtaWNhbGx5IHJlcGxhY2VkLgotICB2aXJ0dWFsIGJvb2wgaGFzUHJvdGVjdGVkVmlzaWJpbGl0eSgpIGNvbnN0IHsKKyAgYm9vbCBoYXNQcm90ZWN0ZWRWaXNpYmlsaXR5KCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogfTsKQEAgLTIxNyw4ICsyMTQsOCBAQAogdGVtcGxhdGU8dHlwZW5hbWUgVGFyZ2V0PgogY2xhc3MgRHJhZ29uRmx5QlNEVGFyZ2V0SW5mbyA6IHB1YmxpYyBPU1RhcmdldEluZm88VGFyZ2V0PiB7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldE9TRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIERyYWdvbkZseSBkZWZpbmVzOyBsaXN0IGJhc2VkIG9mZiBvZiBnY2Mgb3V0cHV0CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19EcmFnb25GbHlfXyIpOwogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fRHJhZ29uRmx5X2NjX3ZlcnNpb24iLCAiMTAwMDAxIik7CkBAIC0yNDYsOCArMjQzLDggQEAKIHRlbXBsYXRlPHR5cGVuYW1lIFRhcmdldD4KIGNsYXNzIEZyZWVCU0RUYXJnZXRJbmZvIDogcHVibGljIE9TVGFyZ2V0SW5mbzxUYXJnZXQ+IHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIGdldE9TRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0T1NEZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKKyAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gRnJlZUJTRCBkZWZpbmVzOyBsaXN0IGJhc2VkIG9mZiBvZiBnY2Mgb3V0cHV0CiAKICAgICB1bnNpZ25lZCBSZWxlYXNlID0gVHJpcGxlLmdldE9TTWFqb3JWZXJzaW9uKCk7CkBAIC0yOTMsOCArMjkwLDggQEAKIHRlbXBsYXRlPHR5cGVuYW1lIFRhcmdldD4KIGNsYXNzIEtGcmVlQlNEVGFyZ2V0SW5mbyA6IHB1YmxpYyBPU1RhcmdldEluZm88VGFyZ2V0PiB7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldE9TRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIEdOVS9rRnJlZUJTRCBkZWZpbmVzOyBsaXN0IGJhc2VkIG9mZiBvZiBnY2Mgb3V0cHV0CiAKICAgICBEZWZpbmVTdGQoQnVpbGRlciwgInVuaXgiLCBPcHRzKTsKQEAgLTMxNiw4ICszMTMsOCBAQAogdGVtcGxhdGU8dHlwZW5hbWUgVGFyZ2V0PgogY2xhc3MgTWluaXhUYXJnZXRJbmZvIDogcHVibGljIE9TVGFyZ2V0SW5mbzxUYXJnZXQ+IHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIGdldE9TRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0T1NEZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKKyAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gTWluaXggZGVmaW5lcwogCiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19taW5peCIsICIzIik7CkBAIC0zNDAsOCArMzM3LDggQEAKIHRlbXBsYXRlPHR5cGVuYW1lIFRhcmdldD4KIGNsYXNzIExpbnV4VGFyZ2V0SW5mbyA6IHB1YmxpYyBPU1RhcmdldEluZm88VGFyZ2V0PiB7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldE9TRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIExpbnV4IGRlZmluZXM7IGxpc3QgYmFzZWQgb2ZmIG9mIGdjYyBvdXRwdXQKICAgICBEZWZpbmVTdGQoQnVpbGRlciwgInVuaXgiLCBPcHRzKTsKICAgICBEZWZpbmVTdGQoQnVpbGRlciwgImxpbnV4IiwgT3B0cyk7CkBAIC0zNTgsOSArMzU1LDE5IEBACiAgIExpbnV4VGFyZ2V0SW5mbyhjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkgOiBPU1RhcmdldEluZm88VGFyZ2V0PihUcmlwbGUpIHsKICAgICB0aGlzLT5Vc2VyTGFiZWxQcmVmaXggPSAiIjsKICAgICB0aGlzLT5XSW50VHlwZSA9IFRhcmdldEluZm86OlVuc2lnbmVkSW50OworCisgICAgc3dpdGNoIChUcmlwbGUuZ2V0QXJjaCgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpwcGM6CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OnBwYzY0OgorICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpwcGM2NGxlOgorICAgICAgdGhpcy0+TUNvdW50TmFtZSA9ICJfbWNvdW50IjsKKyAgICAgIGJyZWFrOworICAgIH0KICAgfQogCi0gIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0U3RhdGljSW5pdFNlY3Rpb25TcGVjaWZpZXIoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIgKmdldFN0YXRpY0luaXRTZWN0aW9uU3BlY2lmaWVyKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiAiLnRleHQuc3RhcnR1cCI7CiAgIH0KIH07CkBAIC0zNjksOCArMzc2LDggQEAKIHRlbXBsYXRlPHR5cGVuYW1lIFRhcmdldD4KIGNsYXNzIE5ldEJTRFRhcmdldEluZm8gOiBwdWJsaWMgT1NUYXJnZXRJbmZvPFRhcmdldD4gewogcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgZ2V0T1NEZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAorICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBOZXRCU0QgZGVmaW5lczsgbGlzdCBiYXNlZCBvZmYgb2YgZ2NjIG91dHB1dAogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fTmV0QlNEX18iKTsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX3VuaXhfXyIpOwpAQCAtMzg4LDggKzM5NSw4IEBACiB0ZW1wbGF0ZTx0eXBlbmFtZSBUYXJnZXQ+CiBjbGFzcyBPcGVuQlNEVGFyZ2V0SW5mbyA6IHB1YmxpYyBPU1RhcmdldEluZm88VGFyZ2V0PiB7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldE9TRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIE9wZW5CU0QgZGVmaW5lczsgbGlzdCBiYXNlZCBvZmYgb2YgZ2NjIG91dHB1dAogCiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19PcGVuQlNEX18iKTsKQEAgLTQyNSw4ICs0MzIsOCBAQAogdGVtcGxhdGU8dHlwZW5hbWUgVGFyZ2V0PgogY2xhc3MgQml0cmlnVGFyZ2V0SW5mbyA6IHB1YmxpYyBPU1RhcmdldEluZm88VGFyZ2V0PiB7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldE9TRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIEJpdHJpZyBkZWZpbmVzOyBsaXN0IGJhc2VkIG9mZiBvZiBnY2Mgb3V0cHV0CiAKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0JpdHJpZ19fIik7CkBAIC00NDcsOCArNDU0LDggQEAKIHRlbXBsYXRlPHR5cGVuYW1lIFRhcmdldD4KIGNsYXNzIFBTUFRhcmdldEluZm8gOiBwdWJsaWMgT1NUYXJnZXRJbmZvPFRhcmdldD4gewogcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgZ2V0T1NEZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAorICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBQU1AgZGVmaW5lczsgbGlzdCBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHRoZSBwc3BkZXYgZ2NjIHRvb2xjaGFpbi4KICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJQU1AiKTsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfUFNQIik7CkBAIC00NjUsOCArNDcyLDggQEAKIHRlbXBsYXRlPHR5cGVuYW1lIFRhcmdldD4KIGNsYXNzIFBTM1BQVVRhcmdldEluZm8gOiBwdWJsaWMgT1NUYXJnZXRJbmZvPFRhcmdldD4gewogcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgZ2V0T1NEZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAorICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBQUzMgUFBVIGRlZmluZXMuCiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19QUENfXyIpOwogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fUFBVX18iKTsKQEAgLTQ4NSwyNSArNDkyLDcgQEAKICAgICB0aGlzLT5VSW50TWF4VHlwZSA9IFRhcmdldEluZm86OlVuc2lnbmVkTG9uZ0xvbmc7CiAgICAgdGhpcy0+SW50NjRUeXBlID0gVGFyZ2V0SW5mbzo6U2lnbmVkTG9uZ0xvbmc7CiAgICAgdGhpcy0+U2l6ZVR5cGUgPSBUYXJnZXRJbmZvOjpVbnNpZ25lZEludDsKLSAgICB0aGlzLT5EZXNjcmlwdGlvblN0cmluZyA9ICJFLXA6MzI6MzI6MzItaTE6ODo4LWk4Ojg6OC1pMTY6MTY6MTYtaTMyOjMyOjMyLSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC12MTI4OjEyODoxMjgtbjMyIjsKLSAgfQotfTsKLQotLy8gRklYTUU6IE5lZWQgYSByZWFsIFNQVSB0YXJnZXQuCi0vLyBQUzMgU1BVIFRhcmdldAotdGVtcGxhdGU8dHlwZW5hbWUgVGFyZ2V0PgotY2xhc3MgUFMzU1BVVGFyZ2V0SW5mbyA6IHB1YmxpYyBPU1RhcmdldEluZm88VGFyZ2V0PiB7Ci1wcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgewotICAgIC8vIFBTMyBQUFUgZGVmaW5lcy4KLSAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX1NQVV9fIik7Ci0gICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19FTEZfXyIpOwotICB9Ci1wdWJsaWM6Ci0gIFBTM1NQVVRhcmdldEluZm8oY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUpIDogT1NUYXJnZXRJbmZvPFRhcmdldD4oVHJpcGxlKSB7Ci0gICAgdGhpcy0+VXNlckxhYmVsUHJlZml4ID0gIiI7CisgICAgdGhpcy0+RGVzY3JpcHRpb25TdHJpbmcgPSAiRS1tOmUtcDozMjozMi1pNjQ6NjQtbjMyOjY0IjsKICAgfQogfTsKIApAQCAtNTExLDggKzUwMCw4IEBACiB0ZW1wbGF0ZTx0eXBlbmFtZSBUYXJnZXQ+CiBjbGFzcyBBdXJvcmFVWFRhcmdldEluZm8gOiBwdWJsaWMgT1NUYXJnZXRJbmZvPFRhcmdldD4gewogcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgZ2V0T1NEZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAorICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBEZWZpbmVTdGQoQnVpbGRlciwgInN1biIsIE9wdHMpOwogICAgIERlZmluZVN0ZChCdWlsZGVyLCAidW5peCIsIE9wdHMpOwogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fRUxGX18iKTsKQEAgLTUzMiw4ICs1MjEsOCBAQAogdGVtcGxhdGU8dHlwZW5hbWUgVGFyZ2V0PgogY2xhc3MgU29sYXJpc1RhcmdldEluZm8gOiBwdWJsaWMgT1NUYXJnZXRJbmZvPFRhcmdldD4gewogcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgZ2V0T1NEZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAorICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBEZWZpbmVTdGQoQnVpbGRlciwgInN1biIsIE9wdHMpOwogICAgIERlZmluZVN0ZChCdWlsZGVyLCAidW5peCIsIE9wdHMpOwogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fRUxGX18iKTsKQEAgLTU2Niw4ICs1NTUsOCBAQAogdGVtcGxhdGU8dHlwZW5hbWUgVGFyZ2V0PgogY2xhc3MgV2luZG93c1RhcmdldEluZm8gOiBwdWJsaWMgT1NUYXJnZXRJbmZvPFRhcmdldD4gewogcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgZ2V0T1NEZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAorICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfV0lOMzIiKTsKICAgfQogICB2b2lkIGdldFZpc3VhbFN0dWRpb0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCkBAIC02MTIsOCArNjAxLDggQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUYXJnZXQ+CiBjbGFzcyBOYUNsVGFyZ2V0SW5mbyA6IHB1YmxpYyBPU1RhcmdldEluZm88VGFyZ2V0PiB7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldE9TRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIGlmIChPcHRzLlBPU0lYVGhyZWFkcykKICAgICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9SRUVOVFJBTlQiKTsKICAgICBpZiAoT3B0cy5DUGx1c1BsdXMpCkBAIC02MzcsMTYgKzYyNiwyOCBAQAogICAgIHRoaXMtPkRvdWJsZUFsaWduID0gNjQ7CiAgICAgdGhpcy0+TG9uZ0RvdWJsZVdpZHRoID0gNjQ7CiAgICAgdGhpcy0+TG9uZ0RvdWJsZUFsaWduID0gNjQ7CisgICAgdGhpcy0+TG9uZ0xvbmdXaWR0aCA9IDY0OworICAgIHRoaXMtPkxvbmdMb25nQWxpZ24gPSA2NDsKICAgICB0aGlzLT5TaXplVHlwZSA9IFRhcmdldEluZm86OlVuc2lnbmVkSW50OwogICAgIHRoaXMtPlB0ckRpZmZUeXBlID0gVGFyZ2V0SW5mbzo6U2lnbmVkSW50OwogICAgIHRoaXMtPkludFB0clR5cGUgPSBUYXJnZXRJbmZvOjpTaWduZWRJbnQ7CiAgICAgLy8gUmVnUGFybU1heCBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgdW5kZXJseWluZyBhcmNoaXRlY3R1cmUKICAgICB0aGlzLT5Mb25nRG91YmxlRm9ybWF0ID0gJmxsdm06OkFQRmxvYXQ6OklFRUVkb3VibGU7Ci0gICAgdGhpcy0+RGVzY3JpcHRpb25TdHJpbmcgPSAiZS1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItaTY0OjY0OjY0LSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmMzI6MzI6MzItZjY0OjY0OjY0LXA6MzI6MzI6MzItdjEyODozMjozMiI7CisgICAgaWYgKFRyaXBsZS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm0pIHsKKyAgICAgIHRoaXMtPkRlc2NyaXB0aW9uU3RyaW5nID0gImUtbTplLXA6MzI6MzItaTY0OjY0LXYxMjg6NjQ6MTI4LW4zMi1TMTI4IjsKKyAgICB9IGVsc2UgaWYgKFRyaXBsZS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYpIHsKKyAgICAgIHRoaXMtPkRlc2NyaXB0aW9uU3RyaW5nID0gImUtbTplLXA6MzI6MzItaTY0OjY0LW44OjE2OjMyLVMxMjgiOworICAgIH0gZWxzZSBpZiAoVHJpcGxlLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NCkgeworICAgICAgdGhpcy0+RGVzY3JpcHRpb25TdHJpbmcgPSAiZS1tOmUtcDozMjozMi1pNjQ6NjQtbjg6MTY6MzI6NjQtUzEyOCI7CisgICAgfSBlbHNlIGlmIChUcmlwbGUuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsKSB7CisgICAgICAvLyBIYW5kbGVkIG9uIG1pcHMnIHNldERlc2NyaXB0aW9uU3RyaW5nLgorICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoVHJpcGxlLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmxlMzIpOworICAgICAgdGhpcy0+RGVzY3JpcHRpb25TdHJpbmcgPSAiZS1wOjMyOjMyLWk2NDo2NCI7CisgICAgfQogICB9Ci0gIHZpcnR1YWwgdHlwZW5hbWUgVGFyZ2V0OjpDYWxsaW5nQ29udkNoZWNrUmVzdWx0IGNoZWNrQ2FsbGluZ0NvbnZlbnRpb24oCi0gICAgICBDYWxsaW5nQ29udiBDQykgY29uc3QgeworICB0eXBlbmFtZSBUYXJnZXQ6OkNhbGxpbmdDb252Q2hlY2tSZXN1bHQgY2hlY2tDYWxsaW5nQ29udmVudGlvbigKKyAgICAgIENhbGxpbmdDb252IENDKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIENDID09IENDX1BuYWNsQ2FsbCA/IFRhcmdldDo6Q0NDUl9PSyA6CiAgICAgICAgIFRhcmdldDo6Y2hlY2tDYWxsaW5nQ29udmVudGlvbihDQyk7CiAgIH0KQEAgLTY5OSw3ICs3MDAsNyBAQAogICAvLyAgNDAxLCA0MDMsIDQwNSwgNDA1ZnAsIDQ0MGZwLCA0NjQsIDQ2NGZwLCA0NzYsIDQ3NmZwLCA1MDUsIDc0MCwgODAxLAogICAvLyAgODIxLCA4MjMsIDg1NDAsIDg1NDgsIGUzMDBjMiwgZTMwMGMzLCBlNTAwbWM2NCwgZTY1MDAsIDg2MCwgY2VsbCwKICAgLy8gIHRpdGFuLCByczY0LgotICB2aXJ0dWFsIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBvdmVycmlkZSB7CiAgICAgYm9vbCBDUFVLbm93biA9IGxsdm06OlN0cmluZ1N3aXRjaDxib29sPihOYW1lKQogICAgICAgLkNhc2UoImdlbmVyaWMiLCB0cnVlKQogICAgICAgLkNhc2UoIjQ0MCIsIHRydWUpCkBAIC03NTMsMjkgKzc1NCwyOSBAQAogICAgIHJldHVybiBDUFVLbm93bjsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBnZXRUYXJnZXRCdWlsdGlucyhjb25zdCBCdWlsdGluOjpJbmZvIComUmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1SZWNvcmRzKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0QnVpbHRpbnMoY29uc3QgQnVpbHRpbjo6SW5mbyAqJlJlY29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBSZWNvcmRzID0gQnVpbHRpbkluZm87CiAgICAgTnVtUmVjb3JkcyA9IGNsYW5nOjpQUEM6Okxhc3RUU0J1aWx0aW4tQnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW47CiAgIH0KIAotICB2aXJ0dWFsIGJvb2wgaXNDTFpGb3JaZXJvVW5kZWYoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBib29sIGlzQ0xaRm9yWmVyb1VuZGVmKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdDsKKyAgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgZ2V0RGVmYXVsdEZlYXR1cmVzKGxsdm06OlN0cmluZ01hcDxib29sPiAmRmVhdHVyZXMpIGNvbnN0OworICB2b2lkIGdldERlZmF1bHRGZWF0dXJlcyhsbHZtOjpTdHJpbmdNYXA8Ym9vbD4gJkZlYXR1cmVzKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIGJvb2wgaGFuZGxlVGFyZ2V0RmVhdHVyZXMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZGZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFncyk7Ci0gIHZpcnR1YWwgYm9vbCBoYXNGZWF0dXJlKFN0cmluZ1JlZiBGZWF0dXJlKSBjb25zdDsKLSAgCi0gIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICogY29uc3QgKiZOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdBbGlhc2VzKGNvbnN0IEdDQ1JlZ0FsaWFzIComQWxpYXNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm86OkNvbnN0cmFpbnRJbmZvICZJbmZvKSBjb25zdCB7CisgIGJvb2wgaGFuZGxlVGFyZ2V0RmVhdHVyZXMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpIG92ZXJyaWRlOworICBib29sIGhhc0ZlYXR1cmUoU3RyaW5nUmVmIEZlYXR1cmUpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZ2V0R0NDUmVnTmFtZXMoY29uc3QgY2hhciAqIGNvbnN0IComTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBnZXRHQ0NSZWdBbGlhc2VzKGNvbnN0IEdDQ1JlZ0FsaWFzIComQWxpYXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1BbGlhc2VzKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCB2YWxpZGF0ZUFzbUNvbnN0cmFpbnQoY29uc3QgY2hhciAqJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm86OkNvbnN0cmFpbnRJbmZvICZJbmZvKSBjb25zdCBvdmVycmlkZSB7CiAgICAgc3dpdGNoICgqTmFtZSkgewogICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKICAgICBjYXNlICdPJzogLy8gWmVybwpAQCAtNzk3LDYgKzc5OCw3IEBACiAgICAgICAgIGNhc2UgJ2YnOi8vIFZTWCB2ZWN0b3IgcmVnaXN0ZXIgdG8gaG9sZCB2ZWN0b3IgZmxvYXQgZGF0YQogICAgICAgICBjYXNlICdzJzovLyBWU1ggdmVjdG9yIHJlZ2lzdGVyIHRvIGhvbGQgc2NhbGFyIGZsb2F0IGRhdGEKICAgICAgICAgY2FzZSAnYSc6Ly8gQW55IFZTWCByZWdpc3RlcgorICAgICAgICBjYXNlICdjJzovLyBBbiBpbmRpdmlkdWFsIENSIGJpdAogICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTg3MiwxMCArODc0LDI0IEBACiAgICAgfQogICAgIHJldHVybiB0cnVlOwogICB9Ci0gIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGNvbnZlcnRDb25zdHJhaW50KGNvbnN0IGNoYXIgKiZDb25zdHJhaW50KSBjb25zdCBvdmVycmlkZSB7CisgICAgc3RkOjpzdHJpbmcgUjsKKyAgICBzd2l0Y2ggKCpDb25zdHJhaW50KSB7CisgICAgY2FzZSAnZSc6CisgICAgY2FzZSAndyc6CisgICAgICAvLyBUd28tY2hhcmFjdGVyIGNvbnN0cmFpbnQ7IGFkZCAiXiIgaGludCBmb3IgbGF0ZXIgcGFyc2luZy4KKyAgICAgIFIgPSBzdGQ6OnN0cmluZygiXiIpICsgc3RkOjpzdHJpbmcoQ29uc3RyYWludCwgMik7CisgICAgICBDb25zdHJhaW50Kys7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFRhcmdldEluZm86OmNvbnZlcnRDb25zdHJhaW50KENvbnN0cmFpbnQpOworICAgIH0KKyAgICByZXR1cm4gUjsKKyAgfQorICBjb25zdCBjaGFyICpnZXRDbG9iYmVycygpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gIiI7CiAgIH0KLSAgaW50IGdldEVIRGF0YVJlZ2lzdGVyTnVtYmVyKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgIGludCBnZXRFSERhdGFSZWdpc3Rlck51bWJlcih1bnNpZ25lZCBSZWdObykgY29uc3Qgb3ZlcnJpZGUgewogICAgIGlmIChSZWdObyA9PSAwKSByZXR1cm4gMzsKICAgICBpZiAoUmVnTm8gPT0gMSkgcmV0dXJuIDQ7CiAgICAgcmV0dXJuIC0xOwpAQCAtOTMzLDEyICs5NDksMTEgQEAKICAgLy8gVGFyZ2V0IHByb3BlcnRpZXMuCiAgIGlmIChnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpwcGM2NGxlKSB7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX0xJVFRMRV9FTkRJQU4iKTsKLSAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0xJVFRMRV9FTkRJQU5fXyIpOworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9DQUxMX0VMRiIsIjIiKTsKICAgfSBlbHNlIHsKICAgICBpZiAoZ2V0VHJpcGxlKCkuZ2V0T1MoKSAhPSBsbHZtOjpUcmlwbGU6Ok5ldEJTRCAmJgogICAgICAgICBnZXRUcmlwbGUoKS5nZXRPUygpICE9IGxsdm06OlRyaXBsZTo6T3BlbkJTRCkKICAgICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9CSUdfRU5ESUFOIik7Ci0gICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19CSUdfRU5ESUFOX18iKTsKICAgfQogCiAgIC8vIFN1YnRhcmdldCBvcHRpb25zLgpAQCAtMTE5Niw4ICsxMjExLDcgQEAKIGNsYXNzIFBQQzMyVGFyZ2V0SW5mbyA6IHB1YmxpYyBQUENUYXJnZXRJbmZvIHsKIHB1YmxpYzoKICAgUFBDMzJUYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKSA6IFBQQ1RhcmdldEluZm8oVHJpcGxlKSB7Ci0gICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiRS1wOjMyOjMyOjMyLWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAiaTY0OjY0OjY0LWYzMjozMjozMi1mNjQ6NjQ6NjQtdjEyODoxMjg6MTI4LW4zMiI7CisgICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiRS1tOmUtcDozMjozMi1pNjQ6NjQtbjMyIjsKIAogICAgIHN3aXRjaCAoZ2V0VHJpcGxlKCkuZ2V0T1MoKSkgewogICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpMaW51eDoKQEAgLTEyMjAsNyArMTIzNCw3IEBACiAgICAgTWF4QXRvbWljUHJvbW90ZVdpZHRoID0gTWF4QXRvbWljSW5saW5lV2lkdGggPSAzMjsKICAgfQogCi0gIHZpcnR1YWwgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCB7CisgIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIFRoaXMgaXMgdGhlIEVMRiBkZWZpbml0aW9uLCBhbmQgaXMgb3ZlcnJpZGRlbiBieSB0aGUgRGFyd2luIHN1Yi10YXJnZXQKICAgICByZXR1cm4gVGFyZ2V0SW5mbzo6UG93ZXJBQklCdWlsdGluVmFMaXN0OwogICB9CkBAIC0xMjQxLDE4ICsxMjU1LDE5IEBACiAgICAgaWYgKGdldFRyaXBsZSgpLmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpGcmVlQlNEKSB7CiAgICAgICBMb25nRG91YmxlV2lkdGggPSBMb25nRG91YmxlQWxpZ24gPSA2NDsKICAgICAgIExvbmdEb3VibGVGb3JtYXQgPSAmbGx2bTo6QVBGbG9hdDo6SUVFRWRvdWJsZTsKLSAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gIkUtcDo2NDo2NDo2NC1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0OjY0OjY0LWYzMjozMjozMi1mNjQ6NjQ6NjQtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAidjEyODoxMjg6MTI4LW4zMjo2NCI7Ci0gICAgfSBlbHNlCi0gICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJFLXA6NjQ6NjQ6NjQtaTE6ODo4LWk4Ojg6OC1pMTY6MTY6MTYtaTMyOjMyOjMyLSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NDo2NDo2NC1mMzI6MzI6MzItZjY0OjY0OjY0LWYxMjg6MTI4OjEyOC0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ2MTI4OjEyODoxMjgtbjMyOjY0IjsKKyAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gIkUtbTplLWk2NDo2NC1uMzI6NjQiOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKFRyaXBsZS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpwcGM2NGxlKSkgeworICAgICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJlLW06ZS1pNjQ6NjQtbjMyOjY0IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gIkUtbTplLWk2NDo2NC1uMzI6NjQiOworICAgICAgfQorfQogCiAgICAgLy8gUFBDNjQgc3VwcG9ydHMgYXRvbWljcyB1cCB0byA4IGJ5dGVzLgogICAgIE1heEF0b21pY1Byb21vdGVXaWR0aCA9IE1heEF0b21pY0lubGluZVdpZHRoID0gNjQ7CiAgIH0KLSAgdmlydHVhbCBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IHsKKyAgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFRhcmdldEluZm86OkNoYXJQdHJCdWlsdGluVmFMaXN0OwogICB9CiB9OwpAQCAtMTI3MCwxMCArMTI4NSw5IEBACiAgICAgUHRyRGlmZlR5cGUgPSBTaWduZWRJbnQ7ICAgIC8vIGZvciBodHRwOi8vbGx2bS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3MjYKICAgICBMb25nTG9uZ0FsaWduID0gMzI7CiAgICAgU3VpdGFibGVBbGlnbiA9IDEyODsKLSAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJFLXA6MzI6MzI6MzItaTE6ODo4LWk4Ojg6OC1pMTY6MTY6MTYtaTMyOjMyOjMyLSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6MzI6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC12MTI4OjEyODoxMjgtbjMyIjsKKyAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJFLW06by1wOjMyOjMyLWY2NDozMjo2NC1uMzIiOwogICB9Ci0gIHZpcnR1YWwgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCB7CisgIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBUYXJnZXRJbmZvOjpDaGFyUHRyQnVpbHRpblZhTGlzdDsKICAgfQogfTsKQEAgLTEyODUsOCArMTI5OSw3IEBACiAgICAgICA6IERhcndpblRhcmdldEluZm88UFBDNjRUYXJnZXRJbmZvPihUcmlwbGUpIHsKICAgICBIYXNBbGlnbk1hYzY4a1N1cHBvcnQgPSB0cnVlOwogICAgIFN1aXRhYmxlQWxpZ24gPSAxMjg7Ci0gICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiRS1wOjY0OjY0OjY0LWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAiaTY0OjY0OjY0LWYzMjozMjozMi1mNjQ6NjQ6NjQtdjEyODoxMjg6MTI4LW4zMjo2NCI7CisgICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiRS1tOm8taTY0OjY0LW4zMjo2NCI7CiAgIH0KIH07CiB9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlLgpAQCAtMTMxNCwzMCArMTMyNywzMCBAQAogICAgICAgLy8gVGhlc2UgbXVzdCBiZSBkZWZpbmVkIGluIHNvcnRlZCBvcmRlciEKICAgICAgIE5vQXNtVmFyaWFudHMgPSB0cnVlOwogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19QVFhfXyIpOwogICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19OVlBUWF9fIik7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZCBnZXRUYXJnZXRCdWlsdGlucyhjb25zdCBCdWlsdGluOjpJbmZvIComUmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IHsKKyAgICB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIFJlY29yZHMgPSBCdWlsdGluSW5mbzsKICAgICAgIE51bVJlY29yZHMgPSBjbGFuZzo6TlZQVFg6Okxhc3RUU0J1aWx0aW4tQnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW47CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbCBoYXNGZWF0dXJlKFN0cmluZ1JlZiBGZWF0dXJlKSBjb25zdCB7CisgICAgYm9vbCBoYXNGZWF0dXJlKFN0cmluZ1JlZiBGZWF0dXJlKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gRmVhdHVyZSA9PSAicHR4IiB8fCBGZWF0dXJlID09ICJudnB0eCI7CiAgICAgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICogY29uc3QgKiZOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0R0NDUmVnQWxpYXNlcyhjb25zdCBHQ0NSZWdBbGlhcyAqJkFsaWFzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0IHsKKworICAgIHZvaWQgZ2V0R0NDUmVnTmFtZXMoY29uc3QgY2hhciAqIGNvbnN0IComTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtTmFtZXMpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgZ2V0R0NDUmVnQWxpYXNlcyhjb25zdCBHQ0NSZWdBbGlhcyAqJkFsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIC8vIE5vIGFsaWFzZXMuCiAgICAgICBBbGlhc2VzID0gMDsKICAgICAgIE51bUFsaWFzZXMgPSAwOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SW5mbzo6Q29uc3RyYWludEluZm8gJkluZm8pIGNvbnN0IHsKKyAgICBib29sIHZhbGlkYXRlQXNtQ29uc3RyYWludChjb25zdCBjaGFyIComTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmSW5mbykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgc3dpdGNoICgqTmFtZSkgewogICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOwogICAgICAgY2FzZSAnYyc6CkBAIC0xMzUwLDE1ICsxMzYzLDE1IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQogICAgIH0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldENsb2JiZXJzKCkgY29uc3QgeworICAgIGNvbnN0IGNoYXIgKmdldENsb2JiZXJzKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgLy8gRklYTUU6IElzIHRoaXMgcmVhbGx5IHJpZ2h0PwogICAgICAgcmV0dXJuICIiOwogICAgIH0KLSAgICB2aXJ0dWFsIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3QgeworICAgIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgLy8gRklYTUU6IGltcGxlbWVudAogICAgICAgcmV0dXJuIFRhcmdldEluZm86OkNoYXJQdHJCdWlsdGluVmFMaXN0OwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgYm9vbCBzZXRDUFUoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIG92ZXJyaWRlIHsKICAgICAgIGJvb2wgVmFsaWQgPSBsbHZtOjpTdHJpbmdTd2l0Y2g8Ym9vbD4oTmFtZSkKICAgICAgICAgLkNhc2UoInNtXzIwIiwgdHJ1ZSkKICAgICAgICAgLkNhc2UoInNtXzIxIiwgdHJ1ZSkKQEAgLTEzOTIsMTAgKzE0MDUsNyBAQAogICAgIE5WUFRYMzJUYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKSA6IE5WUFRYVGFyZ2V0SW5mbyhUcmlwbGUpIHsKICAgICAgIFBvaW50ZXJXaWR0aCA9IFBvaW50ZXJBbGlnbiA9IDMyOwogICAgICAgU2l6ZVR5cGUgICAgID0gUHRyRGlmZlR5cGUgPSBJbnRQdHJUeXBlID0gVGFyZ2V0SW5mbzo6VW5zaWduZWRJbnQ7Ci0gICAgICBEZXNjcmlwdGlvblN0cmluZwotICAgICAgICA9ICJlLXA6MzI6MzI6MzItaTE6ODo4LWk4Ojg6OC1pMTY6MTY6MTYtaTMyOjMyOjMyLWk2NDo2NDo2NC0iCi0gICAgICAgICAgImYzMjozMjozMi1mNjQ6NjQ6NjQtdjE2OjE2OjE2LXYzMjozMjozMi12NjQ6NjQ6NjQtdjEyODoxMjg6MTI4LSIKLSAgICAgICAgICAibjE2OjMyOjY0IjsKKyAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gImUtcDozMjozMi1pNjQ6NjQtdjE2OjE2LXYzMjozMi1uMTY6MzI6NjQiOwogICB9CiAgIH07CiAKQEAgLTE0MDQsMTAgKzE0MTQsNyBAQAogICAgIE5WUFRYNjRUYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKSA6IE5WUFRYVGFyZ2V0SW5mbyhUcmlwbGUpIHsKICAgICAgIFBvaW50ZXJXaWR0aCA9IFBvaW50ZXJBbGlnbiA9IDY0OwogICAgICAgU2l6ZVR5cGUgICAgID0gUHRyRGlmZlR5cGUgPSBJbnRQdHJUeXBlID0gVGFyZ2V0SW5mbzo6VW5zaWduZWRMb25nTG9uZzsKLSAgICAgIERlc2NyaXB0aW9uU3RyaW5nCi0gICAgICAgID0gImUtcDo2NDo2NDo2NC1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItaTY0OjY0OjY0LSIKLSAgICAgICAgICAiZjMyOjMyOjMyLWY2NDo2NDo2NC12MTY6MTY6MTYtdjMyOjMyOjMyLXY2NDo2NDo2NC12MTI4OjEyODoxMjgtIgotICAgICAgICAgICJuMTY6MzI6NjQiOworICAgICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiZS1pNjQ6NjQtdjE2OjE2LXYzMjozMi1uMTY6MzI6NjQiOwogICB9CiAgIH07CiB9CkBAIC0xNDI0LDI5ICsxNDMxLDE3IEBACiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqRGVzY3JpcHRpb25TdHJpbmdSNjAwID0KLSAgImUiCi0gICItcDozMjozMjozMiIKLSAgIi1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItaTY0OjY0OjY0LWYzMjozMjozMiIKLSAgIi12MTY6MTY6MTYtdjI0OjMyOjMyLXYzMjozMjozMi12NDg6NjQ6NjQtdjY0OjY0OjY0LXY5NjoxMjg6MTI4LXYxMjg6MTI4OjEyOCIKLSAgIi12MTkyOjI1NjoyNTYtdjI1NjoyNTY6MjU2LXY1MTI6NTEyOjUxMi12MTAyNDoxMDI0OjEwMjQtdjIwNDg6MjA0ODoyMDQ4IgotICAiLW4zMjo2NCI7CisgICJlLXA6MzI6MzItaTY0OjY0LXYxNjoxNi12MjQ6MzItdjMyOjMyLXY0ODo2NC12OTY6MTI4IgorICAiLXYxOTI6MjU2LXYyNTY6MjU2LXY1MTI6NTEyLXYxMDI0OjEwMjQtdjIwNDg6MjA0OC1uMzI6NjQiOwogCiBzdGF0aWMgY29uc3QgY2hhciAqRGVzY3JpcHRpb25TdHJpbmdSNjAwRG91YmxlT3BzID0KLSAgImUiCi0gICItcDozMjozMjozMiIKLSAgIi1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItaTY0OjY0OjY0LWYzMjozMjozMi1mNjQ6NjQ6NjQiCi0gICItdjE2OjE2OjE2LXYyNDozMjozMi12MzI6MzI6MzItdjQ4OjY0OjY0LXY2NDo2NDo2NC12OTY6MTI4OjEyOC12MTI4OjEyODoxMjgiCi0gICItdjE5MjoyNTY6MjU2LXYyNTY6MjU2OjI1Ni12NTEyOjUxMjo1MTItdjEwMjQ6MTAyNDoxMDI0LXYyMDQ4OjIwNDg6MjA0OCIKLSAgIi1uMzI6NjQiOworICAiZS1wOjMyOjMyLWk2NDo2NC12MTY6MTYtdjI0OjMyLXYzMjozMi12NDg6NjQtdjk2OjEyOCIKKyAgIi12MTkyOjI1Ni12MjU2OjI1Ni12NTEyOjUxMi12MTAyNDoxMDI0LXYyMDQ4OjIwNDgtbjMyOjY0IjsKIAogc3RhdGljIGNvbnN0IGNoYXIgKkRlc2NyaXB0aW9uU3RyaW5nU0kgPQotICAiZSIKLSAgIi1wOjY0OjY0OjY0IgotICAiLXAzOjMyOjMyOjMyIgotICAiLWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi1pNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NCIKLSAgIi12MTY6MTY6MTYtdjI0OjMyOjMyLXYzMjozMjozMi12NDg6NjQ6NjQtdjY0OjY0OjY0LXY5NjoxMjg6MTI4LXYxMjg6MTI4OjEyOCIKLSAgIi12MTkyOjI1NjoyNTYtdjI1NjoyNTY6MjU2LXY1MTI6NTEyOjUxMi12MTAyNDoxMDI0OjEwMjQtdjIwNDg6MjA0ODoyMDQ4IgotICAiLW4zMjo2NCI7CisgICJlLXA6MzI6MzItcDE6NjQ6NjQtcDI6NjQ6NjQtcDM6MzI6MzItcDQ6MzI6MzItcDU6NjQ6NjQiCisgICItaTY0OjY0LXYxNjoxNi12MjQ6MzItdjMyOjMyLXY0ODo2NC12OTY6MTI4IgorICAiLXYxOTI6MjU2LXYyNTY6MjU2LXY1MTI6NTEyLXYxMDI0OjEwMjQtdjIwNDg6MjA0OC1uMzI6NjQiOwogCiBjbGFzcyBSNjAwVGFyZ2V0SW5mbyA6IHB1YmxpYyBUYXJnZXRJbmZvIHsKICAgLy8vIFxicmllZiBUaGUgR1BVIHByb2ZpbGVzIHN1cHBvcnRlZCBieSB0aGUgUjYwMCB0YXJnZXQuCkBAIC0xNDcyLDQ0ICsxNDY3LDQ0IEBACiAgICAgVXNlQWRkclNwYWNlTWFwTWFuZ2xpbmcgPSB0cnVlOwogICB9CiAKLSAgdmlydHVhbCBjb25zdCBjaGFyICogZ2V0Q2xvYmJlcnMoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIgKiBnZXRDbG9iYmVycygpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gIiI7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgZ2V0R0NDUmVnTmFtZXMoY29uc3QgY2hhciAqIGNvbnN0IComTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmbnVtTmFtZXMpIGNvbnN0ICB7CisgIHZvaWQgZ2V0R0NDUmVnTmFtZXMoY29uc3QgY2hhciAqIGNvbnN0IComTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJm51bU5hbWVzKSBjb25zdCBvdmVycmlkZSB7CiAgICAgTmFtZXMgPSBOVUxMOwogICAgIG51bU5hbWVzID0gMDsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdBbGlhc2VzKGNvbnN0IEdDQ1JlZ0FsaWFzIComQWxpYXNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0IHsKKyAgdm9pZCBnZXRHQ0NSZWdBbGlhc2VzKGNvbnN0IEdDQ1JlZ0FsaWFzIComQWxpYXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1BbGlhc2VzKSBjb25zdCBvdmVycmlkZSB7CiAgICAgQWxpYXNlcyA9IE5VTEw7CiAgICAgTnVtQWxpYXNlcyA9IDA7CiAgIH0KIAotICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm86OkNvbnN0cmFpbnRJbmZvICZpbmZvKSBjb25zdCB7CisgIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmaW5mbykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IHsKKyAgdm9pZCBnZXRUYXJnZXRCdWlsdGlucyhjb25zdCBCdWlsdGluOjpJbmZvIComUmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtUmVjb3JkcykgY29uc3Qgb3ZlcnJpZGUgewogICAgIFJlY29yZHMgPSBOVUxMOwogICAgIE51bVJlY29yZHMgPSAwOwogICB9CiAKIAotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fUjYwMF9fIik7CiAgIH0KIAotICB2aXJ0dWFsIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3QgeworICBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gVGFyZ2V0SW5mbzo6Q2hhclB0ckJ1aWx0aW5WYUxpc3Q7CiAgIH0KIAotICB2aXJ0dWFsIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBvdmVycmlkZSB7CiAgICAgR1BVID0gbGx2bTo6U3RyaW5nU3dpdGNoPEdQVUtpbmQ+KE5hbWUpCiAgICAgICAuQ2FzZSgicjYwMCIgLCAgICBHS19SNjAwKQogICAgICAgLkNhc2UoInJ2NjEwIiwgICAgR0tfUjYwMCkKQEAgLTE4MDcsNTcgKzE4MDIsNTcgQEAKICAgICBCaWdFbmRpYW4gPSBmYWxzZTsKICAgICBMb25nRG91YmxlRm9ybWF0ID0gJmxsdm06OkFQRmxvYXQ6Ong4N0RvdWJsZUV4dGVuZGVkOwogICB9Ci0gIHZpcnR1YWwgdW5zaWduZWQgZ2V0RmxvYXRFdmFsTWV0aG9kKCkgY29uc3QgeworICB1bnNpZ25lZCBnZXRGbG9hdEV2YWxNZXRob2QoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gWDg3IGV2YWx1YXRlcyB3aXRoIDgwIGJpdHMgImxvbmcgZG91YmxlIiBwcmVjaXNpb24uCiAgICAgcmV0dXJuIFNTRUxldmVsID09IE5vU1NFID8gMiA6IDA7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IHsKKyAgdm9pZCBnZXRUYXJnZXRCdWlsdGlucyhjb25zdCBCdWlsdGluOjpJbmZvIComUmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1SZWNvcmRzKSBjb25zdCBvdmVycmlkZSB7CiAgICAgUmVjb3JkcyA9IEJ1aWx0aW5JbmZvOwogICAgIE51bVJlY29yZHMgPSBjbGFuZzo6WDg2OjpMYXN0VFNCdWlsdGluLUJ1aWx0aW46OkZpcnN0VFNCdWlsdGluOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICogY29uc3QgKiZOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3QgeworICB2b2lkIGdldEdDQ1JlZ05hbWVzKGNvbnN0IGNoYXIgKiBjb25zdCAqJk5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3Qgb3ZlcnJpZGUgewogICAgIE5hbWVzID0gR0NDUmVnTmFtZXM7CiAgICAgTnVtTmFtZXMgPSBsbHZtOjphcnJheV9sZW5ndGhvZihHQ0NSZWdOYW1lcyk7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3QgeworICB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBBbGlhc2VzID0gMDsKICAgICBOdW1BbGlhc2VzID0gMDsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0R0NDQWRkbFJlZ05hbWVzKGNvbnN0IEFkZGxSZWdOYW1lIComTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdCB7CisgIHZvaWQgZ2V0R0NDQWRkbFJlZ05hbWVzKGNvbnN0IEFkZGxSZWdOYW1lIComTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3Qgb3ZlcnJpZGUgewogICAgIE5hbWVzID0gQWRkbFJlZ05hbWVzOwogICAgIE51bU5hbWVzID0gbGx2bTo6YXJyYXlfbGVuZ3Rob2YoQWRkbFJlZ05hbWVzKTsKICAgfQotICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm86OkNvbnN0cmFpbnRJbmZvICZpbmZvKSBjb25zdDsKLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBjb252ZXJ0Q29uc3RyYWludChjb25zdCBjaGFyIComQ29uc3RyYWludCkgY29uc3Q7Ci0gIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCB7CisgIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm86OkNvbnN0cmFpbnRJbmZvICZpbmZvKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgY29udmVydENvbnN0cmFpbnQoY29uc3QgY2hhciAqJkNvbnN0cmFpbnQpIGNvbnN0IG92ZXJyaWRlOworICBjb25zdCBjaGFyICpnZXRDbG9iYmVycygpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gIn57ZGlyZmxhZ30sfntmcHNyfSx+e2ZsYWdzfSI7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Q7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGU7CiAgIHN0YXRpYyB2b2lkIHNldFNTRUxldmVsKGxsdm06OlN0cmluZ01hcDxib29sPiAmRmVhdHVyZXMsIFg4NlNTRUVudW0gTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW5hYmxlZCk7CiAgIHN0YXRpYyB2b2lkIHNldE1NWExldmVsKGxsdm06OlN0cmluZ01hcDxib29sPiAmRmVhdHVyZXMsIE1NWDNETm93RW51bSBMZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbmFibGVkKTsKICAgc3RhdGljIHZvaWQgc2V0WE9QTGV2ZWwobGx2bTo6U3RyaW5nTWFwPGJvb2w+ICZGZWF0dXJlcywgWE9QRW51bSBMZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFbmFibGVkKTsKLSAgdmlydHVhbCB2b2lkIHNldEZlYXR1cmVFbmFibGVkKGxsdm06OlN0cmluZ01hcDxib29sPiAmRmVhdHVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwgYm9vbCBFbmFibGVkKSBjb25zdCB7CisgIHZvaWQgc2V0RmVhdHVyZUVuYWJsZWQobGx2bTo6U3RyaW5nTWFwPGJvb2w+ICZGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwgYm9vbCBFbmFibGVkKSBjb25zdCBvdmVycmlkZSB7CiAgICAgc2V0RmVhdHVyZUVuYWJsZWRJbXBsKEZlYXR1cmVzLCBOYW1lLCBFbmFibGVkKTsKICAgfQogICAvLyBUaGlzIGV4aXN0cyBwdXJlbHkgdG8gY3V0IGRvd24gb24gdGhlIG51bWJlciBvZiB2aXJ0dWFsIGNhbGxzIGluCiAgIC8vIGdldERlZmF1bHRGZWF0dXJlcyB3aGljaCBjYWxscyB0aGlzIHJlcGVhdGVkbHkuCiAgIHN0YXRpYyB2b2lkIHNldEZlYXR1cmVFbmFibGVkSW1wbChsbHZtOjpTdHJpbmdNYXA8Ym9vbD4gJkZlYXR1cmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsIGJvb2wgRW5hYmxlZCk7Ci0gIHZpcnR1YWwgdm9pZCBnZXREZWZhdWx0RmVhdHVyZXMobGx2bTo6U3RyaW5nTWFwPGJvb2w+ICZGZWF0dXJlcykgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBoYXNGZWF0dXJlKFN0cmluZ1JlZiBGZWF0dXJlKSBjb25zdDsKLSAgdmlydHVhbCBib29sIGhhbmRsZVRhcmdldEZlYXR1cmVzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmRmVhdHVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpOwotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldEFCSSgpIGNvbnN0IHsKKyAgdm9pZCBnZXREZWZhdWx0RmVhdHVyZXMobGx2bTo6U3RyaW5nTWFwPGJvb2w+ICZGZWF0dXJlcykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFuZGxlVGFyZ2V0RmVhdHVyZXMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpIG92ZXJyaWRlOworICBjb25zdCBjaGFyKiBnZXRBQkkoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgaWYgKGdldFRyaXBsZSgpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NCAmJiBTU0VMZXZlbCA+PSBBVlgpCiAgICAgICByZXR1cm4gImF2eCI7CiAgICAgZWxzZSBpZiAoZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2ICYmCkBAIC0xODY1LDcgKzE4NjAsNyBAQAogICAgICAgcmV0dXJuICJuby1tbXgiOwogICAgIHJldHVybiAiIjsKICAgfQotICB2aXJ0dWFsIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBvdmVycmlkZSB7CiAgICAgQ1BVID0gbGx2bTo6U3RyaW5nU3dpdGNoPENQVUtpbmQ+KE5hbWUpCiAgICAgICAuQ2FzZSgiaTM4NiIsIENLX2kzODYpCiAgICAgICAuQ2FzZSgiaTQ4NiIsIENLX2k0ODYpCkBAIC0xOTkyLDkgKzE5ODcsOSBAQAogICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCBDUFUga2luZCIpOwogICB9CiAKLSAgdmlydHVhbCBib29sIHNldEZQTWF0aChTdHJpbmdSZWYgTmFtZSk7CisgIGJvb2wgc2V0RlBNYXRoKFN0cmluZ1JlZiBOYW1lKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIENhbGxpbmdDb252Q2hlY2tSZXN1bHQgY2hlY2tDYWxsaW5nQ29udmVudGlvbihDYWxsaW5nQ29udiBDQykgY29uc3QgeworICBDYWxsaW5nQ29udkNoZWNrUmVzdWx0IGNoZWNrQ2FsbGluZ0NvbnZlbnRpb24oQ2FsbGluZ0NvbnYgQ0MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBXZSBhY2NlcHQgYWxsIG5vbi1BUk0gY2FsbGluZyBjb252ZW50aW9ucwogICAgIHJldHVybiAoQ0MgPT0gQ0NfWDg2VGhpc0NhbGwgfHwKICAgICAgICAgICAgIENDID09IENDX1g4NkZhc3RDYWxsIHx8CkBAIC0yMDA0LDcgKzE5OTksNyBAQAogICAgICAgICAgICAgQ0MgPT0gQ0NfSW50ZWxPY2xCaWNjKSA/IENDQ1JfT0sgOiBDQ0NSX1dhcm5pbmc7CiAgIH0KIAotICB2aXJ0dWFsIENhbGxpbmdDb252IGdldERlZmF1bHRDYWxsaW5nQ29udihDYWxsaW5nQ29udk1ldGhvZFR5cGUgTVQpIGNvbnN0IHsKKyAgQ2FsbGluZ0NvbnYgZ2V0RGVmYXVsdENhbGxpbmdDb252KENhbGxpbmdDb252TWV0aG9kVHlwZSBNVCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBNVCA9PSBDQ01UX01lbWJlciA/IENDX1g4NlRoaXNDYWxsIDogQ0NfQzsKICAgfQogfTsKQEAgLTI2OTcsNyArMjY5Miw2IEBACiAgIH0KIAogICAvLyBUYXJnZXQgcHJvcGVydGllcy4KLSAgQnVpbGRlci5kZWZpbmVNYWNybygiX19MSVRUTEVfRU5ESUFOX18iKTsKICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19SRUdJU1RFUl9QUkVGSVhfXyIsICIiKTsKIAogICAvLyBEZWZpbmUgX19OT19NQVRIX0lOTElORVMgb24gbGludXgveDg2IHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGlubGluZQpAQCAtMjk1MCw5ICsyOTQ0LDcgQEAKICAgICBMb25nRG91YmxlV2lkdGggPSA5NjsKICAgICBMb25nRG91YmxlQWxpZ24gPSAzMjsKICAgICBTdWl0YWJsZUFsaWduID0gMTI4OwotICAgIERlc2NyaXB0aW9uU3RyaW5nID0gImUtcDozMjozMjozMi1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItIgotICAgICAgICAgICAgICAgICAgICAgICAgImk2NDozMjo2NC1mMzI6MzI6MzItZjY0OjMyOjY0LXY2NDo2NDo2NC12MTI4OjEyODoxMjgtIgotICAgICAgICAgICAgICAgICAgICAgICAgImEwOjA6NjQtZjgwOjMyOjMyLW44OjE2OjMyLVMxMjgiOworICAgIERlc2NyaXB0aW9uU3RyaW5nID0gImUtbTplLXA6MzI6MzItZjY0OjMyOjY0LWY4MDozMi1uODoxNjozMi1TMTI4IjsKICAgICBTaXplVHlwZSA9IFVuc2lnbmVkSW50OwogICAgIFB0ckRpZmZUeXBlID0gU2lnbmVkSW50OwogICAgIEludFB0clR5cGUgPSBTaWduZWRJbnQ7CkBAIC0yOTY4LDE3ICsyOTYwLDE3IEBACiAgICAgLy8gTWF4QXRvbWljSW5saW5lV2lkdGguIChjbXB4Y2hnOGIgaXMgYW4gaTU4NiBpbnN0cnVjdGlvbi4pCiAgICAgTWF4QXRvbWljUHJvbW90ZVdpZHRoID0gTWF4QXRvbWljSW5saW5lV2lkdGggPSA2NDsKICAgfQotICB2aXJ0dWFsIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3QgeworICBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gVGFyZ2V0SW5mbzo6Q2hhclB0ckJ1aWx0aW5WYUxpc3Q7CiAgIH0KIAotICBpbnQgZ2V0RUhEYXRhUmVnaXN0ZXJOdW1iZXIodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgaW50IGdldEVIRGF0YVJlZ2lzdGVyTnVtYmVyKHVuc2lnbmVkIFJlZ05vKSBjb25zdCBvdmVycmlkZSB7CiAgICAgaWYgKFJlZ05vID09IDApIHJldHVybiAwOwogICAgIGlmIChSZWdObyA9PSAxKSByZXR1cm4gMjsKICAgICByZXR1cm4gLTE7CiAgIH0KLSAgdmlydHVhbCBib29sIHZhbGlkYXRlSW5wdXRTaXplKFN0cmluZ1JlZiBDb25zdHJhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSkgY29uc3QgeworICBib29sIHZhbGlkYXRlSW5wdXRTaXplKFN0cmluZ1JlZiBDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBzd2l0Y2ggKENvbnN0cmFpbnRbMF0pIHsKICAgICBkZWZhdWx0OiBicmVhazsKICAgICBjYXNlICdhJzoKQEAgLTI5OTksNyArMjk5MSw3IEBACiAgIE5ldEJTREkzODZUYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKQogICAgICAgOiBOZXRCU0RUYXJnZXRJbmZvPFg4Nl8zMlRhcmdldEluZm8+KFRyaXBsZSkge30KIAotICB2aXJ0dWFsIHVuc2lnbmVkIGdldEZsb2F0RXZhbE1ldGhvZCgpIGNvbnN0IHsKKyAgdW5zaWduZWQgZ2V0RmxvYXRFdmFsTWV0aG9kKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHVuc2lnbmVkIE1ham9yLCBNaW5vciwgTWljcm87CiAgICAgZ2V0VHJpcGxlKCkuZ2V0T1NWZXJzaW9uKE1ham9yLCBNaW5vciwgTWljcm8pOwogICAgIC8vIE5ldyBOZXRCU0QgdXNlcyB0aGUgZGVmYXVsdCByb3VuZGluZyBtb2RlLgpAQCAtMzA0Niw5ICszMDM4LDcgQEAKICAgICBNYXhWZWN0b3JBbGlnbiA9IDI1NjsKICAgICBTaXplVHlwZSA9IFVuc2lnbmVkTG9uZzsKICAgICBJbnRQdHJUeXBlID0gU2lnbmVkTG9uZzsKLSAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJlLXA6MzI6MzI6MzItaTE6ODo4LWk4Ojg6OC1pMTY6MTY6MTYtaTMyOjMyOjMyLSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6MzI6NjQtZjMyOjMyOjMyLWY2NDozMjo2NC12NjQ6NjQ6NjQtdjEyODoxMjg6MTI4LSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJhMDowOjY0LWY4MDoxMjg6MTI4LW44OjE2OjMyLVMxMjgiOworICAgIERlc2NyaXB0aW9uU3RyaW5nID0gImUtbTpvLXA6MzI6MzItZjY0OjMyOjY0LWY4MDoxMjgtbjg6MTY6MzItUzEyOCI7CiAgICAgSGFzQWxpZ25NYWM2OGtTdXBwb3J0ID0gdHJ1ZTsKICAgfQogCkBAIC0zMDY0LDEyICszMDU0LDEwIEBACiAgICAgVExTU3VwcG9ydGVkID0gZmFsc2U7CiAgICAgV0NoYXJUeXBlID0gVW5zaWduZWRTaG9ydDsKICAgICBEb3VibGVBbGlnbiA9IExvbmdMb25nQWxpZ24gPSA2NDsKLSAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJlLXA6MzI6MzI6MzItaTE6ODo4LWk4Ojg6OC1pMTY6MTY6MTYtaTMyOjMyOjMyLSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC1mODA6MTI4OjEyOC12NjQ6NjQ6NjQtIgotICAgICAgICAgICAgICAgICAgICAgICAgInYxMjg6MTI4OjEyOC1hMDowOjY0LWY4MDozMjozMi1uODoxNjozMi1TMzIiOworICAgIERlc2NyaXB0aW9uU3RyaW5nID0gImUtbTp3LXA6MzI6MzItaTY0OjY0LWY4MDozMi1uODoxNjozMi1TMzIiOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgV2luZG93c1RhcmdldEluZm88WDg2XzMyVGFyZ2V0SW5mbz46OmdldFRhcmdldERlZmluZXMoT3B0cywgQnVpbGRlcik7CiAgIH0KIH07CkBAIC0zMDg1LDggKzMwNzMsOCBAQAogICAgIExvbmdEb3VibGVXaWR0aCA9IExvbmdEb3VibGVBbGlnbiA9IDY0OwogICAgIExvbmdEb3VibGVGb3JtYXQgPSAmbGx2bTo6QVBGbG9hdDo6SUVFRWRvdWJsZTsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIFdpbmRvd3NYODZfMzJUYXJnZXRJbmZvOjpnZXRUYXJnZXREZWZpbmVzKE9wdHMsIEJ1aWxkZXIpOwogICAgIFdpbmRvd3NYODZfMzJUYXJnZXRJbmZvOjpnZXRWaXN1YWxTdHVkaW9EZWZpbmVzKE9wdHMsIEJ1aWxkZXIpOwogICAgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgZm9sbG93aW5nIHJlZmxlY3RzIHByb2Nlc3NvciB0eXBlLgpAQCAtMzEwMyw4ICszMDkxLDggQEAKIHB1YmxpYzoKICAgTWluR1dYODZfMzJUYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKQogICAgICAgOiBXaW5kb3dzWDg2XzMyVGFyZ2V0SW5mbyhUcmlwbGUpIHt9Ci0gIHZpcnR1YWwgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgV2luZG93c1g4Nl8zMlRhcmdldEluZm86OmdldFRhcmdldERlZmluZXMoT3B0cywgQnVpbGRlcik7CiAgICAgRGVmaW5lU3RkKEJ1aWxkZXIsICJXSU4zMiIsIE9wdHMpOwogICAgIERlZmluZVN0ZChCdWlsZGVyLCAiV0lOTlQiLCBPcHRzKTsKQEAgLTMxMzMsMTIgKzMxMjEsMTAgQEAKICAgICBUTFNTdXBwb3J0ZWQgPSBmYWxzZTsKICAgICBXQ2hhclR5cGUgPSBVbnNpZ25lZFNob3J0OwogICAgIERvdWJsZUFsaWduID0gTG9uZ0xvbmdBbGlnbiA9IDY0OwotICAgIERlc2NyaXB0aW9uU3RyaW5nID0gImUtcDozMjozMjozMi1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItIgotICAgICAgICAgICAgICAgICAgICAgICAgImk2NDo2NDo2NC1mMzI6MzI6MzItZjY0OjY0OjY0LXY2NDo2NDo2NC12MTI4OjEyODoxMjgtIgotICAgICAgICAgICAgICAgICAgICAgICAgImEwOjA6NjQtZjgwOjMyOjMyLW44OjE2OjMyLVMzMiI7CisgICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiZS1tOnctcDozMjozMi1pNjQ6NjQtZjgwOjMyLW44OjE2OjMyLVMzMiI7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBYODZfMzJUYXJnZXRJbmZvOjpnZXRUYXJnZXREZWZpbmVzKE9wdHMsIEJ1aWxkZXIpOwogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9YODZfIik7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19DWUdXSU5fXyIpOwpAQCAtMzE2Miw4ICszMTQ4LDggQEAKICAgICB0aGlzLT5Vc2VyTGFiZWxQcmVmaXggPSAiIjsKICAgICB0aGlzLT5UTFNTdXBwb3J0ZWQgPSBmYWxzZTsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIFg4Nl8zMlRhcmdldEluZm86OmdldFRhcmdldERlZmluZXMoT3B0cywgQnVpbGRlcik7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19JTlRFTF9fIik7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19IQUlLVV9fIik7CkBAIC0zMTc1LDggKzMxNjEsOCBAQAogdGVtcGxhdGU8dHlwZW5hbWUgVGFyZ2V0PgogY2xhc3MgUlRFTVNUYXJnZXRJbmZvIDogcHVibGljIE9TVGFyZ2V0SW5mbzxUYXJnZXQ+IHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIGdldE9TRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0T1NEZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKKyAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gUlRFTVMgZGVmaW5lczsgbGlzdCBiYXNlZCBvZmYgb2YgZ2NjIG91dHB1dAogCiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19ydGVtc19fIik7CkBAIC0zMjE2LDggKzMyMDIsOCBAQAogICAgIFB0ckRpZmZUeXBlID0gU2lnbmVkTG9uZzsKICAgICB0aGlzLT5Vc2VyTGFiZWxQcmVmaXggPSAiIjsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIFg4Nl8zMlRhcmdldEluZm86OmdldFRhcmdldERlZmluZXMoT3B0cywgQnVpbGRlcik7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19JTlRFTF9fIik7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19ydGVtc19fIik7CkBAIC0zMjQxLDkgKzMyMjcsNyBAQAogICAgIEludDY0VHlwZSA9IFNpZ25lZExvbmc7CiAgICAgUmVnUGFybU1heCA9IDY7CiAKLSAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJlLXA6NjQ6NjQ6NjQtaTE6ODo4LWk4Ojg6OC1pMTY6MTY6MTYtaTMyOjMyOjMyLSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC12NjQ6NjQ6NjQtdjEyODoxMjg6MTI4LSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJhMDowOjY0LXMwOjY0OjY0LWY4MDoxMjg6MTI4LW44OjE2OjMyOjY0LVMxMjgiOworICAgIERlc2NyaXB0aW9uU3RyaW5nID0gImUtbTplLWk2NDo2NC1mODA6MTI4LW44OjE2OjMyOjY0LVMxMjgiOwogCiAgICAgLy8gVXNlIGZwcmV0IG9ubHkgZm9yIGxvbmcgZG91YmxlLgogICAgIFJlYWxUeXBlVXNlc09iakNGUFJldCA9ICgxIDw8IFRhcmdldEluZm86OkxvbmdEb3VibGUpOwpAQCAtMzI1NywyMyArMzI0MSwyMyBAQAogICAgIE1heEF0b21pY1Byb21vdGVXaWR0aCA9IDEyODsKICAgICBNYXhBdG9taWNJbmxpbmVXaWR0aCA9IDY0OwogICB9Ci0gIHZpcnR1YWwgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCB7CisgIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBUYXJnZXRJbmZvOjpYODZfNjRBQklCdWlsdGluVmFMaXN0OwogICB9CiAKLSAgaW50IGdldEVIRGF0YVJlZ2lzdGVyTnVtYmVyKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgIGludCBnZXRFSERhdGFSZWdpc3Rlck51bWJlcih1bnNpZ25lZCBSZWdObykgY29uc3Qgb3ZlcnJpZGUgewogICAgIGlmIChSZWdObyA9PSAwKSByZXR1cm4gMDsKICAgICBpZiAoUmVnTm8gPT0gMSkgcmV0dXJuIDE7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKLSAgdmlydHVhbCBDYWxsaW5nQ29udkNoZWNrUmVzdWx0IGNoZWNrQ2FsbGluZ0NvbnZlbnRpb24oQ2FsbGluZ0NvbnYgQ0MpIGNvbnN0IHsKKyAgQ2FsbGluZ0NvbnZDaGVja1Jlc3VsdCBjaGVja0NhbGxpbmdDb252ZW50aW9uKENhbGxpbmdDb252IENDKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIChDQyA9PSBDQ19DIHx8CiAgICAgICAgICAgICBDQyA9PSBDQ19JbnRlbE9jbEJpY2MgfHwKICAgICAgICAgICAgIENDID09IENDX1g4Nl82NFdpbjY0KSA/IENDQ1JfT0sgOiBDQ0NSX1dhcm5pbmc7CiAgIH0KIAotICB2aXJ0dWFsIENhbGxpbmdDb252IGdldERlZmF1bHRDYWxsaW5nQ29udihDYWxsaW5nQ29udk1ldGhvZFR5cGUgTVQpIGNvbnN0IHsKKyAgQ2FsbGluZ0NvbnYgZ2V0RGVmYXVsdENhbGxpbmdDb252KENhbGxpbmdDb252TWV0aG9kVHlwZSBNVCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBDQ19DOwogICB9CiAKQEAgLTMyOTgsMTUgKzMyODIsMTUgQEAKICAgICBJbnRQdHJUeXBlID0gU2lnbmVkTG9uZ0xvbmc7CiAgICAgdGhpcy0+VXNlckxhYmVsUHJlZml4ID0gIiI7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIFdpbmRvd3NUYXJnZXRJbmZvPFg4Nl82NFRhcmdldEluZm8+OjpnZXRUYXJnZXREZWZpbmVzKE9wdHMsIEJ1aWxkZXIpOwogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9XSU42NCIpOwogICB9Ci0gIHZpcnR1YWwgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCB7CisgIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBUYXJnZXRJbmZvOjpDaGFyUHRyQnVpbHRpblZhTGlzdDsKICAgfQotICB2aXJ0dWFsIENhbGxpbmdDb252Q2hlY2tSZXN1bHQgY2hlY2tDYWxsaW5nQ29udmVudGlvbihDYWxsaW5nQ29udiBDQykgY29uc3QgeworICBDYWxsaW5nQ29udkNoZWNrUmVzdWx0IGNoZWNrQ2FsbGluZ0NvbnZlbnRpb24oQ2FsbGluZ0NvbnYgQ0MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gKENDID09IENDX0MgfHwKICAgICAgICAgICAgIENDID09IENDX0ludGVsT2NsQmljYyB8fAogICAgICAgICAgICAgQ0MgPT0gQ0NfWDg2XzY0U3lzVikgPyBDQ0NSX09LIDogQ0NDUl9XYXJuaW5nOwpAQCAtMzMyMyw4ICszMzA3LDggQEAKICAgICBMb25nRG91YmxlV2lkdGggPSBMb25nRG91YmxlQWxpZ24gPSA2NDsKICAgICBMb25nRG91YmxlRm9ybWF0ID0gJmxsdm06OkFQRmxvYXQ6OklFRUVkb3VibGU7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBXaW5kb3dzWDg2XzY0VGFyZ2V0SW5mbzo6Z2V0VGFyZ2V0RGVmaW5lcyhPcHRzLCBCdWlsZGVyKTsKICAgICBXaW5kb3dzWDg2XzY0VGFyZ2V0SW5mbzo6Z2V0VmlzdWFsU3R1ZGlvRGVmaW5lcyhPcHRzLCBCdWlsZGVyKTsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfTV9YNjQiKTsKQEAgLTMzMzksOCArMzMyMyw4IEBACiBwdWJsaWM6CiAgIE1pbkdXWDg2XzY0VGFyZ2V0SW5mbyhjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkKICAgICAgIDogV2luZG93c1g4Nl82NFRhcmdldEluZm8oVHJpcGxlKSB7fQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIFdpbmRvd3NYODZfNjRUYXJnZXRJbmZvOjpnZXRUYXJnZXREZWZpbmVzKE9wdHMsIEJ1aWxkZXIpOwogICAgIERlZmluZVN0ZChCdWlsZGVyLCAiV0lONjQiLCBPcHRzKTsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX01TVkNSVF9fIik7CkBAIC0zMzY2LDYgKzMzNTAsMTEgQEAKICAgICAgIDogRGFyd2luVGFyZ2V0SW5mbzxYODZfNjRUYXJnZXRJbmZvPihUcmlwbGUpIHsKICAgICBJbnQ2NFR5cGUgPSBTaWduZWRMb25nTG9uZzsKICAgICBNYXhWZWN0b3JBbGlnbiA9IDI1NjsKKyAgICAvLyBUaGUgNjQtYml0IGlPUyBzaW11bGF0b3IgdXNlcyB0aGUgYnVpbHRpbiBib29sIHR5cGUgZm9yIE9iamVjdGl2ZS1DLgorICAgIGxsdm06OlRyaXBsZSBUID0gbGx2bTo6VHJpcGxlKFRyaXBsZSk7CisgICAgaWYgKFQuZ2V0T1MoKSA9PSBsbHZtOjpUcmlwbGU6OklPUykKKyAgICAgIFVzZVNpZ25lZENoYXJGb3JPYmpDQm9vbCA9IGZhbHNlOworICAgIERlc2NyaXB0aW9uU3RyaW5nID0gImUtbTpvLWk2NDo2NC1mODA6MTI4LW44OjE2OjMyOjY0LVMxMjgiOwogICB9CiB9OwogfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQpAQCAtMzM5Niw2ICszMzg1LDcgQEAKIAogbmFtZXNwYWNlIHsKIGNsYXNzIEFBcmNoNjRUYXJnZXRJbmZvIDogcHVibGljIFRhcmdldEluZm8geworICB2aXJ0dWFsIHZvaWQgc2V0RGVzY3JpcHRpb25TdHJpbmcoKSA9IDA7CiAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgR0NDUmVnTmFtZXNbXTsKICAgc3RhdGljIGNvbnN0IFRhcmdldEluZm86OkdDQ1JlZ0FsaWFzIEdDQ1JlZ0FsaWFzZXNbXTsKIApAQCAtMzQxMCwxNiArMzQwMCwyMyBAQAogCiBwdWJsaWM6CiAgIEFBcmNoNjRUYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKSA6IFRhcmdldEluZm8oVHJpcGxlKSB7Ci0gICAgQmlnRW5kaWFuID0gZmFsc2U7CiAgICAgTG9uZ1dpZHRoID0gTG9uZ0FsaWduID0gNjQ7CiAgICAgTG9uZ0RvdWJsZVdpZHRoID0gTG9uZ0RvdWJsZUFsaWduID0gMTI4OwogICAgIFBvaW50ZXJXaWR0aCA9IFBvaW50ZXJBbGlnbiA9IDY0OwogICAgIFN1aXRhYmxlQWxpZ24gPSAxMjg7Ci0gICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiZS1wOjY0OjY0LWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAiaTY0OjY0OjY0LWkxMjg6MTI4OjEyOC1mMzI6MzI6MzItZjY0OjY0OjY0LSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmMTI4OjEyODoxMjgtbjMyOjY0LVMxMjgiOwogCiAgICAgV0NoYXJUeXBlID0gVW5zaWduZWRJbnQ7CisgICAgaWYgKGdldFRyaXBsZSgpLmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpOZXRCU0QpIHsKKyAgICAgIFdDaGFyVHlwZSA9IFNpZ25lZEludDsKKyAgICAgIEludDY0VHlwZSA9IFNpZ25lZExvbmdMb25nOworICAgICAgSW50TWF4VHlwZSA9IFNpZ25lZExvbmdMb25nOworICAgICAgVUludE1heFR5cGUgPSBVbnNpZ25lZExvbmdMb25nOworICAgIH0gZWxzZSB7CisgICAgICBXQ2hhclR5cGUgPSBVbnNpZ25lZEludDsKKyAgICAgIEludDY0VHlwZSA9IFNpZ25lZExvbmc7CisgICAgICBJbnRNYXhUeXBlID0gU2lnbmVkTG9uZzsKKyAgICAgIFVJbnRNYXhUeXBlID0gVW5zaWduZWRMb25nOworICAgIH0KICAgICBMb25nRG91YmxlRm9ybWF0ID0gJmxsdm06OkFQRmxvYXQ6OklFRUVxdWFkOwogCiAgICAgLy8gQUFyY2g2NCBiYWNrZW5kIHN1cHBvcnRzIDY0LWJpdCBvcGVyYXRpb25zIGF0IHRoZSBtb21lbnQuIEluIHByaW5jaXBsZQpAQCAtMzQyOCwxMSArMzQyNSwxMCBAQAogCiAgICAgVGhlQ1hYQUJJLnNldChUYXJnZXRDWFhBQkk6OkdlbmVyaWNBQXJjaDY0KTsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIEdDQyBkZWZpbmVzIHRoZXNlcyBjdXJyZW50bHkKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX2FhcmNoNjRfXyIpOwotICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQUFSQ0g2NEVMX18iKTsKIAogICAgIC8vIEFDTEUgcHJlZGVmaW5lcy4gTWFueSBjYW4gb25seSBoYXZlIG9uZSBwb3NzaWJsZSB2YWx1ZSBvbiB2OCBBQXJjaDY0LgogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNX0FDTEUiLCAgICAgICAgICIyMDAiKTsKQEAgLTM0NjksOSArMzQ2NSw2IEBACiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fU0laRU9GX01JTklNQUxfRU5VTSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBPcHRzLlNob3J0RW51bXMgPyAiMSIgOiAiNCIpOwogCi0gICAgaWYgKEJpZ0VuZGlhbikKLSAgICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQUFSQ0hfQklHX0VORElBTiIpOwotCiAgICAgaWYgKEZQVSA9PSBOZW9uTW9kZSkgewogICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fTkVPTiIpOwogICAgICAgLy8gNjQtYml0IE5FT04gc3VwcG9ydHMgaGFsZiwgc2luZ2xlIGFuZCBkb3VibGUgcHJlY2lzaW9uIG9wZXJhdGlvbnMuCkBAIC0zNDgyLDI0ICszNDc1LDI0IEBACiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0FSTV9GRUFUVVJFX0NSWVBUTyIpOwogICAgIH0KICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0QnVpbHRpbnMoY29uc3QgQnVpbHRpbjo6SW5mbyAqJlJlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtUmVjb3JkcykgY29uc3QgeworICB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1SZWNvcmRzKSBjb25zdCBvdmVycmlkZSB7CiAgICAgUmVjb3JkcyA9IEJ1aWx0aW5JbmZvOwogICAgIE51bVJlY29yZHMgPSBjbGFuZzo6QUFyY2g2NDo6TGFzdFRTQnVpbHRpbi1CdWlsdGluOjpGaXJzdFRTQnVpbHRpbjsKICAgfQotICB2aXJ0dWFsIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3QgeworICBib29sIGhhc0ZlYXR1cmUoU3RyaW5nUmVmIEZlYXR1cmUpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gRmVhdHVyZSA9PSAiYWFyY2g2NCIgfHwgKEZlYXR1cmUgPT0gIm5lb24iICYmIEZQVSA9PSBOZW9uTW9kZSk7CiAgIH0KIAotICB2aXJ0dWFsIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGxsdm06OlN0cmluZ1N3aXRjaDxib29sPihOYW1lKQogICAgICAgICAgICAgIC5DYXNlKCJnZW5lcmljIiwgdHJ1ZSkKICAgICAgICAgICAgICAuQ2FzZXMoImNvcnRleC1hNTMiLCAiY29ydGV4LWE1NyIsIHRydWUpCiAgICAgICAgICAgICAgLkRlZmF1bHQoZmFsc2UpOwogICB9CiAKLSAgdmlydHVhbCBib29sIGhhbmRsZVRhcmdldEZlYXR1cmVzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmRmVhdHVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpIHsKKyAgYm9vbCBoYW5kbGVUYXJnZXRGZWF0dXJlcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFncykgb3ZlcnJpZGUgewogICAgIEZQVSA9IEZQVU1vZGU7CiAgICAgQ3J5cHRvID0gMDsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRmVhdHVyZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgewpAQCAtMzUwOCwxOCArMzUwMSwyMSBAQAogICAgICAgaWYgKEZlYXR1cmVzW2ldID09ICIrY3J5cHRvIikKICAgICAgICAgQ3J5cHRvID0gMTsKICAgICB9CisKKyAgICBzZXREZXNjcmlwdGlvblN0cmluZygpOworCiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgZ2V0R0NDUmVnTmFtZXMoY29uc3QgY2hhciAqY29uc3QgKiZOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdBbGlhc2VzKGNvbnN0IEdDQ1JlZ0FsaWFzIComQWxpYXNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0OworICB2b2lkIGdldEdDQ1JlZ05hbWVzKGNvbnN0IGNoYXIgKmNvbnN0IComTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBnZXRHQ0NSZWdBbGlhc2VzKGNvbnN0IEdDQ1JlZ0FsaWFzIComQWxpYXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1BbGlhc2VzKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIGJvb2wgaXNDTFpGb3JaZXJvVW5kZWYoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBib29sIGlzQ0xaRm9yWmVyb1VuZGVmKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAotICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm86OkNvbnN0cmFpbnRJbmZvICZJbmZvKSBjb25zdCB7CisgIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmSW5mbykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHN3aXRjaCAoKk5hbWUpIHsKICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CiAgICAgY2FzZSAndyc6IC8vIEFuIEZQL1NJTUQgdmVjdG9yIHJlZ2lzdGVyCkBAIC0zNTQ5LDEyICszNTQ1LDEyIEBACiAgICAgfQogICB9CiAKLSAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRDbG9iYmVycygpIGNvbnN0IHsKKyAgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gVGhlcmUgYXJlIG5vIEFBcmNoNjQgY2xvYmJlcnMgc2hhcmVkIGJ5IGFsbCBhc20gc3RhdGVtZW50cy4KICAgICByZXR1cm4gIiI7CiAgIH0KIAotICB2aXJ0dWFsIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3QgeworICBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gVGFyZ2V0SW5mbzo6QUFyY2g2NEFCSUJ1aWx0aW5WYUxpc3Q7CiAgIH0KIH07CkBAIC0zNjIwLDkgKzM2MTYsNDggQEAKICNkZWZpbmUgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpIHsgI0lELCBUWVBFLCBBVFRSUywgMCwgQUxMX0xBTkdVQUdFUyB9LAogI2RlZmluZSBMSUJCVUlMVElOKElELCBUWVBFLCBBVFRSUywgSEVBREVSKSB7ICNJRCwgVFlQRSwgQVRUUlMsIEhFQURFUixcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxMX0xBTkdVQUdFUyB9LAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zTkVPTi5kZWYiCisKKyNkZWZpbmUgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpIHsgI0lELCBUWVBFLCBBVFRSUywgMCwgQUxMX0xBTkdVQUdFUyB9LAorI2RlZmluZSBMSUJCVUlMVElOKElELCBUWVBFLCBBVFRSUywgSEVBREVSKSB7ICNJRCwgVFlQRSwgQVRUUlMsIEhFQURFUixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxMX0xBTkdVQUdFUyB9LAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zQUFyY2g2NC5kZWYiCiB9OwogCitjbGFzcyBBQXJjaDY0bGVUYXJnZXRJbmZvIDogcHVibGljIEFBcmNoNjRUYXJnZXRJbmZvIHsKKyAgdm9pZCBzZXREZXNjcmlwdGlvblN0cmluZygpIG92ZXJyaWRlIHsKKyAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJlLW06ZS1pNjQ6NjQtaTEyODoxMjgtbjMyOjY0LVMxMjgiOworICB9CisKK3B1YmxpYzoKKyAgQUFyY2g2NGxlVGFyZ2V0SW5mbyhjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkKKyAgICA6IEFBcmNoNjRUYXJnZXRJbmZvKFRyaXBsZSkgeworICAgIEJpZ0VuZGlhbiA9IGZhbHNlOworICAgIH0KKyAgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BQVJDSDY0RUxfXyIpOworICAgIEFBcmNoNjRUYXJnZXRJbmZvOjpnZXRUYXJnZXREZWZpbmVzKE9wdHMsIEJ1aWxkZXIpOworICB9Cit9OworCitjbGFzcyBBQXJjaDY0YmVUYXJnZXRJbmZvIDogcHVibGljIEFBcmNoNjRUYXJnZXRJbmZvIHsKKyAgdm9pZCBzZXREZXNjcmlwdGlvblN0cmluZygpIG92ZXJyaWRlIHsKKyAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJFLW06ZS1pNjQ6NjQtaTEyODoxMjgtbjMyOjY0LVMxMjgiOworICB9CisKK3B1YmxpYzoKKyAgQUFyY2g2NGJlVGFyZ2V0SW5mbyhjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkKKyAgICA6IEFBcmNoNjRUYXJnZXRJbmZvKFRyaXBsZSkgeyB9CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQUFSQ0g2NEVCX18iKTsKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0FBUkNIX0JJR19FTkRJQU4iKTsKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0FSTV9CSUdfRU5ESUFOIik7CisgICAgQUFyY2g2NFRhcmdldEluZm86OmdldFRhcmdldERlZmluZXMoT3B0cywgQnVpbGRlcik7CisgIH0KK307CisKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIAogbmFtZXNwYWNlIHsKQEAgLTM2NjgsNiArMzcwMyw3IEBACiAgIHVuc2lnbmVkIFNvZnRGbG9hdEFCSSA6IDE7CiAKICAgdW5zaWduZWQgQ1JDIDogMTsKKyAgdW5zaWduZWQgQ3J5cHRvIDogMTsKIAogICBzdGF0aWMgY29uc3QgQnVpbHRpbjo6SW5mbyBCdWlsdGluSW5mb1tdOwogCkBAIC0zNjgzLDQwICszNzE5LDE1MyBAQAogICAgICAgICBULmdldE9TKCkgIT0gbGx2bTo6VHJpcGxlOjpCaXRyaWcpCiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgU3RyaW5nUmVmIEFyY2hOYW1lID0gVC5nZXRBcmNoTmFtZSgpOwotICAgIGlmIChULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSkgewotICAgICAgaWYgKCFBcmNoTmFtZS5zdGFydHN3aXRoKCJhcm12IikpCisgICAgaWYgKFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtIHx8CisgICAgICAgIFQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtZWIpIHsKKyAgICAgIFN0cmluZ1JlZiBWZXJzaW9uU3RyOworICAgICAgaWYgKEFyY2hOYW1lLnN0YXJ0c3dpdGgoImFybXYiKSkKKyAgICAgICAgVmVyc2lvblN0ciA9IEFyY2hOYW1lLnN1YnN0cig0KTsKKyAgICAgIGVsc2UgaWYgKEFyY2hOYW1lLnN0YXJ0c3dpdGgoImFybWVidiIpKQorICAgICAgICBWZXJzaW9uU3RyID0gQXJjaE5hbWUuc3Vic3RyKDYpOworICAgICAgZWxzZQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBTdHJpbmdSZWYgVmVyc2lvblN0ciA9IEFyY2hOYW1lLnN1YnN0cig0KTsKICAgICAgIHVuc2lnbmVkIFZlcnNpb247CiAgICAgICBpZiAoVmVyc2lvblN0ci5nZXRBc0ludGVnZXIoMTAsIFZlcnNpb24pKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICByZXR1cm4gVmVyc2lvbiA+PSA2OwogICAgIH0KLSAgICBhc3NlcnQoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYik7Ci0gICAgaWYgKCFBcmNoTmFtZS5zdGFydHN3aXRoKCJ0aHVtYnYiKSkKKyAgICBhc3NlcnQoVC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYiB8fAorICAgICAgICAgICBULmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iZWIpOworICAgIFN0cmluZ1JlZiBWZXJzaW9uU3RyOworICAgIGlmIChBcmNoTmFtZS5zdGFydHN3aXRoKCJ0aHVtYnYiKSkKKyAgICAgIFZlcnNpb25TdHIgPSBBcmNoTmFtZS5zdWJzdHIoNik7CisgICAgZWxzZSBpZiAoQXJjaE5hbWUuc3RhcnRzd2l0aCgidGh1bWJlYnYiKSkKKyAgICAgIFZlcnNpb25TdHIgPSBBcmNoTmFtZS5zdWJzdHIoOCk7CisgICAgZWxzZQogICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFN0cmluZ1JlZiBWZXJzaW9uU3RyID0gQXJjaE5hbWUuc3Vic3RyKDYpOwogICAgIHVuc2lnbmVkIFZlcnNpb247CiAgICAgaWYgKFZlcnNpb25TdHIuZ2V0QXNJbnRlZ2VyKDEwLCBWZXJzaW9uKSkKICAgICAgIHJldHVybiBmYWxzZTsKICAgICByZXR1cm4gVmVyc2lvbiA+PSA3OwogICB9CiAKLXB1YmxpYzoKLSAgQVJNVGFyZ2V0SW5mbyhjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkKLSAgICAgIDogVGFyZ2V0SW5mbyhUcmlwbGUpLCBBQkkoImFhcGNzLWxpbnV4IiksIENQVSgiYXJtMTEzNmotcyIpLAotICAgICAgICBGUE1hdGgoRlBfRGVmYXVsdCksIElzQUFQQ1ModHJ1ZSkgewotICAgIEJpZ0VuZGlhbiA9IGZhbHNlOwotICAgIHN3aXRjaCAoZ2V0VHJpcGxlKCkuZ2V0T1MoKSkgewotICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpOZXRCU0Q6CisgIHZvaWQgc2V0QUJJQUFQQ1MoKSB7CisgICAgSXNBQVBDUyA9IHRydWU7CisKKyAgICBEb3VibGVBbGlnbiA9IExvbmdMb25nQWxpZ24gPSBMb25nRG91YmxlQWxpZ24gPSBTdWl0YWJsZUFsaWduID0gNjQ7CisgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUID0gZ2V0VHJpcGxlKCk7CisKKyAgICAvLyBzaXplX3QgaXMgdW5zaWduZWQgbG9uZyBvbiBEYXJ3aW4gYW5kIE5ldEJTRC4KKyAgICBpZiAoVC5pc09TRGFyd2luKCkgfHwgVC5nZXRPUygpID09IGxsdm06OlRyaXBsZTo6TmV0QlNEKQogICAgICAgU2l6ZVR5cGUgPSBVbnNpZ25lZExvbmc7Ci0gICAgICBQdHJEaWZmVHlwZSA9IFNpZ25lZExvbmc7CisgICAgZWxzZQorICAgICAgU2l6ZVR5cGUgPSBVbnNpZ25lZEludDsKKworICAgIGlmIChULmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpOZXRCU0QpIHsKICAgICAgIFdDaGFyVHlwZSA9IFNpZ25lZEludDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6CisgICAgfSBlbHNlIHsKICAgICAgIC8vIEFBUENTIDcuMS4xLCBBUk0tTGludXggQUJJIDIuNDogdHlwZSBvZiB3Y2hhcl90IGlzIHVuc2lnbmVkIGludC4KICAgICAgIFdDaGFyVHlwZSA9IFVuc2lnbmVkSW50OworICAgIH0KKworICAgIFVzZUJpdEZpZWxkVHlwZUFsaWdubWVudCA9IHRydWU7CisKKyAgICBaZXJvTGVuZ3RoQml0ZmllbGRCb3VuZGFyeSA9IDA7CisKKyAgICBpZiAoSXNUaHVtYikgeworICAgICAgLy8gVGh1bWIxIGFkZCBzcCwgI2ltbSByZXF1aXJlcyB0aGUgaW1tZWRpYXRlIHZhbHVlIGJlIG11bHRpcGxlIG9mIDQsCisgICAgICAvLyBzbyBzZXQgcHJlZmVycmVkIGZvciBzbWFsbCB0eXBlcyB0byAzMi4KKyAgICAgIGlmIChULmlzT1NCaW5Gb3JtYXRNYWNoTygpKQorICAgICAgICBEZXNjcmlwdGlvblN0cmluZyA9IEJpZ0VuZGlhbiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS1tOm8tcDozMjozMi1pMTo4OjMyLWk4Ojg6MzItaTE2OjE2OjMyLWk2NDo2NC0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidjEyODo2NDoxMjgtYTowOjMyLW4zMi1TNjQiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlLW06by1wOjMyOjMyLWkxOjg6MzItaTg6ODozMi1pMTY6MTY6MzItaTY0OjY0LSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2MTI4OjY0OjEyOC1hOjA6MzItbjMyLVM2NCI7CisgICAgICBlbHNlCisgICAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gQmlnRW5kaWFuID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLW06ZS1wOjMyOjMyLWkxOjg6MzItaTg6ODozMi1pMTY6MTY6MzItaTY0OjY0LSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2MTI4OjY0OjEyOC1hOjA6MzItbjMyLVM2NCIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImUtbTplLXA6MzI6MzItaTE6ODozMi1pODo4OjMyLWkxNjoxNjozMi1pNjQ6NjQtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInYxMjg6NjQ6MTI4LWE6MDozMi1uMzItUzY0IjsKKworICAgIH0gZWxzZSB7CisgICAgICBpZiAoVC5pc09TQmluRm9ybWF0TWFjaE8oKSkKKyAgICAgICAgRGVzY3JpcHRpb25TdHJpbmcgPSBCaWdFbmRpYW4gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUtbTpvLXA6MzI6MzItaTY0OjY0LXYxMjg6NjQ6MTI4LW4zMi1TNjQiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlLW06by1wOjMyOjMyLWk2NDo2NC12MTI4OjY0OjEyOC1uMzItUzY0IjsKKyAgICAgIGVsc2UKKyAgICAgICAgRGVzY3JpcHRpb25TdHJpbmcgPSBCaWdFbmRpYW4gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUtbTplLXA6MzI6MzItaTY0OjY0LXYxMjg6NjQ6MTI4LW4zMi1TNjQiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlLW06ZS1wOjMyOjMyLWk2NDo2NC12MTI4OjY0OjEyOC1uMzItUzY0IjsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogRW51bWVyYXRlZCB0eXBlcyBhcmUgdmFyaWFibGUgd2lkdGggaW4gc3RyYWlnaHQgQUFQQ1MuCisgIH0KKworICB2b2lkIHNldEFCSUFQQ1MoKSB7CisgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUID0gZ2V0VHJpcGxlKCk7CisKKyAgICBJc0FBUENTID0gZmFsc2U7CisKKyAgICBEb3VibGVBbGlnbiA9IExvbmdMb25nQWxpZ24gPSBMb25nRG91YmxlQWxpZ24gPSBTdWl0YWJsZUFsaWduID0gMzI7CisKKyAgICAvLyBzaXplX3QgaXMgdW5zaWduZWQgaW50IG9uIEZyZWVCU0QuCisgICAgaWYgKFQuZ2V0T1MoKSA9PSBsbHZtOjpUcmlwbGU6OkZyZWVCU0QpCiAgICAgICBTaXplVHlwZSA9IFVuc2lnbmVkSW50OworICAgIGVsc2UKKyAgICAgIFNpemVUeXBlID0gVW5zaWduZWRMb25nOworCisgICAgLy8gUmV2ZXJ0IHRvIHVzaW5nIFNpZ25lZEludCBvbiBhcGNzLWdudSB0byBjb21wbHkgd2l0aCBleGlzdGluZyBiZWhhdmlvdXIuCisgICAgV0NoYXJUeXBlID0gU2lnbmVkSW50OworCisgICAgLy8gRG8gbm90IHJlc3BlY3QgdGhlIGFsaWdubWVudCBvZiBiaXQtZmllbGQgdHlwZXMgd2hlbiBsYXlpbmcgb3V0CisgICAgLy8gc3RydWN0dXJlcy4gVGhpcyBjb3JyZXNwb25kcyB0byBQQ0NfQklURklFTERfVFlQRV9NQVRURVJTIGluIGdjYy4KKyAgICBVc2VCaXRGaWVsZFR5cGVBbGlnbm1lbnQgPSBmYWxzZTsKKworICAgIC8vLyBnY2MgZm9yY2VzIHRoZSBhbGlnbm1lbnQgdG8gNCBieXRlcywgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBvZiB0aGUKKyAgICAvLy8gemVybyBsZW5ndGggYml0ZmllbGQuICBUaGlzIGNvcnJlc3BvbmRzIHRvIEVNUFRZX0ZJRUxEX0JPVU5EQVJZIGluCisgICAgLy8vIGdjYy4KKyAgICBaZXJvTGVuZ3RoQml0ZmllbGRCb3VuZGFyeSA9IDMyOworCisgICAgaWYgKElzVGh1bWIpIHsKKyAgICAgIC8vIFRodW1iMSBhZGQgc3AsICNpbW0gcmVxdWlyZXMgdGhlIGltbWVkaWF0ZSB2YWx1ZSBiZSBtdWx0aXBsZSBvZiA0LAorICAgICAgLy8gc28gc2V0IHByZWZlcnJlZCBmb3Igc21hbGwgdHlwZXMgdG8gMzIuCisgICAgICBpZiAoVC5pc09TQmluRm9ybWF0TWFjaE8oKSkKKyAgICAgICAgRGVzY3JpcHRpb25TdHJpbmcgPSBCaWdFbmRpYW4gPworICAgICAgICAgICAgIkUtbTpvLXA6MzI6MzItaTE6ODozMi1pODo4OjMyLWkxNjoxNjozMi1mNjQ6MzI6NjQiCisgICAgICAgICAgICAiLXY2NDozMjo2NC12MTI4OjMyOjEyOC1hOjA6MzItbjMyLVMzMiIgOgorICAgICAgICAgICAgImUtbTpvLXA6MzI6MzItaTE6ODozMi1pODo4OjMyLWkxNjoxNjozMi1mNjQ6MzI6NjQiCisgICAgICAgICAgICAiLXY2NDozMjo2NC12MTI4OjMyOjEyOC1hOjA6MzItbjMyLVMzMiI7CisgICAgICBlbHNlCisgICAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gQmlnRW5kaWFuID8KKyAgICAgICAgICAgICJFLW06ZS1wOjMyOjMyLWkxOjg6MzItaTg6ODozMi1pMTY6MTY6MzItZjY0OjMyOjY0IgorICAgICAgICAgICAgIi12NjQ6MzI6NjQtdjEyODozMjoxMjgtYTowOjMyLW4zMi1TMzIiIDoKKyAgICAgICAgICAgICJlLW06ZS1wOjMyOjMyLWkxOjg6MzItaTg6ODozMi1pMTY6MTY6MzItZjY0OjMyOjY0IgorICAgICAgICAgICAgIi12NjQ6MzI6NjQtdjEyODozMjoxMjgtYTowOjMyLW4zMi1TMzIiOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoVC5pc09TQmluRm9ybWF0TWFjaE8oKSkKKyAgICAgICAgRGVzY3JpcHRpb25TdHJpbmcgPSBCaWdFbmRpYW4gPworICAgICAgICAgICAgIkUtbTpvLXA6MzI6MzItZjY0OjMyOjY0LXY2NDozMjo2NC12MTI4OjMyOjEyOC1hOjA6MzItbjMyLVMzMiIgOgorICAgICAgICAgICAgImUtbTpvLXA6MzI6MzItZjY0OjMyOjY0LXY2NDozMjo2NC12MTI4OjMyOjEyOC1hOjA6MzItbjMyLVMzMiI7CisgICAgICBlbHNlCisgICAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gQmlnRW5kaWFuID8KKyAgICAgICAgICAgICJFLW06ZS1wOjMyOjMyLWY2NDozMjo2NC12NjQ6MzI6NjQtdjEyODozMjoxMjgtYTowOjMyLW4zMi1TMzIiIDoKKyAgICAgICAgICAgICJlLW06ZS1wOjMyOjMyLWY2NDozMjo2NC12NjQ6MzI6NjQtdjEyODozMjoxMjgtYTowOjMyLW4zMi1TMzIiOworICAgIH0KKworICAgIC8vIEZJWE1FOiBPdmVycmlkZSAicHJlZmVycmVkIGFsaWduIiBmb3IgZG91YmxlIGFuZCBsb25nIGxvbmcuCisgIH0KKworcHVibGljOgorICBBUk1UYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLCBib29sIElzQmlnRW5kaWFuKQorICAgICAgOiBUYXJnZXRJbmZvKFRyaXBsZSksIENQVSgiYXJtMTEzNmotcyIpLCBGUE1hdGgoRlBfRGVmYXVsdCksCisgICAgICAgIElzQUFQQ1ModHJ1ZSkgeworICAgIEJpZ0VuZGlhbiA9IElzQmlnRW5kaWFuOworCisgICAgc3dpdGNoIChnZXRUcmlwbGUoKS5nZXRPUygpKSB7CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6Ok5ldEJTRDoKKyAgICAgIFB0ckRpZmZUeXBlID0gU2lnbmVkTG9uZzsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CiAgICAgICBQdHJEaWZmVHlwZSA9IFNpZ25lZEludDsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTM3MjcsMTcgKzM4NzYsOCBAQAogCiAgICAgLy8gRklYTUU6IFNob3VsZCB3ZSBqdXN0IHRyZWF0IHRoaXMgYXMgYSBmZWF0dXJlPwogICAgIElzVGh1bWIgPSBnZXRUcmlwbGUoKS5nZXRBcmNoTmFtZSgpLnN0YXJ0c3dpdGgoInRodW1iIik7Ci0gICAgaWYgKElzVGh1bWIpIHsKLSAgICAgIC8vIFRodW1iMSBhZGQgc3AsICNpbW0gcmVxdWlyZXMgdGhlIGltbWVkaWF0ZSB2YWx1ZSBiZSBtdWx0aXBsZSBvZiA0LAotICAgICAgLy8gc28gc2V0IHByZWZlcnJlZCBmb3Igc21hbGwgdHlwZXMgdG8gMzIuCi0gICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICgiZS1wOjMyOjMyOjMyLWkxOjg6MzItaTg6ODozMi1pMTY6MTY6MzItaTMyOjMyOjMyLSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidjY0OjY0OjY0LXYxMjg6NjQ6MTI4LWEwOjA6MzItbjMyLVM2NCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICgiZS1wOjMyOjMyOjMyLWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0OjY0OjY0LWYzMjozMjozMi1mNjQ6NjQ6NjQtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgInY2NDo2NDo2NC12MTI4OjY0OjEyOC1hMDowOjY0LW4zMi1TNjQiKTsKLSAgICB9CisKKyAgICBzZXRBQkkoImFhcGNzLWxpbnV4Iik7CiAKICAgICAvLyBBUk0gdGFyZ2V0cyBkZWZhdWx0IHRvIHVzaW5nIHRoZSBBUk0gQysrIEFCSS4KICAgICBUaGVDWFhBQkkuc2V0KFRhcmdldENYWEFCSTo6R2VuZXJpY0FSTSk7CkBAIC0zNzUzLDggKzM4OTMsOCBAQAogICAgIC8vIHplcm8gbGVuZ3RoIGJpdGZpZWxkLgogICAgIFVzZVplcm9MZW5ndGhCaXRmaWVsZEFsaWdubWVudCA9IHRydWU7CiAgIH0KLSAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRBQkkoKSBjb25zdCB7IHJldHVybiBBQkkuY19zdHIoKTsgfQotICB2aXJ0dWFsIGJvb2wgc2V0QUJJKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgIGNvbnN0IGNoYXIgKmdldEFCSSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEFCSS5jX3N0cigpOyB9CisgIGJvb2wgc2V0QUJJKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBvdmVycmlkZSB7CiAgICAgQUJJID0gTmFtZTsKIAogICAgIC8vIFRoZSBkZWZhdWx0cyAoYWJvdmUpIGFyZSBmb3IgQUFQQ1MsIGNoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZW0uCkBAIC0zNzYyLDUzICszOTAyLDIyIEBACiAgICAgLy8gRklYTUU6IFdlIG5lZWQgc3VwcG9ydCBmb3IgLW1lYWJpLi4uIHdlIGNvdWxkIGp1c3QgbWFuZ2xlIGl0IGludG8gdGhlCiAgICAgLy8gbmFtZS4KICAgICBpZiAoTmFtZSA9PSAiYXBjcy1nbnUiKSB7Ci0gICAgICBEb3VibGVBbGlnbiA9IExvbmdMb25nQWxpZ24gPSBMb25nRG91YmxlQWxpZ24gPSBTdWl0YWJsZUFsaWduID0gMzI7Ci0gICAgICAvLyBzaXplX3QgaXMgdW5zaWduZWQgaW50IG9uIEZyZWVCU0QuCi0gICAgICBpZiAoZ2V0VHJpcGxlKCkuZ2V0T1MoKSAhPSBsbHZtOjpUcmlwbGU6OkZyZWVCU0QpCi0gICAgICAgIFNpemVUeXBlID0gVW5zaWduZWRMb25nOwotCi0gICAgICAvLyBSZXZlcnQgdG8gdXNpbmcgU2lnbmVkSW50IG9uIGFwY3MtZ251IHRvIGNvbXBseSB3aXRoIGV4aXN0aW5nIGJlaGF2aW91ci4KLSAgICAgIFdDaGFyVHlwZSA9IFNpZ25lZEludDsKLQotICAgICAgLy8gRG8gbm90IHJlc3BlY3QgdGhlIGFsaWdubWVudCBvZiBiaXQtZmllbGQgdHlwZXMgd2hlbiBsYXlpbmcgb3V0Ci0gICAgICAvLyBzdHJ1Y3R1cmVzLiBUaGlzIGNvcnJlc3BvbmRzIHRvIFBDQ19CSVRGSUVMRF9UWVBFX01BVFRFUlMgaW4gZ2NjLgotICAgICAgVXNlQml0RmllbGRUeXBlQWxpZ25tZW50ID0gZmFsc2U7Ci0KLSAgICAgIC8vLyBnY2MgZm9yY2VzIHRoZSBhbGlnbm1lbnQgdG8gNCBieXRlcywgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBvZiB0aGUKLSAgICAgIC8vLyB6ZXJvIGxlbmd0aCBiaXRmaWVsZC4gIFRoaXMgY29ycmVzcG9uZHMgdG8gRU1QVFlfRklFTERfQk9VTkRBUlkgaW4KLSAgICAgIC8vLyBnY2MuCi0gICAgICBaZXJvTGVuZ3RoQml0ZmllbGRCb3VuZGFyeSA9IDMyOwotCi0gICAgICBJc0FBUENTID0gZmFsc2U7Ci0KLSAgICAgIGlmIChJc1RodW1iKSB7Ci0gICAgICAgIC8vIFRodW1iMSBhZGQgc3AsICNpbW0gcmVxdWlyZXMgdGhlIGltbWVkaWF0ZSB2YWx1ZSBiZSBtdWx0aXBsZSBvZiA0LAotICAgICAgICAvLyBzbyBzZXQgcHJlZmVycmVkIGZvciBzbWFsbCB0eXBlcyB0byAzMi4KLSAgICAgICAgRGVzY3JpcHRpb25TdHJpbmcgPSAoImUtcDozMjozMjozMi1pMTo4OjMyLWk4Ojg6MzItaTE2OjE2OjMyLWkzMjozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6MzI6NjQtZjMyOjMyOjMyLWY2NDozMjo2NC0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2NjQ6MzI6NjQtdjEyODozMjoxMjgtYTA6MDozMi1uMzItUzMyIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICgiZS1wOjMyOjMyOjMyLWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6MzI6NjQtZjMyOjMyOjMyLWY2NDozMjo2NC0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2NjQ6MzI6NjQtdjEyODozMjoxMjgtYTA6MDozMi1uMzItUzMyIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEZJWE1FOiBPdmVycmlkZSAicHJlZmVycmVkIGFsaWduIiBmb3IgZG91YmxlIGFuZCBsb25nIGxvbmcuCi0gICAgfSBlbHNlIGlmIChOYW1lID09ICJhYXBjcyIgfHwgTmFtZSA9PSAiYWFwY3MtdmZwIikgewotICAgICAgLy8gc2l6ZV90IGlzIHVuc2lnbmVkIGxvbmcgb24gRGFyd2luLgotICAgICAgaWYgKGdldFRyaXBsZSgpLmlzT1NEYXJ3aW4oKSkKLSAgICAgICAgU2l6ZVR5cGUgPSBVbnNpZ25lZExvbmc7Ci0gICAgICBJc0FBUENTID0gdHJ1ZTsKLSAgICAgIC8vIEZJWE1FOiBFbnVtZXJhdGVkIHR5cGVzIGFyZSB2YXJpYWJsZSB3aWR0aCBpbiBzdHJhaWdodCBBQVBDUy4KLSAgICB9IGVsc2UgaWYgKE5hbWUgPT0gImFhcGNzLWxpbnV4IikgewotICAgICAgSXNBQVBDUyA9IHRydWU7Ci0gICAgfSBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIHNldEFCSUFQQ1MoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoTmFtZSA9PSAiYWFwY3MiIHx8IE5hbWUgPT0gImFhcGNzLXZmcCIgfHwgTmFtZSA9PSAiYWFwY3MtbGludXgiKSB7CisgICAgICBzZXRBQklBQVBDUygpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIHZvaWQgZ2V0RGVmYXVsdEZlYXR1cmVzKGxsdm06OlN0cmluZ01hcDxib29sPiAmRmVhdHVyZXMpIGNvbnN0IHsKKyAgdm9pZCBnZXREZWZhdWx0RmVhdHVyZXMobGx2bTo6U3RyaW5nTWFwPGJvb2w+ICZGZWF0dXJlcykgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChJc0FBUENTKQorICAgICAgRmVhdHVyZXNbImFhcGNzIl0gPSB0cnVlOworICAgIGVsc2UKKyAgICAgIEZlYXR1cmVzWyJhcGNzIl0gPSB0cnVlOworCiAgICAgU3RyaW5nUmVmIEFyY2hOYW1lID0gZ2V0VHJpcGxlKCkuZ2V0QXJjaE5hbWUoKTsKICAgICBpZiAoQ1BVID09ICJhcm0xMTM2amYtcyIgfHwgQ1BVID09ICJhcm0xMTc2anpmLXMiIHx8IENQVSA9PSAibXBjb3JlIikKICAgICAgIEZlYXR1cmVzWyJ2ZnAyIl0gPSB0cnVlOwpAQCAtMzgyMCwzMiArMzkyOSw0NCBAQAogICAgIGVsc2UgaWYgKENQVSA9PSAiY29ydGV4LWE1IikgewogICAgICAgRmVhdHVyZXNbInZmcDQiXSA9IHRydWU7CiAgICAgICBGZWF0dXJlc1sibmVvbiJdID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKENQVSA9PSAic3dpZnQiIHx8IENQVSA9PSAiY29ydGV4LWE3IiB8fCBDUFUgPT0gImNvcnRleC1hMTUiKSB7CisgICAgfSBlbHNlIGlmIChDUFUgPT0gInN3aWZ0IiB8fCBDUFUgPT0gImNvcnRleC1hNyIgfHwKKyAgICAgICAgICAgICAgIENQVSA9PSAiY29ydGV4LWExMiIgfHwgQ1BVID09ICJjb3J0ZXgtYTE1IiB8fAorICAgICAgICAgICAgICAgQ1BVID09ICJrcmFpdCIpIHsKICAgICAgIEZlYXR1cmVzWyJ2ZnA0Il0gPSB0cnVlOwogICAgICAgRmVhdHVyZXNbIm5lb24iXSA9IHRydWU7CiAgICAgICBGZWF0dXJlc1siaHdkaXYiXSA9IHRydWU7CiAgICAgICBGZWF0dXJlc1siaHdkaXYtYXJtIl0gPSB0cnVlOworICAgIH0gZWxzZSBpZiAoQ1BVID09ICJjeWNsb25lIikgeworICAgICAgRmVhdHVyZXNbInY4ZnAiXSA9IHRydWU7CisgICAgICBGZWF0dXJlc1sibmVvbiJdID0gdHJ1ZTsKKyAgICAgIEZlYXR1cmVzWyJod2RpdiJdID0gdHJ1ZTsKKyAgICAgIEZlYXR1cmVzWyJod2Rpdi1hcm0iXSA9IHRydWU7CiAgICAgfSBlbHNlIGlmIChDUFUgPT0gImNvcnRleC1hNTMiIHx8IENQVSA9PSAiY29ydGV4LWE1NyIpIHsKICAgICAgIEZlYXR1cmVzWyJmcC1hcm12OCJdID0gdHJ1ZTsKICAgICAgIEZlYXR1cmVzWyJuZW9uIl0gPSB0cnVlOwogICAgICAgRmVhdHVyZXNbImh3ZGl2Il0gPSB0cnVlOwogICAgICAgRmVhdHVyZXNbImh3ZGl2LWFybSJdID0gdHJ1ZTsKICAgICAgIEZlYXR1cmVzWyJjcmMiXSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChDUFUgPT0gImNvcnRleC1yNSIgfHwgQ1BVID09ICJjb3J0ZXgtbTMiIHx8Ci0gICAgICAgICAgICAgICBDUFUgPT0gImNvcnRleC1tNCIgfHwKKyAgICAgIEZlYXR1cmVzWyJjcnlwdG8iXSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChDUFUgPT0gImNvcnRleC1yNSIgfHwKICAgICAgICAgICAgICAgIC8vIEVuYWJsZSB0aGUgaHdkaXYgZXh0ZW5zaW9uIGZvciBhbGwgdjhhIEFBcmNoMzIgY29yZXMgYnkKICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQuCiAgICAgICAgICAgICAgICBBcmNoTmFtZSA9PSAiYXJtdjhhIiB8fCBBcmNoTmFtZSA9PSAiYXJtdjgiIHx8Ci0gICAgICAgICAgICAgICBBcmNoTmFtZSA9PSAidGh1bWJ2OGEiIHx8IEFyY2hOYW1lID09ICJ0aHVtYnY4IikgeworICAgICAgICAgICAgICAgQXJjaE5hbWUgPT0gImFybWVidjhhIiB8fCBBcmNoTmFtZSA9PSAiYXJtZWJ2OCIgfHwKKyAgICAgICAgICAgICAgIEFyY2hOYW1lID09ICJ0aHVtYnY4YSIgfHwgQXJjaE5hbWUgPT0gInRodW1idjgiIHx8CisgICAgICAgICAgICAgICBBcmNoTmFtZSA9PSAidGh1bWJlYnY4YSIgfHwgQXJjaE5hbWUgPT0gInRodW1iZWJ2OCIpIHsKICAgICAgIEZlYXR1cmVzWyJod2RpdiJdID0gdHJ1ZTsKICAgICAgIEZlYXR1cmVzWyJod2Rpdi1hcm0iXSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChDUFUgPT0gImNvcnRleC1tMyIgfHwgQ1BVID09ICJjb3J0ZXgtbTQiKSB7CisgICAgICBGZWF0dXJlc1siaHdkaXYiXSA9IHRydWU7CiAgICAgfQogICB9CiAKLSAgdmlydHVhbCBib29sIGhhbmRsZVRhcmdldEZlYXR1cmVzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmRmVhdHVyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpIHsKKyAgYm9vbCBoYW5kbGVUYXJnZXRGZWF0dXJlcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFncykgb3ZlcnJpZGUgewogICAgIEZQVSA9IDA7CiAgICAgQ1JDID0gMDsKKyAgICBDcnlwdG8gPSAwOwogICAgIFNvZnRGbG9hdCA9IFNvZnRGbG9hdEFCSSA9IGZhbHNlOwogICAgIEhXRGl2ID0gMDsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRmVhdHVyZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgewpAQCAtMzg3MSw2ICszOTkyLDggQEAKICAgICAgICAgSFdEaXYgfD0gSFdEaXZBUk07CiAgICAgICBlbHNlIGlmIChGZWF0dXJlc1tpXSA9PSAiK2NyYyIpCiAgICAgICAgIENSQyA9IDE7CisgICAgICBlbHNlIGlmIChGZWF0dXJlc1tpXSA9PSAiK2NyeXB0byIpCisgICAgICAgIENyeXB0byA9IDE7CiAgICAgfQogCiAgICAgaWYgKCEoRlBVICYgTmVvbkZQVSkgJiYgRlBNYXRoID09IEZQX05lb24pIHsKQEAgLTM4OTQsNyArNDAxNyw3IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICB2aXJ0dWFsIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3QgeworICBib29sIGhhc0ZlYXR1cmUoU3RyaW5nUmVmIEZlYXR1cmUpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGJvb2w+KEZlYXR1cmUpCiAgICAgICAgIC5DYXNlKCJhcm0iLCB0cnVlKQogICAgICAgICAuQ2FzZSgic29mdGZsb2F0IiwgU29mdEZsb2F0KQpAQCAtMzkyMSwxMSArNDA0NCwxMSBAQAogICAgICAgLkNhc2VzKCJhcm0xMTc2anotcyIsICJhcm0xMTc2anpmLXMiLCAiNlpLIikKICAgICAgIC5DYXNlcygiYXJtMTEzNmpmLXMiLCAibXBjb3Jlbm92ZnAiLCAibXBjb3JlIiwgIjZLIikKICAgICAgIC5DYXNlcygiYXJtMTE1NnQyLXMiLCAiYXJtMTE1NnQyZi1zIiwgIjZUMiIpCi0gICAgICAuQ2FzZXMoImNvcnRleC1hNSIsICJjb3J0ZXgtYTciLCAiY29ydGV4LWE4IiwgIjdBIikKLSAgICAgIC5DYXNlcygiY29ydGV4LWE5IiwgImNvcnRleC1hMTIiLCAiY29ydGV4LWExNSIsICI3QSIpCisgICAgICAuQ2FzZXMoImNvcnRleC1hNSIsICJjb3J0ZXgtYTciLCAiY29ydGV4LWE4IiwgImNvcnRleC1hOS1tcCIsICI3QSIpCisgICAgICAuQ2FzZXMoImNvcnRleC1hOSIsICJjb3J0ZXgtYTEyIiwgImNvcnRleC1hMTUiLCAia3JhaXQiLCAiN0EiKQogICAgICAgLkNhc2VzKCJjb3J0ZXgtcjQiLCAiY29ydGV4LXI1IiwgIjdSIikKLSAgICAgIC5DYXNlKCJjb3J0ZXgtYTktbXAiLCAiN0YiKQogICAgICAgLkNhc2UoInN3aWZ0IiwgIjdTIikKKyAgICAgIC5DYXNlKCJjeWNsb25lIiwgIjhBIikKICAgICAgIC5DYXNlcygiY29ydGV4LW0zIiwgImNvcnRleC1tNCIsICI3TSIpCiAgICAgICAuQ2FzZSgiY29ydGV4LW0wIiwgIjZNIikKICAgICAgIC5DYXNlcygiY29ydGV4LWE1MyIsICJjb3J0ZXgtYTU3IiwgIjhBIikKQEAgLTM5MzQsMjkgKzQwNTcsMjcgQEAKICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldENQVVByb2ZpbGUoU3RyaW5nUmVmIE5hbWUpIHsKICAgICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGNvbnN0IGNoYXIqPihOYW1lKQogICAgICAgLkNhc2VzKCJjb3J0ZXgtYTUiLCAiY29ydGV4LWE3IiwgImNvcnRleC1hOCIsICJBIikKLSAgICAgIC5DYXNlcygiY29ydGV4LWE5IiwgImNvcnRleC1hMTIiLCAiY29ydGV4LWExNSIsICJBIikKKyAgICAgIC5DYXNlcygiY29ydGV4LWE5IiwgImNvcnRleC1hMTIiLCAiY29ydGV4LWExNSIsICJrcmFpdCIsICJBIikKICAgICAgIC5DYXNlcygiY29ydGV4LWE1MyIsICJjb3J0ZXgtYTU3IiwgIkEiKQogICAgICAgLkNhc2VzKCJjb3J0ZXgtbTMiLCAiY29ydGV4LW00IiwgImNvcnRleC1tMCIsICJNIikKICAgICAgIC5DYXNlcygiY29ydGV4LXI0IiwgImNvcnRleC1yNSIsICJSIikKICAgICAgIC5EZWZhdWx0KCIiKTsKICAgfQotICB2aXJ0dWFsIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBvdmVycmlkZSB7CiAgICAgaWYgKCFnZXRDUFVEZWZpbmVTdWZmaXgoTmFtZSkpCiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDUFUgPSBOYW1lOwogICAgIHJldHVybiB0cnVlOwogICB9Ci0gIHZpcnR1YWwgYm9vbCBzZXRGUE1hdGgoU3RyaW5nUmVmIE5hbWUpOwotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIGJvb2wgc2V0RlBNYXRoKFN0cmluZ1JlZiBOYW1lKSBvdmVycmlkZTsKKyAgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gVGFyZ2V0IGlkZW50aWZpY2F0aW9uLgogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fYXJtIik7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19hcm1fXyIpOwogCiAgICAgLy8gVGFyZ2V0IHByb3BlcnRpZXMuCi0gICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1FTF9fIik7Ci0gICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19MSVRUTEVfRU5ESUFOX18iKTsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX1JFR0lTVEVSX1BSRUZJWF9fIiwgIiIpOwogCiAgICAgU3RyaW5nUmVmIENQVUFyY2ggPSBnZXRDUFVEZWZpbmVTdWZmaXgoQ1BVKTsKQEAgLTM5NjksMTIgKzQwOTAsMTIgQEAKICAgICBTdHJpbmdSZWYgQ1BVUHJvZmlsZSA9IGdldENQVVByb2ZpbGUoQ1BVKTsKICAgICBpZiAoIUNQVVByb2ZpbGUuZW1wdHkoKSkKICAgICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNX0FSQ0hfUFJPRklMRSIsIENQVVByb2ZpbGUpOwotICAgIAorCiAgICAgLy8gU3VidGFyZ2V0IG9wdGlvbnMuCiAKICAgICAvLyBGSVhNRTogSXQncyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhpcyBhbmQgd2UgZG9uJ3QgcmVhbGx5IHN1cHBvcnQKICAgICAvLyBpbnRlcndvcmtpbmcuCi0gICAgaWYgKDUgPD0gQ1BVQXJjaFZlciAmJiBDUFVBcmNoVmVyIDw9IDcpCisgICAgaWYgKDUgPD0gQ1BVQXJjaFZlciAmJiBDUFVBcmNoVmVyIDw9IDgpCiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX1RIVU1CX0lOVEVSV09SS19fIik7CiAKICAgICBpZiAoQUJJID09ICJhYXBjcyIgfHwgQUJJID09ICJhYXBjcy1saW51eCIgfHwgQUJJID09ICJhYXBjcy12ZnAiKSB7CkBAIC0zOTk2LDcgKzQxMTcsMTEgQEAKICAgICBpZiAoSXNUaHVtYikgewogICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19USFVNQkVMX18iKTsKICAgICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fdGh1bWJfXyIpOwotICAgICAgaWYgKENQVUFyY2ggPT0gIjZUMiIgfHwgQ1BVQXJjaFZlciA9PSA3KQorICAgICAgLy8gV2UgY2hlY2sgYm90aCBDUFVBcmNoVmVyIGFuZCBBcmNoTmFtZSBiZWNhdXNlIHdoZW4gb25seSB0cmlwbGUgaXMKKyAgICAgIC8vIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgQ1BVIGlzIGFybTExMzZqLXMuCisgICAgICBTdHJpbmdSZWYgQXJjaE5hbWUgPSBnZXRUcmlwbGUoKS5nZXRBcmNoTmFtZSgpOworICAgICAgaWYgKENQVUFyY2ggPT0gIjZUMiIgfHwgQ1BVQXJjaFZlciA+PSA3IHx8IEFyY2hOYW1lLmVuZHN3aXRoKCJ2NnQyIikgfHwKKyAgICAgICAgICBBcmNoTmFtZS5lbmRzd2l0aCgidjciKSB8fCBBcmNoTmFtZS5lbmRzd2l0aCgidjgiKSkKICAgICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX190aHVtYjJfXyIpOwogICAgIH0KICAgICBpZiAoKChIV0RpdiAmIEhXRGl2VGh1bWIpICYmIElzVGh1bWIpIHx8ICgoSFdEaXYgJiBIV0RpdkFSTSkgJiYgIUlzVGh1bWIpKQpAQCAtNDAxNCwxNyArNDEzOSwyOCBAQAogICAgICAgaWYgKEZQVSAmIFZGUDRGUFUpCiAgICAgICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNX1ZGUFY0X18iKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBUaGlzIG9ubHkgZ2V0cyBzZXQgd2hlbiBOZW9uIGluc3RydWN0aW9ucyBhcmUgYWN0dWFsbHkgYXZhaWxhYmxlLCB1bmxpa2UKICAgICAvLyB0aGUgVkZQIGRlZmluZSwgaGVuY2UgdGhlIHNvZnQgZmxvYXQgYW5kIGFyY2ggY2hlY2suIFRoaXMgaXMgc3VidGx5CiAgICAgLy8gZGlmZmVyZW50IGZyb20gZ2NjLCB3ZSBmb2xsb3cgdGhlIGludGVudCB3aGljaCB3YXMgdGhhdCBpdCBzaG91bGQgYmUgc2V0CiAgICAgLy8gd2hlbiBOZW9uIGluc3RydWN0aW9ucyBhcmUgYWN0dWFsbHkgYXZhaWxhYmxlLgotICAgIGlmICgoRlBVICYgTmVvbkZQVSkgJiYgIVNvZnRGbG9hdCAmJiBDUFVBcmNoVmVyID49IDcpCisgICAgaWYgKChGUFUgJiBOZW9uRlBVKSAmJiAhU29mdEZsb2F0ICYmIENQVUFyY2hWZXIgPj0gNykgeworICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fTkVPTiIpOwogICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fTkVPTl9fIik7CisgICAgfQorCisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fU0laRU9GX1dDSEFSX1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgT3B0cy5TaG9ydFdDaGFyID8gIjIiIDogIjQiKTsKKworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNX1NJWkVPRl9NSU5JTUFMX0VOVU0iLAorICAgICAgICAgICAgICAgICAgICAgICAgT3B0cy5TaG9ydEVudW1zID8gIjEiIDogIjQiKTsKIAogICAgIGlmIChDUkMpCiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0FSTV9GRUFUVVJFX0NSQzMyIik7CiAKKyAgICBpZiAoQ3J5cHRvKQorICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fRkVBVFVSRV9DUllQVE8iKTsKKwogICAgIGlmIChDUFVBcmNoVmVyID49IDYgJiYgQ1BVQXJjaCAhPSAiNk0iKSB7CiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF8xIik7CiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF8yIik7CkBAIC00MDMyLDIxICs0MTY4LDIxIEBACiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0dDQ19IQVZFX1NZTkNfQ09NUEFSRV9BTkRfU1dBUF84Iik7CiAgICAgfQogICB9Ci0gIHZpcnR1YWwgdm9pZCBnZXRUYXJnZXRCdWlsdGlucyhjb25zdCBCdWlsdGluOjpJbmZvIComUmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1SZWNvcmRzKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0QnVpbHRpbnMoY29uc3QgQnVpbHRpbjo6SW5mbyAqJlJlY29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBSZWNvcmRzID0gQnVpbHRpbkluZm87CiAgICAgTnVtUmVjb3JkcyA9IGNsYW5nOjpBUk06Okxhc3RUU0J1aWx0aW4tQnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW47CiAgIH0KLSAgdmlydHVhbCBib29sIGlzQ0xaRm9yWmVyb1VuZGVmKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IHsKKyAgYm9vbCBpc0NMWkZvclplcm9VbmRlZigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBJc0FBUENTID8gQUFQQ1NBQklCdWlsdGluVmFMaXN0IDogVGFyZ2V0SW5mbzo6Vm9pZFB0ckJ1aWx0aW5WYUxpc3Q7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldEdDQ1JlZ05hbWVzKGNvbnN0IGNoYXIgKiBjb25zdCAqJk5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFzbUNvbnN0cmFpbnQoY29uc3QgY2hhciAqJk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SW5mbzo6Q29uc3RyYWludEluZm8gJkluZm8pIGNvbnN0IHsKKyAgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICogY29uc3QgKiZOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtTmFtZXMpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIHZhbGlkYXRlQXNtQ29uc3RyYWludChjb25zdCBjaGFyIComTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SW5mbzo6Q29uc3RyYWludEluZm8gJkluZm8pIGNvbnN0IG92ZXJyaWRlIHsKICAgICBzd2l0Y2ggKCpOYW1lKSB7CiAgICAgZGVmYXVsdDogYnJlYWs7CiAgICAgY2FzZSAnbCc6IC8vIHIwLXI3CkBAIC00MDc2LDcgKzQyMTIsNyBAQAogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBjb252ZXJ0Q29uc3RyYWludChjb25zdCBjaGFyIComQ29uc3RyYWludCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBjb252ZXJ0Q29uc3RyYWludChjb25zdCBjaGFyIComQ29uc3RyYWludCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHN0ZDo6c3RyaW5nIFI7CiAgICAgc3dpdGNoICgqQ29uc3RyYWludCkgewogICAgIGNhc2UgJ1UnOiAgIC8vIFR3by1jaGFyYWN0ZXIgY29uc3RyYWludDsgYWRkICJeIiBoaW50IGZvciBsYXRlciBwYXJzaW5nLgpAQCAtNDA5MSw5ICs0MjI3LDggQEAKICAgICB9CiAgICAgcmV0dXJuIFI7CiAgIH0KLSAgdmlydHVhbCBib29sIHZhbGlkYXRlQ29uc3RyYWludE1vZGlmaWVyKFN0cmluZ1JlZiBDb25zdHJhaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUpIGNvbnN0IHsKKyAgYm9vbCB2YWxpZGF0ZUNvbnN0cmFpbnRNb2RpZmllcihTdHJpbmdSZWYgQ29uc3RyYWludCwgY29uc3QgY2hhciBNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplKSBjb25zdCBvdmVycmlkZSB7CiAgICAgYm9vbCBpc091dHB1dCA9IChDb25zdHJhaW50WzBdID09ICc9Jyk7CiAgICAgYm9vbCBpc0luT3V0ID0gKENvbnN0cmFpbnRbMF0gPT0gJysnKTsKIApAQCAtNDExOCwxNiArNDI1MywxNiBAQAogCiAgICAgcmV0dXJuIHRydWU7CiAgIH0KLSAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRDbG9iYmVycygpIGNvbnN0IHsKKyAgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gRklYTUU6IElzIHRoaXMgcmVhbGx5IHJpZ2h0PwogICAgIHJldHVybiAiIjsKICAgfQogCi0gIHZpcnR1YWwgQ2FsbGluZ0NvbnZDaGVja1Jlc3VsdCBjaGVja0NhbGxpbmdDb252ZW50aW9uKENhbGxpbmdDb252IENDKSBjb25zdCB7CisgIENhbGxpbmdDb252Q2hlY2tSZXN1bHQgY2hlY2tDYWxsaW5nQ29udmVudGlvbihDYWxsaW5nQ29udiBDQykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiAoQ0MgPT0gQ0NfQUFQQ1MgfHwgQ0MgPT0gQ0NfQUFQQ1NfVkZQKSA/IENDQ1JfT0sgOiBDQ0NSX1dhcm5pbmc7CiAgIH0KIAotICB2aXJ0dWFsIGludCBnZXRFSERhdGFSZWdpc3Rlck51bWJlcih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICBpbnQgZ2V0RUhEYXRhUmVnaXN0ZXJOdW1iZXIodW5zaWduZWQgUmVnTm8pIGNvbnN0IG92ZXJyaWRlIHsKICAgICBpZiAoUmVnTm8gPT0gMCkgcmV0dXJuIDA7CiAgICAgaWYgKFJlZ05vID09IDEpIHJldHVybiAxOwogICAgIHJldHVybiAtMTsKQEAgLTQyMDUsMjUgKzQzNDAsNTMgQEAKICNkZWZpbmUgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpIHsgI0lELCBUWVBFLCBBVFRSUywgMCwgQUxMX0xBTkdVQUdFUyB9LAogI2RlZmluZSBMSUJCVUlMVElOKElELCBUWVBFLCBBVFRSUywgSEVBREVSKSB7ICNJRCwgVFlQRSwgQVRUUlMsIEhFQURFUixcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxMX0xBTkdVQUdFUyB9LAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zTkVPTi5kZWYiCisKKyNkZWZpbmUgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpIHsgI0lELCBUWVBFLCBBVFRSUywgMCwgQUxMX0xBTkdVQUdFUyB9LAorI2RlZmluZSBMSUJCVUlMVElOKElELCBUWVBFLCBBVFRSUywgSEVBREVSKSB7ICNJRCwgVFlQRSwgQVRUUlMsIEhFQURFUixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxMX0xBTkdVQUdFUyB9LAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zQVJNLmRlZiIKIH07CisKK2NsYXNzIEFSTWxlVGFyZ2V0SW5mbyA6IHB1YmxpYyBBUk1UYXJnZXRJbmZvIHsKK3B1YmxpYzoKKyAgQVJNbGVUYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKQorICAgIDogQVJNVGFyZ2V0SW5mbyhUcmlwbGUsIGZhbHNlKSB7IH0KKyAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNRUxfXyIpOworICAgIEFSTVRhcmdldEluZm86OmdldFRhcmdldERlZmluZXMoT3B0cywgQnVpbGRlcik7CisgIH0KK307CisKK2NsYXNzIEFSTWJlVGFyZ2V0SW5mbyA6IHB1YmxpYyBBUk1UYXJnZXRJbmZvIHsKK3B1YmxpYzoKKyAgQVJNYmVUYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKQorICAgIDogQVJNVGFyZ2V0SW5mbyhUcmlwbGUsIHRydWUpIHsgfQorICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1FQl9fIik7CisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fQklHX0VORElBTiIpOworICAgIEFSTVRhcmdldEluZm86OmdldFRhcmdldERlZmluZXMoT3B0cywgQnVpbGRlcik7CisgIH0KK307CiB9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlLgogCiBuYW1lc3BhY2UgewogY2xhc3MgRGFyd2luQVJNVGFyZ2V0SW5mbyA6Ci0gIHB1YmxpYyBEYXJ3aW5UYXJnZXRJbmZvPEFSTVRhcmdldEluZm8+IHsKKyAgcHVibGljIERhcndpblRhcmdldEluZm88QVJNbGVUYXJnZXRJbmZvPiB7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBnZXRPU0RlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldE9TRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIGdldERhcndpbkRlZmluZXMoQnVpbGRlciwgT3B0cywgVHJpcGxlLCBQbGF0Zm9ybU5hbWUsIFBsYXRmb3JtTWluVmVyc2lvbik7CiAgIH0KIAogcHVibGljOgogICBEYXJ3aW5BUk1UYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKQotICAgICAgOiBEYXJ3aW5UYXJnZXRJbmZvPEFSTVRhcmdldEluZm8+KFRyaXBsZSkgeworICAgICAgOiBEYXJ3aW5UYXJnZXRJbmZvPEFSTWxlVGFyZ2V0SW5mbz4oVHJpcGxlKSB7CiAgICAgSGFzQWxpZ25NYWM2OGtTdXBwb3J0ID0gdHJ1ZTsKICAgICAvLyBpT1MgYWx3YXlzIGhhcyA2NC1iaXQgYXRvbWljIGluc3RydWN0aW9ucy4KLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYmFzZWQgb2ZmIG9mIHRoZSB0YXJnZXQgZmVhdHVyZXMgaW4gQVJNVGFyZ2V0SW5mby4KKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgYmFzZWQgb2ZmIG9mIHRoZSB0YXJnZXQgZmVhdHVyZXMgaW4gQVJNbGVUYXJnZXRJbmZvLgogICAgIE1heEF0b21pY0lubGluZVdpZHRoID0gNjQ7CiAKICAgICAvLyBEYXJ3aW4gb24gaU9TIHVzZXMgYSB2YXJpYW50IG9mIHRoZSBBUk0gQysrIEFCSS4KQEAgLTQyMzQsNiArNDM5NywyOTQgQEAKIAogCiBuYW1lc3BhY2UgeworY2xhc3MgQVJNNjRUYXJnZXRJbmZvIDogcHVibGljIFRhcmdldEluZm8geworICBzdGF0aWMgY29uc3QgVGFyZ2V0SW5mbzo6R0NDUmVnQWxpYXMgR0NDUmVnQWxpYXNlc1tdOworICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgR0NDUmVnTmFtZXNbXTsKKworICBzdGF0aWMgY29uc3QgQnVpbHRpbjo6SW5mbyBCdWlsdGluSW5mb1tdOworCisgIHN0ZDo6c3RyaW5nIEFCSTsKKworcHVibGljOgorICBBUk02NFRhcmdldEluZm8oY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUpCisgICAgICA6IFRhcmdldEluZm8oVHJpcGxlKSwgQUJJKCJhYXBjcyIpIHsKKyAgICBCaWdFbmRpYW4gPSBmYWxzZTsKKyAgICBMb25nV2lkdGggPSBMb25nQWxpZ24gPSBQb2ludGVyV2lkdGggPSBQb2ludGVyQWxpZ24gPSA2NDsKKyAgICBJbnRNYXhUeXBlID0gU2lnbmVkTG9uZzsKKyAgICBVSW50TWF4VHlwZSA9IFVuc2lnbmVkTG9uZzsKKyAgICBJbnQ2NFR5cGUgPSBTaWduZWRMb25nOworICAgIFdDaGFyVHlwZSA9IFVuc2lnbmVkSW50OworICAgIE1heFZlY3RvckFsaWduID0gMTI4OworICAgIFJlZ1Bhcm1NYXggPSA4OworICAgIE1heEF0b21pY0lubGluZVdpZHRoID0gMTI4OworICAgIE1heEF0b21pY1Byb21vdGVXaWR0aCA9IDEyODsKKworICAgIExvbmdEb3VibGVXaWR0aCA9IExvbmdEb3VibGVBbGlnbiA9IDEyODsKKyAgICBMb25nRG91YmxlRm9ybWF0ID0gJmxsdm06OkFQRmxvYXQ6OklFRUVxdWFkOworCisgICAgaWYgKFRyaXBsZS5pc09TQmluRm9ybWF0TWFjaE8oKSkKKyAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gImUtbTpvLWk2NDo2NC1pMTI4OjEyOC1uMzI6NjQtUzEyOCI7CisgICAgZWxzZQorICAgICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiZS1tOmUtaTY0OjY0LWkxMjg6MTI4LW4zMjo2NC1TMTI4IjsKKworICAgIC8vIHt9IGluIGlubGluZSBhc3NlbWJseSBhcmUgbmVvbiBzcGVjaWZpZXJzLCBub3QgYXNzZW1ibHkgdmFyaWFudAorICAgIC8vIHNwZWNpZmllcnMuCisgICAgTm9Bc21WYXJpYW50cyA9IHRydWU7CisKKyAgICAvLyBBUk02NCB0YXJnZXRzIGRlZmF1bHQgdG8gdXNpbmcgdGhlIEFSTSBDKysgQUJJLgorICAgIFRoZUNYWEFCSS5zZXQoVGFyZ2V0Q1hYQUJJOjpHZW5lcmljQUFyY2g2NCk7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldEFCSSgpIGNvbnN0IHsgcmV0dXJuIEFCSS5jX3N0cigpOyB9CisgIHZpcnR1YWwgYm9vbCBzZXRBQkkoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgICBpZiAoTmFtZSAhPSAiYWFwY3MiICYmIE5hbWUgIT0gImRhcndpbnBjcyIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBBQkkgPSBOYW1lOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdmlydHVhbCBib29sIHNldENQVShjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIGJvb2wgQ1BVS25vd24gPSBsbHZtOjpTdHJpbmdTd2l0Y2g8Ym9vbD4oTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5DYXNlKCJhcm02NC1nZW5lcmljIiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5DYXNlKCJjeWNsb25lIiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5EZWZhdWx0KGZhbHNlKTsKKyAgICByZXR1cm4gQ1BVS25vd247CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgICAgLy8gVGFyZ2V0IGlkZW50aWZpY2F0aW9uLgorICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fYXJtNjQiKTsKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX2FybTY0X18iKTsKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX2FhcmNoNjRfXyIpOworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNNjRfQVJDSF84X18iKTsKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0FBUkNINjRfU0lNRF9fIik7CisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fTkVPTl9fIik7CisKKyAgICAvLyBUYXJnZXQgcHJvcGVydGllcy4KKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfTFA2NCIpOworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fTFA2NF9fIik7CisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19MSVRUTEVfRU5ESUFOX18iKTsKKworICAgIC8vIFN1YnRhcmdldCBvcHRpb25zLgorICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fUkVHSVNURVJfUFJFRklYX18iLCAiIik7CisKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX2FhcmNoNjRfXyIpOworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQUFSQ0g2NEVMX18iKTsKKworICAgIC8vIEFDTEUgcHJlZGVmaW5lcy4gTWFueSBjYW4gb25seSBoYXZlIG9uZSBwb3NzaWJsZSB2YWx1ZSBvbiB2OCBBQXJjaDY0LgorICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNX0FDTEUiLCAiMjAwIik7CisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fQVJDSCIsICI4Iik7CisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fQVJDSF9QUk9GSUxFIiwgIidBJyIpOworCisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fNjRCSVRfU1RBVEUiKTsKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0FSTV9QQ1NfQUFQQ1M2NCIpOworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNX0FSQ0hfSVNBX0E2NCIpOworCisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fRkVBVFVSRV9VTkFMSUdORUQiKTsKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0FSTV9GRUFUVVJFX0NMWiIpOworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNX0ZFQVRVUkVfRk1BIik7CisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fRkVBVFVSRV9ESVYiKTsKKworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNX0FMSUdOX01BWF9TVEFDS19QV1IiLCAiNCIpOworCisgICAgLy8gMHhlIGltcGxpZXMgc3VwcG9ydCBmb3IgaGFsZiwgc2luZ2xlIGFuZCBkb3VibGUgcHJlY2lzaW9uIG9wZXJhdGlvbnMuCisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fRlAiLCAiMHhlIik7CisKKyAgICAvLyBQQ1Mgc3BlY2lmaWVzIHRoaXMgZm9yIFN5c1YgdmFyaWFudHMsIHdoaWNoIGlzIGFsbCB3ZSBzdXBwb3J0LiBPdGhlciBBQklzCisgICAgLy8gbWF5IGNob29zZSBfX0FSTV9GUDE2X0ZPUk1BVF9BTFRFUk5BVElWRS4KKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0FSTV9GUDE2X0ZPUk1BVF9JRUVFIik7CisKKyAgICBpZiAoT3B0cy5GYXN0TWF0aCB8fCBPcHRzLkZpbml0ZU1hdGhPbmx5KQorICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fRlBfRkFTVCIpOworCisgICAgaWYgKChPcHRzLkM5OSB8fCBPcHRzLkMxMSkgJiYgIU9wdHMuRnJlZXN0YW5kaW5nKQorICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fRlBfRkVOVl9ST1VORElORyIpOworCisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fU0laRU9GX1dDSEFSX1QiLCBPcHRzLlNob3J0V0NoYXIgPyAiMiIgOiAiNCIpOworCisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19BUk1fU0laRU9GX01JTklNQUxfRU5VTSIsCisgICAgICAgICAgICAgICAgICAgICAgICBPcHRzLlNob3J0RW51bXMgPyAiMSIgOiAiNCIpOworCisgICAgaWYgKEJpZ0VuZGlhbikKKyAgICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNX0JJR19FTkRJQU4iKTsKKworICAgIC8vIEZJWE1FOiB0aGUgdGFyZ2V0IHNob3VsZCBzdXBwb3J0IE5FT04gYXMgYW4gb3B0aW9uYWwgZXh0ZW5zaW9uLCBsaWtlCisgICAgLy8gdGhlIE9TUyBBQXJjaDY0LgorICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQVJNX05FT04iKTsKKyAgICAvLyA2NC1iaXQgTkVPTiBzdXBwb3J0cyBoYWxmLCBzaW5nbGUgYW5kIGRvdWJsZSBwcmVjaXNpb24gb3BlcmF0aW9ucy4KKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0FSTV9ORU9OX0ZQIiwgIjciKTsKKworICAgIC8vIEZJWE1FOiB0aGUgdGFyZ2V0IHNob3VsZCBzdXBwb3J0IGNyeXB0byBhcyBhbiBvcHRpb25hbCBleHRlbnNpb24sIGxpa2UKKyAgICAvLyB0aGUgT1NTIEFBcmNoNjQKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0FSTV9GRUFUVVJFX0NSWVBUTyIpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IHsKKyAgICBSZWNvcmRzID0gQnVpbHRpbkluZm87CisgICAgTnVtUmVjb3JkcyA9IGNsYW5nOjpBUk02NDo6TGFzdFRTQnVpbHRpbiAtIEJ1aWx0aW46OkZpcnN0VFNCdWlsdGluOworICB9CisKKyAgdmlydHVhbCBib29sIGhhc0ZlYXR1cmUoU3RyaW5nUmVmIEZlYXR1cmUpIGNvbnN0IHsKKyAgICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGJvb2w+KEZlYXR1cmUpCisgICAgICAgIC5DYXNlKCJhcm02NCIsIHRydWUpCisgICAgICAgIC5DYXNlKCJuZW9uIiwgdHJ1ZSkKKyAgICAgICAgLkRlZmF1bHQoZmFsc2UpOworICB9CisKKyAgdmlydHVhbCBib29sIGlzQ0xaRm9yWmVyb1VuZGVmKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICB2aXJ0dWFsIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBUYXJnZXRJbmZvOjpBQXJjaDY0QUJJQnVpbHRpblZhTGlzdDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICpjb25zdCAqJk5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIHZhbGlkYXRlQXNtQ29uc3RyYWludChjb25zdCBjaGFyIComTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmSW5mbykgY29uc3QgeworICAgIHN3aXRjaCAoKk5hbWUpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgJ3cnOiAvLyBGbG9hdGluZyBwb2ludCBhbmQgU0lNRCByZWdpc3RlcnMgKFYwLVYzMSkKKyAgICAgIEluZm8uc2V0QWxsb3dzUmVnaXN0ZXIoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgJ3onOiAvLyBaZXJvIHJlZ2lzdGVyLCB3enIgb3IgeHpyCisgICAgICBJbmZvLnNldEFsbG93c1JlZ2lzdGVyKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlICd4JzogLy8gRmxvYXRpbmcgcG9pbnQgYW5kIFNJTUQgcmVnaXN0ZXJzIChWMC1WMTUpCisgICAgICBJbmZvLnNldEFsbG93c1JlZ2lzdGVyKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlICdRJzogLy8gQSBtZW1vcnkgYWRkcmVzcyB0aGF0IGlzIGEgc2luZ2xlIGJhc2UgcmVnaXN0ZXIuCisgICAgICBJbmZvLnNldEFsbG93c01lbW9yeSgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUNvbnN0cmFpbnRNb2RpZmllcihTdHJpbmdSZWYgQ29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplKSBjb25zdCB7CisgICAgLy8gU3RyaXAgb2ZmIGNvbnN0cmFpbnQgbW9kaWZpZXJzLgorICAgIHdoaWxlIChDb25zdHJhaW50WzBdID09ICc9JyB8fCBDb25zdHJhaW50WzBdID09ICcrJyB8fCBDb25zdHJhaW50WzBdID09ICcmJykKKyAgICAgIENvbnN0cmFpbnQgPSBDb25zdHJhaW50LnN1YnN0cigxKTsKKworICAgIHN3aXRjaCAoQ29uc3RyYWludFswXSkgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlICd6JzoKKyAgICBjYXNlICdyJzogeworICAgICAgc3dpdGNoIChNb2RpZmllcikgeworICAgICAgY2FzZSAneCc6CisgICAgICBjYXNlICd3JzoKKyAgICAgICAgLy8gRm9yIG5vdyBhc3N1bWUgdGhhdCB0aGUgcGVyc29uIGtub3dzIHdoYXQgdGhleSdyZQorICAgICAgICAvLyBkb2luZyB3aXRoIHRoZSBtb2RpZmllci4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBCeSBkZWZhdWx0IGFuICdyJyBjb25zdHJhaW50IHdpbGwgYmUgaW4gdGhlICd4JworICAgICAgICAvLyByZWdpc3RlcnMuCisgICAgICAgIHJldHVybiAoU2l6ZSA9PSA2NCk7CisgICAgICB9CisgICAgfQorICAgIH0KKyAgfQorCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCB7IHJldHVybiAiIjsgfQorCisgIGludCBnZXRFSERhdGFSZWdpc3Rlck51bWJlcih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIGlmIChSZWdObyA9PSAwKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFJlZ05vID09IDEpCisgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gLTE7CisgIH0KK307CisKK2NvbnN0IGNoYXIgKmNvbnN0IEFSTTY0VGFyZ2V0SW5mbzo6R0NDUmVnTmFtZXNbXSA9IHsKKyAgLy8gMzItYml0IEludGVnZXIgcmVnaXN0ZXJzCisgICJ3MCIsICAidzEiLCAgIncyIiwgICJ3MyIsICAidzQiLCAgInc1IiwgICJ3NiIsICAidzciLCAgInc4IiwgICJ3OSIsICAidzEwIiwKKyAgIncxMSIsICJ3MTIiLCAidzEzIiwgIncxNCIsICJ3MTUiLCAidzE2IiwgIncxNyIsICJ3MTgiLCAidzE5IiwgIncyMCIsICJ3MjEiLAorICAidzIyIiwgIncyMyIsICJ3MjQiLCAidzI1IiwgIncyNiIsICJ3MjciLCAidzI4IiwgIncyOSIsICJ3MzAiLCAid3NwIiwKKworICAvLyA2NC1iaXQgSW50ZWdlciByZWdpc3RlcnMKKyAgIngwIiwgICJ4MSIsICAieDIiLCAgIngzIiwgICJ4NCIsICAieDUiLCAgIng2IiwgICJ4NyIsICAieDgiLCAgIng5IiwgICJ4MTAiLAorICAieDExIiwgIngxMiIsICJ4MTMiLCAieDE0IiwgIngxNSIsICJ4MTYiLCAieDE3IiwgIngxOCIsICJ4MTkiLCAieDIwIiwgIngyMSIsCisgICJ4MjIiLCAieDIzIiwgIngyNCIsICJ4MjUiLCAieDI2IiwgIngyNyIsICJ4MjgiLCAiZnAiLCAgImxyIiwgICJzcCIsCisKKyAgLy8gMzItYml0IGZsb2F0aW5nIHBvaW50IHJlZ3Npc3RlcnMKKyAgInMwIiwgICJzMSIsICAiczIiLCAgInMzIiwgICJzNCIsICAiczUiLCAgInM2IiwgICJzNyIsICAiczgiLCAgInM5IiwgICJzMTAiLAorICAiczExIiwgInMxMiIsICJzMTMiLCAiczE0IiwgInMxNSIsICJzMTYiLCAiczE3IiwgInMxOCIsICJzMTkiLCAiczIwIiwgInMyMSIsCisgICJzMjIiLCAiczIzIiwgInMyNCIsICJzMjUiLCAiczI2IiwgInMyNyIsICJzMjgiLCAiczI5IiwgInMzMCIsICJzMzEiLAorCisgIC8vIDY0LWJpdCBmbG9hdGluZyBwb2ludCByZWdzaXN0ZXJzCisgICJkMCIsICAiZDEiLCAgImQyIiwgICJkMyIsICAiZDQiLCAgImQ1IiwgICJkNiIsICAiZDciLCAgImQ4IiwgICJkOSIsICAiZDEwIiwKKyAgImQxMSIsICJkMTIiLCAiZDEzIiwgImQxNCIsICJkMTUiLCAiZDE2IiwgImQxNyIsICJkMTgiLCAiZDE5IiwgImQyMCIsICJkMjEiLAorICAiZDIyIiwgImQyMyIsICJkMjQiLCAiZDI1IiwgImQyNiIsICJkMjciLCAiZDI4IiwgImQyOSIsICJkMzAiLCAiZDMxIiwKKworICAvLyBWZWN0b3IgcmVnaXN0ZXJzCisgICJ2MCIsICAidjEiLCAgInYyIiwgICJ2MyIsICAidjQiLCAgInY1IiwgICJ2NiIsICAidjciLCAgInY4IiwgICJ2OSIsICAidjEwIiwKKyAgInYxMSIsICJ2MTIiLCAidjEzIiwgInYxNCIsICJ2MTUiLCAidjE2IiwgInYxNyIsICJ2MTgiLCAidjE5IiwgInYyMCIsICJ2MjEiLAorICAidjIyIiwgInYyMyIsICJ2MjQiLCAidjI1IiwgInYyNiIsICJ2MjciLCAidjI4IiwgInYyOSIsICJ2MzAiLCAidjMxIgorfTsKKwordm9pZCBBUk02NFRhcmdldEluZm86OmdldEdDQ1JlZ05hbWVzKGNvbnN0IGNoYXIgKmNvbnN0IComTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdCB7CisgIE5hbWVzID0gR0NDUmVnTmFtZXM7CisgIE51bU5hbWVzID0gbGx2bTo6YXJyYXlfbGVuZ3Rob2YoR0NDUmVnTmFtZXMpOworfQorCitjb25zdCBUYXJnZXRJbmZvOjpHQ0NSZWdBbGlhcyBBUk02NFRhcmdldEluZm86OkdDQ1JlZ0FsaWFzZXNbXSA9IHsKKyAgeyB7ICJ3MzEiIH0sICJ3c3AiIH0sCisgIHsgeyAieDI5IiB9LCAiZnAiIH0sCisgIHsgeyAieDMwIiB9LCAibHIiIH0sCisgIHsgeyAieDMxIiB9LCAic3AiIH0sCisgIC8vIFRoZSBTL0QvUSBhbmQgVy9YIHJlZ2lzdGVycyBvdmVybGFwLCBidXQgYXJlbid0IHJlYWxseSBhbGlhc2VzOyB3ZQorICAvLyBkb24ndCB3YW50IHRvIHN1YnN0aXR1dGUgb25lIG9mIHRoZXNlIGZvciBhIGRpZmZlcmVudC1zaXplZCBvbmUuCit9OworCit2b2lkIEFSTTY0VGFyZ2V0SW5mbzo6Z2V0R0NDUmVnQWxpYXNlcyhjb25zdCBHQ0NSZWdBbGlhcyAqJkFsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3QgeworICBBbGlhc2VzID0gR0NDUmVnQWxpYXNlczsKKyAgTnVtQWxpYXNlcyA9IGxsdm06OmFycmF5X2xlbmd0aG9mKEdDQ1JlZ0FsaWFzZXMpOworfQorCitjb25zdCBCdWlsdGluOjpJbmZvIEFSTTY0VGFyZ2V0SW5mbzo6QnVpbHRpbkluZm9bXSA9IHsKKyNkZWZpbmUgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgI0lELCBUWVBFLCBBVFRSUywgMCwgQUxMX0xBTkdVQUdFUyB9LAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zTkVPTi5kZWYiCisKKyNkZWZpbmUgQlVJTFRJTihJRCwgVFlQRSwgQVRUUlMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgI0lELCBUWVBFLCBBVFRSUywgMCwgQUxMX0xBTkdVQUdFUyB9LAorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0J1aWx0aW5zQVJNNjQuZGVmIgorfTsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UuCisKK25hbWVzcGFjZSB7CitjbGFzcyBEYXJ3aW5BUk02NFRhcmdldEluZm8gOiBwdWJsaWMgRGFyd2luVGFyZ2V0SW5mbzxBUk02NFRhcmdldEluZm8+IHsKK3B1YmxpYzoKKyAgRGFyd2luQVJNNjRUYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKQorICAgICAgOiBEYXJ3aW5UYXJnZXRJbmZvPEFSTTY0VGFyZ2V0SW5mbz4oVHJpcGxlKSB7CisgICAgSW50NjRUeXBlID0gU2lnbmVkTG9uZ0xvbmc7CisgICAgV0NoYXJUeXBlID0gU2lnbmVkSW50OworICAgIFVzZVNpZ25lZENoYXJGb3JPYmpDQm9vbCA9IGZhbHNlOworCisgICAgTG9uZ0RvdWJsZVdpZHRoID0gTG9uZ0RvdWJsZUFsaWduID0gNjQ7CisgICAgTG9uZ0RvdWJsZUZvcm1hdCA9ICZsbHZtOjpBUEZsb2F0OjpJRUVFZG91YmxlOworCisgICAgVGhlQ1hYQUJJLnNldChUYXJnZXRDWFhBQkk6OmlPUzY0KTsKKyAgfQorCisgIHZpcnR1YWwgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIFRhcmdldEluZm86OkNoYXJQdHJCdWlsdGluVmFMaXN0OworICB9Cit9OworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQorCituYW1lc3BhY2UgewogLy8gSGV4YWdvbiBhYnN0cmFjdCBiYXNlIGNsYXNzCiBjbGFzcyBIZXhhZ29uVGFyZ2V0SW5mbyA6IHB1YmxpYyBUYXJnZXRJbmZvIHsKICAgc3RhdGljIGNvbnN0IEJ1aWx0aW46OkluZm8gQnVpbHRpbkluZm9bXTsKQEAgLTQyNDMsNDEgKzQ2OTQsMzkgQEAKIHB1YmxpYzoKICAgSGV4YWdvblRhcmdldEluZm8oY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUpIDogVGFyZ2V0SW5mbyhUcmlwbGUpIHsKICAgICBCaWdFbmRpYW4gPSBmYWxzZTsKLSAgICBEZXNjcmlwdGlvblN0cmluZyA9ICgiZS1wOjMyOjMyOjMyLSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0OjY0OjY0LWkzMjozMjozMi1pMTY6MTY6MTYtaTE6MzI6MzItIgotICAgICAgICAgICAgICAgICAgICAgICAgICJmNjQ6NjQ6NjQtZjMyOjMyOjMyLWEwOjAtbjMyIik7CisgICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiZS1tOmUtcDozMjozMi1pMTozMi1pNjQ6NjQtYTowLW4zMiI7CiAKICAgICAvLyB7fSBpbiBpbmxpbmUgYXNzZW1ibHkgYXJlIHBhY2tldCBzcGVjaWZpZXJzLCBub3QgYXNzZW1ibHkgdmFyaWFudAogICAgIC8vIHNwZWNpZmllcnMuCiAgICAgTm9Bc21WYXJpYW50cyA9IHRydWU7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0QnVpbHRpbnMoY29uc3QgQnVpbHRpbjo6SW5mbyAqJlJlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtUmVjb3JkcykgY29uc3QgeworICB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1SZWNvcmRzKSBjb25zdCBvdmVycmlkZSB7CiAgICAgUmVjb3JkcyA9IEJ1aWx0aW5JbmZvOwogICAgIE51bVJlY29yZHMgPSBjbGFuZzo6SGV4YWdvbjo6TGFzdFRTQnVpbHRpbi1CdWlsdGluOjpGaXJzdFRTQnVpbHRpbjsKICAgfQogCi0gIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFzbUNvbnN0cmFpbnQoY29uc3QgY2hhciAqJk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SW5mbzo6Q29uc3RyYWludEluZm8gJkluZm8pIGNvbnN0IHsKKyAgYm9vbCB2YWxpZGF0ZUFzbUNvbnN0cmFpbnQoY29uc3QgY2hhciAqJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm86OkNvbnN0cmFpbnRJbmZvICZJbmZvKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdDsKKyAgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3QgeworICBib29sIGhhc0ZlYXR1cmUoU3RyaW5nUmVmIEZlYXR1cmUpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gRmVhdHVyZSA9PSAiaGV4YWdvbiI7CiAgIH0KLSAgCi0gIHZpcnR1YWwgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCB7CisKKyAgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFRhcmdldEluZm86OkNoYXJQdHJCdWlsdGluVmFMaXN0OwogICB9Ci0gIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICogY29uc3QgKiZOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdBbGlhc2VzKGNvbnN0IEdDQ1JlZ0FsaWFzIComQWxpYXNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0OwotICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldENsb2JiZXJzKCkgY29uc3QgeworICB2b2lkIGdldEdDQ1JlZ05hbWVzKGNvbnN0IGNoYXIgKiBjb25zdCAqJk5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0R0NDUmVnQWxpYXNlcyhjb25zdCBHQ0NSZWdBbGlhcyAqJkFsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3Qgb3ZlcnJpZGU7CisgIGNvbnN0IGNoYXIgKmdldENsb2JiZXJzKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiAiIjsKICAgfQogCkBAIC00Mjg4LDcgKzQ3MzcsNyBAQAogICAgICAgLkRlZmF1bHQoMCk7CiAgIH0KIAotICB2aXJ0dWFsIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBvdmVycmlkZSB7CiAgICAgaWYgKCFnZXRIZXhhZ29uQ1BVU3VmZml4KE5hbWUpKQogICAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC00Mzk2LDQ3ICs0ODQ1LDQ3IEBACiBwdWJsaWM6CiAgIFNwYXJjVGFyZ2V0SW5mbyhjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkgOiBUYXJnZXRJbmZvKFRyaXBsZSkge30KIAotICB2aXJ0dWFsIGJvb2wgaGFuZGxlVGFyZ2V0RmVhdHVyZXMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZGZWF0dXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFncykgeworICBib29sIGhhbmRsZVRhcmdldEZlYXR1cmVzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmRmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKSBvdmVycmlkZSB7CiAgICAgU29mdEZsb2F0ID0gZmFsc2U7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZlYXR1cmVzLnNpemUoKTsgaSAhPSBlOyArK2kpCiAgICAgICBpZiAoRmVhdHVyZXNbaV0gPT0gIitzb2Z0LWZsb2F0IikKICAgICAgICAgU29mdEZsb2F0ID0gdHJ1ZTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIERlZmluZVN0ZChCdWlsZGVyLCAic3BhcmMiLCBPcHRzKTsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX1JFR0lTVEVSX1BSRUZJWF9fIiwgIiIpOwogCiAgICAgaWYgKFNvZnRGbG9hdCkKICAgICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIlNPRlRfRkxPQVQiLCAiMSIpOwogICB9Ci0gIAotICB2aXJ0dWFsIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3QgeworCisgIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8Ym9vbD4oRmVhdHVyZSkKICAgICAgICAgICAgICAuQ2FzZSgic29mdGZsb2F0IiwgU29mdEZsb2F0KQogICAgICAgICAgICAgIC5DYXNlKCJzcGFyYyIsIHRydWUpCiAgICAgICAgICAgICAgLkRlZmF1bHQoZmFsc2UpOwogICB9Ci0gIAotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0QnVpbHRpbnMoY29uc3QgQnVpbHRpbjo6SW5mbyAqJlJlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtUmVjb3JkcykgY29uc3QgeworCisgIHZvaWQgZ2V0VGFyZ2V0QnVpbHRpbnMoY29uc3QgQnVpbHRpbjo6SW5mbyAqJlJlY29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBGSVhNRTogSW1wbGVtZW50IQogICB9Ci0gIHZpcnR1YWwgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCB7CisgIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBUYXJnZXRJbmZvOjpWb2lkUHRyQnVpbHRpblZhTGlzdDsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0R0NDUmVnTmFtZXMoY29uc3QgY2hhciAqIGNvbnN0IComTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtTmFtZXMpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgZ2V0R0NDUmVnQWxpYXNlcyhjb25zdCBHQ0NSZWdBbGlhcyAqJkFsaWFzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1BbGlhc2VzKSBjb25zdDsKLSAgdmlydHVhbCBib29sIHZhbGlkYXRlQXNtQ29uc3RyYWludChjb25zdCBjaGFyIComTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmaW5mbykgY29uc3QgeworICB2b2lkIGdldEdDQ1JlZ05hbWVzKGNvbnN0IGNoYXIgKiBjb25zdCAqJk5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0R0NDUmVnQWxpYXNlcyhjb25zdCBHQ0NSZWdBbGlhcyAqJkFsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmaW5mbykgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQhCiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIgKmdldENsb2JiZXJzKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQhCiAgICAgcmV0dXJuICIiOwogICB9CkBAIC00NTAwLDEzICs0OTQ5LDExIEBACiBjbGFzcyBTcGFyY1Y4VGFyZ2V0SW5mbyA6IHB1YmxpYyBTcGFyY1RhcmdldEluZm8gewogcHVibGljOgogICBTcGFyY1Y4VGFyZ2V0SW5mbyhjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkgOiBTcGFyY1RhcmdldEluZm8oVHJpcGxlKSB7Ci0gICAgLy8gRklYTUU6IFN1cHBvcnQgU3BhcmMgcXVhZC1wcmVjaXNpb24gbG9uZyBkb3VibGU/Ci0gICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiRS1wOjMyOjMyOjMyLWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAiaTY0OjY0OjY0LWYzMjozMjozMi1mNjQ6NjQ6NjQtdjY0OjY0OjY0LW4zMi1TNjQiOworICAgIERlc2NyaXB0aW9uU3RyaW5nID0gIkUtbTplLXA6MzI6MzItaTY0OjY0LWYxMjg6NjQtbjMyLVM2NCI7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIFNwYXJjVGFyZ2V0SW5mbzo6Z2V0VGFyZ2V0RGVmaW5lcyhPcHRzLCBCdWlsZGVyKTsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX3NwYXJjdjgiKTsKICAgfQpAQCAtNDUxNyw4ICs0OTY0LDcgQEAKIHB1YmxpYzoKICAgU3BhcmNWOVRhcmdldEluZm8oY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUpIDogU3BhcmNUYXJnZXRJbmZvKFRyaXBsZSkgewogICAgIC8vIEZJWE1FOiBTdXBwb3J0IFNwYXJjIHF1YWQtcHJlY2lzaW9uIGxvbmcgZG91YmxlPwotICAgIERlc2NyaXB0aW9uU3RyaW5nID0gIkUtcDo2NDo2NDo2NC1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItIgotICAgICAgICAgICAgICAgICAgICAgICAgImk2NDo2NDo2NC1mMzI6MzI6MzItZjY0OjY0OjY0LXY2NDo2NDo2NC1uMzI6NjQtUzEyOCI7CisgICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiRS1tOmUtaTY0OjY0LW4zMjo2NC1TMTI4IjsKICAgICAvLyBUaGlzIGlzIGFuIExQNjQgcGxhdGZvcm0uCiAgICAgTG9uZ1dpZHRoID0gTG9uZ0FsaWduID0gUG9pbnRlcldpZHRoID0gUG9pbnRlckFsaWduID0gNjQ7CiAKQEAgLTQ1MzEsMTAgKzQ5NzcsMTcgQEAKICAgICAgIFVJbnRNYXhUeXBlID0gVW5zaWduZWRMb25nOwogICAgIH0KICAgICBJbnQ2NFR5cGUgPSBJbnRNYXhUeXBlOworCisgICAgLy8gVGhlIFNQQVJDdjggU3lzdGVtIFYgQUJJIGhhcyBsb25nIGRvdWJsZSAxMjgtYml0cyBpbiBzaXplLCBidXQgNjQtYml0CisgICAgLy8gYWxpZ25lZC4gVGhlIFNQQVJDdjkgU0NEIDIuNC4xIHNheXMgMTYtYnl0ZSBhbGlnbmVkLgorICAgIExvbmdEb3VibGVXaWR0aCA9IDEyODsKKyAgICBMb25nRG91YmxlQWxpZ24gPSAxMjg7CisgICAgTG9uZ0RvdWJsZUZvcm1hdCA9ICZsbHZtOjpBUEZsb2F0OjpJRUVFcXVhZDsKKyAgICBNYXhBdG9taWNQcm9tb3RlV2lkdGggPSBNYXhBdG9taWNJbmxpbmVXaWR0aCA9IDY0OwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBTcGFyY1RhcmdldEluZm86OmdldFRhcmdldERlZmluZXMoT3B0cywgQnVpbGRlcik7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19zcGFyY3Y5Iik7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19hcmNoNjRfXyIpOwpAQCAtNDU0Nyw2ICs1MDAwLDIyIEBACiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX3NwYXJjdjlfXyIpOwogICAgIH0KICAgfQorCisgIGJvb2wgc2V0Q1BVKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBvdmVycmlkZSB7CisgICAgYm9vbCBDUFVLbm93biA9IGxsdm06OlN0cmluZ1N3aXRjaDxib29sPihOYW1lKQorICAgICAgLkNhc2UoInY5IiwgdHJ1ZSkKKyAgICAgIC5DYXNlKCJ1bHRyYXNwYXJjIiwgdHJ1ZSkKKyAgICAgIC5DYXNlKCJ1bHRyYXNwYXJjMyIsIHRydWUpCisgICAgICAuQ2FzZSgibmlhZ2FyYSIsIHRydWUpCisgICAgICAuQ2FzZSgibmlhZ2FyYTIiLCB0cnVlKQorICAgICAgLkNhc2UoIm5pYWdhcmEzIiwgdHJ1ZSkKKyAgICAgIC5DYXNlKCJuaWFnYXJhNCIsIHRydWUpCisgICAgICAuRGVmYXVsdChmYWxzZSk7CisKKyAgICAvLyBObyBuZWVkIHRvIHN0b3JlIHRoZSBDUFUgeWV0LiAgVGhlcmUgYXJlbid0IGFueSBDUFUtc3BlY2lmaWMKKyAgICAvLyBtYWNyb3MgdG8gZGVmaW5lLgorICAgIHJldHVybiBDUFVLbm93bjsKKyAgfQogfTsKIAogfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZS4KQEAgLTQ1ODQsNDIgKzUwNTMsNDEgQEAKICAgICAgIExvbmdEb3VibGVBbGlnbiA9IDY0OwogICAgICAgTG9uZ0RvdWJsZUZvcm1hdCA9ICZsbHZtOjpBUEZsb2F0OjpJRUVFcXVhZDsKICAgICAgIE1pbkdsb2JhbEFsaWduID0gMTY7Ci0gICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJFLXA6NjQ6NjQ6NjQtaTE6ODoxNi1pODo4OjE2LWkxNjoxNi1pMzI6MzItaTY0OjY0IgotICAgICAgICItZjMyOjMyLWY2NDo2NC1mMTI4OjY0LWEwOjg6MTYtbjMyOjY0IjsKKyAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gIkUtbTplLWkxOjg6MTYtaTg6ODoxNi1pNjQ6NjQtZjEyODo2NC1hOjg6MTYtbjMyOjY0IjsKICAgICAgIE1heEF0b21pY1Byb21vdGVXaWR0aCA9IE1heEF0b21pY0lubGluZVdpZHRoID0gNjQ7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICAgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX3MzOTBfXyIpOwogICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19zMzkweF9fIik7CiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX3phcmNoX18iKTsKICAgICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fTE9OR19ET1VCTEVfMTI4X18iKTsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtUmVjb3JkcykgY29uc3QgeworICAgIHZvaWQgZ2V0VGFyZ2V0QnVpbHRpbnMoY29uc3QgQnVpbHRpbjo6SW5mbyAqJlJlY29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtUmVjb3JkcykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgLy8gRklYTUU6IEltcGxlbWVudC4KICAgICAgIFJlY29yZHMgPSAwOwogICAgICAgTnVtUmVjb3JkcyA9IDA7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGdldEdDQ1JlZ05hbWVzKGNvbnN0IGNoYXIgKmNvbnN0IComTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1BbGlhc2VzKSBjb25zdCB7CisgICAgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICpjb25zdCAqJk5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgLy8gTm8gYWxpYXNlcy4KICAgICAgIEFsaWFzZXMgPSAwOwogICAgICAgTnVtQWxpYXNlcyA9IDA7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFzbUNvbnN0cmFpbnQoY29uc3QgY2hhciAqJk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmaW5mbykgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRDbG9iYmVycygpIGNvbnN0IHsKKyAgICBib29sIHZhbGlkYXRlQXNtQ29uc3RyYWludChjb25zdCBjaGFyIComTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmaW5mbykgY29uc3Qgb3ZlcnJpZGU7CisgICAgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICAvLyBGSVhNRTogSXMgdGhpcyByZWFsbHkgcmlnaHQ/CiAgICAgICByZXR1cm4gIiI7CiAgICAgfQotICAgIHZpcnR1YWwgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCB7CisgICAgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gVGFyZ2V0SW5mbzo6U3lzdGVtWkJ1aWx0aW5WYUxpc3Q7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbCBzZXRDUFUoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgICBib29sIHNldENQVShjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgb3ZlcnJpZGUgewogICAgICAgYm9vbCBDUFVLbm93biA9IGxsdm06OlN0cmluZ1N3aXRjaDxib29sPihOYW1lKQogICAgICAgICAuQ2FzZSgiejEwIiwgdHJ1ZSkKICAgICAgICAgLkNhc2UoInoxOTYiLCB0cnVlKQpAQCAtNDY5Myw0MSArNTE2MSw0MSBAQAogICAgICAgSW50UHRyVHlwZSA9IFNpZ25lZEludDsKICAgICAgIFB0ckRpZmZUeXBlID0gU2lnbmVkSW50OwogICAgICAgU2lnQXRvbWljVHlwZSA9IFNpZ25lZExvbmc7Ci0gICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJlLXA6MTY6MTY6MTYtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MTY6MzItbjg6MTYiOwotICAgfQotICAgIHZpcnR1YWwgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICAgICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiZS1tOmUtcDoxNjoxNi1pMzI6MTY6MzItbjg6MTYiOworICAgIH0KKyAgICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiTVNQNDMwIik7CiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX01TUDQzMF9fIik7CiAgICAgICAvLyBGSVhNRTogZGVmaW5lcyBmb3IgZGlmZmVyZW50ICdmbGF2b3Vycycgb2YgTUNVCiAgICAgfQotICAgIHZpcnR1YWwgdm9pZCBnZXRUYXJnZXRCdWlsdGlucyhjb25zdCBCdWlsdGluOjpJbmZvIComUmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IHsKLSAgICAgLy8gRklYTUU6IEltcGxlbWVudC4KKyAgICB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQuCiAgICAgICBSZWNvcmRzID0gMDsKICAgICAgIE51bVJlY29yZHMgPSAwOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3QgeworICAgIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgcmV0dXJuIEZlYXR1cmUgPT0gIm1zcDQzMCI7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICogY29uc3QgKiZOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0R0NDUmVnQWxpYXNlcyhjb25zdCBHQ0NSZWdBbGlhcyAqJkFsaWFzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0IHsKKyAgICB2b2lkIGdldEdDQ1JlZ05hbWVzKGNvbnN0IGNoYXIgKiBjb25zdCAqJk5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgLy8gTm8gYWxpYXNlcy4KICAgICAgIEFsaWFzZXMgPSAwOwogICAgICAgTnVtQWxpYXNlcyA9IDA7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFzbUNvbnN0cmFpbnQoY29uc3QgY2hhciAqJk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmaW5mbykgY29uc3QgeworICAgIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm86OkNvbnN0cmFpbnRJbmZvICZpbmZvKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICAvLyBObyB0YXJnZXQgY29uc3RyYWludHMgZm9yIG5vdy4KICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRDbG9iYmVycygpIGNvbnN0IHsKKyAgICBjb25zdCBjaGFyICpnZXRDbG9iYmVycygpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIC8vIEZJWE1FOiBJcyB0aGlzIHJlYWxseSByaWdodD8KICAgICAgIHJldHVybiAiIjsKICAgICB9Ci0gICAgdmlydHVhbCBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IHsKKyAgICBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKICAgICAgIHJldHVybiBUYXJnZXRJbmZvOjpDaGFyUHRyQnVpbHRpblZhTGlzdDsKICAgIH0KQEAgLTQ3ODksNDAgKzUyNTcsMzggQEAKICAgICAgIEZsb2F0Rm9ybWF0ID0gJmxsdm06OkFQRmxvYXQ6OklFRUVzaW5nbGU7CiAgICAgICBEb3VibGVGb3JtYXQgPSAmbGx2bTo6QVBGbG9hdDo6SUVFRXNpbmdsZTsKICAgICAgIExvbmdEb3VibGVGb3JtYXQgPSAmbGx2bTo6QVBGbG9hdDo6SUVFRXNpbmdsZTsKLSAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gIkUtcDozMjozMjozMi1pMTo4OjgtaTg6ODozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJpMTY6MTY6MzItaTMyOjMyOjMyLWk2NDozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJmMzI6MzI6MzItZjY0OjMyOjMyLXY2NDozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ2MTI4OjMyOjMyLWEwOjA6MzItbjMyIjsKKyAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gIkUtcDozMjozMi1pODo4OjMyLWkxNjoxNjozMi1pNjQ6MzIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICItZjY0OjMyLXY2NDozMi12MTI4OjMyLWE6MDozMi1uMzIiOwogICAgICAgQWRkclNwYWNlTWFwID0gJlRDRU9wZW5DTEFkZHJTcGFjZU1hcDsKICAgICAgIFVzZUFkZHJTcGFjZU1hcE1hbmdsaW5nID0gdHJ1ZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgRGVmaW5lU3RkKEJ1aWxkZXIsICJ0Y2UiLCBPcHRzKTsKICAgICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fVENFX18iKTsKICAgICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fVENFX1YxX18iKTsKICAgICB9Ci0gICAgdmlydHVhbCBib29sIGhhc0ZlYXR1cmUoU3RyaW5nUmVmIEZlYXR1cmUpIGNvbnN0IHsKKyAgICBib29sIGhhc0ZlYXR1cmUoU3RyaW5nUmVmIEZlYXR1cmUpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHJldHVybiBGZWF0dXJlID09ICJ0Y2UiOwogICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0QnVpbHRpbnMoY29uc3QgQnVpbHRpbjo6SW5mbyAqJlJlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1SZWNvcmRzKSBjb25zdCB7fQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCB7CisKKyAgICB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IG92ZXJyaWRlIHt9CisgICAgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gIiI7CiAgICAgfQotICAgIHZpcnR1YWwgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCB7CisgICAgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gVGFyZ2V0SW5mbzo6Vm9pZFB0ckJ1aWx0aW5WYUxpc3Q7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICogY29uc3QgKiZOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdCB7fQotICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFzbUNvbnN0cmFpbnQoY29uc3QgY2hhciAqJk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmaW5mbykgY29uc3QgeworICAgIHZvaWQgZ2V0R0NDUmVnTmFtZXMoY29uc3QgY2hhciAqIGNvbnN0IComTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtTmFtZXMpIGNvbnN0IG92ZXJyaWRlIHt9CisgICAgYm9vbCB2YWxpZGF0ZUFzbUNvbnN0cmFpbnQoY29uc3QgY2hhciAqJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SW5mbzo6Q29uc3RyYWludEluZm8gJmluZm8pIGNvbnN0IG92ZXJyaWRlewogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdBbGlhc2VzKGNvbnN0IEdDQ1JlZ0FsaWFzIComQWxpYXNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3Qge30KKyAgICB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3Qgb3ZlcnJpZGUge30KICAgfTsKIH0KIApAQCAtNDg1NSwyMSArNTMyMSwzMSBAQAogICAgICAgICBJc05hbjIwMDgoZmFsc2UpLCBJc1NpbmdsZUZsb2F0KGZhbHNlKSwgRmxvYXRBQkkoSGFyZEZsb2F0KSwKICAgICAgICAgRHNwUmV2KE5vRFNQKSwgSGFzTVNBKGZhbHNlKSwgSGFzRlA2NChmYWxzZSksIEFCSShBQklTdHIpIHt9CiAKLSAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRBQkkoKSBjb25zdCB7IHJldHVybiBBQkkuY19zdHIoKTsgfQotICB2aXJ0dWFsIGJvb2wgc2V0QUJJKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBzZXRDUFUoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgY29uc3QgY2hhciAqZ2V0QUJJKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQUJJLmNfc3RyKCk7IH0KKyAgYm9vbCBzZXRBQkkoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIG92ZXJyaWRlID0gMDsKKyAgYm9vbCBzZXRDUFUoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIG92ZXJyaWRlIHsKICAgICBDUFUgPSBOYW1lOwogICAgIHJldHVybiB0cnVlOwogICB9Ci0gIHZvaWQgZ2V0RGVmYXVsdEZlYXR1cmVzKGxsdm06OlN0cmluZ01hcDxib29sPiAmRmVhdHVyZXMpIGNvbnN0IHsKKyAgdm9pZCBnZXREZWZhdWx0RmVhdHVyZXMobGx2bTo6U3RyaW5nTWFwPGJvb2w+ICZGZWF0dXJlcykgY29uc3Qgb3ZlcnJpZGUgeworICAgIC8vIFRoZSBiYWNrZW5kIGVuYWJsZXMgY2VydGFpbiBBQkkncyBieSBkZWZhdWx0IGFjY29yZGluZyB0byB0aGUKKyAgICAvLyBhcmNoaXRlY3R1cmUuCisgICAgLy8gRGlzYWJsZSBib3RoIHBvc3NpYmxlIGRlZmF1bHRzIHNvIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIHdpdGggbXVsdGlwbGUKKyAgICAvLyBBQkkncyBzZWxlY3RlZCBhbmQgdHJpZ2dlciBhbiBhc3NlcnRpb24uCisgICAgRmVhdHVyZXNbIm8zMiJdID0gZmFsc2U7CisgICAgRmVhdHVyZXNbIm42NCJdID0gZmFsc2U7CisKICAgICBGZWF0dXJlc1tBQkldID0gdHJ1ZTsKICAgICBGZWF0dXJlc1tDUFVdID0gdHJ1ZTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKLSAgICBEZWZpbmVTdGQoQnVpbGRlciwgIm1pcHMiLCBPcHRzKTsKKyAgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19taXBzX18iKTsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfbWlwcyIpOworICAgIGlmIChPcHRzLkdOVU1vZGUpCisgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJtaXBzIik7CisKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX1JFR0lTVEVSX1BSRUZJWF9fIiwgIiIpOwogCiAgICAgc3dpdGNoIChGbG9hdEFCSSkgewpAQCAtNDkyMiwyMiArNTM5OCwyMiBAQAogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9NSVBTX0FSQ0hfIiArIFN0cmluZ1JlZihDUFUpLnVwcGVyKCkpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IHsKKyAgdm9pZCBnZXRUYXJnZXRCdWlsdGlucyhjb25zdCBCdWlsdGluOjpJbmZvIComUmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtUmVjb3JkcykgY29uc3Qgb3ZlcnJpZGUgewogICAgIFJlY29yZHMgPSBCdWlsdGluSW5mbzsKICAgICBOdW1SZWNvcmRzID0gY2xhbmc6Ok1pcHM6Okxhc3RUU0J1aWx0aW4gLSBCdWlsdGluOjpGaXJzdFRTQnVpbHRpbjsKICAgfQotICB2aXJ0dWFsIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3QgeworICBib29sIGhhc0ZlYXR1cmUoU3RyaW5nUmVmIEZlYXR1cmUpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGJvb2w+KEZlYXR1cmUpCiAgICAgICAuQ2FzZSgibWlwcyIsIHRydWUpCiAgICAgICAuQ2FzZSgiZnA2NCIsIEhhc0ZQNjQpCiAgICAgICAuRGVmYXVsdChmYWxzZSk7CiAgIH0KLSAgdmlydHVhbCBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IHsKKyAgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFRhcmdldEluZm86OlZvaWRQdHJCdWlsdGluVmFMaXN0OwogICB9Ci0gIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICogY29uc3QgKiZOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3QgeworICB2b2lkIGdldEdDQ1JlZ05hbWVzKGNvbnN0IGNoYXIgKiBjb25zdCAqJk5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBHQ0NSZWdOYW1lc1tdID0gewogICAgICAgLy8gQ1BVIHJlZ2lzdGVyIG5hbWVzCiAgICAgICAvLyBNdXN0IG1hdGNoIHNlY29uZCBjb2x1bW4gb2YgR0NDUmVnQWxpYXNlcwpAQCAtNDk2NSwxMCArNTQ0MSwxMCBAQAogICAgIE5hbWVzID0gR0NDUmVnTmFtZXM7CiAgICAgTnVtTmFtZXMgPSBsbHZtOjphcnJheV9sZW5ndGhvZihHQ0NSZWdOYW1lcyk7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3QgPSAwOwotICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm86OkNvbnN0cmFpbnRJbmZvICZJbmZvKSBjb25zdCB7CisgIHZvaWQgZ2V0R0NDUmVnQWxpYXNlcyhjb25zdCBHQ0NSZWdBbGlhcyAqJkFsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3Qgb3ZlcnJpZGUgPSAwOworICBib29sIHZhbGlkYXRlQXNtQ29uc3RyYWludChjb25zdCBjaGFyIComTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SW5mbzo6Q29uc3RyYWludEluZm8gJkluZm8pIGNvbnN0IG92ZXJyaWRlIHsKICAgICBzd2l0Y2ggKCpOYW1lKSB7CiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTQ5ODgsMTMgKzU0NjQsMTMgQEAKICAgICB9CiAgIH0KIAotICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldENsb2JiZXJzKCkgY29uc3QgeworICBjb25zdCBjaGFyICpnZXRDbG9iYmVycygpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBGSVhNRTogSW1wbGVtZW50IQogICAgIHJldHVybiAiIjsKICAgfQogCi0gIHZpcnR1YWwgYm9vbCBoYW5kbGVUYXJnZXRGZWF0dXJlcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkZlYXR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKSB7CisgIGJvb2wgaGFuZGxlVGFyZ2V0RmVhdHVyZXMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZGZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpIG92ZXJyaWRlIHsKICAgICBJc01pcHMxNiA9IGZhbHNlOwogICAgIElzTWljcm9taXBzID0gZmFsc2U7CiAgICAgSXNOYW4yMDA4ID0gZmFsc2U7CkBAIC01MDQxLDcgKzU1MTcsNyBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgdmlydHVhbCBpbnQgZ2V0RUhEYXRhUmVnaXN0ZXJOdW1iZXIodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgaW50IGdldEVIRGF0YVJlZ2lzdGVyTnVtYmVyKHVuc2lnbmVkIFJlZ05vKSBjb25zdCBvdmVycmlkZSB7CiAgICAgaWYgKFJlZ05vID09IDApIHJldHVybiA0OwogICAgIGlmIChSZWdObyA9PSAxKSByZXR1cm4gNTsKICAgICByZXR1cm4gLTE7CkBAIC01MDU4LDEyICs1NTM0LDEyIEBACiBjbGFzcyBNaXBzMzJUYXJnZXRJbmZvQmFzZSA6IHB1YmxpYyBNaXBzVGFyZ2V0SW5mb0Jhc2UgewogcHVibGljOgogICBNaXBzMzJUYXJnZXRJbmZvQmFzZShjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkKLSAgICAgIDogTWlwc1RhcmdldEluZm9CYXNlKFRyaXBsZSwgIm8zMiIsICJtaXBzMzIiKSB7CisgICAgICA6IE1pcHNUYXJnZXRJbmZvQmFzZShUcmlwbGUsICJvMzIiLCAibWlwczMycjIiKSB7CiAgICAgU2l6ZVR5cGUgPSBVbnNpZ25lZEludDsKICAgICBQdHJEaWZmVHlwZSA9IFNpZ25lZEludDsKICAgICBNYXhBdG9taWNQcm9tb3RlV2lkdGggPSBNYXhBdG9taWNJbmxpbmVXaWR0aCA9IDMyOwogICB9Ci0gIHZpcnR1YWwgYm9vbCBzZXRBQkkoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgYm9vbCBzZXRBQkkoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIG92ZXJyaWRlIHsKICAgICBpZiAoKE5hbWUgPT0gIm8zMiIpIHx8IChOYW1lID09ICJlYWJpIikpIHsKICAgICAgIEFCSSA9IE5hbWU7CiAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTUwNzMsMTAgKzU1NDksMTIgQEAKICAgICB9IGVsc2UKICAgICAgIHJldHVybiBmYWxzZTsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIE1pcHNUYXJnZXRJbmZvQmFzZTo6Z2V0VGFyZ2V0RGVmaW5lcyhPcHRzLCBCdWlsZGVyKTsKIAorICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fbWlwcyIsICIzMiIpOworCiAgICAgaWYgKEFCSSA9PSAibzMyIikgewogICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19taXBzX28zMiIpOwogICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX0FCSU8zMiIsICIxIik7CkBAIC01MDg3LDggKzU1NjUsOCBAQAogICAgIGVsc2UKICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgQUJJIGZvciBNaXBzMzIuIik7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3QgeworICB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBzdGF0aWMgY29uc3QgVGFyZ2V0SW5mbzo6R0NDUmVnQWxpYXMgR0NDUmVnQWxpYXNlc1tdID0gewogICAgICAgeyB7ICJhdCIgfSwgICIkMSIgfSwKICAgICAgIHsgeyAidjAiIH0sICAiJDIiIH0sCkBAIC01MTI4LDE3ICs1NjA2LDE2IEBACiB9OwogCiBjbGFzcyBNaXBzMzJFQlRhcmdldEluZm8gOiBwdWJsaWMgTWlwczMyVGFyZ2V0SW5mb0Jhc2UgewotICB2aXJ0dWFsIHZvaWQgc2V0RGVzY3JpcHRpb25TdHJpbmcoKSB7Ci0gICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiRS1wOjMyOjMyOjMyLWkxOjg6OC1pODo4OjMyLWkxNjoxNjozMi1pMzI6MzI6MzItIgotICAgICAgICAgICAgICAgICAgICAgICAgImk2NDo2NDo2NC1mMzI6MzI6MzItZjY0OjY0OjY0LXY2NDo2NDo2NC1uMzItUzY0IjsKKyAgdm9pZCBzZXREZXNjcmlwdGlvblN0cmluZygpIG92ZXJyaWRlIHsKKyAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJFLW06bS1wOjMyOjMyLWk4Ojg6MzItaTE2OjE2OjMyLWk2NDo2NC1uMzItUzY0IjsKICAgfQogCiBwdWJsaWM6CiAgIE1pcHMzMkVCVGFyZ2V0SW5mbyhjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkKICAgICAgIDogTWlwczMyVGFyZ2V0SW5mb0Jhc2UoVHJpcGxlKSB7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBEZWZpbmVTdGQoQnVpbGRlciwgIk1JUFNFQiIsIE9wdHMpOwogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9NSVBTRUIiKTsKICAgICBNaXBzMzJUYXJnZXRJbmZvQmFzZTo6Z2V0VGFyZ2V0RGVmaW5lcyhPcHRzLCBCdWlsZGVyKTsKQEAgLTUxNDYsOSArNTYyMyw4IEBACiB9OwogCiBjbGFzcyBNaXBzMzJFTFRhcmdldEluZm8gOiBwdWJsaWMgTWlwczMyVGFyZ2V0SW5mb0Jhc2UgewotICB2aXJ0dWFsIHZvaWQgc2V0RGVzY3JpcHRpb25TdHJpbmcoKSB7Ci0gICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiZS1wOjMyOjMyOjMyLWkxOjg6OC1pODo4OjMyLWkxNjoxNjozMi1pMzI6MzI6MzItIgotICAgICAgICAgICAgICAgICAgICAgICAgImk2NDo2NDo2NC1mMzI6MzI6MzItZjY0OjY0OjY0LXY2NDo2NDo2NC1uMzItUzY0IjsKKyAgdm9pZCBzZXREZXNjcmlwdGlvblN0cmluZygpIG92ZXJyaWRlIHsKKyAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJlLW06bS1wOjMyOjMyLWk4Ojg6MzItaTE2OjE2OjMyLWk2NDo2NC1uMzItUzY0IjsKICAgfQogCiBwdWJsaWM6CkBAIC01MTU2LDggKzU2MzIsOCBAQAogICAgICAgOiBNaXBzMzJUYXJnZXRJbmZvQmFzZShUcmlwbGUpIHsKICAgICBCaWdFbmRpYW4gPSBmYWxzZTsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIERlZmluZVN0ZChCdWlsZGVyLCAiTUlQU0VMIiwgT3B0cyk7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX01JUFNFTCIpOwogICAgIE1pcHMzMlRhcmdldEluZm9CYXNlOjpnZXRUYXJnZXREZWZpbmVzKE9wdHMsIEJ1aWxkZXIpOwpAQCAtNTE2Nyw3ICs1NjQzLDcgQEAKIGNsYXNzIE1pcHM2NFRhcmdldEluZm9CYXNlIDogcHVibGljIE1pcHNUYXJnZXRJbmZvQmFzZSB7CiBwdWJsaWM6CiAgIE1pcHM2NFRhcmdldEluZm9CYXNlKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKQotICAgICAgOiBNaXBzVGFyZ2V0SW5mb0Jhc2UoVHJpcGxlLCAibjY0IiwgIm1pcHM2NCIpIHsKKyAgICAgIDogTWlwc1RhcmdldEluZm9CYXNlKFRyaXBsZSwgIm42NCIsICJtaXBzNjRyMiIpIHsKICAgICBMb25nV2lkdGggPSBMb25nQWxpZ24gPSA2NDsKICAgICBQb2ludGVyV2lkdGggPSBQb2ludGVyQWxpZ24gPSA2NDsKICAgICBMb25nRG91YmxlV2lkdGggPSBMb25nRG91YmxlQWxpZ24gPSAxMjg7CkBAIC01MTc5LDcgKzU2NTUsNyBAQAogICAgIFN1aXRhYmxlQWxpZ24gPSAxMjg7CiAgICAgTWF4QXRvbWljUHJvbW90ZVdpZHRoID0gTWF4QXRvbWljSW5saW5lV2lkdGggPSA2NDsKICAgfQotICB2aXJ0dWFsIGJvb2wgc2V0QUJJKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgIGJvb2wgc2V0QUJJKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBvdmVycmlkZSB7CiAgICAgaWYgKE5hbWUgPT0gIm4zMiIpIHsKICAgICAgIExvbmdXaWR0aCA9IExvbmdBbGlnbiA9IDMyOwogICAgICAgUG9pbnRlcldpZHRoID0gUG9pbnRlckFsaWduID0gMzI7CkBAIC01MTk0LDEwICs1NjcwLDExIEBACiAgICAgfSBlbHNlCiAgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBNaXBzVGFyZ2V0SW5mb0Jhc2U6OmdldFRhcmdldERlZmluZXMoT3B0cywgQnVpbGRlcik7CiAKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX21pcHMiLCAiNjQiKTsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX21pcHM2NCIpOwogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fbWlwczY0X18iKTsKIApAQCAtNTIxNCw4ICs1NjkxLDggQEAKICAgICBlbHNlCiAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIEFCSSBmb3IgTWlwczY0LiIpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdBbGlhc2VzKGNvbnN0IEdDQ1JlZ0FsaWFzIComQWxpYXNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0IHsKKyAgdm9pZCBnZXRHQ0NSZWdBbGlhc2VzKGNvbnN0IEdDQ1JlZ0FsaWFzIComQWxpYXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1BbGlhc2VzKSBjb25zdCBvdmVycmlkZSB7CiAgICAgc3RhdGljIGNvbnN0IFRhcmdldEluZm86OkdDQ1JlZ0FsaWFzIEdDQ1JlZ0FsaWFzZXNbXSA9IHsKICAgICAgIHsgeyAiYXQiIH0sICAiJDEiIH0sCiAgICAgICB7IHsgInYwIiB9LCAgIiQyIiB9LApAQCAtNTI1NSwyMyArNTczMiwxOSBAQAogfTsKIAogY2xhc3MgTWlwczY0RUJUYXJnZXRJbmZvIDogcHVibGljIE1pcHM2NFRhcmdldEluZm9CYXNlIHsKLSAgdmlydHVhbCB2b2lkIHNldERlc2NyaXB0aW9uU3RyaW5nKCkgeworICB2b2lkIHNldERlc2NyaXB0aW9uU3RyaW5nKCkgb3ZlcnJpZGUgewogICAgIGlmIChBQkkgPT0gIm4zMiIpCi0gICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJFLXA6MzI6MzI6MzItaTE6ODo4LWk4Ojg6MzItaTE2OjE2OjMyLWkzMjozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC1mMTI4OjEyODoxMjgtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAidjY0OjY0OjY0LW4zMjo2NC1TMTI4IjsKKyAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gIkUtbTptLXA6MzI6MzItaTg6ODozMi1pMTY6MTY6MzItaTY0OjY0LW4zMjo2NC1TMTI4IjsKICAgICBlbHNlCi0gICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJFLXA6NjQ6NjQ6NjQtaTE6ODo4LWk4Ojg6MzItaTE2OjE2OjMyLWkzMjozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC1mMTI4OjEyODoxMjgtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAidjY0OjY0OjY0LW4zMjo2NC1TMTI4IjsKKyAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gIkUtbTptLWk4Ojg6MzItaTE2OjE2OjMyLWk2NDo2NC1uMzI6NjQtUzEyOCI7CiAKICAgfQogCiBwdWJsaWM6CiAgIE1pcHM2NEVCVGFyZ2V0SW5mbyhjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkKICAgICAgIDogTWlwczY0VGFyZ2V0SW5mb0Jhc2UoVHJpcGxlKSB7fQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgIERlZmluZVN0ZChCdWlsZGVyLCAiTUlQU0VCIiwgT3B0cyk7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX01JUFNFQiIpOwogICAgIE1pcHM2NFRhcmdldEluZm9CYXNlOjpnZXRUYXJnZXREZWZpbmVzKE9wdHMsIEJ1aWxkZXIpOwpAQCAtNTI3OSwxNSArNTc1MiwxMSBAQAogfTsKIAogY2xhc3MgTWlwczY0RUxUYXJnZXRJbmZvIDogcHVibGljIE1pcHM2NFRhcmdldEluZm9CYXNlIHsKLSAgdmlydHVhbCB2b2lkIHNldERlc2NyaXB0aW9uU3RyaW5nKCkgeworICB2b2lkIHNldERlc2NyaXB0aW9uU3RyaW5nKCkgb3ZlcnJpZGUgewogICAgIGlmIChBQkkgPT0gIm4zMiIpCi0gICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJlLXA6MzI6MzI6MzItaTE6ODo4LWk4Ojg6MzItaTE2OjE2OjMyLWkzMjozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC1mMTI4OjEyODoxMjgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICItdjY0OjY0OjY0LW4zMjo2NC1TMTI4IjsKKyAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gImUtbTptLXA6MzI6MzItaTg6ODozMi1pMTY6MTY6MzItaTY0OjY0LW4zMjo2NC1TMTI4IjsKICAgICBlbHNlCi0gICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJlLXA6NjQ6NjQ6NjQtaTE6ODo4LWk4Ojg6MzItaTE2OjE2OjMyLWkzMjozMjozMi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC1mMTI4OjEyODoxMjgtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAidjY0OjY0OjY0LW4zMjo2NC1TMTI4IjsKKyAgICAgIERlc2NyaXB0aW9uU3RyaW5nID0gImUtbTptLWk4Ojg6MzItaTE2OjE2OjMyLWk2NDo2NC1uMzI6NjQtUzEyOCI7CiAgIH0KIHB1YmxpYzoKICAgTWlwczY0RUxUYXJnZXRJbmZvKGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKQpAQCAtNTI5NSw4ICs1NzY0LDggQEAKICAgICAvLyBEZWZhdWx0IEFCSSBpcyBuNjQuCiAgICAgQmlnRW5kaWFuID0gZmFsc2U7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBEZWZpbmVTdGQoQnVpbGRlciwgIk1JUFNFTCIsIE9wdHMpOwogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9NSVBTRUwiKTsKICAgICBNaXBzNjRUYXJnZXRJbmZvQmFzZTo6Z2V0VGFyZ2V0RGVmaW5lcyhPcHRzLCBCdWlsZGVyKTsKQEAgLTUzMjQsNDEgKzU3OTMsMzcgQEAKICAgICB0aGlzLT5QdHJEaWZmVHlwZSA9IFRhcmdldEluZm86OlNpZ25lZEludDsKICAgICB0aGlzLT5JbnRQdHJUeXBlID0gVGFyZ2V0SW5mbzo6U2lnbmVkSW50OwogICAgIHRoaXMtPlJlZ1Bhcm1NYXggPSAwOyAvLyBEaXNhbGxvdyByZWdwYXJtCi0gICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiZS1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItaTY0OjY0OjY0LSIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmMzI6MzI6MzItZjY0OjY0OjY0LXA6MzI6MzI6MzItdjEyODozMjozMiI7CiAgIH0KIAotICB2b2lkIGdldERlZmF1bHRGZWF0dXJlcyhsbHZtOjpTdHJpbmdNYXA8Ym9vbD4gJkZlYXR1cmVzKSBjb25zdCB7CisgIHZvaWQgZ2V0RGVmYXVsdEZlYXR1cmVzKGxsdm06OlN0cmluZ01hcDxib29sPiAmRmVhdHVyZXMpIGNvbnN0IG92ZXJyaWRlIHsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0QXJjaERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgdm9pZCBnZXRBcmNoRGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19sZTMyX18iKTsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX3BuYWNsX18iKTsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7Ci0gICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19MSVRUTEVfRU5ESUFOX18iKTsKKyAgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCBvdmVycmlkZSB7CiAgICAgZ2V0QXJjaERlZmluZXMoT3B0cywgQnVpbGRlcik7CiAgIH0KLSAgdmlydHVhbCBib29sIGhhc0ZlYXR1cmUoU3RyaW5nUmVmIEZlYXR1cmUpIGNvbnN0IHsKKyAgYm9vbCBoYXNGZWF0dXJlKFN0cmluZ1JlZiBGZWF0dXJlKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIEZlYXR1cmUgPT0gInBuYWNsIjsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0QnVpbHRpbnMoY29uc3QgQnVpbHRpbjo6SW5mbyAqJlJlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtUmVjb3JkcykgY29uc3QgeworICB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1SZWNvcmRzKSBjb25zdCBvdmVycmlkZSB7CiAgIH0KLSAgdmlydHVhbCBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IHsKKyAgQnVpbHRpblZhTGlzdEtpbmQgZ2V0QnVpbHRpblZhTGlzdEtpbmQoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFRhcmdldEluZm86OlBOYUNsQUJJQnVpbHRpblZhTGlzdDsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0R0NDUmVnTmFtZXMoY29uc3QgY2hhciAqIGNvbnN0IComTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtTmFtZXMpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgZ2V0R0NDUmVnQWxpYXNlcyhjb25zdCBHQ0NSZWdBbGlhcyAqJkFsaWFzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1BbGlhc2VzKSBjb25zdDsKLSAgdmlydHVhbCBib29sIHZhbGlkYXRlQXNtQ29uc3RyYWludChjb25zdCBjaGFyIComTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmSW5mbykgY29uc3QgeworICB2b2lkIGdldEdDQ1JlZ05hbWVzKGNvbnN0IGNoYXIgKiBjb25zdCAqJk5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0R0NDUmVnQWxpYXNlcyhjb25zdCBHQ0NSZWdBbGlhcyAqJkFsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmSW5mbykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCB7CisgIGNvbnN0IGNoYXIgKmdldENsb2JiZXJzKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiAiIjsKICAgfQogfTsKQEAgLTU0MDEsMjggKzU4NjYsMjggQEAKICAgICAgIC8vIFRoZXNlIG11c3QgYmUgZGVmaW5lZCBpbiBzb3J0ZWQgb3JkZXIhCiAgICAgICBOb0FzbVZhcmlhbnRzID0gdHJ1ZTsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgICAgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIERlZmluZVN0ZChCdWlsZGVyLCAiU1BJUiIsIE9wdHMpOwogICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3QgeworICAgIGJvb2wgaGFzRmVhdHVyZShTdHJpbmdSZWYgRmVhdHVyZSkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgcmV0dXJuIEZlYXR1cmUgPT0gInNwaXIiOwogICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0QnVpbHRpbnMoY29uc3QgQnVpbHRpbjo6SW5mbyAqJlJlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1SZWNvcmRzKSBjb25zdCB7fQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCB7CisKKyAgICB2b2lkIGdldFRhcmdldEJ1aWx0aW5zKGNvbnN0IEJ1aWx0aW46OkluZm8gKiZSZWNvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IG92ZXJyaWRlIHt9CisgICAgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gIiI7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICogY29uc3QgKiZOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bU5hbWVzKSBjb25zdCB7fQotICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFzbUNvbnN0cmFpbnQoY29uc3QgY2hhciAqJk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmaW5mbykgY29uc3QgeworICAgIHZvaWQgZ2V0R0NDUmVnTmFtZXMoY29uc3QgY2hhciAqIGNvbnN0IComTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtTmFtZXMpIGNvbnN0IG92ZXJyaWRlIHt9CisgICAgYm9vbCB2YWxpZGF0ZUFzbUNvbnN0cmFpbnQoY29uc3QgY2hhciAqJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SW5mbzo6Q29uc3RyYWludEluZm8gJmluZm8pIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0R0NDUmVnQWxpYXNlcyhjb25zdCBHQ0NSZWdBbGlhcyAqJkFsaWFzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0IHt9Ci0gICAgdmlydHVhbCBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IHsKKyAgICB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3Qgb3ZlcnJpZGUge30KKyAgICBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHJldHVybiBUYXJnZXRJbmZvOjpWb2lkUHRyQnVpbHRpblZhTGlzdDsKICAgICB9CiAgIH07CkBAIC01NDM1LDEzICs1OTAwLDExIEBACiAgICAgICBTaXplVHlwZSAgICAgPSBUYXJnZXRJbmZvOjpVbnNpZ25lZEludDsKICAgICAgIFB0ckRpZmZUeXBlID0gSW50UHRyVHlwZSA9IFRhcmdldEluZm86OlNpZ25lZEludDsKICAgICAgIERlc2NyaXB0aW9uU3RyaW5nCi0gICAgICAgID0gImUtcDozMjozMjozMi1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItaTY0OjY0OjY0LSIKLSAgICAgICAgICAiZjMyOjMyOjMyLWY2NDo2NDo2NC12MTY6MTY6MTYtdjI0OjMyOjMyLXYzMjozMjozMi12NDg6NjQ6NjQtIgotICAgICAgICAgICJ2NjQ6NjQ6NjQtdjk2OjEyODoxMjgtdjEyODoxMjg6MTI4LXYxOTI6MjU2OjI1Ni12MjU2OjI1NjoyNTYtIgotICAgICAgICAgICJ2NTEyOjUxMjo1MTItdjEwMjQ6MTAyNDoxMDI0IjsKKyAgICAgICAgPSAiZS1wOjMyOjMyLWk2NDo2NC12MTY6MTYtdjI0OjMyLXYzMjozMi12NDg6NjQtIgorICAgICAgICAgICJ2OTY6MTI4LXYxOTI6MjU2LXYyNTY6MjU2LXY1MTI6NTEyLXYxMDI0OjEwMjQiOwogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0VGFyZ2V0RGVmaW5lcyhjb25zdCBMYW5nT3B0aW9ucyAmT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IHsKKyAgICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgRGVmaW5lU3RkKEJ1aWxkZXIsICJTUElSMzIiLCBPcHRzKTsKICAgICB9CiAgIH07CkBAIC01NDUyLDE0ICs1OTE1LDExIEBACiAgICAgICBQb2ludGVyV2lkdGggPSBQb2ludGVyQWxpZ24gPSA2NDsKICAgICAgIFNpemVUeXBlICAgICA9IFRhcmdldEluZm86OlVuc2lnbmVkTG9uZzsKICAgICAgIFB0ckRpZmZUeXBlID0gSW50UHRyVHlwZSA9IFRhcmdldEluZm86OlNpZ25lZExvbmc7Ci0gICAgICBEZXNjcmlwdGlvblN0cmluZwotICAgICAgICA9ICJlLXA6NjQ6NjQ6NjQtaTE6ODo4LWk4Ojg6OC1pMTY6MTY6MTYtaTMyOjMyOjMyLWk2NDo2NDo2NC0iCi0gICAgICAgICAgImYzMjozMjozMi1mNjQ6NjQ6NjQtdjE2OjE2OjE2LXYyNDozMjozMi12MzI6MzI6MzItdjQ4OjY0OjY0LSIKLSAgICAgICAgICAidjY0OjY0OjY0LXY5NjoxMjg6MTI4LXYxMjg6MTI4OjEyOC12MTkyOjI1NjoyNTYtdjI1NjoyNTY6MjU2LSIKLSAgICAgICAgICAidjUxMjo1MTI6NTEyLXYxMDI0OjEwMjQ6MTAyNCI7CisgICAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJlLWk2NDo2NC12MTY6MTYtdjI0OjMyLXYzMjozMi12NDg6NjQtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAidjk2OjEyOC12MTkyOjI1Ni12MjU2OjI1Ni12NTEyOjUxMi12MTAyNDoxMDI0IjsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9CdWlsZGVyICZCdWlsZGVyKSBjb25zdCB7CisgICAgdm9pZCBnZXRUYXJnZXREZWZpbmVzKGNvbnN0IExhbmdPcHRpb25zICZPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIERlZmluZVN0ZChCdWlsZGVyLCAiU1BJUjY0IiwgT3B0cyk7CiAgICAgfQogICB9OwpAQCAtNTQ4MSwyNyArNTk0MSwyNiBAQAogICAgIFdDaGFyVHlwZSA9IFVuc2lnbmVkQ2hhcjsKICAgICBXSW50VHlwZSA9IFVuc2lnbmVkSW50OwogICAgIFVzZVplcm9MZW5ndGhCaXRmaWVsZEFsaWdubWVudCA9IHRydWU7Ci0gICAgRGVzY3JpcHRpb25TdHJpbmcgPSAiZS1wOjMyOjMyOjMyLWEwOjA6MzItbjMyIgotICAgICAgICAgICAgICAgICAgICAgICAgIi1pMTo4OjMyLWk4Ojg6MzItaTE2OjE2OjMyLWkzMjozMjozMi1pNjQ6MzI6MzIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiLWYxNjoxNjozMi1mMzI6MzI6MzItZjY0OjMyOjMyIjsKKyAgICBEZXNjcmlwdGlvblN0cmluZyA9ICJlLW06ZS1wOjMyOjMyLWkxOjg6MzItaTg6ODozMi1pMTY6MTY6MzItaTY0OjMyIgorICAgICAgICAgICAgICAgICAgICAgICAgIi1mNjQ6MzItYTowOjMyLW4zMiI7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvQnVpbGRlciAmQnVpbGRlcikgY29uc3QgeworICB2b2lkIGdldFRhcmdldERlZmluZXMoY29uc3QgTGFuZ09wdGlvbnMgJk9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX1hTMUJfXyIpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBnZXRUYXJnZXRCdWlsdGlucyhjb25zdCBCdWlsdGluOjpJbmZvIComUmVjb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1SZWNvcmRzKSBjb25zdCB7CisgIHZvaWQgZ2V0VGFyZ2V0QnVpbHRpbnMoY29uc3QgQnVpbHRpbjo6SW5mbyAqJlJlY29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bVJlY29yZHMpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBSZWNvcmRzID0gQnVpbHRpbkluZm87CiAgICAgTnVtUmVjb3JkcyA9IGNsYW5nOjpYQ29yZTo6TGFzdFRTQnVpbHRpbi1CdWlsdGluOjpGaXJzdFRTQnVpbHRpbjsKICAgfQotICB2aXJ0dWFsIEJ1aWx0aW5WYUxpc3RLaW5kIGdldEJ1aWx0aW5WYUxpc3RLaW5kKCkgY29uc3QgeworICBCdWlsdGluVmFMaXN0S2luZCBnZXRCdWlsdGluVmFMaXN0S2luZCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gVGFyZ2V0SW5mbzo6Vm9pZFB0ckJ1aWx0aW5WYUxpc3Q7CiAgIH0KLSAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRDbG9iYmVycygpIGNvbnN0IHsKKyAgY29uc3QgY2hhciAqZ2V0Q2xvYmJlcnMoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuICIiOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBnZXRHQ0NSZWdOYW1lcyhjb25zdCBjaGFyICogY29uc3QgKiZOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3QgeworICB2b2lkIGdldEdDQ1JlZ05hbWVzKGNvbnN0IGNoYXIgKiBjb25zdCAqJk5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOdW1OYW1lcykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgR0NDUmVnTmFtZXNbXSA9IHsKICAgICAgICJyMCIsICAgInIxIiwgICAicjIiLCAgICJyMyIsICAgInI0IiwgICAicjUiLCAgICJyNiIsICAgInI3IiwKICAgICAgICJyOCIsICAgInI5IiwgICAicjEwIiwgICJyMTEiLCAgImNwIiwgICAiZHAiLCAgICJzcCIsICAgImxyIgpAQCAtNTUwOSwxNSArNTk2OCwxOSBAQAogICAgIE5hbWVzID0gR0NDUmVnTmFtZXM7CiAgICAgTnVtTmFtZXMgPSBsbHZtOjphcnJheV9sZW5ndGhvZihHQ0NSZWdOYW1lcyk7CiAgIH0KLSAgdmlydHVhbCB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTnVtQWxpYXNlcykgY29uc3QgeworICB2b2lkIGdldEdDQ1JlZ0FsaWFzZXMoY29uc3QgR0NDUmVnQWxpYXMgKiZBbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUFsaWFzZXMpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBBbGlhc2VzID0gTlVMTDsKICAgICBOdW1BbGlhc2VzID0gMDsKICAgfQotICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEluZm86OkNvbnN0cmFpbnRJbmZvICZJbmZvKSBjb25zdCB7CisgIGJvb2wgdmFsaWRhdGVBc21Db25zdHJhaW50KGNvbnN0IGNoYXIgKiZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJbmZvOjpDb25zdHJhaW50SW5mbyAmSW5mbykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBmYWxzZTsKICAgfQorICBpbnQgZ2V0RUhEYXRhUmVnaXN0ZXJOdW1iZXIodW5zaWduZWQgUmVnTm8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAvLyBSMD1FeGNlcHRpb25Qb2ludGVyUmVnaXN0ZXIgUjE9RXhjZXB0aW9uU2VsZWN0b3JSZWdpc3RlcgorICAgIHJldHVybiAoUmVnTm8gPCAyKT8gUmVnTm8gOiAtMTsKKyAgfQogfTsKIAogY29uc3QgQnVpbHRpbjo6SW5mbyBYQ29yZVRhcmdldEluZm86OkJ1aWx0aW5JbmZvW10gPSB7CkBAIC01NTQwLDYgKzYwMDMsMTcgQEAKICAgZGVmYXVsdDoKICAgICByZXR1cm4gTlVMTDsKIAorICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtNjQ6CisgICAgaWYgKFRyaXBsZS5pc09TRGFyd2luKCkpCisgICAgICByZXR1cm4gbmV3IERhcndpbkFSTTY0VGFyZ2V0SW5mbyhUcmlwbGUpOworCisgICAgc3dpdGNoIChvcykgeworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpMaW51eDoKKyAgICAgIHJldHVybiBuZXcgTGludXhUYXJnZXRJbmZvPEFSTTY0VGFyZ2V0SW5mbz4oVHJpcGxlKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIG5ldyBBUk02NFRhcmdldEluZm8oVHJpcGxlKTsKKyAgICB9CisKICAgY2FzZSBsbHZtOjpUcmlwbGU6Onhjb3JlOgogICAgIHJldHVybiBuZXcgWENvcmVUYXJnZXRJbmZvKFRyaXBsZSk7CiAKQEAgLTU1NDksMzMgKzYwMjMsNjkgQEAKICAgY2FzZSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQ6CiAgICAgc3dpdGNoIChvcykgewogICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpMaW51eDoKLSAgICAgIHJldHVybiBuZXcgTGludXhUYXJnZXRJbmZvPEFBcmNoNjRUYXJnZXRJbmZvPihUcmlwbGUpOworICAgICAgcmV0dXJuIG5ldyBMaW51eFRhcmdldEluZm88QUFyY2g2NGxlVGFyZ2V0SW5mbz4oVHJpcGxlKTsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6TmV0QlNEOgorICAgICAgcmV0dXJuIG5ldyBOZXRCU0RUYXJnZXRJbmZvPEFBcmNoNjRsZVRhcmdldEluZm8+KFRyaXBsZSk7CiAgICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBuZXcgQUFyY2g2NFRhcmdldEluZm8oVHJpcGxlKTsKKyAgICAgIHJldHVybiBuZXcgQUFyY2g2NGxlVGFyZ2V0SW5mbyhUcmlwbGUpOworICAgIH0KKworICBjYXNlIGxsdm06OlRyaXBsZTo6YWFyY2g2NF9iZToKKyAgICBzd2l0Y2ggKG9zKSB7CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkxpbnV4OgorICAgICAgcmV0dXJuIG5ldyBMaW51eFRhcmdldEluZm88QUFyY2g2NGJlVGFyZ2V0SW5mbz4oVHJpcGxlKTsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6TmV0QlNEOgorICAgICAgcmV0dXJuIG5ldyBOZXRCU0RUYXJnZXRJbmZvPEFBcmNoNjRiZVRhcmdldEluZm8+KFRyaXBsZSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBuZXcgQUFyY2g2NGJlVGFyZ2V0SW5mbyhUcmlwbGUpOwogICAgIH0KIAogICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtOgogICBjYXNlIGxsdm06OlRyaXBsZTo6dGh1bWI6CisgICAgaWYgKFRyaXBsZS5pc09TQmluRm9ybWF0TWFjaE8oKSkKKyAgICAgIHJldHVybiBuZXcgRGFyd2luQVJNVGFyZ2V0SW5mbyhUcmlwbGUpOworCisgICAgc3dpdGNoIChvcykgeworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpMaW51eDoKKyAgICAgIHJldHVybiBuZXcgTGludXhUYXJnZXRJbmZvPEFSTWxlVGFyZ2V0SW5mbz4oVHJpcGxlKTsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6RnJlZUJTRDoKKyAgICAgIHJldHVybiBuZXcgRnJlZUJTRFRhcmdldEluZm88QVJNbGVUYXJnZXRJbmZvPihUcmlwbGUpOworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpOZXRCU0Q6CisgICAgICByZXR1cm4gbmV3IE5ldEJTRFRhcmdldEluZm88QVJNbGVUYXJnZXRJbmZvPihUcmlwbGUpOworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpPcGVuQlNEOgorICAgICAgcmV0dXJuIG5ldyBPcGVuQlNEVGFyZ2V0SW5mbzxBUk1sZVRhcmdldEluZm8+KFRyaXBsZSk7CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkJpdHJpZzoKKyAgICAgIHJldHVybiBuZXcgQml0cmlnVGFyZ2V0SW5mbzxBUk1sZVRhcmdldEluZm8+KFRyaXBsZSk7CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OlJURU1TOgorICAgICAgcmV0dXJuIG5ldyBSVEVNU1RhcmdldEluZm88QVJNbGVUYXJnZXRJbmZvPihUcmlwbGUpOworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpOYUNsOgorICAgICAgcmV0dXJuIG5ldyBOYUNsVGFyZ2V0SW5mbzxBUk1sZVRhcmdldEluZm8+KFRyaXBsZSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBuZXcgQVJNbGVUYXJnZXRJbmZvKFRyaXBsZSk7CisgICAgfQorCisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm1lYjoKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OnRodW1iZWI6CiAgICAgaWYgKFRyaXBsZS5pc09TRGFyd2luKCkpCiAgICAgICByZXR1cm4gbmV3IERhcndpbkFSTVRhcmdldEluZm8oVHJpcGxlKTsKIAogICAgIHN3aXRjaCAob3MpIHsKICAgICBjYXNlIGxsdm06OlRyaXBsZTo6TGludXg6Ci0gICAgICByZXR1cm4gbmV3IExpbnV4VGFyZ2V0SW5mbzxBUk1UYXJnZXRJbmZvPihUcmlwbGUpOworICAgICAgcmV0dXJuIG5ldyBMaW51eFRhcmdldEluZm88QVJNYmVUYXJnZXRJbmZvPihUcmlwbGUpOwogICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpGcmVlQlNEOgotICAgICAgcmV0dXJuIG5ldyBGcmVlQlNEVGFyZ2V0SW5mbzxBUk1UYXJnZXRJbmZvPihUcmlwbGUpOworICAgICAgcmV0dXJuIG5ldyBGcmVlQlNEVGFyZ2V0SW5mbzxBUk1iZVRhcmdldEluZm8+KFRyaXBsZSk7CiAgICAgY2FzZSBsbHZtOjpUcmlwbGU6Ok5ldEJTRDoKLSAgICAgIHJldHVybiBuZXcgTmV0QlNEVGFyZ2V0SW5mbzxBUk1UYXJnZXRJbmZvPihUcmlwbGUpOworICAgICAgcmV0dXJuIG5ldyBOZXRCU0RUYXJnZXRJbmZvPEFSTWJlVGFyZ2V0SW5mbz4oVHJpcGxlKTsKICAgICBjYXNlIGxsdm06OlRyaXBsZTo6T3BlbkJTRDoKLSAgICAgIHJldHVybiBuZXcgT3BlbkJTRFRhcmdldEluZm88QVJNVGFyZ2V0SW5mbz4oVHJpcGxlKTsKKyAgICAgIHJldHVybiBuZXcgT3BlbkJTRFRhcmdldEluZm88QVJNYmVUYXJnZXRJbmZvPihUcmlwbGUpOwogICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpCaXRyaWc6Ci0gICAgICByZXR1cm4gbmV3IEJpdHJpZ1RhcmdldEluZm88QVJNVGFyZ2V0SW5mbz4oVHJpcGxlKTsKKyAgICAgIHJldHVybiBuZXcgQml0cmlnVGFyZ2V0SW5mbzxBUk1iZVRhcmdldEluZm8+KFRyaXBsZSk7CiAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OlJURU1TOgotICAgICAgcmV0dXJuIG5ldyBSVEVNU1RhcmdldEluZm88QVJNVGFyZ2V0SW5mbz4oVHJpcGxlKTsKKyAgICAgIHJldHVybiBuZXcgUlRFTVNUYXJnZXRJbmZvPEFSTWJlVGFyZ2V0SW5mbz4oVHJpcGxlKTsKICAgICBjYXNlIGxsdm06OlRyaXBsZTo6TmFDbDoKLSAgICAgIHJldHVybiBuZXcgTmFDbFRhcmdldEluZm88QVJNVGFyZ2V0SW5mbz4oVHJpcGxlKTsKKyAgICAgIHJldHVybiBuZXcgTmFDbFRhcmdldEluZm88QVJNYmVUYXJnZXRJbmZvPihUcmlwbGUpOwogICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gbmV3IEFSTVRhcmdldEluZm8oVHJpcGxlKTsKKyAgICAgIHJldHVybiBuZXcgQVJNYmVUYXJnZXRJbmZvKFRyaXBsZSk7CiAgICAgfQogCiAgIGNhc2UgbGx2bTo6VHJpcGxlOjptc3A0MzA6CkBAIC01NzczLDEyICs2MjgzLDE4IEBACiAgICAgICByZXR1cm4gbmV3IE1pbml4VGFyZ2V0SW5mbzxYODZfMzJUYXJnZXRJbmZvPihUcmlwbGUpOwogICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpTb2xhcmlzOgogICAgICAgcmV0dXJuIG5ldyBTb2xhcmlzVGFyZ2V0SW5mbzxYODZfMzJUYXJnZXRJbmZvPihUcmlwbGUpOwotICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpDeWd3aW46Ci0gICAgICByZXR1cm4gbmV3IEN5Z3dpblg4Nl8zMlRhcmdldEluZm8oVHJpcGxlKTsKLSAgICBjYXNlIGxsdm06OlRyaXBsZTo6TWluR1czMjoKLSAgICAgIHJldHVybiBuZXcgTWluR1dYODZfMzJUYXJnZXRJbmZvKFRyaXBsZSk7Ci0gICAgY2FzZSBsbHZtOjpUcmlwbGU6OldpbjMyOgotICAgICAgcmV0dXJuIG5ldyBWaXN1YWxTdHVkaW9XaW5kb3dzWDg2XzMyVGFyZ2V0SW5mbyhUcmlwbGUpOworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpXaW4zMjogeworICAgICAgc3dpdGNoIChUcmlwbGUuZ2V0RW52aXJvbm1lbnQoKSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIG5ldyBYODZfMzJUYXJnZXRJbmZvKFRyaXBsZSk7CisgICAgICBjYXNlIGxsdm06OlRyaXBsZTo6Q3lnbnVzOgorICAgICAgICByZXR1cm4gbmV3IEN5Z3dpblg4Nl8zMlRhcmdldEluZm8oVHJpcGxlKTsKKyAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpHTlU6CisgICAgICAgIHJldHVybiBuZXcgTWluR1dYODZfMzJUYXJnZXRJbmZvKFRyaXBsZSk7CisgICAgICBjYXNlIGxsdm06OlRyaXBsZTo6TVNWQzoKKyAgICAgICAgcmV0dXJuIG5ldyBWaXN1YWxTdHVkaW9XaW5kb3dzWDg2XzMyVGFyZ2V0SW5mbyhUcmlwbGUpOworICAgICAgfQorICAgIH0KICAgICBjYXNlIGxsdm06OlRyaXBsZTo6SGFpa3U6CiAgICAgICByZXR1cm4gbmV3IEhhaWt1WDg2XzMyVGFyZ2V0SW5mbyhUcmlwbGUpOwogICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpSVEVNUzoKQEAgLTU3OTAsNyArNjMwNiw3IEBACiAgICAgfQogCiAgIGNhc2UgbGx2bTo6VHJpcGxlOjp4ODZfNjQ6Ci0gICAgaWYgKFRyaXBsZS5pc09TRGFyd2luKCkgfHwgVHJpcGxlLmdldEVudmlyb25tZW50KCkgPT0gbGx2bTo6VHJpcGxlOjpNYWNoTykKKyAgICBpZiAoVHJpcGxlLmlzT1NEYXJ3aW4oKSB8fCBUcmlwbGUuaXNPU0JpbkZvcm1hdE1hY2hPKCkpCiAgICAgICByZXR1cm4gbmV3IERhcndpblg4Nl82NFRhcmdldEluZm8oVHJpcGxlKTsKIAogICAgIHN3aXRjaCAob3MpIHsKQEAgLTU4MTIsMTAgKzYzMjgsMTYgQEAKICAgICAgIHJldHVybiBuZXcgS0ZyZWVCU0RUYXJnZXRJbmZvPFg4Nl82NFRhcmdldEluZm8+KFRyaXBsZSk7CiAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OlNvbGFyaXM6CiAgICAgICByZXR1cm4gbmV3IFNvbGFyaXNUYXJnZXRJbmZvPFg4Nl82NFRhcmdldEluZm8+KFRyaXBsZSk7Ci0gICAgY2FzZSBsbHZtOjpUcmlwbGU6Ok1pbkdXMzI6Ci0gICAgICByZXR1cm4gbmV3IE1pbkdXWDg2XzY0VGFyZ2V0SW5mbyhUcmlwbGUpOwotICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpXaW4zMjogICAvLyBUaGlzIGlzIHdoYXQgVHJpcGxlLmggc3VwcG9ydHMgbm93LgotICAgICAgcmV0dXJuIG5ldyBWaXN1YWxTdHVkaW9XaW5kb3dzWDg2XzY0VGFyZ2V0SW5mbyhUcmlwbGUpOworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpXaW4zMjogeworICAgICAgc3dpdGNoIChUcmlwbGUuZ2V0RW52aXJvbm1lbnQoKSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIG5ldyBYODZfNjRUYXJnZXRJbmZvKFRyaXBsZSk7CisgICAgICBjYXNlIGxsdm06OlRyaXBsZTo6R05VOgorICAgICAgICByZXR1cm4gbmV3IE1pbkdXWDg2XzY0VGFyZ2V0SW5mbyhUcmlwbGUpOworICAgICAgY2FzZSBsbHZtOjpUcmlwbGU6Ok1TVkM6CisgICAgICAgIHJldHVybiBuZXcgVmlzdWFsU3R1ZGlvV2luZG93c1g4Nl82NFRhcmdldEluZm8oVHJpcGxlKTsKKyAgICAgIH0KKyAgICB9CiAgICAgY2FzZSBsbHZtOjpUcmlwbGU6Ok5hQ2w6CiAgICAgICByZXR1cm4gbmV3IE5hQ2xUYXJnZXRJbmZvPFg4Nl82NFRhcmdldEluZm8+KFRyaXBsZSk7CiAgICAgZGVmYXVsdDoKQEAgLTU4NDQsNyArNjM2Niw3IEBACiAgIGxsdm06OlRyaXBsZSBUcmlwbGUoT3B0cy0+VHJpcGxlKTsKIAogICAvLyBDb25zdHJ1Y3QgdGhlIHRhcmdldAotICBPd25pbmdQdHI8VGFyZ2V0SW5mbz4gVGFyZ2V0KEFsbG9jYXRlVGFyZ2V0KFRyaXBsZSkpOworICBzdGQ6OnVuaXF1ZV9wdHI8VGFyZ2V0SW5mbz4gVGFyZ2V0KEFsbG9jYXRlVGFyZ2V0KFRyaXBsZSkpOwogICBpZiAoIVRhcmdldCkgewogICAgIERpYWdzLlJlcG9ydChkaWFnOjplcnJfdGFyZ2V0X3Vua25vd25fdHJpcGxlKSA8PCBUcmlwbGUuc3RyKCk7CiAgICAgcmV0dXJuIDA7CkBAIC01ODYzLDEyICs2Mzg1LDYgQEAKICAgICByZXR1cm4gMDsKICAgfQogCi0gIC8vIFNldCB0aGUgdGFyZ2V0IEMrKyBBQkkuCi0gIGlmICghT3B0cy0+Q1hYQUJJLmVtcHR5KCkgJiYgIVRhcmdldC0+c2V0Q1hYQUJJKE9wdHMtPkNYWEFCSSkpIHsKLSAgICBEaWFncy5SZXBvcnQoZGlhZzo6ZXJyX3RhcmdldF91bmtub3duX2N4eGFiaSkgPDwgT3B0cy0+Q1hYQUJJOwotICAgIHJldHVybiAwOwotICB9Ci0KICAgLy8gU2V0IHRoZSBmcCBtYXRoIHVuaXQuCiAgIGlmICghT3B0cy0+RlBNYXRoLmVtcHR5KCkgJiYgIVRhcmdldC0+c2V0RlBNYXRoKE9wdHMtPkZQTWF0aCkpIHsKICAgICBEaWFncy5SZXBvcnQoZGlhZzo6ZXJyX3RhcmdldF91bmtub3duX2ZwbWF0aCkgPDwgT3B0cy0+RlBNYXRoOwpAQCAtNTkwMCw1ICs2NDE2LDUgQEAKICAgaWYgKCFUYXJnZXQtPmhhbmRsZVRhcmdldEZlYXR1cmVzKE9wdHMtPkZlYXR1cmVzLCBEaWFncykpCiAgICAgcmV0dXJuIDA7CiAKLSAgcmV0dXJuIFRhcmdldC50YWtlKCk7CisgIHJldHVybiBUYXJnZXQucmVsZWFzZSgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL0Jhc2ljL1Rva2VuS2luZHMuY3BwIGIvbGliL0Jhc2ljL1Rva2VuS2luZHMuY3BwCmluZGV4IDZjZTA3NmUuLjkyZmMyYTIgMTAwNjQ0Ci0tLSBhL2xpYi9CYXNpYy9Ub2tlbktpbmRzLmNwcAorKysgYi9saWIvQmFzaWMvVG9rZW5LaW5kcy5jcHAKQEAgLTEyLDcgKzEyLDcgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmgiCi0jaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IFRva05hbWVzW10gPSB7CkBAIC0yMiwxNyArMjIsMjcgQEAKICAgMAogfTsKIAotY29uc3QgY2hhciAqdG9rOjpnZXRUb2tlbk5hbWUoZW51bSBUb2tlbktpbmQgS2luZCkgewotICBhc3NlcnQoS2luZCA8IHRvazo6TlVNX1RPS0VOUyk7Ci0gIHJldHVybiBUb2tOYW1lc1tLaW5kXTsKK2NvbnN0IGNoYXIgKnRvazo6Z2V0VG9rZW5OYW1lKFRva2VuS2luZCBLaW5kKSB7CisgIGlmIChLaW5kIDwgdG9rOjpOVU1fVE9LRU5TKQorICAgIHJldHVybiBUb2tOYW1lc1tLaW5kXTsKKyAgbGx2bV91bnJlYWNoYWJsZSgidW5rbm93biBUb2tlbktpbmQiKTsKKyAgcmV0dXJuIDA7CiB9CiAKLWNvbnN0IGNoYXIgKnRvazo6Z2V0VG9rZW5TaW1wbGVTcGVsbGluZyhlbnVtIFRva2VuS2luZCBLaW5kKSB7Citjb25zdCBjaGFyICp0b2s6OmdldFB1bmN0dWF0b3JTcGVsbGluZyhUb2tlbktpbmQgS2luZCkgewogICBzd2l0Y2ggKEtpbmQpIHsKICNkZWZpbmUgUFVOQ1RVQVRPUihYLFkpIGNhc2UgWDogcmV0dXJuIFk7CiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVG9rZW5LaW5kcy5kZWYiCiAgIGRlZmF1bHQ6IGJyZWFrOwogICB9CisgIHJldHVybiAwOworfQogCitjb25zdCBjaGFyICp0b2s6OmdldEtleXdvcmRTcGVsbGluZyhUb2tlbktpbmQgS2luZCkgeworICBzd2l0Y2ggKEtpbmQpIHsKKyNkZWZpbmUgS0VZV09SRChYLFkpIGNhc2Uga3dfICMjIFg6IHJldHVybiAjWDsKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmRlZiIKKyAgICBkZWZhdWx0OiBicmVhazsKKyAgfQogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYi9CYXNpYy9WZXJzaW9uLmNwcCBiL2xpYi9CYXNpYy9WZXJzaW9uLmNwcAppbmRleCA4OGI4MjdkLi5hZTMyYzAxIDEwMDY0NAotLS0gYS9saWIvQmFzaWMvVmVyc2lvbi5jcHAKKysrIGIvbGliL0Jhc2ljL1ZlcnNpb24uY3BwCkBAIC0xMDIsMTEgKzEwMiwxMSBAQAogICAgICAgT1MgPDwgUmV2aXNpb247CiAgICAgfQogICAgIE9TIDw8ICcpJzsKLSAgfSAgCisgIH0KICAgLy8gU3VwcG9ydCBMTFZNIGluIGEgc2VwYXJhdGUgcmVwb3NpdG9yeS4KICAgc3RkOjpzdHJpbmcgTExWTVJldiA9IGdldExMVk1SZXZpc2lvbigpOwogICBpZiAoIUxMVk1SZXYuZW1wdHkoKSAmJiBMTFZNUmV2ICE9IFJldmlzaW9uKSB7Ci0gICAgT1MgPDwgIiAoIjsgICAgCisgICAgT1MgPDwgIiAoIjsKICAgICBzdGQ6OnN0cmluZyBMTFZNUmVwbyA9IGdldExMVk1SZXBvc2l0b3J5UGF0aCgpOwogICAgIGlmICghTExWTVJlcG8uZW1wdHkoKSkKICAgICAgIE9TIDw8IExMVk1SZXBvIDw8ICcgJzsKQEAgLTExNiwxMiArMTE2LDE2IEBACiB9CiAKIHN0ZDo6c3RyaW5nIGdldENsYW5nRnVsbFZlcnNpb24oKSB7CisgIHJldHVybiBnZXRDbGFuZ1Rvb2xGdWxsVmVyc2lvbigiY2xhbmciKTsKK30KKworc3RkOjpzdHJpbmcgZ2V0Q2xhbmdUb29sRnVsbFZlcnNpb24oU3RyaW5nUmVmIFRvb2xOYW1lKSB7CiAgIHN0ZDo6c3RyaW5nIGJ1ZjsKICAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIE9TKGJ1Zik7CiAjaWZkZWYgQ0xBTkdfVkVORE9SCiAgIE9TIDw8IENMQU5HX1ZFTkRPUjsKICNlbmRpZgotICBPUyA8PCAiY2xhbmcgdmVyc2lvbiAiIENMQU5HX1ZFUlNJT05fU1RSSU5HICIgIgorICBPUyA8PCBUb29sTmFtZSA8PCAiIHZlcnNpb24gIiBDTEFOR19WRVJTSU9OX1NUUklORyAiICIKICAgICAgPDwgZ2V0Q2xhbmdGdWxsUmVwb3NpdG9yeVZlcnNpb24oKTsKIAogICAvLyBJZiB2ZW5kb3Igc3VwcGxpZWQsIGluY2x1ZGUgdGhlIGJhc2UgTExWTSB2ZXJzaW9uIGFzIHdlbGwuCmRpZmYgLS1naXQgYS9saWIvQmFzaWMvVmlydHVhbEZpbGVTeXN0ZW0uY3BwIGIvbGliL0Jhc2ljL1ZpcnR1YWxGaWxlU3lzdGVtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTg4Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL0Jhc2ljL1ZpcnR1YWxGaWxlU3lzdGVtLmNwcApAQCAtMCwwICsxLDg0MSBAQAorLy89PT0tIFZpcnR1YWxGaWxlU3lzdGVtLmNwcCAtIFZpcnR1YWwgRmlsZSBTeXN0ZW0gTGF5ZXIgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBWaXJ0dWFsRmlsZVN5c3RlbSBpbnRlcmZhY2UuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVmlydHVhbEZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MUGFyc2VyLmgiCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG1lbW9yeT4KKwordXNpbmcgbmFtZXNwYWNlIGNsYW5nOwordXNpbmcgbmFtZXNwYWNlIGNsYW5nOjp2ZnM7Cit1c2luZyBuYW1lc3BhY2UgbGx2bTsKK3VzaW5nIGxsdm06OnN5czo6ZnM6OmZpbGVfc3RhdHVzOwordXNpbmcgbGx2bTo6c3lzOjpmczo6ZmlsZV90eXBlOwordXNpbmcgbGx2bTo6c3lzOjpmczo6cGVybXM7Cit1c2luZyBsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRDsKKworU3RhdHVzOjpTdGF0dXMoY29uc3QgZmlsZV9zdGF0dXMgJlN0YXR1cykKKyAgICA6IFVJRChTdGF0dXMuZ2V0VW5pcXVlSUQoKSksIE1UaW1lKFN0YXR1cy5nZXRMYXN0TW9kaWZpY2F0aW9uVGltZSgpKSwKKyAgICAgIFVzZXIoU3RhdHVzLmdldFVzZXIoKSksIEdyb3VwKFN0YXR1cy5nZXRHcm91cCgpKSwgU2l6ZShTdGF0dXMuZ2V0U2l6ZSgpKSwKKyAgICAgIFR5cGUoU3RhdHVzLnR5cGUoKSksIFBlcm1zKFN0YXR1cy5wZXJtaXNzaW9ucygpKSB7fQorCitTdGF0dXM6OlN0YXR1cyhTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIEV4dGVybmFsTmFtZSwgVW5pcXVlSUQgVUlELAorICAgICAgICAgICAgICAgc3lzOjpUaW1lVmFsdWUgTVRpbWUsIHVpbnQzMl90IFVzZXIsIHVpbnQzMl90IEdyb3VwLAorICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSwgZmlsZV90eXBlIFR5cGUsIHBlcm1zIFBlcm1zKQorICAgIDogTmFtZShOYW1lKSwgVUlEKFVJRCksIE1UaW1lKE1UaW1lKSwgVXNlcihVc2VyKSwgR3JvdXAoR3JvdXApLCBTaXplKFNpemUpLAorICAgICAgVHlwZShUeXBlKSwgUGVybXMoUGVybXMpIHt9CisKK2Jvb2wgU3RhdHVzOjplcXVpdmFsZW50KGNvbnN0IFN0YXR1cyAmT3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFVuaXF1ZUlEKCkgPT0gT3RoZXIuZ2V0VW5pcXVlSUQoKTsKK30KK2Jvb2wgU3RhdHVzOjppc0RpcmVjdG9yeSgpIGNvbnN0IHsKKyAgcmV0dXJuIFR5cGUgPT0gZmlsZV90eXBlOjpkaXJlY3RvcnlfZmlsZTsKK30KK2Jvb2wgU3RhdHVzOjppc1JlZ3VsYXJGaWxlKCkgY29uc3QgeworICByZXR1cm4gVHlwZSA9PSBmaWxlX3R5cGU6OnJlZ3VsYXJfZmlsZTsKK30KK2Jvb2wgU3RhdHVzOjppc090aGVyKCkgY29uc3QgeworICByZXR1cm4gZXhpc3RzKCkgJiYgIWlzUmVndWxhckZpbGUoKSAmJiAhaXNEaXJlY3RvcnkoKSAmJiAhaXNTeW1saW5rKCk7Cit9Citib29sIFN0YXR1czo6aXNTeW1saW5rKCkgY29uc3QgeworICByZXR1cm4gVHlwZSA9PSBmaWxlX3R5cGU6OnN5bWxpbmtfZmlsZTsKK30KK2Jvb2wgU3RhdHVzOjppc1N0YXR1c0tub3duKCkgY29uc3QgeworICByZXR1cm4gVHlwZSAhPSBmaWxlX3R5cGU6OnN0YXR1c19lcnJvcjsKK30KK2Jvb2wgU3RhdHVzOjpleGlzdHMoKSBjb25zdCB7CisgIHJldHVybiBpc1N0YXR1c0tub3duKCkgJiYgVHlwZSAhPSBmaWxlX3R5cGU6OmZpbGVfbm90X2ZvdW5kOworfQorCitGaWxlOjp+RmlsZSgpIHt9CisKK0ZpbGVTeXN0ZW06On5GaWxlU3lzdGVtKCkge30KKworZXJyb3JfY29kZSBGaWxlU3lzdGVtOjpnZXRCdWZmZXJGb3JGaWxlKGNvbnN0IGxsdm06OlR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+ICZSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBGaWxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlcXVpcmVzTnVsbFRlcm1pbmF0b3IpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPEZpbGU+IEY7CisgIGlmIChlcnJvcl9jb2RlIEVDID0gb3BlbkZpbGVGb3JSZWFkKE5hbWUsIEYpKQorICAgIHJldHVybiBFQzsKKworICBlcnJvcl9jb2RlIEVDID0gRi0+Z2V0QnVmZmVyKE5hbWUsIFJlc3VsdCwgRmlsZVNpemUsIFJlcXVpcmVzTnVsbFRlcm1pbmF0b3IpOworICByZXR1cm4gRUM7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vCisvLyBSZWFsRmlsZVN5c3RlbSBpbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8KKworbmFtZXNwYWNlIHsKKy8vLyBcYnJpZWYgV3JhcHBlciBhcm91bmQgYSByYXcgZmlsZSBkZXNjcmlwdG9yLgorY2xhc3MgUmVhbEZpbGUgOiBwdWJsaWMgRmlsZSB7CisgIGludCBGRDsKKyAgU3RhdHVzIFM7CisgIGZyaWVuZCBjbGFzcyBSZWFsRmlsZVN5c3RlbTsKKyAgUmVhbEZpbGUoaW50IEZEKSA6IEZEKEZEKSB7CisgICAgYXNzZXJ0KEZEID49IDAgJiYgIkludmFsaWQgb3IgaW5hY3RpdmUgZmlsZSBkZXNjcmlwdG9yIik7CisgIH0KKworcHVibGljOgorICB+UmVhbEZpbGUoKTsKKyAgRXJyb3JPcjxTdGF0dXM+IHN0YXR1cygpIG92ZXJyaWRlOworICBlcnJvcl9jb2RlIGdldEJ1ZmZlcihjb25zdCBUd2luZSAmTmFtZSwgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBGaWxlU2l6ZSA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlcXVpcmVzTnVsbFRlcm1pbmF0b3IgPSB0cnVlKSBvdmVycmlkZTsKKyAgZXJyb3JfY29kZSBjbG9zZSgpIG92ZXJyaWRlOworICB2b2lkIHNldE5hbWUoU3RyaW5nUmVmIE5hbWUpIG92ZXJyaWRlOworfTsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKK1JlYWxGaWxlOjp+UmVhbEZpbGUoKSB7IGNsb3NlKCk7IH0KKworRXJyb3JPcjxTdGF0dXM+IFJlYWxGaWxlOjpzdGF0dXMoKSB7CisgIGFzc2VydChGRCAhPSAtMSAmJiAiY2Fubm90IHN0YXQgY2xvc2VkIGZpbGUiKTsKKyAgaWYgKCFTLmlzU3RhdHVzS25vd24oKSkgeworICAgIGZpbGVfc3RhdHVzIFJlYWxTdGF0dXM7CisgICAgaWYgKGVycm9yX2NvZGUgRUMgPSBzeXM6OmZzOjpzdGF0dXMoRkQsIFJlYWxTdGF0dXMpKQorICAgICAgcmV0dXJuIEVDOworICAgIFN0YXR1cyBOZXdTKFJlYWxTdGF0dXMpOworICAgIE5ld1Muc2V0TmFtZShTLmdldE5hbWUoKSk7CisgICAgUyA9IHN0ZDo6bW92ZShOZXdTKTsKKyAgfQorICByZXR1cm4gUzsKK30KKworZXJyb3JfY29kZSBSZWFsRmlsZTo6Z2V0QnVmZmVyKGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+ICZSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBGaWxlU2l6ZSwgYm9vbCBSZXF1aXJlc051bGxUZXJtaW5hdG9yKSB7CisgIGFzc2VydChGRCAhPSAtMSAmJiAiY2Fubm90IGdldCBidWZmZXIgZm9yIGNsb3NlZCBmaWxlIik7CisgIHJldHVybiBNZW1vcnlCdWZmZXI6OmdldE9wZW5GaWxlKEZELCBOYW1lLnN0cigpLmNfc3RyKCksIFJlc3VsdCwgRmlsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVzTnVsbFRlcm1pbmF0b3IpOworfQorCisvLyBGSVhNRTogVGhpcyBpcyB0ZXJyaWJsZSwgd2UgbmVlZCB0aGlzIGZvciA6OmNsb3NlLgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjZWxzZQorI2luY2x1ZGUgPGlvLmg+CisjaWZuZGVmIFNfSVNGSUZPCisjZGVmaW5lIFNfSVNGSUZPKHgpICgwKQorI2VuZGlmCisjZW5kaWYKK2Vycm9yX2NvZGUgUmVhbEZpbGU6OmNsb3NlKCkgeworICBpZiAoOjpjbG9zZShGRCkpCisgICAgcmV0dXJuIGVycm9yX2NvZGUoZXJybm8sIHN5c3RlbV9jYXRlZ29yeSgpKTsKKyAgRkQgPSAtMTsKKyAgcmV0dXJuIGVycm9yX2NvZGU6OnN1Y2Nlc3MoKTsKK30KKwordm9pZCBSZWFsRmlsZTo6c2V0TmFtZShTdHJpbmdSZWYgTmFtZSkgeworICBTLnNldE5hbWUoTmFtZSk7Cit9CisKK25hbWVzcGFjZSB7CisvLy8gXGJyaWVmIFRoZSBmaWxlIHN5c3RlbSBhY2NvcmRpbmcgdG8geW91ciBvcGVyYXRpbmcgc3lzdGVtLgorY2xhc3MgUmVhbEZpbGVTeXN0ZW0gOiBwdWJsaWMgRmlsZVN5c3RlbSB7CitwdWJsaWM6CisgIEVycm9yT3I8U3RhdHVzPiBzdGF0dXMoY29uc3QgVHdpbmUgJlBhdGgpIG92ZXJyaWRlOworICBlcnJvcl9jb2RlIG9wZW5GaWxlRm9yUmVhZChjb25zdCBUd2luZSAmUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEZpbGU+ICZSZXN1bHQpIG92ZXJyaWRlOworfTsKK30gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKKworRXJyb3JPcjxTdGF0dXM+IFJlYWxGaWxlU3lzdGVtOjpzdGF0dXMoY29uc3QgVHdpbmUgJlBhdGgpIHsKKyAgc3lzOjpmczo6ZmlsZV9zdGF0dXMgUmVhbFN0YXR1czsKKyAgaWYgKGVycm9yX2NvZGUgRUMgPSBzeXM6OmZzOjpzdGF0dXMoUGF0aCwgUmVhbFN0YXR1cykpCisgICAgcmV0dXJuIEVDOworICBTdGF0dXMgUmVzdWx0KFJlYWxTdGF0dXMpOworICBSZXN1bHQuc2V0TmFtZShQYXRoLnN0cigpKTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworZXJyb3JfY29kZSBSZWFsRmlsZVN5c3RlbTo6b3BlbkZpbGVGb3JSZWFkKGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWxlPiAmUmVzdWx0KSB7CisgIGludCBGRDsKKyAgaWYgKGVycm9yX2NvZGUgRUMgPSBzeXM6OmZzOjpvcGVuRmlsZUZvclJlYWQoTmFtZSwgRkQpKQorICAgIHJldHVybiBFQzsKKyAgUmVzdWx0LnJlc2V0KG5ldyBSZWFsRmlsZShGRCkpOworICBSZXN1bHQtPnNldE5hbWUoTmFtZS5zdHIoKSk7CisgIHJldHVybiBlcnJvcl9jb2RlOjpzdWNjZXNzKCk7Cit9CisKK0ludHJ1c2l2ZVJlZkNudFB0cjxGaWxlU3lzdGVtPiB2ZnM6OmdldFJlYWxGaWxlU3lzdGVtKCkgeworICBzdGF0aWMgSW50cnVzaXZlUmVmQ250UHRyPEZpbGVTeXN0ZW0+IEZTID0gbmV3IFJlYWxGaWxlU3lzdGVtKCk7CisgIHJldHVybiBGUzsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8KKy8vIE92ZXJsYXlGaWxlU3lzdGVtIGltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09LworT3ZlcmxheUZpbGVTeXN0ZW06Ok92ZXJsYXlGaWxlU3lzdGVtKEludHJ1c2l2ZVJlZkNudFB0cjxGaWxlU3lzdGVtPiBCYXNlRlMpIHsKKyAgcHVzaE92ZXJsYXkoQmFzZUZTKTsKK30KKwordm9pZCBPdmVybGF5RmlsZVN5c3RlbTo6cHVzaE92ZXJsYXkoSW50cnVzaXZlUmVmQ250UHRyPEZpbGVTeXN0ZW0+IEZTKSB7CisgIEZTTGlzdC5wdXNoX2JhY2soRlMpOworfQorCitFcnJvck9yPFN0YXR1cz4gT3ZlcmxheUZpbGVTeXN0ZW06OnN0YXR1cyhjb25zdCBUd2luZSAmUGF0aCkgeworICAvLyBGSVhNRTogaGFuZGxlIHN5bWxpbmtzIHRoYXQgY3Jvc3MgZmlsZSBzeXN0ZW1zCisgIGZvciAoaXRlcmF0b3IgSSA9IG92ZXJsYXlzX2JlZ2luKCksIEUgPSBvdmVybGF5c19lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBFcnJvck9yPFN0YXR1cz4gU3RhdHVzID0gKCpJKS0+c3RhdHVzKFBhdGgpOworICAgIGlmIChTdGF0dXMgfHwgU3RhdHVzLmdldEVycm9yKCkgIT0gZXJyYzo6bm9fc3VjaF9maWxlX29yX2RpcmVjdG9yeSkKKyAgICAgIHJldHVybiBTdGF0dXM7CisgIH0KKyAgcmV0dXJuIGVycm9yX2NvZGUoZXJyYzo6bm9fc3VjaF9maWxlX29yX2RpcmVjdG9yeSwgc3lzdGVtX2NhdGVnb3J5KCkpOworfQorCitlcnJvcl9jb2RlIE92ZXJsYXlGaWxlU3lzdGVtOjpvcGVuRmlsZUZvclJlYWQoY29uc3QgbGx2bTo6VHdpbmUgJlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEZpbGU+ICZSZXN1bHQpIHsKKyAgLy8gRklYTUU6IGhhbmRsZSBzeW1saW5rcyB0aGF0IGNyb3NzIGZpbGUgc3lzdGVtcworICBmb3IgKGl0ZXJhdG9yIEkgPSBvdmVybGF5c19iZWdpbigpLCBFID0gb3ZlcmxheXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgZXJyb3JfY29kZSBFQyA9ICgqSSktPm9wZW5GaWxlRm9yUmVhZChQYXRoLCBSZXN1bHQpOworICAgIGlmICghRUMgfHwgRUMgIT0gZXJyYzo6bm9fc3VjaF9maWxlX29yX2RpcmVjdG9yeSkKKyAgICAgIHJldHVybiBFQzsKKyAgfQorICByZXR1cm4gZXJyb3JfY29kZShlcnJjOjpub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5LCBzeXN0ZW1fY2F0ZWdvcnkoKSk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vCisvLyBWRlNGcm9tWUFNTCBpbXBsZW1lbnRhdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8KKworLy8gQWxsb3cgRGVuc2VNYXA8U3RyaW5nUmVmLCAuLi4+LiAgVGhpcyBpcyB1c2VmdWwgYmVsb3cgYmVjYXVzZSB3ZSBrbm93IGFsbCB0aGUKKy8vIHN0cmluZ3MgYXJlIGxpdGVyYWxzIGFuZCB3aWxsIG91dGxpdmUgdGhlIG1hcCwgYW5kIHRoZXJlIGlzIG5vIHJlYXNvbiB0bworLy8gc3RvcmUgdGhlbS4KK25hbWVzcGFjZSBsbHZtIHsKKyAgdGVtcGxhdGU8PgorICBzdHJ1Y3QgRGVuc2VNYXBJbmZvPFN0cmluZ1JlZj4geworICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0ICIiIHdpbGwgbmV2ZXIgYmUgYSB2YWxpZCBrZXkuCisgICAgc3RhdGljIGlubGluZSBTdHJpbmdSZWYgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiBTdHJpbmdSZWYoIiIpOyB9CisgICAgc3RhdGljIGlubGluZSBTdHJpbmdSZWYgZ2V0VG9tYnN0b25lS2V5KCkgeyByZXR1cm4gU3RyaW5nUmVmKCk7IH0KKyAgICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKFN0cmluZ1JlZiBWYWwpIHsgcmV0dXJuIEhhc2hTdHJpbmcoVmFsKTsgfQorICAgIHN0YXRpYyBib29sIGlzRXF1YWwoU3RyaW5nUmVmIExIUywgU3RyaW5nUmVmIFJIUykgeyByZXR1cm4gTEhTID09IFJIUzsgfQorICB9OworfQorCituYW1lc3BhY2UgeworCitlbnVtIEVudHJ5S2luZCB7CisgIEVLX0RpcmVjdG9yeSwKKyAgRUtfRmlsZQorfTsKKworLy8vIFxicmllZiBBIHNpbmdsZSBmaWxlIG9yIGRpcmVjdG9yeSBpbiB0aGUgVkZTLgorY2xhc3MgRW50cnkgeworICBFbnRyeUtpbmQgS2luZDsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKworcHVibGljOgorICB2aXJ0dWFsIH5FbnRyeSgpOworICBFbnRyeShFbnRyeUtpbmQgSywgU3RyaW5nUmVmIE5hbWUpIDogS2luZChLKSwgTmFtZShOYW1lKSB7fQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKyAgRW50cnlLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9Cit9OworCitjbGFzcyBEaXJlY3RvcnlFbnRyeSA6IHB1YmxpYyBFbnRyeSB7CisgIHN0ZDo6dmVjdG9yPEVudHJ5ICo+IENvbnRlbnRzOworICBTdGF0dXMgUzsKKworcHVibGljOgorICB2aXJ0dWFsIH5EaXJlY3RvcnlFbnRyeSgpOworICBEaXJlY3RvcnlFbnRyeShTdHJpbmdSZWYgTmFtZSwgc3RkOjp2ZWN0b3I8RW50cnkgKj4gQ29udGVudHMsIFN0YXR1cyBTKQorICAgICAgOiBFbnRyeShFS19EaXJlY3RvcnksIE5hbWUpLCBDb250ZW50cyhzdGQ6Om1vdmUoQ29udGVudHMpKSwKKyAgICAgICAgUyhzdGQ6Om1vdmUoUykpIHt9CisgIFN0YXR1cyBnZXRTdGF0dXMoKSB7IHJldHVybiBTOyB9CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8RW50cnkgKj46Oml0ZXJhdG9yIGl0ZXJhdG9yOworICBpdGVyYXRvciBjb250ZW50c19iZWdpbigpIHsgcmV0dXJuIENvbnRlbnRzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgY29udGVudHNfZW5kKCkgeyByZXR1cm4gQ29udGVudHMuZW5kKCk7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFbnRyeSAqRSkgeyByZXR1cm4gRS0+Z2V0S2luZCgpID09IEVLX0RpcmVjdG9yeTsgfQorfTsKKworY2xhc3MgRmlsZUVudHJ5IDogcHVibGljIEVudHJ5IHsKK3B1YmxpYzoKKyAgZW51bSBOYW1lS2luZCB7CisgICAgTktfTm90U2V0LAorICAgIE5LX0V4dGVybmFsLAorICAgIE5LX1ZpcnR1YWwKKyAgfTsKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIEV4dGVybmFsQ29udGVudHNQYXRoOworICBOYW1lS2luZCBVc2VOYW1lOworcHVibGljOgorICBGaWxlRW50cnkoU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBFeHRlcm5hbENvbnRlbnRzUGF0aCwgTmFtZUtpbmQgVXNlTmFtZSkKKyAgICAgIDogRW50cnkoRUtfRmlsZSwgTmFtZSksIEV4dGVybmFsQ29udGVudHNQYXRoKEV4dGVybmFsQ29udGVudHNQYXRoKSwKKyAgICAgICAgVXNlTmFtZShVc2VOYW1lKSB7fQorICBTdHJpbmdSZWYgZ2V0RXh0ZXJuYWxDb250ZW50c1BhdGgoKSBjb25zdCB7IHJldHVybiBFeHRlcm5hbENvbnRlbnRzUGF0aDsgfQorICAvLy8gXGJyaWVmIHdoZXRoZXIgdG8gdXNlIHRoZSBleHRlcm5hbCBwYXRoIGFzIHRoZSBuYW1lIGZvciB0aGlzIGZpbGUuCisgIGJvb2wgdXNlRXh0ZXJuYWxOYW1lKGJvb2wgR2xvYmFsVXNlRXh0ZXJuYWxOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIFVzZU5hbWUgPT0gTktfTm90U2V0ID8gR2xvYmFsVXNlRXh0ZXJuYWxOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKFVzZU5hbWUgPT0gTktfRXh0ZXJuYWwpOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRW50cnkgKkUpIHsgcmV0dXJuIEUtPmdldEtpbmQoKSA9PSBFS19GaWxlOyB9Cit9OworCisvLy8gXGJyaWVmIEEgdmlydHVhbCBmaWxlIHN5c3RlbSBwYXJzZWQgZnJvbSBhIFlBTUwgZmlsZS4KKy8vLworLy8vIEN1cnJlbnRseSwgdGhpcyBjbGFzcyBhbGxvd3MgY3JlYXRpbmcgdmlydHVhbCBkaXJlY3RvcmllcyBhbmQgbWFwcGluZworLy8vIHZpcnR1YWwgZmlsZSBwYXRocyB0byBleGlzdGluZyBleHRlcm5hbCBmaWxlcywgYXZhaWxhYmxlIGluIFxjIEV4dGVybmFsRlMuCisvLy8KKy8vLyBUaGUgYmFzaWMgc3RydWN0dXJlIG9mIHRoZSBwYXJzZWQgZmlsZSBpczoKKy8vLyBcdmVyYmF0aW0KKy8vLyB7CisvLy8gICAndmVyc2lvbic6IDx2ZXJzaW9uIG51bWJlcj4sCisvLy8gICA8b3B0aW9uYWwgY29uZmlndXJhdGlvbj4KKy8vLyAgICdyb290cyc6IFsKKy8vLyAgICAgICAgICAgICAgPGRpcmVjdG9yeSBlbnRyaWVzPgorLy8vICAgICAgICAgICAgXQorLy8vIH0KKy8vLyBcZW5kdmVyYmF0aW0KKy8vLworLy8vIEFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIG9wdGlvbmFsLgorLy8vICAgJ2Nhc2Utc2Vuc2l0aXZlJzogPGJvb2xlYW4sIGRlZmF1bHQ9dHJ1ZT4KKy8vLyAgICd1c2UtZXh0ZXJuYWwtbmFtZXMnOiA8Ym9vbGVhbiwgZGVmYXVsdD10cnVlPgorLy8vCisvLy8gVmlydHVhbCBkaXJlY3RvcmllcyBhcmUgcmVwcmVzZW50ZWQgYXMKKy8vLyBcdmVyYmF0aW0KKy8vLyB7CisvLy8gICAndHlwZSc6ICdkaXJlY3RvcnknLAorLy8vICAgJ25hbWUnOiA8c3RyaW5nPiwKKy8vLyAgICdjb250ZW50cyc6IFsgPGZpbGUgb3IgZGlyZWN0b3J5IGVudHJpZXM+IF0KKy8vLyB9CisvLy8gXGVuZHZlcmJhdGltCisvLy8KKy8vLyBUaGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB2aXJ0dWFsIGRpcmVjdG9yaWVzIGFyZToKKy8vLyBcdmVyYmF0aW0KKy8vLyBNVGltZSA9IG5vdygpIHdoZW4gY3JlYXRlZAorLy8vIFBlcm1zID0gMDc3NworLy8vIFVzZXIgPSBHcm91cCA9IDAKKy8vLyBTaXplID0gMAorLy8vIFVuaXF1ZUlEID0gdW5zcGVjaWZpZWQgdW5pcXVlIHZhbHVlCisvLy8gXGVuZHZlcmJhdGltCisvLy8KKy8vLyBSZS1tYXBwZWQgZmlsZXMgYXJlIHJlcHJlc2VudGVkIGFzCisvLy8gXHZlcmJhdGltCisvLy8geworLy8vICAgJ3R5cGUnOiAnZmlsZScsCisvLy8gICAnbmFtZSc6IDxzdHJpbmc+LAorLy8vICAgJ3VzZS1leHRlcm5hbC1uYW1lJzogPGJvb2xlYW4+ICMgT3B0aW9uYWwKKy8vLyAgICdleHRlcm5hbC1jb250ZW50cyc6IDxwYXRoIHRvIGV4dGVybmFsIGZpbGU+KQorLy8vIH0KKy8vLyBcZW5kdmVyYmF0aW0KKy8vLworLy8vIGFuZCBpbmhlcml0IHRoZWlyIGF0dHJpYnV0ZXMgZnJvbSB0aGUgZXh0ZXJuYWwgY29udGVudHMuCisvLy8KKy8vLyBJbiBib3RoIGNhc2VzLCB0aGUgJ25hbWUnIGZpZWxkIG1heSBjb250YWluIG11bHRpcGxlIHBhdGggY29tcG9uZW50cyAoZS5nLgorLy8vIC9wYXRoL3RvL2ZpbGUpLiBIb3dldmVyLCBhbnkgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBjaGlsZAorLy8vIG11c3QgYmUgdW5pcXVlbHkgcmVwcmVzZW50ZWQgYnkgYSBkaXJlY3RvcnkgZW50cnkuCitjbGFzcyBWRlNGcm9tWUFNTCA6IHB1YmxpYyB2ZnM6OkZpbGVTeXN0ZW0geworICBzdGQ6OnZlY3RvcjxFbnRyeSAqPiBSb290czsgLy8vPCBUaGUgcm9vdChzKSBvZiB0aGUgdmlydHVhbCBmaWxlIHN5c3RlbS4KKyAgLy8vIFxicmllZiBUaGUgZmlsZSBzeXN0ZW0gdG8gdXNlIGZvciBleHRlcm5hbCByZWZlcmVuY2VzLgorICBJbnRydXNpdmVSZWZDbnRQdHI8RmlsZVN5c3RlbT4gRXh0ZXJuYWxGUzsKKworICAvLy8gQG5hbWUgQ29uZmlndXJhdGlvbgorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIFdoZXRoZXIgdG8gcGVyZm9ybSBjYXNlLXNlbnNpdGl2ZSBjb21wYXJpc29ucy4KKyAgLy8vCisgIC8vLyBDdXJyZW50bHksIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcgb25seSB3b3JrcyBjb3JyZWN0bHkgd2l0aCBBU0NJSS4KKyAgYm9vbCBDYXNlU2Vuc2l0aXZlOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB0byB1c2UgdG8gdXNlIHRoZSB2YWx1ZSBvZiAnZXh0ZXJuYWwtY29udGVudHMnIGZvciB0aGUKKyAgLy8vIG5hbWVzIG9mIGZpbGVzLiAgVGhpcyBnbG9iYWwgdmFsdWUgaXMgb3ZlcnJpZGFibGUgb24gYSBwZXItZmlsZSBiYXNpcy4KKyAgYm9vbCBVc2VFeHRlcm5hbE5hbWVzOworICAvLy8gQH0KKworICBmcmllbmQgY2xhc3MgVkZTRnJvbVlBTUxQYXJzZXI7CisKK3ByaXZhdGU6CisgIFZGU0Zyb21ZQU1MKEludHJ1c2l2ZVJlZkNudFB0cjxGaWxlU3lzdGVtPiBFeHRlcm5hbEZTKQorICAgICAgOiBFeHRlcm5hbEZTKEV4dGVybmFsRlMpLCBDYXNlU2Vuc2l0aXZlKHRydWUpLCBVc2VFeHRlcm5hbE5hbWVzKHRydWUpIHt9CisKKyAgLy8vIFxicmllZiBMb29rcyB1cCBccCBQYXRoIGluIFxjIFJvb3RzLgorICBFcnJvck9yPEVudHJ5ICo+IGxvb2t1cFBhdGgoY29uc3QgVHdpbmUgJlBhdGgpOworCisgIC8vLyBcYnJpZWYgTG9va3MgdXAgdGhlIHBhdGggPHR0PltTdGFydCwgRW5kKTwvdHQ+IGluIFxwIEZyb20sIHBvc3NpYmx5CisgIC8vLyByZWN1cnNpbmcgaW50byB0aGUgY29udGVudHMgb2YgXHAgRnJvbSBpZiBpdCBpcyBhIGRpcmVjdG9yeS4KKyAgRXJyb3JPcjxFbnRyeSAqPiBsb29rdXBQYXRoKHN5czo6cGF0aDo6Y29uc3RfaXRlcmF0b3IgU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXM6OnBhdGg6OmNvbnN0X2l0ZXJhdG9yIEVuZCwgRW50cnkgKkZyb20pOworCitwdWJsaWM6CisgIH5WRlNGcm9tWUFNTCgpOworCisgIC8vLyBcYnJpZWYgUGFyc2VzIFxwIEJ1ZmZlciwgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgaW4gWUFNTCBmb3JtYXQgYW5kCisgIC8vLyByZXR1cm5zIGEgdmlydHVhbCBmaWxlIHN5c3RlbSByZXByZXNlbnRpbmcgaXRzIGNvbnRlbnRzLgorICAvLy8KKyAgLy8vIFRha2VzIG93bmVyc2hpcCBvZiBccCBCdWZmZXIuCisgIHN0YXRpYyBWRlNGcm9tWUFNTCAqY3JlYXRlKE1lbW9yeUJ1ZmZlciAqQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VNZ3I6OkRpYWdIYW5kbGVyVHkgRGlhZ0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRpYWdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRydXNpdmVSZWZDbnRQdHI8RmlsZVN5c3RlbT4gRXh0ZXJuYWxGUyk7CisKKyAgRXJyb3JPcjxTdGF0dXM+IHN0YXR1cyhjb25zdCBUd2luZSAmUGF0aCkgb3ZlcnJpZGU7CisgIGVycm9yX2NvZGUgb3BlbkZpbGVGb3JSZWFkKGNvbnN0IFR3aW5lICZQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RmlsZT4gJlJlc3VsdCkgb3ZlcnJpZGU7Cit9OworCisvLy8gXGJyaWVmIEEgaGVscGVyIGNsYXNzIHRvIGhvbGQgdGhlIGNvbW1vbiBZQU1MIHBhcnNpbmcgc3RhdGUuCitjbGFzcyBWRlNGcm9tWUFNTFBhcnNlciB7CisgIHlhbWw6OlN0cmVhbSAmU3RyZWFtOworCisgIHZvaWQgZXJyb3IoeWFtbDo6Tm9kZSAqTiwgY29uc3QgVHdpbmUgJk1zZykgeworICAgIFN0cmVhbS5wcmludEVycm9yKE4sIE1zZyk7CisgIH0KKworICAvLyBmYWxzZSBvbiBlcnJvcgorICBib29sIHBhcnNlU2NhbGFyU3RyaW5nKHlhbWw6Ok5vZGUgKk4sIFN0cmluZ1JlZiAmUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmU3RvcmFnZSkgeworICAgIHlhbWw6OlNjYWxhck5vZGUgKlMgPSBkeW5fY2FzdDx5YW1sOjpTY2FsYXJOb2RlPihOKTsKKyAgICBpZiAoIVMpIHsKKyAgICAgIGVycm9yKE4sICJleHBlY3RlZCBzdHJpbmciKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgUmVzdWx0ID0gUy0+Z2V0VmFsdWUoU3RvcmFnZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBmYWxzZSBvbiBlcnJvcgorICBib29sIHBhcnNlU2NhbGFyQm9vbCh5YW1sOjpOb2RlICpOLCBib29sICZSZXN1bHQpIHsKKyAgICBTbWFsbFN0cmluZzw1PiBTdG9yYWdlOworICAgIFN0cmluZ1JlZiBWYWx1ZTsKKyAgICBpZiAoIXBhcnNlU2NhbGFyU3RyaW5nKE4sIFZhbHVlLCBTdG9yYWdlKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChWYWx1ZS5lcXVhbHNfbG93ZXIoInRydWUiKSB8fCBWYWx1ZS5lcXVhbHNfbG93ZXIoIm9uIikgfHwKKyAgICAgICAgVmFsdWUuZXF1YWxzX2xvd2VyKCJ5ZXMiKSB8fCBWYWx1ZSA9PSAiMSIpIHsKKyAgICAgIFJlc3VsdCA9IHRydWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKFZhbHVlLmVxdWFsc19sb3dlcigiZmFsc2UiKSB8fCBWYWx1ZS5lcXVhbHNfbG93ZXIoIm9mZiIpIHx8CisgICAgICAgICAgICAgICBWYWx1ZS5lcXVhbHNfbG93ZXIoIm5vIikgfHwgVmFsdWUgPT0gIjAiKSB7CisgICAgICBSZXN1bHQgPSBmYWxzZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGVycm9yKE4sICJleHBlY3RlZCBib29sZWFuIHZhbHVlIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RydWN0IEtleVN0YXR1cyB7CisgICAgS2V5U3RhdHVzKGJvb2wgUmVxdWlyZWQ9ZmFsc2UpIDogUmVxdWlyZWQoUmVxdWlyZWQpLCBTZWVuKGZhbHNlKSB7fQorICAgIGJvb2wgUmVxdWlyZWQ7CisgICAgYm9vbCBTZWVuOworICB9OworICB0eXBlZGVmIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIEtleVN0YXR1cz4gS2V5U3RhdHVzUGFpcjsKKworICAvLyBmYWxzZSBvbiBlcnJvcgorICBib29sIGNoZWNrRHVwbGljYXRlT3JVbmtub3duS2V5KHlhbWw6Ok5vZGUgKktleU5vZGUsIFN0cmluZ1JlZiBLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8U3RyaW5nUmVmLCBLZXlTdGF0dXM+ICZLZXlzKSB7CisgICAgaWYgKCFLZXlzLmNvdW50KEtleSkpIHsKKyAgICAgIGVycm9yKEtleU5vZGUsICJ1bmtub3duIGtleSIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBLZXlTdGF0dXMgJlMgPSBLZXlzW0tleV07CisgICAgaWYgKFMuU2VlbikgeworICAgICAgZXJyb3IoS2V5Tm9kZSwgVHdpbmUoImR1cGxpY2F0ZSBrZXkgJyIpICsgS2V5ICsgIiciKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgUy5TZWVuID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIGZhbHNlIG9uIGVycm9yCisgIGJvb2wgY2hlY2tNaXNzaW5nS2V5cyh5YW1sOjpOb2RlICpPYmosIERlbnNlTWFwPFN0cmluZ1JlZiwgS2V5U3RhdHVzPiAmS2V5cykgeworICAgIGZvciAoRGVuc2VNYXA8U3RyaW5nUmVmLCBLZXlTdGF0dXM+OjppdGVyYXRvciBJID0gS2V5cy5iZWdpbigpLAorICAgICAgICAgRSA9IEtleXMuZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKEktPnNlY29uZC5SZXF1aXJlZCAmJiAhSS0+c2Vjb25kLlNlZW4pIHsKKyAgICAgICAgZXJyb3IoT2JqLCBUd2luZSgibWlzc2luZyBrZXkgJyIpICsgSS0+Zmlyc3QgKyAiJyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgRW50cnkgKnBhcnNlRW50cnkoeWFtbDo6Tm9kZSAqTikgeworICAgIHlhbWw6Ok1hcHBpbmdOb2RlICpNID0gZHluX2Nhc3Q8eWFtbDo6TWFwcGluZ05vZGU+KE4pOworICAgIGlmICghTSkgeworICAgICAgZXJyb3IoTiwgImV4cGVjdGVkIG1hcHBpbmcgbm9kZSBmb3IgZmlsZSBvciBkaXJlY3RvcnkgZW50cnkiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEtleVN0YXR1c1BhaXIgRmllbGRzW10gPSB7CisgICAgICBLZXlTdGF0dXNQYWlyKCJuYW1lIiwgdHJ1ZSksCisgICAgICBLZXlTdGF0dXNQYWlyKCJ0eXBlIiwgdHJ1ZSksCisgICAgICBLZXlTdGF0dXNQYWlyKCJjb250ZW50cyIsIGZhbHNlKSwKKyAgICAgIEtleVN0YXR1c1BhaXIoImV4dGVybmFsLWNvbnRlbnRzIiwgZmFsc2UpLAorICAgICAgS2V5U3RhdHVzUGFpcigidXNlLWV4dGVybmFsLW5hbWUiLCBmYWxzZSksCisgICAgfTsKKworICAgIERlbnNlTWFwPFN0cmluZ1JlZiwgS2V5U3RhdHVzPiBLZXlzKAorICAgICAgICAmRmllbGRzWzBdLCBGaWVsZHMgKyBzaXplb2YoRmllbGRzKS9zaXplb2YoRmllbGRzWzBdKSk7CisKKyAgICBib29sIEhhc0NvbnRlbnRzID0gZmFsc2U7IC8vIGV4dGVybmFsIG9yIG90aGVyd2lzZQorICAgIHN0ZDo6dmVjdG9yPEVudHJ5ICo+IEVudHJ5QXJyYXlDb250ZW50czsKKyAgICBzdGQ6OnN0cmluZyBFeHRlcm5hbENvbnRlbnRzUGF0aDsKKyAgICBzdGQ6OnN0cmluZyBOYW1lOworICAgIEZpbGVFbnRyeTo6TmFtZUtpbmQgVXNlRXh0ZXJuYWxOYW1lID0gRmlsZUVudHJ5OjpOS19Ob3RTZXQ7CisgICAgRW50cnlLaW5kIEtpbmQ7CisKKyAgICBmb3IgKHlhbWw6Ok1hcHBpbmdOb2RlOjppdGVyYXRvciBJID0gTS0+YmVnaW4oKSwgRSA9IE0tPmVuZCgpOyBJICE9IEU7CisgICAgICAgICArK0kpIHsKKyAgICAgIFN0cmluZ1JlZiBLZXk7CisgICAgICAvLyBSZXVzZSB0aGUgYnVmZmVyIGZvciBrZXkgYW5kIHZhbHVlLCBzaW5jZSB3ZSBkb24ndCBsb29rIGF0IGtleSBhZnRlcgorICAgICAgLy8gcGFyc2luZyB2YWx1ZS4KKyAgICAgIFNtYWxsU3RyaW5nPDI1Nj4gQnVmZmVyOworICAgICAgaWYgKCFwYXJzZVNjYWxhclN0cmluZyhJLT5nZXRLZXkoKSwgS2V5LCBCdWZmZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgaWYgKCFjaGVja0R1cGxpY2F0ZU9yVW5rbm93bktleShJLT5nZXRLZXkoKSwgS2V5LCBLZXlzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgIFN0cmluZ1JlZiBWYWx1ZTsKKyAgICAgIGlmIChLZXkgPT0gIm5hbWUiKSB7CisgICAgICAgIGlmICghcGFyc2VTY2FsYXJTdHJpbmcoSS0+Z2V0VmFsdWUoKSwgVmFsdWUsIEJ1ZmZlcikpCisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIE5hbWUgPSBWYWx1ZTsKKyAgICAgIH0gZWxzZSBpZiAoS2V5ID09ICJ0eXBlIikgeworICAgICAgICBpZiAoIXBhcnNlU2NhbGFyU3RyaW5nKEktPmdldFZhbHVlKCksIFZhbHVlLCBCdWZmZXIpKQorICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoVmFsdWUgPT0gImZpbGUiKQorICAgICAgICAgIEtpbmQgPSBFS19GaWxlOworICAgICAgICBlbHNlIGlmIChWYWx1ZSA9PSAiZGlyZWN0b3J5IikKKyAgICAgICAgICBLaW5kID0gRUtfRGlyZWN0b3J5OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBlcnJvcihJLT5nZXRWYWx1ZSgpLCAidW5rbm93biB2YWx1ZSBmb3IgJ3R5cGUnIik7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoS2V5ID09ICJjb250ZW50cyIpIHsKKyAgICAgICAgaWYgKEhhc0NvbnRlbnRzKSB7CisgICAgICAgICAgZXJyb3IoSS0+Z2V0S2V5KCksCisgICAgICAgICAgICAgICAgImVudHJ5IGFscmVhZHkgaGFzICdjb250ZW50cycgb3IgJ2V4dGVybmFsLWNvbnRlbnRzJyIpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIEhhc0NvbnRlbnRzID0gdHJ1ZTsKKyAgICAgICAgeWFtbDo6U2VxdWVuY2VOb2RlICpDb250ZW50cyA9CisgICAgICAgICAgICBkeW5fY2FzdDx5YW1sOjpTZXF1ZW5jZU5vZGU+KEktPmdldFZhbHVlKCkpOworICAgICAgICBpZiAoIUNvbnRlbnRzKSB7CisgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgb25seSBmb3IgZGlyZWN0b3JpZXMsIHdoYXQgYWJvdXQgZmlsZXM/CisgICAgICAgICAgZXJyb3IoSS0+Z2V0VmFsdWUoKSwgImV4cGVjdGVkIGFycmF5Iik7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHlhbWw6OlNlcXVlbmNlTm9kZTo6aXRlcmF0b3IgSSA9IENvbnRlbnRzLT5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IENvbnRlbnRzLT5lbmQoKTsKKyAgICAgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgICAgIGlmIChFbnRyeSAqRSA9IHBhcnNlRW50cnkoJipJKSkKKyAgICAgICAgICAgIEVudHJ5QXJyYXlDb250ZW50cy5wdXNoX2JhY2soRSk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoS2V5ID09ICJleHRlcm5hbC1jb250ZW50cyIpIHsKKyAgICAgICAgaWYgKEhhc0NvbnRlbnRzKSB7CisgICAgICAgICAgZXJyb3IoSS0+Z2V0S2V5KCksCisgICAgICAgICAgICAgICAgImVudHJ5IGFscmVhZHkgaGFzICdjb250ZW50cycgb3IgJ2V4dGVybmFsLWNvbnRlbnRzJyIpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIEhhc0NvbnRlbnRzID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFwYXJzZVNjYWxhclN0cmluZyhJLT5nZXRWYWx1ZSgpLCBWYWx1ZSwgQnVmZmVyKSkKKyAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgRXh0ZXJuYWxDb250ZW50c1BhdGggPSBWYWx1ZTsKKyAgICAgIH0gZWxzZSBpZiAoS2V5ID09ICJ1c2UtZXh0ZXJuYWwtbmFtZSIpIHsKKyAgICAgICAgYm9vbCBWYWw7CisgICAgICAgIGlmICghcGFyc2VTY2FsYXJCb29sKEktPmdldFZhbHVlKCksIFZhbCkpCisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFVzZUV4dGVybmFsTmFtZSA9IFZhbCA/IEZpbGVFbnRyeTo6TktfRXh0ZXJuYWwgOiBGaWxlRW50cnk6Ok5LX1ZpcnR1YWw7CisgICAgICB9IGVsc2UgeworICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJrZXkgbWlzc2luZyBmcm9tIEtleXMiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoU3RyZWFtLmZhaWxlZCgpKQorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBjaGVjayBmb3IgbWlzc2luZyBrZXlzCisgICAgaWYgKCFIYXNDb250ZW50cykgeworICAgICAgZXJyb3IoTiwgIm1pc3Npbmcga2V5ICdjb250ZW50cycgb3IgJ2V4dGVybmFsLWNvbnRlbnRzJyIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghY2hlY2tNaXNzaW5nS2V5cyhOLCBLZXlzKSkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8gY2hlY2sgaW52YWxpZCBjb25maWd1cmF0aW9uCisgICAgaWYgKEtpbmQgPT0gRUtfRGlyZWN0b3J5ICYmIFVzZUV4dGVybmFsTmFtZSAhPSBGaWxlRW50cnk6Ok5LX05vdFNldCkgeworICAgICAgZXJyb3IoTiwgIid1c2UtZXh0ZXJuYWwtbmFtZScgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGlyZWN0b3JpZXMiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaChlcyksIGJlaW5nIGNhcmVmdWwgbm90IHRvIHJlbW92ZSB0aGUgcm9vdCBwYXRoCisgICAgU3RyaW5nUmVmIFRyaW1tZWQoTmFtZSk7CisgICAgc2l6ZV90IFJvb3RQYXRoTGVuID0gc3lzOjpwYXRoOjpyb290X3BhdGgoVHJpbW1lZCkuc2l6ZSgpOworICAgIHdoaWxlIChUcmltbWVkLnNpemUoKSA+IFJvb3RQYXRoTGVuICYmCisgICAgICAgICAgIHN5czo6cGF0aDo6aXNfc2VwYXJhdG9yKFRyaW1tZWQuYmFjaygpKSkKKyAgICAgIFRyaW1tZWQgPSBUcmltbWVkLnNsaWNlKDAsIFRyaW1tZWQuc2l6ZSgpLTEpOworICAgIC8vIEdldCB0aGUgbGFzdCBjb21wb25lbnQKKyAgICBTdHJpbmdSZWYgTGFzdENvbXBvbmVudCA9IHN5czo6cGF0aDo6ZmlsZW5hbWUoVHJpbW1lZCk7CisKKyAgICBFbnRyeSAqUmVzdWx0ID0gMDsKKyAgICBzd2l0Y2ggKEtpbmQpIHsKKyAgICBjYXNlIEVLX0ZpbGU6CisgICAgICBSZXN1bHQgPSBuZXcgRmlsZUVudHJ5KExhc3RDb21wb25lbnQsIHN0ZDo6bW92ZShFeHRlcm5hbENvbnRlbnRzUGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZUV4dGVybmFsTmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVLX0RpcmVjdG9yeToKKyAgICAgIFJlc3VsdCA9IG5ldyBEaXJlY3RvcnlFbnRyeShMYXN0Q29tcG9uZW50LCBzdGQ6Om1vdmUoRW50cnlBcnJheUNvbnRlbnRzKSwKKyAgICAgICAgICBTdGF0dXMoIiIsICIiLCBnZXROZXh0VmlydHVhbFVuaXF1ZUlEKCksIHN5czo6VGltZVZhbHVlOjpub3coKSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgMCwgZmlsZV90eXBlOjpkaXJlY3RvcnlfZmlsZSwgc3lzOjpmczo6YWxsX2FsbCkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgU3RyaW5nUmVmIFBhcmVudCA9IHN5czo6cGF0aDo6cGFyZW50X3BhdGgoVHJpbW1lZCk7CisgICAgaWYgKFBhcmVudC5lbXB0eSgpKQorICAgICAgcmV0dXJuIFJlc3VsdDsKKworICAgIC8vIGlmICduYW1lJyBjb250YWlucyBtdWx0aXBsZSBjb21wb25lbnRzLCBjcmVhdGUgaW1wbGljaXQgZGlyZWN0b3J5IGVudHJpZXMKKyAgICBmb3IgKHN5czo6cGF0aDo6cmV2ZXJzZV9pdGVyYXRvciBJID0gc3lzOjpwYXRoOjpyYmVnaW4oUGFyZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gc3lzOjpwYXRoOjpyZW5kKFBhcmVudCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgUmVzdWx0ID0gbmV3IERpcmVjdG9yeUVudHJ5KCpJLCBsbHZtOjptYWtlQXJyYXlSZWYoUmVzdWx0KSwKKyAgICAgICAgICBTdGF0dXMoIiIsICIiLCBnZXROZXh0VmlydHVhbFVuaXF1ZUlEKCksIHN5czo6VGltZVZhbHVlOjpub3coKSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgMCwgZmlsZV90eXBlOjpkaXJlY3RvcnlfZmlsZSwgc3lzOjpmczo6YWxsX2FsbCkpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKK3B1YmxpYzoKKyAgVkZTRnJvbVlBTUxQYXJzZXIoeWFtbDo6U3RyZWFtICZTKSA6IFN0cmVhbShTKSB7fQorCisgIC8vIGZhbHNlIG9uIGVycm9yCisgIGJvb2wgcGFyc2UoeWFtbDo6Tm9kZSAqUm9vdCwgVkZTRnJvbVlBTUwgKkZTKSB7CisgICAgeWFtbDo6TWFwcGluZ05vZGUgKlRvcCA9IGR5bl9jYXN0PHlhbWw6Ok1hcHBpbmdOb2RlPihSb290KTsKKyAgICBpZiAoIVRvcCkgeworICAgICAgZXJyb3IoUm9vdCwgImV4cGVjdGVkIG1hcHBpbmcgbm9kZSIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEtleVN0YXR1c1BhaXIgRmllbGRzW10gPSB7CisgICAgICBLZXlTdGF0dXNQYWlyKCJ2ZXJzaW9uIiwgdHJ1ZSksCisgICAgICBLZXlTdGF0dXNQYWlyKCJjYXNlLXNlbnNpdGl2ZSIsIGZhbHNlKSwKKyAgICAgIEtleVN0YXR1c1BhaXIoInVzZS1leHRlcm5hbC1uYW1lcyIsIGZhbHNlKSwKKyAgICAgIEtleVN0YXR1c1BhaXIoInJvb3RzIiwgdHJ1ZSksCisgICAgfTsKKworICAgIERlbnNlTWFwPFN0cmluZ1JlZiwgS2V5U3RhdHVzPiBLZXlzKAorICAgICAgICAmRmllbGRzWzBdLCBGaWVsZHMgKyBzaXplb2YoRmllbGRzKS9zaXplb2YoRmllbGRzWzBdKSk7CisKKyAgICAvLyBQYXJzZSBjb25maWd1cmF0aW9uIGFuZCAncm9vdHMnCisgICAgZm9yICh5YW1sOjpNYXBwaW5nTm9kZTo6aXRlcmF0b3IgSSA9IFRvcC0+YmVnaW4oKSwgRSA9IFRvcC0+ZW5kKCk7IEkgIT0gRTsKKyAgICAgICAgICsrSSkgeworICAgICAgU21hbGxTdHJpbmc8MTA+IEtleUJ1ZmZlcjsKKyAgICAgIFN0cmluZ1JlZiBLZXk7CisgICAgICBpZiAoIXBhcnNlU2NhbGFyU3RyaW5nKEktPmdldEtleSgpLCBLZXksIEtleUJ1ZmZlcikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCFjaGVja0R1cGxpY2F0ZU9yVW5rbm93bktleShJLT5nZXRLZXkoKSwgS2V5LCBLZXlzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoS2V5ID09ICJyb290cyIpIHsKKyAgICAgICAgeWFtbDo6U2VxdWVuY2VOb2RlICpSb290cyA9IGR5bl9jYXN0PHlhbWw6OlNlcXVlbmNlTm9kZT4oSS0+Z2V0VmFsdWUoKSk7CisgICAgICAgIGlmICghUm9vdHMpIHsKKyAgICAgICAgICBlcnJvcihJLT5nZXRWYWx1ZSgpLCAiZXhwZWN0ZWQgYXJyYXkiKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHlhbWw6OlNlcXVlbmNlTm9kZTo6aXRlcmF0b3IgSSA9IFJvb3RzLT5iZWdpbigpLCBFID0gUm9vdHMtPmVuZCgpOworICAgICAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICAgICAgaWYgKEVudHJ5ICpFID0gcGFyc2VFbnRyeSgmKkkpKQorICAgICAgICAgICAgRlMtPlJvb3RzLnB1c2hfYmFjayhFKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoS2V5ID09ICJ2ZXJzaW9uIikgeworICAgICAgICBTdHJpbmdSZWYgVmVyc2lvblN0cmluZzsKKyAgICAgICAgU21hbGxTdHJpbmc8ND4gU3RvcmFnZTsKKyAgICAgICAgaWYgKCFwYXJzZVNjYWxhclN0cmluZyhJLT5nZXRWYWx1ZSgpLCBWZXJzaW9uU3RyaW5nLCBTdG9yYWdlKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGludCBWZXJzaW9uOworICAgICAgICBpZiAoVmVyc2lvblN0cmluZy5nZXRBc0ludGVnZXI8aW50PigxMCwgVmVyc2lvbikpIHsKKyAgICAgICAgICBlcnJvcihJLT5nZXRWYWx1ZSgpLCAiZXhwZWN0ZWQgaW50ZWdlciIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVmVyc2lvbiA8IDApIHsKKyAgICAgICAgICBlcnJvcihJLT5nZXRWYWx1ZSgpLCAiaW52YWxpZCB2ZXJzaW9uIG51bWJlciIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVmVyc2lvbiAhPSAwKSB7CisgICAgICAgICAgZXJyb3IoSS0+Z2V0VmFsdWUoKSwgInZlcnNpb24gbWlzbWF0Y2gsIGV4cGVjdGVkIDAiKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoS2V5ID09ICJjYXNlLXNlbnNpdGl2ZSIpIHsKKyAgICAgICAgaWYgKCFwYXJzZVNjYWxhckJvb2woSS0+Z2V0VmFsdWUoKSwgRlMtPkNhc2VTZW5zaXRpdmUpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoS2V5ID09ICJ1c2UtZXh0ZXJuYWwtbmFtZXMiKSB7CisgICAgICAgIGlmICghcGFyc2VTY2FsYXJCb29sKEktPmdldFZhbHVlKCksIEZTLT5Vc2VFeHRlcm5hbE5hbWVzKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJrZXkgbWlzc2luZyBmcm9tIEtleXMiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoU3RyZWFtLmZhaWxlZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFjaGVja01pc3NpbmdLZXlzKFRvcCwgS2V5cykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307Cit9IC8vIGVuZCBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK0VudHJ5Ojp+RW50cnkoKSB7fQorRGlyZWN0b3J5RW50cnk6On5EaXJlY3RvcnlFbnRyeSgpIHsgbGx2bTo6RGVsZXRlQ29udGFpbmVyUG9pbnRlcnMoQ29udGVudHMpOyB9CisKK1ZGU0Zyb21ZQU1MOjp+VkZTRnJvbVlBTUwoKSB7IGxsdm06OkRlbGV0ZUNvbnRhaW5lclBvaW50ZXJzKFJvb3RzKTsgfQorCitWRlNGcm9tWUFNTCAqVkZTRnJvbVlBTUw6OmNyZWF0ZShNZW1vcnlCdWZmZXIgKkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU1ncjo6RGlhZ0hhbmRsZXJUeSBEaWFnSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRpYWdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cnVzaXZlUmVmQ250UHRyPEZpbGVTeXN0ZW0+IEV4dGVybmFsRlMpIHsKKworICBTb3VyY2VNZ3IgU007CisgIHlhbWw6OlN0cmVhbSBTdHJlYW0oQnVmZmVyLCBTTSk7CisKKyAgU00uc2V0RGlhZ0hhbmRsZXIoRGlhZ0hhbmRsZXIsIERpYWdDb250ZXh0KTsKKyAgeWFtbDo6ZG9jdW1lbnRfaXRlcmF0b3IgREkgPSBTdHJlYW0uYmVnaW4oKTsKKyAgeWFtbDo6Tm9kZSAqUm9vdCA9IERJLT5nZXRSb290KCk7CisgIGlmIChESSA9PSBTdHJlYW0uZW5kKCkgfHwgIVJvb3QpIHsKKyAgICBTTS5QcmludE1lc3NhZ2UoU01Mb2MoKSwgU291cmNlTWdyOjpES19FcnJvciwgImV4cGVjdGVkIHJvb3Qgbm9kZSIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgVkZTRnJvbVlBTUxQYXJzZXIgUChTdHJlYW0pOworCisgIHN0ZDo6dW5pcXVlX3B0cjxWRlNGcm9tWUFNTD4gRlMobmV3IFZGU0Zyb21ZQU1MKEV4dGVybmFsRlMpKTsKKyAgaWYgKCFQLnBhcnNlKFJvb3QsIEZTLmdldCgpKSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gRlMucmVsZWFzZSgpOworfQorCitFcnJvck9yPEVudHJ5ICo+IFZGU0Zyb21ZQU1MOjpsb29rdXBQYXRoKGNvbnN0IFR3aW5lICZQYXRoXykgeworICBTbWFsbFN0cmluZzwyNTY+IFBhdGg7CisgIFBhdGhfLnRvVmVjdG9yKFBhdGgpOworCisgIC8vIEhhbmRsZSByZWxhdGl2ZSBwYXRocworICBpZiAoZXJyb3JfY29kZSBFQyA9IHN5czo6ZnM6Om1ha2VfYWJzb2x1dGUoUGF0aCkpCisgICAgcmV0dXJuIEVDOworCisgIGlmIChQYXRoLmVtcHR5KCkpCisgICAgcmV0dXJuIGVycm9yX2NvZGUoZXJyYzo6aW52YWxpZF9hcmd1bWVudCwgc3lzdGVtX2NhdGVnb3J5KCkpOworCisgIHN5czo6cGF0aDo6Y29uc3RfaXRlcmF0b3IgU3RhcnQgPSBzeXM6OnBhdGg6OmJlZ2luKFBhdGgpOworICBzeXM6OnBhdGg6OmNvbnN0X2l0ZXJhdG9yIEVuZCA9IHN5czo6cGF0aDo6ZW5kKFBhdGgpOworICBmb3IgKHN0ZDo6dmVjdG9yPEVudHJ5ICo+OjppdGVyYXRvciBJID0gUm9vdHMuYmVnaW4oKSwgRSA9IFJvb3RzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgRXJyb3JPcjxFbnRyeSAqPiBSZXN1bHQgPSBsb29rdXBQYXRoKFN0YXJ0LCBFbmQsICpJKTsKKyAgICBpZiAoUmVzdWx0IHx8IFJlc3VsdC5nZXRFcnJvcigpICE9IGVycmM6Om5vX3N1Y2hfZmlsZV9vcl9kaXJlY3RvcnkpCisgICAgICByZXR1cm4gUmVzdWx0OworICB9CisgIHJldHVybiBlcnJvcl9jb2RlKGVycmM6Om5vX3N1Y2hfZmlsZV9vcl9kaXJlY3RvcnksIHN5c3RlbV9jYXRlZ29yeSgpKTsKK30KKworRXJyb3JPcjxFbnRyeSAqPiBWRlNGcm9tWUFNTDo6bG9va3VwUGF0aChzeXM6OnBhdGg6OmNvbnN0X2l0ZXJhdG9yIFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXM6OnBhdGg6OmNvbnN0X2l0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnkgKkZyb20pIHsKKyAgaWYgKFN0YXJ0LT5lcXVhbHMoIi4iKSkKKyAgICArK1N0YXJ0OworCisgIC8vIEZJWE1FOiBoYW5kbGUgLi4KKyAgaWYgKENhc2VTZW5zaXRpdmUgPyAhU3RhcnQtPmVxdWFscyhGcm9tLT5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIDogIVN0YXJ0LT5lcXVhbHNfbG93ZXIoRnJvbS0+Z2V0TmFtZSgpKSkKKyAgICAvLyBmYWlsdXJlIHRvIG1hdGNoCisgICAgcmV0dXJuIGVycm9yX2NvZGUoZXJyYzo6bm9fc3VjaF9maWxlX29yX2RpcmVjdG9yeSwgc3lzdGVtX2NhdGVnb3J5KCkpOworCisgICsrU3RhcnQ7CisKKyAgaWYgKFN0YXJ0ID09IEVuZCkgeworICAgIC8vIE1hdGNoIQorICAgIHJldHVybiBGcm9tOworICB9CisKKyAgRGlyZWN0b3J5RW50cnkgKkRFID0gZHluX2Nhc3Q8RGlyZWN0b3J5RW50cnk+KEZyb20pOworICBpZiAoIURFKQorICAgIHJldHVybiBlcnJvcl9jb2RlKGVycmM6Om5vdF9hX2RpcmVjdG9yeSwgc3lzdGVtX2NhdGVnb3J5KCkpOworCisgIGZvciAoRGlyZWN0b3J5RW50cnk6Oml0ZXJhdG9yIEkgPSBERS0+Y29udGVudHNfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IERFLT5jb250ZW50c19lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIEVycm9yT3I8RW50cnkgKj4gUmVzdWx0ID0gbG9va3VwUGF0aChTdGFydCwgRW5kLCAqSSk7CisgICAgaWYgKFJlc3VsdCB8fCBSZXN1bHQuZ2V0RXJyb3IoKSAhPSBlcnJjOjpub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5KQorICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorICByZXR1cm4gZXJyb3JfY29kZShlcnJjOjpub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5LCBzeXN0ZW1fY2F0ZWdvcnkoKSk7Cit9CisKK0Vycm9yT3I8U3RhdHVzPiBWRlNGcm9tWUFNTDo6c3RhdHVzKGNvbnN0IFR3aW5lICZQYXRoKSB7CisgIEVycm9yT3I8RW50cnkgKj4gUmVzdWx0ID0gbG9va3VwUGF0aChQYXRoKTsKKyAgaWYgKCFSZXN1bHQpCisgICAgcmV0dXJuIFJlc3VsdC5nZXRFcnJvcigpOworCisgIHN0ZDo6c3RyaW5nIFBhdGhTdHIoUGF0aC5zdHIoKSk7CisgIGlmIChGaWxlRW50cnkgKkYgPSBkeW5fY2FzdDxGaWxlRW50cnk+KCpSZXN1bHQpKSB7CisgICAgRXJyb3JPcjxTdGF0dXM+IFMgPSBFeHRlcm5hbEZTLT5zdGF0dXMoRi0+Z2V0RXh0ZXJuYWxDb250ZW50c1BhdGgoKSk7CisgICAgYXNzZXJ0KCFTIHx8IFMtPmdldE5hbWUoKSA9PSBGLT5nZXRFeHRlcm5hbENvbnRlbnRzUGF0aCgpKTsKKyAgICBpZiAoUyAmJiAhRi0+dXNlRXh0ZXJuYWxOYW1lKFVzZUV4dGVybmFsTmFtZXMpKQorICAgICAgUy0+c2V0TmFtZShQYXRoU3RyKTsKKyAgICByZXR1cm4gUzsKKyAgfSBlbHNlIHsgLy8gZGlyZWN0b3J5CisgICAgRGlyZWN0b3J5RW50cnkgKkRFID0gY2FzdDxEaXJlY3RvcnlFbnRyeT4oKlJlc3VsdCk7CisgICAgU3RhdHVzIFMgPSBERS0+Z2V0U3RhdHVzKCk7CisgICAgUy5zZXROYW1lKFBhdGhTdHIpOworICAgIHJldHVybiBTOworICB9Cit9CisKK2Vycm9yX2NvZGUgVkZTRnJvbVlBTUw6Om9wZW5GaWxlRm9yUmVhZChjb25zdCBUd2luZSAmUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dmZzOjpGaWxlPiAmUmVzdWx0KSB7CisgIEVycm9yT3I8RW50cnkgKj4gRSA9IGxvb2t1cFBhdGgoUGF0aCk7CisgIGlmICghRSkKKyAgICByZXR1cm4gRS5nZXRFcnJvcigpOworCisgIEZpbGVFbnRyeSAqRiA9IGR5bl9jYXN0PEZpbGVFbnRyeT4oKkUpOworICBpZiAoIUYpIC8vIEZJWE1FOiBlcnJjOjpub3RfYV9maWxlPworICAgIHJldHVybiBlcnJvcl9jb2RlKGVycmM6OmludmFsaWRfYXJndW1lbnQsIHN5c3RlbV9jYXRlZ29yeSgpKTsKKworICBpZiAoZXJyb3JfY29kZSBFQyA9IEV4dGVybmFsRlMtPm9wZW5GaWxlRm9yUmVhZChGLT5nZXRFeHRlcm5hbENvbnRlbnRzUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQpKQorICAgIHJldHVybiBFQzsKKworICBpZiAoIUYtPnVzZUV4dGVybmFsTmFtZShVc2VFeHRlcm5hbE5hbWVzKSkKKyAgICBSZXN1bHQtPnNldE5hbWUoUGF0aC5zdHIoKSk7CisKKyAgcmV0dXJuIGVycm9yX2NvZGU6OnN1Y2Nlc3MoKTsKK30KKworSW50cnVzaXZlUmVmQ250UHRyPEZpbGVTeXN0ZW0+Cit2ZnM6OmdldFZGU0Zyb21ZQU1MKE1lbW9yeUJ1ZmZlciAqQnVmZmVyLCBTb3VyY2VNZ3I6OkRpYWdIYW5kbGVyVHkgRGlhZ0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRpYWdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBJbnRydXNpdmVSZWZDbnRQdHI8RmlsZVN5c3RlbT4gRXh0ZXJuYWxGUykgeworICByZXR1cm4gVkZTRnJvbVlBTUw6OmNyZWF0ZShCdWZmZXIsIERpYWdIYW5kbGVyLCBEaWFnQ29udGV4dCwgRXh0ZXJuYWxGUyk7Cit9CisKK1VuaXF1ZUlEIHZmczo6Z2V0TmV4dFZpcnR1YWxVbmlxdWVJRCgpIHsKKyAgc3RhdGljIHN0ZDo6YXRvbWljPHVuc2lnbmVkPiBVSUQ7CisgIHVuc2lnbmVkIElEID0gKytVSUQ7CisgIC8vIFRoZSBmb2xsb3dpbmcgYXNzdW1lcyB0aGF0IHVpbnQ2NF90IG1heCB3aWxsIG5ldmVyIGNvbGxpZGUgd2l0aCBhIHJlYWwKKyAgLy8gZGV2X3QgdmFsdWUgZnJvbSB0aGUgT1MuCisgIHJldHVybiBVbmlxdWVJRChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCksIElEKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0FCSUluZm8uaCBiL2xpYi9Db2RlR2VuL0FCSUluZm8uaAppbmRleCA0NjhmZTA0Li5kM2VjNDZjIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9BQklJbmZvLmgKKysrIGIvbGliL0NvZGVHZW4vQUJJSW5mby5oCkBAIC0xMSw4ICsxMSw4IEBACiAjZGVmaW5lIENMQU5HX0NPREVHRU5fQUJJSU5GT19ICiAKICNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgotI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgogI2luY2x1ZGUgImxsdm0vSVIvQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKIAogbmFtZXNwYWNlIGxsdm0gewogICBjbGFzcyBWYWx1ZTsKZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0FuZHJvaWQubWsgYi9saWIvQ29kZUdlbi9BbmRyb2lkLm1rCmluZGV4IDkxMDhlMjQuLjFjNGEwYjcgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0FuZHJvaWQubWsKKysrIGIvbGliL0NvZGVHZW4vQW5kcm9pZC5tawpAQCAtMyw2ICszLDcgQEAKIGNsYW5nX2NvZGVnZW5fVEJMR0VOX1RBQkxFUyA6PSBcCiAgIEF0dHJMaXN0LmluYyBcCiAgIEF0dHJzLmluYyBcCisgIEF0dHJWaXNpdG9yLmluYyBcCiAgIENvbW1lbnRDb21tYW5kTGlzdC5pbmMgXAogICBDb21tZW50Tm9kZXMuaW5jIFwKICAgRGVjbE5vZGVzLmluYyBcCkBAIC00OCwxMSArNDksMTEgQEAKICAgQ29kZUdlbkFjdGlvbi5jcHAgXAogICBDb2RlR2VuRnVuY3Rpb24uY3BwIFwKICAgQ29kZUdlbk1vZHVsZS5jcHAgXAorICBDb2RlR2VuUEdPLmNwcCBcCiAgIENvZGVHZW5UQkFBLmNwcCBcCiAgIENvZGVHZW5UeXBlcy5jcHAgXAogICBJdGFuaXVtQ1hYQUJJLmNwcCBcCiAgIE1pY3Jvc29mdENYWEFCSS5jcHAgXAotICBNaWNyb3NvZnRWQlRhYmxlcy5jcHAgXAogICBNb2R1bGVCdWlsZGVyLmNwcCBcCiAgIFRhcmdldEluZm8uY3BwCiAKZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0JhY2tlbmRVdGlsLmNwcCBiL2xpYi9Db2RlR2VuL0JhY2tlbmRVdGlsLmNwcAppbmRleCA5MGIwZjY4Li4xN2Y1ZjRkIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9CYWNrZW5kVXRpbC5jcHAKKysrIGIvbGliL0NvZGVHZW4vQmFja2VuZFV0aWwuY3BwCkBAIC0xMywxMyArMTMsMTQgQEAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRPcHRpb25zLmgiCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvQ29kZUdlbk9wdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZERpYWdub3N0aWMuaCIKLSNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1ZlcmlmaWVyLmgiCi0jaW5jbHVkZSAibGx2bS9Bc3NlbWJseS9QcmludE1vZHVsZVBhc3MuaCIKLSNpbmNsdWRlICJsbHZtL0JpdGNvZGUvUmVhZGVyV3JpdGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0JpdGNvZGUvQml0Y29kZVdyaXRlclBhc3MuaCIKICNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUmVnQWxsb2NSZWdpc3RyeS5oIgogI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZXJSZWdpc3RyeS5oIgogI2luY2x1ZGUgImxsdm0vSVIvRGF0YUxheW91dC5oIgorI2luY2x1ZGUgImxsdm0vSVIvSVJQcmludGluZ1Bhc3Nlcy5oIgogI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WZXJpZmllci5oIgogI2luY2x1ZGUgImxsdm0vTUMvU3VidGFyZ2V0RmVhdHVyZS5oIgogI2luY2x1ZGUgImxsdm0vUGFzc01hbmFnZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKQEAgLTM2LDYgKzM3LDcgQEAKICNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uLmgiCiAjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL09iakNBUkMuaCIKICNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIGxsdm07CiAKQEAgLTU1LDM4ICs1NywzNyBAQAogICBtdXRhYmxlIEZ1bmN0aW9uUGFzc01hbmFnZXIgKlBlckZ1bmN0aW9uUGFzc2VzOwogCiBwcml2YXRlOgotICBQYXNzTWFuYWdlciAqZ2V0Q29kZUdlblBhc3NlcyhUYXJnZXRNYWNoaW5lICpUTSkgY29uc3QgeworICBQYXNzTWFuYWdlciAqZ2V0Q29kZUdlblBhc3NlcygpIGNvbnN0IHsKICAgICBpZiAoIUNvZGVHZW5QYXNzZXMpIHsKICAgICAgIENvZGVHZW5QYXNzZXMgPSBuZXcgUGFzc01hbmFnZXIoKTsKLSAgICAgIENvZGVHZW5QYXNzZXMtPmFkZChuZXcgRGF0YUxheW91dChUaGVNb2R1bGUpKTsKKyAgICAgIENvZGVHZW5QYXNzZXMtPmFkZChuZXcgRGF0YUxheW91dFBhc3MoVGhlTW9kdWxlKSk7CiAgICAgICBpZiAoVE0pCiAgICAgICAgIFRNLT5hZGRBbmFseXNpc1Bhc3NlcygqQ29kZUdlblBhc3Nlcyk7CiAgICAgfQogICAgIHJldHVybiBDb2RlR2VuUGFzc2VzOwogICB9CiAKLSAgUGFzc01hbmFnZXIgKmdldFBlck1vZHVsZVBhc3NlcyhUYXJnZXRNYWNoaW5lICpUTSkgY29uc3QgeworICBQYXNzTWFuYWdlciAqZ2V0UGVyTW9kdWxlUGFzc2VzKCkgY29uc3QgewogICAgIGlmICghUGVyTW9kdWxlUGFzc2VzKSB7CiAgICAgICBQZXJNb2R1bGVQYXNzZXMgPSBuZXcgUGFzc01hbmFnZXIoKTsKLSAgICAgIFBlck1vZHVsZVBhc3Nlcy0+YWRkKG5ldyBEYXRhTGF5b3V0KFRoZU1vZHVsZSkpOworICAgICAgUGVyTW9kdWxlUGFzc2VzLT5hZGQobmV3IERhdGFMYXlvdXRQYXNzKFRoZU1vZHVsZSkpOwogICAgICAgaWYgKFRNKQogICAgICAgICBUTS0+YWRkQW5hbHlzaXNQYXNzZXMoKlBlck1vZHVsZVBhc3Nlcyk7CiAgICAgfQogICAgIHJldHVybiBQZXJNb2R1bGVQYXNzZXM7CiAgIH0KIAotICBGdW5jdGlvblBhc3NNYW5hZ2VyICpnZXRQZXJGdW5jdGlvblBhc3NlcyhUYXJnZXRNYWNoaW5lICpUTSkgY29uc3QgeworICBGdW5jdGlvblBhc3NNYW5hZ2VyICpnZXRQZXJGdW5jdGlvblBhc3NlcygpIGNvbnN0IHsKICAgICBpZiAoIVBlckZ1bmN0aW9uUGFzc2VzKSB7CiAgICAgICBQZXJGdW5jdGlvblBhc3NlcyA9IG5ldyBGdW5jdGlvblBhc3NNYW5hZ2VyKFRoZU1vZHVsZSk7Ci0gICAgICBQZXJGdW5jdGlvblBhc3Nlcy0+YWRkKG5ldyBEYXRhTGF5b3V0KFRoZU1vZHVsZSkpOworICAgICAgUGVyRnVuY3Rpb25QYXNzZXMtPmFkZChuZXcgRGF0YUxheW91dFBhc3MoVGhlTW9kdWxlKSk7CiAgICAgICBpZiAoVE0pCiAgICAgICAgIFRNLT5hZGRBbmFseXNpc1Bhc3NlcygqUGVyRnVuY3Rpb25QYXNzZXMpOwogICAgIH0KICAgICByZXR1cm4gUGVyRnVuY3Rpb25QYXNzZXM7CiAgIH0KIAotCi0gIHZvaWQgQ3JlYXRlUGFzc2VzKFRhcmdldE1hY2hpbmUgKlRNKTsKKyAgdm9pZCBDcmVhdGVQYXNzZXMoKTsKIAogICAvLy8gQ3JlYXRlVGFyZ2V0TWFjaGluZSAtIEdlbmVyYXRlcyB0aGUgVGFyZ2V0TWFjaGluZS4KICAgLy8vIFJldHVybnMgTnVsbCBpZiBpdCBpcyB1bmFibGUgdG8gY3JlYXRlIHRoZSB0YXJnZXQgbWFjaGluZS4KQEAgLTEwMSw4ICsxMDIsNyBAQAogICAvLy8gQWRkRW1pdFBhc3NlcyAtIEFkZCBwYXNzZXMgbmVjZXNzYXJ5IHRvIGVtaXQgYXNzZW1ibHkgb3IgTExWTSBJUi4KICAgLy8vCiAgIC8vLyBccmV0dXJuIFRydWUgb24gc3VjY2Vzcy4KLSAgYm9vbCBBZGRFbWl0UGFzc2VzKEJhY2tlbmRBY3Rpb24gQWN0aW9uLCBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk9TLAotICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TWFjaGluZSAqVE0pOworICBib29sIEFkZEVtaXRQYXNzZXMoQmFja2VuZEFjdGlvbiBBY3Rpb24sIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmT1MpOwogCiBwdWJsaWM6CiAgIEVtaXRBc3NlbWJseUhlbHBlcihEaWFnbm9zdGljc0VuZ2luZSAmX0RpYWdzLApAQCAtMTE4LDggKzExOCwxMiBAQAogICAgIGRlbGV0ZSBDb2RlR2VuUGFzc2VzOwogICAgIGRlbGV0ZSBQZXJNb2R1bGVQYXNzZXM7CiAgICAgZGVsZXRlIFBlckZ1bmN0aW9uUGFzc2VzOworICAgIGlmIChDb2RlR2VuT3B0cy5EaXNhYmxlRnJlZSkKKyAgICAgIEJ1cnlQb2ludGVyKFRNLnJlbGVhc2UoKSk7CiAgIH0KIAorICBzdGQ6OnVuaXF1ZV9wdHI8VGFyZ2V0TWFjaGluZT4gVE07CisKICAgdm9pZCBFbWl0QXNzZW1ibHkoQmFja2VuZEFjdGlvbiBBY3Rpb24sIHJhd19vc3RyZWFtICpPUyk7CiB9OwogCkBAIC0xNjIsNiArMTY2LDExIEBACiAgIFBNLmFkZChjcmVhdGVTYW1wbGVQcm9maWxlTG9hZGVyUGFzcyhDR09wdHMuU2FtcGxlUHJvZmlsZUZpbGUpKTsKIH0KIAorc3RhdGljIHZvaWQgYWRkQWRkRGlzY3JpbWluYXRvcnNQYXNzKGNvbnN0IFBhc3NNYW5hZ2VyQnVpbGRlciAmQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTWFuYWdlckJhc2UgJlBNKSB7CisgIFBNLmFkZChjcmVhdGVBZGREaXNjcmltaW5hdG9yc1Bhc3MoKSk7Cit9CisKIHN0YXRpYyB2b2lkIGFkZEJvdW5kc0NoZWNraW5nUGFzcyhjb25zdCBQYXNzTWFuYWdlckJ1aWxkZXIgJkJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTWFuYWdlckJhc2UgJlBNKSB7CiAgIFBNLmFkZChjcmVhdGVCb3VuZHNDaGVja2luZ1Bhc3MoKSk7CkBAIC0xNzcsMTIgKzE4NiwxMCBAQAogICAgICAgTGFuZ09wdHMuU2FuaXRpemUuSW5pdE9yZGVyLAogICAgICAgTGFuZ09wdHMuU2FuaXRpemUuVXNlQWZ0ZXJSZXR1cm4sCiAgICAgICBMYW5nT3B0cy5TYW5pdGl6ZS5Vc2VBZnRlclNjb3BlLAotICAgICAgQ0dPcHRzLlNhbml0aXplckJsYWNrbGlzdEZpbGUsCi0gICAgICBDR09wdHMuU2FuaXRpemVBZGRyZXNzWmVyb0Jhc2VTaGFkb3cpKTsKKyAgICAgIENHT3B0cy5TYW5pdGl6ZXJCbGFja2xpc3RGaWxlKSk7CiAgIFBNLmFkZChjcmVhdGVBZGRyZXNzU2FuaXRpemVyTW9kdWxlUGFzcygKICAgICAgIExhbmdPcHRzLlNhbml0aXplLkluaXRPcmRlciwKLSAgICAgIENHT3B0cy5TYW5pdGl6ZXJCbGFja2xpc3RGaWxlLAotICAgICAgQ0dPcHRzLlNhbml0aXplQWRkcmVzc1plcm9CYXNlU2hhZG93KSk7CisgICAgICBDR09wdHMuU2FuaXRpemVyQmxhY2tsaXN0RmlsZSkpOwogfQogCiBzdGF0aWMgdm9pZCBhZGRNZW1vcnlTYW5pdGl6ZXJQYXNzKGNvbnN0IFBhc3NNYW5hZ2VyQnVpbGRlciAmQnVpbGRlciwKQEAgLTIyMiw3ICsyMjksNyBAQAogICBQTS5hZGQoY3JlYXRlRGF0YUZsb3dTYW5pdGl6ZXJQYXNzKENHT3B0cy5TYW5pdGl6ZXJCbGFja2xpc3RGaWxlKSk7CiB9CiAKLXZvaWQgRW1pdEFzc2VtYmx5SGVscGVyOjpDcmVhdGVQYXNzZXMoVGFyZ2V0TWFjaGluZSAqVE0pIHsKK3ZvaWQgRW1pdEFzc2VtYmx5SGVscGVyOjpDcmVhdGVQYXNzZXMoKSB7CiAgIHVuc2lnbmVkIE9wdExldmVsID0gQ29kZUdlbk9wdHMuT3B0aW1pemF0aW9uTGV2ZWw7CiAgIENvZGVHZW5PcHRpb25zOjpJbmxpbmluZ01ldGhvZCBJbmxpbmluZyA9IENvZGVHZW5PcHRzLmdldElubGluaW5nKCk7CiAKQEAgLTI0NCw2ICsyNTEsOSBAQAogICBQTUJ1aWxkZXIuRGlzYWJsZVVucm9sbExvb3BzID0gIUNvZGVHZW5PcHRzLlVucm9sbExvb3BzOwogICBQTUJ1aWxkZXIuUmVyb2xsTG9vcHMgPSBDb2RlR2VuT3B0cy5SZXJvbGxMb29wczsKIAorICBQTUJ1aWxkZXIuYWRkRXh0ZW5zaW9uKFBhc3NNYW5hZ2VyQnVpbGRlcjo6RVBfRWFybHlBc1Bvc3NpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEFkZERpc2NyaW1pbmF0b3JzUGFzcyk7CisKICAgaWYgKCFDb2RlR2VuT3B0cy5TYW1wbGVQcm9maWxlRmlsZS5lbXB0eSgpKQogICAgIFBNQnVpbGRlci5hZGRFeHRlbnNpb24oUGFzc01hbmFnZXJCdWlsZGVyOjpFUF9FYXJseUFzUG9zc2libGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTYW1wbGVQcm9maWxlTG9hZGVyUGFzcyk7CkBAIC0yOTgsMTkgKzMwOCwxMiBAQAogICBQTUJ1aWxkZXIuTGlicmFyeUluZm8gPSBuZXcgVGFyZ2V0TGlicmFyeUluZm8oVGFyZ2V0VHJpcGxlKTsKICAgaWYgKCFDb2RlR2VuT3B0cy5TaW1wbGlmeUxpYkNhbGxzKQogICAgIFBNQnVpbGRlci5MaWJyYXJ5SW5mby0+ZGlzYWJsZUFsbEZ1bmN0aW9ucygpOwotICAKKwogICBzd2l0Y2ggKElubGluaW5nKSB7CiAgIGNhc2UgQ29kZUdlbk9wdGlvbnM6Ok5vSW5saW5pbmc6IGJyZWFrOwogICBjYXNlIENvZGVHZW5PcHRpb25zOjpOb3JtYWxJbmxpbmluZzogewotICAgIC8vIEZJWE1FOiBEZXJpdmUgdGhlc2UgY29uc3RhbnRzIGluIGEgcHJpbmNpcGxlZCBmYXNoaW9uLgotICAgIHVuc2lnbmVkIFRocmVzaG9sZCA9IDIyNTsKLSAgICBpZiAoQ29kZUdlbk9wdHMuT3B0aW1pemVTaXplID09IDEpICAgICAgLy8gLU9zCi0gICAgICBUaHJlc2hvbGQgPSA3NTsKLSAgICBlbHNlIGlmIChDb2RlR2VuT3B0cy5PcHRpbWl6ZVNpemUgPT0gMikgLy8gLU96Ci0gICAgICBUaHJlc2hvbGQgPSAyNTsKLSAgICBlbHNlIGlmIChPcHRMZXZlbCA+IDIpCi0gICAgICBUaHJlc2hvbGQgPSAyNzU7Ci0gICAgUE1CdWlsZGVyLklubGluZXIgPSBjcmVhdGVGdW5jdGlvbklubGluaW5nUGFzcyhUaHJlc2hvbGQpOworICAgIFBNQnVpbGRlci5JbmxpbmVyID0KKyAgICAgICAgY3JlYXRlRnVuY3Rpb25JbmxpbmluZ1Bhc3MoT3B0TGV2ZWwsIENvZGVHZW5PcHRzLk9wdGltaXplU2l6ZSk7CiAgICAgYnJlYWs7CiAgIH0KICAgY2FzZSBDb2RlR2VuT3B0aW9uczo6T25seUFsd2F5c0lubGluaW5nOgpAQCAtMzI0LDEzICszMjcsMTMgQEAKICAgfQogCiAgIC8vIFNldCB1cCB0aGUgcGVyLWZ1bmN0aW9uIHBhc3MgbWFuYWdlci4KLSAgRnVuY3Rpb25QYXNzTWFuYWdlciAqRlBNID0gZ2V0UGVyRnVuY3Rpb25QYXNzZXMoVE0pOworICBGdW5jdGlvblBhc3NNYW5hZ2VyICpGUE0gPSBnZXRQZXJGdW5jdGlvblBhc3NlcygpOwogICBpZiAoQ29kZUdlbk9wdHMuVmVyaWZ5TW9kdWxlKQogICAgIEZQTS0+YWRkKGNyZWF0ZVZlcmlmaWVyUGFzcygpKTsKICAgUE1CdWlsZGVyLnBvcHVsYXRlRnVuY3Rpb25QYXNzTWFuYWdlcigqRlBNKTsKIAogICAvLyBTZXQgdXAgdGhlIHBlci1tb2R1bGUgcGFzcyBtYW5hZ2VyLgotICBQYXNzTWFuYWdlciAqTVBNID0gZ2V0UGVyTW9kdWxlUGFzc2VzKFRNKTsKKyAgUGFzc01hbmFnZXIgKk1QTSA9IGdldFBlck1vZHVsZVBhc3NlcygpOwogCiAgIGlmICghQ29kZUdlbk9wdHMuRGlzYWJsZUdDb3YgJiYKICAgICAgIChDb2RlR2VuT3B0cy5FbWl0R2NvdkFyY3MgfHwgQ29kZUdlbk9wdHMuRW1pdEdjb3ZOb3RlcykpIHsKQEAgLTQzNyw2ICs0NDAsMTIgQEAKIAogICBsbHZtOjpUYXJnZXRPcHRpb25zIE9wdGlvbnM7CiAKKyAgaWYgKENvZGVHZW5PcHRzLkRpc2FibGVJbnRlZ3JhdGVkQVMpCisgICAgT3B0aW9ucy5EaXNhYmxlSW50ZWdyYXRlZEFTID0gdHJ1ZTsKKworICBpZiAoQ29kZUdlbk9wdHMuQ29tcHJlc3NEZWJ1Z1NlY3Rpb25zKQorICAgIE9wdGlvbnMuQ29tcHJlc3NEZWJ1Z1NlY3Rpb25zID0gdHJ1ZTsKKwogICAvLyBTZXQgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbiBtb2RlLgogICBpZiAoIUNvZGVHZW5PcHRzLkRpc2FibGVGUEVsaW0pIHsKICAgICBPcHRpb25zLk5vRnJhbWVQb2ludGVyRWxpbSA9IGZhbHNlOwpAQCAtNTAzLDExICs1MTIsMTAgQEAKIH0KIAogYm9vbCBFbWl0QXNzZW1ibHlIZWxwZXI6OkFkZEVtaXRQYXNzZXMoQmFja2VuZEFjdGlvbiBBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk9TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TWFjaGluZSAqVE0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmT1MpIHsKIAogICAvLyBDcmVhdGUgdGhlIGNvZGUgZ2VuZXJhdG9yIHBhc3Nlcy4KLSAgUGFzc01hbmFnZXIgKlBNID0gZ2V0Q29kZUdlblBhc3NlcyhUTSk7CisgIFBhc3NNYW5hZ2VyICpQTSA9IGdldENvZGVHZW5QYXNzZXMoKTsKIAogICAvLyBBZGQgTGlicmFyeUluZm8uCiAgIGxsdm06OlRyaXBsZSBUYXJnZXRUcmlwbGUoVGhlTW9kdWxlLT5nZXRUYXJnZXRUcmlwbGUoKSk7CkBAIC01NTIsMjcgKzU2MCwyOCBAQAogICBib29sIFVzZXNDb2RlR2VuID0gKEFjdGlvbiAhPSBCYWNrZW5kX0VtaXROb3RoaW5nICYmCiAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICE9IEJhY2tlbmRfRW1pdEJDICYmCiAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICE9IEJhY2tlbmRfRW1pdExMKTsKLSAgVGFyZ2V0TWFjaGluZSAqVE0gPSBDcmVhdGVUYXJnZXRNYWNoaW5lKFVzZXNDb2RlR2VuKTsKKyAgaWYgKCFUTSkKKyAgICBUTS5yZXNldChDcmVhdGVUYXJnZXRNYWNoaW5lKFVzZXNDb2RlR2VuKSk7CisKICAgaWYgKFVzZXNDb2RlR2VuICYmICFUTSkgcmV0dXJuOwotICBsbHZtOjpPd25pbmdQdHI8VGFyZ2V0TWFjaGluZT4gVE1Pd25lcihDb2RlR2VuT3B0cy5EaXNhYmxlRnJlZSA/IDAgOiBUTSk7Ci0gIENyZWF0ZVBhc3NlcyhUTSk7CisgIENyZWF0ZVBhc3NlcygpOwogCiAgIHN3aXRjaCAoQWN0aW9uKSB7CiAgIGNhc2UgQmFja2VuZF9FbWl0Tm90aGluZzoKICAgICBicmVhazsKIAogICBjYXNlIEJhY2tlbmRfRW1pdEJDOgotICAgIGdldFBlck1vZHVsZVBhc3NlcyhUTSktPmFkZChjcmVhdGVCaXRjb2RlV3JpdGVyUGFzcygqT1MpKTsKKyAgICBnZXRQZXJNb2R1bGVQYXNzZXMoKS0+YWRkKGNyZWF0ZUJpdGNvZGVXcml0ZXJQYXNzKCpPUykpOwogICAgIGJyZWFrOwogCiAgIGNhc2UgQmFja2VuZF9FbWl0TEw6CiAgICAgRm9ybWF0dGVkT1Muc2V0U3RyZWFtKCpPUywgZm9ybWF0dGVkX3Jhd19vc3RyZWFtOjpQUkVTRVJWRV9TVFJFQU0pOwotICAgIGdldFBlck1vZHVsZVBhc3NlcyhUTSktPmFkZChjcmVhdGVQcmludE1vZHVsZVBhc3MoJkZvcm1hdHRlZE9TKSk7CisgICAgZ2V0UGVyTW9kdWxlUGFzc2VzKCktPmFkZChjcmVhdGVQcmludE1vZHVsZVBhc3MoRm9ybWF0dGVkT1MpKTsKICAgICBicmVhazsKIAogICBkZWZhdWx0OgogICAgIEZvcm1hdHRlZE9TLnNldFN0cmVhbSgqT1MsIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTo6UFJFU0VSVkVfU1RSRUFNKTsKLSAgICBpZiAoIUFkZEVtaXRQYXNzZXMoQWN0aW9uLCBGb3JtYXR0ZWRPUywgVE0pKQorICAgIGlmICghQWRkRW1pdFBhc3NlcyhBY3Rpb24sIEZvcm1hdHRlZE9TKSkKICAgICAgIHJldHVybjsKICAgfQogCkBAIC02MDcsMTAgKzYxNiwyMyBAQAogdm9pZCBjbGFuZzo6RW1pdEJhY2tlbmRPdXRwdXQoRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbk9wdGlvbnMgJkNHT3B0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYW5nOjpUYXJnZXRPcHRpb25zICZUT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2tlbmRBY3Rpb24gQWN0aW9uLCByYXdfb3N0cmVhbSAqT1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMT3B0cywgU3RyaW5nUmVmIFREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICpNLCBCYWNrZW5kQWN0aW9uIEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICpPUykgewogICBFbWl0QXNzZW1ibHlIZWxwZXIgQXNtSGVscGVyKERpYWdzLCBDR09wdHMsIFRPcHRzLCBMT3B0cywgTSk7CiAKICAgQXNtSGVscGVyLkVtaXRBc3NlbWJseShBY3Rpb24sIE9TKTsKKworICAvLyBJZiBhbiBvcHRpb25hbCBjbGFuZyBUYXJnZXRJbmZvIGRlc2NyaXB0aW9uIHN0cmluZyB3YXMgcGFzc2VkIGluLCB1c2UgaXQgdG8KKyAgLy8gdmVyaWZ5IHRoZSBMTFZNIFRhcmdldE1hY2hpbmUncyBEYXRhTGF5b3V0LgorICBpZiAoQXNtSGVscGVyLlRNICYmICFURGVzYy5lbXB0eSgpKSB7CisgICAgc3RkOjpzdHJpbmcgRExEZXNjID0KKyAgICAgICAgQXNtSGVscGVyLlRNLT5nZXREYXRhTGF5b3V0KCktPmdldFN0cmluZ1JlcHJlc2VudGF0aW9uKCk7CisgICAgaWYgKERMRGVzYyAhPSBURGVzYykgeworICAgICAgdW5zaWduZWQgRGlhZ0lEID0gRGlhZ3MuZ2V0Q3VzdG9tRGlhZ0lEKAorICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpFcnJvciwgImJhY2tlbmQgZGF0YSBsYXlvdXQgJyUwJyBkb2VzIG5vdCBtYXRjaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgdGFyZ2V0IGRlc2NyaXB0aW9uICclMSciKTsKKyAgICAgIERpYWdzLlJlcG9ydChEaWFnSUQpIDw8IERMRGVzYyA8PCBURGVzYzsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHQXRvbWljLmNwcCBiL2xpYi9Db2RlR2VuL0NHQXRvbWljLmNwcAppbmRleCAwZGYyYTQwLi43YzdjODBjIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0F0b21pYy5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ0dBdG9taWMuY3BwCkBAIC0yNCwxNiArMjQsNiBAQAogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIENvZGVHZW47CiAKLS8vIFRoZSBBQkkgdmFsdWVzIGZvciB2YXJpb3VzIGF0b21pYyBtZW1vcnkgb3JkZXJpbmdzLgotZW51bSBBdG9taWNPcmRlcmluZ0tpbmQgewotICBBT19BQklfbWVtb3J5X29yZGVyX3JlbGF4ZWQgPSAwLAotICBBT19BQklfbWVtb3J5X29yZGVyX2NvbnN1bWUgPSAxLAotICBBT19BQklfbWVtb3J5X29yZGVyX2FjcXVpcmUgPSAyLAotICBBT19BQklfbWVtb3J5X29yZGVyX3JlbGVhc2UgPSAzLAotICBBT19BQklfbWVtb3J5X29yZGVyX2FjcV9yZWwgPSA0LAotICBBT19BQklfbWVtb3J5X29yZGVyX3NlcV9jc3QgPSA1Ci19OwotCiBuYW1lc3BhY2UgewogICBjbGFzcyBBdG9taWNJbmZvIHsKICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRjsKQEAgLTU3LDEwICs0NywxMCBAQAogICAgICAgQVNUQ29udGV4dCAmQyA9IENHRi5nZXRDb250ZXh0KCk7CiAKICAgICAgIHVpbnQ2NF90IHZhbHVlQWxpZ25JbkJpdHM7Ci0gICAgICBsbHZtOjp0aWUoVmFsdWVTaXplSW5CaXRzLCB2YWx1ZUFsaWduSW5CaXRzKSA9IEMuZ2V0VHlwZUluZm8oVmFsdWVUeSk7CisgICAgICBzdGQ6OnRpZShWYWx1ZVNpemVJbkJpdHMsIHZhbHVlQWxpZ25JbkJpdHMpID0gQy5nZXRUeXBlSW5mbyhWYWx1ZVR5KTsKIAogICAgICAgdWludDY0X3QgYXRvbWljQWxpZ25JbkJpdHM7Ci0gICAgICBsbHZtOjp0aWUoQXRvbWljU2l6ZUluQml0cywgYXRvbWljQWxpZ25JbkJpdHMpID0gQy5nZXRUeXBlSW5mbyhBdG9taWNUeSk7CisgICAgICBzdGQ6OnRpZShBdG9taWNTaXplSW5CaXRzLCBhdG9taWNBbGlnbkluQml0cykgPSBDLmdldFR5cGVJbmZvKEF0b21pY1R5KTsKIAogICAgICAgYXNzZXJ0KFZhbHVlU2l6ZUluQml0cyA8PSBBdG9taWNTaXplSW5CaXRzKTsKICAgICAgIGFzc2VydCh2YWx1ZUFsaWduSW5CaXRzIDw9IGF0b21pY0FsaWduSW5CaXRzKTsKQEAgLTE4NCwxMCArMTc0LDEzNCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQKLUVtaXRBdG9taWNPcChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgQXRvbWljRXhwciAqRSwgbGx2bTo6VmFsdWUgKkRlc3QsCi0gICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlB0ciwgbGx2bTo6VmFsdWUgKlZhbDEsIGxsdm06OlZhbHVlICpWYWwyLAotICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEFsaWduLCBsbHZtOjpBdG9taWNPcmRlcmluZyBPcmRlcikgeworc3RhdGljIHZvaWQgZW1pdEF0b21pY0NtcFhjaGcoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEF0b21pY0V4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqRGVzdCwgbGx2bTo6VmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpWYWwxLCBsbHZtOjpWYWx1ZSAqVmFsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXRvbWljT3JkZXJpbmcgU3VjY2Vzc09yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXRvbWljT3JkZXJpbmcgRmFpbHVyZU9yZGVyKSB7CisgIC8vIE5vdGUgdGhhdCBjbXB4Y2hnIGRvZXNuJ3Qgc3VwcG9ydCB3ZWFrIGNtcHhjaGcsIGF0IGxlYXN0IGF0IHRoZSBtb21lbnQuCisgIGxsdm06OkxvYWRJbnN0ICpFeHBlY3RlZCA9IENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQoVmFsMSk7CisgIEV4cGVjdGVkLT5zZXRBbGlnbm1lbnQoQWxpZ24pOworICBsbHZtOjpMb2FkSW5zdCAqRGVzaXJlZCA9IENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQoVmFsMik7CisgIERlc2lyZWQtPnNldEFsaWdubWVudChBbGlnbik7CisKKyAgbGx2bTo6QXRvbWljQ21wWGNoZ0luc3QgKk9sZCA9IENHRi5CdWlsZGVyLkNyZWF0ZUF0b21pY0NtcFhjaGcoCisgICAgICBQdHIsIEV4cGVjdGVkLCBEZXNpcmVkLCBTdWNjZXNzT3JkZXIsIEZhaWx1cmVPcmRlcik7CisgIE9sZC0+c2V0Vm9sYXRpbGUoRS0+aXNWb2xhdGlsZSgpKTsKKworICAvLyBDbXAgaG9sZHMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyZS1leGNoYW5nZSBvcGVyYXRpb246IHRydWUgb24gc3VjY2VzcywKKyAgLy8gZmFsc2Ugb24gZmFpbHVyZS4KKyAgbGx2bTo6VmFsdWUgKkNtcCA9IENHRi5CdWlsZGVyLkNyZWF0ZUlDbXBFUShPbGQsIEV4cGVjdGVkKTsKKworICAvLyBUaGlzIGJhc2ljIGJsb2NrIGlzIHVzZWQgdG8gaG9sZCB0aGUgc3RvcmUgaW5zdHJ1Y3Rpb24gaWYgdGhlIG9wZXJhdGlvbgorICAvLyBmYWlsZWQuCisgIGxsdm06OkJhc2ljQmxvY2sgKlN0b3JlRXhwZWN0ZWRCQiA9CisgICAgICBDR0YuY3JlYXRlQmFzaWNCbG9jaygiY21weGNoZy5zdG9yZV9leHBlY3RlZCIsIENHRi5DdXJGbik7CisKKyAgLy8gVGhpcyBiYXNpYyBibG9jayBpcyB0aGUgZXhpdCBwb2ludCBvZiB0aGUgb3BlcmF0aW9uLCB3ZSBzaG91bGQgZW5kIHVwCisgIC8vIGhlcmUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZC4KKyAgbGx2bTo6QmFzaWNCbG9jayAqQ29udGludWVCQiA9CisgICAgICBDR0YuY3JlYXRlQmFzaWNCbG9jaygiY21weGNoZy5jb250aW51ZSIsIENHRi5DdXJGbik7CisKKyAgLy8gVXBkYXRlIEV4cGVjdGVkIGlmIEV4cGVjdGVkIGlzbid0IGVxdWFsIHRvIE9sZCwgb3RoZXJ3aXNlIGJyYW5jaCB0byB0aGUKKyAgLy8gZXhpdCBwb2ludC4KKyAgQ0dGLkJ1aWxkZXIuQ3JlYXRlQ29uZEJyKENtcCwgQ29udGludWVCQiwgU3RvcmVFeHBlY3RlZEJCKTsKKworICBDR0YuQnVpbGRlci5TZXRJbnNlcnRQb2ludChTdG9yZUV4cGVjdGVkQkIpOworICAvLyBVcGRhdGUgdGhlIG1lbW9yeSBhdCBFeHBlY3RlZCB3aXRoIE9sZCdzIHZhbHVlLgorICBsbHZtOjpTdG9yZUluc3QgKlN0b3JlRXhwZWN0ZWQgPSBDR0YuQnVpbGRlci5DcmVhdGVTdG9yZShPbGQsIFZhbDEpOworICBTdG9yZUV4cGVjdGVkLT5zZXRBbGlnbm1lbnQoQWxpZ24pOworICAvLyBGaW5hbGx5LCBicmFuY2ggdG8gdGhlIGV4aXQgcG9pbnQuCisgIENHRi5CdWlsZGVyLkNyZWF0ZUJyKENvbnRpbnVlQkIpOworCisgIENHRi5CdWlsZGVyLlNldEluc2VydFBvaW50KENvbnRpbnVlQkIpOworICAvLyBVcGRhdGUgdGhlIG1lbW9yeSBhdCBEZXN0IHdpdGggQ21wJ3MgdmFsdWUuCisgIENHRi5FbWl0U3RvcmVPZlNjYWxhcihDbXAsIENHRi5NYWtlQWRkckxWYWx1ZShEZXN0LCBFLT5nZXRUeXBlKCkpKTsKKyAgcmV0dXJuOworfQorCisvLy8gR2l2ZW4gYW4gb3JkZXJpbmcgcmVxdWlyZWQgb24gc3VjY2VzcywgZW1pdCBhbGwgcG9zc2libGUgY21weGNoZworLy8vIGluc3RydWN0aW9ucyB0byBjb3BlIHdpdGggdGhlIHByb3ZpZGVkIChidXQgcG9zc2libHkgb25seSBkeW5hbWljYWxseSBrbm93bikKKy8vLyBGYWlsdXJlT3JkZXIuCitzdGF0aWMgdm9pZCBlbWl0QXRvbWljQ21wWGNoZ0ZhaWx1cmVTZXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEF0b21pY0V4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkRlc3QsIGxsdm06OlZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlZhbDEsIGxsdm06OlZhbHVlICpWYWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpGYWlsdXJlT3JkZXJWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXRvbWljT3JkZXJpbmcgU3VjY2Vzc09yZGVyKSB7CisgIGxsdm06OkF0b21pY09yZGVyaW5nIEZhaWx1cmVPcmRlcjsKKyAgaWYgKGxsdm06OkNvbnN0YW50SW50ICpGTyA9IGR5bl9jYXN0PGxsdm06OkNvbnN0YW50SW50PihGYWlsdXJlT3JkZXJWYWwpKSB7CisgICAgc3dpdGNoIChGTy0+Z2V0U0V4dFZhbHVlKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgRmFpbHVyZU9yZGVyID0gbGx2bTo6TW9ub3RvbmljOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBdG9taWNFeHByOjpBT19BQklfbWVtb3J5X29yZGVyX2NvbnN1bWU6CisgICAgY2FzZSBBdG9taWNFeHByOjpBT19BQklfbWVtb3J5X29yZGVyX2FjcXVpcmU6CisgICAgICBGYWlsdXJlT3JkZXIgPSBsbHZtOjpBY3F1aXJlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBdG9taWNFeHByOjpBT19BQklfbWVtb3J5X29yZGVyX3NlcV9jc3Q6CisgICAgICBGYWlsdXJlT3JkZXIgPSBsbHZtOjpTZXF1ZW50aWFsbHlDb25zaXN0ZW50OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChGYWlsdXJlT3JkZXIgPj0gU3VjY2Vzc09yZGVyKSB7CisgICAgICAvLyBEb24ndCBhc3NlcnQgb24gdW5kZWZpbmVkIGJlaGF2aW91ci4KKyAgICAgIEZhaWx1cmVPcmRlciA9CisgICAgICAgIGxsdm06OkF0b21pY0NtcFhjaGdJbnN0OjpnZXRTdHJvbmdlc3RGYWlsdXJlT3JkZXJpbmcoU3VjY2Vzc09yZGVyKTsKKyAgICB9CisgICAgZW1pdEF0b21pY0NtcFhjaGcoQ0dGLCBFLCBEZXN0LCBQdHIsIFZhbDEsIFZhbDIsIFNpemUsIEFsaWduLCBTdWNjZXNzT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgRmFpbHVyZU9yZGVyKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBDcmVhdGUgYWxsIHRoZSByZWxldmFudCBCQidzCisgIGxsdm06OkJhc2ljQmxvY2sgKk1vbm90b25pY0JCID0gMCwgKkFjcXVpcmVCQiA9IDAsICpTZXFDc3RCQiA9IDA7CisgIE1vbm90b25pY0JCID0gQ0dGLmNyZWF0ZUJhc2ljQmxvY2soIm1vbm90b25pY19mYWlsIiwgQ0dGLkN1ckZuKTsKKyAgaWYgKFN1Y2Nlc3NPcmRlciAhPSBsbHZtOjpNb25vdG9uaWMgJiYgU3VjY2Vzc09yZGVyICE9IGxsdm06OlJlbGVhc2UpCisgICAgQWNxdWlyZUJCID0gQ0dGLmNyZWF0ZUJhc2ljQmxvY2soImFjcXVpcmVfZmFpbCIsIENHRi5DdXJGbik7CisgIGlmIChTdWNjZXNzT3JkZXIgPT0gbGx2bTo6U2VxdWVudGlhbGx5Q29uc2lzdGVudCkKKyAgICBTZXFDc3RCQiA9IENHRi5jcmVhdGVCYXNpY0Jsb2NrKCJzZXFjc3RfZmFpbCIsIENHRi5DdXJGbik7CisKKyAgbGx2bTo6QmFzaWNCbG9jayAqQ29udEJCID0gQ0dGLmNyZWF0ZUJhc2ljQmxvY2soImF0b21pYy5jb250aW51ZSIsIENHRi5DdXJGbik7CisKKyAgbGx2bTo6U3dpdGNoSW5zdCAqU0kgPSBDR0YuQnVpbGRlci5DcmVhdGVTd2l0Y2goRmFpbHVyZU9yZGVyVmFsLCBNb25vdG9uaWNCQik7CisKKyAgLy8gRW1pdCBhbGwgdGhlIGRpZmZlcmVudCBhdG9taWNzCisKKyAgLy8gTW9ub3RvbmljQkIgaXMgYXJiaXRyYXJpbHkgY2hvc2VuIGFzIHRoZSBkZWZhdWx0IGNhc2U7IGluIHByYWN0aWNlLCB0aGlzCisgIC8vIGRvZXNuJ3QgbWF0dGVyIHVubGVzcyBzb21lb25lIGlzIGNyYXp5IGVub3VnaCB0byB1c2Ugc29tZXRoaW5nIHRoYXQKKyAgLy8gZG9lc24ndCBmb2xkIHRvIGEgY29uc3RhbnQgZm9yIHRoZSBvcmRlcmluZy4KKyAgQ0dGLkJ1aWxkZXIuU2V0SW5zZXJ0UG9pbnQoTW9ub3RvbmljQkIpOworICBlbWl0QXRvbWljQ21wWGNoZyhDR0YsIEUsIERlc3QsIFB0ciwgVmFsMSwgVmFsMiwKKyAgICAgICAgICAgICAgICAgICAgU2l6ZSwgQWxpZ24sIFN1Y2Nlc3NPcmRlciwgbGx2bTo6TW9ub3RvbmljKTsKKyAgQ0dGLkJ1aWxkZXIuQ3JlYXRlQnIoQ29udEJCKTsKKworICBpZiAoQWNxdWlyZUJCKSB7CisgICAgQ0dGLkJ1aWxkZXIuU2V0SW5zZXJ0UG9pbnQoQWNxdWlyZUJCKTsKKyAgICBlbWl0QXRvbWljQ21wWGNoZyhDR0YsIEUsIERlc3QsIFB0ciwgVmFsMSwgVmFsMiwKKyAgICAgICAgICAgICAgICAgICAgICBTaXplLCBBbGlnbiwgU3VjY2Vzc09yZGVyLCBsbHZtOjpBY3F1aXJlKTsKKyAgICBDR0YuQnVpbGRlci5DcmVhdGVCcihDb250QkIpOworICAgIFNJLT5hZGRDYXNlKENHRi5CdWlsZGVyLmdldEludDMyKEF0b21pY0V4cHI6OkFPX0FCSV9tZW1vcnlfb3JkZXJfY29uc3VtZSksCisgICAgICAgICAgICAgICAgQWNxdWlyZUJCKTsKKyAgICBTSS0+YWRkQ2FzZShDR0YuQnVpbGRlci5nZXRJbnQzMihBdG9taWNFeHByOjpBT19BQklfbWVtb3J5X29yZGVyX2FjcXVpcmUpLAorICAgICAgICAgICAgICAgIEFjcXVpcmVCQik7CisgIH0KKyAgaWYgKFNlcUNzdEJCKSB7CisgICAgQ0dGLkJ1aWxkZXIuU2V0SW5zZXJ0UG9pbnQoU2VxQ3N0QkIpOworICAgIGVtaXRBdG9taWNDbXBYY2hnKENHRiwgRSwgRGVzdCwgUHRyLCBWYWwxLCBWYWwyLAorICAgICAgICAgICAgICAgICAgICAgIFNpemUsIEFsaWduLCBTdWNjZXNzT3JkZXIsIGxsdm06OlNlcXVlbnRpYWxseUNvbnNpc3RlbnQpOworICAgIENHRi5CdWlsZGVyLkNyZWF0ZUJyKENvbnRCQik7CisgICAgU0ktPmFkZENhc2UoQ0dGLkJ1aWxkZXIuZ2V0SW50MzIoQXRvbWljRXhwcjo6QU9fQUJJX21lbW9yeV9vcmRlcl9zZXFfY3N0KSwKKyAgICAgICAgICAgICAgICBTZXFDc3RCQik7CisgIH0KKworICBDR0YuQnVpbGRlci5TZXRJbnNlcnRQb2ludChDb250QkIpOworfQorCitzdGF0aWMgdm9pZCBFbWl0QXRvbWljT3AoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEF0b21pY0V4cHIgKkUsIGxsdm06OlZhbHVlICpEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpQdHIsIGxsdm06OlZhbHVlICpWYWwxLCBsbHZtOjpWYWx1ZSAqVmFsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqRmFpbHVyZU9yZGVyLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBsbHZtOjpBdG9taWNPcmRlcmluZyBPcmRlcikgewogICBsbHZtOjpBdG9taWNSTVdJbnN0OjpCaW5PcCBPcCA9IGxsdm06OkF0b21pY1JNV0luc3Q6OkFkZDsKICAgbGx2bTo6SW5zdHJ1Y3Rpb246OkJpbmFyeU9wcyBQb3N0T3AgPSAobGx2bTo6SW5zdHJ1Y3Rpb246OkJpbmFyeU9wcykwOwogCkBAIC0xOTgsMjMgKzMxMiwxMCBAQAogICBjYXNlIEF0b21pY0V4cHI6OkFPX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nOgogICBjYXNlIEF0b21pY0V4cHI6OkFPX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhazoKICAgY2FzZSBBdG9taWNFeHByOjpBT19fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2U6Ci0gIGNhc2UgQXRvbWljRXhwcjo6QU9fX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX246IHsKLSAgICAvLyBOb3RlIHRoYXQgY21weGNoZyBvbmx5IHN1cHBvcnRzIHNwZWNpZnlpbmcgb25lIG9yZGVyaW5nIGFuZAotICAgIC8vIGRvZXNuJ3Qgc3VwcG9ydCB3ZWFrIGNtcHhjaGcsIGF0IGxlYXN0IGF0IHRoZSBtb21lbnQuCi0gICAgbGx2bTo6TG9hZEluc3QgKkxvYWRWYWwxID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlTG9hZChWYWwxKTsKLSAgICBMb2FkVmFsMS0+c2V0QWxpZ25tZW50KEFsaWduKTsKLSAgICBsbHZtOjpMb2FkSW5zdCAqTG9hZFZhbDIgPSBDR0YuQnVpbGRlci5DcmVhdGVMb2FkKFZhbDIpOwotICAgIExvYWRWYWwyLT5zZXRBbGlnbm1lbnQoQWxpZ24pOwotICAgIGxsdm06OkF0b21pY0NtcFhjaGdJbnN0ICpDWEkgPQotICAgICAgICBDR0YuQnVpbGRlci5DcmVhdGVBdG9taWNDbXBYY2hnKFB0ciwgTG9hZFZhbDEsIExvYWRWYWwyLCBPcmRlcik7Ci0gICAgQ1hJLT5zZXRWb2xhdGlsZShFLT5pc1ZvbGF0aWxlKCkpOwotICAgIGxsdm06OlN0b3JlSW5zdCAqU3RvcmVWYWwxID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlU3RvcmUoQ1hJLCBWYWwxKTsKLSAgICBTdG9yZVZhbDEtPnNldEFsaWdubWVudChBbGlnbik7Ci0gICAgbGx2bTo6VmFsdWUgKkNtcCA9IENHRi5CdWlsZGVyLkNyZWF0ZUlDbXBFUShDWEksIExvYWRWYWwxKTsKLSAgICBDR0YuRW1pdFN0b3JlT2ZTY2FsYXIoQ21wLCBDR0YuTWFrZUFkZHJMVmFsdWUoRGVzdCwgRS0+Z2V0VHlwZSgpKSk7CisgIGNhc2UgQXRvbWljRXhwcjo6QU9fX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX246CisgICAgZW1pdEF0b21pY0NtcFhjaGdGYWlsdXJlU2V0KENHRiwgRSwgRGVzdCwgUHRyLCBWYWwxLCBWYWwyLCBGYWlsdXJlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUsIEFsaWduLCBPcmRlcik7CiAgICAgcmV0dXJuOwotICB9Ci0KICAgY2FzZSBBdG9taWNFeHByOjpBT19fYzExX2F0b21pY19sb2FkOgogICBjYXNlIEF0b21pY0V4cHI6OkFPX19hdG9taWNfbG9hZF9uOgogICBjYXNlIEF0b21pY0V4cHI6OkFPX19hdG9taWNfbG9hZDogewpAQCAtNDc2LDYgKzU3Nyw4IEBACiAgICAgQXJncy5hZGQoUlZhbHVlOjpnZXQoRW1pdENhc3RUb1ZvaWRQdHIoUHRyKSksIGdldENvbnRleHQoKS5Wb2lkUHRyVHkpOwogCiAgICAgc3RkOjpzdHJpbmcgTGliQ2FsbE5hbWU7CisgICAgUXVhbFR5cGUgTG93ZXJlZE1lbVR5ID0KKyAgICAgIE1lbVR5LT5pc1BvaW50ZXJUeXBlKCkgPyBnZXRDb250ZXh0KCkuZ2V0SW50UHRyVHlwZSgpIDogTWVtVHk7CiAgICAgUXVhbFR5cGUgUmV0VHk7CiAgICAgYm9vbCBIYXZlUmV0VHkgPSBmYWxzZTsKICAgICBzd2l0Y2ggKEUtPmdldE9wKCkpIHsKQEAgLTUzMSw3ICs2MzQsNyBAQAogICAgIGNhc2UgQXRvbWljRXhwcjo6QU9fX2MxMV9hdG9taWNfZmV0Y2hfYWRkOgogICAgIGNhc2UgQXRvbWljRXhwcjo6QU9fX2F0b21pY19mZXRjaF9hZGQ6CiAgICAgICBMaWJDYWxsTmFtZSA9ICJfX2F0b21pY19mZXRjaF9hZGQiOwotICAgICAgQWRkRGlyZWN0QXJndW1lbnQoKnRoaXMsIEFyZ3MsIFVzZU9wdGltaXplZExpYmNhbGwsIFZhbDEsIE1lbVR5LAorICAgICAgQWRkRGlyZWN0QXJndW1lbnQoKnRoaXMsIEFyZ3MsIFVzZU9wdGltaXplZExpYmNhbGwsIFZhbDEsIExvd2VyZWRNZW1UeSwKICAgICAgICAgICAgICAgICAgICAgICAgIEUtPmdldEV4cHJMb2MoKSk7CiAgICAgICBicmVhazsKICAgICAvLyBUIF9fYXRvbWljX2ZldGNoX2FuZF9OKFQgKm1lbSwgVCB2YWwsIGludCBvcmRlcikKQEAgLTU1Miw3ICs2NTUsNyBAQAogICAgIGNhc2UgQXRvbWljRXhwcjo6QU9fX2MxMV9hdG9taWNfZmV0Y2hfc3ViOgogICAgIGNhc2UgQXRvbWljRXhwcjo6QU9fX2F0b21pY19mZXRjaF9zdWI6CiAgICAgICBMaWJDYWxsTmFtZSA9ICJfX2F0b21pY19mZXRjaF9zdWIiOwotICAgICAgQWRkRGlyZWN0QXJndW1lbnQoKnRoaXMsIEFyZ3MsIFVzZU9wdGltaXplZExpYmNhbGwsIFZhbDEsIE1lbVR5LAorICAgICAgQWRkRGlyZWN0QXJndW1lbnQoKnRoaXMsIEFyZ3MsIFVzZU9wdGltaXplZExpYmNhbGwsIFZhbDEsIExvd2VyZWRNZW1UeSwKICAgICAgICAgICAgICAgICAgICAgICAgIEUtPmdldEV4cHJMb2MoKSk7CiAgICAgICBicmVhazsKICAgICAvLyBUIF9fYXRvbWljX2ZldGNoX3hvcl9OKFQgKm1lbSwgVCB2YWwsIGludCBvcmRlcikKQEAgLTYxNSwzMiArNzE4LDMyIEBACiAgIGlmIChpc2E8bGx2bTo6Q29uc3RhbnRJbnQ+KE9yZGVyKSkgewogICAgIGludCBvcmQgPSBjYXN0PGxsdm06OkNvbnN0YW50SW50PihPcmRlciktPmdldFpFeHRWYWx1ZSgpOwogICAgIHN3aXRjaCAob3JkKSB7Ci0gICAgY2FzZSBBT19BQklfbWVtb3J5X29yZGVyX3JlbGF4ZWQ6Ci0gICAgICBFbWl0QXRvbWljT3AoKnRoaXMsIEUsIERlc3QsIFB0ciwgVmFsMSwgVmFsMiwgU2l6ZSwgQWxpZ24sCi0gICAgICAgICAgICAgICAgICAgbGx2bTo6TW9ub3RvbmljKTsKKyAgICBjYXNlIEF0b21pY0V4cHI6OkFPX0FCSV9tZW1vcnlfb3JkZXJfcmVsYXhlZDoKKyAgICAgIEVtaXRBdG9taWNPcCgqdGhpcywgRSwgRGVzdCwgUHRyLCBWYWwxLCBWYWwyLCBPcmRlckZhaWwsCisgICAgICAgICAgICAgICAgICAgU2l6ZSwgQWxpZ24sIGxsdm06Ok1vbm90b25pYyk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEFPX0FCSV9tZW1vcnlfb3JkZXJfY29uc3VtZToKLSAgICBjYXNlIEFPX0FCSV9tZW1vcnlfb3JkZXJfYWNxdWlyZToKKyAgICBjYXNlIEF0b21pY0V4cHI6OkFPX0FCSV9tZW1vcnlfb3JkZXJfY29uc3VtZToKKyAgICBjYXNlIEF0b21pY0V4cHI6OkFPX0FCSV9tZW1vcnlfb3JkZXJfYWNxdWlyZToKICAgICAgIGlmIChJc1N0b3JlKQogICAgICAgICBicmVhazsgLy8gQXZvaWQgY3Jhc2hpbmcgb24gY29kZSB3aXRoIHVuZGVmaW5lZCBiZWhhdmlvcgotICAgICAgRW1pdEF0b21pY09wKCp0aGlzLCBFLCBEZXN0LCBQdHIsIFZhbDEsIFZhbDIsIFNpemUsIEFsaWduLAotICAgICAgICAgICAgICAgICAgIGxsdm06OkFjcXVpcmUpOworICAgICAgRW1pdEF0b21pY09wKCp0aGlzLCBFLCBEZXN0LCBQdHIsIFZhbDEsIFZhbDIsIE9yZGVyRmFpbCwKKyAgICAgICAgICAgICAgICAgICBTaXplLCBBbGlnbiwgbGx2bTo6QWNxdWlyZSk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEFPX0FCSV9tZW1vcnlfb3JkZXJfcmVsZWFzZToKKyAgICBjYXNlIEF0b21pY0V4cHI6OkFPX0FCSV9tZW1vcnlfb3JkZXJfcmVsZWFzZToKICAgICAgIGlmIChJc0xvYWQpCiAgICAgICAgIGJyZWFrOyAvLyBBdm9pZCBjcmFzaGluZyBvbiBjb2RlIHdpdGggdW5kZWZpbmVkIGJlaGF2aW9yCi0gICAgICBFbWl0QXRvbWljT3AoKnRoaXMsIEUsIERlc3QsIFB0ciwgVmFsMSwgVmFsMiwgU2l6ZSwgQWxpZ24sCi0gICAgICAgICAgICAgICAgICAgbGx2bTo6UmVsZWFzZSk7CisgICAgICBFbWl0QXRvbWljT3AoKnRoaXMsIEUsIERlc3QsIFB0ciwgVmFsMSwgVmFsMiwgT3JkZXJGYWlsLAorICAgICAgICAgICAgICAgICAgIFNpemUsIEFsaWduLCBsbHZtOjpSZWxlYXNlKTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgQU9fQUJJX21lbW9yeV9vcmRlcl9hY3FfcmVsOgorICAgIGNhc2UgQXRvbWljRXhwcjo6QU9fQUJJX21lbW9yeV9vcmRlcl9hY3FfcmVsOgogICAgICAgaWYgKElzTG9hZCB8fCBJc1N0b3JlKQogICAgICAgICBicmVhazsgLy8gQXZvaWQgY3Jhc2hpbmcgb24gY29kZSB3aXRoIHVuZGVmaW5lZCBiZWhhdmlvcgotICAgICAgRW1pdEF0b21pY09wKCp0aGlzLCBFLCBEZXN0LCBQdHIsIFZhbDEsIFZhbDIsIFNpemUsIEFsaWduLAotICAgICAgICAgICAgICAgICAgIGxsdm06OkFjcXVpcmVSZWxlYXNlKTsKKyAgICAgIEVtaXRBdG9taWNPcCgqdGhpcywgRSwgRGVzdCwgUHRyLCBWYWwxLCBWYWwyLCBPcmRlckZhaWwsCisgICAgICAgICAgICAgICAgICAgU2l6ZSwgQWxpZ24sIGxsdm06OkFjcXVpcmVSZWxlYXNlKTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgQU9fQUJJX21lbW9yeV9vcmRlcl9zZXFfY3N0OgotICAgICAgRW1pdEF0b21pY09wKCp0aGlzLCBFLCBEZXN0LCBQdHIsIFZhbDEsIFZhbDIsIFNpemUsIEFsaWduLAotICAgICAgICAgICAgICAgICAgIGxsdm06OlNlcXVlbnRpYWxseUNvbnNpc3RlbnQpOworICAgIGNhc2UgQXRvbWljRXhwcjo6QU9fQUJJX21lbW9yeV9vcmRlcl9zZXFfY3N0OgorICAgICAgRW1pdEF0b21pY09wKCp0aGlzLCBFLCBEZXN0LCBQdHIsIFZhbDEsIFZhbDIsIE9yZGVyRmFpbCwKKyAgICAgICAgICAgICAgICAgICBTaXplLCBBbGlnbiwgbGx2bTo6U2VxdWVudGlhbGx5Q29uc2lzdGVudCk7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OiAvLyBpbnZhbGlkIG9yZGVyCiAgICAgICAvLyBXZSBzaG91bGQgbm90IGV2ZXIgZ2V0IGhlcmUgbm9ybWFsbHksIGJ1dCBpdCdzIGhhcmQgdG8KQEAgLTY3NiwzNiArNzc5LDQxIEBACiAKICAgLy8gRW1pdCBhbGwgdGhlIGRpZmZlcmVudCBhdG9taWNzCiAgIEJ1aWxkZXIuU2V0SW5zZXJ0UG9pbnQoTW9ub3RvbmljQkIpOwotICBFbWl0QXRvbWljT3AoKnRoaXMsIEUsIERlc3QsIFB0ciwgVmFsMSwgVmFsMiwgU2l6ZSwgQWxpZ24sCi0gICAgICAgICAgICAgICBsbHZtOjpNb25vdG9uaWMpOworICBFbWl0QXRvbWljT3AoKnRoaXMsIEUsIERlc3QsIFB0ciwgVmFsMSwgVmFsMiwgT3JkZXJGYWlsLAorICAgICAgICAgICAgICAgU2l6ZSwgQWxpZ24sIGxsdm06Ok1vbm90b25pYyk7CiAgIEJ1aWxkZXIuQ3JlYXRlQnIoQ29udEJCKTsKICAgaWYgKCFJc1N0b3JlKSB7CiAgICAgQnVpbGRlci5TZXRJbnNlcnRQb2ludChBY3F1aXJlQkIpOwotICAgIEVtaXRBdG9taWNPcCgqdGhpcywgRSwgRGVzdCwgUHRyLCBWYWwxLCBWYWwyLCBTaXplLCBBbGlnbiwKLSAgICAgICAgICAgICAgICAgbGx2bTo6QWNxdWlyZSk7CisgICAgRW1pdEF0b21pY09wKCp0aGlzLCBFLCBEZXN0LCBQdHIsIFZhbDEsIFZhbDIsIE9yZGVyRmFpbCwKKyAgICAgICAgICAgICAgICAgU2l6ZSwgQWxpZ24sIGxsdm06OkFjcXVpcmUpOwogICAgIEJ1aWxkZXIuQ3JlYXRlQnIoQ29udEJCKTsKLSAgICBTSS0+YWRkQ2FzZShCdWlsZGVyLmdldEludDMyKDEpLCBBY3F1aXJlQkIpOwotICAgIFNJLT5hZGRDYXNlKEJ1aWxkZXIuZ2V0SW50MzIoMiksIEFjcXVpcmVCQik7CisgICAgU0ktPmFkZENhc2UoQnVpbGRlci5nZXRJbnQzMihBdG9taWNFeHByOjpBT19BQklfbWVtb3J5X29yZGVyX2NvbnN1bWUpLAorICAgICAgICAgICAgICAgIEFjcXVpcmVCQik7CisgICAgU0ktPmFkZENhc2UoQnVpbGRlci5nZXRJbnQzMihBdG9taWNFeHByOjpBT19BQklfbWVtb3J5X29yZGVyX2FjcXVpcmUpLAorICAgICAgICAgICAgICAgIEFjcXVpcmVCQik7CiAgIH0KICAgaWYgKCFJc0xvYWQpIHsKICAgICBCdWlsZGVyLlNldEluc2VydFBvaW50KFJlbGVhc2VCQik7Ci0gICAgRW1pdEF0b21pY09wKCp0aGlzLCBFLCBEZXN0LCBQdHIsIFZhbDEsIFZhbDIsIFNpemUsIEFsaWduLAotICAgICAgICAgICAgICAgICBsbHZtOjpSZWxlYXNlKTsKKyAgICBFbWl0QXRvbWljT3AoKnRoaXMsIEUsIERlc3QsIFB0ciwgVmFsMSwgVmFsMiwgT3JkZXJGYWlsLAorICAgICAgICAgICAgICAgICBTaXplLCBBbGlnbiwgbGx2bTo6UmVsZWFzZSk7CiAgICAgQnVpbGRlci5DcmVhdGVCcihDb250QkIpOwotICAgIFNJLT5hZGRDYXNlKEJ1aWxkZXIuZ2V0SW50MzIoMyksIFJlbGVhc2VCQik7CisgICAgU0ktPmFkZENhc2UoQnVpbGRlci5nZXRJbnQzMihBdG9taWNFeHByOjpBT19BQklfbWVtb3J5X29yZGVyX3JlbGVhc2UpLAorICAgICAgICAgICAgICAgIFJlbGVhc2VCQik7CiAgIH0KICAgaWYgKCFJc0xvYWQgJiYgIUlzU3RvcmUpIHsKICAgICBCdWlsZGVyLlNldEluc2VydFBvaW50KEFjcVJlbEJCKTsKLSAgICBFbWl0QXRvbWljT3AoKnRoaXMsIEUsIERlc3QsIFB0ciwgVmFsMSwgVmFsMiwgU2l6ZSwgQWxpZ24sCi0gICAgICAgICAgICAgICAgIGxsdm06OkFjcXVpcmVSZWxlYXNlKTsKKyAgICBFbWl0QXRvbWljT3AoKnRoaXMsIEUsIERlc3QsIFB0ciwgVmFsMSwgVmFsMiwgT3JkZXJGYWlsLAorICAgICAgICAgICAgICAgICBTaXplLCBBbGlnbiwgbGx2bTo6QWNxdWlyZVJlbGVhc2UpOwogICAgIEJ1aWxkZXIuQ3JlYXRlQnIoQ29udEJCKTsKLSAgICBTSS0+YWRkQ2FzZShCdWlsZGVyLmdldEludDMyKDQpLCBBY3FSZWxCQik7CisgICAgU0ktPmFkZENhc2UoQnVpbGRlci5nZXRJbnQzMihBdG9taWNFeHByOjpBT19BQklfbWVtb3J5X29yZGVyX2FjcV9yZWwpLAorICAgICAgICAgICAgICAgIEFjcVJlbEJCKTsKICAgfQogICBCdWlsZGVyLlNldEluc2VydFBvaW50KFNlcUNzdEJCKTsKLSAgRW1pdEF0b21pY09wKCp0aGlzLCBFLCBEZXN0LCBQdHIsIFZhbDEsIFZhbDIsIFNpemUsIEFsaWduLAotICAgICAgICAgICAgICAgbGx2bTo6U2VxdWVudGlhbGx5Q29uc2lzdGVudCk7CisgIEVtaXRBdG9taWNPcCgqdGhpcywgRSwgRGVzdCwgUHRyLCBWYWwxLCBWYWwyLCBPcmRlckZhaWwsCisgICAgICAgICAgICAgICBTaXplLCBBbGlnbiwgbGx2bTo6U2VxdWVudGlhbGx5Q29uc2lzdGVudCk7CiAgIEJ1aWxkZXIuQ3JlYXRlQnIoQ29udEJCKTsKLSAgU0ktPmFkZENhc2UoQnVpbGRlci5nZXRJbnQzMig1KSwgU2VxQ3N0QkIpOworICBTSS0+YWRkQ2FzZShCdWlsZGVyLmdldEludDMyKEF0b21pY0V4cHI6OkFPX0FCSV9tZW1vcnlfb3JkZXJfc2VxX2NzdCksCisgICAgICAgICAgICAgIFNlcUNzdEJCKTsKIAogICAvLyBDbGVhbnVwIGFuZCByZXR1cm4KICAgQnVpbGRlci5TZXRJbnNlcnRQb2ludChDb250QkIpOwpAQCAtNzYxLDggKzg2OSw4IEBACiAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLlZvaWRQdHJUeSk7CiAgICAgYXJncy5hZGQoUlZhbHVlOjpnZXQoRW1pdENhc3RUb1ZvaWRQdHIodGVtcEFkZHIpKSwKICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuVm9pZFB0clR5KTsKLSAgICBhcmdzLmFkZChSVmFsdWU6OmdldChsbHZtOjpDb25zdGFudEludDo6Z2V0KEludFR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU9fQUJJX21lbW9yeV9vcmRlcl9zZXFfY3N0KSksCisgICAgYXJncy5hZGQoUlZhbHVlOjpnZXQobGx2bTo6Q29uc3RhbnRJbnQ6OmdldCgKKyAgICAgICAgICAgICAgICAgSW50VHksIEF0b21pY0V4cHI6OkFPX0FCSV9tZW1vcnlfb3JkZXJfc2VxX2NzdCkpLAogICAgICAgICAgICAgIGdldENvbnRleHQoKS5JbnRUeSk7CiAgICAgZW1pdEF0b21pY0xpYmNhbGwoKnRoaXMsICJfX2F0b21pY19sb2FkIiwgZ2V0Q29udGV4dCgpLlZvaWRUeSwgYXJncyk7CiAKQEAgLTkxMSw4ICsxMDE5LDggQEAKICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuVm9pZFB0clR5KTsKICAgICBhcmdzLmFkZChSVmFsdWU6OmdldChFbWl0Q2FzdFRvVm9pZFB0cihzcmNBZGRyKSksCiAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLlZvaWRQdHJUeSk7Ci0gICAgYXJncy5hZGQoUlZhbHVlOjpnZXQobGx2bTo6Q29uc3RhbnRJbnQ6OmdldChJbnRUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFPX0FCSV9tZW1vcnlfb3JkZXJfc2VxX2NzdCkpLAorICAgIGFyZ3MuYWRkKFJWYWx1ZTo6Z2V0KGxsdm06OkNvbnN0YW50SW50OjpnZXQoCisgICAgICAgICAgICAgICAgIEludFR5LCBBdG9taWNFeHByOjpBT19BQklfbWVtb3J5X29yZGVyX3NlcV9jc3QpKSwKICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuSW50VHkpOwogICAgIGVtaXRBdG9taWNMaWJjYWxsKCp0aGlzLCAiX19hdG9taWNfc3RvcmUiLCBnZXRDb250ZXh0KCkuVm9pZFR5LCBhcmdzKTsKICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR0Jsb2Nrcy5jcHAgYi9saWIvQ29kZUdlbi9DR0Jsb2Nrcy5jcHAKaW5kZXggNjkyZjlhMC4uMTViMDhkNCAxMDA2NDQKLS0tIGEvbGliL0NvZGVHZW4vQ0dCbG9ja3MuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHQmxvY2tzLmNwcApAQCAtMTgsOSArMTgsOSBAQAogI2luY2x1ZGUgIkNvZGVHZW5Nb2R1bGUuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbE9iakMuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKICNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKICNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjc3RkaW8+CiAKQEAgLTUzLDcgKzUzLDcgQEAKICAgcmV0dXJuIENvZGVHZW5GdW5jdGlvbihDR00pLkdlbmVyYXRlQ29weUhlbHBlckZ1bmN0aW9uKGJsb2NrSW5mbyk7CiB9CiAKLS8vLyBCdWlsZCB0aGUgaGVscGVyIGZ1bmN0aW9uIHRvIGRpcG9zZSBvZiBhIGJsb2NrLgorLy8vIEJ1aWxkIHRoZSBoZWxwZXIgZnVuY3Rpb24gdG8gZGlzcG9zZSBvZiBhIGJsb2NrLgogc3RhdGljIGxsdm06OkNvbnN0YW50ICpidWlsZERpc3Bvc2VIZWxwZXIoQ29kZUdlbk1vZHVsZSAmQ0dNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0dCbG9ja0luZm8gJmJsb2NrSW5mbykgewogICByZXR1cm4gQ29kZUdlbkZ1bmN0aW9uKENHTSkuR2VuZXJhdGVEZXN0cm95SGVscGVyRnVuY3Rpb24oYmxvY2tJbmZvKTsKQEAgLTMwMCw4ICszMDAsOCBAQAogCiAgIC8vIFRoZSBoZWFkZXIgaXMgYmFzaWNhbGx5IGEgJ3N0cnVjdCB7IHZvaWQgKjsgaW50OyBpbnQ7IHZvaWQgKjsgdm9pZCAqOyB9Jy4KICAgQ2hhclVuaXRzIHB0clNpemUsIHB0ckFsaWduLCBpbnRTaXplLCBpbnRBbGlnbjsKLSAgbGx2bTo6dGllKHB0clNpemUsIHB0ckFsaWduKSA9IEMuZ2V0VHlwZUluZm9JbkNoYXJzKEMuVm9pZFB0clR5KTsKLSAgbGx2bTo6dGllKGludFNpemUsIGludEFsaWduKSA9IEMuZ2V0VHlwZUluZm9JbkNoYXJzKEMuSW50VHkpOworICBzdGQ6OnRpZShwdHJTaXplLCBwdHJBbGlnbikgPSBDLmdldFR5cGVJbmZvSW5DaGFycyhDLlZvaWRQdHJUeSk7CisgIHN0ZDo6dGllKGludFNpemUsIGludEFsaWduKSA9IEMuZ2V0VHlwZUluZm9JbkNoYXJzKEMuSW50VHkpOwogCiAgIC8vIEFyZSB0aGVyZSBjcmF6eSBlbWJlZGRlZCBwbGF0Zm9ybXMgd2hlcmUgdGhpcyBpc24ndCB0cnVlPwogICBhc3NlcnQoaW50U2l6ZSA8PSBwdHJTaXplICYmICJsYXlvdXQgYXNzdW1wdGlvbnMgaG9ycmlibHkgdmlvbGF0ZWQiKTsKQEAgLTM3MCwxMSArMzcwLDEwIEBACiAgIH0KIAogICAvLyBOZXh0LCBhbGwgdGhlIGJsb2NrIGNhcHR1cmVzLgotICBmb3IgKEJsb2NrRGVjbDo6Y2FwdHVyZV9jb25zdF9pdGVyYXRvciBjaSA9IGJsb2NrLT5jYXB0dXJlX2JlZ2luKCksCi0gICAgICAgICBjZSA9IGJsb2NrLT5jYXB0dXJlX2VuZCgpOyBjaSAhPSBjZTsgKytjaSkgewotICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gY2ktPmdldFZhcmlhYmxlKCk7CisgIGZvciAoY29uc3QgYXV0byAmQ0kgOiBibG9jay0+Y2FwdHVyZXMoKSkgeworICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gQ0kuZ2V0VmFyaWFibGUoKTsKIAotICAgIGlmIChjaS0+aXNCeVJlZigpKSB7CisgICAgaWYgKENJLmlzQnlSZWYoKSkgewogICAgICAgLy8gV2UgaGF2ZSB0byBjb3B5L2Rpc3Bvc2Ugb2YgdGhlIF9fYmxvY2sgcmVmZXJlbmNlLgogICAgICAgaW5mby5OZWVkc0NvcHlEaXNwb3NlID0gdHJ1ZTsKIApAQCAtMzg3LDggKzM4Niw3IEBACiAgICAgICBtYXhGaWVsZEFsaWduID0gc3RkOjptYXgobWF4RmllbGRBbGlnbiwgdGluZm8uc2Vjb25kKTsKIAogICAgICAgbGF5b3V0LnB1c2hfYmFjayhCbG9ja0xheW91dENodW5rKHRpbmZvLnNlY29uZCwgdGluZm8uZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGlmaWVyczo6T0NMX05vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJipjaSwgbGx2bVR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZXJzOjpPQ0xfTm9uZSwgJkNJLCBsbHZtVHlwZSkpOwogICAgICAgY29udGludWU7CiAgICAgfQogCkBAIC00MjIsNyArNDIwLDcgQEAKICAgICAgIGxpZmV0aW1lID0gUXVhbGlmaWVyczo6T0NMX1N0cm9uZzsKIAogICAgIC8vIFNvIGRvIHR5cGVzIHRoYXQgcmVxdWlyZSBub24tdHJpdmlhbCBjb3B5IGNvbnN0cnVjdGlvbi4KLSAgICB9IGVsc2UgaWYgKGNpLT5oYXNDb3B5RXhwcigpKSB7CisgICAgfSBlbHNlIGlmIChDSS5oYXNDb3B5RXhwcigpKSB7CiAgICAgICBpbmZvLk5lZWRzQ29weURpc3Bvc2UgPSB0cnVlOwogICAgICAgaW5mby5IYXNDWFhPYmplY3QgPSB0cnVlOwogCkBAIC00NDYsNyArNDQ0LDcgQEAKICAgICBsbHZtOjpUeXBlICpsbHZtVHlwZSA9CiAgICAgICBDR00uZ2V0VHlwZXMoKS5Db252ZXJ0VHlwZUZvck1lbShWVCk7CiAgICAgCi0gICAgbGF5b3V0LnB1c2hfYmFjayhCbG9ja0xheW91dENodW5rKGFsaWduLCBzaXplLCBsaWZldGltZSwgJipjaSwgbGx2bVR5cGUpKTsKKyAgICBsYXlvdXQucHVzaF9iYWNrKEJsb2NrTGF5b3V0Q2h1bmsoYWxpZ24sIHNpemUsIGxpZmV0aW1lLCAmQ0ksIGxsdm1UeXBlKSk7CiAgIH0KIAogICAvLyBJZiB0aGF0IHdhcyBldmVyeXRoaW5nLCB3ZSdyZSBkb25lIGhlcmUuCkBAIC01ODEsMTQgKzU3OSwxMyBAQAogCiAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgY2FwdHVyZXMgKGluIG9yZGVyKSBhbmQgZmluZCB0aGUgb25lcyBub3QKICAgLy8gY2FwdHVyZWQgYnkgY29uc3RhbnQuCi0gIGZvciAoQmxvY2tEZWNsOjpjYXB0dXJlX2NvbnN0X2l0ZXJhdG9yIGNpID0gYmxvY2stPmNhcHR1cmVfYmVnaW4oKSwKLSAgICAgICAgIGNlID0gYmxvY2stPmNhcHR1cmVfZW5kKCk7IGNpICE9IGNlOyArK2NpKSB7CisgIGZvciAoY29uc3QgYXV0byAmQ0kgOiBibG9jay0+Y2FwdHVyZXMoKSkgewogICAgIC8vIElnbm9yZSBfX2Jsb2NrIGNhcHR1cmVzOyB0aGVyZSdzIG5vdGhpbmcgc3BlY2lhbCBpbiB0aGUKICAgICAvLyBvbi1zdGFjayBibG9jayB0aGF0IHdlIG5lZWQgdG8gZG8gZm9yIHRoZW0uCi0gICAgaWYgKGNpLT5pc0J5UmVmKCkpIGNvbnRpbnVlOworICAgIGlmIChDSS5pc0J5UmVmKCkpIGNvbnRpbnVlOwogCiAgICAgLy8gSWdub3JlIHZhcmlhYmxlcyB0aGF0IGFyZSBjb25zdGFudC1jYXB0dXJlZC4KLSAgICBjb25zdCBWYXJEZWNsICp2YXJpYWJsZSA9IGNpLT5nZXRWYXJpYWJsZSgpOworICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gQ0kuZ2V0VmFyaWFibGUoKTsKICAgICBDR0Jsb2NrSW5mbzo6Q2FwdHVyZSAmY2FwdHVyZSA9IGJsb2NrSW5mby5nZXRDYXB0dXJlKHZhcmlhYmxlKTsKICAgICBpZiAoY2FwdHVyZS5pc0NvbnN0YW50KCkpIGNvbnRpbnVlOwogCkBAIC02NzksNyArNjc2LDcgQEAKICAgfQogCiAgIC8vIEZpbmQgdGhlIGJsb2NrIGluZm8gZm9yIHRoaXMgYmxvY2sgYW5kIHRha2Ugb3duZXJzaGlwIG9mIGl0LgotICBPd25pbmdQdHI8Q0dCbG9ja0luZm8+IGJsb2NrSW5mbzsKKyAgc3RkOjp1bmlxdWVfcHRyPENHQmxvY2tJbmZvPiBibG9ja0luZm87CiAgIGJsb2NrSW5mby5yZXNldChmaW5kQW5kUmVtb3ZlQmxvY2tJbmZvKCZGaXJzdEJsb2NrSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tFeHByLT5nZXRCbG9ja0RlY2woKSkpOwogCkBAIC03NDEsOSArNzM4LDggQEAKICAgfQogCiAgIC8vIE5leHQsIGNhcHR1cmVkIHZhcmlhYmxlcy4KLSAgZm9yIChCbG9ja0RlY2w6OmNhcHR1cmVfY29uc3RfaXRlcmF0b3IgY2kgPSBibG9ja0RlY2wtPmNhcHR1cmVfYmVnaW4oKSwKLSAgICAgICAgIGNlID0gYmxvY2tEZWNsLT5jYXB0dXJlX2VuZCgpOyBjaSAhPSBjZTsgKytjaSkgewotICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gY2ktPmdldFZhcmlhYmxlKCk7CisgIGZvciAoY29uc3QgYXV0byAmQ0kgOiBibG9ja0RlY2wtPmNhcHR1cmVzKCkpIHsKKyAgICBjb25zdCBWYXJEZWNsICp2YXJpYWJsZSA9IENJLmdldFZhcmlhYmxlKCk7CiAgICAgY29uc3QgQ0dCbG9ja0luZm86OkNhcHR1cmUgJmNhcHR1cmUgPSBibG9ja0luZm8uZ2V0Q2FwdHVyZSh2YXJpYWJsZSk7CiAKICAgICAvLyBJZ25vcmUgY29uc3RhbnQgY2FwdHVyZXMuCkBAIC03NjEsNyArNzU3LDcgQEAKICAgICAvLyBDb21wdXRlIHRoZSBhZGRyZXNzIG9mIHRoZSB0aGluZyB3ZSdyZSBnb2luZyB0byBtb3ZlIGludG8gdGhlCiAgICAgLy8gYmxvY2sgbGl0ZXJhbC4KICAgICBsbHZtOjpWYWx1ZSAqc3JjOwotICAgIGlmIChCbG9ja0luZm8gJiYgY2ktPmlzTmVzdGVkKCkpIHsKKyAgICBpZiAoQmxvY2tJbmZvICYmIENJLmlzTmVzdGVkKCkpIHsKICAgICAgIC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBjYXB0dXJlIGZyb20gdGhlIGVuY2xvc2luZyBibG9jay4KICAgICAgIGNvbnN0IENHQmxvY2tJbmZvOjpDYXB0dXJlICZlbmNsb3NpbmdDYXB0dXJlID0KICAgICAgICAgQmxvY2tJbmZvLT5nZXRDYXB0dXJlKHZhcmlhYmxlKTsKQEAgLTc4MCw4ICs3NzYsOCBAQAogICAgICAgLy8gZW1pc3Npb24uCiAgICAgICBzcmMgPSBMb2NhbERlY2xNYXAubG9va3VwKHZhcmlhYmxlKTsKICAgICAgIGlmICghc3JjKSB7Ci0gICAgICAgIERlY2xSZWZFeHByIGRlY2xSZWYoY29uc3RfY2FzdDxWYXJEZWNsKj4odmFyaWFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVmZXJzVG9FbmNsb3NpbmcqLyBjaS0+aXNOZXN0ZWQoKSwgdHlwZSwKKyAgICAgICAgRGVjbFJlZkV4cHIgZGVjbFJlZihjb25zdF9jYXN0PFZhckRlY2wgKj4odmFyaWFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVmZXJzVG9FbmNsb3NpbmcqLyBDSS5pc05lc3RlZCgpLCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0xWYWx1ZSwgU291cmNlTG9jYXRpb24oKSk7CiAgICAgICAgIHNyYyA9IEVtaXREZWNsUmVmTFZhbHVlKCZkZWNsUmVmKS5nZXRBZGRyZXNzKCk7CiAgICAgICB9CkBAIC03OTEsOSArNzg3LDkgQEAKICAgICAvLyB0aGUgYmxvY2sgZmllbGQuICBUaGVyZSdzIG5vIG5lZWQgdG8gY2hhc2UgdGhlIGZvcndhcmRpbmcKICAgICAvLyBwb2ludGVyIGF0IHRoaXMgcG9pbnQsIHNpbmNlIHdlJ3JlIGJ1aWxkaW5nIHNvbWV0aGluZyB0aGF0IHdpbGwKICAgICAvLyBsaXZlIGEgc2hvcnRlciBsaWZlIHRoYW4gdGhlIHN0YWNrIGJ5cmVmIGFueXdheS4KLSAgICBpZiAoY2ktPmlzQnlSZWYoKSkgeworICAgIGlmIChDSS5pc0J5UmVmKCkpIHsKICAgICAgIC8vIEdldCBhIHZvaWQqIHRoYXQgcG9pbnRzIHRvIHRoZSBieXJlZiBzdHJ1Y3QuCi0gICAgICBpZiAoY2ktPmlzTmVzdGVkKCkpCisgICAgICBpZiAoQ0kuaXNOZXN0ZWQoKSkKICAgICAgICAgc3JjID0gQnVpbGRlci5DcmVhdGVBbGlnbmVkTG9hZChzcmMsIGFsaWduLmdldFF1YW50aXR5KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5cmVmLmNhcHR1cmUiKTsKICAgICAgIGVsc2UKQEAgLTgwMyw3ICs3OTksNyBAQAogICAgICAgQnVpbGRlci5DcmVhdGVBbGlnbmVkU3RvcmUoc3JjLCBibG9ja0ZpZWxkLCBhbGlnbi5nZXRRdWFudGl0eSgpKTsKIAogICAgIC8vIElmIHdlIGhhdmUgYSBjb3B5IGNvbnN0cnVjdG9yLCBldmFsdWF0ZSB0aGF0IGludG8gdGhlIGJsb2NrIGZpZWxkLgotICAgIH0gZWxzZSBpZiAoY29uc3QgRXhwciAqY29weUV4cHIgPSBjaS0+Z2V0Q29weUV4cHIoKSkgeworICAgIH0gZWxzZSBpZiAoY29uc3QgRXhwciAqY29weUV4cHIgPSBDSS5nZXRDb3B5RXhwcigpKSB7CiAgICAgICBpZiAoYmxvY2tEZWNsLT5pc0NvbnZlcnNpb25Gcm9tTGFtYmRhKCkpIHsKICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGxhbWJkYSBjb252ZXJzaW9uLCBlbWl0IHRoZSBleHByZXNzaW9uCiAgICAgICAgIC8vIGRpcmVjdGx5IGludG8gdGhlIGJsb2NrIGluc3RlYWQuCkBAIC04NTEsNyArODQ3LDcgQEAKICAgICAgIC8vIFdlIHVzZSBvbmUgb2YgdGhlc2Ugb3IgdGhlIG90aGVyIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQogICAgICAgLy8gcmVmZXJlbmNlIGlzIG5lc3RlZC4KICAgICAgIERlY2xSZWZFeHByIGRlY2xSZWYoY29uc3RfY2FzdDxWYXJEZWNsKj4odmFyaWFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJlZmVyc1RvRW5jbG9zaW5nKi8gY2ktPmlzTmVzdGVkKCksIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVmZXJzVG9FbmNsb3NpbmcqLyBDSS5pc05lc3RlZCgpLCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBWS19MVmFsdWUsIFNvdXJjZUxvY2F0aW9uKCkpOwogCiAgICAgICBJbXBsaWNpdENhc3RFeHByIGwycihJbXBsaWNpdENhc3RFeHByOjpPblN0YWNrLCB0eXBlLCBDS19MVmFsdWVUb1JWYWx1ZSwKQEAgLTg2Miw3ICs4NTgsNyBAQAogICAgIH0KIAogICAgIC8vIEFjdGl2YXRlIHRoZSBjbGVhbnVwIGlmIGxheW91dCBwdXNoZWQgb25lLgotICAgIGlmICghY2ktPmlzQnlSZWYoKSkgeworICAgIGlmICghQ0kuaXNCeVJlZigpKSB7CiAgICAgICBFSFNjb3BlU3RhY2s6OnN0YWJsZV9pdGVyYXRvciBjbGVhbnVwID0gY2FwdHVyZS5nZXRDbGVhbnVwKCk7CiAgICAgICBpZiAoY2xlYW51cC5pc1ZhbGlkKCkpCiAgICAgICAgIEFjdGl2YXRlQ2xlYW51cEJsb2NrKGNsZWFudXAsIGJsb2NrSW5mby5Eb21pbmF0aW5nSVApOwpAQCAtMTExNywxNyArMTExMywxNSBAQAogICBhcmdzLnB1c2hfYmFjaygmc2VsZkRlY2wpOwogCiAgIC8vIE5vdyBhZGQgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMuCi0gIGZvciAoQmxvY2tEZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBpID0gYmxvY2tEZWNsLT5wYXJhbV9iZWdpbigpLAotICAgICAgIGUgPSBibG9ja0RlY2wtPnBhcmFtX2VuZCgpOyBpICE9IGU7ICsraSkKLSAgICBhcmdzLnB1c2hfYmFjaygqaSk7CisgIGZvciAoYXV0byBpIDogYmxvY2tEZWNsLT5wYXJhbXMoKSkKKyAgICBhcmdzLnB1c2hfYmFjayhpKTsKIAogICAvLyBDcmVhdGUgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgogICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqZm5UeXBlID0gYmxvY2tJbmZvLmdldEJsb2NrRXhwcigpLT5nZXRGdW5jdGlvblR5cGUoKTsKLSAgY29uc3QgQ0dGdW5jdGlvbkluZm8gJmZuSW5mbyA9Ci0gICAgQ0dNLmdldFR5cGVzKCkuYXJyYW5nZUZ1bmN0aW9uRGVjbGFyYXRpb24oZm5UeXBlLT5nZXRSZXN1bHRUeXBlKCksIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5UeXBlLT5nZXRFeHRJbmZvKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5UeXBlLT5pc1ZhcmlhZGljKCkpOwotICBpZiAoQ0dNLlJldHVyblR5cGVVc2VzU1JldChmbkluZm8pKQorICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmZm5JbmZvID0gQ0dNLmdldFR5cGVzKCkuYXJyYW5nZUZyZWVGdW5jdGlvbkRlY2xhcmF0aW9uKAorICAgICAgZm5UeXBlLT5nZXRSZXR1cm5UeXBlKCksIGFyZ3MsIGZuVHlwZS0+Z2V0RXh0SW5mbygpLAorICAgICAgZm5UeXBlLT5pc1ZhcmlhZGljKCkpOworICBpZiAoQ0dNLlJldHVyblNsb3RJbnRlcmZlcmVzV2l0aEFyZ3MoZm5JbmZvKSkKICAgICBibG9ja0luZm8uVXNlc1N0cmV0ID0gdHJ1ZTsKIAogICBsbHZtOjpGdW5jdGlvblR5cGUgKmZuTExWTVR5cGUgPSBDR00uZ2V0VHlwZXMoKS5HZXRGdW5jdGlvblR5cGUoZm5JbmZvKTsKQEAgLTExNDAsNyArMTEzNCw3IEBACiAgIENHTS5TZXRJbnRlcm5hbEZ1bmN0aW9uQXR0cmlidXRlcyhibG9ja0RlY2wsIGZuLCBmbkluZm8pOwogCiAgIC8vIEJlZ2luIGdlbmVyYXRpbmcgdGhlIGZ1bmN0aW9uLgotICBTdGFydEZ1bmN0aW9uKGJsb2NrRGVjbCwgZm5UeXBlLT5nZXRSZXN1bHRUeXBlKCksIGZuLCBmbkluZm8sIGFyZ3MsCisgIFN0YXJ0RnVuY3Rpb24oYmxvY2tEZWNsLCBmblR5cGUtPmdldFJldHVyblR5cGUoKSwgZm4sIGZuSW5mbywgYXJncywKICAgICAgICAgICAgICAgICBibG9ja0luZm8uZ2V0QmxvY2tFeHByKCktPmdldEJvZHkoKS0+Z2V0TG9jU3RhcnQoKSk7CiAKICAgLy8gT2theS4gIFVuZG8gc29tZSBvZiB3aGF0IFN0YXJ0RnVuY3Rpb24gZGlkLgpAQCAtMTE3Nyw5ICsxMTcxLDggQEAKICAgfQogCiAgIC8vIEFsc28gZm9yY2UgYWxsIHRoZSBjb25zdGFudCBjYXB0dXJlcy4KLSAgZm9yIChCbG9ja0RlY2w6OmNhcHR1cmVfY29uc3RfaXRlcmF0b3IgY2kgPSBibG9ja0RlY2wtPmNhcHR1cmVfYmVnaW4oKSwKLSAgICAgICAgIGNlID0gYmxvY2tEZWNsLT5jYXB0dXJlX2VuZCgpOyBjaSAhPSBjZTsgKytjaSkgewotICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gY2ktPmdldFZhcmlhYmxlKCk7CisgIGZvciAoY29uc3QgYXV0byAmQ0kgOiBibG9ja0RlY2wtPmNhcHR1cmVzKCkpIHsKKyAgICBjb25zdCBWYXJEZWNsICp2YXJpYWJsZSA9IENJLmdldFZhcmlhYmxlKCk7CiAgICAgY29uc3QgQ0dCbG9ja0luZm86OkNhcHR1cmUgJmNhcHR1cmUgPSBibG9ja0luZm8uZ2V0Q2FwdHVyZSh2YXJpYWJsZSk7CiAgICAgaWYgKCFjYXB0dXJlLmlzQ29uc3RhbnQoKSkgY29udGludWU7CiAKQEAgLTEyMDEsOCArMTE5NCwxNCBAQAogCiAgIGlmIChJc0xhbWJkYUNvbnZlcnNpb25Ub0Jsb2NrKQogICAgIEVtaXRMYW1iZGFCbG9ja0ludm9rZUJvZHkoKTsKLSAgZWxzZQorICBlbHNlIHsKKyAgICBQR08uYXNzaWduUmVnaW9uQ291bnRlcnMoYmxvY2tEZWNsLCBmbik7CisgICAgUmVnaW9uQ291bnRlciBDbnQgPSBnZXRQR09SZWdpb25Db3VudGVyKGJsb2NrRGVjbC0+Z2V0Qm9keSgpKTsKKyAgICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CiAgICAgRW1pdFN0bXQoYmxvY2tEZWNsLT5nZXRCb2R5KCkpOworICAgIFBHTy5lbWl0SW5zdHJ1bWVudGF0aW9uRGF0YSgpOworICAgIFBHTy5kZXN0cm95UmVnaW9uQ291bnRlcnMoKTsKKyAgfQogCiAgIC8vIFJlbWVtYmVyIHdoZXJlIHdlIHdlcmUuLi4KICAgbGx2bTo6QmFzaWNCbG9jayAqcmVzdW1lID0gQnVpbGRlci5HZXRJbnNlcnRCbG9jaygpOwpAQCAtMTIxNCw5ICsxMjEzLDggQEAKICAgLy8gRW1pdCBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgYWxsIHRoZSBEZWNsUmVmRXhwcnMuCiAgIC8vIEZJWE1FOiBhbHNvIGZvciAndGhpcycKICAgaWYgKENHRGVidWdJbmZvICpESSA9IGdldERlYnVnSW5mbygpKSB7Ci0gICAgZm9yIChCbG9ja0RlY2w6OmNhcHR1cmVfY29uc3RfaXRlcmF0b3IgY2kgPSBibG9ja0RlY2wtPmNhcHR1cmVfYmVnaW4oKSwKLSAgICAgICAgICAgY2UgPSBibG9ja0RlY2wtPmNhcHR1cmVfZW5kKCk7IGNpICE9IGNlOyArK2NpKSB7Ci0gICAgICBjb25zdCBWYXJEZWNsICp2YXJpYWJsZSA9IGNpLT5nZXRWYXJpYWJsZSgpOworICAgIGZvciAoY29uc3QgYXV0byAmQ0kgOiBibG9ja0RlY2wtPmNhcHR1cmVzKCkpIHsKKyAgICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gQ0kuZ2V0VmFyaWFibGUoKTsKICAgICAgIERJLT5FbWl0TG9jYXRpb24oQnVpbGRlciwgdmFyaWFibGUtPmdldExvY2F0aW9uKCkpOwogCiAgICAgICBpZiAoQ0dNLmdldENvZGVHZW5PcHRzKCkuZ2V0RGVidWdJbmZvKCkKQEAgLTEyODUsMTAgKzEyODMsOCBAQAogICBJbXBsaWNpdFBhcmFtRGVjbCBzcmNEZWNsKDAsIFNvdXJjZUxvY2F0aW9uKCksIDAsIEMuVm9pZFB0clR5KTsKICAgYXJncy5wdXNoX2JhY2soJnNyY0RlY2wpOwogCi0gIGNvbnN0IENHRnVuY3Rpb25JbmZvICZGSSA9Ci0gICAgQ0dNLmdldFR5cGVzKCkuYXJyYW5nZUZ1bmN0aW9uRGVjbGFyYXRpb24oQy5Wb2lkVHksIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp2YXJpYWRpYyovIGZhbHNlKTsKKyAgY29uc3QgQ0dGdW5jdGlvbkluZm8gJkZJID0gQ0dNLmdldFR5cGVzKCkuYXJyYW5nZUZyZWVGdW5jdGlvbkRlY2xhcmF0aW9uKAorICAgICAgQy5Wb2lkVHksIGFyZ3MsIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbygpLCAvKnZhcmlhZGljPSovZmFsc2UpOwogCiAgIC8vIEZJWE1FOiBpdCB3b3VsZCBiZSBuaWNlIGlmIHRoZXNlIHdlcmUgbWVyZ2VhYmxlIHdpdGggdGhpbmdzIHdpdGgKICAgLy8gaWRlbnRpY2FsIHNlbWFudGljcy4KQEAgLTEzMjUsMjUgKzEzMjEsMjQgQEAKIAogICBjb25zdCBCbG9ja0RlY2wgKmJsb2NrRGVjbCA9IGJsb2NrSW5mby5nZXRCbG9ja0RlY2woKTsKIAotICBmb3IgKEJsb2NrRGVjbDo6Y2FwdHVyZV9jb25zdF9pdGVyYXRvciBjaSA9IGJsb2NrRGVjbC0+Y2FwdHVyZV9iZWdpbigpLAotICAgICAgICAgY2UgPSBibG9ja0RlY2wtPmNhcHR1cmVfZW5kKCk7IGNpICE9IGNlOyArK2NpKSB7Ci0gICAgY29uc3QgVmFyRGVjbCAqdmFyaWFibGUgPSBjaS0+Z2V0VmFyaWFibGUoKTsKKyAgZm9yIChjb25zdCBhdXRvICZDSSA6IGJsb2NrRGVjbC0+Y2FwdHVyZXMoKSkgeworICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gQ0kuZ2V0VmFyaWFibGUoKTsKICAgICBRdWFsVHlwZSB0eXBlID0gdmFyaWFibGUtPmdldFR5cGUoKTsKIAogICAgIGNvbnN0IENHQmxvY2tJbmZvOjpDYXB0dXJlICZjYXB0dXJlID0gYmxvY2tJbmZvLmdldENhcHR1cmUodmFyaWFibGUpOwogICAgIGlmIChjYXB0dXJlLmlzQ29uc3RhbnQoKSkgY29udGludWU7CiAKLSAgICBjb25zdCBFeHByICpjb3B5RXhwciA9IGNpLT5nZXRDb3B5RXhwcigpOworICAgIGNvbnN0IEV4cHIgKmNvcHlFeHByID0gQ0kuZ2V0Q29weUV4cHIoKTsKICAgICBCbG9ja0ZpZWxkRmxhZ3MgZmxhZ3M7CiAKICAgICBib29sIHVzZUFSQ1dlYWtDb3B5ID0gZmFsc2U7CiAgICAgYm9vbCB1c2VBUkNTdHJvbmdDb3B5ID0gZmFsc2U7CiAKICAgICBpZiAoY29weUV4cHIpIHsKLSAgICAgIGFzc2VydCghY2ktPmlzQnlSZWYoKSk7CisgICAgICBhc3NlcnQoIUNJLmlzQnlSZWYoKSk7CiAgICAgICAvLyBkb24ndCBib3RoZXIgY29tcHV0aW5nIGZsYWdzCiAKLSAgICB9IGVsc2UgaWYgKGNpLT5pc0J5UmVmKCkpIHsKKyAgICB9IGVsc2UgaWYgKENJLmlzQnlSZWYoKSkgewogICAgICAgZmxhZ3MgPSBCTE9DS19GSUVMRF9JU19CWVJFRjsKICAgICAgIGlmICh0eXBlLmlzT2JqQ0dDV2VhaygpKQogICAgICAgICBmbGFncyB8PSBCTE9DS19GSUVMRF9JU19XRUFLOwpAQCAtMTQyMyw3ICsxNDE4LDcgQEAKICAgICAgICAgfTsKIAogICAgICAgICBib29sIGNvcHlDYW5UaHJvdyA9IGZhbHNlOwotICAgICAgICBpZiAoY2ktPmlzQnlSZWYoKSAmJiB2YXJpYWJsZS0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKSkgeworICAgICAgICBpZiAoQ0kuaXNCeVJlZigpICYmIHZhcmlhYmxlLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpKSB7CiAgICAgICAgICAgY29uc3QgRXhwciAqY29weUV4cHIgPQogICAgICAgICAgICAgQ0dNLmdldENvbnRleHQoKS5nZXRCbG9ja1ZhckNvcHlJbml0cyh2YXJpYWJsZSk7CiAgICAgICAgICAgaWYgKGNvcHlFeHByKSB7CkBAIC0xNDYwLDEwICsxNDU1LDggQEAKICAgSW1wbGljaXRQYXJhbURlY2wgc3JjRGVjbCgwLCBTb3VyY2VMb2NhdGlvbigpLCAwLCBDLlZvaWRQdHJUeSk7CiAgIGFyZ3MucHVzaF9iYWNrKCZzcmNEZWNsKTsKIAotICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmRkkgPQotICAgIENHTS5nZXRUeXBlcygpLmFycmFuZ2VGdW5jdGlvbkRlY2xhcmF0aW9uKEMuVm9pZFR5LCBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdmFyaWFkaWMqLyBmYWxzZSk7CisgIGNvbnN0IENHRnVuY3Rpb25JbmZvICZGSSA9IENHTS5nZXRUeXBlcygpLmFycmFuZ2VGcmVlRnVuY3Rpb25EZWNsYXJhdGlvbigKKyAgICAgIEMuVm9pZFR5LCBhcmdzLCBGdW5jdGlvblR5cGU6OkV4dEluZm8oKSwgLyp2YXJpYWRpYz0qL2ZhbHNlKTsKIAogICAvLyBGSVhNRTogV2UnZCBsaWtlIHRvIHB1dCB0aGVzZSBpbnRvIGEgbWVyZ2FibGUgYnkgY29udGVudCwgd2l0aAogICAvLyBpbnRlcm5hbCBsaW5rYWdlLgpAQCAtMTQ5Niw5ICsxNDg5LDggQEAKIAogICBDb2RlR2VuRnVuY3Rpb246OlJ1bkNsZWFudXBzU2NvcGUgY2xlYW51cHMoKnRoaXMpOwogCi0gIGZvciAoQmxvY2tEZWNsOjpjYXB0dXJlX2NvbnN0X2l0ZXJhdG9yIGNpID0gYmxvY2tEZWNsLT5jYXB0dXJlX2JlZ2luKCksCi0gICAgICAgICBjZSA9IGJsb2NrRGVjbC0+Y2FwdHVyZV9lbmQoKTsgY2kgIT0gY2U7ICsrY2kpIHsKLSAgICBjb25zdCBWYXJEZWNsICp2YXJpYWJsZSA9IGNpLT5nZXRWYXJpYWJsZSgpOworICBmb3IgKGNvbnN0IGF1dG8gJkNJIDogYmxvY2tEZWNsLT5jYXB0dXJlcygpKSB7CisgICAgY29uc3QgVmFyRGVjbCAqdmFyaWFibGUgPSBDSS5nZXRWYXJpYWJsZSgpOwogICAgIFF1YWxUeXBlIHR5cGUgPSB2YXJpYWJsZS0+Z2V0VHlwZSgpOwogCiAgICAgY29uc3QgQ0dCbG9ja0luZm86OkNhcHR1cmUgJmNhcHR1cmUgPSBibG9ja0luZm8uZ2V0Q2FwdHVyZSh2YXJpYWJsZSk7CkBAIC0xNTEwLDcgKzE1MDIsNyBAQAogICAgIGJvb2wgdXNlQVJDV2Vha0Rlc3Ryb3kgPSBmYWxzZTsKICAgICBib29sIHVzZUFSQ1N0cm9uZ0Rlc3Ryb3kgPSBmYWxzZTsKIAotICAgIGlmIChjaS0+aXNCeVJlZigpKSB7CisgICAgaWYgKENJLmlzQnlSZWYoKSkgewogICAgICAgZmxhZ3MgPSBCTE9DS19GSUVMRF9JU19CWVJFRjsKICAgICAgIGlmICh0eXBlLmlzT2JqQ0dDV2VhaygpKQogICAgICAgICBmbGFncyB8PSBCTE9DS19GSUVMRF9JU19XRUFLOwpAQCAtMTU4Nyw3ICsxNTc5LDcgQEAKICAgICA6IEJ5cmVmSGVscGVycyhhbGlnbm1lbnQpLCBGbGFncyhmbGFncykge30KIAogICB2b2lkIGVtaXRDb3B5KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBsbHZtOjpWYWx1ZSAqZGVzdEZpZWxkLAotICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmNGaWVsZCkgeworICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmNGaWVsZCkgb3ZlcnJpZGUgewogICAgIGRlc3RGaWVsZCA9IENHRi5CdWlsZGVyLkNyZWF0ZUJpdENhc3QoZGVzdEZpZWxkLCBDR0YuVm9pZFB0clR5KTsKIAogICAgIHNyY0ZpZWxkID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChzcmNGaWVsZCwgQ0dGLlZvaWRQdHJQdHJUeSk7CkBAIC0xNjAyLDE0ICsxNTk0LDE0IEBACiAgICAgQ0dGLkVtaXROb3Vud2luZFJ1bnRpbWVDYWxsKGZuLCBhcmdzKTsKICAgfQogCi0gIHZvaWQgZW1pdERpc3Bvc2UoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGxsdm06OlZhbHVlICpmaWVsZCkgeworICB2b2lkIGVtaXREaXNwb3NlKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBsbHZtOjpWYWx1ZSAqZmllbGQpIG92ZXJyaWRlIHsKICAgICBmaWVsZCA9IENHRi5CdWlsZGVyLkNyZWF0ZUJpdENhc3QoZmllbGQsIENHRi5JbnQ4UHRyVHktPmdldFBvaW50ZXJUbygwKSk7CiAgICAgbGx2bTo6VmFsdWUgKnZhbHVlID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlTG9hZChmaWVsZCk7CiAKICAgICBDR0YuQnVpbGRCbG9ja1JlbGVhc2UodmFsdWUsIEZsYWdzIHwgQkxPQ0tfQllSRUZfQ0FMTEVSKTsKICAgfQogCi0gIHZvaWQgcHJvZmlsZUltcGwobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmaWQpIGNvbnN0IHsKKyAgdm9pZCBwcm9maWxlSW1wbChsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZpZCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIGlkLkFkZEludGVnZXIoRmxhZ3MuZ2V0Qml0TWFzaygpKTsKICAgfQogfTsKQEAgLTE2MjAsMTUgKzE2MTIsMTUgQEAKICAgQVJDV2Vha0J5cmVmSGVscGVycyhDaGFyVW5pdHMgYWxpZ25tZW50KSA6IEJ5cmVmSGVscGVycyhhbGlnbm1lbnQpIHt9CiAKICAgdm9pZCBlbWl0Q29weShDb2RlR2VuRnVuY3Rpb24gJkNHRiwgbGx2bTo6VmFsdWUgKmRlc3RGaWVsZCwKLSAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqc3JjRmllbGQpIHsKKyAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqc3JjRmllbGQpIG92ZXJyaWRlIHsKICAgICBDR0YuRW1pdEFSQ01vdmVXZWFrKGRlc3RGaWVsZCwgc3JjRmllbGQpOwogICB9CiAKLSAgdm9pZCBlbWl0RGlzcG9zZShDb2RlR2VuRnVuY3Rpb24gJkNHRiwgbGx2bTo6VmFsdWUgKmZpZWxkKSB7CisgIHZvaWQgZW1pdERpc3Bvc2UoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGxsdm06OlZhbHVlICpmaWVsZCkgb3ZlcnJpZGUgewogICAgIENHRi5FbWl0QVJDRGVzdHJveVdlYWsoZmllbGQpOwogICB9CiAKLSAgdm9pZCBwcm9maWxlSW1wbChsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZpZCkgY29uc3QgeworICB2b2lkIHByb2ZpbGVJbXBsKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJmlkKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gMCBpcyBkaXN0aW5ndWlzaGFibGUgZnJvbSBhbGwgcG9pbnRlcnMgYW5kIGJ5cmVmIGZsYWdzCiAgICAgaWQuQWRkSW50ZWdlcigwKTsKICAgfQpAQCAtMTY0MSw3ICsxNjMzLDcgQEAKICAgQVJDU3Ryb25nQnlyZWZIZWxwZXJzKENoYXJVbml0cyBhbGlnbm1lbnQpIDogQnlyZWZIZWxwZXJzKGFsaWdubWVudCkge30KIAogICB2b2lkIGVtaXRDb3B5KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBsbHZtOjpWYWx1ZSAqZGVzdEZpZWxkLAotICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmNGaWVsZCkgeworICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmNGaWVsZCkgb3ZlcnJpZGUgewogICAgIC8vIERvIGEgIm1vdmUiIGJ5IGNvcHlpbmcgdGhlIHZhbHVlIGFuZCB0aGVuIHplcm9pbmcgb3V0IHRoZSBvbGQKICAgICAvLyB2YXJpYWJsZS4KIApAQCAtMTY2NSwxMSArMTY1NywxMSBAQAogICAgIHN0b3JlLT5zZXRBbGlnbm1lbnQoQWxpZ25tZW50LmdldFF1YW50aXR5KCkpOwogICB9CiAKLSAgdm9pZCBlbWl0RGlzcG9zZShDb2RlR2VuRnVuY3Rpb24gJkNHRiwgbGx2bTo6VmFsdWUgKmZpZWxkKSB7CisgIHZvaWQgZW1pdERpc3Bvc2UoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGxsdm06OlZhbHVlICpmaWVsZCkgb3ZlcnJpZGUgewogICAgIENHRi5FbWl0QVJDRGVzdHJveVN0cm9uZyhmaWVsZCwgQVJDSW1wcmVjaXNlTGlmZXRpbWUpOwogICB9CiAKLSAgdm9pZCBwcm9maWxlSW1wbChsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZpZCkgY29uc3QgeworICB2b2lkIHByb2ZpbGVJbXBsKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJmlkKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gMSBpcyBkaXN0aW5ndWlzaGFibGUgZnJvbSBhbGwgcG9pbnRlcnMgYW5kIGJ5cmVmIGZsYWdzCiAgICAgaWQuQWRkSW50ZWdlcigxKTsKICAgfQpAQCAtMTY4Miw3ICsxNjc0LDcgQEAKICAgQVJDU3Ryb25nQmxvY2tCeXJlZkhlbHBlcnMoQ2hhclVuaXRzIGFsaWdubWVudCkgOiBCeXJlZkhlbHBlcnMoYWxpZ25tZW50KSB7fQogCiAgIHZvaWQgZW1pdENvcHkoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGxsdm06OlZhbHVlICpkZXN0RmllbGQsCi0gICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnNyY0ZpZWxkKSB7CisgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnNyY0ZpZWxkKSBvdmVycmlkZSB7CiAgICAgLy8gRG8gdGhlIGNvcHkgd2l0aCBvYmpjX3JldGFpbkJsb2NrOyB0aGF0J3MgYWxsIHRoYXQKICAgICAvLyBfQmxvY2tfb2JqZWN0X2Fzc2lnbiB3b3VsZCBkbyBhbnl3YXksIGFuZCB3ZSdkIGhhdmUgdG8gcGFzcyB0aGUKICAgICAvLyByaWdodCBhcmd1bWVudHMgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZ2V0IG5vLW9wJ2VkLgpAQCAtMTY5NSwxMSArMTY4NywxMSBAQAogICAgIHN0b3JlLT5zZXRBbGlnbm1lbnQoQWxpZ25tZW50LmdldFF1YW50aXR5KCkpOwogICB9CiAKLSAgdm9pZCBlbWl0RGlzcG9zZShDb2RlR2VuRnVuY3Rpb24gJkNHRiwgbGx2bTo6VmFsdWUgKmZpZWxkKSB7CisgIHZvaWQgZW1pdERpc3Bvc2UoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGxsdm06OlZhbHVlICpmaWVsZCkgb3ZlcnJpZGUgewogICAgIENHRi5FbWl0QVJDRGVzdHJveVN0cm9uZyhmaWVsZCwgQVJDSW1wcmVjaXNlTGlmZXRpbWUpOwogICB9CiAKLSAgdm9pZCBwcm9maWxlSW1wbChsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZpZCkgY29uc3QgeworICB2b2lkIHByb2ZpbGVJbXBsKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJmlkKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gMiBpcyBkaXN0aW5ndWlzaGFibGUgZnJvbSBhbGwgcG9pbnRlcnMgYW5kIGJ5cmVmIGZsYWdzCiAgICAgaWQuQWRkSW50ZWdlcigyKTsKICAgfQpAQCAtMTcxNiwyMCArMTcwOCwyMCBAQAogICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqY29weUV4cHIpCiAgICAgOiBCeXJlZkhlbHBlcnMoYWxpZ25tZW50KSwgVmFyVHlwZSh0eXBlKSwgQ29weUV4cHIoY29weUV4cHIpIHt9CiAKLSAgYm9vbCBuZWVkc0NvcHkoKSBjb25zdCB7IHJldHVybiBDb3B5RXhwciAhPSAwOyB9CisgIGJvb2wgbmVlZHNDb3B5KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQ29weUV4cHIgIT0gMDsgfQogICB2b2lkIGVtaXRDb3B5KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBsbHZtOjpWYWx1ZSAqZGVzdEZpZWxkLAotICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmNGaWVsZCkgeworICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmNGaWVsZCkgb3ZlcnJpZGUgewogICAgIGlmICghQ29weUV4cHIpIHJldHVybjsKICAgICBDR0YuRW1pdFN5bnRoZXNpemVkQ1hYQ29weUN0b3IoZGVzdEZpZWxkLCBzcmNGaWVsZCwgQ29weUV4cHIpOwogICB9CiAKLSAgdm9pZCBlbWl0RGlzcG9zZShDb2RlR2VuRnVuY3Rpb24gJkNHRiwgbGx2bTo6VmFsdWUgKmZpZWxkKSB7CisgIHZvaWQgZW1pdERpc3Bvc2UoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGxsdm06OlZhbHVlICpmaWVsZCkgb3ZlcnJpZGUgewogICAgIEVIU2NvcGVTdGFjazo6c3RhYmxlX2l0ZXJhdG9yIGNsZWFudXBEZXB0aCA9IENHRi5FSFN0YWNrLnN0YWJsZV9iZWdpbigpOwogICAgIENHRi5QdXNoRGVzdHJ1Y3RvckNsZWFudXAoVmFyVHlwZSwgZmllbGQpOwogICAgIENHRi5Qb3BDbGVhbnVwQmxvY2tzKGNsZWFudXBEZXB0aCk7CiAgIH0KIAotICB2b2lkIHByb2ZpbGVJbXBsKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJmlkKSBjb25zdCB7CisgIHZvaWQgcHJvZmlsZUltcGwobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmaWQpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBpZC5BZGRQb2ludGVyKFZhclR5cGUuZ2V0Q2Fub25pY2FsVHlwZSgpLmdldEFzT3BhcXVlUHRyKCkpOwogICB9CiB9OwpAQCAtMTc1MSwxMCArMTc0Myw4IEBACiAgIEltcGxpY2l0UGFyYW1EZWNsIHNyYygwLCBTb3VyY2VMb2NhdGlvbigpLCAwLCBDb250ZXh0LlZvaWRQdHJUeSk7CiAgIGFyZ3MucHVzaF9iYWNrKCZzcmMpOwogCi0gIGNvbnN0IENHRnVuY3Rpb25JbmZvICZGSSA9Ci0gICAgQ0dGLkNHTS5nZXRUeXBlcygpLmFycmFuZ2VGdW5jdGlvbkRlY2xhcmF0aW9uKFIsIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnZhcmlhZGljKi8gZmFsc2UpOworICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmRkkgPSBDR0YuQ0dNLmdldFR5cGVzKCkuYXJyYW5nZUZyZWVGdW5jdGlvbkRlY2xhcmF0aW9uKAorICAgICAgUiwgYXJncywgRnVuY3Rpb25UeXBlOjpFeHRJbmZvKCksIC8qdmFyaWFkaWM9Ki9mYWxzZSk7CiAKICAgQ29kZUdlblR5cGVzICZUeXBlcyA9IENHRi5DR00uZ2V0VHlwZXMoKTsKICAgbGx2bTo6RnVuY3Rpb25UeXBlICpMVHkgPSBUeXBlcy5HZXRGdW5jdGlvblR5cGUoRkkpOwpAQCAtMTgyMiwxMCArMTgxMiw4IEBACiAgIEltcGxpY2l0UGFyYW1EZWNsIHNyYygwLCBTb3VyY2VMb2NhdGlvbigpLCAwLCBDb250ZXh0LlZvaWRQdHJUeSk7CiAgIGFyZ3MucHVzaF9iYWNrKCZzcmMpOwogCi0gIGNvbnN0IENHRnVuY3Rpb25JbmZvICZGSSA9Ci0gICAgQ0dGLkNHTS5nZXRUeXBlcygpLmFycmFuZ2VGdW5jdGlvbkRlY2xhcmF0aW9uKFIsIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnZhcmlhZGljKi8gZmFsc2UpOworICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmRkkgPSBDR0YuQ0dNLmdldFR5cGVzKCkuYXJyYW5nZUZyZWVGdW5jdGlvbkRlY2xhcmF0aW9uKAorICAgICAgUiwgYXJncywgRnVuY3Rpb25UeXBlOjpFeHRJbmZvKCksIC8qdmFyaWFkaWM9Ki9mYWxzZSk7CiAKICAgQ29kZUdlblR5cGVzICZUeXBlcyA9IENHRi5DR00uZ2V0VHlwZXMoKTsKICAgbGx2bTo6RnVuY3Rpb25UeXBlICpMVHkgPSBUeXBlcy5HZXRGdW5jdGlvblR5cGUoRkkpOwpAQCAtMjIxOCw3ICsyMjA2LDcgQEAKICAgICBsbHZtOjpWYWx1ZSAqQWRkcjsKICAgICBDYWxsQmxvY2tSZWxlYXNlKGxsdm06OlZhbHVlICpBZGRyKSA6IEFkZHIoQWRkcikge30KIAotICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSBvdmVycmlkZSB7CiAgICAgICAvLyBTaG91bGQgd2UgYmUgcGFzc2luZyBGSUVMRF9JU19XRUFLIGhlcmU/CiAgICAgICBDR0YuQnVpbGRCbG9ja1JlbGVhc2UoQWRkciwgQkxPQ0tfRklFTERfSVNfQllSRUYpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHQnVpbHRpbi5jcHAgYi9saWIvQ29kZUdlbi9DR0J1aWx0aW4uY3BwCmluZGV4IDc3MjZhZDMuLjVhODZiZGQgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NHQnVpbHRpbi5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ0dCdWlsdGluLmNwcApAQCAtMjE1LDggKzIxNSwxMSBAQAogICAgIHJldHVybiBSVmFsdWU6OmdldChDR00uRW1pdENvbnN0YW50RXhwcihFLCBFLT5nZXRUeXBlKCksIDApKTsKICAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9zdGRhcmdfc3RhcnQ6CiAgIGNhc2UgQnVpbHRpbjo6QklfX2J1aWx0aW5fdmFfc3RhcnQ6CisgIGNhc2UgQnVpbHRpbjo6QklfX3ZhX3N0YXJ0OgogICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX3ZhX2VuZDogewotICAgIFZhbHVlICpBcmdWYWx1ZSA9IEVtaXRWQUxpc3RSZWYoRS0+Z2V0QXJnKDApKTsKKyAgICBWYWx1ZSAqQXJnVmFsdWUgPSAoQnVpbHRpbklEID09IEJ1aWx0aW46OkJJX192YV9zdGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogRW1pdFZBTGlzdFJlZihFLT5nZXRBcmcoMCkpOwogICAgIGxsdm06OlR5cGUgKkRlc3RUeXBlID0gSW50OFB0clR5OwogICAgIGlmIChBcmdWYWx1ZS0+Z2V0VHlwZSgpICE9IERlc3RUeXBlKQogICAgICAgQXJnVmFsdWUgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoQXJnVmFsdWUsIERlc3RUeXBlLApAQCAtNDI5LDYgKzQzMiwxMiBAQAogICAgIFZhbHVlICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OnJlYWRjeWNsZWNvdW50ZXIpOwogICAgIHJldHVybiBSVmFsdWU6OmdldChCdWlsZGVyLkNyZWF0ZUNhbGwoRikpOwogICB9CisgIGNhc2UgQnVpbHRpbjo6QklfX2J1aWx0aW5fX19jbGVhcl9jYWNoZTogeworICAgIFZhbHVlICpCZWdpbiA9IEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSk7CisgICAgVmFsdWUgKkVuZCA9IEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSk7CisgICAgVmFsdWUgKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6Y2xlYXJfY2FjaGUpOworICAgIHJldHVybiBSVmFsdWU6OmdldChCdWlsZGVyLkNyZWF0ZUNhbGwyKEYsIEJlZ2luLCBFbmQpKTsKKyAgfQogICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX3RyYXA6IHsKICAgICBWYWx1ZSAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjp0cmFwKTsKICAgICByZXR1cm4gUlZhbHVlOjpnZXQoQnVpbGRlci5DcmVhdGVDYWxsKEYpKTsKQEAgLTk2NCw2ICs5NzMsNyBAQAogICAgIEFyZ3NbMl0gPSBFbWl0VG9JbnQoKnRoaXMsIEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygyKSksIFQsIEludFR5cGUpOwogCiAgICAgVmFsdWUgKlJlc3VsdCA9IEJ1aWxkZXIuQ3JlYXRlQXRvbWljQ21wWGNoZyhBcmdzWzBdLCBBcmdzWzFdLCBBcmdzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U2VxdWVudGlhbGx5Q29uc2lzdGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNlcXVlbnRpYWxseUNvbnNpc3RlbnQpOwogICAgIFJlc3VsdCA9IEVtaXRGcm9tSW50KCp0aGlzLCBSZXN1bHQsIFQsIFZhbHVlVHlwZSk7CiAgICAgcmV0dXJuIFJWYWx1ZTo6Z2V0KFJlc3VsdCk7CkBAIC05OTAsNiArMTAwMCw3IEBACiAKICAgICBWYWx1ZSAqT2xkVmFsID0gQXJnc1sxXTsKICAgICBWYWx1ZSAqUHJldlZhbCA9IEJ1aWxkZXIuQ3JlYXRlQXRvbWljQ21wWGNoZyhBcmdzWzBdLCBBcmdzWzFdLCBBcmdzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNlcXVlbnRpYWxseUNvbnNpc3RlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U2VxdWVudGlhbGx5Q29uc2lzdGVudCk7CiAgICAgVmFsdWUgKlJlc3VsdCA9IEJ1aWxkZXIuQ3JlYXRlSUNtcEVRKFByZXZWYWwsIE9sZFZhbCk7CiAgICAgLy8gemV4dCBib29sIHRvIGludC4KQEAgLTEzMTEsNyArMTMyMiw2IEBACiAgICAgbGx2bTo6VHlwZSAqQXJnVHlwZSA9IEJhc2UtPmdldFR5cGUoKTsKICAgICBWYWx1ZSAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjpwb3csIEFyZ1R5cGUpOwogICAgIHJldHVybiBSVmFsdWU6OmdldChCdWlsZGVyLkNyZWF0ZUNhbGwyKEYsIEJhc2UsIEV4cG9uZW50KSk7Ci0gICAgYnJlYWs7CiAgIH0KIAogICBjYXNlIEJ1aWx0aW46OkJJZm1hOgpAQCAtMTUwMCw2ICsxNTEwLDQzIEBACiAgICAgcmV0dXJuIFJWYWx1ZTo6Z2V0KEVtaXRMVmFsdWUoRS0+Z2V0QXJnKDApKS5nZXRBZGRyZXNzKCkpOwogICBjYXNlIEJ1aWx0aW46OkJJX19ub29wOgogICAgIHJldHVybiBSVmFsdWU6OmdldCgwKTsKKyAgY2FzZSBCdWlsdGluOjpCSV9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTogeworICAgIEF0b21pY0NtcFhjaGdJbnN0ICpDWEkgPSBCdWlsZGVyLkNyZWF0ZUF0b21pY0NtcFhjaGcoCisgICAgICAgIEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSksCisgICAgICAgIEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygyKSksCisgICAgICAgIEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSksCisgICAgICAgIFNlcXVlbnRpYWxseUNvbnNpc3RlbnQsCisgICAgICAgIFNlcXVlbnRpYWxseUNvbnNpc3RlbnQpOworICAgICAgQ1hJLT5zZXRWb2xhdGlsZSh0cnVlKTsKKyAgICAgIHJldHVybiBSVmFsdWU6OmdldChDWEkpOworICB9CisgIGNhc2UgQnVpbHRpbjo6QklfSW50ZXJsb2NrZWRJbmNyZW1lbnQ6IHsKKyAgICBBdG9taWNSTVdJbnN0ICpSTVdJID0gQnVpbGRlci5DcmVhdGVBdG9taWNSTVcoCisgICAgICBBdG9taWNSTVdJbnN0OjpBZGQsCisgICAgICBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpLAorICAgICAgQ29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCAxKSwKKyAgICAgIGxsdm06OlNlcXVlbnRpYWxseUNvbnNpc3RlbnQpOworICAgIFJNV0ktPnNldFZvbGF0aWxlKHRydWUpOworICAgIHJldHVybiBSVmFsdWU6OmdldChCdWlsZGVyLkNyZWF0ZUFkZChSTVdJLCBDb25zdGFudEludDo6Z2V0KEludDMyVHksIDEpKSk7CisgIH0KKyAgY2FzZSBCdWlsdGluOjpCSV9JbnRlcmxvY2tlZERlY3JlbWVudDogeworICAgIEF0b21pY1JNV0luc3QgKlJNV0kgPSBCdWlsZGVyLkNyZWF0ZUF0b21pY1JNVygKKyAgICAgIEF0b21pY1JNV0luc3Q6OlN1YiwKKyAgICAgIEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSksCisgICAgICBDb25zdGFudEludDo6Z2V0KEludDMyVHksIDEpLAorICAgICAgbGx2bTo6U2VxdWVudGlhbGx5Q29uc2lzdGVudCk7CisgICAgUk1XSS0+c2V0Vm9sYXRpbGUodHJ1ZSk7CisgICAgcmV0dXJuIFJWYWx1ZTo6Z2V0KEJ1aWxkZXIuQ3JlYXRlU3ViKFJNV0ksIENvbnN0YW50SW50OjpnZXQoSW50MzJUeSwgMSkpKTsKKyAgfQorICBjYXNlIEJ1aWx0aW46OkJJX0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ6IHsKKyAgICBBdG9taWNSTVdJbnN0ICpSTVdJID0gQnVpbGRlci5DcmVhdGVBdG9taWNSTVcoCisgICAgICBBdG9taWNSTVdJbnN0OjpBZGQsCisgICAgICBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpLAorICAgICAgRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSwKKyAgICAgIGxsdm06OlNlcXVlbnRpYWxseUNvbnNpc3RlbnQpOworICAgIFJNV0ktPnNldFZvbGF0aWxlKHRydWUpOworICAgIHJldHVybiBSVmFsdWU6OmdldChSTVdJKTsKKyAgfQogICB9CiAKICAgLy8gSWYgdGhpcyBpcyBhbiBhbGlhcyBmb3IgYSBsaWIgZnVuY3Rpb24gKGUuZy4gX19idWlsdGluX3NpbiksIGVtaXQKQEAgLTE1OTEsMTAgKzE2MzgsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXhwciAqRSkgewogICBzd2l0Y2ggKGdldFRhcmdldCgpLmdldFRyaXBsZSgpLmdldEFyY2goKSkgewogICBjYXNlIGxsdm06OlRyaXBsZTo6YWFyY2g2NDoKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OmFhcmNoNjRfYmU6CiAgICAgcmV0dXJuIEVtaXRBQXJjaDY0QnVpbHRpbkV4cHIoQnVpbHRpbklELCBFKTsKICAgY2FzZSBsbHZtOjpUcmlwbGU6OmFybToKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OmFybWViOgogICBjYXNlIGxsdm06OlRyaXBsZTo6dGh1bWI6CisgIGNhc2UgbGx2bTo6VHJpcGxlOjp0aHVtYmViOgogICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQnVpbHRpbklELCBFKTsKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OmFybTY0OgorICAgIHJldHVybiBFbWl0QVJNNjRCdWlsdGluRXhwcihCdWlsdGluSUQsIEUpOwogICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2OgogICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2XzY0OgogICAgIHJldHVybiBFbWl0WDg2QnVpbHRpbkV4cHIoQnVpbHRpbklELCBFKTsKQEAgLTE2MjQsNiArMTY3NiwxMSBAQAogICBjYXNlIE5lb25UeXBlRmxhZ3M6OkludDY0OgogICBjYXNlIE5lb25UeXBlRmxhZ3M6OlBvbHk2NDoKICAgICByZXR1cm4gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KENHRi0+SW50NjRUeSwgVjFUeSA/IDEgOiAoMSA8PCBJc1F1YWQpKTsKKyAgY2FzZSBOZW9uVHlwZUZsYWdzOjpQb2x5MTI4OgorICAgIC8vIEZJWE1FOiBpMTI4IGFuZCBmMTI4IGRvZXNuJ3QgZ2V0IGZ1bGx5IHN1cHBvcnQgaW4gQ2xhbmcgYW5kIGxsdm0uCisgICAgLy8gVGhlcmUgaXMgYSBsb3Qgb2YgaTEyOCBhbmQgZjEyOCBBUEkgbWlzc2luZy4KKyAgICAvLyBzbyB3ZSB1c2UgdjE2aTggdG8gcmVwcmVzZW50IHBvbHkxMjggYW5kIGdldCBwYXR0ZXJuIG1hdGNoZWQuCisgICAgcmV0dXJuIGxsdm06OlZlY3RvclR5cGU6OmdldChDR0YtPkludDhUeSwgMTYpOwogICBjYXNlIE5lb25UeXBlRmxhZ3M6OkZsb2F0MzI6CiAgICAgcmV0dXJuIGxsdm06OlZlY3RvclR5cGU6OmdldChDR0YtPkZsb2F0VHksIFYxVHkgPyAxIDogKDIgPDwgSXNRdWFkKSk7CiAgIGNhc2UgTmVvblR5cGVGbGFnczo6RmxvYXQ2NDoKQEAgLTE2OTQsNiArMTc1MSwzNiBAQAogICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUFTaHIoVmVjLCBTaGlmdCwgbmFtZSk7CiB9CiAKK1ZhbHVlICpDb2RlR2VuRnVuY3Rpb246OkVtaXRDb25jYXRWZWN0b3JzKFZhbHVlICpMbywgVmFsdWUgKkhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VHlwZSAqQXJnVHkpIHsKKyAgdW5zaWduZWQgTnVtRWx0cyA9IEFyZ1R5LT5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBTbWFsbFZlY3RvcjxDb25zdGFudCAqLCAxNj4gSW5kaWNlczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDIgKiBOdW1FbHRzOyArK2kpCisgICAgSW5kaWNlcy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCBpKSk7CisKKyAgQ29uc3RhbnQgKk1hc2sgPSBDb25zdGFudFZlY3Rvcjo6Z2V0KEluZGljZXMpOworICBWYWx1ZSAqTG9DYXN0ID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KExvLCBBcmdUeSk7CisgIFZhbHVlICpIaUNhc3QgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoSGksIEFyZ1R5KTsKKyAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU2h1ZmZsZVZlY3RvcihMb0Nhc3QsIEhpQ2FzdCwgTWFzaywgImNvbmNhdCIpOworfQorCitWYWx1ZSAqQ29kZUdlbkZ1bmN0aW9uOjpFbWl0RXh0cmFjdEhpZ2goVmFsdWUgKlZlYywgbGx2bTo6VHlwZSAqUmVzVHkpIHsKKyAgdW5zaWduZWQgTnVtRWx0cyA9IFJlc1R5LT5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICBTbWFsbFZlY3RvcjxDb25zdGFudCAqLCA4PiBJbmRpY2VzOworCisgIGxsdm06OlR5cGUgKkluVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoUmVzVHktPmdldFZlY3RvckVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtRWx0cyAqIDIpOworICBWYWx1ZSAqVmVjQ2FzdCA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChWZWMsIEluVHkpOworCisgIC8vIGV4dHJhY3RfaGlnaCBpcyBhIHNodWZmbGUgb24gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBpbnB1dCBpbmRpY2VzOiBFLmcuIDQsCisgIC8vIDUsIDYsIDcgaWYgd2UncmUgZXh0cmFjdGluZyA8NCB4IGkxNj4gZnJvbSA8OCB4IGkxNj4uCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1FbHRzOyArK2kpCisgICAgSW5kaWNlcy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCBOdW1FbHRzICsgaSkpOworCisgIENvbnN0YW50ICpNYXNrID0gQ29uc3RhbnRWZWN0b3I6OmdldChJbmRpY2VzKTsKKyAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU2h1ZmZsZVZlY3RvcihWZWNDYXN0LCBWZWNDYXN0LCBNYXNrLCAiY29uY2F0Iik7Cit9CisKIC8vLyBHZXRQb2ludGVlQWxpZ25tZW50IC0gR2l2ZW4gYW4gZXhwcmVzc2lvbiB3aXRoIGEgcG9pbnRlciB0eXBlLCBmaW5kIHRoZQogLy8vIGFsaWdubWVudCBvZiB0aGUgdHlwZSByZWZlcmVuY2VkIGJ5IHRoZSBwb2ludGVyLiAgU2tpcCBvdmVyIGltcGxpY2l0CiAvLy8gY2FzdHMuCkBAIC0xNzQ5LDIxICsxODM2LDEwNDQgQEAKICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEVtaXRTY2FsYXJFeHByKEFkZHIpLCBBbGlnbik7CiB9CiAKK2VudW0geworICBBZGRSZXRUeXBlID0gKDEgPDwgMCksCisgIEFkZDFBcmdUeXBlID0gKDEgPDwgMSksCisgIEFkZDJBcmdUeXBlcyA9ICgxIDw8IDIpLAorCisgIFZlY3Rvcml6ZVJldFR5cGUgPSAoMSA8PCAzKSwKKyAgVmVjdG9yaXplQXJnVHlwZXMgPSAoMSA8PCA0KSwKKworICBJbnZlbnRGbG9hdFR5cGUgPSAoMSA8PCA1KSwKKyAgVW5zaWduZWRBbHRzID0gKDEgPDwgNiksCisKKyAgVXNlNjRCaXRWZWN0b3JzID0gKDEgPDwgNyksCisgIFVzZTEyOEJpdFZlY3RvcnMgPSAoMSA8PCA4KSwKKworICBWZWN0b3JpemUxQXJnVHlwZSA9IEFkZDFBcmdUeXBlIHwgVmVjdG9yaXplQXJnVHlwZXMsCisgIFZlY3RvclJldCA9IEFkZFJldFR5cGUgfCBWZWN0b3JpemVSZXRUeXBlLAorICBWZWN0b3JSZXRHZXRBcmdzMDEgPQorICAgICAgQWRkUmV0VHlwZSB8IEFkZDJBcmdUeXBlcyB8IFZlY3Rvcml6ZVJldFR5cGUgfCBWZWN0b3JpemVBcmdUeXBlcywKKyAgRnBDbXB6TW9kaWZpZXJzID0KKyAgICAgIEFkZFJldFR5cGUgfCBWZWN0b3JpemVSZXRUeXBlIHwgQWRkMUFyZ1R5cGUgfCBJbnZlbnRGbG9hdFR5cGUKK307CisKKyBzdHJ1Y3QgTmVvbkludHJpbnNpY0luZm8geworICB1bnNpZ25lZCBCdWlsdGluSUQ7CisgIHVuc2lnbmVkIExMVk1JbnRyaW5zaWM7CisgIHVuc2lnbmVkIEFsdExMVk1JbnRyaW5zaWM7CisgIGNvbnN0IGNoYXIgKk5hbWVIaW50OworICB1bnNpZ25lZCBUeXBlTW9kaWZpZXI7CisKKyAgYm9vbCBvcGVyYXRvcjwodW5zaWduZWQgUkhTQnVpbHRpbklEKSBjb25zdCB7CisgICAgcmV0dXJuIEJ1aWx0aW5JRCA8IFJIU0J1aWx0aW5JRDsKKyAgfQorfTsKKworI2RlZmluZSBORU9OTUFQMChOYW1lQmFzZSkgXAorICB7IE5FT046OkJJX19idWlsdGluX25lb25fICMjIE5hbWVCYXNlLCAwLCAwLCAjTmFtZUJhc2UsIDAgfQorCisjZGVmaW5lIE5FT05NQVAxKE5hbWVCYXNlLCBMTFZNSW50cmluc2ljLCBUeXBlTW9kaWZpZXIpIFwKKyAgeyBORU9OOjogQklfX2J1aWx0aW5fbmVvbl8gIyMgTmFtZUJhc2UsIFwKKyAgICAgIEludHJpbnNpYzo6TExWTUludHJpbnNpYywgMCwgI05hbWVCYXNlLCBUeXBlTW9kaWZpZXIgfQorCisjZGVmaW5lIE5FT05NQVAyKE5hbWVCYXNlLCBMTFZNSW50cmluc2ljLCBBbHRMTFZNSW50cmluc2ljLCBUeXBlTW9kaWZpZXIpIFwKKyAgeyBORU9OOjogQklfX2J1aWx0aW5fbmVvbl8gIyMgTmFtZUJhc2UsIFwKKyAgICAgIEludHJpbnNpYzo6TExWTUludHJpbnNpYywgSW50cmluc2ljOjpBbHRMTFZNSW50cmluc2ljLCBcCisgICAgICAjTmFtZUJhc2UsIFR5cGVNb2RpZmllciB9CisKK3N0YXRpYyBjb25zdCBOZW9uSW50cmluc2ljSW5mbyBBQXJjaDY0U0lTREludHJpbnNpY0luZm9bXSA9IHsKKyAgTkVPTk1BUDEodmFiZGRfZjY0LCBhYXJjaDY0X25lb25fdmFiZCwgQWRkUmV0VHlwZSksCisgIE5FT05NQVAxKHZhYmRzX2YzMiwgYWFyY2g2NF9uZW9uX3ZhYmQsIEFkZFJldFR5cGUpLAorICBORU9OTUFQMSh2YWJzZF9zNjQsIGFhcmNoNjRfbmVvbl92YWJzLCAwKSwKKyAgTkVPTk1BUDEodmFkZGRfczY0LCBhYXJjaDY0X25lb25fdmFkZGRzLCAwKSwKKyAgTkVPTk1BUDEodmFkZGRfdTY0LCBhYXJjaDY0X25lb25fdmFkZGR1LCAwKSwKKyAgTkVPTk1BUDEodmFkZGx2X3MxNiwgYWFyY2g2NF9uZW9uX3NhZGRsdiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkbHZfczMyLCBhYXJjaDY0X25lb25fc2FkZGx2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGRsdl9zOCwgYWFyY2g2NF9uZW9uX3NhZGRsdiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkbHZfdTE2LCBhYXJjaDY0X25lb25fdWFkZGx2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGRsdl91MzIsIGFhcmNoNjRfbmVvbl91YWRkbHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmFkZGx2X3U4LCBhYXJjaDY0X25lb25fdWFkZGx2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGRsdnFfczE2LCBhYXJjaDY0X25lb25fc2FkZGx2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGRsdnFfczMyLCBhYXJjaDY0X25lb25fc2FkZGx2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGRsdnFfczgsIGFhcmNoNjRfbmVvbl9zYWRkbHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmFkZGx2cV91MTYsIGFhcmNoNjRfbmVvbl91YWRkbHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmFkZGx2cV91MzIsIGFhcmNoNjRfbmVvbl91YWRkbHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmFkZGx2cV91OCwgYWFyY2g2NF9uZW9uX3VhZGRsdiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkdl9mMzIsIGFhcmNoNjRfbmVvbl92cGZhZGQsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2X3MxNiwgYWFyY2g2NF9uZW9uX3ZhZGR2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2X3MzMiwgYWFyY2g2NF9uZW9uX3ZhZGR2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2X3M4LCBhYXJjaDY0X25lb25fdmFkZHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmFkZHZfdTE2LCBhYXJjaDY0X25lb25fdmFkZHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmFkZHZfdTMyLCBhYXJjaDY0X25lb25fdmFkZHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmFkZHZfdTgsIGFhcmNoNjRfbmVvbl92YWRkdiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkdnFfZjMyLCBhYXJjaDY0X25lb25fdnBmYWRkLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkdnFfZjY0LCBhYXJjaDY0X25lb25fdnBmYWRkLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkdnFfczE2LCBhYXJjaDY0X25lb25fdmFkZHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmFkZHZxX3MzMiwgYWFyY2g2NF9uZW9uX3ZhZGR2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2cV9zNjQsIGFhcmNoNjRfbmVvbl92YWRkdiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkdnFfczgsIGFhcmNoNjRfbmVvbl92YWRkdiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkdnFfdTE2LCBhYXJjaDY0X25lb25fdmFkZHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmFkZHZxX3UzMiwgYWFyY2g2NF9uZW9uX3ZhZGR2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2cV91NjQsIGFhcmNoNjRfbmVvbl92YWRkdiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkdnFfdTgsIGFhcmNoNjRfbmVvbl92YWRkdiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y2FnZWRfZjY0LCBhYXJjaDY0X25lb25fZmNhZ2UsIFZlY3RvclJldCB8IEFkZDJBcmdUeXBlcyksCisgIE5FT05NQVAxKHZjYWdlc19mMzIsIGFhcmNoNjRfbmVvbl9mY2FnZSwgVmVjdG9yUmV0IHwgQWRkMkFyZ1R5cGVzKSwKKyAgTkVPTk1BUDEodmNhZ3RkX2Y2NCwgYWFyY2g2NF9uZW9uX2ZjYWd0LCBWZWN0b3JSZXQgfCBBZGQyQXJnVHlwZXMpLAorICBORU9OTUFQMSh2Y2FndHNfZjMyLCBhYXJjaDY0X25lb25fZmNhZ3QsIFZlY3RvclJldCB8IEFkZDJBcmdUeXBlcyksCisgIE5FT05NQVAxKHZjYWxlZF9mNjQsIGFhcmNoNjRfbmVvbl9mY2FnZSwgVmVjdG9yUmV0IHwgQWRkMkFyZ1R5cGVzKSwKKyAgTkVPTk1BUDEodmNhbGVzX2YzMiwgYWFyY2g2NF9uZW9uX2ZjYWdlLCBWZWN0b3JSZXQgfCBBZGQyQXJnVHlwZXMpLAorICBORU9OTUFQMSh2Y2FsdGRfZjY0LCBhYXJjaDY0X25lb25fZmNhZ3QsIFZlY3RvclJldCB8IEFkZDJBcmdUeXBlcyksCisgIE5FT05NQVAxKHZjYWx0c19mMzIsIGFhcmNoNjRfbmVvbl9mY2FndCwgVmVjdG9yUmV0IHwgQWRkMkFyZ1R5cGVzKSwKKyAgTkVPTk1BUDEodmNlcWRfZjY0LCBhYXJjaDY0X25lb25fZmNlcSwgVmVjdG9yUmV0IHwgQWRkMkFyZ1R5cGVzKSwKKyAgTkVPTk1BUDEodmNlcWRfczY0LCBhYXJjaDY0X25lb25fdmNlcSwgVmVjdG9yUmV0R2V0QXJnczAxKSwKKyAgTkVPTk1BUDEodmNlcWRfdTY0LCBhYXJjaDY0X25lb25fdmNlcSwgVmVjdG9yUmV0R2V0QXJnczAxKSwKKyAgTkVPTk1BUDEodmNlcXNfZjMyLCBhYXJjaDY0X25lb25fZmNlcSwgVmVjdG9yUmV0IHwgQWRkMkFyZ1R5cGVzKSwKKyAgTkVPTk1BUDEodmNlcXpkX2Y2NCwgYWFyY2g2NF9uZW9uX2ZjZXEsIEZwQ21wek1vZGlmaWVycyksCisgIE5FT05NQVAxKHZjZXF6ZF9zNjQsIGFhcmNoNjRfbmVvbl92Y2VxLCBWZWN0b3JSZXRHZXRBcmdzMDEpLAorICBORU9OTUFQMSh2Y2VxemRfdTY0LCBhYXJjaDY0X25lb25fdmNlcSwgVmVjdG9yUmV0R2V0QXJnczAxKSwKKyAgTkVPTk1BUDEodmNlcXpzX2YzMiwgYWFyY2g2NF9uZW9uX2ZjZXEsIEZwQ21wek1vZGlmaWVycyksCisgIE5FT05NQVAxKHZjZ2VkX2Y2NCwgYWFyY2g2NF9uZW9uX2ZjZ2UsIFZlY3RvclJldCB8IEFkZDJBcmdUeXBlcyksCisgIE5FT05NQVAxKHZjZ2VkX3M2NCwgYWFyY2g2NF9uZW9uX3ZjZ2UsIFZlY3RvclJldEdldEFyZ3MwMSksCisgIE5FT05NQVAxKHZjZ2VkX3U2NCwgYWFyY2g2NF9uZW9uX3ZjaHMsIFZlY3RvclJldEdldEFyZ3MwMSksCisgIE5FT05NQVAxKHZjZ2VzX2YzMiwgYWFyY2g2NF9uZW9uX2ZjZ2UsIFZlY3RvclJldCB8IEFkZDJBcmdUeXBlcyksCisgIE5FT05NQVAxKHZjZ2V6ZF9mNjQsIGFhcmNoNjRfbmVvbl9mY2dlLCBGcENtcHpNb2RpZmllcnMpLAorICBORU9OTUFQMSh2Y2dlemRfczY0LCBhYXJjaDY0X25lb25fdmNnZSwgVmVjdG9yUmV0R2V0QXJnczAxKSwKKyAgTkVPTk1BUDEodmNnZXpzX2YzMiwgYWFyY2g2NF9uZW9uX2ZjZ2UsIEZwQ21wek1vZGlmaWVycyksCisgIE5FT05NQVAxKHZjZ3RkX2Y2NCwgYWFyY2g2NF9uZW9uX2ZjZ3QsIFZlY3RvclJldCB8IEFkZDJBcmdUeXBlcyksCisgIE5FT05NQVAxKHZjZ3RkX3M2NCwgYWFyY2g2NF9uZW9uX3ZjZ3QsIFZlY3RvclJldEdldEFyZ3MwMSksCisgIE5FT05NQVAxKHZjZ3RkX3U2NCwgYWFyY2g2NF9uZW9uX3ZjaGksIFZlY3RvclJldEdldEFyZ3MwMSksCisgIE5FT05NQVAxKHZjZ3RzX2YzMiwgYWFyY2g2NF9uZW9uX2ZjZ3QsIFZlY3RvclJldCB8IEFkZDJBcmdUeXBlcyksCisgIE5FT05NQVAxKHZjZ3R6ZF9mNjQsIGFhcmNoNjRfbmVvbl9mY2d0LCBGcENtcHpNb2RpZmllcnMpLAorICBORU9OTUFQMSh2Y2d0emRfczY0LCBhYXJjaDY0X25lb25fdmNndCwgVmVjdG9yUmV0R2V0QXJnczAxKSwKKyAgTkVPTk1BUDEodmNndHpzX2YzMiwgYWFyY2g2NF9uZW9uX2ZjZ3QsIEZwQ21wek1vZGlmaWVycyksCisgIE5FT05NQVAxKHZjbGVkX2Y2NCwgYWFyY2g2NF9uZW9uX2ZjZ2UsIFZlY3RvclJldCB8IEFkZDJBcmdUeXBlcyksCisgIE5FT05NQVAxKHZjbGVkX3M2NCwgYWFyY2g2NF9uZW9uX3ZjZ2UsIFZlY3RvclJldEdldEFyZ3MwMSksCisgIE5FT05NQVAxKHZjbGVkX3U2NCwgYWFyY2g2NF9uZW9uX3ZjaHMsIFZlY3RvclJldEdldEFyZ3MwMSksCisgIE5FT05NQVAxKHZjbGVzX2YzMiwgYWFyY2g2NF9uZW9uX2ZjZ2UsIFZlY3RvclJldCB8IEFkZDJBcmdUeXBlcyksCisgIE5FT05NQVAxKHZjbGV6ZF9mNjQsIGFhcmNoNjRfbmVvbl9mY2xleiwgRnBDbXB6TW9kaWZpZXJzKSwKKyAgTkVPTk1BUDEodmNsZXpkX3M2NCwgYWFyY2g2NF9uZW9uX3ZjbGV6LCBWZWN0b3JSZXRHZXRBcmdzMDEpLAorICBORU9OTUFQMSh2Y2xlenNfZjMyLCBhYXJjaDY0X25lb25fZmNsZXosIEZwQ21wek1vZGlmaWVycyksCisgIE5FT05NQVAxKHZjbHRkX2Y2NCwgYWFyY2g2NF9uZW9uX2ZjZ3QsIFZlY3RvclJldCB8IEFkZDJBcmdUeXBlcyksCisgIE5FT05NQVAxKHZjbHRkX3M2NCwgYWFyY2g2NF9uZW9uX3ZjZ3QsIFZlY3RvclJldEdldEFyZ3MwMSksCisgIE5FT05NQVAxKHZjbHRkX3U2NCwgYWFyY2g2NF9uZW9uX3ZjaGksIFZlY3RvclJldEdldEFyZ3MwMSksCisgIE5FT05NQVAxKHZjbHRzX2YzMiwgYWFyY2g2NF9uZW9uX2ZjZ3QsIFZlY3RvclJldCB8IEFkZDJBcmdUeXBlcyksCisgIE5FT05NQVAxKHZjbHR6ZF9mNjQsIGFhcmNoNjRfbmVvbl9mY2x0eiwgRnBDbXB6TW9kaWZpZXJzKSwKKyAgTkVPTk1BUDEodmNsdHpkX3M2NCwgYWFyY2g2NF9uZW9uX3ZjbHR6LCBWZWN0b3JSZXRHZXRBcmdzMDEpLAorICBORU9OTUFQMSh2Y2x0enNfZjMyLCBhYXJjaDY0X25lb25fZmNsdHosIEZwQ21wek1vZGlmaWVycyksCisgIE5FT05NQVAxKHZjdnRhZF9zNjRfZjY0LCBhYXJjaDY0X25lb25fZmN2dGFzLCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRhZF91NjRfZjY0LCBhYXJjaDY0X25lb25fZmN2dGF1LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRhc19zMzJfZjMyLCBhYXJjaDY0X25lb25fZmN2dGFzLCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRhc191MzJfZjMyLCBhYXJjaDY0X25lb25fZmN2dGF1LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRkX2Y2NF9zNjQsIGFhcmNoNjRfbmVvbl92Y3Z0aW50MmZwcywgQWRkUmV0VHlwZSB8IFZlY3Rvcml6ZTFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dGRfZjY0X3U2NCwgYWFyY2g2NF9uZW9uX3ZjdnRpbnQyZnB1LCBBZGRSZXRUeXBlIHwgVmVjdG9yaXplMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0ZF9uX2Y2NF9zNjQsIGFhcmNoNjRfbmVvbl92Y3Z0ZnhzMmZwX24sIEFkZFJldFR5cGUgfCBWZWN0b3JpemUxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRkX25fZjY0X3U2NCwgYWFyY2g2NF9uZW9uX3ZjdnRmeHUyZnBfbiwgQWRkUmV0VHlwZSB8IFZlY3Rvcml6ZTFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dGRfbl9zNjRfZjY0LCBhYXJjaDY0X25lb25fdmN2dGZwMmZ4c19uLCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRkX25fdTY0X2Y2NCwgYWFyY2g2NF9uZW9uX3ZjdnRmcDJmeHVfbiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0ZF9zNjRfZjY0LCBhYXJjaDY0X25lb25fZmN2dHpzLCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRkX3U2NF9mNjQsIGFhcmNoNjRfbmVvbl9mY3Z0enUsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dG1kX3M2NF9mNjQsIGFhcmNoNjRfbmVvbl9mY3Z0bXMsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dG1kX3U2NF9mNjQsIGFhcmNoNjRfbmVvbl9mY3Z0bXUsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dG1zX3MzMl9mMzIsIGFhcmNoNjRfbmVvbl9mY3Z0bXMsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dG1zX3UzMl9mMzIsIGFhcmNoNjRfbmVvbl9mY3Z0bXUsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dG5kX3M2NF9mNjQsIGFhcmNoNjRfbmVvbl9mY3Z0bnMsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dG5kX3U2NF9mNjQsIGFhcmNoNjRfbmVvbl9mY3Z0bnUsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dG5zX3MzMl9mMzIsIGFhcmNoNjRfbmVvbl9mY3Z0bnMsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dG5zX3UzMl9mMzIsIGFhcmNoNjRfbmVvbl9mY3Z0bnUsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dHBkX3M2NF9mNjQsIGFhcmNoNjRfbmVvbl9mY3Z0cHMsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dHBkX3U2NF9mNjQsIGFhcmNoNjRfbmVvbl9mY3Z0cHUsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dHBzX3MzMl9mMzIsIGFhcmNoNjRfbmVvbl9mY3Z0cHMsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dHBzX3UzMl9mMzIsIGFhcmNoNjRfbmVvbl9mY3Z0cHUsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dHNfZjMyX3MzMiwgYWFyY2g2NF9uZW9uX3ZjdnRpbnQyZnBzLCBBZGRSZXRUeXBlIHwgVmVjdG9yaXplMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0c19mMzJfdTMyLCBhYXJjaDY0X25lb25fdmN2dGludDJmcHUsIEFkZFJldFR5cGUgfCBWZWN0b3JpemUxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRzX25fZjMyX3MzMiwgYWFyY2g2NF9uZW9uX3ZjdnRmeHMyZnBfbiwgQWRkUmV0VHlwZSB8IFZlY3Rvcml6ZTFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dHNfbl9mMzJfdTMyLCBhYXJjaDY0X25lb25fdmN2dGZ4dTJmcF9uLCBBZGRSZXRUeXBlIHwgVmVjdG9yaXplMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0c19uX3MzMl9mMzIsIGFhcmNoNjRfbmVvbl92Y3Z0ZnAyZnhzX24sIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dHNfbl91MzJfZjMyLCBhYXJjaDY0X25lb25fdmN2dGZwMmZ4dV9uLCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRzX3MzMl9mMzIsIGFhcmNoNjRfbmVvbl9mY3Z0enMsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dHNfdTMyX2YzMiwgYWFyY2g2NF9uZW9uX2ZjdnR6dSwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0eGRfZjMyX2Y2NCwgYWFyY2g2NF9uZW9uX2ZjdnR4biwgMCksCisgIE5FT05NQVAwKHZkdXBiX2xhbmVfaTgpLAorICBORU9OTUFQMCh2ZHVwYl9sYW5lcV9pOCksCisgIE5FT05NQVAwKHZkdXBkX2xhbmVfZjY0KSwKKyAgTkVPTk1BUDAodmR1cGRfbGFuZV9pNjQpLAorICBORU9OTUFQMCh2ZHVwZF9sYW5lcV9mNjQpLAorICBORU9OTUFQMCh2ZHVwZF9sYW5lcV9pNjQpLAorICBORU9OTUFQMCh2ZHVwaF9sYW5lX2kxNiksCisgIE5FT05NQVAwKHZkdXBoX2xhbmVxX2kxNiksCisgIE5FT05NQVAwKHZkdXBzX2xhbmVfZjMyKSwKKyAgTkVPTk1BUDAodmR1cHNfbGFuZV9pMzIpLAorICBORU9OTUFQMCh2ZHVwc19sYW5lcV9mMzIpLAorICBORU9OTUFQMCh2ZHVwc19sYW5lcV9pMzIpLAorICBORU9OTUFQMCh2Zm1hZF9sYW5lX2Y2NCksCisgIE5FT05NQVAwKHZmbWFkX2xhbmVxX2Y2NCksCisgIE5FT05NQVAwKHZmbWFzX2xhbmVfZjMyKSwKKyAgTkVPTk1BUDAodmZtYXNfbGFuZXFfZjMyKSwKKyAgTkVPTk1BUDAodmdldF9sYW5lX2YzMiksCisgIE5FT05NQVAwKHZnZXRfbGFuZV9mNjQpLAorICBORU9OTUFQMCh2Z2V0X2xhbmVfaTE2KSwKKyAgTkVPTk1BUDAodmdldF9sYW5lX2kzMiksCisgIE5FT05NQVAwKHZnZXRfbGFuZV9pNjQpLAorICBORU9OTUFQMCh2Z2V0X2xhbmVfaTgpLAorICBORU9OTUFQMCh2Z2V0cV9sYW5lX2YzMiksCisgIE5FT05NQVAwKHZnZXRxX2xhbmVfZjY0KSwKKyAgTkVPTk1BUDAodmdldHFfbGFuZV9pMTYpLAorICBORU9OTUFQMCh2Z2V0cV9sYW5lX2kzMiksCisgIE5FT05NQVAwKHZnZXRxX2xhbmVfaTY0KSwKKyAgTkVPTk1BUDAodmdldHFfbGFuZV9pOCksCisgIE5FT05NQVAxKHZtYXhubXZfZjMyLCBhYXJjaDY0X25lb25fdnBmbWF4bm0sIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtYXhubXZxX2YzMiwgYWFyY2g2NF9uZW9uX3ZtYXhubXYsIDApLAorICBORU9OTUFQMSh2bWF4bm12cV9mNjQsIGFhcmNoNjRfbmVvbl92cGZtYXhubSwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1heHZfZjMyLCBhYXJjaDY0X25lb25fdnBtYXgsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtYXh2X3MxNiwgYWFyY2g2NF9uZW9uX3NtYXh2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtYXh2X3MzMiwgYWFyY2g2NF9uZW9uX3NtYXh2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtYXh2X3M4LCBhYXJjaDY0X25lb25fc21heHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1heHZfdTE2LCBhYXJjaDY0X25lb25fdW1heHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1heHZfdTMyLCBhYXJjaDY0X25lb25fdW1heHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1heHZfdTgsIGFhcmNoNjRfbmVvbl91bWF4diwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWF4dnFfZjMyLCBhYXJjaDY0X25lb25fdm1heHYsIDApLAorICBORU9OTUFQMSh2bWF4dnFfZjY0LCBhYXJjaDY0X25lb25fdnBtYXgsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtYXh2cV9zMTYsIGFhcmNoNjRfbmVvbl9zbWF4diwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWF4dnFfczMyLCBhYXJjaDY0X25lb25fc21heHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1heHZxX3M4LCBhYXJjaDY0X25lb25fc21heHYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1heHZxX3UxNiwgYWFyY2g2NF9uZW9uX3VtYXh2LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtYXh2cV91MzIsIGFhcmNoNjRfbmVvbl91bWF4diwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWF4dnFfdTgsIGFhcmNoNjRfbmVvbl91bWF4diwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWlubm12X2YzMiwgYWFyY2g2NF9uZW9uX3ZwZm1pbm5tLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWlubm12cV9mMzIsIGFhcmNoNjRfbmVvbl92bWlubm12LCAwKSwKKyAgTkVPTk1BUDEodm1pbm5tdnFfZjY0LCBhYXJjaDY0X25lb25fdnBmbWlubm0sIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtaW52X2YzMiwgYWFyY2g2NF9uZW9uX3ZwbWluLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWludl9zMTYsIGFhcmNoNjRfbmVvbl9zbWludiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWludl9zMzIsIGFhcmNoNjRfbmVvbl9zbWludiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWludl9zOCwgYWFyY2g2NF9uZW9uX3NtaW52LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtaW52X3UxNiwgYWFyY2g2NF9uZW9uX3VtaW52LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtaW52X3UzMiwgYWFyY2g2NF9uZW9uX3VtaW52LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtaW52X3U4LCBhYXJjaDY0X25lb25fdW1pbnYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1pbnZxX2YzMiwgYWFyY2g2NF9uZW9uX3ZtaW52LCAwKSwKKyAgTkVPTk1BUDEodm1pbnZxX2Y2NCwgYWFyY2g2NF9uZW9uX3ZwbWluLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWludnFfczE2LCBhYXJjaDY0X25lb25fc21pbnYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1pbnZxX3MzMiwgYWFyY2g2NF9uZW9uX3NtaW52LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtaW52cV9zOCwgYWFyY2g2NF9uZW9uX3NtaW52LCBWZWN0b3JSZXQgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtaW52cV91MTYsIGFhcmNoNjRfbmVvbl91bWludiwgVmVjdG9yUmV0IHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWludnFfdTMyLCBhYXJjaDY0X25lb25fdW1pbnYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1pbnZxX3U4LCBhYXJjaDY0X25lb25fdW1pbnYsIFZlY3RvclJldCB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDAodm11bF9uX2Y2NCksCisgIE5FT05NQVAxKHZtdWxsX3A2NCwgYWFyY2g2NF9uZW9uX3ZtdWxsX3A2NCwgMCksCisgIE5FT05NQVAwKHZtdWx4ZF9mNjQpLAorICBORU9OTUFQMCh2bXVseHNfZjMyKSwKKyAgTkVPTk1BUDEodm5lZ2RfczY0LCBhYXJjaDY0X25lb25fdm5lZywgMCksCisgIE5FT05NQVAxKHZwYWRkZF9mNjQsIGFhcmNoNjRfbmVvbl92cGZhZGQsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZwYWRkZF9zNjQsIGFhcmNoNjRfbmVvbl92cGFkZCwgMCksCisgIE5FT05NQVAxKHZwYWRkZF91NjQsIGFhcmNoNjRfbmVvbl92cGFkZCwgMCksCisgIE5FT05NQVAxKHZwYWRkc19mMzIsIGFhcmNoNjRfbmVvbl92cGZhZGQsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZwbWF4bm1xZF9mNjQsIGFhcmNoNjRfbmVvbl92cGZtYXhubSwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnBtYXhubXNfZjMyLCBhYXJjaDY0X25lb25fdnBmbWF4bm0sIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZwbWF4cWRfZjY0LCBhYXJjaDY0X25lb25fdnBtYXgsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZwbWF4c19mMzIsIGFhcmNoNjRfbmVvbl92cG1heCwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnBtaW5ubXFkX2Y2NCwgYWFyY2g2NF9uZW9uX3ZwZm1pbm5tLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cG1pbm5tc19mMzIsIGFhcmNoNjRfbmVvbl92cGZtaW5ubSwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnBtaW5xZF9mNjQsIGFhcmNoNjRfbmVvbl92cG1pbiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnBtaW5zX2YzMiwgYWFyY2g2NF9uZW9uX3ZwbWluLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cWFic2JfczgsIGFybV9uZW9uX3ZxYWJzLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cWFic2RfczY0LCBhcm1fbmVvbl92cWFicywgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFhYnNoX3MxNiwgYXJtX25lb25fdnFhYnMsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxYWJzc19zMzIsIGFybV9uZW9uX3ZxYWJzLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cWFkZGJfczgsIGFybV9uZW9uX3ZxYWRkcywgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFhZGRiX3U4LCBhcm1fbmVvbl92cWFkZHUsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxYWRkZF9zNjQsIGFybV9uZW9uX3ZxYWRkcywgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFhZGRkX3U2NCwgYXJtX25lb25fdnFhZGR1LCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cWFkZGhfczE2LCBhcm1fbmVvbl92cWFkZHMsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxYWRkaF91MTYsIGFybV9uZW9uX3ZxYWRkdSwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFhZGRzX3MzMiwgYXJtX25lb25fdnFhZGRzLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cWFkZHNfdTMyLCBhcm1fbmVvbl92cWFkZHUsIFZlY3RvclJldCksCisgIE5FT05NQVAwKHZxZG1sYWxoX2xhbmVfczE2KSwKKyAgTkVPTk1BUDAodnFkbWxhbGhfbGFuZXFfczE2KSwKKyAgTkVPTk1BUDEodnFkbWxhbGhfczE2LCBhYXJjaDY0X25lb25fdnFkbWxhbCwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDAodnFkbWxhbHNfbGFuZV9zMzIpLAorICBORU9OTUFQMCh2cWRtbGFsc19sYW5lcV9zMzIpLAorICBORU9OTUFQMSh2cWRtbGFsc19zMzIsIGFhcmNoNjRfbmVvbl92cWRtbGFsLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMCh2cWRtbHNsaF9sYW5lX3MxNiksCisgIE5FT05NQVAwKHZxZG1sc2xoX2xhbmVxX3MxNiksCisgIE5FT05NQVAxKHZxZG1sc2xoX3MxNiwgYWFyY2g2NF9uZW9uX3ZxZG1sc2wsIFZlY3RvclJldCksCisgIE5FT05NQVAwKHZxZG1sc2xzX2xhbmVfczMyKSwKKyAgTkVPTk1BUDAodnFkbWxzbHNfbGFuZXFfczMyKSwKKyAgTkVPTk1BUDEodnFkbWxzbHNfczMyLCBhYXJjaDY0X25lb25fdnFkbWxzbCwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFkbXVsaGhfczE2LCBhcm1fbmVvbl92cWRtdWxoLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cWRtdWxoc19zMzIsIGFybV9uZW9uX3ZxZG11bGgsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxZG11bGxoX3MxNiwgYXJtX25lb25fdnFkbXVsbCwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFkbXVsbHNfczMyLCBhcm1fbmVvbl92cWRtdWxsLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cW1vdm5kX3M2NCwgYXJtX25lb25fdnFtb3ZucywgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFtb3ZuZF91NjQsIGFybV9uZW9uX3ZxbW92bnUsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxbW92bmhfczE2LCBhcm1fbmVvbl92cW1vdm5zLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cW1vdm5oX3UxNiwgYXJtX25lb25fdnFtb3ZudSwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFtb3Zuc19zMzIsIGFybV9uZW9uX3ZxbW92bnMsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxbW92bnNfdTMyLCBhcm1fbmVvbl92cW1vdm51LCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cW1vdnVuZF9zNjQsIGFybV9uZW9uX3ZxbW92bnN1LCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cW1vdnVuaF9zMTYsIGFybV9uZW9uX3ZxbW92bnN1LCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cW1vdnVuc19zMzIsIGFybV9uZW9uX3ZxbW92bnN1LCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cW5lZ2JfczgsIGFybV9uZW9uX3ZxbmVnLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cW5lZ2RfczY0LCBhcm1fbmVvbl92cW5lZywgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFuZWdoX3MxNiwgYXJtX25lb25fdnFuZWcsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxbmVnc19zMzIsIGFybV9uZW9uX3ZxbmVnLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXJkbXVsaGhfczE2LCBhcm1fbmVvbl92cXJkbXVsaCwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFyZG11bGhzX3MzMiwgYXJtX25lb25fdnFyZG11bGgsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxcnNobGJfczgsIGFhcmNoNjRfbmVvbl92cXJzaGxzLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXJzaGxiX3U4LCBhYXJjaDY0X25lb25fdnFyc2hsdSwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFyc2hsZF9zNjQsIGFhcmNoNjRfbmVvbl92cXJzaGxzLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXJzaGxkX3U2NCwgYWFyY2g2NF9uZW9uX3ZxcnNobHUsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxcnNobGhfczE2LCBhYXJjaDY0X25lb25fdnFyc2hscywgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFyc2hsaF91MTYsIGFhcmNoNjRfbmVvbl92cXJzaGx1LCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXJzaGxzX3MzMiwgYWFyY2g2NF9uZW9uX3ZxcnNobHMsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxcnNobHNfdTMyLCBhYXJjaDY0X25lb25fdnFyc2hsdSwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFyc2hybmRfbl9zNjQsIGFhcmNoNjRfbmVvbl92c3Fyc2hybiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFyc2hybmRfbl91NjQsIGFhcmNoNjRfbmVvbl92dXFyc2hybiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFyc2hybmhfbl9zMTYsIGFhcmNoNjRfbmVvbl92c3Fyc2hybiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFyc2hybmhfbl91MTYsIGFhcmNoNjRfbmVvbl92dXFyc2hybiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFyc2hybnNfbl9zMzIsIGFhcmNoNjRfbmVvbl92c3Fyc2hybiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFyc2hybnNfbl91MzIsIGFhcmNoNjRfbmVvbl92dXFyc2hybiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFyc2hydW5kX25fczY0LCBhYXJjaDY0X25lb25fdnNxcnNocnVuLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXJzaHJ1bmhfbl9zMTYsIGFhcmNoNjRfbmVvbl92c3Fyc2hydW4sIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxcnNocnVuc19uX3MzMiwgYWFyY2g2NF9uZW9uX3ZzcXJzaHJ1biwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzaGxiX25fczgsIGFhcmNoNjRfbmVvbl92cXNobHNfbiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzaGxiX25fdTgsIGFhcmNoNjRfbmVvbl92cXNobHVfbiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzaGxiX3M4LCBhYXJjaDY0X25lb25fdnFzaGxzLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXNobGJfdTgsIGFhcmNoNjRfbmVvbl92cXNobHUsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc2hsZF9uX3M2NCwgYWFyY2g2NF9uZW9uX3Zxc2hsc19uLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXNobGRfbl91NjQsIGFhcmNoNjRfbmVvbl92cXNobHVfbiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzaGxkX3M2NCwgYWFyY2g2NF9uZW9uX3Zxc2hscywgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzaGxkX3U2NCwgYWFyY2g2NF9uZW9uX3Zxc2hsdSwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzaGxoX25fczE2LCBhYXJjaDY0X25lb25fdnFzaGxzX24sIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc2hsaF9uX3UxNiwgYWFyY2g2NF9uZW9uX3Zxc2hsdV9uLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXNobGhfczE2LCBhYXJjaDY0X25lb25fdnFzaGxzLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXNobGhfdTE2LCBhYXJjaDY0X25lb25fdnFzaGx1LCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXNobHNfbl9zMzIsIGFhcmNoNjRfbmVvbl92cXNobHNfbiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzaGxzX25fdTMyLCBhYXJjaDY0X25lb25fdnFzaGx1X24sIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc2hsc19zMzIsIGFhcmNoNjRfbmVvbl92cXNobHMsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc2hsc191MzIsIGFhcmNoNjRfbmVvbl92cXNobHUsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc2hsdWJfbl9zOCwgYWFyY2g2NF9uZW9uX3ZzcXNobHUsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc2hsdWRfbl9zNjQsIGFhcmNoNjRfbmVvbl92c3FzaGx1LCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXNobHVoX25fczE2LCBhYXJjaDY0X25lb25fdnNxc2hsdSwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzaGx1c19uX3MzMiwgYWFyY2g2NF9uZW9uX3ZzcXNobHUsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc2hybmRfbl9zNjQsIGFhcmNoNjRfbmVvbl92c3FzaHJuLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXNocm5kX25fdTY0LCBhYXJjaDY0X25lb25fdnVxc2hybiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzaHJuaF9uX3MxNiwgYWFyY2g2NF9uZW9uX3ZzcXNocm4sIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc2hybmhfbl91MTYsIGFhcmNoNjRfbmVvbl92dXFzaHJuLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXNocm5zX25fczMyLCBhYXJjaDY0X25lb25fdnNxc2hybiwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzaHJuc19uX3UzMiwgYWFyY2g2NF9uZW9uX3Z1cXNocm4sIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc2hydW5kX25fczY0LCBhYXJjaDY0X25lb25fdnNxc2hydW4sIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc2hydW5oX25fczE2LCBhYXJjaDY0X25lb25fdnNxc2hydW4sIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc2hydW5zX25fczMyLCBhYXJjaDY0X25lb25fdnNxc2hydW4sIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc3ViYl9zOCwgYXJtX25lb25fdnFzdWJzLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXN1YmJfdTgsIGFybV9uZW9uX3Zxc3VidSwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzdWJkX3M2NCwgYXJtX25lb25fdnFzdWJzLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXN1YmRfdTY0LCBhcm1fbmVvbl92cXN1YnUsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc3ViaF9zMTYsIGFybV9uZW9uX3Zxc3VicywgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnFzdWJoX3UxNiwgYXJtX25lb25fdnFzdWJ1LCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cXN1YnNfczMyLCBhcm1fbmVvbl92cXN1YnMsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZxc3Vic191MzIsIGFybV9uZW9uX3Zxc3VidSwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnJlY3BlZF9mNjQsIGFhcmNoNjRfbmVvbl92cmVjcGUsIEFkZFJldFR5cGUpLAorICBORU9OTUFQMSh2cmVjcGVzX2YzMiwgYWFyY2g2NF9uZW9uX3ZyZWNwZSwgQWRkUmV0VHlwZSksCisgIE5FT05NQVAxKHZyZWNwc2RfZjY0LCBhYXJjaDY0X25lb25fdnJlY3BzLCBBZGRSZXRUeXBlKSwKKyAgTkVPTk1BUDEodnJlY3Bzc19mMzIsIGFhcmNoNjRfbmVvbl92cmVjcHMsIEFkZFJldFR5cGUpLAorICBORU9OTUFQMSh2cmVjcHhkX2Y2NCwgYWFyY2g2NF9uZW9uX3ZyZWNweCwgQWRkUmV0VHlwZSksCisgIE5FT05NQVAxKHZyZWNweHNfZjMyLCBhYXJjaDY0X25lb25fdnJlY3B4LCBBZGRSZXRUeXBlKSwKKyAgTkVPTk1BUDEodnJzaGxkX3M2NCwgYWFyY2g2NF9uZW9uX3Zyc2hsZHMsIDApLAorICBORU9OTUFQMSh2cnNobGRfdTY0LCBhYXJjaDY0X25lb25fdnJzaGxkdSwgMCksCisgIE5FT05NQVAxKHZyc2hyZF9uX3M2NCwgYWFyY2g2NF9uZW9uX3ZzcnNociwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnJzaHJkX25fdTY0LCBhYXJjaDY0X25lb25fdnVyc2hyLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2cnNxcnRlZF9mNjQsIGFhcmNoNjRfbmVvbl92cnNxcnRlLCBBZGRSZXRUeXBlKSwKKyAgTkVPTk1BUDEodnJzcXJ0ZXNfZjMyLCBhYXJjaDY0X25lb25fdnJzcXJ0ZSwgQWRkUmV0VHlwZSksCisgIE5FT05NQVAxKHZyc3FydHNkX2Y2NCwgYWFyY2g2NF9uZW9uX3Zyc3FydHMsIEFkZFJldFR5cGUpLAorICBORU9OTUFQMSh2cnNxcnRzc19mMzIsIGFhcmNoNjRfbmVvbl92cnNxcnRzLCBBZGRSZXRUeXBlKSwKKyAgTkVPTk1BUDEodnJzcmFkX25fczY0LCBhYXJjaDY0X25lb25fdnJzcmFkc19uLCAwKSwKKyAgTkVPTk1BUDEodnJzcmFkX25fdTY0LCBhYXJjaDY0X25lb25fdnJzcmFkdV9uLCAwKSwKKyAgTkVPTk1BUDAodnNldF9sYW5lX2YzMiksCisgIE5FT05NQVAwKHZzZXRfbGFuZV9mNjQpLAorICBORU9OTUFQMCh2c2V0X2xhbmVfaTE2KSwKKyAgTkVPTk1BUDAodnNldF9sYW5lX2kzMiksCisgIE5FT05NQVAwKHZzZXRfbGFuZV9pNjQpLAorICBORU9OTUFQMCh2c2V0X2xhbmVfaTgpLAorICBORU9OTUFQMCh2c2V0cV9sYW5lX2YzMiksCisgIE5FT05NQVAwKHZzZXRxX2xhbmVfZjY0KSwKKyAgTkVPTk1BUDAodnNldHFfbGFuZV9pMTYpLAorICBORU9OTUFQMCh2c2V0cV9sYW5lX2kzMiksCisgIE5FT05NQVAwKHZzZXRxX2xhbmVfaTY0KSwKKyAgTkVPTk1BUDAodnNldHFfbGFuZV9pOCksCisgIE5FT05NQVAxKHZzaGExY3FfdTMyLCBhcm1fbmVvbl9zaGExYywgMCksCisgIE5FT05NQVAxKHZzaGExaF91MzIsIGFybV9uZW9uX3NoYTFoLCAwKSwKKyAgTkVPTk1BUDEodnNoYTFtcV91MzIsIGFybV9uZW9uX3NoYTFtLCAwKSwKKyAgTkVPTk1BUDEodnNoYTFwcV91MzIsIGFybV9uZW9uX3NoYTFwLCAwKSwKKyAgTkVPTk1BUDEodnNobGRfbl9zNjQsIGFhcmNoNjRfbmVvbl92c2hsZF9uLCAwKSwKKyAgTkVPTk1BUDEodnNobGRfbl91NjQsIGFhcmNoNjRfbmVvbl92c2hsZF9uLCAwKSwKKyAgTkVPTk1BUDEodnNobGRfczY0LCBhYXJjaDY0X25lb25fdnNobGRzLCAwKSwKKyAgTkVPTk1BUDEodnNobGRfdTY0LCBhYXJjaDY0X25lb25fdnNobGR1LCAwKSwKKyAgTkVPTk1BUDEodnNocmRfbl9zNjQsIGFhcmNoNjRfbmVvbl92c2hyZHNfbiwgMCksCisgIE5FT05NQVAxKHZzaHJkX25fdTY0LCBhYXJjaDY0X25lb25fdnNocmR1X24sIDApLAorICBORU9OTUFQMSh2c2xpZF9uX3M2NCwgYWFyY2g2NF9uZW9uX3ZzbGksIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZzbGlkX25fdTY0LCBhYXJjaDY0X25lb25fdnNsaSwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnNxYWRkYl91OCwgYWFyY2g2NF9uZW9uX3ZzcWFkZCwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnNxYWRkZF91NjQsIGFhcmNoNjRfbmVvbl92c3FhZGQsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZzcWFkZGhfdTE2LCBhYXJjaDY0X25lb25fdnNxYWRkLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2c3FhZGRzX3UzMiwgYWFyY2g2NF9uZW9uX3ZzcWFkZCwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnNyYWRfbl9zNjQsIGFhcmNoNjRfbmVvbl92c3JhZHNfbiwgMCksCisgIE5FT05NQVAxKHZzcmFkX25fdTY0LCBhYXJjaDY0X25lb25fdnNyYWR1X24sIDApLAorICBORU9OTUFQMSh2c3JpZF9uX3M2NCwgYWFyY2g2NF9uZW9uX3ZzcmksIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZzcmlkX25fdTY0LCBhYXJjaDY0X25lb25fdnNyaSwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnN1YmRfczY0LCBhYXJjaDY0X25lb25fdnN1YmRzLCAwKSwKKyAgTkVPTk1BUDEodnN1YmRfdTY0LCBhYXJjaDY0X25lb25fdnN1YmR1LCAwKSwKKyAgTkVPTk1BUDEodnRzdGRfczY0LCBhYXJjaDY0X25lb25fdnRzdGQsIFZlY3RvclJldEdldEFyZ3MwMSksCisgIE5FT05NQVAxKHZ0c3RkX3U2NCwgYWFyY2g2NF9uZW9uX3Z0c3RkLCBWZWN0b3JSZXRHZXRBcmdzMDEpLAorICBORU9OTUFQMSh2dXFhZGRiX3M4LCBhYXJjaDY0X25lb25fdnVxYWRkLCBWZWN0b3JSZXQpLAorICBORU9OTUFQMSh2dXFhZGRkX3M2NCwgYWFyY2g2NF9uZW9uX3Z1cWFkZCwgVmVjdG9yUmV0KSwKKyAgTkVPTk1BUDEodnVxYWRkaF9zMTYsIGFhcmNoNjRfbmVvbl92dXFhZGQsIFZlY3RvclJldCksCisgIE5FT05NQVAxKHZ1cWFkZHNfczMyLCBhYXJjaDY0X25lb25fdnVxYWRkLCBWZWN0b3JSZXQpCit9OworCitzdGF0aWMgTmVvbkludHJpbnNpY0luZm8gQVJNU0lNREludHJpbnNpY01hcCBbXSA9IHsKKyAgTkVPTk1BUDIodmFiZF92LCBhcm1fbmVvbl92YWJkdSwgYXJtX25lb25fdmFiZHMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodmFiZHFfdiwgYXJtX25lb25fdmFiZHUsIGFybV9uZW9uX3ZhYmRzLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAxKHZhYnNfdiwgYXJtX25lb25fdmFicywgMCksCisgIE5FT05NQVAxKHZhYnNxX3YsIGFybV9uZW9uX3ZhYnMsIDApLAorICBORU9OTUFQMCh2YWRkaG5fdiksCisgIE5FT05NQVAxKHZhZXNkcV92LCBhcm1fbmVvbl9hZXNkLCAwKSwKKyAgTkVPTk1BUDEodmFlc2VxX3YsIGFybV9uZW9uX2Flc2UsIDApLAorICBORU9OTUFQMSh2YWVzaW1jcV92LCBhcm1fbmVvbl9hZXNpbWMsIDApLAorICBORU9OTUFQMSh2YWVzbWNxX3YsIGFybV9uZW9uX2Flc21jLCAwKSwKKyAgTkVPTk1BUDEodmJzbF92LCBhcm1fbmVvbl92YnNsLCBBZGRSZXRUeXBlKSwKKyAgTkVPTk1BUDEodmJzbHFfdiwgYXJtX25lb25fdmJzbCwgQWRkUmV0VHlwZSksCisgIE5FT05NQVAxKHZjYWdlX3YsIGFybV9uZW9uX3ZhY2dlLCAwKSwKKyAgTkVPTk1BUDEodmNhZ2VxX3YsIGFybV9uZW9uX3ZhY2dlLCAwKSwKKyAgTkVPTk1BUDEodmNhZ3RfdiwgYXJtX25lb25fdmFjZ3QsIDApLAorICBORU9OTUFQMSh2Y2FndHFfdiwgYXJtX25lb25fdmFjZ3QsIDApLAorICBORU9OTUFQMSh2Y2FsZV92LCBhcm1fbmVvbl92YWNnZSwgMCksCisgIE5FT05NQVAxKHZjYWxlcV92LCBhcm1fbmVvbl92YWNnZSwgMCksCisgIE5FT05NQVAxKHZjYWx0X3YsIGFybV9uZW9uX3ZhY2d0LCAwKSwKKyAgTkVPTk1BUDEodmNhbHRxX3YsIGFybV9uZW9uX3ZhY2d0LCAwKSwKKyAgTkVPTk1BUDEodmNsc192LCBhcm1fbmVvbl92Y2xzLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjbHNxX3YsIGFybV9uZW9uX3ZjbHMsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmNsel92LCBjdGx6LCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjbHpxX3YsIGN0bHosIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmNudF92LCBjdHBvcCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y250cV92LCBjdHBvcCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0X2YxNl92LCBhcm1fbmVvbl92Y3Z0ZnAyaGYsIDApLAorICBORU9OTUFQMSh2Y3Z0X2YzMl9mMTYsIGFybV9uZW9uX3ZjdnRoZjJmcCwgMCksCisgIE5FT05NQVAwKHZjdnRfZjMyX3YpLAorICBORU9OTUFQMih2Y3Z0X25fZjMyX3YsIGFybV9uZW9uX3ZjdnRmeHUyZnAsIGFybV9uZW9uX3ZjdnRmeHMyZnAsIDApLAorICBORU9OTUFQMSh2Y3Z0X25fczMyX3YsIGFybV9uZW9uX3ZjdnRmcDJmeHMsIDApLAorICBORU9OTUFQMSh2Y3Z0X25fczY0X3YsIGFybV9uZW9uX3ZjdnRmcDJmeHMsIDApLAorICBORU9OTUFQMSh2Y3Z0X25fdTMyX3YsIGFybV9uZW9uX3ZjdnRmcDJmeHUsIDApLAorICBORU9OTUFQMSh2Y3Z0X25fdTY0X3YsIGFybV9uZW9uX3ZjdnRmcDJmeHUsIDApLAorICBORU9OTUFQMCh2Y3Z0X3MzMl92KSwKKyAgTkVPTk1BUDAodmN2dF9zNjRfdiksCisgIE5FT05NQVAwKHZjdnRfdTMyX3YpLAorICBORU9OTUFQMCh2Y3Z0X3U2NF92KSwKKyAgTkVPTk1BUDEodmN2dGFfczMyX3YsIGFybV9uZW9uX3ZjdnRhcywgMCksCisgIE5FT05NQVAxKHZjdnRhX3M2NF92LCBhcm1fbmVvbl92Y3Z0YXMsIDApLAorICBORU9OTUFQMSh2Y3Z0YV91MzJfdiwgYXJtX25lb25fdmN2dGF1LCAwKSwKKyAgTkVPTk1BUDEodmN2dGFfdTY0X3YsIGFybV9uZW9uX3ZjdnRhdSwgMCksCisgIE5FT05NQVAxKHZjdnRhcV9zMzJfdiwgYXJtX25lb25fdmN2dGFzLCAwKSwKKyAgTkVPTk1BUDEodmN2dGFxX3M2NF92LCBhcm1fbmVvbl92Y3Z0YXMsIDApLAorICBORU9OTUFQMSh2Y3Z0YXFfdTMyX3YsIGFybV9uZW9uX3ZjdnRhdSwgMCksCisgIE5FT05NQVAxKHZjdnRhcV91NjRfdiwgYXJtX25lb25fdmN2dGF1LCAwKSwKKyAgTkVPTk1BUDEodmN2dG1fczMyX3YsIGFybV9uZW9uX3ZjdnRtcywgMCksCisgIE5FT05NQVAxKHZjdnRtX3M2NF92LCBhcm1fbmVvbl92Y3Z0bXMsIDApLAorICBORU9OTUFQMSh2Y3Z0bV91MzJfdiwgYXJtX25lb25fdmN2dG11LCAwKSwKKyAgTkVPTk1BUDEodmN2dG1fdTY0X3YsIGFybV9uZW9uX3ZjdnRtdSwgMCksCisgIE5FT05NQVAxKHZjdnRtcV9zMzJfdiwgYXJtX25lb25fdmN2dG1zLCAwKSwKKyAgTkVPTk1BUDEodmN2dG1xX3M2NF92LCBhcm1fbmVvbl92Y3Z0bXMsIDApLAorICBORU9OTUFQMSh2Y3Z0bXFfdTMyX3YsIGFybV9uZW9uX3ZjdnRtdSwgMCksCisgIE5FT05NQVAxKHZjdnRtcV91NjRfdiwgYXJtX25lb25fdmN2dG11LCAwKSwKKyAgTkVPTk1BUDEodmN2dG5fczMyX3YsIGFybV9uZW9uX3ZjdnRucywgMCksCisgIE5FT05NQVAxKHZjdnRuX3M2NF92LCBhcm1fbmVvbl92Y3Z0bnMsIDApLAorICBORU9OTUFQMSh2Y3Z0bl91MzJfdiwgYXJtX25lb25fdmN2dG51LCAwKSwKKyAgTkVPTk1BUDEodmN2dG5fdTY0X3YsIGFybV9uZW9uX3ZjdnRudSwgMCksCisgIE5FT05NQVAxKHZjdnRucV9zMzJfdiwgYXJtX25lb25fdmN2dG5zLCAwKSwKKyAgTkVPTk1BUDEodmN2dG5xX3M2NF92LCBhcm1fbmVvbl92Y3Z0bnMsIDApLAorICBORU9OTUFQMSh2Y3Z0bnFfdTMyX3YsIGFybV9uZW9uX3ZjdnRudSwgMCksCisgIE5FT05NQVAxKHZjdnRucV91NjRfdiwgYXJtX25lb25fdmN2dG51LCAwKSwKKyAgTkVPTk1BUDEodmN2dHBfczMyX3YsIGFybV9uZW9uX3ZjdnRwcywgMCksCisgIE5FT05NQVAxKHZjdnRwX3M2NF92LCBhcm1fbmVvbl92Y3Z0cHMsIDApLAorICBORU9OTUFQMSh2Y3Z0cF91MzJfdiwgYXJtX25lb25fdmN2dHB1LCAwKSwKKyAgTkVPTk1BUDEodmN2dHBfdTY0X3YsIGFybV9uZW9uX3ZjdnRwdSwgMCksCisgIE5FT05NQVAxKHZjdnRwcV9zMzJfdiwgYXJtX25lb25fdmN2dHBzLCAwKSwKKyAgTkVPTk1BUDEodmN2dHBxX3M2NF92LCBhcm1fbmVvbl92Y3Z0cHMsIDApLAorICBORU9OTUFQMSh2Y3Z0cHFfdTMyX3YsIGFybV9uZW9uX3ZjdnRwdSwgMCksCisgIE5FT05NQVAxKHZjdnRwcV91NjRfdiwgYXJtX25lb25fdmN2dHB1LCAwKSwKKyAgTkVPTk1BUDAodmN2dHFfZjMyX3YpLAorICBORU9OTUFQMih2Y3Z0cV9uX2YzMl92LCBhcm1fbmVvbl92Y3Z0Znh1MmZwLCBhcm1fbmVvbl92Y3Z0ZnhzMmZwLCAwKSwKKyAgTkVPTk1BUDEodmN2dHFfbl9zMzJfdiwgYXJtX25lb25fdmN2dGZwMmZ4cywgMCksCisgIE5FT05NQVAxKHZjdnRxX25fczY0X3YsIGFybV9uZW9uX3ZjdnRmcDJmeHMsIDApLAorICBORU9OTUFQMSh2Y3Z0cV9uX3UzMl92LCBhcm1fbmVvbl92Y3Z0ZnAyZnh1LCAwKSwKKyAgTkVPTk1BUDEodmN2dHFfbl91NjRfdiwgYXJtX25lb25fdmN2dGZwMmZ4dSwgMCksCisgIE5FT05NQVAwKHZjdnRxX3MzMl92KSwKKyAgTkVPTk1BUDAodmN2dHFfczY0X3YpLAorICBORU9OTUFQMCh2Y3Z0cV91MzJfdiksCisgIE5FT05NQVAwKHZjdnRxX3U2NF92KSwKKyAgTkVPTk1BUDAodmV4dF92KSwKKyAgTkVPTk1BUDAodmV4dHFfdiksCisgIE5FT05NQVAwKHZmbWFfdiksCisgIE5FT05NQVAwKHZmbWFxX3YpLAorICBORU9OTUFQMih2aGFkZF92LCBhcm1fbmVvbl92aGFkZHUsIGFybV9uZW9uX3ZoYWRkcywgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2aGFkZHFfdiwgYXJtX25lb25fdmhhZGR1LCBhcm1fbmVvbl92aGFkZHMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodmhzdWJfdiwgYXJtX25lb25fdmhzdWJ1LCBhcm1fbmVvbl92aHN1YnMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodmhzdWJxX3YsIGFybV9uZW9uX3Zoc3VidSwgYXJtX25lb25fdmhzdWJzLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAwKHZsZDFfZHVwX3YpLAorICBORU9OTUFQMSh2bGQxX3YsIGFybV9uZW9uX3ZsZDEsIDApLAorICBORU9OTUFQMCh2bGQxcV9kdXBfdiksCisgIE5FT05NQVAxKHZsZDFxX3YsIGFybV9uZW9uX3ZsZDEsIDApLAorICBORU9OTUFQMSh2bGQyX2xhbmVfdiwgYXJtX25lb25fdmxkMmxhbmUsIDApLAorICBORU9OTUFQMSh2bGQyX3YsIGFybV9uZW9uX3ZsZDIsIDApLAorICBORU9OTUFQMSh2bGQycV9sYW5lX3YsIGFybV9uZW9uX3ZsZDJsYW5lLCAwKSwKKyAgTkVPTk1BUDEodmxkMnFfdiwgYXJtX25lb25fdmxkMiwgMCksCisgIE5FT05NQVAxKHZsZDNfbGFuZV92LCBhcm1fbmVvbl92bGQzbGFuZSwgMCksCisgIE5FT05NQVAxKHZsZDNfdiwgYXJtX25lb25fdmxkMywgMCksCisgIE5FT05NQVAxKHZsZDNxX2xhbmVfdiwgYXJtX25lb25fdmxkM2xhbmUsIDApLAorICBORU9OTUFQMSh2bGQzcV92LCBhcm1fbmVvbl92bGQzLCAwKSwKKyAgTkVPTk1BUDEodmxkNF9sYW5lX3YsIGFybV9uZW9uX3ZsZDRsYW5lLCAwKSwKKyAgTkVPTk1BUDEodmxkNF92LCBhcm1fbmVvbl92bGQ0LCAwKSwKKyAgTkVPTk1BUDEodmxkNHFfbGFuZV92LCBhcm1fbmVvbl92bGQ0bGFuZSwgMCksCisgIE5FT05NQVAxKHZsZDRxX3YsIGFybV9uZW9uX3ZsZDQsIDApLAorICBORU9OTUFQMih2bWF4X3YsIGFybV9uZW9uX3ZtYXh1LCBhcm1fbmVvbl92bWF4cywgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2bWF4cV92LCBhcm1fbmVvbl92bWF4dSwgYXJtX25lb25fdm1heHMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodm1pbl92LCBhcm1fbmVvbl92bWludSwgYXJtX25lb25fdm1pbnMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodm1pbnFfdiwgYXJtX25lb25fdm1pbnUsIGFybV9uZW9uX3ZtaW5zLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAwKHZtb3ZsX3YpLAorICBORU9OTUFQMCh2bW92bl92KSwKKyAgTkVPTk1BUDEodm11bF92LCBhcm1fbmVvbl92bXVscCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMCh2bXVsbF92KSwKKyAgTkVPTk1BUDEodm11bHFfdiwgYXJtX25lb25fdm11bHAsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDIodnBhZGFsX3YsIGFybV9uZW9uX3ZwYWRhbHUsIGFybV9uZW9uX3ZwYWRhbHMsIFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZwYWRhbHFfdiwgYXJtX25lb25fdnBhZGFsdSwgYXJtX25lb25fdnBhZGFscywgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDEodnBhZGRfdiwgYXJtX25lb25fdnBhZGQsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDIodnBhZGRsX3YsIGFybV9uZW9uX3ZwYWRkbHUsIGFybV9uZW9uX3ZwYWRkbHMsIFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZwYWRkbHFfdiwgYXJtX25lb25fdnBhZGRsdSwgYXJtX25lb25fdnBhZGRscywgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDEodnBhZGRxX3YsIGFybV9uZW9uX3ZwYWRkLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAyKHZwbWF4X3YsIGFybV9uZW9uX3ZwbWF4dSwgYXJtX25lb25fdnBtYXhzLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZwbWluX3YsIGFybV9uZW9uX3ZwbWludSwgYXJtX25lb25fdnBtaW5zLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAxKHZxYWJzX3YsIGFybV9uZW9uX3ZxYWJzLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxYWJzcV92LCBhcm1fbmVvbl92cWFicywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMih2cWFkZF92LCBhcm1fbmVvbl92cWFkZHUsIGFybV9uZW9uX3ZxYWRkcywgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2cWFkZHFfdiwgYXJtX25lb25fdnFhZGR1LCBhcm1fbmVvbl92cWFkZHMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodnFkbWxhbF92LCBhcm1fbmVvbl92cWRtdWxsLCBhcm1fbmVvbl92cWFkZHMsIDApLAorICBORU9OTUFQMih2cWRtbHNsX3YsIGFybV9uZW9uX3ZxZG11bGwsIGFybV9uZW9uX3Zxc3VicywgMCksCisgIE5FT05NQVAxKHZxZG11bGhfdiwgYXJtX25lb25fdnFkbXVsaCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cWRtdWxocV92LCBhcm1fbmVvbl92cWRtdWxoLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxZG11bGxfdiwgYXJtX25lb25fdnFkbXVsbCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMih2cW1vdm5fdiwgYXJtX25lb25fdnFtb3ZudSwgYXJtX25lb25fdnFtb3ZucywgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMSh2cW1vdnVuX3YsIGFybV9uZW9uX3ZxbW92bnN1LCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxbmVnX3YsIGFybV9uZW9uX3ZxbmVnLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxbmVncV92LCBhcm1fbmVvbl92cW5lZywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cXJkbXVsaF92LCBhcm1fbmVvbl92cXJkbXVsaCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cXJkbXVsaHFfdiwgYXJtX25lb25fdnFyZG11bGgsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDIodnFyc2hsX3YsIGFybV9uZW9uX3ZxcnNoaWZ0dSwgYXJtX25lb25fdnFyc2hpZnRzLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZxcnNobHFfdiwgYXJtX25lb25fdnFyc2hpZnR1LCBhcm1fbmVvbl92cXJzaGlmdHMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodnFzaGxfbl92LCBhcm1fbmVvbl92cXNoaWZ0dSwgYXJtX25lb25fdnFzaGlmdHMsIFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZxc2hsX3YsIGFybV9uZW9uX3Zxc2hpZnR1LCBhcm1fbmVvbl92cXNoaWZ0cywgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2cXNobHFfbl92LCBhcm1fbmVvbl92cXNoaWZ0dSwgYXJtX25lb25fdnFzaGlmdHMsIFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZxc2hscV92LCBhcm1fbmVvbl92cXNoaWZ0dSwgYXJtX25lb25fdnFzaGlmdHMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodnFzdWJfdiwgYXJtX25lb25fdnFzdWJ1LCBhcm1fbmVvbl92cXN1YnMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodnFzdWJxX3YsIGFybV9uZW9uX3Zxc3VidSwgYXJtX25lb25fdnFzdWJzLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAxKHZyYWRkaG5fdiwgYXJtX25lb25fdnJhZGRobiwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMih2cmVjcGVfdiwgYXJtX25lb25fdnJlY3BlLCBhcm1fbmVvbl92cmVjcGUsIDApLAorICBORU9OTUFQMih2cmVjcGVxX3YsIGFybV9uZW9uX3ZyZWNwZSwgYXJtX25lb25fdnJlY3BlLCAwKSwKKyAgTkVPTk1BUDEodnJlY3BzX3YsIGFybV9uZW9uX3ZyZWNwcywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cmVjcHNxX3YsIGFybV9uZW9uX3ZyZWNwcywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMih2cmhhZGRfdiwgYXJtX25lb25fdnJoYWRkdSwgYXJtX25lb25fdnJoYWRkcywgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2cmhhZGRxX3YsIGFybV9uZW9uX3ZyaGFkZHUsIGFybV9uZW9uX3ZyaGFkZHMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodnJzaGxfdiwgYXJtX25lb25fdnJzaGlmdHUsIGFybV9uZW9uX3Zyc2hpZnRzLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZyc2hscV92LCBhcm1fbmVvbl92cnNoaWZ0dSwgYXJtX25lb25fdnJzaGlmdHMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodnJzcXJ0ZV92LCBhcm1fbmVvbl92cnNxcnRlLCBhcm1fbmVvbl92cnNxcnRlLCAwKSwKKyAgTkVPTk1BUDIodnJzcXJ0ZXFfdiwgYXJtX25lb25fdnJzcXJ0ZSwgYXJtX25lb25fdnJzcXJ0ZSwgMCksCisgIE5FT05NQVAxKHZyc3FydHNfdiwgYXJtX25lb25fdnJzcXJ0cywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cnNxcnRzcV92LCBhcm1fbmVvbl92cnNxcnRzLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZyc3ViaG5fdiwgYXJtX25lb25fdnJzdWJobiwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2c2hhMXN1MHFfdiwgYXJtX25lb25fc2hhMXN1MCwgMCksCisgIE5FT05NQVAxKHZzaGExc3UxcV92LCBhcm1fbmVvbl9zaGExc3UxLCAwKSwKKyAgTkVPTk1BUDEodnNoYTI1NmgycV92LCBhcm1fbmVvbl9zaGEyNTZoMiwgMCksCisgIE5FT05NQVAxKHZzaGEyNTZocV92LCBhcm1fbmVvbl9zaGEyNTZoLCAwKSwKKyAgTkVPTk1BUDEodnNoYTI1NnN1MHFfdiwgYXJtX25lb25fc2hhMjU2c3UwLCAwKSwKKyAgTkVPTk1BUDEodnNoYTI1NnN1MXFfdiwgYXJtX25lb25fc2hhMjU2c3UxLCAwKSwKKyAgTkVPTk1BUDAodnNobF9uX3YpLAorICBORU9OTUFQMih2c2hsX3YsIGFybV9uZW9uX3ZzaGlmdHUsIGFybV9uZW9uX3ZzaGlmdHMsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDAodnNobGxfbl92KSwKKyAgTkVPTk1BUDAodnNobHFfbl92KSwKKyAgTkVPTk1BUDIodnNobHFfdiwgYXJtX25lb25fdnNoaWZ0dSwgYXJtX25lb25fdnNoaWZ0cywgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMCh2c2hyX25fdiksCisgIE5FT05NQVAwKHZzaHJuX25fdiksCisgIE5FT05NQVAwKHZzaHJxX25fdiksCisgIE5FT05NQVAxKHZzdDFfdiwgYXJtX25lb25fdnN0MSwgMCksCisgIE5FT05NQVAxKHZzdDFxX3YsIGFybV9uZW9uX3ZzdDEsIDApLAorICBORU9OTUFQMSh2c3QyX2xhbmVfdiwgYXJtX25lb25fdnN0MmxhbmUsIDApLAorICBORU9OTUFQMSh2c3QyX3YsIGFybV9uZW9uX3ZzdDIsIDApLAorICBORU9OTUFQMSh2c3QycV9sYW5lX3YsIGFybV9uZW9uX3ZzdDJsYW5lLCAwKSwKKyAgTkVPTk1BUDEodnN0MnFfdiwgYXJtX25lb25fdnN0MiwgMCksCisgIE5FT05NQVAxKHZzdDNfbGFuZV92LCBhcm1fbmVvbl92c3QzbGFuZSwgMCksCisgIE5FT05NQVAxKHZzdDNfdiwgYXJtX25lb25fdnN0MywgMCksCisgIE5FT05NQVAxKHZzdDNxX2xhbmVfdiwgYXJtX25lb25fdnN0M2xhbmUsIDApLAorICBORU9OTUFQMSh2c3QzcV92LCBhcm1fbmVvbl92c3QzLCAwKSwKKyAgTkVPTk1BUDEodnN0NF9sYW5lX3YsIGFybV9uZW9uX3ZzdDRsYW5lLCAwKSwKKyAgTkVPTk1BUDEodnN0NF92LCBhcm1fbmVvbl92c3Q0LCAwKSwKKyAgTkVPTk1BUDEodnN0NHFfbGFuZV92LCBhcm1fbmVvbl92c3Q0bGFuZSwgMCksCisgIE5FT05NQVAxKHZzdDRxX3YsIGFybV9uZW9uX3ZzdDQsIDApLAorICBORU9OTUFQMCh2c3ViaG5fdiksCisgIE5FT05NQVAwKHZ0cm5fdiksCisgIE5FT05NQVAwKHZ0cm5xX3YpLAorICBORU9OTUFQMCh2dHN0X3YpLAorICBORU9OTUFQMCh2dHN0cV92KSwKKyAgTkVPTk1BUDAodnV6cF92KSwKKyAgTkVPTk1BUDAodnV6cHFfdiksCisgIE5FT05NQVAwKHZ6aXBfdiksCisgIE5FT05NQVAwKHZ6aXBxX3YpCit9OworCitzdGF0aWMgTmVvbkludHJpbnNpY0luZm8gQVJNNjRTSU1ESW50cmluc2ljTWFwW10gPSB7CisgIE5FT05NQVAxKHZhYnNfdiwgYXJtNjRfbmVvbl9hYnMsIDApLAorICBORU9OTUFQMSh2YWJzcV92LCBhcm02NF9uZW9uX2FicywgMCksCisgIE5FT05NQVAwKHZhZGRobl92KSwKKyAgTkVPTk1BUDEodmFlc2RxX3YsIGFybTY0X2NyeXB0b19hZXNkLCAwKSwKKyAgTkVPTk1BUDEodmFlc2VxX3YsIGFybTY0X2NyeXB0b19hZXNlLCAwKSwKKyAgTkVPTk1BUDEodmFlc2ltY3FfdiwgYXJtNjRfY3J5cHRvX2Flc2ltYywgMCksCisgIE5FT05NQVAxKHZhZXNtY3FfdiwgYXJtNjRfY3J5cHRvX2Flc21jLCAwKSwKKyAgTkVPTk1BUDEodmNhZ2VfdiwgYXJtNjRfbmVvbl9mYWNnZSwgMCksCisgIE5FT05NQVAxKHZjYWdlcV92LCBhcm02NF9uZW9uX2ZhY2dlLCAwKSwKKyAgTkVPTk1BUDEodmNhZ3RfdiwgYXJtNjRfbmVvbl9mYWNndCwgMCksCisgIE5FT05NQVAxKHZjYWd0cV92LCBhcm02NF9uZW9uX2ZhY2d0LCAwKSwKKyAgTkVPTk1BUDEodmNhbGVfdiwgYXJtNjRfbmVvbl9mYWNnZSwgMCksCisgIE5FT05NQVAxKHZjYWxlcV92LCBhcm02NF9uZW9uX2ZhY2dlLCAwKSwKKyAgTkVPTk1BUDEodmNhbHRfdiwgYXJtNjRfbmVvbl9mYWNndCwgMCksCisgIE5FT05NQVAxKHZjYWx0cV92LCBhcm02NF9uZW9uX2ZhY2d0LCAwKSwKKyAgTkVPTk1BUDEodmNsc192LCBhcm02NF9uZW9uX2NscywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y2xzcV92LCBhcm02NF9uZW9uX2NscywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y2x6X3YsIGN0bHosIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmNsenFfdiwgY3RseiwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y250X3YsIGN0cG9wLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjbnRxX3YsIGN0cG9wLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRfZjE2X3YsIGFybTY0X25lb25fdmN2dGZwMmhmLCAwKSwKKyAgTkVPTk1BUDEodmN2dF9mMzJfZjE2LCBhcm02NF9uZW9uX3ZjdnRoZjJmcCwgMCksCisgIE5FT05NQVAwKHZjdnRfZjMyX3YpLAorICBORU9OTUFQMih2Y3Z0X25fZjMyX3YsIGFybTY0X25lb25fdmN2dGZ4dTJmcCwgYXJtNjRfbmVvbl92Y3Z0ZnhzMmZwLCAwKSwKKyAgTkVPTk1BUDIodmN2dF9uX2Y2NF92LCBhcm02NF9uZW9uX3ZjdnRmeHUyZnAsIGFybTY0X25lb25fdmN2dGZ4czJmcCwgMCksCisgIE5FT05NQVAxKHZjdnRfbl9zMzJfdiwgYXJtNjRfbmVvbl92Y3Z0ZnAyZnhzLCAwKSwKKyAgTkVPTk1BUDEodmN2dF9uX3M2NF92LCBhcm02NF9uZW9uX3ZjdnRmcDJmeHMsIDApLAorICBORU9OTUFQMSh2Y3Z0X25fdTMyX3YsIGFybTY0X25lb25fdmN2dGZwMmZ4dSwgMCksCisgIE5FT05NQVAxKHZjdnRfbl91NjRfdiwgYXJtNjRfbmVvbl92Y3Z0ZnAyZnh1LCAwKSwKKyAgTkVPTk1BUDAodmN2dHFfZjMyX3YpLAorICBORU9OTUFQMih2Y3Z0cV9uX2YzMl92LCBhcm02NF9uZW9uX3ZjdnRmeHUyZnAsIGFybTY0X25lb25fdmN2dGZ4czJmcCwgMCksCisgIE5FT05NQVAyKHZjdnRxX25fZjY0X3YsIGFybTY0X25lb25fdmN2dGZ4dTJmcCwgYXJtNjRfbmVvbl92Y3Z0ZnhzMmZwLCAwKSwKKyAgTkVPTk1BUDEodmN2dHFfbl9zMzJfdiwgYXJtNjRfbmVvbl92Y3Z0ZnAyZnhzLCAwKSwKKyAgTkVPTk1BUDEodmN2dHFfbl9zNjRfdiwgYXJtNjRfbmVvbl92Y3Z0ZnAyZnhzLCAwKSwKKyAgTkVPTk1BUDEodmN2dHFfbl91MzJfdiwgYXJtNjRfbmVvbl92Y3Z0ZnAyZnh1LCAwKSwKKyAgTkVPTk1BUDEodmN2dHFfbl91NjRfdiwgYXJtNjRfbmVvbl92Y3Z0ZnAyZnh1LCAwKSwKKyAgTkVPTk1BUDEodmN2dHhfZjMyX3YsIGFybTY0X25lb25fZmN2dHhuLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMCh2ZXh0X3YpLAorICBORU9OTUFQMCh2ZXh0cV92KSwKKyAgTkVPTk1BUDAodmZtYV92KSwKKyAgTkVPTk1BUDAodmZtYXFfdiksCisgIE5FT05NQVAyKHZoYWRkX3YsIGFybTY0X25lb25fdWhhZGQsIGFybTY0X25lb25fc2hhZGQsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodmhhZGRxX3YsIGFybTY0X25lb25fdWhhZGQsIGFybTY0X25lb25fc2hhZGQsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodmhzdWJfdiwgYXJtNjRfbmVvbl91aHN1YiwgYXJtNjRfbmVvbl9zaHN1YiwgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2aHN1YnFfdiwgYXJtNjRfbmVvbl91aHN1YiwgYXJtNjRfbmVvbl9zaHN1YiwgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMCh2bW92bF92KSwKKyAgTkVPTk1BUDAodm1vdm5fdiksCisgIE5FT05NQVAxKHZtdWxfdiwgYXJtNjRfbmVvbl9wbXVsLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtdWxxX3YsIGFybTY0X25lb25fcG11bCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cGFkZF92LCBhcm02NF9uZW9uX2FkZHAsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDIodnBhZGRsX3YsIGFybTY0X25lb25fdWFkZGxwLCBhcm02NF9uZW9uX3NhZGRscCwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodnBhZGRscV92LCBhcm02NF9uZW9uX3VhZGRscCwgYXJtNjRfbmVvbl9zYWRkbHAsIFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAxKHZwYWRkcV92LCBhcm02NF9uZW9uX2FkZHAsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFhYnNfdiwgYXJtNjRfbmVvbl9zcWFicywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cWFic3FfdiwgYXJtNjRfbmVvbl9zcWFicywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMih2cWFkZF92LCBhcm02NF9uZW9uX3VxYWRkLCBhcm02NF9uZW9uX3NxYWRkLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZxYWRkcV92LCBhcm02NF9uZW9uX3VxYWRkLCBhcm02NF9uZW9uX3NxYWRkLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZxZG1sYWxfdiwgYXJtNjRfbmVvbl9zcWRtdWxsLCBhcm02NF9uZW9uX3NxYWRkLCAwKSwKKyAgTkVPTk1BUDIodnFkbWxzbF92LCBhcm02NF9uZW9uX3NxZG11bGwsIGFybTY0X25lb25fc3FzdWIsIDApLAorICBORU9OTUFQMSh2cWRtdWxoX3YsIGFybTY0X25lb25fc3FkbXVsaCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cWRtdWxocV92LCBhcm02NF9uZW9uX3NxZG11bGgsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFkbXVsbF92LCBhcm02NF9uZW9uX3NxZG11bGwsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDIodnFtb3ZuX3YsIGFybTY0X25lb25fdXF4dG4sIGFybTY0X25lb25fc3F4dG4sIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDEodnFtb3Z1bl92LCBhcm02NF9uZW9uX3NxeHR1biwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cW5lZ192LCBhcm02NF9uZW9uX3NxbmVnLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxbmVncV92LCBhcm02NF9uZW9uX3NxbmVnLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxcmRtdWxoX3YsIGFybTY0X25lb25fc3FyZG11bGgsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFyZG11bGhxX3YsIGFybTY0X25lb25fc3FyZG11bGgsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDIodnFyc2hsX3YsIGFybTY0X25lb25fdXFyc2hsLCBhcm02NF9uZW9uX3NxcnNobCwgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2cXJzaGxxX3YsIGFybTY0X25lb25fdXFyc2hsLCBhcm02NF9uZW9uX3NxcnNobCwgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2cXNobF9uX3YsIGFybTY0X25lb25fdXFzaGwsIGFybTY0X25lb25fc3FzaGwsIFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZxc2hsX3YsIGFybTY0X25lb25fdXFzaGwsIGFybTY0X25lb25fc3FzaGwsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDIodnFzaGxxX25fdiwgYXJtNjRfbmVvbl91cXNobCwgYXJtNjRfbmVvbl9zcXNobCxVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2cXNobHFfdiwgYXJtNjRfbmVvbl91cXNobCwgYXJtNjRfbmVvbl9zcXNobCwgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2cXN1Yl92LCBhcm02NF9uZW9uX3Vxc3ViLCBhcm02NF9uZW9uX3Nxc3ViLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZxc3VicV92LCBhcm02NF9uZW9uX3Vxc3ViLCBhcm02NF9uZW9uX3Nxc3ViLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAxKHZyYWRkaG5fdiwgYXJtNjRfbmVvbl9yYWRkaG4sIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDIodnJlY3BlX3YsIGFybTY0X25lb25fZnJlY3BlLCBhcm02NF9uZW9uX3VyZWNwZSwgMCksCisgIE5FT05NQVAyKHZyZWNwZXFfdiwgYXJtNjRfbmVvbl9mcmVjcGUsIGFybTY0X25lb25fdXJlY3BlLCAwKSwKKyAgTkVPTk1BUDEodnJlY3BzX3YsIGFybTY0X25lb25fZnJlY3BzLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZyZWNwc3FfdiwgYXJtNjRfbmVvbl9mcmVjcHMsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDIodnJoYWRkX3YsIGFybTY0X25lb25fdXJoYWRkLCBhcm02NF9uZW9uX3NyaGFkZCwgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2cmhhZGRxX3YsIGFybTY0X25lb25fdXJoYWRkLCBhcm02NF9uZW9uX3NyaGFkZCwgQWRkMUFyZ1R5cGUgfCBVbnNpZ25lZEFsdHMpLAorICBORU9OTUFQMih2cnNobF92LCBhcm02NF9uZW9uX3Vyc2hsLCBhcm02NF9uZW9uX3Nyc2hsLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZyc2hscV92LCBhcm02NF9uZW9uX3Vyc2hsLCBhcm02NF9uZW9uX3Nyc2hsLCBBZGQxQXJnVHlwZSB8IFVuc2lnbmVkQWx0cyksCisgIE5FT05NQVAyKHZyc3FydGVfdiwgYXJtNjRfbmVvbl9mcnNxcnRlLCBhcm02NF9uZW9uX3Vyc3FydGUsIDApLAorICBORU9OTUFQMih2cnNxcnRlcV92LCBhcm02NF9uZW9uX2Zyc3FydGUsIGFybTY0X25lb25fdXJzcXJ0ZSwgMCksCisgIE5FT05NQVAxKHZyc3FydHNfdiwgYXJtNjRfbmVvbl9mcnNxcnRzLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZyc3FydHNxX3YsIGFybTY0X25lb25fZnJzcXJ0cywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cnN1YmhuX3YsIGFybTY0X25lb25fcnN1YmhuLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZzaGExc3UwcV92LCBhcm02NF9jcnlwdG9fc2hhMXN1MCwgMCksCisgIE5FT05NQVAxKHZzaGExc3UxcV92LCBhcm02NF9jcnlwdG9fc2hhMXN1MSwgMCksCisgIE5FT05NQVAxKHZzaGEyNTZoMnFfdiwgYXJtNjRfY3J5cHRvX3NoYTI1NmgyLCAwKSwKKyAgTkVPTk1BUDEodnNoYTI1NmhxX3YsIGFybTY0X2NyeXB0b19zaGEyNTZoLCAwKSwKKyAgTkVPTk1BUDEodnNoYTI1NnN1MHFfdiwgYXJtNjRfY3J5cHRvX3NoYTI1NnN1MCwgMCksCisgIE5FT05NQVAxKHZzaGEyNTZzdTFxX3YsIGFybTY0X2NyeXB0b19zaGEyNTZzdTEsIDApLAorICBORU9OTUFQMCh2c2hsX25fdiksCisgIE5FT05NQVAyKHZzaGxfdiwgYXJtNjRfbmVvbl91c2hsLCBhcm02NF9uZW9uX3NzaGwsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDAodnNobGxfbl92KSwKKyAgTkVPTk1BUDAodnNobHFfbl92KSwKKyAgTkVPTk1BUDIodnNobHFfdiwgYXJtNjRfbmVvbl91c2hsLCBhcm02NF9uZW9uX3NzaGwsIEFkZDFBcmdUeXBlIHwgVW5zaWduZWRBbHRzKSwKKyAgTkVPTk1BUDAodnNocl9uX3YpLAorICBORU9OTUFQMCh2c2hybl9uX3YpLAorICBORU9OTUFQMCh2c2hycV9uX3YpLAorICBORU9OTUFQMCh2c3ViaG5fdiksCisgIE5FT05NQVAwKHZ0c3RfdiksCisgIE5FT05NQVAwKHZ0c3RxX3YpLAorfTsKKworc3RhdGljIE5lb25JbnRyaW5zaWNJbmZvIEFSTTY0U0lTREludHJpbnNpY01hcFtdID0geworICBORU9OTUFQMSh2YWJkZF9mNjQsIGFybTY0X3Npc2RfZmFiZCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWJkc19mMzIsIGFybTY0X3Npc2RfZmFiZCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWJzZF9zNjQsIGFybTY0X25lb25fYWJzLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGRsdl9zMzIsIGFybTY0X25lb25fc2FkZGx2LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkbHZfdTMyLCBhcm02NF9uZW9uX3VhZGRsdiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmFkZGx2cV9zMzIsIGFybTY0X25lb25fc2FkZGx2LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkbHZxX3UzMiwgYXJtNjRfbmVvbl91YWRkbHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2X2YzMiwgYXJtNjRfbmVvbl9mYWRkdiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmFkZHZfczMyLCBhcm02NF9uZW9uX3NhZGR2LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2YWRkdl91MzIsIGFybTY0X25lb25fdWFkZHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2cV9mMzIsIGFybTY0X25lb25fZmFkZHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2cV9mNjQsIGFybTY0X25lb25fZmFkZHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2cV9zMzIsIGFybTY0X25lb25fc2FkZHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2cV9zNjQsIGFybTY0X25lb25fc2FkZHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2cV91MzIsIGFybTY0X25lb25fdWFkZHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZhZGR2cV91NjQsIGFybTY0X25lb25fdWFkZHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjYWdlZF9mNjQsIGFybTY0X25lb25fZmFjZ2UsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjYWdlc19mMzIsIGFybTY0X25lb25fZmFjZ2UsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjYWd0ZF9mNjQsIGFybTY0X25lb25fZmFjZ3QsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjYWd0c19mMzIsIGFybTY0X25lb25fZmFjZ3QsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjYWxlZF9mNjQsIGFybTY0X25lb25fZmFjZ2UsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjYWxlc19mMzIsIGFybTY0X25lb25fZmFjZ2UsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjYWx0ZF9mNjQsIGFybTY0X25lb25fZmFjZ3QsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjYWx0c19mMzIsIGFybTY0X25lb25fZmFjZ3QsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRhZF9zNjRfZjY0LCBhcm02NF9uZW9uX2ZjdnRhcywgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dGFkX3U2NF9mNjQsIGFybTY0X25lb25fZmN2dGF1LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0YXNfczMyX2YzMiwgYXJtNjRfbmVvbl9mY3Z0YXMsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRhc191MzJfZjMyLCBhcm02NF9uZW9uX2ZjdnRhdSwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dGRfbl9mNjRfczY0LCBhcm02NF9uZW9uX3ZjdnRmeHMyZnAsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRkX25fZjY0X3U2NCwgYXJtNjRfbmVvbl92Y3Z0Znh1MmZwLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0ZF9uX3M2NF9mNjQsIGFybTY0X25lb25fdmN2dGZwMmZ4cywgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dGRfbl91NjRfZjY0LCBhcm02NF9uZW9uX3ZjdnRmcDJmeHUsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRtZF9zNjRfZjY0LCBhcm02NF9uZW9uX2ZjdnRtcywgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dG1kX3U2NF9mNjQsIGFybTY0X25lb25fZmN2dG11LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0bXNfczMyX2YzMiwgYXJtNjRfbmVvbl9mY3Z0bXMsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRtc191MzJfZjMyLCBhcm02NF9uZW9uX2ZjdnRtdSwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dG5kX3M2NF9mNjQsIGFybTY0X25lb25fZmN2dG5zLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0bmRfdTY0X2Y2NCwgYXJtNjRfbmVvbl9mY3Z0bnUsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRuc19zMzJfZjMyLCBhcm02NF9uZW9uX2ZjdnRucywgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dG5zX3UzMl9mMzIsIGFybTY0X25lb25fZmN2dG51LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0cGRfczY0X2Y2NCwgYXJtNjRfbmVvbl9mY3Z0cHMsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRwZF91NjRfZjY0LCBhcm02NF9uZW9uX2ZjdnRwdSwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dHBzX3MzMl9mMzIsIGFybTY0X25lb25fZmN2dHBzLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0cHNfdTMyX2YzMiwgYXJtNjRfbmVvbl9mY3Z0cHUsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRzX25fZjMyX3MzMiwgYXJtNjRfbmVvbl92Y3Z0ZnhzMmZwLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0c19uX2YzMl91MzIsIGFybTY0X25lb25fdmN2dGZ4dTJmcCwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodmN2dHNfbl9zMzJfZjMyLCBhcm02NF9uZW9uX3ZjdnRmcDJmeHMsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZjdnRzX25fdTMyX2YzMiwgYXJtNjRfbmVvbl92Y3Z0ZnAyZnh1LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2Y3Z0eGRfZjMyX2Y2NCwgYXJtNjRfc2lzZF9mY3Z0eG4sIDApLAorICBORU9OTUFQMSh2bWF4bm12X2YzMiwgYXJtNjRfbmVvbl9mbWF4bm12LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWF4bm12cV9mMzIsIGFybTY0X25lb25fZm1heG5tdiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1heG5tdnFfZjY0LCBhcm02NF9uZW9uX2ZtYXhubXYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtYXh2X2YzMiwgYXJtNjRfbmVvbl9mbWF4diwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1heHZfczMyLCBhcm02NF9uZW9uX3NtYXh2LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWF4dl91MzIsIGFybTY0X25lb25fdW1heHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtYXh2cV9mMzIsIGFybTY0X25lb25fZm1heHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtYXh2cV9mNjQsIGFybTY0X25lb25fZm1heHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtYXh2cV9zMzIsIGFybTY0X25lb25fc21heHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtYXh2cV91MzIsIGFybTY0X25lb25fdW1heHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtaW5ubXZfZjMyLCBhcm02NF9uZW9uX2ZtaW5ubXYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtaW5ubXZxX2YzMiwgYXJtNjRfbmVvbl9mbWlubm12LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWlubm12cV9mNjQsIGFybTY0X25lb25fZm1pbm5tdiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1pbnZfZjMyLCBhcm02NF9uZW9uX2ZtaW52LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2bWludl9zMzIsIGFybTY0X25lb25fc21pbnYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtaW52X3UzMiwgYXJtNjRfbmVvbl91bWludiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1pbnZxX2YzMiwgYXJtNjRfbmVvbl9mbWludiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1pbnZxX2Y2NCwgYXJtNjRfbmVvbl9mbWludiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1pbnZxX3MzMiwgYXJtNjRfbmVvbl9zbWludiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm1pbnZxX3UzMiwgYXJtNjRfbmVvbl91bWludiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodm11bGxfcDY0LCBhcm02NF9uZW9uX3BtdWxsNjQsIDApLAorICBORU9OTUFQMSh2bXVseGRfZjY0LCBhcm02NF9uZW9uX2ZtdWx4LCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZtdWx4c19mMzIsIGFybTY0X25lb25fZm11bHgsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnBhZGRkX3M2NCwgYXJtNjRfbmVvbl91YWRkdiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnBhZGRkX3U2NCwgYXJtNjRfbmVvbl91YWRkdiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnBtYXhubXFkX2Y2NCwgYXJtNjRfbmVvbl9mbWF4bm12LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cG1heG5tc19mMzIsIGFybTY0X25lb25fZm1heG5tdiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnBtYXhxZF9mNjQsIGFybTY0X25lb25fZm1heHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZwbWF4c19mMzIsIGFybTY0X25lb25fZm1heHYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZwbWlubm1xZF9mNjQsIGFybTY0X25lb25fZm1pbm5tdiwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnBtaW5ubXNfZjMyLCBhcm02NF9uZW9uX2ZtaW5ubXYsIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZwbWlucWRfZjY0LCBhcm02NF9uZW9uX2ZtaW52LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cG1pbnNfZjMyLCBhcm02NF9uZW9uX2ZtaW52LCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cWFic2JfczgsIGFybTY0X25lb25fc3FhYnMsIFZlY3Rvcml6ZTFBcmdUeXBlIHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFhYnNkX3M2NCwgYXJtNjRfbmVvbl9zcWFicywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cWFic2hfczE2LCBhcm02NF9uZW9uX3NxYWJzLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxYWJzc19zMzIsIGFybTY0X25lb25fc3FhYnMsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFhZGRiX3M4LCBhcm02NF9uZW9uX3NxYWRkLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxYWRkYl91OCwgYXJtNjRfbmVvbl91cWFkZCwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cWFkZGRfczY0LCBhcm02NF9uZW9uX3NxYWRkLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxYWRkZF91NjQsIGFybTY0X25lb25fdXFhZGQsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFhZGRoX3MxNiwgYXJtNjRfbmVvbl9zcWFkZCwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cWFkZGhfdTE2LCBhcm02NF9uZW9uX3VxYWRkLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxYWRkc19zMzIsIGFybTY0X25lb25fc3FhZGQsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFhZGRzX3UzMiwgYXJtNjRfbmVvbl91cWFkZCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cWRtdWxoaF9zMTYsIGFybTY0X25lb25fc3FkbXVsaCwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cWRtdWxoc19zMzIsIGFybTY0X25lb25fc3FkbXVsaCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cWRtdWxsaF9zMTYsIGFybTY0X25lb25fc3FkbXVsbCwgVmVjdG9yUmV0IHwgVXNlMTI4Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxZG11bGxzX3MzMiwgYXJtNjRfbmVvbl9zcWRtdWxsc19zY2FsYXIsIDApLAorICBORU9OTUFQMSh2cW1vdm5kX3M2NCwgYXJtNjRfbmVvbl9zY2FsYXJfc3F4dG4sIEFkZFJldFR5cGUgfCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxbW92bmRfdTY0LCBhcm02NF9uZW9uX3NjYWxhcl91cXh0biwgQWRkUmV0VHlwZSB8IEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFtb3ZuaF9zMTYsIGFybTY0X25lb25fc3F4dG4sIFZlY3RvclJldCB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxbW92bmhfdTE2LCBhcm02NF9uZW9uX3VxeHRuLCBWZWN0b3JSZXQgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cW1vdm5zX3MzMiwgYXJtNjRfbmVvbl9zcXh0biwgVmVjdG9yUmV0IHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFtb3Zuc191MzIsIGFybTY0X25lb25fdXF4dG4sIFZlY3RvclJldCB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxbW92dW5kX3M2NCwgYXJtNjRfbmVvbl9zY2FsYXJfc3F4dHVuLCBBZGRSZXRUeXBlIHwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cW1vdnVuaF9zMTYsIGFybTY0X25lb25fc3F4dHVuLCBWZWN0b3JSZXQgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cW1vdnVuc19zMzIsIGFybTY0X25lb25fc3F4dHVuLCBWZWN0b3JSZXQgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cW5lZ2JfczgsIGFybTY0X25lb25fc3FuZWcsIFZlY3Rvcml6ZTFBcmdUeXBlIHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFuZWdkX3M2NCwgYXJtNjRfbmVvbl9zcW5lZywgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cW5lZ2hfczE2LCBhcm02NF9uZW9uX3NxbmVnLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxbmVnc19zMzIsIGFybTY0X25lb25fc3FuZWcsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFyZG11bGhoX3MxNiwgYXJtNjRfbmVvbl9zcXJkbXVsaCwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cXJkbXVsaHNfczMyLCBhcm02NF9uZW9uX3NxcmRtdWxoLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxcnNobGJfczgsIGFybTY0X25lb25fc3Fyc2hsLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxcnNobGJfdTgsIGFybTY0X25lb25fdXFyc2hsLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxcnNobGRfczY0LCBhcm02NF9uZW9uX3NxcnNobCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cXJzaGxkX3U2NCwgYXJtNjRfbmVvbl91cXJzaGwsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFyc2hsaF9zMTYsIGFybTY0X25lb25fc3Fyc2hsLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxcnNobGhfdTE2LCBhcm02NF9uZW9uX3VxcnNobCwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cXJzaGxzX3MzMiwgYXJtNjRfbmVvbl9zcXJzaGwsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFyc2hsc191MzIsIGFybTY0X25lb25fdXFyc2hsLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxcnNocm5kX25fczY0LCBhcm02NF9uZW9uX3NxcnNocm4sIEFkZFJldFR5cGUpLAorICBORU9OTUFQMSh2cXJzaHJuZF9uX3U2NCwgYXJtNjRfbmVvbl91cXJzaHJuLCBBZGRSZXRUeXBlKSwKKyAgTkVPTk1BUDEodnFyc2hybmhfbl9zMTYsIGFybTY0X25lb25fc3Fyc2hybiwgVmVjdG9yUmV0IHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFyc2hybmhfbl91MTYsIGFybTY0X25lb25fdXFyc2hybiwgVmVjdG9yUmV0IHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFyc2hybnNfbl9zMzIsIGFybTY0X25lb25fc3Fyc2hybiwgVmVjdG9yUmV0IHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFyc2hybnNfbl91MzIsIGFybTY0X25lb25fdXFyc2hybiwgVmVjdG9yUmV0IHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFyc2hydW5kX25fczY0LCBhcm02NF9uZW9uX3NxcnNocnVuLCBBZGRSZXRUeXBlKSwKKyAgTkVPTk1BUDEodnFyc2hydW5oX25fczE2LCBhcm02NF9uZW9uX3NxcnNocnVuLCBWZWN0b3JSZXQgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cXJzaHJ1bnNfbl9zMzIsIGFybTY0X25lb25fc3Fyc2hydW4sIFZlY3RvclJldCB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxc2hsYl9uX3M4LCBhcm02NF9uZW9uX3Nxc2hsLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxc2hsYl9uX3U4LCBhcm02NF9uZW9uX3Vxc2hsLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxc2hsYl9zOCwgYXJtNjRfbmVvbl9zcXNobCwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cXNobGJfdTgsIGFybTY0X25lb25fdXFzaGwsIFZlY3Rvcml6ZTFBcmdUeXBlIHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFzaGxkX3M2NCwgYXJtNjRfbmVvbl9zcXNobCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cXNobGRfdTY0LCBhcm02NF9uZW9uX3Vxc2hsLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxc2hsaF9uX3MxNiwgYXJtNjRfbmVvbl9zcXNobCwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cXNobGhfbl91MTYsIGFybTY0X25lb25fdXFzaGwsIFZlY3Rvcml6ZTFBcmdUeXBlIHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFzaGxoX3MxNiwgYXJtNjRfbmVvbl9zcXNobCwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cXNobGhfdTE2LCBhcm02NF9uZW9uX3Vxc2hsLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxc2hsc19uX3MzMiwgYXJtNjRfbmVvbl9zcXNobCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cXNobHNfbl91MzIsIGFybTY0X25lb25fdXFzaGwsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFzaGxzX3MzMiwgYXJtNjRfbmVvbl9zcXNobCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cXNobHNfdTMyLCBhcm02NF9uZW9uX3Vxc2hsLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxc2hsdWJfbl9zOCwgYXJtNjRfbmVvbl9zcXNobHUsIFZlY3Rvcml6ZTFBcmdUeXBlIHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFzaGx1aF9uX3MxNiwgYXJtNjRfbmVvbl9zcXNobHUsIFZlY3Rvcml6ZTFBcmdUeXBlIHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFzaGx1c19uX3MzMiwgYXJtNjRfbmVvbl9zcXNobHUsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFzaHJuZF9uX3M2NCwgYXJtNjRfbmVvbl9zcXNocm4sIEFkZFJldFR5cGUpLAorICBORU9OTUFQMSh2cXNocm5kX25fdTY0LCBhcm02NF9uZW9uX3Vxc2hybiwgQWRkUmV0VHlwZSksCisgIE5FT05NQVAxKHZxc2hybmhfbl9zMTYsIGFybTY0X25lb25fc3FzaHJuLCBWZWN0b3JSZXQgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cXNocm5oX25fdTE2LCBhcm02NF9uZW9uX3Vxc2hybiwgVmVjdG9yUmV0IHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFzaHJuc19uX3MzMiwgYXJtNjRfbmVvbl9zcXNocm4sIFZlY3RvclJldCB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxc2hybnNfbl91MzIsIGFybTY0X25lb25fdXFzaHJuLCBWZWN0b3JSZXQgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cXNocnVuZF9uX3M2NCwgYXJtNjRfbmVvbl9zcXNocnVuLCBBZGRSZXRUeXBlKSwKKyAgTkVPTk1BUDEodnFzaHJ1bmhfbl9zMTYsIGFybTY0X25lb25fc3FzaHJ1biwgVmVjdG9yUmV0IHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFzaHJ1bnNfbl9zMzIsIGFybTY0X25lb25fc3FzaHJ1biwgVmVjdG9yUmV0IHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnFzdWJiX3M4LCBhcm02NF9uZW9uX3Nxc3ViLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxc3ViYl91OCwgYXJtNjRfbmVvbl91cXN1YiwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cXN1YmRfczY0LCBhcm02NF9uZW9uX3Nxc3ViLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZxc3ViZF91NjQsIGFybTY0X25lb25fdXFzdWIsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFzdWJoX3MxNiwgYXJtNjRfbmVvbl9zcXN1YiwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2cXN1YmhfdTE2LCBhcm02NF9uZW9uX3Vxc3ViLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZxc3Vic19zMzIsIGFybTY0X25lb25fc3FzdWIsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnFzdWJzX3UzMiwgYXJtNjRfbmVvbl91cXN1YiwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cmVjcGVkX2Y2NCwgYXJtNjRfbmVvbl9mcmVjcGUsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnJlY3Blc19mMzIsIGFybTY0X25lb25fZnJlY3BlLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZyZWNweGRfZjY0LCBhcm02NF9uZW9uX2ZyZWNweCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cmVjcHhzX2YzMiwgYXJtNjRfbmVvbl9mcmVjcHgsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnJzaGxkX3M2NCwgYXJtNjRfbmVvbl9zcnNobCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2cnNobGRfdTY0LCBhcm02NF9uZW9uX3Vyc2hsLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZyc3FydGVkX2Y2NCwgYXJtNjRfbmVvbl9mcnNxcnRlLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZyc3FydGVzX2YzMiwgYXJtNjRfbmVvbl9mcnNxcnRlLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZyc3FydHNkX2Y2NCwgYXJtNjRfbmVvbl9mcnNxcnRzLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZyc3FydHNzX2YzMiwgYXJtNjRfbmVvbl9mcnNxcnRzLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZzaGExY3FfdTMyLCBhcm02NF9jcnlwdG9fc2hhMWMsIDApLAorICBORU9OTUFQMSh2c2hhMWhfdTMyLCBhcm02NF9jcnlwdG9fc2hhMWgsIDApLAorICBORU9OTUFQMSh2c2hhMW1xX3UzMiwgYXJtNjRfY3J5cHRvX3NoYTFtLCAwKSwKKyAgTkVPTk1BUDEodnNoYTFwcV91MzIsIGFybTY0X2NyeXB0b19zaGExcCwgMCksCisgIE5FT05NQVAxKHZzaGxkX3M2NCwgYXJtNjRfbmVvbl9zc2hsLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZzaGxkX3U2NCwgYXJtNjRfbmVvbl91c2hsLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZzbGlkX25fczY0LCBhcm02NF9uZW9uX3ZzbGksIFZlY3Rvcml6ZTFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnNsaWRfbl91NjQsIGFybTY0X25lb25fdnNsaSwgVmVjdG9yaXplMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2c3FhZGRiX3U4LCBhcm02NF9uZW9uX3VzcWFkZCwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2c3FhZGRkX3U2NCwgYXJtNjRfbmVvbl91c3FhZGQsIEFkZDFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnNxYWRkaF91MTYsIGFybTY0X25lb25fdXNxYWRkLCBWZWN0b3JpemUxQXJnVHlwZSB8IFVzZTY0Qml0VmVjdG9ycyksCisgIE5FT05NQVAxKHZzcWFkZHNfdTMyLCBhcm02NF9uZW9uX3VzcWFkZCwgQWRkMUFyZ1R5cGUpLAorICBORU9OTUFQMSh2c3JpZF9uX3M2NCwgYXJtNjRfbmVvbl92c3JpLCBWZWN0b3JpemUxQXJnVHlwZSksCisgIE5FT05NQVAxKHZzcmlkX25fdTY0LCBhcm02NF9uZW9uX3ZzcmksIFZlY3Rvcml6ZTFBcmdUeXBlKSwKKyAgTkVPTk1BUDEodnVxYWRkYl9zOCwgYXJtNjRfbmVvbl9zdXFhZGQsIFZlY3Rvcml6ZTFBcmdUeXBlIHwgVXNlNjRCaXRWZWN0b3JzKSwKKyAgTkVPTk1BUDEodnVxYWRkZF9zNjQsIGFybTY0X25lb25fc3VxYWRkLCBBZGQxQXJnVHlwZSksCisgIE5FT05NQVAxKHZ1cWFkZGhfczE2LCBhcm02NF9uZW9uX3N1cWFkZCwgVmVjdG9yaXplMUFyZ1R5cGUgfCBVc2U2NEJpdFZlY3RvcnMpLAorICBORU9OTUFQMSh2dXFhZGRzX3MzMiwgYXJtNjRfbmVvbl9zdXFhZGQsIEFkZDFBcmdUeXBlKSwKK307CisKKyN1bmRlZiBORU9OTUFQMAorI3VuZGVmIE5FT05NQVAxCisjdW5kZWYgTkVPTk1BUDIKKworc3RhdGljIGJvb2wgTkVPTlNJTURJbnRyaW5zaWNzUHJvdmVuU29ydGVkID0gZmFsc2U7CitzdGF0aWMgYm9vbCBBQXJjaDY0U0lTREludHJpbnNpY0luZm9Qcm92ZW5Tb3J0ZWQgPSBmYWxzZTsKKworc3RhdGljIGJvb2wgQVJNNjRTSU1ESW50cmluc2ljc1Byb3ZlblNvcnRlZCA9IGZhbHNlOworc3RhdGljIGJvb2wgQVJNNjRTSVNESW50cmluc2ljc1Byb3ZlblNvcnRlZCA9IGZhbHNlOworCisKK3N0YXRpYyBjb25zdCBOZW9uSW50cmluc2ljSW5mbyAqCitmaW5kTmVvbkludHJpbnNpY0luTWFwKGxsdm06OkFycmF5UmVmPE5lb25JbnRyaW5zaWNJbmZvPiBJbnRyaW5zaWNNYXAsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ1aWx0aW5JRCwgYm9vbCAmTWFwUHJvdmVuU29ydGVkKSB7CisKKyNpZm5kZWYgTkRFQlVHCisgIGlmICghTWFwUHJvdmVuU29ydGVkKSB7CisgICAgLy8gRklYTUU6IHVzZSBzdGQ6OmlzX3NvcnRlZCBvbmNlIEMrKzExIGlzIGFsbG93ZWQKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgSW50cmluc2ljTWFwLnNpemUoKSAtIDE7ICsraSkKKyAgICAgIGFzc2VydChJbnRyaW5zaWNNYXBbaV0uQnVpbHRpbklEIDw9IEludHJpbnNpY01hcFtpICsgMV0uQnVpbHRpbklEKTsKKyAgICBNYXBQcm92ZW5Tb3J0ZWQgPSB0cnVlOworICB9CisjZW5kaWYKKworICBjb25zdCBOZW9uSW50cmluc2ljSW5mbyAqQnVpbHRpbiA9CisgICAgICBzdGQ6Omxvd2VyX2JvdW5kKEludHJpbnNpY01hcC5iZWdpbigpLCBJbnRyaW5zaWNNYXAuZW5kKCksIEJ1aWx0aW5JRCk7CisKKyAgaWYgKEJ1aWx0aW4gIT0gSW50cmluc2ljTWFwLmVuZCgpICYmIEJ1aWx0aW4tPkJ1aWx0aW5JRCA9PSBCdWlsdGluSUQpCisgICAgcmV0dXJuIEJ1aWx0aW47CisKKyAgcmV0dXJuIDA7Cit9CisKK0Z1bmN0aW9uICpDb2RlR2VuRnVuY3Rpb246Okxvb2t1cE5lb25MTFZNSW50cmluc2ljKHVuc2lnbmVkIEludHJpbnNpY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpUeXBlICpBcmdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV4cHIgKkUpIHsKKyAgaW50IFZlY3RvclNpemUgPSAwOworICBpZiAoTW9kaWZpZXIgJiBVc2U2NEJpdFZlY3RvcnMpCisgICAgVmVjdG9yU2l6ZSA9IDY0OworICBlbHNlIGlmIChNb2RpZmllciAmIFVzZTEyOEJpdFZlY3RvcnMpCisgICAgVmVjdG9yU2l6ZSA9IDEyODsKKworICAvLyBSZXR1cm4gdHlwZS4KKyAgU21hbGxWZWN0b3I8bGx2bTo6VHlwZSAqLCAzPiBUeXM7CisgIGlmIChNb2RpZmllciAmIEFkZFJldFR5cGUpIHsKKyAgICBsbHZtOjpUeXBlICpUeSA9IENvbnZlcnRUeXBlKEUtPmdldENhbGxSZXR1cm5UeXBlKCkpOworICAgIGlmIChNb2RpZmllciAmIFZlY3Rvcml6ZVJldFR5cGUpCisgICAgICBUeSA9IGxsdm06OlZlY3RvclR5cGU6OmdldCgKKyAgICAgICAgICBUeSwgVmVjdG9yU2l6ZSA/IFZlY3RvclNpemUgLyBUeS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpIDogMSk7CisKKyAgICBUeXMucHVzaF9iYWNrKFR5KTsKKyAgfQorCisgIC8vIEFyZ3VtZW50cy4KKyAgaWYgKE1vZGlmaWVyICYgVmVjdG9yaXplQXJnVHlwZXMpIHsKKyAgICBpbnQgRWx0cyA9IFZlY3RvclNpemUgPyBWZWN0b3JTaXplIC8gQXJnVHlwZS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpIDogMTsKKyAgICBBcmdUeXBlID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KEFyZ1R5cGUsIEVsdHMpOworICB9CisKKyAgaWYgKE1vZGlmaWVyICYgKEFkZDFBcmdUeXBlIHwgQWRkMkFyZ1R5cGVzKSkKKyAgICBUeXMucHVzaF9iYWNrKEFyZ1R5cGUpOworCisgIGlmIChNb2RpZmllciAmIEFkZDJBcmdUeXBlcykKKyAgICBUeXMucHVzaF9iYWNrKEFyZ1R5cGUpOworCisgIGlmIChNb2RpZmllciAmIEludmVudEZsb2F0VHlwZSkKKyAgICBUeXMucHVzaF9iYWNrKEZsb2F0VHkpOworCisgIHJldHVybiBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpY0lELCBUeXMpOworfQorCitzdGF0aWMgVmFsdWUgKkVtaXRDb21tb25OZW9uU0lTREJ1aWx0aW5FeHByKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOZW9uSW50cmluc2ljSW5mbyAmU0lTREluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxWYWx1ZSAqPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXhwciAqRSkgeworICB1bnNpZ25lZCBCdWlsdGluSUQgPSBTSVNESW5mby5CdWlsdGluSUQ7CisgIHVuc2lnbmVkIGludCBJbnQgPSBTSVNESW5mby5MTFZNSW50cmluc2ljOworICB1bnNpZ25lZCBNb2RpZmllciA9IFNJU0RJbmZvLlR5cGVNb2RpZmllcjsKKyAgY29uc3QgY2hhciAqcyA9IFNJU0RJbmZvLk5hbWVIaW50OworCisgIHN3aXRjaCAoQnVpbHRpbklEKSB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlZF91NjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlc19mMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlZF9mNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0ZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0ZF91NjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0c19mMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0ZF9mNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2FsZXNfZjMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNhbGVkX2Y2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWx0c19mMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2FsdGRfZjY0OgorICAgIC8vIE9ubHkgb25lIGRpcmVjdGlvbiBvZiBjb21wYXJpc29ucyBhY3R1YWxseSBleGlzdCwgY21sZSBpcyBhY3R1YWxseSBhIGNtZ2UKKyAgICAvLyB3aXRoIHN3YXBwZWQgb3BlcmFuZHMuIFRoZSB0YWJsZSBnaXZlcyB1cyB0aGUgcmlnaHQgaW50cmluc2ljIGJ1dCB3ZQorICAgIC8vIHN0aWxsIG5lZWQgdG8gZG8gdGhlIHN3YXAuCisgICAgc3RkOjpzd2FwKE9wc1swXSwgT3BzWzFdKTsKKyAgICBicmVhazsKKyAgfQorCisgIGFzc2VydChJbnQgJiYgIkdlbmVyaWMgY29kZSBhc3N1bWVzIGEgdmFsaWQgaW50cmluc2ljIik7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSB0eXBlKHMpIG9mIHRoaXMgb3ZlcmxvYWRlZCBBQXJjaDY0IGludHJpbnNpYy4KKyAgY29uc3QgRXhwciAqQXJnID0gRS0+Z2V0QXJnKDApOworICBsbHZtOjpUeXBlICpBcmdUeSA9IENHRi5Db252ZXJ0VHlwZShBcmctPmdldFR5cGUoKSk7CisgIEZ1bmN0aW9uICpGID0gQ0dGLkxvb2t1cE5lb25MTFZNSW50cmluc2ljKEludCwgTW9kaWZpZXIsIEFyZ1R5LCBFKTsKKworICBpbnQgaiA9IDA7CisgIENvbnN0YW50SW50ICpDMCA9IENvbnN0YW50SW50OjpnZXQoQ0dGLkludDMyVHksIDApOworICBmb3IgKEZ1bmN0aW9uOjpjb25zdF9hcmdfaXRlcmF0b3IgYWkgPSBGLT5hcmdfYmVnaW4oKSwgYWUgPSBGLT5hcmdfZW5kKCk7CisgICAgICAgYWkgIT0gYWU7ICsrYWksICsraikgeworICAgIGxsdm06OlR5cGUgKkFyZ1R5ID0gYWktPmdldFR5cGUoKTsKKyAgICBpZiAoT3BzW2pdLT5nZXRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSA9PQorICAgICAgICAgICAgIEFyZ1R5LT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkpCisgICAgICBjb250aW51ZTsKKworICAgIGFzc2VydChBcmdUeS0+aXNWZWN0b3JUeSgpICYmICFPcHNbal0tPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKTsKKyAgICAvLyBUaGUgY29uc3RhbnQgYXJndW1lbnQgdG8gYW4gX25fIGludHJpbnNpYyBhbHdheXMgaGFzIEludDMyVHksIHNvIHRydW5jYXRlCisgICAgLy8gaXQgYmVmb3JlIGluc2VydGluZy4KKyAgICBPcHNbal0gPQorICAgICAgICBDR0YuQnVpbGRlci5DcmVhdGVUcnVuY09yQml0Q2FzdChPcHNbal0sIEFyZ1R5LT5nZXRWZWN0b3JFbGVtZW50VHlwZSgpKTsKKyAgICBPcHNbal0gPQorICAgICAgICBDR0YuQnVpbGRlci5DcmVhdGVJbnNlcnRFbGVtZW50KFVuZGVmVmFsdWU6OmdldChBcmdUeSksIE9wc1tqXSwgQzApOworICB9CisKKyAgVmFsdWUgKlJlc3VsdCA9IENHRi5FbWl0TmVvbkNhbGwoRiwgT3BzLCBzKTsKKyAgbGx2bTo6VHlwZSAqUmVzdWx0VHlwZSA9IENHRi5Db252ZXJ0VHlwZShFLT5nZXRUeXBlKCkpOworICBpZiAoUmVzdWx0VHlwZS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpIDwKKyAgICAgIFJlc3VsdC0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkpCisgICAgcmV0dXJuIENHRi5CdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KFJlc3VsdCwgQzApOworCisgIHJldHVybiBDR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KFJlc3VsdCwgUmVzdWx0VHlwZSwgcyk7Cit9CisKIHN0YXRpYyBWYWx1ZSAqRW1pdEFBcmNoNjRTY2FsYXJCdWlsdGluRXhwcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCdWlsdGluSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmVvbkludHJpbnNpY0luZm8gJlNJU0RJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFeHByICpFKSB7Ci0gIHVuc2lnbmVkIGludCBJbnQgPSAwOwotICAvLyBTY2FsYXIgcmVzdWx0IGdlbmVyYXRlZCBhY3Jvc3MgdmVjdG9ycwotICBib29sIEFjcm9zc1ZlYyA9IGZhbHNlOwotICAvLyBFeHRlbmQgZWxlbWVudCBvZiBvbmUtZWxlbWVudCB2ZWN0b3IKLSAgYm9vbCBFeHRlbmRFbGUgPSBmYWxzZTsKLSAgYm9vbCBPdmVybG9hZEludCA9IGZhbHNlOwotICBib29sIE92ZXJsb2FkQ21wSW50ID0gZmFsc2U7Ci0gIGJvb2wgSXNGcENtcFpJbnQgPSBmYWxzZTsKLSAgYm9vbCBPdmVybG9hZEN2dEludCA9IGZhbHNlOwotICBib29sIE92ZXJsb2FkV2lkZUludCA9IGZhbHNlOwotICBib29sIE92ZXJsb2FkTmFycm93SW50ID0gZmFsc2U7Ci0gIGNvbnN0IGNoYXIgKnMgPSBOVUxMOworICB1bnNpZ25lZCBCdWlsdGluSUQgPSBTSVNESW5mby5CdWlsdGluSUQ7CisgIHVuc2lnbmVkIGludCBJbnQgPSBTSVNESW5mby5MTFZNSW50cmluc2ljOworICBjb25zdCBjaGFyICpzID0gU0lTREluZm8uTmFtZUhpbnQ7CiAKICAgU21hbGxWZWN0b3I8VmFsdWUgKiwgND4gT3BzOwogICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRS0+Z2V0TnVtQXJncygpOyBpICE9IGU7IGkrKykgewpAQCAtMTc3NCwyMCArMjg4NCwyMCBAQAogICAvLyBhcmd1bWVudCB0aGF0IHNwZWNpZmllcyB0aGUgdmVjdG9yIHR5cGUsIG5lZWQgdG8gaGFuZGxlIGVhY2ggY2FzZS4KICAgc3dpdGNoIChCdWlsdGluSUQpIHsKICAgZGVmYXVsdDogYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92ZHVwc19sYW5lX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBkX2xhbmVfZjY0OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmR1cHNfbGFuZXFfZjMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmR1cGRfbGFuZXFfZjY0OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92ZHVwc19sYW5lX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBkX2xhbmVfZjY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cHNfbGFuZXFfZjMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cGRfbGFuZXFfZjY0OiB7CiAgICAgcmV0dXJuIENHRi5CdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KE9wc1swXSwgT3BzWzFdLCAidmR1cF9sYW5lIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBiX2xhbmVfaTg6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92ZHVwaF9sYW5lX2kxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBzX2xhbmVfaTMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmR1cGRfbGFuZV9pNjQ6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92ZHVwYl9sYW5lcV9pODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBoX2xhbmVxX2kxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBzX2xhbmVxX2kzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBkX2xhbmVxX2k2NDogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cGJfbGFuZV9pODoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBoX2xhbmVfaTE2OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cHNfbGFuZV9pMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92ZHVwZF9sYW5lX2k2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBiX2xhbmVxX2k4OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cGhfbGFuZXFfaTE2OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cHNfbGFuZXFfaTMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cGRfbGFuZXFfaTY0OiB7CiAgICAgLy8gVGhlIGJhY2tlbmQgdHJlYXRzIE5lb24gc2NhbGFyIHR5cGVzIGFzIHYxaXggdHlwZXMKICAgICAvLyBTbyB3ZSB3YW50IHRvIGR1cCBsYW5lIGZyb20gYW55IHZlY3RvciB0byB2MWl4IHZlY3RvcgogICAgIC8vIHdpdGggc2h1ZmZsZXZlY3RvcgpAQCAtMTc5OSwxOSArMjkwOSwxOSBAQAogICAgIC8vIHNjYWxhciB0eXBlIGV4cGVjdGVkIGJ5IHRoZSBidWlsdGluCiAgICAgcmV0dXJuIENHRi5CdWlsZGVyLkNyZWF0ZUJpdENhc3QoUmVzdWx0LCBUeSwgcyk7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxoX2xhbmVfczE2IDoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxoX2xhbmVxX3MxNiA6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsc19sYW5lX3MzMiA6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsc19sYW5lcV9zMzIgOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFkbWxzbGhfbGFuZV9zMTYgOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFkbWxzbGhfbGFuZXFfczE2IDoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xzX2xhbmVfczMyIDoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xzX2xhbmVxX3MzMiA6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxoX2xhbmVfczE2IDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxoX2xhbmVxX3MxNiA6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsc19sYW5lX3MzMiA6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsc19sYW5lcV9zMzIgOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFkbWxzbGhfbGFuZV9zMTYgOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFkbWxzbGhfbGFuZXFfczE2IDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xzX2xhbmVfczMyIDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xzX2xhbmVxX3MzMiA6IHsKICAgICBJbnQgPSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZxYWRkczsKLSAgICBpZiAoQnVpbHRpbklEID09IEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFkbWxzbGhfbGFuZV9zMTYgfHwKLSAgICAgICAgQnVpbHRpbklEID09IEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFkbWxzbGhfbGFuZXFfczE2IHx8Ci0gICAgICAgIEJ1aWx0aW5JRCA9PSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xzX2xhbmVfczMyIHx8Ci0gICAgICAgIEJ1aWx0aW5JRCA9PSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xzX2xhbmVxX3MzMikgeworICAgIGlmIChCdWlsdGluSUQgPT0gTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbHNsaF9sYW5lX3MxNiB8fAorICAgICAgICBCdWlsdGluSUQgPT0gTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbHNsaF9sYW5lcV9zMTYgfHwKKyAgICAgICAgQnVpbHRpbklEID09IE5FT046OkJJX19idWlsdGluX25lb25fdnFkbWxzbHNfbGFuZV9zMzIgfHwKKyAgICAgICAgQnVpbHRpbklEID09IE5FT046OkJJX19idWlsdGluX25lb25fdnFkbWxzbHNfbGFuZXFfczMyKSB7CiAgICAgICBJbnQgPSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc3ViczsKICAgICB9CiAgICAgLy8gY3JlYXRlIHZxZG11bGwgY2FsbCB3aXRoIGIgKiBjW2ldCkBAIC0xODM5LDIzICsyOTQ5LDIzIEBACiAgICAgVmFsdWUgKkFkZFJlcyA9IENHRi5CdWlsZGVyLkNyZWF0ZUNhbGwyKEYsIEFkZE9wc1swXSwgQWRkT3BzWzFdKTsKICAgICByZXR1cm4gQ0dGLkJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChBZGRSZXMsIFR5KTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmZtYXNfbGFuZV9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Zm1hc19sYW5lcV9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Zm1hZF9sYW5lX2Y2NDoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFkX2xhbmVxX2Y2NDogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmZtYXNfbGFuZV9mMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1hc19sYW5lcV9mMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1hZF9sYW5lX2Y2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFkX2xhbmVxX2Y2NDogewogICAgIGxsdm06OlR5cGUgKlR5ID0gQ0dGLkNvbnZlcnRUeXBlKEUtPmdldENhbGxSZXR1cm5UeXBlKCkpOwogICAgIFZhbHVlICpGID0gQ0dGLkNHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjpmbWEsIFR5KTsKICAgICBPcHNbMl0gPSBDR0YuQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChPcHNbMl0sIE9wc1szXSwgImV4dHJhY3QiKTsKICAgICByZXR1cm4gQ0dGLkJ1aWxkZXIuQ3JlYXRlQ2FsbDMoRiwgT3BzWzFdLCBPcHNbMl0sIE9wc1swXSk7CiAgIH0KICAgLy8gU2NhbGFyIEZsb2F0aW5nLXBvaW50IE11bHRpcGx5IEV4dGVuZGVkCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bXVseHNfZjMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdm11bHhkX2Y2NDogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm11bHhzX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWx4ZF9mNjQ6IHsKICAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92bXVseDsKICAgICBsbHZtOjpUeXBlICpUeSA9IENHRi5Db252ZXJ0VHlwZShFLT5nZXRDYWxsUmV0dXJuVHlwZSgpKTsKICAgICByZXR1cm4gQ0dGLkVtaXROZW9uQ2FsbChDR0YuQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidm11bHgiKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdm11bF9uX2Y2NDogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm11bF9uX2Y2NDogewogICAgIC8vIHYxZjY0IHZtdWxfbl9mNjQgIHNob3VsZCBiZSBtYXBwZWQgdG8gTmVvbiBzY2FsYXIgbXVsIGxhbmUKICAgICBsbHZtOjpUeXBlICpWVHkgPSBHZXROZW9uVHlwZSgmQ0dGLAogICAgICAgTmVvblR5cGVGbGFncyhOZW9uVHlwZUZsYWdzOjpGbG9hdDY0LCBmYWxzZSwgZmFsc2UpKTsKQEAgLTE4NjUsNzg4ICsyOTc1LDUyMyBAQAogICAgIFZhbHVlICpSZXN1bHQgPSBDR0YuQnVpbGRlci5DcmVhdGVGTXVsKE9wc1swXSwgT3BzWzFdKTsKICAgICByZXR1cm4gQ0dGLkJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChSZXN1bHQsIFZUeSk7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfaTMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2k2NDoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfZjY0OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2k2NDoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfZjMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9mNjQ6Ci0gICAgcmV0dXJuIENHRi5FbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pOCwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTg6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2kzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pNjQ6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfZjMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2Y2NDoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTg6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2kxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNldHFfbGFuZV9pNjQ6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfZjY0OgotICAgIHJldHVybiBDR0YuRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTgsIEUpOwotICAvLyBDcnlwdG8KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGExaF91MzI6Ci0gICAgSW50ID0gSW50cmluc2ljOjphcm1fbmVvbl9zaGExaDsKLSAgICBzID0gInNoYTFoIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGExY3FfdTMyOgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3NoYTFjOwotICAgIHMgPSAic2hhMWMiOyBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGExcHFfdTMyOgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3NoYTFwOwotICAgIHMgPSAic2hhMXAiOyBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGExbXFfdTMyOgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3NoYTFtOwotICAgIHMgPSAic2hhMW0iOyBicmVhazsKLSAgLy8gU2NhbGFyIEFkZAotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZGRfczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZhZGRkczsKLSAgICBzID0gInZhZGRkcyI7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZGRfdTY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZhZGRkdTsKLSAgICBzID0gInZhZGRkdSI7IGJyZWFrOwotICAvLyBTY2FsYXIgU3ViCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3ViZF9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnN1YmRzOwotICAgIHMgPSAidnN1YmRzIjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3ViZF91NjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnN1YmR1OwotICAgIHMgPSAidnN1YmR1IjsgYnJlYWs7Ci0gIC8vIFNjYWxhciBTYXR1cmF0aW5nIEFkZAotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFhZGRiX3M4OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFhZGRoX3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWRkc19zMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cWFkZGRfczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdnFhZGRzOwotICAgIHMgPSAidnFhZGRzIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWRkYl91ODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWRkaF91MTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cWFkZHNfdTMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFhZGRkX3U2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZxYWRkdTsKLSAgICBzID0gInZxYWRkdSI7IE92ZXJsb2FkSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBTYXR1cmF0aW5nIFN1YgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzdWJiX3M4OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzdWJoX3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc3Vic19zMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXN1YmRfczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdnFzdWJzOwotICAgIHMgPSAidnFzdWJzIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc3ViYl91ODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc3ViaF91MTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXN1YnNfdTMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzdWJkX3U2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc3VidTsKLSAgICBzID0gInZxc3VidSI7IE92ZXJsb2FkSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBTaGlmdCBMZWZ0Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2hsZF9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNobGRzOwotICAgIHMgPSAidnNobGRzIjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2hsZF91NjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNobGR1OwotICAgIHMgPSAidnNobGR1IjsgYnJlYWs7Ci0gIC8vIFNjYWxhciBTYXR1cmF0aW5nIFNoaWZ0IExlZnQKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsYl9zODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsaF9zMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXNobHNfczMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGxkX3M2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92cXNobHM7Ci0gICAgcyA9ICJ2cXNobHMiOyBPdmVybG9hZEludCA9IHRydWU7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGxiX3U4OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGxoX3UxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsc191MzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXNobGRfdTY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Zxc2hsdTsKLSAgICBzID0gInZxc2hsdSI7IE92ZXJsb2FkSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBSb3VkaW5nIFNoaWZ0IExlZnQKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hsZF9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnJzaGxkczsKLSAgICBzID0gInZyc2hsZHMiOyBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hsZF91NjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnJzaGxkdTsKLSAgICBzID0gInZyc2hsZHUiOyBicmVhazsKLSAgLy8gU2NhbGFyIFNhdHVyYXRpbmcgUm91ZGluZyBTaGlmdCBMZWZ0Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJzaGxiX3M4OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFyc2hsaF9zMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJzaGxzX3MzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNobGRfczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZxcnNobHM7Ci0gICAgcyA9ICJ2cXJzaGxzIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNobGJfdTg6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJzaGxoX3UxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNobHNfdTMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFyc2hsZF91NjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnFyc2hsdTsKLSAgICBzID0gInZxcnNobHUiOyBPdmVybG9hZEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgUmVkdWNlIFBhaXJ3aXNlIEFkZAotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnBhZGRkX3M2NDoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRkZF91NjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnBhZGQ7IHMgPSAidnBhZGQiOwotICAgIGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnBhZGRzX2YzMjoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92cGZhZGQ7IHMgPSAidnBmYWRkIjsKLSAgICBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRkZF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnBmYWRkcTsgcyA9ICJ2cGZhZGRxIjsKLSAgICBicmVhazsKLSAgLy8gU2NhbGFyIFJlZHVjZSBQYWlyd2lzZSBGbG9hdGluZyBQb2ludCBNYXgKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWF4c19mMzI6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnBtYXg7IHMgPSAidnBtYXgiOwotICAgIGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnBtYXhxZF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnBtYXhxOyBzID0gInZwbWF4cSI7Ci0gICAgYnJlYWs7Ci0gIC8vIFNjYWxhciBSZWR1Y2UgUGFpcndpc2UgRmxvYXRpbmcgUG9pbnQgTWluCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cG1pbnNfZjMyOgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZwbWluOyBzID0gInZwbWluIjsKLSAgICBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWlucWRfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZwbWlucTsgcyA9ICJ2cG1pbnEiOwotICAgIGJyZWFrOwotICAvLyBTY2FsYXIgUmVkdWNlIFBhaXJ3aXNlIEZsb2F0aW5nIFBvaW50IE1heG5tCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cG1heG5tc19mMzI6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnBmbWF4bm07IHMgPSAidnBmbWF4bm0iOwotICAgIGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnBtYXhubXFkX2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92cGZtYXhubXE7IHMgPSAidnBmbWF4bm1xIjsKLSAgICBicmVhazsKLSAgLy8gU2NhbGFyIFJlZHVjZSBQYWlyd2lzZSBGbG9hdGluZyBQb2ludCBNaW5ubQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnBtaW5ubXNfZjMyOgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZwZm1pbm5tOyBzID0gInZwZm1pbm5tIjsKLSAgICBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWlubm1xZF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnBmbWlubm1xOyBzID0gInZwZm1pbm5tcSI7Ci0gICAgYnJlYWs7Ci0gIC8vIFRoZSBmb2xsb3dpbmdzIGFyZSBpbnRyaW5zaWNzIHdpdGggc2NhbGFyIHJlc3VsdHMgZ2VuZXJhdGVkIEFjcm9zc1ZlYyB2ZWN0b3JzCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWRkbHZfczg6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWRkbHZfczE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZGx2cV9zODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGRsdnFfczE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZGx2cV9zMzI6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fc2FkZGx2OwotICAgIEFjcm9zc1ZlYyA9IHRydWU7IEV4dGVuZEVsZSA9IHRydWU7IHMgPSAic2FkZGx2IjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWRkbHZfdTg6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWRkbHZfdTE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZGx2cV91ODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGRsdnFfdTE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZGx2cV91MzI6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdWFkZGx2OwotICAgIEFjcm9zc1ZlYyA9IHRydWU7IEV4dGVuZEVsZSA9IHRydWU7IHMgPSAidWFkZGx2IjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWF4dl9zODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXh2X3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXh2cV9zODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXh2cV9zMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWF4dnFfczMyOgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3NtYXh2OwotICAgIEFjcm9zc1ZlYyA9IHRydWU7IEV4dGVuZEVsZSA9IGZhbHNlOyBzID0gInNtYXh2IjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWF4dl91ODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXh2X3UxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXh2cV91ODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXh2cV91MTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWF4dnFfdTMyOgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3VtYXh2OwotICAgIEFjcm9zc1ZlYyA9IHRydWU7IEV4dGVuZEVsZSA9IGZhbHNlOyBzID0gInVtYXh2IjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWludl9zODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW52X3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW52cV9zODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW52cV9zMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWludnFfczMyOgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3NtaW52OwotICAgIEFjcm9zc1ZlYyA9IHRydWU7IEV4dGVuZEVsZSA9IGZhbHNlOyBzID0gInNtaW52IjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWludl91ODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW52X3UxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW52cV91ODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW52cV91MTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWludnFfdTMyOgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3VtaW52OwotICAgIEFjcm9zc1ZlYyA9IHRydWU7IEV4dGVuZEVsZSA9IGZhbHNlOyBzID0gInVtaW52IjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWRkdl9zODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGR2X3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGR2cV9zODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGR2cV9zMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWRkdnFfczMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZHZxX3M2NDoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGR2X3U4OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZHZfdTE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZHZxX3U4OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZHZxX3UxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGR2cV91MzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWRkdnFfdTY0OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZHZfZjMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZHZxX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGR2cV9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmFkZHY7Ci0gICAgQWNyb3NzVmVjID0gdHJ1ZTsgRXh0ZW5kRWxlID0gZmFsc2U7IHMgPSAidmFkZHYiOyBicmVhazsgICAgICAKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXh2X2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXh2cV9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWF4dnFfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZtYXh2OwotICAgIEFjcm9zc1ZlYyA9IHRydWU7IEV4dGVuZEVsZSA9IGZhbHNlOyBzID0gInZtYXh2IjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWludl9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWludnFfZjMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdm1pbnZxX2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92bWludjsKLSAgICBBY3Jvc3NWZWMgPSB0cnVlOyBFeHRlbmRFbGUgPSBmYWxzZTsgcyA9ICJ2bWludiI7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdm1heG5tdl9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWF4bm12cV9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWF4bm12cV9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdm1heG5tdjsKLSAgICBBY3Jvc3NWZWMgPSB0cnVlOyBFeHRlbmRFbGUgPSBmYWxzZTsgcyA9ICJ2bWF4bm12IjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWlubm12X2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW5ubXZxX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW5ubXZxX2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92bWlubm12OwotICAgIEFjcm9zc1ZlYyA9IHRydWU7IEV4dGVuZEVsZSA9IGZhbHNlOyBzID0gInZtaW5ubXYiOyBicmVhazsKLSAgLy8gU2NhbGFyIEludGVnZXIgU2F0dXJhdGluZyBEb3VibGluZyBNdWx0aXBseSBIYWxmIEhpZ2gKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG11bGhoX3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG11bGhzX3MzMjoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZxZG11bGg7Ci0gICAgcyA9ICJ2cWRtdWxoIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIEludGVnZXIgU2F0dXJhdGluZyBSb3VuZGluZyBEb3VibGluZyBNdWx0aXBseSBIYWxmIEhpZ2gKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxcmRtdWxoaF9zMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJkbXVsaHNfczMyOgotICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdnFyZG11bGg7Ci0gICAgcyA9ICJ2cXJkbXVsaCI7IE92ZXJsb2FkSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBGbG9hdGluZy1wb2ludCBSZWNpcHJvY2FsIFN0ZXAgYW5kCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cmVjcHNzX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZyZWNwc2RfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdnJlY3BzOwotICAgIHMgPSAidnJlY3BzIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIEZsb2F0aW5nLXBvaW50IFJlY2lwcm9jYWwgU3F1YXJlIFJvb3QgU3RlcAotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJzcXJ0c3NfZjMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJzcXJ0c2RfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdnJzcXJ0czsKLSAgICBzID0gInZyc3FydHMiOyBPdmVybG9hZEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgU2lnbmVkIEludGVnZXIgQ29udmVydCBUbyBGbG9hdGluZy1wb2ludAotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHNfZjMyX3MzMjoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92Y3Z0ZjMyX3MzMiwKLSAgICBzID0gInZjdnRmIjsgT3ZlcmxvYWRJbnQgPSBmYWxzZTsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9mNjRfczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjdnRmNjRfczY0LAotICAgIHMgPSAidmN2dGYiOyBPdmVybG9hZEludCA9IGZhbHNlOyBicmVhazsKLSAgLy8gU2NhbGFyIFVuc2lnbmVkIEludGVnZXIgQ29udmVydCBUbyBGbG9hdGluZy1wb2ludAotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHNfZjMyX3UzMjoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92Y3Z0ZjMyX3UzMiwKLSAgICBzID0gInZjdnRmIjsgT3ZlcmxvYWRJbnQgPSBmYWxzZTsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9mNjRfdTY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjdnRmNjRfdTY0LAotICAgIHMgPSAidmN2dGYiOyBPdmVybG9hZEludCA9IGZhbHNlOyBicmVhazsKLSAgLy8gU2NhbGFyIEZsb2F0aW5nLXBvaW50IENvbnZlcnRzCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0eGRfZjMyX2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0eG47Ci0gICAgcyA9ICJ2Y3Z0eG4iOyBPdmVybG9hZEN2dEludCA9IHRydWU7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dGFzX3MzMl9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YWRfczY0X2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0YXM7Ci0gICAgcyA9ICJ2Y3Z0YXMiOyBPdmVybG9hZEN2dEludCA9IHRydWU7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dGFzX3UzMl9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YWRfdTY0X2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0YXU7Ci0gICAgcyA9ICJ2Y3Z0YXUiOyBPdmVybG9hZEN2dEludCA9IHRydWU7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dG1zX3MzMl9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bWRfczY0X2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0bXM7Ci0gICAgcyA9ICJ2Y3Z0bXMiOyBPdmVybG9hZEN2dEludCA9IHRydWU7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dG1zX3UzMl9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bWRfdTY0X2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0bXU7Ci0gICAgcyA9ICJ2Y3Z0bXUiOyBPdmVybG9hZEN2dEludCA9IHRydWU7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dG5zX3MzMl9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bmRfczY0X2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0bnM7Ci0gICAgcyA9ICJ2Y3Z0bnMiOyBPdmVybG9hZEN2dEludCA9IHRydWU7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dG5zX3UzMl9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bmRfdTY0X2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0bnU7Ci0gICAgcyA9ICJ2Y3Z0bnUiOyBPdmVybG9hZEN2dEludCA9IHRydWU7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHBzX3MzMl9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cGRfczY0X2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0cHM7Ci0gICAgcyA9ICJ2Y3Z0cHMiOyBPdmVybG9hZEN2dEludCA9IHRydWU7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHBzX3UzMl9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cGRfdTY0X2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0cHU7Ci0gICAgcyA9ICJ2Y3Z0cHUiOyBPdmVybG9hZEN2dEludCA9IHRydWU7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHNfczMyX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRkX3M2NF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fZmN2dHpzOwotICAgIHMgPSAidmN2dHpzIjsgT3ZlcmxvYWRDdnRJbnQgPSB0cnVlOyBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRzX3UzMl9mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0ZF91NjRfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX2ZjdnR6dTsKLSAgICBzID0gInZjdnR6dSI7IE92ZXJsb2FkQ3Z0SW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBGbG9hdGluZy1wb2ludCBSZWNpcHJvY2FsIEVzdGltYXRlCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cmVjcGVzX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZyZWNwZWRfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdnJlY3BlOwotICAgIHMgPSAidnJlY3BlIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIEZsb2F0aW5nLXBvaW50IFJlY2lwcm9jYWwgRXhwb25lbnQKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZyZWNweHNfZjMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJlY3B4ZF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnJlY3B4OwotICAgIHMgPSAidnJlY3B4IjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIEZsb2F0aW5nLXBvaW50IFJlY2lwcm9jYWwgU3F1YXJlIFJvb3QgRXN0aW1hdGUKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3FydGVzX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3FydGVkX2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFybV9uZW9uX3Zyc3FydGU7Ci0gICAgcyA9ICJ2cnNxcnRlIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIENvbXBhcmUgRXF1YWwKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXFkX3M2NDoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXFkX3U2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92Y2VxOyBzID0gInZjZXEiOwotICAgIE92ZXJsb2FkQ21wSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBDb21wYXJlIEVxdWFsIFRvIFplcm8KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXF6ZF9zNjQ6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2VxemRfdTY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjZXE7IHMgPSAidmNlcSI7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfaTg6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfaTE2OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2kzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfZjMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2Y2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTg6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2kxNjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfZjY0OgorICAgIHJldHVybiBDR0YuRW1pdEFSTUJ1aWx0aW5FeHByKE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2k4LCBFKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pODoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pMTY6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2k2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9mMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfZjY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldHFfbGFuZV9pODoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTE2OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldHFfbGFuZV9pMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2k2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfZjMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldHFfbGFuZV9mNjQ6CisgICAgcmV0dXJuIENHRi5FbWl0QVJNQnVpbHRpbkV4cHIoTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTgsIEUpOworCisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2VxemRfczY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNlcXpkX3U2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ2V6ZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2d0emRfczY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsZXpkX3M2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHR6ZF9zNjQ6CiAgICAgLy8gQWRkIGltcGxpY2l0IHplcm8gb3BlcmFuZC4KICAgICBPcHMucHVzaF9iYWNrKGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoT3BzWzBdLT5nZXRUeXBlKCkpKTsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgQ29tcGFyZSBHcmVhdGVyIFRoYW4gb3IgRXF1YWwKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ2VkX3M2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92Y2dlOyBzID0gInZjZ2UiOwotICAgIE92ZXJsb2FkQ21wSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2dlZF91NjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNoczsgcyA9ICJ2Y2dlIjsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgQ29tcGFyZSBHcmVhdGVyIFRoYW4gb3IgRXF1YWwgVG8gWmVybwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNnZXpkX3M2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92Y2dlOyBzID0gInZjZ2UiOwotICAgIC8vIEFkZCBpbXBsaWNpdCB6ZXJvIG9wZXJhbmQuCi0gICAgT3BzLnB1c2hfYmFjayhsbHZtOjpDb25zdGFudDo6Z2V0TnVsbFZhbHVlKE9wc1swXS0+Z2V0VHlwZSgpKSk7Ci0gICAgT3ZlcmxvYWRDbXBJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIENvbXBhcmUgR3JlYXRlciBUaGFuCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2d0ZF9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNndDsgcyA9ICJ2Y2d0IjsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNndGRfdTY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjaGk7IHMgPSAidmNndCI7Ci0gICAgT3ZlcmxvYWRDbXBJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIENvbXBhcmUgR3JlYXRlciBUaGFuIFplcm8KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ3R6ZF9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNndDsgcyA9ICJ2Y2d0IjsKLSAgICAvLyBBZGQgaW1wbGljaXQgemVybyBvcGVyYW5kLgotICAgIE9wcy5wdXNoX2JhY2sobGx2bTo6Q29uc3RhbnQ6OmdldE51bGxWYWx1ZShPcHNbMF0tPmdldFR5cGUoKSkpOwotICAgIE92ZXJsb2FkQ21wSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBDb21wYXJlIExlc3MgVGhhbiBvciBFcXVhbAotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNsZWRfczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjZ2U7IHMgPSAidmNnZSI7Ci0gICAgT3ZlcmxvYWRDbXBJbnQgPSB0cnVlOyBzdGQ6OnN3YXAoT3BzWzBdLCBPcHNbMV0pOyBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbGVkX3U2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92Y2hzOyBzID0gInZjaHMiOwotICAgIE92ZXJsb2FkQ21wSW50ID0gdHJ1ZTsgc3RkOjpzd2FwKE9wc1swXSwgT3BzWzFdKTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBDb21wYXJlIExlc3MgVGhhbiBvciBFcXVhbCBUbyBaZXJvCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2xlemRfczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjbGV6OyBzID0gInZjbGUiOwotICAgIC8vIEFkZCBpbXBsaWNpdCB6ZXJvIG9wZXJhbmQuCi0gICAgT3BzLnB1c2hfYmFjayhsbHZtOjpDb25zdGFudDo6Z2V0TnVsbFZhbHVlKE9wc1swXS0+Z2V0VHlwZSgpKSk7Ci0gICAgT3ZlcmxvYWRDbXBJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIENvbXBhcmUgTGVzcyBUaGFuCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2x0ZF9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNndDsgcyA9ICJ2Y2d0IjsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IHN0ZDo6c3dhcChPcHNbMF0sIE9wc1sxXSk7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNsdGRfdTY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjaGk7IHMgPSAidmNoaSI7Ci0gICAgT3ZlcmxvYWRDbXBJbnQgPSB0cnVlOyBzdGQ6OnN3YXAoT3BzWzBdLCBPcHNbMV0pOyBicmVhazsKLSAgLy8gU2NhbGFyIENvbXBhcmUgTGVzcyBUaGFuIFplcm8KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHR6ZF9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNsdHo7IHMgPSAidmNsdCI7Ci0gICAgLy8gQWRkIGltcGxpY2l0IHplcm8gb3BlcmFuZC4KLSAgICBPcHMucHVzaF9iYWNrKGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoT3BzWzBdLT5nZXRUeXBlKCkpKTsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgRmxvYXRpbmctcG9pbnQgQ29tcGFyZSBFcXVhbAotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNlcXNfZjMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNlcWRfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjZXE7IHMgPSAidmNlcSI7Ci0gICAgT3ZlcmxvYWRDbXBJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIEZsb2F0aW5nLXBvaW50IENvbXBhcmUgRXF1YWwgVG8gWmVybwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNlcXpzX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXF6ZF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNlcTsgcyA9ICJ2Y2VxIjsKKyAgICBicmVhazsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXF6c19mMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2VxemRfZjY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNnZXpzX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ2V6ZF9mNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2d0enNfZjMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNndHpkX2Y2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbGV6c19mMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlemRfZjY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsdHpzX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHR6ZF9mNjQ6CiAgICAgLy8gQWRkIGltcGxpY2l0IHplcm8gb3BlcmFuZC4KICAgICBPcHMucHVzaF9iYWNrKGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoQ0dGLkZsb2F0VHkpKTsKLSAgICBJc0ZwQ21wWkludCA9IHRydWU7Ci0gICAgT3ZlcmxvYWRDbXBJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIEZsb2F0aW5nLXBvaW50IENvbXBhcmUgR3JlYXRlciBUaGFuIE9yIEVxdWFsCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2dlc19mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2dlZF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNnZTsgcyA9ICJ2Y2dlIjsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgRmxvYXRpbmctcG9pbnQgQ29tcGFyZSBHcmVhdGVyIFRoYW4gT3IgRXF1YWwgVG8gWmVybwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNnZXpzX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ2V6ZF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNnZTsgcyA9ICJ2Y2dlIjsKLSAgICAvLyBBZGQgaW1wbGljaXQgemVybyBvcGVyYW5kLgotICAgIE9wcy5wdXNoX2JhY2sobGx2bTo6Q29uc3RhbnQ6OmdldE51bGxWYWx1ZShDR0YuRmxvYXRUeSkpOwotICAgIElzRnBDbXBaSW50ID0gdHJ1ZTsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgRmxvYXRpbmctcG9pbnQgQ29tcGFyZSBHcmVhdGhlciBUaGFuCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2d0c19mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2d0ZF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNndDsgcyA9ICJ2Y2d0IjsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgRmxvYXRpbmctcG9pbnQgQ29tcGFyZSBHcmVhdGhlciBUaGFuIFplcm8KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ3R6c19mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2d0emRfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjZ3Q7IHMgPSAidmNndCI7Ci0gICAgLy8gQWRkIGltcGxpY2l0IHplcm8gb3BlcmFuZC4KLSAgICBPcHMucHVzaF9iYWNrKGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoQ0dGLkZsb2F0VHkpKTsKLSAgICBJc0ZwQ21wWkludCA9IHRydWU7Ci0gICAgT3ZlcmxvYWRDbXBJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIEZsb2F0aW5nLXBvaW50IENvbXBhcmUgTGVzcyBUaGFuIG9yIEVxdWFsCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2xlc19mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2xlZF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNnZTsgcyA9ICJ2Y2dlIjsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgRmxvYXRpbmctcG9pbnQgQ29tcGFyZSBMZXNzIFRoYW4gT3IgRXF1YWwgVG8gWmVybwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNsZXpzX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbGV6ZF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNsZXo7IHMgPSAidmNsZSI7Ci0gICAgLy8gQWRkIGltcGxpY2l0IHplcm8gb3BlcmFuZC4KLSAgICBPcHMucHVzaF9iYWNrKGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoQ0dGLkZsb2F0VHkpKTsKLSAgICBJc0ZwQ21wWkludCA9IHRydWU7Ci0gICAgT3ZlcmxvYWRDbXBJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIEZsb2F0aW5nLXBvaW50IENvbXBhcmUgTGVzcyBUaGFuIFplcm8KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHRzX2YzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHRkX2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92Y2d0OyBzID0gInZjZ3QiOwotICAgIE92ZXJsb2FkQ21wSW50ID0gdHJ1ZTsgc3RkOjpzd2FwKE9wc1swXSwgT3BzWzFdKTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBGbG9hdGluZy1wb2ludCBDb21wYXJlIExlc3MgVGhhbiBaZXJvCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2x0enNfZjMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNsdHpkX2Y2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92Y2x0ejsgcyA9ICJ2Y2x0IjsKLSAgICAvLyBBZGQgaW1wbGljaXQgemVybyBvcGVyYW5kLgotICAgIE9wcy5wdXNoX2JhY2sobGx2bTo6Q29uc3RhbnQ6OmdldE51bGxWYWx1ZShDR0YuRmxvYXRUeSkpOwotICAgIElzRnBDbXBaSW50ID0gdHJ1ZTsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgRmxvYXRpbmctcG9pbnQgQWJzb2x1dGUgQ29tcGFyZSBHcmVhdGVyIFRoYW4gT3IgRXF1YWwKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWdlc19mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2FnZWRfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjYWdlOyBzID0gInZjYWdlIjsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgRmxvYXRpbmctcG9pbnQgQWJzb2x1dGUgQ29tcGFyZSBHcmVhdGVyIFRoYW4KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWd0c19mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2FndGRfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjYWd0OyBzID0gInZjYWd0IjsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgRmxvYXRpbmctcG9pbnQgQWJzb2x1dGUgQ29tcGFyZSBMZXNzIFRoYW4gT3IgRXF1YWwKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWxlc19mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2FsZWRfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjYWdlOyBzID0gInZjYWdlIjsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IHN0ZDo6c3dhcChPcHNbMF0sIE9wc1sxXSk7IGJyZWFrOwotICAvLyBTY2FsYXIgRmxvYXRpbmctcG9pbnQgQWJzb2x1dGUgQ29tcGFyZSBMZXNzIFRoYW4KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWx0c19mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2FsdGRfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjYWd0OyBzID0gInZjYWx0IjsKLSAgICBPdmVybG9hZENtcEludCA9IHRydWU7IHN0ZDo6c3dhcChPcHNbMF0sIE9wc1sxXSk7IGJyZWFrOwotICAvLyBTY2FsYXIgQ29tcGFyZSBCaXR3aXNlIFRlc3QgQml0cwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnRzdGRfczY0OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnRzdGRfdTY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z0c3RkOyBzID0gInZ0c3QiOwotICAgIE92ZXJsb2FkQ21wSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBBYnNvbHV0ZSBWYWx1ZQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFic2RfczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZhYnM7Ci0gICAgcyA9ICJ2YWJzIjsgT3ZlcmxvYWRJbnQgPSBmYWxzZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBBYnNvbHV0ZSBEaWZmZXJlbmNlCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWJkc19mMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWJkZF9mNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmFiZDsKLSAgICBzID0gInZhYmQiOyBPdmVybG9hZEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgU2lnbmVkIFNhdHVyYXRpbmcgQWJzb2x1dGUgVmFsdWUKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWJzYl9zODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWJzaF9zMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cWFic3NfczMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFhYnNkX3M2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZxYWJzOwotICAgIHMgPSAidnFhYnMiOyBPdmVybG9hZEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgTmVnYXRlCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bmVnZF9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdm5lZzsKLSAgICBzID0gInZuZWciOyBPdmVybG9hZEludCA9IGZhbHNlOyBicmVhazsKLSAgLy8gU2NhbGFyIFNpZ25lZCBTYXR1cmF0aW5nIE5lZ2F0ZQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFuZWdiX3M4OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFuZWdoX3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxbmVnc19zMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cW5lZ2RfczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdnFuZWc7Ci0gICAgcyA9ICJ2cW5lZyI7IE92ZXJsb2FkSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBTaWduZWQgU2F0dXJhdGluZyBBY2N1bXVsYXRlZCBvZiBVbnNpZ25lZCBWYWx1ZQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnVxYWRkYl9zODoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Z1cWFkZGhfczE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnVxYWRkc19zMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92dXFhZGRkX3M2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92dXFhZGQ7Ci0gICAgcyA9ICJ2dXFhZGQiOyBPdmVybG9hZEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgVW5zaWduZWQgU2F0dXJhdGluZyBBY2N1bXVsYXRlZCBvZiBTaWduZWQgVmFsdWUKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzcWFkZGJfdTg6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3FhZGRoX3UxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzcWFkZHNfdTMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNxYWRkZF91NjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNxYWRkOwotICAgIHMgPSAidnNxYWRkIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2lnbmVkIFNhdHVyYXRpbmcgRG91YmxpbmcgTXVsdGlwbHktQWRkIExvbmcKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxoX3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxzX3MzMjoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92cWRtbGFsOwotICAgIHMgPSAidnFkbWxhbCI7IE92ZXJsb2FkV2lkZUludCA9IHRydWU7IGJyZWFrOwotICAvLyBTaWduZWQgU2F0dXJhdGluZyBEb3VibGluZyBNdWx0aXBseS1TdWJ0cmFjdCBMb25nCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cWRtbHNsaF9zMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cWRtbHNsc19zMzI6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnFkbWxzbDsKLSAgICBzID0gInZxZG1sc2wiOyBPdmVybG9hZFdpZGVJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2lnbmVkIFNhdHVyYXRpbmcgRG91YmxpbmcgTXVsdGlwbHkgTG9uZwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFkbXVsbGhfczE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFkbXVsbHNfczMyOgotICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdnFkbXVsbDsKLSAgICBzID0gInZxZG11bGwiOyBPdmVybG9hZFdpZGVJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIFNpZ25lZCBTYXR1cmF0aW5nIEV4dHJhY3QgVW5zaWduZWQgTmFycm93Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cW1vdnVuaF9zMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cW1vdnVuc19zMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cW1vdnVuZF9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphcm1fbmVvbl92cW1vdm5zdTsKLSAgICBzID0gInZxbW92dW4iOyBPdmVybG9hZE5hcnJvd0ludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgU2lnbmVkIFNhdHVyYXRpbmcgRXh0cmFjdCBOYXJyb3cKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxbW92bmhfczE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFtb3Zuc19zMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cW1vdm5kX3M2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZxbW92bnM7Ci0gICAgcyA9ICJ2cW1vdm4iOyBPdmVybG9hZE5hcnJvd0ludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgVW5zaWduZWQgU2F0dXJhdGluZyBFeHRyYWN0IE5hcnJvdwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFtb3ZuaF91MTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cW1vdm5zX3UzMjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxbW92bmRfdTY0OgotICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdnFtb3ZudTsKLSAgICBzID0gInZxbW92biI7IE92ZXJsb2FkTmFycm93SW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBTaWduZWQgU2hpZnQgUmlnaHQgKEltbWVkaWF0ZSkKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzaHJkX25fczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZzaHJkc19uOwotICAgIHMgPSAidnNzaHIiOyBPdmVybG9hZEludCA9IGZhbHNlOyBicmVhazsKLSAgLy8gU2NhbGFyIFVuc2lnbmVkIFNoaWZ0IFJpZ2h0IChJbW1lZGlhdGUpCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2hyZF9uX3U2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92c2hyZHVfbjsKLSAgICBzID0gInZ1c2hyIjsgT3ZlcmxvYWRJbnQgPSBmYWxzZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBTaWduZWQgUm91bmRpbmcgU2hpZnQgUmlnaHQgKEltbWVkaWF0ZSkKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hyZF9uX3M2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92c3JzaHI7Ci0gICAgcyA9ICJ2c3JzaHIiOyBPdmVybG9hZEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgVW5zaWduZWQgUm91bmRpbmcgU2hpZnQgUmlnaHQgKEltbWVkaWF0ZSkKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hyZF9uX3U2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92dXJzaHI7Ci0gICAgcyA9ICJ2dXJzaHIiOyBPdmVybG9hZEludCA9IHRydWU7IGJyZWFrOwotICAvLyBTY2FsYXIgU2lnbmVkIFNoaWZ0IFJpZ2h0IGFuZCBBY2N1bXVsYXRlIChJbW1lZGlhdGUpCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3JhZF9uX3M2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92c3JhZHNfbjsKLSAgICBzID0gInZzc3JhIjsgT3ZlcmxvYWRJbnQgPSBmYWxzZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBVbnNpZ25lZCBTaGlmdCBSaWdodCBhbmQgQWNjdW11bGF0ZSAoSW1tZWRpYXRlKQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNyYWRfbl91NjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNyYWR1X247Ci0gICAgcyA9ICJ2dXNyYSI7IE92ZXJsb2FkSW50ID0gZmFsc2U7IGJyZWFrOwotICAvLyBTY2FsYXIgU2lnbmVkIFJvdW5kaW5nIFNoaWZ0IFJpZ2h0IGFuZCBBY2N1bXVsYXRlIChJbW1lZGlhdGUpCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cnNyYWRfbl9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnJzcmFkc19uOwotICAgIHMgPSAidnNyc3JhIjsgT3ZlcmxvYWRJbnQgPSBmYWxzZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBVbnNpZ25lZCBSb3VuZGluZyBTaGlmdCBSaWdodCBhbmQgQWNjdW11bGF0ZSAoSW1tZWRpYXRlKQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJzcmFkX25fdTY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Zyc3JhZHVfbjsKLSAgICBzID0gInZ1cnNyYSI7IE92ZXJsb2FkSW50ID0gZmFsc2U7IGJyZWFrOwotICAvLyBTY2FsYXIgU2lnbmVkL1Vuc2lnbmVkIFNoaWZ0IExlZnQgKEltbWVkaWF0ZSkKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGxkX25fczY0OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNobGRfbl91NjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNobGRfbjsKLSAgICBzID0gInZzaGwiOyBPdmVybG9hZEludCA9IGZhbHNlOyBicmVhazsKLSAgLy8gU2lnbmVkIFNhdHVyYXRpbmcgU2hpZnQgTGVmdCAoSW1tZWRpYXRlKQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGxiX25fczg6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXNobGhfbl9zMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXNobHNfbl9zMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXNobGRfbl9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnFzaGxzX247Ci0gICAgcyA9ICJ2c3FzaGwiOyBPdmVybG9hZEludCA9IHRydWU7IGJyZWFrOwotICAvLyBVbnNpZ25lZCBTYXR1cmF0aW5nIFNoaWZ0IExlZnQgKEltbWVkaWF0ZSkKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsYl9uX3U4OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGxoX25fdTE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGxzX25fdTMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGxkX25fdTY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Zxc2hsdV9uOwotICAgIHMgPSAidnVxc2hsIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2lnbmVkIFNhdHVyYXRpbmcgU2hpZnQgTGVmdCBVbnNpZ25lZCAoSW1tZWRpYXRlKQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGx1Yl9uX3M4OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGx1aF9uX3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsdXNfbl9zMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXNobHVkX25fczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZzcXNobHU7Ci0gICAgcyA9ICJ2c3FzaGx1IjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2hpZnQgUmlnaHQgQW5kIEluc2VydCAoSW1tZWRpYXRlKQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNyaWRfbl9zNjQ6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3JpZF9uX3U2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92c3JpOwotICAgIHMgPSAidnNyaSI7IE92ZXJsb2FkSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNoaWZ0IExlZnQgQW5kIEluc2VydCAoSW1tZWRpYXRlKQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNsaWRfbl9zNjQ6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2xpZF9uX3U2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92c2xpOwotICAgIHMgPSAidnNsaSI7IE92ZXJsb2FkSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNpZ25lZCBTYXR1cmF0aW5nIFNoaWZ0IFJpZ2h0IE5hcnJvdyAoSW1tZWRpYXRlKQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaHJuaF9uX3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hybnNfbl9zMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXNocm5kX25fczY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZzcXNocm47Ci0gICAgcyA9ICJ2c3FzaHJuIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gVW5zaWduZWQgU2F0dXJhdGluZyBTaGlmdCBSaWdodCBOYXJyb3cgKEltbWVkaWF0ZSkKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hybmhfbl91MTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXNocm5zX25fdTMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaHJuZF9uX3U2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92dXFzaHJuOwotICAgIHMgPSAidnVxc2hybiI7IE92ZXJsb2FkSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNpZ25lZCBTYXR1cmF0aW5nIFJvdW5kZWQgU2hpZnQgUmlnaHQgTmFycm93IChJbW1lZGlhdGUpCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJuaF9uX3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5zX25fczMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFyc2hybmRfbl9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNxcnNocm47Ci0gICAgcyA9ICJ2c3Fyc2hybiI7IE92ZXJsb2FkSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFVuc2lnbmVkIFNhdHVyYXRpbmcgUm91bmRlZCBTaGlmdCBSaWdodCBOYXJyb3cgKEltbWVkaWF0ZSkKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5oX25fdTE2OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFyc2hybnNfbl91MzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJuZF9uX3U2NDoKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92dXFyc2hybjsKLSAgICBzID0gInZ1cXJzaHJuIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2lnbmVkIFNhdHVyYXRpbmcgU2hpZnQgUmlnaHQgVW5zaWduZWQgTmFycm93IChJbW1lZGlhdGUpCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXNocnVuaF9uX3MxNjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hydW5zX25fczMyOgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaHJ1bmRfbl9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNxc2hydW47Ci0gICAgcyA9ICJ2c3FzaHJ1biI7IE92ZXJsb2FkSW50ID0gdHJ1ZTsgYnJlYWs7Ci0gIC8vIFNpZ25lZCBTYXR1cmF0aW5nIFJvdW5kZWQgU2hpZnQgUmlnaHQgVW5zaWduZWQgTmFycm93IChJbW1lZGlhdGUpCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bmhfbl9zMTY6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bnNfbl9zMzI6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bmRfbl9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNxcnNocnVuOwotICAgIHMgPSAidnNxcnNocnVuIjsgT3ZlcmxvYWRJbnQgPSB0cnVlOyBicmVhazsKLSAgLy8gU2NhbGFyIFNpZ25lZCBGaXhlZC1wb2ludCBDb252ZXJ0IFRvIEZsb2F0aW5nLVBvaW50IChJbW1lZGlhdGUpCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0c19uX2YzMl9zMzI6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmN2dGYzMl9uX3MzMjsKLSAgICBzID0gInZjdnRmIjsgT3ZlcmxvYWRJbnQgPSBmYWxzZTsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9uX2Y2NF9zNjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmN2dGY2NF9uX3M2NDsKLSAgICBzID0gInZjdnRmIjsgT3ZlcmxvYWRJbnQgPSBmYWxzZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBVbnNpZ25lZCBGaXhlZC1wb2ludCBDb252ZXJ0IFRvIEZsb2F0aW5nLVBvaW50IChJbW1lZGlhdGUpCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0c19uX2YzMl91MzI6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmN2dGYzMl9uX3UzMjsKLSAgICBzID0gInZjdnRmIjsgT3ZlcmxvYWRJbnQgPSBmYWxzZTsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9uX2Y2NF91NjQ6Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmN2dGY2NF9uX3U2NDsKLSAgICBzID0gInZjdnRmIjsgT3ZlcmxvYWRJbnQgPSBmYWxzZTsgYnJlYWs7Ci0gIC8vIFNjYWxhciBGbG9hdGluZy1wb2ludCBDb252ZXJ0IFRvIFNpZ25lZCBGaXhlZC1wb2ludCAoSW1tZWRpYXRlKQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHNfbl9zMzJfZjMyOgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjdnRzX25fczMyX2YzMjsKLSAgICBzID0gImZjdnR6cyI7IE92ZXJsb2FkSW50ID0gZmFsc2U7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dGRfbl9zNjRfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjdnRkX25fczY0X2Y2NDsKLSAgICBzID0gImZjdnR6cyI7IE92ZXJsb2FkSW50ID0gZmFsc2U7IGJyZWFrOwotICAvLyBTY2FsYXIgRmxvYXRpbmctcG9pbnQgQ29udmVydCBUbyBVbnNpZ25lZCBGaXhlZC1wb2ludCAoSW1tZWRpYXRlKQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHNfbl91MzJfZjMyOgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjdnRzX25fdTMyX2YzMjsKLSAgICBzID0gImZjdnR6dSI7IE92ZXJsb2FkSW50ID0gZmFsc2U7IGJyZWFrOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dGRfbl91NjRfZjY0OgotICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjdnRkX25fdTY0X2Y2NDsKLSAgICBzID0gImZjdnR6dSI7IE92ZXJsb2FkSW50ID0gZmFsc2U7IGJyZWFrOworICAgIGJyZWFrOwogICB9CiAKLSAgaWYgKCFJbnQpCisgIC8vIEl0IGRpZG4ndCBuZWVkIGFueSBoYW5kbGluZyBzcGVjaWZpYyB0byB0aGUgQUFyY2g2NCBiYWNrZW5kLCBzbyBkZWZlciB0bworICAvLyBjb21tb24gY29kZS4KKyAgcmV0dXJuIEVtaXRDb21tb25OZW9uU0lTREJ1aWx0aW5FeHByKENHRiwgU0lTREluZm8sIE9wcywgRSk7Cit9CisKK1ZhbHVlICpDb2RlR2VuRnVuY3Rpb246OkVtaXRDb21tb25OZW9uQnVpbHRpbkV4cHIoCisgICAgdW5zaWduZWQgQnVpbHRpbklELCB1bnNpZ25lZCBMTFZNSW50cmluc2ljLCB1bnNpZ25lZCBBbHRMTFZNSW50cmluc2ljLAorICAgIGNvbnN0IGNoYXIgKk5hbWVIaW50LCB1bnNpZ25lZCBNb2RpZmllciwgY29uc3QgQ2FsbEV4cHIgKkUsCisgICAgU21hbGxWZWN0b3JJbXBsPGxsdm06OlZhbHVlICo+ICZPcHMsIGxsdm06OlZhbHVlICpBbGlnbikgeworICAvLyBHZXQgdGhlIGxhc3QgYXJndW1lbnQsIHdoaWNoIHNwZWNpZmllcyB0aGUgdmVjdG9yIHR5cGUuCisgIGxsdm06OkFQU0ludCBOZW9uVHlwZUNvbnN0OworICBjb25zdCBFeHByICpBcmcgPSBFLT5nZXRBcmcoRS0+Z2V0TnVtQXJncygpIC0gMSk7CisgIGlmICghQXJnLT5pc0ludGVnZXJDb25zdGFudEV4cHIoTmVvblR5cGVDb25zdCwgZ2V0Q29udGV4dCgpKSkKICAgICByZXR1cm4gMDsKIAotICAvLyBBQXJjaDY0IHNjYWxhciBidWlsdGluIHRoYXQgcmV0dXJucyBzY2FsYXIgdHlwZQotICAvLyBhbmQgc2hvdWxkIGJlIG1hcHBlZCB0byBBQXJjaDY0IGludHJpbnNpYyB0aGF0IHJldHVybnMKLSAgLy8gb25lLWVsZW1lbnQgdmVjdG9yIHR5cGUuCi0gIEZ1bmN0aW9uICpGID0gMDsKLSAgaWYgKEFjcm9zc1ZlYykgewotICAgIC8vIEdlbiBhcmcgdHlwZQotICAgIGNvbnN0IEV4cHIgKkFyZyA9IEUtPmdldEFyZyhFLT5nZXROdW1BcmdzKCktMSk7Ci0gICAgbGx2bTo6VHlwZSAqVHkgPSBDR0YuQ29udmVydFR5cGUoQXJnLT5nZXRUeXBlKCkpOwotICAgIGxsdm06OlZlY3RvclR5cGUgKlZUeSA9IGNhc3Q8bGx2bTo6VmVjdG9yVHlwZT4oVHkpOwotICAgIGxsdm06OlR5cGUgKkVUeSA9IFZUeS0+Z2V0RWxlbWVudFR5cGUoKTsKLSAgICBsbHZtOjpWZWN0b3JUeXBlICpSVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoRVR5LCAxKTsKLSAgCi0gICAgaWYgKEV4dGVuZEVsZSkgewotICAgICAgYXNzZXJ0KCFFVHktPmlzRmxvYXRpbmdQb2ludFR5KCkpOwotICAgICAgUlR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0RXh0ZW5kZWRFbGVtZW50VmVjdG9yVHlwZShSVHkpOworICAvLyBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhpcyBvdmVybG9hZGVkIE5FT04gaW50cmluc2ljLgorICBOZW9uVHlwZUZsYWdzIFR5cGUoTmVvblR5cGVDb25zdC5nZXRaRXh0VmFsdWUoKSk7CisgIGJvb2wgVXNnbiA9IFR5cGUuaXNVbnNpZ25lZCgpOworICBib29sIFF1YWQgPSBUeXBlLmlzUXVhZCgpOworCisgIGxsdm06OlZlY3RvclR5cGUgKlZUeSA9IEdldE5lb25UeXBlKHRoaXMsIFR5cGUpOworICBsbHZtOjpUeXBlICpUeSA9IFZUeTsKKyAgaWYgKCFUeSkKKyAgICByZXR1cm4gMDsKKworICB1bnNpZ25lZCBJbnQgPSBMTFZNSW50cmluc2ljOworICBpZiAoKE1vZGlmaWVyICYgVW5zaWduZWRBbHRzKSAmJiAhVXNnbikKKyAgICBJbnQgPSBBbHRMTFZNSW50cmluc2ljOworCisgIHN3aXRjaCAoQnVpbHRpbklEKSB7CisgIGRlZmF1bHQ6IGJyZWFrOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFic192OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFic3FfdjoKKyAgICBpZiAoVlR5LT5nZXRFbGVtZW50VHlwZSgpLT5pc0Zsb2F0aW5nUG9pbnRUeSgpKQorICAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6ZmFicywgVHkpLCBPcHMsICJ2YWJzIik7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKExMVk1JbnRyaW5zaWMsIFR5KSwgT3BzLCAidmFicyIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFkZGhuX3Y6IHsKKyAgICBsbHZtOjpWZWN0b3JUeXBlICpTcmNUeSA9CisgICAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldEV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGUoVlR5KTsKKworICAgIC8vICVzdW0gPSBhZGQgPDQgeCBpMzI+ICVsaHMsICVyaHMKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBTcmNUeSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgU3JjVHkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQWRkKE9wc1swXSwgT3BzWzFdLCAidmFkZGhuIik7CisKKyAgICAvLyAlaGlnaCA9IGxzaHIgPDQgeCBpMzI+ICVzdW0sIDxpMzIgMTYsIGkzMiAxNiwgaTMyIDE2LCBpMzIgMTY+CisgICAgQ29uc3RhbnQgKlNoaWZ0QW10ID0gQ29uc3RhbnRJbnQ6OmdldChTcmNUeS0+Z2V0RWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY1R5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgLyAyKTsKKyAgICBTaGlmdEFtdCA9IENvbnN0YW50VmVjdG9yOjpnZXRTcGxhdChWVHktPmdldE51bUVsZW1lbnRzKCksIFNoaWZ0QW10KTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUxTaHIoT3BzWzBdLCBTaGlmdEFtdCwgInZhZGRobiIpOworCisgICAgLy8gJXJlcyA9IHRydW5jIDw0IHggaTMyPiAlaGlnaCB0byA8NCB4IGkxNj4KKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVUcnVuYyhPcHNbMF0sIFZUeSwgInZhZGRobiIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2FsZV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNhbGVxX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2FsdF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNhbHRxX3Y6CisgICAgc3RkOjpzd2FwKE9wc1swXSwgT3BzWzFdKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWdlX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2FnZXFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWd0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2FndHFfdjogeworICAgIGxsdm06OlR5cGUgKlZlY0ZsdCA9IGxsdm06OlZlY3RvclR5cGU6OmdldCgKKyAgICAgICAgVlR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPT0gMzIgPyBGbG9hdFR5IDogRG91YmxlVHksCisgICAgICAgIFZUeS0+Z2V0TnVtRWxlbWVudHMoKSk7CisgICAgbGx2bTo6VHlwZSAqVHlzW10gPSB7IFZUeSwgVmVjRmx0IH07CisgICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKExMVk1JbnRyaW5zaWMsIFR5cyk7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChGLCBPcHMsIE5hbWVIaW50KTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsel92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsenFfdjoKKyAgICAvLyBXZSBnZW5lcmF0ZSB0YXJnZXQtaW5kZXBlbmRlbnQgaW50cmluc2ljLCB3aGljaCBuZWVkcyBhIHNlY29uZCBhcmd1bWVudAorICAgIC8vIGZvciB3aGV0aGVyIG9yIG5vdCBjbHogb2YgemVybyBpcyB1bmRlZmluZWQ7IG9uIEFSTSBpdCBpc24ndC4KKyAgICBPcHMucHVzaF9iYWNrKEJ1aWxkZXIuZ2V0SW50MShnZXRUYXJnZXQoKS5pc0NMWkZvclplcm9VbmRlZigpKSk7CisgICAgYnJlYWs7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X2YzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHFfZjMyX3Y6CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOworICAgIFR5ID0gR2V0TmVvblR5cGUodGhpcywgTmVvblR5cGVGbGFncyhOZW9uVHlwZUZsYWdzOjpGbG9hdDMyLCBmYWxzZSwgUXVhZCkpOworICAgIHJldHVybiBVc2duID8gQnVpbGRlci5DcmVhdGVVSVRvRlAoT3BzWzBdLCBUeSwgInZjdnQiKQorICAgICAgICAgICAgICAgIDogQnVpbGRlci5DcmVhdGVTSVRvRlAoT3BzWzBdLCBUeSwgInZjdnQiKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9mMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9mNjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fZjMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2Y2NF92OiB7CisgICAgYm9vbCBEb3VibGUgPQorICAgICAgKGNhc3Q8bGx2bTo6SW50ZWdlclR5cGU+KFZUeS0+Z2V0RWxlbWVudFR5cGUoKSktPmdldEJpdFdpZHRoKCkgPT0gNjQpOworICAgIGxsdm06OlR5cGUgKkZsb2F0VHkgPQorICAgICAgICBHZXROZW9uVHlwZSh0aGlzLCBOZW9uVHlwZUZsYWdzKERvdWJsZSA/IE5lb25UeXBlRmxhZ3M6OkZsb2F0NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOZW9uVHlwZUZsYWdzOjpGbG9hdDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBRdWFkKSk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBGbG9hdFR5LCBUeSB9OworICAgIEludCA9IFVzZ24gPyBMTFZNSW50cmluc2ljIDogQWx0TExWTUludHJpbnNpYzsKKyAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoRiwgT3BzLCAidmN2dF9uIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9zMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl91MzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9zNjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl91NjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fczMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX3UzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHFfbl9zNjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fdTY0X3Y6IHsKKyAgICBib29sIERvdWJsZSA9CisgICAgICAoY2FzdDxsbHZtOjpJbnRlZ2VyVHlwZT4oVlR5LT5nZXRFbGVtZW50VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKSA9PSA2NCk7CisgICAgbGx2bTo6VHlwZSAqRmxvYXRUeSA9CisgICAgICAgIEdldE5lb25UeXBlKHRoaXMsIE5lb25UeXBlRmxhZ3MoRG91YmxlID8gTmVvblR5cGVGbGFnczo6RmxvYXQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5lb25UeXBlRmxhZ3M6OkZsb2F0MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIFF1YWQpKTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBGbG9hdFR5IH07CisgICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKExMVk1JbnRyaW5zaWMsIFR5cyk7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChGLCBPcHMsICJ2Y3Z0X24iKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF9zMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfdTMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X3M2NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF91NjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX3MzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHFfdTMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9zNjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX3U2NF92OiB7CisgICAgYm9vbCBEb3VibGUgPQorICAgICAgKGNhc3Q8bGx2bTo6SW50ZWdlclR5cGU+KFZUeS0+Z2V0RWxlbWVudFR5cGUoKSktPmdldEJpdFdpZHRoKCkgPT0gNjQpOworICAgIGxsdm06OlR5cGUgKkZsb2F0VHkgPQorICAgICAgICBHZXROZW9uVHlwZSh0aGlzLCBOZW9uVHlwZUZsYWdzKERvdWJsZSA/IE5lb25UeXBlRmxhZ3M6OkZsb2F0NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOZW9uVHlwZUZsYWdzOjpGbG9hdDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBRdWFkKSk7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgRmxvYXRUeSk7CisgICAgcmV0dXJuIFVzZ24gPyBCdWlsZGVyLkNyZWF0ZUZQVG9VSShPcHNbMF0sIFR5LCAidmN2dCIpCisgICAgICAgICAgICAgICAgOiBCdWlsZGVyLkNyZWF0ZUZQVG9TSShPcHNbMF0sIFR5LCAidmN2dCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YV9zMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhX3M2NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGFfdTMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YV91NjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhcV9zMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhcV9zNjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhcV91MzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhcV91NjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRuX3MzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5fczY0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bl91MzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRuX3U2NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5xX3MzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5xX3M2NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5xX3UzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5xX3U2NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHBfczMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cF9zNjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRwX3UzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHBfdTY0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfczMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfczY0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfdTMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfdTY0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bV9zMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtX3M2NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG1fdTMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bV91NjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtcV9zMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtcV9zNjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtcV91MzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtcV91NjRfdjogeworICAgIGJvb2wgRG91YmxlID0KKyAgICAgIChjYXN0PGxsdm06OkludGVnZXJUeXBlPihWVHktPmdldEVsZW1lbnRUeXBlKCkpLT5nZXRCaXRXaWR0aCgpID09IDY0KTsKKyAgICBsbHZtOjpUeXBlICpJblR5ID0KKyAgICAgIEdldE5lb25UeXBlKHRoaXMsCisgICAgICAgICAgICAgICAgICBOZW9uVHlwZUZsYWdzKERvdWJsZSA/IE5lb25UeXBlRmxhZ3M6OkZsb2F0NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOZW9uVHlwZUZsYWdzOjpGbG9hdDMyLCBmYWxzZSwgUXVhZCkpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIEluVHkgfTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoTExWTUludHJpbnNpYywgVHlzKSwgT3BzLCBOYW1lSGludCk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZleHRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZleHRxX3Y6IHsKKyAgICBpbnQgQ1YgPSBjYXN0PENvbnN0YW50SW50PihPcHNbMl0pLT5nZXRTRXh0VmFsdWUoKTsKKyAgICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDE2PiBJbmRpY2VzOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgSW5kaWNlcy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCBpK0NWKSk7CisKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOworICAgIFZhbHVlICpTViA9IGxsdm06OkNvbnN0YW50VmVjdG9yOjpnZXQoSW5kaWNlcyk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU2h1ZmZsZVZlY3RvcihPcHNbMF0sIE9wc1sxXSwgU1YsICJ2ZXh0Iik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFxX3Y6IHsKKyAgICBWYWx1ZSAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjpmbWEsIFR5KTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOworICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMl0sIFR5KTsKKworICAgIC8vIE5FT04gaW50cmluc2ljIHB1dHMgYWNjdW11bGF0b3IgZmlyc3QsIHVubGlrZSB0aGUgTExWTSBmbWEuCisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQ2FsbDMoRiwgT3BzWzFdLCBPcHNbMl0sIE9wc1swXSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3Y6CisgICAgT3BzLnB1c2hfYmFjayhBbGlnbik7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKExMVk1JbnRyaW5zaWMsIFR5KSwgT3BzLCAidmxkMSIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMnFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNxX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0cV92OiB7CisgICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKExMVk1JbnRyaW5zaWMsIFR5KTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUNhbGwyKEYsIE9wc1sxXSwgQWxpZ24sIE5hbWVIaW50KTsKKyAgICBUeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoT3BzWzFdLT5nZXRUeXBlKCkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTdG9yZShPcHNbMV0sIE9wc1swXSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfZHVwX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV9kdXBfdjogeworICAgIFZhbHVlICpWID0gVW5kZWZWYWx1ZTo6Z2V0KFR5KTsKKyAgICBUeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVlR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CisgICAgTG9hZEluc3QgKkxkID0gQnVpbGRlci5DcmVhdGVMb2FkKE9wc1swXSk7CisgICAgTGQtPnNldEFsaWdubWVudChjYXN0PENvbnN0YW50SW50PihBbGlnbiktPmdldFpFeHRWYWx1ZSgpKTsKKyAgICBsbHZtOjpDb25zdGFudCAqQ0kgPSBDb25zdGFudEludDo6Z2V0KEludDMyVHksIDApOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlSW5zZXJ0RWxlbWVudChWLCBMZCwgQ0kpOworICAgIHJldHVybiBFbWl0TmVvblNwbGF0KE9wc1swXSwgQ0kpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQyX2xhbmVfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX2xhbmVfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkNF9sYW5lX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0cV9sYW5lX3Y6IHsKKyAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoTExWTUludHJpbnNpYywgVHkpOworICAgIGZvciAodW5zaWduZWQgSSA9IDI7IEkgPCBPcHMuc2l6ZSgpIC0gMTsgKytJKQorICAgICAgT3BzW0ldID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1tJXSwgVHkpOworICAgIE9wcy5wdXNoX2JhY2soQWxpZ24pOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQ2FsbChGLCBtYWtlQXJyYXlSZWYoT3BzKS5zbGljZSgxKSwgTmFtZUhpbnQpOworICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSk7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1vdmxfdjogeworICAgIGxsdm06OlR5cGUgKkRUeSA9bGx2bTo6VmVjdG9yVHlwZTo6Z2V0VHJ1bmNhdGVkRWxlbWVudFZlY3RvclR5cGUoVlR5KTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBEVHkpOworICAgIGlmIChVc2duKQorICAgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlWkV4dChPcHNbMF0sIFR5LCAidm1vdmwiKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTRXh0KE9wc1swXSwgVHksICJ2bW92bCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bW92bl92OiB7CisgICAgbGx2bTo6VHlwZSAqUVR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0RXh0ZW5kZWRFbGVtZW50VmVjdG9yVHlwZShWVHkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFFUeSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLCBUeSwgInZtb3ZuIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWxsX3Y6CisgICAgLy8gRklYTUU6IHRoZSBpbnRlZ2VyIHZtdWxsIG9wZXJhdGlvbnMgY291bGQgYmUgZW1pdHRlZCBpbiB0ZXJtcyBvZiBwdXJlCisgICAgLy8gTExWTSBJUiAoMiBleHRzIGZvbGxvd2VkIGJ5IGEgbXVsKS4gVW5mb3J0dW5hdGVseSBMTFZNIGhhcyBhIGhhYml0IG9mCisgICAgLy8gaG9pc3RpbmcgdGhlIGV4dHMgb3V0c2lkZSBsb29wcy4gVW50aWwgZ2xvYmFsIElTZWwgY29tZXMgYWxvbmcgdGhhdCBjYW4KKyAgICAvLyBzZWUgdGhyb3VnaCBzdWNoIG1vdmVtZW50IHRoaXMgbGVhZHMgdG8gYmFkIENvZGVHZW4uIFNvIHdlIG5lZWQgYW4KKyAgICAvLyBpbnRyaW5zaWMgZm9yIG5vdy4KKyAgICBJbnQgPSBVc2duID8gSW50cmluc2ljOjphcm1fbmVvbl92bXVsbHUgOiBJbnRyaW5zaWM6OmFybV9uZW9uX3ZtdWxsczsKKyAgICBJbnQgPSBUeXBlLmlzUG9seSgpID8gKHVuc2lnbmVkKUludHJpbnNpYzo6YXJtX25lb25fdm11bGxwIDogSW50OworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidm11bGwiKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRhbF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBhZGFscV92OiB7CisgICAgLy8gVGhlIHNvdXJjZSBvcGVyYW5kIHR5cGUgaGFzIHR3aWNlIGFzIG1hbnkgZWxlbWVudHMgb2YgaGFsZiB0aGUgc2l6ZS4KKyAgICB1bnNpZ25lZCBFbHRCaXRzID0gVlR5LT5nZXRFbGVtZW50VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgICAgbGx2bTo6VHlwZSAqRWx0VHkgPQorICAgICAgbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCBFbHRCaXRzIC8gMik7CisgICAgbGx2bTo6VHlwZSAqTmFycm93VHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KEVsdFR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkgKiAyKTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBOYXJyb3dUeSB9OworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgTmFtZUhpbnQpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cGFkZGxfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRkbHFfdjogeworICAgIC8vIFRoZSBzb3VyY2Ugb3BlcmFuZCB0eXBlIGhhcyB0d2ljZSBhcyBtYW55IGVsZW1lbnRzIG9mIGhhbGYgdGhlIHNpemUuCisgICAgdW5zaWduZWQgRWx0Qml0cyA9IFZUeS0+Z2V0RWxlbWVudFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOworICAgIGxsdm06OlR5cGUgKkVsdFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCBFbHRCaXRzIC8gMik7CisgICAgbGx2bTo6VHlwZSAqTmFycm93VHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KEVsdFR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkgKiAyKTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBOYXJyb3dUeSB9OworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZwYWRkbCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbHNsX3Y6IHsKKyAgICBTbWFsbFZlY3RvcjxWYWx1ZSAqLCAyPiBNdWxPcHMoT3BzLmJlZ2luKCkgKyAxLCBPcHMuZW5kKCkpOworICAgIFZhbHVlICpNdWwgPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhMTFZNSW50cmluc2ljLCBUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWxPcHMsICJ2cWRtbGFsIik7CisKKyAgICBTbWFsbFZlY3RvcjxWYWx1ZSAqLCAyPiBBY2N1bU9wczsKKyAgICBBY2N1bU9wcy5wdXNoX2JhY2soT3BzWzBdKTsKKyAgICBBY2N1bU9wcy5wdXNoX2JhY2soTXVsKTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoQWx0TExWTUludHJpbnNpYywgVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgQWNjdW1PcHMsIE5hbWVIaW50KTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaGxfbl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaGxxX25fdjoKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZxc2hsX24iLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwgZmFsc2UpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJlY3BlX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cmVjcGVxX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNxcnRlX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNxcnRlcV92OgorICAgIEludCA9IFR5LT5pc0ZQT3JGUFZlY3RvclR5KCkgPyBMTFZNSW50cmluc2ljIDogQWx0TExWTUludHJpbnNpYzsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgTmFtZUhpbnQpOworCisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hsX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGxxX25fdjoKKyAgICBPcHNbMV0gPSBFbWl0TmVvblNoaWZ0VmVjdG9yKE9wc1sxXSwgVHksIGZhbHNlKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTaGwoQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSxUeSksIE9wc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZzaGxfbiIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNobGxfbl92OiB7CisgICAgbGx2bTo6VHlwZSAqU3JjVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXRUcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZShWVHkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFNyY1R5KTsKKyAgICBpZiAoVXNnbikKKyAgICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlWkV4dChPcHNbMF0sIFZUeSk7CisgICAgZWxzZQorICAgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVTRXh0KE9wc1swXSwgVlR5KTsKKyAgICBPcHNbMV0gPSBFbWl0TmVvblNoaWZ0VmVjdG9yKE9wc1sxXSwgVlR5LCBmYWxzZSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU2hsKE9wc1swXSwgT3BzWzFdLCAidnNobGxfbiIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hybl9uX3Y6IHsKKyAgICBsbHZtOjpUeXBlICpTcmNUeSA9IGxsdm06OlZlY3RvclR5cGU6OmdldEV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGUoVlR5KTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBTcmNUeSk7CisgICAgT3BzWzFdID0gRW1pdE5lb25TaGlmdFZlY3RvcihPcHNbMV0sIFNyY1R5LCBmYWxzZSk7CisgICAgaWYgKFVzZ24pCisgICAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUxTaHIoT3BzWzBdLCBPcHNbMV0pOworICAgIGVsc2UKKyAgICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQVNocihPcHNbMF0sIE9wc1sxXSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLCBUeSwgInZzaHJuX24iKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNocl9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hycV9uX3Y6CisgICAgcmV0dXJuIEVtaXROZW9uUlNoaWZ0SW1tKE9wc1swXSwgT3BzWzFdLCBUeSwgVXNnbiwgInZzaHJfbiIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MXFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJxX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QzX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QzcV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0NHFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0M19sYW5lX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QzcV9sYW5lX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3Q0X2xhbmVfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRxX2xhbmVfdjoKKyAgICBPcHMucHVzaF9iYWNrKEFsaWduKTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgIiIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN1YmhuX3Y6IHsKKyAgICBsbHZtOjpWZWN0b3JUeXBlICpTcmNUeSA9CisgICAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldEV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGUoVlR5KTsKKworICAgIC8vICVzdW0gPSBhZGQgPDQgeCBpMzI+ICVsaHMsICVyaHMKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBTcmNUeSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgU3JjVHkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlU3ViKE9wc1swXSwgT3BzWzFdLCAidnN1YmhuIik7CisKKyAgICAvLyAlaGlnaCA9IGxzaHIgPDQgeCBpMzI+ICVzdW0sIDxpMzIgMTYsIGkzMiAxNiwgaTMyIDE2LCBpMzIgMTY+CisgICAgQ29uc3RhbnQgKlNoaWZ0QW10ID0gQ29uc3RhbnRJbnQ6OmdldChTcmNUeS0+Z2V0RWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY1R5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgLyAyKTsKKyAgICBTaGlmdEFtdCA9IENvbnN0YW50VmVjdG9yOjpnZXRTcGxhdChWVHktPmdldE51bUVsZW1lbnRzKCksIFNoaWZ0QW10KTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUxTaHIoT3BzWzBdLCBTaGlmdEFtdCwgInZzdWJobiIpOworCisgICAgLy8gJXJlcyA9IHRydW5jIDw0IHggaTMyPiAlaGlnaCB0byA8NCB4IGkxNj4KKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVUcnVuYyhPcHNbMF0sIFZUeSwgInZzdWJobiIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dHJuX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dHJucV92OiB7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChUeSkpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMV0sIFR5KTsKKyAgICBPcHNbMl0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzJdLCBUeSk7CisgICAgVmFsdWUgKlNWID0gMDsKKworICAgIGZvciAodW5zaWduZWQgdmkgPSAwOyB2aSAhPSAyOyArK3ZpKSB7CisgICAgICBTbWFsbFZlY3RvcjxDb25zdGFudCosIDE2PiBJbmRpY2VzOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZUeS0+Z2V0TnVtRWxlbWVudHMoKTsgaSAhPSBlOyBpICs9IDIpIHsKKyAgICAgICAgSW5kaWNlcy5wdXNoX2JhY2soQnVpbGRlci5nZXRJbnQzMihpK3ZpKSk7CisgICAgICAgIEluZGljZXMucHVzaF9iYWNrKEJ1aWxkZXIuZ2V0SW50MzIoaStlK3ZpKSk7CisgICAgICB9CisgICAgICBWYWx1ZSAqQWRkciA9IEJ1aWxkZXIuQ3JlYXRlQ29uc3RJbkJvdW5kc0dFUDFfMzIoT3BzWzBdLCB2aSk7CisgICAgICBTViA9IGxsdm06OkNvbnN0YW50VmVjdG9yOjpnZXQoSW5kaWNlcyk7CisgICAgICBTViA9IEJ1aWxkZXIuQ3JlYXRlU2h1ZmZsZVZlY3RvcihPcHNbMV0sIE9wc1syXSwgU1YsICJ2dHJuIik7CisgICAgICBTViA9IEJ1aWxkZXIuQ3JlYXRlU3RvcmUoU1YsIEFkZHIpOwogICAgIH0KKyAgICByZXR1cm4gU1Y7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0c3RfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0c3RxX3Y6IHsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQW5kKE9wc1swXSwgT3BzWzFdKTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfTkUsIE9wc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvOjpnZXQoVHkpKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTRXh0KE9wc1swXSwgVHksICJ2dHN0Iik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z1enBfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z1enBxX3Y6IHsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5KSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOworICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMl0sIFR5KTsKKyAgICBWYWx1ZSAqU1YgPSAwOwogCi0gICAgbGx2bTo6VHlwZSAqVHlzWzJdID0ge1JUeSwgVlR5fTsKLSAgICBGID0gQ0dGLkNHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpOwotICAgIGFzc2VydChFLT5nZXROdW1BcmdzKCkgPT0gMSk7Ci0gIH0gZWxzZSBpZiAoT3ZlcmxvYWRJbnQpIHsKLSAgICAvLyBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhpcyBvdmVybG9hZGVkIEFBcmNoNjQgaW50cmluc2ljCi0gICAgbGx2bTo6VHlwZSAqVHkgPSBDR0YuQ29udmVydFR5cGUoRS0+Z2V0Q2FsbFJldHVyblR5cGUoKSk7Ci0gICAgbGx2bTo6VmVjdG9yVHlwZSAqVlR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KFR5LCAxKTsKLSAgICBhc3NlcnQoVlR5KTsKKyAgICBmb3IgKHVuc2lnbmVkIHZpID0gMDsgdmkgIT0gMjsgKyt2aSkgeworICAgICAgU21hbGxWZWN0b3I8Q29uc3RhbnQqLCAxNj4gSW5kaWNlczsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBJbmRpY2VzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KEludDMyVHksIDIqaSt2aSkpOwogCi0gICAgRiA9IENHRi5DR00uZ2V0SW50cmluc2ljKEludCwgVlR5KTsKLSAgfSBlbHNlIGlmIChPdmVybG9hZFdpZGVJbnQgfHwgT3ZlcmxvYWROYXJyb3dJbnQpIHsKLSAgICAvLyBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhpcyBvdmVybG9hZGVkIEFBcmNoNjQgaW50cmluc2ljCi0gICAgY29uc3QgRXhwciAqQXJnID0gRS0+Z2V0QXJnKEUtPmdldE51bUFyZ3MoKS0xKTsKLSAgICBsbHZtOjpUeXBlICpUeSA9IENHRi5Db252ZXJ0VHlwZShBcmctPmdldFR5cGUoKSk7Ci0gICAgbGx2bTo6VmVjdG9yVHlwZSAqVlR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KFR5LCAxKTsKLSAgICBsbHZtOjpWZWN0b3JUeXBlICpSVHkgPSBPdmVybG9hZFdpZGVJbnQgPyAKLSAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldEV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGUoVlR5KSA6Ci0gICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXRUcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZShWVHkpOwotICAgIEYgPSBDR0YuQ0dNLmdldEludHJpbnNpYyhJbnQsIFJUeSk7Ci0gIH0gZWxzZSBpZiAoT3ZlcmxvYWRDbXBJbnQpIHsKLSAgICAvLyBEZXRlcm1pbmUgdGhlIHR5cGVzIG9mIHRoaXMgb3ZlcmxvYWRlZCBBQXJjaDY0IGludHJpbnNpYwotICAgIFNtYWxsVmVjdG9yPGxsdm06OlR5cGUgKiwgMz4gVHlzOwotICAgIGNvbnN0IEV4cHIgKkFyZyA9IEUtPmdldEFyZyhFLT5nZXROdW1BcmdzKCktMSk7Ci0gICAgbGx2bTo6VHlwZSAqVHkgPSBDR0YuQ29udmVydFR5cGUoRS0+Z2V0Q2FsbFJldHVyblR5cGUoKSk7Ci0gICAgbGx2bTo6VmVjdG9yVHlwZSAqVlR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KFR5LCAxKTsKLSAgICBUeXMucHVzaF9iYWNrKFZUeSk7Ci0gICAgVHkgPSBDR0YuQ29udmVydFR5cGUoQXJnLT5nZXRUeXBlKCkpOwotICAgIFZUeSA9IGxsdm06OlZlY3RvclR5cGU6OmdldChUeSwgMSk7Ci0gICAgVHlzLnB1c2hfYmFjayhWVHkpOwotICAgIGlmKElzRnBDbXBaSW50KQotICAgICAgVlR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KENHRi5GbG9hdFR5LCAxKTsKLSAgICBUeXMucHVzaF9iYWNrKFZUeSk7CisgICAgICBWYWx1ZSAqQWRkciA9IEJ1aWxkZXIuQ3JlYXRlQ29uc3RJbkJvdW5kc0dFUDFfMzIoT3BzWzBdLCB2aSk7CisgICAgICBTViA9IGxsdm06OkNvbnN0YW50VmVjdG9yOjpnZXQoSW5kaWNlcyk7CisgICAgICBTViA9IEJ1aWxkZXIuQ3JlYXRlU2h1ZmZsZVZlY3RvcihPcHNbMV0sIE9wc1syXSwgU1YsICJ2dXpwIik7CisgICAgICBTViA9IEJ1aWxkZXIuQ3JlYXRlU3RvcmUoU1YsIEFkZHIpOworICAgIH0KKyAgICByZXR1cm4gU1Y7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z6aXBfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z6aXBxX3Y6IHsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5KSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOworICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMl0sIFR5KTsKKyAgICBWYWx1ZSAqU1YgPSAwOwogCi0gICAgRiA9IENHRi5DR00uZ2V0SW50cmluc2ljKEludCwgVHlzKTsKLSAgfSBlbHNlIGlmIChPdmVybG9hZEN2dEludCkgewotICAgIC8vIERldGVybWluZSB0aGUgdHlwZXMgb2YgdGhpcyBvdmVybG9hZGVkIEFBcmNoNjQgaW50cmluc2ljCi0gICAgU21hbGxWZWN0b3I8bGx2bTo6VHlwZSAqLCAyPiBUeXM7Ci0gICAgY29uc3QgRXhwciAqQXJnID0gRS0+Z2V0QXJnKEUtPmdldE51bUFyZ3MoKS0xKTsKLSAgICBsbHZtOjpUeXBlICpUeSA9IENHRi5Db252ZXJ0VHlwZShFLT5nZXRDYWxsUmV0dXJuVHlwZSgpKTsKLSAgICBsbHZtOjpWZWN0b3JUeXBlICpWVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoVHksIDEpOwotICAgIFR5cy5wdXNoX2JhY2soVlR5KTsKLSAgICBUeSA9IENHRi5Db252ZXJ0VHlwZShBcmctPmdldFR5cGUoKSk7Ci0gICAgVlR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KFR5LCAxKTsKLSAgICBUeXMucHVzaF9iYWNrKFZUeSk7CisgICAgZm9yICh1bnNpZ25lZCB2aSA9IDA7IHZpICE9IDI7ICsrdmkpIHsKKyAgICAgIFNtYWxsVmVjdG9yPENvbnN0YW50KiwgMTY+IEluZGljZXM7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlR5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7IGkgKz0gMikgeworICAgICAgICBJbmRpY2VzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KEludDMyVHksIChpICsgdmkqZSkgPj4gMSkpOworICAgICAgICBJbmRpY2VzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KEludDMyVHksICgoaSArIHZpKmUpID4+IDEpK2UpKTsKKyAgICAgIH0KKyAgICAgIFZhbHVlICpBZGRyID0gQnVpbGRlci5DcmVhdGVDb25zdEluQm91bmRzR0VQMV8zMihPcHNbMF0sIHZpKTsKKyAgICAgIFNWID0gbGx2bTo6Q29uc3RhbnRWZWN0b3I6OmdldChJbmRpY2VzKTsKKyAgICAgIFNWID0gQnVpbGRlci5DcmVhdGVTaHVmZmxlVmVjdG9yKE9wc1sxXSwgT3BzWzJdLCBTViwgInZ6aXAiKTsKKyAgICAgIFNWID0gQnVpbGRlci5DcmVhdGVTdG9yZShTViwgQWRkcik7CisgICAgfQorICAgIHJldHVybiBTVjsKKyAgfQorICB9CiAKLSAgICBGID0gQ0dGLkNHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpOwotICB9IGVsc2UKLSAgICBGID0gQ0dGLkNHTS5nZXRJbnRyaW5zaWMoSW50KTsKKyAgYXNzZXJ0KEludCAmJiAiRXhwZWN0ZWQgdmFsaWQgaW50cmluc2ljIG51bWJlciIpOwogCi0gIFZhbHVlICpSZXN1bHQgPSBDR0YuRW1pdE5lb25DYWxsKEYsIE9wcywgcyk7Ci0gIGxsdm06OlR5cGUgKlJlc3VsdFR5cGUgPSBDR0YuQ29udmVydFR5cGUoRS0+Z2V0VHlwZSgpKTsKKyAgLy8gRGV0ZXJtaW5lIHRoZSB0eXBlKHMpIG9mIHRoaXMgb3ZlcmxvYWRlZCBBQXJjaDY0IGludHJpbnNpYy4KKyAgRnVuY3Rpb24gKkYgPSBMb29rdXBOZW9uTExWTUludHJpbnNpYyhJbnQsIE1vZGlmaWVyLCBUeSwgRSk7CisKKyAgVmFsdWUgKlJlc3VsdCA9IEVtaXROZW9uQ2FsbChGLCBPcHMsIE5hbWVIaW50KTsKKyAgbGx2bTo6VHlwZSAqUmVzdWx0VHlwZSA9IENvbnZlcnRUeXBlKEUtPmdldFR5cGUoKSk7CiAgIC8vIEFBcmNoNjQgaW50cmluc2ljIG9uZS1lbGVtZW50IHZlY3RvciB0eXBlIGNhc3QgdG8KICAgLy8gc2NhbGFyIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGJ1aWx0aW4KLSAgcmV0dXJuIENHRi5CdWlsZGVyLkNyZWF0ZUJpdENhc3QoUmVzdWx0LCBSZXN1bHRUeXBlLCBzKTsKKyAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChSZXN1bHQsIFJlc3VsdFR5cGUsIE5hbWVIaW50KTsKIH0KIAogVmFsdWUgKkNvZGVHZW5GdW5jdGlvbjo6RW1pdEFBcmNoNjRDb21wYXJlQnVpbHRpbkV4cHIoCiAgICAgVmFsdWUgKk9wLCBsbHZtOjpUeXBlICpUeSwgY29uc3QgQ21wSW5zdDo6UHJlZGljYXRlIEZwLAogICAgIGNvbnN0IENtcEluc3Q6OlByZWRpY2F0ZSBJcCwgY29uc3QgVHdpbmUgJk5hbWUpIHsKLSAgbGx2bTo6VHlwZSAqT1R5ID0gKChsbHZtOjpVc2VyICopT3ApLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCk7Ci0gIGlmIChPVHktPmlzUG9pbnRlclR5KCkpCi0gICAgT1R5ID0gVHk7CisgIGxsdm06OlR5cGUgKk9UeSA9IE9wLT5nZXRUeXBlKCk7CisKKyAgLy8gRklYTUU6IHRoaXMgaXMgdXR0ZXJseSBob3JyaWZpYy4gV2Ugc2hvdWxkIG5vdCBiZSBsb29raW5nIGF0IHByZXZpb3VzCisgIC8vIGNvZGVnZW4gY29udGV4dCB0byBmaW5kIG91dCB3aGF0IG5lZWRzIGRvaW5nLiBVbmZvcnR1bmF0ZWx5IFRhYmxlR2VuCisgIC8vIGN1cnJlbnRseSBnaXZlcyB1cyBleGFjdGx5IHRoZSBzYW1lIGNhbGxzIGZvciB2Y2Vxel9mMzIgYW5kIHZjZXF6X3MzMgorICAvLyAoZXRjKS4KKyAgaWYgKEJpdENhc3RJbnN0ICpCSSA9IGR5bl9jYXN0PEJpdENhc3RJbnN0PihPcCkpCisgICAgT1R5ID0gQkktPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKTsKKwogICBPcCA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcCwgT1R5KTsKLSAgaWYgKCgobGx2bTo6VmVjdG9yVHlwZSAqKU9UeSktPmdldEVsZW1lbnRUeXBlKCktPmlzRmxvYXRpbmdQb2ludFR5KCkpIHsKLSAgICBPcCA9IEJ1aWxkZXIuQ3JlYXRlRkNtcChGcCwgT3AsIENvbnN0YW50QWdncmVnYXRlWmVybzo6Z2V0KE9UeSkpOworICBpZiAoT1R5LT5nZXRTY2FsYXJUeXBlKCktPmlzRmxvYXRpbmdQb2ludFR5KCkpIHsKKyAgICBPcCA9IEJ1aWxkZXIuQ3JlYXRlRkNtcChGcCwgT3AsIENvbnN0YW50OjpnZXROdWxsVmFsdWUoT1R5KSk7CiAgIH0gZWxzZSB7Ci0gICAgT3AgPSBCdWlsZGVyLkNyZWF0ZUlDbXAoSXAsIE9wLCBDb25zdGFudEFnZ3JlZ2F0ZVplcm86OmdldChPVHkpKTsKKyAgICBPcCA9IEJ1aWxkZXIuQ3JlYXRlSUNtcChJcCwgT3AsIENvbnN0YW50OjpnZXROdWxsVmFsdWUoT1R5KSk7CiAgIH0KLSAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlWkV4dChPcCwgVHksIE5hbWUpOworICByZXR1cm4gQnVpbGRlci5DcmVhdGVTRXh0KE9wLCBUeSwgTmFtZSk7CiB9CiAKIHN0YXRpYyBWYWx1ZSAqcGFja1RCTERWZWN0b3JMaXN0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBBcnJheVJlZjxWYWx1ZSAqPiBPcHMsCkBAIC0yNjgxLDEzICszNTI2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWmVyb1RibCwgU1YsIE5hbWUpKTsKICAgfQogCi0gIFRibFR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KFRibFR5LT5nZXRFbGVtZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKlRibFR5LT5nZXROdW1FbGVtZW50cygpKTsKLSAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBSZXNUeSwgVGJsVHkgfTsKLQogICBGdW5jdGlvbiAqVGJsRjsKICAgVGJsT3BzLnB1c2hfYmFjayhJbmRleE9wKTsKLSAgVGJsRiA9IENHRi5DR00uZ2V0SW50cmluc2ljKEludElELCBUeXMpOworICBUYmxGID0gQ0dGLkNHTS5nZXRJbnRyaW5zaWMoSW50SUQsIFJlc1R5KTsKICAgCiAgIHJldHVybiBDR0YuRW1pdE5lb25DYWxsKFRibEYsIFRibE9wcywgTmFtZSk7CiB9CkBAIC0yNjk4LDM3ICszNTM5LDMzIEBACiAgIHVuc2lnbmVkIGludCBJbnQgPSAwOwogICBjb25zdCBjaGFyICpzID0gTlVMTDsKIAotICB1bnNpZ25lZCBUYmxQb3M7CiAgIHN3aXRjaCAoQnVpbHRpbklEKSB7CiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIDA7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92dGJsMV92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnF0YmwxX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRibDFxX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92dGJsMl92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnF0YmwyX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRibDJxX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92dGJsM192OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnF0YmwzX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRibDNxX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92dGJsNF92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnF0Ymw0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRibDRxX3Y6Ci0gICAgVGJsUG9zID0gMDsKLSAgICBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Z0YngxX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRieDFfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4MXFfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Z0YngyX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRieDJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4MnFfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Z0YngzX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRieDNfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4M3FfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Z0Yng0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRieDRfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4NHFfdjoKLSAgICBUYmxQb3MgPSAxOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRibDFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsMV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YmwxcV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRibDJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YmwycV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRibDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsM192OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YmwzcV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRibDRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsNF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0Ymw0cV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4MV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngxcV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4Ml92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngycV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4M192OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngzcV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0Yng0cV92OgogICAgIGJyZWFrOwogICB9CiAKQEAgLTI3NTIsMzUgKzM1ODksMzEgQEAKICAgICBPcHMucHVzaF9iYWNrKENHRi5FbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoaSkpKTsKICAgfQogCi0gIEFyZyA9IEUtPmdldEFyZyhUYmxQb3MpOwotICBsbHZtOjpUeXBlICpUYmxUeSA9IENHRi5Db252ZXJ0VHlwZShBcmctPmdldFR5cGUoKSk7Ci0gIGxsdm06OlZlY3RvclR5cGUgKlZUYmxUeSA9IGNhc3Q8bGx2bTo6VmVjdG9yVHlwZT4oVGJsVHkpOwotICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBWVGJsVHkgfTsKICAgdW5zaWduZWQgbkVsdHMgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7ICAKIAogICAvLyBBQXJjaDY0IHNjYWxhciBidWlsdGlucyBhcmUgbm90IG92ZXJsb2FkZWQsIHRoZXkgZG8gbm90IGhhdmUgYW4gZXh0cmEKICAgLy8gYXJndW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhlIHZlY3RvciB0eXBlLCBuZWVkIHRvIGhhbmRsZSBlYWNoIGNhc2UuCiAgIFNtYWxsVmVjdG9yPFZhbHVlICosIDI+IFRibE9wczsKICAgc3dpdGNoIChCdWlsdGluSUQpIHsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Z0YmwxX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YmwxX3Y6IHsKICAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1swXSk7CiAgICAgcmV0dXJuIHBhY2tUQkxEVmVjdG9yTGlzdChDR0YsIFRibE9wcywgMCwgT3BzWzFdLCBUeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z0YmwxLCAidnRibDEiKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnRibDJfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRibDJfdjogewogICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzBdKTsKICAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1sxXSk7CiAgICAgcmV0dXJuIHBhY2tUQkxEVmVjdG9yTGlzdChDR0YsIFRibE9wcywgMCwgT3BzWzJdLCBUeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z0YmwxLCAidnRibDEiKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnRibDNfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRibDNfdjogewogICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzBdKTsKICAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1sxXSk7CiAgICAgVGJsT3BzLnB1c2hfYmFjayhPcHNbMl0pOwogICAgIHJldHVybiBwYWNrVEJMRFZlY3Rvckxpc3QoQ0dGLCBUYmxPcHMsIDAsIE9wc1szXSwgVHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92dGJsMiwgInZ0YmwyIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Z0Ymw0X3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0Ymw0X3Y6IHsKICAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1swXSk7CiAgICAgVGJsT3BzLnB1c2hfYmFjayhPcHNbMV0pOwogICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzJdKTsKQEAgLTI3ODgsNyArMzYyMSw3IEBACiAgICAgcmV0dXJuIHBhY2tUQkxEVmVjdG9yTGlzdChDR0YsIFRibE9wcywgMCwgT3BzWzRdLCBUeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z0YmwyLCAidnRibDIiKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnRieDFfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDFfdjogewogICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzFdKTsKICAgICBWYWx1ZSAqVGJsUmVzID0gcGFja1RCTERWZWN0b3JMaXN0KENHRiwgVGJsT3BzLCAwLCBPcHNbMl0sIFR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljOjphYXJjaDY0X25lb25fdnRibDEsICJ2dGJsMSIpOwpAQCAtMjgwNSwxMyArMzYzOCwxMyBAQAogICAgIEZ1bmN0aW9uICpCc2xGID0gQ0dGLkNHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92YnNsLCBUeSk7CiAgICAgcmV0dXJuIENHRi5FbWl0TmVvbkNhbGwoQnNsRiwgQnNsT3BzLCAidmJzbCIpOwogICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92dGJ4Ml92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dGJ4Ml92OiB7CiAgICAgVGJsT3BzLnB1c2hfYmFjayhPcHNbMV0pOwogICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzJdKTsKICAgICByZXR1cm4gcGFja1RCTERWZWN0b3JMaXN0KENHRiwgVGJsT3BzLCBPcHNbMF0sIE9wc1szXSwgVHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92dGJ4MSwgInZ0YngxIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Z0YngzX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YngzX3Y6IHsKICAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1sxXSk7CiAgICAgVGJsT3BzLnB1c2hfYmFjayhPcHNbMl0pOwogICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzNdKTsKQEAgLTI4MzEsNyArMzY2NCw3IEBACiAgICAgRnVuY3Rpb24gKkJzbEYgPSBDR0YuQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3Zic2wsIFR5KTsKICAgICByZXR1cm4gQ0dGLkVtaXROZW9uQ2FsbChCc2xGLCBCc2xPcHMsICJ2YnNsIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Z0Yng0X3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0Yng0X3Y6IHsKICAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1sxXSk7CiAgICAgVGJsT3BzLnB1c2hfYmFjayhPcHNbMl0pOwogICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzNdKTsKQEAgLTI4MzksMjkgKzM2NzIsMjkgQEAKICAgICByZXR1cm4gcGFja1RCTERWZWN0b3JMaXN0KENHRiwgVGJsT3BzLCBPcHNbMF0sIE9wc1s1XSwgVHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92dGJ4MiwgInZ0YngyIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsMV92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnF0YmwxcV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YmwxX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDFxX3Y6CiAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnRibDE7IHMgPSAidnRibDEiOyBicmVhazsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsMl92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnF0YmwycV92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsMnFfdjogewogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z0YmwyOyBzID0gInZ0YmwyIjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRibDNfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsM3FfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsM192OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YmwzcV92OgogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z0YmwzOyBzID0gInZ0YmwzIjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRibDRfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsNHFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsNF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0Ymw0cV92OgogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z0Ymw0OyBzID0gInZ0Ymw0IjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRieDFfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4MXFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4MV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngxcV92OgogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z0YngxOyBzID0gInZ0YngxIjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRieDJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4MnFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4Ml92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngycV92OgogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z0YngyOyBzID0gInZ0YngyIjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRieDNfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4M3FfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4M192OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngzcV92OgogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z0YngzOyBzID0gInZ0YngzIjsgYnJlYWs7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXRieDRfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4NHFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0Yng0cV92OgogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z0Yng0OyBzID0gInZ0Yng0IjsgYnJlYWs7CiAgIH0KICAgfQpAQCAtMjg2OSwxNSArMzcwMiwyMyBAQAogICBpZiAoIUludCkKICAgICByZXR1cm4gMDsKIAotICBGdW5jdGlvbiAqRiA9IENHRi5DR00uZ2V0SW50cmluc2ljKEludCwgVHlzKTsKKyAgRnVuY3Rpb24gKkYgPSBDR0YuQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KTsKICAgcmV0dXJuIENHRi5FbWl0TmVvbkNhbGwoRiwgT3BzLCBzKTsKIH0KIAogVmFsdWUgKkNvZGVHZW5GdW5jdGlvbjo6RW1pdEFBcmNoNjRCdWlsdGluRXhwcih1bnNpZ25lZCBCdWlsdGluSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFeHByICpFKSB7CisKICAgLy8gUHJvY2VzcyBBQXJjaDY0IHNjYWxhciBidWlsdGlucwotICBpZiAoVmFsdWUgKlJlc3VsdCA9IEVtaXRBQXJjaDY0U2NhbGFyQnVpbHRpbkV4cHIoKnRoaXMsIEJ1aWx0aW5JRCwgRSkpCisgIGxsdm06OkFycmF5UmVmPE5lb25JbnRyaW5zaWNJbmZvPiBTSVNESW5mbyhBQXJjaDY0U0lTREludHJpbnNpY0luZm8pOworICBjb25zdCBOZW9uSW50cmluc2ljSW5mbyAqQnVpbHRpbiA9IGZpbmROZW9uSW50cmluc2ljSW5NYXAoCisgICAgICBTSVNESW5mbywgQnVpbHRpbklELCBBQXJjaDY0U0lTREludHJpbnNpY0luZm9Qcm92ZW5Tb3J0ZWQpOworCisgIGlmIChCdWlsdGluKSB7CisgICAgVmFsdWUgKlJlc3VsdCA9IEVtaXRBQXJjaDY0U2NhbGFyQnVpbHRpbkV4cHIoKnRoaXMsICpCdWlsdGluLCBFKTsKKyAgICBhc3NlcnQoUmVzdWx0ICYmICJTSVNEIGludHJpbnNpYyBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQiKTsKICAgICByZXR1cm4gUmVzdWx0OworICB9CiAKICAgLy8gUHJvY2VzcyBBQXJjaDY0IHRhYmxlIGxvb2t1cCBidWlsdGlucwogICBpZiAoVmFsdWUgKlJlc3VsdCA9IEVtaXRBQXJjaDY0VGJsQnVpbHRpbkV4cHIoKnRoaXMsIEJ1aWx0aW5JRCwgRSkpCkBAIC0yODk5LDIwICszNzQwLDYwIEBACiAKICAgU21hbGxWZWN0b3I8VmFsdWUgKiwgND4gT3BzOwogICBsbHZtOjpWYWx1ZSAqQWxpZ24gPSAwOyAvLyBBbGlnbm1lbnQgZm9yIGxvYWQvc3RvcmUKKworICBpZiAoQnVpbHRpbklEID09IE5FT046OkJJX19idWlsdGluX25lb25fdmxkcnFfcDEyOCkgeworICAgVmFsdWUgKk9wID0gRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDApKTsKKyAgIHVuc2lnbmVkIGFkZHJlc3NTcGFjZSA9CisgICAgIGNhc3Q8bGx2bTo6UG9pbnRlclR5cGU+KE9wLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgIGxsdm06OlR5cGUgKlR5ID0gbGx2bTo6VHlwZTo6Z2V0RlAxMjhQdHJUeShnZXRMTFZNQ29udGV4dCgpLCBhZGRyZXNzU3BhY2UpOworICAgT3AgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3AsIFR5KTsKKyAgIE9wID0gQnVpbGRlci5DcmVhdGVMb2FkKE9wKTsKKyAgIFR5ID0gbGx2bTo6VHlwZTo6Z2V0SW50TlR5KGdldExMVk1Db250ZXh0KCksIDEyOCk7CisgICByZXR1cm4gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wLCBUeSk7CisgIH0KKyAgaWYgKEJ1aWx0aW5JRCA9PSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdHJxX3AxMjgpIHsKKyAgICBWYWx1ZSAqT3AwID0gRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDApKTsKKyAgICB1bnNpZ25lZCBhZGRyZXNzU3BhY2UgPQorICAgICAgY2FzdDxsbHZtOjpQb2ludGVyVHlwZT4oT3AwLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgICBsbHZtOjpUeXBlICpQVHkgPSBsbHZtOjpUeXBlOjpnZXRGUDEyOFB0clR5KGdldExMVk1Db250ZXh0KCksIGFkZHJlc3NTcGFjZSk7CisgICAgT3AwID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wMCwgUFR5KTsKKyAgICBWYWx1ZSAqT3AxID0gRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKTsKKyAgICBsbHZtOjpUeXBlICpUeSA9IGxsdm06OlR5cGU6OmdldEZQMTI4VHkoZ2V0TExWTUNvbnRleHQoKSk7CisgICAgT3AxID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wMSwgVHkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wMSwgT3AwKTsKKyAgfQogICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRS0+Z2V0TnVtQXJncygpIC0gMTsgaSAhPSBlOyBpKyspIHsKICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICBzd2l0Y2ggKEJ1aWx0aW5JRCkgewotICAgICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDJfdjoKLSAgICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94Ml92OgotICAgICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDNfdjoKLSAgICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94M192OgotICAgICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDRfdjoKLSAgICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94NF92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QycV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QzcV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3Q0cV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDJfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94Ml92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDNfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94M192OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDRfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94NF92OgogICAgICAgLy8gSGFuZGxlIGxkMS9zdDEgbGFuZSBpbiB0aGlzIGZ1bmN0aW9uIGEgbGl0dGxlIGRpZmZlcmVudCBmcm9tIEFSTS4KLSAgICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQxX2xhbmVfdjoKLSAgICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV9sYW5lX3Y6Ci0gICAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0MV9sYW5lX3Y6Ci0gICAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0MXFfbGFuZV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfbGFuZV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxX2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV9sYW5lX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0Ml9sYW5lX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNfbGFuZV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNxX2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3Q0X2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV9kdXBfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV9kdXBfdjoKICAgICAgICAgLy8gR2V0IHRoZSBhbGlnbm1lbnQgZm9yIHRoZSBhcmd1bWVudCBpbiBhZGRpdGlvbiB0byB0aGUgdmFsdWU7CiAgICAgICAgIC8vIHdlJ2xsIHVzZSBpdCBsYXRlci4KICAgICAgICAgc3RkOjpwYWlyPGxsdm06OlZhbHVlICosIHVuc2lnbmVkPiBTcmMgPQpAQCAtMjkyNCwyMSArMzgwNSwzMSBAQAogICAgIH0KICAgICBpZiAoaSA9PSAxKSB7CiAgICAgICBzd2l0Y2ggKEJ1aWx0aW5JRCkgewotICAgICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDJfdjoKLSAgICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94Ml92OgotICAgICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdjoKLSAgICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94M192OgotICAgICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDRfdjoKLSAgICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQycV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQzcV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0cV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDJfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94Ml92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94M192OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDRfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92OgogICAgICAgLy8gSGFuZGxlIGxkMS9zdDEgZHVwIGxhbmUgaW4gdGhpcyBmdW5jdGlvbiBhIGxpdHRsZSBkaWZmZXJlbnQgZnJvbSBBUk0uCi0gICAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMl9kdXBfdjoKLSAgICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQycV9kdXBfdjoKLSAgICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQzX2R1cF92OgotICAgICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNxX2R1cF92OgotICAgICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3Y6Ci0gICAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkNHFfZHVwX3Y6Ci0gICAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMl9sYW5lX3Y6Ci0gICAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMnFfbGFuZV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJfZHVwX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMnFfZHVwX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM19kdXBfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0X2R1cF92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJfbGFuZV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQzX2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQzcV9sYW5lX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkNF9sYW5lX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkNHFfbGFuZV92OgogICAgICAgICAvLyBHZXQgdGhlIGFsaWdubWVudCBmb3IgdGhlIGFyZ3VtZW50IGluIGFkZGl0aW9uIHRvIHRoZSB2YWx1ZTsKICAgICAgICAgLy8gd2UnbGwgdXNlIGl0IGxhdGVyLgogICAgICAgICBzdGQ6OnBhaXI8bGx2bTo6VmFsdWUgKiwgdW5zaWduZWQ+IFNyYyA9CkBAIC0yOTY3LDYgKzM4NTgsMTcgQEAKICAgaWYgKCFUeSkKICAgICByZXR1cm4gMDsKIAorCisgIC8vIE1hbnkgTkVPTiBidWlsdGlucyBoYXZlIGlkZW50aWNhbCBzZW1hbnRpY3MgYW5kIHVzZXMgaW4gQVJNIGFuZAorICAvLyBBQXJjaDY0LiBFbWl0IHRoZXNlIGluIGEgc2luZ2xlIGZ1bmN0aW9uLgorICBsbHZtOjpBcnJheVJlZjxOZW9uSW50cmluc2ljSW5mbz4gSW50cmluc2ljTWFwKEFSTVNJTURJbnRyaW5zaWNNYXApOworICBCdWlsdGluID0gZmluZE5lb25JbnRyaW5zaWNJbk1hcChJbnRyaW5zaWNNYXAsIEJ1aWx0aW5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVPTlNJTURJbnRyaW5zaWNzUHJvdmVuU29ydGVkKTsKKyAgaWYgKEJ1aWx0aW4pCisgICAgcmV0dXJuIEVtaXRDb21tb25OZW9uQnVpbHRpbkV4cHIoCisgICAgICAgIEJ1aWx0aW4tPkJ1aWx0aW5JRCwgQnVpbHRpbi0+TExWTUludHJpbnNpYywgQnVpbHRpbi0+QWx0TExWTUludHJpbnNpYywKKyAgICAgICAgQnVpbHRpbi0+TmFtZUhpbnQsIEJ1aWx0aW4tPlR5cGVNb2RpZmllciwgRSwgT3BzLCBBbGlnbik7CisKICAgdW5zaWduZWQgSW50OwogICBzd2l0Y2ggKEJ1aWx0aW5JRCkgewogICBkZWZhdWx0OgpAQCAtMjk3NSwyMDggKzM4NzcsMzAgQEAKICAgLy8gQUFyY2g2NCBidWlsdGlucyBtYXBwaW5nIHRvIGxlZ2FjeSBBUk0gdjcgYnVpbHRpbnMuCiAgIC8vIEZJWE1FOiB0aGUgbWFwcGVkIGJ1aWx0aW5zIGxpc3RlZCBjb3JyZXNwb25kIHRvIHdoYXQgaGFzIGJlZW4gdGVzdGVkCiAgIC8vIGluIGFhcmNoNjQtbmVvbi1pbnRyaW5zaWNzLmMgc28gZmFyLgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnV6cF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Z1enBfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92dXpwcV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Z1enBxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnppcF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Z6aXBfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92emlwcV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Z6aXBxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnRybl92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Z0cm5fdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92dHJucV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Z0cm5xX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmV4dF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZleHRfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92ZXh0cV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZleHRxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdm11bF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWxfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bXVscV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWxxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFiZF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZhYmRfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWJkcV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZhYmRxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmZtYV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Zm1hcV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmJzbF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zic2xfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YnNscV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zic2xxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJzcXJ0c192OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3FydHNfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cnNxcnRzcV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3FydHNxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJlY3BzX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnJlY3BzX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJlY3BzcV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZyZWNwc3FfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2FsZV92OgotICAgIGlmIChWVHktPmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0gMSkgewotICAgICAgc3RkOjpzd2FwKE9wc1swXSwgT3BzWzFdKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmNhbGVfdiwgRSk7Ci0gICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNhZ2VfdjoKLSAgICBpZiAoVlR5LT5nZXRWZWN0b3JOdW1FbGVtZW50cygpID09IDEpIHsKLSAgICAgIC8vIERldGVybWluZSB0aGUgdHlwZXMgb2YgdGhpcyBvdmVybG9hZGVkIEFBcmNoNjQgaW50cmluc2ljCi0gICAgICBTbWFsbFZlY3RvcjxsbHZtOjpUeXBlICosIDM+IFR5czsKLSAgICAgIFR5cy5wdXNoX2JhY2soVlR5KTsKLSAgICAgIFZUeSA9IGxsdm06OlZlY3RvclR5cGU6OmdldChEb3VibGVUeSwgMSk7Ci0gICAgICBUeXMucHVzaF9iYWNrKFZUeSk7Ci0gICAgICBUeXMucHVzaF9iYWNrKFZUeSk7Ci0gICAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNhZ2UsIFR5cyk7Ci0gICAgICByZXR1cm4gRW1pdE5lb25DYWxsKEYsIE9wcywgInZjYWdlIik7Ci0gICAgfQotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWdlX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNhbGVxX3Y6Ci0gICAgc3RkOjpzd2FwKE9wc1swXSwgT3BzWzFdKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWdlcV92OiB7Ci0gICAgRnVuY3Rpb24gKkY7Ci0gICAgaWYgKFZUeS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNJbnRlZ2VyVHkoNjQpKQotICAgICAgRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphYXJjaDY0X25lb25fdmFjZ2VxKTsKLSAgICBlbHNlCi0gICAgICBGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3ZhY2dlcSk7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChGLCBPcHMsICJ2Y2FnZSIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2FsdF92OgotICAgIGlmIChWVHktPmdldFZlY3Rvck51bUVsZW1lbnRzKCkgPT0gMSkgewotICAgICAgc3RkOjpzd2FwKE9wc1swXSwgT3BzWzFdKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmNhbHRfdiwgRSk7Ci0gICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNhZ3RfdjoKLSAgICBpZiAoVlR5LT5nZXRWZWN0b3JOdW1FbGVtZW50cygpID09IDEpIHsKLSAgICAgIC8vIERldGVybWluZSB0aGUgdHlwZXMgb2YgdGhpcyBvdmVybG9hZGVkIEFBcmNoNjQgaW50cmluc2ljCi0gICAgICBTbWFsbFZlY3RvcjxsbHZtOjpUeXBlICosIDM+IFR5czsKLSAgICAgIFR5cy5wdXNoX2JhY2soVlR5KTsKLSAgICAgIFZUeSA9IGxsdm06OlZlY3RvclR5cGU6OmdldChEb3VibGVUeSwgMSk7Ci0gICAgICBUeXMucHVzaF9iYWNrKFZUeSk7Ci0gICAgICBUeXMucHVzaF9iYWNrKFZUeSk7Ci0gICAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphYXJjaDY0X25lb25fdmNhZ3QsIFR5cyk7Ci0gICAgICByZXR1cm4gRW1pdE5lb25DYWxsKEYsIE9wcywgInZjYWd0Iik7Ci0gICAgfQotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWd0X3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNhbHRxX3Y6Ci0gICAgc3RkOjpzd2FwKE9wc1swXSwgT3BzWzFdKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWd0cV92OiB7Ci0gICAgRnVuY3Rpb24gKkY7Ci0gICAgaWYgKFZUeS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNJbnRlZ2VyVHkoNjQpKQotICAgICAgRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphYXJjaDY0X25lb25fdmFjZ3RxKTsKLSAgICBlbHNlCi0gICAgICBGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3ZhY2d0cSk7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChGLCBPcHMsICJ2Y2FndCIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92dHN0X3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnRzdF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Z0c3RxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnRzdHFfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92aGFkZF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZoYWRkX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmhhZGRxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmhhZGRxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmhzdWJfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92aHN1Yl92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zoc3VicV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zoc3VicV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZyaGFkZF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZyaGFkZF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZyaGFkZHFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cmhhZGRxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFhZGRfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cWFkZF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWRkcV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWRkcV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc3ViX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnFzdWJfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXN1YnFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cXN1YnFfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2hsX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnNobF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGxxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnNobHFfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXNobF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGxxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnFzaGxxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJzaGxfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cnNobF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hscV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hscV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNobF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNobF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNobHFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cXJzaGxxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFkZGhuX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmFkZGhuX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJhZGRobl92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZyYWRkaG5fdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3ViaG5fdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3ViaG5fdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cnN1YmhuX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnJzdWJobl92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWxsX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdm11bGxfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cWRtdWxsX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnFkbXVsbF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFkbWxzbF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWF4X3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdm1heF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXhxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdm1heHFfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWluX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdm1pbl92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW5xX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdm1pbnFfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cG1heF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWF4X3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnBtaW5fdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cG1pbl92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRkX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnBhZGRfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cWRtdWxoX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnFkbXVsaF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG11bGhxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnFkbXVsaHFfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJkbXVsaF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxcmRtdWxoX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFyZG11bGhxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnFyZG11bGhxX3YsIEUpOwogCiAgIC8vIFNoaWZ0IGJ5IGltbWVkaWF0ZQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNocl9uX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnNocl9uX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNocnFfbl92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaHJxX25fdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cnNocl9uX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cnNocnFfbl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJzaHJfbl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJzaHJxX25fdjoKICAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnVyc2hyCiAgICAgICAgICAgICAgICA6IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZzcnNocjsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZyc2hyX24iKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmFfbl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNyYV9uX3Y6CiAgICAgaWYgKFZUeS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNJbnRlZ2VyVHkoNjQpKSB7CiAgICAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNyYWR1X24KICAgICAgICAgICAgICAgICAgOiBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92c3JhZHNfbjsKICAgICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQpLCBPcHMsICJ2c3JhX24iKTsKICAgICB9Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnNyYV9uX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNyYXFfbl92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmFxX25fdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cnNyYV9uX3Y6CisgICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmFfbl92LCBFKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmFxX25fdjoKKyAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKE5FT046OkJJX19idWlsdGluX25lb25fdnNyYXFfbl92LCBFKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3JhX25fdjoKICAgICBpZiAoVlR5LT5nZXRFbGVtZW50VHlwZSgpLT5pc0ludGVnZXJUeSg2NCkpIHsKICAgICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92cnNyYWR1X24KICAgICAgICAgICAgICAgICAgOiBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92cnNyYWRzX247CiAgICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50KSwgT3BzLCAidnJzcmFfbiIpOwogICAgIH0KICAgICAvLyBmYWxsIHRocm91Z2gKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3JhcV9uX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3JhcV9uX3Y6IHsKICAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CiAgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOwogICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92dXJzaHIKQEAgLTMxODQsNzMgKzM5MDgsMzkgQEAKICAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUNhbGwyKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wc1sxXSwgT3BzWzJdKTsKICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVBZGQoT3BzWzBdLCBPcHNbMV0sICJ2cnNyYV9uIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGxfbl92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGxfbl92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGxxX25fdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c2hscV9uX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGxfbl92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsX25fdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXNobHFfbl92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hscV9uX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaGx1X25fdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsdXFfbl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaGx1X25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsdXFfbl92OgogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZzcXNobHU7CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cXNobHVfbiIpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNyaV9uX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3JpcV9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3JpX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmlxX25fdjoKICAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92c3JpOwogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnNyaV9uIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2xpX25fdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzbGlxX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzbGlfbl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNsaXFfbl92OgogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZzbGk7CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2c2xpX24iKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGxsX25fdjogewotICAgIGxsdm06OlR5cGUgKlNyY1R5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0VHJ1bmNhdGVkRWxlbWVudFZlY3RvclR5cGUoVlR5KTsKLSAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBTcmNUeSk7Ci0gICAgaWYgKHVzZ24pCi0gICAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZVpFeHQoT3BzWzBdLCBWVHkpOwotICAgIGVsc2UKLSAgICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlU0V4dChPcHNbMF0sIFZUeSk7Ci0gICAgT3BzWzFdID0gRW1pdE5lb25TaGlmdFZlY3RvcihPcHNbMV0sIFZUeSwgZmFsc2UpOwotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVNobChPcHNbMF0sIE9wc1sxXSwgInZzaGxsX24iKTsKLSAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNocm5fbl92OiB7Ci0gICAgbGx2bTo6VHlwZSAqU3JjVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXRFeHRlbmRlZEVsZW1lbnRWZWN0b3JUeXBlKFZUeSk7Ci0gICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgU3JjVHkpOwotICAgIE9wc1sxXSA9IEVtaXROZW9uU2hpZnRWZWN0b3IoT3BzWzFdLCBTcmNUeSwgZmFsc2UpOwotICAgIGlmICh1c2duKQotICAgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVMU2hyKE9wc1swXSwgT3BzWzFdKTsKLSAgICBlbHNlCi0gICAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUFTaHIoT3BzWzBdLCBPcHNbMV0pOwotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVRydW5jKE9wc1swXSwgVHksICJ2c2hybl9uIik7Ci0gIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hydW5fbl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaHJ1bl9uX3Y6CiAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNxc2hydW47CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cXNocnVuX24iKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hybl9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNocm5fbl92OgogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Zyc2hybjsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZyc2hybl9uIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bl9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bl9uX3Y6CiAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNxcnNocnVuOwogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnFyc2hydW5fbiIpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFzaHJuX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hybl9uX3Y6CiAgICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3Z1cXNocm4KICAgICAgICAgICAgICAgIDogSW50cmluc2ljOjphYXJjaDY0X25lb25fdnNxc2hybjsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZxc2hybl9uIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJuX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5fbl92OgogICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92dXFyc2hybgogICAgICAgICAgICAgICAgOiBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl92c3Fyc2hybjsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZxcnNocm5fbiIpOwogCiAgIC8vIENvbnZlcnQKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Ztb3ZsX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdm1vdmxfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fZjMyX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmN2dF9uX2YzMl92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fZjMyX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmN2dHFfbl9mMzJfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fZjY0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2Y2NF92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fZjY0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2Y2NF92OiB7CiAgICAgbGx2bTo6VHlwZSAqRmxvYXRUeSA9CiAgICAgICAgIEdldE5lb25UeXBlKHRoaXMsIE5lb25UeXBlRmxhZ3MoTmVvblR5cGVGbGFnczo6RmxvYXQ2NCwgZmFsc2UsIHF1YWQpKTsKICAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IEZsb2F0VHksIFR5IH07CkBAIC0zMjU5LDc4ICszOTQ5LDI2IEBACiAgICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKTsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKEYsIE9wcywgInZjdnRfbiIpOwogICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fczMyX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmN2dF9uX3MzMl92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fczMyX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmN2dHFfbl9zMzJfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fdTMyX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmN2dF9uX3UzMl92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fdTMyX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmN2dHFfbl91MzJfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fczY0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fdTY0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX3M2NF92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHFfbl91NjRfdjogewotICAgIGxsdm06OlR5cGUgKkZsb2F0VHkgPQotICAgICAgICBHZXROZW9uVHlwZSh0aGlzLCBOZW9uVHlwZUZsYWdzKE5lb25UeXBlRmxhZ3M6OkZsb2F0NjQsIGZhbHNlLCBxdWFkKSk7Ci0gICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgRmxvYXRUeSB9OwotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZjdnRmcDJmeHUKLSAgICAgICAgICAgICAgIDogSW50cmluc2ljOjphcm1fbmVvbl92Y3Z0ZnAyZnhzOwotICAgIEZ1bmN0aW9uICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyk7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChGLCBPcHMsICJ2Y3Z0X24iKTsKLSAgfQogCiAgIC8vIExvYWQvU3RvcmUKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMXFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQyX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMnFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQycV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQzX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkM3FfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQzcV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQ0X3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkNHFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQ0cV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QxX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0MXFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QyX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0MnFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QycV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QzX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0M3FfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QzcV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3Q0X3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0NHFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3Q0cV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3gyX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQxX3gzX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94M192OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMV94NF92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMXFfeDRfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV94Ml92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMXFfeDJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3gzX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxX3g0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92OiB7CiAgICAgdW5zaWduZWQgSW50OwogICAgIHN3aXRjaCAoQnVpbHRpbklEKSB7Ci0gICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDJfdjoKLSAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMXFfeDJfdjoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV94Ml92OgorICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94Ml92OgogICAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmxkMXgyOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdjoKLSAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMXFfeDNfdjoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV94M192OgorICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94M192OgogICAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmxkMXgzOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDRfdjoKLSAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMXFfeDRfdjoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV94NF92OgorICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92OgogICAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdmxkMXg0OwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMzM0MCwzMiArMzk3OCwzMiBAQAogICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTdG9yZShPcHNbMV0sIE9wc1swXSk7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gyX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3QxX3gzX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94M192OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0MV94NF92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0MXFfeDRfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MV94Ml92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MXFfeDJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gzX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxX3g0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94NF92OiB7CiAgICAgT3BzLnB1c2hfYmFjayhBbGlnbik7CiAgICAgdW5zaWduZWQgSW50OwogICAgIHN3aXRjaCAoQnVpbHRpbklEKSB7Ci0gICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDJfdjoKLSAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0MXFfeDJfdjoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MV94Ml92OgorICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94Ml92OgogICAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnN0MXgyOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDNfdjoKLSAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0MXFfeDNfdjoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MV94M192OgorICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94M192OgogICAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnN0MXgzOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDRfdjoKLSAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0MXFfeDRfdjoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MV94NF92OgorICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94NF92OgogICAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnN0MXg0OwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAiIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfbGFuZV92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMXFfbGFuZV92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxX2xhbmVfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2xhbmVfdjogewogICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMV0sIFR5KTsKICAgICBUeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVlR5LT5nZXRFbGVtZW50VHlwZSgpKTsKICAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CkBAIC0zMzczLDIwICs0MDExLDggQEAKICAgICBMZC0+c2V0QWxpZ25tZW50KGNhc3Q8Q29uc3RhbnRJbnQ+KEFsaWduKS0+Z2V0WkV4dFZhbHVlKCkpOwogICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUluc2VydEVsZW1lbnQoT3BzWzFdLCBMZCwgT3BzWzJdLCAidmxkMV9sYW5lIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJfbGFuZV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX2xhbmVfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQycV9sYW5lX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmxkMnFfbGFuZV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNxX2xhbmVfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQzcV9sYW5lX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkNF9sYW5lX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmxkNF9sYW5lX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkNHFfbGFuZV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3QxX2xhbmVfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX2xhbmVfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MV9sYW5lX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV9sYW5lX3Y6IHsKICAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBUeSk7CiAgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChPcHNbMV0sIE9wc1syXSk7CiAgICAgVHkgPSBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKE9wc1sxXS0+Z2V0VHlwZSgpKTsKQEAgLTMzOTUsMzkgKzQwMjEsMjMgQEAKICAgICBTdC0+c2V0QWxpZ25tZW50KGNhc3Q8Q29uc3RhbnRJbnQ+KEFsaWduKS0+Z2V0WkV4dFZhbHVlKCkpOwogICAgIHJldHVybiBTdDsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0Ml9sYW5lX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnN0Ml9sYW5lX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJxX2xhbmVfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3QzX2xhbmVfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QzX2xhbmVfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3QzcV9sYW5lX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnN0M3FfbGFuZV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRfbGFuZV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRfbGFuZV92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRxX2xhbmVfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMV9kdXBfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQxX2R1cF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2R1cF92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2R1cF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJfZHVwX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQycV9kdXBfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQ0cV9kdXBfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMl9kdXBfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX2R1cF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM19kdXBfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNxX2R1cF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkNF9kdXBfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92OiB7CiAgICAgLy8gSGFuZGxlIDY0LWJpdCB4IDEgZWxlbWVudHMgYXMgYSBzcGVjaWFsLWNhc2UuICBUaGVyZSBpcyBubyAiZHVwIiBuZWVkZWQuCiAgICAgaWYgKFZUeS0+Z2V0RWxlbWVudFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpID09IDY0ICYmCiAgICAgICAgIFZUeS0+Z2V0TnVtRWxlbWVudHMoKSA9PSAxKSB7CiAgICAgICBzd2l0Y2ggKEJ1aWx0aW5JRCkgewotICAgICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJfZHVwX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMl9kdXBfdjoKICAgICAgICAgSW50ID0gSW50cmluc2ljOjphcm1fbmVvbl92bGQyOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQzX2R1cF92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3Y6CiAgICAgICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdmxkMzsKICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkNF9kdXBfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0X2R1cF92OgogICAgICAgICBJbnQgPSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZsZDQ7CiAgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKQEAgLTM0NDAsMTYgKzQwNTAsMTYgQEAKICAgICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKICAgICB9CiAgICAgc3dpdGNoIChCdWlsdGluSUQpIHsKLSAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMl9kdXBfdjoKLSAgICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmxkMnFfZHVwX3Y6CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJfZHVwX3Y6CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX2R1cF92OgogICAgICAgSW50ID0gSW50cmluc2ljOjphcm1fbmVvbl92bGQybGFuZTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQzX2R1cF92OgotICAgIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdjoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM19kdXBfdjoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM3FfZHVwX3Y6CiAgICAgICBJbnQgPSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZsZDNsYW5lOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3Y6Ci0gICAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92OgorICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0X2R1cF92OgorICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0cV9kdXBfdjoKICAgICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdmxkNGxhbmU7CiAgICAgICBicmVhazsKICAgICB9CkBAIC0zNDc4LDQyICs0MDg4LDExIEBACiAgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU3RvcmUoT3BzWzFdLCBPcHNbMF0pOwogICB9CiAKLSAgLy8gQ3J5cHRvCi0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWVzZXFfdjoKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl9hZXNlLCBUeSksCi0gICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJhZXNlIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWVzZHFfdjoKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl9hZXNkLCBUeSksCi0gICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJhZXNkIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWVzbWNxX3Y6Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fYWVzbWMsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgImFlc21jIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92YWVzaW1jcV92OgotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX2Flc2ltYywgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAiYWVzaW1jIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2hhMXN1MXFfdjoKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl9zaGExc3UxLCBUeSksCi0gICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJzaGExc3UxIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2hhMjU2c3UwcV92OgotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3NoYTI1NnN1MCwgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAic2hhMjU2c3UwIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2hhMXN1MHFfdjoKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl9zaGExc3UwLCBUeSksCi0gICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJzaGExc3UwIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2hhMjU2aHFfdjoKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl9zaGEyNTZoLCBUeSksCi0gICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJzaGEyNTZoIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2hhMjU2aDJxX3Y6Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fc2hhMjU2aDIsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInNoYTI1NmgyIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c2hhMjU2c3UxcV92OgotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3NoYTI1NnN1MSwgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAic2hhMjU2c3UxIik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bXVsX2xhbmVfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWxfbGFuZXFfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm11bF9sYW5lX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bXVsX2xhbmVxX3Y6IHsKICAgICAvLyB2MWY2NCB2bXVsX2xhbmUgc2hvdWxkIGJlIG1hcHBlZCB0byBOZW9uIHNjYWxhciBtdWwgbGFuZQogICAgIGJvb2wgUXVhZCA9IGZhbHNlOwotICAgIGlmIChCdWlsdGluSUQgPT0gQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bXVsX2xhbmVxX3YpCisgICAgaWYgKEJ1aWx0aW5JRCA9PSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWxfbGFuZXFfdikKICAgICAgIFF1YWQgPSB0cnVlOwogICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIERvdWJsZVR5KTsKICAgICBsbHZtOjpUeXBlICpWVHkgPSBHZXROZW9uVHlwZSh0aGlzLApAQCAtMzUyNSw3ICs0MTA0LDcgQEAKICAgfQogCiAgIC8vIEFBcmNoNjQtb25seSBidWlsdGlucwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmZtYXFfbGFuZXFfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmZtYXFfbGFuZXFfdjogewogICAgIFZhbHVlICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmZtYSwgVHkpOwogICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKICAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBUeSk7CkBAIC0zNTM0LDcgKzQxMTMsNyBAQAogICAgIE9wc1syXSA9IEVtaXROZW9uU3BsYXQoT3BzWzJdLCBjYXN0PENvbnN0YW50SW50PihPcHNbM10pKTsKICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVDYWxsMyhGLCBPcHNbMl0sIE9wc1sxXSwgT3BzWzBdKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmZtYXFfbGFuZV92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1hcV9sYW5lX3Y6IHsKICAgICBWYWx1ZSAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjpmbWEsIFR5KTsKICAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CiAgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOwpAQCAtMzU0OSw3ICs0MTI4LDcgQEAKIAogICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUNhbGwzKEYsIE9wc1syXSwgT3BzWzFdLCBPcHNbMF0pOwogICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Zm1hX2xhbmVfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmZtYV9sYW5lX3Y6IHsKICAgICBsbHZtOjpWZWN0b3JUeXBlICpWVHkgPSBjYXN0PGxsdm06OlZlY3RvclR5cGU+KFR5KTsKICAgICAvLyB2MWY2NCBmbWEgc2hvdWxkIGJlIG1hcHBlZCB0byBOZW9uIHNjYWxhciBmNjQgZm1hCiAgICAgaWYgKFZUeSAmJiBWVHktPmdldEVsZW1lbnRUeXBlKCkgPT0gRG91YmxlVHkpIHsKQEAgLTM1NzEsNyArNDE1MCw3IEBACiAgICAgT3BzWzJdID0gRW1pdE5lb25TcGxhdChPcHNbMl0sIGNhc3Q8Q29uc3RhbnRJbnQ+KE9wc1szXSkpOwogICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUNhbGwzKEYsIE9wc1syXSwgT3BzWzFdLCBPcHNbMF0pOwogICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Zm1hX2xhbmVxX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFfbGFuZXFfdjogewogICAgIGxsdm06OlZlY3RvclR5cGUgKlZUeSA9IGNhc3Q8bGx2bTo6VmVjdG9yVHlwZT4oVHkpOwogICAgIC8vIHYxZjY0IGZtYSBzaG91bGQgYmUgbWFwcGVkIHRvIE5lb24gc2NhbGFyIGY2NCBmbWEKICAgICBpZiAoVlR5ICYmIFZUeS0+Z2V0RWxlbWVudFR5cGUoKSA9PSBEb3VibGVUeSkgewpAQCAtMzU5OCw4ICs0MTc3LDggQEAKIAogICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUNhbGwzKEYsIE9wc1syXSwgT3BzWzFdLCBPcHNbMF0pOwogICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Zm1zX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Zm1zcV92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1zX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1zcV92OiB7CiAgICAgVmFsdWUgKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6Zm1hLCBUeSk7CiAgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOwogICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMV0sIFR5KTsKQEAgLTM2MTAsMzE0ICs0MTg5LDEzNiBAQAogICAgIC8vIEFBcmNoNjQgaW50cmluc2ljIGhhcyBpdCBmaXJzdC4KICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVDYWxsMyhGLCBPcHNbMV0sIE9wc1syXSwgT3BzWzBdKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdm1heG5tX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bWF4bm1xX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXhubV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1heG5tcV92OiB7CiAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdm1heG5tOwogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidm1heG5tIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW5ubV92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdm1pbm5tcV92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bWlubm1fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW5ubXFfdjogewogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZtaW5ubTsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZtaW5ubSIpOwogICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cG1heG5tX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cG1heG5tcV92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cG1heG5tX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cG1heG5tcV92OiB7CiAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fdnBtYXhubTsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZwbWF4bm0iKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnBtaW5ubV92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnBtaW5ubXFfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBtaW5ubV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBtaW5ubXFfdjogewogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZwbWlubm07CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cG1pbm5tIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWF4cV92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cG1heHFfdjogewogICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZwbWF4dSA6IEludHJpbnNpYzo6YXJtX25lb25fdnBtYXhzOwogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnBtYXgiKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnBtaW5xX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWlucV92OiB7CiAgICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtX25lb25fdnBtaW51IDogSW50cmluc2ljOjphcm1fbmVvbl92cG1pbnM7CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cG1pbiIpOwogICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cGFkZHFfdjogewotICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdnBhZGQ7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cGFkZCIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92bXVseF92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdm11bHhxX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWx4X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bXVseHFfdjogewogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZtdWx4OwogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidm11bHgiKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnBhZGRsX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cGFkZGxxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnBhZGRsX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnBhZGFsX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cGFkYWxxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnBhZGFsX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFhYnNfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWJzcV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWJzX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnFuZWdfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxbmVncV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxbmVnX3YsIEUpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFic192OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmFic3FfdjogewotICAgIGlmIChWVHktPmdldEVsZW1lbnRUeXBlKCktPmlzRmxvYXRpbmdQb2ludFR5KCkpIHsKLSAgICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmZhYnMsIFR5KSwgT3BzLCAidmFicyIpOwotICAgIH0KLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92YWJzX3YsIEUpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3FhZGRfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZzcWFkZHFfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNxYWRkX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3FhZGRxX3Y6IHsKICAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl91c3FhZGQ7CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2c3FhZGQiKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnVxYWRkX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92dXFhZGRxX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z1cWFkZF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnVxYWRkcV92OiB7CiAgICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fc3VxYWRkOwogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnVxYWRkIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHNfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHNxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmNsc192LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHpfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHpxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmNsel92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbnRfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbnRxX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmNudF92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZyYml0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cmJpdHFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZyYml0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cmJpdHFfdjoKICAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9yYml0OwogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnJiaXQiKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3Ztb3ZuX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdm1vdm5fdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cW1vdnVuX3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdnFtb3Z1bl92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZxbW92bl92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxbW92bl92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjE2X3Y6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmN2dF9mMTZfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X2YzMl9mMTY6Ci0gICAgcmV0dXJuIEVtaXRBUk1CdWlsdGluRXhwcihBUk06OkJJX19idWlsdGluX25lb25fdmN2dF9mMzJfZjE2LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjMyX2Y2NDogewotICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKLSAgICBUeSA9IEdldE5lb25UeXBlKHRoaXMsIE5lb25UeXBlRmxhZ3MoTmVvblR5cGVGbGFnczo6RmxvYXQzMiwgZmFsc2UsIGZhbHNlKSk7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X2YzMl9mNjQ6IHsKKyAgICBOZW9uVHlwZUZsYWdzIFNyY0ZsYWcgPSBOZW9uVHlwZUZsYWdzKE5lb25UeXBlRmxhZ3M6OkZsb2F0NjQsIGZhbHNlLCB0cnVlKTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBHZXROZW9uVHlwZSh0aGlzLCBTcmNGbGFnKSk7CiAgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlRlBUcnVuYyhPcHNbMF0sIFR5LCAidmN2dCIpOwogICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0eF9mMzJfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHhfZjMyX3Y6IHsKICAgICBsbHZtOjpUeXBlICpFbHRUeSA9IEZsb2F0VHk7CiAgICAgbGx2bTo6VHlwZSAqUmVzVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoRWx0VHksIDIpOwogICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgUmVzVHksIFR5IH07Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fZmN2dHhuOworICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX3ZjdnR4bjsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpLCBPcHMsICJ2Y3Z0eF9mMzJfZjY0Iik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjY0X2YzMjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF9mNjRfZjMyOiB7CiAgICAgbGx2bTo6VHlwZSAqT3BUeSA9CiAgICAgICAgIEdldE5lb25UeXBlKHRoaXMsIE5lb25UeXBlRmxhZ3MoTmVvblR5cGVGbGFnczo6RmxvYXQzMiwgZmFsc2UsIGZhbHNlKSk7CiAgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgT3BUeSk7CiAgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlRlBFeHQoT3BzWzBdLCBUeSwgInZjdnQiKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dF9mNjRfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX2Y2NF92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X2Y2NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHFfZjY0X3Y6IHsKICAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CiAgICAgVHkgPSBHZXROZW9uVHlwZSh0aGlzLCBOZW9uVHlwZUZsYWdzKE5lb25UeXBlRmxhZ3M6OkZsb2F0NjQsIGZhbHNlLCBxdWFkKSk7CiAgICAgcmV0dXJuIHVzZ24gPyBCdWlsZGVyLkNyZWF0ZVVJVG9GUChPcHNbMF0sIFR5LCAidmN2dCIpCiAgICAgICAgICAgICAgICAgOiBCdWlsZGVyLkNyZWF0ZVNJVG9GUChPcHNbMF0sIFR5LCAidmN2dCIpOwogICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cm5kbl92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJuZG5xX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRuX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kbnFfdjogewogICAgIEludCA9IEludHJpbnNpYzo6YWFyY2g2NF9uZW9uX2ZyaW50bjsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZybmRuIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRhX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cm5kYXFfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZGFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRhcV92OiB7CiAgICAgSW50ID0gSW50cmluc2ljOjpyb3VuZDsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZybmRhIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRwX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cm5kcHFfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZHBfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRwcV92OiB7CiAgICAgSW50ID0gSW50cmluc2ljOjpjZWlsOwogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnJuZHAiKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJuZG1fdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRtcV92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kbV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZG1xX3Y6IHsKICAgICBJbnQgPSBJbnRyaW5zaWM6OmZsb29yOwogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnJuZG0iKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJuZHhfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZybmR4cV92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5keF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZHhxX3Y6IHsKICAgICBJbnQgPSBJbnRyaW5zaWM6OnJpbnQ7CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cm5keCIpOwogICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cm5kX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cm5kcV92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kcV92OiB7CiAgICAgSW50ID0gSW50cmluc2ljOjp0cnVuYzsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZybmQiKTsKICAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnJuZGlfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRpcV92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kaV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZGlxX3Y6IHsKICAgICBJbnQgPSBJbnRyaW5zaWM6Om5lYXJieWludDsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZybmRpIik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfczMyX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X3UzMl92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHFfczMyX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV91MzJfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV91MzJfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X3M2NF92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dF91NjRfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX3M2NF92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHFfdTY0X3Y6IHsKLSAgICBsbHZtOjpUeXBlICpEb3VibGVUeSA9Ci0gICAgICAgIEdldE5lb25UeXBlKHRoaXMsIE5lb25UeXBlRmxhZ3MoTmVvblR5cGVGbGFnczo6RmxvYXQ2NCwgZmFsc2UsIHF1YWQpKTsKLSAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBEb3VibGVUeSk7Ci0gICAgcmV0dXJuIHVzZ24gPyBCdWlsZGVyLkNyZWF0ZUZQVG9VSShPcHNbMF0sIFR5LCAidmN2dCIpCi0gICAgICAgICAgICAgICAgOiBCdWlsZGVyLkNyZWF0ZUZQVG9TSShPcHNbMF0sIFR5LCAidmN2dCIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bl9zMzJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRucV9zMzJfdjogewotICAgIGxsdm06OlR5cGUgKk9wVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoRmxvYXRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKLSAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBPcFR5IH07Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fZmN2dG5zOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZjdnRuc19mMzIiKTsKLSAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dG5fczY0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bnFfczY0X3Y6IHsKLSAgICBsbHZtOjpUeXBlICpPcFR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KERvdWJsZVR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkpOwotICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIE9wVHkgfTsKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0bnM7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmN2dG5zX2Y2NCIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bl91MzJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRucV91MzJfdjogewotICAgIGxsdm06OlR5cGUgKk9wVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoRmxvYXRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKLSAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBPcFR5IH07Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fZmN2dG51OwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZjdnRudV9mMzIiKTsKLSAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dG5fdTY0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bnFfdTY0X3Y6IHsKLSAgICBsbHZtOjpUeXBlICpPcFR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KERvdWJsZVR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkpOwotICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIE9wVHkgfTsKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0bnU7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmN2dG51X2Y2NCIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cF9zMzJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRwcV9zMzJfdjogewotICAgIGxsdm06OlR5cGUgKk9wVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoRmxvYXRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKLSAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBPcFR5IH07Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fZmN2dHBzOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZjdnRwc19mMzIiKTsKLSAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHBfczY0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfczY0X3Y6IHsKLSAgICBsbHZtOjpUeXBlICpPcFR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KERvdWJsZVR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkpOwotICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIE9wVHkgfTsKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0cHM7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmN2dHBzX2Y2NCIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cF91MzJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRwcV91MzJfdjogewotICAgIGxsdm06OlR5cGUgKk9wVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoRmxvYXRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKLSAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBPcFR5IH07Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fZmN2dHB1OwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZjdnRwdV9mMzIiKTsKLSAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dHBfdTY0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfdTY0X3Y6IHsKLSAgICBsbHZtOjpUeXBlICpPcFR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KERvdWJsZVR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkpOwotICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIE9wVHkgfTsKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0cHU7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmN2dHB1X2Y2NCIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bV9zMzJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtcV9zMzJfdjogewotICAgIGxsdm06OlR5cGUgKk9wVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoRmxvYXRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKLSAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBPcFR5IH07Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fZmN2dG1zOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZjdnRtc19mMzIiKTsKLSAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dG1fczY0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bXFfczY0X3Y6IHsKLSAgICBsbHZtOjpUeXBlICpPcFR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KERvdWJsZVR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkpOwotICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIE9wVHkgfTsKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0bXM7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmN2dG1zX2Y2NCIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bV91MzJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtcV91MzJfdjogewotICAgIGxsdm06OlR5cGUgKk9wVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoRmxvYXRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKLSAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBPcFR5IH07Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fZmN2dG11OwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZjdnRtdV9mMzIiKTsKLSAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dG1fdTY0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bXFfdTY0X3Y6IHsKLSAgICBsbHZtOjpUeXBlICpPcFR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KERvdWJsZVR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkpOwotICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIE9wVHkgfTsKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0bXU7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmN2dG11X2Y2NCIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YV9zMzJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhcV9zMzJfdjogewotICAgIGxsdm06OlR5cGUgKk9wVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoRmxvYXRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKLSAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBPcFR5IH07Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fZmN2dGFzOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZjdnRhc19mMzIiKTsKLSAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dGFfczY0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YXFfczY0X3Y6IHsKLSAgICBsbHZtOjpUeXBlICpPcFR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KERvdWJsZVR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkpOwotICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIE9wVHkgfTsKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0YXM7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmN2dGFzX2Y2NCIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YV91MzJfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhcV91MzJfdjogewotICAgIGxsdm06OlR5cGUgKk9wVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoRmxvYXRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKLSAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBPcFR5IH07Ci0gICAgSW50ID0gSW50cmluc2ljOjphYXJjaDY0X25lb25fZmN2dGF1OwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZjdnRhdV9mMzIiKTsKLSAgfQotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmN2dGFfdTY0X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YXFfdTY0X3Y6IHsKLSAgICBsbHZtOjpUeXBlICpPcFR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KERvdWJsZVR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkpOwotICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIE9wVHkgfTsKLSAgICBJbnQgPSBJbnRyaW5zaWM6OmFhcmNoNjRfbmVvbl9mY3Z0YXU7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmN2dGF1X2Y2NCIpOwotICB9Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cmVjcGVfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZyZWNwZXFfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cmVjcGVfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cnNxcnRlX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92cnNxcnRlcV92OgotICAgIHJldHVybiBFbWl0QVJNQnVpbHRpbkV4cHIoQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3FydGVfdiwgRSk7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92c3FydF92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdnNxcnRxX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcXJ0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3FydHFfdjogewogICAgIEludCA9IEludHJpbnNpYzo6c3FydDsKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZzcXJ0Iik7CiAgIH0KLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjMyX3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9mMzJfdjoKLSAgICByZXR1cm4gRW1pdEFSTUJ1aWx0aW5FeHByKEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X2YzMl92LCBFKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXF6X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2VxenFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXF6X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2VxenFfdjoKICAgICByZXR1cm4gRW1pdEFBcmNoNjRDb21wYXJlQnVpbHRpbkV4cHIoT3BzWzBdLCBUeSwgSUNtcEluc3Q6OkZDTVBfT0VRLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6SUNNUF9FUSwgInZjZXF6Iik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2dlel92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNnZXpxX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2dlel92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNnZXpxX3Y6CiAgICAgcmV0dXJuIEVtaXRBQXJjaDY0Q29tcGFyZUJ1aWx0aW5FeHByKE9wc1swXSwgVHksIElDbXBJbnN0OjpGQ01QX09HRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OklDTVBfU0dFLCAidmNnZXoiKTsKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjbGV6X3Y6Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2xlenFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbGV6X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlenFfdjoKICAgICByZXR1cm4gRW1pdEFBcmNoNjRDb21wYXJlQnVpbHRpbkV4cHIoT3BzWzBdLCBUeSwgSUNtcEluc3Q6OkZDTVBfT0xFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6SUNNUF9TTEUsICJ2Y2xleiIpOwotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNndHpfdjoKLSAgY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ3R6cV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNndHpfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ3R6cV92OgogICAgIHJldHVybiBFbWl0QUFyY2g2NENvbXBhcmVCdWlsdGluRXhwcihPcHNbMF0sIFR5LCBJQ21wSW5zdDo6RkNNUF9PR1QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDbXBJbnN0OjpJQ01QX1NHVCwgInZjZ3R6Iik7Ci0gIGNhc2UgQUFyY2g2NDo6QklfX2J1aWx0aW5fbmVvbl92Y2x0el92OgotICBjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fdmNsdHpxX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0el92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsdHpxX3Y6CiAgICAgcmV0dXJuIEVtaXRBQXJjaDY0Q29tcGFyZUJ1aWx0aW5FeHByKE9wc1swXSwgVHksIElDbXBJbnN0OjpGQ01QX09MVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OklDTVBfU0xULCAidmNsdHoiKTsKICAgfQpAQCAtNDA3NCwyOCArNDQ3NSwyOCBAQAogICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRS0+Z2V0TnVtQXJncygpIC0gMTsgaSAhPSBlOyBpKyspIHsKICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICBzd2l0Y2ggKEJ1aWx0aW5JRCkgewotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkMV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkMXFfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2xhbmVfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfbGFuZV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkMV9kdXBfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2R1cF92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0MV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0MXFfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX2xhbmVfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfbGFuZV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0Ml92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0MnFfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0M192OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0M3FfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNfbGFuZV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0M3FfbGFuZV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0NF92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0NHFfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRfbGFuZV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0NHFfbGFuZV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxX2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxX2R1cF92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2R1cF92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxX2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QyX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MnFfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QyX2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QycV9sYW5lX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0M192OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNxX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0M19sYW5lX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0M3FfbGFuZV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3Q0cV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRfbGFuZV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRxX2xhbmVfdjoKICAgICAgICAgLy8gR2V0IHRoZSBhbGlnbm1lbnQgZm9yIHRoZSBhcmd1bWVudCBpbiBhZGRpdGlvbiB0byB0aGUgdmFsdWU7CiAgICAgICAgIC8vIHdlJ2xsIHVzZSBpdCBsYXRlci4KICAgICAgICAgc3RkOjpwYWlyPGxsdm06OlZhbHVlKiwgdW5zaWduZWQ+IFNyYyA9CkBAIC00MTA3LDIxICs0NTA4LDIxIEBACiAgICAgfQogICAgIGlmIChpID09IDEpIHsKICAgICAgIHN3aXRjaCAoQnVpbHRpbklEKSB7Ci0gICAgICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQyX3Y6Ci0gICAgICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQycV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkM192OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkM3FfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRxX3Y6Ci0gICAgICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQyX2xhbmVfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX2xhbmVfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkNF9sYW5lX3Y6Ci0gICAgICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQ0cV9sYW5lX3Y6Ci0gICAgICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQyX2R1cF92OgotICAgICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkM19kdXBfdjoKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMl92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM192OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNxX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkNF92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRxX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMl9sYW5lX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMnFfbGFuZV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNxX2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0X2xhbmVfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0cV9sYW5lX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMl9kdXBfdjoKKyAgICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQzX2R1cF92OgorICAgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3Y6CiAgICAgICAgIC8vIEdldCB0aGUgYWxpZ25tZW50IGZvciB0aGUgYXJndW1lbnQgaW4gYWRkaXRpb24gdG8gdGhlIHZhbHVlOwogICAgICAgICAvLyB3ZSdsbCB1c2UgaXQgbGF0ZXIuCiAgICAgICAgIHN0ZDo6cGFpcjxsbHZtOjpWYWx1ZSosIHVuc2lnbmVkPiBTcmMgPQpAQCAtNDEzNCwzNCArNDUzNSw1MiBAQAogICAgIE9wcy5wdXNoX2JhY2soRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKGkpKSk7CiAgIH0KIAotICAvLyB2Z2V0X2xhbmUgYW5kIHZzZXRfbGFuZSBhcmUgbm90IG92ZXJsb2FkZWQgYW5kIGRvIG5vdCBoYXZlIGFuIGV4dHJhCi0gIC8vIGFyZ3VtZW50IHRoYXQgc3BlY2lmaWVzIHRoZSB2ZWN0b3IgdHlwZS4KICAgc3dpdGNoIChCdWlsdGluSUQpIHsKICAgZGVmYXVsdDogYnJlYWs7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pODoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2kxNjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2kzMjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2k2NDoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2YzMjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pODoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pMTY6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTMyOgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2k2NDoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9mMzI6CisgIC8vIHZnZXRfbGFuZSBhbmQgdnNldF9sYW5lIGFyZSBub3Qgb3ZlcmxvYWRlZCBhbmQgZG8gbm90IGhhdmUgYW4gZXh0cmEKKyAgLy8gYXJndW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhlIHZlY3RvciB0eXBlLgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2k4OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2kxNjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfaTY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTg6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2kxNjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2YzMjoKICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChPcHNbMF0sIEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZnZXRfbGFuZSIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTg6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pMTY6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pMzI6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pNjQ6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9mMzI6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTg6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTE2OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2kzMjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnNldHFfbGFuZV9pNjQ6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfZjMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2k4OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2kxNjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTg6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2kxNjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldHFfbGFuZV9pNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2YzMjoKICAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygyKSkpOwogICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUluc2VydEVsZW1lbnQoT3BzWzFdLCBPcHNbMF0sIE9wc1syXSwgInZzZXRfbGFuZSIpOworCisgIC8vIE5vbi1wb2x5bW9ycGhpYyBjcnlwdG8gaW5zdHJ1Y3Rpb25zIGFsc28gbm90IG92ZXJsb2FkZWQKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGExaF91MzI6CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl9zaGExaCksIE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2c2hhMWgiKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGExY3FfdTMyOgorICAgIE9wcy5wdXNoX2JhY2soRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDIpKSk7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fc2hhMWMpLCBPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAidnNoYTFoIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hhMXBxX3UzMjoKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygyKSkpOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3NoYTFwKSwgT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgInZzaGExaCIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNoYTFtcV91MzI6CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMikpKTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl9zaGExbSksIE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2c2hhMWgiKTsKICAgfQogCiAgIC8vIEdldCB0aGUgbGFzdCBhcmd1bWVudCwgd2hpY2ggc3BlY2lmaWVzIHRoZSB2ZWN0b3IgdHlwZS4KQEAgLTQxOTEsNyArNDYxMCw2IEBACiAgIC8vIERldGVybWluZSB0aGUgdHlwZSBvZiB0aGlzIG92ZXJsb2FkZWQgTkVPTiBpbnRyaW5zaWMuCiAgIE5lb25UeXBlRmxhZ3MgVHlwZShSZXN1bHQuZ2V0WkV4dFZhbHVlKCkpOwogICBib29sIHVzZ24gPSBUeXBlLmlzVW5zaWduZWQoKTsKLSAgYm9vbCBxdWFkID0gVHlwZS5pc1F1YWQoKTsKICAgYm9vbCByaWdodFNoaWZ0ID0gZmFsc2U7CiAKICAgbGx2bTo6VmVjdG9yVHlwZSAqVlR5ID0gR2V0TmVvblR5cGUodGhpcywgVHlwZSk7CkBAIC00MTk5LDE1OCArNDYxNywyMCBAQAogICBpZiAoIVR5KQogICAgIHJldHVybiAwOwogCisgIC8vIE1hbnkgTkVPTiBidWlsdGlucyBoYXZlIGlkZW50aWNhbCBzZW1hbnRpY3MgYW5kIHVzZXMgaW4gQVJNIGFuZAorICAvLyBBQXJjaDY0LiBFbWl0IHRoZXNlIGluIGEgc2luZ2xlIGZ1bmN0aW9uLgorICBsbHZtOjpBcnJheVJlZjxOZW9uSW50cmluc2ljSW5mbz4gSW50cmluc2ljTWFwKEFSTVNJTURJbnRyaW5zaWNNYXApOworICBjb25zdCBOZW9uSW50cmluc2ljSW5mbyAqQnVpbHRpbiA9IGZpbmROZW9uSW50cmluc2ljSW5NYXAoCisgICAgICBJbnRyaW5zaWNNYXAsIEJ1aWx0aW5JRCwgTkVPTlNJTURJbnRyaW5zaWNzUHJvdmVuU29ydGVkKTsKKyAgaWYgKEJ1aWx0aW4pCisgICAgcmV0dXJuIEVtaXRDb21tb25OZW9uQnVpbHRpbkV4cHIoCisgICAgICAgIEJ1aWx0aW4tPkJ1aWx0aW5JRCwgQnVpbHRpbi0+TExWTUludHJpbnNpYywgQnVpbHRpbi0+QWx0TExWTUludHJpbnNpYywKKyAgICAgICAgQnVpbHRpbi0+TmFtZUhpbnQsIEJ1aWx0aW4tPlR5cGVNb2RpZmllciwgRSwgT3BzLCBBbGlnbik7CisKICAgdW5zaWduZWQgSW50OwogICBzd2l0Y2ggKEJ1aWx0aW5JRCkgewogICBkZWZhdWx0OiByZXR1cm4gMDsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmJzbF92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92YnNscV92OgotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3Zic2wsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZic2wiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmFiZF92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92YWJkcV92OgotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZhYmR1IDogSW50cmluc2ljOjphcm1fbmVvbl92YWJkczsKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZhYmQiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmFic192OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92YWJzcV92OgotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3ZhYnMsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZhYnMiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmFkZGhuX3Y6IHsKLSAgICBsbHZtOjpWZWN0b3JUeXBlICpTcmNUeSA9Ci0gICAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldEV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGUoVlR5KTsKLQotICAgIC8vICVzdW0gPSBhZGQgPDQgeCBpMzI+ICVsaHMsICVyaHMKLSAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBTcmNUeSk7Ci0gICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgU3JjVHkpOwotICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQWRkKE9wc1swXSwgT3BzWzFdLCAidmFkZGhuIik7Ci0KLSAgICAvLyAlaGlnaCA9IGxzaHIgPDQgeCBpMzI+ICVzdW0sIDxpMzIgMTYsIGkzMiAxNiwgaTMyIDE2LCBpMzIgMTY+Ci0gICAgQ29uc3RhbnQgKlNoaWZ0QW10ID0gQ29uc3RhbnRJbnQ6OmdldChTcmNUeS0+Z2V0RWxlbWVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY1R5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgLyAyKTsKLSAgICBTaGlmdEFtdCA9IENvbnN0YW50VmVjdG9yOjpnZXRTcGxhdChWVHktPmdldE51bUVsZW1lbnRzKCksIFNoaWZ0QW10KTsKLSAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUxTaHIoT3BzWzBdLCBTaGlmdEFtdCwgInZhZGRobiIpOwotCi0gICAgLy8gJXJlcyA9IHRydW5jIDw0IHggaTMyPiAlaGlnaCB0byA8NCB4IGkxNj4KLSAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVUcnVuYyhPcHNbMF0sIFZUeSwgInZhZGRobiIpOwotICB9Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWxlX3Y6Ci0gICAgc3RkOjpzd2FwKE9wc1swXSwgT3BzWzFdKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmNhZ2VfdjogewotICAgIEZ1bmN0aW9uICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3ZhY2dlZCk7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChGLCBPcHMsICJ2Y2FnZSIpOwotICB9Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWxlcV92OgotICAgIHN0ZDo6c3dhcChPcHNbMF0sIE9wc1sxXSk7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZjYWdlcV92OiB7Ci0gICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdmFjZ2VxKTsKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKEYsIE9wcywgInZjYWdlIik7Ci0gIH0KLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmNhbHRfdjoKLSAgICBzdGQ6OnN3YXAoT3BzWzBdLCBPcHNbMV0pOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y2FndF92OiB7Ci0gICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdmFjZ3RkKTsKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKEYsIE9wcywgInZjYWd0Iik7Ci0gIH0KLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmNhbHRxX3Y6Ci0gICAgc3RkOjpzd2FwKE9wc1swXSwgT3BzWzFdKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmNhZ3RxX3Y6IHsKLSAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92YWNndHEpOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoRiwgT3BzLCAidmNhZ3QiKTsKLSAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y2xzX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHNxX3Y6IHsKLSAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92Y2xzLCBUeSk7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChGLCBPcHMsICJ2Y2xzIik7Ci0gIH0KLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmNsel92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y2x6cV92OiB7Ci0gICAgLy8gR2VuZXJhdGUgdGFyZ2V0LWluZGVwZW5kZW50IGludHJpbnNpYzsgYWxzbyBuZWVkIHRvIGFkZCBzZWNvbmQgYXJndW1lbnQKLSAgICAvLyBmb3Igd2hldGhlciBvciBub3QgY2x6IG9mIHplcm8gaXMgdW5kZWZpbmVkOyBvbiBBUk0gaXQgaXNuJ3QuCi0gICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6Y3RseiwgVHkpOwotICAgIE9wcy5wdXNoX2JhY2soQnVpbGRlci5nZXRJbnQxKGdldFRhcmdldCgpLmlzQ0xaRm9yWmVyb1VuZGVmKCkpKTsKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKEYsIE9wcywgInZjbHoiKTsKLSAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y250X3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbnRxX3Y6IHsKLSAgICAvLyBnZW5lcmF0ZSB0YXJnZXQtaW5kZXBlbmRlbnQgaW50cmluc2ljCi0gICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6Y3Rwb3AsIFR5KTsKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKEYsIE9wcywgInZjdHBvcCIpOwotICB9Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjE2X3Y6IHsKLSAgICBhc3NlcnQoVHlwZS5nZXRFbHRUeXBlKCkgPT0gTmVvblR5cGVGbGFnczo6RmxvYXQxNiAmJiAhcXVhZCAmJgotICAgICAgICAgICAidW5leHBlY3RlZCB2Y3Z0X2YxNl92IGJ1aWx0aW4iKTsKLSAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92Y3Z0ZnAyaGYpOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoRiwgT3BzLCAidmN2dCIpOwotICB9Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjMyX2YxNjogewotICAgIGFzc2VydChUeXBlLmdldEVsdFR5cGUoKSA9PSBOZW9uVHlwZUZsYWdzOjpGbG9hdDE2ICYmICFxdWFkICYmCi0gICAgICAgICAgICJ1bmV4cGVjdGVkIHZjdnRfZjMyX2YxNiBidWlsdGluIik7Ci0gICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdmN2dGhmMmZwKTsKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKEYsIE9wcywgInZjdnQiKTsKLSAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X2YzMl92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9mMzJfdjoKLSAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7Ci0gICAgVHkgPSBHZXROZW9uVHlwZSh0aGlzLCBOZW9uVHlwZUZsYWdzKE5lb25UeXBlRmxhZ3M6OkZsb2F0MzIsIGZhbHNlLCBxdWFkKSk7Ci0gICAgcmV0dXJuIHVzZ24gPyBCdWlsZGVyLkNyZWF0ZVVJVG9GUChPcHNbMF0sIFR5LCAidmN2dCIpCi0gICAgICAgICAgICAgICAgOiBCdWlsZGVyLkNyZWF0ZVNJVG9GUChPcHNbMF0sIFR5LCAidmN2dCIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X3MzMl92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X3UzMl92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9zMzJfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmN2dHFfdTMyX3Y6IHsKLSAgICBsbHZtOjpUeXBlICpGbG9hdFR5ID0KLSAgICAgIEdldE5lb25UeXBlKHRoaXMsIE5lb25UeXBlRmxhZ3MoTmVvblR5cGVGbGFnczo6RmxvYXQzMiwgZmFsc2UsIHF1YWQpKTsKLSAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBGbG9hdFR5KTsKLSAgICByZXR1cm4gdXNnbiA/IEJ1aWxkZXIuQ3JlYXRlRlBUb1VJKE9wc1swXSwgVHksICJ2Y3Z0IikKLSAgICAgICAgICAgICAgICA6IEJ1aWxkZXIuQ3JlYXRlRlBUb1NJKE9wc1swXSwgVHksICJ2Y3Z0Iik7Ci0gIH0KLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmN2dF9uX2YzMl92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2YzMl92OiB7Ci0gICAgbGx2bTo6VHlwZSAqRmxvYXRUeSA9Ci0gICAgICBHZXROZW9uVHlwZSh0aGlzLCBOZW9uVHlwZUZsYWdzKE5lb25UeXBlRmxhZ3M6OkZsb2F0MzIsIGZhbHNlLCBxdWFkKSk7Ci0gICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBGbG9hdFR5LCBUeSB9OwotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZjdnRmeHUyZnAKLSAgICAgICAgICAgICAgIDogSW50cmluc2ljOjphcm1fbmVvbl92Y3Z0ZnhzMmZwOwotICAgIEZ1bmN0aW9uICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyk7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChGLCBPcHMsICJ2Y3Z0X24iKTsKLSAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X25fczMyX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl91MzJfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmN2dHFfbl9zMzJfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmN2dHFfbl91MzJfdjogewotICAgIGxsdm06OlR5cGUgKkZsb2F0VHkgPQotICAgICAgR2V0TmVvblR5cGUodGhpcywgTmVvblR5cGVGbGFncyhOZW9uVHlwZUZsYWdzOjpGbG9hdDMyLCBmYWxzZSwgcXVhZCkpOwotICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIEZsb2F0VHkgfTsKLSAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm1fbmVvbl92Y3Z0ZnAyZnh1Ci0gICAgICAgICAgICAgICA6IEludHJpbnNpYzo6YXJtX25lb25fdmN2dGZwMmZ4czsKLSAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoRiwgT3BzLCAidmN2dF9uIik7Ci0gIH0KLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmV4dF92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92ZXh0cV92OiB7Ci0gICAgaW50IENWID0gY2FzdDxDb25zdGFudEludD4oT3BzWzJdKS0+Z2V0U0V4dFZhbHVlKCk7Ci0gICAgU21hbGxWZWN0b3I8Q29uc3RhbnQqLCAxNj4gSW5kaWNlczsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlR5LT5nZXROdW1FbGVtZW50cygpOyBpICE9IGU7ICsraSkKLSAgICAgIEluZGljZXMucHVzaF9iYWNrKENvbnN0YW50SW50OjpnZXQoSW50MzJUeSwgaStDVikpOwotCi0gICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOwotICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMV0sIFR5KTsKLSAgICBWYWx1ZSAqU1YgPSBsbHZtOjpDb25zdGFudFZlY3Rvcjo6Z2V0KEluZGljZXMpOwotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVNodWZmbGVWZWN0b3IoT3BzWzBdLCBPcHNbMV0sIFNWLCAidmV4dCIpOwotICB9Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZoYWRkX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZoYWRkcV92OgotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZoYWRkdSA6IEludHJpbnNpYzo6YXJtX25lb25fdmhhZGRzOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidmhhZGQiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmhzdWJfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmhzdWJxX3Y6Ci0gICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtX25lb25fdmhzdWJ1IDogSW50cmluc2ljOjphcm1fbmVvbl92aHN1YnM7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2aHN1YiIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQxX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3Y6Ci0gICAgT3BzLnB1c2hfYmFjayhBbGlnbik7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdmxkMSwgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidmxkMSIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV9sYW5lX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV9sYW5lX3Y6CiAgICAgLy8gSGFuZGxlIDY0LWJpdCBpbnRlZ2VyIGVsZW1lbnRzIGFzIGEgc3BlY2lhbCBjYXNlLiAgVXNlIHNodWZmbGVzIG9mCiAgICAgLy8gb25lLWVsZW1lbnQgdmVjdG9ycyB0byBhdm9pZCBwb29yIGNvZGUgZm9yIGk2NCBpbiB0aGUgYmFja2VuZC4KICAgICBpZiAoVlR5LT5nZXRFbGVtZW50VHlwZSgpLT5pc0ludGVnZXJUeSg2NCkpIHsKQEAgLTQzNzEsNyArNDY1MSw3IEBACiAgICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTaHVmZmxlVmVjdG9yKE9wc1sxXSwgTGQsIFNWLCAidmxkMXFfbGFuZSIpOwogICAgIH0KICAgICAvLyBmYWxsIHRocm91Z2gKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkMV9sYW5lX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfbGFuZV92OiB7CiAgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOwogICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChWVHktPmdldEVsZW1lbnRUeXBlKCkpOwogICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKQEAgLTQzNzksOTAgKzQ2NTksMTkgQEAKICAgICBMZC0+c2V0QWxpZ25tZW50KGNhc3Q8Q29uc3RhbnRJbnQ+KEFsaWduKS0+Z2V0WkV4dFZhbHVlKCkpOwogICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUluc2VydEVsZW1lbnQoT3BzWzFdLCBMZCwgT3BzWzJdLCAidmxkMV9sYW5lIik7CiAgIH0KLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkMV9kdXBfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkMXFfZHVwX3Y6IHsKLSAgICBWYWx1ZSAqViA9IFVuZGVmVmFsdWU6OmdldChUeSk7Ci0gICAgVHkgPSBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFZUeS0+Z2V0RWxlbWVudFR5cGUoKSk7Ci0gICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOwotICAgIExvYWRJbnN0ICpMZCA9IEJ1aWxkZXIuQ3JlYXRlTG9hZChPcHNbMF0pOwotICAgIExkLT5zZXRBbGlnbm1lbnQoY2FzdDxDb25zdGFudEludD4oQWxpZ24pLT5nZXRaRXh0VmFsdWUoKSk7Ci0gICAgbGx2bTo6Q29uc3RhbnQgKkNJID0gQ29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCAwKTsKLSAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUluc2VydEVsZW1lbnQoViwgTGQsIENJKTsKLSAgICByZXR1cm4gRW1pdE5lb25TcGxhdChPcHNbMF0sIENJKTsKLSAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQyX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX3Y6IHsKLSAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92bGQyLCBUeSk7Ci0gICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVDYWxsMihGLCBPcHNbMV0sIEFsaWduLCAidmxkMiIpOwotICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSk7Ci0gICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOwotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKLSAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQzX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNxX3Y6IHsKLSAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92bGQzLCBUeSk7Ci0gICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVDYWxsMihGLCBPcHNbMV0sIEFsaWduLCAidmxkMyIpOwotICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSk7Ci0gICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOwotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKLSAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQ0X3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRxX3Y6IHsKLSAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92bGQ0LCBUeSk7Ci0gICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVDYWxsMihGLCBPcHNbMV0sIEFsaWduLCAidmxkNCIpOwotICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSk7Ci0gICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOwotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKLSAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQyX2xhbmVfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkMnFfbGFuZV92OiB7Ci0gICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdmxkMmxhbmUsIFR5KTsKLSAgICBPcHNbMl0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzJdLCBUeSk7Ci0gICAgT3BzWzNdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1szXSwgVHkpOwotICAgIE9wcy5wdXNoX2JhY2soQWxpZ24pOwotICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQ2FsbChGLCBtYWtlQXJyYXlSZWYoT3BzKS5zbGljZSgxKSwgInZsZDJfbGFuZSIpOwotICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSk7Ci0gICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOwotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKLSAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQzX2xhbmVfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92OiB7Ci0gICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdmxkM2xhbmUsIFR5KTsKLSAgICBPcHNbMl0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzJdLCBUeSk7Ci0gICAgT3BzWzNdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1szXSwgVHkpOwotICAgIE9wc1s0XSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbNF0sIFR5KTsKLSAgICBPcHMucHVzaF9iYWNrKEFsaWduKTsKLSAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUNhbGwoRiwgbWFrZUFycmF5UmVmKE9wcykuc2xpY2UoMSksICJ2bGQzX2xhbmUiKTsKLSAgICBUeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoT3BzWzFdLT5nZXRUeXBlKCkpOwotICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKLSAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTdG9yZShPcHNbMV0sIE9wc1swXSk7Ci0gIH0KLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkNF9sYW5lX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdjogewotICAgIEZ1bmN0aW9uICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3ZsZDRsYW5lLCBUeSk7Ci0gICAgT3BzWzJdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1syXSwgVHkpOwotICAgIE9wc1szXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbM10sIFR5KTsKLSAgICBPcHNbNF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzRdLCBUeSk7Ci0gICAgT3BzWzVdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1s1XSwgVHkpOwotICAgIE9wcy5wdXNoX2JhY2soQWxpZ24pOwotICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQ2FsbChGLCBtYWtlQXJyYXlSZWYoT3BzKS5zbGljZSgxKSwgInZsZDNfbGFuZSIpOwotICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSk7Ci0gICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOwotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKLSAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQyX2R1cF92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQzX2R1cF92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQ0X2R1cF92OiB7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQyX2R1cF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM19kdXBfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3Y6IHsKICAgICAvLyBIYW5kbGUgNjQtYml0IGVsZW1lbnRzIGFzIGEgc3BlY2lhbC1jYXNlLiAgVGhlcmUgaXMgbm8gImR1cCIgbmVlZGVkLgogICAgIGlmIChWVHktPmdldEVsZW1lbnRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSA9PSA2NCkgewogICAgICAgc3dpdGNoIChCdWlsdGluSUQpIHsKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJfZHVwX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMl9kdXBfdjoKICAgICAgICAgSW50ID0gSW50cmluc2ljOjphcm1fbmVvbl92bGQyOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM19kdXBfdjoKICAgICAgICAgSW50ID0gSW50cmluc2ljOjphcm1fbmVvbl92bGQzOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3Y6CisgICAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkNF9kdXBfdjoKICAgICAgICAgSW50ID0gSW50cmluc2ljOjphcm1fbmVvbl92bGQ0OwogICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoInVua25vd24gdmxkX2R1cCBpbnRyaW5zaWM/Iik7CkBAIC00NDc0LDEzICs0NjgzLDEzIEBACiAgICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTdG9yZShPcHNbMV0sIE9wc1swXSk7CiAgICAgfQogICAgIHN3aXRjaCAoQnVpbHRpbklEKSB7Ci0gICAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdmxkMl9kdXBfdjoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMl9kdXBfdjoKICAgICAgIEludCA9IEludHJpbnNpYzo6YXJtX25lb25fdmxkMmxhbmU7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bGQzX2R1cF92OgorICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQzX2R1cF92OgogICAgICAgSW50ID0gSW50cmluc2ljOjphcm1fbmVvbl92bGQzbGFuZTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3Y6CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3Y6CiAgICAgICBJbnQgPSBJbnRyaW5zaWM6OmFybV9uZW9uX3ZsZDRsYW5lOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgidW5rbm93biB2bGRfZHVwIGludHJpbnNpYz8iKTsKQEAgLTQ1MDksMjUxICs0NzE4LDU4IEBACiAgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOwogICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKICAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bWF4X3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZtYXhxX3Y6Ci0gICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtX25lb25fdm1heHUgOiBJbnRyaW5zaWM6OmFybV9uZW9uX3ZtYXhzOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidm1heCIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bWluX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZtaW5xX3Y6Ci0gICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtX25lb25fdm1pbnUgOiBJbnRyaW5zaWM6OmFybV9uZW9uX3ZtaW5zOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidm1pbiIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92bW92bF92OiB7Ci0gICAgbGx2bTo6VHlwZSAqRFR5ID1sbHZtOjpWZWN0b3JUeXBlOjpnZXRUcnVuY2F0ZWRFbGVtZW50VmVjdG9yVHlwZShWVHkpOwotICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIERUeSk7Ci0gICAgaWYgKHVzZ24pCi0gICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVaRXh0KE9wc1swXSwgVHksICJ2bW92bCIpOwotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVNFeHQoT3BzWzBdLCBUeSwgInZtb3ZsIik7Ci0gIH0KLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdm1vdm5fdjogewotICAgIGxsdm06OlR5cGUgKlFUeSA9IGxsdm06OlZlY3RvclR5cGU6OmdldEV4dGVuZGVkRWxlbWVudFZlY3RvclR5cGUoVlR5KTsKLSAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBRVHkpOwotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVRydW5jKE9wc1swXSwgVHksICJ2bW92biIpOwotICB9Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWxfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdm11bHFfdjoKLSAgICBhc3NlcnQoVHlwZS5pc1BvbHkoKSAmJiAidm11bCBidWlsdGluIG9ubHkgc3VwcG9ydGVkIGZvciBwb2x5bm9taWFsIHR5cGVzIik7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdm11bHAsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZtdWwiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdm11bGxfdjoKLSAgICAvLyBGSVhNRTogdGhlIGludGVnZXIgdm11bGwgb3BlcmF0aW9ucyBjb3VsZCBiZSBlbWl0dGVkIGluIHRlcm1zIG9mIHB1cmUKLSAgICAvLyBMTFZNIElSICgyIGV4dHMgZm9sbG93ZWQgYnkgYSBtdWwpLiBVbmZvcnR1bmF0ZWx5IExMVk0gaGFzIGEgaGFiaXQgb2YKLSAgICAvLyBob2lzdGluZyB0aGUgZXh0cyBvdXRzaWRlIGxvb3BzLiBVbnRpbCBnbG9iYWwgSVNlbCBjb21lcyBhbG9uZyB0aGF0IGNhbgotICAgIC8vIHNlZSB0aHJvdWdoIHN1Y2ggbW92ZW1lbnQgdGhpcyBsZWFkcyB0byBiYWQgQ29kZUdlbi4gU28gd2UgbmVlZCBhbgotICAgIC8vIGludHJpbnNpYyBmb3Igbm93LgotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZtdWxsdSA6IEludHJpbnNpYzo6YXJtX25lb25fdm11bGxzOwotICAgIEludCA9IFR5cGUuaXNQb2x5KCkgPyAodW5zaWduZWQpSW50cmluc2ljOjphcm1fbmVvbl92bXVsbHAgOiBJbnQ7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2bXVsbCIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92Zm1hX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFxX3Y6IHsKLSAgICBWYWx1ZSAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjpmbWEsIFR5KTsKLSAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7Ci0gICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOwotICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMl0sIFR5KTsKLQotICAgIC8vIE5FT04gaW50cmluc2ljIHB1dHMgYWNjdW11bGF0b3IgZmlyc3QsIHVubGlrZSB0aGUgTExWTSBmbWEuCi0gICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQ2FsbDMoRiwgT3BzWzFdLCBPcHNbMl0sIE9wc1swXSk7Ci0gIH0KLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnBhZGFsX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRhbHFfdjogewotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZwYWRhbHUgOiBJbnRyaW5zaWM6OmFybV9uZW9uX3ZwYWRhbHM7Ci0gICAgLy8gVGhlIHNvdXJjZSBvcGVyYW5kIHR5cGUgaGFzIHR3aWNlIGFzIG1hbnkgZWxlbWVudHMgb2YgaGFsZiB0aGUgc2l6ZS4KLSAgICB1bnNpZ25lZCBFbHRCaXRzID0gVlR5LT5nZXRFbGVtZW50VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7Ci0gICAgbGx2bTo6VHlwZSAqRWx0VHkgPQotICAgICAgbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCBFbHRCaXRzIC8gMik7Ci0gICAgbGx2bTo6VHlwZSAqTmFycm93VHkgPQotICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KEVsdFR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkgKiAyKTsKLSAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBOYXJyb3dUeSB9OwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZwYWRhbCIpOwotICB9Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRkX3Y6Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnBhZGQsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZwYWRkIik7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRkbF92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cGFkZGxxX3Y6IHsKLSAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm1fbmVvbl92cGFkZGx1IDogSW50cmluc2ljOjphcm1fbmVvbl92cGFkZGxzOwotICAgIC8vIFRoZSBzb3VyY2Ugb3BlcmFuZCB0eXBlIGhhcyB0d2ljZSBhcyBtYW55IGVsZW1lbnRzIG9mIGhhbGYgdGhlIHNpemUuCi0gICAgdW5zaWduZWQgRWx0Qml0cyA9IFZUeS0+Z2V0RWxlbWVudFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOwotICAgIGxsdm06OlR5cGUgKkVsdFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCBFbHRCaXRzIC8gMik7Ci0gICAgbGx2bTo6VHlwZSAqTmFycm93VHkgPQotICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KEVsdFR5LCBWVHktPmdldE51bUVsZW1lbnRzKCkgKiAyKTsKLSAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBOYXJyb3dUeSB9OwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZwYWRkbCIpOwotICB9Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWF4X3Y6Ci0gICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtX25lb25fdnBtYXh1IDogSW50cmluc2ljOjphcm1fbmVvbl92cG1heHM7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cG1heCIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cG1pbl92OgotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZwbWludSA6IEludHJpbnNpYzo6YXJtX25lb25fdnBtaW5zOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnBtaW4iKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFhYnNfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFhYnNxX3Y6Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnFhYnMsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZxYWJzIik7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWRkX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxYWRkcV92OgotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZxYWRkdSA6IEludHJpbnNpYzo6YXJtX25lb25fdnFhZGRzOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnFhZGQiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFkbWxhbF92OiB7Ci0gICAgU21hbGxWZWN0b3I8VmFsdWUgKiwgMj4gTXVsT3BzKE9wcy5iZWdpbigpICsgMSwgT3BzLmVuZCgpKTsKLSAgICBWYWx1ZSAqTXVsID0gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92cWRtdWxsLCBUeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWxPcHMsICJ2cWRtbGFsIik7Ci0KLSAgICBTbWFsbFZlY3RvcjxWYWx1ZSAqLCAyPiBBZGRPcHM7Ci0gICAgQWRkT3BzLnB1c2hfYmFjayhPcHNbMF0pOwotICAgIEFkZE9wcy5wdXNoX2JhY2soTXVsKTsKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92cWFkZHMsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZE9wcywgInZxZG1sYWwiKTsKLSAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cWRtbHNsX3Y6IHsKLSAgICBTbWFsbFZlY3RvcjxWYWx1ZSAqLCAyPiBNdWxPcHMoT3BzLmJlZ2luKCkgKyAxLCBPcHMuZW5kKCkpOwotICAgIFZhbHVlICpNdWwgPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3ZxZG11bGwsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bE9wcywgInZxZG1sc2wiKTsKLQotICAgIFNtYWxsVmVjdG9yPFZhbHVlICosIDI+IFN1Yk9wczsKLSAgICBTdWJPcHMucHVzaF9iYWNrKE9wc1swXSk7Ci0gICAgU3ViT3BzLnB1c2hfYmFjayhNdWwpOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc3VicywgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgU3ViT3BzLCAidnFkbWxzbCIpOwotICB9Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG11bGhfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFkbXVsaHFfdjoKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92cWRtdWxoLCBUeSksCi0gICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJ2cWRtdWxoIik7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG11bGxfdjoKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92cWRtdWxsLCBUeSksCi0gICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJ2cWRtdWxsIik7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxbW92bl92OgotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZxbW92bnUgOiBJbnRyaW5zaWM6OmFybV9uZW9uX3ZxbW92bnM7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cW1vdm4iKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFtb3Z1bl92OgotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3ZxbW92bnN1LCBUeSksCi0gICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJ2cWRtdWxsIik7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxbmVnX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxbmVncV92OgotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3ZxbmVnLCBUeSksCi0gICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJ2cW5lZyIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cXJkbXVsaF92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cXJkbXVsaHFfdjoKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92cXJkbXVsaCwgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnFyZG11bGgiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFyc2hsX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNobHFfdjoKLSAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm1fbmVvbl92cXJzaGlmdHUgOiBJbnRyaW5zaWM6OmFybV9uZW9uX3ZxcnNoaWZ0czsKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZxcnNobCIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJuX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5fbl92OgogICAgIEludCA9CiAgICAgICB1c2duID8gSW50cmluc2ljOjphcm1fbmVvbl92cXJzaGlmdG51IDogSW50cmluc2ljOjphcm1fbmVvbl92cXJzaGlmdG5zOwogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnFyc2hybl9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHRydWUpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bl9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bl9uX3Y6CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnFyc2hpZnRuc3UsIFR5KSwKICAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZxcnNocnVuX24iLCAxLCB0cnVlKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFzaGxfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFzaGxxX3Y6Ci0gICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtX25lb25fdnFzaGlmdHUgOiBJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc2hpZnRzOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnFzaGwiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFzaGxfbl92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cXNobHFfbl92OgotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3Zxc2hpZnR1IDogSW50cmluc2ljOjphcm1fbmVvbl92cXNoaWZ0czsKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZxc2hsX24iLAotICAgICAgICAgICAgICAgICAgICAgICAgMSwgZmFsc2UpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cXNobHVfbl92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cXNobHVxX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsdV9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNobHVxX25fdjoKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92cXNoaWZ0c3UsIFR5KSwKICAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZxc2hsdSIsIDEsIGZhbHNlKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFzaHJuX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hybl9uX3Y6CiAgICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtX25lb25fdnFzaGlmdG51IDogSW50cmluc2ljOjphcm1fbmVvbl92cXNoaWZ0bnM7CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cXNocm5fbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAxLCB0cnVlKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFzaHJ1bl9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNocnVuX25fdjoKICAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92cXNoaWZ0bnN1LCBUeSksCiAgICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJ2cXNocnVuX24iLCAxLCB0cnVlKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFzdWJfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnFzdWJxX3Y6Ci0gICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtX25lb25fdnFzdWJ1IDogSW50cmluc2ljOjphcm1fbmVvbl92cXN1YnM7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cXN1YiIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cmFkZGhuX3Y6Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnJhZGRobiwgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnJhZGRobiIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cmVjcGVfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnJlY3BlcV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJlY3BlX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cmVjcGVxX3Y6CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnJlY3BlLCBUeSksCiAgICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJ2cmVjcGUiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnJlY3BzX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZyZWNwc3FfdjoKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm1fbmVvbl92cmVjcHMsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZyZWNwcyIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cmhhZGRfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnJoYWRkcV92OgotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZyaGFkZHUgOiBJbnRyaW5zaWM6OmFybV9uZW9uX3ZyaGFkZHM7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cmhhZGQiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnJzaGxfdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnJzaGxxX3Y6Ci0gICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtX25lb25fdnJzaGlmdHUgOiBJbnRyaW5zaWM6OmFybV9uZW9uX3Zyc2hpZnRzOwotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnJzaGwiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnJzaHJuX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hybl9uX3Y6CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnJzaGlmdG4sIFR5KSwKICAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZyc2hybl9uIiwgMSwgdHJ1ZSk7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hyX25fdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnJzaHJxX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hyX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hycV9uX3Y6CiAgICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtX25lb25fdnJzaGlmdHUgOiBJbnRyaW5zaWM6OmFybV9uZW9uX3Zyc2hpZnRzOwogICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnJzaHJfbiIsIDEsIHRydWUpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cnNxcnRlX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3FydGVxX3Y6Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnJzcXJ0ZSwgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnJzcXJ0ZSIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cnNxcnRzX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3FydHNxX3Y6Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnJzcXJ0cywgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnJzcXJ0cyIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cnNyYV9uX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3JhcV9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNyYV9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNyYXFfbl92OgogICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKICAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBUeSk7CiAgICAgT3BzWzJdID0gRW1pdE5lb25TaGlmdFZlY3RvcihPcHNbMl0sIFR5LCB0cnVlKTsKICAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm1fbmVvbl92cnNoaWZ0dSA6IEludHJpbnNpYzo6YXJtX25lb25fdnJzaGlmdHM7CiAgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVDYWxsMihDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHNbMV0sIE9wc1syXSk7CiAgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQWRkKE9wc1swXSwgT3BzWzFdLCAidnJzcmFfbiIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92cnN1YmhuX3Y6Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnJzdWJobiwgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnJzdWJobiIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c2hsX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGxxX3Y6Ci0gICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0dSA6IEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0czsKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZzaGwiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnNobGxfbl92OgotICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybV9uZW9uX3ZzaGlmdGx1IDogSW50cmluc2ljOjphcm1fbmVvbl92c2hpZnRsczsKLSAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZzaGxsIiwgMSk7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaGxfbl92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c2hscV9uX3Y6Ci0gICAgT3BzWzFdID0gRW1pdE5lb25TaGlmdFZlY3RvcihPcHNbMV0sIFR5LCBmYWxzZSk7Ci0gICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU2hsKEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sVHkpLCBPcHNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2c2hsX24iKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnNocm5fbl92OgotICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybV9uZW9uX3ZzaGlmdG4sIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZzaHJuX24iLCAxLCB0cnVlKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnNocl9uX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaHJxX25fdjoKLSAgICByZXR1cm4gRW1pdE5lb25SU2hpZnRJbW0oT3BzWzBdLCBPcHNbMV0sIFR5LCB1c2duLCAidnNocl9uIik7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Zzcmlfbl92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3JpcV9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3JpX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmlxX25fdjoKICAgICByaWdodFNoaWZ0ID0gdHJ1ZTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnNsaV9uX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzbGlxX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzbGlfbl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNsaXFfbl92OgogICAgIE9wc1syXSA9IEVtaXROZW9uU2hpZnRWZWN0b3IoT3BzWzJdLCBUeSwgcmlnaHRTaGlmdCk7CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnNoaWZ0aW5zLCBUeSksCiAgICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJ2c2xpX24iKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnNyYV9uX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmFxX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmFfbl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNyYXFfbl92OgogICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKICAgICBPcHNbMV0gPSBFbWl0TmVvblJTaGlmdEltbShPcHNbMV0sIE9wc1syXSwgVHksIHVzZ24sICJ2c3JhX24iKTsKICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVBZGQoT3BzWzBdLCBPcHNbMV0pOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QxX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX3Y6Ci0gICAgT3BzLnB1c2hfYmFjayhBbGlnbik7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnN0MSwgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAiIik7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX2xhbmVfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX2xhbmVfdjoKICAgICAvLyBIYW5kbGUgNjQtYml0IGludGVnZXIgZWxlbWVudHMgYXMgYSBzcGVjaWFsIGNhc2UuICBVc2UgYSBzaHVmZmxlIHRvIGdldAogICAgIC8vIGEgb25lLWVsZW1lbnQgdmVjdG9yIGFuZCBhdm9pZCBwb29yIGNvZGUgZm9yIGk2NCBpbiB0aGUgYmFja2VuZC4KICAgICBpZiAoVlR5LT5nZXRFbGVtZW50VHlwZSgpLT5pc0ludGVnZXJUeSg2NCkpIHsKQEAgLTQ3NjUsNyArNDc4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzWzFdLT5nZXRUeXBlKCkpLCBPcHMpOwogICAgIH0KICAgICAvLyBmYWxsIHRocm91Z2gKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnN0MV9sYW5lX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfbGFuZV92OiB7CiAgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOwogICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoT3BzWzFdLCBPcHNbMl0pOwogICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSk7CkBAIC00Nzc0LDg5ICs0NzkwLDE5MjIgQEAKICAgICBTdC0+c2V0QWxpZ25tZW50KGNhc3Q8Q29uc3RhbnRJbnQ+KEFsaWduKS0+Z2V0WkV4dFZhbHVlKCkpOwogICAgIHJldHVybiBTdDsKICAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QyX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJxX3Y6Ci0gICAgT3BzLnB1c2hfYmFjayhBbGlnbik7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnN0MiwgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAiIik7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QycV9sYW5lX3Y6Ci0gICAgT3BzLnB1c2hfYmFjayhBbGlnbik7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnN0MmxhbmUsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgIiIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QzX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNxX3Y6Ci0gICAgT3BzLnB1c2hfYmFjayhBbGlnbik7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnN0MywgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAiIik7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNfbGFuZV92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3QzcV9sYW5lX3Y6Ci0gICAgT3BzLnB1c2hfYmFjayhBbGlnbik7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnN0M2xhbmUsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgIiIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3Q0X3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRxX3Y6Ci0gICAgT3BzLnB1c2hfYmFjayhBbGlnbik7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnN0NCwgVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAiIik7Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDRfbGFuZV92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3Y6Ci0gICAgT3BzLnB1c2hfYmFjayhBbGlnbik7Ci0gICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnN0NGxhbmUsIFR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgIiIpOwotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92c3ViaG5fdjogewotICAgIGxsdm06OlZlY3RvclR5cGUgKlNyY1R5ID0KLSAgICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0RXh0ZW5kZWRFbGVtZW50VmVjdG9yVHlwZShWVHkpOwotCi0gICAgLy8gJXN1bSA9IGFkZCA8NCB4IGkzMj4gJWxocywgJXJocwotICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFNyY1R5KTsKLSAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBTcmNUeSk7Ci0gICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVTdWIoT3BzWzBdLCBPcHNbMV0sICJ2c3ViaG4iKTsKLQotICAgIC8vICVoaWdoID0gbHNociA8NCB4IGkzMj4gJXN1bSwgPGkzMiAxNiwgaTMyIDE2LCBpMzIgMTYsIGkzMiAxNj4KLSAgICBDb25zdGFudCAqU2hpZnRBbXQgPSBDb25zdGFudEludDo6Z2V0KFNyY1R5LT5nZXRFbGVtZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjVHktPmdldFNjYWxhclNpemVJbkJpdHMoKSAvIDIpOwotICAgIFNoaWZ0QW10ID0gQ29uc3RhbnRWZWN0b3I6OmdldFNwbGF0KFZUeS0+Z2V0TnVtRWxlbWVudHMoKSwgU2hpZnRBbXQpOwotICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlTFNocihPcHNbMF0sIFNoaWZ0QW10LCAidnN1YmhuIik7Ci0KLSAgICAvLyAlcmVzID0gdHJ1bmMgPDQgeCBpMzI+ICVoaWdoIHRvIDw0IHggaTE2PgotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVRydW5jKE9wc1swXSwgVlR5LCAidnN1YmhuIik7Ci0gIH0KLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnRibDFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YmwxX3Y6CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnRibDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnRibDEiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnRibDJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YmwyX3Y6CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnRibDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnRibDIiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnRibDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YmwzX3Y6CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnRibDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnRibDMiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnRibDRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0Ymw0X3Y6CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnRibDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnRibDQiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnRieDFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YngxX3Y6CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnRieDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnRieDEiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnRieDJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YngyX3Y6CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnRieDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnRieDIiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnRieDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YngzX3Y6CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnRieDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnRieDMiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnRieDRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0Yng0X3Y6CiAgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtX25lb25fdnRieDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnRieDQiKTsKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnRzdF92OgotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92dHN0cV92OiB7CisgIH0KK30KKworc3RhdGljIFZhbHVlICpFbWl0QVJNNjRUYmxCdWlsdGluRXhwcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwgdW5zaWduZWQgQnVpbHRpbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFZhbHVlICo+ICZPcHMpIHsKKyAgdW5zaWduZWQgaW50IEludCA9IDA7CisgIGNvbnN0IGNoYXIgKnMgPSBOVUxMOworCisgIHVuc2lnbmVkIFRibFBvczsKKyAgc3dpdGNoIChCdWlsdGluSUQpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YmwxX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsMXFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YmwyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsMnFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YmwzX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsM3FfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0Ymw0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsNHFfdjoKKyAgICBUYmxQb3MgPSAwOworICAgIGJyZWFrOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4MV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngxcV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4Ml92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngycV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4M192OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngzcV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0Yng0cV92OgorICAgIFRibFBvcyA9IDE7CisgICAgYnJlYWs7CisgIH0KKworICBhc3NlcnQoRS0+Z2V0TnVtQXJncygpID49IDMpOworCisgIC8vIEdldCB0aGUgbGFzdCBhcmd1bWVudCwgd2hpY2ggc3BlY2lmaWVzIHRoZSB2ZWN0b3IgdHlwZS4KKyAgbGx2bTo6QVBTSW50IFJlc3VsdDsKKyAgY29uc3QgRXhwciAqQXJnID0gRS0+Z2V0QXJnKEUtPmdldE51bUFyZ3MoKSAtIDEpOworICBpZiAoIUFyZy0+aXNJbnRlZ2VyQ29uc3RhbnRFeHByKFJlc3VsdCwgQ0dGLmdldENvbnRleHQoKSkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoaXMgb3ZlcmxvYWRlZCBORU9OIGludHJpbnNpYy4KKyAgTmVvblR5cGVGbGFncyBUeXBlKFJlc3VsdC5nZXRaRXh0VmFsdWUoKSk7CisgIGxsdm06OlZlY3RvclR5cGUgKlZUeSA9IEdldE5lb25UeXBlKCZDR0YsIFR5cGUpOworICBsbHZtOjpUeXBlICpUeSA9IFZUeTsKKyAgaWYgKCFUeSkKKyAgICByZXR1cm4gMDsKKworICBBcmcgPSBFLT5nZXRBcmcoVGJsUG9zKTsKKyAgdW5zaWduZWQgbkVsdHMgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7CisKKyAgQ29kZUdlbjo6Q0dCdWlsZGVyVHkgJkJ1aWxkZXIgPSBDR0YuQnVpbGRlcjsKKworICAvLyBBQXJjaDY0IHNjYWxhciBidWlsdGlucyBhcmUgbm90IG92ZXJsb2FkZWQsIHRoZXkgZG8gbm90IGhhdmUgYW4gZXh0cmEKKyAgLy8gYXJndW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhlIHZlY3RvciB0eXBlLCBuZWVkIHRvIGhhbmRsZSBlYWNoIGNhc2UuCisgIFNtYWxsVmVjdG9yPFZhbHVlICosIDI+IFRibE9wczsKKyAgc3dpdGNoIChCdWlsdGluSUQpIHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YmwxX3Y6IHsKKyAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1swXSk7CisgICAgcmV0dXJuIHBhY2tUQkxEVmVjdG9yTGlzdChDR0YsIFRibE9wcywgMCwgT3BzWzFdLCBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzo6YXJtNjRfbmVvbl90YmwxLCAidnRibDEiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRibDJfdjogeworICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzBdKTsKKyAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1sxXSk7CisgICAgcmV0dXJuIHBhY2tUQkxEVmVjdG9yTGlzdChDR0YsIFRibE9wcywgMCwgT3BzWzJdLCBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzo6YXJtNjRfbmVvbl90YmwxLCAidnRibDEiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRibDNfdjogeworICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzBdKTsKKyAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1sxXSk7CisgICAgVGJsT3BzLnB1c2hfYmFjayhPcHNbMl0pOworICAgIHJldHVybiBwYWNrVEJMRFZlY3Rvckxpc3QoQ0dGLCBUYmxPcHMsIDAsIE9wc1szXSwgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM6OmFybTY0X25lb25fdGJsMiwgInZ0YmwyIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0Ymw0X3Y6IHsKKyAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1swXSk7CisgICAgVGJsT3BzLnB1c2hfYmFjayhPcHNbMV0pOworICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzJdKTsKKyAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1szXSk7CisgICAgcmV0dXJuIHBhY2tUQkxEVmVjdG9yTGlzdChDR0YsIFRibE9wcywgMCwgT3BzWzRdLCBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzo6YXJtNjRfbmVvbl90YmwyLCAidnRibDIiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDFfdjogeworICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzFdKTsKKyAgICBWYWx1ZSAqVGJsUmVzID0gcGFja1RCTERWZWN0b3JMaXN0KENHRiwgVGJsT3BzLCAwLCBPcHNbMl0sIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljOjphcm02NF9uZW9uX3RibDEsICJ2dGJsMSIpOworCisgICAgbGx2bTo6Q29uc3RhbnQgKkVpZ2h0ID0gQ29uc3RhbnRJbnQ6OmdldChWVHktPmdldEVsZW1lbnRUeXBlKCksIDgpOworICAgIFZhbHVlKiBFaWdodFYgPSBsbHZtOjpDb25zdGFudFZlY3Rvcjo6Z2V0U3BsYXQobkVsdHMsIEVpZ2h0KTsKKyAgICBWYWx1ZSAqQ21wUmVzID0gQnVpbGRlci5DcmVhdGVJQ21wKElDbXBJbnN0OjpJQ01QX1VHRSwgT3BzWzJdLCBFaWdodFYpOworICAgIENtcFJlcyA9IEJ1aWxkZXIuQ3JlYXRlU0V4dChDbXBSZXMsIFR5KTsKKworICAgIFZhbHVlICpFbHRzRnJvbUlucHV0ID0gQnVpbGRlci5DcmVhdGVBbmQoQ21wUmVzLCBPcHNbMF0pOworICAgIFZhbHVlICpFbHRzRnJvbVRibCA9IEJ1aWxkZXIuQ3JlYXRlQW5kKEJ1aWxkZXIuQ3JlYXRlTm90KENtcFJlcyksIFRibFJlcyk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlT3IoRWx0c0Zyb21JbnB1dCwgRWx0c0Zyb21UYmwsICJ2dGJ4Iik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z0YngyX3Y6IHsKKyAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1sxXSk7CisgICAgVGJsT3BzLnB1c2hfYmFjayhPcHNbMl0pOworICAgIHJldHVybiBwYWNrVEJMRFZlY3Rvckxpc3QoQ0dGLCBUYmxPcHMsIE9wc1swXSwgT3BzWzNdLCBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzo6YXJtNjRfbmVvbl90YngxLCAidnRieDEiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRieDNfdjogeworICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzFdKTsKKyAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1syXSk7CisgICAgVGJsT3BzLnB1c2hfYmFjayhPcHNbM10pOworICAgIFZhbHVlICpUYmxSZXMgPSBwYWNrVEJMRFZlY3Rvckxpc3QoQ0dGLCBUYmxPcHMsIDAsIE9wc1s0XSwgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM6OmFybTY0X25lb25fdGJsMiwgInZ0YmwyIik7CisKKyAgICBsbHZtOjpDb25zdGFudCAqVHdlbnR5Rm91ciA9IENvbnN0YW50SW50OjpnZXQoVlR5LT5nZXRFbGVtZW50VHlwZSgpLCAyNCk7CisgICAgVmFsdWUqIFR3ZW50eUZvdXJWID0gbGx2bTo6Q29uc3RhbnRWZWN0b3I6OmdldFNwbGF0KG5FbHRzLCBUd2VudHlGb3VyKTsKKyAgICBWYWx1ZSAqQ21wUmVzID0gQnVpbGRlci5DcmVhdGVJQ21wKElDbXBJbnN0OjpJQ01QX1VHRSwgT3BzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3ZW50eUZvdXJWKTsKKyAgICBDbXBSZXMgPSBCdWlsZGVyLkNyZWF0ZVNFeHQoQ21wUmVzLCBUeSk7CisKKyAgICBWYWx1ZSAqRWx0c0Zyb21JbnB1dCA9IEJ1aWxkZXIuQ3JlYXRlQW5kKENtcFJlcywgT3BzWzBdKTsKKyAgICBWYWx1ZSAqRWx0c0Zyb21UYmwgPSBCdWlsZGVyLkNyZWF0ZUFuZChCdWlsZGVyLkNyZWF0ZU5vdChDbXBSZXMpLCBUYmxSZXMpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZU9yKEVsdHNGcm9tSW5wdXQsIEVsdHNGcm9tVGJsLCAidnRieCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dGJ4NF92OiB7CisgICAgVGJsT3BzLnB1c2hfYmFjayhPcHNbMV0pOworICAgIFRibE9wcy5wdXNoX2JhY2soT3BzWzJdKTsKKyAgICBUYmxPcHMucHVzaF9iYWNrKE9wc1szXSk7CisgICAgVGJsT3BzLnB1c2hfYmFjayhPcHNbNF0pOworICAgIHJldHVybiBwYWNrVEJMRFZlY3Rvckxpc3QoQ0dGLCBUYmxPcHMsIE9wc1swXSwgT3BzWzVdLCBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzo6YXJtNjRfbmVvbl90YngyLCAidnRieDIiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YmwxX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDFxX3Y6CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3RibDE7IHMgPSAidnRibDEiOyBicmVhazsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YmwycV92OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3RibDI7IHMgPSAidnRibDIiOyBicmVhazsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsM192OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YmwzcV92OgorICAgIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl90YmwzOyBzID0gInZ0YmwzIjsgYnJlYWs7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsNHFfdjoKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fdGJsNDsgcyA9ICJ2dGJsNCI7IGJyZWFrOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngxX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRieDFxX3Y6CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3RieDE7IHMgPSAidnRieDEiOyBicmVhazsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4Ml92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngycV92OgorICAgIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl90YngyOyBzID0gInZ0YngyIjsgYnJlYWs7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRieDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4M3FfdjoKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fdGJ4MzsgcyA9ICJ2dGJ4MyI7IGJyZWFrOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0Yng0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRieDRxX3Y6CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3RieDQ7IHMgPSAidnRieDQiOyBicmVhazsKKyAgfQorICB9CisKKyAgaWYgKCFJbnQpCisgICAgcmV0dXJuIDA7CisKKyAgRnVuY3Rpb24gKkYgPSBDR0YuQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KTsKKyAgcmV0dXJuIENHRi5FbWl0TmVvbkNhbGwoRiwgT3BzLCBzKTsKK30KKworVmFsdWUgKkNvZGVHZW5GdW5jdGlvbjo6dmVjdG9yV3JhcFNjYWxhcjE2KFZhbHVlICpPcCkgeworICBsbHZtOjpUeXBlICpWVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoSW50MTZUeSwgNCk7CisgIE9wID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wLCBJbnQxNlR5KTsKKyAgVmFsdWUgKlYgPSBVbmRlZlZhbHVlOjpnZXQoVlR5KTsKKyAgbGx2bTo6Q29uc3RhbnQgKkNJID0gQ29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCAwKTsKKyAgT3AgPSBCdWlsZGVyLkNyZWF0ZUluc2VydEVsZW1lbnQoViwgT3AsIENJKTsKKyAgcmV0dXJuIE9wOworfQorCitWYWx1ZSAqQ29kZUdlbkZ1bmN0aW9uOjp2ZWN0b3JXcmFwU2NhbGFyOChWYWx1ZSAqT3ApIHsKKyAgbGx2bTo6VHlwZSAqVlR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KEludDhUeSwgOCk7CisgIE9wID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wLCBJbnQ4VHkpOworICBWYWx1ZSAqViA9IFVuZGVmVmFsdWU6OmdldChWVHkpOworICBsbHZtOjpDb25zdGFudCAqQ0kgPSBDb25zdGFudEludDo6Z2V0KEludDMyVHksIDApOworICBPcCA9IEJ1aWxkZXIuQ3JlYXRlSW5zZXJ0RWxlbWVudChWLCBPcCwgQ0kpOworICByZXR1cm4gT3A7Cit9CisKK1ZhbHVlICpDb2RlR2VuRnVuY3Rpb246OgorZW1pdFZlY3RvcldyYXBwZWRTY2FsYXI4SW50cmluc2ljKHVuc2lnbmVkIEludCwgU21hbGxWZWN0b3JJbXBsPFZhbHVlKj4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lKSB7CisgIC8vIGk4IGlzIG5vdCBhIGxlZ2FsIHR5cGVzIGZvciBBUk02NCwgc28gd2UgY2FuJ3QganVzdCB1c2UKKyAgLy8gYSBub3JtYWwgb3ZlcmxvYWVkIGludHJpbnNpYyBjYWxsIGZvciB0aGVzZSBzY2FsYXIgdHlwZXMuIEluc3RlYWQKKyAgLy8gd2UnbGwgYnVpbGQgNjQtYml0IHZlY3RvcnMgdy8gbGFuZSB6ZXJvIGJlaW5nIG91ciBpbnB1dCB2YWx1ZXMgYW5kCisgIC8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBvbiB0aGF0LiBUaGUgYmFjayBlbmQgY2FuIHBhdHRlcm4gbWF0Y2ggZGlyZWN0bHkKKyAgLy8gdG8gdGhlIHNjYWxhciBpbnN0cnVjdGlvbi4KKyAgT3BzWzBdID0gdmVjdG9yV3JhcFNjYWxhcjgoT3BzWzBdKTsKKyAgT3BzWzFdID0gdmVjdG9yV3JhcFNjYWxhcjgoT3BzWzFdKTsKKyAgbGx2bTo6VHlwZSAqVlR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KEludDhUeSwgOCk7CisgIFZhbHVlICpWID0gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBWVHkpLCBPcHMsIE5hbWUpOworICBDb25zdGFudCAqQ0kgPSBDb25zdGFudEludDo6Z2V0KEludDMyVHksIDApOworICByZXR1cm4gQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChWLCBDSSwgImxhbmUwIik7Cit9CisKK1ZhbHVlICpDb2RlR2VuRnVuY3Rpb246OgorZW1pdFZlY3RvcldyYXBwZWRTY2FsYXIxNkludHJpbnNpYyh1bnNpZ25lZCBJbnQsIFNtYWxsVmVjdG9ySW1wbDxWYWx1ZSo+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWUpIHsKKyAgLy8gaTE2IGlzIG5vdCBhIGxlZ2FsIHR5cGVzIGZvciBBUk02NCwgc28gd2UgY2FuJ3QganVzdCB1c2UKKyAgLy8gYSBub3JtYWwgb3ZlcmxvYWVkIGludHJpbnNpYyBjYWxsIGZvciB0aGVzZSBzY2FsYXIgdHlwZXMuIEluc3RlYWQKKyAgLy8gd2UnbGwgYnVpbGQgNjQtYml0IHZlY3RvcnMgdy8gbGFuZSB6ZXJvIGJlaW5nIG91ciBpbnB1dCB2YWx1ZXMgYW5kCisgIC8vIHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBvbiB0aGF0LiBUaGUgYmFjayBlbmQgY2FuIHBhdHRlcm4gbWF0Y2ggZGlyZWN0bHkKKyAgLy8gdG8gdGhlIHNjYWxhciBpbnN0cnVjdGlvbi4KKyAgT3BzWzBdID0gdmVjdG9yV3JhcFNjYWxhcjE2KE9wc1swXSk7CisgIE9wc1sxXSA9IHZlY3RvcldyYXBTY2FsYXIxNihPcHNbMV0pOworICBsbHZtOjpUeXBlICpWVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoSW50MTZUeSwgNCk7CisgIFZhbHVlICpWID0gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBWVHkpLCBPcHMsIE5hbWUpOworICBDb25zdGFudCAqQ0kgPSBDb25zdGFudEludDo6Z2V0KEludDMyVHksIDApOworICByZXR1cm4gQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChWLCBDSSwgImxhbmUwIik7Cit9CisKK1ZhbHVlICpDb2RlR2VuRnVuY3Rpb246OkVtaXRBUk02NEJ1aWx0aW5FeHByKHVuc2lnbmVkIEJ1aWx0aW5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFeHByICpFKSB7CisgIGlmIChCdWlsdGluSUQgPT0gQVJNNjQ6OkJJX19jbGVhcl9jYWNoZSkgeworICAgIGFzc2VydChFLT5nZXROdW1BcmdzKCkgPT0gMiAmJiAiX19jbGVhcl9jYWNoZSB0YWtlcyAyIGFyZ3VtZW50cyIpOworICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBFLT5nZXREaXJlY3RDYWxsZWUoKTsKKyAgICBTbWFsbFZlY3RvcjxWYWx1ZSosIDI+IE9wczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoaSkpKTsKKyAgICBsbHZtOjpUeXBlICpUeSA9IENHTS5nZXRUeXBlcygpLkNvbnZlcnRUeXBlKEZELT5nZXRUeXBlKCkpOworICAgIGxsdm06OkZ1bmN0aW9uVHlwZSAqRlR5ID0gY2FzdDxsbHZtOjpGdW5jdGlvblR5cGU+KFR5KTsKKyAgICBTdHJpbmdSZWYgTmFtZSA9IEZELT5nZXROYW1lKCk7CisgICAgcmV0dXJuIEVtaXROb3Vud2luZFJ1bnRpbWVDYWxsKENHTS5DcmVhdGVSdW50aW1lRnVuY3Rpb24oRlR5LCBOYW1lKSwgT3BzKTsKKyAgfQorCisgIGlmIChCdWlsdGluSUQgPT0gQVJNNjQ6OkJJX19idWlsdGluX2FybV9sZHJleCAmJgorICAgICAgZ2V0Q29udGV4dCgpLmdldFR5cGVTaXplKEUtPmdldFR5cGUoKSkgPT0gMTI4KSB7CisgICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtNjRfbGR4cCk7CisKKyAgICBWYWx1ZSAqTGRQdHIgPSBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpOworICAgIFZhbHVlICpWYWwgPSBCdWlsZGVyLkNyZWF0ZUNhbGwoRiwgQnVpbGRlci5DcmVhdGVCaXRDYXN0KExkUHRyLCBJbnQ4UHRyVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxkeHAiKTsKKworICAgIFZhbHVlICpWYWwwID0gQnVpbGRlci5DcmVhdGVFeHRyYWN0VmFsdWUoVmFsLCAxKTsKKyAgICBWYWx1ZSAqVmFsMSA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdFZhbHVlKFZhbCwgMCk7CisgICAgbGx2bTo6VHlwZSAqSW50MTI4VHkgPSBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDEyOCk7CisgICAgVmFsMCA9IEJ1aWxkZXIuQ3JlYXRlWkV4dChWYWwwLCBJbnQxMjhUeSk7CisgICAgVmFsMSA9IEJ1aWxkZXIuQ3JlYXRlWkV4dChWYWwxLCBJbnQxMjhUeSk7CisKKyAgICBWYWx1ZSAqU2hpZnRDc3QgPSBsbHZtOjpDb25zdGFudEludDo6Z2V0KEludDEyOFR5LCA2NCk7CisgICAgVmFsID0gQnVpbGRlci5DcmVhdGVTaGwoVmFsMCwgU2hpZnRDc3QsICJzaGwiLCB0cnVlIC8qIG51dyAqLyk7CisgICAgVmFsID0gQnVpbGRlci5DcmVhdGVPcihWYWwsIFZhbDEpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoVmFsLCBDb252ZXJ0VHlwZShFLT5nZXRUeXBlKCkpKTsKKyAgfSBlbHNlIGlmIChCdWlsdGluSUQgPT0gQVJNNjQ6OkJJX19idWlsdGluX2FybV9sZHJleCkgeworICAgIFZhbHVlICpMb2FkQWRkciA9IEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSk7CisKKyAgICBRdWFsVHlwZSBUeSA9IEUtPmdldFR5cGUoKTsKKyAgICBsbHZtOjpUeXBlICpSZWFsUmVzVHkgPSBDb252ZXJ0VHlwZShUeSk7CisgICAgbGx2bTo6VHlwZSAqSW50UmVzVHkgPSBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRUeXBlU2l6ZShUeSkpOworICAgIExvYWRBZGRyID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KExvYWRBZGRyLCBJbnRSZXNUeS0+Z2V0UG9pbnRlclRvKCkpOworCisgICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtNjRfbGR4ciwgTG9hZEFkZHItPmdldFR5cGUoKSk7CisgICAgVmFsdWUgKlZhbCA9IEJ1aWxkZXIuQ3JlYXRlQ2FsbChGLCBMb2FkQWRkciwgImxkeHIiKTsKKworICAgIGlmIChSZWFsUmVzVHktPmlzUG9pbnRlclR5KCkpCisgICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVJbnRUb1B0cihWYWwsIFJlYWxSZXNUeSk7CisKKyAgICBWYWwgPSBCdWlsZGVyLkNyZWF0ZVRydW5jT3JCaXRDYXN0KFZhbCwgSW50UmVzVHkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoVmFsLCBSZWFsUmVzVHkpOworICB9CisKKyAgaWYgKEJ1aWx0aW5JRCA9PSBBUk02NDo6QklfX2J1aWx0aW5fYXJtX3N0cmV4ICYmCisgICAgICBnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemUoRS0+Z2V0QXJnKDApLT5nZXRUeXBlKCkpID09IDEyOCkgeworICAgIEZ1bmN0aW9uICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X3N0eHApOworICAgIGxsdm06OlR5cGUgKlNUeSA9IGxsdm06OlN0cnVjdFR5cGU6OmdldChJbnQ2NFR5LCBJbnQ2NFR5LCBOVUxMKTsKKworICAgIFZhbHVlICpPbmUgPSBsbHZtOjpDb25zdGFudEludDo6Z2V0KEludDMyVHksIDEpOworICAgIFZhbHVlICpUbXAgPSBCdWlsZGVyLkNyZWF0ZUFsbG9jYShDb252ZXJ0VHlwZShFLT5nZXRBcmcoMCktPmdldFR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uZSk7CisgICAgVmFsdWUgKlZhbCA9IEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSk7CisgICAgQnVpbGRlci5DcmVhdGVTdG9yZShWYWwsIFRtcCk7CisKKyAgICBWYWx1ZSAqTGRQdHIgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoVG1wLGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoU1R5KSk7CisgICAgVmFsID0gQnVpbGRlci5DcmVhdGVMb2FkKExkUHRyKTsKKworICAgIFZhbHVlICpBcmcwID0gQnVpbGRlci5DcmVhdGVFeHRyYWN0VmFsdWUoVmFsLCAwKTsKKyAgICBWYWx1ZSAqQXJnMSA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdFZhbHVlKFZhbCwgMSk7CisgICAgVmFsdWUgKlN0UHRyID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludDhQdHJUeSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQ2FsbDMoRiwgQXJnMCwgQXJnMSwgU3RQdHIsICJzdHhwIik7CisgIH0gZWxzZSBpZiAoQnVpbHRpbklEID09IEFSTTY0OjpCSV9fYnVpbHRpbl9hcm1fc3RyZXgpIHsKKyAgICBWYWx1ZSAqU3RvcmVWYWwgPSBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpOworICAgIFZhbHVlICpTdG9yZUFkZHIgPSBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMSkpOworCisgICAgUXVhbFR5cGUgVHkgPSBFLT5nZXRBcmcoMCktPmdldFR5cGUoKTsKKyAgICBsbHZtOjpUeXBlICpTdG9yZVR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRUeXBlU2l6ZShUeSkpOworICAgIFN0b3JlQWRkciA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChTdG9yZUFkZHIsIFN0b3JlVHktPmdldFBvaW50ZXJUbygpKTsKKworICAgIGlmIChTdG9yZVZhbC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKQorICAgICAgU3RvcmVWYWwgPSBCdWlsZGVyLkNyZWF0ZVB0clRvSW50KFN0b3JlVmFsLCBJbnQ2NFR5KTsKKyAgICBlbHNlIHsKKyAgICAgIFN0b3JlVmFsID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KFN0b3JlVmFsLCBTdG9yZVR5KTsKKyAgICAgIFN0b3JlVmFsID0gQnVpbGRlci5DcmVhdGVaRXh0T3JCaXRDYXN0KFN0b3JlVmFsLCBJbnQ2NFR5KTsKKyAgICB9CisKKyAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9zdHhyLCBTdG9yZUFkZHItPmdldFR5cGUoKSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQ2FsbDIoRiwgU3RvcmVWYWwsIFN0b3JlQWRkciwgInN0eHIiKTsKKyAgfQorCisgIGlmIChCdWlsdGluSUQgPT0gQVJNNjQ6OkJJX19idWlsdGluX2FybV9jbHJleCkgeworICAgIEZ1bmN0aW9uICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X2NscmV4KTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVDYWxsKEYpOworICB9CisKKyAgLy8gQ1JDMzIKKyAgSW50cmluc2ljOjpJRCBDUkNJbnRyaW5zaWNJRCA9IEludHJpbnNpYzo6bm90X2ludHJpbnNpYzsKKyAgc3dpdGNoIChCdWlsdGluSUQpIHsKKyAgY2FzZSBBUk02NDo6QklfX2J1aWx0aW5fYXJtX2NyYzMyYjoKKyAgICBDUkNJbnRyaW5zaWNJRCA9IEludHJpbnNpYzo6YXJtNjRfY3JjMzJiOyBicmVhazsKKyAgY2FzZSBBUk02NDo6QklfX2J1aWx0aW5fYXJtX2NyYzMyY2I6CisgICAgQ1JDSW50cmluc2ljSUQgPSBJbnRyaW5zaWM6OmFybTY0X2NyYzMyY2I7IGJyZWFrOworICBjYXNlIEFSTTY0OjpCSV9fYnVpbHRpbl9hcm1fY3JjMzJoOgorICAgIENSQ0ludHJpbnNpY0lEID0gSW50cmluc2ljOjphcm02NF9jcmMzMmg7IGJyZWFrOworICBjYXNlIEFSTTY0OjpCSV9fYnVpbHRpbl9hcm1fY3JjMzJjaDoKKyAgICBDUkNJbnRyaW5zaWNJRCA9IEludHJpbnNpYzo6YXJtNjRfY3JjMzJjaDsgYnJlYWs7CisgIGNhc2UgQVJNNjQ6OkJJX19idWlsdGluX2FybV9jcmMzMnc6CisgICAgQ1JDSW50cmluc2ljSUQgPSBJbnRyaW5zaWM6OmFybTY0X2NyYzMydzsgYnJlYWs7CisgIGNhc2UgQVJNNjQ6OkJJX19idWlsdGluX2FybV9jcmMzMmN3OgorICAgIENSQ0ludHJpbnNpY0lEID0gSW50cmluc2ljOjphcm02NF9jcmMzMmN3OyBicmVhazsKKyAgY2FzZSBBUk02NDo6QklfX2J1aWx0aW5fYXJtX2NyYzMyZDoKKyAgICBDUkNJbnRyaW5zaWNJRCA9IEludHJpbnNpYzo6YXJtNjRfY3JjMzJ4OyBicmVhazsKKyAgY2FzZSBBUk02NDo6QklfX2J1aWx0aW5fYXJtX2NyYzMyY2Q6CisgICAgQ1JDSW50cmluc2ljSUQgPSBJbnRyaW5zaWM6OmFybTY0X2NyYzMyY3g7IGJyZWFrOworICB9CisKKyAgaWYgKENSQ0ludHJpbnNpY0lEICE9IEludHJpbnNpYzo6bm90X2ludHJpbnNpYykgeworICAgIFZhbHVlICpBcmcwID0gRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDApKTsKKyAgICBWYWx1ZSAqQXJnMSA9IEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSk7CisgICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKENSQ0ludHJpbnNpY0lEKTsKKworICAgIGxsdm06OlR5cGUgKkRhdGFUeSA9IEYtPmdldEZ1bmN0aW9uVHlwZSgpLT5nZXRQYXJhbVR5cGUoMSk7CisgICAgQXJnMSA9IEJ1aWxkZXIuQ3JlYXRlWkV4dE9yQml0Q2FzdChBcmcxLCBEYXRhVHkpOworCisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQ2FsbDIoRiwgQXJnMCwgQXJnMSk7CisgIH0KKworICBsbHZtOjpTbWFsbFZlY3RvcjxWYWx1ZSosIDQ+IE9wczsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEUtPmdldE51bUFyZ3MoKSAtIDE7IGkgIT0gZTsgaSsrKQorICAgIE9wcy5wdXNoX2JhY2soRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKGkpKSk7CisKKyAgbGx2bTo6QXJyYXlSZWY8TmVvbkludHJpbnNpY0luZm8+IFNJU0RNYXAoQVJNNjRTSVNESW50cmluc2ljTWFwKTsKKyAgY29uc3QgTmVvbkludHJpbnNpY0luZm8gKkJ1aWx0aW4gPSBmaW5kTmVvbkludHJpbnNpY0luTWFwKAorICAgICAgU0lTRE1hcCwgQnVpbHRpbklELCBBUk02NFNJU0RJbnRyaW5zaWNzUHJvdmVuU29ydGVkKTsKKworICBpZiAoQnVpbHRpbikgeworICAgIE9wcy5wdXNoX2JhY2soRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKEUtPmdldE51bUFyZ3MoKSAtIDEpKSk7CisgICAgVmFsdWUgKlJlc3VsdCA9IEVtaXRDb21tb25OZW9uU0lTREJ1aWx0aW5FeHByKCp0aGlzLCAqQnVpbHRpbiwgT3BzLCBFKTsKKyAgICBhc3NlcnQoUmVzdWx0ICYmICJTSVNEIGludHJpbnNpYyBzaG91bGQgaGF2ZSBiZWVuIGhhbmRsZWQiKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgbGx2bTo6QVBTSW50IFJlc3VsdDsKKyAgY29uc3QgRXhwciAqQXJnID0gRS0+Z2V0QXJnKEUtPmdldE51bUFyZ3MoKS0xKTsKKyAgTmVvblR5cGVGbGFncyBUeXBlKDApOworICBpZiAoQXJnLT5pc0ludGVnZXJDb25zdGFudEV4cHIoUmVzdWx0LCBnZXRDb250ZXh0KCkpKQorICAgIC8vIERldGVybWluZSB0aGUgdHlwZSBvZiB0aGlzIG92ZXJsb2FkZWQgTkVPTiBpbnRyaW5zaWMuCisgICAgVHlwZSA9IE5lb25UeXBlRmxhZ3MoUmVzdWx0LmdldFpFeHRWYWx1ZSgpKTsKKworICBib29sIHVzZ24gPSBUeXBlLmlzVW5zaWduZWQoKTsKKyAgYm9vbCBxdWFkID0gVHlwZS5pc1F1YWQoKTsKKworICAvLyBIYW5kbGUgbm9uLW92ZXJsb2FkZWQgaW50cmluc2ljcyBmaXJzdC4KKyAgc3dpdGNoIChCdWlsdGluSUQpIHsKKyAgZGVmYXVsdDogYnJlYWs7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGRycV9wMTI4OiB7CisgICAgbGx2bTo6VHlwZSAqSW50MTI4UFR5ID0gbGx2bTo6VHlwZTo6Z2V0SW50TlB0clR5KGdldExMVk1Db250ZXh0KCksIDEyOCk7CisgICAgVmFsdWUgKlB0ciA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpLCBJbnQxMjhQVHkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUxvYWQoUHRyKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0cnFfcDEyODogeworICAgIGxsdm06OlR5cGUgKkludDEyOFBUeSA9IGxsdm06OlR5cGU6OmdldEludE5QdHJUeShnZXRMTFZNQ29udGV4dCgpLCAxMjgpOworICAgIFZhbHVlICpQdHIgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBJbnQxMjhQVHkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSksIFB0cik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRzX3UzMl9mMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0ZF91NjRfZjY0OgorICAgIHVzZ24gPSB0cnVlOworICAgIC8vIEZBTEwgVEhST1VHSAorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHNfczMyX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRkX3M2NF9mNjQ6IHsKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSkpOworICAgIGJvb2wgSXM2NCA9IE9wc1swXS0+Z2V0VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCkgPT0gNjQ7CisgICAgbGx2bTo6VHlwZSAqSW5UeSA9IElzNjQgPyBJbnQ2NFR5IDogSW50MzJUeTsKKyAgICBsbHZtOjpUeXBlICpGVHkgPSBJczY0ID8gRG91YmxlVHkgOiBGbG9hdFR5OworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIEZUeSk7CisgICAgaWYgKHVzZ24pCisgICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVGUFRvVUkoT3BzWzBdLCBJblR5KTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVGUFRvU0koT3BzWzBdLCBJblR5KTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHNfZjMyX3UzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRkX2Y2NF91NjQ6CisgICAgdXNnbiA9IHRydWU7CisgICAgLy8gRkFMTCBUSFJPVUdICisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0c19mMzJfczMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGRfZjY0X3M2NDogeworICAgIE9wcy5wdXNoX2JhY2soRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDApKSk7CisgICAgYm9vbCBJczY0ID0gT3BzWzBdLT5nZXRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSA9PSA2NDsKKyAgICBsbHZtOjpUeXBlICpJblR5ID0gSXM2NCA/IEludDY0VHkgOiBJbnQzMlR5OworICAgIGxsdm06OlR5cGUgKkZUeSA9IElzNjQgPyBEb3VibGVUeSA6IEZsb2F0VHk7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgSW5UeSk7CisgICAgaWYgKHVzZ24pCisgICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVVSVRvRlAoT3BzWzBdLCBGVHkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVNJVG9GUChPcHNbMF0sIEZUeSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRkZF9zNjQ6IHsKKyAgICBsbHZtOjpUeXBlICpUeSA9CisgICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXQobGx2bTo6VHlwZTo6Z2V0SW50NjRUeShnZXRMTFZNQ29udGV4dCgpKSwgMik7CisgICAgVmFsdWUgKlZlYyA9IEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSk7CisgICAgLy8gVGhlIHZlY3RvciBpcyB2MmY2NCwgc28gbWFrZSBzdXJlIGl0J3MgYml0Y2FzdCB0byB0aGF0LgorICAgIFZlYyA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChWZWMsIFR5LCAidjJpNjQiKTsKKyAgICBsbHZtOjpWYWx1ZSAqSWR4MCA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoSW50MzJUeSwgMCk7CisgICAgbGx2bTo6VmFsdWUgKklkeDEgPSBsbHZtOjpDb25zdGFudEludDo6Z2V0KEludDMyVHksIDEpOworICAgIFZhbHVlICpPcDAgPSBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KFZlYywgSWR4MCwgImxhbmUwIik7CisgICAgVmFsdWUgKk9wMSA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoVmVjLCBJZHgxLCAibGFuZTEiKTsKKyAgICAvLyBQYWlyd2lzZSBhZGRpdGlvbiBvZiBhIHYyZjY0IGludG8gYSBzY2FsYXIgZjY0LgorICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUFkZChPcDAsIE9wMSwgInZwYWRkZCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cGFkZGRfZjY0OiB7CisgICAgbGx2bTo6VHlwZSAqVHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OlR5cGU6OmdldERvdWJsZVR5KGdldExMVk1Db250ZXh0KCkpLCAyKTsKKyAgICBWYWx1ZSAqVmVjID0gRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDApKTsKKyAgICAvLyBUaGUgdmVjdG9yIGlzIHYyZjY0LCBzbyBtYWtlIHN1cmUgaXQncyBiaXRjYXN0IHRvIHRoYXQuCisgICAgVmVjID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KFZlYywgVHksICJ2MmY2NCIpOworICAgIGxsdm06OlZhbHVlICpJZHgwID0gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCAwKTsKKyAgICBsbHZtOjpWYWx1ZSAqSWR4MSA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoSW50MzJUeSwgMSk7CisgICAgVmFsdWUgKk9wMCA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoVmVjLCBJZHgwLCAibGFuZTAiKTsKKyAgICBWYWx1ZSAqT3AxID0gQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChWZWMsIElkeDEsICJsYW5lMSIpOworICAgIC8vIFBhaXJ3aXNlIGFkZGl0aW9uIG9mIGEgdjJmNjQgaW50byBhIHNjYWxhciBmNjQuCisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlRkFkZChPcDAsIE9wMSwgInZwYWRkZCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cGFkZHNfZjMyOiB7CisgICAgbGx2bTo6VHlwZSAqVHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OlR5cGU6OmdldEZsb2F0VHkoZ2V0TExWTUNvbnRleHQoKSksIDIpOworICAgIFZhbHVlICpWZWMgPSBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpOworICAgIC8vIFRoZSB2ZWN0b3IgaXMgdjJmMzIsIHNvIG1ha2Ugc3VyZSBpdCdzIGJpdGNhc3QgdG8gdGhhdC4KKyAgICBWZWMgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoVmVjLCBUeSwgInYyZjMyIik7CisgICAgbGx2bTo6VmFsdWUgKklkeDAgPSBsbHZtOjpDb25zdGFudEludDo6Z2V0KEludDMyVHksIDApOworICAgIGxsdm06OlZhbHVlICpJZHgxID0gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCAxKTsKKyAgICBWYWx1ZSAqT3AwID0gQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChWZWMsIElkeDAsICJsYW5lMCIpOworICAgIFZhbHVlICpPcDEgPSBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KFZlYywgSWR4MSwgImxhbmUxIik7CisgICAgLy8gUGFpcndpc2UgYWRkaXRpb24gb2YgYSB2MmYzMiBpbnRvIGEgc2NhbGFyIGYzMi4KKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVGQWRkKE9wMCwgT3AxLCAidnBhZGRkIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXF6ZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2VxemRfZjY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNlcXpzX2YzMjoKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSkpOworICAgIHJldHVybiBFbWl0QUFyY2g2NENvbXBhcmVCdWlsdGluRXhwcigKKyAgICAgICAgT3BzWzBdLCBDb252ZXJ0VHlwZShFLT5nZXRDYWxsUmV0dXJuVHlwZSgpKSwgSUNtcEluc3Q6OkZDTVBfT0VRLAorICAgICAgICBJQ21wSW5zdDo6SUNNUF9FUSwgInZjZXF6Iik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2dlemRfczY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNnZXpkX2Y2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ2V6c19mMzI6CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICByZXR1cm4gRW1pdEFBcmNoNjRDb21wYXJlQnVpbHRpbkV4cHIoCisgICAgICAgIE9wc1swXSwgQ29udmVydFR5cGUoRS0+Z2V0Q2FsbFJldHVyblR5cGUoKSksIElDbXBJbnN0OjpGQ01QX09HRSwKKyAgICAgICAgSUNtcEluc3Q6OklDTVBfU0dFLCAidmNnZXoiKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbGV6ZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlemRfZjY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsZXpzX2YzMjoKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSkpOworICAgIHJldHVybiBFbWl0QUFyY2g2NENvbXBhcmVCdWlsdGluRXhwcigKKyAgICAgICAgT3BzWzBdLCBDb252ZXJ0VHlwZShFLT5nZXRDYWxsUmV0dXJuVHlwZSgpKSwgSUNtcEluc3Q6OkZDTVBfT0xFLAorICAgICAgICBJQ21wSW5zdDo6SUNNUF9TTEUsICJ2Y2xleiIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNndHpkX3M2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ3R6ZF9mNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2d0enNfZjMyOgorICAgIE9wcy5wdXNoX2JhY2soRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDApKSk7CisgICAgcmV0dXJuIEVtaXRBQXJjaDY0Q29tcGFyZUJ1aWx0aW5FeHByKAorICAgICAgICBPcHNbMF0sIENvbnZlcnRUeXBlKEUtPmdldENhbGxSZXR1cm5UeXBlKCkpLCBJQ21wSW5zdDo6RkNNUF9PR1QsCisgICAgICAgIElDbXBJbnN0OjpJQ01QX1NHVCwgInZjZ3R6Iik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0emRfczY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsdHpkX2Y2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHR6c19mMzI6CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICByZXR1cm4gRW1pdEFBcmNoNjRDb21wYXJlQnVpbHRpbkV4cHIoCisgICAgICAgIE9wc1swXSwgQ29udmVydFR5cGUoRS0+Z2V0Q2FsbFJldHVyblR5cGUoKSksIElDbXBJbnN0OjpGQ01QX09MVCwKKyAgICAgICAgSUNtcEluc3Q6OklDTVBfU0xULCAidmNsdHoiKTsKKworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNlcXpkX3U2NDogeworICAgIGxsdm06OlR5cGUgKlR5ID0gbGx2bTo6VHlwZTo6Z2V0SW50NjRUeShnZXRMTFZNQ29udGV4dCgpKTsKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUlDbXAobGx2bTo6SUNtcEluc3Q6OklDTVBfRVEsIE9wc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVNFeHQoT3BzWzBdLCBUeSwgInZjZXF6ZCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2VxZF9mNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlZF9mNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0ZF9mNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2dlZF9mNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2d0ZF9mNjQ6IHsKKyAgICBsbHZtOjpDbXBJbnN0OjpQcmVkaWNhdGUgUDsKKyAgICBzd2l0Y2ggKEJ1aWx0aW5JRCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIm1pc3NpbmcgYnVpbHRpbiBJRCBpbiBzd2l0Y2ghIik7CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXFkX2Y2NDogUCA9IGxsdm06OkZDbXBJbnN0OjpGQ01QX09FUTsgYnJlYWs7CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbGVkX2Y2NDogUCA9IGxsdm06OkZDbXBJbnN0OjpGQ01QX09MRTsgYnJlYWs7CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbHRkX2Y2NDogUCA9IGxsdm06OkZDbXBJbnN0OjpGQ01QX09MVDsgYnJlYWs7CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ2VkX2Y2NDogUCA9IGxsdm06OkZDbXBJbnN0OjpGQ01QX09HRTsgYnJlYWs7CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ3RkX2Y2NDogUCA9IGxsdm06OkZDbXBJbnN0OjpGQ01QX09HVDsgYnJlYWs7CisgICAgfQorICAgIE9wcy5wdXNoX2JhY2soRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSk7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgRG91YmxlVHkpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMV0sIERvdWJsZVR5KTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUZDbXAoUCwgT3BzWzBdLCBPcHNbMV0pOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVNFeHQoT3BzWzBdLCBJbnQ2NFR5LCAidmNtcGQiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNlcXNfZjMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsZXNfZjMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsdHNfZjMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNnZXNfZjMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNndHNfZjMyOiB7CisgICAgbGx2bTo6Q21wSW5zdDo6UHJlZGljYXRlIFA7CisgICAgc3dpdGNoIChCdWlsdGluSUQpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJtaXNzaW5nIGJ1aWx0aW4gSUQgaW4gc3dpdGNoISIpOworICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2Vxc19mMzI6IFAgPSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PRVE7IGJyZWFrOworICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlc19mMzI6IFAgPSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PTEU7IGJyZWFrOworICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0c19mMzI6IFAgPSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PTFQ7IGJyZWFrOworICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2dlc19mMzI6IFAgPSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PR0U7IGJyZWFrOworICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2d0c19mMzI6IFAgPSBsbHZtOjpGQ21wSW5zdDo6RkNNUF9PR1Q7IGJyZWFrOworICAgIH0KKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIEZsb2F0VHkpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMV0sIEZsb2F0VHkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlRkNtcChQLCBPcHNbMF0sIE9wc1sxXSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU0V4dChPcHNbMF0sIEludDMyVHksICJ2Y21wZCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2VxZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2VxZF91NjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2d0ZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2d0ZF91NjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0ZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0ZF91NjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2dlZF91NjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2dlZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlZF91NjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlZF9zNjQ6IHsKKyAgICBsbHZtOjpDbXBJbnN0OjpQcmVkaWNhdGUgUDsKKyAgICBzd2l0Y2ggKEJ1aWx0aW5JRCkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIm1pc3NpbmcgYnVpbHRpbiBJRCBpbiBzd2l0Y2ghIik7CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXFkX3M2NDoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNlcWRfdTY0OlAgPSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9FUTticmVhazsKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNndGRfczY0OlAgPSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9TR1Q7YnJlYWs7CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ3RkX3U2NDpQID0gbGx2bTo6SUNtcEluc3Q6OklDTVBfVUdUO2JyZWFrOworICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0ZF9zNjQ6UCA9IGxsdm06OklDbXBJbnN0OjpJQ01QX1NMVDticmVhazsKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsdGRfdTY0OlAgPSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9VTFQ7YnJlYWs7CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ2VkX3U2NDpQID0gbGx2bTo6SUNtcEluc3Q6OklDTVBfVUdFO2JyZWFrOworICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2dlZF9zNjQ6UCA9IGxsdm06OklDbXBJbnN0OjpJQ01QX1NHRTticmVhazsKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsZWRfdTY0OlAgPSBsbHZtOjpJQ21wSW5zdDo6SUNNUF9VTEU7YnJlYWs7CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbGVkX3M2NDpQID0gbGx2bTo6SUNtcEluc3Q6OklDTVBfU0xFO2JyZWFrOworICAgIH0KKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIEludDY0VHkpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMV0sIEludDY0VHkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlSUNtcChQLCBPcHNbMF0sIE9wc1sxXSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU0V4dChPcHNbMF0sIEludDY0VHksICJ2Y2VxZCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dHN0ZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dHN0ZF91NjQ6IHsKKyAgICBsbHZtOjpUeXBlICpUeSA9IGxsdm06OlR5cGU6OmdldEludDY0VHkoZ2V0TExWTUNvbnRleHQoKSk7CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMSkpKTsKICAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CiAgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOwogICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQW5kKE9wc1swXSwgT3BzWzFdKTsKICAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfTkUsIE9wc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvOjpnZXQoVHkpKTsKLSAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTRXh0KE9wc1swXSwgVHksICJ2dHN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoVHkpKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTRXh0KE9wc1swXSwgVHksICJ2dHN0ZCIpOwogICB9Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Z0cm5fdjoKLSAgY2FzZSBBUk06OkJJX19idWlsdGluX25lb25fdnRybnFfdjogeworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2k4OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2kxNjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pMzI6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTg6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2kxNjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldHFfbGFuZV9pNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2YzMjoKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygyKSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUluc2VydEVsZW1lbnQoT3BzWzFdLCBPcHNbMF0sIE9wc1syXSwgInZzZXRfbGFuZSIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldF9sYW5lX2Y2NDoKKyAgICAvLyBUaGUgdmVjdG9yIHR5cGUgbmVlZHMgYSBjYXN0IGZvciB0aGUgdjFmNjQgdmFyaWFudC4KKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoRG91YmxlVHksIDEpKTsKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygyKSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUluc2VydEVsZW1lbnQoT3BzWzFdLCBPcHNbMF0sIE9wc1syXSwgInZzZXRfbGFuZSIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNldHFfbGFuZV9mNjQ6CisgICAgLy8gVGhlIHZlY3RvciB0eXBlIG5lZWRzIGEgY2FzdCBmb3IgdGhlIHYyZjY0IHZhcmlhbnQuCisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwKKyAgICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OlR5cGU6OmdldERvdWJsZVR5KGdldExMVk1Db250ZXh0KCkpLCAyKSk7CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMikpKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVJbnNlcnRFbGVtZW50KE9wc1sxXSwgT3BzWzBdLCBPcHNbMl0sICJ2c2V0X2xhbmUiKTsKKworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2k4OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cGJfbGFuZV9pODoKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLAorICAgICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXQobGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCA4KSwgOCkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KE9wc1swXSwgRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmdldF9sYW5lIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2k4OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cGJfbGFuZXFfaTg6CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwKKyAgICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCksIDE2KSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoT3BzWzBdLCBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2Z2V0cV9sYW5lIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfaTE2OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cGhfbGFuZV9pMTY6CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwKKyAgICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpLCA0KSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoT3BzWzBdLCBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2Z2V0X2xhbmUiKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTE2OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cGhfbGFuZXFfaTE2OgorICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sCisgICAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgOCkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KE9wc1swXSwgRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmdldHFfbGFuZSIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2kzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBzX2xhbmVfaTMyOgorICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdCgKKyAgICAgICAgT3BzWzBdLAorICAgICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXQobGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMiksIDIpKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChPcHNbMF0sIEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZnZXRfbGFuZSIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cHNfbGFuZV9mMzI6CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwKKyAgICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OlR5cGU6OmdldEZsb2F0VHkoZ2V0TExWTUNvbnRleHQoKSksIDIpKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChPcHNbMF0sIEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZkdXBzX2xhbmUiKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cHNfbGFuZXFfaTMyOgorICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sCisgICAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDMyKSwgNCkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KE9wc1swXSwgRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmdldHFfbGFuZSIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2k2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBkX2xhbmVfaTY0OgorICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sCisgICAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDY0KSwgMSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KE9wc1swXSwgRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmdldF9sYW5lIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92ZHVwZF9sYW5lX2Y2NDoKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLAorICAgICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXQobGx2bTo6VHlwZTo6Z2V0RG91YmxlVHkoZ2V0TExWTUNvbnRleHQoKSksIDEpKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChPcHNbMF0sIEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZkdXBkX2xhbmUiKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmR1cGRfbGFuZXFfaTY0OgorICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sCisgICAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDY0KSwgMikpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KE9wc1swXSwgRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmdldHFfbGFuZSIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldF9sYW5lX2YzMjoKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLAorICAgICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXQobGx2bTo6VHlwZTo6Z2V0RmxvYXRUeShnZXRMTFZNQ29udGV4dCgpKSwgMikpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KE9wc1swXSwgRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmdldF9sYW5lIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfZjY0OgorICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sCisgICAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpUeXBlOjpnZXREb3VibGVUeShnZXRMTFZNQ29udGV4dCgpKSwgMSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KE9wc1swXSwgRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmdldF9sYW5lIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZkdXBzX2xhbmVxX2YzMjoKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLAorICAgICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXQobGx2bTo6VHlwZTo6Z2V0RmxvYXRUeShnZXRMTFZNQ29udGV4dCgpKSwgNCkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KE9wc1swXSwgRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmdldHFfbGFuZSIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmdldHFfbGFuZV9mNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92ZHVwZF9sYW5lcV9mNjQ6CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwKKyAgICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OlR5cGU6OmdldERvdWJsZVR5KGdldExMVk1Db250ZXh0KCkpLCAyKSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoT3BzWzBdLCBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2Z2V0cV9sYW5lIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92YWRkZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92YWRkZF91NjQ6CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQWRkKE9wc1swXSwgRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSwgInZhZGRkIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3ViZF9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3ViZF91NjQ6CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU3ViKE9wc1swXSwgRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKSwgInZzdWJkIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsaF9zMTY6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbHNsaF9zMTY6IHsKKyAgICBTbWFsbFZlY3RvcjxWYWx1ZSAqLCAyPiBQcm9kdWN0T3BzOworICAgIFByb2R1Y3RPcHMucHVzaF9iYWNrKHZlY3RvcldyYXBTY2FsYXIxNihPcHNbMV0pKTsKKyAgICBQcm9kdWN0T3BzLnB1c2hfYmFjayh2ZWN0b3JXcmFwU2NhbGFyMTYoRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDIpKSkpOworICAgIGxsdm06OlR5cGUgKlZUeSA9IGxsdm06OlZlY3RvclR5cGU6OmdldChJbnQzMlR5LCA0KTsKKyAgICBPcHNbMV0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X25lb25fc3FkbXVsbCwgVlR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdE9wcywgInZxZG1sWGwiKTsKKyAgICBDb25zdGFudCAqQ0kgPSBDb25zdGFudEludDo6Z2V0KEludDMyVHksIDApOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoT3BzWzFdLCBDSSwgImxhbmUwIik7CisKKyAgICB1bnNpZ25lZCBBY2N1bUludCA9IEJ1aWx0aW5JRCA9PSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxoX3MxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSW50cmluc2ljOjphcm02NF9uZW9uX3NxYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJbnRyaW5zaWM6OmFybTY0X25lb25fc3FzdWI7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEFjY3VtSW50LCBJbnQzMlR5KSwgT3BzLCAidnFkbWxYbCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXNobHVkX25fczY0OiB7CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMSkpKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZVpFeHQoT3BzWzFdLCBJbnQ2NFR5KTsKKyAgICBsbHZtOjpUeXBlICpWVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoSW50NjRUeSwgMSk7CisgICAgT3BzWzBdID0gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9uZW9uX3Nxc2hsdSwgVlR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnFzaGx1X24iKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgSW50NjRUeSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsZF9uX3U2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsZF9uX3M2NDogeworICAgIHVuc2lnbmVkIEludCA9IEJ1aWx0aW5JRCA9PSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsZF9uX3U2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEludHJpbnNpYzo6YXJtNjRfbmVvbl91cXNobAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEludHJpbnNpYzo6YXJtNjRfbmVvbl9zcXNobDsKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSkpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlWkV4dChPcHNbMV0sIEludDY0VHkpOworICAgIGxsdm06OlR5cGUgKlZUeSA9IGxsdm06OlZlY3RvclR5cGU6OmdldChJbnQ2NFR5LCAxKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFZUeSksIE9wcywgInZxc2hsX24iKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgSW50NjRUeSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hyZF9uX3U2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hyZF9uX3M2NDogeworICAgIHVuc2lnbmVkIEludCA9IEJ1aWx0aW5JRCA9PSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hyZF9uX3U2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEludHJpbnNpYzo6YXJtNjRfbmVvbl91cnNobAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEludHJpbnNpYzo6YXJtNjRfbmVvbl9zcnNobDsKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSkpOworICAgIGxsdm06OlR5cGUgKlZUeSA9IGxsdm06OlZlY3RvclR5cGU6OmdldChJbnQ2NFR5LCAxKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFZUeSksIE9wcywgInZyc2hyX24iLCAxLCB0cnVlKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgSW50NjRUeSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3JhZF9uX3U2NDoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3JhZF9uX3M2NDogeworICAgIHVuc2lnbmVkIEludCA9IEJ1aWx0aW5JRCA9PSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3JhZF9uX3U2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEludHJpbnNpYzo6YXJtNjRfbmVvbl91cnNobAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEludHJpbnNpYzo6YXJtNjRfbmVvbl9zcnNobDsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBJbnQ2NFR5KTsKKyAgICBPcHMucHVzaF9iYWNrKEJ1aWxkZXIuQ3JlYXRlTmVnKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygyKSkpKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUNhbGwyKENHTS5nZXRJbnRyaW5zaWMoSW50LCBJbnQ2NFR5KSwgT3BzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5DcmVhdGVTRXh0KE9wc1syXSwgSW50NjRUeSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUFkZChPcHNbMF0sIEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMV0sIEludDY0VHkpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNobGRfbl9zNjQ6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c2hsZF9uX3U2NDogeworICAgIGxsdm06OkNvbnN0YW50SW50ICpBbXQgPSBjYXN0PENvbnN0YW50SW50PihFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMSkpKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTaGwoCisgICAgICAgIE9wc1swXSwgQ29uc3RhbnRJbnQ6OmdldChJbnQ2NFR5LCBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oNjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW10LT5nZXRaRXh0VmFsdWUoKSkpLAorICAgICAgICAidnNocl9uIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaHJkX25fczY0OiB7CisgICAgbGx2bTo6Q29uc3RhbnRJbnQgKkFtdCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUFTaHIoCisgICAgICAgIE9wc1swXSwgQ29uc3RhbnRJbnQ6OmdldChJbnQ2NFR5LCBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oNjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW10LT5nZXRaRXh0VmFsdWUoKSkpLAorICAgICAgICAidnNocl9uIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzaHJkX25fdTY0OiB7CisgICAgbGx2bTo6Q29uc3RhbnRJbnQgKkFtdCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUxTaHIoCisgICAgICAgIE9wc1swXSwgQ29uc3RhbnRJbnQ6OmdldChJbnQ2NFR5LCBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oNjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW10LT5nZXRaRXh0VmFsdWUoKSkpLAorICAgICAgICAidnNocl9uIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmFkX25fczY0OiB7CisgICAgbGx2bTo6Q29uc3RhbnRJbnQgKkFtdCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygyKSkpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQVNocigKKyAgICAgICAgT3BzWzFdLCBDb25zdGFudEludDo6Z2V0KEludDY0VHksIHN0ZDo6bWluKHN0YXRpY19jYXN0PHVpbnQ2NF90Pig2MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbXQtPmdldFpFeHRWYWx1ZSgpKSksCisgICAgICAgICJ2c2hyX24iKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVBZGQoT3BzWzBdLCBPcHNbMV0pOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3JhZF9uX3U2NDogeworICAgIGxsdm06OkNvbnN0YW50SW50ICpBbXQgPSBjYXN0PENvbnN0YW50SW50PihFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMikpKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUxTaHIoCisgICAgICAgIE9wc1sxXSwgQ29uc3RhbnRJbnQ6OmdldChJbnQ2NFR5LCBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oNjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW10LT5nZXRaRXh0VmFsdWUoKSkpLAorICAgICAgICAidnNocl9uIik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQWRkKE9wc1swXSwgT3BzWzFdKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFkbWxhbGhfbGFuZV9zMTY6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsaF9sYW5lcV9zMTY6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbHNsaF9sYW5lX3MxNjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xoX2xhbmVxX3MxNjogeworICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoT3BzWzJdLCBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhbmUiKTsKKyAgICBTbWFsbFZlY3RvcjxWYWx1ZSAqLCAyPiBQcm9kdWN0T3BzOworICAgIFByb2R1Y3RPcHMucHVzaF9iYWNrKHZlY3RvcldyYXBTY2FsYXIxNihPcHNbMV0pKTsKKyAgICBQcm9kdWN0T3BzLnB1c2hfYmFjayh2ZWN0b3JXcmFwU2NhbGFyMTYoT3BzWzJdKSk7CisgICAgbGx2bTo6VHlwZSAqVlR5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KEludDMyVHksIDQpOworICAgIE9wc1sxXSA9IEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtNjRfbmVvbl9zcWRtdWxsLCBWVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0T3BzLCAidnFkbWxYbCIpOworICAgIENvbnN0YW50ICpDSSA9IENvbnN0YW50SW50OjpnZXQoSW50MzJUeSwgMCk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChPcHNbMV0sIENJLCAibGFuZTAiKTsKKyAgICBPcHMucG9wX2JhY2soKTsKKworICAgIHVuc2lnbmVkIEFjY0ludCA9IChCdWlsdGluSUQgPT0gTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsaF9sYW5lX3MxNiB8fAorICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluSUQgPT0gTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsaF9sYW5lcV9zMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gSW50cmluc2ljOjphcm02NF9uZW9uX3NxYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW50cmluc2ljOjphcm02NF9uZW9uX3Nxc3ViOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhBY2NJbnQsIEludDMyVHkpLCBPcHMsICJ2cWRtbFhsIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxzX3MzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xzX3MzMjogeworICAgIFNtYWxsVmVjdG9yPFZhbHVlICosIDI+IFByb2R1Y3RPcHM7CisgICAgUHJvZHVjdE9wcy5wdXNoX2JhY2soT3BzWzFdKTsKKyAgICBQcm9kdWN0T3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMikpKTsKKyAgICBPcHNbMV0gPQorICAgICAgICBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X25lb25fc3FkbXVsbHNfc2NhbGFyKSwKKyAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3RPcHMsICJ2cWRtbFhsIik7CisKKyAgICB1bnNpZ25lZCBBY2N1bUludCA9IEJ1aWx0aW5JRCA9PSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxzX3MzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSW50cmluc2ljOjphcm02NF9uZW9uX3NxYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJbnRyaW5zaWM6OmFybTY0X25lb25fc3FzdWI7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEFjY3VtSW50LCBJbnQ2NFR5KSwgT3BzLCAidnFkbWxYbCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsc19sYW5lX3MzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxzX2xhbmVxX3MzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xzX2xhbmVfczMyOgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFkbWxzbHNfbGFuZXFfczMyOiB7CisgICAgT3BzWzJdID0gQnVpbGRlci5DcmVhdGVFeHRyYWN0RWxlbWVudChPcHNbMl0sIEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGFuZSIpOworICAgIFNtYWxsVmVjdG9yPFZhbHVlICosIDI+IFByb2R1Y3RPcHM7CisgICAgUHJvZHVjdE9wcy5wdXNoX2JhY2soT3BzWzFdKTsKKyAgICBQcm9kdWN0T3BzLnB1c2hfYmFjayhPcHNbMl0pOworICAgIE9wc1sxXSA9CisgICAgICAgIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtNjRfbmVvbl9zcWRtdWxsc19zY2FsYXIpLAorICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdE9wcywgInZxZG1sWGwiKTsKKyAgICBPcHMucG9wX2JhY2soKTsKKworICAgIHVuc2lnbmVkIEFjY0ludCA9IChCdWlsdGluSUQgPT0gTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsc19sYW5lX3MzMiB8fAorICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluSUQgPT0gTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cWRtbGFsc19sYW5lcV9zMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gSW50cmluc2ljOjphcm02NF9uZW9uX3NxYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW50cmluc2ljOjphcm02NF9uZW9uX3Nxc3ViOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhBY2NJbnQsIEludDY0VHkpLCBPcHMsICJ2cWRtbFhsIik7CisgIH0KKyAgfQorCisgIGxsdm06OlZlY3RvclR5cGUgKlZUeSA9IEdldE5lb25UeXBlKHRoaXMsIFR5cGUpOworICBsbHZtOjpUeXBlICpUeSA9IFZUeTsKKyAgaWYgKCFUeSkKKyAgICByZXR1cm4gMDsKKworICAvLyBOb3QgYWxsIGludHJpbnNpY3MgaGFuZGxlZCBieSB0aGUgY29tbW9uIGNhc2Ugd29yayBmb3IgQVJNNjQgeWV0LCBzbyBvbmx5CisgIC8vIGRlZmVyIHRvIGNvbW1vbiBjb2RlIGlmIGl0J3MgYmVlbiBhZGRlZCB0byBvdXIgc3BlY2lhbCBtYXAuCisgIEJ1aWx0aW4gPSBmaW5kTmVvbkludHJpbnNpY0luTWFwKEFSTTY0U0lNREludHJpbnNpY01hcCwgQnVpbHRpbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk02NFNJTURJbnRyaW5zaWNzUHJvdmVuU29ydGVkKTsKKworICBpZiAoQnVpbHRpbikKKyAgICByZXR1cm4gRW1pdENvbW1vbk5lb25CdWlsdGluRXhwcigKKyAgICAgICAgQnVpbHRpbi0+QnVpbHRpbklELCBCdWlsdGluLT5MTFZNSW50cmluc2ljLCBCdWlsdGluLT5BbHRMTFZNSW50cmluc2ljLAorICAgICAgICBCdWlsdGluLT5OYW1lSGludCwgQnVpbHRpbi0+VHlwZU1vZGlmaWVyLCBFLCBPcHMsIDApOworCisgIGlmIChWYWx1ZSAqViA9IEVtaXRBUk02NFRibEJ1aWx0aW5FeHByKCp0aGlzLCBCdWlsdGluSUQsIEUsIE9wcykpCisgICAgcmV0dXJuIFY7CisKKyAgdW5zaWduZWQgSW50OworICBzd2l0Y2ggKEJ1aWx0aW5JRCkgeworICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zic2xfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zic2xxX3Y6IHsKKyAgICBsbHZtOjpUeXBlICpCaXRUeSA9IGxsdm06OlZlY3RvclR5cGU6OmdldEludGVnZXIoVlR5KTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBCaXRUeSwgInZic2wiKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBCaXRUeSwgInZic2wiKTsKKyAgICBPcHNbMl0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzJdLCBCaXRUeSwgInZic2wiKTsKKworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQW5kKE9wc1swXSwgT3BzWzFdLCAidmJzbCIpOworICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlQW5kKEJ1aWxkZXIuQ3JlYXRlTm90KE9wc1swXSksIE9wc1syXSwgInZic2wiKTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZU9yKE9wc1sxXSwgT3BzWzJdLCAidmJzbCIpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFfbGFuZV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmZtYXFfbGFuZV92OiB7IC8vIE9ubHkgdXNlZCBmb3IgRlAgdHlwZXMKKyAgICAvLyBUaGUgQVJNIGJ1aWx0aW5zIChhbmQgaW5zdHJ1Y3Rpb25zKSBoYXZlIHRoZSBhZGRlbmQgYXMgdGhlIGZpcnN0CisgICAgLy8gb3BlcmFuZCwgYnV0IHRoZSAnZm1hJyBpbnRyaW5zaWNzIGhhdmUgaXQgbGFzdC4gU3dhcCBpdCBhcm91bmQgaGVyZS4KKyAgICBWYWx1ZSAqQWRkZW5kID0gT3BzWzBdOworICAgIFZhbHVlICpNdWx0aXBsaWNhbmQgPSBPcHNbMV07CisgICAgVmFsdWUgKkxhbmVTb3VyY2UgPSBPcHNbMl07CisgICAgT3BzWzBdID0gTXVsdGlwbGljYW5kOworICAgIE9wc1sxXSA9IExhbmVTb3VyY2U7CisgICAgT3BzWzJdID0gQWRkZW5kOworCisgICAgLy8gTm93IGFkanVzdCB0aGluZ3MgdG8gaGFuZGxlIHRoZSBsYW5lIGFjY2Vzcy4KKyAgICBsbHZtOjpUeXBlICpTb3VyY2VUeSA9IEJ1aWx0aW5JRCA9PSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFxX2xhbmVfdiA/CisgICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoVlR5LT5nZXRFbGVtZW50VHlwZSgpLCBWVHktPmdldE51bUVsZW1lbnRzKCkgLyAyKSA6CisgICAgICBWVHk7CisgICAgbGx2bTo6Q29uc3RhbnQgKmNzdCA9IGNhc3Q8Q29uc3RhbnQ+KE9wc1szXSk7CisgICAgVmFsdWUgKlNWID0gbGx2bTo6Q29uc3RhbnRWZWN0b3I6OmdldFNwbGF0KFZUeS0+Z2V0TnVtRWxlbWVudHMoKSwgY3N0KTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBTb3VyY2VUeSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVTaHVmZmxlVmVjdG9yKE9wc1sxXSwgT3BzWzFdLCBTViwgImxhbmUiKTsKKworICAgIE9wcy5wb3BfYmFjaygpOworICAgIEludCA9IEludHJpbnNpYzo6Zm1hOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAiZm1sYSIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1hX2xhbmVxX3Y6IHsKKyAgICBsbHZtOjpWZWN0b3JUeXBlICpWVHkgPSBjYXN0PGxsdm06OlZlY3RvclR5cGU+KFR5KTsKKyAgICAvLyB2MWY2NCBmbWEgc2hvdWxkIGJlIG1hcHBlZCB0byBOZW9uIHNjYWxhciBmNjQgZm1hCisgICAgaWYgKFZUeSAmJiBWVHktPmdldEVsZW1lbnRUeXBlKCkgPT0gRG91YmxlVHkpIHsKKyAgICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIERvdWJsZVR5KTsKKyAgICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMV0sIERvdWJsZVR5KTsKKyAgICAgIGxsdm06OlR5cGUgKlZUeSA9IEdldE5lb25UeXBlKHRoaXMsCisgICAgICAgIE5lb25UeXBlRmxhZ3MoTmVvblR5cGVGbGFnczo6RmxvYXQ2NCwgZmFsc2UsIHRydWUpKTsKKyAgICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMl0sIFZUeSk7CisgICAgICBPcHNbMl0gPSBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RFbGVtZW50KE9wc1syXSwgT3BzWzNdLCAiZXh0cmFjdCIpOworICAgICAgVmFsdWUgKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6Zm1hLCBEb3VibGVUeSk7CisgICAgICBWYWx1ZSAqUmVzdWx0ID0gQnVpbGRlci5DcmVhdGVDYWxsMyhGLCBPcHNbMV0sIE9wc1syXSwgT3BzWzBdKTsKKyAgICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoUmVzdWx0LCBUeSk7CisgICAgfQorICAgIFZhbHVlICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmZtYSwgVHkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBUeSk7CisKKyAgICBsbHZtOjpUeXBlICpTVHkgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoVlR5LT5nZXRFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVHktPmdldE51bUVsZW1lbnRzKCkgKiAyKTsKKyAgICBPcHNbMl0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzJdLCBTVHkpOworICAgIFZhbHVlKiBTViA9IGxsdm06OkNvbnN0YW50VmVjdG9yOjpnZXRTcGxhdChWVHktPmdldE51bUVsZW1lbnRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KE9wc1szXSkpOworICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlU2h1ZmZsZVZlY3RvcihPcHNbMl0sIE9wc1syXSwgU1YsICJsYW5lIik7CisKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVDYWxsMyhGLCBPcHNbMl0sIE9wc1sxXSwgT3BzWzBdKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmZtYXFfbGFuZXFfdjogeworICAgIFZhbHVlICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmZtYSwgVHkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBUeSk7CisKKyAgICBPcHNbMl0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzJdLCBUeSk7CisgICAgT3BzWzJdID0gRW1pdE5lb25TcGxhdChPcHNbMl0sIGNhc3Q8Q29uc3RhbnRJbnQ+KE9wc1szXSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUNhbGwzKEYsIE9wc1syXSwgT3BzWzFdLCBPcHNbMF0pOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Zm1hc19sYW5lX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFzX2xhbmVxX2YzMjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbWFkX2xhbmVfZjY0OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmZtYWRfbGFuZXFfZjY0OiB7CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMykpKTsKKyAgICBsbHZtOjpUeXBlICpUeSA9IENvbnZlcnRUeXBlKEUtPmdldENhbGxSZXR1cm5UeXBlKCkpOworICAgIFZhbHVlICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmZtYSwgVHkpOworICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoT3BzWzJdLCBPcHNbM10sICJleHRyYWN0Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQ2FsbDMoRiwgT3BzWzFdLCBPcHNbMl0sIE9wc1swXSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbXNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZmbXNxX3Y6IHsgIC8vIE9ubHkgdXNlZCBmb3IgRlAgdHlwZXMKKyAgICAvLyBGSVhNRTogcHJvYmFibHkgcmVtb3ZlIHdoZW4gd2Ugbm8gbG9uZ2VyIHN1cHBvcnQgYWFyY2g2NF9zaW1kLmgKKyAgICAvLyAoYXJtX25lb24uaCBkZWxlZ2F0ZXMgdG8gdmZtYSkuCisKKyAgICAvLyBUaGUgQVJNIGJ1aWx0aW5zIChhbmQgaW5zdHJ1Y3Rpb25zKSBoYXZlIHRoZSBhZGRlbmQgYXMgdGhlIGZpcnN0CisgICAgLy8gb3BlcmFuZCwgYnV0IHRoZSAnZm1hJyBpbnRyaW5zaWNzIGhhdmUgaXQgbGFzdC4gU3dhcCBpdCBhcm91bmQgaGVyZS4KKyAgICBWYWx1ZSAqU3VidHJhaGVuZCA9IE9wc1swXTsKKyAgICBWYWx1ZSAqTXVsdGlwbGljYW5kID0gT3BzWzJdOworICAgIE9wc1swXSA9IE11bHRpcGxpY2FuZDsKKyAgICBPcHNbMl0gPSBTdWJ0cmFoZW5kOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMV0sIFZUeSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVGTmVnKE9wc1sxXSk7CisgICAgSW50ID0gSW50cmluc2ljOjpmbWE7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJmbWxzIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWxsX3Y6CisgICAgLy8gRklYTUU6IGltcHJvdmUgc2hhcmluZyBzY2hlbWUgdG8gY29wZSB3aXRoIDMgYWx0ZXJuYXRpdmUgTExWTSBpbnRyaW5zaWNzLgorICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybTY0X25lb25fdW11bGwgOiBJbnRyaW5zaWM6OmFybTY0X25lb25fc211bGw7CisgICAgaWYgKFR5cGUuaXNQb2x5KCkpIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl9wbXVsbDsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZtdWxsIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bWF4X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bWF4cV92OgorICAgIC8vIEZJWE1FOiBpbXByb3ZlIHNoYXJpbmcgc2NoZW1lIHRvIGNvcGUgd2l0aCAzIGFsdGVybmF0aXZlIExMVk0gaW50cmluc2ljcy4KKyAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm02NF9uZW9uX3VtYXggOiBJbnRyaW5zaWM6OmFybTY0X25lb25fc21heDsKKyAgICBpZiAoVHktPmlzRlBPckZQVmVjdG9yVHkoKSkgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX2ZtYXg7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2bWF4Iik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bWluX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bWlucV92OgorICAgIC8vIEZJWE1FOiBpbXByb3ZlIHNoYXJpbmcgc2NoZW1lIHRvIGNvcGUgd2l0aCAzIGFsdGVybmF0aXZlIExMVk0gaW50cmluc2ljcy4KKyAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm02NF9uZW9uX3VtaW4gOiBJbnRyaW5zaWM6OmFybTY0X25lb25fc21pbjsKKyAgICBpZiAoVHktPmlzRlBPckZQVmVjdG9yVHkoKSkgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX2ZtaW47CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2bWluIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92YWJkX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92YWJkcV92OgorICAgIC8vIEZJWE1FOiBpbXByb3ZlIHNoYXJpbmcgc2NoZW1lIHRvIGNvcGUgd2l0aCAzIGFsdGVybmF0aXZlIExMVk0gaW50cmluc2ljcy4KKyAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm02NF9uZW9uX3VhYmQgOiBJbnRyaW5zaWM6OmFybTY0X25lb25fc2FiZDsKKyAgICBpZiAoVHktPmlzRlBPckZQVmVjdG9yVHkoKSkgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX2ZhYmQ7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2YWJkIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cGFkYWxfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwYWRhbHFfdjogeworICAgIHVuc2lnbmVkIEFyZ0VsdHMgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7CisgICAgbGx2bTo6SW50ZWdlclR5cGUgKkVsdFR5ID0gY2FzdDxJbnRlZ2VyVHlwZT4oVlR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IEVsdFR5LT5nZXRCaXRXaWR0aCgpOworICAgIGxsdm06OlR5cGUgKkFyZ1R5ID0gbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KAorICAgICAgICBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIEJpdFdpZHRoLzIpLCAyKkFyZ0VsdHMpOworICAgIGxsdm06OlR5cGUqIFR5c1syXSA9IHsgVlR5LCBBcmdUeSB9OworICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybTY0X25lb25fdWFkZGxwIDogSW50cmluc2ljOjphcm02NF9uZW9uX3NhZGRscDsKKyAgICBTbWFsbFZlY3RvcjxsbHZtOjpWYWx1ZSosIDE+IFRtcE9wczsKKyAgICBUbXBPcHMucHVzaF9iYWNrKE9wc1sxXSk7CisgICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKTsKKyAgICBsbHZtOjpWYWx1ZSAqdG1wID0gRW1pdE5lb25DYWxsKEYsIFRtcE9wcywgInZwYWRhbCIpOworICAgIGxsdm06OlZhbHVlICphZGRlbmQgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCB0bXAtPmdldFR5cGUoKSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQWRkKHRtcCwgYWRkZW5kKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBtaW5fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWlucV92OgorICAgIC8vIEZJWE1FOiBpbXByb3ZlIHNoYXJpbmcgc2NoZW1lIHRvIGNvcGUgd2l0aCAzIGFsdGVybmF0aXZlIExMVk0gaW50cmluc2ljcy4KKyAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm02NF9uZW9uX3VtaW5wIDogSW50cmluc2ljOjphcm02NF9uZW9uX3NtaW5wOworICAgIGlmIChUeS0+aXNGUE9yRlBWZWN0b3JUeSgpKSBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fZm1pbnA7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cG1pbiIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBtYXhfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWF4cV92OgorICAgIC8vIEZJWE1FOiBpbXByb3ZlIHNoYXJpbmcgc2NoZW1lIHRvIGNvcGUgd2l0aCAzIGFsdGVybmF0aXZlIExMVk0gaW50cmluc2ljcy4KKyAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm02NF9uZW9uX3VtYXhwIDogSW50cmluc2ljOjphcm02NF9uZW9uX3NtYXhwOworICAgIGlmIChUeS0+aXNGUE9yRlBWZWN0b3JUeSgpKSBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fZm1heHA7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cG1heCIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1pbm5tX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bWlubm1xX3Y6CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX2ZtaW5ubTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZtaW5ubSIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1heG5tX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bWF4bm1xX3Y6CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX2ZtYXhubTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZtYXhubSIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJlY3Bzc19mMzI6IHsKKyAgICBsbHZtOjpUeXBlICpmMzJUeXBlID0gbGx2bTo6VHlwZTo6Z2V0RmxvYXRUeShnZXRMTFZNQ29udGV4dCgpKTsKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSkpOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X25lb25fZnJlY3BzLCBmMzJUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZyZWNwcyIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cmVjcHNkX2Y2NDogeworICAgIGxsdm06OlR5cGUgKmY2NFR5cGUgPSBsbHZtOjpUeXBlOjpnZXREb3VibGVUeShnZXRMTFZNQ29udGV4dCgpKTsKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSkpOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X25lb25fZnJlY3BzLCBmNjRUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZyZWNwcyIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNocl9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cnNocnFfbl92OgorICAgIC8vIEZJWE1FOiB0aGlzIGNhbiBiZSBzaGFyZWQgd2l0aCAzMi1iaXQgQVJNLCBidXQgbm90IEFBcmNoNjQgYXQgdGhlCisgICAgLy8gbW9tZW50LiBBZnRlciB0aGUgZmluYWwgbWVyZ2UgaXQgc2hvdWxkIGJlIGFkZGVkIHRvCisgICAgLy8gRW1pdENvbW1vbk5lb25CdWlsdGluRXhwci4KKyAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm02NF9uZW9uX3Vyc2hsIDogSW50cmluc2ljOjphcm02NF9uZW9uX3Nyc2hsOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnJzaHJfbiIsIDEsIHRydWUpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaGx1X25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hsdXFfbl92OgorICAgIC8vIEZJWE1FOiBBQXJjaDY0IGFuZCBBUk0gdXNlIGRpZmZlcmVudCBpbnRyaW5zaWNzIGZvciB0aGlzLCBidXQgYXJlCisgICAgLy8gZXNzZW50aWFsbHkgY29tcGF0aWJsZS4gSXQgc2hvdWxkIGJlIGluIEVtaXRDb21tb25OZW9uQnVpbHRpbkV4cHIgYWZ0ZXIKKyAgICAvLyB0aGUgZmluYWwgbWVyZ2UuCisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3Nxc2hsdTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZxc2hsdV9uIiwgMSwgZmFsc2UpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnFzaHJ1bl9uX3Y6CisgICAgLy8gRklYTUU6IGFzIGFib3ZlCisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3Nxc2hydW47CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cXNocnVuX24iKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxcnNocnVuX25fdjoKKyAgICAvLyBGSVhNRTogYW5kIGFnYWluLgorICAgIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl9zcXJzaHJ1bjsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZxcnNocnVuX24iKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zxc2hybl9uX3Y6CisgICAgLy8gRklYTUU6IGd1ZXNzCisgICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtNjRfbmVvbl91cXNocm4gOiBJbnRyaW5zaWM6OmFybTY0X25lb25fc3FzaHJuOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnFzaHJuX24iKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc2hybl9uX3Y6CisgICAgLy8gRklYTUU6IHRoZXJlIG1pZ2h0IGJlIGEgcGF0dGVybiBoZXJlLgorICAgIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl9yc2hybjsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZyc2hybl9uIik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXJzaHJuX25fdjoKKyAgICAvLyBGSVhNRTogYW5vdGhlciBvbmUKKyAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm02NF9uZW9uX3VxcnNocm4gOiBJbnRyaW5zaWM6OmFybTY0X25lb25fc3Fyc2hybjsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZxcnNocm5fbiIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZGFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRhcV92OiB7CisgICAgSW50ID0gSW50cmluc2ljOjpyb3VuZDsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZybmRhIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRpX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kaXFfdjogeworICAgIEludCA9IEludHJpbnNpYzo6bmVhcmJ5aW50OworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnJuZGkiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZG1fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRtcV92OiB7CisgICAgSW50ID0gSW50cmluc2ljOjpmbG9vcjsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZybmRtIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZybmRuX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kbnFfdjogeworICAgIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl9mcmludG47CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cm5kbiIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kcF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZHBxX3Y6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmNlaWw7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cm5kcCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5keF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJuZHhxX3Y6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OnJpbnQ7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cm5keCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cm5kcV92OiB7CisgICAgSW50ID0gSW50cmluc2ljOjp0cnVuYzsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZybmR6Iik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZXF6X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2VxenFfdjoKKyAgICByZXR1cm4gRW1pdEFBcmNoNjRDb21wYXJlQnVpbHRpbkV4cHIoT3BzWzBdLCBUeSwgSUNtcEluc3Q6OkZDTVBfT0VRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6SUNNUF9FUSwgInZjZXF6Iik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2dlel92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNnZXpxX3Y6CisgICAgcmV0dXJuIEVtaXRBQXJjaDY0Q29tcGFyZUJ1aWx0aW5FeHByKE9wc1swXSwgVHksIElDbXBJbnN0OjpGQ01QX09HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OklDTVBfU0dFLCAidmNnZXoiKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjbGV6X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2xlenFfdjoKKyAgICByZXR1cm4gRW1pdEFBcmNoNjRDb21wYXJlQnVpbHRpbkV4cHIoT3BzWzBdLCBUeSwgSUNtcEluc3Q6OkZDTVBfT0xFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6SUNNUF9TTEUsICJ2Y2xleiIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNndHpfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjZ3R6cV92OgorICAgIHJldHVybiBFbWl0QUFyY2g2NENvbXBhcmVCdWlsdGluRXhwcihPcHNbMF0sIFR5LCBJQ21wSW5zdDo6RkNNUF9PR1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDbXBJbnN0OjpJQ01QX1NHVCwgInZjZ3R6Iik7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y2x0el92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmNsdHpxX3Y6CisgICAgcmV0dXJuIEVtaXRBQXJjaDY0Q29tcGFyZUJ1aWx0aW5FeHByKE9wc1swXSwgVHksIElDbXBJbnN0OjpGQ01QX09MVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNtcEluc3Q6OklDTVBfU0xULCAidmNsdHoiKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjY0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9mNjRfdjoKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CisgICAgVHkgPSBHZXROZW9uVHlwZSh0aGlzLCBOZW9uVHlwZUZsYWdzKE5lb25UeXBlRmxhZ3M6OkZsb2F0NjQsIGZhbHNlLCBxdWFkKSk7CisgICAgcmV0dXJuIHVzZ24gPyBCdWlsZGVyLkNyZWF0ZVVJVG9GUChPcHNbMF0sIFR5LCAidmN2dCIpCisgICAgICAgICAgICAgICAgOiBCdWlsZGVyLkNyZWF0ZVNJVG9GUChPcHNbMF0sIFR5LCAidmN2dCIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF9mNjRfZjMyOiB7CisgICAgYXNzZXJ0KFR5cGUuZ2V0RWx0VHlwZSgpID09IE5lb25UeXBlRmxhZ3M6OkZsb2F0NjQgJiYgcXVhZCAmJgorICAgICAgICAgICAidW5leHBlY3RlZCB2Y3Z0X2Y2NF9mMzIgYnVpbHRpbiIpOworICAgIE5lb25UeXBlRmxhZ3MgU3JjRmxhZyA9IE5lb25UeXBlRmxhZ3MoTmVvblR5cGVGbGFnczo6RmxvYXQzMiwgZmFsc2UsIGZhbHNlKTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBHZXROZW9uVHlwZSh0aGlzLCBTcmNGbGFnKSk7CisKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVGUEV4dChPcHNbMF0sIFR5LCAidmN2dCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X2YzMl9mNjQ6IHsKKyAgICBhc3NlcnQoVHlwZS5nZXRFbHRUeXBlKCkgPT0gTmVvblR5cGVGbGFnczo6RmxvYXQzMiAmJgorICAgICAgICAgICAidW5leHBlY3RlZCB2Y3Z0X2YzMl9mNjQgYnVpbHRpbiIpOworICAgIE5lb25UeXBlRmxhZ3MgU3JjRmxhZyA9IE5lb25UeXBlRmxhZ3MoTmVvblR5cGVGbGFnczo6RmxvYXQ2NCwgZmFsc2UsIHRydWUpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIEdldE5lb25UeXBlKHRoaXMsIFNyY0ZsYWcpKTsKKworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUZQVHJ1bmMoT3BzWzBdLCBUeSwgInZjdnQiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF9zMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRfdTMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0X3M2NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dF91NjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX3MzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHFfdTMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cV9zNjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRxX3U2NF92OiB7CisgICAgYm9vbCBEb3VibGUgPQorICAgICAgKGNhc3Q8bGx2bTo6SW50ZWdlclR5cGU+KFZUeS0+Z2V0RWxlbWVudFR5cGUoKSktPmdldEJpdFdpZHRoKCkgPT0gNjQpOworICAgIGxsdm06OlR5cGUgKkluVHkgPQorICAgICAgR2V0TmVvblR5cGUodGhpcywKKyAgICAgICAgICAgICAgICAgIE5lb25UeXBlRmxhZ3MoRG91YmxlID8gTmVvblR5cGVGbGFnczo6RmxvYXQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5lb25UeXBlRmxhZ3M6OkZsb2F0MzIsIGZhbHNlLCBxdWFkKSk7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgSW5UeSk7CisgICAgaWYgKHVzZ24pCisgICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVGUFRvVUkoT3BzWzBdLCBUeSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlRlBUb1NJKE9wc1swXSwgVHkpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YV9zMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhcV9zMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhX3UzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGFxX3UzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dGFfczY0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YXFfczY0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0YV91NjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRhcV91NjRfdjogeworICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybTY0X25lb25fZmN2dGF1IDogSW50cmluc2ljOjphcm02NF9uZW9uX2ZjdnRhczsKKyAgICBib29sIERvdWJsZSA9CisgICAgICAoY2FzdDxsbHZtOjpJbnRlZ2VyVHlwZT4oVlR5LT5nZXRFbGVtZW50VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKSA9PSA2NCk7CisgICAgbGx2bTo6VHlwZSAqSW5UeSA9CisgICAgICBHZXROZW9uVHlwZSh0aGlzLAorICAgICAgICAgICAgICAgICAgTmVvblR5cGVGbGFncyhEb3VibGUgPyBOZW9uVHlwZUZsYWdzOjpGbG9hdDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTmVvblR5cGVGbGFnczo6RmxvYXQzMiwgZmFsc2UsIHF1YWQpKTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBJblR5IH07CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmN2dGEiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG1fczMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bXFfczMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bV91MzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtcV91MzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRtX3M2NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG1xX3M2NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG1fdTY0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bXFfdTY0X3Y6IHsKKyAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm02NF9uZW9uX2ZjdnRtdSA6IEludHJpbnNpYzo6YXJtNjRfbmVvbl9mY3Z0bXM7CisgICAgYm9vbCBEb3VibGUgPQorICAgICAgKGNhc3Q8bGx2bTo6SW50ZWdlclR5cGU+KFZUeS0+Z2V0RWxlbWVudFR5cGUoKSktPmdldEJpdFdpZHRoKCkgPT0gNjQpOworICAgIGxsdm06OlR5cGUgKkluVHkgPQorICAgICAgR2V0TmVvblR5cGUodGhpcywKKyAgICAgICAgICAgICAgICAgIE5lb25UeXBlRmxhZ3MoRG91YmxlID8gTmVvblR5cGVGbGFnczo6RmxvYXQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5lb25UeXBlRmxhZ3M6OkZsb2F0MzIsIGZhbHNlLCBxdWFkKSk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgSW5UeSB9OworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZjdnRtIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRuX3MzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5xX3MzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5fdTMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bnFfdTMyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0bl9zNjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRucV9zNjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRuX3U2NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dG5xX3U2NF92OiB7CisgICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtNjRfbmVvbl9mY3Z0bnUgOiBJbnRyaW5zaWM6OmFybTY0X25lb25fZmN2dG5zOworICAgIGJvb2wgRG91YmxlID0KKyAgICAgIChjYXN0PGxsdm06OkludGVnZXJUeXBlPihWVHktPmdldEVsZW1lbnRUeXBlKCkpLT5nZXRCaXRXaWR0aCgpID09IDY0KTsKKyAgICBsbHZtOjpUeXBlICpJblR5ID0KKyAgICAgIEdldE5lb25UeXBlKHRoaXMsCisgICAgICAgICAgICAgICAgICBOZW9uVHlwZUZsYWdzKERvdWJsZSA/IE5lb25UeXBlRmxhZ3M6OkZsb2F0NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOZW9uVHlwZUZsYWdzOjpGbG9hdDMyLCBmYWxzZSwgcXVhZCkpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIEluVHkgfTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpLCBPcHMsICJ2Y3Z0biIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cF9zMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRwcV9zMzJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRwX3UzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHBxX3UzMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmN2dHBfczY0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfczY0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92Y3Z0cF91NjRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZjdnRwcV91NjRfdjogeworICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybTY0X25lb25fZmN2dHB1IDogSW50cmluc2ljOjphcm02NF9uZW9uX2ZjdnRwczsKKyAgICBib29sIERvdWJsZSA9CisgICAgICAoY2FzdDxsbHZtOjpJbnRlZ2VyVHlwZT4oVlR5LT5nZXRFbGVtZW50VHlwZSgpKS0+Z2V0Qml0V2lkdGgoKSA9PSA2NCk7CisgICAgbGx2bTo6VHlwZSAqSW5UeSA9CisgICAgICBHZXROZW9uVHlwZSh0aGlzLAorICAgICAgICAgICAgICAgICAgTmVvblR5cGVGbGFncyhEb3VibGUgPyBOZW9uVHlwZUZsYWdzOjpGbG9hdDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTmVvblR5cGVGbGFnczo6RmxvYXQzMiwgZmFsc2UsIHF1YWQpKTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBJblR5IH07CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmN2dHAiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm11bHhfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZtdWx4cV92OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX2ZtdWx4OworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidm11bHgiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm11bF9sYW5lX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bXVsX2xhbmVxX3Y6IHsKKyAgICAvLyB2MWY2NCB2bXVsX2xhbmUgc2hvdWxkIGJlIG1hcHBlZCB0byBOZW9uIHNjYWxhciBtdWwgbGFuZQorICAgIGJvb2wgUXVhZCA9IGZhbHNlOworICAgIGlmIChCdWlsdGluSUQgPT0gTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bXVsX2xhbmVxX3YpCisgICAgICBRdWFkID0gdHJ1ZTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBEb3VibGVUeSk7CisgICAgbGx2bTo6VHlwZSAqVlR5ID0gR2V0TmVvblR5cGUodGhpcywKKyAgICAgIE5lb25UeXBlRmxhZ3MoTmVvblR5cGVGbGFnczo6RmxvYXQ2NCwgZmFsc2UsIFF1YWQpKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBWVHkpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoT3BzWzFdLCBPcHNbMl0sICJleHRyYWN0Iik7CisgICAgVmFsdWUgKlJlc3VsdCA9IEJ1aWxkZXIuQ3JlYXRlRk11bChPcHNbMF0sIE9wc1sxXSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChSZXN1bHQsIFR5KTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm5lZ2RfczY0OgorICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZU5lZyhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpLCAidm5lZ2QiKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWF4bm1fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZwbWF4bm1xX3Y6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fZm1heG5tcDsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSksIE9wcywgInZwbWF4bm0iKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBtaW5ubV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnBtaW5ubXFfdjogeworICAgIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl9mbWlubm1wOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnBtaW5ubSIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3FydF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNxcnRxX3Y6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OnNxcnQ7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnNxcnQiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnJiaXRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZyYml0cV92OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3JiaXQ7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2cmJpdCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92YWRkdl91ODoKKyAgICAvLyBGSVhNRTogVGhlc2UgYXJlIGhhbmRsZWQgYnkgdGhlIEFBcmNoNjQgc2NhbGFyIGNvZGUuCisgICAgdXNnbiA9IHRydWU7CisgICAgLy8gRkFMTFRIUk9VR0gKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGR2X3M4OiB7CisgICAgSW50ID0gdXNnbiA/IEludHJpbnNpYzo6YXJtNjRfbmVvbl91YWRkdiA6IEludHJpbnNpYzo6YXJtNjRfbmVvbl9zYWRkdjsKKyAgICBUeSA9IGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMzIpOworICAgIFZUeSA9CisgICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXQobGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCA4KSwgOCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZhZGR2Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCkpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92YWRkdl91MTY6CisgICAgdXNnbiA9IHRydWU7CisgICAgLy8gRkFMTFRIUk9VR0gKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGR2X3MxNjogeworICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybTY0X25lb25fdWFkZHYgOiBJbnRyaW5zaWM6OmFybTY0X25lb25fc2FkZHY7CisgICAgVHkgPSBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDMyKTsKKyAgICBWVHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpLCA0KTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBWVHkgfTsKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSkpOworICAgIE9wc1swXSA9IEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmFkZHYiKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVUcnVuYyhPcHNbMF0sCisgICAgICAgICAgICAgbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAxNikpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92YWRkdnFfdTg6CisgICAgdXNnbiA9IHRydWU7CisgICAgLy8gRkFMTFRIUk9VR0gKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGR2cV9zODogeworICAgIEludCA9IHVzZ24gPyBJbnRyaW5zaWM6OmFybTY0X25lb25fdWFkZHYgOiBJbnRyaW5zaWM6OmFybTY0X25lb25fc2FkZHY7CisgICAgVHkgPSBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDMyKTsKKyAgICBWVHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCksIDE2KTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBWVHkgfTsKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSkpOworICAgIE9wc1swXSA9IEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmFkZHYiKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVUcnVuYyhPcHNbMF0sCisgICAgICAgICAgICAgbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCA4KSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGR2cV91MTY6CisgICAgdXNnbiA9IHRydWU7CisgICAgLy8gRkFMTFRIUk9VR0gKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGR2cV9zMTY6IHsKKyAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm02NF9uZW9uX3VhZGR2IDogSW50cmluc2ljOjphcm02NF9uZW9uX3NhZGR2OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgOCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZhZGR2Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1heHZfdTg6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fdW1heHY7CisgICAgVHkgPSBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDMyKTsKKyAgICBWVHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCksIDgpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIFZUeSB9OworICAgIE9wcy5wdXNoX2JhY2soRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDApKSk7CisgICAgT3BzWzBdID0gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpLCBPcHMsICJ2bWF4diIpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVRydW5jKE9wc1swXSwKKyAgICAgICAgICAgICBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDgpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1heHZfdTE2OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3VtYXh2OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgNCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtYXh2Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1heHZxX3U4OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3VtYXh2OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDgpLCAxNik7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtYXh2Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCkpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bWF4dnFfdTE2OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3VtYXh2OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgOCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtYXh2Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1heHZfczg6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fc21heHY7CisgICAgVHkgPSBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDMyKTsKKyAgICBWVHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCksIDgpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIFZUeSB9OworICAgIE9wcy5wdXNoX2JhY2soRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDApKSk7CisgICAgT3BzWzBdID0gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpLCBPcHMsICJ2bWF4diIpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVRydW5jKE9wc1swXSwKKyAgICAgICAgICAgICBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDgpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1heHZfczE2OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3NtYXh2OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgNCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtYXh2Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1heHZxX3M4OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3NtYXh2OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDgpLCAxNik7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtYXh2Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCkpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bWF4dnFfczE2OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3NtYXh2OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgOCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtYXh2Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1pbnZfdTg6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fdW1pbnY7CisgICAgVHkgPSBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDMyKTsKKyAgICBWVHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCksIDgpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIFZUeSB9OworICAgIE9wcy5wdXNoX2JhY2soRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDApKSk7CisgICAgT3BzWzBdID0gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpLCBPcHMsICJ2bWludiIpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVRydW5jKE9wc1swXSwKKyAgICAgICAgICAgICBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDgpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1pbnZfdTE2OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3VtaW52OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgNCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtaW52Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1pbnZxX3U4OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3VtaW52OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDgpLCAxNik7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtaW52Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCkpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bWludnFfdTE2OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3VtaW52OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgOCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtaW52Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1pbnZfczg6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fc21pbnY7CisgICAgVHkgPSBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDMyKTsKKyAgICBWVHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCksIDgpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVHksIFZUeSB9OworICAgIE9wcy5wdXNoX2JhY2soRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDApKSk7CisgICAgT3BzWzBdID0gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpLCBPcHMsICJ2bWludiIpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVRydW5jKE9wc1swXSwKKyAgICAgICAgICAgICBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDgpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1pbnZfczE2OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3NtaW52OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgNCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtaW52Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm1pbnZxX3M4OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3NtaW52OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDgpLCAxNik7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtaW52Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCkpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bWludnFfczE2OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3NtaW52OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgOCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZtaW52Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdm11bF9uX2Y2NDogeworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIERvdWJsZVR5KTsKKyAgICBWYWx1ZSAqUkhTID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygxKSksIERvdWJsZVR5KTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVGTXVsKE9wc1swXSwgUkhTKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFkZGx2X3U4OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3VhZGRsdjsKKyAgICBUeSA9IGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMzIpOworICAgIFZUeSA9CisgICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXQobGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCA4KSwgOCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZhZGRsdiIpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVRydW5jKE9wc1swXSwKKyAgICAgICAgICAgICBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGRsdl91MTY6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fdWFkZGx2OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgNCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpLCBPcHMsICJ2YWRkbHYiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFkZGx2cV91ODogeworICAgIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl91YWRkbHY7CisgICAgVHkgPSBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDMyKTsKKyAgICBWVHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCksIDE2KTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBWVHkgfTsKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSkpOworICAgIE9wc1swXSA9IEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmFkZGx2Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFkZGx2cV91MTY6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fdWFkZGx2OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgOCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpLCBPcHMsICJ2YWRkbHYiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFkZGx2X3M4OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3NhZGRsdjsKKyAgICBUeSA9IGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMzIpOworICAgIFZUeSA9CisgICAgICBsbHZtOjpWZWN0b3JUeXBlOjpnZXQobGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCA4KSwgOCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICBPcHNbMF0gPSBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5cyksIE9wcywgInZhZGRsdiIpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVRydW5jKE9wc1swXSwKKyAgICAgICAgICAgICBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZhZGRsdl9zMTY6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fc2FkZGx2OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgNCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpLCBPcHMsICJ2YWRkbHYiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFkZGx2cV9zODogeworICAgIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl9zYWRkbHY7CisgICAgVHkgPSBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDMyKTsKKyAgICBWVHkgPQorICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgOCksIDE2KTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFR5LCBWVHkgfTsKKyAgICBPcHMucHVzaF9iYWNrKEVtaXRTY2FsYXJFeHByKEUtPmdldEFyZygwKSkpOworICAgIE9wc1swXSA9IEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgT3BzLCAidmFkZGx2Iik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlVHJ1bmMoT3BzWzBdLAorICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgMTYpKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmFkZGx2cV9zMTY6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fc2FkZGx2OworICAgIFR5ID0gbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCAzMik7CisgICAgVlR5ID0KKyAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDE2KSwgOCk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBUeSwgVlR5IH07CisgICAgT3BzLnB1c2hfYmFjayhFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpKTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeXMpLCBPcHMsICJ2YWRkbHYiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNyaV9uX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3JpcV9uX3Y6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fdnNyaTsKKyAgICBsbHZtOjpGdW5jdGlvbiAqSW50cmluID0gQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKEludHJpbiwgT3BzLCAidnNyaV9uIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzbGlfbl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnNsaXFfbl92OiB7CisgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3ZzbGk7CisgICAgbGx2bTo6RnVuY3Rpb24gKkludHJpbiA9IENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSk7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChJbnRyaW4sIE9wcywgInZzbGlfbiIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3JhX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcmFxX25fdjoKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CisgICAgT3BzWzFdID0gRW1pdE5lb25SU2hpZnRJbW0oT3BzWzFdLCBPcHNbMl0sIFR5LCB1c2duLCAidnNyYV9uIik7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlQWRkKE9wc1swXSwgT3BzWzFdKTsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3JhX25fdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Zyc3JhcV9uX3Y6IHsKKyAgICBJbnQgPSB1c2duID8gSW50cmluc2ljOjphcm02NF9uZW9uX3Vyc2hsIDogSW50cmluc2ljOjphcm02NF9uZW9uX3Nyc2hsOworICAgIFNtYWxsVmVjdG9yPGxsdm06OlZhbHVlKiwyPiBUbXBPcHM7CisgICAgVG1wT3BzLnB1c2hfYmFjayhPcHNbMV0pOworICAgIFRtcE9wcy5wdXNoX2JhY2soT3BzWzJdKTsKKyAgICBGdW5jdGlvbiogRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50LCBUeSk7CisgICAgbGx2bTo6VmFsdWUgKnRtcCA9IEVtaXROZW9uQ2FsbChGLCBUbXBPcHMsICJ2cnNocl9uIiwgMSwgdHJ1ZSk7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVlR5KTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVBZGQoT3BzWzBdLCB0bXApOworICB9CisgICAgLy8gRklYTUU6IFNoYXJpbmcgbG9hZHMgJiBzdG9yZXMgd2l0aCAzMi1iaXQgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGFic2VuY2UKKyAgICAvLyBvZiBhbiBBbGlnbiBwYXJhbWV0ZXIgaGVyZS4KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDJfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3gyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxX3gzX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94M192OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV94NF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMXFfeDRfdjogeworICAgIGxsdm06OlR5cGUgKlBUeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVlR5LT5nZXRWZWN0b3JFbGVtZW50VHlwZSgpKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBQVHkpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVlR5LCBQVHkgfTsKKyAgICB1bnNpZ25lZCBJbnQ7CisgICAgc3dpdGNoIChCdWlsdGluSUQpIHsKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV94Ml92OgorICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxcV94Ml92OgorICAgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX2xkMXgyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdjoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMXFfeDNfdjoKKyAgICAgIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl9sZDF4MzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxX3g0X3Y6CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3g0X3Y6CisgICAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fbGQxeDQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUNhbGwoRiwgT3BzWzFdLCAidmxkMXhOIik7CisgICAgVHkgPSBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKE9wc1sxXS0+Z2V0VHlwZSgpKTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU3RvcmUoT3BzWzFdLCBPcHNbMF0pOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxX3gyX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94Ml92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MV94M192OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MXFfeDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX3g0X3Y6IHsKKyAgICBsbHZtOjpUeXBlICpQVHkgPSBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFZUeS0+Z2V0VmVjdG9yRWxlbWVudFR5cGUoKSk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBWVHksIFBUeSB9OworICAgIHVuc2lnbmVkIEludDsKKyAgICBzd2l0Y2ggKEJ1aWx0aW5JRCkgeworICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxX3gyX3Y6CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gyX3Y6CisgICAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fc3QxeDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MV94M192OgorICAgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV94M192OgorICAgICAgSW50ID0gSW50cmluc2ljOjphcm02NF9uZW9uX3N0MXgzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDFfeDRfdjoKKyAgICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MXFfeDRfdjoKKyAgICAgIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl9zdDF4NDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBTbWFsbFZlY3RvcjxWYWx1ZSAqLCA0PiBJbnRPcHMoT3BzLmJlZ2luKCkrMSwgT3BzLmVuZCgpKTsKKyAgICBJbnRPcHMucHVzaF9iYWNrKE9wc1swXSk7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHlzKSwgSW50T3BzLCAiIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3Y6CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChWVHkpKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVMb2FkKE9wc1swXSk7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV92OgorICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVlR5KSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVlR5KTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTdG9yZShPcHNbMV0sIE9wc1swXSk7CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQxX2xhbmVfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2xhbmVfdjoKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBUeSk7CisgICAgVHkgPSBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFZUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlTG9hZChPcHNbMF0pOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUluc2VydEVsZW1lbnQoT3BzWzFdLCBPcHNbMF0sIE9wc1syXSwgInZsZDFfbGFuZSIpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMV9kdXBfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2R1cF92OiB7CisgICAgVmFsdWUgKlYgPSBVbmRlZlZhbHVlOjpnZXQoVHkpOworICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChWVHktPmdldEVsZW1lbnRUeXBlKCkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUxvYWQoT3BzWzBdKTsKKyAgICBsbHZtOjpDb25zdGFudCAqQ0kgPSBDb25zdGFudEludDo6Z2V0KEludDMyVHksIDApOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlSW5zZXJ0RWxlbWVudChWLCBPcHNbMF0sIENJKTsKKyAgICByZXR1cm4gRW1pdE5lb25TcGxhdChPcHNbMF0sIENJKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MV9sYW5lX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QxcV9sYW5lX3Y6CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoT3BzWzFdLCBPcHNbMl0pOworICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU3RvcmUoT3BzWzFdLCBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBUeSkpOworICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMnFfdjogeworICAgIGxsdm06OlR5cGUgKlBUeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVlR5KTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBQVHkpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVlR5LCBQVHkgfTsKKyAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9uZW9uX2xkMiwgVHlzKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUNhbGwoRiwgT3BzWzFdLCAidmxkMiIpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sCisgICAgICAgICAgICAgICAgbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM192OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM3FfdjogeworICAgIGxsdm06OlR5cGUgKlBUeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVlR5KTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBQVHkpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVlR5LCBQVHkgfTsKKyAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9uZW9uX2xkMywgVHlzKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUNhbGwoRiwgT3BzWzFdLCAidmxkMyIpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sCisgICAgICAgICAgICAgICAgbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkNF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkNHFfdjogeworICAgIGxsdm06OlR5cGUgKlBUeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVlR5KTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBQVHkpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVlR5LCBQVHkgfTsKKyAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9uZW9uX2xkNCwgVHlzKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUNhbGwoRiwgT3BzWzFdLCAidmxkNCIpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sCisgICAgICAgICAgICAgICAgbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMl9kdXBfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDJxX2R1cF92OiB7CisgICAgbGx2bTo6VHlwZSAqUFR5ID0KKyAgICAgIGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVlR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBQVHkpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVlR5LCBQVHkgfTsKKyAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9uZW9uX2xkMnIsIFR5cyk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVDYWxsKEYsIE9wc1sxXSwgInZsZDIiKTsKKyAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLAorICAgICAgICAgICAgICAgIGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoT3BzWzFdLT5nZXRUeXBlKCkpKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTdG9yZShPcHNbMV0sIE9wc1swXSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdjogeworICAgIGxsdm06OlR5cGUgKlBUeSA9CisgICAgICBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFZUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgUFR5KTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFZUeSwgUFR5IH07CisgICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtNjRfbmVvbl9sZDNyLCBUeXMpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQ2FsbChGLCBPcHNbMV0sICJ2bGQzIik7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwKKyAgICAgICAgICAgICAgICBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKE9wc1sxXS0+Z2V0VHlwZSgpKSk7CisgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlU3RvcmUoT3BzWzFdLCBPcHNbMF0pOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQ0X2R1cF92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkNHFfZHVwX3Y6IHsKKyAgICBsbHZtOjpUeXBlICpQVHkgPQorICAgICAgbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChWVHktPmdldEVsZW1lbnRUeXBlKCkpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMV0sIFBUeSk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBWVHksIFBUeSB9OworICAgIEZ1bmN0aW9uICpGID0gQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X25lb25fbGQ0ciwgVHlzKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUNhbGwoRiwgT3BzWzFdLCAidmxkNCIpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sCisgICAgICAgICAgICAgICAgbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkMl9sYW5lX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQycV9sYW5lX3Y6IHsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFZUeSwgT3BzWzFdLT5nZXRUeXBlKCkgfTsKKyAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9uZW9uX2xkMmxhbmUsIFR5cyk7CisgICAgT3BzLnB1c2hfYmFjayhPcHNbMV0pOworICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKSsxKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBUeSk7CisgICAgT3BzWzJdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1syXSwgVHkpOworICAgIE9wc1szXSA9IEJ1aWxkZXIuQ3JlYXRlWkV4dChPcHNbM10sCisgICAgICAgICAgICAgICAgbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCA2NCkpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQ2FsbChGLAorICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlKj4oT3BzKS5zbGljZSgxKSwgInZsZDJfbGFuZSIpOworICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSk7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkM19sYW5lX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92bGQzcV9sYW5lX3Y6IHsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFZUeSwgT3BzWzFdLT5nZXRUeXBlKCkgfTsKKyAgICBGdW5jdGlvbiAqRiA9IENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9uZW9uX2xkM2xhbmUsIFR5cyk7CisgICAgT3BzLnB1c2hfYmFjayhPcHNbMV0pOworICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKSsxKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBUeSk7CisgICAgT3BzWzJdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1syXSwgVHkpOworICAgIE9wc1szXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbM10sIFR5KTsKKyAgICBPcHNbNF0gPSBCdWlsZGVyLkNyZWF0ZVpFeHQoT3BzWzRdLAorICAgICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgNjQpKTsKKyAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUNhbGwoRiwKKyAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSo+KE9wcykuc2xpY2UoMSksICJ2bGQzX2xhbmUiKTsKKyAgICBUeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoT3BzWzFdLT5nZXRUeXBlKCkpOworICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIFR5KTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVTdG9yZShPcHNbMV0sIE9wc1swXSk7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZsZDRfbGFuZV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdmxkNHFfbGFuZV92OiB7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBWVHksIE9wc1sxXS0+Z2V0VHlwZSgpIH07CisgICAgRnVuY3Rpb24gKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtNjRfbmVvbl9sZDRsYW5lLCBUeXMpOworICAgIE9wcy5wdXNoX2JhY2soT3BzWzFdKTsKKyAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkrMSk7CisgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOworICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMl0sIFR5KTsKKyAgICBPcHNbM10gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzNdLCBUeSk7CisgICAgT3BzWzRdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1s0XSwgVHkpOworICAgIE9wc1s1XSA9IEJ1aWxkZXIuQ3JlYXRlWkV4dChPcHNbNV0sCisgICAgICAgICAgICAgICAgbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCA2NCkpOworICAgIE9wc1sxXSA9IEJ1aWxkZXIuQ3JlYXRlQ2FsbChGLAorICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlKj4oT3BzKS5zbGljZSgxKSwgInZsZDRfbGFuZSIpOworICAgIFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChPcHNbMV0tPmdldFR5cGUoKSk7CisgICAgT3BzWzBdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1swXSwgVHkpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZVN0b3JlKE9wc1sxXSwgT3BzWzBdKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0Ml92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MnFfdjogeworICAgIE9wcy5wdXNoX2JhY2soT3BzWzBdKTsKKyAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVlR5LCBPcHNbMl0tPmdldFR5cGUoKSB9OworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X25lb25fc3QyLCBUeXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAiIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92OiB7CisgICAgT3BzLnB1c2hfYmFjayhPcHNbMF0pOworICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKSk7CisgICAgT3BzWzJdID0gQnVpbGRlci5DcmVhdGVaRXh0KE9wc1syXSwKKyAgICAgICAgICAgICAgICBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldExMVk1Db250ZXh0KCksIDY0KSk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBWVHksIE9wc1szXS0+Z2V0VHlwZSgpIH07CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtNjRfbmVvbl9zdDJsYW5lLCBUeXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAiIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNxX3Y6IHsKKyAgICBPcHMucHVzaF9iYWNrKE9wc1swXSk7CisgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpKTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFZUeSwgT3BzWzNdLT5nZXRUeXBlKCkgfTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9uZW9uX3N0MywgVHlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgIiIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3QzX2xhbmVfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzdDNxX2xhbmVfdjogeworICAgIE9wcy5wdXNoX2JhY2soT3BzWzBdKTsKKyAgICBPcHMuZXJhc2UoT3BzLmJlZ2luKCkpOworICAgIE9wc1szXSA9IEJ1aWxkZXIuQ3JlYXRlWkV4dChPcHNbM10sCisgICAgICAgICAgICAgICAgbGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRMTFZNQ29udGV4dCgpLCA2NCkpOworICAgIGxsdm06OlR5cGUgKlR5c1syXSA9IHsgVlR5LCBPcHNbNF0tPmdldFR5cGUoKSB9OworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X25lb25fc3QzbGFuZSwgVHlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgIiIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3Q0X3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3Q0cV92OiB7CisgICAgT3BzLnB1c2hfYmFjayhPcHNbMF0pOworICAgIE9wcy5lcmFzZShPcHMuYmVnaW4oKSk7CisgICAgbGx2bTo6VHlwZSAqVHlzWzJdID0geyBWVHksIE9wc1s0XS0+Z2V0VHlwZSgpIH07CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtNjRfbmVvbl9zdDQsIFR5cyksCisgICAgICAgICAgICAgICAgICAgICAgICBPcHMsICIiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnN0NF9sYW5lX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3Y6IHsKKyAgICBPcHMucHVzaF9iYWNrKE9wc1swXSk7CisgICAgT3BzLmVyYXNlKE9wcy5iZWdpbigpKTsKKyAgICBPcHNbNF0gPSBCdWlsZGVyLkNyZWF0ZVpFeHQoT3BzWzRdLAorICAgICAgICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgNjQpKTsKKyAgICBsbHZtOjpUeXBlICpUeXNbMl0gPSB7IFZUeSwgT3BzWzVdLT5nZXRUeXBlKCkgfTsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9uZW9uX3N0NGxhbmUsIFR5cyksCisgICAgICAgICAgICAgICAgICAgICAgICBPcHMsICIiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRybl92OgorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnRybnFfdjogewogICAgIE9wc1swXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMF0sIGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoVHkpKTsKICAgICBPcHNbMV0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzFdLCBUeSk7CiAgICAgT3BzWzJdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1syXSwgVHkpOwpAQCAtNDg2NSw4ICs2NzE0LDggQEAKICAgICBmb3IgKHVuc2lnbmVkIHZpID0gMDsgdmkgIT0gMjsgKyt2aSkgewogICAgICAgU21hbGxWZWN0b3I8Q29uc3RhbnQqLCAxNj4gSW5kaWNlczsKICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7IGkgIT0gZTsgaSArPSAyKSB7Ci0gICAgICAgIEluZGljZXMucHVzaF9iYWNrKEJ1aWxkZXIuZ2V0SW50MzIoaSt2aSkpOwotICAgICAgICBJbmRpY2VzLnB1c2hfYmFjayhCdWlsZGVyLmdldEludDMyKGkrZSt2aSkpOworICAgICAgICBJbmRpY2VzLnB1c2hfYmFjayhDb25zdGFudEludDo6Z2V0KEludDMyVHksIGkrdmkpKTsKKyAgICAgICAgSW5kaWNlcy5wdXNoX2JhY2soQ29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCBpK2UrdmkpKTsKICAgICAgIH0KICAgICAgIFZhbHVlICpBZGRyID0gQnVpbGRlci5DcmVhdGVDb25zdEluQm91bmRzR0VQMV8zMihPcHNbMF0sIHZpKTsKICAgICAgIFNWID0gbGx2bTo6Q29uc3RhbnRWZWN0b3I6OmdldChJbmRpY2VzKTsKQEAgLTQ4NzUsOCArNjcyNCw4IEBACiAgICAgfQogICAgIHJldHVybiBTVjsKICAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92dXpwX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Z1enBxX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z1enBfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z1enBxX3Y6IHsKICAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5KSk7CiAgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOwogICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMl0sIFR5KTsKQEAgLTQ4OTQsOCArNjc0Myw4IEBACiAgICAgfQogICAgIHJldHVybiBTVjsKICAgfQotICBjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl92emlwX3Y6Ci0gIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uX3Z6aXBxX3Y6IHsKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z6aXBfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3Z6aXBxX3Y6IHsKICAgICBPcHNbMF0gPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoT3BzWzBdLCBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFR5KSk7CiAgICAgT3BzWzFdID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9wc1sxXSwgVHkpOwogICAgIE9wc1syXSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChPcHNbMl0sIFR5KTsKQEAgLTQ5MTQsNiArNjc2Myw0OCBAQAogICAgIH0KICAgICByZXR1cm4gU1Y7CiAgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsMXFfdjogeworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X25lb25fdGJsMSwgVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnRibDEiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YmwycV92OiB7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtNjRfbmVvbl90YmwyLCBUeSksCisgICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJ2dGJsMiIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRibDNxX3Y6IHsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9uZW9uX3RibDMsIFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZ0YmwzIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJsNHFfdjogeworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X25lb25fdGJsNCwgVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnRibDQiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0YngxcV92OiB7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtNjRfbmVvbl90YngxLCBUeSksCisgICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJ2dGJ4MSIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92cXRieDJxX3Y6IHsKKyAgICByZXR1cm4gRW1pdE5lb25DYWxsKENHTS5nZXRJbnRyaW5zaWMoSW50cmluc2ljOjphcm02NF9uZW9uX3RieDIsIFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wcywgInZ0YngyIik7CisgIH0KKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZxdGJ4M3FfdjogeworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnRyaW5zaWM6OmFybTY0X25lb25fdGJ4MywgVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgT3BzLCAidnRieDMiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnF0Yng0cV92OiB7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6YXJtNjRfbmVvbl90Yng0LCBUeSksCisgICAgICAgICAgICAgICAgICAgICAgICBPcHMsICJ2dGJ4NCIpOworICB9CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92c3FhZGRfdjoKKyAgY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uX3ZzcWFkZHFfdjogeworICAgIEludCA9IEludHJpbnNpYzo6YXJtNjRfbmVvbl91c3FhZGQ7CisgICAgcmV0dXJuIEVtaXROZW9uQ2FsbChDR00uZ2V0SW50cmluc2ljKEludCwgVHkpLCBPcHMsICJ2c3FhZGQiKTsKKyAgfQorICBjYXNlIE5FT046OkJJX19idWlsdGluX25lb25fdnVxYWRkX3Y6CisgIGNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl92dXFhZGRxX3Y6IHsKKyAgICBJbnQgPSBJbnRyaW5zaWM6OmFybTY0X25lb25fc3VxYWRkOworICAgIHJldHVybiBFbWl0TmVvbkNhbGwoQ0dNLmdldEludHJpbnNpYyhJbnQsIFR5KSwgT3BzLCAidnVxYWRkIik7CisgIH0KICAgfQogfQogCkBAIC00OTcwLDYgKzY4NjEsMTQgQEAKIAogICBzd2l0Y2ggKEJ1aWx0aW5JRCkgewogICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgY2FzZSBYODY6OkJJX21tX3ByZWZldGNoOiB7CisgICAgVmFsdWUgKkFkZHJlc3MgPSBFbWl0U2NhbGFyRXhwcihFLT5nZXRBcmcoMCkpOworICAgIFZhbHVlICpSVyA9IENvbnN0YW50SW50OjpnZXQoSW50MzJUeSwgMCk7CisgICAgVmFsdWUgKkxvY2FsaXR5ID0gRW1pdFNjYWxhckV4cHIoRS0+Z2V0QXJnKDEpKTsKKyAgICBWYWx1ZSAqRGF0YSA9IENvbnN0YW50SW50OjpnZXQoSW50MzJUeSwgMSk7CisgICAgVmFsdWUgKkYgPSBDR00uZ2V0SW50cmluc2ljKEludHJpbnNpYzo6cHJlZmV0Y2gpOworICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUNhbGw0KEYsIEFkZHJlc3MsIFJXLCBMb2NhbGl0eSwgRGF0YSk7CisgIH0KICAgY2FzZSBYODY6OkJJX19idWlsdGluX2lhMzJfdmVjX2luaXRfdjhxaToKICAgY2FzZSBYODY6OkJJX19idWlsdGluX2lhMzJfdmVjX2luaXRfdjRoaToKICAgY2FzZSBYODY6OkJJX19idWlsdGluX2lhMzJfdmVjX2luaXRfdjJzaToKZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHQ1VEQU5WLmNwcCBiL2xpYi9Db2RlR2VuL0NHQ1VEQU5WLmNwcAppbmRleCAwZWJmMWFhLi5mYjExNzUxIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0NVREFOVi5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ0dDVURBTlYuY3BwCkBAIC0xNyw5ICsxNyw5IEBACiAjaW5jbHVkZSAiQ29kZUdlbk1vZHVsZS5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCiAjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgogI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCiAjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKQEAgLTM5LDcgKzM5LDcgQEAKIHB1YmxpYzoKICAgQ0dOVkNVREFSdW50aW1lKENvZGVHZW5Nb2R1bGUgJkNHTSk7CiAKLSAgdm9pZCBFbWl0RGV2aWNlU3R1YkJvZHkoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZ1bmN0aW9uQXJnTGlzdCAmQXJncyk7CisgIHZvaWQgRW1pdERldmljZVN0dWJCb2R5KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGdW5jdGlvbkFyZ0xpc3QgJkFyZ3MpIG92ZXJyaWRlOwogfTsKIAogfQpkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ0dDVURBUnVudGltZS5jcHAgYi9saWIvQ29kZUdlbi9DR0NVREFSdW50aW1lLmNwcAppbmRleCBlYWYzMWJiLi41NGEyOGY1IDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0NVREFSdW50aW1lLmNwcAorKysgYi9saWIvQ29kZUdlbi9DR0NVREFSdW50aW1lLmNwcApAQCAtMzEsNyArMzEsOCBAQAogICBsbHZtOjpCYXNpY0Jsb2NrICpDb250QmxvY2sgPSBDR0YuY3JlYXRlQmFzaWNCbG9jaygia2NhbGwuZW5kIik7CiAKICAgQ29kZUdlbkZ1bmN0aW9uOjpDb25kaXRpb25hbEV2YWx1YXRpb24gZXZhbChDR0YpOwotICBDR0YuRW1pdEJyYW5jaE9uQm9vbEV4cHIoRS0+Z2V0Q29uZmlnKCksIENvbnRCbG9jaywgQ29uZmlnT0tCbG9jayk7CisgIENHRi5FbWl0QnJhbmNoT25Cb29sRXhwcihFLT5nZXRDb25maWcoKSwgQ29udEJsb2NrLCBDb25maWdPS0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUcnVlQ291bnQ9Ki8wKTsKIAogICBldmFsLmJlZ2luKENHRik7CiAgIENHRi5FbWl0QmxvY2soQ29uZmlnT0tCbG9jayk7CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR0NYWC5jcHAgYi9saWIvQ29kZUdlbi9DR0NYWC5jcHAKaW5kZXggY2ZiMmQ2Mi4uZWYyOWFmNyAxMDA2NDQKLS0tIGEvbGliL0NvZGVHZW4vQ0dDWFguY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHQ1hYLmNwcApAQCAtMzUsNyArMzUsNyBAQAogICAgIHJldHVybiB0cnVlOwogCiAgIC8vIFByb2R1Y2luZyBhbiBhbGlhcyB0byBhIGJhc2UgY2xhc3MgY3Rvci9kdG9yIGNhbiBkZWdyYWRlIGRlYnVnIHF1YWxpdHkKLSAgLy8gYXMgdGhlIGRlYnVnZ2VyIGNhbm5vdCB0ZWxsIHRoZW0gYXBwYXJ0LgorICAvLyBhcyB0aGUgZGVidWdnZXIgY2Fubm90IHRlbGwgdGhlbSBhcGFydC4KICAgaWYgKGdldENvZGVHZW5PcHRzKCkuT3B0aW1pemF0aW9uTGV2ZWwgPT0gMCkKICAgICByZXR1cm4gdHJ1ZTsKIApAQCAtNTYsMjIgKzU2LDIwIEBACiAKICAgLy8gSWYgYW55IGZpZWxkIGhhcyBhIG5vbi10cml2aWFsIGRlc3RydWN0b3IsIHdlIGhhdmUgdG8gZW1pdCB0aGUKICAgLy8gZGVzdHJ1Y3RvciBzZXBhcmF0ZWx5LgotICBmb3IgKENYWFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEkgPSBDbGFzcy0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBDbGFzcy0+ZmllbGRfZW5kKCk7IEkgIT0gRTsgKytJKQorICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBDbGFzcy0+ZmllbGRzKCkpCiAgICAgaWYgKEktPmdldFR5cGUoKS5pc0Rlc3RydWN0ZWRUeXBlKCkpCiAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAvLyBUcnkgdG8gZmluZCBhIHVuaXF1ZSBiYXNlIGNsYXNzIHdpdGggYSBub24tdHJpdmlhbCBkZXN0cnVjdG9yLgogICBjb25zdCBDWFhSZWNvcmREZWNsICpVbmlxdWVCYXNlID0gMDsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBDbGFzcy0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBDbGFzcy0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IENsYXNzLT5iYXNlcygpKSB7CiAKICAgICAvLyBXZSdyZSBpbiB0aGUgYmFzZSBkZXN0cnVjdG9yLCBzbyBza2lwIHZpcnR1YWwgYmFzZXMuCi0gICAgaWYgKEktPmlzVmlydHVhbCgpKSBjb250aW51ZTsKKyAgICBpZiAoSS5pc1ZpcnR1YWwoKSkgY29udGludWU7CiAKICAgICAvLyBTa2lwIGJhc2UgY2xhc3NlcyB3aXRoIHRyaXZpYWwgZGVzdHJ1Y3RvcnMuCiAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZQotICAgICAgPSBjYXN0PENYWFJlY29yZERlY2w+KEktPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKKyAgICAgID0gY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKICAgICBpZiAoQmFzZS0+aGFzVHJpdmlhbERlc3RydWN0b3IoKSkgY29udGludWU7CiAKICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGZvdW5kIGEgYmFzZSBjbGFzcyB3aXRoIGEgbm9uLXRyaXZpYWwKQEAgLTkyLDcgKzkwLDEzIEBACiAgIGlmICghQ2xhc3NMYXlvdXQuZ2V0QmFzZUNsYXNzT2Zmc2V0KFVuaXF1ZUJhc2UpLmlzWmVybygpKQogICAgIHJldHVybiB0cnVlOwogCisgIC8vIEdpdmUgdXAgaWYgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZG9uJ3QgbWF0Y2guIFdlIGNvdWxkIHVwZGF0ZSB0aGUgY2FsbCwKKyAgLy8gYnV0IGl0IGlzIHByb2JhYmx5IG5vdCB3b3J0aCBpdC4KICAgY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkJhc2VEID0gVW5pcXVlQmFzZS0+Z2V0RGVzdHJ1Y3RvcigpOworICBpZiAoQmFzZUQtPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpLT5nZXRDYWxsQ29udigpICE9CisgICAgICBELT5nZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uVHlwZT4oKS0+Z2V0Q2FsbENvbnYoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKwogICByZXR1cm4gVHJ5RW1pdERlZmluaXRpb25Bc0FsaWFzKEdsb2JhbERlY2woRCwgRHRvcl9CYXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxEZWNsKEJhc2VELCBEdG9yX0Jhc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKQEAgLTEwNyw3ICsxMTEsNyBAQAogICBpZiAoIWdldENvZGVHZW5PcHRzKCkuQ1hYQ3RvckR0b3JBbGlhc2VzKQogICAgIHJldHVybiB0cnVlOwogCi0gIC8vIFRoZSBhbGlhcyB3aWxsIHVzZSB0aGUgbGlua2FnZSBvZiB0aGUgcmVmZXJyZW50LiAgSWYgd2UgY2FuJ3QKKyAgLy8gVGhlIGFsaWFzIHdpbGwgdXNlIHRoZSBsaW5rYWdlIG9mIHRoZSByZWZlcmVudC4gIElmIHdlIGNhbid0CiAgIC8vIHN1cHBvcnQgYWxpYXNlcyB3aXRoIHRoYXQgbGlua2FnZSwgZmFpbC4KICAgbGx2bTo6R2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBMaW5rYWdlID0gZ2V0RnVuY3Rpb25MaW5rYWdlKEFsaWFzRGVjbCk7CiAKQEAgLTEzMCw3ICsxMzQsNyBAQAogICBsbHZtOjpQb2ludGVyVHlwZSAqQWxpYXNUeXBlCiAgICAgPSBnZXRUeXBlcygpLkdldEZ1bmN0aW9uVHlwZShBbGlhc0RlY2wpLT5nZXRQb2ludGVyVG8oKTsKIAotICAvLyBGaW5kIHRoZSByZWZlcnJlbnQuICBTb21lIGFsaWFzZXMgbWlnaHQgcmVxdWlyZSBhIGJpdGNhc3QsIGluCisgIC8vIEZpbmQgdGhlIHJlZmVyZW50LiAgU29tZSBhbGlhc2VzIG1pZ2h0IHJlcXVpcmUgYSBiaXRjYXN0LCBpbgogICAvLyB3aGljaCBjYXNlIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoZSBzb3VuZG5lc3MKICAgLy8gb2YgdGhlc2Ugc2VtYW50aWNzLgogICBsbHZtOjpHbG9iYWxWYWx1ZSAqUmVmID0gY2FzdDxsbHZtOjpHbG9iYWxWYWx1ZT4oR2V0QWRkck9mR2xvYmFsKFRhcmdldERlY2wpKTsKQEAgLTE0Myw3ICsxNDcsNyBAQAogICBpZiAobGx2bTo6R2xvYmFsVmFsdWU6OmlzRGlzY2FyZGFibGVJZlVudXNlZChMaW5rYWdlKSAmJgogICAgICAoVGFyZ2V0TGlua2FnZSAhPSBsbHZtOjpHbG9iYWxWYWx1ZTo6QXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UgfHwKICAgICAgICFUYXJnZXREZWNsLmdldERlY2woKS0+aGFzQXR0cjxBbHdheXNJbmxpbmVBdHRyPigpKSkgewotICAgIC8vIEZJWE1FOiBBbiBleHRlcm4gdGVtcGxhdGUgaW5zdGFuY2lhdGlvbiB3aWxsIGNyZWF0ZSBmdW5jdGlvbnMgd2l0aAorICAgIC8vIEZJWE1FOiBBbiBleHRlcm4gdGVtcGxhdGUgaW5zdGFudGlhdGlvbiB3aWxsIGNyZWF0ZSBmdW5jdGlvbnMgd2l0aAogICAgIC8vIGxpbmthZ2UgIkF2YWlsYWJsZUV4dGVybmFsbHkiLiBJbiBsaWJjKyssIHNvbWUgY2xhc3NlcyBhbHNvIGRlZmluZQogICAgIC8vIG1lbWJlcnMgd2l0aCBhdHRyaWJ1dGUgIkFsd2F5c0lubGluZSIgYW5kIGV4cGVjdCBubyByZWZlcmVuY2UgdG8KICAgICAvLyBiZSBnZW5lcmF0ZWQuIEl0IGlzIGRlc2lyYWJsZSB0byByZWVuYWJsZSB0aGlzIG9wdGltaXNhdGlvbiBhZnRlcgpAQCAtMTkwLDExICsxOTQsMTMgQEAKIAogdm9pZCBDb2RlR2VuTW9kdWxlOjpFbWl0Q1hYQ29uc3RydWN0b3IoY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ3RvclR5cGUgY3RvclR5cGUpIHsKLSAgLy8gVGhlIGNvbXBsZXRlIGNvbnN0cnVjdG9yIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJhc2UgY29uc3RydWN0b3IKLSAgLy8gZm9yIGNsYXNzZXMgd2l0aCBubyB2aXJ0dWFsIGJhc2VzLiAgVHJ5IHRvIGVtaXQgaXQgYXMgYW4gYWxpYXMuCi0gIGlmIChnZXRUYXJnZXQoKS5nZXRDWFhBQkkoKS5oYXNDb25zdHJ1Y3RvclZhcmlhbnRzKCkgJiYKLSAgICAgICFjdG9yLT5nZXRQYXJlbnQoKS0+Z2V0TnVtVkJhc2VzKCkgJiYKLSAgICAgIChjdG9yVHlwZSA9PSBDdG9yX0NvbXBsZXRlIHx8IGN0b3JUeXBlID09IEN0b3JfQmFzZSkpIHsKKyAgaWYgKCFnZXRUYXJnZXQoKS5nZXRDWFhBQkkoKS5oYXNDb25zdHJ1Y3RvclZhcmlhbnRzKCkpIHsKKyAgICAvLyBJZiB0aGVyZSBhcmUgbm8gY29uc3RydWN0b3IgdmFyaWFudHMsIGFsd2F5cyBlbWl0IHRoZSBjb21wbGV0ZSBkZXN0cnVjdG9yLgorICAgIGN0b3JUeXBlID0gQ3Rvcl9Db21wbGV0ZTsKKyAgfSBlbHNlIGlmICghY3Rvci0+Z2V0UGFyZW50KCktPmdldE51bVZCYXNlcygpICYmCisgICAgICAgICAgICAgKGN0b3JUeXBlID09IEN0b3JfQ29tcGxldGUgfHwgY3RvclR5cGUgPT0gQ3Rvcl9CYXNlKSkgeworICAgIC8vIFRoZSBjb21wbGV0ZSBjb25zdHJ1Y3RvciBpcyBlcXVpdmFsZW50IHRvIHRoZSBiYXNlIGNvbnN0cnVjdG9yCisgICAgLy8gZm9yIGNsYXNzZXMgd2l0aCBubyB2aXJ0dWFsIGJhc2VzLiAgVHJ5IHRvIGVtaXQgaXQgYXMgYW4gYWxpYXMuCiAgICAgYm9vbCBQcm9kdWNlZEFsaWFzID0KICAgICAgICAgIVRyeUVtaXREZWZpbml0aW9uQXNBbGlhcyhHbG9iYWxEZWNsKGN0b3IsIEN0b3JfQ29tcGxldGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbERlY2woY3RvciwgQ3Rvcl9CYXNlKSwgdHJ1ZSk7CkBAIC0yMDUsOCArMjExLDggQEAKICAgY29uc3QgQ0dGdW5jdGlvbkluZm8gJmZuSW5mbyA9CiAgICAgZ2V0VHlwZXMoKS5hcnJhbmdlQ1hYQ29uc3RydWN0b3JEZWNsYXJhdGlvbihjdG9yLCBjdG9yVHlwZSk7CiAKLSAgbGx2bTo6RnVuY3Rpb24gKmZuID0KLSAgICBjYXN0PGxsdm06OkZ1bmN0aW9uPihHZXRBZGRyT2ZDWFhDb25zdHJ1Y3RvcihjdG9yLCBjdG9yVHlwZSwgJmZuSW5mbykpOworICBsbHZtOjpGdW5jdGlvbiAqZm4gPSBjYXN0PGxsdm06OkZ1bmN0aW9uPigKKyAgICAgIEdldEFkZHJPZkNYWENvbnN0cnVjdG9yKGN0b3IsIGN0b3JUeXBlLCAmZm5JbmZvLCB0cnVlKSk7CiAgIHNldEZ1bmN0aW9uTGlua2FnZShHbG9iYWxEZWNsKGN0b3IsIGN0b3JUeXBlKSwgZm4pOwogCiAgIENvZGVHZW5GdW5jdGlvbigqdGhpcykuR2VuZXJhdGVDb2RlKEdsb2JhbERlY2woY3RvciwgY3RvclR5cGUpLCBmbiwgZm5JbmZvKTsKQEAgLTIxOCw3ICsyMjQsOCBAQAogbGx2bTo6R2xvYmFsVmFsdWUgKgogQ29kZUdlbk1vZHVsZTo6R2V0QWRkck9mQ1hYQ29uc3RydWN0b3IoY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ3RvclR5cGUgY3RvclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAqZm5JbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAqZm5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEb250RGVmZXIpIHsKICAgR2xvYmFsRGVjbCBHRChjdG9yLCBjdG9yVHlwZSk7CiAgIAogICBTdHJpbmdSZWYgbmFtZSA9IGdldE1hbmdsZWROYW1lKEdEKTsKQEAgLTIzMCw3ICsyMzcsOCBAQAogCiAgIGxsdm06OkZ1bmN0aW9uVHlwZSAqZm5UeXBlID0gZ2V0VHlwZXMoKS5HZXRGdW5jdGlvblR5cGUoKmZuSW5mbyk7CiAgIHJldHVybiBjYXN0PGxsdm06OkZ1bmN0aW9uPihHZXRPckNyZWF0ZUxMVk1GdW5jdGlvbihuYW1lLCBmblR5cGUsIEdELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGb3JWVGFibGU9Ki9mYWxzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGb3JWVGFibGU9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbnREZWZlcikpOwogfQogCiB2b2lkIENvZGVHZW5Nb2R1bGU6OkVtaXRDWFhEZXN0cnVjdG9yKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpkdG9yLApAQCAtMjYwLDggKzI2OCw4IEBACiAgIGNvbnN0IENHRnVuY3Rpb25JbmZvICZmbkluZm8gPQogICAgIGdldFR5cGVzKCkuYXJyYW5nZUNYWERlc3RydWN0b3IoZHRvciwgZHRvclR5cGUpOwogCi0gIGxsdm06OkZ1bmN0aW9uICpmbiA9Ci0gICAgY2FzdDxsbHZtOjpGdW5jdGlvbj4oR2V0QWRkck9mQ1hYRGVzdHJ1Y3RvcihkdG9yLCBkdG9yVHlwZSwgJmZuSW5mbykpOworICBsbHZtOjpGdW5jdGlvbiAqZm4gPSBjYXN0PGxsdm06OkZ1bmN0aW9uPigKKyAgICAgIEdldEFkZHJPZkNYWERlc3RydWN0b3IoZHRvciwgZHRvclR5cGUsICZmbkluZm8sIDAsIHRydWUpKTsKICAgc2V0RnVuY3Rpb25MaW5rYWdlKEdsb2JhbERlY2woZHRvciwgZHRvclR5cGUpLCBmbik7CiAKICAgQ29kZUdlbkZ1bmN0aW9uKCp0aGlzKS5HZW5lcmF0ZUNvZGUoR2xvYmFsRGVjbChkdG9yLCBkdG9yVHlwZSksIGZuLCBmbkluZm8pOwpAQCAtMjc0LDcgKzI4Miw4IEBACiBDb2RlR2VuTW9kdWxlOjpHZXRBZGRyT2ZDWFhEZXN0cnVjdG9yKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpkdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhEdG9yVHlwZSBkdG9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0dGdW5jdGlvbkluZm8gKmZuSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6RnVuY3Rpb25UeXBlICpmblR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6RnVuY3Rpb25UeXBlICpmblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRG9udERlZmVyKSB7CiAgIEdsb2JhbERlY2wgR0QoZHRvciwgZHRvclR5cGUpOwogCiAgIFN0cmluZ1JlZiBuYW1lID0gZ2V0TWFuZ2xlZE5hbWUoR0QpOwpAQCAtMjg2LDcgKzI5NSw4IEBACiAgICAgZm5UeXBlID0gZ2V0VHlwZXMoKS5HZXRGdW5jdGlvblR5cGUoKmZuSW5mbyk7CiAgIH0KICAgcmV0dXJuIGNhc3Q8bGx2bTo6RnVuY3Rpb24+KEdldE9yQ3JlYXRlTExWTUZ1bmN0aW9uKG5hbWUsIGZuVHlwZSwgR0QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZvclZUYWJsZT0qL2ZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZvclZUYWJsZT0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9udERlZmVyKSk7CiB9CiAKIHN0YXRpYyBsbHZtOjpWYWx1ZSAqQnVpbGRBcHBsZUtleHRWaXJ0dWFsQ2FsbChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHQ1hYQUJJLmNwcCBiL2xpYi9Db2RlR2VuL0NHQ1hYQUJJLmNwcAppbmRleCA0MTJiMjc4Li4yYmIzOTA3IDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0NYWEFCSS5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ0dDWFhBQkkuY3BwCkBAIC0zNywxMCArMzcsOSBAQAogICByZXR1cm4gQ0dNLmdldFR5cGVzKCkuQ29udmVydFR5cGUoQ0dNLmdldENvbnRleHQoKS5nZXRQb2ludGVyRGlmZlR5cGUoKSk7CiB9CiAKLWxsdm06OlZhbHVlICpDR0NYWEFCSTo6RW1pdExvYWRPZk1lbWJlckZ1bmN0aW9uUG9pbnRlcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqJlRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKk1lbVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSB7CitsbHZtOjpWYWx1ZSAqQ0dDWFhBQkk6OkVtaXRMb2FkT2ZNZW1iZXJGdW5jdGlvblBvaW50ZXIoCisgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IEV4cHIgKkUsIGxsdm06OlZhbHVlIComVGhpcywKKyAgICBsbHZtOjpWYWx1ZSAqTWVtUHRyLCBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSB7CiAgIEVycm9yVW5zdXBwb3J0ZWRBQkkoQ0dGLCAiY2FsbHMgdGhyb3VnaCBtZW1iZXIgcG9pbnRlcnMiKTsKIAogICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0gCkBAIC01MiwxMCArNTEsMTAgQEAKICAgcmV0dXJuIGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoRlR5LT5nZXRQb2ludGVyVG8oKSk7CiB9CiAKLWxsdm06OlZhbHVlICpDR0NYWEFCSTo6RW1pdE1lbWJlckRhdGFQb2ludGVyQWRkcmVzcyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTWVtUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpIHsKK2xsdm06OlZhbHVlICoKK0NHQ1hYQUJJOjpFbWl0TWVtYmVyRGF0YVBvaW50ZXJBZGRyZXNzKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBjb25zdCBFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkJhc2UsIGxsdm06OlZhbHVlICpNZW1QdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSB7CiAgIEVycm9yVW5zdXBwb3J0ZWRBQkkoQ0dGLCAibG9hZHMgb2YgbWVtYmVyIHBvaW50ZXJzIik7CiAgIGxsdm06OlR5cGUgKlR5ID0gQ0dGLkNvbnZlcnRUeXBlKE1QVC0+Z2V0UG9pbnRlZVR5cGUoKSktPmdldFBvaW50ZXJUbygpOwogICByZXR1cm4gbGx2bTo6Q29uc3RhbnQ6OmdldE51bGxWYWx1ZShUeSk7CkBAIC0xMTYsNyArMTE1LDcgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQ0dDWFhBQkk6OkJ1aWxkVGhpc1BhcmFtKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGdW5jdGlvbkFyZ0xpc3QgJnBhcmFtcykgewordm9pZCBDR0NYWEFCSTo6YnVpbGRUaGlzUGFyYW0oQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZ1bmN0aW9uQXJnTGlzdCAmcGFyYW1zKSB7CiAgIGNvbnN0IENYWE1ldGhvZERlY2wgKk1EID0gY2FzdDxDWFhNZXRob2REZWNsPihDR0YuQ3VyR0QuZ2V0RGVjbCgpKTsKIAogICAvLyBGSVhNRTogSSdtIG5vdCBlbnRpcmVseSBzdXJlIEkgbGlrZSB1c2luZyBhIGZha2UgZGVjbCBqdXN0IGZvciBjb2RlCkBAIC0yODEsOCArMjgwLDkgQEAKICAgICBsbHZtOjpGdW5jdGlvbiAqSW5pdEZ1bmMpIHsKIH0KIAotTFZhbHVlIENHQ1hYQUJJOjpFbWl0VGhyZWFkTG9jYWxEZWNsUmVmRXhwcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xSZWZFeHByICpEUkUpIHsKK0xWYWx1ZSBDR0NYWEFCSTo6RW1pdFRocmVhZExvY2FsVmFyRGVjbExWYWx1ZShDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYXJEZWNsICpWRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBMVmFsVHlwZSkgewogICBFcnJvclVuc3VwcG9ydGVkQUJJKENHRiwgIm9kci11c2Ugb2YgdGhyZWFkX2xvY2FsIGdsb2JhbCIpOwogICByZXR1cm4gTFZhbHVlKCk7CiB9CkBAIC0yOTAsMyArMjkwLDMxIEBACiBib29sIENHQ1hYQUJJOjpOZWVkc1ZUVFBhcmFtZXRlcihHbG9iYWxEZWNsIEdEKSB7CiAgIHJldHVybiBmYWxzZTsKIH0KKworLy8vIFdoYXQgc29ydCBvZiB1bmlxdWVuZXNzIHJ1bGVzIHNob3VsZCB3ZSB1c2UgZm9yIHRoZSBSVFRJIGZvciB0aGUKKy8vLyBnaXZlbiB0eXBlPworQ0dDWFhBQkk6OlJUVElVbmlxdWVuZXNzS2luZAorQ0dDWFhBQkk6OmNsYXNzaWZ5UlRUSVVuaXF1ZW5lc3MoUXVhbFR5cGUgQ2FuVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgaWYgKHNob3VsZFJUVElCZVVuaXF1ZSgpKQorICAgIHJldHVybiBSVUtfVW5pcXVlOworCisgIC8vIEl0J3Mgb25seSBuZWNlc3NhcnkgZm9yIGxpbmtvbmNlX29kciBvciB3ZWFrX29kciBsaW5rYWdlLgorICBpZiAoTGlua2FnZSAhPSBsbHZtOjpHbG9iYWxWYWx1ZTo6TGlua09uY2VPRFJMaW5rYWdlICYmCisgICAgICBMaW5rYWdlICE9IGxsdm06Okdsb2JhbFZhbHVlOjpXZWFrT0RSTGlua2FnZSkKKyAgICByZXR1cm4gUlVLX1VuaXF1ZTsKKworICAvLyBJdCdzIG9ubHkgbmVjZXNzYXJ5IHdpdGggZGVmYXVsdCB2aXNpYmlsaXR5LgorICBpZiAoQ2FuVHktPmdldFZpc2liaWxpdHkoKSAhPSBEZWZhdWx0VmlzaWJpbGl0eSkKKyAgICByZXR1cm4gUlVLX1VuaXF1ZTsKKworICAvLyBJZiB3ZSdyZSBub3QgcmVxdWlyZWQgdG8gcHVibGlzaCB0aGlzIHN5bWJvbCwgaGlkZSBpdC4KKyAgaWYgKExpbmthZ2UgPT0gbGx2bTo6R2xvYmFsVmFsdWU6OkxpbmtPbmNlT0RSTGlua2FnZSkKKyAgICByZXR1cm4gUlVLX05vblVuaXF1ZUhpZGRlbjsKKworICAvLyBJZiB3ZSdyZSByZXF1aXJlZCB0byBwdWJsaXNoIHRoaXMgc3ltYm9sLCBhcyB3ZSBtaWdodCBiZSB1bmRlciBhbgorICAvLyBleHBsaWNpdCBpbnN0YW50aWF0aW9uLCBsZWF2ZSBpdCB3aXRoIGRlZmF1bHQgdmlzaWJpbGl0eSBidXQKKyAgLy8gZW5hYmxlIHN0cmluZy1jb21wYXJpc29ucy4KKyAgYXNzZXJ0KExpbmthZ2UgPT0gbGx2bTo6R2xvYmFsVmFsdWU6OldlYWtPRFJMaW5rYWdlKTsKKyAgcmV0dXJuIFJVS19Ob25VbmlxdWVWaXNpYmxlOworfQpkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ0dDWFhBQkkuaCBiL2xpYi9Db2RlR2VuL0NHQ1hYQUJJLmgKaW5kZXggOWU5YTJhNy4uYmVhZWMyYyAxMDA2NDQKLS0tIGEvbGliL0NvZGVHZW4vQ0dDWFhBQkkuaAorKysgYi9saWIvQ29kZUdlbi9DR0NYWEFCSS5oCkBAIC00MSw3ICs0MSw3IEBACiBjbGFzcyBDR0NYWEFCSSB7CiBwcm90ZWN0ZWQ6CiAgIENvZGVHZW5Nb2R1bGUgJkNHTTsKLSAgT3duaW5nUHRyPE1hbmdsZUNvbnRleHQ+IE1hbmdsZUN0eDsKKyAgc3RkOjp1bmlxdWVfcHRyPE1hbmdsZUNvbnRleHQ+IE1hbmdsZUN0eDsKIAogICBDR0NYWEFCSShDb2RlR2VuTW9kdWxlICZDR00pCiAgICAgOiBDR00oQ0dNKSwgTWFuZ2xlQ3R4KENHTS5nZXRDb250ZXh0KCkuY3JlYXRlTWFuZ2xlQ29udGV4dCgpKSB7fQpAQCAtNjAsMTUgKzYwLDYgQEAKICAgLy8vIEdldCBhIG51bGwgdmFsdWUgZm9yIHVuc3VwcG9ydGVkIG1lbWJlciBwb2ludGVycy4KICAgbGx2bTo6Q29uc3RhbnQgKkdldEJvZ3VzTWVtYmVyUG9pbnRlcihRdWFsVHlwZSBUKTsKIAotICAvLyBGSVhNRTogRXZlcnkgcGxhY2UgdGhhdCBjYWxscyBnZXRWVFR7RGVjbCxWYWx1ZX0gaXMgc29tZXRoaW5nCi0gIC8vIHRoYXQgbmVlZHMgdG8gYmUgYWJzdHJhY3RlZCBwcm9wZXJseS4KLSAgSW1wbGljaXRQYXJhbURlY2wgKiZnZXRWVFREZWNsKENvZGVHZW5GdW5jdGlvbiAmQ0dGKSB7Ci0gICAgcmV0dXJuIENHRi5DWFhTdHJ1Y3RvckltcGxpY2l0UGFyYW1EZWNsOwotICB9Ci0gIGxsdm06OlZhbHVlIComZ2V0VlRUVmFsdWUoQ29kZUdlbkZ1bmN0aW9uICZDR0YpIHsKLSAgICByZXR1cm4gQ0dGLkNYWFN0cnVjdG9ySW1wbGljaXRQYXJhbVZhbHVlOwotICB9Ci0KICAgSW1wbGljaXRQYXJhbURlY2wgKiZnZXRTdHJ1Y3RvckltcGxpY2l0UGFyYW1EZWNsKENvZGVHZW5GdW5jdGlvbiAmQ0dGKSB7CiAgICAgcmV0dXJuIENHRi5DWFhTdHJ1Y3RvckltcGxpY2l0UGFyYW1EZWNsOwogICB9CkBAIC03NiwxMSArNjcsOCBAQAogICAgIHJldHVybiBDR0YuQ1hYU3RydWN0b3JJbXBsaWNpdFBhcmFtVmFsdWU7CiAgIH0KIAotICAvLy8gQnVpbGQgYSBwYXJhbWV0ZXIgdmFyaWFibGUgc3VpdGFibGUgZm9yICd0aGlzJy4KLSAgdm9pZCBCdWlsZFRoaXNQYXJhbShDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRnVuY3Rpb25BcmdMaXN0ICZQYXJhbXMpOwotCiAgIC8vLyBQZXJmb3JtIHByb2xvZyBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFyYW1ldGVyIHZhcmlhYmxlIHN1aXRhYmxlCi0gIC8vLyBmb3IgJ3RoaXMnIGVtaXR0ZWQgYnkgQnVpbGRUaGlzUGFyYW0uCisgIC8vLyBmb3IgJ3RoaXMnIGVtaXR0ZWQgYnkgYnVpbGRUaGlzUGFyYW0uCiAgIHZvaWQgRW1pdFRoaXNQYXJhbShDb2RlR2VuRnVuY3Rpb24gJkNHRik7CiAKICAgQVNUQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENHTS5nZXRDb250ZXh0KCk7IH0KQEAgLTEzNCwxNyArMTIyLDE1IEBACiAgIC8vLyBMb2FkIGEgbWVtYmVyIGZ1bmN0aW9uIGZyb20gYW4gb2JqZWN0IGFuZCBhIG1lbWJlciBmdW5jdGlvbgogICAvLy8gcG9pbnRlci4gIEFwcGx5IHRoZSB0aGlzLWFkanVzdG1lbnQgYW5kIHNldCAnVGhpcycgdG8gdGhlCiAgIC8vLyBhZGp1c3RlZCB2YWx1ZS4KLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqCi0gIEVtaXRMb2FkT2ZNZW1iZXJGdW5jdGlvblBvaW50ZXIoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKiZUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpNZW1QdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCk7CisgIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRMb2FkT2ZNZW1iZXJGdW5jdGlvblBvaW50ZXIoCisgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRiwgY29uc3QgRXhwciAqRSwgbGx2bTo6VmFsdWUgKiZUaGlzLAorICAgICAgbGx2bTo6VmFsdWUgKk1lbVB0ciwgY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCk7CiAKICAgLy8vIENhbGN1bGF0ZSBhbiBsLXZhbHVlIGZyb20gYW4gb2JqZWN0IGFuZCBhIGRhdGEgbWVtYmVyIHBvaW50ZXIuCi0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRNZW1iZXJEYXRhUG9pbnRlckFkZHJlc3MoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKk1lbVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCk7CisgIHZpcnR1YWwgbGx2bTo6VmFsdWUgKgorICBFbWl0TWVtYmVyRGF0YVBvaW50ZXJBZGRyZXNzKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBjb25zdCBFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpCYXNlLCBsbHZtOjpWYWx1ZSAqTWVtUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpOwogCiAgIC8vLyBQZXJmb3JtIGEgZGVyaXZlZC10by1iYXNlLCBiYXNlLXRvLWRlcml2ZWQsIG9yIGJpdGNhc3QgbWVtYmVyCiAgIC8vLyBwb2ludGVyIGNvbnZlcnNpb24uCkBAIC0yNzIsMjMgKzI1OCwyNyBAQAogICB9CiAKICAgLy8vIFBlcmZvcm0gQUJJLXNwZWNpZmljICJ0aGlzIiBhcmd1bWVudCBhZGp1c3RtZW50IHJlcXVpcmVkIHByaW9yIHRvCi0gIC8vLyBhIHZpcnR1YWwgZnVuY3Rpb24gY2FsbC4KLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqYWRqdXN0VGhpc0FyZ3VtZW50Rm9yVmlydHVhbENhbGwoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbERlY2wgR0QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpUaGlzKSB7CisgIC8vLyBhIGNhbGwgb2YgYSB2aXJ0dWFsIGZ1bmN0aW9uLgorICAvLy8gVGhlICJWaXJ0dWFsQ2FsbCIgYXJndW1lbnQgaXMgdHJ1ZSBpZmYgdGhlIGNhbGwgaXRzZWxmIGlzIHZpcnR1YWwuCisgIHZpcnR1YWwgbGx2bTo6VmFsdWUgKgorICBhZGp1c3RUaGlzQXJndW1lbnRGb3JWaXJ0dWFsRnVuY3Rpb25DYWxsKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBHbG9iYWxEZWNsIEdELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmlydHVhbENhbGwpIHsKICAgICByZXR1cm4gVGhpczsKICAgfQogCi0gIC8vLyBCdWlsZCB0aGUgQUJJLXNwZWNpZmljIHBvcnRpb24gb2YgdGhlIHBhcmFtZXRlciBsaXN0IGZvciBhCi0gIC8vLyBmdW5jdGlvbi4gIFRoaXMgZ2VuZXJhbGx5IGludm9sdmVzIGEgJ3RoaXMnIHBhcmFtZXRlciBhbmQKLSAgLy8vIHBvc3NpYmx5IHNvbWUgZXh0cmEgZGF0YSBmb3IgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4KKyAgLy8vIEJ1aWxkIGEgcGFyYW1ldGVyIHZhcmlhYmxlIHN1aXRhYmxlIGZvciAndGhpcycuCisgIHZvaWQgYnVpbGRUaGlzUGFyYW0oQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZ1bmN0aW9uQXJnTGlzdCAmUGFyYW1zKTsKKworICAvLy8gSW5zZXJ0IGFueSBBQkktc3BlY2lmaWMgaW1wbGljaXQgcGFyYW1ldGVycyBpbnRvIHRoZSBwYXJhbWV0ZXIgbGlzdCBmb3IgYQorICAvLy8gZnVuY3Rpb24uICBUaGlzIGdlbmVyYWxseSBpbnZvbHZlcyBleHRyYSBkYXRhIGZvciBjb25zdHJ1Y3RvcnMgYW5kCisgIC8vLyBkZXN0cnVjdG9ycy4KICAgLy8vCiAgIC8vLyBBQklzIG1heSBhbHNvIGNob29zZSB0byBvdmVycmlkZSB0aGUgcmV0dXJuIHR5cGUsIHdoaWNoIGhhcyBiZWVuCiAgIC8vLyBpbml0aWFsaXplZCB3aXRoIHRoZSB0eXBlIG9mICd0aGlzJyBpZiBIYXNUaGlzUmV0dXJuKENHRi5DdXJHRCkgaXMgdHJ1ZSBvcgogICAvLy8gdGhlIGZvcm1hbCByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gb3RoZXJ3aXNlLgotICB2aXJ0dWFsIHZvaWQgQnVpbGRJbnN0YW5jZUZ1bmN0aW9uUGFyYW1zKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlICZSZXNUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFyZ0xpc3QgJlBhcmFtcykgPSAwOworICB2aXJ0dWFsIHZvaWQgYWRkSW1wbGljaXRTdHJ1Y3RvclBhcmFtcyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwgUXVhbFR5cGUgJlJlc1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFyZ0xpc3QgJlBhcmFtcykgPSAwOwogCiAgIC8vLyBQZXJmb3JtIEFCSS1zcGVjaWZpYyAidGhpcyIgcGFyYW1ldGVyIGFkanVzdG1lbnQgaW4gYSB2aXJ0dWFsIGZ1bmN0aW9uCiAgIC8vLyBwcm9sb2d1ZS4KQEAgLTMwMCwxNCArMjkwLDIwIEBACiAgIC8vLyBFbWl0IHRoZSBBQkktc3BlY2lmaWMgcHJvbG9nIGZvciB0aGUgZnVuY3Rpb24uCiAgIHZpcnR1YWwgdm9pZCBFbWl0SW5zdGFuY2VGdW5jdGlvblByb2xvZyhDb2RlR2VuRnVuY3Rpb24gJkNHRikgPSAwOwogCi0gIC8vLyBFbWl0IHRoZSBjb25zdHJ1Y3RvciBjYWxsLiBSZXR1cm4gdGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkLgotICB2aXJ0dWFsIHZvaWQgRW1pdENvbnN0cnVjdG9yQ2FsbChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDdG9yVHlwZSBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvclZpcnR1YWxCYXNlLCBib29sIERlbGVnYXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsRXhwcjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEFyZ0JlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEV4cHI6OmNvbnN0X2FyZ19pdGVyYXRvciBBcmdFbmQpID0gMDsKKyAgLy8vIEFkZCBhbnkgQUJJLXNwZWNpZmljIGltcGxpY2l0IGFyZ3VtZW50cyBuZWVkZWQgdG8gY2FsbCBhIGNvbnN0cnVjdG9yLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG51bWJlciBvZiBhcmdzIGFkZGVkIHRvIHRoZSBjYWxsLCB3aGljaCBpcyB0eXBpY2FsbHkgemVybyBvcgorICAvLy8gb25lLgorICB2aXJ0dWFsIHVuc2lnbmVkCisgIGFkZEltcGxpY2l0Q29uc3RydWN0b3JBcmdzKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEN0b3JUeXBlIFR5cGUsIGJvb2wgRm9yVmlydHVhbEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVsZWdhdGluZywgQ2FsbEFyZ0xpc3QgJkFyZ3MpID0gMDsKKworICAvLy8gRW1pdCB0aGUgZGVzdHJ1Y3RvciBjYWxsLgorICB2aXJ0dWFsIHZvaWQgRW1pdERlc3RydWN0b3JDYWxsKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpERCwgQ1hYRHRvclR5cGUgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvclZpcnR1YWxCYXNlLCBib29sIERlbGVnYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlRoaXMpID0gMDsKIAogICAvLy8gRW1pdHMgdGhlIFZUYWJsZSBkZWZpbml0aW9ucyByZXF1aXJlZCBmb3IgdGhlIGdpdmVuIHJlY29yZCB0eXBlLgogICB2aXJ0dWFsIHZvaWQgZW1pdFZUYWJsZURlZmluaXRpb25zKENvZGVHZW5WVGFibGVzICZDR1ZULApAQCAtNDg1LDggKzQ4MSwzOSBAQAogICAvLy8gRW1pdCBhIHJlZmVyZW5jZSB0byBhIG5vbi1sb2NhbCB0aHJlYWRfbG9jYWwgdmFyaWFibGUgKGluY2x1ZGluZwogICAvLy8gdHJpZ2dlcmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYWxsIHRocmVhZF9sb2NhbCB2YXJpYWJsZXMgaW4gaXRzCiAgIC8vLyB0cmFuc2xhdGlvbiB1bml0KS4KLSAgdmlydHVhbCBMVmFsdWUgRW1pdFRocmVhZExvY2FsRGVjbFJlZkV4cHIoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xSZWZFeHByICpEUkUpOworICB2aXJ0dWFsIExWYWx1ZSBFbWl0VGhyZWFkTG9jYWxWYXJEZWNsTFZhbHVlKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhckRlY2wgKlZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIExWYWxUeXBlKTsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSVFRJIFVuaXF1ZW5lc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwcm90ZWN0ZWQ6CisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIEFCSSByZXF1aXJlcyBSVFRJIHR5cGVfaW5mbyBvYmplY3RzIHRvIGJlIHVuaXF1ZQorICAvLy8gYWNyb3NzIGEgcHJvZ3JhbS4KKyAgdmlydHVhbCBib29sIHNob3VsZFJUVElCZVVuaXF1ZSgpIHsgcmV0dXJuIHRydWU7IH0KKworcHVibGljOgorICAvLy8gV2hhdCBzb3J0IG9mIHVuaXF1ZS1SVFRJIGJlaGF2aW9yIHNob3VsZCB3ZSB1c2U/CisgIGVudW0gUlRUSVVuaXF1ZW5lc3NLaW5kIHsKKyAgICAvLy8gV2UgYXJlIGd1YXJhbnRlZWluZywgb3IgbmVlZCB0byBndWFyYW50ZWUsIHRoYXQgdGhlIFJUVEkgc3RyaW5nCisgICAgLy8vIGlzIHVuaXF1ZS4KKyAgICBSVUtfVW5pcXVlLAorCisgICAgLy8vIFdlIGFyZSBub3QgZ3VhcmFudGVlaW5nIHVuaXF1ZW5lc3MgZm9yIHRoZSBSVFRJIHN0cmluZywgc28gd2UKKyAgICAvLy8gY2FuIGRlbW90ZSB0byBoaWRkZW4gdmlzaWJpbGl0eSBidXQgbXVzdCB1c2Ugc3RyaW5nIGNvbXBhcmlzb25zLgorICAgIFJVS19Ob25VbmlxdWVIaWRkZW4sCisKKyAgICAvLy8gV2UgYXJlIG5vdCBndWFyYW50ZWVpbmcgdW5pcXVlbmVzcyBmb3IgdGhlIFJUVEkgc3RyaW5nLCBzbyB3ZQorICAgIC8vLyBoYXZlIHRvIHVzZSBzdHJpbmcgY29tcGFyaXNvbnMsIGJ1dCB3ZSBhbHNvIGhhdmUgdG8gZW1pdCBpdCB3aXRoCisgICAgLy8vIG5vbi1oaWRkZW4gdmlzaWJpbGl0eS4KKyAgICBSVUtfTm9uVW5pcXVlVmlzaWJsZQorICB9OworCisgIC8vLyBSZXR1cm4gdGhlIHJlcXVpcmVkIHZpc2liaWxpdHkgc3RhdHVzIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbGlua2FnZSBpbgorICAvLy8gdGhlIGN1cnJlbnQgQUJJLgorICBSVFRJVW5pcXVlbmVzc0tpbmQKKyAgY2xhc3NpZnlSVFRJVW5pcXVlbmVzcyhRdWFsVHlwZSBDYW5UeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzIExpbmthZ2UpOwogfTsKIAogLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgQysrIEFCSSBjbGFzczoKZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHQ2FsbC5jcHAgYi9saWIvQ29kZUdlbi9DR0NhbGwuY3BwCmluZGV4IDIyZjI0NjcuLmUyNmQ2YjJkIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0NhbGwuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHQ2FsbC5jcHAKQEAgLTI2LDEwICsyNiwxMCBAQAogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0NvZGVHZW5PcHRpb25zLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCiAjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgogI2luY2x1ZGUgImxsdm0vSVIvRGF0YUxheW91dC5oIgogI2luY2x1ZGUgImxsdm0vSVIvSW5saW5lQXNtLmgiCi0jaW5jbHVkZSAibGx2bS9NQy9TdWJ0YXJnZXRGZWF0dXJlLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmgiCiAjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvY2FsLmgiCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiB1c2luZyBuYW1lc3BhY2UgQ29kZUdlbjsKQEAgLTc5LDIzICs3OSwyNiBAQAogQ29kZUdlblR5cGVzOjphcnJhbmdlRnJlZUZ1bmN0aW9uVHlwZShDYW5RdWFsPEZ1bmN0aW9uTm9Qcm90b1R5cGU+IEZUTlApIHsKICAgLy8gV2hlbiB0cmFuc2xhdGluZyBhbiB1bnByb3RvdHlwZWQgZnVuY3Rpb24gdHlwZSwgYWx3YXlzIHVzZSBhCiAgIC8vIHZhcmlhZGljIHR5cGUuCi0gIHJldHVybiBhcnJhbmdlTExWTUZ1bmN0aW9uSW5mbyhGVE5QLT5nZXRSZXN1bHRUeXBlKCkuZ2V0VW5xdWFsaWZpZWRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBGVE5QLT5nZXRFeHRJbmZvKCksIFJlcXVpcmVkQXJncygwKSk7CisgIHJldHVybiBhcnJhbmdlTExWTUZ1bmN0aW9uSW5mbyhGVE5QLT5nZXRSZXR1cm5UeXBlKCkuZ2V0VW5xdWFsaWZpZWRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgTm9uZSwgRlROUC0+Z2V0RXh0SW5mbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRBcmdzKDApKTsKIH0KIAogLy8vIEFycmFuZ2UgdGhlIExMVk0gZnVuY3Rpb24gbGF5b3V0IGZvciBhIHZhbHVlIG9mIHRoZSBnaXZlbiBmdW5jdGlvbgogLy8vIHR5cGUsIG9uIHRvcCBvZiBhbnkgaW1wbGljaXQgcGFyYW1ldGVycyBhbHJlYWR5IHN0b3JlZC4gIFVzZSB0aGUKIC8vLyBnaXZlbiBFeHRJbmZvIGluc3RlYWQgb2YgdGhlIEV4dEluZm8gZnJvbSB0aGUgZnVuY3Rpb24gdHlwZS4KIHN0YXRpYyBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oQ29kZUdlblR5cGVzICZDR1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbnN0YW5jZU1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDYW5RdWFsVHlwZT4gJnByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhblF1YWw8RnVuY3Rpb25Qcm90b1R5cGU+IEZUUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblR5cGU6OkV4dEluZm8gZXh0SW5mbykgewogICBSZXF1aXJlZEFyZ3MgcmVxdWlyZWQgPSBSZXF1aXJlZEFyZ3M6OmZvclByb3RvdHlwZVBsdXMoRlRQLCBwcmVmaXguc2l6ZSgpKTsKICAgLy8gRklYTUU6IEtpbGwgY29weS4KLSAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZUUC0+Z2V0TnVtQXJncygpOyBpICE9IGU7ICsraSkKLSAgICBwcmVmaXgucHVzaF9iYWNrKEZUUC0+Z2V0QXJnVHlwZShpKSk7Ci0gIENhblF1YWxUeXBlIHJlc3VsdFR5cGUgPSBGVFAtPmdldFJlc3VsdFR5cGUoKS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKLSAgcmV0dXJuIENHVC5hcnJhbmdlTExWTUZ1bmN0aW9uSW5mbyhyZXN1bHRUeXBlLCBwcmVmaXgsIGV4dEluZm8sIHJlcXVpcmVkKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZUUC0+Z2V0TnVtUGFyYW1zKCk7IGkgIT0gZTsgKytpKQorICAgIHByZWZpeC5wdXNoX2JhY2soRlRQLT5nZXRQYXJhbVR5cGUoaSkpOworICBDYW5RdWFsVHlwZSByZXN1bHRUeXBlID0gRlRQLT5nZXRSZXR1cm5UeXBlKCkuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CisgIHJldHVybiBDR1QuYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8ocmVzdWx0VHlwZSwgSXNJbnN0YW5jZU1ldGhvZCwgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dEluZm8sIHJlcXVpcmVkKTsKIH0KIAogLy8vIEFycmFuZ2UgdGhlIGFyZ3VtZW50IGFuZCByZXN1bHQgaW5mb3JtYXRpb24gZm9yIGEgZnJlZSBmdW5jdGlvbiAoaS5lLgpAQCAtMTAzLDcgKzEwNiw3IEBACiBzdGF0aWMgY29uc3QgQ0dGdW5jdGlvbkluZm8gJmFycmFuZ2VGcmVlRnVuY3Rpb25UeXBlKENvZGVHZW5UeXBlcyAmQ0dULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q2FuUXVhbFR5cGU+ICZwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhblF1YWw8RnVuY3Rpb25Qcm90b1R5cGU+IEZUUCkgewotICByZXR1cm4gYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oQ0dULCBwcmVmaXgsIEZUUCwgRlRQLT5nZXRFeHRJbmZvKCkpOworICByZXR1cm4gYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oQ0dULCBmYWxzZSwgcHJlZml4LCBGVFAsIEZUUC0+Z2V0RXh0SW5mbygpKTsKIH0KIAogLy8vIEFycmFuZ2UgdGhlIGFyZ3VtZW50IGFuZCByZXN1bHQgaW5mb3JtYXRpb24gZm9yIGEgZnJlZSBmdW5jdGlvbiAoaS5lLgpAQCAtMTEyLDcgKzExNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDYW5RdWFsVHlwZT4gJnByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuUXVhbDxGdW5jdGlvblByb3RvVHlwZT4gRlRQKSB7CiAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbyBleHRJbmZvID0gRlRQLT5nZXRFeHRJbmZvKCk7Ci0gIHJldHVybiBhcnJhbmdlTExWTUZ1bmN0aW9uSW5mbyhDR1QsIHByZWZpeCwgRlRQLCBleHRJbmZvKTsKKyAgcmV0dXJuIGFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKENHVCwgdHJ1ZSwgcHJlZml4LCBGVFAsIGV4dEluZm8pOwogfQogCiAvLy8gQXJyYW5nZSB0aGUgYXJndW1lbnQgYW5kIHJlc3VsdCBpbmZvcm1hdGlvbiBmb3IgYSB2YWx1ZSBvZiB0aGUKQEAgLTEyMyw3ICsxMjYsNyBAQAogICByZXR1cm4gOjphcnJhbmdlRnJlZUZ1bmN0aW9uVHlwZSgqdGhpcywgYXJnVHlwZXMsIEZUUCk7CiB9CiAKLXN0YXRpYyBDYWxsaW5nQ29udiBnZXRDYWxsaW5nQ29udmVudGlvbkZvckRlY2woY29uc3QgRGVjbCAqRCkgeworc3RhdGljIENhbGxpbmdDb252IGdldENhbGxpbmdDb252ZW50aW9uRm9yRGVjbChjb25zdCBEZWNsICpELCBib29sIElzV2luZG93cykgewogICAvLyBTZXQgdGhlIGFwcHJvcHJpYXRlIGNhbGxpbmcgY29udmVudGlvbiBmb3IgdGhlIEZ1bmN0aW9uLgogICBpZiAoRC0+aGFzQXR0cjxTdGRDYWxsQXR0cj4oKSkKICAgICByZXR1cm4gQ0NfWDg2U3RkQ2FsbDsKQEAgLTE0Niw2ICsxNDksMTIgQEAKICAgaWYgKEQtPmhhc0F0dHI8SW50ZWxPY2xCaWNjQXR0cj4oKSkKICAgICByZXR1cm4gQ0NfSW50ZWxPY2xCaWNjOwogCisgIGlmIChELT5oYXNBdHRyPE1TQUJJQXR0cj4oKSkKKyAgICByZXR1cm4gSXNXaW5kb3dzID8gQ0NfQyA6IENDX1g4Nl82NFdpbjY0OworCisgIGlmIChELT5oYXNBdHRyPFN5c1ZBQklBdHRyPigpKQorICAgIHJldHVybiBJc1dpbmRvd3MgPyBDQ19YODZfNjRTeXNWIDogQ0NfQzsKKwogICByZXR1cm4gQ0NfQzsKIH0KIApAQCAtMjAyLDE4ICsyMTEsNDEgQEAKICAgQ2FuUXVhbFR5cGUgcmVzdWx0VHlwZSA9CiAgICAgVGhlQ1hYQUJJLkhhc1RoaXNSZXR1cm4oR0QpID8gYXJnVHlwZXMuZnJvbnQoKSA6IENvbnRleHQuVm9pZFR5OwogCi0gIFRoZUNYWEFCSS5CdWlsZENvbnN0cnVjdG9yU2lnbmF0dXJlKEQsIGN0b3JLaW5kLCByZXN1bHRUeXBlLCBhcmdUeXBlcyk7Ci0KICAgQ2FuUXVhbDxGdW5jdGlvblByb3RvVHlwZT4gRlRQID0gR2V0Rm9ybWFsVHlwZShEKTsKIAotICBSZXF1aXJlZEFyZ3MgcmVxdWlyZWQgPSBSZXF1aXJlZEFyZ3M6OmZvclByb3RvdHlwZVBsdXMoRlRQLCBhcmdUeXBlcy5zaXplKCkpOwotCiAgIC8vIEFkZCB0aGUgZm9ybWFsIHBhcmFtZXRlcnMuCi0gIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVFAtPmdldE51bUFyZ3MoKTsgaSAhPSBlOyArK2kpCi0gICAgYXJnVHlwZXMucHVzaF9iYWNrKEZUUC0+Z2V0QXJnVHlwZShpKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVFAtPmdldE51bVBhcmFtcygpOyBpICE9IGU7ICsraSkKKyAgICBhcmdUeXBlcy5wdXNoX2JhY2soRlRQLT5nZXRQYXJhbVR5cGUoaSkpOworCisgIFRoZUNYWEFCSS5CdWlsZENvbnN0cnVjdG9yU2lnbmF0dXJlKEQsIGN0b3JLaW5kLCByZXN1bHRUeXBlLCBhcmdUeXBlcyk7CisKKyAgUmVxdWlyZWRBcmdzIHJlcXVpcmVkID0KKyAgICAgIChELT5pc1ZhcmlhZGljKCkgPyBSZXF1aXJlZEFyZ3MoYXJnVHlwZXMuc2l6ZSgpKSA6IFJlcXVpcmVkQXJnczo6QWxsKTsKIAogICBGdW5jdGlvblR5cGU6OkV4dEluZm8gZXh0SW5mbyA9IEZUUC0+Z2V0RXh0SW5mbygpOwotICByZXR1cm4gYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8ocmVzdWx0VHlwZSwgYXJnVHlwZXMsIGV4dEluZm8sIHJlcXVpcmVkKTsKKyAgcmV0dXJuIGFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKHJlc3VsdFR5cGUsIHRydWUsIGFyZ1R5cGVzLCBleHRJbmZvLCByZXF1aXJlZCk7Cit9CisKKy8vLyBBcnJhbmdlIGEgY2FsbCB0byBhIEMrKyBtZXRob2QsIHBhc3NpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cy4KK2NvbnN0IENHRnVuY3Rpb25JbmZvICYKK0NvZGVHZW5UeXBlczo6YXJyYW5nZUNYWENvbnN0cnVjdG9yQ2FsbChjb25zdCBDYWxsQXJnTGlzdCAmYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ3RvclR5cGUgQ3RvcktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRXh0cmFBcmdzKSB7CisgIC8vIEZJWE1FOiBLaWxsIGNvcHkuCisgIFNtYWxsVmVjdG9yPENhblF1YWxUeXBlLCAxNj4gQXJnVHlwZXM7CisgIGZvciAoQ2FsbEFyZ0xpc3Q6OmNvbnN0X2l0ZXJhdG9yIGkgPSBhcmdzLmJlZ2luKCksIGUgPSBhcmdzLmVuZCgpOyBpICE9IGU7CisgICAgICAgKytpKQorICAgIEFyZ1R5cGVzLnB1c2hfYmFjayhDb250ZXh0LmdldENhbm9uaWNhbFBhcmFtVHlwZShpLT5UeSkpOworCisgIENhblF1YWw8RnVuY3Rpb25Qcm90b1R5cGU+IEZQVCA9IEdldEZvcm1hbFR5cGUoRCk7CisgIFJlcXVpcmVkQXJncyBSZXF1aXJlZCA9IFJlcXVpcmVkQXJnczo6Zm9yUHJvdG90eXBlUGx1cyhGUFQsIDEgKyBFeHRyYUFyZ3MpOworICBHbG9iYWxEZWNsIEdEKEQsIEN0b3JLaW5kKTsKKyAgQ2FuUXVhbFR5cGUgUmVzdWx0VHlwZSA9CisgICAgICBUaGVDWFhBQkkuSGFzVGhpc1JldHVybihHRCkgPyBBcmdUeXBlcy5mcm9udCgpIDogQ29udGV4dC5Wb2lkVHk7CisKKyAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvIEluZm8gPSBGUFQtPmdldEV4dEluZm8oKTsKKyAgcmV0dXJuIGFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKFJlc3VsdFR5cGUsIHRydWUsIEFyZ1R5cGVzLCBJbmZvLCBSZXF1aXJlZCk7CiB9CiAKIC8vLyBBcnJhbmdlIHRoZSBhcmd1bWVudCBhbmQgcmVzdWx0IGluZm9ybWF0aW9uIGZvciBhIGRlY2xhcmF0aW9uLApAQCAtMjMyLDExICsyNjQsMTEgQEAKICAgVGhlQ1hYQUJJLkJ1aWxkRGVzdHJ1Y3RvclNpZ25hdHVyZShELCBkdG9yS2luZCwgcmVzdWx0VHlwZSwgYXJnVHlwZXMpOwogCiAgIENhblF1YWw8RnVuY3Rpb25Qcm90b1R5cGU+IEZUUCA9IEdldEZvcm1hbFR5cGUoRCk7Ci0gIGFzc2VydChGVFAtPmdldE51bUFyZ3MoKSA9PSAwICYmICJkdG9yIHdpdGggZm9ybWFsIHBhcmFtZXRlcnMiKTsKKyAgYXNzZXJ0KEZUUC0+Z2V0TnVtUGFyYW1zKCkgPT0gMCAmJiAiZHRvciB3aXRoIGZvcm1hbCBwYXJhbWV0ZXJzIik7CiAgIGFzc2VydChGVFAtPmlzVmFyaWFkaWMoKSA9PSAwICYmICJkdG9yIHdpdGggZm9ybWFsIHBhcmFtZXRlcnMiKTsKIAogICBGdW5jdGlvblR5cGU6OkV4dEluZm8gZXh0SW5mbyA9IEZUUC0+Z2V0RXh0SW5mbygpOwotICByZXR1cm4gYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8ocmVzdWx0VHlwZSwgYXJnVHlwZXMsIGV4dEluZm8sCisgIHJldHVybiBhcnJhbmdlTExWTUZ1bmN0aW9uSW5mbyhyZXN1bHRUeXBlLCB0cnVlLCBhcmdUeXBlcywgZXh0SW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkQXJnczo6QWxsKTsKIH0KIApAQCAtMjU2LDcgKzI4OCw3IEBACiAgIC8vIG5vbi12YXJpYWRpYyB0eXBlLgogICBpZiAoaXNhPEZ1bmN0aW9uTm9Qcm90b1R5cGU+KEZUeSkpIHsKICAgICBDYW5RdWFsPEZ1bmN0aW9uTm9Qcm90b1R5cGU+IG5vUHJvdG8gPSBGVHkuZ2V0QXM8RnVuY3Rpb25Ob1Byb3RvVHlwZT4oKTsKLSAgICByZXR1cm4gYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8obm9Qcm90by0+Z2V0UmVzdWx0VHlwZSgpLCBOb25lLAorICAgIHJldHVybiBhcnJhbmdlTExWTUZ1bmN0aW9uSW5mbyhub1Byb3RvLT5nZXRSZXR1cm5UeXBlKCksIGZhbHNlLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub1Byb3RvLT5nZXRFeHRJbmZvKCksIFJlcXVpcmVkQXJnczo6QWxsKTsKICAgfQogCkBAIC0yODYsMTMgKzMxOCwxMyBAQAogICBhcmdUeXMucHVzaF9iYWNrKENvbnRleHQuZ2V0Q2Fub25pY2FsUGFyYW1UeXBlKHJlY2VpdmVyVHlwZSkpOwogICBhcmdUeXMucHVzaF9iYWNrKENvbnRleHQuZ2V0Q2Fub25pY2FsUGFyYW1UeXBlKENvbnRleHQuZ2V0T2JqQ1NlbFR5cGUoKSkpOwogICAvLyBGSVhNRTogS2lsbCBjb3B5PwotICBmb3IgKE9iakNNZXRob2REZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBpID0gTUQtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgICBlID0gTUQtPnBhcmFtX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgIGFyZ1R5cy5wdXNoX2JhY2soQ29udGV4dC5nZXRDYW5vbmljYWxQYXJhbVR5cGUoKCppKS0+Z2V0VHlwZSgpKSk7CisgIGZvciAoY29uc3QgYXV0byAqSSA6IE1ELT5wYXJhbXMoKSkgeworICAgIGFyZ1R5cy5wdXNoX2JhY2soQ29udGV4dC5nZXRDYW5vbmljYWxQYXJhbVR5cGUoSS0+Z2V0VHlwZSgpKSk7CiAgIH0KIAogICBGdW5jdGlvblR5cGU6OkV4dEluZm8gZWluZm87Ci0gIGVpbmZvID0gZWluZm8ud2l0aENhbGxpbmdDb252KGdldENhbGxpbmdDb252ZW50aW9uRm9yRGVjbChNRCkpOworICBib29sIElzV2luZG93cyA9IGdldENvbnRleHQoKS5nZXRUYXJnZXRJbmZvKCkuZ2V0VHJpcGxlKCkuaXNPU1dpbmRvd3MoKTsKKyAgZWluZm8gPSBlaW5mby53aXRoQ2FsbGluZ0NvbnYoZ2V0Q2FsbGluZ0NvbnZlbnRpb25Gb3JEZWNsKE1ELCBJc1dpbmRvd3MpKTsKIAogICBpZiAoZ2V0Q29udGV4dCgpLmdldExhbmdPcHRzKCkuT2JqQ0F1dG9SZWZDb3VudCAmJgogICAgICAgTUQtPmhhc0F0dHI8TlNSZXR1cm5zUmV0YWluZWRBdHRyPigpKQpAQCAtMzAxLDggKzMzMyw4IEBACiAgIFJlcXVpcmVkQXJncyByZXF1aXJlZCA9CiAgICAgKE1ELT5pc1ZhcmlhZGljKCkgPyBSZXF1aXJlZEFyZ3MoYXJnVHlzLnNpemUoKSkgOiBSZXF1aXJlZEFyZ3M6OkFsbCk7CiAKLSAgcmV0dXJuIGFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKEdldFJldHVyblR5cGUoTUQtPmdldFJlc3VsdFR5cGUoKSksIGFyZ1R5cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpbmZvLCByZXF1aXJlZCk7CisgIHJldHVybiBhcnJhbmdlTExWTUZ1bmN0aW9uSW5mbyhHZXRSZXR1cm5UeXBlKE1ELT5nZXRSZXR1cm5UeXBlKCkpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1R5cywgZWluZm8sIHJlcXVpcmVkKTsKIH0KIAogY29uc3QgQ0dGdW5jdGlvbkluZm8gJgpAQCAtMzM2LDcgKzM2OCw3IEBACiAgIC8vIGV4dHJhIHByZWZpeCBwbHVzIHRoZSBhcmd1bWVudHMgaW4gdGhlIHByb3RvdHlwZS4KICAgaWYgKGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpwcm90byA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihmblR5cGUpKSB7CiAgICAgaWYgKHByb3RvLT5pc1ZhcmlhZGljKCkpCi0gICAgICByZXF1aXJlZCA9IFJlcXVpcmVkQXJncyhwcm90by0+Z2V0TnVtQXJncygpICsgbnVtRXh0cmFSZXF1aXJlZEFyZ3MpOworICAgICAgcmVxdWlyZWQgPSBSZXF1aXJlZEFyZ3MocHJvdG8tPmdldE51bVBhcmFtcygpICsgbnVtRXh0cmFSZXF1aXJlZEFyZ3MpOwogCiAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBwcm90b3R5cGUgYXQgYWxsLCBidXQgd2UncmUgc3VwcG9zZWQgdG8KICAgLy8gZXhwbGljaXRseSB1c2UgdGhlIHZhcmlhZGljIGNvbnZlbnRpb24gZm9yIHVucHJvdG90eXBlZCBjYWxscywKQEAgLTM0OCw3ICszODAsNyBAQAogICAgIHJlcXVpcmVkID0gUmVxdWlyZWRBcmdzKGFyZ3Muc2l6ZSgpKTsKICAgfQogCi0gIHJldHVybiBDR1QuYXJyYW5nZUZyZWVGdW5jdGlvbkNhbGwoZm5UeXBlLT5nZXRSZXN1bHRUeXBlKCksIGFyZ3MsCisgIHJldHVybiBDR1QuYXJyYW5nZUZyZWVGdW5jdGlvbkNhbGwoZm5UeXBlLT5nZXRSZXR1cm5UeXBlKCksIGFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5UeXBlLT5nZXRFeHRJbmZvKCksIHJlcXVpcmVkKTsKIH0KIApAQCAtMzgwLDggKzQxMiw4IEBACiAgIGZvciAoQ2FsbEFyZ0xpc3Q6OmNvbnN0X2l0ZXJhdG9yIGkgPSBhcmdzLmJlZ2luKCksIGUgPSBhcmdzLmVuZCgpOwogICAgICAgIGkgIT0gZTsgKytpKQogICAgIGFyZ1R5cGVzLnB1c2hfYmFjayhDb250ZXh0LmdldENhbm9uaWNhbFBhcmFtVHlwZShpLT5UeSkpOwotICByZXR1cm4gYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oR2V0UmV0dXJuVHlwZShyZXN1bHRUeXBlKSwgYXJnVHlwZXMsIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCk7CisgIHJldHVybiBhcnJhbmdlTExWTUZ1bmN0aW9uSW5mbyhHZXRSZXR1cm5UeXBlKHJlc3VsdFR5cGUpLCBmYWxzZSwgYXJnVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLCByZXF1aXJlZCk7CiB9CiAKIC8vLyBBcnJhbmdlIGEgY2FsbCB0byBhIEMrKyBtZXRob2QsIHBhc3NpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cy4KQEAgLTM5NiwxNSArNDI4LDEzIEBACiAgICAgYXJnVHlwZXMucHVzaF9iYWNrKENvbnRleHQuZ2V0Q2Fub25pY2FsUGFyYW1UeXBlKGktPlR5KSk7CiAKICAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvIGluZm8gPSBGUFQtPmdldEV4dEluZm8oKTsKLSAgcmV0dXJuIGFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKEdldFJldHVyblR5cGUoRlBULT5nZXRSZXN1bHRUeXBlKCkpLAorICByZXR1cm4gYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oR2V0UmV0dXJuVHlwZShGUFQtPmdldFJldHVyblR5cGUoKSksIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdUeXBlcywgaW5mbywgcmVxdWlyZWQpOwogfQogCi1jb25zdCBDR0Z1bmN0aW9uSW5mbyAmCi1Db2RlR2VuVHlwZXM6OmFycmFuZ2VGdW5jdGlvbkRlY2xhcmF0aW9uKFF1YWxUeXBlIHJlc3VsdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uQXJnTGlzdCAmYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25UeXBlOjpFeHRJbmZvICZpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyaWFkaWMpIHsKK2NvbnN0IENHRnVuY3Rpb25JbmZvICZDb2RlR2VuVHlwZXM6OmFycmFuZ2VGcmVlRnVuY3Rpb25EZWNsYXJhdGlvbigKKyAgICBRdWFsVHlwZSByZXN1bHRUeXBlLCBjb25zdCBGdW5jdGlvbkFyZ0xpc3QgJmFyZ3MsCisgICAgY29uc3QgRnVuY3Rpb25UeXBlOjpFeHRJbmZvICZpbmZvLCBib29sIGlzVmFyaWFkaWMpIHsKICAgLy8gRklYTUU6IEtpbGwgY29weS4KICAgU21hbGxWZWN0b3I8Q2FuUXVhbFR5cGUsIDE2PiBhcmdUeXBlczsKICAgZm9yIChGdW5jdGlvbkFyZ0xpc3Q6OmNvbnN0X2l0ZXJhdG9yIGkgPSBhcmdzLmJlZ2luKCksIGUgPSBhcmdzLmVuZCgpOwpAQCAtNDEzLDEyICs0NDMsMTIgQEAKIAogICBSZXF1aXJlZEFyZ3MgcmVxdWlyZWQgPQogICAgIChpc1ZhcmlhZGljID8gUmVxdWlyZWRBcmdzKGFyZ3Muc2l6ZSgpKSA6IFJlcXVpcmVkQXJnczo6QWxsKTsKLSAgcmV0dXJuIGFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKEdldFJldHVyblR5cGUocmVzdWx0VHlwZSksIGFyZ1R5cGVzLCBpbmZvLAorICByZXR1cm4gYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oR2V0UmV0dXJuVHlwZShyZXN1bHRUeXBlKSwgZmFsc2UsIGFyZ1R5cGVzLCBpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQpOwogfQogCiBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmQ29kZUdlblR5cGVzOjphcnJhbmdlTnVsbGFyeUZ1bmN0aW9uKCkgewotICByZXR1cm4gYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oZ2V0Q29udGV4dCgpLlZvaWRUeSwgTm9uZSwKKyAgcmV0dXJuIGFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKGdldENvbnRleHQoKS5Wb2lkVHksIGZhbHNlLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvKCksIFJlcXVpcmVkQXJnczo6QWxsKTsKIH0KIApAQCAtNDI3LDYgKzQ1Nyw3IEBACiAvLy8gYWJvdmUgZnVuY3Rpb25zIHVsdGltYXRlbHkgZGVmZXIgdG8uCiBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmCiBDb2RlR2VuVHlwZXM6OmFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKENhblF1YWxUeXBlIHJlc3VsdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbnN0YW5jZU1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q2FuUXVhbFR5cGU+IGFyZ1R5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblR5cGU6OkV4dEluZm8gaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRBcmdzIHJlcXVpcmVkKSB7CkBAIC00NDAsNyArNDcxLDggQEAKIAogICAvLyBMb29rdXAgb3IgY3JlYXRlIHVuaXF1ZSBmdW5jdGlvbiBpbmZvLgogICBsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEIElEOwotICBDR0Z1bmN0aW9uSW5mbzo6UHJvZmlsZShJRCwgaW5mbywgcmVxdWlyZWQsIHJlc3VsdFR5cGUsIGFyZ1R5cGVzKTsKKyAgQ0dGdW5jdGlvbkluZm86OlByb2ZpbGUoSUQsIElzSW5zdGFuY2VNZXRob2QsIGluZm8sIHJlcXVpcmVkLCByZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdUeXBlcyk7CiAKICAgdm9pZCAqaW5zZXJ0UG9zID0gMDsKICAgQ0dGdW5jdGlvbkluZm8gKkZJID0gRnVuY3Rpb25JbmZvcy5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBpbnNlcnRQb3MpOwpAQCAtNDQ4LDcgKzQ4MCw4IEBACiAgICAgcmV0dXJuICpGSTsKIAogICAvLyBDb25zdHJ1Y3QgdGhlIGZ1bmN0aW9uIGluZm8uICBXZSBjby1hbGxvY2F0ZSB0aGUgQXJnSW5mb3MuCi0gIEZJID0gQ0dGdW5jdGlvbkluZm86OmNyZWF0ZShDQywgaW5mbywgcmVzdWx0VHlwZSwgYXJnVHlwZXMsIHJlcXVpcmVkKTsKKyAgRkkgPSBDR0Z1bmN0aW9uSW5mbzo6Y3JlYXRlKENDLCBJc0luc3RhbmNlTWV0aG9kLCBpbmZvLCByZXN1bHRUeXBlLCBhcmdUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkKTsKICAgRnVuY3Rpb25JbmZvcy5JbnNlcnROb2RlKEZJLCBpbnNlcnRQb3MpOwogCiAgIGJvb2wgaW5zZXJ0ZWQgPSBGdW5jdGlvbnNCZWluZ1Byb2Nlc3NlZC5pbnNlcnQoRkkpOyAodm9pZClpbnNlcnRlZDsKQEAgLTQ2NCwxMCArNDk3LDkgQEAKICAgaWYgKHJldEluZm8uY2FuSGF2ZUNvZXJjZVRvVHlwZSgpICYmIHJldEluZm8uZ2V0Q29lcmNlVG9UeXBlKCkgPT0gMCkKICAgICByZXRJbmZvLnNldENvZXJjZVRvVHlwZShDb252ZXJ0VHlwZShGSS0+Z2V0UmV0dXJuVHlwZSgpKSk7CiAKLSAgZm9yIChDR0Z1bmN0aW9uSW5mbzo6YXJnX2l0ZXJhdG9yIEkgPSBGSS0+YXJnX2JlZ2luKCksIEUgPSBGSS0+YXJnX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKQotICAgIGlmIChJLT5pbmZvLmNhbkhhdmVDb2VyY2VUb1R5cGUoKSAmJiBJLT5pbmZvLmdldENvZXJjZVRvVHlwZSgpID09IDApCi0gICAgICBJLT5pbmZvLnNldENvZXJjZVRvVHlwZShDb252ZXJ0VHlwZShJLT50eXBlKSk7CisgIGZvciAoYXV0byAmSSA6IEZJLT5hcmd1bWVudHMoKSkKKyAgICBpZiAoSS5pbmZvLmNhbkhhdmVDb2VyY2VUb1R5cGUoKSAmJiBJLmluZm8uZ2V0Q29lcmNlVG9UeXBlKCkgPT0gMCkKKyAgICAgIEkuaW5mby5zZXRDb2VyY2VUb1R5cGUoQ29udmVydFR5cGUoSS50eXBlKSk7CiAKICAgYm9vbCBlcmFzZWQgPSBGdW5jdGlvbnNCZWluZ1Byb2Nlc3NlZC5lcmFzZShGSSk7ICh2b2lkKWVyYXNlZDsKICAgYXNzZXJ0KGVyYXNlZCAmJiAiTm90IGluIHNldD8iKTsKQEAgLTQ3Niw2ICs1MDgsNyBAQAogfQogCiBDR0Z1bmN0aW9uSW5mbyAqQ0dGdW5jdGlvbkluZm86OmNyZWF0ZSh1bnNpZ25lZCBsbHZtQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW5zdGFuY2VNZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblR5cGU6OkV4dEluZm8gJmluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsVHlwZSByZXN1bHRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q2FuUXVhbFR5cGU+IGFyZ1R5cGVzLApAQCAtNDg2LDExICs1MTksMTMgQEAKICAgRkktPkNhbGxpbmdDb252ZW50aW9uID0gbGx2bUNDOwogICBGSS0+RWZmZWN0aXZlQ2FsbGluZ0NvbnZlbnRpb24gPSBsbHZtQ0M7CiAgIEZJLT5BU1RDYWxsaW5nQ29udmVudGlvbiA9IGluZm8uZ2V0Q0MoKTsKKyAgRkktPkluc3RhbmNlTWV0aG9kID0gSXNJbnN0YW5jZU1ldGhvZDsKICAgRkktPk5vUmV0dXJuID0gaW5mby5nZXROb1JldHVybigpOwogICBGSS0+UmV0dXJuc1JldGFpbmVkID0gaW5mby5nZXRQcm9kdWNlc1Jlc3VsdCgpOwogICBGSS0+UmVxdWlyZWQgPSByZXF1aXJlZDsKICAgRkktPkhhc1JlZ1Bhcm0gPSBpbmZvLmdldEhhc1JlZ1Bhcm0oKTsKICAgRkktPlJlZ1Bhcm0gPSBpbmZvLmdldFJlZ1Bhcm0oKTsKKyAgRkktPkFyZ1N0cnVjdCA9IDA7CiAgIEZJLT5OdW1BcmdzID0gYXJnVHlwZXMuc2l6ZSgpOwogICBGSS0+Z2V0QXJnc0J1ZmZlcigpWzBdLnR5cGUgPSByZXN1bHRUeXBlOwogICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gYXJnVHlwZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKQEAgLTUxNiw5ICs1NTEsNyBAQAogICAgICAgY29uc3QgRmllbGREZWNsICpMYXJnZXN0RkQgPSAwOwogICAgICAgQ2hhclVuaXRzIFVuaW9uU2l6ZSA9IENoYXJVbml0czo6WmVybygpOwogCi0gICAgICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIGkgPSBSRC0+ZmllbGRfYmVnaW4oKSwgZSA9IFJELT5maWVsZF9lbmQoKTsKLSAgICAgICAgICAgaSAhPSBlOyArK2kpIHsKLSAgICAgICAgY29uc3QgRmllbGREZWNsICpGRCA9ICppOworICAgICAgZm9yIChjb25zdCBhdXRvICpGRCA6IFJELT5maWVsZHMoKSkgewogICAgICAgICBhc3NlcnQoIUZELT5pc0JpdEZpZWxkKCkgJiYKICAgICAgICAgICAgICAgICJDYW5ub3QgZXhwYW5kIHN0cnVjdHVyZSB3aXRoIGJpdC1maWVsZCBtZW1iZXJzLiIpOwogICAgICAgICBDaGFyVW5pdHMgRmllbGRTaXplID0gZ2V0Q29udGV4dCgpLmdldFR5cGVTaXplSW5DaGFycyhGRC0+Z2V0VHlwZSgpKTsKQEAgLTUzMCwxMSArNTYzLDEwIEBACiAgICAgICBpZiAoTGFyZ2VzdEZEKQogICAgICAgICBHZXRFeHBhbmRlZFR5cGVzKExhcmdlc3RGRC0+Z2V0VHlwZSgpLCBleHBhbmRlZFR5cGVzKTsKICAgICB9IGVsc2UgewotICAgICAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBpID0gUkQtPmZpZWxkX2JlZ2luKCksIGUgPSBSRC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgICAgIGFzc2VydCghaS0+aXNCaXRGaWVsZCgpICYmCisgICAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBSRC0+ZmllbGRzKCkpIHsKKyAgICAgICAgYXNzZXJ0KCFJLT5pc0JpdEZpZWxkKCkgJiYKICAgICAgICAgICAgICAgICJDYW5ub3QgZXhwYW5kIHN0cnVjdHVyZSB3aXRoIGJpdC1maWVsZCBtZW1iZXJzLiIpOwotICAgICAgICBHZXRFeHBhbmRlZFR5cGVzKGktPmdldFR5cGUoKSwgZXhwYW5kZWRUeXBlcyk7CisgICAgICAgIEdldEV4cGFuZGVkVHlwZXMoSS0+Z2V0VHlwZSgpLCBleHBhbmRlZFR5cGVzKTsKICAgICAgIH0KICAgICB9CiAgIH0gZWxzZSBpZiAoY29uc3QgQ29tcGxleFR5cGUgKkNUID0gdHlwZS0+Z2V0QXM8Q29tcGxleFR5cGU+KCkpIHsKQEAgLTU2Nyw5ICs1OTksNyBAQAogICAgICAgY29uc3QgRmllbGREZWNsICpMYXJnZXN0RkQgPSAwOwogICAgICAgQ2hhclVuaXRzIFVuaW9uU2l6ZSA9IENoYXJVbml0czo6WmVybygpOwogCi0gICAgICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIGkgPSBSRC0+ZmllbGRfYmVnaW4oKSwgZSA9IFJELT5maWVsZF9lbmQoKTsKLSAgICAgICAgICAgaSAhPSBlOyArK2kpIHsKLSAgICAgICAgY29uc3QgRmllbGREZWNsICpGRCA9ICppOworICAgICAgZm9yIChjb25zdCBhdXRvICpGRCA6IFJELT5maWVsZHMoKSkgewogICAgICAgICBhc3NlcnQoIUZELT5pc0JpdEZpZWxkKCkgJiYKICAgICAgICAgICAgICAgICJDYW5ub3QgZXhwYW5kIHN0cnVjdHVyZSB3aXRoIGJpdC1maWVsZCBtZW1iZXJzLiIpOwogICAgICAgICBDaGFyVW5pdHMgRmllbGRTaXplID0gZ2V0Q29udGV4dCgpLmdldFR5cGVTaXplSW5DaGFycyhGRC0+Z2V0VHlwZSgpKTsKQEAgLTU4NCw5ICs2MTQsNyBAQAogICAgICAgICBBSSA9IEV4cGFuZFR5cGVGcm9tQXJncyhMYXJnZXN0RkQtPmdldFR5cGUoKSwgU3ViTFYsIEFJKTsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBpID0gUkQtPmZpZWxkX2JlZ2luKCksIGUgPSBSRC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgICAgIEZpZWxkRGVjbCAqRkQgPSAqaTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAqRkQgOiBSRC0+ZmllbGRzKCkpIHsKICAgICAgICAgUXVhbFR5cGUgRlQgPSBGRC0+Z2V0VHlwZSgpOwogCiAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGFyZSB0aGUgcmlnaHQgcXVhbGlmaWVycyBoZXJlPwpAQCAtODUwLDYgKzg3OCwxMSBAQAogICByZXR1cm4gRkkuZ2V0UmV0dXJuSW5mbygpLmlzSW5kaXJlY3QoKTsKIH0KIAorYm9vbCBDb2RlR2VuTW9kdWxlOjpSZXR1cm5TbG90SW50ZXJmZXJlc1dpdGhBcmdzKGNvbnN0IENHRnVuY3Rpb25JbmZvICZGSSkgeworICByZXR1cm4gUmV0dXJuVHlwZVVzZXNTUmV0KEZJKSAmJgorICAgICAgICAgZ2V0VGFyZ2V0Q29kZUdlbkluZm8oKS5kb2VzUmV0dXJuU2xvdEludGVyZmVyZVdpdGhBcmdzKCk7Cit9CisKIGJvb2wgQ29kZUdlbk1vZHVsZTo6UmV0dXJuVHlwZVVzZXNGUFJldChRdWFsVHlwZSBSZXN1bHRUeXBlKSB7CiAgIGlmIChjb25zdCBCdWlsdGluVHlwZSAqQlQgPSBSZXN1bHRUeXBlLT5nZXRBczxCdWlsdGluVHlwZT4oKSkgewogICAgIHN3aXRjaCAoQlQtPmdldEtpbmQoKSkgewpAQCAtOTAyLDYgKzkzNSwxOCBAQAogICAgIHJlc3VsdFR5cGUgPSByZXRBSS5nZXRDb2VyY2VUb1R5cGUoKTsKICAgICBicmVhazsKIAorICBjYXNlIEFCSUFyZ0luZm86OkluQWxsb2NhOgorICAgIGlmIChyZXRBSS5nZXRJbkFsbG9jYVNSZXQoKSkgeworICAgICAgLy8gc3JldCB0aGluZ3Mgb24gd2luMzIgYXJlbid0IHZvaWQsIHRoZXkgcmV0dXJuIHRoZSBzcmV0IHBvaW50ZXIuCisgICAgICBRdWFsVHlwZSByZXQgPSBGSS5nZXRSZXR1cm5UeXBlKCk7CisgICAgICBsbHZtOjpUeXBlICp0eSA9IENvbnZlcnRUeXBlKHJldCk7CisgICAgICB1bnNpZ25lZCBhZGRyZXNzU3BhY2UgPSBDb250ZXh0LmdldFRhcmdldEFkZHJlc3NTcGFjZShyZXQpOworICAgICAgcmVzdWx0VHlwZSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXQodHksIGFkZHJlc3NTcGFjZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdFR5cGUgPSBsbHZtOjpUeXBlOjpnZXRWb2lkVHkoZ2V0TExWTUNvbnRleHQoKSk7CisgICAgfQorICAgIGJyZWFrOworCiAgIGNhc2UgQUJJQXJnSW5mbzo6SW5kaXJlY3Q6IHsKICAgICBhc3NlcnQoIXJldEFJLmdldEluZGlyZWN0QWxpZ24oKSAmJiAiQWxpZ24gdW51c2VkIG9uIGluZGlyZWN0IHJldHVybi4iKTsKICAgICByZXN1bHRUeXBlID0gbGx2bTo6VHlwZTo6Z2V0Vm9pZFR5KGdldExMVk1Db250ZXh0KCkpOwpAQCAtOTM0LDYgKzk3OSw3IEBACiAKICAgICBzd2l0Y2ggKGFyZ0FJLmdldEtpbmQoKSkgewogICAgIGNhc2UgQUJJQXJnSW5mbzo6SWdub3JlOgorICAgIGNhc2UgQUJJQXJnSW5mbzo6SW5BbGxvY2E6CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgQUJJQXJnSW5mbzo6SW5kaXJlY3Q6IHsKQEAgLTk2NCw2ICsxMDEwLDEwIEBACiAgICAgfQogICB9CiAKKyAgLy8gQWRkIHRoZSBpbmFsbG9jYSBzdHJ1Y3QgYXMgdGhlIGxhc3QgcGFyYW1ldGVyIHR5cGUuCisgIGlmIChsbHZtOjpTdHJ1Y3RUeXBlICpBcmdTdHJ1Y3QgPSBGSS5nZXRBcmdTdHJ1Y3QoKSkKKyAgICBhcmdUeXBlcy5wdXNoX2JhY2soQXJnU3RydWN0LT5nZXRQb2ludGVyVG8oKSk7CisKICAgYm9vbCBFcmFzZWQgPSBGdW5jdGlvbnNCZWluZ1Byb2Nlc3NlZC5lcmFzZSgmRkkpOyAodm9pZClFcmFzZWQ7CiAgIGFzc2VydChFcmFzZWQgJiYgIk5vdCBpbiBzZXQ/Iik7CiAgIApAQCAtMTAwNiw2ICsxMDU2LDggQEAKICAgICAgIEZ1bmNBdHRycy5hZGRBdHRyaWJ1dGUobGx2bTo6QXR0cmlidXRlOjpOb1Vud2luZCk7CiAgICAgaWYgKFRhcmdldERlY2wtPmhhc0F0dHI8Tm9SZXR1cm5BdHRyPigpKQogICAgICAgRnVuY0F0dHJzLmFkZEF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6Ok5vUmV0dXJuKTsKKyAgICBpZiAoVGFyZ2V0RGVjbC0+aGFzQXR0cjxOb0R1cGxpY2F0ZUF0dHI+KCkpCisgICAgICBGdW5jQXR0cnMuYWRkQXR0cmlidXRlKGxsdm06OkF0dHJpYnV0ZTo6Tm9EdXBsaWNhdGUpOwogCiAgICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRm4gPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KFRhcmdldERlY2wpKSB7CiAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0gRm4tPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CkBAIC0xMDg5LDYgKzExNDEsMTMgQEAKICAgY2FzZSBBQklBcmdJbmZvOjpJZ25vcmU6CiAgICAgYnJlYWs7CiAKKyAgY2FzZSBBQklBcmdJbmZvOjpJbkFsbG9jYTogeworICAgIC8vIGluYWxsb2NhIGRpc2FibGVzIHJlYWRub25lIGFuZCByZWFkb25seQorICAgIEZ1bmNBdHRycy5yZW1vdmVBdHRyaWJ1dGUobGx2bTo6QXR0cmlidXRlOjpSZWFkT25seSkKKyAgICAgIC5yZW1vdmVBdHRyaWJ1dGUobGx2bTo6QXR0cmlidXRlOjpSZWFkTm9uZSk7CisgICAgYnJlYWs7CisgIH0KKwogICBjYXNlIEFCSUFyZ0luZm86OkluZGlyZWN0OiB7CiAgICAgbGx2bTo6QXR0ckJ1aWxkZXIgU1JFVEF0dHJzOwogICAgIFNSRVRBdHRycy5hZGRBdHRyaWJ1dGUobGx2bTo6QXR0cmlidXRlOjpTdHJ1Y3RSZXQpOwpAQCAtMTExNCwxMCArMTE3Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBdHRyaWJ1dGVTZXQ6OlJldHVybkluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0QXR0cnMpKTsKIAotICBmb3IgKENHRnVuY3Rpb25JbmZvOjpjb25zdF9hcmdfaXRlcmF0b3IgaXQgPSBGSS5hcmdfYmVnaW4oKSwKLSAgICAgICAgIGllID0gRkkuYXJnX2VuZCgpOyBpdCAhPSBpZTsgKytpdCkgewotICAgIFF1YWxUeXBlIFBhcmFtVHlwZSA9IGl0LT50eXBlOwotICAgIGNvbnN0IEFCSUFyZ0luZm8gJkFJID0gaXQtPmluZm87CisgIGZvciAoY29uc3QgYXV0byAmSSA6IEZJLmFyZ3VtZW50cygpKSB7CisgICAgUXVhbFR5cGUgUGFyYW1UeXBlID0gSS50eXBlOworICAgIGNvbnN0IEFCSUFyZ0luZm8gJkFJID0gSS5pbmZvOwogICAgIGxsdm06OkF0dHJCdWlsZGVyIEF0dHJzOwogCiAgICAgaWYgKEFJLmdldFBhZGRpbmdUeXBlKCkpIHsKQEAgLTExNzMsNiArMTIzMSwxMyBAQAogICAgICAgLy8gU2tpcCBpbmNyZW1lbnQsIG5vIG1hdGNoaW5nIExMVk0gcGFyYW1ldGVyLgogICAgICAgY29udGludWU7CiAKKyAgICBjYXNlIEFCSUFyZ0luZm86OkluQWxsb2NhOgorICAgICAgLy8gaW5hbGxvY2EgZGlzYWJsZXMgcmVhZG5vbmUgYW5kIHJlYWRvbmx5LgorICAgICAgRnVuY0F0dHJzLnJlbW92ZUF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6OlJlYWRPbmx5KQorICAgICAgICAgIC5yZW1vdmVBdHRyaWJ1dGUobGx2bTo6QXR0cmlidXRlOjpSZWFkTm9uZSk7CisgICAgICAvLyBTa2lwIGluY3JlbWVudCwgbm8gbWF0Y2hpbmcgTExWTSBwYXJhbWV0ZXIuCisgICAgICBjb250aW51ZTsKKwogICAgIGNhc2UgQUJJQXJnSW5mbzo6RXhwYW5kOiB7CiAgICAgICBTbWFsbFZlY3RvcjxsbHZtOjpUeXBlKiwgOD4gdHlwZXM7CiAgICAgICAvLyBGSVhNRTogVGhpcyBpcyByYXRoZXIgaW5lZmZpY2llbnQuIERvIHdlIGV2ZXIgYWN0dWFsbHkgbmVlZCB0byBkbwpAQCAtMTE4OCw2ICsxMjUzLDE0IEBACiAgICAgICBQQUwucHVzaF9iYWNrKGxsdm06OkF0dHJpYnV0ZVNldDo6Z2V0KGdldExMVk1Db250ZXh0KCksIEluZGV4LCBBdHRycykpOwogICAgICsrSW5kZXg7CiAgIH0KKworICAvLyBBZGQgdGhlIGluYWxsb2NhIGF0dHJpYnV0ZSB0byB0aGUgdHJhaWxpbmcgaW5hbGxvY2EgcGFyYW1ldGVyIGlmIHByZXNlbnQuCisgIGlmIChGSS51c2VzSW5BbGxvY2EoKSkgeworICAgIGxsdm06OkF0dHJCdWlsZGVyIEF0dHJzOworICAgIEF0dHJzLmFkZEF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6OkluQWxsb2NhKTsKKyAgICBQQUwucHVzaF9iYWNrKGxsdm06OkF0dHJpYnV0ZVNldDo6Z2V0KGdldExMVk1Db250ZXh0KCksIEluZGV4LCBBdHRycykpOworICB9CisKICAgaWYgKEZ1bmNBdHRycy5oYXNBdHRyaWJ1dGVzKCkpCiAgICAgUEFMLnB1c2hfYmFjayhsbHZtOjoKICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVNldDo6Z2V0KGdldExMVk1Db250ZXh0KCksCkBAIC0xMjI0LDcgKzEyOTcsNyBAQAogICAvLyByZXR1cm4gc3RhdGVtZW50cy4KICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBkeW5fY2FzdF9vcl9udWxsPEZ1bmN0aW9uRGVjbD4oQ3VyQ29kZURlY2wpKSB7CiAgICAgaWYgKEZELT5oYXNJbXBsaWNpdFJldHVyblplcm8oKSkgewotICAgICAgUXVhbFR5cGUgUmV0VHkgPSBGRC0+Z2V0UmVzdWx0VHlwZSgpLmdldFVucXVhbGlmaWVkVHlwZSgpOworICAgICAgUXVhbFR5cGUgUmV0VHkgPSBGRC0+Z2V0UmV0dXJuVHlwZSgpLmdldFVucXVhbGlmaWVkVHlwZSgpOwogICAgICAgbGx2bTo6VHlwZSogTExWTVR5ID0gQ0dNLmdldFR5cGVzKCkuQ29udmVydFR5cGUoUmV0VHkpOwogICAgICAgbGx2bTo6Q29uc3RhbnQqIFplcm8gPSBsbHZtOjpDb25zdGFudDo6Z2V0TnVsbFZhbHVlKExMVk1UeSk7CiAgICAgICBCdWlsZGVyLkNyZWF0ZVN0b3JlKFplcm8sIFJldHVyblZhbHVlKTsKQEAgLTEyMzcsNiArMTMxMCwxNiBAQAogICAvLyBFbWl0IGFsbG9jcyBmb3IgcGFyYW0gZGVjbHMuICBHaXZlIHRoZSBMTFZNIEFyZ3VtZW50IG5vZGVzIG5hbWVzLgogICBsbHZtOjpGdW5jdGlvbjo6YXJnX2l0ZXJhdG9yIEFJID0gRm4tPmFyZ19iZWdpbigpOwogCisgIC8vIElmIHdlJ3JlIHVzaW5nIGluYWxsb2NhLCBhbGwgdGhlIG1lbW9yeSBhcmd1bWVudHMgYXJlIEdFUHMgb2ZmIG9mIHRoZSBsYXN0CisgIC8vIHBhcmFtZXRlciwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSBjb21wbGV0ZSBtZW1vcnkgYXJlYS4KKyAgbGx2bTo6VmFsdWUgKkFyZ1N0cnVjdCA9IDA7CisgIGlmIChGSS51c2VzSW5BbGxvY2EoKSkgeworICAgIGxsdm06OkZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgRUkgPSBGbi0+YXJnX2VuZCgpOworICAgIC0tRUk7CisgICAgQXJnU3RydWN0ID0gRUk7CisgICAgYXNzZXJ0KEFyZ1N0cnVjdC0+Z2V0VHlwZSgpID09IEZJLmdldEFyZ1N0cnVjdCgpLT5nZXRQb2ludGVyVG8oKSk7CisgIH0KKwogICAvLyBOYW1lIHRoZSBzdHJ1Y3QgcmV0dXJuIGFyZ3VtZW50LgogICBpZiAoQ0dNLlJldHVyblR5cGVVc2VzU1JldChGSSkpIHsKICAgICBBSS0+c2V0TmFtZSgiYWdnLnJlc3VsdCIpOwpAQCAtMTI0Niw2ICsxMzI5LDE4IEBACiAgICAgKytBSTsKICAgfQogCisgIC8vIFRyYWNrIGlmIHdlIHJlY2VpdmVkIHRoZSBwYXJhbWV0ZXIgYXMgYSBwb2ludGVyIChpbmRpcmVjdCwgYnl2YWwsIG9yCisgIC8vIGluYWxsb2NhKS4gIElmIGFscmVhZHkgaGF2ZSBhIHBvaW50ZXIsIEVtaXRQYXJtRGVjbCBkb2Vzbid0IG5lZWQgdG8gY29weSBpdAorICAvLyBpbnRvIGEgbG9jYWwgYWxsb2NhIGZvciB1cy4KKyAgZW51bSBWYWxPclBvaW50ZXIgeyBIYXZlVmFsdWUgPSAwLCBIYXZlUG9pbnRlciA9IDEgfTsKKyAgdHlwZWRlZiBsbHZtOjpQb2ludGVySW50UGFpcjxsbHZtOjpWYWx1ZSAqLCAxPiBWYWx1ZUFuZElzUHRyOworICBTbWFsbFZlY3RvcjxWYWx1ZUFuZElzUHRyLCAxNj4gQXJnVmFsczsKKyAgQXJnVmFscy5yZXNlcnZlKEFyZ3Muc2l6ZSgpKTsKKworICAvLyBDcmVhdGUgYSBwb2ludGVyIHZhbHVlIGZvciBldmVyeSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uICBUaGlzIHVzdWFsbHkKKyAgLy8gZW50YWlscyBjb3B5aW5nIG9uZSBvciBtb3JlIExMVk0gSVIgYXJndW1lbnRzIGludG8gYW4gYWxsb2NhLiAgRG9uJ3QgcHVzaAorICAvLyBhbnkgY2xlYW51cHMgb3IgZG8gYW55dGhpbmcgdGhhdCBtaWdodCB1bndpbmQuICBXZSBkbyB0aGF0IHNlcGFyYXRlbHksIHNvCisgIC8vIHdlIGNhbiBwdXNoIHRoZSBjbGVhbnVwcyBpbiB0aGUgY29ycmVjdCBvcmRlciBmb3IgdGhlIEFCSS4KICAgYXNzZXJ0KEZJLmFyZ19zaXplKCkgPT0gQXJncy5zaXplKCkgJiYKICAgICAgICAgICJNaXNtYXRjaCBiZXR3ZWVuIGZ1bmN0aW9uIHNpZ25hdHVyZSAmIGFyZ3VtZW50cy4iKTsKICAgdW5zaWduZWQgQXJnTm8gPSAxOwpAQCAtMTI2NCw2ICsxMzU5LDEzIEBACiAgICAgICArK0FJOwogCiAgICAgc3dpdGNoIChBcmdJLmdldEtpbmQoKSkgeworICAgIGNhc2UgQUJJQXJnSW5mbzo6SW5BbGxvY2E6IHsKKyAgICAgIGxsdm06OlZhbHVlICpWID0gQnVpbGRlci5DcmVhdGVTdHJ1Y3RHRVAoCisgICAgICAgICAgQXJnU3RydWN0LCBBcmdJLmdldEluQWxsb2NhRmllbGRJbmRleCgpLCBBcmctPmdldE5hbWUoKSk7CisgICAgICBBcmdWYWxzLnB1c2hfYmFjayhWYWx1ZUFuZElzUHRyKFYsIEhhdmVQb2ludGVyKSk7CisgICAgICBjb250aW51ZTsgIC8vIERvbid0IGluY3JlbWVudCBBSSEKKyAgICB9CisKICAgICBjYXNlIEFCSUFyZ0luZm86OkluZGlyZWN0OiB7CiAgICAgICBsbHZtOjpWYWx1ZSAqViA9IEFJOwogCkBAIC0xMjkwLDYgKzEzOTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgICBWID0gQWxpZ25lZFRlbXA7CiAgICAgICAgIH0KKyAgICAgICAgQXJnVmFscy5wdXNoX2JhY2soVmFsdWVBbmRJc1B0cihWLCBIYXZlUG9pbnRlcikpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gTG9hZCBzY2FsYXIgdmFsdWUgZnJvbSBpbmRpcmVjdCBhcmd1bWVudC4KICAgICAgICAgQ2hhclVuaXRzIEFsaWdubWVudCA9IGdldENvbnRleHQoKS5nZXRUeXBlQWxpZ25JbkNoYXJzKFR5KTsKQEAgLTEyOTgsOCArMTQwMSw4IEBACiAKICAgICAgICAgaWYgKGlzUHJvbW90ZWQpCiAgICAgICAgICAgViA9IGVtaXRBcmd1bWVudERlbW90aW9uKCp0aGlzLCBBcmcsIFYpOworICAgICAgICBBcmdWYWxzLnB1c2hfYmFjayhWYWx1ZUFuZElzUHRyKFYsIEhhdmVWYWx1ZSkpOwogICAgICAgfQotICAgICAgRW1pdFBhcm1EZWNsKCpBcmcsIFYsIEFyZ05vKTsKICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMTM0MCw3ICsxNDQzLDcgQEAKICAgICAgICAgaWYgKFYtPmdldFR5cGUoKSAhPSBMVHkpCiAgICAgICAgICAgViA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChWLCBMVHkpOwogCi0gICAgICAgIEVtaXRQYXJtRGVjbCgqQXJnLCBWLCBBcmdObyk7CisgICAgICAgIEFyZ1ZhbHMucHVzaF9iYWNrKFZhbHVlQW5kSXNQdHIoViwgSGF2ZVZhbHVlKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogCkBAIC0xNDEyLDggKzE1MTUsMTAgQEAKICAgICAgICAgViA9IEVtaXRMb2FkT2ZTY2FsYXIoViwgZmFsc2UsIEFsaWdubWVudFRvVXNlLCBUeSwgQXJnLT5nZXRMb2NTdGFydCgpKTsKICAgICAgICAgaWYgKGlzUHJvbW90ZWQpCiAgICAgICAgICAgViA9IGVtaXRBcmd1bWVudERlbW90aW9uKCp0aGlzLCBBcmcsIFYpOworICAgICAgICBBcmdWYWxzLnB1c2hfYmFjayhWYWx1ZUFuZElzUHRyKFYsIEhhdmVWYWx1ZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQXJnVmFscy5wdXNoX2JhY2soVmFsdWVBbmRJc1B0cihWLCBIYXZlUG9pbnRlcikpOwogICAgICAgfQotICAgICAgRW1pdFBhcm1EZWNsKCpBcmcsIFYsIEFyZ05vKTsKICAgICAgIGNvbnRpbnVlOyAgLy8gU2tpcCArK0FJIGluY3JlbWVudCwgYWxyZWFkeSBkb25lLgogICAgIH0KIApAQCAtMTQyNiw3ICsxNTMxLDcgQEAKICAgICAgIEFsbG9jYS0+c2V0QWxpZ25tZW50KEFsaWduLmdldFF1YW50aXR5KCkpOwogICAgICAgTFZhbHVlIExWID0gTWFrZUFkZHJMVmFsdWUoQWxsb2NhLCBUeSwgQWxpZ24pOwogICAgICAgbGx2bTo6RnVuY3Rpb246OmFyZ19pdGVyYXRvciBFbmQgPSBFeHBhbmRUeXBlRnJvbUFyZ3MoVHksIExWLCBBSSk7Ci0gICAgICBFbWl0UGFybURlY2woKkFyZywgQWxsb2NhLCBBcmdObyk7CisgICAgICBBcmdWYWxzLnB1c2hfYmFjayhWYWx1ZUFuZElzUHRyKEFsbG9jYSwgSGF2ZVBvaW50ZXIpKTsKIAogICAgICAgLy8gTmFtZSB0aGUgYXJndW1lbnRzIHVzZWQgaW4gZXhwYW5zaW9uIGFuZCBpbmNyZW1lbnQgQUkuCiAgICAgICB1bnNpZ25lZCBJbmRleCA9IDA7CkBAIC0xNDM3LDExICsxNTQyLDEyIEBACiAKICAgICBjYXNlIEFCSUFyZ0luZm86Oklnbm9yZToKICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGxvY2FsIHZhcmlhYmxlIGFwcHJvcHJpYXRlbHkuCi0gICAgICBpZiAoIWhhc1NjYWxhckV2YWx1YXRpb25LaW5kKFR5KSkKLSAgICAgICAgRW1pdFBhcm1EZWNsKCpBcmcsIENyZWF0ZU1lbVRlbXAoVHkpLCBBcmdObyk7Ci0gICAgICBlbHNlCi0gICAgICAgIEVtaXRQYXJtRGVjbCgqQXJnLCBsbHZtOjpVbmRlZlZhbHVlOjpnZXQoQ29udmVydFR5cGUoQXJnLT5nZXRUeXBlKCkpKSwKLSAgICAgICAgICAgICAgICAgICAgIEFyZ05vKTsKKyAgICAgIGlmICghaGFzU2NhbGFyRXZhbHVhdGlvbktpbmQoVHkpKSB7CisgICAgICAgIEFyZ1ZhbHMucHVzaF9iYWNrKFZhbHVlQW5kSXNQdHIoQ3JlYXRlTWVtVGVtcChUeSksIEhhdmVQb2ludGVyKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsbHZtOjpWYWx1ZSAqVSA9IGxsdm06OlVuZGVmVmFsdWU6OmdldChDb252ZXJ0VHlwZShBcmctPmdldFR5cGUoKSkpOworICAgICAgICBBcmdWYWxzLnB1c2hfYmFjayhWYWx1ZUFuZElzUHRyKFUsIEhhdmVWYWx1ZSkpOworICAgICAgfQogCiAgICAgICAvLyBTa2lwIGluY3JlbWVudCwgbm8gbWF0Y2hpbmcgTExWTSBwYXJhbWV0ZXIuCiAgICAgICBjb250aW51ZTsKQEAgLTE0NDksNyArMTU1NSwyMCBAQAogCiAgICAgKytBSTsKICAgfQorCisgIGlmIChGSS51c2VzSW5BbGxvY2EoKSkKKyAgICArK0FJOwogICBhc3NlcnQoQUkgPT0gRm4tPmFyZ19lbmQoKSAmJiAiQXJndW1lbnQgbWlzbWF0Y2ghIik7CisKKyAgaWYgKGdldFRhcmdldCgpLmdldENYWEFCSSgpLmFyZUFyZ3NEZXN0cm95ZWRMZWZ0VG9SaWdodEluQ2FsbGVlKCkpIHsKKyAgICBmb3IgKGludCBJID0gQXJncy5zaXplKCkgLSAxOyBJID49IDA7IC0tSSkKKyAgICAgIEVtaXRQYXJtRGVjbCgqQXJnc1tJXSwgQXJnVmFsc1tJXS5nZXRQb2ludGVyKCksIEFyZ1ZhbHNbSV0uZ2V0SW50KCksCisgICAgICAgICAgICAgICAgICAgSSArIDEpOworICB9IGVsc2UgeworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBBcmdzLnNpemUoKTsgSSAhPSBFOyArK0kpCisgICAgICBFbWl0UGFybURlY2woKkFyZ3NbSV0sIEFyZ1ZhbHNbSV0uZ2V0UG9pbnRlcigpLCBBcmdWYWxzW0ldLmdldEludCgpLAorICAgICAgICAgICAgICAgICAgIEkgKyAxKTsKKyAgfQogfQogCiBzdGF0aWMgdm9pZCBlcmFzZVVudXNlZEJpdENhc3RzKGxsdm06Okluc3RydWN0aW9uICppbnNuKSB7CkBAIC0xNjI2LDcgKzE3NDUsNyBAQAogICB9CiAKICAgbGx2bTo6U3RvcmVJbnN0ICpzdG9yZSA9Ci0gICAgZHluX2Nhc3Q8bGx2bTo6U3RvcmVJbnN0PihDR0YuUmV0dXJuVmFsdWUtPnVzZV9iYWNrKCkpOworICAgIGR5bl9jYXN0PGxsdm06OlN0b3JlSW5zdD4oQ0dGLlJldHVyblZhbHVlLT51c2VyX2JhY2soKSk7CiAgIGlmICghc3RvcmUpIHJldHVybiAwOwogCiAgIC8vIFRoZXNlIGFyZW4ndCBhY3R1YWxseSBwb3NzaWJsZSBmb3Igbm9uLWNvZXJjZWQgcmV0dXJucywgYW5kIHdlCkBAIC0xNjYyLDYgKzE3ODEsMjAgQEAKICAgY29uc3QgQUJJQXJnSW5mbyAmUmV0QUkgPSBGSS5nZXRSZXR1cm5JbmZvKCk7CiAKICAgc3dpdGNoIChSZXRBSS5nZXRLaW5kKCkpIHsKKyAgY2FzZSBBQklBcmdJbmZvOjpJbkFsbG9jYToKKyAgICAvLyBBZ2dyZWdyYXRlcyBnZXQgZXZhbHVhdGVkIGRpcmVjdGx5IGludG8gdGhlIGRlc3RpbmF0aW9uLiAgU29tZXRpbWVzIHdlCisgICAgLy8gbmVlZCB0byByZXR1cm4gdGhlIHNyZXQgdmFsdWUgaW4gYSByZWdpc3RlciwgdGhvdWdoLgorICAgIGFzc2VydChoYXNBZ2dyZWdhdGVFdmFsdWF0aW9uS2luZChSZXRUeSkpOworICAgIGlmIChSZXRBSS5nZXRJbkFsbG9jYVNSZXQoKSkgeworICAgICAgbGx2bTo6RnVuY3Rpb246OmFyZ19pdGVyYXRvciBFSSA9IEN1ckZuLT5hcmdfZW5kKCk7CisgICAgICAtLUVJOworICAgICAgbGx2bTo6VmFsdWUgKkFyZ1N0cnVjdCA9IEVJOworICAgICAgbGx2bTo6VmFsdWUgKlNSZXQgPQorICAgICAgICAgIEJ1aWxkZXIuQ3JlYXRlU3RydWN0R0VQKEFyZ1N0cnVjdCwgUmV0QUkuZ2V0SW5BbGxvY2FGaWVsZEluZGV4KCkpOworICAgICAgUlYgPSBCdWlsZGVyLkNyZWF0ZUxvYWQoU1JldCwgInNyZXQiKTsKKyAgICB9CisgICAgYnJlYWs7CisKICAgY2FzZSBBQklBcmdJbmZvOjpJbmRpcmVjdDogewogICAgIHN3aXRjaCAoZ2V0RXZhbHVhdGlvbktpbmQoUmV0VHkpKSB7CiAgICAgY2FzZSBURUtfQ29tcGxleDogewpAQCAtMTc1MCw2ICsxODgzLDI1IEBACiAgICAgUmV0LT5zZXREZWJ1Z0xvYyhSZXREYmdMb2MpOwogfQogCitzdGF0aWMgYm9vbCBpc0luQWxsb2NhQXJndW1lbnQoQ0dDWFhBQkkgJkFCSSwgUXVhbFR5cGUgdHlwZSkgeworICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IHR5cGUtPmdldEFzQ1hYUmVjb3JkRGVjbCgpOworICByZXR1cm4gUkQgJiYgQUJJLmdldFJlY29yZEFyZ0FCSShSRCkgPT0gQ0dDWFhBQkk6OlJBQV9EaXJlY3RJbk1lbW9yeTsKK30KKworc3RhdGljIEFnZ1ZhbHVlU2xvdCBjcmVhdGVQbGFjZWhvbGRlclNsb3QoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIFF1YWxUeXBlIFR5KSB7CisgIC8vIEZJWE1FOiBHZW5lcmF0ZSBJUiBpbiBvbmUgcGFzcywgcmF0aGVyIHRoYW4gZ29pbmcgYmFjayBhbmQgZml4aW5nIHVwIHRoZXNlCisgIC8vIHBsYWNlaG9sZGVycy4KKyAgbGx2bTo6VHlwZSAqSVJUeSA9IENHRi5Db252ZXJ0VHlwZUZvck1lbShUeSk7CisgIGxsdm06OlZhbHVlICpQbGFjZWhvbGRlciA9CisgICAgICBsbHZtOjpVbmRlZlZhbHVlOjpnZXQoSVJUeS0+Z2V0UG9pbnRlclRvKCktPmdldFBvaW50ZXJUbygpKTsKKyAgUGxhY2Vob2xkZXIgPSBDR0YuQnVpbGRlci5DcmVhdGVMb2FkKFBsYWNlaG9sZGVyKTsKKyAgcmV0dXJuIEFnZ1ZhbHVlU2xvdDo6Zm9yQWRkcihQbGFjZWhvbGRlciwgQ2hhclVuaXRzOjpaZXJvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHkuZ2V0UXVhbGlmaWVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZ1ZhbHVlU2xvdDo6SXNOb3REZXN0cnVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZ1ZhbHVlU2xvdDo6RG9lc05vdE5lZWRHQ0JhcnJpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZ1ZhbHVlU2xvdDo6SXNOb3RBbGlhc2VkKTsKK30KKwogdm9pZCBDb2RlR2VuRnVuY3Rpb246OkVtaXREZWxlZ2F0ZUNhbGxBcmcoQ2FsbEFyZ0xpc3QgJmFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYXJEZWNsICpwYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIGxvYykgewpAQCAtMTc3Myw2ICsxOTI1LDIwIEBACiAgICAgcmV0dXJuIGFyZ3MuYWRkKFJWYWx1ZTo6Z2V0KEJ1aWxkZXIuQ3JlYXRlTG9hZChsb2NhbCkpLCB0eXBlKTsKICAgfQogCisgIGlmIChpc0luQWxsb2NhQXJndW1lbnQoQ0dNLmdldENYWEFCSSgpLCB0eXBlKSkgeworICAgIEFnZ1ZhbHVlU2xvdCBTbG90ID0gY3JlYXRlUGxhY2Vob2xkZXJTbG90KCp0aGlzLCB0eXBlKTsKKyAgICBTbG90LnNldEV4dGVybmFsbHlEZXN0cnVjdGVkKCk7CisKKyAgICAvLyBGSVhNRTogRWl0aGVyIGVtaXQgYSBjb3B5IGNvbnN0cnVjdG9yIGNhbGwsIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGRvCisgICAgLy8gZ3VhcmFudGVlZCB0YWlsIGNhbGxzIHdpdGggcGVyZmVjdCBmb3J3YXJkaW5nIGluIExMVk0uCisgICAgQ0dNLkVycm9yVW5zdXBwb3J0ZWQocGFyYW0sICJub24tdHJpdmlhbCBhcmd1bWVudCBjb3B5IGZvciB0aHVuayIpOworICAgIEVtaXROdWxsSW5pdGlhbGl6YXRpb24oU2xvdC5nZXRBZGRyKCksIHR5cGUpOworCisgICAgUlZhbHVlIFJWID0gU2xvdC5hc1JWYWx1ZSgpOworICAgIGFyZ3MuYWRkKFJWLCB0eXBlKTsKKyAgICByZXR1cm47CisgIH0KKwogICBhcmdzLmFkZChjb252ZXJ0VGVtcFRvUlZhbHVlKGxvY2FsLCB0eXBlLCBsb2MpLCB0eXBlKTsKIH0KIApAQCAtMTg1MiwxNCArMjAxOCwxMyBAQAogCiBzdGF0aWMgdm9pZCBlbWl0V3JpdGViYWNrcyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxBcmdMaXN0ICZhcmdzKSB7Ci0gIGZvciAoQ2FsbEFyZ0xpc3Q6OndyaXRlYmFja19pdGVyYXRvcgotICAgICAgICAgaSA9IGFyZ3Mud3JpdGViYWNrX2JlZ2luKCksIGUgPSBhcmdzLndyaXRlYmFja19lbmQoKTsgaSAhPSBlOyArK2kpCi0gICAgZW1pdFdyaXRlYmFjayhDR0YsICppKTsKKyAgZm9yIChjb25zdCBhdXRvICZJIDogYXJncy53cml0ZWJhY2tzKCkpCisgICAgZW1pdFdyaXRlYmFjayhDR0YsIEkpOwogfQogCiBzdGF0aWMgdm9pZCBkZWFjdGl2YXRlQXJnQ2xlYW51cHNCZWZvcmVDYWxsKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsQXJnTGlzdCAmQ2FsbEFyZ3MpIHsKLSAgYXNzZXJ0KENHRi5nZXRUYXJnZXQoKS5nZXRDWFhBQkkoKS5pc0FyZ3VtZW50RGVzdHJveWVkQnlDYWxsZWUoKSk7CisgIGFzc2VydChDR0YuZ2V0VGFyZ2V0KCkuZ2V0Q1hYQUJJKCkuYXJlQXJnc0Rlc3Ryb3llZExlZnRUb1JpZ2h0SW5DYWxsZWUoKSk7CiAgIEFycmF5UmVmPENhbGxBcmdMaXN0OjpDYWxsQXJnQ2xlYW51cD4gQ2xlYW51cHMgPQogICAgIENhbGxBcmdzLmdldENsZWFudXBzVG9EZWFjdGl2YXRlKCk7CiAgIC8vIEl0ZXJhdGUgaW4gcmV2ZXJzZSB0byBpbmNyZWFzZSB0aGUgbGlrZWxpaG9vZCBvZiBwb3BwaW5nIHRoZSBjbGVhbnVwLgpAQCAtMjAwNCw2ICsyMTY5LDk5IEBACiAgIGFyZ3MuYWRkKFJWYWx1ZTo6Z2V0KGZpbmFsQXJndW1lbnQpLCBDUkUtPmdldFR5cGUoKSk7CiB9CiAKK3ZvaWQgQ2FsbEFyZ0xpc3Q6OmFsbG9jYXRlQXJndW1lbnRNZW1vcnkoQ29kZUdlbkZ1bmN0aW9uICZDR0YpIHsKKyAgYXNzZXJ0KCFTdGFja0Jhc2UgJiYgIVN0YWNrQ2xlYW51cC5pc1ZhbGlkKCkpOworCisgIC8vIFNhdmUgdGhlIHN0YWNrLgorICBsbHZtOjpGdW5jdGlvbiAqRiA9IENHRi5DR00uZ2V0SW50cmluc2ljKGxsdm06OkludHJpbnNpYzo6c3RhY2tzYXZlKTsKKyAgU3RhY2tCYXNlID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlQ2FsbChGLCAiaW5hbGxvY2Euc2F2ZSIpOworCisgIC8vIENvbnRyb2wgZ2V0cyByZWFsbHkgdGllZCB1cCBpbiBsYW5kaW5nIHBhZHMsIHNvIHdlIGhhdmUgdG8gc3BpbGwgdGhlCisgIC8vIHN0YWNrc2F2ZSB0byBhbiBhbGxvY2EgdG8gYXZvaWQgdmlvbGF0aW5nIFNTQSBmb3JtLgorICAvLyBUT0RPOiBUaGlzIGlzIGRlYWQgaWYgd2UgbmV2ZXIgZW1pdCB0aGUgY2xlYW51cC4gIFdlIHNob3VsZCBjcmVhdGUgdGhlCisgIC8vIGFsbG9jYSBhbmQgc3RvcmUgbGF6aWx5IG9uIHRoZSBmaXJzdCBjbGVhbnVwIGVtaXNzaW9uLgorICBTdGFja0Jhc2VNZW0gPSBDR0YuQ3JlYXRlVGVtcEFsbG9jYShDR0YuSW50OFB0clR5LCAiaW5hbGxvY2Euc3BtZW0iKTsKKyAgQ0dGLkJ1aWxkZXIuQ3JlYXRlU3RvcmUoU3RhY2tCYXNlLCBTdGFja0Jhc2VNZW0pOworICBDR0YucHVzaFN0YWNrUmVzdG9yZShFSENsZWFudXAsIFN0YWNrQmFzZU1lbSk7CisgIFN0YWNrQ2xlYW51cCA9IENHRi5FSFN0YWNrLmdldElubmVybW9zdEVIU2NvcGUoKTsKKyAgYXNzZXJ0KFN0YWNrQ2xlYW51cC5pc1ZhbGlkKCkpOworfQorCit2b2lkIENhbGxBcmdMaXN0OjpmcmVlQXJndW1lbnRNZW1vcnkoQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0IHsKKyAgaWYgKFN0YWNrQmFzZSkgeworICAgIENHRi5EZWFjdGl2YXRlQ2xlYW51cEJsb2NrKFN0YWNrQ2xlYW51cCwgU3RhY2tCYXNlKTsKKyAgICBsbHZtOjpWYWx1ZSAqRiA9IENHRi5DR00uZ2V0SW50cmluc2ljKGxsdm06OkludHJpbnNpYzo6c3RhY2tyZXN0b3JlKTsKKyAgICAvLyBXZSBjb3VsZCBsb2FkIFN0YWNrQmFzZSBmcm9tIFN0YWNrQmFzZU1lbSwgYnV0IGluIHRoZSBub24tZXhjZXB0aW9uYWwKKyAgICAvLyBjYXNlIHdlIGNhbiBza2lwIGl0LgorICAgIENHRi5CdWlsZGVyLkNyZWF0ZUNhbGwoRiwgU3RhY2tCYXNlKTsKKyAgfQorfQorCit2b2lkIENvZGVHZW5GdW5jdGlvbjo6RW1pdENhbGxBcmdzKENhbGxBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxRdWFsVHlwZT4gQXJnVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxFeHByOjpjb25zdF9hcmdfaXRlcmF0b3IgQXJnQmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsRXhwcjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEFyZ0VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3JjZUNvbHVtbkluZm8pIHsKKyAgQ0dEZWJ1Z0luZm8gKkRJID0gZ2V0RGVidWdJbmZvKCk7CisgIFNvdXJjZUxvY2F0aW9uIENhbGxMb2M7CisgIGlmIChESSkgQ2FsbExvYyA9IERJLT5nZXRMb2NhdGlvbigpOworCisgIC8vIFdlICpoYXZlKiB0byBldmFsdWF0ZSBhcmd1bWVudHMgZnJvbSByaWdodCB0byBsZWZ0IGluIHRoZSBNUyBDKysgQUJJLAorICAvLyBiZWNhdXNlIGFyZ3VtZW50cyBhcmUgZGVzdHJveWVkIGxlZnQgdG8gcmlnaHQgaW4gdGhlIGNhbGxlZS4KKyAgaWYgKENHTS5nZXRUYXJnZXQoKS5nZXRDWFhBQkkoKS5hcmVBcmdzRGVzdHJveWVkTGVmdFRvUmlnaHRJbkNhbGxlZSgpKSB7CisgICAgLy8gSW5zZXJ0IGEgc3RhY2sgc2F2ZSBpZiB3ZSdyZSBnb2luZyB0byBuZWVkIGFueSBpbmFsbG9jYSBhcmdzLgorICAgIGJvb2wgSGFzSW5BbGxvY2FBcmdzID0gZmFsc2U7CisgICAgZm9yIChBcnJheVJlZjxRdWFsVHlwZT46Oml0ZXJhdG9yIEkgPSBBcmdUeXBlcy5iZWdpbigpLCBFID0gQXJnVHlwZXMuZW5kKCk7CisgICAgICAgICBJICE9IEUgJiYgIUhhc0luQWxsb2NhQXJnczsgKytJKQorICAgICAgSGFzSW5BbGxvY2FBcmdzID0gaXNJbkFsbG9jYUFyZ3VtZW50KENHTS5nZXRDWFhBQkkoKSwgKkkpOworICAgIGlmIChIYXNJbkFsbG9jYUFyZ3MpIHsKKyAgICAgIGFzc2VydChnZXRUYXJnZXQoKS5nZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYpOworICAgICAgQXJncy5hbGxvY2F0ZUFyZ3VtZW50TWVtb3J5KCp0aGlzKTsKKyAgICB9CisKKyAgICAvLyBFdmFsdWF0ZSBlYWNoIGFyZ3VtZW50LgorICAgIHNpemVfdCBDYWxsQXJnc1N0YXJ0ID0gQXJncy5zaXplKCk7CisgICAgZm9yIChpbnQgSSA9IEFyZ1R5cGVzLnNpemUoKSAtIDE7IEkgPj0gMDsgLS1JKSB7CisgICAgICBDYWxsRXhwcjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEFyZyA9IEFyZ0JlZyArIEk7CisgICAgICBFbWl0Q2FsbEFyZyhBcmdzLCAqQXJnLCBBcmdUeXBlc1tJXSk7CisgICAgICAvLyBSZXN0b3JlIHRoZSBkZWJ1ZyBsb2NhdGlvbi4KKyAgICAgIGlmIChESSkgREktPkVtaXRMb2NhdGlvbihCdWlsZGVyLCBDYWxsTG9jLCBGb3JjZUNvbHVtbkluZm8pOworICAgIH0KKworICAgIC8vIFVuLXJldmVyc2UgdGhlIGFyZ3VtZW50cyB3ZSBqdXN0IGV2YWx1YXRlZCBzbyB0aGV5IG1hdGNoIHVwIHdpdGggdGhlIExMVk0KKyAgICAvLyBJUiBmdW5jdGlvbi4KKyAgICBzdGQ6OnJldmVyc2UoQXJncy5iZWdpbigpICsgQ2FsbEFyZ3NTdGFydCwgQXJncy5lbmQoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IEFyZ1R5cGVzLnNpemUoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBDYWxsRXhwcjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEFyZyA9IEFyZ0JlZyArIEk7CisgICAgYXNzZXJ0KEFyZyAhPSBBcmdFbmQpOworICAgIEVtaXRDYWxsQXJnKEFyZ3MsICpBcmcsIEFyZ1R5cGVzW0ldKTsKKyAgICAvLyBSZXN0b3JlIHRoZSBkZWJ1ZyBsb2NhdGlvbi4KKyAgICBpZiAoREkpIERJLT5FbWl0TG9jYXRpb24oQnVpbGRlciwgQ2FsbExvYywgRm9yY2VDb2x1bW5JbmZvKTsKKyAgfQorfQorCituYW1lc3BhY2UgeworCitzdHJ1Y3QgRGVzdHJveVVucGFzc2VkQXJnIDogRUhTY29wZVN0YWNrOjpDbGVhbnVwIHsKKyAgRGVzdHJveVVucGFzc2VkQXJnKGxsdm06OlZhbHVlICpBZGRyLCBRdWFsVHlwZSBUeSkKKyAgICAgIDogQWRkcihBZGRyKSwgVHkoVHkpIHt9CisKKyAgbGx2bTo6VmFsdWUgKkFkZHI7CisgIFF1YWxUeXBlIFR5OworCisgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIG92ZXJyaWRlIHsKKyAgICBjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRHRvciA9IFR5LT5nZXRBc0NYWFJlY29yZERlY2woKS0+Z2V0RGVzdHJ1Y3RvcigpOworICAgIGFzc2VydCghRHRvci0+aXNUcml2aWFsKCkpOworICAgIENHRi5FbWl0Q1hYRGVzdHJ1Y3RvckNhbGwoRHRvciwgRHRvcl9Db21wbGV0ZSwgLypmb3IgdmJhc2UqLyBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRGVsZWdhdGluZz0qL2ZhbHNlLCBBZGRyKTsKKyAgfQorfTsKKworfQorCiB2b2lkIENvZGVHZW5GdW5jdGlvbjo6RW1pdENhbGxBcmcoQ2FsbEFyZ0xpc3QgJmFyZ3MsIGNvbnN0IEV4cHIgKkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgdHlwZSkgewogICBpZiAoY29uc3QgT2JqQ0luZGlyZWN0Q29weVJlc3RvcmVFeHByICpDUkUKQEAgLTIwMjYsMjMgKzIyODQsMjUgQEAKICAgLy8gSW4gdGhlIE1pY3Jvc29mdCBDKysgQUJJLCBhZ2dyZWdhdGUgYXJndW1lbnRzIGFyZSBkZXN0cnVjdGVkIGJ5IHRoZSBjYWxsZWUuCiAgIC8vIEhvd2V2ZXIsIHdlIHN0aWxsIGhhdmUgdG8gcHVzaCBhbiBFSC1vbmx5IGNsZWFudXAgaW4gY2FzZSB3ZSB1bndpbmQgYmVmb3JlCiAgIC8vIHdlIG1ha2UgaXQgdG8gdGhlIGNhbGwuCi0gIGlmIChIYXNBZ2dyZWdhdGVFdmFsS2luZCAmJgotICAgICAgQ0dNLmdldFRhcmdldCgpLmdldENYWEFCSSgpLmlzQXJndW1lbnREZXN0cm95ZWRCeUNhbGxlZSgpKSB7Ci0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSB0eXBlLT5nZXRBc0NYWFJlY29yZERlY2woKTsKLSAgICBpZiAoUkQgJiYgUkQtPmhhc05vblRyaXZpYWxEZXN0cnVjdG9yKCkpIHsKLSAgICAgIEFnZ1ZhbHVlU2xvdCBTbG90ID0gQ3JlYXRlQWdnVGVtcCh0eXBlLCAiYWdnLmFyZy50bXAiKTsKLSAgICAgIFNsb3Quc2V0RXh0ZXJuYWxseURlc3RydWN0ZWQoKTsKLSAgICAgIEVtaXRBZ2dFeHByKEUsIFNsb3QpOwotICAgICAgUlZhbHVlIFJWID0gU2xvdC5hc1JWYWx1ZSgpOwotICAgICAgYXJncy5hZGQoUlYsIHR5cGUpOworICBpZiAoSGFzQWdncmVnYXRlRXZhbEtpbmQgJiYgYXJncy5pc1VzaW5nSW5BbGxvY2EoKSkgeworICAgIGFzc2VydChnZXRUYXJnZXQoKS5nZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYpOworICAgIEFnZ1ZhbHVlU2xvdCBTbG90ID0gY3JlYXRlUGxhY2Vob2xkZXJTbG90KCp0aGlzLCB0eXBlKTsKKyAgICBTbG90LnNldEV4dGVybmFsbHlEZXN0cnVjdGVkKCk7CisgICAgRW1pdEFnZ0V4cHIoRSwgU2xvdCk7CisgICAgUlZhbHVlIFJWID0gU2xvdC5hc1JWYWx1ZSgpOworICAgIGFyZ3MuYWRkKFJWLCB0eXBlKTsKIAotICAgICAgcHVzaERlc3Ryb3koRUhDbGVhbnVwLCBSVi5nZXRBZ2dyZWdhdGVBZGRyKCksIHR5cGUsIGRlc3Ryb3lDWFhPYmplY3QsCi0gICAgICAgICAgICAgICAgICAvKnVzZUVIQ2xlYW51cEZvckFycmF5Ki8gdHJ1ZSk7CisgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSB0eXBlLT5nZXRBc0NYWFJlY29yZERlY2woKTsKKyAgICBpZiAoUkQtPmhhc05vblRyaXZpYWxEZXN0cnVjdG9yKCkpIHsKKyAgICAgIC8vIENyZWF0ZSBhIG5vLW9wIEdFUCBiZXR3ZWVuIHRoZSBwbGFjZWhvbGRlciBhbmQgdGhlIGNsZWFudXAgc28gd2UgY2FuCisgICAgICAvLyBSQVVXIGl0IHN1Y2Nlc3NmdWxseS4gIEl0IGFsc28gc2VydmVzIGFzIGEgbWFya2VyIG9mIHRoZSBmaXJzdAorICAgICAgLy8gaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIGNsZWFudXAgaXMgYWN0aXZlLgorICAgICAgcHVzaEZ1bGxFeHByQ2xlYW51cDxEZXN0cm95VW5wYXNzZWRBcmc+KEVIQ2xlYW51cCwgU2xvdC5nZXRBZGRyKCksIHR5cGUpOwogICAgICAgLy8gVGhpcyB1bnJlYWNoYWJsZSBpcyBhIHRlbXBvcmFyeSBtYXJrZXIgd2hpY2ggd2lsbCBiZSByZW1vdmVkIGxhdGVyLgogICAgICAgbGx2bTo6SW5zdHJ1Y3Rpb24gKklzQWN0aXZlID0gQnVpbGRlci5DcmVhdGVVbnJlYWNoYWJsZSgpOwogICAgICAgYXJncy5hZGRBcmdDbGVhbnVwRGVhY3RpdmF0aW9uKEVIU3RhY2suZ2V0SW5uZXJtb3N0RUhTY29wZSgpLCBJc0FjdGl2ZSk7Ci0gICAgICByZXR1cm47CiAgICAgfQorICAgIHJldHVybjsKICAgfQogCiAgIGlmIChIYXNBZ2dyZWdhdGVFdmFsS2luZCAmJiBpc2E8SW1wbGljaXRDYXN0RXhwcj4oRSkgJiYKQEAgLTIxMjgsNiArMjM4OCw3IEBACiAgICAgY2FsbC0+c2V0Q2FsbGluZ0NvbnYoZ2V0UnVudGltZUNDKCkpOwogICAgIEJ1aWxkZXIuQ3JlYXRlVW5yZWFjaGFibGUoKTsKICAgfQorICBQR08uc2V0Q3VycmVudFJlZ2lvblVucmVhY2hhYmxlKCk7CiB9CiAKIC8vLyBFbWl0cyBhIGNhbGwgb3IgaW52b2tlIGluc3RydWN0aW9uIHRvIHRoZSBnaXZlbiBudWxsYXJ5IHJ1bnRpbWUKQEAgLTIyMDksOSArMjQ3MCw3IEBACiAgICAgICBjb25zdCBGaWVsZERlY2wgKkxhcmdlc3RGRCA9IDA7CiAgICAgICBDaGFyVW5pdHMgVW5pb25TaXplID0gQ2hhclVuaXRzOjpaZXJvKCk7CiAKLSAgICAgIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgaSA9IFJELT5maWVsZF9iZWdpbigpLCBlID0gUkQtPmZpZWxkX2VuZCgpOwotICAgICAgICAgICBpICE9IGU7ICsraSkgewotICAgICAgICBjb25zdCBGaWVsZERlY2wgKkZEID0gKmk7CisgICAgICBmb3IgKGNvbnN0IGF1dG8gKkZEIDogUkQtPmZpZWxkcygpKSB7CiAgICAgICAgIGFzc2VydCghRkQtPmlzQml0RmllbGQoKSAmJgogICAgICAgICAgICAgICAgIkNhbm5vdCBleHBhbmQgc3RydWN0dXJlIHdpdGggYml0LWZpZWxkIG1lbWJlcnMuIik7CiAgICAgICAgIENoYXJVbml0cyBGaWVsZFNpemUgPSBnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemVJbkNoYXJzKEZELT5nZXRUeXBlKCkpOwpAQCAtMjIyNSwxMCArMjQ4NCw3IEBACiAgICAgICAgIEV4cGFuZFR5cGVUb0FyZ3MoTGFyZ2VzdEZELT5nZXRUeXBlKCksIEZsZFJWLCBBcmdzLCBJUkZ1bmNUeSk7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgaSA9IFJELT5maWVsZF9iZWdpbigpLCBlID0gUkQtPmZpZWxkX2VuZCgpOwotICAgICAgICAgICBpICE9IGU7ICsraSkgewotICAgICAgICBGaWVsZERlY2wgKkZEID0gKmk7Ci0KKyAgICAgIGZvciAoY29uc3QgYXV0byAqRkQgOiBSRC0+ZmllbGRzKCkpIHsKICAgICAgICAgUlZhbHVlIEZsZFJWID0gRW1pdFJWYWx1ZUZvckZpZWxkKExWLCBGRCwgU291cmNlTG9jYXRpb24oKSk7CiAgICAgICAgIEV4cGFuZFR5cGVUb0FyZ3MoRkQtPmdldFR5cGUoKSwgRmxkUlYsIEFyZ3MsIElSRnVuY1R5KTsKICAgICAgIH0KQEAgLTIyNTEsNiArMjUwNywyMCBAQAogICB9CiB9CiAKKy8vLyBcYnJpZWYgU3RvcmUgYSBub24tYWdncmVnYXRlIHZhbHVlIHRvIGFuIGFkZHJlc3MgdG8gaW5pdGlhbGl6ZSBpdC4gIEZvcgorLy8vIGluaXRpYWxpemF0aW9uLCBhIG5vbi1hdG9taWMgc3RvcmUgd2lsbCBiZSB1c2VkLgorc3RhdGljIHZvaWQgRW1pdEluaXRTdG9yZU9mTm9uQWdncmVnYXRlKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBSVmFsdWUgU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWYWx1ZSBEc3QpIHsKKyAgaWYgKFNyYy5pc1NjYWxhcigpKQorICAgIENHRi5FbWl0U3RvcmVPZlNjYWxhcihTcmMuZ2V0U2NhbGFyVmFsKCksIERzdCwgLyppbml0PSovdHJ1ZSk7CisgIGVsc2UKKyAgICBDR0YuRW1pdFN0b3JlT2ZDb21wbGV4KFNyYy5nZXRDb21wbGV4VmFsKCksIERzdCwgLyppbml0PSovdHJ1ZSk7Cit9CisKK3ZvaWQgQ29kZUdlbkZ1bmN0aW9uOjpkZWZlclBsYWNlaG9sZGVyUmVwbGFjZW1lbnQobGx2bTo6SW5zdHJ1Y3Rpb24gKk9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKk5ldykgeworICBEZWZlcnJlZFJlcGxhY2VtZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoT2xkLCBOZXcpKTsKK30KIAogUlZhbHVlIENvZGVHZW5GdW5jdGlvbjo6RW1pdENhbGwoY29uc3QgQ0dGdW5jdGlvbkluZm8gJkNhbGxJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkNhbGxlZSwKQEAgLTIyNzIsMTQgKzI1NDIsMzIgQEAKICAgICBjYXN0PGxsdm06OkZ1bmN0aW9uVHlwZT4oCiAgICAgICAgICAgICAgICAgICBjYXN0PGxsdm06OlBvaW50ZXJUeXBlPihDYWxsZWUtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpOwogCisgIC8vIElmIHdlJ3JlIHVzaW5nIGluYWxsb2NhLCBpbnNlcnQgdGhlIGFsbG9jYXRpb24gYWZ0ZXIgdGhlIHN0YWNrIHNhdmUuCisgIC8vIEZJWE1FOiBEbyB0aGlzIGVhcmxpZXIgcmF0aGVyIHRoYW4gaGFja2luZyBpdCBpbiBoZXJlIQorICBsbHZtOjpWYWx1ZSAqQXJnTWVtb3J5ID0gMDsKKyAgaWYgKGxsdm06OlN0cnVjdFR5cGUgKkFyZ1N0cnVjdCA9IENhbGxJbmZvLmdldEFyZ1N0cnVjdCgpKSB7CisgICAgbGx2bTo6QWxsb2NhSW5zdCAqQUkgPSBuZXcgbGx2bTo6QWxsb2NhSW5zdCgKKyAgICAgICAgQXJnU3RydWN0LCAiYXJnbWVtIiwgQ2FsbEFyZ3MuZ2V0U3RhY2tCYXNlKCktPmdldE5leHROb2RlKCkpOworICAgIEFJLT5zZXRVc2VkV2l0aEluQWxsb2NhKHRydWUpOworICAgIGFzc2VydChBSS0+aXNVc2VkV2l0aEluQWxsb2NhKCkgJiYgIUFJLT5pc1N0YXRpY0FsbG9jYSgpKTsKKyAgICBBcmdNZW1vcnkgPSBBSTsKKyAgfQorCiAgIC8vIElmIHRoZSBjYWxsIHJldHVybnMgYSB0ZW1wb3Jhcnkgd2l0aCBzdHJ1Y3QgcmV0dXJuLCBjcmVhdGUgYSB0ZW1wb3JhcnkKICAgLy8gYWxsb2NhIHRvIGhvbGQgdGhlIHJlc3VsdCwgdW5sZXNzIG9uZSBpcyBnaXZlbiB0byB1cy4KLSAgaWYgKENHTS5SZXR1cm5UeXBlVXNlc1NSZXQoQ2FsbEluZm8pKSB7Ci0gICAgbGx2bTo6VmFsdWUgKlZhbHVlID0gUmV0dXJuVmFsdWUuZ2V0VmFsdWUoKTsKLSAgICBpZiAoIVZhbHVlKQotICAgICAgVmFsdWUgPSBDcmVhdGVNZW1UZW1wKFJldFR5KTsKLSAgICBBcmdzLnB1c2hfYmFjayhWYWx1ZSk7Ci0gICAgY2hlY2tBcmdNYXRjaGVzKFZhbHVlLCBJUkFyZ05vLCBJUkZ1bmNUeSk7CisgIGxsdm06OlZhbHVlICpTUmV0UHRyID0gMDsKKyAgaWYgKENHTS5SZXR1cm5UeXBlVXNlc1NSZXQoQ2FsbEluZm8pIHx8IFJldEFJLmlzSW5BbGxvY2EoKSkgeworICAgIFNSZXRQdHIgPSBSZXR1cm5WYWx1ZS5nZXRWYWx1ZSgpOworICAgIGlmICghU1JldFB0cikKKyAgICAgIFNSZXRQdHIgPSBDcmVhdGVNZW1UZW1wKFJldFR5KTsKKyAgICBpZiAoQ0dNLlJldHVyblR5cGVVc2VzU1JldChDYWxsSW5mbykpIHsKKyAgICAgIEFyZ3MucHVzaF9iYWNrKFNSZXRQdHIpOworICAgICAgY2hlY2tBcmdNYXRjaGVzKFNSZXRQdHIsIElSQXJnTm8sIElSRnVuY1R5KTsKKyAgICB9IGVsc2UgeworICAgICAgbGx2bTo6VmFsdWUgKkFkZHIgPQorICAgICAgICAgIEJ1aWxkZXIuQ3JlYXRlU3RydWN0R0VQKEFyZ01lbW9yeSwgUmV0QUkuZ2V0SW5BbGxvY2FGaWVsZEluZGV4KCkpOworICAgICAgQnVpbGRlci5DcmVhdGVTdG9yZShTUmV0UHRyLCBBZGRyKTsKKyAgICB9CiAgIH0KIAogICBhc3NlcnQoQ2FsbEluZm8uYXJnX3NpemUoKSA9PSBDYWxsQXJncy5zaXplKCkgJiYKQEAgLTIyOTksNiArMjU4NywzNSBAQAogICAgIH0KIAogICAgIHN3aXRjaCAoQXJnSW5mby5nZXRLaW5kKCkpIHsKKyAgICBjYXNlIEFCSUFyZ0luZm86OkluQWxsb2NhOiB7CisgICAgICBhc3NlcnQoZ2V0VGFyZ2V0KCkuZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2KTsKKyAgICAgIGlmIChSVi5pc0FnZ3JlZ2F0ZSgpKSB7CisgICAgICAgIC8vIFJlcGxhY2UgdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFyZ3VtZW50IHNsb3QgR0VQLgorICAgICAgICBsbHZtOjpJbnN0cnVjdGlvbiAqUGxhY2Vob2xkZXIgPQorICAgICAgICAgICAgY2FzdDxsbHZtOjpJbnN0cnVjdGlvbj4oUlYuZ2V0QWdncmVnYXRlQWRkcigpKTsKKyAgICAgICAgQ0dCdWlsZGVyVHk6Okluc2VydFBvaW50IElQID0gQnVpbGRlci5zYXZlSVAoKTsKKyAgICAgICAgQnVpbGRlci5TZXRJbnNlcnRQb2ludChQbGFjZWhvbGRlcik7CisgICAgICAgIGxsdm06OlZhbHVlICpBZGRyID0gQnVpbGRlci5DcmVhdGVTdHJ1Y3RHRVAoCisgICAgICAgICAgICBBcmdNZW1vcnksIEFyZ0luZm8uZ2V0SW5BbGxvY2FGaWVsZEluZGV4KCkpOworICAgICAgICBCdWlsZGVyLnJlc3RvcmVJUChJUCk7CisgICAgICAgIGRlZmVyUGxhY2Vob2xkZXJSZXBsYWNlbWVudChQbGFjZWhvbGRlciwgQWRkcik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBTdG9yZSB0aGUgUlZhbHVlIGludG8gdGhlIGFyZ3VtZW50IHN0cnVjdC4KKyAgICAgICAgbGx2bTo6VmFsdWUgKkFkZHIgPQorICAgICAgICAgICAgQnVpbGRlci5DcmVhdGVTdHJ1Y3RHRVAoQXJnTWVtb3J5LCBBcmdJbmZvLmdldEluQWxsb2NhRmllbGRJbmRleCgpKTsKKyAgICAgICAgdW5zaWduZWQgQVMgPSBBZGRyLT5nZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgICAgICAgbGx2bTo6VHlwZSAqTWVtVHlwZSA9IENvbnZlcnRUeXBlRm9yTWVtKEktPlR5KS0+Z2V0UG9pbnRlclRvKEFTKTsKKyAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgYSB0cml2aWFsIGJpdGNhc3QgaXMgbm90IGF2b2lkYWJsZS4gIFRoZQorICAgICAgICAvLyBkZWZpbml0aW9uIG9mIGEgdHlwZSBsYXRlciBpbiBhIHRyYW5zbGF0aW9uIHVuaXQgbWF5IGNoYW5nZSBpdCdzIHR5cGUKKyAgICAgICAgLy8gZnJvbSB7fSogdG8gKCVzdHJ1Y3QuZm9vKikqLgorICAgICAgICBpZiAoQWRkci0+Z2V0VHlwZSgpICE9IE1lbVR5cGUpCisgICAgICAgICAgQWRkciA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChBZGRyLCBNZW1UeXBlKTsKKyAgICAgICAgTFZhbHVlIGFyZ0xWID0gTWFrZUFkZHJMVmFsdWUoQWRkciwgSS0+VHksIFR5cGVBbGlnbik7CisgICAgICAgIEVtaXRJbml0U3RvcmVPZk5vbkFnZ3JlZ2F0ZSgqdGhpcywgUlYsIGFyZ0xWKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOyAvLyBEb24ndCBpbmNyZW1lbnQgSVJBcmdObyEKKyAgICB9CisKICAgICBjYXNlIEFCSUFyZ0luZm86OkluZGlyZWN0OiB7CiAgICAgICBpZiAoUlYuaXNTY2FsYXIoKSB8fCBSVi5pc0NvbXBsZXgoKSkgewogICAgICAgICAvLyBNYWtlIGEgdGVtcG9yYXJ5IGFsbG9jYSB0byBwYXNzIHRoZSBhcmd1bWVudC4KQEAgLTIzMDcsMTMgKzI2MjQsOCBAQAogICAgICAgICAgIEFJLT5zZXRBbGlnbm1lbnQoQXJnSW5mby5nZXRJbmRpcmVjdEFsaWduKCkpOwogICAgICAgICBBcmdzLnB1c2hfYmFjayhBSSk7CiAKLSAgICAgICAgTFZhbHVlIGFyZ0xWID0KLSAgICAgICAgICBNYWtlQWRkckxWYWx1ZShBcmdzLmJhY2soKSwgSS0+VHksIFR5cGVBbGlnbik7Ci0gICAgICAgIAotICAgICAgICBpZiAoUlYuaXNTY2FsYXIoKSkKLSAgICAgICAgICBFbWl0U3RvcmVPZlNjYWxhcihSVi5nZXRTY2FsYXJWYWwoKSwgYXJnTFYsIC8qaW5pdCovIHRydWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgRW1pdFN0b3JlT2ZDb21wbGV4KFJWLmdldENvbXBsZXhWYWwoKSwgYXJnTFYsIC8qaW5pdCovIHRydWUpOworICAgICAgICBMVmFsdWUgYXJnTFYgPSBNYWtlQWRkckxWYWx1ZShBcmdzLmJhY2soKSwgSS0+VHksIFR5cGVBbGlnbik7CisgICAgICAgIEVtaXRJbml0U3RvcmVPZk5vbkFnZ3JlZ2F0ZSgqdGhpcywgUlYsIGFyZ0xWKTsKICAgICAgICAgCiAgICAgICAgIC8vIFZhbGlkYXRlIGFyZ3VtZW50IG1hdGNoLgogICAgICAgICBjaGVja0FyZ01hdGNoZXMoQUksIElSQXJnTm8sIElSRnVuY1R5KTsKQEAgLTIzODYsMTEgKzI2OTgsNyBAQAogICAgICAgaWYgKFJWLmlzU2NhbGFyKCkgfHwgUlYuaXNDb21wbGV4KCkpIHsKICAgICAgICAgU3JjUHRyID0gQ3JlYXRlTWVtVGVtcChJLT5UeSwgImNvZXJjZSIpOwogICAgICAgICBMVmFsdWUgU3JjTFYgPSBNYWtlQWRkckxWYWx1ZShTcmNQdHIsIEktPlR5LCBUeXBlQWxpZ24pOwotICAgICAgICBpZiAoUlYuaXNTY2FsYXIoKSkgewotICAgICAgICAgIEVtaXRTdG9yZU9mU2NhbGFyKFJWLmdldFNjYWxhclZhbCgpLCBTcmNMViwgLyppbml0Ki8gdHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgRW1pdFN0b3JlT2ZDb21wbGV4KFJWLmdldENvbXBsZXhWYWwoKSwgU3JjTFYsIC8qaW5pdCovIHRydWUpOwotICAgICAgICB9CisgICAgICAgIEVtaXRJbml0U3RvcmVPZk5vbkFnZ3JlZ2F0ZSgqdGhpcywgUlYsIFNyY0xWKTsKICAgICAgIH0gZWxzZQogICAgICAgICBTcmNQdHIgPSBSVi5nZXRBZ2dyZWdhdGVBZGRyKCk7CiAKQEAgLTI0NTYsNiArMjc2NCwzNCBAQAogICAgIH0KICAgfQogCisgIGlmIChBcmdNZW1vcnkpIHsKKyAgICBsbHZtOjpWYWx1ZSAqQXJnID0gQXJnTWVtb3J5OworICAgIGxsdm06OlR5cGUgKkxhc3RQYXJhbVR5ID0KKyAgICAgICAgSVJGdW5jVHktPmdldFBhcmFtVHlwZShJUkZ1bmNUeS0+Z2V0TnVtUGFyYW1zKCkgLSAxKTsKKyAgICBpZiAoQXJnLT5nZXRUeXBlKCkgIT0gTGFzdFBhcmFtVHkpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAvLyBBc3NlcnQgdGhhdCB0aGVzZSBzdHJ1Y3RzIGhhdmUgZXF1aXZhbGVudCBlbGVtZW50IHR5cGVzLgorICAgICAgbGx2bTo6U3RydWN0VHlwZSAqRnVsbFR5ID0gQ2FsbEluZm8uZ2V0QXJnU3RydWN0KCk7CisgICAgICBsbHZtOjpTdHJ1Y3RUeXBlICpQcmVmaXggPSBjYXN0PGxsdm06OlN0cnVjdFR5cGU+KAorICAgICAgICAgIGNhc3Q8bGx2bTo6UG9pbnRlclR5cGU+KExhc3RQYXJhbVR5KS0+Z2V0RWxlbWVudFR5cGUoKSk7CisKKyAgICAgIC8vIEZvciB2YXJpYWRpYyBmdW5jdGlvbnMsIHRoZSBjYWxsZXIgbWlnaHQgc3VwcGx5IGEgbGFyZ2VyIHN0cnVjdCB0aGFuCisgICAgICAvLyB0aGUgY2FsbGVlIGV4cGVjdHMsIGFuZCB0aGF0J3MgT0suCisgICAgICBhc3NlcnQoUHJlZml4LT5nZXROdW1FbGVtZW50cygpID09IEZ1bGxUeS0+Z2V0TnVtRWxlbWVudHMoKSB8fAorICAgICAgICAgICAgIChDYWxsSW5mby5pc1ZhcmlhZGljKCkgJiYKKyAgICAgICAgICAgICAgUHJlZml4LT5nZXROdW1FbGVtZW50cygpIDw9IEZ1bGxUeS0+Z2V0TnVtRWxlbWVudHMoKSkpOworCisgICAgICBmb3IgKGxsdm06OlN0cnVjdFR5cGU6OmVsZW1lbnRfaXRlcmF0b3IgUEkgPSBQcmVmaXgtPmVsZW1lbnRfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRSA9IFByZWZpeC0+ZWxlbWVudF9lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSSA9IEZ1bGxUeS0+ZWxlbWVudF9iZWdpbigpOworICAgICAgICAgICBQSSAhPSBQRTsgKytQSSwgKytGSSkKKyAgICAgICAgYXNzZXJ0KCpQSSA9PSAqRkkpOworI2VuZGlmCisgICAgICBBcmcgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoQXJnLCBMYXN0UGFyYW1UeSk7CisgICAgfQorICAgIEFyZ3MucHVzaF9iYWNrKEFyZyk7CisgIH0KKwogICBpZiAoIUNhbGxBcmdzLmdldENsZWFudXBzVG9EZWFjdGl2YXRlKCkuZW1wdHkoKSkKICAgICBkZWFjdGl2YXRlQXJnQ2xlYW51cHNCZWZvcmVDYWxsKCp0aGlzLCBDYWxsQXJncyk7CiAKQEAgLTI1NDUsOSArMjg4MSwxNCBAQAogICBpZiAoQ2FsbEFyZ3MuaGFzV3JpdGViYWNrcygpKQogICAgIGVtaXRXcml0ZWJhY2tzKCp0aGlzLCBDYWxsQXJncyk7CiAKKyAgLy8gVGhlIHN0YWNrIGNsZWFudXAgZm9yIGluYWxsb2NhIGFyZ3VtZW50cyBoYXMgdG8gcnVuIG91dCBvZiB0aGUgbm9ybWFsCisgIC8vIGxleGljYWwgb3JkZXIsIHNvIGRlYWN0aXZhdGUgaXQgYW5kIHJ1biBpdCBtYW51YWxseSBoZXJlLgorICBDYWxsQXJncy5mcmVlQXJndW1lbnRNZW1vcnkoKnRoaXMpOworCiAgIHN3aXRjaCAoUmV0QUkuZ2V0S2luZCgpKSB7CisgIGNhc2UgQUJJQXJnSW5mbzo6SW5BbGxvY2E6CiAgIGNhc2UgQUJJQXJnSW5mbzo6SW5kaXJlY3Q6Ci0gICAgcmV0dXJuIGNvbnZlcnRUZW1wVG9SVmFsdWUoQXJnc1swXSwgUmV0VHksIFNvdXJjZUxvY2F0aW9uKCkpOworICAgIHJldHVybiBjb252ZXJ0VGVtcFRvUlZhbHVlKFNSZXRQdHIsIFJldFR5LCBTb3VyY2VMb2NhdGlvbigpKTsKIAogICBjYXNlIEFCSUFyZ0luZm86Oklnbm9yZToKICAgICAvLyBJZiB3ZSBhcmUgaWdub3JpbmcgYW4gYXJndW1lbnQgdGhhdCBoYWQgYSByZXN1bHQsIG1ha2Ugc3VyZSB0bwpkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ0dDYWxsLmggYi9saWIvQ29kZUdlbi9DR0NhbGwuaAppbmRleCA1MzJjYjU5Li4yZTQzZDFkIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0NhbGwuaAorKysgYi9saWIvQ29kZUdlbi9DR0NhbGwuaApAQCAtNTYsNiArNTYsOCBAQAogICBjbGFzcyBDYWxsQXJnTGlzdCA6CiAgICAgcHVibGljIFNtYWxsVmVjdG9yPENhbGxBcmcsIDE2PiB7CiAgIHB1YmxpYzoKKyAgICBDYWxsQXJnTGlzdCgpIDogU3RhY2tCYXNlKDApLCBTdGFja0Jhc2VNZW0oMCkge30KKwogICAgIHN0cnVjdCBXcml0ZWJhY2sgewogICAgICAgLy8vIFRoZSBvcmlnaW5hbCBhcmd1bWVudC4gIE5vdGUgdGhhdCB0aGUgYXJndW1lbnQgbC12YWx1ZQogICAgICAgLy8vIGlzIHBvdGVudGlhbGx5IG51bGwuCkBAIC05Nyw5ICs5OSwxMiBAQAogCiAgICAgYm9vbCBoYXNXcml0ZWJhY2tzKCkgY29uc3QgeyByZXR1cm4gIVdyaXRlYmFja3MuZW1wdHkoKTsgfQogCi0gICAgdHlwZWRlZiBTbWFsbFZlY3RvckltcGw8V3JpdGViYWNrPjo6Y29uc3RfaXRlcmF0b3Igd3JpdGViYWNrX2l0ZXJhdG9yOwotICAgIHdyaXRlYmFja19pdGVyYXRvciB3cml0ZWJhY2tfYmVnaW4oKSBjb25zdCB7IHJldHVybiBXcml0ZWJhY2tzLmJlZ2luKCk7IH0KLSAgICB3cml0ZWJhY2tfaXRlcmF0b3Igd3JpdGViYWNrX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFdyaXRlYmFja3MuZW5kKCk7IH0KKyAgICB0eXBlZGVmIGxsdm06Oml0ZXJhdG9yX3JhbmdlPFNtYWxsVmVjdG9ySW1wbDxXcml0ZWJhY2s+Ojpjb25zdF9pdGVyYXRvcj4KKyAgICAgIHdyaXRlYmFja19jb25zdF9yYW5nZTsKKworICAgIHdyaXRlYmFja19jb25zdF9yYW5nZSB3cml0ZWJhY2tzKCkgY29uc3QgeworICAgICAgcmV0dXJuIHdyaXRlYmFja19jb25zdF9yYW5nZShXcml0ZWJhY2tzLmJlZ2luKCksIFdyaXRlYmFja3MuZW5kKCkpOworICAgIH0KIAogICAgIHZvaWQgYWRkQXJnQ2xlYW51cERlYWN0aXZhdGlvbihFSFNjb3BlU3RhY2s6OnN0YWJsZV9pdGVyYXRvciBDbGVhbnVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpJbnN0cnVjdGlvbiAqSXNBY3RpdmVJUCkgewpAQCAtMTEzLDYgKzExOCwxNCBAQAogICAgICAgcmV0dXJuIENsZWFudXBzVG9EZWFjdGl2YXRlOwogICAgIH0KIAorICAgIHZvaWQgYWxsb2NhdGVBcmd1bWVudE1lbW9yeShDb2RlR2VuRnVuY3Rpb24gJkNHRik7CisgICAgbGx2bTo6SW5zdHJ1Y3Rpb24gKmdldFN0YWNrQmFzZSgpIGNvbnN0IHsgcmV0dXJuIFN0YWNrQmFzZTsgfQorICAgIHZvaWQgZnJlZUFyZ3VtZW50TWVtb3J5KENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyBpZiB3ZSdyZSB1c2luZyBhbiBpbmFsbG9jYSBzdHJ1Y3QgdG8gcGFzcyBhcmd1bWVudHMgaW4KKyAgICAvLy8gbWVtb3J5LgorICAgIGJvb2wgaXNVc2luZ0luQWxsb2NhKCkgY29uc3QgeyByZXR1cm4gU3RhY2tCYXNlOyB9CisKICAgcHJpdmF0ZToKICAgICBTbWFsbFZlY3RvcjxXcml0ZWJhY2ssIDE+IFdyaXRlYmFja3M7CiAKQEAgLTEyMCw2ICsxMzMsMTcgQEAKICAgICAvLy8gaXMgdXNlZCB0byBjbGVhbnVwIG9iamVjdHMgdGhhdCBhcmUgb3duZWQgYnkgdGhlIGNhbGxlZSBvbmNlIHRoZSBjYWxsCiAgICAgLy8vIG9jY3Vycy4KICAgICBTbWFsbFZlY3RvcjxDYWxsQXJnQ2xlYW51cCwgMT4gQ2xlYW51cHNUb0RlYWN0aXZhdGU7CisKKyAgICAvLy8gVGhlIHN0YWNrc2F2ZSBjYWxsLiAgSXQgZG9taW5hdGVzIGFsbCBvZiB0aGUgYXJndW1lbnQgZXZhbHVhdGlvbi4KKyAgICBsbHZtOjpDYWxsSW5zdCAqU3RhY2tCYXNlOworCisgICAgLy8vIFRoZSBhbGxvY2EgaG9sZGluZyB0aGUgc3RhY2tiYXNlLiAgV2UgbmVlZCBpdCB0byBtYWludGFpbiBTU0EgZm9ybS4KKyAgICBsbHZtOjpBbGxvY2FJbnN0ICpTdGFja0Jhc2VNZW07CisKKyAgICAvLy8gVGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBzdGFjayByZXN0b3JlIGNsZWFudXAuICBXZSBtYW51YWxseSBydW4gYW5kCisgICAgLy8vIGRlYWN0aXZhdGUgdGhpcyBjbGVhbnVwIGFmdGVyIHRoZSBjYWxsIGluIHRoZSB1bmV4Y2VwdGlvbmFsIGNhc2UgYmVjYXVzZQorICAgIC8vLyBpdCBkb2Vzbid0IHJ1biBpbiB0aGUgbm9ybWFsIG9yZGVyLgorICAgIEVIU2NvcGVTdGFjazo6c3RhYmxlX2l0ZXJhdG9yIFN0YWNrQ2xlYW51cDsKICAgfTsKIAogICAvLy8gRnVuY3Rpb25BcmdMaXN0IC0gVHlwZSBmb3IgcmVwcmVzZW50aW5nIGJvdGggdGhlIGRlY2wgYW5kIHR5cGUKZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHQ2xhc3MuY3BwIGIvbGliL0NvZGVHZW4vQ0dDbGFzcy5jcHAKaW5kZXggNDg0OGQ3NS4uMDcxZjhiMyAxMDA2NDQKLS0tIGEvbGliL0NvZGVHZW4vQ0dDbGFzcy5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ0dDbGFzcy5jcHAKQEAgLTEyLDEwICsxMiwxMCBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgIkNHQmxvY2tzLmgiCisjaW5jbHVkZSAiQ0dDWFhBQkkuaCIKICNpbmNsdWRlICJDR0RlYnVnSW5mby5oIgogI2luY2x1ZGUgIkNHUmVjb3JkTGF5b3V0LmgiCiAjaW5jbHVkZSAiQ29kZUdlbkZ1bmN0aW9uLmgiCi0jaW5jbHVkZSAiQ0dDWFhBQkkuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQ1hYSW5oZXJpdGFuY2UuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V2YWx1YXRlZEV4cHJWaXNpdG9yLmgiCkBAIC0zNDIsNyArMzQyLDcgQEAKICAgICBDYWxsQmFzZUR0b3IoY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZSwgYm9vbCBCYXNlSXNWaXJ0dWFsKQogICAgICAgOiBCYXNlQ2xhc3MoQmFzZSksIEJhc2VJc1ZpcnR1YWwoQmFzZUlzVmlydHVhbCkge30KIAotICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSBvdmVycmlkZSB7CiAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpEZXJpdmVkQ2xhc3MgPQogICAgICAgICBjYXN0PENYWE1ldGhvZERlY2w+KENHRi5DdXJDb2RlRGVjbCktPmdldFBhcmVudCgpOwogCkBAIC01NDksMTAgKzU0OSw4IEBACiAgICAgLy8gSWYgd2UgYXJlIGluaXRpYWxpemluZyBhbiBhbm9ueW1vdXMgdW5pb24gZmllbGQsIGRyaWxsIGRvd24gdG8KICAgICAvLyB0aGUgZmllbGQuCiAgICAgSW5kaXJlY3RGaWVsZERlY2wgKkluZGlyZWN0RmllbGQgPSBNZW1iZXJJbml0LT5nZXRJbmRpcmVjdE1lbWJlcigpOwotICAgIEluZGlyZWN0RmllbGREZWNsOjpjaGFpbl9pdGVyYXRvciBJID0gSW5kaXJlY3RGaWVsZC0+Y2hhaW5fYmVnaW4oKSwKLSAgICAgIElFbmQgPSBJbmRpcmVjdEZpZWxkLT5jaGFpbl9lbmQoKTsKLSAgICBmb3IgKCA7IEkgIT0gSUVuZDsgKytJKQotICAgICAgTEhTID0gQ0dGLkVtaXRMVmFsdWVGb3JGaWVsZEluaXRpYWxpemF0aW9uKExIUywgY2FzdDxGaWVsZERlY2w+KCpJKSk7CisgICAgZm9yIChjb25zdCBhdXRvICpJIDogSW5kaXJlY3RGaWVsZC0+Y2hhaW4oKSkKKyAgICAgIExIUyA9IENHRi5FbWl0TFZhbHVlRm9yRmllbGRJbml0aWFsaXphdGlvbihMSFMsIGNhc3Q8RmllbGREZWNsPihJKSk7CiAgICAgRmllbGRUeXBlID0gTWVtYmVySW5pdC0+Z2V0SW5kaXJlY3RNZW1iZXIoKS0+Z2V0QW5vbkZpZWxkKCktPmdldFR5cGUoKTsKICAgfSBlbHNlIHsKICAgICBMSFMgPSBDR0YuRW1pdExWYWx1ZUZvckZpZWxkSW5pdGlhbGl6YXRpb24oTEhTLCBGaWVsZCk7CkBAIC02OTksNiArNjk3LDEwIEBACiAgIGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqQ3RvciA9IGNhc3Q8Q1hYQ29uc3RydWN0b3JEZWNsPihDdXJHRC5nZXREZWNsKCkpOwogICBDWFhDdG9yVHlwZSBDdG9yVHlwZSA9IEN1ckdELmdldEN0b3JUeXBlKCk7CiAKKyAgYXNzZXJ0KChDR00uZ2V0VGFyZ2V0KCkuZ2V0Q1hYQUJJKCkuaGFzQ29uc3RydWN0b3JWYXJpYW50cygpIHx8CisgICAgICAgICAgQ3RvclR5cGUgPT0gQ3Rvcl9Db21wbGV0ZSkgJiYKKyAgICAgICAgICJjYW4gb25seSBnZW5lcmF0ZSBjb21wbGV0ZSBjdG9yIGZvciB0aGlzIEFCSSIpOworCiAgIC8vIEJlZm9yZSB3ZSBnbyBhbnkgZnVydGhlciwgdHJ5IHRoZSBjb21wbGV0ZS0+YmFzZSBjb25zdHJ1Y3RvcgogICAvLyBkZWxlZ2F0aW9uIG9wdGltaXphdGlvbi4KICAgaWYgKEN0b3JUeXBlID09IEN0b3JfQ29tcGxldGUgJiYgSXNDb25zdHJ1Y3RvckRlbGVnYXRpb25WYWxpZChDdG9yKSAmJgpAQCAtNzE3LDYgKzcxOSw5IEBACiAgIGlmIChJc1RyeUJvZHkpCiAgICAgRW50ZXJDWFhUcnlTdG10KCpjYXN0PENYWFRyeVN0bXQ+KEJvZHkpLCB0cnVlKTsKIAorICBSZWdpb25Db3VudGVyIENudCA9IGdldFBHT1JlZ2lvbkNvdW50ZXIoQm9keSk7CisgIENudC5iZWdpblJlZ2lvbihCdWlsZGVyKTsKKwogICBSdW5DbGVhbnVwc1Njb3BlIFJ1bkNsZWFudXBzKCp0aGlzKTsKIAogICAvLyBUT0RPOiBpbiByZXN0cmljdGVkIGNhc2VzLCB3ZSBjYW4gZW1pdCB0aGUgdmJhc2UgaW5pdGlhbGl6ZXJzIG9mCkBAIC0xMTkwLDIzICsxMTk1LDE3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIC8vIENoZWNrIGZpZWxkcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBJID0gQmFzZUNsYXNzRGVjbC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICBFID0gQmFzZUNsYXNzRGVjbC0+ZmllbGRfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgRmllbGREZWNsICpGaWVsZCA9ICpJOwotICAgIAorICBmb3IgKGNvbnN0IGF1dG8gKkZpZWxkIDogQmFzZUNsYXNzRGVjbC0+ZmllbGRzKCkpCiAgICAgaWYgKCFGaWVsZEhhc1RyaXZpYWxEZXN0cnVjdG9yQm9keShDb250ZXh0LCBGaWVsZCkpCiAgICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KIAogICAvLyBDaGVjayBub24tdmlydHVhbCBiYXNlcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSAKLSAgICAgICBCYXNlQ2xhc3NEZWNsLT5iYXNlc19iZWdpbigpLCBFID0gQmFzZUNsYXNzRGVjbC0+YmFzZXNfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoSS0+aXNWaXJ0dWFsKCkpCisgIGZvciAoY29uc3QgYXV0byAmSSA6IEJhc2VDbGFzc0RlY2wtPmJhc2VzKCkpIHsKKyAgICBpZiAoSS5pc1ZpcnR1YWwoKSkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTm9uVmlydHVhbEJhc2UgPQotICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLT5nZXRUeXBlKCktPmNhc3RBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Y2FzdEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CiAgICAgaWYgKCFIYXNUcml2aWFsRGVzdHJ1Y3RvckJvZHkoQ29udGV4dCwgTm9uVmlydHVhbEJhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9zdERlcml2ZWRDbGFzc0RlY2wpKQogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTIxNCwxMSArMTIxMyw5IEBACiAKICAgaWYgKEJhc2VDbGFzc0RlY2wgPT0gTW9zdERlcml2ZWRDbGFzc0RlY2wpIHsKICAgICAvLyBDaGVjayB2aXJ0dWFsIGJhc2VzLgotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gCi0gICAgICAgICBCYXNlQ2xhc3NEZWNsLT52YmFzZXNfYmVnaW4oKSwgRSA9IEJhc2VDbGFzc0RlY2wtPnZiYXNlc19lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogQmFzZUNsYXNzRGVjbC0+dmJhc2VzKCkpIHsKICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlZpcnR1YWxCYXNlID0KLSAgICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLT5nZXRUeXBlKCktPmNhc3RBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgICBjYXN0PENYWFJlY29yZERlY2w+KEkuZ2V0VHlwZSgpLT5jYXN0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKICAgICAgIGlmICghSGFzVHJpdmlhbERlc3RydWN0b3JCb2R5KENvbnRleHQsIFZpcnR1YWxCYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9zdERlcml2ZWRDbGFzc0RlY2wpKQogICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgCkBAIC0xMjUxLDEzICsxMjQ4LDkgQEAKIAogICAvLyBDaGVjayB0aGUgZmllbGRzLgogICBjb25zdCBDWFhSZWNvcmREZWNsICpDbGFzc0RlY2wgPSBEdG9yLT5nZXRQYXJlbnQoKTsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBJID0gQ2xhc3NEZWNsLT5maWVsZF9iZWdpbigpLAotICAgICAgIEUgPSBDbGFzc0RlY2wtPmZpZWxkX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGNvbnN0IEZpZWxkRGVjbCAqRmllbGQgPSAqSTsKLQorICBmb3IgKGNvbnN0IGF1dG8gKkZpZWxkIDogQ2xhc3NEZWNsLT5maWVsZHMoKSkKICAgICBpZiAoIUZpZWxkSGFzVHJpdmlhbERlc3RydWN0b3JCb2R5KENvbnRleHQsIEZpZWxkKSkKICAgICAgIHJldHVybiBmYWxzZTsKLSAgfQogCiAgIHJldHVybiB0cnVlOwogfQpAQCAtMTMxNSw2ICsxMzA4LDkgQEAKICAgY2FzZSBEdG9yX0Jhc2U6CiAgICAgYXNzZXJ0KEJvZHkpOwogCisgICAgUmVnaW9uQ291bnRlciBDbnQgPSBnZXRQR09SZWdpb25Db3VudGVyKEJvZHkpOworICAgIENudC5iZWdpblJlZ2lvbihCdWlsZGVyKTsKKwogICAgIC8vIEVudGVyIHRoZSBjbGVhbnVwIHNjb3BlcyBmb3IgZmllbGRzIGFuZCBub24tdmlydHVhbCBiYXNlcy4KICAgICBFbnRlckR0b3JDbGVhbnVwcyhEdG9yLCBEdG9yX0Jhc2UpOwogCkBAIC0xMzU1LDExICsxMzUxLDggQEAKICAgTGV4aWNhbFNjb3BlIFNjb3BlKCp0aGlzLCBSb290Q1MtPmdldFNvdXJjZVJhbmdlKCkpOwogCiAgIEFzc2lnbm1lbnRNZW1jcHlpemVyIEFNKCp0aGlzLCBBc3NpZ25PcCwgQXJncyk7Ci0gIGZvciAoQ29tcG91bmRTdG10Ojpjb25zdF9ib2R5X2l0ZXJhdG9yIEkgPSBSb290Q1MtPmJvZHlfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IFJvb3RDUy0+Ym9keV9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIEFNLmVtaXRBc3NpZ25tZW50KCpJKTsgIAotICB9CisgIGZvciAoYXV0byAqSSA6IFJvb3RDUy0+Ym9keSgpKQorICAgIEFNLmVtaXRBc3NpZ25tZW50KEkpOyAgCiAgIEFNLmZpbmlzaCgpOwogfQogCkBAIC0xMzY4LDcgKzEzNjEsNyBAQAogICBzdHJ1Y3QgQ2FsbER0b3JEZWxldGUgOiBFSFNjb3BlU3RhY2s6OkNsZWFudXAgewogICAgIENhbGxEdG9yRGVsZXRlKCkge30KIAotICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSBvdmVycmlkZSB7CiAgICAgICBjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRHRvciA9IGNhc3Q8Q1hYRGVzdHJ1Y3RvckRlY2w+KENHRi5DdXJDb2RlRGVjbCk7CiAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpDbGFzc0RlY2wgPSBEdG9yLT5nZXRQYXJlbnQoKTsKICAgICAgIENHRi5FbWl0RGVsZXRlQ2FsbChEdG9yLT5nZXRPcGVyYXRvckRlbGV0ZSgpLCBDR0YuTG9hZENYWFRoaXMoKSwKQEAgLTEzODQsNyArMTM3Nyw3IEBACiAgICAgICBhc3NlcnQoU2hvdWxkRGVsZXRlQ29uZGl0aW9uICE9IE5VTEwpOwogICAgIH0KIAotICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSBvdmVycmlkZSB7CiAgICAgICBsbHZtOjpCYXNpY0Jsb2NrICpjYWxsRGVsZXRlQkIgPSBDR0YuY3JlYXRlQmFzaWNCbG9jaygiZHRvci5jYWxsX2RlbGV0ZSIpOwogICAgICAgbGx2bTo6QmFzaWNCbG9jayAqY29udGludWVCQiA9IENHRi5jcmVhdGVCYXNpY0Jsb2NrKCJkdG9yLmNvbnRpbnVlIik7CiAgICAgICBsbHZtOjpWYWx1ZSAqU2hvdWxkQ2FsbERlbGV0ZQpAQCAtMTQxMyw3ICsxNDA2LDcgQEAKICAgICAgIDogZmllbGQoZmllbGQpLCBkZXN0cm95ZXIoZGVzdHJveWVyKSwKICAgICAgICAgdXNlRUhDbGVhbnVwRm9yQXJyYXkodXNlRUhDbGVhbnVwRm9yQXJyYXkpIHt9CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgLy8gRmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgZmllbGQuCiAgICAgICBsbHZtOjpWYWx1ZSAqdGhpc1ZhbHVlID0gQ0dGLkxvYWRDWFhUaGlzKCk7CiAgICAgICBRdWFsVHlwZSBSZWNvcmRUeSA9IENHRi5nZXRDb250ZXh0KCkuZ2V0VGFnRGVjbFR5cGUoZmllbGQtPmdldFBhcmVudCgpKTsKQEAgLTE0MjcsNyArMTQyMCw3IEBACiAgIH07CiB9CiAKLS8vLyBFbWl0RHRvckVwaWxvZ3VlIC0gRW1pdCBhbGwgY29kZSB0aGF0IGNvbWVzIGF0IHRoZSBlbmQgb2YgY2xhc3MncworLy8vIFxicmllZiBFbWl0IGFsbCBjb2RlIHRoYXQgY29tZXMgYXQgdGhlIGVuZCBvZiBjbGFzcydzCiAvLy8gZGVzdHJ1Y3Rvci4gVGhpcyBpcyB0byBjYWxsIGRlc3RydWN0b3JzIG9uIG1lbWJlcnMgYW5kIGJhc2UgY2xhc3NlcwogLy8vIGluIHJldmVyc2Ugb3JkZXIgb2YgdGhlaXIgY29uc3RydWN0aW9uLgogdm9pZCBDb2RlR2VuRnVuY3Rpb246OkVudGVyRHRvckNsZWFudXBzKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpERCwKQEAgLTE0MzksNyArMTQzMiw3IEBACiAgIC8vIG9wZXJhdG9yIGRlbGV0ZSB0aGF0IFNlbWEgcGlja2VkIHVwLgogICBpZiAoRHRvclR5cGUgPT0gRHRvcl9EZWxldGluZykgewogICAgIGFzc2VydChERC0+Z2V0T3BlcmF0b3JEZWxldGUoKSAmJiAKLSAgICAgICAgICAgIm9wZXJhdG9yIGRlbGV0ZSBtaXNzaW5nIC0gRW1pdER0b3JFcGlsb2d1ZSIpOworICAgICAgICAgICAib3BlcmF0b3IgZGVsZXRlIG1pc3NpbmcgLSBFbnRlckR0b3JDbGVhbnVwcyIpOwogICAgIGlmIChDWFhTdHJ1Y3RvckltcGxpY2l0UGFyYW1WYWx1ZSkgewogICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gaW1wbGljaXQgcGFyYW0gdG8gdGhlIGRlbGV0aW5nIGR0b3IsIGl0J3MgYSBib29sZWFuCiAgICAgICAvLyB0ZWxsaW5nIHdoZXRoZXIgd2Ugc2hvdWxkIGNhbGwgZGVsZXRlIGF0IHRoZSBlbmQgb2YgdGhlIGR0b3IuCkBAIC0xNDYyLDEwICsxNDU1LDcgQEAKIAogICAgIC8vIFdlIHB1c2ggdGhlbSBpbiB0aGUgZm9yd2FyZCBvcmRlciBzbyB0aGF0IHRoZXknbGwgYmUgcG9wcGVkIGluCiAgICAgLy8gdGhlIHJldmVyc2Ugb3JkZXIuCi0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSAKLSAgICAgICAgICAgQ2xhc3NEZWNsLT52YmFzZXNfYmVnaW4oKSwgRSA9IENsYXNzRGVjbC0+dmJhc2VzX2VuZCgpOwotICAgICAgICAgICAgICBJICE9IEU7ICsrSSkgewotICAgICAgY29uc3QgQ1hYQmFzZVNwZWNpZmllciAmQmFzZSA9ICpJOworICAgIGZvciAoY29uc3QgYXV0byAmQmFzZSA6IENsYXNzRGVjbC0+dmJhc2VzKCkpIHsKICAgICAgIENYWFJlY29yZERlY2wgKkJhc2VDbGFzc0RlY2wKICAgICAgICAgPSBjYXN0PENYWFJlY29yZERlY2w+KEJhc2UuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogICAgIApAQCAtMTQ4NCwxMCArMTQ3NCw3IEBACiAgIGFzc2VydChEdG9yVHlwZSA9PSBEdG9yX0Jhc2UpOwogICAKICAgLy8gRGVzdHJveSBub24tdmlydHVhbCBiYXNlcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSAKLSAgICAgICAgQ2xhc3NEZWNsLT5iYXNlc19iZWdpbigpLCBFID0gQ2xhc3NEZWNsLT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBDWFhCYXNlU3BlY2lmaWVyICZCYXNlID0gKkk7Ci0gICAgCisgIGZvciAoY29uc3QgYXV0byAmQmFzZSA6IENsYXNzRGVjbC0+YmFzZXMoKSkgewogICAgIC8vIElnbm9yZSB2aXJ0dWFsIGJhc2VzLgogICAgIGlmIChCYXNlLmlzVmlydHVhbCgpKQogICAgICAgY29udGludWU7CkBAIC0xNTA0LDExICsxNDkxLDggQEAKICAgfQogCiAgIC8vIERlc3Ryb3kgZGlyZWN0IGZpZWxkcy4KLSAgU21hbGxWZWN0b3I8Y29uc3QgRmllbGREZWNsICosIDE2PiBGaWVsZERlY2xzOwotICBmb3IgKENYWFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEkgPSBDbGFzc0RlY2wtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgRSA9IENsYXNzRGVjbC0+ZmllbGRfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgRmllbGREZWNsICpmaWVsZCA9ICpJOwotICAgIFF1YWxUeXBlIHR5cGUgPSBmaWVsZC0+Z2V0VHlwZSgpOworICBmb3IgKGNvbnN0IGF1dG8gKkZpZWxkIDogQ2xhc3NEZWNsLT5maWVsZHMoKSkgeworICAgIFF1YWxUeXBlIHR5cGUgPSBGaWVsZC0+Z2V0VHlwZSgpOwogICAgIFF1YWxUeXBlOjpEZXN0cnVjdGlvbktpbmQgZHRvcktpbmQgPSB0eXBlLmlzRGVzdHJ1Y3RlZFR5cGUoKTsKICAgICBpZiAoIWR0b3JLaW5kKSBjb250aW51ZTsKIApAQCAtMTUxNyw3ICsxNTAxLDcgQEAKICAgICBpZiAoUlQgJiYgUlQtPmdldERlY2woKS0+aXNBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKCkpIGNvbnRpbnVlOwogCiAgICAgQ2xlYW51cEtpbmQgY2xlYW51cEtpbmQgPSBnZXRDbGVhbnVwS2luZChkdG9yS2luZCk7Ci0gICAgRUhTdGFjay5wdXNoQ2xlYW51cDxEZXN0cm95RmllbGQ+KGNsZWFudXBLaW5kLCBmaWVsZCwKKyAgICBFSFN0YWNrLnB1c2hDbGVhbnVwPERlc3Ryb3lGaWVsZD4oY2xlYW51cEtpbmQsIEZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXN0cm95ZXIoZHRvcktpbmQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwS2luZCAmIEVIQ2xlYW51cCk7CiAgIH0KQEAgLTE2ODMsOSArMTY2NywzMSBAQAogICAgIHJldHVybjsKICAgfQogCi0gIC8vIE5vbi10cml2aWFsIGNvbnN0cnVjdG9ycyBhcmUgaGFuZGxlZCBpbiBhbiBBQkktc3BlY2lmaWMgbWFubmVyLgotICBDR00uZ2V0Q1hYQUJJKCkuRW1pdENvbnN0cnVjdG9yQ2FsbCgqdGhpcywgRCwgVHlwZSwgRm9yVmlydHVhbEJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGVnYXRpbmcsIFRoaXMsIEFyZ0JlZywgQXJnRW5kKTsKKyAgLy8gQysrMTEgW2NsYXNzLm1mY3Qubm9uLXN0YXRpY11wMjoKKyAgLy8gICBJZiBhIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIG9mIGEgY2xhc3MgWCBpcyBjYWxsZWQgZm9yIGFuIG9iamVjdCB0aGF0CisgIC8vICAgaXMgbm90IG9mIHR5cGUgWCwgb3Igb2YgYSB0eXBlIGRlcml2ZWQgZnJvbSBYLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICAvLyBGSVhNRTogUHJvdmlkZSBhIHNvdXJjZSBsb2NhdGlvbiBoZXJlLgorICBFbWl0VHlwZUNoZWNrKENvZGVHZW5GdW5jdGlvbjo6VENLX0NvbnN0cnVjdG9yQ2FsbCwgU291cmNlTG9jYXRpb24oKSwgVGhpcywKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0UmVjb3JkVHlwZShELT5nZXRQYXJlbnQoKSkpOworCisgIENhbGxBcmdMaXN0IEFyZ3M7CisKKyAgLy8gUHVzaCB0aGUgdGhpcyBwdHIuCisgIEFyZ3MuYWRkKFJWYWx1ZTo6Z2V0KFRoaXMpLCBELT5nZXRUaGlzVHlwZShnZXRDb250ZXh0KCkpKTsKKworICAvLyBBZGQgdGhlIHJlc3Qgb2YgdGhlIHVzZXItc3VwcGxpZWQgYXJndW1lbnRzLgorICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0gRC0+Z2V0VHlwZSgpLT5jYXN0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CisgIEVtaXRDYWxsQXJncyhBcmdzLCBGUFQsIEFyZ0JlZywgQXJnRW5kKTsKKworICAvLyBJbnNlcnQgYW55IEFCSS1zcGVjaWZpYyBpbXBsaWNpdCBjb25zdHJ1Y3RvciBhcmd1bWVudHMuCisgIHVuc2lnbmVkIEV4dHJhQXJncyA9IENHTS5nZXRDWFhBQkkoKS5hZGRJbXBsaWNpdENvbnN0cnVjdG9yQXJncygKKyAgICAgICp0aGlzLCBELCBUeXBlLCBGb3JWaXJ0dWFsQmFzZSwgRGVsZWdhdGluZywgQXJncyk7CisKKyAgLy8gRW1pdCB0aGUgY2FsbC4KKyAgbGx2bTo6VmFsdWUgKkNhbGxlZSA9IENHTS5HZXRBZGRyT2ZDWFhDb25zdHJ1Y3RvcihELCBUeXBlKTsKKyAgY29uc3QgQ0dGdW5jdGlvbkluZm8gJkluZm8gPQorICAgICAgQ0dNLmdldFR5cGVzKCkuYXJyYW5nZUNYWENvbnN0cnVjdG9yQ2FsbChBcmdzLCBELCBUeXBlLCBFeHRyYUFyZ3MpOworICBFbWl0Q2FsbChJbmZvLCBDYWxsZWUsIFJldHVyblZhbHVlU2xvdCgpLCBBcmdzLCBEKTsKIH0KIAogdm9pZApAQCAtMTcwNCwzOCArMTcxMCwyMyBAQAogICBhc3NlcnQoRC0+aXNJbnN0YW5jZSgpICYmCiAgICAgICAgICAiVHJ5aW5nIHRvIGVtaXQgYSBtZW1iZXIgY2FsbCBleHByIG9uIGEgc3RhdGljIG1ldGhvZCEiKTsKICAgCi0gIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpGUFQgPSBELT5nZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOworICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0gRC0+Z2V0VHlwZSgpLT5jYXN0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CiAgIAogICBDYWxsQXJnTGlzdCBBcmdzOwogICAKICAgLy8gUHVzaCB0aGUgdGhpcyBwdHIuCiAgIEFyZ3MuYWRkKFJWYWx1ZTo6Z2V0KFRoaXMpLCBELT5nZXRUaGlzVHlwZShnZXRDb250ZXh0KCkpKTsKICAgCi0gIAogICAvLyBQdXNoIHRoZSBzcmMgcHRyLgotICBRdWFsVHlwZSBRVCA9ICooRlBULT5hcmdfdHlwZV9iZWdpbigpKTsKKyAgUXVhbFR5cGUgUVQgPSAqKEZQVC0+cGFyYW1fdHlwZV9iZWdpbigpKTsKICAgbGx2bTo6VHlwZSAqdCA9IENHTS5nZXRUeXBlcygpLkNvbnZlcnRUeXBlKFFUKTsKICAgU3JjID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KFNyYywgdCk7CiAgIEFyZ3MuYWRkKFJWYWx1ZTo6Z2V0KFNyYyksIFFUKTsKLSAgCisKICAgLy8gU2tpcCBvdmVyIGZpcnN0IGFyZ3VtZW50IChTcmMpLgotICArK0FyZ0JlZzsKLSAgQ2FsbEV4cHI6OmNvbnN0X2FyZ19pdGVyYXRvciBBcmcgPSBBcmdCZWc7Ci0gIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yIEkgPSBGUFQtPmFyZ190eXBlX2JlZ2luKCkrMSwKLSAgICAgICBFID0gRlBULT5hcmdfdHlwZV9lbmQoKTsgSSAhPSBFOyArK0ksICsrQXJnKSB7Ci0gICAgYXNzZXJ0KEFyZyAhPSBBcmdFbmQgJiYgIlJ1bm5pbmcgb3ZlciBlZGdlIG9mIGFyZ3VtZW50IGxpc3QhIik7Ci0gICAgRW1pdENhbGxBcmcoQXJncywgKkFyZywgKkkpOwotICB9Ci0gIC8vIEVpdGhlciB3ZSd2ZSBlbWl0dGVkIGFsbCB0aGUgY2FsbCBhcmdzLCBvciB3ZSBoYXZlIGEgY2FsbCB0byBhCi0gIC8vIHZhcmlhZGljIGZ1bmN0aW9uLgotICBhc3NlcnQoKEFyZyA9PSBBcmdFbmQgfHwgRlBULT5pc1ZhcmlhZGljKCkpICYmCi0gICAgICAgICAiRXh0cmEgYXJndW1lbnRzIGluIG5vbi12YXJpYWRpYyBmdW5jdGlvbiEiKTsKLSAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBhbnkgYXJndW1lbnRzLCBlbWl0IHRoZW0gdXNpbmcgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50LgotICBmb3IgKDsgQXJnICE9IEFyZ0VuZDsgKytBcmcpIHsKLSAgICBRdWFsVHlwZSBBcmdUeXBlID0gQXJnLT5nZXRUeXBlKCk7Ci0gICAgRW1pdENhbGxBcmcoQXJncywgKkFyZywgQXJnVHlwZSk7Ci0gIH0KLSAgCisgIEVtaXRDYWxsQXJncyhBcmdzLCBGUFQtPmlzVmFyaWFkaWMoKSwgRlBULT5wYXJhbV90eXBlX2JlZ2luKCkgKyAxLAorICAgICAgICAgICAgICAgRlBULT5wYXJhbV90eXBlX2VuZCgpLCBBcmdCZWcgKyAxLCBBcmdFbmQpOworCiAgIEVtaXRDYWxsKENHTS5nZXRUeXBlcygpLmFycmFuZ2VDWFhNZXRob2RDYWxsKEFyZ3MsIEZQVCwgUmVxdWlyZWRBcmdzOjpBbGwpLAogICAgICAgICAgICBDYWxsZWUsIFJldHVyblZhbHVlU2xvdCgpLCBBcmdzLCBEKTsKIH0KQEAgLTE3OTAsNyArMTc4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhEdG9yVHlwZSBUeXBlKQogICAgICAgOiBEdG9yKEQpLCBBZGRyKEFkZHIpLCBUeXBlKFR5cGUpIHt9CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgQ0dGLkVtaXRDWFhEZXN0cnVjdG9yQ2FsbChEdG9yLCBUeXBlLCAvKkZvclZpcnR1YWxCYXNlPSovZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRGVsZWdhdGluZz0qL3RydWUsIEFkZHIpOwogICAgIH0KQEAgLTE4MzAsMjMgKzE4MjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvclZpcnR1YWxCYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlbGVnYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpUaGlzKSB7Ci0gIEdsb2JhbERlY2wgR0QoREQsIFR5cGUpOwotICBsbHZtOjpWYWx1ZSAqVlRUID0gR2V0VlRUUGFyYW1ldGVyKEdELCBGb3JWaXJ0dWFsQmFzZSwgRGVsZWdhdGluZyk7Ci0gIGxsdm06OlZhbHVlICpDYWxsZWUgPSAwOwotICBpZiAoZ2V0TGFuZ09wdHMoKS5BcHBsZUtleHQpCi0gICAgQ2FsbGVlID0gQnVpbGRBcHBsZUtleHRWaXJ0dWFsRGVzdHJ1Y3RvckNhbGwoREQsIFR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERELT5nZXRQYXJlbnQoKSk7Ci0gICAgCi0gIGlmICghQ2FsbGVlKQotICAgIENhbGxlZSA9IENHTS5HZXRBZGRyT2ZDWFhEZXN0cnVjdG9yKERELCBUeXBlKTsKLQotICBpZiAoREQtPmlzVmlydHVhbCgpKQotICAgIFRoaXMgPSBDR00uZ2V0Q1hYQUJJKCkuYWRqdXN0VGhpc0FyZ3VtZW50Rm9yVmlydHVhbENhbGwoKnRoaXMsIEdELCBUaGlzKTsKLQotICAvLyBGSVhNRTogUHJvdmlkZSBhIHNvdXJjZSBsb2NhdGlvbiBoZXJlLgotICBFbWl0Q1hYTWVtYmVyQ2FsbChERCwgU291cmNlTG9jYXRpb24oKSwgQ2FsbGVlLCBSZXR1cm5WYWx1ZVNsb3QoKSwgVGhpcywKLSAgICAgICAgICAgICAgICAgICAgVlRULCBnZXRDb250ZXh0KCkuZ2V0UG9pbnRlclR5cGUoZ2V0Q29udGV4dCgpLlZvaWRQdHJUeSksCi0gICAgICAgICAgICAgICAgICAgIDAsIDApOworICBDR00uZ2V0Q1hYQUJJKCkuRW1pdERlc3RydWN0b3JDYWxsKCp0aGlzLCBERCwgVHlwZSwgRm9yVmlydHVhbEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZWdhdGluZywgVGhpcyk7CiB9CiAKIG5hbWVzcGFjZSB7CkBAIC0xODU3LDcgKzE4MzMsNyBAQAogICAgIENhbGxMb2NhbER0b3IoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkQsIGxsdm06OlZhbHVlICpBZGRyKQogICAgICAgOiBEdG9yKEQpLCBBZGRyKEFkZHIpIHt9CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgQ0dGLkVtaXRDWFhEZXN0cnVjdG9yQ2FsbChEdG9yLCBEdG9yX0NvbXBsZXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZvclZpcnR1YWxCYXNlPSovZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRGVsZWdhdGluZz0qL2ZhbHNlLCBBZGRyKTsKQEAgLTE5NDQsMTAgKzE5MjAsOSBAQAogICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IEJhc2UuZ2V0QmFzZSgpOwogCiAgIC8vIFRyYXZlcnNlIGJhc2VzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT5iYXNlc19iZWdpbigpLCAKLSAgICAgICBFID0gUkQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSRC0+YmFzZXMoKSkgewogICAgIENYWFJlY29yZERlY2wgKkJhc2VEZWNsCi0gICAgICA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgPSBjYXN0PENYWFJlY29yZERlY2w+KEkuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogCiAgICAgLy8gSWdub3JlIGNsYXNzZXMgd2l0aG91dCBhIHZ0YWJsZS4KICAgICBpZiAoIUJhc2VEZWNsLT5pc0R5bmFtaWNDbGFzcygpKQpAQCAtMTk1Nyw3ICsxOTMyLDcgQEAKICAgICBDaGFyVW5pdHMgQmFzZU9mZnNldEZyb21OZWFyZXN0VkJhc2U7CiAgICAgYm9vbCBCYXNlRGVjbElzTm9uVmlydHVhbFByaW1hcnlCYXNlOwogCi0gICAgaWYgKEktPmlzVmlydHVhbCgpKSB7CisgICAgaWYgKEkuaXNWaXJ0dWFsKCkpIHsKICAgICAgIC8vIENoZWNrIGlmIHdlJ3ZlIHZpc2l0ZWQgdGhpcyB2aXJ0dWFsIGJhc2UgYmVmb3JlLgogICAgICAgaWYgKCFWQmFzZXMuaW5zZXJ0KEJhc2VEZWNsKSkKICAgICAgICAgY29udGludWU7CkBAIC0xOTc4LDcgKzE5NTMsNyBAQAogICAgIH0KICAgICAKICAgICBJbml0aWFsaXplVlRhYmxlUG9pbnRlcnMoQmFzZVN1Ym9iamVjdChCYXNlRGVjbCwgQmFzZU9mZnNldCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLT5pc1ZpcnR1YWwoKSA/IEJhc2VEZWNsIDogTmVhcmVzdFZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLmlzVmlydHVhbCgpID8gQmFzZURlY2wgOiBOZWFyZXN0VkJhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VPZmZzZXRGcm9tTmVhcmVzdFZCYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlRGVjbElzTm9uVmlydHVhbFByaW1hcnlCYXNlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlRhYmxlQ2xhc3MsIFZCYXNlcyk7CkBAIC0yMTI3LDcgKzIxMDIsNyBAQAogICAvLyBQcmVwYXJlIHRoZSByZXR1cm4gc2xvdC4KICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9CiAgICAgY2FsbE9wZXJhdG9yLT5nZXRUeXBlKCktPmNhc3RBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKLSAgUXVhbFR5cGUgcmVzdWx0VHlwZSA9IEZQVC0+Z2V0UmVzdWx0VHlwZSgpOworICBRdWFsVHlwZSByZXN1bHRUeXBlID0gRlBULT5nZXRSZXR1cm5UeXBlKCk7CiAgIFJldHVyblZhbHVlU2xvdCByZXR1cm5TbG90OwogICBpZiAoIXJlc3VsdFR5cGUtPmlzVm9pZFR5cGUoKSAmJgogICAgICAgY2FsbGVlRm5JbmZvLmdldFJldHVybkluZm8oKS5nZXRLaW5kKCkgPT0gQUJJQXJnSW5mbzo6SW5kaXJlY3QgJiYKQEAgLTIxNjIsMTEgKzIxMzcsOSBAQAogICBDYWxsQXJncy5hZGQoUlZhbHVlOjpnZXQoVGhpc1B0ciksIFRoaXNUeXBlKTsKIAogICAvLyBBZGQgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMuCi0gIGZvciAoQmxvY2tEZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBJID0gQkQtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgRSA9IEJELT5wYXJhbV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBQYXJtVmFyRGVjbCAqcGFyYW0gPSAqSTsKKyAgZm9yIChhdXRvIHBhcmFtIDogQkQtPnBhcmFtcygpKQogICAgIEVtaXREZWxlZ2F0ZUNhbGxBcmcoQ2FsbEFyZ3MsIHBhcmFtLCBwYXJhbS0+Z2V0TG9jU3RhcnQoKSk7Ci0gIH0KKwogICBhc3NlcnQoIUxhbWJkYS0+aXNHZW5lcmljTGFtYmRhKCkgJiYgCiAgICAgICAgICAgICAiZ2VuZXJpYyBsYW1iZGEgaW50ZXJjb252ZXJzaW9uIHRvIGJsb2NrIG5vdCBpbXBsZW1lbnRlZCIpOwogICBFbWl0Rm9yd2FyZGluZ0NhbGxUb0xhbWJkYShMYW1iZGEtPmdldExhbWJkYUNhbGxPcGVyYXRvcigpLCBDYWxsQXJncyk7CkBAIC0yMTk0LDExICsyMTY3LDkgQEAKICAgQ2FsbEFyZ3MuYWRkKFJWYWx1ZTo6Z2V0KFRoaXNQdHIpLCBUaGlzVHlwZSk7CiAKICAgLy8gQWRkIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzLgotICBmb3IgKEZ1bmN0aW9uRGVjbDo6cGFyYW1fY29uc3RfaXRlcmF0b3IgSSA9IE1ELT5wYXJhbV9iZWdpbigpLAotICAgICAgIEUgPSBNRC0+cGFyYW1fZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgUGFybVZhckRlY2wgKnBhcmFtID0gKkk7Ci0gICAgRW1pdERlbGVnYXRlQ2FsbEFyZyhDYWxsQXJncywgcGFyYW0sIHBhcmFtLT5nZXRMb2NTdGFydCgpKTsKLSAgfQorICBmb3IgKGF1dG8gUGFyYW0gOiBNRC0+cGFyYW1zKCkpCisgICAgRW1pdERlbGVnYXRlQ2FsbEFyZyhDYWxsQXJncywgUGFyYW0sIFBhcmFtLT5nZXRMb2NTdGFydCgpKTsKKwogICBjb25zdCBDWFhNZXRob2REZWNsICpDYWxsT3AgPSBMYW1iZGEtPmdldExhbWJkYUNhbGxPcGVyYXRvcigpOwogICAvLyBGb3IgYSBnZW5lcmljIGxhbWJkYSwgZmluZCB0aGUgY29ycmVzcG9uZGluZyBjYWxsIG9wZXJhdG9yIHNwZWNpYWxpemF0aW9uCiAgIC8vIHRvIHdoaWNoIHRoZSBjYWxsIHRvIHRoZSBzdGF0aWMtaW52b2tlciBzaGFsbCBiZSBmb3J3YXJkZWQuCmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR0NsZWFudXAuY3BwIGIvbGliL0NvZGVHZW4vQ0dDbGVhbnVwLmNwcAppbmRleCA2NWRlNGQ0Li44NzQ4MjI0IDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0NsZWFudXAuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHQ2xlYW51cC5jcHAKQEAgLTUyOCw3ICs1MjgsNyBAQAogICBsbHZtOjpCYXNpY0Jsb2NrICp1bnJlYWNoYWJsZUJCID0gQ0dGLmdldFVucmVhY2hhYmxlQmxvY2soKTsKICAgZm9yIChsbHZtOjpCYXNpY0Jsb2NrOjp1c2VfaXRlcmF0b3IKICAgICAgICAgIGkgPSBlbnRyeS0+dXNlX2JlZ2luKCksIGUgPSBlbnRyeS0+dXNlX2VuZCgpOyBpICE9IGU7ICkgewotICAgIGxsdm06OlVzZSAmdXNlID0gaS5nZXRVc2UoKTsKKyAgICBsbHZtOjpVc2UgJnVzZSA9ICppOwogICAgICsraTsKIAogICAgIHVzZS5zZXQodW5yZWFjaGFibGVCQik7CkBAIC04NjAsNyArODYwLDkgQEAKIAogICAvLyBFbWl0IHRoZSBFSCBjbGVhbnVwIGlmIHJlcXVpcmVkLgogICBpZiAoUmVxdWlyZXNFSENsZWFudXApIHsKLSAgICBpZiAoQ0dEZWJ1Z0luZm8gKkRJID0gZ2V0RGVidWdJbmZvKCkpCisgICAgQ0dEZWJ1Z0luZm8gKkRJID0gZ2V0RGVidWdJbmZvKCk7CisgICAgU2F2ZUFuZFJlc3RvcmVMb2NhdGlvbiBBdXRvUmVzdG9yZUxvY2F0aW9uKCp0aGlzLCBCdWlsZGVyKTsKKyAgICBpZiAoREkpCiAgICAgICBESS0+RW1pdExvY2F0aW9uKEJ1aWxkZXIsIEN1ckVITG9jYXRpb24pOwogCiAgICAgQ0dCdWlsZGVyVHk6Okluc2VydFBvaW50IFNhdmVkSVAgPSBCdWlsZGVyLnNhdmVBbmRDbGVhcklQKCk7CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR0NsZWFudXAuaCBiL2xpYi9Db2RlR2VuL0NHQ2xlYW51cC5oCmluZGV4IDFiZDZiYmEuLmZlZDc1YmMgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NHQ2xlYW51cC5oCisrKyBiL2xpYi9Db2RlR2VuL0NHQ2xlYW51cC5oCkBAIC0xOTQsNiArMTk0LDE1IEBACiAgICAgcmV0dXJuIGdldEhhbmRsZXJzKClbSV07CiAgIH0KIAorICAvLyBDbGVhciBhbGwgaGFuZGxlciBibG9ja3MuCisgIC8vIEZJWE1FOiBpdCdzIGJldHRlciB0byBhbHdheXMgY2FsbCBjbGVhckhhbmRsZXJCbG9ja3MgaW4gRFRPUiBhbmQgaGF2ZSBhCisgIC8vICd0YWtlSGFuZGxlcicgb3Igc29tZSBzdWNoIGZ1bmN0aW9uIHdoaWNoIHJlbW92ZXMgb3duZXJzaGlwIGZyb20gdGhlCisgIC8vIEVIQ2F0Y2hTY29wZSBvYmplY3QgaWYgdGhlIGhhbmRsZXJzIHNob3VsZCBsaXZlIGxvbmdlciB0aGFuIEVIQ2F0Y2hTY29wZS4KKyAgdm9pZCBjbGVhckhhbmRsZXJCbG9ja3MoKSB7CisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IGdldE51bUhhbmRsZXJzKCk7IEkgIT0gTjsgKytJKQorICAgICAgZGVsZXRlIGdldEhhbmRsZXIoSSkuQmxvY2s7CisgIH0KKwogICB0eXBlZGVmIGNvbnN0IEhhbmRsZXIgKml0ZXJhdG9yOwogICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldEhhbmRsZXJzKCk7IH0KICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0SGFuZGxlcnMoKSArIGdldE51bUhhbmRsZXJzKCk7IH0KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHRGVidWdJbmZvLmNwcCBiL2xpYi9Db2RlR2VuL0NHRGVidWdJbmZvLmNwcAppbmRleCBmY2IyNmYwLi4wZTk0YjUxIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0RlYnVnSW5mby5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ0dEZWJ1Z0luZm8uY3BwCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRHdhcmYuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiDQorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiB1c2luZyBuYW1lc3BhY2UgY2xhbmc6OkNvZGVHZW47CiAKQEAgLTUyLDMwICs1MiwzNSBAQAogICAgICAgICAgIlJlZ2lvbiBzdGFjayBtaXNtYXRjaCwgc3RhY2sgbm90IGVtcHR5ISIpOwogfQogCi0KLU5vTG9jYXRpb246Ok5vTG9jYXRpb24oQ29kZUdlbkZ1bmN0aW9uICZDR0YsIENHQnVpbGRlclR5ICZCKQotICA6IERJKENHRi5nZXREZWJ1Z0luZm8oKSksIEJ1aWxkZXIoQikgeworU2F2ZUFuZFJlc3RvcmVMb2NhdGlvbjo6U2F2ZUFuZFJlc3RvcmVMb2NhdGlvbihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dCdWlsZGVyVHkgJkIpCisgICAgOiBESShDR0YuZ2V0RGVidWdJbmZvKCkpLCBCdWlsZGVyKEIpIHsKICAgaWYgKERJKSB7CiAgICAgU2F2ZWRMb2MgPSBESS0+Z2V0TG9jYXRpb24oKTsKICAgICBESS0+Q3VyTG9jID0gU291cmNlTG9jYXRpb24oKTsKLSAgICBCdWlsZGVyLlNldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKGxsdm06OkRlYnVnTG9jKCkpOwogICB9CiB9CiAKK1NhdmVBbmRSZXN0b3JlTG9jYXRpb246On5TYXZlQW5kUmVzdG9yZUxvY2F0aW9uKCkgeworICBpZiAoREkpCisgICAgREktPkVtaXRMb2NhdGlvbihCdWlsZGVyLCBTYXZlZExvYyk7Cit9CisKK05vTG9jYXRpb246Ok5vTG9jYXRpb24oQ29kZUdlbkZ1bmN0aW9uICZDR0YsIENHQnVpbGRlclR5ICZCKQorICA6IFNhdmVBbmRSZXN0b3JlTG9jYXRpb24oQ0dGLCBCKSB7CisgIGlmIChESSkKKyAgICBCdWlsZGVyLlNldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKGxsdm06OkRlYnVnTG9jKCkpOworfQorCiBOb0xvY2F0aW9uOjp+Tm9Mb2NhdGlvbigpIHsKLSAgaWYgKERJKSB7CisgIGlmIChESSkKICAgICBhc3NlcnQoQnVpbGRlci5nZXRDdXJyZW50RGVidWdMb2NhdGlvbigpLmlzVW5rbm93bigpKTsKLSAgICBESS0+Q3VyTG9jID0gU2F2ZWRMb2M7Ci0gIH0KIH0KIAogQXJ0aWZpY2lhbExvY2F0aW9uOjpBcnRpZmljaWFsTG9jYXRpb24oQ29kZUdlbkZ1bmN0aW9uICZDR0YsIENHQnVpbGRlclR5ICZCKQotICA6IERJKENHRi5nZXREZWJ1Z0luZm8oKSksIEJ1aWxkZXIoQikgewotICBpZiAoREkpIHsKLSAgICBTYXZlZExvYyA9IERJLT5nZXRMb2NhdGlvbigpOwotICAgIERJLT5DdXJMb2MgPSBTb3VyY2VMb2NhdGlvbigpOworICA6IFNhdmVBbmRSZXN0b3JlTG9jYXRpb24oQ0dGLCBCKSB7CisgIGlmIChESSkKICAgICBCdWlsZGVyLlNldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKGxsdm06OkRlYnVnTG9jKCkpOwotICB9CiB9CiAKIHZvaWQgQXJ0aWZpY2lhbExvY2F0aW9uOjpFbWl0KCkgewpAQCAtOTEsMTAgKzk2LDggQEAKIH0KIAogQXJ0aWZpY2lhbExvY2F0aW9uOjp+QXJ0aWZpY2lhbExvY2F0aW9uKCkgewotICBpZiAoREkpIHsKKyAgaWYgKERJKQogICAgIGFzc2VydChCdWlsZGVyLmdldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKCkuZ2V0TGluZSgpID09IDApOwotICAgIERJLT5DdXJMb2MgPSBTYXZlZExvYzsKLSAgfQogfQogCiB2b2lkIENHRGVidWdJbmZvOjpzZXRMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiBMb2MpIHsKQEAgLTIyNSwzNCArMjI4LDIwIEBACiAvLy8gZ2V0Q2xhc3NOYW1lIC0gR2V0IGNsYXNzIG5hbWUgaW5jbHVkaW5nIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QuCiBTdHJpbmdSZWYKIENHRGVidWdJbmZvOjpnZXRDbGFzc05hbWUoY29uc3QgUmVjb3JkRGVjbCAqUkQpIHsKLSAgY29uc3QgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqU3BlYwotICAgID0gZHluX2Nhc3Q8Q2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbD4oUkQpOwotICBpZiAoIVNwZWMpCisgIC8vIHF1aWNrIG9wdGltaXphdGlvbiB0byBhdm9pZCBoYXZpbmcgdG8gaW50ZXJuIHN0cmluZ3MgdGhhdCBhcmUgYWxyZWFkeQorICAvLyBzdG9yZWQgcmVsaWFibHkgZWxzZXdoZXJlCisgIGlmICghaXNhPENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+KFJEKSkKICAgICByZXR1cm4gUkQtPmdldE5hbWUoKTsKIAotICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmdzOwotICB1bnNpZ25lZCBOdW1BcmdzOwotICBpZiAoVHlwZVNvdXJjZUluZm8gKlRBVyA9IFNwZWMtPmdldFR5cGVBc1dyaXR0ZW4oKSkgewotICAgIGNvbnN0IFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlICpUU1QgPQotICAgICAgY2FzdDxUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZT4oVEFXLT5nZXRUeXBlKCkpOwotICAgIEFyZ3MgPSBUU1QtPmdldEFyZ3MoKTsKLSAgICBOdW1BcmdzID0gVFNULT5nZXROdW1BcmdzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY29uc3QgVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncyA9IFNwZWMtPmdldFRlbXBsYXRlQXJncygpOwotICAgIEFyZ3MgPSBUZW1wbGF0ZUFyZ3MuZGF0YSgpOwotICAgIE51bUFyZ3MgPSBUZW1wbGF0ZUFyZ3Muc2l6ZSgpOwotICB9Ci0gIFN0cmluZ1JlZiBOYW1lID0gUkQtPmdldElkZW50aWZpZXIoKS0+Z2V0TmFtZSgpOwotICBQcmludGluZ1BvbGljeSBQb2xpY3koQ0dNLmdldExhbmdPcHRzKCkpOwotICBTbWFsbFN0cmluZzwxMjg+IFRlbXBsYXRlQXJnTGlzdDsKKyAgU21hbGxTdHJpbmc8MTI4PiBOYW1lOwogICB7Ci0gICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhUZW1wbGF0ZUFyZ0xpc3QpOwotICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlOjpQcmludFRlbXBsYXRlQXJndW1lbnRMaXN0KE9TLCBBcmdzLCBOdW1BcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeSk7CisgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhOYW1lKTsKKyAgICBSRC0+Z2V0TmFtZUZvckRpYWdub3N0aWMoT1MsIENHTS5nZXRDb250ZXh0KCkuZ2V0UHJpbnRpbmdQb2xpY3koKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypRdWFsaWZpZWQqLyBmYWxzZSk7CiAgIH0KIAogICAvLyBDb3B5IHRoaXMgbmFtZSBvbiB0aGUgc2lkZSBhbmQgdXNlIGl0cyByZWZlcmVuY2UuCi0gIHJldHVybiBpbnRlcm5TdHJpbmcoTmFtZSwgVGVtcGxhdGVBcmdMaXN0KTsKKyAgcmV0dXJuIGludGVyblN0cmluZyhOYW1lKTsKIH0KIAogLy8vIGdldE9yQ3JlYXRlRmlsZSAtIEdldCB0aGUgZmlsZSBkZWJ1ZyBpbmZvIGRlc2NyaXB0b3IgZm9yIHRoZSBpbnB1dCBsb2NhdGlvbi4KQEAgLTM0Miw5ICszMzEsOSBAQAogICBpZiAoY29uc3QgRmlsZUVudHJ5ICpNYWluRmlsZSA9IFNNLmdldEZpbGVFbnRyeUZvcklEKFNNLmdldE1haW5GaWxlSUQoKSkpIHsKICAgICBNYWluRmlsZURpciA9IE1haW5GaWxlLT5nZXREaXIoKS0+Z2V0TmFtZSgpOwogICAgIGlmIChNYWluRmlsZURpciAhPSAiLiIpIHsKLSAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDEwMjQ+IE1haW5GaWxlRGlyU1MoTWFpbkZpbGVEaXIpOw0KLSAgICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKE1haW5GaWxlRGlyU1MsIE1haW5GaWxlTmFtZSk7DQotICAgICAgTWFpbkZpbGVOYW1lID0gTWFpbkZpbGVEaXJTUy5zdHIoKTsNCisgICAgICBsbHZtOjpTbWFsbFN0cmluZzwxMDI0PiBNYWluRmlsZURpclNTKE1haW5GaWxlRGlyKTsKKyAgICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKE1haW5GaWxlRGlyU1MsIE1haW5GaWxlTmFtZSk7CisgICAgICBNYWluRmlsZU5hbWUgPSBNYWluRmlsZURpclNTLnN0cigpOwogICAgIH0KICAgfQogCkBAIC0zNzksMTAgKzM2OCwxMiBAQAogCiAgIC8vIENyZWF0ZSBuZXcgY29tcGlsZSB1bml0LgogICAvLyBGSVhNRSAtIEVsaW1pbmF0ZSBUaGVDVS4KLSAgVGhlQ1UgPSBEQnVpbGRlci5jcmVhdGVDb21waWxlVW5pdChMYW5nVGFnLCBGaWxlbmFtZSwgZ2V0Q3VycmVudERpcm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWNlciwgTE8uT3B0aW1pemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dNLmdldENvZGVHZW5PcHRzKCkuRHdhcmZEZWJ1Z0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVWZXJzLCBTcGxpdER3YXJmRmlsZW5hbWUpOworICBUaGVDVSA9IERCdWlsZGVyLmNyZWF0ZUNvbXBpbGVVbml0KAorICAgICAgTGFuZ1RhZywgRmlsZW5hbWUsIGdldEN1cnJlbnREaXJuYW1lKCksIFByb2R1Y2VyLCBMTy5PcHRpbWl6ZSwKKyAgICAgIENHTS5nZXRDb2RlR2VuT3B0cygpLkR3YXJmRGVidWdGbGFncywgUnVudGltZVZlcnMsIFNwbGl0RHdhcmZGaWxlbmFtZSwKKyAgICAgIERlYnVnS2luZCA9PSBDb2RlR2VuT3B0aW9uczo6RGVidWdMaW5lVGFibGVzT25seQorICAgICAgICAgID8gbGx2bTo6RElCdWlsZGVyOjpMaW5lVGFibGVzT25seQorICAgICAgICAgIDogbGx2bTo6RElCdWlsZGVyOjpGdWxsRGVidWcpOwogfQogCiAvLy8gQ3JlYXRlVHlwZSAtIEdldCB0aGUgQmFzaWMgdHlwZSBmcm9tIHRoZSBjYWNoZSBvciBjcmVhdGUgYSBuZXcKQEAgLTczNiwxNCArNzI3LDE2IEBACiAgICAgcmV0dXJuIGxsdm06OkRJVHlwZSgpOwogICAvLyBXZSBkb24ndCBzZXQgc2l6ZSBpbmZvcm1hdGlvbiwgYnV0IGRvIHNwZWNpZnkgd2hlcmUgdGhlIHR5cGVkZWYgd2FzCiAgIC8vIGRlY2xhcmVkLgotICB1bnNpZ25lZCBMaW5lID0gZ2V0TGluZU51bWJlcihUeS0+Z2V0RGVjbCgpLT5nZXRMb2NhdGlvbigpKTsKKyAgU291cmNlTG9jYXRpb24gTG9jID0gVHktPmdldERlY2woKS0+Z2V0TG9jYXRpb24oKTsKKyAgbGx2bTo6RElGaWxlIEZpbGUgPSBnZXRPckNyZWF0ZUZpbGUoTG9jKTsKKyAgdW5zaWduZWQgTGluZSA9IGdldExpbmVOdW1iZXIoTG9jKTsKICAgY29uc3QgVHlwZWRlZk5hbWVEZWNsICpUeURlY2wgPSBUeS0+Z2V0RGVjbCgpOwogCiAgIGxsdm06OkRJRGVzY3JpcHRvciBUeXBlZGVmQ29udGV4dCA9CiAgICAgZ2V0Q29udGV4dERlc2NyaXB0b3IoY2FzdDxEZWNsPihUeS0+Z2V0RGVjbCgpLT5nZXREZWNsQ29udGV4dCgpKSk7CiAKICAgcmV0dXJuCi0gICAgREJ1aWxkZXIuY3JlYXRlVHlwZWRlZihTcmMsIFR5RGVjbC0+Z2V0TmFtZSgpLCBVbml0LCBMaW5lLCBUeXBlZGVmQ29udGV4dCk7CisgICAgREJ1aWxkZXIuY3JlYXRlVHlwZWRlZihTcmMsIFR5RGVjbC0+Z2V0TmFtZSgpLCBGaWxlLCBMaW5lLCBUeXBlZGVmQ29udGV4dCk7CiB9CiAKIGxsdm06OkRJVHlwZSBDR0RlYnVnSW5mbzo6Q3JlYXRlVHlwZShjb25zdCBGdW5jdGlvblR5cGUgKlR5LApAQCAtNzUxLDE1ICs3NDQsMTcgQEAKICAgU21hbGxWZWN0b3I8bGx2bTo6VmFsdWUgKiwgMTY+IEVsdFR5czsKIAogICAvLyBBZGQgdGhlIHJlc3VsdCB0eXBlIGF0IGxlYXN0LgotICBFbHRUeXMucHVzaF9iYWNrKGdldE9yQ3JlYXRlVHlwZShUeS0+Z2V0UmVzdWx0VHlwZSgpLCBVbml0KSk7CisgIEVsdFR5cy5wdXNoX2JhY2soZ2V0T3JDcmVhdGVUeXBlKFR5LT5nZXRSZXR1cm5UeXBlKCksIFVuaXQpKTsKIAogICAvLyBTZXQgdXAgcmVtYWluZGVyIG9mIGFyZ3VtZW50cyBpZiB0aGVyZSBpcyBhIHByb3RvdHlwZS4KLSAgLy8gRklYTUU6IElGIE5PVCwgSE9XIElTIFRISVMgUkVQUkVTRU5URUQ/ICBsbHZtLWdjYyBkb2Vzbid0IHJlcHJlc2VudCAnLi4uJyEKKyAgLy8gb3RoZXJ3aXNlIGVtaXQgaXQgYXMgYSB2YXJpYWRpYyBmdW5jdGlvbi4KICAgaWYgKGlzYTxGdW5jdGlvbk5vUHJvdG9UeXBlPihUeSkpCiAgICAgRWx0VHlzLnB1c2hfYmFjayhEQnVpbGRlci5jcmVhdGVVbnNwZWNpZmllZFBhcmFtZXRlcigpKTsKICAgZWxzZSBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihUeSkpIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRlBULT5nZXROdW1BcmdzKCk7IGkgIT0gZTsgKytpKQotICAgICAgRWx0VHlzLnB1c2hfYmFjayhnZXRPckNyZWF0ZVR5cGUoRlBULT5nZXRBcmdUeXBlKGkpLCBVbml0KSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZQVC0+Z2V0TnVtUGFyYW1zKCk7IGkgIT0gZTsgKytpKQorICAgICAgRWx0VHlzLnB1c2hfYmFjayhnZXRPckNyZWF0ZVR5cGUoRlBULT5nZXRQYXJhbVR5cGUoaSksIFVuaXQpKTsKKyAgICBpZiAoRlBULT5pc1ZhcmlhZGljKCkpCisgICAgICBFbHRUeXMucHVzaF9iYWNrKERCdWlsZGVyLmNyZWF0ZVVuc3BlY2lmaWVkUGFyYW1ldGVyKCkpOwogICB9CiAKICAgbGx2bTo6RElBcnJheSBFbHRUeXBlQXJyYXkgPSBEQnVpbGRlci5nZXRPckNyZWF0ZUFycmF5KEVsdFR5cyk7CkBAIC03ODQsNyArNzc5LDcgQEAKICAgdWludDY0X3Qgc2l6ZUluQml0cyA9IDA7CiAgIHVuc2lnbmVkIGFsaWduSW5CaXRzID0gMDsKICAgaWYgKCF0eXBlLT5pc0luY29tcGxldGVBcnJheVR5cGUoKSkgewotICAgIGxsdm06OnRpZShzaXplSW5CaXRzLCBhbGlnbkluQml0cykgPSBDR00uZ2V0Q29udGV4dCgpLmdldFR5cGVJbmZvKHR5cGUpOworICAgIHN0ZDo6dGllKHNpemVJbkJpdHMsIGFsaWduSW5CaXRzKSA9IENHTS5nZXRDb250ZXh0KCkuZ2V0VHlwZUluZm8odHlwZSk7CiAKICAgICBpZiAoc2l6ZUluQml0c092ZXJyaWRlKQogICAgICAgc2l6ZUluQml0cyA9IHNpemVJbkJpdHNPdmVycmlkZTsKQEAgLTkyNiw5ICs5MjEsOCBAQAogCiAgICAgLy8gU3RhdGljIGFuZCBub24tc3RhdGljIG1lbWJlcnMgc2hvdWxkIGFwcGVhciBpbiB0aGUgc2FtZSBvcmRlciBhcwogICAgIC8vIHRoZSBjb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9ucyBpbiB0aGUgc291cmNlIHByb2dyYW0uCi0gICAgZm9yIChSZWNvcmREZWNsOjpkZWNsX2l0ZXJhdG9yIEkgPSByZWNvcmQtPmRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgIEUgPSByZWNvcmQtPmRlY2xzX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICAgIGlmIChjb25zdCBWYXJEZWNsICpWID0gZHluX2Nhc3Q8VmFyRGVjbD4oKkkpKSB7CisgICAgZm9yIChjb25zdCBhdXRvICpJIDogcmVjb3JkLT5kZWNscygpKQorICAgICAgaWYgKGNvbnN0IGF1dG8gKlYgPSBkeW5fY2FzdDxWYXJEZWNsPihJKSkgewogICAgICAgICAvLyBSZXVzZSB0aGUgZXhpc3Rpbmcgc3RhdGljIG1lbWJlciBkZWNsYXJhdGlvbiBpZiBvbmUgZXhpc3RzCiAgICAgICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IERlY2wgKiwgbGx2bTo6V2Vha1ZIPjo6aXRlcmF0b3IgTUkgPQogICAgICAgICAgICAgU3RhdGljRGF0YU1lbWJlckNhY2hlLmZpbmQoVi0+Z2V0Q2Fub25pY2FsRGVjbCgpKTsKQEAgLTkzOSw3ICs5MzMsNyBAQAogICAgICAgICAgICAgICBsbHZtOjpESURlcml2ZWRUeXBlKGNhc3Q8bGx2bTo6TUROb2RlPihNSS0+c2Vjb25kKSkpOwogICAgICAgICB9IGVsc2UKICAgICAgICAgICBlbGVtZW50cy5wdXNoX2JhY2soQ3JlYXRlUmVjb3JkU3RhdGljRmllbGQoViwgUmVjb3JkVHkpKTsKLSAgICAgIH0gZWxzZSBpZiAoRmllbGREZWNsICpmaWVsZCA9IGR5bl9jYXN0PEZpZWxkRGVjbD4oKkkpKSB7CisgICAgICB9IGVsc2UgaWYgKGNvbnN0IGF1dG8gKmZpZWxkID0gZHluX2Nhc3Q8RmllbGREZWNsPihJKSkgewogICAgICAgICBDb2xsZWN0UmVjb3JkTm9ybWFsRmllbGQoZmllbGQsIGxheW91dC5nZXRGaWVsZE9mZnNldChmaWVsZE5vKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1bml0LCBlbGVtZW50cywgUmVjb3JkVHkpOwogCkBAIC0xMDA1LDcgKzk5OSwxMyBAQAogCiAgIGxsdm06OkRJQXJyYXkgRWx0VHlwZUFycmF5ID0gREJ1aWxkZXIuZ2V0T3JDcmVhdGVBcnJheShFbHRzKTsKIAotICByZXR1cm4gREJ1aWxkZXIuY3JlYXRlU3Vicm91dGluZVR5cGUoVW5pdCwgRWx0VHlwZUFycmF5KTsKKyAgdW5zaWduZWQgRmxhZ3MgPSAwOworICBpZiAoRnVuYy0+Z2V0RXh0UHJvdG9JbmZvKCkuUmVmUXVhbGlmaWVyID09IFJRX0xWYWx1ZSkKKyAgICBGbGFncyB8PSBsbHZtOjpESURlc2NyaXB0b3I6OkZsYWdMVmFsdWVSZWZlcmVuY2U7CisgIGlmIChGdW5jLT5nZXRFeHRQcm90b0luZm8oKS5SZWZRdWFsaWZpZXIgPT0gUlFfUlZhbHVlKQorICAgIEZsYWdzIHw9IGxsdm06OkRJRGVzY3JpcHRvcjo6RmxhZ1JWYWx1ZVJlZmVyZW5jZTsKKworICByZXR1cm4gREJ1aWxkZXIuY3JlYXRlU3Vicm91dGluZVR5cGUoVW5pdCwgRWx0VHlwZUFycmF5LCBGbGFncyk7CiB9CiAKIC8vLyBpc0Z1bmN0aW9uTG9jYWxDbGFzcyAtIFJldHVybiB0cnVlIGlmIENYWFJlY29yZERlY2wgaXMgZGVmaW5lZApAQCAtMTA4NCw2ICsxMDg0LDEwIEBACiAgIH0KICAgaWYgKE1ldGhvZC0+aGFzUHJvdG90eXBlKCkpCiAgICAgRmxhZ3MgfD0gbGx2bTo6RElEZXNjcmlwdG9yOjpGbGFnUHJvdG90eXBlZDsKKyAgaWYgKE1ldGhvZC0+Z2V0UmVmUXVhbGlmaWVyKCkgPT0gUlFfTFZhbHVlKQorICAgIEZsYWdzIHw9IGxsdm06OkRJRGVzY3JpcHRvcjo6RmxhZ0xWYWx1ZVJlZmVyZW5jZTsKKyAgaWYgKE1ldGhvZC0+Z2V0UmVmUXVhbGlmaWVyKCkgPT0gUlFfUlZhbHVlKQorICAgIEZsYWdzIHw9IGxsdm06OkRJRGVzY3JpcHRvcjo6RmxhZ1JWYWx1ZVJlZmVyZW5jZTsKIAogICBsbHZtOjpESUFycmF5IFRQYXJhbXNBcnJheSA9IENvbGxlY3RGdW5jdGlvblRlbXBsYXRlUGFyYW1zKE1ldGhvZCwgVW5pdCk7CiAgIGxsdm06OkRJU3VicHJvZ3JhbSBTUCA9CkBAIC0xMTExLDkgKzExMTUsOCBAQAogICAvLyBTaW5jZSB3ZSB3YW50IG1vcmUgdGhhbiBqdXN0IHRoZSBpbmRpdmlkdWFsIG1lbWJlciBkZWNscyBpZiB3ZQogICAvLyBoYXZlIHRlbXBsYXRlZCBmdW5jdGlvbnMgaXRlcmF0ZSBvdmVyIGV2ZXJ5IGRlY2xhcmF0aW9uIHRvIGdhdGhlcgogICAvLyB0aGUgZnVuY3Rpb25zLgotICBmb3IoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgSSA9IFJELT5kZWNsc19iZWdpbigpLAotICAgICAgICBFID0gUkQtPmRlY2xzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGlmIChjb25zdCBDWFhNZXRob2REZWNsICpNZXRob2QgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPigqSSkpIHsKKyAgZm9yKGNvbnN0IGF1dG8gKkkgOiBSRC0+ZGVjbHMoKSkgeworICAgIGlmIChjb25zdCBhdXRvICpNZXRob2QgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPihJKSkgewogICAgICAgLy8gUmV1c2UgdGhlIGV4aXN0aW5nIG1lbWJlciBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpZiBpdCBleGlzdHMuCiAgICAgICAvLyBJdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgdHlwZSAmIHNob3VsZCBiZQogICAgICAgLy8gcmV1c2VkIGFzIHdlJ3JlIGJ1aWxkaW5nIHRoZSBkZWZpbml0aW9uLgpAQCAtMTEzMCwxNiArMTEzMywxMyBAQAogICAgICAgICAgIEVsdFR5cy5wdXNoX2JhY2soQ3JlYXRlQ1hYTWVtYmVyRnVuY3Rpb24oTWV0aG9kLCBVbml0LCBSZWNvcmRUeSkpOwogICAgICAgfSBlbHNlCiAgICAgICAgIEVsdFR5cy5wdXNoX2JhY2soTUktPnNlY29uZCk7Ci0gICAgfSBlbHNlIGlmIChjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRlREID0KLSAgICAgICAgICAgICAgICAgICBkeW5fY2FzdDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oKkkpKSB7CisgICAgfSBlbHNlIGlmIChjb25zdCBhdXRvICpGVEQgPSBkeW5fY2FzdDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oSSkpIHsKICAgICAgIC8vIEFkZCBhbnkgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gTGlrZQogICAgICAgLy8gaW1wbGljaXQgbWVtYmVyIGZ1bmN0aW9ucywgdGhlc2UgbWF5IGhhdmUgYmVlbiBhZGRlZCB0byBhIGRlY2xhcmF0aW9uCiAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiB2dGFibGUtYmFzZWQgZGVidWcgaW5mbyByZWR1Y3Rpb24uCi0gICAgICBmb3IgKEZ1bmN0aW9uVGVtcGxhdGVEZWNsOjpzcGVjX2l0ZXJhdG9yIFNJID0gRlRELT5zcGVjX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFID0gRlRELT5zcGVjX2VuZCgpOwotICAgICAgICAgICBTSSAhPSBTRTsgKytTSSkgeworICAgICAgZm9yIChjb25zdCBhdXRvICpTSSA6IEZURC0+c3BlY2lhbGl6YXRpb25zKCkpIHsKICAgICAgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRnVuY3Rpb25EZWNsICosIGxsdm06OldlYWtWSD46Oml0ZXJhdG9yIE1JID0KLSAgICAgICAgICAgIFNQQ2FjaGUuZmluZChjYXN0PENYWE1ldGhvZERlY2w+KCpTSSktPmdldENhbm9uaWNhbERlY2woKSk7CisgICAgICAgICAgICBTUENhY2hlLmZpbmQoY2FzdDxDWFhNZXRob2REZWNsPihTSSktPmdldENhbm9uaWNhbERlY2woKSk7CiAgICAgICAgIGlmIChNSSAhPSBTUENhY2hlLmVuZCgpKQogICAgICAgICAgIEVsdFR5cy5wdXNoX2JhY2soTUktPnNlY29uZCk7CiAgICAgICB9CkBAIC0xMTU2LDE1ICsxMTU2LDE0IEBACiAgICAgICAgICAgICAgICAgbGx2bTo6RElUeXBlIFJlY29yZFR5KSB7CiAKICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZSTCA9IENHTS5nZXRDb250ZXh0KCkuZ2V0QVNUUmVjb3JkTGF5b3V0KFJEKTsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEJJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICBCRSA9IFJELT5iYXNlc19lbmQoKTsgQkkgIT0gQkU7ICsrQkkpIHsKKyAgZm9yIChjb25zdCBhdXRvICZCSSA6IFJELT5iYXNlcygpKSB7CiAgICAgdW5zaWduZWQgQkZsYWdzID0gMDsKICAgICB1aW50NjRfdCBCYXNlT2Zmc2V0OwogCiAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZSA9Ci0gICAgICBjYXN0PENYWFJlY29yZERlY2w+KEJJLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICBjYXN0PENYWFJlY29yZERlY2w+KEJJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKIAotICAgIGlmIChCSS0+aXNWaXJ0dWFsKCkpIHsKKyAgICBpZiAoQkkuaXNWaXJ0dWFsKCkpIHsKICAgICAgIC8vIHZpcnR1YWwgYmFzZSBvZmZzZXQgb2Zmc2V0IGlzIC12ZS4gVGhlIGNvZGUgZ2VuZXJhdG9yIGVtaXRzIGR3YXJmCiAgICAgICAvLyBleHByZXNzaW9uIHdoZXJlIGl0IGV4cGVjdHMgK3ZlIG51bWJlci4KICAgICAgIEJhc2VPZmZzZXQgPQpAQCAtMTE3Niw3ICsxMTc1LDcgQEAKICAgICAvLyBGSVhNRTogSW5jb25zaXN0ZW50IHVuaXRzIGZvciBCYXNlT2Zmc2V0LiBJdCBpcyBpbiBieXRlcyB3aGVuCiAgICAgLy8gQkktPmlzVmlydHVhbCgpIGFuZCBiaXRzIHdoZW4gbm90LgogCi0gICAgQWNjZXNzU3BlY2lmaWVyIEFjY2VzcyA9IEJJLT5nZXRBY2Nlc3NTcGVjaWZpZXIoKTsKKyAgICBBY2Nlc3NTcGVjaWZpZXIgQWNjZXNzID0gQkkuZ2V0QWNjZXNzU3BlY2lmaWVyKCk7CiAgICAgaWYgKEFjY2VzcyA9PSBjbGFuZzo6QVNfcHJpdmF0ZSkKICAgICAgIEJGbGFncyB8PSBsbHZtOjpESURlc2NyaXB0b3I6OkZsYWdQcml2YXRlOwogICAgIGVsc2UgaWYgKEFjY2VzcyA9PSBjbGFuZzo6QVNfcHJvdGVjdGVkKQpAQCAtMTE4NCw3ICsxMTgzLDcgQEAKIAogICAgIGxsdm06OkRJVHlwZSBEVHkgPQogICAgICAgREJ1aWxkZXIuY3JlYXRlSW5oZXJpdGFuY2UoUmVjb3JkVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPckNyZWF0ZVR5cGUoQkktPmdldFR5cGUoKSwgVW5pdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPckNyZWF0ZVR5cGUoQkkuZ2V0VHlwZSgpLCBVbml0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VPZmZzZXQsIEJGbGFncyk7CiAgICAgRWx0VHlzLnB1c2hfYmFjayhEVHkpOwogICB9CkBAIC0xMjM5LDcgKzEyMzgsNyBAQAogICAgICAgICBWID0gQ0dNLkdldEFkZHJPZkZ1bmN0aW9uKEZEKTsKICAgICAgIC8vIE1lbWJlciBkYXRhIHBvaW50ZXJzIGhhdmUgc3BlY2lhbCBoYW5kbGluZyB0b28gdG8gY29tcHV0ZSB0aGUgZml4ZWQKICAgICAgIC8vIG9mZnNldCB3aXRoaW4gdGhlIG9iamVjdC4KLSAgICAgIGlmIChpc2E8RmllbGREZWNsPihEKSkgeworICAgICAgaWYgKGlzYTxGaWVsZERlY2w+KEQpIHx8IGlzYTxJbmRpcmVjdEZpZWxkRGVjbD4oRCkpIHsKICAgICAgICAgLy8gVGhlc2UgZml2ZSBsaW5lcyAoJiBwb3NzaWJseSB0aGUgYWJvdmUgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIKICAgICAgICAgLy8gaGFuZGxpbmcpIG1pZ2h0IGJlIGFibGUgdG8gYmUgcmVmYWN0b3JlZCB0byB1c2Ugc2ltaWxhciBjb2RlIGluCiAgICAgICAgIC8vIENvZGVHZW5Nb2R1bGU6OmdldE1lbWJlclBvaW50ZXJDb25zdGFudApAQCAtMTQxNiw2ICsxNDE1LDkgQEAKIH0KIAogdm9pZCBDR0RlYnVnSW5mbzo6Y29tcGxldGVSZXF1aXJlZFR5cGUoY29uc3QgUmVjb3JkRGVjbCAqUkQpIHsKKyAgaWYgKERlYnVnS2luZCA8PSBDb2RlR2VuT3B0aW9uczo6RGVidWdMaW5lVGFibGVzT25seSkKKyAgICByZXR1cm47CisKICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKkNYWERlY2wgPSBkeW5fY2FzdDxDWFhSZWNvcmREZWNsPihSRCkpCiAgICAgaWYgKENYWERlY2wtPmlzRHluYW1pY0NsYXNzKCkpCiAgICAgICByZXR1cm47CkBAIC0xNDM5LDMyICsxNDQxLDU3IEBACiAgIFR5cGVDYWNoZVtUeVB0cl0gPSBSZXM7CiB9CiAKK3N0YXRpYyBib29sIGhhc0V4cGxpY2l0TWVtYmVyRGVmaW5pdGlvbihDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IgRW5kKSB7CisgIGZvciAoOyBJICE9IEVuZDsgKytJKQorICAgIGlmIChGdW5jdGlvbkRlY2wgKlRtcGwgPSBJLT5nZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyRnVuY3Rpb24oKSkKKyAgICAgIGlmICghVG1wbC0+aXNJbXBsaWNpdCgpICYmIFRtcGwtPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSAmJgorICAgICAgICAgICFJLT5nZXRNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8oKS0+aXNFeHBsaWNpdFNwZWNpYWxpemF0aW9uKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZE9taXREZWZpbml0aW9uKENvZGVHZW5PcHRpb25zOjpEZWJ1Z0luZm9LaW5kIERlYnVnS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlY29yZERlY2wgKlJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7CisgIGlmIChEZWJ1Z0tpbmQgPiBDb2RlR2VuT3B0aW9uczo6TGltaXRlZERlYnVnSW5mbykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFMYW5nT3B0cy5DUGx1c1BsdXMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghUkQtPmlzQ29tcGxldGVEZWZpbml0aW9uUmVxdWlyZWQoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBjb25zdCBDWFhSZWNvcmREZWNsICpDWFhEZWNsID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4oUkQpOworCisgIGlmICghQ1hYRGVjbCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKENYWERlY2wtPmhhc0RlZmluaXRpb24oKSAmJiBDWFhEZWNsLT5pc0R5bmFtaWNDbGFzcygpKQorICAgIHJldHVybiB0cnVlOworCisgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kIFNwZWMgPSBUU0tfVW5kZWNsYXJlZDsKKyAgaWYgKGNvbnN0IENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKlNEID0KKyAgICAgICAgICBkeW5fY2FzdDxDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsPihSRCkpCisgICAgU3BlYyA9IFNELT5nZXRTcGVjaWFsaXphdGlvbktpbmQoKTsKKworICBpZiAoU3BlYyA9PSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVjbGFyYXRpb24gJiYKKyAgICAgIGhhc0V4cGxpY2l0TWVtYmVyRGVmaW5pdGlvbihDWFhEZWNsLT5tZXRob2RfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhEZWNsLT5tZXRob2RfZW5kKCkpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKwogLy8vIENyZWF0ZVR5cGUgLSBnZXQgc3RydWN0dXJlIG9yIHVuaW9uIHR5cGUuCiBsbHZtOjpESVR5cGUgQ0dEZWJ1Z0luZm86OkNyZWF0ZVR5cGUoY29uc3QgUmVjb3JkVHlwZSAqVHkpIHsKICAgUmVjb3JkRGVjbCAqUkQgPSBUeS0+Z2V0RGVjbCgpOwotICBjb25zdCBDWFhSZWNvcmREZWNsICpDWFhEZWNsID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4oUkQpOwotICAvLyBBbHdheXMgZW1pdCBkZWNsYXJhdGlvbnMgZm9yIHR5cGVzIHRoYXQgYXJlbid0IHJlcXVpcmVkIHRvIGJlIGNvbXBsZXRlIHdoZW4KLSAgLy8gaW4gbGltaXQtZGVidWctaW5mbyBtb2RlLiBJZiB0aGUgdHlwZSBpcyBsYXRlciBmb3VuZCB0byBiZSByZXF1aXJlZCB0byBiZQotICAvLyBjb21wbGV0ZSB0aGlzIGRlY2xhcmF0aW9uIHdpbGwgYmUgdXBncmFkZWQgdG8gYSBkZWZpbml0aW9uIGJ5Ci0gIC8vIGBjb21wbGV0ZVJlcXVpcmVkVHlwZWAuCi0gIC8vIElmIHRoZSB0eXBlIGlzIGR5bmFtaWMsIG9ubHkgZW1pdCB0aGUgZGVmaW5pdGlvbiBpbiBUVXMgdGhhdCByZXF1aXJlIGNsYXNzCi0gIC8vIGRhdGEuIFRoaXMgaXMgaGFuZGxlZCBieSBgY29tcGxldGVDbGFzc0RhdGFgLgogICBsbHZtOjpESUNvbXBvc2l0ZVR5cGUgVChnZXRUeXBlT3JOdWxsKFF1YWxUeXBlKFR5LCAwKSkpOwotICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGVtaXR0ZWQgdGhlIHR5cGUsIGp1c3QgdXNlIHRoYXQsIGV2ZW4gaWYgaXQncyBvbmx5IGEKLSAgLy8gZGVjbGFyYXRpb24uIFRoZSBjb21wbGV0ZVR5cGUsIGNvbXBsZXRlUmVxdWlyZWRUeXBlLCBhbmQgY29tcGxldGVDbGFzc0RhdGEKLSAgLy8gY2FsbGJhY2tzIHdpbGwgaGFuZGxlIHByb21vdGluZyB0aGUgZGVjbGFyYXRpb24gdG8gYSBkZWZpbml0aW9uLgotICBpZiAoVCB8fAotICAgICAgKERlYnVnS2luZCA8PSBDb2RlR2VuT3B0aW9uczo6TGltaXRlZERlYnVnSW5mbyAmJgotICAgICAgIC8vIFVuZGVyIC1mbGltaXQtZGVidWctaW5mbywgZW1pdCBvbmx5IGEgZGVjbGFyYXRpb24gdW5sZXNzIHRoZSB0eXBlIGlzCi0gICAgICAgLy8gcmVxdWlyZWQgdG8gYmUgY29tcGxldGUuCi0gICAgICAgIVJELT5pc0NvbXBsZXRlRGVmaW5pdGlvblJlcXVpcmVkKCkgJiYgQ0dNLmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKSB8fAotICAgICAgLy8gSWYgdGhlIGNsYXNzIGlzIGR5bmFtaWMsIG9ubHkgZW1pdCBhIGRlY2xhcmF0aW9uLiBBIGRlZmluaXRpb24gd2lsbCBiZQotICAgICAgLy8gZW1pdHRlZCB3aGVuZXZlciB0aGUgdnRhYmxlIGlzIGVtaXR0ZWQuCi0gICAgICAoQ1hYRGVjbCAmJiBDWFhEZWNsLT5oYXNEZWZpbml0aW9uKCkgJiYgQ1hYRGVjbC0+aXNEeW5hbWljQ2xhc3MoKSkgfHwgVCkgewotICAgIGxsdm06OkRJRGVzY3JpcHRvciBGRENvbnRleHQgPQotICAgICAgZ2V0Q29udGV4dERlc2NyaXB0b3IoY2FzdDxEZWNsPihSRC0+Z2V0RGVjbENvbnRleHQoKSkpOworICBpZiAoVCB8fCBzaG91bGRPbWl0RGVmaW5pdGlvbihEZWJ1Z0tpbmQsIFJELCBDR00uZ2V0TGFuZ09wdHMoKSkpIHsKICAgICBpZiAoIVQpCi0gICAgICBUID0gZ2V0T3JDcmVhdGVSZWNvcmRGd2REZWNsKFR5LCBGRENvbnRleHQpOworICAgICAgVCA9IGdldE9yQ3JlYXRlUmVjb3JkRndkRGVjbCgKKyAgICAgICAgICBUeSwgZ2V0Q29udGV4dERlc2NyaXB0b3IoY2FzdDxEZWNsPihSRC0+Z2V0RGVjbENvbnRleHQoKSkpKTsKICAgICByZXR1cm4gVDsKICAgfQogCkBAIC0xNjI1LDkgKzE2NTIsNyBAQAogICB9CiAKICAgLy8gQ3JlYXRlIGVudHJpZXMgZm9yIGFsbCBvZiB0aGUgcHJvcGVydGllcy4KLSAgZm9yIChPYmpDQ29udGFpbmVyRGVjbDo6cHJvcF9pdGVyYXRvciBJID0gSUQtPnByb3BfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBJRC0+cHJvcF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICpQRCA9ICpJOworICBmb3IgKGNvbnN0IGF1dG8gKlBEIDogSUQtPnByb3BlcnRpZXMoKSkgewogICAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IFBELT5nZXRMb2NhdGlvbigpOwogICAgIGxsdm06OkRJRmlsZSBQVW5pdCA9IGdldE9yQ3JlYXRlRmlsZShMb2MpOwogICAgIHVuc2lnbmVkIFBMaW5lID0gZ2V0TGluZU51bWJlcihMb2MpOwpAQCAtMTgyOSwxMSArMTg1NCwxMyBAQAogICBpZiAoIVR5LT5nZXRQb2ludGVlVHlwZSgpLT5pc0Z1bmN0aW9uVHlwZSgpKQogICAgIHJldHVybiBEQnVpbGRlci5jcmVhdGVNZW1iZXJQb2ludGVyVHlwZSgKICAgICAgICAgZ2V0T3JDcmVhdGVUeXBlKFR5LT5nZXRQb2ludGVlVHlwZSgpLCBVKSwgQ2xhc3NUeXBlKTsKKworICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0KKyAgICBUeS0+Z2V0UG9pbnRlZVR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CiAgIHJldHVybiBEQnVpbGRlci5jcmVhdGVNZW1iZXJQb2ludGVyVHlwZShnZXRPckNyZWF0ZUluc3RhbmNlTWV0aG9kVHlwZSgKLSAgICAgIENHTS5nZXRDb250ZXh0KCkuZ2V0UG9pbnRlclR5cGUoCi0gICAgICAgICAgUXVhbFR5cGUoVHktPmdldENsYXNzKCksIFR5LT5nZXRQb2ludGVlVHlwZSgpLmdldENWUlF1YWxpZmllcnMoKSkpLAotICAgICAgVHktPmdldFBvaW50ZWVUeXBlKCktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpLCBVKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVHlwZSk7CisgICAgICBDR00uZ2V0Q29udGV4dCgpLmdldFBvaW50ZXJUeXBlKFF1YWxUeXBlKFR5LT5nZXRDbGFzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFQtPmdldFR5cGVRdWFscygpKSksCisgICAgICBGUFQsIFUpLCBDbGFzc1R5cGUpOwogfQogCiBsbHZtOjpESVR5cGUgQ0dEZWJ1Z0luZm86OkNyZWF0ZVR5cGUoY29uc3QgQXRvbWljVHlwZSAqVHksCkBAIC0xODcxLDkgKzE4OTgsNyBAQAogICAvLyBDcmVhdGUgRElFbnVtZXJhdG9yIGVsZW1lbnRzIGZvciBlYWNoIGVudW1lcmF0b3IuCiAgIFNtYWxsVmVjdG9yPGxsdm06OlZhbHVlICosIDE2PiBFbnVtZXJhdG9yczsKICAgRUQgPSBFRC0+Z2V0RGVmaW5pdGlvbigpOwotICBmb3IgKEVudW1EZWNsOjplbnVtZXJhdG9yX2l0ZXJhdG9yCi0gICAgICAgICBFbnVtID0gRUQtPmVudW1lcmF0b3JfYmVnaW4oKSwgRW51bUVuZCA9IEVELT5lbnVtZXJhdG9yX2VuZCgpOwotICAgICAgIEVudW0gIT0gRW51bUVuZDsgKytFbnVtKSB7CisgIGZvciAoY29uc3QgYXV0byAqRW51bSA6IEVELT5lbnVtZXJhdG9ycygpKSB7CiAgICAgRW51bWVyYXRvcnMucHVzaF9iYWNrKAogICAgICAgREJ1aWxkZXIuY3JlYXRlRW51bWVyYXRvcihFbnVtLT5nZXROYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW0tPmdldEluaXRWYWwoKS5nZXRTRXh0VmFsdWUoKSkpOwpAQCAtMTk5NCw2ICsyMDE5LDE3IEBACiAgIHJldHVybiBsbHZtOjpESVR5cGUoY2FzdF9vcl9udWxsPGxsdm06Ok1ETm9kZT4oVikpOwogfQogCit2b2lkIENHRGVidWdJbmZvOjpjb21wbGV0ZVRlbXBsYXRlRGVmaW5pdGlvbigKKyAgICBjb25zdCBDbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICZTRCkgeworICBpZiAoRGVidWdLaW5kIDw9IENvZGVHZW5PcHRpb25zOjpEZWJ1Z0xpbmVUYWJsZXNPbmx5KQorICAgIHJldHVybjsKKworICBjb21wbGV0ZUNsYXNzRGF0YSgmU0QpOworICAvLyBJbiBjYXNlIHRoaXMgdHlwZSBoYXMgbm8gbWVtYmVyIGZ1bmN0aW9uIGRlZmluaXRpb25zIGJlaW5nIGVtaXR0ZWQsIGVuc3VyZQorICAvLyBpdCBpcyByZXRhaW5lZAorICBSZXRhaW5lZFR5cGVzLnB1c2hfYmFjayhDR00uZ2V0Q29udGV4dCgpLmdldFJlY29yZFR5cGUoJlNEKS5nZXRBc09wYXF1ZVB0cigpKTsKK30KKwogLy8vIGdldENhY2hlZEludGVyZmFjZVR5cGVPck51bGwgLSBHZXQgdGhlIHR5cGUgZnJvbSB0aGUgaW50ZXJmYWNlCiAvLy8gY2FjaGUsIHVubGVzcyBpdCBuZWVkcyB0byByZWdlbmVyYXRlZC4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgogbGx2bTo6VmFsdWUgKkNHRGVidWdJbmZvOjpnZXRDYWNoZWRJbnRlcmZhY2VUeXBlT3JOdWxsKFF1YWxUeXBlIFR5KSB7CkBAIC0yMTIzLDEwICsyMTU5LDExIEBACiAgICAgcmV0dXJuIENyZWF0ZVR5cGUoY2FzdDxDb21wbGV4VHlwZT4oVHkpKTsKICAgY2FzZSBUeXBlOjpQb2ludGVyOgogICAgIHJldHVybiBDcmVhdGVUeXBlKGNhc3Q8UG9pbnRlclR5cGU+KFR5KSwgVW5pdCk7CisgIGNhc2UgVHlwZTo6QWRqdXN0ZWQ6CiAgIGNhc2UgVHlwZTo6RGVjYXllZDoKLSAgICAvLyBEZWNheWVkIHR5cGVzIGFyZSBqdXN0IHBvaW50ZXJzIGluIExMVk0gYW5kIERXQVJGLgorICAgIC8vIERlY2F5ZWQgYW5kIGFkanVzdGVkIHR5cGVzIHVzZSB0aGUgYWRqdXN0ZWQgdHlwZSBpbiBMTFZNIGFuZCBEV0FSRi4KICAgICByZXR1cm4gQ3JlYXRlVHlwZSgKLSAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oY2FzdDxEZWNheWVkVHlwZT4oVHkpLT5nZXREZWNheWVkVHlwZSgpKSwgVW5pdCk7CisgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KGNhc3Q8QWRqdXN0ZWRUeXBlPihUeSktPmdldEFkanVzdGVkVHlwZSgpKSwgVW5pdCk7CiAgIGNhc2UgVHlwZTo6QmxvY2tQb2ludGVyOgogICAgIHJldHVybiBDcmVhdGVUeXBlKGNhc3Q8QmxvY2tQb2ludGVyVHlwZT4oVHkpLCBVbml0KTsKICAgY2FzZSBUeXBlOjpUeXBlZGVmOgpAQCAtMjIzMyw5ICsyMjcwLDEwIEBACiAgIGlmIChUICYmICghVC5pc0ZvcndhcmREZWNsKCkgfHwgIVJELT5nZXREZWZpbml0aW9uKCkpKQogICAgICAgcmV0dXJuIFQ7CiAKLSAgLy8gSWYgdGhpcyBpcyBqdXN0IGEgZm9yd2FyZCBkZWNsYXJhdGlvbiwgY29uc3RydWN0IGFuIGFwcHJvcHJpYXRlbHkKLSAgLy8gbWFya2VkIG5vZGUgYW5kIGp1c3QgcmV0dXJuIGl0LgotICBpZiAoIVJELT5nZXREZWZpbml0aW9uKCkpCisgIC8vIElmIHRoaXMgaXMganVzdCBhIGZvcndhcmQgb3IgaW5jb21wbGV0ZSBkZWNsYXJhdGlvbiwgY29uc3RydWN0IGFuCisgIC8vIGFwcHJvcHJpYXRlbHkgbWFya2VkIG5vZGUgYW5kIGp1c3QgcmV0dXJuIGl0LgorICBjb25zdCBSZWNvcmREZWNsICpEID0gUkQtPmdldERlZmluaXRpb24oKTsKKyAgaWYgKCFEIHx8ICFELT5pc0NvbXBsZXRlRGVmaW5pdGlvbigpKQogICAgIHJldHVybiBnZXRPckNyZWF0ZVJlY29yZEZ3ZERlY2woVHksIFJEQ29udGV4dCk7CiAKICAgdWludDY0X3QgU2l6ZSA9IENHTS5nZXRDb250ZXh0KCkuZ2V0VHlwZVNpemUoVHkpOwpAQCAtMjI3Nyw3ICsyMzE1LDcgQEAKICAgbGx2bTo6RElDb21wb3NpdGVUeXBlIENvbnRhaW5pbmdUeXBlOwogICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJlJMID0gQ0dNLmdldENvbnRleHQoKS5nZXRBU1RSZWNvcmRMYXlvdXQoUkQpOwogICBpZiAoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUEJhc2UgPSBSTC5nZXRQcmltYXJ5QmFzZSgpKSB7Ci0gICAgLy8gU2VlayBub24gdmlydHVhbCBwcmltYXJ5IGJhc2Ugcm9vdC4KKyAgICAvLyBTZWVrIG5vbi12aXJ0dWFsIHByaW1hcnkgYmFzZSByb290LgogICAgIHdoaWxlICgxKSB7CiAgICAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkJSTCA9IENHTS5nZXRDb250ZXh0KCkuZ2V0QVNUUmVjb3JkTGF5b3V0KFBCYXNlKTsKICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlBCVCA9IEJSTC5nZXRQcmltYXJ5QmFzZSgpOwpAQCAtMjMwOSw3ICsyMzQ3LDcgQEAKICAgcmV0dXJuIFR5OwogfQogCi1sbHZtOjpESURlc2NyaXB0b3IgQ0dEZWJ1Z0luZm86OmdldERlY2xhcmF0aW9uT3JEZWZpbml0aW9uKGNvbnN0IERlY2wgKkQpIHsKK2xsdm06OkRJU2NvcGUgQ0dEZWJ1Z0luZm86OmdldERlY2xhcmF0aW9uT3JEZWZpbml0aW9uKGNvbnN0IERlY2wgKkQpIHsKICAgLy8gV2Ugb25seSBuZWVkIGEgZGVjbGFyYXRpb24gKG5vdCBhIGRlZmluaXRpb24pIG9mIHRoZSB0eXBlIC0gc28gdXNlIHdoYXRldmVyCiAgIC8vIHdlIHdvdWxkIG90aGVyd2lzZSBkbyB0byBnZXQgYSB0eXBlIGZvciBhIHBvaW50ZWUuIChmb3J3YXJkIGRlY2xhcmF0aW9ucyBpbgogICAvLyBsaW1pdGVkIGRlYnVnIGluZm8sIGZ1bGwgZGVmaW5pdGlvbnMgKGlmIHRoZSB0eXBlIGRlZmluaXRpb24gaXMgYXZhaWxhYmxlKQpAQCAtMjMyNyw5ICsyMzY1LDkgQEAKICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRGVjbCAqLCBsbHZtOjpXZWFrVkg+OjppdGVyYXRvciBJID0KICAgICAgIERlY2xDYWNoZS5maW5kKEQtPmdldENhbm9uaWNhbERlY2woKSk7CiAgIGlmIChJID09IERlY2xDYWNoZS5lbmQoKSkKLSAgICByZXR1cm4gbGx2bTo6RElEZXNjcmlwdG9yKCk7CisgICAgcmV0dXJuIGxsdm06OkRJU2NvcGUoKTsKICAgbGx2bTo6VmFsdWUgKlYgPSBJLT5zZWNvbmQ7Ci0gIHJldHVybiBsbHZtOjpESURlc2NyaXB0b3IoZHluX2Nhc3Rfb3JfbnVsbDxsbHZtOjpNRE5vZGU+KFYpKTsKKyAgcmV0dXJuIGxsdm06OkRJU2NvcGUoZHluX2Nhc3Rfb3JfbnVsbDxsbHZtOjpNRE5vZGU+KFYpKTsKIH0KIAogLy8vIGdldEZ1bmN0aW9uRGVjbGFyYXRpb24gLSBSZXR1cm4gZGVidWcgaW5mbyBkZXNjcmlwdG9yIHRvIGRlc2NyaWJlIG1ldGhvZApAQCAtMjM1Miw3ICsyMzkwLDYgQEAKICAgICAgIGxsdm06OkRJQ29tcG9zaXRlVHlwZSBUKFMpOwogICAgICAgbGx2bTo6RElTdWJwcm9ncmFtIFNQID0KICAgICAgICAgICBDcmVhdGVDWFhNZW1iZXJGdW5jdGlvbihNRCwgZ2V0T3JDcmVhdGVGaWxlKE1ELT5nZXRMb2NhdGlvbigpKSwgVCk7Ci0gICAgICBULmFkZE1lbWJlcihTUCk7CiAgICAgICByZXR1cm4gU1A7CiAgICAgfQogICB9CkBAIC0yMzYzLDkgKzI0MDAsNyBAQAogICAgICAgcmV0dXJuIFNQOwogICB9CiAKLSAgZm9yIChGdW5jdGlvbkRlY2w6OnJlZGVjbF9pdGVyYXRvciBJID0gRkQtPnJlZGVjbHNfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBGRC0+cmVkZWNsc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBGdW5jdGlvbkRlY2wgKk5leHRGRCA9ICpJOworICBmb3IgKGF1dG8gTmV4dEZEIDogRkQtPnJlZGVjbHMoKSkgewogICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZ1bmN0aW9uRGVjbCAqLCBsbHZtOjpXZWFrVkg+OjppdGVyYXRvcgogICAgICAgTUkgPSBTUENhY2hlLmZpbmQoTmV4dEZELT5nZXRDYW5vbmljYWxEZWNsKCkpOwogICAgIGlmIChNSSAhPSBTUENhY2hlLmVuZCgpKSB7CkBAIC0yMzk3LDcgKzI0MzIsNyBAQAogICAgIFNtYWxsVmVjdG9yPGxsdm06OlZhbHVlICosIDE2PiBFbHRzOwogCiAgICAgLy8gRmlyc3QgZWxlbWVudCBpcyBhbHdheXMgcmV0dXJuIHR5cGUuIEZvciAndm9pZCcgZnVuY3Rpb25zIGl0IGlzIE5VTEwuCi0gICAgUXVhbFR5cGUgUmVzdWx0VHkgPSBPTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgUXVhbFR5cGUgUmVzdWx0VHkgPSBPTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCk7CiAKICAgICAvLyBSZXBsYWNlIHRoZSBpbnN0YW5jZXR5cGUga2V5d29yZCB3aXRoIHRoZSBhY3R1YWwgdHlwZS4KICAgICBpZiAoUmVzdWx0VHkgPT0gQ0dNLmdldENvbnRleHQoKS5nZXRPYmpDSW5zdGFuY2VUeXBlKCkpCkBAIC0yNDEzLDEzICsyNDQ4LDI3IEBACiAgICAgbGx2bTo6RElUeXBlIENtZFR5ID0gZ2V0T3JDcmVhdGVUeXBlKE9NZXRob2QtPmdldENtZERlY2woKS0+Z2V0VHlwZSgpLCBGKTsKICAgICBFbHRzLnB1c2hfYmFjayhEQnVpbGRlci5jcmVhdGVBcnRpZmljaWFsVHlwZShDbWRUeSkpOwogICAgIC8vIEdldCByZXN0IG9mIHRoZSBhcmd1bWVudHMuCi0gICAgZm9yIChPYmpDTWV0aG9kRGVjbDo6cGFyYW1fY29uc3RfaXRlcmF0b3IgUEkgPSBPTWV0aG9kLT5wYXJhbV9iZWdpbigpLAotICAgICAgICAgICBQRSA9IE9NZXRob2QtPnBhcmFtX2VuZCgpOyBQSSAhPSBQRTsgKytQSSkKLSAgICAgIEVsdHMucHVzaF9iYWNrKGdldE9yQ3JlYXRlVHlwZSgoKlBJKS0+Z2V0VHlwZSgpLCBGKSk7CisgICAgZm9yIChjb25zdCBhdXRvICpQSSA6IE9NZXRob2QtPnBhcmFtcygpKQorICAgICAgRWx0cy5wdXNoX2JhY2soZ2V0T3JDcmVhdGVUeXBlKFBJLT5nZXRUeXBlKCksIEYpKTsKIAogICAgIGxsdm06OkRJQXJyYXkgRWx0VHlwZUFycmF5ID0gREJ1aWxkZXIuZ2V0T3JDcmVhdGVBcnJheShFbHRzKTsKICAgICByZXR1cm4gREJ1aWxkZXIuY3JlYXRlU3Vicm91dGluZVR5cGUoRiwgRWx0VHlwZUFycmF5KTsKICAgfQorCisgIC8vIEhhbmRsZSB2YXJpYWRpYyBmdW5jdGlvbiB0eXBlczsgdGhleSBuZWVkIGFuIGFkZGl0aW9uYWwKKyAgLy8gdW5zcGVjaWZpZWQgcGFyYW1ldGVyLgorICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oRCkpCisgICAgaWYgKEZELT5pc1ZhcmlhZGljKCkpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGxsdm06OlZhbHVlICosIDE2PiBFbHRUeXM7CisgICAgICBFbHRUeXMucHVzaF9iYWNrKGdldE9yQ3JlYXRlVHlwZShGRC0+Z2V0UmV0dXJuVHlwZSgpLCBGKSk7CisgICAgICBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGblR5cGUpKQorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRlBULT5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyArK2kpCisgICAgICAgICAgRWx0VHlzLnB1c2hfYmFjayhnZXRPckNyZWF0ZVR5cGUoRlBULT5nZXRQYXJhbVR5cGUoaSksIEYpKTsKKyAgICAgIEVsdFR5cy5wdXNoX2JhY2soREJ1aWxkZXIuY3JlYXRlVW5zcGVjaWZpZWRQYXJhbWV0ZXIoKSk7CisgICAgICBsbHZtOjpESUFycmF5IEVsdFR5cGVBcnJheSA9IERCdWlsZGVyLmdldE9yQ3JlYXRlQXJyYXkoRWx0VHlzKTsKKyAgICAgIHJldHVybiBEQnVpbGRlci5jcmVhdGVTdWJyb3V0aW5lVHlwZShGLCBFbHRUeXBlQXJyYXkpOworICAgIH0KKwogICByZXR1cm4gbGx2bTo6RElDb21wb3NpdGVUeXBlKGdldE9yQ3JlYXRlVHlwZShGblR5cGUsIEYpKTsKIH0KIApAQCAtMjQzNCwxNCArMjQ4MywyNSBAQAogICBGbkJlZ2luUmVnaW9uQ291bnQucHVzaF9iYWNrKExleGljYWxCbG9ja1N0YWNrLnNpemUoKSk7CiAKICAgY29uc3QgRGVjbCAqRCA9IEdELmdldERlY2woKTsKLSAgLy8gRnVuY3Rpb24gbWF5IGxhY2sgZGVjbGFyYXRpb24gaW4gc291cmNlIGNvZGUgaWYgaXQgaXMgY3JlYXRlZCBieSBDbGFuZwotICAvLyBDb2RlR2VuIChleGFtcGxlczogX0dMT0JBTF9fSV9hLCBfX2N4eF9nbG9iYWxfYXJyYXlfZHRvciwgdGh1bmspLgorCisgIC8vIFVzZSB0aGUgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hlcmUKKyAgLy8gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgbG9jYXRlZC4gQnkgZGVmYXVsdCB1c2UgdGhlIGxvY2F0aW9uCisgIC8vIG9mIHRoZSBkZWNsYXJhdGlvbiBhcyB0aGUgbG9jYXRpb24gZm9yIHRoZSBzdWJwcm9ncmFtLiBBIGZ1bmN0aW9uCisgIC8vIG1heSBsYWNrIGEgZGVjbGFyYXRpb24gaW4gdGhlIHNvdXJjZSBjb2RlIGlmIGl0IGlzIGNyZWF0ZWQgYnkgY29kZQorICAvLyBnZW4uIChleGFtcGxlczogX0dMT0JBTF9fSV9hLCBfX2N4eF9nbG9iYWxfYXJyYXlfZHRvciwgdGh1bmspLgogICBib29sIEhhc0RlY2wgPSAoRCAhPSAwKTsKLSAgLy8gVXNlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVjbGFyYXRpb24uCiAgIFNvdXJjZUxvY2F0aW9uIExvYzsKLSAgaWYgKEhhc0RlY2wpCisgIGlmIChIYXNEZWNsKSB7CiAgICAgTG9jID0gRC0+Z2V0TG9jYXRpb24oKTsKIAorICAgIC8vIElmIHRoaXMgaXMgYSBmdW5jdGlvbiBzcGVjaWFsaXphdGlvbiB0aGVuIHVzZSB0aGUgcGF0dGVybiBib2R5CisgICAgLy8gYXMgdGhlIGxvY2F0aW9uIGZvciB0aGUgZnVuY3Rpb24uCisgICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEQpKQorICAgICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqU3BlY0RlY2wgPSBGRC0+Z2V0VGVtcGxhdGVJbnN0YW50aWF0aW9uUGF0dGVybigpKQorICAgICAgICBpZiAoU3BlY0RlY2wtPmhhc0JvZHkoU3BlY0RlY2wpKQorICAgICAgICAgIExvYyA9IFNwZWNEZWNsLT5nZXRMb2NhdGlvbigpOworICB9CisKICAgdW5zaWduZWQgRmxhZ3MgPSAwOwogICBsbHZtOjpESUZpbGUgVW5pdCA9IGdldE9yQ3JlYXRlRmlsZShMb2MpOwogICBsbHZtOjpESURlc2NyaXB0b3IgRkRDb250ZXh0KFVuaXQpOwpAQCAtMjUwNCw2ICsyNTY0LDExIEBACiAgIGlmICghSGFzRGVjbCB8fCBELT5pc0ltcGxpY2l0KCkpCiAgICAgRmxhZ3MgfD0gbGx2bTo6RElEZXNjcmlwdG9yOjpGbGFnQXJ0aWZpY2lhbDsKIAorICAvLyBGSVhNRTogVGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHdlJ3JlIGNvbnN0cnVjdGluZyBoZXJlIGlzIG1vc3RseSByZXVzaW5nCisgIC8vIGRlY2xhcmF0aW9ucyBmcm9tIENYWE1ldGhvZERlY2wgYW5kIG5vdCBjb25zdHJ1Y3RpbmcgbmV3IG9uZXMgZm9yIGFyYml0cmFyeQorICAvLyBGdW5jdGlvbkRlY2xzLiBXaGVuL2lmIHdlIGZpeCB0aGlzIHdlIGNhbiBoYXZlIEZEQ29udGV4dCBiZSBUaGVDVS9udWxsIGZvcgorICAvLyBhbGwgc3VicHJvZ3JhbXMgaW5zdGVhZCBvZiB0aGUgYWN0dWFsIGNvbnRleHQgc2luY2Ugc3VicHJvZ3JhbSBkZWZpbml0aW9ucworICAvLyBhcmUgZW1pdHRlZCBhcyBDVSBsZXZlbCBlbnRpdGllcyBieSB0aGUgYmFja2VuZC4KICAgbGx2bTo6RElTdWJwcm9ncmFtIFNQID0KICAgICAgIERCdWlsZGVyLmNyZWF0ZUZ1bmN0aW9uKEZEQ29udGV4dCwgTmFtZSwgTGlua2FnZU5hbWUsIFVuaXQsIExpbmVObywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE9yQ3JlYXRlRnVuY3Rpb25UeXBlKEQsIEZuVHlwZSwgVW5pdCksCkBAIC0yNTE0LDkgKzI1NzksMTAgQEAKICAgaWYgKEhhc0RlY2wpCiAgICAgRGVjbENhY2hlLmluc2VydChzdGQ6Om1ha2VfcGFpcihELT5nZXRDYW5vbmljYWxEZWNsKCksIGxsdm06OldlYWtWSChTUCkpKTsKIAotICAvLyBQdXNoIGZ1bmN0aW9uIG9uIHJlZ2lvbiBzdGFjay4KKyAgLy8gUHVzaCB0aGUgZnVuY3Rpb24gb250byB0aGUgbGV4aWNhbCBibG9jayBzdGFjay4KICAgbGx2bTo6TUROb2RlICpTUE4gPSBTUDsKICAgTGV4aWNhbEJsb2NrU3RhY2sucHVzaF9iYWNrKFNQTik7CisKICAgaWYgKEhhc0RlY2wpCiAgICAgUmVnaW9uTWFwW0RdID0gbGx2bTo6V2Vha1ZIKFNQKTsKIH0KQEAgLTI1NjAsNyArMjYyNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkRJRGVzY3JpcHRvcihMZXhpY2FsQmxvY2tTdGFjay5iYWNrKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPckNyZWF0ZUZpbGUoQ3VyTG9jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZU51bWJlcihDdXJMb2MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb2x1bW5OdW1iZXIoQ3VyTG9jKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbHVtbk51bWJlcihDdXJMb2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKICAgbGx2bTo6TUROb2RlICpETiA9IEQ7CiAgIExleGljYWxCbG9ja1N0YWNrLnB1c2hfYmFjayhETik7CiB9CkBAIC0yNzY4LDEwICsyODM1LDcgQEAKICAgICAvLyBhbGwgdW5pb24gZmllbGRzLgogICAgIGNvbnN0IFJlY29yZERlY2wgKlJEID0gY2FzdDxSZWNvcmREZWNsPihSVC0+Z2V0RGVjbCgpKTsKICAgICBpZiAoUkQtPmlzVW5pb24oKSAmJiBSRC0+aXNBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKCkpIHsKLSAgICAgIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgSSA9IFJELT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgIEUgPSBSRC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgICAgIEZpZWxkRGVjbCAqRmllbGQgPSAqSTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAqRmllbGQgOiBSRC0+ZmllbGRzKCkpIHsKICAgICAgICAgbGx2bTo6RElUeXBlIEZpZWxkVHkgPSBnZXRPckNyZWF0ZVR5cGUoRmllbGQtPmdldFR5cGUoKSwgVW5pdCk7CiAgICAgICAgIFN0cmluZ1JlZiBGaWVsZE5hbWUgPSBGaWVsZC0+Z2V0TmFtZSgpOwogCkBAIC0yOTcwLDEwICszMDM0LDcgQEAKICAgfQogCiAgIC8vIFZhcmlhYmxlIGNhcHR1cmVzLgotICBmb3IgKEJsb2NrRGVjbDo6Y2FwdHVyZV9jb25zdF9pdGVyYXRvcgotICAgICAgICAgaSA9IGJsb2NrRGVjbC0+Y2FwdHVyZV9iZWdpbigpLCBlID0gYmxvY2tEZWNsLT5jYXB0dXJlX2VuZCgpOwotICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgY29uc3QgQmxvY2tEZWNsOjpDYXB0dXJlICZjYXB0dXJlID0gKmk7CisgIGZvciAoY29uc3QgYXV0byAmY2FwdHVyZSA6IGJsb2NrRGVjbC0+Y2FwdHVyZXMoKSkgewogICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gY2FwdHVyZS5nZXRWYXJpYWJsZSgpOwogICAgIGNvbnN0IENHQmxvY2tJbmZvOjpDYXB0dXJlICZjYXB0dXJlSW5mbyA9IGJsb2NrLmdldENhcHR1cmUodmFyaWFibGUpOwogCkBAIC0zMDg1LDcgKzMxNDYsNiBAQAogICBsbHZtOjpESUNvbXBvc2l0ZVR5cGUgQ3R4dCgKICAgICAgIGdldENvbnRleHREZXNjcmlwdG9yKGNhc3Q8RGVjbD4oRC0+Z2V0RGVjbENvbnRleHQoKSkpKTsKICAgbGx2bTo6RElEZXJpdmVkVHlwZSBUID0gQ3JlYXRlUmVjb3JkU3RhdGljRmllbGQoRCwgQ3R4dCk7Ci0gIEN0eHQuYWRkTWVtYmVyKFQpOwogICByZXR1cm4gVDsKIH0KIApAQCAtMzE5Niw3ICszMjU2LDcgQEAKICAgLy8gRW1pdHRpbmcgb25lIGRlY2wgaXMgc3VmZmljaWVudCAtIGRlYnVnZ2VycyBjYW4gZGV0ZWN0IHRoYXQgdGhpcyBpcyBhbgogICAvLyBvdmVybG9hZGVkIG5hbWUgJiBwcm92aWRlIGxvb2t1cCBmb3IgYWxsIHRoZSBvdmVybG9hZHMuCiAgIGNvbnN0IFVzaW5nU2hhZG93RGVjbCAmVVNEID0gKipVRC5zaGFkb3dfYmVnaW4oKTsKLSAgaWYgKGxsdm06OkRJRGVzY3JpcHRvciBUYXJnZXQgPQorICBpZiAobGx2bTo6RElTY29wZSBUYXJnZXQgPQogICAgICAgICAgIGdldERlY2xhcmF0aW9uT3JEZWZpbml0aW9uKFVTRC5nZXRVbmRlcmx5aW5nRGVjbCgpKSkKICAgICBEQnVpbGRlci5jcmVhdGVJbXBvcnRlZERlY2xhcmF0aW9uKAogICAgICAgICBnZXRDdXJyZW50Q29udGV4dERlc2NyaXB0b3IoY2FzdDxEZWNsPihVU0QuZ2V0RGVjbENvbnRleHQoKSkpLCBUYXJnZXQsCmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR0RlYnVnSW5mby5oIGIvbGliL0NvZGVHZW4vQ0dEZWJ1Z0luZm8uaAppbmRleCAwY2EyNzRmLi41Mjc4NGRhIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0RlYnVnSW5mby5oCisrKyBiL2xpYi9Db2RlR2VuL0NHRGVidWdJbmZvLmgKQEAgLTIwLDEwICsyMCwxMCBAQAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZUxvY2F0aW9uLmgiCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvQ29kZUdlbk9wdGlvbnMuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgotI2luY2x1ZGUgImxsdm0vRElCdWlsZGVyLmgiCi0jaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RJQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVidWdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsdWVIYW5kbGUuaCIKIAogbmFtZXNwYWNlIGxsdm0gewogICBjbGFzcyBNRE5vZGU7CkBAIC00Nyw4ICs0Nyw4IEBACiAvLy8gYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyB0byBsbHZtIGdsb2JhbHMgb3IgcGFzcyBkaXJlY3RseSB0bwogLy8vIHRoZSBiYWNrZW5kLgogY2xhc3MgQ0dEZWJ1Z0luZm8gewotICBmcmllbmQgY2xhc3MgTm9Mb2NhdGlvbjsKICAgZnJpZW5kIGNsYXNzIEFydGlmaWNpYWxMb2NhdGlvbjsKKyAgZnJpZW5kIGNsYXNzIFNhdmVBbmRSZXN0b3JlTG9jYXRpb247CiAgIENvZGVHZW5Nb2R1bGUgJkNHTTsKICAgY29uc3QgQ29kZUdlbk9wdGlvbnM6OkRlYnVnSW5mb0tpbmQgRGVidWdLaW5kOwogICBsbHZtOjpESUJ1aWxkZXIgREJ1aWxkZXI7CkBAIC0yODgsNiArMjg4LDggQEAKICAgdm9pZCBjb21wbGV0ZVJlcXVpcmVkVHlwZShjb25zdCBSZWNvcmREZWNsICpSRCk7CiAgIHZvaWQgY29tcGxldGVDbGFzc0RhdGEoY29uc3QgUmVjb3JkRGVjbCAqUkQpOwogCisgIHZvaWQgY29tcGxldGVUZW1wbGF0ZURlZmluaXRpb24oY29uc3QgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAmU0QpOworCiBwcml2YXRlOgogICAvLy8gRW1pdERlY2xhcmUgLSBFbWl0IGNhbGwgdG8gbGx2bS5kYmcuZGVjbGFyZSBmb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KICAgdm9pZCBFbWl0RGVjbGFyZShjb25zdCBWYXJEZWNsICpkZWNsLCB1bnNpZ25lZCBUYWcsIGxsdm06OlZhbHVlICpBSSwKQEAgLTM0Miw5ICszNDQsOSBAQAogICBsbHZtOjpESVR5cGUgQ3JlYXRlTWVtYmVyVHlwZShsbHZtOjpESUZpbGUgVW5pdCwgUXVhbFR5cGUgRlR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCB1aW50NjRfdCAqT2Zmc2V0KTsKIAotICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBESURlc2NyaXB0b3IsIGlmIGFueSwgZm9yIHRoZSBjYW5vbmljYWwgZm9ybSBvZiB0aGlzCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIERJU2NvcGUsIGlmIGFueSwgZm9yIHRoZSBjYW5vbmljYWwgZm9ybSBvZiB0aGlzCiAgIC8vLyBkZWNsYXJhdGlvbi4KLSAgbGx2bTo6RElEZXNjcmlwdG9yIGdldERlY2xhcmF0aW9uT3JEZWZpbml0aW9uKGNvbnN0IERlY2wgKkQpOworICBsbHZtOjpESVNjb3BlIGdldERlY2xhcmF0aW9uT3JEZWZpbml0aW9uKGNvbnN0IERlY2wgKkQpOwogCiAgIC8vLyBnZXRGdW5jdGlvbkRlY2xhcmF0aW9uIC0gUmV0dXJuIGRlYnVnIGluZm8gZGVzY3JpcHRvciB0byBkZXNjcmliZSBtZXRob2QKICAgLy8vIGRlY2xhcmF0aW9uIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGRlZmluaXRpb24uCkBAIC0zOTQsMTYgKzM5NiwyNiBAQAogICB9CiB9OwogCi0vLy8gTm9Mb2NhdGlvbiAtIEFuIFJBSUkgb2JqZWN0IHRoYXQgdGVtcG9yYXJpbHkgZGlzYWJsZXMgZGVidWcKLS8vLyBsb2NhdGlvbnMuIFRoaXMgaXMgdXNlZnVsIGZvciBlbWl0dGluZyBpbnN0cnVjdGlvbnMgdGhhdCBzaG91bGQgYmUKLS8vLyBjb3VudGVkIHRvd2FyZHMgdGhlIGZ1bmN0aW9uIHByb2xvZ3VlLgotY2xhc3MgTm9Mb2NhdGlvbiB7CisvLy8gU2F2ZUFuZFJlc3RvcmVMb2NhdGlvbiAtIEFuIFJBSUkgb2JqZWN0IHNhdmVzIHRoZSBjdXJyZW50IGxvY2F0aW9uCisvLy8gYW5kIGF1dG9tYXRpY2FsbHkgcmVzdG9yZXMgaXQgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLgorY2xhc3MgU2F2ZUFuZFJlc3RvcmVMb2NhdGlvbiB7Citwcm90ZWN0ZWQ6CiAgIFNvdXJjZUxvY2F0aW9uIFNhdmVkTG9jOwogICBDR0RlYnVnSW5mbyAqREk7CiAgIENHQnVpbGRlclR5ICZCdWlsZGVyOwogcHVibGljOgorICBTYXZlQW5kUmVzdG9yZUxvY2F0aW9uKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBDR0J1aWxkZXJUeSAmQik7CisgIC8vLyBBdXRvcmVzdG9yZSBldmVyeXRoaW5nIGJhY2sgdG8gbm9ybWFsLgorICB+U2F2ZUFuZFJlc3RvcmVMb2NhdGlvbigpOworfTsKKworLy8vIE5vTG9jYXRpb24gLSBBbiBSQUlJIG9iamVjdCB0aGF0IHRlbXBvcmFyaWx5IGRpc2FibGVzIGRlYnVnCisvLy8gbG9jYXRpb25zLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZW1pdHRpbmcgaW5zdHJ1Y3Rpb25zIHRoYXQgc2hvdWxkIGJlCisvLy8gY291bnRlZCB0b3dhcmRzIHRoZSBmdW5jdGlvbiBwcm9sb2d1ZS4KK2NsYXNzIE5vTG9jYXRpb24gOiBwdWJsaWMgU2F2ZUFuZFJlc3RvcmVMb2NhdGlvbiB7CitwdWJsaWM6CiAgIE5vTG9jYXRpb24oQ29kZUdlbkZ1bmN0aW9uICZDR0YsIENHQnVpbGRlclR5ICZCKTsKLSAgLy8vIH5Ob0xvY2F0aW9uIC0gQXV0b3Jlc3RvcmUgZXZlcnl0aGluZyBiYWNrIHRvIG5vcm1hbC4KKyAgLy8vIEF1dG9yZXN0b3JlIGV2ZXJ5dGhpbmcgYmFjayB0byBub3JtYWwuCiAgIH5Ob0xvY2F0aW9uKCk7CiB9OwogCkBAIC00MTgsMTAgKzQzMCw3IEBACiAvLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBwYXNzaW5nIGFuIGVtcHR5IFNvdXJjZUxvY2F0aW9uIHRvCiAvLy8gQ0dEZWJ1Z0luZm86OnNldExvY2F0aW9uKCkgd2lsbCByZXN1bHQgaW4gdGhlIGxhc3QgdmFsaWQgbG9jYXRpb24KIC8vLyBiZWluZyByZXVzZWQuCi1jbGFzcyBBcnRpZmljaWFsTG9jYXRpb24gewotICBTb3VyY2VMb2NhdGlvbiBTYXZlZExvYzsKLSAgQ0dEZWJ1Z0luZm8gKkRJOwotICBDR0J1aWxkZXJUeSAmQnVpbGRlcjsKK2NsYXNzIEFydGlmaWNpYWxMb2NhdGlvbiA6IHB1YmxpYyBTYXZlQW5kUmVzdG9yZUxvY2F0aW9uIHsKIHB1YmxpYzoKICAgQXJ0aWZpY2lhbExvY2F0aW9uKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBDR0J1aWxkZXJUeSAmQik7CiAKQEAgLTQyOSw3ICs0MzgsNyBAQAogICAvLy8gKD0gdGhlIHRvcCBvZiB0aGUgTGV4aWNhbEJsb2NrU3RhY2spLgogICB2b2lkIEVtaXQoKTsKIAotICAvLy8gfkFydGlmaWNpYWxMb2NhdGlvbiAtIEF1dG9yZXN0b3JlIGV2ZXJ5dGhpbmcgYmFjayB0byBub3JtYWwuCisgIC8vLyBBdXRvcmVzdG9yZSBldmVyeXRoaW5nIGJhY2sgdG8gbm9ybWFsLgogICB+QXJ0aWZpY2lhbExvY2F0aW9uKCk7CiB9OwogCmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR0RlY2wuY3BwIGIvbGliL0NvZGVHZW4vQ0dEZWNsLmNwcAppbmRleCA2NmQ2YjMzLi45ZGIzYzkxIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0RlY2wuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHRGVjbC5jcHAKQEAgLTE4Myw3ICsxODMsNyBAQAogICByZXR1cm4gQ29udGV4dE5hbWUgKyBTZXBhcmF0b3IgKyBELmdldE5hbWVBc1N0cmluZygpOwogfQogCi1sbHZtOjpHbG9iYWxWYXJpYWJsZSAqCitsbHZtOjpDb25zdGFudCAqCiBDb2RlR2VuRnVuY3Rpb246OkNyZWF0ZVN0YXRpY1ZhckRlY2woY29uc3QgVmFyRGVjbCAmRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTZXBhcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CkBAIC0yMTIsNiArMjEyLDEzIEBACiAgIGlmIChELmdldFRMU0tpbmQoKSkKICAgICBDR00uc2V0VExTTW9kZShHViwgRCk7CiAKKyAgLy8gTWFrZSBzdXJlIHRoZSByZXN1bHQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZS4KKyAgdW5zaWduZWQgRXhwZWN0ZWRBZGRyU3BhY2UgPSBDR00uZ2V0Q29udGV4dCgpLmdldFRhcmdldEFkZHJlc3NTcGFjZShUeSk7CisgIGlmIChBZGRyU3BhY2UgIT0gRXhwZWN0ZWRBZGRyU3BhY2UpIHsKKyAgICBsbHZtOjpQb2ludGVyVHlwZSAqUFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldChMVHksIEV4cGVjdGVkQWRkclNwYWNlKTsKKyAgICByZXR1cm4gbGx2bTo6Q29uc3RhbnRFeHByOjpnZXRBZGRyU3BhY2VDYXN0KEdWLCBQVHkpOworICB9CisKICAgcmV0dXJuIEdWOwogfQogCkBAIC0yOTgsMTIgKzMwNSw4IEBACiAgIGxsdm06OkNvbnN0YW50ICphZGRyID0KICAgICBDR00uZ2V0U3RhdGljTG9jYWxEZWNsQWRkcmVzcygmRCk7CiAKLSAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKnZhcjsKLSAgaWYgKGFkZHIpIHsKLSAgICB2YXIgPSBjYXN0PGxsdm06Okdsb2JhbFZhcmlhYmxlPihhZGRyLT5zdHJpcFBvaW50ZXJDYXN0cygpKTsKLSAgfSBlbHNlIHsKLSAgICBhZGRyID0gdmFyID0gQ3JlYXRlU3RhdGljVmFyRGVjbChELCAiLiIsIExpbmthZ2UpOwotICB9CisgIGlmICghYWRkcikKKyAgICBhZGRyID0gQ3JlYXRlU3RhdGljVmFyRGVjbChELCAiLiIsIExpbmthZ2UpOwogCiAgIC8vIFN0b3JlIGludG8gTG9jYWxEZWNsTWFwIGJlZm9yZSBnZW5lcmF0aW5nIGluaXRpYWxpemVyIHRvIGhhbmRsZQogICAvLyBjaXJjdWxhciByZWZlcmVuY2VzLgpAQCAtMzE5LDYgKzMyMiw4IEBACiAgIC8vIFNhdmUgdGhlIHR5cGUgaW4gY2FzZSBhZGRpbmcgdGhlIGluaXRpYWxpemVyIGZvcmNlcyBhIHR5cGUgY2hhbmdlLgogICBsbHZtOjpUeXBlICpleHBlY3RlZFR5cGUgPSBhZGRyLT5nZXRUeXBlKCk7CiAKKyAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKnZhciA9CisgICAgY2FzdDxsbHZtOjpHbG9iYWxWYXJpYWJsZT4oYWRkci0+c3RyaXBQb2ludGVyQ2FzdHMoKSk7CiAgIC8vIElmIHRoaXMgdmFsdWUgaGFzIGFuIGluaXRpYWxpemVyLCBlbWl0IGl0LgogICBpZiAoRC5nZXRJbml0KCkpCiAgICAgdmFyID0gQWRkSW5pdGlhbGl6ZXJUb1N0YXRpY1ZhckRlY2woRCwgdmFyKTsKQEAgLTMzMiwxNCArMzM3LDE1IEBACiAgICAgdmFyLT5zZXRTZWN0aW9uKFNBLT5nZXROYW1lKCkpOwogCiAgIGlmIChELmhhc0F0dHI8VXNlZEF0dHI+KCkpCi0gICAgQ0dNLkFkZFVzZWRHbG9iYWwodmFyKTsKKyAgICBDR00uYWRkVXNlZEdsb2JhbCh2YXIpOwogCiAgIC8vIFdlIG1heSBoYXZlIHRvIGNhc3QgdGhlIGNvbnN0YW50IGJlY2F1c2Ugb2YgdGhlIGluaXRpYWxpemVyCiAgIC8vIG1pc21hdGNoIGFib3ZlLgogICAvLwogICAvLyBGSVhNRTogSXQgaXMgcmVhbGx5IGRhbmdlcm91cyB0byBzdG9yZSB0aGlzIGluIHRoZSBtYXA7IGlmIGFueW9uZQogICAvLyBSQVVXJ3MgdGhlIEdWIHVzZXMgb2YgdGhpcyBjb25zdGFudCB3aWxsIGJlIGludmFsaWQuCi0gIGxsdm06OkNvbnN0YW50ICpjYXN0ZWRBZGRyID0gbGx2bTo6Q29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KHZhciwgZXhwZWN0ZWRUeXBlKTsKKyAgbGx2bTo6Q29uc3RhbnQgKmNhc3RlZEFkZHIgPQorICAgIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0UG9pbnRlckJpdENhc3RPckFkZHJTcGFjZUNhc3QodmFyLCBleHBlY3RlZFR5cGUpOwogICBETUVudHJ5ID0gY2FzdGVkQWRkcjsKICAgQ0dNLnNldFN0YXRpY0xvY2FsRGVjbEFkZHJlc3MoJkQsIGNhc3RlZEFkZHIpOwogCkBAIC0zNjUsNyArMzcxLDcgQEAKICAgICBDb2RlR2VuRnVuY3Rpb246OkRlc3Ryb3llciAqZGVzdHJveWVyOwogICAgIGJvb2wgdXNlRUhDbGVhbnVwRm9yQXJyYXk7CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgLy8gRG9uJ3QgdXNlIGFuIEVIIGNsZWFudXAgcmVjdXJzaXZlbHkgZnJvbSBhbiBFSCBjbGVhbnVwLgogICAgICAgYm9vbCB1c2VFSENsZWFudXBGb3JBcnJheSA9CiAgICAgICAgIGZsYWdzLmlzRm9yTm9ybWFsQ2xlYW51cCgpICYmIHRoaXMtPnVzZUVIQ2xlYW51cEZvckFycmF5OwpAQCAtMzg0LDcgKzM5MCw3IEBACiAgICAgbGx2bTo6VmFsdWUgKk5SVk9GbGFnOwogICAgIGxsdm06OlZhbHVlICpMb2M7CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgLy8gQWxvbmcgdGhlIGV4Y2VwdGlvbnMgcGF0aCB3ZSBhbHdheXMgZXhlY3V0ZSB0aGUgZHRvci4KICAgICAgIGJvb2wgTlJWTyA9IGZsYWdzLmlzRm9yTm9ybWFsQ2xlYW51cCgpICYmIE5SVk9GbGFnOwogCkBAIC00MTAsNyArNDE2LDcgQEAKICAgc3RydWN0IENhbGxTdGFja1Jlc3RvcmUgOiBFSFNjb3BlU3RhY2s6OkNsZWFudXAgewogICAgIGxsdm06OlZhbHVlICpTdGFjazsKICAgICBDYWxsU3RhY2tSZXN0b3JlKGxsdm06OlZhbHVlICpTdGFjaykgOiBTdGFjayhTdGFjaykge30KLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgbGx2bTo6VmFsdWUgKlYgPSBDR0YuQnVpbGRlci5DcmVhdGVMb2FkKFN0YWNrKTsKICAgICAgIGxsdm06OlZhbHVlICpGID0gQ0dGLkNHTS5nZXRJbnRyaW5zaWMobGx2bTo6SW50cmluc2ljOjpzdGFja3Jlc3RvcmUpOwogICAgICAgQ0dGLkJ1aWxkZXIuQ3JlYXRlQ2FsbChGLCBWKTsKQEAgLTQyMSw3ICs0MjcsNyBAQAogICAgIGNvbnN0IFZhckRlY2wgJlZhcjsKICAgICBFeHRlbmRHQ0xpZmV0aW1lKGNvbnN0IFZhckRlY2wgKnZhcikgOiBWYXIoKnZhcikge30KIAotICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSBvdmVycmlkZSB7CiAgICAgICAvLyBDb21wdXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSwgaW4gY2FzZSBpdCdzIGEKICAgICAgIC8vIGJ5cmVmIG9yIHNvbWV0aGluZy4KICAgICAgIERlY2xSZWZFeHByIERSRShjb25zdF9jYXN0PFZhckRlY2wqPigmVmFyKSwgZmFsc2UsCkBAIC00NDEsNyArNDQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhckRlY2wgKlZhcikKICAgICAgIDogQ2xlYW51cEZuKENsZWFudXBGbiksIEZuSW5mbygqSW5mbyksIFZhcigqVmFyKSB7fQogCi0gICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgeworICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIG92ZXJyaWRlIHsKICAgICAgIERlY2xSZWZFeHByIERSRShjb25zdF9jYXN0PFZhckRlY2wqPigmVmFyKSwgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgVmFyLmdldFR5cGUoKSwgVktfTFZhbHVlLCBTb3VyY2VMb2NhdGlvbigpKTsKICAgICAgIC8vIENvbXB1dGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvY2FsIHZhcmlhYmxlLCBpbiBjYXNlIGl0J3MgYSBieXJlZgpAQCAtNDczLDcgKzQ3OSw3IEBACiAgICAgQ2FsbExpZmV0aW1lRW5kKGxsdm06OlZhbHVlICphZGRyLCBsbHZtOjpWYWx1ZSAqc2l6ZSkKICAgICAgIDogQWRkcihhZGRyKSwgU2l6ZShzaXplKSB7fQogCi0gICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgeworICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIG92ZXJyaWRlIHsKICAgICAgIGxsdm06OlZhbHVlICpjYXN0QWRkciA9IENHRi5CdWlsZGVyLkNyZWF0ZUJpdENhc3QoQWRkciwgQ0dGLkludDhQdHJUeSk7CiAgICAgICBDR0YuQnVpbGRlci5DcmVhdGVDYWxsMihDR0YuQ0dNLmdldExMVk1MaWZldGltZUVuZEZuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplLCBjYXN0QWRkcikKQEAgLTUzMCw5ICs1MzYsOCBAQAogICAgICAgcmV0dXJuIChyZWYtPmdldERlY2woKSA9PSAmdmFyKTsKICAgICBpZiAoY29uc3QgQmxvY2tFeHByICpiZSA9IGR5bl9jYXN0PEJsb2NrRXhwcj4oZSkpIHsKICAgICAgIGNvbnN0IEJsb2NrRGVjbCAqYmxvY2sgPSBiZS0+Z2V0QmxvY2tEZWNsKCk7Ci0gICAgICBmb3IgKEJsb2NrRGVjbDo6Y2FwdHVyZV9jb25zdF9pdGVyYXRvciBpID0gYmxvY2stPmNhcHR1cmVfYmVnaW4oKSwKLSAgICAgICAgICAgZSA9IGJsb2NrLT5jYXB0dXJlX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgICAgICBpZiAoaS0+Z2V0VmFyaWFibGUoKSA9PSAmdmFyKQorICAgICAgZm9yIChjb25zdCBhdXRvICZJIDogYmxvY2stPmNhcHR1cmVzKCkpIHsKKyAgICAgICAgaWYgKEkuZ2V0VmFyaWFibGUoKSA9PSAmdmFyKQogICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQogICAgIH0KQEAgLTU3MSw3ICs1NzYsMTAgQEAKICAgICBFbWl0U3RvcmVUaHJvdWdoTFZhbHVlKFJWYWx1ZTo6Z2V0KHZhbHVlKSwgbHZhbHVlLCB0cnVlKTsKICAgICByZXR1cm47CiAgIH0KLQorICAKKyAgaWYgKGNvbnN0IENYWERlZmF1bHRJbml0RXhwciAqRElFID0gZHluX2Nhc3Q8Q1hYRGVmYXVsdEluaXRFeHByPihpbml0KSkKKyAgICBpbml0ID0gRElFLT5nZXRFeHByKCk7CisgICAgCiAgIC8vIElmIHdlJ3JlIGVtaXR0aW5nIGEgdmFsdWUgd2l0aCBsaWZldGltZSwgd2UgaGF2ZSB0byBkbyB0aGUKICAgLy8gaW5pdGlhbGl6YXRpb24gKmJlZm9yZSogd2UgbGVhdmUgdGhlIGNsZWFudXAgc2NvcGVzLgogICBpZiAoY29uc3QgRXhwcldpdGhDbGVhbnVwcyAqZXdjID0gZHluX2Nhc3Q8RXhwcldpdGhDbGVhbnVwcz4oaW5pdCkpIHsKQEAgLTgyMyw3ICs4MzEsNyBAQAogfQogCiAvLy8gRW1pdEF1dG9WYXJBbGxvY2EgLSBFbWl0IHRoZSBhbGxvY2EgYW5kIGRlYnVnIGluZm9ybWF0aW9uIGZvciBhCi0vLy8gbG9jYWwgdmFyaWFibGUuICBEb2VzIG5vdCBlbWl0IGluaXRhbGl6YXRpb24gb3IgZGVzdHJ1Y3Rpb24uCisvLy8gbG9jYWwgdmFyaWFibGUuICBEb2VzIG5vdCBlbWl0IGluaXRpYWxpemF0aW9uIG9yIGRlc3RydWN0aW9uLgogQ29kZUdlbkZ1bmN0aW9uOjpBdXRvVmFyRW1pc3Npb24KIENvZGVHZW5GdW5jdGlvbjo6RW1pdEF1dG9WYXJBbGxvY2EoY29uc3QgVmFyRGVjbCAmRCkgewogICBRdWFsVHlwZSBUeSA9IEQuZ2V0VHlwZSgpOwpAQCAtOTQ0LDEyICs5NTIsMTIgQEAKIAogICAgICAgLy8gUHVzaCBhIGNsZWFudXAgYmxvY2sgYW5kIHJlc3RvcmUgdGhlIHN0YWNrIHRoZXJlLgogICAgICAgLy8gRklYTUU6IGluIGdlbmVyYWwgY2lyY3Vtc3RhbmNlcywgdGhpcyBzaG91bGQgYmUgYW4gRUggY2xlYW51cC4KLSAgICAgIEVIU3RhY2sucHVzaENsZWFudXA8Q2FsbFN0YWNrUmVzdG9yZT4oTm9ybWFsQ2xlYW51cCwgU3RhY2spOworICAgICAgcHVzaFN0YWNrUmVzdG9yZShOb3JtYWxDbGVhbnVwLCBTdGFjayk7CiAgICAgfQogCiAgICAgbGx2bTo6VmFsdWUgKmVsZW1lbnRDb3VudDsKICAgICBRdWFsVHlwZSBlbGVtZW50VHlwZTsKLSAgICBsbHZtOjp0aWUoZWxlbWVudENvdW50LCBlbGVtZW50VHlwZSkgPSBnZXRWTEFTaXplKFR5KTsKKyAgICBzdGQ6OnRpZShlbGVtZW50Q291bnQsIGVsZW1lbnRUeXBlKSA9IGdldFZMQVNpemUoVHkpOwogCiAgICAgbGx2bTo6VHlwZSAqbGx2bVR5ID0gQ29udmVydFR5cGVGb3JNZW0oZWxlbWVudFR5cGUpOwogCkBAIC05OTAsOSArOTk4LDggQEAKIAogICBpZiAoY29uc3QgQmxvY2tFeHByICpiZSA9IGR5bl9jYXN0PEJsb2NrRXhwcj4oZSkpIHsKICAgICBjb25zdCBCbG9ja0RlY2wgKmJsb2NrID0gYmUtPmdldEJsb2NrRGVjbCgpOwotICAgIGZvciAoQmxvY2tEZWNsOjpjYXB0dXJlX2NvbnN0X2l0ZXJhdG9yIGkgPSBibG9jay0+Y2FwdHVyZV9iZWdpbigpLAotICAgICAgICAgICBlID0gYmxvY2stPmNhcHR1cmVfZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgICBpZiAoaS0+Z2V0VmFyaWFibGUoKSA9PSAmdmFyKQorICAgIGZvciAoY29uc3QgYXV0byAmSSA6IGJsb2NrLT5jYXB0dXJlcygpKSB7CisgICAgICBpZiAoSS5nZXRWYXJpYWJsZSgpID09ICZ2YXIpCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMTAwMiwxOCArMTAwOSwxNiBAQAogCiAgIGlmIChjb25zdCBTdG10RXhwciAqU0UgPSBkeW5fY2FzdDxTdG10RXhwcj4oZSkpIHsKICAgICBjb25zdCBDb21wb3VuZFN0bXQgKkNTID0gU0UtPmdldFN1YlN0bXQoKTsKLSAgICBmb3IgKENvbXBvdW5kU3RtdDo6Y29uc3RfYm9keV9pdGVyYXRvciBCSSA9IENTLT5ib2R5X2JlZ2luKCksCi0JICAgQkUgPSBDUy0+Ym9keV9lbmQoKTsgQkkgIT0gQkU7ICsrQkkpCi0gICAgICBpZiAoRXhwciAqRSA9IGR5bl9jYXN0PEV4cHI+KCgqQkkpKSkgeworICAgIGZvciAoY29uc3QgYXV0byAqQkkgOiBDUy0+Ym9keSgpKQorICAgICAgaWYgKGNvbnN0IGF1dG8gKkUgPSBkeW5fY2FzdDxFeHByPihCSSkpIHsKICAgICAgICAgaWYgKGlzQ2FwdHVyZWRCeSh2YXIsIEUpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9Ci0gICAgICBlbHNlIGlmIChEZWNsU3RtdCAqRFMgPSBkeW5fY2FzdDxEZWNsU3RtdD4oKCpCSSkpKSB7CisgICAgICBlbHNlIGlmIChjb25zdCBhdXRvICpEUyA9IGR5bl9jYXN0PERlY2xTdG10PihCSSkpIHsKICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZGVjbGFyYXRpb25zCi0gICAgICAgICAgZm9yIChEZWNsU3RtdDo6ZGVjbF9pdGVyYXRvciBJID0gRFMtPmRlY2xfYmVnaW4oKSwgRSA9IERTLT5kZWNsX2VuZCgpOwotICAgICAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICAgICAgICAgICAgaWYgKFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oKCpJKSkpIHsKLSAgICAgICAgICAgICAgICBFeHByICpJbml0ID0gVkQtPmdldEluaXQoKTsKKyAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBEUy0+ZGVjbHMoKSkgeworICAgICAgICAgICAgICBpZiAoY29uc3QgYXV0byAqVkQgPSBkeW5fY2FzdDxWYXJEZWNsPigoSSkpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqSW5pdCA9IFZELT5nZXRJbml0KCk7CiAgICAgICAgICAgICAgICAgaWYgKEluaXQgJiYgaXNDYXB0dXJlZEJ5KHZhciwgSW5pdCkpCiAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgfQpAQCAtMTM0NCw2ICsxMzQ5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveWVyLCB1c2VFSENsZWFudXBGb3JBcnJheSk7CiB9CiAKK3ZvaWQgQ29kZUdlbkZ1bmN0aW9uOjpwdXNoU3RhY2tSZXN0b3JlKENsZWFudXBLaW5kIEtpbmQsIGxsdm06OlZhbHVlICpTUE1lbSkgeworICBFSFN0YWNrLnB1c2hDbGVhbnVwPENhbGxTdGFja1Jlc3RvcmU+KEtpbmQsIFNQTWVtKTsKK30KKwogdm9pZCBDb2RlR2VuRnVuY3Rpb246OnB1c2hMaWZldGltZUV4dGVuZGVkRGVzdHJveSgKICAgICBDbGVhbnVwS2luZCBjbGVhbnVwS2luZCwgbGx2bTo6VmFsdWUgKmFkZHIsIFF1YWxUeXBlIHR5cGUsCiAgICAgRGVzdHJveWVyICpkZXN0cm95ZXIsIGJvb2wgdXNlRUhDbGVhbnVwRm9yQXJyYXkpIHsKQEAgLTE1MDUsNyArMTUxNCw3IEBACiAgICAgICA6IEFycmF5QmVnaW4oYXJyYXlCZWdpbiksIEFycmF5RW5kKGFycmF5RW5kKSwKICAgICAgICAgRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpLCBEZXN0cm95ZXIoZGVzdHJveWVyKSB7fQogCi0gICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgeworICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIG92ZXJyaWRlIHsKICAgICAgIGVtaXRQYXJ0aWFsQXJyYXlEZXN0cm95KENHRiwgQXJyYXlCZWdpbiwgQXJyYXlFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50VHlwZSwgRGVzdHJveWVyKTsKICAgICB9CkBAIC0xNTI3LDcgKzE1MzYsNyBAQAogICAgICAgOiBBcnJheUJlZ2luKGFycmF5QmVnaW4pLCBBcnJheUVuZFBvaW50ZXIoYXJyYXlFbmRQb2ludGVyKSwKICAgICAgICAgRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpLCBEZXN0cm95ZXIoZGVzdHJveWVyKSB7fQogCi0gICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgeworICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIG92ZXJyaWRlIHsKICAgICAgIGxsdm06OlZhbHVlICphcnJheUVuZCA9IENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQoQXJyYXlFbmRQb2ludGVyKTsKICAgICAgIGVtaXRQYXJ0aWFsQXJyYXlEZXN0cm95KENHRiwgQXJyYXlCZWdpbiwgYXJyYXlFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50VHlwZSwgRGVzdHJveWVyKTsKQEAgLTE1OTQsNyArMTYwMyw3IEBACiAgICAgbGx2bTo6VmFsdWUgKlBhcmFtOwogICAgIEFSQ1ByZWNpc2VMaWZldGltZV90IFByZWNpc2U7CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgQ0dGLkVtaXRBUkNSZWxlYXNlKFBhcmFtLCBQcmVjaXNlKTsKICAgICB9CiAgIH07CkBAIC0xNjAzLDcgKzE2MTIsNyBAQAogLy8vIEVtaXQgYW4gYWxsb2NhIChvciBHbG9iYWxWYWx1ZSBkZXBlbmRpbmcgb24gdGFyZ2V0KQogLy8vIGZvciB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBhbmQgc2V0IHVwIExvY2FsRGVjbE1hcC4KIHZvaWQgQ29kZUdlbkZ1bmN0aW9uOjpFbWl0UGFybURlY2woY29uc3QgVmFyRGVjbCAmRCwgbGx2bTo6VmFsdWUgKkFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJnTm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBcmdJc1BvaW50ZXIsIHVuc2lnbmVkIEFyZ05vKSB7CiAgIC8vIEZJWE1FOiBXaHkgaXNuJ3QgSW1wbGljaXRQYXJhbURlY2wgYSBQYXJtVmFyRGVjbD8KICAgYXNzZXJ0KChpc2E8UGFybVZhckRlY2w+KEQpIHx8IGlzYTxJbXBsaWNpdFBhcmFtRGVjbD4oRCkpICYmCiAgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCB0byBFbWl0UGFybURlY2wiKTsKQEAgLTE2NDEsMzAgKzE2NTAsMzUgQEAKICAgfQogCiAgIGxsdm06OlZhbHVlICpEZWNsUHRyOwotICBib29sIEhhc05vblNjYWxhckV2YWxLaW5kID0gIUNvZGVHZW5GdW5jdGlvbjo6aGFzU2NhbGFyRXZhbHVhdGlvbktpbmQoVHkpOwotICAvLyBJZiB0aGlzIGlzIGFuIGFnZ3JlZ2F0ZSBvciB2YXJpYWJsZSBzaXplZCB2YWx1ZSwgcmV1c2UgdGhlIGlucHV0IHBvaW50ZXIuCi0gIGlmIChIYXNOb25TY2FsYXJFdmFsS2luZCB8fCAhVHktPmlzQ29uc3RhbnRTaXplVHlwZSgpKSB7Ci0gICAgRGVjbFB0ciA9IEFyZzsKKyAgYm9vbCBEb1N0b3JlID0gZmFsc2U7CisgIGJvb2wgSXNTY2FsYXIgPSBoYXNTY2FsYXJFdmFsdWF0aW9uS2luZChUeSk7CisgIENoYXJVbml0cyBBbGlnbiA9IGdldENvbnRleHQoKS5nZXREZWNsQWxpZ24oJkQpOworICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudCwgcmV1c2UgdGhlIGlucHV0IHBvaW50ZXIuCisgIGlmIChBcmdJc1BvaW50ZXIpIHsKKyAgICAvLyBJZiB3ZSBoYXZlIGEgcHJldHRpZXIgcG9pbnRlciB0eXBlIGF0IHRoaXMgcG9pbnQsIGJpdGNhc3QgdG8gdGhhdC4KKyAgICB1bnNpZ25lZCBBUyA9IGNhc3Q8bGx2bTo6UG9pbnRlclR5cGU+KEFyZy0+Z2V0VHlwZSgpKS0+Z2V0QWRkcmVzc1NwYWNlKCk7CisgICAgbGx2bTo6VHlwZSAqSVJUeSA9IENvbnZlcnRUeXBlRm9yTWVtKFR5KS0+Z2V0UG9pbnRlclRvKEFTKTsKKyAgICBEZWNsUHRyID0gQXJnLT5nZXRUeXBlKCkgPT0gSVJUeSA/IEFyZyA6IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChBcmcsIElSVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC5nZXROYW1lKCkpOwogICAgIC8vIFB1c2ggYSBkZXN0cnVjdG9yIGNsZWFudXAgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIHRoZSBBQkkgcmVxdWlyZXMgaXQuCi0gICAgaWYgKEhhc05vblNjYWxhckV2YWxLaW5kICYmCi0gICAgICAgIGdldFRhcmdldCgpLmdldENYWEFCSSgpLmlzQXJndW1lbnREZXN0cm95ZWRCeUNhbGxlZSgpKSB7Ci0gICAgICBpZiAoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBUeS0+Z2V0QXNDWFhSZWNvcmREZWNsKCkpIHsKLSAgICAgICAgaWYgKFJELT5oYXNOb25Ucml2aWFsRGVzdHJ1Y3RvcigpKQotICAgICAgICAgIHB1c2hEZXN0cm95KFF1YWxUeXBlOjpES19jeHhfZGVzdHJ1Y3RvciwgRGVjbFB0ciwgVHkpOwotICAgICAgfQorICAgIGlmICghSXNTY2FsYXIgJiYKKyAgICAgICAgZ2V0VGFyZ2V0KCkuZ2V0Q1hYQUJJKCkuYXJlQXJnc0Rlc3Ryb3llZExlZnRUb1JpZ2h0SW5DYWxsZWUoKSkgeworICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBUeS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgICAgICBpZiAoUkQgJiYgUkQtPmhhc05vblRyaXZpYWxEZXN0cnVjdG9yKCkpCisgICAgICAgIHB1c2hEZXN0cm95KFF1YWxUeXBlOjpES19jeHhfZGVzdHJ1Y3RvciwgRGVjbFB0ciwgVHkpOwogICAgIH0KICAgfSBlbHNlIHsKICAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSBhIHRlbXBvcmFyeSB0byBob2xkIHRoZSB2YWx1ZS4KICAgICBsbHZtOjpBbGxvY2FJbnN0ICpBbGxvYyA9IENyZWF0ZVRlbXBBbGxvY2EoQ29udmVydFR5cGVGb3JNZW0oVHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBELmdldE5hbWUoKSArICIuYWRkciIpOwotICAgIENoYXJVbml0cyBBbGlnbiA9IGdldENvbnRleHQoKS5nZXREZWNsQWxpZ24oJkQpOwogICAgIEFsbG9jLT5zZXRBbGlnbm1lbnQoQWxpZ24uZ2V0UXVhbnRpdHkoKSk7CiAgICAgRGVjbFB0ciA9IEFsbG9jOworICAgIERvU3RvcmUgPSB0cnVlOworICB9CiAKLSAgICBib29sIGRvU3RvcmUgPSB0cnVlOwotCisgIExWYWx1ZSBsdiA9IE1ha2VBZGRyTFZhbHVlKERlY2xQdHIsIFR5LCBBbGlnbik7CisgIGlmIChJc1NjYWxhcikgewogICAgIFF1YWxpZmllcnMgcXMgPSBUeS5nZXRRdWFsaWZpZXJzKCk7Ci0gICAgTFZhbHVlIGx2ID0gTWFrZUFkZHJMVmFsdWUoRGVjbFB0ciwgVHksIEFsaWduKTsKICAgICBpZiAoUXVhbGlmaWVyczo6T2JqQ0xpZmV0aW1lIGx0ID0gcXMuZ2V0T2JqQ0xpZmV0aW1lKCkpIHsKICAgICAgIC8vIFdlIGhvbm9yIF9fYXR0cmlidXRlX18oKG5zX2NvbnN1bWVkKSkgZm9yIHR5cGVzIHdpdGggbGlmZXRpbWUuCiAgICAgICAvLyBGb3IgX19zdHJvbmcsIGl0J3MgaGFuZGxlZCBieSBqdXN0IHNraXBwaW5nIHRoZSBpbml0aWFsIHJldGFpbjsKQEAgLTE2OTMsNyArMTcwNyw3IEBACiAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTnVsbCA9IENHTS5FbWl0TnVsbENvbnN0YW50KEQuZ2V0VHlwZSgpKTsKICAgICAgICAgICAgIEVtaXRTdG9yZU9mU2NhbGFyKE51bGwsIGx2LCAvKiBpc0luaXRpYWxpemF0aW9uICovIHRydWUpOwogICAgICAgICAgICAgRW1pdEFSQ1N0b3JlU3Ryb25nQ2FsbChsdi5nZXRBZGRyZXNzKCksIEFyZywgdHJ1ZSk7Ci0gICAgICAgICAgICBkb1N0b3JlID0gZmFsc2U7CisgICAgICAgICAgICBEb1N0b3JlID0gZmFsc2U7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICAgICAgICAgICAvLyBEb24ndCB1c2Ugb2JqY19yZXRhaW5CbG9jayBmb3IgYmxvY2sgcG9pbnRlcnMsIGJlY2F1c2Ugd2UKQEAgLTE3MTIsMTkgKzE3MjYsMTkgQEAKIAogICAgICAgICBpZiAobHQgPT0gUXVhbGlmaWVyczo6T0NMX1dlYWspIHsKICAgICAgICAgICBFbWl0QVJDSW5pdFdlYWsoRGVjbFB0ciwgQXJnKTsKLSAgICAgICAgICBkb1N0b3JlID0gZmFsc2U7IC8vIFRoZSB3ZWFrIGluaXQgaXMgYSBzdG9yZSwgbm8gbmVlZCB0byBkbyB0d28uCisgICAgICAgICAgRG9TdG9yZSA9IGZhbHNlOyAvLyBUaGUgd2VhayBpbml0IGlzIGEgc3RvcmUsIG5vIG5lZWQgdG8gZG8gdHdvLgogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIC8vIEVudGVyIHRoZSBjbGVhbnVwIHNjb3BlLgogICAgICAgRW1pdEF1dG9WYXJXaXRoTGlmZXRpbWUoKnRoaXMsIEQsIERlY2xQdHIsIGx0KTsKICAgICB9Ci0KLSAgICAvLyBTdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZSBpbnRvIHRoZSBhbGxvY2EuCi0gICAgaWYgKGRvU3RvcmUpCi0gICAgICBFbWl0U3RvcmVPZlNjYWxhcihBcmcsIGx2LCAvKiBpc0luaXRpYWxpemF0aW9uICovIHRydWUpOwogICB9CiAKKyAgLy8gU3RvcmUgdGhlIGluaXRpYWwgdmFsdWUgaW50byB0aGUgYWxsb2NhLgorICBpZiAoRG9TdG9yZSkKKyAgICBFbWl0U3RvcmVPZlNjYWxhcihBcmcsIGx2LCAvKiBpc0luaXRpYWxpemF0aW9uICovIHRydWUpOworCiAgIGxsdm06OlZhbHVlIComRE1FbnRyeSA9IExvY2FsRGVjbE1hcFsmRF07CiAgIGFzc2VydChETUVudHJ5ID09IDAgJiYgIkRlY2wgYWxyZWFkeSBleGlzdHMgaW4gbG9jYWxkZWNsbWFwISIpOwogICBETUVudHJ5ID0gRGVjbFB0cjsKZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHRGVjbENYWC5jcHAgYi9saWIvQ29kZUdlbi9DR0RlY2xDWFguY3BwCmluZGV4IDdiZGI5ZWIuLmJjODYyMGQgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NHRGVjbENYWC5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ0dEZWNsQ1hYLmNwcApAQCAtMjgxLDkgKzI4MSw4IEBACiAgICAgLy8gRklYTUU6IFdlIG9ubHkgbmVlZCB0byByZWdpc3RlciBvbmUgX19jeGFfdGhyZWFkX2F0ZXhpdCBmdW5jdGlvbiBmb3IgdGhlCiAgICAgLy8gZW50aXJlIFRVLgogICAgIENYWFRocmVhZExvY2FsSW5pdHMucHVzaF9iYWNrKEZuKTsKLSAgfSBlbHNlIGlmIChELT5oYXNBdHRyPEluaXRQcmlvcml0eUF0dHI+KCkpIHsKLSAgICB1bnNpZ25lZCBpbnQgb3JkZXIgPSBELT5nZXRBdHRyPEluaXRQcmlvcml0eUF0dHI+KCktPmdldFByaW9yaXR5KCk7Ci0gICAgT3JkZXJHbG9iYWxJbml0cyBLZXkob3JkZXIsIFByaW9yaXRpemVkQ1hYR2xvYmFsSW5pdHMuc2l6ZSgpKTsKKyAgfSBlbHNlIGlmIChjb25zdCBJbml0UHJpb3JpdHlBdHRyICpJUEEgPSBELT5nZXRBdHRyPEluaXRQcmlvcml0eUF0dHI+KCkpIHsKKyAgICBPcmRlckdsb2JhbEluaXRzIEtleShJUEEtPmdldFByaW9yaXR5KCksIFByaW9yaXRpemVkQ1hYR2xvYmFsSW5pdHMuc2l6ZSgpKTsKICAgICBQcmlvcml0aXplZENYWEdsb2JhbEluaXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihLZXksIEZuKSk7CiAgICAgRGVsYXllZENYWEluaXRQb3NpdGlvbi5lcmFzZShEKTsKICAgfSBlbHNlIGlmIChELT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpICE9IFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uICYmCkBAIC01MDMsMTEgKzUwMiw5IEBACiAgIEZ1bmN0aW9uQXJnTGlzdCBhcmdzOwogICBJbXBsaWNpdFBhcmFtRGVjbCBkc3QoMCwgU291cmNlTG9jYXRpb24oKSwgMCwgZ2V0Q29udGV4dCgpLlZvaWRQdHJUeSk7CiAgIGFyZ3MucHVzaF9iYWNrKCZkc3QpOwotICAKLSAgY29uc3QgQ0dGdW5jdGlvbkluZm8gJkZJID0gCi0gICAgQ0dNLmdldFR5cGVzKCkuYXJyYW5nZUZ1bmN0aW9uRGVjbGFyYXRpb24oZ2V0Q29udGV4dCgpLlZvaWRUeSwgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblR5cGU6OkV4dEluZm8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnZhcmlhZGljKi8gZmFsc2UpOworCisgIGNvbnN0IENHRnVuY3Rpb25JbmZvICZGSSA9IENHTS5nZXRUeXBlcygpLmFycmFuZ2VGcmVlRnVuY3Rpb25EZWNsYXJhdGlvbigKKyAgICAgIGdldENvbnRleHQoKS5Wb2lkVHksIGFyZ3MsIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbygpLCAvKnZhcmlhZGljPSovZmFsc2UpOwogICBsbHZtOjpGdW5jdGlvblR5cGUgKkZUeSA9IENHTS5nZXRUeXBlcygpLkdldEZ1bmN0aW9uVHlwZShGSSk7CiAgIGxsdm06OkZ1bmN0aW9uICpmbiA9IAogICAgIENyZWF0ZUdsb2JhbEluaXRPckRlc3RydWN0RnVuY3Rpb24oQ0dNLCBGVHksICJfX2N4eF9nbG9iYWxfYXJyYXlfZHRvciIpOwpkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ0dFeGNlcHRpb24uY3BwIGIvbGliL0NvZGVHZW4vQ0dFeGNlcHRpb24uY3BwCmluZGV4IDM5YTk5MmEuLmNhMzE3MTcgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NHRXhjZXB0aW9uLmNwcAorKysgYi9saWIvQ29kZUdlbi9DR0V4Y2VwdGlvbi5jcHAKQEAgLTE3LDggKzE3LDggQEAKICNpbmNsdWRlICJUYXJnZXRJbmZvLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRDWFguaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE9iakMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCiAjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhbGxTaXRlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIHVzaW5nIG5hbWVzcGFjZSBDb2RlR2VuOwpAQCAtMjYzLDEyICsyNjMsOSBAQAogLy8vIENoZWNrIHdoZXRoZXIgYSBwZXJzb25hbGl0eSBmdW5jdGlvbiBjb3VsZCByZWFzb25hYmx5IGJlIHN3YXBwZWQKIC8vLyBmb3IgYSBDKysgcGVyc29uYWxpdHkgZnVuY3Rpb24uCiBzdGF0aWMgYm9vbCBQZXJzb25hbGl0eUhhc09ubHlDWFhVc2VzKGxsdm06OkNvbnN0YW50ICpGbikgewotICBmb3IgKGxsdm06OkNvbnN0YW50Ojp1c2VfaXRlcmF0b3IKLSAgICAgICAgIEkgPSBGbi0+dXNlX2JlZ2luKCksIEUgPSBGbi0+dXNlX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGxsdm06OlVzZXIgKlVzZXIgPSAqSTsKLQorICBmb3IgKGxsdm06OlVzZXIgKlUgOiBGbi0+dXNlcnMoKSkgewogICAgIC8vIENvbmRpdGlvbmFsbHkgd2hpdGUtbGlzdCBiaXRjYXN0cy4KLSAgICBpZiAobGx2bTo6Q29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PGxsdm06OkNvbnN0YW50RXhwcj4oVXNlcikpIHsKKyAgICBpZiAobGx2bTo6Q29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PGxsdm06OkNvbnN0YW50RXhwcj4oVSkpIHsKICAgICAgIGlmIChDRS0+Z2V0T3Bjb2RlKCkgIT0gbGx2bTo6SW5zdHJ1Y3Rpb246OkJpdENhc3QpIHJldHVybiBmYWxzZTsKICAgICAgIGlmICghUGVyc29uYWxpdHlIYXNPbmx5Q1hYVXNlcyhDRSkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTI3Niw3ICsyNzMsNyBAQAogICAgIH0KIAogICAgIC8vIE90aGVyd2lzZSwgaXQgaGFzIHRvIGJlIGEgbGFuZGluZ3BhZCBpbnN0cnVjdGlvbi4KLSAgICBsbHZtOjpMYW5kaW5nUGFkSW5zdCAqTFBJID0gZHluX2Nhc3Q8bGx2bTo6TGFuZGluZ1BhZEluc3Q+KFVzZXIpOworICAgIGxsdm06OkxhbmRpbmdQYWRJbnN0ICpMUEkgPSBkeW5fY2FzdDxsbHZtOjpMYW5kaW5nUGFkSW5zdD4oVSk7CiAgICAgaWYgKCFMUEkpIHJldHVybiBmYWxzZTsKIAogICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBMUEktPmdldE51bUNsYXVzZXMoKTsgSSAhPSBFOyArK0kpIHsKQEAgLTM2Myw3ICszNjAsNyBAQAogICBzdHJ1Y3QgRnJlZUV4Y2VwdGlvbiA6IEVIU2NvcGVTdGFjazo6Q2xlYW51cCB7CiAgICAgbGx2bTo6VmFsdWUgKmV4bjsKICAgICBGcmVlRXhjZXB0aW9uKGxsdm06OlZhbHVlICpleG4pIDogZXhuKGV4bikge30KLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgQ0dGLkVtaXROb3Vud2luZFJ1bnRpbWVDYWxsKGdldEZyZWVFeGNlcHRpb25GbihDR0YuQ0dNKSwgZXhuKTsKICAgICB9CiAgIH07CkBAIC03NjYsMTEgKzc2Myw5IEBACiAKICAgLy8gU2F2ZSB0aGUgY3VycmVudCBJUiBnZW5lcmF0aW9uIHN0YXRlLgogICBDR0J1aWxkZXJUeTo6SW5zZXJ0UG9pbnQgc2F2ZWRJUCA9IEJ1aWxkZXIuc2F2ZUFuZENsZWFySVAoKTsKLSAgU291cmNlTG9jYXRpb24gU2F2ZWRMb2NhdGlvbjsKLSAgaWYgKENHRGVidWdJbmZvICpESSA9IGdldERlYnVnSW5mbygpKSB7Ci0gICAgU2F2ZWRMb2NhdGlvbiA9IERJLT5nZXRMb2NhdGlvbigpOworICBTYXZlQW5kUmVzdG9yZUxvY2F0aW9uIEF1dG9SZXN0b3JlTG9jYXRpb24oKnRoaXMsIEJ1aWxkZXIpOworICBpZiAoQ0dEZWJ1Z0luZm8gKkRJID0gZ2V0RGVidWdJbmZvKCkpCiAgICAgREktPkVtaXRMb2NhdGlvbihCdWlsZGVyLCBDdXJFSExvY2F0aW9uKTsKLSAgfQogCiAgIGNvbnN0IEVIUGVyc29uYWxpdHkgJnBlcnNvbmFsaXR5ID0gRUhQZXJzb25hbGl0eTo6Z2V0KGdldExhbmdPcHRzKCkpOwogCkBAIC04OTIsOCArODg3LDYgQEAKIAogICAvLyBSZXN0b3JlIHRoZSBvbGQgSVIgZ2VuZXJhdGlvbiBzdGF0ZS4KICAgQnVpbGRlci5yZXN0b3JlSVAoc2F2ZWRJUCk7Ci0gIGlmIChDR0RlYnVnSW5mbyAqREkgPSBnZXREZWJ1Z0luZm8oKSkKLSAgICBESS0+RW1pdExvY2F0aW9uKEJ1aWxkZXIsIFNhdmVkTG9jYXRpb24pOwogCiAgIHJldHVybiBscGFkOwogfQpAQCAtOTE1LDcgKzkwOCw3IEBACiAgICAgQ2FsbEVuZENhdGNoKGJvb2wgTWlnaHRUaHJvdykgOiBNaWdodFRocm93KE1pZ2h0VGhyb3cpIHt9CiAgICAgYm9vbCBNaWdodFRocm93OwogCi0gICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgeworICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIG92ZXJyaWRlIHsKICAgICAgIGlmICghTWlnaHRUaHJvdykgewogICAgICAgICBDR0YuRW1pdE5vdW53aW5kUnVudGltZUNhbGwoZ2V0RW5kQ2F0Y2hGbihDR0YuQ0dNKSk7CiAgICAgICAgIHJldHVybjsKQEAgLTEyNDQsNiArMTIzNyw3IEBACiAKICAgLy8gSWYgdGhlIGNhdGNoIHdhcyBub3QgcmVxdWlyZWQsIGJhaWwgb3V0IG5vdy4KICAgaWYgKCFDYXRjaFNjb3BlLmhhc0VIQnJhbmNoZXMoKSkgeworICAgIENhdGNoU2NvcGUuY2xlYXJIYW5kbGVyQmxvY2tzKCk7CiAgICAgRUhTdGFjay5wb3BDYXRjaCgpOwogICAgIHJldHVybjsKICAgfQpAQCAtMTI5NCw2ICsxMjg4LDEwIEBACiAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY2F0Y2ggdmFyaWFibGUgYW5kIHNldCB1cCB0aGUgY2xlYW51cHMuCiAgICAgQmVnaW5DYXRjaCgqdGhpcywgQyk7CiAKKyAgICAvLyBFbWl0IHRoZSBQR08gY291bnRlciBpbmNyZW1lbnQuCisgICAgUmVnaW9uQ291bnRlciBDYXRjaENudCA9IGdldFBHT1JlZ2lvbkNvdW50ZXIoQyk7CisgICAgQ2F0Y2hDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CisKICAgICAvLyBQZXJmb3JtIHRoZSBib2R5IG9mIHRoZSBjYXRjaC4KICAgICBFbWl0U3RtdChDLT5nZXRIYW5kbGVyQmxvY2soKSk7CiAKQEAgLTEzMjAsNyArMTMxOCw5IEBACiAgICAgICBCdWlsZGVyLkNyZWF0ZUJyKENvbnRCQik7CiAgIH0KIAorICBSZWdpb25Db3VudGVyIENvbnRDbnQgPSBnZXRQR09SZWdpb25Db3VudGVyKCZTKTsKICAgRW1pdEJsb2NrKENvbnRCQik7CisgIENvbnRDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CiB9CiAKIG5hbWVzcGFjZSB7CkBAIC0xMzMwLDcgKzEzMzAsNyBAQAogICAgIENhbGxFbmRDYXRjaEZvckZpbmFsbHkobGx2bTo6VmFsdWUgKkZvckVIVmFyLCBsbHZtOjpWYWx1ZSAqRW5kQ2F0Y2hGbikKICAgICAgIDogRm9yRUhWYXIoRm9yRUhWYXIpLCBFbmRDYXRjaEZuKEVuZENhdGNoRm4pIHt9CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgbGx2bTo6QmFzaWNCbG9jayAqRW5kQ2F0Y2hCQiA9IENHRi5jcmVhdGVCYXNpY0Jsb2NrKCJmaW5hbGx5LmVuZGNhdGNoIik7CiAgICAgICBsbHZtOjpCYXNpY0Jsb2NrICpDbGVhbnVwQ29udEJCID0KICAgICAgICAgQ0dGLmNyZWF0ZUJhc2ljQmxvY2soImZpbmFsbHkuY2xlYW51cC5jb250Iik7CkBAIC0xMzU3LDcgKzEzNTcsNyBAQAogICAgICAgOiBCb2R5KEJvZHkpLCBGb3JFSFZhcihGb3JFSFZhciksIEVuZENhdGNoRm4oRW5kQ2F0Y2hGbiksCiAgICAgICAgIFJldGhyb3dGbihSZXRocm93Rm4pLCBTYXZlZEV4blZhcihTYXZlZEV4blZhcikge30KIAotICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSBvdmVycmlkZSB7CiAgICAgICAvLyBFbnRlciBhIGNsZWFudXAgdG8gY2FsbCB0aGUgZW5kLWNhdGNoIGZ1bmN0aW9uIGlmIG9uZSB3YXMgcHJvdmlkZWQuCiAgICAgICBpZiAoRW5kQ2F0Y2hGbikKICAgICAgICAgQ0dGLkVIU3RhY2sucHVzaENsZWFudXA8Q2FsbEVuZENhdGNoRm9yRmluYWxseT4oTm9ybWFsQW5kRUhDbGVhbnVwLApkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ0dFeHByLmNwcCBiL2xpYi9Db2RlR2VuL0NHRXhwci5jcHAKaW5kZXggY2I5OTBiMi4uMWJkZDA5NCAxMDA2NDQKLS0tIGEvbGliL0NvZGVHZW4vQ0dFeHByLmNwcAorKysgYi9saWIvQ29kZUdlbi9DR0V4cHIuY3BwCkBAIC04NSw2ICs4NSw3IEBACiAvLy8gRXZhbHVhdGVFeHByQXNCb29sIC0gUGVyZm9ybSB0aGUgdXN1YWwgdW5hcnkgY29udmVyc2lvbnMgb24gdGhlIHNwZWNpZmllZAogLy8vIGV4cHJlc3Npb24gYW5kIGNvbXBhcmUgdGhlIHJlc3VsdCBhZ2FpbnN0IHplcm8sIHJldHVybmluZyBhbiBJbnQxVHkgdmFsdWUuCiBsbHZtOjpWYWx1ZSAqQ29kZUdlbkZ1bmN0aW9uOjpFdmFsdWF0ZUV4cHJBc0Jvb2woY29uc3QgRXhwciAqRSkgeworICBQR08uc2V0Q3VycmVudFN0bXQoRSk7CiAgIGlmIChjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUID0gRS0+Z2V0VHlwZSgpLT5nZXRBczxNZW1iZXJQb2ludGVyVHlwZT4oKSkgewogICAgIGxsdm06OlZhbHVlICpNZW1QdHIgPSBFbWl0U2NhbGFyRXhwcihFKTsKICAgICByZXR1cm4gQ0dNLmdldENYWEFCSSgpLkVtaXRNZW1iZXJQb2ludGVySXNOb3ROdWxsKCp0aGlzLCBNZW1QdHIsIE1QVCk7CkBAIC0zODksNyArMzkwLDcgQEAKICAgICBjYXNlIFN1Ym9iamVjdEFkanVzdG1lbnQ6Ok1lbWJlclBvaW50ZXJBZGp1c3RtZW50OiB7CiAgICAgICBsbHZtOjpWYWx1ZSAqUHRyID0gRW1pdFNjYWxhckV4cHIoQWRqdXN0bWVudC5QdHIuUkhTKTsKICAgICAgIE9iamVjdCA9IENHTS5nZXRDWFhBQkkoKS5FbWl0TWVtYmVyRGF0YVBvaW50ZXJBZGRyZXNzKAotICAgICAgICAgICAgICAgICAgICAqdGhpcywgT2JqZWN0LCBQdHIsIEFkanVzdG1lbnQuUHRyLk1QVCk7CisgICAgICAgICAgKnRoaXMsIEUsIE9iamVjdCwgUHRyLCBBZGp1c3RtZW50LlB0ci5NUFQpOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIH0KQEAgLTE2OTAsMTEgKzE2OTEsMTYgQEAKIAogc3RhdGljIExWYWx1ZSBFbWl0R2xvYmFsVmFyRGVjbExWYWx1ZShDb2RlR2VuRnVuY3Rpb24gJkNHRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqRSwgY29uc3QgVmFyRGVjbCAqVkQpIHsKKyAgUXVhbFR5cGUgVCA9IEUtPmdldFR5cGUoKTsKKworICAvLyBJZiBpdCdzIHRocmVhZF9sb2NhbCwgZW1pdCBhIGNhbGwgdG8gaXRzIHdyYXBwZXIgZnVuY3Rpb24gaW5zdGVhZC4KKyAgaWYgKFZELT5nZXRUTFNLaW5kKCkgPT0gVmFyRGVjbDo6VExTX0R5bmFtaWMpCisgICAgcmV0dXJuIENHRi5DR00uZ2V0Q1hYQUJJKCkuRW1pdFRocmVhZExvY2FsVmFyRGVjbExWYWx1ZShDR0YsIFZELCBUKTsKKwogICBsbHZtOjpWYWx1ZSAqViA9IENHRi5DR00uR2V0QWRkck9mR2xvYmFsVmFyKFZEKTsKICAgbGx2bTo6VHlwZSAqUmVhbFZhclR5ID0gQ0dGLmdldFR5cGVzKCkuQ29udmVydFR5cGVGb3JNZW0oVkQtPmdldFR5cGUoKSk7CiAgIFYgPSBFbWl0Qml0Q2FzdE9mTFZhbHVlVG9Qcm9wZXJUeXBlKENHRiwgViwgUmVhbFZhclR5KTsKICAgQ2hhclVuaXRzIEFsaWdubWVudCA9IENHRi5nZXRDb250ZXh0KCkuZ2V0RGVjbEFsaWduKFZEKTsKLSAgUXVhbFR5cGUgVCA9IEUtPmdldFR5cGUoKTsKICAgTFZhbHVlIExWOwogICBpZiAoVkQtPmdldFR5cGUoKS0+aXNSZWZlcmVuY2VUeXBlKCkpIHsKICAgICBsbHZtOjpMb2FkSW5zdCAqTEkgPSBDR0YuQnVpbGRlci5DcmVhdGVMb2FkKFYpOwpAQCAtMTcwMiw3ICsxNzA4LDcgQEAKICAgICBWID0gTEk7CiAgICAgTFYgPSBDR0YuTWFrZU5hdHVyYWxBbGlnbkFkZHJMVmFsdWUoViwgVCk7CiAgIH0gZWxzZSB7Ci0gICAgTFYgPSBDR0YuTWFrZUFkZHJMVmFsdWUoViwgRS0+Z2V0VHlwZSgpLCBBbGlnbm1lbnQpOworICAgIExWID0gQ0dGLk1ha2VBZGRyTFZhbHVlKFYsIFQsIEFsaWdubWVudCk7CiAgIH0KICAgc2V0T2JqQ0dDTFZhbHVlQ2xhc3MoQ0dGLmdldENvbnRleHQoKSwgRSwgTFYpOwogICByZXR1cm4gTFY7CkBAIC0xNzE4LDcgKzE3MjQsNyBAQAogICAgICAgLy8gaXNuJ3QgdGhlIHNhbWUgYXMgdGhlIHR5cGUgb2YgYSB1c2UuICBDb3JyZWN0IGZvciB0aGlzIHdpdGggYQogICAgICAgLy8gYml0Y2FzdC4KICAgICAgIFF1YWxUeXBlIE5vUHJvdG9UeXBlID0KLSAgICAgICAgICBDR0YuZ2V0Q29udGV4dCgpLmdldEZ1bmN0aW9uTm9Qcm90b1R5cGUoUHJvdG8tPmdldFJlc3VsdFR5cGUoKSk7CisgICAgICAgICAgQ0dGLmdldENvbnRleHQoKS5nZXRGdW5jdGlvbk5vUHJvdG9UeXBlKFByb3RvLT5nZXRSZXR1cm5UeXBlKCkpOwogICAgICAgTm9Qcm90b1R5cGUgPSBDR0YuZ2V0Q29udGV4dCgpLmdldFBvaW50ZXJUeXBlKE5vUHJvdG9UeXBlKTsKICAgICAgIFYgPSBDR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KFYsIENHRi5Db252ZXJ0VHlwZShOb1Byb3RvVHlwZSkpOwogICAgIH0KQEAgLTE3NjksMTIgKzE3NzUsOCBAQAogCiAgIGlmIChjb25zdCBWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KE5EKSkgewogICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBnbG9iYWwgdmFyaWFibGUuCi0gICAgaWYgKFZELT5oYXNMaW5rYWdlKCkgfHwgVkQtPmlzU3RhdGljRGF0YU1lbWJlcigpKSB7Ci0gICAgICAvLyBJZiBpdCdzIHRocmVhZF9sb2NhbCwgZW1pdCBhIGNhbGwgdG8gaXRzIHdyYXBwZXIgZnVuY3Rpb24gaW5zdGVhZC4KLSAgICAgIGlmIChWRC0+Z2V0VExTS2luZCgpID09IFZhckRlY2w6OlRMU19EeW5hbWljKQotICAgICAgICByZXR1cm4gQ0dNLmdldENYWEFCSSgpLkVtaXRUaHJlYWRMb2NhbERlY2xSZWZFeHByKCp0aGlzLCBFKTsKKyAgICBpZiAoVkQtPmhhc0xpbmthZ2UoKSB8fCBWRC0+aXNTdGF0aWNEYXRhTWVtYmVyKCkpCiAgICAgICByZXR1cm4gRW1pdEdsb2JhbFZhckRlY2xMVmFsdWUoKnRoaXMsIEUsIFZEKTsKLSAgICB9CiAKICAgICBib29sIGlzQmxvY2tWYXJpYWJsZSA9IFZELT5oYXNBdHRyPEJsb2Nrc0F0dHI+KCk7CiAKQEAgLTI2NTEsNiArMjY1Myw3IEBACiAgIH0KIAogICBPcGFxdWVWYWx1ZU1hcHBpbmcgYmluZGluZygqdGhpcywgZXhwcik7CisgIFJlZ2lvbkNvdW50ZXIgQ250ID0gZ2V0UEdPUmVnaW9uQ291bnRlcihleHByKTsKIAogICBjb25zdCBFeHByICpjb25kRXhwciA9IGV4cHItPmdldENvbmQoKTsKICAgYm9vbCBDb25kRXhwckJvb2w7CkBAIC0yNjU4LDggKzI2NjEsMTIgQEAKICAgICBjb25zdCBFeHByICpsaXZlID0gZXhwci0+Z2V0VHJ1ZUV4cHIoKSwgKmRlYWQgPSBleHByLT5nZXRGYWxzZUV4cHIoKTsKICAgICBpZiAoIUNvbmRFeHByQm9vbCkgc3RkOjpzd2FwKGxpdmUsIGRlYWQpOwogCi0gICAgaWYgKCFDb250YWluc0xhYmVsKGRlYWQpKQorICAgIGlmICghQ29udGFpbnNMYWJlbChkZWFkKSkgeworICAgICAgLy8gSWYgdGhlIHRydWUgY2FzZSBpcyBsaXZlLCB3ZSBuZWVkIHRvIHRyYWNrIGl0cyByZWdpb24uCisgICAgICBpZiAoQ29uZEV4cHJCb29sKQorICAgICAgICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CiAgICAgICByZXR1cm4gRW1pdExWYWx1ZShsaXZlKTsKKyAgICB9CiAgIH0KIAogICBsbHZtOjpCYXNpY0Jsb2NrICpsaHNCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soImNvbmQudHJ1ZSIpOwpAQCAtMjY2NywxMCArMjY3NCwxMSBAQAogICBsbHZtOjpCYXNpY0Jsb2NrICpjb250QmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJjb25kLmVuZCIpOwogCiAgIENvbmRpdGlvbmFsRXZhbHVhdGlvbiBldmFsKCp0aGlzKTsKLSAgRW1pdEJyYW5jaE9uQm9vbEV4cHIoY29uZEV4cHIsIGxoc0Jsb2NrLCByaHNCbG9jayk7CisgIEVtaXRCcmFuY2hPbkJvb2xFeHByKGNvbmRFeHByLCBsaHNCbG9jaywgcmhzQmxvY2ssIENudC5nZXRDb3VudCgpKTsKIAogICAvLyBBbnkgdGVtcG9yYXJpZXMgY3JlYXRlZCBoZXJlIGFyZSBjb25kaXRpb25hbC4KICAgRW1pdEJsb2NrKGxoc0Jsb2NrKTsKKyAgQ250LmJlZ2luUmVnaW9uKEJ1aWxkZXIpOwogICBldmFsLmJlZ2luKCp0aGlzKTsKICAgTFZhbHVlIGxocyA9IEVtaXRMVmFsdWUoZXhwci0+Z2V0VHJ1ZUV4cHIoKSk7CiAgIGV2YWwuZW5kKCp0aGlzKTsKQEAgLTI3NDQsNiArMjc1Miw3IEBACiAgIGNhc2UgQ0tfQVJDUmVjbGFpbVJldHVybmVkT2JqZWN0OgogICBjYXNlIENLX0FSQ0V4dGVuZEJsb2NrT2JqZWN0OgogICBjYXNlIENLX0NvcHlBbmRBdXRvcmVsZWFzZUJsb2NrT2JqZWN0OgorICBjYXNlIENLX0FkZHJlc3NTcGFjZUNvbnZlcnNpb246CiAgICAgcmV0dXJuIEVtaXRVbnN1cHBvcnRlZExWYWx1ZShFLCAidW5leHBlY3RlZCBjYXN0IGx2YWx1ZSIpOwogCiAgIGNhc2UgQ0tfRGVwZW5kZW50OgpAQCAtMzA2MSw3ICszMDcwLDcgQEAKICAgaWYgKCFSVi5pc1NjYWxhcigpKQogICAgIHJldHVybiBNYWtlQWRkckxWYWx1ZShSVi5nZXRBZ2dyZWdhdGVBZGRyKCksIEUtPmdldFR5cGUoKSk7CiAKLSAgYXNzZXJ0KEUtPmdldE1ldGhvZERlY2woKS0+Z2V0UmVzdWx0VHlwZSgpLT5pc1JlZmVyZW5jZVR5cGUoKSAmJgorICBhc3NlcnQoRS0+Z2V0TWV0aG9kRGVjbCgpLT5nZXRSZXR1cm5UeXBlKCktPmlzUmVmZXJlbmNlVHlwZSgpICYmCiAgICAgICAgICAiQ2FuJ3QgaGF2ZSBhIHNjYWxhciByZXR1cm4gdW5sZXNzIHRoZSByZXR1cm4gdHlwZSBpcyBhICIKICAgICAgICAgICJyZWZlcmVuY2UgdHlwZSEiKTsKIApAQCAtMzIzMSw4ICszMjQwLDggQEAKICAgY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVAogICAgID0gRS0+Z2V0UkhTKCktPmdldFR5cGUoKS0+Z2V0QXM8TWVtYmVyUG9pbnRlclR5cGU+KCk7CiAKLSAgbGx2bTo6VmFsdWUgKkFkZFYgPQotICAgIENHTS5nZXRDWFhBQkkoKS5FbWl0TWVtYmVyRGF0YVBvaW50ZXJBZGRyZXNzKCp0aGlzLCBCYXNlViwgT2Zmc2V0ViwgTVBUKTsKKyAgbGx2bTo6VmFsdWUgKkFkZFYgPSBDR00uZ2V0Q1hYQUJJKCkuRW1pdE1lbWJlckRhdGFQb2ludGVyQWRkcmVzcygKKyAgICAgICp0aGlzLCBFLCBCYXNlViwgT2Zmc2V0ViwgTVBUKTsKIAogICByZXR1cm4gTWFrZUFkZHJMVmFsdWUoQWRkViwgTVBULT5nZXRQb2ludGVlVHlwZSgpKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHRXhwckFnZy5jcHAgYi9saWIvQ29kZUdlbi9DR0V4cHJBZ2cuY3BwCmluZGV4IDlkMGYzYTkuLjZjNTA1MjEgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NHRXhwckFnZy5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ0dFeHByQWdnLmNwcApAQCAtNzEzLDYgKzcxMyw3IEBACiAgIGNhc2UgQ0tfQ29weUFuZEF1dG9yZWxlYXNlQmxvY2tPYmplY3Q6CiAgIGNhc2UgQ0tfQnVpbHRpbkZuVG9GblB0cjoKICAgY2FzZSBDS19aZXJvVG9PQ0xFdmVudDoKKyAgY2FzZSBDS19BZGRyZXNzU3BhY2VDb252ZXJzaW9uOgogICAgIGxsdm1fdW5yZWFjaGFibGUoImNhc3Qga2luZCBpbnZhbGlkIGZvciBhZ2dyZWdhdGUgdHlwZXMiKTsKICAgfQogfQpAQCAtODkxLDE0ICs4OTIsMTYgQEAKICAgLy8gQmluZCB0aGUgY29tbW9uIGV4cHJlc3Npb24gaWYgbmVjZXNzYXJ5LgogICBDb2RlR2VuRnVuY3Rpb246Ok9wYXF1ZVZhbHVlTWFwcGluZyBiaW5kaW5nKENHRiwgRSk7CiAKKyAgUmVnaW9uQ291bnRlciBDbnQgPSBDR0YuZ2V0UEdPUmVnaW9uQ291bnRlcihFKTsKICAgQ29kZUdlbkZ1bmN0aW9uOjpDb25kaXRpb25hbEV2YWx1YXRpb24gZXZhbChDR0YpOwotICBDR0YuRW1pdEJyYW5jaE9uQm9vbEV4cHIoRS0+Z2V0Q29uZCgpLCBMSFNCbG9jaywgUkhTQmxvY2spOworICBDR0YuRW1pdEJyYW5jaE9uQm9vbEV4cHIoRS0+Z2V0Q29uZCgpLCBMSFNCbG9jaywgUkhTQmxvY2ssIENudC5nZXRDb3VudCgpKTsKIAogICAvLyBTYXZlIHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uJ3MgbGlmZXRpbWUgaXMgZXh0ZXJuYWxseSBtYW5hZ2VkLgogICBib29sIGlzRXh0ZXJuYWxseURlc3RydWN0ZWQgPSBEZXN0LmlzRXh0ZXJuYWxseURlc3RydWN0ZWQoKTsKIAogICBldmFsLmJlZ2luKENHRik7CiAgIENHRi5FbWl0QmxvY2soTEhTQmxvY2spOworICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CiAgIFZpc2l0KEUtPmdldFRydWVFeHByKCkpOwogICBldmFsLmVuZChDR0YpOwogCkBAIC05MjgsNyArOTMxLDExIEBACiAgIGxsdm06OlZhbHVlICpBcmdQdHIgPSBDR0YuRW1pdFZBQXJnKEFyZ1ZhbHVlLCBWRS0+Z2V0VHlwZSgpKTsKIAogICBpZiAoIUFyZ1B0cikgewotICAgIENHRi5FcnJvclVuc3VwcG9ydGVkKFZFLCAiYWdncmVnYXRlIHZhX2FyZyBleHByZXNzaW9uIik7CisgICAgLy8gSWYgRW1pdFZBQXJnIGZhaWxzLCB3ZSBmYWxsIGJhY2sgdG8gdGhlIExMVk0gaW5zdHJ1Y3Rpb24uCisgICAgbGx2bTo6VmFsdWUgKlZhbCA9CisgICAgICAgIEJ1aWxkZXIuQ3JlYXRlVkFBcmcoQXJnVmFsdWUsIENHRi5Db252ZXJ0VHlwZShWRS0+Z2V0VHlwZSgpKSk7CisgICAgaWYgKCFEZXN0LmlzSWdub3JlZCgpKQorICAgICAgQnVpbGRlci5DcmVhdGVTdG9yZShWYWwsIERlc3QuZ2V0QWRkcigpKTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtMTEzNCw5ICsxMTQxLDcgQEAKICNpZm5kZWYgTkRFQlVHCiAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBpdCdzIHJlYWxseSBhbiBlbXB0eSBhbmQgbm90IGEgZmFpbHVyZSBvZgogICAgICAgLy8gc2VtYW50aWMgYW5hbHlzaXMuCi0gICAgICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEZpZWxkID0gcmVjb3JkLT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEVuZCA9IHJlY29yZC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgICAgIEZpZWxkICE9IEZpZWxkRW5kOyArK0ZpZWxkKQorICAgICAgZm9yIChjb25zdCBhdXRvICpGaWVsZCA6IHJlY29yZC0+ZmllbGRzKCkpCiAgICAgICAgIGFzc2VydChGaWVsZC0+aXNVbm5hbWVkQml0ZmllbGQoKSAmJiAiT25seSB1bm5hbWVkIGJpdGZpZWxkcyBhbGxvd2VkIik7CiAjZW5kaWYKICAgICAgIHJldHVybjsKQEAgLTExNjUsOSArMTE3MCw3IEBACiAgIC8vIEhlcmUgd2UgaXRlcmF0ZSBvdmVyIHRoZSBmaWVsZHM7IHRoaXMgbWFrZXMgaXQgc2ltcGxlciB0byBib3RoCiAgIC8vIGRlZmF1bHQtaW5pdGlhbGl6ZSBmaWVsZHMgYW5kIHNraXAgb3ZlciB1bm5hbWVkIGZpZWxkcy4KICAgdW5zaWduZWQgY3VySW5pdEluZGV4ID0gMDsKLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBmaWVsZCA9IHJlY29yZC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEVuZCA9IHJlY29yZC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgZmllbGQgIT0gZmllbGRFbmQ7ICsrZmllbGQpIHsKKyAgZm9yIChjb25zdCBhdXRvICpmaWVsZCA6IHJlY29yZC0+ZmllbGRzKCkpIHsKICAgICAvLyBXZSdyZSBkb25lIG9uY2Ugd2UgaGl0IHRoZSBmbGV4aWJsZSBhcnJheSBtZW1iZXIuCiAgICAgaWYgKGZpZWxkLT5nZXRUeXBlKCktPmlzSW5jb21wbGV0ZUFycmF5VHlwZSgpKQogICAgICAgYnJlYWs7CkBAIC0xMTg0LDcgKzExODcsNyBAQAogICAgICAgYnJlYWs7CiAgICAgCiAKLSAgICBMVmFsdWUgTFYgPSBDR0YuRW1pdExWYWx1ZUZvckZpZWxkSW5pdGlhbGl6YXRpb24oRGVzdExWLCAqZmllbGQpOworICAgIExWYWx1ZSBMViA9IENHRi5FbWl0TFZhbHVlRm9yRmllbGRJbml0aWFsaXphdGlvbihEZXN0TFYsIGZpZWxkKTsKICAgICAvLyBXZSBuZXZlciBnZW5lcmF0ZSB3cml0ZS1iYXJyaWVzIGZvciBpbml0aWFsaXplZCBmaWVsZHMuCiAgICAgTFYuc2V0Tm9uR0ModHJ1ZSk7CiAgICAgCkBAIC0xMjYxLDggKzEyNjQsNyBAQAogICAgICAgQ2hhclVuaXRzIE51bU5vblplcm9CeXRlcyA9IENoYXJVbml0czo6WmVybygpOwogICAgICAgCiAgICAgICB1bnNpZ25lZCBJTEVFbGVtZW50ID0gMDsKLSAgICAgIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRmllbGQgPSBTRC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICAgRmllbGRFbmQgPSBTRC0+ZmllbGRfZW5kKCk7IEZpZWxkICE9IEZpZWxkRW5kOyArK0ZpZWxkKSB7CisgICAgICBmb3IgKGNvbnN0IGF1dG8gKkZpZWxkIDogU0QtPmZpZWxkcygpKSB7CiAgICAgICAgIC8vIFdlJ3JlIGRvbmUgb25jZSB3ZSBoaXQgdGhlIGZsZXhpYmxlIGFycmF5IG1lbWJlciBvciBydW4gb3V0IG9mCiAgICAgICAgIC8vIEluaXRMaXN0RXhwciBlbGVtZW50cy4KICAgICAgICAgaWYgKEZpZWxkLT5nZXRUeXBlKCktPmlzSW5jb21wbGV0ZUFycmF5VHlwZSgpIHx8CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR0V4cHJDWFguY3BwIGIvbGliL0NvZGVHZW4vQ0dFeHByQ1hYLmNwcAppbmRleCBjYzdiMjRkLi5mNzFhM2RlIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0V4cHJDWFguY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHRXhwckNYWC5jcHAKQEAgLTE4LDggKzE4LDggQEAKICNpbmNsdWRlICJDR09iakNSdW50aW1lLmgiCiAjaW5jbHVkZSAiY2xhbmcvQ29kZUdlbi9DR0Z1bmN0aW9uSW5mby5oIgogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0NvZGVHZW5PcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgogI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiB1c2luZyBuYW1lc3BhY2UgQ29kZUdlbjsKQEAgLTExOSw4ICsxMTksOCBAQAogICAgIC8vIHR5cGUgb2YgTUQgYW5kIGhhcyBhIHByZWZpeC4KICAgICAvLyBGb3Igbm93IHdlIGp1c3QgYXZvaWQgZGV2aXJ0dWFsaXppbmcgdGhlc2UgY292YXJpYW50IGNhc2VzLgogICAgIGlmIChEZXZpcnR1YWxpemVkTWV0aG9kICYmCi0gICAgICAgIERldmlydHVhbGl6ZWRNZXRob2QtPmdldFJlc3VsdFR5cGUoKS5nZXRDYW5vbmljYWxUeXBlKCkgIT0KLSAgICAgICAgTUQtPmdldFJlc3VsdFR5cGUoKS5nZXRDYW5vbmljYWxUeXBlKCkpCisgICAgICAgIERldmlydHVhbGl6ZWRNZXRob2QtPmdldFJldHVyblR5cGUoKS5nZXRDYW5vbmljYWxUeXBlKCkgIT0KKyAgICAgICAgICAgIE1ELT5nZXRSZXR1cm5UeXBlKCkuZ2V0Q2Fub25pY2FsVHlwZSgpKQogICAgICAgRGV2aXJ0dWFsaXplZE1ldGhvZCA9IE5VTEw7CiAgIH0KIApAQCAtMjIwLDggKzIyMCwxMCBAQAogICAgIH0KICAgfQogCi0gIGlmIChNRC0+aXNWaXJ0dWFsKCkpCi0gICAgVGhpcyA9IENHTS5nZXRDWFhBQkkoKS5hZGp1c3RUaGlzQXJndW1lbnRGb3JWaXJ0dWFsQ2FsbCgqdGhpcywgTUQsIFRoaXMpOworICBpZiAoTUQtPmlzVmlydHVhbCgpKSB7CisgICAgVGhpcyA9IENHTS5nZXRDWFhBQkkoKS5hZGp1c3RUaGlzQXJndW1lbnRGb3JWaXJ0dWFsRnVuY3Rpb25DYWxsKAorICAgICAgICAqdGhpcywgTUQsIFRoaXMsIFVzZVZpcnR1YWxDYWxsKTsKKyAgfQogCiAgIHJldHVybiBFbWl0Q1hYTWVtYmVyQ2FsbChNRCwgQ0UtPmdldEV4cHJMb2MoKSwgQ2FsbGVlLCBSZXR1cm5WYWx1ZSwgVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSW1wbGljaXRQYXJhbT0qLzAsIFF1YWxUeXBlKCksCkBAIC0yNjAsNyArMjYyLDcgQEAKIAogICAvLyBBc2sgdGhlIEFCSSB0byBsb2FkIHRoZSBjYWxsZWUuICBOb3RlIHRoYXQgVGhpcyBpcyBtb2RpZmllZC4KICAgbGx2bTo6VmFsdWUgKkNhbGxlZSA9Ci0gICAgQ0dNLmdldENYWEFCSSgpLkVtaXRMb2FkT2ZNZW1iZXJGdW5jdGlvblBvaW50ZXIoKnRoaXMsIFRoaXMsIE1lbUZuUHRyLCBNUFQpOworICAgIENHTS5nZXRDWFhBQkkoKS5FbWl0TG9hZE9mTWVtYmVyRnVuY3Rpb25Qb2ludGVyKCp0aGlzLCBCTywgVGhpcywgTWVtRm5QdHIsIE1QVCk7CiAgIAogICBDYWxsQXJnTGlzdCBBcmdzOwogCkBAIC0zMTYsNyArMzE4LDcgQEAKIAogICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCA9IENHRi5nZXRDb250ZXh0KCkuZ2V0QVNUUmVjb3JkTGF5b3V0KEJhc2UpOwogICBDaGFyVW5pdHMgU2l6ZSA9IExheW91dC5nZXROb25WaXJ0dWFsU2l6ZSgpOwotICBDaGFyVW5pdHMgQWxpZ24gPSBMYXlvdXQuZ2V0Tm9uVmlydHVhbEFsaWduKCk7CisgIENoYXJVbml0cyBBbGlnbiA9IExheW91dC5nZXROb25WaXJ0dWFsQWxpZ25tZW50KCk7CiAKICAgbGx2bTo6VmFsdWUgKlNpemVWYWwgPSBDR0YuQ0dNLmdldFNpemUoU2l6ZSk7CiAKQEAgLTg2NCw5ICs4NjYsMjkgQEAKICAgICBjbGVhbnVwRG9taW5hdG9yLT5lcmFzZUZyb21QYXJlbnQoKTsKICAgfQogCi0gIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgZWxlbWVudC4KLSAgbGx2bTo6VmFsdWUgKm5leHRQdHIgPSBCdWlsZGVyLkNyZWF0ZUNvbnN0R0VQMV8zMihjdXJQdHIsIDEsICJhcnJheS5uZXh0Iik7CisgIC8vIEZJWE1FOiBUaGUgY29kZSBiZWxvdyBpbnRlbmRzIHRvIGluaXRpYWxpemUgdGhlIGluZGl2aWR1YWwgYXJyYXkgYmFzZQorICAvLyBlbGVtZW50cywgb25lIGF0IGEgdGltZSAtIGJ1dCB3aGVuIGRlYWxpbmcgd2l0aCBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgLQorICAvLyB0aGUgcG9pbnRlciBhcml0aG1ldGljIGNhbiBnZXQgY29uZnVzZWQgLSBzbyB0aGUgZml4IGJlbG93IGVudGFpbHMgY2FzdGluZworICAvLyB0byB0aGUgYWxsb2NhdGVkIHR5cGUgdG8gZW5zdXJlIHRoYXQgd2UgZ2V0IHRoZSBwb2ludGVyIGFyaXRobWV0aWMgcmlnaHQuCisgIC8vIEl0IHNlZW1zIGxpa2UgdGhlIHJpZ2h0IGFwcHJvYWNoIGhlcmUsIGl0IHRvIHJlYWxseSBpbml0aWFsaXplIHRoZQorICAvLyBpbmRpdmlkdWFsIGFycmF5IGJhc2UgZWxlbWVudHMgb25lIGF0IGEgdGltZSBzaW5jZSBpdCdsbCBnZW5lcmF0ZSBsZXNzCisgIC8vIGNvZGUuIEkgdGhpbmsgdGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgd3JvbmcgdHlwZSBpcyBiZWluZyBwYXNzZWQgaW50bworICAvLyBTdG9yZUFueUV4cHJJbnRvT25lVW5pdCwgYnV0IGRpcmVjdGx5IGZpeGluZyB0aGF0IGRvZXNuJ3QgcmVhbGx5IHdvcmssCisgIC8vIGJlY2F1c2UgdGhlIEluaXQgZXhwcmVzc2lvbiBoYXMgdGhlIHdyb25nIHR5cGUgYXQgdGhpcyBwb2ludC4KKyAgLy8gU28uLi4gdGhpcyBpcyBvayBmb3IgYSBxdWljayBmaXgsIGJ1dCB3ZSBjYW4gYW5kIHNob3VsZCBkbyBhIGxvdCBiZXR0ZXIKKyAgLy8gaGVyZSBsb25nLXRlcm0uCiAKKyAgLy8gQWR2YW5jZSB0byB0aGUgbmV4dCBlbGVtZW50IGJ5IGFkanVzdGluZyB0aGUgcG9pbnRlciB0eXBlIGFzIG5lY2Vzc2FyeS4KKyAgLy8gRm9yIG5ldyBpbnRbMTBdWzIwXVszMF0sIGFsbG9jIHR5cGUgaXMgaW50WzIwXVszMF0sIGJhc2UgdHlwZSBpcyAnaW50Jy4KKyAgUXVhbFR5cGUgQWxsb2NUeXBlID0gRS0+Z2V0QWxsb2NhdGVkVHlwZSgpOworICBsbHZtOjpUeXBlICpBbGxvY1B0clR5ID0gQ29udmVydFR5cGVGb3JNZW0oQWxsb2NUeXBlKS0+Z2V0UG9pbnRlclRvKAorICAgICAgY3VyUHRyLT5nZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSk7CisgIGxsdm06OlZhbHVlICpjdXJQdHJBbGxvY1R5ID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KGN1clB0ciwgQWxsb2NQdHJUeSk7CisgIGxsdm06OlZhbHVlICpuZXh0UHRyQWxsb2NUeSA9CisgICAgICBCdWlsZGVyLkNyZWF0ZUNvbnN0R0VQMV8zMihjdXJQdHJBbGxvY1R5LCAxLCAiYXJyYXkubmV4dCIpOworICAvLyBDYXN0IGl0IGJhY2sgdG8gdGhlIGJhc2UgdHlwZSBzbyB0aGF0IHdlIGNhbiBjb21wYXJlIGl0IHRvIHRoZSBlbmRQdHIuCisgIGxsdm06OlZhbHVlICpuZXh0UHRyID0KKyAgICAgIEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChuZXh0UHRyQWxsb2NUeSwgZW5kUHRyLT5nZXRUeXBlKCkpOwogICAvLyBDaGVjayB3aGV0aGVyIHdlJ3ZlIGdvdHRlbiB0byB0aGUgZW5kIG9mIHRoZSBhcnJheSBhbmQsIGlmIHNvLAogICAvLyBleGl0IHRoZSBsb29wLgogICBsbHZtOjpWYWx1ZSAqaXNFbmQgPSBCdWlsZGVyLkNyZWF0ZUlDbXBFUShuZXh0UHRyLCBlbmRQdHIsICJhcnJheS5hdGVuZCIpOwpAQCAtOTkxLDIwICsxMDEzLDIwIEBACiAgICAgICBnZXRQbGFjZW1lbnRBcmdzKClbSV0gPSBBcmc7CiAgICAgfQogCi0gICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgeworICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIG92ZXJyaWRlIHsKICAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpGUFQKICAgICAgICAgPSBPcGVyYXRvckRlbGV0ZS0+Z2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKLSAgICAgIGFzc2VydChGUFQtPmdldE51bUFyZ3MoKSA9PSBOdW1QbGFjZW1lbnRBcmdzICsgMSB8fAotICAgICAgICAgICAgIChGUFQtPmdldE51bUFyZ3MoKSA9PSAyICYmIE51bVBsYWNlbWVudEFyZ3MgPT0gMCkpOworICAgICAgYXNzZXJ0KEZQVC0+Z2V0TnVtUGFyYW1zKCkgPT0gTnVtUGxhY2VtZW50QXJncyArIDEgfHwKKyAgICAgICAgICAgICAoRlBULT5nZXROdW1QYXJhbXMoKSA9PSAyICYmIE51bVBsYWNlbWVudEFyZ3MgPT0gMCkpOwogCiAgICAgICBDYWxsQXJnTGlzdCBEZWxldGVBcmdzOwogCiAgICAgICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYWx3YXlzIGEgdm9pZCouCi0gICAgICBGdW5jdGlvblByb3RvVHlwZTo6YXJnX3R5cGVfaXRlcmF0b3IgQUkgPSBGUFQtPmFyZ190eXBlX2JlZ2luKCk7CisgICAgICBGdW5jdGlvblByb3RvVHlwZTo6cGFyYW1fdHlwZV9pdGVyYXRvciBBSSA9IEZQVC0+cGFyYW1fdHlwZV9iZWdpbigpOwogICAgICAgRGVsZXRlQXJncy5hZGQoUlZhbHVlOjpnZXQoUHRyKSwgKkFJKyspOwogCiAgICAgICAvLyBBIG1lbWJlciAnb3BlcmF0b3IgZGVsZXRlJyBjYW4gdGFrZSBhbiBleHRyYSAnc2l6ZV90JyBhcmd1bWVudC4KLSAgICAgIGlmIChGUFQtPmdldE51bUFyZ3MoKSA9PSBOdW1QbGFjZW1lbnRBcmdzICsgMikKKyAgICAgIGlmIChGUFQtPmdldE51bVBhcmFtcygpID09IE51bVBsYWNlbWVudEFyZ3MgKyAyKQogICAgICAgICBEZWxldGVBcmdzLmFkZChSVmFsdWU6OmdldChBbGxvY1NpemUpLCAqQUkrKyk7CiAKICAgICAgIC8vIFBhc3MgdGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cywgd2hpY2ggbXVzdCBtYXRjaCBleGFjdGx5LgpAQCAtMTA0NiwyMCArMTA2OCwyMCBAQAogICAgICAgZ2V0UGxhY2VtZW50QXJncygpW0ldID0gQXJnOwogICAgIH0KIAotICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSBvdmVycmlkZSB7CiAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUCiAgICAgICAgID0gT3BlcmF0b3JEZWxldGUtPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7Ci0gICAgICBhc3NlcnQoRlBULT5nZXROdW1BcmdzKCkgPT0gTnVtUGxhY2VtZW50QXJncyArIDEgfHwKLSAgICAgICAgICAgICAoRlBULT5nZXROdW1BcmdzKCkgPT0gMiAmJiBOdW1QbGFjZW1lbnRBcmdzID09IDApKTsKKyAgICAgIGFzc2VydChGUFQtPmdldE51bVBhcmFtcygpID09IE51bVBsYWNlbWVudEFyZ3MgKyAxIHx8CisgICAgICAgICAgICAgKEZQVC0+Z2V0TnVtUGFyYW1zKCkgPT0gMiAmJiBOdW1QbGFjZW1lbnRBcmdzID09IDApKTsKIAogICAgICAgQ2FsbEFyZ0xpc3QgRGVsZXRlQXJnczsKIAogICAgICAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFsd2F5cyBhIHZvaWQqLgotICAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yIEFJID0gRlBULT5hcmdfdHlwZV9iZWdpbigpOworICAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OnBhcmFtX3R5cGVfaXRlcmF0b3IgQUkgPSBGUFQtPnBhcmFtX3R5cGVfYmVnaW4oKTsKICAgICAgIERlbGV0ZUFyZ3MuYWRkKFB0ci5yZXN0b3JlKENHRiksICpBSSsrKTsKIAogICAgICAgLy8gQSBtZW1iZXIgJ29wZXJhdG9yIGRlbGV0ZScgY2FuIHRha2UgYW4gZXh0cmEgJ3NpemVfdCcgYXJndW1lbnQuCi0gICAgICBpZiAoRlBULT5nZXROdW1BcmdzKCkgPT0gTnVtUGxhY2VtZW50QXJncyArIDIpIHsKKyAgICAgIGlmIChGUFQtPmdldE51bVBhcmFtcygpID09IE51bVBsYWNlbWVudEFyZ3MgKyAyKSB7CiAgICAgICAgIFJWYWx1ZSBSViA9IEFsbG9jU2l6ZS5yZXN0b3JlKENHRik7CiAgICAgICAgIERlbGV0ZUFyZ3MuYWRkKFJWLCAqQUkrKyk7CiAgICAgICB9CkBAIC0xMTQ1LDM1ICsxMTY3LDEyIEBACiAgIAogICBhbGxvY2F0b3JBcmdzLmFkZChSVmFsdWU6OmdldChhbGxvY1NpemUpLCBzaXplVHlwZSk7CiAKLSAgLy8gRW1pdCB0aGUgcmVzdCBvZiB0aGUgYXJndW1lbnRzLgotICAvLyBGSVhNRTogSWRlYWxseSwgdGhpcyBzaG91bGQganVzdCB1c2UgRW1pdENhbGxBcmdzLgotICBDWFhOZXdFeHByOjpjb25zdF9hcmdfaXRlcmF0b3IgcGxhY2VtZW50QXJnID0gRS0+cGxhY2VtZW50X2FyZ19iZWdpbigpOwotCi0gIC8vIEZpcnN0LCB1c2UgdGhlIHR5cGVzIGZyb20gdGhlIGZ1bmN0aW9uIHR5cGUuCiAgIC8vIFdlIHN0YXJ0IGF0IDEgaGVyZSBiZWNhdXNlIHRoZSBmaXJzdCBhcmd1bWVudCAodGhlIGFsbG9jYXRpb24gc2l6ZSkKICAgLy8gaGFzIGFscmVhZHkgYmVlbiBlbWl0dGVkLgotICBmb3IgKHVuc2lnbmVkIGkgPSAxLCBlID0gYWxsb2NhdG9yVHlwZS0+Z2V0TnVtQXJncygpOyBpICE9IGU7Ci0gICAgICAgKytpLCArK3BsYWNlbWVudEFyZykgewotICAgIFF1YWxUeXBlIGFyZ1R5cGUgPSBhbGxvY2F0b3JUeXBlLT5nZXRBcmdUeXBlKGkpOwotCi0gICAgYXNzZXJ0KGdldENvbnRleHQoKS5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKGFyZ1R5cGUuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnRBcmctPmdldFR5cGUoKSkgJiYKLSAgICAgICAgICAgInR5cGUgbWlzbWF0Y2ggaW4gY2FsbCBhcmd1bWVudCEiKTsKLQotICAgIEVtaXRDYWxsQXJnKGFsbG9jYXRvckFyZ3MsICpwbGFjZW1lbnRBcmcsIGFyZ1R5cGUpOwotICB9Ci0KLSAgLy8gRWl0aGVyIHdlJ3ZlIGVtaXR0ZWQgYWxsIHRoZSBjYWxsIGFyZ3MsIG9yIHdlIGhhdmUgYSBjYWxsIHRvIGEKLSAgLy8gdmFyaWFkaWMgZnVuY3Rpb24uCi0gIGFzc2VydCgocGxhY2VtZW50QXJnID09IEUtPnBsYWNlbWVudF9hcmdfZW5kKCkgfHwKLSAgICAgICAgICBhbGxvY2F0b3JUeXBlLT5pc1ZhcmlhZGljKCkpICYmCi0gICAgICAgICAiRXh0cmEgYXJndW1lbnRzIHRvIG5vbi12YXJpYWRpYyBmdW5jdGlvbiEiKTsKLQotICAvLyBJZiB3ZSBzdGlsbCBoYXZlIGFueSBhcmd1bWVudHMsIGVtaXQgdGhlbSB1c2luZyB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQuCi0gIGZvciAoQ1hYTmV3RXhwcjo6Y29uc3RfYXJnX2l0ZXJhdG9yIHBsYWNlbWVudEFyZ3NFbmQgPSBFLT5wbGFjZW1lbnRfYXJnX2VuZCgpOwotICAgICAgIHBsYWNlbWVudEFyZyAhPSBwbGFjZW1lbnRBcmdzRW5kOyArK3BsYWNlbWVudEFyZykgewotICAgIEVtaXRDYWxsQXJnKGFsbG9jYXRvckFyZ3MsICpwbGFjZW1lbnRBcmcsIHBsYWNlbWVudEFyZy0+Z2V0VHlwZSgpKTsKLSAgfQorICBFbWl0Q2FsbEFyZ3MoYWxsb2NhdG9yQXJncywgYWxsb2NhdG9yVHlwZS0+aXNWYXJpYWRpYygpLAorICAgICAgICAgICAgICAgYWxsb2NhdG9yVHlwZS0+cGFyYW1fdHlwZV9iZWdpbigpICsgMSwKKyAgICAgICAgICAgICAgIGFsbG9jYXRvclR5cGUtPnBhcmFtX3R5cGVfZW5kKCksIEUtPnBsYWNlbWVudF9hcmdfYmVnaW4oKSwKKyAgICAgICAgICAgICAgIEUtPnBsYWNlbWVudF9hcmdfZW5kKCkpOwogCiAgIC8vIEVtaXQgdGhlIGFsbG9jYXRpb24gY2FsbC4gIElmIHRoZSBhbGxvY2F0b3IgaXMgYSBnbG9iYWwgcGxhY2VtZW50CiAgIC8vIG9wZXJhdG9yLCBqdXN0ICJpbmxpbmUiIGl0IGRpcmVjdGx5LgpAQCAtMTI4OSwxNCArMTI4OCwxNCBAQAogICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHBhc3MgdGhlIHNpemUgdG8gdGhlIGRlbGV0ZSBvcGVyYXRvci4KICAgbGx2bTo6VmFsdWUgKlNpemUgPSAwOwogICBRdWFsVHlwZSBTaXplVHk7Ci0gIGlmIChEZWxldGVGVHktPmdldE51bUFyZ3MoKSA9PSAyKSB7Ci0gICAgU2l6ZVR5ID0gRGVsZXRlRlR5LT5nZXRBcmdUeXBlKDEpOworICBpZiAoRGVsZXRlRlR5LT5nZXROdW1QYXJhbXMoKSA9PSAyKSB7CisgICAgU2l6ZVR5ID0gRGVsZXRlRlR5LT5nZXRQYXJhbVR5cGUoMSk7CiAgICAgQ2hhclVuaXRzIERlbGV0ZVR5cGVTaXplID0gZ2V0Q29udGV4dCgpLmdldFR5cGVTaXplSW5DaGFycyhEZWxldGVUeSk7CiAgICAgU2l6ZSA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ29udmVydFR5cGUoU2l6ZVR5KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlVHlwZVNpemUuZ2V0UXVhbnRpdHkoKSk7CiAgIH0KLSAgCi0gIFF1YWxUeXBlIEFyZ1R5ID0gRGVsZXRlRlR5LT5nZXRBcmdUeXBlKDApOworCisgIFF1YWxUeXBlIEFyZ1R5ID0gRGVsZXRlRlR5LT5nZXRQYXJhbVR5cGUoMCk7CiAgIGxsdm06OlZhbHVlICpEZWxldGVQdHIgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoUHRyLCBDb252ZXJ0VHlwZShBcmdUeSkpOwogICBEZWxldGVBcmdzLmFkZChSVmFsdWU6OmdldChEZWxldGVQdHIpLCBBcmdUeSk7CiAKQEAgLTEzMTksNyArMTMxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBFbGVtZW50VHlwZSkKICAgICAgIDogUHRyKFB0ciksIE9wZXJhdG9yRGVsZXRlKE9wZXJhdG9yRGVsZXRlKSwgRWxlbWVudFR5cGUoRWxlbWVudFR5cGUpIHt9CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgQ0dGLkVtaXREZWxldGVDYWxsKE9wZXJhdG9yRGVsZXRlLCBQdHIsIEVsZW1lbnRUeXBlKTsKICAgICB9CiAgIH07CkBAIC0xNDIyLDIyICsxNDIxLDIyIEBACiAgICAgICA6IFB0cihQdHIpLCBPcGVyYXRvckRlbGV0ZShPcGVyYXRvckRlbGV0ZSksIE51bUVsZW1lbnRzKE51bUVsZW1lbnRzKSwKICAgICAgICAgRWxlbWVudFR5cGUoRWxlbWVudFR5cGUpLCBDb29raWVTaXplKENvb2tpZVNpemUpIHt9CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkRlbGV0ZUZUeSA9CiAgICAgICAgIE9wZXJhdG9yRGVsZXRlLT5nZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwotICAgICAgYXNzZXJ0KERlbGV0ZUZUeS0+Z2V0TnVtQXJncygpID09IDEgfHwgRGVsZXRlRlR5LT5nZXROdW1BcmdzKCkgPT0gMik7CisgICAgICBhc3NlcnQoRGVsZXRlRlR5LT5nZXROdW1QYXJhbXMoKSA9PSAxIHx8IERlbGV0ZUZUeS0+Z2V0TnVtUGFyYW1zKCkgPT0gMik7CiAKICAgICAgIENhbGxBcmdMaXN0IEFyZ3M7CiAgICAgICAKICAgICAgIC8vIFBhc3MgdGhlIHBvaW50ZXIgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgotICAgICAgUXVhbFR5cGUgVm9pZFB0clR5ID0gRGVsZXRlRlR5LT5nZXRBcmdUeXBlKDApOworICAgICAgUXVhbFR5cGUgVm9pZFB0clR5ID0gRGVsZXRlRlR5LT5nZXRQYXJhbVR5cGUoMCk7CiAgICAgICBsbHZtOjpWYWx1ZSAqRGVsZXRlUHRyCiAgICAgICAgID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChQdHIsIENHRi5Db252ZXJ0VHlwZShWb2lkUHRyVHkpKTsKICAgICAgIEFyZ3MuYWRkKFJWYWx1ZTo6Z2V0KERlbGV0ZVB0ciksIFZvaWRQdHJUeSk7CiAKICAgICAgIC8vIFBhc3MgdGhlIG9yaWdpbmFsIHJlcXVlc3RlZCBzaXplIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuCi0gICAgICBpZiAoRGVsZXRlRlR5LT5nZXROdW1BcmdzKCkgPT0gMikgewotICAgICAgICBRdWFsVHlwZSBzaXplX3QgPSBEZWxldGVGVHktPmdldEFyZ1R5cGUoMSk7CisgICAgICBpZiAoRGVsZXRlRlR5LT5nZXROdW1QYXJhbXMoKSA9PSAyKSB7CisgICAgICAgIFF1YWxUeXBlIHNpemVfdCA9IERlbGV0ZUZUeS0+Z2V0UGFyYW1UeXBlKDEpOwogICAgICAgICBsbHZtOjpJbnRlZ2VyVHlwZSAqU2l6ZVR5CiAgICAgICAgICAgPSBjYXN0PGxsdm06OkludGVnZXJUeXBlPihDR0YuQ29udmVydFR5cGUoc2l6ZV90KSk7CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ0dFeHByQ29tcGxleC5jcHAgYi9saWIvQ29kZUdlbi9DR0V4cHJDb21wbGV4LmNwcAppbmRleCA3M2Q1YmNiLi4xZjg0Yzg2IDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR0V4cHJDb21wbGV4LmNwcAorKysgYi9saWIvQ29kZUdlbi9DR0V4cHJDb21wbGV4LmNwcApAQCAtOTMsNyArOTMsNyBAQAogICBDb21wbGV4UGFpclR5IFZpc2l0KEV4cHIgKkUpIHsKICAgICByZXR1cm4gU3RtdFZpc2l0b3I8Q29tcGxleEV4cHJFbWl0dGVyLCBDb21wbGV4UGFpclR5Pjo6VmlzaXQoRSk7CiAgIH0KLSAgICAKKwogICBDb21wbGV4UGFpclR5IFZpc2l0U3RtdChTdG10ICpTKSB7CiAgICAgUy0+ZHVtcChDR0YuZ2V0Q29udGV4dCgpLmdldFNvdXJjZU1hbmFnZXIoKSk7CiAgICAgbGx2bV91bnJlYWNoYWJsZSgiU3RtdCBjYW4ndCBoYXZlIGNvbXBsZXggcmVzdWx0IHR5cGUhIik7CkBAIC00MTAsNyArNDEwLDcgQEAKICAgcmV0dXJuIENvbXBsZXhQYWlyVHkoVmFsLCBsbHZtOjpDb25zdGFudDo6Z2V0TnVsbFZhbHVlKFZhbC0+Z2V0VHlwZSgpKSk7CiB9CiAKLUNvbXBsZXhQYWlyVHkgQ29tcGxleEV4cHJFbWl0dGVyOjpFbWl0Q2FzdChDYXN0RXhwcjo6Q2FzdEtpbmQgQ0ssIEV4cHIgKk9wLCAKK0NvbXBsZXhQYWlyVHkgQ29tcGxleEV4cHJFbWl0dGVyOjpFbWl0Q2FzdChDYXN0RXhwcjo6Q2FzdEtpbmQgQ0ssIEV4cHIgKk9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIERlc3RUeSkgewogICBzd2l0Y2ggKENLKSB7CiAgIGNhc2UgQ0tfRGVwZW5kZW50OiBsbHZtX3VucmVhY2hhYmxlKCJkZXBlbmRlbnQgY2FzdCBraW5kIGluIElSIGdlbiEiKTsKQEAgLTQyNyw3ICs0MjcsNyBAQAogICBjYXNlIENLX0xWYWx1ZUJpdENhc3Q6IHsKICAgICBMVmFsdWUgb3JpZ0xWID0gQ0dGLkVtaXRMVmFsdWUoT3ApOwogICAgIGxsdm06OlZhbHVlICpWID0gb3JpZ0xWLmdldEFkZHJlc3MoKTsKLSAgICBWID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KFYsIAorICAgIFYgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoViwKICAgICAgICAgICAgICAgICAgICAgQ0dGLkNvbnZlcnRUeXBlKENHRi5nZXRDb250ZXh0KCkuZ2V0UG9pbnRlclR5cGUoRGVzdFR5KSkpOwogICAgIHJldHVybiBFbWl0TG9hZE9mTFZhbHVlKENHRi5NYWtlQWRkckxWYWx1ZShWLCBEZXN0VHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdMVi5nZXRBbGlnbm1lbnQoKSksCkBAIC00NzUsNiArNDc1LDcgQEAKICAgY2FzZSBDS19Db3B5QW5kQXV0b3JlbGVhc2VCbG9ja09iamVjdDoKICAgY2FzZSBDS19CdWlsdGluRm5Ub0ZuUHRyOgogICBjYXNlIENLX1plcm9Ub09DTEV2ZW50OgorICBjYXNlIENLX0FkZHJlc3NTcGFjZUNvbnZlcnNpb246CiAgICAgbGx2bV91bnJlYWNoYWJsZSgiaW52YWxpZCBjYXN0IGtpbmQgZm9yIGNvbXBsZXggdmFsdWUiKTsKIAogICBjYXNlIENLX0Zsb2F0aW5nUmVhbFRvQ29tcGxleDoKQEAgLTY1Miw3ICs2NTMsNyBAQAogICBhc3NlcnQoQ0dGLmdldENvbnRleHQoKS5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKE9wSW5mby5UeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLT5nZXRSSFMoKS0+Z2V0VHlwZSgpKSk7CiAgIE9wSW5mby5SSFMgPSBWaXNpdChFLT5nZXRSSFMoKSk7Ci0gIAorCiAgIExWYWx1ZSBMSFMgPSBDR0YuRW1pdExWYWx1ZShFLT5nZXRMSFMoKSk7CiAKICAgLy8gTG9hZCBmcm9tIHRoZSBsLXZhbHVlIGFuZCBjb252ZXJ0IGl0LgpAQCAtNzAyLDcgKzcwMyw3IEBACiAKIExWYWx1ZSBDb21wbGV4RXhwckVtaXR0ZXI6OkVtaXRCaW5Bc3NpZ25MVmFsdWUoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXhQYWlyVHkgJlZhbCkgewotICBhc3NlcnQoQ0dGLmdldENvbnRleHQoKS5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKEUtPmdldExIUygpLT5nZXRUeXBlKCksIAorICBhc3NlcnQoQ0dGLmdldENvbnRleHQoKS5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKEUtPmdldExIUygpLT5nZXRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRS0+Z2V0UkhTKCktPmdldFR5cGUoKSkgJiYKICAgICAgICAgICJJbnZhbGlkIGFzc2lnbm1lbnQiKTsKICAgVGVzdEFuZENsZWFySWdub3JlUmVhbCgpOwpAQCAtNzUxLDExICs3NTIsMTMgQEAKICAgLy8gQmluZCB0aGUgY29tbW9uIGV4cHJlc3Npb24gaWYgbmVjZXNzYXJ5LgogICBDb2RlR2VuRnVuY3Rpb246Ok9wYXF1ZVZhbHVlTWFwcGluZyBiaW5kaW5nKENHRiwgRSk7CiAKKyAgUmVnaW9uQ291bnRlciBDbnQgPSBDR0YuZ2V0UEdPUmVnaW9uQ291bnRlcihFKTsKICAgQ29kZUdlbkZ1bmN0aW9uOjpDb25kaXRpb25hbEV2YWx1YXRpb24gZXZhbChDR0YpOwotICBDR0YuRW1pdEJyYW5jaE9uQm9vbEV4cHIoRS0+Z2V0Q29uZCgpLCBMSFNCbG9jaywgUkhTQmxvY2spOworICBDR0YuRW1pdEJyYW5jaE9uQm9vbEV4cHIoRS0+Z2V0Q29uZCgpLCBMSFNCbG9jaywgUkhTQmxvY2ssIENudC5nZXRDb3VudCgpKTsKIAogICBldmFsLmJlZ2luKENHRik7CiAgIENHRi5FbWl0QmxvY2soTEhTQmxvY2spOworICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CiAgIENvbXBsZXhQYWlyVHkgTEhTID0gVmlzaXQoRS0+Z2V0VHJ1ZUV4cHIoKSk7CiAgIExIU0Jsb2NrID0gQnVpbGRlci5HZXRJbnNlcnRCbG9jaygpOwogICBDR0YuRW1pdEJyYW5jaChDb250QmxvY2spOwpkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ0dFeHByQ29uc3RhbnQuY3BwIGIvbGliL0NvZGVHZW4vQ0dFeHByQ29uc3RhbnQuY3BwCmluZGV4IGY0ZDY4NjEuLjgyMzgyZGQgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NHRXhwckNvbnN0YW50LmNwcAorKysgYi9saWIvQ29kZUdlbi9DR0V4cHJDb25zdGFudC5jcHAKQEAgLTYzMyw2ICs2MzMsOSBAQAogICAgICAgcmV0dXJuIGxsdm06OkNvbnN0YW50U3RydWN0OjpnZXQoU1R5LCBFbHRzKTsKICAgICB9CiAKKyAgICBjYXNlIENLX0FkZHJlc3NTcGFjZUNvbnZlcnNpb246CisgICAgICByZXR1cm4gbGx2bTo6Q29uc3RhbnRFeHByOjpnZXRBZGRyU3BhY2VDYXN0KEMsIGRlc3RUeXBlKTsKKwogICAgIGNhc2UgQ0tfTFZhbHVlVG9SVmFsdWU6CiAgICAgY2FzZSBDS19BdG9taWNUb05vbkF0b21pYzoKICAgICBjYXNlIENLX05vbkF0b21pY1RvQXRvbWljOgpAQCAtOTE3LDcgKzkyMCw3IEBACiAgICAgfQogICAgIGNhc2UgRXhwcjo6Q2FsbEV4cHJDbGFzczogewogICAgICAgQ2FsbEV4cHIqIENFID0gY2FzdDxDYWxsRXhwcj4oRSk7Ci0gICAgICB1bnNpZ25lZCBidWlsdGluID0gQ0UtPmlzQnVpbHRpbkNhbGwoKTsKKyAgICAgIHVuc2lnbmVkIGJ1aWx0aW4gPSBDRS0+Z2V0QnVpbHRpbkNhbGxlZSgpOwogICAgICAgaWYgKGJ1aWx0aW4gIT0KICAgICAgICAgICAgIEJ1aWx0aW46OkJJX19idWlsdGluX19fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcgJiYKICAgICAgICAgICBidWlsdGluICE9CkBAIC0xMDYyLDEzICsxMDY1LDEzIEBACiAgICAgICBpZiAoIU9mZnNldC0+aXNOdWxsVmFsdWUoKSkgewogICAgICAgICBsbHZtOjpDb25zdGFudCAqQ2FzdGVkID0gbGx2bTo6Q29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KEMsIEludDhQdHJUeSk7CiAgICAgICAgIENhc3RlZCA9IGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihDYXN0ZWQsIE9mZnNldCk7Ci0gICAgICAgIEMgPSBsbHZtOjpDb25zdGFudEV4cHI6OmdldEJpdENhc3QoQ2FzdGVkLCBDLT5nZXRUeXBlKCkpOworICAgICAgICBDID0gbGx2bTo6Q29uc3RhbnRFeHByOjpnZXRQb2ludGVyQ2FzdChDYXN0ZWQsIEMtPmdldFR5cGUoKSk7CiAgICAgICB9CiAKICAgICAgIC8vIENvbnZlcnQgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGU7IHRoaXMgY291bGQgYmUgYW4gbHZhbHVlIGZvcgogICAgICAgLy8gYW4gaW50ZWdlci4KICAgICAgIGlmIChpc2E8bGx2bTo6UG9pbnRlclR5cGU+KERlc3RUeSkpCi0gICAgICAgIHJldHVybiBsbHZtOjpDb25zdGFudEV4cHI6OmdldEJpdENhc3QoQywgRGVzdFR5KTsKKyAgICAgICAgcmV0dXJuIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0UG9pbnRlckNhc3QoQywgRGVzdFR5KTsKIAogICAgICAgcmV0dXJuIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0UHRyVG9JbnQoQywgRGVzdFR5KTsKICAgICB9IGVsc2UgewpAQCAtMTI2NSwxNSArMTI2OCwxNCBAQAogICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0ID0gQ0dNLmdldENvbnRleHQoKS5nZXRBU1RSZWNvcmRMYXlvdXQoUkQpOwogCiAgICAgLy8gR28gdGhyb3VnaCBhbGwgYmFzZXMgYW5kIGZpbGwgaW4gYW55IG51bGwgcG9pbnRlciB0byBkYXRhIG1lbWJlcnMuCi0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBSRC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBpZiAoSS0+aXNWaXJ0dWFsKCkpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSRC0+YmFzZXMoKSkgeworICAgICAgaWYgKEkuaXNWaXJ0dWFsKCkpIHsKICAgICAgICAgLy8gSWdub3JlIHZpcnR1YWwgYmFzZXMuCiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogICAgICAgCiAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9IAotICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICBjYXN0PENYWFJlY29yZERlY2w+KEkuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogICAgICAgCiAgICAgICAvLyBJZ25vcmUgZW1wdHkgYmFzZXMuCiAgICAgICBpZiAoQmFzZURlY2wtPmlzRW1wdHkoKSkKQEAgLTEyODUsNyArMTI4Nyw3IEBACiAKICAgICAgIHVpbnQ2NF90IEJhc2VPZmZzZXQgPQogICAgICAgICBDR00uZ2V0Q29udGV4dCgpLnRvQml0cyhMYXlvdXQuZ2V0QmFzZUNsYXNzT2Zmc2V0KEJhc2VEZWNsKSk7Ci0gICAgICBGaWxsSW5OdWxsRGF0YU1lbWJlclBvaW50ZXJzKENHTSwgSS0+Z2V0VHlwZSgpLAorICAgICAgRmlsbEluTnVsbERhdGFNZW1iZXJQb2ludGVycyhDR00sIEkuZ2V0VHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50cywgU3RhcnRPZmZzZXQgKyBCYXNlT2Zmc2V0KTsKICAgICB9CiAgICAgCkBAIC0xMzM1LDE2ICsxMzM3LDE1IEBACiAgIHN0ZDo6dmVjdG9yPGxsdm06OkNvbnN0YW50ICo+IGVsZW1lbnRzKG51bUVsZW1lbnRzKTsKIAogICAvLyBGaWxsIGluIGFsbCB0aGUgYmFzZXMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvcgotICAgICAgICAgSSA9IHJlY29yZC0+YmFzZXNfYmVnaW4oKSwgRSA9IHJlY29yZC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgaWYgKEktPmlzVmlydHVhbCgpKSB7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IHJlY29yZC0+YmFzZXMoKSkgeworICAgIGlmIChJLmlzVmlydHVhbCgpKSB7CiAgICAgICAvLyBJZ25vcmUgdmlydHVhbCBiYXNlczsgaWYgd2UncmUgbGF5aW5nIG91dCBmb3IgYSBjb21wbGV0ZQogICAgICAgLy8gb2JqZWN0LCB3ZSdsbCBsYXkgdGhlc2Ugb3V0IGxhdGVyLgogICAgICAgY29udGludWU7CiAgICAgfQogCiAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqYmFzZSA9IAotICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLT5nZXRUeXBlKCktPmNhc3RBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLmdldFR5cGUoKS0+Y2FzdEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CiAKICAgICAvLyBJZ25vcmUgZW1wdHkgYmFzZXMuCiAgICAgaWYgKGJhc2UtPmlzRW1wdHkoKSkKQEAgLTEzNTYsMjggKzEzNTcsMjQgQEAKICAgfQogCiAgIC8vIEZpbGwgaW4gYWxsIHRoZSBmaWVsZHMuCi0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgSSA9IHJlY29yZC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgIEUgPSByZWNvcmQtPmZpZWxkX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGNvbnN0IEZpZWxkRGVjbCAqZmllbGQgPSAqSTsKLQorICBmb3IgKGNvbnN0IGF1dG8gKkZpZWxkIDogcmVjb3JkLT5maWVsZHMoKSkgewogICAgIC8vIEZpbGwgaW4gbm9uLWJpdGZpZWxkcy4gKEJpdGZpZWxkcyBhbHdheXMgdXNlIGEgemVybyBwYXR0ZXJuLCB3aGljaCB3ZQogICAgIC8vIHdpbGwgZmlsbCBpbiBsYXRlci4pCi0gICAgaWYgKCFmaWVsZC0+aXNCaXRGaWVsZCgpKSB7Ci0gICAgICB1bnNpZ25lZCBmaWVsZEluZGV4ID0gbGF5b3V0LmdldExMVk1GaWVsZE5vKGZpZWxkKTsKLSAgICAgIGVsZW1lbnRzW2ZpZWxkSW5kZXhdID0gQ0dNLkVtaXROdWxsQ29uc3RhbnQoZmllbGQtPmdldFR5cGUoKSk7CisgICAgaWYgKCFGaWVsZC0+aXNCaXRGaWVsZCgpKSB7CisgICAgICB1bnNpZ25lZCBmaWVsZEluZGV4ID0gbGF5b3V0LmdldExMVk1GaWVsZE5vKEZpZWxkKTsKKyAgICAgIGVsZW1lbnRzW2ZpZWxkSW5kZXhdID0gQ0dNLkVtaXROdWxsQ29uc3RhbnQoRmllbGQtPmdldFR5cGUoKSk7CiAgICAgfQogCiAgICAgLy8gRm9yIHVuaW9ucywgc3RvcCBhZnRlciB0aGUgZmlyc3QgbmFtZWQgZmllbGQuCi0gICAgaWYgKHJlY29yZC0+aXNVbmlvbigpICYmIGZpZWxkLT5nZXREZWNsTmFtZSgpKQorICAgIGlmIChyZWNvcmQtPmlzVW5pb24oKSAmJiBGaWVsZC0+Z2V0RGVjbE5hbWUoKSkKICAgICAgIGJyZWFrOwogICB9CiAKICAgLy8gRmlsbCBpbiB0aGUgdmlydHVhbCBiYXNlcywgaWYgd2UncmUgd29ya2luZyB3aXRoIHRoZSBjb21wbGV0ZSBvYmplY3QuCiAgIGlmIChhc0NvbXBsZXRlT2JqZWN0KSB7Ci0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yCi0gICAgICAgICAgIEkgPSByZWNvcmQtPnZiYXNlc19iZWdpbigpLCBFID0gcmVjb3JkLT52YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogcmVjb3JkLT52YmFzZXMoKSkgewogICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqYmFzZSA9IAotICAgICAgICBjYXN0PENYWFJlY29yZERlY2w+KEktPmdldFR5cGUoKS0+Y2FzdEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS5nZXRUeXBlKCktPmNhc3RBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogCiAgICAgICAvLyBJZ25vcmUgZW1wdHkgYmFzZXMuCiAgICAgICBpZiAoYmFzZS0+aXNFbXB0eSgpKQpkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ0dFeHByU2NhbGFyLmNwcCBiL2xpYi9Db2RlR2VuL0NHRXhwclNjYWxhci5jcHAKaW5kZXggZjNhNTM4Ny4uNWY5MzJiMCAxMDA2NDQKLS0tIGEvbGliL0NvZGVHZW4vQ0dFeHByU2NhbGFyLmNwcAorKysgYi9saWIvQ29kZUdlbi9DR0V4cHJTY2FsYXIuY3BwCkBAIC0yMiwxMyArMjIsMTMgQEAKICNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdFZpc2l0b3IuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgiCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvQ29kZUdlbk9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NGRy5oIgogI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCiAjaW5jbHVkZSAibGx2bS9JUi9EYXRhTGF5b3V0LmgiCiAjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgogI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFyaWFibGUuaCIKICNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKICNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DRkcuaCIKICNpbmNsdWRlIDxjc3RkYXJnPgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CkBAIC0yNDYsNyArMjQ2LDcgQEAKICAgfQogICBWYWx1ZSAqVmlzaXRPYmpDTWVzc2FnZUV4cHIoT2JqQ01lc3NhZ2VFeHByICpFKSB7CiAgICAgaWYgKEUtPmdldE1ldGhvZERlY2woKSAmJgotICAgICAgICBFLT5nZXRNZXRob2REZWNsKCktPmdldFJlc3VsdFR5cGUoKS0+aXNSZWZlcmVuY2VUeXBlKCkpCisgICAgICAgIEUtPmdldE1ldGhvZERlY2woKS0+Z2V0UmV0dXJuVHlwZSgpLT5pc1JlZmVyZW5jZVR5cGUoKSkKICAgICAgIHJldHVybiBFbWl0TG9hZE9mTFZhbHVlKEUpOwogICAgIHJldHVybiBDR0YuRW1pdE9iakNNZXNzYWdlRXhwcihFKS5nZXRTY2FsYXJWYWwoKTsKICAgfQpAQCAtMzY3LDExICszNjcsOCBAQAogICAgIENHRi5FbWl0Q1hYRGVsZXRlRXhwcihFKTsKICAgICByZXR1cm4gMDsKICAgfQotICBWYWx1ZSAqVmlzaXRVbmFyeVR5cGVUcmFpdEV4cHIoY29uc3QgVW5hcnlUeXBlVHJhaXRFeHByICpFKSB7Ci0gICAgcmV0dXJuIEJ1aWxkZXIuZ2V0SW50MShFLT5nZXRWYWx1ZSgpKTsKLSAgfQogCi0gIFZhbHVlICpWaXNpdEJpbmFyeVR5cGVUcmFpdEV4cHIoY29uc3QgQmluYXJ5VHlwZVRyYWl0RXhwciAqRSkgeworICBWYWx1ZSAqVmlzaXRUeXBlVHJhaXRFeHByKGNvbnN0IFR5cGVUcmFpdEV4cHIgKkUpIHsKICAgICByZXR1cm4gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChDb252ZXJ0VHlwZShFLT5nZXRUeXBlKCkpLCBFLT5nZXRWYWx1ZSgpKTsKICAgfQogCkBAIC0xMjk5LDcgKzEyOTYsMTggQEAKICAgY2FzZSBDS19BbnlQb2ludGVyVG9CbG9ja1BvaW50ZXJDYXN0OgogICBjYXNlIENLX0JpdENhc3Q6IHsKICAgICBWYWx1ZSAqU3JjID0gVmlzaXQoY29uc3RfY2FzdDxFeHByKj4oRSkpOwotICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoU3JjLCBDb252ZXJ0VHlwZShEZXN0VHkpKTsKKyAgICBsbHZtOjpUeXBlICpTcmNUeSA9IFNyYy0+Z2V0VHlwZSgpOworICAgIGxsdm06OlR5cGUgKkRzdFR5ID0gQ29udmVydFR5cGUoRGVzdFR5KTsKKyAgICBpZiAoU3JjVHktPmlzUHRyT3JQdHJWZWN0b3JUeSgpICYmIERzdFR5LT5pc1B0ck9yUHRyVmVjdG9yVHkoKSAmJgorICAgICAgICBTcmNUeS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpICE9IERzdFR5LT5nZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkpIHsKKyAgICAgIGxsdm06OlR5cGUgKk1pZFR5ID0gQ0dGLkNHTS5nZXREYXRhTGF5b3V0KCkuZ2V0SW50UHRyVHlwZShTcmNUeSk7CisgICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVJbnRUb1B0cihCdWlsZGVyLkNyZWF0ZVB0clRvSW50KFNyYywgTWlkVHkpLCBEc3RUeSk7CisgICAgfQorICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoU3JjLCBEc3RUeSk7CisgIH0KKyAgY2FzZSBDS19BZGRyZXNzU3BhY2VDb252ZXJzaW9uOiB7CisgICAgVmFsdWUgKlNyYyA9IFZpc2l0KGNvbnN0X2Nhc3Q8RXhwcio+KEUpKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVBZGRyU3BhY2VDYXN0KFNyYywgQ29udmVydFR5cGUoRGVzdFR5KSk7CiAgIH0KICAgY2FzZSBDS19BdG9taWNUb05vbkF0b21pYzoKICAgY2FzZSBDS19Ob25BdG9taWNUb0F0b21pYzoKQEAgLTEzNjAsNyArMTM2OCw3IEBACiAKICAgICAvLyBNYWtlIHN1cmUgdGhlIGFycmF5IGRlY2F5IGVuZHMgdXAgYmVpbmcgdGhlIHJpZ2h0IHR5cGUuICBUaGlzIG1hdHRlcnMgaWYKICAgICAvLyB0aGUgYXJyYXkgdHlwZSB3YXMgb2YgYW4gaW5jb21wbGV0ZSB0eXBlLgotICAgIHJldHVybiBDR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KFYsIENvbnZlcnRUeXBlKENFLT5nZXRUeXBlKCkpKTsKKyAgICByZXR1cm4gQ0dGLkJ1aWxkZXIuQ3JlYXRlUG9pbnRlckNhc3QoViwgQ29udmVydFR5cGUoQ0UtPmdldFR5cGUoKSkpOwogICB9CiAgIGNhc2UgQ0tfRnVuY3Rpb25Ub1BvaW50ZXJEZWNheToKICAgICByZXR1cm4gRW1pdExWYWx1ZShFKS5nZXRBZGRyZXNzKCk7CkBAIC0xNDg1LDcgKzE0OTMsNyBAQAogICB9CiAKICAgY2FzZSBDS19aZXJvVG9PQ0xFdmVudDogewotICAgIGFzc2VydChEZXN0VHktPmlzRXZlbnRUKCkgJiYgIkNLX1plcm9Ub09DTEV2ZW50IGNhc3Qgb24gbm9uIGV2ZW50IHR5cGUiKTsKKyAgICBhc3NlcnQoRGVzdFR5LT5pc0V2ZW50VCgpICYmICJDS19aZXJvVG9PQ0xFdmVudCBjYXN0IG9uIG5vbi1ldmVudCB0eXBlIik7CiAgICAgcmV0dXJuIGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoQ29udmVydFR5cGUoRGVzdFR5KSk7CiAgIH0KIApAQCAtMTcyNyw4ICsxNzM1LDkgQEAKICAgaWYgKGF0b21pY1BISSkgewogICAgIGxsdm06OkJhc2ljQmxvY2sgKm9wQkIgPSBCdWlsZGVyLkdldEluc2VydEJsb2NrKCk7CiAgICAgbGx2bTo6QmFzaWNCbG9jayAqY29udEJCID0gQ0dGLmNyZWF0ZUJhc2ljQmxvY2soImF0b21pY19jb250IiwgQ0dGLkN1ckZuKTsKLSAgICBsbHZtOjpWYWx1ZSAqb2xkID0gQnVpbGRlci5DcmVhdGVBdG9taWNDbXBYY2hnKExWLmdldEFkZHJlc3MoKSwgYXRvbWljUEhJLAotICAgICAgICBDR0YuRW1pdFRvTWVtb3J5KHZhbHVlLCB0eXBlKSwgbGx2bTo6U2VxdWVudGlhbGx5Q29uc2lzdGVudCk7CisgICAgbGx2bTo6VmFsdWUgKm9sZCA9IEJ1aWxkZXIuQ3JlYXRlQXRvbWljQ21wWGNoZygKKyAgICAgICAgTFYuZ2V0QWRkcmVzcygpLCBhdG9taWNQSEksIENHRi5FbWl0VG9NZW1vcnkodmFsdWUsIHR5cGUpLAorICAgICAgICBsbHZtOjpTZXF1ZW50aWFsbHlDb25zaXN0ZW50LCBsbHZtOjpTZXF1ZW50aWFsbHlDb25zaXN0ZW50KTsKICAgICBhdG9taWNQSEktPmFkZEluY29taW5nKG9sZCwgb3BCQik7CiAgICAgbGx2bTo6VmFsdWUgKnN1Y2Nlc3MgPSBCdWlsZGVyLkNyZWF0ZUlDbXBFUShvbGQsIGF0b21pY1BISSk7CiAgICAgQnVpbGRlci5DcmVhdGVDb25kQnIoc3VjY2VzcywgY29udEJCLCBvcEJCKTsKQEAgLTE5MDYsNyArMTkxNSw3IEBACiAKICAgICAgIFF1YWxUeXBlIGVsdFR5cGU7CiAgICAgICBsbHZtOjpWYWx1ZSAqbnVtRWx0czsKLSAgICAgIGxsdm06OnRpZShudW1FbHRzLCBlbHRUeXBlKSA9IENHRi5nZXRWTEFTaXplKFZBVCk7CisgICAgICBzdGQ6OnRpZShudW1FbHRzLCBlbHRUeXBlKSA9IENHRi5nZXRWTEFTaXplKFZBVCk7CiAKICAgICAgIGxsdm06OlZhbHVlICpzaXplID0gbnVtRWx0czsKIApAQCAtMjA2OSw4ICsyMDc4LDkgQEAKICAgaWYgKGF0b21pY1BISSkgewogICAgIGxsdm06OkJhc2ljQmxvY2sgKm9wQkIgPSBCdWlsZGVyLkdldEluc2VydEJsb2NrKCk7CiAgICAgbGx2bTo6QmFzaWNCbG9jayAqY29udEJCID0gQ0dGLmNyZWF0ZUJhc2ljQmxvY2soImF0b21pY19jb250IiwgQ0dGLkN1ckZuKTsKLSAgICBsbHZtOjpWYWx1ZSAqb2xkID0gQnVpbGRlci5DcmVhdGVBdG9taWNDbXBYY2hnKExIU0xWLmdldEFkZHJlc3MoKSwgYXRvbWljUEhJLAotICAgICAgICBDR0YuRW1pdFRvTWVtb3J5KFJlc3VsdCwgTEhTVHkpLCBsbHZtOjpTZXF1ZW50aWFsbHlDb25zaXN0ZW50KTsKKyAgICBsbHZtOjpWYWx1ZSAqb2xkID0gQnVpbGRlci5DcmVhdGVBdG9taWNDbXBYY2hnKAorICAgICAgICBMSFNMVi5nZXRBZGRyZXNzKCksIGF0b21pY1BISSwgQ0dGLkVtaXRUb01lbW9yeShSZXN1bHQsIExIU1R5KSwKKyAgICAgICAgbGx2bTo6U2VxdWVudGlhbGx5Q29uc2lzdGVudCwgbGx2bTo6U2VxdWVudGlhbGx5Q29uc2lzdGVudCk7CiAgICAgYXRvbWljUEhJLT5hZGRJbmNvbWluZyhvbGQsIG9wQkIpOwogICAgIGxsdm06OlZhbHVlICpzdWNjZXNzID0gQnVpbGRlci5DcmVhdGVJQ21wRVEob2xkLCBhdG9taWNQSEkpOwogICAgIEJ1aWxkZXIuQ3JlYXRlQ29uZEJyKHN1Y2Nlc3MsIGNvbnRCQiwgb3BCQik7CkBAIC0yMjM4LDcgKzIyNDgsNyBAQAogICBsbHZtOjpCYXNpY0Jsb2NrICppbml0aWFsQkIgPSBCdWlsZGVyLkdldEluc2VydEJsb2NrKCk7CiAgIGxsdm06OkZ1bmN0aW9uOjppdGVyYXRvciBpbnNlcnRQdCA9IGluaXRpYWxCQjsKICAgbGx2bTo6QmFzaWNCbG9jayAqY29udGludWVCQiA9IENHRi5jcmVhdGVCYXNpY0Jsb2NrKCJub292ZXJmbG93IiwgQ0dGLkN1ckZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6bmV4dChpbnNlcnRQdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpuZXh0KGluc2VydFB0KSk7CiAgIGxsdm06OkJhc2ljQmxvY2sgKm92ZXJmbG93QkIgPSBDR0YuY3JlYXRlQmFzaWNCbG9jaygib3ZlcmZsb3ciLCBDR0YuQ3VyRm4pOwogCiAgIEJ1aWxkZXIuQ3JlYXRlQ29uZEJyKG92ZXJmbG93LCBvdmVyZmxvd0JCLCBjb250aW51ZUJCKTsKQEAgLTI1MjksNyArMjUzOSw3IEBACiAgIGlmIChjb25zdCBWYXJpYWJsZUFycmF5VHlwZSAqdmxhCiAgICAgICAgID0gQ0dGLmdldENvbnRleHQoKS5nZXRBc1ZhcmlhYmxlQXJyYXlUeXBlKGVsZW1lbnRUeXBlKSkgewogICAgIGxsdm06OlZhbHVlICpudW1FbGVtZW50czsKLSAgICBsbHZtOjp0aWUobnVtRWxlbWVudHMsIGVsZW1lbnRUeXBlKSA9IENHRi5nZXRWTEFTaXplKHZsYSk7CisgICAgc3RkOjp0aWUobnVtRWxlbWVudHMsIGVsZW1lbnRUeXBlKSA9IENHRi5nZXRWTEFTaXplKHZsYSk7CiAKICAgICBkaXZpc29yID0gbnVtRWxlbWVudHM7CiAKQEAgLTI4MTgsMTEgKzI4MjgsMTEgQEAKIAogICBzd2l0Y2ggKEUtPmdldExIUygpLT5nZXRUeXBlKCkuZ2V0T2JqQ0xpZmV0aW1lKCkpIHsKICAgY2FzZSBRdWFsaWZpZXJzOjpPQ0xfU3Ryb25nOgotICAgIGxsdm06OnRpZShMSFMsIFJIUykgPSBDR0YuRW1pdEFSQ1N0b3JlU3Ryb25nKEUsIElnbm9yZSk7CisgICAgc3RkOjp0aWUoTEhTLCBSSFMpID0gQ0dGLkVtaXRBUkNTdG9yZVN0cm9uZyhFLCBJZ25vcmUpOwogICAgIGJyZWFrOwogCiAgIGNhc2UgUXVhbGlmaWVyczo6T0NMX0F1dG9yZWxlYXNpbmc6Ci0gICAgbGx2bTo6dGllKExIUyxSSFMpID0gQ0dGLkVtaXRBUkNTdG9yZUF1dG9yZWxlYXNpbmcoRSk7CisgICAgc3RkOjp0aWUoTEhTLCBSSFMpID0gQ0dGLkVtaXRBUkNTdG9yZUF1dG9yZWxlYXNpbmcoRSk7CiAgICAgYnJlYWs7CiAKICAgY2FzZSBRdWFsaWZpZXJzOjpPQ0xfV2VhazoKQEAgLTI4NjYsOCArMjg3NiwxMiBAQAogfQogCiBWYWx1ZSAqU2NhbGFyRXhwckVtaXR0ZXI6OlZpc2l0QmluTEFuZChjb25zdCBCaW5hcnlPcGVyYXRvciAqRSkgeworICBSZWdpb25Db3VudGVyIENudCA9IENHRi5nZXRQR09SZWdpb25Db3VudGVyKEUpOworCiAgIC8vIFBlcmZvcm0gdmVjdG9yIGxvZ2ljYWwgYW5kIG9uIGNvbXBhcmlzb25zIHdpdGggemVybyB2ZWN0b3JzLgogICBpZiAoRS0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5cGUoKSkgeworICAgIENudC5iZWdpblJlZ2lvbihCdWlsZGVyKTsKKwogICAgIFZhbHVlICpMSFMgPSBWaXNpdChFLT5nZXRMSFMoKSk7CiAgICAgVmFsdWUgKlJIUyA9IFZpc2l0KEUtPmdldFJIUygpKTsKICAgICBWYWx1ZSAqWmVybyA9IGxsdm06OkNvbnN0YW50QWdncmVnYXRlWmVybzo6Z2V0KExIUy0+Z2V0VHlwZSgpKTsKQEAgLTI4ODksNiArMjkwMyw4IEBACiAgIGJvb2wgTEhTQ29uZFZhbDsKICAgaWYgKENHRi5Db25zdGFudEZvbGRzVG9TaW1wbGVJbnRlZ2VyKEUtPmdldExIUygpLCBMSFNDb25kVmFsKSkgewogICAgIGlmIChMSFNDb25kVmFsKSB7IC8vIElmIHdlIGhhdmUgMSAmJiBYLCBqdXN0IGVtaXQgWC4KKyAgICAgIENudC5iZWdpblJlZ2lvbihCdWlsZGVyKTsKKwogICAgICAgVmFsdWUgKlJIU0NvbmQgPSBDR0YuRXZhbHVhdGVFeHByQXNCb29sKEUtPmdldFJIUygpKTsKICAgICAgIC8vIFpFeHQgcmVzdWx0IHRvIGludCBvciBib29sLgogICAgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlWkV4dE9yQml0Q2FzdChSSFNDb25kLCBSZXNUeSwgImxhbmQuZXh0Iik7CkBAIC0yOTA1LDcgKzI5MjEsNyBAQAogICBDb2RlR2VuRnVuY3Rpb246OkNvbmRpdGlvbmFsRXZhbHVhdGlvbiBldmFsKENHRik7CiAKICAgLy8gQnJhbmNoIG9uIHRoZSBMSFMgZmlyc3QuICBJZiBpdCBpcyBmYWxzZSwgZ28gdG8gdGhlIGZhaWx1cmUgKGNvbnQpIGJsb2NrLgotICBDR0YuRW1pdEJyYW5jaE9uQm9vbEV4cHIoRS0+Z2V0TEhTKCksIFJIU0Jsb2NrLCBDb250QmxvY2spOworICBDR0YuRW1pdEJyYW5jaE9uQm9vbEV4cHIoRS0+Z2V0TEhTKCksIFJIU0Jsb2NrLCBDb250QmxvY2ssIENudC5nZXRDb3VudCgpKTsKIAogICAvLyBBbnkgZWRnZXMgaW50byB0aGUgQ29udEJsb2NrIGFyZSBub3cgZnJvbSBhbiAoaW5kZXRlcm1pbmF0ZSBudW1iZXIgb2YpCiAgIC8vIGVkZ2VzIGZyb20gdGhpcyBmaXJzdCBjb25kaXRpb24uICBBbGwgb2YgdGhlc2UgdmFsdWVzIHdpbGwgYmUgZmFsc2UuICBTdGFydApAQCAtMjkxOCw2ICsyOTM0LDcgQEAKIAogICBldmFsLmJlZ2luKENHRik7CiAgIENHRi5FbWl0QmxvY2soUkhTQmxvY2spOworICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CiAgIFZhbHVlICpSSFNDb25kID0gQ0dGLkV2YWx1YXRlRXhwckFzQm9vbChFLT5nZXRSSFMoKSk7CiAgIGV2YWwuZW5kKENHRik7CiAKQEAgLTI5MzcsOCArMjk1NCwxMiBAQAogfQogCiBWYWx1ZSAqU2NhbGFyRXhwckVtaXR0ZXI6OlZpc2l0QmluTE9yKGNvbnN0IEJpbmFyeU9wZXJhdG9yICpFKSB7CisgIFJlZ2lvbkNvdW50ZXIgQ250ID0gQ0dGLmdldFBHT1JlZ2lvbkNvdW50ZXIoRSk7CisKICAgLy8gUGVyZm9ybSB2ZWN0b3IgbG9naWNhbCBvciBvbiBjb21wYXJpc29ucyB3aXRoIHplcm8gdmVjdG9ycy4KICAgaWYgKEUtPmdldFR5cGUoKS0+aXNWZWN0b3JUeXBlKCkpIHsKKyAgICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CisKICAgICBWYWx1ZSAqTEhTID0gVmlzaXQoRS0+Z2V0TEhTKCkpOwogICAgIFZhbHVlICpSSFMgPSBWaXNpdChFLT5nZXRSSFMoKSk7CiAgICAgVmFsdWUgKlplcm8gPSBsbHZtOjpDb25zdGFudEFnZ3JlZ2F0ZVplcm86OmdldChMSFMtPmdldFR5cGUoKSk7CkBAIC0yOTYwLDYgKzI5ODEsOCBAQAogICBib29sIExIU0NvbmRWYWw7CiAgIGlmIChDR0YuQ29uc3RhbnRGb2xkc1RvU2ltcGxlSW50ZWdlcihFLT5nZXRMSFMoKSwgTEhTQ29uZFZhbCkpIHsKICAgICBpZiAoIUxIU0NvbmRWYWwpIHsgLy8gSWYgd2UgaGF2ZSAwIHx8IFgsIGp1c3QgZW1pdCBYLgorICAgICAgQ250LmJlZ2luUmVnaW9uKEJ1aWxkZXIpOworCiAgICAgICBWYWx1ZSAqUkhTQ29uZCA9IENHRi5FdmFsdWF0ZUV4cHJBc0Jvb2woRS0+Z2V0UkhTKCkpOwogICAgICAgLy8gWkV4dCByZXN1bHQgdG8gaW50IG9yIGJvb2wuCiAgICAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVaRXh0T3JCaXRDYXN0KFJIU0NvbmQsIFJlc1R5LCAibG9yLmV4dCIpOwpAQCAtMjk3Niw3ICsyOTk5LDggQEAKICAgQ29kZUdlbkZ1bmN0aW9uOjpDb25kaXRpb25hbEV2YWx1YXRpb24gZXZhbChDR0YpOwogCiAgIC8vIEJyYW5jaCBvbiB0aGUgTEhTIGZpcnN0LiAgSWYgaXQgaXMgdHJ1ZSwgZ28gdG8gdGhlIHN1Y2Nlc3MgKGNvbnQpIGJsb2NrLgotICBDR0YuRW1pdEJyYW5jaE9uQm9vbEV4cHIoRS0+Z2V0TEhTKCksIENvbnRCbG9jaywgUkhTQmxvY2spOworICBDR0YuRW1pdEJyYW5jaE9uQm9vbEV4cHIoRS0+Z2V0TEhTKCksIENvbnRCbG9jaywgUkhTQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDbnQuZ2V0UGFyZW50Q291bnQoKSAtIENudC5nZXRDb3VudCgpKTsKIAogICAvLyBBbnkgZWRnZXMgaW50byB0aGUgQ29udEJsb2NrIGFyZSBub3cgZnJvbSBhbiAoaW5kZXRlcm1pbmF0ZSBudW1iZXIgb2YpCiAgIC8vIGVkZ2VzIGZyb20gdGhpcyBmaXJzdCBjb25kaXRpb24uICBBbGwgb2YgdGhlc2UgdmFsdWVzIHdpbGwgYmUgdHJ1ZS4gIFN0YXJ0CkBAIC0yOTkxLDYgKzMwMTUsNyBAQAogCiAgIC8vIEVtaXQgdGhlIFJIUyBjb25kaXRpb24gYXMgYSBib29sIHZhbHVlLgogICBDR0YuRW1pdEJsb2NrKFJIU0Jsb2NrKTsKKyAgQ250LmJlZ2luUmVnaW9uKEJ1aWxkZXIpOwogICBWYWx1ZSAqUkhTQ29uZCA9IENHRi5FdmFsdWF0ZUV4cHJBc0Jvb2woRS0+Z2V0UkhTKCkpOwogCiAgIGV2YWwuZW5kKENHRik7CkBAIC0zMDQxLDYgKzMwNjYsNyBAQAogCiAgIC8vIEJpbmQgdGhlIGNvbW1vbiBleHByZXNzaW9uIGlmIG5lY2Vzc2FyeS4KICAgQ29kZUdlbkZ1bmN0aW9uOjpPcGFxdWVWYWx1ZU1hcHBpbmcgYmluZGluZyhDR0YsIEUpOworICBSZWdpb25Db3VudGVyIENudCA9IENHRi5nZXRQR09SZWdpb25Db3VudGVyKEUpOwogCiAgIEV4cHIgKmNvbmRFeHByID0gRS0+Z2V0Q29uZCgpOwogICBFeHByICpsaHNFeHByID0gRS0+Z2V0VHJ1ZUV4cHIoKTsKQEAgLTMwNTUsNiArMzA4MSw4IEBACiAKICAgICAvLyBJZiB0aGUgZGVhZCBzaWRlIGRvZXNuJ3QgaGF2ZSBsYWJlbHMgd2UgbmVlZCwganVzdCBlbWl0IHRoZSBMaXZlIHBhcnQuCiAgICAgaWYgKCFDR0YuQ29udGFpbnNMYWJlbChkZWFkKSkgeworICAgICAgaWYgKENvbmRFeHByQm9vbCkKKyAgICAgICAgQ250LmJlZ2luUmVnaW9uKEJ1aWxkZXIpOwogICAgICAgVmFsdWUgKlJlc3VsdCA9IFZpc2l0KGxpdmUpOwogCiAgICAgICAvLyBJZiB0aGUgbGl2ZSBwYXJ0IGlzIGEgdGhyb3cgZXhwcmVzc2lvbiwgaXQgYWN0cyBsaWtlIGl0IGhhcyBhIHZvaWQKQEAgLTMwNzEsNiArMzA5OSw4IEBACiAgIC8vIHRoZSBzZWxlY3QgZnVuY3Rpb24uCiAgIGlmIChDR0YuZ2V0TGFuZ09wdHMoKS5PcGVuQ0wKICAgICAgICYmIGNvbmRFeHByLT5nZXRUeXBlKCktPmlzVmVjdG9yVHlwZSgpKSB7CisgICAgQ250LmJlZ2luUmVnaW9uKEJ1aWxkZXIpOworCiAgICAgbGx2bTo6VmFsdWUgKkNvbmRWID0gQ0dGLkVtaXRTY2FsYXJFeHByKGNvbmRFeHByKTsKICAgICBsbHZtOjpWYWx1ZSAqTEhTID0gVmlzaXQobGhzRXhwcik7CiAgICAgbGx2bTo6VmFsdWUgKlJIUyA9IFZpc2l0KHJoc0V4cHIpOwpAQCAtMzExNCw2ICszMTQ0LDggQEAKICAgLy8gc2FmZSB0byBldmFsdWF0ZSB0aGUgTEhTIGFuZCBSSFMgdW5jb25kaXRpb25hbGx5LgogICBpZiAoaXNDaGVhcEVub3VnaFRvRXZhbHVhdGVVbmNvbmRpdGlvbmFsbHkobGhzRXhwciwgQ0dGKSAmJgogICAgICAgaXNDaGVhcEVub3VnaFRvRXZhbHVhdGVVbmNvbmRpdGlvbmFsbHkocmhzRXhwciwgQ0dGKSkgeworICAgIENudC5iZWdpblJlZ2lvbihCdWlsZGVyKTsKKwogICAgIGxsdm06OlZhbHVlICpDb25kViA9IENHRi5FdmFsdWF0ZUV4cHJBc0Jvb2woY29uZEV4cHIpOwogICAgIGxsdm06OlZhbHVlICpMSFMgPSBWaXNpdChsaHNFeHByKTsKICAgICBsbHZtOjpWYWx1ZSAqUkhTID0gVmlzaXQocmhzRXhwcik7CkBAIC0zMTMwLDkgKzMxNjIsMTAgQEAKICAgbGx2bTo6QmFzaWNCbG9jayAqQ29udEJsb2NrID0gQ0dGLmNyZWF0ZUJhc2ljQmxvY2soImNvbmQuZW5kIik7CiAKICAgQ29kZUdlbkZ1bmN0aW9uOjpDb25kaXRpb25hbEV2YWx1YXRpb24gZXZhbChDR0YpOwotICBDR0YuRW1pdEJyYW5jaE9uQm9vbEV4cHIoY29uZEV4cHIsIExIU0Jsb2NrLCBSSFNCbG9jayk7CisgIENHRi5FbWl0QnJhbmNoT25Cb29sRXhwcihjb25kRXhwciwgTEhTQmxvY2ssIFJIU0Jsb2NrLCBDbnQuZ2V0Q291bnQoKSk7CiAKICAgQ0dGLkVtaXRCbG9jayhMSFNCbG9jayk7CisgIENudC5iZWdpblJlZ2lvbihCdWlsZGVyKTsKICAgZXZhbC5iZWdpbihDR0YpOwogICBWYWx1ZSAqTEhTID0gVmlzaXQobGhzRXhwcik7CiAgIGV2YWwuZW5kKENHRik7CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR09iakMuY3BwIGIvbGliL0NvZGVHZW4vQ0dPYmpDLmNwcAppbmRleCAwYmRhMDUzLi5mNzhiYjBiIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR09iakMuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHT2JqQy5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvQ29kZUdlbi9DR0Z1bmN0aW9uSW5mby5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKICNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKICNpbmNsdWRlICJsbHZtL0lSL0lubGluZUFzbS5oIgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwpAQCAtNzksMTAgKzc5LDEwIEBACiAgIFJWYWx1ZSBSViA9IEVtaXRBbnlFeHByKFN1YkV4cHIpOwogICBDYWxsQXJnTGlzdCBBcmdzOwogICBBcmdzLmFkZChSViwgQXJnUVQpOwotICAKLSAgUlZhbHVlIHJlc3VsdCA9IFJ1bnRpbWUuR2VuZXJhdGVNZXNzYWdlU2VuZCgqdGhpcywgUmV0dXJuVmFsdWVTbG90KCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJveGluZ01ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpLCBTZWwsIFJlY2VpdmVyLCBBcmdzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2wsIEJveGluZ01ldGhvZCk7CisKKyAgUlZhbHVlIHJlc3VsdCA9IFJ1bnRpbWUuR2VuZXJhdGVNZXNzYWdlU2VuZCgKKyAgICAgICp0aGlzLCBSZXR1cm5WYWx1ZVNsb3QoKSwgQm94aW5nTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCksIFNlbCwgUmVjZWl2ZXIsCisgICAgICBBcmdzLCBDbGFzc0RlY2wsIEJveGluZ01ldGhvZCk7CiAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUJpdENhc3QocmVzdWx0LmdldFNjYWxhclZhbCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0VHlwZShFLT5nZXRUeXBlKCkpKTsKIH0KQEAgLTE4NiwxMiArMTg2LDkgQEAKICAgbGx2bTo6VmFsdWUgKlJlY2VpdmVyID0gUnVudGltZS5HZXRDbGFzcygqdGhpcywgQ2xhc3MpOwogCiAgIC8vIEdlbmVyYXRlIHRoZSBtZXNzYWdlIHNlbmQuCi0gIFJWYWx1ZSByZXN1bHQKLSAgICA9IFJ1bnRpbWUuR2VuZXJhdGVNZXNzYWdlU2VuZCgqdGhpcywgUmV0dXJuVmFsdWVTbG90KCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFdpdGhPYmplY3RzLT5nZXRSZXN1bHRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY2VpdmVyLCBBcmdzLCBDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RXaXRoT2JqZWN0cyk7CisgIFJWYWx1ZSByZXN1bHQgPSBSdW50aW1lLkdlbmVyYXRlTWVzc2FnZVNlbmQoCisgICAgICAqdGhpcywgUmV0dXJuVmFsdWVTbG90KCksIE1ldGhvZFdpdGhPYmplY3RzLT5nZXRSZXR1cm5UeXBlKCksIFNlbCwKKyAgICAgIFJlY2VpdmVyLCBBcmdzLCBDbGFzcywgTWV0aG9kV2l0aE9iamVjdHMpOwogCiAgIC8vIFRoZSBhYm92ZSBtZXNzYWdlIHNlbmQgbmVlZHMgdGhlc2Ugb2JqZWN0cywgYnV0IGluIEFSQyB0aGV5IGFyZQogICAvLyBwYXNzZWQgaW4gYSBidWZmZXIgdGhhdCBpcyBlc3NlbnRpYWxseSBfX3Vuc2FmZV91bnJldGFpbmVkLgpAQCAtMjM4LDcgKzIzNSw3IEBACiAgICAgcmV0dXJuIFJlc3VsdDsKIAogICBpZiAoIU1ldGhvZC0+aGFzUmVsYXRlZFJlc3VsdFR5cGUoKSB8fAotICAgICAgQ0dGLmdldENvbnRleHQoKS5oYXNTYW1lVHlwZShFeHBULCBNZXRob2QtPmdldFJlc3VsdFR5cGUoKSkgfHwKKyAgICAgIENHRi5nZXRDb250ZXh0KCkuaGFzU2FtZVR5cGUoRXhwVCwgTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCkpIHx8CiAgICAgICAhUmVzdWx0LmlzU2NhbGFyKCkpCiAgICAgcmV0dXJuIFJlc3VsdDsKICAgCkBAIC0zNjksOCArMzY2LDcgQEAKICAgICAgIHNob3VsZEV4dGVuZFJlY2VpdmVyRm9ySW5uZXJQb2ludGVyTWVzc2FnZShFKSkKICAgICBSZWNlaXZlciA9IEVtaXRBUkNSZXRhaW5BdXRvcmVsZWFzZShSZWNlaXZlclR5cGUsIFJlY2VpdmVyKTsKIAotICBRdWFsVHlwZSBSZXN1bHRUeXBlID0KLSAgICBtZXRob2QgPyBtZXRob2QtPmdldFJlc3VsdFR5cGUoKSA6IEUtPmdldFR5cGUoKTsKKyAgUXVhbFR5cGUgUmVzdWx0VHlwZSA9IG1ldGhvZCA/IG1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpIDogRS0+Z2V0VHlwZSgpOwogCiAgIENhbGxBcmdMaXN0IEFyZ3M7CiAgIEVtaXRDYWxsQXJncyhBcmdzLCBtZXRob2QsIEUtPmFyZ19iZWdpbigpLCBFLT5hcmdfZW5kKCkpOwpAQCAtNDM1LDcgKzQzMSw3IEBACiAKIG5hbWVzcGFjZSB7CiBzdHJ1Y3QgRmluaXNoQVJDRGVhbGxvYyA6IEVIU2NvcGVTdGFjazo6Q2xlYW51cCB7Ci0gIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgIGNvbnN0IE9iakNNZXRob2REZWNsICptZXRob2QgPSBjYXN0PE9iakNNZXRob2REZWNsPihDR0YuQ3VyQ29kZURlY2wpOwogCiAgICAgY29uc3QgT2JqQ0ltcGxEZWNsICppbXBsID0gY2FzdDxPYmpDSW1wbERlY2w+KG1ldGhvZC0+Z2V0RGVjbENvbnRleHQoKSk7CkBAIC00ODAsMTMgKzQ3NiwxMiBAQAogICBhcmdzLnB1c2hfYmFjayhPTUQtPmdldFNlbGZEZWNsKCkpOwogICBhcmdzLnB1c2hfYmFjayhPTUQtPmdldENtZERlY2woKSk7CiAKLSAgZm9yIChPYmpDTWV0aG9kRGVjbDo6cGFyYW1fY29uc3RfaXRlcmF0b3IgUEkgPSBPTUQtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgICBFID0gT01ELT5wYXJhbV9lbmQoKTsgUEkgIT0gRTsgKytQSSkKLSAgICBhcmdzLnB1c2hfYmFjaygqUEkpOworICBmb3IgKGNvbnN0IGF1dG8gKlBJIDogT01ELT5wYXJhbXMoKSkKKyAgICBhcmdzLnB1c2hfYmFjayhQSSk7CiAKICAgQ3VyR0QgPSBPTUQ7CiAKLSAgU3RhcnRGdW5jdGlvbihPTUQsIE9NRC0+Z2V0UmVzdWx0VHlwZSgpLCBGbiwgRkksIGFyZ3MsIFN0YXJ0TG9jKTsKKyAgU3RhcnRGdW5jdGlvbihPTUQsIE9NRC0+Z2V0UmV0dXJuVHlwZSgpLCBGbiwgRkksIGFyZ3MsIFN0YXJ0TG9jKTsKIAogICAvLyBJbiBBUkMsIGNlcnRhaW4gbWV0aG9kcyBnZXQgYW4gZXh0cmEgY2xlYW51cC4KICAgaWYgKENHTS5nZXRMYW5nT3B0cygpLk9iakNBdXRvUmVmQ291bnQgJiYKQEAgLTUwNiw4ICs1MDEsMTQgQEAKIC8vLyBpdHMgcG9pbnRlciwgbmFtZSwgYW5kIHR5cGVzIHJlZ2lzdGVyZWQgaW4gdGhlIGNsYXNzIHN0cnV0dXJlLgogdm9pZCBDb2RlR2VuRnVuY3Rpb246OkdlbmVyYXRlT2JqQ01ldGhvZChjb25zdCBPYmpDTWV0aG9kRGVjbCAqT01EKSB7CiAgIFN0YXJ0T2JqQ01ldGhvZChPTUQsIE9NRC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKSwgT01ELT5nZXRMb2NTdGFydCgpKTsKLSAgRW1pdFN0bXQoT01ELT5nZXRCb2R5KCkpOworICBQR08uYXNzaWduUmVnaW9uQ291bnRlcnMoT01ELCBDdXJGbik7CisgIGFzc2VydChpc2E8Q29tcG91bmRTdG10PihPTUQtPmdldEJvZHkoKSkpOworICBSZWdpb25Db3VudGVyIENudCA9IGdldFBHT1JlZ2lvbkNvdW50ZXIoT01ELT5nZXRCb2R5KCkpOworICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CisgIEVtaXRDb21wb3VuZFN0bXRXaXRob3V0U2NvcGUoKmNhc3Q8Q29tcG91bmRTdG10PihPTUQtPmdldEJvZHkoKSkpOwogICBGaW5pc2hGdW5jdGlvbihPTUQtPmdldEJvZHlSQnJhY2UoKSk7CisgIFBHTy5lbWl0SW5zdHJ1bWVudGF0aW9uRGF0YSgpOworICBQR08uZGVzdHJveVJlZ2lvbkNvdW50ZXJzKCk7CiB9CiAKIC8vLyBlbWl0U3RydWN0R2V0dGVyQ2FsbCAtIENhbGwgdGhlIHJ1bnRpbWUgZnVuY3Rpb24gdG8gbG9hZCBhIHByb3BlcnR5CkBAIC02MjIsOCArNjIzLDggQEAKICAgLy8gRXZhbHVhdGUgdGhlIGl2YXIncyBzaXplIGFuZCBhbGlnbm1lbnQuCiAgIE9iakNJdmFyRGVjbCAqaXZhciA9IHByb3BJbXBsLT5nZXRQcm9wZXJ0eUl2YXJEZWNsKCk7CiAgIFF1YWxUeXBlIGl2YXJUeXBlID0gaXZhci0+Z2V0VHlwZSgpOwotICBsbHZtOjp0aWUoSXZhclNpemUsIEl2YXJBbGlnbm1lbnQpCi0gICAgPSBDR00uZ2V0Q29udGV4dCgpLmdldFR5cGVJbmZvSW5DaGFycyhpdmFyVHlwZSk7CisgIHN0ZDo6dGllKEl2YXJTaXplLCBJdmFyQWxpZ25tZW50KSA9CisgICAgICBDR00uZ2V0Q29udGV4dCgpLmdldFR5cGVJbmZvSW5DaGFycyhpdmFyVHlwZSk7CiAKICAgLy8gSWYgd2UgaGF2ZSBhIGNvcHkgcHJvcGVydHksIHdlIGFsd2F5cyBoYXZlIHRvIHVzZSBnZXRQcm9wZXJ0eS9zZXRQcm9wZXJ0eS4KICAgLy8gVE9ETzogd2UgY291bGQgYWN0dWFsbHkgdXNlIHNldFByb3BlcnR5IGFuZCBhbiBleHByZXNzaW9uIGZvciBub24tYXRvbWljcy4KQEAgLTg5NSwxNiArODk2LDIxIEBACiAKICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IG5lZWQgdG8gZ2V0IHRoZSBmdW5jdGlvbiBpbmZvIGhlcmUsIHRoZQogICAgIC8vIHJ1bnRpbWUgYWxyZWFkeSBzaG91bGQgaGF2ZSBjb21wdXRlZCBpdCB0byBidWlsZCB0aGUgZnVuY3Rpb24uCisgICAgbGx2bTo6SW5zdHJ1Y3Rpb24gKkNhbGxJbnN0cnVjdGlvbjsKICAgICBSVmFsdWUgUlYgPSBFbWl0Q2FsbChnZXRUeXBlcygpLmFycmFuZ2VGcmVlRnVuY3Rpb25DYWxsKHByb3BUeXBlLCBhcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRBcmdzOjpBbGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb3BlcnR5Rm4sIFJldHVyblZhbHVlU2xvdCgpLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eUZuLCBSZXR1cm5WYWx1ZVNsb3QoKSwgYXJncywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FsbEluc3RydWN0aW9uKTsKKyAgICBpZiAobGx2bTo6Q2FsbEluc3QgKmNhbGwgPSBkeW5fY2FzdDxsbHZtOjpDYWxsSW5zdD4oQ2FsbEluc3RydWN0aW9uKSkKKyAgICAgIGNhbGwtPnNldFRhaWxDYWxsKCk7CiAKICAgICAvLyBXZSBuZWVkIHRvIGZpeCB0aGUgdHlwZSBoZXJlLiBJdmFycyB3aXRoIGNvcHkgJiByZXRhaW4gYXJlCiAgICAgLy8gYWx3YXlzIG9iamVjdHMgc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBjb21wbGV4IG9yCiAgICAgLy8gYWdncmVnYXRlcy4KLSAgICBSViA9IFJWYWx1ZTo6Z2V0KEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChSVi5nZXRTY2FsYXJWYWwoKSwKLSAgICAgICAgICAgZ2V0VHlwZXMoKS5Db252ZXJ0VHlwZShnZXR0ZXJNZXRob2QtPmdldFJlc3VsdFR5cGUoKSkpKTsKKyAgICBSViA9IFJWYWx1ZTo6Z2V0KEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdCgKKyAgICAgICAgUlYuZ2V0U2NhbGFyVmFsKCksCisgICAgICAgIGdldFR5cGVzKCkuQ29udmVydFR5cGUoZ2V0dGVyTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCkpKSk7CiAKICAgICBFbWl0UmV0dXJuT2ZSVmFsdWUoUlYsIHByb3BUeXBlKTsKIApAQCAtOTU1LDggKzk2MSw4IEBACiAgICAgICAgIH0KIAogICAgICAgICB2YWx1ZSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdCh2YWx1ZSwgQ29udmVydFR5cGUocHJvcFR5cGUpKTsKLSAgICAgICAgdmFsdWUgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QodmFsdWUsIAotICAgICAgICAgICAgICAgICAgQ29udmVydFR5cGUoR2V0dGVyTWV0aG9kRGVjbC0+Z2V0UmVzdWx0VHlwZSgpKSk7CisgICAgICAgIHZhbHVlID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KAorICAgICAgICAgICAgdmFsdWUsIENvbnZlcnRUeXBlKEdldHRlck1ldGhvZERlY2wtPmdldFJldHVyblR5cGUoKSkpOwogICAgICAgfQogICAgICAgCiAgICAgICBFbWl0UmV0dXJuT2ZSVmFsdWUoUlZhbHVlOjpnZXQodmFsdWUpLCBwcm9wVHlwZSk7CkBAIC0xMjkyLDcgKzEyOTgsNyBAQAogICAgICAgOiBhZGRyKGFkZHIpLCBpdmFyKGl2YXIpLCBkZXN0cm95ZXIoZGVzdHJveWVyKSwKICAgICAgICAgdXNlRUhDbGVhbnVwRm9yQXJyYXkodXNlRUhDbGVhbnVwRm9yQXJyYXkpIHt9CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgTFZhbHVlIGx2YWx1ZQogICAgICAgICA9IENHRi5FbWl0TFZhbHVlRm9ySXZhcihDR0YuVHlwZU9mU2VsZk9iamVjdCgpLCBhZGRyLCBpdmFyLCAvKkNWUiovIDApOwogICAgICAgQ0dGLmVtaXREZXN0cm95KGx2YWx1ZS5nZXRBZGRyZXNzKCksIGl2YXItPmdldFR5cGUoKSwgZGVzdHJveWVyLApAQCAtMTM1NiwxMiArMTM2Miw5IEBACiAgICAgLy8gU3VwcHJlc3MgdGhlIGZpbmFsIGF1dG9yZWxlYXNlIGluIEFSQy4KICAgICBBdXRvcmVsZWFzZVJlc3VsdCA9IGZhbHNlOwogCi0gICAgU21hbGxWZWN0b3I8Q1hYQ3RvckluaXRpYWxpemVyICosIDg+IEl2YXJJbml0aWFsaXplcnM7Ci0gICAgZm9yIChPYmpDSW1wbGVtZW50YXRpb25EZWNsOjppbml0X2NvbnN0X2l0ZXJhdG9yIEIgPSBJTVAtPmluaXRfYmVnaW4oKSwKLSAgICAgICAgICAgRSA9IElNUC0+aW5pdF9lbmQoKTsgQiAhPSBFOyArK0IpIHsKLSAgICAgIENYWEN0b3JJbml0aWFsaXplciAqSXZhckluaXQgPSAoKkIpOworICAgIGZvciAoY29uc3QgYXV0byAqSXZhckluaXQgOiBJTVAtPmluaXRzKCkpIHsKICAgICAgIEZpZWxkRGVjbCAqRmllbGQgPSBJdmFySW5pdC0+Z2V0QW55TWVtYmVyKCk7Ci0gICAgICBPYmpDSXZhckRlY2wgICpJdmFyID0gY2FzdDxPYmpDSXZhckRlY2w+KEZpZWxkKTsKKyAgICAgIE9iakNJdmFyRGVjbCAqSXZhciA9IGNhc3Q8T2JqQ0l2YXJEZWNsPihGaWVsZCk7CiAgICAgICBMVmFsdWUgTFYgPSBFbWl0TFZhbHVlRm9ySXZhcihUeXBlT2ZTZWxmT2JqZWN0KCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZE9iakNTZWxmKCksIEl2YXIsIDApOwogICAgICAgRW1pdEFnZ0V4cHIoSXZhckluaXQtPmdldEluaXQoKSwKQEAgLTE1MDYsOSArMTUwOSwxMyBAQAogICBsbHZtOjpWYWx1ZSAqemVybyA9IGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoVW5zaWduZWRMb25nTFR5KTsKIAogICAvLyBJZiB0aGUgbGltaXQgcG9pbnRlciB3YXMgemVybyB0byBiZWdpbiB3aXRoLCB0aGUgY29sbGVjdGlvbiBpcwotICAvLyBlbXB0eTsgc2tpcCBhbGwgdGhpcy4KKyAgLy8gZW1wdHk7IHNraXAgYWxsIHRoaXMuIFNldCB0aGUgYnJhbmNoIHdlaWdodCBhc3N1bWluZyB0aGlzIGhhcyB0aGUgc2FtZQorICAvLyBwcm9iYWJpbGl0eSBvZiBleGl0aW5nIHRoZSBsb29wIGFzIGFueSBvdGhlciBsb29wIGV4aXQuCisgIHVpbnQ2NF90IEVudHJ5Q291bnQgPSBQR08uZ2V0Q3VycmVudFJlZ2lvbkNvdW50KCk7CisgIFJlZ2lvbkNvdW50ZXIgQ250ID0gZ2V0UEdPUmVnaW9uQ291bnRlcigmUyk7CiAgIEJ1aWxkZXIuQ3JlYXRlQ29uZEJyKEJ1aWxkZXIuQ3JlYXRlSUNtcEVRKGluaXRpYWxCdWZmZXJMaW1pdCwgemVybywgImlzemVybyIpLAotICAgICAgICAgICAgICAgICAgICAgICBFbXB0eUJCLCBMb29wSW5pdEJCKTsKKyAgICAgICAgICAgICAgICAgICAgICAgRW1wdHlCQiwgTG9vcEluaXRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgUEdPLmNyZWF0ZUJyYW5jaFdlaWdodHMoRW50cnlDb3VudCwgQ250LmdldENvdW50KCkpKTsKIAogICAvLyBPdGhlcndpc2UsIGluaXRpYWxpemUgdGhlIGxvb3AuCiAgIEVtaXRCbG9jayhMb29wSW5pdEJCKTsKQEAgLTE1MzcsNiArMTU0NCw4IEBACiAgIGxsdm06OlBISU5vZGUgKmNvdW50ID0gQnVpbGRlci5DcmVhdGVQSEkoVW5zaWduZWRMb25nTFR5LCAzLCAiZm9yY29sbC5jb3VudCIpOwogICBjb3VudC0+YWRkSW5jb21pbmcoaW5pdGlhbEJ1ZmZlckxpbWl0LCBMb29wSW5pdEJCKTsKIAorICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CisKICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgbXV0YXRpb25zIHZhbHVlIGhhcyBjaGFuZ2VkIGZyb20gd2hlcmUgaXQgd2FzCiAgIC8vIGF0IHN0YXJ0LiAgU3RhdGVNdXRhdGlvbnNQdHIgc2hvdWxkIGFjdHVhbGx5IGJlIGludmFyaWFudCBiZXR3ZWVuCiAgIC8vIHJlZnJlc2hlcy4KQEAgLTE2NDQsOCArMTY1MywxMiBAQAogICAgID0gQnVpbGRlci5DcmVhdGVBZGQoaW5kZXgsIGxsdm06OkNvbnN0YW50SW50OjpnZXQoVW5zaWduZWRMb25nTFR5LCAxKSk7CiAKICAgLy8gSWYgd2UgaGF2ZW4ndCBvdmVycnVuIHRoZSBidWZmZXIgeWV0LCB3ZSBjYW4gY29udGludWUuCisgIC8vIFNldCB0aGUgYnJhbmNoIHdlaWdodHMgYmFzZWQgb24gdGhlIHNpbXBsaWZ5aW5nIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzCisgIC8vIGxpa2UgYSB3aGlsZS1sb29wLCBpLmUuLCBpZ25vcmluZyB0aGF0IHRoZSBmYWxzZSBicmFuY2ggZmV0Y2hlcyBtb3JlCisgIC8vIGVsZW1lbnRzIGFuZCB0aGVuIHJldHVybnMgdG8gdGhlIGxvb3AuCiAgIEJ1aWxkZXIuQ3JlYXRlQ29uZEJyKEJ1aWxkZXIuQ3JlYXRlSUNtcFVMVChpbmRleFBsdXNPbmUsIGNvdW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgTG9vcEJvZHlCQiwgRmV0Y2hNb3JlQkIpOworICAgICAgICAgICAgICAgICAgICAgICBMb29wQm9keUJCLCBGZXRjaE1vcmVCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgUEdPLmNyZWF0ZUJyYW5jaFdlaWdodHMoQ250LmdldENvdW50KCksIEVudHJ5Q291bnQpKTsKIAogICBpbmRleC0+YWRkSW5jb21pbmcoaW5kZXhQbHVzT25lLCBBZnRlckJvZHkuZ2V0QmxvY2soKSk7CiAgIGNvdW50LT5hZGRJbmNvbWluZyhjb3VudCwgQWZ0ZXJCb2R5LmdldEJsb2NrKCkpOwpAQCAtMTcxNSw3ICsxNzI4LDcgQEAKICAgICBDYWxsT2JqQ1JlbGVhc2UobGx2bTo6VmFsdWUgKm9iamVjdCkgOiBvYmplY3Qob2JqZWN0KSB7fQogICAgIGxsdm06OlZhbHVlICpvYmplY3Q7CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgLy8gUmVsZWFzZXMgYXQgdGhlIGVuZCBvZiB0aGUgZnVsbC1leHByZXNzaW9uIGFyZSBpbXByZWNpc2UuCiAgICAgICBDR0YuRW1pdEFSQ1JlbGVhc2Uob2JqZWN0LCBBUkNJbXByZWNpc2VMaWZldGltZSk7CiAgICAgfQpAQCAtMjMyNCw3ICsyMzM3LDcgQEAKIAogICAgIENhbGxPYmpDQXV0b3JlbGVhc2VQb29sT2JqZWN0KGxsdm06OlZhbHVlICp0b2tlbikgOiBUb2tlbih0b2tlbikge30KIAotICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSBvdmVycmlkZSB7CiAgICAgICBDR0YuRW1pdE9iakNBdXRvcmVsZWFzZVBvb2xQb3AoVG9rZW4pOwogICAgIH0KICAgfTsKQEAgLTIzMzMsNyArMjM0Niw3IEBACiAKICAgICBDYWxsT2JqQ01SUkF1dG9yZWxlYXNlUG9vbE9iamVjdChsbHZtOjpWYWx1ZSAqdG9rZW4pIDogVG9rZW4odG9rZW4pIHt9CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgQ0dGLkVtaXRPYmpDTVJSQXV0b3JlbGVhc2VQb29sUG9wKFRva2VuKTsKICAgICB9CiAgIH07CkBAIC0yODI0LDkgKzI4MzcsOCBAQAogICAgIEVIU3RhY2sucHVzaENsZWFudXA8Q2FsbE9iakNNUlJBdXRvcmVsZWFzZVBvb2xPYmplY3Q+KE5vcm1hbENsZWFudXAsIHRva2VuKTsKICAgfQogCi0gIGZvciAoQ29tcG91bmRTdG10Ojpjb25zdF9ib2R5X2l0ZXJhdG9yIEkgPSBTLmJvZHlfYmVnaW4oKSwKLSAgICAgICBFID0gUy5ib2R5X2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBFbWl0U3RtdCgqSSk7CisgIGZvciAoY29uc3QgYXV0byAqSSA6IFMuYm9keSgpKQorICAgIEVtaXRTdG10KEkpOwogCiAgIGlmIChESSkKICAgICBESS0+RW1pdExleGljYWxCbG9ja0VuZChCdWlsZGVyLCBTLmdldFJCcmFjTG9jKCkpOwpAQCAtMjg5MiwxMiArMjkwNCwxMCBAQAogICBhcmdzLnB1c2hfYmFjaygmZHN0RGVjbCk7CiAgIEltcGxpY2l0UGFyYW1EZWNsIHNyY0RlY2woRkQsIFNvdXJjZUxvY2F0aW9uKCksIDAsIFNyY1R5KTsKICAgYXJncy5wdXNoX2JhY2soJnNyY0RlY2wpOwotICAKLSAgY29uc3QgQ0dGdW5jdGlvbkluZm8gJkZJID0KLSAgICBDR00uZ2V0VHlwZXMoKS5hcnJhbmdlRnVuY3Rpb25EZWNsYXJhdGlvbihDLlZvaWRUeSwgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblR5cGU6OkV4dEluZm8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZEFyZ3M6OkFsbCk7Ci0gIAorCisgIGNvbnN0IENHRnVuY3Rpb25JbmZvICZGSSA9IENHTS5nZXRUeXBlcygpLmFycmFuZ2VGcmVlRnVuY3Rpb25EZWNsYXJhdGlvbigKKyAgICAgIEMuVm9pZFR5LCBhcmdzLCBGdW5jdGlvblR5cGU6OkV4dEluZm8oKSwgUmVxdWlyZWRBcmdzOjpBbGwpOworCiAgIGxsdm06OkZ1bmN0aW9uVHlwZSAqTFR5ID0gQ0dNLmdldFR5cGVzKCkuR2V0RnVuY3Rpb25UeXBlKEZJKTsKICAgCiAgIGxsdm06OkZ1bmN0aW9uICpGbiA9CkBAIC0yOTczLDEyICsyOTgzLDEwIEBACiAgIGFyZ3MucHVzaF9iYWNrKCZkc3REZWNsKTsKICAgSW1wbGljaXRQYXJhbURlY2wgc3JjRGVjbChGRCwgU291cmNlTG9jYXRpb24oKSwgMCwgU3JjVHkpOwogICBhcmdzLnB1c2hfYmFjaygmc3JjRGVjbCk7Ci0gIAotICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmRkkgPQotICBDR00uZ2V0VHlwZXMoKS5hcnJhbmdlRnVuY3Rpb25EZWNsYXJhdGlvbihDLlZvaWRUeSwgYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkQXJnczo6QWxsKTsKLSAgCisKKyAgY29uc3QgQ0dGdW5jdGlvbkluZm8gJkZJID0gQ0dNLmdldFR5cGVzKCkuYXJyYW5nZUZyZWVGdW5jdGlvbkRlY2xhcmF0aW9uKAorICAgICAgQy5Wb2lkVHksIGFyZ3MsIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbygpLCBSZXF1aXJlZEFyZ3M6OkFsbCk7CisKICAgbGx2bTo6RnVuY3Rpb25UeXBlICpMVHkgPSBDR00uZ2V0VHlwZXMoKS5HZXRGdW5jdGlvblR5cGUoRkkpOwogICAKICAgbGx2bTo6RnVuY3Rpb24gKkZuID0KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHT2JqQ0dOVS5jcHAgYi9saWIvQ29kZUdlbi9DR09iakNHTlUuY3BwCmluZGV4IGE3YWI4NTAuLjI2ODlkN2IgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NHT2JqQ0dOVS5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ0dPYmpDR05VLmNwcApAQCAtMjcsMTEgKzI3LDExIEBACiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgogI2luY2x1ZGUgImxsdm0vSVIvRGF0YUxheW91dC5oIgogI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgogI2luY2x1ZGUgImxsdm0vSVIvTExWTUNvbnRleHQuaCIKICNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgogI2luY2x1ZGUgPGNzdGRhcmc+CiAKQEAgLTQ3OSwxMDIgKzQ3OSw5MSBAQAogICBDR09iakNHTlUoQ29kZUdlbk1vZHVsZSAmY2dtLCB1bnNpZ25lZCBydW50aW1lQUJJVmVyc2lvbiwKICAgICAgIHVuc2lnbmVkIHByb3RvY29sQ2xhc3NWZXJzaW9uKTsKIAotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZW5lcmF0ZUNvbnN0YW50U3RyaW5nKGNvbnN0IFN0cmluZ0xpdGVyYWwgKik7CisgIGxsdm06OkNvbnN0YW50ICpHZW5lcmF0ZUNvbnN0YW50U3RyaW5nKGNvbnN0IFN0cmluZ0xpdGVyYWwgKikgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBSVmFsdWUKLSAgR2VuZXJhdGVNZXNzYWdlU2VuZChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5WYWx1ZVNsb3QgUmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFJlc3VsdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsLAotICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpSZWNlaXZlciwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsQXJnTGlzdCAmQ2FsbEFyZ3MsCisgIFJWYWx1ZQorICBHZW5lcmF0ZU1lc3NhZ2VTZW5kKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBSZXR1cm5WYWx1ZVNsb3QgUmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFJlc3VsdFR5cGUsIFNlbGVjdG9yIFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqUmVjZWl2ZXIsIGNvbnN0IENhbGxBcmdMaXN0ICZDYWxsQXJncywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCk7Ci0gIHZpcnR1YWwgUlZhbHVlCi0gIEdlbmVyYXRlTWVzc2FnZVNlbmRTdXBlcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblZhbHVlU2xvdCBSZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBSZXN1bHRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2QpIG92ZXJyaWRlOworICBSVmFsdWUKKyAgR2VuZXJhdGVNZXNzYWdlU2VuZFN1cGVyKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBSZXR1cm5WYWx1ZVNsb3QgUmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUmVzdWx0VHlwZSwgU2VsZWN0b3IgU2VsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0NhdGVnb3J5SW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpSZWNlaXZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNDbGFzc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsQXJnTGlzdCAmQ2FsbEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kKTsKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqR2V0Q2xhc3MoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpPSUQpOwotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpHZXRTZWxlY3RvcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwgU2VsZWN0b3IgU2VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGx2YWwgPSBmYWxzZSk7Ci0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkdldFNlbGVjdG9yKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBjb25zdCBPYmpDTWV0aG9kRGVjbAotICAgICAgKk1ldGhvZCk7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkdldEVIVHlwZShRdWFsVHlwZSBUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNDYXRlZ29yeUltcGwsIGxsdm06OlZhbHVlICpSZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNDbGFzc01lc3NhZ2UsIGNvbnN0IENhbGxBcmdMaXN0ICZDYWxsQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2QpIG92ZXJyaWRlOworICBsbHZtOjpWYWx1ZSAqR2V0Q2xhc3MoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqT0lEKSBvdmVycmlkZTsKKyAgbGx2bTo6VmFsdWUgKkdldFNlbGVjdG9yKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGx2YWwgPSBmYWxzZSkgb3ZlcnJpZGU7CisgIGxsdm06OlZhbHVlICpHZXRTZWxlY3RvcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2QpIG92ZXJyaWRlOworICBsbHZtOjpDb25zdGFudCAqR2V0RUhUeXBlKFF1YWxUeXBlIFQpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgbGx2bTo6RnVuY3Rpb24gKkdlbmVyYXRlTWV0aG9kKGNvbnN0IE9iakNNZXRob2REZWNsICpPTUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNDb250YWluZXJEZWNsICpDRCk7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNhdGVnb3J5KGNvbnN0IE9iakNDYXRlZ29yeUltcGxEZWNsICpDTUQpOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDbGFzcyhjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpDbGFzc0RlY2wpOwotICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJBbGlhcyhjb25zdCBPYmpDQ29tcGF0aWJsZUFsaWFzRGVjbCAqT0FEKTsKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqR2VuZXJhdGVQcm90b2NvbFJlZihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRCk7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVByb3RvY29sKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlBEKTsKLSAgdmlydHVhbCBsbHZtOjpGdW5jdGlvbiAqTW9kdWxlSW5pdEZ1bmN0aW9uKCk7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkdldFByb3BlcnR5R2V0RnVuY3Rpb24oKTsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCAqR2V0UHJvcGVydHlTZXRGdW5jdGlvbigpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRPcHRpbWl6ZWRQcm9wZXJ0eVNldEZ1bmN0aW9uKGJvb2wgYXRvbWljLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvcHkpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRTZXRTdHJ1Y3RGdW5jdGlvbigpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRHZXRTdHJ1Y3RGdW5jdGlvbigpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRDcHBBdG9taWNPYmplY3RHZXRGdW5jdGlvbigpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRDcHBBdG9taWNPYmplY3RTZXRGdW5jdGlvbigpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpFbnVtZXJhdGlvbk11dGF0aW9uRnVuY3Rpb24oKTsKKyAgbGx2bTo6RnVuY3Rpb24gKkdlbmVyYXRlTWV0aG9kKGNvbnN0IE9iakNNZXRob2REZWNsICpPTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDQ29udGFpbmVyRGVjbCAqQ0QpIG92ZXJyaWRlOworICB2b2lkIEdlbmVyYXRlQ2F0ZWdvcnkoY29uc3QgT2JqQ0NhdGVnb3J5SW1wbERlY2wgKkNNRCkgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVDbGFzcyhjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpDbGFzc0RlY2wpIG92ZXJyaWRlOworICB2b2lkIFJlZ2lzdGVyQWxpYXMoY29uc3QgT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2wgKk9BRCkgb3ZlcnJpZGU7CisgIGxsdm06OlZhbHVlICpHZW5lcmF0ZVByb3RvY29sUmVmKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRCkgb3ZlcnJpZGU7CisgIHZvaWQgR2VuZXJhdGVQcm90b2NvbChjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRCkgb3ZlcnJpZGU7CisgIGxsdm06OkZ1bmN0aW9uICpNb2R1bGVJbml0RnVuY3Rpb24oKSBvdmVycmlkZTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldFByb3BlcnR5R2V0RnVuY3Rpb24oKSBvdmVycmlkZTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldFByb3BlcnR5U2V0RnVuY3Rpb24oKSBvdmVycmlkZTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldE9wdGltaXplZFByb3BlcnR5U2V0RnVuY3Rpb24oYm9vbCBhdG9taWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29weSkgb3ZlcnJpZGU7CisgIGxsdm06OkNvbnN0YW50ICpHZXRTZXRTdHJ1Y3RGdW5jdGlvbigpIG92ZXJyaWRlOworICBsbHZtOjpDb25zdGFudCAqR2V0R2V0U3RydWN0RnVuY3Rpb24oKSBvdmVycmlkZTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldENwcEF0b21pY09iamVjdEdldEZ1bmN0aW9uKCkgb3ZlcnJpZGU7CisgIGxsdm06OkNvbnN0YW50ICpHZXRDcHBBdG9taWNPYmplY3RTZXRGdW5jdGlvbigpIG92ZXJyaWRlOworICBsbHZtOjpDb25zdGFudCAqRW51bWVyYXRpb25NdXRhdGlvbkZ1bmN0aW9uKCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIEVtaXRUcnlTdG10KENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0F0VHJ5U3RtdCAmUyk7Ci0gIHZpcnR1YWwgdm9pZCBFbWl0U3luY2hyb25pemVkU3RtdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNBdFN5bmNocm9uaXplZFN0bXQgJlMpOwotICB2aXJ0dWFsIHZvaWQgRW1pdFRocm93U3RtdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0F0VGhyb3dTdG10ICZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENsZWFySW5zZXJ0aW9uUG9pbnQ9dHJ1ZSk7Ci0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKiBFbWl0T2JqQ1dlYWtSZWFkKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQWRkcldlYWtPYmopOwotICB2aXJ0dWFsIHZvaWQgRW1pdE9iakNXZWFrQXNzaWduKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmMsIGxsdm06OlZhbHVlICpkc3QpOwotICB2aXJ0dWFsIHZvaWQgRW1pdE9iakNHbG9iYWxBc3NpZ24oQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqc3JjLCBsbHZtOjpWYWx1ZSAqZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkbG9jYWw9ZmFsc2UpOwotICB2aXJ0dWFsIHZvaWQgRW1pdE9iakNJdmFyQXNzaWduKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnNyYywgbGx2bTo6VmFsdWUgKmRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqaXZhck9mZnNldCk7Ci0gIHZpcnR1YWwgdm9pZCBFbWl0T2JqQ1N0cm9uZ0Nhc3RBc3NpZ24oQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnNyYywgbGx2bTo6VmFsdWUgKmRlc3QpOwotICB2aXJ0dWFsIHZvaWQgRW1pdEdDTWVtbW92ZUNvbGxlY3RhYmxlKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpEZXN0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpTcmNQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlNpemUpOwotICB2aXJ0dWFsIExWYWx1ZSBFbWl0T2JqQ1ZhbHVlRm9ySXZhcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgT2JqZWN0VHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpCYXNlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJdmFyRGVjbCAqSXZhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ1ZSUXVhbGlmaWVycyk7Ci0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRJdmFyT2Zmc2V0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSXZhckRlY2wgKkl2YXIpOwotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpFbWl0TlNBdXRvcmVsZWFzZVBvb2xDbGFzc1JlZihDb2RlR2VuRnVuY3Rpb24gJkNHRik7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkJ1aWxkR0NCbG9ja0xheW91dChDb2RlR2VuTW9kdWxlICZDR00sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDR0Jsb2NrSW5mbyAmYmxvY2tJbmZvKSB7CisgIHZvaWQgRW1pdFRyeVN0bXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0F0VHJ5U3RtdCAmUykgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFN5bmNocm9uaXplZFN0bXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0F0U3luY2hyb25pemVkU3RtdCAmUykgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFRocm93U3RtdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNBdFRocm93U3RtdCAmUywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2xlYXJJbnNlcnRpb25Qb2ludD10cnVlKSBvdmVycmlkZTsKKyAgbGx2bTo6VmFsdWUgKiBFbWl0T2JqQ1dlYWtSZWFkKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkFkZHJXZWFrT2JqKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0T2JqQ1dlYWtBc3NpZ24oQ29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmMsIGxsdm06OlZhbHVlICpkc3QpIG92ZXJyaWRlOworICB2b2lkIEVtaXRPYmpDR2xvYmFsQXNzaWduKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmMsIGxsdm06OlZhbHVlICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkbG9jYWw9ZmFsc2UpIG92ZXJyaWRlOworICB2b2lkIEVtaXRPYmpDSXZhckFzc2lnbihDb2RlR2VuRnVuY3Rpb24gJkNHRiwgbGx2bTo6VmFsdWUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKmRlc3QsIGxsdm06OlZhbHVlICppdmFyT2Zmc2V0KSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0T2JqQ1N0cm9uZ0Nhc3RBc3NpZ24oQ29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmMsIGxsdm06OlZhbHVlICpkZXN0KSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0R0NNZW1tb3ZlQ29sbGVjdGFibGUoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGxsdm06OlZhbHVlICpEZXN0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqU3JjUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqU2l6ZSkgb3ZlcnJpZGU7CisgIExWYWx1ZSBFbWl0T2JqQ1ZhbHVlRm9ySXZhcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwgUXVhbFR5cGUgT2JqZWN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQmFzZVZhbHVlLCBjb25zdCBPYmpDSXZhckRlY2wgKkl2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDVlJRdWFsaWZpZXJzKSBvdmVycmlkZTsKKyAgbGx2bTo6VmFsdWUgKkVtaXRJdmFyT2Zmc2V0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKkludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJdmFyRGVjbCAqSXZhcikgb3ZlcnJpZGU7CisgIGxsdm06OlZhbHVlICpFbWl0TlNBdXRvcmVsZWFzZVBvb2xDbGFzc1JlZihDb2RlR2VuRnVuY3Rpb24gJkNHRikgb3ZlcnJpZGU7CisgIGxsdm06OkNvbnN0YW50ICpCdWlsZEdDQmxvY2tMYXlvdXQoQ29kZUdlbk1vZHVsZSAmQ0dNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENHQmxvY2tJbmZvICZibG9ja0luZm8pIG92ZXJyaWRlIHsKICAgICByZXR1cm4gTlVMTFB0cjsKICAgfQotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpCdWlsZFJDQmxvY2tMYXlvdXQoQ29kZUdlbk1vZHVsZSAmQ0dNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0dCbG9ja0luZm8gJmJsb2NrSW5mbykgeworICBsbHZtOjpDb25zdGFudCAqQnVpbGRSQ0Jsb2NrTGF5b3V0KENvZGVHZW5Nb2R1bGUgJkNHTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDR0Jsb2NrSW5mbyAmYmxvY2tJbmZvKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIE5VTExQdHI7CiAgIH0KLSAgCi0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkJ1aWxkQnlyZWZMYXlvdXQoQ29kZUdlbk1vZHVsZSAmQ0dNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQpIHsKKworICBsbHZtOjpDb25zdGFudCAqQnVpbGRCeXJlZkxheW91dChDb2RlR2VuTW9kdWxlICZDR00sIFF1YWxUeXBlIFQpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gTlVMTFB0cjsKICAgfQotICAKLSAgdmlydHVhbCBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR2V0Q2xhc3NHbG9iYWwoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKworICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR2V0Q2xhc3NHbG9iYWwoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFdlYWsgPSBmYWxzZSkgb3ZlcnJpZGUgewogICAgIHJldHVybiAwOwogICB9CiB9OwpAQCAtNTk1LDExICs1ODQsOSBAQAogICAvLy8gYXJndW1lbnRzLiAgUmV0dXJucyB0aGUgSU1QIGZvciB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QuCiAgIExhenlSdW50aW1lRnVuY3Rpb24gTXNnTG9va3VwU3VwZXJGbjsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqTG9va3VwSU1QKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKiZSZWNlaXZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpNRE5vZGUgKm5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU2VuZEluZm8gJk1TSSkgeworICBsbHZtOjpWYWx1ZSAqTG9va3VwSU1QKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBsbHZtOjpWYWx1ZSAqJlJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpjbWQsIGxsdm06Ok1ETm9kZSAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU2VuZEluZm8gJk1TSSkgb3ZlcnJpZGUgewogICAgIENHQnVpbGRlclR5ICZCdWlsZGVyID0gQ0dGLkJ1aWxkZXI7CiAgICAgbGx2bTo6VmFsdWUgKmFyZ3NbXSA9IHsKICAgICAgICAgICAgIEVuZm9yY2VUeXBlKEJ1aWxkZXIsIFJlY2VpdmVyLCBJZFR5KSwKQEAgLTYwOCwxMCArNTk1LDggQEAKICAgICBpbXAtPnNldE1ldGFkYXRhKG1zZ1NlbmRNREtpbmQsIG5vZGUpOwogICAgIHJldHVybiBpbXAuZ2V0SW5zdHJ1Y3Rpb24oKTsKICAgfQotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpMb29rdXBJTVBTdXBlcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKk9iakNTdXBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNlbmRJbmZvICZNU0kpIHsKKyAgbGx2bTo6VmFsdWUgKkxvb2t1cElNUFN1cGVyKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBsbHZtOjpWYWx1ZSAqT2JqQ1N1cGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKmNtZCwgTWVzc2FnZVNlbmRJbmZvICZNU0kpIG92ZXJyaWRlIHsKICAgICAgIENHQnVpbGRlclR5ICZCdWlsZGVyID0gQ0dGLkJ1aWxkZXI7CiAgICAgICBsbHZtOjpWYWx1ZSAqbG9va3VwQXJnc1tdID0ge0VuZm9yY2VUeXBlKEJ1aWxkZXIsIE9iakNTdXBlciwKICAgICAgICAgICBQdHJUb09iakNTdXBlclR5KSwgY21kfTsKQEAgLTY1NCwxMyArNjM5LDExIEBACiAgICAgLy8vIGxvb2t1cCBmdW5jdGlvbnMuCiAgICAgbGx2bTo6VHlwZSAqU2xvdFR5OwogICBwdWJsaWM6Ci0gICAgdmlydHVhbCBsbHZtOjpDb25zdGFudCAqR2V0RUhUeXBlKFF1YWxUeXBlIFQpOworICAgIGxsdm06OkNvbnN0YW50ICpHZXRFSFR5cGUoUXVhbFR5cGUgVCkgb3ZlcnJpZGU7CiAgIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGxsdm06OlZhbHVlICpMb29rdXBJTVAoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlIComUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Ok1ETm9kZSAqbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNlbmRJbmZvICZNU0kpIHsKKyAgICBsbHZtOjpWYWx1ZSAqTG9va3VwSU1QKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBsbHZtOjpWYWx1ZSAqJlJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKmNtZCwgbGx2bTo6TUROb2RlICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNlbmRJbmZvICZNU0kpIG92ZXJyaWRlIHsKICAgICAgIENHQnVpbGRlclR5ICZCdWlsZGVyID0gQ0dGLkJ1aWxkZXI7CiAgICAgICBsbHZtOjpGdW5jdGlvbiAqTG9va3VwRm4gPSBTbG90TG9va3VwRm47CiAKQEAgLTY5NiwxMCArNjc5LDkgQEAKICAgICAgIFJlY2VpdmVyID0gQnVpbGRlci5DcmVhdGVMb2FkKFJlY2VpdmVyUHRyLCB0cnVlKTsKICAgICAgIHJldHVybiBpbXA7CiAgICAgfQotICAgIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkxvb2t1cElNUFN1cGVyKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpPYmpDU3VwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU2VuZEluZm8gJk1TSSkgeworICAgIGxsdm06OlZhbHVlICpMb29rdXBJTVBTdXBlcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwgbGx2bTo6VmFsdWUgKk9iakNTdXBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNlbmRJbmZvICZNU0kpIG92ZXJyaWRlIHsKICAgICAgIENHQnVpbGRlclR5ICZCdWlsZGVyID0gQ0dGLkJ1aWxkZXI7CiAgICAgICBsbHZtOjpWYWx1ZSAqbG9va3VwQXJnc1tdID0ge09iakNTdXBlciwgY21kfTsKIApAQCAtNzYwLDIyICs3NDIsMjIgQEAKICAgICAgIEN4eEF0b21pY09iamVjdEdldEZuLmluaXQoJkNHTSwgIm9iamNfZ2V0Q3BwT2JqZWN0QXRvbWljIiwgVm9pZFR5LCBQdHJUeSwKICAgICAgICAgICBQdHJUeSwgUHRyVHksIE5VTEwpOwogICAgIH0KLSAgICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRDcHBBdG9taWNPYmplY3RHZXRGdW5jdGlvbigpIHsKKyAgICBsbHZtOjpDb25zdGFudCAqR2V0Q3BwQXRvbWljT2JqZWN0R2V0RnVuY3Rpb24oKSBvdmVycmlkZSB7CiAgICAgICAvLyBUaGUgb3B0aW1pc2VkIGZ1bmN0aW9ucyB3ZXJlIGFkZGVkIGluIHZlcnNpb24gMS43IG9mIHRoZSBHTlVzdGVwCiAgICAgICAvLyBydW50aW1lLgogICAgICAgYXNzZXJ0IChDR00uZ2V0TGFuZ09wdHMoKS5PYmpDUnVudGltZS5nZXRWZXJzaW9uKCkgPj0KICAgICAgICAgICBWZXJzaW9uVHVwbGUoMSwgNykpOwogICAgICAgcmV0dXJuIEN4eEF0b21pY09iamVjdEdldEZuOwogICAgIH0KLSAgICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRDcHBBdG9taWNPYmplY3RTZXRGdW5jdGlvbigpIHsKKyAgICBsbHZtOjpDb25zdGFudCAqR2V0Q3BwQXRvbWljT2JqZWN0U2V0RnVuY3Rpb24oKSBvdmVycmlkZSB7CiAgICAgICAvLyBUaGUgb3B0aW1pc2VkIGZ1bmN0aW9ucyB3ZXJlIGFkZGVkIGluIHZlcnNpb24gMS43IG9mIHRoZSBHTlVzdGVwCiAgICAgICAvLyBydW50aW1lLgogICAgICAgYXNzZXJ0IChDR00uZ2V0TGFuZ09wdHMoKS5PYmpDUnVudGltZS5nZXRWZXJzaW9uKCkgPj0KICAgICAgICAgICBWZXJzaW9uVHVwbGUoMSwgNykpOwogICAgICAgcmV0dXJuIEN4eEF0b21pY09iamVjdFNldEZuOwogICAgIH0KLSAgICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRPcHRpbWl6ZWRQcm9wZXJ0eVNldEZ1bmN0aW9uKGJvb2wgYXRvbWljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb3B5KSB7CisgICAgbGx2bTo6Q29uc3RhbnQgKkdldE9wdGltaXplZFByb3BlcnR5U2V0RnVuY3Rpb24oYm9vbCBhdG9taWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb3B5KSBvdmVycmlkZSB7CiAgICAgICAvLyBUaGUgb3B0aW1pc2VkIHByb3BlcnR5IGZ1bmN0aW9ucyBvbWl0IHRoZSBHQyBjaGVjaywgYW5kIHNvIGFyZSBub3QKICAgICAgIC8vIHNhZmUgdG8gdXNlIGluIEdDIG1vZGUuICBUaGUgc3RhbmRhcmQgZnVuY3Rpb25zIGFyZSBmYXN0IGluIEdDIG1vZGUsCiAgICAgICAvLyBzbyB0aGVyZSBpcyBsZXNzIGFkdmFudGFnZSBpbiB1c2luZyB0aGVtLgpAQCAtNzg5LDEwICs3NzEsOCBAQAogICAgICAgICBpZiAoY29weSkgcmV0dXJuIFNldFByb3BlcnR5QXRvbWljQ29weTsKICAgICAgICAgcmV0dXJuIFNldFByb3BlcnR5QXRvbWljOwogICAgICAgfQotICAgICAgaWYgKGNvcHkpIHJldHVybiBTZXRQcm9wZXJ0eU5vbkF0b21pY0NvcHk7Ci0gICAgICByZXR1cm4gU2V0UHJvcGVydHlOb25BdG9taWM7CiAKLSAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIGNvcHkgPyBTZXRQcm9wZXJ0eU5vbkF0b21pY0NvcHkgOiBTZXRQcm9wZXJ0eU5vbkF0b21pYzsKICAgICB9CiB9OwogCkBAIC04MTAsMTEgKzc5MCw5IEBACiAgIC8vLyBhcmd1bWVudHMuICBSZXR1cm5zIHRoZSBJTVAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZC4KICAgTGF6eVJ1bnRpbWVGdW5jdGlvbiBNc2dMb29rdXBTdXBlckZuLCBNc2dMb29rdXBTdXBlckZuU1JldDsKIAotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpMb29rdXBJTVAoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqJlJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Ok1ETm9kZSAqbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTZW5kSW5mbyAmTVNJKSB7CisgIGxsdm06OlZhbHVlICpMb29rdXBJTVAoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGxsdm06OlZhbHVlIComUmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKmNtZCwgbGx2bTo6TUROb2RlICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTZW5kSW5mbyAmTVNJKSBvdmVycmlkZSB7CiAgICAgQ0dCdWlsZGVyVHkgJkJ1aWxkZXIgPSBDR0YuQnVpbGRlcjsKICAgICBsbHZtOjpWYWx1ZSAqYXJnc1tdID0gewogICAgICAgICAgICAgRW5mb3JjZVR5cGUoQnVpbGRlciwgUmVjZWl2ZXIsIElkVHkpLApAQCAtODMwLDEwICs4MDgsOCBAQAogICAgIHJldHVybiBpbXAuZ2V0SW5zdHJ1Y3Rpb24oKTsKICAgfQogCi0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkxvb2t1cElNUFN1cGVyKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqT2JqQ1N1cGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU2VuZEluZm8gJk1TSSkgeworICBsbHZtOjpWYWx1ZSAqTG9va3VwSU1QU3VwZXIoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGxsdm06OlZhbHVlICpPYmpDU3VwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqY21kLCBNZXNzYWdlU2VuZEluZm8gJk1TSSkgb3ZlcnJpZGUgewogICAgICAgQ0dCdWlsZGVyVHkgJkJ1aWxkZXIgPSBDR0YuQnVpbGRlcjsKICAgICAgIGxsdm06OlZhbHVlICpsb29rdXBBcmdzW10gPSB7RW5mb3JjZVR5cGUoQnVpbGRlciwgT2JqQ1N1cGVyLAogICAgICAgICAgIFB0clRvT2JqQ1N1cGVyVHkpLCBjbWR9OwpAQCAtODQ0LDggKzgyMCw4IEBACiAgICAgICAgIHJldHVybiBDR0YuRW1pdE5vdW53aW5kUnVudGltZUNhbGwoTXNnTG9va3VwU3VwZXJGbiwgbG9va3VwQXJncyk7CiAgICAgfQogCi0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkdldENsYXNzTmFtZWQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIGJvb2wgaXNXZWFrKSB7CisgIGxsdm06OlZhbHVlICpHZXRDbGFzc05hbWVkKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgYm9vbCBpc1dlYWspIG92ZXJyaWRlIHsKICAgICBpZiAoaXNXZWFrKQogICAgICAgcmV0dXJuIENHT2JqQ0dOVTo6R2V0Q2xhc3NOYW1lZChDR0YsIE5hbWUsIGlzV2Vhayk7CiAKQEAgLTk0OCw3ICs5MjQsNyBAQAogICBJbnQ2NFR5ID0gbGx2bTo6VHlwZTo6Z2V0SW50NjRUeShWTUNvbnRleHQpOwogCiAgIEludFB0clR5ID0KLSAgICAgIFRoZU1vZHVsZS5nZXRQb2ludGVyU2l6ZSgpID09IGxsdm06Ok1vZHVsZTo6UG9pbnRlcjMyID8gSW50MzJUeSA6IEludDY0VHk7CisgICAgICBDR00uZ2V0RGF0YUxheW91dCgpLmdldFBvaW50ZXJTaXplSW5CaXRzKCkgPT0gMzIgPyBJbnQzMlR5IDogSW50NjRUeTsKIAogICAvLyBPYmplY3QgdHlwZQogICBRdWFsVHlwZSBVbnF1YWxJZFR5ID0gQ0dNLmdldENvbnRleHQoKS5nZXRPYmpDSWRUeXBlKCk7CkBAIC0xNzc5LDI0ICsxNzU1LDIyIEBACiAgICAgUEQgPSBEZWY7CiAKICAgU21hbGxWZWN0b3I8c3RkOjpzdHJpbmcsIDE2PiBQcm90b2NvbHM7Ci0gIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUEkgPSBQRC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICBFID0gUEQtPnByb3RvY29sX2VuZCgpOyBQSSAhPSBFOyArK1BJKQotICAgIFByb3RvY29scy5wdXNoX2JhY2soKCpQSSktPmdldE5hbWVBc1N0cmluZygpKTsKKyAgZm9yIChjb25zdCBhdXRvICpQSSA6IFBELT5wcm90b2NvbHMoKSkKKyAgICBQcm90b2NvbHMucHVzaF9iYWNrKFBJLT5nZXROYW1lQXNTdHJpbmcoKSk7CiAgIFNtYWxsVmVjdG9yPGxsdm06OkNvbnN0YW50KiwgMTY+IEluc3RhbmNlTWV0aG9kTmFtZXM7CiAgIFNtYWxsVmVjdG9yPGxsdm06OkNvbnN0YW50KiwgMTY+IEluc3RhbmNlTWV0aG9kVHlwZXM7CiAgIFNtYWxsVmVjdG9yPGxsdm06OkNvbnN0YW50KiwgMTY+IE9wdGlvbmFsSW5zdGFuY2VNZXRob2ROYW1lczsKICAgU21hbGxWZWN0b3I8bGx2bTo6Q29uc3RhbnQqLCAxNj4gT3B0aW9uYWxJbnN0YW5jZU1ldGhvZFR5cGVzOwotICBmb3IgKE9iakNQcm90b2NvbERlY2w6Omluc3RtZXRoX2l0ZXJhdG9yIGl0ZXIgPSBQRC0+aW5zdG1ldGhfYmVnaW4oKSwKLSAgICAgICBFID0gUEQtPmluc3RtZXRoX2VuZCgpOyBpdGVyICE9IEU7IGl0ZXIrKykgeworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBQRC0+aW5zdGFuY2VfbWV0aG9kcygpKSB7CiAgICAgc3RkOjpzdHJpbmcgVHlwZVN0cjsKLSAgICBDb250ZXh0LmdldE9iakNFbmNvZGluZ0Zvck1ldGhvZERlY2woKml0ZXIsIFR5cGVTdHIpOwotICAgIGlmICgoKml0ZXIpLT5nZXRJbXBsZW1lbnRhdGlvbkNvbnRyb2woKSA9PSBPYmpDTWV0aG9kRGVjbDo6T3B0aW9uYWwpIHsKKyAgICBDb250ZXh0LmdldE9iakNFbmNvZGluZ0Zvck1ldGhvZERlY2woSSwgVHlwZVN0cik7CisgICAgaWYgKEktPmdldEltcGxlbWVudGF0aW9uQ29udHJvbCgpID09IE9iakNNZXRob2REZWNsOjpPcHRpb25hbCkgewogICAgICAgT3B0aW9uYWxJbnN0YW5jZU1ldGhvZE5hbWVzLnB1c2hfYmFjaygKLSAgICAgICAgICBNYWtlQ29uc3RhbnRTdHJpbmcoKCppdGVyKS0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpKSk7CisgICAgICAgICAgTWFrZUNvbnN0YW50U3RyaW5nKEktPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKSkpOwogICAgICAgT3B0aW9uYWxJbnN0YW5jZU1ldGhvZFR5cGVzLnB1c2hfYmFjayhNYWtlQ29uc3RhbnRTdHJpbmcoVHlwZVN0cikpOwogICAgIH0gZWxzZSB7CiAgICAgICBJbnN0YW5jZU1ldGhvZE5hbWVzLnB1c2hfYmFjaygKLSAgICAgICAgICBNYWtlQ29uc3RhbnRTdHJpbmcoKCppdGVyKS0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpKSk7CisgICAgICAgICAgTWFrZUNvbnN0YW50U3RyaW5nKEktPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKSkpOwogICAgICAgSW5zdGFuY2VNZXRob2RUeXBlcy5wdXNoX2JhY2soTWFrZUNvbnN0YW50U3RyaW5nKFR5cGVTdHIpKTsKICAgICB9CiAgIH0KQEAgLTE4MDUsMTggKzE3NzksMTYgQEAKICAgU21hbGxWZWN0b3I8bGx2bTo6Q29uc3RhbnQqLCAxNj4gQ2xhc3NNZXRob2RUeXBlczsKICAgU21hbGxWZWN0b3I8bGx2bTo6Q29uc3RhbnQqLCAxNj4gT3B0aW9uYWxDbGFzc01ldGhvZE5hbWVzOwogICBTbWFsbFZlY3RvcjxsbHZtOjpDb25zdGFudCosIDE2PiBPcHRpb25hbENsYXNzTWV0aG9kVHlwZXM7Ci0gIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6Y2xhc3NtZXRoX2l0ZXJhdG9yCi0gICAgICAgICBpdGVyID0gUEQtPmNsYXNzbWV0aF9iZWdpbigpLCBlbmRJdGVyID0gUEQtPmNsYXNzbWV0aF9lbmQoKTsKLSAgICAgICBpdGVyICE9IGVuZEl0ZXIgOyBpdGVyKyspIHsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogUEQtPmNsYXNzX21ldGhvZHMoKSkgewogICAgIHN0ZDo6c3RyaW5nIFR5cGVTdHI7Ci0gICAgQ29udGV4dC5nZXRPYmpDRW5jb2RpbmdGb3JNZXRob2REZWNsKCgqaXRlciksVHlwZVN0cik7Ci0gICAgaWYgKCgqaXRlciktPmdldEltcGxlbWVudGF0aW9uQ29udHJvbCgpID09IE9iakNNZXRob2REZWNsOjpPcHRpb25hbCkgeworICAgIENvbnRleHQuZ2V0T2JqQ0VuY29kaW5nRm9yTWV0aG9kRGVjbChJLFR5cGVTdHIpOworICAgIGlmIChJLT5nZXRJbXBsZW1lbnRhdGlvbkNvbnRyb2woKSA9PSBPYmpDTWV0aG9kRGVjbDo6T3B0aW9uYWwpIHsKICAgICAgIE9wdGlvbmFsQ2xhc3NNZXRob2ROYW1lcy5wdXNoX2JhY2soCi0gICAgICAgICAgTWFrZUNvbnN0YW50U3RyaW5nKCgqaXRlciktPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKSkpOworICAgICAgICAgIE1ha2VDb25zdGFudFN0cmluZyhJLT5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCkpKTsKICAgICAgIE9wdGlvbmFsQ2xhc3NNZXRob2RUeXBlcy5wdXNoX2JhY2soTWFrZUNvbnN0YW50U3RyaW5nKFR5cGVTdHIpKTsKICAgICB9IGVsc2UgewogICAgICAgQ2xhc3NNZXRob2ROYW1lcy5wdXNoX2JhY2soCi0gICAgICAgICAgTWFrZUNvbnN0YW50U3RyaW5nKCgqaXRlciktPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKSkpOworICAgICAgICAgIE1ha2VDb25zdGFudFN0cmluZyhJLT5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCkpKTsKICAgICAgIENsYXNzTWV0aG9kVHlwZXMucHVzaF9iYWNrKE1ha2VDb25zdGFudFN0cmluZyhUeXBlU3RyKSk7CiAgICAgfQogICB9CkBAIC0xODQ2LDExICsxODE4LDggQEAKIAogICAvLyBBZGQgYWxsIG9mIHRoZSBwcm9wZXJ0eSBtZXRob2RzIG5lZWQgYWRkaW5nIHRvIHRoZSBtZXRob2QgbGlzdCBhbmQgdG8gdGhlCiAgIC8vIHByb3BlcnR5IG1ldGFkYXRhIGxpc3QuCi0gIGZvciAoT2JqQ0NvbnRhaW5lckRlY2w6OnByb3BfaXRlcmF0b3IKLSAgICAgICAgIGl0ZXIgPSBQRC0+cHJvcF9iZWdpbigpLCBlbmRJdGVyID0gUEQtPnByb3BfZW5kKCk7Ci0gICAgICAgaXRlciAhPSBlbmRJdGVyIDsgaXRlcisrKSB7CisgIGZvciAoYXV0byAqcHJvcGVydHkgOiBQRC0+cHJvcGVydGllcygpKSB7CiAgICAgc3RkOjp2ZWN0b3I8bGx2bTo6Q29uc3RhbnQqPiBGaWVsZHM7Ci0gICAgT2JqQ1Byb3BlcnR5RGVjbCAqcHJvcGVydHkgPSAqaXRlcjsKIAogICAgIEZpZWxkcy5wdXNoX2JhY2soTWFrZVByb3BlcnR5RW5jb2RpbmdTdHJpbmcocHJvcGVydHksIDApKTsKICAgICBQdXNoUHJvcGVydHlBdHRyaWJ1dGVzKEZpZWxkcywgcHJvcGVydHkpOwpAQCAtMTk5Niw4ICsxOTY1LDcgQEAKIC8vLyBiaXRmaWVsZCAvIHdpdGggdGhlIDYzcmQgYml0IHNldCB3aWxsIGJlIDE8PDY0LgogbGx2bTo6Q29uc3RhbnQgKkNHT2JqQ0dOVTo6TWFrZUJpdEZpZWxkKEFycmF5UmVmPGJvb2w+IGJpdHMpIHsKICAgaW50IGJpdENvdW50ID0gYml0cy5zaXplKCk7Ci0gIGludCBwdHJCaXRzID0KLSAgICAgICAgKFRoZU1vZHVsZS5nZXRQb2ludGVyU2l6ZSgpID09IGxsdm06Ok1vZHVsZTo6UG9pbnRlcjMyKSA/IDMyIDogNjQ7CisgIGludCBwdHJCaXRzID0gQ0dNLmdldERhdGFMYXlvdXQoKS5nZXRQb2ludGVyU2l6ZUluQml0cygpOwogICBpZiAoYml0Q291bnQgPCBwdHJCaXRzKSB7CiAgICAgdWludDY0X3QgdmFsID0gMTsKICAgICBmb3IgKGludCBpPTAgOyBpPGJpdENvdW50IDsgKytpKSB7CkBAIC0yMDMyLDI0ICsyMDAwLDIwIEBACiAgIC8vIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgaW5zdGFuY2UgbWV0aG9kcwogICBTbWFsbFZlY3RvcjxTZWxlY3RvciwgMTY+IEluc3RhbmNlTWV0aG9kU2VsczsKICAgU21hbGxWZWN0b3I8bGx2bTo6Q29uc3RhbnQqLCAxNj4gSW5zdGFuY2VNZXRob2RUeXBlczsKLSAgZm9yIChPYmpDQ2F0ZWdvcnlJbXBsRGVjbDo6aW5zdG1ldGhfaXRlcmF0b3IKLSAgICAgICAgIGl0ZXIgPSBPQ0QtPmluc3RtZXRoX2JlZ2luKCksIGVuZEl0ZXIgPSBPQ0QtPmluc3RtZXRoX2VuZCgpOwotICAgICAgIGl0ZXIgIT0gZW5kSXRlciA7IGl0ZXIrKykgewotICAgIEluc3RhbmNlTWV0aG9kU2Vscy5wdXNoX2JhY2soKCppdGVyKS0+Z2V0U2VsZWN0b3IoKSk7CisgIGZvciAoY29uc3QgYXV0byAqSSA6IE9DRC0+aW5zdGFuY2VfbWV0aG9kcygpKSB7CisgICAgSW5zdGFuY2VNZXRob2RTZWxzLnB1c2hfYmFjayhJLT5nZXRTZWxlY3RvcigpKTsKICAgICBzdGQ6OnN0cmluZyBUeXBlU3RyOwotICAgIENHTS5nZXRDb250ZXh0KCkuZ2V0T2JqQ0VuY29kaW5nRm9yTWV0aG9kRGVjbCgqaXRlcixUeXBlU3RyKTsKKyAgICBDR00uZ2V0Q29udGV4dCgpLmdldE9iakNFbmNvZGluZ0Zvck1ldGhvZERlY2woSSxUeXBlU3RyKTsKICAgICBJbnN0YW5jZU1ldGhvZFR5cGVzLnB1c2hfYmFjayhNYWtlQ29uc3RhbnRTdHJpbmcoVHlwZVN0cikpOwogICB9CiAKICAgLy8gQ29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCBjbGFzcyBtZXRob2RzCiAgIFNtYWxsVmVjdG9yPFNlbGVjdG9yLCAxNj4gQ2xhc3NNZXRob2RTZWxzOwogICBTbWFsbFZlY3RvcjxsbHZtOjpDb25zdGFudCosIDE2PiBDbGFzc01ldGhvZFR5cGVzOwotICBmb3IgKE9iakNDYXRlZ29yeUltcGxEZWNsOjpjbGFzc21ldGhfaXRlcmF0b3IKLSAgICAgICAgIGl0ZXIgPSBPQ0QtPmNsYXNzbWV0aF9iZWdpbigpLCBlbmRJdGVyID0gT0NELT5jbGFzc21ldGhfZW5kKCk7Ci0gICAgICAgaXRlciAhPSBlbmRJdGVyIDsgaXRlcisrKSB7Ci0gICAgQ2xhc3NNZXRob2RTZWxzLnB1c2hfYmFjaygoKml0ZXIpLT5nZXRTZWxlY3RvcigpKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogT0NELT5jbGFzc19tZXRob2RzKCkpIHsKKyAgICBDbGFzc01ldGhvZFNlbHMucHVzaF9iYWNrKEktPmdldFNlbGVjdG9yKCkpOwogICAgIHN0ZDo6c3RyaW5nIFR5cGVTdHI7Ci0gICAgQ0dNLmdldENvbnRleHQoKS5nZXRPYmpDRW5jb2RpbmdGb3JNZXRob2REZWNsKCppdGVyLFR5cGVTdHIpOworICAgIENHTS5nZXRDb250ZXh0KCkuZ2V0T2JqQ0VuY29kaW5nRm9yTWV0aG9kRGVjbChJLFR5cGVTdHIpOwogICAgIENsYXNzTWV0aG9kVHlwZXMucHVzaF9iYWNrKE1ha2VDb25zdGFudFN0cmluZyhUeXBlU3RyKSk7CiAgIH0KIApAQCAtMjA5MywxMiArMjA1Nyw5IEBACiAKICAgLy8gQWRkIGFsbCBvZiB0aGUgcHJvcGVydHkgbWV0aG9kcyBuZWVkIGFkZGluZyB0byB0aGUgbWV0aG9kIGxpc3QgYW5kIHRvIHRoZQogICAvLyBwcm9wZXJ0eSBtZXRhZGF0YSBsaXN0LgotICBmb3IgKE9iakNJbXBsRGVjbDo6cHJvcGltcGxfaXRlcmF0b3IKLSAgICAgICAgIGl0ZXIgPSBPSUQtPnByb3BpbXBsX2JlZ2luKCksIGVuZEl0ZXIgPSBPSUQtPnByb3BpbXBsX2VuZCgpOwotICAgICAgIGl0ZXIgIT0gZW5kSXRlciA7IGl0ZXIrKykgeworICBmb3IgKGF1dG8gKnByb3BlcnR5SW1wbCA6IE9JRC0+cHJvcGVydHlfaW1wbHMoKSkgewogICAgIHN0ZDo6dmVjdG9yPGxsdm06OkNvbnN0YW50Kj4gRmllbGRzOwotICAgIE9iakNQcm9wZXJ0eURlY2wgKnByb3BlcnR5ID0gaXRlci0+Z2V0UHJvcGVydHlEZWNsKCk7Ci0gICAgT2JqQ1Byb3BlcnR5SW1wbERlY2wgKnByb3BlcnR5SW1wbCA9ICppdGVyOworICAgIE9iakNQcm9wZXJ0eURlY2wgKnByb3BlcnR5ID0gcHJvcGVydHlJbXBsLT5nZXRQcm9wZXJ0eURlY2woKTsKICAgICBib29sIGlzU3ludGhlc2l6ZWQgPSAocHJvcGVydHlJbXBsLT5nZXRQcm9wZXJ0eUltcGxlbWVudGF0aW9uKCkgPT0gCiAgICAgICAgIE9iakNQcm9wZXJ0eUltcGxEZWNsOjpTeW50aGVzaXplKTsKICAgICBib29sIGlzRHluYW1pYyA9IChwcm9wZXJ0eUltcGwtPmdldFByb3BlcnR5SW1wbGVtZW50YXRpb24oKSA9PSAKQEAgLTIyNjUsMTIgKzIyMjYsMTAgQEAKICAgLy8gQ29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCBpbnN0YW5jZSBtZXRob2RzCiAgIFNtYWxsVmVjdG9yPFNlbGVjdG9yLCAxNj4gSW5zdGFuY2VNZXRob2RTZWxzOwogICBTbWFsbFZlY3RvcjxsbHZtOjpDb25zdGFudCosIDE2PiBJbnN0YW5jZU1ldGhvZFR5cGVzOwotICBmb3IgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2w6Omluc3RtZXRoX2l0ZXJhdG9yCi0gICAgICAgICBpdGVyID0gT0lELT5pbnN0bWV0aF9iZWdpbigpLCBlbmRJdGVyID0gT0lELT5pbnN0bWV0aF9lbmQoKTsKLSAgICAgICBpdGVyICE9IGVuZEl0ZXIgOyBpdGVyKyspIHsKLSAgICBJbnN0YW5jZU1ldGhvZFNlbHMucHVzaF9iYWNrKCgqaXRlciktPmdldFNlbGVjdG9yKCkpOworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBPSUQtPmluc3RhbmNlX21ldGhvZHMoKSkgeworICAgIEluc3RhbmNlTWV0aG9kU2Vscy5wdXNoX2JhY2soSS0+Z2V0U2VsZWN0b3IoKSk7CiAgICAgc3RkOjpzdHJpbmcgVHlwZVN0cjsKLSAgICBDb250ZXh0LmdldE9iakNFbmNvZGluZ0Zvck1ldGhvZERlY2woKCppdGVyKSxUeXBlU3RyKTsKKyAgICBDb250ZXh0LmdldE9iakNFbmNvZGluZ0Zvck1ldGhvZERlY2woSSxUeXBlU3RyKTsKICAgICBJbnN0YW5jZU1ldGhvZFR5cGVzLnB1c2hfYmFjayhNYWtlQ29uc3RhbnRTdHJpbmcoVHlwZVN0cikpOwogICB9CiAKQEAgLTIyODEsMjIgKzIyNDAsMTYgQEAKICAgLy8gQ29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCBjbGFzcyBtZXRob2RzCiAgIFNtYWxsVmVjdG9yPFNlbGVjdG9yLCAxNj4gQ2xhc3NNZXRob2RTZWxzOwogICBTbWFsbFZlY3RvcjxsbHZtOjpDb25zdGFudCosIDE2PiBDbGFzc01ldGhvZFR5cGVzOwotICBmb3IgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2w6OmNsYXNzbWV0aF9pdGVyYXRvcgotICAgICAgICAgaXRlciA9IE9JRC0+Y2xhc3NtZXRoX2JlZ2luKCksIGVuZEl0ZXIgPSBPSUQtPmNsYXNzbWV0aF9lbmQoKTsKLSAgICAgICBpdGVyICE9IGVuZEl0ZXIgOyBpdGVyKyspIHsKLSAgICBDbGFzc01ldGhvZFNlbHMucHVzaF9iYWNrKCgqaXRlciktPmdldFNlbGVjdG9yKCkpOworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBPSUQtPmNsYXNzX21ldGhvZHMoKSkgeworICAgIENsYXNzTWV0aG9kU2Vscy5wdXNoX2JhY2soSS0+Z2V0U2VsZWN0b3IoKSk7CiAgICAgc3RkOjpzdHJpbmcgVHlwZVN0cjsKLSAgICBDb250ZXh0LmdldE9iakNFbmNvZGluZ0Zvck1ldGhvZERlY2woKCppdGVyKSxUeXBlU3RyKTsKKyAgICBDb250ZXh0LmdldE9iakNFbmNvZGluZ0Zvck1ldGhvZERlY2woSSxUeXBlU3RyKTsKICAgICBDbGFzc01ldGhvZFR5cGVzLnB1c2hfYmFjayhNYWtlQ29uc3RhbnRTdHJpbmcoVHlwZVN0cikpOwogICB9CiAgIC8vIENvbGxlY3QgdGhlIG5hbWVzIG9mIHJlZmVyZW5jZWQgcHJvdG9jb2xzCiAgIFNtYWxsVmVjdG9yPHN0ZDo6c3RyaW5nLCAxNj4gUHJvdG9jb2xzOwotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjpwcm90b2NvbF9pdGVyYXRvcgotICAgICAgICAgSSA9IENsYXNzRGVjbC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBDbGFzc0RlY2wtPnByb3RvY29sX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBQcm90b2NvbHMucHVzaF9iYWNrKCgqSSktPmdldE5hbWVBc1N0cmluZygpKTsKLQotCisgIGZvciAoY29uc3QgYXV0byAqSSA6IENsYXNzRGVjbC0+cHJvdG9jb2xzKCkpCisgICAgUHJvdG9jb2xzLnB1c2hfYmFjayhJLT5nZXROYW1lQXNTdHJpbmcoKSk7CiAKICAgLy8gR2V0IHRoZSBzdXBlcmNsYXNzIHBvaW50ZXIuCiAgIGxsdm06OkNvbnN0YW50ICpTdXBlckNsYXNzOwpAQCAtMjU5NSw3ICsyNTQ4LDcgQEAKICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoUmVnaXN0ZXJBbGlhcy0+Z2V0VHlwZSgpKSk7CiAgICAgQnVpbGRlci5DcmVhdGVDb25kQnIoSGFzUmVnaXN0ZXJBbGlhcywgQWxpYXNCQiwgTm9BbGlhc0JCKTsKIAotICAgIC8vIFRoZSB0cnVlIGJyYW5jaCAoaGFzIGFsaWFzIHJlZ2lzdHJhdGlvbiBmdWNudGlvbik6CisgICAgLy8gVGhlIHRydWUgYnJhbmNoIChoYXMgYWxpYXMgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uKToKICAgICBCdWlsZGVyLlNldEluc2VydFBvaW50KEFsaWFzQkIpOwogICAgIC8vIEVtaXQgYWxpYXMgcmVnaXN0cmF0aW9uIGNhbGxzOgogICAgIGZvciAoc3RkOjp2ZWN0b3I8Q2xhc3NBbGlhc1BhaXI+OjppdGVyYXRvciBpdGVyID0gQ2xhc3NBbGlhc2VzLmJlZ2luKCk7CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR09iakNNYWMuY3BwIGIvbGliL0NvZGVHZW4vQ0dPYmpDTWFjLmNwcAppbmRleCAyYjJhNWI4Li44ZjU5NjljIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR09iakNNYWMuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHT2JqQ01hYy5jcHAKQEAgLTI5LDEyICsyOSwxMiBAQAogI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCiAjaW5jbHVkZSAibGx2bS9JUi9EYXRhTGF5b3V0LmgiCiAjaW5jbHVkZSAibGx2bS9JUi9JbmxpbmVBc20uaCIKICNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY0luc3QuaCIKICNpbmNsdWRlICJsbHZtL0lSL0xMVk1Db250ZXh0LmgiCiAjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKICNpbmNsdWRlIDxjc3RkaW8+CiAKQEAgLTE3NCw2ICsxNzQsNyBAQAogcHVibGljOgogICBsbHZtOjpUeXBlICpTaG9ydFR5LCAqSW50VHksICpMb25nVHksICpMb25nTG9uZ1R5OwogICBsbHZtOjpUeXBlICpJbnQ4UHRyVHksICpJbnQ4UHRyUHRyVHk7CisgIGxsdm06OlR5cGUgKkl2YXJPZmZzZXRWYXJUeTsKIAogICAvLy8gT2JqZWN0UHRyVHkgLSBMTFZNIHR5cGUgZm9yIG9iamVjdCBoYW5kbGVzICh0eXBlb2YoaWQpKQogICBsbHZtOjpUeXBlICpPYmplY3RQdHJUeTsKQEAgLTI0Myw4ICsyNDQsOCBAQAogICAgIFBhcmFtcy5wdXNoX2JhY2soQ3R4LmdldFBvaW50ZXJEaWZmVHlwZSgpLT5nZXRDYW5vbmljYWxUeXBlVW5xdWFsaWZpZWQoKSk7CiAgICAgUGFyYW1zLnB1c2hfYmFjayhDdHguQm9vbFR5KTsKICAgICBsbHZtOjpGdW5jdGlvblR5cGUgKkZUeSA9Ci0gICAgICBUeXBlcy5HZXRGdW5jdGlvblR5cGUoVHlwZXMuYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oSWRUeXBlLCBQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvKCksCisgICAgICBUeXBlcy5HZXRGdW5jdGlvblR5cGUoVHlwZXMuYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oSWRUeXBlLCBmYWxzZSwgUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkQXJnczo6QWxsKSk7CiAgICAgcmV0dXJuIENHTS5DcmVhdGVSdW50aW1lRnVuY3Rpb24oRlR5LCAib2JqY19nZXRQcm9wZXJ0eSIpOwogICB9CkBAIC0yNjMsOCArMjY0LDkgQEAKICAgICBQYXJhbXMucHVzaF9iYWNrKEN0eC5Cb29sVHkpOwogICAgIFBhcmFtcy5wdXNoX2JhY2soQ3R4LkJvb2xUeSk7CiAgICAgbGx2bTo6RnVuY3Rpb25UeXBlICpGVHkgPQotICAgICAgVHlwZXMuR2V0RnVuY3Rpb25UeXBlKFR5cGVzLmFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKEN0eC5Wb2lkVHksIFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvKCksCisgICAgICBUeXBlcy5HZXRGdW5jdGlvblR5cGUoVHlwZXMuYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oQ3R4LlZvaWRUeSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkQXJnczo6QWxsKSk7CiAgICAgcmV0dXJuIENHTS5DcmVhdGVSdW50aW1lRnVuY3Rpb24oRlR5LCAib2JqY19zZXRQcm9wZXJ0eSIpOwogICB9CkBAIC0yODksNyArMjkxLDggQEAKICAgICBQYXJhbXMucHVzaF9iYWNrKElkVHlwZSk7CiAgICAgUGFyYW1zLnB1c2hfYmFjayhDdHguZ2V0UG9pbnRlckRpZmZUeXBlKCktPmdldENhbm9uaWNhbFR5cGVVbnF1YWxpZmllZCgpKTsKICAgICBsbHZtOjpGdW5jdGlvblR5cGUgKkZUeSA9Ci0gICAgVHlwZXMuR2V0RnVuY3Rpb25UeXBlKFR5cGVzLmFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKEN0eC5Wb2lkVHksIFBhcmFtcywKKyAgICBUeXBlcy5HZXRGdW5jdGlvblR5cGUoVHlwZXMuYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oQ3R4LlZvaWRUeSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkQXJnczo6QWxsKSk7CiAgICAgY29uc3QgY2hhciAqbmFtZTsKQEAgLTMxNiw4ICszMTksOSBAQAogICAgIFBhcmFtcy5wdXNoX2JhY2soQ3R4LkJvb2xUeSk7CiAgICAgUGFyYW1zLnB1c2hfYmFjayhDdHguQm9vbFR5KTsKICAgICBsbHZtOjpGdW5jdGlvblR5cGUgKkZUeSA9Ci0gICAgICBUeXBlcy5HZXRGdW5jdGlvblR5cGUoVHlwZXMuYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oQ3R4LlZvaWRUeSwgUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblR5cGU6OkV4dEluZm8oKSwKKyAgICAgIFR5cGVzLkdldEZ1bmN0aW9uVHlwZShUeXBlcy5hcnJhbmdlTExWTUZ1bmN0aW9uSW5mbyhDdHguVm9pZFR5LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRBcmdzOjpBbGwpKTsKICAgICByZXR1cm4gQ0dNLkNyZWF0ZVJ1bnRpbWVGdW5jdGlvbihGVHksICJvYmpjX2NvcHlTdHJ1Y3QiKTsKICAgfQpAQCAtMzM1LDggKzMzOSw5IEBACiAgICAgUGFyYW1zLnB1c2hfYmFjayhDdHguVm9pZFB0clR5KTsKICAgICBQYXJhbXMucHVzaF9iYWNrKEN0eC5Wb2lkUHRyVHkpOwogICAgIGxsdm06OkZ1bmN0aW9uVHlwZSAqRlR5ID0KLSAgICAgIFR5cGVzLkdldEZ1bmN0aW9uVHlwZShUeXBlcy5hcnJhbmdlTExWTUZ1bmN0aW9uSW5mbyhDdHguVm9pZFR5LCBQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbygpLAorICAgICAgVHlwZXMuR2V0RnVuY3Rpb25UeXBlKFR5cGVzLmFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKEN0eC5Wb2lkVHksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblR5cGU6OkV4dEluZm8oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZEFyZ3M6OkFsbCkpOwogICAgIHJldHVybiBDR00uQ3JlYXRlUnVudGltZUZ1bmN0aW9uKEZUeSwgIm9iamNfY29weUNwcE9iamVjdEF0b21pYyIpOwogICB9CkBAIC0zNDgsOCArMzUzLDkgQEAKICAgICBTbWFsbFZlY3RvcjxDYW5RdWFsVHlwZSwxPiBQYXJhbXM7CiAgICAgUGFyYW1zLnB1c2hfYmFjayhDdHguZ2V0Q2Fub25pY2FsUGFyYW1UeXBlKEN0eC5nZXRPYmpDSWRUeXBlKCkpKTsKICAgICBsbHZtOjpGdW5jdGlvblR5cGUgKkZUeSA9Ci0gICAgICBUeXBlcy5HZXRGdW5jdGlvblR5cGUoVHlwZXMuYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oQ3R4LlZvaWRUeSwgUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UeXBlOjpFeHRJbmZvKCksCisgICAgICBUeXBlcy5HZXRGdW5jdGlvblR5cGUoVHlwZXMuYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oQ3R4LlZvaWRUeSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRBcmdzOjpBbGwpKTsKICAgICByZXR1cm4gQ0dNLkNyZWF0ZVJ1bnRpbWVGdW5jdGlvbihGVHksICJvYmpjX2VudW1lcmF0aW9uTXV0YXRpb24iKTsKICAgfQpAQCAtODg1LDYgKzg5MSw5IEBACiAKICAgLy8vIERlZmluZWRDbGFzc2VzIC0gTGlzdCBvZiBkZWZpbmVkIGNsYXNzZXMuCiAgIFNtYWxsVmVjdG9yPGxsdm06Okdsb2JhbFZhbHVlKiwgMTY+IERlZmluZWRDbGFzc2VzOworICAKKyAgLy8vIEltcGxlbWVudGVkQ2xhc3NlcyAtIExpc3Qgb2YgQGltcGxlbWVudGVkIGNsYXNzZXMuCisgIFNtYWxsVmVjdG9yPGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsKiwgMTY+IEltcGxlbWVudGVkQ2xhc3NlczsKIAogICAvLy8gRGVmaW5lZE5vbkxhenlDbGFzc2VzIC0gTGlzdCBvZiBkZWZpbmVkICJub24tbGF6eSIgY2xhc3Nlcy4KICAgU21hbGxWZWN0b3I8bGx2bTo6R2xvYmFsVmFsdWUqLCAxNj4gRGVmaW5lZE5vbkxhenlDbGFzc2VzOwpAQCAtOTkxLDcgKzEwMDAsNyBAQAogICAgIGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IElkZW50aWZpZXJJbmZvKiwgMTY+ICZQcm9wZXJ0eVNldCwKICAgICBTbWFsbFZlY3RvckltcGw8bGx2bTo6Q29uc3RhbnQqPiAmUHJvcGVydGllcywKICAgICBjb25zdCBEZWNsICpDb250YWluZXIsCi0gICAgY29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqUFJPVE8sCisgICAgY29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqUHJvdG8sCiAgICAgY29uc3QgT2JqQ0NvbW1vblR5cGVzSGVscGVyICZPYmpDVHlwZXMpOwogCiAgIC8vLyBHZXRQcm90b2NvbFJlZiAtIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwgcHJvdG9jb2wKQEAgLTEwMzgsMTIgKzEwNDcsMTIgQEAKICAgQ0dPYmpDQ29tbW9uTWFjKENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJmNnbSkgOgogICAgIENHT2JqQ1J1bnRpbWUoY2dtKSwgVk1Db250ZXh0KGNnbS5nZXRMTFZNQ29udGV4dCgpKSB7IH0KIAotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZW5lcmF0ZUNvbnN0YW50U3RyaW5nKGNvbnN0IFN0cmluZ0xpdGVyYWwgKlNMKTsKLSAgCi0gIHZpcnR1YWwgbGx2bTo6RnVuY3Rpb24gKkdlbmVyYXRlTWV0aG9kKGNvbnN0IE9iakNNZXRob2REZWNsICpPTUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNDb250YWluZXJEZWNsICpDRD0wKTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdlbmVyYXRlQ29uc3RhbnRTdHJpbmcoY29uc3QgU3RyaW5nTGl0ZXJhbCAqU0wpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVByb3RvY29sKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlBEKTsKKyAgbGx2bTo6RnVuY3Rpb24gKkdlbmVyYXRlTWV0aG9kKGNvbnN0IE9iakNNZXRob2REZWNsICpPTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDQ29udGFpbmVyRGVjbCAqQ0Q9MCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBHZW5lcmF0ZVByb3RvY29sKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlBEKSBvdmVycmlkZTsKIAogICAvLy8gR2V0T3JFbWl0UHJvdG9jb2wgLSBHZXQgdGhlIHByb3RvY29sIG9iamVjdCBmb3IgdGhlIGdpdmVuCiAgIC8vLyBkZWNsYXJhdGlvbiwgZW1pdHRpbmcgaXQgaWYgbmVjZXNzYXJ5LiBUaGUgcmV0dXJuIHZhbHVlIGhhcyB0eXBlCkBAIC0xMDU1LDEzICsxMDY0LDEzIEBACiAgIC8vLyBmb3J3YXJkIHJlZmVyZW5jZXMgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBlbXB0eSBib2RpZXMgaWYgbm8KICAgLy8vIGRlZmluaXRpb24gaXMgc2Vlbi4gVGhlIHJldHVybiB2YWx1ZSBoYXMgdHlwZSBQcm90b2NvbFB0clR5LgogICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRPckVtaXRQcm90b2NvbFJlZihjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRCk9MDsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCAqQnVpbGRHQ0Jsb2NrTGF5b3V0KENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJkNHTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENHQmxvY2tJbmZvICZibG9ja0luZm8pOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpCdWlsZFJDQmxvY2tMYXlvdXQoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmQ0dNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0dCbG9ja0luZm8gJmJsb2NrSW5mbyk7Ci0gIAotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpCdWlsZEJ5cmVmTGF5b3V0KENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJkNHTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUKTsKKyAgbGx2bTo6Q29uc3RhbnQgKkJ1aWxkR0NCbG9ja0xheW91dChDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZDR00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0dCbG9ja0luZm8gJmJsb2NrSW5mbykgb3ZlcnJpZGU7CisgIGxsdm06OkNvbnN0YW50ICpCdWlsZFJDQmxvY2tMYXlvdXQoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmQ0dNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENHQmxvY2tJbmZvICZibG9ja0luZm8pIG92ZXJyaWRlOworCisgIGxsdm06OkNvbnN0YW50ICpCdWlsZEJ5cmVmTGF5b3V0KENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJkNHTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCkgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBDR09iakNNYWMgOiBwdWJsaWMgQ0dPYmpDQ29tbW9uTWFjIHsKQEAgLTEwOTIsOSArMTEwMSw5IEBACiAgIAogICBsbHZtOjpWYWx1ZSAqRW1pdENsYXNzUmVmRnJvbUlkKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJSSk7Ci0gIAotICBsbHZtOjpWYWx1ZSAqRW1pdE5TQXV0b3JlbGVhc2VQb29sQ2xhc3NSZWYoQ29kZUdlbkZ1bmN0aW9uICZDR0YpOwotICAKKworICBsbHZtOjpWYWx1ZSAqRW1pdE5TQXV0b3JlbGVhc2VQb29sQ2xhc3NSZWYoQ29kZUdlbkZ1bmN0aW9uICZDR0YpIG92ZXJyaWRlOworCiAgIC8vLyBFbWl0U3VwZXJDbGFzc1JlZiAtIEVtaXRzIHJlZmVyZW5jZSB0byBjbGFzcydzIG1haW4gbWV0YWRhdGEgY2xhc3MuCiAgIGxsdm06OlZhbHVlICpFbWl0U3VwZXJDbGFzc1JlZihjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUQpOwogCkBAIC0xMTQ1LDEzICsxMTU0LDEzIEBACiAgIC8vLyBHZXRPckVtaXRQcm90b2NvbCAtIEdldCB0aGUgcHJvdG9jb2wgb2JqZWN0IGZvciB0aGUgZ2l2ZW4KICAgLy8vIGRlY2xhcmF0aW9uLCBlbWl0dGluZyBpdCBpZiBuZWNlc3NhcnkuIFRoZSByZXR1cm4gdmFsdWUgaGFzIHR5cGUKICAgLy8vIFByb3RvY29sUHRyVHkuCi0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkdldE9yRW1pdFByb3RvY29sKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlBEKTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldE9yRW1pdFByb3RvY29sKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlBEKSBvdmVycmlkZTsKIAogICAvLy8gR2V0T3JFbWl0UHJvdG9jb2xSZWYgLSBHZXQgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byB0aGUgcHJvdG9jb2wKICAgLy8vIG9iamVjdCBmb3IgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLCBlbWl0dGluZyBpdCBpZiBuZWVkZWQuIFRoZXNlCiAgIC8vLyBmb3J3YXJkIHJlZmVyZW5jZXMgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBlbXB0eSBib2RpZXMgaWYgbm8KICAgLy8vIGRlZmluaXRpb24gaXMgc2Vlbi4gVGhlIHJldHVybiB2YWx1ZSBoYXMgdHlwZSBQcm90b2NvbFB0clR5LgotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRPckVtaXRQcm90b2NvbFJlZihjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRCk7CisgIGxsdm06OkNvbnN0YW50ICpHZXRPckVtaXRQcm90b2NvbFJlZihjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRCkgb3ZlcnJpZGU7CiAKICAgLy8vIEVtaXRQcm90b2NvbEV4dGVuc2lvbiAtIEdlbmVyYXRlIHRoZSBwcm90b2NvbCBleHRlbnNpb24KICAgLy8vIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIG9wdGlvbmFsIGluc3RhbmNlIGFuZCBjbGFzcyBtZXRob2RzLCBhbmQKQEAgLTExNzcsOTcgKzExODYsOTAgQEAKIHB1YmxpYzoKICAgQ0dPYmpDTWFjKENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJmNnbSk7CiAKLSAgdmlydHVhbCBsbHZtOjpGdW5jdGlvbiAqTW9kdWxlSW5pdEZ1bmN0aW9uKCk7CisgIGxsdm06OkZ1bmN0aW9uICpNb2R1bGVJbml0RnVuY3Rpb24oKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIENvZGVHZW46OlJWYWx1ZSBHZW5lcmF0ZU1lc3NhZ2VTZW5kKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblZhbHVlU2xvdCBSZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUmVzdWx0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBTZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxBcmdMaXN0ICZDYWxsQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCk7CisgIENvZGVHZW46OlJWYWx1ZSBHZW5lcmF0ZU1lc3NhZ2VTZW5kKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5WYWx1ZVNsb3QgUmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBSZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBTZWwsIGxsdm06OlZhbHVlICpSZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEFyZ0xpc3QgJkNhbGxBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2QpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgQ29kZUdlbjo6UlZhbHVlCisgIENvZGVHZW46OlJWYWx1ZQogICBHZW5lcmF0ZU1lc3NhZ2VTZW5kU3VwZXIoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5WYWx1ZVNsb3QgUmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUmVzdWx0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIFNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNDYXRlZ29yeUltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ2xhc3NNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEFyZ0xpc3QgJkNhbGxBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5WYWx1ZVNsb3QgUmV0dXJuLCBRdWFsVHlwZSBSZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsLCBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQ2F0ZWdvcnlJbXBsLCBsbHZtOjpWYWx1ZSAqUmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ2xhc3NNZXNzYWdlLCBjb25zdCBDYWxsQXJnTGlzdCAmQ2FsbEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpHZXRDbGFzcyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklEKTsKKyAgbGx2bTo6VmFsdWUgKkdldENsYXNzKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklEKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpHZXRTZWxlY3RvcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwgU2VsZWN0b3IgU2VsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsdmFsID0gZmFsc2UpOworICBsbHZtOjpWYWx1ZSAqR2V0U2VsZWN0b3IoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIFNlbGVjdG9yIFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbHZhbCA9IGZhbHNlKSBvdmVycmlkZTsKIAogICAvLy8gVGhlIE5lWFQvQXBwbGUgcnVudGltZXMgZG8gbm90IHN1cHBvcnQgdHlwZWQgc2VsZWN0b3JzOyBqdXN0IGVtaXQgYW4KICAgLy8vIHVudHlwZWQgb25lLgotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpHZXRTZWxlY3RvcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCk7CisgIGxsdm06OlZhbHVlICpHZXRTZWxlY3RvcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2QpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkdldEVIVHlwZShRdWFsVHlwZSBUKTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldEVIVHlwZShRdWFsVHlwZSBUKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDYXRlZ29yeShjb25zdCBPYmpDQ2F0ZWdvcnlJbXBsRGVjbCAqQ01EKTsKKyAgdm9pZCBHZW5lcmF0ZUNhdGVnb3J5KGNvbnN0IE9iakNDYXRlZ29yeUltcGxEZWNsICpDTUQpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNsYXNzKGNvbnN0IE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKkNsYXNzRGVjbCk7CisgIHZvaWQgR2VuZXJhdGVDbGFzcyhjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpDbGFzc0RlY2wpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBSZWdpc3RlckFsaWFzKGNvbnN0IE9iakNDb21wYXRpYmxlQWxpYXNEZWNsICpPQUQpIHt9CisgIHZvaWQgUmVnaXN0ZXJBbGlhcyhjb25zdCBPYmpDQ29tcGF0aWJsZUFsaWFzRGVjbCAqT0FEKSBvdmVycmlkZSB7fQogCi0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkdlbmVyYXRlUHJvdG9jb2xSZWYoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqUEQpOworICBsbHZtOjpWYWx1ZSAqR2VuZXJhdGVQcm90b2NvbFJlZihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqUEQpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkdldFByb3BlcnR5R2V0RnVuY3Rpb24oKTsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCAqR2V0UHJvcGVydHlTZXRGdW5jdGlvbigpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRPcHRpbWl6ZWRQcm9wZXJ0eVNldEZ1bmN0aW9uKGJvb2wgYXRvbWljLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvcHkpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRHZXRTdHJ1Y3RGdW5jdGlvbigpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRTZXRTdHJ1Y3RGdW5jdGlvbigpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRDcHBBdG9taWNPYmplY3RHZXRGdW5jdGlvbigpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRDcHBBdG9taWNPYmplY3RTZXRGdW5jdGlvbigpOwotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpFbnVtZXJhdGlvbk11dGF0aW9uRnVuY3Rpb24oKTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldFByb3BlcnR5R2V0RnVuY3Rpb24oKSBvdmVycmlkZTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldFByb3BlcnR5U2V0RnVuY3Rpb24oKSBvdmVycmlkZTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldE9wdGltaXplZFByb3BlcnR5U2V0RnVuY3Rpb24oYm9vbCBhdG9taWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29weSkgb3ZlcnJpZGU7CisgIGxsdm06OkNvbnN0YW50ICpHZXRHZXRTdHJ1Y3RGdW5jdGlvbigpIG92ZXJyaWRlOworICBsbHZtOjpDb25zdGFudCAqR2V0U2V0U3RydWN0RnVuY3Rpb24oKSBvdmVycmlkZTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldENwcEF0b21pY09iamVjdEdldEZ1bmN0aW9uKCkgb3ZlcnJpZGU7CisgIGxsdm06OkNvbnN0YW50ICpHZXRDcHBBdG9taWNPYmplY3RTZXRGdW5jdGlvbigpIG92ZXJyaWRlOworICBsbHZtOjpDb25zdGFudCAqRW51bWVyYXRpb25NdXRhdGlvbkZ1bmN0aW9uKCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIEVtaXRUcnlTdG10KENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0F0VHJ5U3RtdCAmUyk7Ci0gIHZpcnR1YWwgdm9pZCBFbWl0U3luY2hyb25pemVkU3RtdChDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNBdFN5bmNocm9uaXplZFN0bXQgJlMpOworICB2b2lkIEVtaXRUcnlTdG10KENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNBdFRyeVN0bXQgJlMpIG92ZXJyaWRlOworICB2b2lkIEVtaXRTeW5jaHJvbml6ZWRTdG10KENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNBdFN5bmNocm9uaXplZFN0bXQgJlMpIG92ZXJyaWRlOwogICB2b2lkIEVtaXRUcnlPclN5bmNocm9uaXplZFN0bXQoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IFN0bXQgJlMpOwotICB2aXJ0dWFsIHZvaWQgRW1pdFRocm93U3RtdChDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0F0VGhyb3dTdG10ICZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENsZWFySW5zZXJ0aW9uUG9pbnQ9dHJ1ZSk7Ci0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKiBFbWl0T2JqQ1dlYWtSZWFkKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQWRkcldlYWtPYmopOwotICB2aXJ0dWFsIHZvaWQgRW1pdE9iakNXZWFrQXNzaWduKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmMsIGxsdm06OlZhbHVlICpkc3QpOwotICB2aXJ0dWFsIHZvaWQgRW1pdE9iakNHbG9iYWxBc3NpZ24oQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqc3JjLCBsbHZtOjpWYWx1ZSAqZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkbG9jYWwgPSBmYWxzZSk7Ci0gIHZpcnR1YWwgdm9pZCBFbWl0T2JqQ0l2YXJBc3NpZ24oQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnNyYywgbGx2bTo6VmFsdWUgKmRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKml2YXJPZmZzZXQpOwotICB2aXJ0dWFsIHZvaWQgRW1pdE9iakNTdHJvbmdDYXN0QXNzaWduKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmMsIGxsdm06OlZhbHVlICpkZXN0KTsKLSAgdmlydHVhbCB2b2lkIEVtaXRHQ01lbW1vdmVDb2xsZWN0YWJsZShDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqZGVzdCwgbGx2bTo6VmFsdWUgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqc2l6ZSk7CisgIHZvaWQgRW1pdFRocm93U3RtdChDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwgY29uc3QgT2JqQ0F0VGhyb3dTdG10ICZTLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBDbGVhckluc2VydGlvblBvaW50PXRydWUpIG92ZXJyaWRlOworICBsbHZtOjpWYWx1ZSAqIEVtaXRPYmpDV2Vha1JlYWQoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQWRkcldlYWtPYmopIG92ZXJyaWRlOworICB2b2lkIEVtaXRPYmpDV2Vha0Fzc2lnbihDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnNyYywgbGx2bTo6VmFsdWUgKmRzdCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdE9iakNHbG9iYWxBc3NpZ24oQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnNyYywgbGx2bTo6VmFsdWUgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRsb2NhbCA9IGZhbHNlKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0T2JqQ0l2YXJBc3NpZ24oQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmMsIGxsdm06OlZhbHVlICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqaXZhck9mZnNldCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdE9iakNTdHJvbmdDYXN0QXNzaWduKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqc3JjLCBsbHZtOjpWYWx1ZSAqZGVzdCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEdDTWVtbW92ZUNvbGxlY3RhYmxlKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqZGVzdCwgbGx2bTo6VmFsdWUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnNpemUpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgTFZhbHVlIEVtaXRPYmpDVmFsdWVGb3JJdmFyKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBPYmplY3RUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkJhc2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0l2YXJEZWNsICpJdmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDVlJRdWFsaWZpZXJzKTsKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqRW1pdEl2YXJPZmZzZXQoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJdmFyRGVjbCAqSXZhcik7Ci0gIAorICBMVmFsdWUgRW1pdE9iakNWYWx1ZUZvckl2YXIoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsIFF1YWxUeXBlIE9iamVjdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkJhc2VWYWx1ZSwgY29uc3QgT2JqQ0l2YXJEZWNsICpJdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ1ZSUXVhbGlmaWVycykgb3ZlcnJpZGU7CisgIGxsdm06OlZhbHVlICpFbWl0SXZhck9mZnNldChDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSXZhckRlY2wgKkl2YXIpIG92ZXJyaWRlOworCiAgIC8vLyBHZXRDbGFzc0dsb2JhbCAtIFJldHVybiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGZvciB0aGUgT2JqZWN0aXZlLUMKICAgLy8vIGNsYXNzIG9mIHRoZSBnaXZlbiBuYW1lLgotICB2aXJ0dWFsIGxsdm06Okdsb2JhbFZhcmlhYmxlICpHZXRDbGFzc0dsb2JhbChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR2V0Q2xhc3NHbG9iYWwoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFdlYWsgPSBmYWxzZSkgb3ZlcnJpZGUgewogICAgIGxsdm1fdW5yZWFjaGFibGUoIkNHT2JqQ01hYzo6R2V0Q2xhc3NHbG9iYWwiKTsKICAgfQogfTsKQEAgLTEzMTYsNyArMTMxOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50ICpJc0FHViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnQgKlN1cGVyQ2xhc3NHViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnQgKkNsYXNzUm9HViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIaWRkZW5WaXNpYmlsaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIaWRkZW5WaXNpYmlsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFdlYWspOwogCiAgIGxsdm06OkNvbnN0YW50ICpHZXRNZXRob2RDb25zdGFudChjb25zdCBPYmpDTWV0aG9kRGVjbCAqTUQpOwogCkBAIC0xMzQxLDEzICsxMzQ0LDEzIEBACiAgIC8vLyBHZXRPckVtaXRQcm90b2NvbCAtIEdldCB0aGUgcHJvdG9jb2wgb2JqZWN0IGZvciB0aGUgZ2l2ZW4KICAgLy8vIGRlY2xhcmF0aW9uLCBlbWl0dGluZyBpdCBpZiBuZWNlc3NhcnkuIFRoZSByZXR1cm4gdmFsdWUgaGFzIHR5cGUKICAgLy8vIFByb3RvY29sUHRyVHkuCi0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkdldE9yRW1pdFByb3RvY29sKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlBEKTsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldE9yRW1pdFByb3RvY29sKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlBEKSBvdmVycmlkZTsKIAogICAvLy8gR2V0T3JFbWl0UHJvdG9jb2xSZWYgLSBHZXQgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byB0aGUgcHJvdG9jb2wKICAgLy8vIG9iamVjdCBmb3IgdGhlIGdpdmVuIGRlY2xhcmF0aW9uLCBlbWl0dGluZyBpdCBpZiBuZWVkZWQuIFRoZXNlCiAgIC8vLyBmb3J3YXJkIHJlZmVyZW5jZXMgd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBlbXB0eSBib2RpZXMgaWYgbm8KICAgLy8vIGRlZmluaXRpb24gaXMgc2Vlbi4gVGhlIHJldHVybiB2YWx1ZSBoYXMgdHlwZSBQcm90b2NvbFB0clR5LgotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRPckVtaXRQcm90b2NvbFJlZihjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRCk7CisgIGxsdm06OkNvbnN0YW50ICpHZXRPckVtaXRQcm90b2NvbFJlZihjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRCkgb3ZlcnJpZGU7CiAKICAgLy8vIEVtaXRQcm90b2NvbExpc3QgLSBHZW5lcmF0ZSB0aGUgbGlzdCBvZiByZWZlcmVuY2VkCiAgIC8vLyBwcm90b2NvbHMuIFRoZSByZXR1cm4gdmFsdWUgaGFzIHR5cGUgUHJvdG9jb2xMaXN0UHRyVHkuCkBAIC0xMzY3LDE3ICsxMzcwLDE4IEBACiAgIAogICAvLy8gR2V0Q2xhc3NHbG9iYWwgLSBSZXR1cm4gdGhlIGdsb2JhbCB2YXJpYWJsZSBmb3IgdGhlIE9iamVjdGl2ZS1DCiAgIC8vLyBjbGFzcyBvZiB0aGUgZ2l2ZW4gbmFtZS4KLSAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdldENsYXNzR2xvYmFsKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKTsKLSAgICAKKyAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdldENsYXNzR2xvYmFsKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBXZWFrID0gZmFsc2UpIG92ZXJyaWRlOworCiAgIC8vLyBFbWl0Q2xhc3NSZWYgLSBSZXR1cm4gYSBWYWx1ZSosIG9mIHR5cGUgT2JqQ1R5cGVzLkNsYXNzUHRyVHksCiAgIC8vLyBmb3IgdGhlIGdpdmVuIGNsYXNzIHJlZmVyZW5jZS4KICAgbGx2bTo6VmFsdWUgKkVtaXRDbGFzc1JlZihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUQpOwogICAKICAgbGx2bTo6VmFsdWUgKkVtaXRDbGFzc1JlZkZyb21JZChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSUkpOwotICAKLSAgbGx2bTo6VmFsdWUgKkVtaXROU0F1dG9yZWxlYXNlUG9vbENsYXNzUmVmKENvZGVHZW5GdW5jdGlvbiAmQ0dGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSUksIGJvb2wgV2Vhayk7CisKKyAgbGx2bTo6VmFsdWUgKkVtaXROU0F1dG9yZWxlYXNlUG9vbENsYXNzUmVmKENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBvdmVycmlkZTsKIAogICAvLy8gRW1pdFN1cGVyQ2xhc3NSZWYgLSBSZXR1cm4gYSBWYWx1ZSosIG9mIHR5cGUgT2JqQ1R5cGVzLkNsYXNzUHRyVHksCiAgIC8vLyBmb3IgdGhlIGdpdmVuIHN1cGVyIGNsYXNzIHJlZmVyZW5jZS4KQEAgLTE0MzQsMTEgKzE0MzgsMTAgQEAKICAgYm9vbCBJbXBsZW1lbnRhdGlvbklzTm9uTGF6eShjb25zdCBPYmpDSW1wbERlY2wgKk9EKSBjb25zdDsKIAogICBib29sIElzSXZhck9mZnNldEtub3duSWRlbXBvdGVudChjb25zdCBDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSXZhckRlY2wgKklWKSB7Ci0gICAgLy8gQW5ub3RhdGUgdGhlIGxvYWQgYXMgYW4gaW52YXJpYW50IGxvYWQgaWZmIHRoZSBvYmplY3QgdHlwZSBpcyB0aGUgdHlwZSwKLSAgICAvLyBvciBhIGRlcml2ZWQgdHlwZSwgb2YgdGhlIGNsYXNzIGNvbnRhaW5pbmcgdGhlIGl2YXIgd2l0aGluIGFuIE9iakMKLSAgICAvLyBtZXRob2QuICBUaGlzIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBpdmFyIG9mZnNldCBpcyBhIGxhemlseQorICAgIC8vIEFubm90YXRlIHRoZSBsb2FkIGFzIGFuIGludmFyaWFudCBsb2FkIGlmZiBpbnNpZGUgYW4gaW5zdGFuY2UgbWV0aG9kCisgICAgLy8gYW5kIGl2YXIgYmVsb25ncyB0byBpbnN0YW5jZSBtZXRob2QncyBjbGFzcyBhbmQgb25lIG9mIGl0cyBzdXBlciBjbGFzcy4KKyAgICAvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBpdmFyIG9mZnNldCBpcyBhIGxhemlseQogICAgIC8vIGluaXRpYWxpc2VkIHZhbHVlIHRoYXQgbWF5IGRlcGVuZCBvbiBvYmpjX21zZ1NlbmQgdG8gcGVyZm9ybSBhIGZpeHVwIG9uCiAgICAgLy8gdGhlIGZpcnN0IG1lc3NhZ2UgZGlzcGF0Y2guCiAgICAgLy8KQEAgLTE0NDYsMTIxICsxNDQ5LDExNSBAQAogICAgIC8vIGJhc2Ugb2YgdGhlIGl2YXIgYWNjZXNzIGlzIGEgcGFyYW1ldGVyIHRvIGFuIE9iamVjdGl2ZSBDIG1ldGhvZC4KICAgICAvLyBIb3dldmVyLCBiZWNhdXNlIHRoZSBwYXJhbWV0ZXJzIGFyZSBub3QgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50CiAgICAgLy8gaW50ZXJmYWNlLCB3ZSBjYW5ub3QgcGVyZm9ybSB0aGlzIGNoZWNrLgotICAgIGlmIChDR0YuQ3VyRnVuY0RlY2wgJiYgaXNhPE9iakNNZXRob2REZWNsPihDR0YuQ3VyRnVuY0RlY2wpKQotICAgICAgaWYgKElWLT5nZXRDb250YWluaW5nSW50ZXJmYWNlKCktPmlzU3VwZXJDbGFzc09mKElEKSkKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKGNvbnN0IE9iakNNZXRob2REZWNsICpNRCA9CisgICAgICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxPYmpDTWV0aG9kRGVjbD4oQ0dGLkN1ckZ1bmNEZWNsKSkKKyAgICAgIGlmIChNRC0+aXNJbnN0YW5jZU1ldGhvZCgpKQorICAgICAgICBpZiAoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklEID0gTUQtPmdldENsYXNzSW50ZXJmYWNlKCkpCisgICAgICAgICAgcmV0dXJuIElWLT5nZXRDb250YWluaW5nSW50ZXJmYWNlKCktPmlzU3VwZXJDbGFzc09mKElEKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAogcHVibGljOgogICBDR09iakNOb25GcmFnaWxlQUJJTWFjKENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJmNnbSk7CiAgIC8vIEZJWE1FLiBBbGwgc3R1YnMgZm9yIG5vdyEKLSAgdmlydHVhbCBsbHZtOjpGdW5jdGlvbiAqTW9kdWxlSW5pdEZ1bmN0aW9uKCk7CisgIGxsdm06OkZ1bmN0aW9uICpNb2R1bGVJbml0RnVuY3Rpb24oKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIENvZGVHZW46OlJWYWx1ZSBHZW5lcmF0ZU1lc3NhZ2VTZW5kKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblZhbHVlU2xvdCBSZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUmVzdWx0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBTZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxBcmdMaXN0ICZDYWxsQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCk7CisgIENvZGVHZW46OlJWYWx1ZSBHZW5lcmF0ZU1lc3NhZ2VTZW5kKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5WYWx1ZVNsb3QgUmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBSZXN1bHRUeXBlLCBTZWxlY3RvciBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpSZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEFyZ0xpc3QgJkNhbGxBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2QpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgQ29kZUdlbjo6UlZhbHVlCisgIENvZGVHZW46OlJWYWx1ZQogICBHZW5lcmF0ZU1lc3NhZ2VTZW5kU3VwZXIoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5WYWx1ZVNsb3QgUmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUmVzdWx0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIFNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNDYXRlZ29yeUltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ2xhc3NNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEFyZ0xpc3QgJkNhbGxBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5WYWx1ZVNsb3QgUmV0dXJuLCBRdWFsVHlwZSBSZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3IgU2VsLCBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQ2F0ZWdvcnlJbXBsLCBsbHZtOjpWYWx1ZSAqUmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ2xhc3NNZXNzYWdlLCBjb25zdCBDYWxsQXJnTGlzdCAmQ2FsbEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpHZXRDbGFzcyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklEKTsKKyAgbGx2bTo6VmFsdWUgKkdldENsYXNzKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklEKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpHZXRTZWxlY3RvcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwgU2VsZWN0b3IgU2VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGx2YWx1ZSA9IGZhbHNlKQorICBsbHZtOjpWYWx1ZSAqR2V0U2VsZWN0b3IoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIFNlbGVjdG9yIFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbHZhbHVlID0gZmFsc2UpIG92ZXJyaWRlCiAgICAgeyByZXR1cm4gRW1pdFNlbGVjdG9yKENHRiwgU2VsLCBsdmFsdWUpOyB9CiAKICAgLy8vIFRoZSBOZVhUL0FwcGxlIHJ1bnRpbWVzIGRvIG5vdCBzdXBwb3J0IHR5cGVkIHNlbGVjdG9yczsganVzdCBlbWl0IGFuCiAgIC8vLyB1bnR5cGVkIG9uZS4KLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqR2V0U2VsZWN0b3IoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2QpCisgIGxsdm06OlZhbHVlICpHZXRTZWxlY3RvcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2QpIG92ZXJyaWRlCiAgICAgeyByZXR1cm4gRW1pdFNlbGVjdG9yKENHRiwgTWV0aG9kLT5nZXRTZWxlY3RvcigpKTsgfQogCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUNhdGVnb3J5KGNvbnN0IE9iakNDYXRlZ29yeUltcGxEZWNsICpDTUQpOworICB2b2lkIEdlbmVyYXRlQ2F0ZWdvcnkoY29uc3QgT2JqQ0NhdGVnb3J5SW1wbERlY2wgKkNNRCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQ2xhc3MoY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqQ2xhc3NEZWNsKTsKKyAgdm9pZCBHZW5lcmF0ZUNsYXNzKGNvbnN0IE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKkNsYXNzRGVjbCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyQWxpYXMoY29uc3QgT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2wgKk9BRCkge30KKyAgdm9pZCBSZWdpc3RlckFsaWFzKGNvbnN0IE9iakNDb21wYXRpYmxlQWxpYXNEZWNsICpPQUQpIG92ZXJyaWRlIHt9CiAKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqR2VuZXJhdGVQcm90b2NvbFJlZihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRCk7CisgIGxsdm06OlZhbHVlICpHZW5lcmF0ZVByb3RvY29sUmVmKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCAqR2V0RUhUeXBlKFF1YWxUeXBlIFQpOworICBsbHZtOjpDb25zdGFudCAqR2V0RUhUeXBlKFF1YWxUeXBlIFQpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkdldFByb3BlcnR5R2V0RnVuY3Rpb24oKSB7CisgIGxsdm06OkNvbnN0YW50ICpHZXRQcm9wZXJ0eUdldEZ1bmN0aW9uKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBPYmpDVHlwZXMuZ2V0R2V0UHJvcGVydHlGbigpOwogICB9Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkdldFByb3BlcnR5U2V0RnVuY3Rpb24oKSB7CisgIGxsdm06OkNvbnN0YW50ICpHZXRQcm9wZXJ0eVNldEZ1bmN0aW9uKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBPYmpDVHlwZXMuZ2V0U2V0UHJvcGVydHlGbigpOwogICB9Ci0gIAotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRPcHRpbWl6ZWRQcm9wZXJ0eVNldEZ1bmN0aW9uKGJvb2wgYXRvbWljLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvcHkpIHsKKworICBsbHZtOjpDb25zdGFudCAqR2V0T3B0aW1pemVkUHJvcGVydHlTZXRGdW5jdGlvbihib29sIGF0b21pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb3B5KSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIE9iakNUeXBlcy5nZXRPcHRpbWl6ZWRTZXRQcm9wZXJ0eUZuKGF0b21pYywgY29weSk7CiAgIH0KLSAgCi0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkdldFNldFN0cnVjdEZ1bmN0aW9uKCkgeworCisgIGxsdm06OkNvbnN0YW50ICpHZXRTZXRTdHJ1Y3RGdW5jdGlvbigpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gT2JqQ1R5cGVzLmdldENvcHlTdHJ1Y3RGbigpOwogICB9Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkdldEdldFN0cnVjdEZ1bmN0aW9uKCkgeworICBsbHZtOjpDb25zdGFudCAqR2V0R2V0U3RydWN0RnVuY3Rpb24oKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIE9iakNUeXBlcy5nZXRDb3B5U3RydWN0Rm4oKTsKICAgfQotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRDcHBBdG9taWNPYmplY3RTZXRGdW5jdGlvbigpIHsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldENwcEF0b21pY09iamVjdFNldEZ1bmN0aW9uKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBPYmpDVHlwZXMuZ2V0Q3BwQXRvbWljT2JqZWN0RnVuY3Rpb24oKTsKICAgfQotICB2aXJ0dWFsIGxsdm06OkNvbnN0YW50ICpHZXRDcHBBdG9taWNPYmplY3RHZXRGdW5jdGlvbigpIHsKKyAgbGx2bTo6Q29uc3RhbnQgKkdldENwcEF0b21pY09iamVjdEdldEZ1bmN0aW9uKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBPYmpDVHlwZXMuZ2V0Q3BwQXRvbWljT2JqZWN0RnVuY3Rpb24oKTsKICAgfQotICAKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCAqRW51bWVyYXRpb25NdXRhdGlvbkZ1bmN0aW9uKCkgeworCisgIGxsdm06OkNvbnN0YW50ICpFbnVtZXJhdGlvbk11dGF0aW9uRnVuY3Rpb24oKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIE9iakNUeXBlcy5nZXRFbnVtZXJhdGlvbk11dGF0aW9uRm4oKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBFbWl0VHJ5U3RtdChDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNBdFRyeVN0bXQgJlMpOwotICB2aXJ0dWFsIHZvaWQgRW1pdFN5bmNocm9uaXplZFN0bXQoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDQXRTeW5jaHJvbml6ZWRTdG10ICZTKTsKLSAgdmlydHVhbCB2b2lkIEVtaXRUaHJvd1N0bXQoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNBdFRocm93U3RtdCAmUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDbGVhckluc2VydGlvblBvaW50PXRydWUpOwotICB2aXJ0dWFsIGxsdm06OlZhbHVlICogRW1pdE9iakNXZWFrUmVhZChDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkFkZHJXZWFrT2JqKTsKLSAgdmlydHVhbCB2b2lkIEVtaXRPYmpDV2Vha0Fzc2lnbihDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqc3JjLCBsbHZtOjpWYWx1ZSAqZHN0KTsKLSAgdmlydHVhbCB2b2lkIEVtaXRPYmpDR2xvYmFsQXNzaWduKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnNyYywgbGx2bTo6VmFsdWUgKmRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZGxvY2FsID0gZmFsc2UpOwotICB2aXJ0dWFsIHZvaWQgRW1pdE9iakNJdmFyQXNzaWduKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmMsIGxsdm06OlZhbHVlICpkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICppdmFyT2Zmc2V0KTsKLSAgdmlydHVhbCB2b2lkIEVtaXRPYmpDU3Ryb25nQ2FzdEFzc2lnbihDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqc3JjLCBsbHZtOjpWYWx1ZSAqZGVzdCk7Ci0gIHZpcnR1YWwgdm9pZCBFbWl0R0NNZW1tb3ZlQ29sbGVjdGFibGUoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKmRlc3QsIGxsdm06OlZhbHVlICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnNpemUpOwotICB2aXJ0dWFsIExWYWx1ZSBFbWl0T2JqQ1ZhbHVlRm9ySXZhcihDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgT2JqZWN0VHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpCYXNlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJdmFyRGVjbCAqSXZhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ1ZSUXVhbGlmaWVycyk7Ci0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRJdmFyT2Zmc2V0KENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSXZhckRlY2wgKkl2YXIpOworICB2b2lkIEVtaXRUcnlTdG10KENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNBdFRyeVN0bXQgJlMpIG92ZXJyaWRlOworICB2b2lkIEVtaXRTeW5jaHJvbml6ZWRTdG10KENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNBdFN5bmNocm9uaXplZFN0bXQgJlMpIG92ZXJyaWRlOworICB2b2lkIEVtaXRUaHJvd1N0bXQoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IE9iakNBdFRocm93U3RtdCAmUywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2xlYXJJbnNlcnRpb25Qb2ludD10cnVlKSBvdmVycmlkZTsKKyAgbGx2bTo6VmFsdWUgKiBFbWl0T2JqQ1dlYWtSZWFkKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkFkZHJXZWFrT2JqKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0T2JqQ1dlYWtBc3NpZ24oQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmMsIGxsdm06OlZhbHVlICpkc3QpIG92ZXJyaWRlOworICB2b2lkIEVtaXRPYmpDR2xvYmFsQXNzaWduKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzcmMsIGxsdm06OlZhbHVlICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkbG9jYWwgPSBmYWxzZSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdE9iakNJdmFyQXNzaWduKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqc3JjLCBsbHZtOjpWYWx1ZSAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKml2YXJPZmZzZXQpIG92ZXJyaWRlOworICB2b2lkIEVtaXRPYmpDU3Ryb25nQ2FzdEFzc2lnbihDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnNyYywgbGx2bTo6VmFsdWUgKmRlc3QpIG92ZXJyaWRlOworICB2b2lkIEVtaXRHQ01lbW1vdmVDb2xsZWN0YWJsZShDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKmRlc3QsIGxsdm06OlZhbHVlICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpzaXplKSBvdmVycmlkZTsKKyAgTFZhbHVlIEVtaXRPYmpDVmFsdWVGb3JJdmFyKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLCBRdWFsVHlwZSBPYmplY3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpCYXNlVmFsdWUsIGNvbnN0IE9iakNJdmFyRGVjbCAqSXZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENWUlF1YWxpZmllcnMpIG92ZXJyaWRlOworICBsbHZtOjpWYWx1ZSAqRW1pdEl2YXJPZmZzZXQoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0l2YXJEZWNsICpJdmFyKSBvdmVycmlkZTsKIH07CiAKIC8vLyBBIGhlbHBlciBjbGFzcyBmb3IgcGVyZm9ybWluZyB0aGUgbnVsbC1pbml0aWFsaXphdGlvbiBvZiBhIHJldHVybgpAQCAtMTg3OCwxNCArMTg3NSwxNCBAQAogICBNZXNzYWdlU2VuZEluZm8gTVNJID0gZ2V0TWVzc2FnZVNlbmRJbmZvKE1ldGhvZCwgUmVzdWx0VHlwZSwgQWN0dWFsQXJncyk7CiAKICAgaWYgKE1ldGhvZCkKLSAgICBhc3NlcnQoQ0dNLmdldENvbnRleHQoKS5nZXRDYW5vbmljYWxUeXBlKE1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpKSA9PQotICAgICAgICAgICBDR00uZ2V0Q29udGV4dCgpLmdldENhbm9uaWNhbFR5cGUoUmVzdWx0VHlwZSkgJiYKKyAgICBhc3NlcnQoQ0dNLmdldENvbnRleHQoKS5nZXRDYW5vbmljYWxUeXBlKE1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpKSA9PQorICAgICAgICAgICAgICAgQ0dNLmdldENvbnRleHQoKS5nZXRDYW5vbmljYWxUeXBlKFJlc3VsdFR5cGUpICYmCiAgICAgICAgICAgICJSZXN1bHQgdHlwZSBtaXNtYXRjaCEiKTsKIAogICBOdWxsUmV0dXJuU3RhdGUgbnVsbFJldHVybjsKIAogICBsbHZtOjpDb25zdGFudCAqRm4gPSBOVUxMOwotICBpZiAoQ0dNLlJldHVyblR5cGVVc2VzU1JldChNU0kuQ2FsbEluZm8pKSB7CisgIGlmIChDR00uUmV0dXJuU2xvdEludGVyZmVyZXNXaXRoQXJncyhNU0kuQ2FsbEluZm8pKSB7CiAgICAgaWYgKCFJc1N1cGVyKSBudWxsUmV0dXJuLmluaXQoQ0dGLCBBcmcwKTsKICAgICBGbiA9IChPYmpDQUJJID09IDIpID8gIE9iakNUeXBlcy5nZXRTZW5kU3RyZXRGbjIoSXNTdXBlcikKICAgICAgIDogT2JqQ1R5cGVzLmdldFNlbmRTdHJldEZuKElzU3VwZXIpOwpAQCAtMTg5NiwxNSArMTg5MywxNyBAQAogICAgIEZuID0gKE9iakNBQkkgPT0gMikgPyBPYmpDVHlwZXMuZ2V0U2VuZEZwMlJldEZuMihJc1N1cGVyKQogICAgICAgOiBPYmpDVHlwZXMuZ2V0U2VuZEZwMnJldEZuKElzU3VwZXIpOwogICB9IGVsc2UgeworICAgIC8vIGFybTY0IHVzZXMgb2JqY19tc2dTZW5kIGZvciBzdHJldCBtZXRob2RzIGFuZCB5ZXQgbnVsbCByZWNlaXZlciBjaGVjaworICAgIC8vIG11c3QgYmUgbWFkZSBmb3IgaXQuCisgICAgaWYgKCFJc1N1cGVyICYmIENHTS5SZXR1cm5UeXBlVXNlc1NSZXQoTVNJLkNhbGxJbmZvKSkKKyAgICAgIG51bGxSZXR1cm4uaW5pdChDR0YsIEFyZzApOwogICAgIEZuID0gKE9iakNBQkkgPT0gMikgPyBPYmpDVHlwZXMuZ2V0U2VuZEZuMihJc1N1cGVyKQogICAgICAgOiBPYmpDVHlwZXMuZ2V0U2VuZEZuKElzU3VwZXIpOwogICB9CiAgIAogICBib29sIHJlcXVpcmVzbnVsbENoZWNrID0gZmFsc2U7CiAgIGlmIChDR00uZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50ICYmIE1ldGhvZCkKLSAgICBmb3IgKE9iakNNZXRob2REZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBpID0gTWV0aG9kLT5wYXJhbV9iZWdpbigpLAotICAgICAgICAgZSA9IE1ldGhvZC0+cGFyYW1fZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgICBjb25zdCBQYXJtVmFyRGVjbCAqUGFyYW1EZWNsID0gKCppKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKlBhcmFtRGVjbCA6IE1ldGhvZC0+cGFyYW1zKCkpIHsKICAgICAgIGlmIChQYXJhbURlY2wtPmhhc0F0dHI8TlNDb25zdW1lZEF0dHI+KCkpIHsKICAgICAgICAgaWYgKCFudWxsUmV0dXJuLk51bGxCQikKICAgICAgICAgICBudWxsUmV0dXJuLmluaXQoQ0dGLCBBcmcwKTsKQEAgLTE5NjcsOSArMTk2Niw4IEBACiAgIC8vIHRvIGJlIEdDJ2VkLgogCiAgIC8vIFdhbGsgdGhlIGNhcHR1cmVkIHZhcmlhYmxlcy4KLSAgZm9yIChCbG9ja0RlY2w6OmNhcHR1cmVfY29uc3RfaXRlcmF0b3IgY2kgPSBibG9ja0RlY2wtPmNhcHR1cmVfYmVnaW4oKSwKLSAgICAgICAgIGNlID0gYmxvY2tEZWNsLT5jYXB0dXJlX2VuZCgpOyBjaSAhPSBjZTsgKytjaSkgewotICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gY2ktPmdldFZhcmlhYmxlKCk7CisgIGZvciAoY29uc3QgYXV0byAmQ0kgOiBibG9ja0RlY2wtPmNhcHR1cmVzKCkpIHsKKyAgICBjb25zdCBWYXJEZWNsICp2YXJpYWJsZSA9IENJLmdldFZhcmlhYmxlKCk7CiAgICAgUXVhbFR5cGUgdHlwZSA9IHZhcmlhYmxlLT5nZXRUeXBlKCk7CiAKICAgICBjb25zdCBDR0Jsb2NrSW5mbzo6Q2FwdHVyZSAmY2FwdHVyZSA9IGJsb2NrSW5mby5nZXRDYXB0dXJlKHZhcmlhYmxlKTsKQEAgLTE5ODAsNyArMTk3OCw3IEBACiAgICAgdWludDY0X3QgZmllbGRPZmZzZXQgPSBsYXlvdXQtPmdldEVsZW1lbnRPZmZzZXQoY2FwdHVyZS5nZXRJbmRleCgpKTsKIAogICAgIC8vIF9fYmxvY2sgdmFyaWFibGVzIGFyZSBwYXNzZWQgYnkgdGhlaXIgZGVzY3JpcHRvciBhZGRyZXNzLgotICAgIGlmIChjaS0+aXNCeVJlZigpKSB7CisgICAgaWYgKENJLmlzQnlSZWYoKSkgewogICAgICAgSXZhcnNJbmZvLnB1c2hfYmFjayhHQ19JVkFSKGZpZWxkT2Zmc2V0LCAvKnNpemUgaW4gd29yZHMqLyAxKSk7CiAgICAgICBjb250aW51ZTsKICAgICB9CkBAIC0yMTE4LDkgKzIxMTYsNiBAQAogICAgICAgICBFbENvdW50ICo9IENBcnJheS0+Z2V0U2l6ZSgpLmdldFpFeHRWYWx1ZSgpOwogICAgICAgICBGUVQgPSBDQXJyYXktPmdldEVsZW1lbnRUeXBlKCk7CiAgICAgICB9Ci0gICAgICAKLSAgICAgIGFzc2VydCghRlFULT5pc1VuaW9uVHlwZSgpICYmCi0gICAgICAgICAgICAgImxheW91dCBmb3IgYXJyYXkgb2YgdW5pb25zIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgIGlmIChGUVQtPmlzUmVjb3JkVHlwZSgpICYmIEVsQ291bnQpIHsKICAgICAgICAgaW50IE9sZEluZGV4ID0gUnVuU2tpcEJsb2NrVmFycy5zaXplKCkgLSAxOwogICAgICAgICBjb25zdCBSZWNvcmRUeXBlICpSVCA9IEZRVC0+Z2V0QXM8UmVjb3JkVHlwZT4oKTsKQEAgLTIxOTYsMTAgKzIxOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZIYXNVbmlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBCeXJlZkxheW91dCkgewogICBjb25zdCBSZWNvcmREZWNsICpSRCA9IFJULT5nZXREZWNsKCk7Ci0gIFNtYWxsVmVjdG9yPGNvbnN0IEZpZWxkRGVjbCosIDE2PiBGaWVsZHM7Ci0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgaSA9IFJELT5maWVsZF9iZWdpbigpLAotICAgICAgIGUgPSBSRC0+ZmllbGRfZW5kKCk7IGkgIT0gZTsgKytpKQotICAgIEZpZWxkcy5wdXNoX2JhY2soKmkpOworICBTbWFsbFZlY3Rvcjxjb25zdCBGaWVsZERlY2wqLCAxNj4gRmllbGRzKFJELT5maWVsZHMoKSk7CiAgIGxsdm06OlR5cGUgKlR5ID0gQ0dNLmdldFR5cGVzKCkuQ29udmVydFR5cGUoUXVhbFR5cGUoUlQsIDApKTsKICAgY29uc3QgbGx2bTo6U3RydWN0TGF5b3V0ICpSZWNMYXlvdXQgPQogICAgIENHTS5nZXREYXRhTGF5b3V0KCkuZ2V0U3RydWN0TGF5b3V0KGNhc3Q8bGx2bTo6U3RydWN0VHlwZT4oVHkpKTsKQEAgLTI0ODYsOSArMjQ3OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0luZm8uQmxvY2tIZWFkZXJGb3JjZWRHYXBPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0luZm8uQmxvY2tIZWFkZXJGb3JjZWRHYXBTaXplKTsKICAgLy8gV2FsayB0aGUgY2FwdHVyZWQgdmFyaWFibGVzLgotICBmb3IgKEJsb2NrRGVjbDo6Y2FwdHVyZV9jb25zdF9pdGVyYXRvciBjaSA9IGJsb2NrRGVjbC0+Y2FwdHVyZV9iZWdpbigpLAotICAgICAgIGNlID0gYmxvY2tEZWNsLT5jYXB0dXJlX2VuZCgpOyBjaSAhPSBjZTsgKytjaSkgewotICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gY2ktPmdldFZhcmlhYmxlKCk7CisgIGZvciAoY29uc3QgYXV0byAmQ0kgOiBibG9ja0RlY2wtPmNhcHR1cmVzKCkpIHsKKyAgICBjb25zdCBWYXJEZWNsICp2YXJpYWJsZSA9IENJLmdldFZhcmlhYmxlKCk7CiAgICAgUXVhbFR5cGUgdHlwZSA9IHZhcmlhYmxlLT5nZXRUeXBlKCk7CiAgICAgCiAgICAgY29uc3QgQ0dCbG9ja0luZm86OkNhcHR1cmUgJmNhcHR1cmUgPSBibG9ja0luZm8uZ2V0Q2FwdHVyZSh2YXJpYWJsZSk7CkBAIC0yNTAwLDE3ICsyNDkxLDE3IEBACiAgICAgICAgQ2hhclVuaXRzOjpmcm9tUXVhbnRpdHkobGF5b3V0LT5nZXRFbGVtZW50T2Zmc2V0KGNhcHR1cmUuZ2V0SW5kZXgoKSkpOwogICAgIAogICAgIGFzc2VydCghdHlwZS0+aXNBcnJheVR5cGUoKSAmJiAiYXJyYXkgdmFyaWFibGUgc2hvdWxkIG5vdCBiZSBjYXVnaHQiKTsKLSAgICBpZiAoIWNpLT5pc0J5UmVmKCkpCisgICAgaWYgKCFDSS5pc0J5UmVmKCkpCiAgICAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqcmVjb3JkID0gdHlwZS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkgewogICAgICAgICBCdWlsZFJDQmxvY2tWYXJSZWNvcmRMYXlvdXQocmVjb3JkLCBmaWVsZE9mZnNldCwgaGFzVW5pb24pOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KICAgICBDaGFyVW5pdHMgZmllbGRTaXplOwotICAgIGlmIChjaS0+aXNCeVJlZigpKQorICAgIGlmIChDSS5pc0J5UmVmKCkpCiAgICAgICBmaWVsZFNpemUgPSBDaGFyVW5pdHM6OmZyb21RdWFudGl0eShXb3JkU2l6ZUluQnl0ZXMpOwogICAgIGVsc2UKICAgICAgIGZpZWxkU2l6ZSA9IENHTS5nZXRDb250ZXh0KCkuZ2V0VHlwZVNpemVJbkNoYXJzKHR5cGUpOwotICAgIFVwZGF0ZVJ1blNraXBCbG9ja1ZhcnMoY2ktPmlzQnlSZWYoKSwgZ2V0QmxvY2tDYXB0dXJlTGlmZXRpbWUodHlwZSwgZmFsc2UpLAorICAgIFVwZGF0ZVJ1blNraXBCbG9ja1ZhcnMoQ0kuaXNCeVJlZigpLCBnZXRCbG9ja0NhcHR1cmVMaWZldGltZSh0eXBlLCBmYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE9mZnNldCwgZmllbGRTaXplKTsKICAgfQogICByZXR1cm4gZ2V0Qml0bWFwQmxvY2tMYXlvdXQoZmFsc2UpOwpAQCAtMjU2Miw4ICsyNTUzLDE2IEBACiAgIHJldHVybiBHZXRPckVtaXRQcm90b2NvbFJlZihQRCk7CiB9CiAKK3N0YXRpYyB2b2lkIGFzc2VydFByaXZhdGVOYW1lKGNvbnN0IGxsdm06Okdsb2JhbFZhbHVlICpHVikgeworICBTdHJpbmdSZWYgTmFtZVJlZiA9IEdWLT5nZXROYW1lKCk7CisgICh2b2lkKU5hbWVSZWY7CisgIGFzc2VydChOYW1lUmVmWzBdID09ICdcMDEnICYmIChOYW1lUmVmWzFdID09ICdMJyB8fCBOYW1lUmVmWzFdID09ICdsJykpOworICBhc3NlcnQoR1YtPmdldFZpc2liaWxpdHkoKSA9PSBsbHZtOjpHbG9iYWxWYWx1ZTo6RGVmYXVsdFZpc2liaWxpdHkpOworICBhc3NlcnQoR1YtPmdldExpbmthZ2UoKSA9PSBsbHZtOjpHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2UpOworfQorCiAvKgotLy8gQVBQTEUgTE9DQUwgcmFkYXIgNDU4NTc2OSAtIE9iamVjdGl2ZS1DIDEuMCBleHRlbnNpb25zCisvLyBPYmplY3RpdmUtQyAxLjAgZXh0ZW5zaW9ucwogc3RydWN0IF9vYmpjX3Byb3RvY29sIHsKIHN0cnVjdCBfb2JqY19wcm90b2NvbF9leHRlbnNpb24gKmlzYTsKIGNoYXIgKnByb3RvY29sX25hbWU7CkBAIC0yNTkzLDkgKzI1OTIsNyBAQAogICBzdGQ6OnZlY3RvcjxsbHZtOjpDb25zdGFudCo+IEluc3RhbmNlTWV0aG9kcywgQ2xhc3NNZXRob2RzOwogICBzdGQ6OnZlY3RvcjxsbHZtOjpDb25zdGFudCo+IE9wdEluc3RhbmNlTWV0aG9kcywgT3B0Q2xhc3NNZXRob2RzOwogICBzdGQ6OnZlY3RvcjxsbHZtOjpDb25zdGFudCo+IE1ldGhvZFR5cGVzRXh0LCBPcHRNZXRob2RUeXBlc0V4dDsKLSAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjppbnN0bWV0aF9pdGVyYXRvcgotICAgICAgICAgaSA9IFBELT5pbnN0bWV0aF9iZWdpbigpLCBlID0gUEQtPmluc3RtZXRoX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgIE9iakNNZXRob2REZWNsICpNRCA9ICppOworICBmb3IgKGNvbnN0IGF1dG8gKk1EIDogUEQtPmluc3RhbmNlX21ldGhvZHMoKSkgewogICAgIGxsdm06OkNvbnN0YW50ICpDID0gR2V0TWV0aG9kRGVzY3JpcHRpb25Db25zdGFudChNRCk7CiAgICAgaWYgKCFDKQogICAgICAgcmV0dXJuIEdldE9yRW1pdFByb3RvY29sUmVmKFBEKTsKQEAgLTI2MDksOSArMjYwNiw3IEBACiAgICAgfQogICB9CiAKLSAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjpjbGFzc21ldGhfaXRlcmF0b3IKLSAgICAgICAgIGkgPSBQRC0+Y2xhc3NtZXRoX2JlZ2luKCksIGUgPSBQRC0+Y2xhc3NtZXRoX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgIE9iakNNZXRob2REZWNsICpNRCA9ICppOworICBmb3IgKGNvbnN0IGF1dG8gKk1EIDogUEQtPmNsYXNzX21ldGhvZHMoKSkgewogICAgIGxsdm06OkNvbnN0YW50ICpDID0gR2V0TWV0aG9kRGVzY3JpcHRpb25Db25zdGFudChNRCk7CiAgICAgaWYgKCFDKQogICAgICAgcmV0dXJuIEdldE9yRW1pdFByb3RvY29sUmVmKFBEKTsKQEAgLTI2NDYsMTMgKzI2NDEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyk7CiAKICAgaWYgKEVudHJ5KSB7Ci0gICAgLy8gQWxyZWFkeSBjcmVhdGVkLCBmaXggdGhlIGxpbmthZ2UgYW5kIHVwZGF0ZSB0aGUgaW5pdGlhbGl6ZXIuCi0gICAgRW50cnktPnNldExpbmthZ2UobGx2bTo6R2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSk7CisgICAgLy8gQWxyZWFkeSBjcmVhdGVkLCB1cGRhdGUgdGhlIGluaXRpYWxpemVyLgorICAgIGFzc2VydChFbnRyeS0+Z2V0TGlua2FnZSgpID09IGxsdm06Okdsb2JhbFZhbHVlOjpQcml2YXRlTGlua2FnZSk7CiAgICAgRW50cnktPnNldEluaXRpYWxpemVyKEluaXQpOwogICB9IGVsc2UgewogICAgIEVudHJ5ID0KICAgICAgIG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIE9iakNUeXBlcy5Qcm90b2NvbFR5LCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpQcml2YXRlTGlua2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcMDFMX09CSkNfUFJPVE9DT0xfIiArIFBELT5nZXROYW1lKCkpOwogICAgIEVudHJ5LT5zZXRTZWN0aW9uKCJfX09CSkMsX19wcm90b2NvbCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiKTsKQEAgLTI2NjEsNyArMjY1Niw4IEBACiAKICAgICBQcm90b2NvbHNbUEQtPmdldElkZW50aWZpZXIoKV0gPSBFbnRyeTsKICAgfQotICBDR00uQWRkVXNlZEdsb2JhbChFbnRyeSk7CisgIGFzc2VydFByaXZhdGVOYW1lKEVudHJ5KTsKKyAgQ0dNLmFkZENvbXBpbGVyVXNlZEdsb2JhbChFbnRyeSk7CiAKICAgcmV0dXJuIEVudHJ5OwogfQpAQCAtMjY3NSwxMyArMjY3MSwxNCBAQAogICAgIC8vIGNvbnRlbnRzIGZvciBwcm90b2NvbHMgd2hpY2ggd2VyZSByZWZlcmVuY2VkIGJ1dCBuZXZlciBkZWZpbmVkLgogICAgIEVudHJ5ID0KICAgICAgIG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIE9iakNUeXBlcy5Qcm90b2NvbFR5LCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpQcml2YXRlTGlua2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcMDFMX09CSkNfUFJPVE9DT0xfIiArIFBELT5nZXROYW1lKCkpOwogICAgIEVudHJ5LT5zZXRTZWN0aW9uKCJfX09CSkMsX19wcm90b2NvbCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiKTsKICAgICAvLyBGSVhNRTogSXMgdGhpcyBuZWNlc3Nhcnk/IFdoeSBvbmx5IGZvciBwcm90b2NvbD8KICAgICBFbnRyeS0+c2V0QWxpZ25tZW50KDQpOwogICB9CisgIGFzc2VydFByaXZhdGVOYW1lKEVudHJ5KTsKIAogICByZXR1cm4gRW50cnk7CiB9CkBAIC0yNzI2LDcgKzI3MjMsNyBAQAogICAgIGxsdm06OkNvbnN0YW50U3RydWN0OjpnZXQoT2JqQ1R5cGVzLlByb3RvY29sRXh0ZW5zaW9uVHksIFZhbHVlcyk7CiAKICAgLy8gTm8gc3BlY2lhbCBzZWN0aW9uLCBidXQgZ29lcyBpbiBsbHZtLnVzZWQKLSAgcmV0dXJuIENyZWF0ZU1ldGFkYXRhVmFyKCJcMDFMX09CSkNfUFJPVE9DT0xFWFRfIiArIFBELT5nZXROYW1lKCksCisgIHJldHVybiBDcmVhdGVNZXRhZGF0YVZhcigiXDAxbF9PQkpDX1BST1RPQ09MRVhUXyIgKyBQRC0+Z2V0TmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIHRydWUpOwogfQpAQCAtMjc3NSwxNCArMjc3MiwxMSBAQAogUHVzaFByb3RvY29sUHJvcGVydGllcyhsbHZtOjpTbWFsbFB0clNldDxjb25zdCBJZGVudGlmaWVySW5mbyosMTY+ICZQcm9wZXJ0eVNldCwKICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGxsdm06OkNvbnN0YW50ICo+ICZQcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsICpDb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlBST1RPLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQcm90bywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0NvbW1vblR5cGVzSGVscGVyICZPYmpDVHlwZXMpIHsKLSAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBQID0gUFJPVE8tPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgICBFID0gUFJPVE8tPnByb3RvY29sX2VuZCgpOyBQICE9IEU7ICsrUCkgCi0gICAgUHVzaFByb3RvY29sUHJvcGVydGllcyhQcm9wZXJ0eVNldCwgUHJvcGVydGllcywgQ29udGFpbmVyLCAoKlApLCBPYmpDVHlwZXMpOwotICBmb3IgKE9iakNDb250YWluZXJEZWNsOjpwcm9wX2l0ZXJhdG9yIEkgPSBQUk9UTy0+cHJvcF9iZWdpbigpLAotICAgICAgIEUgPSBQUk9UTy0+cHJvcF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICpQRCA9ICpJOworICBmb3IgKGNvbnN0IGF1dG8gKlAgOiBQcm90by0+cHJvdG9jb2xzKCkpIAorICAgIFB1c2hQcm90b2NvbFByb3BlcnRpZXMoUHJvcGVydHlTZXQsIFByb3BlcnRpZXMsIENvbnRhaW5lciwgUCwgT2JqQ1R5cGVzKTsKKyAgZm9yIChjb25zdCBhdXRvICpQRCA6IFByb3RvLT5wcm9wZXJ0aWVzKCkpIHsKICAgICBpZiAoIVByb3BlcnR5U2V0Lmluc2VydChQRC0+Z2V0SWRlbnRpZmllcigpKSkKICAgICAgIGNvbnRpbnVlOwogICAgIGxsdm06OkNvbnN0YW50ICpQcm9wW10gPSB7CkBAIC0yODExLDkgKzI4MDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0NvbW1vblR5cGVzSGVscGVyICZPYmpDVHlwZXMpIHsKICAgU21hbGxWZWN0b3I8bGx2bTo6Q29uc3RhbnQgKiwgMTY+IFByb3BlcnRpZXM7CiAgIGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IElkZW50aWZpZXJJbmZvKiwgMTY+IFByb3BlcnR5U2V0OwotICBmb3IgKE9iakNDb250YWluZXJEZWNsOjpwcm9wX2l0ZXJhdG9yIEkgPSBPQ0QtPnByb3BfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBPQ0QtPnByb3BfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqUEQgPSAqSTsKKyAgZm9yIChjb25zdCBhdXRvICpQRCA6IE9DRC0+cHJvcGVydGllcygpKSB7CiAgICAgUHJvcGVydHlTZXQuaW5zZXJ0KFBELT5nZXRJZGVudGlmaWVyKCkpOwogICAgIGxsdm06OkNvbnN0YW50ICpQcm9wW10gPSB7CiAgICAgICBHZXRQcm9wZXJ0eU5hbWUoUEQtPmdldElkZW50aWZpZXIoKSksCkBAIC0yODIzLDE3ICsyODE1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wKSk7CiAgIH0KICAgaWYgKGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpPSUQgPSBkeW5fY2FzdDxPYmpDSW50ZXJmYWNlRGVjbD4oT0NEKSkgewotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OmFsbF9wcm90b2NvbF9pdGVyYXRvcgotICAgICAgICAgUCA9IE9JRC0+YWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBPSUQtPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2VuZCgpOyBQICE9IEU7ICsrUCkKLSAgICAgIFB1c2hQcm90b2NvbFByb3BlcnRpZXMoUHJvcGVydHlTZXQsIFByb3BlcnRpZXMsIENvbnRhaW5lciwgKCpQKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNUeXBlcyk7CisgICAgZm9yIChjb25zdCBhdXRvICpQIDogT0lELT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbHMoKSkKKyAgICAgIFB1c2hQcm90b2NvbFByb3BlcnRpZXMoUHJvcGVydHlTZXQsIFByb3BlcnRpZXMsIENvbnRhaW5lciwgUCwgT2JqQ1R5cGVzKTsKICAgfQogICBlbHNlIGlmIChjb25zdCBPYmpDQ2F0ZWdvcnlEZWNsICpDRCA9IGR5bl9jYXN0PE9iakNDYXRlZ29yeURlY2w+KE9DRCkpIHsKLSAgICBmb3IgKE9iakNDYXRlZ29yeURlY2w6OnByb3RvY29sX2l0ZXJhdG9yIFAgPSBDRC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBDRC0+cHJvdG9jb2xfZW5kKCk7IFAgIT0gRTsgKytQKQotICAgICAgUHVzaFByb3RvY29sUHJvcGVydGllcyhQcm9wZXJ0eVNldCwgUHJvcGVydGllcywgQ29udGFpbmVyLCAoKlApLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ1R5cGVzKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKlAgOiBDRC0+cHJvdG9jb2xzKCkpCisgICAgICBQdXNoUHJvdG9jb2xQcm9wZXJ0aWVzKFByb3BlcnR5U2V0LCBQcm9wZXJ0aWVzLCBDb250YWluZXIsIFAsIE9iakNUeXBlcyk7CiAgIH0KIAogICAvLyBSZXR1cm4gbnVsbCBmb3IgZW1wdHkgbGlzdC4KQEAgLTI5NDUsMTYgKzI5MzIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBPQ0QtPmdldE5hbWUoKTsKIAogICBTbWFsbFZlY3RvcjxsbHZtOjpDb25zdGFudCAqLCAxNj4gSW5zdGFuY2VNZXRob2RzLCBDbGFzc01ldGhvZHM7Ci0gIGZvciAoT2JqQ0NhdGVnb3J5SW1wbERlY2w6Omluc3RtZXRoX2l0ZXJhdG9yCi0gICAgICAgICBpID0gT0NELT5pbnN0bWV0aF9iZWdpbigpLCBlID0gT0NELT5pbnN0bWV0aF9lbmQoKTsgaSAhPSBlOyArK2kpIHsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogT0NELT5pbnN0YW5jZV9tZXRob2RzKCkpCiAgICAgLy8gSW5zdGFuY2UgbWV0aG9kcyBzaG91bGQgYWx3YXlzIGJlIGRlZmluZWQuCi0gICAgSW5zdGFuY2VNZXRob2RzLnB1c2hfYmFjayhHZXRNZXRob2RDb25zdGFudCgqaSkpOwotICB9Ci0gIGZvciAoT2JqQ0NhdGVnb3J5SW1wbERlY2w6OmNsYXNzbWV0aF9pdGVyYXRvcgotICAgICAgICAgaSA9IE9DRC0+Y2xhc3NtZXRoX2JlZ2luKCksIGUgPSBPQ0QtPmNsYXNzbWV0aF9lbmQoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBJbnN0YW5jZU1ldGhvZHMucHVzaF9iYWNrKEdldE1ldGhvZENvbnN0YW50KEkpKTsKKworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBPQ0QtPmNsYXNzX21ldGhvZHMoKSkKICAgICAvLyBDbGFzcyBtZXRob2RzIHNob3VsZCBhbHdheXMgYmUgZGVmaW5lZC4KLSAgICBDbGFzc01ldGhvZHMucHVzaF9iYWNrKEdldE1ldGhvZENvbnN0YW50KCppKSk7Ci0gIH0KKyAgICBDbGFzc01ldGhvZHMucHVzaF9iYWNrKEdldE1ldGhvZENvbnN0YW50KEkpKTsKIAogICBsbHZtOjpDb25zdGFudCAqVmFsdWVzWzddOwogICBWYWx1ZXNbMF0gPSBHZXRDbGFzc05hbWUoT0NELT5nZXRJZGVudGlmaWVyKCkpOwpAQCAtMzA3MywyMSArMzA1NywxNSBAQAogICAgIEZsYWdzIHw9IEZyYWdpbGVBQklfQ2xhc3NfSGlkZGVuOwogCiAgIFNtYWxsVmVjdG9yPGxsdm06OkNvbnN0YW50ICosIDE2PiBJbnN0YW5jZU1ldGhvZHMsIENsYXNzTWV0aG9kczsKLSAgZm9yIChPYmpDSW1wbGVtZW50YXRpb25EZWNsOjppbnN0bWV0aF9pdGVyYXRvcgotICAgICAgICAgaSA9IElELT5pbnN0bWV0aF9iZWdpbigpLCBlID0gSUQtPmluc3RtZXRoX2VuZCgpOyBpICE9IGU7ICsraSkgeworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBJRC0+aW5zdGFuY2VfbWV0aG9kcygpKQogICAgIC8vIEluc3RhbmNlIG1ldGhvZHMgc2hvdWxkIGFsd2F5cyBiZSBkZWZpbmVkLgotICAgIEluc3RhbmNlTWV0aG9kcy5wdXNoX2JhY2soR2V0TWV0aG9kQ29uc3RhbnQoKmkpKTsKLSAgfQotICBmb3IgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2w6OmNsYXNzbWV0aF9pdGVyYXRvcgotICAgICAgICAgaSA9IElELT5jbGFzc21ldGhfYmVnaW4oKSwgZSA9IElELT5jbGFzc21ldGhfZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgSW5zdGFuY2VNZXRob2RzLnB1c2hfYmFjayhHZXRNZXRob2RDb25zdGFudChJKSk7CisKKyAgZm9yIChjb25zdCBhdXRvICpJIDogSUQtPmNsYXNzX21ldGhvZHMoKSkKICAgICAvLyBDbGFzcyBtZXRob2RzIHNob3VsZCBhbHdheXMgYmUgZGVmaW5lZC4KLSAgICBDbGFzc01ldGhvZHMucHVzaF9iYWNrKEdldE1ldGhvZENvbnN0YW50KCppKSk7Ci0gIH0KKyAgICBDbGFzc01ldGhvZHMucHVzaF9iYWNrKEdldE1ldGhvZENvbnN0YW50KEkpKTsKIAotICBmb3IgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2w6OnByb3BpbXBsX2l0ZXJhdG9yCi0gICAgICAgICBpID0gSUQtPnByb3BpbXBsX2JlZ2luKCksIGUgPSBJRC0+cHJvcGltcGxfZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgT2JqQ1Byb3BlcnR5SW1wbERlY2wgKlBJRCA9ICppOwotCisgIGZvciAoY29uc3QgYXV0byAqUElEIDogSUQtPnByb3BlcnR5X2ltcGxzKCkpIHsKICAgICBpZiAoUElELT5nZXRQcm9wZXJ0eUltcGxlbWVudGF0aW9uKCkgPT0gT2JqQ1Byb3BlcnR5SW1wbERlY2w6OlN5bnRoZXNpemUpIHsKICAgICAgIE9iakNQcm9wZXJ0eURlY2wgKlBEID0gUElELT5nZXRQcm9wZXJ0eURlY2woKTsKIApAQCAtMzEzMywxOSArMzExMSwxOSBAQAogICBOYW1lICs9IENsYXNzTmFtZTsKICAgY29uc3QgY2hhciAqU2VjdGlvbiA9ICJfX09CSkMsX19jbGFzcyxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiOwogICAvLyBDaGVjayBmb3IgYSBmb3J3YXJkIHJlZmVyZW5jZS4KLSAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWID0gQ0dNLmdldE1vZHVsZSgpLmdldEdsb2JhbFZhcmlhYmxlKE5hbWUpOworICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YgPSBDR00uZ2V0TW9kdWxlKCkuZ2V0R2xvYmFsVmFyaWFibGUoTmFtZSwgdHJ1ZSk7CiAgIGlmIChHVikgewogICAgIGFzc2VydChHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpID09IE9iakNUeXBlcy5DbGFzc1R5ICYmCiAgICAgICAgICAgICJGb3J3YXJkIG1ldGFjbGFzcyByZWZlcmVuY2UgaGFzIGluY29ycmVjdCB0eXBlLiIpOwotICAgIEdWLT5zZXRMaW5rYWdlKGxsdm06Okdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UpOwogICAgIEdWLT5zZXRJbml0aWFsaXplcihJbml0KTsKICAgICBHVi0+c2V0U2VjdGlvbihTZWN0aW9uKTsKICAgICBHVi0+c2V0QWxpZ25tZW50KDQpOwotICAgIENHTS5BZGRVc2VkR2xvYmFsKEdWKTsKLSAgfSAKLSAgZWxzZQorICAgIENHTS5hZGRDb21waWxlclVzZWRHbG9iYWwoR1YpOworICB9IGVsc2UKICAgICBHViA9IENyZWF0ZU1ldGFkYXRhVmFyKE5hbWUsIEluaXQsIFNlY3Rpb24sIDQsIHRydWUpOworICBhc3NlcnRQcml2YXRlTmFtZShHVik7CiAgIERlZmluZWRDbGFzc2VzLnB1c2hfYmFjayhHVik7CisgIEltcGxlbWVudGVkQ2xhc3Nlcy5wdXNoX2JhY2soSW50ZXJmYWNlKTsKICAgLy8gbWV0aG9kIGRlZmluaXRpb24gZW50cmllcyBtdXN0IGJlIGNsZWFyIGZvciBuZXh0IGltcGxlbWVudGF0aW9uLgogICBNZXRob2REZWZpbml0aW9ucy5jbGVhcigpOwogfQpAQCAtMzIwMSwyMCArMzE3OSwyMCBAQAogICBOYW1lICs9IElELT5nZXROYW1lKCk7CiAKICAgLy8gQ2hlY2sgZm9yIGEgZm9yd2FyZCByZWZlcmVuY2UuCi0gIGxsdm06Okdsb2JhbFZhcmlhYmxlICpHViA9IENHTS5nZXRNb2R1bGUoKS5nZXRHbG9iYWxWYXJpYWJsZShOYW1lKTsKKyAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWID0gQ0dNLmdldE1vZHVsZSgpLmdldEdsb2JhbFZhcmlhYmxlKE5hbWUsIHRydWUpOwogICBpZiAoR1YpIHsKICAgICBhc3NlcnQoR1YtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKSA9PSBPYmpDVHlwZXMuQ2xhc3NUeSAmJgogICAgICAgICAgICAiRm9yd2FyZCBtZXRhY2xhc3MgcmVmZXJlbmNlIGhhcyBpbmNvcnJlY3QgdHlwZS4iKTsKLSAgICBHVi0+c2V0TGlua2FnZShsbHZtOjpHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlKTsKICAgICBHVi0+c2V0SW5pdGlhbGl6ZXIoSW5pdCk7CiAgIH0gZWxzZSB7CiAgICAgR1YgPSBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoQ0dNLmdldE1vZHVsZSgpLCBPYmpDVHlwZXMuQ2xhc3NUeSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdCwgTmFtZSk7CiAgIH0KKyAgYXNzZXJ0UHJpdmF0ZU5hbWUoR1YpOwogICBHVi0+c2V0U2VjdGlvbigiX19PQkpDLF9fbWV0YV9jbGFzcyxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiKTsKICAgR1YtPnNldEFsaWdubWVudCg0KTsKLSAgQ0dNLkFkZFVzZWRHbG9iYWwoR1YpOworICBDR00uYWRkQ29tcGlsZXJVc2VkR2xvYmFsKEdWKTsKIAogICByZXR1cm4gR1Y7CiB9CkBAIC0zMjMwLDM1ICszMjA4LDI5IEBACiAgIC8vIENoZWNrIGZvciBhbiBleGlzdGluZyBmb3J3YXJkIHJlZmVyZW5jZS4KICAgLy8gUHJldmlvdXNseSwgbWV0YWNsYXNzIHdpdGggaW50ZXJuYWwgbGlua2FnZSBtYXkgaGF2ZSBiZWVuIGRlZmluZWQuCiAgIC8vIHBhc3MgJ3RydWUnIGFzIDJuZCBhcmd1bWVudCBzbyBpdCBpcyByZXR1cm5lZC4KLSAgaWYgKGxsdm06Okdsb2JhbFZhcmlhYmxlICpHViA9IENHTS5nZXRNb2R1bGUoKS5nZXRHbG9iYWxWYXJpYWJsZShOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKSB7Ci0gICAgYXNzZXJ0KEdWLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCkgPT0gT2JqQ1R5cGVzLkNsYXNzVHkgJiYKLSAgICAgICAgICAgIkZvcndhcmQgbWV0YWNsYXNzIHJlZmVyZW5jZSBoYXMgaW5jb3JyZWN0IHR5cGUuIik7Ci0gICAgcmV0dXJuIEdWOwotICB9IGVsc2UgewotICAgIC8vIEdlbmVyYXRlIGFzIGFuIGV4dGVybmFsIHJlZmVyZW5jZSB0byBrZWVwIGEgY29uc2lzdGVudAotICAgIC8vIG1vZHVsZS4gVGhpcyB3aWxsIGJlIHBhdGNoZWQgdXAgd2hlbiB3ZSBlbWl0IHRoZSBtZXRhY2xhc3MuCi0gICAgcmV0dXJuIG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIE9iakNUeXBlcy5DbGFzc1R5LCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSk7Ci0gIH0KKyAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWID0gQ0dNLmdldE1vZHVsZSgpLmdldEdsb2JhbFZhcmlhYmxlKE5hbWUsIHRydWUpOworICBpZiAoIUdWKQorICAgIEdWID0gbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKENHTS5nZXRNb2R1bGUoKSwgT2JqQ1R5cGVzLkNsYXNzVHksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpQcml2YXRlTGlua2FnZSwgMCwgTmFtZSk7CisKKyAgYXNzZXJ0KEdWLT5nZXRUeXBlKCktPmdldEVsZW1lbnRUeXBlKCkgPT0gT2JqQ1R5cGVzLkNsYXNzVHkgJiYKKyAgICAgICAgICJGb3J3YXJkIG1ldGFjbGFzcyByZWZlcmVuY2UgaGFzIGluY29ycmVjdCB0eXBlLiIpOworICBhc3NlcnRQcml2YXRlTmFtZShHVik7CisgIHJldHVybiBHVjsKIH0KIAogbGx2bTo6VmFsdWUgKkNHT2JqQ01hYzo6RW1pdFN1cGVyQ2xhc3NSZWYoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklEKSB7CiAgIHN0ZDo6c3RyaW5nIE5hbWUgPSAiXDAxTF9PQkpDX0NMQVNTXyIgKyBJRC0+Z2V0TmFtZUFzU3RyaW5nKCk7Ci0gIAotICBpZiAobGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWID0gQ0dNLmdldE1vZHVsZSgpLmdldEdsb2JhbFZhcmlhYmxlKE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpIHsKLSAgICBhc3NlcnQoR1YtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFR5cGUoKSA9PSBPYmpDVHlwZXMuQ2xhc3NUeSAmJgotICAgICAgICAgICAiRm9yd2FyZCBjbGFzcyBtZXRhZGF0YSByZWZlcmVuY2UgaGFzIGluY29ycmVjdCB0eXBlLiIpOwotICAgIHJldHVybiBHVjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKENHTS5nZXRNb2R1bGUoKSwgT2JqQ1R5cGVzLkNsYXNzVHksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lKTsKLSAgfQorICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YgPSBDR00uZ2V0TW9kdWxlKCkuZ2V0R2xvYmFsVmFyaWFibGUoTmFtZSwgdHJ1ZSk7CisKKyAgaWYgKCFHVikKKyAgICBHViA9IG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIE9iakNUeXBlcy5DbGFzc1R5LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2UsIDAsIE5hbWUpOworCisgIGFzc2VydChHVi0+Z2V0VHlwZSgpLT5nZXRFbGVtZW50VHlwZSgpID09IE9iakNUeXBlcy5DbGFzc1R5ICYmCisgICAgICAgICAiRm9yd2FyZCBjbGFzcyBtZXRhZGF0YSByZWZlcmVuY2UgaGFzIGluY29ycmVjdCB0eXBlLiIpOworICBhc3NlcnRQcml2YXRlTmFtZShHVik7CisgIHJldHVybiBHVjsKIH0KIAogLyoKQEAgLTM0MzAsMTMgKzM0MDIsMTQgQEAKICAgbGx2bTo6VHlwZSAqVHkgPSBJbml0LT5nZXRUeXBlKCk7CiAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpHViA9CiAgICAgbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKENHTS5nZXRNb2R1bGUoKSwgVHksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLCBJbml0LCBOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OlByaXZhdGVMaW5rYWdlLCBJbml0LCBOYW1lKTsKKyAgYXNzZXJ0UHJpdmF0ZU5hbWUoR1YpOwogICBpZiAoU2VjdGlvbikKICAgICBHVi0+c2V0U2VjdGlvbihTZWN0aW9uKTsKICAgaWYgKEFsaWduKQogICAgIEdWLT5zZXRBbGlnbm1lbnQoQWxpZ24pOwogICBpZiAoQWRkVG9Vc2VkKQotICAgIENHTS5BZGRVc2VkR2xvYmFsKEdWKTsKKyAgICBDR00uYWRkQ29tcGlsZXJVc2VkR2xvYmFsKEdWKTsKICAgcmV0dXJuIEdWOwogfQogCkBAIC0zNTAxLDcgKzM0NzQsNyBAQAogICAgICAgOiBTKCpTKSwgU3luY0FyZ1Nsb3QoU3luY0FyZ1Nsb3QpLCBDYWxsVHJ5RXhpdFZhcihDYWxsVHJ5RXhpdFZhciksCiAgICAgICAgIEV4Y2VwdGlvbkRhdGEoRXhjZXB0aW9uRGF0YSksIE9iakNUeXBlcygqT2JqQ1R5cGVzKSB7fQogCi0gICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgeworICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIG92ZXJyaWRlIHsKICAgICAgIC8vIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBjYWxsIG9iamNfZXhjZXB0aW9uX3RyeV9leGl0LgogICAgICAgLy8gSW4gb3B0aW1pemVkIGNvZGUsIHRoaXMgYnJhbmNoIHdpbGwgYWx3YXlzIGJlIGZvbGRlZC4KICAgICAgIGxsdm06OkJhc2ljQmxvY2sgKkZpbmFsbHlDYWxsRXhpdCA9CkBAIC00MjkzLDE0ICs0MjY2LDE0IEBACiAvLy8gICB1bnNpZ25lZCBmbGFnczsKIC8vLyB9OwogZW51bSBJbWFnZUluZm9GbGFncyB7Ci0gIGVJbWFnZUluZm9fRml4QW5kQ29udGludWUgICAgICA9ICgxIDw8IDApLAorICBlSW1hZ2VJbmZvX0ZpeEFuZENvbnRpbnVlICAgICAgPSAoMSA8PCAwKSwgLy8gVGhpcyBmbGFnIGlzIG5vIGxvbmdlciBzZXQgYnkgY2xhbmcuCiAgIGVJbWFnZUluZm9fR2FyYmFnZUNvbGxlY3RlZCAgICA9ICgxIDw8IDEpLAogICBlSW1hZ2VJbmZvX0dDT25seSAgICAgICAgICAgICAgPSAoMSA8PCAyKSwKLSAgZUltYWdlSW5mb19PcHRpbWl6ZWRCeUR5bGQgICAgID0gKDEgPDwgMyksIC8vIEZJWE1FOiBXaGVuIGlzIHRoaXMgc2V0LgorICBlSW1hZ2VJbmZvX09wdGltaXplZEJ5RHlsZCAgICAgPSAoMSA8PCAzKSwgLy8gVGhpcyBmbGFnIGlzIHNldCBieSB0aGUgZHlsZCBzaGFyZWQgY2FjaGUuCiAKICAgLy8gQSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgbW9kdWxlIGhhcyBubyBpbnN0YW5jZXMgb2YgYSBAc3ludGhlc2l6ZSBvZiBhCiAgIC8vIHN1cGVyY2xhc3MgdmFyaWFibGUuIDxyZGFyOi8vcHJvYmxlbS82ODAzMjQyPgotICBlSW1hZ2VJbmZvX0NvcnJlY3RlZFN5bnRoZXNpemUgPSAoMSA8PCA0KSwKKyAgZUltYWdlSW5mb19Db3JyZWN0ZWRTeW50aGVzaXplID0gKDEgPDwgNCksIC8vIFRoaXMgZmxhZyBpcyBubyBsb25nZXIgc2V0IGJ5IGNsYW5nLgogICBlSW1hZ2VJbmZvX0ltYWdlSXNTaW11bGF0ZWQgICAgPSAoMSA8PCA1KQogfTsKIApAQCAtNDM5OSw5ICs0MzcyLDE3IEBACiAgIC8vIFRoZSBydW50aW1lIGV4cGVjdHMgZXhhY3RseSB0aGUgbGlzdCBvZiBkZWZpbmVkIGNsYXNzZXMgZm9sbG93ZWQKICAgLy8gYnkgdGhlIGxpc3Qgb2YgZGVmaW5lZCBjYXRlZ29yaWVzLCBpbiBhIHNpbmdsZSBhcnJheS4KICAgU21hbGxWZWN0b3I8bGx2bTo6Q29uc3RhbnQqLCA4PiBTeW1ib2xzKE51bUNsYXNzZXMgKyBOdW1DYXRlZ29yaWVzKTsKLSAgZm9yICh1bnNpZ25lZCBpPTA7IGk8TnVtQ2xhc3NlczsgaSsrKQorICBmb3IgKHVuc2lnbmVkIGk9MDsgaTxOdW1DbGFzc2VzOyBpKyspIHsKKyAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUQgPSBJbXBsZW1lbnRlZENsYXNzZXNbaV07CisgICAgYXNzZXJ0KElEKTsKKyAgICBpZiAoT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSU1QID0gSUQtPmdldEltcGxlbWVudGF0aW9uKCkpCisgICAgICAvLyBXZSBhcmUgaW1wbGVtZW50aW5nIGEgd2VhayBpbXBvcnRlZCBpbnRlcmZhY2UuIEdpdmUgaXQgZXh0ZXJuYWwgbGlua2FnZQorICAgICAgaWYgKElELT5pc1dlYWtJbXBvcnRlZCgpICYmICFJTVAtPmlzV2Vha0ltcG9ydGVkKCkpCisgICAgICAgIERlZmluZWRDbGFzc2VzW2ldLT5zZXRMaW5rYWdlKGxsdm06Okdsb2JhbFZhcmlhYmxlOjpFeHRlcm5hbExpbmthZ2UpOworICAgIAogICAgIFN5bWJvbHNbaV0gPSBsbHZtOjpDb25zdGFudEV4cHI6OmdldEJpdENhc3QoRGVmaW5lZENsYXNzZXNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDVHlwZXMuSW50OFB0clR5KTsKKyAgfQogICBmb3IgKHVuc2lnbmVkIGk9MDsgaTxOdW1DYXRlZ29yaWVzOyBpKyspCiAgICAgU3ltYm9sc1tOdW1DbGFzc2VzICsgaV0gPQogICAgICAgbGx2bTo6Q29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KERlZmluZWRDYXRlZ29yaWVzW2ldLApAQCAtNDUwNywxMCArNDQ4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZIYXNVbmlvbikgewogICBjb25zdCBSZWNvcmREZWNsICpSRCA9IFJULT5nZXREZWNsKCk7CiAgIC8vIEZJWE1FIC0gVXNlIGl0ZXJhdG9yLgotICBTbWFsbFZlY3Rvcjxjb25zdCBGaWVsZERlY2wqLCAxNj4gRmllbGRzOwotICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIGkgPSBSRC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gUkQtPmZpZWxkX2VuZCgpOyBpICE9IGU7ICsraSkKLSAgICBGaWVsZHMucHVzaF9iYWNrKCppKTsKKyAgU21hbGxWZWN0b3I8Y29uc3QgRmllbGREZWNsKiwgMTY+IEZpZWxkcyhSRC0+ZmllbGRzKCkpOwogICBsbHZtOjpUeXBlICpUeSA9IENHTS5nZXRUeXBlcygpLkNvbnZlcnRUeXBlKFF1YWxUeXBlKFJULCAwKSk7CiAgIGNvbnN0IGxsdm06OlN0cnVjdExheW91dCAqUmVjTGF5b3V0ID0KICAgICBDR00uZ2V0RGF0YUxheW91dCgpLmdldFN0cnVjdExheW91dChjYXN0PGxsdm06OlN0cnVjdFR5cGU+KFR5KSk7CkBAIC00NTg5LDkgKzQ1NjcsNiBAQAogICAgICAgICBFbENvdW50ICo9IENBcnJheS0+Z2V0U2l6ZSgpLmdldFpFeHRWYWx1ZSgpOwogICAgICAgICBGUVQgPSBDQXJyYXktPmdldEVsZW1lbnRUeXBlKCk7CiAgICAgICB9Ci0KLSAgICAgIGFzc2VydCghRlFULT5pc1VuaW9uVHlwZSgpICYmCi0gICAgICAgICAgICAgImxheW91dCBmb3IgYXJyYXkgb2YgdW5pb25zIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgIGlmIChGUVQtPmlzUmVjb3JkVHlwZSgpICYmIEVsQ291bnQpIHsKICAgICAgICAgaW50IE9sZEluZGV4ID0gSXZhcnNJbmZvLnNpemUoKSAtIDE7CiAgICAgICAgIGludCBPbGRTa0luZGV4ID0gU2tpcEl2YXJzLnNpemUoKSAtMTsKQEAgLTQ5OTYsMTAgKzQ5NzEsMTAgQEAKICAgICBWYWx1ZXNbMl0gPSBsbHZtOjpDb25zdGFudDo6Z2V0TnVsbFZhbHVlKE9iakNUeXBlcy5Qcm90b2NvbExpc3RQdHJUeSk7CiAgICAgVmFsdWVzWzNdID0gVmFsdWVzWzRdID0KICAgICAgIGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoT2JqQ1R5cGVzLk1ldGhvZERlc2NyaXB0aW9uTGlzdFB0clR5KTsKLSAgICBJLT5zZWNvbmQtPnNldExpbmthZ2UobGx2bTo6R2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSk7CisgICAgYXNzZXJ0UHJpdmF0ZU5hbWUoSS0+c2Vjb25kKTsKICAgICBJLT5zZWNvbmQtPnNldEluaXRpYWxpemVyKGxsdm06OkNvbnN0YW50U3RydWN0OjpnZXQoT2JqQ1R5cGVzLlByb3RvY29sVHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcykpOwotICAgIENHTS5BZGRVc2VkR2xvYmFsKEktPnNlY29uZCk7CisgICAgQ0dNLmFkZENvbXBpbGVyVXNlZEdsb2JhbChJLT5zZWNvbmQpOwogICB9CiAKICAgLy8gQWRkIGFzc2VtYmxlciBkaXJlY3RpdmVzIHRvIGFkZCBsYXp5IHVuZGVmaW5lZCBzeW1ib2wgcmVmZXJlbmNlcwpAQCAtNTA1NCw2ICs1MDI5LDEzIEBACiAgIEludDhQdHJUeSA9IENHTS5JbnQ4UHRyVHk7CiAgIEludDhQdHJQdHJUeSA9IENHTS5JbnQ4UHRyUHRyVHk7CiAKKyAgLy8gYXJtNjQgdGFyZ2V0cyB1c2UgImludCIgaXZhciBvZmZzZXQgdmFyaWFibGVzLiBBbGwgb3RoZXJzLAorICAvLyBpbmNsdWRpbmcgT1MgWCB4ODZfNjQgYW5kIFdpbmRvd3MgeDg2XzY0LCB1c2UgImxvbmciIGl2YXIgb2Zmc2V0cy4KKyAgaWYgKENHTS5nZXRUYXJnZXQoKS5nZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm02NCkKKyAgICBJdmFyT2Zmc2V0VmFyVHkgPSBJbnRUeTsKKyAgZWxzZQorICAgIEl2YXJPZmZzZXRWYXJUeSA9IExvbmdUeTsKKwogICBPYmplY3RQdHJUeSA9IFR5cGVzLkNvbnZlcnRUeXBlKEN0eC5nZXRPYmpDSWRUeXBlKCkpOwogICBQdHJPYmplY3RQdHJUeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoT2JqZWN0UHRyVHkpOwogICBTZWxlY3RvclB0clR5ID0gVHlwZXMuQ29udmVydFR5cGUoQ3R4LmdldE9iakNTZWxUeXBlKCkpOwpAQCAtNTM1NywxNiArNTMzOSwxNSBAQAogICBQcm90b2NvbExpc3RuZkFCSVB0clR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChQcm90b2NvbExpc3RuZkFCSVR5KTsKIAogICAvLyBzdHJ1Y3QgX2l2YXJfdCB7Ci0gIC8vICAgdW5zaWduZWQgbG9uZyBpbnQgKm9mZnNldDsgIC8vIHBvaW50ZXIgdG8gaXZhciBvZmZzZXQgbG9jYXRpb24KKyAgLy8gICB1bnNpZ25lZCBbbG9uZ10gaW50ICpvZmZzZXQ7ICAvLyBwb2ludGVyIHRvIGl2YXIgb2Zmc2V0IGxvY2F0aW9uCiAgIC8vICAgY2hhciAqbmFtZTsKICAgLy8gICBjaGFyICp0eXBlOwogICAvLyAgIHVpbnQzMl90IGFsaWdubWVudDsKICAgLy8gICB1aW50MzJfdCBzaXplOwogICAvLyB9Ci0gIEl2YXJuZkFCSVR5ID0KLSAgICBsbHZtOjpTdHJ1Y3RUeXBlOjpjcmVhdGUoInN0cnVjdC5faXZhcl90IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChMb25nVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQ4UHRyVHksIEludDhQdHJUeSwgSW50VHksIEludFR5LCBOVUxMKTsKKyAgSXZhcm5mQUJJVHkgPSBsbHZtOjpTdHJ1Y3RUeXBlOjpjcmVhdGUoCisgICAgICAic3RydWN0Ll9pdmFyX3QiLCBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKEl2YXJPZmZzZXRWYXJUeSksCisgICAgICBJbnQ4UHRyVHksIEludDhQdHJUeSwgSW50VHksIEludFR5LCBOVUxMKTsKIAogICAvLyBzdHJ1Y3QgX2l2YXJfbGlzdF90IHsKICAgLy8gICB1aW50MzIgZW50c2l6ZTsgIC8vIHNpemVvZihzdHJ1Y3QgX2l2YXJfdCkKQEAgLTU1MjEsMTIgKzU1MDIsMTMgQEAKIAogICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YgPQogICAgIG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIEluaXQtPmdldFR5cGUoKSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpQcml2YXRlTGlua2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sTmFtZSk7CisgIGFzc2VydFByaXZhdGVOYW1lKEdWKTsKICAgR1YtPnNldEFsaWdubWVudChDR00uZ2V0RGF0YUxheW91dCgpLmdldEFCSVR5cGVBbGlnbm1lbnQoSW5pdC0+Z2V0VHlwZSgpKSk7CiAgIEdWLT5zZXRTZWN0aW9uKFNlY3Rpb25OYW1lKTsKLSAgQ0dNLkFkZFVzZWRHbG9iYWwoR1YpOworICBDR00uYWRkQ29tcGlsZXJVc2VkR2xvYmFsKEdWKTsKIH0KIAogdm9pZCBDR09iakNOb25GcmFnaWxlQUJJTWFjOjpGaW5pc2hOb25GcmFnaWxlQUJJTW9kdWxlKCkgewpAQCAtNTUzNCwyNCArNTUxNiwyMCBAQAogCiAgIC8vIEJ1aWxkIGxpc3Qgb2YgYWxsIGltcGxlbWVudGVkIGNsYXNzIGFkZHJlc3NlcyBpbiBhcnJheQogICAvLyBMX09CSkNfTEFCRUxfQ0xBU1NfJC4KKworICBmb3IgKHVuc2lnbmVkIGk9MCwgTnVtQ2xhc3Nlcz1JbXBsZW1lbnRlZENsYXNzZXMuc2l6ZSgpOyBpPE51bUNsYXNzZXM7IGkrKykgeworICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRCA9IEltcGxlbWVudGVkQ2xhc3Nlc1tpXTsKKyAgICBhc3NlcnQoSUQpOworICAgIGlmIChPYmpDSW1wbGVtZW50YXRpb25EZWNsICpJTVAgPSBJRC0+Z2V0SW1wbGVtZW50YXRpb24oKSkKKyAgICAgIC8vIFdlIGFyZSBpbXBsZW1lbnRpbmcgYSB3ZWFrIGltcG9ydGVkIGludGVyZmFjZS4gR2l2ZSBpdCBleHRlcm5hbCBsaW5rYWdlCisgICAgICBpZiAoSUQtPmlzV2Vha0ltcG9ydGVkKCkgJiYgIUlNUC0+aXNXZWFrSW1wb3J0ZWQoKSkKKyAgICAgICAgRGVmaW5lZENsYXNzZXNbaV0tPnNldExpbmthZ2UobGx2bTo6R2xvYmFsVmFyaWFibGU6OkV4dGVybmFsTGlua2FnZSk7CisgIH0KKyAgCiAgIEFkZE1vZHVsZUNsYXNzTGlzdChEZWZpbmVkQ2xhc3NlcywKICAgICAgICAgICAgICAgICAgICAgICJcMDFMX09CSkNfTEFCRUxfQ0xBU1NfJCIsCiAgICAgICAgICAgICAgICAgICAgICAiX19EQVRBLCBfX29iamNfY2xhc3NsaXN0LCByZWd1bGFyLCBub19kZWFkX3N0cmlwIik7Ci0gIAotICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRGVmaW5lZENsYXNzZXMuc2l6ZSgpOyBpIDwgZTsgaSsrKSB7Ci0gICAgbGx2bTo6R2xvYmFsVmFsdWUgKklNUExHViA9IERlZmluZWRDbGFzc2VzW2ldOwotICAgIGlmIChJTVBMR1YtPmdldExpbmthZ2UoKSAhPSBsbHZtOjpHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxXZWFrTGlua2FnZSkKLSAgICAgIGNvbnRpbnVlOwotICAgIElNUExHVi0+c2V0TGlua2FnZShsbHZtOjpHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlKTsKLSAgfQotICAKLSAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IERlZmluZWRNZXRhQ2xhc3Nlcy5zaXplKCk7IGkgPCBlOyBpKyspIHsKLSAgICBsbHZtOjpHbG9iYWxWYWx1ZSAqSU1QTEdWID0gRGVmaW5lZE1ldGFDbGFzc2VzW2ldOwotICAgIGlmIChJTVBMR1YtPmdldExpbmthZ2UoKSAhPSBsbHZtOjpHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxXZWFrTGlua2FnZSkKLSAgICAgIGNvbnRpbnVlOwotICAgIElNUExHVi0+c2V0TGlua2FnZShsbHZtOjpHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlKTsKLSAgfSAgICAKLSAgCisKICAgQWRkTW9kdWxlQ2xhc3NMaXN0KERlZmluZWROb25MYXp5Q2xhc3NlcywKICAgICAgICAgICAgICAgICAgICAgICJcMDFMX09CSkNfTEFCRUxfTk9OTEFaWV9DTEFTU18kIiwKICAgICAgICAgICAgICAgICAgICAgICJfX0RBVEEsIF9fb2JqY19ubGNsc2xpc3QsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiKTsKQEAgLTU2NjksMjIgKzU2NDcsMTYgQEAKICAgc3RkOjpzdHJpbmcgTWV0aG9kTGlzdE5hbWUoIlwwMWxfT0JKQ18kXyIpOwogICBpZiAoZmxhZ3MgJiBOb25GcmFnaWxlQUJJX0NsYXNzX01ldGEpIHsKICAgICBNZXRob2RMaXN0TmFtZSArPSAiQ0xBU1NfTUVUSE9EU18iICsgSUQtPmdldE5hbWVBc1N0cmluZygpOwotICAgIGZvciAoT2JqQ0ltcGxlbWVudGF0aW9uRGVjbDo6Y2xhc3NtZXRoX2l0ZXJhdG9yCi0gICAgICAgICAgIGkgPSBJRC0+Y2xhc3NtZXRoX2JlZ2luKCksIGUgPSBJRC0+Y2xhc3NtZXRoX2VuZCgpOyBpICE9IGU7ICsraSkgeworICAgIGZvciAoY29uc3QgYXV0byAqSSA6IElELT5jbGFzc19tZXRob2RzKCkpCiAgICAgICAvLyBDbGFzcyBtZXRob2RzIHNob3VsZCBhbHdheXMgYmUgZGVmaW5lZC4KLSAgICAgIE1ldGhvZHMucHVzaF9iYWNrKEdldE1ldGhvZENvbnN0YW50KCppKSk7Ci0gICAgfQorICAgICAgTWV0aG9kcy5wdXNoX2JhY2soR2V0TWV0aG9kQ29uc3RhbnQoSSkpOwogICB9IGVsc2UgewogICAgIE1ldGhvZExpc3ROYW1lICs9ICJJTlNUQU5DRV9NRVRIT0RTXyIgKyBJRC0+Z2V0TmFtZUFzU3RyaW5nKCk7Ci0gICAgZm9yIChPYmpDSW1wbGVtZW50YXRpb25EZWNsOjppbnN0bWV0aF9pdGVyYXRvcgotICAgICAgICAgICBpID0gSUQtPmluc3RtZXRoX2JlZ2luKCksIGUgPSBJRC0+aW5zdG1ldGhfZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgZm9yIChjb25zdCBhdXRvICpJIDogSUQtPmluc3RhbmNlX21ldGhvZHMoKSkKICAgICAgIC8vIEluc3RhbmNlIG1ldGhvZHMgc2hvdWxkIGFsd2F5cyBiZSBkZWZpbmVkLgotICAgICAgTWV0aG9kcy5wdXNoX2JhY2soR2V0TWV0aG9kQ29uc3RhbnQoKmkpKTsKLSAgICB9Ci0gICAgZm9yIChPYmpDSW1wbGVtZW50YXRpb25EZWNsOjpwcm9waW1wbF9pdGVyYXRvcgotICAgICAgICAgICBpID0gSUQtPnByb3BpbXBsX2JlZ2luKCksIGUgPSBJRC0+cHJvcGltcGxfZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgICBPYmpDUHJvcGVydHlJbXBsRGVjbCAqUElEID0gKmk7CisgICAgICBNZXRob2RzLnB1c2hfYmFjayhHZXRNZXRob2RDb25zdGFudChJKSk7CiAKKyAgICBmb3IgKGNvbnN0IGF1dG8gKlBJRCA6IElELT5wcm9wZXJ0eV9pbXBscygpKSB7CiAgICAgICBpZiAoUElELT5nZXRQcm9wZXJ0eUltcGxlbWVudGF0aW9uKCkgPT0gT2JqQ1Byb3BlcnR5SW1wbERlY2w6OlN5bnRoZXNpemUpewogICAgICAgICBPYmpDUHJvcGVydHlEZWNsICpQRCA9IFBJRC0+Z2V0UHJvcGVydHlEZWNsKCk7CiAKQEAgLTU3MjEsMTEgKzU2OTMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyk7CiAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpDTEFTU19ST19HViA9CiAgICAgbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKENHTS5nZXRNb2R1bGUoKSwgT2JqQ1R5cGVzLkNsYXNzUm9uZkFCSVR5LCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OlByaXZhdGVMaW5rYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBOb25GcmFnaWxlQUJJX0NsYXNzX01ldGEpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoIlwwMWxfT0JKQ19NRVRBQ0xBU1NfUk9fJF8iKStDbGFzc05hbWUgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygiXDAxbF9PQkpDX0NMQVNTX1JPXyRfIikrQ2xhc3NOYW1lKTsKKyAgYXNzZXJ0UHJpdmF0ZU5hbWUoQ0xBU1NfUk9fR1YpOwogICBDTEFTU19ST19HVi0+c2V0QWxpZ25tZW50KAogICAgIENHTS5nZXREYXRhTGF5b3V0KCkuZ2V0QUJJVHlwZUFsaWdubWVudChPYmpDVHlwZXMuQ2xhc3NSb25mQUJJVHkpKTsKICAgQ0xBU1NfUk9fR1YtPnNldFNlY3Rpb24oIl9fREFUQSwgX19vYmpjX2NvbnN0Iik7CkBAIC01NzQzLDEyICs1NzE2LDkgQEAKIC8vLyAgIHN0cnVjdCBjbGFzc19yb190ICpybzsKIC8vLyB9CiAvLy8KLWxsdm06Okdsb2JhbFZhcmlhYmxlICogQ0dPYmpDTm9uRnJhZ2lsZUFCSU1hYzo6QnVpbGRDbGFzc01ldGFEYXRhKAotICBzdGQ6OnN0cmluZyAmQ2xhc3NOYW1lLAotICBsbHZtOjpDb25zdGFudCAqSXNBR1YsCi0gIGxsdm06OkNvbnN0YW50ICpTdXBlckNsYXNzR1YsCi0gIGxsdm06OkNvbnN0YW50ICpDbGFzc1JvR1YsCi0gIGJvb2wgSGlkZGVuVmlzaWJpbGl0eSkgeworbGx2bTo6R2xvYmFsVmFyaWFibGUgKkNHT2JqQ05vbkZyYWdpbGVBQklNYWM6OkJ1aWxkQ2xhc3NNZXRhRGF0YSgKKyAgICBzdGQ6OnN0cmluZyAmQ2xhc3NOYW1lLCBsbHZtOjpDb25zdGFudCAqSXNBR1YsIGxsdm06OkNvbnN0YW50ICpTdXBlckNsYXNzR1YsCisgICAgbGx2bTo6Q29uc3RhbnQgKkNsYXNzUm9HViwgYm9vbCBIaWRkZW5WaXNpYmlsaXR5LCBib29sIFdlYWspIHsKICAgbGx2bTo6Q29uc3RhbnQgKlZhbHVlc1tdID0gewogICAgIElzQUdWLAogICAgIFN1cGVyQ2xhc3NHViwKQEAgLTU3NjMsNyArNTczMyw3IEBACiAgICAgICAgICAgICAgICAgICBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKE9iakNUeXBlcy5JbXBuZkFCSVR5KSk7CiAgIGxsdm06OkNvbnN0YW50ICpJbml0ID0gbGx2bTo6Q29uc3RhbnRTdHJ1Y3Q6OmdldChPYmpDVHlwZXMuQ2xhc3NuZkFCSVR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKTsKLSAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWID0gR2V0Q2xhc3NHbG9iYWwoQ2xhc3NOYW1lKTsKKyAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWID0gR2V0Q2xhc3NHbG9iYWwoQ2xhc3NOYW1lLCBXZWFrKTsKICAgR1YtPnNldEluaXRpYWxpemVyKEluaXQpOwogICBHVi0+c2V0U2VjdGlvbigiX19EQVRBLCBfX29iamNfZGF0YSIpOwogICBHVi0+c2V0QWxpZ25tZW50KApAQCAtNTg0OSwzMSArNTgxOSwzNyBAQAogICBpZiAoIUlELT5nZXRDbGFzc0ludGVyZmFjZSgpLT5nZXRTdXBlckNsYXNzKCkpIHsKICAgICAvLyBjbGFzcyBpcyByb290CiAgICAgZmxhZ3MgfD0gTm9uRnJhZ2lsZUFCSV9DbGFzc19Sb290OwotICAgIFN1cGVyQ2xhc3NHViA9IEdldENsYXNzR2xvYmFsKE9iakNDbGFzc05hbWUgKyBDbGFzc05hbWUpOwotICAgIElzQUdWID0gR2V0Q2xhc3NHbG9iYWwoT2JqQ01ldGFDbGFzc05hbWUgKyBDbGFzc05hbWUpOworICAgIFN1cGVyQ2xhc3NHViA9IEdldENsYXNzR2xvYmFsKE9iakNDbGFzc05hbWUgKyBDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQtPmdldENsYXNzSW50ZXJmYWNlKCktPmlzV2Vha0ltcG9ydGVkKCkpOworICAgIElzQUdWID0gR2V0Q2xhc3NHbG9iYWwoT2JqQ01ldGFDbGFzc05hbWUgKyBDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKS0+aXNXZWFrSW1wb3J0ZWQoKSk7CisKKyAgICAvLyBXZSBhcmUgaW1wbGVtZW50aW5nIGEgd2VhayBpbXBvcnRlZCBpbnRlcmZhY2UuIEdpdmUgaXQgZXh0ZXJuYWwKKyAgICAvLyBsaW5rYWdlLgorICAgIGlmICghSUQtPmlzV2Vha0ltcG9ydGVkKCkgJiYgSUQtPmdldENsYXNzSW50ZXJmYWNlKCktPmlzV2Vha0ltcG9ydGVkKCkpCisgICAgICBJc0FHVi0+c2V0TGlua2FnZShsbHZtOjpHbG9iYWxWYXJpYWJsZTo6RXh0ZXJuYWxMaW5rYWdlKTsKICAgfSBlbHNlIHsKICAgICAvLyBIYXMgYSByb290LiBDdXJyZW50IGNsYXNzIGlzIG5vdCBhIHJvb3QuCiAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKlJvb3QgPSBJRC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKTsKICAgICB3aGlsZSAoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKlN1cGVyID0gUm9vdC0+Z2V0U3VwZXJDbGFzcygpKQogICAgICAgUm9vdCA9IFN1cGVyOwotICAgIElzQUdWID0gR2V0Q2xhc3NHbG9iYWwoT2JqQ01ldGFDbGFzc05hbWUgKyBSb290LT5nZXROYW1lQXNTdHJpbmcoKSk7Ci0gICAgaWYgKFJvb3QtPmlzV2Vha0ltcG9ydGVkKCkpCi0gICAgICBJc0FHVi0+c2V0TGlua2FnZShsbHZtOjpHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxXZWFrTGlua2FnZSk7CisgICAgSXNBR1YgPSBHZXRDbGFzc0dsb2JhbChPYmpDTWV0YUNsYXNzTmFtZSArIFJvb3QtPmdldE5hbWVBc1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9vdC0+aXNXZWFrSW1wb3J0ZWQoKSk7CiAgICAgLy8gd29yayBvbiBzdXBlciBjbGFzcyBtZXRhZGF0YSBzeW1ib2wuCiAgICAgc3RkOjpzdHJpbmcgU3VwZXJDbGFzc05hbWUgPQogICAgICAgT2JqQ01ldGFDbGFzc05hbWUgKyAKICAgICAgICAgSUQtPmdldENsYXNzSW50ZXJmYWNlKCktPmdldFN1cGVyQ2xhc3MoKS0+Z2V0TmFtZUFzU3RyaW5nKCk7Ci0gICAgU3VwZXJDbGFzc0dWID0gR2V0Q2xhc3NHbG9iYWwoU3VwZXJDbGFzc05hbWUpOwotICAgIGlmIChJRC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKS0+Z2V0U3VwZXJDbGFzcygpLT5pc1dlYWtJbXBvcnRlZCgpKQotICAgICAgU3VwZXJDbGFzc0dWLT5zZXRMaW5rYWdlKGxsdm06Okdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlKTsKKyAgICBTdXBlckNsYXNzR1YgPSBHZXRDbGFzc0dsb2JhbCgKKyAgICAgICAgU3VwZXJDbGFzc05hbWUsCisgICAgICAgIElELT5nZXRDbGFzc0ludGVyZmFjZSgpLT5nZXRTdXBlckNsYXNzKCktPmlzV2Vha0ltcG9ydGVkKCkpOwogICB9CiAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpDTEFTU19ST19HViA9IEJ1aWxkQ2xhc3NSb1RJbml0aWFsaXplcihmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbmNlU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW5jZVNpemUsSUQpOwogICBzdGQ6OnN0cmluZyBUQ2xhc3NOYW1lID0gT2JqQ01ldGFDbGFzc05hbWUgKyBDbGFzc05hbWU7Ci0gIGxsdm06Okdsb2JhbFZhcmlhYmxlICpNZXRhVENsYXNzID0KLSAgICBCdWlsZENsYXNzTWV0YURhdGEoVENsYXNzTmFtZSwgSXNBR1YsIFN1cGVyQ2xhc3NHViwgQ0xBU1NfUk9fR1YsCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzSXNIaWRkZW4pOworICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqTWV0YVRDbGFzcyA9IEJ1aWxkQ2xhc3NNZXRhRGF0YSgKKyAgICAgIFRDbGFzc05hbWUsIElzQUdWLCBTdXBlckNsYXNzR1YsIENMQVNTX1JPX0dWLCBjbGFzc0lzSGlkZGVuLAorICAgICAgSUQtPmlzV2Vha0ltcG9ydGVkKCkpOwogICBEZWZpbmVkTWV0YUNsYXNzZXMucHVzaF9iYWNrKE1ldGFUQ2xhc3MpOwogCiAgIC8vIE1ldGFkYXRhIGZvciB0aGUgY2xhc3MKQEAgLTU5MDQsOSArNTg4MCw5IEBACiAgICAgLy8gSGFzIGEgcm9vdC4gQ3VycmVudCBjbGFzcyBpcyBub3QgYSByb290LgogICAgIHN0ZDo6c3RyaW5nIFJvb3RDbGFzc05hbWUgPQogICAgICAgSUQtPmdldENsYXNzSW50ZXJmYWNlKCktPmdldFN1cGVyQ2xhc3MoKS0+Z2V0TmFtZUFzU3RyaW5nKCk7Ci0gICAgU3VwZXJDbGFzc0dWID0gR2V0Q2xhc3NHbG9iYWwoT2JqQ0NsYXNzTmFtZSArIFJvb3RDbGFzc05hbWUpOwotICAgIGlmIChJRC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKS0+Z2V0U3VwZXJDbGFzcygpLT5pc1dlYWtJbXBvcnRlZCgpKQotICAgICAgU3VwZXJDbGFzc0dWLT5zZXRMaW5rYWdlKGxsdm06Okdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlKTsKKyAgICBTdXBlckNsYXNzR1YgPSBHZXRDbGFzc0dsb2JhbCgKKyAgICAgICAgT2JqQ0NsYXNzTmFtZSArIFJvb3RDbGFzc05hbWUsCisgICAgICAgIElELT5nZXRDbGFzc0ludGVyZmFjZSgpLT5nZXRTdXBlckNsYXNzKCktPmlzV2Vha0ltcG9ydGVkKCkpOwogICB9CiAgIEdldENsYXNzU2l6ZUluZm8oSUQsIEluc3RhbmNlU3RhcnQsIEluc3RhbmNlU2l6ZSk7CiAgIENMQVNTX1JPX0dWID0gQnVpbGRDbGFzc1JvVEluaXRpYWxpemVyKGZsYWdzLApAQCAtNTkxNyw4ICs1ODkzLDEwIEBACiAgIFRDbGFzc05hbWUgPSBPYmpDQ2xhc3NOYW1lICsgQ2xhc3NOYW1lOwogICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqQ2xhc3NNRCA9CiAgICAgQnVpbGRDbGFzc01ldGFEYXRhKFRDbGFzc05hbWUsIE1ldGFUQ2xhc3MsIFN1cGVyQ2xhc3NHViwgQ0xBU1NfUk9fR1YsCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzSXNIaWRkZW4pOworICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0lzSGlkZGVuLAorICAgICAgICAgICAgICAgICAgICAgICBJRC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKS0+aXNXZWFrSW1wb3J0ZWQoKSk7CiAgIERlZmluZWRDbGFzc2VzLnB1c2hfYmFjayhDbGFzc01EKTsKKyAgSW1wbGVtZW50ZWRDbGFzc2VzLnB1c2hfYmFjayhJRC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKSk7CiAKICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgY2xhc3MgaXMgYWxzbyAibm9uLWxhenkiLgogICBpZiAoSW1wbGVtZW50YXRpb25Jc05vbkxhenkoSUQpKQpAQCAtNTk2Myw3ICs1OTQxLDcgQEAKICAgICBQcm90b2NvbE5hbWUpOwogICBQVEdWLT5zZXRTZWN0aW9uKCJfX0RBVEEsIF9fb2JqY19wcm90b3JlZnMsIGNvYWxlc2NlZCwgbm9fZGVhZF9zdHJpcCIpOwogICBQVEdWLT5zZXRWaXNpYmlsaXR5KGxsdm06Okdsb2JhbFZhbHVlOjpIaWRkZW5WaXNpYmlsaXR5KTsKLSAgQ0dNLkFkZFVzZWRHbG9iYWwoUFRHVik7CisgIENHTS5hZGRDb21waWxlclVzZWRHbG9iYWwoUFRHVik7CiAgIHJldHVybiBDR0YuQnVpbGRlci5DcmVhdGVMb2FkKFBUR1YpOwogfQogCkBAIC01OTg4LDIxICs1OTY2LDE4IEBACiAgIGxsdm06OkNvbnN0YW50ICpWYWx1ZXNbNl07CiAgIFZhbHVlc1swXSA9IEdldENsYXNzTmFtZShPQ0QtPmdldElkZW50aWZpZXIoKSk7CiAgIC8vIG1ldGEtY2xhc3MgZW50cnkgc3ltYm9sCi0gIGxsdm06Okdsb2JhbFZhcmlhYmxlICpDbGFzc0dWID0gR2V0Q2xhc3NHbG9iYWwoRXh0Q2xhc3NOYW1lKTsKLSAgaWYgKEludGVyZmFjZS0+aXNXZWFrSW1wb3J0ZWQoKSkKLSAgICBDbGFzc0dWLT5zZXRMaW5rYWdlKGxsdm06Okdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlKTsKLSAgCisgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpDbGFzc0dWID0KKyAgICAgIEdldENsYXNzR2xvYmFsKEV4dENsYXNzTmFtZSwgSW50ZXJmYWNlLT5pc1dlYWtJbXBvcnRlZCgpKTsKKwogICBWYWx1ZXNbMV0gPSBDbGFzc0dWOwogICBzdGQ6OnZlY3RvcjxsbHZtOjpDb25zdGFudCo+IE1ldGhvZHM7CiAgIHN0ZDo6c3RyaW5nIE1ldGhvZExpc3ROYW1lKFByZWZpeCk7CiAgIE1ldGhvZExpc3ROYW1lICs9ICJJTlNUQU5DRV9NRVRIT0RTXyIgKyBJbnRlcmZhY2UtPmdldE5hbWVBc1N0cmluZygpICsKICAgICAiXyRfIiArIE9DRC0+Z2V0TmFtZUFzU3RyaW5nKCk7CiAKLSAgZm9yIChPYmpDQ2F0ZWdvcnlJbXBsRGVjbDo6aW5zdG1ldGhfaXRlcmF0b3IKLSAgICAgICAgIGkgPSBPQ0QtPmluc3RtZXRoX2JlZ2luKCksIGUgPSBPQ0QtPmluc3RtZXRoX2VuZCgpOyBpICE9IGU7ICsraSkgeworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBPQ0QtPmluc3RhbmNlX21ldGhvZHMoKSkKICAgICAvLyBJbnN0YW5jZSBtZXRob2RzIHNob3VsZCBhbHdheXMgYmUgZGVmaW5lZC4KLSAgICBNZXRob2RzLnB1c2hfYmFjayhHZXRNZXRob2RDb25zdGFudCgqaSkpOwotICB9CisgICAgTWV0aG9kcy5wdXNoX2JhY2soR2V0TWV0aG9kQ29uc3RhbnQoSSkpOwogCiAgIFZhbHVlc1syXSA9IEVtaXRNZXRob2RMaXN0KE1ldGhvZExpc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19EQVRBLCBfX29iamNfY29uc3QiLApAQCAtNjAxMiwxMSArNTk4Nyw5IEBACiAgIE1ldGhvZExpc3ROYW1lICs9ICJDTEFTU19NRVRIT0RTXyIgKyBJbnRlcmZhY2UtPmdldE5hbWVBc1N0cmluZygpICsgIl8kXyIgKwogICAgIE9DRC0+Z2V0TmFtZUFzU3RyaW5nKCk7CiAgIE1ldGhvZHMuY2xlYXIoKTsKLSAgZm9yIChPYmpDQ2F0ZWdvcnlJbXBsRGVjbDo6Y2xhc3NtZXRoX2l0ZXJhdG9yCi0gICAgICAgICBpID0gT0NELT5jbGFzc21ldGhfYmVnaW4oKSwgZSA9IE9DRC0+Y2xhc3NtZXRoX2VuZCgpOyBpICE9IGU7ICsraSkgeworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBPQ0QtPmNsYXNzX21ldGhvZHMoKSkKICAgICAvLyBDbGFzcyBtZXRob2RzIHNob3VsZCBhbHdheXMgYmUgZGVmaW5lZC4KLSAgICBNZXRob2RzLnB1c2hfYmFjayhHZXRNZXRob2RDb25zdGFudCgqaSkpOwotICB9CisgICAgTWV0aG9kcy5wdXNoX2JhY2soR2V0TWV0aG9kQ29uc3RhbnQoSSkpOwogCiAgIFZhbHVlc1szXSA9IEVtaXRNZXRob2RMaXN0KE1ldGhvZExpc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19EQVRBLCBfX29iamNfY29uc3QiLApAQCAtNjA0NSwxMyArNjAxOCwxNCBAQAogICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR0NBVFYKICAgICA9IG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIE9iakNUeXBlcy5DYXRlZ29yeW5mQUJJVHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRDYXROYW1lKTsKKyAgYXNzZXJ0UHJpdmF0ZU5hbWUoR0NBVFYpOwogICBHQ0FUVi0+c2V0QWxpZ25tZW50KAogICAgIENHTS5nZXREYXRhTGF5b3V0KCkuZ2V0QUJJVHlwZUFsaWdubWVudChPYmpDVHlwZXMuQ2F0ZWdvcnluZkFCSVR5KSk7CiAgIEdDQVRWLT5zZXRTZWN0aW9uKCJfX0RBVEEsIF9fb2JqY19jb25zdCIpOwotICBDR00uQWRkVXNlZEdsb2JhbChHQ0FUVik7CisgIENHTS5hZGRDb21waWxlclVzZWRHbG9iYWwoR0NBVFYpOwogICBEZWZpbmVkQ2F0ZWdvcmllcy5wdXNoX2JhY2soR0NBVFYpOwogCiAgIC8vIERldGVybWluZSBpZiB0aGlzIGNhdGVnb3J5IGlzIGFsc28gIm5vbi1sYXp5Ii4KQEAgLTYxMDcsMTAgKzYwODEsMTEgQEAKIAogICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YgPQogICAgIG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIEluaXQtPmdldFR5cGUoKSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsIEluaXQsIE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2UsIEluaXQsIE5hbWUpOworICBhc3NlcnRQcml2YXRlTmFtZShHVik7CiAgIEdWLT5zZXRBbGlnbm1lbnQoQ0dNLmdldERhdGFMYXlvdXQoKS5nZXRBQklUeXBlQWxpZ25tZW50KEluaXQtPmdldFR5cGUoKSkpOwogICBHVi0+c2V0U2VjdGlvbihTZWN0aW9uKTsKLSAgQ0dNLkFkZFVzZWRHbG9iYWwoR1YpOworICBDR00uYWRkQ29tcGlsZXJVc2VkR2xvYmFsKEdWKTsKICAgcmV0dXJuIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChHViwgT2JqQ1R5cGVzLk1ldGhvZExpc3RuZkFCSVB0clR5KTsKIH0KIApAQCAtNjEyNSwxMiArNjEwMCw5IEBACiAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpJdmFyT2Zmc2V0R1YgPQogICAgIENHTS5nZXRNb2R1bGUoKS5nZXRHbG9iYWxWYXJpYWJsZShOYW1lKTsKICAgaWYgKCFJdmFyT2Zmc2V0R1YpCi0gICAgSXZhck9mZnNldEdWID0KLSAgICAgIG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIE9iakNUeXBlcy5Mb25nVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUpOworICAgIEl2YXJPZmZzZXRHViA9IG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZSgKKyAgICAgICAgQ0dNLmdldE1vZHVsZSgpLCBPYmpDVHlwZXMuSXZhck9mZnNldFZhclR5LCBmYWxzZSwKKyAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwgMCwgTmFtZSk7CiAgIHJldHVybiBJdmFyT2Zmc2V0R1Y7CiB9CiAKQEAgLTYxMzksMTAgKzYxMTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJdmFyRGVjbCAqSXZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IE9mZnNldCkgewogICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqSXZhck9mZnNldEdWID0gT2JqQ0l2YXJPZmZzZXRWYXJpYWJsZShJRCwgSXZhcik7Ci0gIEl2YXJPZmZzZXRHVi0+c2V0SW5pdGlhbGl6ZXIobGx2bTo6Q29uc3RhbnRJbnQ6OmdldChPYmpDVHlwZXMuTG9uZ1R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0KSk7CisgIEl2YXJPZmZzZXRHVi0+c2V0SW5pdGlhbGl6ZXIoCisgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KE9iakNUeXBlcy5JdmFyT2Zmc2V0VmFyVHksIE9mZnNldCkpOwogICBJdmFyT2Zmc2V0R1YtPnNldEFsaWdubWVudCgKLSAgICBDR00uZ2V0RGF0YUxheW91dCgpLmdldEFCSVR5cGVBbGlnbm1lbnQoT2JqQ1R5cGVzLkxvbmdUeSkpOworICAgICAgQ0dNLmdldERhdGFMYXlvdXQoKS5nZXRBQklUeXBlQWxpZ25tZW50KE9iakNUeXBlcy5JdmFyT2Zmc2V0VmFyVHkpKTsKIAogICAvLyBGSVhNRTogVGhpcyBtYXRjaGVzIGdjYywgYnV0IHNob3VsZG4ndCB0aGUgdmlzaWJpbGl0eSBiZSBzZXQgb24gdGhlIHVzZSBhcwogICAvLyB3ZWxsIChpLmUuLCBpbiBPYmpDSXZhck9mZnNldFZhcmlhYmxlKS4KQEAgLTYxNjAsNyArNjEzMiw3IEBACiAvLy8gaW1wbGVtZW50YXRpb24uIFRoZSByZXR1cm4gdmFsdWUgaGFzIHR5cGUKIC8vLyBJdmFyTGlzdG5mQUJJUHRyVHkuCiAvLy8gIHN0cnVjdCBfaXZhcl90IHsKLS8vLyAgIHVuc2lnbmVkIGxvbmcgaW50ICpvZmZzZXQ7ICAvLyBwb2ludGVyIHRvIGl2YXIgb2Zmc2V0IGxvY2F0aW9uCisvLy8gICB1bnNpZ25lZCBbbG9uZ10gaW50ICpvZmZzZXQ7ICAvLyBwb2ludGVyIHRvIGl2YXIgb2Zmc2V0IGxvY2F0aW9uCiAvLy8gICBjaGFyICpuYW1lOwogLy8vICAgY2hhciAqdHlwZTsKIC8vLyAgIHVpbnQzMl90IGFsaWdubWVudDsKQEAgLTYyMjMsMTQgKzYxOTUsMTUgQEAKICAgY29uc3QgY2hhciAqUHJlZml4ID0gIlwwMWxfT0JKQ18kX0lOU1RBTkNFX1ZBUklBQkxFU18iOwogICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YgPQogICAgIG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIEluaXQtPmdldFR5cGUoKSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpQcml2YXRlTGlua2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ICsgT0lELT5nZXROYW1lKCkpOworICBhc3NlcnRQcml2YXRlTmFtZShHVik7CiAgIEdWLT5zZXRBbGlnbm1lbnQoCiAgICAgQ0dNLmdldERhdGFMYXlvdXQoKS5nZXRBQklUeXBlQWxpZ25tZW50KEluaXQtPmdldFR5cGUoKSkpOwogICBHVi0+c2V0U2VjdGlvbigiX19EQVRBLCBfX29iamNfY29uc3QiKTsKIAotICBDR00uQWRkVXNlZEdsb2JhbChHVik7CisgIENHTS5hZGRDb21waWxlclVzZWRHbG9iYWwoR1YpOwogICByZXR1cm4gbGx2bTo6Q29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KEdWLCBPYmpDVHlwZXMuSXZhckxpc3RuZkFCSVB0clR5KTsKIH0KIApAQCAtNjI0MywxMCArNjIxNiw5IEBACiAgICAgLy8gcmVmZXJlbmNlIG9yIG5vdC4gQXQgbW9kdWxlIGZpbmFsaXphdGlvbiB3ZSBhZGQgdGhlIGVtcHR5CiAgICAgLy8gY29udGVudHMgZm9yIHByb3RvY29scyB3aGljaCB3ZXJlIHJlZmVyZW5jZWQgYnV0IG5ldmVyIGRlZmluZWQuCiAgICAgRW50cnkgPQotICAgICAgbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKENHTS5nZXRNb2R1bGUoKSwgT2JqQ1R5cGVzLlByb3RvY29sbmZBQklUeSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcMDFsX09CSkNfUFJPVE9DT0xfJF8iICsgUEQtPmdldE5hbWUoKSk7CisgICAgICAgIG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIE9iakNUeXBlcy5Qcm90b2NvbG5mQUJJVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbGx2bTo6R2xvYmFsVmFsdWU6OldlYWtBbnlMaW5rYWdlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMWxfT0JKQ19QUk9UT0NPTF8kXyIgKyBQRC0+Z2V0TmFtZSgpKTsKICAgICBFbnRyeS0+c2V0U2VjdGlvbigiX19EQVRBLF9fZGF0YWNvYWxfbnQsY29hbGVzY2VkIik7CiAgIH0KIApAQCAtNjI4Nyw5ICs2MjU5LDcgQEAKICAgc3RkOjp2ZWN0b3I8bGx2bTo6Q29uc3RhbnQqPiBJbnN0YW5jZU1ldGhvZHMsIENsYXNzTWV0aG9kczsKICAgc3RkOjp2ZWN0b3I8bGx2bTo6Q29uc3RhbnQqPiBPcHRJbnN0YW5jZU1ldGhvZHMsIE9wdENsYXNzTWV0aG9kczsKICAgc3RkOjp2ZWN0b3I8bGx2bTo6Q29uc3RhbnQqPiBNZXRob2RUeXBlc0V4dCwgT3B0TWV0aG9kVHlwZXNFeHQ7Ci0gIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6aW5zdG1ldGhfaXRlcmF0b3IKLSAgICAgICAgIGkgPSBQRC0+aW5zdG1ldGhfYmVnaW4oKSwgZSA9IFBELT5pbnN0bWV0aF9lbmQoKTsgaSAhPSBlOyArK2kpIHsKLSAgICBPYmpDTWV0aG9kRGVjbCAqTUQgPSAqaTsKKyAgZm9yIChjb25zdCBhdXRvICpNRCA6IFBELT5pbnN0YW5jZV9tZXRob2RzKCkpIHsKICAgICBsbHZtOjpDb25zdGFudCAqQyA9IEdldE1ldGhvZERlc2NyaXB0aW9uQ29uc3RhbnQoTUQpOwogICAgIGlmICghQykKICAgICAgIHJldHVybiBHZXRPckVtaXRQcm90b2NvbFJlZihQRCk7CkBAIC02MzAzLDkgKzYyNzMsNyBAQAogICAgIH0KICAgfQogCi0gIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6Y2xhc3NtZXRoX2l0ZXJhdG9yCi0gICAgICAgICBpID0gUEQtPmNsYXNzbWV0aF9iZWdpbigpLCBlID0gUEQtPmNsYXNzbWV0aF9lbmQoKTsgaSAhPSBlOyArK2kpIHsKLSAgICBPYmpDTWV0aG9kRGVjbCAqTUQgPSAqaTsKKyAgZm9yIChjb25zdCBhdXRvICpNRCA6IFBELT5jbGFzc19tZXRob2RzKCkpIHsKICAgICBsbHZtOjpDb25zdGFudCAqQyA9IEdldE1ldGhvZERlc2NyaXB0aW9uQ29uc3RhbnQoTUQpOwogICAgIGlmICghQykKICAgICAgIHJldHVybiBHZXRPckVtaXRQcm90b2NvbFJlZihQRCk7CkBAIC02MzU5LDggKzYzMjcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzKTsKIAogICBpZiAoRW50cnkpIHsKLSAgICAvLyBBbHJlYWR5IGNyZWF0ZWQsIGZpeCB0aGUgbGlua2FnZSBhbmQgdXBkYXRlIHRoZSBpbml0aWFsaXplci4KLSAgICBFbnRyeS0+c2V0TGlua2FnZShsbHZtOjpHbG9iYWxWYWx1ZTo6V2Vha0FueUxpbmthZ2UpOworICAgIC8vIEFscmVhZHkgY3JlYXRlZCwgdXBkYXRlIHRoZSBpbml0aWFsaXplci4KKyAgICBhc3NlcnQoRW50cnktPmdldExpbmthZ2UoKSA9PSBsbHZtOjpHbG9iYWxWYWx1ZTo6V2Vha0FueUxpbmthZ2UpOwogICAgIEVudHJ5LT5zZXRJbml0aWFsaXplcihJbml0KTsKICAgfSBlbHNlIHsKICAgICBFbnRyeSA9CkBAIC02Mzc0LDcgKzYzNDIsNyBAQAogICAgIFByb3RvY29sc1tQRC0+Z2V0SWRlbnRpZmllcigpXSA9IEVudHJ5OwogICB9CiAgIEVudHJ5LT5zZXRWaXNpYmlsaXR5KGxsdm06Okdsb2JhbFZhbHVlOjpIaWRkZW5WaXNpYmlsaXR5KTsKLSAgQ0dNLkFkZFVzZWRHbG9iYWwoRW50cnkpOworICBDR00uYWRkQ29tcGlsZXJVc2VkR2xvYmFsKEVudHJ5KTsKIAogICAvLyBVc2UgdGhpcyBwcm90b2NvbCBtZXRhLWRhdGEgdG8gYnVpbGQgcHJvdG9jb2wgbGlzdCB0YWJsZSBpbiBzZWN0aW9uCiAgIC8vIF9fREFUQSwgX19vYmpjX3Byb3RvbGlzdApAQCAtNjM4Niw3ICs2MzU0LDcgQEAKICAgICBDR00uZ2V0RGF0YUxheW91dCgpLmdldEFCSVR5cGVBbGlnbm1lbnQoT2JqQ1R5cGVzLlByb3RvY29sbmZBQklQdHJUeSkpOwogICBQVEdWLT5zZXRTZWN0aW9uKCJfX0RBVEEsIF9fb2JqY19wcm90b2xpc3QsIGNvYWxlc2NlZCwgbm9fZGVhZF9zdHJpcCIpOwogICBQVEdWLT5zZXRWaXNpYmlsaXR5KGxsdm06Okdsb2JhbFZhbHVlOjpIaWRkZW5WaXNpYmlsaXR5KTsKLSAgQ0dNLkFkZFVzZWRHbG9iYWwoUFRHVik7CisgIENHTS5hZGRDb21waWxlclVzZWRHbG9iYWwoUFRHVik7CiAgIHJldHVybiBFbnRyeTsKIH0KIApAQCAtNjQzMywxMiArNjQwMSwxMyBAQAogCiAgIGxsdm06OkNvbnN0YW50ICpJbml0ID0gbGx2bTo6Q29uc3RhbnRTdHJ1Y3Q6OmdldEFub24oVmFsdWVzKTsKICAgR1YgPSBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoQ0dNLmdldE1vZHVsZSgpLCBJbml0LT5nZXRUeXBlKCksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXQsIE5hbWUpOworICBhc3NlcnRQcml2YXRlTmFtZShHVik7CiAgIEdWLT5zZXRTZWN0aW9uKCJfX0RBVEEsIF9fb2JqY19jb25zdCIpOwogICBHVi0+c2V0QWxpZ25tZW50KAogICAgIENHTS5nZXREYXRhTGF5b3V0KCkuZ2V0QUJJVHlwZUFsaWdubWVudChJbml0LT5nZXRUeXBlKCkpKTsKLSAgQ0dNLkFkZFVzZWRHbG9iYWwoR1YpOworICBDR00uYWRkQ29tcGlsZXJVc2VkR2xvYmFsKEdWKTsKICAgcmV0dXJuIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChHViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDVHlwZXMuUHJvdG9jb2xMaXN0bmZBQklQdHJUeSk7CiB9CkBAIC02NDc5LDEyICs2NDQ4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ1ZSUXVhbGlmaWVycykgewogICBPYmpDSW50ZXJmYWNlRGVjbCAqSUQgPSBPYmplY3RUeS0+Z2V0QXM8T2JqQ09iamVjdFR5cGU+KCktPmdldEludGVyZmFjZSgpOwogICBsbHZtOjpWYWx1ZSAqT2Zmc2V0ID0gRW1pdEl2YXJPZmZzZXQoQ0dGLCBJRCwgSXZhcik7Ci0KLSAgaWYgKElzSXZhck9mZnNldEtub3duSWRlbXBvdGVudChDR0YsIElELCBJdmFyKSkKLSAgICBpZiAobGx2bTo6TG9hZEluc3QgKkxJID0gY2FzdDxsbHZtOjpMb2FkSW5zdD4oT2Zmc2V0KSkKLSAgICAgIExJLT5zZXRNZXRhZGF0YShDR00uZ2V0TW9kdWxlKCkuZ2V0TURLaW5kSUQoImludmFyaWFudC5sb2FkIiksCi0gICAgICAgICAgICAgICAgICAgICAgbGx2bTo6TUROb2RlOjpnZXQoVk1Db250ZXh0LCBBcnJheVJlZjxsbHZtOjpWYWx1ZSo+KCkpKTsKLQogICByZXR1cm4gRW1pdFZhbHVlRm9ySXZhckF0T2Zmc2V0KENHRiwgSUQsIEJhc2VWYWx1ZSwgSXZhciwgQ1ZSUXVhbGlmaWVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQpOwogfQpAQCAtNjQ5Myw3ICs2NDU2LDIwIEBACiAgIENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAogICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSW50ZXJmYWNlLAogICBjb25zdCBPYmpDSXZhckRlY2wgKkl2YXIpIHsKLSAgcmV0dXJuIENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQoT2JqQ0l2YXJPZmZzZXRWYXJpYWJsZShJbnRlcmZhY2UsIEl2YXIpLCJpdmFyIik7CisgIGxsdm06OlZhbHVlICpJdmFyT2Zmc2V0VmFsdWUgPSBPYmpDSXZhck9mZnNldFZhcmlhYmxlKEludGVyZmFjZSwgSXZhcik7CisgIEl2YXJPZmZzZXRWYWx1ZSA9IENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQoSXZhck9mZnNldFZhbHVlLCAiaXZhciIpOworICBpZiAoSXNJdmFyT2Zmc2V0S25vd25JZGVtcG90ZW50KENHRiwgSXZhcikpCisgICAgY2FzdDxsbHZtOjpMb2FkSW5zdD4oSXZhck9mZnNldFZhbHVlKQorICAgICAgICAtPnNldE1ldGFkYXRhKENHTS5nZXRNb2R1bGUoKS5nZXRNREtpbmRJRCgiaW52YXJpYW50LmxvYWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpNRE5vZGU6OmdldChWTUNvbnRleHQsIEFycmF5UmVmPGxsdm06OlZhbHVlICo+KCkpKTsKKworICAvLyBUaGlzIGNvdWxkIGJlIDMyYml0IGludCBvciA2NGJpdCBpbnRlZ2VyIGRlcGVuZGluZyBvbiB0aGUgYXJjaGl0ZWN0dXJlLgorICAvLyBDYXN0IGl0IHRvIDY0Yml0IGludGVnZXIgdmFsdWUsIGlmIGl0IGlzIGEgMzJiaXQgaW50ZWdlciBpdmFyIG9mZnNldCB2YWx1ZQorICAvLyAgYXMgdGhpcyBpcyB3aGF0IGNhbGxlciBhbHdheXMgZXhwZWN0ZXMuCisgIGlmIChPYmpDVHlwZXMuSXZhck9mZnNldFZhclR5ID09IE9iakNUeXBlcy5JbnRUeSkKKyAgICBJdmFyT2Zmc2V0VmFsdWUgPSBDR0YuQnVpbGRlci5DcmVhdGVJbnRDYXN0KAorICAgICAgICBJdmFyT2Zmc2V0VmFsdWUsIE9iakNUeXBlcy5Mb25nVHksIHRydWUsICJpdmFyLmNvbnYiKTsKKyAgcmV0dXJuIEl2YXJPZmZzZXRWYWx1ZTsKIH0KIAogc3RhdGljIHZvaWQgYXBwZW5kU2VsZWN0b3JGb3JNZXNzYWdlUmVmVGFibGUoc3RkOjpzdHJpbmcgJmJ1ZmZlciwKQEAgLTY1NTYsNyArNjUzMiw3IEBACiAgIC8vIEZJWE1FOiBkb24ndCB1c2UgdGhpcyBmb3IgdGhhdC4KICAgbGx2bTo6Q29uc3RhbnQgKmZuID0gMDsKICAgc3RkOjpzdHJpbmcgbWVzc2FnZVJlZk5hbWUoIlwwMWxfIik7Ci0gIGlmIChDR00uUmV0dXJuVHlwZVVzZXNTUmV0KE1TSS5DYWxsSW5mbykpIHsKKyAgaWYgKENHTS5SZXR1cm5TbG90SW50ZXJmZXJlc1dpdGhBcmdzKE1TSS5DYWxsSW5mbykpIHsKICAgICBpZiAoaXNTdXBlcikgewogICAgICAgZm4gPSBPYmpDVHlwZXMuZ2V0TWVzc2FnZVNlbmRTdXBlcjJTdHJldEZpeHVwRm4oKTsKICAgICAgIG1lc3NhZ2VSZWZOYW1lICs9ICJvYmpjX21zZ1NlbmRTdXBlcjJfc3RyZXRfZml4dXAiOwpAQCAtNjYwMyw5ICs2NTc5LDcgQEAKICAgCiAgIGJvb2wgcmVxdWlyZXNudWxsQ2hlY2sgPSBmYWxzZTsKICAgaWYgKENHTS5nZXRMYW5nT3B0cygpLk9iakNBdXRvUmVmQ291bnQgJiYgbWV0aG9kKQotICAgIGZvciAoT2JqQ01ldGhvZERlY2w6OnBhcmFtX2NvbnN0X2l0ZXJhdG9yIGkgPSBtZXRob2QtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgICBlID0gbWV0aG9kLT5wYXJhbV9lbmQoKTsgaSAhPSBlOyArK2kpIHsKLSAgICAgIGNvbnN0IFBhcm1WYXJEZWNsICpQYXJhbURlY2wgPSAoKmkpOworICAgIGZvciAoY29uc3QgYXV0byAqUGFyYW1EZWNsIDogbWV0aG9kLT5wYXJhbXMoKSkgewogICAgICAgaWYgKFBhcmFtRGVjbC0+aGFzQXR0cjxOU0NvbnN1bWVkQXR0cj4oKSkgewogICAgICAgICBpZiAoIW51bGxSZXR1cm4uTnVsbEJCKQogICAgICAgICAgIG51bGxSZXR1cm4uaW5pdChDR0YsIGFyZzApOwpAQCAtNjY1Miw0OSArNjYyNiw1MyBAQAogfQogCiBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqCi1DR09iakNOb25GcmFnaWxlQUJJTWFjOjpHZXRDbGFzc0dsb2JhbChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworQ0dPYmpDTm9uRnJhZ2lsZUFCSU1hYzo6R2V0Q2xhc3NHbG9iYWwoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIGJvb2wgV2VhaykgeworICBsbHZtOjpHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzIEwgPQorICAgICAgV2VhayA/IGxsdm06Okdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlCisgICAgICAgICAgIDogbGx2bTo6R2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZTsKKwogICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YgPSBDR00uZ2V0TW9kdWxlKCkuZ2V0R2xvYmFsVmFyaWFibGUoTmFtZSk7CiAKLSAgaWYgKCFHVikgeworICBpZiAoIUdWKQogICAgIEdWID0gbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKENHTS5nZXRNb2R1bGUoKSwgT2JqQ1R5cGVzLkNsYXNzbmZBQklUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbGx2bTo6R2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOYW1lKTsKLSAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBMLCAwLCBOYW1lKTsKIAorICBhc3NlcnQoR1YtPmdldExpbmthZ2UoKSA9PSBMKTsKICAgcmV0dXJuIEdWOwogfQogCiBsbHZtOjpWYWx1ZSAqQ0dPYmpDTm9uRnJhZ2lsZUFCSU1hYzo6RW1pdENsYXNzUmVmRnJvbUlkKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSUkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFdlYWspIHsKICAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKiZFbnRyeSA9IENsYXNzUmVmZXJlbmNlc1tJSV07CiAgIAogICBpZiAoIUVudHJ5KSB7CiAgICAgc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGdldENsYXNzU3ltYm9sUHJlZml4KCkgKyBJSS0+Z2V0TmFtZSgpLnN0cigpKTsKLSAgICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqQ2xhc3NHViA9IEdldENsYXNzR2xvYmFsKENsYXNzTmFtZSk7CisgICAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkNsYXNzR1YgPSBHZXRDbGFzc0dsb2JhbChDbGFzc05hbWUsIFdlYWspOwogICAgIEVudHJ5ID0KICAgICBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoQ0dNLmdldE1vZHVsZSgpLCBPYmpDVHlwZXMuQ2xhc3NuZkFCSVB0clR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbGx2bTo6R2xvYmFsVmFsdWU6OkludGVybmFsTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGxsdm06Okdsb2JhbFZhbHVlOjpQcml2YXRlTGlua2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NHViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMUxfT0JKQ19DTEFTU0xJU1RfUkVGRVJFTkNFU18kXyIpOwogICAgIEVudHJ5LT5zZXRBbGlnbm1lbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICBDR00uZ2V0RGF0YUxheW91dCgpLmdldEFCSVR5cGVBbGlnbm1lbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ1R5cGVzLkNsYXNzbmZBQklQdHJUeSkpOwogICAgIEVudHJ5LT5zZXRTZWN0aW9uKCJfX0RBVEEsIF9fb2JqY19jbGFzc3JlZnMsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiKTsKLSAgICBDR00uQWRkVXNlZEdsb2JhbChFbnRyeSk7CisgICAgQ0dNLmFkZENvbXBpbGVyVXNlZEdsb2JhbChFbnRyeSk7CiAgIH0KLSAgCisgIGFzc2VydFByaXZhdGVOYW1lKEVudHJ5KTsKICAgcmV0dXJuIENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQoRW50cnkpOwogfQogCiBsbHZtOjpWYWx1ZSAqQ0dPYmpDTm9uRnJhZ2lsZUFCSU1hYzo6RW1pdENsYXNzUmVmKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUQpIHsKLSAgcmV0dXJuIEVtaXRDbGFzc1JlZkZyb21JZChDR0YsIElELT5nZXRJZGVudGlmaWVyKCkpOworICByZXR1cm4gRW1pdENsYXNzUmVmRnJvbUlkKENHRiwgSUQtPmdldElkZW50aWZpZXIoKSwgSUQtPmlzV2Vha0ltcG9ydGVkKCkpOwogfQogCiBsbHZtOjpWYWx1ZSAqQ0dPYmpDTm9uRnJhZ2lsZUFCSU1hYzo6RW1pdE5TQXV0b3JlbGVhc2VQb29sQ2xhc3NSZWYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIHsKICAgSWRlbnRpZmllckluZm8gKklJID0gJkNHTS5nZXRDb250ZXh0KCkuSWRlbnRzLmdldCgiTlNBdXRvcmVsZWFzZVBvb2wiKTsKLSAgcmV0dXJuIEVtaXRDbGFzc1JlZkZyb21JZChDR0YsIElJKTsKKyAgcmV0dXJuIEVtaXRDbGFzc1JlZkZyb21JZChDR0YsIElJLCBmYWxzZSk7CiB9CiAKIGxsdm06OlZhbHVlICoKQEAgLTY3MDQsMTkgKzY2ODIsMjAgQEAKIAogICBpZiAoIUVudHJ5KSB7CiAgICAgc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGdldENsYXNzU3ltYm9sUHJlZml4KCkgKyBJRC0+Z2V0TmFtZUFzU3RyaW5nKCkpOwotICAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpDbGFzc0dWID0gR2V0Q2xhc3NHbG9iYWwoQ2xhc3NOYW1lKTsKKyAgICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqQ2xhc3NHViA9IEdldENsYXNzR2xvYmFsKENsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElELT5pc1dlYWtJbXBvcnRlZCgpKTsKICAgICBFbnRyeSA9CiAgICAgICBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoQ0dNLmdldE1vZHVsZSgpLCBPYmpDVHlwZXMuQ2xhc3NuZkFCSVB0clR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBsbHZtOjpHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBsbHZtOjpHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NHViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXDAxTF9PQkpDX0NMQVNTTElTVF9TVVBfUkVGU18kXyIpOwogICAgIEVudHJ5LT5zZXRBbGlnbm1lbnQoCiAgICAgICBDR00uZ2V0RGF0YUxheW91dCgpLmdldEFCSVR5cGVBbGlnbm1lbnQoCiAgICAgICAgIE9iakNUeXBlcy5DbGFzc25mQUJJUHRyVHkpKTsKICAgICBFbnRyeS0+c2V0U2VjdGlvbigiX19EQVRBLCBfX29iamNfc3VwZXJyZWZzLCByZWd1bGFyLCBub19kZWFkX3N0cmlwIik7Ci0gICAgQ0dNLkFkZFVzZWRHbG9iYWwoRW50cnkpOworICAgIENHTS5hZGRDb21waWxlclVzZWRHbG9iYWwoRW50cnkpOwogICB9Ci0KKyAgYXNzZXJ0UHJpdmF0ZU5hbWUoRW50cnkpOwogICByZXR1cm4gQ0dGLkJ1aWxkZXIuQ3JlYXRlTG9hZChFbnRyeSk7CiB9CiAKQEAgLTY3MjYsMjMgKzY3MDUsMjMgQEAKIGxsdm06OlZhbHVlICpDR09iakNOb25GcmFnaWxlQUJJTWFjOjpFbWl0TWV0YUNsYXNzUmVmKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklEKSB7CiAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICogJkVudHJ5ID0gTWV0YUNsYXNzUmVmZXJlbmNlc1tJRC0+Z2V0SWRlbnRpZmllcigpXTsKLSAgaWYgKEVudHJ5KQotICAgIHJldHVybiBDR0YuQnVpbGRlci5DcmVhdGVMb2FkKEVudHJ5KTsKKyAgaWYgKCFFbnRyeSkgewogCi0gIHN0ZDo6c3RyaW5nIE1ldGFDbGFzc05hbWUoZ2V0TWV0YWNsYXNzU3ltYm9sUHJlZml4KCkgKyBJRC0+Z2V0TmFtZUFzU3RyaW5nKCkpOwotICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqTWV0YUNsYXNzR1YgPSBHZXRDbGFzc0dsb2JhbChNZXRhQ2xhc3NOYW1lKTsKLSAgRW50cnkgPQotICAgIG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIE9iakNUeXBlcy5DbGFzc25mQUJJUHRyVHksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhQ2xhc3NHViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMUxfT0JKQ19DTEFTU0xJU1RfU1VQX1JFRlNfJF8iKTsKLSAgRW50cnktPnNldEFsaWdubWVudCgKLSAgICBDR00uZ2V0RGF0YUxheW91dCgpLmdldEFCSVR5cGVBbGlnbm1lbnQoCi0gICAgICBPYmpDVHlwZXMuQ2xhc3NuZkFCSVB0clR5KSk7CisgICAgc3RkOjpzdHJpbmcgTWV0YUNsYXNzTmFtZShnZXRNZXRhY2xhc3NTeW1ib2xQcmVmaXgoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRC0+Z2V0TmFtZUFzU3RyaW5nKCkpOworICAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpNZXRhQ2xhc3NHViA9IEdldENsYXNzR2xvYmFsKE1ldGFDbGFzc05hbWUpOworICAgIEVudHJ5ID0gbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKENHTS5nZXRNb2R1bGUoKSwgT2JqQ1R5cGVzLkNsYXNzbmZBQklQdHJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbGx2bTo6R2xvYmFsVmFsdWU6OlByaXZhdGVMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFDbGFzc0dWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcMDFMX09CSkNfQ0xBU1NMSVNUX1NVUF9SRUZTXyRfIik7CisgICAgRW50cnktPnNldEFsaWdubWVudCgKKyAgICAgICAgQ0dNLmdldERhdGFMYXlvdXQoKS5nZXRBQklUeXBlQWxpZ25tZW50KE9iakNUeXBlcy5DbGFzc25mQUJJUHRyVHkpKTsKIAotICBFbnRyeS0+c2V0U2VjdGlvbigiX19EQVRBLCBfX29iamNfc3VwZXJyZWZzLCByZWd1bGFyLCBub19kZWFkX3N0cmlwIik7Ci0gIENHTS5BZGRVc2VkR2xvYmFsKEVudHJ5KTsKKyAgICBFbnRyeS0+c2V0U2VjdGlvbigiX19EQVRBLCBfX29iamNfc3VwZXJyZWZzLCByZWd1bGFyLCBub19kZWFkX3N0cmlwIik7CisgICAgQ0dNLmFkZENvbXBpbGVyVXNlZEdsb2JhbChFbnRyeSk7CisgIH0KIAorICBhc3NlcnRQcml2YXRlTmFtZShFbnRyeSk7CiAgIHJldHVybiBDR0YuQnVpbGRlci5DcmVhdGVMb2FkKEVudHJ5KTsKIH0KIApAQCAtNjc1Miw4ICs2NzMxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUQpIHsKICAgaWYgKElELT5pc1dlYWtJbXBvcnRlZCgpKSB7CiAgICAgc3RkOjpzdHJpbmcgQ2xhc3NOYW1lKGdldENsYXNzU3ltYm9sUHJlZml4KCkgKyBJRC0+Z2V0TmFtZUFzU3RyaW5nKCkpOwotICAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpDbGFzc0dWID0gR2V0Q2xhc3NHbG9iYWwoQ2xhc3NOYW1lKTsKLSAgICBDbGFzc0dWLT5zZXRMaW5rYWdlKGxsdm06Okdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlKTsKKyAgICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqQ2xhc3NHViA9IEdldENsYXNzR2xvYmFsKENsYXNzTmFtZSwgdHJ1ZSk7CisgICAgKHZvaWQpQ2xhc3NHVjsKKyAgICBhc3NlcnQoQ2xhc3NHVi0+Z2V0TGlua2FnZSgpID09IGxsdm06Okdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlKTsKICAgfQogICAKICAgcmV0dXJuIEVtaXRDbGFzc1JlZihDR0YsIElEKTsKQEAgLTY4MTksMTIgKzY3OTksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDVHlwZXMuU2VsZWN0b3JQdHJUeSk7CiAgICAgRW50cnkgPQogICAgICAgbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKENHTS5nZXRNb2R1bGUoKSwgT2JqQ1R5cGVzLlNlbGVjdG9yUHRyVHksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OlByaXZhdGVMaW5rYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3RlZCwgIlwwMUxfT0JKQ19TRUxFQ1RPUl9SRUZFUkVOQ0VTXyIpOwogICAgIEVudHJ5LT5zZXRFeHRlcm5hbGx5SW5pdGlhbGl6ZWQodHJ1ZSk7CiAgICAgRW50cnktPnNldFNlY3Rpb24oIl9fREFUQSwgX19vYmpjX3NlbHJlZnMsIGxpdGVyYWxfcG9pbnRlcnMsIG5vX2RlYWRfc3RyaXAiKTsKLSAgICBDR00uQWRkVXNlZEdsb2JhbChFbnRyeSk7CisgICAgQ0dNLmFkZENvbXBpbGVyVXNlZEdsb2JhbChFbnRyeSk7CiAgIH0KKyAgYXNzZXJ0UHJpdmF0ZU5hbWUoRW50cnkpOwogCiAgIGlmIChsdmFsKQogICAgIHJldHVybiBFbnRyeTsKQEAgLTcwNTQsMjcgKzcwMzUsMjkgQEAKICAgbGx2bTo6Q29uc3RhbnQgKkluaXQgPQogICAgIGxsdm06OkNvbnN0YW50U3RydWN0OjpnZXQoT2JqQ1R5cGVzLkVIVHlwZVR5LCBWYWx1ZXMpOwogCisgIGxsdm06Okdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTCA9IEZvckRlZmluaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbGx2bTo6R2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsbHZtOjpHbG9iYWxWYWx1ZTo6V2Vha0FueUxpbmthZ2U7CiAgIGlmIChFbnRyeSkgewogICAgIEVudHJ5LT5zZXRJbml0aWFsaXplcihJbml0KTsKICAgfSBlbHNlIHsKICAgICBFbnRyeSA9IG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShDR00uZ2V0TW9kdWxlKCksIE9iakNUeXBlcy5FSFR5cGVUeSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OldlYWtBbnlMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIk9CSkNfRUhUWVBFXyRfIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElELT5nZXRJZGVudGlmaWVyKCktPmdldE5hbWUoKSkpOwogICB9CisgIGFzc2VydChFbnRyeS0+Z2V0TGlua2FnZSgpID09IEwpOwogCiAgIGlmIChJRC0+Z2V0VmlzaWJpbGl0eSgpID09IEhpZGRlblZpc2liaWxpdHkpCiAgICAgRW50cnktPnNldFZpc2liaWxpdHkobGx2bTo6R2xvYmFsVmFsdWU6OkhpZGRlblZpc2liaWxpdHkpOwogICBFbnRyeS0+c2V0QWxpZ25tZW50KENHTS5nZXREYXRhTGF5b3V0KCkuZ2V0QUJJVHlwZUFsaWdubWVudCgKICAgICAgIE9iakNUeXBlcy5FSFR5cGVUeSkpOwogCi0gIGlmIChGb3JEZWZpbml0aW9uKSB7CisgIGlmIChGb3JEZWZpbml0aW9uKQogICAgIEVudHJ5LT5zZXRTZWN0aW9uKCJfX0RBVEEsX19vYmpjX2NvbnN0Iik7Ci0gICAgRW50cnktPnNldExpbmthZ2UobGx2bTo6R2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSk7Ci0gIH0gZWxzZSB7CisgIGVsc2UKICAgICBFbnRyeS0+c2V0U2VjdGlvbigiX19EQVRBLF9fZGF0YWNvYWxfbnQsY29hbGVzY2VkIik7Ci0gIH0KIAogICByZXR1cm4gRW50cnk7CiB9CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR09iakNSdW50aW1lLmNwcCBiL2xpYi9Db2RlR2VuL0NHT2JqQ1J1bnRpbWUuY3BwCmluZGV4IGQwOTdiNmYuLjhkNmM2NTMgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NHT2JqQ1J1bnRpbWUuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHT2JqQ1J1bnRpbWUuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSAiY2xhbmcvQVNUL1JlY29yZExheW91dC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10T2JqQy5oIgogI2luY2x1ZGUgImNsYW5nL0NvZGVHZW4vQ0dGdW5jdGlvbkluZm8uaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIHVzaW5nIG5hbWVzcGFjZSBDb2RlR2VuOwpAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgYm9vbCBNaWdodFRocm93OwogICAgIGxsdm06OlZhbHVlICpGbjsKIAotICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSBvdmVycmlkZSB7CiAgICAgICBpZiAoIU1pZ2h0VGhyb3cpIHsKICAgICAgICAgQ0dGLkJ1aWxkZXIuQ3JlYXRlQ2FsbChGbiktPnNldERvZXNOb3RUaHJvdygpOwogICAgICAgICByZXR1cm47CkBAIC0zMDMsNyArMzAzLDcgQEAKICAgICBDYWxsU3luY0V4aXQobGx2bTo6VmFsdWUgKlN5bmNFeGl0Rm4sIGxsdm06OlZhbHVlICpTeW5jQXJnKQogICAgICAgOiBTeW5jRXhpdEZuKFN5bmNFeGl0Rm4pLCBTeW5jQXJnKFN5bmNBcmcpIHt9CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgQ0dGLkJ1aWxkZXIuQ3JlYXRlQ2FsbChTeW5jRXhpdEZuLCBTeW5jQXJnKS0+c2V0RG9lc05vdFRocm93KCk7CiAgICAgfQogICB9OwpkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ0dPYmpDUnVudGltZS5oIGIvbGliL0NvZGVHZW4vQ0dPYmpDUnVudGltZS5oCmluZGV4IDdmMDMwZjIuLjJhOGFlOTAgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NHT2JqQ1J1bnRpbWUuaAorKysgYi9saWIvQ29kZUdlbi9DR09iakNSdW50aW1lLmgKQEAgLTI2OCw3ICsyNjgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVHZW46OkNHQmxvY2tJbmZvICZibG9ja0luZm8pID0gMDsKICAgdmlydHVhbCBsbHZtOjpDb25zdGFudCAqQnVpbGRCeXJlZkxheW91dChDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZDR00sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCkgPSAwOwotICB2aXJ0dWFsIGxsdm06Okdsb2JhbFZhcmlhYmxlICpHZXRDbGFzc0dsb2JhbChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgPSAwOworICB2aXJ0dWFsIGxsdm06Okdsb2JhbFZhcmlhYmxlICpHZXRDbGFzc0dsb2JhbChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBXZWFrID0gZmFsc2UpID0gMDsKIAogICBzdHJ1Y3QgTWVzc2FnZVNlbmRJbmZvIHsKICAgICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmQ2FsbEluZm87CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR09wZW5DTFJ1bnRpbWUuY3BwIGIvbGliL0NvZGVHZW4vQ0dPcGVuQ0xSdW50aW1lLmNwcAppbmRleCA3YzQ1NGFjLi42ZTFhM2M5IDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR09wZW5DTFJ1bnRpbWUuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHT3BlbkNMUnVudGltZS5jcHAKQEAgLTMzLDMyICszMywzNSBAQAogICBhc3NlcnQoVC0+aXNPcGVuQ0xTcGVjaWZpY1R5cGUoKSAmJgogICAgICAgICAgIk5vdCBhbiBPcGVuQ0wgc3BlY2lmaWMgdHlwZSEiKTsKIAorICBsbHZtOjpMTFZNQ29udGV4dCYgQ3R4ID0gQ0dNLmdldExMVk1Db250ZXh0KCk7CisgIHVpbnQzMl90IEltZ0FkZHJTcGMgPQorICAgIENHTS5nZXRDb250ZXh0KCkuZ2V0VGFyZ2V0QWRkcmVzc1NwYWNlKExhbmdBUzo6b3BlbmNsX2dsb2JhbCk7CiAgIHN3aXRjaCAoY2FzdDxCdWlsdGluVHlwZT4oVCktPmdldEtpbmQoKSkgewogICBkZWZhdWx0OiAKICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIG9wZW5jbCBidWlsdGluIHR5cGUhIik7CiAgICAgcmV0dXJuIDA7CiAgIGNhc2UgQnVpbHRpblR5cGU6Ok9DTEltYWdlMWQ6CiAgICAgcmV0dXJuIGxsdm06OlBvaW50ZXJUeXBlOjpnZXQobGx2bTo6U3RydWN0VHlwZTo6Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dNLmdldExMVk1Db250ZXh0KCksICJvcGVuY2wuaW1hZ2UxZF90IiksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3R4LCAib3BlbmNsLmltYWdlMWRfdCIpLCBJbWdBZGRyU3BjKTsKICAgY2FzZSBCdWlsdGluVHlwZTo6T0NMSW1hZ2UxZEFycmF5OgogICAgIHJldHVybiBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0KGxsdm06OlN0cnVjdFR5cGU6OmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENHTS5nZXRMTFZNQ29udGV4dCgpLCAib3BlbmNsLmltYWdlMWRfYXJyYXlfdCIpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0eCwgIm9wZW5jbC5pbWFnZTFkX2FycmF5X3QiKSwgSW1nQWRkclNwYyk7CiAgIGNhc2UgQnVpbHRpblR5cGU6Ok9DTEltYWdlMWRCdWZmZXI6CiAgICAgcmV0dXJuIGxsdm06OlBvaW50ZXJUeXBlOjpnZXQobGx2bTo6U3RydWN0VHlwZTo6Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dNLmdldExMVk1Db250ZXh0KCksICJvcGVuY2wuaW1hZ2UxZF9idWZmZXJfdCIpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0eCwgIm9wZW5jbC5pbWFnZTFkX2J1ZmZlcl90IiksIEltZ0FkZHJTcGMpOwogICBjYXNlIEJ1aWx0aW5UeXBlOjpPQ0xJbWFnZTJkOgogICAgIHJldHVybiBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0KGxsdm06OlN0cnVjdFR5cGU6OmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENHTS5nZXRMTFZNQ29udGV4dCgpLCAib3BlbmNsLmltYWdlMmRfdCIpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0eCwgIm9wZW5jbC5pbWFnZTJkX3QiKSwgSW1nQWRkclNwYyk7CiAgIGNhc2UgQnVpbHRpblR5cGU6Ok9DTEltYWdlMmRBcnJheToKICAgICByZXR1cm4gbGx2bTo6UG9pbnRlclR5cGU6OmdldChsbHZtOjpTdHJ1Y3RUeXBlOjpjcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDR00uZ2V0TExWTUNvbnRleHQoKSwgIm9wZW5jbC5pbWFnZTJkX2FycmF5X3QiKSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDdHgsICJvcGVuY2wuaW1hZ2UyZF9hcnJheV90IiksIEltZ0FkZHJTcGMpOwogICBjYXNlIEJ1aWx0aW5UeXBlOjpPQ0xJbWFnZTNkOgogICAgIHJldHVybiBsbHZtOjpQb2ludGVyVHlwZTo6Z2V0KGxsdm06OlN0cnVjdFR5cGU6OmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENHTS5nZXRMTFZNQ29udGV4dCgpLCAib3BlbmNsLmltYWdlM2RfdCIpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0eCwgIm9wZW5jbC5pbWFnZTNkX3QiKSwgSW1nQWRkclNwYyk7CiAgIGNhc2UgQnVpbHRpblR5cGU6Ok9DTFNhbXBsZXI6Ci0gICAgcmV0dXJuIGxsdm06OkludGVnZXJUeXBlOjpnZXQoQ0dNLmdldExMVk1Db250ZXh0KCksMzIpOworICAgIHJldHVybiBsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KEN0eCwgMzIpOwogICBjYXNlIEJ1aWx0aW5UeXBlOjpPQ0xFdmVudDoKICAgICByZXR1cm4gbGx2bTo6UG9pbnRlclR5cGU6OmdldChsbHZtOjpTdHJ1Y3RUeXBlOjpjcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDR00uZ2V0TExWTUNvbnRleHQoKSwgIm9wZW5jbC5ldmVudF90IiksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3R4LCAib3BlbmNsLmV2ZW50X3QiKSwgMCk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHUlRUSS5jcHAgYi9saWIvQ29kZUdlbi9DR1JUVEkuY3BwCmluZGV4IGFhNjg3YjkuLjcwNDlkZjcgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NHUlRUSS5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ0dSVFRJLmNwcApAQCAtMzMyLDExICszMzIsMTEgQEAKICAgCiAgIHN3aXRjaCAoVHktPmdldExpbmthZ2UoKSkgewogICBjYXNlIE5vTGlua2FnZToKLSAgY2FzZSBWaXNpYmxlTm9MaW5rYWdlOgogICBjYXNlIEludGVybmFsTGlua2FnZToKICAgY2FzZSBVbmlxdWVFeHRlcm5hbExpbmthZ2U6CiAgICAgcmV0dXJuIGxsdm06Okdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2U7CiAKKyAgY2FzZSBWaXNpYmxlTm9MaW5rYWdlOgogICBjYXNlIEV4dGVybmFsTGlua2FnZToKICAgICBpZiAoIUNHTS5nZXRMYW5nT3B0cygpLlJUVEkpIHsKICAgICAgIC8vIFJUVEkgaXMgbm90IGVuYWJsZWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhpcyB0eXBlIGluZm8gc3RydWN0IGlzIGdvaW5nCkBAIC01NDQsOCArNTQ0LDI1IEBACiAgIAogICAvLyBBbmQgdGhlIG5hbWUuCiAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpUeXBlTmFtZSA9IEdldEFkZHJPZlR5cGVOYW1lKFR5LCBMaW5rYWdlKTsKKyAgbGx2bTo6Q29uc3RhbnQgKlR5cGVOYW1lRmllbGQ7CiAKLSAgRmllbGRzLnB1c2hfYmFjayhsbHZtOjpDb25zdGFudEV4cHI6OmdldEJpdENhc3QoVHlwZU5hbWUsIENHTS5JbnQ4UHRyVHkpKTsKKyAgLy8gSWYgd2UncmUgc3VwcG9zZWQgdG8gZGVtb3RlIHRoZSB2aXNpYmlsaXR5LCBiZSBzdXJlIHRvIHNldCBhIGZsYWcKKyAgLy8gdG8gdXNlIGEgc3RyaW5nIGNvbXBhcmlzb24gZm9yIHR5cGVfaW5mbyBjb21wYXJpc29ucy4KKyAgQ0dDWFhBQkk6OlJUVElVbmlxdWVuZXNzS2luZCBSVFRJVW5pcXVlbmVzcyA9CisgICAgICBDR00uZ2V0Q1hYQUJJKCkuY2xhc3NpZnlSVFRJVW5pcXVlbmVzcyhUeSwgTGlua2FnZSk7CisgIGlmIChSVFRJVW5pcXVlbmVzcyAhPSBDR0NYWEFCSTo6UlVLX1VuaXF1ZSkgeworICAgIC8vIFRoZSBmbGFnIGlzIHRoZSBzaWduIGJpdCwgd2hpY2ggb24gQVJNNjQgaXMgZGVmaW5lZCB0byBiZSBjbGVhcgorICAgIC8vIGZvciBnbG9iYWwgcG9pbnRlcnMuICBUaGlzIGlzIHZlcnkgQVJNNjQtc3BlY2lmaWMuCisgICAgVHlwZU5hbWVGaWVsZCA9IGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0UHRyVG9JbnQoVHlwZU5hbWUsIENHTS5JbnQ2NFR5KTsKKyAgICBsbHZtOjpDb25zdGFudCAqZmxhZyA9CisgICAgICAgIGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dNLkludDY0VHksICgodWludDY0X3QpMSkgPDwgNjMpOworICAgIFR5cGVOYW1lRmllbGQgPSBsbHZtOjpDb25zdGFudEV4cHI6OmdldEFkZChUeXBlTmFtZUZpZWxkLCBmbGFnKTsKKyAgICBUeXBlTmFtZUZpZWxkID0KKyAgICAgICAgbGx2bTo6Q29uc3RhbnRFeHByOjpnZXRJbnRUb1B0cihUeXBlTmFtZUZpZWxkLCBDR00uSW50OFB0clR5KTsKKyAgfSBlbHNlIHsKKyAgICBUeXBlTmFtZUZpZWxkID0gbGx2bTo6Q29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KFR5cGVOYW1lLCBDR00uSW50OFB0clR5KTsKKyAgfQorICBGaWVsZHMucHVzaF9iYWNrKFR5cGVOYW1lRmllbGQpOwogCiAgIHN3aXRjaCAoVHktPmdldFR5cGVDbGFzcygpKSB7CiAjZGVmaW5lIFRZUEUoQ2xhc3MsIEJhc2UpCkBAIC02NDQsMzIgKzY2MSwzNSBAQAogICAgIE9sZEdWLT5lcmFzZUZyb21QYXJlbnQoKTsKICAgfQogCi0gIC8vIEdDQyBvbmx5IHJlbGllcyBvbiB0aGUgdW5pcXVlbmVzcyBvZiB0aGUgdHlwZSBuYW1lcywgbm90IHRoZQotICAvLyB0eXBlX2luZm9zIHRoZW1zZWx2ZXMsIHNvIHdlIGNhbiBlbWl0IHRoZXNlIGFzIGhpZGRlbiBzeW1ib2xzLgotICAvLyBCdXQgZG9uJ3QgZG8gdGhpcyBpZiB3ZSdyZSB3b3JyaWVkIGFib3V0IHN0cmljdCB2aXNpYmlsaXR5Ci0gIC8vIGNvbXBhdGliaWxpdHkuCi0gIGlmIChjb25zdCBSZWNvcmRUeXBlICpSVCA9IGR5bl9jYXN0PFJlY29yZFR5cGU+KFR5KSkgewotICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gY2FzdDxDWFhSZWNvcmREZWNsPihSVC0+Z2V0RGVjbCgpKTsKKyAgLy8gVGhlIEl0YW5pdW0gQUJJIHNwZWNpZmllcyB0aGF0IHR5cGVfaW5mbyBvYmplY3RzIG11c3QgYmUgZ2xvYmFsbHkKKyAgLy8gdW5pcXVlLCB3aXRoIG9uZSBleGNlcHRpb246IGlmIHRoZSB0eXBlIGlzIGFuIGluY29tcGxldGUgY2xhc3MKKyAgLy8gdHlwZSBvciBhIChwb3NzaWJseSBpbmRpcmVjdCkgcG9pbnRlciB0byBvbmUuICBUaGF0IGV4Y2VwdGlvbgorICAvLyBhZmZlY3RzIHRoZSBnZW5lcmFsIGNhc2Ugb2YgY29tcGFyaW5nIHR5cGVfaW5mbyBvYmplY3RzIHByb2R1Y2VkCisgIC8vIGJ5IHRoZSB0eXBlaWQgb3BlcmF0b3IsIHdoaWNoIGlzIHdoeSB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgb24KKyAgLy8gc3RkOjp0eXBlX2luZm8gZ2VuZXJhbGx5IHVzZSB0aGUgdHlwZV9pbmZvIG5hbWUgcG9pbnRlcnMgaW5zdGVhZAorICAvLyBvZiB0aGUgb2JqZWN0IGFkZHJlc3Nlcy4gIEhvd2V2ZXIsIHRoZSBsYW5ndWFnZSdzIGJ1aWx0LWluIHVzZXMKKyAgLy8gb2YgUlRUSSBnZW5lcmFsbHkgcmVxdWlyZSBjbGFzcyB0eXBlcyB0byBiZSBjb21wbGV0ZSwgZXZlbiB3aGVuCisgIC8vIG1hbmlwdWxhdGluZyBwb2ludGVycyB0byB0aG9zZSBjbGFzcyB0eXBlcy4gIFRoaXMgYWxsb3dzIHRoZQorICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBkeW5hbWljX2Nhc3QgdG8gcmVseSBvbiBhZGRyZXNzIGVxdWFsaXR5IHRlc3RzLAorICAvLyB3aGljaCBpcyBtdWNoIGZhc3Rlci4KIAotICAgIENHTS5zZXRUeXBlVmlzaWJpbGl0eShHViwgUkQsIENvZGVHZW5Nb2R1bGU6OlRWS19Gb3JSVFRJKTsKLSAgICBDR00uc2V0VHlwZVZpc2liaWxpdHkoVHlwZU5hbWUsIFJELCBDb2RlR2VuTW9kdWxlOjpUVktfRm9yUlRUSU5hbWUpOwotICB9IGVsc2UgewotICAgIFZpc2liaWxpdHkgVHlwZUluZm9WaXNpYmlsaXR5ID0gRGVmYXVsdFZpc2liaWxpdHk7Ci0gICAgaWYgKENHTS5nZXRDb2RlR2VuT3B0cygpLkhpZGRlbldlYWtWVGFibGVzICYmCi0gICAgICAgIExpbmthZ2UgPT0gbGx2bTo6R2xvYmFsVmFsdWU6OkxpbmtPbmNlT0RSTGlua2FnZSkKLSAgICAgIFR5cGVJbmZvVmlzaWJpbGl0eSA9IEhpZGRlblZpc2liaWxpdHk7CisgIC8vIEFsbCBvZiB0aGlzIGlzIHRvIHNheSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgYm90aCB0aGUgdHlwZV9pbmZvCisgIC8vIG9iamVjdCBhbmQgdGhlIHR5cGVfaW5mbyBuYW1lIGJlIHVuaXF1ZWQgd2hlbiB3ZWFrbHkgZW1pdHRlZC4KIAotICAgIC8vIFRoZSB0eXBlIG5hbWUgc2hvdWxkIGhhdmUgdGhlIHNhbWUgdmlzaWJpbGl0eSBhcyB0aGUgdHlwZSBpdHNlbGYuCi0gICAgVmlzaWJpbGl0eSBFeHBsaWNpdFZpc2liaWxpdHkgPSBUeS0+Z2V0VmlzaWJpbGl0eSgpOwotICAgIFR5cGVOYW1lLT5zZXRWaXNpYmlsaXR5KENvZGVHZW5Nb2R1bGU6OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExMVk1WaXNpYmlsaXR5KEV4cGxpY2l0VmlzaWJpbGl0eSkpOwotICAKLSAgICBUeXBlSW5mb1Zpc2liaWxpdHkgPSBtaW5WaXNpYmlsaXR5KFR5cGVJbmZvVmlzaWJpbGl0eSwgVHktPmdldFZpc2liaWxpdHkoKSk7Ci0gICAgR1YtPnNldFZpc2liaWxpdHkoQ29kZUdlbk1vZHVsZTo6R2V0TExWTVZpc2liaWxpdHkoVHlwZUluZm9WaXNpYmlsaXR5KSk7CisgIC8vIEdpdmUgdGhlIHR5cGVfaW5mbyBvYmplY3QgYW5kIG5hbWUgdGhlIGZvcm1hbCB2aXNpYmlsaXR5IG9mIHRoZQorICAvLyB0eXBlIGl0c2VsZi4KKyAgVmlzaWJpbGl0eSBmb3JtYWxWaXNpYmlsaXR5ID0gVHktPmdldFZpc2liaWxpdHkoKTsKKyAgbGx2bTo6R2xvYmFsVmFsdWU6OlZpc2liaWxpdHlUeXBlcyBsbHZtVmlzaWJpbGl0eSA9CisgICAgQ29kZUdlbk1vZHVsZTo6R2V0TExWTVZpc2liaWxpdHkoZm9ybWFsVmlzaWJpbGl0eSk7CisgIFR5cGVOYW1lLT5zZXRWaXNpYmlsaXR5KGxsdm1WaXNpYmlsaXR5KTsKKyAgR1YtPnNldFZpc2liaWxpdHkobGx2bVZpc2liaWxpdHkpOworCisgIC8vIEZJWE1FOiBpbnRlZ3JhdGUgdGhpcyBiZXR0ZXIgaW50byB0aGUgYWJvdmUgd2hlbiB3ZSBtb3ZlIHRvIHRydW5rCisgIGlmIChSVFRJVW5pcXVlbmVzcyA9PSBDR0NYWEFCSTo6UlVLX05vblVuaXF1ZUhpZGRlbikgeworICAgIFR5cGVOYW1lLT5zZXRWaXNpYmlsaXR5KGxsdm06Okdsb2JhbFZhbHVlOjpIaWRkZW5WaXNpYmlsaXR5KTsKKyAgICBHVi0+c2V0VmlzaWJpbGl0eShsbHZtOjpHbG9iYWxWYWx1ZTo6SGlkZGVuVmlzaWJpbGl0eSk7CiAgIH0KIAotICBHVi0+c2V0VW5uYW1lZEFkZHIodHJ1ZSk7Ci0KICAgcmV0dXJuIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChHViwgQ0dNLkludDhQdHJUeSk7CiB9CiAKQEAgLTc2Niw5ICs3ODYsOCBAQAogICB9CiAKICAgLy8gV2FsayBhbGwgYmFzZXMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gQmFzZURlY2wtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IEJhc2VEZWNsLT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIAotICAgIEZsYWdzIHw9IENvbXB1dGVWTUlDbGFzc1R5cGVJbmZvRmxhZ3MoSSwgQmFzZXMpOworICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBCYXNlRGVjbC0+YmFzZXMoKSkgCisgICAgRmxhZ3MgfD0gQ29tcHV0ZVZNSUNsYXNzVHlwZUluZm9GbGFncygmSSwgQmFzZXMpOwogICAKICAgcmV0dXJuIEZsYWdzOwogfQpAQCAtNzc4LDkgKzc5Nyw4IEBACiAgIFNlZW5CYXNlcyBCYXNlczsKICAgCiAgIC8vIFdhbGsgYWxsIGJhc2VzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgIEUgPSBSRC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSAKLSAgICBGbGFncyB8PSBDb21wdXRlVk1JQ2xhc3NUeXBlSW5mb0ZsYWdzKEksIEJhc2VzKTsKKyAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPmJhc2VzKCkpIAorICAgIEZsYWdzIHw9IENvbXB1dGVWTUlDbGFzc1R5cGVJbmZvRmxhZ3MoJkksIEJhc2VzKTsKICAgCiAgIHJldHVybiBGbGFnczsKIH0KQEAgLTgyNywxNSArODQ1LDEyIEBACiAgIC8vICAgICAgIF9fb2Zmc2V0X3NoaWZ0ID0gOAogICAvLyAgICAgfTsKICAgLy8gICB9OwotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgIEUgPSBSRC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgQ1hYQmFzZVNwZWNpZmllciAqQmFzZSA9IEk7Ci0KKyAgZm9yIChjb25zdCBhdXRvICZCYXNlIDogUkQtPmJhc2VzKCkpIHsKICAgICAvLyBUaGUgX19iYXNlX3R5cGUgbWVtYmVyIHBvaW50cyB0byB0aGUgUlRUSSBmb3IgdGhlIGJhc2UgdHlwZS4KLSAgICBGaWVsZHMucHVzaF9iYWNrKFJUVElCdWlsZGVyKENHTSkuQnVpbGRUeXBlSW5mbyhCYXNlLT5nZXRUeXBlKCkpKTsKKyAgICBGaWVsZHMucHVzaF9iYWNrKFJUVElCdWlsZGVyKENHTSkuQnVpbGRUeXBlSW5mbyhCYXNlLmdldFR5cGUoKSkpOwogCiAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSAKLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oQmFzZS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihCYXNlLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKIAogICAgIGludDY0X3QgT2Zmc2V0RmxhZ3MgPSAwOwogICAgIApAQCAtODQ0LDcgKzg1OSw3IEBACiAgICAgLy8gc3Vib2JqZWN0LiBGb3IgYSB2aXJ0dWFsIGJhc2UsIHRoaXMgaXMgdGhlIG9mZnNldCBpbiB0aGUgdmlydHVhbCB0YWJsZSBvZgogICAgIC8vIHRoZSB2aXJ0dWFsIGJhc2Ugb2Zmc2V0IGZvciB0aGUgdmlydHVhbCBiYXNlIHJlZmVyZW5jZWQgKG5lZ2F0aXZlKS4KICAgICBDaGFyVW5pdHMgT2Zmc2V0OwotICAgIGlmIChCYXNlLT5pc1ZpcnR1YWwoKSkKKyAgICBpZiAoQmFzZS5pc1ZpcnR1YWwoKSkKICAgICAgIE9mZnNldCA9IAogICAgICAgICBDR00uZ2V0SXRhbml1bVZUYWJsZUNvbnRleHQoKS5nZXRWaXJ0dWFsQmFzZU9mZnNldE9mZnNldChSRCwgQmFzZURlY2wpOwogICAgIGVsc2UgewpAQCAtODU2LDkgKzg3MSw5IEBACiAgICAgCiAgICAgLy8gVGhlIGxvdy1vcmRlciBieXRlIG9mIF9fb2Zmc2V0X2ZsYWdzIGNvbnRhaW5zIGZsYWdzLCBhcyBnaXZlbiBieSB0aGUgCiAgICAgLy8gbWFza3MgZnJvbSB0aGUgZW51bWVyYXRpb24gX19vZmZzZXRfZmxhZ3NfbWFza3MuCi0gICAgaWYgKEJhc2UtPmlzVmlydHVhbCgpKQorICAgIGlmIChCYXNlLmlzVmlydHVhbCgpKQogICAgICAgT2Zmc2V0RmxhZ3MgfD0gQkNUSV9WaXJ0dWFsOwotICAgIGlmIChCYXNlLT5nZXRBY2Nlc3NTcGVjaWZpZXIoKSA9PSBBU19wdWJsaWMpCisgICAgaWYgKEJhc2UuZ2V0QWNjZXNzU3BlY2lmaWVyKCkgPT0gQVNfcHVibGljKQogICAgICAgT2Zmc2V0RmxhZ3MgfD0gQkNUSV9QdWJsaWM7CiAKICAgICBGaWVsZHMucHVzaF9iYWNrKGxsdm06OkNvbnN0YW50SW50OjpnZXQoTG9uZ0xUeSwgT2Zmc2V0RmxhZ3MpKTsKZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHUmVjb3JkTGF5b3V0LmggYi9saWIvQ29kZUdlbi9DR1JlY29yZExheW91dC5oCmluZGV4IGIyOWZjOTguLjBmYzdiOGEgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NHUmVjb3JkTGF5b3V0LmgKKysrIGIvbGliL0NvZGVHZW4vQ0dSZWNvcmRMYXlvdXQuaApAQCAtMTMwLDcgKzEzMCw3IEBACiAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpZWxkRGVjbCAqLCBDR0JpdEZpZWxkSW5mbz4gQml0RmllbGRzOwogCiAgIC8vIEZJWE1FOiBNYXliZSB3ZSBjb3VsZCB1c2UgYSBDWFhCYXNlU3BlY2lmaWVyIGFzIHRoZSBrZXkgYW5kIHVzZSBhIHNpbmdsZQotICAvLyBtYXAgZm9yIGJvdGggdmlydHVhbCBhbmQgbm9uIHZpcnR1YWwgYmFzZXMuCisgIC8vIG1hcCBmb3IgYm90aCB2aXJ0dWFsIGFuZCBub24tdmlydHVhbCBiYXNlcy4KICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqLCB1bnNpZ25lZD4gTm9uVmlydHVhbEJhc2VzOwogCiAgIC8vLyBNYXAgZnJvbSB2aXJ0dWFsIGJhc2VzIHRvIHRoZWlyIGZpZWxkIGluZGV4IGluIHRoZSBjb21wbGV0ZSBvYmplY3QuCkBAIC0yMDEsNyArMjAxLDcgQEAKIAogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgQml0RmllbGRJbmZvIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpZWxkIEZELgogICBjb25zdCBDR0JpdEZpZWxkSW5mbyAmZ2V0Qml0RmllbGRJbmZvKGNvbnN0IEZpZWxkRGVjbCAqRkQpIGNvbnN0IHsKLSAgICBhc3NlcnQoRkQtPmlzQml0RmllbGQoKSAmJiAiSW52YWxpZCBjYWxsIGZvciBub24gYml0LWZpZWxkIGRlY2whIik7CisgICAgYXNzZXJ0KEZELT5pc0JpdEZpZWxkKCkgJiYgIkludmFsaWQgY2FsbCBmb3Igbm9uLWJpdC1maWVsZCBkZWNsISIpOwogICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IEZpZWxkRGVjbCAqLCBDR0JpdEZpZWxkSW5mbz46OmNvbnN0X2l0ZXJhdG9yCiAgICAgICBpdCA9IEJpdEZpZWxkcy5maW5kKEZEKTsKICAgICBhc3NlcnQoaXQgIT0gQml0RmllbGRzLmVuZCgpICYmICJVbmFibGUgdG8gZmluZCBiaXRmaWVsZCBpbmZvIik7CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR1JlY29yZExheW91dEJ1aWxkZXIuY3BwIGIvbGliL0NvZGVHZW4vQ0dSZWNvcmRMYXlvdXRCdWlsZGVyLmNwcAppbmRleCBhYjkyNTYzLi43NWI0NTA0IDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR1JlY29yZExheW91dEJ1aWxkZXIuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHUmVjb3JkTGF5b3V0QnVpbGRlci5jcHAKQEAgLTI1LDIwNSArMjUsNTYwIEBACiAjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKICNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIENvZGVHZW47CiAKIG5hbWVzcGFjZSB7Ci0KLWNsYXNzIENHUmVjb3JkTGF5b3V0QnVpbGRlciB7Ci1wdWJsaWM6Ci0gIC8vLyBGaWVsZFR5cGVzIC0gSG9sZHMgdGhlIExMVk0gdHlwZXMgdGhhdCB0aGUgc3RydWN0IGlzIGNyZWF0ZWQgZnJvbS4KLSAgLy8vIAorLy8vIFRoZSBDR1JlY29yZExvd2VyaW5nIGlzIHJlc3BvbnNpYmxlIGZvciBsb3dlcmluZyBhbiBBU1RSZWNvcmRMYXlvdXQgdG8gYW4KKy8vLyBsbHZtOjpUeXBlLiAgU29tZSBvZiB0aGUgbG93ZXJpbmcgaXMgc3RyYWlnaHRmb3J3YXJkLCBzb21lIGlzIG5vdC4gIEhlcmUgd2UKKy8vLyBkZXRhaWwgc29tZSBvZiB0aGUgY29tcGxleGl0aWVzIGFuZCB3ZWlyZG5lc3NlcyBoZXJlLgorLy8vICogTExWTSBkb2VzIG5vdCBoYXZlIHVuaW9ucyAtIFVuaW9ucyBjYW4sIGluIHRoZW9yeSBiZSByZXByZXNlbnRlZCBieSBhbnkKKy8vLyAgIGxsdm06OlR5cGUgd2l0aCBjb3JyZWN0IHNpemUuICBXZSBjaG9vc2UgYSBmaWVsZCB2aWEgYSBzcGVjaWZpYyBoZXVyaXN0aWMKKy8vLyAgIGFuZCBhZGQgcGFkZGluZyBpZiBuZWNlc3NhcnkuCisvLy8gKiBMTFZNIGRvZXMgbm90IGhhdmUgYml0ZmllbGRzIC0gQml0ZmllbGRzIGFyZSBjb2xsZWN0ZWQgaW50byBjb250aWd1b3VzCisvLy8gICBydW5zIGFuZCBhbGxvY2F0ZWQgYXMgYSBzaW5nbGUgc3RvcmFnZSB0eXBlIGZvciB0aGUgcnVuLiAgQVNUUmVjb3JkTGF5b3V0CisvLy8gICBjb250YWlucyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSBydW5zIGJyZWFrLiAgTWljcm9zb2Z0CisvLy8gICBhbmQgSXRhbml1bSBmb2xsb3cgZGlmZmVyZW50IHJ1bGVzIGFuZCB1c2UgZGlmZmVyZW50IGNvZGVwYXRocy4KKy8vLyAqIEl0IGlzIGRlc2lyZWQgdGhhdCwgd2hlbiBwb3NzaWJsZSwgYml0ZmllbGRzIHVzZSB0aGUgYXBwcm9wcmlhdGUgaU4gdHlwZQorLy8vICAgd2hlbiBsb3dlcmVkIHRvIGxsdm0gdHlwZXMuICBGb3IgZXhhbXBsZSB1bnNpZ25lZCB4IDogMjQgZ2V0cyBsb3dlcmVkIHRvCisvLy8gICBpMjQuICBUaGlzIGlzbid0IGFsd2F5cyBwb3NzaWJsZSBiZWNhdXNlIGkyNCBoYXMgc3RvcmFnZSBzaXplIG9mIDMyIGJpdAorLy8vICAgYW5kIGlmIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGF0IGV4dHJhIGJ5dGUgb2YgcGFkZGluZyB3ZSBtdXN0IHVzZQorLy8vICAgW2k4IHggM10gaW5zdGVhZCBvZiBpMjQuICBUaGUgZnVuY3Rpb24gY2xpcFRhaWxQYWRkaW5nIGRvZXMgdGhpcy4KKy8vLyAgIEMrKyBleGFtcGxlcyB0aGF0IHJlcXVpcmUgY2xpcHBpbmc6CisvLy8gICBzdHJ1Y3QgeyBpbnQgYSA6IDI0OyBjaGFyIGI7IH07IC8vIGEgbXVzdCBiZSBjbGlwcGVkLCBiIGdvZXMgYXQgb2Zmc2V0IDMKKy8vLyAgIHN0cnVjdCBBIHsgaW50IGEgOiAyNDsgfTsgLy8gYSBtdXN0IGJlIGNsaXBwZWQgYmVjYXVzZSBhIHN0cnVjdCBsaWtlIEIKKy8vICAgIGNvdWxkIGV4aXN0OiBzdHJ1Y3QgQiA6IEEgeyBjaGFyIGI7IH07IC8vIGIgZ29lcyBhdCBvZmZzZXQgMworLy8vICogQ2xhbmcgaWdub3JlcyAwIHNpemVkIGJpdGZpZWxkcyBhbmQgMCBzaXplZCBiYXNlcyBidXQgKm5vdCogemVybyBzaXplZAorLy8vICAgZmllbGRzLiAgVGhlIGV4aXN0aW5nIGFzc2VydHMgc3VnZ2VzdCB0aGF0IExMVk0gYXNzdW1lcyB0aGF0ICpldmVyeSogZmllbGQKKy8vLyAgIGhhcyBhbiB1bmRlcmx5aW5nIHN0b3JhZ2UgdHlwZS4gIFRoZXJlZm9yZSBlbXB0eSBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcKKy8vLyAgIHplcm8gc2l6ZWQgc3Vib2JqZWN0cyBzdWNoIGFzIGVtcHR5IHJlY29yZHMgb3IgemVybyBzaXplZCBhcnJheXMgc3RpbGwgZ2V0CisvLy8gICBhIHplcm8gc2l6ZWQgKGVtcHR5IHN0cnVjdCkgc3RvcmFnZSB0eXBlLgorLy8vICogQ2xhbmcgcmVhZHMgdGhlIGNvbXBsZXRlIHR5cGUgcmF0aGVyIHRoYW4gdGhlIGJhc2UgdHlwZSB3aGVuIGdlbmVyYXRpbmcKKy8vLyAgIGNvZGUgdG8gYWNjZXNzIGZpZWxkcy4gIEJpdGZpZWxkcyBpbiB0YWlsIHBvc2l0aW9uIHdpdGggdGFpbCBwYWRkaW5nIG1heQorLy8vICAgYmUgY2xpcHBlZCBpbiB0aGUgYmFzZSBjbGFzcyBidXQgbm90IHRoZSBjb21wbGV0ZSBjbGFzcyAod2UgbWF5IGRpc2NvdmVyCisvLy8gICB0aGF0IHRoZSB0YWlsIHBhZGRpbmcgaXMgbm90IHVzZWQgaW4gdGhlIGNvbXBsZXRlIGNsYXNzLikgSG93ZXZlciwKKy8vLyAgIGJlY2F1c2UgTExWTSByZWFkcyBmcm9tIHRoZSBjb21wbGV0ZSB0eXBlIGl0IGNhbiBnZW5lcmF0ZSBpbmNvcnJlY3QgY29kZQorLy8vICAgaWYgd2UgZG8gbm90IGNsaXAgdGhlIHRhaWwgcGFkZGluZyBvZmYgb2YgdGhlIGJpdGZpZWxkIGluIHRoZSBjb21wbGV0ZQorLy8vICAgbGF5b3V0LiAgVGhpcyBpbnRyb2R1Y2VzIGEgc29tZXdoYXQgYXdrd2FyZCBleHRyYSB1bm5lY2Vzc2FyeSBjbGlwIHN0YWdlLgorLy8vICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBjbGlwIGlzIHN0b3JlZCBpbnRlcm5hbGx5IGFzIGEgc2VudGluYWwgb2YgdHlwZQorLy8vICAgU0NJU1NPUi4gIElmIExMVk0gd2VyZSB1cGRhdGVkIHRvIHJlYWQgYmFzZSB0eXBlcyAod2hpY2ggaXQgcHJvYmFibHkKKy8vLyAgIHNob3VsZCBiZWNhdXNlIGxvY2F0aW9ucyBvZiB0aGluZ3Mgc3VjaCBhcyBWQmFzZXMgYXJlIGJvZ3VzIGluIHRoZSBsbHZtCisvLy8gICB0eXBlIGFueXdheSkgdGhlbiB3ZSBjb3VsZCBlbGltaW5hdGUgdGhlIFNDSVNTT1IuCisvLy8gKiBJdGFuaXVtIGFsbG93cyBuZWFybHkgZW1wdHkgcHJpbWFyeSB2aXJ0dWFsIGJhc2VzLiAgVGhlc2UgYmFzZXMgZG9uJ3QgZ2V0CisvLy8gICBnZXQgdGhlaXIgb3duIHN0b3JhZ2UgYmVjYXVzZSB0aGV5J3JlIGxhaWQgb3V0IGFzIHBhcnQgb2YgYW5vdGhlciBiYXNlCisvLy8gICBvciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUuICBEZXRlcm1pbmluZyBpZiBhIFZCYXNlIGFjdHVhbGx5CisvLy8gICBnZXRzIHN0b3JhZ2UgYXdrd2FyZGx5IGludm9sdmVzIGEgd2FsayBvZiBhbGwgYmFzZXMuCisvLy8gKiBWRlB0cnMgYW5kIFZCUHRycyBkbyAqbm90KiBtYWtlIGEgcmVjb3JkIE5vdFplcm9Jbml0aWFsaXphYmxlLgorc3RydWN0IENHUmVjb3JkTG93ZXJpbmcgeworICAvLyBNZW1iZXJJbmZvIGlzIGEgaGVscGVyIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcmVjb3JkCisgIC8vIG1lbWJlci4gIEluIGFkZGl0aW9uYWwgdG8gdGhlIHN0YW5kYXJkIG1lbWJlciB0eXBlcywgdGhlcmUgZXhpc3RzIGEKKyAgLy8gc2VudGluYWwgbWVtYmVyIHR5cGUgdGhhdCBlbnN1cmVzIGNvcnJlY3Qgcm91bmRpbmcuCisgIHN0cnVjdCBNZW1iZXJJbmZvIHsKKyAgICBDaGFyVW5pdHMgT2Zmc2V0OworICAgIGVudW0gSW5mb0tpbmQgeyBWRlB0ciwgVkJQdHIsIEZpZWxkLCBCYXNlLCBWQmFzZSwgU2Npc3NvciB9IEtpbmQ7CisgICAgbGx2bTo6VHlwZSAqRGF0YTsKKyAgICB1bmlvbiB7CisgICAgICBjb25zdCBGaWVsZERlY2wgKkZEOworICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQ7CisgICAgfTsKKyAgICBNZW1iZXJJbmZvKENoYXJVbml0cyBPZmZzZXQsIEluZm9LaW5kIEtpbmQsIGxsdm06OlR5cGUgKkRhdGEsCisgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlY2wgKkZEID0gMCkKKyAgICAgIDogT2Zmc2V0KE9mZnNldCksIEtpbmQoS2luZCksIERhdGEoRGF0YSksIEZEKEZEKSB7fQorICAgIE1lbWJlckluZm8oQ2hhclVuaXRzIE9mZnNldCwgSW5mb0tpbmQgS2luZCwgbGx2bTo6VHlwZSAqRGF0YSwKKyAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEKQorICAgICAgOiBPZmZzZXQoT2Zmc2V0KSwgS2luZChLaW5kKSwgRGF0YShEYXRhKSwgUkQoUkQpIHt9CisgICAgLy8gTWVtYmVySW5mb3MgYXJlIHNvcnRlZCBzbyB3ZSBkZWZpbmUgYSA8IG9wZXJhdG9yLgorICAgIGJvb2wgb3BlcmF0b3IgPChjb25zdCBNZW1iZXJJbmZvJiBhKSBjb25zdCB7IHJldHVybiBPZmZzZXQgPCBhLk9mZnNldDsgfQorICB9OworICAvLyBUaGUgY29uc3RydWN0b3IuCisgIENHUmVjb3JkTG93ZXJpbmcoQ29kZUdlblR5cGVzICZUeXBlcywgY29uc3QgUmVjb3JkRGVjbCAqRCk7CisgIC8vIFNob3J0IGhlbHBlciByb3V0aW5lcy4KKyAgLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgTWVtYmVySW5mbyBpbnN0YW5jZSBmcm9tIGFuIG9mZnNldCBhbmQgbGx2bTo6VHlwZSAqLgorICBNZW1iZXJJbmZvIFN0b3JhZ2VJbmZvKENoYXJVbml0cyBPZmZzZXQsIGxsdm06OlR5cGUgKkRhdGEpIHsKKyAgICByZXR1cm4gTWVtYmVySW5mbyhPZmZzZXQsIE1lbWJlckluZm86OkZpZWxkLCBEYXRhKTsKKyAgfQorICBib29sIHVzZU1TQUJJKCkgeworICAgIHJldHVybiBDb250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRDWFhBQkkoKS5pc01pY3Jvc29mdCgpIHx8CisgICAgICAgICAgIEQtPmlzTXNTdHJ1Y3QoQ29udGV4dCk7CisgIH0KKyAgLy8vIFxicmllZiBXcmFwcyBsbHZtOjpUeXBlOjpnZXRJbnROVHkgd2l0aCBzb21lIGltcGxpY2l0IGFyZ3VtZW50cy4KKyAgbGx2bTo6VHlwZSAqZ2V0SW50TlR5cGUodWludDY0X3QgTnVtQml0cykgeworICAgIHJldHVybiBsbHZtOjpUeXBlOjpnZXRJbnROVHkoVHlwZXMuZ2V0TExWTUNvbnRleHQoKSwKKyAgICAgICAgKHVuc2lnbmVkKWxsdm06OlJvdW5kVXBUb0FsaWdubWVudChOdW1CaXRzLCA4KSk7CisgIH0KKyAgLy8vIFxicmllZiBHZXRzIGFuIGxsdm0gdHlwZSBvZiBzaXplIE51bUJ5dGVzIGFuZCBhbGlnbm1lbnQgMS4KKyAgbGx2bTo6VHlwZSAqZ2V0Qnl0ZUFycmF5VHlwZShDaGFyVW5pdHMgTnVtQnl0ZXMpIHsKKyAgICBhc3NlcnQoIU51bUJ5dGVzLmlzWmVybygpICYmICJFbXB0eSBieXRlIGFycmF5cyBhcmVuJ3QgYWxsb3dlZC4iKTsKKyAgICBsbHZtOjpUeXBlICpUeXBlID0gbGx2bTo6VHlwZTo6Z2V0SW50OFR5KFR5cGVzLmdldExMVk1Db250ZXh0KCkpOworICAgIHJldHVybiBOdW1CeXRlcyA9PSBDaGFyVW5pdHM6Ok9uZSgpID8gVHlwZSA6CisgICAgICAgIChsbHZtOjpUeXBlICopbGx2bTo6QXJyYXlUeXBlOjpnZXQoVHlwZSwgTnVtQnl0ZXMuZ2V0UXVhbnRpdHkoKSk7CisgIH0KKyAgLy8vIFxicmllZiBHZXRzIHRoZSBzdG9yYWdlIHR5cGUgZm9yIGEgZmllbGQgZGVjbCBhbmQgaGFuZGxlcyBzdG9yYWdlCisgIC8vLyBmb3IgaXRhbml1bSBiaXRmaWVsZHMgdGhhdCBhcmUgc21hbGxlciB0aGFuIHRoZWlyIGRlY2xhcmVkIHR5cGUuCisgIGxsdm06OlR5cGUgKmdldFN0b3JhZ2VUeXBlKGNvbnN0IEZpZWxkRGVjbCAqRkQpIHsKKyAgICBsbHZtOjpUeXBlICpUeXBlID0gVHlwZXMuQ29udmVydFR5cGVGb3JNZW0oRkQtPmdldFR5cGUoKSk7CisgICAgcmV0dXJuIHVzZU1TQUJJKCkgfHwgIUZELT5pc0JpdEZpZWxkKCkgPyBUeXBlIDoKKyAgICAgICAgZ2V0SW50TlR5cGUoc3RkOjptaW4oRkQtPmdldEJpdFdpZHRoVmFsdWUoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClDb250ZXh0LnRvQml0cyhnZXRTaXplKFR5cGUpKSkpOworICB9CisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgbGx2bSBCYXNlc3Vib2JqZWN0IHR5cGUgZnJvbSBhIENYWFJlY29yZERlY2wuCisgIGxsdm06OlR5cGUgKmdldFN0b3JhZ2VUeXBlKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7CisgICAgcmV0dXJuIFR5cGVzLmdldENHUmVjb3JkTGF5b3V0KFJEKS5nZXRCYXNlU3Vib2JqZWN0TExWTVR5cGUoKTsKKyAgfQorICBDaGFyVW5pdHMgYml0c1RvQ2hhclVuaXRzKHVpbnQ2NF90IEJpdE9mZnNldCkgeworICAgIHJldHVybiBDb250ZXh0LnRvQ2hhclVuaXRzRnJvbUJpdHMoQml0T2Zmc2V0KTsKKyAgfQorICBDaGFyVW5pdHMgZ2V0U2l6ZShsbHZtOjpUeXBlICpUeXBlKSB7CisgICAgcmV0dXJuIENoYXJVbml0czo6ZnJvbVF1YW50aXR5KERhdGFMYXlvdXQuZ2V0VHlwZUFsbG9jU2l6ZShUeXBlKSk7CisgIH0KKyAgQ2hhclVuaXRzIGdldEFsaWdubWVudChsbHZtOjpUeXBlICpUeXBlKSB7CisgICAgcmV0dXJuIENoYXJVbml0czo6ZnJvbVF1YW50aXR5KERhdGFMYXlvdXQuZ2V0QUJJVHlwZUFsaWdubWVudChUeXBlKSk7CisgIH0KKyAgYm9vbCBpc1plcm9Jbml0aWFsaXphYmxlKGNvbnN0IEZpZWxkRGVjbCAqRkQpIHsKKyAgICBjb25zdCBUeXBlICpUeXBlID0gRkQtPmdldFR5cGUoKS0+Z2V0QmFzZUVsZW1lbnRUeXBlVW5zYWZlKCk7CisgICAgaWYgKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQgPSBUeXBlLT5nZXRBczxNZW1iZXJQb2ludGVyVHlwZT4oKSkKKyAgICAgIHJldHVybiBUeXBlcy5nZXRDWFhBQkkoKS5pc1plcm9Jbml0aWFsaXphYmxlKE1QVCk7CisgICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKlJUID0gVHlwZS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkKKyAgICAgIHJldHVybiBpc1plcm9Jbml0aWFsaXphYmxlKFJULT5nZXREZWNsKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgaXNaZXJvSW5pdGlhbGl6YWJsZShjb25zdCBSZWNvcmREZWNsICpSRCkgeworICAgIHJldHVybiBUeXBlcy5nZXRDR1JlY29yZExheW91dChSRCkuaXNaZXJvSW5pdGlhbGl6YWJsZSgpOworICB9CisgIHZvaWQgYXBwZW5kUGFkZGluZ0J5dGVzKENoYXJVbml0cyBTaXplKSB7CisgICAgaWYgKCFTaXplLmlzWmVybygpKQorICAgICAgRmllbGRUeXBlcy5wdXNoX2JhY2soZ2V0Qnl0ZUFycmF5VHlwZShTaXplKSk7CisgIH0KKyAgdWludDY0X3QgZ2V0RmllbGRCaXRPZmZzZXQoY29uc3QgRmllbGREZWNsICpGRCkgeworICAgIHJldHVybiBMYXlvdXQuZ2V0RmllbGRPZmZzZXQoRkQtPmdldEZpZWxkSW5kZXgoKSk7CisgIH0KKyAgLy8gTGF5b3V0IHJvdXRpbmVzLgorICB2b2lkIHNldEJpdEZpZWxkSW5mbyhjb25zdCBGaWVsZERlY2wgKkZELCBDaGFyVW5pdHMgU3RhcnRPZmZzZXQsIAorICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpUeXBlICpTdG9yYWdlVHlwZSk7CisgIC8vLyBcYnJpZWYgTG93ZXJzIGFuIEFTVFJlY29yZExheW91dCB0byBhIGxsdm0gdHlwZS4KKyAgdm9pZCBsb3dlcihib29sIE5vblZpcnR1YWxCYXNlVHlwZSk7CisgIHZvaWQgbG93ZXJVbmlvbigpOworICB2b2lkIGFjY3VtdWxhdGVGaWVsZHMoKTsKKyAgdm9pZCBhY2N1bXVsYXRlQml0RmllbGRzKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRmllbGRFbmQpOworICB2b2lkIGFjY3VtdWxhdGVCYXNlcygpOworICB2b2lkIGFjY3VtdWxhdGVWUHRycygpOworICB2b2lkIGFjY3VtdWxhdGVWQmFzZXMoKTsKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSBzZWFyY2hlcyBhbGwgb2YgdGhlIGJhc2VzIHRvIGZpbmQgb3V0IGlmIGEgdmJhc2UgaXMKKyAgLy8vIG5vdCB0aGUgcHJpbWFyeSB2YmFzZSBvZiBzb21lIGJhc2UgY2xhc3MuCisgIGJvb2wgaGFzT3duU3RvcmFnZShjb25zdCBDWFhSZWNvcmREZWNsICpEZWNsLCBjb25zdCBDWFhSZWNvcmREZWNsICpRdWVyeSk7CisgIHZvaWQgY2FsY3VsYXRlWmVyb0luaXQoKTsKKyAgLy8vIFxicmllZiBMb3dlcnMgYml0ZmllbGQgc3RvcmFnZSB0eXBlcyB0byBJOCBhcnJheXMgZm9yIGJpdGZpZWxkcyB3aXRoIHRhaWwKKyAgLy8vIHBhZGRpbmcgdGhhdCBpcyBvciBjYW4gcG90ZW50aWFsbHkgYmUgdXNlZC4KKyAgdm9pZCBjbGlwVGFpbFBhZGRpbmcoKTsKKyAgLy8vIFxicmllZiBEZXRlcm1pbmVzIGlmIHdlIG5lZWQgYSBwYWNrZWQgbGx2bSBzdHJ1Y3QuCisgIHZvaWQgZGV0ZXJtaW5lUGFja2VkKCk7CisgIC8vLyBcYnJpZWYgSW5zZXJ0cyBwYWRkaW5nIGV2ZXJ3aGVyZSBpdCdzIG5lZWRlZC4KKyAgdm9pZCBpbnNlcnRQYWRkaW5nKCk7CisgIC8vLyBcYnJpZWYgRmlsbHMgb3V0IHRoZSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIHVsdGltYXRlbHkgY29uc3VtZWQuCisgIHZvaWQgZmlsbE91dHB1dEZpZWxkcygpOworICAvLyBJbnB1dCBtZW1vaXphdGlvbiBmaWVsZHMuCisgIENvZGVHZW5UeXBlcyAmVHlwZXM7CisgIGNvbnN0IEFTVENvbnRleHQgJkNvbnRleHQ7CisgIGNvbnN0IFJlY29yZERlY2wgKkQ7CisgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEOworICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dDsKKyAgY29uc3QgbGx2bTo6RGF0YUxheW91dCAmRGF0YUxheW91dDsKKyAgLy8gSGVscGZ1bCBpbnRlcm1lZGlhdGUgZGF0YS1zdHJ1Y3R1cmVzLgorICBzdGQ6OnZlY3RvcjxNZW1iZXJJbmZvPiBNZW1iZXJzOworICAvLyBPdXRwdXQgZmllbGRzLCBjb25zdW1lZCBieSBDb2RlR2VuVHlwZXM6OkNvbXB1dGVSZWNvcmRMYXlvdXQuCiAgIFNtYWxsVmVjdG9yPGxsdm06OlR5cGUgKiwgMTY+IEZpZWxkVHlwZXM7Ci0KLSAgLy8vIEJhc2VTdWJvYmplY3RUeXBlIC0gSG9sZHMgdGhlIExMVk0gdHlwZSBmb3IgdGhlIG5vbi12aXJ0dWFsIHBhcnQKLSAgLy8vIG9mIHRoZSBzdHJ1Y3QuIEZvciBleGFtcGxlLCBjb25zaWRlcjoKLSAgLy8vCi0gIC8vLyBzdHJ1Y3QgQSB7IGludCBpOyB9OwotICAvLy8gc3RydWN0IEIgeyB2b2lkICp2OyB9OwotICAvLy8gc3RydWN0IEMgOiB2aXJ0dWFsIEEsIEIgeyB9OwotICAvLy8KLSAgLy8vIFRoZSBMTFZNIHR5cGUgb2YgQyB3aWxsIGJlCi0gIC8vLyAlc3RydWN0LkMgPSB0eXBlIHsgaTMyICguLi4pKiosICVzdHJ1Y3QuQSwgaTMyLCAlc3RydWN0LkIgfQotICAvLy8KLSAgLy8vIEFuZCB0aGUgTExWTSB0eXBlIG9mIHRoZSBub24tdmlydHVhbCBiYXNlIHN0cnVjdCB3aWxsIGJlCi0gIC8vLyAlc3RydWN0LkMuYmFzZSA9IHR5cGUgeyBpMzIgKC4uLikqKiwgJXN0cnVjdC5BLCBpMzIgfQotICAvLy8KLSAgLy8vIFRoaXMgb25seSBnZXRzIGluaXRpYWxpemVkIGlmIHRoZSBiYXNlIHN1Ym9iamVjdCB0eXBlIGlzCi0gIC8vLyBkaWZmZXJlbnQgZnJvbSB0aGUgY29tcGxldGUtb2JqZWN0IHR5cGUuCi0gIGxsdm06OlN0cnVjdFR5cGUgKkJhc2VTdWJvYmplY3RUeXBlOwotCi0gIC8vLyBGaWVsZEluZm8gLSBIb2xkcyBhIGZpZWxkIGFuZCBpdHMgY29ycmVzcG9uZGluZyBMTFZNIGZpZWxkIG51bWJlci4KICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRmllbGREZWNsICosIHVuc2lnbmVkPiBGaWVsZHM7Ci0KLSAgLy8vIEJpdEZpZWxkSW5mbyAtIEhvbGRzIGxvY2F0aW9uIGFuZCBzaXplIGluZm9ybWF0aW9uIGFib3V0IGEgYml0IGZpZWxkLgogICBsbHZtOjpEZW5zZU1hcDxjb25zdCBGaWVsZERlY2wgKiwgQ0dCaXRGaWVsZEluZm8+IEJpdEZpZWxkczsKLQogICBsbHZtOjpEZW5zZU1hcDxjb25zdCBDWFhSZWNvcmREZWNsICosIHVuc2lnbmVkPiBOb25WaXJ0dWFsQmFzZXM7CiAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IENYWFJlY29yZERlY2wgKiwgdW5zaWduZWQ+IFZpcnR1YWxCYXNlczsKLQotICAvLy8gSW5kaXJlY3RQcmltYXJ5QmFzZXMgLSBWaXJ0dWFsIGJhc2UgY2xhc3NlcywgZGlyZWN0IG9yIGluZGlyZWN0LCB0aGF0IGFyZQotICAvLy8gcHJpbWFyeSBiYXNlIGNsYXNzZXMgZm9yIHNvbWUgb3RoZXIgZGlyZWN0IG9yIGluZGlyZWN0IGJhc2UgY2xhc3MuCi0gIENYWEluZGlyZWN0UHJpbWFyeUJhc2VTZXQgSW5kaXJlY3RQcmltYXJ5QmFzZXM7Ci0KLSAgLy8vIExhaWRPdXRWaXJ0dWFsQmFzZXMgLSBBIHNldCBvZiBhbGwgbGFpZCBvdXQgdmlydHVhbCBiYXNlcywgdXNlZCB0byBhdm9pZAotICAvLy8gYXZvaWQgbGF5aW5nIG91dCB2aXJ0dWFsIGJhc2VzIG1vcmUgdGhhbiBvbmNlLgotICBsbHZtOjpTbWFsbFB0clNldDxjb25zdCBDWFhSZWNvcmREZWNsICosIDQ+IExhaWRPdXRWaXJ0dWFsQmFzZXM7Ci0gIAotICAvLy8gSXNaZXJvSW5pdGlhbGl6YWJsZSAtIFdoZXRoZXIgdGhpcyBzdHJ1Y3QgY2FuIGJlIEMrKwotICAvLy8gemVyby1pbml0aWFsaXplZCB3aXRoIGFuIExMVk0gemVyb2luaXRpYWxpemVyLgotICBib29sIElzWmVyb0luaXRpYWxpemFibGU7Ci0gIGJvb2wgSXNaZXJvSW5pdGlhbGl6YWJsZUFzQmFzZTsKLQotICAvLy8gUGFja2VkIC0gV2hldGhlciB0aGUgcmVzdWx0aW5nIExMVk0gc3RydWN0IHdpbGwgYmUgcGFja2VkIG9yIG5vdC4KLSAgYm9vbCBQYWNrZWQ7Ci0KKyAgYm9vbCBJc1plcm9Jbml0aWFsaXphYmxlIDogMTsKKyAgYm9vbCBJc1plcm9Jbml0aWFsaXphYmxlQXNCYXNlIDogMTsKKyAgYm9vbCBQYWNrZWQgOiAxOwogcHJpdmF0ZToKLSAgQ29kZUdlblR5cGVzICZUeXBlczsKLQotICAvLy8gTGFzdExhaWRPdXRCYXNlSW5mbyAtIENvbnRhaW5zIHRoZSBvZmZzZXQgYW5kIG5vbi12aXJ0dWFsIHNpemUgb2YgdGhlCi0gIC8vLyBsYXN0IGJhc2UgbGFpZCBvdXQuIFVzZWQgc28gdGhhdCB3ZSBjYW4gcmVwbGFjZSB0aGUgbGFzdCBsYWlkIG91dCBiYXNlCi0gIC8vLyB0eXBlIHdpdGggYW4gaTggYXJyYXkgaWYgbmVlZGVkLgotICBzdHJ1Y3QgTGFzdExhaWRPdXRCYXNlSW5mbyB7Ci0gICAgQ2hhclVuaXRzIE9mZnNldDsKLSAgICBDaGFyVW5pdHMgTm9uVmlydHVhbFNpemU7Ci0KLSAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiAhTm9uVmlydHVhbFNpemUuaXNaZXJvKCk7IH0KLSAgICB2b2lkIGludmFsaWRhdGUoKSB7IE5vblZpcnR1YWxTaXplID0gQ2hhclVuaXRzOjpaZXJvKCk7IH0KLSAgCi0gIH0gTGFzdExhaWRPdXRCYXNlOwotCi0gIC8vLyBBbGlnbm1lbnQgLSBDb250YWlucyB0aGUgYWxpZ25tZW50IG9mIHRoZSBSZWNvcmREZWNsLgotICBDaGFyVW5pdHMgQWxpZ25tZW50OwotCi0gIC8vLyBOZXh0RmllbGRPZmZzZXQgLSBIb2xkcyB0aGUgbmV4dCBmaWVsZCBvZmZzZXQuCi0gIENoYXJVbml0cyBOZXh0RmllbGRPZmZzZXQ7Ci0KLSAgLy8vIExheW91dFVuaW9uRmllbGQgLSBXaWxsIGxheW91dCBhIGZpZWxkIGluIGFuIHVuaW9uIGFuZCByZXR1cm4gdGhlIHR5cGUKLSAgLy8vIHRoYXQgdGhlIGZpZWxkIHdpbGwgaGF2ZS4KLSAgbGx2bTo6VHlwZSAqTGF5b3V0VW5pb25GaWVsZChjb25zdCBGaWVsZERlY2wgKkZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0KTsKLSAgCi0gIC8vLyBMYXlvdXRVbmlvbiAtIFdpbGwgbGF5b3V0IGEgdW5pb24gUmVjb3JkRGVjbC4KLSAgdm9pZCBMYXlvdXRVbmlvbihjb25zdCBSZWNvcmREZWNsICpEKTsKLQotICAvLy8gTGF5IG91dCBhIHNlcXVlbmNlIG9mIGNvbnRpZ3VvdXMgYml0ZmllbGRzLgotICBib29sIExheW91dEJpdGZpZWxkcyhjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkZpcnN0RmllbGRObywKLSAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgJkZJLAotICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGRSk7Ci0KLSAgLy8vIExheW91dEZpZWxkcyAtIHRyeSB0byBsYXlvdXQgYWxsIGZpZWxkcyBpbiB0aGUgcmVjb3JkIGRlY2wuCi0gIC8vLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIHN0cnVjdCBpcyBub3QgcGFja2VkLgotICBib29sIExheW91dEZpZWxkcyhjb25zdCBSZWNvcmREZWNsICpEKTsKLQotICAvLy8gTGF5b3V0IGEgc2luZ2xlIGJhc2UsIHZpcnR1YWwgb3Igbm9uLXZpcnR1YWwKLSAgYm9vbCBMYXlvdXRCYXNlKGNvbnN0IENYWFJlY29yZERlY2wgKmJhc2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBDR1JlY29yZExheW91dCAmYmFzZUxheW91dCwKLSAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBiYXNlT2Zmc2V0KTsKLQotICAvLy8gTGF5b3V0VmlydHVhbEJhc2UgLSBsYXlvdXQgYSBzaW5nbGUgdmlydHVhbCBiYXNlLgotICBib29sIExheW91dFZpcnR1YWxCYXNlKGNvbnN0IENYWFJlY29yZERlY2wgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIGJhc2VPZmZzZXQpOwotCi0gIC8vLyBMYXlvdXRWaXJ0dWFsQmFzZXMgLSBsYXlvdXQgdGhlIHZpcnR1YWwgYmFzZXMgb2YgYSByZWNvcmQgZGVjbC4KLSAgYm9vbCBMYXlvdXRWaXJ0dWFsQmFzZXMoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0KTsKLQotICAvLy8gTVNMYXlvdXRWaXJ0dWFsQmFzZXMgLSBsYXlvdXQgdGhlIHZpcnR1YWwgYmFzZXMgb2YgYSByZWNvcmQgZGVjbCwKLSAgLy8vIGxpa2UgTVNWQy4KLSAgYm9vbCBNU0xheW91dFZpcnR1YWxCYXNlcyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCk7Ci0gIAotICAvLy8gTGF5b3V0Tm9uVmlydHVhbEJhc2UgLSBsYXlvdXQgYSBzaW5nbGUgbm9uLXZpcnR1YWwgYmFzZS4KLSAgYm9vbCBMYXlvdXROb25WaXJ0dWFsQmFzZShjb25zdCBDWFhSZWNvcmREZWNsICpiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBiYXNlT2Zmc2V0KTsKLSAgCi0gIC8vLyBMYXlvdXROb25WaXJ0dWFsQmFzZXMgLSBsYXlvdXQgdGhlIHZpcnR1YWwgYmFzZXMgb2YgYSByZWNvcmQgZGVjbC4KLSAgYm9vbCBMYXlvdXROb25WaXJ0dWFsQmFzZXMoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCk7Ci0KLSAgLy8vIENvbXB1dGVOb25WaXJ0dWFsQmFzZVR5cGUgLSBDb21wdXRlIHRoZSBub24tdmlydHVhbCBiYXNlIGZpZWxkIHR5cGVzLgotICBib29sIENvbXB1dGVOb25WaXJ0dWFsQmFzZVR5cGUoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOwotICAKLSAgLy8vIExheW91dEZpZWxkIC0gbGF5b3V0IGEgc2luZ2xlIGZpZWxkLiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkCi0gIC8vLyBiZWNhdXNlIHRoZSBjdXJyZW50IHN0cnVjdCBpcyBub3QgcGFja2VkLgotICBib29sIExheW91dEZpZWxkKGNvbnN0IEZpZWxkRGVjbCAqRCwgdWludDY0X3QgRmllbGRPZmZzZXQpOwotCi0gIC8vLyBMYXlvdXRCaXRGaWVsZCAtIGxheW91dCBhIHNpbmdsZSBiaXQgZmllbGQuCi0gIHZvaWQgTGF5b3V0Qml0RmllbGQoY29uc3QgRmllbGREZWNsICpELCB1aW50NjRfdCBGaWVsZE9mZnNldCk7Ci0KLSAgLy8vIEFwcGVuZEZpZWxkIC0gQXBwZW5kcyBhIGZpZWxkIHdpdGggdGhlIGdpdmVuIG9mZnNldCBhbmQgdHlwZS4KLSAgdm9pZCBBcHBlbmRGaWVsZChDaGFyVW5pdHMgZmllbGRPZmZzZXQsIGxsdm06OlR5cGUgKkZpZWxkVHkpOwotCi0gIC8vLyBBcHBlbmRQYWRkaW5nIC0gQXBwZW5kcyBlbm91Z2ggcGFkZGluZyBieXRlcyBzbyB0aGF0IHRoZSB0b3RhbAotICAvLy8gc3RydWN0IHNpemUgaXMgYSBtdWx0aXBsZSBvZiB0aGUgZmllbGQgYWxpZ25tZW50LgotICB2b2lkIEFwcGVuZFBhZGRpbmcoQ2hhclVuaXRzIGZpZWxkT2Zmc2V0LCBDaGFyVW5pdHMgZmllbGRBbGlnbm1lbnQpOwotCi0gIC8vLyBSZXNpemVMYXN0QmFzZUZpZWxkSWZOZWNlc3NhcnkgLSBGaWVsZHMgYW5kIGJhc2VzIGNhbiBiZSBsYWlkIG91dCBpbiB0aGUKLSAgLy8vIHRhaWwgcGFkZGluZyBvZiBhIHByZXZpb3VzIGJhc2UuIElmIHRoaXMgaGFwcGVucywgdGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzCi0gIC8vLyBiYXNlIG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYW4gYXJyYXkgb2YgaTguIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGFzdAotICAvLy8gbGFpZCBvdXQgYmFzZSB3YXMgcmVzaXplZC4KLSAgYm9vbCBSZXNpemVMYXN0QmFzZUZpZWxkSWZOZWNlc3NhcnkoQ2hhclVuaXRzIG9mZnNldCk7Ci0KLSAgLy8vIGdldEJ5dGVBcnJheVR5cGUgLSBSZXR1cm5zIGEgYnl0ZSBhcnJheSB0eXBlIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZgotICAvLy8gZWxlbWVudHMuCi0gIGxsdm06OlR5cGUgKmdldEJ5dGVBcnJheVR5cGUoQ2hhclVuaXRzIE51bUJ5dGVzKTsKLSAgCi0gIC8vLyBBcHBlbmRCeXRlcyAtIEFwcGVuZCBhIGdpdmVuIG51bWJlciBvZiBieXRlcyB0byB0aGUgcmVjb3JkLgotICB2b2lkIEFwcGVuZEJ5dGVzKENoYXJVbml0cyBudW1CeXRlcyk7Ci0KLSAgLy8vIEFwcGVuZFRhaWxQYWRkaW5nIC0gQXBwZW5kIGVub3VnaCB0YWlsIHBhZGRpbmcgc28gdGhhdCB0aGUgdHlwZSB3aWxsIGhhdmUKLSAgLy8vIHRoZSBwYXNzZWQgc2l6ZS4KLSAgdm9pZCBBcHBlbmRUYWlsUGFkZGluZyhDaGFyVW5pdHMgUmVjb3JkU2l6ZSk7Ci0KLSAgQ2hhclVuaXRzIGdldFR5cGVBbGlnbm1lbnQobGx2bTo6VHlwZSAqVHkpIGNvbnN0OwotCi0gIC8vLyBnZXRBbGlnbm1lbnRBc0xMVk1TdHJ1Y3QgLSBSZXR1cm5zIHRoZSBtYXhpbXVtIGFsaWdubWVudCBvZiBhbGwgdGhlCi0gIC8vLyBMTFZNIGVsZW1lbnQgdHlwZXMuCi0gIENoYXJVbml0cyBnZXRBbGlnbm1lbnRBc0xMVk1TdHJ1Y3QoKSBjb25zdDsKLQotICAvLy8gQ2hlY2taZXJvSW5pdGlhbGl6YWJsZSAtIENoZWNrIGlmIHRoZSBnaXZlbiB0eXBlIGNvbnRhaW5zIGEgcG9pbnRlcgotICAvLy8gdG8gZGF0YSBtZW1iZXIuCi0gIHZvaWQgQ2hlY2taZXJvSW5pdGlhbGl6YWJsZShRdWFsVHlwZSBUKTsKLQotcHVibGljOgotICBDR1JlY29yZExheW91dEJ1aWxkZXIoQ29kZUdlblR5cGVzICZUeXBlcykKLSAgICA6IEJhc2VTdWJvYmplY3RUeXBlKDApLAotICAgICAgSXNaZXJvSW5pdGlhbGl6YWJsZSh0cnVlKSwgSXNaZXJvSW5pdGlhbGl6YWJsZUFzQmFzZSh0cnVlKSwKLSAgICAgIFBhY2tlZChmYWxzZSksIFR5cGVzKFR5cGVzKSB7IH0KLQotICAvLy8gTGF5b3V0IC0gV2lsbCBsYXlvdXQgYSBSZWNvcmREZWNsLgotICB2b2lkIExheW91dChjb25zdCBSZWNvcmREZWNsICpEKTsKKyAgQ0dSZWNvcmRMb3dlcmluZyhjb25zdCBDR1JlY29yZExvd2VyaW5nICYpIExMVk1fREVMRVRFRF9GVU5DVElPTjsKKyAgdm9pZCBvcGVyYXRvciA9KGNvbnN0IENHUmVjb3JkTG93ZXJpbmcgJikgTExWTV9ERUxFVEVEX0ZVTkNUSU9OOwogfTsKK30gLy8gbmFtZXNwYWNlIHsKIAorQ0dSZWNvcmRMb3dlcmluZzo6Q0dSZWNvcmRMb3dlcmluZyhDb2RlR2VuVHlwZXMgJlR5cGVzLCBjb25zdCBSZWNvcmREZWNsICpEKQorICA6IFR5cGVzKFR5cGVzKSwgQ29udGV4dChUeXBlcy5nZXRDb250ZXh0KCkpLCBEKEQpLAorICAgIFJEKGR5bl9jYXN0PENYWFJlY29yZERlY2w+KEQpKSwKKyAgICBMYXlvdXQoVHlwZXMuZ2V0Q29udGV4dCgpLmdldEFTVFJlY29yZExheW91dChEKSksCisgICAgRGF0YUxheW91dChUeXBlcy5nZXREYXRhTGF5b3V0KCkpLCBJc1plcm9Jbml0aWFsaXphYmxlKHRydWUpLAorICAgIElzWmVyb0luaXRpYWxpemFibGVBc0Jhc2UodHJ1ZSksIFBhY2tlZChmYWxzZSkge30KKwordm9pZCBDR1JlY29yZExvd2VyaW5nOjpzZXRCaXRGaWVsZEluZm8oCisgICAgY29uc3QgRmllbGREZWNsICpGRCwgQ2hhclVuaXRzIFN0YXJ0T2Zmc2V0LCBsbHZtOjpUeXBlICpTdG9yYWdlVHlwZSkgeworICBDR0JpdEZpZWxkSW5mbyAmSW5mbyA9IEJpdEZpZWxkc1tGRF07CisgIEluZm8uSXNTaWduZWQgPSBGRC0+Z2V0VHlwZSgpLT5pc1NpZ25lZEludGVnZXJPckVudW1lcmF0aW9uVHlwZSgpOworICBJbmZvLk9mZnNldCA9ICh1bnNpZ25lZCkoZ2V0RmllbGRCaXRPZmZzZXQoRkQpIC0gQ29udGV4dC50b0JpdHMoU3RhcnRPZmZzZXQpKTsKKyAgSW5mby5TaXplID0gRkQtPmdldEJpdFdpZHRoVmFsdWUoQ29udGV4dCk7CisgIEluZm8uU3RvcmFnZVNpemUgPSAodW5zaWduZWQpRGF0YUxheW91dC5nZXRUeXBlQWxsb2NTaXplSW5CaXRzKFN0b3JhZ2VUeXBlKTsKKyAgLy8gSGVyZSB3ZSBjYWxjdWxhdGUgdGhlIGFjdHVhbCBzdG9yYWdlIGFsaWdubWVudCBvZiB0aGUgYml0cy4gIEUuZyBpZiB3ZSd2ZQorICAvLyBnb3QgYW4gYWxpZ25tZW50ID49IDIgYW5kIHRoZSBiaXRmaWVsZCBzdGFydHMgYXQgb2Zmc2V0IDYgd2UndmUgZ290IGFuCisgIC8vIGFsaWdubWVudCBvZiAyLgorICBJbmZvLlN0b3JhZ2VBbGlnbm1lbnQgPQorICAgICAgTGF5b3V0LmdldEFsaWdubWVudCgpLmFsaWdubWVudEF0T2Zmc2V0KFN0YXJ0T2Zmc2V0KS5nZXRRdWFudGl0eSgpOworICBpZiAoSW5mby5TaXplID4gSW5mby5TdG9yYWdlU2l6ZSkKKyAgICBJbmZvLlNpemUgPSBJbmZvLlN0b3JhZ2VTaXplOworICAvLyBSZXZlcnNlIHRoZSBiaXQgb2Zmc2V0cyBmb3IgYmlnIGVuZGlhbiBtYWNoaW5lcy4gQmVjYXVzZSB3ZSByZXByZXNlbnQKKyAgLy8gYSBiaXRmaWVsZCBhcyBhIHNpbmdsZSBsYXJnZSBpbnRlZ2VyIGxvYWQsIHdlIGNhbiBpbWFnaW5lIHRoZSBiaXRzCisgIC8vIGNvdW50aW5nIGZyb20gdGhlIG1vc3Qtc2lnbmlmaWNhbnQtYml0IGluc3RlYWQgb2YgdGhlCisgIC8vIGxlYXN0LXNpZ25pZmljYW50LWJpdC4KKyAgaWYgKERhdGFMYXlvdXQuaXNCaWdFbmRpYW4oKSkKKyAgICBJbmZvLk9mZnNldCA9IEluZm8uU3RvcmFnZVNpemUgLSAoSW5mby5PZmZzZXQgKyBJbmZvLlNpemUpOwogfQogCi12b2lkIENHUmVjb3JkTGF5b3V0QnVpbGRlcjo6TGF5b3V0KGNvbnN0IFJlY29yZERlY2wgKkQpIHsKLSAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZMYXlvdXQgPSBUeXBlcy5nZXRDb250ZXh0KCkuZ2V0QVNUUmVjb3JkTGF5b3V0KEQpOwotICBBbGlnbm1lbnQgPSBMYXlvdXQuZ2V0QWxpZ25tZW50KCk7Ci0gIFBhY2tlZCA9IEQtPmhhc0F0dHI8UGFja2VkQXR0cj4oKSB8fCBMYXlvdXQuZ2V0U2l6ZSgpICUgQWxpZ25tZW50ICE9IDA7Cit2b2lkIENHUmVjb3JkTG93ZXJpbmc6Omxvd2VyKGJvb2wgTlZCYXNlVHlwZSkgeworICAvLyBUaGUgbG93ZXJpbmcgcHJvY2VzcyBpbXBsZW1lbnRlZCBpbiB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWV0eSBvZgorICAvLyBjYXJlZnVsbHkgb3JkZXJlZCBwaGFzZXMuCisgIC8vIDEpIFN0b3JlIGFsbCBtZW1iZXJzIChmaWVsZHMgYW5kIGJhc2VzKSBpbiBhIGxpc3QgYW5kIHNvcnQgdGhlbSBieSBvZmZzZXQuCisgIC8vIDIpIEFkZCBhIDEtYnl0ZSBjYXBzdG9uZSBtZW1iZXIgYXQgdGhlIFNpemUgb2YgdGhlIHN0cnVjdHVyZS4KKyAgLy8gMykgQ2xpcCBiaXRmaWVsZCBzdG9yYWdlcyBtZW1iZXJzIGlmIHRoZWlyIHRhaWwgcGFkZGluZyBpcyBvciBtaWdodCBiZQorICAvLyAgICB1c2VkIGJ5IGFub3RoZXIgZmllbGQgb3IgYmFzZS4gIFRoZSBjbGlwcGluZyBwcm9jZXNzIHVzZXMgdGhlIGNhcHN0b25lIAorICAvLyAgICBieSB0cmVhdGluZyBpdCBhcyBhbm90aGVyIG9iamVjdCB0aGF0IG9jY3VycyBhZnRlciB0aGUgcmVjb3JkLgorICAvLyA0KSBEZXRlcm1pbmUgaWYgdGhlIGxsdm0tc3RydWN0IHJlcXVpcmVzIHBhY2tpbmcuICBJdCdzIGltcG9ydGFudCB0aGF0IHRoaXMKKyAgLy8gICAgcGhhc2Ugb2NjdXIgYWZ0ZXIgY2xpcHBpbmcsIGJlY2F1c2UgY2xpcHBpbmcgY2hhbmdlcyB0aGUgbGx2bSB0eXBlLgorICAvLyAgICBUaGlzIHBoYXNlIHJlYWRzIHRoZSBvZmZzZXQgb2YgdGhlIGNhcHN0b25lIHdoZW4gZGV0ZXJtaW5pbmcgcGFja2VkbmVzcworICAvLyAgICBhbmQgdXBkYXRlcyB0aGUgYWxpZ25tZW50IG9mIHRoZSBjYXBzdG9uZSB0byBiZSBlcXVhbCBvZiB0aGUgYWxpZ25tZW50CisgIC8vICAgIG9mIHRoZSByZWNvcmQgYWZ0ZXIgZG9pbmcgc28uCisgIC8vIDUpIEluc2VydCBwYWRkaW5nIGV2ZXJ5d2hlcmUgaXQgaXMgbmVlZGVkLiAgVGhpcyBwaGFzZSByZXF1aXJlcyAnUGFja2VkJyB0bworICAvLyAgICBoYXZlIGJlZW4gY29tcHV0ZWQgYW5kIG5lZWRzIHRvIGtub3cgdGhlIGFsaWdubWVudCBvZiB0aGUgcmVjb3JkIGluCisgIC8vICAgIG9yZGVyIHRvIHVuZGVyc3RhbmQgaWYgZXhwbGljaXQgdGFpbCBwYWRkaW5nIGlzIG5lZWRlZC4KKyAgLy8gNikgUmVtb3ZlIHRoZSBjYXBzdG9uZSwgd2UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlLgorICAvLyA3KSBEZXRlcm1pbmUgaWYgdGhpcyByZWNvcmQgY2FuIGJlIHplcm8taW5pdGlhbGl6ZWQuICBUaGlzIHBoYXNlIGNvdWxkIGhhdmUKKyAgLy8gICAgYmVlbiBwbGFjZWQgYW55d2hlcmUgYWZ0ZXIgcGhhc2UgMS4KKyAgLy8gOCkgRm9ybWF0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1lbWJlcnMgaW4gYSB3YXkgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkKKyAgLy8gICAgQ29kZUdlblR5cGVzOjpDb21wdXRlUmVjb3JkTGF5b3V0LgorICBDaGFyVW5pdHMgU2l6ZSA9IE5WQmFzZVR5cGUgPyBMYXlvdXQuZ2V0Tm9uVmlydHVhbFNpemUoKSA6IExheW91dC5nZXRTaXplKCk7CisgIGlmIChELT5pc1VuaW9uKCkpCisgICAgcmV0dXJuIGxvd2VyVW5pb24oKTsKKyAgYWNjdW11bGF0ZUZpZWxkcygpOworICAvLyBSRCBpbXBsaWVzIEMrKy4KKyAgaWYgKFJEKSB7CisgICAgYWNjdW11bGF0ZVZQdHJzKCk7CisgICAgYWNjdW11bGF0ZUJhc2VzKCk7CisgICAgaWYgKE1lbWJlcnMuZW1wdHkoKSkKKyAgICAgIHJldHVybiBhcHBlbmRQYWRkaW5nQnl0ZXMoU2l6ZSk7CisgICAgaWYgKCFOVkJhc2VUeXBlKQorICAgICAgYWNjdW11bGF0ZVZCYXNlcygpOworICB9CisgIHN0ZDo6c3RhYmxlX3NvcnQoTWVtYmVycy5iZWdpbigpLCBNZW1iZXJzLmVuZCgpKTsKKyAgTWVtYmVycy5wdXNoX2JhY2soU3RvcmFnZUluZm8oU2l6ZSwgZ2V0SW50TlR5cGUoOCkpKTsKKyAgY2xpcFRhaWxQYWRkaW5nKCk7CisgIGRldGVybWluZVBhY2tlZCgpOworICBpbnNlcnRQYWRkaW5nKCk7CisgIE1lbWJlcnMucG9wX2JhY2soKTsKKyAgY2FsY3VsYXRlWmVyb0luaXQoKTsKKyAgZmlsbE91dHB1dEZpZWxkcygpOworfQogCi0gIGlmIChELT5pc1VuaW9uKCkpIHsKLSAgICBMYXlvdXRVbmlvbihEKTsKK3ZvaWQgQ0dSZWNvcmRMb3dlcmluZzo6bG93ZXJVbmlvbigpIHsKKyAgQ2hhclVuaXRzIExheW91dFNpemUgPSBMYXlvdXQuZ2V0U2l6ZSgpOworICBsbHZtOjpUeXBlICpTdG9yYWdlVHlwZSA9IDA7CisgIC8vIENvbXB1dGUgemVyby1pbml0aWFsaXphYmxlIHN0YXR1cy4KKyAgaWYgKCFELT5maWVsZF9lbXB0eSgpICYmICFpc1plcm9Jbml0aWFsaXphYmxlKCpELT5maWVsZF9iZWdpbigpKSkKKyAgICBJc1plcm9Jbml0aWFsaXphYmxlID0gSXNaZXJvSW5pdGlhbGl6YWJsZUFzQmFzZSA9IGZhbHNlOworICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGZpZWxkcyBzZXR0aW5nIGJpdEZpZWxkSW5mbyBhbmQgdGhlIEZpZWxkcyBhcnJheS4gQWxzbworICAvLyBsb2NhdGUgdGhlICJtb3N0IGFwcHJvcHJpYXRlIiBzdG9yYWdlIHR5cGUuICBUaGUgaGV1cmlzdGljIGZvciBmaW5kaW5nIHRoZQorICAvLyBzdG9yYWdlIHR5cGUgaXNuJ3QgbmVjZXNzYXJ5LCB0aGUgZmlyc3QgKG5vbi0wLWxlbmd0aC1iaXRmaWVsZCkgZmllbGQncworICAvLyB0eXBlIHdvdWxkIHdvcmsgZmluZSBhbmQgYmUgc2ltcGxlciBidXQgd291bGQgYmUgZGlmZmVyZW4gdGhhbiB3aGF0IHdlJ3ZlCisgIC8vIGJlZW4gZG9pbmcgYW5kIGNhdXNlIGxpdCB0ZXN0cyB0byBjaGFuZ2UuCisgIGZvciAoY29uc3QgYXV0byAqRmllbGQgOiBELT5maWVsZHMoKSkgeworICAgIGlmIChGaWVsZC0+aXNCaXRGaWVsZCgpKSB7CisgICAgICAvLyBTa2lwIDAgc2l6ZWQgYml0ZmllbGRzLgorICAgICAgaWYgKEZpZWxkLT5nZXRCaXRXaWR0aFZhbHVlKENvbnRleHQpID09IDApCisgICAgICAgIGNvbnRpbnVlOworICAgICAgbGx2bTo6VHlwZSAqRmllbGRUeXBlID0gZ2V0U3RvcmFnZVR5cGUoRmllbGQpOworICAgICAgaWYgKExheW91dFNpemUgPCBnZXRTaXplKEZpZWxkVHlwZSkpCisgICAgICAgIEZpZWxkVHlwZSA9IGdldEJ5dGVBcnJheVR5cGUoTGF5b3V0U2l6ZSk7CisgICAgICBzZXRCaXRGaWVsZEluZm8oRmllbGQsIENoYXJVbml0czo6WmVybygpLCBGaWVsZFR5cGUpOworICAgIH0KKyAgICBGaWVsZHNbRmllbGRdID0gMDsKKyAgICBsbHZtOjpUeXBlICpGaWVsZFR5cGUgPSBnZXRTdG9yYWdlVHlwZShGaWVsZCk7CisgICAgLy8gQ29uZGl0aW9uYWxseSB1cGRhdGUgb3VyIHN0b3JhZ2UgdHlwZSBpZiB3ZSd2ZSBnb3QgYSBuZXcgImJldHRlciIgb25lLgorICAgIGlmICghU3RvcmFnZVR5cGUgfHwKKyAgICAgICAgZ2V0QWxpZ25tZW50KEZpZWxkVHlwZSkgPiAgZ2V0QWxpZ25tZW50KFN0b3JhZ2VUeXBlKSB8fAorICAgICAgICAoZ2V0QWxpZ25tZW50KEZpZWxkVHlwZSkgPT0gZ2V0QWxpZ25tZW50KFN0b3JhZ2VUeXBlKSAmJgorICAgICAgICBnZXRTaXplKEZpZWxkVHlwZSkgPiBnZXRTaXplKFN0b3JhZ2VUeXBlKSkpCisgICAgICBTdG9yYWdlVHlwZSA9IEZpZWxkVHlwZTsKKyAgfQorICAvLyBJZiB3ZSBoYXZlIG5vIHN0b3JhZ2UgdHlwZSBqdXN0IHBhZCB0byB0aGUgYXBwcm9wcmlhdGUgc2l6ZSBhbmQgcmV0dXJuLgorICBpZiAoIVN0b3JhZ2VUeXBlKQorICAgIHJldHVybiBhcHBlbmRQYWRkaW5nQnl0ZXMoTGF5b3V0U2l6ZSk7CisgIC8vIElmIG91ciBzdG9yYWdlIHNpemUgd2FzIGJpZ2dlciB0aGFuIG91ciByZXF1aXJlZCBzaXplIChjYW4gaGFwcGVuIGluIHRoZQorICAvLyBjYXNlIG9mIHBhY2tlZCBiaXRmaWVsZHMgb24gSXRhbml1bSkgdGhlbiBqdXN0IHVzZSBhbiBJOCBhcnJheS4KKyAgaWYgKExheW91dFNpemUgPCBnZXRTaXplKFN0b3JhZ2VUeXBlKSkKKyAgICBTdG9yYWdlVHlwZSA9IGdldEJ5dGVBcnJheVR5cGUoTGF5b3V0U2l6ZSk7CisgIEZpZWxkVHlwZXMucHVzaF9iYWNrKFN0b3JhZ2VUeXBlKTsKKyAgYXBwZW5kUGFkZGluZ0J5dGVzKExheW91dFNpemUgLSBnZXRTaXplKFN0b3JhZ2VUeXBlKSk7CisgIC8vIFNldCBwYWNrZWQgaWYgd2UgbmVlZCBpdC4KKyAgaWYgKExheW91dFNpemUgJSBnZXRBbGlnbm1lbnQoU3RvcmFnZVR5cGUpKQorICAgIFBhY2tlZCA9IHRydWU7Cit9CisKK3ZvaWQgQ0dSZWNvcmRMb3dlcmluZzo6YWNjdW11bGF0ZUZpZWxkcygpIHsKKyAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGaWVsZCA9IEQtPmZpZWxkX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRFbmQgPSBELT5maWVsZF9lbmQoKTsKKyAgICBGaWVsZCAhPSBGaWVsZEVuZDspCisgICAgaWYgKEZpZWxkLT5pc0JpdEZpZWxkKCkpIHsKKyAgICAgIFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIFN0YXJ0ID0gRmllbGQ7CisgICAgICAvLyBJdGVyYXRlIHRvIGdhdGhlciB0aGUgbGlzdCBvZiBiaXRmaWVsZHMuCisgICAgICBmb3IgKCsrRmllbGQ7IEZpZWxkICE9IEZpZWxkRW5kICYmIEZpZWxkLT5pc0JpdEZpZWxkKCk7ICsrRmllbGQpOworICAgICAgYWNjdW11bGF0ZUJpdEZpZWxkcyhTdGFydCwgRmllbGQpOworICAgIH0gZWxzZSB7CisgICAgICBNZW1iZXJzLnB1c2hfYmFjayhNZW1iZXJJbmZvKAorICAgICAgICAgIGJpdHNUb0NoYXJVbml0cyhnZXRGaWVsZEJpdE9mZnNldCgqRmllbGQpKSwgTWVtYmVySW5mbzo6RmllbGQsCisgICAgICAgICAgZ2V0U3RvcmFnZVR5cGUoKkZpZWxkKSwgKkZpZWxkKSk7CisgICAgICArK0ZpZWxkOworICAgIH0KK30KKwordm9pZAorQ0dSZWNvcmRMb3dlcmluZzo6YWNjdW11bGF0ZUJpdEZpZWxkcyhSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRmllbGRFbmQpIHsKKyAgLy8gUnVuIHN0b3JlcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgY3VycmVudCBydW4gb2YgYml0ZmllbGRzLiAgRmllbGRFbmQgaXMKKyAgLy8gdXNlZCBhcyBhIHNwZWNpYWwgdmFsdWUgdG8gbm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBjdXJyZW50IHJ1bi4gIEEKKyAgLy8gYml0ZmllbGQgcnVuIGlzIGEgY29udGlndW91cyBjb2xsZWN0aW9uIG9mIGJpdGZpZWxkcyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4KKyAgLy8gdGhlIHNhbWUgc3RvcmFnZSBibG9jay4gIFplcm8tc2l6ZWQgYml0ZmllbGRzIGFuZCBiaXRmaWVsZHMgdGhhdCB3b3VsZAorICAvLyBjcm9zcyBhbiBhbGlnbm1lbnQgYm91bmRhcnkgYnJlYWsgYSBydW4gYW5kIHN0YXJ0IGEgbmV3IG9uZS4KKyAgUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgUnVuID0gRmllbGRFbmQ7CisgIC8vIFRhaWwgaXMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgYml0IG9mZiB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJ1bi4gIEl0J3MKKyAgLy8gdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIEFTVFJlY29yZExheW91dCBpcyB0cmVhdGluZyB0aGVzZSB0d28gYml0ZmllbGRzIGFzCisgIC8vIGNvbnRpZ3VvdXMuICBTdGFydEJpdE9mZnNldCBpcyBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgUnVuLgorICB1aW50NjRfdCBTdGFydEJpdE9mZnNldCwgVGFpbCA9IDA7CisgIGlmICh1c2VNU0FCSSgpKSB7CisgICAgZm9yICg7IEZpZWxkICE9IEZpZWxkRW5kOyArK0ZpZWxkKSB7CisgICAgICB1aW50NjRfdCBCaXRPZmZzZXQgPSBnZXRGaWVsZEJpdE9mZnNldCgqRmllbGQpOworICAgICAgLy8gWmVyby13aWR0aCBiaXRmaWVsZHMgZW5kIHJ1bnMuCisgICAgICBpZiAoRmllbGQtPmdldEJpdFdpZHRoVmFsdWUoQ29udGV4dCkgPT0gMCkgeworICAgICAgICBSdW4gPSBGaWVsZEVuZDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBsbHZtOjpUeXBlICpUeXBlID0gVHlwZXMuQ29udmVydFR5cGVGb3JNZW0oRmllbGQtPmdldFR5cGUoKSk7CisgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgcnVuIHlldCwgb3IgZG9uJ3QgbGl2ZSB3aXRoaW4gdGhlIHByZXZpb3VzIHJ1bidzCisgICAgICAvLyBhbGxvY2F0ZWQgc3RvcmFnZSB0aGVuIHdlIGFsbG9jYXRlIHNvbWUgc3RvcmFnZSBhbmQgc3RhcnQgYSBuZXcgcnVuLgorICAgICAgaWYgKFJ1biA9PSBGaWVsZEVuZCB8fCBCaXRPZmZzZXQgPj0gVGFpbCkgeworICAgICAgICBSdW4gPSBGaWVsZDsKKyAgICAgICAgU3RhcnRCaXRPZmZzZXQgPSBCaXRPZmZzZXQ7CisgICAgICAgIFRhaWwgPSBTdGFydEJpdE9mZnNldCArIERhdGFMYXlvdXQuZ2V0VHlwZUFsbG9jU2l6ZUluQml0cyhUeXBlKTsKKyAgICAgICAgLy8gQWRkIHRoZSBzdG9yYWdlIG1lbWJlciB0byB0aGUgcmVjb3JkLiAgVGhpcyBtdXN0IGJlIGFkZGVkIHRvIHRoZQorICAgICAgICAvLyByZWNvcmQgYmVmb3JlIHRoZSBiaXRmaWVsZCBtZW1iZXJzIHNvIHRoYXQgaXQgZ2V0cyBsYWlkIG91dCBiZWZvcmUKKyAgICAgICAgLy8gdGhlIGJpdGZpZWxkcyBpdCBjb250YWlucyBnZXQgbGFpZCBvdXQuCisgICAgICAgIE1lbWJlcnMucHVzaF9iYWNrKFN0b3JhZ2VJbmZvKGJpdHNUb0NoYXJVbml0cyhTdGFydEJpdE9mZnNldCksIFR5cGUpKTsKKyAgICAgIH0KKyAgICAgIC8vIEJpdGZpZWxkcyBnZXQgdGhlIG9mZnNldCBvZiB0aGVpciBzdG9yYWdlIGJ1dCBjb21lIGFmdGVyd2FyZCBhbmQgcmVtYWluCisgICAgICAvLyB0aGVyZSBhZnRlciBhIHN0YWJsZSBzb3J0LgorICAgICAgTWVtYmVycy5wdXNoX2JhY2soTWVtYmVySW5mbyhiaXRzVG9DaGFyVW5pdHMoU3RhcnRCaXRPZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJJbmZvOjpGaWVsZCwgMCwgKkZpZWxkKSk7CisgICAgfQogICAgIHJldHVybjsKICAgfQorICBmb3IgKDs7KSB7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gc3RhcnQgYSBuZXcgcnVuLgorICAgIGlmIChSdW4gPT0gRmllbGRFbmQpIHsKKyAgICAgIC8vIElmIHdlJ3JlIG91dCBvZiBmaWVsZHMsIHJldHVybi4KKyAgICAgIGlmIChGaWVsZCA9PSBGaWVsZEVuZCkKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBBbnkgbm9uLXplcm8tbGVuZ3RoIGJpdGZpZWxkIGNhbiBzdGFydCBhIG5ldyBydW4uCisgICAgICBpZiAoRmllbGQtPmdldEJpdFdpZHRoVmFsdWUoQ29udGV4dCkgIT0gMCkgeworICAgICAgICBSdW4gPSBGaWVsZDsKKyAgICAgICAgU3RhcnRCaXRPZmZzZXQgPSBnZXRGaWVsZEJpdE9mZnNldCgqRmllbGQpOworICAgICAgICBUYWlsID0gU3RhcnRCaXRPZmZzZXQgKyBGaWVsZC0+Z2V0Qml0V2lkdGhWYWx1ZShDb250ZXh0KTsKKyAgICAgIH0KKyAgICAgICsrRmllbGQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gQWRkIGJpdGZpZWxkcyB0byB0aGUgcnVuIGFzIGxvbmcgYXMgdGhleSBxdWFsaWZ5LgorICAgIGlmIChGaWVsZCAhPSBGaWVsZEVuZCAmJiBGaWVsZC0+Z2V0Qml0V2lkdGhWYWx1ZShDb250ZXh0KSAhPSAwICYmCisgICAgICAgIFRhaWwgPT0gZ2V0RmllbGRCaXRPZmZzZXQoKkZpZWxkKSkgeworICAgICAgVGFpbCArPSBGaWVsZC0+Z2V0Qml0V2lkdGhWYWx1ZShDb250ZXh0KTsKKyAgICAgICsrRmllbGQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gV2UndmUgaGl0IGEgYnJlYWstcG9pbnQgaW4gdGhlIHJ1biBhbmQgbmVlZCB0byBlbWl0IGEgc3RvcmFnZSBmaWVsZC4KKyAgICBsbHZtOjpUeXBlICpUeXBlID0gZ2V0SW50TlR5cGUoVGFpbCAtIFN0YXJ0Qml0T2Zmc2V0KTsKKyAgICAvLyBBZGQgdGhlIHN0b3JhZ2UgbWVtYmVyIHRvIHRoZSByZWNvcmQgYW5kIHNldCB0aGUgYml0ZmllbGQgaW5mbyBmb3IgYWxsIG9mCisgICAgLy8gdGhlIGJpdGZpZWxkcyBpbiB0aGUgcnVuLiAgQml0ZmllbGRzIGdldCB0aGUgb2Zmc2V0IG9mIHRoZWlyIHN0b3JhZ2UgYnV0CisgICAgLy8gY29tZSBhZnRlcndhcmQgYW5kIHJlbWFpbiB0aGVyZSBhZnRlciBhIHN0YWJsZSBzb3J0LgorICAgIE1lbWJlcnMucHVzaF9iYWNrKFN0b3JhZ2VJbmZvKGJpdHNUb0NoYXJVbml0cyhTdGFydEJpdE9mZnNldCksIFR5cGUpKTsKKyAgICBmb3IgKDsgUnVuICE9IEZpZWxkOyArK1J1bikKKyAgICAgIE1lbWJlcnMucHVzaF9iYWNrKE1lbWJlckluZm8oYml0c1RvQ2hhclVuaXRzKFN0YXJ0Qml0T2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVySW5mbzo6RmllbGQsIDAsICpSdW4pKTsKKyAgICBSdW4gPSBGaWVsZEVuZDsKKyAgfQorfQogCi0gIGlmIChMYXlvdXRGaWVsZHMoRCkpCit2b2lkIENHUmVjb3JkTG93ZXJpbmc6OmFjY3VtdWxhdGVCYXNlcygpIHsKKyAgLy8gSWYgd2UndmUgZ290IGEgcHJpbWFyeSB2aXJ0dWFsIGJhc2UsIHdlIG5lZWQgdG8gYWRkIGl0IHdpdGggdGhlIGJhc2VzLgorICBpZiAoTGF5b3V0LmlzUHJpbWFyeUJhc2VWaXJ0dWFsKCkpCisgICAgTWVtYmVycy5wdXNoX2JhY2soU3RvcmFnZUluZm8oCisgICAgICBDaGFyVW5pdHM6Olplcm8oKSwKKyAgICAgIGdldFN0b3JhZ2VUeXBlKExheW91dC5nZXRQcmltYXJ5QmFzZSgpKSkpOworICAvLyBBY2N1bXVsYXRlIHRoZSBub24tdmlydHVhbCBiYXNlcy4KKyAgZm9yIChjb25zdCBhdXRvICZCYXNlIDogUkQtPmJhc2VzKCkpIHsKKyAgICBpZiAoQmFzZS5pc1ZpcnR1YWwoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0gQmFzZS5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOworICAgIGlmICghQmFzZURlY2wtPmlzRW1wdHkoKSkKKyAgICAgIE1lbWJlcnMucHVzaF9iYWNrKE1lbWJlckluZm8oTGF5b3V0LmdldEJhc2VDbGFzc09mZnNldChCYXNlRGVjbCksCisgICAgICAgICAgTWVtYmVySW5mbzo6QmFzZSwgZ2V0U3RvcmFnZVR5cGUoQmFzZURlY2wpLCBCYXNlRGVjbCkpOworICB9Cit9CisKK3ZvaWQgQ0dSZWNvcmRMb3dlcmluZzo6YWNjdW11bGF0ZVZQdHJzKCkgeworICBpZiAoTGF5b3V0Lmhhc093blZGUHRyKCkpCisgICAgTWVtYmVycy5wdXNoX2JhY2soTWVtYmVySW5mbyhDaGFyVW5pdHM6Olplcm8oKSwgTWVtYmVySW5mbzo6VkZQdHIsCisgICAgICAgIGxsdm06OkZ1bmN0aW9uVHlwZTo6Z2V0KGdldEludE5UeXBlKDMyKSwgLyppc1ZhckFyZz0qL3RydWUpLT4KKyAgICAgICAgICAgIGdldFBvaW50ZXJUbygpLT5nZXRQb2ludGVyVG8oKSkpOworICBpZiAoTGF5b3V0Lmhhc093blZCUHRyKCkpCisgICAgTWVtYmVycy5wdXNoX2JhY2soTWVtYmVySW5mbyhMYXlvdXQuZ2V0VkJQdHJPZmZzZXQoKSwgTWVtYmVySW5mbzo6VkJQdHIsCisgICAgICAgIGxsdm06OlR5cGU6OmdldEludDMyUHRyVHkoVHlwZXMuZ2V0TExWTUNvbnRleHQoKSkpKTsKK30KKwordm9pZCBDR1JlY29yZExvd2VyaW5nOjphY2N1bXVsYXRlVkJhc2VzKCkgeworICBNZW1iZXJzLnB1c2hfYmFjayhNZW1iZXJJbmZvKExheW91dC5nZXROb25WaXJ0dWFsU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlckluZm86OlNjaXNzb3IsIDAsIFJEKSk7CisgIGZvciAoY29uc3QgYXV0byAmQmFzZSA6IFJELT52YmFzZXMoKSkgeworICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VEZWNsID0gQmFzZS5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOworICAgIGlmIChCYXNlRGVjbC0+aXNFbXB0eSgpKQorICAgICAgY29udGludWU7CisgICAgQ2hhclVuaXRzIE9mZnNldCA9IExheW91dC5nZXRWQmFzZUNsYXNzT2Zmc2V0KEJhc2VEZWNsKTsKKyAgICAvLyBJZiB0aGUgdmJhc2UgaXMgYSBwcmltYXJ5IHZpcnR1YWwgYmFzZSBvZiBzb21lIGJhc2UsIHRoZW4gaXQgZG9lc24ndAorICAgIC8vIGdldCBpdHMgb3duIHN0b3JhZ2UgbG9jYXRpb24gYnV0IGluc3RlYWQgbGl2ZXMgaW5zaWRlIG9mIHRoYXQgYmFzZS4KKyAgICBpZiAoIXVzZU1TQUJJKCkgJiYgQ29udGV4dC5pc05lYXJseUVtcHR5KEJhc2VEZWNsKSAmJgorICAgICAgICAhaGFzT3duU3RvcmFnZShSRCwgQmFzZURlY2wpKSB7CisgICAgICBNZW1iZXJzLnB1c2hfYmFjayhNZW1iZXJJbmZvKE9mZnNldCwgTWVtYmVySW5mbzo6VkJhc2UsIDAsIEJhc2VEZWNsKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gSWYgd2UndmUgZ290IGEgdnRvcmRpc3AsIGFkZCBpdCBhcyBhIHN0b3JhZ2UgdHlwZS4KKyAgICBpZiAoTGF5b3V0LmdldFZCYXNlT2Zmc2V0c01hcCgpLmZpbmQoQmFzZURlY2wpLT5zZWNvbmQuaGFzVnRvckRpc3AoKSkKKyAgICAgIE1lbWJlcnMucHVzaF9iYWNrKFN0b3JhZ2VJbmZvKE9mZnNldCAtIENoYXJVbml0czo6ZnJvbVF1YW50aXR5KDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50TlR5cGUoMzIpKSk7CisgICAgTWVtYmVycy5wdXNoX2JhY2soTWVtYmVySW5mbyhPZmZzZXQsIE1lbWJlckluZm86OlZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RvcmFnZVR5cGUoQmFzZURlY2wpLCBCYXNlRGVjbCkpOworICB9Cit9CisKK2Jvb2wgQ0dSZWNvcmRMb3dlcmluZzo6aGFzT3duU3RvcmFnZShjb25zdCBDWFhSZWNvcmREZWNsICpEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlF1ZXJ5KSB7CisgIGNvbnN0IEFTVFJlY29yZExheW91dCAmRGVjbExheW91dCA9IENvbnRleHQuZ2V0QVNUUmVjb3JkTGF5b3V0KERlY2wpOworICBpZiAoRGVjbExheW91dC5pc1ByaW1hcnlCYXNlVmlydHVhbCgpICYmIERlY2xMYXlvdXQuZ2V0UHJpbWFyeUJhc2UoKSA9PSBRdWVyeSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGZvciAoY29uc3QgYXV0byAmQmFzZSA6IERlY2wtPmJhc2VzKCkpCisgICAgaWYgKCFoYXNPd25TdG9yYWdlKEJhc2UuZ2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKSwgUXVlcnkpKQorICAgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDR1JlY29yZExvd2VyaW5nOjpjYWxjdWxhdGVaZXJvSW5pdCgpIHsKKyAgZm9yIChzdGQ6OnZlY3RvcjxNZW1iZXJJbmZvPjo6Y29uc3RfaXRlcmF0b3IgTWVtYmVyID0gTWVtYmVycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJFbmQgPSBNZW1iZXJzLmVuZCgpOworICAgICAgIElzWmVyb0luaXRpYWxpemFibGVBc0Jhc2UgJiYgTWVtYmVyICE9IE1lbWJlckVuZDsgKytNZW1iZXIpIHsKKyAgICBpZiAoTWVtYmVyLT5LaW5kID09IE1lbWJlckluZm86OkZpZWxkKSB7CisgICAgICBpZiAoIU1lbWJlci0+RkQgfHwgaXNaZXJvSW5pdGlhbGl6YWJsZShNZW1iZXItPkZEKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBJc1plcm9Jbml0aWFsaXphYmxlID0gSXNaZXJvSW5pdGlhbGl6YWJsZUFzQmFzZSA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoTWVtYmVyLT5LaW5kID09IE1lbWJlckluZm86OkJhc2UgfHwKKyAgICAgICAgICAgICAgIE1lbWJlci0+S2luZCA9PSBNZW1iZXJJbmZvOjpWQmFzZSkgeworICAgICAgaWYgKGlzWmVyb0luaXRpYWxpemFibGUoTWVtYmVyLT5SRCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgSXNaZXJvSW5pdGlhbGl6YWJsZSA9IGZhbHNlOworICAgICAgaWYgKE1lbWJlci0+S2luZCA9PSBNZW1iZXJJbmZvOjpCYXNlKQorICAgICAgICBJc1plcm9Jbml0aWFsaXphYmxlQXNCYXNlID0gZmFsc2U7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0dSZWNvcmRMb3dlcmluZzo6Y2xpcFRhaWxQYWRkaW5nKCkgeworICBzdGQ6OnZlY3RvcjxNZW1iZXJJbmZvPjo6aXRlcmF0b3IgUHJpb3IgPSBNZW1iZXJzLmJlZ2luKCk7CisgIENoYXJVbml0cyBUYWlsID0gZ2V0U2l6ZShQcmlvci0+RGF0YSk7CisgIGZvciAoc3RkOjp2ZWN0b3I8TWVtYmVySW5mbz46Oml0ZXJhdG9yIE1lbWJlciA9IFByaW9yICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyRW5kID0gTWVtYmVycy5lbmQoKTsKKyAgICAgICBNZW1iZXIgIT0gTWVtYmVyRW5kOyArK01lbWJlcikgeworICAgIC8vIE9ubHkgbWVtYmVycyB3aXRoIGRhdGEgYW5kIHRoZSBzY2lzc29yIGNhbiBjdXQgaW50byB0YWlsIHBhZGRpbmcuCisgICAgaWYgKCFNZW1iZXItPkRhdGEgJiYgTWVtYmVyLT5LaW5kICE9IE1lbWJlckluZm86OlNjaXNzb3IpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoTWVtYmVyLT5PZmZzZXQgPCBUYWlsKSB7CisgICAgICBhc3NlcnQoUHJpb3ItPktpbmQgPT0gTWVtYmVySW5mbzo6RmllbGQgJiYgIVByaW9yLT5GRCAmJgorICAgICAgICAgICAgICJPbmx5IHN0b3JhZ2UgZmllbGRzIGhhdmUgdGFpbCBwYWRkaW5nISIpOworICAgICAgUHJpb3ItPkRhdGEgPSBnZXRCeXRlQXJyYXlUeXBlKGJpdHNUb0NoYXJVbml0cyhsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoCisgICAgICAgICAgY2FzdDxsbHZtOjpJbnRlZ2VyVHlwZT4oUHJpb3ItPkRhdGEpLT5nZXRJbnRlZ2VyQml0V2lkdGgoKSwgOCkpKTsKKyAgICB9CisgICAgaWYgKE1lbWJlci0+RGF0YSkKKyAgICAgIFByaW9yID0gTWVtYmVyOworICAgIFRhaWwgPSBQcmlvci0+T2Zmc2V0ICsgZ2V0U2l6ZShQcmlvci0+RGF0YSk7CisgIH0KK30KKwordm9pZCBDR1JlY29yZExvd2VyaW5nOjpkZXRlcm1pbmVQYWNrZWQoKSB7CisgIENoYXJVbml0cyBBbGlnbm1lbnQgPSBDaGFyVW5pdHM6Ok9uZSgpOworICBmb3IgKHN0ZDo6dmVjdG9yPE1lbWJlckluZm8+Ojpjb25zdF9pdGVyYXRvciBNZW1iZXIgPSBNZW1iZXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlckVuZCA9IE1lbWJlcnMuZW5kKCk7CisgICAgICAgTWVtYmVyICE9IE1lbWJlckVuZDsgKytNZW1iZXIpIHsKKyAgICBpZiAoIU1lbWJlci0+RGF0YSkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIElmIGFueSBtZW1iZXIgZmFsbHMgYXQgYW4gb2Zmc2V0IHRoYXQgaXQgbm90IGEgbXVsdGlwbGUgb2YgaXRzIGFsaWdubWVudCwKKyAgICAvLyB0aGVuIHRoZSBlbnRpcmUgcmVjb3JkIG11c3QgYmUgcGFja2VkLgorICAgIGlmIChNZW1iZXItPk9mZnNldCAlIGdldEFsaWdubWVudChNZW1iZXItPkRhdGEpKQorICAgICAgUGFja2VkID0gdHJ1ZTsKKyAgICBBbGlnbm1lbnQgPSBzdGQ6Om1heChBbGlnbm1lbnQsIGdldEFsaWdubWVudChNZW1iZXItPkRhdGEpKTsKKyAgfQorICAvLyBJZiB0aGUgc2l6ZSBvZiB0aGUgcmVjb3JkICh0aGUgY2Fwc3RvbmUncyBvZmZzZXQpIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZQorICAvLyByZWNvcmQncyBhbGlnbm1lbnQsIGl0IG11c3QgYmUgcGFja2VkLgorICBpZiAoTWVtYmVycy5iYWNrKCkuT2Zmc2V0ICUgQWxpZ25tZW50KQorICAgIFBhY2tlZCA9IHRydWU7CisgIC8vIFVwZGF0ZSB0aGUgYWxpZ25tZW50IG9mIHRoZSBzZW50aW5hbC4KKyAgaWYgKCFQYWNrZWQpCisgICAgTWVtYmVycy5iYWNrKCkuRGF0YSA9IGdldEludE5UeXBlKENvbnRleHQudG9CaXRzKEFsaWdubWVudCkpOworfQorCit2b2lkIENHUmVjb3JkTG93ZXJpbmc6Omluc2VydFBhZGRpbmcoKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDaGFyVW5pdHMsIENoYXJVbml0cz4gPiBQYWRkaW5nOworICBDaGFyVW5pdHMgU2l6ZSA9IENoYXJVbml0czo6WmVybygpOworICBmb3IgKHN0ZDo6dmVjdG9yPE1lbWJlckluZm8+Ojpjb25zdF9pdGVyYXRvciBNZW1iZXIgPSBNZW1iZXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlckVuZCA9IE1lbWJlcnMuZW5kKCk7CisgICAgICAgTWVtYmVyICE9IE1lbWJlckVuZDsgKytNZW1iZXIpIHsKKyAgICBpZiAoIU1lbWJlci0+RGF0YSkKKyAgICAgIGNvbnRpbnVlOworICAgIENoYXJVbml0cyBPZmZzZXQgPSBNZW1iZXItPk9mZnNldDsKKyAgICBhc3NlcnQoT2Zmc2V0ID49IFNpemUpOworICAgIC8vIEluc2VydCBwYWRkaW5nIGlmIHdlIG5lZWQgdG8uCisgICAgaWYgKE9mZnNldCAhPSBTaXplLlJvdW5kVXBUb0FsaWdubWVudChQYWNrZWQgPyBDaGFyVW5pdHM6Ok9uZSgpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFsaWdubWVudChNZW1iZXItPkRhdGEpKSkKKyAgICAgIFBhZGRpbmcucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFNpemUsIE9mZnNldCAtIFNpemUpKTsKKyAgICBTaXplID0gT2Zmc2V0ICsgZ2V0U2l6ZShNZW1iZXItPkRhdGEpOworICB9CisgIGlmIChQYWRkaW5nLmVtcHR5KCkpCiAgICAgcmV0dXJuOworICAvLyBBZGQgdGhlIHBhZGRpbmcgdG8gdGhlIE1lbWJlcnMgbGlzdCBhbmQgc29ydCBpdC4KKyAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q2hhclVuaXRzLCBDaGFyVW5pdHM+ID46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgIFBhZCA9IFBhZGRpbmcuYmVnaW4oKSwgUGFkRW5kID0gUGFkZGluZy5lbmQoKTsKKyAgICAgICAgUGFkICE9IFBhZEVuZDsgKytQYWQpCisgICAgTWVtYmVycy5wdXNoX2JhY2soU3RvcmFnZUluZm8oUGFkLT5maXJzdCwgZ2V0Qnl0ZUFycmF5VHlwZShQYWQtPnNlY29uZCkpKTsKKyAgc3RkOjpzdGFibGVfc29ydChNZW1iZXJzLmJlZ2luKCksIE1lbWJlcnMuZW5kKCkpOworfQogCi0gIC8vIFdlIHdlcmVuJ3QgYWJsZSB0byBsYXlvdXQgdGhlIHN0cnVjdC4gVHJ5IGFnYWluIHdpdGggYSBwYWNrZWQgc3RydWN0Ci0gIFBhY2tlZCA9IHRydWU7Ci0gIExhc3RMYWlkT3V0QmFzZS5pbnZhbGlkYXRlKCk7Ci0gIE5leHRGaWVsZE9mZnNldCA9IENoYXJVbml0czo6WmVybygpOwotICBGaWVsZFR5cGVzLmNsZWFyKCk7Ci0gIEZpZWxkcy5jbGVhcigpOwotICBCaXRGaWVsZHMuY2xlYXIoKTsKLSAgTm9uVmlydHVhbEJhc2VzLmNsZWFyKCk7Ci0gIFZpcnR1YWxCYXNlcy5jbGVhcigpOwotCi0gIExheW91dEZpZWxkcyhEKTsKK3ZvaWQgQ0dSZWNvcmRMb3dlcmluZzo6ZmlsbE91dHB1dEZpZWxkcygpIHsKKyAgZm9yIChzdGQ6OnZlY3RvcjxNZW1iZXJJbmZvPjo6Y29uc3RfaXRlcmF0b3IgTWVtYmVyID0gTWVtYmVycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJFbmQgPSBNZW1iZXJzLmVuZCgpOworICAgICAgIE1lbWJlciAhPSBNZW1iZXJFbmQ7ICsrTWVtYmVyKSB7CisgICAgaWYgKE1lbWJlci0+RGF0YSkKKyAgICAgIEZpZWxkVHlwZXMucHVzaF9iYWNrKE1lbWJlci0+RGF0YSk7CisgICAgaWYgKE1lbWJlci0+S2luZCA9PSBNZW1iZXJJbmZvOjpGaWVsZCkgeworICAgICAgaWYgKE1lbWJlci0+RkQpCisgICAgICAgIEZpZWxkc1tNZW1iZXItPkZEXSA9IEZpZWxkVHlwZXMuc2l6ZSgpIC0gMTsKKyAgICAgIC8vIEEgZmllbGQgd2l0aG91dCBzdG9yYWdlIG11c3QgYmUgYSBiaXRmaWVsZC4KKyAgICAgIGlmICghTWVtYmVyLT5EYXRhKQorICAgICAgICBzZXRCaXRGaWVsZEluZm8oTWVtYmVyLT5GRCwgTWVtYmVyLT5PZmZzZXQsIEZpZWxkVHlwZXMuYmFjaygpKTsKKyAgICB9IGVsc2UgaWYgKE1lbWJlci0+S2luZCA9PSBNZW1iZXJJbmZvOjpCYXNlKQorICAgICAgTm9uVmlydHVhbEJhc2VzW01lbWJlci0+UkRdID0gRmllbGRUeXBlcy5zaXplKCkgLSAxOworICAgIGVsc2UgaWYgKE1lbWJlci0+S2luZCA9PSBNZW1iZXJJbmZvOjpWQmFzZSkKKyAgICAgIFZpcnR1YWxCYXNlc1tNZW1iZXItPlJEXSA9IEZpZWxkVHlwZXMuc2l6ZSgpIC0gMTsKKyAgfQogfQogCiBDR0JpdEZpZWxkSW5mbyBDR0JpdEZpZWxkSW5mbzo6TWFrZUluZm8oQ29kZUdlblR5cGVzICZUeXBlcywKQEAgLTIzMSw2ICs1ODYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCwgdWludDY0X3QgU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTdG9yYWdlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTdG9yYWdlQWxpZ25tZW50KSB7CisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdmVzdGlnaWFsIGZyb20gQ0dSZWNvcmRMYXlvdXRCdWlsZGVyIGRheXMgYnV0IGlzIHN0aWxsIAorICAvLyB1c2VkIGluIEdDT2JqQ1J1bnRpbWUuY3BwLiAgVGhhdCB1c2FnZSBoYXMgYSAiZml4bWUiIGF0dGFjaGVkIHRvIGl0IHRoYXQKKyAgLy8gd2hlbiBhZGRyZXNzZWQgd2lsbCBhbGxvdyBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBmdW5jdGlvbi4KICAgbGx2bTo6VHlwZSAqVHkgPSBUeXBlcy5Db252ZXJ0VHlwZUZvck1lbShGRC0+Z2V0VHlwZSgpKTsKICAgQ2hhclVuaXRzIFR5cGVTaXplSW5CeXRlcyA9CiAgICAgQ2hhclVuaXRzOjpmcm9tUXVhbnRpdHkoVHlwZXMuZ2V0RGF0YUxheW91dCgpLmdldFR5cGVBbGxvY1NpemUoVHkpKTsKQEAgLTI2Miw3MDkgKzYyMCwzMyBAQAogICByZXR1cm4gQ0dCaXRGaWVsZEluZm8oT2Zmc2V0LCBTaXplLCBJc1NpZ25lZCwgU3RvcmFnZVNpemUsIFN0b3JhZ2VBbGlnbm1lbnQpOwogfQogCi0vLy8gXGJyaWVmIExheW91dCB0aGUgcmFuZ2Ugb2YgYml0ZmllbGRzIGZyb20gQkZJIHRvIEJGRSBhcyBjb250aWd1b3VzIHN0b3JhZ2UuCi1ib29sIENHUmVjb3JkTGF5b3V0QnVpbGRlcjo6TGF5b3V0Qml0ZmllbGRzKGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRmlyc3RGaWVsZE5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciAmRkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEZFKSB7Ci0gIGFzc2VydChGSSAhPSBGRSk7Ci0gIHVpbnQ2NF90IEZpcnN0RmllbGRPZmZzZXQgPSBMYXlvdXQuZ2V0RmllbGRPZmZzZXQoRmlyc3RGaWVsZE5vKTsKLSAgdWludDY0X3QgTmV4dEZpZWxkT2Zmc2V0SW5CaXRzID0gVHlwZXMuZ2V0Q29udGV4dCgpLnRvQml0cyhOZXh0RmllbGRPZmZzZXQpOwotCi0gIHVuc2lnbmVkIENoYXJBbGlnbiA9IFR5cGVzLmdldFRhcmdldCgpLmdldENoYXJBbGlnbigpOwotICBhc3NlcnQoRmlyc3RGaWVsZE9mZnNldCAlIENoYXJBbGlnbiA9PSAwICYmCi0gICAgICAgICAiRmlyc3QgZmllbGQgb2Zmc2V0IGlzIG1pc2FsaWduZWQiKTsKLSAgQ2hhclVuaXRzIEZpcnN0RmllbGRPZmZzZXRJbkJ5dGVzCi0gICAgPSBUeXBlcy5nZXRDb250ZXh0KCkudG9DaGFyVW5pdHNGcm9tQml0cyhGaXJzdEZpZWxkT2Zmc2V0KTsKLQotICB1bnNpZ25lZCBTdG9yYWdlQWxpZ25tZW50Ci0gICAgPSBsbHZtOjpNaW5BbGlnbihBbGlnbm1lbnQuZ2V0UXVhbnRpdHkoKSwKLSAgICAgICAgICAgICAgICAgICAgIEZpcnN0RmllbGRPZmZzZXRJbkJ5dGVzLmdldFF1YW50aXR5KCkpOwotCi0gIGlmIChGaXJzdEZpZWxkT2Zmc2V0IDwgTmV4dEZpZWxkT2Zmc2V0SW5CaXRzKSB7Ci0gICAgQ2hhclVuaXRzIEZpZWxkT2Zmc2V0SW5DaGFyVW5pdHMgPQotICAgICAgVHlwZXMuZ2V0Q29udGV4dCgpLnRvQ2hhclVuaXRzRnJvbUJpdHMoRmlyc3RGaWVsZE9mZnNldCk7Ci0KLSAgICAvLyBUcnkgdG8gcmVzaXplIHRoZSBsYXN0IGJhc2UgZmllbGQuCi0gICAgaWYgKCFSZXNpemVMYXN0QmFzZUZpZWxkSWZOZWNlc3NhcnkoRmllbGRPZmZzZXRJbkNoYXJVbml0cykpCi0gICAgICBsbHZtX3VucmVhY2hhYmxlKCJXZSBtdXN0IGJlIGFibGUgdG8gcmVzaXplIHRoZSBsYXN0IGJhc2UgaWYgd2UgbmVlZCB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICJwYWNrIGJpdHMgaW50byBpdC4iKTsKLQotICAgIE5leHRGaWVsZE9mZnNldEluQml0cyA9IFR5cGVzLmdldENvbnRleHQoKS50b0JpdHMoTmV4dEZpZWxkT2Zmc2V0KTsKLSAgICBhc3NlcnQoRmlyc3RGaWVsZE9mZnNldCA+PSBOZXh0RmllbGRPZmZzZXRJbkJpdHMpOwotICB9Ci0KLSAgLy8gQXBwZW5kIHBhZGRpbmcgaWYgbmVjZXNzYXJ5LgotICBBcHBlbmRQYWRkaW5nKFR5cGVzLmdldENvbnRleHQoKS50b0NoYXJVbml0c0Zyb21CaXRzKEZpcnN0RmllbGRPZmZzZXQpLAotICAgICAgICAgICAgICAgIENoYXJVbml0czo6T25lKCkpOwotCi0gIC8vIEZpbmQgdGhlIGxhc3QgYml0ZmllbGQgaW4gYSBjb250aWd1b3VzIHJ1biBvZiBiaXRmaWVsZHMuCi0gIFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEJGSSA9IEZJOwotICB1bnNpZ25lZCBMYXN0RmllbGRObyA9IEZpcnN0RmllbGRObzsKLSAgdWludDY0X3QgTmV4dENvbnRpZ3VvdXNGaWVsZE9mZnNldCA9IEZpcnN0RmllbGRPZmZzZXQ7Ci0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRkogPSBGSTsKLSAgICAgICAoRkogIT0gRkUgJiYgKCpGSiktPmlzQml0RmllbGQoKSAmJgotICAgICAgICBOZXh0Q29udGlndW91c0ZpZWxkT2Zmc2V0ID09IExheW91dC5nZXRGaWVsZE9mZnNldChMYXN0RmllbGRObykgJiYKLSAgICAgICAgKCpGSiktPmdldEJpdFdpZHRoVmFsdWUoVHlwZXMuZ2V0Q29udGV4dCgpKSAhPSAwKTsgRkkgPSBGSisrKSB7Ci0gICAgTmV4dENvbnRpZ3VvdXNGaWVsZE9mZnNldCArPSAoKkZKKS0+Z2V0Qml0V2lkdGhWYWx1ZShUeXBlcy5nZXRDb250ZXh0KCkpOwotICAgICsrTGFzdEZpZWxkTm87Ci0KLSAgICAvLyBXZSBtdXN0IHVzZSBwYWNrZWQgc3RydWN0cyBmb3IgcGFja2VkIGZpZWxkcywgYW5kIGFsc28gdW5uYW1lZCBiaXQKLSAgICAvLyBmaWVsZHMgc2luY2UgdGhleSBkb24ndCBhZmZlY3QgdGhlIHN0cnVjdCBhbGlnbm1lbnQuCi0gICAgaWYgKCFQYWNrZWQgJiYgKCgqRkopLT5oYXNBdHRyPFBhY2tlZEF0dHI+KCkgfHwgISgqRkopLT5nZXREZWNsTmFtZSgpKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBCRkUgPSBsbHZtOjpuZXh0KEZJKTsKLSAgLS1MYXN0RmllbGRObzsKLSAgYXNzZXJ0KExhc3RGaWVsZE5vID49IEZpcnN0RmllbGRObyAmJiAiRW1wdHkgcnVuIG9mIGNvbnRpZ3VvdXMgYml0ZmllbGRzIik7Ci0gIEZpZWxkRGVjbCAqTGFzdEZEID0gKkZJOwotCi0gIC8vIEZpbmQgdGhlIGxhc3QgYml0ZmllbGQncyBvZmZzZXQsIGFkZCBpdHMgc2l6ZSwgYW5kIHJvdW5kIGl0IHVwIHRvIHRoZQotICAvLyBjaGFyYWN0ZXIgYWxpZ25tZW50IHRvIGNvbXB1dGUgdGhlIHN0b3JhZ2UgcmVxdWlyZWQuCi0gIHVpbnQ2NF90IExhc3RGaWVsZE9mZnNldCA9IExheW91dC5nZXRGaWVsZE9mZnNldChMYXN0RmllbGRObyk7Ci0gIHVpbnQ2NF90IExhc3RGaWVsZFNpemUgPSBMYXN0RkQtPmdldEJpdFdpZHRoVmFsdWUoVHlwZXMuZ2V0Q29udGV4dCgpKTsKLSAgdWludDY0X3QgVG90YWxCaXRzID0gKExhc3RGaWVsZE9mZnNldCArIExhc3RGaWVsZFNpemUpIC0gRmlyc3RGaWVsZE9mZnNldDsKLSAgQ2hhclVuaXRzIFN0b3JhZ2VCeXRlcyA9IFR5cGVzLmdldENvbnRleHQoKS50b0NoYXJVbml0c0Zyb21CaXRzKAotICAgIGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChUb3RhbEJpdHMsIENoYXJBbGlnbikpOwotICB1aW50NjRfdCBTdG9yYWdlQml0cyA9IFR5cGVzLmdldENvbnRleHQoKS50b0JpdHMoU3RvcmFnZUJ5dGVzKTsKLQotICAvLyBHcm93IHRoZSBzdG9yYWdlIHRvIGVuY29tcGFzcyBhbnkga25vd24gcGFkZGluZyBpbiB0aGUgbGF5b3V0IHdoZW4gZG9pbmcKLSAgLy8gc28gd2lsbCBtYWtlIHRoZSBzdG9yYWdlIGEgcG93ZXItb2YtdHdvLiBUaGVyZSBhcmUgdHdvIGNhc2VzIHdoZW4gd2UgY2FuCi0gIC8vIGRvIHRoaXMuIFRoZSBmaXJzdCBpcyB3aGVuIHdlIGhhdmUgYSBzdWJzZXF1ZW50IGZpZWxkIGFuZCBjYW4gd2lkZW4gdXAgdG8KLSAgLy8gaXRzIG9mZnNldC4gVGhlIHNlY29uZCBpcyB3aGVuIHRoZSBkYXRhIHNpemUgb2YgdGhlIEFTVCByZWNvcmQgbGF5b3V0IGlzCi0gIC8vIHBhc3QgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdG9yYWdlLiBUaGUgbGF0dGVyIGlzIHRydWUgd2hlbiB0aGVyZSBpcyB0YWlsCi0gIC8vIHBhZGRpbmcgb24gYSBzdHJ1Y3QgYW5kIG5vIG1lbWJlcnMgb2YgYSBzdXBlciBjbGFzcyBjYW4gYmUgcGFja2VkIGludG8gaXQuCi0gIC8vCi0gIC8vIE5vdGUgdGhhdCB3ZSB3aWRlbiB0aGUgc3RvcmFnZSBhcyBtdWNoIGFzIHBvc3NpYmxlIGhlcmUgdG8gZXhwcmVzcyB0aGUKLSAgLy8gbWF4aW11bSBsYXRpdHVkZSB0aGUgbGFuZ3VhZ2UgcHJvdmlkZXMsIGFuZCByZWx5IG9uIHRoZSBiYWNrZW5kIHRvIGxvd2VyCi0gIC8vIHRoZXNlIGluIGNvbmp1bmN0aW9uIHdpdGggc2hpZnRzIGFuZCBtYXNrcyB0byBuYXJyb3dlciBvcGVyYXRpb25zIHdoZXJlCi0gIC8vIGJlbmVmaWNpYWwuCi0gIHVpbnQ2NF90IEVuZE9mZnNldCA9IFR5cGVzLmdldENvbnRleHQoKS50b0JpdHMoTGF5b3V0LmdldERhdGFTaXplKCkpOwotICBpZiAoQkZFICE9IEZFKQotICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGZpZWxkcyB0byBiZSBsYWlkIG91dCwgdGhlIG9mZnNldCBhdCB0aGUgZW5kIG9mIHRoZQotICAgIC8vIGJpdGZpZWxkIGlzIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgZmllbGQgaW4gdGhlIHJlY29yZC4KLSAgICBFbmRPZmZzZXQgPSBMYXlvdXQuZ2V0RmllbGRPZmZzZXQoTGFzdEZpZWxkTm8gKyAxKTsKLSAgYXNzZXJ0KEVuZE9mZnNldCA+PSAoRmlyc3RGaWVsZE9mZnNldCArIFRvdGFsQml0cykgJiYKLSAgICAgICAgICJFbmQgb2Zmc2V0IGlzIG5vdCBwYXN0IHRoZSBlbmQgb2YgdGhlIGtub3duIHN0b3JhZ2UgYml0cy4iKTsKLSAgdWludDY0X3QgU3BhY2VCaXRzID0gRW5kT2Zmc2V0IC0gRmlyc3RGaWVsZE9mZnNldDsKLSAgdWludDY0X3QgTG9uZ0JpdHMgPSBUeXBlcy5nZXRUYXJnZXQoKS5nZXRMb25nV2lkdGgoKTsKLSAgdWludDY0X3QgV2lkZW5lZEJpdHMgPSAoU3RvcmFnZUJpdHMgLyBMb25nQml0cykgKiBMb25nQml0cyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6TmV4dFBvd2VyT2YyKFN0b3JhZ2VCaXRzICUgTG9uZ0JpdHMgLSAxKTsKLSAgYXNzZXJ0KFdpZGVuZWRCaXRzID49IFN0b3JhZ2VCaXRzICYmICJXaWRlbmluZyBzaHJ1bmsgdGhlIGJpdHMhIik7Ci0gIGlmIChXaWRlbmVkQml0cyA8PSBTcGFjZUJpdHMpIHsKLSAgICBTdG9yYWdlQml0cyA9IFdpZGVuZWRCaXRzOwotICAgIFN0b3JhZ2VCeXRlcyA9IFR5cGVzLmdldENvbnRleHQoKS50b0NoYXJVbml0c0Zyb21CaXRzKFN0b3JhZ2VCaXRzKTsKLSAgICBhc3NlcnQoU3RvcmFnZUJpdHMgPT0gKHVpbnQ2NF90KVR5cGVzLmdldENvbnRleHQoKS50b0JpdHMoU3RvcmFnZUJ5dGVzKSk7Ci0gIH0KLQotICB1bnNpZ25lZCBGaWVsZEluZGV4ID0gRmllbGRUeXBlcy5zaXplKCk7Ci0gIEFwcGVuZEJ5dGVzKFN0b3JhZ2VCeXRlcyk7Ci0KLSAgLy8gTm93IHdhbGsgdGhlIGJpdGZpZWxkcyBhc3NvY2lhdGluZyB0aGVtIHdpdGggdGhpcyBmaWVsZCBvZiBzdG9yYWdlIGFuZAotICAvLyBidWlsZGluZyB1cCB0aGUgYml0ZmllbGQgc3BlY2lmaWMgaW5mby4KLSAgdW5zaWduZWQgRmllbGRObyA9IEZpcnN0RmllbGRObzsKLSAgZm9yICg7IEJGSSAhPSBCRkU7ICsrQkZJLCArK0ZpZWxkTm8pIHsKLSAgICBGaWVsZERlY2wgKkZEID0gKkJGSTsKLSAgICB1aW50NjRfdCBGaWVsZE9mZnNldCA9IExheW91dC5nZXRGaWVsZE9mZnNldChGaWVsZE5vKSAtIEZpcnN0RmllbGRPZmZzZXQ7Ci0gICAgdWludDY0X3QgRmllbGRTaXplID0gRkQtPmdldEJpdFdpZHRoVmFsdWUoVHlwZXMuZ2V0Q29udGV4dCgpKTsKLSAgICBGaWVsZHNbRkRdID0gRmllbGRJbmRleDsKLSAgICBCaXRGaWVsZHNbRkRdID0gQ0dCaXRGaWVsZEluZm86Ok1ha2VJbmZvKFR5cGVzLCBGRCwgRmllbGRPZmZzZXQsIEZpZWxkU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VCaXRzLCBTdG9yYWdlQWxpZ25tZW50KTsKLSAgfQotICBGaXJzdEZpZWxkTm8gPSBMYXN0RmllbGRObzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0dSZWNvcmRMYXlvdXRCdWlsZGVyOjpMYXlvdXRGaWVsZChjb25zdCBGaWVsZERlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZmllbGRPZmZzZXQpIHsKLSAgLy8gSWYgdGhlIGZpZWxkIGlzIHBhY2tlZCwgdGhlbiB3ZSBuZWVkIGEgcGFja2VkIHN0cnVjdC4KLSAgaWYgKCFQYWNrZWQgJiYgRC0+aGFzQXR0cjxQYWNrZWRBdHRyPigpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhc3NlcnQoIUQtPmlzQml0RmllbGQoKSAmJiAiQml0ZmllbGRzIHNob3VsZCBiZSBsYWlkIG91dCBzZXBlcmF0ZWx5LiIpOwotCi0gIENoZWNrWmVyb0luaXRpYWxpemFibGUoRC0+Z2V0VHlwZSgpKTsKLQotICBhc3NlcnQoZmllbGRPZmZzZXQgJSBUeXBlcy5nZXRUYXJnZXQoKS5nZXRDaGFyV2lkdGgoKSA9PSAwCi0gICAgICAgICAmJiAiZmllbGQgb2Zmc2V0IGlzIG5vdCBvbiBhIGJ5dGUgYm91bmRhcnkhIik7Ci0gIENoYXJVbml0cyBmaWVsZE9mZnNldEluQnl0ZXMKLSAgICA9IFR5cGVzLmdldENvbnRleHQoKS50b0NoYXJVbml0c0Zyb21CaXRzKGZpZWxkT2Zmc2V0KTsKLQotICBsbHZtOjpUeXBlICpUeSA9IFR5cGVzLkNvbnZlcnRUeXBlRm9yTWVtKEQtPmdldFR5cGUoKSk7Ci0gIENoYXJVbml0cyB0eXBlQWxpZ25tZW50ID0gZ2V0VHlwZUFsaWdubWVudChUeSk7Ci0KLSAgLy8gSWYgdGhlIHR5cGUgYWxpZ25tZW50IGlzIGxhcmdlciB0aGVuIHRoZSBzdHJ1Y3QgYWxpZ25tZW50LCB3ZSBtdXN0IHVzZQotICAvLyBhIHBhY2tlZCBzdHJ1Y3QuCi0gIGlmICh0eXBlQWxpZ25tZW50ID4gQWxpZ25tZW50KSB7Ci0gICAgYXNzZXJ0KCFQYWNrZWQgJiYgIkFsaWdubWVudCBpcyB3cm9uZyBldmVuIHdpdGggcGFja2VkIHN0cnVjdCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIVBhY2tlZCkgewotICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpSVCA9IEQtPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkgewotICAgICAgY29uc3QgUmVjb3JkRGVjbCAqUkQgPSBjYXN0PFJlY29yZERlY2w+KFJULT5nZXREZWNsKCkpOwotICAgICAgaWYgKGNvbnN0IE1heEZpZWxkQWxpZ25tZW50QXR0ciAqTUZBQSA9Ci0gICAgICAgICAgICBSRC0+Z2V0QXR0cjxNYXhGaWVsZEFsaWdubWVudEF0dHI+KCkpIHsKLSAgICAgICAgaWYgKE1GQUEtPmdldEFsaWdubWVudCgpICE9IFR5cGVzLmdldENvbnRleHQoKS50b0JpdHModHlwZUFsaWdubWVudCkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFJvdW5kIHVwIHRoZSBmaWVsZCBvZmZzZXQgdG8gdGhlIGFsaWdubWVudCBvZiB0aGUgZmllbGQgdHlwZS4KLSAgQ2hhclVuaXRzIGFsaWduZWROZXh0RmllbGRPZmZzZXRJbkJ5dGVzID0KLSAgICBOZXh0RmllbGRPZmZzZXQuUm91bmRVcFRvQWxpZ25tZW50KHR5cGVBbGlnbm1lbnQpOwotCi0gIGlmIChmaWVsZE9mZnNldEluQnl0ZXMgPCBhbGlnbmVkTmV4dEZpZWxkT2Zmc2V0SW5CeXRlcykgewotICAgIC8vIFRyeSB0byByZXNpemUgdGhlIGxhc3QgYmFzZSBmaWVsZC4KLSAgICBpZiAoUmVzaXplTGFzdEJhc2VGaWVsZElmTmVjZXNzYXJ5KGZpZWxkT2Zmc2V0SW5CeXRlcykpIHsKLSAgICAgIGFsaWduZWROZXh0RmllbGRPZmZzZXRJbkJ5dGVzID0gCi0gICAgICAgIE5leHRGaWVsZE9mZnNldC5Sb3VuZFVwVG9BbGlnbm1lbnQodHlwZUFsaWdubWVudCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGZpZWxkT2Zmc2V0SW5CeXRlcyA8IGFsaWduZWROZXh0RmllbGRPZmZzZXRJbkJ5dGVzKSB7Ci0gICAgYXNzZXJ0KCFQYWNrZWQgJiYgIkNvdWxkIG5vdCBwbGFjZSBmaWVsZCBldmVuIHdpdGggcGFja2VkIHN0cnVjdCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBBcHBlbmRQYWRkaW5nKGZpZWxkT2Zmc2V0SW5CeXRlcywgdHlwZUFsaWdubWVudCk7Ci0KLSAgLy8gTm93IGFwcGVuZCB0aGUgZmllbGQuCi0gIEZpZWxkc1tEXSA9IEZpZWxkVHlwZXMuc2l6ZSgpOwotICBBcHBlbmRGaWVsZChmaWVsZE9mZnNldEluQnl0ZXMsIFR5KTsKLQotICBMYXN0TGFpZE91dEJhc2UuaW52YWxpZGF0ZSgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotbGx2bTo6VHlwZSAqCi1DR1JlY29yZExheW91dEJ1aWxkZXI6OkxheW91dFVuaW9uRmllbGQoY29uc3QgRmllbGREZWNsICpGaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCkgewotICBGaWVsZHNbRmllbGRdID0gMDsKLSAgaWYgKEZpZWxkLT5pc0JpdEZpZWxkKCkpIHsKLSAgICB1aW50NjRfdCBGaWVsZFNpemUgPSBGaWVsZC0+Z2V0Qml0V2lkdGhWYWx1ZShUeXBlcy5nZXRDb250ZXh0KCkpOwotCi0gICAgLy8gSWdub3JlIHplcm8gc2l6ZWQgYml0IGZpZWxkcy4KLSAgICBpZiAoRmllbGRTaXplID09IDApCi0gICAgICByZXR1cm4gMDsKLQotICAgIHVuc2lnbmVkIFN0b3JhZ2VCaXRzID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KAotICAgICAgRmllbGRTaXplLCBUeXBlcy5nZXRUYXJnZXQoKS5nZXRDaGFyQWxpZ24oKSk7Ci0gICAgQ2hhclVuaXRzIE51bUJ5dGVzVG9BcHBlbmQKLSAgICAgID0gVHlwZXMuZ2V0Q29udGV4dCgpLnRvQ2hhclVuaXRzRnJvbUJpdHMoU3RvcmFnZUJpdHMpOwotCi0gICAgbGx2bTo6VHlwZSAqRmllbGRUeSA9IGxsdm06OlR5cGU6OmdldEludDhUeShUeXBlcy5nZXRMTFZNQ29udGV4dCgpKTsKLSAgICBpZiAoTnVtQnl0ZXNUb0FwcGVuZCA+IENoYXJVbml0czo6T25lKCkpCi0gICAgICBGaWVsZFR5ID0gbGx2bTo6QXJyYXlUeXBlOjpnZXQoRmllbGRUeSwgTnVtQnl0ZXNUb0FwcGVuZC5nZXRRdWFudGl0eSgpKTsKLQotICAgIC8vIEFkZCB0aGUgYml0IGZpZWxkIGluZm8uCi0gICAgQml0RmllbGRzW0ZpZWxkXSA9IENHQml0RmllbGRJbmZvOjpNYWtlSW5mbyhUeXBlcywgRmllbGQsIDAsIEZpZWxkU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50LmdldFF1YW50aXR5KCkpOwotICAgIHJldHVybiBGaWVsZFR5OwotICB9Ci0KLSAgLy8gVGhpcyBpcyBhIHJlZ3VsYXIgdW5pb24gZmllbGQuCi0gIHJldHVybiBUeXBlcy5Db252ZXJ0VHlwZUZvck1lbShGaWVsZC0+Z2V0VHlwZSgpKTsKLX0KLQotdm9pZCBDR1JlY29yZExheW91dEJ1aWxkZXI6OkxheW91dFVuaW9uKGNvbnN0IFJlY29yZERlY2wgKkQpIHsKLSAgYXNzZXJ0KEQtPmlzVW5pb24oKSAmJiAiQ2FuJ3QgY2FsbCBMYXlvdXRVbmlvbiBvbiBhIG5vbi11bmlvbiByZWNvcmQhIik7Ci0KLSAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZsYXlvdXQgPSBUeXBlcy5nZXRDb250ZXh0KCkuZ2V0QVNUUmVjb3JkTGF5b3V0KEQpOwotCi0gIGxsdm06OlR5cGUgKnVuaW9uVHlwZSA9IDA7Ci0gIENoYXJVbml0cyB1bmlvblNpemUgPSBDaGFyVW5pdHM6Olplcm8oKTsKLSAgQ2hhclVuaXRzIHVuaW9uQWxpZ24gPSBDaGFyVW5pdHM6Olplcm8oKTsKLQotICBib29sIGhhc09ubHlaZXJvU2l6ZWRCaXRGaWVsZHMgPSB0cnVlOwotICBib29sIGNoZWNrZWRGaXJzdEZpZWxkWmVyb0luaXQgPSBmYWxzZTsKLQotICB1bnNpZ25lZCBmaWVsZE5vID0gMDsKLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBmaWVsZCA9IEQtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgZmllbGRFbmQgPSBELT5maWVsZF9lbmQoKTsgZmllbGQgIT0gZmllbGRFbmQ7ICsrZmllbGQsICsrZmllbGRObykgewotICAgIGFzc2VydChsYXlvdXQuZ2V0RmllbGRPZmZzZXQoZmllbGRObykgPT0gMCAmJgotICAgICAgICAgICJVbmlvbiBmaWVsZCBvZmZzZXQgZGlkIG5vdCBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHJlY29yZCEiKTsKLSAgICBsbHZtOjpUeXBlICpmaWVsZFR5cGUgPSBMYXlvdXRVbmlvbkZpZWxkKCpmaWVsZCwgbGF5b3V0KTsKLQotICAgIGlmICghZmllbGRUeXBlKQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAoZmllbGQtPmdldERlY2xOYW1lKCkgJiYgIWNoZWNrZWRGaXJzdEZpZWxkWmVyb0luaXQpIHsKLSAgICAgIENoZWNrWmVyb0luaXRpYWxpemFibGUoZmllbGQtPmdldFR5cGUoKSk7Ci0gICAgICBjaGVja2VkRmlyc3RGaWVsZFplcm9Jbml0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBoYXNPbmx5WmVyb1NpemVkQml0RmllbGRzID0gZmFsc2U7Ci0KLSAgICBDaGFyVW5pdHMgZmllbGRBbGlnbiA9IENoYXJVbml0czo6ZnJvbVF1YW50aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlcy5nZXREYXRhTGF5b3V0KCkuZ2V0QUJJVHlwZUFsaWdubWVudChmaWVsZFR5cGUpKTsKLSAgICBDaGFyVW5pdHMgZmllbGRTaXplID0gQ2hhclVuaXRzOjpmcm9tUXVhbnRpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzLmdldERhdGFMYXlvdXQoKS5nZXRUeXBlQWxsb2NTaXplKGZpZWxkVHlwZSkpOwotCi0gICAgaWYgKGZpZWxkQWxpZ24gPCB1bmlvbkFsaWduKQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAoZmllbGRBbGlnbiA+IHVuaW9uQWxpZ24gfHwgZmllbGRTaXplID4gdW5pb25TaXplKSB7Ci0gICAgICB1bmlvblR5cGUgPSBmaWVsZFR5cGU7Ci0gICAgICB1bmlvbkFsaWduID0gZmllbGRBbGlnbjsKLSAgICAgIHVuaW9uU2l6ZSA9IGZpZWxkU2l6ZTsKLSAgICB9Ci0gIH0KLQotICAvLyBOb3cgYWRkIG91ciBmaWVsZC4KLSAgaWYgKHVuaW9uVHlwZSkgewotICAgIEFwcGVuZEZpZWxkKENoYXJVbml0czo6WmVybygpLCB1bmlvblR5cGUpOwotCi0gICAgaWYgKGdldFR5cGVBbGlnbm1lbnQodW5pb25UeXBlKSA+IGxheW91dC5nZXRBbGlnbm1lbnQoKSkgewotICAgICAgLy8gV2UgbmVlZCBhIHBhY2tlZCBzdHJ1Y3QuCi0gICAgICBQYWNrZWQgPSB0cnVlOwotICAgICAgdW5pb25BbGlnbiA9IENoYXJVbml0czo6T25lKCk7Ci0gICAgfQotICB9Ci0gIGlmICh1bmlvbkFsaWduLmlzWmVybygpKSB7Ci0gICAgKHZvaWQpaGFzT25seVplcm9TaXplZEJpdEZpZWxkczsKLSAgICBhc3NlcnQoaGFzT25seVplcm9TaXplZEJpdEZpZWxkcyAmJgotICAgICAgICAgICAiMC1hbGlnbiByZWNvcmQgZGlkIG5vdCBoYXZlIGFsbCB6ZXJvLXNpemVkIGJpdC1maWVsZHMhIik7Ci0gICAgdW5pb25BbGlnbiA9IENoYXJVbml0czo6T25lKCk7Ci0gIH0KLQotICAvLyBBcHBlbmQgdGFpbCBwYWRkaW5nLgotICBDaGFyVW5pdHMgcmVjb3JkU2l6ZSA9IGxheW91dC5nZXRTaXplKCk7Ci0gIGlmIChyZWNvcmRTaXplID4gdW5pb25TaXplKQotICAgIEFwcGVuZFBhZGRpbmcocmVjb3JkU2l6ZSwgdW5pb25BbGlnbik7Ci19Ci0KLWJvb2wgQ0dSZWNvcmRMYXlvdXRCdWlsZGVyOjpMYXlvdXRCYXNlKGNvbnN0IENYWFJlY29yZERlY2wgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDR1JlY29yZExheW91dCAmYmFzZUxheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBiYXNlT2Zmc2V0KSB7Ci0gIFJlc2l6ZUxhc3RCYXNlRmllbGRJZk5lY2Vzc2FyeShiYXNlT2Zmc2V0KTsKLQotICBBcHBlbmRQYWRkaW5nKGJhc2VPZmZzZXQsIENoYXJVbml0czo6T25lKCkpOwotCi0gIGNvbnN0IEFTVFJlY29yZExheW91dCAmYmFzZUFTVExheW91dAotICAgID0gVHlwZXMuZ2V0Q29udGV4dCgpLmdldEFTVFJlY29yZExheW91dChiYXNlKTsKLQotICBMYXN0TGFpZE91dEJhc2UuT2Zmc2V0ID0gTmV4dEZpZWxkT2Zmc2V0OwotICBMYXN0TGFpZE91dEJhc2UuTm9uVmlydHVhbFNpemUgPSBiYXNlQVNUTGF5b3V0LmdldE5vblZpcnR1YWxTaXplKCk7Ci0KLSAgbGx2bTo6U3RydWN0VHlwZSAqc3Vib2JqZWN0VHlwZSA9IGJhc2VMYXlvdXQuZ2V0QmFzZVN1Ym9iamVjdExMVk1UeXBlKCk7Ci0gIGlmIChnZXRUeXBlQWxpZ25tZW50KHN1Ym9iamVjdFR5cGUpID4gQWxpZ25tZW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICBBcHBlbmRGaWVsZChiYXNlT2Zmc2V0LCBzdWJvYmplY3RUeXBlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0dSZWNvcmRMYXlvdXRCdWlsZGVyOjpMYXlvdXROb25WaXJ0dWFsQmFzZShjb25zdCBDWFhSZWNvcmREZWNsICpiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBiYXNlT2Zmc2V0KSB7Ci0gIC8vIElnbm9yZSBlbXB0eSBiYXNlcy4KLSAgaWYgKGJhc2UtPmlzRW1wdHkoKSkgcmV0dXJuIHRydWU7Ci0KLSAgY29uc3QgQ0dSZWNvcmRMYXlvdXQgJmJhc2VMYXlvdXQgPSBUeXBlcy5nZXRDR1JlY29yZExheW91dChiYXNlKTsKLSAgaWYgKElzWmVyb0luaXRpYWxpemFibGVBc0Jhc2UpIHsKLSAgICBhc3NlcnQoSXNaZXJvSW5pdGlhbGl6YWJsZSAmJgotICAgICAgICAgICAiY2xhc3MgemVyby1pbml0aWFsaXphYmxlIGFzIGJhc2UgYnV0IG5vdCBhcyBjb21wbGV0ZSBvYmplY3QiKTsKLQotICAgIElzWmVyb0luaXRpYWxpemFibGUgPSBJc1plcm9Jbml0aWFsaXphYmxlQXNCYXNlID0KLSAgICAgIGJhc2VMYXlvdXQuaXNaZXJvSW5pdGlhbGl6YWJsZUFzQmFzZSgpOwotICB9Ci0KLSAgaWYgKCFMYXlvdXRCYXNlKGJhc2UsIGJhc2VMYXlvdXQsIGJhc2VPZmZzZXQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgTm9uVmlydHVhbEJhc2VzW2Jhc2VdID0gKEZpZWxkVHlwZXMuc2l6ZSgpIC0gMSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sCi1DR1JlY29yZExheW91dEJ1aWxkZXI6OkxheW91dFZpcnR1YWxCYXNlKGNvbnN0IENYWFJlY29yZERlY2wgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBiYXNlT2Zmc2V0KSB7Ci0gIC8vIElnbm9yZSBlbXB0eSBiYXNlcy4KLSAgaWYgKGJhc2UtPmlzRW1wdHkoKSkgcmV0dXJuIHRydWU7Ci0KLSAgY29uc3QgQ0dSZWNvcmRMYXlvdXQgJmJhc2VMYXlvdXQgPSBUeXBlcy5nZXRDR1JlY29yZExheW91dChiYXNlKTsKLSAgaWYgKElzWmVyb0luaXRpYWxpemFibGUpCi0gICAgSXNaZXJvSW5pdGlhbGl6YWJsZSA9IGJhc2VMYXlvdXQuaXNaZXJvSW5pdGlhbGl6YWJsZUFzQmFzZSgpOwotCi0gIGlmICghTGF5b3V0QmFzZShiYXNlLCBiYXNlTGF5b3V0LCBiYXNlT2Zmc2V0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIFZpcnR1YWxCYXNlc1tiYXNlXSA9IChGaWVsZFR5cGVzLnNpemUoKSAtIDEpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbAotQ0dSZWNvcmRMYXlvdXRCdWlsZGVyOjpNU0xheW91dFZpcnR1YWxCYXNlcyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0KSB7Ci0gIGlmICghUkQtPmdldE51bVZCYXNlcygpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8vIFRoZSB2YmFzZXMgbGlzdCBpcyB1bmlxdWVkIGFuZCBvcmRlcmVkIGJ5IGEgZGVwdGgtZmlyc3QKLSAgLy8gdHJhdmVyc2FsLCB3aGljaCBpcyB3aGF0IHdlIG5lZWQgaGVyZS4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgIEUgPSBSRC0+dmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotCi0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSAKLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5jYXN0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKLQotICAgIENoYXJVbml0cyB2YmFzZU9mZnNldCA9IExheW91dC5nZXRWQmFzZUNsYXNzT2Zmc2V0KEJhc2VEZWNsKTsKLSAgICBpZiAoIUxheW91dFZpcnR1YWxCYXNlKEJhc2VEZWNsLCB2YmFzZU9mZnNldCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vLyBMYXlvdXRWaXJ0dWFsQmFzZXMgLSBsYXlvdXQgdGhlIG5vbi12aXJ0dWFsIGJhc2VzIG9mIGEgcmVjb3JkIGRlY2wuCi1ib29sCi1DR1JlY29yZExheW91dEJ1aWxkZXI6OkxheW91dFZpcnR1YWxCYXNlcyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0KSB7Ci0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlRGVjbCA9IAotICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihJLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7Ci0KLSAgICAvLyBXZSBvbmx5IHdhbnQgdG8gbGF5IG91dCB2aXJ0dWFsIGJhc2VzIHRoYXQgYXJlbid0IGluZGlyZWN0IHByaW1hcnkgYmFzZXMKLSAgICAvLyBvZiBzb21lIG90aGVyIGJhc2UuCi0gICAgaWYgKEktPmlzVmlydHVhbCgpICYmICFJbmRpcmVjdFByaW1hcnlCYXNlcy5jb3VudChCYXNlRGVjbCkpIHsKLSAgICAgIC8vIE9ubHkgbGF5IG91dCB0aGUgYmFzZSBvbmNlLgotICAgICAgaWYgKCFMYWlkT3V0VmlydHVhbEJhc2VzLmluc2VydChCYXNlRGVjbCkpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBDaGFyVW5pdHMgdmJhc2VPZmZzZXQgPSBMYXlvdXQuZ2V0VkJhc2VDbGFzc09mZnNldChCYXNlRGVjbCk7Ci0gICAgICBpZiAoIUxheW91dFZpcnR1YWxCYXNlKEJhc2VEZWNsLCB2YmFzZU9mZnNldCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIUJhc2VEZWNsLT5nZXROdW1WQmFzZXMoKSkgewotICAgICAgLy8gVGhpcyBiYXNlIGlzbid0IGludGVyZXN0aW5nIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgdmlydHVhbCBiYXNlcy4KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAKLSAgICBpZiAoIUxheW91dFZpcnR1YWxCYXNlcyhCYXNlRGVjbCwgTGF5b3V0KSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbAotQ0dSZWNvcmRMYXlvdXRCdWlsZGVyOjpMYXlvdXROb25WaXJ0dWFsQmFzZXMoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkxheW91dCkgewotICBjb25zdCBDWFhSZWNvcmREZWNsICpQcmltYXJ5QmFzZSA9IExheW91dC5nZXRQcmltYXJ5QmFzZSgpOwotCi0gIC8vIElmIHdlIGhhdmUgYSBwcmltYXJ5IGJhc2UsIGxheSBpdCBvdXQgZmlyc3QuCi0gIGlmIChQcmltYXJ5QmFzZSkgewotICAgIGlmICghTGF5b3V0LmlzUHJpbWFyeUJhc2VWaXJ0dWFsKCkpIHsKLSAgICAgIGlmICghTGF5b3V0Tm9uVmlydHVhbEJhc2UoUHJpbWFyeUJhc2UsIENoYXJVbml0czo6WmVybygpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIUxheW91dFZpcnR1YWxCYXNlKFByaW1hcnlCYXNlLCBDaGFyVW5pdHM6Olplcm8oKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLy8gT3RoZXJ3aXNlLCBhZGQgYSB2dGFibGUgLyB2Zi10YWJsZSBpZiB0aGUgbGF5b3V0IHNheXMgdG8gZG8gc28uCi0gIH0gZWxzZSBpZiAoTGF5b3V0Lmhhc093blZGUHRyKCkpIHsKLSAgICBsbHZtOjpUeXBlICpGdW5jdGlvblR5cGUgPQotICAgICAgbGx2bTo6RnVuY3Rpb25UeXBlOjpnZXQobGx2bTo6VHlwZTo6Z2V0SW50MzJUeShUeXBlcy5nZXRMTFZNQ29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNWYXJBcmc9Ki90cnVlKTsKLSAgICBsbHZtOjpUeXBlICpWVGFibGVUeSA9IEZ1bmN0aW9uVHlwZS0+Z2V0UG9pbnRlclRvKCk7Ci0KLSAgICBpZiAoZ2V0VHlwZUFsaWdubWVudChWVGFibGVUeSkgPiBBbGlnbm1lbnQpIHsKLSAgICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgYWxsb3cgdGhpcyB0byBoYXBwZW4gaW4gU2VtYT8KLSAgICAgIGFzc2VydCghUGFja2VkICYmICJBbGlnbm1lbnQgaXMgd3JvbmcgZXZlbiB3aXRoIHBhY2tlZCBzdHJ1Y3QhIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYXNzZXJ0KE5leHRGaWVsZE9mZnNldC5pc1plcm8oKSAmJgotICAgICAgICAgICAiVlRhYmxlIHBvaW50ZXIgbXVzdCBjb21lIGZpcnN0ISIpOwotICAgIEFwcGVuZEZpZWxkKENoYXJVbml0czo6WmVybygpLCBWVGFibGVUeS0+Z2V0UG9pbnRlclRvKCkpOwotICB9Ci0KLSAgLy8gTGF5b3V0IHRoZSBub24tdmlydHVhbCBiYXNlcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICBFID0gUkQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGlmIChJLT5pc1ZpcnR1YWwoKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZURlY2wgPSAKLSAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oSS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwotCi0gICAgLy8gV2UndmUgYWxyZWFkeSBsYWlkIG91dCB0aGUgcHJpbWFyeSBiYXNlLgotICAgIGlmIChCYXNlRGVjbCA9PSBQcmltYXJ5QmFzZSAmJiAhTGF5b3V0LmlzUHJpbWFyeUJhc2VWaXJ0dWFsKCkpCi0gICAgICBjb250aW51ZTsKLQotICAgIGlmICghTGF5b3V0Tm9uVmlydHVhbEJhc2UoQmFzZURlY2wsIExheW91dC5nZXRCYXNlQ2xhc3NPZmZzZXQoQmFzZURlY2wpKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEFkZCBhIHZiLXRhYmxlIHBvaW50ZXIgaWYgdGhlIGxheW91dCBpbnNpc3RzLgotICAgIGlmIChMYXlvdXQuaGFzT3duVkJQdHIoKSkgewotICAgIENoYXJVbml0cyBWQlB0ck9mZnNldCA9IExheW91dC5nZXRWQlB0ck9mZnNldCgpOwotICAgIGxsdm06OlR5cGUgKlZicHRyID0gbGx2bTo6VHlwZTo6Z2V0SW50MzJQdHJUeShUeXBlcy5nZXRMTFZNQ29udGV4dCgpKTsKLSAgICBBcHBlbmRQYWRkaW5nKFZCUHRyT2Zmc2V0LCBnZXRUeXBlQWxpZ25tZW50KFZicHRyKSk7Ci0gICAgQXBwZW5kRmllbGQoVkJQdHJPZmZzZXQsIFZicHRyKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sCi1DR1JlY29yZExheW91dEJ1aWxkZXI6OkNvbXB1dGVOb25WaXJ0dWFsQmFzZVR5cGUoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKLSAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZMYXlvdXQgPSBUeXBlcy5nZXRDb250ZXh0KCkuZ2V0QVNUUmVjb3JkTGF5b3V0KFJEKTsKLQotICBDaGFyVW5pdHMgTm9uVmlydHVhbFNpemUgID0gTGF5b3V0LmdldE5vblZpcnR1YWxTaXplKCk7Ci0gIENoYXJVbml0cyBOb25WaXJ0dWFsQWxpZ24gPSBMYXlvdXQuZ2V0Tm9uVmlydHVhbEFsaWduKCk7Ci0gIENoYXJVbml0cyBBbGlnbmVkTm9uVmlydHVhbFR5cGVTaXplID0KLSAgICBOb25WaXJ0dWFsU2l6ZS5Sb3VuZFVwVG9BbGlnbm1lbnQoTm9uVmlydHVhbEFsaWduKTsKLSAgCi0gIC8vIEZpcnN0IGNoZWNrIGlmIHdlIGNhbiB1c2UgdGhlIHNhbWUgZmllbGRzIGFzIGZvciB0aGUgY29tcGxldGUgY2xhc3MuCi0gIENoYXJVbml0cyBSZWNvcmRTaXplID0gTGF5b3V0LmdldFNpemUoKTsKLSAgaWYgKEFsaWduZWROb25WaXJ0dWFsVHlwZVNpemUgPT0gUmVjb3JkU2l6ZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvLyBDaGVjayBpZiB3ZSBuZWVkIHBhZGRpbmcuCi0gIENoYXJVbml0cyBBbGlnbmVkTmV4dEZpZWxkT2Zmc2V0ID0KLSAgICBOZXh0RmllbGRPZmZzZXQuUm91bmRVcFRvQWxpZ25tZW50KGdldEFsaWdubWVudEFzTExWTVN0cnVjdCgpKTsKLQotICBpZiAoQWxpZ25lZE5leHRGaWVsZE9mZnNldCA+IEFsaWduZWROb25WaXJ0dWFsVHlwZVNpemUpIHsKLSAgICBhc3NlcnQoIVBhY2tlZCAmJiAiY2Fubm90IGxheW91dCBldmVuIGFzIHBhY2tlZCBzdHJ1Y3QiKTsKLSAgICByZXR1cm4gZmFsc2U7IC8vIE5lZWRzIHBhY2tpbmcuCi0gIH0KLQotICBib29sIG5lZWRzUGFkZGluZyA9IChBbGlnbmVkTm9uVmlydHVhbFR5cGVTaXplICE9IEFsaWduZWROZXh0RmllbGRPZmZzZXQpOwotICBpZiAobmVlZHNQYWRkaW5nKSB7Ci0gICAgQ2hhclVuaXRzIE51bUJ5dGVzID0gQWxpZ25lZE5vblZpcnR1YWxUeXBlU2l6ZSAtIEFsaWduZWROZXh0RmllbGRPZmZzZXQ7Ci0gICAgRmllbGRUeXBlcy5wdXNoX2JhY2soZ2V0Qnl0ZUFycmF5VHlwZShOdW1CeXRlcykpOwotICB9Ci0gIAotICBCYXNlU3Vib2JqZWN0VHlwZSA9IGxsdm06OlN0cnVjdFR5cGU6OmNyZWF0ZShUeXBlcy5nZXRMTFZNQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFR5cGVzLCAiIiwgUGFja2VkKTsKLSAgVHlwZXMuYWRkUmVjb3JkVHlwZU5hbWUoUkQsIEJhc2VTdWJvYmplY3RUeXBlLCAiLmJhc2UiKTsKLQotICAvLyBQdWxsIHRoZSBwYWRkaW5nIGJhY2sgb2ZmLgotICBpZiAobmVlZHNQYWRkaW5nKQotICAgIEZpZWxkVHlwZXMucG9wX2JhY2soKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDR1JlY29yZExheW91dEJ1aWxkZXI6OkxheW91dEZpZWxkcyhjb25zdCBSZWNvcmREZWNsICpEKSB7Ci0gIGFzc2VydCghRC0+aXNVbmlvbigpICYmICJDYW4ndCBjYWxsIExheW91dEZpZWxkcyBvbiBhIHVuaW9uISIpOwotICBhc3NlcnQoIUFsaWdubWVudC5pc1plcm8oKSAmJiAiRGlkIG5vdCBzZXQgYWxpZ25tZW50ISIpOwotCi0gIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0ID0gVHlwZXMuZ2V0Q29udGV4dCgpLmdldEFTVFJlY29yZExheW91dChEKTsKLQotICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IGR5bl9jYXN0PENYWFJlY29yZERlY2w+KEQpOwotICBpZiAoUkQpCi0gICAgaWYgKCFMYXlvdXROb25WaXJ0dWFsQmFzZXMoUkQsIExheW91dCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdW5zaWduZWQgRmllbGRObyA9IDA7Ci0gIAotICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEZJID0gRC0+ZmllbGRfYmVnaW4oKSwgRkUgPSBELT5maWVsZF9lbmQoKTsKLSAgICAgICBGSSAhPSBGRTsgKytGSSwgKytGaWVsZE5vKSB7Ci0gICAgRmllbGREZWNsICpGRCA9ICpGSTsKLQotICAgIC8vIElmIHRoaXMgZmllbGQgaXMgYSBiaXRmaWVsZCwgbGF5b3V0IGFsbCBvZiB0aGUgY29uc2VjdXRpdmUKLSAgICAvLyBub24temVyby1sZW5ndGggYml0ZmllbGRzIGFuZCB0aGUgbGFzdCB6ZXJvLWxlbmd0aCBiaXRmaWVsZDsgdGhlc2Ugd2lsbAotICAgIC8vIGFsbCBzaGFyZSBzdG9yYWdlLgotICAgIGlmIChGRC0+aXNCaXRGaWVsZCgpKSB7Ci0gICAgICAvLyBJZiBhbGwgd2UgaGF2ZSBpcyBhIHplcm8td2lkdGggYml0ZmllbGQsIHNraXAgaXQuCi0gICAgICBpZiAoRkQtPmdldEJpdFdpZHRoVmFsdWUoVHlwZXMuZ2V0Q29udGV4dCgpKSA9PSAwKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgLy8gTGF5b3V0IHRoaXMgcmFuZ2Ugb2YgYml0ZmllbGRzLgotICAgICAgaWYgKCFMYXlvdXRCaXRmaWVsZHMoTGF5b3V0LCBGaWVsZE5vLCBGSSwgRkUpKSB7Ci0gICAgICAgIGFzc2VydCghUGFja2VkICYmCi0gICAgICAgICAgICAgICAiQ291bGQgbm90IGxheW91dCBiaXRmaWVsZHMgZXZlbiB3aXRoIGEgcGFja2VkIExMVk0gc3RydWN0ISIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBhc3NlcnQoRkkgIT0gRkUgJiYgIkFkdmFuY2VkIHBhc3QgdGhlIGxhc3QgYml0ZmllbGQiKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmICghTGF5b3V0RmllbGQoRkQsIExheW91dC5nZXRGaWVsZE9mZnNldChGaWVsZE5vKSkpIHsKLSAgICAgIGFzc2VydCghUGFja2VkICYmCi0gICAgICAgICAgICAgIkNvdWxkIG5vdCBsYXlvdXQgZmllbGRzIGV2ZW4gd2l0aCBhIHBhY2tlZCBMTFZNIHN0cnVjdCEiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoUkQpIHsKLSAgICAvLyBXZSd2ZSBsYWlkIG91dCB0aGUgbm9uLXZpcnR1YWwgYmFzZXMgYW5kIHRoZSBmaWVsZHMsIG5vdyBjb21wdXRlIHRoZQotICAgIC8vIG5vbi12aXJ0dWFsIGJhc2UgZmllbGQgdHlwZXMuCi0gICAgaWYgKCFDb21wdXRlTm9uVmlydHVhbEJhc2VUeXBlKFJEKSkgewotICAgICAgYXNzZXJ0KCFQYWNrZWQgJiYgIkNvdWxkIG5vdCBsYXlvdXQgZXZlbiB3aXRoIGEgcGFja2VkIExMVk0gc3RydWN0ISIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIExheSBvdXQgdGhlIHZpcnR1YWwgYmFzZXMuICBUaGUgTVMgQUJJIHVzZXMgYSBkaWZmZXJlbnQKLSAgICAvLyBhbGdvcml0aG0gaGVyZSBkdWUgdG8gdGhlIGxhY2sgb2YgcHJpbWFyeSB2aXJ0dWFsIGJhc2VzLgotICAgIGlmIChUeXBlcy5nZXRUYXJnZXQoKS5nZXRDWFhBQkkoKS5oYXNQcmltYXJ5VkJhc2VzKCkpIHsKLSAgICAgIFJELT5nZXRJbmRpcmVjdFByaW1hcnlCYXNlcyhJbmRpcmVjdFByaW1hcnlCYXNlcyk7Ci0gICAgICBpZiAoTGF5b3V0LmlzUHJpbWFyeUJhc2VWaXJ0dWFsKCkpCi0gICAgICAgIEluZGlyZWN0UHJpbWFyeUJhc2VzLmluc2VydChMYXlvdXQuZ2V0UHJpbWFyeUJhc2UoKSk7Ci0KLSAgICAgIGlmICghTGF5b3V0VmlydHVhbEJhc2VzKFJELCBMYXlvdXQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghTVNMYXlvdXRWaXJ0dWFsQmFzZXMoUkQsIExheW91dCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8vIEFwcGVuZCB0YWlsIHBhZGRpbmcgaWYgbmVjZXNzYXJ5LgotICBBcHBlbmRUYWlsUGFkZGluZyhMYXlvdXQuZ2V0U2l6ZSgpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDR1JlY29yZExheW91dEJ1aWxkZXI6OkFwcGVuZFRhaWxQYWRkaW5nKENoYXJVbml0cyBSZWNvcmRTaXplKSB7Ci0gIFJlc2l6ZUxhc3RCYXNlRmllbGRJZk5lY2Vzc2FyeShSZWNvcmRTaXplKTsKLQotICBhc3NlcnQoTmV4dEZpZWxkT2Zmc2V0IDw9IFJlY29yZFNpemUgJiYgIlNpemUgbWlzbWF0Y2ghIik7Ci0KLSAgQ2hhclVuaXRzIEFsaWduZWROZXh0RmllbGRPZmZzZXQgPQotICAgIE5leHRGaWVsZE9mZnNldC5Sb3VuZFVwVG9BbGlnbm1lbnQoZ2V0QWxpZ25tZW50QXNMTFZNU3RydWN0KCkpOwotCi0gIGlmIChBbGlnbmVkTmV4dEZpZWxkT2Zmc2V0ID09IFJlY29yZFNpemUpIHsKLSAgICAvLyBXZSBkb24ndCBuZWVkIGFueSBwYWRkaW5nLgotICAgIHJldHVybjsKLSAgfQotCi0gIENoYXJVbml0cyBOdW1QYWRCeXRlcyA9IFJlY29yZFNpemUgLSBOZXh0RmllbGRPZmZzZXQ7Ci0gIEFwcGVuZEJ5dGVzKE51bVBhZEJ5dGVzKTsKLX0KLQotdm9pZCBDR1JlY29yZExheW91dEJ1aWxkZXI6OkFwcGVuZEZpZWxkKENoYXJVbml0cyBmaWVsZE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpUeXBlICpmaWVsZFR5cGUpIHsKLSAgQ2hhclVuaXRzIGZpZWxkU2l6ZSA9Ci0gICAgQ2hhclVuaXRzOjpmcm9tUXVhbnRpdHkoVHlwZXMuZ2V0RGF0YUxheW91dCgpLmdldFR5cGVBbGxvY1NpemUoZmllbGRUeXBlKSk7Ci0KLSAgRmllbGRUeXBlcy5wdXNoX2JhY2soZmllbGRUeXBlKTsKLQotICBOZXh0RmllbGRPZmZzZXQgPSBmaWVsZE9mZnNldCArIGZpZWxkU2l6ZTsKLX0KLQotdm9pZCBDR1JlY29yZExheW91dEJ1aWxkZXI6OkFwcGVuZFBhZGRpbmcoQ2hhclVuaXRzIGZpZWxkT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIGZpZWxkQWxpZ25tZW50KSB7Ci0gIGFzc2VydChOZXh0RmllbGRPZmZzZXQgPD0gZmllbGRPZmZzZXQgJiYKLSAgICAgICAgICJJbmNvcnJlY3QgZmllbGQgbGF5b3V0ISIpOwotCi0gIC8vIERvIG5vdGhpbmcgaWYgd2UncmUgYWxyZWFkeSBhdCB0aGUgcmlnaHQgb2Zmc2V0LgotICBpZiAoZmllbGRPZmZzZXQgPT0gTmV4dEZpZWxkT2Zmc2V0KSByZXR1cm47Ci0KLSAgLy8gSWYgd2UncmUgbm90IGVtaXR0aW5nIGEgcGFja2VkIExMVk0gdHlwZSwgdHJ5IHRvIGF2b2lkIGFkZGluZwotICAvLyB1bm5lY2Vzc2FyeSBwYWRkaW5nIGZpZWxkcy4KLSAgaWYgKCFQYWNrZWQpIHsKLSAgICAvLyBSb3VuZCB1cCB0aGUgZmllbGQgb2Zmc2V0IHRvIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGZpZWxkIHR5cGUuCi0gICAgQ2hhclVuaXRzIGFsaWduZWROZXh0RmllbGRPZmZzZXQgPQotICAgICAgTmV4dEZpZWxkT2Zmc2V0LlJvdW5kVXBUb0FsaWdubWVudChmaWVsZEFsaWdubWVudCk7Ci0gICAgYXNzZXJ0KGFsaWduZWROZXh0RmllbGRPZmZzZXQgPD0gZmllbGRPZmZzZXQpOwotCi0gICAgLy8gSWYgdGhhdCdzIHRoZSByaWdodCBvZmZzZXQsIHdlJ3JlIGRvbmUuCi0gICAgaWYgKGFsaWduZWROZXh0RmllbGRPZmZzZXQgPT0gZmllbGRPZmZzZXQpIHJldHVybjsKLSAgfQotCi0gIC8vIE90aGVyd2lzZSB3ZSBuZWVkIGV4cGxpY2l0IHBhZGRpbmcuCi0gIENoYXJVbml0cyBwYWRkaW5nID0gZmllbGRPZmZzZXQgLSBOZXh0RmllbGRPZmZzZXQ7Ci0gIEFwcGVuZEJ5dGVzKHBhZGRpbmcpOwotfQotCi1ib29sIENHUmVjb3JkTGF5b3V0QnVpbGRlcjo6UmVzaXplTGFzdEJhc2VGaWVsZElmTmVjZXNzYXJ5KENoYXJVbml0cyBvZmZzZXQpIHsKLSAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGJhc2UgdG8gcmVzaXplLgotICBpZiAoIUxhc3RMYWlkT3V0QmFzZS5pc1ZhbGlkKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFRoaXMgb2Zmc2V0IGRvZXMgbm90IG92ZXJsYXAgd2l0aCB0aGUgdGFpbCBwYWRkaW5nLgotICBpZiAob2Zmc2V0ID49IE5leHRGaWVsZE9mZnNldCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gUmVzdG9yZSB0aGUgZmllbGQgb2Zmc2V0IGFuZCBhcHBlbmQgYW4gaTggYXJyYXkgaW5zdGVhZC4KLSAgRmllbGRUeXBlcy5wb3BfYmFjaygpOwotICBOZXh0RmllbGRPZmZzZXQgPSBMYXN0TGFpZE91dEJhc2UuT2Zmc2V0OwotICBBcHBlbmRCeXRlcyhMYXN0TGFpZE91dEJhc2UuTm9uVmlydHVhbFNpemUpOwotICBMYXN0TGFpZE91dEJhc2UuaW52YWxpZGF0ZSgpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1sbHZtOjpUeXBlICpDR1JlY29yZExheW91dEJ1aWxkZXI6OmdldEJ5dGVBcnJheVR5cGUoQ2hhclVuaXRzIG51bUJ5dGVzKSB7Ci0gIGFzc2VydCghbnVtQnl0ZXMuaXNaZXJvKCkgJiYgIkVtcHR5IGJ5dGUgYXJyYXlzIGFyZW4ndCBhbGxvd2VkLiIpOwotCi0gIGxsdm06OlR5cGUgKlR5ID0gbGx2bTo6VHlwZTo6Z2V0SW50OFR5KFR5cGVzLmdldExMVk1Db250ZXh0KCkpOwotICBpZiAobnVtQnl0ZXMgPiBDaGFyVW5pdHM6Ok9uZSgpKQotICAgIFR5ID0gbGx2bTo6QXJyYXlUeXBlOjpnZXQoVHksIG51bUJ5dGVzLmdldFF1YW50aXR5KCkpOwotCi0gIHJldHVybiBUeTsKLX0KLQotdm9pZCBDR1JlY29yZExheW91dEJ1aWxkZXI6OkFwcGVuZEJ5dGVzKENoYXJVbml0cyBudW1CeXRlcykgewotICBpZiAobnVtQnl0ZXMuaXNaZXJvKCkpCi0gICAgcmV0dXJuOwotCi0gIC8vIEFwcGVuZCB0aGUgcGFkZGluZyBmaWVsZAotICBBcHBlbmRGaWVsZChOZXh0RmllbGRPZmZzZXQsIGdldEJ5dGVBcnJheVR5cGUobnVtQnl0ZXMpKTsKLX0KLQotQ2hhclVuaXRzIENHUmVjb3JkTGF5b3V0QnVpbGRlcjo6Z2V0VHlwZUFsaWdubWVudChsbHZtOjpUeXBlICpUeSkgY29uc3QgewotICBpZiAoUGFja2VkKQotICAgIHJldHVybiBDaGFyVW5pdHM6Ok9uZSgpOwotCi0gIHJldHVybiBDaGFyVW5pdHM6OmZyb21RdWFudGl0eShUeXBlcy5nZXREYXRhTGF5b3V0KCkuZ2V0QUJJVHlwZUFsaWdubWVudChUeSkpOwotfQotCi1DaGFyVW5pdHMgQ0dSZWNvcmRMYXlvdXRCdWlsZGVyOjpnZXRBbGlnbm1lbnRBc0xMVk1TdHJ1Y3QoKSBjb25zdCB7Ci0gIGlmIChQYWNrZWQpCi0gICAgcmV0dXJuIENoYXJVbml0czo6T25lKCk7Ci0KLSAgQ2hhclVuaXRzIG1heEFsaWdubWVudCA9IENoYXJVbml0czo6T25lKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IEZpZWxkVHlwZXMuc2l6ZSgpOyArK2kpCi0gICAgbWF4QWxpZ25tZW50ID0gc3RkOjptYXgobWF4QWxpZ25tZW50LCBnZXRUeXBlQWxpZ25tZW50KEZpZWxkVHlwZXNbaV0pKTsKLQotICByZXR1cm4gbWF4QWxpZ25tZW50OwotfQotCi0vLy8gTWVyZ2UgaW4gd2hldGhlciBhIGZpZWxkIG9mIHRoZSBnaXZlbiB0eXBlIGlzIHplcm8taW5pdGlhbGl6YWJsZS4KLXZvaWQgQ0dSZWNvcmRMYXlvdXRCdWlsZGVyOjpDaGVja1plcm9Jbml0aWFsaXphYmxlKFF1YWxUeXBlIFQpIHsKLSAgLy8gVGhpcyByZWNvcmQgYWxyZWFkeSBjb250YWlucyBhIG1lbWJlciBwb2ludGVyLgotICBpZiAoIUlzWmVyb0luaXRpYWxpemFibGVBc0Jhc2UpCi0gICAgcmV0dXJuOwotCi0gIC8vIENhbiBvbmx5IGhhdmUgbWVtYmVyIHBvaW50ZXJzIGlmIHdlJ3JlIGNvbXBpbGluZyBDKysuCi0gIGlmICghVHlwZXMuZ2V0Q29udGV4dCgpLmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKQotICAgIHJldHVybjsKLQotICBjb25zdCBUeXBlICplbGVtZW50VHlwZSA9IFQtPmdldEJhc2VFbGVtZW50VHlwZVVuc2FmZSgpOwotCi0gIGlmIChjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUID0gZWxlbWVudFR5cGUtPmdldEFzPE1lbWJlclBvaW50ZXJUeXBlPigpKSB7Ci0gICAgaWYgKCFUeXBlcy5nZXRDWFhBQkkoKS5pc1plcm9Jbml0aWFsaXphYmxlKE1QVCkpCi0gICAgICBJc1plcm9Jbml0aWFsaXphYmxlID0gSXNaZXJvSW5pdGlhbGl6YWJsZUFzQmFzZSA9IGZhbHNlOwotICB9IGVsc2UgaWYgKGNvbnN0IFJlY29yZFR5cGUgKlJUID0gZWxlbWVudFR5cGUtPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKLSAgICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oUlQtPmdldERlY2woKSk7Ci0gICAgY29uc3QgQ0dSZWNvcmRMYXlvdXQgJkxheW91dCA9IFR5cGVzLmdldENHUmVjb3JkTGF5b3V0KFJEKTsKLSAgICBpZiAoIUxheW91dC5pc1plcm9Jbml0aWFsaXphYmxlKCkpCi0gICAgICBJc1plcm9Jbml0aWFsaXphYmxlID0gSXNaZXJvSW5pdGlhbGl6YWJsZUFzQmFzZSA9IGZhbHNlOwotICB9Ci19Ci0KIENHUmVjb3JkTGF5b3V0ICpDb2RlR2VuVHlwZXM6OkNvbXB1dGVSZWNvcmRMYXlvdXQoY29uc3QgUmVjb3JkRGVjbCAqRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RydWN0VHlwZSAqVHkpIHsKLSAgQ0dSZWNvcmRMYXlvdXRCdWlsZGVyIEJ1aWxkZXIoKnRoaXMpOworICBDR1JlY29yZExvd2VyaW5nIEJ1aWxkZXIoKnRoaXMsIEQpOwogCi0gIEJ1aWxkZXIuTGF5b3V0KEQpOwotCi0gIFR5LT5zZXRCb2R5KEJ1aWxkZXIuRmllbGRUeXBlcywgQnVpbGRlci5QYWNrZWQpOworICBCdWlsZGVyLmxvd2VyKGZhbHNlKTsKIAogICAvLyBJZiB3ZSdyZSBpbiBDKyssIGNvbXB1dGUgdGhlIGJhc2Ugc3Vib2JqZWN0IHR5cGUuCiAgIGxsdm06OlN0cnVjdFR5cGUgKkJhc2VUeSA9IDA7Ci0gIGlmIChpc2E8Q1hYUmVjb3JkRGVjbD4oRCkgJiYgIUQtPmlzVW5pb24oKSkgewotICAgIEJhc2VUeSA9IEJ1aWxkZXIuQmFzZVN1Ym9iamVjdFR5cGU7Ci0gICAgaWYgKCFCYXNlVHkpIEJhc2VUeSA9IFR5OworICBpZiAoaXNhPENYWFJlY29yZERlY2w+KEQpICYmICFELT5pc1VuaW9uKCkgJiYgIUQtPmhhc0F0dHI8RmluYWxBdHRyPigpKSB7CisgICAgQmFzZVR5ID0gVHk7CisgICAgaWYgKEJ1aWxkZXIuTGF5b3V0LmdldE5vblZpcnR1YWxTaXplKCkgIT0gQnVpbGRlci5MYXlvdXQuZ2V0U2l6ZSgpKSB7CisgICAgICBDR1JlY29yZExvd2VyaW5nIEJhc2VCdWlsZGVyKCp0aGlzLCBEKTsKKyAgICAgIEJhc2VCdWlsZGVyLmxvd2VyKHRydWUpOworICAgICAgQmFzZVR5ID0gbGx2bTo6U3RydWN0VHlwZTo6Y3JlYXRlKAorICAgICAgICAgIGdldExMVk1Db250ZXh0KCksIEJhc2VCdWlsZGVyLkZpZWxkVHlwZXMsICIiLCBCYXNlQnVpbGRlci5QYWNrZWQpOworICAgICAgYWRkUmVjb3JkVHlwZU5hbWUoRCwgQmFzZVR5LCAiLmJhc2UiKTsKKyAgICB9CiAgIH0KIAorICAvLyBGaWxsIGluIHRoZSBzdHJ1Y3QgKmFmdGVyKiBjb21wdXRpbmcgdGhlIGJhc2UgdHlwZS4gIEZpbGxpbmcgaW4gdGhlIGJvZHkKKyAgLy8gc2lnbmlmaWVzIHRoYXQgdGhlIHR5cGUgaXMgbm8gbG9uZ2VyIG9wYXF1ZSBhbmQgcmVjb3JkIGxheW91dCBpcyBjb21wbGV0ZSwKKyAgLy8gYnV0IHdlIG1heSBuZWVkIHRvIHJlY3Vyc2l2ZWx5IGxheW91dCBEIHdoaWxlIGxheWluZyBEIG91dCBhcyBhIGJhc2UgdHlwZS4KKyAgVHktPnNldEJvZHkoQnVpbGRlci5GaWVsZFR5cGVzLCBCdWlsZGVyLlBhY2tlZCk7CisKICAgQ0dSZWNvcmRMYXlvdXQgKlJMID0KICAgICBuZXcgQ0dSZWNvcmRMYXlvdXQoVHksIEJhc2VUeSwgQnVpbGRlci5Jc1plcm9Jbml0aWFsaXphYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyLklzWmVyb0luaXRpYWxpemFibGVBc0Jhc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlci5Jc1plcm9Jbml0aWFsaXphYmxlQXNCYXNlKTsKIAogICBSTC0+Tm9uVmlydHVhbEJhc2VzLnN3YXAoQnVpbGRlci5Ob25WaXJ0dWFsQmFzZXMpOwogICBSTC0+Q29tcGxldGVPYmplY3RWaXJ0dWFsQmFzZXMuc3dhcChCdWlsZGVyLlZpcnR1YWxCYXNlcyk7CkBAIC05OTQsMTIgKzY3Niw5IEBACiAKICAgaWYgKEJhc2VUeSkgewogICAgIENoYXJVbml0cyBOb25WaXJ0dWFsU2l6ZSAgPSBMYXlvdXQuZ2V0Tm9uVmlydHVhbFNpemUoKTsKLSAgICBDaGFyVW5pdHMgTm9uVmlydHVhbEFsaWduID0gTGF5b3V0LmdldE5vblZpcnR1YWxBbGlnbigpOwotICAgIENoYXJVbml0cyBBbGlnbmVkTm9uVmlydHVhbFR5cGVTaXplID0gCi0gICAgICBOb25WaXJ0dWFsU2l6ZS5Sb3VuZFVwVG9BbGlnbm1lbnQoTm9uVmlydHVhbEFsaWduKTsKIAogICAgIHVpbnQ2NF90IEFsaWduZWROb25WaXJ0dWFsVHlwZVNpemVJbkJpdHMgPSAKLSAgICAgIGdldENvbnRleHQoKS50b0JpdHMoQWxpZ25lZE5vblZpcnR1YWxUeXBlU2l6ZSk7CisgICAgICBnZXRDb250ZXh0KCkudG9CaXRzKE5vblZpcnR1YWxTaXplKTsKIAogICAgIGFzc2VydChBbGlnbmVkTm9uVmlydHVhbFR5cGVTaXplSW5CaXRzID09IAogICAgICAgICAgICBnZXREYXRhTGF5b3V0KCkuZ2V0VHlwZUFsbG9jU2l6ZUluQml0cyhCYXNlVHkpICYmCmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR1N0bXQuY3BwIGIvbGliL0NvZGVHZW4vQ0dTdG10LmNwcAppbmRleCAwYmM1MWRkLi5jYmE5ZTZjIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR1N0bXQuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHU3RtdC5jcHAKQEAgLTE2LDE0ICsxNiwxNCBAQAogI2luY2x1ZGUgIkNvZGVHZW5Nb2R1bGUuaCIKICNpbmNsdWRlICJUYXJnZXRJbmZvLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRWaXNpdG9yLmgiCi0jaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hRGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ByZXR0eVN0YWNrVHJhY2UuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hRGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKICNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKICNpbmNsdWRlICJsbHZtL0lSL0lubGluZUFzbS5oIgogI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYWxsU2l0ZS5oIgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIENvZGVHZW47CiAKQEAgLTQzLDYgKzQzLDcgQEAKIAogdm9pZCBDb2RlR2VuRnVuY3Rpb246OkVtaXRTdG10KGNvbnN0IFN0bXQgKlMpIHsKICAgYXNzZXJ0KFMgJiYgIk51bGwgc3RhdGVtZW50PyIpOworICBQR08uc2V0Q3VycmVudFN0bXQoUyk7CiAKICAgLy8gVGhlc2Ugc3RhdGVtZW50cyBoYXZlIHRoZWlyIG93biBkZWJ1ZyBpbmZvIGhhbmRsaW5nLgogICBpZiAoRW1pdFNpbXBsZVN0bXQoUykpCkBAIC03Niw2ICs3Nyw3IEBACiAgIGNhc2UgU3RtdDo6U0VIRmluYWxseVN0bXRDbGFzczoKICAgY2FzZSBTdG10OjpNU0RlcGVuZGVudEV4aXN0c1N0bXRDbGFzczoKICAgY2FzZSBTdG10OjpPTVBQYXJhbGxlbERpcmVjdGl2ZUNsYXNzOgorICBjYXNlIFN0bXQ6Ok9NUFNpbWREaXJlY3RpdmVDbGFzczoKICAgICBsbHZtX3VucmVhY2hhYmxlKCJpbnZhbGlkIHN0YXRlbWVudCBjbGFzcyB0byBlbWl0IGdlbmVyaWNhbGx5Iik7CiAgIGNhc2UgU3RtdDo6TnVsbFN0bXRDbGFzczoKICAgY2FzZSBTdG10OjpDb21wb3VuZFN0bXRDbGFzczoKQEAgLTI0Miw3ICsyNDQsNyBAQAogICAgICAgRW1pdEFueUV4cHJUb01lbShjYXN0PEV4cHI+KExhc3RTdG10KSwgUmV0QWxsb2NhLCBRdWFsaWZpZXJzKCksCiAgICAgICAgICAgICAgICAgICAgICAgIC8qSXNJbml0Ki9mYWxzZSk7CiAgICAgfQotICAgICAgCisKICAgfQogCiAgIHJldHVybiBSZXRBbGxvY2E7CkBAIC0zMDksOSArMzExLDggQEAKIAogdm9pZCBDb2RlR2VuRnVuY3Rpb246OkVtaXRCbG9ja0FmdGVyVXNlcyhsbHZtOjpCYXNpY0Jsb2NrICpibG9jaykgewogICBib29sIGluc2VydGVkID0gZmFsc2U7Ci0gIGZvciAobGx2bTo6QmFzaWNCbG9jazo6dXNlX2l0ZXJhdG9yCi0gICAgICAgICBpID0gYmxvY2stPnVzZV9iZWdpbigpLCBlID0gYmxvY2stPnVzZV9lbmQoKTsgaSAhPSBlOyArK2kpIHsKLSAgICBpZiAobGx2bTo6SW5zdHJ1Y3Rpb24gKmluc24gPSBkeW5fY2FzdDxsbHZtOjpJbnN0cnVjdGlvbj4oKmkpKSB7CisgIGZvciAobGx2bTo6VXNlciAqdSA6IGJsb2NrLT51c2VycygpKSB7CisgICAgaWYgKGxsdm06Okluc3RydWN0aW9uICppbnNuID0gZHluX2Nhc3Q8bGx2bTo6SW5zdHJ1Y3Rpb24+KHUpKSB7CiAgICAgICBDdXJGbi0+Z2V0QmFzaWNCbG9ja0xpc3QoKS5pbnNlcnRBZnRlcihpbnNuLT5nZXRQYXJlbnQoKSwgYmxvY2spOwogICAgICAgaW5zZXJ0ZWQgPSB0cnVlOwogICAgICAgYnJlYWs7CkBAIC0zNTgsNyArMzU5LDkgQEAKICAgICBSZXNvbHZlQnJhbmNoRml4dXBzKERlc3QuZ2V0QmxvY2soKSk7CiAgIH0KIAorICBSZWdpb25Db3VudGVyIENudCA9IGdldFBHT1JlZ2lvbkNvdW50ZXIoRC0+Z2V0U3RtdCgpKTsKICAgRW1pdEJsb2NrKERlc3QuZ2V0QmxvY2soKSk7CisgIENudC5iZWdpblJlZ2lvbihCdWlsZGVyKTsKIH0KIAogLy8vIENoYW5nZSB0aGUgY2xlYW51cCBzY29wZSBvZiB0aGUgbGFiZWxzIGluIHRoaXMgbGV4aWNhbCBzY29wZSB0bwpAQCAtNDMwLDYgKzQzMyw3IEBACiAgIC8vIEM5OSA2LjguNC4xOiBUaGUgZmlyc3Qgc3Vic3RhdGVtZW50IGlzIGV4ZWN1dGVkIGlmIHRoZSBleHByZXNzaW9uIGNvbXBhcmVzCiAgIC8vIHVuZXF1YWwgdG8gMC4gIFRoZSBjb25kaXRpb24gbXVzdCBiZSBhIHNjYWxhciB0eXBlLgogICBMZXhpY2FsU2NvcGUgQ29uZGl0aW9uU2NvcGUoKnRoaXMsIFMuZ2V0U291cmNlUmFuZ2UoKSk7CisgIFJlZ2lvbkNvdW50ZXIgQ250ID0gZ2V0UEdPUmVnaW9uQ291bnRlcigmUyk7CiAKICAgaWYgKFMuZ2V0Q29uZGl0aW9uVmFyaWFibGUoKSkKICAgICBFbWl0QXV0b1ZhckRlY2woKlMuZ2V0Q29uZGl0aW9uVmFyaWFibGUoKSk7CkBAIC00NDcsNiArNDUxLDggQEAKICAgICAvLyBJZiB0aGUgc2tpcHBlZCBibG9jayBoYXMgbm8gbGFiZWxzIGluIGl0LCBqdXN0IGVtaXQgdGhlIGV4ZWN1dGVkIGJsb2NrLgogICAgIC8vIFRoaXMgYXZvaWRzIGVtaXR0aW5nIGRlYWQgY29kZSBhbmQgc2ltcGxpZmllcyB0aGUgQ0ZHIHN1YnN0YW50aWFsbHkuCiAgICAgaWYgKCFDb250YWluc0xhYmVsKFNraXBwZWQpKSB7CisgICAgICBpZiAoQ29uZENvbnN0YW50KQorICAgICAgICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CiAgICAgICBpZiAoRXhlY3V0ZWQpIHsKICAgICAgICAgUnVuQ2xlYW51cHNTY29wZSBFeGVjdXRlZFNjb3BlKCp0aGlzKTsKICAgICAgICAgRW1pdFN0bXQoRXhlY3V0ZWQpOwpAQCAtNDYyLDEwICs0NjgsMTIgQEAKICAgbGx2bTo6QmFzaWNCbG9jayAqRWxzZUJsb2NrID0gQ29udEJsb2NrOwogICBpZiAoUy5nZXRFbHNlKCkpCiAgICAgRWxzZUJsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiaWYuZWxzZSIpOwotICBFbWl0QnJhbmNoT25Cb29sRXhwcihTLmdldENvbmQoKSwgVGhlbkJsb2NrLCBFbHNlQmxvY2spOworCisgIEVtaXRCcmFuY2hPbkJvb2xFeHByKFMuZ2V0Q29uZCgpLCBUaGVuQmxvY2ssIEVsc2VCbG9jaywgQ250LmdldENvdW50KCkpOwogCiAgIC8vIEVtaXQgdGhlICd0aGVuJyBjb2RlLgotICBFbWl0QmxvY2soVGhlbkJsb2NrKTsgCisgIEVtaXRCbG9jayhUaGVuQmxvY2spOworICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CiAgIHsKICAgICBSdW5DbGVhbnVwc1Njb3BlIFRoZW5TY29wZSgqdGhpcyk7CiAgICAgRW1pdFN0bXQoUy5nZXRUaGVuKCkpOwpAQCAtNDkzLDYgKzUwMSw4IEBACiB9CiAKIHZvaWQgQ29kZUdlbkZ1bmN0aW9uOjpFbWl0V2hpbGVTdG10KGNvbnN0IFdoaWxlU3RtdCAmUykgeworICBSZWdpb25Db3VudGVyIENudCA9IGdldFBHT1JlZ2lvbkNvdW50ZXIoJlMpOworCiAgIC8vIEVtaXQgdGhlIGhlYWRlciBmb3IgdGhlIGxvb3AsIHdoaWNoIHdpbGwgYWxzbyBiZWNvbWUKICAgLy8gdGhlIGNvbnRpbnVlIHRhcmdldC4KICAgSnVtcERlc3QgTG9vcEhlYWRlciA9IGdldEp1bXBEZXN0SW5DdXJyZW50U2NvcGUoIndoaWxlLmNvbmQiKTsKQEAgLTUzNSw4ICs1NDUsOCBAQAogICAgIGxsdm06OkJhc2ljQmxvY2sgKkV4aXRCbG9jayA9IExvb3BFeGl0LmdldEJsb2NrKCk7CiAgICAgaWYgKENvbmRpdGlvblNjb3BlLnJlcXVpcmVzQ2xlYW51cHMoKSkKICAgICAgIEV4aXRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soIndoaWxlLmV4aXQiKTsKLQotICAgIEJ1aWxkZXIuQ3JlYXRlQ29uZEJyKEJvb2xDb25kVmFsLCBMb29wQm9keSwgRXhpdEJsb2NrKTsKKyAgICBCdWlsZGVyLkNyZWF0ZUNvbmRCcihCb29sQ29uZFZhbCwgTG9vcEJvZHksIEV4aXRCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQR08uY3JlYXRlTG9vcFdlaWdodHMoUy5nZXRDb25kKCksIENudCkpOwogCiAgICAgaWYgKEV4aXRCbG9jayAhPSBMb29wRXhpdC5nZXRCbG9jaygpKSB7CiAgICAgICBFbWl0QmxvY2soRXhpdEJsb2NrKTsKQEAgLTU0OSw2ICs1NTksNyBAQAogICB7CiAgICAgUnVuQ2xlYW51cHNTY29wZSBCb2R5U2NvcGUoKnRoaXMpOwogICAgIEVtaXRCbG9jayhMb29wQm9keSk7CisgICAgQ250LmJlZ2luUmVnaW9uKEJ1aWxkZXIpOwogICAgIEVtaXRTdG10KFMuZ2V0Qm9keSgpKTsKICAgfQogCkBAIC01NzMsMTkgKzU4NCwxOSBAQAogICBKdW1wRGVzdCBMb29wRXhpdCA9IGdldEp1bXBEZXN0SW5DdXJyZW50U2NvcGUoImRvLmVuZCIpOwogICBKdW1wRGVzdCBMb29wQ29uZCA9IGdldEp1bXBEZXN0SW5DdXJyZW50U2NvcGUoImRvLmNvbmQiKTsKIAorICBSZWdpb25Db3VudGVyIENudCA9IGdldFBHT1JlZ2lvbkNvdW50ZXIoJlMpOworCiAgIC8vIFN0b3JlIHRoZSBibG9ja3MgdG8gdXNlIGZvciBicmVhayBhbmQgY29udGludWUuCiAgIEJyZWFrQ29udGludWVTdGFjay5wdXNoX2JhY2soQnJlYWtDb250aW51ZShMb29wRXhpdCwgTG9vcENvbmQpKTsKIAogICAvLyBFbWl0IHRoZSBib2R5IG9mIHRoZSBsb29wLgogICBsbHZtOjpCYXNpY0Jsb2NrICpMb29wQm9keSA9IGNyZWF0ZUJhc2ljQmxvY2soImRvLmJvZHkiKTsKLSAgRW1pdEJsb2NrKExvb3BCb2R5KTsKKyAgRW1pdEJsb2NrV2l0aEZhbGxUaHJvdWdoKExvb3BCb2R5LCBDbnQpOwogICB7CiAgICAgUnVuQ2xlYW51cHNTY29wZSBCb2R5U2NvcGUoKnRoaXMpOwogICAgIEVtaXRTdG10KFMuZ2V0Qm9keSgpKTsKICAgfQogCi0gIEJyZWFrQ29udGludWVTdGFjay5wb3BfYmFjaygpOwotCiAgIEVtaXRCbG9jayhMb29wQ29uZC5nZXRCbG9jaygpKTsKIAogICAvLyBDOTkgNi44LjUuMjogIlRoZSBldmFsdWF0aW9uIG9mIHRoZSBjb250cm9sbGluZyBleHByZXNzaW9uIHRha2VzIHBsYWNlCkBAIC01OTYsNiArNjA3LDggQEAKICAgLy8gY29tcGFyZXMgdW5lcXVhbCB0byAwLiAgVGhlIGNvbmRpdGlvbiBtdXN0IGJlIGEgc2NhbGFyIHR5cGUuCiAgIGxsdm06OlZhbHVlICpCb29sQ29uZFZhbCA9IEV2YWx1YXRlRXhwckFzQm9vbChTLmdldENvbmQoKSk7CiAKKyAgQnJlYWtDb250aW51ZVN0YWNrLnBvcF9iYWNrKCk7CisKICAgLy8gImRvIHt9IHdoaWxlICgwKSIgaXMgY29tbW9uIGluIG1hY3JvcywgYXZvaWQgZXh0cmEgYmxvY2tzLiAgQmUgc3VyZQogICAvLyB0byBjb3JyZWN0bHkgaGFuZGxlIGJyZWFrL2NvbnRpbnVlIHRob3VnaC4KICAgYm9vbCBFbWl0Qm9vbENvbmRCcmFuY2ggPSB0cnVlOwpAQCAtNjA1LDcgKzYxOCw4IEBACiAKICAgLy8gQXMgbG9uZyBhcyB0aGUgY29uZGl0aW9uIGlzIHRydWUsIGl0ZXJhdGUgdGhlIGxvb3AuCiAgIGlmIChFbWl0Qm9vbENvbmRCcmFuY2gpCi0gICAgQnVpbGRlci5DcmVhdGVDb25kQnIoQm9vbENvbmRWYWwsIExvb3BCb2R5LCBMb29wRXhpdC5nZXRCbG9jaygpKTsKKyAgICBCdWlsZGVyLkNyZWF0ZUNvbmRCcihCb29sQ29uZFZhbCwgTG9vcEJvZHksIExvb3BFeGl0LmdldEJsb2NrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgUEdPLmNyZWF0ZUxvb3BXZWlnaHRzKFMuZ2V0Q29uZCgpLCBDbnQpKTsKIAogICAvLyBFbWl0IHRoZSBleGl0IGJsb2NrLgogICBFbWl0QmxvY2soTG9vcEV4aXQuZ2V0QmxvY2soKSk7CkBAIC02MjksNiArNjQzLDggQEAKICAgaWYgKFMuZ2V0SW5pdCgpKQogICAgIEVtaXRTdG10KFMuZ2V0SW5pdCgpKTsKIAorICBSZWdpb25Db3VudGVyIENudCA9IGdldFBHT1JlZ2lvbkNvdW50ZXIoJlMpOworCiAgIC8vIFN0YXJ0IHRoZSBsb29wIHdpdGggYSBibG9jayB0aGF0IHRlc3RzIHRoZSBjb25kaXRpb24uCiAgIC8vIElmIHRoZXJlJ3MgYW4gaW5jcmVtZW50LCB0aGUgY29udGludWUgc2NvcGUgd2lsbCBiZSBvdmVyd3JpdHRlbgogICAvLyBsYXRlci4KQEAgLTYzNiw2ICs2NTIsMTYgQEAKICAgbGx2bTo6QmFzaWNCbG9jayAqQ29uZEJsb2NrID0gQ29udGludWUuZ2V0QmxvY2soKTsKICAgRW1pdEJsb2NrKENvbmRCbG9jayk7CiAKKyAgLy8gSWYgdGhlIGZvciBsb29wIGRvZXNuJ3QgaGF2ZSBhbiBpbmNyZW1lbnQgd2UgY2FuIGp1c3QgdXNlIHRoZQorICAvLyBjb25kaXRpb24gYXMgdGhlIGNvbnRpbnVlIGJsb2NrLiAgT3RoZXJ3aXNlIHdlJ2xsIG5lZWQgdG8gY3JlYXRlCisgIC8vIGEgYmxvY2sgZm9yIGl0IChpbiB0aGUgY3VycmVudCBzY29wZSwgaS5lLiBpbiB0aGUgc2NvcGUgb2YgdGhlCisgIC8vIGNvbmRpdGlvbiksIGFuZCB0aGF0IHdlIHdpbGwgYmVjb21lIG91ciBjb250aW51ZSBibG9jay4KKyAgaWYgKFMuZ2V0SW5jKCkpCisgICAgQ29udGludWUgPSBnZXRKdW1wRGVzdEluQ3VycmVudFNjb3BlKCJmb3IuaW5jIik7CisKKyAgLy8gU3RvcmUgdGhlIGJsb2NrcyB0byB1c2UgZm9yIGJyZWFrIGFuZCBjb250aW51ZS4KKyAgQnJlYWtDb250aW51ZVN0YWNrLnB1c2hfYmFjayhCcmVha0NvbnRpbnVlKExvb3BFeGl0LCBDb250aW51ZSkpOworCiAgIC8vIENyZWF0ZSBhIGNsZWFudXAgc2NvcGUgZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUgY2xlYW51cHMuCiAgIFJ1bkNsZWFudXBzU2NvcGUgQ29uZGl0aW9uU2NvcGUoKnRoaXMpOwogCkBAIC02NTcsNyArNjgzLDkgQEAKIAogICAgIC8vIEM5OSA2LjguNXAyL3A0OiBUaGUgZmlyc3Qgc3Vic3RhdGVtZW50IGlzIGV4ZWN1dGVkIGlmIHRoZSBleHByZXNzaW9uCiAgICAgLy8gY29tcGFyZXMgdW5lcXVhbCB0byAwLiAgVGhlIGNvbmRpdGlvbiBtdXN0IGJlIGEgc2NhbGFyIHR5cGUuCi0gICAgRW1pdEJyYW5jaE9uQm9vbEV4cHIoUy5nZXRDb25kKCksIEZvckJvZHksIEV4aXRCbG9jayk7CisgICAgbGx2bTo6VmFsdWUgKkJvb2xDb25kVmFsID0gRXZhbHVhdGVFeHByQXNCb29sKFMuZ2V0Q29uZCgpKTsKKyAgICBCdWlsZGVyLkNyZWF0ZUNvbmRCcihCb29sQ29uZFZhbCwgRm9yQm9keSwgRXhpdEJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBHTy5jcmVhdGVMb29wV2VpZ2h0cyhTLmdldENvbmQoKSwgQ250KSk7CiAKICAgICBpZiAoRXhpdEJsb2NrICE9IExvb3BFeGl0LmdldEJsb2NrKCkpIHsKICAgICAgIEVtaXRCbG9jayhFeGl0QmxvY2spOwpAQCAtNjY5LDE2ICs2OTcsNyBAQAogICAgIC8vIFRyZWF0IGl0IGFzIGEgbm9uLXplcm8gY29uc3RhbnQuICBEb24ndCBldmVuIGNyZWF0ZSBhIG5ldyBibG9jayBmb3IgdGhlCiAgICAgLy8gYm9keSwganVzdCBmYWxsIGludG8gaXQuCiAgIH0KLQotICAvLyBJZiB0aGUgZm9yIGxvb3AgZG9lc24ndCBoYXZlIGFuIGluY3JlbWVudCB3ZSBjYW4ganVzdCB1c2UgdGhlCi0gIC8vIGNvbmRpdGlvbiBhcyB0aGUgY29udGludWUgYmxvY2suICBPdGhlcndpc2Ugd2UnbGwgbmVlZCB0byBjcmVhdGUKLSAgLy8gYSBibG9jayBmb3IgaXQgKGluIHRoZSBjdXJyZW50IHNjb3BlLCBpLmUuIGluIHRoZSBzY29wZSBvZiB0aGUKLSAgLy8gY29uZGl0aW9uKSwgYW5kIHRoYXQgd2Ugd2lsbCBiZWNvbWUgb3VyIGNvbnRpbnVlIGJsb2NrLgotICBpZiAoUy5nZXRJbmMoKSkKLSAgICBDb250aW51ZSA9IGdldEp1bXBEZXN0SW5DdXJyZW50U2NvcGUoImZvci5pbmMiKTsKLQotICAvLyBTdG9yZSB0aGUgYmxvY2tzIHRvIHVzZSBmb3IgYnJlYWsgYW5kIGNvbnRpbnVlLgotICBCcmVha0NvbnRpbnVlU3RhY2sucHVzaF9iYWNrKEJyZWFrQ29udGludWUoTG9vcEV4aXQsIENvbnRpbnVlKSk7CisgIENudC5iZWdpblJlZ2lvbihCdWlsZGVyKTsKIAogICB7CiAgICAgLy8gQ3JlYXRlIGEgc2VwYXJhdGUgY2xlYW51cCBzY29wZSBmb3IgdGhlIGJvZHksIGluIGNhc2UgaXQgaXMgbm90CkBAIC03MjAsNiArNzM5LDggQEAKICAgRW1pdFN0bXQoUy5nZXRSYW5nZVN0bXQoKSk7CiAgIEVtaXRTdG10KFMuZ2V0QmVnaW5FbmRTdG10KCkpOwogCisgIFJlZ2lvbkNvdW50ZXIgQ250ID0gZ2V0UEdPUmVnaW9uQ291bnRlcigmUyk7CisKICAgLy8gU3RhcnQgdGhlIGxvb3Agd2l0aCBhIGJsb2NrIHRoYXQgdGVzdHMgdGhlIGNvbmRpdGlvbi4KICAgLy8gSWYgdGhlcmUncyBhbiBpbmNyZW1lbnQsIHRoZSBjb250aW51ZSBzY29wZSB3aWxsIGJlIG92ZXJ3cml0dGVuCiAgIC8vIGxhdGVyLgpAQCAtNzM3LDcgKzc1OCw5IEBACiAKICAgLy8gVGhlIGJvZHkgaXMgZXhlY3V0ZWQgaWYgdGhlIGV4cHJlc3Npb24sIGNvbnRleHR1YWxseSBjb252ZXJ0ZWQKICAgLy8gdG8gYm9vbCwgaXMgdHJ1ZS4KLSAgRW1pdEJyYW5jaE9uQm9vbEV4cHIoUy5nZXRDb25kKCksIEZvckJvZHksIEV4aXRCbG9jayk7CisgIGxsdm06OlZhbHVlICpCb29sQ29uZFZhbCA9IEV2YWx1YXRlRXhwckFzQm9vbChTLmdldENvbmQoKSk7CisgIEJ1aWxkZXIuQ3JlYXRlQ29uZEJyKEJvb2xDb25kVmFsLCBGb3JCb2R5LCBFeGl0QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgIFBHTy5jcmVhdGVMb29wV2VpZ2h0cyhTLmdldENvbmQoKSwgQ250KSk7CiAKICAgaWYgKEV4aXRCbG9jayAhPSBMb29wRXhpdC5nZXRCbG9jaygpKSB7CiAgICAgRW1pdEJsb2NrKEV4aXRCbG9jayk7CkBAIC03NDUsNiArNzY4LDcgQEAKICAgfQogCiAgIEVtaXRCbG9jayhGb3JCb2R5KTsKKyAgQ250LmJlZ2luUmVnaW9uKEJ1aWxkZXIpOwogCiAgIC8vIENyZWF0ZSBhIGJsb2NrIGZvciB0aGUgaW5jcmVtZW50LiBJbiBjYXNlIG9mIGEgJ2NvbnRpbnVlJywgd2UganVtcCB0aGVyZS4KICAgSnVtcERlc3QgQ29udGludWUgPSBnZXRKdW1wRGVzdEluQ3VycmVudFNjb3BlKCJmb3IuaW5jIik7CkBAIC04MDksNyArODMzLDggQEAKIAogICAvLyBGSVhNRTogQ2xlYW4gdGhpcyB1cCBieSB1c2luZyBhbiBMVmFsdWUgZm9yIFJldHVyblRlbXAsCiAgIC8vIEVtaXRTdG9yZVRocm91Z2hMVmFsdWUsIGFuZCBFbWl0QW55RXhwci4KLSAgaWYgKFMuZ2V0TlJWT0NhbmRpZGF0ZSgpICYmIFMuZ2V0TlJWT0NhbmRpZGF0ZSgpLT5pc05SVk9WYXJpYWJsZSgpKSB7CisgIGlmIChnZXRMYW5nT3B0cygpLkVsaWRlQ29uc3RydWN0b3JzICYmCisgICAgICBTLmdldE5SVk9DYW5kaWRhdGUoKSAmJiBTLmdldE5SVk9DYW5kaWRhdGUoKS0+aXNOUlZPVmFyaWFibGUoKSkgewogICAgIC8vIEFwcGx5IHRoZSBuYW1lZCByZXR1cm4gdmFsdWUgb3B0aW1pemF0aW9uIGZvciB0aGlzIHJldHVybiBzdGF0ZW1lbnQsCiAgICAgLy8gd2hpY2ggbWVhbnMgZG9pbmcgbm90aGluZzogdGhlIGFwcHJvcHJpYXRlIHJlc3VsdCBoYXMgYWxyZWFkeSBiZWVuCiAgICAgLy8gY29uc3RydWN0ZWQgaW50byB0aGUgTlJWTyB2YXJpYWJsZS4KQEAgLTgxOCw3ICs4NDMsNyBAQAogICAgIC8vIHRoYXQgdGhlIGNsZWFudXAgY29kZSBzaG91bGQgbm90IGRlc3Ryb3kgdGhlIHZhcmlhYmxlLgogICAgIGlmIChsbHZtOjpWYWx1ZSAqTlJWT0ZsYWcgPSBOUlZPRmxhZ3NbUy5nZXROUlZPQ2FuZGlkYXRlKCldKQogICAgICAgQnVpbGRlci5DcmVhdGVTdG9yZShCdWlsZGVyLmdldFRydWUoKSwgTlJWT0ZsYWcpOwotICB9IGVsc2UgaWYgKCFSZXR1cm5WYWx1ZSkgeworICB9IGVsc2UgaWYgKCFSZXR1cm5WYWx1ZSB8fCAoUlYgJiYgUlYtPmdldFR5cGUoKS0+aXNWb2lkVHlwZSgpKSkgewogICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gcmV0dXJuIGFueXRoaW5nLCBidXQgZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24KICAgICAvLyBmb3Igc2lkZSBlZmZlY3RzLgogICAgIGlmIChSVikKQEAgLTg2Niw5ICs4OTEsOCBAQAogICBpZiAoSGF2ZUluc2VydFBvaW50KCkpCiAgICAgRW1pdFN0b3BQb2ludCgmUyk7CiAKLSAgZm9yIChEZWNsU3RtdDo6Y29uc3RfZGVjbF9pdGVyYXRvciBJID0gUy5kZWNsX2JlZ2luKCksIEUgPSBTLmRlY2xfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpCi0gICAgRW1pdERlY2woKipJKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogUy5kZWNscygpKQorICAgIEVtaXREZWNsKCpJKTsKIH0KIAogdm9pZCBDb2RlR2VuRnVuY3Rpb246OkVtaXRCcmVha1N0bXQoY29uc3QgQnJlYWtTdG10ICZTKSB7CkBAIC04ODAsOCArOTA0LDcgQEAKICAgaWYgKEhhdmVJbnNlcnRQb2ludCgpKQogICAgIEVtaXRTdG9wUG9pbnQoJlMpOwogCi0gIEp1bXBEZXN0IEJsb2NrID0gQnJlYWtDb250aW51ZVN0YWNrLmJhY2soKS5CcmVha0Jsb2NrOwotICBFbWl0QnJhbmNoVGhyb3VnaENsZWFudXAoQmxvY2spOworICBFbWl0QnJhbmNoVGhyb3VnaENsZWFudXAoQnJlYWtDb250aW51ZVN0YWNrLmJhY2soKS5CcmVha0Jsb2NrKTsKIH0KIAogdm9pZCBDb2RlR2VuRnVuY3Rpb246OkVtaXRDb250aW51ZVN0bXQoY29uc3QgQ29udGludWVTdG10ICZTKSB7CkBAIC04OTMsOCArOTE2LDcgQEAKICAgaWYgKEhhdmVJbnNlcnRQb2ludCgpKQogICAgIEVtaXRTdG9wUG9pbnQoJlMpOwogCi0gIEp1bXBEZXN0IEJsb2NrID0gQnJlYWtDb250aW51ZVN0YWNrLmJhY2soKS5Db250aW51ZUJsb2NrOwotICBFbWl0QnJhbmNoVGhyb3VnaENsZWFudXAoQmxvY2spOworICBFbWl0QnJhbmNoVGhyb3VnaENsZWFudXAoQnJlYWtDb250aW51ZVN0YWNrLmJhY2soKS5Db250aW51ZUJsb2NrKTsKIH0KIAogLy8vIEVtaXRDYXNlU3RtdFJhbmdlIC0gSWYgY2FzZSBzdGF0ZW1lbnQgcmFuZ2UgaXMgbm90IHRvbyBiaWcgdGhlbgpAQCAtOTA2LDExICs5MjgsMTMgQEAKICAgbGx2bTo6QVBTSW50IExIUyA9IFMuZ2V0TEhTKCktPkV2YWx1YXRlS25vd25Db25zdEludChnZXRDb250ZXh0KCkpOwogICBsbHZtOjpBUFNJbnQgUkhTID0gUy5nZXRSSFMoKS0+RXZhbHVhdGVLbm93bkNvbnN0SW50KGdldENvbnRleHQoKSk7CiAKKyAgUmVnaW9uQ291bnRlciBDYXNlQ250ID0gZ2V0UEdPUmVnaW9uQ291bnRlcigmUyk7CisKICAgLy8gRW1pdCB0aGUgY29kZSBmb3IgdGhpcyBjYXNlLiBXZSBkbyB0aGlzIGZpcnN0IHRvIG1ha2Ugc3VyZSBpdCBpcwogICAvLyBwcm9wZXJseSBjaGFpbmVkIGZyb20gb3VyIHByZWRlY2Vzc29yIGJlZm9yZSBnZW5lcmF0aW5nIHRoZQogICAvLyBzd2l0Y2ggbWFjaGluZXJ5IHRvIGVudGVyIHRoaXMgYmxvY2suCi0gIEVtaXRCbG9jayhjcmVhdGVCYXNpY0Jsb2NrKCJzdy5iYiIpKTsKLSAgbGx2bTo6QmFzaWNCbG9jayAqQ2FzZURlc3QgPSBCdWlsZGVyLkdldEluc2VydEJsb2NrKCk7CisgIGxsdm06OkJhc2ljQmxvY2sgKkNhc2VEZXN0ID0gY3JlYXRlQmFzaWNCbG9jaygic3cuYmIiKTsKKyAgRW1pdEJsb2NrV2l0aEZhbGxUaHJvdWdoKENhc2VEZXN0LCBDYXNlQ250KTsKICAgRW1pdFN0bXQoUy5nZXRTdWJTdG10KCkpOwogCiAgIC8vIElmIHJhbmdlIGlzIGVtcHR5LCBkbyBub3RoaW5nLgpAQCAtOTIxLDcgKzk0NSwxOCBAQAogICAvLyBGSVhNRTogcGFyYW1ldGVycyBzdWNoIGFzIHRoaXMgc2hvdWxkIG5vdCBiZSBoYXJkY29kZWQuCiAgIGlmIChSYW5nZS51bHQobGx2bTo6QVBJbnQoUmFuZ2UuZ2V0Qml0V2lkdGgoKSwgNjQpKSkgewogICAgIC8vIFJhbmdlIGlzIHNtYWxsIGVub3VnaCB0byBhZGQgbXVsdGlwbGUgc3dpdGNoIGluc3RydWN0aW9uIGNhc2VzLgotICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSYW5nZS5nZXRaRXh0VmFsdWUoKSArIDE7IGkgIT0gZTsgKytpKSB7CisgICAgdWludDY0X3QgVG90YWwgPSBDYXNlQ250LmdldENvdW50KCk7CisgICAgdW5zaWduZWQgTkNhc2VzID0gUmFuZ2UuZ2V0WkV4dFZhbHVlKCkgKyAxOworICAgIC8vIFdlIG9ubHkgaGF2ZSBvbmUgcmVnaW9uIGNvdW50ZXIgZm9yIHRoZSBlbnRpcmUgc2V0IG9mIGNhc2VzIGhlcmUsIHNvIHdlCisgICAgLy8gbmVlZCB0byBkaXZpZGUgdGhlIHdlaWdodHMgZXZlbmx5IGJldHdlZW4gdGhlIGdlbmVyYXRlZCBjYXNlcywgZW5zdXJpbmcKKyAgICAvLyB0aGF0IHRoZSB0b3RhbCB3ZWlnaHQgaXMgcHJlc2VydmVkLiBFLmcuLCBhIHdlaWdodCBvZiA1IG92ZXIgdGhyZWUgY2FzZXMKKyAgICAvLyB3aWxsIGJlIGRpc3RyaWJ1dGVkIGFzIHdlaWdodHMgb2YgMiwgMiwgYW5kIDEuCisgICAgdWludDY0X3QgV2VpZ2h0ID0gVG90YWwgLyBOQ2FzZXMsIFJlbSA9IFRvdGFsICUgTkNhc2VzOworICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gTkNhc2VzOyArK0kpIHsKKyAgICAgIGlmIChTd2l0Y2hXZWlnaHRzKQorICAgICAgICBTd2l0Y2hXZWlnaHRzLT5wdXNoX2JhY2soV2VpZ2h0ICsgKFJlbSA/IDEgOiAwKSk7CisgICAgICBpZiAoUmVtKQorICAgICAgICBSZW0tLTsKICAgICAgIFN3aXRjaEluc24tPmFkZENhc2UoQnVpbGRlci5nZXRJbnQoTEhTKSwgQ2FzZURlc3QpOwogICAgICAgTEhTKys7CiAgICAgfQpAQCAtOTQ2LDcgKzk4MSwxOSBAQAogICAgIEJ1aWxkZXIuQ3JlYXRlU3ViKFN3aXRjaEluc24tPmdldENvbmRpdGlvbigpLCBCdWlsZGVyLmdldEludChMSFMpKTsKICAgbGx2bTo6VmFsdWUgKkNvbmQgPQogICAgIEJ1aWxkZXIuQ3JlYXRlSUNtcFVMRShEaWZmLCBCdWlsZGVyLmdldEludChSYW5nZSksICJpbmJvdW5kcyIpOwotICBCdWlsZGVyLkNyZWF0ZUNvbmRCcihDb25kLCBDYXNlRGVzdCwgRmFsc2VEZXN0KTsKKworICBsbHZtOjpNRE5vZGUgKldlaWdodHMgPSAwOworICBpZiAoU3dpdGNoV2VpZ2h0cykgeworICAgIHVpbnQ2NF90IFRoaXNDb3VudCA9IENhc2VDbnQuZ2V0Q291bnQoKTsKKyAgICB1aW50NjRfdCBEZWZhdWx0Q291bnQgPSAoKlN3aXRjaFdlaWdodHMpWzBdOworICAgIFdlaWdodHMgPSBQR08uY3JlYXRlQnJhbmNoV2VpZ2h0cyhUaGlzQ291bnQsIERlZmF1bHRDb3VudCk7CisKKyAgICAvLyBTaW5jZSB3ZSdyZSBjaGFpbmluZyB0aGUgc3dpdGNoIGRlZmF1bHQgdGhyb3VnaCBlYWNoIGxhcmdlIGNhc2UgcmFuZ2UsIHdlCisgICAgLy8gbmVlZCB0byB1cGRhdGUgdGhlIHdlaWdodCBmb3IgdGhlIGRlZmF1bHQsIGllLCB0aGUgZmlyc3QgY2FzZSwgdG8gaW5jbHVkZQorICAgIC8vIHRoaXMgY2FzZS4KKyAgICAoKlN3aXRjaFdlaWdodHMpWzBdICs9IFRoaXNDb3VudDsKKyAgfQorICBCdWlsZGVyLkNyZWF0ZUNvbmRCcihDb25kLCBDYXNlRGVzdCwgRmFsc2VEZXN0LCBXZWlnaHRzKTsKIAogICAvLyBSZXN0b3JlIHRoZSBhcHByb3ByaWF0ZSBpbnNlcnRpb24gcG9pbnQuCiAgIGlmIChSZXN0b3JlQkIpCkBAIC05NTksNyArMTAwNiw3IEBACiAgIC8vIElmIHRoZXJlIGlzIG5vIGVuY2xvc2luZyBzd2l0Y2ggaW5zdGFuY2UgdGhhdCB3ZSdyZSBhd2FyZSBvZiwgdGhlbiB0aGlzCiAgIC8vIGNhc2Ugc3RhdGVtZW50IGFuZCBpdHMgYmxvY2sgY2FuIGJlIGVsaWRlZC4gIFRoaXMgc2l0dWF0aW9uIG9ubHkgaGFwcGVucwogICAvLyB3aGVuIHdlJ3ZlIGNvbnN0YW50LWZvbGRlZCB0aGUgc3dpdGNoLCBhcmUgZW1pdHRpbmcgdGhlIGNvbnN0YW50IGNhc2UsCi0gIC8vIGFuZCBwYXJ0IG9mIHRoZSBjb25zdGFudCBjYXNlIGluY2x1ZGVzIGFub3RoZXIgY2FzZSBzdGF0ZW1lbnQuICBGb3IgCisgIC8vIGFuZCBwYXJ0IG9mIHRoZSBjb25zdGFudCBjYXNlIGluY2x1ZGVzIGFub3RoZXIgY2FzZSBzdGF0ZW1lbnQuICBGb3IKICAgLy8gaW5zdGFuY2U6IHN3aXRjaCAoNCkgeyBjYXNlIDQ6IGRvIHsgY2FzZSA1OiB9IHdoaWxlICgxKTsgfQogICBpZiAoIVN3aXRjaEluc24pIHsKICAgICBFbWl0U3RtdChTLmdldFN1YlN0bXQoKSk7CkBAIC05NzIsMTcgKzEwMTksMjIgQEAKICAgICByZXR1cm47CiAgIH0KIAorICBSZWdpb25Db3VudGVyIENhc2VDbnQgPSBnZXRQR09SZWdpb25Db3VudGVyKCZTKTsKICAgbGx2bTo6Q29uc3RhbnRJbnQgKkNhc2VWYWwgPQogICAgIEJ1aWxkZXIuZ2V0SW50KFMuZ2V0TEhTKCktPkV2YWx1YXRlS25vd25Db25zdEludChnZXRDb250ZXh0KCkpKTsKIAotICAvLyBJZiB0aGUgYm9keSBvZiB0aGUgY2FzZSBpcyBqdXN0IGEgJ2JyZWFrJywgYW5kIGlmIHRoZXJlIHdhcyBubyBmYWxsdGhyb3VnaCwKLSAgLy8gdHJ5IHRvIG5vdCBlbWl0IGFuIGVtcHR5IGJsb2NrLgotICBpZiAoKENHTS5nZXRDb2RlR2VuT3B0cygpLk9wdGltaXphdGlvbkxldmVsID4gMCkgJiYKKyAgLy8gSWYgdGhlIGJvZHkgb2YgdGhlIGNhc2UgaXMganVzdCBhICdicmVhaycsIHRyeSB0byBub3QgZW1pdCBhbiBlbXB0eSBibG9jay4KKyAgLy8gSWYgd2UncmUgcHJvZmlsaW5nIG9yIHdlJ3JlIG5vdCBvcHRpbWl6aW5nLCBsZWF2ZSB0aGUgYmxvY2sgaW4gZm9yIGJldHRlcgorICAvLyBkZWJ1ZyBhbmQgY292ZXJhZ2UgYW5hbHlzaXMuCisgIGlmICghQ0dNLmdldENvZGVHZW5PcHRzKCkuUHJvZmlsZUluc3RyR2VuZXJhdGUgJiYKKyAgICAgIENHTS5nZXRDb2RlR2VuT3B0cygpLk9wdGltaXphdGlvbkxldmVsID4gMCAmJgogICAgICAgaXNhPEJyZWFrU3RtdD4oUy5nZXRTdWJTdG10KCkpKSB7CiAgICAgSnVtcERlc3QgQmxvY2sgPSBCcmVha0NvbnRpbnVlU3RhY2suYmFjaygpLkJyZWFrQmxvY2s7CiAKICAgICAvLyBPbmx5IGRvIHRoaXMgb3B0aW1pemF0aW9uIGlmIHRoZXJlIGFyZSBubyBjbGVhbnVwcyB0aGF0IG5lZWQgZW1pdHRpbmcuCiAgICAgaWYgKGlzT2J2aW91c2x5QnJhbmNoV2l0aG91dENsZWFudXBzKEJsb2NrKSkgeworICAgICAgaWYgKFN3aXRjaFdlaWdodHMpCisgICAgICAgIFN3aXRjaFdlaWdodHMtPnB1c2hfYmFjayhDYXNlQ250LmdldENvdW50KCkpOwogICAgICAgU3dpdGNoSW5zbi0+YWRkQ2FzZShDYXNlVmFsLCBCbG9jay5nZXRCbG9jaygpKTsKIAogICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgZmFsbHRocm91Z2ggaW50byB0aGlzIGNhc2UsIG1ha2Ugc3VyZSB0byByZWRpcmVjdCBpdCB0bwpAQCAtOTk1LDggKzEwNDcsMTAgQEAKICAgICB9CiAgIH0KIAotICBFbWl0QmxvY2soY3JlYXRlQmFzaWNCbG9jaygic3cuYmIiKSk7Ci0gIGxsdm06OkJhc2ljQmxvY2sgKkNhc2VEZXN0ID0gQnVpbGRlci5HZXRJbnNlcnRCbG9jaygpOworICBsbHZtOjpCYXNpY0Jsb2NrICpDYXNlRGVzdCA9IGNyZWF0ZUJhc2ljQmxvY2soInN3LmJiIik7CisgIEVtaXRCbG9ja1dpdGhGYWxsVGhyb3VnaChDYXNlRGVzdCwgQ2FzZUNudCk7CisgIGlmIChTd2l0Y2hXZWlnaHRzKQorICAgIFN3aXRjaFdlaWdodHMtPnB1c2hfYmFjayhDYXNlQ250LmdldENvdW50KCkpOwogICBTd2l0Y2hJbnNuLT5hZGRDYXNlKENhc2VWYWwsIENhc2VEZXN0KTsKIAogICAvLyBSZWN1cnNpdmVseSBlbWl0dGluZyB0aGUgc3RhdGVtZW50IGlzIGFjY2VwdGFibGUsIGJ1dCBpcyBub3Qgd29uZGVyZnVsIGZvcgpAQCAtMTAxNCw4ICsxMDY4LDE3IEBACiAgIC8vIE90aGVyd2lzZSwgaXRlcmF0aXZlbHkgYWRkIGNvbnNlY3V0aXZlIGNhc2VzIHRvIHRoaXMgc3dpdGNoIHN0bXQuCiAgIHdoaWxlIChOZXh0Q2FzZSAmJiBOZXh0Q2FzZS0+Z2V0UkhTKCkgPT0gMCkgewogICAgIEN1ckNhc2UgPSBOZXh0Q2FzZTsKLSAgICBsbHZtOjpDb25zdGFudEludCAqQ2FzZVZhbCA9IAorICAgIGxsdm06OkNvbnN0YW50SW50ICpDYXNlVmFsID0KICAgICAgIEJ1aWxkZXIuZ2V0SW50KEN1ckNhc2UtPmdldExIUygpLT5FdmFsdWF0ZUtub3duQ29uc3RJbnQoZ2V0Q29udGV4dCgpKSk7CisKKyAgICBDYXNlQ250ID0gZ2V0UEdPUmVnaW9uQ291bnRlcihOZXh0Q2FzZSk7CisgICAgaWYgKFN3aXRjaFdlaWdodHMpCisgICAgICBTd2l0Y2hXZWlnaHRzLT5wdXNoX2JhY2soQ2FzZUNudC5nZXRDb3VudCgpKTsKKyAgICBpZiAoQ0dNLmdldENvZGVHZW5PcHRzKCkuUHJvZmlsZUluc3RyR2VuZXJhdGUpIHsKKyAgICAgIENhc2VEZXN0ID0gY3JlYXRlQmFzaWNCbG9jaygic3cuYmIiKTsKKyAgICAgIEVtaXRCbG9ja1dpdGhGYWxsVGhyb3VnaChDYXNlRGVzdCwgQ2FzZUNudCk7CisgICAgfQorCiAgICAgU3dpdGNoSW5zbi0+YWRkQ2FzZShDYXNlVmFsLCBDYXNlRGVzdCk7CiAgICAgTmV4dENhc2UgPSBkeW5fY2FzdDxDYXNlU3RtdD4oQ3VyQ2FzZS0+Z2V0U3ViU3RtdCgpKTsKICAgfQpAQCAtMTAyOCw3ICsxMDkxLDEwIEBACiAgIGxsdm06OkJhc2ljQmxvY2sgKkRlZmF1bHRCbG9jayA9IFN3aXRjaEluc24tPmdldERlZmF1bHREZXN0KCk7CiAgIGFzc2VydChEZWZhdWx0QmxvY2stPmVtcHR5KCkgJiYKICAgICAgICAgICJFbWl0RGVmYXVsdFN0bXQ6IERlZmF1bHQgYmxvY2sgYWxyZWFkeSBkZWZpbmVkPyIpOwotICBFbWl0QmxvY2soRGVmYXVsdEJsb2NrKTsKKworICBSZWdpb25Db3VudGVyIENudCA9IGdldFBHT1JlZ2lvbkNvdW50ZXIoJlMpOworICBFbWl0QmxvY2tXaXRoRmFsbFRocm91Z2goRGVmYXVsdEJsb2NrLCBDbnQpOworCiAgIEVtaXRTdG10KFMuZ2V0U3ViU3RtdCgpKTsKIH0KIApAQCAtMTE4NSw3ICsxMjUxLDggQEAKIHN0YXRpYyBib29sIEZpbmRDYXNlU3RhdGVtZW50c0ZvclZhbHVlKGNvbnN0IFN3aXRjaFN0bXQgJlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpBUFNJbnQgJkNvbnN0YW50Q29uZFZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgU3RtdCo+ICZSZXN1bHRTdG10cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVENvbnRleHQgJkMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVENvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd2l0Y2hDYXNlIComUmVzdWx0Q2FzZSkgewogICAvLyBGaXJzdCBzdGVwLCBmaW5kIHRoZSBzd2l0Y2ggY2FzZSB0aGF0IGlzIGJlaW5nIGJyYW5jaGVkIHRvLiAgV2UgY2FuIGRvIHRoaXMKICAgLy8gZWZmaWNpZW50bHkgYnkgc2Nhbm5pbmcgdGhlIFN3aXRjaENhc2UgbGlzdC4KICAgY29uc3QgU3dpdGNoQ2FzZSAqQ2FzZSA9IFMuZ2V0U3dpdGNoQ2FzZUxpc3QoKTsKQEAgLTEyMjgsNiArMTI5NSw3IEBACiAgIC8vICAgd2hpbGUgKDEpIHsKICAgLy8gICAgIGNhc2UgNDogLi4uCiAgIGJvb2wgRm91bmRDYXNlID0gZmFsc2U7CisgIFJlc3VsdENhc2UgPSBDYXNlOwogICByZXR1cm4gQ29sbGVjdFN0YXRlbWVudHNGb3JDYXNlKFMuZ2V0Qm9keSgpLCBDYXNlLCBGb3VuZENhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0U3RtdHMpICE9IENTRkNfRmFpbHVyZSAmJgogICAgICAgICAgRm91bmRDYXNlOwpAQCAtMTI0Myw2ICsxMzExLDcgQEAKIAogICAvLyBIYW5kbGUgbmVzdGVkIHN3aXRjaCBzdGF0ZW1lbnRzLgogICBsbHZtOjpTd2l0Y2hJbnN0ICpTYXZlZFN3aXRjaEluc24gPSBTd2l0Y2hJbnNuOworICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgMTY+ICpTYXZlZFN3aXRjaFdlaWdodHMgPSBTd2l0Y2hXZWlnaHRzOwogICBsbHZtOjpCYXNpY0Jsb2NrICpTYXZlZENSQmxvY2sgPSBDYXNlUmFuZ2VCbG9jazsKIAogICAvLyBTZWUgaWYgd2UgY2FuIGNvbnN0YW50IGZvbGQgdGhlIGNvbmRpdGlvbiBvZiB0aGUgc3dpdGNoIGFuZCB0aGVyZWZvcmUgb25seQpAQCAtMTI1MCw4ICsxMzE5LDEzIEBACiAgIGxsdm06OkFQU0ludCBDb25zdGFudENvbmRWYWx1ZTsKICAgaWYgKENvbnN0YW50Rm9sZHNUb1NpbXBsZUludGVnZXIoUy5nZXRDb25kKCksIENvbnN0YW50Q29uZFZhbHVlKSkgewogICAgIFNtYWxsVmVjdG9yPGNvbnN0IFN0bXQqLCA0PiBDYXNlU3RtdHM7CisgICAgY29uc3QgU3dpdGNoQ2FzZSAqQ2FzZSA9IDA7CiAgICAgaWYgKEZpbmRDYXNlU3RhdGVtZW50c0ZvclZhbHVlKFMsIENvbnN0YW50Q29uZFZhbHVlLCBDYXNlU3RtdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLCBDYXNlKSkgeworICAgICAgaWYgKENhc2UpIHsKKyAgICAgICAgUmVnaW9uQ291bnRlciBDYXNlQ250ID0gZ2V0UEdPUmVnaW9uQ291bnRlcihDYXNlKTsKKyAgICAgICAgQ2FzZUNudC5iZWdpblJlZ2lvbihCdWlsZGVyKTsKKyAgICAgIH0KICAgICAgIFJ1bkNsZWFudXBzU2NvcGUgRXhlY3V0ZWRTY29wZSgqdGhpcyk7CiAKICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGFyZSBubyBsb25nZXIgIndpdGhpbiIgYSBzd2l0Y2ggaW5zdGFuY2UsIHNvCkBAIC0xMjYzLDYgKzEzMzcsOCBAQAogICAgICAgLy8gc3BlY2lmaWVkIHNlcmllcyBvZiBzdGF0ZW1lbnRzIGFuZCB3ZSdyZSBnb29kLgogICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IENhc2VTdG10cy5zaXplKCk7IGkgIT0gZTsgKytpKQogICAgICAgICBFbWl0U3RtdChDYXNlU3RtdHNbaV0pOworICAgICAgUmVnaW9uQ291bnRlciBFeGl0Q250ID0gZ2V0UEdPUmVnaW9uQ291bnRlcigmUyk7CisgICAgICBFeGl0Q250LmJlZ2luUmVnaW9uKEJ1aWxkZXIpOwogCiAgICAgICAvLyBOb3cgd2Ugd2FudCB0byByZXN0b3JlIHRoZSBzYXZlZCBzd2l0Y2ggaW5zdGFuY2Ugc28gdGhhdCBuZXN0ZWQKICAgICAgIC8vIHN3aXRjaGVzIGNvbnRpbnVlIHRvIGZ1bmN0aW9uIHByb3Blcmx5CkBAIC0xMjgwLDEyICsxMzU2LDI5IEBACiAgIC8vIGZhaWx1cmUuCiAgIGxsdm06OkJhc2ljQmxvY2sgKkRlZmF1bHRCbG9jayA9IGNyZWF0ZUJhc2ljQmxvY2soInN3LmRlZmF1bHQiKTsKICAgU3dpdGNoSW5zbiA9IEJ1aWxkZXIuQ3JlYXRlU3dpdGNoKENvbmRWLCBEZWZhdWx0QmxvY2spOworICBpZiAoUEdPLmhhdmVSZWdpb25Db3VudHMoKSkgeworICAgIC8vIFdhbGsgdGhlIFN3aXRjaENhc2UgbGlzdCB0byBmaW5kIGhvdyBtYW55IHRoZXJlIGFyZS4KKyAgICB1aW50NjRfdCBEZWZhdWx0Q291bnQgPSAwOworICAgIHVuc2lnbmVkIE51bUNhc2VzID0gMDsKKyAgICBmb3IgKGNvbnN0IFN3aXRjaENhc2UgKkNhc2UgPSBTLmdldFN3aXRjaENhc2VMaXN0KCk7CisgICAgICAgICBDYXNlOworICAgICAgICAgQ2FzZSA9IENhc2UtPmdldE5leHRTd2l0Y2hDYXNlKCkpIHsKKyAgICAgIGlmIChpc2E8RGVmYXVsdFN0bXQ+KENhc2UpKQorICAgICAgICBEZWZhdWx0Q291bnQgPSBnZXRQR09SZWdpb25Db3VudGVyKENhc2UpLmdldENvdW50KCk7CisgICAgICBOdW1DYXNlcyArPSAxOworICAgIH0KKyAgICBTd2l0Y2hXZWlnaHRzID0gbmV3IFNtYWxsVmVjdG9yPHVpbnQ2NF90LCAxNj4oKTsKKyAgICBTd2l0Y2hXZWlnaHRzLT5yZXNlcnZlKE51bUNhc2VzKTsKKyAgICAvLyBUaGUgZGVmYXVsdCBuZWVkcyB0byBiZSBmaXJzdC4gV2Ugc3RvcmUgdGhlIGVkZ2UgY291bnQsIHNvIHdlIGFscmVhZHkKKyAgICAvLyBrbm93IHRoZSByaWdodCB3ZWlnaHQuCisgICAgU3dpdGNoV2VpZ2h0cy0+cHVzaF9iYWNrKERlZmF1bHRDb3VudCk7CisgIH0KICAgQ2FzZVJhbmdlQmxvY2sgPSBEZWZhdWx0QmxvY2s7CiAKICAgLy8gQ2xlYXIgdGhlIGluc2VydGlvbiBwb2ludCB0byBpbmRpY2F0ZSB3ZSBhcmUgaW4gdW5yZWFjaGFibGUgY29kZS4KICAgQnVpbGRlci5DbGVhckluc2VydGlvblBvaW50KCk7CiAKLSAgLy8gQWxsIGJyZWFrIHN0YXRlbWVudHMganVtcCB0byBOZXh0QmxvY2suIElmIEJyZWFrQ29udGludWVTdGFjayBpcyBub24gZW1wdHkKKyAgLy8gQWxsIGJyZWFrIHN0YXRlbWVudHMganVtcCB0byBOZXh0QmxvY2suIElmIEJyZWFrQ29udGludWVTdGFjayBpcyBub24tZW1wdHkKICAgLy8gdGhlbiByZXVzZSBsYXN0IENvbnRpbnVlQmxvY2suCiAgIEp1bXBEZXN0IE91dGVyQ29udGludWU7CiAgIGlmICghQnJlYWtDb250aW51ZVN0YWNrLmVtcHR5KCkpCkBAIC0xMzIwLDggKzE0MTMsMjAgQEAKIAogICAvLyBFbWl0IGNvbnRpbnVhdGlvbi4KICAgRW1pdEJsb2NrKFN3aXRjaEV4aXQuZ2V0QmxvY2soKSwgdHJ1ZSk7CisgIFJlZ2lvbkNvdW50ZXIgRXhpdENudCA9IGdldFBHT1JlZ2lvbkNvdW50ZXIoJlMpOworICBFeGl0Q250LmJlZ2luUmVnaW9uKEJ1aWxkZXIpOwogCisgIGlmIChTd2l0Y2hXZWlnaHRzKSB7CisgICAgYXNzZXJ0KFN3aXRjaFdlaWdodHMtPnNpemUoKSA9PSAxICsgU3dpdGNoSW5zbi0+Z2V0TnVtQ2FzZXMoKSAmJgorICAgICAgICAgICAic3dpdGNoIHdlaWdodHMgZG8gbm90IG1hdGNoIHN3aXRjaCBjYXNlcyIpOworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUganVtcCBkZXN0aW5hdGlvbiB0aGVyZSdzIG5vIHNlbnNlIHdlaWdodGluZyBpdC4KKyAgICBpZiAoU3dpdGNoV2VpZ2h0cy0+c2l6ZSgpID4gMSkKKyAgICAgIFN3aXRjaEluc24tPnNldE1ldGFkYXRhKGxsdm06OkxMVk1Db250ZXh0OjpNRF9wcm9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEdPLmNyZWF0ZUJyYW5jaFdlaWdodHMoKlN3aXRjaFdlaWdodHMpKTsKKyAgICBkZWxldGUgU3dpdGNoV2VpZ2h0czsKKyAgfQogICBTd2l0Y2hJbnNuID0gU2F2ZWRTd2l0Y2hJbnNuOworICBTd2l0Y2hXZWlnaHRzID0gU2F2ZWRTd2l0Y2hXZWlnaHRzOwogICBDYXNlUmFuZ2VCbG9jayA9IFNhdmVkQ1JCbG9jazsKIH0KIApAQCAtMTQ5Myw3ICsxNTk4LDcgQEAKICAgICAgIE5hbWUgPSBHQVMtPmdldE91dHB1dE5hbWUoaSk7CiAgICAgVGFyZ2V0SW5mbzo6Q29uc3RyYWludEluZm8gSW5mbyhTLmdldE91dHB1dENvbnN0cmFpbnQoaSksIE5hbWUpOwogICAgIGJvb2wgSXNWYWxpZCA9IGdldFRhcmdldCgpLnZhbGlkYXRlT3V0cHV0Q29uc3RyYWludChJbmZvKTsgKHZvaWQpSXNWYWxpZDsKLSAgICBhc3NlcnQoSXNWYWxpZCAmJiAiRmFpbGVkIHRvIHBhcnNlIG91dHB1dCBjb25zdHJhaW50Iik7IAorICAgIGFzc2VydChJc1ZhbGlkICYmICJGYWlsZWQgdG8gcGFyc2Ugb3V0cHV0IGNvbnN0cmFpbnQiKTsKICAgICBPdXRwdXRDb25zdHJhaW50SW5mb3MucHVzaF9iYWNrKEluZm8pOwogICB9CiAKQEAgLTE4MjksOCArMTkzNCw4IEBACiAgIC8vIENyZWF0ZSB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24uCiAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbyBFeHRJbmZvOwogICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmRnVuY0luZm8gPQotICAgIENHTS5nZXRUeXBlcygpLmFycmFuZ2VGdW5jdGlvbkRlY2xhcmF0aW9uKEN0eC5Wb2lkVHksIEFyZ3MsIEV4dEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypJc1ZhcmlhZGljPSovZmFsc2UpOworICAgICAgQ0dNLmdldFR5cGVzKCkuYXJyYW5nZUZyZWVGdW5jdGlvbkRlY2xhcmF0aW9uKEN0eC5Wb2lkVHksIEFyZ3MsIEV4dEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypJc1ZhcmlhZGljPSovZmFsc2UpOwogICBsbHZtOjpGdW5jdGlvblR5cGUgKkZ1bmNMTFZNVHkgPSBDR00uZ2V0VHlwZXMoKS5HZXRGdW5jdGlvblR5cGUoRnVuY0luZm8pOwogCiAgIGxsdm06OkZ1bmN0aW9uICpGID0KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHVlRULmNwcCBiL2xpYi9Db2RlR2VuL0NHVlRULmNwcAppbmRleCBiZmZmNDcwLi5iZDI4MGVhIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR1ZUVC5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ0dWVFQuY3BwCkBAIC02Niw3ICs2Niw4IEBACiAgICAgaWYgKFZUVFZULmdldEJhc2UoKSA9PSBSRCkgewogICAgICAgLy8gSnVzdCBnZXQgdGhlIGFkZHJlc3MgcG9pbnQgZm9yIHRoZSByZWd1bGFyIHZ0YWJsZS4KICAgICAgIEFkZHJlc3NQb2ludCA9Ci0gICAgICAgICAgSXRhbml1bVZUQ29udGV4dC5nZXRWVGFibGVMYXlvdXQoUkQpLmdldEFkZHJlc3NQb2ludChpLT5WVGFibGVCYXNlKTsKKyAgICAgICAgICBnZXRJdGFuaXVtVlRhYmxlQ29udGV4dCgpLmdldFZUYWJsZUxheW91dChSRCkuZ2V0QWRkcmVzc1BvaW50KAorICAgICAgICAgICAgICBpLT5WVGFibGVCYXNlKTsKICAgICAgIGFzc2VydChBZGRyZXNzUG9pbnQgIT0gMCAmJiAiRGlkIG5vdCBmaW5kIHZ0YWJsZSBhZGRyZXNzIHBvaW50ISIpOwogICAgIH0gZWxzZSB7CiAgICAgICBBZGRyZXNzUG9pbnQgPSBWVGFibGVBZGRyZXNzUG9pbnRzW2ktPlZUYWJsZUluZGV4XS5sb29rdXAoaS0+VlRhYmxlQmFzZSk7CkBAIC05NCw3ICs5NSw3IEBACiAgIFZUVC0+c2V0TGlua2FnZShMaW5rYWdlKTsKIAogICAvLyBTZXQgdGhlIHJpZ2h0IHZpc2liaWxpdHkuCi0gIENHTS5zZXRUeXBlVmlzaWJpbGl0eShWVFQsIFJELCBDb2RlR2VuTW9kdWxlOjpUVktfRm9yVlRUKTsKKyAgQ0dNLnNldEdsb2JhbFZpc2liaWxpdHkoVlRULCBSRCk7CiB9CiAKIGxsdm06Okdsb2JhbFZhcmlhYmxlICpDb2RlR2VuVlRhYmxlczo6R2V0QWRkck9mVlRUKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9DR1ZUYWJsZXMuY3BwIGIvbGliL0NvZGVHZW4vQ0dWVGFibGVzLmNwcAppbmRleCBmMjhkOWI2Li4wYWQ3NjVjIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DR1ZUYWJsZXMuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NHVlRhYmxlcy5jcHAKQEAgLTMwLDE0ICszMCw3IEBACiB1c2luZyBuYW1lc3BhY2UgQ29kZUdlbjsKIAogQ29kZUdlblZUYWJsZXM6OkNvZGVHZW5WVGFibGVzKENvZGVHZW5Nb2R1bGUgJkNHTSkKLSAgOiBDR00oQ0dNKSwgSXRhbml1bVZUQ29udGV4dChDR00uZ2V0Q29udGV4dCgpKSB7Ci0gIGlmIChDR00uZ2V0VGFyZ2V0KCkuZ2V0Q1hYQUJJKCkuaXNNaWNyb3NvZnQoKSkgewotICAgIC8vIEZJWE1FOiBFdmVudHVhbGx5LCB3ZSBzaG91bGQgb25seSBoYXZlIG9uZSBvZiBWKlRDb250ZXh0cyBhdmFpbGFibGUuCi0gICAgLy8gVG9kYXkgd2UgdXNlIGJvdGggaW4gdGhlIE1pY3Jvc29mdCBBQkkgYXMgTWljcm9zb2Z0VkZUYWJsZUNvbnRleHQKLSAgICAvLyBpcyBub3QgY29tcGxldGVseSBzdXBwb3J0ZWQgaW4gQ29kZUdlbiB5ZXQuCi0gICAgTWljcm9zb2Z0VlRDb250ZXh0LnJlc2V0KG5ldyBNaWNyb3NvZnRWVGFibGVDb250ZXh0KENHTS5nZXRDb250ZXh0KCkpKTsKLSAgfQotfQorICAgIDogQ0dNKENHTSksIFZUQ29udGV4dChDR00uZ2V0Q29udGV4dCgpLmdldFZUYWJsZUNvbnRleHQoKSkge30KIAogbGx2bTo6Q29uc3RhbnQgKkNvZGVHZW5Nb2R1bGU6OkdldEFkZHJPZlRodW5rKEdsb2JhbERlY2wgR0QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRodW5rSW5mbyAmVGh1bmspIHsKQEAgLTU0LDU0ICs0NywxMyBAQAogICBPdXQuZmx1c2goKTsKIAogICBsbHZtOjpUeXBlICpUeSA9IGdldFR5cGVzKCkuR2V0RnVuY3Rpb25UeXBlRm9yVlRhYmxlKEdEKTsKLSAgcmV0dXJuIEdldE9yQ3JlYXRlTExWTUZ1bmN0aW9uKE5hbWUsIFR5LCBHRCwgLypGb3JWVGFibGU9Ki90cnVlKTsKKyAgcmV0dXJuIEdldE9yQ3JlYXRlTExWTUZ1bmN0aW9uKE5hbWUsIFR5LCBHRCwgLypGb3JWVGFibGU9Ki90cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypEb250RGVmZXIqLyB0cnVlKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0VGh1bmtWaXNpYmlsaXR5KENvZGVHZW5Nb2R1bGUgJkNHTSwgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGh1bmtJbmZvICZUaHVuaywgbGx2bTo6RnVuY3Rpb24gKkZuKSB7CiAgIENHTS5zZXRHbG9iYWxWaXNpYmlsaXR5KEZuLCBNRCk7Ci0KLSAgaWYgKCFDR00uZ2V0Q29kZUdlbk9wdHMoKS5IaWRkZW5XZWFrVlRhYmxlcykKLSAgICByZXR1cm47Ci0KLSAgLy8gSWYgdGhlIHRodW5rIGhhcyB3ZWFrL2xpbmtvbmNlIGxpbmthZ2UsIGJ1dCB0aGUgZnVuY3Rpb24gbXVzdCBiZQotICAvLyBlbWl0dGVkIGluIGV2ZXJ5IHRyYW5zbGF0aW9uIHVuaXQgdGhhdCByZWZlcmVuY2VzIGl0LCB0aGVuIHdlIGNhbgotICAvLyBlbWl0IGl0cyB0aHVua3Mgd2l0aCBoaWRkZW4gdmlzaWJpbGl0eSwgc2luY2UgaXRzIHRodW5rcyBtdXN0IGJlCi0gIC8vIGVtaXR0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMuCi0KLSAgLy8gVGhpcyBmb2xsb3dzIENvZGVHZW5Nb2R1bGU6OnNldFR5cGVWaXNpYmlsaXR5OyBzZWUgdGhlIGNvbW1lbnRzCi0gIC8vIHRoZXJlIGZvciBleHBsYW5hdGlvbi4KLQotICBpZiAoKEZuLT5nZXRMaW5rYWdlKCkgIT0gbGx2bTo6R2xvYmFsVmFyaWFibGU6OkxpbmtPbmNlT0RSTGlua2FnZSAmJgotICAgICAgIEZuLT5nZXRMaW5rYWdlKCkgIT0gbGx2bTo6R2xvYmFsVmFyaWFibGU6OldlYWtPRFJMaW5rYWdlKSB8fAotICAgICAgRm4tPmdldFZpc2liaWxpdHkoKSAhPSBsbHZtOjpHbG9iYWxWYXJpYWJsZTo6RGVmYXVsdFZpc2liaWxpdHkpCi0gICAgcmV0dXJuOwotCi0gIGlmIChNRC0+Z2V0RXhwbGljaXRWaXNpYmlsaXR5KFZhbHVlRGVjbDo6VmlzaWJpbGl0eUZvclZhbHVlKSkKLSAgICByZXR1cm47Ci0KLSAgc3dpdGNoIChNRC0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSkgewotICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWZpbml0aW9uOgotICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWNsYXJhdGlvbjoKLSAgICByZXR1cm47Ci0KLSAgY2FzZSBUU0tfVW5kZWNsYXJlZDoKLSAgICBicmVhazsKLQotICBjYXNlIFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uOgotICBjYXNlIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb246Ci0gICAgcmV0dXJuOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLy8gSWYgdGhlcmUncyBhbiBleHBsaWNpdCBkZWZpbml0aW9uLCBhbmQgdGhhdCBkZWZpbml0aW9uIGlzCi0gIC8vIG91dC1vZi1saW5lLCB0aGVuIHdlIGNhbid0IGFzc3VtZSB0aGF0IGFsbCB1c2VycyB3aWxsIGhhdmUgYQotICAvLyBkZWZpbml0aW9uIHRvIGVtaXQuCi0gIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRGVmID0gMDsKLSAgaWYgKE1ELT5oYXNCb2R5KERlZikgJiYgRGVmLT5pc091dE9mTGluZSgpKQotICAgIHJldHVybjsKLQotICBGbi0+c2V0VmlzaWJpbGl0eShsbHZtOjpHbG9iYWxWYWx1ZTo6SGlkZGVuVmlzaWJpbGl0eSk7CiB9CiAKICNpZm5kZWYgTkRFQlVHCkBAIC0xNzcsNyArMTI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsRGVjbCBHRCwgY29uc3QgVGh1bmtJbmZvICZUaHVuaykgewogICBjb25zdCBDWFhNZXRob2REZWNsICpNRCA9IGNhc3Q8Q1hYTWV0aG9kRGVjbD4oR0QuZ2V0RGVjbCgpKTsKICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9IE1ELT5nZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwotICBRdWFsVHlwZSBSZXN1bHRUeXBlID0gRlBULT5nZXRSZXN1bHRUeXBlKCk7CisgIFF1YWxUeXBlIFJlc3VsdFR5cGUgPSBGUFQtPmdldFJldHVyblR5cGUoKTsKIAogICAvLyBHZXQgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uCiAgIGFzc2VydChGbkluZm8uaXNWYXJpYWRpYygpKTsKQEAgLTI0OCwxMSArMjAwLDExIEBACiAgIFF1YWxUeXBlIFRoaXNUeXBlID0gTUQtPmdldFRoaXNUeXBlKGdldENvbnRleHQoKSk7CiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpGUFQgPSBNRC0+Z2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKICAgUXVhbFR5cGUgUmVzdWx0VHlwZSA9Ci0gICAgQ0dNLmdldENYWEFCSSgpLkhhc1RoaXNSZXR1cm4oR0QpID8gVGhpc1R5cGUgOiBGUFQtPmdldFJlc3VsdFR5cGUoKTsKKyAgICAgIENHTS5nZXRDWFhBQkkoKS5IYXNUaGlzUmV0dXJuKEdEKSA/IFRoaXNUeXBlIDogRlBULT5nZXRSZXR1cm5UeXBlKCk7CiAgIEZ1bmN0aW9uQXJnTGlzdCBGdW5jdGlvbkFyZ3M7CiAKICAgLy8gQ3JlYXRlIHRoZSBpbXBsaWNpdCAndGhpcycgcGFyYW1ldGVyIGRlY2xhcmF0aW9uLgotICBDR00uZ2V0Q1hYQUJJKCkuQnVpbGRJbnN0YW5jZUZ1bmN0aW9uUGFyYW1zKCp0aGlzLCBSZXN1bHRUeXBlLCBGdW5jdGlvbkFyZ3MpOworICBDR00uZ2V0Q1hYQUJJKCkuYnVpbGRUaGlzUGFyYW0oKnRoaXMsIEZ1bmN0aW9uQXJncyk7CiAKICAgLy8gQWRkIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzLgogICBmb3IgKEZ1bmN0aW9uRGVjbDo6cGFyYW1fY29uc3RfaXRlcmF0b3IgSSA9IE1ELT5wYXJhbV9iZWdpbigpLApAQCAtMjYwLDYgKzIxMiw5IEBACiAgICAgICAgSSAhPSBFOyArK0kpCiAgICAgRnVuY3Rpb25BcmdzLnB1c2hfYmFjaygqSSk7CiAKKyAgaWYgKGlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oTUQpKQorICAgIENHTS5nZXRDWFhBQkkoKS5hZGRJbXBsaWNpdFN0cnVjdG9yUGFyYW1zKCp0aGlzLCBSZXN1bHRUeXBlLCBGdW5jdGlvbkFyZ3MpOworCiAgIC8vIFN0YXJ0IGRlZmluaW5nIHRoZSBmdW5jdGlvbi4KICAgU3RhcnRGdW5jdGlvbihHbG9iYWxEZWNsKCksIFJlc3VsdFR5cGUsIEZuLCBGbkluZm8sIEZ1bmN0aW9uQXJncywKICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpKTsKQEAgLTMxNiw3ICsyNzEsNyBAQAogCiAgIC8vIERldGVybWluZSB3aGV0aGVyIHdlIGhhdmUgYSByZXR1cm4gdmFsdWUgc2xvdCB0byB1c2UuCiAgIFF1YWxUeXBlIFJlc3VsdFR5cGUgPQotICAgIENHTS5nZXRDWFhBQkkoKS5IYXNUaGlzUmV0dXJuKEdEKSA/IFRoaXNUeXBlIDogRlBULT5nZXRSZXN1bHRUeXBlKCk7CisgICAgICBDR00uZ2V0Q1hYQUJJKCkuSGFzVGhpc1JldHVybihHRCkgPyBUaGlzVHlwZSA6IEZQVC0+Z2V0UmV0dXJuVHlwZSgpOwogICBSZXR1cm5WYWx1ZVNsb3QgU2xvdDsKICAgaWYgKCFSZXN1bHRUeXBlLT5pc1ZvaWRUeXBlKCkgJiYKICAgICAgIEN1ckZuSW5mby0+Z2V0UmV0dXJuSW5mbygpLmdldEtpbmQoKSA9PSBBQklBcmdJbmZvOjpJbmRpcmVjdCAmJgpAQCAtNDYxLDEyICs0MTYsOCBAQAogICBpZiAoaXNhPENYWERlc3RydWN0b3JEZWNsPihNRCkgJiYgR0QuZ2V0RHRvclR5cGUoKSA9PSBEdG9yX0Jhc2UpCiAgICAgcmV0dXJuOwogCi0gIGNvbnN0IFZUYWJsZUNvbnRleHRCYXNlOjpUaHVua0luZm9WZWN0b3JUeSAqVGh1bmtJbmZvVmVjdG9yOwotICBpZiAoTWljcm9zb2Z0VlRDb250ZXh0LmlzVmFsaWQoKSkgewotICAgIFRodW5rSW5mb1ZlY3RvciA9IE1pY3Jvc29mdFZUQ29udGV4dC0+Z2V0VGh1bmtJbmZvKEdEKTsKLSAgfSBlbHNlIHsKLSAgICBUaHVua0luZm9WZWN0b3IgPSBJdGFuaXVtVlRDb250ZXh0LmdldFRodW5rSW5mbyhHRCk7Ci0gIH0KKyAgY29uc3QgVlRhYmxlQ29udGV4dEJhc2U6OlRodW5rSW5mb1ZlY3RvclR5ICpUaHVua0luZm9WZWN0b3IgPQorICAgICAgVlRDb250ZXh0LT5nZXRUaHVua0luZm8oR0QpOwogCiAgIGlmICghVGh1bmtJbmZvVmVjdG9yKQogICAgIHJldHVybjsKQEAgLTYwMyw4ICs1NTQsOCBAQAogICBpZiAoQ0dEZWJ1Z0luZm8gKkRJID0gQ0dNLmdldE1vZHVsZURlYnVnSW5mbygpKQogICAgIERJLT5jb21wbGV0ZUNsYXNzRGF0YShCYXNlLmdldEJhc2UoKSk7CiAKLSAgT3duaW5nUHRyPFZUYWJsZUxheW91dD4gVlRMYXlvdXQoCi0gICAgICBJdGFuaXVtVlRDb250ZXh0LmNyZWF0ZUNvbnN0cnVjdGlvblZUYWJsZUxheW91dCgKKyAgc3RkOjp1bmlxdWVfcHRyPFZUYWJsZUxheW91dD4gVlRMYXlvdXQoCisgICAgICBnZXRJdGFuaXVtVlRhYmxlQ29udGV4dCgpLmNyZWF0ZUNvbnN0cnVjdGlvblZUYWJsZUxheW91dCgKICAgICAgICAgICBCYXNlLmdldEJhc2UoKSwgQmFzZS5nZXRCYXNlT2Zmc2V0KCksIEJhc2VJc1ZpcnR1YWwsIFJEKSk7CiAKICAgLy8gQWRkIHRoZSBhZGRyZXNzIHBvaW50cy4KQEAgLTYzMyw3ICs1ODQsNyBAQAogICAvLyBDcmVhdGUgdGhlIHZhcmlhYmxlIHRoYXQgd2lsbCBob2xkIHRoZSBjb25zdHJ1Y3Rpb24gdnRhYmxlLgogICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqVlRhYmxlID0gCiAgICAgQ0dNLkNyZWF0ZU9yUmVwbGFjZUNYWFJ1bnRpbWVWYXJpYWJsZShOYW1lLCBBcnJheVR5cGUsIExpbmthZ2UpOwotICBDR00uc2V0VHlwZVZpc2liaWxpdHkoVlRhYmxlLCBSRCwgQ29kZUdlbk1vZHVsZTo6VFZLX0ZvckNvbnN0cnVjdGlvblZUYWJsZSk7CisgIENHTS5zZXRHbG9iYWxWaXNpYmlsaXR5KFZUYWJsZSwgUkQpOwogCiAgIC8vIFYtdGFibGVzIGFyZSBhbHdheXMgdW5uYW1lZF9hZGRyLgogICBWVGFibGUtPnNldFVubmFtZWRBZGRyKHRydWUpOwpAQCAtNzUyLDcgKzcwMyw3IEBACiAvLy8gc3Ryb25nbHkgZWxzZXdoZXJlLiAgT3RoZXJ3aXNlLCB3ZSdkIGp1c3QgbGlrZSB0byBhdm9pZCBlbWl0dGluZwogLy8vIHYtdGFibGVzIHdoZW4gdW5uZWNlc3NhcnkuCiBib29sIENvZGVHZW5WVGFibGVzOjppc1ZUYWJsZUV4dGVybmFsKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7Ci0gIGFzc2VydChSRC0+aXNEeW5hbWljQ2xhc3MoKSAmJiAiTm9uIGR5bmFtaWMgY2xhc3NlcyBoYXZlIG5vIFZUYWJsZS4iKTsKKyAgYXNzZXJ0KFJELT5pc0R5bmFtaWNDbGFzcygpICYmICJOb24tZHluYW1pYyBjbGFzc2VzIGhhdmUgbm8gVlRhYmxlLiIpOwogCiAgIC8vIElmIHdlIGhhdmUgYW4gZXhwbGljaXQgaW5zdGFudGlhdGlvbiBkZWNsYXJhdGlvbiAoYW5kIG5vdCBhCiAgIC8vIGRlZmluaXRpb24pLCB0aGUgdi10YWJsZSBpcyBkZWZpbmVkIGVsc2V3aGVyZS4KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NHVlRhYmxlcy5oIGIvbGliL0NvZGVHZW4vQ0dWVGFibGVzLmgKaW5kZXggZThjZDU1ZS4uZTE1NTRiZSAxMDA2NDQKLS0tIGEvbGliL0NvZGVHZW4vQ0dWVGFibGVzLmgKKysrIGIvbGliL0NvZGVHZW4vQ0dWVGFibGVzLmgKQEAgLTMxLDExICszMSw4IEBACiBjbGFzcyBDb2RlR2VuVlRhYmxlcyB7CiAgIENvZGVHZW5Nb2R1bGUgJkNHTTsKIAotICAvLyBGSVhNRTogQ29uc2lkZXIgbW92aW5nIEl0YW5pdW1WVENvbnRleHQgYW5kIE1pY3Jvc29mdFZUQ29udGV4dCBpbnRvCi0gIC8vIHJlc3BlY3RpdmUgQ1hYQUJJIGNsYXNzZXM/Ci0gIEl0YW5pdW1WVGFibGVDb250ZXh0IEl0YW5pdW1WVENvbnRleHQ7Ci0gIE93bmluZ1B0cjxNaWNyb3NvZnRWVGFibGVDb250ZXh0PiBNaWNyb3NvZnRWVENvbnRleHQ7Ci0gIAorICBWVGFibGVDb250ZXh0QmFzZSAqVlRDb250ZXh0OworCiAgIC8vLyBWVGFibGVBZGRyZXNzUG9pbnRzTWFwVHkgLSBBZGRyZXNzIHBvaW50cyBmb3IgYSBzaW5nbGUgdnRhYmxlLgogICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPEJhc2VTdWJvYmplY3QsIHVpbnQ2NF90PiBWVGFibGVBZGRyZXNzUG9pbnRzTWFwVHk7CiAKQEAgLTcyLDEwICs2OSwxMiBAQAogCiAgIENvZGVHZW5WVGFibGVzKENvZGVHZW5Nb2R1bGUgJkNHTSk7CiAKLSAgSXRhbml1bVZUYWJsZUNvbnRleHQgJmdldEl0YW5pdW1WVGFibGVDb250ZXh0KCkgeyByZXR1cm4gSXRhbml1bVZUQ29udGV4dDsgfQorICBJdGFuaXVtVlRhYmxlQ29udGV4dCAmZ2V0SXRhbml1bVZUYWJsZUNvbnRleHQoKSB7CisgICAgcmV0dXJuICpjYXN0PEl0YW5pdW1WVGFibGVDb250ZXh0PihWVENvbnRleHQpOworICB9CiAKICAgTWljcm9zb2Z0VlRhYmxlQ29udGV4dCAmZ2V0TWljcm9zb2Z0VlRhYmxlQ29udGV4dCgpIHsKLSAgICByZXR1cm4gKk1pY3Jvc29mdFZUQ29udGV4dC5nZXQoKTsKKyAgICByZXR1cm4gKmNhc3Q8TWljcm9zb2Z0VlRhYmxlQ29udGV4dD4oVlRDb250ZXh0KTsKICAgfQogCiAgIC8vLyBnZXRTdWJWVFRJbmRleCAtIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHN1Yi1WVFQgZm9yIHRoZSBiYXNlIGNsYXNzIG9mIHRoZQpkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ01ha2VMaXN0cy50eHQgYi9saWIvQ29kZUdlbi9DTWFrZUxpc3RzLnR4dAppbmRleCA4M2RiYmYwLi4xMmNiMWFiIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvQ29kZUdlbi9DTWFrZUxpc3RzLnR4dApAQCAtMSwxMiArMSwxOCBAQAogc2V0KExMVk1fTElOS19DT01QT05FTlRTCi0gIGFzbXBhcnNlcgotICBiaXRyZWFkZXIKLSAgYml0d3JpdGVyCi0gIGlycmVhZGVyCi0gIGluc3RydW1lbnRhdGlvbgotICBpcG8KLSAgbGlua2VyCi0gIHZlY3Rvcml6ZQorICBCaXRSZWFkZXIKKyAgQml0V3JpdGVyCisgIENvcmUKKyAgSVBPCisgIElSUmVhZGVyCisgIEluc3RDb21iaW5lCisgIEluc3RydW1lbnRhdGlvbgorICBMaW5rZXIKKyAgTUMKKyAgT2JqQ0FSQ09wdHMKKyAgU2NhbGFyT3B0cworICBTdXBwb3J0CisgIFRhcmdldAorICBUcmFuc2Zvcm1VdGlscwogICApCiAKIGFkZF9jbGFuZ19saWJyYXJ5KGNsYW5nQ29kZUdlbgpAQCAtMTQsMTIgKzIwLDEyIEBACiAgIENHQXRvbWljLmNwcAogICBDR0Jsb2Nrcy5jcHAKICAgQ0dCdWlsdGluLmNwcAotICBDR0NhbGwuY3BwCi0gIENHQ2xhc3MuY3BwCiAgIENHQ1VEQU5WLmNwcAogICBDR0NVREFSdW50aW1lLmNwcAogICBDR0NYWC5jcHAKICAgQ0dDWFhBQkkuY3BwCisgIENHQ2FsbC5jcHAKKyAgQ0dDbGFzcy5jcHAKICAgQ0dDbGVhbnVwLmNwcAogICBDR0RlYnVnSW5mby5jcHAKICAgQ0dEZWNsLmNwcApAQCAtMjcsNDUgKzMzLDM2IEBACiAgIENHRXhjZXB0aW9uLmNwcAogICBDR0V4cHIuY3BwCiAgIENHRXhwckFnZy5jcHAKKyAgQ0dFeHByQ1hYLmNwcAogICBDR0V4cHJDb21wbGV4LmNwcAogICBDR0V4cHJDb25zdGFudC5jcHAKLSAgQ0dFeHByQ1hYLmNwcAogICBDR0V4cHJTY2FsYXIuY3BwCiAgIENHT2JqQy5jcHAKICAgQ0dPYmpDR05VLmNwcAogICBDR09iakNNYWMuY3BwCiAgIENHT2JqQ1J1bnRpbWUuY3BwCiAgIENHT3BlbkNMUnVudGltZS5jcHAKLSAgQ0dSZWNvcmRMYXlvdXRCdWlsZGVyLmNwcAogICBDR1JUVEkuY3BwCisgIENHUmVjb3JkTGF5b3V0QnVpbGRlci5jcHAKICAgQ0dTdG10LmNwcAotICBDR1ZUYWJsZXMuY3BwCiAgIENHVlRULmNwcAorICBDR1ZUYWJsZXMuY3BwCiAgIENvZGVHZW5BQklUeXBlcy5jcHAKICAgQ29kZUdlbkFjdGlvbi5jcHAKICAgQ29kZUdlbkZ1bmN0aW9uLmNwcAogICBDb2RlR2VuTW9kdWxlLmNwcAorICBDb2RlR2VuUEdPLmNwcAogICBDb2RlR2VuVEJBQS5jcHAKICAgQ29kZUdlblR5cGVzLmNwcAogICBJdGFuaXVtQ1hYQUJJLmNwcAogICBNaWNyb3NvZnRDWFhBQkkuY3BwCi0gIE1pY3Jvc29mdFZCVGFibGVzLmNwcAogICBNb2R1bGVCdWlsZGVyLmNwcAogICBUYXJnZXRJbmZvLmNwcAotICApCiAKLWFkZF9kZXBlbmRlbmNpZXMoY2xhbmdDb2RlR2VuCi0gIENsYW5nQVJNTmVvbgotICBDbGFuZ0F0dHJDbGFzc2VzCi0gIENsYW5nQXR0ckxpc3QKLSAgQ2xhbmdDb21tZW50Tm9kZXMKLSAgQ2xhbmdEZWNsTm9kZXMKLSAgQ2xhbmdEaWFnbm9zdGljQ29tbW9uCi0gIENsYW5nRGlhZ25vc3RpY0Zyb250ZW5kCi0gIENsYW5nU3RtdE5vZGVzCi0gICkKKyAgREVQRU5EUworICBpbnRyaW5zaWNzX2dlbgogCi10YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmdDb2RlR2VuCisgIExJTktfTElCUwogICBjbGFuZ0Jhc2ljCiAgIGNsYW5nQVNUCiAgIGNsYW5nRnJvbnRlbmQKZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NvZGVHZW5BQklUeXBlcy5jcHAgYi9saWIvQ29kZUdlbi9Db2RlR2VuQUJJVHlwZXMuY3BwCmluZGV4IDE4YzgzNmMuLmZiYTcxODQgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NvZGVHZW5BQklUeXBlcy5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ29kZUdlbkFCSVR5cGVzLmNwcApAQCAtMTcsMjMgKzE3LDIzIEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiAjaW5jbHVkZSAiY2xhbmcvQ29kZUdlbi9Db2RlR2VuQUJJVHlwZXMuaCIKLQotI2luY2x1ZGUgImNsYW5nL0NvZGVHZW4vQ0dGdW5jdGlvbkluZm8uaCIKICNpbmNsdWRlICJDb2RlR2VuTW9kdWxlLmgiCisjaW5jbHVkZSAiY2xhbmcvQ29kZUdlbi9DR0Z1bmN0aW9uSW5mby5oIgorI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0NvZGVHZW5PcHRpb25zLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIHVzaW5nIG5hbWVzcGFjZSBDb2RlR2VuOwogCiBDb2RlR2VuQUJJVHlwZXM6OkNvZGVHZW5BQklUeXBlcyhBU1RDb250ZXh0ICZDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbk9wdGlvbnMgJkNvZGVHZW5PcHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6TW9kdWxlICZNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6RGF0YUxheW91dCAmVEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpCi0gIDogQ0dNKG5ldyBDb2RlR2VuOjpDb2RlR2VuTW9kdWxlKEMsIENvZGVHZW5PcHRzLCBNLCBURCwgRGlhZ3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpEYXRhTGF5b3V0ICZURCkKKyAgOiBDR08obmV3IENvZGVHZW5PcHRpb25zKSwKKyAgICBDR00obmV3IENvZGVHZW46OkNvZGVHZW5Nb2R1bGUoQywgKkNHTywgTSwgVEQsIEMuZ2V0RGlhZ25vc3RpY3MoKSkpIHsKIH0KIAogQ29kZUdlbkFCSVR5cGVzOjp+Q29kZUdlbkFCSVR5cGVzKCkKIHsKKyAgZGVsZXRlIENHTzsKICAgZGVsZXRlIENHTTsKIH0KIApAQCAtNjAsMTAgKzYwLDEwIEBACiB9CiAKIGNvbnN0IENHRnVuY3Rpb25JbmZvICYKLUNvZGVHZW5BQklUeXBlczo6YXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oQ2FuUXVhbFR5cGUgcmV0dXJuVHlwZSwKK0NvZGVHZW5BQklUeXBlczo6YXJyYW5nZUZyZWVGdW5jdGlvbkNhbGwoQ2FuUXVhbFR5cGUgcmV0dXJuVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8Q2FuUXVhbFR5cGU+IGFyZ1R5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblR5cGU6OkV4dEluZm8gaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRBcmdzIGFyZ3MpIHsKLSAgcmV0dXJuIENHTS0+Z2V0VHlwZXMoKS5hcnJhbmdlTExWTUZ1bmN0aW9uSW5mbyhyZXR1cm5UeXBlLCBhcmdUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8sIGFyZ3MpOworICByZXR1cm4gQ0dNLT5nZXRUeXBlcygpLmFycmFuZ2VMTFZNRnVuY3Rpb25JbmZvKAorICAgICAgcmV0dXJuVHlwZSwgLypJc0luc3RhbmNlTWV0aG9kPSovZmFsc2UsIGFyZ1R5cGVzLCBpbmZvLCBhcmdzKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NvZGVHZW5BY3Rpb24uY3BwIGIvbGliL0NvZGVHZW4vQ29kZUdlbkFjdGlvbi5jcHAKaW5kZXggMzA3MjIwNC4uNTczZjhlOSAxMDA2NDQKLS0tIGEvbGliL0NvZGVHZW4vQ29kZUdlbkFjdGlvbi5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ29kZUdlbkFjdGlvbi5jcHAKQEAgLTE4LDE3ICsxOCwxOSBAQAogI2luY2x1ZGUgImNsYW5nL0NvZGVHZW4vTW9kdWxlQnVpbGRlci5oIgogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0NvbXBpbGVySW5zdGFuY2UuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZERpYWdub3N0aWMuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgogI2luY2x1ZGUgImxsdm0vQml0Y29kZS9SZWFkZXJXcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RpYWdub3N0aWNJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EaWFnbm9zdGljUHJpbnRlci5oIgogI2luY2x1ZGUgImxsdm0vSVIvTExWTUNvbnRleHQuaCIKICNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgogI2luY2x1ZGUgImxsdm0vSVJSZWFkZXIvSVJSZWFkZXIuaCIKLSNpbmNsdWRlICJsbHZtL0xpbmtlci5oIgorI2luY2x1ZGUgImxsdm0vTGlua2VyL0xpbmtlci5oIgogI2luY2x1ZGUgImxsdm0vUGFzcy5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RpbWVyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIGxsdm07CiAKQEAgLTQ1LDQyICs0NywzMyBAQAogCiAgICAgVGltZXIgTExWTUlSR2VuZXJhdGlvbjsKIAotICAgIE93bmluZ1B0cjxDb2RlR2VuZXJhdG9yPiBHZW47CisgICAgc3RkOjp1bmlxdWVfcHRyPENvZGVHZW5lcmF0b3I+IEdlbjsKIAotICAgIE93bmluZ1B0cjxsbHZtOjpNb2R1bGU+IFRoZU1vZHVsZSwgTGlua01vZHVsZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TW9kdWxlPiBUaGVNb2R1bGUsIExpbmtNb2R1bGU7CiAKICAgcHVibGljOgogICAgIEJhY2tlbmRDb25zdW1lcihCYWNrZW5kQWN0aW9uIGFjdGlvbiwgRGlhZ25vc3RpY3NFbmdpbmUgJl9EaWFncywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZUdlbk9wdGlvbnMgJmNvbXBvcHRzLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRPcHRpb25zICZ0YXJnZXRvcHRzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmbGFuZ29wdHMsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgVGltZVBhc3NlcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmluZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgbGx2bTo6TW9kdWxlICpMaW5rTW9kdWxlLAotICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAqT1MsCi0gICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDKSA6Ci0gICAgICBEaWFncyhfRGlhZ3MpLAotICAgICAgQWN0aW9uKGFjdGlvbiksCi0gICAgICBDb2RlR2VuT3B0cyhjb21wb3B0cyksCi0gICAgICBUYXJnZXRPcHRzKHRhcmdldG9wdHMpLAotICAgICAgTGFuZ09wdHMobGFuZ29wdHMpLAotICAgICAgQXNtT3V0U3RyZWFtKE9TKSwKLSAgICAgIENvbnRleHQoKSwgCi0gICAgICBMTFZNSVJHZW5lcmF0aW9uKCJMTFZNIElSIEdlbmVyYXRpb24gVGltZSIpLAotICAgICAgR2VuKENyZWF0ZUxMVk1Db2RlR2VuKERpYWdzLCBpbmZpbGUsIGNvbXBvcHRzLCB0YXJnZXRvcHRzLCBDKSksCi0gICAgICBMaW5rTW9kdWxlKExpbmtNb2R1bGUpCi0gICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmbGFuZ29wdHMsIGJvb2wgVGltZVBhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmluZmlsZSwgbGx2bTo6TW9kdWxlICpMaW5rTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAqT1MsIExMVk1Db250ZXh0ICZDKQorICAgICAgICA6IERpYWdzKF9EaWFncyksIEFjdGlvbihhY3Rpb24pLCBDb2RlR2VuT3B0cyhjb21wb3B0cyksCisgICAgICAgICAgVGFyZ2V0T3B0cyh0YXJnZXRvcHRzKSwgTGFuZ09wdHMobGFuZ29wdHMpLCBBc21PdXRTdHJlYW0oT1MpLAorICAgICAgICAgIENvbnRleHQoKSwgTExWTUlSR2VuZXJhdGlvbigiTExWTSBJUiBHZW5lcmF0aW9uIFRpbWUiKSwKKyAgICAgICAgICBHZW4oQ3JlYXRlTExWTUNvZGVHZW4oRGlhZ3MsIGluZmlsZSwgY29tcG9wdHMsIHRhcmdldG9wdHMsIEMpKSwKKyAgICAgICAgICBMaW5rTW9kdWxlKExpbmtNb2R1bGUpIHsKICAgICAgIGxsdm06OlRpbWVQYXNzZXNJc0VuYWJsZWQgPSBUaW1lUGFzc2VzOwogICAgIH0KIAotICAgIGxsdm06Ok1vZHVsZSAqdGFrZU1vZHVsZSgpIHsgcmV0dXJuIFRoZU1vZHVsZS50YWtlKCk7IH0KLSAgICBsbHZtOjpNb2R1bGUgKnRha2VMaW5rTW9kdWxlKCkgeyByZXR1cm4gTGlua01vZHVsZS50YWtlKCk7IH0KKyAgICBsbHZtOjpNb2R1bGUgKnRha2VNb2R1bGUoKSB7IHJldHVybiBUaGVNb2R1bGUucmVsZWFzZSgpOyB9CisgICAgbGx2bTo6TW9kdWxlICp0YWtlTGlua01vZHVsZSgpIHsgcmV0dXJuIExpbmtNb2R1bGUucmVsZWFzZSgpOyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgSGFuZGxlQ1hYU3RhdGljTWVtYmVyVmFySW5zdGFudGlhdGlvbihWYXJEZWNsICpWRCkgeworICAgIHZvaWQgSGFuZGxlQ1hYU3RhdGljTWVtYmVyVmFySW5zdGFudGlhdGlvbihWYXJEZWNsICpWRCkgb3ZlcnJpZGUgewogICAgICAgR2VuLT5IYW5kbGVDWFhTdGF0aWNNZW1iZXJWYXJJbnN0YW50aWF0aW9uKFZEKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDdHgpIHsKKyAgICB2b2lkIEluaXRpYWxpemUoQVNUQ29udGV4dCAmQ3R4KSBvdmVycmlkZSB7CiAgICAgICBDb250ZXh0ID0gJkN0eDsKIAogICAgICAgaWYgKGxsdm06OlRpbWVQYXNzZXNJc0VuYWJsZWQpCkBAIC05NCw3ICs4Nyw3IEBACiAgICAgICAgIExMVk1JUkdlbmVyYXRpb24uc3RvcFRpbWVyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIEhhbmRsZVRvcExldmVsRGVjbChEZWNsR3JvdXBSZWYgRCkgeworICAgIGJvb2wgSGFuZGxlVG9wTGV2ZWxEZWNsKERlY2xHcm91cFJlZiBEKSBvdmVycmlkZSB7CiAgICAgICBQcmV0dHlTdGFja1RyYWNlRGVjbCBDcmFzaEluZm8oKkQuYmVnaW4oKSwgU291cmNlTG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LT5nZXRTb3VyY2VNYW5hZ2VyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxMVk0gSVIgZ2VuZXJhdGlvbiBvZiBkZWNsYXJhdGlvbiIpOwpAQCAtMTEwLDcgKzEwMyw3IEBACiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgSGFuZGxlVHJhbnNsYXRpb25Vbml0KEFTVENvbnRleHQgJkMpIHsKKyAgICB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDKSBvdmVycmlkZSB7CiAgICAgICB7CiAgICAgICAgIFByZXR0eVN0YWNrVHJhY2VTdHJpbmcgQ3Jhc2hJbmZvKCJQZXItZmlsZSBMTFZNIElSIGdlbmVyYXRpb24iKTsKICAgICAgICAgaWYgKGxsdm06OlRpbWVQYXNzZXNJc0VuYWJsZWQpCkBAIC0xMzIsNyArMTI1LDcgQEAKICAgICAgIGlmICghTSkgewogICAgICAgICAvLyBUaGUgbW9kdWxlIGhhcyBiZWVuIHJlbGVhc2VkIGJ5IElSIGdlbiBvbiBmYWlsdXJlcywgZG8gbm90IGRvdWJsZQogICAgICAgICAvLyBmcmVlLgotICAgICAgICBUaGVNb2R1bGUudGFrZSgpOworICAgICAgICBUaGVNb2R1bGUucmVsZWFzZSgpOwogICAgICAgICByZXR1cm47CiAgICAgICB9CiAKQEAgLTE1OCw0MSArMTUxLDQ5IEBACiAgICAgICB2b2lkICpPbGRDb250ZXh0ID0gQ3R4LmdldElubGluZUFzbURpYWdub3N0aWNDb250ZXh0KCk7CiAgICAgICBDdHguc2V0SW5saW5lQXNtRGlhZ25vc3RpY0hhbmRsZXIoSW5saW5lQXNtRGlhZ0hhbmRsZXIsIHRoaXMpOwogCisgICAgICBMTFZNQ29udGV4dDo6RGlhZ25vc3RpY0hhbmRsZXJUeSBPbGREaWFnbm9zdGljSGFuZGxlciA9CisgICAgICAgICAgQ3R4LmdldERpYWdub3N0aWNIYW5kbGVyKCk7CisgICAgICB2b2lkICpPbGREaWFnbm9zdGljQ29udGV4dCA9IEN0eC5nZXREaWFnbm9zdGljQ29udGV4dCgpOworICAgICAgQ3R4LnNldERpYWdub3N0aWNIYW5kbGVyKERpYWdub3N0aWNIYW5kbGVyLCB0aGlzKTsKKwogICAgICAgRW1pdEJhY2tlbmRPdXRwdXQoRGlhZ3MsIENvZGVHZW5PcHRzLCBUYXJnZXRPcHRzLCBMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIEMuZ2V0VGFyZ2V0SW5mbygpLmdldFRhcmdldERlc2NyaXB0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBUaGVNb2R1bGUuZ2V0KCksIEFjdGlvbiwgQXNtT3V0U3RyZWFtKTsKLSAgICAgIAorCiAgICAgICBDdHguc2V0SW5saW5lQXNtRGlhZ25vc3RpY0hhbmRsZXIoT2xkSGFuZGxlciwgT2xkQ29udGV4dCk7CisKKyAgICAgIEN0eC5zZXREaWFnbm9zdGljSGFuZGxlcihPbGREaWFnbm9zdGljSGFuZGxlciwgT2xkRGlhZ25vc3RpY0NvbnRleHQpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBIYW5kbGVUYWdEZWNsRGVmaW5pdGlvbihUYWdEZWNsICpEKSB7CisgICAgdm9pZCBIYW5kbGVUYWdEZWNsRGVmaW5pdGlvbihUYWdEZWNsICpEKSBvdmVycmlkZSB7CiAgICAgICBQcmV0dHlTdGFja1RyYWNlRGVjbCBDcmFzaEluZm8oRCwgU291cmNlTG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LT5nZXRTb3VyY2VNYW5hZ2VyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxMVk0gSVIgZ2VuZXJhdGlvbiBvZiBkZWNsYXJhdGlvbiIpOwogICAgICAgR2VuLT5IYW5kbGVUYWdEZWNsRGVmaW5pdGlvbihEKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgSGFuZGxlVGFnRGVjbFJlcXVpcmVkRGVmaW5pdGlvbihjb25zdCBUYWdEZWNsICpEKSB7CisgICAgdm9pZCBIYW5kbGVUYWdEZWNsUmVxdWlyZWREZWZpbml0aW9uKGNvbnN0IFRhZ0RlY2wgKkQpIG92ZXJyaWRlIHsKICAgICAgIEdlbi0+SGFuZGxlVGFnRGVjbFJlcXVpcmVkRGVmaW5pdGlvbihEKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgQ29tcGxldGVUZW50YXRpdmVEZWZpbml0aW9uKFZhckRlY2wgKkQpIHsKKyAgICB2b2lkIENvbXBsZXRlVGVudGF0aXZlRGVmaW5pdGlvbihWYXJEZWNsICpEKSBvdmVycmlkZSB7CiAgICAgICBHZW4tPkNvbXBsZXRlVGVudGF0aXZlRGVmaW5pdGlvbihEKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgSGFuZGxlVlRhYmxlKENYWFJlY29yZERlY2wgKlJELCBib29sIERlZmluaXRpb25SZXF1aXJlZCkgeworICAgIHZvaWQgSGFuZGxlVlRhYmxlKENYWFJlY29yZERlY2wgKlJELCBib29sIERlZmluaXRpb25SZXF1aXJlZCkgb3ZlcnJpZGUgewogICAgICAgR2VuLT5IYW5kbGVWVGFibGUoUkQsIERlZmluaXRpb25SZXF1aXJlZCk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIEhhbmRsZUxpbmtlck9wdGlvblByYWdtYShsbHZtOjpTdHJpbmdSZWYgT3B0cykgeworICAgIHZvaWQgSGFuZGxlTGlua2VyT3B0aW9uUHJhZ21hKGxsdm06OlN0cmluZ1JlZiBPcHRzKSBvdmVycmlkZSB7CiAgICAgICBHZW4tPkhhbmRsZUxpbmtlck9wdGlvblByYWdtYShPcHRzKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgSGFuZGxlRGV0ZWN0TWlzbWF0Y2gobGx2bTo6U3RyaW5nUmVmIE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBWYWx1ZSkgeworICAgIHZvaWQgSGFuZGxlRGV0ZWN0TWlzbWF0Y2gobGx2bTo6U3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBWYWx1ZSkgb3ZlcnJpZGUgewogICAgICAgR2VuLT5IYW5kbGVEZXRlY3RNaXNtYXRjaChOYW1lLCBWYWx1ZSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIEhhbmRsZURlcGVuZGVudExpYnJhcnkobGx2bTo6U3RyaW5nUmVmIE9wdHMpIHsKKyAgICB2b2lkIEhhbmRsZURlcGVuZGVudExpYnJhcnkobGx2bTo6U3RyaW5nUmVmIE9wdHMpIG92ZXJyaWRlIHsKICAgICAgIEdlbi0+SGFuZGxlRGVwZW5kZW50TGlicmFyeShPcHRzKTsKICAgICB9CiAKQEAgLTIwMiw4ICsyMDMsMjMgQEAKICAgICAgICgoQmFja2VuZENvbnN1bWVyKilDb250ZXh0KS0+SW5saW5lQXNtRGlhZ0hhbmRsZXIyKFNNLCBMb2MpOwogICAgIH0KIAorICAgIHN0YXRpYyB2b2lkIERpYWdub3N0aWNIYW5kbGVyKGNvbnN0IGxsdm06OkRpYWdub3N0aWNJbmZvICZESSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDb250ZXh0KSB7CisgICAgICAoKEJhY2tlbmRDb25zdW1lciAqKUNvbnRleHQpLT5EaWFnbm9zdGljSGFuZGxlckltcGwoREkpOworICAgIH0KKwogICAgIHZvaWQgSW5saW5lQXNtRGlhZ0hhbmRsZXIyKGNvbnN0IGxsdm06OlNNRGlhZ25vc3RpYyAmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0Nvb2tpZSk7CisKKyAgICB2b2lkIERpYWdub3N0aWNIYW5kbGVySW1wbChjb25zdCBsbHZtOjpEaWFnbm9zdGljSW5mbyAmREkpOworICAgIC8vLyBcYnJpZWYgU3BlY2lhbGl6ZWQgaGFuZGxlciBmb3IgSW5saW5lQXNtIGRpYWdub3N0aWMuCisgICAgLy8vIFxyZXR1cm4gVHJ1ZSBpZiB0aGUgZGlhZ25vc3RpYyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVwb3J0ZWQsIGZhbHNlCisgICAgLy8vIG90aGVyd2lzZS4KKyAgICBib29sIElubGluZUFzbURpYWdIYW5kbGVyKGNvbnN0IGxsdm06OkRpYWdub3N0aWNJbmZvSW5saW5lQXNtICZEKTsKKyAgICAvLy8gXGJyaWVmIFNwZWNpYWxpemVkIGhhbmRsZXIgZm9yIFN0YWNrU2l6ZSBkaWFnbm9zdGljLgorICAgIC8vLyBccmV0dXJuIFRydWUgaWYgdGhlIGRpYWdub3N0aWMgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlcG9ydGVkLCBmYWxzZQorICAgIC8vLyBvdGhlcndpc2UuCisgICAgYm9vbCBTdGFja1NpemVEaWFnSGFuZGxlcihjb25zdCBsbHZtOjpEaWFnbm9zdGljSW5mb1N0YWNrU2l6ZSAmRCk7CiAgIH07CiAgIAogICB2b2lkIEJhY2tlbmRDb25zdW1lcjo6YW5jaG9yKCkge30KQEAgLTI4Miw3ICsyOTgsMTE2IEBACiAgIERpYWdzLlJlcG9ydChMb2MsIGRpYWc6OmVycl9mZV9pbmxpbmVfYXNtKS5BZGRTdHJpbmcoTWVzc2FnZSk7CiB9CiAKLS8vCisjZGVmaW5lIENvbXB1dGVEaWFnSUQoU2V2ZXJpdHksIEdyb3VwTmFtZSwgRGlhZ0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzd2l0Y2ggKFNldmVyaXR5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBsbHZtOjpEU19FcnJvcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRGlhZ0lEID0gZGlhZzo6ZXJyX2ZlXyMjR3JvdXBOYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBsbHZtOjpEU19XYXJuaW5nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRGlhZ0lEID0gZGlhZzo6d2Fybl9mZV8jI0dyb3VwTmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBsbHZtOjpEU19SZW1hcms6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiJ3JlbWFyaycgc2V2ZXJpdHkgbm90IGV4cGVjdGVkIik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBsbHZtOjpEU19Ob3RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRGlhZ0lEID0gZGlhZzo6bm90ZV9mZV8jI0dyb3VwTmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlIChmYWxzZSkKKworI2RlZmluZSBDb21wdXRlRGlhZ1JlbWFya0lEKFNldmVyaXR5LCBHcm91cE5hbWUsIERpYWdJRCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3dpdGNoIChTZXZlcml0eSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgbGx2bTo6RFNfRXJyb3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIERpYWdJRCA9IGRpYWc6OmVycl9mZV8jI0dyb3VwTmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgbGx2bTo6RFNfV2FybmluZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIERpYWdJRCA9IGRpYWc6Ondhcm5fZmVfIyNHcm91cE5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgbGx2bTo6RFNfUmVtYXJrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIERpYWdJRCA9IGRpYWc6OnJlbWFya19mZV8jI0dyb3VwTmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgbGx2bTo6RFNfTm90ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIERpYWdJRCA9IGRpYWc6Om5vdGVfZmVfIyNHcm91cE5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoZmFsc2UpCisKK2Jvb2wKK0JhY2tlbmRDb25zdW1lcjo6SW5saW5lQXNtRGlhZ0hhbmRsZXIoY29uc3QgbGx2bTo6RGlhZ25vc3RpY0luZm9JbmxpbmVBc20gJkQpIHsKKyAgdW5zaWduZWQgRGlhZ0lEOworICBDb21wdXRlRGlhZ0lEKEQuZ2V0U2V2ZXJpdHkoKSwgaW5saW5lX2FzbSwgRGlhZ0lEKTsKKyAgc3RkOjpzdHJpbmcgTWVzc2FnZSA9IEQuZ2V0TXNnU3RyKCkuc3RyKCk7CisKKyAgLy8gSWYgdGhpcyBwcm9ibGVtIGhhcyBjbGFuZy1sZXZlbCBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24sIHJlcG9ydCB0aGUKKyAgLy8gaXNzdWUgYXMgYmVpbmcgYSBwcm9ibGVtIGluIHRoZSBzb3VyY2Ugd2l0aCBhIG5vdGUgc2hvd2luZyB0aGUgaW5zdGFudGlhdGVkCisgIC8vIGNvZGUuCisgIFNvdXJjZUxvY2F0aW9uIExvY0Nvb2tpZSA9CisgICAgICBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKEQuZ2V0TG9jQ29va2llKCkpOworICBpZiAoTG9jQ29va2llLmlzVmFsaWQoKSkKKyAgICBEaWFncy5SZXBvcnQoTG9jQ29va2llLCBEaWFnSUQpLkFkZFN0cmluZyhNZXNzYWdlKTsKKyAgZWxzZSB7CisgICAgLy8gT3RoZXJ3aXNlLCByZXBvcnQgdGhlIGJhY2tlbmQgZGlhZ25vc3RpYyBhcyBvY2N1cnJpbmcgaW4gdGhlIGdlbmVyYXRlZAorICAgIC8vIC5zIGZpbGUuCisgICAgLy8gSWYgTG9jIGlzIGludmFsaWQsIHdlIHN0aWxsIG5lZWQgdG8gcmVwb3J0IHRoZSBkaWFnbm9zdGljLCBpdCBqdXN0IGdldHMKKyAgICAvLyBubyBsb2NhdGlvbiBpbmZvLgorICAgIEZ1bGxTb3VyY2VMb2MgTG9jOworICAgIERpYWdzLlJlcG9ydChMb2MsIERpYWdJRCkuQWRkU3RyaW5nKE1lc3NhZ2UpOworICB9CisgIC8vIFdlIGhhbmRsZWQgYWxsIHRoZSBwb3NzaWJsZSBzZXZlcml0aWVzLgorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbAorQmFja2VuZENvbnN1bWVyOjpTdGFja1NpemVEaWFnSGFuZGxlcihjb25zdCBsbHZtOjpEaWFnbm9zdGljSW5mb1N0YWNrU2l6ZSAmRCkgeworICBpZiAoRC5nZXRTZXZlcml0eSgpICE9IGxsdm06OkRTX1dhcm5pbmcpCisgICAgLy8gRm9yIG5vdywgdGhlIG9ubHkgc3VwcG9ydCB3ZSBoYXZlIGZvciBTdGFja1NpemUgZGlhZ25vc3RpYyBpcyB3YXJuaW5nLgorICAgIC8vIFdlIGRvIG5vdCBrbm93IGhvdyB0byBmb3JtYXQgb3RoZXIgc2V2ZXJpdGllcy4KKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRklYTUU6IFdlIHNob3VsZCBkZW1hbmdsZSB0aGUgZnVuY3Rpb24gbmFtZS4KKyAgLy8gRklYTUU6IElzIHRoZXJlIGEgd2F5IHRvIGdldCBhIGxvY2F0aW9uIGZvciB0aGF0IGZ1bmN0aW9uPworICBGdWxsU291cmNlTG9jIExvYzsKKyAgRGlhZ3MuUmVwb3J0KExvYywgZGlhZzo6d2Fybl9mZV9iYWNrZW5kX2ZyYW1lX2xhcmdlcl90aGFuKQorICAgICAgPDwgRC5nZXRTdGFja1NpemUoKSA8PCBELmdldEZ1bmN0aW9uKCkuZ2V0TmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFxicmllZiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgd2hlbiB0aGUgYmFja2VuZCBuZWVkcworLy8vIHRvIHJlcG9ydCBzb21ldGhpbmcgdG8gdGhlIHVzZXIuCit2b2lkIEJhY2tlbmRDb25zdW1lcjo6RGlhZ25vc3RpY0hhbmRsZXJJbXBsKGNvbnN0IERpYWdub3N0aWNJbmZvICZESSkgeworICB1bnNpZ25lZCBEaWFnSUQgPSBkaWFnOjplcnJfZmVfaW5saW5lX2FzbTsKKyAgbGx2bTo6RGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5ID0gREkuZ2V0U2V2ZXJpdHkoKTsKKyAgLy8gR2V0IHRoZSBkaWFnbm9zdGljIElEIGJhc2VkLgorICBzd2l0Y2ggKERJLmdldEtpbmQoKSkgeworICBjYXNlIGxsdm06OkRLX0lubGluZUFzbToKKyAgICBpZiAoSW5saW5lQXNtRGlhZ0hhbmRsZXIoY2FzdDxEaWFnbm9zdGljSW5mb0lubGluZUFzbT4oREkpKSkKKyAgICAgIHJldHVybjsKKyAgICBDb21wdXRlRGlhZ0lEKFNldmVyaXR5LCBpbmxpbmVfYXNtLCBEaWFnSUQpOworICAgIGJyZWFrOworICBjYXNlIGxsdm06OkRLX1N0YWNrU2l6ZToKKyAgICBpZiAoU3RhY2tTaXplRGlhZ0hhbmRsZXIoY2FzdDxEaWFnbm9zdGljSW5mb1N0YWNrU2l6ZT4oREkpKSkKKyAgICAgIHJldHVybjsKKyAgICBDb21wdXRlRGlhZ0lEKFNldmVyaXR5LCBiYWNrZW5kX2ZyYW1lX2xhcmdlcl90aGFuLCBEaWFnSUQpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIC8vIFBsdWdpbiBJRHMgYXJlIG5vdCBib3VuZCB0byBhbnkgdmFsdWUgYXMgdGhleSBhcmUgc2V0IGR5bmFtaWNhbGx5LgorICAgIENvbXB1dGVEaWFnUmVtYXJrSUQoU2V2ZXJpdHksIGJhY2tlbmRfcGx1Z2luLCBEaWFnSUQpOworICAgIGJyZWFrOworICB9CisgIHN0ZDo6c3RyaW5nIE1zZ1N0b3JhZ2U7CisgIHsKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gU3RyZWFtKE1zZ1N0b3JhZ2UpOworICAgIERpYWdub3N0aWNQcmludGVyUmF3T1N0cmVhbSBEUChTdHJlYW0pOworICAgIERJLnByaW50KERQKTsKKyAgfQorCisgIC8vIFJlcG9ydCB0aGUgYmFja2VuZCBtZXNzYWdlIHVzaW5nIHRoZSB1c3VhbCBkaWFnbm9zdGljIG1lY2hhbmlzbS4KKyAgRnVsbFNvdXJjZUxvYyBMb2M7CisgIERpYWdzLlJlcG9ydChMb2MsIERpYWdJRCkuQWRkU3RyaW5nKE1zZ1N0b3JhZ2UpOworfQorI3VuZGVmIENvbXB1dGVEaWFnSUQKIAogQ29kZUdlbkFjdGlvbjo6Q29kZUdlbkFjdGlvbih1bnNpZ25lZCBfQWN0LCBMTFZNQ29udGV4dCAqX1ZNQ29udGV4dCkKICAgOiBBY3QoX0FjdCksIExpbmtNb2R1bGUoMCksCkBAIC0zMTAsOSArNDM1LDcgQEAKICAgVGhlTW9kdWxlLnJlc2V0KEJFQ29uc3VtZXItPnRha2VNb2R1bGUoKSk7CiB9CiAKLWxsdm06Ok1vZHVsZSAqQ29kZUdlbkFjdGlvbjo6dGFrZU1vZHVsZSgpIHsKLSAgcmV0dXJuIFRoZU1vZHVsZS50YWtlKCk7Ci19CitsbHZtOjpNb2R1bGUgKkNvZGVHZW5BY3Rpb246OnRha2VNb2R1bGUoKSB7IHJldHVybiBUaGVNb2R1bGUucmVsZWFzZSgpOyB9CiAKIGxsdm06OkxMVk1Db250ZXh0ICpDb2RlR2VuQWN0aW9uOjp0YWtlTExWTUNvbnRleHQoKSB7CiAgIE93bnNWTUNvbnRleHQgPSBmYWxzZTsKQEAgLTM0Miw3ICs0NjUsNyBAQAogQVNUQ29uc3VtZXIgKkNvZGVHZW5BY3Rpb246OkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIHsKICAgQmFja2VuZEFjdGlvbiBCQSA9IHN0YXRpY19jYXN0PEJhY2tlbmRBY3Rpb24+KEFjdCk7Ci0gIE93bmluZ1B0cjxyYXdfb3N0cmVhbT4gT1MoR2V0T3V0cHV0U3RyZWFtKENJLCBJbkZpbGUsIEJBKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxyYXdfb3N0cmVhbT4gT1MoR2V0T3V0cHV0U3RyZWFtKENJLCBJbkZpbGUsIEJBKSk7CiAgIGlmIChCQSAhPSBCYWNrZW5kX0VtaXROb3RoaW5nICYmICFPUykKICAgICByZXR1cm4gMDsKIApAQCAtMzYyLDIwICs0ODUsMjAgQEAKICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIExpbmtNb2R1bGVUb1VzZSA9IGdldExhenlCaXRjb2RlTW9kdWxlKEJDQnVmLCAqVk1Db250ZXh0LCAmRXJyb3JTdHIpOwotICAgIGlmICghTGlua01vZHVsZVRvVXNlKSB7CisgICAgRXJyb3JPcjxsbHZtOjpNb2R1bGUgKj4gTW9kdWxlT3JFcnIgPQorICAgICAgICBnZXRMYXp5Qml0Y29kZU1vZHVsZShCQ0J1ZiwgKlZNQ29udGV4dCk7CisgICAgaWYgKGVycm9yX2NvZGUgRUMgPSBNb2R1bGVPckVyci5nZXRFcnJvcigpKSB7CiAgICAgICBDSS5nZXREaWFnbm9zdGljcygpLlJlcG9ydChkaWFnOjplcnJfY2Fubm90X29wZW5fZmlsZSkKLSAgICAgICAgPDwgTGlua0JDRmlsZSA8PCBFcnJvclN0cjsKKyAgICAgICAgPDwgTGlua0JDRmlsZSA8PCBFQy5tZXNzYWdlKCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgTGlua01vZHVsZVRvVXNlID0gTW9kdWxlT3JFcnIuZ2V0KCk7CiAgIH0KIAotICBCRUNvbnN1bWVyID0gCi0gICAgICBuZXcgQmFja2VuZENvbnN1bWVyKEJBLCBDSS5nZXREaWFnbm9zdGljcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDSS5nZXRDb2RlR2VuT3B0cygpLCBDSS5nZXRUYXJnZXRPcHRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENJLmdldExhbmdPcHRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENJLmdldEZyb250ZW5kT3B0cygpLlNob3dUaW1lcnMsIEluRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua01vZHVsZVRvVXNlLCBPUy50YWtlKCksICpWTUNvbnRleHQpOworICBCRUNvbnN1bWVyID0gbmV3IEJhY2tlbmRDb25zdW1lcihCQSwgQ0kuZ2V0RGlhZ25vc3RpY3MoKSwgQ0kuZ2V0Q29kZUdlbk9wdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0kuZ2V0VGFyZ2V0T3B0cygpLCBDSS5nZXRMYW5nT3B0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSS5nZXRGcm9udGVuZE9wdHMoKS5TaG93VGltZXJzLCBJbkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmtNb2R1bGVUb1VzZSwgT1MucmVsZWFzZSgpLCAqVk1Db250ZXh0KTsKICAgcmV0dXJuIEJFQ29uc3VtZXI7CiB9CiAKQEAgLTQwOCwzMSArNTMxLDMwIEBACiAgICAgICAgIFNNLmdldEZpbGVFbnRyeUZvcklEKFNNLmdldE1haW5GaWxlSUQoKSksIEVyci5nZXRMaW5lTm8oKSwKICAgICAgICAgRXJyLmdldENvbHVtbk5vKCkgKyAxKTsKIAotICAgICAgLy8gR2V0IGEgY3VzdG9tIGRpYWdub3N0aWMgZm9yIHRoZSBlcnJvci4gV2Ugc3RyaXAgb2ZmIGEgbGVhZGluZwotICAgICAgLy8gZGlhZ25vc3RpYyBjb2RlIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgIC8vIFN0cmlwIG9mZiBhIGxlYWRpbmcgZGlhZ25vc3RpYyBjb2RlIGlmIHRoZXJlIGlzIG9uZS4KICAgICAgIFN0cmluZ1JlZiBNc2cgPSBFcnIuZ2V0TWVzc2FnZSgpOwogICAgICAgaWYgKE1zZy5zdGFydHN3aXRoKCJlcnJvcjogIikpCiAgICAgICAgIE1zZyA9IE1zZy5zdWJzdHIoNyk7CiAKLSAgICAgIC8vIEVzY2FwZSAnJScsIHdoaWNoIGlzIGludGVycHJldGVkIGFzIGEgZm9ybWF0IGNoYXJhY3Rlci4KLSAgICAgIFNtYWxsU3RyaW5nPDEyOD4gRXNjYXBlZE1lc3NhZ2U7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTXNnLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKLSAgICAgICAgaWYgKE1zZ1tpXSA9PSAnJScpCi0gICAgICAgICAgRXNjYXBlZE1lc3NhZ2UgKz0gJyUnOwotICAgICAgICBFc2NhcGVkTWVzc2FnZSArPSBNc2dbaV07Ci0gICAgICB9CisgICAgICB1bnNpZ25lZCBEaWFnSUQgPQorICAgICAgICAgIENJLmdldERpYWdub3N0aWNzKCkuZ2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNzRW5naW5lOjpFcnJvciwgIiUwIik7CiAKLSAgICAgIHVuc2lnbmVkIERpYWdJRCA9IENJLmdldERpYWdub3N0aWNzKCkuZ2V0Q3VzdG9tRGlhZ0lEKAotICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpFcnJvciwgRXNjYXBlZE1lc3NhZ2UpOwotCi0gICAgICBDSS5nZXREaWFnbm9zdGljcygpLlJlcG9ydChMb2MsIERpYWdJRCk7CisgICAgICBDSS5nZXREaWFnbm9zdGljcygpLlJlcG9ydChMb2MsIERpYWdJRCkgPDwgTXNnOwogICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBjb25zdCBUYXJnZXRPcHRpb25zICZUYXJnZXRPcHRzID0gQ0kuZ2V0VGFyZ2V0T3B0cygpOworICAgIGlmIChUaGVNb2R1bGUtPmdldFRhcmdldFRyaXBsZSgpICE9IFRhcmdldE9wdHMuVHJpcGxlKSB7CisgICAgICB1bnNpZ25lZCBEaWFnSUQgPSBDSS5nZXREaWFnbm9zdGljcygpLmdldEN1c3RvbURpYWdJRCgKKyAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6V2FybmluZywKKyAgICAgICAgICAib3ZlcnJpZGluZyB0aGUgbW9kdWxlIHRhcmdldCB0cmlwbGUgd2l0aCAlMCIpOwogCi0gICAgRW1pdEJhY2tlbmRPdXRwdXQoQ0kuZ2V0RGlhZ25vc3RpY3MoKSwgQ0kuZ2V0Q29kZUdlbk9wdHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICBDSS5nZXRUYXJnZXRPcHRzKCksIENJLmdldExhbmdPcHRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgVGhlTW9kdWxlLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgIEJBLCBPUyk7CisgICAgICBDSS5nZXREaWFnbm9zdGljcygpLlJlcG9ydChTb3VyY2VMb2NhdGlvbigpLCBEaWFnSUQpIDw8IFRhcmdldE9wdHMuVHJpcGxlOworICAgICAgVGhlTW9kdWxlLT5zZXRUYXJnZXRUcmlwbGUoVGFyZ2V0T3B0cy5UcmlwbGUpOworICAgIH0KKworICAgIEVtaXRCYWNrZW5kT3V0cHV0KENJLmdldERpYWdub3N0aWNzKCksIENJLmdldENvZGVHZW5PcHRzKCksIFRhcmdldE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgQ0kuZ2V0TGFuZ09wdHMoKSwgQ0kuZ2V0VGFyZ2V0KCkuZ2V0VGFyZ2V0RGVzY3JpcHRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICBUaGVNb2R1bGUuZ2V0KCksIEJBLCBPUyk7CiAgICAgcmV0dXJuOwogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NvZGVHZW5GdW5jdGlvbi5jcHAgYi9saWIvQ29kZUdlbi9Db2RlR2VuRnVuY3Rpb24uY3BwCmluZGV4IGNlMWI0NDUuLjgwNjU0MGEgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NvZGVHZW5GdW5jdGlvbi5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ29kZUdlbkZ1bmN0aW9uLmNwcApAQCAtMTYsMTIgKzE2LDEyIEBACiAjaW5jbHVkZSAiQ0dDWFhBQkkuaCIKICNpbmNsdWRlICJDR0RlYnVnSW5mby5oIgogI2luY2x1ZGUgIkNvZGVHZW5Nb2R1bGUuaCIKKyNpbmNsdWRlICJDb2RlR2VuUEdPLmgiCiAjaW5jbHVkZSAiVGFyZ2V0SW5mby5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2wuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10Q1hYLmgiCi0jaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlbkNMLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIgogI2luY2x1ZGUgImNsYW5nL0NvZGVHZW4vQ0dGdW5jdGlvbkluZm8uaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db2RlR2VuT3B0aW9ucy5oIgpAQCAtNDQsNyArNDQsOCBAQAogICAgICAgTmV4dENsZWFudXBEZXN0SW5kZXgoMSksIEZpcnN0QmxvY2tJbmZvKDApLCBFSFJlc3VtZUJsb2NrKDApLAogICAgICAgRXhjZXB0aW9uU2xvdCgwKSwgRUhTZWxlY3RvclNsb3QoMCksIERlYnVnSW5mbyhDR00uZ2V0TW9kdWxlRGVidWdJbmZvKCkpLAogICAgICAgRGlzYWJsZURlYnVnSW5mbyhmYWxzZSksIERpZENhbGxTdGFja1NhdmUoZmFsc2UpLCBJbmRpcmVjdEJyYW5jaCgwKSwKLSAgICAgIFN3aXRjaEluc24oMCksIENhc2VSYW5nZUJsb2NrKDApLCBVbnJlYWNoYWJsZUJsb2NrKDApLCBOdW1SZXR1cm5FeHBycygwKSwKKyAgICAgIFBHTyhjZ20pLCBTd2l0Y2hJbnNuKDApLCBTd2l0Y2hXZWlnaHRzKDApLAorICAgICAgQ2FzZVJhbmdlQmxvY2soMCksIFVucmVhY2hhYmxlQmxvY2soMCksIE51bVJldHVybkV4cHJzKDApLAogICAgICAgTnVtU2ltcGxlUmV0dXJuRXhwcnMoMCksIENYWEFCSVRoaXNEZWNsKDApLCBDWFhBQklUaGlzVmFsdWUoMCksCiAgICAgICBDWFhUaGlzVmFsdWUoMCksIENYWERlZmF1bHRJbml0RXhwclRoaXMoMCksCiAgICAgICBDWFhTdHJ1Y3RvckltcGxpY2l0UGFyYW1EZWNsKDApLCBDWFhTdHJ1Y3RvckltcGxpY2l0UGFyYW1WYWx1ZSgwKSwKQEAgLTE1Nyw3ICsxNTgsNyBAQAogICAvLyBjbGVhbnMgdXAgZnVuY3Rpb25zIHdoaWNoIHN0YXJ0ZWQgd2l0aCBhIHVuaWZpZWQgcmV0dXJuIGJsb2NrLgogICBpZiAoUmV0dXJuQmxvY2suZ2V0QmxvY2soKS0+aGFzT25lVXNlKCkpIHsKICAgICBsbHZtOjpCcmFuY2hJbnN0ICpCSSA9Ci0gICAgICBkeW5fY2FzdDxsbHZtOjpCcmFuY2hJbnN0PigqUmV0dXJuQmxvY2suZ2V0QmxvY2soKS0+dXNlX2JlZ2luKCkpOworICAgICAgZHluX2Nhc3Q8bGx2bTo6QnJhbmNoSW5zdD4oKlJldHVybkJsb2NrLmdldEJsb2NrKCktPnVzZXJfYmVnaW4oKSk7CiAgICAgaWYgKEJJICYmIEJJLT5pc1VuY29uZGl0aW9uYWwoKSAmJgogICAgICAgICBCSS0+Z2V0U3VjY2Vzc29yKDApID09IFJldHVybkJsb2NrLmdldEJsb2NrKCkpIHsKICAgICAgIC8vIFJlc2V0IGluc2VydGlvbiBwb2ludCwgaW5jbHVkaW5nIGRlYnVnIGxvY2F0aW9uLCBhbmQgZGVsZXRlIHRoZQpAQCAtMjc1LDYgKzI3NiwxNCBAQAogCiAgIGlmIChDR00uZ2V0Q29kZUdlbk9wdHMoKS5FbWl0RGVjbE1ldGFkYXRhKQogICAgIEVtaXREZWNsTWV0YWRhdGEoKTsKKworICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8bGx2bTo6SW5zdHJ1Y3Rpb24gKiwgbGx2bTo6VmFsdWUgKj4gPjo6aXRlcmF0b3IKKyAgICAgICAgICAgSSA9IERlZmVycmVkUmVwbGFjZW1lbnRzLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBEZWZlcnJlZFJlcGxhY2VtZW50cy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIEktPmZpcnN0LT5yZXBsYWNlQWxsVXNlc1dpdGgoSS0+c2Vjb25kKTsKKyAgICBJLT5maXJzdC0+ZXJhc2VGcm9tUGFyZW50KCk7CisgIH0KIH0KIAogLy8vIFNob3VsZEluc3RydW1lbnRGdW5jdGlvbiAtIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHNob3VsZCBiZQpAQCAtMzgxLDcgKzM5MCwxMiBAQAogICAgICAgaWYgKHBvaW50ZWVUeS5pc1ZvbGF0aWxlUXVhbGlmaWVkKCkpCiAgICAgICAgIHR5cGVRdWFscyArPSB0eXBlUXVhbHMuZW1wdHkoKSA/ICJ2b2xhdGlsZSIgOiAiIHZvbGF0aWxlIjsKICAgICB9IGVsc2UgewotICAgICAgYWRkcmVzc1F1YWxzLnB1c2hfYmFjayhCdWlsZGVyLmdldEludDMyKDApKTsKKyAgICAgIHVpbnQzMl90IEFkZHJTcGMgPSAwOworICAgICAgaWYgKHR5LT5pc0ltYWdlVHlwZSgpKQorICAgICAgICBBZGRyU3BjID0KKyAgICAgICAgICBDR00uZ2V0Q29udGV4dCgpLmdldFRhcmdldEFkZHJlc3NTcGFjZShMYW5nQVM6Om9wZW5jbF9nbG9iYWwpOworCisgICAgICBhZGRyZXNzUXVhbHMucHVzaF9iYWNrKEJ1aWxkZXIuZ2V0SW50MzIoQWRkclNwYykpOwogCiAgICAgICAvLyBHZXQgYXJndW1lbnQgdHlwZSBuYW1lLgogICAgICAgc3RkOjpzdHJpbmcgdHlwZU5hbWUgPSB0eS5nZXRVbnF1YWxpZmllZFR5cGUoKS5nZXRBc1N0cmluZygpOwpAQCAtMzk5LDE2ICs0MTMsMTcgQEAKICAgICAgIGlmICh0eS5pc1ZvbGF0aWxlUXVhbGlmaWVkKCkpCiAgICAgICAgIHR5cGVRdWFscyArPSB0eXBlUXVhbHMuZW1wdHkoKSA/ICJ2b2xhdGlsZSIgOiAiIHZvbGF0aWxlIjsKICAgICB9Ci0gICAgCisKICAgICBhcmdUeXBlUXVhbHMucHVzaF9iYWNrKGxsdm06Ok1EU3RyaW5nOjpnZXQoQ29udGV4dCwgdHlwZVF1YWxzKSk7CiAKICAgICAvLyBHZXQgaW1hZ2UgYWNjZXNzIHF1YWxpZmllcjoKICAgICBpZiAodHktPmlzSW1hZ2VUeXBlKCkpIHsKLSAgICAgIGlmIChwYXJtLT5oYXNBdHRyPE9wZW5DTEltYWdlQWNjZXNzQXR0cj4oKSAmJgotICAgICAgICAgIHBhcm0tPmdldEF0dHI8T3BlbkNMSW1hZ2VBY2Nlc3NBdHRyPigpLT5nZXRBY2Nlc3MoKSA9PSBDTElBX3dyaXRlX29ubHkpCisgICAgICBjb25zdCBPcGVuQ0xJbWFnZUFjY2Vzc0F0dHIgKkEgPSBwYXJtLT5nZXRBdHRyPE9wZW5DTEltYWdlQWNjZXNzQXR0cj4oKTsKKyAgICAgIGlmIChBICYmIEEtPmlzV3JpdGVPbmx5KCkpCiAgICAgICAgIGFjY2Vzc1F1YWxzLnB1c2hfYmFjayhsbHZtOjpNRFN0cmluZzo6Z2V0KENvbnRleHQsICJ3cml0ZV9vbmx5IikpOwogICAgICAgZWxzZQogICAgICAgICBhY2Nlc3NRdWFscy5wdXNoX2JhY2sobGx2bTo6TURTdHJpbmc6OmdldChDb250ZXh0LCAicmVhZF9vbmx5IikpOworICAgICAgLy8gRklYTUU6IHdoYXQgYWJvdXQgcmVhZF93cml0ZT8KICAgICB9IGVsc2UKICAgICAgIGFjY2Vzc1F1YWxzLnB1c2hfYmFjayhsbHZtOjpNRFN0cmluZzo6Z2V0KENvbnRleHQsICJub25lIikpOwogCkBAIC00MzgsMTYgKzQ1MywxNSBAQAogICAgIEdlbk9wZW5DTEFyZ01ldGFkYXRhKEZELCBGbiwgQ0dNLCBDb250ZXh0LCBrZXJuZWxNREFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlciwgZ2V0Q29udGV4dCgpKTsKIAotICBpZiAoRkQtPmhhc0F0dHI8VmVjVHlwZUhpbnRBdHRyPigpKSB7Ci0gICAgVmVjVHlwZUhpbnRBdHRyICphdHRyID0gRkQtPmdldEF0dHI8VmVjVHlwZUhpbnRBdHRyPigpOwotICAgIFF1YWxUeXBlIGhpbnRRVHkgPSBhdHRyLT5nZXRUeXBlSGludCgpOworICBpZiAoY29uc3QgVmVjVHlwZUhpbnRBdHRyICpBID0gRkQtPmdldEF0dHI8VmVjVHlwZUhpbnRBdHRyPigpKSB7CisgICAgUXVhbFR5cGUgaGludFFUeSA9IEEtPmdldFR5cGVIaW50KCk7CiAgICAgY29uc3QgRXh0VmVjdG9yVHlwZSAqaGludEVsdFFUeSA9IGhpbnRRVHktPmdldEFzPEV4dFZlY3RvclR5cGU+KCk7CiAgICAgYm9vbCBpc1NpZ25lZEludGVnZXIgPQogICAgICAgICBoaW50UVR5LT5pc1NpZ25lZEludGVnZXJUeXBlKCkgfHwKICAgICAgICAgKGhpbnRFbHRRVHkgJiYgaGludEVsdFFUeS0+Z2V0RWxlbWVudFR5cGUoKS0+aXNTaWduZWRJbnRlZ2VyVHlwZSgpKTsKICAgICBsbHZtOjpWYWx1ZSAqYXR0ck1EQXJnc1tdID0gewogICAgICAgbGx2bTo6TURTdHJpbmc6OmdldChDb250ZXh0LCAidmVjX3R5cGVfaGludCIpLAotICAgICAgbGx2bTo6VW5kZWZWYWx1ZTo6Z2V0KENHTS5nZXRUeXBlcygpLkNvbnZlcnRUeXBlKGF0dHItPmdldFR5cGVIaW50KCkpKSwKKyAgICAgIGxsdm06OlVuZGVmVmFsdWU6OmdldChDR00uZ2V0VHlwZXMoKS5Db252ZXJ0VHlwZShBLT5nZXRUeXBlSGludCgpKSksCiAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KAogICAgICAgICAgIGxsdm06OkludGVnZXJUeXBlOjpnZXQoQ29udGV4dCwgMzIpLAogICAgICAgICAgIGxsdm06OkFQSW50KDMyLCAodWludDY0X3QpKGlzU2lnbmVkSW50ZWdlciA/IDEgOiAwKSkpCkBAIC00NTUsMjQgKzQ2OSwyMiBAQAogICAgIGtlcm5lbE1EQXJncy5wdXNoX2JhY2sobGx2bTo6TUROb2RlOjpnZXQoQ29udGV4dCwgYXR0ck1EQXJncykpOwogICB9CiAKLSAgaWYgKEZELT5oYXNBdHRyPFdvcmtHcm91cFNpemVIaW50QXR0cj4oKSkgewotICAgIFdvcmtHcm91cFNpemVIaW50QXR0ciAqYXR0ciA9IEZELT5nZXRBdHRyPFdvcmtHcm91cFNpemVIaW50QXR0cj4oKTsKKyAgaWYgKGNvbnN0IFdvcmtHcm91cFNpemVIaW50QXR0ciAqQSA9IEZELT5nZXRBdHRyPFdvcmtHcm91cFNpemVIaW50QXR0cj4oKSkgewogICAgIGxsdm06OlZhbHVlICphdHRyTURBcmdzW10gPSB7CiAgICAgICBsbHZtOjpNRFN0cmluZzo6Z2V0KENvbnRleHQsICJ3b3JrX2dyb3VwX3NpemVfaGludCIpLAotICAgICAgQnVpbGRlci5nZXRJbnQzMihhdHRyLT5nZXRYRGltKCkpLAotICAgICAgQnVpbGRlci5nZXRJbnQzMihhdHRyLT5nZXRZRGltKCkpLAotICAgICAgQnVpbGRlci5nZXRJbnQzMihhdHRyLT5nZXRaRGltKCkpCisgICAgICBCdWlsZGVyLmdldEludDMyKEEtPmdldFhEaW0oKSksCisgICAgICBCdWlsZGVyLmdldEludDMyKEEtPmdldFlEaW0oKSksCisgICAgICBCdWlsZGVyLmdldEludDMyKEEtPmdldFpEaW0oKSkKICAgICB9OwogICAgIGtlcm5lbE1EQXJncy5wdXNoX2JhY2sobGx2bTo6TUROb2RlOjpnZXQoQ29udGV4dCwgYXR0ck1EQXJncykpOwogICB9CiAKLSAgaWYgKEZELT5oYXNBdHRyPFJlcWRXb3JrR3JvdXBTaXplQXR0cj4oKSkgewotICAgIFJlcWRXb3JrR3JvdXBTaXplQXR0ciAqYXR0ciA9IEZELT5nZXRBdHRyPFJlcWRXb3JrR3JvdXBTaXplQXR0cj4oKTsKKyAgaWYgKGNvbnN0IFJlcWRXb3JrR3JvdXBTaXplQXR0ciAqQSA9IEZELT5nZXRBdHRyPFJlcWRXb3JrR3JvdXBTaXplQXR0cj4oKSkgewogICAgIGxsdm06OlZhbHVlICphdHRyTURBcmdzW10gPSB7CiAgICAgICBsbHZtOjpNRFN0cmluZzo6Z2V0KENvbnRleHQsICJyZXFkX3dvcmtfZ3JvdXBfc2l6ZSIpLAotICAgICAgQnVpbGRlci5nZXRJbnQzMihhdHRyLT5nZXRYRGltKCkpLAotICAgICAgQnVpbGRlci5nZXRJbnQzMihhdHRyLT5nZXRZRGltKCkpLAotICAgICAgQnVpbGRlci5nZXRJbnQzMihhdHRyLT5nZXRaRGltKCkpCisgICAgICBCdWlsZGVyLmdldEludDMyKEEtPmdldFhEaW0oKSksCisgICAgICBCdWlsZGVyLmdldEludDMyKEEtPmdldFlEaW0oKSksCisgICAgICBCdWlsZGVyLmdldEludDMyKEEtPmdldFpEaW0oKSkKICAgICB9OwogICAgIGtlcm5lbE1EQXJncy5wdXNoX2JhY2sobGx2bTo6TUROb2RlOjpnZXQoQ29udGV4dCwgYXR0ck1EQXJncykpOwogICB9CkBAIC01MDUsMTUgKzUxNywxOCBAQAogICB9CiAKICAgLy8gUGFzcyBpbmxpbmUga2V5d29yZCB0byBvcHRpbWl6ZXIgaWYgaXQgYXBwZWFycyBleHBsaWNpdGx5IG9uIGFueQotICAvLyBkZWNsYXJhdGlvbi4KLSAgaWYgKCFDR00uZ2V0Q29kZUdlbk9wdHMoKS5Ob0lubGluZSkKLSAgICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb25EZWNsPihEKSkKLSAgICAgIGZvciAoRnVuY3Rpb25EZWNsOjpyZWRlY2xfaXRlcmF0b3IgUkkgPSBGRC0+cmVkZWNsc19iZWdpbigpLAotICAgICAgICAgICAgIFJFID0gRkQtPnJlZGVjbHNfZW5kKCk7IFJJICE9IFJFOyArK1JJKQorICAvLyBkZWNsYXJhdGlvbi4gQWxzbywgaW4gdGhlIGNhc2Ugb2YgLWZuby1pbmxpbmUgYXR0YWNoIE5vSW5saW5lCisgIC8vIGF0dHJpYnV0ZSB0byBhbGwgZnVuY3Rpb24gdGhhdCBhcmUgbm90IG1hcmtlZCBBbHdheXNJbmxpbmUuCisgIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Rfb3JfbnVsbDxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgaWYgKCFDR00uZ2V0Q29kZUdlbk9wdHMoKS5Ob0lubGluZSkgeworICAgICAgZm9yIChhdXRvIFJJIDogRkQtPnJlZGVjbHMoKSkKICAgICAgICAgaWYgKFJJLT5pc0lubGluZVNwZWNpZmllZCgpKSB7CiAgICAgICAgICAgRm4tPmFkZEZuQXR0cihsbHZtOjpBdHRyaWJ1dGU6OklubGluZUhpbnQpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmICghRkQtPmhhc0F0dHI8QWx3YXlzSW5saW5lQXR0cj4oKSkKKyAgICAgIEZuLT5hZGRGbkF0dHIobGx2bTo6QXR0cmlidXRlOjpOb0lubGluZSk7CisgIH0KIAogICBpZiAoZ2V0TGFuZ09wdHMoKS5PcGVuQ0wpIHsKICAgICAvLyBBZGQgbWV0YWRhdGEgZm9yIGEga2VybmVsIGZ1bmN0aW9uLgpAQCAtNTgxLDYgKzU5NiwxNCBAQAogICAgIC8vIEluZGlyZWN0IGFnZ3JlZ2F0ZSByZXR1cm47IGVtaXQgcmV0dXJuZWQgdmFsdWUgZGlyZWN0bHkgaW50byBzcmV0IHNsb3QuCiAgICAgLy8gVGhpcyByZWR1Y2VzIGNvZGUgc2l6ZSwgYW5kIGFmZmVjdHMgY29ycmVjdG5lc3MgaW4gQysrLgogICAgIFJldHVyblZhbHVlID0gQ3VyRm4tPmFyZ19iZWdpbigpOworICB9IGVsc2UgaWYgKEN1ckZuSW5mby0+Z2V0UmV0dXJuSW5mbygpLmdldEtpbmQoKSA9PSBBQklBcmdJbmZvOjpJbkFsbG9jYSAmJgorICAgICAgICAgICAgICFoYXNTY2FsYXJFdmFsdWF0aW9uS2luZChDdXJGbkluZm8tPmdldFJldHVyblR5cGUoKSkpIHsKKyAgICAvLyBMb2FkIHRoZSBzcmV0IHBvaW50ZXIgZnJvbSB0aGUgYXJndW1lbnQgc3RydWN0IGFuZCByZXR1cm4gaW50byB0aGF0LgorICAgIHVuc2lnbmVkIElkeCA9IEN1ckZuSW5mby0+Z2V0UmV0dXJuSW5mbygpLmdldEluQWxsb2NhRmllbGRJbmRleCgpOworICAgIGxsdm06OkZ1bmN0aW9uOjphcmdfaXRlcmF0b3IgRUkgPSBDdXJGbi0+YXJnX2VuZCgpOworICAgIC0tRUk7CisgICAgbGx2bTo6VmFsdWUgKkFkZHIgPSBCdWlsZGVyLkNyZWF0ZVN0cnVjdEdFUChFSSwgSWR4KTsKKyAgICBSZXR1cm5WYWx1ZSA9IEJ1aWxkZXIuQ3JlYXRlTG9hZChBZGRyLCAiYWdnLnJlc3VsdCIpOwogICB9IGVsc2UgewogICAgIFJldHVyblZhbHVlID0gQ3JlYXRlSVJUZW1wKFJldFR5LCAicmV0dmFsIik7CiAKQEAgLTY0NSwxMiArNjY4LDM0IEBACiAKIHZvaWQgQ29kZUdlbkZ1bmN0aW9uOjpFbWl0RnVuY3Rpb25Cb2R5KEZ1bmN0aW9uQXJnTGlzdCAmQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0bXQgKkJvZHkpIHsKKyAgUmVnaW9uQ291bnRlciBDbnQgPSBnZXRQR09SZWdpb25Db3VudGVyKEJvZHkpOworICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CiAgIGlmIChjb25zdCBDb21wb3VuZFN0bXQgKlMgPSBkeW5fY2FzdDxDb21wb3VuZFN0bXQ+KEJvZHkpKQogICAgIEVtaXRDb21wb3VuZFN0bXRXaXRob3V0U2NvcGUoKlMpOwogICBlbHNlCiAgICAgRW1pdFN0bXQoQm9keSk7CiB9CiAKKy8vLyBXaGVuIGluc3RydW1lbnRpbmcgdG8gY29sbGVjdCBwcm9maWxlIGRhdGEsIHRoZSBjb3VudHMgZm9yIHNvbWUgYmxvY2tzCisvLy8gc3VjaCBhcyBzd2l0Y2ggY2FzZXMgbmVlZCB0byBub3QgaW5jbHVkZSB0aGUgZmFsbC10aHJvdWdoIGNvdW50cywgc28KKy8vLyBlbWl0IGEgYnJhbmNoIGFyb3VuZCB0aGUgaW5zdHJ1bWVudGF0aW9uIGNvZGUuIFdoZW4gbm90IGluc3RydW1lbnRpbmcsCisvLy8gdGhpcyBqdXN0IGNhbGxzIEVtaXRCbG9jaygpLgordm9pZCBDb2RlR2VuRnVuY3Rpb246OkVtaXRCbG9ja1dpdGhGYWxsVGhyb3VnaChsbHZtOjpCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uQ291bnRlciAmQ250KSB7CisgIGxsdm06OkJhc2ljQmxvY2sgKlNraXBDb3VudEJCID0gMDsKKyAgaWYgKEhhdmVJbnNlcnRQb2ludCgpICYmIENHTS5nZXRDb2RlR2VuT3B0cygpLlByb2ZpbGVJbnN0ckdlbmVyYXRlKSB7CisgICAgLy8gV2hlbiBpbnN0cnVtZW50aW5nIGZvciBwcm9maWxpbmcsIHRoZSBmYWxsdGhyb3VnaCB0byBjZXJ0YWluCisgICAgLy8gc3RhdGVtZW50cyBuZWVkcyB0byBza2lwIG92ZXIgdGhlIGluc3RydW1lbnRhdGlvbiBjb2RlIHNvIHRoYXQgd2UKKyAgICAvLyBnZXQgYW4gYWNjdXJhdGUgY291bnQuCisgICAgU2tpcENvdW50QkIgPSBjcmVhdGVCYXNpY0Jsb2NrKCJza2lwY291bnQiKTsKKyAgICBFbWl0QnJhbmNoKFNraXBDb3VudEJCKTsKKyAgfQorICBFbWl0QmxvY2soQkIpOworICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlciwgLypBZGRJbmNvbWluZ0ZhbGxUaHJvdWdoPSovdHJ1ZSk7CisgIGlmIChTa2lwQ291bnRCQikKKyAgICBFbWl0QmxvY2soU2tpcENvdW50QkIpOworfQorCiAvLy8gVHJpZXMgdG8gbWFyayB0aGUgZ2l2ZW4gZnVuY3Rpb24gbm91bndpbmQgYmFzZWQgb24gdGhlCiAvLy8gbm9uLWV4aXN0ZW5jZSBvZiBhbnkgdGhyb3dpbmcgY2FsbHMgd2l0aGluIGl0LiAgV2UgYmVsaWV2ZSB0aGlzIGlzCiAvLy8gbGlnaHR3ZWlnaHQgZW5vdWdoIHRvIGRvIGF0IC1PMC4KQEAgLTY5MSwxOSArNzM2LDIyIEBACiAgICAgRGVidWdJbmZvID0gTlVMTDsgLy8gZGlzYWJsZSBkZWJ1ZyBpbmZvIGluZGVmaW5pdGVseSBmb3IgdGhpcyBmdW5jdGlvbgogCiAgIEZ1bmN0aW9uQXJnTGlzdCBBcmdzOwotICBRdWFsVHlwZSBSZXNUeSA9IEZELT5nZXRSZXN1bHRUeXBlKCk7CisgIFF1YWxUeXBlIFJlc1R5ID0gRkQtPmdldFJldHVyblR5cGUoKTsKIAogICBDdXJHRCA9IEdEOwotICBjb25zdCBDWFhNZXRob2REZWNsICpNRDsKLSAgaWYgKChNRCA9IGR5bl9jYXN0PENYWE1ldGhvZERlY2w+KEZEKSkgJiYgTUQtPmlzSW5zdGFuY2UoKSkgeworICBjb25zdCBDWFhNZXRob2REZWNsICpNRCA9IGR5bl9jYXN0PENYWE1ldGhvZERlY2w+KEZEKTsKKyAgaWYgKE1EICYmIE1ELT5pc0luc3RhbmNlKCkpIHsKICAgICBpZiAoQ0dNLmdldENYWEFCSSgpLkhhc1RoaXNSZXR1cm4oR0QpKQogICAgICAgUmVzVHkgPSBNRC0+Z2V0VGhpc1R5cGUoZ2V0Q29udGV4dCgpKTsKLSAgICBDR00uZ2V0Q1hYQUJJKCkuQnVpbGRJbnN0YW5jZUZ1bmN0aW9uUGFyYW1zKCp0aGlzLCBSZXNUeSwgQXJncyk7CisgICAgQ0dNLmdldENYWEFCSSgpLmJ1aWxkVGhpc1BhcmFtKCp0aGlzLCBBcmdzKTsKICAgfQogCiAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGRC0+Z2V0TnVtUGFyYW1zKCk7IGkgIT0gZTsgKytpKQogICAgIEFyZ3MucHVzaF9iYWNrKEZELT5nZXRQYXJhbURlY2woaSkpOwogCisgIGlmIChNRCAmJiAoaXNhPENYWENvbnN0cnVjdG9yRGVjbD4oTUQpIHx8IGlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oTUQpKSkKKyAgICBDR00uZ2V0Q1hYQUJJKCkuYWRkSW1wbGljaXRTdHJ1Y3RvclBhcmFtcygqdGhpcywgUmVzVHksIEFyZ3MpOworCiAgIFNvdXJjZVJhbmdlIEJvZHlSYW5nZTsKICAgaWYgKFN0bXQgKkJvZHkgPSBGRC0+Z2V0Qm9keSgpKSBCb2R5UmFuZ2UgPSBCb2R5LT5nZXRTb3VyY2VSYW5nZSgpOwogICBDdXJFSExvY2F0aW9uID0gQm9keVJhbmdlLmdldEVuZCgpOwpAQCAtNzEyLDYgKzc2MCw3IEBACiAgIFN0YXJ0RnVuY3Rpb24oR0QsIFJlc1R5LCBGbiwgRm5JbmZvLCBBcmdzLCBCb2R5UmFuZ2UuZ2V0QmVnaW4oKSk7CiAKICAgLy8gR2VuZXJhdGUgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLgorICBQR08uYXNzaWduUmVnaW9uQ291bnRlcnMoR0QuZ2V0RGVjbCgpLCBDdXJGbik7CiAgIGlmIChpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KEZEKSkKICAgICBFbWl0RGVzdHJ1Y3RvckJvZHkoQXJncyk7CiAgIGVsc2UgaWYgKGlzYTxDWFhDb25zdHJ1Y3RvckRlY2w+KEZEKSkKQEAgLTc1Myw3ICs4MDIsNyBAQAogICAvLyAgIElmIHRoZSAnfScgdGhhdCB0ZXJtaW5hdGVzIGEgZnVuY3Rpb24gaXMgcmVhY2hlZCwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUKICAgLy8gICBmdW5jdGlvbiBjYWxsIGlzIHVzZWQgYnkgdGhlIGNhbGxlciwgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmICFGRC0+aGFzSW1wbGljaXRSZXR1cm5aZXJvKCkgJiYKLSAgICAgICFGRC0+Z2V0UmVzdWx0VHlwZSgpLT5pc1ZvaWRUeXBlKCkgJiYgQnVpbGRlci5HZXRJbnNlcnRCbG9jaygpKSB7CisgICAgICAhRkQtPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHlwZSgpICYmIEJ1aWxkZXIuR2V0SW5zZXJ0QmxvY2soKSkgewogICAgIGlmIChTYW5PcHRzLT5SZXR1cm4pCiAgICAgICBFbWl0Q2hlY2soQnVpbGRlci5nZXRGYWxzZSgpLCAibWlzc2luZ19yZXR1cm4iLAogICAgICAgICAgICAgICAgIEVtaXRDaGVja1NvdXJjZUxvY2F0aW9uKEZELT5nZXRMb2NhdGlvbigpKSwKQEAgLTc3MSw2ICs4MjAsOSBAQAogICAvLyBhIHF1aWNrIHBhc3Mgbm93IHRvIHNlZSBpZiB3ZSBjYW4uCiAgIGlmICghQ3VyRm4tPmRvZXNOb3RUaHJvdygpKQogICAgIFRyeU1hcmtOb1Rocm93KEN1ckZuKTsKKworICBQR08uZW1pdEluc3RydW1lbnRhdGlvbkRhdGEoKTsKKyAgUEdPLmRlc3Ryb3lSZWdpb25Db3VudGVycygpOwogfQogCiAvLy8gQ29udGFpbnNMYWJlbCAtIFJldHVybiB0cnVlIGlmIHRoZSBzdGF0ZW1lbnQgY29udGFpbnMgYSBsYWJlbCBpbiBpdC4gIElmCkBAIC04NjksMTkgKzkyMSwyNSBAQAogLy8vCiB2b2lkIENvZGVHZW5GdW5jdGlvbjo6RW1pdEJyYW5jaE9uQm9vbEV4cHIoY29uc3QgRXhwciAqQ29uZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCYXNpY0Jsb2NrICpUcnVlQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QmFzaWNCbG9jayAqRmFsc2VCbG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkJhc2ljQmxvY2sgKkZhbHNlQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVHJ1ZUNvdW50KSB7CiAgIENvbmQgPSBDb25kLT5JZ25vcmVQYXJlbnMoKTsKIAogICBpZiAoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkNvbmRCT3AgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oQ29uZCkpIHsKKwogICAgIC8vIEhhbmRsZSBYICYmIFkgaW4gYSBjb25kaXRpb24uCiAgICAgaWYgKENvbmRCT3AtPmdldE9wY29kZSgpID09IEJPX0xBbmQpIHsKKyAgICAgIFJlZ2lvbkNvdW50ZXIgQ250ID0gZ2V0UEdPUmVnaW9uQ291bnRlcihDb25kQk9wKTsKKwogICAgICAgLy8gSWYgd2UgaGF2ZSAiMSAmJiBYIiwgc2ltcGxpZnkgdGhlIGNvZGUuICAiMCAmJiBYIiB3b3VsZCBoYXZlIGNvbnN0YW50CiAgICAgICAvLyBmb2xkZWQgaWYgdGhlIGNhc2Ugd2FzIHNpbXBsZSBlbm91Z2guCiAgICAgICBib29sIENvbnN0YW50Qm9vbCA9IGZhbHNlOwogICAgICAgaWYgKENvbnN0YW50Rm9sZHNUb1NpbXBsZUludGVnZXIoQ29uZEJPcC0+Z2V0TEhTKCksIENvbnN0YW50Qm9vbCkgJiYKICAgICAgICAgICBDb25zdGFudEJvb2wpIHsKICAgICAgICAgLy8gYnIoMSAmJiBYKSAtPiBicihYKS4KLSAgICAgICAgcmV0dXJuIEVtaXRCcmFuY2hPbkJvb2xFeHByKENvbmRCT3AtPmdldFJIUygpLCBUcnVlQmxvY2ssIEZhbHNlQmxvY2spOworICAgICAgICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CisgICAgICAgIHJldHVybiBFbWl0QnJhbmNoT25Cb29sRXhwcihDb25kQk9wLT5nZXRSSFMoKSwgVHJ1ZUJsb2NrLCBGYWxzZUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZUNvdW50KTsKICAgICAgIH0KIAogICAgICAgLy8gSWYgd2UgaGF2ZSAiWCAmJiAxIiwgc2ltcGxpZnkgdGhlIGNvZGUgdG8gdXNlIGFuIHVuY29uZCBicmFuY2guCkBAIC04ODksMzMgKzk0Nyw0MiBAQAogICAgICAgaWYgKENvbnN0YW50Rm9sZHNUb1NpbXBsZUludGVnZXIoQ29uZEJPcC0+Z2V0UkhTKCksIENvbnN0YW50Qm9vbCkgJiYKICAgICAgICAgICBDb25zdGFudEJvb2wpIHsKICAgICAgICAgLy8gYnIoWCAmJiAxKSAtPiBicihYKS4KLSAgICAgICAgcmV0dXJuIEVtaXRCcmFuY2hPbkJvb2xFeHByKENvbmRCT3AtPmdldExIUygpLCBUcnVlQmxvY2ssIEZhbHNlQmxvY2spOworICAgICAgICByZXR1cm4gRW1pdEJyYW5jaE9uQm9vbEV4cHIoQ29uZEJPcC0+Z2V0TEhTKCksIFRydWVCbG9jaywgRmFsc2VCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVDb3VudCk7CiAgICAgICB9CiAKICAgICAgIC8vIEVtaXQgdGhlIExIUyBhcyBhIGNvbmRpdGlvbmFsLiAgSWYgdGhlIExIUyBjb25kaXRpb25hbCBpcyBmYWxzZSwgd2UKICAgICAgIC8vIHdhbnQgdG8ganVtcCB0byB0aGUgRmFsc2VCbG9jay4KICAgICAgIGxsdm06OkJhc2ljQmxvY2sgKkxIU1RydWUgPSBjcmVhdGVCYXNpY0Jsb2NrKCJsYW5kLmxocy50cnVlIik7CisgICAgICAvLyBUaGUgY291bnRlciB0ZWxscyB1cyBob3cgb2Z0ZW4gd2UgZXZhbHVhdGUgUkhTLCBhbmQgYWxsIG9mIFRydWVDb3VudAorICAgICAgLy8gY2FuIGJlIHByb3BhZ2F0ZWQgdG8gdGhhdCBicmFuY2guCisgICAgICB1aW50NjRfdCBSSFNDb3VudCA9IENudC5nZXRDb3VudCgpOwogCiAgICAgICBDb25kaXRpb25hbEV2YWx1YXRpb24gZXZhbCgqdGhpcyk7Ci0gICAgICBFbWl0QnJhbmNoT25Cb29sRXhwcihDb25kQk9wLT5nZXRMSFMoKSwgTEhTVHJ1ZSwgRmFsc2VCbG9jayk7CisgICAgICBFbWl0QnJhbmNoT25Cb29sRXhwcihDb25kQk9wLT5nZXRMSFMoKSwgTEhTVHJ1ZSwgRmFsc2VCbG9jaywgUkhTQ291bnQpOwogICAgICAgRW1pdEJsb2NrKExIU1RydWUpOwogCiAgICAgICAvLyBBbnkgdGVtcG9yYXJpZXMgY3JlYXRlZCBoZXJlIGFyZSBjb25kaXRpb25hbC4KKyAgICAgIENudC5iZWdpblJlZ2lvbihCdWlsZGVyKTsKICAgICAgIGV2YWwuYmVnaW4oKnRoaXMpOwotICAgICAgRW1pdEJyYW5jaE9uQm9vbEV4cHIoQ29uZEJPcC0+Z2V0UkhTKCksIFRydWVCbG9jaywgRmFsc2VCbG9jayk7CisgICAgICBFbWl0QnJhbmNoT25Cb29sRXhwcihDb25kQk9wLT5nZXRSSFMoKSwgVHJ1ZUJsb2NrLCBGYWxzZUJsb2NrLCBUcnVlQ291bnQpOwogICAgICAgZXZhbC5lbmQoKnRoaXMpOwogCiAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgaWYgKENvbmRCT3AtPmdldE9wY29kZSgpID09IEJPX0xPcikgeworICAgICAgUmVnaW9uQ291bnRlciBDbnQgPSBnZXRQR09SZWdpb25Db3VudGVyKENvbmRCT3ApOworCiAgICAgICAvLyBJZiB3ZSBoYXZlICIwIHx8IFgiLCBzaW1wbGlmeSB0aGUgY29kZS4gICIxIHx8IFgiIHdvdWxkIGhhdmUgY29uc3RhbnQKICAgICAgIC8vIGZvbGRlZCBpZiB0aGUgY2FzZSB3YXMgc2ltcGxlIGVub3VnaC4KICAgICAgIGJvb2wgQ29uc3RhbnRCb29sID0gZmFsc2U7CiAgICAgICBpZiAoQ29uc3RhbnRGb2xkc1RvU2ltcGxlSW50ZWdlcihDb25kQk9wLT5nZXRMSFMoKSwgQ29uc3RhbnRCb29sKSAmJgogICAgICAgICAgICFDb25zdGFudEJvb2wpIHsKICAgICAgICAgLy8gYnIoMCB8fCBYKSAtPiBicihYKS4KLSAgICAgICAgcmV0dXJuIEVtaXRCcmFuY2hPbkJvb2xFeHByKENvbmRCT3AtPmdldFJIUygpLCBUcnVlQmxvY2ssIEZhbHNlQmxvY2spOworICAgICAgICBDbnQuYmVnaW5SZWdpb24oQnVpbGRlcik7CisgICAgICAgIHJldHVybiBFbWl0QnJhbmNoT25Cb29sRXhwcihDb25kQk9wLT5nZXRSSFMoKSwgVHJ1ZUJsb2NrLCBGYWxzZUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZUNvdW50KTsKICAgICAgIH0KIAogICAgICAgLy8gSWYgd2UgaGF2ZSAiWCB8fCAwIiwgc2ltcGxpZnkgdGhlIGNvZGUgdG8gdXNlIGFuIHVuY29uZCBicmFuY2guCkBAIC05MjMsMjAgKzk5MCwyOCBAQAogICAgICAgaWYgKENvbnN0YW50Rm9sZHNUb1NpbXBsZUludGVnZXIoQ29uZEJPcC0+Z2V0UkhTKCksIENvbnN0YW50Qm9vbCkgJiYKICAgICAgICAgICAhQ29uc3RhbnRCb29sKSB7CiAgICAgICAgIC8vIGJyKFggfHwgMCkgLT4gYnIoWCkuCi0gICAgICAgIHJldHVybiBFbWl0QnJhbmNoT25Cb29sRXhwcihDb25kQk9wLT5nZXRMSFMoKSwgVHJ1ZUJsb2NrLCBGYWxzZUJsb2NrKTsKKyAgICAgICAgcmV0dXJuIEVtaXRCcmFuY2hPbkJvb2xFeHByKENvbmRCT3AtPmdldExIUygpLCBUcnVlQmxvY2ssIEZhbHNlQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlQ291bnQpOwogICAgICAgfQogCiAgICAgICAvLyBFbWl0IHRoZSBMSFMgYXMgYSBjb25kaXRpb25hbC4gIElmIHRoZSBMSFMgY29uZGl0aW9uYWwgaXMgdHJ1ZSwgd2UKICAgICAgIC8vIHdhbnQgdG8ganVtcCB0byB0aGUgVHJ1ZUJsb2NrLgogICAgICAgbGx2bTo6QmFzaWNCbG9jayAqTEhTRmFsc2UgPSBjcmVhdGVCYXNpY0Jsb2NrKCJsb3IubGhzLmZhbHNlIik7CisgICAgICAvLyBXZSBoYXZlIHRoZSBjb3VudCBmb3IgZW50cnkgdG8gdGhlIFJIUyBhbmQgZm9yIHRoZSB3aG9sZSBleHByZXNzaW9uCisgICAgICAvLyBiZWluZyB0cnVlLCBzbyB3ZSBjYW4gZGl2eSB1cCBUcnVlIGNvdW50IGJldHdlZW4gdGhlIHNob3J0IGNpcmN1aXQgYW5kCisgICAgICAvLyB0aGUgUkhTLgorICAgICAgdWludDY0X3QgTEhTQ291bnQgPSBDbnQuZ2V0UGFyZW50Q291bnQoKSAtIENudC5nZXRDb3VudCgpOworICAgICAgdWludDY0X3QgUkhTQ291bnQgPSBUcnVlQ291bnQgLSBMSFNDb3VudDsKIAogICAgICAgQ29uZGl0aW9uYWxFdmFsdWF0aW9uIGV2YWwoKnRoaXMpOwotICAgICAgRW1pdEJyYW5jaE9uQm9vbEV4cHIoQ29uZEJPcC0+Z2V0TEhTKCksIFRydWVCbG9jaywgTEhTRmFsc2UpOworICAgICAgRW1pdEJyYW5jaE9uQm9vbEV4cHIoQ29uZEJPcC0+Z2V0TEhTKCksIFRydWVCbG9jaywgTEhTRmFsc2UsIExIU0NvdW50KTsKICAgICAgIEVtaXRCbG9jayhMSFNGYWxzZSk7CiAKICAgICAgIC8vIEFueSB0ZW1wb3JhcmllcyBjcmVhdGVkIGhlcmUgYXJlIGNvbmRpdGlvbmFsLgorICAgICAgQ250LmJlZ2luUmVnaW9uKEJ1aWxkZXIpOwogICAgICAgZXZhbC5iZWdpbigqdGhpcyk7Ci0gICAgICBFbWl0QnJhbmNoT25Cb29sRXhwcihDb25kQk9wLT5nZXRSSFMoKSwgVHJ1ZUJsb2NrLCBGYWxzZUJsb2NrKTsKKyAgICAgIEVtaXRCcmFuY2hPbkJvb2xFeHByKENvbmRCT3AtPmdldFJIUygpLCBUcnVlQmxvY2ssIEZhbHNlQmxvY2ssIFJIU0NvdW50KTsKKwogICAgICAgZXZhbC5lbmQoKnRoaXMpOwogCiAgICAgICByZXR1cm47CkBAIC05NDUsOCArMTAyMCwxMyBAQAogCiAgIGlmIChjb25zdCBVbmFyeU9wZXJhdG9yICpDb25kVU9wID0gZHluX2Nhc3Q8VW5hcnlPcGVyYXRvcj4oQ29uZCkpIHsKICAgICAvLyBicigheCwgdCwgZikgLT4gYnIoeCwgZiwgdCkKLSAgICBpZiAoQ29uZFVPcC0+Z2V0T3Bjb2RlKCkgPT0gVU9fTE5vdCkKLSAgICAgIHJldHVybiBFbWl0QnJhbmNoT25Cb29sRXhwcihDb25kVU9wLT5nZXRTdWJFeHByKCksIEZhbHNlQmxvY2ssIFRydWVCbG9jayk7CisgICAgaWYgKENvbmRVT3AtPmdldE9wY29kZSgpID09IFVPX0xOb3QpIHsKKyAgICAgIC8vIE5lZ2F0ZSB0aGUgY291bnQuCisgICAgICB1aW50NjRfdCBGYWxzZUNvdW50ID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpIC0gVHJ1ZUNvdW50OworICAgICAgLy8gTmVnYXRlIHRoZSBjb25kaXRpb24gYW5kIHN3YXAgdGhlIGRlc3RpbmF0aW9uIGJsb2Nrcy4KKyAgICAgIHJldHVybiBFbWl0QnJhbmNoT25Cb29sRXhwcihDb25kVU9wLT5nZXRTdWJFeHByKCksIEZhbHNlQmxvY2ssIFRydWVCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZUNvdW50KTsKKyAgICB9CiAgIH0KIAogICBpZiAoY29uc3QgQ29uZGl0aW9uYWxPcGVyYXRvciAqQ29uZE9wID0gZHluX2Nhc3Q8Q29uZGl0aW9uYWxPcGVyYXRvcj4oQ29uZCkpIHsKQEAgLTk1NCwxNyArMTAzNCwzMiBAQAogICAgIGxsdm06OkJhc2ljQmxvY2sgKkxIU0Jsb2NrID0gY3JlYXRlQmFzaWNCbG9jaygiY29uZC50cnVlIik7CiAgICAgbGx2bTo6QmFzaWNCbG9jayAqUkhTQmxvY2sgPSBjcmVhdGVCYXNpY0Jsb2NrKCJjb25kLmZhbHNlIik7CiAKKyAgICBSZWdpb25Db3VudGVyIENudCA9IGdldFBHT1JlZ2lvbkNvdW50ZXIoQ29uZE9wKTsKICAgICBDb25kaXRpb25hbEV2YWx1YXRpb24gY29uZCgqdGhpcyk7Ci0gICAgRW1pdEJyYW5jaE9uQm9vbEV4cHIoQ29uZE9wLT5nZXRDb25kKCksIExIU0Jsb2NrLCBSSFNCbG9jayk7CisgICAgRW1pdEJyYW5jaE9uQm9vbEV4cHIoQ29uZE9wLT5nZXRDb25kKCksIExIU0Jsb2NrLCBSSFNCbG9jaywgQ250LmdldENvdW50KCkpOworCisgICAgLy8gV2hlbiBjb21wdXRpbmcgUEdPIGJyYW5jaCB3ZWlnaHRzLCB3ZSBvbmx5IGtub3cgdGhlIG92ZXJhbGwgY291bnQgZm9yCisgICAgLy8gdGhlIHRydWUgYmxvY2suIFRoaXMgY29kZSBpcyBlc3NlbnRpYWxseSBkb2luZyB0YWlsIGR1cGxpY2F0aW9uIG9mIHRoZQorICAgIC8vIG5haXZlIGNvZGUtZ2VuLCBpbnRyb2R1Y2luZyBuZXcgZWRnZXMgZm9yIHdoaWNoIGNvdW50cyBhcmUgbm90CisgICAgLy8gYXZhaWxhYmxlLiBEaXZpZGUgdGhlIGNvdW50cyBwcm9wb3J0aW9uYWxseSBiZXR3ZWVuIHRoZSBMSFMgYW5kIFJIUyBvZgorICAgIC8vIHRoZSBjb25kaXRpb25hbCBvcGVyYXRvci4KKyAgICB1aW50NjRfdCBMSFNTY2FsZWRUcnVlQ291bnQgPSAwOworICAgIGlmIChUcnVlQ291bnQpIHsKKyAgICAgIGRvdWJsZSBMSFNSYXRpbyA9IENudC5nZXRDb3VudCgpIC8gKGRvdWJsZSkgQ250LmdldFBhcmVudENvdW50KCk7CisgICAgICBMSFNTY2FsZWRUcnVlQ291bnQgPSBUcnVlQ291bnQgKiBMSFNSYXRpbzsKKyAgICB9CiAKICAgICBjb25kLmJlZ2luKCp0aGlzKTsKICAgICBFbWl0QmxvY2soTEhTQmxvY2spOwotICAgIEVtaXRCcmFuY2hPbkJvb2xFeHByKENvbmRPcC0+Z2V0TEhTKCksIFRydWVCbG9jaywgRmFsc2VCbG9jayk7CisgICAgQ250LmJlZ2luUmVnaW9uKEJ1aWxkZXIpOworICAgIEVtaXRCcmFuY2hPbkJvb2xFeHByKENvbmRPcC0+Z2V0TEhTKCksIFRydWVCbG9jaywgRmFsc2VCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMSFNTY2FsZWRUcnVlQ291bnQpOwogICAgIGNvbmQuZW5kKCp0aGlzKTsKIAogICAgIGNvbmQuYmVnaW4oKnRoaXMpOwogICAgIEVtaXRCbG9jayhSSFNCbG9jayk7Ci0gICAgRW1pdEJyYW5jaE9uQm9vbEV4cHIoQ29uZE9wLT5nZXRSSFMoKSwgVHJ1ZUJsb2NrLCBGYWxzZUJsb2NrKTsKKyAgICBFbWl0QnJhbmNoT25Cb29sRXhwcihDb25kT3AtPmdldFJIUygpLCBUcnVlQmxvY2ssIEZhbHNlQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZUNvdW50IC0gTEhTU2NhbGVkVHJ1ZUNvdW50KTsKICAgICBjb25kLmVuZCgqdGhpcyk7CiAKICAgICByZXR1cm47CkBAIC05ODAsOSArMTA3NSwxNSBAQAogICAgIHJldHVybjsKICAgfQogCisgIC8vIENyZWF0ZSBicmFuY2ggd2VpZ2h0cyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHRpbWVzIHdlIGdldCBoZXJlIGFuZCB0aGUKKyAgLy8gbnVtYmVyIG9mIHRpbWVzIHRoZSBjb25kaXRpb24gc2hvdWxkIGJlIHRydWUuCisgIHVpbnQ2NF90IEN1cnJlbnRDb3VudCA9IHN0ZDo6bWF4KFBHTy5nZXRDdXJyZW50UmVnaW9uQ291bnQoKSwgVHJ1ZUNvdW50KTsKKyAgbGx2bTo6TUROb2RlICpXZWlnaHRzID0gUEdPLmNyZWF0ZUJyYW5jaFdlaWdodHMoVHJ1ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50Q291bnQgLSBUcnVlQ291bnQpOworCiAgIC8vIEVtaXQgdGhlIGNvZGUgd2l0aCB0aGUgZnVsbHkgZ2VuZXJhbCBjYXNlLgogICBsbHZtOjpWYWx1ZSAqQ29uZFYgPSBFdmFsdWF0ZUV4cHJBc0Jvb2woQ29uZCk7Ci0gIEJ1aWxkZXIuQ3JlYXRlQ29uZEJyKENvbmRWLCBUcnVlQmxvY2ssIEZhbHNlQmxvY2spOworICBCdWlsZGVyLkNyZWF0ZUNvbmRCcihDb25kViwgVHJ1ZUJsb2NrLCBGYWxzZUJsb2NrLCBXZWlnaHRzKTsKIH0KIAogLy8vIEVycm9yVW5zdXBwb3J0ZWQgLSBQcmludCBvdXQgYW4gZXJyb3IgdGhhdCBjb2RlZ2VuIGRvZXNuJ3Qgc3VwcG9ydCB0aGUKQEAgLTEwNzUsNyArMTE3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0QXNBcnJheVR5cGUoVHkpKSkgewogICAgICAgUXVhbFR5cGUgZWx0VHlwZTsKICAgICAgIGxsdm06OlZhbHVlICpudW1FbHRzOwotICAgICAgbGx2bTo6dGllKG51bUVsdHMsIGVsdFR5cGUpID0gZ2V0VkxBU2l6ZSh2bGFUeXBlKTsKKyAgICAgIHN0ZDo6dGllKG51bUVsdHMsIGVsdFR5cGUpID0gZ2V0VkxBU2l6ZSh2bGFUeXBlKTsKIAogICAgICAgU2l6ZVZhbCA9IG51bUVsdHM7CiAgICAgICBDaGFyVW5pdHMgZWx0U2l6ZSA9IGdldENvbnRleHQoKS5nZXRUeXBlU2l6ZUluQ2hhcnMoZWx0VHlwZSk7CkBAIC0xMjY0LDcgKzEzNjUsNyBAQAogICAgICAgbnVtRWxlbWVudHMgPSB2bGFTaXplOwogICAgIH0gZWxzZSB7CiAgICAgICAvLyBJdCdzIHVuZGVmaW5lZCBiZWhhdmlvciBpZiB0aGlzIHdyYXBzIGFyb3VuZCwgc28gbWFyayBpdCB0aGF0IHdheS4KLSAgICAgIC8vIEZJWE1FOiBUZWFjaCAtZmNhdGNoLXVuZGVmaW5lZC1iZWhhdmlvciB0byB0cmFwIHRoaXMuCisgICAgICAvLyBGSVhNRTogVGVhY2ggLWZzYW5pdGl6ZT11bmRlZmluZWQgdG8gdHJhcCB0aGlzLgogICAgICAgbnVtRWxlbWVudHMgPSBCdWlsZGVyLkNyZWF0ZU5VV011bChudW1FbGVtZW50cywgdmxhU2l6ZSk7CiAgICAgfQogICB9IHdoaWxlICgodHlwZSA9IGdldENvbnRleHQoKS5nZXRBc1ZhcmlhYmxlQXJyYXlUeXBlKGVsZW1lbnRUeXBlKSkpOwpAQCAtMTMwOCw2ICsxNDA5LDEwIEBACiAgICAgY2FzZSBUeXBlOjpPYmpDT2JqZWN0UG9pbnRlcjoKICAgICAgIGxsdm1fdW5yZWFjaGFibGUoInR5cGUgY2xhc3MgaXMgbmV2ZXIgdmFyaWFibHktbW9kaWZpZWQhIik7CiAKKyAgICBjYXNlIFR5cGU6OkFkanVzdGVkOgorICAgICAgdHlwZSA9IGNhc3Q8QWRqdXN0ZWRUeXBlPih0eSktPmdldEFkanVzdGVkVHlwZSgpOworICAgICAgYnJlYWs7CisKICAgICBjYXNlIFR5cGU6OkRlY2F5ZWQ6CiAgICAgICB0eXBlID0gY2FzdDxEZWNheWVkVHlwZT4odHkpLT5nZXRQb2ludGVlVHlwZSgpOwogICAgICAgYnJlYWs7CkBAIC0xMzc1LDcgKzE0ODAsNyBAQAogCiAgICAgY2FzZSBUeXBlOjpGdW5jdGlvblByb3RvOgogICAgIGNhc2UgVHlwZTo6RnVuY3Rpb25Ob1Byb3RvOgotICAgICAgdHlwZSA9IGNhc3Q8RnVuY3Rpb25UeXBlPih0eSktPmdldFJlc3VsdFR5cGUoKTsKKyAgICAgIHR5cGUgPSBjYXN0PEZ1bmN0aW9uVHlwZT4odHkpLT5nZXRSZXR1cm5UeXBlKCk7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgVHlwZTo6UGFyZW46CkBAIC0xNDY0LDEyICsxNTY5LDEwIEBACiAgIGFzc2VydChELT5oYXNBdHRyPEFubm90YXRlQXR0cj4oKSAmJiAibm8gYW5ub3RhdGUgYXR0cmlidXRlIik7CiAgIC8vIEZJWE1FIFdlIGNyZWF0ZSBhIG5ldyBiaXRjYXN0IGZvciBldmVyeSBhbm5vdGF0aW9uIGJlY2F1c2UgdGhhdCdzIHdoYXQKICAgLy8gbGx2bS1nY2Mgd2FzIGRvaW5nLgotICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8QW5ub3RhdGVBdHRyPgotICAgICAgIGFpID0gRC0+c3BlY2lmaWNfYXR0cl9iZWdpbjxBbm5vdGF0ZUF0dHI+KCksCi0gICAgICAgYWUgPSBELT5zcGVjaWZpY19hdHRyX2VuZDxBbm5vdGF0ZUF0dHI+KCk7IGFpICE9IGFlOyArK2FpKQorICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBELT5zcGVjaWZpY19hdHRyczxBbm5vdGF0ZUF0dHI+KCkpCiAgICAgRW1pdEFubm90YXRpb25DYWxsKENHTS5nZXRJbnRyaW5zaWMobGx2bTo6SW50cmluc2ljOjp2YXJfYW5ub3RhdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChWLCBDR00uSW50OFB0clR5LCBWLT5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAoKmFpKS0+Z2V0QW5ub3RhdGlvbigpLCBELT5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgSS0+Z2V0QW5ub3RhdGlvbigpLCBELT5nZXRMb2NhdGlvbigpKTsKIH0KIAogbGx2bTo6VmFsdWUgKkNvZGVHZW5GdW5jdGlvbjo6RW1pdEZpZWxkQW5ub3RhdGlvbnMoY29uc3QgRmllbGREZWNsICpELApAQCAtMTQ3OSwxNSArMTU4MiwxMyBAQAogICBsbHZtOjpWYWx1ZSAqRiA9IENHTS5nZXRJbnRyaW5zaWMobGx2bTo6SW50cmluc2ljOjpwdHJfYW5ub3RhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHTS5JbnQ4UHRyVHkpOwogCi0gIGZvciAoc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxBbm5vdGF0ZUF0dHI+Ci0gICAgICAgYWkgPSBELT5zcGVjaWZpY19hdHRyX2JlZ2luPEFubm90YXRlQXR0cj4oKSwKLSAgICAgICBhZSA9IEQtPnNwZWNpZmljX2F0dHJfZW5kPEFubm90YXRlQXR0cj4oKTsgYWkgIT0gYWU7ICsrYWkpIHsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogRC0+c3BlY2lmaWNfYXR0cnM8QW5ub3RhdGVBdHRyPigpKSB7CiAgICAgLy8gRklYTUUgQWx3YXlzIGVtaXQgdGhlIGNhc3QgaW5zdCBzbyB3ZSBjYW4gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuCiAgICAgLy8gYW5ub3RhdGlvbiBvbiB0aGUgZmlyc3QgZmllbGQgb2YgYSBzdHJ1Y3QgYW5kIGFubm90YXRpb24gb24gdGhlIHN0cnVjdAogICAgIC8vIGl0c2VsZi4KICAgICBpZiAoVlR5ICE9IENHTS5JbnQ4UHRyVHkpCiAgICAgICBWID0gQnVpbGRlci5JbnNlcnQobmV3IGxsdm06OkJpdENhc3RJbnN0KFYsIENHTS5JbnQ4UHRyVHkpKTsKLSAgICBWID0gRW1pdEFubm90YXRpb25DYWxsKEYsIFYsICgqYWkpLT5nZXRBbm5vdGF0aW9uKCksIEQtPmdldExvY2F0aW9uKCkpOworICAgIFYgPSBFbWl0QW5ub3RhdGlvbkNhbGwoRiwgViwgSS0+Z2V0QW5ub3RhdGlvbigpLCBELT5nZXRMb2NhdGlvbigpKTsKICAgICBWID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KFYsIFZUeSk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ29kZUdlbkZ1bmN0aW9uLmggYi9saWIvQ29kZUdlbi9Db2RlR2VuRnVuY3Rpb24uaAppbmRleCBkYjI5MWUzLi41YjA2NTNhIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9Db2RlR2VuRnVuY3Rpb24uaAorKysgYi9saWIvQ29kZUdlbi9Db2RlR2VuRnVuY3Rpb24uaApAQCAtMTcsOCArMTcsOSBAQAogI2luY2x1ZGUgIkNHQnVpbGRlci5oIgogI2luY2x1ZGUgIkNHRGVidWdJbmZvLmgiCiAjaW5jbHVkZSAiQ0dWYWx1ZS5oIgotI2luY2x1ZGUgIkVIU2NvcGVTdGFjay5oIgogI2luY2x1ZGUgIkNvZGVHZW5Nb2R1bGUuaCIKKyNpbmNsdWRlICJDb2RlR2VuUEdPLmgiCisjaW5jbHVkZSAiRUhTY29wZVN0YWNrLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0NoYXJVbml0cy5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByQ1hYLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJPYmpDLmgiCkBAIC0zMCw4ICszMSw4IEBACiAjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WYWx1ZUhhbmRsZS5oIgogCiBuYW1lc3BhY2UgbGx2bSB7CiAgIGNsYXNzIEJhc2ljQmxvY2s7CkBAIC02ODcsOCArNjg4LDggQEAKICAgICAgIC8vIGFjdCBleGFjdGx5IGxpa2UgbC12YWx1ZXMgYnV0IGFyZSBmb3JtYWxseSByZXF1aXJlZCB0byBiZQogICAgICAgLy8gci12YWx1ZXMgaW4gQy4KICAgICAgIHJldHVybiBleHByLT5pc0dMVmFsdWUoKSB8fAotICAgICAgICAgICAgIGV4cHItPmdldFR5cGUoKS0+aXNSZWNvcmRUeXBlKCkgfHwKLSAgICAgICAgICAgICBleHByLT5nZXRUeXBlKCktPmlzRnVuY3Rpb25UeXBlKCk7CisgICAgICAgICAgICAgZXhwci0+Z2V0VHlwZSgpLT5pc0Z1bmN0aW9uVHlwZSgpIHx8CisgICAgICAgICAgICAgaGFzQWdncmVnYXRlRXZhbHVhdGlvbktpbmQoZXhwci0+Z2V0VHlwZSgpKTsKICAgICB9CiAKICAgICBzdGF0aWMgT3BhcXVlVmFsdWVNYXBwaW5nRGF0YSBiaW5kKENvZGVHZW5GdW5jdGlvbiAmQ0dGLApAQCAtODI3LDkgKzgyOCwyMSBAQAogICB9OwogICBTbWFsbFZlY3RvcjxCcmVha0NvbnRpbnVlLCA4PiBCcmVha0NvbnRpbnVlU3RhY2s7CiAKKyAgQ29kZUdlblBHTyBQR087CisKK3B1YmxpYzoKKyAgLy8vIEdldCBhIGNvdW50ZXIgZm9yIGluc3RydW1lbnRhdGlvbiBvZiB0aGUgcmVnaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4KKyAgLy8vIHN0YXRlbWVudC4KKyAgUmVnaW9uQ291bnRlciBnZXRQR09SZWdpb25Db3VudGVyKGNvbnN0IFN0bXQgKlMpIHsKKyAgICByZXR1cm4gUmVnaW9uQ291bnRlcihQR08sIFMpOworICB9Citwcml2YXRlOgorCiAgIC8vLyBTd2l0Y2hJbnNuIC0gVGhpcyBpcyBuZWFyZXN0IGN1cnJlbnQgc3dpdGNoIGluc3RydWN0aW9uLiBJdCBpcyBudWxsIGlmCiAgIC8vLyBjdXJyZW50IGNvbnRleHQgaXMgbm90IGluIGEgc3dpdGNoLgogICBsbHZtOjpTd2l0Y2hJbnN0ICpTd2l0Y2hJbnNuOworICAvLy8gVGhlIGJyYW5jaCB3ZWlnaHRzIG9mIFN3aXRjaEluc24gd2hlbiBkb2luZyBpbnN0cnVtZW50YXRpb24gYmFzZWQgUEdPLgorICBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgMTY+ICpTd2l0Y2hXZWlnaHRzOwogCiAgIC8vLyBDYXNlUmFuZ2VCbG9jayAtIFRoaXMgYmxvY2sgaG9sZHMgaWYgY29uZGl0aW9uIGNoZWNrIGZvciBsYXN0IGNhc2UKICAgLy8vIHN0YXRlbWVudCByYW5nZSBpbiBjdXJyZW50IHN3aXRjaCBpbnN0cnVjdGlvbi4KQEAgLTEwMTksNiArMTAzMiw3IEBACiAgIHZvaWQgcHVzaExpZmV0aW1lRXh0ZW5kZWREZXN0cm95KENsZWFudXBLaW5kIGtpbmQsIGxsdm06OlZhbHVlICphZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSB0eXBlLCBEZXN0cm95ZXIgKmRlc3Ryb3llciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VFSENsZWFudXBGb3JBcnJheSk7CisgIHZvaWQgcHVzaFN0YWNrUmVzdG9yZShDbGVhbnVwS2luZCBraW5kLCBsbHZtOjpWYWx1ZSAqU1BNZW0pOwogICB2b2lkIGVtaXREZXN0cm95KGxsdm06OlZhbHVlICphZGRyLCBRdWFsVHlwZSB0eXBlLCBEZXN0cm95ZXIgKmRlc3Ryb3llciwKICAgICAgICAgICAgICAgICAgICBib29sIHVzZUVIQ2xlYW51cEZvckFycmF5KTsKICAgbGx2bTo6RnVuY3Rpb24gKmdlbmVyYXRlRGVzdHJveUhlbHBlcihsbHZtOjpDb25zdGFudCAqYWRkciwgUXVhbFR5cGUgdHlwZSwKQEAgLTExMzcsNiArMTE1MSw3IEBACiAgIHZvaWQgRW1pdERlc3RydWN0b3JCb2R5KEZ1bmN0aW9uQXJnTGlzdCAmQXJncyk7CiAgIHZvaWQgZW1pdEltcGxpY2l0QXNzaWdubWVudE9wZXJhdG9yQm9keShGdW5jdGlvbkFyZ0xpc3QgJkFyZ3MpOwogICB2b2lkIEVtaXRGdW5jdGlvbkJvZHkoRnVuY3Rpb25BcmdMaXN0ICZBcmdzLCBjb25zdCBTdG10ICpCb2R5KTsKKyAgdm9pZCBFbWl0QmxvY2tXaXRoRmFsbFRocm91Z2gobGx2bTo6QmFzaWNCbG9jayAqQkIsIFJlZ2lvbkNvdW50ZXIgJkNudCk7CiAKICAgdm9pZCBFbWl0Rm9yd2FyZGluZ0NhbGxUb0xhbWJkYShjb25zdCBDWFhNZXRob2REZWNsICpMYW1iZGFDYWxsT3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEFyZ0xpc3QgJkNhbGxBcmdzKTsKQEAgLTEzODAsNiArMTM5NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdnVmFsdWVTbG90OjpJc05vdEFsaWFzZWQpOwogICB9CiAKKyAgLy8vIENyZWF0ZUluQWxsb2NhVG1wIC0gQ3JlYXRlIGEgdGVtcG9yYXJ5IG1lbW9yeSBvYmplY3QgZm9yIHRoZSBnaXZlbgorICAvLy8gYWdncmVnYXRlIHR5cGUuCisgIEFnZ1ZhbHVlU2xvdCBDcmVhdGVJbkFsbG9jYVRtcChRdWFsVHlwZSBULCBjb25zdCBUd2luZSAmTmFtZSA9ICJpbmFsbG9jYSIpOworCiAgIC8vLyBFbWl0IGEgY2FzdCB0byB2b2lkKiBpbiB0aGUgYXBwcm9wcmlhdGUgYWRkcmVzcyBzcGFjZS4KICAgbGx2bTo6VmFsdWUgKkVtaXRDYXN0VG9Wb2lkUHRyKGxsdm06OlZhbHVlICp2YWx1ZSk7CiAKQEAgLTE3NjcsNyArMTc4Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBMaW5rYWdlKTsKIAogICAvLy8gRW1pdFBhcm1EZWNsIC0gRW1pdCBhIFBhcm1WYXJEZWNsIG9yIGFuIEltcGxpY2l0UGFyYW1EZWNsLgotICB2b2lkIEVtaXRQYXJtRGVjbChjb25zdCBWYXJEZWNsICZELCBsbHZtOjpWYWx1ZSAqQXJnLCB1bnNpZ25lZCBBcmdObyk7CisgIHZvaWQgRW1pdFBhcm1EZWNsKGNvbnN0IFZhckRlY2wgJkQsIGxsdm06OlZhbHVlICpBcmcsIGJvb2wgQXJnSXNQb2ludGVyLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBcmdObyk7CiAKICAgLy8vIHByb3RlY3RGcm9tUGVlcGhvbGVzIC0gUHJvdGVjdCBhIHZhbHVlIHRoYXQgd2UncmUgaW50ZW5kaW5nIHRvCiAgIC8vLyBzdG9yZSB0byB0aGUgc2lkZSwgYnV0IHdoaWNoIHdpbGwgcHJvYmFibHkgYmUgdXNlZCBsYXRlciwgZnJvbQpAQCAtMjE1OSw2ICsyMTc5LDE4IEBACiAgIGxsdm06OlZhbHVlICpFbWl0QUFyY2g2NENvbXBhcmVCdWlsdGluRXhwcihsbHZtOjpWYWx1ZSAqT3AsIGxsdm06OlR5cGUgKlR5KTsKICAgbGx2bTo6VmFsdWUgKkVtaXRBQXJjaDY0QnVpbHRpbkV4cHIodW5zaWduZWQgQnVpbHRpbklELCBjb25zdCBDYWxsRXhwciAqRSk7CiAgIGxsdm06OlZhbHVlICpFbWl0QVJNQnVpbHRpbkV4cHIodW5zaWduZWQgQnVpbHRpbklELCBjb25zdCBDYWxsRXhwciAqRSk7CisKKyAgbGx2bTo6VmFsdWUgKkVtaXRDb21tb25OZW9uQnVpbHRpbkV4cHIodW5zaWduZWQgQnVpbHRpbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMTFZNSW50cmluc2ljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbHRMTFZNSW50cmluc2ljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lSGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8bGx2bTo6VmFsdWUgKj4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkFsaWduID0gMCk7CisgIGxsdm06OkZ1bmN0aW9uICpMb29rdXBOZW9uTExWTUludHJpbnNpYyh1bnNpZ25lZCBJbnRyaW5zaWNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1vZGlmaWVyLCBsbHZtOjpUeXBlICpBcmdUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFeHByICpFKTsKICAgbGx2bTo6VmFsdWUgKkVtaXROZW9uQ2FsbChsbHZtOjpGdW5jdGlvbiAqRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8bGx2bTo6VmFsdWUqPiAmTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLApAQCAtMjE2OCw2ICsyMjAwLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVnYXRlRm9yUmlnaHRTaGlmdCk7CiAgIGxsdm06OlZhbHVlICpFbWl0TmVvblJTaGlmdEltbShsbHZtOjpWYWx1ZSAqVmVjLCBsbHZtOjpWYWx1ZSAqQW10LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VHlwZSAqVHksIGJvb2wgdXNnbiwgY29uc3QgY2hhciAqbmFtZSk7CisgIGxsdm06OlZhbHVlICpFbWl0Q29uY2F0VmVjdG9ycyhsbHZtOjpWYWx1ZSAqTG8sIGxsdm06OlZhbHVlICpIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlR5cGUgKkFyZ1R5KTsKKyAgbGx2bTo6VmFsdWUgKkVtaXRFeHRyYWN0SGlnaChsbHZtOjpWYWx1ZSAqSW4sIGxsdm06OlR5cGUgKlJlc1R5KTsKKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgRW1pdEFSTTY0QnVpbHRpbkV4cHIuCisgIGxsdm06OlZhbHVlICp2ZWN0b3JXcmFwU2NhbGFyOChsbHZtOjpWYWx1ZSAqT3ApOworICBsbHZtOjpWYWx1ZSAqdmVjdG9yV3JhcFNjYWxhcjE2KGxsdm06OlZhbHVlICpPcCk7CisgIGxsdm06OlZhbHVlICplbWl0VmVjdG9yV3JhcHBlZFNjYWxhcjhJbnRyaW5zaWMoCisgICAgICB1bnNpZ25lZCBJbnQsIFNtYWxsVmVjdG9ySW1wbDxsbHZtOjpWYWx1ZSAqPiAmT3BzLCBjb25zdCBjaGFyICpOYW1lKTsKKyAgbGx2bTo6VmFsdWUgKmVtaXRWZWN0b3JXcmFwcGVkU2NhbGFyMTZJbnRyaW5zaWMoCisgICAgICB1bnNpZ25lZCBJbnQsIFNtYWxsVmVjdG9ySW1wbDxsbHZtOjpWYWx1ZSAqPiAmT3BzLCBjb25zdCBjaGFyICpOYW1lKTsKKyAgbGx2bTo6VmFsdWUgKkVtaXRBUk02NEJ1aWx0aW5FeHByKHVuc2lnbmVkIEJ1aWx0aW5JRCwgY29uc3QgQ2FsbEV4cHIgKkUpOworICBsbHZtOjpWYWx1ZSAqRW1pdE5lb242NENhbGwobGx2bTo6RnVuY3Rpb24gKkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFZlY3RvckltcGw8bGx2bTo6VmFsdWUgKj4gJk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKIAogICBsbHZtOjpWYWx1ZSAqQnVpbGRWZWN0b3IoQXJyYXlSZWY8bGx2bTo6VmFsdWUqPiBPcHMpOwogICBsbHZtOjpWYWx1ZSAqRW1pdFg4NkJ1aWx0aW5FeHByKHVuc2lnbmVkIEJ1aWx0aW5JRCwgY29uc3QgQ2FsbEV4cHIgKkUpOwpAQCAtMjMwNCw5ICsyMzUwLDkgQEAKIAogICAvLy8gQ3JlYXRlU3RhdGljVmFyRGVjbCAtIENyZWF0ZSBhIHplcm8taW5pdGlhbGl6ZWQgTExWTSBnbG9iYWwgZm9yCiAgIC8vLyBhIHN0YXRpYyBsb2NhbCB2YXJpYWJsZS4KLSAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkNyZWF0ZVN0YXRpY1ZhckRlY2woY29uc3QgVmFyRGVjbCAmRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqU2VwYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBMaW5rYWdlKTsKKyAgbGx2bTo6Q29uc3RhbnQgKkNyZWF0ZVN0YXRpY1ZhckRlY2woY29uc3QgVmFyRGVjbCAmRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqU2VwYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzIExpbmthZ2UpOwogCiAgIC8vLyBBZGRJbml0aWFsaXplclRvU3RhdGljVmFyRGVjbCAtIEFkZCB0aGUgaW5pdGlhbGl6ZXIgZm9yICdEJyB0byB0aGUKICAgLy8vIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBmb3IgaXQuICBJZiB0aGUgaW5pdGlhbGl6ZXIKQEAgLTI0MTMsOCArMjQ1OSwxMCBAQAogICAvLy8gRW1pdEJyYW5jaE9uQm9vbEV4cHIgLSBFbWl0IGEgYnJhbmNoIG9uIGEgYm9vbGVhbiBjb25kaXRpb24gKGUuZy4gZm9yIGFuCiAgIC8vLyBpZiBzdGF0ZW1lbnQpIHRvIHRoZSBzcGVjaWZpZWQgYmxvY2tzLiAgQmFzZWQgb24gdGhlIGNvbmRpdGlvbiwgdGhpcyBtaWdodAogICAvLy8gdHJ5IHRvIHNpbXBsaWZ5IHRoZSBjb2RlZ2VuIG9mIHRoZSBjb25kaXRpb25hbCBiYXNlZCBvbiB0aGUgYnJhbmNoLgorICAvLy8gVHJ1ZUNvdW50IHNob3VsZCBiZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHdlIGV4cGVjdCB0aGUgY29uZGl0aW9uIHRvCisgIC8vLyBldmFsdWF0ZSB0byB0cnVlIGJhc2VkIG9uIFBHTyBkYXRhLgogICB2b2lkIEVtaXRCcmFuY2hPbkJvb2xFeHByKGNvbnN0IEV4cHIgKkNvbmQsIGxsdm06OkJhc2ljQmxvY2sgKlRydWVCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCYXNpY0Jsb2NrICpGYWxzZUJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpCYXNpY0Jsb2NrICpGYWxzZUJsb2NrLCB1aW50NjRfdCBUcnVlQ291bnQpOwogCiAgIC8vLyBcYnJpZWYgRW1pdCBhIGRlc2NyaXB0aW9uIG9mIGEgdHlwZSBpbiBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgcGFzc2luZyB0bwogICAvLy8gYSBydW50aW1lIHNhbml0aXplciBoYW5kbGVyLgpAQCAtMjQ2Nyw2ICsyNTE1LDExIEBACiAgIGxsdm06Ok1ETm9kZSAqZ2V0UmFuZ2VGb3JMb2FkRnJvbVR5cGUoUXVhbFR5cGUgVHkpOwogICB2b2lkIEVtaXRSZXR1cm5PZlJWYWx1ZShSVmFsdWUgUlYsIFF1YWxUeXBlIFR5KTsKIAorICB2b2lkIGRlZmVyUGxhY2Vob2xkZXJSZXBsYWNlbWVudChsbHZtOjpJbnN0cnVjdGlvbiAqT2xkLCBsbHZtOjpWYWx1ZSAqTmV3KTsKKworICBsbHZtOjpTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8bGx2bTo6SW5zdHJ1Y3Rpb24gKiwgbGx2bTo6VmFsdWUgKj4sIDQ+CisgIERlZmVycmVkUmVwbGFjZW1lbnRzOworCiAgIC8vLyBFeHBhbmRUeXBlRnJvbUFyZ3MgLSBSZWNvbnN0cnVjdCBhIHN0cnVjdHVyZSBvZiB0eXBlIFxhcmcgVHkKICAgLy8vIGZyb20gZnVuY3Rpb24gYXJndW1lbnRzIGludG8gXGFyZyBEc3QuIFNlZSBBQklBcmdJbmZvOjpFeHBhbmQuCiAgIC8vLwpAQCAtMjQ5Miw2OSArMjU0NSw4MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZDb25zdHJhaW50U3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyk7CiAKK3B1YmxpYzoKICAgLy8vIEVtaXRDYWxsQXJncyAtIEVtaXQgY2FsbCBhcmd1bWVudHMgZm9yIGEgZnVuY3Rpb24uCi0gIC8vLyBUaGUgQ2FsbEFyZ1R5cGVJbmZvIHBhcmFtZXRlciBpcyB1c2VkIGZvciBpdGVyYXRpbmcgb3ZlciB0aGUga25vd24KLSAgLy8vIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIHZvaWQgRW1pdENhbGxBcmdzKENhbGxBcmdMaXN0JiBBcmdzLCBjb25zdCBUKiBDYWxsQXJnVHlwZUluZm8sCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIEVtaXRDYWxsQXJncyhDYWxsQXJnTGlzdCAmQXJncywgY29uc3QgVCAqQ2FsbEFyZ1R5cGVJbmZvLAogICAgICAgICAgICAgICAgICAgICBDYWxsRXhwcjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEFyZ0JlZywKICAgICAgICAgICAgICAgICAgICAgQ2FsbEV4cHI6OmNvbnN0X2FyZ19pdGVyYXRvciBBcmdFbmQsCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yY2VDb2x1bW5JbmZvID0gZmFsc2UpIHsKLSAgICBDR0RlYnVnSW5mbyAqREkgPSBnZXREZWJ1Z0luZm8oKTsKLSAgICBTb3VyY2VMb2NhdGlvbiBDYWxsTG9jOwotICAgIGlmIChESSkgQ2FsbExvYyA9IERJLT5nZXRMb2NhdGlvbigpOwotCi0gICAgQ2FsbEV4cHI6OmNvbnN0X2FyZ19pdGVyYXRvciBBcmcgPSBBcmdCZWc7Ci0KLSAgICAvLyBGaXJzdCwgdXNlIHRoZSBhcmd1bWVudCB0eXBlcyB0aGF0IHRoZSB0eXBlIGluZm8ga25vd3MgYWJvdXQKICAgICBpZiAoQ2FsbEFyZ1R5cGVJbmZvKSB7Ci0gICAgICBmb3IgKHR5cGVuYW1lIFQ6OmFyZ190eXBlX2l0ZXJhdG9yIEkgPSBDYWxsQXJnVHlwZUluZm8tPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgICAgIEUgPSBDYWxsQXJnVHlwZUluZm8tPmFyZ190eXBlX2VuZCgpOyBJICE9IEU7ICsrSSwgKytBcmcpIHsKLSAgICAgICAgYXNzZXJ0KEFyZyAhPSBBcmdFbmQgJiYgIlJ1bm5pbmcgb3ZlciBlZGdlIG9mIGFyZ3VtZW50IGxpc3QhIik7Ci0gICAgICAgIFF1YWxUeXBlIEFyZ1R5cGUgPSAqSTsKLSNpZm5kZWYgTkRFQlVHCi0gICAgICAgIFF1YWxUeXBlIEFjdHVhbEFyZ1R5cGUgPSBBcmctPmdldFR5cGUoKTsKLSAgICAgICAgaWYgKEFyZ1R5cGUtPmlzUG9pbnRlclR5cGUoKSAmJiBBY3R1YWxBcmdUeXBlLT5pc1BvaW50ZXJUeXBlKCkpIHsKLSAgICAgICAgICBRdWFsVHlwZSBBY3R1YWxCYXNlVHlwZSA9Ci0gICAgICAgICAgICBBY3R1YWxBcmdUeXBlLT5nZXRBczxQb2ludGVyVHlwZT4oKS0+Z2V0UG9pbnRlZVR5cGUoKTsKLSAgICAgICAgICBRdWFsVHlwZSBBcmdCYXNlVHlwZSA9Ci0gICAgICAgICAgICBBcmdUeXBlLT5nZXRBczxQb2ludGVyVHlwZT4oKS0+Z2V0UG9pbnRlZVR5cGUoKTsKLSAgICAgICAgICBpZiAoQXJnQmFzZVR5cGUtPmlzVmFyaWFibGVBcnJheVR5cGUoKSkgewotICAgICAgICAgICAgaWYgKGNvbnN0IFZhcmlhYmxlQXJyYXlUeXBlICpWQVQgPQotICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRBc1ZhcmlhYmxlQXJyYXlUeXBlKEFjdHVhbEJhc2VUeXBlKSkgewotICAgICAgICAgICAgICBpZiAoIVZBVC0+Z2V0U2l6ZUV4cHIoKSkKLSAgICAgICAgICAgICAgICBBY3R1YWxBcmdUeXBlID0gQXJnVHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KGdldENvbnRleHQoKS5nZXRDYW5vbmljYWxUeXBlKEFyZ1R5cGUuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpKS4KLSAgICAgICAgICAgICAgIGdldFR5cGVQdHIoKSA9PQotICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldENhbm9uaWNhbFR5cGUoQWN0dWFsQXJnVHlwZSkuZ2V0VHlwZVB0cigpICYmCi0gICAgICAgICAgICAgICAidHlwZSBtaXNtYXRjaCBpbiBjYWxsIGFyZ3VtZW50ISIpOwotI2VuZGlmCi0gICAgICAgIEVtaXRDYWxsQXJnKEFyZ3MsICpBcmcsIEFyZ1R5cGUpOwotCi0gICAgICAgIC8vIEVhY2ggYXJndW1lbnQgZXhwcmVzc2lvbiBjb3VsZCBtb2RpZnkgdGhlIGRlYnVnCi0gICAgICAgIC8vIGxvY2F0aW9uLiBSZXN0b3JlIGl0LgotICAgICAgICBpZiAoREkpIERJLT5FbWl0TG9jYXRpb24oQnVpbGRlciwgQ2FsbExvYywgRm9yY2VDb2x1bW5JbmZvKTsKLSAgICAgIH0KLQotICAgICAgLy8gRWl0aGVyIHdlJ3ZlIGVtaXR0ZWQgYWxsIHRoZSBjYWxsIGFyZ3MsIG9yIHdlIGhhdmUgYSBjYWxsIHRvIGEKLSAgICAgIC8vIHZhcmlhZGljIGZ1bmN0aW9uLgotICAgICAgYXNzZXJ0KChBcmcgPT0gQXJnRW5kIHx8IENhbGxBcmdUeXBlSW5mby0+aXNWYXJpYWRpYygpKSAmJgotICAgICAgICAgICAgICJFeHRyYSBhcmd1bWVudHMgaW4gbm9uLXZhcmlhZGljIGZ1bmN0aW9uISIpOwotCi0gICAgfQotCi0gICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBhbnkgYXJndW1lbnRzLCBlbWl0IHRoZW0gdXNpbmcgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50LgotICAgIGZvciAoOyBBcmcgIT0gQXJnRW5kOyArK0FyZykgewotICAgICAgRW1pdENhbGxBcmcoQXJncywgKkFyZywgQXJnLT5nZXRUeXBlKCkpOwotCi0gICAgICAvLyBSZXN0b3JlIHRoZSBkZWJ1ZyBsb2NhdGlvbi4KLSAgICAgIGlmIChESSkgREktPkVtaXRMb2NhdGlvbihCdWlsZGVyLCBDYWxsTG9jLCBGb3JjZUNvbHVtbkluZm8pOworICAgICAgRW1pdENhbGxBcmdzKEFyZ3MsIENhbGxBcmdUeXBlSW5mby0+aXNWYXJpYWRpYygpLAorICAgICAgICAgICAgICAgICAgIENhbGxBcmdUeXBlSW5mby0+cGFyYW1fdHlwZV9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgIENhbGxBcmdUeXBlSW5mby0+cGFyYW1fdHlwZV9lbmQoKSwgQXJnQmVnLCBBcmdFbmQsCisgICAgICAgICAgICAgICAgICAgRm9yY2VDb2x1bW5JbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVDo6cGFyYW1fdHlwZV9pdGVyYXRvciBtaWdodCBub3QgaGF2ZSBhIGRlZmF1bHQgY3Rvci4KKyAgICAgIGNvbnN0IFF1YWxUeXBlICpOb0l0ZXIgPSAwOworICAgICAgRW1pdENhbGxBcmdzKEFyZ3MsIC8qQWxsb3dFeHRyYUFyZ3VtZW50cz0qL3RydWUsIE5vSXRlciwgTm9JdGVyLCBBcmdCZWcsCisgICAgICAgICAgICAgICAgICAgQXJnRW5kLCBGb3JjZUNvbHVtbkluZm8pOwogICAgIH0KICAgfQogCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1R5cGVJdGVyYXRvcj4KKyAgdm9pZCBFbWl0Q2FsbEFyZ3MoQ2FsbEFyZ0xpc3QmIEFyZ3MsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dFeHRyYUFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgQXJnVHlwZUl0ZXJhdG9yIEFyZ1R5cGVCZWcsCisgICAgICAgICAgICAgICAgICAgIEFyZ1R5cGVJdGVyYXRvciBBcmdUeXBlRW5kLAorICAgICAgICAgICAgICAgICAgICBDYWxsRXhwcjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEFyZ0JlZywKKyAgICAgICAgICAgICAgICAgICAgQ2FsbEV4cHI6OmNvbnN0X2FyZ19pdGVyYXRvciBBcmdFbmQsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yY2VDb2x1bW5JbmZvID0gZmFsc2UpIHsKKyAgICBTbWFsbFZlY3RvcjxRdWFsVHlwZSwgMTY+IEFyZ1R5cGVzOworICAgIENhbGxFeHByOjpjb25zdF9hcmdfaXRlcmF0b3IgQXJnID0gQXJnQmVnOworCisgICAgLy8gRmlyc3QsIHVzZSB0aGUgYXJndW1lbnQgdHlwZXMgdGhhdCB0aGUgdHlwZSBpbmZvIGtub3dzIGFib3V0CisgICAgZm9yIChBcmdUeXBlSXRlcmF0b3IgSSA9IEFyZ1R5cGVCZWcsIEUgPSBBcmdUeXBlRW5kOyBJICE9IEU7ICsrSSwgKytBcmcpIHsKKyAgICAgIGFzc2VydChBcmcgIT0gQXJnRW5kICYmICJSdW5uaW5nIG92ZXIgZWRnZSBvZiBhcmd1bWVudCBsaXN0ISIpOworI2lmbmRlZiBOREVCVUcKKyAgICAgIFF1YWxUeXBlIEFyZ1R5cGUgPSAqSTsKKyAgICAgIFF1YWxUeXBlIEFjdHVhbEFyZ1R5cGUgPSBBcmctPmdldFR5cGUoKTsKKyAgICAgIGlmIChBcmdUeXBlLT5pc1BvaW50ZXJUeXBlKCkgJiYgQWN0dWFsQXJnVHlwZS0+aXNQb2ludGVyVHlwZSgpKSB7CisgICAgICAgIFF1YWxUeXBlIEFjdHVhbEJhc2VUeXBlID0KKyAgICAgICAgICAgIEFjdHVhbEFyZ1R5cGUtPmdldEFzPFBvaW50ZXJUeXBlPigpLT5nZXRQb2ludGVlVHlwZSgpOworICAgICAgICBRdWFsVHlwZSBBcmdCYXNlVHlwZSA9CisgICAgICAgICAgICBBcmdUeXBlLT5nZXRBczxQb2ludGVyVHlwZT4oKS0+Z2V0UG9pbnRlZVR5cGUoKTsKKyAgICAgICAgaWYgKEFyZ0Jhc2VUeXBlLT5pc1ZhcmlhYmxlQXJyYXlUeXBlKCkpIHsKKyAgICAgICAgICBpZiAoY29uc3QgVmFyaWFibGVBcnJheVR5cGUgKlZBVCA9CisgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRBc1ZhcmlhYmxlQXJyYXlUeXBlKEFjdHVhbEJhc2VUeXBlKSkgeworICAgICAgICAgICAgaWYgKCFWQVQtPmdldFNpemVFeHByKCkpCisgICAgICAgICAgICAgIEFjdHVhbEFyZ1R5cGUgPSBBcmdUeXBlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYXNzZXJ0KGdldENvbnRleHQoKS5nZXRDYW5vbmljYWxUeXBlKEFyZ1R5cGUuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpKS4KKyAgICAgICAgICAgICBnZXRUeXBlUHRyKCkgPT0KKyAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q2Fub25pY2FsVHlwZShBY3R1YWxBcmdUeXBlKS5nZXRUeXBlUHRyKCkgJiYKKyAgICAgICAgICAgICAidHlwZSBtaXNtYXRjaCBpbiBjYWxsIGFyZ3VtZW50ISIpOworI2VuZGlmCisgICAgICBBcmdUeXBlcy5wdXNoX2JhY2soKkkpOworICAgIH0KKworICAgIC8vIEVpdGhlciB3ZSd2ZSBlbWl0dGVkIGFsbCB0aGUgY2FsbCBhcmdzLCBvciB3ZSBoYXZlIGEgY2FsbCB0byB2YXJpYWRpYworICAgIC8vIGZ1bmN0aW9uIG9yIHNvbWUgb3RoZXIgY2FsbCB0aGF0IGFsbG93cyBleHRyYSBhcmd1bWVudHMuCisgICAgYXNzZXJ0KChBcmcgPT0gQXJnRW5kIHx8IEFsbG93RXh0cmFBcmd1bWVudHMpICYmCisgICAgICAgICAgICJFeHRyYSBhcmd1bWVudHMgaW4gbm9uLXZhcmlhZGljIGZ1bmN0aW9uISIpOworCisgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBhbnkgYXJndW1lbnRzLCBlbWl0IHRoZW0gdXNpbmcgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50LgorICAgIGZvciAoOyBBcmcgIT0gQXJnRW5kOyArK0FyZykKKyAgICAgIEFyZ1R5cGVzLnB1c2hfYmFjayhBcmctPmdldFR5cGUoKSk7CisKKyAgICBFbWl0Q2FsbEFyZ3MoQXJncywgQXJnVHlwZXMsIEFyZ0JlZywgQXJnRW5kLCBGb3JjZUNvbHVtbkluZm8pOworICB9CisKKyAgdm9pZCBFbWl0Q2FsbEFyZ3MoQ2FsbEFyZ0xpc3QgJkFyZ3MsIEFycmF5UmVmPFF1YWxUeXBlPiBBcmdUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgQ2FsbEV4cHI6OmNvbnN0X2FyZ19pdGVyYXRvciBBcmdCZWcsCisgICAgICAgICAgICAgICAgICAgIENhbGxFeHByOjpjb25zdF9hcmdfaXRlcmF0b3IgQXJnRW5kLCBib29sIEZvcmNlQ29sdW1uSW5mbyk7CisKK3ByaXZhdGU6CiAgIGNvbnN0IFRhcmdldENvZGVHZW5JbmZvICZnZXRUYXJnZXRIb29rcygpIGNvbnN0IHsKICAgICByZXR1cm4gQ0dNLmdldFRhcmdldENvZGVHZW5JbmZvKCk7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL0NvZGVHZW5Nb2R1bGUuY3BwIGIvbGliL0NvZGVHZW4vQ29kZUdlbk1vZHVsZS5jcHAKaW5kZXggNzkyZmJmYy4uYzI2Zjc2OSAxMDA2NDQKLS0tIGEvbGliL0NvZGVHZW4vQ29kZUdlbk1vZHVsZS5jcHAKKysrIGIvbGliL0NvZGVHZW4vQ29kZUdlbk1vZHVsZS5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJDR09iakNSdW50aW1lLmgiCiAjaW5jbHVkZSAiQ0dPcGVuQ0xSdW50aW1lLmgiCiAjaW5jbHVkZSAiQ29kZUdlbkZ1bmN0aW9uLmgiCisjaW5jbHVkZSAiQ29kZUdlblBHTy5oIgogI2luY2x1ZGUgIkNvZGVHZW5UQkFBLmgiCiAjaW5jbHVkZSAiVGFyZ2V0SW5mby5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCkBAIC00MCwzMCArNDEsMzAgQEAKICNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWFEaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvQVBTSW50LmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgogI2luY2x1ZGUgImxsdm0vSVIvQ2FsbGluZ0NvbnYuaCIKICNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKICNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKICNpbmNsdWRlICJsbHZtL0lSL0xMVk1Db250ZXh0LmgiCiAjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FsbFNpdGUuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29udmVydFVURi5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9UYXJnZXQvTWFuZ2xlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiB1c2luZyBuYW1lc3BhY2UgQ29kZUdlbjsKIAogc3RhdGljIGNvbnN0IGNoYXIgQW5ub3RhdGlvblNlY3Rpb25bXSA9ICJsbHZtLm1ldGFkYXRhIjsKIAotc3RhdGljIENHQ1hYQUJJICZjcmVhdGVDWFhBQkkoQ29kZUdlbk1vZHVsZSAmQ0dNKSB7CitzdGF0aWMgQ0dDWFhBQkkgKmNyZWF0ZUNYWEFCSShDb2RlR2VuTW9kdWxlICZDR00pIHsKICAgc3dpdGNoIChDR00uZ2V0VGFyZ2V0KCkuZ2V0Q1hYQUJJKCkuZ2V0S2luZCgpKSB7CiAgIGNhc2UgVGFyZ2V0Q1hYQUJJOjpHZW5lcmljQUFyY2g2NDoKICAgY2FzZSBUYXJnZXRDWFhBQkk6OkdlbmVyaWNBUk06CiAgIGNhc2UgVGFyZ2V0Q1hYQUJJOjppT1M6CisgIGNhc2UgVGFyZ2V0Q1hYQUJJOjppT1M2NDoKICAgY2FzZSBUYXJnZXRDWFhBQkk6OkdlbmVyaWNJdGFuaXVtOgotICAgIHJldHVybiAqQ3JlYXRlSXRhbml1bUNYWEFCSShDR00pOworICAgIHJldHVybiBDcmVhdGVJdGFuaXVtQ1hYQUJJKENHTSk7CiAgIGNhc2UgVGFyZ2V0Q1hYQUJJOjpNaWNyb3NvZnQ6Ci0gICAgcmV0dXJuICpDcmVhdGVNaWNyb3NvZnRDWFhBQkkoQ0dNKTsKKyAgICByZXR1cm4gQ3JlYXRlTWljcm9zb2Z0Q1hYQUJJKENHTSk7CiAgIH0KIAogICBsbHZtX3VucmVhY2hhYmxlKCJpbnZhbGlkIEMrKyBBQkkga2luZCIpOwpAQCAtNzcsNyArNzgsOCBAQAogICAgICAgQUJJKGNyZWF0ZUNYWEFCSSgqdGhpcykpLCBWTUNvbnRleHQoTS5nZXRDb250ZXh0KCkpLCBUQkFBKDApLAogICAgICAgVGhlVGFyZ2V0Q29kZUdlbkluZm8oMCksIFR5cGVzKCp0aGlzKSwgVlRhYmxlcygqdGhpcyksIE9iakNSdW50aW1lKDApLAogICAgICAgT3BlbkNMUnVudGltZSgwKSwgQ1VEQVJ1bnRpbWUoMCksIERlYnVnSW5mbygwKSwgQVJDRGF0YSgwKSwKLSAgICAgIE5vT2JqQ0FSQ0V4Y2VwdGlvbnNNZXRhZGF0YSgwKSwgUlJEYXRhKDApLCBDRkNvbnN0YW50U3RyaW5nQ2xhc3NSZWYoMCksCisgICAgICBOb09iakNBUkNFeGNlcHRpb25zTWV0YWRhdGEoMCksIFJSRGF0YSgwKSwgUEdPRGF0YSgwKSwKKyAgICAgIENGQ29uc3RhbnRTdHJpbmdDbGFzc1JlZigwKSwKICAgICAgIENvbnN0YW50U3RyaW5nQ2xhc3NSZWYoMCksIE5TQ29uc3RhbnRTdHJpbmdUeXBlKDApLAogICAgICAgTlNDb25jcmV0ZUdsb2JhbEJsb2NrKDApLCBOU0NvbmNyZXRlU3RhY2tCbG9jaygwKSwgQmxvY2tPYmplY3RBc3NpZ24oMCksCiAgICAgICBCbG9ja09iamVjdERpc3Bvc2UoMCksIEJsb2NrRGVzY3JpcHRvclR5cGUoMCksIEdlbmVyaWNCbG9ja0xpdGVyYWxUeXBlKDApLApAQCAtMTE3LDcgKzExOSw3IEBACiAgIGlmIChTYW5PcHRzLlRocmVhZCB8fAogICAgICAgKCFDb2RlR2VuT3B0cy5SZWxheGVkQWxpYXNpbmcgJiYgQ29kZUdlbk9wdHMuT3B0aW1pemF0aW9uTGV2ZWwgPiAwKSkKICAgICBUQkFBID0gbmV3IENvZGVHZW5UQkFBKENvbnRleHQsIFZNQ29udGV4dCwgQ29kZUdlbk9wdHMsIGdldExhbmdPcHRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBQkkuZ2V0TWFuZ2xlQ29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENYWEFCSSgpLmdldE1hbmdsZUNvbnRleHQoKSk7CiAKICAgLy8gSWYgZGVidWcgaW5mbyBvciBjb3ZlcmFnZSBnZW5lcmF0aW9uIGlzIGVuYWJsZWQsIGNyZWF0ZSB0aGUgQ0dEZWJ1Z0luZm8KICAgLy8gb2JqZWN0LgpAQCAtMTMxLDYgKzEzMyw5IEBACiAgIGlmIChDLmdldExhbmdPcHRzKCkuT2JqQ0F1dG9SZWZDb3VudCkKICAgICBBUkNEYXRhID0gbmV3IEFSQ0VudHJ5cG9pbnRzKCk7CiAgIFJSRGF0YSA9IG5ldyBSUkVudHJ5cG9pbnRzKCk7CisKKyAgaWYgKCFDb2RlR2VuT3B0cy5JbnN0clByb2ZpbGVJbnB1dC5lbXB0eSgpKQorICAgIFBHT0RhdGEgPSBuZXcgUEdPUHJvZmlsZURhdGEoKnRoaXMsIENvZGVHZW5PcHRzLkluc3RyUHJvZmlsZUlucHV0KTsKIH0KIAogQ29kZUdlbk1vZHVsZTo6fkNvZGVHZW5Nb2R1bGUoKSB7CkBAIC0xMzgsNyArMTQzLDYgQEAKICAgZGVsZXRlIE9wZW5DTFJ1bnRpbWU7CiAgIGRlbGV0ZSBDVURBUnVudGltZTsKICAgZGVsZXRlIFRoZVRhcmdldENvZGVHZW5JbmZvOwotICBkZWxldGUgJkFCSTsKICAgZGVsZXRlIFRCQUE7CiAgIGRlbGV0ZSBEZWJ1Z0luZm87CiAgIGRlbGV0ZSBBUkNEYXRhOwpAQCAtMTg0LDEwICsxODgsMTQgQEAKICAgICBsbHZtOjpGdW5jdGlvbiAqT2xkRiA9IGNhc3Q8bGx2bTo6RnVuY3Rpb24+KEVudHJ5KTsKICAgICBsbHZtOjpGdW5jdGlvbiAqTmV3RiA9IGR5bl9jYXN0PGxsdm06OkZ1bmN0aW9uPihSZXBsYWNlbWVudCk7CiAgICAgaWYgKCFOZXdGKSB7Ci0gICAgICBsbHZtOjpDb25zdGFudEV4cHIgKkNFID0gY2FzdDxsbHZtOjpDb25zdGFudEV4cHI+KFJlcGxhY2VtZW50KTsKLSAgICAgIGFzc2VydChDRS0+Z2V0T3Bjb2RlKCkgPT0gbGx2bTo6SW5zdHJ1Y3Rpb246OkJpdENhc3QgfHwKLSAgICAgICAgICAgICBDRS0+Z2V0T3Bjb2RlKCkgPT0gbGx2bTo6SW5zdHJ1Y3Rpb246OkdldEVsZW1lbnRQdHIpOwotICAgICAgTmV3RiA9IGR5bl9jYXN0PGxsdm06OkZ1bmN0aW9uPihDRS0+Z2V0T3BlcmFuZCgwKSk7CisgICAgICBpZiAobGx2bTo6R2xvYmFsQWxpYXMgKkFsaWFzID0gZHluX2Nhc3Q8bGx2bTo6R2xvYmFsQWxpYXM+KFJlcGxhY2VtZW50KSkgeworICAgICAgICBOZXdGID0gZHluX2Nhc3Q8bGx2bTo6RnVuY3Rpb24+KEFsaWFzLT5nZXRBbGlhc2VkR2xvYmFsKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGx2bTo6Q29uc3RhbnRFeHByICpDRSA9IGNhc3Q8bGx2bTo6Q29uc3RhbnRFeHByPihSZXBsYWNlbWVudCk7CisgICAgICAgIGFzc2VydChDRS0+Z2V0T3Bjb2RlKCkgPT0gbGx2bTo6SW5zdHJ1Y3Rpb246OkJpdENhc3QgfHwKKyAgICAgICAgICAgICAgIENFLT5nZXRPcGNvZGUoKSA9PSBsbHZtOjpJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cik7CisgICAgICAgIE5ld0YgPSBkeW5fY2FzdDxsbHZtOjpGdW5jdGlvbj4oQ0UtPmdldE9wZXJhbmQoMCkpOworICAgICAgfQogICAgIH0KIAogICAgIC8vIFJlcGxhY2Ugb2xkIHdpdGggbmV3LCBidXQga2VlcCB0aGUgb2xkIG9yZGVyLgpAQCAtMjAxLDYgKzIwOSw5IEBACiB9CiAKIHZvaWQgQ29kZUdlbk1vZHVsZTo6Y2hlY2tBbGlhc2VzKCkgeworICAvLyBDaGVjayBpZiB0aGUgY29uc3RydWN0ZWQgYWxpYXNlcyBhcmUgd2VsbCBmb3JtZWQuIEl0IGlzIHJlYWxseSB1bmZvcnR1bmF0ZQorICAvLyB0aGF0IHdlIGhhdmUgdG8gZG8gdGhpcyBpbiBDb2RlR2VuLCBidXQgd2Ugb25seSBjb25zdHJ1Y3QgbWFuZ2xlZCBuYW1lcworICAvLyBhbmQgYWxpYXNlcyBkdXJpbmcgY29kZWdlbi4KICAgYm9vbCBFcnJvciA9IGZhbHNlOwogICBmb3IgKHN0ZDo6dmVjdG9yPEdsb2JhbERlY2w+OjppdGVyYXRvciBJID0gQWxpYXNlcy5iZWdpbigpLAogICAgICAgICAgRSA9IEFsaWFzZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CkBAIC0yMTEsMTIgKzIyMiwzNyBAQAogICAgIGxsdm06Okdsb2JhbFZhbHVlICpFbnRyeSA9IEdldEdsb2JhbFZhbHVlKE1hbmdsZWROYW1lKTsKICAgICBsbHZtOjpHbG9iYWxBbGlhcyAqQWxpYXMgPSBjYXN0PGxsdm06Okdsb2JhbEFsaWFzPihFbnRyeSk7CiAgICAgbGx2bTo6R2xvYmFsVmFsdWUgKkdWID0gQWxpYXMtPmdldEFsaWFzZWRHbG9iYWwoKTsKLSAgICBpZiAoR1YtPmlzRGVjbGFyYXRpb24oKSkgewotICAgICAgRXJyb3IgPSB0cnVlOwotICAgICAgZ2V0RGlhZ3MoKS5SZXBvcnQoQUEtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9hbGlhc190b191bmRlZmluZWQpOwotICAgIH0gZWxzZSBpZiAoIUFsaWFzLT5yZXNvbHZlQWxpYXNlZEdsb2JhbCgvKnN0b3BPbldlYWsqLyBmYWxzZSkpIHsKKyAgICBpZiAoIUdWKSB7CiAgICAgICBFcnJvciA9IHRydWU7CiAgICAgICBnZXREaWFncygpLlJlcG9ydChBQS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2N5Y2xpY19hbGlhcyk7CisgICAgfSBlbHNlIGlmIChHVi0+aXNEZWNsYXJhdGlvbigpKSB7CisgICAgICBFcnJvciA9IHRydWU7CisgICAgICBnZXREaWFncygpLlJlcG9ydChBQS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2FsaWFzX3RvX3VuZGVmaW5lZCk7CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSB0byBoYW5kbGUgYWxpYXMgdG8gd2VhayBhbGlhc2VzIGluIGhlcmUuIExMVk0gaXRzZWxmIGRpc2FsbG93cworICAgIC8vIHRoaXMgc2luY2UgdGhlIG9iamVjdCBzZW1hbnRpY3Mgd291bGQgbm90IG1hdGNoIHRoZSBJTCBvbmUuIEZvcgorICAgIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBnY2Mgd2UgaW1wbGVtZW50IGl0IGJ5IGp1c3QgcG9pbnRpbmcgdGhlIGFsaWFzCisgICAgLy8gdG8gaXRzIGFsaWFzZWUncyBhbGlhc2VlLiBXZSBhbHNvIHdhcm4sIHNpbmNlIHRoZSB1c2VyIGlzIHByb2JhYmx5CisgICAgLy8gZXhwZWN0aW5nIHRoZSBsaW5rIHRvIGJlIHdlYWsuCisgICAgbGx2bTo6Q29uc3RhbnQgKkFsaWFzZWUgPSBBbGlhcy0+Z2V0QWxpYXNlZSgpOworICAgIGxsdm06Okdsb2JhbFZhbHVlICpBbGlhc2VlR1Y7CisgICAgaWYgKGF1dG8gQ0UgPSBkeW5fY2FzdDxsbHZtOjpDb25zdGFudEV4cHI+KEFsaWFzZWUpKSB7CisgICAgICBhc3NlcnQoKENFLT5nZXRPcGNvZGUoKSA9PSBsbHZtOjpJbnN0cnVjdGlvbjo6Qml0Q2FzdCB8fAorICAgICAgICAgICAgICBDRS0+Z2V0T3Bjb2RlKCkgPT0gbGx2bTo6SW5zdHJ1Y3Rpb246OkFkZHJTcGFjZUNhc3QpICYmCisgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGFsaWFzZWUiKTsKKyAgICAgIEFsaWFzZWVHViA9IGNhc3Q8bGx2bTo6R2xvYmFsVmFsdWU+KENFLT5nZXRPcGVyYW5kKDApKTsKKyAgICB9IGVsc2UgeworICAgICAgQWxpYXNlZUdWID0gY2FzdDxsbHZtOjpHbG9iYWxWYWx1ZT4oQWxpYXNlZSk7CisgICAgfQorICAgIGlmIChhdXRvIEdBID0gZHluX2Nhc3Q8bGx2bTo6R2xvYmFsQWxpYXM+KEFsaWFzZWVHVikpIHsKKyAgICAgIGlmIChHQS0+bWF5QmVPdmVycmlkZGVuKCkpIHsKKyAgICAgICAgZ2V0RGlhZ3MoKS5SZXBvcnQoQUEtPmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5fYWxpYXNfdG9fd2Vha19hbGlhcykKKyAgICAgICAgICA8PCBHQS0+Z2V0QWxpYXNlZEdsb2JhbCgpLT5nZXROYW1lKCkgPDwgR0EtPmdldE5hbWUoKTsKKyAgICAgICAgQWxpYXNlZSA9IGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0UG9pbnRlckJpdENhc3RPckFkZHJTcGFjZUNhc3QoCisgICAgICAgICAgICBHQS0+Z2V0QWxpYXNlZSgpLCBBbGlhcy0+Z2V0VHlwZSgpKTsKKyAgICAgICAgQWxpYXMtPnNldEFsaWFzZWUoQWxpYXNlZSk7CisgICAgICB9CiAgICAgfQogICB9CiAgIGlmICghRXJyb3IpCkBAIC0yMzMsNiArMjY5LDEwIEBACiAgIH0KIH0KIAordm9pZCBDb2RlR2VuTW9kdWxlOjpjbGVhcigpIHsKKyAgRGVmZXJyZWREZWNsc1RvRW1pdC5jbGVhcigpOworfQorCiB2b2lkIENvZGVHZW5Nb2R1bGU6OlJlbGVhc2UoKSB7CiAgIEVtaXREZWZlcnJlZCgpOwogICBhcHBseVJlcGxhY2VtZW50cygpOwpAQCAtMjQ3LDcgKzI4Nyw3IEBACiAgIEVtaXRDdG9yTGlzdChHbG9iYWxEdG9ycywgImxsdm0uZ2xvYmFsX2R0b3JzIik7CiAgIEVtaXRHbG9iYWxBbm5vdGF0aW9ucygpOwogICBFbWl0U3RhdGljRXh0ZXJuQ0FsaWFzZXMoKTsKLSAgRW1pdExMVk1Vc2VkKCk7CisgIGVtaXRMTFZNVXNlZCgpOwogCiAgIGlmIChDb2RlR2VuT3B0cy5BdXRvbGluayAmJgogICAgICAgKENvbnRleHQuZ2V0TGFuZ09wdHMoKS5Nb2R1bGVzIHx8ICFMaW5rZXJPcHRpb25zTWV0YWRhdGEuZW1wdHkoKSkpIHsKQEAgLTMzMiw5ICszNzIsOSBAQAogICAgIEluc3QtPnNldE1ldGFkYXRhKGxsdm06OkxMVk1Db250ZXh0OjpNRF90YmFhLCBUQkFBSW5mbyk7CiB9CiAKLXZvaWQgQ29kZUdlbk1vZHVsZTo6RXJyb3IoU291cmNlTG9jYXRpb24gbG9jLCBTdHJpbmdSZWYgZXJyb3IpIHsKLSAgdW5zaWduZWQgZGlhZ0lEID0gZ2V0RGlhZ3MoKS5nZXRDdXN0b21EaWFnSUQoRGlhZ25vc3RpY3NFbmdpbmU6OkVycm9yLCBlcnJvcik7Ci0gIGdldERpYWdzKCkuUmVwb3J0KENvbnRleHQuZ2V0RnVsbExvYyhsb2MpLCBkaWFnSUQpOwordm9pZCBDb2RlR2VuTW9kdWxlOjpFcnJvcihTb3VyY2VMb2NhdGlvbiBsb2MsIFN0cmluZ1JlZiBtZXNzYWdlKSB7CisgIHVuc2lnbmVkIGRpYWdJRCA9IGdldERpYWdzKCkuZ2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNzRW5naW5lOjpFcnJvciwgIiUwIik7CisgIGdldERpYWdzKCkuUmVwb3J0KENvbnRleHQuZ2V0RnVsbExvYyhsb2MpLCBkaWFnSUQpIDw8IG1lc3NhZ2U7CiB9CiAKIC8vLyBFcnJvclVuc3VwcG9ydGVkIC0gUHJpbnQgb3V0IGFuIGVycm9yIHRoYXQgY29kZWdlbiBkb2Vzbid0IHN1cHBvcnQgdGhlCkBAIC00MDUsODEgKzQ0NSwxMyBAQAogICBUTE0gPSBHZXRMTFZNVExTTW9kZWwoQ29kZUdlbk9wdHMuZ2V0RGVmYXVsdFRMU01vZGVsKCkpOwogCiAgIC8vIE92ZXJyaWRlIHRoZSBUTFMgbW9kZWwgaWYgaXQgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCi0gIGlmIChELmhhc0F0dHI8VExTTW9kZWxBdHRyPigpKSB7Ci0gICAgY29uc3QgVExTTW9kZWxBdHRyICpBdHRyID0gRC5nZXRBdHRyPFRMU01vZGVsQXR0cj4oKTsKKyAgaWYgKGNvbnN0IFRMU01vZGVsQXR0ciAqQXR0ciA9IEQuZ2V0QXR0cjxUTFNNb2RlbEF0dHI+KCkpIHsKICAgICBUTE0gPSBHZXRMTFZNVExTTW9kZWwoQXR0ci0+Z2V0TW9kZWwoKSk7CiAgIH0KIAogICBHVi0+c2V0VGhyZWFkTG9jYWxNb2RlKFRMTSk7CiB9CiAKLS8vLyBTZXQgdGhlIHN5bWJvbCB2aXNpYmlsaXR5IG9mIHR5cGUgaW5mb3JtYXRpb24gKHZ0YWJsZSBhbmQgUlRUSSkKLS8vLyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHR5cGUuCi12b2lkIENvZGVHZW5Nb2R1bGU6OnNldFR5cGVWaXNpYmlsaXR5KGxsdm06Okdsb2JhbFZhbHVlICpHViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVWaXNpYmlsaXR5S2luZCBUVkspIGNvbnN0IHsKLSAgc2V0R2xvYmFsVmlzaWJpbGl0eShHViwgUkQpOwotCi0gIGlmICghQ29kZUdlbk9wdHMuSGlkZGVuV2Vha1ZUYWJsZXMpCi0gICAgcmV0dXJuOwotCi0gIC8vIFdlIG5ldmVyIHdhbnQgdG8gZHJvcCB0aGUgdmlzaWJpbGl0eSBmb3IgUlRUSSBuYW1lcy4KLSAgaWYgKFRWSyA9PSBUVktfRm9yUlRUSU5hbWUpCi0gICAgcmV0dXJuOwotCi0gIC8vIFdlIHdhbnQgdG8gZHJvcCB0aGUgdmlzaWJpbGl0eSB0byBoaWRkZW4gZm9yIHdlYWsgdHlwZSBzeW1ib2xzLgotICAvLyBUaGlzIGlzbid0IHBvc3NpYmxlIGlmIHRoZXJlIG1pZ2h0IGJlIHVucmVzb2x2ZWQgcmVmZXJlbmNlcwotICAvLyBlbHNld2hlcmUgdGhhdCByZWx5IG9uIHRoaXMgc3ltYm9sIGJlaW5nIHZpc2libGUuCi0KLSAgLy8gVGhpcyBzaG91bGQgYmUga2VwdCByb3VnaGx5IGluIHN5bmMgd2l0aCBzZXRUaHVua1Zpc2liaWxpdHkKLSAgLy8gaW4gQ0dWVGFibGVzLmNwcC4KLQotICAvLyBQcmVjb25kaXRpb25zLgotICBpZiAoR1YtPmdldExpbmthZ2UoKSAhPSBsbHZtOjpHbG9iYWxWYXJpYWJsZTo6TGlua09uY2VPRFJMaW5rYWdlIHx8Ci0gICAgICBHVi0+Z2V0VmlzaWJpbGl0eSgpICE9IGxsdm06Okdsb2JhbFZhcmlhYmxlOjpEZWZhdWx0VmlzaWJpbGl0eSkKLSAgICByZXR1cm47Ci0KLSAgLy8gRG9uJ3Qgb3ZlcnJpZGUgYW4gZXhwbGljaXQgdmlzaWJpbGl0eSBhdHRyaWJ1dGUuCi0gIGlmIChSRC0+Z2V0RXhwbGljaXRWaXNpYmlsaXR5KE5hbWVkRGVjbDo6VmlzaWJpbGl0eUZvclR5cGUpKQotICAgIHJldHVybjsKLQotICBzd2l0Y2ggKFJELT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpKSB7Ci0gIC8vIFdlIGhhdmUgdG8gZGlzYWJsZSB0aGUgb3B0aW1pemF0aW9uIGlmIHRoaXMgaXMgYW4gRUkgZGVmaW5pdGlvbgotICAvLyBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIEVJIGRlY2xhcmF0aW9ucyBpbiBvdGhlciBzaGFyZWQgb2JqZWN0cy4KLSAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVmaW5pdGlvbjoKLSAgY2FzZSBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVjbGFyYXRpb246Ci0gICAgcmV0dXJuOwotCi0gIC8vIEV2ZXJ5IHVzZSBvZiBhIG5vbi10ZW1wbGF0ZSBjbGFzcydzIHR5cGUgaW5mb3JtYXRpb24gaGFzIHRvIGVtaXQgaXQuCi0gIGNhc2UgVFNLX1VuZGVjbGFyZWQ6Ci0gICAgYnJlYWs7Ci0KLSAgLy8gSW4gdGhlb3J5LCBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBjYW4gaWdub3JlIHRoZSBwb3NzaWJpbGl0eSBvZgotICAvLyBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9uIGJlY2F1c2UgdGhlcmUgbmVjZXNzYXJpbHkKLSAgLy8gbXVzdCBiZSBhbiBFSSBkZWZpbml0aW9uIHNvbWV3aGVyZSB3aXRoIGRlZmF1bHQgdmlzaWJpbGl0eS4gIEluCi0gIC8vIHByYWN0aWNlLCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYW4gZXhwbGljaXQgaW5zdGFudGlhdGlvbiBmb3IKLSAgLy8gYW4gYXJiaXRyYXJ5IHRlbXBsYXRlIGNsYXNzLCBhbmQgbGlua2VycyBhcmVuJ3QgbmVjZXNzYXJpbHkgYWJsZQotICAvLyB0byBkZWFsIHdpdGggbWl4ZWQtdmlzaWJpbGl0eSBzeW1ib2xzLgotICBjYXNlIFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uOgotICBjYXNlIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb246Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gSWYgdGhlcmUncyBhIGtleSBmdW5jdGlvbiwgdGhlcmUgbWF5IGJlIHRyYW5zbGF0aW9uIHVuaXRzCi0gIC8vIHRoYXQgZG9uJ3QgaGF2ZSB0aGUga2V5IGZ1bmN0aW9uJ3MgZGVmaW5pdGlvbi4gIEJ1dCBpZ25vcmUKLSAgLy8gdGhpcyBpZiB3ZSdyZSBlbWl0dGluZyBSVFRJIHVuZGVyIC1mbm8tcnR0aS4KLSAgaWYgKCEoVFZLICE9IFRWS19Gb3JSVFRJKSB8fCBMYW5nT3B0cy5SVFRJKSB7Ci0gICAgLy8gRklYTUU6IHdoYXQgc2hvdWxkIHdlIGRvIGlmIHdlICJsb3NlIiB0aGUga2V5IGZ1bmN0aW9uIGR1cmluZwotICAgIC8vIHRoZSBlbWlzc2lvbiBvZiB0aGUgZmlsZT8KLSAgICBpZiAoQ29udGV4dC5nZXRDdXJyZW50S2V5RnVuY3Rpb24oUkQpKQotICAgICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gT3RoZXJ3aXNlLCBkcm9wIHRoZSB2aXNpYmlsaXR5IHRvIGhpZGRlbi4KLSAgR1YtPnNldFZpc2liaWxpdHkobGx2bTo6R2xvYmFsVmFsdWU6OkhpZGRlblZpc2liaWxpdHkpOwotICBHVi0+c2V0VW5uYW1lZEFkZHIodHJ1ZSk7Ci19Ci0KIFN0cmluZ1JlZiBDb2RlR2VuTW9kdWxlOjpnZXRNYW5nbGVkTmFtZShHbG9iYWxEZWNsIEdEKSB7CiAgIGNvbnN0IE5hbWVkRGVjbCAqTkQgPSBjYXN0PE5hbWVkRGVjbD4oR0QuZ2V0RGVjbCgpKTsKIApAQCAtNTgxLDE4ICs1NTMsMTMgQEAKIENvZGVHZW5Nb2R1bGU6OmdldEZ1bmN0aW9uTGlua2FnZShHbG9iYWxEZWNsIEdEKSB7CiAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCA9IGNhc3Q8RnVuY3Rpb25EZWNsPihHRC5nZXREZWNsKCkpOwogCi0gIGlmIChpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KEQpICYmCi0gICAgICBnZXRDWFhBQkkoKS51c2VUaHVua0ZvckR0b3JWYXJpYW50KGNhc3Q8Q1hYRGVzdHJ1Y3RvckRlY2w+KEQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRC5nZXREdG9yVHlwZSgpKSkKLSAgICByZXR1cm4gbGx2bTo6RnVuY3Rpb246OkxpbmtPbmNlT0RSTGlua2FnZTsKLQogICBHVkFMaW5rYWdlIExpbmthZ2UgPSBnZXRDb250ZXh0KCkuR2V0R1ZBTGlua2FnZUZvckZ1bmN0aW9uKEQpOwogCiAgIGlmIChMaW5rYWdlID09IEdWQV9JbnRlcm5hbCkKICAgICByZXR1cm4gbGx2bTo6RnVuY3Rpb246OkludGVybmFsTGlua2FnZTsKICAgCiAgIGlmIChELT5oYXNBdHRyPERMTEV4cG9ydEF0dHI+KCkpCi0gICAgcmV0dXJuIGxsdm06OkZ1bmN0aW9uOjpETExFeHBvcnRMaW5rYWdlOworICAgIHJldHVybiBsbHZtOjpGdW5jdGlvbjo6RXh0ZXJuYWxMaW5rYWdlOwogICAKICAgaWYgKEQtPmhhc0F0dHI8V2Vha0F0dHI+KCkpCiAgICAgcmV0dXJuIGxsdm06OkZ1bmN0aW9uOjpXZWFrQW55TGlua2FnZTsKQEAgLTYyMiwxMSArNTg5LDE4IEBACiAgIC8vIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGNhbiBvY2N1ciBpbiBtdWx0aXBsZSB0cmFuc2xhdGlvbiB1bml0cwogICAvLyBhbmQgbXVzdCBhbGwgYmUgZXF1aXZhbGVudC4gSG93ZXZlciwgd2UgYXJlIG5vdCBhbGxvd2VkIHRvCiAgIC8vIHRocm93IGF3YXkgdGhlc2UgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMuCi0gIGlmIChMaW5rYWdlID09IEdWQV9FeHBsaWNpdFRlbXBsYXRlSW5zdGFudGlhdGlvbikKKyAgaWYgKExpbmthZ2UgPT0gR1ZBX1N0cm9uZ09EUikKICAgICByZXR1cm4gIUNvbnRleHQuZ2V0TGFuZ09wdHMoKS5BcHBsZUtleHQKICAgICAgICAgICAgICA/IGxsdm06OkZ1bmN0aW9uOjpXZWFrT0RSTGlua2FnZQogICAgICAgICAgICAgIDogbGx2bTo6RnVuY3Rpb246OkV4dGVybmFsTGlua2FnZTsKLSAgCisKKyAgLy8gRGVzdHJ1Y3RvciB2YXJpYW50cyBpbiB0aGUgTWljcm9zb2Z0IEMrKyBBQkkgYXJlIGFsd2F5cyBsaW5rb25jZV9vZHIgdGh1bmtzCisgIC8vIGVtaXR0ZWQgb24gYW4gYXMtbmVlZGVkIGJhc2lzLgorICBpZiAoaXNhPENYWERlc3RydWN0b3JEZWNsPihEKSAmJgorICAgICAgZ2V0Q1hYQUJJKCkudXNlVGh1bmtGb3JEdG9yVmFyaWFudChjYXN0PENYWERlc3RydWN0b3JEZWNsPihEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0QuZ2V0RHRvclR5cGUoKSkpCisgICAgcmV0dXJuIGxsdm06OkZ1bmN0aW9uOjpMaW5rT25jZU9EUkxpbmthZ2U7CisKICAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIHN0cm9uZyBleHRlcm5hbCBsaW5rYWdlLgogICBhc3NlcnQoTGlua2FnZSA9PSBHVkFfU3Ryb25nRXh0ZXJuYWwpOwogICByZXR1cm4gbGx2bTo6RnVuY3Rpb246OkV4dGVybmFsTGlua2FnZTsKQEAgLTY4NiwxMCArNjYwLDE1IEBACiAgICAgLy8gTmFrZWQgaW1wbGllcyBub2lubGluZTogd2Ugc2hvdWxkIG5vdCBiZSBpbmxpbmluZyBzdWNoIGZ1bmN0aW9ucy4KICAgICBCLmFkZEF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6Ok5ha2VkKTsKICAgICBCLmFkZEF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6Ok5vSW5saW5lKTsKKyAgfSBlbHNlIGlmIChELT5oYXNBdHRyPE9wdGltaXplTm9uZUF0dHI+KCkpIHsKKyAgICAvLyBPcHRpbWl6ZU5vbmUgaW1wbGllcyBub2lubGluZTsgd2Ugc2hvdWxkIG5vdCBiZSBpbmxpbmluZyBzdWNoIGZ1bmN0aW9ucy4KKyAgICBCLmFkZEF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6Ok9wdGltaXplTm9uZSk7CisgICAgQi5hZGRBdHRyaWJ1dGUobGx2bTo6QXR0cmlidXRlOjpOb0lubGluZSk7CisgIH0gZWxzZSBpZiAoRC0+aGFzQXR0cjxOb0R1cGxpY2F0ZUF0dHI+KCkpIHsKKyAgICBCLmFkZEF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6Ok5vRHVwbGljYXRlKTsKICAgfSBlbHNlIGlmIChELT5oYXNBdHRyPE5vSW5saW5lQXR0cj4oKSkgewogICAgIEIuYWRkQXR0cmlidXRlKGxsdm06OkF0dHJpYnV0ZTo6Tm9JbmxpbmUpOwotICB9IGVsc2UgaWYgKChELT5oYXNBdHRyPEFsd2F5c0lubGluZUF0dHI+KCkgfHwKLSAgICAgICAgICAgICAgRC0+aGFzQXR0cjxGb3JjZUlubGluZUF0dHI+KCkpICYmCisgIH0gZWxzZSBpZiAoRC0+aGFzQXR0cjxBbHdheXNJbmxpbmVBdHRyPigpICYmCiAgICAgICAgICAgICAgIUYtPmdldEF0dHJpYnV0ZXMoKS5oYXNBdHRyaWJ1dGUobGx2bTo6QXR0cmlidXRlU2V0OjpGdW5jdGlvbkluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkF0dHJpYnV0ZTo6Tm9JbmxpbmUpKSB7CiAgICAgLy8gKG5vaW5saW5lIHdpbnMgb3ZlciBhbHdheXNfaW5saW5lLCBhbmQgd2UgY2FuJ3Qgc3BlY2lmeSBib3RoIGluIElSKQpAQCAtNzA0LDggKzY4MywxNiBAQAogICBpZiAoRC0+aGFzQXR0cjxNaW5TaXplQXR0cj4oKSkKICAgICBCLmFkZEF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6Ok1pblNpemUpOwogCisgIGlmIChELT5oYXNBdHRyPE9wdGltaXplTm9uZUF0dHI+KCkpIHsKKyAgICAvLyBPcHRpbWl6ZU5vbmUgd2lucyBvdmVyIE9wdGltaXplRm9yU2l6ZSBhbmQgTWluU2l6ZS4KKyAgICBCLnJlbW92ZUF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6Ok9wdGltaXplRm9yU2l6ZSk7CisgICAgQi5yZW1vdmVBdHRyaWJ1dGUobGx2bTo6QXR0cmlidXRlOjpNaW5TaXplKTsKKyAgfQorCiAgIGlmIChMYW5nT3B0cy5nZXRTdGFja1Byb3RlY3RvcigpID09IExhbmdPcHRpb25zOjpTU1BPbikKICAgICBCLmFkZEF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6OlN0YWNrUHJvdGVjdCk7CisgIGVsc2UgaWYgKExhbmdPcHRzLmdldFN0YWNrUHJvdGVjdG9yKCkgPT0gTGFuZ09wdGlvbnM6OlNTUFN0cm9uZykKKyAgICBCLmFkZEF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6OlN0YWNrUHJvdGVjdFN0cm9uZyk7CiAgIGVsc2UgaWYgKExhbmdPcHRzLmdldFN0YWNrUHJvdGVjdG9yKCkgPT0gTGFuZ09wdGlvbnM6OlNTUFJlcSkKICAgICBCLmFkZEF0dHJpYnV0ZShsbHZtOjpBdHRyaWJ1dGU6OlN0YWNrUHJvdGVjdFJlcSk7CiAKQEAgLTc1MSw3ICs3MzgsNyBAQAogICAgIEdWLT5zZXRWaXNpYmlsaXR5KGxsdm06Okdsb2JhbFZhbHVlOjpEZWZhdWx0VmlzaWJpbGl0eSk7CiAKICAgaWYgKEQtPmhhc0F0dHI8VXNlZEF0dHI+KCkpCi0gICAgQWRkVXNlZEdsb2JhbChHVik7CisgICAgYWRkVXNlZEdsb2JhbChHVik7CiAKICAgaWYgKGNvbnN0IFNlY3Rpb25BdHRyICpTQSA9IEQtPmdldEF0dHI8U2VjdGlvbkF0dHI+KCkpCiAgICAgR1YtPnNldFNlY3Rpb24oU0EtPmdldE5hbWUoKSk7CkBAIC03ODgsNyArNzc1LDEyIEBACiAgIGlmICghSXNJbmNvbXBsZXRlRnVuY3Rpb24pCiAgICAgU2V0TExWTUZ1bmN0aW9uQXR0cmlidXRlcyhGRCwgZ2V0VHlwZXMoKS5hcnJhbmdlR2xvYmFsRGVjbGFyYXRpb24oR0QpLCBGKTsKIAotICBpZiAoZ2V0Q1hYQUJJKCkuSGFzVGhpc1JldHVybihHRCkpIHsKKyAgLy8gQWRkIHRoZSBSZXR1cm5lZCBhdHRyaWJ1dGUgZm9yICJ0aGlzIiwgZXhjZXB0IGZvciBpT1MgNSBhbmQgZWFybGllcgorICAvLyB3aGVyZSBzdWJzdGFudGlhbCBjb2RlLCBpbmNsdWRpbmcgdGhlIGxpYnN0ZGMrKyBkeWxpYiwgd2FzIGNvbXBpbGVkIHdpdGgKKyAgLy8gR0NDIGFuZCBkb2VzIG5vdCBhY3R1YWxseSByZXR1cm4gInRoaXMiLgorICBpZiAoZ2V0Q1hYQUJJKCkuSGFzVGhpc1JldHVybihHRCkgJiYKKyAgICAgICEoZ2V0VGFyZ2V0KCkuZ2V0VHJpcGxlKCkuaXNpT1MoKSAmJgorICAgICAgICBnZXRUYXJnZXQoKS5nZXRUcmlwbGUoKS5pc09TVmVyc2lvbkxUKDYpKSkgewogICAgIGFzc2VydCghRi0+YXJnX2VtcHR5KCkgJiYKICAgICAgICAgICAgRi0+YXJnX2JlZ2luKCktPmdldFR5cGUoKQogICAgICAgICAgICAgIC0+Y2FuTG9zc2xlc3NseUJpdENhc3RUbyhGLT5nZXRSZXR1cm5UeXBlKCkpICYmCkBAIC04MDAsNyArNzkyLDggQEAKICAgLy8gb3ZlcnJpZGRlbiBieSBhIGRlZmluaXRpb24uCiAKICAgaWYgKEZELT5oYXNBdHRyPERMTEltcG9ydEF0dHI+KCkpIHsKLSAgICBGLT5zZXRMaW5rYWdlKGxsdm06OkZ1bmN0aW9uOjpETExJbXBvcnRMaW5rYWdlKTsKKyAgICBGLT5zZXRMaW5rYWdlKGxsdm06OkZ1bmN0aW9uOjpFeHRlcm5hbExpbmthZ2UpOworICAgIEYtPnNldERMTFN0b3JhZ2VDbGFzcyhsbHZtOjpHbG9iYWxWYWx1ZTo6RExMSW1wb3J0U3RvcmFnZUNsYXNzKTsKICAgfSBlbHNlIGlmIChGRC0+aGFzQXR0cjxXZWFrQXR0cj4oKSB8fAogICAgICAgICAgICAgIEZELT5pc1dlYWtJbXBvcnRlZCgpKSB7CiAgICAgLy8gImV4dGVybl93ZWFrIiBpcyBvdmVybG9hZGVkIGluIExMVk07IHdlIHByb2JhYmx5IHNob3VsZCBoYXZlCkBAIC04MDgsNiArODAxLDggQEAKICAgICBGLT5zZXRMaW5rYWdlKGxsdm06OkZ1bmN0aW9uOjpFeHRlcm5hbFdlYWtMaW5rYWdlKTsKICAgfSBlbHNlIHsKICAgICBGLT5zZXRMaW5rYWdlKGxsdm06OkZ1bmN0aW9uOjpFeHRlcm5hbExpbmthZ2UpOworICAgIGlmIChGRC0+aGFzQXR0cjxETExFeHBvcnRBdHRyPigpKQorICAgICAgRi0+c2V0RExMU3RvcmFnZUNsYXNzKGxsdm06Okdsb2JhbFZhbHVlOjpETExFeHBvcnRTdG9yYWdlQ2xhc3MpOwogCiAgICAgTGlua2FnZUluZm8gTFYgPSBGRC0+Z2V0TGlua2FnZUFuZFZpc2liaWxpdHkoKTsKICAgICBpZiAoTFYuZ2V0TGlua2FnZSgpID09IEV4dGVybmFsTGlua2FnZSAmJiBMVi5pc1Zpc2liaWxpdHlFeHBsaWNpdCgpKSB7CkBAIC04MjUsMzkgKzgyMCw1MSBAQAogICAgICAgICAgICAgICAgICAgICBsbHZtOjpBdHRyaWJ1dGU6Ok5vQnVpbHRpbik7CiB9CiAKLXZvaWQgQ29kZUdlbk1vZHVsZTo6QWRkVXNlZEdsb2JhbChsbHZtOjpHbG9iYWxWYWx1ZSAqR1YpIHsKK3ZvaWQgQ29kZUdlbk1vZHVsZTo6YWRkVXNlZEdsb2JhbChsbHZtOjpHbG9iYWxWYWx1ZSAqR1YpIHsKICAgYXNzZXJ0KCFHVi0+aXNEZWNsYXJhdGlvbigpICYmCiAgICAgICAgICAiT25seSBnbG9iYWxzIHdpdGggZGVmaW5pdGlvbiBjYW4gZm9yY2UgdXNhZ2UuIik7CiAgIExMVk1Vc2VkLnB1c2hfYmFjayhHVik7CiB9CiAKLXZvaWQgQ29kZUdlbk1vZHVsZTo6RW1pdExMVk1Vc2VkKCkgewordm9pZCBDb2RlR2VuTW9kdWxlOjphZGRDb21waWxlclVzZWRHbG9iYWwobGx2bTo6R2xvYmFsVmFsdWUgKkdWKSB7CisgIGFzc2VydCghR1YtPmlzRGVjbGFyYXRpb24oKSAmJgorICAgICAgICAgIk9ubHkgZ2xvYmFscyB3aXRoIGRlZmluaXRpb24gY2FuIGZvcmNlIHVzYWdlLiIpOworICBMTFZNQ29tcGlsZXJVc2VkLnB1c2hfYmFjayhHVik7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRVc2VkKENvZGVHZW5Nb2R1bGUgJkNHTSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxsbHZtOjpXZWFrVkg+ICZMaXN0KSB7CiAgIC8vIERvbid0IGNyZWF0ZSBsbHZtLnVzZWQgaWYgdGhlcmUgaXMgbm8gbmVlZC4KLSAgaWYgKExMVk1Vc2VkLmVtcHR5KCkpCisgIGlmIChMaXN0LmVtcHR5KCkpCiAgICAgcmV0dXJuOwogCi0gIC8vIENvbnZlcnQgTExWTVVzZWQgdG8gd2hhdCBDb25zdGFudEFycmF5IG5lZWRzLgorICAvLyBDb252ZXJ0IExpc3QgdG8gd2hhdCBDb25zdGFudEFycmF5IG5lZWRzLgogICBTbWFsbFZlY3RvcjxsbHZtOjpDb25zdGFudCosIDg+IFVzZWRBcnJheTsKLSAgVXNlZEFycmF5LnJlc2l6ZShMTFZNVXNlZC5zaXplKCkpOwotICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTExWTVVzZWQuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICBVc2VkQXJyYXkucmVzaXplKExpc3Quc2l6ZSgpKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IExpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkgewogICAgIFVzZWRBcnJheVtpXSA9Ci0gICAgIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChjYXN0PGxsdm06OkNvbnN0YW50PigmKkxMVk1Vc2VkW2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludDhQdHJUeSk7CisgICAgIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChjYXN0PGxsdm06OkNvbnN0YW50PigmKkxpc3RbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dNLkludDhQdHJUeSk7CiAgIH0KIAogICBpZiAoVXNlZEFycmF5LmVtcHR5KCkpCiAgICAgcmV0dXJuOwotICBsbHZtOjpBcnJheVR5cGUgKkFUeSA9IGxsdm06OkFycmF5VHlwZTo6Z2V0KEludDhQdHJUeSwgVXNlZEFycmF5LnNpemUoKSk7CisgIGxsdm06OkFycmF5VHlwZSAqQVR5ID0gbGx2bTo6QXJyYXlUeXBlOjpnZXQoQ0dNLkludDhQdHJUeSwgVXNlZEFycmF5LnNpemUoKSk7CiAKICAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWID0KLSAgICBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoZ2V0TW9kdWxlKCksIEFUeSwgZmFsc2UsCisgICAgbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKENHTS5nZXRNb2R1bGUoKSwgQVR5LCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkFwcGVuZGluZ0xpbmthZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50QXJyYXk6OmdldChBVHksIFVzZWRBcnJheSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsbHZtLnVzZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSk7CiAKICAgR1YtPnNldFNlY3Rpb24oImxsdm0ubWV0YWRhdGEiKTsKIH0KIAordm9pZCBDb2RlR2VuTW9kdWxlOjplbWl0TExWTVVzZWQoKSB7CisgIGVtaXRVc2VkKCp0aGlzLCAibGx2bS51c2VkIiwgTExWTVVzZWQpOworICBlbWl0VXNlZCgqdGhpcywgImxsdm0uY29tcGlsZXIudXNlZCIsIExMVk1Db21waWxlclVzZWQpOworfQorCiB2b2lkIENvZGVHZW5Nb2R1bGU6OkFwcGVuZExpbmtlck9wdGlvbnMoU3RyaW5nUmVmIE9wdHMpIHsKICAgbGx2bTo6VmFsdWUgKk1ET3B0cyA9IGxsdm06Ok1EU3RyaW5nOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgT3B0cyk7CiAgIExpbmtlck9wdGlvbnNNZXRhZGF0YS5wdXNoX2JhY2sobGx2bTo6TUROb2RlOjpnZXQoZ2V0TExWTUNvbnRleHQoKSwgTURPcHRzKSk7CkBAIC0xMDAyLDMxICsxMDA5LDIzIEBACiAgICAgLy8gU3RvcCBpZiB3ZSdyZSBvdXQgb2YgYm90aCBkZWZlcnJlZCB2LXRhYmxlcyBhbmQgZGVmZXJyZWQgZGVjbGFyYXRpb25zLgogICAgIGlmIChEZWZlcnJlZERlY2xzVG9FbWl0LmVtcHR5KCkpIGJyZWFrOwogCi0gICAgR2xvYmFsRGVjbCBEID0gRGVmZXJyZWREZWNsc1RvRW1pdC5iYWNrKCk7CisgICAgRGVmZXJyZWRHbG9iYWwgJkcgPSBEZWZlcnJlZERlY2xzVG9FbWl0LmJhY2soKTsKKyAgICBHbG9iYWxEZWNsIEQgPSBHLkdEOworICAgIGxsdm06Okdsb2JhbFZhbHVlICpHViA9IEcuR1Y7CiAgICAgRGVmZXJyZWREZWNsc1RvRW1pdC5wb3BfYmFjaygpOwogCisgICAgYXNzZXJ0KEdWID09IEdldEdsb2JhbFZhbHVlKGdldE1hbmdsZWROYW1lKEQpKSk7CiAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlJ3ZlIGFscmVhZHkgZW1pdHRlZCB0aGlzLiAgVGhpcyBpcyBuZWNlc3NhcnkKICAgICAvLyBmb3IgYSBjb3VwbGUgb2YgcmVhc29uczogZmlyc3QsIGRlY2xzIGNhbiBlbmQgdXAgaW4gdGhlCiAgICAgLy8gZGVmZXJyZWQtZGVjbHMgcXVldWUgbXVsdGlwbGUgdGltZXMsIGFuZCBzZWNvbmQsIGRlY2xzIGNhbiBlbmQKICAgICAvLyB1cCB3aXRoIGRlZmluaXRpb25zIGluIHVudXN1YWwgd2F5cyAoZS5nLiBieSBhbiBleHRlcm4gaW5saW5lCiAgICAgLy8gZnVuY3Rpb24gYWNxdWlyaW5nIGEgc3Ryb25nIGZ1bmN0aW9uIHJlZGVmaW5pdGlvbikuICBKdXN0CiAgICAgLy8gaWdub3JlIHRoZXNlIGNhc2VzLgotICAgIC8vCi0gICAgLy8gVE9ETzogVGhhdCBzYWlkLCBsb29raW5nIHRoaXMgdXAgbXVsdGlwbGUgdGltZXMgaXMgdmVyeSB3YXN0ZWZ1bC4KLSAgICBTdHJpbmdSZWYgTmFtZSA9IGdldE1hbmdsZWROYW1lKEQpOwotICAgIGxsdm06Okdsb2JhbFZhbHVlICpDR1JlZiA9IEdldEdsb2JhbFZhbHVlKE5hbWUpOwotICAgIGFzc2VydChDR1JlZiAmJiAiRGVmZXJyZWQgZGVjbCB3YXNuJ3QgcmVmZXJlbmNlZD8iKTsKLQotICAgIGlmICghQ0dSZWYtPmlzRGVjbGFyYXRpb24oKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLy8gR2xvYmFsQWxpYXM6OmlzRGVjbGFyYXRpb24oKSBkZWZlcnMgdG8gdGhlIGFsaWFzZWUsIGJ1dCBmb3Igb3VyCi0gICAgLy8gcHVycG9zZXMgYW4gYWxpYXMgY291bnRzIGFzIGEgZGVmaW5pdGlvbi4KLSAgICBpZiAoaXNhPGxsdm06Okdsb2JhbEFsaWFzPihDR1JlZikpCisgICAgaWYoIUdWLT5pc0RlY2xhcmF0aW9uKCkpCiAgICAgICBjb250aW51ZTsKIAogICAgIC8vIE90aGVyd2lzZSwgZW1pdCB0aGUgZGVmaW5pdGlvbiBhbmQgbW92ZSBvbiB0byB0aGUgbmV4dCBvbmUuCi0gICAgRW1pdEdsb2JhbERlZmluaXRpb24oRCk7CisgICAgRW1pdEdsb2JhbERlZmluaXRpb24oRCwgR1YpOwogICB9CiB9CiAKQEAgLTEwOTYsMTAgKzEwOTUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZSAqR1YpIHsKICAgYXNzZXJ0KEQtPmhhc0F0dHI8QW5ub3RhdGVBdHRyPigpICYmICJubyBhbm5vdGF0ZSBhdHRyaWJ1dGUiKTsKICAgLy8gR2V0IHRoZSBzdHJ1Y3QgZWxlbWVudHMgZm9yIHRoZXNlIGFubm90YXRpb25zLgotICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8QW5ub3RhdGVBdHRyPgotICAgICAgIGFpID0gRC0+c3BlY2lmaWNfYXR0cl9iZWdpbjxBbm5vdGF0ZUF0dHI+KCksCi0gICAgICAgYWUgPSBELT5zcGVjaWZpY19hdHRyX2VuZDxBbm5vdGF0ZUF0dHI+KCk7IGFpICE9IGFlOyArK2FpKQotICAgIEFubm90YXRpb25zLnB1c2hfYmFjayhFbWl0QW5ub3RhdGVBdHRyKEdWLCAqYWksIEQtPmdldExvY2F0aW9uKCkpKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogRC0+c3BlY2lmaWNfYXR0cnM8QW5ub3RhdGVBdHRyPigpKQorICAgIEFubm90YXRpb25zLnB1c2hfYmFjayhFbWl0QW5ub3RhdGVBdHRyKEdWLCBJLCBELT5nZXRMb2NhdGlvbigpKSk7CiB9CiAKIGJvb2wgQ29kZUdlbk1vZHVsZTo6TWF5RGVmZXJHZW5lcmF0aW9uKGNvbnN0IFZhbHVlRGVjbCAqR2xvYmFsKSB7CkBAIC0xMTk2LDEyICsxMTkzLDE0IEBACiAgICAgICBpZiAoIUZELT5kb2VzRGVjbGFyYXRpb25Gb3JjZUV4dGVybmFsbHlWaXNpYmxlRGVmaW5pdGlvbigpKQogICAgICAgICByZXR1cm47CiAKLSAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqSW5saW5lRGVmaW5pdGlvbiA9IDA7Ci0gICAgICBGRC0+Z2V0Qm9keShJbmxpbmVEZWZpbml0aW9uKTsKLQogICAgICAgU3RyaW5nUmVmIE1hbmdsZWROYW1lID0gZ2V0TWFuZ2xlZE5hbWUoR0QpOwotICAgICAgRGVmZXJyZWREZWNscy5lcmFzZShNYW5nbGVkTmFtZSk7Ci0gICAgICBFbWl0R2xvYmFsRGVmaW5pdGlvbihJbmxpbmVEZWZpbml0aW9uKTsKKworICAgICAgLy8gQ29tcHV0ZSB0aGUgZnVuY3Rpb24gaW5mbyBhbmQgTExWTSB0eXBlLgorICAgICAgY29uc3QgQ0dGdW5jdGlvbkluZm8gJkZJID0gZ2V0VHlwZXMoKS5hcnJhbmdlR2xvYmFsRGVjbGFyYXRpb24oR0QpOworICAgICAgbGx2bTo6VHlwZSAqVHkgPSBnZXRUeXBlcygpLkdldEZ1bmN0aW9uVHlwZShGSSk7CisKKyAgICAgIEdldE9yQ3JlYXRlTExWTUZ1bmN0aW9uKE1hbmdsZWROYW1lLCBUeSwgR0QsIC8qRm9yVlRhYmxlPSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkRvbnREZWZlcj0qL2ZhbHNlKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgIH0gZWxzZSB7CkBAIC0xMjMxLDggKzEyMzAsOCBAQAogICAvLyBJZiB0aGUgdmFsdWUgaGFzIGFscmVhZHkgYmVlbiB1c2VkLCBhZGQgaXQgZGlyZWN0bHkgdG8gdGhlCiAgIC8vIERlZmVycmVkRGVjbHNUb0VtaXQgbGlzdC4KICAgU3RyaW5nUmVmIE1hbmdsZWROYW1lID0gZ2V0TWFuZ2xlZE5hbWUoR0QpOwotICBpZiAoR2V0R2xvYmFsVmFsdWUoTWFuZ2xlZE5hbWUpKQotICAgIERlZmVycmVkRGVjbHNUb0VtaXQucHVzaF9iYWNrKEdEKTsKKyAgaWYgKGxsdm06Okdsb2JhbFZhbHVlICpHViA9IEdldEdsb2JhbFZhbHVlKE1hbmdsZWROYW1lKSkKKyAgICBhZGREZWZlcnJlZERlY2xUb0VtaXQoR1YsIEdEKTsKICAgZWxzZSB7CiAgICAgLy8gT3RoZXJ3aXNlLCByZW1lbWJlciB0aGF0IHdlIHNhdyBhIGRlZmVycmVkIGRlY2wgd2l0aCB0aGlzIG5hbWUuICBUaGUKICAgICAvLyBmaXJzdCB1c2Ugb2YgdGhlIG1hbmdsZWQgbmFtZSB3aWxsIGNhdXNlIGl0IHRvIG1vdmUgaW50bwpAQCAtMTMwMSw4ICsxMzAwLDcgQEAKICAgaWYgKGdldEZ1bmN0aW9uTGlua2FnZShHRCkgIT0gbGx2bTo6RnVuY3Rpb246OkF2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKQogICAgIHJldHVybiB0cnVlOwogICBjb25zdCBGdW5jdGlvbkRlY2wgKkYgPSBjYXN0PEZ1bmN0aW9uRGVjbD4oR0QuZ2V0RGVjbCgpKTsKLSAgaWYgKENvZGVHZW5PcHRzLk9wdGltaXphdGlvbkxldmVsID09IDAgJiYKLSAgICAgICFGLT5oYXNBdHRyPEFsd2F5c0lubGluZUF0dHI+KCkgJiYgIUYtPmhhc0F0dHI8Rm9yY2VJbmxpbmVBdHRyPigpKQorICBpZiAoQ29kZUdlbk9wdHMuT3B0aW1pemF0aW9uTGV2ZWwgPT0gMCAmJiAhRi0+aGFzQXR0cjxBbHdheXNJbmxpbmVBdHRyPigpKQogICAgIHJldHVybiBmYWxzZTsKICAgLy8gUFI5NjE0LiBBdm9pZCBjYXNlcyB3aGVyZSB0aGUgc291cmNlIGNvZGUgaXMgbHlpbmcgdG8gdXMuIEFuIGF2YWlsYWJsZQogICAvLyBleHRlcm5hbGx5IGZ1bmN0aW9uIHNob3VsZCBoYXZlIGFuIGVxdWl2YWxlbnQgZnVuY3Rpb24gc29tZXdoZXJlIGVsc2UsCkBAIC0xMzI5LDcgKzEzMjcsNyBAQAogICAgIH0KIH0KIAotdm9pZCBDb2RlR2VuTW9kdWxlOjpFbWl0R2xvYmFsRGVmaW5pdGlvbihHbG9iYWxEZWNsIEdEKSB7Cit2b2lkIENvZGVHZW5Nb2R1bGU6OkVtaXRHbG9iYWxEZWZpbml0aW9uKEdsb2JhbERlY2wgR0QsIGxsdm06Okdsb2JhbFZhbHVlICpHVikgewogICBjb25zdCBWYWx1ZURlY2wgKkQgPSBjYXN0PFZhbHVlRGVjbD4oR0QuZ2V0RGVjbCgpKTsKIAogICBQcmV0dHlTdGFja1RyYWNlRGVjbCBDcmFzaEluZm8oY29uc3RfY2FzdDxWYWx1ZURlY2wgKj4oRCksIEQtPmdldExvY2F0aW9uKCksIApAQCAtMTM1MSw3ICsxMzQ5LDcgQEAKICAgICAgIGVsc2UgaWYgKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpERCA9ZHluX2Nhc3Q8Q1hYRGVzdHJ1Y3RvckRlY2w+KE1ldGhvZCkpCiAgICAgICAgIEVtaXRDWFhEZXN0cnVjdG9yKERELCBHRC5nZXREdG9yVHlwZSgpKTsKICAgICAgIGVsc2UKLSAgICAgICAgRW1pdEdsb2JhbEZ1bmN0aW9uRGVmaW5pdGlvbihHRCk7CisgICAgICAgIEVtaXRHbG9iYWxGdW5jdGlvbkRlZmluaXRpb24oR0QsIEdWKTsKIAogICAgICAgaWYgKE1ldGhvZC0+aXNWaXJ0dWFsKCkpCiAgICAgICAgIGdldFZUYWJsZXMoKS5FbWl0VGh1bmtzKEdEKTsKQEAgLTEzNTksNyArMTM1Nyw3IEBACiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcmV0dXJuIEVtaXRHbG9iYWxGdW5jdGlvbkRlZmluaXRpb24oR0QpOworICAgIHJldHVybiBFbWl0R2xvYmFsRnVuY3Rpb25EZWZpbml0aW9uKEdELCBHVik7CiAgIH0KICAgCiAgIGlmIChjb25zdCBWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KEQpKQpAQCAtMTM3OSw2ICsxMzc3LDcgQEAKIENvZGVHZW5Nb2R1bGU6OkdldE9yQ3JlYXRlTExWTUZ1bmN0aW9uKFN0cmluZ1JlZiBNYW5nbGVkTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlR5cGUgKlR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsRGVjbCBHRCwgYm9vbCBGb3JWVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERvbnREZWZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkF0dHJpYnV0ZVNldCBFeHRyYUF0dHJzKSB7CiAgIGNvbnN0IERlY2wgKkQgPSBHRC5nZXREZWNsKCk7CiAKQEAgLTEzOTgsMTQgKzEzOTcsNiBAQAogICAgIHJldHVybiBsbHZtOjpDb25zdGFudEV4cHI6OmdldEJpdENhc3QoRW50cnksIFR5LT5nZXRQb2ludGVyVG8oKSk7CiAgIH0KIAotICAvLyBBbGwgTVNWQyBkdG9ycyBvdGhlciB0aGFuIHRoZSBiYXNlIGR0b3IgYXJlIGxpbmtvbmNlX29kciBhbmQgZGVsZWdhdGUgdG8KLSAgLy8gZWFjaCBvdGhlciBib3R0b21pbmcgb3V0IHdpdGggdGhlIGJhc2UgZHRvci4gIFRoZXJlZm9yZSB3ZSBlbWl0IG5vbi1iYXNlCi0gIC8vIGR0b3JzIG9uIHVzYWdlLCBldmVuIGlmIHRoZXJlIGlzIG5vIGR0b3IgZGVmaW5pdGlvbiBpbiB0aGUgVFUuCi0gIGlmIChEICYmIGlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oRCkgJiYKLSAgICAgIGdldENYWEFCSSgpLnVzZVRodW5rRm9yRHRvclZhcmlhbnQoY2FzdDxDWFhEZXN0cnVjdG9yRGVjbD4oRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdELmdldER0b3JUeXBlKCkpKQotICAgIERlZmVycmVkRGVjbHNUb0VtaXQucHVzaF9iYWNrKEdEKTsKLQogICAvLyBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSBhIGNvbXBsZXRlIHR5cGUgKGZvciBleGFtcGxlLCB0aGUgcmV0dXJuCiAgIC8vIHR5cGUgaXMgYW4gaW5jb21wbGV0ZSBzdHJ1Y3QpLiBVc2UgYSBmYWtlIHR5cGUgaW5zdGVhZCwgYW5kIG1ha2UKICAgLy8gc3VyZSBub3QgdG8gdHJ5IHRvIHNldCBhdHRyaWJ1dGVzLgpAQCAtMTQzMyw1MCArMTQyNCw2NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQikpOwogICB9CiAKLSAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXNlIG9yIGRlZmluaXRpb24gb2YgYSBtYW5nbGVkIG5hbWUuICBJZiB0aGVyZSBpcyBhCi0gIC8vIGRlZmVycmVkIGRlY2wgd2l0aCB0aGlzIG5hbWUsIHJlbWVtYmVyIHRoYXQgd2UgbmVlZCB0byBlbWl0IGl0IGF0IHRoZSBlbmQKLSAgLy8gb2YgdGhlIGZpbGUuCi0gIGxsdm06OlN0cmluZ01hcDxHbG9iYWxEZWNsPjo6aXRlcmF0b3IgRERJID0gRGVmZXJyZWREZWNscy5maW5kKE1hbmdsZWROYW1lKTsKLSAgaWYgKERESSAhPSBEZWZlcnJlZERlY2xzLmVuZCgpKSB7Ci0gICAgLy8gTW92ZSB0aGUgcG90ZW50aWFsbHkgcmVmZXJlbmNlZCBkZWZlcnJlZCBkZWNsIHRvIHRoZSBEZWZlcnJlZERlY2xzVG9FbWl0Ci0gICAgLy8gbGlzdCwgYW5kIHJlbW92ZSBpdCBmcm9tIERlZmVycmVkRGVjbHMgKHNpbmNlIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZSkuCi0gICAgRGVmZXJyZWREZWNsc1RvRW1pdC5wdXNoX2JhY2soRERJLT5zZWNvbmQpOwotICAgIERlZmVycmVkRGVjbHMuZXJhc2UoRERJKTsKKyAgaWYgKCFEb250RGVmZXIpIHsKKyAgICAvLyBBbGwgTVNWQyBkdG9ycyBvdGhlciB0aGFuIHRoZSBiYXNlIGR0b3IgYXJlIGxpbmtvbmNlX29kciBhbmQgZGVsZWdhdGUgdG8KKyAgICAvLyBlYWNoIG90aGVyIGJvdHRvbWluZyBvdXQgd2l0aCB0aGUgYmFzZSBkdG9yLiAgVGhlcmVmb3JlIHdlIGVtaXQgbm9uLWJhc2UKKyAgICAvLyBkdG9ycyBvbiB1c2FnZSwgZXZlbiBpZiB0aGVyZSBpcyBubyBkdG9yIGRlZmluaXRpb24gaW4gdGhlIFRVLgorICAgIGlmIChEICYmIGlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oRCkgJiYKKyAgICAgICAgZ2V0Q1hYQUJJKCkudXNlVGh1bmtGb3JEdG9yVmFyaWFudChjYXN0PENYWERlc3RydWN0b3JEZWNsPihEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRC5nZXREdG9yVHlwZSgpKSkKKyAgICAgIGFkZERlZmVycmVkRGVjbFRvRW1pdChGLCBHRCk7CiAKLSAgLy8gT3RoZXJ3aXNlLCBpZiB0aGlzIGlzIGEgc2l6ZWQgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uLCBlbWl0IGEgd2VhayBkZWZpbml0aW9uCi0gIC8vIGZvciBpdCBhdCB0aGUgZW5kIG9mIHRoZSB0cmFuc2xhdGlvbiB1bml0LgotICB9IGVsc2UgaWYgKEQgJiYgY2FzdDxGdW5jdGlvbkRlY2w+KEQpCi0gICAgICAgICAgICAgICAgICAgICAgLT5nZXRDb3JyZXNwb25kaW5nVW5zaXplZEdsb2JhbERlYWxsb2NhdGlvbkZ1bmN0aW9uKCkpIHsKLSAgICBEZWZlcnJlZERlY2xzVG9FbWl0LnB1c2hfYmFjayhHRCk7CisgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXNlIG9yIGRlZmluaXRpb24gb2YgYSBtYW5nbGVkIG5hbWUuICBJZiB0aGVyZSBpcyBhCisgICAgLy8gZGVmZXJyZWQgZGVjbCB3aXRoIHRoaXMgbmFtZSwgcmVtZW1iZXIgdGhhdCB3ZSBuZWVkIHRvIGVtaXQgaXQgYXQgdGhlIGVuZAorICAgIC8vIG9mIHRoZSBmaWxlLgorICAgIGxsdm06OlN0cmluZ01hcDxHbG9iYWxEZWNsPjo6aXRlcmF0b3IgRERJID0gRGVmZXJyZWREZWNscy5maW5kKE1hbmdsZWROYW1lKTsKKyAgICBpZiAoRERJICE9IERlZmVycmVkRGVjbHMuZW5kKCkpIHsKKyAgICAgIC8vIE1vdmUgdGhlIHBvdGVudGlhbGx5IHJlZmVyZW5jZWQgZGVmZXJyZWQgZGVjbCB0byB0aGUKKyAgICAgIC8vIERlZmVycmVkRGVjbHNUb0VtaXQgbGlzdCwgYW5kIHJlbW92ZSBpdCBmcm9tIERlZmVycmVkRGVjbHMgKHNpbmNlIHdlCisgICAgICAvLyBkb24ndCBuZWVkIGl0IGFueW1vcmUpLgorICAgICAgYWRkRGVmZXJyZWREZWNsVG9FbWl0KEYsIERESS0+c2Vjb25kKTsKKyAgICAgIERlZmVycmVkRGVjbHMuZXJhc2UoRERJKTsKIAotICAvLyBPdGhlcndpc2UsIHRoZXJlIGFyZSBjYXNlcyB3ZSBoYXZlIHRvIHdvcnJ5IGFib3V0IHdoZXJlIHdlJ3JlCi0gIC8vIHVzaW5nIGEgZGVjbGFyYXRpb24gZm9yIHdoaWNoIHdlIG11c3QgZW1pdCBhIGRlZmluaXRpb24gYnV0IHdoZXJlCi0gIC8vIHdlIG1pZ2h0IG5vdCBmaW5kIGEgdG9wLWxldmVsIGRlZmluaXRpb246Ci0gIC8vICAgLSBtZW1iZXIgZnVuY3Rpb25zIGRlZmluZWQgaW5saW5lIGluIHRoZWlyIGNsYXNzZXMKLSAgLy8gICAtIGZyaWVuZCBmdW5jdGlvbnMgZGVmaW5lZCBpbmxpbmUgaW4gc29tZSBjbGFzcwotICAvLyAgIC0gc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb25zIHdpdGggaW1wbGljaXQgZGVmaW5pdGlvbnMKLSAgLy8gSWYgd2UgZXZlciBjaGFuZ2Ugb3VyIEFTVCB0cmF2ZXJzYWwgdG8gd2FsayBpbnRvIGNsYXNzIG1ldGhvZHMsCi0gIC8vIHRoaXMgd2lsbCBiZSB1bm5lY2Vzc2FyeS4KLSAgLy8KLSAgLy8gV2UgYWxzbyBkb24ndCBlbWl0IGEgZGVmaW5pdGlvbiBmb3IgYSBmdW5jdGlvbiBpZiBpdCdzIGdvaW5nIHRvIGJlIGFuIGVudHJ5Ci0gIC8vIGluIGEgdnRhYmxlLCB1bmxlc3MgaXQncyBhbHJlYWR5IG1hcmtlZCBhcyB1c2VkLgotICB9IGVsc2UgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmIEQpIHsKLSAgICAvLyBMb29rIGZvciBhIGRlY2xhcmF0aW9uIHRoYXQncyBsZXhpY2FsbHkgaW4gYSByZWNvcmQuCi0gICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGNhc3Q8RnVuY3Rpb25EZWNsPihEKTsKLSAgICBGRCA9IEZELT5nZXRNb3N0UmVjZW50RGVjbCgpOwotICAgIGRvIHsKLSAgICAgIGlmIChpc2E8Q1hYUmVjb3JkRGVjbD4oRkQtPmdldExleGljYWxEZWNsQ29udGV4dCgpKSkgewotICAgICAgICBpZiAoRkQtPmlzSW1wbGljaXQoKSAmJiAhRm9yVlRhYmxlKSB7Ci0gICAgICAgICAgYXNzZXJ0KEZELT5pc1VzZWQoKSAmJiAiU2VtYSBkaWRuJ3QgbWFyayBpbXBsaWNpdCBmdW5jdGlvbiBhcyB1c2VkISIpOwotICAgICAgICAgIERlZmVycmVkRGVjbHNUb0VtaXQucHVzaF9iYWNrKEdELmdldFdpdGhEZWNsKEZEKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoRkQtPmRvZXNUaGlzRGVjbGFyYXRpb25IYXZlQUJvZHkoKSkgewotICAgICAgICAgIERlZmVycmVkRGVjbHNUb0VtaXQucHVzaF9iYWNrKEdELmdldFdpdGhEZWNsKEZEKSk7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoaXMgaXMgYSBzaXplZCBkZWFsbG9jYXRpb24gZnVuY3Rpb24sIGVtaXQgYSB3ZWFrCisgICAgICAvLyBkZWZpbml0aW9uCisgICAgICAvLyBmb3IgaXQgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNsYXRpb24gdW5pdC4KKyAgICB9IGVsc2UgaWYgKEQgJiYgY2FzdDxGdW5jdGlvbkRlY2w+KEQpCisgICAgICAgICAgICAgICAgICAgICAgICAtPmdldENvcnJlc3BvbmRpbmdVbnNpemVkR2xvYmFsRGVhbGxvY2F0aW9uRnVuY3Rpb24oKSkgeworICAgICAgYWRkRGVmZXJyZWREZWNsVG9FbWl0KEYsIEdEKTsKKworICAgICAgLy8gT3RoZXJ3aXNlLCB0aGVyZSBhcmUgY2FzZXMgd2UgaGF2ZSB0byB3b3JyeSBhYm91dCB3aGVyZSB3ZSdyZQorICAgICAgLy8gdXNpbmcgYSBkZWNsYXJhdGlvbiBmb3Igd2hpY2ggd2UgbXVzdCBlbWl0IGEgZGVmaW5pdGlvbiBidXQgd2hlcmUKKyAgICAgIC8vIHdlIG1pZ2h0IG5vdCBmaW5kIGEgdG9wLWxldmVsIGRlZmluaXRpb246CisgICAgICAvLyAgIC0gbWVtYmVyIGZ1bmN0aW9ucyBkZWZpbmVkIGlubGluZSBpbiB0aGVpciBjbGFzc2VzCisgICAgICAvLyAgIC0gZnJpZW5kIGZ1bmN0aW9ucyBkZWZpbmVkIGlubGluZSBpbiBzb21lIGNsYXNzCisgICAgICAvLyAgIC0gc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb25zIHdpdGggaW1wbGljaXQgZGVmaW5pdGlvbnMKKyAgICAgIC8vIElmIHdlIGV2ZXIgY2hhbmdlIG91ciBBU1QgdHJhdmVyc2FsIHRvIHdhbGsgaW50byBjbGFzcyBtZXRob2RzLAorICAgICAgLy8gdGhpcyB3aWxsIGJlIHVubmVjZXNzYXJ5LgorICAgICAgLy8KKyAgICAgIC8vIFdlIGFsc28gZG9uJ3QgZW1pdCBhIGRlZmluaXRpb24gZm9yIGEgZnVuY3Rpb24gaWYgaXQncyBnb2luZyB0byBiZSBhbgorICAgICAgLy8gZW50cnkKKyAgICAgIC8vIGluIGEgdnRhYmxlLCB1bmxlc3MgaXQncyBhbHJlYWR5IG1hcmtlZCBhcyB1c2VkLgorICAgIH0gZWxzZSBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMgJiYgRCkgeworICAgICAgLy8gTG9vayBmb3IgYSBkZWNsYXJhdGlvbiB0aGF0J3MgbGV4aWNhbGx5IGluIGEgcmVjb3JkLgorICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGNhc3Q8RnVuY3Rpb25EZWNsPihEKTsKKyAgICAgIEZEID0gRkQtPmdldE1vc3RSZWNlbnREZWNsKCk7CisgICAgICBkbyB7CisgICAgICAgIGlmIChpc2E8Q1hYUmVjb3JkRGVjbD4oRkQtPmdldExleGljYWxEZWNsQ29udGV4dCgpKSkgeworICAgICAgICAgIGlmIChGRC0+aXNJbXBsaWNpdCgpICYmICFGb3JWVGFibGUpIHsKKyAgICAgICAgICAgIGFzc2VydChGRC0+aXNVc2VkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAiU2VtYSBkaWRuJ3QgbWFyayBpbXBsaWNpdCBmdW5jdGlvbiBhcyB1c2VkISIpOworICAgICAgICAgICAgYWRkRGVmZXJyZWREZWNsVG9FbWl0KEYsIEdELmdldFdpdGhEZWNsKEZEKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgaWYgKEZELT5kb2VzVGhpc0RlY2xhcmF0aW9uSGF2ZUFCb2R5KCkpIHsKKyAgICAgICAgICAgIGFkZERlZmVycmVkRGVjbFRvRW1pdChGLCBHRC5nZXRXaXRoRGVjbChGRCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBGRCA9IEZELT5nZXRQcmV2aW91c0RlY2woKTsKLSAgICB9IHdoaWxlIChGRCk7CisgICAgICAgIEZEID0gRkQtPmdldFByZXZpb3VzRGVjbCgpOworICAgICAgfSB3aGlsZSAoRkQpOworICAgIH0KICAgfQogCiAgIC8vIE1ha2Ugc3VyZSB0aGUgcmVzdWx0IGlzIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZS4KQEAgLTE0OTQsMTMgKzE0OTksMTQgQEAKIC8vLyBjcmVhdGUgaXQgKHRoaXMgb2NjdXJzIHdoZW4gd2Ugc2VlIGEgZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb24pLgogbGx2bTo6Q29uc3RhbnQgKkNvZGVHZW5Nb2R1bGU6OkdldEFkZHJPZkZ1bmN0aW9uKEdsb2JhbERlY2wgR0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VHlwZSAqVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3JWVGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvclZUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERvbnREZWZlcikgewogICAvLyBJZiB0aGVyZSB3YXMgbm8gc3BlY2lmaWMgcmVxdWVzdGVkIHR5cGUsIGp1c3QgY29udmVydCBpdCBub3cuCiAgIGlmICghVHkpCiAgICAgVHkgPSBnZXRUeXBlcygpLkNvbnZlcnRUeXBlKGNhc3Q8VmFsdWVEZWNsPihHRC5nZXREZWNsKCkpLT5nZXRUeXBlKCkpOwogICAKICAgU3RyaW5nUmVmIE1hbmdsZWROYW1lID0gZ2V0TWFuZ2xlZE5hbWUoR0QpOwotICByZXR1cm4gR2V0T3JDcmVhdGVMTFZNRnVuY3Rpb24oTWFuZ2xlZE5hbWUsIFR5LCBHRCwgRm9yVlRhYmxlKTsKKyAgcmV0dXJuIEdldE9yQ3JlYXRlTExWTUZ1bmN0aW9uKE1hbmdsZWROYW1lLCBUeSwgR0QsIEZvclZUYWJsZSwgRG9udERlZmVyKTsKIH0KIAogLy8vIENyZWF0ZVJ1bnRpbWVGdW5jdGlvbiAtIENyZWF0ZSBhIG5ldyBydW50aW1lIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpZmllZApAQCAtMTUwOSw5ICsxNTE1LDkgQEAKIENvZGVHZW5Nb2R1bGU6OkNyZWF0ZVJ1bnRpbWVGdW5jdGlvbihsbHZtOjpGdW5jdGlvblR5cGUgKkZUeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpBdHRyaWJ1dGVTZXQgRXh0cmFBdHRycykgewotICBsbHZtOjpDb25zdGFudCAqQwotICAgID0gR2V0T3JDcmVhdGVMTFZNRnVuY3Rpb24oTmFtZSwgRlR5LCBHbG9iYWxEZWNsKCksIC8qRm9yVlRhYmxlPSovZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYUF0dHJzKTsKKyAgbGx2bTo6Q29uc3RhbnQgKkMgPQorICAgICAgR2V0T3JDcmVhdGVMTFZNRnVuY3Rpb24oTmFtZSwgRlR5LCBHbG9iYWxEZWNsKCksIC8qRm9yVlRhYmxlPSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkRvbnREZWZlcj0qL2ZhbHNlLCBFeHRyYUF0dHJzKTsKICAgaWYgKGxsdm06OkZ1bmN0aW9uICpGID0gZHluX2Nhc3Q8bGx2bTo6RnVuY3Rpb24+KEMpKQogICAgIGlmIChGLT5lbXB0eSgpKQogICAgICAgRi0+c2V0Q2FsbGluZ0NvbnYoZ2V0UnVudGltZUNDKCkpOwpAQCAtMTU3MSw2ICsxNTc3LDEzIEBACiAgICAgcmV0dXJuIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChFbnRyeSwgVHkpOwogICB9CiAKKyAgdW5zaWduZWQgQWRkclNwYWNlID0gR2V0R2xvYmFsVmFyQWRkcmVzc1NwYWNlKEQsIFR5LT5nZXRBZGRyZXNzU3BhY2UoKSk7CisgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpHViA9CisgICAgbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKGdldE1vZHVsZSgpLCBUeS0+Z2V0RWxlbWVudFR5cGUoKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE1hbmdsZWROYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYXJpYWJsZTo6Tm90VGhyZWFkTG9jYWwsIEFkZHJTcGFjZSk7CisKICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXNlIG9yIGRlZmluaXRpb24gb2YgYSBtYW5nbGVkIG5hbWUuICBJZiB0aGVyZSBpcyBhCiAgIC8vIGRlZmVycmVkIGRlY2wgd2l0aCB0aGlzIG5hbWUsIHJlbWVtYmVyIHRoYXQgd2UgbmVlZCB0byBlbWl0IGl0IGF0IHRoZSBlbmQKICAgLy8gb2YgdGhlIGZpbGUuCkBAIC0xNTc4LDE3ICsxNTkxLDEwIEBACiAgIGlmIChEREkgIT0gRGVmZXJyZWREZWNscy5lbmQoKSkgewogICAgIC8vIE1vdmUgdGhlIHBvdGVudGlhbGx5IHJlZmVyZW5jZWQgZGVmZXJyZWQgZGVjbCB0byB0aGUgRGVmZXJyZWREZWNsc1RvRW1pdAogICAgIC8vIGxpc3QsIGFuZCByZW1vdmUgaXQgZnJvbSBEZWZlcnJlZERlY2xzIChzaW5jZSB3ZSBkb24ndCBuZWVkIGl0IGFueW1vcmUpLgotICAgIERlZmVycmVkRGVjbHNUb0VtaXQucHVzaF9iYWNrKERESS0+c2Vjb25kKTsKKyAgICBhZGREZWZlcnJlZERlY2xUb0VtaXQoR1YsIERESS0+c2Vjb25kKTsKICAgICBEZWZlcnJlZERlY2xzLmVyYXNlKERESSk7CiAgIH0KIAotICB1bnNpZ25lZCBBZGRyU3BhY2UgPSBHZXRHbG9iYWxWYXJBZGRyZXNzU3BhY2UoRCwgVHktPmdldEFkZHJlc3NTcGFjZSgpKTsKLSAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWID0KLSAgICBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoZ2V0TW9kdWxlKCksIFR5LT5nZXRFbGVtZW50VHlwZSgpLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTWFuZ2xlZE5hbWUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhcmlhYmxlOjpOb3RUaHJlYWRMb2NhbCwgQWRkclNwYWNlKTsKLQogICAvLyBIYW5kbGUgdGhpbmdzIHdoaWNoIGFyZSBwcmVzZW50IGV2ZW4gb24gZXh0ZXJuYWwgZGVjbGFyYXRpb25zLgogICBpZiAoRCkgewogICAgIC8vIEZJWE1FOiBUaGlzIGNvZGUgaXMgb3Zlcmx5IHNpbXBsZSBhbmQgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIG90aGVyIGdsb2JhbApAQCAtMTYwMCw5ICsxNjA2LDEwIEBACiAgICAgaWYgKExWLmdldExpbmthZ2UoKSAhPSBFeHRlcm5hbExpbmthZ2UpIHsKICAgICAgIC8vIERvbid0IHNldCBpbnRlcm5hbCBsaW5rYWdlIG9uIGRlY2xhcmF0aW9ucy4KICAgICB9IGVsc2UgewotICAgICAgaWYgKEQtPmhhc0F0dHI8RExMSW1wb3J0QXR0cj4oKSkKLSAgICAgICAgR1YtPnNldExpbmthZ2UobGx2bTo6R2xvYmFsVmFsdWU6OkRMTEltcG9ydExpbmthZ2UpOwotICAgICAgZWxzZSBpZiAoRC0+aGFzQXR0cjxXZWFrQXR0cj4oKSB8fCBELT5pc1dlYWtJbXBvcnRlZCgpKQorICAgICAgaWYgKEQtPmhhc0F0dHI8RExMSW1wb3J0QXR0cj4oKSkgeworICAgICAgICBHVi0+c2V0TGlua2FnZShsbHZtOjpHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlKTsKKyAgICAgICAgR1YtPnNldERMTFN0b3JhZ2VDbGFzcyhsbHZtOjpHbG9iYWxWYWx1ZTo6RExMSW1wb3J0U3RvcmFnZUNsYXNzKTsKKyAgICAgIH0gZWxzZSBpZiAoRC0+aGFzQXR0cjxXZWFrQXR0cj4oKSB8fCBELT5pc1dlYWtJbXBvcnRlZCgpKQogICAgICAgICBHVi0+c2V0TGlua2FnZShsbHZtOjpHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxXZWFrTGlua2FnZSk7CiAKICAgICAgIC8vIFNldCB2aXNpYmlsaXR5IG9uIGEgZGVjbGFyYXRpb24gb25seSBpZiBpdCdzIGV4cGxpY2l0LgpAQCAtMTYyNyw2ICsxNjM0LDEyIEBACiAgIGlmIChBZGRyU3BhY2UgIT0gVHktPmdldEFkZHJlc3NTcGFjZSgpKQogICAgIHJldHVybiBsbHZtOjpDb25zdGFudEV4cHI6OmdldEFkZHJTcGFjZUNhc3QoR1YsIFR5KTsKIAorICBpZiAoZ2V0VGFyZ2V0KCkuZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eGNvcmUgJiYKKyAgICAgIEQtPmdldExhbmd1YWdlTGlua2FnZSgpID09IENMYW5ndWFnZUxpbmthZ2UgJiYKKyAgICAgIEQtPmdldFR5cGUoKS5pc0NvbnN0YW50KENvbnRleHQpICYmCisgICAgICBpc0V4dGVybmFsbHlWaXNpYmxlKEQtPmdldExpbmthZ2VBbmRWaXNpYmlsaXR5KCkuZ2V0TGlua2FnZSgpKSkKKyAgICBHVi0+c2V0U2VjdGlvbigiLmNwLnJvZGF0YSIpOworCiAgIHJldHVybiBHVjsKIH0KIApAQCAtMTg3NSw2ICsxODg4LDEwIEBACiAgIGxsdm06Okdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTGlua2FnZSA9IAogICAgIEdldExMVk1MaW5rYWdlVmFyRGVmaW5pdGlvbihELCBHVi0+aXNDb25zdGFudCgpKTsKICAgR1YtPnNldExpbmthZ2UoTGlua2FnZSk7CisgIGlmIChELT5oYXNBdHRyPERMTEltcG9ydEF0dHI+KCkpCisgICAgR1YtPnNldERMTFN0b3JhZ2VDbGFzcyhsbHZtOjpHbG9iYWxWYXJpYWJsZTo6RExMSW1wb3J0U3RvcmFnZUNsYXNzKTsKKyAgZWxzZSBpZiAoRC0+aGFzQXR0cjxETExFeHBvcnRBdHRyPigpKQorICAgIEdWLT5zZXRETExTdG9yYWdlQ2xhc3MobGx2bTo6R2xvYmFsVmFyaWFibGU6OkRMTEV4cG9ydFN0b3JhZ2VDbGFzcyk7CiAKICAgLy8gSWYgcmVxdWlyZWQgYnkgdGhlIEFCSSwgZ2l2ZSBkZWZpbml0aW9ucyBvZiBzdGF0aWMgZGF0YSBtZW1iZXJzIHdpdGggaW5saW5lCiAgIC8vIGluaXRpYWxpemVycyBsaW5rb25jZV9vZHIgbGlua2FnZS4KQEAgLTE5MTcsOSArMTkzNCw5IEBACiAgIGlmIChMaW5rYWdlID09IEdWQV9JbnRlcm5hbCkKICAgICByZXR1cm4gbGx2bTo6RnVuY3Rpb246OkludGVybmFsTGlua2FnZTsKICAgZWxzZSBpZiAoRC0+aGFzQXR0cjxETExJbXBvcnRBdHRyPigpKQotICAgIHJldHVybiBsbHZtOjpGdW5jdGlvbjo6RExMSW1wb3J0TGlua2FnZTsKKyAgICByZXR1cm4gbGx2bTo6RnVuY3Rpb246OkV4dGVybmFsTGlua2FnZTsKICAgZWxzZSBpZiAoRC0+aGFzQXR0cjxETExFeHBvcnRBdHRyPigpKQotICAgIHJldHVybiBsbHZtOjpGdW5jdGlvbjo6RExMRXhwb3J0TGlua2FnZTsKKyAgICByZXR1cm4gbGx2bTo6RnVuY3Rpb246OkV4dGVybmFsTGlua2FnZTsKICAgZWxzZSBpZiAoRC0+aGFzQXR0cjxTZWxlY3RBbnlBdHRyPigpKSB7CiAgICAgLy8gc2VsZWN0YW55IHN5bWJvbHMgYXJlIGV4dGVybmFsbHkgdmlzaWJsZSwgc28gdXNlIHdlYWsgaW5zdGVhZCBvZgogICAgIC8vIGxpbmtvbmNlLiAgTVNWQyBvcHRpbWl6ZXMgYXdheSByZWZlcmVuY2VzIHRvIGNvbnN0IHNlbGVjdGFueSBnbG9iYWxzLCBzbwpAQCAtMTkzMSwxNSArMTk0OCwxNCBAQAogICAgICAgcmV0dXJuIGxsdm06Okdsb2JhbFZhcmlhYmxlOjpXZWFrT0RSTGlua2FnZTsKICAgICBlbHNlCiAgICAgICByZXR1cm4gbGx2bTo6R2xvYmFsVmFyaWFibGU6OldlYWtBbnlMaW5rYWdlOwotICB9IGVsc2UgaWYgKExpbmthZ2UgPT0gR1ZBX1RlbXBsYXRlSW5zdGFudGlhdGlvbiB8fAotICAgICAgICAgICAgIExpbmthZ2UgPT0gR1ZBX0V4cGxpY2l0VGVtcGxhdGVJbnN0YW50aWF0aW9uKQorICB9IGVsc2UgaWYgKExpbmthZ2UgPT0gR1ZBX1RlbXBsYXRlSW5zdGFudGlhdGlvbiB8fCBMaW5rYWdlID09IEdWQV9TdHJvbmdPRFIpCiAgICAgcmV0dXJuIGxsdm06Okdsb2JhbFZhcmlhYmxlOjpXZWFrT0RSTGlua2FnZTsKICAgZWxzZSBpZiAoIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmIAotICAgICAgICAgICAoKCFDb2RlR2VuT3B0cy5Ob0NvbW1vbiAmJiAhRC0+Z2V0QXR0cjxOb0NvbW1vbkF0dHI+KCkpIHx8Ci0gICAgICAgICAgICAgRC0+Z2V0QXR0cjxDb21tb25BdHRyPigpKSAmJgorICAgICAgICAgICAoKCFDb2RlR2VuT3B0cy5Ob0NvbW1vbiAmJiAhRC0+aGFzQXR0cjxOb0NvbW1vbkF0dHI+KCkpIHx8CisgICAgICAgICAgICAgRC0+aGFzQXR0cjxDb21tb25BdHRyPigpKSAmJgogICAgICAgICAgICAhRC0+aGFzRXh0ZXJuYWxTdG9yYWdlKCkgJiYgIUQtPmdldEluaXQoKSAmJgotICAgICAgICAgICAhRC0+Z2V0QXR0cjxTZWN0aW9uQXR0cj4oKSAmJiAhRC0+Z2V0VExTS2luZCgpICYmCi0gICAgICAgICAgICFELT5nZXRBdHRyPFdlYWtJbXBvcnRBdHRyPigpKSB7CisgICAgICAgICAgICFELT5oYXNBdHRyPFNlY3Rpb25BdHRyPigpICYmICFELT5nZXRUTFNLaW5kKCkgJiYKKyAgICAgICAgICAgIUQtPmhhc0F0dHI8V2Vha0ltcG9ydEF0dHI+KCkpIHsKICAgICAvLyBUaHJlYWQgbG9jYWwgdmFycyBhcmVuJ3QgY29uc2lkZXJlZCBjb21tb24gbGlua2FnZS4KICAgICByZXR1cm4gbGx2bTo6R2xvYmFsVmFyaWFibGU6OkNvbW1vbkxpbmthZ2U7CiAgIH0gZWxzZSBpZiAoRC0+Z2V0VExTS2luZCgpID09IFZhckRlY2w6OlRMU19EeW5hbWljICYmCkBAIC0xOTY1LDcgKzE5ODEsNyBAQAogICBmb3IgKGxsdm06OlZhbHVlOjp1c2VfaXRlcmF0b3IgdWkgPSBvbGQtPnVzZV9iZWdpbigpLCB1ZSA9IG9sZC0+dXNlX2VuZCgpOwogICAgICAgICAgdWkgIT0gdWU7ICkgewogICAgIGxsdm06OlZhbHVlOjp1c2VfaXRlcmF0b3IgdXNlID0gdWkrKzsgLy8gSW5jcmVtZW50IGJlZm9yZSB0aGUgdXNlIGlzIGVyYXNlZC4KLSAgICBsbHZtOjpVc2VyICp1c2VyID0gKnVzZTsKKyAgICBsbHZtOjpVc2VyICp1c2VyID0gdXNlLT5nZXRVc2VyKCk7CiAKICAgICAvLyBSZWNvZ25pemUgYW5kIHJlcGxhY2UgdXNlcyBvZiBiaXRjYXN0cy4gIE1vc3QgY2FsbHMgdG8KICAgICAvLyB1bnByb3RvdHlwZWQgZnVuY3Rpb25zIHdpbGwgdXNlIGJpdGNhc3RzLgpAQCAtMTk3OCw3ICsxOTk0LDcgQEAKICAgICAvLyBSZWNvZ25pemUgY2FsbHMgdG8gdGhlIGZ1bmN0aW9uLgogICAgIGxsdm06OkNhbGxTaXRlIGNhbGxTaXRlKHVzZXIpOwogICAgIGlmICghY2FsbFNpdGUpIGNvbnRpbnVlOwotICAgIGlmICghY2FsbFNpdGUuaXNDYWxsZWUodXNlKSkgY29udGludWU7CisgICAgaWYgKCFjYWxsU2l0ZS5pc0NhbGxlZSgmKnVzZSkpIGNvbnRpbnVlOwogCiAgICAgLy8gSWYgdGhlIHJldHVybiB0eXBlcyBkb24ndCBtYXRjaCBleGFjdGx5LCB0aGVuIHdlIGNhbid0CiAgICAgLy8gdHJhbnNmb3JtIHRoaXMgY2FsbCB1bmxlc3MgaXQncyBkZWFkLgpAQCAtMjA4Nyw3ICsyMTAzLDggQEAKICAgRW1pdFRvcExldmVsRGVjbChWRCk7CiB9CiAKLXZvaWQgQ29kZUdlbk1vZHVsZTo6RW1pdEdsb2JhbEZ1bmN0aW9uRGVmaW5pdGlvbihHbG9iYWxEZWNsIEdEKSB7Cit2b2lkIENvZGVHZW5Nb2R1bGU6OkVtaXRHbG9iYWxGdW5jdGlvbkRlZmluaXRpb24oR2xvYmFsRGVjbCBHRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZSAqR1YpIHsKICAgY29uc3QgRnVuY3Rpb25EZWNsICpEID0gY2FzdDxGdW5jdGlvbkRlY2w+KEdELmdldERlY2woKSk7CiAKICAgLy8gQ29tcHV0ZSB0aGUgZnVuY3Rpb24gaW5mbyBhbmQgTExWTSB0eXBlLgpAQCAtMjA5NSw3ICsyMTEyLDkgQEAKICAgbGx2bTo6RnVuY3Rpb25UeXBlICpUeSA9IGdldFR5cGVzKCkuR2V0RnVuY3Rpb25UeXBlKEZJKTsKIAogICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBwcm90b3R5cGUgZm9yIHRoZSBmdW5jdGlvbi4KLSAgbGx2bTo6Q29uc3RhbnQgKkVudHJ5ID0gR2V0QWRkck9mRnVuY3Rpb24oR0QsIFR5KTsKKyAgbGx2bTo6Q29uc3RhbnQgKkVudHJ5ID0KKyAgICAgIEdWID8gR1YKKyAgICAgICAgIDogR2V0QWRkck9mRnVuY3Rpb24oR0QsIFR5LCAvKkZvclZUYWJsZT0qL2ZhbHNlLCAvKkRvbnREZWZlciovIHRydWUpOwogCiAgIC8vIFN0cmlwIG9mZiBhIGJpdGNhc3QgaWYgd2UgZ290IG9uZSBiYWNrLgogICBpZiAobGx2bTo6Q29uc3RhbnRFeHByICpDRSA9IGR5bl9jYXN0PGxsdm06OkNvbnN0YW50RXhwcj4oRW50cnkpKSB7CkBAIC0yMTc0LDYgKzIxOTMsMTAgQEAKICAgICBBZGRHbG9iYWxEdG9yKEZuLCBEQS0+Z2V0UHJpb3JpdHkoKSk7CiAgIGlmIChELT5oYXNBdHRyPEFubm90YXRlQXR0cj4oKSkKICAgICBBZGRHbG9iYWxBbm5vdGF0aW9ucyhELCBGbik7CisKKyAgbGx2bTo6RnVuY3Rpb24gKlBHT0luaXQgPSBDb2RlR2VuUEdPOjplbWl0SW5pdGlhbGl6YXRpb24oKnRoaXMpOworICBpZiAoUEdPSW5pdCkKKyAgICBBZGRHbG9iYWxDdG9yKFBHT0luaXQsIDApOwogfQogCiB2b2lkIENvZGVHZW5Nb2R1bGU6OkVtaXRBbGlhc0RlZmluaXRpb24oR2xvYmFsRGVjbCBHRCkgewpAQCAtMjIzNSw5ICsyMjU4LDkgQEAKICAgICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oRCkpIHsKICAgICAgIC8vIFRoZSBkbGxleHBvcnQgYXR0cmlidXRlIGlzIGlnbm9yZWQgZm9yIHVuZGVmaW5lZCBzeW1ib2xzLgogICAgICAgaWYgKEZELT5oYXNCb2R5KCkpCi0gICAgICAgIEdBLT5zZXRMaW5rYWdlKGxsdm06OkZ1bmN0aW9uOjpETExFeHBvcnRMaW5rYWdlKTsKKyAgICAgICAgR0EtPnNldERMTFN0b3JhZ2VDbGFzcyhsbHZtOjpHbG9iYWxWYWx1ZTo6RExMRXhwb3J0U3RvcmFnZUNsYXNzKTsKICAgICB9IGVsc2UgewotICAgICAgR0EtPnNldExpbmthZ2UobGx2bTo6RnVuY3Rpb246OkRMTEV4cG9ydExpbmthZ2UpOworICAgICAgR0EtPnNldERMTFN0b3JhZ2VDbGFzcyhsbHZtOjpHbG9iYWxWYWx1ZTo6RExMRXhwb3J0U3RvcmFnZUNsYXNzKTsKICAgICB9CiAgIH0gZWxzZSBpZiAoRC0+aGFzQXR0cjxXZWFrQXR0cj4oKSB8fAogICAgICAgICAgICAgIEQtPmhhc0F0dHI8V2Vha1JlZkF0dHI+KCkgfHwKQEAgLTIzNTUsMzAgKzIzNzgsMjUgQEAKICAgICBDID0gbGx2bTo6Q29uc3RhbnREYXRhQXJyYXk6OmdldFN0cmluZyhWTUNvbnRleHQsIEVudHJ5LmdldEtleSgpKTsKICAgfQogCi0gIGxsdm06Okdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTGlua2FnZTsKLSAgaWYgKGlzVVRGMTYpCi0gICAgLy8gRklYTUU6IHdoeSBkbyB1dGYgc3RyaW5ncyBnZXQgIl8iIGxhYmVscyBpbnN0ZWFkIG9mICJMIiBsYWJlbHM/Ci0gICAgTGlua2FnZSA9IGxsdm06Okdsb2JhbFZhbHVlOjpJbnRlcm5hbExpbmthZ2U7Ci0gIGVsc2UKLSAgICAvLyBGSVhNRTogV2l0aCBPUyBYIGxkIDEyMy4yICh4Y29kZSA0KSBhbmQgTFRPIHdlIHdvdWxkIGdldCBhIGxpbmtlciBlcnJvcgotICAgIC8vIHdoZW4gdXNpbmcgcHJpdmF0ZSBsaW5rYWdlLiBJdCBpcyBub3QgY2xlYXIgaWYgdGhpcyBpcyBhIGJ1ZyBpbiBsZAotICAgIC8vIG9yIGEgcmVhc29uYWJsZSBuZXcgcmVzdHJpY3Rpb24uCi0gICAgTGlua2FnZSA9IGxsdm06Okdsb2JhbFZhbHVlOjpMaW5rZXJQcml2YXRlTGlua2FnZTsKLSAgCiAgIC8vIE5vdGU6IC1md3JpdGFibGUtc3RyaW5ncyBkb2Vzbid0IG1ha2UgdGhlIGJhY2tpbmcgc3RvcmUgc3RyaW5ncyBvZgogICAvLyBDRlN0cmluZ3Mgd3JpdGFibGUuIChTZWUgPHJkYXI6Ly9wcm9ibGVtLzEwNjU3NTAwPikKICAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWID0KLSAgICBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoZ2V0TW9kdWxlKCksIEMtPmdldFR5cGUoKSwgLyppc0NvbnN0YW50PSovdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua2FnZSwgQywgIi5zdHIiKTsKKyAgICAgIG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShnZXRNb2R1bGUoKSwgQy0+Z2V0VHlwZSgpLCAvKmlzQ29uc3RhbnQ9Ki90cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpQcml2YXRlTGlua2FnZSwgQywgIi5zdHIiKTsKICAgR1YtPnNldFVubmFtZWRBZGRyKHRydWUpOwogICAvLyBEb24ndCBlbmZvcmNlIHRoZSB0YXJnZXQncyBtaW5pbXVtIGdsb2JhbCBhbGlnbm1lbnQsIHNpbmNlIHRoZSBvbmx5IHVzZQogICAvLyBvZiB0aGUgc3RyaW5nIGlzIHZpYSB0aGlzIGNsYXNzIGluaXRpYWxpemVyLgorICAvLyBGSVhNRTogV2Ugc2V0IHRoZSBzZWN0aW9uIGV4cGxpY2l0bHkgdG8gYXZvaWQgYSBidWcgaW4gbGQ2NCAyMjQuMS4gV2l0aG91dAorICAvLyBpdCBMTFZNIGNhbiBtZXJnZSB0aGUgc3RyaW5nIHdpdGggYSBub24gdW5uYW1lZF9hZGRyIG9uZSBkdXJpbmcgTFRPLiBEb2luZworICAvLyB0aGF0IGNoYW5nZXMgdGhlIHNlY3Rpb24gaXQgZW5kcyBpbiwgd2hpY2ggc3VycHJpc2VzIGxkNjQuCiAgIGlmIChpc1VURjE2KSB7CiAgICAgQ2hhclVuaXRzIEFsaWduID0gZ2V0Q29udGV4dCgpLmdldFR5cGVBbGlnbkluQ2hhcnMoZ2V0Q29udGV4dCgpLlNob3J0VHkpOwogICAgIEdWLT5zZXRBbGlnbm1lbnQoQWxpZ24uZ2V0UXVhbnRpdHkoKSk7CisgICAgR1YtPnNldFNlY3Rpb24oIl9fVEVYVCxfX3VzdHJpbmciKTsKICAgfSBlbHNlIHsKICAgICBDaGFyVW5pdHMgQWxpZ24gPSBnZXRDb250ZXh0KCkuZ2V0VHlwZUFsaWduSW5DaGFycyhnZXRDb250ZXh0KCkuQ2hhclR5KTsKICAgICBHVi0+c2V0QWxpZ25tZW50KEFsaWduLmdldFF1YW50aXR5KCkpOworICAgIEdWLT5zZXRTZWN0aW9uKCJfX1RFWFQsX19jc3RyaW5nLGNzdHJpbmdfbGl0ZXJhbHMiKTsKICAgfQogCiAgIC8vIFN0cmluZy4KQEAgLTIzOTcsMjMgKzI0MTUsMTIgQEAKICAgR1YgPSBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoZ2V0TW9kdWxlKCksIEMtPmdldFR5cGUoKSwgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFyaWFibGU6OlByaXZhdGVMaW5rYWdlLCBDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3VubmFtZWRfY2ZzdHJpbmdfIik7Ci0gIGlmIChjb25zdCBjaGFyICpTZWN0ID0gZ2V0VGFyZ2V0KCkuZ2V0Q0ZTdHJpbmdTZWN0aW9uKCkpCi0gICAgR1YtPnNldFNlY3Rpb24oU2VjdCk7CisgIEdWLT5zZXRTZWN0aW9uKCJfX0RBVEEsX19jZnN0cmluZyIpOwogICBFbnRyeS5zZXRWYWx1ZShHVik7CiAKICAgcmV0dXJuIEdWOwogfQogCi1zdGF0aWMgUmVjb3JkRGVjbCAqCi1DcmVhdGVSZWNvcmREZWNsKGNvbnN0IEFTVENvbnRleHQgJkN0eCwgUmVjb3JkRGVjbDo6VGFnS2luZCBUSywKLSAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQgKkRDLCBJZGVudGlmaWVySW5mbyAqSWQpIHsKLSAgU291cmNlTG9jYXRpb24gTG9jOwotICBpZiAoQ3R4LmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKQotICAgIHJldHVybiBDWFhSZWNvcmREZWNsOjpDcmVhdGUoQ3R4LCBUSywgREMsIExvYywgTG9jLCBJZCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gUmVjb3JkRGVjbDo6Q3JlYXRlKEN0eCwgVEssIERDLCBMb2MsIExvYywgSWQpOwotfQotCiBsbHZtOjpDb25zdGFudCAqCiBDb2RlR2VuTW9kdWxlOjpHZXRBZGRyT2ZDb25zdGFudFN0cmluZyhjb25zdCBTdHJpbmdMaXRlcmFsICpMaXRlcmFsKSB7CiAgIHVuc2lnbmVkIFN0cmluZ0xlbmd0aCA9IDA7CkBAIC0yNDU2LDkgKzI0NjMsNyBAQAogCiAgIGlmICghTlNDb25zdGFudFN0cmluZ1R5cGUpIHsKICAgICAvLyBDb25zdHJ1Y3QgdGhlIHR5cGUgZm9yIGEgY29uc3RhbnQgTlNTdHJpbmcuCi0gICAgUmVjb3JkRGVjbCAqRCA9IENyZWF0ZVJlY29yZERlY2woQ29udGV4dCwgVFRLX1N0cnVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb250ZXh0LklkZW50cy5nZXQoIl9fYnVpbHRpbl9OU1N0cmluZyIpKTsKKyAgICBSZWNvcmREZWNsICpEID0gQ29udGV4dC5idWlsZEltcGxpY2l0UmVjb3JkKCJfX2J1aWx0aW5fTlNTdHJpbmciKTsKICAgICBELT5zdGFydERlZmluaXRpb24oKTsKICAgICAgIAogICAgIFF1YWxUeXBlIEZpZWxkVHlwZXNbM107CkBAIC0yNTIxLDEyICsyNTI2LDEzIEBACiAgIEdWID0gbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKGdldE1vZHVsZSgpLCBDLT5nZXRUeXBlKCksIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhcmlhYmxlOjpQcml2YXRlTGlua2FnZSwgQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl91bm5hbWVkX25zc3RyaW5nXyIpOworICBjb25zdCBjaGFyICpOU1N0cmluZ1NlY3Rpb24gPSAiX19PQkpDLF9fY3N0cmluZ19vYmplY3QscmVndWxhcixub19kZWFkX3N0cmlwIjsKKyAgY29uc3QgY2hhciAqTlNTdHJpbmdOb25GcmFnaWxlQUJJU2VjdGlvbiA9CisgICAgICAiX19EQVRBLF9fb2JqY19zdHJpbmdvYmoscmVndWxhcixub19kZWFkX3N0cmlwIjsKICAgLy8gRklYTUUuIEZpeCBzZWN0aW9uLgotICBpZiAoY29uc3QgY2hhciAqU2VjdCA9IAotICAgICAgICBMYW5nT3B0cy5PYmpDUnVudGltZS5pc05vbkZyYWdpbGUoKSAKLSAgICAgICAgICA/IGdldFRhcmdldCgpLmdldE5TU3RyaW5nTm9uRnJhZ2lsZUFCSVNlY3Rpb24oKSAKLSAgICAgICAgICA6IGdldFRhcmdldCgpLmdldE5TU3RyaW5nU2VjdGlvbigpKQotICAgIEdWLT5zZXRTZWN0aW9uKFNlY3QpOworICBHVi0+c2V0U2VjdGlvbihMYW5nT3B0cy5PYmpDUnVudGltZS5pc05vbkZyYWdpbGUoKQorICAgICAgICAgICAgICAgICAgICAgPyBOU1N0cmluZ05vbkZyYWdpbGVBQklTZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICA6IE5TU3RyaW5nU2VjdGlvbik7CiAgIEVudHJ5LnNldFZhbHVlKEdWKTsKICAgCiAgIHJldHVybiBHVjsKQEAgLTI1MzQsOSArMjU0MCw3IEBACiAKIFF1YWxUeXBlIENvZGVHZW5Nb2R1bGU6OmdldE9iakNGYXN0RW51bWVyYXRpb25TdGF0ZVR5cGUoKSB7CiAgIGlmIChPYmpDRmFzdEVudW1lcmF0aW9uU3RhdGVUeXBlLmlzTnVsbCgpKSB7Ci0gICAgUmVjb3JkRGVjbCAqRCA9IENyZWF0ZVJlY29yZERlY2woQ29udGV4dCwgVFRLX1N0cnVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCi0gICAgICAgICAgICAgICAgICAgICAgJkNvbnRleHQuSWRlbnRzLmdldCgiX19vYmpjRmFzdEVudW1lcmF0aW9uU3RhdGUiKSk7CisgICAgUmVjb3JkRGVjbCAqRCA9IENvbnRleHQuYnVpbGRJbXBsaWNpdFJlY29yZCgiX19vYmpjRmFzdEVudW1lcmF0aW9uU3RhdGUiKTsKICAgICBELT5zdGFydERlZmluaXRpb24oKTsKICAgICAKICAgICBRdWFsVHlwZSBGaWVsZFR5cGVzW10gPSB7CkBAIC0yNjEzLDI1ICsyNjE3LDY3IEBACiBsbHZtOjpDb25zdGFudCAqCiBDb2RlR2VuTW9kdWxlOjpHZXRBZGRyT2ZDb25zdGFudFN0cmluZ0Zyb21MaXRlcmFsKGNvbnN0IFN0cmluZ0xpdGVyYWwgKlMpIHsKICAgQ2hhclVuaXRzIEFsaWduID0gZ2V0Q29udGV4dCgpLmdldEFsaWduT2ZHbG9iYWxWYXJJbkNoYXJzKFMtPmdldFR5cGUoKSk7Ci0gIGlmIChTLT5pc0FzY2lpKCkgfHwgUy0+aXNVVEY4KCkpIHsKLSAgICBTbWFsbFN0cmluZzw2ND4gU3RyKFMtPmdldFN0cmluZygpKTsKLSAgICAKLSAgICAvLyBSZXNpemUgdGhlIHN0cmluZyB0byB0aGUgcmlnaHQgc2l6ZSwgd2hpY2ggaXMgaW5kaWNhdGVkIGJ5IGl0cyB0eXBlLgotICAgIGNvbnN0IENvbnN0YW50QXJyYXlUeXBlICpDQVQgPSBDb250ZXh0LmdldEFzQ29uc3RhbnRBcnJheVR5cGUoUy0+Z2V0VHlwZSgpKTsKLSAgICBTdHIucmVzaXplKENBVC0+Z2V0U2l6ZSgpLmdldFpFeHRWYWx1ZSgpKTsKLSAgICByZXR1cm4gR2V0QWRkck9mQ29uc3RhbnRTdHJpbmcoU3RyLCAvKkdsb2JhbE5hbWUqLyAwLCBBbGlnbi5nZXRRdWFudGl0eSgpKTsKKworICBsbHZtOjpTdHJpbmdNYXBFbnRyeTxsbHZtOjpHbG9iYWxWYXJpYWJsZSAqPiAqRW50cnkgPSBudWxscHRyOworICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YgPSBudWxscHRyOworICBpZiAoIUxhbmdPcHRzLldyaXRhYmxlU3RyaW5ncykgeworICAgIGxsdm06OlN0cmluZ01hcDxsbHZtOjpHbG9iYWxWYXJpYWJsZSAqPiAqQ29uc3RhbnRTdHJpbmdNYXAgPSBudWxscHRyOworICAgIHN3aXRjaCAoUy0+Z2V0Q2hhckJ5dGVXaWR0aCgpKSB7CisgICAgY2FzZSAxOgorICAgICAgQ29uc3RhbnRTdHJpbmdNYXAgPSAmQ29uc3RhbnQxQnl0ZVN0cmluZ01hcDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIENvbnN0YW50U3RyaW5nTWFwID0gJkNvbnN0YW50MkJ5dGVTdHJpbmdNYXA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBDb25zdGFudFN0cmluZ01hcCA9ICZDb25zdGFudDRCeXRlU3RyaW5nTWFwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoInVuaGFuZGxlZCBieXRlIHdpZHRoISIpOworICAgIH0KKyAgICBFbnRyeSA9ICZDb25zdGFudFN0cmluZ01hcC0+R2V0T3JDcmVhdGVWYWx1ZShTLT5nZXRCeXRlcygpKTsKKyAgICBHViA9IEVudHJ5LT5nZXRWYWx1ZSgpOwogICB9CiAKLSAgLy8gRklYTUU6IHRoZSBmb2xsb3dpbmcgZG9lcyBub3QgbWVtb2l6ZSB3aWRlIHN0cmluZ3MuCi0gIGxsdm06OkNvbnN0YW50ICpDID0gR2V0Q29uc3RhbnRBcnJheUZyb21TdHJpbmdMaXRlcmFsKFMpOwotICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YgPQotICAgIG5ldyBsbHZtOjpHbG9iYWxWYXJpYWJsZShnZXRNb2R1bGUoKSxDLT5nZXRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICFMYW5nT3B0cy5Xcml0YWJsZVN0cmluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpQcml2YXRlTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQywiLnN0ciIpOworICBpZiAoIUdWKSB7CisgICAgU21hbGxTdHJpbmc8MjU2PiBNYW5nbGVkTmFtZUJ1ZmZlcjsKKyAgICBTdHJpbmdSZWYgR2xvYmFsVmFyaWFibGVOYW1lOworICAgIGxsdm06Okdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTFQ7CiAKLSAgR1YtPnNldEFsaWdubWVudChBbGlnbi5nZXRRdWFudGl0eSgpKTsKLSAgR1YtPnNldFVubmFtZWRBZGRyKHRydWUpOworICAgIC8vIE1hbmdsZSB0aGUgc3RyaW5nIGxpdGVyYWwgaWYgdGhlIEFCSSBhbGxvd3MgZm9yIGl0LiAgSG93ZXZlciwgd2UgY2Fubm90CisgICAgLy8gZG8gdGhpcyBpZiAgd2UgYXJlIGNvbXBpbGluZyB3aXRoIEFTYW4gb3IgLWZ3cml0YWJsZS1zdHJpbmdzIGJlY2F1c2UgdGhleQorICAgIC8vIHJlbHkgb24gc3RyaW5ncyBoYXZpbmcgbm9ybWFsIGxpbmthZ2UuCisgICAgaWYgKCFMYW5nT3B0cy5Xcml0YWJsZVN0cmluZ3MgJiYgIVNhbk9wdHMuQWRkcmVzcyAmJgorICAgICAgICBnZXRDWFhBQkkoKS5nZXRNYW5nbGVDb250ZXh0KCkuc2hvdWxkTWFuZ2xlU3RyaW5nTGl0ZXJhbChTKSkgeworICAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPdXQoTWFuZ2xlZE5hbWVCdWZmZXIpOworICAgICAgZ2V0Q1hYQUJJKCkuZ2V0TWFuZ2xlQ29udGV4dCgpLm1hbmdsZVN0cmluZ0xpdGVyYWwoUywgT3V0KTsKKyAgICAgIE91dC5mbHVzaCgpOworCisgICAgICBMVCA9IGxsdm06Okdsb2JhbFZhbHVlOjpMaW5rT25jZU9EUkxpbmthZ2U7CisgICAgICBHbG9iYWxWYXJpYWJsZU5hbWUgPSBNYW5nbGVkTmFtZUJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgTFQgPSBsbHZtOjpHbG9iYWxWYWx1ZTo6UHJpdmF0ZUxpbmthZ2U7OworICAgICAgR2xvYmFsVmFyaWFibGVOYW1lID0gIi5zdHIiOworICAgIH0KKworICAgIC8vIE9wZW5DTCB2MS4yIHM2LjUuMzogYSBzdHJpbmcgbGl0ZXJhbCBpcyBpbiB0aGUgY29uc3RhbnQgYWRkcmVzcyBzcGFjZS4KKyAgICB1bnNpZ25lZCBBZGRyU3BhY2UgPSAwOworICAgIGlmIChnZXRMYW5nT3B0cygpLk9wZW5DTCkKKyAgICAgIEFkZHJTcGFjZSA9IGdldENvbnRleHQoKS5nZXRUYXJnZXRBZGRyZXNzU3BhY2UoTGFuZ0FTOjpvcGVuY2xfY29uc3RhbnQpOworCisgICAgbGx2bTo6Q29uc3RhbnQgKkMgPSBHZXRDb25zdGFudEFycmF5RnJvbVN0cmluZ0xpdGVyYWwoUyk7CisgICAgR1YgPSBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoCisgICAgICAgIGdldE1vZHVsZSgpLCBDLT5nZXRUeXBlKCksICFMYW5nT3B0cy5Xcml0YWJsZVN0cmluZ3MsIExULCBDLAorICAgICAgICBHbG9iYWxWYXJpYWJsZU5hbWUsIC8qSW5zZXJ0QmVmb3JlPSovbnVsbHB0ciwKKyAgICAgICAgbGx2bTo6R2xvYmFsVmFyaWFibGU6Ok5vdFRocmVhZExvY2FsLCBBZGRyU3BhY2UpOworICAgIEdWLT5zZXRVbm5hbWVkQWRkcih0cnVlKTsKKyAgICBpZiAoRW50cnkpCisgICAgICBFbnRyeS0+c2V0VmFsdWUoR1YpOworICB9CisKKyAgaWYgKEFsaWduLmdldFF1YW50aXR5KCkgPiBHVi0+Z2V0QWxpZ25tZW50KCkpCisgICAgR1YtPnNldEFsaWdubWVudChBbGlnbi5nZXRRdWFudGl0eSgpKTsKKwogICByZXR1cm4gR1Y7CiB9CiAKQEAgLTI2NTYsNyArMjcwMiw3IEBACiAgIGxsdm06OkNvbnN0YW50ICpDID0KICAgICAgIGxsdm06OkNvbnN0YW50RGF0YUFycmF5OjpnZXRTdHJpbmcoQ0dNLmdldExMVk1Db250ZXh0KCksIHN0ciwgZmFsc2UpOwogCi0gIC8vIE9wZW5DTCB2MS4xIHM2LjUuMzogYSBzdHJpbmcgbGl0ZXJhbCBpcyBpbiB0aGUgY29uc3RhbnQgYWRkcmVzcyBzcGFjZS4KKyAgLy8gT3BlbkNMIHYxLjIgczYuNS4zOiBhIHN0cmluZyBsaXRlcmFsIGlzIGluIHRoZSBjb25zdGFudCBhZGRyZXNzIHNwYWNlLgogICB1bnNpZ25lZCBBZGRyU3BhY2UgPSAwOwogICBpZiAoQ0dNLmdldExhbmdPcHRzKCkuT3BlbkNMKQogICAgIEFkZHJTcGFjZSA9IENHTS5nZXRDb250ZXh0KCkuZ2V0VGFyZ2V0QWRkcmVzc1NwYWNlKExhbmdBUzo6b3BlbmNsX2NvbnN0YW50KTsKQEAgLTI2OTUsNyArMjc0MSw3IEBACiAgICAgcmV0dXJuIEdlbmVyYXRlU3RyaW5nTGl0ZXJhbChTdHIsIGZhbHNlLCAqdGhpcywgR2xvYmFsTmFtZSwgQWxpZ25tZW50KTsKIAogICBsbHZtOjpTdHJpbmdNYXBFbnRyeTxsbHZtOjpHbG9iYWxWYXJpYWJsZSAqPiAmRW50cnkgPQotICAgIENvbnN0YW50U3RyaW5nTWFwLkdldE9yQ3JlYXRlVmFsdWUoU3RyKTsKKyAgICBDb25zdGFudDFCeXRlU3RyaW5nTWFwLkdldE9yQ3JlYXRlVmFsdWUoU3RyKTsKIAogICBpZiAobGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWID0gRW50cnkuZ2V0VmFsdWUoKSkgewogICAgIGlmIChBbGlnbm1lbnQgPiBHVi0+Z2V0QWxpZ25tZW50KCkpIHsKQEAgLTI3OTMsMTAgKzI4MzksNyBAQAogLy8vIHByb3BlcnRpZXMgZm9yIGFuIGltcGxlbWVudGF0aW9uLgogdm9pZCBDb2RlR2VuTW9kdWxlOjpFbWl0T2JqQ1Byb3BlcnR5SW1wbGVtZW50YXRpb25zKGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqRCkgewotICBmb3IgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2w6OnByb3BpbXBsX2l0ZXJhdG9yCi0gICAgICAgICBpID0gRC0+cHJvcGltcGxfYmVnaW4oKSwgZSA9IEQtPnByb3BpbXBsX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgIE9iakNQcm9wZXJ0eUltcGxEZWNsICpQSUQgPSAqaTsKLQorICBmb3IgKGNvbnN0IGF1dG8gKlBJRCA6IEQtPnByb3BlcnR5X2ltcGxzKCkpIHsKICAgICAvLyBEeW5hbWljIGlzIGp1c3QgZm9yIHR5cGUtY2hlY2tpbmcuCiAgICAgaWYgKFBJRC0+Z2V0UHJvcGVydHlJbXBsZW1lbnRhdGlvbigpID09IE9iakNQcm9wZXJ0eUltcGxEZWNsOjpTeW50aGVzaXplKSB7CiAgICAgICBPYmpDUHJvcGVydHlEZWNsICpQRCA9IFBJRC0+Z2V0UHJvcGVydHlEZWNsKCk7CkBAIC0yODcxLDEzICsyOTE0LDEyIEBACiAKIC8vLyBFbWl0TmFtZXNwYWNlIC0gRW1pdCBhbGwgZGVjbGFyYXRpb25zIGluIGEgbmFtZXNwYWNlLgogdm9pZCBDb2RlR2VuTW9kdWxlOjpFbWl0TmFtZXNwYWNlKGNvbnN0IE5hbWVzcGFjZURlY2wgKk5EKSB7Ci0gIGZvciAoUmVjb3JkRGVjbDo6ZGVjbF9pdGVyYXRvciBJID0gTkQtPmRlY2xzX2JlZ2luKCksIEUgPSBORC0+ZGVjbHNfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoY29uc3QgVmFyRGVjbCAqVkQgPSBkeW5fY2FzdDxWYXJEZWNsPigqSSkpCisgIGZvciAoYXV0byAqSSA6IE5ELT5kZWNscygpKSB7CisgICAgaWYgKGNvbnN0IGF1dG8gKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oSSkpCiAgICAgICBpZiAoVkQtPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkgIT0gVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb24gJiYKICAgICAgICAgICBWRC0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSAhPSBUU0tfVW5kZWNsYXJlZCkKICAgICAgICAgY29udGludWU7Ci0gICAgRW1pdFRvcExldmVsRGVjbCgqSSk7CisgICAgRW1pdFRvcExldmVsRGVjbChJKTsKICAgfQogfQogCkBAIC0yODg5LDE3ICsyOTMxLDE0IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgZm9yIChSZWNvcmREZWNsOjpkZWNsX2l0ZXJhdG9yIEkgPSBMU0QtPmRlY2xzX2JlZ2luKCksIEUgPSBMU0QtPmRlY2xzX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7CisgIGZvciAoYXV0byAqSSA6IExTRC0+ZGVjbHMoKSkgewogICAgIC8vIE1ldGEtZGF0YSBmb3IgT2JqQyBjbGFzcyBpbmNsdWRlcyByZWZlcmVuY2VzIHRvIGltcGxlbWVudGVkIG1ldGhvZHMuCiAgICAgLy8gR2VuZXJhdGUgY2xhc3MncyBtZXRob2QgZGVmaW5pdGlvbnMgZmlyc3QuCi0gICAgaWYgKE9iakNJbXBsRGVjbCAqT0lEID0gZHluX2Nhc3Q8T2JqQ0ltcGxEZWNsPigqSSkpIHsKLSAgICAgIGZvciAoT2JqQ0NvbnRhaW5lckRlY2w6Om1ldGhvZF9pdGVyYXRvciBNID0gT0lELT5tZXRoX2JlZ2luKCksCi0gICAgICAgICAgIE1FbmQgPSBPSUQtPm1ldGhfZW5kKCk7Ci0gICAgICAgICAgIE0gIT0gTUVuZDsgKytNKQotICAgICAgICBFbWl0VG9wTGV2ZWxEZWNsKCpNKTsKKyAgICBpZiAoYXV0byAqT0lEID0gZHluX2Nhc3Q8T2JqQ0ltcGxEZWNsPihJKSkgeworICAgICAgZm9yIChhdXRvICpNIDogT0lELT5tZXRob2RzKCkpCisgICAgICAgIEVtaXRUb3BMZXZlbERlY2woTSk7CiAgICAgfQotICAgIEVtaXRUb3BMZXZlbERlY2woKkkpOworICAgIEVtaXRUb3BMZXZlbERlY2woSSk7CiAgIH0KIH0KIApAQCAtMjk0MCw3ICsyOTc5LDYgQEAKICAgICBicmVhazsKICAgICAvLyBObyBjb2RlIGdlbmVyYXRpb24gbmVlZGVkLgogICBjYXNlIERlY2w6OlVzaW5nU2hhZG93OgotICBjYXNlIERlY2w6OlVzaW5nOgogICBjYXNlIERlY2w6OkNsYXNzVGVtcGxhdGU6CiAgIGNhc2UgRGVjbDo6VmFyVGVtcGxhdGU6CiAgIGNhc2UgRGVjbDo6VmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb246CkBAIC0yOTQ5LDYgKzI5ODcsMTAgQEAKICAgY2FzZSBEZWNsOjpCbG9jazoKICAgY2FzZSBEZWNsOjpFbXB0eToKICAgICBicmVhazsKKyAgY2FzZSBEZWNsOjpVc2luZzogICAgICAgICAgLy8gdXNpbmcgWDsgW0MrK10KKyAgICBpZiAoQ0dEZWJ1Z0luZm8gKkRJID0gZ2V0TW9kdWxlRGVidWdJbmZvKCkpCisgICAgICAgIERJLT5FbWl0VXNpbmdEZWNsKGNhc3Q8VXNpbmdEZWNsPigqRCkpOworICAgIHJldHVybjsKICAgY2FzZSBEZWNsOjpOYW1lc3BhY2VBbGlhczoKICAgICBpZiAoQ0dEZWJ1Z0luZm8gKkRJID0gZ2V0TW9kdWxlRGVidWdJbmZvKCkpCiAgICAgICAgIERJLT5FbWl0TmFtZXNwYWNlQWxpYXMoY2FzdDxOYW1lc3BhY2VBbGlhc0RlY2w+KCpEKSk7CkBAIC0zMDQ4LDcgKzMwOTAsMTUgQEAKIAogICAgIEltcG9ydGVkTW9kdWxlcy5pbnNlcnQoSW1wb3J0LT5nZXRJbXBvcnRlZE1vZHVsZSgpKTsKICAgICBicmVhazsKLSB9CisgIH0KKworICBjYXNlIERlY2w6OkNsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbjogeworICAgIGNvbnN0IENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKlNwZWMgPQorICAgICAgICBjYXN0PENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+KEQpOworICAgIGlmIChEZWJ1Z0luZm8gJiYKKyAgICAgICAgU3BlYy0+Z2V0U3BlY2lhbGl6YXRpb25LaW5kKCkgPT0gVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlZmluaXRpb24pCisgICAgICBEZWJ1Z0luZm8tPmNvbXBsZXRlVGVtcGxhdGVEZWZpbml0aW9uKCpTcGVjKTsKKyAgfQogCiAgIGRlZmF1bHQ6CiAgICAgLy8gTWFrZSBzdXJlIHdlIGhhbmRsZWQgZXZlcnl0aGluZyB3ZSBzaG91bGQsIGV2ZXJ5IG90aGVyIGtpbmQgaXMgYQpAQCAtMzA5NCw3ICszMTQ0LDcgQEAKICAgICBJZGVudGlmaWVySW5mbyAqTmFtZSA9IEktPmZpcnN0OwogICAgIGxsdm06Okdsb2JhbFZhbHVlICpWYWwgPSBJLT5zZWNvbmQ7CiAgICAgaWYgKFZhbCAmJiAhZ2V0TW9kdWxlKCkuZ2V0TmFtZWRWYWx1ZShOYW1lLT5nZXROYW1lKCkpKQotICAgICAgQWRkVXNlZEdsb2JhbChuZXcgbGx2bTo6R2xvYmFsQWxpYXMoVmFsLT5nZXRUeXBlKCksIFZhbC0+Z2V0TGlua2FnZSgpLAorICAgICAgYWRkVXNlZEdsb2JhbChuZXcgbGx2bTo6R2xvYmFsQWxpYXMoVmFsLT5nZXRUeXBlKCksIFZhbC0+Z2V0TGlua2FnZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS0+Z2V0TmFtZSgpLCBWYWwsICZnZXRNb2R1bGUoKSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9Db2RlR2VuTW9kdWxlLmggYi9saWIvQ29kZUdlbi9Db2RlR2VuTW9kdWxlLmgKaW5kZXggYzE2MTIyNC4uMGQxM2JkYyAxMDA2NDQKLS0tIGEvbGliL0NvZGVHZW4vQ29kZUdlbk1vZHVsZS5oCisrKyBiL2xpYi9Db2RlR2VuL0NvZGVHZW5Nb2R1bGUuaApAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgogI2luY2x1ZGUgImxsdm0vSVIvQ2FsbGluZ0NvbnYuaCIKICNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKICNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvU3BlY2lhbENhc2VMaXN0LmgiCiAKIG5hbWVzcGFjZSBsbHZtIHsKQEAgLTg1LDcgKzg1LDggQEAKICAgY2xhc3MgQ0dDVURBUnVudGltZTsKICAgY2xhc3MgQmxvY2tGaWVsZEZsYWdzOwogICBjbGFzcyBGdW5jdGlvbkFyZ0xpc3Q7Ci0gIAorICBjbGFzcyBQR09Qcm9maWxlRGF0YTsKKwogICBzdHJ1Y3QgT3JkZXJHbG9iYWxJbml0cyB7CiAgICAgdW5zaWduZWQgaW50IHByaW9yaXR5OwogICAgIHVuc2lnbmVkIGludCBsZXhfb3JkZXI7CkBAIC05OCwxMCArOTksOCBAQAogICAgIH0KICAgICAKICAgICBib29sIG9wZXJhdG9yPChjb25zdCBPcmRlckdsb2JhbEluaXRzICZSSFMpIGNvbnN0IHsKLSAgICAgIGlmIChwcmlvcml0eSA8IFJIUy5wcmlvcml0eSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAKLSAgICAgIHJldHVybiBwcmlvcml0eSA9PSBSSFMucHJpb3JpdHkgJiYgbGV4X29yZGVyIDwgUkhTLmxleF9vcmRlcjsKKyAgICAgIHJldHVybiBzdGQ6OnRpZShwcmlvcml0eSwgbGV4X29yZGVyKSA8CisgICAgICAgICAgICAgc3RkOjp0aWUoUkhTLnByaW9yaXR5LCBSSFMubGV4X29yZGVyKTsKICAgICB9CiAgIH07CiAKQEAgLTIzNiw3ICsyMzUsNyBAQAogICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3M7CiAgIGNvbnN0IGxsdm06OkRhdGFMYXlvdXQgJlRoZURhdGFMYXlvdXQ7CiAgIGNvbnN0IFRhcmdldEluZm8gJlRhcmdldDsKLSAgQ0dDWFhBQkkgJkFCSTsKKyAgc3RkOjp1bmlxdWVfcHRyPENHQ1hYQUJJPiBBQkk7CiAgIGxsdm06OkxMVk1Db250ZXh0ICZWTUNvbnRleHQ7CiAKICAgQ29kZUdlblRCQUEgKlRCQUE7CkBAIC0yNTgsNiArMjU3LDcgQEAKICAgQVJDRW50cnlwb2ludHMgKkFSQ0RhdGE7CiAgIGxsdm06Ok1ETm9kZSAqTm9PYmpDQVJDRXhjZXB0aW9uc01ldGFkYXRhOwogICBSUkVudHJ5cG9pbnRzICpSUkRhdGE7CisgIFBHT1Byb2ZpbGVEYXRhICpQR09EYXRhOwogCiAgIC8vIFdlYWtSZWZSZWZlcmVuY2VzIC0gQSBzZXQgb2YgcmVmZXJlbmNlcyB0aGF0IGhhdmUgb25seSBiZWVuIHNlZW4gdmlhCiAgIC8vIGEgd2Vha3JlZiBzbyBmYXIuIFRoaXMgaXMgdXNlZCB0byByZW1vdmUgdGhlIHdlYWsgb2YgdGhlIHJlZmVyZW5jZSBpZiB3ZQpAQCAtMjczLDcgKzI3MywxNSBAQAogICAvLy8gRGVmZXJyZWREZWNsc1RvRW1pdCAtIFRoaXMgaXMgYSBsaXN0IG9mIGRlZmVycmVkIGRlY2xzIHdoaWNoIHdlIGhhdmUgc2VlbgogICAvLy8gdGhhdCAqYXJlKiBhY3R1YWxseSByZWZlcmVuY2VkLiAgVGhlc2UgZ2V0IGNvZGUgZ2VuZXJhdGVkIHdoZW4gdGhlIG1vZHVsZQogICAvLy8gaXMgZG9uZS4KLSAgc3RkOjp2ZWN0b3I8R2xvYmFsRGVjbD4gRGVmZXJyZWREZWNsc1RvRW1pdDsKKyAgc3RydWN0IERlZmVycmVkR2xvYmFsIHsKKyAgICBEZWZlcnJlZEdsb2JhbChsbHZtOjpHbG9iYWxWYWx1ZSAqR1YsIEdsb2JhbERlY2wgR0QpIDogR1YoR1YpLCBHRChHRCkge30KKyAgICBsbHZtOjpBc3NlcnRpbmdWSDxsbHZtOjpHbG9iYWxWYWx1ZT4gR1Y7CisgICAgR2xvYmFsRGVjbCBHRDsKKyAgfTsKKyAgc3RkOjp2ZWN0b3I8RGVmZXJyZWRHbG9iYWw+IERlZmVycmVkRGVjbHNUb0VtaXQ7CisgIHZvaWQgYWRkRGVmZXJyZWREZWNsVG9FbWl0KGxsdm06Okdsb2JhbFZhbHVlICpHViwgR2xvYmFsRGVjbCBHRCkgeworICAgIERlZmVycmVkRGVjbHNUb0VtaXQucHVzaF9iYWNrKERlZmVycmVkR2xvYmFsKEdWLCBHRCkpOworICB9CiAKICAgLy8vIExpc3Qgb2YgYWxpYXMgd2UgaGF2ZSBlbWl0dGVkLiBVc2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHdoYXQgdGhleSBwb2ludCB0bwogICAvLy8gaXMgZGVmaW5lZCBvbmNlIHdlIGdldCB0byB0aGUgZW5kIG9mIHRoZSBvZiB0aGUgdHJhbnNsYXRpb24gdW5pdC4KQEAgLTI5MCw2ICsyOTgsNyBAQAogICAvLy8gZm9yY2luZyB2aXNpYmlsaXR5IG9mIHN5bWJvbHMgd2hpY2ggbWF5IG90aGVyd2lzZSBiZSBvcHRpbWl6ZWQKICAgLy8vIG91dC4KICAgc3RkOjp2ZWN0b3I8bGx2bTo6V2Vha1ZIPiBMTFZNVXNlZDsKKyAgc3RkOjp2ZWN0b3I8bGx2bTo6V2Vha1ZIPiBMTFZNQ29tcGlsZXJVc2VkOwogCiAgIC8vLyBHbG9iYWxDdG9ycyAtIFN0b3JlIHRoZSBsaXN0IG9mIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIHRoZWlyIHJlc3BlY3RpdmUKICAgLy8vIHByaW9yaXRpZXMgdG8gYmUgZW1pdHRlZCB3aGVuIHRoZSB0cmFuc2xhdGlvbiB1bml0IGlzIGNvbXBsZXRlLgpAQCAtMzEwLDcgKzMxOSwxMCBAQAogICBsbHZtOjpTdHJpbmdNYXA8bGx2bTo6Q29uc3RhbnQqPiBBbm5vdGF0aW9uU3RyaW5nczsKIAogICBsbHZtOjpTdHJpbmdNYXA8bGx2bTo6Q29uc3RhbnQqPiBDRkNvbnN0YW50U3RyaW5nTWFwOwotICBsbHZtOjpTdHJpbmdNYXA8bGx2bTo6R2xvYmFsVmFyaWFibGUqPiBDb25zdGFudFN0cmluZ01hcDsKKworICBsbHZtOjpTdHJpbmdNYXA8bGx2bTo6R2xvYmFsVmFyaWFibGUgKj4gQ29uc3RhbnQxQnl0ZVN0cmluZ01hcDsKKyAgbGx2bTo6U3RyaW5nTWFwPGxsdm06Okdsb2JhbFZhcmlhYmxlICo+IENvbnN0YW50MkJ5dGVTdHJpbmdNYXA7CisgIGxsdm06OlN0cmluZ01hcDxsbHZtOjpHbG9iYWxWYXJpYWJsZSAqPiBDb25zdGFudDRCeXRlU3RyaW5nTWFwOwogICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsKiwgbGx2bTo6Q29uc3RhbnQgKj4gU3RhdGljTG9jYWxEZWNsTWFwOwogICBsbHZtOjpEZW5zZU1hcDxjb25zdCBEZWNsKiwgbGx2bTo6R2xvYmFsVmFyaWFibGUqPiBTdGF0aWNMb2NhbERlY2xHdWFyZE1hcDsKICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRXhwciosIGxsdm06OkNvbnN0YW50ICo+IE1hdGVyaWFsaXplZEdsb2JhbFRlbXBvcmFyeU1hcDsKQEAgLTQyMSw3ICs0MzMsNyBAQAogCiAgIEdsb2JhbERlY2wgaW5pdGlhbGl6ZWRHbG9iYWxEZWNsOwogCi0gIGxsdm06Ok93bmluZ1B0cjxsbHZtOjpTcGVjaWFsQ2FzZUxpc3Q+IFNhbml0aXplckJsYWNrbGlzdDsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06OlNwZWNpYWxDYXNlTGlzdD4gU2FuaXRpemVyQmxhY2tsaXN0OwogCiAgIGNvbnN0IFNhbml0aXplck9wdGlvbnMgJlNhbk9wdHM7CiAKQEAgLTQzMyw2ICs0NDUsOCBAQAogCiAgIH5Db2RlR2VuTW9kdWxlKCk7CiAKKyAgdm9pZCBjbGVhcigpOworCiAgIC8vLyBSZWxlYXNlIC0gRmluYWxpemUgTExWTSBjb2RlIGdlbmVyYXRpb24uCiAgIHZvaWQgUmVsZWFzZSgpOwogCkBAIC00NjksNiArNDgzLDEwIEBACiAgICAgcmV0dXJuICpSUkRhdGE7CiAgIH0KIAorICBQR09Qcm9maWxlRGF0YSAqZ2V0UEdPRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUEdPRGF0YTsKKyAgfQorCiAgIGxsdm06OkNvbnN0YW50ICpnZXRTdGF0aWNMb2NhbERlY2xBZGRyZXNzKGNvbnN0IFZhckRlY2wgKkQpIHsKICAgICByZXR1cm4gU3RhdGljTG9jYWxEZWNsTWFwW0RdOwogICB9CkBAIC01MjUsNyArNTQzLDcgQEAKICAgRGlhZ25vc3RpY3NFbmdpbmUgJmdldERpYWdzKCkgY29uc3QgeyByZXR1cm4gRGlhZ3M7IH0KICAgY29uc3QgbGx2bTo6RGF0YUxheW91dCAmZ2V0RGF0YUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIFRoZURhdGFMYXlvdXQ7IH0KICAgY29uc3QgVGFyZ2V0SW5mbyAmZ2V0VGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0OyB9Ci0gIENHQ1hYQUJJICZnZXRDWFhBQkkoKSB7IHJldHVybiBBQkk7IH0KKyAgQ0dDWFhBQkkgJmdldENYWEFCSSgpIGNvbnN0IHsgcmV0dXJuICpBQkk7IH0KICAgbGx2bTo6TExWTUNvbnRleHQgJmdldExMVk1Db250ZXh0KCkgeyByZXR1cm4gVk1Db250ZXh0OyB9CiAgIAogICBib29sIHNob3VsZFVzZVRCQUEoKSBjb25zdCB7IHJldHVybiBUQkFBICE9IDA7IH0KQEAgLTU3NywyMSArNTk1LDYgQEAKICAgLy8vIGZvciB0aGUgdGhyZWFkLWxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIEQuCiAgIHZvaWQgc2V0VExTTW9kZShsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YsIGNvbnN0IFZhckRlY2wgJkQpIGNvbnN0OwogCi0gIC8vLyBUeXBlVmlzaWJpbGl0eUtpbmQgLSBUaGUga2luZCBvZiBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBwYXNzZWQgdG8gCi0gIC8vLyBzZXRUeXBlVmlzaWJpbGl0eQotICBlbnVtIFR5cGVWaXNpYmlsaXR5S2luZCB7Ci0gICAgVFZLX0ZvclZUVCwKLSAgICBUVktfRm9yVlRhYmxlLAotICAgIFRWS19Gb3JDb25zdHJ1Y3Rpb25WVGFibGUsCi0gICAgVFZLX0ZvclJUVEksCi0gICAgVFZLX0ZvclJUVElOYW1lCi0gIH07Ci0KLSAgLy8vIHNldFR5cGVWaXNpYmlsaXR5IC0gU2V0IHRoZSB2aXNpYmlsaXR5IGZvciB0aGUgZ2l2ZW4gZ2xvYmFsCi0gIC8vLyB2YWx1ZSB3aGljaCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhIHR5cGUuCi0gIHZvaWQgc2V0VHlwZVZpc2liaWxpdHkobGx2bTo6R2xvYmFsVmFsdWUgKkdWLCBjb25zdCBDWFhSZWNvcmREZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVWaXNpYmlsaXR5S2luZCBUVkspIGNvbnN0OwotCiAgIHN0YXRpYyBsbHZtOjpHbG9iYWxWYWx1ZTo6VmlzaWJpbGl0eVR5cGVzIEdldExMVk1WaXNpYmlsaXR5KFZpc2liaWxpdHkgVikgewogICAgIHN3aXRjaCAoVikgewogICAgIGNhc2UgRGVmYXVsdFZpc2liaWxpdHk6ICAgcmV0dXJuIGxsdm06Okdsb2JhbFZhbHVlOjpEZWZhdWx0VmlzaWJpbGl0eTsKQEAgLTYzOSw5ICs2NDIsOSBAQAogICAvLy8gR2V0QWRkck9mRnVuY3Rpb24gLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiAgSWYgVHkgaXMKICAgLy8vIG5vbi1udWxsLCB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbCB1c2UgdGhlIHNwZWNpZmllZCB0eXBlIGlmIGl0IGhhcyB0bwogICAvLy8gY3JlYXRlIGl0LgotICBsbHZtOjpDb25zdGFudCAqR2V0QWRkck9mRnVuY3Rpb24oR2xvYmFsRGVjbCBHRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlR5cGUgKlR5ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yVlRhYmxlID0gZmFsc2UpOworICBsbHZtOjpDb25zdGFudCAqR2V0QWRkck9mRnVuY3Rpb24oR2xvYmFsRGVjbCBHRCwgbGx2bTo6VHlwZSAqVHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3JWVGFibGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRG9udERlZmVyID0gZmFsc2UpOwogCiAgIC8vLyBHZXRBZGRyT2ZSVFRJRGVzY3JpcHRvciAtIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgUlRUSSBkZXNjcmlwdG9yIAogICAvLy8gZm9yIHRoZSBnaXZlbiB0eXBlLgpAQCAtNzY5LDE0ICs3NzIsMTYgQEAKICAgLy8vIGdpdmVuIHR5cGUuCiAgIGxsdm06Okdsb2JhbFZhbHVlICpHZXRBZGRyT2ZDWFhDb25zdHJ1Y3Rvcihjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKmN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDdG9yVHlwZSBjdG9yVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENHRnVuY3Rpb25JbmZvICpmbkluZm8gPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENHRnVuY3Rpb25JbmZvICpmbkluZm8gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEb250RGVmZXIgPSBmYWxzZSk7CiAKICAgLy8vIEdldEFkZHJPZkNYWERlc3RydWN0b3IgLSBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZQogICAvLy8gZ2l2ZW4gdHlwZS4KICAgbGx2bTo6R2xvYmFsVmFsdWUgKkdldEFkZHJPZkNYWERlc3RydWN0b3IoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKmR0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWER0b3JUeXBlIGR0b3JUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAqZm5JbmZvID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6RnVuY3Rpb25UeXBlICpmblR5cGUgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6RnVuY3Rpb25UeXBlICpmblR5cGUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERvbnREZWZlciA9IGZhbHNlKTsKIAogICAvLy8gZ2V0QnVpbHRpbkxpYkZ1bmN0aW9uIC0gR2l2ZW4gYSBidWlsdGluIGlkIGZvciBhIGZ1bmN0aW9uIGxpa2UKICAgLy8vICJfX2J1aWx0aW5fZmFic2YiLCByZXR1cm4gYSBGdW5jdGlvbiogZm9yICJmYWJzZiIuCkBAIC03OTgsMTAgKzgwMywxMSBAQAogICB0ZW1wbGF0ZTx0eXBlbmFtZSBTb21lRGVjbD4KICAgdm9pZCBNYXliZUhhbmRsZVN0YXRpY0luRXh0ZXJuQyhjb25zdCBTb21lRGVjbCAqRCwgbGx2bTo6R2xvYmFsVmFsdWUgKkdWKTsKIAotICAvLy8gQWRkVXNlZEdsb2JhbCAtIEFkZCBhIGdsb2JhbCB3aGljaCBzaG91bGQgYmUgZm9yY2VkIHRvIGJlCi0gIC8vLyBwcmVzZW50IGluIHRoZSBvYmplY3QgZmlsZTsgdGhlc2UgYXJlIGVtaXR0ZWQgdG8gdGhlIGxsdm0udXNlZAotICAvLy8gbWV0YWRhdGEgZ2xvYmFsLgotICB2b2lkIEFkZFVzZWRHbG9iYWwobGx2bTo6R2xvYmFsVmFsdWUgKkdWKTsKKyAgLy8vIEFkZCBhIGdsb2JhbCB0byBhIGxpc3QgdG8gYmUgYWRkZWQgdG8gdGhlIGxsdm0udXNlZCBtZXRhZGF0YS4KKyAgdm9pZCBhZGRVc2VkR2xvYmFsKGxsdm06Okdsb2JhbFZhbHVlICpHVik7CisKKyAgLy8vIEFkZCBhIGdsb2JhbCB0byBhIGxpc3QgdG8gYmUgYWRkZWQgdG8gdGhlIGxsdm0uY29tcGlsZXIudXNlZCBtZXRhZGF0YS4KKyAgdm9pZCBhZGRDb21waWxlclVzZWRHbG9iYWwobGx2bTo6R2xvYmFsVmFsdWUgKkdWKTsKIAogICAvLy8gQWRkQ1hYRHRvckVudHJ5IC0gQWRkIGEgZGVzdHJ1Y3RvciBhbmQgb2JqZWN0IHRvIGFkZCB0byB0aGUgQysrIGdsb2JhbAogICAvLy8gZGVzdHJ1Y3RvciBmdW5jdGlvbi4KQEAgLTkwMiw2ICs5MDgsMTAgQEAKICAgLy8vIGFzIGEgcmV0dXJuIHR5cGUuCiAgIGJvb2wgUmV0dXJuVHlwZVVzZXNTUmV0KGNvbnN0IENHRnVuY3Rpb25JbmZvICZGSSk7CiAKKyAgLy8vIFJldHVyblNsb3RJbnRlcmZlcmVzV2l0aEFyZ3MgLSBSZXR1cm4gdHJ1ZSBpZmYgdGhlIGdpdmVuIHR5cGUgdXNlcyBhbgorICAvLy8gYXJndW1lbnQgc2xvdCB3aGVuICdzcmV0JyBpcyB1c2VkIGFzIGEgcmV0dXJuIHR5cGUuCisgIGJvb2wgUmV0dXJuU2xvdEludGVyZmVyZXNXaXRoQXJncyhjb25zdCBDR0Z1bmN0aW9uSW5mbyAmRkkpOworCiAgIC8vLyBSZXR1cm5UeXBlVXNlc0ZQUmV0IC0gUmV0dXJuIHRydWUgaWZmIHRoZSBnaXZlbiB0eXBlIHVzZXMgJ2ZwcmV0JyB3aGVuCiAgIC8vLyB1c2VkIGFzIGEgcmV0dXJuIHR5cGUuCiAgIGJvb2wgUmV0dXJuVHlwZVVzZXNGUFJldChRdWFsVHlwZSBSZXN1bHRUeXBlKTsKQEAgLTEwMDksMTIgKzEwMTksMTEgQEAKIHByaXZhdGU6CiAgIGxsdm06Okdsb2JhbFZhbHVlICpHZXRHbG9iYWxWYWx1ZShTdHJpbmdSZWYgUmVmKTsKIAotICBsbHZtOjpDb25zdGFudCAqR2V0T3JDcmVhdGVMTFZNRnVuY3Rpb24oU3RyaW5nUmVmIE1hbmdsZWROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VHlwZSAqVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxEZWNsIEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvclZUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkF0dHJpYnV0ZVNldCBFeHRyYUF0dHJzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXR0cmlidXRlU2V0KCkpOworICBsbHZtOjpDb25zdGFudCAqCisgIEdldE9yQ3JlYXRlTExWTUZ1bmN0aW9uKFN0cmluZ1JlZiBNYW5nbGVkTmFtZSwgbGx2bTo6VHlwZSAqVHksIEdsb2JhbERlY2wgRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3JWVGFibGUsIGJvb2wgRG9udERlZmVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkF0dHJpYnV0ZVNldCBFeHRyYUF0dHJzID0gbGx2bTo6QXR0cmlidXRlU2V0KCkpOworCiAgIGxsdm06OkNvbnN0YW50ICpHZXRPckNyZWF0ZUxMVk1HbG9iYWwoU3RyaW5nUmVmIE1hbmdsZWROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlBvaW50ZXJUeXBlICpQVHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFyRGVjbCAqRCwKQEAgLTEwMzcsOSArMTA0Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkZ1bmN0aW9uICpGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW5jb21wbGV0ZUZ1bmN0aW9uKTsKIAotICB2b2lkIEVtaXRHbG9iYWxEZWZpbml0aW9uKEdsb2JhbERlY2wgRCk7CisgIHZvaWQgRW1pdEdsb2JhbERlZmluaXRpb24oR2xvYmFsRGVjbCBELCBsbHZtOjpHbG9iYWxWYWx1ZSAqR1YgPSAwKTsKIAotICB2b2lkIEVtaXRHbG9iYWxGdW5jdGlvbkRlZmluaXRpb24oR2xvYmFsRGVjbCBHRCk7CisgIHZvaWQgRW1pdEdsb2JhbEZ1bmN0aW9uRGVmaW5pdGlvbihHbG9iYWxEZWNsIEdELCBsbHZtOjpHbG9iYWxWYWx1ZSAqR1YpOwogICB2b2lkIEVtaXRHbG9iYWxWYXJEZWZpbml0aW9uKGNvbnN0IFZhckRlY2wgKkQpOwogICB2b2lkIEVtaXRBbGlhc0RlZmluaXRpb24oR2xvYmFsRGVjbCBHRCk7CiAgIHZvaWQgRW1pdE9iakNQcm9wZXJ0eUltcGxlbWVudGF0aW9ucyhjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpEKTsKQEAgLTExMDQsOSArMTExMyw4IEBACiAgIC8vLyBzdGlsbCBoYXZlIGEgdXNlIGZvci4KICAgdm9pZCBFbWl0RGVmZXJyZWRWVGFibGVzKCk7CiAKLSAgLy8vIEVtaXRMTFZNVXNlZCAtIEVtaXQgdGhlIGxsdm0udXNlZCBtZXRhZGF0YSB1c2VkIHRvIGZvcmNlCi0gIC8vLyByZWZlcmVuY2VzIHRvIGdsb2JhbCB3aGljaCBtYXkgb3RoZXJ3aXNlIGJlIG9wdGltaXplZCBvdXQuCi0gIHZvaWQgRW1pdExMVk1Vc2VkKCk7CisgIC8vLyBFbWl0IHRoZSBsbHZtLnVzZWQgYW5kIGxsdm0uY29tcGlsZXIudXNlZCBtZXRhZGF0YS4KKyAgdm9pZCBlbWl0TExWTVVzZWQoKTsKIAogICAvLy8gXGJyaWVmIEVtaXQgdGhlIGxpbmsgb3B0aW9ucyBpbnRyb2R1Y2VkIGJ5IGltcG9ydGVkIG1vZHVsZXMuCiAgIHZvaWQgRW1pdE1vZHVsZUxpbmtPcHRpb25zKCk7CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9Db2RlR2VuUEdPLmNwcCBiL2xpYi9Db2RlR2VuL0NvZGVHZW5QR08uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNmI3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvQ29kZUdlbi9Db2RlR2VuUEdPLmNwcApAQCAtMCwwICsxLDEwMzMgQEAKKy8vPT09LS0tIENvZGVHZW5QR08uY3BwIC0gUEdPIEluc3RydW1lbnRhdGlvbiBmb3IgTExWTSBDb2RlR2VuIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW5zdHJ1bWVudGF0aW9uLWJhc2VkIHByb2ZpbGUtZ3VpZGVkIG9wdGltaXphdGlvbgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJDb2RlR2VuUEdPLmgiCisjaW5jbHVkZSAiQ29kZUdlbkZ1bmN0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1JlY3Vyc2l2ZUFTVFZpc2l0b3IuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdFZpc2l0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIgLy8gZm9yIHN0cnRvdWxsKCkvc3RydG9sbCgpIGRlZmluZQorI2luY2x1ZGUgImxsdm0vSVIvTURCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKKwordXNpbmcgbmFtZXNwYWNlIGNsYW5nOwordXNpbmcgbmFtZXNwYWNlIENvZGVHZW47CisKK3N0YXRpYyB2b2lkIFJlcG9ydEJhZFBHT0RhdGEoQ29kZUdlbk1vZHVsZSAmQ0dNLCBjb25zdCBjaGFyICpNZXNzYWdlKSB7CisgIERpYWdub3N0aWNzRW5naW5lICZEaWFncyA9IENHTS5nZXREaWFncygpOworICB1bnNpZ25lZCBkaWFnSUQgPSBEaWFncy5nZXRDdXN0b21EaWFnSUQoRGlhZ25vc3RpY3NFbmdpbmU6OkVycm9yLCAiJTAiKTsKKyAgRGlhZ3MuUmVwb3J0KGRpYWdJRCkgPDwgTWVzc2FnZTsKK30KKworUEdPUHJvZmlsZURhdGE6OlBHT1Byb2ZpbGVEYXRhKENvZGVHZW5Nb2R1bGUgJkNHTSwgc3RkOjpzdHJpbmcgUGF0aCkKKyAgOiBDR00oQ0dNKSB7CisgIGlmIChsbHZtOjpNZW1vcnlCdWZmZXI6OmdldEZpbGUoUGF0aCwgRGF0YUJ1ZmZlcikpIHsKKyAgICBSZXBvcnRCYWRQR09EYXRhKENHTSwgImZhaWxlZCB0byBvcGVuIHBnbyBkYXRhIGZpbGUiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoRGF0YUJ1ZmZlci0+Z2V0QnVmZmVyU2l6ZSgpID4gc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpKSB7CisgICAgUmVwb3J0QmFkUEdPRGF0YShDR00sICJwZ28gZGF0YSBmaWxlIHRvbyBiaWciKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBTY2FuIHRocm91Z2ggdGhlIGRhdGEgZmlsZSBhbmQgbWFwIGVhY2ggZnVuY3Rpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgLy8gZmlsZSBvZmZzZXQgd2hlcmUgaXRzIGNvdW50cyBhcmUgc3RvcmVkLgorICBjb25zdCBjaGFyICpCdWZmZXJTdGFydCA9IERhdGFCdWZmZXItPmdldEJ1ZmZlclN0YXJ0KCk7CisgIGNvbnN0IGNoYXIgKkJ1ZmZlckVuZCA9IERhdGFCdWZmZXItPmdldEJ1ZmZlckVuZCgpOworICBjb25zdCBjaGFyICpDdXJQdHIgPSBCdWZmZXJTdGFydDsKKyAgdWludDY0X3QgTWF4Q291bnQgPSAwOworICB3aGlsZSAoQ3VyUHRyIDwgQnVmZmVyRW5kKSB7CisgICAgLy8gUmVhZCB0aGUgZnVuY3Rpb24gbmFtZS4KKyAgICBjb25zdCBjaGFyICpGdW5jU3RhcnQgPSBDdXJQdHI7CisgICAgLy8gRm9yIE9iamVjdGl2ZS1DIG1ldGhvZHMsIHRoZSBuYW1lIG1heSBpbmNsdWRlIHdoaXRlc3BhY2UsIHNvIHNlYXJjaAorICAgIC8vIGJhY2t3YXJkIGZyb20gdGhlIGVuZCBvZiB0aGUgbGluZSB0byBmaW5kIHRoZSBzcGFjZSB0aGF0IHNlcGFyYXRlcyB0aGUKKyAgICAvLyBuYW1lIGZyb20gdGhlIG51bWJlciBvZiBjb3VudGVycy4gKFRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjayBzaW5jZSB3ZSBhcmUKKyAgICAvLyBnb2luZyB0byBjb21wbGV0ZWx5IHJlcGxhY2UgdGhpcyBmaWxlIGZvcm1hdCBpbiB0aGUgbmVhciBmdXR1cmUuKQorICAgIEN1clB0ciA9IHN0cmNocihDdXJQdHIsICdcbicpOworICAgIGlmICghQ3VyUHRyKSB7CisgICAgICBSZXBvcnRCYWRQR09EYXRhKENHTSwgInBnbyBkYXRhIGZpbGUgaGFzIG1hbGZvcm1lZCBmdW5jdGlvbiBlbnRyeSIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTdHJpbmdSZWYgRnVuY05hbWUoRnVuY1N0YXJ0LCBDdXJQdHIgLSBGdW5jU3RhcnQpOworCisgICAgLy8gU2tpcCBvdmVyIHRoZSBmdW5jdGlvbiBoYXNoLgorICAgIEN1clB0ciA9IHN0cmNocigrK0N1clB0ciwgJ1xuJyk7CisgICAgaWYgKCFDdXJQdHIpIHsKKyAgICAgIFJlcG9ydEJhZFBHT0RhdGEoQ0dNLCAicGdvIGRhdGEgZmlsZSBpcyBtaXNzaW5nIHRoZSBmdW5jdGlvbiBoYXNoIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUmVhZCB0aGUgbnVtYmVyIG9mIGNvdW50ZXJzLgorICAgIGNoYXIgKkVuZFB0cjsKKyAgICB1bnNpZ25lZCBOdW1Db3VudGVycyA9IHN0cnRvbCgrK0N1clB0ciwgJkVuZFB0ciwgMTApOworICAgIGlmIChFbmRQdHIgPT0gQ3VyUHRyIHx8ICpFbmRQdHIgIT0gJ1xuJyB8fCBOdW1Db3VudGVycyA8PSAwKSB7CisgICAgICBSZXBvcnRCYWRQR09EYXRhKENHTSwgInBnbyBkYXRhIGZpbGUgaGFzIHVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNvdW50ZXJzIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIEN1clB0ciA9IEVuZFB0cjsKKworICAgIC8vIFJlYWQgZnVuY3Rpb24gY291bnQuCisgICAgdWludDY0X3QgQ291bnQgPSBzdHJ0b2xsKEN1clB0ciwgJkVuZFB0ciwgMTApOworICAgIGlmIChFbmRQdHIgPT0gQ3VyUHRyIHx8ICpFbmRQdHIgIT0gJ1xuJykgeworICAgICAgUmVwb3J0QmFkUEdPRGF0YShDR00sICJwZ28tZGF0YSBmaWxlIGhhcyBiYWQgY291bnQgdmFsdWUiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ3VyUHRyID0gRW5kUHRyOyAvLyBQb2ludCB0byAnXG4nLgorICAgIEZ1bmN0aW9uQ291bnRzW0Z1bmNOYW1lXSA9IENvdW50OworICAgIE1heENvdW50ID0gQ291bnQgPiBNYXhDb3VudCA/IENvdW50IDogTWF4Q291bnQ7CisKKyAgICAvLyBUaGVyZSBpcyBvbmUgbGluZSBmb3IgZWFjaCBjb3VudGVyOyBza2lwIG92ZXIgdGhvc2UgbGluZXMuCisgICAgLy8gU2luY2UgZnVuY3Rpb24gY291bnQgaXMgYWxyZWFkeSByZWFkLCB3ZSBzdGFydCB0aGUgbG9vcCBmcm9tIDEuCisgICAgZm9yICh1bnNpZ25lZCBOID0gMTsgTiA8IE51bUNvdW50ZXJzOyArK04pIHsKKyAgICAgIEN1clB0ciA9IHN0cmNocigrK0N1clB0ciwgJ1xuJyk7CisgICAgICBpZiAoIUN1clB0cikgeworICAgICAgICBSZXBvcnRCYWRQR09EYXRhKENHTSwgInBnbyBkYXRhIGZpbGUgaXMgbWlzc2luZyBzb21lIGNvdW50ZXIgaW5mbyIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgLy8gU2tpcCBvdmVyIHRoZSBibGFuayBsaW5lIHNlcGFyYXRpbmcgZnVuY3Rpb25zLgorICAgIEN1clB0ciArPSAyOworCisgICAgRGF0YU9mZnNldHNbRnVuY05hbWVdID0gRnVuY1N0YXJ0IC0gQnVmZmVyU3RhcnQ7CisgIH0KKyAgTWF4RnVuY3Rpb25Db3VudCA9IE1heENvdW50OworfQorCitib29sIFBHT1Byb2ZpbGVEYXRhOjpnZXRGdW5jdGlvbkNvdW50cyhTdHJpbmdSZWYgRnVuY05hbWUsIHVpbnQ2NF90ICZGdW5jSGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmQ291bnRzKSB7CisgIC8vIEZpbmQgdGhlIHJlbGV2YW50IHNlY3Rpb24gb2YgdGhlIHBnby1kYXRhIGZpbGUuCisgIGxsdm06OlN0cmluZ01hcDx1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIE9mZnNldEl0ZXIgPQorICAgIERhdGFPZmZzZXRzLmZpbmQoRnVuY05hbWUpOworICBpZiAoT2Zmc2V0SXRlciA9PSBEYXRhT2Zmc2V0cy5lbmQoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY29uc3QgY2hhciAqQ3VyUHRyID0gRGF0YUJ1ZmZlci0+Z2V0QnVmZmVyU3RhcnQoKSArIE9mZnNldEl0ZXItPmdldFZhbHVlKCk7CisKKyAgLy8gU2tpcCBvdmVyIHRoZSBmdW5jdGlvbiBuYW1lLgorICBDdXJQdHIgPSBzdHJjaHIoQ3VyUHRyLCAnXG4nKTsKKyAgYXNzZXJ0KEN1clB0ciAmJiAicGdvLWRhdGEgaGFzIGNvcnJ1cHRlZCBmdW5jdGlvbiBlbnRyeSIpOworCisgIGNoYXIgKkVuZFB0cjsKKyAgLy8gUmVhZCB0aGUgZnVuY3Rpb24gaGFzaC4KKyAgRnVuY0hhc2ggPSBzdHJ0b2xsKCsrQ3VyUHRyLCAmRW5kUHRyLCAxMCk7CisgIGFzc2VydChFbmRQdHIgIT0gQ3VyUHRyICYmICpFbmRQdHIgPT0gJ1xuJyAmJgorICAgICAgICAgInBnby1kYXRhIGZpbGUgaGFzIGNvcnJ1cHRlZCBmdW5jdGlvbiBoYXNoIik7CisgIEN1clB0ciA9IEVuZFB0cjsKKworICAvLyBSZWFkIHRoZSBudW1iZXIgb2YgY291bnRlcnMuCisgIHVuc2lnbmVkIE51bUNvdW50ZXJzID0gc3RydG9sKCsrQ3VyUHRyLCAmRW5kUHRyLCAxMCk7CisgIGFzc2VydChFbmRQdHIgIT0gQ3VyUHRyICYmICpFbmRQdHIgPT0gJ1xuJyAmJiBOdW1Db3VudGVycyA+IDAgJiYKKyAgICAgICAgICJwZ28tZGF0YSBmaWxlIGhhcyBjb3JydXB0ZWQgbnVtYmVyIG9mIGNvdW50ZXJzIik7CisgIEN1clB0ciA9IEVuZFB0cjsKKworICBDb3VudHMucmVzZXJ2ZShOdW1Db3VudGVycyk7CisKKyAgZm9yICh1bnNpZ25lZCBOID0gMDsgTiA8IE51bUNvdW50ZXJzOyArK04pIHsKKyAgICAvLyBSZWFkIHRoZSBjb3VudCB2YWx1ZS4KKyAgICB1aW50NjRfdCBDb3VudCA9IHN0cnRvbGwoQ3VyUHRyLCAmRW5kUHRyLCAxMCk7CisgICAgaWYgKEVuZFB0ciA9PSBDdXJQdHIgfHwgKkVuZFB0ciAhPSAnXG4nKSB7CisgICAgICBSZXBvcnRCYWRQR09EYXRhKENHTSwgInBnby1kYXRhIGZpbGUgaGFzIGJhZCBjb3VudCB2YWx1ZSIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIENvdW50cy5wdXNoX2JhY2soQ291bnQpOworICAgIEN1clB0ciA9IEVuZFB0ciArIDE7CisgIH0KKworICAvLyBNYWtlIHN1cmUgdGhlIG51bWJlciBvZiBjb3VudGVycyBtYXRjaGVzIHVwLgorICBpZiAoQ291bnRzLnNpemUoKSAhPSBOdW1Db3VudGVycykgeworICAgIFJlcG9ydEJhZFBHT0RhdGEoQ0dNLCAicGdvLWRhdGEgZmlsZSBoYXMgaW5jb25zaXN0ZW50IGNvdW50ZXJzIik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ29kZUdlblBHTzo6c2V0RnVuY05hbWUobGx2bTo6RnVuY3Rpb24gKkZuKSB7CisgIFJhd0Z1bmNOYW1lID0gRm4tPmdldE5hbWUoKTsKKworICAvLyBGdW5jdGlvbiBuYW1lcyBtYXkgYmUgcHJlZml4ZWQgd2l0aCBhIGJpbmFyeSAnMScgdG8gaW5kaWNhdGUKKyAgLy8gdGhhdCB0aGUgYmFja2VuZCBzaG91bGQgbm90IG1vZGlmeSB0aGUgc3ltYm9scyBkdWUgdG8gYW55IHBsYXRmb3JtCisgIC8vIG5hbWluZyBjb252ZW50aW9uLiBEbyBub3QgaW5jbHVkZSB0aGF0ICcxJyBpbiB0aGUgUEdPIHByb2ZpbGUgbmFtZS4KKyAgaWYgKFJhd0Z1bmNOYW1lWzBdID09ICdcMScpCisgICAgUmF3RnVuY05hbWUgPSBSYXdGdW5jTmFtZS5zdWJzdHIoMSk7CisKKyAgaWYgKCFGbi0+aGFzTG9jYWxMaW5rYWdlKCkpIHsKKyAgICBQcmVmaXhlZEZ1bmNOYW1lLnJlc2V0KG5ldyBzdGQ6OnN0cmluZyhSYXdGdW5jTmFtZSkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEZvciBsb2NhbCBzeW1ib2xzLCBwcmVwZW5kIHRoZSBtYWluIGZpbGUgbmFtZSB0byBkaXN0aW5ndWlzaCB0aGVtLgorICAvLyBEbyBub3QgaW5jbHVkZSB0aGUgZnVsbCBwYXRoIGluIHRoZSBmaWxlIG5hbWUgc2luY2UgdGhlcmUncyBubyBndWFyYW50ZWUKKyAgLy8gdGhhdCBpdCB3aWxsIHN0YXkgdGhlIHNhbWUsIGUuZy4sIGlmIHRoZSBmaWxlcyBhcmUgY2hlY2tlZCBvdXQgZnJvbQorICAvLyB2ZXJzaW9uIGNvbnRyb2wgaW4gZGlmZmVyZW50IGxvY2F0aW9ucy4KKyAgUHJlZml4ZWRGdW5jTmFtZS5yZXNldChuZXcgc3RkOjpzdHJpbmcoQ0dNLmdldENvZGVHZW5PcHRzKCkuTWFpbkZpbGVOYW1lKSk7CisgIGlmIChQcmVmaXhlZEZ1bmNOYW1lLT5lbXB0eSgpKQorICAgIFByZWZpeGVkRnVuY05hbWUtPmFzc2lnbigiPHVua25vd24+Iik7CisgIFByZWZpeGVkRnVuY05hbWUtPmFwcGVuZCgiOiIpOworICBQcmVmaXhlZEZ1bmNOYW1lLT5hcHBlbmQoUmF3RnVuY05hbWUpOworfQorCitzdGF0aWMgbGx2bTo6RnVuY3Rpb24gKmdldFJlZ2lzdGVyRnVuYyhDb2RlR2VuTW9kdWxlICZDR00pIHsKKyAgcmV0dXJuIENHTS5nZXRNb2R1bGUoKS5nZXRGdW5jdGlvbigiX19sbHZtX3Byb2ZpbGVfcmVnaXN0ZXJfZnVuY3Rpb25zIik7Cit9CisKK3N0YXRpYyBsbHZtOjpCYXNpY0Jsb2NrICpnZXRPckluc2VydFJlZ2lzdGVyQkIoQ29kZUdlbk1vZHVsZSAmQ0dNKSB7CisgIC8vIERvbid0IGRvIHRoaXMgZm9yIERhcndpbi4gIGNvbXBpbGVyLXJ0IHVzZXMgbGlua2VyIG1hZ2ljLgorICBpZiAoQ0dNLmdldFRhcmdldCgpLmdldFRyaXBsZSgpLmlzT1NEYXJ3aW4oKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICAvLyBPbmx5IG5lZWQgdG8gaW5zZXJ0IHRoaXMgb25jZSBwZXIgbW9kdWxlLgorICBpZiAobGx2bTo6RnVuY3Rpb24gKlJlZ2lzdGVyRiA9IGdldFJlZ2lzdGVyRnVuYyhDR00pKQorICAgIHJldHVybiAmUmVnaXN0ZXJGLT5nZXRFbnRyeUJsb2NrKCk7CisKKyAgLy8gQ29uc3RydWN0IHRoZSBmdW5jdGlvbi4KKyAgYXV0byAqVm9pZFR5ID0gbGx2bTo6VHlwZTo6Z2V0Vm9pZFR5KENHTS5nZXRMTFZNQ29udGV4dCgpKTsKKyAgYXV0byAqUmVnaXN0ZXJGVHkgPSBsbHZtOjpGdW5jdGlvblR5cGU6OmdldChWb2lkVHksIGZhbHNlKTsKKyAgYXV0byAqUmVnaXN0ZXJGID0gbGx2bTo6RnVuY3Rpb246OkNyZWF0ZShSZWdpc3RlckZUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2xsdm1fcHJvZmlsZV9yZWdpc3Rlcl9mdW5jdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDR00uZ2V0TW9kdWxlKCkpOworICBSZWdpc3RlckYtPnNldFVubmFtZWRBZGRyKHRydWUpOworICBpZiAoQ0dNLmdldENvZGVHZW5PcHRzKCkuRGlzYWJsZVJlZFpvbmUpCisgICAgUmVnaXN0ZXJGLT5hZGRGbkF0dHIobGx2bTo6QXR0cmlidXRlOjpOb1JlZFpvbmUpOworCisgIC8vIENvbnN0cnVjdCBhbmQgcmV0dXJuIHRoZSBlbnRyeSBibG9jay4KKyAgYXV0byAqQkIgPSBsbHZtOjpCYXNpY0Jsb2NrOjpDcmVhdGUoQ0dNLmdldExMVk1Db250ZXh0KCksICIiLCBSZWdpc3RlckYpOworICBDR0J1aWxkZXJUeSBCdWlsZGVyKEJCKTsKKyAgQnVpbGRlci5DcmVhdGVSZXRWb2lkKCk7CisgIHJldHVybiBCQjsKK30KKworc3RhdGljIGxsdm06OkNvbnN0YW50ICpnZXRPckluc2VydFJ1bnRpbWVSZWdpc3RlcihDb2RlR2VuTW9kdWxlICZDR00pIHsKKyAgYXV0byAqVm9pZFR5ID0gbGx2bTo6VHlwZTo6Z2V0Vm9pZFR5KENHTS5nZXRMTFZNQ29udGV4dCgpKTsKKyAgYXV0byAqVm9pZFB0clR5ID0gbGx2bTo6VHlwZTo6Z2V0SW50OFB0clR5KENHTS5nZXRMTFZNQ29udGV4dCgpKTsKKyAgYXV0byAqUnVudGltZVJlZ2lzdGVyVHkgPSBsbHZtOjpGdW5jdGlvblR5cGU6OmdldChWb2lkVHksIFZvaWRQdHJUeSwgZmFsc2UpOworICByZXR1cm4gQ0dNLmdldE1vZHVsZSgpLmdldE9ySW5zZXJ0RnVuY3Rpb24oIl9fbGx2bV9wcm9maWxlX3JlZ2lzdGVyX2Z1bmN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVSZWdpc3RlclR5KTsKK30KKworc3RhdGljIGJvb2wgaXNNYWNoTyhjb25zdCBDb2RlR2VuTW9kdWxlICZDR00pIHsKKyAgcmV0dXJuIENHTS5nZXRUYXJnZXQoKS5nZXRUcmlwbGUoKS5pc09TQmluRm9ybWF0TWFjaE8oKTsKK30KKworc3RhdGljIFN0cmluZ1JlZiBnZXRDb3VudGVyc1NlY3Rpb24oY29uc3QgQ29kZUdlbk1vZHVsZSAmQ0dNKSB7CisgIHJldHVybiBpc01hY2hPKENHTSkgPyAiX19EQVRBLF9fbGx2bV9wcmZfY250cyIgOiAiX19sbHZtX3ByZl9jbnRzIjsKK30KKworc3RhdGljIFN0cmluZ1JlZiBnZXROYW1lU2VjdGlvbihjb25zdCBDb2RlR2VuTW9kdWxlICZDR00pIHsKKyAgcmV0dXJuIGlzTWFjaE8oQ0dNKSA/ICJfX0RBVEEsX19sbHZtX3ByZl9uYW1lcyIgOiAiX19sbHZtX3ByZl9uYW1lcyI7Cit9CisKK3N0YXRpYyBTdHJpbmdSZWYgZ2V0RGF0YVNlY3Rpb24oY29uc3QgQ29kZUdlbk1vZHVsZSAmQ0dNKSB7CisgIHJldHVybiBpc01hY2hPKENHTSkgPyAiX19EQVRBLF9fbGx2bV9wcmZfZGF0YSIgOiAiX19sbHZtX3ByZl9kYXRhIjsKK30KKworbGx2bTo6R2xvYmFsVmFyaWFibGUgKkNvZGVHZW5QR086OmJ1aWxkRGF0YVZhcigpIHsKKyAgLy8gQ3JlYXRlIG5hbWUgdmFyaWFibGUuCisgIGxsdm06OkxMVk1Db250ZXh0ICZDdHggPSBDR00uZ2V0TExWTUNvbnRleHQoKTsKKyAgYXV0byAqVmFyTmFtZSA9IGxsdm06OkNvbnN0YW50RGF0YUFycmF5OjpnZXRTdHJpbmcoQ3R4LCBnZXRGdW5jTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIGF1dG8gKk5hbWUgPSBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoQ0dNLmdldE1vZHVsZSgpLCBWYXJOYW1lLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgVmFyTGlua2FnZSwgVmFyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGdW5jVmFyTmFtZSgibmFtZSIpKTsKKyAgTmFtZS0+c2V0U2VjdGlvbihnZXROYW1lU2VjdGlvbihDR00pKTsKKyAgTmFtZS0+c2V0QWxpZ25tZW50KDEpOworCisgIC8vIENyZWF0ZSBkYXRhIHZhcmlhYmxlLgorICBhdXRvICpJbnQzMlR5ID0gbGx2bTo6VHlwZTo6Z2V0SW50MzJUeShDdHgpOworICBhdXRvICpJbnQ2NFR5ID0gbGx2bTo6VHlwZTo6Z2V0SW50NjRUeShDdHgpOworICBhdXRvICpJbnQ4UHRyVHkgPSBsbHZtOjpUeXBlOjpnZXRJbnQ4UHRyVHkoQ3R4KTsKKyAgYXV0byAqSW50NjRQdHJUeSA9IGxsdm06OlR5cGU6OmdldEludDY0UHRyVHkoQ3R4KTsKKyAgbGx2bTo6VHlwZSAqRGF0YVR5cGVzW10gPSB7CisgICAgSW50MzJUeSwgSW50MzJUeSwgSW50NjRUeSwgSW50OFB0clR5LCBJbnQ2NFB0clR5CisgIH07CisgIGF1dG8gKkRhdGFUeSA9IGxsdm06OlN0cnVjdFR5cGU6OmdldChDdHgsIG1ha2VBcnJheVJlZihEYXRhVHlwZXMpKTsKKyAgbGx2bTo6Q29uc3RhbnQgKkRhdGFWYWxzW10gPSB7CisgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCBnZXRGdW5jTmFtZSgpLnNpemUoKSksCisgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCBOdW1SZWdpb25Db3VudGVycyksCisgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChJbnQ2NFR5LCBGdW5jdGlvbkhhc2gpLAorICAgIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChOYW1lLCBJbnQ4UHRyVHkpLAorICAgIGxsdm06OkNvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChSZWdpb25Db3VudGVycywgSW50NjRQdHJUeSkKKyAgfTsKKyAgYXV0byAqRGF0YSA9CisgICAgbmV3IGxsdm06Okdsb2JhbFZhcmlhYmxlKENHTS5nZXRNb2R1bGUoKSwgRGF0YVR5LCB0cnVlLCBWYXJMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudFN0cnVjdDo6Z2V0KERhdGFUeSwgRGF0YVZhbHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGdW5jVmFyTmFtZSgiZGF0YSIpKTsKKworICAvLyBBbGwgdGhlIGRhdGEgc2hvdWxkIGJlIHBhY2tlZCBpbnRvIGFuIGFycmF5IGluIGl0cyBvd24gc2VjdGlvbi4KKyAgRGF0YS0+c2V0U2VjdGlvbihnZXREYXRhU2VjdGlvbihDR00pKTsKKyAgRGF0YS0+c2V0QWxpZ25tZW50KDgpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgZGF0YSBkb2Vzbid0IGdldCBkZWxldGVkLgorICBDR00uYWRkVXNlZEdsb2JhbChEYXRhKTsKKyAgcmV0dXJuIERhdGE7Cit9CisKK3ZvaWQgQ29kZUdlblBHTzo6ZW1pdEluc3RydW1lbnRhdGlvbkRhdGEoKSB7CisgIGlmICghQ0dNLmdldENvZGVHZW5PcHRzKCkuUHJvZmlsZUluc3RyR2VuZXJhdGUpCisgICAgcmV0dXJuOworCisgIC8vIEJ1aWxkIHRoZSBkYXRhLgorICBhdXRvICpEYXRhID0gYnVpbGREYXRhVmFyKCk7CisKKyAgLy8gUmVnaXN0ZXIgdGhlIGRhdGEuCisgIGF1dG8gKlJlZ2lzdGVyQkIgPSBnZXRPckluc2VydFJlZ2lzdGVyQkIoQ0dNKTsKKyAgaWYgKCFSZWdpc3RlckJCKQorICAgIHJldHVybjsKKyAgQ0dCdWlsZGVyVHkgQnVpbGRlcihSZWdpc3RlckJCLT5nZXRUZXJtaW5hdG9yKCkpOworICBhdXRvICpWb2lkUHRyVHkgPSBsbHZtOjpUeXBlOjpnZXRJbnQ4UHRyVHkoQ0dNLmdldExMVk1Db250ZXh0KCkpOworICBCdWlsZGVyLkNyZWF0ZUNhbGwoZ2V0T3JJbnNlcnRSdW50aW1lUmVnaXN0ZXIoQ0dNKSwKKyAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChEYXRhLCBWb2lkUHRyVHkpKTsKK30KKworbGx2bTo6RnVuY3Rpb24gKkNvZGVHZW5QR086OmVtaXRJbml0aWFsaXphdGlvbihDb2RlR2VuTW9kdWxlICZDR00pIHsKKyAgaWYgKCFDR00uZ2V0Q29kZUdlbk9wdHMoKS5Qcm9maWxlSW5zdHJHZW5lcmF0ZSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICAvLyBPbmx5IG5lZWQgdG8gY3JlYXRlIHRoaXMgb25jZSBwZXIgbW9kdWxlLgorICBpZiAoQ0dNLmdldE1vZHVsZSgpLmdldEZ1bmN0aW9uKCJfX2xsdm1fcHJvZmlsZV9pbml0IikpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgLy8gR2V0IHRoZSBmdW5jdGlvbiB0byBjYWxsIGF0IGluaXRpYWxpemF0aW9uLgorICBsbHZtOjpDb25zdGFudCAqUmVnaXN0ZXJGID0gZ2V0UmVnaXN0ZXJGdW5jKENHTSk7CisgIGlmICghUmVnaXN0ZXJGKQorICAgIHJldHVybiBudWxscHRyOworCisgIC8vIENyZWF0ZSB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCisgIGF1dG8gKlZvaWRUeSA9IGxsdm06OlR5cGU6OmdldFZvaWRUeShDR00uZ2V0TExWTUNvbnRleHQoKSk7CisgIGF1dG8gKkYgPSBsbHZtOjpGdW5jdGlvbjo6Q3JlYXRlKGxsdm06OkZ1bmN0aW9uVHlwZTo6Z2V0KFZvaWRUeSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6SW50ZXJuYWxMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19sbHZtX3Byb2ZpbGVfaW5pdCIsICZDR00uZ2V0TW9kdWxlKCkpOworICBGLT5zZXRVbm5hbWVkQWRkcih0cnVlKTsKKyAgRi0+YWRkRm5BdHRyKGxsdm06OkF0dHJpYnV0ZTo6Tm9JbmxpbmUpOworICBpZiAoQ0dNLmdldENvZGVHZW5PcHRzKCkuRGlzYWJsZVJlZFpvbmUpCisgICAgRi0+YWRkRm5BdHRyKGxsdm06OkF0dHJpYnV0ZTo6Tm9SZWRab25lKTsKKworICAvLyBBZGQgdGhlIGJhc2ljIGJsb2NrIGFuZCB0aGUgbmVjZXNzYXJ5IGNhbGxzLgorICBDR0J1aWxkZXJUeSBCdWlsZGVyKGxsdm06OkJhc2ljQmxvY2s6OkNyZWF0ZShDR00uZ2V0TExWTUNvbnRleHQoKSwgIiIsIEYpKTsKKyAgQnVpbGRlci5DcmVhdGVDYWxsKFJlZ2lzdGVyRik7CisgIEJ1aWxkZXIuQ3JlYXRlUmV0Vm9pZCgpOworCisgIHJldHVybiBGOworfQorCituYW1lc3BhY2UgeworICAvLy8gQSBTdG10VmlzaXRvciB0aGF0IGZpbGxzIGEgbWFwIG9mIHN0YXRlbWVudHMgdG8gUEdPIGNvdW50ZXJzLgorICBzdHJ1Y3QgTWFwUmVnaW9uQ291bnRlcnMgOiBwdWJsaWMgQ29uc3RTdG10VmlzaXRvcjxNYXBSZWdpb25Db3VudGVycz4geworICAgIC8vLyBUaGUgbmV4dCBjb3VudGVyIHZhbHVlIHRvIGFzc2lnbi4KKyAgICB1bnNpZ25lZCBOZXh0Q291bnRlcjsKKyAgICAvLy8gVGhlIG1hcCBvZiBzdGF0ZW1lbnRzIHRvIGNvdW50ZXJzLgorICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IFN0bXQgKiwgdW5zaWduZWQ+ICZDb3VudGVyTWFwOworCisgICAgTWFwUmVnaW9uQ291bnRlcnMobGx2bTo6RGVuc2VNYXA8Y29uc3QgU3RtdCAqLCB1bnNpZ25lZD4gJkNvdW50ZXJNYXApCisgICAgICAgIDogTmV4dENvdW50ZXIoMCksIENvdW50ZXJNYXAoQ291bnRlck1hcCkge30KKworICAgIHZvaWQgVmlzaXRDaGlsZHJlbihjb25zdCBTdG10ICpTKSB7CisgICAgICBmb3IgKFN0bXQ6OmNvbnN0X2NoaWxkX3JhbmdlIEkgPSBTLT5jaGlsZHJlbigpOyBJOyArK0kpCisgICAgICAgIGlmICgqSSkKKyAgICAgICAgIHRoaXMtPlZpc2l0KCpJKTsKKyAgICB9CisgICAgdm9pZCBWaXNpdFN0bXQoY29uc3QgU3RtdCAqUykgeyBWaXNpdENoaWxkcmVuKFMpOyB9CisKKyAgICAvLy8gQXNzaWduIGEgY291bnRlciB0byB0cmFjayBlbnRyeSB0byB0aGUgZnVuY3Rpb24gYm9keS4KKyAgICB2b2lkIFZpc2l0RnVuY3Rpb25EZWNsKGNvbnN0IEZ1bmN0aW9uRGVjbCAqUykgeworICAgICAgQ291bnRlck1hcFtTLT5nZXRCb2R5KCldID0gTmV4dENvdW50ZXIrKzsKKyAgICAgIFZpc2l0KFMtPmdldEJvZHkoKSk7CisgICAgfQorICAgIHZvaWQgVmlzaXRPYmpDTWV0aG9kRGVjbChjb25zdCBPYmpDTWV0aG9kRGVjbCAqUykgeworICAgICAgQ291bnRlck1hcFtTLT5nZXRCb2R5KCldID0gTmV4dENvdW50ZXIrKzsKKyAgICAgIFZpc2l0KFMtPmdldEJvZHkoKSk7CisgICAgfQorICAgIHZvaWQgVmlzaXRCbG9ja0RlY2woY29uc3QgQmxvY2tEZWNsICpTKSB7CisgICAgICBDb3VudGVyTWFwW1MtPmdldEJvZHkoKV0gPSBOZXh0Q291bnRlcisrOworICAgICAgVmlzaXQoUy0+Z2V0Qm9keSgpKTsKKyAgICB9CisgICAgLy8vIEFzc2lnbiBhIGNvdW50ZXIgdG8gdHJhY2sgdGhlIGJsb2NrIGZvbGxvd2luZyBhIGxhYmVsLgorICAgIHZvaWQgVmlzaXRMYWJlbFN0bXQoY29uc3QgTGFiZWxTdG10ICpTKSB7CisgICAgICBDb3VudGVyTWFwW1NdID0gTmV4dENvdW50ZXIrKzsKKyAgICAgIFZpc2l0KFMtPmdldFN1YlN0bXQoKSk7CisgICAgfQorICAgIC8vLyBBc3NpZ24gYSBjb3VudGVyIGZvciB0aGUgYm9keSBvZiBhIHdoaWxlIGxvb3AuCisgICAgdm9pZCBWaXNpdFdoaWxlU3RtdChjb25zdCBXaGlsZVN0bXQgKlMpIHsKKyAgICAgIENvdW50ZXJNYXBbU10gPSBOZXh0Q291bnRlcisrOworICAgICAgVmlzaXQoUy0+Z2V0Q29uZCgpKTsKKyAgICAgIFZpc2l0KFMtPmdldEJvZHkoKSk7CisgICAgfQorICAgIC8vLyBBc3NpZ24gYSBjb3VudGVyIGZvciB0aGUgYm9keSBvZiBhIGRvLXdoaWxlIGxvb3AuCisgICAgdm9pZCBWaXNpdERvU3RtdChjb25zdCBEb1N0bXQgKlMpIHsKKyAgICAgIENvdW50ZXJNYXBbU10gPSBOZXh0Q291bnRlcisrOworICAgICAgVmlzaXQoUy0+Z2V0Qm9keSgpKTsKKyAgICAgIFZpc2l0KFMtPmdldENvbmQoKSk7CisgICAgfQorICAgIC8vLyBBc3NpZ24gYSBjb3VudGVyIGZvciB0aGUgYm9keSBvZiBhIGZvciBsb29wLgorICAgIHZvaWQgVmlzaXRGb3JTdG10KGNvbnN0IEZvclN0bXQgKlMpIHsKKyAgICAgIENvdW50ZXJNYXBbU10gPSBOZXh0Q291bnRlcisrOworICAgICAgaWYgKFMtPmdldEluaXQoKSkKKyAgICAgICAgVmlzaXQoUy0+Z2V0SW5pdCgpKTsKKyAgICAgIGNvbnN0IEV4cHIgKkU7CisgICAgICBpZiAoKEUgPSBTLT5nZXRDb25kKCkpKQorICAgICAgICBWaXNpdChFKTsKKyAgICAgIGlmICgoRSA9IFMtPmdldEluYygpKSkKKyAgICAgICAgVmlzaXQoRSk7CisgICAgICBWaXNpdChTLT5nZXRCb2R5KCkpOworICAgIH0KKyAgICAvLy8gQXNzaWduIGEgY291bnRlciBmb3IgdGhlIGJvZHkgb2YgYSBmb3ItcmFuZ2UgbG9vcC4KKyAgICB2b2lkIFZpc2l0Q1hYRm9yUmFuZ2VTdG10KGNvbnN0IENYWEZvclJhbmdlU3RtdCAqUykgeworICAgICAgQ291bnRlck1hcFtTXSA9IE5leHRDb3VudGVyKys7CisgICAgICBWaXNpdChTLT5nZXRSYW5nZVN0bXQoKSk7CisgICAgICBWaXNpdChTLT5nZXRCZWdpbkVuZFN0bXQoKSk7CisgICAgICBWaXNpdChTLT5nZXRDb25kKCkpOworICAgICAgVmlzaXQoUy0+Z2V0TG9vcFZhclN0bXQoKSk7CisgICAgICBWaXNpdChTLT5nZXRCb2R5KCkpOworICAgICAgVmlzaXQoUy0+Z2V0SW5jKCkpOworICAgIH0KKyAgICAvLy8gQXNzaWduIGEgY291bnRlciBmb3IgdGhlIGJvZHkgb2YgYSBmb3ItY29sbGVjdGlvbiBsb29wLgorICAgIHZvaWQgVmlzaXRPYmpDRm9yQ29sbGVjdGlvblN0bXQoY29uc3QgT2JqQ0ZvckNvbGxlY3Rpb25TdG10ICpTKSB7CisgICAgICBDb3VudGVyTWFwW1NdID0gTmV4dENvdW50ZXIrKzsKKyAgICAgIFZpc2l0KFMtPmdldEVsZW1lbnQoKSk7CisgICAgICBWaXNpdChTLT5nZXRCb2R5KCkpOworICAgIH0KKyAgICAvLy8gQXNzaWduIGEgY291bnRlciBmb3IgdGhlIGV4aXQgYmxvY2sgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnQuCisgICAgdm9pZCBWaXNpdFN3aXRjaFN0bXQoY29uc3QgU3dpdGNoU3RtdCAqUykgeworICAgICAgQ291bnRlck1hcFtTXSA9IE5leHRDb3VudGVyKys7CisgICAgICBWaXNpdChTLT5nZXRDb25kKCkpOworICAgICAgVmlzaXQoUy0+Z2V0Qm9keSgpKTsKKyAgICB9CisgICAgLy8vIEFzc2lnbiBhIGNvdW50ZXIgZm9yIGEgcGFydGljdWxhciBjYXNlIGluIGEgc3dpdGNoLiBUaGlzIGNvdW50cyBqdW1wcworICAgIC8vLyBmcm9tIHRoZSBzd2l0Y2ggaGVhZGVyIGFzIHdlbGwgYXMgZmFsbHRocm91Z2ggZnJvbSB0aGUgY2FzZSBiZWZvcmUgdGhpcworICAgIC8vLyBvbmUuCisgICAgdm9pZCBWaXNpdENhc2VTdG10KGNvbnN0IENhc2VTdG10ICpTKSB7CisgICAgICBDb3VudGVyTWFwW1NdID0gTmV4dENvdW50ZXIrKzsKKyAgICAgIFZpc2l0KFMtPmdldFN1YlN0bXQoKSk7CisgICAgfQorICAgIC8vLyBBc3NpZ24gYSBjb3VudGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlIG9mIGEgc3dpdGNoIHN0YXRlbWVudC4gVGhlIGNvdW50CisgICAgLy8vIGlzIHRoZSBudW1iZXIgb2YgYnJhbmNoZXMgZnJvbSB0aGUgbG9vcCBoZWFkZXIgdG8gdGhlIGRlZmF1bHQsIGFuZCBkb2VzCisgICAgLy8vIG5vdCBpbmNsdWRlIGZhbGx0aHJvdWdoIGZyb20gcHJldmlvdXMgY2FzZXMuIElmIHdlIGhhdmUgbXVsdGlwbGUKKyAgICAvLy8gY29uZGl0aW9uYWwgYnJhbmNoIGJsb2NrcyBmcm9tIHRoZSBzd2l0Y2ggaW5zdHJ1Y3Rpb24gdG8gdGhlIGRlZmF1bHQKKyAgICAvLy8gYmxvY2ssIGFzIHdpdGggbGFyZ2UgR05VIGNhc2UgcmFuZ2VzLCB0aGlzIGlzIHRoZSBjb3VudGVyIGZvciB0aGUgbGFzdAorICAgIC8vLyBlZGdlIGluIHRoYXQgc2VyaWVzLCByYXRoZXIgdGhhbiB0aGUgZmlyc3QuCisgICAgdm9pZCBWaXNpdERlZmF1bHRTdG10KGNvbnN0IERlZmF1bHRTdG10ICpTKSB7CisgICAgICBDb3VudGVyTWFwW1NdID0gTmV4dENvdW50ZXIrKzsKKyAgICAgIFZpc2l0KFMtPmdldFN1YlN0bXQoKSk7CisgICAgfQorICAgIC8vLyBBc3NpZ24gYSBjb3VudGVyIGZvciB0aGUgInRoZW4iIHBhcnQgb2YgYW4gaWYgc3RhdGVtZW50LiBUaGUgY291bnQgZm9yCisgICAgLy8vIHRoZSAiZWxzZSIgcGFydCwgaWYgaXQgZXhpc3RzLCB3aWxsIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGlzIGNvdW50ZXIuCisgICAgdm9pZCBWaXNpdElmU3RtdChjb25zdCBJZlN0bXQgKlMpIHsKKyAgICAgIENvdW50ZXJNYXBbU10gPSBOZXh0Q291bnRlcisrOworICAgICAgVmlzaXQoUy0+Z2V0Q29uZCgpKTsKKyAgICAgIFZpc2l0KFMtPmdldFRoZW4oKSk7CisgICAgICBpZiAoUy0+Z2V0RWxzZSgpKQorICAgICAgICBWaXNpdChTLT5nZXRFbHNlKCkpOworICAgIH0KKyAgICAvLy8gQXNzaWduIGEgY291bnRlciBmb3IgdGhlIGNvbnRpbnVhdGlvbiBibG9jayBvZiBhIEMrKyB0cnkgc3RhdGVtZW50LgorICAgIHZvaWQgVmlzaXRDWFhUcnlTdG10KGNvbnN0IENYWFRyeVN0bXQgKlMpIHsKKyAgICAgIENvdW50ZXJNYXBbU10gPSBOZXh0Q291bnRlcisrOworICAgICAgVmlzaXQoUy0+Z2V0VHJ5QmxvY2soKSk7CisgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gUy0+Z2V0TnVtSGFuZGxlcnMoKTsgSSA8IEU7ICsrSSkKKyAgICAgICAgVmlzaXQoUy0+Z2V0SGFuZGxlcihJKSk7CisgICAgfQorICAgIC8vLyBBc3NpZ24gYSBjb3VudGVyIGZvciBhIGNhdGNoIHN0YXRlbWVudCdzIGhhbmRsZXIgYmxvY2suCisgICAgdm9pZCBWaXNpdENYWENhdGNoU3RtdChjb25zdCBDWFhDYXRjaFN0bXQgKlMpIHsKKyAgICAgIENvdW50ZXJNYXBbU10gPSBOZXh0Q291bnRlcisrOworICAgICAgVmlzaXQoUy0+Z2V0SGFuZGxlckJsb2NrKCkpOworICAgIH0KKyAgICAvLy8gQXNzaWduIGEgY291bnRlciBmb3IgdGhlICJ0cnVlIiBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgb3BlcmF0b3IuIFRoZQorICAgIC8vLyBjb3VudCBpbiB0aGUgImZhbHNlIiBwYXJ0IHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIHRoaXMgY291bnRlci4KKyAgICB2b2lkIFZpc2l0Q29uZGl0aW9uYWxPcGVyYXRvcihjb25zdCBDb25kaXRpb25hbE9wZXJhdG9yICpFKSB7CisgICAgICBDb3VudGVyTWFwW0VdID0gTmV4dENvdW50ZXIrKzsKKyAgICAgIFZpc2l0KEUtPmdldENvbmQoKSk7CisgICAgICBWaXNpdChFLT5nZXRUcnVlRXhwcigpKTsKKyAgICAgIFZpc2l0KEUtPmdldEZhbHNlRXhwcigpKTsKKyAgICB9CisgICAgLy8vIEFzc2lnbiBhIGNvdW50ZXIgZm9yIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgYSBsb2dpY2FsIGFuZCBvcGVyYXRvci4KKyAgICB2b2lkIFZpc2l0QmluTEFuZChjb25zdCBCaW5hcnlPcGVyYXRvciAqRSkgeworICAgICAgQ291bnRlck1hcFtFXSA9IE5leHRDb3VudGVyKys7CisgICAgICBWaXNpdChFLT5nZXRMSFMoKSk7CisgICAgICBWaXNpdChFLT5nZXRSSFMoKSk7CisgICAgfQorICAgIC8vLyBBc3NpZ24gYSBjb3VudGVyIGZvciB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGEgbG9naWNhbCBvciBvcGVyYXRvci4KKyAgICB2b2lkIFZpc2l0QmluTE9yKGNvbnN0IEJpbmFyeU9wZXJhdG9yICpFKSB7CisgICAgICBDb3VudGVyTWFwW0VdID0gTmV4dENvdW50ZXIrKzsKKyAgICAgIFZpc2l0KEUtPmdldExIUygpKTsKKyAgICAgIFZpc2l0KEUtPmdldFJIUygpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIEEgU3RtdFZpc2l0b3IgdGhhdCBwcm9wYWdhdGVzIHRoZSByYXcgY291bnRzIHRocm91Z2ggdGhlIEFTVCBhbmQKKyAgLy8vIHJlY29yZHMgdGhlIGNvdW50IGF0IHN0YXRlbWVudHMgd2hlcmUgdGhlIHZhbHVlIG1heSBjaGFuZ2UuCisgIHN0cnVjdCBDb21wdXRlUmVnaW9uQ291bnRzIDogcHVibGljIENvbnN0U3RtdFZpc2l0b3I8Q29tcHV0ZVJlZ2lvbkNvdW50cz4geworICAgIC8vLyBQR08gc3RhdGUuCisgICAgQ29kZUdlblBHTyAmUEdPOworCisgICAgLy8vIEEgZmxhZyB0aGF0IGlzIHNldCB3aGVuIHRoZSBjdXJyZW50IGNvdW50IHNob3VsZCBiZSByZWNvcmRlZCBvbiB0aGUKKyAgICAvLy8gbmV4dCBzdGF0ZW1lbnQsIHN1Y2ggYXMgYXQgdGhlIGV4aXQgb2YgYSBsb29wLgorICAgIGJvb2wgUmVjb3JkTmV4dFN0bXRDb3VudDsKKworICAgIC8vLyBUaGUgbWFwIG9mIHN0YXRlbWVudHMgdG8gY291bnQgdmFsdWVzLgorICAgIGxsdm06OkRlbnNlTWFwPGNvbnN0IFN0bXQgKiwgdWludDY0X3Q+ICZDb3VudE1hcDsKKworICAgIC8vLyBCcmVha0NvbnRpbnVlU3RhY2sgLSBLZWVwIGNvdW50cyBvZiBicmVha3MgYW5kIGNvbnRpbnVlcyBpbnNpZGUgbG9vcHMuIAorICAgIHN0cnVjdCBCcmVha0NvbnRpbnVlIHsKKyAgICAgIHVpbnQ2NF90IEJyZWFrQ291bnQ7CisgICAgICB1aW50NjRfdCBDb250aW51ZUNvdW50OworICAgICAgQnJlYWtDb250aW51ZSgpIDogQnJlYWtDb3VudCgwKSwgQ29udGludWVDb3VudCgwKSB7fQorICAgIH07CisgICAgU21hbGxWZWN0b3I8QnJlYWtDb250aW51ZSwgOD4gQnJlYWtDb250aW51ZVN0YWNrOworCisgICAgQ29tcHV0ZVJlZ2lvbkNvdW50cyhsbHZtOjpEZW5zZU1hcDxjb25zdCBTdG10ICosIHVpbnQ2NF90PiAmQ291bnRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuUEdPICZQR08pCisgICAgICAgIDogUEdPKFBHTyksIFJlY29yZE5leHRTdG10Q291bnQoZmFsc2UpLCBDb3VudE1hcChDb3VudE1hcCkge30KKworICAgIHZvaWQgUmVjb3JkU3RtdENvdW50KGNvbnN0IFN0bXQgKlMpIHsKKyAgICAgIGlmIChSZWNvcmROZXh0U3RtdENvdW50KSB7CisgICAgICAgIENvdW50TWFwW1NdID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgICBSZWNvcmROZXh0U3RtdENvdW50ID0gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgdm9pZCBWaXNpdFN0bXQoY29uc3QgU3RtdCAqUykgeworICAgICAgUmVjb3JkU3RtdENvdW50KFMpOworICAgICAgZm9yIChTdG10Ojpjb25zdF9jaGlsZF9yYW5nZSBJID0gUy0+Y2hpbGRyZW4oKTsgSTsgKytJKSB7CisgICAgICAgIGlmICgqSSkKKyAgICAgICAgIHRoaXMtPlZpc2l0KCpJKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFZpc2l0RnVuY3Rpb25EZWNsKGNvbnN0IEZ1bmN0aW9uRGVjbCAqUykgeworICAgICAgUmVnaW9uQ291bnRlciBDbnQoUEdPLCBTLT5nZXRCb2R5KCkpOworICAgICAgQ250LmJlZ2luUmVnaW9uKCk7CisgICAgICBDb3VudE1hcFtTLT5nZXRCb2R5KCldID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgVmlzaXQoUy0+Z2V0Qm9keSgpKTsKKyAgICB9CisKKyAgICB2b2lkIFZpc2l0T2JqQ01ldGhvZERlY2woY29uc3QgT2JqQ01ldGhvZERlY2wgKlMpIHsKKyAgICAgIFJlZ2lvbkNvdW50ZXIgQ250KFBHTywgUy0+Z2V0Qm9keSgpKTsKKyAgICAgIENudC5iZWdpblJlZ2lvbigpOworICAgICAgQ291bnRNYXBbUy0+Z2V0Qm9keSgpXSA9IFBHTy5nZXRDdXJyZW50UmVnaW9uQ291bnQoKTsKKyAgICAgIFZpc2l0KFMtPmdldEJvZHkoKSk7CisgICAgfQorCisgICAgdm9pZCBWaXNpdEJsb2NrRGVjbChjb25zdCBCbG9ja0RlY2wgKlMpIHsKKyAgICAgIFJlZ2lvbkNvdW50ZXIgQ250KFBHTywgUy0+Z2V0Qm9keSgpKTsKKyAgICAgIENudC5iZWdpblJlZ2lvbigpOworICAgICAgQ291bnRNYXBbUy0+Z2V0Qm9keSgpXSA9IFBHTy5nZXRDdXJyZW50UmVnaW9uQ291bnQoKTsKKyAgICAgIFZpc2l0KFMtPmdldEJvZHkoKSk7CisgICAgfQorCisgICAgdm9pZCBWaXNpdFJldHVyblN0bXQoY29uc3QgUmV0dXJuU3RtdCAqUykgeworICAgICAgUmVjb3JkU3RtdENvdW50KFMpOworICAgICAgaWYgKFMtPmdldFJldFZhbHVlKCkpCisgICAgICAgIFZpc2l0KFMtPmdldFJldFZhbHVlKCkpOworICAgICAgUEdPLnNldEN1cnJlbnRSZWdpb25VbnJlYWNoYWJsZSgpOworICAgICAgUmVjb3JkTmV4dFN0bXRDb3VudCA9IHRydWU7CisgICAgfQorCisgICAgdm9pZCBWaXNpdEdvdG9TdG10KGNvbnN0IEdvdG9TdG10ICpTKSB7CisgICAgICBSZWNvcmRTdG10Q291bnQoUyk7CisgICAgICBQR08uc2V0Q3VycmVudFJlZ2lvblVucmVhY2hhYmxlKCk7CisgICAgICBSZWNvcmROZXh0U3RtdENvdW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIFZpc2l0TGFiZWxTdG10KGNvbnN0IExhYmVsU3RtdCAqUykgeworICAgICAgUmVjb3JkTmV4dFN0bXRDb3VudCA9IGZhbHNlOworICAgICAgUmVnaW9uQ291bnRlciBDbnQoUEdPLCBTKTsKKyAgICAgIENudC5iZWdpblJlZ2lvbigpOworICAgICAgQ291bnRNYXBbU10gPSBQR08uZ2V0Q3VycmVudFJlZ2lvbkNvdW50KCk7CisgICAgICBWaXNpdChTLT5nZXRTdWJTdG10KCkpOworICAgIH0KKworICAgIHZvaWQgVmlzaXRCcmVha1N0bXQoY29uc3QgQnJlYWtTdG10ICpTKSB7CisgICAgICBSZWNvcmRTdG10Q291bnQoUyk7CisgICAgICBhc3NlcnQoIUJyZWFrQ29udGludWVTdGFjay5lbXB0eSgpICYmICJicmVhayBub3QgaW4gYSBsb29wIG9yIHN3aXRjaCEiKTsKKyAgICAgIEJyZWFrQ29udGludWVTdGFjay5iYWNrKCkuQnJlYWtDb3VudCArPSBQR08uZ2V0Q3VycmVudFJlZ2lvbkNvdW50KCk7CisgICAgICBQR08uc2V0Q3VycmVudFJlZ2lvblVucmVhY2hhYmxlKCk7CisgICAgICBSZWNvcmROZXh0U3RtdENvdW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIFZpc2l0Q29udGludWVTdG10KGNvbnN0IENvbnRpbnVlU3RtdCAqUykgeworICAgICAgUmVjb3JkU3RtdENvdW50KFMpOworICAgICAgYXNzZXJ0KCFCcmVha0NvbnRpbnVlU3RhY2suZW1wdHkoKSAmJiAiY29udGludWUgc3RtdCBub3QgaW4gYSBsb29wISIpOworICAgICAgQnJlYWtDb250aW51ZVN0YWNrLmJhY2soKS5Db250aW51ZUNvdW50ICs9IFBHTy5nZXRDdXJyZW50UmVnaW9uQ291bnQoKTsKKyAgICAgIFBHTy5zZXRDdXJyZW50UmVnaW9uVW5yZWFjaGFibGUoKTsKKyAgICAgIFJlY29yZE5leHRTdG10Q291bnQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgVmlzaXRXaGlsZVN0bXQoY29uc3QgV2hpbGVTdG10ICpTKSB7CisgICAgICBSZWNvcmRTdG10Q291bnQoUyk7CisgICAgICBSZWdpb25Db3VudGVyIENudChQR08sIFMpOworICAgICAgQnJlYWtDb250aW51ZVN0YWNrLnB1c2hfYmFjayhCcmVha0NvbnRpbnVlKCkpOworICAgICAgLy8gVmlzaXQgdGhlIGJvZHkgcmVnaW9uIGZpcnN0IHNvIHRoZSBicmVhay9jb250aW51ZSBhZGp1c3RtZW50cyBjYW4gYmUKKyAgICAgIC8vIGluY2x1ZGVkIHdoZW4gdmlzaXRpbmcgdGhlIGNvbmRpdGlvbi4KKyAgICAgIENudC5iZWdpblJlZ2lvbigpOworICAgICAgQ291bnRNYXBbUy0+Z2V0Qm9keSgpXSA9IFBHTy5nZXRDdXJyZW50UmVnaW9uQ291bnQoKTsKKyAgICAgIFZpc2l0KFMtPmdldEJvZHkoKSk7CisgICAgICBDbnQuYWRqdXN0Rm9yQ29udHJvbEZsb3coKTsKKworICAgICAgLy8gLi4udGhlbiBnbyBiYWNrIGFuZCBwcm9wYWdhdGUgY291bnRzIHRocm91Z2ggdGhlIGNvbmRpdGlvbi4gVGhlIGNvdW50CisgICAgICAvLyBhdCB0aGUgc3RhcnQgb2YgdGhlIGNvbmRpdGlvbiBpcyB0aGUgc3VtIG9mIHRoZSBpbmNvbWluZyBlZGdlcywKKyAgICAgIC8vIHRoZSBiYWNrZWRnZSBmcm9tIHRoZSBlbmQgb2YgdGhlIGxvb3AgYm9keSwgYW5kIHRoZSBlZGdlcyBmcm9tCisgICAgICAvLyBjb250aW51ZSBzdGF0ZW1lbnRzLgorICAgICAgQnJlYWtDb250aW51ZSBCQyA9IEJyZWFrQ29udGludWVTdGFjay5wb3BfYmFja192YWwoKTsKKyAgICAgIENudC5zZXRDdXJyZW50UmVnaW9uQ291bnQoQ250LmdldFBhcmVudENvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbnQuZ2V0QWRqdXN0ZWRDb3VudCgpICsgQkMuQ29udGludWVDb3VudCk7CisgICAgICBDb3VudE1hcFtTLT5nZXRDb25kKCldID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgVmlzaXQoUy0+Z2V0Q29uZCgpKTsKKyAgICAgIENudC5hZGp1c3RGb3JDb250cm9sRmxvdygpOworICAgICAgQ250LmFwcGx5QWRqdXN0bWVudHNUb1JlZ2lvbihCQy5CcmVha0NvdW50ICsgQkMuQ29udGludWVDb3VudCk7CisgICAgICBSZWNvcmROZXh0U3RtdENvdW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIFZpc2l0RG9TdG10KGNvbnN0IERvU3RtdCAqUykgeworICAgICAgUmVjb3JkU3RtdENvdW50KFMpOworICAgICAgUmVnaW9uQ291bnRlciBDbnQoUEdPLCBTKTsKKyAgICAgIEJyZWFrQ29udGludWVTdGFjay5wdXNoX2JhY2soQnJlYWtDb250aW51ZSgpKTsKKyAgICAgIENudC5iZWdpblJlZ2lvbigvKkFkZEluY29taW5nRmFsbFRocm91Z2g9Ki90cnVlKTsKKyAgICAgIENvdW50TWFwW1MtPmdldEJvZHkoKV0gPSBQR08uZ2V0Q3VycmVudFJlZ2lvbkNvdW50KCk7CisgICAgICBWaXNpdChTLT5nZXRCb2R5KCkpOworICAgICAgQ250LmFkanVzdEZvckNvbnRyb2xGbG93KCk7CisKKyAgICAgIEJyZWFrQ29udGludWUgQkMgPSBCcmVha0NvbnRpbnVlU3RhY2sucG9wX2JhY2tfdmFsKCk7CisgICAgICAvLyBUaGUgY291bnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjb25kaXRpb24gaXMgZXF1YWwgdG8gdGhlIGNvdW50IGF0IHRoZQorICAgICAgLy8gZW5kIG9mIHRoZSBib2R5LiBUaGUgYWRqdXN0ZWQgY291bnQgZG9lcyBub3QgaW5jbHVkZSBlaXRoZXIgdGhlCisgICAgICAvLyBmYWxsLXRocm91Z2ggY291bnQgY29taW5nIGludG8gdGhlIGxvb3Agb3IgdGhlIGNvbnRpbnVlIGNvdW50LCBzbyBhZGQKKyAgICAgIC8vIGJvdGggb2YgdGhvc2Ugc2VwYXJhdGVseS4gVGhpcyBpcyBjb2luY2lkZW50YWxseSB0aGUgc2FtZSBlcXVhdGlvbiBhcworICAgICAgLy8gd2l0aCB3aGlsZSBsb29wcyBidXQgZm9yIGRpZmZlcmVudCByZWFzb25zLgorICAgICAgQ250LnNldEN1cnJlbnRSZWdpb25Db3VudChDbnQuZ2V0UGFyZW50Q291bnQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENudC5nZXRBZGp1c3RlZENvdW50KCkgKyBCQy5Db250aW51ZUNvdW50KTsKKyAgICAgIENvdW50TWFwW1MtPmdldENvbmQoKV0gPSBQR08uZ2V0Q3VycmVudFJlZ2lvbkNvdW50KCk7CisgICAgICBWaXNpdChTLT5nZXRDb25kKCkpOworICAgICAgQ250LmFkanVzdEZvckNvbnRyb2xGbG93KCk7CisgICAgICBDbnQuYXBwbHlBZGp1c3RtZW50c1RvUmVnaW9uKEJDLkJyZWFrQ291bnQgKyBCQy5Db250aW51ZUNvdW50KTsKKyAgICAgIFJlY29yZE5leHRTdG10Q291bnQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgVmlzaXRGb3JTdG10KGNvbnN0IEZvclN0bXQgKlMpIHsKKyAgICAgIFJlY29yZFN0bXRDb3VudChTKTsKKyAgICAgIGlmIChTLT5nZXRJbml0KCkpCisgICAgICAgIFZpc2l0KFMtPmdldEluaXQoKSk7CisgICAgICBSZWdpb25Db3VudGVyIENudChQR08sIFMpOworICAgICAgQnJlYWtDb250aW51ZVN0YWNrLnB1c2hfYmFjayhCcmVha0NvbnRpbnVlKCkpOworICAgICAgLy8gVmlzaXQgdGhlIGJvZHkgcmVnaW9uIGZpcnN0LiAoVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgYSB3aGlsZQorICAgICAgLy8gbG9vcDsgc2VlIGZ1cnRoZXIgY29tbWVudHMgaW4gVmlzaXRXaGlsZVN0bXQuKQorICAgICAgQ250LmJlZ2luUmVnaW9uKCk7CisgICAgICBDb3VudE1hcFtTLT5nZXRCb2R5KCldID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgVmlzaXQoUy0+Z2V0Qm9keSgpKTsKKyAgICAgIENudC5hZGp1c3RGb3JDb250cm9sRmxvdygpOworCisgICAgICAvLyBUaGUgaW5jcmVtZW50IGlzIGVzc2VudGlhbGx5IHBhcnQgb2YgdGhlIGJvZHkgYnV0IGl0IG5lZWRzIHRvIGluY2x1ZGUKKyAgICAgIC8vIHRoZSBjb3VudCBmb3IgYWxsIHRoZSBjb250aW51ZSBzdGF0ZW1lbnRzLgorICAgICAgaWYgKFMtPmdldEluYygpKSB7CisgICAgICAgIENudC5zZXRDdXJyZW50UmVnaW9uQ291bnQoUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcmVha0NvbnRpbnVlU3RhY2suYmFjaygpLkNvbnRpbnVlQ291bnQpOworICAgICAgICBDb3VudE1hcFtTLT5nZXRJbmMoKV0gPSBQR08uZ2V0Q3VycmVudFJlZ2lvbkNvdW50KCk7CisgICAgICAgIFZpc2l0KFMtPmdldEluYygpKTsKKyAgICAgICAgQ250LmFkanVzdEZvckNvbnRyb2xGbG93KCk7CisgICAgICB9CisKKyAgICAgIEJyZWFrQ29udGludWUgQkMgPSBCcmVha0NvbnRpbnVlU3RhY2sucG9wX2JhY2tfdmFsKCk7CisKKyAgICAgIC8vIC4uLnRoZW4gZ28gYmFjayBhbmQgcHJvcGFnYXRlIGNvdW50cyB0aHJvdWdoIHRoZSBjb25kaXRpb24uCisgICAgICBpZiAoUy0+Z2V0Q29uZCgpKSB7CisgICAgICAgIENudC5zZXRDdXJyZW50UmVnaW9uQ291bnQoQ250LmdldFBhcmVudENvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENudC5nZXRBZGp1c3RlZENvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDLkNvbnRpbnVlQ291bnQpOworICAgICAgICBDb3VudE1hcFtTLT5nZXRDb25kKCldID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgICBWaXNpdChTLT5nZXRDb25kKCkpOworICAgICAgICBDbnQuYWRqdXN0Rm9yQ29udHJvbEZsb3coKTsKKyAgICAgIH0KKyAgICAgIENudC5hcHBseUFkanVzdG1lbnRzVG9SZWdpb24oQkMuQnJlYWtDb3VudCArIEJDLkNvbnRpbnVlQ291bnQpOworICAgICAgUmVjb3JkTmV4dFN0bXRDb3VudCA9IHRydWU7CisgICAgfQorCisgICAgdm9pZCBWaXNpdENYWEZvclJhbmdlU3RtdChjb25zdCBDWFhGb3JSYW5nZVN0bXQgKlMpIHsKKyAgICAgIFJlY29yZFN0bXRDb3VudChTKTsKKyAgICAgIFZpc2l0KFMtPmdldFJhbmdlU3RtdCgpKTsKKyAgICAgIFZpc2l0KFMtPmdldEJlZ2luRW5kU3RtdCgpKTsKKyAgICAgIFJlZ2lvbkNvdW50ZXIgQ250KFBHTywgUyk7CisgICAgICBCcmVha0NvbnRpbnVlU3RhY2sucHVzaF9iYWNrKEJyZWFrQ29udGludWUoKSk7CisgICAgICAvLyBWaXNpdCB0aGUgYm9keSByZWdpb24gZmlyc3QuIChUaGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBhIHdoaWxlCisgICAgICAvLyBsb29wOyBzZWUgZnVydGhlciBjb21tZW50cyBpbiBWaXNpdFdoaWxlU3RtdC4pCisgICAgICBDbnQuYmVnaW5SZWdpb24oKTsKKyAgICAgIENvdW50TWFwW1MtPmdldExvb3BWYXJTdG10KCldID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgVmlzaXQoUy0+Z2V0TG9vcFZhclN0bXQoKSk7CisgICAgICBWaXNpdChTLT5nZXRCb2R5KCkpOworICAgICAgQ250LmFkanVzdEZvckNvbnRyb2xGbG93KCk7CisKKyAgICAgIC8vIFRoZSBpbmNyZW1lbnQgaXMgZXNzZW50aWFsbHkgcGFydCBvZiB0aGUgYm9keSBidXQgaXQgbmVlZHMgdG8gaW5jbHVkZQorICAgICAgLy8gdGhlIGNvdW50IGZvciBhbGwgdGhlIGNvbnRpbnVlIHN0YXRlbWVudHMuCisgICAgICBDbnQuc2V0Q3VycmVudFJlZ2lvbkNvdW50KFBHTy5nZXRDdXJyZW50UmVnaW9uQ291bnQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyZWFrQ29udGludWVTdGFjay5iYWNrKCkuQ29udGludWVDb3VudCk7CisgICAgICBDb3VudE1hcFtTLT5nZXRJbmMoKV0gPSBQR08uZ2V0Q3VycmVudFJlZ2lvbkNvdW50KCk7CisgICAgICBWaXNpdChTLT5nZXRJbmMoKSk7CisgICAgICBDbnQuYWRqdXN0Rm9yQ29udHJvbEZsb3coKTsKKworICAgICAgQnJlYWtDb250aW51ZSBCQyA9IEJyZWFrQ29udGludWVTdGFjay5wb3BfYmFja192YWwoKTsKKworICAgICAgLy8gLi4udGhlbiBnbyBiYWNrIGFuZCBwcm9wYWdhdGUgY291bnRzIHRocm91Z2ggdGhlIGNvbmRpdGlvbi4KKyAgICAgIENudC5zZXRDdXJyZW50UmVnaW9uQ291bnQoQ250LmdldFBhcmVudENvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbnQuZ2V0QWRqdXN0ZWRDb3VudCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkMuQ29udGludWVDb3VudCk7CisgICAgICBDb3VudE1hcFtTLT5nZXRDb25kKCldID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgVmlzaXQoUy0+Z2V0Q29uZCgpKTsKKyAgICAgIENudC5hZGp1c3RGb3JDb250cm9sRmxvdygpOworICAgICAgQ250LmFwcGx5QWRqdXN0bWVudHNUb1JlZ2lvbihCQy5CcmVha0NvdW50ICsgQkMuQ29udGludWVDb3VudCk7CisgICAgICBSZWNvcmROZXh0U3RtdENvdW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIFZpc2l0T2JqQ0ZvckNvbGxlY3Rpb25TdG10KGNvbnN0IE9iakNGb3JDb2xsZWN0aW9uU3RtdCAqUykgeworICAgICAgUmVjb3JkU3RtdENvdW50KFMpOworICAgICAgVmlzaXQoUy0+Z2V0RWxlbWVudCgpKTsKKyAgICAgIFJlZ2lvbkNvdW50ZXIgQ250KFBHTywgUyk7CisgICAgICBCcmVha0NvbnRpbnVlU3RhY2sucHVzaF9iYWNrKEJyZWFrQ29udGludWUoKSk7CisgICAgICBDbnQuYmVnaW5SZWdpb24oKTsKKyAgICAgIENvdW50TWFwW1MtPmdldEJvZHkoKV0gPSBQR08uZ2V0Q3VycmVudFJlZ2lvbkNvdW50KCk7CisgICAgICBWaXNpdChTLT5nZXRCb2R5KCkpOworICAgICAgQnJlYWtDb250aW51ZSBCQyA9IEJyZWFrQ29udGludWVTdGFjay5wb3BfYmFja192YWwoKTsKKyAgICAgIENudC5hZGp1c3RGb3JDb250cm9sRmxvdygpOworICAgICAgQ250LmFwcGx5QWRqdXN0bWVudHNUb1JlZ2lvbihCQy5CcmVha0NvdW50ICsgQkMuQ29udGludWVDb3VudCk7CisgICAgICBSZWNvcmROZXh0U3RtdENvdW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIFZpc2l0U3dpdGNoU3RtdChjb25zdCBTd2l0Y2hTdG10ICpTKSB7CisgICAgICBSZWNvcmRTdG10Q291bnQoUyk7CisgICAgICBWaXNpdChTLT5nZXRDb25kKCkpOworICAgICAgUEdPLnNldEN1cnJlbnRSZWdpb25VbnJlYWNoYWJsZSgpOworICAgICAgQnJlYWtDb250aW51ZVN0YWNrLnB1c2hfYmFjayhCcmVha0NvbnRpbnVlKCkpOworICAgICAgVmlzaXQoUy0+Z2V0Qm9keSgpKTsKKyAgICAgIC8vIElmIHRoZSBzd2l0Y2ggaXMgaW5zaWRlIGEgbG9vcCwgYWRkIHRoZSBjb250aW51ZSBjb3VudHMuCisgICAgICBCcmVha0NvbnRpbnVlIEJDID0gQnJlYWtDb250aW51ZVN0YWNrLnBvcF9iYWNrX3ZhbCgpOworICAgICAgaWYgKCFCcmVha0NvbnRpbnVlU3RhY2suZW1wdHkoKSkKKyAgICAgICAgQnJlYWtDb250aW51ZVN0YWNrLmJhY2soKS5Db250aW51ZUNvdW50ICs9IEJDLkNvbnRpbnVlQ291bnQ7CisgICAgICBSZWdpb25Db3VudGVyIEV4aXRDbnQoUEdPLCBTKTsKKyAgICAgIEV4aXRDbnQuYmVnaW5SZWdpb24oKTsKKyAgICAgIFJlY29yZE5leHRTdG10Q291bnQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgVmlzaXRDYXNlU3RtdChjb25zdCBDYXNlU3RtdCAqUykgeworICAgICAgUmVjb3JkTmV4dFN0bXRDb3VudCA9IGZhbHNlOworICAgICAgUmVnaW9uQ291bnRlciBDbnQoUEdPLCBTKTsKKyAgICAgIENudC5iZWdpblJlZ2lvbigvKkFkZEluY29taW5nRmFsbFRocm91Z2g9Ki90cnVlKTsKKyAgICAgIENvdW50TWFwW1NdID0gQ250LmdldENvdW50KCk7CisgICAgICBSZWNvcmROZXh0U3RtdENvdW50ID0gdHJ1ZTsKKyAgICAgIFZpc2l0KFMtPmdldFN1YlN0bXQoKSk7CisgICAgfQorCisgICAgdm9pZCBWaXNpdERlZmF1bHRTdG10KGNvbnN0IERlZmF1bHRTdG10ICpTKSB7CisgICAgICBSZWNvcmROZXh0U3RtdENvdW50ID0gZmFsc2U7CisgICAgICBSZWdpb25Db3VudGVyIENudChQR08sIFMpOworICAgICAgQ250LmJlZ2luUmVnaW9uKC8qQWRkSW5jb21pbmdGYWxsVGhyb3VnaD0qL3RydWUpOworICAgICAgQ291bnRNYXBbU10gPSBDbnQuZ2V0Q291bnQoKTsKKyAgICAgIFJlY29yZE5leHRTdG10Q291bnQgPSB0cnVlOworICAgICAgVmlzaXQoUy0+Z2V0U3ViU3RtdCgpKTsKKyAgICB9CisKKyAgICB2b2lkIFZpc2l0SWZTdG10KGNvbnN0IElmU3RtdCAqUykgeworICAgICAgUmVjb3JkU3RtdENvdW50KFMpOworICAgICAgUmVnaW9uQ291bnRlciBDbnQoUEdPLCBTKTsKKyAgICAgIFZpc2l0KFMtPmdldENvbmQoKSk7CisKKyAgICAgIENudC5iZWdpblJlZ2lvbigpOworICAgICAgQ291bnRNYXBbUy0+Z2V0VGhlbigpXSA9IFBHTy5nZXRDdXJyZW50UmVnaW9uQ291bnQoKTsKKyAgICAgIFZpc2l0KFMtPmdldFRoZW4oKSk7CisgICAgICBDbnQuYWRqdXN0Rm9yQ29udHJvbEZsb3coKTsKKworICAgICAgaWYgKFMtPmdldEVsc2UoKSkgeworICAgICAgICBDbnQuYmVnaW5FbHNlUmVnaW9uKCk7CisgICAgICAgIENvdW50TWFwW1MtPmdldEVsc2UoKV0gPSBQR08uZ2V0Q3VycmVudFJlZ2lvbkNvdW50KCk7CisgICAgICAgIFZpc2l0KFMtPmdldEVsc2UoKSk7CisgICAgICAgIENudC5hZGp1c3RGb3JDb250cm9sRmxvdygpOworICAgICAgfQorICAgICAgQ250LmFwcGx5QWRqdXN0bWVudHNUb1JlZ2lvbigwKTsKKyAgICAgIFJlY29yZE5leHRTdG10Q291bnQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgVmlzaXRDWFhUcnlTdG10KGNvbnN0IENYWFRyeVN0bXQgKlMpIHsKKyAgICAgIFJlY29yZFN0bXRDb3VudChTKTsKKyAgICAgIFZpc2l0KFMtPmdldFRyeUJsb2NrKCkpOworICAgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFMtPmdldE51bUhhbmRsZXJzKCk7IEkgPCBFOyArK0kpCisgICAgICAgIFZpc2l0KFMtPmdldEhhbmRsZXIoSSkpOworICAgICAgUmVnaW9uQ291bnRlciBDbnQoUEdPLCBTKTsKKyAgICAgIENudC5iZWdpblJlZ2lvbigpOworICAgICAgUmVjb3JkTmV4dFN0bXRDb3VudCA9IHRydWU7CisgICAgfQorCisgICAgdm9pZCBWaXNpdENYWENhdGNoU3RtdChjb25zdCBDWFhDYXRjaFN0bXQgKlMpIHsKKyAgICAgIFJlY29yZE5leHRTdG10Q291bnQgPSBmYWxzZTsKKyAgICAgIFJlZ2lvbkNvdW50ZXIgQ250KFBHTywgUyk7CisgICAgICBDbnQuYmVnaW5SZWdpb24oKTsKKyAgICAgIENvdW50TWFwW1NdID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgVmlzaXQoUy0+Z2V0SGFuZGxlckJsb2NrKCkpOworICAgIH0KKworICAgIHZvaWQgVmlzaXRDb25kaXRpb25hbE9wZXJhdG9yKGNvbnN0IENvbmRpdGlvbmFsT3BlcmF0b3IgKkUpIHsKKyAgICAgIFJlY29yZFN0bXRDb3VudChFKTsKKyAgICAgIFJlZ2lvbkNvdW50ZXIgQ250KFBHTywgRSk7CisgICAgICBWaXNpdChFLT5nZXRDb25kKCkpOworCisgICAgICBDbnQuYmVnaW5SZWdpb24oKTsKKyAgICAgIENvdW50TWFwW0UtPmdldFRydWVFeHByKCldID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgVmlzaXQoRS0+Z2V0VHJ1ZUV4cHIoKSk7CisgICAgICBDbnQuYWRqdXN0Rm9yQ29udHJvbEZsb3coKTsKKworICAgICAgQ250LmJlZ2luRWxzZVJlZ2lvbigpOworICAgICAgQ291bnRNYXBbRS0+Z2V0RmFsc2VFeHByKCldID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgVmlzaXQoRS0+Z2V0RmFsc2VFeHByKCkpOworICAgICAgQ250LmFkanVzdEZvckNvbnRyb2xGbG93KCk7CisKKyAgICAgIENudC5hcHBseUFkanVzdG1lbnRzVG9SZWdpb24oMCk7CisgICAgICBSZWNvcmROZXh0U3RtdENvdW50ID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIFZpc2l0QmluTEFuZChjb25zdCBCaW5hcnlPcGVyYXRvciAqRSkgeworICAgICAgUmVjb3JkU3RtdENvdW50KEUpOworICAgICAgUmVnaW9uQ291bnRlciBDbnQoUEdPLCBFKTsKKyAgICAgIFZpc2l0KEUtPmdldExIUygpKTsKKyAgICAgIENudC5iZWdpblJlZ2lvbigpOworICAgICAgQ291bnRNYXBbRS0+Z2V0UkhTKCldID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgVmlzaXQoRS0+Z2V0UkhTKCkpOworICAgICAgQ250LmFkanVzdEZvckNvbnRyb2xGbG93KCk7CisgICAgICBDbnQuYXBwbHlBZGp1c3RtZW50c1RvUmVnaW9uKDApOworICAgICAgUmVjb3JkTmV4dFN0bXRDb3VudCA9IHRydWU7CisgICAgfQorCisgICAgdm9pZCBWaXNpdEJpbkxPcihjb25zdCBCaW5hcnlPcGVyYXRvciAqRSkgeworICAgICAgUmVjb3JkU3RtdENvdW50KEUpOworICAgICAgUmVnaW9uQ291bnRlciBDbnQoUEdPLCBFKTsKKyAgICAgIFZpc2l0KEUtPmdldExIUygpKTsKKyAgICAgIENudC5iZWdpblJlZ2lvbigpOworICAgICAgQ291bnRNYXBbRS0+Z2V0UkhTKCldID0gUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICAgICAgVmlzaXQoRS0+Z2V0UkhTKCkpOworICAgICAgQ250LmFkanVzdEZvckNvbnRyb2xGbG93KCk7CisgICAgICBDbnQuYXBwbHlBZGp1c3RtZW50c1RvUmVnaW9uKDApOworICAgICAgUmVjb3JkTmV4dFN0bXRDb3VudCA9IHRydWU7CisgICAgfQorICB9OworfQorCitzdGF0aWMgdm9pZCBlbWl0UnVudGltZUhvb2soQ29kZUdlbk1vZHVsZSAmQ0dNKSB7CisgIExMVk1fQ09OU1RFWFBSIGNvbnN0IGNoYXIgKlJ1bnRpbWVWYXJOYW1lID0gIl9fbGx2bV9wcm9maWxlX3J1bnRpbWUiOworICBMTFZNX0NPTlNURVhQUiBjb25zdCBjaGFyICpSdW50aW1lVXNlck5hbWUgPSAiX19sbHZtX3Byb2ZpbGVfcnVudGltZV91c2VyIjsKKyAgaWYgKENHTS5nZXRNb2R1bGUoKS5nZXRHbG9iYWxWYXJpYWJsZShSdW50aW1lVmFyTmFtZSkpCisgICAgcmV0dXJuOworCisgIC8vIERlY2xhcmUgdGhlIHJ1bnRpbWUgaG9vay4KKyAgbGx2bTo6TExWTUNvbnRleHQgJkN0eCA9IENHTS5nZXRMTFZNQ29udGV4dCgpOworICBhdXRvICpJbnQzMlR5ID0gbGx2bTo6VHlwZTo6Z2V0SW50MzJUeShDdHgpOworICBhdXRvICpWYXIgPSBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoQ0dNLmdldE1vZHVsZSgpLCBJbnQzMlR5LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhbHVlOjpFeHRlcm5hbExpbmthZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBSdW50aW1lVmFyTmFtZSk7CisKKyAgLy8gTWFrZSBhIGZ1bmN0aW9uIHRoYXQgdXNlcyBpdC4KKyAgYXV0byAqVXNlciA9IGxsdm06OkZ1bmN0aW9uOjpDcmVhdGUobGx2bTo6RnVuY3Rpb25UeXBlOjpnZXQoSW50MzJUeSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6TGlua09uY2VPRFJMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lVXNlck5hbWUsICZDR00uZ2V0TW9kdWxlKCkpOworICBVc2VyLT5hZGRGbkF0dHIobGx2bTo6QXR0cmlidXRlOjpOb0lubGluZSk7CisgIGlmIChDR00uZ2V0Q29kZUdlbk9wdHMoKS5EaXNhYmxlUmVkWm9uZSkKKyAgICBVc2VyLT5hZGRGbkF0dHIobGx2bTo6QXR0cmlidXRlOjpOb1JlZFpvbmUpOworICBDR0J1aWxkZXJUeSBCdWlsZGVyKGxsdm06OkJhc2ljQmxvY2s6OkNyZWF0ZShDR00uZ2V0TExWTUNvbnRleHQoKSwgIiIsIFVzZXIpKTsKKyAgYXV0byAqTG9hZCA9IEJ1aWxkZXIuQ3JlYXRlTG9hZChWYXIpOworICBCdWlsZGVyLkNyZWF0ZVJldChMb2FkKTsKKworICAvLyBDcmVhdGUgYSB1c2Ugb2YgdGhlIGZ1bmN0aW9uLiAgTm93IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBydW50aW1lIHZhcmlhYmxlCisgIC8vIHNob3VsZCBnZXQgcHVsbGVkIGluLCBhbG9uZyB3aXRoIGFueSBzdGF0aWMgaW5pdGlhbGl6ZWFycy4KKyAgQ0dNLmFkZFVzZWRHbG9iYWwoVXNlcik7Cit9CisKK3ZvaWQgQ29kZUdlblBHTzo6YXNzaWduUmVnaW9uQ291bnRlcnMoY29uc3QgRGVjbCAqRCwgbGx2bTo6RnVuY3Rpb24gKkZuKSB7CisgIGJvb2wgSW5zdHJ1bWVudFJlZ2lvbnMgPSBDR00uZ2V0Q29kZUdlbk9wdHMoKS5Qcm9maWxlSW5zdHJHZW5lcmF0ZTsKKyAgUEdPUHJvZmlsZURhdGEgKlBHT0RhdGEgPSBDR00uZ2V0UEdPRGF0YSgpOworICBpZiAoIUluc3RydW1lbnRSZWdpb25zICYmICFQR09EYXRhKQorICAgIHJldHVybjsKKyAgaWYgKCFEKQorICAgIHJldHVybjsKKyAgc2V0RnVuY05hbWUoRm4pOworCisgIC8vIFNldCB0aGUgbGlua2FnZSBmb3IgdmFyaWFibGVzIGJhc2VkIG9uIHRoZSBmdW5jdGlvbiBsaW5rYWdlLiAgVXN1YWxseSwgd2UKKyAgLy8gd2FudCB0byBtYXRjaCBpdCwgYnV0IGF2YWlsYWJsZV9leHRlcm5hbGx5IGFuZCBleHRlcm5fd2VhayBib3RoIGhhdmUgdGhlCisgIC8vIHdyb25nIHNlbWFudGljcy4KKyAgVmFyTGlua2FnZSA9IEZuLT5nZXRMaW5rYWdlKCk7CisgIHN3aXRjaCAoVmFyTGlua2FnZSkgeworICBjYXNlIGxsdm06Okdsb2JhbFZhbHVlOjpFeHRlcm5hbFdlYWtMaW5rYWdlOgorICAgIFZhckxpbmthZ2UgPSBsbHZtOjpHbG9iYWxWYWx1ZTo6TGlua09uY2VBbnlMaW5rYWdlOworICAgIGJyZWFrOworICBjYXNlIGxsdm06Okdsb2JhbFZhbHVlOjpBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZToKKyAgICBWYXJMaW5rYWdlID0gbGx2bTo6R2xvYmFsVmFsdWU6OkxpbmtPbmNlT0RSTGlua2FnZTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorCisgIG1hcFJlZ2lvbkNvdW50ZXJzKEQpOworICBpZiAoSW5zdHJ1bWVudFJlZ2lvbnMpIHsKKyAgICBlbWl0UnVudGltZUhvb2soQ0dNKTsKKyAgICBlbWl0Q291bnRlclZhcmlhYmxlcygpOworICB9CisgIGlmIChQR09EYXRhKSB7CisgICAgbG9hZFJlZ2lvbkNvdW50cyhQR09EYXRhKTsKKyAgICBjb21wdXRlUmVnaW9uQ291bnRzKEQpOworICAgIGFwcGx5RnVuY3Rpb25BdHRyaWJ1dGVzKFBHT0RhdGEsIEZuKTsKKyAgfQorfQorCit2b2lkIENvZGVHZW5QR086Om1hcFJlZ2lvbkNvdW50ZXJzKGNvbnN0IERlY2wgKkQpIHsKKyAgUmVnaW9uQ291bnRlck1hcC5yZXNldChuZXcgbGx2bTo6RGVuc2VNYXA8Y29uc3QgU3RtdCAqLCB1bnNpZ25lZD4pOworICBNYXBSZWdpb25Db3VudGVycyBXYWxrZXIoKlJlZ2lvbkNvdW50ZXJNYXApOworICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb25EZWNsPihEKSkKKyAgICBXYWxrZXIuVmlzaXRGdW5jdGlvbkRlY2woRkQpOworICBlbHNlIGlmIChjb25zdCBPYmpDTWV0aG9kRGVjbCAqTUQgPSBkeW5fY2FzdF9vcl9udWxsPE9iakNNZXRob2REZWNsPihEKSkKKyAgICBXYWxrZXIuVmlzaXRPYmpDTWV0aG9kRGVjbChNRCk7CisgIGVsc2UgaWYgKGNvbnN0IEJsb2NrRGVjbCAqQkQgPSBkeW5fY2FzdF9vcl9udWxsPEJsb2NrRGVjbD4oRCkpCisgICAgV2Fsa2VyLlZpc2l0QmxvY2tEZWNsKEJEKTsKKyAgTnVtUmVnaW9uQ291bnRlcnMgPSBXYWxrZXIuTmV4dENvdW50ZXI7CisgIC8vIEZJWE1FOiBUaGUgbnVtYmVyIG9mIGNvdW50ZXJzIGlzbid0IHN1ZmZpY2llbnQgZm9yIHRoZSBoYXNoCisgIEZ1bmN0aW9uSGFzaCA9IE51bVJlZ2lvbkNvdW50ZXJzOworfQorCit2b2lkIENvZGVHZW5QR086OmNvbXB1dGVSZWdpb25Db3VudHMoY29uc3QgRGVjbCAqRCkgeworICBTdG10Q291bnRNYXAucmVzZXQobmV3IGxsdm06OkRlbnNlTWFwPGNvbnN0IFN0bXQgKiwgdWludDY0X3Q+KTsKKyAgQ29tcHV0ZVJlZ2lvbkNvdW50cyBXYWxrZXIoKlN0bXRDb3VudE1hcCwgKnRoaXMpOworICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb25EZWNsPihEKSkKKyAgICBXYWxrZXIuVmlzaXRGdW5jdGlvbkRlY2woRkQpOworICBlbHNlIGlmIChjb25zdCBPYmpDTWV0aG9kRGVjbCAqTUQgPSBkeW5fY2FzdF9vcl9udWxsPE9iakNNZXRob2REZWNsPihEKSkKKyAgICBXYWxrZXIuVmlzaXRPYmpDTWV0aG9kRGVjbChNRCk7CisgIGVsc2UgaWYgKGNvbnN0IEJsb2NrRGVjbCAqQkQgPSBkeW5fY2FzdF9vcl9udWxsPEJsb2NrRGVjbD4oRCkpCisgICAgV2Fsa2VyLlZpc2l0QmxvY2tEZWNsKEJEKTsKK30KKwordm9pZCBDb2RlR2VuUEdPOjphcHBseUZ1bmN0aW9uQXR0cmlidXRlcyhQR09Qcm9maWxlRGF0YSAqUEdPRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6RnVuY3Rpb24gKkZuKSB7CisgIGlmICghaGF2ZVJlZ2lvbkNvdW50cygpKQorICAgIHJldHVybjsKKworICB1aW50NjRfdCBNYXhGdW5jdGlvbkNvdW50ID0gUEdPRGF0YS0+Z2V0TWF4aW11bUZ1bmN0aW9uQ291bnQoKTsKKyAgdWludDY0X3QgRnVuY3Rpb25Db3VudCA9IGdldFJlZ2lvbkNvdW50KDApOworICBpZiAoRnVuY3Rpb25Db3VudCA+PSAodWludDY0X3QpKDAuMyAqIChkb3VibGUpTWF4RnVuY3Rpb25Db3VudCkpCisgICAgLy8gVHVybiBvbiBJbmxpbmVIaW50IGF0dHJpYnV0ZSBmb3IgaG90IGZ1bmN0aW9ucy4KKyAgICAvLyBGSVhNRTogMzAlIGlzIGZyb20gcHJlbGltaW5hcnkgdHVuaW5nIG9uIFNQRUMsIGl0IG1heSBub3QgYmUgb3B0aW1hbC4KKyAgICBGbi0+YWRkRm5BdHRyKGxsdm06OkF0dHJpYnV0ZTo6SW5saW5lSGludCk7CisgIGVsc2UgaWYgKEZ1bmN0aW9uQ291bnQgPD0gKHVpbnQ2NF90KSgwLjAxICogKGRvdWJsZSlNYXhGdW5jdGlvbkNvdW50KSkKKyAgICAvLyBUdXJuIG9uIENvbGQgYXR0cmlidXRlIGZvciBjb2xkIGZ1bmN0aW9ucy4KKyAgICAvLyBGSVhNRTogMSUgaXMgZnJvbSBwcmVsaW1pbmFyeSB0dW5pbmcgb24gU1BFQywgaXQgbWF5IG5vdCBiZSBvcHRpbWFsLgorICAgIEZuLT5hZGRGbkF0dHIobGx2bTo6QXR0cmlidXRlOjpDb2xkKTsKK30KKwordm9pZCBDb2RlR2VuUEdPOjplbWl0Q291bnRlclZhcmlhYmxlcygpIHsKKyAgbGx2bTo6TExWTUNvbnRleHQgJkN0eCA9IENHTS5nZXRMTFZNQ29udGV4dCgpOworICBsbHZtOjpBcnJheVR5cGUgKkNvdW50ZXJUeSA9IGxsdm06OkFycmF5VHlwZTo6Z2V0KGxsdm06OlR5cGU6OmdldEludDY0VHkoQ3R4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1SZWdpb25Db3VudGVycyk7CisgIFJlZ2lvbkNvdW50ZXJzID0KKyAgICBuZXcgbGx2bTo6R2xvYmFsVmFyaWFibGUoQ0dNLmdldE1vZHVsZSgpLCBDb3VudGVyVHksIGZhbHNlLCBWYXJMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudDo6Z2V0TnVsbFZhbHVlKENvdW50ZXJUeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZ1bmNWYXJOYW1lKCJjb3VudGVycyIpKTsKKyAgUmVnaW9uQ291bnRlcnMtPnNldEFsaWdubWVudCg4KTsKKyAgUmVnaW9uQ291bnRlcnMtPnNldFNlY3Rpb24oZ2V0Q291bnRlcnNTZWN0aW9uKENHTSkpOworfQorCit2b2lkIENvZGVHZW5QR086OmVtaXRDb3VudGVySW5jcmVtZW50KENHQnVpbGRlclR5ICZCdWlsZGVyLCB1bnNpZ25lZCBDb3VudGVyKSB7CisgIGlmICghUmVnaW9uQ291bnRlcnMpCisgICAgcmV0dXJuOworICBsbHZtOjpWYWx1ZSAqQWRkciA9CisgICAgQnVpbGRlci5DcmVhdGVDb25zdEluQm91bmRzR0VQMl82NChSZWdpb25Db3VudGVycywgMCwgQ291bnRlcik7CisgIGxsdm06OlZhbHVlICpDb3VudCA9IEJ1aWxkZXIuQ3JlYXRlTG9hZChBZGRyLCAicGdvY291bnQiKTsKKyAgQ291bnQgPSBCdWlsZGVyLkNyZWF0ZUFkZChDb3VudCwgQnVpbGRlci5nZXRJbnQ2NCgxKSk7CisgIEJ1aWxkZXIuQ3JlYXRlU3RvcmUoQ291bnQsIEFkZHIpOworfQorCit2b2lkIENvZGVHZW5QR086OmxvYWRSZWdpb25Db3VudHMoUEdPUHJvZmlsZURhdGEgKlBHT0RhdGEpIHsKKyAgLy8gRm9yIG5vdywgaWdub3JlIHRoZSBjb3VudHMgZnJvbSB0aGUgUEdPIGRhdGEgZmlsZSBvbmx5IGlmIHRoZSBudW1iZXIgb2YKKyAgLy8gY291bnRlcnMgZG9lcyBub3QgbWF0Y2guIFRoaXMgY291bGQgYmUgdGlnaHRlbmVkIGRvd24gaW4gdGhlIGZ1dHVyZSB0bworICAvLyBpZ25vcmUgY291bnRzIHdoZW4gdGhlIGlucHV0IGNoYW5nZXMgaW4gdmFyaW91cyB3YXlzLCBlLmcuLCBieSBjb21wYXJpbmcgYQorICAvLyBoYXNoIHZhbHVlIGJhc2VkIG9uIHNvbWUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBpbnB1dC4KKyAgUmVnaW9uQ291bnRzLnJlc2V0KG5ldyBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4pOworICB1aW50NjRfdCBIYXNoOworICBpZiAoUEdPRGF0YS0+Z2V0RnVuY3Rpb25Db3VudHMoZ2V0RnVuY05hbWUoKSwgSGFzaCwgKlJlZ2lvbkNvdW50cykgfHwKKyAgICAgIEhhc2ggIT0gRnVuY3Rpb25IYXNoIHx8IFJlZ2lvbkNvdW50cy0+c2l6ZSgpICE9IE51bVJlZ2lvbkNvdW50ZXJzKQorICAgIFJlZ2lvbkNvdW50cy5yZXNldCgpOworfQorCit2b2lkIENvZGVHZW5QR086OmRlc3Ryb3lSZWdpb25Db3VudGVycygpIHsKKyAgUmVnaW9uQ291bnRlck1hcC5yZXNldCgpOworICBTdG10Q291bnRNYXAucmVzZXQoKTsKKyAgUmVnaW9uQ291bnRzLnJlc2V0KCk7Cit9CisKKy8vLyBcYnJpZWYgQ2FsY3VsYXRlIHdoYXQgdG8gZGl2aWRlIGJ5IHRvIHNjYWxlIHdlaWdodHMuCisvLy8KKy8vLyBHaXZlbiB0aGUgbWF4aW11bSB3ZWlnaHQsIGNhbGN1bGF0ZSBhIGRpdmlzb3IgdGhhdCB3aWxsIHNjYWxlIGFsbCB0aGUKKy8vLyB3ZWlnaHRzIHRvIHN0cmljdGx5IGxlc3MgdGhhbiBVSU5UMzJfTUFYLgorc3RhdGljIHVpbnQ2NF90IGNhbGN1bGF0ZVdlaWdodFNjYWxlKHVpbnQ2NF90IE1heFdlaWdodCkgeworICByZXR1cm4gTWF4V2VpZ2h0IDwgVUlOVDMyX01BWCA/IDEgOiBNYXhXZWlnaHQgLyBVSU5UMzJfTUFYICsgMTsKK30KKworLy8vIFxicmllZiBTY2FsZSBhbiBpbmRpdmlkdWFsIGJyYW5jaCB3ZWlnaHQgKGFuZCBhZGQgMSkuCisvLy8KKy8vLyBTY2FsZSBhIDY0LWJpdCB3ZWlnaHQgZG93biB0byAzMi1iaXRzIHVzaW5nIFxjIFNjYWxlLgorLy8vCisvLy8gQWNjb3JkaW5nIHRvIExhcGxhY2UncyBSdWxlIG9mIFN1Y2Nlc3Npb24sIGl0IGlzIGJldHRlciB0byBjb21wdXRlIHRoZQorLy8vIHdlaWdodCBiYXNlZCBvbiB0aGUgY291bnQgcGx1cyAxLCBzbyB1bml2ZXJzYWxseSBhZGQgMSB0byB0aGUgdmFsdWUuCisvLy8KKy8vLyBccHJlIFxjIFNjYWxlIHdhcyBjYWxjdWxhdGVkIGJ5IFxhIGNhbGN1bGF0ZVdlaWdodFNjYWxlKCkgd2l0aCBhIHdlaWdodCBubworLy8vIGdyZWF0ZXIgdGhhbiBcYyBXZWlnaHQuCitzdGF0aWMgdWludDMyX3Qgc2NhbGVCcmFuY2hXZWlnaHQodWludDY0X3QgV2VpZ2h0LCB1aW50NjRfdCBTY2FsZSkgeworICBhc3NlcnQoU2NhbGUgJiYgInNjYWxlIGJ5IDA/Iik7CisgIHVpbnQ2NF90IFNjYWxlZCA9IFdlaWdodCAvIFNjYWxlICsgMTsKKyAgYXNzZXJ0KFNjYWxlZCA8PSBVSU5UMzJfTUFYICYmICJvdmVyZmxvdyAzMi1iaXRzIik7CisgIHJldHVybiBTY2FsZWQ7Cit9CisKK2xsdm06Ok1ETm9kZSAqQ29kZUdlblBHTzo6Y3JlYXRlQnJhbmNoV2VpZ2h0cyh1aW50NjRfdCBUcnVlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRmFsc2VDb3VudCkgeworICAvLyBDaGVjayBmb3IgZW1wdHkgd2VpZ2h0cy4KKyAgaWYgKCFUcnVlQ291bnQgJiYgIUZhbHNlQ291bnQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgLy8gQ2FsY3VsYXRlIGhvdyB0byBzY2FsZSBkb3duIHRvIDMyLWJpdHMuCisgIHVpbnQ2NF90IFNjYWxlID0gY2FsY3VsYXRlV2VpZ2h0U2NhbGUoc3RkOjptYXgoVHJ1ZUNvdW50LCBGYWxzZUNvdW50KSk7CisKKyAgbGx2bTo6TURCdWlsZGVyIE1ESGVscGVyKENHTS5nZXRMTFZNQ29udGV4dCgpKTsKKyAgcmV0dXJuIE1ESGVscGVyLmNyZWF0ZUJyYW5jaFdlaWdodHMoc2NhbGVCcmFuY2hXZWlnaHQoVHJ1ZUNvdW50LCBTY2FsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlQnJhbmNoV2VpZ2h0KEZhbHNlQ291bnQsIFNjYWxlKSk7Cit9CisKK2xsdm06Ok1ETm9kZSAqQ29kZUdlblBHTzo6Y3JlYXRlQnJhbmNoV2VpZ2h0cyhBcnJheVJlZjx1aW50NjRfdD4gV2VpZ2h0cykgeworICAvLyBXZSBuZWVkIGF0IGxlYXN0IHR3byBlbGVtZW50cyB0byBjcmVhdGUgbWVhbmluZ2Z1bCB3ZWlnaHRzLgorICBpZiAoV2VpZ2h0cy5zaXplKCkgPCAyKQorICAgIHJldHVybiBudWxscHRyOworCisgIC8vIENhbGN1bGF0ZSBob3cgdG8gc2NhbGUgZG93biB0byAzMi1iaXRzLgorICB1aW50NjRfdCBTY2FsZSA9IGNhbGN1bGF0ZVdlaWdodFNjYWxlKCpzdGQ6Om1heF9lbGVtZW50KFdlaWdodHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWlnaHRzLmVuZCgpKSk7CisKKyAgU21hbGxWZWN0b3I8dWludDMyX3QsIDE2PiBTY2FsZWRXZWlnaHRzOworICBTY2FsZWRXZWlnaHRzLnJlc2VydmUoV2VpZ2h0cy5zaXplKCkpOworICBmb3IgKHVpbnQ2NF90IFcgOiBXZWlnaHRzKQorICAgIFNjYWxlZFdlaWdodHMucHVzaF9iYWNrKHNjYWxlQnJhbmNoV2VpZ2h0KFcsIFNjYWxlKSk7CisKKyAgbGx2bTo6TURCdWlsZGVyIE1ESGVscGVyKENHTS5nZXRMTFZNQ29udGV4dCgpKTsKKyAgcmV0dXJuIE1ESGVscGVyLmNyZWF0ZUJyYW5jaFdlaWdodHMoU2NhbGVkV2VpZ2h0cyk7Cit9CisKK2xsdm06Ok1ETm9kZSAqQ29kZUdlblBHTzo6Y3JlYXRlTG9vcFdlaWdodHMoY29uc3QgU3RtdCAqQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uQ291bnRlciAmQ250KSB7CisgIGlmICghaGF2ZVJlZ2lvbkNvdW50cygpKQorICAgIHJldHVybiBudWxscHRyOworICB1aW50NjRfdCBMb29wQ291bnQgPSBDbnQuZ2V0Q291bnQoKTsKKyAgdWludDY0X3QgQ29uZENvdW50ID0gMDsKKyAgYm9vbCBGb3VuZCA9IGdldFN0bXRDb3VudChDb25kLCBDb25kQ291bnQpOworICBhc3NlcnQoRm91bmQgJiYgIm1pc3NpbmcgZXhwZWN0ZWQgbG9vcCBjb25kaXRpb24gY291bnQiKTsKKyAgKHZvaWQpRm91bmQ7CisgIGlmIChDb25kQ291bnQgPT0gMCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIGNyZWF0ZUJyYW5jaFdlaWdodHMoTG9vcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChDb25kQ291bnQsIExvb3BDb3VudCkgLSBMb29wQ291bnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQ29kZUdlblBHTy5oIGIvbGliL0NvZGVHZW4vQ29kZUdlblBHTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OWE1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvQ29kZUdlbi9Db2RlR2VuUEdPLmgKQEAgLTAsMCArMSwyNTYgQEAKKy8vPT09LS0tIENvZGVHZW5QR08uaCAtIFBHTyBJbnN0cnVtZW50YXRpb24gZm9yIExMVk0gQ29kZUdlbiAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW5zdHJ1bWVudGF0aW9uLWJhc2VkIHByb2ZpbGUtZ3VpZGVkIG9wdGltaXphdGlvbgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQ0xBTkdfQ09ERUdFTl9DT0RFR0VOUEdPX0gKKyNkZWZpbmUgQ0xBTkdfQ09ERUdFTl9DT0RFR0VOUEdPX0gKKworI2luY2x1ZGUgIkNHQnVpbGRlci5oIgorI2luY2x1ZGUgIkNvZGVHZW5Nb2R1bGUuaCIKKyNpbmNsdWRlICJDb2RlR2VuVHlwZXMuaCIKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db2RlR2VuT3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBjbGFuZyB7CituYW1lc3BhY2UgQ29kZUdlbiB7CitjbGFzcyBSZWdpb25Db3VudGVyOworCisvLy8gVGhlIHJhdyBjb3VudGVyIGRhdGEgZnJvbSBhbiBpbnN0cnVtZW50ZWQgUEdPIGJpbmFyeQorY2xhc3MgUEdPUHJvZmlsZURhdGEgeworcHJpdmF0ZToKKyAgLy8vIFRoZSBQR08gZGF0YQorICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBEYXRhQnVmZmVyOworICAvLy8gT2Zmc2V0cyBpbnRvIERhdGFCdWZmZXIgZm9yIGVhY2ggZnVuY3Rpb24ncyBjb3VudGVycworICBsbHZtOjpTdHJpbmdNYXA8dW5zaWduZWQ+IERhdGFPZmZzZXRzOworICAvLy8gRXhlY3V0aW9uIGNvdW50cyBmb3IgZWFjaCBmdW5jdGlvbi4KKyAgbGx2bTo6U3RyaW5nTWFwPHVpbnQ2NF90PiBGdW5jdGlvbkNvdW50czsKKyAgLy8vIFRoZSBtYXhpbWFsIGV4ZWN1dGlvbiBjb3VudCBhbW9uZyBhbGwgZnVuY3Rpb25zLgorICB1aW50NjRfdCBNYXhGdW5jdGlvbkNvdW50OworICBDb2RlR2VuTW9kdWxlICZDR007CitwdWJsaWM6CisgIFBHT1Byb2ZpbGVEYXRhKENvZGVHZW5Nb2R1bGUgJkNHTSwgc3RkOjpzdHJpbmcgUGF0aCk7CisgIC8vLyBGaWxsIENvdW50cyB3aXRoIHRoZSBwcm9maWxlIGRhdGEgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbiBuYW1lLiBSZXR1cm5zCisgIC8vLyBmYWxzZSBvbiBzdWNjZXNzLgorICBib29sIGdldEZ1bmN0aW9uQ291bnRzKFN0cmluZ1JlZiBGdW5jTmFtZSwgdWludDY0X3QgJkZ1bmNIYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiAmQ291bnRzKTsKKyAgLy8vIFJldHVybiB0aGUgbWF4aW11bSBvZiBhbGwga25vd24gZnVuY3Rpb24gY291bnRzLgorICB1aW50NjRfdCBnZXRNYXhpbXVtRnVuY3Rpb25Db3VudCgpIHsgcmV0dXJuIE1heEZ1bmN0aW9uQ291bnQ7IH0KK307CisKKy8vLyBQZXItZnVuY3Rpb24gUEdPIHN0YXRlLiBUaGlzIGNsYXNzIHNob3VsZCBnZW5lcmFsbHkgbm90IGJlIHVzZWQgZGlyZWN0bHksCisvLy8gYnV0IGluc3RlYWQgdGhyb3VnaCB0aGUgQ29kZUdlbkZ1bmN0aW9uIGFuZCBSZWdpb25Db3VudGVyIHR5cGVzLgorY2xhc3MgQ29kZUdlblBHTyB7Citwcml2YXRlOgorICBDb2RlR2VuTW9kdWxlICZDR007CisgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4gUHJlZml4ZWRGdW5jTmFtZTsKKyAgU3RyaW5nUmVmIFJhd0Z1bmNOYW1lOworICBsbHZtOjpHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzIFZhckxpbmthZ2U7CisKKyAgdW5zaWduZWQgTnVtUmVnaW9uQ291bnRlcnM7CisgIHVpbnQ2NF90IEZ1bmN0aW9uSGFzaDsKKyAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKlJlZ2lvbkNvdW50ZXJzOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6RGVuc2VNYXA8Y29uc3QgU3RtdCAqLCB1bnNpZ25lZD4+IFJlZ2lvbkNvdW50ZXJNYXA7CisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpEZW5zZU1hcDxjb25zdCBTdG10ICosIHVpbnQ2NF90Pj4gU3RtdENvdW50TWFwOworICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8dWludDY0X3Q+PiBSZWdpb25Db3VudHM7CisgIHVpbnQ2NF90IEN1cnJlbnRSZWdpb25Db3VudDsKKworcHVibGljOgorICBDb2RlR2VuUEdPKENvZGVHZW5Nb2R1bGUgJkNHTSkKKyAgICAgIDogQ0dNKENHTSksIE51bVJlZ2lvbkNvdW50ZXJzKDApLCBGdW5jdGlvbkhhc2goMCksIFJlZ2lvbkNvdW50ZXJzKDApLAorICAgICAgICBDdXJyZW50UmVnaW9uQ291bnQoMCkge30KKworICAvLy8gV2hldGhlciBvciBub3Qgd2UgaGF2ZSBQR08gcmVnaW9uIGRhdGEgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiBUaGlzIGlzCisgIC8vLyBmYWxzZSBib3RoIHdoZW4gd2UgaGF2ZSBubyBkYXRhIGF0IGFsbCBhbmQgd2hlbiBvdXIgZGF0YSBoYXMgYmVlbgorICAvLy8gZGlzY2FyZGVkLgorICBib29sIGhhdmVSZWdpb25Db3VudHMoKSBjb25zdCB7IHJldHVybiBSZWdpb25Db3VudHMgIT0gMDsgfQorCisgIC8vLyBHZXQgdGhlIHN0cmluZyB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgZnVuY3Rpb24gaW4gdGhlIHByb2ZpbGUgZGF0YS4KKyAgLy8vIEZvciBmdW5jdGlvbnMgd2l0aCBsb2NhbCBsaW5rYWdlLCB0aGlzIGluY2x1ZGVzIHRoZSBtYWluIGZpbGUgbmFtZS4KKyAgU3RyaW5nUmVmIGdldEZ1bmNOYW1lKCkgY29uc3QgeyByZXR1cm4gU3RyaW5nUmVmKCpQcmVmaXhlZEZ1bmNOYW1lKTsgfQorICBzdGQ6OnN0cmluZyBnZXRGdW5jVmFyTmFtZShTdHJpbmdSZWYgVmFyTmFtZSkgY29uc3QgeworICAgIHJldHVybiAoIl9fbGx2bV9wcm9maWxlXyIgKyBWYXJOYW1lICsgIl8iICsgUmF3RnVuY05hbWUpLnN0cigpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgY291bnRlciB2YWx1ZSBvZiB0aGUgY3VycmVudCByZWdpb24uCisgIHVpbnQ2NF90IGdldEN1cnJlbnRSZWdpb25Db3VudCgpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnRSZWdpb25Db3VudDsgfQorCisgIC8vLyBTZXQgdGhlIGNvdW50ZXIgdmFsdWUgZm9yIHRoZSBjdXJyZW50IHJlZ2lvbi4gVGhpcyBpcyB1c2VkIHRvIGtlZXAgdHJhY2sKKyAgLy8vIG9mIGNoYW5nZXMgdG8gdGhlIG1vc3QgcmVjZW50IGNvdW50ZXIgZnJvbSBjb250cm9sIGZsb3cgYW5kIG5vbi1sb2NhbAorICAvLy8gZXhpdHMuCisgIHZvaWQgc2V0Q3VycmVudFJlZ2lvbkNvdW50KHVpbnQ2NF90IENvdW50KSB7IEN1cnJlbnRSZWdpb25Db3VudCA9IENvdW50OyB9CisKKyAgLy8vIEluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgcmVnaW9uIGlzIG5ldmVyIHJlYWNoZWQsIGFuZCB0aHVzIHNob3VsZCBoYXZlIGEKKyAgLy8vIGNvdW50ZXIgdmFsdWUgb2YgemVyby4gVGhpcyBpcyBpbXBvcnRhbnQgc28gdGhhdCBzdWJzZXF1ZW50IHJlZ2lvbnMgY2FuCisgIC8vLyBjb3JyZWN0bHkgdHJhY2sgdGhlaXIgcGFyZW50IGNvdW50cy4KKyAgdm9pZCBzZXRDdXJyZW50UmVnaW9uVW5yZWFjaGFibGUoKSB7IHNldEN1cnJlbnRSZWdpb25Db3VudCgwKTsgfQorCisgIC8vLyBDaGVjayBpZiBhbiBleGVjdXRpb24gY291bnQgaXMga25vd24gZm9yIGEgZ2l2ZW4gc3RhdGVtZW50LiBJZiBzbywgcmV0dXJuCisgIC8vLyB0cnVlIGFuZCBwdXQgdGhlIHZhbHVlIGluIENvdW50OyBlbHNlIHJldHVybiBmYWxzZS4KKyAgYm9vbCBnZXRTdG10Q291bnQoY29uc3QgU3RtdCAqUywgdWludDY0X3QgJkNvdW50KSB7CisgICAgaWYgKCFTdG10Q291bnRNYXApCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgU3RtdCosIHVpbnQ2NF90Pjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgIEkgPSBTdG10Q291bnRNYXAtPmZpbmQoUyk7CisgICAgaWYgKEkgPT0gU3RtdENvdW50TWFwLT5lbmQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBDb3VudCA9IEktPnNlY29uZDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBJZiB0aGUgZXhlY3V0aW9uIGNvdW50IGZvciB0aGUgY3VycmVudCBzdGF0ZW1lbnQgaXMga25vd24sIHJlY29yZCB0aGF0CisgIC8vLyBhcyB0aGUgY3VycmVudCBjb3VudC4KKyAgdm9pZCBzZXRDdXJyZW50U3RtdChjb25zdCBTdG10ICpTKSB7CisgICAgdWludDY0X3QgQ291bnQ7CisgICAgaWYgKGdldFN0bXRDb3VudChTLCBDb3VudCkpCisgICAgICBzZXRDdXJyZW50UmVnaW9uQ291bnQoQ291bnQpOworICB9CisKKyAgLy8vIENhbGN1bGF0ZSBicmFuY2ggd2VpZ2h0cyBhcHByb3ByaWF0ZSBmb3IgUEdPIGRhdGEKKyAgbGx2bTo6TUROb2RlICpjcmVhdGVCcmFuY2hXZWlnaHRzKHVpbnQ2NF90IFRydWVDb3VudCwgdWludDY0X3QgRmFsc2VDb3VudCk7CisgIGxsdm06Ok1ETm9kZSAqY3JlYXRlQnJhbmNoV2VpZ2h0cyhBcnJheVJlZjx1aW50NjRfdD4gV2VpZ2h0cyk7CisgIGxsdm06Ok1ETm9kZSAqY3JlYXRlTG9vcFdlaWdodHMoY29uc3QgU3RtdCAqQ29uZCwgUmVnaW9uQ291bnRlciAmQ250KTsKKworICAvLy8gQXNzaWduIGNvdW50ZXJzIHRvIHJlZ2lvbnMgYW5kIGNvbmZpZ3VyZSB0aGVtIGZvciBQR08gb2YgYSBnaXZlbgorICAvLy8gZnVuY3Rpb24uIERvZXMgbm90aGluZyBpZiBpbnN0cnVtZW50YXRpb24gaXMgbm90IGVuYWJsZWQgYW5kIGVpdGhlcgorICAvLy8gZ2VuZXJhdGVzIGdsb2JhbCB2YXJpYWJsZXMgb3IgYXNzb2NpYXRlcyBQR08gZGF0YSB3aXRoIGVhY2ggb2YgdGhlCisgIC8vLyBjb3VudGVycyBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBhcmUgZ2VuZXJhdGluZyBvciB1c2luZyBpbnN0cnVtZW50YXRpb24uCisgIHZvaWQgYXNzaWduUmVnaW9uQ291bnRlcnMoY29uc3QgRGVjbCAqRCwgbGx2bTo6RnVuY3Rpb24gKkZuKTsKKyAgLy8vIEVtaXQgc3RhdGljIGRhdGEgc3RydWN0dXJlcyBmb3IgaW5zdHJ1bWVudGF0aW9uIGRhdGEuCisgIHZvaWQgZW1pdEluc3RydW1lbnRhdGlvbkRhdGEoKTsKKyAgLy8vIENsZWFuIHVwIHJlZ2lvbiBjb3VudGVyIHN0YXRlLiBNdXN0IGJlIGNhbGxlZCBpZiBhc3NpZ25SZWdpb25Db3VudGVycyBpcworICAvLy8gdXNlZC4KKyAgdm9pZCBkZXN0cm95UmVnaW9uQ291bnRlcnMoKTsKKyAgLy8vIEVtaXQgc3RhdGljIGluaXRpYWxpemF0aW9uIGNvZGUsIGlmIGFueS4KKyAgc3RhdGljIGxsdm06OkZ1bmN0aW9uICplbWl0SW5pdGlhbGl6YXRpb24oQ29kZUdlbk1vZHVsZSAmQ0dNKTsKKworcHJpdmF0ZToKKyAgdm9pZCBzZXRGdW5jTmFtZShsbHZtOjpGdW5jdGlvbiAqRm4pOworICB2b2lkIG1hcFJlZ2lvbkNvdW50ZXJzKGNvbnN0IERlY2wgKkQpOworICB2b2lkIGNvbXB1dGVSZWdpb25Db3VudHMoY29uc3QgRGVjbCAqRCk7CisgIHZvaWQgYXBwbHlGdW5jdGlvbkF0dHJpYnV0ZXMoUEdPUHJvZmlsZURhdGEgKlBHT0RhdGEsIGxsdm06OkZ1bmN0aW9uICpGbik7CisgIHZvaWQgbG9hZFJlZ2lvbkNvdW50cyhQR09Qcm9maWxlRGF0YSAqUEdPRGF0YSk7CisgIHZvaWQgZW1pdENvdW50ZXJWYXJpYWJsZXMoKTsKKyAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKmJ1aWxkRGF0YVZhcigpOworCisgIC8vLyBFbWl0IGNvZGUgdG8gaW5jcmVtZW50IHRoZSBjb3VudGVyIGF0IHRoZSBnaXZlbiBpbmRleAorICB2b2lkIGVtaXRDb3VudGVySW5jcmVtZW50KENHQnVpbGRlclR5ICZCdWlsZGVyLCB1bnNpZ25lZCBDb3VudGVyKTsKKworICAvLy8gUmV0dXJuIHRoZSByZWdpb24gY291bnRlciBmb3IgdGhlIGdpdmVuIHN0YXRlbWVudC4gVGhpcyBzaG91bGQgb25seSBiZQorICAvLy8gY2FsbGVkIG9uIHN0YXRlbWVudHMgdGhhdCBoYXZlIGEgZGVkaWNhdGVkIGNvdW50ZXIuCisgIHVuc2lnbmVkIGdldFJlZ2lvbkNvdW50ZXIoY29uc3QgU3RtdCAqUykgeworICAgIGlmIChSZWdpb25Db3VudGVyTWFwID09IDApCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gKCpSZWdpb25Db3VudGVyTWFwKVtTXTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHJlZ2lvbiBjb3VudCBmb3IgdGhlIGNvdW50ZXIgYXQgdGhlIGdpdmVuIGluZGV4LgorICB1aW50NjRfdCBnZXRSZWdpb25Db3VudCh1bnNpZ25lZCBDb3VudGVyKSB7CisgICAgaWYgKCFoYXZlUmVnaW9uQ291bnRzKCkpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gKCpSZWdpb25Db3VudHMpW0NvdW50ZXJdOworICB9CisKKyAgZnJpZW5kIGNsYXNzIFJlZ2lvbkNvdW50ZXI7Cit9OworCisvLy8gQSBjb3VudGVyIGZvciBhIHBhcnRpY3VsYXIgcmVnaW9uLiBUaGlzIGlzIHRoZSBwcmltYXJ5IGludGVyZmFjZSB0aHJvdWdoCisvLy8gd2hpY2ggY2xpZW50cyBtYW5hZ2UgUEdPIGNvdW50ZXJzIGFuZCB0aGVpciB2YWx1ZXMuCitjbGFzcyBSZWdpb25Db3VudGVyIHsKKyAgQ29kZUdlblBHTyAqUEdPOworICB1bnNpZ25lZCBDb3VudGVyOworICB1aW50NjRfdCBDb3VudDsKKyAgdWludDY0X3QgUGFyZW50Q291bnQ7CisgIHVpbnQ2NF90IFJlZ2lvbkNvdW50OworICBpbnQ2NF90IEFkanVzdDsKKworICBSZWdpb25Db3VudGVyKENvZGVHZW5QR08gJlBHTywgdW5zaWduZWQgQ291bnRlckluZGV4KQorICAgIDogUEdPKCZQR08pLCBDb3VudGVyKENvdW50ZXJJbmRleCksIENvdW50KFBHTy5nZXRSZWdpb25Db3VudChDb3VudGVyKSksCisgICAgICBQYXJlbnRDb3VudChQR08uZ2V0Q3VycmVudFJlZ2lvbkNvdW50KCkpLCBBZGp1c3QoMCkge30KKworcHVibGljOgorICBSZWdpb25Db3VudGVyKENvZGVHZW5QR08gJlBHTywgY29uc3QgU3RtdCAqUykKKyAgICA6IFBHTygmUEdPKSwgQ291bnRlcihQR08uZ2V0UmVnaW9uQ291bnRlcihTKSksCisgICAgICBDb3VudChQR08uZ2V0UmVnaW9uQ291bnQoQ291bnRlcikpLAorICAgICAgUGFyZW50Q291bnQoUEdPLmdldEN1cnJlbnRSZWdpb25Db3VudCgpKSwgQWRqdXN0KDApIHt9CisKKyAgLy8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIuIEluIG1vc3QgY2FzZXMgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzCisgIC8vLyB0aGUgcmVnaW9uIG9mIHRoZSBjb3VudGVyIHdhcyBlbnRlcmVkLCBidXQgZm9yIHN3aXRjaCBsYWJlbHMgaXQncyB0aGUKKyAgLy8vIG51bWJlciBvZiBkaXJlY3QganVtcHMgdG8gdGhhdCBsYWJlbC4KKyAgdWludDY0X3QgZ2V0Q291bnQoKSBjb25zdCB7IHJldHVybiBDb3VudDsgfQorCisgIC8vLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyIHdpdGggYWRqdXN0bWVudHMgYXBwbGllZC4gQWRqdXN0bWVudHMgb2NjdXIKKyAgLy8vIHdoZW4gY29udHJvbCBlbnRlcnMgb3IgbGVhdmVzIHRoZSByZWdpb24gYWJub3JtYWxseTsgaS5lLiwgaWYgdGhlcmUgaXMgYQorICAvLy8ganVtcCB0byBhIGxhYmVsIHdpdGhpbiB0aGUgcmVnaW9uLCBvciBpZiB0aGUgZnVuY3Rpb24gY2FuIHJldHVybiBmcm9tCisgIC8vLyB3aXRoaW4gdGhlIHJlZ2lvbi4gVGhlIGFkanVzdGVkIGNvdW50LCB0aGVuLCBpcyB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIKKyAgLy8vIGF0IHRoZSBlbmQgb2YgdGhlIHJlZ2lvbi4KKyAgdWludDY0X3QgZ2V0QWRqdXN0ZWRDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ291bnQgKyBBZGp1c3Q7CisgIH0KKworICAvLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY291bnRlciBpbiB0aGlzIHJlZ2lvbidzIHBhcmVudCwgaS5lLiwgdGhlIHJlZ2lvbgorICAvLy8gdGhhdCB3YXMgYWN0aXZlIHdoZW4gdGhpcyByZWdpb24gYmVnYW4uIFRoaXMgaXMgdXNlZnVsIGZvciBkZXJpdmluZworICAvLy8gY291bnRzIGluIGltcGxpY2l0bHkgY291bnRlZCByZWdpb25zLCBsaWtlIHRoZSBmYWxzZSBjYXNlIG9mIGEgY29uZGl0aW9uCisgIC8vLyBvciB0aGUgbm9ybWFsIGV4aXRzIG9mIGEgbG9vcC4KKyAgdWludDY0X3QgZ2V0UGFyZW50Q291bnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnRDb3VudDsgfQorCisgIC8vLyBBY3RpdmF0ZSB0aGUgY291bnRlciBieSBlbWl0dGluZyBhbiBpbmNyZW1lbnQgYW5kIHN0YXJ0aW5nIHRvIHRyYWNrCisgIC8vLyBhZGp1c3RtZW50cy4gSWYgQWRkSW5jb21pbmdGYWxsVGhyb3VnaCBpcyB0cnVlLCB0aGUgY3VycmVudCByZWdpb24gY291bnQKKyAgLy8vIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvdW50ZXIgZm9yIHRoZSBwdXJwb3NlcyBvZiB0cmFja2luZyB0aGUgcmVnaW9uLgorICB2b2lkIGJlZ2luUmVnaW9uKENHQnVpbGRlclR5ICZCdWlsZGVyLCBib29sIEFkZEluY29taW5nRmFsbFRocm91Z2g9ZmFsc2UpIHsKKyAgICBiZWdpblJlZ2lvbihBZGRJbmNvbWluZ0ZhbGxUaHJvdWdoKTsKKyAgICBQR08tPmVtaXRDb3VudGVySW5jcmVtZW50KEJ1aWxkZXIsIENvdW50ZXIpOworICB9CisgIHZvaWQgYmVnaW5SZWdpb24oYm9vbCBBZGRJbmNvbWluZ0ZhbGxUaHJvdWdoPWZhbHNlKSB7CisgICAgUmVnaW9uQ291bnQgPSBDb3VudDsKKyAgICBpZiAoQWRkSW5jb21pbmdGYWxsVGhyb3VnaCkKKyAgICAgIFJlZ2lvbkNvdW50ICs9IFBHTy0+Z2V0Q3VycmVudFJlZ2lvbkNvdW50KCk7CisgICAgUEdPLT5zZXRDdXJyZW50UmVnaW9uQ291bnQoUmVnaW9uQ291bnQpOworICB9CisKKyAgLy8vIEZvciBjb3VudGVycyBvbiBib29sZWFuIGJyYW5jaGVzLCBiZWdpbnMgdHJhY2tpbmcgYWRqdXN0bWVudHMgZm9yIHRoZQorICAvLy8gdW5jb3VudGVkIHBhdGguCisgIHZvaWQgYmVnaW5FbHNlUmVnaW9uKCkgeworICAgIFJlZ2lvbkNvdW50ID0gUGFyZW50Q291bnQgLSBDb3VudDsKKyAgICBQR08tPnNldEN1cnJlbnRSZWdpb25Db3VudChSZWdpb25Db3VudCk7CisgIH0KKworICAvLy8gUmVzZXQgdGhlIGN1cnJlbnQgcmVnaW9uIGNvdW50LgorICB2b2lkIHNldEN1cnJlbnRSZWdpb25Db3VudCh1aW50NjRfdCBDdXJyZW50Q291bnQpIHsKKyAgICBSZWdpb25Db3VudCA9IEN1cnJlbnRDb3VudDsKKyAgICBQR08tPnNldEN1cnJlbnRSZWdpb25Db3VudChSZWdpb25Db3VudCk7CisgIH0KKworICAvLy8gQWRqdXN0IGZvciBub24tbG9jYWwgY29udHJvbCBmbG93IGFmdGVyIGVtaXR0aW5nIGEgc3ViZXhwcmVzc2lvbiBvcgorICAvLy8gc3Vic3RhdGVtZW50LiBUaGlzIG11c3QgYmUgY2FsbGVkIHRvIGFjY291bnQgZm9yIGNvbnN0cnVjdHMgc3VjaCBhcyBnb3RvcywKKyAgLy8vIGxhYmVscywgYW5kIHJldHVybnMsIHNvIHRoYXQgd2UgY2FuIGVuc3VyZSB0aGF0IG91ciByZWdpb24ncyBjb3VudCBpcworICAvLy8gY29ycmVjdCBpbiB0aGUgY29kZSB0aGF0IGZvbGxvd3MuCisgIHZvaWQgYWRqdXN0Rm9yQ29udHJvbEZsb3coKSB7CisgICAgQWRqdXN0ICs9IFBHTy0+Z2V0Q3VycmVudFJlZ2lvbkNvdW50KCkgLSBSZWdpb25Db3VudDsKKyAgICAvLyBSZXNldCB0aGUgcmVnaW9uIGNvdW50IGluIGNhc2UgdGhpcyBpcyBjYWxsZWQgYWdhaW4gbGF0ZXIuCisgICAgUmVnaW9uQ291bnQgPSBQR08tPmdldEN1cnJlbnRSZWdpb25Db3VudCgpOworICB9CisKKyAgLy8vIENvbW1pdCBhbGwgYWRqdXN0bWVudHMgdG8gdGhlIGN1cnJlbnQgcmVnaW9uLiBJZiB0aGUgcmVnaW9uIGlzIGEgbG9vcCwKKyAgLy8vIHRoZSBMb29wQWRqdXN0IHZhbHVlIHNob3VsZCBiZSB0aGUgY291bnQgb2YgYWxsIHRoZSBicmVha3MgYW5kIGNvbnRpbnVlcworICAvLy8gZnJvbSB0aGUgbG9vcCwgdG8gY29tcGVuc2F0ZSBmb3IgdGhvc2UgY291bnRzIGJlaW5nIGRlZHVjdGVkIGZyb20gdGhlCisgIC8vLyBhZGp1c3RtZW50cyBmb3IgdGhlIGJvZHkgb2YgdGhlIGxvb3AuCisgIHZvaWQgYXBwbHlBZGp1c3RtZW50c1RvUmVnaW9uKHVpbnQ2NF90IExvb3BBZGp1c3QpIHsKKyAgICBQR08tPnNldEN1cnJlbnRSZWdpb25Db3VudChQYXJlbnRDb3VudCArIEFkanVzdCArIExvb3BBZGp1c3QpOworICB9Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIENvZGVHZW4KK30gIC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9Db2RlR2VuVHlwZXMuY3BwIGIvbGliL0NvZGVHZW4vQ29kZUdlblR5cGVzLmNwcAppbmRleCA1ZjNjNTljLi5iN2YzNzQ2IDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9Db2RlR2VuVHlwZXMuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0NvZGVHZW5UeXBlcy5jcHAKQEAgLTM4LDEwICszOCw3IEBACiB9CiAKIENvZGVHZW5UeXBlczo6fkNvZGVHZW5UeXBlcygpIHsKLSAgZm9yIChsbHZtOjpEZW5zZU1hcDxjb25zdCBUeXBlICosIENHUmVjb3JkTGF5b3V0ICo+OjppdGVyYXRvcgotICAgICAgICAgSSA9IENHUmVjb3JkTGF5b3V0cy5iZWdpbigpLCBFID0gQ0dSZWNvcmRMYXlvdXRzLmVuZCgpOwotICAgICAgSSAhPSBFOyArK0kpCi0gICAgZGVsZXRlIEktPnNlY29uZDsKKyAgbGx2bTo6RGVsZXRlQ29udGFpbmVyU2Vjb25kcyhDR1JlY29yZExheW91dHMpOwogCiAgIGZvciAobGx2bTo6Rm9sZGluZ1NldDxDR0Z1bmN0aW9uSW5mbz46Oml0ZXJhdG9yCiAgICAgICAgSSA9IEZ1bmN0aW9uSW5mb3MuYmVnaW4oKSwgRSA9IEZ1bmN0aW9uSW5mb3MuZW5kKCk7IEkgIT0gRTsgKQpAQCAtMTM0LDE3ICsxMzEsMTUgQEAKICAgLy8gd2hlbiBhIGNsYXNzIGlzIHRyYW5zbGF0ZWQsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlbid0IGVtYmVkZGVkIGJ5LXZhbHVlIGludG8KICAgLy8gdGhlIGNsYXNzLgogICBpZiAoY29uc3QgQ1hYUmVjb3JkRGVjbCAqQ1JEID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4oUkQpKSB7Ci0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBDUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICBFID0gQ1JELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgICBpZiAoIWlzU2FmZVRvQ29udmVydChJLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSwKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBDUkQtPmJhc2VzKCkpCisgICAgICBpZiAoIWlzU2FmZVRvQ29udmVydChJLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dULCBBbHJlYWR5Q2hlY2tlZCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgfQogICAKICAgLy8gSWYgdGhpcyB0eXBlIHdvdWxkIHJlcXVpcmUgbGF5aW5nIG91dCBtZW1iZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBsYWlkCiAgIC8vIG91dCwgZG9uJ3QgZG8gaXQuCi0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgSSA9IFJELT5maWVsZF9iZWdpbigpLAotICAgICAgIEUgPSBSRC0+ZmllbGRfZW5kKCk7IEkgIT0gRTsgKytJKQorICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBSRC0+ZmllbGRzKCkpCiAgICAgaWYgKCFpc1NhZmVUb0NvbnZlcnQoSS0+Z2V0VHlwZSgpLCBDR1QsIEFscmVhZHlDaGVja2VkKSkKICAgICAgIHJldHVybiBmYWxzZTsKICAgCkBAIC0xODYsMTMgKzE4MSwxMiBAQAogICByZXR1cm4gaXNTYWZlVG9Db252ZXJ0KFJELCBDR1QsIEFscmVhZHlDaGVja2VkKTsKIH0KIAotCi0vLy8gaXNGdW5jVHlwZUFyZ3VtZW50Q29udmVydGlibGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW4gYSAKLS8vLyBmdW5jdGlvbiBhcmd1bWVudCBvciByZXN1bHQgcG9zaXRpb24gY2FuIGJlIGNvbnZlcnRlZCB0byBhbiBJUiB0eXBlIGF0IHRoaXMKKy8vLyBpc0Z1bmNQYXJhbVR5cGVDb252ZXJ0aWJsZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpbiBhCisvLy8gZnVuY3Rpb24gcGFyYW1ldGVyIG9yIHJlc3VsdCBwb3NpdGlvbiBjYW4gYmUgY29udmVydGVkIHRvIGFuIElSIHR5cGUgYXQgdGhpcwogLy8vIHBvaW50LiAgVGhpcyBib2lscyBkb3duIHRvIGJlaW5nIHdoZXRoZXIgaXQgaXMgY29tcGxldGUsIGFzIHdlbGwgYXMgd2hldGhlcgogLy8vIHdlJ3ZlIHRlbXBvcmFyaWx5IGRlZmVycmVkIGV4cGFuZGluZyB0aGUgdHlwZSBiZWNhdXNlIHdlJ3JlIGluIGEgcmVjdXJzaXZlCiAvLy8gY29udGV4dC4KLWJvb2wgQ29kZUdlblR5cGVzOjppc0Z1bmNUeXBlQXJndW1lbnRDb252ZXJ0aWJsZShRdWFsVHlwZSBUeSkgeworYm9vbCBDb2RlR2VuVHlwZXM6OmlzRnVuY1BhcmFtVHlwZUNvbnZlcnRpYmxlKFF1YWxUeXBlIFR5KSB7CiAgIC8vIElmIHRoaXMgaXNuJ3QgYSB0YWdnZWQgdHlwZSwgd2UgY2FuIGNvbnZlcnQgaXQhCiAgIGNvbnN0IFRhZ1R5cGUgKlRUID0gVHktPmdldEFzPFRhZ1R5cGU+KCk7CiAgIGlmIChUVCA9PSAwKSByZXR1cm4gdHJ1ZTsKQEAgLTIxNywxNyArMjExLDE3IEBACiAKIAogLy8vIENvZGUgdG8gdmVyaWZ5IGEgZ2l2ZW4gZnVuY3Rpb24gdHlwZSBpcyBjb21wbGV0ZSwgaS5lLiB0aGUgcmV0dXJuIHR5cGUKLS8vLyBhbmQgYWxsIG9mIHRoZSBhcmd1bWVudCB0eXBlcyBhcmUgY29tcGxldGUuICBBbHNvIGNoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4KKy8vLyBhbmQgYWxsIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIGNvbXBsZXRlLiAgQWxzbyBjaGVjayB0byBzZWUgaWYgd2UgYXJlIGluCiAvLy8gYSBSU19TdHJ1Y3RQb2ludGVyIGNvbnRleHQsIGFuZCBpZiBzbyB3aGV0aGVyIGFueSBzdHJ1Y3QgdHlwZXMgaGF2ZSBiZWVuCiAvLy8gcGVuZGVkLiAgSWYgc28sIHdlIGRvbid0IHdhbnQgdG8gYXNrIHRoZSBBQkkgbG93ZXJpbmcgY29kZSB0byBoYW5kbGUgYSB0eXBlCiAvLy8gdGhhdCBjYW5ub3QgYmUgY29udmVydGVkIHRvIGFuIElSIHR5cGUuCiBib29sIENvZGVHZW5UeXBlczo6aXNGdW5jVHlwZUNvbnZlcnRpYmxlKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQpIHsKLSAgaWYgKCFpc0Z1bmNUeXBlQXJndW1lbnRDb252ZXJ0aWJsZShGVC0+Z2V0UmVzdWx0VHlwZSgpKSkKKyAgaWYgKCFpc0Z1bmNQYXJhbVR5cGVDb252ZXJ0aWJsZShGVC0+Z2V0UmV0dXJuVHlwZSgpKSkKICAgICByZXR1cm4gZmFsc2U7CiAgIAogICBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGVCkpCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZQVC0+Z2V0TnVtQXJncygpOyBpICE9IGU7IGkrKykKLSAgICAgIGlmICghaXNGdW5jVHlwZUFyZ3VtZW50Q29udmVydGlibGUoRlBULT5nZXRBcmdUeXBlKGkpKSkKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRlBULT5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyBpKyspCisgICAgICBpZiAoIWlzRnVuY1BhcmFtVHlwZUNvbnZlcnRpYmxlKEZQVC0+Z2V0UGFyYW1UeXBlKGkpKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgIHJldHVybiB0cnVlOwpAQCAtNDc5LDExICs0NzMsMTEgQEAKIAogICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiBvZiBhbGwgdGhlIHJlbGV2YW50IHJlY29yZCB0eXBlcywgdG8gbWFrZSBzdXJlCiAgICAgICAvLyB3ZSByZS1jb252ZXJ0IHRoZSBGdW5jdGlvblR5cGUgd2hlbiBhcHByb3ByaWF0ZS4KLSAgICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpSVCA9IEZULT5nZXRSZXN1bHRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCkpCisgICAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBGVC0+Z2V0UmV0dXJuVHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpKQogICAgICAgICBDb252ZXJ0UmVjb3JkRGVjbFR5cGUoUlQtPmdldERlY2woKSk7CiAgICAgICBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGVCkpCi0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGUFQtPmdldE51bUFyZ3MoKTsgaSAhPSBlOyBpKyspCi0gICAgICAgICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKlJUID0gRlBULT5nZXRBcmdUeXBlKGkpLT5nZXRBczxSZWNvcmRUeXBlPigpKQorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRlBULT5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyBpKyspCisgICAgICAgICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKlJUID0gRlBULT5nZXRQYXJhbVR5cGUoaSktPmdldEFzPFJlY29yZFR5cGU+KCkpCiAgICAgICAgICAgICBDb252ZXJ0UmVjb3JkRGVjbFR5cGUoUlQtPmdldERlY2woKSk7CiAKICAgICAgIC8vIFJldHVybiBhIHBsYWNlaG9sZGVyIHR5cGUuCkBAIC00OTMsNyArNDg3LDcgQEAKICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8vIFdoaWxlIHdlJ3JlIGNvbnZlcnRpbmcgdGhlIGFyZ3VtZW50IHR5cGVzIGZvciBhIGZ1bmN0aW9uLCB3ZSBkb24ndCB3YW50CisgICAgLy8gV2hpbGUgd2UncmUgY29udmVydGluZyB0aGUgcGFyYW1ldGVyIHR5cGVzIGZvciBhIGZ1bmN0aW9uLCB3ZSBkb24ndCB3YW50CiAgICAgLy8gdG8gcmVjdXJzaXZlbHkgY29udmVydCBhbnkgcG9pbnRlZC10byBzdHJ1Y3RzLiAgQ29udmVydGluZyBkaXJlY3RseS11c2VkCiAgICAgLy8gc3RydWN0cyBpcyBvayB0aG91Z2guCiAgICAgaWYgKCFSZWNvcmRzQmVpbmdMYWlkT3V0Lmluc2VydChUeSkpIHsKQEAgLTY1NSwxMSArNjQ5LDEwIEBACiAgIAogICAvLyBGb3JjZSBjb252ZXJzaW9uIG9mIG5vbi12aXJ0dWFsIGJhc2UgY2xhc3NlcyByZWN1cnNpdmVseS4KICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKkNSRCA9IGR5bl9jYXN0PENYWFJlY29yZERlY2w+KFJEKSkgewotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBpID0gQ1JELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgZSA9IENSRC0+YmFzZXNfZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgICBpZiAoaS0+aXNWaXJ0dWFsKCkpIGNvbnRpbnVlOworICAgIGZvciAoY29uc3QgYXV0byAmSSA6IENSRC0+YmFzZXMoKSkgeworICAgICAgaWYgKEkuaXNWaXJ0dWFsKCkpIGNvbnRpbnVlOwogICAgICAgCi0gICAgICBDb252ZXJ0UmVjb3JkRGVjbFR5cGUoaS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgQ29udmVydFJlY29yZERlY2xUeXBlKEkuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9Db2RlR2VuVHlwZXMuaCBiL2xpYi9Db2RlR2VuL0NvZGVHZW5UeXBlcy5oCmluZGV4IDk0Y2E5ZTIuLjU5ZTMwODkgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0NvZGVHZW5UeXBlcy5oCisrKyBiL2xpYi9Db2RlR2VuL0NvZGVHZW5UeXBlcy5oCkBAIC0xMzYsOCArMTM2LDggQEAKICAgLy8vIGJlIGNvbnZlcnRlZCB0byBhbiBMTFZNIHR5cGUgKGkuZS4gZG9lc24ndCBkZXBlbmQgb24gYW4gaW5jb21wbGV0ZSB0YWcKICAgLy8vIHR5cGUpLgogICBib29sIGlzRnVuY1R5cGVDb252ZXJ0aWJsZShjb25zdCBGdW5jdGlvblR5cGUgKkZUKTsKLSAgYm9vbCBpc0Z1bmNUeXBlQXJndW1lbnRDb252ZXJ0aWJsZShRdWFsVHlwZSBUeSk7Ci0gIAorICBib29sIGlzRnVuY1BhcmFtVHlwZUNvbnZlcnRpYmxlKFF1YWxUeXBlIFR5KTsKKwogICAvLy8gR2V0RnVuY3Rpb25UeXBlRm9yVlRhYmxlIC0gR2V0IHRoZSBMTFZNIGZ1bmN0aW9uIHR5cGUgZm9yIHVzZSBpbiBhIHZ0YWJsZSwKICAgLy8vIGdpdmVuIGEgQ1hYTWV0aG9kRGVjbC4gSWYgdGhlIG1ldGhvZCB0byBoYXMgYW4gaW5jb21wbGV0ZSByZXR1cm4gdHlwZSwKICAgLy8vIGFuZC9vciBpbmNvbXBsZXRlIGFyZ3VtZW50IHR5cGVzLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBvcGFxdWUgdHlwZS4KQEAgLTE3NSwxMCArMTc1LDEwIEBACiAKICAgY29uc3QgQ0dGdW5jdGlvbkluZm8gJmFycmFuZ2VHbG9iYWxEZWNsYXJhdGlvbihHbG9iYWxEZWNsIEdEKTsKICAgY29uc3QgQ0dGdW5jdGlvbkluZm8gJmFycmFuZ2VGdW5jdGlvbkRlY2xhcmF0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQpOwotICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmYXJyYW5nZUZ1bmN0aW9uRGVjbGFyYXRpb24oUXVhbFR5cGUgUmVzVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkFyZ0xpc3QgJkFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblR5cGU6OkV4dEluZm8gJkluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVmFyaWFkaWMpOworICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmCisgIGFycmFuZ2VGcmVlRnVuY3Rpb25EZWNsYXJhdGlvbihRdWFsVHlwZSBSZXNUeSwgY29uc3QgRnVuY3Rpb25BcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25UeXBlOjpFeHRJbmZvICZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhcmlhZGljKTsKIAogICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmYXJyYW5nZU9iakNNZXRob2REZWNsYXJhdGlvbihjb25zdCBPYmpDTWV0aG9kRGVjbCAqTUQpOwogICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmYXJyYW5nZU9iakNNZXNzYWdlU2VuZFNpZ25hdHVyZShjb25zdCBPYmpDTWV0aG9kRGVjbCAqTUQsCkBAIC0xODgsNiArMTg4LDEwIEBACiAgIGNvbnN0IENHRnVuY3Rpb25JbmZvICZhcnJhbmdlQ1hYQ29uc3RydWN0b3JEZWNsYXJhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ3RvclR5cGUgVHlwZSk7CisgIGNvbnN0IENHRnVuY3Rpb25JbmZvICZhcnJhbmdlQ1hYQ29uc3RydWN0b3JDYWxsKGNvbnN0IENhbGxBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEN0b3JUeXBlIEN0b3JLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFeHRyYUFyZ3MpOwogICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmYXJyYW5nZUNYWERlc3RydWN0b3IoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhEdG9yVHlwZSBUeXBlKTsKIApAQCAtMjE2LDYgKzIyMCw3IEBACiAgIC8vLwogICAvLy8gXHBhcmFtIGFyZ1R5cGVzIC0gbXVzdCBhbGwgYWN0dWFsbHkgYmUgY2Fub25pY2FsIGFzIHBhcmFtcwogICBjb25zdCBDR0Z1bmN0aW9uSW5mbyAmYXJyYW5nZUxMVk1GdW5jdGlvbkluZm8oQ2FuUXVhbFR5cGUgcmV0dXJuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbnN0YW5jZU1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENhblF1YWxUeXBlPiBhcmdUeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbyBpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRBcmdzIGFyZ3MpOwpkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vRUhTY29wZVN0YWNrLmggYi9saWIvQ29kZUdlbi9FSFNjb3BlU3RhY2suaAppbmRleCBlOWQ5YTMzLi4xNjZkNDIwIDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9FSFNjb3BlU3RhY2suaAorKysgYi9saWIvQ29kZUdlbi9FSFNjb3BlU3RhY2suaApAQCAtMTksOCArMTksOCBAQAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgogI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgotI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKICNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKIAogbmFtZXNwYWNlIGNsYW5nIHsKIG5hbWVzcGFjZSBDb2RlR2VuIHsKQEAgLTY1LDkgKzY1LDkgQEAKIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgRG9taW5hdGluZ1ZhbHVlIDogSW52YXJpYW50VmFsdWU8VD4ge307CiAKIHRlbXBsYXRlIDxjbGFzcyBULCBib29sIG1pZ2h0QmVJbnN0cnVjdGlvbiA9Ci0gICAgICAgICAgICBsbHZtOjppc19iYXNlX29mPGxsdm06OlZhbHVlLCBUPjo6dmFsdWUgJiYKLSAgICAgICAgICAgICFsbHZtOjppc19iYXNlX29mPGxsdm06OkNvbnN0YW50LCBUPjo6dmFsdWUgJiYKLSAgICAgICAgICAgICFsbHZtOjppc19iYXNlX29mPGxsdm06OkJhc2ljQmxvY2ssIFQ+Ojp2YWx1ZT4KKyAgICAgICAgICAgIHN0ZDo6aXNfYmFzZV9vZjxsbHZtOjpWYWx1ZSwgVD46OnZhbHVlICYmCisgICAgICAgICAgICAhc3RkOjppc19iYXNlX29mPGxsdm06OkNvbnN0YW50LCBUPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICFzdGQ6OmlzX2Jhc2Vfb2Y8bGx2bTo6QmFzaWNCbG9jaywgVD46OnZhbHVlPgogc3RydWN0IERvbWluYXRpbmdQb2ludGVyOwogdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBEb21pbmF0aW5nUG9pbnRlcjxULGZhbHNlPiA6IEludmFyaWFudFZhbHVlPFQqPiB7fTsKIC8vIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgRG9taW5hdGluZ1BvaW50ZXI8VCx0cnVlPiBhdCBlbmQgb2YgZmlsZQpAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgdHlwZWRlZiB0eXBlbmFtZSBEb21pbmF0aW5nVmFsdWU8QTA+OjpzYXZlZF90eXBlIEEwX3NhdmVkOwogICAgIEEwX3NhdmVkIGEwX3NhdmVkOwogCi0gICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgeworICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIG92ZXJyaWRlIHsKICAgICAgIEEwIGEwID0gRG9taW5hdGluZ1ZhbHVlPEEwPjo6cmVzdG9yZShDR0YsIGEwX3NhdmVkKTsKICAgICAgIFQoYTApLkVtaXQoQ0dGLCBmbGFncyk7CiAgICAgfQpAQCAtMTk5LDcgKzE5OSw3IEBACiAgICAgQTBfc2F2ZWQgYTBfc2F2ZWQ7CiAgICAgQTFfc2F2ZWQgYTFfc2F2ZWQ7CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgQTAgYTAgPSBEb21pbmF0aW5nVmFsdWU8QTA+OjpyZXN0b3JlKENHRiwgYTBfc2F2ZWQpOwogICAgICAgQTEgYTEgPSBEb21pbmF0aW5nVmFsdWU8QTE+OjpyZXN0b3JlKENHRiwgYTFfc2F2ZWQpOwogICAgICAgVChhMCwgYTEpLkVtaXQoQ0dGLCBmbGFncyk7CkBAIC0yMTksNyArMjE5LDcgQEAKICAgICBBMV9zYXZlZCBhMV9zYXZlZDsKICAgICBBMl9zYXZlZCBhMl9zYXZlZDsKIAotICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSBvdmVycmlkZSB7CiAgICAgICBBMCBhMCA9IERvbWluYXRpbmdWYWx1ZTxBMD46OnJlc3RvcmUoQ0dGLCBhMF9zYXZlZCk7CiAgICAgICBBMSBhMSA9IERvbWluYXRpbmdWYWx1ZTxBMT46OnJlc3RvcmUoQ0dGLCBhMV9zYXZlZCk7CiAgICAgICBBMiBhMiA9IERvbWluYXRpbmdWYWx1ZTxBMj46OnJlc3RvcmUoQ0dGLCBhMl9zYXZlZCk7CkBAIC0yNDIsNyArMjQyLDcgQEAKICAgICBBMl9zYXZlZCBhMl9zYXZlZDsKICAgICBBM19zYXZlZCBhM19zYXZlZDsKIAotICAgIHZvaWQgRW1pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgRmxhZ3MgZmxhZ3MpIHsKKyAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSBvdmVycmlkZSB7CiAgICAgICBBMCBhMCA9IERvbWluYXRpbmdWYWx1ZTxBMD46OnJlc3RvcmUoQ0dGLCBhMF9zYXZlZCk7CiAgICAgICBBMSBhMSA9IERvbWluYXRpbmdWYWx1ZTxBMT46OnJlc3RvcmUoQ0dGLCBhMV9zYXZlZCk7CiAgICAgICBBMiBhMiA9IERvbWluYXRpbmdWYWx1ZTxBMj46OnJlc3RvcmUoQ0dGLCBhMl9zYXZlZCk7CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9JdGFuaXVtQ1hYQUJJLmNwcCBiL2xpYi9Db2RlR2VuL0l0YW5pdW1DWFhBQkkuY3BwCmluZGV4IDBlOGYzMWEuLjI3ODI1YWIgMTAwNjQ0Ci0tLSBhL2xpYi9Db2RlR2VuL0l0YW5pdW1DWFhBQkkuY3BwCisrKyBiL2xpYi9Db2RlR2VuL0l0YW5pdW1DWFhBQkkuY3BwCkBAIC01MiwxMyArNTIsMTMgQEAKICAgICBDR0NYWEFCSShDR00pLCBVc2VBUk1NZXRob2RQdHJBQkkoVXNlQVJNTWV0aG9kUHRyQUJJKSwKICAgICBVc2VBUk1HdWFyZFZhckFCSShVc2VBUk1HdWFyZFZhckFCSSkgeyB9CiAKLSAgYm9vbCBpc1JldHVyblR5cGVJbmRpcmVjdChjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgY29uc3QgeworICBib29sIGlzUmV0dXJuVHlwZUluZGlyZWN0KGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gU3RydWN0dXJlcyB3aXRoIGVpdGhlciBhIG5vbi10cml2aWFsIGRlc3RydWN0b3Igb3IgYSBub24tdHJpdmlhbAogICAgIC8vIGNvcHkgY29uc3RydWN0b3IgYXJlIGFsd2F5cyBpbmRpcmVjdC4KICAgICByZXR1cm4gIVJELT5oYXNUcml2aWFsRGVzdHJ1Y3RvcigpIHx8IFJELT5oYXNOb25Ucml2aWFsQ29weUNvbnN0cnVjdG9yKCk7CiAgIH0KIAotICBSZWNvcmRBcmdBQkkgZ2V0UmVjb3JkQXJnQUJJKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSBjb25zdCB7CisgIFJlY29yZEFyZ0FCSSBnZXRSZWNvcmRBcmdBQkkoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBTdHJ1Y3R1cmVzIHdpdGggZWl0aGVyIGEgbm9uLXRyaXZpYWwgZGVzdHJ1Y3RvciBvciBhIG5vbi10cml2aWFsCiAgICAgLy8gY29weSBjb25zdHJ1Y3RvciBhcmUgYWx3YXlzIGluZGlyZWN0LgogICAgIGlmICghUkQtPmhhc1RyaXZpYWxEZXN0cnVjdG9yKCkgfHwgUkQtPmhhc05vblRyaXZpYWxDb3B5Q29uc3RydWN0b3IoKSkKQEAgLTY2LDExNCArNjYsMTE3IEBACiAgICAgcmV0dXJuIFJBQV9EZWZhdWx0OwogICB9CiAKLSAgYm9vbCBpc1plcm9Jbml0aWFsaXphYmxlKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpOworICBib29sIGlzWmVyb0luaXRpYWxpemFibGUoY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCkgb3ZlcnJpZGU7CiAKLSAgbGx2bTo6VHlwZSAqQ29udmVydE1lbWJlclBvaW50ZXJUeXBlKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpOworICBsbHZtOjpUeXBlICpDb252ZXJ0TWVtYmVyUG9pbnRlclR5cGUoY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCkgb3ZlcnJpZGU7CiAKLSAgbGx2bTo6VmFsdWUgKkVtaXRMb2FkT2ZNZW1iZXJGdW5jdGlvblBvaW50ZXIoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlIComVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKk1lbUZuUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKTsKKyAgbGx2bTo6VmFsdWUgKgorICAgIEVtaXRMb2FkT2ZNZW1iZXJGdW5jdGlvblBvaW50ZXIoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKiZUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKk1lbUZuUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCkgb3ZlcnJpZGU7CiAKLSAgbGx2bTo6VmFsdWUgKkVtaXRNZW1iZXJEYXRhUG9pbnRlckFkZHJlc3MoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTWVtUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKTsKKyAgbGx2bTo6VmFsdWUgKgorICAgIEVtaXRNZW1iZXJEYXRhUG9pbnRlckFkZHJlc3MoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpNZW1QdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSBvdmVycmlkZTsKIAogICBsbHZtOjpWYWx1ZSAqRW1pdE1lbWJlclBvaW50ZXJDb252ZXJzaW9uKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhc3RFeHByICpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpTcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpTcmMpIG92ZXJyaWRlOwogICBsbHZtOjpDb25zdGFudCAqRW1pdE1lbWJlclBvaW50ZXJDb252ZXJzaW9uKGNvbnN0IENhc3RFeHByICpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50ICpTcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50ICpTcmMpIG92ZXJyaWRlOwogCi0gIGxsdm06OkNvbnN0YW50ICpFbWl0TnVsbE1lbWJlclBvaW50ZXIoY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCk7CisgIGxsdm06OkNvbnN0YW50ICpFbWl0TnVsbE1lbWJlclBvaW50ZXIoY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCkgb3ZlcnJpZGU7CiAKLSAgbGx2bTo6Q29uc3RhbnQgKkVtaXRNZW1iZXJQb2ludGVyKGNvbnN0IENYWE1ldGhvZERlY2wgKk1EKTsKKyAgbGx2bTo6Q29uc3RhbnQgKkVtaXRNZW1iZXJQb2ludGVyKGNvbnN0IENYWE1ldGhvZERlY2wgKk1EKSBvdmVycmlkZTsKICAgbGx2bTo6Q29uc3RhbnQgKkVtaXRNZW1iZXJEYXRhUG9pbnRlcihjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBvZmZzZXQpOwotICBsbHZtOjpDb25zdGFudCAqRW1pdE1lbWJlclBvaW50ZXIoY29uc3QgQVBWYWx1ZSAmTVAsIFF1YWxUeXBlIE1QVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIG9mZnNldCkgb3ZlcnJpZGU7CisgIGxsdm06OkNvbnN0YW50ICpFbWl0TWVtYmVyUG9pbnRlcihjb25zdCBBUFZhbHVlICZNUCwgUXVhbFR5cGUgTVBUKSBvdmVycmlkZTsKICAgbGx2bTo6Q29uc3RhbnQgKkJ1aWxkTWVtYmVyUG9pbnRlcihjb25zdCBDWFhNZXRob2REZWNsICpNRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgVGhpc0FkanVzdG1lbnQpOwogCiAgIGxsdm06OlZhbHVlICpFbWl0TWVtYmVyUG9pbnRlckNvbXBhcmlzb24oQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkwsIGxsdm06OlZhbHVlICpSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmVxdWFsaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluZXF1YWxpdHkpIG92ZXJyaWRlOwogCiAgIGxsdm06OlZhbHVlICpFbWl0TWVtYmVyUG9pbnRlcklzTm90TnVsbChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpBZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSBvdmVycmlkZTsKIAotICBsbHZtOjpWYWx1ZSAqYWRqdXN0VG9Db21wbGV0ZU9iamVjdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgdHlwZSk7CisgIGxsdm06OlZhbHVlICphZGp1c3RUb0NvbXBsZXRlT2JqZWN0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBsbHZtOjpWYWx1ZSAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSB0eXBlKSBvdmVycmlkZTsKIAotICBsbHZtOjpWYWx1ZSAqR2V0VmlydHVhbEJhc2VDbGFzc09mZnNldChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkNsYXNzRGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZUNsYXNzRGVjbCk7CisgIGxsdm06OlZhbHVlICoKKyAgICBHZXRWaXJ0dWFsQmFzZUNsYXNzT2Zmc2V0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBsbHZtOjpWYWx1ZSAqVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkNsYXNzRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VDbGFzc0RlY2wpIG92ZXJyaWRlOwogCiAgIHZvaWQgQnVpbGRDb25zdHJ1Y3RvclNpZ25hdHVyZShjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDdG9yVHlwZSBULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuUXVhbFR5cGUgJlJlc1R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENhblF1YWxUeXBlPiAmQXJnVHlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEN0b3JUeXBlIFQsIENhblF1YWxUeXBlICZSZXNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDYW5RdWFsVHlwZT4gJkFyZ1R5cykgb3ZlcnJpZGU7CiAKLSAgdm9pZCBFbWl0Q1hYQ29uc3RydWN0b3JzKGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqRCk7CisgIHZvaWQgRW1pdENYWENvbnN0cnVjdG9ycyhjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQpIG92ZXJyaWRlOwogCiAgIHZvaWQgQnVpbGREZXN0cnVjdG9yU2lnbmF0dXJlKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpEdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhEdG9yVHlwZSBULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsVHlwZSAmUmVzVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDYW5RdWFsVHlwZT4gJkFyZ1R5cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWER0b3JUeXBlIFQsIENhblF1YWxUeXBlICZSZXNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENhblF1YWxUeXBlPiAmQXJnVHlzKSBvdmVycmlkZTsKIAogICBib29sIHVzZVRodW5rRm9yRHRvclZhcmlhbnQoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkR0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhEdG9yVHlwZSBEVCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYRHRvclR5cGUgRFQpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBJdGFuaXVtIGRvZXMgbm90IGVtaXQgYW55IGRlc3RydWN0b3IgdmFyaWFudCBhcyBhbiBpbmxpbmUgdGh1bmsuCiAgICAgLy8gRGVsZWdhdGluZyBtYXkgb2NjdXIgYXMgYW4gb3B0aW1pemF0aW9uLCBidXQgYWxsIHZhcmlhbnRzIGFyZSBlaXRoZXIKICAgICAvLyBlbWl0dGVkIHdpdGggZXh0ZXJuYWwgbGlua2FnZSBvciBhcyBsaW5rb25jZSBpZiB0aGV5IGFyZSBpbmxpbmUgYW5kIHVzZWQuCiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgdm9pZCBFbWl0Q1hYRGVzdHJ1Y3RvcnMoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkQpOworICB2b2lkIEVtaXRDWFhEZXN0cnVjdG9ycyhjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRCkgb3ZlcnJpZGU7CiAKLSAgdm9pZCBCdWlsZEluc3RhbmNlRnVuY3Rpb25QYXJhbXMoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlICZSZXNUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BcmdMaXN0ICZQYXJhbXMpOworICB2b2lkIGFkZEltcGxpY2l0U3RydWN0b3JQYXJhbXMoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIFF1YWxUeXBlICZSZXNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQXJnTGlzdCAmUGFyYW1zKSBvdmVycmlkZTsKIAotICB2b2lkIEVtaXRJbnN0YW5jZUZ1bmN0aW9uUHJvbG9nKENvZGVHZW5GdW5jdGlvbiAmQ0dGKTsKKyAgdm9pZCBFbWl0SW5zdGFuY2VGdW5jdGlvblByb2xvZyhDb2RlR2VuRnVuY3Rpb24gJkNHRikgb3ZlcnJpZGU7CiAKLSAgdm9pZCBFbWl0Q29uc3RydWN0b3JDYWxsKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpELCBDWFhDdG9yVHlwZSBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3JWaXJ0dWFsQmFzZSwgYm9vbCBEZWxlZ2F0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsRXhwcjo6Y29uc3RfYXJnX2l0ZXJhdG9yIEFyZ0JlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxFeHByOjpjb25zdF9hcmdfaXRlcmF0b3IgQXJnRW5kKTsKKyAgdW5zaWduZWQgYWRkSW1wbGljaXRDb25zdHJ1Y3RvckFyZ3MoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ3RvclR5cGUgVHlwZSwgYm9vbCBGb3JWaXJ0dWFsQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWxlZ2F0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsQXJnTGlzdCAmQXJncykgb3ZlcnJpZGU7CiAKLSAgdm9pZCBlbWl0VlRhYmxlRGVmaW5pdGlvbnMoQ29kZUdlblZUYWJsZXMgJkNHVlQsIGNvbnN0IENYWFJlY29yZERlY2wgKlJEKTsKKyAgdm9pZCBFbWl0RGVzdHJ1Y3RvckNhbGwoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpERCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYRHRvclR5cGUgVHlwZSwgYm9vbCBGb3JWaXJ0dWFsQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWxlZ2F0aW5nLCBsbHZtOjpWYWx1ZSAqVGhpcykgb3ZlcnJpZGU7CisKKyAgdm9pZCBlbWl0VlRhYmxlRGVmaW5pdGlvbnMoQ29kZUdlblZUYWJsZXMgJkNHVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSBvdmVycmlkZTsKIAogICBsbHZtOjpWYWx1ZSAqZ2V0VlRhYmxlQWRkcmVzc1BvaW50SW5TdHJ1Y3RvcigKICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBjb25zdCBDWFhSZWNvcmREZWNsICpWVGFibGVDbGFzcywKICAgICAgIEJhc2VTdWJvYmplY3QgQmFzZSwgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTmVhcmVzdFZCYXNlLAotICAgICAgYm9vbCAmTmVlZHNWaXJ0dWFsT2Zmc2V0KTsKKyAgICAgIGJvb2wgJk5lZWRzVmlydHVhbE9mZnNldCkgb3ZlcnJpZGU7CiAKICAgbGx2bTo6Q29uc3RhbnQgKgogICBnZXRWVGFibGVBZGRyZXNzUG9pbnRGb3JDb25zdEV4cHIoQmFzZVN1Ym9iamVjdCBCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqVlRhYmxlQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqVlRhYmxlQ2xhc3MpIG92ZXJyaWRlOwogCiAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpnZXRBZGRyT2ZWVGFibGUoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIFZQdHJPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBWUHRyT2Zmc2V0KSBvdmVycmlkZTsKIAogICBsbHZtOjpWYWx1ZSAqZ2V0VmlydHVhbEZ1bmN0aW9uUG9pbnRlcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwgR2xvYmFsRGVjbCBHRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlRoaXMsIGxsdm06OlR5cGUgKlR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlR5cGUgKlR5KSBvdmVycmlkZTsKIAogICB2b2lkIEVtaXRWaXJ0dWFsRGVzdHJ1Y3RvckNhbGwoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWER0b3JUeXBlIER0b3JUeXBlLCBTb3VyY2VMb2NhdGlvbiBDYWxsTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlRoaXMpIG92ZXJyaWRlOwogCi0gIHZvaWQgZW1pdFZpcnR1YWxJbmhlcml0YW5jZVRhYmxlcyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7CisgIHZvaWQgZW1pdFZpcnR1YWxJbmhlcml0YW5jZVRhYmxlcyhjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgb3ZlcnJpZGU7CiAKLSAgdm9pZCBzZXRUaHVua0xpbmthZ2UobGx2bTo6RnVuY3Rpb24gKlRodW5rLCBib29sIEZvclZUYWJsZSkgeworICB2b2lkIHNldFRodW5rTGlua2FnZShsbHZtOjpGdW5jdGlvbiAqVGh1bmssIGJvb2wgRm9yVlRhYmxlKSBvdmVycmlkZSB7CiAgICAgLy8gQWxsb3cgaW5saW5pbmcgb2YgdGh1bmtzIGJ5IGVtaXR0aW5nIHRoZW0gd2l0aCBhdmFpbGFibGVfZXh0ZXJuYWxseQogICAgIC8vIGxpbmthZ2UgdG9nZXRoZXIgd2l0aCB2dGFibGVzIHdoZW4gbmVlZGVkLgogICAgIGlmIChGb3JWVGFibGUpCkBAIC0xODEsMzggKzE4NCw0MCBAQAogICB9CiAKICAgbGx2bTo6VmFsdWUgKnBlcmZvcm1UaGlzQWRqdXN0bWVudChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgbGx2bTo6VmFsdWUgKlRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhpc0FkanVzdG1lbnQgJlRBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaGlzQWRqdXN0bWVudCAmVEEpIG92ZXJyaWRlOwogCiAgIGxsdm06OlZhbHVlICpwZXJmb3JtUmV0dXJuQWRqdXN0bWVudChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgbGx2bTo6VmFsdWUgKlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldHVybkFkanVzdG1lbnQgJlJBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldHVybkFkanVzdG1lbnQgJlJBKSBvdmVycmlkZTsKIAotICBTdHJpbmdSZWYgR2V0UHVyZVZpcnR1YWxDYWxsTmFtZSgpIHsgcmV0dXJuICJfX2N4YV9wdXJlX3ZpcnR1YWwiOyB9Ci0gIFN0cmluZ1JlZiBHZXREZWxldGVkVmlydHVhbENhbGxOYW1lKCkgeyByZXR1cm4gIl9fY3hhX2RlbGV0ZWRfdmlydHVhbCI7IH0KKyAgU3RyaW5nUmVmIEdldFB1cmVWaXJ0dWFsQ2FsbE5hbWUoKSBvdmVycmlkZSB7IHJldHVybiAiX19jeGFfcHVyZV92aXJ0dWFsIjsgfQorICBTdHJpbmdSZWYgR2V0RGVsZXRlZFZpcnR1YWxDYWxsTmFtZSgpIG92ZXJyaWRlCisgICAgeyByZXR1cm4gIl9fY3hhX2RlbGV0ZWRfdmlydHVhbCI7IH0KIAotICBDaGFyVW5pdHMgZ2V0QXJyYXlDb29raWVTaXplSW1wbChRdWFsVHlwZSBlbGVtZW50VHlwZSk7CisgIENoYXJVbml0cyBnZXRBcnJheUNvb2tpZVNpemVJbXBsKFF1YWxUeXBlIGVsZW1lbnRUeXBlKSBvdmVycmlkZTsKICAgbGx2bTo6VmFsdWUgKkluaXRpYWxpemVBcnJheUNvb2tpZShDb2RlR2VuRnVuY3Rpb24gJkNHRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTmV3UHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpOdW1FbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhOZXdFeHByICpleHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEVsZW1lbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBFbGVtZW50VHlwZSkgb3ZlcnJpZGU7CiAgIGxsdm06OlZhbHVlICpyZWFkQXJyYXlDb29raWVJbXBsKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqYWxsb2NQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBjb29raWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIGNvb2tpZVNpemUpIG92ZXJyaWRlOwogCiAgIHZvaWQgRW1pdEd1YXJkZWRJbml0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBjb25zdCBWYXJEZWNsICZELAotICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqRGVjbFB0ciwgYm9vbCBQZXJmb3JtSW5pdCk7CisgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpEZWNsUHRyLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIFBlcmZvcm1Jbml0KSBvdmVycmlkZTsKICAgdm9pZCByZWdpc3Rlckdsb2JhbER0b3IoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IFZhckRlY2wgJkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50ICpkdG9yLCBsbHZtOjpDb25zdGFudCAqYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50ICpkdG9yLCBsbHZtOjpDb25zdGFudCAqYWRkcikgb3ZlcnJpZGU7CiAKICAgbGx2bTo6RnVuY3Rpb24gKmdldE9yQ3JlYXRlVGhyZWFkTG9jYWxXcmFwcGVyKGNvbnN0IFZhckRlY2wgKlZELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKlZhcik7CiAgIHZvaWQgRW1pdFRocmVhZExvY2FsSW5pdEZ1bmNzKAogICAgICAgbGx2bTo6QXJyYXlSZWY8c3RkOjpwYWlyPGNvbnN0IFZhckRlY2wgKiwgbGx2bTo6R2xvYmFsVmFyaWFibGUgKj4gPiBEZWNscywKLSAgICAgIGxsdm06OkZ1bmN0aW9uICpJbml0RnVuYyk7Ci0gIExWYWx1ZSBFbWl0VGhyZWFkTG9jYWxEZWNsUmVmRXhwcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xSZWZFeHByICpEUkUpOworICAgICAgbGx2bTo6RnVuY3Rpb24gKkluaXRGdW5jKSBvdmVycmlkZTsKKyAgTFZhbHVlIEVtaXRUaHJlYWRMb2NhbFZhckRlY2xMVmFsdWUoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IFZhckRlY2wgKlZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBMVmFsVHlwZSkgb3ZlcnJpZGU7CiAKLSAgYm9vbCBOZWVkc1ZUVFBhcmFtZXRlcihHbG9iYWxEZWNsIEdEKTsKKyAgYm9vbCBOZWVkc1ZUVFBhcmFtZXRlcihHbG9iYWxEZWNsIEdEKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIEFSTUNYWEFCSSA6IHB1YmxpYyBJdGFuaXVtQ1hYQUJJIHsKQEAgLTIyMSwyMiArMjI2LDMxIEBACiAgICAgSXRhbml1bUNYWEFCSShDR00sIC8qIFVzZUFSTU1ldGhvZFB0ckFCSSA9ICovIHRydWUsCiAgICAgICAgICAgICAgICAgICAvKiBVc2VBUk1HdWFyZFZhckFCSSA9ICovIHRydWUpIHt9CiAKLSAgYm9vbCBIYXNUaGlzUmV0dXJuKEdsb2JhbERlY2wgR0QpIGNvbnN0IHsKKyAgYm9vbCBIYXNUaGlzUmV0dXJuKEdsb2JhbERlY2wgR0QpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gKGlzYTxDWFhDb25zdHJ1Y3RvckRlY2w+KEdELmdldERlY2woKSkgfHwgKAogICAgICAgICAgICAgICBpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KEdELmdldERlY2woKSkgJiYKICAgICAgICAgICAgICAgR0QuZ2V0RHRvclR5cGUoKSAhPSBEdG9yX0RlbGV0aW5nKSk7CiAgIH0KIAotICB2b2lkIEVtaXRSZXR1cm5Gcm9tVGh1bmsoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIFJWYWx1ZSBSViwgUXVhbFR5cGUgUmVzVHkpOworICB2b2lkIEVtaXRSZXR1cm5Gcm9tVGh1bmsoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIFJWYWx1ZSBSViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFJlc1R5KSBvdmVycmlkZTsKIAotICBDaGFyVW5pdHMgZ2V0QXJyYXlDb29raWVTaXplSW1wbChRdWFsVHlwZSBlbGVtZW50VHlwZSk7CisgIENoYXJVbml0cyBnZXRBcnJheUNvb2tpZVNpemVJbXBsKFF1YWxUeXBlIGVsZW1lbnRUeXBlKSBvdmVycmlkZTsKICAgbGx2bTo6VmFsdWUgKkluaXRpYWxpemVBcnJheUNvb2tpZShDb2RlR2VuRnVuY3Rpb24gJkNHRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTmV3UHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpOdW1FbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhOZXdFeHByICpleHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEVsZW1lbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBFbGVtZW50VHlwZSkgb3ZlcnJpZGU7CiAgIGxsdm06OlZhbHVlICpyZWFkQXJyYXlDb29raWVJbXBsKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBsbHZtOjpWYWx1ZSAqYWxsb2NQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBjb29raWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIGNvb2tpZVNpemUpIG92ZXJyaWRlOworfTsKKworY2xhc3MgaU9TNjRDWFhBQkkgOiBwdWJsaWMgQVJNQ1hYQUJJIHsKK3B1YmxpYzoKKyAgaU9TNjRDWFhBQkkoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmQ0dNKSA6IEFSTUNYWEFCSShDR00pIHt9CisKKyAgLy8gQVJNNjQgbGlicmFyaWVzIGFyZSBwcmVwYXJlZCBmb3Igbm9uLXVuaXF1ZSBSVFRJLgorICBib29sIHNob3VsZFJUVElCZVVuaXF1ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiB9OwogfQogCkBAIC0yNDgsNiArMjYyLDkgQEAKICAgY2FzZSBUYXJnZXRDWFhBQkk6OmlPUzoKICAgICByZXR1cm4gbmV3IEFSTUNYWEFCSShDR00pOwogCisgIGNhc2UgVGFyZ2V0Q1hYQUJJOjppT1M2NDoKKyAgICByZXR1cm4gbmV3IGlPUzY0Q1hYQUJJKENHTSk7CisKICAgLy8gTm90ZSB0aGF0IEFBcmNoNjQgdXNlcyB0aGUgZ2VuZXJpYyBJdGFuaXVtQ1hYQUJJIGNsYXNzIHNpbmNlIGl0IGRvZXNuJ3QKICAgLy8gaW5jbHVkZSB0aGUgb3RoZXIgMzItYml0IEFSTSBvZGRpdGllczogY29uc3RydWN0b3IvZGVzdHJ1Y3RvciByZXR1cm4gdmFsdWVzCiAgIC8vIGFuZCBhcnJheSBjb29raWVzLgpAQCAtMjk5LDExICszMTYsOSBAQAogLy8vCiAvLy8gSWYgdGhlIG1lbWJlciBpcyBub24tdmlydHVhbCwgbWVtcHRyLnB0ciBpcyB0aGUgYWRkcmVzcyBvZgogLy8vIHRoZSBmdW5jdGlvbiB0byBjYWxsLgotbGx2bTo6VmFsdWUgKgotSXRhbml1bUNYWEFCSTo6RW1pdExvYWRPZk1lbWJlckZ1bmN0aW9uUG9pbnRlcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKiZUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTWVtRm5QdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpIHsKK2xsdm06OlZhbHVlICpJdGFuaXVtQ1hYQUJJOjpFbWl0TG9hZE9mTWVtYmVyRnVuY3Rpb25Qb2ludGVyKAorICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBjb25zdCBFeHByICpFLCBsbHZtOjpWYWx1ZSAqJlRoaXMsCisgICAgbGx2bTo6VmFsdWUgKk1lbUZuUHRyLCBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSB7CiAgIENHQnVpbGRlclR5ICZCdWlsZGVyID0gQ0dGLkJ1aWxkZXI7CiAKICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9IApAQCAtMzU1LDggKzM3MCw3IEBACiAKICAgLy8gQ2FzdCB0aGUgYWRqdXN0ZWQgdGhpcyB0byBhIHBvaW50ZXIgdG8gdnRhYmxlIHBvaW50ZXIgYW5kIGxvYWQuCiAgIGxsdm06OlR5cGUgKlZUYWJsZVR5ID0gQnVpbGRlci5nZXRJbnQ4UHRyVHkoKTsKLSAgbGx2bTo6VmFsdWUgKlZUYWJsZSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChUaGlzLCBWVGFibGVUeS0+Z2V0UG9pbnRlclRvKCkpOwotICBWVGFibGUgPSBCdWlsZGVyLkNyZWF0ZUxvYWQoVlRhYmxlLCAibWVtcHRyLnZ0YWJsZSIpOworICBsbHZtOjpWYWx1ZSAqVlRhYmxlID0gQ0dGLkdldFZUYWJsZVB0cihUaGlzLCBWVGFibGVUeSk7CiAKICAgLy8gQXBwbHkgdGhlIG9mZnNldC4KICAgbGx2bTo6VmFsdWUgKlZUYWJsZU9mZnNldCA9IEZuQXNJbnQ7CkBAIC0zODUsMTAgKzM5OSw5IEBACiAKIC8vLyBDb21wdXRlIGFuIGwtdmFsdWUgYnkgYXBwbHlpbmcgdGhlIGdpdmVuIHBvaW50ZXItdG8tbWVtYmVyIHRvIGEKIC8vLyBiYXNlIG9iamVjdC4KLWxsdm06OlZhbHVlICpJdGFuaXVtQ1hYQUJJOjpFbWl0TWVtYmVyRGF0YVBvaW50ZXJBZGRyZXNzKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTWVtUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpIHsKK2xsdm06OlZhbHVlICpJdGFuaXVtQ1hYQUJJOjpFbWl0TWVtYmVyRGF0YVBvaW50ZXJBZGRyZXNzKAorICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBjb25zdCBFeHByICpFLCBsbHZtOjpWYWx1ZSAqQmFzZSwgbGx2bTo6VmFsdWUgKk1lbVB0ciwKKyAgICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSB7CiAgIGFzc2VydChNZW1QdHItPmdldFR5cGUoKSA9PSBDR00uUHRyRGlmZlR5KTsKIAogICBDR0J1aWxkZXJUeSAmQnVpbGRlciA9IENHRi5CdWlsZGVyOwpAQCAtNzk3LDM0ICs4MTAsMzUgQEAKIAogLy8vIFRoZSBnZW5lcmljIEFCSSBwYXNzZXMgJ3RoaXMnLCBwbHVzIGEgVlRUIGlmIGl0J3MgaW5pdGlhbGl6aW5nIGEKIC8vLyBiYXNlIHN1Ym9iamVjdC4KLXZvaWQgSXRhbml1bUNYWEFCSTo6QnVpbGRDb25zdHJ1Y3RvclNpZ25hdHVyZShjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ3RvclR5cGUgVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsVHlwZSAmUmVzVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDYW5RdWFsVHlwZT4gJkFyZ1R5cykgewordm9pZAorSXRhbml1bUNYWEFCSTo6QnVpbGRDb25zdHJ1Y3RvclNpZ25hdHVyZShjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEN0b3JUeXBlIFR5cGUsIENhblF1YWxUeXBlICZSZXNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENhblF1YWxUeXBlPiAmQXJnVHlzKSB7CiAgIEFTVENvbnRleHQgJkNvbnRleHQgPSBnZXRDb250ZXh0KCk7CiAKLSAgLy8gJ3RoaXMnIHBhcmFtZXRlciBpcyBhbHJlYWR5IHRoZXJlLCBhcyB3ZWxsIGFzICd0aGlzJyByZXR1cm4gaWYKLSAgLy8gSGFzVGhpc1JldHVybihHbG9iYWxEZWNsKEN0b3IsIFR5cGUpKSBpcyB0cnVlCisgIC8vIEFsbCBwYXJhbWV0ZXJzIGFyZSBhbHJlYWR5IGluIHBsYWNlIGV4Y2VwdCBWVFQsIHdoaWNoIGdvZXMgYWZ0ZXIgJ3RoaXMnLgorICAvLyBUaGVzZSBhcmUgQ2xhbmcgdHlwZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgc3JldCB5ZXQuCiAKICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBhZGQgYSBWVFQgcGFyYW1ldGVyICh3aGljaCBoYXMgdHlwZSB2b2lkICoqKS4KICAgaWYgKFR5cGUgPT0gQ3Rvcl9CYXNlICYmIEN0b3ItPmdldFBhcmVudCgpLT5nZXROdW1WQmFzZXMoKSAhPSAwKQotICAgIEFyZ1R5cy5wdXNoX2JhY2soQ29udGV4dC5nZXRQb2ludGVyVHlwZShDb250ZXh0LlZvaWRQdHJUeSkpOworICAgIEFyZ1R5cy5pbnNlcnQoQXJnVHlzLmJlZ2luKCkgKyAxLAorICAgICAgICAgICAgICAgICAgQ29udGV4dC5nZXRQb2ludGVyVHlwZShDb250ZXh0LlZvaWRQdHJUeSkpOwogfQogCiB2b2lkIEl0YW5pdW1DWFhBQkk6OkVtaXRDWFhDb25zdHJ1Y3RvcnMoY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpEKSB7CiAgIC8vIEp1c3QgbWFrZSBzdXJlIHdlJ3JlIGluIHN5bmMgd2l0aCBUYXJnZXRDWFhBQkkuCiAgIGFzc2VydChDR00uZ2V0VGFyZ2V0KCkuZ2V0Q1hYQUJJKCkuaGFzQ29uc3RydWN0b3JWYXJpYW50cygpKTsKIAorICAvLyBUaGUgY29uc3RydWN0b3IgdXNlZCBmb3IgY29uc3RydWN0aW5nIHRoaXMgYXMgYSBiYXNlIGNsYXNzOworICAvLyBpZ25vcmVzIHZpcnR1YWwgYmFzZXMuCisgIENHTS5FbWl0R2xvYmFsKEdsb2JhbERlY2woRCwgQ3Rvcl9CYXNlKSk7CisKICAgLy8gVGhlIGNvbnN0cnVjdG9yIHVzZWQgZm9yIGNvbnN0cnVjdGluZyB0aGlzIGFzIGEgY29tcGxldGUgY2xhc3M7CiAgIC8vIGNvbnN0dWN0cyB0aGUgdmlydHVhbCBiYXNlcywgdGhlbiBjYWxscyB0aGUgYmFzZSBjb25zdHJ1Y3Rvci4KICAgaWYgKCFELT5nZXRQYXJlbnQoKS0+aXNBYnN0cmFjdCgpKSB7CiAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBlbWl0IHRoZSBjb21wbGV0ZSBjdG9yIGlmIHRoZSBjbGFzcyBpcyBhYnN0cmFjdC4KICAgICBDR00uRW1pdEdsb2JhbChHbG9iYWxEZWNsKEQsIEN0b3JfQ29tcGxldGUpKTsKICAgfQotCi0gIC8vIFRoZSBjb25zdHJ1Y3RvciB1c2VkIGZvciBjb25zdHJ1Y3RpbmcgdGhpcyBhcyBhIGJhc2UgY2xhc3M7Ci0gIC8vIGlnbm9yZXMgdmlydHVhbCBiYXNlcy4KLSAgQ0dNLkVtaXRHbG9iYWwoR2xvYmFsRGVjbChELCBDdG9yX0Jhc2UpKTsKIH0KIAogLy8vIFRoZSBnZW5lcmljIEFCSSBwYXNzZXMgJ3RoaXMnLCBwbHVzIGEgVlRUIGlmIGl0J3MgZGVzdHJveWluZyBhCkBAIC04NDQsMjkgKzg1OCwyNiBAQAogfQogCiB2b2lkIEl0YW5pdW1DWFhBQkk6OkVtaXRDWFhEZXN0cnVjdG9ycyhjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRCkgewotICAvLyBUaGUgZGVzdHJ1Y3RvciBpbiBhIHZpcnR1YWwgdGFibGUgaXMgYWx3YXlzIGEgJ2RlbGV0aW5nJwotICAvLyBkZXN0cnVjdG9yLCB3aGljaCBjYWxscyB0aGUgY29tcGxldGUgZGVzdHJ1Y3RvciBhbmQgdGhlbiB1c2VzIHRoZQotICAvLyBhcHByb3ByaWF0ZSBvcGVyYXRvciBkZWxldGUuCi0gIGlmIChELT5pc1ZpcnR1YWwoKSkKLSAgICBDR00uRW1pdEdsb2JhbChHbG9iYWxEZWNsKEQsIER0b3JfRGVsZXRpbmcpKTsKKyAgLy8gVGhlIGRlc3RydWN0b3IgdXNlZCBmb3IgZGVzdHJ1Y3RpbmcgdGhpcyBhcyBhIGJhc2UgY2xhc3M7IGlnbm9yZXMKKyAgLy8gdmlydHVhbCBiYXNlcy4KKyAgQ0dNLkVtaXRHbG9iYWwoR2xvYmFsRGVjbChELCBEdG9yX0Jhc2UpKTsKIAogICAvLyBUaGUgZGVzdHJ1Y3RvciB1c2VkIGZvciBkZXN0cnVjdGluZyB0aGlzIGFzIGEgbW9zdC1kZXJpdmVkIGNsYXNzOwogICAvLyBjYWxsIHRoZSBiYXNlIGRlc3RydWN0b3IgYW5kIHRoZW4gZGVzdHJ1Y3RzIGFueSB2aXJ0dWFsIGJhc2VzLgogICBDR00uRW1pdEdsb2JhbChHbG9iYWxEZWNsKEQsIER0b3JfQ29tcGxldGUpKTsKIAotICAvLyBUaGUgZGVzdHJ1Y3RvciB1c2VkIGZvciBkZXN0cnVjdGluZyB0aGlzIGFzIGEgYmFzZSBjbGFzczsgaWdub3JlcwotICAvLyB2aXJ0dWFsIGJhc2VzLgotICBDR00uRW1pdEdsb2JhbChHbG9iYWxEZWNsKEQsIER0b3JfQmFzZSkpOworICAvLyBUaGUgZGVzdHJ1Y3RvciBpbiBhIHZpcnR1YWwgdGFibGUgaXMgYWx3YXlzIGEgJ2RlbGV0aW5nJworICAvLyBkZXN0cnVjdG9yLCB3aGljaCBjYWxscyB0aGUgY29tcGxldGUgZGVzdHJ1Y3RvciBhbmQgdGhlbiB1c2VzIHRoZQorICAvLyBhcHByb3ByaWF0ZSBvcGVyYXRvciBkZWxldGUuCisgIGlmIChELT5pc1ZpcnR1YWwoKSkKKyAgICBDR00uRW1pdEdsb2JhbChHbG9iYWxEZWNsKEQsIER0b3JfRGVsZXRpbmcpKTsKIH0KIAotdm9pZCBJdGFuaXVtQ1hYQUJJOjpCdWlsZEluc3RhbmNlRnVuY3Rpb25QYXJhbXMoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSAmUmVzVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFyZ0xpc3QgJlBhcmFtcykgewotICAvLy8gQ3JlYXRlIHRoZSAndGhpcycgdmFyaWFibGUuCi0gIEJ1aWxkVGhpc1BhcmFtKENHRiwgUGFyYW1zKTsKLQordm9pZCBJdGFuaXVtQ1hYQUJJOjphZGRJbXBsaWNpdFN0cnVjdG9yUGFyYW1zKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlICZSZXNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFyZ0xpc3QgJlBhcmFtcykgewogICBjb25zdCBDWFhNZXRob2REZWNsICpNRCA9IGNhc3Q8Q1hYTWV0aG9kRGVjbD4oQ0dGLkN1ckdELmdldERlY2woKSk7Ci0gIGFzc2VydChNRC0+aXNJbnN0YW5jZSgpKTsKKyAgYXNzZXJ0KGlzYTxDWFhDb25zdHJ1Y3RvckRlY2w+KE1EKSB8fCBpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KE1EKSk7CiAKICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCBhIFZUVCBwYXJhbWV0ZXIgYXMgd2VsbC4KICAgaWYgKE5lZWRzVlRUUGFyYW1ldGVyKENHRi5DdXJHRCkpIHsKQEAgLTg3Nyw4ICs4ODgsOCBAQAogICAgIEltcGxpY2l0UGFyYW1EZWNsICpWVFREZWNsCiAgICAgICA9IEltcGxpY2l0UGFyYW1EZWNsOjpDcmVhdGUoQ29udGV4dCwgMCwgTUQtPmdldExvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvbnRleHQuSWRlbnRzLmdldCgidnR0IiksIFQpOwotICAgIFBhcmFtcy5wdXNoX2JhY2soVlRURGVjbCk7Ci0gICAgZ2V0VlRURGVjbChDR0YpID0gVlRURGVjbDsKKyAgICBQYXJhbXMuaW5zZXJ0KFBhcmFtcy5iZWdpbigpICsgMSwgVlRURGVjbCk7CisgICAgZ2V0U3RydWN0b3JJbXBsaWNpdFBhcmFtRGVjbChDR0YpID0gVlRURGVjbDsKICAgfQogfQogCkBAIC04ODcsMTAgKzg5OCw5IEBACiAgIEVtaXRUaGlzUGFyYW0oQ0dGKTsKIAogICAvLy8gSW5pdGlhbGl6ZSB0aGUgJ3Z0dCcgc2xvdCBpZiBuZWVkZWQuCi0gIGlmIChnZXRWVFREZWNsKENHRikpIHsKLSAgICBnZXRWVFRWYWx1ZShDR0YpCi0gICAgICA9IENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQoQ0dGLkdldEFkZHJPZkxvY2FsVmFyKGdldFZUVERlY2woQ0dGKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZ0dCIpOworICBpZiAoZ2V0U3RydWN0b3JJbXBsaWNpdFBhcmFtRGVjbChDR0YpKSB7CisgICAgZ2V0U3RydWN0b3JJbXBsaWNpdFBhcmFtVmFsdWUoQ0dGKSA9IENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQoCisgICAgICAgIENHRi5HZXRBZGRyT2ZMb2NhbFZhcihnZXRTdHJ1Y3RvckltcGxpY2l0UGFyYW1EZWNsKENHRikpLCAidnR0Iik7CiAgIH0KIAogICAvLy8gSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIHRoYXQgdGhlIEFCSSBzcGVjaWZpZXMgcmV0dXJucyAndGhpcycsIGluaXRpYWxpemUKQEAgLTkwNSwyMSArOTE1LDM5IEBACiAgICAgQ0dGLkJ1aWxkZXIuQ3JlYXRlU3RvcmUoZ2V0VGhpc1ZhbHVlKENHRiksIENHRi5SZXR1cm5WYWx1ZSk7CiB9CiAKLXZvaWQgSXRhbml1bUNYWEFCSTo6RW1pdENvbnN0cnVjdG9yQ2FsbChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ3RvclR5cGUgVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvclZpcnR1YWxCYXNlLCBib29sIERlbGVnYXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEV4cHI6OmNvbnN0X2FyZ19pdGVyYXRvciBBcmdCZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEV4cHI6OmNvbnN0X2FyZ19pdGVyYXRvciBBcmdFbmQpIHsKLSAgbGx2bTo6VmFsdWUgKlZUVCA9IENHRi5HZXRWVFRQYXJhbWV0ZXIoR2xvYmFsRGVjbChELCBUeXBlKSwgRm9yVmlydHVhbEJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGVnYXRpbmcpOwordW5zaWduZWQgSXRhbml1bUNYWEFCSTo6YWRkSW1wbGljaXRDb25zdHJ1Y3RvckFyZ3MoCisgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqRCwgQ1hYQ3RvclR5cGUgVHlwZSwKKyAgICBib29sIEZvclZpcnR1YWxCYXNlLCBib29sIERlbGVnYXRpbmcsIENhbGxBcmdMaXN0ICZBcmdzKSB7CisgIGlmICghTmVlZHNWVFRQYXJhbWV0ZXIoR2xvYmFsRGVjbChELCBUeXBlKSkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gSW5zZXJ0IHRoZSBpbXBsaWNpdCAndnR0JyBhcmd1bWVudCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICBsbHZtOjpWYWx1ZSAqVlRUID0KKyAgICAgIENHRi5HZXRWVFRQYXJhbWV0ZXIoR2xvYmFsRGVjbChELCBUeXBlKSwgRm9yVmlydHVhbEJhc2UsIERlbGVnYXRpbmcpOwogICBRdWFsVHlwZSBWVFRUeSA9IGdldENvbnRleHQoKS5nZXRQb2ludGVyVHlwZShnZXRDb250ZXh0KCkuVm9pZFB0clR5KTsKLSAgbGx2bTo6VmFsdWUgKkNhbGxlZSA9IENHTS5HZXRBZGRyT2ZDWFhDb25zdHJ1Y3RvcihELCBUeXBlKTsKKyAgQXJncy5pbnNlcnQoQXJncy5iZWdpbigpICsgMSwKKyAgICAgICAgICAgICAgQ2FsbEFyZyhSVmFsdWU6OmdldChWVFQpLCBWVFRUeSwgLypuZWVkc2NvcHk9Ki9mYWxzZSkpOworICByZXR1cm4gMTsgIC8vIEFkZGVkIG9uZSBhcmcuCit9CisKK3ZvaWQgSXRhbml1bUNYWEFCSTo6RW1pdERlc3RydWN0b3JDYWxsKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkRELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYRHRvclR5cGUgVHlwZSwgYm9vbCBGb3JWaXJ0dWFsQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVsZWdhdGluZywgbGx2bTo6VmFsdWUgKlRoaXMpIHsKKyAgR2xvYmFsRGVjbCBHRChERCwgVHlwZSk7CisgIGxsdm06OlZhbHVlICpWVFQgPSBDR0YuR2V0VlRUUGFyYW1ldGVyKEdELCBGb3JWaXJ0dWFsQmFzZSwgRGVsZWdhdGluZyk7CisgIFF1YWxUeXBlIFZUVFR5ID0gZ2V0Q29udGV4dCgpLmdldFBvaW50ZXJUeXBlKGdldENvbnRleHQoKS5Wb2lkUHRyVHkpOworCisgIGxsdm06OlZhbHVlICpDYWxsZWUgPSAwOworICBpZiAoZ2V0Q29udGV4dCgpLmdldExhbmdPcHRzKCkuQXBwbGVLZXh0KQorICAgIENhbGxlZSA9IENHRi5CdWlsZEFwcGxlS2V4dFZpcnR1YWxEZXN0cnVjdG9yQ2FsbChERCwgVHlwZSwgREQtPmdldFBhcmVudCgpKTsKKworICBpZiAoIUNhbGxlZSkKKyAgICBDYWxsZWUgPSBDR00uR2V0QWRkck9mQ1hYRGVzdHJ1Y3RvcihERCwgVHlwZSk7CiAKICAgLy8gRklYTUU6IFByb3ZpZGUgYSBzb3VyY2UgbG9jYXRpb24gaGVyZS4KLSAgQ0dGLkVtaXRDWFhNZW1iZXJDYWxsKEQsIFNvdXJjZUxvY2F0aW9uKCksIENhbGxlZSwgUmV0dXJuVmFsdWVTbG90KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzLCBWVFQsIFZUVFR5LCBBcmdCZWcsIEFyZ0VuZCk7CisgIENHRi5FbWl0Q1hYTWVtYmVyQ2FsbChERCwgU291cmNlTG9jYXRpb24oKSwgQ2FsbGVlLCBSZXR1cm5WYWx1ZVNsb3QoKSwgVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFZUVCwgVlRUVHksIDAsIDApOwogfQogCiB2b2lkIEl0YW5pdW1DWFhBQkk6OmVtaXRWVGFibGVEZWZpbml0aW9ucyhDb2RlR2VuVlRhYmxlcyAmQ0dWVCwKQEAgLTk0Miw3ICs5NzAsNyBAQAogICBWVGFibGUtPnNldExpbmthZ2UoTGlua2FnZSk7CiAKICAgLy8gU2V0IHRoZSByaWdodCB2aXNpYmlsaXR5LgotICBDR00uc2V0VHlwZVZpc2liaWxpdHkoVlRhYmxlLCBSRCwgQ29kZUdlbk1vZHVsZTo6VFZLX0ZvclZUYWJsZSk7CisgIENHTS5zZXRHbG9iYWxWaXNpYmlsaXR5KFZUYWJsZSwgUkQpOwogCiAgIC8vIElmIHRoaXMgaXMgdGhlIG1hZ2ljIGNsYXNzIF9fY3h4YWJpdjE6Ol9fZnVuZGFtZW50YWxfdHlwZV9pbmZvLAogICAvLyB3ZSB3aWxsIGVtaXQgdGhlIHR5cGVpbmZvIGZvciB0aGUgZnVuZGFtZW50YWwgdHlwZXMuIFRoaXMgaXMgdGhlCkBAIC0xMzA1LDcgKzEzMzMsNyBAQAogICAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpHdWFyZDsKICAgICBDYWxsR3VhcmRBYm9ydChsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR3VhcmQpIDogR3VhcmQoR3VhcmQpIHt9CiAKLSAgICB2b2lkIEVtaXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIEZsYWdzIGZsYWdzKSB7CisgICAgdm9pZCBFbWl0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBGbGFncyBmbGFncykgb3ZlcnJpZGUgewogICAgICAgQ0dGLkVtaXROb3Vud2luZFJ1bnRpbWVDYWxsKGdldEd1YXJkQWJvcnRGbihDR0YuQ0dNLCBHdWFyZC0+Z2V0VHlwZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHdWFyZCk7CiAgICAgfQpAQCAtMTM5OCw2ICsxNDI2LDEzIEBACiAgIC8vICAgICAgICAgX19jeGFfZ3VhcmRfcmVsZWFzZSAoJm9ial9ndWFyZCk7CiAgIC8vICAgICAgIH0KICAgLy8gICAgIH0KKworICAgIC8vIEFSTTY0IEMrKyBBQkkgMy4yLjI6CisgICAgLy8gVGhpcyBBQkkgaW5zdGVhZCBvbmx5IHNwZWNpZmllcyB0aGUgdmFsdWUgYml0IDAgb2YgdGhlIHN0YXRpYyBndWFyZAorICAgIC8vIHZhcmlhYmxlOyBhbGwgb3RoZXIgYml0cyBhcmUgcGxhdGZvcm0gZGVmaW5lZC4gQml0IDAgc2hhbGwgYmUgMCB3aGVuIHRoZQorICAgIC8vIHZhcmlhYmxlIGlzIG5vdCBpbml0aWFsaXplZCBhbmQgMSB3aGVuIGl0IGlzLgorICAgIC8vIEZJWE1FOiBSZWFkaW5nIG9uZSBiaXQgaXMgbm8gbW9yZSBlZmZpY2llbnQgdGhhbiByZWFkaW5nIG9uZSBieXRlIHNvCisgICAgLy8gdGhlIGNvZGVnZW4gaXMgc2FtZSBhcyBnZW5lcmljIEl0YW5pdW0gQUJJLgogICB9IGVsc2UgewogICAgIC8vIExvYWQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGd1YXJkIHZhcmlhYmxlLgogICAgIGxsdm06OkxvYWRJbnN0ICpMSSA9IApAQCAtMTUyMyw4ICsxNTU4LDYgQEAKIC8vLyB0aGUgd3JhcHBlciBlbWl0cyBhIGNvcHksIGFuZCB3ZSB3YW50IHRoZSBsaW5rZXIgdG8gbWVyZ2UgdGhlbS4KIHN0YXRpYyBsbHZtOjpHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzIGdldFRocmVhZExvY2FsV3JhcHBlckxpbmthZ2UoCiAgICAgbGx2bTo6R2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBWYXJMaW5rYWdlKSB7Ci0gIGlmIChsbHZtOjpHbG9iYWxWYWx1ZTo6aXNMaW5rZXJQcml2YXRlTGlua2FnZShWYXJMaW5rYWdlKSkKLSAgICByZXR1cm4gbGx2bTo6R2xvYmFsVmFsdWU6OkxpbmtlclByaXZhdGVXZWFrTGlua2FnZTsKICAgLy8gRm9yIGludGVybmFsIGxpbmthZ2UgdmFyaWFibGVzLCB3ZSBkb24ndCBuZWVkIGFuIGV4dGVybmFsIG9yIHdlYWsgd3JhcHBlci4KICAgaWYgKGxsdm06Okdsb2JhbFZhbHVlOjppc0xvY2FsTGlua2FnZShWYXJMaW5rYWdlKSkKICAgICByZXR1cm4gVmFyTGlua2FnZTsKQEAgLTE2MzIsOSArMTY2NSw5IEBACiAgIH0KIH0KIAotTFZhbHVlIEl0YW5pdW1DWFhBQkk6OkVtaXRUaHJlYWRMb2NhbERlY2xSZWZFeHByKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xSZWZFeHByICpEUkUpIHsKLSAgY29uc3QgVmFyRGVjbCAqVkQgPSBjYXN0PFZhckRlY2w+KERSRS0+Z2V0RGVjbCgpKTsKK0xWYWx1ZSBJdGFuaXVtQ1hYQUJJOjpFbWl0VGhyZWFkTG9jYWxWYXJEZWNsTFZhbHVlKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFyRGVjbCAqVkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBMVmFsVHlwZSkgewogICBRdWFsVHlwZSBUID0gVkQtPmdldFR5cGUoKTsKICAgbGx2bTo6VHlwZSAqVHkgPSBDR0YuZ2V0VHlwZXMoKS5Db252ZXJ0VHlwZUZvck1lbShUKTsKICAgbGx2bTo6VmFsdWUgKlZhbCA9IENHRi5DR00uR2V0QWRkck9mR2xvYmFsVmFyKFZELCBUeSk7CkBAIC0xNjQ1LDEwICsxNjc4LDkgQEAKIAogICBMVmFsdWUgTFY7CiAgIGlmIChWRC0+Z2V0VHlwZSgpLT5pc1JlZmVyZW5jZVR5cGUoKSkKLSAgICBMViA9IENHRi5NYWtlTmF0dXJhbEFsaWduQWRkckxWYWx1ZShWYWwsIFQpOworICAgIExWID0gQ0dGLk1ha2VOYXR1cmFsQWxpZ25BZGRyTFZhbHVlKFZhbCwgTFZhbFR5cGUpOwogICBlbHNlCi0gICAgTFYgPSBDR0YuTWFrZUFkZHJMVmFsdWUoVmFsLCBEUkUtPmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR0YuZ2V0Q29udGV4dCgpLmdldERlY2xBbGlnbihWRCkpOworICAgIExWID0gQ0dGLk1ha2VBZGRyTFZhbHVlKFZhbCwgTFZhbFR5cGUsIENHRi5nZXRDb250ZXh0KCkuZ2V0RGVjbEFsaWduKFZEKSk7CiAgIC8vIEZJWE1FOiBuZWVkIHNldE9iakNHQ0xWYWx1ZUNsYXNzPwogICByZXR1cm4gTFY7CiB9CmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9NaWNyb3NvZnRDWFhBQkkuY3BwIGIvbGliL0NvZGVHZW4vTWljcm9zb2Z0Q1hYQUJJLmNwcAppbmRleCA3MzE4ZmU3Li45ODMyOTY5IDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9NaWNyb3NvZnRDWFhBQkkuY3BwCisrKyBiL2xpYi9Db2RlR2VuL01pY3Jvc29mdENYWEFCSS5jcHAKQEAgLTE1LDkgKzE1LDggQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJDR0NYWEFCSS5oIgotI2luY2x1ZGUgIkNvZGVHZW5Nb2R1bGUuaCIKICNpbmNsdWRlICJDR1ZUYWJsZXMuaCIKLSNpbmNsdWRlICJNaWNyb3NvZnRWQlRhYmxlcy5oIgorI2luY2x1ZGUgIkNvZGVHZW5Nb2R1bGUuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQ1hYLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL1ZUYWJsZUJ1aWxkZXIuaCIKQEAgLTI4LDUxICsyNyw2MyBAQAogCiBuYW1lc3BhY2UgewogCisvLy8gSG9sZHMgYWxsIHRoZSB2YnRhYmxlIGdsb2JhbHMgZm9yIGEgZ2l2ZW4gY2xhc3MuCitzdHJ1Y3QgVkJUYWJsZUdsb2JhbHMgeworICBjb25zdCBWUHRySW5mb1ZlY3RvciAqVkJUYWJsZXM7CisgIFNtYWxsVmVjdG9yPGxsdm06Okdsb2JhbFZhcmlhYmxlICosIDI+IEdsb2JhbHM7Cit9OworCiBjbGFzcyBNaWNyb3NvZnRDWFhBQkkgOiBwdWJsaWMgQ0dDWFhBQkkgewogcHVibGljOgogICBNaWNyb3NvZnRDWFhBQkkoQ29kZUdlbk1vZHVsZSAmQ0dNKSA6IENHQ1hYQUJJKENHTSkge30KIAotICBib29sIEhhc1RoaXNSZXR1cm4oR2xvYmFsRGVjbCBHRCkgY29uc3Q7CisgIGJvb2wgSGFzVGhpc1JldHVybihHbG9iYWxEZWNsIEdEKSBjb25zdCBvdmVycmlkZTsKIAotICBib29sIGlzUmV0dXJuVHlwZUluZGlyZWN0KGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSBjb25zdCB7CisgIGJvb2wgaXNSZXR1cm5UeXBlSW5kaXJlY3QoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBTdHJ1Y3R1cmVzIHRoYXQgYXJlIG5vdCBDKyswMyBQT0RzIGFyZSBhbHdheXMgaW5kaXJlY3QuCiAgICAgcmV0dXJuICFSRC0+aXNQT0QoKTsKICAgfQogCi0gIFJlY29yZEFyZ0FCSSBnZXRSZWNvcmRBcmdBQkkoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIGNvbnN0IHsKLSAgICBpZiAoUkQtPmhhc05vblRyaXZpYWxDb3B5Q29uc3RydWN0b3IoKSB8fCBSRC0+aGFzTm9uVHJpdmlhbERlc3RydWN0b3IoKSkKLSAgICAgIHJldHVybiBSQUFfRGlyZWN0SW5NZW1vcnk7CisgIFJlY29yZEFyZ0FCSSBnZXRSZWNvcmRBcmdBQkkoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoUkQtPmhhc05vblRyaXZpYWxDb3B5Q29uc3RydWN0b3IoKSB8fCBSRC0+aGFzTm9uVHJpdmlhbERlc3RydWN0b3IoKSkgeworICAgICAgbGx2bTo6VHJpcGxlOjpBcmNoVHlwZSBBcmNoID0gQ0dNLmdldFRhcmdldCgpLmdldFRyaXBsZSgpLmdldEFyY2goKTsKKyAgICAgIGlmIChBcmNoID09IGxsdm06OlRyaXBsZTo6eDg2KQorICAgICAgICByZXR1cm4gUkFBX0RpcmVjdEluTWVtb3J5OworICAgICAgLy8gT24geDY0LCBwYXNzIG5vbi10cml2aWFsIHJlY29yZHMgaW5kaXJlY3RseS4KKyAgICAgIC8vIEZJWE1FOiBUZXN0IG90aGVyIFdpbmRvd3MgYXJjaGl0ZWN0dXJlcy4KKyAgICAgIHJldHVybiBSQUFfSW5kaXJlY3Q7CisgICAgfQogICAgIHJldHVybiBSQUFfRGVmYXVsdDsKICAgfQogCi0gIFN0cmluZ1JlZiBHZXRQdXJlVmlydHVhbENhbGxOYW1lKCkgeyByZXR1cm4gIl9wdXJlY2FsbCI7IH0KKyAgU3RyaW5nUmVmIEdldFB1cmVWaXJ0dWFsQ2FsbE5hbWUoKSBvdmVycmlkZSB7IHJldHVybiAiX3B1cmVjYWxsIjsgfQogICAvLyBObyBrbm93biBzdXBwb3J0IGZvciBkZWxldGVkIGZ1bmN0aW9ucyBpbiBNU1ZDIHlldCwgc28gdGhpcyBjaG9pY2UgaXMKICAgLy8gYXJiaXRyYXJ5LgotICBTdHJpbmdSZWYgR2V0RGVsZXRlZFZpcnR1YWxDYWxsTmFtZSgpIHsgcmV0dXJuICJfcHVyZWNhbGwiOyB9CisgIFN0cmluZ1JlZiBHZXREZWxldGVkVmlydHVhbENhbGxOYW1lKCkgb3ZlcnJpZGUgeyByZXR1cm4gIl9wdXJlY2FsbCI7IH0KIAotICBib29sIGlzSW5saW5lSW5pdGlhbGl6ZWRTdGF0aWNEYXRhTWVtYmVyTGlua09uY2UoKSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgaXNJbmxpbmVJbml0aWFsaXplZFN0YXRpY0RhdGFNZW1iZXJMaW5rT25jZSgpICBvdmVycmlkZXsgcmV0dXJuIHRydWU7IH0KIAogICBsbHZtOjpWYWx1ZSAqYWRqdXN0VG9Db21wbGV0ZU9iamVjdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKnB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIHR5cGUpIG92ZXJyaWRlOwogCi0gIGxsdm06OlZhbHVlICpHZXRWaXJ0dWFsQmFzZUNsYXNzT2Zmc2V0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQ2xhc3NEZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlQ2xhc3NEZWNsKTsKKyAgbGx2bTo6VmFsdWUgKgorICBHZXRWaXJ0dWFsQmFzZUNsYXNzT2Zmc2V0KENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBsbHZtOjpWYWx1ZSAqVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpDbGFzc0RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZUNsYXNzRGVjbCkgb3ZlcnJpZGU7CiAKICAgdm9pZCBCdWlsZENvbnN0cnVjdG9yU2lnbmF0dXJlKGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqQ3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEN0b3JUeXBlIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsVHlwZSAmUmVzVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q2FuUXVhbFR5cGU+ICZBcmdUeXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ3RvclR5cGUgVHlwZSwgQ2FuUXVhbFR5cGUgJlJlc1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENhblF1YWxUeXBlPiAmQXJnVHlzKSBvdmVycmlkZTsKIAotICBsbHZtOjpCYXNpY0Jsb2NrICpFbWl0Q3RvckNvbXBsZXRlT2JqZWN0SGFuZGxlcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOworICBsbHZtOjpCYXNpY0Jsb2NrICoKKyAgRW1pdEN0b3JDb21wbGV0ZU9iamVjdEhhbmRsZXIoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSBvdmVycmlkZTsKIAogICB2b2lkIGluaXRpYWxpemVIaWRkZW5WaXJ0dWFsSW5oZXJpdGFuY2VNZW1iZXJzKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgb3ZlcnJpZGU7CiAKLSAgdm9pZCBFbWl0Q1hYQ29uc3RydWN0b3JzKGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqRCk7CisgIHZvaWQgRW1pdENYWENvbnN0cnVjdG9ycyhjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQpIG92ZXJyaWRlOwogCiAgIC8vIEJhY2tncm91bmQgb24gTVNWQyBkZXN0cnVjdG9ycwogICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEwOSwxNyArMTIwLDE4IEBACiAgIHZvaWQgQnVpbGREZXN0cnVjdG9yU2lnbmF0dXJlKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpEdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhEdG9yVHlwZSBUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsVHlwZSAmUmVzVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDYW5RdWFsVHlwZT4gJkFyZ1R5cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDYW5RdWFsVHlwZT4gJkFyZ1R5cykgb3ZlcnJpZGU7CiAKICAgLy8vIE5vbi1iYXNlIGR0b3JzIHNob3VsZCBiZSBlbWl0dGVkIGFzIGRlbGVnYXRpbmcgdGh1bmtzIGluIHRoaXMgQUJJLgogICBib29sIHVzZVRodW5rRm9yRHRvclZhcmlhbnQoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkR0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhEdG9yVHlwZSBEVCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYRHRvclR5cGUgRFQpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gRFQgIT0gRHRvcl9CYXNlOwogICB9CiAKLSAgdm9pZCBFbWl0Q1hYRGVzdHJ1Y3RvcnMoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkQpOworICB2b2lkIEVtaXRDWFhEZXN0cnVjdG9ycyhjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqRCkgb3ZlcnJpZGU7CiAKLSAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqZ2V0VGhpc0FyZ3VtZW50VHlwZUZvck1ldGhvZChjb25zdCBDWFhNZXRob2REZWNsICpNRCkgeworICBjb25zdCBDWFhSZWNvcmREZWNsICoKKyAgZ2V0VGhpc0FyZ3VtZW50VHlwZUZvck1ldGhvZChjb25zdCBDWFhNZXRob2REZWNsICpNRCkgb3ZlcnJpZGUgewogICAgIE1EID0gTUQtPmdldENhbm9uaWNhbERlY2woKTsKICAgICBpZiAoTUQtPmlzVmlydHVhbCgpICYmICFpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KE1EKSkgewogICAgICAgTWljcm9zb2Z0VlRhYmxlQ29udGV4dDo6TWV0aG9kVkZUYWJsZUxvY2F0aW9uIE1MID0KQEAgLTEzNiw3MSArMTQ4LDgzIEBACiAgICAgcmV0dXJuIE1ELT5nZXRQYXJlbnQoKTsKICAgfQogCi0gIGxsdm06OlZhbHVlICphZGp1c3RUaGlzQXJndW1lbnRGb3JWaXJ0dWFsQ2FsbChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbERlY2wgR0QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVGhpcyk7CisgIGxsdm06OlZhbHVlICoKKyAgYWRqdXN0VGhpc0FyZ3VtZW50Rm9yVmlydHVhbEZ1bmN0aW9uQ2FsbChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgR2xvYmFsRGVjbCBHRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZpcnR1YWxDYWxsKSBvdmVycmlkZTsKIAotICB2b2lkIEJ1aWxkSW5zdGFuY2VGdW5jdGlvblBhcmFtcyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgJlJlc1R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFyZ0xpc3QgJlBhcmFtcyk7CisgIHZvaWQgYWRkSW1wbGljaXRTdHJ1Y3RvclBhcmFtcyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwgUXVhbFR5cGUgJlJlc1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BcmdMaXN0ICZQYXJhbXMpIG92ZXJyaWRlOwogCiAgIGxsdm06OlZhbHVlICphZGp1c3RUaGlzUGFyYW1ldGVySW5WaXJ0dWFsRnVuY3Rpb25Qcm9sb2d1ZSgKLSAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBHbG9iYWxEZWNsIEdELCBsbHZtOjpWYWx1ZSAqVGhpcyk7CisgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRiwgR2xvYmFsRGVjbCBHRCwgbGx2bTo6VmFsdWUgKlRoaXMpIG92ZXJyaWRlOwogCi0gIHZvaWQgRW1pdEluc3RhbmNlRnVuY3Rpb25Qcm9sb2coQ29kZUdlbkZ1bmN0aW9uICZDR0YpOworICB2b2lkIEVtaXRJbnN0YW5jZUZ1bmN0aW9uUHJvbG9nKENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBvdmVycmlkZTsKIAotICB2b2lkIEVtaXRDb25zdHJ1Y3RvckNhbGwoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsIENYWEN0b3JUeXBlIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvclZpcnR1YWxCYXNlLCBib29sIERlbGVnYXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxFeHByOjpjb25zdF9hcmdfaXRlcmF0b3IgQXJnQmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEV4cHI6OmNvbnN0X2FyZ19pdGVyYXRvciBBcmdFbmQpOworICB1bnNpZ25lZCBhZGRJbXBsaWNpdENvbnN0cnVjdG9yQXJncyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDdG9yVHlwZSBUeXBlLCBib29sIEZvclZpcnR1YWxCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlbGVnYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxBcmdMaXN0ICZBcmdzKSBvdmVycmlkZTsKIAotICB2b2lkIGVtaXRWVGFibGVEZWZpbml0aW9ucyhDb2RlR2VuVlRhYmxlcyAmQ0dWVCwgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOworICB2b2lkIEVtaXREZXN0cnVjdG9yQ2FsbChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkRELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhEdG9yVHlwZSBUeXBlLCBib29sIEZvclZpcnR1YWxCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlbGVnYXRpbmcsIGxsdm06OlZhbHVlICpUaGlzKSBvdmVycmlkZTsKKworICB2b2lkIGVtaXRWVGFibGVEZWZpbml0aW9ucyhDb2RlR2VuVlRhYmxlcyAmQ0dWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIG92ZXJyaWRlOwogCiAgIGxsdm06OlZhbHVlICpnZXRWVGFibGVBZGRyZXNzUG9pbnRJblN0cnVjdG9yKAogICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IENYWFJlY29yZERlY2wgKlZUYWJsZUNsYXNzLAogICAgICAgQmFzZVN1Ym9iamVjdCBCYXNlLCBjb25zdCBDWFhSZWNvcmREZWNsICpOZWFyZXN0VkJhc2UsCi0gICAgICBib29sICZOZWVkc1ZpcnR1YWxPZmZzZXQpOworICAgICAgYm9vbCAmTmVlZHNWaXJ0dWFsT2Zmc2V0KSBvdmVycmlkZTsKIAogICBsbHZtOjpDb25zdGFudCAqCiAgIGdldFZUYWJsZUFkZHJlc3NQb2ludEZvckNvbnN0RXhwcihCYXNlU3Vib2JqZWN0IEJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpWVGFibGVDbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpWVGFibGVDbGFzcykgb3ZlcnJpZGU7CiAKICAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKmdldEFkZHJPZlZUYWJsZShjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgVlB0ck9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIFZQdHJPZmZzZXQpIG92ZXJyaWRlOwogCiAgIGxsdm06OlZhbHVlICpnZXRWaXJ0dWFsRnVuY3Rpb25Qb2ludGVyKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBHbG9iYWxEZWNsIEdELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVGhpcywgbGx2bTo6VHlwZSAqVHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VHlwZSAqVHkpIG92ZXJyaWRlOwogCiAgIHZvaWQgRW1pdFZpcnR1YWxEZXN0cnVjdG9yQ2FsbChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpEdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYRHRvclR5cGUgRHRvclR5cGUsIFNvdXJjZUxvY2F0aW9uIENhbGxMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVGhpcykgb3ZlcnJpZGU7CiAKICAgdm9pZCBhZGp1c3RDYWxsQXJnc0ZvckRlc3RydWN0b3JUaHVuayhDb2RlR2VuRnVuY3Rpb24gJkNHRiwgR2xvYmFsRGVjbCBHRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsQXJnTGlzdCAmQ2FsbEFyZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsQXJnTGlzdCAmQ2FsbEFyZ3MpIG92ZXJyaWRlIHsKICAgICBhc3NlcnQoR0QuZ2V0RHRvclR5cGUoKSA9PSBEdG9yX0RlbGV0aW5nICYmCiAgICAgICAgICAgICJPbmx5IGRlbGV0aW5nIGRlc3RydWN0b3IgdGh1bmtzIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBBQkkiKTsKICAgICBDYWxsQXJncy5hZGQoUlZhbHVlOjpnZXQoZ2V0U3RydWN0b3JJbXBsaWNpdFBhcmFtVmFsdWUoQ0dGKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHTS5nZXRDb250ZXh0KCkuSW50VHkpOwogICB9CiAKLSAgdm9pZCBlbWl0VmlydHVhbEluaGVyaXRhbmNlVGFibGVzKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKTsKKyAgdm9pZCBlbWl0VmlydHVhbEluaGVyaXRhbmNlVGFibGVzKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSBvdmVycmlkZTsKIAotICB2b2lkIHNldFRodW5rTGlua2FnZShsbHZtOjpGdW5jdGlvbiAqVGh1bmssIGJvb2wgRm9yVlRhYmxlKSB7CisgIGxsdm06Okdsb2JhbFZhcmlhYmxlICoKKyAgZ2V0QWRkck9mVkJUYWJsZShjb25zdCBWUHRySW5mbyAmVkJULCBjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYXJpYWJsZTo6TGlua2FnZVR5cGVzIExpbmthZ2UpOworCisgIHZvaWQgZW1pdFZCVGFibGVEZWZpbml0aW9uKGNvbnN0IFZQdHJJbmZvICZWQlQsIGNvbnN0IENYWFJlY29yZERlY2wgKlJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YpIGNvbnN0OworCisgIHZvaWQgc2V0VGh1bmtMaW5rYWdlKGxsdm06OkZ1bmN0aW9uICpUaHVuaywgYm9vbCBGb3JWVGFibGUpIG92ZXJyaWRlIHsKICAgICBUaHVuay0+c2V0TGlua2FnZShsbHZtOjpHbG9iYWxWYWx1ZTo6V2Vha0FueUxpbmthZ2UpOwogICB9CiAKICAgbGx2bTo6VmFsdWUgKnBlcmZvcm1UaGlzQWRqdXN0bWVudChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgbGx2bTo6VmFsdWUgKlRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhpc0FkanVzdG1lbnQgJlRBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaGlzQWRqdXN0bWVudCAmVEEpIG92ZXJyaWRlOwogCiAgIGxsdm06OlZhbHVlICpwZXJmb3JtUmV0dXJuQWRqdXN0bWVudChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgbGx2bTo6VmFsdWUgKlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldHVybkFkanVzdG1lbnQgJlJBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldHVybkFkanVzdG1lbnQgJlJBKSBvdmVycmlkZTsKIAogICB2b2lkIEVtaXRHdWFyZGVkSW5pdChDb2RlR2VuRnVuY3Rpb24gJkNHRiwgY29uc3QgVmFyRGVjbCAmRCwKICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkRlY2xQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUGVyZm9ybUluaXQpOworICAgICAgICAgICAgICAgICAgICAgICBib29sIFBlcmZvcm1Jbml0KSBvdmVycmlkZTsKIAogICAvLyA9PT09IE5vdGVzIG9uIGFycmF5IGNvb2tpZXMgPT09PT09PT09CiAgIC8vCkBAIC0yMjUsMTcgKzI0OSwxOCBAQAogICAvLyAgIH0KICAgLy8gV2hlcmVhcyBpdCBwcmludHMgIjEwNCIgYW5kICIxMDQiIGlmIHlvdSBnaXZlIEEgYSBkZXN0cnVjdG9yLgogCi0gIGJvb2wgcmVxdWlyZXNBcnJheUNvb2tpZShjb25zdCBDWFhEZWxldGVFeHByICpleHByLCBRdWFsVHlwZSBlbGVtZW50VHlwZSk7Ci0gIGJvb2wgcmVxdWlyZXNBcnJheUNvb2tpZShjb25zdCBDWFhOZXdFeHByICpleHByKTsKLSAgQ2hhclVuaXRzIGdldEFycmF5Q29va2llU2l6ZUltcGwoUXVhbFR5cGUgdHlwZSk7CisgIGJvb2wgcmVxdWlyZXNBcnJheUNvb2tpZShjb25zdCBDWFhEZWxldGVFeHByICpleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgZWxlbWVudFR5cGUpIG92ZXJyaWRlOworICBib29sIHJlcXVpcmVzQXJyYXlDb29raWUoY29uc3QgQ1hYTmV3RXhwciAqZXhwcikgb3ZlcnJpZGU7CisgIENoYXJVbml0cyBnZXRBcnJheUNvb2tpZVNpemVJbXBsKFF1YWxUeXBlIHR5cGUpIG92ZXJyaWRlOwogICBsbHZtOjpWYWx1ZSAqSW5pdGlhbGl6ZUFycmF5Q29va2llKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpOZXdQdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKk51bUVsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWE5ld0V4cHIgKmV4cHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgRWxlbWVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEVsZW1lbnRUeXBlKSBvdmVycmlkZTsKICAgbGx2bTo6VmFsdWUgKnJlYWRBcnJheUNvb2tpZUltcGwoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICphbGxvY1B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIGNvb2tpZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgY29va2llU2l6ZSkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgIE1pY3Jvc29mdE1hbmdsZUNvbnRleHQgJmdldE1hbmdsZUNvbnRleHQoKSB7CkBAIC0yNTgsMTUgKzI4MywxMiBAQAogICAgIHJldHVybiBDID8gQyA6IGdldFplcm9JbnQoKTsKICAgfQogCisgIENoYXJVbml0cyBnZXRWaXJ0dWFsRnVuY3Rpb25Qcm9sb2d1ZVRoaXNBZGp1c3RtZW50KEdsb2JhbERlY2wgR0QpOworCiAgIHZvaWQKICAgR2V0TnVsbE1lbWJlclBvaW50ZXJGaWVsZHMoY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGxsdm06OkNvbnN0YW50ICo+ICZmaWVsZHMpOwogCi0gIC8vLyBcYnJpZWYgRmluZHMgdGhlIG9mZnNldCBmcm9tIHRoZSBiYXNlIG9mIFJEIHRvIHRoZSB2YnB0ciBpdCB1c2VzLCBldmVuIGlmCi0gIC8vLyBpdCBpcyByZXVzaW5nIGEgdmJwdHIgZnJvbSBhIG5vbi12aXJ0dWFsIGJhc2UuICBSRCBtdXN0IGhhdmUgbW9yYWxseQotICAvLy8gdmlydHVhbCBiYXNlcy4KLSAgQ2hhclVuaXRzIEdldFZCUHRyT2Zmc2V0RnJvbUJhc2VzKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKTsKLQogICAvLy8gXGJyaWVmIFNoYXJlZCBjb2RlIGZvciB2aXJ0dWFsIGJhc2UgYWRqdXN0bWVudC4gIFJldHVybnMgdGhlIG9mZnNldCBmcm9tCiAgIC8vLyB0aGUgdmJwdHIgdG8gdGhlIHZpcnR1YWwgYmFzZS4gIE9wdGlvbmFsbHkgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUKICAgLy8vIHZicHRyIGl0c2VsZi4KQEAgLTI4OCw4ICszMTAsOCBAQAogCiAgIC8vLyBcYnJpZWYgUGVyZm9ybXMgYSBmdWxsIHZpcnR1YWwgYmFzZSBhZGp1c3RtZW50LiAgVXNlZCB0byBkZXJlZmVyZW5jZQogICAvLy8gcG9pbnRlcnMgdG8gbWVtYmVycyBvZiB2aXJ0dWFsIGJhc2VzLgotICBsbHZtOjpWYWx1ZSAqQWRqdXN0VmlydHVhbEJhc2UoQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IENYWFJlY29yZERlY2wgKlJELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkJhc2UsCisgIGxsdm06OlZhbHVlICpBZGp1c3RWaXJ0dWFsQmFzZShDb2RlR2VuRnVuY3Rpb24gJkNHRiwgY29uc3QgRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJELCBsbHZtOjpWYWx1ZSAqQmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpWaXJ0dWFsQmFzZUFkanVzdG1lbnRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVkJQdHJPZmZzZXQgLyogb3B0aW9uYWwgKi8pOwogCkBAIC0zMTEsNTEgKzMzMyw1MSBAQAogICB2b2lkIEVtaXRWQlB0clN0b3JlcyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOwogCiAgIC8vLyBcYnJpZWYgQ2FjaGluZyB3cmFwcGVyIGFyb3VuZCBWQlRhYmxlQnVpbGRlcjo6ZW51bWVyYXRlVkJUYWJsZXMoKS4KLSAgY29uc3QgVkJUYWJsZVZlY3RvciAmRW51bWVyYXRlVkJUYWJsZXMoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOworICBjb25zdCBWQlRhYmxlR2xvYmFscyAmZW51bWVyYXRlVkJUYWJsZXMoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpOwogCiAgIC8vLyBcYnJpZWYgR2VuZXJhdGUgYSB0aHVuayBmb3IgY2FsbGluZyBhIHZpcnR1YWwgbWVtYmVyIGZ1bmN0aW9uIE1ELgotICBsbHZtOjpGdW5jdGlvbiAqRW1pdFZpcnR1YWxNZW1QdHJUaHVuayhjb25zdCBDWFhNZXRob2REZWNsICpNRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFRodW5rTmFtZSk7CisgIGxsdm06OkZ1bmN0aW9uICpFbWl0VmlydHVhbE1lbVB0clRodW5rKAorICAgICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQsCisgICAgICBjb25zdCBNaWNyb3NvZnRWVGFibGVDb250ZXh0OjpNZXRob2RWRlRhYmxlTG9jYXRpb24gJk1MKTsKIAogcHVibGljOgotICB2aXJ0dWFsIGxsdm06OlR5cGUgKkNvbnZlcnRNZW1iZXJQb2ludGVyVHlwZShjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKTsKKyAgbGx2bTo6VHlwZSAqQ29udmVydE1lbWJlclBvaW50ZXJUeXBlKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgYm9vbCBpc1plcm9Jbml0aWFsaXphYmxlKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpOworICBib29sIGlzWmVyb0luaXRpYWxpemFibGUoY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCAqRW1pdE51bGxNZW1iZXJQb2ludGVyKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpOworICBsbHZtOjpDb25zdGFudCAqRW1pdE51bGxNZW1iZXJQb2ludGVyKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkVtaXRNZW1iZXJEYXRhUG9pbnRlcihjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzIG9mZnNldCk7Ci0gIHZpcnR1YWwgbGx2bTo6Q29uc3RhbnQgKkVtaXRNZW1iZXJQb2ludGVyKGNvbnN0IENYWE1ldGhvZERlY2wgKk1EKTsKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCAqRW1pdE1lbWJlclBvaW50ZXIoY29uc3QgQVBWYWx1ZSAmTVAsIFF1YWxUeXBlIE1QVCk7CisgIGxsdm06OkNvbnN0YW50ICpFbWl0TWVtYmVyRGF0YVBvaW50ZXIoY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgb2Zmc2V0KSBvdmVycmlkZTsKKyAgbGx2bTo6Q29uc3RhbnQgKkVtaXRNZW1iZXJQb2ludGVyKGNvbnN0IENYWE1ldGhvZERlY2wgKk1EKSBvdmVycmlkZTsKKyAgbGx2bTo6Q29uc3RhbnQgKkVtaXRNZW1iZXJQb2ludGVyKGNvbnN0IEFQVmFsdWUgJk1QLCBRdWFsVHlwZSBNUFQpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRNZW1iZXJQb2ludGVyQ29tcGFyaXNvbihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmVxdWFsaXR5KTsKKyAgbGx2bTo6VmFsdWUgKkVtaXRNZW1iZXJQb2ludGVyQ29tcGFyaXNvbihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5lcXVhbGl0eSkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqRW1pdE1lbWJlclBvaW50ZXJJc05vdE51bGwoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpNZW1QdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpOworICBsbHZtOjpWYWx1ZSAqRW1pdE1lbWJlclBvaW50ZXJJc05vdE51bGwoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTWVtUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqRW1pdE1lbWJlckRhdGFQb2ludGVyQWRkcmVzcyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTWVtUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKTsKKyAgbGx2bTo6VmFsdWUgKgorICBFbWl0TWVtYmVyRGF0YVBvaW50ZXJBZGRyZXNzKENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBjb25zdCBFeHByICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpCYXNlLCBsbHZtOjpWYWx1ZSAqTWVtUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRNZW1iZXJQb2ludGVyQ29udmVyc2lvbihDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhc3RFeHByICpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlNyYyk7CisgIGxsdm06OlZhbHVlICpFbWl0TWVtYmVyUG9pbnRlckNvbnZlcnNpb24oQ29kZUdlbkZ1bmN0aW9uICZDR0YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FzdEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlNyYykgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBsbHZtOjpDb25zdGFudCAqRW1pdE1lbWJlclBvaW50ZXJDb252ZXJzaW9uKGNvbnN0IENhc3RFeHByICpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnQgKlNyYyk7CisgIGxsdm06OkNvbnN0YW50ICpFbWl0TWVtYmVyUG9pbnRlckNvbnZlcnNpb24oY29uc3QgQ2FzdEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnQgKlNyYykgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqCi0gIEVtaXRMb2FkT2ZNZW1iZXJGdW5jdGlvblBvaW50ZXIoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKiZUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpNZW1QdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCk7CisgIGxsdm06OlZhbHVlICoKKyAgRW1pdExvYWRPZk1lbWJlckZ1bmN0aW9uUG9pbnRlcihDb2RlR2VuRnVuY3Rpb24gJkNHRiwgY29uc3QgRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqJlRoaXMsIGxsdm06OlZhbHVlICpNZW1QdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IENYWFJlY29yZERlY2wgKiwgQ2hhclVuaXRzPiBWRlRhYmxlSWRUeTsKQEAgLTM2OCw3ICszOTAsNyBAQAogCiAKICAgLy8vIFxicmllZiBBbGwgdGhlIHZidGFibGVzIHdoaWNoIGhhdmUgYmVlbiByZWZlcmVuY2VkLgotICBsbHZtOjpEZW5zZU1hcDxjb25zdCBDWFhSZWNvcmREZWNsICosIFZCVGFibGVWZWN0b3I+IFZCVGFibGVzTWFwOworICBsbHZtOjpEZW5zZU1hcDxjb25zdCBDWFhSZWNvcmREZWNsICosIFZCVGFibGVHbG9iYWxzPiBWQlRhYmxlc01hcDsKIAogICAvLy8gSW5mbyBvbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIHVzZWQgdG8gZ3VhcmQgaW5pdGlhbGl6YXRpb24gb2Ygc3RhdGljIGxvY2Fscy4KICAgLy8vIFRoZSBCaXRJbmRleCBmaWVsZCBpcyBvbmx5IHVzZWQgZm9yIGV4dGVybmFsbHkgaW52aXNpYmxlIGRlY2xhcmF0aW9ucy4KQEAgLTM5Miw0MSArNDE0LDEzIEBACiAgIHJldHVybiBwdHI7CiB9CiAKLS8vLyBcYnJpZWYgRmluZHMgdGhlIGZpcnN0IG5vbi12aXJ0dWFsIGJhc2Ugb2YgUkQgdGhhdCBoYXMgdmlydHVhbCBiYXNlcy4gIElmIFJECi0vLy8gZG9lc24ndCBoYXZlIGEgdmJwdHIsIGl0IHdpbGwgcmV1c2UgdGhlIHZicHRyIG9mIHRoZSByZXR1cm5lZCBjbGFzcy4KLXN0YXRpYyBjb25zdCBDWFhSZWNvcmREZWNsICpGaW5kRmlyc3ROVkJhc2VXaXRoVkJhc2VzKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7Ci0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlID0gSS0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKLSAgICBpZiAoIUktPmlzVmlydHVhbCgpICYmIEJhc2UtPmdldE51bVZCYXNlcygpID4gMCkKLSAgICAgIHJldHVybiBCYXNlOwotICB9Ci0gIGxsdm1fdW5yZWFjaGFibGUoIlJEIG11c3QgaGF2ZSBhbiBudiBiYXNlIHdpdGggdmJhc2VzIik7Ci19Ci0KLUNoYXJVbml0cyBNaWNyb3NvZnRDWFhBQkk6OkdldFZCUHRyT2Zmc2V0RnJvbUJhc2VzKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7Ci0gIGFzc2VydChSRC0+Z2V0TnVtVkJhc2VzKCkpOwotICBDaGFyVW5pdHMgVG90YWwgPSBDaGFyVW5pdHM6Olplcm8oKTsKLSAgd2hpbGUgKFJEKSB7Ci0gICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZSRExheW91dCA9IGdldENvbnRleHQoKS5nZXRBU1RSZWNvcmRMYXlvdXQoUkQpOwotICAgIENoYXJVbml0cyBWQlB0ck9mZnNldCA9IFJETGF5b3V0LmdldFZCUHRyT2Zmc2V0KCk7Ci0gICAgLy8gLTEgaXMgdGhlIHNlbnRpbmVsIGZvciBubyB2YnB0ci4KLSAgICBpZiAoVkJQdHJPZmZzZXQgIT0gQ2hhclVuaXRzOjpmcm9tUXVhbnRpdHkoLTEpKSB7Ci0gICAgICBUb3RhbCArPSBWQlB0ck9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBSRCA9IEZpbmRGaXJzdE5WQmFzZVdpdGhWQmFzZXMoUkQpOwotICAgIFRvdGFsICs9IFJETGF5b3V0LmdldEJhc2VDbGFzc09mZnNldChSRCk7Ci0gIH0KLSAgcmV0dXJuIFRvdGFsOwotfQotCiBsbHZtOjpWYWx1ZSAqCiBNaWNyb3NvZnRDWFhBQkk6OkdldFZpcnR1YWxCYXNlQ2xhc3NPZmZzZXQoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQ2xhc3NEZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkJhc2VDbGFzc0RlY2wpIHsKLSAgaW50NjRfdCBWQlB0ckNoYXJzID0gR2V0VkJQdHJPZmZzZXRGcm9tQmFzZXMoQ2xhc3NEZWNsKS5nZXRRdWFudGl0eSgpOworICBpbnQ2NF90IFZCUHRyQ2hhcnMgPQorICAgICAgZ2V0Q29udGV4dCgpLmdldEFTVFJlY29yZExheW91dChDbGFzc0RlY2wpLmdldFZCUHRyT2Zmc2V0KCkuZ2V0UXVhbnRpdHkoKTsKICAgbGx2bTo6VmFsdWUgKlZCUHRyT2Zmc2V0ID0gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChDR00uUHRyRGlmZlR5LCBWQlB0ckNoYXJzKTsKICAgQ2hhclVuaXRzIEludFNpemUgPSBnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemVJbkNoYXJzKGdldENvbnRleHQoKS5JbnRUeSk7CiAgIENoYXJVbml0cyBWQlRhYmxlQ2hhcnMgPQpAQCAtNDQ2LDE2ICs0NDAsMjAgQEAKICAgcmV0dXJuIGlzYTxDWFhDb25zdHJ1Y3RvckRlY2w+KEdELmdldERlY2woKSk7CiB9CiAKLXZvaWQgTWljcm9zb2Z0Q1hYQUJJOjpCdWlsZENvbnN0cnVjdG9yU2lnbmF0dXJlKGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqQ3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEN0b3JUeXBlIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5RdWFsVHlwZSAmUmVzVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q2FuUXVhbFR5cGU+ICZBcmdUeXMpIHsKLSAgLy8gJ3RoaXMnIHBhcmFtZXRlciBhbmQgJ3RoaXMnIHJldHVybiBhcmUgYWxyZWFkeSBpbiBwbGFjZQordm9pZCBNaWNyb3NvZnRDWFhBQkk6OkJ1aWxkQ29uc3RydWN0b3JTaWduYXR1cmUoCisgICAgY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpDdG9yLCBDWFhDdG9yVHlwZSBUeXBlLCBDYW5RdWFsVHlwZSAmUmVzVHksCisgICAgU21hbGxWZWN0b3JJbXBsPENhblF1YWxUeXBlPiAmQXJnVHlzKSB7CisKKyAgLy8gQWxsIHBhcmFtZXRlcnMgYXJlIGFscmVhZHkgaW4gcGxhY2UgZXhjZXB0IGlzX21vc3RfZGVyaXZlZCwgd2hpY2ggZ29lcworICAvLyBhZnRlciAndGhpcycgaWYgaXQncyB2YXJpYWRpYyBhbmQgbGFzdCBpZiBpdCdzIG5vdC4KIAogICBjb25zdCBDWFhSZWNvcmREZWNsICpDbGFzcyA9IEN0b3ItPmdldFBhcmVudCgpOworICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0gQ3Rvci0+Z2V0VHlwZSgpLT5jYXN0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CiAgIGlmIChDbGFzcy0+Z2V0TnVtVkJhc2VzKCkpIHsKLSAgICAvLyBDb25zdHJ1Y3RvcnMgb2YgY2xhc3NlcyB3aXRoIHZpcnR1YWwgYmFzZXMgdGFrZSBhbiBpbXBsaWNpdCBwYXJhbWV0ZXIuCi0gICAgQXJnVHlzLnB1c2hfYmFjayhDR00uZ2V0Q29udGV4dCgpLkludFR5KTsKKyAgICBpZiAoRlBULT5pc1ZhcmlhZGljKCkpCisgICAgICBBcmdUeXMuaW5zZXJ0KEFyZ1R5cy5iZWdpbigpICsgMSwgQ0dNLmdldENvbnRleHQoKS5JbnRUeSk7CisgICAgZWxzZQorICAgICAgQXJnVHlzLnB1c2hfYmFjayhDR00uZ2V0Q29udGV4dCgpLkludFR5KTsKICAgfQogfQogCkBAIC01NDcsMTkgKzU0NSwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCkgewogICBsbHZtOjpWYWx1ZSAqVGhpc0ludDhQdHIgPQogICAgIENHRi5CdWlsZGVyLkNyZWF0ZUJpdENhc3QoZ2V0VGhpc1ZhbHVlKENHRiksIENHTS5JbnQ4UHRyVHksICJ0aGlzLmludDgiKTsKKyAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZMYXlvdXQgPSBDR00uZ2V0Q29udGV4dCgpLmdldEFTVFJlY29yZExheW91dChSRCk7CiAKLSAgY29uc3QgVkJUYWJsZVZlY3RvciAmVkJUYWJsZXMgPSBFbnVtZXJhdGVWQlRhYmxlcyhSRCk7Ci0gIGZvciAoVkJUYWJsZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgSSA9IFZCVGFibGVzLmJlZ2luKCksIEUgPSBWQlRhYmxlcy5lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgeworICBjb25zdCBWQlRhYmxlR2xvYmFscyAmVkJHbG9iYWxzID0gZW51bWVyYXRlVkJUYWJsZXMoUkQpOworICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gVkJHbG9iYWxzLlZCVGFibGVzLT5zaXplKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgVlB0ckluZm8gKlZCVCA9ICgqVkJHbG9iYWxzLlZCVGFibGVzKVtJXTsKKyAgICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YgPSBWQkdsb2JhbHMuR2xvYmFsc1tJXTsKICAgICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJlN1Ym9iamVjdExheW91dCA9Ci0gICAgICBDR00uZ2V0Q29udGV4dCgpLmdldEFTVFJlY29yZExheW91dChJLT5WQlB0clN1Ym9iamVjdC5nZXRCYXNlKCkpOwotICAgIHVpbnQ2NF90IE9mZnMgPSAoSS0+VkJQdHJTdWJvYmplY3QuZ2V0QmFzZU9mZnNldCgpICsKLSAgICAgICAgICAgICAgICAgICAgIFN1Ym9iamVjdExheW91dC5nZXRWQlB0ck9mZnNldCgpKS5nZXRRdWFudGl0eSgpOworICAgICAgICBDR00uZ2V0Q29udGV4dCgpLmdldEFTVFJlY29yZExheW91dChWQlQtPkJhc2VXaXRoVlB0cik7CisgICAgQ2hhclVuaXRzIE9mZnMgPSBWQlQtPk5vblZpcnR1YWxPZmZzZXQ7CisgICAgT2ZmcyArPSBTdWJvYmplY3RMYXlvdXQuZ2V0VkJQdHJPZmZzZXQoKTsKKyAgICBpZiAoVkJULT5nZXRWQmFzZVdpdGhWUHRyKCkpCisgICAgICBPZmZzICs9IExheW91dC5nZXRWQmFzZUNsYXNzT2Zmc2V0KFZCVC0+Z2V0VkJhc2VXaXRoVlB0cigpKTsKICAgICBsbHZtOjpWYWx1ZSAqVkJQdHIgPQotICAgICAgICBDR0YuQnVpbGRlci5DcmVhdGVDb25zdEluQm91bmRzR0VQMV82NChUaGlzSW50OFB0ciwgT2Zmcyk7Ci0gICAgVkJQdHIgPSBDR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KFZCUHRyLCBJLT5HVi0+Z2V0VHlwZSgpLT5nZXRQb2ludGVyVG8oMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YnB0ci4iICsgSS0+UmV1c2luZ0Jhc2UtPmdldE5hbWUoKSk7Ci0gICAgQ0dGLkJ1aWxkZXIuQ3JlYXRlU3RvcmUoSS0+R1YsIFZCUHRyKTsKKyAgICAgICAgQ0dGLkJ1aWxkZXIuQ3JlYXRlQ29uc3RJbkJvdW5kc0dFUDFfNjQoVGhpc0ludDhQdHIsIE9mZnMuZ2V0UXVhbnRpdHkoKSk7CisgICAgVkJQdHIgPSBDR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KFZCUHRyLCBHVi0+Z2V0VHlwZSgpLT5nZXRQb2ludGVyVG8oMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YnB0ci4iICsgVkJULT5SZXVzaW5nQmFzZS0+Z2V0TmFtZSgpKTsKKyAgICBDR0YuQnVpbGRlci5DcmVhdGVTdG9yZShHViwgVkJQdHIpOwogICB9CiB9CiAKQEAgLTU4MywxMiArNTg1LDYxIEBACiAgIENHTS5FbWl0R2xvYmFsKEdsb2JhbERlY2woRCwgRHRvcl9CYXNlKSk7CiB9CiAKLWxsdm06OlZhbHVlICpNaWNyb3NvZnRDWFhBQkk6OmFkanVzdFRoaXNBcmd1bWVudEZvclZpcnR1YWxDYWxsKAotICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBHbG9iYWxEZWNsIEdELCBsbHZtOjpWYWx1ZSAqVGhpcykgeworQ2hhclVuaXRzCitNaWNyb3NvZnRDWFhBQkk6OmdldFZpcnR1YWxGdW5jdGlvblByb2xvZ3VlVGhpc0FkanVzdG1lbnQoR2xvYmFsRGVjbCBHRCkgewogICBHRCA9IEdELmdldENhbm9uaWNhbERlY2woKTsKICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPSBjYXN0PENYWE1ldGhvZERlY2w+KEdELmdldERlY2woKSk7Ci0gIC8vIEZJWE1FOiBjb25zaWRlciBzcGxpdHRpbmcgdGhlIHZkdG9yIHZzIHJlZ3VsYXIgbWV0aG9kIGNvZGUgaW50byB0d28KLSAgLy8gZnVuY3Rpb25zLgorCisgIEdsb2JhbERlY2wgTG9va3VwR0QgPSBHRDsKKyAgaWYgKGNvbnN0IENYWERlc3RydWN0b3JEZWNsICpERCA9IGR5bl9jYXN0PENYWERlc3RydWN0b3JEZWNsPihNRCkpIHsKKyAgICAvLyBDb21wbGV0ZSBkZXN0cnVjdG9ycyB0YWtlIGEgcG9pbnRlciB0byB0aGUgY29tcGxldGUgb2JqZWN0IGFzIGEKKyAgICAvLyBwYXJhbWV0ZXIsIHRodXMgZG9uJ3QgbmVlZCB0aGlzIGFkanVzdG1lbnQuCisgICAgaWYgKEdELmdldER0b3JUeXBlKCkgPT0gRHRvcl9Db21wbGV0ZSkKKyAgICAgIHJldHVybiBDaGFyVW5pdHMoKTsKKworICAgIC8vIFRoZXJlJ3Mgbm8gRHRvcl9CYXNlIGluIHZmdGFibGUgYnV0IGl0IHNoYXJlcyB0aGUgdGhpcyBhZGp1c3RtZW50IHdpdGgKKyAgICAvLyB0aGUgZGVsZXRpbmcgb25lLCBzbyBsb29rIGl0IHVwIGluc3RlYWQuCisgICAgTG9va3VwR0QgPSBHbG9iYWxEZWNsKERELCBEdG9yX0RlbGV0aW5nKTsKKyAgfQorCisgIE1pY3Jvc29mdFZUYWJsZUNvbnRleHQ6Ok1ldGhvZFZGVGFibGVMb2NhdGlvbiBNTCA9CisgICAgICBDR00uZ2V0TWljcm9zb2Z0VlRhYmxlQ29udGV4dCgpLmdldE1ldGhvZFZGVGFibGVMb2NhdGlvbihMb29rdXBHRCk7CisgIENoYXJVbml0cyBBZGp1c3RtZW50ID0gTUwuVkZQdHJPZmZzZXQ7CisKKyAgLy8gTm9ybWFsIHZpcnR1YWwgaW5zdGFuY2UgbWV0aG9kcyBuZWVkIHRvIGFkanVzdCBmcm9tIHRoZSB2ZnB0ciB0aGF0IGZpcnN0CisgIC8vIGRlZmluZWQgdGhlIHZpcnR1YWwgbWV0aG9kIHRvIHRoZSB2aXJ0dWFsIGJhc2Ugc3Vib2JqZWN0LCBidXQgZGVzdHJ1Y3RvcnMKKyAgLy8gZG8gbm90LiAgVGhlIHZlY3RvciBkZWxldGluZyBkZXN0cnVjdG9yIHRodW5rIGFwcGxpZXMgdGhpcyBhZGp1c3RtZW50IGZvcgorICAvLyB1cyBpZiBuZWNlc3NhcnkuCisgIGlmIChpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KE1EKSkKKyAgICBBZGp1c3RtZW50ID0gQ2hhclVuaXRzOjpaZXJvKCk7CisKKyAgaWYgKE1MLlZCYXNlKSB7CisgICAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZEZXJpdmVkTGF5b3V0ID0KKyAgICAgICAgQ0dNLmdldENvbnRleHQoKS5nZXRBU1RSZWNvcmRMYXlvdXQoTUQtPmdldFBhcmVudCgpKTsKKyAgICBBZGp1c3RtZW50ICs9IERlcml2ZWRMYXlvdXQuZ2V0VkJhc2VDbGFzc09mZnNldChNTC5WQmFzZSk7CisgIH0KKworICByZXR1cm4gQWRqdXN0bWVudDsKK30KKworbGx2bTo6VmFsdWUgKk1pY3Jvc29mdENYWEFCSTo6YWRqdXN0VGhpc0FyZ3VtZW50Rm9yVmlydHVhbEZ1bmN0aW9uQ2FsbCgKKyAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRiwgR2xvYmFsRGVjbCBHRCwgbGx2bTo6VmFsdWUgKlRoaXMsIGJvb2wgVmlydHVhbENhbGwpIHsKKyAgaWYgKCFWaXJ0dWFsQ2FsbCkgeworICAgIC8vIElmIHRoZSBjYWxsIG9mIGEgdmlydHVhbCBmdW5jdGlvbiBpcyBub3QgdmlydHVhbCwgd2UganVzdCBoYXZlIHRvCisgICAgLy8gY29tcGVuc2F0ZSBmb3IgdGhlIGFkanVzdG1lbnQgdGhlIHZpcnR1YWwgZnVuY3Rpb24gZG9lcyBpbiBpdHMgcHJvbG9ndWUuCisgICAgQ2hhclVuaXRzIEFkanVzdG1lbnQgPSBnZXRWaXJ0dWFsRnVuY3Rpb25Qcm9sb2d1ZVRoaXNBZGp1c3RtZW50KEdEKTsKKyAgICBpZiAoQWRqdXN0bWVudC5pc1plcm8oKSkKKyAgICAgIHJldHVybiBUaGlzOworCisgICAgdW5zaWduZWQgQVMgPSBjYXN0PGxsdm06OlBvaW50ZXJUeXBlPihUaGlzLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgICBsbHZtOjpUeXBlICpjaGFyUHRyVHkgPSBDR0YuSW50OFR5LT5nZXRQb2ludGVyVG8oQVMpOworICAgIFRoaXMgPSBDR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KFRoaXMsIGNoYXJQdHJUeSk7CisgICAgYXNzZXJ0KEFkanVzdG1lbnQuaXNQb3NpdGl2ZSgpKTsKKyAgICByZXR1cm4gQ0dGLkJ1aWxkZXIuQ3JlYXRlQ29uc3RHRVAxXzMyKFRoaXMsIEFkanVzdG1lbnQuZ2V0UXVhbnRpdHkoKSk7CisgIH0KKworICBHRCA9IEdELmdldENhbm9uaWNhbERlY2woKTsKKyAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPSBjYXN0PENYWE1ldGhvZERlY2w+KEdELmdldERlY2woKSk7CiAKICAgR2xvYmFsRGVjbCBMb29rdXBHRCA9IEdEOwogICBpZiAoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkREID0gZHluX2Nhc3Q8Q1hYRGVzdHJ1Y3RvckRlY2w+KE1EKSkgewpAQCAtNjA3LDUxICs2NTgsMTggQEAKICAgdW5zaWduZWQgQVMgPSBjYXN0PGxsdm06OlBvaW50ZXJUeXBlPihUaGlzLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKICAgbGx2bTo6VHlwZSAqY2hhclB0clR5ID0gQ0dGLkludDhUeS0+Z2V0UG9pbnRlclRvKEFTKTsKICAgQ2hhclVuaXRzIFN0YXRpY09mZnNldCA9IE1MLlZGUHRyT2Zmc2V0OworCisgIC8vIEJhc2UgZGVzdHJ1Y3RvcnMgZXhwZWN0ICd0aGlzJyB0byBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBiYXNlCisgIC8vIHN1Ym9iamVjdCwgbm90IHRoZSBmaXJzdCB2ZnB0ciB0aGF0IGhhcHBlbnMgdG8gY29udGFpbiB0aGUgdmlydHVhbCBkdG9yLgorICAvLyBIb3dldmVyLCB3ZSBzdGlsbCBuZWVkIHRvIGFwcGx5IHRoZSB2aXJ0dWFsIGJhc2UgYWRqdXN0bWVudC4KKyAgaWYgKGlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oTUQpICYmIEdELmdldER0b3JUeXBlKCkgPT0gRHRvcl9CYXNlKQorICAgIFN0YXRpY09mZnNldCA9IENoYXJVbml0czo6WmVybygpOworCiAgIGlmIChNTC5WQmFzZSkgewotICAgIGJvb2wgQXZvaWRWaXJ0dWFsT2Zmc2V0ID0gZmFsc2U7Ci0gICAgaWYgKGlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oTUQpICYmIEdELmdldER0b3JUeXBlKCkgPT0gRHRvcl9CYXNlKSB7Ci0gICAgICAvLyBBIGJhc2UgZGVzdHJ1Y3RvciBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBhIGNvbXBsZXRlIGRlc3RydWN0b3Igb2YgdGhlCi0gICAgICAvLyBzYW1lIHJlY29yZCB0eXBlIG9yIGFub3RoZXIgZGVzdHJ1Y3RvciBvZiBhIG1vcmUgZGVyaXZlZCB0eXBlOwotICAgICAgLy8gb3IgYSBjb25zdHJ1Y3RvciBvZiB0aGUgc2FtZSByZWNvcmQgdHlwZSBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLgotICAgICAgYXNzZXJ0KGlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oQ0dGLkN1ckdELmdldERlY2woKSkgfHwKLSAgICAgICAgICAgICBpc2E8Q1hYQ29uc3RydWN0b3JEZWNsPihDR0YuQ3VyR0QuZ2V0RGVjbCgpKSk7Ci0gICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpDdXJSRCA9Ci0gICAgICAgICAgY2FzdDxDWFhNZXRob2REZWNsPihDR0YuQ3VyR0QuZ2V0RGVjbCgpKS0+Z2V0UGFyZW50KCk7Ci0KLSAgICAgIGlmIChNRC0+Z2V0UGFyZW50KCkgPT0gQ3VyUkQpIHsKLSAgICAgICAgaWYgKGlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oQ0dGLkN1ckdELmdldERlY2woKSkpCi0gICAgICAgICAgYXNzZXJ0KENHRi5DdXJHRC5nZXREdG9yVHlwZSgpID09IER0b3JfQ29tcGxldGUpOwotICAgICAgICBpZiAoaXNhPENYWENvbnN0cnVjdG9yRGVjbD4oQ0dGLkN1ckdELmdldERlY2woKSkpCi0gICAgICAgICAgYXNzZXJ0KENHRi5DdXJHRC5nZXRDdG9yVHlwZSgpID09IEN0b3JfQ29tcGxldGUpOwotICAgICAgICAvLyBXZSdyZSBjYWxsaW5nIHRoZSBtYWluIGJhc2UgZHRvciBmcm9tIGEgY29tcGxldGUgc3RydWN0b3IsCi0gICAgICAgIC8vIHNvIHdlIGtub3cgdGhlICJ0aGlzIiBvZmZzZXQgc3RhdGljYWxseS4KLSAgICAgICAgQXZvaWRWaXJ0dWFsT2Zmc2V0ID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIExldCdzIHNlZSBpZiB3ZSB0cnkgdG8gY2FsbCBhIGRlc3RydWN0b3Igb2YgYSBub24tdmlydHVhbCBiYXNlLgotICAgICAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IEN1clJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgIEUgPSBDdXJSRC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICAgICAgaWYgKEktPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCkgIT0gTUQtPmdldFBhcmVudCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgLy8gSWYgd2UgY2FsbCBhIGJhc2UgZGVzdHJ1Y3RvciBmb3IgYSBub24tdmlydHVhbCBiYXNlLCB3ZSBzdGF0aWNhbGx5Ci0gICAgICAgICAgLy8ga25vdyB3aGVyZSBpdCBleHBlY3RzIHRoZSB2ZnB0ciBhbmQgInRoaXMiIHRvIGJlLgotICAgICAgICAgIC8vIFRoZSB0b3RhbCBvZmZzZXQgc2hvdWxkIHJlZmxlY3QgdGhlIGFkanVzdG1lbnQgZG9uZSBieQotICAgICAgICAgIC8vIGFkanVzdFRoaXNQYXJhbWV0ZXJJblZpcnR1YWxGdW5jdGlvblByb2xvZ3VlKCkuCi0gICAgICAgICAgQXZvaWRWaXJ0dWFsT2Zmc2V0ID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChBdm9pZFZpcnR1YWxPZmZzZXQpIHsKLSAgICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0ID0KLSAgICAgICAgICBDR0YuZ2V0Q29udGV4dCgpLmdldEFTVFJlY29yZExheW91dChNRC0+Z2V0UGFyZW50KCkpOwotICAgICAgU3RhdGljT2Zmc2V0ICs9IExheW91dC5nZXRWQmFzZUNsYXNzT2Zmc2V0KE1MLlZCYXNlKTsKLSAgICB9IGVsc2UgewotICAgICAgVGhpcyA9IENHRi5CdWlsZGVyLkNyZWF0ZUJpdENhc3QoVGhpcywgY2hhclB0clR5KTsKLSAgICAgIGxsdm06OlZhbHVlICpWQmFzZU9mZnNldCA9Ci0gICAgICAgICAgR2V0VmlydHVhbEJhc2VDbGFzc09mZnNldChDR0YsIFRoaXMsIE1ELT5nZXRQYXJlbnQoKSwgTUwuVkJhc2UpOwotICAgICAgVGhpcyA9IENHRi5CdWlsZGVyLkNyZWF0ZUluQm91bmRzR0VQKFRoaXMsIFZCYXNlT2Zmc2V0KTsKLSAgICB9CisgICAgVGhpcyA9IENHRi5CdWlsZGVyLkNyZWF0ZUJpdENhc3QoVGhpcywgY2hhclB0clR5KTsKKyAgICBsbHZtOjpWYWx1ZSAqVkJhc2VPZmZzZXQgPQorICAgICAgICBHZXRWaXJ0dWFsQmFzZUNsYXNzT2Zmc2V0KENHRiwgVGhpcywgTUQtPmdldFBhcmVudCgpLCBNTC5WQmFzZSk7CisgICAgVGhpcyA9IENHRi5CdWlsZGVyLkNyZWF0ZUluQm91bmRzR0VQKFRoaXMsIFZCYXNlT2Zmc2V0KTsKICAgfQogICBpZiAoIVN0YXRpY09mZnNldC5pc1plcm8oKSkgewogICAgIGFzc2VydChTdGF0aWNPZmZzZXQuaXNQb3NpdGl2ZSgpKTsKQEAgLTY3OCwyMCArNjk2LDI1IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBNaWNyb3NvZnRDWFhBQkk6OkJ1aWxkSW5zdGFuY2VGdW5jdGlvblBhcmFtcyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgJlJlc1R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFyZ0xpc3QgJlBhcmFtcykgewotICBCdWlsZFRoaXNQYXJhbShDR0YsIFBhcmFtcyk7Ci0KK3ZvaWQgTWljcm9zb2Z0Q1hYQUJJOjphZGRJbXBsaWNpdFN0cnVjdG9yUGFyYW1zKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgJlJlc1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BcmdMaXN0ICZQYXJhbXMpIHsKICAgQVNUQ29udGV4dCAmQ29udGV4dCA9IGdldENvbnRleHQoKTsKICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPSBjYXN0PENYWE1ldGhvZERlY2w+KENHRi5DdXJHRC5nZXREZWNsKCkpOworICBhc3NlcnQoaXNhPENYWENvbnN0cnVjdG9yRGVjbD4oTUQpIHx8IGlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oTUQpKTsKICAgaWYgKGlzYTxDWFhDb25zdHJ1Y3RvckRlY2w+KE1EKSAmJiBNRC0+Z2V0UGFyZW50KCktPmdldE51bVZCYXNlcygpKSB7CiAgICAgSW1wbGljaXRQYXJhbURlY2wgKklzTW9zdERlcml2ZWQKICAgICAgID0gSW1wbGljaXRQYXJhbURlY2w6OkNyZWF0ZShDb250ZXh0LCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHRi5DdXJHRC5nZXREZWNsKCktPmdldExvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvbnRleHQuSWRlbnRzLmdldCgiaXNfbW9zdF9kZXJpdmVkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5JbnRUeSk7Ci0gICAgUGFyYW1zLnB1c2hfYmFjayhJc01vc3REZXJpdmVkKTsKKyAgICAvLyBUaGUgJ21vc3RfZGVyaXZlZCcgcGFyYW1ldGVyIGdvZXMgc2Vjb25kIGlmIHRoZSBjdG9yIGlzIHZhcmlhZGljIGFuZCBsYXN0CisgICAgLy8gaWYgaXQncyBub3QuICBEdG9ycyBjYW4ndCBiZSB2YXJpYWRpYy4KKyAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0gTUQtPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOworICAgIGlmIChGUFQtPmlzVmFyaWFkaWMoKSkKKyAgICAgIFBhcmFtcy5pbnNlcnQoUGFyYW1zLmJlZ2luKCkgKyAxLCBJc01vc3REZXJpdmVkKTsKKyAgICBlbHNlCisgICAgICBQYXJhbXMucHVzaF9iYWNrKElzTW9zdERlcml2ZWQpOwogICAgIGdldFN0cnVjdG9ySW1wbGljaXRQYXJhbURlY2woQ0dGKSA9IElzTW9zdERlcml2ZWQ7CiAgIH0gZWxzZSBpZiAoSXNEZWxldGluZ0R0b3IoQ0dGLkN1ckdEKSkgewogICAgIEltcGxpY2l0UGFyYW1EZWNsICpTaG91bGREZWxldGUKQEAgLTcwNiwzNiArNzI5LDEyIEBACiAKIGxsdm06OlZhbHVlICpNaWNyb3NvZnRDWFhBQkk6OmFkanVzdFRoaXNQYXJhbWV0ZXJJblZpcnR1YWxGdW5jdGlvblByb2xvZ3VlKAogICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBHbG9iYWxEZWNsIEdELCBsbHZtOjpWYWx1ZSAqVGhpcykgewotICBHRCA9IEdELmdldENhbm9uaWNhbERlY2woKTsKLSAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPSBjYXN0PENYWE1ldGhvZERlY2w+KEdELmdldERlY2woKSk7Ci0KLSAgR2xvYmFsRGVjbCBMb29rdXBHRCA9IEdEOwotICBpZiAoY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkREID0gZHluX2Nhc3Q8Q1hYRGVzdHJ1Y3RvckRlY2w+KE1EKSkgewotICAgIC8vIENvbXBsZXRlIGRlc3RydWN0b3JzIHRha2UgYSBwb2ludGVyIHRvIHRoZSBjb21wbGV0ZSBvYmplY3QgYXMgYQotICAgIC8vIHBhcmFtZXRlciwgdGh1cyBkb24ndCBuZWVkIHRoaXMgYWRqdXN0bWVudC4KLSAgICBpZiAoR0QuZ2V0RHRvclR5cGUoKSA9PSBEdG9yX0NvbXBsZXRlKQotICAgICAgcmV0dXJuIFRoaXM7Ci0KLSAgICAvLyBUaGVyZSdzIG5vIER0b3JfQmFzZSBpbiB2ZnRhYmxlIGJ1dCBpdCBzaGFyZXMgdGhlIHRoaXMgYWRqdXN0bWVudCB3aXRoCi0gICAgLy8gdGhlIGRlbGV0aW5nIG9uZSwgc28gbG9vayBpdCB1cCBpbnN0ZWFkLgotICAgIExvb2t1cEdEID0gR2xvYmFsRGVjbChERCwgRHRvcl9EZWxldGluZyk7Ci0gIH0KLQogICAvLyBJbiB0aGlzIEFCSSwgZXZlcnkgdmlydHVhbCBmdW5jdGlvbiB0YWtlcyBhIHBvaW50ZXIgdG8gb25lIG9mIHRoZQogICAvLyBzdWJvYmplY3RzIHRoYXQgZmlyc3QgZGVmaW5lcyBpdCBhcyB0aGUgJ3RoaXMnIHBhcmFtZXRlciwgcmF0aGVyIHRoYW4gYQotICAvLyBwb2ludGVyIHRvIHRoZXIgZmluYWwgb3ZlcnJpZGVyIHN1Ym9iamVjdC4gVGh1cywgd2UgbmVlZCB0byBhZGp1c3QgaXQgYmFjaworICAvLyBwb2ludGVyIHRvIHRoZSBmaW5hbCBvdmVycmlkZXIgc3Vib2JqZWN0LiBUaHVzLCB3ZSBuZWVkIHRvIGFkanVzdCBpdCBiYWNrCiAgIC8vIHRvIHRoZSBmaW5hbCBvdmVycmlkZXIgc3Vib2JqZWN0IGJlZm9yZSB1c2UuCiAgIC8vIFNlZSBjb21tZW50cyBpbiB0aGUgTWljcm9zb2Z0VkZUYWJsZUNvbnRleHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBkZXRhaWxzLgotCi0gIE1pY3Jvc29mdFZUYWJsZUNvbnRleHQ6Ok1ldGhvZFZGVGFibGVMb2NhdGlvbiBNTCA9Ci0gICAgICBDR00uZ2V0TWljcm9zb2Z0VlRhYmxlQ29udGV4dCgpLmdldE1ldGhvZFZGVGFibGVMb2NhdGlvbihMb29rdXBHRCk7Ci0gIENoYXJVbml0cyBBZGp1c3RtZW50ID0gTUwuVkZQdHJPZmZzZXQ7Ci0gIGlmIChNTC5WQmFzZSkgewotICAgIGNvbnN0IEFTVFJlY29yZExheW91dCAmRGVyaXZlZExheW91dCA9Ci0gICAgICAgIENHRi5nZXRDb250ZXh0KCkuZ2V0QVNUUmVjb3JkTGF5b3V0KE1ELT5nZXRQYXJlbnQoKSk7Ci0gICAgQWRqdXN0bWVudCArPSBEZXJpdmVkTGF5b3V0LmdldFZCYXNlQ2xhc3NPZmZzZXQoTUwuVkJhc2UpOwotICB9Ci0KKyAgQ2hhclVuaXRzIEFkanVzdG1lbnQgPSBnZXRWaXJ0dWFsRnVuY3Rpb25Qcm9sb2d1ZVRoaXNBZGp1c3RtZW50KEdEKTsKICAgaWYgKEFkanVzdG1lbnQuaXNaZXJvKCkpCiAgICAgcmV0dXJuIFRoaXM7CiAKQEAgLTc4NCw0MyArNzgzLDYzIEBACiAgIH0KIH0KIAotdm9pZCBNaWNyb3NvZnRDWFhBQkk6OkVtaXRDb25zdHJ1Y3RvckNhbGwoQ29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhDdG9yVHlwZSBUeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yVmlydHVhbEJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlbGVnYXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxFeHByOjpjb25zdF9hcmdfaXRlcmF0b3IgQXJnQmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEV4cHI6OmNvbnN0X2FyZ19pdGVyYXRvciBBcmdFbmQpIHsKK3Vuc2lnbmVkIE1pY3Jvc29mdENYWEFCSTo6YWRkSW1wbGljaXRDb25zdHJ1Y3RvckFyZ3MoCisgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqRCwgQ1hYQ3RvclR5cGUgVHlwZSwKKyAgICBib29sIEZvclZpcnR1YWxCYXNlLCBib29sIERlbGVnYXRpbmcsIENhbGxBcmdMaXN0ICZBcmdzKSB7CiAgIGFzc2VydChUeXBlID09IEN0b3JfQ29tcGxldGUgfHwgVHlwZSA9PSBDdG9yX0Jhc2UpOwotICBsbHZtOjpWYWx1ZSAqQ2FsbGVlID0gQ0dNLkdldEFkZHJPZkNYWENvbnN0cnVjdG9yKEQsIEN0b3JfQ29tcGxldGUpOwogCi0gIGxsdm06OlZhbHVlICpJbXBsaWNpdFBhcmFtID0gMDsKLSAgUXVhbFR5cGUgSW1wbGljaXRQYXJhbVR5OwotICBpZiAoRC0+Z2V0UGFyZW50KCktPmdldE51bVZCYXNlcygpKSB7Ci0gICAgSW1wbGljaXRQYXJhbSA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dNLkludDMyVHksIFR5cGUgPT0gQ3Rvcl9Db21wbGV0ZSk7Ci0gICAgSW1wbGljaXRQYXJhbVR5ID0gZ2V0Q29udGV4dCgpLkludFR5OworICAvLyBDaGVjayBpZiB3ZSBuZWVkIGEgJ21vc3RfZGVyaXZlZCcgcGFyYW1ldGVyLgorICBpZiAoIUQtPmdldFBhcmVudCgpLT5nZXROdW1WQmFzZXMoKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBBZGQgdGhlICdtb3N0X2Rlcml2ZWQnIGFyZ3VtZW50IHNlY29uZCBpZiB3ZSBhcmUgdmFyaWFkaWMgb3IgbGFzdCBpZiBub3QuCisgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpGUFQgPSBELT5nZXRUeXBlKCktPmNhc3RBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKKyAgbGx2bTo6VmFsdWUgKk1vc3REZXJpdmVkQXJnID0KKyAgICAgIGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dNLkludDMyVHksIFR5cGUgPT0gQ3Rvcl9Db21wbGV0ZSk7CisgIFJWYWx1ZSBSViA9IFJWYWx1ZTo6Z2V0KE1vc3REZXJpdmVkQXJnKTsKKyAgaWYgKE1vc3REZXJpdmVkQXJnKSB7CisgICAgaWYgKEZQVC0+aXNWYXJpYWRpYygpKQorICAgICAgQXJncy5pbnNlcnQoQXJncy5iZWdpbigpICsgMSwKKyAgICAgICAgICAgICAgICAgIENhbGxBcmcoUlYsIGdldENvbnRleHQoKS5JbnRUeSwgLypuZWVkc2NvcHk9Ki9mYWxzZSkpOworICAgIGVsc2UKKyAgICAgIEFyZ3MuYWRkKFJWLCBnZXRDb250ZXh0KCkuSW50VHkpOworICB9CisKKyAgcmV0dXJuIDE7ICAvLyBBZGRlZCBvbmUgYXJnLgorfQorCit2b2lkIE1pY3Jvc29mdENYWEFCSTo6RW1pdERlc3RydWN0b3JDYWxsKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhEZXN0cnVjdG9yRGVjbCAqREQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWER0b3JUeXBlIFR5cGUsIGJvb2wgRm9yVmlydHVhbEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVsZWdhdGluZywgbGx2bTo6VmFsdWUgKlRoaXMpIHsKKyAgbGx2bTo6VmFsdWUgKkNhbGxlZSA9IENHTS5HZXRBZGRyT2ZDWFhEZXN0cnVjdG9yKERELCBUeXBlKTsKKworICBpZiAoREQtPmlzVmlydHVhbCgpKSB7CisgICAgYXNzZXJ0KFR5cGUgIT0gQ1hYRHRvclR5cGU6OkR0b3JfRGVsZXRpbmcgJiYKKyAgICAgICAgICAgIlRoZSBkZWxldGluZyBkZXN0cnVjdG9yIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB2aWEgYSB2aXJ0dWFsIGNhbGwiKTsKKyAgICBUaGlzID0gYWRqdXN0VGhpc0FyZ3VtZW50Rm9yVmlydHVhbEZ1bmN0aW9uQ2FsbChDR0YsIEdsb2JhbERlY2woREQsIFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMsIGZhbHNlKTsKICAgfQogCiAgIC8vIEZJWE1FOiBQcm92aWRlIGEgc291cmNlIGxvY2F0aW9uIGhlcmUuCi0gIENHRi5FbWl0Q1hYTWVtYmVyQ2FsbChELCBTb3VyY2VMb2NhdGlvbigpLCBDYWxsZWUsIFJldHVyblZhbHVlU2xvdCgpLCBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgSW1wbGljaXRQYXJhbSwgSW1wbGljaXRQYXJhbVR5LCBBcmdCZWcsIEFyZ0VuZCk7CisgIENHRi5FbWl0Q1hYTWVtYmVyQ2FsbChERCwgU291cmNlTG9jYXRpb24oKSwgQ2FsbGVlLCBSZXR1cm5WYWx1ZVNsb3QoKSwgVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qSW1wbGljaXRQYXJhbT0qLzAsIC8qSW1wbGljaXRQYXJhbVR5PSovUXVhbFR5cGUoKSwgMCwgMCk7CiB9CiAKIHZvaWQgTWljcm9zb2Z0Q1hYQUJJOjplbWl0VlRhYmxlRGVmaW5pdGlvbnMoQ29kZUdlblZUYWJsZXMgJkNHVlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7CiAgIE1pY3Jvc29mdFZUYWJsZUNvbnRleHQgJlZGVENvbnRleHQgPSBDR00uZ2V0TWljcm9zb2Z0VlRhYmxlQ29udGV4dCgpOwotICBNaWNyb3NvZnRWVGFibGVDb250ZXh0OjpWRlB0ckxpc3RUeSBWRlB0cnMgPSBWRlRDb250ZXh0LmdldFZGUHRyT2Zmc2V0cyhSRCk7CisgIFZQdHJJbmZvVmVjdG9yIFZGUHRycyA9IFZGVENvbnRleHQuZ2V0VkZQdHJPZmZzZXRzKFJEKTsKICAgbGx2bTo6R2xvYmFsVmFyaWFibGU6OkxpbmthZ2VUeXBlcyBMaW5rYWdlID0gQ0dNLmdldFZUYWJsZUxpbmthZ2UoUkQpOwogCi0gIGZvciAoTWljcm9zb2Z0VlRhYmxlQ29udGV4dDo6VkZQdHJMaXN0VHk6Oml0ZXJhdG9yIEkgPSBWRlB0cnMuYmVnaW4oKSwKLSAgICAgICBFID0gVkZQdHJzLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpWVGFibGUgPSBnZXRBZGRyT2ZWVGFibGUoUkQsIEktPlZGUHRyRnVsbE9mZnNldCk7CisgIGZvciAoVlB0ckluZm9WZWN0b3I6Oml0ZXJhdG9yIEkgPSBWRlB0cnMuYmVnaW4oKSwgRSA9IFZGUHRycy5lbmQoKTsgSSAhPSBFOworICAgICAgICsrSSkgeworICAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpWVGFibGUgPSBnZXRBZGRyT2ZWVGFibGUoUkQsICgqSSktPkZ1bGxPZmZzZXRJbk1EQyk7CiAgICAgaWYgKFZUYWJsZS0+aGFzSW5pdGlhbGl6ZXIoKSkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgY29uc3QgVlRhYmxlTGF5b3V0ICZWVExheW91dCA9Ci0gICAgICAgIFZGVENvbnRleHQuZ2V0VkZUYWJsZUxheW91dChSRCwgSS0+VkZQdHJGdWxsT2Zmc2V0KTsKKyAgICAgICAgVkZUQ29udGV4dC5nZXRWRlRhYmxlTGF5b3V0KFJELCAoKkkpLT5GdWxsT2Zmc2V0SW5NREMpOwogICAgIGxsdm06OkNvbnN0YW50ICpJbml0ID0gQ0dWVC5DcmVhdGVWVGFibGVJbml0aWFsaXplcigKICAgICAgICAgUkQsIFZUTGF5b3V0LnZ0YWJsZV9jb21wb25lbnRfYmVnaW4oKSwKICAgICAgICAgVlRMYXlvdXQuZ2V0TnVtVlRhYmxlQ29tcG9uZW50cygpLCBWVExheW91dC52dGFibGVfdGh1bmtfYmVnaW4oKSwKQEAgLTgyOCw3ICs4NDcsNyBAQAogICAgIFZUYWJsZS0+c2V0SW5pdGlhbGl6ZXIoSW5pdCk7CiAKICAgICBWVGFibGUtPnNldExpbmthZ2UoTGlua2FnZSk7Ci0gICAgQ0dNLnNldFR5cGVWaXNpYmlsaXR5KFZUYWJsZSwgUkQsIENvZGVHZW5Nb2R1bGU6OlRWS19Gb3JWVGFibGUpOworICAgIENHTS5zZXRHbG9iYWxWaXNpYmlsaXR5KFZUYWJsZSwgUkQpOwogICB9CiB9CiAKQEAgLTg0NywxMCArODY2LDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkIG1hbmdsZVZGVGFibGVOYW1lKE1pY3Jvc29mdE1hbmdsZUNvbnRleHQgJk1hbmdsZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCwgY29uc3QgVkZQdHJJbmZvICZWRlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJELCBjb25zdCBWUHRySW5mbyAqVkZQdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFN0cmluZzwyNTY+ICZOYW1lKSB7CiAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gT3V0KE5hbWUpOwotICBNYW5nbGVDb250ZXh0Lm1hbmdsZUNYWFZGVGFibGUoUkQsIFZGUHRyLlBhdGhUb01hbmdsZSwgT3V0KTsKKyAgTWFuZ2xlQ29udGV4dC5tYW5nbGVDWFhWRlRhYmxlKFJELCBWRlB0ci0+TWFuZ2xlZFBhdGgsIE91dCk7CiB9CiAKIGxsdm06OkNvbnN0YW50ICpNaWNyb3NvZnRDWFhBQkk6OmdldFZUYWJsZUFkZHJlc3NQb2ludEZvckNvbnN0RXhwcigKQEAgLTg2OCw3ICs4ODcsNyBAQAogICBWRlRhYmxlSWRUeSBJRChSRCwgVlB0ck9mZnNldCk7CiAgIFZGVGFibGVzTWFwVHk6Oml0ZXJhdG9yIEk7CiAgIGJvb2wgSW5zZXJ0ZWQ7Ci0gIGxsdm06OnRpZShJLCBJbnNlcnRlZCkgPSBWRlRhYmxlc01hcC5pbnNlcnQoCisgIHN0ZDo6dGllKEksIEluc2VydGVkKSA9IFZGVGFibGVzTWFwLmluc2VydCgKICAgICAgIHN0ZDo6bWFrZV9wYWlyKElELCBzdGF0aWNfY2FzdDxsbHZtOjpHbG9iYWxWYXJpYWJsZSAqPigwKSkpOwogICBpZiAoIUluc2VydGVkKQogICAgIHJldHVybiBJLT5zZWNvbmQ7CkBAIC04NzYsOCArODk1LDcgQEAKICAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKiZWVGFibGUgPSBJLT5zZWNvbmQ7CiAKICAgTWljcm9zb2Z0VlRhYmxlQ29udGV4dCAmVlRDb250ZXh0ID0gQ0dNLmdldE1pY3Jvc29mdFZUYWJsZUNvbnRleHQoKTsKLSAgY29uc3QgTWljcm9zb2Z0VlRhYmxlQ29udGV4dDo6VkZQdHJMaXN0VHkgJlZGUHRycyA9Ci0gICAgICBWVENvbnRleHQuZ2V0VkZQdHJPZmZzZXRzKFJEKTsKKyAgY29uc3QgVlB0ckluZm9WZWN0b3IgJlZGUHRycyA9IFZUQ29udGV4dC5nZXRWRlB0ck9mZnNldHMoUkQpOwogCiAgIGlmIChEZWZlcnJlZFZGVGFibGVzLmluc2VydChSRCkpIHsKICAgICAvLyBXZSBoYXZlbid0IHByb2Nlc3NlZCB0aGlzIHJlY29yZCB0eXBlIGJlZm9yZS4KQEAgLTg5OCwxMiArOTE2LDEyIEBACiAgIH0KIAogICBmb3IgKHNpemVfdCBKID0gMCwgRiA9IFZGUHRycy5zaXplKCk7IEogIT0gRjsgKytKKSB7Ci0gICAgaWYgKFZGUHRyc1tKXS5WRlB0ckZ1bGxPZmZzZXQgIT0gVlB0ck9mZnNldCkKKyAgICBpZiAoVkZQdHJzW0pdLT5GdWxsT2Zmc2V0SW5NREMgIT0gVlB0ck9mZnNldCkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgbGx2bTo6QXJyYXlUeXBlICpBcnJheVR5cGUgPSBsbHZtOjpBcnJheVR5cGU6OmdldCgKICAgICAgICAgQ0dNLkludDhQdHJUeSwKLSAgICAgICAgVlRDb250ZXh0LmdldFZGVGFibGVMYXlvdXQoUkQsIFZGUHRyc1tKXS5WRlB0ckZ1bGxPZmZzZXQpCisgICAgICAgIFZUQ29udGV4dC5nZXRWRlRhYmxlTGF5b3V0KFJELCBWRlB0cnNbSl0tPkZ1bGxPZmZzZXRJbk1EQykKICAgICAgICAgICAgIC5nZXROdW1WVGFibGVDb21wb25lbnRzKCkpOwogCiAgICAgU21hbGxTdHJpbmc8MjU2PiBOYW1lOwpAQCAtOTI1LDcgKzk0Myw4IEBACiAgIENHQnVpbGRlclR5ICZCdWlsZGVyID0gQ0dGLkJ1aWxkZXI7CiAKICAgVHkgPSBUeS0+Z2V0UG9pbnRlclRvKCktPmdldFBvaW50ZXJUbygpOwotICBsbHZtOjpWYWx1ZSAqVlB0ciA9IGFkanVzdFRoaXNBcmd1bWVudEZvclZpcnR1YWxDYWxsKENHRiwgR0QsIFRoaXMpOworICBsbHZtOjpWYWx1ZSAqVlB0ciA9CisgICAgICBhZGp1c3RUaGlzQXJndW1lbnRGb3JWaXJ0dWFsRnVuY3Rpb25DYWxsKENHRiwgR0QsIFRoaXMsIHRydWUpOwogICBsbHZtOjpWYWx1ZSAqVlRhYmxlID0gQ0dGLkdldFZUYWJsZVB0cihWUHRyLCBUeSk7CiAKICAgTWljcm9zb2Z0VlRhYmxlQ29udGV4dDo6TWV0aG9kVkZUYWJsZUxvY2F0aW9uIE1MID0KQEAgLTk1NSwzMCArOTc0LDQ3IEBACiAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KGxsdm06OkludGVnZXJUeXBlOjpnZXRJbnQzMlR5KENHRi5nZXRMTFZNQ29udGV4dCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHRvclR5cGUgPT0gRHRvcl9EZWxldGluZyk7CiAKLSAgVGhpcyA9IGFkanVzdFRoaXNBcmd1bWVudEZvclZpcnR1YWxDYWxsKENHRiwgR0QsIFRoaXMpOworICBUaGlzID0gYWRqdXN0VGhpc0FyZ3VtZW50Rm9yVmlydHVhbEZ1bmN0aW9uQ2FsbChDR0YsIEdELCBUaGlzLCB0cnVlKTsKICAgQ0dGLkVtaXRDWFhNZW1iZXJDYWxsKER0b3IsIENhbGxMb2MsIENhbGxlZSwgUmV0dXJuVmFsdWVTbG90KCksIFRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBJbXBsaWNpdFBhcmFtLCBDb250ZXh0LkludFR5LCAwLCAwKTsKIH0KIAotY29uc3QgVkJUYWJsZVZlY3RvciAmCi1NaWNyb3NvZnRDWFhBQkk6OkVudW1lcmF0ZVZCVGFibGVzKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7Citjb25zdCBWQlRhYmxlR2xvYmFscyAmCitNaWNyb3NvZnRDWFhBQkk6OmVudW1lcmF0ZVZCVGFibGVzKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7CiAgIC8vIEF0IHRoaXMgbGF5ZXIsIHdlIGNhbiBrZXkgdGhlIGNhY2hlIG9mZiBvZiBhIHNpbmdsZSBjbGFzcywgd2hpY2ggaXMgbXVjaAotICAvLyBlYXNpZXIgdGhhbiBjYWNoaW5nIGF0IHRoZSBHbG9iYWxWYXJpYWJsZSBsYXllci4KLSAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQ1hYUmVjb3JkRGVjbCosIFZCVGFibGVWZWN0b3I+OjppdGVyYXRvciBJOwotICBib29sIGFkZGVkOwotICBsbHZtOjp0aWUoSSwgYWRkZWQpID0gVkJUYWJsZXNNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFJELCBWQlRhYmxlVmVjdG9yKCkpKTsKLSAgVkJUYWJsZVZlY3RvciAmVkJUYWJsZXMgPSBJLT5zZWNvbmQ7Ci0gIGlmICghYWRkZWQpCi0gICAgcmV0dXJuIFZCVGFibGVzOworICAvLyBlYXNpZXIgdGhhbiBjYWNoaW5nIGVhY2ggdmJ0YWJsZSBpbmRpdmlkdWFsbHkuCisgIGxsdm06OkRlbnNlTWFwPGNvbnN0IENYWFJlY29yZERlY2wqLCBWQlRhYmxlR2xvYmFscz46Oml0ZXJhdG9yIEVudHJ5OworICBib29sIEFkZGVkOworICBzdGQ6OnRpZShFbnRyeSwgQWRkZWQpID0KKyAgICAgIFZCVGFibGVzTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihSRCwgVkJUYWJsZUdsb2JhbHMoKSkpOworICBWQlRhYmxlR2xvYmFscyAmVkJHbG9iYWxzID0gRW50cnktPnNlY29uZDsKKyAgaWYgKCFBZGRlZCkKKyAgICByZXR1cm4gVkJHbG9iYWxzOwogCi0gIFZCVGFibGVCdWlsZGVyKENHTSwgUkQpLmVudW1lcmF0ZVZCVGFibGVzKFZCVGFibGVzKTsKKyAgTWljcm9zb2Z0VlRhYmxlQ29udGV4dCAmQ29udGV4dCA9IENHTS5nZXRNaWNyb3NvZnRWVGFibGVDb250ZXh0KCk7CisgIFZCR2xvYmFscy5WQlRhYmxlcyA9ICZDb250ZXh0LmVudW1lcmF0ZVZCVGFibGVzKFJEKTsKIAotICByZXR1cm4gVkJUYWJsZXM7CisgIC8vIENhY2hlIHRoZSBnbG9iYWxzIGZvciBhbGwgdmJ0YWJsZXMgc28gd2UgZG9uJ3QgaGF2ZSB0byByZWNvbXB1dGUgdGhlCisgIC8vIG1hbmdsZWQgbmFtZXMuCisgIGxsdm06Okdsb2JhbFZhcmlhYmxlOjpMaW5rYWdlVHlwZXMgTGlua2FnZSA9IENHTS5nZXRWVGFibGVMaW5rYWdlKFJEKTsKKyAgZm9yIChWUHRySW5mb1ZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgSSA9IFZCR2xvYmFscy5WQlRhYmxlcy0+YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IFZCR2xvYmFscy5WQlRhYmxlcy0+ZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBWQkdsb2JhbHMuR2xvYmFscy5wdXNoX2JhY2soZ2V0QWRkck9mVkJUYWJsZSgqKkksIFJELCBMaW5rYWdlKSk7CisgIH0KKworICByZXR1cm4gVkJHbG9iYWxzOwogfQogCi1sbHZtOjpGdW5jdGlvbiAqCi1NaWNyb3NvZnRDWFhBQkk6OkVtaXRWaXJ0dWFsTWVtUHRyVGh1bmsoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFRodW5rTmFtZSkgeworbGx2bTo6RnVuY3Rpb24gKk1pY3Jvc29mdENYWEFCSTo6RW1pdFZpcnR1YWxNZW1QdHJUaHVuaygKKyAgICBjb25zdCBDWFhNZXRob2REZWNsICpNRCwKKyAgICBjb25zdCBNaWNyb3NvZnRWVGFibGVDb250ZXh0OjpNZXRob2RWRlRhYmxlTG9jYXRpb24gJk1MKSB7CisgIC8vIENhbGN1bGF0ZSB0aGUgbWFuZ2xlZCBuYW1lLgorICBTbWFsbFN0cmluZzwyNTY+IFRodW5rTmFtZTsKKyAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPdXQoVGh1bmtOYW1lKTsKKyAgZ2V0TWFuZ2xlQ29udGV4dCgpLm1hbmdsZVZpcnR1YWxNZW1QdHJUaHVuayhNRCwgT3V0KTsKKyAgT3V0LmZsdXNoKCk7CisKICAgLy8gSWYgdGhlIHRodW5rIGhhcyBiZWVuIGdlbmVyYXRlZCBwcmV2aW91c2x5LCBqdXN0IHJldHVybiBpdC4KICAgaWYgKGxsdm06Okdsb2JhbFZhbHVlICpHViA9IENHTS5nZXRNb2R1bGUoKS5nZXROYW1lZFZhbHVlKFRodW5rTmFtZSkpCiAgICAgcmV0dXJuIGNhc3Q8bGx2bTo6RnVuY3Rpb24+KEdWKTsKQEAgLTEwMDIsOSArMTAzOCwxNCBAQAogICBDb2RlR2VuRnVuY3Rpb24gQ0dGKENHTSk7CiAgIENHRi5TdGFydFRodW5rKFRodW5rRm4sIE1ELCBGbkluZm8pOwogCi0gIC8vIEdldCB0byB0aGUgQ2FsbGVlLgorICAvLyBMb2FkIHRoZSB2ZnB0ciBhbmQgdGhlbiBjYWxsZWUgZnJvbSB0aGUgdmZ0YWJsZS4gIFRoZSBjYWxsZWUgc2hvdWxkIGhhdmUKKyAgLy8gYWRqdXN0ZWQgJ3RoaXMnIHNvIHRoYXQgdGhlIHZmcHRyIGlzIGF0IG9mZnNldCB6ZXJvLgogICBsbHZtOjpWYWx1ZSAqVGhpcyA9IENHRi5Mb2FkQ1hYVGhpcygpOwotICBsbHZtOjpWYWx1ZSAqQ2FsbGVlID0gZ2V0VmlydHVhbEZ1bmN0aW9uUG9pbnRlcihDR0YsIE1ELCBUaGlzLCBUaHVua1R5KTsKKyAgbGx2bTo6VmFsdWUgKlZUYWJsZSA9CisgICAgICBDR0YuR2V0VlRhYmxlUHRyKFRoaXMsIFRodW5rVHktPmdldFBvaW50ZXJUbygpLT5nZXRQb2ludGVyVG8oKSk7CisgIGxsdm06OlZhbHVlICpWRnVuY1B0ciA9CisgICAgICBDR0YuQnVpbGRlci5DcmVhdGVDb25zdEluQm91bmRzR0VQMV82NChWVGFibGUsIE1MLkluZGV4LCAidmZuIik7CisgIGxsdm06OlZhbHVlICpDYWxsZWUgPSBDR0YuQnVpbGRlci5DcmVhdGVMb2FkKFZGdW5jUHRyKTsKIAogICAvLyBNYWtlIHRoZSBjYWxsIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KICAgQ0dGLkVtaXRDYWxsQW5kUmV0dXJuRm9yVGh1bmsoTUQsIENhbGxlZSwgMCk7CkBAIC0xMDEzLDE1ICsxMDU0LDg1IEBACiB9CiAKIHZvaWQgTWljcm9zb2Z0Q1hYQUJJOjplbWl0VmlydHVhbEluaGVyaXRhbmNlVGFibGVzKGNvbnN0IENYWFJlY29yZERlY2wgKlJEKSB7Ci0gIGNvbnN0IFZCVGFibGVWZWN0b3IgJlZCVGFibGVzID0gRW51bWVyYXRlVkJUYWJsZXMoUkQpOwotICBsbHZtOjpHbG9iYWxWYXJpYWJsZTo6TGlua2FnZVR5cGVzIExpbmthZ2UgPSBDR00uZ2V0VlRhYmxlTGlua2FnZShSRCk7Ci0KLSAgZm9yIChWQlRhYmxlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBJID0gVkJUYWJsZXMuYmVnaW4oKSwgRSA9IFZCVGFibGVzLmVuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgSS0+RW1pdFZCVGFibGVEZWZpbml0aW9uKENHTSwgUkQsIExpbmthZ2UpOworICBjb25zdCBWQlRhYmxlR2xvYmFscyAmVkJHbG9iYWxzID0gZW51bWVyYXRlVkJUYWJsZXMoUkQpOworICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gVkJHbG9iYWxzLlZCVGFibGVzLT5zaXplKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgVlB0ckluZm8gKlZCVCA9ICgqVkJHbG9iYWxzLlZCVGFibGVzKVtJXTsKKyAgICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1YgPSBWQkdsb2JhbHMuR2xvYmFsc1tJXTsKKyAgICBlbWl0VkJUYWJsZURlZmluaXRpb24oKlZCVCwgUkQsIEdWKTsKICAgfQogfQogCitsbHZtOjpHbG9iYWxWYXJpYWJsZSAqCitNaWNyb3NvZnRDWFhBQkk6OmdldEFkZHJPZlZCVGFibGUoY29uc3QgVlB0ckluZm8gJlZCVCwgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFyaWFibGU6OkxpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgIFNtYWxsU3RyaW5nPDI1Nj4gT3V0TmFtZTsKKyAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPdXQoT3V0TmFtZSk7CisgIE1pY3Jvc29mdE1hbmdsZUNvbnRleHQgJk1hbmdsZXIgPQorICAgICAgY2FzdDxNaWNyb3NvZnRNYW5nbGVDb250ZXh0PihDR00uZ2V0Q1hYQUJJKCkuZ2V0TWFuZ2xlQ29udGV4dCgpKTsKKyAgTWFuZ2xlci5tYW5nbGVDWFhWQlRhYmxlKFJELCBWQlQuTWFuZ2xlZFBhdGgsIE91dCk7CisgIE91dC5mbHVzaCgpOworICBTdHJpbmdSZWYgTmFtZSA9IE91dE5hbWUuc3RyKCk7CisKKyAgbGx2bTo6QXJyYXlUeXBlICpWQlRhYmxlVHlwZSA9CisgICAgICBsbHZtOjpBcnJheVR5cGU6OmdldChDR00uSW50VHksIDEgKyBWQlQuUmV1c2luZ0Jhc2UtPmdldE51bVZCYXNlcygpKTsKKworICBhc3NlcnQoIUNHTS5nZXRNb2R1bGUoKS5nZXROYW1lZEdsb2JhbChOYW1lKSAmJgorICAgICAgICAgInZidGFibGUgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHM6IG1hbmdsaW5nIGJ1Zz8iKTsKKyAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWID0KKyAgICAgIENHTS5DcmVhdGVPclJlcGxhY2VDWFhSdW50aW1lVmFyaWFibGUoTmFtZSwgVkJUYWJsZVR5cGUsIExpbmthZ2UpOworICBHVi0+c2V0VW5uYW1lZEFkZHIodHJ1ZSk7CisgIHJldHVybiBHVjsKK30KKwordm9pZCBNaWNyb3NvZnRDWFhBQkk6OmVtaXRWQlRhYmxlRGVmaW5pdGlvbihjb25zdCBWUHRySW5mbyAmVkJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKkdWKSBjb25zdCB7CisgIGNvbnN0IENYWFJlY29yZERlY2wgKlJldXNpbmdCYXNlID0gVkJULlJldXNpbmdCYXNlOworCisgIGFzc2VydChSRC0+Z2V0TnVtVkJhc2VzKCkgJiYgUmV1c2luZ0Jhc2UtPmdldE51bVZCYXNlcygpICYmCisgICAgICAgICAic2hvdWxkIG9ubHkgZW1pdCB2YnRhYmxlcyBmb3IgY2xhc3NlcyB3aXRoIHZidGFibGVzIik7CisKKyAgY29uc3QgQVNUUmVjb3JkTGF5b3V0ICZCYXNlTGF5b3V0ID0KKyAgICAgIENHTS5nZXRDb250ZXh0KCkuZ2V0QVNUUmVjb3JkTGF5b3V0KFZCVC5CYXNlV2l0aFZQdHIpOworICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkRlcml2ZWRMYXlvdXQgPQorICAgIENHTS5nZXRDb250ZXh0KCkuZ2V0QVNUUmVjb3JkTGF5b3V0KFJEKTsKKworICBTbWFsbFZlY3RvcjxsbHZtOjpDb25zdGFudCAqLCA0PiBPZmZzZXRzKDEgKyBSZXVzaW5nQmFzZS0+Z2V0TnVtVkJhc2VzKCksIDApOworCisgIC8vIFRoZSBvZmZzZXQgZnJvbSBSZXVzaW5nQmFzZSdzIHZicHRyIHRvIGl0c2VsZiBhbHdheXMgbGVhZHMuCisgIENoYXJVbml0cyBWQlB0ck9mZnNldCA9IEJhc2VMYXlvdXQuZ2V0VkJQdHJPZmZzZXQoKTsKKyAgT2Zmc2V0c1swXSA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dNLkludFR5LCAtVkJQdHJPZmZzZXQuZ2V0UXVhbnRpdHkoKSk7CisKKyAgTWljcm9zb2Z0VlRhYmxlQ29udGV4dCAmQ29udGV4dCA9IENHTS5nZXRNaWNyb3NvZnRWVGFibGVDb250ZXh0KCk7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJldXNpbmdCYXNlLT52YmFzZXMoKSkgeworICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlZCYXNlID0gSS5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOworICAgIENoYXJVbml0cyBPZmZzZXQgPSBEZXJpdmVkTGF5b3V0LmdldFZCYXNlQ2xhc3NPZmZzZXQoVkJhc2UpOworICAgIGFzc2VydCghT2Zmc2V0LmlzTmVnYXRpdmUoKSk7CisKKyAgICAvLyBNYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBzdWJvYmplY3QgdmJwdHIuCisgICAgQ2hhclVuaXRzIENvbXBsZXRlVkJQdHJPZmZzZXQgPSBWQlQuTm9uVmlydHVhbE9mZnNldCArIFZCUHRyT2Zmc2V0OworICAgIGlmIChWQlQuZ2V0VkJhc2VXaXRoVlB0cigpKQorICAgICAgQ29tcGxldGVWQlB0ck9mZnNldCArPQorICAgICAgICAgIERlcml2ZWRMYXlvdXQuZ2V0VkJhc2VDbGFzc09mZnNldChWQlQuZ2V0VkJhc2VXaXRoVlB0cigpKTsKKyAgICBPZmZzZXQgLT0gQ29tcGxldGVWQlB0ck9mZnNldDsKKworICAgIHVuc2lnbmVkIFZCSW5kZXggPSBDb250ZXh0LmdldFZCVGFibGVJbmRleChSZXVzaW5nQmFzZSwgVkJhc2UpOworICAgIGFzc2VydChPZmZzZXRzW1ZCSW5kZXhdID09IDAgJiYgIlRoZSBzYW1lIHZiaW5kZXggc2VlbiB0d2ljZT8iKTsKKyAgICBPZmZzZXRzW1ZCSW5kZXhdID0gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChDR00uSW50VHksIE9mZnNldC5nZXRRdWFudGl0eSgpKTsKKyAgfQorCisgIGFzc2VydChPZmZzZXRzLnNpemUoKSA9PQorICAgICAgICAgY2FzdDxsbHZtOjpBcnJheVR5cGU+KGNhc3Q8bGx2bTo6UG9pbnRlclR5cGU+KEdWLT5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRFbGVtZW50VHlwZSgpKS0+Z2V0TnVtRWxlbWVudHMoKSk7CisgIGxsdm06OkFycmF5VHlwZSAqVkJUYWJsZVR5cGUgPQorICAgIGxsdm06OkFycmF5VHlwZTo6Z2V0KENHTS5JbnRUeSwgT2Zmc2V0cy5zaXplKCkpOworICBsbHZtOjpDb25zdGFudCAqSW5pdCA9IGxsdm06OkNvbnN0YW50QXJyYXk6OmdldChWQlRhYmxlVHlwZSwgT2Zmc2V0cyk7CisgIEdWLT5zZXRJbml0aWFsaXplcihJbml0KTsKKworICAvLyBTZXQgdGhlIHJpZ2h0IHZpc2liaWxpdHkuCisgIENHTS5zZXRHbG9iYWxWaXNpYmlsaXR5KEdWLCBSRCk7Cit9CisKIGxsdm06OlZhbHVlICpNaWNyb3NvZnRDWFhBQkk6OnBlcmZvcm1UaGlzQWRqdXN0bWVudChDb2RlR2VuRnVuY3Rpb24gJkNHRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaGlzQWRqdXN0bWVudCAmVEEpIHsKQEAgLTExNjgsNyArMTI3OSw3IEBACiAgIGlmIChELmlzRXh0ZXJuYWxseVZpc2libGUoKSkgewogICAgIC8vIEV4dGVybmFsbHkgdmlzaWJsZSB2YXJpYWJsZXMgaGF2ZSB0byBiZSBudW1iZXJlZCBpbiBTZW1hIHRvIHByb3Blcmx5CiAgICAgLy8gaGFuZGxlIHVucmVhY2hhYmxlIFZhckRlY2xzLgotICAgIEJpdEluZGV4ID0gZ2V0Q29udGV4dCgpLmdldE1hbmdsaW5nTnVtYmVyKCZEKTsKKyAgICBCaXRJbmRleCA9IGdldENvbnRleHQoKS5nZXRTdGF0aWNMb2NhbE51bWJlcigmRCk7CiAgICAgYXNzZXJ0KEJpdEluZGV4ID4gMCk7CiAgICAgQml0SW5kZXgtLTsKICAgfSBlbHNlIHsKQEAgLTEyMjksMzggKzEzNDAsNiBAQAogICBDR0YuRW1pdEJsb2NrKEVuZEJsb2NrKTsKIH0KIAotLy8gTWVtYmVyIHBvaW50ZXIgaGVscGVycy4KLXN0YXRpYyBib29sIGhhc1ZCUHRyT2Zmc2V0RmllbGQoTVNJbmhlcml0YW5jZU1vZGVsIEluaGVyaXRhbmNlKSB7Ci0gIHJldHVybiBJbmhlcml0YW5jZSA9PSBNU0lNX1Vuc3BlY2lmaWVkOwotfQotCi1zdGF0aWMgYm9vbCBoYXNPbmx5T25lRmllbGQoYm9vbCBJc01lbWJlckZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TSW5oZXJpdGFuY2VNb2RlbCBJbmhlcml0YW5jZSkgewotICByZXR1cm4gSW5oZXJpdGFuY2UgPD0gTVNJTV9TaW5nbGVQb2x5bW9ycGhpYyB8fAotICAgICAgKCFJc01lbWJlckZ1bmN0aW9uICYmIEluaGVyaXRhbmNlIDw9IE1TSU1fTXVsdGlwbGVQb2x5bW9ycGhpYyk7Ci19Ci0KLS8vIE9ubHkgbWVtYmVyIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBuZWVkIGEgdGhpcyBhZGp1c3RtZW50LCBzaW5jZSBpdCBjYW4gYmUKLS8vIGNvbWJpbmVkIHdpdGggdGhlIGZpZWxkIG9mZnNldCBmb3IgZGF0YSBwb2ludGVycy4KLXN0YXRpYyBib29sIGhhc05vblZpcnR1YWxCYXNlQWRqdXN0bWVudEZpZWxkKGJvb2wgSXNNZW1iZXJGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TSW5oZXJpdGFuY2VNb2RlbCBJbmhlcml0YW5jZSkgewotICByZXR1cm4gKElzTWVtYmVyRnVuY3Rpb24gJiYgSW5oZXJpdGFuY2UgPj0gTVNJTV9NdWx0aXBsZSk7Ci19Ci0KLXN0YXRpYyBib29sIGhhc1ZpcnR1YWxCYXNlQWRqdXN0bWVudEZpZWxkKE1TSW5oZXJpdGFuY2VNb2RlbCBJbmhlcml0YW5jZSkgewotICByZXR1cm4gSW5oZXJpdGFuY2UgPj0gTVNJTV9WaXJ0dWFsOwotfQotCi0vLyBVc2UgemVybyBmb3IgdGhlIGZpZWxkIG9mZnNldCBvZiBhIG51bGwgZGF0YSBtZW1iZXIgcG9pbnRlciBpZiB3ZSBjYW4KLS8vIGd1YXJhbnRlZSB0aGF0IHplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgb2Zmc2V0LCBvciBpZiB0aGUgbWVtYmVyIHBvaW50ZXIgaGFzCi0vLyBtdWx0aXBsZSBmaWVsZHMuICBQb2x5bW9ycGhpYyBjbGFzc2VzIGhhdmUgYSB2ZnB0ciBhdCBvZmZzZXQgemVybywgc28gd2UgY2FuCi0vLyB1c2UgemVybyBmb3IgbnVsbC4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBmaWVsZHMsIHdlIGNhbiB1c2UgemVybyBldmVuIGlmIGl0Ci0vLyBpcyBhIHZhbGlkIGZpZWxkIG9mZnNldCBiZWNhdXNlIG51bGwtbmVzcyB0ZXN0aW5nIHdpbGwgY2hlY2sgdGhlIG90aGVyCi0vLyBmaWVsZHMuCi1zdGF0aWMgYm9vbCBudWxsRmllbGRPZmZzZXRJc1plcm8oTVNJbmhlcml0YW5jZU1vZGVsIEluaGVyaXRhbmNlKSB7Ci0gIHJldHVybiBJbmhlcml0YW5jZSAhPSBNU0lNX011bHRpcGxlICYmIEluaGVyaXRhbmNlICE9IE1TSU1fU2luZ2xlOwotfQotCiBib29sIE1pY3Jvc29mdENYWEFCSTo6aXNaZXJvSW5pdGlhbGl6YWJsZShjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSB7CiAgIC8vIE51bGwtbmVzcyBmb3IgZnVuY3Rpb24gbWVtcHRycyBvbmx5IGRlcGVuZHMgb24gdGhlIGZpcnN0IGZpZWxkLCB3aGljaCBpcwogICAvLyB0aGUgZnVuY3Rpb24gcG9pbnRlci4gIFRoZSByZXN0IGRvbid0IG1hdHRlciwgc28gd2UgY2FuIHplcm8gaW5pdGlhbGl6ZS4KQEAgLTEyNzAsMjggKzEzNDksMjggQEAKICAgLy8gVGhlIHZpcnR1YWwgYmFzZSBhZGp1c3RtZW50IGZpZWxkIGlzIGFsd2F5cyAtMSBmb3IgbnVsbCwgc28gaWYgd2UgaGF2ZSBvbmUKICAgLy8gd2UgY2FuJ3QgemVybyBpbml0aWFsaXplLiAgVGhlIGZpZWxkIG9mZnNldCBpcyBzb21ldGltZXMgYWxzbyAtMSBpZiAwIGlzIGEKICAgLy8gdmFsaWQgZmllbGQgb2Zmc2V0LgotICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IE1QVC0+Z2V0Q2xhc3MoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7Ci0gIE1TSW5oZXJpdGFuY2VNb2RlbCBJbmhlcml0YW5jZSA9IFJELT5nZXRNU0luaGVyaXRhbmNlTW9kZWwoKTsKLSAgcmV0dXJuICghaGFzVmlydHVhbEJhc2VBZGp1c3RtZW50RmllbGQoSW5oZXJpdGFuY2UpICYmCi0gICAgICAgICAgbnVsbEZpZWxkT2Zmc2V0SXNaZXJvKEluaGVyaXRhbmNlKSk7CisgIGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gTVBULT5nZXRNb3N0UmVjZW50Q1hYUmVjb3JkRGVjbCgpOworICBNU0luaGVyaXRhbmNlQXR0cjo6U3BlbGxpbmcgSW5oZXJpdGFuY2UgPSBSRC0+Z2V0TVNJbmhlcml0YW5jZU1vZGVsKCk7CisgIHJldHVybiAoIU1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlRhYmxlT2Zmc2V0RmllbGQoSW5oZXJpdGFuY2UpICYmCisgICAgICAgICAgUkQtPm51bGxGaWVsZE9mZnNldElzWmVybygpKTsKIH0KIAogbGx2bTo6VHlwZSAqCiBNaWNyb3NvZnRDWFhBQkk6OkNvbnZlcnRNZW1iZXJQb2ludGVyVHlwZShjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSB7Ci0gIGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gTVBULT5nZXRDbGFzcygpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKLSAgTVNJbmhlcml0YW5jZU1vZGVsIEluaGVyaXRhbmNlID0gUkQtPmdldE1TSW5oZXJpdGFuY2VNb2RlbCgpOworICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IE1QVC0+Z2V0TW9zdFJlY2VudENYWFJlY29yZERlY2woKTsKKyAgTVNJbmhlcml0YW5jZUF0dHI6OlNwZWxsaW5nIEluaGVyaXRhbmNlID0gUkQtPmdldE1TSW5oZXJpdGFuY2VNb2RlbCgpOwogICBsbHZtOjpTbWFsbFZlY3RvcjxsbHZtOjpUeXBlICosIDQ+IGZpZWxkczsKICAgaWYgKE1QVC0+aXNNZW1iZXJGdW5jdGlvblBvaW50ZXIoKSkKICAgICBmaWVsZHMucHVzaF9iYWNrKENHTS5Wb2lkUHRyVHkpOyAgLy8gRnVuY3Rpb25Qb2ludGVyT3JWaXJ0dWFsVGh1bmsKICAgZWxzZQogICAgIGZpZWxkcy5wdXNoX2JhY2soQ0dNLkludFR5KTsgIC8vIEZpZWxkT2Zmc2V0CiAKLSAgaWYgKGhhc05vblZpcnR1YWxCYXNlQWRqdXN0bWVudEZpZWxkKE1QVC0+aXNNZW1iZXJGdW5jdGlvblBvaW50ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaGVyaXRhbmNlKSkKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNOVk9mZnNldEZpZWxkKE1QVC0+aXNNZW1iZXJGdW5jdGlvblBvaW50ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaGVyaXRhbmNlKSkKICAgICBmaWVsZHMucHVzaF9iYWNrKENHTS5JbnRUeSk7Ci0gIGlmIChoYXNWQlB0ck9mZnNldEZpZWxkKEluaGVyaXRhbmNlKSkKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlB0ck9mZnNldEZpZWxkKEluaGVyaXRhbmNlKSkKICAgICBmaWVsZHMucHVzaF9iYWNrKENHTS5JbnRUeSk7Ci0gIGlmIChoYXNWaXJ0dWFsQmFzZUFkanVzdG1lbnRGaWVsZChJbmhlcml0YW5jZSkpCisgIGlmIChNU0luaGVyaXRhbmNlQXR0cjo6aGFzVkJUYWJsZU9mZnNldEZpZWxkKEluaGVyaXRhbmNlKSkKICAgICBmaWVsZHMucHVzaF9iYWNrKENHTS5JbnRUeSk7ICAvLyBWaXJ0dWFsQmFzZUFkanVzdG1lbnRPZmZzZXQKIAogICBpZiAoZmllbGRzLnNpemUoKSA9PSAxKQpAQCAtMTMwMywyNCArMTM4MiwyNCBAQAogR2V0TnVsbE1lbWJlclBvaW50ZXJGaWVsZHMoY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxsbHZtOjpDb25zdGFudCAqPiAmZmllbGRzKSB7CiAgIGFzc2VydChmaWVsZHMuZW1wdHkoKSk7Ci0gIGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gTVBULT5nZXRDbGFzcygpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKLSAgTVNJbmhlcml0YW5jZU1vZGVsIEluaGVyaXRhbmNlID0gUkQtPmdldE1TSW5oZXJpdGFuY2VNb2RlbCgpOworICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IE1QVC0+Z2V0TW9zdFJlY2VudENYWFJlY29yZERlY2woKTsKKyAgTVNJbmhlcml0YW5jZUF0dHI6OlNwZWxsaW5nIEluaGVyaXRhbmNlID0gUkQtPmdldE1TSW5oZXJpdGFuY2VNb2RlbCgpOwogICBpZiAoTVBULT5pc01lbWJlckZ1bmN0aW9uUG9pbnRlcigpKSB7CiAgICAgLy8gRnVuY3Rpb25Qb2ludGVyT3JWaXJ0dWFsVGh1bmsKICAgICBmaWVsZHMucHVzaF9iYWNrKGxsdm06OkNvbnN0YW50OjpnZXROdWxsVmFsdWUoQ0dNLlZvaWRQdHJUeSkpOwogICB9IGVsc2UgewotICAgIGlmIChudWxsRmllbGRPZmZzZXRJc1plcm8oSW5oZXJpdGFuY2UpKQorICAgIGlmIChSRC0+bnVsbEZpZWxkT2Zmc2V0SXNaZXJvKCkpCiAgICAgICBmaWVsZHMucHVzaF9iYWNrKGdldFplcm9JbnQoKSk7ICAvLyBGaWVsZE9mZnNldAogICAgIGVsc2UKICAgICAgIGZpZWxkcy5wdXNoX2JhY2soZ2V0QWxsT25lc0ludCgpKTsgIC8vIEZpZWxkT2Zmc2V0CiAgIH0KIAotICBpZiAoaGFzTm9uVmlydHVhbEJhc2VBZGp1c3RtZW50RmllbGQoTVBULT5pc01lbWJlckZ1bmN0aW9uUG9pbnRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5oZXJpdGFuY2UpKQorICBpZiAoTVNJbmhlcml0YW5jZUF0dHI6Omhhc05WT2Zmc2V0RmllbGQoTVBULT5pc01lbWJlckZ1bmN0aW9uUG9pbnRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5oZXJpdGFuY2UpKQogICAgIGZpZWxkcy5wdXNoX2JhY2soZ2V0WmVyb0ludCgpKTsKLSAgaWYgKGhhc1ZCUHRyT2Zmc2V0RmllbGQoSW5oZXJpdGFuY2UpKQorICBpZiAoTVNJbmhlcml0YW5jZUF0dHI6Omhhc1ZCUHRyT2Zmc2V0RmllbGQoSW5oZXJpdGFuY2UpKQogICAgIGZpZWxkcy5wdXNoX2JhY2soZ2V0WmVyb0ludCgpKTsKLSAgaWYgKGhhc1ZpcnR1YWxCYXNlQWRqdXN0bWVudEZpZWxkKEluaGVyaXRhbmNlKSkKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlRhYmxlT2Zmc2V0RmllbGQoSW5oZXJpdGFuY2UpKQogICAgIGZpZWxkcy5wdXNoX2JhY2soZ2V0QWxsT25lc0ludCgpKTsKIH0KIApAQCAtMTM0MSwyOSArMTQyMCwyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgTm9uVmlydHVhbEJhc2VBZGp1c3RtZW50KQogewotICBNU0luaGVyaXRhbmNlTW9kZWwgSW5oZXJpdGFuY2UgPSBSRC0+Z2V0TVNJbmhlcml0YW5jZU1vZGVsKCk7CisgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBJbmhlcml0YW5jZSA9IFJELT5nZXRNU0luaGVyaXRhbmNlTW9kZWwoKTsKIAogICAvLyBTaW5nbGUgaW5oZXJpdGFuY2UgY2xhc3MgbWVtYmVyIHBvaW50ZXIgYXJlIHJlcHJlc2VudGVkIGFzIHNjYWxhcnMgaW5zdGVhZAogICAvLyBvZiBhZ2dyZWdhdGVzLgotICBpZiAoaGFzT25seU9uZUZpZWxkKElzTWVtYmVyRnVuY3Rpb24sIEluaGVyaXRhbmNlKSkKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNPbmx5T25lRmllbGQoSXNNZW1iZXJGdW5jdGlvbiwgSW5oZXJpdGFuY2UpKQogICAgIHJldHVybiBGaXJzdEZpZWxkOwogCiAgIGxsdm06OlNtYWxsVmVjdG9yPGxsdm06OkNvbnN0YW50ICosIDQ+IGZpZWxkczsKICAgZmllbGRzLnB1c2hfYmFjayhGaXJzdEZpZWxkKTsKIAotICBpZiAoaGFzTm9uVmlydHVhbEJhc2VBZGp1c3RtZW50RmllbGQoSXNNZW1iZXJGdW5jdGlvbiwgSW5oZXJpdGFuY2UpKQorICBpZiAoTVNJbmhlcml0YW5jZUF0dHI6Omhhc05WT2Zmc2V0RmllbGQoSXNNZW1iZXJGdW5jdGlvbiwgSW5oZXJpdGFuY2UpKQogICAgIGZpZWxkcy5wdXNoX2JhY2sobGx2bTo6Q29uc3RhbnRJbnQ6OmdldCgKICAgICAgIENHTS5JbnRUeSwgTm9uVmlydHVhbEJhc2VBZGp1c3RtZW50LmdldFF1YW50aXR5KCkpKTsKIAotICBpZiAoaGFzVkJQdHJPZmZzZXRGaWVsZChJbmhlcml0YW5jZSkpIHsKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlB0ck9mZnNldEZpZWxkKEluaGVyaXRhbmNlKSkgewogICAgIENoYXJVbml0cyBPZmZzID0gQ2hhclVuaXRzOjpaZXJvKCk7CiAgICAgaWYgKFJELT5nZXROdW1WQmFzZXMoKSkKLSAgICAgIE9mZnMgPSBHZXRWQlB0ck9mZnNldEZyb21CYXNlcyhSRCk7CisgICAgICBPZmZzID0gZ2V0Q29udGV4dCgpLmdldEFTVFJlY29yZExheW91dChSRCkuZ2V0VkJQdHJPZmZzZXQoKTsKICAgICBmaWVsZHMucHVzaF9iYWNrKGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dNLkludFR5LCBPZmZzLmdldFF1YW50aXR5KCkpKTsKICAgfQogCiAgIC8vIFRoZSByZXN0IG9mIHRoZSBmaWVsZHMgYXJlIGFkanVzdGVkIGJ5IGNvbnZlcnNpb25zIHRvIGEgbW9yZSBkZXJpdmVkIGNsYXNzLgotICBpZiAoaGFzVmlydHVhbEJhc2VBZGp1c3RtZW50RmllbGQoSW5oZXJpdGFuY2UpKQorICBpZiAoTVNJbmhlcml0YW5jZUF0dHI6Omhhc1ZCVGFibGVPZmZzZXRGaWVsZChJbmhlcml0YW5jZSkpCiAgICAgZmllbGRzLnB1c2hfYmFjayhnZXRaZXJvSW50KCkpOwogCiAgIHJldHVybiBsbHZtOjpDb25zdGFudFN0cnVjdDo6Z2V0QW5vbihmaWVsZHMpOwpAQCAtMTM3Miw3ICsxNDUxLDcgQEAKIGxsdm06OkNvbnN0YW50ICoKIE1pY3Jvc29mdENYWEFCSTo6RW1pdE1lbWJlckRhdGFQb2ludGVyKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyVW5pdHMgb2Zmc2V0KSB7Ci0gIGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gTVBULT5nZXRDbGFzcygpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBNUFQtPmdldE1vc3RSZWNlbnRDWFhSZWNvcmREZWNsKCk7CiAgIGxsdm06OkNvbnN0YW50ICpGaXJzdEZpZWxkID0KICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KENHTS5JbnRUeSwgb2Zmc2V0LmdldFF1YW50aXR5KCkpOwogICByZXR1cm4gRW1pdEZ1bGxNZW1iZXJQb2ludGVyKEZpcnN0RmllbGQsIC8qSXNNZW1iZXJGdW5jdGlvbj0qL2ZhbHNlLCBSRCwKQEAgLTEzOTUsOCArMTQ3NCw4IEBACiAgIC8vIEZJWE1FIFBSMTU3MTM6IFN1cHBvcnQgdmlydHVhbCBpbmhlcml0YW5jZSBwYXRocy4KIAogICBpZiAoY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPihNUEQpKQotICAgIHJldHVybiBCdWlsZE1lbWJlclBvaW50ZXIoTVBULT5nZXRDbGFzcygpLT5nZXRBc0NYWFJlY29yZERlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ELCBUaGlzQWRqdXN0bWVudCk7CisgICAgcmV0dXJuIEJ1aWxkTWVtYmVyUG9pbnRlcihNUFQtPmdldE1vc3RSZWNlbnRDWFhSZWNvcmREZWNsKCksIE1ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpc0FkanVzdG1lbnQpOwogCiAgIENoYXJVbml0cyBGaWVsZE9mZnNldCA9CiAgICAgZ2V0Q29udGV4dCgpLnRvQ2hhclVuaXRzRnJvbUJpdHMoZ2V0Q29udGV4dCgpLmdldEZpZWxkT2Zmc2V0KE1QRCkpOwpAQCAtMTQwOSw2ICsxNDg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBOb25WaXJ0dWFsQmFzZUFkanVzdG1lbnQpIHsKICAgYXNzZXJ0KE1ELT5pc0luc3RhbmNlKCkgJiYgIk1lbWJlciBmdW5jdGlvbiBtdXN0IG5vdCBiZSBzdGF0aWMhIik7CiAgIE1EID0gTUQtPmdldENhbm9uaWNhbERlY2woKTsKKyAgUkQgPSBSRC0+Z2V0TW9zdFJlY2VudERlY2woKTsKICAgQ29kZUdlblR5cGVzICZUeXBlcyA9IENHTS5nZXRUeXBlcygpOwogCiAgIGxsdm06OkNvbnN0YW50ICpGaXJzdEZpZWxkOwpAQCAtMTQ0MiwxNiArMTUyMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZW1iZXIgZnVuY3Rpb24gaW4gdmlydHVhbCBiYXNlIGNsYXNzIik7CiAgICAgICBGaXJzdEZpZWxkID0gbGx2bTo6Q29uc3RhbnQ6OmdldE51bGxWYWx1ZShDR00uVm9pZFB0clR5KTsKICAgICB9IGVsc2UgewotICAgICAgU21hbGxTdHJpbmc8MjU2PiBUaHVua05hbWU7Ci0gICAgICBDaGFyVW5pdHMgUG9pbnRlcldpZHRoID0gZ2V0Q29udGV4dCgpLnRvQ2hhclVuaXRzRnJvbUJpdHMoCi0gICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFRhcmdldEluZm8oKS5nZXRQb2ludGVyV2lkdGgoMCkpOwotICAgICAgdWludDY0X3QgT2Zmc2V0SW5WRlRhYmxlID0gTUwuSW5kZXggKiBQb2ludGVyV2lkdGguZ2V0UXVhbnRpdHkoKTsKLSAgICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gT3V0KFRodW5rTmFtZSk7Ci0gICAgICBnZXRNYW5nbGVDb250ZXh0KCkubWFuZ2xlVmlydHVhbE1lbVB0clRodW5rKE1ELCBPZmZzZXRJblZGVGFibGUsIE91dCk7Ci0gICAgICBPdXQuZmx1c2goKTsKLQotICAgICAgbGx2bTo6RnVuY3Rpb24gKlRodW5rID0gRW1pdFZpcnR1YWxNZW1QdHJUaHVuayhNRCwgVGh1bmtOYW1lLnN0cigpKTsKKyAgICAgIGxsdm06OkZ1bmN0aW9uICpUaHVuayA9IEVtaXRWaXJ0dWFsTWVtUHRyVGh1bmsoTUQsIE1MKTsKICAgICAgIEZpcnN0RmllbGQgPSBsbHZtOjpDb25zdGFudEV4cHI6OmdldEJpdENhc3QoVGh1bmssIENHTS5Wb2lkUHRyVHkpOworICAgICAgLy8gSW5jbHVkZSB0aGUgdmZwdHIgYWRqdXN0bWVudCBpZiB0aGUgbWV0aG9kIGlzIGluIGEgbm9uLXByaW1hcnkgdmZ0YWJsZS4KKyAgICAgIE5vblZpcnR1YWxCYXNlQWRqdXN0bWVudCArPSBNTC5WRlB0ck9mZnNldDsKICAgICB9CiAgIH0KIApAQCAtMTQ4Niw5ICsxNTYwLDEwIEBACiAKICAgLy8gSWYgdGhpcyBpcyBhIHNpbmdsZSBmaWVsZCBtZW1iZXIgcG9pbnRlciAoc2luZ2xlIGluaGVyaXRhbmNlKSwgdGhpcyBpcyBhCiAgIC8vIHNpbmdsZSBpY21wLgotICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IE1QVC0+Z2V0Q2xhc3MoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7Ci0gIE1TSW5oZXJpdGFuY2VNb2RlbCBJbmhlcml0YW5jZSA9IFJELT5nZXRNU0luaGVyaXRhbmNlTW9kZWwoKTsKLSAgaWYgKGhhc09ubHlPbmVGaWVsZChNUFQtPmlzTWVtYmVyRnVuY3Rpb25Qb2ludGVyKCksIEluaGVyaXRhbmNlKSkKKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBNUFQtPmdldE1vc3RSZWNlbnRDWFhSZWNvcmREZWNsKCk7CisgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBJbmhlcml0YW5jZSA9IFJELT5nZXRNU0luaGVyaXRhbmNlTW9kZWwoKTsKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNPbmx5T25lRmllbGQoTVBULT5pc01lbWJlckZ1bmN0aW9uUG9pbnRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmhlcml0YW5jZSkpCiAgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlSUNtcChFcSwgTCwgUik7CiAKICAgLy8gQ29tcGFyZSB0aGUgZmlyc3QgZmllbGQuCkBAIC0xNjA3LDExICsxNjgyLDkgQEAKIAogLy8gUmV0dXJucyBhbiBhZGp1c3RlZCBiYXNlIGNhc3QgdG8gaTgqLCBzaW5jZSB3ZSBkbyBtb3JlIGFkZHJlc3MgYXJpdGhtZXRpYyBvbgogLy8gaXQuCi1sbHZtOjpWYWx1ZSAqCi1NaWNyb3NvZnRDWFhBQkk6OkFkanVzdFZpcnR1YWxCYXNlKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCwgbGx2bTo6VmFsdWUgKkJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpWQlRhYmxlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqVkJQdHJPZmZzZXQpIHsKK2xsdm06OlZhbHVlICpNaWNyb3NvZnRDWFhBQkk6OkFkanVzdFZpcnR1YWxCYXNlKAorICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGLCBjb25zdCBFeHByICpFLCBjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKKyAgICBsbHZtOjpWYWx1ZSAqQmFzZSwgbGx2bTo6VmFsdWUgKlZCVGFibGVPZmZzZXQsIGxsdm06OlZhbHVlICpWQlB0ck9mZnNldCkgewogICBDR0J1aWxkZXJUeSAmQnVpbGRlciA9IENHRi5CdWlsZGVyOwogICBCYXNlID0gQnVpbGRlci5DcmVhdGVCaXRDYXN0KEJhc2UsIENHTS5JbnQ4UHRyVHkpOwogICBsbHZtOjpCYXNpY0Jsb2NrICpPcmlnaW5hbEJCID0gMDsKQEAgLTE2MzcsOSArMTcxMCwxNSBAQAogICAvLyBrbm93IHRoZSB2YnB0ciBvZmZzZXQuCiAgIGlmICghVkJQdHJPZmZzZXQpIHsKICAgICBDaGFyVW5pdHMgb2ZmcyA9IENoYXJVbml0czo6WmVybygpOwotICAgIGlmIChSRC0+Z2V0TnVtVkJhc2VzKCkpIHsKLSAgICAgIG9mZnMgPSBHZXRWQlB0ck9mZnNldEZyb21CYXNlcyhSRCk7Ci0gICAgfQorICAgIGlmICghUkQtPmhhc0RlZmluaXRpb24oKSkgeworICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzID0gQ0dGLkNHTS5nZXREaWFncygpOworICAgICAgdW5zaWduZWQgRGlhZ0lEID0gRGlhZ3MuZ2V0Q3VzdG9tRGlhZ0lEKAorICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpFcnJvciwKKyAgICAgICAgICAibWVtYmVyIHBvaW50ZXIgcmVwcmVzZW50YXRpb24gcmVxdWlyZXMgYSAiCisgICAgICAgICAgImNvbXBsZXRlIGNsYXNzIHR5cGUgZm9yICUwIHRvIHBlcmZvcm0gdGhpcyBleHByZXNzaW9uIik7CisgICAgICBEaWFncy5SZXBvcnQoRS0+Z2V0RXhwckxvYygpLCBEaWFnSUQpIDw8IFJEIDw8IEUtPmdldFNvdXJjZVJhbmdlKCk7CisgICAgfSBlbHNlIGlmIChSRC0+Z2V0TnVtVkJhc2VzKCkpCisgICAgICBvZmZzID0gZ2V0Q29udGV4dCgpLmdldEFTVFJlY29yZExheW91dChSRCkuZ2V0VkJQdHJPZmZzZXQoKTsKICAgICBWQlB0ck9mZnNldCA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dNLkludFR5LCBvZmZzLmdldFF1YW50aXR5KCkpOwogICB9CiAgIGxsdm06OlZhbHVlICpWQlB0ciA9IDA7CkBAIC0xNjU5LDE4ICsxNzM4LDE2IEBACiAgIHJldHVybiBBZGp1c3RlZEJhc2U7CiB9CiAKLWxsdm06OlZhbHVlICoKLU1pY3Jvc29mdENYWEFCSTo6RW1pdE1lbWJlckRhdGFQb2ludGVyQWRkcmVzcyhDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTWVtUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpIHsKK2xsdm06OlZhbHVlICpNaWNyb3NvZnRDWFhBQkk6OkVtaXRNZW1iZXJEYXRhUG9pbnRlckFkZHJlc3MoCisgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IEV4cHIgKkUsIGxsdm06OlZhbHVlICpCYXNlLCBsbHZtOjpWYWx1ZSAqTWVtUHRyLAorICAgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpIHsKICAgYXNzZXJ0KE1QVC0+aXNNZW1iZXJEYXRhUG9pbnRlcigpKTsKICAgdW5zaWduZWQgQVMgPSBCYXNlLT5nZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKICAgbGx2bTo6VHlwZSAqUFR5cGUgPQogICAgICAgQ0dGLkNvbnZlcnRUeXBlRm9yTWVtKE1QVC0+Z2V0UG9pbnRlZVR5cGUoKSktPmdldFBvaW50ZXJUbyhBUyk7CiAgIENHQnVpbGRlclR5ICZCdWlsZGVyID0gQ0dGLkJ1aWxkZXI7Ci0gIGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gTVBULT5nZXRDbGFzcygpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKLSAgTVNJbmhlcml0YW5jZU1vZGVsIEluaGVyaXRhbmNlID0gUkQtPmdldE1TSW5oZXJpdGFuY2VNb2RlbCgpOworICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IE1QVC0+Z2V0TW9zdFJlY2VudENYWFJlY29yZERlY2woKTsKKyAgTVNJbmhlcml0YW5jZUF0dHI6OlNwZWxsaW5nIEluaGVyaXRhbmNlID0gUkQtPmdldE1TSW5oZXJpdGFuY2VNb2RlbCgpOwogCiAgIC8vIEV4dHJhY3QgdGhlIGZpZWxkcyB3ZSBuZWVkLCByZWdhcmRsZXNzIG9mIG1vZGVsLiAgV2UnbGwgYXBwbHkgdGhlbSBpZiB3ZQogICAvLyBoYXZlIHRoZW0uCkBAIC0xNjgxLDE2ICsxNzU4LDIxIEBACiAgICAgLy8gV2UgbmVlZCB0byBleHRyYWN0IHZhbHVlcy4KICAgICB1bnNpZ25lZCBJID0gMDsKICAgICBGaWVsZE9mZnNldCA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdFZhbHVlKE1lbVB0ciwgSSsrKTsKLSAgICBpZiAoaGFzVkJQdHJPZmZzZXRGaWVsZChJbmhlcml0YW5jZSkpCisgICAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlB0ck9mZnNldEZpZWxkKEluaGVyaXRhbmNlKSkKICAgICAgIFZCUHRyT2Zmc2V0ID0gQnVpbGRlci5DcmVhdGVFeHRyYWN0VmFsdWUoTWVtUHRyLCBJKyspOwotICAgIGlmIChoYXNWaXJ0dWFsQmFzZUFkanVzdG1lbnRGaWVsZChJbmhlcml0YW5jZSkpCisgICAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlRhYmxlT2Zmc2V0RmllbGQoSW5oZXJpdGFuY2UpKQogICAgICAgVmlydHVhbEJhc2VBZGp1c3RtZW50T2Zmc2V0ID0gQnVpbGRlci5DcmVhdGVFeHRyYWN0VmFsdWUoTWVtUHRyLCBJKyspOwogICB9CiAKICAgaWYgKFZpcnR1YWxCYXNlQWRqdXN0bWVudE9mZnNldCkgewotICAgIEJhc2UgPSBBZGp1c3RWaXJ0dWFsQmFzZShDR0YsIFJELCBCYXNlLCBWaXJ0dWFsQmFzZUFkanVzdG1lbnRPZmZzZXQsCisgICAgQmFzZSA9IEFkanVzdFZpcnR1YWxCYXNlKENHRiwgRSwgUkQsIEJhc2UsIFZpcnR1YWxCYXNlQWRqdXN0bWVudE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkJQdHJPZmZzZXQpOwogICB9CisKKyAgLy8gQ2FzdCB0byBjaGFyKi4KKyAgQmFzZSA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChCYXNlLCBCdWlsZGVyLmdldEludDhUeSgpLT5nZXRQb2ludGVyVG8oQVMpKTsKKworICAvLyBBcHBseSB0aGUgb2Zmc2V0LCB3aGljaCB3ZSBhc3N1bWUgaXMgbm9uLW51bGwuCiAgIGxsdm06OlZhbHVlICpBZGRyID0KICAgICBCdWlsZGVyLkNyZWF0ZUluQm91bmRzR0VQKEJhc2UsIEZpZWxkT2Zmc2V0LCAibWVtcHRyLm9mZnNldCIpOwogCkBAIC0xNjk5LDkgKzE3ODEsOSBAQAogICByZXR1cm4gQnVpbGRlci5DcmVhdGVCaXRDYXN0KEFkZHIsIFBUeXBlKTsKIH0KIAotc3RhdGljIE1TSW5oZXJpdGFuY2VNb2RlbAorc3RhdGljIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZwogZ2V0SW5oZXJpdGFuY2VGcm9tTWVtcHRyKGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpIHsKLSAgcmV0dXJuIE1QVC0+Z2V0Q2xhc3MoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCktPmdldE1TSW5oZXJpdGFuY2VNb2RlbCgpOworICByZXR1cm4gTVBULT5nZXRNb3N0UmVjZW50Q1hYUmVjb3JkRGVjbCgpLT5nZXRNU0luaGVyaXRhbmNlTW9kZWwoKTsKIH0KIAogbGx2bTo6VmFsdWUgKgpAQCAtMTcyMSwxNSArMTgwMywxNyBAQAogICBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqU3JjVHkgPQogICAgIEUtPmdldFN1YkV4cHIoKS0+Z2V0VHlwZSgpLT5jYXN0QXM8TWVtYmVyUG9pbnRlclR5cGU+KCk7CiAgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpEc3RUeSA9IEUtPmdldFR5cGUoKS0+Y2FzdEFzPE1lbWJlclBvaW50ZXJUeXBlPigpOwotICBNU0luaGVyaXRhbmNlTW9kZWwgU3JjSW5oZXJpdGFuY2UgPSBnZXRJbmhlcml0YW5jZUZyb21NZW1wdHIoU3JjVHkpOwotICBNU0luaGVyaXRhbmNlTW9kZWwgRHN0SW5oZXJpdGFuY2UgPSBnZXRJbmhlcml0YW5jZUZyb21NZW1wdHIoRHN0VHkpOwogICBib29sIElzRnVuYyA9IFNyY1R5LT5pc01lbWJlckZ1bmN0aW9uUG9pbnRlcigpOwogCiAgIC8vIElmIHRoZSBjbGFzc2VzIHVzZSB0aGUgc2FtZSBudWxsIHJlcHJlc2VudGF0aW9uLCByZWludGVycHJldF9jYXN0IGlzIGEgbm9wLgogICBib29sIElzUmVpbnRlcnByZXQgPSBFLT5nZXRDYXN0S2luZCgpID09IENLX1JlaW50ZXJwcmV0TWVtYmVyUG9pbnRlcjsKLSAgaWYgKElzUmVpbnRlcnByZXQgJiYgKElzRnVuYyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbEZpZWxkT2Zmc2V0SXNaZXJvKFNyY0luaGVyaXRhbmNlKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbEZpZWxkT2Zmc2V0SXNaZXJvKERzdEluaGVyaXRhbmNlKSkpCisgIGlmIChJc1JlaW50ZXJwcmV0ICYmIElzRnVuYykKKyAgICByZXR1cm4gU3JjOworCisgIENYWFJlY29yZERlY2wgKlNyY1JEID0gU3JjVHktPmdldE1vc3RSZWNlbnRDWFhSZWNvcmREZWNsKCk7CisgIENYWFJlY29yZERlY2wgKkRzdFJEID0gRHN0VHktPmdldE1vc3RSZWNlbnRDWFhSZWNvcmREZWNsKCk7CisgIGlmIChJc1JlaW50ZXJwcmV0ICYmCisgICAgICBTcmNSRC0+bnVsbEZpZWxkT2Zmc2V0SXNaZXJvKCkgPT0gRHN0UkQtPm51bGxGaWVsZE9mZnNldElzWmVybygpKQogICAgIHJldHVybiBTcmM7CiAKICAgQ0dCdWlsZGVyVHkgJkJ1aWxkZXIgPSBDR0YuQnVpbGRlcjsKQEAgLTE3NTgsMTUgKzE4NDIsMTYgQEAKICAgbGx2bTo6VmFsdWUgKk5vblZpcnR1YWxCYXNlQWRqdXN0bWVudCA9IDA7CiAgIGxsdm06OlZhbHVlICpWaXJ0dWFsQmFzZUFkanVzdG1lbnRPZmZzZXQgPSAwOwogICBsbHZtOjpWYWx1ZSAqVkJQdHJPZmZzZXQgPSAwOwotICBpZiAoIWhhc09ubHlPbmVGaWVsZChJc0Z1bmMsIFNyY0luaGVyaXRhbmNlKSkgeworICBNU0luaGVyaXRhbmNlQXR0cjo6U3BlbGxpbmcgU3JjSW5oZXJpdGFuY2UgPSBTcmNSRC0+Z2V0TVNJbmhlcml0YW5jZU1vZGVsKCk7CisgIGlmICghTVNJbmhlcml0YW5jZUF0dHI6Omhhc09ubHlPbmVGaWVsZChJc0Z1bmMsIFNyY0luaGVyaXRhbmNlKSkgewogICAgIC8vIFdlIG5lZWQgdG8gZXh0cmFjdCB2YWx1ZXMuCiAgICAgdW5zaWduZWQgSSA9IDA7CiAgICAgRmlyc3RGaWVsZCA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdFZhbHVlKFNyYywgSSsrKTsKLSAgICBpZiAoaGFzTm9uVmlydHVhbEJhc2VBZGp1c3RtZW50RmllbGQoSXNGdW5jLCBTcmNJbmhlcml0YW5jZSkpCisgICAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNOVk9mZnNldEZpZWxkKElzRnVuYywgU3JjSW5oZXJpdGFuY2UpKQogICAgICAgTm9uVmlydHVhbEJhc2VBZGp1c3RtZW50ID0gQnVpbGRlci5DcmVhdGVFeHRyYWN0VmFsdWUoU3JjLCBJKyspOwotICAgIGlmIChoYXNWQlB0ck9mZnNldEZpZWxkKFNyY0luaGVyaXRhbmNlKSkKKyAgICBpZiAoTVNJbmhlcml0YW5jZUF0dHI6Omhhc1ZCUHRyT2Zmc2V0RmllbGQoU3JjSW5oZXJpdGFuY2UpKQogICAgICAgVkJQdHJPZmZzZXQgPSBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RWYWx1ZShTcmMsIEkrKyk7Ci0gICAgaWYgKGhhc1ZpcnR1YWxCYXNlQWRqdXN0bWVudEZpZWxkKFNyY0luaGVyaXRhbmNlKSkKKyAgICBpZiAoTVNJbmhlcml0YW5jZUF0dHI6Omhhc1ZCVGFibGVPZmZzZXRGaWVsZChTcmNJbmhlcml0YW5jZSkpCiAgICAgICBWaXJ0dWFsQmFzZUFkanVzdG1lbnRPZmZzZXQgPSBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RWYWx1ZShTcmMsIEkrKyk7CiAgIH0KIApAQCAtMTc4OCwyMCArMTg3MywyMSBAQAogICAvLyBGSVhNRSBQUjE1NzEzOiBTdXBwb3J0IGNvbnZlcnNpb25zIHRocm91Z2ggdmlydHVhbGx5IGRlcml2ZWQgY2xhc3Nlcy4KIAogICAvLyBSZWNvbXBvc2UgZHN0IGZyb20gdGhlIG51bGwgc3RydWN0IGFuZCB0aGUgYWRqdXN0ZWQgZmllbGRzIGZyb20gc3JjLgorICBNU0luaGVyaXRhbmNlQXR0cjo6U3BlbGxpbmcgRHN0SW5oZXJpdGFuY2UgPSBEc3RSRC0+Z2V0TVNJbmhlcml0YW5jZU1vZGVsKCk7CiAgIGxsdm06OlZhbHVlICpEc3Q7Ci0gIGlmIChoYXNPbmx5T25lRmllbGQoSXNGdW5jLCBEc3RJbmhlcml0YW5jZSkpIHsKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNPbmx5T25lRmllbGQoSXNGdW5jLCBEc3RJbmhlcml0YW5jZSkpIHsKICAgICBEc3QgPSBGaXJzdEZpZWxkOwogICB9IGVsc2UgewogICAgIERzdCA9IGxsdm06OlVuZGVmVmFsdWU6OmdldChEc3ROdWxsLT5nZXRUeXBlKCkpOwogICAgIHVuc2lnbmVkIElkeCA9IDA7CiAgICAgRHN0ID0gQnVpbGRlci5DcmVhdGVJbnNlcnRWYWx1ZShEc3QsIEZpcnN0RmllbGQsIElkeCsrKTsKLSAgICBpZiAoaGFzTm9uVmlydHVhbEJhc2VBZGp1c3RtZW50RmllbGQoSXNGdW5jLCBEc3RJbmhlcml0YW5jZSkpCisgICAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNOVk9mZnNldEZpZWxkKElzRnVuYywgRHN0SW5oZXJpdGFuY2UpKQogICAgICAgRHN0ID0gQnVpbGRlci5DcmVhdGVJbnNlcnRWYWx1ZSgKICAgICAgICAgRHN0LCBnZXRWYWx1ZU9yWmVyb0ludChOb25WaXJ0dWFsQmFzZUFkanVzdG1lbnQpLCBJZHgrKyk7Ci0gICAgaWYgKGhhc1ZCUHRyT2Zmc2V0RmllbGQoRHN0SW5oZXJpdGFuY2UpKQorICAgIGlmIChNU0luaGVyaXRhbmNlQXR0cjo6aGFzVkJQdHJPZmZzZXRGaWVsZChEc3RJbmhlcml0YW5jZSkpCiAgICAgICBEc3QgPSBCdWlsZGVyLkNyZWF0ZUluc2VydFZhbHVlKAogICAgICAgICBEc3QsIGdldFZhbHVlT3JaZXJvSW50KFZCUHRyT2Zmc2V0KSwgSWR4KyspOwotICAgIGlmIChoYXNWaXJ0dWFsQmFzZUFkanVzdG1lbnRGaWVsZChEc3RJbmhlcml0YW5jZSkpCisgICAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlRhYmxlT2Zmc2V0RmllbGQoRHN0SW5oZXJpdGFuY2UpKQogICAgICAgRHN0ID0gQnVpbGRlci5DcmVhdGVJbnNlcnRWYWx1ZSgKICAgICAgICAgRHN0LCBnZXRWYWx1ZU9yWmVyb0ludChWaXJ0dWFsQmFzZUFkanVzdG1lbnRPZmZzZXQpLCBJZHgrKyk7CiAgIH0KQEAgLTE4MzMsOCArMTkxOSw4IEBACiAgIGlmIChFLT5nZXRDYXN0S2luZCgpID09IENLX1JlaW50ZXJwcmV0TWVtYmVyUG9pbnRlcikKICAgICByZXR1cm4gU3JjOwogCi0gIE1TSW5oZXJpdGFuY2VNb2RlbCBTcmNJbmhlcml0YW5jZSA9IGdldEluaGVyaXRhbmNlRnJvbU1lbXB0cihTcmNUeSk7Ci0gIE1TSW5oZXJpdGFuY2VNb2RlbCBEc3RJbmhlcml0YW5jZSA9IGdldEluaGVyaXRhbmNlRnJvbU1lbXB0cihEc3RUeSk7CisgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBTcmNJbmhlcml0YW5jZSA9IGdldEluaGVyaXRhbmNlRnJvbU1lbXB0cihTcmNUeSk7CisgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBEc3RJbmhlcml0YW5jZSA9IGdldEluaGVyaXRhbmNlRnJvbU1lbXB0cihEc3RUeSk7CiAKICAgLy8gRGVjb21wb3NlIHNyYy4KICAgbGx2bTo6Q29uc3RhbnQgKkZpcnN0RmllbGQgPSBTcmM7CkBAIC0xODQyLDE1ICsxOTI4LDE1IEBACiAgIGxsdm06OkNvbnN0YW50ICpWaXJ0dWFsQmFzZUFkanVzdG1lbnRPZmZzZXQgPSAwOwogICBsbHZtOjpDb25zdGFudCAqVkJQdHJPZmZzZXQgPSAwOwogICBib29sIElzRnVuYyA9IFNyY1R5LT5pc01lbWJlckZ1bmN0aW9uUG9pbnRlcigpOwotICBpZiAoIWhhc09ubHlPbmVGaWVsZChJc0Z1bmMsIFNyY0luaGVyaXRhbmNlKSkgeworICBpZiAoIU1TSW5oZXJpdGFuY2VBdHRyOjpoYXNPbmx5T25lRmllbGQoSXNGdW5jLCBTcmNJbmhlcml0YW5jZSkpIHsKICAgICAvLyBXZSBuZWVkIHRvIGV4dHJhY3QgdmFsdWVzLgogICAgIHVuc2lnbmVkIEkgPSAwOwogICAgIEZpcnN0RmllbGQgPSBTcmMtPmdldEFnZ3JlZ2F0ZUVsZW1lbnQoSSsrKTsKLSAgICBpZiAoaGFzTm9uVmlydHVhbEJhc2VBZGp1c3RtZW50RmllbGQoSXNGdW5jLCBTcmNJbmhlcml0YW5jZSkpCisgICAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNOVk9mZnNldEZpZWxkKElzRnVuYywgU3JjSW5oZXJpdGFuY2UpKQogICAgICAgTm9uVmlydHVhbEJhc2VBZGp1c3RtZW50ID0gU3JjLT5nZXRBZ2dyZWdhdGVFbGVtZW50KEkrKyk7Ci0gICAgaWYgKGhhc1ZCUHRyT2Zmc2V0RmllbGQoU3JjSW5oZXJpdGFuY2UpKQorICAgIGlmIChNU0luaGVyaXRhbmNlQXR0cjo6aGFzVkJQdHJPZmZzZXRGaWVsZChTcmNJbmhlcml0YW5jZSkpCiAgICAgICBWQlB0ck9mZnNldCA9IFNyYy0+Z2V0QWdncmVnYXRlRWxlbWVudChJKyspOwotICAgIGlmIChoYXNWaXJ0dWFsQmFzZUFkanVzdG1lbnRGaWVsZChTcmNJbmhlcml0YW5jZSkpCisgICAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlRhYmxlT2Zmc2V0RmllbGQoU3JjSW5oZXJpdGFuY2UpKQogICAgICAgVmlydHVhbEJhc2VBZGp1c3RtZW50T2Zmc2V0ID0gU3JjLT5nZXRBZ2dyZWdhdGVFbGVtZW50KEkrKyk7CiAgIH0KIApAQCAtMTg3MywzNSArMTk1OSwzMyBAQAogICAvLyBGSVhNRSBQUjE1NzEzOiBTdXBwb3J0IGNvbnZlcnNpb25zIHRocm91Z2ggdmlydHVhbGx5IGRlcml2ZWQgY2xhc3Nlcy4KIAogICAvLyBSZWNvbXBvc2UgZHN0IGZyb20gdGhlIG51bGwgc3RydWN0IGFuZCB0aGUgYWRqdXN0ZWQgZmllbGRzIGZyb20gc3JjLgotICBpZiAoaGFzT25seU9uZUZpZWxkKElzRnVuYywgRHN0SW5oZXJpdGFuY2UpKQorICBpZiAoTVNJbmhlcml0YW5jZUF0dHI6Omhhc09ubHlPbmVGaWVsZChJc0Z1bmMsIERzdEluaGVyaXRhbmNlKSkKICAgICByZXR1cm4gRmlyc3RGaWVsZDsKIAogICBsbHZtOjpTbWFsbFZlY3RvcjxsbHZtOjpDb25zdGFudCAqLCA0PiBGaWVsZHM7CiAgIEZpZWxkcy5wdXNoX2JhY2soRmlyc3RGaWVsZCk7Ci0gIGlmIChoYXNOb25WaXJ0dWFsQmFzZUFkanVzdG1lbnRGaWVsZChJc0Z1bmMsIERzdEluaGVyaXRhbmNlKSkKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNOVk9mZnNldEZpZWxkKElzRnVuYywgRHN0SW5oZXJpdGFuY2UpKQogICAgIEZpZWxkcy5wdXNoX2JhY2soZ2V0Q29uc3RhbnRPclplcm9JbnQoTm9uVmlydHVhbEJhc2VBZGp1c3RtZW50KSk7Ci0gIGlmIChoYXNWQlB0ck9mZnNldEZpZWxkKERzdEluaGVyaXRhbmNlKSkKKyAgaWYgKE1TSW5oZXJpdGFuY2VBdHRyOjpoYXNWQlB0ck9mZnNldEZpZWxkKERzdEluaGVyaXRhbmNlKSkKICAgICBGaWVsZHMucHVzaF9iYWNrKGdldENvbnN0YW50T3JaZXJvSW50KFZCUHRyT2Zmc2V0KSk7Ci0gIGlmIChoYXNWaXJ0dWFsQmFzZUFkanVzdG1lbnRGaWVsZChEc3RJbmhlcml0YW5jZSkpCisgIGlmIChNU0luaGVyaXRhbmNlQXR0cjo6aGFzVkJUYWJsZU9mZnNldEZpZWxkKERzdEluaGVyaXRhbmNlKSkKICAgICBGaWVsZHMucHVzaF9iYWNrKGdldENvbnN0YW50T3JaZXJvSW50KFZpcnR1YWxCYXNlQWRqdXN0bWVudE9mZnNldCkpOwogICByZXR1cm4gbGx2bTo6Q29uc3RhbnRTdHJ1Y3Q6OmdldEFub24oRmllbGRzKTsKIH0KIAotbGx2bTo6VmFsdWUgKgotTWljcm9zb2Z0Q1hYQUJJOjpFbWl0TG9hZE9mTWVtYmVyRnVuY3Rpb25Qb2ludGVyKENvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlIComVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqTWVtUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQpIHsKK2xsdm06OlZhbHVlICpNaWNyb3NvZnRDWFhBQkk6OkVtaXRMb2FkT2ZNZW1iZXJGdW5jdGlvblBvaW50ZXIoCisgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YsIGNvbnN0IEV4cHIgKkUsIGxsdm06OlZhbHVlIComVGhpcywKKyAgICBsbHZtOjpWYWx1ZSAqTWVtUHRyLCBjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUKSB7CiAgIGFzc2VydChNUFQtPmlzTWVtYmVyRnVuY3Rpb25Qb2ludGVyKCkpOwogICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0KICAgICBNUFQtPmdldFBvaW50ZWVUeXBlKCktPmNhc3RBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKLSAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQgPSBNUFQtPmdldENsYXNzKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOworICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IE1QVC0+Z2V0TW9zdFJlY2VudENYWFJlY29yZERlY2woKTsKICAgbGx2bTo6RnVuY3Rpb25UeXBlICpGVHkgPQogICAgIENHTS5nZXRUeXBlcygpLkdldEZ1bmN0aW9uVHlwZSgKICAgICAgIENHTS5nZXRUeXBlcygpLmFycmFuZ2VDWFhNZXRob2RUeXBlKFJELCBGUFQpKTsKICAgQ0dCdWlsZGVyVHkgJkJ1aWxkZXIgPSBDR0YuQnVpbGRlcjsKIAotICBNU0luaGVyaXRhbmNlTW9kZWwgSW5oZXJpdGFuY2UgPSBSRC0+Z2V0TVNJbmhlcml0YW5jZU1vZGVsKCk7CisgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBJbmhlcml0YW5jZSA9IFJELT5nZXRNU0luaGVyaXRhbmNlTW9kZWwoKTsKIAogICAvLyBFeHRyYWN0IHRoZSBmaWVsZHMgd2UgbmVlZCwgcmVnYXJkbGVzcyBvZiBtb2RlbC4gIFdlJ2xsIGFwcGx5IHRoZW0gaWYgd2UKICAgLy8gaGF2ZSB0aGVtLgpAQCAtMTkxMywxNiArMTk5NywxNiBAQAogICAgIC8vIFdlIG5lZWQgdG8gZXh0cmFjdCB2YWx1ZXMuCiAgICAgdW5zaWduZWQgSSA9IDA7CiAgICAgRnVuY3Rpb25Qb2ludGVyID0gQnVpbGRlci5DcmVhdGVFeHRyYWN0VmFsdWUoTWVtUHRyLCBJKyspOwotICAgIGlmIChoYXNOb25WaXJ0dWFsQmFzZUFkanVzdG1lbnRGaWVsZChNUFQsIEluaGVyaXRhbmNlKSkKKyAgICBpZiAoTVNJbmhlcml0YW5jZUF0dHI6Omhhc05WT2Zmc2V0RmllbGQoTVBULCBJbmhlcml0YW5jZSkpCiAgICAgICBOb25WaXJ0dWFsQmFzZUFkanVzdG1lbnQgPSBCdWlsZGVyLkNyZWF0ZUV4dHJhY3RWYWx1ZShNZW1QdHIsIEkrKyk7Ci0gICAgaWYgKGhhc1ZCUHRyT2Zmc2V0RmllbGQoSW5oZXJpdGFuY2UpKQorICAgIGlmIChNU0luaGVyaXRhbmNlQXR0cjo6aGFzVkJQdHJPZmZzZXRGaWVsZChJbmhlcml0YW5jZSkpCiAgICAgICBWQlB0ck9mZnNldCA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdFZhbHVlKE1lbVB0ciwgSSsrKTsKLSAgICBpZiAoaGFzVmlydHVhbEJhc2VBZGp1c3RtZW50RmllbGQoSW5oZXJpdGFuY2UpKQorICAgIGlmIChNU0luaGVyaXRhbmNlQXR0cjo6aGFzVkJUYWJsZU9mZnNldEZpZWxkKEluaGVyaXRhbmNlKSkKICAgICAgIFZpcnR1YWxCYXNlQWRqdXN0bWVudE9mZnNldCA9IEJ1aWxkZXIuQ3JlYXRlRXh0cmFjdFZhbHVlKE1lbVB0ciwgSSsrKTsKICAgfQogCiAgIGlmIChWaXJ0dWFsQmFzZUFkanVzdG1lbnRPZmZzZXQpIHsKLSAgICBUaGlzID0gQWRqdXN0VmlydHVhbEJhc2UoQ0dGLCBSRCwgVGhpcywgVmlydHVhbEJhc2VBZGp1c3RtZW50T2Zmc2V0LAorICAgIFRoaXMgPSBBZGp1c3RWaXJ0dWFsQmFzZShDR0YsIEUsIFJELCBUaGlzLCBWaXJ0dWFsQmFzZUFkanVzdG1lbnRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZCUHRyT2Zmc2V0KTsKICAgfQogCmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9NaWNyb3NvZnRWQlRhYmxlcy5jcHAgYi9saWIvQ29kZUdlbi9NaWNyb3NvZnRWQlRhYmxlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYmY1MmMuLjAwMDAwMDAKLS0tIGEvbGliL0NvZGVHZW4vTWljcm9zb2Z0VkJUYWJsZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8vPT09LS0tIE1pY3Jvc29mdFZCVGFibGVzLmNwcCAtIFZpcnR1YWwgQmFzZSBUYWJsZSBFbWlzc2lvbiAtLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBjbGFzcyBnZW5lcmF0ZXMgZGF0YSBhYm91dCBNU1ZDIHZpcnR1YWwgYmFzZSB0YWJsZXMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgIk1pY3Jvc29mdFZCVGFibGVzLmgiCi0jaW5jbHVkZSAiQ29kZUdlbk1vZHVsZS5oIgotI2luY2x1ZGUgIkNHQ1hYQUJJLmgiCi0KLW5hbWVzcGFjZSBjbGFuZyB7Ci1uYW1lc3BhY2UgQ29kZUdlbiB7Ci0KLS8vLyBIb2xkcyBpbnRlcm1lZGlhdGUgZGF0YSBhYm91dCBhIHBhdGggdG8gYSB2YnB0ciBpbnNpZGUgYSBiYXNlIHN1Ym9iamVjdC4KLXN0cnVjdCBWQlRhYmxlUGF0aCB7Ci0gIFZCVGFibGVQYXRoKGNvbnN0IFZCVGFibGVJbmZvICZWQkluZm8pCi0gICAgOiBWQkluZm8oVkJJbmZvKSwgTmV4dEJhc2UoVkJJbmZvLlZCUHRyU3Vib2JqZWN0LmdldEJhc2UoKSkgeyB9Ci0KLSAgLy8vIEFsbCB0aGUgZGF0YSBuZWVkZWQgdG8gYnVpbGQgYSB2YnRhYmxlLCBtaW51cyB0aGUgR2xvYmFsVmFyaWFibGUgd2hvc2UKLSAgLy8vIG5hbWUgd2UgaGF2ZW4ndCBjb21wdXRlZCB5ZXQuCi0gIFZCVGFibGVJbmZvIFZCSW5mbzsKLQotICAvLy8gTmV4dCBiYXNlIHRvIHVzZSBmb3IgZGlzYW1iaWd1YXRpb24uICBDYW4gYmUgbnVsbCBpZiB3ZSd2ZSBhbHJlYWR5Ci0gIC8vLyBkaXNhbWJpZ3VhdGVkIHRoaXMgcGF0aCBvbmNlLgotICBjb25zdCBDWFhSZWNvcmREZWNsICpOZXh0QmFzZTsKLQotICAvLy8gUGF0aCBpcyBub3QgcmVhbGx5IGEgZnVsbCBwYXRoIGxpa2UgYSBDWFhCYXNlUGF0aC4gIEl0IGhvbGRzIHRoZSBzdWJzZXQgb2YKLSAgLy8vIHJlY29yZHMgdGhhdCBuZWVkIHRvIGJlIG1hbmdsZWQgaW50byB0aGUgdmJ0YWJsZSBzeW1ib2wgbmFtZSBpbiBvcmRlciB0byBnZXQKLSAgLy8vIGEgdW5pcXVlIG5hbWUuCi0gIGxsdm06OlNtYWxsVmVjdG9yPGNvbnN0IENYWFJlY29yZERlY2wgKiwgMT4gUGF0aDsKLX07Ci0KLVZCVGFibGVCdWlsZGVyOjpWQlRhYmxlQnVpbGRlcihDb2RlR2VuTW9kdWxlICZDR00sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTW9zdERlcml2ZWQpCi0gICAgOiBDR00oQ0dNKSwgTW9zdERlcml2ZWQoTW9zdERlcml2ZWQpLAotICAgICAgRGVyaXZlZExheW91dChDR00uZ2V0Q29udGV4dCgpLmdldEFTVFJlY29yZExheW91dChNb3N0RGVyaXZlZCkpIHt9Ci0KLXZvaWQgVkJUYWJsZUJ1aWxkZXI6OmVudW1lcmF0ZVZCVGFibGVzKFZCVGFibGVWZWN0b3IgJlZCVGFibGVzKSB7Ci0gIFZCVGFibGVQYXRoVmVjdG9yIFBhdGhzOwotICBmaW5kVW5hbWJpZ3VvdXNQYXRocyhNb3N0RGVyaXZlZCwgQmFzZVN1Ym9iamVjdChNb3N0RGVyaXZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclVuaXRzOjpaZXJvKCkpLCBQYXRocyk7Ci0gIGZvciAoVkJUYWJsZVBhdGhWZWN0b3I6Oml0ZXJhdG9yIEkgPSBQYXRocy5iZWdpbigpLCBFID0gUGF0aHMuZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBWQlRhYmxlUGF0aCAqUCA9ICpJOwotICAgIFAtPlZCSW5mby5HViA9IGdldEFkZHJPZlZCVGFibGUoUC0+VkJJbmZvLlJldXNpbmdCYXNlLCBQLT5QYXRoKTsKLSAgICBWQlRhYmxlcy5wdXNoX2JhY2soUC0+VkJJbmZvKTsKLSAgfQotfQotCi0KLXZvaWQgVkJUYWJsZUJ1aWxkZXI6OmZpbmRVbmFtYmlndW91c1BhdGhzKGNvbnN0IENYWFJlY29yZERlY2wgKlJldXNpbmdCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVN1Ym9iamVjdCBDdXJTdWJvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQlRhYmxlUGF0aFZlY3RvciAmUGF0aHMpIHsKLSAgc2l6ZV90IFBhdGhzU3RhcnQgPSBQYXRocy5zaXplKCk7Ci0gIGJvb2wgUmV1c2VWQlB0ckZyb21CYXNlID0gdHJ1ZTsKLSAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQ3VyQmFzZSA9IEN1clN1Ym9iamVjdC5nZXRCYXNlKCk7Ci0gIGNvbnN0IEFTVFJlY29yZExheW91dCAmTGF5b3V0ID0gQ0dNLmdldENvbnRleHQoKS5nZXRBU1RSZWNvcmRMYXlvdXQoQ3VyQmFzZSk7Ci0KLSAgLy8gSWYgdGhpcyBiYXNlIGhhcyBhIHZicHRyLCB0aGVuIHdlJ3ZlIGZvdW5kIGEgcGF0aC4gIFRoZXNlIGFyZSBub3QgZnVsbAotICAvLyBwYXRocywgc28gd2UgZG9uJ3QgdXNlIENYWEJhc2VQYXRoLgotICBpZiAoTGF5b3V0Lmhhc093blZCUHRyKCkpIHsKLSAgICBSZXVzZVZCUHRyRnJvbUJhc2UgPSBmYWxzZTsKLSAgICBWQlRhYmxlUGF0aCAqSW5mbyA9IG5ldyBWQlRhYmxlUGF0aCgKLSAgICAgIFZCVGFibGVJbmZvKFJldXNpbmdCYXNlLCBDdXJTdWJvYmplY3QsIC8qR1Y9Ki8wKSk7Ci0gICAgUGF0aHMucHVzaF9iYWNrKEluZm8pOwotICB9Ci0KLSAgLy8gUmVjdXJzZSBvbnRvIGFueSBiYXNlcyB3aGljaCB0aGVtc2VsdmVzIGhhdmUgdmlydHVhbCBiYXNlcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBDdXJCYXNlLT5iYXNlc19iZWdpbigpLAotICAgICAgIEUgPSBDdXJCYXNlLT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlID0gSS0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKLSAgICBpZiAoIUJhc2UtPmdldE51bVZCYXNlcygpKQotICAgICAgY29udGludWU7ICAvLyBCYXNlcyB3aXRob3V0IHZpcnR1YWwgYmFzZXMgaGF2ZSBubyB2YnB0cnMuCi0gICAgQ2hhclVuaXRzIE5leHRPZmZzZXQ7Ci0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTmV4dFJldXNpbmdCYXNlID0gQmFzZTsKLSAgICBpZiAoSS0+aXNWaXJ0dWFsKCkpIHsKLSAgICAgIGlmICghVkJhc2VzU2Vlbi5pbnNlcnQoQmFzZSkpCi0gICAgICAgIGNvbnRpbnVlOyAgLy8gRG9uJ3QgdmlzaXQgdmlydHVhbCBiYXNlcyB0d2ljZS4KLSAgICAgIE5leHRPZmZzZXQgPSBEZXJpdmVkTGF5b3V0LmdldFZCYXNlQ2xhc3NPZmZzZXQoQmFzZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIE5leHRPZmZzZXQgPSAoQ3VyU3Vib2JqZWN0LmdldEJhc2VPZmZzZXQoKSArCi0gICAgICAgICAgICAgICAgICAgIExheW91dC5nZXRCYXNlQ2xhc3NPZmZzZXQoQmFzZSkpOwotCi0gICAgICAvLyBJZiBDdXJCYXNlIGRpZG4ndCBoYXZlIGEgdmJwdHIsIHRoZW4gUmV1c2luZ0Jhc2Ugd2lsbCByZXVzZSB0aGUgdmJwdHIKLSAgICAgIC8vIGZyb20gdGhlIGZpcnN0IG5vbi12aXJ0dWFsIGJhc2Ugd2l0aCB2YmFzZXMgZm9yIGl0cyB2YnB0ci4KLSAgICAgIGlmIChSZXVzZVZCUHRyRnJvbUJhc2UpIHsKLSAgICAgICAgTmV4dFJldXNpbmdCYXNlID0gUmV1c2luZ0Jhc2U7Ci0gICAgICAgIFJldXNlVkJQdHJGcm9tQmFzZSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIHNpemVfdCBOdW1QYXRocyA9IFBhdGhzLnNpemUoKTsKLSAgICBmaW5kVW5hbWJpZ3VvdXNQYXRocyhOZXh0UmV1c2luZ0Jhc2UsIEJhc2VTdWJvYmplY3QoQmFzZSwgTmV4dE9mZnNldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGF0aHMpOwotCi0gICAgLy8gVGFnIHBhdGhzIHRocm91Z2ggdGhpcyBiYXNlIHdpdGggdGhlIGJhc2UgaXRzZWxmLiAgV2UgbWlnaHQgdXNlIGl0IHRvCi0gICAgLy8gZGlzYW1iaWd1YXRlLgotICAgIGZvciAoc2l6ZV90IEkgPSBOdW1QYXRocywgRSA9IFBhdGhzLnNpemUoKTsgSSAhPSBFOyArK0kpCi0gICAgICBQYXRoc1tJXS0+TmV4dEJhc2UgPSBCYXNlOwotICB9Ci0KLSAgYm9vbCBBbWJpZ3VvdXNQYXRocyA9IHJlYnVja2V0UGF0aHMoUGF0aHMsIFBhdGhzU3RhcnQpOwotICBpZiAoQW1iaWd1b3VzUGF0aHMpCi0gICAgcmVidWNrZXRQYXRocyhQYXRocywgUGF0aHNTdGFydCwgLypTZWNvbmRQYXNzPSovdHJ1ZSk7Ci0KLSNpZm5kZWYgTkRFQlVHCi0gIC8vIENoZWNrIHRoYXQgdGhlIHBhdGhzIGFyZSBpbiBmYWN0IHVuaXF1ZS4KLSAgZm9yIChzaXplX3QgSSA9IFBhdGhzU3RhcnQgKyAxLCBFID0gUGF0aHMuc2l6ZSgpOyBJICE9IEU7ICsrSSkgewotICAgIGFzc2VydChQYXRoc1tJXS0+UGF0aCAhPSBQYXRoc1tJIC0gMV0tPlBhdGggJiYgInZidGFibGUgcGF0aHMgYXJlIG5vdCB1bmlxdWUiKTsKLSAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyBib29sIHBhdGhDb21wYXJlKFZCVGFibGVQYXRoICpMSFMsIFZCVGFibGVQYXRoICpSSFMpIHsKLSAgcmV0dXJuIExIUy0+UGF0aCA8IFJIUy0+UGF0aDsKLX0KLQotdm9pZCBWQlRhYmxlQnVpbGRlcjo6ZXh0ZW5kUGF0aChWQlRhYmxlUGF0aCAqUCwgYm9vbCBTZWNvbmRQYXNzKSB7Ci0gIGFzc2VydChQLT5OZXh0QmFzZSB8fCBTZWNvbmRQYXNzKTsKLSAgaWYgKFAtPk5leHRCYXNlKSB7Ci0gICAgUC0+UGF0aC5wdXNoX2JhY2soUC0+TmV4dEJhc2UpOwotICAgIFAtPk5leHRCYXNlID0gMDsgIC8vIFByZXZlbnQgdGhlIHBhdGggZnJvbSBiZWluZyBleHRlbmRlZCB0d2ljZS4KLSAgfQotfQotCi1ib29sIFZCVGFibGVCdWlsZGVyOjpyZWJ1Y2tldFBhdGhzKFZCVGFibGVQYXRoVmVjdG9yICZQYXRocywgc2l6ZV90IFBhdGhzU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2Vjb25kUGFzcykgewotICAvLyBXaGF0IHdlJ3JlIGVzc2VudGlhbGx5IGRvaW5nIGhlcmUgaXMgYnVja2V0aW5nIHRvZ2V0aGVyIGFtYmlndW91cyBwYXRocy4KLSAgLy8gQW55IGJ1Y2tldCB3aXRoIG1vcmUgdGhhbiBvbmUgcGF0aCBpbiBpdCBnZXRzIGV4dGVuZGVkIGJ5IE5leHRCYXNlLCB3aGljaAotICAvLyBpcyB1c3VhbGx5IHRoZSBkaXJlY3QgYmFzZSBvZiB0aGUgaW5oZXJpdGVkIHRoZSB2YnB0ci4gIFRoaXMgY29kZSB1c2VzIGEKLSAgLy8gc29ydGVkIHZlY3RvciB0byBpbXBsZW1lbnQgYSBtdWx0aXNldCB0byBmb3JtIHRoZSBidWNrZXRzLiAgTm90ZSB0aGF0IHRoZQotICAvLyBvcmRlcmluZyBpcyBiYXNlZCBvbiBwb2ludGVycywgYnV0IGl0IGRvZXNuJ3QgY2hhbmdlIG91ciBvdXRwdXQgb3JkZXIuICBUaGUKLSAgLy8gY3VycmVudCBhbGdvcml0aG0gaXMgZGVzaWduZWQgdG8gbWF0Y2ggTVNWQyAyMDEyJ3MgbmFtZXMuCi0gIC8vIFRPRE86IEltcGxlbWVudCBNU1ZDIDIwMTAgb3IgZWFybGllciBuYW1lcyB0byBhdm9pZCBleHRyYSB2YnRhYmxlIGNydWZ0LgotICBWQlRhYmxlUGF0aFZlY3RvciBQYXRoc1NvcnRlZCgmUGF0aHNbUGF0aHNTdGFydF0sICZQYXRocy5iYWNrKCkgKyAxKTsKLSAgc3RkOjpzb3J0KFBhdGhzU29ydGVkLmJlZ2luKCksIFBhdGhzU29ydGVkLmVuZCgpLCBwYXRoQ29tcGFyZSk7Ci0gIGJvb2wgQW1iaWd1b3VzUGF0aHMgPSBmYWxzZTsKLSAgZm9yIChzaXplX3QgSSA9IDAsIEUgPSBQYXRoc1NvcnRlZC5zaXplKCk7IEkgIT0gRTspIHsKLSAgICAvLyBTY2FuIGZvcndhcmQgdG8gZmluZCB0aGUgZW5kIG9mIHRoZSBidWNrZXQuCi0gICAgc2l6ZV90IEJ1Y2tldFN0YXJ0ID0gSTsKLSAgICBkbyB7Ci0gICAgICArK0k7Ci0gICAgfSB3aGlsZSAoSSAhPSBFICYmIFBhdGhzU29ydGVkW0J1Y2tldFN0YXJ0XS0+UGF0aCA9PSBQYXRoc1NvcnRlZFtJXS0+UGF0aCk7Ci0KLSAgICAvLyBJZiB0aGlzIGJ1Y2tldCBoYXMgbXVsdGlwbGUgcGF0aHMsIGV4dGVuZCB0aGVtIGFsbC4KLSAgICBpZiAoSSAtIEJ1Y2tldFN0YXJ0ID4gMSkgewotICAgICAgQW1iaWd1b3VzUGF0aHMgPSB0cnVlOwotICAgICAgZm9yIChzaXplX3QgSUkgPSBCdWNrZXRTdGFydDsgSUkgIT0gSTsgKytJSSkKLSAgICAgICAgZXh0ZW5kUGF0aChQYXRoc1NvcnRlZFtJSV0sIFNlY29uZFBhc3MpOwotICAgIH0KLSAgfQotICByZXR1cm4gQW1iaWd1b3VzUGF0aHM7Ci19Ci0KLWxsdm06Okdsb2JhbFZhcmlhYmxlICoKLVZCVGFibGVCdWlsZGVyOjpnZXRBZGRyT2ZWQlRhYmxlKGNvbnN0IENYWFJlY29yZERlY2wgKlJldXNpbmdCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgQ1hYUmVjb3JkRGVjbCAqPiBCYXNlUGF0aCkgewotICAvLyBDYWNoaW5nIGF0IHRoaXMgbGF5ZXIgaXMgcmVkdW5kYW50IHdpdGggdGhlIGNhY2hpbmcgaW4gRW51bWVyYXRlVkJUYWJsZXMoKS4KLQotICBTbWFsbFN0cmluZzwyNTY+IE91dE5hbWU7Ci0gIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gT3V0KE91dE5hbWUpOwotICBNaWNyb3NvZnRNYW5nbGVDb250ZXh0ICZNYW5nbGVyID0KLSAgICAgIGNhc3Q8TWljcm9zb2Z0TWFuZ2xlQ29udGV4dD4oQ0dNLmdldENYWEFCSSgpLmdldE1hbmdsZUNvbnRleHQoKSk7Ci0gIE1hbmdsZXIubWFuZ2xlQ1hYVkJUYWJsZShNb3N0RGVyaXZlZCwgQmFzZVBhdGgsIE91dCk7Ci0gIE91dC5mbHVzaCgpOwotICBTdHJpbmdSZWYgTmFtZSA9IE91dE5hbWUuc3RyKCk7Ci0KLSAgbGx2bTo6QXJyYXlUeXBlICpWQlRhYmxlVHlwZSA9Ci0gICAgbGx2bTo6QXJyYXlUeXBlOjpnZXQoQ0dNLkludFR5LCAxICsgUmV1c2luZ0Jhc2UtPmdldE51bVZCYXNlcygpKTsKLQotICBhc3NlcnQoIUNHTS5nZXRNb2R1bGUoKS5nZXROYW1lZEdsb2JhbChOYW1lKSAmJgotICAgICAgICAgInZidGFibGUgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHM6IG1hbmdsaW5nIGJ1Zz8iKTsKLSAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKlZCVGFibGUgPQotICAgIENHTS5DcmVhdGVPclJlcGxhY2VDWFhSdW50aW1lVmFyaWFibGUoTmFtZSwgVkJUYWJsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlKTsKLSAgVkJUYWJsZS0+c2V0VW5uYW1lZEFkZHIodHJ1ZSk7Ci0gIHJldHVybiBWQlRhYmxlOwotfQotCi12b2lkIFZCVGFibGVJbmZvOjpFbWl0VkJUYWJsZURlZmluaXRpb24oCi0gICAgQ29kZUdlbk1vZHVsZSAmQ0dNLCBjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKLSAgICBsbHZtOjpHbG9iYWxWYXJpYWJsZTo6TGlua2FnZVR5cGVzIExpbmthZ2UpIGNvbnN0IHsKLSAgYXNzZXJ0KFJELT5nZXROdW1WQmFzZXMoKSAmJiBSZXVzaW5nQmFzZS0+Z2V0TnVtVkJhc2VzKCkgJiYKLSAgICAgICAgICJzaG91bGQgb25seSBlbWl0IHZidGFibGVzIGZvciBjbGFzc2VzIHdpdGggdmJ0YWJsZXMiKTsKLQotICBjb25zdCBBU1RSZWNvcmRMYXlvdXQgJkJhc2VMYXlvdXQgPQotICAgIENHTS5nZXRDb250ZXh0KCkuZ2V0QVNUUmVjb3JkTGF5b3V0KFZCUHRyU3Vib2JqZWN0LmdldEJhc2UoKSk7Ci0gIGNvbnN0IEFTVFJlY29yZExheW91dCAmRGVyaXZlZExheW91dCA9Ci0gICAgQ0dNLmdldENvbnRleHQoKS5nZXRBU1RSZWNvcmRMYXlvdXQoUkQpOwotCi0gIFNtYWxsVmVjdG9yPGxsdm06OkNvbnN0YW50ICosIDQ+IE9mZnNldHMoMSArIFJldXNpbmdCYXNlLT5nZXROdW1WQmFzZXMoKSwgMCk7Ci0KLSAgLy8gVGhlIG9mZnNldCBmcm9tIFJldXNpbmdCYXNlJ3MgdmJwdHIgdG8gaXRzZWxmIGFsd2F5cyBsZWFkcy4KLSAgQ2hhclVuaXRzIFZCUHRyT2Zmc2V0ID0gQmFzZUxheW91dC5nZXRWQlB0ck9mZnNldCgpOwotICBPZmZzZXRzWzBdID0gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChDR00uSW50VHksIC1WQlB0ck9mZnNldC5nZXRRdWFudGl0eSgpKTsKLQotICBNaWNyb3NvZnRWVGFibGVDb250ZXh0ICZDb250ZXh0ID0gQ0dNLmdldE1pY3Jvc29mdFZUYWJsZUNvbnRleHQoKTsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSZXVzaW5nQmFzZS0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IFJldXNpbmdCYXNlLT52YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqVkJhc2UgPSBJLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOwotICAgIENoYXJVbml0cyBPZmZzZXQgPSBEZXJpdmVkTGF5b3V0LmdldFZCYXNlQ2xhc3NPZmZzZXQoVkJhc2UpOwotICAgIGFzc2VydCghT2Zmc2V0LmlzTmVnYXRpdmUoKSk7Ci0gICAgLy8gTWFrZSBpdCByZWxhdGl2ZSB0byB0aGUgc3Vib2JqZWN0IHZicHRyLgotICAgIE9mZnNldCAtPSBWQlB0clN1Ym9iamVjdC5nZXRCYXNlT2Zmc2V0KCkgKyBWQlB0ck9mZnNldDsKLSAgICB1bnNpZ25lZCBWQkluZGV4ID0gQ29udGV4dC5nZXRWQlRhYmxlSW5kZXgoUmV1c2luZ0Jhc2UsIFZCYXNlKTsKLSAgICBhc3NlcnQoT2Zmc2V0c1tWQkluZGV4XSA9PSAwICYmICJUaGUgc2FtZSB2YmluZGV4IHNlZW4gdHdpY2U/Iik7Ci0gICAgT2Zmc2V0c1tWQkluZGV4XSA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dNLkludFR5LCBPZmZzZXQuZ2V0UXVhbnRpdHkoKSk7Ci0gIH0KLQotICBhc3NlcnQoT2Zmc2V0cy5zaXplKCkgPT0KLSAgICAgICAgIGNhc3Q8bGx2bTo6QXJyYXlUeXBlPihjYXN0PGxsdm06OlBvaW50ZXJUeXBlPihHVi0+Z2V0VHlwZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0RWxlbWVudFR5cGUoKSktPmdldE51bUVsZW1lbnRzKCkpOwotICBsbHZtOjpBcnJheVR5cGUgKlZCVGFibGVUeXBlID0KLSAgICBsbHZtOjpBcnJheVR5cGU6OmdldChDR00uSW50VHksIE9mZnNldHMuc2l6ZSgpKTsKLSAgbGx2bTo6Q29uc3RhbnQgKkluaXQgPSBsbHZtOjpDb25zdGFudEFycmF5OjpnZXQoVkJUYWJsZVR5cGUsIE9mZnNldHMpOwotICBHVi0+c2V0SW5pdGlhbGl6ZXIoSW5pdCk7Ci0KLSAgLy8gU2V0IHRoZSBjb3JyZWN0IGxpbmthZ2UuCi0gIEdWLT5zZXRMaW5rYWdlKExpbmthZ2UpOwotCi0gIC8vIFNldCB0aGUgcmlnaHQgdmlzaWJpbGl0eS4KLSAgQ0dNLnNldFR5cGVWaXNpYmlsaXR5KEdWLCBSRCwgQ29kZUdlbk1vZHVsZTo6VFZLX0ZvclZUYWJsZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIENvZGVHZW4KLX0gLy8gbmFtZXNwYWNlIGNsYW5nCmRpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9NaWNyb3NvZnRWQlRhYmxlcy5oIGIvbGliL0NvZGVHZW4vTWljcm9zb2Z0VkJUYWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkOGUwNy4uMDAwMDAwMAotLS0gYS9saWIvQ29kZUdlbi9NaWNyb3NvZnRWQlRhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vPT09LS0tIE1pY3Jvc29mdFZCVGFibGVzLmggLSBWaXJ0dWFsIEJhc2UgVGFibGUgRW1pc3Npb24gLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBjbGFzcyBnZW5lcmF0ZXMgZGF0YSBhYm91dCBNU1ZDIHZpcnR1YWwgYmFzZSB0YWJsZXMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLQotI2luY2x1ZGUgImNsYW5nL0FTVC9CYXNlU3Vib2JqZWN0LmgiCi0jaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgotI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKLSNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhcmlhYmxlLmgiCi0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgY2xhbmcgewotCi1jbGFzcyBBU1RSZWNvcmRMYXlvdXQ7Ci0KLW5hbWVzcGFjZSBDb2RlR2VuIHsKLQotY2xhc3MgQ29kZUdlbk1vZHVsZTsKLQotc3RydWN0IFZCVGFibGVJbmZvIHsKLSAgVkJUYWJsZUluZm8oY29uc3QgQ1hYUmVjb3JkRGVjbCAqUmV1c2luZ0Jhc2UsIEJhc2VTdWJvYmplY3QgVkJQdHJTdWJvYmplY3QsCi0gICAgICAgICAgICAgIGxsdm06Okdsb2JhbFZhcmlhYmxlICpHVikKLSAgICA6IFJldXNpbmdCYXNlKFJldXNpbmdCYXNlKSwgVkJQdHJTdWJvYmplY3QoVkJQdHJTdWJvYmplY3QpLCBHVihHVikgeyB9Ci0KLSAgLy8vIFRoZSB2YnRhYmxlIHdpbGwgaG9sZCBhbGwgb2YgdGhlIHZpcnR1YWwgYmFzZXMgb2YgUmV1c2luZ0Jhc2UuICBUaGlzIG1heQotICAvLy8gb3IgbWF5IG5vdCBiZSB0aGUgc2FtZSBjbGFzcyBhcyBWQlB0clN1Ym9iamVjdC5CYXNlLiAgQSBkZXJpdmVkIGNsYXNzIHdpbGwKLSAgLy8vIHJldXNlIHRoZSB2YnB0ciBvZiB0aGUgZmlyc3Qgbm9uLXZpcnR1YWwgYmFzZSBzdWJvYmplY3QgdGhhdCBoYXMgb25lLgotICBjb25zdCBDWFhSZWNvcmREZWNsICpSZXVzaW5nQmFzZTsKLQotICAvLy8gVGhlIHZicHRyIGlzIHN0b3JlZCBpbnNpZGUgdGhpcyBzdWJvYmplY3QuCi0gIEJhc2VTdWJvYmplY3QgVkJQdHJTdWJvYmplY3Q7Ci0KLSAgLy8vIFRoZSBHbG9iYWxWYXJpYWJsZSBmb3IgdGhpcyB2YnRhYmxlLgotICBsbHZtOjpHbG9iYWxWYXJpYWJsZSAqR1Y7Ci0KLSAgLy8vIFxicmllZiBFbWl0cyBhIGRlZmluaXRpb24gZm9yIEdWIGJ5IHNldHRpbmcgaXQncyBpbml0aWFsaXplci4KLSAgdm9pZCBFbWl0VkJUYWJsZURlZmluaXRpb24oQ29kZUdlbk1vZHVsZSAmQ0dNLCBjb25zdCBDWFhSZWNvcmREZWNsICpSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6R2xvYmFsVmFyaWFibGU6OkxpbmthZ2VUeXBlcyBMaW5rYWdlKSBjb25zdDsKLX07Ci0KLS8vIFRoZXNlIGFyZSBlbWJlZGRlZCBpbiBhIERlbnNlTWFwIGFuZCB0aGUgZWxlbWVudHMgYXJlIGxhcmdlLCBzbyB3ZSBkb24ndCB3YW50Ci0vLyBTbWFsbFZlY3Rvci4KLXR5cGVkZWYgc3RkOjp2ZWN0b3I8VkJUYWJsZUluZm8+IFZCVGFibGVWZWN0b3I7Ci0KLXN0cnVjdCBWQlRhYmxlUGF0aDsKLQotdHlwZWRlZiBsbHZtOjpTbWFsbFZlY3RvcjxWQlRhYmxlUGF0aCAqLCA2PiBWQlRhYmxlUGF0aFZlY3RvcjsKLQotLy8vIFByb2R1Y2VzIE1TVkMtY29tcGF0aWJsZSB2YnRhYmxlIGRhdGEuICBUaGUgc3ltYm9scyBwcm9kdWNlZCBieSB0aGlzIGJ1aWxkZXIKLS8vLyBtYXRjaCB0aG9zZSBwcm9kdWNlZCBieSBNU1ZDIDIwMTIsIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIE1TVkMgMjAxMC4KLS8vLwotLy8vIFVubGlrZSBJdGFuaXVtLCB3aGljaCB1c2VzIG9ubHkgb25lIHZ0YWJsZSBwZXIgY2xhc3MsIE1TVkMgdXNlcyBhIGRpZmZlcmVudAotLy8vIHN5bWJvbCBmb3IgZXZlcnkgImFkZHJlc3MgcG9pbnQiIGluc3RhbGxlZCBpbiBiYXNlIHN1Ym9iamVjdHMuICBBcyBhIHJlc3VsdCwKLS8vLyB3ZSBoYXZlIHRvIGNvbXB1dGUgdW5pcXVlIHN5bWJvbHMgZm9yIGV2ZXJ5IHRhYmxlLiAgU2luY2UgdGhlcmUgY2FuIGJlCi0vLy8gbXVsdGlwbGUgbm9uLXZpcnR1YWwgYmFzZSBzdWJvYmplY3RzIG9mIHRoZSBzYW1lIGNsYXNzLCBjb21iaW5pbmcgdGhlIG1vc3QKLS8vLyBkZXJpdmVkIGNsYXNzIHdpdGggdGhlIGJhc2UgY29udGFpbmluZyB0aGUgdnRhYmxlIGlzIGluc3VmZmljaWVudC4gIFRoZSBtb3N0Ci0vLy8gdHJpdmlhbCBhbGdvcml0aG0gd291bGQgYmUgdG8gbWFuZ2xlIGluIHRoZSBlbnRpcmUgcGF0aCBmcm9tIGJhc2UgdG8gbW9zdAotLy8vIGRlcml2ZWQsIGJ1dCB0aGF0IHdvdWxkIGJlIHRvbyBlYXN5IGFuZCB3b3VsZCBjcmVhdGUgdW5uZWNlc3NhcmlseSBsYXJnZQotLy8vIHN5bWJvbHMuICA7KQotLy8vCi0vLy8gTVNWQyAyMDEyIGFwcGVhcnMgdG8gbWluaW1pemUgdGhlIHZidGFibGUgbmFtZXMgdXNpbmcgdGhlIGZvbGxvd2luZwotLy8vIGFsZ29yaXRobS4gIEZpcnN0LCB3YWxrIHRoZSBjbGFzcyBoaWVyYXJjaHkgaW4gdGhlIHVzdWFsIG9yZGVyLCBkZXB0aCBmaXJzdCwKLS8vLyBsZWZ0IHRvIHJpZ2h0LCB0byBmaW5kIGFsbCBvZiB0aGUgc3Vib2JqZWN0cyB3aGljaCBjb250YWluIGEgdmJwdHIgZmllbGQuCi0vLy8gVmlzaXRpbmcgZWFjaCBjbGFzcyBub2RlIHlpZWxkcyBhIGxpc3Qgb2YgaW5oZXJpdGFuY2UgcGF0aHMgdG8gdmJwdHJzLiAgRWFjaAotLy8vIHJlY29yZCB3aXRoIGEgdmJwdHIgY3JlYXRlcyBhbiBpbml0aWFsbHkgZW1wdHkgcGF0aC4KLS8vLwotLy8vIFRvIGNvbWJpbmUgcGF0aHMgZnJvbSBjaGlsZCBub2RlcywgdGhlIHBhdGhzIGFyZSBjb21wYXJlZCB0byBjaGVjayBmb3IKLS8vLyBhbWJpZ3VpdHkuICBQYXRocyBhcmUgImFtYmlndW91cyIgaWYgbXVsdGlwbGUgcGF0aHMgaGF2ZSB0aGUgc2FtZSBzZXQgb2YKLS8vLyBjb21wb25lbnRzIGluIHRoZSBzYW1lIG9yZGVyLiAgRWFjaCBncm91cCBvZiBhbWJpZ3VvdXMgcGF0aHMgaXMgZXh0ZW5kZWQgYnkKLS8vLyBhcHBlbmRpbmcgdGhlIGNsYXNzIG9mIHRoZSBiYXNlIGZyb20gd2hpY2ggaXQgY2FtZS4gIElmIHRoZSBjdXJyZW50IGNsYXNzCi0vLy8gbm9kZSBwcm9kdWNlZCBhbiBhbWJpZ3VvdXMgcGF0aCwgaXRzIHBhdGggaXMgZXh0ZW5kZWQgd2l0aCB0aGUgY3VycmVudCBjbGFzcy4KLS8vLyBBZnRlciBleHRlbmRpbmcgcGF0aHMsIE1TVkMgYWdhaW4gY2hlY2tzIGZvciBhbWJpZ3VpdHksIGFuZCBleHRlbmRzIGFueQotLy8vIGFtYmlndW91cyBwYXRoIHdoaWNoIHdhc24ndCBhbHJlYWR5IGV4dGVuZGVkLiAgQmVjYXVzZSBlYWNoIG5vZGUgeWllbGRzIGFuCi0vLy8gdW5hbWJpZ3VvdXMgc2V0IG9mIHBhdGhzLCBNU1ZDIGRvZXNuJ3QgbmVlZCB0byBleHRlbmQgYW55IHBhdGggbW9yZSB0aGFuIG9uY2UKLS8vLyB0byBwcm9kdWNlIGFuIHVuYW1iaWd1b3VzIHNldCBvZiBwYXRocy4KLS8vLwotLy8vIFRoZSBWQlRhYmxlQnVpbGRlciBjbGFzcyBhdHRlbXB0cyB0byBpbXBsZW1lbnQgdGhpcyBhbGdvcml0aG0gYnkgcmVwZWF0ZWRseQotLy8vIGJ1Y2tldGluZyBwYXRocyB0b2dldGhlciBieSBzb3J0aW5nIHRoZW0uCi0vLy8KLS8vLyBUT0RPOiBQcmVzdW1hYmx5IHZmdGFibGVzIHVzZSB0aGUgc2FtZSBhbGdvcml0aG0uCi0vLy8KLS8vLyBUT0RPOiBJbXBsZW1lbnQgdGhlIE1TVkMgMjAxMCBuYW1lIG1hbmdsaW5nIHNjaGVtZSB0byBhdm9pZCBlbWl0dGluZwotLy8vIGR1cGxpY2F0ZSB2YnRhYmxlcyB3aXRoIGRpZmZlcmVudCBzeW1ib2xzLgotY2xhc3MgVkJUYWJsZUJ1aWxkZXIgewotcHVibGljOgotICBWQlRhYmxlQnVpbGRlcihDb2RlR2VuTW9kdWxlICZDR00sIGNvbnN0IENYWFJlY29yZERlY2wgKk1vc3REZXJpdmVkKTsKLQotICB2b2lkIGVudW1lcmF0ZVZCVGFibGVzKFZCVGFibGVWZWN0b3IgJlZCVGFibGVzKTsKLQotcHJpdmF0ZToKLSAgYm9vbCBoYXNWQlB0cihjb25zdCBDWFhSZWNvcmREZWNsICpSRCk7Ci0KLSAgbGx2bTo6R2xvYmFsVmFyaWFibGUgKmdldEFkZHJPZlZCVGFibGUoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUmV1c2luZ0Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IENYWFJlY29yZERlY2wgKj4gQmFzZVBhdGgpOwotCi0gIC8vLyBFbnVtZXJhdGVzIHBhdGhzIHRvIGJhc2VzIHdpdGggdmJwdHJzLiAgVGhlIHBhdGhzIGVsZW1lbnRzIGFyZSBjb21wcmVzc2VkCi0gIC8vLyB0byBjb250YWluIG9ubHkgdGhlIGNsYXNzZXMgbmVjZXNzYXJ5IHRvIGZvcm0gYW4gdW5hbWJpZ3VvdXMgcGF0aC4KLSAgdm9pZCBmaW5kVW5hbWJpZ3VvdXNQYXRocyhjb25zdCBDWFhSZWNvcmREZWNsICpSZXVzaW5nQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlU3Vib2JqZWN0IEN1clN1Ym9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQlRhYmxlUGF0aFZlY3RvciAmUGF0aHMpOwotCi0gIHZvaWQgZXh0ZW5kUGF0aChWQlRhYmxlUGF0aCAqSW5mbywgYm9vbCBTZWNvbmRQYXNzKTsKLQotICBib29sIHJlYnVja2V0UGF0aHMoVkJUYWJsZVBhdGhWZWN0b3IgJlBhdGhzLCBzaXplX3QgUGF0aHNTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2Vjb25kUGFzcyA9IGZhbHNlKTsKLQotICBDb2RlR2VuTW9kdWxlICZDR007Ci0KLSAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqTW9zdERlcml2ZWQ7Ci0KLSAgLy8vIENhY2hlcyB0aGUgbGF5b3V0IG9mIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MuCi0gIGNvbnN0IEFTVFJlY29yZExheW91dCAmRGVyaXZlZExheW91dDsKLQotICAvLy8gU2V0IG9mIHZiYXNlcyB0byBhdm9pZCByZS12aXNpdGluZyB0aGUgc2FtZSB2YmFzZXMuCi0gIGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IENYWFJlY29yZERlY2wqLCA0PiBWQmFzZXNTZWVuOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgQ29kZUdlbgotCi19IC8vIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vTW9kdWxlQnVpbGRlci5jcHAgYi9saWIvQ29kZUdlbi9Nb2R1bGVCdWlsZGVyLmNwcAppbmRleCBiYzdhY2JjLi43ODczZjQ0IDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9Nb2R1bGVCdWlsZGVyLmNwcAorKysgYi9saWIvQ29kZUdlbi9Nb2R1bGVCdWlsZGVyLmNwcApAQCAtMTIsMzAgKzEyLDMxIEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiAjaW5jbHVkZSAiY2xhbmcvQ29kZUdlbi9Nb2R1bGVCdWlsZGVyLmgiCi0jaW5jbHVkZSAiQ29kZUdlbk1vZHVsZS5oIgogI2luY2x1ZGUgIkNHRGVidWdJbmZvLmgiCisjaW5jbHVkZSAiQ29kZUdlbk1vZHVsZS5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xPYmpDLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIgogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0NvZGVHZW5PcHRpb25zLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCiAjaW5jbHVkZSAibGx2bS9JUi9EYXRhTGF5b3V0LmgiCiAjaW5jbHVkZSAibGx2bS9JUi9MTFZNQ29udGV4dC5oIgogI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogCiBuYW1lc3BhY2UgewogICBjbGFzcyBDb2RlR2VuZXJhdG9ySW1wbCA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3M7Ci0gICAgT3duaW5nUHRyPGNvbnN0IGxsdm06OkRhdGFMYXlvdXQ+IFREOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBsbHZtOjpEYXRhTGF5b3V0PiBURDsKICAgICBBU1RDb250ZXh0ICpDdHg7CiAgICAgY29uc3QgQ29kZUdlbk9wdGlvbnMgQ29kZUdlbk9wdHM7ICAvLyBJbnRlbnRpb25hbGx5IGNvcGllZCBpbi4KICAgcHJvdGVjdGVkOgotICAgIE93bmluZ1B0cjxsbHZtOjpNb2R1bGU+IE07Ci0gICAgT3duaW5nUHRyPENvZGVHZW46OkNvZGVHZW5Nb2R1bGU+IEJ1aWxkZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1vZHVsZT4gTTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29kZUdlbjo6Q29kZUdlbk1vZHVsZT4gQnVpbGRlcjsKKwogICBwdWJsaWM6CiAgICAgQ29kZUdlbmVyYXRvckltcGwoRGlhZ25vc3RpY3NFbmdpbmUgJmRpYWdzLCBjb25zdCBzdGQ6OnN0cmluZyYgTW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlR2VuT3B0aW9ucyAmQ0dPLCBsbHZtOjpMTFZNQ29udGV4dCYgQykKQEAgLTQ0LDE1ICs0NSwxMyBAQAogCiAgICAgdmlydHVhbCB+Q29kZUdlbmVyYXRvckltcGwoKSB7fQogCi0gICAgdmlydHVhbCBsbHZtOjpNb2R1bGUqIEdldE1vZHVsZSgpIHsKKyAgICBsbHZtOjpNb2R1bGUqIEdldE1vZHVsZSgpIG92ZXJyaWRlIHsKICAgICAgIHJldHVybiBNLmdldCgpOwogICAgIH0KIAotICAgIHZpcnR1YWwgbGx2bTo6TW9kdWxlKiBSZWxlYXNlTW9kdWxlKCkgewotICAgICAgcmV0dXJuIE0udGFrZSgpOwotICAgIH0KKyAgICBsbHZtOjpNb2R1bGUgKlJlbGVhc2VNb2R1bGUoKSBvdmVycmlkZSB7IHJldHVybiBNLnJlbGVhc2UoKTsgfQogCi0gICAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoQVNUQ29udGV4dCAmQ29udGV4dCkgeworICAgIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDb250ZXh0KSBvdmVycmlkZSB7CiAgICAgICBDdHggPSAmQ29udGV4dDsKIAogICAgICAgTS0+c2V0VGFyZ2V0VHJpcGxlKEN0eC0+Z2V0VGFyZ2V0SW5mbygpLmdldFRyaXBsZSgpLmdldFRyaXBsZSgpKTsKQEAgLTY1LDE0ICs2NCwxNCBAQAogICAgICAgICBIYW5kbGVEZXBlbmRlbnRMaWJyYXJ5KENvZGVHZW5PcHRzLkRlcGVuZGVudExpYnJhcmllc1tpXSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIEhhbmRsZUNYWFN0YXRpY01lbWJlclZhckluc3RhbnRpYXRpb24oVmFyRGVjbCAqVkQpIHsKKyAgICB2b2lkIEhhbmRsZUNYWFN0YXRpY01lbWJlclZhckluc3RhbnRpYXRpb24oVmFyRGVjbCAqVkQpIG92ZXJyaWRlIHsKICAgICAgIGlmIChEaWFncy5oYXNFcnJvck9jY3VycmVkKCkpCiAgICAgICAgIHJldHVybjsKIAogICAgICAgQnVpbGRlci0+SGFuZGxlQ1hYU3RhdGljTWVtYmVyVmFySW5zdGFudGlhdGlvbihWRCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIEhhbmRsZVRvcExldmVsRGVjbChEZWNsR3JvdXBSZWYgREcpIHsKKyAgICBib29sIEhhbmRsZVRvcExldmVsRGVjbChEZWNsR3JvdXBSZWYgREcpIG92ZXJyaWRlIHsKICAgICAgIGlmIChEaWFncy5oYXNFcnJvck9jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCkBAIC04Niw3ICs4NSw3IEBACiAgICAgLy8vIHRvIChlLmcuIHN0cnVjdCwgdW5pb24sIGVudW0sIGNsYXNzKSBpcyBjb21wbGV0ZWQuIFRoaXMgYWxsb3dzIHRoZQogICAgIC8vLyBjbGllbnQgaGFjayBvbiB0aGUgdHlwZSwgd2hpY2ggY2FuIG9jY3VyIGF0IGFueSBwb2ludCBpbiB0aGUgZmlsZQogICAgIC8vLyAoYmVjYXVzZSB0aGVzZSBjYW4gYmUgZGVmaW5lZCBpbiBkZWNsc3BlY3MpLgotICAgIHZpcnR1YWwgdm9pZCBIYW5kbGVUYWdEZWNsRGVmaW5pdGlvbihUYWdEZWNsICpEKSB7CisgICAgdm9pZCBIYW5kbGVUYWdEZWNsRGVmaW5pdGlvbihUYWdEZWNsICpEKSBvdmVycmlkZSB7CiAgICAgICBpZiAoRGlhZ3MuaGFzRXJyb3JPY2N1cnJlZCgpKQogICAgICAgICByZXR1cm47CiAKQEAgLTk1LDEwICs5NCw4IEBACiAgICAgICAvLyBJbiBDKyssIHdlIG1heSBoYXZlIG1lbWJlciBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGVtaXR0ZWQgYXQgdGhpcyAKICAgICAgIC8vIHBvaW50LgogICAgICAgaWYgKEN0eC0+Z2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMgJiYgIUQtPmlzRGVwZW5kZW50Q29udGV4dCgpKSB7Ci0gICAgICAgIGZvciAoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgTSA9IEQtPmRlY2xzX2JlZ2luKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FbmQgPSBELT5kZWNsc19lbmQoKTsKLSAgICAgICAgICAgICBNICE9IE1FbmQ7ICsrTSkKLSAgICAgICAgICBpZiAoQ1hYTWV0aG9kRGVjbCAqTWV0aG9kID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4oKk0pKQorICAgICAgICBmb3IgKGF1dG8gKk0gOiBELT5kZWNscygpKQorICAgICAgICAgIGlmIChhdXRvICpNZXRob2QgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPihNKSkKICAgICAgICAgICAgIGlmIChNZXRob2QtPmRvZXNUaGlzRGVjbGFyYXRpb25IYXZlQUJvZHkoKSAmJgogICAgICAgICAgICAgICAgIChNZXRob2QtPmhhc0F0dHI8VXNlZEF0dHI+KCkgfHwgCiAgICAgICAgICAgICAgICAgIE1ldGhvZC0+aGFzQXR0cjxDb25zdHJ1Y3RvckF0dHI+KCkpKQpAQCAtMTA2LDcgKzEwMyw3IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIEhhbmRsZVRhZ0RlY2xSZXF1aXJlZERlZmluaXRpb24oY29uc3QgVGFnRGVjbCAqRCkgTExWTV9PVkVSUklERSB7CisgICAgdm9pZCBIYW5kbGVUYWdEZWNsUmVxdWlyZWREZWZpbml0aW9uKGNvbnN0IFRhZ0RlY2wgKkQpIG92ZXJyaWRlIHsKICAgICAgIGlmIChEaWFncy5oYXNFcnJvck9jY3VycmVkKCkpCiAgICAgICAgIHJldHVybjsKIApAQCAtMTE1LDggKzExMiwxMCBAQAogICAgICAgICAgIERJLT5jb21wbGV0ZVJlcXVpcmVkVHlwZShSRCk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDdHgpIHsKKyAgICB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDdHgpIG92ZXJyaWRlIHsKICAgICAgIGlmIChEaWFncy5oYXNFcnJvck9jY3VycmVkKCkpIHsKKyAgICAgICAgaWYgKEJ1aWxkZXIpCisgICAgICAgICAgQnVpbGRlci0+Y2xlYXIoKTsKICAgICAgICAgTS5yZXNldCgpOwogICAgICAgICByZXR1cm47CiAgICAgICB9CkBAIC0xMjUsMzAgKzEyNCwzMCBAQAogICAgICAgICBCdWlsZGVyLT5SZWxlYXNlKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIENvbXBsZXRlVGVudGF0aXZlRGVmaW5pdGlvbihWYXJEZWNsICpEKSB7CisgICAgdm9pZCBDb21wbGV0ZVRlbnRhdGl2ZURlZmluaXRpb24oVmFyRGVjbCAqRCkgb3ZlcnJpZGUgewogICAgICAgaWYgKERpYWdzLmhhc0Vycm9yT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgICBCdWlsZGVyLT5FbWl0VGVudGF0aXZlRGVmaW5pdGlvbihEKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgSGFuZGxlVlRhYmxlKENYWFJlY29yZERlY2wgKlJELCBib29sIERlZmluaXRpb25SZXF1aXJlZCkgeworICAgIHZvaWQgSGFuZGxlVlRhYmxlKENYWFJlY29yZERlY2wgKlJELCBib29sIERlZmluaXRpb25SZXF1aXJlZCkgb3ZlcnJpZGUgewogICAgICAgaWYgKERpYWdzLmhhc0Vycm9yT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgICBCdWlsZGVyLT5FbWl0VlRhYmxlKFJELCBEZWZpbml0aW9uUmVxdWlyZWQpOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBIYW5kbGVMaW5rZXJPcHRpb25QcmFnbWEobGx2bTo6U3RyaW5nUmVmIE9wdHMpIHsKKyAgICB2b2lkIEhhbmRsZUxpbmtlck9wdGlvblByYWdtYShsbHZtOjpTdHJpbmdSZWYgT3B0cykgb3ZlcnJpZGUgewogICAgICAgQnVpbGRlci0+QXBwZW5kTGlua2VyT3B0aW9ucyhPcHRzKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgSGFuZGxlRGV0ZWN0TWlzbWF0Y2gobGx2bTo6U3RyaW5nUmVmIE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBWYWx1ZSkgeworICAgIHZvaWQgSGFuZGxlRGV0ZWN0TWlzbWF0Y2gobGx2bTo6U3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgVmFsdWUpIG92ZXJyaWRlIHsKICAgICAgIEJ1aWxkZXItPkFkZERldGVjdE1pc21hdGNoKE5hbWUsIFZhbHVlKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgSGFuZGxlRGVwZW5kZW50TGlicmFyeShsbHZtOjpTdHJpbmdSZWYgTGliKSB7CisgICAgdm9pZCBIYW5kbGVEZXBlbmRlbnRMaWJyYXJ5KGxsdm06OlN0cmluZ1JlZiBMaWIpIG92ZXJyaWRlIHsKICAgICAgIEJ1aWxkZXItPkFkZERlcGVuZGVudExpYihMaWIpOwogICAgIH0KICAgfTsKZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL1RhcmdldEluZm8uY3BwIGIvbGliL0NvZGVHZW4vVGFyZ2V0SW5mby5jcHAKaW5kZXggNzQ0NmU2Ny4uYzYwMmIxZiAxMDA2NDQKLS0tIGEvbGliL0NvZGVHZW4vVGFyZ2V0SW5mby5jcHAKKysrIGIvbGliL0NvZGVHZW4vVGFyZ2V0SW5mby5jcHAKQEAgLTExNCw2ICsxMTQsOSBAQAogICBjYXNlIElnbm9yZToKICAgICBPUyA8PCAiSWdub3JlIjsKICAgICBicmVhazsKKyAgY2FzZSBJbkFsbG9jYToKKyAgICBPUyA8PCAiSW5BbGxvY2EgT2Zmc2V0PSIgPDwgZ2V0SW5BbGxvY2FGaWVsZEluZGV4KCk7CisgICAgYnJlYWs7CiAgIGNhc2UgSW5kaXJlY3Q6CiAgICAgT1MgPDwgIkluZGlyZWN0IEFsaWduPSIgPDwgZ2V0SW5kaXJlY3RBbGlnbigpCiAgICAgICAgPDwgIiBCeVZhbD0iIDw8IGdldEluZGlyZWN0QnlWYWwoKQpAQCAtMjA2LDE0ICsyMDksMTIgQEAKIAogICAvLyBJZiB0aGlzIGlzIGEgQysrIHJlY29yZCwgY2hlY2sgdGhlIGJhc2VzIGZpcnN0LgogICBpZiAoY29uc3QgQ1hYUmVjb3JkRGVjbCAqQ1hYUkQgPSBkeW5fY2FzdDxDWFhSZWNvcmREZWNsPihSRCkpCi0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIGkgPSBDWFhSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgZSA9IENYWFJELT5iYXNlc19lbmQoKTsgaSAhPSBlOyArK2kpCi0gICAgICBpZiAoIWlzRW1wdHlSZWNvcmQoQ29udGV4dCwgaS0+Z2V0VHlwZSgpLCB0cnVlKSkKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBDWFhSRC0+YmFzZXMoKSkKKyAgICAgIGlmICghaXNFbXB0eVJlY29yZChDb250ZXh0LCBJLmdldFR5cGUoKSwgdHJ1ZSkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIGkgPSBSRC0+ZmllbGRfYmVnaW4oKSwgZSA9IFJELT5maWVsZF9lbmQoKTsKLSAgICAgICAgIGkgIT0gZTsgKytpKQotICAgIGlmICghaXNFbXB0eUZpZWxkKENvbnRleHQsICppLCBBbGxvd0FycmF5cykpCisgIGZvciAoY29uc3QgYXV0byAqSSA6IFJELT5maWVsZHMoKSkKKyAgICBpZiAoIWlzRW1wdHlGaWVsZChDb250ZXh0LCBJLCBBbGxvd0FycmF5cykpCiAgICAgICByZXR1cm4gZmFsc2U7CiAgIHJldHVybiB0cnVlOwogfQpAQCAtMjM5LDEwICsyNDAsOSBAQAogCiAgIC8vIElmIHRoaXMgaXMgYSBDKysgcmVjb3JkLCBjaGVjayB0aGUgYmFzZXMgZmlyc3QuCiAgIGlmIChjb25zdCBDWFhSZWNvcmREZWNsICpDWFhSRCA9IGR5bl9jYXN0PENYWFJlY29yZERlY2w+KFJEKSkgewotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBpID0gQ1hYUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgIGUgPSBDWFhSRC0+YmFzZXNfZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogQ1hYUkQtPmJhc2VzKCkpIHsKICAgICAgIC8vIElnbm9yZSBlbXB0eSByZWNvcmRzLgotICAgICAgaWYgKGlzRW1wdHlSZWNvcmQoQ29udGV4dCwgaS0+Z2V0VHlwZSgpLCB0cnVlKSkKKyAgICAgIGlmIChpc0VtcHR5UmVjb3JkKENvbnRleHQsIEkuZ2V0VHlwZSgpLCB0cnVlKSkKICAgICAgICAgY29udGludWU7CiAKICAgICAgIC8vIElmIHdlIGFscmVhZHkgZm91bmQgYW4gZWxlbWVudCB0aGVuIHRoaXMgaXNuJ3QgYSBzaW5nbGUtZWxlbWVudCBzdHJ1Y3QuCkBAIC0yNTEsMTYgKzI1MSwxNCBAQAogCiAgICAgICAvLyBJZiB0aGlzIGlzIG5vbi1lbXB0eSBhbmQgbm90IGEgc2luZ2xlIGVsZW1lbnQgc3RydWN0LCB0aGUgY29tcG9zaXRlCiAgICAgICAvLyBjYW5ub3QgYmUgYSBzaW5nbGUgZWxlbWVudCBzdHJ1Y3QuCi0gICAgICBGb3VuZCA9IGlzU2luZ2xlRWxlbWVudFN0cnVjdChpLT5nZXRUeXBlKCksIENvbnRleHQpOworICAgICAgRm91bmQgPSBpc1NpbmdsZUVsZW1lbnRTdHJ1Y3QoSS5nZXRUeXBlKCksIENvbnRleHQpOwogICAgICAgaWYgKCFGb3VuZCkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9CiAKICAgLy8gQ2hlY2sgZm9yIHNpbmdsZSBlbGVtZW50LgotICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIGkgPSBSRC0+ZmllbGRfYmVnaW4oKSwgZSA9IFJELT5maWVsZF9lbmQoKTsKLSAgICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgY29uc3QgRmllbGREZWNsICpGRCA9ICppOworICBmb3IgKGNvbnN0IGF1dG8gKkZEIDogUkQtPmZpZWxkcygpKSB7CiAgICAgUXVhbFR5cGUgRlQgPSBGRC0+Z2V0VHlwZSgpOwogCiAgICAgLy8gSWdub3JlIGVtcHR5IGZpZWxkcy4KQEAgLTMzNiwxMCArMzM0LDcgQEAKIAogICB1aW50NjRfdCBTaXplID0gMDsKIAotICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIGkgPSBSRC0+ZmllbGRfYmVnaW4oKSwgZSA9IFJELT5maWVsZF9lbmQoKTsKLSAgICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgY29uc3QgRmllbGREZWNsICpGRCA9ICppOwotCisgIGZvciAoY29uc3QgYXV0byAqRkQgOiBSRC0+ZmllbGRzKCkpIHsKICAgICBpZiAoIWlzMzJPcjY0Qml0QmFzaWNUeXBlKEZELT5nZXRUeXBlKCksIENvbnRleHQpKQogICAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC0zNzEsMTUgKzM2NiwxNCBAQAogICBBQklBcmdJbmZvIGNsYXNzaWZ5UmV0dXJuVHlwZShRdWFsVHlwZSBSZXRUeSkgY29uc3Q7CiAgIEFCSUFyZ0luZm8gY2xhc3NpZnlBcmd1bWVudFR5cGUoUXVhbFR5cGUgUmV0VHkpIGNvbnN0OwogCi0gIHZpcnR1YWwgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IHsKKyAgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBGSS5nZXRSZXR1cm5JbmZvKCkgPSBjbGFzc2lmeVJldHVyblR5cGUoRkkuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICBmb3IgKENHRnVuY3Rpb25JbmZvOjphcmdfaXRlcmF0b3IgaXQgPSBGSS5hcmdfYmVnaW4oKSwgaWUgPSBGSS5hcmdfZW5kKCk7Ci0gICAgICAgICBpdCAhPSBpZTsgKytpdCkKLSAgICAgIGl0LT5pbmZvID0gY2xhc3NpZnlBcmd1bWVudFR5cGUoaXQtPnR5cGUpOworICAgIGZvciAoYXV0byAmSSA6IEZJLmFyZ3VtZW50cygpKQorICAgICAgSS5pbmZvID0gY2xhc3NpZnlBcmd1bWVudFR5cGUoSS50eXBlKTsKICAgfQogCi0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgUXVhbFR5cGUgVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRikgY29uc3Q7CisgIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIGNsYXNzIERlZmF1bHRUYXJnZXRDb2RlR2VuSW5mbyA6IHB1YmxpYyBUYXJnZXRDb2RlR2VuSW5mbyB7CkBAIC0zOTUsNyArMzg5LDcgQEAKIAogQUJJQXJnSW5mbyBEZWZhdWx0QUJJSW5mbzo6Y2xhc3NpZnlBcmd1bWVudFR5cGUoUXVhbFR5cGUgVHkpIGNvbnN0IHsKICAgaWYgKGlzQWdncmVnYXRlVHlwZUZvckFCSShUeSkpIHsKLSAgICAvLyBSZWNvcmRzIHdpdGggbm9uIHRyaXZpYWwgZGVzdHJ1Y3RvcnMvY29uc3RydWN0b3JzIHNob3VsZCBub3QgYmUgcGFzc2VkCisgICAgLy8gUmVjb3JkcyB3aXRoIG5vbi10cml2aWFsIGRlc3RydWN0b3JzL2NvbnN0cnVjdG9ycyBzaG91bGQgbm90IGJlIHBhc3NlZAogICAgIC8vIGJ5IHZhbHVlLgogICAgIGlmIChpc1JlY29yZFJldHVybkluZGlyZWN0KFR5LCBnZXRDWFhBQkkoKSkpCiAgICAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SW5kaXJlY3QoMCwgLypCeVZhbD0qL2ZhbHNlKTsKQEAgLTQ0MCw5ICs0MzQsOSBAQAogICBBQklBcmdJbmZvIGNsYXNzaWZ5UmV0dXJuVHlwZShRdWFsVHlwZSBSZXRUeSkgY29uc3Q7CiAgIEFCSUFyZ0luZm8gY2xhc3NpZnlBcmd1bWVudFR5cGUoUXVhbFR5cGUgUmV0VHkpIGNvbnN0OwogCi0gIHZpcnR1YWwgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0OwotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0OworICB2b2lkIGNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3Qgb3ZlcnJpZGU7CisgIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIGNsYXNzIFBOYUNsVGFyZ2V0Q29kZUdlbkluZm8gOiBwdWJsaWMgVGFyZ2V0Q29kZUdlbkluZm8gewpAQCAtNDU0LDkgKzQ0OCw4IEBACiB2b2lkIFBOYUNsQUJJSW5mbzo6Y29tcHV0ZUluZm8oQ0dGdW5jdGlvbkluZm8gJkZJKSBjb25zdCB7CiAgICAgRkkuZ2V0UmV0dXJuSW5mbygpID0gY2xhc3NpZnlSZXR1cm5UeXBlKEZJLmdldFJldHVyblR5cGUoKSk7CiAKLSAgICBmb3IgKENHRnVuY3Rpb25JbmZvOjphcmdfaXRlcmF0b3IgaXQgPSBGSS5hcmdfYmVnaW4oKSwgaWUgPSBGSS5hcmdfZW5kKCk7Ci0gICAgICAgICBpdCAhPSBpZTsgKytpdCkKLSAgICAgIGl0LT5pbmZvID0gY2xhc3NpZnlBcmd1bWVudFR5cGUoaXQtPnR5cGUpOworICAgIGZvciAoYXV0byAmSSA6IEZJLmFyZ3VtZW50cygpKQorICAgICAgSS5pbmZvID0gY2xhc3NpZnlBcmd1bWVudFR5cGUoSS50eXBlKTsKICAgfQogCiBsbHZtOjpWYWx1ZSAqUE5hQ2xBQklJbmZvOjpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LApAQCAtNTI2LDYgKzUxOSwxNiBAQAogLy8gWDg2LTMyIEFCSSBJbXBsZW1lbnRhdGlvbgogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAorLy8vIFxicmllZiBTaW1pbGFyIHRvIGxsdm06OkNDU3RhdGUsIGJ1dCBmb3IgQ2xhbmcuCitzdHJ1Y3QgQ0NTdGF0ZSB7CisgIENDU3RhdGUodW5zaWduZWQgQ0MpIDogQ0MoQ0MpLCBGcmVlUmVncygwKSB7fQorCisgIHVuc2lnbmVkIENDOworICB1bnNpZ25lZCBGcmVlUmVnczsKKyAgdW5zaWduZWQgU3RhY2tPZmZzZXQ7CisgIGJvb2wgVXNlSW5BbGxvY2E7Cit9OworCiAvLy8gWDg2XzMyQUJJSW5mbyAtIFRoZSBYODYtMzIgQUJJIGluZm9ybWF0aW9uLgogY2xhc3MgWDg2XzMyQUJJSW5mbyA6IHB1YmxpYyBBQklJbmZvIHsKICAgZW51bSBDbGFzcyB7CkBAIC01NDQsMzAgKzU0NywzNyBAQAogICAgIHJldHVybiAoU2l6ZSA9PSA4IHx8IFNpemUgPT0gMTYgfHwgU2l6ZSA9PSAzMiB8fCBTaXplID09IDY0KTsKICAgfQogCi0gIHN0YXRpYyBib29sIHNob3VsZFJldHVyblR5cGVJblJlZ2lzdGVyKFF1YWxUeXBlIFR5LCBBU1RDb250ZXh0ICZDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNhbGxpbmdDb252ZW50aW9uKTsKKyAgYm9vbCBzaG91bGRSZXR1cm5UeXBlSW5SZWdpc3RlcihRdWFsVHlwZSBUeSwgQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW5zdGFuY2VNZXRob2QpIGNvbnN0OwogCiAgIC8vLyBnZXRJbmRpcmVjdFJlc3VsdCAtIEdpdmUgYSBzb3VyY2UgdHlwZSBcYXJnIFR5LCByZXR1cm4gYSBzdWl0YWJsZSByZXN1bHQKICAgLy8vIHN1Y2ggdGhhdCB0aGUgYXJndW1lbnQgd2lsbCBiZSBwYXNzZWQgaW4gbWVtb3J5LgotICBBQklBcmdJbmZvIGdldEluZGlyZWN0UmVzdWx0KFF1YWxUeXBlIFR5LCBib29sIEJ5VmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZGcmVlUmVncykgY29uc3Q7CisgIEFCSUFyZ0luZm8gZ2V0SW5kaXJlY3RSZXN1bHQoUXVhbFR5cGUgVHksIGJvb2wgQnlWYWwsIENDU3RhdGUgJlN0YXRlKSBjb25zdDsKKworICBBQklBcmdJbmZvIGdldEluZGlyZWN0UmV0dXJuUmVzdWx0KENDU3RhdGUgJlN0YXRlKSBjb25zdDsKIAogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYWxpZ25tZW50IHRvIHVzZSBmb3IgdGhlIGdpdmVuIHR5cGUgb24gdGhlIHN0YWNrLgogICB1bnNpZ25lZCBnZXRUeXBlU3RhY2tBbGlnbkluQnl0ZXMoUXVhbFR5cGUgVHksIHVuc2lnbmVkIEFsaWduKSBjb25zdDsKIAogICBDbGFzcyBjbGFzc2lmeShRdWFsVHlwZSBUeSkgY29uc3Q7Ci0gIEFCSUFyZ0luZm8gY2xhc3NpZnlSZXR1cm5UeXBlKFF1YWxUeXBlIFJldFR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjYWxsaW5nQ29udmVudGlvbikgY29uc3Q7Ci0gIEFCSUFyZ0luZm8gY2xhc3NpZnlBcmd1bWVudFR5cGUoUXVhbFR5cGUgUmV0VHksIHVuc2lnbmVkICZGcmVlUmVncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRmFzdENhbGwpIGNvbnN0OwotICBib29sIHNob3VsZFVzZUluUmVnKFF1YWxUeXBlIFR5LCB1bnNpZ25lZCAmRnJlZVJlZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0Zhc3RDYWxsLCBib29sICZOZWVkc1BhZGRpbmcpIGNvbnN0OworICBBQklBcmdJbmZvIGNsYXNzaWZ5UmV0dXJuVHlwZShRdWFsVHlwZSBSZXRUeSwgQ0NTdGF0ZSAmU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbnN0YW5jZU1ldGhvZCkgY29uc3Q7CisgIEFCSUFyZ0luZm8gY2xhc3NpZnlBcmd1bWVudFR5cGUoUXVhbFR5cGUgUmV0VHksIENDU3RhdGUgJlN0YXRlKSBjb25zdDsKKyAgYm9vbCBzaG91bGRVc2VJblJlZyhRdWFsVHlwZSBUeSwgQ0NTdGF0ZSAmU3RhdGUsIGJvb2wgJk5lZWRzUGFkZGluZykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXdyaXRlIHRoZSBmdW5jdGlvbiBpbmZvIHNvIHRoYXQgYWxsIG1lbW9yeSBhcmd1bWVudHMgdXNlCisgIC8vLyBpbmFsbG9jYS4KKyAgdm9pZCByZXdyaXRlV2l0aEluQWxsb2NhKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3Q7CisKKyAgdm9pZCBhZGRGaWVsZFRvQXJnU3RydWN0KFNtYWxsVmVjdG9yPGxsdm06OlR5cGUgKiwgNj4gJkZyYW1lRmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlN0YWNrT2Zmc2V0LCBBQklBcmdJbmZvICZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVHlwZSkgY29uc3Q7CiAKIHB1YmxpYzoKIAotICB2aXJ0dWFsIHZvaWQgY29tcHV0ZUluZm8oQ0dGdW5jdGlvbkluZm8gJkZJKSBjb25zdDsKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqRW1pdFZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdDsKKyAgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IG92ZXJyaWRlOworICBsbHZtOjpWYWx1ZSAqRW1pdFZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRikgY29uc3Qgb3ZlcnJpZGU7CiAKICAgWDg2XzMyQUJJSW5mbyhDb2RlR2VuOjpDb2RlR2VuVHlwZXMgJkNHVCwgYm9vbCBkLCBib29sIHAsIGJvb2wgdywKICAgICAgICAgICAgICAgICB1bnNpZ25lZCByKQpAQCAtNTg1LDI0ICs1OTUsMjUgQEAKICAgICAgIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLCBjb25zdCBDb2RlR2VuT3B0aW9ucyAmT3B0cyk7CiAKICAgdm9pZCBTZXRUYXJnZXRBdHRyaWJ1dGVzKGNvbnN0IERlY2wgKkQsIGxsdm06Okdsb2JhbFZhbHVlICpHViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJkNHTSkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZDR00pIGNvbnN0IG92ZXJyaWRlOwogCi0gIGludCBnZXREd2FyZkVIU3RhY2tQb2ludGVyKENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJkNHTSkgY29uc3QgeworICBpbnQgZ2V0RHdhcmZFSFN0YWNrUG9pbnRlcihDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZDR00pIGNvbnN0IG92ZXJyaWRlIHsKICAgICAvLyBEYXJ3aW4gdXNlcyBkaWZmZXJlbnQgZHdhcmYgcmVnaXN0ZXIgbnVtYmVycyBmb3IgRUguCiAgICAgaWYgKENHTS5nZXRUYXJnZXQoKS5nZXRUcmlwbGUoKS5pc09TRGFyd2luKCkpIHJldHVybiA1OwogICAgIHJldHVybiA0OwogICB9CiAKICAgYm9vbCBpbml0RHdhcmZFSFJlZ1NpemVUYWJsZShDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQWRkcmVzcykgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkFkZHJlc3MpIGNvbnN0IG92ZXJyaWRlOwogCiAgIGxsdm06OlR5cGUqIGFkanVzdElubGluZUFzbVR5cGUoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvbnN0cmFpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VHlwZSogVHkpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpUeXBlKiBUeSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBYODZBZGp1c3RJbmxpbmVBc21UeXBlKENHRiwgQ29uc3RyYWludCwgVHkpOwogICB9CiAKLSAgbGx2bTo6Q29uc3RhbnQgKmdldFVCU2FuRnVuY3Rpb25TaWduYXR1cmUoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmQ0dNKSBjb25zdCB7CisgIGxsdm06OkNvbnN0YW50ICoKKyAgZ2V0VUJTYW5GdW5jdGlvblNpZ25hdHVyZShDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZDR00pIGNvbnN0IG92ZXJyaWRlIHsKICAgICB1bnNpZ25lZCBTaWcgPSAoMHhlYiA8PCAwKSB8ICAvLyBqbXAgcmVsOAogICAgICAgICAgICAgICAgICAgICgweDA2IDw8IDgpIHwgIC8vICAgICAgICAgICAuKzB4MDgKICAgICAgICAgICAgICAgICAgICAoJ0YnIDw8IDE2KSB8CkBAIC02MTYsOSArNjI3LDggQEAKIAogLy8vIHNob3VsZFJldHVyblR5cGVJblJlZ2lzdGVyIC0gRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiB0eXBlIHNob3VsZCBiZQogLy8vIHBhc3NlZCBpbiBhIHJlZ2lzdGVyIChmb3IgdGhlIERhcndpbiBBQkkpLgotYm9vbCBYODZfMzJBQklJbmZvOjpzaG91bGRSZXR1cm5UeXBlSW5SZWdpc3RlcihRdWFsVHlwZSBUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUQ29udGV4dCAmQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2FsbGluZ0NvbnZlbnRpb24pIHsKK2Jvb2wgWDg2XzMyQUJJSW5mbzo6c2hvdWxkUmV0dXJuVHlwZUluUmVnaXN0ZXIoUXVhbFR5cGUgVHksIEFTVENvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbnN0YW5jZU1ldGhvZCkgY29uc3QgewogICB1aW50NjRfdCBTaXplID0gQ29udGV4dC5nZXRUeXBlU2l6ZShUeSk7CiAKICAgLy8gVHlwZSBtdXN0IGJlIHJlZ2lzdGVyIHNpemVkLgpAQCAtNjQ0LDcgKzY1NCw3IEBACiAgIC8vIEFycmF5cyBhcmUgdHJlYXRlZCBsaWtlIHJlY29yZHMuCiAgIGlmIChjb25zdCBDb25zdGFudEFycmF5VHlwZSAqQVQgPSBDb250ZXh0LmdldEFzQ29uc3RhbnRBcnJheVR5cGUoVHkpKQogICAgIHJldHVybiBzaG91bGRSZXR1cm5UeXBlSW5SZWdpc3RlcihBVC0+Z2V0RWxlbWVudFR5cGUoKSwgQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ0NvbnZlbnRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0luc3RhbmNlTWV0aG9kKTsKIAogICAvLyBPdGhlcndpc2UsIGl0IG11c3QgYmUgYSByZWNvcmQgdHlwZS4KICAgY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBUeS0+Z2V0QXM8UmVjb3JkVHlwZT4oKTsKQEAgLTY1NCwzMSArNjY0LDM1IEBACiAKICAgLy8gRm9yIHRoaXNjYWxsIGNvbnZlbnRpb25zLCBzdHJ1Y3R1cmVzIHdpbGwgbmV2ZXIgYmUgcmV0dXJuZWQgaW4KICAgLy8gYSByZWdpc3Rlci4gIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTVNWQyBBQkkKLSAgaWYgKGNhbGxpbmdDb252ZW50aW9uID09IGxsdm06OkNhbGxpbmdDb252OjpYODZfVGhpc0NhbGwgJiYgCi0gICAgICBSVC0+aXNTdHJ1Y3R1cmVUeXBlKCkpIHsKKyAgaWYgKElzV2luMzJTdHJ1Y3RBQkkgJiYgSXNJbnN0YW5jZU1ldGhvZCAmJiBSVC0+aXNTdHJ1Y3R1cmVUeXBlKCkpCiAgICAgcmV0dXJuIGZhbHNlOwotICB9CiAKICAgLy8gU3RydWN0dXJlIHR5cGVzIGFyZSBwYXNzZWQgaW4gcmVnaXN0ZXIgaWYgYWxsIGZpZWxkcyB3b3VsZCBiZQogICAvLyBwYXNzZWQgaW4gYSByZWdpc3Rlci4KLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBpID0gUlQtPmdldERlY2woKS0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgIGUgPSBSVC0+Z2V0RGVjbCgpLT5maWVsZF9lbmQoKTsgaSAhPSBlOyArK2kpIHsKLSAgICBjb25zdCBGaWVsZERlY2wgKkZEID0gKmk7Ci0KKyAgZm9yIChjb25zdCBhdXRvICpGRCA6IFJULT5nZXREZWNsKCktPmZpZWxkcygpKSB7CiAgICAgLy8gRW1wdHkgZmllbGRzIGFyZSBpZ25vcmVkLgogICAgIGlmIChpc0VtcHR5RmllbGQoQ29udGV4dCwgRkQsIHRydWUpKQogICAgICAgY29udGludWU7CiAKICAgICAvLyBDaGVjayBmaWVsZHMgcmVjdXJzaXZlbHkuCi0gICAgaWYgKCFzaG91bGRSZXR1cm5UeXBlSW5SZWdpc3RlcihGRC0+Z2V0VHlwZSgpLCBDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdDb252ZW50aW9uKSkKKyAgICBpZiAoIXNob3VsZFJldHVyblR5cGVJblJlZ2lzdGVyKEZELT5nZXRUeXBlKCksIENvbnRleHQsIElzSW5zdGFuY2VNZXRob2QpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIHJldHVybiB0cnVlOwogfQogCi1BQklBcmdJbmZvIFg4Nl8zMkFCSUluZm86OmNsYXNzaWZ5UmV0dXJuVHlwZShRdWFsVHlwZSBSZXRUeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNhbGxpbmdDb252ZW50aW9uKSBjb25zdCB7CitBQklBcmdJbmZvIFg4Nl8zMkFCSUluZm86OmdldEluZGlyZWN0UmV0dXJuUmVzdWx0KENDU3RhdGUgJlN0YXRlKSBjb25zdCB7CisgIC8vIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgaW5kaXJlY3QsIHRoZW4gdGhlIGhpZGRlbiBhcmd1bWVudCBpcyBjb25zdW1pbmcgb25lCisgIC8vIGludGVnZXIgcmVnaXN0ZXIuCisgIGlmIChTdGF0ZS5GcmVlUmVncykgeworICAgIC0tU3RhdGUuRnJlZVJlZ3M7CisgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEluZGlyZWN0SW5SZWcoLypBbGlnbj0qLzAsIC8qQnlWYWw9Ki9mYWxzZSk7CisgIH0KKyAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEluZGlyZWN0KC8qQWxpZ249Ki8wLCAvKkJ5VmFsPSovZmFsc2UpOworfQorCitBQklBcmdJbmZvIFg4Nl8zMkFCSUluZm86OmNsYXNzaWZ5UmV0dXJuVHlwZShRdWFsVHlwZSBSZXRUeSwgQ0NTdGF0ZSAmU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW5zdGFuY2VNZXRob2QpIGNvbnN0IHsKICAgaWYgKFJldFR5LT5pc1ZvaWRUeXBlKCkpCiAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldElnbm9yZSgpOwogCkBAIC03MDEsNyArNzE1LDcgQEAKICAgICAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldERpcmVjdChsbHZtOjpJbnRlZ2VyVHlwZTo6Z2V0KGdldFZNQ29udGV4dCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSkpOwogCi0gICAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SW5kaXJlY3QoMCk7CisgICAgICByZXR1cm4gZ2V0SW5kaXJlY3RSZXR1cm5SZXN1bHQoU3RhdGUpOwogICAgIH0KIAogICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXREaXJlY3QoKTsKQEAgLTcxMCwyMSArNzI0LDIwIEBACiAgIGlmIChpc0FnZ3JlZ2F0ZVR5cGVGb3JBQkkoUmV0VHkpKSB7CiAgICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKlJUID0gUmV0VHktPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKICAgICAgIGlmIChpc1JlY29yZFJldHVybkluZGlyZWN0KFJULCBnZXRDWFhBQkkoKSkpCi0gICAgICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJbmRpcmVjdCgwLCAvKkJ5VmFsPSovZmFsc2UpOworICAgICAgICByZXR1cm4gZ2V0SW5kaXJlY3RSZXR1cm5SZXN1bHQoU3RhdGUpOwogCiAgICAgICAvLyBTdHJ1Y3R1cmVzIHdpdGggZmxleGlibGUgYXJyYXlzIGFyZSBhbHdheXMgaW5kaXJlY3QuCiAgICAgICBpZiAoUlQtPmdldERlY2woKS0+aGFzRmxleGlibGVBcnJheU1lbWJlcigpKQotICAgICAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SW5kaXJlY3QoMCk7CisgICAgICAgIHJldHVybiBnZXRJbmRpcmVjdFJldHVyblJlc3VsdChTdGF0ZSk7CiAgICAgfQogCiAgICAgLy8gSWYgc3BlY2lmaWVkLCBzdHJ1Y3RzIGFuZCB1bmlvbnMgYXJlIGFsd2F5cyBpbmRpcmVjdC4KICAgICBpZiAoIUlzU21hbGxTdHJ1Y3RJblJlZ0FCSSAmJiAhUmV0VHktPmlzQW55Q29tcGxleFR5cGUoKSkKLSAgICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJbmRpcmVjdCgwKTsKKyAgICAgIHJldHVybiBnZXRJbmRpcmVjdFJldHVyblJlc3VsdChTdGF0ZSk7CiAKICAgICAvLyBTbWFsbCBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSByZWdpc3RlciBzaXplZCBhcmUgZ2VuZXJhbGx5IHJldHVybmVkCiAgICAgLy8gaW4gYSByZWdpc3Rlci4KLSAgICBpZiAoWDg2XzMyQUJJSW5mbzo6c2hvdWxkUmV0dXJuVHlwZUluUmVnaXN0ZXIoUmV0VHksIGdldENvbnRleHQoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdDb252ZW50aW9uKSkgeworICAgIGlmIChzaG91bGRSZXR1cm5UeXBlSW5SZWdpc3RlcihSZXRUeSwgZ2V0Q29udGV4dCgpLCBJc0luc3RhbmNlTWV0aG9kKSkgewogICAgICAgdWludDY0X3QgU2l6ZSA9IGdldENvbnRleHQoKS5nZXRUeXBlU2l6ZShSZXRUeSk7CiAKICAgICAgIC8vIEFzIGEgc3BlY2lhbC1jYXNlLCBpZiB0aGUgc3RydWN0IGlzIGEgInNpbmdsZS1lbGVtZW50IiBzdHJ1Y3QsIGFuZApAQCAtNzQyLDcgKzc1NSw3IEBACiAgICAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0RGlyZWN0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0Vk1Db250ZXh0KCksU2l6ZSkpOwogICAgIH0KIAotICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJbmRpcmVjdCgwKTsKKyAgICByZXR1cm4gZ2V0SW5kaXJlY3RSZXR1cm5SZXN1bHQoU3RhdGUpOwogICB9CiAKICAgLy8gVHJlYXQgYW4gZW51bSB0eXBlIGFzIGl0cyB1bmRlcmx5aW5nIHR5cGUuCkBAIC03NjUsMTMgKzc3OCwxMSBAQAogCiAgIC8vIElmIHRoaXMgaXMgYSBDKysgcmVjb3JkLCBjaGVjayB0aGUgYmFzZXMgZmlyc3QuCiAgIGlmIChjb25zdCBDWFhSZWNvcmREZWNsICpDWFhSRCA9IGR5bl9jYXN0PENYWFJlY29yZERlY2w+KFJEKSkKLSAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgaSA9IENYWFJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICBlID0gQ1hYUkQtPmJhc2VzX2VuZCgpOyBpICE9IGU7ICsraSkKLSAgICAgIGlmICghaXNSZWNvcmRXaXRoU1NFVmVjdG9yVHlwZShDb250ZXh0LCBpLT5nZXRUeXBlKCkpKQorICAgIGZvciAoY29uc3QgYXV0byAmSSA6IENYWFJELT5iYXNlcygpKQorICAgICAgaWYgKCFpc1JlY29yZFdpdGhTU0VWZWN0b3JUeXBlKENvbnRleHQsIEkuZ2V0VHlwZSgpKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgaSA9IFJELT5maWVsZF9iZWdpbigpLCBlID0gUkQtPmZpZWxkX2VuZCgpOwotICAgICAgIGkgIT0gZTsgKytpKSB7CisgIGZvciAoY29uc3QgYXV0byAqaSA6IFJELT5maWVsZHMoKSkgewogICAgIFF1YWxUeXBlIEZUID0gaS0+Z2V0VHlwZSgpOwogCiAgICAgaWYgKGlzU1NFVmVjdG9yVHlwZShDb250ZXh0LCBGVCkpCkBAIC04MDYsMTAgKzgxNywxMCBAQAogfQogCiBBQklBcmdJbmZvIFg4Nl8zMkFCSUluZm86OmdldEluZGlyZWN0UmVzdWx0KFF1YWxUeXBlIFR5LCBib29sIEJ5VmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRnJlZVJlZ3MpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTdGF0ZSAmU3RhdGUpIGNvbnN0IHsKICAgaWYgKCFCeVZhbCkgewotICAgIGlmIChGcmVlUmVncykgewotICAgICAgLS1GcmVlUmVnczsgLy8gTm9uIGJ5dmFsIGluZGlyZWN0cyBqdXN0IHVzZSBvbmUgcG9pbnRlci4KKyAgICBpZiAoU3RhdGUuRnJlZVJlZ3MpIHsKKyAgICAgIC0tU3RhdGUuRnJlZVJlZ3M7IC8vIE5vbi1ieXZhbCBpbmRpcmVjdHMganVzdCB1c2Ugb25lIHBvaW50ZXIuCiAgICAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SW5kaXJlY3RJblJlZygwLCBmYWxzZSk7CiAgICAgfQogICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJbmRpcmVjdCgwLCBmYWxzZSk7CkBAIC04MTksMTUgKzgzMCwxMiBAQAogICB1bnNpZ25lZCBUeXBlQWxpZ24gPSBnZXRDb250ZXh0KCkuZ2V0VHlwZUFsaWduKFR5KSAvIDg7CiAgIHVuc2lnbmVkIFN0YWNrQWxpZ24gPSBnZXRUeXBlU3RhY2tBbGlnbkluQnl0ZXMoVHksIFR5cGVBbGlnbik7CiAgIGlmIChTdGFja0FsaWduID09IDApCi0gICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEluZGlyZWN0KDQpOworICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJbmRpcmVjdCg0LCAvKkJ5VmFsPSovdHJ1ZSk7CiAKICAgLy8gSWYgdGhlIHN0YWNrIGFsaWdubWVudCBpcyBsZXNzIHRoYW4gdGhlIHR5cGUgYWxpZ25tZW50LCByZWFsaWduIHRoZQogICAvLyBhcmd1bWVudC4KLSAgaWYgKFN0YWNrQWxpZ24gPCBUeXBlQWxpZ24pCi0gICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEluZGlyZWN0KFN0YWNrQWxpZ24sIC8qQnlWYWw9Ki90cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlJlYWxpZ249Ki90cnVlKTsKLQotICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SW5kaXJlY3QoU3RhY2tBbGlnbik7CisgIGJvb2wgUmVhbGlnbiA9IFR5cGVBbGlnbiA+IFN0YWNrQWxpZ247CisgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJbmRpcmVjdChTdGFja0FsaWduLCAvKkJ5VmFsPSovdHJ1ZSwgUmVhbGlnbik7CiB9CiAKIFg4Nl8zMkFCSUluZm86OkNsYXNzIFg4Nl8zMkFCSUluZm86OmNsYXNzaWZ5KFF1YWxUeXBlIFR5KSBjb25zdCB7CkBAIC04NDMsOCArODUxLDggQEAKICAgcmV0dXJuIEludGVnZXI7CiB9CiAKLWJvb2wgWDg2XzMyQUJJSW5mbzo6c2hvdWxkVXNlSW5SZWcoUXVhbFR5cGUgVHksIHVuc2lnbmVkICZGcmVlUmVncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0Zhc3RDYWxsLCBib29sICZOZWVkc1BhZGRpbmcpIGNvbnN0IHsKK2Jvb2wgWDg2XzMyQUJJSW5mbzo6c2hvdWxkVXNlSW5SZWcoUXVhbFR5cGUgVHksIENDU3RhdGUgJlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZOZWVkc1BhZGRpbmcpIGNvbnN0IHsKICAgTmVlZHNQYWRkaW5nID0gZmFsc2U7CiAgIENsYXNzIEMgPSBjbGFzc2lmeShUeSk7CiAgIGlmIChDID09IEZsb2F0KQpAQCAtODU2LDE0ICs4NjQsMTQgQEAKICAgaWYgKFNpemVJblJlZ3MgPT0gMCkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgaWYgKFNpemVJblJlZ3MgPiBGcmVlUmVncykgewotICAgIEZyZWVSZWdzID0gMDsKKyAgaWYgKFNpemVJblJlZ3MgPiBTdGF0ZS5GcmVlUmVncykgeworICAgIFN0YXRlLkZyZWVSZWdzID0gMDsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBGcmVlUmVncyAtPSBTaXplSW5SZWdzOworICBTdGF0ZS5GcmVlUmVncyAtPSBTaXplSW5SZWdzOwogCi0gIGlmIChJc0Zhc3RDYWxsKSB7CisgIGlmIChTdGF0ZS5DQyA9PSBsbHZtOjpDYWxsaW5nQ29udjo6WDg2X0Zhc3RDYWxsKSB7CiAgICAgaWYgKFNpemUgPiAzMikKICAgICAgIHJldHVybiBmYWxzZTsKIApAQCAtODc2LDcgKzg4NCw3IEBACiAgICAgaWYgKFR5LT5pc1JlZmVyZW5jZVR5cGUoKSkKICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgaWYgKEZyZWVSZWdzKQorICAgIGlmIChTdGF0ZS5GcmVlUmVncykKICAgICAgIE5lZWRzUGFkZGluZyA9IHRydWU7CiAKICAgICByZXR1cm4gZmFsc2U7CkBAIC04ODYsMjAgKzg5NCwyNiBAQAogfQogCiBBQklBcmdJbmZvIFg4Nl8zMkFCSUluZm86OmNsYXNzaWZ5QXJndW1lbnRUeXBlKFF1YWxUeXBlIFR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRnJlZVJlZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNGYXN0Q2FsbCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1N0YXRlICZTdGF0ZSkgY29uc3QgewogICAvLyBGSVhNRTogU2V0IGFsaWdubWVudCBvbiBpbmRpcmVjdCBhcmd1bWVudHMuCiAgIGlmIChpc0FnZ3JlZ2F0ZVR5cGVGb3JBQkkoVHkpKSB7CiAgICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKlJUID0gVHktPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKLSAgICAgIGlmIChJc1dpbjMyU3RydWN0QUJJKQotICAgICAgICByZXR1cm4gZ2V0SW5kaXJlY3RSZXN1bHQoVHksIHRydWUsIEZyZWVSZWdzKTsKKyAgICAgIC8vIENoZWNrIHdpdGggdGhlIEMrKyBBQkkgZmlyc3QuCisgICAgICBDR0NYWEFCSTo6UmVjb3JkQXJnQUJJIFJBQSA9IGdldFJlY29yZEFyZ0FCSShSVCwgZ2V0Q1hYQUJJKCkpOworICAgICAgaWYgKFJBQSA9PSBDR0NYWEFCSTo6UkFBX0luZGlyZWN0KSB7CisgICAgICAgIHJldHVybiBnZXRJbmRpcmVjdFJlc3VsdChUeSwgZmFsc2UsIFN0YXRlKTsKKyAgICAgIH0gZWxzZSBpZiAoUkFBID09IENHQ1hYQUJJOjpSQUFfRGlyZWN0SW5NZW1vcnkpIHsKKyAgICAgICAgLy8gVGhlIGZpZWxkIGluZGV4IGRvZXNuJ3QgbWF0dGVyLCB3ZSdsbCBmaXggaXQgdXAgbGF0ZXIuCisgICAgICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJbkFsbG9jYSgvKkZpZWxkSW5kZXg9Ki8wKTsKKyAgICAgIH0KIAotICAgICAgaWYgKENHQ1hYQUJJOjpSZWNvcmRBcmdBQkkgUkFBID0gZ2V0UmVjb3JkQXJnQUJJKFJULCBnZXRDWFhBQkkoKSkpCi0gICAgICAgIHJldHVybiBnZXRJbmRpcmVjdFJlc3VsdChUeSwgUkFBID09IENHQ1hYQUJJOjpSQUFfRGlyZWN0SW5NZW1vcnksIEZyZWVSZWdzKTsKKyAgICAgIC8vIFN0cnVjdHMgYXJlIGFsd2F5cyBieXZhbCBvbiB3aW4zMiwgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZXkgY29udGFpbi4KKyAgICAgIGlmIChJc1dpbjMyU3RydWN0QUJJKQorICAgICAgICByZXR1cm4gZ2V0SW5kaXJlY3RSZXN1bHQoVHksIHRydWUsIFN0YXRlKTsKIAogICAgICAgLy8gU3RydWN0dXJlcyB3aXRoIGZsZXhpYmxlIGFycmF5cyBhcmUgYWx3YXlzIGluZGlyZWN0LgogICAgICAgaWYgKFJULT5nZXREZWNsKCktPmhhc0ZsZXhpYmxlQXJyYXlNZW1iZXIoKSkKLSAgICAgICAgcmV0dXJuIGdldEluZGlyZWN0UmVzdWx0KFR5LCB0cnVlLCBGcmVlUmVncyk7CisgICAgICAgIHJldHVybiBnZXRJbmRpcmVjdFJlc3VsdChUeSwgdHJ1ZSwgU3RhdGUpOwogICAgIH0KIAogICAgIC8vIElnbm9yZSBlbXB0eSBzdHJ1Y3RzL3VuaW9ucy4KQEAgLTkwOSw3ICs5MjMsNyBAQAogICAgIGxsdm06OkxMVk1Db250ZXh0ICZMTFZNQ29udGV4dCA9IGdldFZNQ29udGV4dCgpOwogICAgIGxsdm06OkludGVnZXJUeXBlICpJbnQzMiA9IGxsdm06OlR5cGU6OmdldEludDMyVHkoTExWTUNvbnRleHQpOwogICAgIGJvb2wgTmVlZHNQYWRkaW5nOwotICAgIGlmIChzaG91bGRVc2VJblJlZyhUeSwgRnJlZVJlZ3MsIElzRmFzdENhbGwsIE5lZWRzUGFkZGluZykpIHsKKyAgICBpZiAoc2hvdWxkVXNlSW5SZWcoVHksIFN0YXRlLCBOZWVkc1BhZGRpbmcpKSB7CiAgICAgICB1bnNpZ25lZCBTaXplSW5SZWdzID0gKGdldENvbnRleHQoKS5nZXRUeXBlU2l6ZShUeSkgKyAzMSkgLyAzMjsKICAgICAgIFNtYWxsVmVjdG9yPGxsdm06OlR5cGUqLCAzPiBFbGVtZW50cyhTaXplSW5SZWdzLCBJbnQzMik7CiAgICAgICBsbHZtOjpUeXBlICpSZXN1bHQgPSBsbHZtOjpTdHJ1Y3RUeXBlOjpnZXQoTExWTUNvbnRleHQsIEVsZW1lbnRzKTsKQEAgLTkyMyw5ICs5MzcsMTAgQEAKICAgICAvLyBvcHRpbWl6YXRpb25zLgogICAgIGlmIChnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemUoVHkpIDw9IDQqMzIgJiYKICAgICAgICAgY2FuRXhwYW5kSW5kaXJlY3RBcmd1bWVudChUeSwgZ2V0Q29udGV4dCgpKSkKLSAgICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRFeHBhbmRXaXRoUGFkZGluZyhJc0Zhc3RDYWxsLCBQYWRkaW5nVHlwZSk7CisgICAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0RXhwYW5kV2l0aFBhZGRpbmcoCisgICAgICAgICAgU3RhdGUuQ0MgPT0gbGx2bTo6Q2FsbGluZ0NvbnY6Olg4Nl9GYXN0Q2FsbCwgUGFkZGluZ1R5cGUpOwogCi0gICAgcmV0dXJuIGdldEluZGlyZWN0UmVzdWx0KFR5LCB0cnVlLCBGcmVlUmVncyk7CisgICAgcmV0dXJuIGdldEluZGlyZWN0UmVzdWx0KFR5LCB0cnVlLCBTdGF0ZSk7CiAgIH0KIAogICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqVlQgPSBUeS0+Z2V0QXM8VmVjdG9yVHlwZT4oKSkgewpAQCAtOTUwLDcgKzk2NSw3IEBACiAgICAgVHkgPSBFbnVtVHktPmdldERlY2woKS0+Z2V0SW50ZWdlclR5cGUoKTsKIAogICBib29sIE5lZWRzUGFkZGluZzsKLSAgYm9vbCBJblJlZyA9IHNob3VsZFVzZUluUmVnKFR5LCBGcmVlUmVncywgSXNGYXN0Q2FsbCwgTmVlZHNQYWRkaW5nKTsKKyAgYm9vbCBJblJlZyA9IHNob3VsZFVzZUluUmVnKFR5LCBTdGF0ZSwgTmVlZHNQYWRkaW5nKTsKIAogICBpZiAoVHktPmlzUHJvbW90YWJsZUludGVnZXJUeXBlKCkpIHsKICAgICBpZiAoSW5SZWcpCkBAIC05NjMsMzIgKzk3OCwxMDcgQEAKIH0KIAogdm9pZCBYODZfMzJBQklJbmZvOjpjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IHsKLSAgRkkuZ2V0UmV0dXJuSW5mbygpID0gY2xhc3NpZnlSZXR1cm5UeXBlKEZJLmdldFJldHVyblR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJLmdldENhbGxpbmdDb252ZW50aW9uKCkpOwotCi0gIHVuc2lnbmVkIENDID0gRkkuZ2V0Q2FsbGluZ0NvbnZlbnRpb24oKTsKLSAgYm9vbCBJc0Zhc3RDYWxsID0gQ0MgPT0gbGx2bTo6Q2FsbGluZ0NvbnY6Olg4Nl9GYXN0Q2FsbDsKLSAgdW5zaWduZWQgRnJlZVJlZ3M7Ci0gIGlmIChJc0Zhc3RDYWxsKQotICAgIEZyZWVSZWdzID0gMjsKKyAgQ0NTdGF0ZSBTdGF0ZShGSS5nZXRDYWxsaW5nQ29udmVudGlvbigpKTsKKyAgaWYgKFN0YXRlLkNDID09IGxsdm06OkNhbGxpbmdDb252OjpYODZfRmFzdENhbGwpCisgICAgU3RhdGUuRnJlZVJlZ3MgPSAyOwogICBlbHNlIGlmIChGSS5nZXRIYXNSZWdQYXJtKCkpCi0gICAgRnJlZVJlZ3MgPSBGSS5nZXRSZWdQYXJtKCk7CisgICAgU3RhdGUuRnJlZVJlZ3MgPSBGSS5nZXRSZWdQYXJtKCk7CiAgIGVsc2UKLSAgICBGcmVlUmVncyA9IERlZmF1bHROdW1SZWdpc3RlclBhcmFtZXRlcnM7CisgICAgU3RhdGUuRnJlZVJlZ3MgPSBEZWZhdWx0TnVtUmVnaXN0ZXJQYXJhbWV0ZXJzOwogCi0gIC8vIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgaW5kaXJlY3QsIHRoZW4gdGhlIGhpZGRlbiBhcmd1bWVudCBpcyBjb25zdW1pbmcgb25lCi0gIC8vIGludGVnZXIgcmVnaXN0ZXIuCi0gIGlmIChGSS5nZXRSZXR1cm5JbmZvKCkuaXNJbmRpcmVjdCgpICYmIEZyZWVSZWdzKSB7Ci0gICAgLS1GcmVlUmVnczsKLSAgICBBQklBcmdJbmZvICZPbGQgPSBGSS5nZXRSZXR1cm5JbmZvKCk7Ci0gICAgT2xkID0gQUJJQXJnSW5mbzo6Z2V0SW5kaXJlY3RJblJlZyhPbGQuZ2V0SW5kaXJlY3RBbGlnbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkLmdldEluZGlyZWN0QnlWYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9sZC5nZXRJbmRpcmVjdFJlYWxpZ24oKSk7CisgIEZJLmdldFJldHVybkluZm8oKSA9CisgICAgICBjbGFzc2lmeVJldHVyblR5cGUoRkkuZ2V0UmV0dXJuVHlwZSgpLCBTdGF0ZSwgRkkuaXNJbnN0YW5jZU1ldGhvZCgpKTsKKworICAvLyBPbiB3aW4zMiwgdXNlIHRoZSB4ODZfY2RlY2xtZXRob2RjYyBjb252ZW50aW9uIGZvciBjZGVjbCBtZXRob2RzIHRoYXQgdXNlCisgIC8vIHNyZXQuICBUaGlzIGNvbnZlbnRpb24gc3dhcHMgdGhlIG9yZGVyIG9mIHRoZSBmaXJzdCB0d28gcGFyYW1ldGVycyBiZWhpbmQKKyAgLy8gdGhlIHNjZW5lcyB0byBtYXRjaCBNU1ZDLgorICBpZiAoSXNXaW4zMlN0cnVjdEFCSSAmJiBGSS5pc0luc3RhbmNlTWV0aG9kKCkgJiYKKyAgICAgIEZJLmdldENhbGxpbmdDb252ZW50aW9uKCkgPT0gbGx2bTo6Q2FsbGluZ0NvbnY6OkMgJiYKKyAgICAgIEZJLmdldFJldHVybkluZm8oKS5pc0luZGlyZWN0KCkpCisgICAgRkkuc2V0RWZmZWN0aXZlQ2FsbGluZ0NvbnZlbnRpb24obGx2bTo6Q2FsbGluZ0NvbnY6Olg4Nl9DRGVjbE1ldGhvZCk7CisKKyAgYm9vbCBVc2VkSW5BbGxvY2EgPSBmYWxzZTsKKyAgZm9yIChhdXRvICZJIDogRkkuYXJndW1lbnRzKCkpIHsKKyAgICBJLmluZm8gPSBjbGFzc2lmeUFyZ3VtZW50VHlwZShJLnR5cGUsIFN0YXRlKTsKKyAgICBVc2VkSW5BbGxvY2EgfD0gKEkuaW5mby5nZXRLaW5kKCkgPT0gQUJJQXJnSW5mbzo6SW5BbGxvY2EpOwogICB9CiAKLSAgZm9yIChDR0Z1bmN0aW9uSW5mbzo6YXJnX2l0ZXJhdG9yIGl0ID0gRkkuYXJnX2JlZ2luKCksIGllID0gRkkuYXJnX2VuZCgpOwotICAgICAgIGl0ICE9IGllOyArK2l0KQotICAgIGl0LT5pbmZvID0gY2xhc3NpZnlBcmd1bWVudFR5cGUoaXQtPnR5cGUsIEZyZWVSZWdzLCBJc0Zhc3RDYWxsKTsKKyAgLy8gSWYgd2UgbmVlZGVkIHRvIHVzZSBpbmFsbG9jYSBmb3IgYW55IGFyZ3VtZW50LCBkbyBhIHNlY29uZCBwYXNzIGFuZCByZXdyaXRlCisgIC8vIGFsbCB0aGUgbWVtb3J5IGFyZ3VtZW50cyB0byB1c2UgaW5hbGxvY2EuCisgIGlmIChVc2VkSW5BbGxvY2EpCisgICAgcmV3cml0ZVdpdGhJbkFsbG9jYShGSSk7Cit9CisKK3ZvaWQKK1g4Nl8zMkFCSUluZm86OmFkZEZpZWxkVG9BcmdTdHJ1Y3QoU21hbGxWZWN0b3I8bGx2bTo6VHlwZSAqLCA2PiAmRnJhbWVGaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTdGFja09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJJQXJnSW5mbyAmSW5mbywgUXVhbFR5cGUgVHlwZSkgY29uc3QgeworICAvLyBJbnNlcnQgcGFkZGluZyBieXRlcyB0byByZXNwZWN0IGFsaWdubWVudC4gIEZvciB4ODZfMzIsIGVhY2ggYXJndW1lbnQgaXMgNAorICAvLyBieXRlIGFsaWduZWQuCisgIHVuc2lnbmVkIEFsaWduID0gNFU7CisgIGlmIChJbmZvLmdldEtpbmQoKSA9PSBBQklBcmdJbmZvOjpJbmRpcmVjdCAmJiBJbmZvLmdldEluZGlyZWN0QnlWYWwoKSkKKyAgICBBbGlnbiA9IHN0ZDo6bWF4KEFsaWduLCBJbmZvLmdldEluZGlyZWN0QWxpZ24oKSk7CisgIGlmIChTdGFja09mZnNldCAmIChBbGlnbiAtIDEpKSB7CisgICAgdW5zaWduZWQgT2xkT2Zmc2V0ID0gU3RhY2tPZmZzZXQ7CisgICAgU3RhY2tPZmZzZXQgPSBsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoU3RhY2tPZmZzZXQsIEFsaWduKTsKKyAgICB1bnNpZ25lZCBOdW1CeXRlcyA9IFN0YWNrT2Zmc2V0IC0gT2xkT2Zmc2V0OworICAgIGFzc2VydChOdW1CeXRlcyk7CisgICAgbGx2bTo6VHlwZSAqVHkgPSBsbHZtOjpUeXBlOjpnZXRJbnQ4VHkoZ2V0Vk1Db250ZXh0KCkpOworICAgIFR5ID0gbGx2bTo6QXJyYXlUeXBlOjpnZXQoVHksIE51bUJ5dGVzKTsKKyAgICBGcmFtZUZpZWxkcy5wdXNoX2JhY2soVHkpOworICB9CisKKyAgSW5mbyA9IEFCSUFyZ0luZm86OmdldEluQWxsb2NhKEZyYW1lRmllbGRzLnNpemUoKSk7CisgIEZyYW1lRmllbGRzLnB1c2hfYmFjayhDR1QuQ29udmVydFR5cGVGb3JNZW0oVHlwZSkpOworICBTdGFja09mZnNldCArPSBnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemVJbkNoYXJzKFR5cGUpLmdldFF1YW50aXR5KCk7Cit9CisKK3ZvaWQgWDg2XzMyQUJJSW5mbzo6cmV3cml0ZVdpdGhJbkFsbG9jYShDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IHsKKyAgYXNzZXJ0KElzV2luMzJTdHJ1Y3RBQkkgJiYgImluYWxsb2NhIG9ubHkgc3VwcG9ydGVkIG9uIHdpbjMyIik7CisKKyAgLy8gQnVpbGQgYSBwYWNrZWQgc3RydWN0IHR5cGUgZm9yIGFsbCBvZiB0aGUgYXJndW1lbnRzIGluIG1lbW9yeS4KKyAgU21hbGxWZWN0b3I8bGx2bTo6VHlwZSAqLCA2PiBGcmFtZUZpZWxkczsKKworICB1bnNpZ25lZCBTdGFja09mZnNldCA9IDA7CisKKyAgLy8gUHV0IHRoZSBzcmV0IHBhcmFtZXRlciBpbnRvIHRoZSBpbmFsbG9jYSBzdHJ1Y3QgaWYgaXQncyBpbiBtZW1vcnkuCisgIEFCSUFyZ0luZm8gJlJldCA9IEZJLmdldFJldHVybkluZm8oKTsKKyAgaWYgKFJldC5pc0luZGlyZWN0KCkgJiYgIVJldC5nZXRJblJlZygpKSB7CisgICAgQ2FuUXVhbFR5cGUgUHRyVHkgPSBnZXRDb250ZXh0KCkuZ2V0UG9pbnRlclR5cGUoRkkuZ2V0UmV0dXJuVHlwZSgpKTsKKyAgICBhZGRGaWVsZFRvQXJnU3RydWN0KEZyYW1lRmllbGRzLCBTdGFja09mZnNldCwgUmV0LCBQdHJUeSk7CisgICAgLy8gT24gV2luZG93cywgdGhlIGhpZGRlbiBzcmV0IHBhcmFtZXRlciBpcyBhbHdheXMgcmV0dXJuZWQgaW4gZWF4LgorICAgIFJldC5zZXRJbkFsbG9jYVNSZXQoSXNXaW4zMlN0cnVjdEFCSSk7CisgIH0KKworICAvLyBTa2lwIHRoZSAndGhpcycgcGFyYW1ldGVyIGluIGVjeC4KKyAgQ0dGdW5jdGlvbkluZm86OmFyZ19pdGVyYXRvciBJID0gRkkuYXJnX2JlZ2luKCksIEUgPSBGSS5hcmdfZW5kKCk7CisgIGlmIChGSS5nZXRDYWxsaW5nQ29udmVudGlvbigpID09IGxsdm06OkNhbGxpbmdDb252OjpYODZfVGhpc0NhbGwpCisgICAgKytJOworCisgIC8vIFB1dCBhcmd1bWVudHMgcGFzc2VkIGluIG1lbW9yeSBpbnRvIHRoZSBzdHJ1Y3QuCisgIGZvciAoOyBJICE9IEU7ICsrSSkgeworCisgICAgLy8gTGVhdmUgaWdub3JlZCBhbmQgaW5yZWcgYXJndW1lbnRzIGFsb25lLgorICAgIHN3aXRjaCAoSS0+aW5mby5nZXRLaW5kKCkpIHsKKyAgICBjYXNlIEFCSUFyZ0luZm86OkluZGlyZWN0OgorICAgICAgYXNzZXJ0KEktPmluZm8uZ2V0SW5kaXJlY3RCeVZhbCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUJJQXJnSW5mbzo6SWdub3JlOgorICAgICAgY29udGludWU7CisgICAgY2FzZSBBQklBcmdJbmZvOjpEaXJlY3Q6CisgICAgY2FzZSBBQklBcmdJbmZvOjpFeHRlbmQ6CisgICAgICBpZiAoSS0+aW5mby5nZXRJblJlZygpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBhZGRGaWVsZFRvQXJnU3RydWN0KEZyYW1lRmllbGRzLCBTdGFja09mZnNldCwgSS0+aW5mbywgSS0+dHlwZSk7CisgIH0KKworICBGSS5zZXRBcmdTdHJ1Y3QobGx2bTo6U3RydWN0VHlwZTo6Z2V0KGdldFZNQ29udGV4dCgpLCBGcmFtZUZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzUGFja2VkPSovdHJ1ZSkpOwogfQogCiBsbHZtOjpWYWx1ZSAqWDg2XzMyQUJJSW5mbzo6RW1pdFZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKQEAgLTEyMTksMTAgKzEzMDksMTAgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgY29tcHV0ZUluZm8oQ0dGdW5jdGlvbkluZm8gJkZJKSBjb25zdDsKKyAgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgUXVhbFR5cGUgVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRikgY29uc3Q7CisgIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIC8vLyBXaW5YODZfNjRBQklJbmZvIC0gVGhlIFdpbmRvd3MgWDg2XzY0IEFCSSBpbmZvcm1hdGlvbi4KQEAgLTEyMzMsMTAgKzEzMjMsMTAgQEAKIHB1YmxpYzoKICAgV2luWDg2XzY0QUJJSW5mbyhDb2RlR2VuOjpDb2RlR2VuVHlwZXMgJkNHVCkgOiBBQklJbmZvKENHVCkge30KIAotICB2aXJ0dWFsIHZvaWQgY29tcHV0ZUluZm8oQ0dGdW5jdGlvbkluZm8gJkZJKSBjb25zdDsKKyAgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgUXVhbFR5cGUgVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRikgY29uc3Q7CisgIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIGNsYXNzIFg4Nl82NFRhcmdldENvZGVHZW5JbmZvIDogcHVibGljIFRhcmdldENvZGVHZW5JbmZvIHsKQEAgLTEyNDgsMTIgKzEzMzgsMTIgQEAKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgWDg2XzY0QUJJSW5mbyY+KFRhcmdldENvZGVHZW5JbmZvOjpnZXRBQklJbmZvKCkpOwogICB9CiAKLSAgaW50IGdldER3YXJmRUhTdGFja1BvaW50ZXIoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmQ0dNKSBjb25zdCB7CisgIGludCBnZXREd2FyZkVIU3RhY2tQb2ludGVyKENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJkNHTSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiA3OwogICB9CiAKICAgYm9vbCBpbml0RHdhcmZFSFJlZ1NpemVUYWJsZShDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQWRkcmVzcykgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpBZGRyZXNzKSBjb25zdCBvdmVycmlkZSB7CiAgICAgbGx2bTo6VmFsdWUgKkVpZ2h0OCA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDhUeSwgOCk7CiAKICAgICAvLyAwLTE1IGFyZSB0aGUgMTYgaW50ZWdlciByZWdpc3RlcnMuCkBAIC0xMjY0LDEyICsxMzU0LDEyIEBACiAKICAgbGx2bTo6VHlwZSogYWRqdXN0SW5saW5lQXNtVHlwZShDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQ29uc3RyYWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpUeXBlKiBUeSkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlR5cGUqIFR5KSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFg4NkFkanVzdElubGluZUFzbVR5cGUoQ0dGLCBDb25zdHJhaW50LCBUeSk7CiAgIH0KIAogICBib29sIGlzTm9Qcm90b0NhbGxWYXJpYWRpYyhjb25zdCBDYWxsQXJnTGlzdCAmYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Ob1Byb3RvVHlwZSAqZm5UeXBlKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uTm9Qcm90b1R5cGUgKmZuVHlwZSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIFRoZSBkZWZhdWx0IENDIG9uIHg4Ni02NCBzZXRzICVhbCB0byB0aGUgbnVtYmVyIG9mIFNTQQogICAgIC8vIHJlZ2lzdGVycyB1c2VkLCBhbmQgR0NDIHNldHMgdGhpcyB3aGVuIGNhbGxpbmcgYW4gdW5wcm90b3R5cGVkCiAgICAgLy8gZnVuY3Rpb24sIHNvIHdlIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiAgSG93ZXZlciwgZG9uJ3QgZG8KQEAgLTEyOTMsNyArMTM4Myw4IEBACiAgICAgcmV0dXJuIFRhcmdldENvZGVHZW5JbmZvOjppc05vUHJvdG9DYWxsVmFyaWFkaWMoYXJncywgZm5UeXBlKTsKICAgfQogCi0gIGxsdm06OkNvbnN0YW50ICpnZXRVQlNhbkZ1bmN0aW9uU2lnbmF0dXJlKENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJkNHTSkgY29uc3QgeworICBsbHZtOjpDb25zdGFudCAqCisgIGdldFVCU2FuRnVuY3Rpb25TaWduYXR1cmUoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmQ0dNKSBjb25zdCBvdmVycmlkZSB7CiAgICAgdW5zaWduZWQgU2lnID0gKDB4ZWIgPDwgMCkgfCAgLy8gam1wIHJlbDgKICAgICAgICAgICAgICAgICAgICAoMHgwYSA8PCA4KSB8ICAvLyAgICAgICAgICAgLisweDBjCiAgICAgICAgICAgICAgICAgICAgKCdGJyA8PCAxNikgfApAQCAtMTMxOSwxNCArMTQxMCwxNCBAQAogICAgIDogWDg2XzMyVGFyZ2V0Q29kZUdlbkluZm8oQ0dULCBkLCBwLCB3LCBSZWdQYXJtcykge30KIAogICB2b2lkIGdldERlcGVuZGVudExpYnJhcnlPcHRpb24obGx2bTo6U3RyaW5nUmVmIExpYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDI0PiAmT3B0KSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFN0cmluZzwyND4gJk9wdCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIE9wdCA9ICIvREVGQVVMVExJQjoiOwogICAgIE9wdCArPSBxdWFsaWZ5V2luZG93c0xpYnJhcnkoTGliKTsKICAgfQogCiAgIHZvaWQgZ2V0RGV0ZWN0TWlzbWF0Y2hPcHRpb24obGx2bTo6U3RyaW5nUmVmIE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U3RyaW5nUmVmIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDMyPiAmT3B0KSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxTdHJpbmc8MzI+ICZPcHQpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBPcHQgPSAiL0ZBSUxJRk1JU01BVENIOlwiIiArIE5hbWUuc3RyKCkgKyAiPSIgKyBWYWx1ZS5zdHIoKSArICJcIiI7CiAgIH0KIH07CkBAIC0xMzM2LDEyICsxNDI3LDEyIEBACiAgIFdpblg4Nl82NFRhcmdldENvZGVHZW5JbmZvKENvZGVHZW46OkNvZGVHZW5UeXBlcyAmQ0dUKQogICAgIDogVGFyZ2V0Q29kZUdlbkluZm8obmV3IFdpblg4Nl82NEFCSUluZm8oQ0dUKSkge30KIAotICBpbnQgZ2V0RHdhcmZFSFN0YWNrUG9pbnRlcihDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZDR00pIGNvbnN0IHsKKyAgaW50IGdldER3YXJmRUhTdGFja1BvaW50ZXIoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmQ0dNKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDc7CiAgIH0KIAogICBib29sIGluaXREd2FyZkVIUmVnU2l6ZVRhYmxlKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpBZGRyZXNzKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkFkZHJlc3MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBsbHZtOjpWYWx1ZSAqRWlnaHQ4ID0gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChDR0YuSW50OFR5LCA4KTsKIAogICAgIC8vIDAtMTUgYXJlIHRoZSAxNiBpbnRlZ2VyIHJlZ2lzdGVycy4KQEAgLTEzNTEsMTQgKzE0NDIsMTQgQEAKICAgfQogCiAgIHZvaWQgZ2V0RGVwZW5kZW50TGlicmFyeU9wdGlvbihsbHZtOjpTdHJpbmdSZWYgTGliLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxTdHJpbmc8MjQ+ICZPcHQpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlNtYWxsU3RyaW5nPDI0PiAmT3B0KSBjb25zdCBvdmVycmlkZSB7CiAgICAgT3B0ID0gIi9ERUZBVUxUTElCOiI7CiAgICAgT3B0ICs9IHF1YWxpZnlXaW5kb3dzTGlicmFyeShMaWIpOwogICB9CiAKICAgdm9pZCBnZXREZXRlY3RNaXNtYXRjaE9wdGlvbihsbHZtOjpTdHJpbmdSZWYgTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxTdHJpbmc8MzI+ICZPcHQpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFN0cmluZzwzMj4gJk9wdCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIE9wdCA9ICIvRkFJTElGTUlTTUFUQ0g6XCIiICsgTmFtZS5zdHIoKSArICI9IiArIFZhbHVlLnN0cigpICsgIlwiIjsKICAgfQogfTsKQEAgLTE2NDIsMTIgKzE3MzMsMTEgQEAKIAogICAgIC8vIElmIHRoaXMgaXMgYSBDKysgcmVjb3JkLCBjbGFzc2lmeSB0aGUgYmFzZXMgZmlyc3QuCiAgICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKkNYWFJEID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4oUkQpKSB7Ci0gICAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgaSA9IENYWFJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgIGUgPSBDWFhSRC0+YmFzZXNfZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgICAgIGFzc2VydCghaS0+aXNWaXJ0dWFsKCkgJiYgIWktPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCkgJiYKKyAgICAgIGZvciAoY29uc3QgYXV0byAmSSA6IENYWFJELT5iYXNlcygpKSB7CisgICAgICAgIGFzc2VydCghSS5pc1ZpcnR1YWwoKSAmJiAhSS5nZXRUeXBlKCktPmlzRGVwZW5kZW50VHlwZSgpICYmCiAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBiYXNlIGNsYXNzISIpOwogICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlID0KLSAgICAgICAgICBjYXN0PENYWFJlY29yZERlY2w+KGktPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKKyAgICAgICAgICBjYXN0PENYWFJlY29yZERlY2w+KEkuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogCiAgICAgICAgIC8vIENsYXNzaWZ5IHRoaXMgZmllbGQuCiAgICAgICAgIC8vCkBAIC0xNjU3LDcgKzE3NDcsNyBAQAogICAgICAgICBDbGFzcyBGaWVsZExvLCBGaWVsZEhpOwogICAgICAgICB1aW50NjRfdCBPZmZzZXQgPQogICAgICAgICAgIE9mZnNldEJhc2UgKyBnZXRDb250ZXh0KCkudG9CaXRzKExheW91dC5nZXRCYXNlQ2xhc3NPZmZzZXQoQmFzZSkpOwotICAgICAgICBjbGFzc2lmeShpLT5nZXRUeXBlKCksIE9mZnNldCwgRmllbGRMbywgRmllbGRIaSwgaXNOYW1lZEFyZyk7CisgICAgICAgIGNsYXNzaWZ5KEkuZ2V0VHlwZSgpLCBPZmZzZXQsIEZpZWxkTG8sIEZpZWxkSGksIGlzTmFtZWRBcmcpOwogICAgICAgICBMbyA9IG1lcmdlKExvLCBGaWVsZExvKTsKICAgICAgICAgSGkgPSBtZXJnZShIaSwgRmllbGRIaSk7CiAgICAgICAgIGlmIChMbyA9PSBNZW1vcnkgfHwgSGkgPT0gTWVtb3J5KQpAQCAtMTg4NywxOSArMTk3NywxOCBAQAogCiAgICAgLy8gSWYgdGhpcyBpcyBhIEMrKyByZWNvcmQsIGNoZWNrIHRoZSBiYXNlcyBmaXJzdC4KICAgICBpZiAoY29uc3QgQ1hYUmVjb3JkRGVjbCAqQ1hYUkQgPSBkeW5fY2FzdDxDWFhSZWNvcmREZWNsPihSRCkpIHsKLSAgICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBpID0gQ1hYUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgIGUgPSBDWFhSRC0+YmFzZXNfZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgICAgIGFzc2VydCghaS0+aXNWaXJ0dWFsKCkgJiYgIWktPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCkgJiYKKyAgICAgIGZvciAoY29uc3QgYXV0byAmSSA6IENYWFJELT5iYXNlcygpKSB7CisgICAgICAgIGFzc2VydCghSS5pc1ZpcnR1YWwoKSAmJiAhSS5nZXRUeXBlKCktPmlzRGVwZW5kZW50VHlwZSgpICYmCiAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBiYXNlIGNsYXNzISIpOwogICAgICAgICBjb25zdCBDWFhSZWNvcmREZWNsICpCYXNlID0KLSAgICAgICAgICBjYXN0PENYWFJlY29yZERlY2w+KGktPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKKyAgICAgICAgICBjYXN0PENYWFJlY29yZERlY2w+KEkuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogCiAgICAgICAgIC8vIElmIHRoZSBiYXNlIGlzIGFmdGVyIHRoZSBzcGFuIHdlIGNhcmUgYWJvdXQsIGlnbm9yZSBpdC4KICAgICAgICAgdW5zaWduZWQgQmFzZU9mZnNldCA9IENvbnRleHQudG9CaXRzKExheW91dC5nZXRCYXNlQ2xhc3NPZmZzZXQoQmFzZSkpOwogICAgICAgICBpZiAoQmFzZU9mZnNldCA+PSBFbmRCaXQpIGNvbnRpbnVlOwogCiAgICAgICAgIHVuc2lnbmVkIEJhc2VTdGFydCA9IEJhc2VPZmZzZXQgPCBTdGFydEJpdCA/IFN0YXJ0Qml0LUJhc2VPZmZzZXQgOjA7Ci0gICAgICAgIGlmICghQml0c0NvbnRhaW5Ob1VzZXJEYXRhKGktPmdldFR5cGUoKSwgQmFzZVN0YXJ0LAorICAgICAgICBpZiAoIUJpdHNDb250YWluTm9Vc2VyRGF0YShJLmdldFR5cGUoKSwgQmFzZVN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRCaXQtQmFzZU9mZnNldCwgQ29udGV4dCkpCiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQpAQCAtMjY0Myw3ICsyNzMyLDcgQEAKICAgICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJbmRpcmVjdCgwLCAvKkJ5VmFsPSovZmFsc2UpOwogCiAgICAgLy8gRklYTUU6IG1pbmd3LXc2NC1nY2MgZW1pdHMgMTI4LWJpdCBzdHJ1Y3QgYXMgaTEyOAotICAgIGlmIChTaXplID09IDEyOCAmJiBnZXRUYXJnZXQoKS5nZXRUcmlwbGUoKS5nZXRPUygpID09IGxsdm06OlRyaXBsZTo6TWluR1czMikKKyAgICBpZiAoU2l6ZSA9PSAxMjggJiYgZ2V0VGFyZ2V0KCkuZ2V0VHJpcGxlKCkuaXNXaW5kb3dzR05VRW52aXJvbm1lbnQoKSkKICAgICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXREaXJlY3QobGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRWTUNvbnRleHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplKSk7CiAKQEAgLTI2NjgsOSArMjc1Nyw4IEBACiAgIFF1YWxUeXBlIFJldFR5ID0gRkkuZ2V0UmV0dXJuVHlwZSgpOwogICBGSS5nZXRSZXR1cm5JbmZvKCkgPSBjbGFzc2lmeShSZXRUeSwgdHJ1ZSk7CiAKLSAgZm9yIChDR0Z1bmN0aW9uSW5mbzo6YXJnX2l0ZXJhdG9yIGl0ID0gRkkuYXJnX2JlZ2luKCksIGllID0gRkkuYXJnX2VuZCgpOwotICAgICAgIGl0ICE9IGllOyArK2l0KQotICAgIGl0LT5pbmZvID0gY2xhc3NpZnkoaXQtPnR5cGUsIGZhbHNlKTsKKyAgZm9yIChhdXRvICZJIDogRkkuYXJndW1lbnRzKCkpCisgICAgSS5pbmZvID0gY2xhc3NpZnkoSS50eXBlLCBmYWxzZSk7CiB9CiAKIGxsdm06OlZhbHVlICpXaW5YODZfNjRBQklJbmZvOjpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LApAQCAtMjcwMSw5ICsyNzg5LDkgQEAKICBwdWJsaWM6CiAgIE5hQ2xYODZfNjRBQklJbmZvKENvZGVHZW46OkNvZGVHZW5UeXBlcyAmQ0dULCBib29sIEhhc0FWWCkKICAgICAgIDogQUJJSW5mbyhDR1QpLCBQSW5mbyhDR1QpLCBOSW5mbyhDR1QsIEhhc0FWWCkge30KLSAgdmlydHVhbCB2b2lkIGNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3Q7Ci0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgUXVhbFR5cGUgVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRikgY29uc3Q7CisgIHZvaWQgY29tcHV0ZUluZm8oQ0dGdW5jdGlvbkluZm8gJkZJKSBjb25zdCBvdmVycmlkZTsKKyAgbGx2bTo6VmFsdWUgKkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgUXVhbFR5cGUgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0IG92ZXJyaWRlOwogIHByaXZhdGU6CiAgIFBOYUNsQUJJSW5mbyBQSW5mbzsgIC8vIFVzZWQgZm9yIGdlbmVyYXRpbmcgY2FsbHMgd2l0aCBwbmFjbGNhbGwgY2FsbGluZ2NvbnYuCiAgIFg4Nl82NEFCSUluZm8gTkluZm87IC8vIFVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KQEAgLTI3MzksMTMgKzI4MjcsMTMgQEAKIHB1YmxpYzoKICAgUFBDMzJUYXJnZXRDb2RlR2VuSW5mbyhDb2RlR2VuVHlwZXMgJkNHVCkgOiBEZWZhdWx0VGFyZ2V0Q29kZUdlbkluZm8oQ0dUKSB7fQogCi0gIGludCBnZXREd2FyZkVIU3RhY2tQb2ludGVyKENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJk0pIGNvbnN0IHsKKyAgaW50IGdldER3YXJmRUhTdGFja1BvaW50ZXIoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmTSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmVkIGZyb20gZ2NjIG91dHB1dC4KICAgICByZXR1cm4gMTsgLy8gcjEgaXMgdGhlIGRlZGljYXRlZCBzdGFjayBwb2ludGVyCiAgIH0KIAogICBib29sIGluaXREd2FyZkVIUmVnU2l6ZVRhYmxlKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpBZGRyZXNzKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQWRkcmVzcykgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiB9CkBAIC0yODExLDI5ICsyODk5LDI3IEBACiAgIC8vIGZsb2F0aW5nLXBvaW50IHZhbHVlKSB0byBhdm9pZCBwdXNoaW5nIHRoZW0gdG8gbWVtb3J5IG9uIGZ1bmN0aW9uCiAgIC8vIGVudHJ5LiAgVGhpcyB3b3VsZCByZXF1aXJlIGNoYW5naW5nIHRoZSBsb2dpYyBpbiBQUENJU2VsTG93ZXJpbmcKICAgLy8gd2hlbiBsb3dlcmluZyB0aGUgcGFyYW1ldGVycyBpbiB0aGUgY2FsbGVyIGFuZCBhcmdzIGluIHRoZSBjYWxsZWUuCi0gIHZpcnR1YWwgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IHsKKyAgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBGSS5nZXRSZXR1cm5JbmZvKCkgPSBjbGFzc2lmeVJldHVyblR5cGUoRkkuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICBmb3IgKENHRnVuY3Rpb25JbmZvOjphcmdfaXRlcmF0b3IgaXQgPSBGSS5hcmdfYmVnaW4oKSwgaWUgPSBGSS5hcmdfZW5kKCk7Ci0gICAgICAgICBpdCAhPSBpZTsgKytpdCkgeworICAgIGZvciAoYXV0byAmSSA6IEZJLmFyZ3VtZW50cygpKSB7CiAgICAgICAvLyBXZSByZWx5IG9uIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGNsYXNzaWZpY2F0aW9uIGZvciB0aGUgbW9zdCBwYXJ0LgogICAgICAgLy8gT25lIGV4Y2VwdGlvbjogIEFuIGFnZ3JlZ2F0ZSBjb250YWluaW5nIGEgc2luZ2xlIGZsb2F0aW5nLXBvaW50CiAgICAgICAvLyBvciB2ZWN0b3IgaXRlbSBtdXN0IGJlIHBhc3NlZCBpbiBhIHJlZ2lzdGVyIGlmIG9uZSBpcyBhdmFpbGFibGUuCi0gICAgICBjb25zdCBUeXBlICpUID0gaXNTaW5nbGVFbGVtZW50U3RydWN0KGl0LT50eXBlLCBnZXRDb250ZXh0KCkpOworICAgICAgY29uc3QgVHlwZSAqVCA9IGlzU2luZ2xlRWxlbWVudFN0cnVjdChJLnR5cGUsIGdldENvbnRleHQoKSk7CiAgICAgICBpZiAoVCkgewogICAgICAgICBjb25zdCBCdWlsdGluVHlwZSAqQlQgPSBULT5nZXRBczxCdWlsdGluVHlwZT4oKTsKICAgICAgICAgaWYgKFQtPmlzVmVjdG9yVHlwZSgpIHx8IChCVCAmJiBCVC0+aXNGbG9hdGluZ1BvaW50KCkpKSB7CiAgICAgICAgICAgUXVhbFR5cGUgUVQoVCwgMCk7Ci0gICAgICAgICAgaXQtPmluZm8gPSBBQklBcmdJbmZvOjpnZXREaXJlY3RJblJlZyhDR1QuQ29udmVydFR5cGUoUVQpKTsKKyAgICAgICAgICBJLmluZm8gPSBBQklBcmdJbmZvOjpnZXREaXJlY3RJblJlZyhDR1QuQ29udmVydFR5cGUoUVQpKTsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgaXQtPmluZm8gPSBjbGFzc2lmeUFyZ3VtZW50VHlwZShpdC0+dHlwZSk7CisgICAgICBJLmluZm8gPSBjbGFzc2lmeUFyZ3VtZW50VHlwZShJLnR5cGUpOwogICAgIH0KICAgfQogCi0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdDsKKyAgbGx2bTo6VmFsdWUgKkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgUXVhbFR5cGUgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0IG92ZXJyaWRlOwogfTsKIAogY2xhc3MgUFBDNjRfU1ZSNF9UYXJnZXRDb2RlR2VuSW5mbyA6IHB1YmxpYyBUYXJnZXRDb2RlR2VuSW5mbyB7CkBAIC0yODQxLDI2ICsyOTI3LDI2IEBACiAgIFBQQzY0X1NWUjRfVGFyZ2V0Q29kZUdlbkluZm8oQ29kZUdlblR5cGVzICZDR1QpCiAgICAgOiBUYXJnZXRDb2RlR2VuSW5mbyhuZXcgUFBDNjRfU1ZSNF9BQklJbmZvKENHVCkpIHt9CiAKLSAgaW50IGdldER3YXJmRUhTdGFja1BvaW50ZXIoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmTSkgY29uc3QgeworICBpbnQgZ2V0RHdhcmZFSFN0YWNrUG9pbnRlcihDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZNKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gVGhpcyBpcyByZWNvdmVyZWQgZnJvbSBnY2Mgb3V0cHV0LgogICAgIHJldHVybiAxOyAvLyByMSBpcyB0aGUgZGVkaWNhdGVkIHN0YWNrIHBvaW50ZXIKICAgfQogCiAgIGJvb2wgaW5pdER3YXJmRUhSZWdTaXplVGFibGUoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkFkZHJlc3MpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpBZGRyZXNzKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIGNsYXNzIFBQQzY0VGFyZ2V0Q29kZUdlbkluZm8gOiBwdWJsaWMgRGVmYXVsdFRhcmdldENvZGVHZW5JbmZvIHsKIHB1YmxpYzoKICAgUFBDNjRUYXJnZXRDb2RlR2VuSW5mbyhDb2RlR2VuVHlwZXMgJkNHVCkgOiBEZWZhdWx0VGFyZ2V0Q29kZUdlbkluZm8oQ0dUKSB7fQogCi0gIGludCBnZXREd2FyZkVIU3RhY2tQb2ludGVyKENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJk0pIGNvbnN0IHsKKyAgaW50IGdldER3YXJmRUhTdGFja1BvaW50ZXIoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmTSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmVkIGZyb20gZ2NjIG91dHB1dC4KICAgICByZXR1cm4gMTsgLy8gcjEgaXMgdGhlIGRlZGljYXRlZCBzdGFjayBwb2ludGVyCiAgIH0KIAogICBib29sIGluaXREd2FyZkVIUmVnU2l6ZVRhYmxlKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpBZGRyZXNzKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQWRkcmVzcykgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiB9CkBAIC0zMDQ5LDYgKzMxMzUsNTY5IEBACiB9CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBUk02NCBBQkkgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEFSTTY0QUJJSW5mbyA6IHB1YmxpYyBBQklJbmZvIHsKK3B1YmxpYzoKKyAgZW51bSBBQklLaW5kIHsKKyAgICBBQVBDUyA9IDAsCisgICAgRGFyd2luUENTCisgIH07CisKK3ByaXZhdGU6CisgIEFCSUtpbmQgS2luZDsKKworcHVibGljOgorICBBUk02NEFCSUluZm8oQ29kZUdlblR5cGVzICZDR1QsIEFCSUtpbmQgS2luZCkgOiBBQklJbmZvKENHVCksIEtpbmQoS2luZCkge30KKworcHJpdmF0ZToKKyAgQUJJS2luZCBnZXRBQklLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorICBib29sIGlzRGFyd2luUENTKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBEYXJ3aW5QQ1M7IH0KKworICBBQklBcmdJbmZvIGNsYXNzaWZ5UmV0dXJuVHlwZShRdWFsVHlwZSBSZXRUeSkgY29uc3Q7CisgIEFCSUFyZ0luZm8gY2xhc3NpZnlBcmd1bWVudFR5cGUoUXVhbFR5cGUgUmV0VHksIHVuc2lnbmVkICZBbGxvY2F0ZWRWRlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSXNIQSwgdW5zaWduZWQgJkFsbG9jYXRlZEdQUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJc1NtYWxsQWdncikgY29uc3Q7CisgIGJvb2wgaXNJbGxlZ2FsVmVjdG9yVHlwZShRdWFsVHlwZSBUeSkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIGNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3QgeworICAgIC8vIFRvIGNvcnJlY3RseSBoYW5kbGUgSG9tb2dlbmVvdXMgQWdncmVnYXRlLCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlCisgICAgLy8gbnVtYmVyIG9mIFNJTUQgYW5kIEZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycyBhbGxvY2F0ZWQgc28gZmFyLgorICAgIC8vIElmIHRoZSBhcmd1bWVudCBpcyBhbiBIRkEgb3IgYW4gSFZBIGFuZCB0aGVyZSBhcmUgc3VmZmljaWVudCB1bmFsbG9jYXRlZAorICAgIC8vIFNJTUQgYW5kIEZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycywgdGhlbiB0aGUgYXJndW1lbnQgaXMgYWxsb2NhdGVkIHRvIFNJTUQKKyAgICAvLyBhbmQgRmxvYXRpbmctcG9pbnQgUmVnaXN0ZXJzICh3aXRoIG9uZSByZWdpc3RlciBwZXIgbWVtYmVyIG9mIHRoZSBIRkEgb3IKKyAgICAvLyBIVkEpLiBPdGhlcndpc2UsIHRoZSBOU1JOIGlzIHNldCB0byA4LgorICAgIHVuc2lnbmVkIEFsbG9jYXRlZFZGUCA9IDA7CisgICAgLy8gVG8gY29ycmVjdGx5IGhhbmRsZSBzbWFsbCBhZ2dyZWdhdGVzLCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlcgorICAgIC8vIG9mIEdQUnMgYWxsb2NhdGVkIHNvIGZhci4gSWYgdGhlIHNtYWxsIGFnZ3JlZ2F0ZSBjYW4ndCBhbGwgZml0IGludG8KKyAgICAvLyByZWdpc3RlcnMsIGl0IHdpbGwgYmUgb24gc3RhY2suIFdlIGRvbid0IGFsbG93IHRoZSBhZ2dyZWdhdGUgdG8gYmUKKyAgICAvLyBwYXJ0aWFsbHkgaW4gcmVnaXN0ZXJzLgorICAgIHVuc2lnbmVkIEFsbG9jYXRlZEdQUiA9IDA7CisgICAgRkkuZ2V0UmV0dXJuSW5mbygpID0gY2xhc3NpZnlSZXR1cm5UeXBlKEZJLmdldFJldHVyblR5cGUoKSk7CisgICAgZm9yIChDR0Z1bmN0aW9uSW5mbzo6YXJnX2l0ZXJhdG9yIGl0ID0gRkkuYXJnX2JlZ2luKCksIGllID0gRkkuYXJnX2VuZCgpOworICAgICAgICAgaXQgIT0gaWU7ICsraXQpIHsKKyAgICAgIHVuc2lnbmVkIFByZUFsbG9jYXRpb24gPSBBbGxvY2F0ZWRWRlAsIFByZUdQUiA9IEFsbG9jYXRlZEdQUjsKKyAgICAgIGJvb2wgSXNIQSA9IGZhbHNlLCBJc1NtYWxsQWdnciA9IGZhbHNlOworICAgICAgY29uc3QgdW5zaWduZWQgTnVtVkZQcyA9IDg7CisgICAgICBjb25zdCB1bnNpZ25lZCBOdW1HUFJzID0gODsKKyAgICAgIGl0LT5pbmZvID0gY2xhc3NpZnlBcmd1bWVudFR5cGUoaXQtPnR5cGUsIEFsbG9jYXRlZFZGUCwgSXNIQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGVkR1BSLCBJc1NtYWxsQWdncik7CisgICAgICAvLyBJZiB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggVkZQIHJlZ2lzdGVycyBmb3IgdGhlIEhBLCBhbnkgVkZQIHJlZ2lzdGVycworICAgICAgLy8gdGhhdCBhcmUgdW5hbGxvY2F0ZWQgYXJlIG1hcmtlZCBhcyB1bmF2YWlsYWJsZS4gVG8gYWNoaWV2ZSB0aGlzLCB3ZSBhZGQKKyAgICAgIC8vIHBhZGRpbmcgb2YgKE51bVZGUHMgLSBQcmVBbGxvY2F0aW9uKSBmbG9hdHMuCisgICAgICBpZiAoSXNIQSAmJiBBbGxvY2F0ZWRWRlAgPiBOdW1WRlBzICYmIFByZUFsbG9jYXRpb24gPCBOdW1WRlBzKSB7CisgICAgICAgIGxsdm06OlR5cGUgKlBhZGRpbmdUeSA9IGxsdm06OkFycmF5VHlwZTo6Z2V0KAorICAgICAgICAgICAgbGx2bTo6VHlwZTo6Z2V0RmxvYXRUeShnZXRWTUNvbnRleHQoKSksIE51bVZGUHMgLSBQcmVBbGxvY2F0aW9uKTsKKyAgICAgICAgaWYgKGlzRGFyd2luUENTKCkpCisgICAgICAgICAgaXQtPmluZm8gPSBBQklBcmdJbmZvOjpnZXRFeHBhbmRXaXRoUGFkZGluZyhmYWxzZSwgUGFkZGluZ1R5KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLy8gVW5kZXIgQUFQQ1MgdGhlIDY0LWJpdCBzdGFjayBzbG90IGFsaWdubWVudCBtZWFucyB3ZSBjYW4ndCBwYXNzIEhBcworICAgICAgICAgIC8vIGFzIHNlcXVlbmNlcyBvZiBmbG9hdHMgc2luY2UgdGhleSdsbCBnZXQgImhvbGVzIiBpbnNlcnRlZCBhcworICAgICAgICAgIC8vIHBhZGRpbmcgYnkgdGhlIGJhY2sgZW5kLgorICAgICAgICAgIHVpbnQzMl90IE51bVN0YWNrU2xvdHMgPSBnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemUoaXQtPnR5cGUpOworICAgICAgICAgIE51bVN0YWNrU2xvdHMgPSBsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoTnVtU3RhY2tTbG90cywgNjQpIC8gNjQ7CisKKyAgICAgICAgICBsbHZtOjpUeXBlICpDb2VyY2VUeSA9IGxsdm06OkFycmF5VHlwZTo6Z2V0KAorICAgICAgICAgICAgICBsbHZtOjpUeXBlOjpnZXREb3VibGVUeShnZXRWTUNvbnRleHQoKSksIE51bVN0YWNrU2xvdHMpOworICAgICAgICAgIGl0LT5pbmZvID0gQUJJQXJnSW5mbzo6Z2V0RGlyZWN0KENvZXJjZVR5LCAwLCBQYWRkaW5nVHkpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBJZiB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggR1BScyBmb3IgdGhlIHNtYWxsIGFnZ3JlZ2F0ZSwgYW55IEdQUiByZWdzCisgICAgICAvLyB0aGF0IGFyZSB1bmFsbG9jYXRlZCBhcmUgbWFya2VkIGFzIHVuYXZhaWxhYmxlLgorICAgICAgaWYgKElzU21hbGxBZ2dyICYmIEFsbG9jYXRlZEdQUiA+IE51bUdQUnMgJiYgUHJlR1BSIDwgTnVtR1BScykgeworICAgICAgICBsbHZtOjpUeXBlICpQYWRkaW5nVHkgPSBsbHZtOjpBcnJheVR5cGU6OmdldCgKKyAgICAgICAgICAgIGxsdm06OlR5cGU6OmdldEludDMyVHkoZ2V0Vk1Db250ZXh0KCkpLCBOdW1HUFJzIC0gUHJlR1BSKTsKKyAgICAgICAgaXQtPmluZm8gPQorICAgICAgICAgICAgQUJJQXJnSW5mbzo6Z2V0RGlyZWN0KGl0LT5pbmZvLmdldENvZXJjZVRvVHlwZSgpLCAwLCBQYWRkaW5nVHkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGxsdm06OlZhbHVlICpFbWl0RGFyd2luVkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdDsKKworICBsbHZtOjpWYWx1ZSAqRW1pdEFBUENTVkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0OworCisgIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgUXVhbFR5cGUgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRikgY29uc3QgeworICAgIHJldHVybiBpc0RhcndpblBDUygpID8gRW1pdERhcndpblZBQXJnKFZBTGlzdEFkZHIsIFR5LCBDR0YpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBFbWl0QUFQQ1NWQUFyZyhWQUxpc3RBZGRyLCBUeSwgQ0dGKTsKKyAgfQorfTsKKworY2xhc3MgQVJNNjRUYXJnZXRDb2RlR2VuSW5mbyA6IHB1YmxpYyBUYXJnZXRDb2RlR2VuSW5mbyB7CitwdWJsaWM6CisgIEFSTTY0VGFyZ2V0Q29kZUdlbkluZm8oQ29kZUdlblR5cGVzICZDR1QsIEFSTTY0QUJJSW5mbzo6QUJJS2luZCBLaW5kKQorICAgICAgOiBUYXJnZXRDb2RlR2VuSW5mbyhuZXcgQVJNNjRBQklJbmZvKENHVCwgS2luZCkpIHt9CisKKyAgU3RyaW5nUmVmIGdldEFSQ1JldGFpbkF1dG9yZWxlYXNlZFJldHVyblZhbHVlTWFya2VyKCkgY29uc3QgeworICAgIHJldHVybiAibW92XHRmcCwgZnBcdFx0OyBtYXJrZXIgZm9yIG9iamNfcmV0YWluQXV0b3JlbGVhc2VSZXR1cm5WYWx1ZSI7CisgIH0KKworICBpbnQgZ2V0RHdhcmZFSFN0YWNrUG9pbnRlcihDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZNKSBjb25zdCB7IHJldHVybiAzMTsgfQorCisgIHZpcnR1YWwgYm9vbCBkb2VzUmV0dXJuU2xvdEludGVyZmVyZVdpdGhBcmdzKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KK307Cit9CisKK3N0YXRpYyBib29sIGlzSG9tb2dlbmVvdXNBZ2dyZWdhdGUoUXVhbFR5cGUgVHksIGNvbnN0IFR5cGUgKiZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RDb250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqSEFNZW1iZXJzID0gMCk7CisKK0FCSUFyZ0luZm8gQVJNNjRBQklJbmZvOjpjbGFzc2lmeUFyZ3VtZW50VHlwZShRdWFsVHlwZSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmQWxsb2NhdGVkVkZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJklzSEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkFsbG9jYXRlZEdQUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJc1NtYWxsQWdncikgY29uc3QgeworICAvLyBIYW5kbGUgaWxsZWdhbCB2ZWN0b3IgdHlwZXMgaGVyZS4KKyAgaWYgKGlzSWxsZWdhbFZlY3RvclR5cGUoVHkpKSB7CisgICAgdWludDY0X3QgU2l6ZSA9IGdldENvbnRleHQoKS5nZXRUeXBlU2l6ZShUeSk7CisgICAgaWYgKFNpemUgPD0gMzIpIHsKKyAgICAgIGxsdm06OlR5cGUgKlJlc1R5cGUgPSBsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KGdldFZNQ29udGV4dCgpKTsKKyAgICAgIEFsbG9jYXRlZEdQUisrOworICAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldERpcmVjdChSZXNUeXBlKTsKKyAgICB9CisgICAgaWYgKFNpemUgPT0gNjQpIHsKKyAgICAgIGxsdm06OlR5cGUgKlJlc1R5cGUgPQorICAgICAgICAgIGxsdm06OlZlY3RvclR5cGU6OmdldChsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KGdldFZNQ29udGV4dCgpKSwgMik7CisgICAgICBBbGxvY2F0ZWRWRlArKzsKKyAgICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXREaXJlY3QoUmVzVHlwZSk7CisgICAgfQorICAgIGlmIChTaXplID09IDEyOCkgeworICAgICAgbGx2bTo6VHlwZSAqUmVzVHlwZSA9CisgICAgICAgICAgbGx2bTo6VmVjdG9yVHlwZTo6Z2V0KGxsdm06OlR5cGU6OmdldEludDMyVHkoZ2V0Vk1Db250ZXh0KCkpLCA0KTsKKyAgICAgIEFsbG9jYXRlZFZGUCsrOworICAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldERpcmVjdChSZXNUeXBlKTsKKyAgICB9CisgICAgQWxsb2NhdGVkR1BSKys7CisgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEluZGlyZWN0KDAsIC8qQnlWYWw9Ki9mYWxzZSk7CisgIH0KKyAgaWYgKFR5LT5pc1ZlY3RvclR5cGUoKSkKKyAgICAvLyBTaXplIG9mIGEgbGVnYWwgdmVjdG9yIHNob3VsZCBiZSBlaXRoZXIgNjQgb3IgMTI4LgorICAgIEFsbG9jYXRlZFZGUCsrOworICBpZiAoY29uc3QgQnVpbHRpblR5cGUgKkJUID0gVHktPmdldEFzPEJ1aWx0aW5UeXBlPigpKSB7CisgICAgaWYgKEJULT5nZXRLaW5kKCkgPT0gQnVpbHRpblR5cGU6OkhhbGYgfHwKKyAgICAgICAgQlQtPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6RmxvYXQgfHwKKyAgICAgICAgQlQtPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6RG91YmxlIHx8CisgICAgICAgIEJULT5nZXRLaW5kKCkgPT0gQnVpbHRpblR5cGU6OkxvbmdEb3VibGUpCisgICAgICBBbGxvY2F0ZWRWRlArKzsKKyAgfQorCisgIGlmICghaXNBZ2dyZWdhdGVUeXBlRm9yQUJJKFR5KSkgeworICAgIC8vIFRyZWF0IGFuIGVudW0gdHlwZSBhcyBpdHMgdW5kZXJseWluZyB0eXBlLgorICAgIGlmIChjb25zdCBFbnVtVHlwZSAqRW51bVR5ID0gVHktPmdldEFzPEVudW1UeXBlPigpKQorICAgICAgVHkgPSBFbnVtVHktPmdldERlY2woKS0+Z2V0SW50ZWdlclR5cGUoKTsKKworICAgIGlmICghVHktPmlzRmxvYXRpbmdUeXBlKCkgJiYgIVR5LT5pc1ZlY3RvclR5cGUoKSkgeworICAgICAgaW50IFJlZ3NOZWVkZWQgPSBnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemUoVHkpID4gNjQgPyAyIDogMTsKKyAgICAgIEFsbG9jYXRlZEdQUiArPSBSZWdzTmVlZGVkOworICAgIH0KKyAgICByZXR1cm4gKFR5LT5pc1Byb21vdGFibGVJbnRlZ2VyVHlwZSgpICYmIGlzRGFyd2luUENTKCkKKyAgICAgICAgICAgICAgICA/IEFCSUFyZ0luZm86OmdldEV4dGVuZCgpCisgICAgICAgICAgICAgICAgOiBBQklBcmdJbmZvOjpnZXREaXJlY3QoKSk7CisgIH0KKworICAvLyBTdHJ1Y3R1cmVzIHdpdGggZWl0aGVyIGEgbm9uLXRyaXZpYWwgZGVzdHJ1Y3RvciBvciBhIG5vbi10cml2aWFsCisgIC8vIGNvcHkgY29uc3RydWN0b3IgYXJlIGFsd2F5cyBpbmRpcmVjdC4KKyAgaWYgKGlzUmVjb3JkUmV0dXJuSW5kaXJlY3QoVHksIGdldENYWEFCSSgpKSkgeworICAgIEFsbG9jYXRlZEdQUisrOworICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJbmRpcmVjdCgwLCAvKkJ5VmFsPSovZmFsc2UpOworICB9CisKKyAgLy8gRW1wdHkgcmVjb3JkcyBhcmUgYWx3YXlzIGlnbm9yZWQgb24gRGFyd2luLCBidXQgYWN0dWFsbHkgcGFzc2VkIGluIEMrKyBtb2RlCisgIC8vIGVsc2V3aGVyZSBmb3IgR05VIGNvbXBhdGliaWxpdHkuCisgIGlmIChpc0VtcHR5UmVjb3JkKGdldENvbnRleHQoKSwgVHksIHRydWUpKSB7CisgICAgaWYgKCFnZXRDb250ZXh0KCkuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMgfHwgaXNEYXJ3aW5QQ1MoKSkKKyAgICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJZ25vcmUoKTsKKworICAgICsrQWxsb2NhdGVkR1BSOworICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXREaXJlY3QobGx2bTo6VHlwZTo6Z2V0SW50OFR5KGdldFZNQ29udGV4dCgpKSk7CisgIH0KKworICAvLyBIb21vZ2VuZW91cyBGbG9hdGluZy1wb2ludCBBZ2dyZWdhdGVzIChIRkFzKSBuZWVkIHRvIGJlIGV4cGFuZGVkLgorICBjb25zdCBUeXBlICpCYXNlID0gMDsKKyAgdWludDY0X3QgTWVtYmVycyA9IDA7CisgIGlmIChpc0hvbW9nZW5lb3VzQWdncmVnYXRlKFR5LCBCYXNlLCBnZXRDb250ZXh0KCksICZNZW1iZXJzKSkgeworICAgIEFsbG9jYXRlZFZGUCArPSBNZW1iZXJzOworICAgIElzSEEgPSB0cnVlOworICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRFeHBhbmQoKTsKKyAgfQorCisgIC8vIEFnZ3JlZ2F0ZXMgPD0gMTYgYnl0ZXMgYXJlIHBhc3NlZCBkaXJlY3RseSBpbiByZWdpc3RlcnMgb3Igb24gdGhlIHN0YWNrLgorICB1aW50NjRfdCBTaXplID0gZ2V0Q29udGV4dCgpLmdldFR5cGVTaXplKFR5KTsKKyAgaWYgKFNpemUgPD0gMTI4KSB7CisgICAgU2l6ZSA9IDY0ICogKChTaXplICsgNjMpIC8gNjQpOyAvLyByb3VuZCB1cCB0byBtdWx0aXBsZSBvZiA4IGJ5dGVzCisgICAgQWxsb2NhdGVkR1BSICs9IFNpemUgLyA2NDsKKyAgICBJc1NtYWxsQWdnciA9IHRydWU7CisgICAgLy8gV2UgdXNlIGEgcGFpciBvZiBpNjQgZm9yIDE2LWJ5dGUgYWdncmVnYXRlIHdpdGggOC1ieXRlIGFsaWdubWVudC4KKyAgICAvLyBGb3IgYWdncmVnYXRlcyB3aXRoIDE2LWJ5dGUgYWxpZ25tZW50LCB3ZSB1c2UgaTEyOC4KKyAgICBpZiAoZ2V0Q29udGV4dCgpLmdldFR5cGVBbGlnbihUeSkgPCAxMjggJiYgU2l6ZSA9PSAxMjgpIHsKKyAgICAgIGxsdm06OlR5cGUgKkJhc2VUeSA9IGxsdm06OlR5cGU6OmdldEludDY0VHkoZ2V0Vk1Db250ZXh0KCkpOworICAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldERpcmVjdChsbHZtOjpBcnJheVR5cGU6OmdldChCYXNlVHksIFNpemUgLyA2NCkpOworICAgIH0KKyAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0RGlyZWN0KGxsdm06OkludGVnZXJUeXBlOjpnZXQoZ2V0Vk1Db250ZXh0KCksIFNpemUpKTsKKyAgfQorCisgIEFsbG9jYXRlZEdQUisrOworICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SW5kaXJlY3QoMCwgLypCeVZhbD0qL2ZhbHNlKTsKK30KKworQUJJQXJnSW5mbyBBUk02NEFCSUluZm86OmNsYXNzaWZ5UmV0dXJuVHlwZShRdWFsVHlwZSBSZXRUeSkgY29uc3QgeworICBpZiAoUmV0VHktPmlzVm9pZFR5cGUoKSkKKyAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SWdub3JlKCk7CisKKyAgLy8gTGFyZ2UgdmVjdG9yIHR5cGVzIHNob3VsZCBiZSByZXR1cm5lZCB2aWEgbWVtb3J5LgorICBpZiAoUmV0VHktPmlzVmVjdG9yVHlwZSgpICYmIGdldENvbnRleHQoKS5nZXRUeXBlU2l6ZShSZXRUeSkgPiAxMjgpCisgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEluZGlyZWN0KDApOworCisgIGlmICghaXNBZ2dyZWdhdGVUeXBlRm9yQUJJKFJldFR5KSkgeworICAgIC8vIFRyZWF0IGFuIGVudW0gdHlwZSBhcyBpdHMgdW5kZXJseWluZyB0eXBlLgorICAgIGlmIChjb25zdCBFbnVtVHlwZSAqRW51bVR5ID0gUmV0VHktPmdldEFzPEVudW1UeXBlPigpKQorICAgICAgUmV0VHkgPSBFbnVtVHktPmdldERlY2woKS0+Z2V0SW50ZWdlclR5cGUoKTsKKworICAgIHJldHVybiAoUmV0VHktPmlzUHJvbW90YWJsZUludGVnZXJUeXBlKCkgPyBBQklBcmdJbmZvOjpnZXRFeHRlbmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBQklBcmdJbmZvOjpnZXREaXJlY3QoKSk7CisgIH0KKworICAvLyBTdHJ1Y3R1cmVzIHdpdGggZWl0aGVyIGEgbm9uLXRyaXZpYWwgZGVzdHJ1Y3RvciBvciBhIG5vbi10cml2aWFsCisgIC8vIGNvcHkgY29uc3RydWN0b3IgYXJlIGFsd2F5cyBpbmRpcmVjdC4KKyAgaWYgKGlzUmVjb3JkUmV0dXJuSW5kaXJlY3QoUmV0VHksIGdldENYWEFCSSgpKSkKKyAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SW5kaXJlY3QoMCwgLypCeVZhbD0qL2ZhbHNlKTsKKworICBpZiAoaXNFbXB0eVJlY29yZChnZXRDb250ZXh0KCksIFJldFR5LCB0cnVlKSkKKyAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SWdub3JlKCk7CisKKyAgY29uc3QgVHlwZSAqQmFzZSA9IDA7CisgIGlmIChpc0hvbW9nZW5lb3VzQWdncmVnYXRlKFJldFR5LCBCYXNlLCBnZXRDb250ZXh0KCkpKQorICAgIC8vIEhvbW9nZW5lb3VzIEZsb2F0aW5nLXBvaW50IEFnZ3JlZ2F0ZXMgKEhGQXMpIGFyZSByZXR1cm5lZCBkaXJlY3RseS4KKyAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0RGlyZWN0KCk7CisKKyAgLy8gQWdncmVnYXRlcyA8PSAxNiBieXRlcyBhcmUgcmV0dXJuZWQgZGlyZWN0bHkgaW4gcmVnaXN0ZXJzIG9yIG9uIHRoZSBzdGFjay4KKyAgdWludDY0X3QgU2l6ZSA9IGdldENvbnRleHQoKS5nZXRUeXBlU2l6ZShSZXRUeSk7CisgIGlmIChTaXplIDw9IDEyOCkgeworICAgIFNpemUgPSA2NCAqICgoU2l6ZSArIDYzKSAvIDY0KTsgLy8gcm91bmQgdXAgdG8gbXVsdGlwbGUgb2YgOCBieXRlcworICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXREaXJlY3QobGx2bTo6SW50ZWdlclR5cGU6OmdldChnZXRWTUNvbnRleHQoKSwgU2l6ZSkpOworICB9CisKKyAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEluZGlyZWN0KDApOworfQorCisvLy8gaXNJbGxlZ2FsVmVjdG9yVHlwZSAtIGNoZWNrIHdoZXRoZXIgdGhlIHZlY3RvciB0eXBlIGlzIGxlZ2FsIGZvciBBUk02NC4KK2Jvb2wgQVJNNjRBQklJbmZvOjppc0lsbGVnYWxWZWN0b3JUeXBlKFF1YWxUeXBlIFR5KSBjb25zdCB7CisgIGlmIChjb25zdCBWZWN0b3JUeXBlICpWVCA9IFR5LT5nZXRBczxWZWN0b3JUeXBlPigpKSB7CisgICAgLy8gQ2hlY2sgd2hldGhlciBWVCBpcyBsZWdhbC4KKyAgICB1bnNpZ25lZCBOdW1FbGVtZW50cyA9IFZULT5nZXROdW1FbGVtZW50cygpOworICAgIHVpbnQ2NF90IFNpemUgPSBnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemUoVlQpOworICAgIC8vIE51bUVsZW1lbnRzIHNob3VsZCBiZSBwb3dlciBvZiAyIGJldHdlZW4gMSBhbmQgMTYuCisgICAgaWYgKChOdW1FbGVtZW50cyAmIChOdW1FbGVtZW50cyAtIDEpKSAhPSAwIHx8IE51bUVsZW1lbnRzID4gMTYpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gU2l6ZSAhPSA2NCAmJiAoU2l6ZSAhPSAxMjggfHwgTnVtRWxlbWVudHMgPT0gMSk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgbGx2bTo6VmFsdWUgKkVtaXRBQXJjaDY0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBBbGxvY2F0ZWRHUFIsIGludCBBbGxvY2F0ZWRWRlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0luZGlyZWN0LCBDb2RlR2VuRnVuY3Rpb24gJkNHRikgeworICAvLyBUaGUgQUFyY2g2NCB2YV9saXN0IHR5cGUgYW5kIGhhbmRsaW5nIGlzIHNwZWNpZmllZCBpbiB0aGUgUHJvY2VkdXJlIENhbGwKKyAgLy8gU3RhbmRhcmQsIHNlY3Rpb24gQi40OgorICAvLworICAvLyBzdHJ1Y3QgeworICAvLyAgIHZvaWQgKl9fc3RhY2s7CisgIC8vICAgdm9pZCAqX19ncl90b3A7CisgIC8vICAgdm9pZCAqX192cl90b3A7CisgIC8vICAgaW50IF9fZ3Jfb2ZmczsKKyAgLy8gICBpbnQgX192cl9vZmZzOworICAvLyB9OworCisgIGxsdm06OkJhc2ljQmxvY2sgKk1heWJlUmVnQmxvY2sgPSBDR0YuY3JlYXRlQmFzaWNCbG9jaygidmFhcmcubWF5YmVfcmVnIik7CisgIGxsdm06OkJhc2ljQmxvY2sgKkluUmVnQmxvY2sgPSBDR0YuY3JlYXRlQmFzaWNCbG9jaygidmFhcmcuaW5fcmVnIik7CisgIGxsdm06OkJhc2ljQmxvY2sgKk9uU3RhY2tCbG9jayA9IENHRi5jcmVhdGVCYXNpY0Jsb2NrKCJ2YWFyZy5vbl9zdGFjayIpOworICBsbHZtOjpCYXNpY0Jsb2NrICpDb250QmxvY2sgPSBDR0YuY3JlYXRlQmFzaWNCbG9jaygidmFhcmcuZW5kIik7CisgIGF1dG8gJkN0eCA9IENHRi5nZXRDb250ZXh0KCk7CisKKyAgbGx2bTo6VmFsdWUgKnJlZ19vZmZzX3AgPSAwLCAqcmVnX29mZnMgPSAwOworICBpbnQgcmVnX3RvcF9pbmRleDsKKyAgaW50IFJlZ1NpemU7CisgIGlmIChBbGxvY2F0ZWRHUFIpIHsKKyAgICBhc3NlcnQoIUFsbG9jYXRlZFZGUCAmJiAiQXJndW1lbnRzIG5ldmVyIHNwbGl0IGJldHdlZW4gaW50ICYgVkZQIHJlZ3MiKTsKKyAgICAvLyAzIGlzIHRoZSBmaWVsZCBudW1iZXIgb2YgX19ncl9vZmZzCisgICAgcmVnX29mZnNfcCA9IENHRi5CdWlsZGVyLkNyZWF0ZVN0cnVjdEdFUChWQUxpc3RBZGRyLCAzLCAiZ3Jfb2Zmc19wIik7CisgICAgcmVnX29mZnMgPSBDR0YuQnVpbGRlci5DcmVhdGVMb2FkKHJlZ19vZmZzX3AsICJncl9vZmZzIik7CisgICAgcmVnX3RvcF9pbmRleCA9IDE7IC8vIGZpZWxkIG51bWJlciBmb3IgX19ncl90b3AKKyAgICBSZWdTaXplID0gOCAqIEFsbG9jYXRlZEdQUjsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoIUFsbG9jYXRlZEdQUiAmJiAiQXJndW1lbnQgbXVzdCBnbyBpbiBWRlAgb3IgaW50IHJlZ3MiKTsKKyAgICAvLyA0IGlzIHRoZSBmaWVsZCBudW1iZXIgb2YgX192cl9vZmZzLgorICAgIHJlZ19vZmZzX3AgPSBDR0YuQnVpbGRlci5DcmVhdGVTdHJ1Y3RHRVAoVkFMaXN0QWRkciwgNCwgInZyX29mZnNfcCIpOworICAgIHJlZ19vZmZzID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlTG9hZChyZWdfb2Zmc19wLCAidnJfb2ZmcyIpOworICAgIHJlZ190b3BfaW5kZXggPSAyOyAvLyBmaWVsZCBudW1iZXIgZm9yIF9fdnJfdG9wCisgICAgUmVnU2l6ZSA9IDE2ICogQWxsb2NhdGVkVkZQOworICB9CisKKyAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gRmluZCBvdXQgd2hlcmUgYXJndW1lbnQgd2FzIHBhc3NlZAorICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8vIElmIHJlZ19vZmZzID49IDAgd2UncmUgYWxyZWFkeSB1c2luZyB0aGUgc3RhY2sgZm9yIHRoaXMgdHlwZSBvZgorICAvLyBhcmd1bWVudC4gV2UgZG9uJ3Qgd2FudCB0byBrZWVwIHVwZGF0aW5nIHJlZ19vZmZzIChpbiBjYXNlIGl0IG92ZXJmbG93cywKKyAgLy8gdGhvdWdoIGFueW9uZSBwYXNzaW5nIDJHQiBvZiBhcmd1bWVudHMsIGVhY2ggYXQgbW9zdCAxNiBieXRlcywgZGVzZXJ2ZXMKKyAgLy8gd2hhdGV2ZXIgdGhleSBnZXQpLgorICBsbHZtOjpWYWx1ZSAqVXNpbmdTdGFjayA9IDA7CisgIFVzaW5nU3RhY2sgPSBDR0YuQnVpbGRlci5DcmVhdGVJQ21wU0dFKAorICAgICAgcmVnX29mZnMsIGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDMyVHksIDApKTsKKworICBDR0YuQnVpbGRlci5DcmVhdGVDb25kQnIoVXNpbmdTdGFjaywgT25TdGFja0Jsb2NrLCBNYXliZVJlZ0Jsb2NrKTsKKworICAvLyBPdGhlcndpc2UsIGF0IGxlYXN0IHNvbWUga2luZCBvZiBhcmd1bWVudCBjb3VsZCBnbyBpbiB0aGVzZSByZWdpc3RlcnMsIHRoZQorICAvLyBxdWVzaXRvbiBpcyB3aGV0aGVyIHRoaXMgcGFydGljdWxhciB0eXBlIGlzIHRvbyBiaWcuCisgIENHRi5FbWl0QmxvY2soTWF5YmVSZWdCbG9jayk7CisKKyAgLy8gSW50ZWdlciBhcmd1bWVudHMgbWF5IG5lZWQgdG8gY29ycmVjdCByZWdpc3RlciBhbGlnbm1lbnQgKGZvciBleGFtcGxlIGEKKyAgLy8gInN0cnVjdCB7IF9faW50MTI4IGE7IH07IiBnZXRzIHBhc3NlZCBpbiB4XzJOLCB4X3syTisxfSkuIEluIHRoaXMgY2FzZSB3ZQorICAvLyBhbGlnbiBfX2dyX29mZnMgdG8gY2FsY3VsYXRlIHRoZSBwb3RlbnRpYWwgYWRkcmVzcy4KKyAgaWYgKEFsbG9jYXRlZEdQUiAmJiAhSXNJbmRpcmVjdCAmJiBDdHguZ2V0VHlwZUFsaWduKFR5KSA+IDY0KSB7CisgICAgaW50IEFsaWduID0gQ3R4LmdldFR5cGVBbGlnbihUeSkgLyA4OworCisgICAgcmVnX29mZnMgPSBDR0YuQnVpbGRlci5DcmVhdGVBZGQoCisgICAgICAgIHJlZ19vZmZzLCBsbHZtOjpDb25zdGFudEludDo6Z2V0KENHRi5JbnQzMlR5LCBBbGlnbiAtIDEpLAorICAgICAgICAiYWxpZ25fcmVnb2ZmcyIpOworICAgIHJlZ19vZmZzID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlQW5kKAorICAgICAgICByZWdfb2ZmcywgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChDR0YuSW50MzJUeSwgLUFsaWduKSwKKyAgICAgICAgImFsaWduZWRfcmVnb2ZmcyIpOworICB9CisKKyAgLy8gVXBkYXRlIHRoZSBncl9vZmZzL3ZyX29mZnMgcG9pbnRlciBmb3IgbmV4dCBjYWxsIHRvIHZhX2FyZyBvbiB0aGlzIHZhX2xpc3QuCisgIGxsdm06OlZhbHVlICpOZXdPZmZzZXQgPSAwOworICBOZXdPZmZzZXQgPSBDR0YuQnVpbGRlci5DcmVhdGVBZGQoCisgICAgICByZWdfb2ZmcywgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChDR0YuSW50MzJUeSwgUmVnU2l6ZSksICJuZXdfcmVnX29mZnMiKTsKKyAgQ0dGLkJ1aWxkZXIuQ3JlYXRlU3RvcmUoTmV3T2Zmc2V0LCByZWdfb2Zmc19wKTsKKworICAvLyBOb3cgd2UncmUgaW4gYSBwb3NpdGlvbiB0byBkZWNpZGUgd2hldGhlciB0aGlzIGFyZ3VtZW50IHJlYWxseSB3YXMgaW4KKyAgLy8gcmVnaXN0ZXJzIG9yIG5vdC4KKyAgbGx2bTo6VmFsdWUgKkluUmVncyA9IDA7CisgIEluUmVncyA9IENHRi5CdWlsZGVyLkNyZWF0ZUlDbXBTTEUoCisgICAgICBOZXdPZmZzZXQsIGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDMyVHksIDApLCAiaW5yZWciKTsKKworICBDR0YuQnVpbGRlci5DcmVhdGVDb25kQnIoSW5SZWdzLCBJblJlZ0Jsb2NrLCBPblN0YWNrQmxvY2spOworCisgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIEFyZ3VtZW50IHdhcyBpbiByZWdpc3RlcnMKKyAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAvLyBOb3cgd2UgZW1pdCB0aGUgY29kZSBmb3IgaWYgdGhlIGFyZ3VtZW50IHdhcyBvcmlnaW5hbGx5IHBhc3NlZCBpbgorICAvLyByZWdpc3RlcnMuIEZpcnN0IHN0YXJ0IHRoZSBhcHByb3ByaWF0ZSBibG9jazoKKyAgQ0dGLkVtaXRCbG9jayhJblJlZ0Jsb2NrKTsKKworICBsbHZtOjpWYWx1ZSAqcmVnX3RvcF9wID0gMCwgKnJlZ190b3AgPSAwOworICByZWdfdG9wX3AgPQorICAgICAgQ0dGLkJ1aWxkZXIuQ3JlYXRlU3RydWN0R0VQKFZBTGlzdEFkZHIsIHJlZ190b3BfaW5kZXgsICJyZWdfdG9wX3AiKTsKKyAgcmVnX3RvcCA9IENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQocmVnX3RvcF9wLCAicmVnX3RvcCIpOworICBsbHZtOjpWYWx1ZSAqQmFzZUFkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVHRVAocmVnX3RvcCwgcmVnX29mZnMpOworICBsbHZtOjpWYWx1ZSAqUmVnQWRkciA9IDA7CisgIGxsdm06OlR5cGUgKk1lbVR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChDR0YuQ29udmVydFR5cGVGb3JNZW0oVHkpKTsKKworICBpZiAoSXNJbmRpcmVjdCkgeworICAgIC8vIElmIGl0J3MgYmVlbiBwYXNzZWQgaW5kaXJlY3RseSAoYWN0dWFsbHkgYSBzdHJ1Y3QpLCB3aGF0ZXZlciB3ZSBmaW5kIGZyb20KKyAgICAvLyBzdG9yZWQgcmVnaXN0ZXJzIG9yIG9uIHRoZSBzdGFjayB3aWxsIGFjdHVhbGx5IGJlIGEgc3RydWN0ICoqLgorICAgIE1lbVR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChNZW1UeSk7CisgIH0KKworICBjb25zdCBUeXBlICpCYXNlID0gMDsKKyAgdWludDY0X3QgTnVtTWVtYmVyczsKKyAgaWYgKGlzSG9tb2dlbmVvdXNBZ2dyZWdhdGUoVHksIEJhc2UsIEN0eCwgJk51bU1lbWJlcnMpICYmIE51bU1lbWJlcnMgPiAxKSB7CisgICAgLy8gSG9tb2dlbmVvdXMgYWdncmVnYXRlcyBwYXNzZWQgaW4gcmVnaXN0ZXJzIHdpbGwgaGF2ZSB0aGVpciBlbGVtZW50cyBzcGxpdAorICAgIC8vIGFuZCBzdG9yZWQgMTYtYnl0ZXMgYXBhcnQgcmVnYXJkbGVzcyBvZiBzaXplICh0aGV5J3JlIG5vdGlvbmFsbHkgaW4gcU4sCisgICAgLy8gcU4rMSwgLi4uKS4gV2UgcmVsb2FkIGFuZCBzdG9yZSBpbnRvIGEgdGVtcG9yYXJ5IGxvY2FsIHZhcmlhYmxlCisgICAgLy8gY29udGlndW91c2x5LgorICAgIGFzc2VydCghSXNJbmRpcmVjdCAmJiAiSG9tb2dlbmVvdXMgYWdncmVnYXRlcyBzaG91bGQgYmUgcGFzc2VkIGRpcmVjdGx5Iik7CisgICAgbGx2bTo6VHlwZSAqQmFzZVR5ID0gQ0dGLkNvbnZlcnRUeXBlKFF1YWxUeXBlKEJhc2UsIDApKTsKKyAgICBsbHZtOjpUeXBlICpIRkFUeSA9IGxsdm06OkFycmF5VHlwZTo6Z2V0KEJhc2VUeSwgTnVtTWVtYmVycyk7CisgICAgbGx2bTo6VmFsdWUgKlRtcCA9IENHRi5DcmVhdGVUZW1wQWxsb2NhKEhGQVR5KTsKKyAgICBpbnQgT2Zmc2V0ID0gMDsKKworICAgIGlmIChDR0YuQ0dNLmdldERhdGFMYXlvdXQoKS5pc0JpZ0VuZGlhbigpICYmIEN0eC5nZXRUeXBlU2l6ZShCYXNlKSA8IDEyOCkKKyAgICAgIE9mZnNldCA9IDE2IC0gQ3R4LmdldFR5cGVTaXplKEJhc2UpIC8gODsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtTWVtYmVyczsgKytpKSB7CisgICAgICBsbHZtOjpWYWx1ZSAqQmFzZU9mZnNldCA9CisgICAgICAgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChDR0YuSW50MzJUeSwgMTYgKiBpICsgT2Zmc2V0KTsKKyAgICAgIGxsdm06OlZhbHVlICpMb2FkQWRkciA9IENHRi5CdWlsZGVyLkNyZWF0ZUdFUChCYXNlQWRkciwgQmFzZU9mZnNldCk7CisgICAgICBMb2FkQWRkciA9IENHRi5CdWlsZGVyLkNyZWF0ZUJpdENhc3QoCisgICAgICAgICAgTG9hZEFkZHIsIGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoQmFzZVR5KSk7CisgICAgICBsbHZtOjpWYWx1ZSAqU3RvcmVBZGRyID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlU3RydWN0R0VQKFRtcCwgaSk7CisKKyAgICAgIGxsdm06OlZhbHVlICpFbGVtID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlTG9hZChMb2FkQWRkcik7CisgICAgICBDR0YuQnVpbGRlci5DcmVhdGVTdG9yZShFbGVtLCBTdG9yZUFkZHIpOworICAgIH0KKworICAgIFJlZ0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KFRtcCwgTWVtVHkpOworICB9IGVsc2UgeworICAgIC8vIE90aGVyd2lzZSB0aGUgb2JqZWN0IGlzIGNvbnRpZ3VvdXMgaW4gbWVtb3J5CisgICAgdW5zaWduZWQgQmVBbGlnbiA9IHJlZ190b3BfaW5kZXggPT0gMiA/IDE2IDogODsKKyAgICBpZiAoQ0dGLkNHTS5nZXREYXRhTGF5b3V0KCkuaXNCaWdFbmRpYW4oKSAmJiAhaXNBZ2dyZWdhdGVUeXBlRm9yQUJJKFR5KSAmJgorICAgICAgICBDdHguZ2V0VHlwZVNpemUoVHkpIDwgKEJlQWxpZ24gKiA4KSkgeworICAgICAgaW50IE9mZnNldCA9IEJlQWxpZ24gLSBDdHguZ2V0VHlwZVNpemUoVHkpIC8gODsKKyAgICAgIEJhc2VBZGRyID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlUHRyVG9JbnQoQmFzZUFkZHIsIENHRi5JbnQ2NFR5KTsKKworICAgICAgQmFzZUFkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVBZGQoCisgICAgICAgICAgQmFzZUFkZHIsIGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDY0VHksIE9mZnNldCksICJhbGlnbl9iZSIpOworCisgICAgICBCYXNlQWRkciA9IENHRi5CdWlsZGVyLkNyZWF0ZUludFRvUHRyKEJhc2VBZGRyLCBDR0YuSW50OFB0clR5KTsKKyAgICB9CisKKyAgICBSZWdBZGRyID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChCYXNlQWRkciwgTWVtVHkpOworICB9CisKKyAgQ0dGLkVtaXRCcmFuY2goQ29udEJsb2NrKTsKKworICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBBcmd1bWVudCB3YXMgb24gdGhlIHN0YWNrCisgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIENHRi5FbWl0QmxvY2soT25TdGFja0Jsb2NrKTsKKworICBsbHZtOjpWYWx1ZSAqc3RhY2tfcCA9IDAsICpPblN0YWNrQWRkciA9IDA7CisgIHN0YWNrX3AgPSBDR0YuQnVpbGRlci5DcmVhdGVTdHJ1Y3RHRVAoVkFMaXN0QWRkciwgMCwgInN0YWNrX3AiKTsKKyAgT25TdGFja0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVMb2FkKHN0YWNrX3AsICJzdGFjayIpOworCisgIC8vIEFnYWluLCBzdGFjayBhcmd1bWVudHMgbWF5IG5lZWQgcmVhbGlnbW5lbnQuIEluIHRoaXMgY2FzZSBib3RoIGludGVnZXIgYW5kCisgIC8vIGZsb2F0aW5nLXBvaW50IG9uZXMgbWlnaHQgYmUgYWZmZWN0ZWQuCisgIGlmICghSXNJbmRpcmVjdCAmJiBDdHguZ2V0VHlwZUFsaWduKFR5KSA+IDY0KSB7CisgICAgaW50IEFsaWduID0gQ3R4LmdldFR5cGVBbGlnbihUeSkgLyA4OworCisgICAgT25TdGFja0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVQdHJUb0ludChPblN0YWNrQWRkciwgQ0dGLkludDY0VHkpOworCisgICAgT25TdGFja0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVBZGQoCisgICAgICAgIE9uU3RhY2tBZGRyLCBsbHZtOjpDb25zdGFudEludDo6Z2V0KENHRi5JbnQ2NFR5LCBBbGlnbiAtIDEpLAorICAgICAgICAiYWxpZ25fc3RhY2siKTsKKyAgICBPblN0YWNrQWRkciA9IENHRi5CdWlsZGVyLkNyZWF0ZUFuZCgKKyAgICAgICAgT25TdGFja0FkZHIsIGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDY0VHksIC1BbGlnbiksCisgICAgICAgICJhbGlnbl9zdGFjayIpOworCisgICAgT25TdGFja0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVJbnRUb1B0cihPblN0YWNrQWRkciwgQ0dGLkludDhQdHJUeSk7CisgIH0KKworICB1aW50NjRfdCBTdGFja1NpemU7CisgIGlmIChJc0luZGlyZWN0KQorICAgIFN0YWNrU2l6ZSA9IDg7CisgIGVsc2UKKyAgICBTdGFja1NpemUgPSBDdHguZ2V0VHlwZVNpemUoVHkpIC8gODsKKworICAvLyBBbGwgc3RhY2sgc2xvdHMgYXJlIDggYnl0ZXMKKyAgU3RhY2tTaXplID0gbGx2bTo6Um91bmRVcFRvQWxpZ25tZW50KFN0YWNrU2l6ZSwgOCk7CisKKyAgbGx2bTo6VmFsdWUgKlN0YWNrU2l6ZUMgPSBsbHZtOjpDb25zdGFudEludDo6Z2V0KENHRi5JbnQzMlR5LCBTdGFja1NpemUpOworICBsbHZtOjpWYWx1ZSAqTmV3U3RhY2sgPQorICAgICAgQ0dGLkJ1aWxkZXIuQ3JlYXRlR0VQKE9uU3RhY2tBZGRyLCBTdGFja1NpemVDLCAibmV3X3N0YWNrIik7CisKKyAgLy8gV3JpdGUgdGhlIG5ldyB2YWx1ZSBvZiBfX3N0YWNrIGZvciB0aGUgbmV4dCBjYWxsIHRvIHZhX2FyZworICBDR0YuQnVpbGRlci5DcmVhdGVTdG9yZShOZXdTdGFjaywgc3RhY2tfcCk7CisKKyAgaWYgKENHRi5DR00uZ2V0RGF0YUxheW91dCgpLmlzQmlnRW5kaWFuKCkgJiYgIWlzQWdncmVnYXRlVHlwZUZvckFCSShUeSkgJiYKKyAgICAgIEN0eC5nZXRUeXBlU2l6ZShUeSkgPCA2NCkgeworICAgIGludCBPZmZzZXQgPSA4IC0gQ3R4LmdldFR5cGVTaXplKFR5KSAvIDg7CisgICAgT25TdGFja0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVQdHJUb0ludChPblN0YWNrQWRkciwgQ0dGLkludDY0VHkpOworCisgICAgT25TdGFja0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVBZGQoCisgICAgICAgIE9uU3RhY2tBZGRyLCBsbHZtOjpDb25zdGFudEludDo6Z2V0KENHRi5JbnQ2NFR5LCBPZmZzZXQpLCAiYWxpZ25fYmUiKTsKKworICAgIE9uU3RhY2tBZGRyID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlSW50VG9QdHIoT25TdGFja0FkZHIsIENHRi5JbnQ4UHRyVHkpOworICB9CisKKyAgT25TdGFja0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KE9uU3RhY2tBZGRyLCBNZW1UeSk7CisKKyAgQ0dGLkVtaXRCcmFuY2goQ29udEJsb2NrKTsKKworICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAvLyBUaWR5IHVwCisgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIENHRi5FbWl0QmxvY2soQ29udEJsb2NrKTsKKworICBsbHZtOjpQSElOb2RlICpSZXNBZGRyID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlUEhJKE1lbVR5LCAyLCAidmFhcmcuYWRkciIpOworICBSZXNBZGRyLT5hZGRJbmNvbWluZyhSZWdBZGRyLCBJblJlZ0Jsb2NrKTsKKyAgUmVzQWRkci0+YWRkSW5jb21pbmcoT25TdGFja0FkZHIsIE9uU3RhY2tCbG9jayk7CisKKyAgaWYgKElzSW5kaXJlY3QpCisgICAgcmV0dXJuIENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQoUmVzQWRkciwgInZhYXJnLmFkZHIiKTsKKworICByZXR1cm4gUmVzQWRkcjsKK30KKworbGx2bTo6VmFsdWUgKkFSTTY0QUJJSW5mbzo6RW1pdEFBUENTVkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0IHsKKworICB1bnNpZ25lZCBBbGxvY2F0ZWRHUFIgPSAwLCBBbGxvY2F0ZWRWRlAgPSAwOworICBib29sIElzSEEgPSBmYWxzZSwgSXNTbWFsbEFnZ3IgPSBmYWxzZTsKKyAgQUJJQXJnSW5mbyBBSSA9CisgICAgICBjbGFzc2lmeUFyZ3VtZW50VHlwZShUeSwgQWxsb2NhdGVkVkZQLCBJc0hBLCBBbGxvY2F0ZWRHUFIsIElzU21hbGxBZ2dyKTsKKworICByZXR1cm4gRW1pdEFBcmNoNjRWQUFyZyhWQUxpc3RBZGRyLCBUeSwgQWxsb2NhdGVkR1BSLCBBbGxvY2F0ZWRWRlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFJLmlzSW5kaXJlY3QoKSwgQ0dGKTsKK30KKworbGx2bTo6VmFsdWUgKkFSTTY0QUJJSW5mbzo6RW1pdERhcndpblZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRikgY29uc3QgeworICAvLyBXZSBkbyBub3Qgc3VwcG9ydCB2YV9hcmcgZm9yIGFnZ3JlZ2F0ZXMgb3IgaWxsZWdhbCB2ZWN0b3IgdHlwZXMuCisgIC8vIExvd2VyIFZBQXJnIGhlcmUgZm9yIHRoZXNlIGNhc2VzIGFuZCB1c2UgdGhlIExMVk0gdmFfYXJnIGluc3RydWN0aW9uIGZvcgorICAvLyBvdGhlciBjYXNlcy4KKyAgaWYgKCFpc0FnZ3JlZ2F0ZVR5cGVGb3JBQkkoVHkpICYmICFpc0lsbGVnYWxWZWN0b3JUeXBlKFR5KSkKKyAgICByZXR1cm4gMDsKKworICB1aW50NjRfdCBTaXplID0gQ0dGLmdldENvbnRleHQoKS5nZXRUeXBlU2l6ZShUeSkgLyA4OworICB1aW50NjRfdCBBbGlnbiA9IENHRi5nZXRDb250ZXh0KCkuZ2V0VHlwZUFsaWduKFR5KSAvIDg7CisKKyAgY29uc3QgVHlwZSAqQmFzZSA9IDA7CisgIGJvb2wgaXNIQSA9IGlzSG9tb2dlbmVvdXNBZ2dyZWdhdGUoVHksIEJhc2UsIGdldENvbnRleHQoKSk7CisKKyAgYm9vbCBpc0luZGlyZWN0ID0gZmFsc2U7CisgIC8vIEFyZ3VtZW50cyBiaWdnZXIgdGhhbiAxNiBieXRlcyB3aGljaCBhcmVuJ3QgaG9tb2dlbmVvdXMgYWdncmVnYXRlcyBzaG91bGQKKyAgLy8gYmUgcGFzc2VkIGluZGlyZWN0bHkuCisgIGlmIChTaXplID4gMTYgJiYgIWlzSEEpIHsKKyAgICBpc0luZGlyZWN0ID0gdHJ1ZTsKKyAgICBTaXplID0gODsKKyAgICBBbGlnbiA9IDg7CisgIH0KKworICBsbHZtOjpUeXBlICpCUCA9IGxsdm06OlR5cGU6OmdldEludDhQdHJUeShDR0YuZ2V0TExWTUNvbnRleHQoKSk7CisgIGxsdm06OlR5cGUgKkJQUCA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoQlApOworCisgIENHQnVpbGRlclR5ICZCdWlsZGVyID0gQ0dGLkJ1aWxkZXI7CisgIGxsdm06OlZhbHVlICpWQUxpc3RBZGRyQXNCUFAgPSBCdWlsZGVyLkNyZWF0ZUJpdENhc3QoVkFMaXN0QWRkciwgQlBQLCAiYXAiKTsKKyAgbGx2bTo6VmFsdWUgKkFkZHIgPSBCdWlsZGVyLkNyZWF0ZUxvYWQoVkFMaXN0QWRkckFzQlBQLCAiYXAuY3VyIik7CisKKyAgaWYgKGlzRW1wdHlSZWNvcmQoZ2V0Q29udGV4dCgpLCBUeSwgdHJ1ZSkpIHsKKyAgICAvLyBUaGVzZSBhcmUgaWdub3JlZCBmb3IgcGFyYW1ldGVyIHBhc3NpbmcgcHVycG9zZXMuCisgICAgbGx2bTo6VHlwZSAqUFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChDR0YuQ29udmVydFR5cGUoVHkpKTsKKyAgICByZXR1cm4gQnVpbGRlci5DcmVhdGVCaXRDYXN0KEFkZHIsIFBUeSk7CisgIH0KKworICBjb25zdCB1aW50NjRfdCBNaW5BQklBbGlnbiA9IDg7CisgIGlmIChBbGlnbiA+IE1pbkFCSUFsaWduKSB7CisgICAgbGx2bTo6VmFsdWUgKk9mZnNldCA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDMyVHksIEFsaWduIC0gMSk7CisgICAgQWRkciA9IEJ1aWxkZXIuQ3JlYXRlR0VQKEFkZHIsIE9mZnNldCk7CisgICAgbGx2bTo6VmFsdWUgKkFzSW50ID0gQnVpbGRlci5DcmVhdGVQdHJUb0ludChBZGRyLCBDR0YuSW50NjRUeSk7CisgICAgbGx2bTo6VmFsdWUgKk1hc2sgPSBsbHZtOjpDb25zdGFudEludDo6Z2V0KENHRi5JbnQ2NFR5LCB+KEFsaWduIC0gMSkpOworICAgIGxsdm06OlZhbHVlICpBbGlnbmVkID0gQnVpbGRlci5DcmVhdGVBbmQoQXNJbnQsIE1hc2spOworICAgIEFkZHIgPSBCdWlsZGVyLkNyZWF0ZUludFRvUHRyKEFsaWduZWQsIEJQLCAiYXAuYWxpZ24iKTsKKyAgfQorCisgIHVpbnQ2NF90IE9mZnNldCA9IGxsdm06OlJvdW5kVXBUb0FsaWdubWVudChTaXplLCBNaW5BQklBbGlnbik7CisgIGxsdm06OlZhbHVlICpOZXh0QWRkciA9IEJ1aWxkZXIuQ3JlYXRlR0VQKAorICAgICAgQWRkciwgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChDR0YuSW50MzJUeSwgT2Zmc2V0KSwgImFwLm5leHQiKTsKKyAgQnVpbGRlci5DcmVhdGVTdG9yZShOZXh0QWRkciwgVkFMaXN0QWRkckFzQlBQKTsKKworICBpZiAoaXNJbmRpcmVjdCkKKyAgICBBZGRyID0gQnVpbGRlci5DcmVhdGVMb2FkKEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChBZGRyLCBCUFApKTsKKyAgbGx2bTo6VHlwZSAqUFR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChDR0YuQ29udmVydFR5cGUoVHkpKTsKKyAgbGx2bTo6VmFsdWUgKkFkZHJUeXBlZCA9IEJ1aWxkZXIuQ3JlYXRlQml0Q2FzdChBZGRyLCBQVHkpOworCisgIHJldHVybiBBZGRyVHlwZWQ7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAvLyBBUk0gQUJJIEltcGxlbWVudGF0aW9uCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCkBAIC0zMDY0LDM1ICszNzEzLDYyIEBACiAKIHByaXZhdGU6CiAgIEFCSUtpbmQgS2luZDsKKyAgbXV0YWJsZSBpbnQgVkZQUmVnc1sxNl07CisgIGNvbnN0IHVuc2lnbmVkIE51bVZGUHM7CisgIGNvbnN0IHVuc2lnbmVkIE51bUdQUnM7CisgIG11dGFibGUgdW5zaWduZWQgQWxsb2NhdGVkR1BSczsKKyAgbXV0YWJsZSB1bnNpZ25lZCBBbGxvY2F0ZWRWRlBzOwogCiBwdWJsaWM6Ci0gIEFSTUFCSUluZm8oQ29kZUdlblR5cGVzICZDR1QsIEFCSUtpbmQgX0tpbmQpIDogQUJJSW5mbyhDR1QpLCBLaW5kKF9LaW5kKSB7CisgIEFSTUFCSUluZm8oQ29kZUdlblR5cGVzICZDR1QsIEFCSUtpbmQgX0tpbmQpIDogQUJJSW5mbyhDR1QpLCBLaW5kKF9LaW5kKSwKKyAgICBOdW1WRlBzKDE2KSwgTnVtR1BScyg0KSB7CiAgICAgc2V0UnVudGltZUNDKCk7CisgICAgcmVzZXRBbGxvY2F0ZWRSZWdzKCk7CiAgIH0KIAogICBib29sIGlzRUFCSSgpIGNvbnN0IHsKLSAgICBTdHJpbmdSZWYgRW52ID0gZ2V0VGFyZ2V0KCkuZ2V0VHJpcGxlKCkuZ2V0RW52aXJvbm1lbnROYW1lKCk7Ci0gICAgcmV0dXJuIChFbnYgPT0gImdudWVhYmkiIHx8IEVudiA9PSAiZWFiaSIgfHwKLSAgICAgICAgICAgIEVudiA9PSAiYW5kcm9pZCIgfHwgRW52ID09ICJhbmRyb2lkZWFiaSIpOworICAgIHN3aXRjaCAoZ2V0VGFyZ2V0KCkuZ2V0VHJpcGxlKCkuZ2V0RW52aXJvbm1lbnQoKSkgeworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpBbmRyb2lkOgorICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpFQUJJOgorICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpFQUJJSEY6CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkdOVUVBQkk6CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkdOVUVBQklIRjoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgYm9vbCBpc0VBQklIRigpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGdldFRhcmdldCgpLmdldFRyaXBsZSgpLmdldEVudmlyb25tZW50KCkpIHsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6RUFCSUhGOgorICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpHTlVFQUJJSEY6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgfQogCiAgIEFCSUtpbmQgZ2V0QUJJS2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KIAogcHJpdmF0ZToKLSAgQUJJQXJnSW5mbyBjbGFzc2lmeVJldHVyblR5cGUoUXVhbFR5cGUgUmV0VHkpIGNvbnN0OwotICBBQklBcmdJbmZvIGNsYXNzaWZ5QXJndW1lbnRUeXBlKFF1YWxUeXBlIFJldFR5LCBpbnQgKlZGUFJlZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkFsbG9jYXRlZFZGUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJc0hBKSBjb25zdDsKKyAgQUJJQXJnSW5mbyBjbGFzc2lmeVJldHVyblR5cGUoUXVhbFR5cGUgUmV0VHksIGJvb2wgaXNWYXJpYWRpYykgY29uc3Q7CisgIEFCSUFyZ0luZm8gY2xhc3NpZnlBcmd1bWVudFR5cGUoUXVhbFR5cGUgUmV0VHksIGJvb2wgJklzSEEsIGJvb2wgaXNWYXJpYWRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJc0NQUkMpIGNvbnN0OwogICBib29sIGlzSWxsZWdhbFZlY3RvclR5cGUoUXVhbFR5cGUgVHkpIGNvbnN0OwogCi0gIHZpcnR1YWwgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0OworICB2b2lkIGNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqRW1pdFZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdDsKKyAgbGx2bTo6VmFsdWUgKkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgUXVhbFR5cGUgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0IG92ZXJyaWRlOwogCiAgIGxsdm06OkNhbGxpbmdDb252OjpJRCBnZXRMTFZNRGVmYXVsdENDKCkgY29uc3Q7CiAgIGxsdm06OkNhbGxpbmdDb252OjpJRCBnZXRBQklEZWZhdWx0Q0MoKSBjb25zdDsKICAgdm9pZCBzZXRSdW50aW1lQ0MoKTsKKworICB2b2lkIG1hcmtBbGxvY2F0ZWRHUFJzKHVuc2lnbmVkIEFsaWdubWVudCwgdW5zaWduZWQgTnVtUmVxdWlyZWQpIGNvbnN0OworICB2b2lkIG1hcmtBbGxvY2F0ZWRWRlBzKHVuc2lnbmVkIEFsaWdubWVudCwgdW5zaWduZWQgTnVtUmVxdWlyZWQpIGNvbnN0OworICB2b2lkIHJlc2V0QWxsb2NhdGVkUmVncyh2b2lkKSBjb25zdDsKIH07CiAKIGNsYXNzIEFSTVRhcmdldENvZGVHZW5JbmZvIDogcHVibGljIFRhcmdldENvZGVHZW5JbmZvIHsKQEAgLTMxMDQsMTYgKzM3ODAsMTYgQEAKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQVJNQUJJSW5mbyY+KFRhcmdldENvZGVHZW5JbmZvOjpnZXRBQklJbmZvKCkpOwogICB9CiAKLSAgaW50IGdldER3YXJmRUhTdGFja1BvaW50ZXIoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmTSkgY29uc3QgeworICBpbnQgZ2V0RHdhcmZFSFN0YWNrUG9pbnRlcihDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZNKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDEzOwogICB9CiAKLSAgU3RyaW5nUmVmIGdldEFSQ1JldGFpbkF1dG9yZWxlYXNlZFJldHVyblZhbHVlTWFya2VyKCkgY29uc3QgeworICBTdHJpbmdSZWYgZ2V0QVJDUmV0YWluQXV0b3JlbGVhc2VkUmV0dXJuVmFsdWVNYXJrZXIoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuICJtb3ZcdHI3LCByN1x0XHRAIG1hcmtlciBmb3Igb2JqY19yZXRhaW5BdXRvcmVsZWFzZVJldHVyblZhbHVlIjsKICAgfQogCiAgIGJvb2wgaW5pdER3YXJmRUhSZWdTaXplVGFibGUoQ29kZUdlbjo6Q29kZUdlbkZ1bmN0aW9uICZDR0YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkFkZHJlc3MpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQWRkcmVzcykgY29uc3Qgb3ZlcnJpZGUgewogICAgIGxsdm06OlZhbHVlICpGb3VyOCA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDhUeSwgNCk7CiAKICAgICAvLyAwLTE1IGFyZSB0aGUgMTYgaW50ZWdlciByZWdpc3RlcnMuCkBAIC0zMTIxLDEzICszNzk3LDEzIEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgdW5zaWduZWQgZ2V0U2l6ZU9mVW53aW5kRXhjZXB0aW9uKCkgY29uc3QgeworICB1bnNpZ25lZCBnZXRTaXplT2ZVbndpbmRFeGNlcHRpb24oKSBjb25zdCBvdmVycmlkZSB7CiAgICAgaWYgKGdldEFCSUluZm8oKS5pc0VBQkkoKSkgcmV0dXJuIDg4OwogICAgIHJldHVybiBUYXJnZXRDb2RlR2VuSW5mbzo6Z2V0U2l6ZU9mVW53aW5kRXhjZXB0aW9uKCk7CiAgIH0KIAogICB2b2lkIFNldFRhcmdldEF0dHJpYnV0ZXMoY29uc3QgRGVjbCAqRCwgbGx2bTo6R2xvYmFsVmFsdWUgKkdWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmQ0dNKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZDR00pIGNvbnN0IG92ZXJyaWRlIHsKICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihEKTsKICAgICBpZiAoIUZEKQogICAgICAgcmV0dXJuOwpAQCAtMzE3NiwyNCArMzg1Miw0MCBAQAogICAvLyBhbGxvY2F0ZWQgdG8gdGhlIGxvd2VzdC1udW1iZXJlZCBzZXF1ZW5jZSBvZiBzdWNoIHJlZ2lzdGVycy4KICAgLy8gQy4yLnZmcCBJZiB0aGUgYXJndW1lbnQgaXMgYSBWRlAgQ1BSQyB0aGVuIGFueSBWRlAgcmVnaXN0ZXJzIHRoYXQgYXJlCiAgIC8vIHVuYWxsb2NhdGVkIGFyZSBtYXJrZWQgYXMgdW5hdmFpbGFibGUuIAotICB1bnNpZ25lZCBBbGxvY2F0ZWRWRlAgPSAwOwotICBpbnQgVkZQUmVnc1sxNl0gPSB7IDAgfTsKLSAgRkkuZ2V0UmV0dXJuSW5mbygpID0gY2xhc3NpZnlSZXR1cm5UeXBlKEZJLmdldFJldHVyblR5cGUoKSk7Ci0gIGZvciAoQ0dGdW5jdGlvbkluZm86OmFyZ19pdGVyYXRvciBpdCA9IEZJLmFyZ19iZWdpbigpLCBpZSA9IEZJLmFyZ19lbmQoKTsKLSAgICAgICBpdCAhPSBpZTsgKytpdCkgewotICAgIHVuc2lnbmVkIFByZUFsbG9jYXRpb24gPSBBbGxvY2F0ZWRWRlA7CisgIHJlc2V0QWxsb2NhdGVkUmVncygpOworCisgIEZJLmdldFJldHVybkluZm8oKSA9IGNsYXNzaWZ5UmV0dXJuVHlwZShGSS5nZXRSZXR1cm5UeXBlKCksIEZJLmlzVmFyaWFkaWMoKSk7CisgIGZvciAoYXV0byAmSSA6IEZJLmFyZ3VtZW50cygpKSB7CisgICAgdW5zaWduZWQgUHJlQWxsb2NhdGlvblZGUHMgPSBBbGxvY2F0ZWRWRlBzOworICAgIHVuc2lnbmVkIFByZUFsbG9jYXRpb25HUFJzID0gQWxsb2NhdGVkR1BSczsKICAgICBib29sIElzSEEgPSBmYWxzZTsKKyAgICBib29sIElzQ1BSQyA9IGZhbHNlOwogICAgIC8vIDYuMS4yLjMgVGhlcmUgaXMgb25lIFZGUCBjby1wcm9jZXNzb3IgcmVnaXN0ZXIgY2xhc3MgdXNpbmcgcmVnaXN0ZXJzCiAgICAgLy8gczAtczE1IChkMC1kNykgZm9yIHBhc3NpbmcgYXJndW1lbnRzLgotICAgIGNvbnN0IHVuc2lnbmVkIE51bVZGUHMgPSAxNjsKLSAgICBpdC0+aW5mbyA9IGNsYXNzaWZ5QXJndW1lbnRUeXBlKGl0LT50eXBlLCBWRlBSZWdzLCBBbGxvY2F0ZWRWRlAsIElzSEEpOworICAgIEkuaW5mbyA9IGNsYXNzaWZ5QXJndW1lbnRUeXBlKEkudHlwZSwgSXNIQSwgRkkuaXNWYXJpYWRpYygpLCBJc0NQUkMpOworICAgIGFzc2VydCgoSXNDUFJDIHx8ICFJc0hBKSAmJiAiSG9tb2dlbmVvdXMgYWdncmVnYXRlcyBtdXN0IGJlIENQUkNzIik7CiAgICAgLy8gSWYgd2UgZG8gbm90IGhhdmUgZW5vdWdoIFZGUCByZWdpc3RlcnMgZm9yIHRoZSBIQSwgYW55IFZGUCByZWdpc3RlcnMKICAgICAvLyB0aGF0IGFyZSB1bmFsbG9jYXRlZCBhcmUgbWFya2VkIGFzIHVuYXZhaWxhYmxlLiBUbyBhY2hpZXZlIHRoaXMsIHdlIGFkZAotICAgIC8vIHBhZGRpbmcgb2YgKE51bVZGUHMgLSBQcmVBbGxvY2F0aW9uKSBmbG9hdHMuCi0gICAgaWYgKElzSEEgJiYgQWxsb2NhdGVkVkZQID4gTnVtVkZQcyAmJiBQcmVBbGxvY2F0aW9uIDwgTnVtVkZQcykgeworICAgIC8vIHBhZGRpbmcgb2YgKE51bVZGUHMgLSBQcmVBbGxvY2F0aW9uVkZQKSBmbG9hdHMuCisgICAgLy8gTm90ZSB0aGF0IElzSEEgd2lsbCBvbmx5IGJlIHNldCB3aGVuIHVzaW5nIHRoZSBBQVBDUy1WRlAgY2FsbGluZyBjb252ZW50aW9uLAorICAgIC8vIGFuZCB0aGUgY2FsbGVlIGlzIG5vdCB2YXJpYWRpYy4KKyAgICBpZiAoSXNIQSAmJiBBbGxvY2F0ZWRWRlBzID4gTnVtVkZQcyAmJiBQcmVBbGxvY2F0aW9uVkZQcyA8IE51bVZGUHMpIHsKICAgICAgIGxsdm06OlR5cGUgKlBhZGRpbmdUeSA9IGxsdm06OkFycmF5VHlwZTo6Z2V0KAotICAgICAgICAgIGxsdm06OlR5cGU6OmdldEZsb2F0VHkoZ2V0Vk1Db250ZXh0KCkpLCBOdW1WRlBzIC0gUHJlQWxsb2NhdGlvbik7Ci0gICAgICBpdC0+aW5mbyA9IEFCSUFyZ0luZm86OmdldEV4cGFuZFdpdGhQYWRkaW5nKGZhbHNlLCBQYWRkaW5nVHkpOworICAgICAgICAgIGxsdm06OlR5cGU6OmdldEZsb2F0VHkoZ2V0Vk1Db250ZXh0KCkpLCBOdW1WRlBzIC0gUHJlQWxsb2NhdGlvblZGUHMpOworICAgICAgSS5pbmZvID0gQUJJQXJnSW5mbzo6Z2V0RXhwYW5kV2l0aFBhZGRpbmcoZmFsc2UsIFBhZGRpbmdUeSk7CisgICAgfQorCisgICAgLy8gSWYgd2UgaGF2ZSBhbGxvY2F0ZWQgc29tZSBhcmd1bWVudHMgb250byB0aGUgc3RhY2sgKGR1ZSB0byBydW5uaW5nCisgICAgLy8gb3V0IG9mIFZGUCByZWdpc3RlcnMpLCB3ZSBjYW5ub3Qgc3BsaXQgYW4gYXJndW1lbnQgYmV0d2VlbiBHUFJzIGFuZAorICAgIC8vIHRoZSBzdGFjay4gSWYgdGhpcyBzaXR1YXRpb24gb2NjdXJzLCB3ZSBhZGQgcGFkZGluZyB0byBwcmV2ZW50IHRoZQorICAgIC8vIEdQUnMgZnJvbSBiZWluZyB1c2VkLiBJbiB0aGlzIHNpdHVpYXRpb24sIHRoZSBjdXJyZW50IGFyZ3VtZW50IGNvdWxkCisgICAgLy8gb25seSBiZSBhbGxvY2F0ZWQgYnkgcnVsZSBDLjgsIHNvIHJ1bGUgQy42IHdvdWxkIG1hcmsgdGhlc2UgR1BScyBhcworICAgIC8vIHVudXNhYmxlIGFueXdheS4KKyAgICBjb25zdCBib29sIFN0YWNrVXNlZCA9IFByZUFsbG9jYXRpb25HUFJzID4gTnVtR1BScyB8fCBQcmVBbGxvY2F0aW9uVkZQcyA+IE51bVZGUHM7CisgICAgaWYgKCFJc0NQUkMgJiYgUHJlQWxsb2NhdGlvbkdQUnMgPCBOdW1HUFJzICYmIEFsbG9jYXRlZEdQUnMgPiBOdW1HUFJzICYmIFN0YWNrVXNlZCkgeworICAgICAgbGx2bTo6VHlwZSAqUGFkZGluZ1R5ID0gbGx2bTo6QXJyYXlUeXBlOjpnZXQoCisgICAgICAgICAgbGx2bTo6VHlwZTo6Z2V0SW50MzJUeShnZXRWTUNvbnRleHQoKSksIE51bUdQUnMgLSBQcmVBbGxvY2F0aW9uR1BScyk7CisgICAgICBJLmluZm8gPSBBQklBcmdJbmZvOjpnZXRFeHBhbmRXaXRoUGFkZGluZyhmYWxzZSwgUGFkZGluZ1R5KTsKICAgICB9CiAgIH0KIApAQCAtMzIwOSw3ICszOTAxLDcgQEAKIC8vLyBSZXR1cm4gdGhlIGRlZmF1bHQgY2FsbGluZyBjb252ZW50aW9uIHRoYXQgTExWTSB3aWxsIHVzZS4KIGxsdm06OkNhbGxpbmdDb252OjpJRCBBUk1BQklJbmZvOjpnZXRMTFZNRGVmYXVsdENDKCkgY29uc3QgewogICAvLyBUaGUgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24gdGhhdCBMTFZNIHdpbGwgaW5mZXIuCi0gIGlmIChnZXRUYXJnZXQoKS5nZXRUcmlwbGUoKS5nZXRFbnZpcm9ubWVudE5hbWUoKT09ImdudWVhYmloZiIpCisgIGlmIChpc0VBQklIRigpKQogICAgIHJldHVybiBsbHZtOjpDYWxsaW5nQ29udjo6QVJNX0FBUENTX1ZGUDsKICAgZWxzZSBpZiAoaXNFQUJJKCkpCiAgICAgcmV0dXJuIGxsdm06OkNhbGxpbmdDb252OjpBUk1fQUFQQ1M7CkBAIC0zMjQzLDggKzM5MzUsNyBAQAogLy8vIGNvbnRhaW5lZCBpbiB0aGUgdHlwZSBpcyByZXR1cm5lZCB0aHJvdWdoIGl0OyB0aGlzIGlzIHVzZWQgZm9yIHRoZQogLy8vIHJlY3Vyc2l2ZSBjYWxscyB0aGF0IGNoZWNrIGFnZ3JlZ2F0ZSBjb21wb25lbnQgdHlwZXMuCiBzdGF0aWMgYm9vbCBpc0hvbW9nZW5lb3VzQWdncmVnYXRlKFF1YWxUeXBlIFR5LCBjb25zdCBUeXBlIComQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUQ29udGV4dCAmQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgKkhBTWVtYmVycyA9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUQ29udGV4dCAmQ29udGV4dCwgdWludDY0X3QgKkhBTWVtYmVycykgewogICB1aW50NjRfdCBNZW1iZXJzID0gMDsKICAgaWYgKGNvbnN0IENvbnN0YW50QXJyYXlUeXBlICpBVCA9IENvbnRleHQuZ2V0QXNDb25zdGFudEFycmF5VHlwZShUeSkpIHsKICAgICBpZiAoIWlzSG9tb2dlbmVvdXNBZ2dyZWdhdGUoQVQtPmdldEVsZW1lbnRUeXBlKCksIEJhc2UsIENvbnRleHQsICZNZW1iZXJzKSkKQEAgLTMyNTYsOSArMzk0Nyw3IEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBNZW1iZXJzID0gMDsKLSAgICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIGkgPSBSRC0+ZmllbGRfYmVnaW4oKSwgZSA9IFJELT5maWVsZF9lbmQoKTsKLSAgICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgICBjb25zdCBGaWVsZERlY2wgKkZEID0gKmk7CisgICAgZm9yIChjb25zdCBhdXRvICpGRCA6IFJELT5maWVsZHMoKSkgewogICAgICAgdWludDY0X3QgRmxkTWVtYmVyczsKICAgICAgIGlmICghaXNIb21vZ2VuZW91c0FnZ3JlZ2F0ZShGRC0+Z2V0VHlwZSgpLCBCYXNlLCBDb250ZXh0LCAmRmxkTWVtYmVycykpCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTMyOTMsMTAgKzM5ODIsMjkgQEAKICAgICBjb25zdCBUeXBlICpUeVB0ciA9IFR5LmdldFR5cGVQdHIoKTsKICAgICBpZiAoIUJhc2UpCiAgICAgICBCYXNlID0gVHlQdHI7Ci0gICAgaWYgKEJhc2UgIT0gVHlQdHIgJiYKLSAgICAgICAgKCFCYXNlLT5pc1ZlY3RvclR5cGUoKSB8fCAhVHlQdHItPmlzVmVjdG9yVHlwZSgpIHx8Ci0gICAgICAgICBDb250ZXh0LmdldFR5cGVTaXplKEJhc2UpICE9IENvbnRleHQuZ2V0VHlwZVNpemUoVHlQdHIpKSkKLSAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChCYXNlICE9IFR5UHRyKSB7CisgICAgICAvLyBIb21vZ2VuZW91cyBhZ2dyZWdhdGVzIGFyZSBkZWZpbmVkIGFzIGNvbnRhaW5pbmcgbWVtYmVycyB3aXRoIHRoZQorICAgICAgLy8gc2FtZSBtYWNoaW5lIHR5cGUuIFRoZXJlIGFyZSB0d28gY2FzZXMgaW4gd2hpY2ggdHdvIG1lbWJlcnMgaGF2ZQorICAgICAgLy8gZGlmZmVyZW50IFR5cGVQdHJzIGJ1dCB0aGUgc2FtZSBtYWNoaW5lIHR5cGU6CisKKyAgICAgIC8vIDEpIFZlY3RvcnMgb2YgdGhlIHNhbWUgbGVuZ3RoLCByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIGFuZCBudW1iZXIKKyAgICAgIC8vICAgIG9mIHRoZWlyIG1lbWJlcnMuCisgICAgICBjb25zdCBib29sIFNhbWVMZW5ndGhWZWN0b3JzID0gQmFzZS0+aXNWZWN0b3JUeXBlKCkgJiYgVHlQdHItPmlzVmVjdG9yVHlwZSgpCisgICAgICAgICYmIChDb250ZXh0LmdldFR5cGVTaXplKEJhc2UpID09IENvbnRleHQuZ2V0VHlwZVNpemUoVHlQdHIpKTsKKworICAgICAgLy8gMikgSW4gdGhlIDMyLWJpdCBBQVBDUywgYGRvdWJsZScgYW5kIGBsb25nIGRvdWJsZScgaGF2ZSB0aGUgc2FtZQorICAgICAgLy8gICAgbWFjaGluZSB0eXBlLiBUaGlzIGlzIG5vdCB0aGUgY2FzZSBmb3IgdGhlIDY0LWJpdCBBQVBDUy4KKyAgICAgIGNvbnN0IGJvb2wgU2FtZVNpemVEb3VibGVzID0KKyAgICAgICAgICAgKCAgICggICBCYXNlLT5pc1NwZWNpZmljQnVpbHRpblR5cGUoQnVpbHRpblR5cGU6OkRvdWJsZSkKKyAgICAgICAgICAgICAgICAmJiBUeVB0ci0+aXNTcGVjaWZpY0J1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlOjpMb25nRG91YmxlKSkKKyAgICAgICAgICAgIHx8ICggICBCYXNlLT5pc1NwZWNpZmljQnVpbHRpblR5cGUoQnVpbHRpblR5cGU6OkxvbmdEb3VibGUpCisgICAgICAgICAgICAgICAgJiYgVHlQdHItPmlzU3BlY2lmaWNCdWlsdGluVHlwZShCdWlsdGluVHlwZTo6RG91YmxlKSkpCisgICAgICAgICYmIChDb250ZXh0LmdldFR5cGVTaXplKEJhc2UpID09IENvbnRleHQuZ2V0VHlwZVNpemUoVHlQdHIpKTsKKworICAgICAgaWYgKCFTYW1lTGVuZ3RoVmVjdG9ycyAmJiAhU2FtZVNpemVEb3VibGVzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICB9CiAKICAgLy8gSG9tb2dlbmVvdXMgQWdncmVnYXRlcyBjYW4gaGF2ZSBhdCBtb3N0IDQgbWVtYmVycyBvZiB0aGUgYmFzZSB0eXBlLgpAQCAtMzMwOCwxMiArNDAxNiwxNSBAQAogCiAvLy8gbWFya0FsbG9jYXRlZFZGUHMgLSB1cGRhdGUgVkZQUmVncyBhY2NvcmRpbmcgdG8gdGhlIGFsaWdubWVudCBhbmQKIC8vLyBudW1iZXIgb2YgVkZQIHJlZ2lzdGVycyAodW5pdCBpcyBTIHJlZ2lzdGVyKSByZXF1ZXN0ZWQuCi1zdGF0aWMgdm9pZCBtYXJrQWxsb2NhdGVkVkZQcyhpbnQgKlZGUFJlZ3MsIHVuc2lnbmVkICZBbGxvY2F0ZWRWRlAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZXF1aXJlZCkgewordm9pZCBBUk1BQklJbmZvOjptYXJrQWxsb2NhdGVkVkZQcyh1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVJlcXVpcmVkKSBjb25zdCB7CiAgIC8vIEVhcmx5IEV4aXQuCi0gIGlmIChBbGxvY2F0ZWRWRlAgPj0gMTYpCisgIGlmIChBbGxvY2F0ZWRWRlBzID49IDE2KSB7CisgICAgLy8gV2UgdXNlIEFsbG9jYXRlZFZGUCA+IDE2IHRvIHNpZ25hbCB0aGF0IHNvbWUgQ1BSQ3Mgd2VyZSBhbGxvY2F0ZWQgb24KKyAgICAvLyB0aGUgc3RhY2suCisgICAgQWxsb2NhdGVkVkZQcyA9IDE3OwogICAgIHJldHVybjsKKyAgfQogICAvLyBDLjEudmZwIElmIHRoZSBhcmd1bWVudCBpcyBhIFZGUCBDUFJDIGFuZCB0aGVyZSBhcmUgc3VmZmljaWVudCBjb25zZWN1dGl2ZQogICAvLyBWRlAgcmVnaXN0ZXJzIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIHVuYWxsb2NhdGVkIHRoZW4gdGhlIGFyZ3VtZW50IGlzCiAgIC8vIGFsbG9jYXRlZCB0byB0aGUgbG93ZXN0LW51bWJlcmVkIHNlcXVlbmNlIG9mIHN1Y2ggcmVnaXN0ZXJzLgpAQCAtMzMyNyw3ICs0MDM4LDcgQEAKICAgICBpZiAoRm91bmRTbG90KSB7CiAgICAgICBmb3IgKHVuc2lnbmVkIEogPSBJLCBKRW5kID0gSSArIE51bVJlcXVpcmVkOyBKIDwgSkVuZDsgSisrKQogICAgICAgICBWRlBSZWdzW0pdID0gMTsKLSAgICAgIEFsbG9jYXRlZFZGUCArPSBOdW1SZXF1aXJlZDsKKyAgICAgIEFsbG9jYXRlZFZGUHMgKz0gTnVtUmVxdWlyZWQ7CiAgICAgICByZXR1cm47CiAgICAgfQogICB9CkBAIC0zMzM1LDEyICs0MDQ2LDMyIEBACiAgIC8vIHVuYWxsb2NhdGVkIGFyZSBtYXJrZWQgYXMgdW5hdmFpbGFibGUuCiAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgPCAxNjsgSSsrKQogICAgIFZGUFJlZ3NbSV0gPSAxOwotICBBbGxvY2F0ZWRWRlAgPSAxNzsgLy8gV2UgZG8gbm90IGhhdmUgZW5vdWdoIFZGUCByZWdpc3RlcnMuCisgIEFsbG9jYXRlZFZGUHMgPSAxNzsgLy8gV2UgZG8gbm90IGhhdmUgZW5vdWdoIFZGUCByZWdpc3RlcnMuCiB9CiAKLUFCSUFyZ0luZm8gQVJNQUJJSW5mbzo6Y2xhc3NpZnlBcmd1bWVudFR5cGUoUXVhbFR5cGUgVHksIGludCAqVkZQUmVncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkFsbG9jYXRlZFZGUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSXNIQSkgY29uc3QgeworLy8vIFVwZGF0ZSBBbGxvY2F0ZWRHUFJzIHRvIHJlY29yZCB0aGUgbnVtYmVyIG9mIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMKKy8vLyB3aGljaCBoYXZlIGJlZW4gYWxsb2NhdGVkLiBJdCBpcyB2YWxpZCBmb3IgQWxsb2NhdGVkR1BScyB0byBnbyBhYm92ZSA0LAorLy8vIHRoaXMgcmVwcmVzZW50cyBhcmd1bWVudHMgYmVpbmcgc3RvcmVkIG9uIHRoZSBzdGFjay4KK3ZvaWQgQVJNQUJJSW5mbzo6bWFya0FsbG9jYXRlZEdQUnModW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVxdWlyZWQpIGNvbnN0IHsKKyAgYXNzZXJ0KChBbGlnbm1lbnQgPT0gMSB8fCBBbGlnbm1lbnQgPT0gMikgJiYgIkFsaWdubWVudCBtdXN0IGJlIDQgb3IgOCBieXRlcyIpOworCisgIGlmIChBbGlnbm1lbnQgPT0gMiAmJiBBbGxvY2F0ZWRHUFJzICYgMHgxKQorICAgIEFsbG9jYXRlZEdQUnMgKz0gMTsKKworICBBbGxvY2F0ZWRHUFJzICs9IE51bVJlcXVpcmVkOworfQorCit2b2lkIEFSTUFCSUluZm86OnJlc2V0QWxsb2NhdGVkUmVncyh2b2lkKSBjb25zdCB7CisgIEFsbG9jYXRlZEdQUnMgPSAwOworICBBbGxvY2F0ZWRWRlBzID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bVZGUHM7ICsraSkKKyAgICBWRlBSZWdzW2ldID0gMDsKK30KKworQUJJQXJnSW5mbyBBUk1BQklJbmZvOjpjbGFzc2lmeUFyZ3VtZW50VHlwZShRdWFsVHlwZSBUeSwgYm9vbCAmSXNIQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhcmlhZGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZJc0NQUkMpIGNvbnN0IHsKICAgLy8gV2UgdXBkYXRlIG51bWJlciBvZiBhbGxvY2F0ZWQgVkZQcyBhY2NvcmRpbmcgdG8KICAgLy8gNi4xLjIuMSBUaGUgZm9sbG93aW5nIGFyZ3VtZW50IHR5cGVzIGFyZSBWRlAgQ1BSQ3M6CiAgIC8vICAgQSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHR5cGUgKGluY2x1ZGluZyBwcm9tb3RlZApAQCAtMzM1Niw1NSArNDA4Nyw4MiBAQAogICAgIGlmIChTaXplIDw9IDMyKSB7CiAgICAgICBsbHZtOjpUeXBlICpSZXNUeXBlID0KICAgICAgICAgICBsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KGdldFZNQ29udGV4dCgpKTsKKyAgICAgIG1hcmtBbGxvY2F0ZWRHUFJzKDEsIDEpOwogICAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldERpcmVjdChSZXNUeXBlKTsKICAgICB9CiAgICAgaWYgKFNpemUgPT0gNjQpIHsKICAgICAgIGxsdm06OlR5cGUgKlJlc1R5cGUgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoCiAgICAgICAgICAgbGx2bTo6VHlwZTo6Z2V0SW50MzJUeShnZXRWTUNvbnRleHQoKSksIDIpOwotICAgICAgbWFya0FsbG9jYXRlZFZGUHMoVkZQUmVncywgQWxsb2NhdGVkVkZQLCAyLCAyKTsKKyAgICAgIGlmIChnZXRBQklLaW5kKCkgPT0gQVJNQUJJSW5mbzo6QUFQQ1MgfHwgaXNWYXJpYWRpYyl7CisgICAgICAgIG1hcmtBbGxvY2F0ZWRHUFJzKDIsIDIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWFya0FsbG9jYXRlZFZGUHMoMiwgMik7CisgICAgICAgIElzQ1BSQyA9IHRydWU7CisgICAgICB9CiAgICAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0RGlyZWN0KFJlc1R5cGUpOwogICAgIH0KICAgICBpZiAoU2l6ZSA9PSAxMjgpIHsKICAgICAgIGxsdm06OlR5cGUgKlJlc1R5cGUgPSBsbHZtOjpWZWN0b3JUeXBlOjpnZXQoCiAgICAgICAgICAgbGx2bTo6VHlwZTo6Z2V0SW50MzJUeShnZXRWTUNvbnRleHQoKSksIDQpOwotICAgICAgbWFya0FsbG9jYXRlZFZGUHMoVkZQUmVncywgQWxsb2NhdGVkVkZQLCA0LCA0KTsKKyAgICAgIGlmIChnZXRBQklLaW5kKCkgPT0gQVJNQUJJSW5mbzo6QUFQQ1MgfHwgaXNWYXJpYWRpYykgeworICAgICAgICBtYXJrQWxsb2NhdGVkR1BScygyLCA0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hcmtBbGxvY2F0ZWRWRlBzKDQsIDQpOworICAgICAgICBJc0NQUkMgPSB0cnVlOworICAgICAgfQogICAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldERpcmVjdChSZXNUeXBlKTsKICAgICB9CisgICAgbWFya0FsbG9jYXRlZEdQUnMoMSwgMSk7CiAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEluZGlyZWN0KDAsIC8qQnlWYWw9Ki9mYWxzZSk7CiAgIH0KICAgLy8gVXBkYXRlIFZGUFJlZ3MgZm9yIGxlZ2FsIHZlY3RvciB0eXBlcy4KLSAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUID0gVHktPmdldEFzPFZlY3RvclR5cGU+KCkpIHsKLSAgICB1aW50NjRfdCBTaXplID0gZ2V0Q29udGV4dCgpLmdldFR5cGVTaXplKFZUKTsKLSAgICAvLyBTaXplIG9mIGEgbGVnYWwgdmVjdG9yIHNob3VsZCBiZSBwb3dlciBvZiAyIGFuZCBhYm92ZSA2NC4KLSAgICBtYXJrQWxsb2NhdGVkVkZQcyhWRlBSZWdzLCBBbGxvY2F0ZWRWRlAsIFNpemUgPj0gMTI4ID8gNCA6IDIsIFNpemUgLyAzMik7CisgIGlmIChnZXRBQklLaW5kKCkgPT0gQVJNQUJJSW5mbzo6QUFQQ1NfVkZQICYmICFpc1ZhcmlhZGljKSB7CisgICAgaWYgKGNvbnN0IFZlY3RvclR5cGUgKlZUID0gVHktPmdldEFzPFZlY3RvclR5cGU+KCkpIHsKKyAgICAgIHVpbnQ2NF90IFNpemUgPSBnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemUoVlQpOworICAgICAgLy8gU2l6ZSBvZiBhIGxlZ2FsIHZlY3RvciBzaG91bGQgYmUgcG93ZXIgb2YgMiBhbmQgYWJvdmUgNjQuCisgICAgICBtYXJrQWxsb2NhdGVkVkZQcyhTaXplID49IDEyOCA/IDQgOiAyLCBTaXplIC8gMzIpOworICAgICAgSXNDUFJDID0gdHJ1ZTsKKyAgICB9CiAgIH0KICAgLy8gVXBkYXRlIFZGUFJlZ3MgZm9yIGZsb2F0aW5nIHBvaW50IHR5cGVzLgotICBpZiAoY29uc3QgQnVpbHRpblR5cGUgKkJUID0gVHktPmdldEFzPEJ1aWx0aW5UeXBlPigpKSB7Ci0gICAgaWYgKEJULT5nZXRLaW5kKCkgPT0gQnVpbHRpblR5cGU6OkhhbGYgfHwKLSAgICAgICAgQlQtPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6RmxvYXQpCi0gICAgICBtYXJrQWxsb2NhdGVkVkZQcyhWRlBSZWdzLCBBbGxvY2F0ZWRWRlAsIDEsIDEpOwotICAgIGlmIChCVC0+Z2V0S2luZCgpID09IEJ1aWx0aW5UeXBlOjpEb3VibGUgfHwKLSAgICAgICAgQlQtPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6TG9uZ0RvdWJsZSkKLSAgICAgIG1hcmtBbGxvY2F0ZWRWRlBzKFZGUFJlZ3MsIEFsbG9jYXRlZFZGUCwgMiwgMik7CisgIGlmIChnZXRBQklLaW5kKCkgPT0gQVJNQUJJSW5mbzo6QUFQQ1NfVkZQICYmICFpc1ZhcmlhZGljKSB7CisgICAgaWYgKGNvbnN0IEJ1aWx0aW5UeXBlICpCVCA9IFR5LT5nZXRBczxCdWlsdGluVHlwZT4oKSkgeworICAgICAgaWYgKEJULT5nZXRLaW5kKCkgPT0gQnVpbHRpblR5cGU6OkhhbGYgfHwKKyAgICAgICAgICBCVC0+Z2V0S2luZCgpID09IEJ1aWx0aW5UeXBlOjpGbG9hdCkgeworICAgICAgICBtYXJrQWxsb2NhdGVkVkZQcygxLCAxKTsKKyAgICAgICAgSXNDUFJDID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChCVC0+Z2V0S2luZCgpID09IEJ1aWx0aW5UeXBlOjpEb3VibGUgfHwKKyAgICAgICAgICBCVC0+Z2V0S2luZCgpID09IEJ1aWx0aW5UeXBlOjpMb25nRG91YmxlKSB7CisgICAgICAgIG1hcmtBbGxvY2F0ZWRWRlBzKDIsIDIpOworICAgICAgICBJc0NQUkMgPSB0cnVlOworICAgICAgfQorICAgIH0KICAgfQogCiAgIGlmICghaXNBZ2dyZWdhdGVUeXBlRm9yQUJJKFR5KSkgewogICAgIC8vIFRyZWF0IGFuIGVudW0gdHlwZSBhcyBpdHMgdW5kZXJseWluZyB0eXBlLgotICAgIGlmIChjb25zdCBFbnVtVHlwZSAqRW51bVR5ID0gVHktPmdldEFzPEVudW1UeXBlPigpKQorICAgIGlmIChjb25zdCBFbnVtVHlwZSAqRW51bVR5ID0gVHktPmdldEFzPEVudW1UeXBlPigpKSB7CiAgICAgICBUeSA9IEVudW1UeS0+Z2V0RGVjbCgpLT5nZXRJbnRlZ2VyVHlwZSgpOworICAgIH0KIAorICAgIHVuc2lnbmVkIFNpemUgPSBnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemUoVHkpOworICAgIGlmICghSXNDUFJDKQorICAgICAgbWFya0FsbG9jYXRlZEdQUnMoU2l6ZSA+IDMyID8gMiA6IDEsIChTaXplICsgMzEpIC8gMzIpOwogICAgIHJldHVybiAoVHktPmlzUHJvbW90YWJsZUludGVnZXJUeXBlKCkgPwogICAgICAgICAgICAgQUJJQXJnSW5mbzo6Z2V0RXh0ZW5kKCkgOiBBQklBcmdJbmZvOjpnZXREaXJlY3QoKSk7CiAgIH0KIAotICBpZiAoQ0dDWFhBQkk6OlJlY29yZEFyZ0FCSSBSQUEgPSBnZXRSZWNvcmRBcmdBQkkoVHksIGdldENYWEFCSSgpKSkKKyAgaWYgKENHQ1hYQUJJOjpSZWNvcmRBcmdBQkkgUkFBID0gZ2V0UmVjb3JkQXJnQUJJKFR5LCBnZXRDWFhBQkkoKSkpIHsKKyAgICBtYXJrQWxsb2NhdGVkR1BScygxLCAxKTsKICAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SW5kaXJlY3QoMCwgUkFBID09IENHQ1hYQUJJOjpSQUFfRGlyZWN0SW5NZW1vcnkpOworICB9CiAKICAgLy8gSWdub3JlIGVtcHR5IHJlY29yZHMuCiAgIGlmIChpc0VtcHR5UmVjb3JkKGdldENvbnRleHQoKSwgVHksIHRydWUpKQogICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJZ25vcmUoKTsKIAotICBpZiAoZ2V0QUJJS2luZCgpID09IEFSTUFCSUluZm86OkFBUENTX1ZGUCkgeworICBpZiAoZ2V0QUJJS2luZCgpID09IEFSTUFCSUluZm86OkFBUENTX1ZGUCAmJiAhaXNWYXJpYWRpYykgewogICAgIC8vIEhvbW9nZW5lb3VzIEFnZ3JlZ2F0ZXMgbmVlZCB0byBiZSBleHBhbmRlZCB3aGVuIHdlIGNhbiBmaXQgdGhlIGFnZ3JlZ2F0ZQogICAgIC8vIGludG8gVkZQIHJlZ2lzdGVycy4KICAgICBjb25zdCBUeXBlICpCYXNlID0gMDsKQEAgLTM0MTUsMTYgKzQxNzMsMTcgQEAKICAgICAgIGlmIChCYXNlLT5pc1ZlY3RvclR5cGUoKSkgewogICAgICAgICAvLyBFbGVtZW50U2l6ZSBpcyBpbiBudW1iZXIgb2YgZmxvYXRzLgogICAgICAgICB1bnNpZ25lZCBFbGVtZW50U2l6ZSA9IGdldENvbnRleHQoKS5nZXRUeXBlU2l6ZShCYXNlKSA9PSA2NCA/IDIgOiA0OwotICAgICAgICBtYXJrQWxsb2NhdGVkVkZQcyhWRlBSZWdzLCBBbGxvY2F0ZWRWRlAsIEVsZW1lbnRTaXplLAorICAgICAgICBtYXJrQWxsb2NhdGVkVkZQcyhFbGVtZW50U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVycyAqIEVsZW1lbnRTaXplKTsKICAgICAgIH0gZWxzZSBpZiAoQmFzZS0+aXNTcGVjaWZpY0J1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlOjpGbG9hdCkpCi0gICAgICAgIG1hcmtBbGxvY2F0ZWRWRlBzKFZGUFJlZ3MsIEFsbG9jYXRlZFZGUCwgMSwgTWVtYmVycyk7CisgICAgICAgIG1hcmtBbGxvY2F0ZWRWRlBzKDEsIE1lbWJlcnMpOwogICAgICAgZWxzZSB7CiAgICAgICAgIGFzc2VydChCYXNlLT5pc1NwZWNpZmljQnVpbHRpblR5cGUoQnVpbHRpblR5cGU6OkRvdWJsZSkgfHwKICAgICAgICAgICAgICAgIEJhc2UtPmlzU3BlY2lmaWNCdWlsdGluVHlwZShCdWlsdGluVHlwZTo6TG9uZ0RvdWJsZSkpOwotICAgICAgICBtYXJrQWxsb2NhdGVkVkZQcyhWRlBSZWdzLCBBbGxvY2F0ZWRWRlAsIDIsIE1lbWJlcnMgKiAyKTsKKyAgICAgICAgbWFya0FsbG9jYXRlZFZGUHMoMiwgTWVtYmVycyAqIDIpOwogICAgICAgfQogICAgICAgSXNIQSA9IHRydWU7CisgICAgICBJc0NQUkMgPSB0cnVlOwogICAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEV4cGFuZCgpOwogICAgIH0KICAgfQpAQCAtMzQzOSw3ICs0MTk4LDkgQEAKICAgICAgIGdldEFCSUtpbmQoKSA9PSBBUk1BQklJbmZvOjpBQVBDUykKICAgICBBQklBbGlnbiA9IHN0ZDo6bWluKHN0ZDo6bWF4KFR5QWxpZ24sICh1aW50NjRfdCk0KSwgKHVpbnQ2NF90KTgpOwogICBpZiAoZ2V0Q29udGV4dCgpLmdldFR5cGVTaXplSW5DaGFycyhUeSkgPiBDaGFyVW5pdHM6OmZyb21RdWFudGl0eSg2NCkpIHsKLSAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SW5kaXJlY3QoMCwgLypCeVZhbD0qL3RydWUsCisgICAgICAvLyBVcGRhdGUgQWxsb2NhdGVkIEdQUnMKKyAgICBtYXJrQWxsb2NhdGVkR1BScygxLCAxKTsKKyAgICByZXR1cm4gQUJJQXJnSW5mbzo6Z2V0SW5kaXJlY3QoVHlBbGlnbiwgLypCeVZhbD0qL3RydWUsCiAgICAgICAgICAgIC8qUmVhbGlnbj0qL1R5QWxpZ24gPiBBQklBbGlnbik7CiAgIH0KIApAQCAtMzQ1MSw5ICs0MjEyLDExIEBACiAgIGlmIChnZXRDb250ZXh0KCkuZ2V0VHlwZUFsaWduKFR5KSA8PSAzMikgewogICAgIEVsZW1UeSA9IGxsdm06OlR5cGU6OmdldEludDMyVHkoZ2V0Vk1Db250ZXh0KCkpOwogICAgIFNpemVSZWdzID0gKGdldENvbnRleHQoKS5nZXRUeXBlU2l6ZShUeSkgKyAzMSkgLyAzMjsKKyAgICBtYXJrQWxsb2NhdGVkR1BScygxLCBTaXplUmVncyk7CiAgIH0gZWxzZSB7CiAgICAgRWxlbVR5ID0gbGx2bTo6VHlwZTo6Z2V0SW50NjRUeShnZXRWTUNvbnRleHQoKSk7CiAgICAgU2l6ZVJlZ3MgPSAoZ2V0Q29udGV4dCgpLmdldFR5cGVTaXplKFR5KSArIDYzKSAvIDY0OworICAgIG1hcmtBbGxvY2F0ZWRHUFJzKDIsIFNpemVSZWdzICogMik7CiAgIH0KIAogICBsbHZtOjpUeXBlICpTVHkgPQpAQCAtMzU0NiwxMyArNDMwOSwxNiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotQUJJQXJnSW5mbyBBUk1BQklJbmZvOjpjbGFzc2lmeVJldHVyblR5cGUoUXVhbFR5cGUgUmV0VHkpIGNvbnN0IHsKK0FCSUFyZ0luZm8gQVJNQUJJSW5mbzo6Y2xhc3NpZnlSZXR1cm5UeXBlKFF1YWxUeXBlIFJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZhcmlhZGljKSBjb25zdCB7CiAgIGlmIChSZXRUeS0+aXNWb2lkVHlwZSgpKQogICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJZ25vcmUoKTsKIAogICAvLyBMYXJnZSB2ZWN0b3IgdHlwZXMgc2hvdWxkIGJlIHJldHVybmVkIHZpYSBtZW1vcnkuCi0gIGlmIChSZXRUeS0+aXNWZWN0b3JUeXBlKCkgJiYgZ2V0Q29udGV4dCgpLmdldFR5cGVTaXplKFJldFR5KSA+IDEyOCkKKyAgaWYgKFJldFR5LT5pc1ZlY3RvclR5cGUoKSAmJiBnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemUoUmV0VHkpID4gMTI4KSB7CisgICAgbWFya0FsbG9jYXRlZEdQUnMoMSwgMSk7CiAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEluZGlyZWN0KDApOworICB9CiAKICAgaWYgKCFpc0FnZ3JlZ2F0ZVR5cGVGb3JBQkkoUmV0VHkpKSB7CiAgICAgLy8gVHJlYXQgYW4gZW51bSB0eXBlIGFzIGl0cyB1bmRlcmx5aW5nIHR5cGUuCkBAIC0zNTY1LDggKzQzMzEsMTAgQEAKIAogICAvLyBTdHJ1Y3R1cmVzIHdpdGggZWl0aGVyIGEgbm9uLXRyaXZpYWwgZGVzdHJ1Y3RvciBvciBhIG5vbi10cml2aWFsCiAgIC8vIGNvcHkgY29uc3RydWN0b3IgYXJlIGFsd2F5cyBpbmRpcmVjdC4KLSAgaWYgKGlzUmVjb3JkUmV0dXJuSW5kaXJlY3QoUmV0VHksIGdldENYWEFCSSgpKSkKKyAgaWYgKGlzUmVjb3JkUmV0dXJuSW5kaXJlY3QoUmV0VHksIGdldENYWEFCSSgpKSkgeworICAgIG1hcmtBbGxvY2F0ZWRHUFJzKDEsIDEpOwogICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJbmRpcmVjdCgwLCAvKkJ5VmFsPSovZmFsc2UpOworICB9CiAKICAgLy8gQXJlIHdlIGZvbGxvd2luZyBBUENTPwogICBpZiAoZ2V0QUJJS2luZCgpID09IEFQQ1MpIHsKQEAgLTM1OTMsNiArNDM2MSw3IEBACiAgICAgfQogCiAgICAgLy8gT3RoZXJ3aXNlIHJldHVybiBpbiBtZW1vcnkuCisgICAgbWFya0FsbG9jYXRlZEdQUnMoMSwgMSk7CiAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEluZGlyZWN0KDApOwogICB9CiAKQEAgLTM2MDIsNyArNDM3MSw3IEBACiAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldElnbm9yZSgpOwogCiAgIC8vIENoZWNrIGZvciBob21vZ2VuZW91cyBhZ2dyZWdhdGVzIHdpdGggQUFQQ1MtVkZQLgotICBpZiAoZ2V0QUJJS2luZCgpID09IEFBUENTX1ZGUCkgeworICBpZiAoZ2V0QUJJS2luZCgpID09IEFBUENTX1ZGUCAmJiAhaXNWYXJpYWRpYykgewogICAgIGNvbnN0IFR5cGUgKkJhc2UgPSAwOwogICAgIGlmIChpc0hvbW9nZW5lb3VzQWdncmVnYXRlKFJldFR5LCBCYXNlLCBnZXRDb250ZXh0KCkpKSB7CiAgICAgICBhc3NlcnQoQmFzZSAmJiAiQmFzZSBjbGFzcyBzaG91bGQgYmUgc2V0IGZvciBob21vZ2VuZW91cyBhZ2dyZWdhdGUiKTsKQEAgLTM2MjMsNiArNDM5Miw3IEBACiAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldERpcmVjdChsbHZtOjpUeXBlOjpnZXRJbnQzMlR5KGdldFZNQ29udGV4dCgpKSk7CiAgIH0KIAorICBtYXJrQWxsb2NhdGVkR1BScygxLCAxKTsKICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldEluZGlyZWN0KDApOwogfQogCkBAIC0zNzIwLDkgKzQ0OTAsOSBAQAogIHB1YmxpYzoKICAgTmFDbEFSTUFCSUluZm8oQ29kZUdlbjo6Q29kZUdlblR5cGVzICZDR1QsIEFSTUFCSUluZm86OkFCSUtpbmQgS2luZCkKICAgICAgIDogQUJJSW5mbyhDR1QpLCBQSW5mbyhDR1QpLCBOSW5mbyhDR1QsIEtpbmQpIHt9Ci0gIHZpcnR1YWwgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0OwotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0OworICB2b2lkIGNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3Qgb3ZlcnJpZGU7CisgIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdCBvdmVycmlkZTsKICBwcml2YXRlOgogICBQTmFDbEFCSUluZm8gUEluZm87IC8vIFVzZWQgZm9yIGdlbmVyYXRpbmcgY2FsbHMgd2l0aCBwbmFjbGNhbGwgY2FsbGluZ2NvbnYuCiAgIEFSTUFCSUluZm8gTkluZm87IC8vIFVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KQEAgLTM3NzAsMTAgKzQ1NDAsMTAgQEAKICAgQUJJQXJnSW5mbyB0cnlVc2VSZWdzKFF1YWxUeXBlIFR5LCBpbnQgJkZyZWVSZWdzLCBpbnQgUmVnc05lZWRlZCwgYm9vbCBJc0ludCwKICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlR5cGUgKkRpcmVjdFR5ID0gMCkgY29uc3Q7CiAKLSAgdmlydHVhbCB2b2lkIGNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3Q7CisgIHZvaWQgY29tcHV0ZUluZm8oQ0dGdW5jdGlvbkluZm8gJkZJKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0OworICBsbHZtOjpWYWx1ZSAqRW1pdFZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRikgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBBQXJjaDY0VGFyZ2V0Q29kZUdlbkluZm8gOiBwdWJsaWMgVGFyZ2V0Q29kZUdlbkluZm8gewpAQCAtMzc4NSwxMiArNDU1NSwxMiBAQAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBBQXJjaDY0QUJJSW5mbyY+KFRhcmdldENvZGVHZW5JbmZvOjpnZXRBQklJbmZvKCkpOwogICB9CiAKLSAgaW50IGdldER3YXJmRUhTdGFja1BvaW50ZXIoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmTSkgY29uc3QgeworICBpbnQgZ2V0RHdhcmZFSFN0YWNrUG9pbnRlcihDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZNKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDMxOwogICB9CiAKICAgYm9vbCBpbml0RHdhcmZFSFJlZ1NpemVUYWJsZShDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQWRkcmVzcykgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpBZGRyZXNzKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gMC0zMSBhcmUgeDAteDMwIGFuZCBzcDogOCBieXRlcyBlYWNoCiAgICAgbGx2bTo6VmFsdWUgKkVpZ2h0OCA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDhUeSwgOCk7CiAgICAgQXNzaWduVG9BcnJheVJhbmdlKENHRi5CdWlsZGVyLCBBZGRyZXNzLCBFaWdodDgsIDAsIDMxKTsKQEAgLTM4MTMsOSArNDU4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZUludFJlZ3MsIEZyZWVWRlBSZWdzKTsKIAogICBGcmVlSW50UmVncyA9IEZyZWVWRlBSZWdzID0gODsKLSAgZm9yIChDR0Z1bmN0aW9uSW5mbzo6YXJnX2l0ZXJhdG9yIGl0ID0gRkkuYXJnX2JlZ2luKCksIGllID0gRkkuYXJnX2VuZCgpOwotICAgICAgIGl0ICE9IGllOyArK2l0KSB7Ci0gICAgaXQtPmluZm8gPSBjbGFzc2lmeUdlbmVyaWNUeXBlKGl0LT50eXBlLCBGcmVlSW50UmVncywgRnJlZVZGUFJlZ3MpOworICBmb3IgKGF1dG8gJkkgOiBGSS5hcmd1bWVudHMoKSkgeworICAgIEkuaW5mbyA9IGNsYXNzaWZ5R2VuZXJpY1R5cGUoSS50eXBlLCBGcmVlSW50UmVncywgRnJlZVZGUFJlZ3MpOwogCiAgIH0KIH0KQEAgLTM5NTgsMjA4ICs0NzI3LDEyIEBACiAKIGxsdm06OlZhbHVlICpBQXJjaDY0QUJJSW5mbzo6RW1pdFZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdCB7Ci0gIC8vIFRoZSBBQXJjaDY0IHZhX2xpc3QgdHlwZSBhbmQgaGFuZGxpbmcgaXMgc3BlY2lmaWVkIGluIHRoZSBQcm9jZWR1cmUgQ2FsbAotICAvLyBTdGFuZGFyZCwgc2VjdGlvbiBCLjQ6Ci0gIC8vCi0gIC8vIHN0cnVjdCB7Ci0gIC8vICAgdm9pZCAqX19zdGFjazsKLSAgLy8gICB2b2lkICpfX2dyX3RvcDsKLSAgLy8gICB2b2lkICpfX3ZyX3RvcDsKLSAgLy8gICBpbnQgX19ncl9vZmZzOwotICAvLyAgIGludCBfX3ZyX29mZnM7Ci0gIC8vIH07Ci0KLSAgYXNzZXJ0KCFDR0YuQ0dNLmdldERhdGFMYXlvdXQoKS5pc0JpZ0VuZGlhbigpCi0gICAgICAgICAmJiAidmFfYXJnIG5vdCBpbXBsZW1lbnRlZCBmb3IgYmlnLWVuZGlhbiBBQXJjaDY0Iik7Ci0KICAgaW50IEZyZWVJbnRSZWdzID0gOCwgRnJlZVZGUFJlZ3MgPSA4OwogICBUeSA9IENHRi5nZXRDb250ZXh0KCkuZ2V0Q2Fub25pY2FsVHlwZShUeSk7CiAgIEFCSUFyZ0luZm8gQUkgPSBjbGFzc2lmeUdlbmVyaWNUeXBlKFR5LCBGcmVlSW50UmVncywgRnJlZVZGUFJlZ3MpOwogCi0gIGxsdm06OkJhc2ljQmxvY2sgKk1heWJlUmVnQmxvY2sgPSBDR0YuY3JlYXRlQmFzaWNCbG9jaygidmFhcmcubWF5YmVfcmVnIik7Ci0gIGxsdm06OkJhc2ljQmxvY2sgKkluUmVnQmxvY2sgPSBDR0YuY3JlYXRlQmFzaWNCbG9jaygidmFhcmcuaW5fcmVnIik7Ci0gIGxsdm06OkJhc2ljQmxvY2sgKk9uU3RhY2tCbG9jayA9IENHRi5jcmVhdGVCYXNpY0Jsb2NrKCJ2YWFyZy5vbl9zdGFjayIpOwotICBsbHZtOjpCYXNpY0Jsb2NrICpDb250QmxvY2sgPSBDR0YuY3JlYXRlQmFzaWNCbG9jaygidmFhcmcuZW5kIik7Ci0KLSAgbGx2bTo6VmFsdWUgKnJlZ19vZmZzX3AgPSAwLCAqcmVnX29mZnMgPSAwOwotICBpbnQgcmVnX3RvcF9pbmRleDsKLSAgaW50IFJlZ1NpemU7Ci0gIGlmIChGcmVlSW50UmVncyA8IDgpIHsKLSAgICBhc3NlcnQoRnJlZVZGUFJlZ3MgPT0gOCAmJiAiQXJndW1lbnRzIG5ldmVyIHNwbGl0IGJldHdlZW4gaW50ICYgVkZQIHJlZ3MiKTsKLSAgICAvLyAzIGlzIHRoZSBmaWVsZCBudW1iZXIgb2YgX19ncl9vZmZzCi0gICAgcmVnX29mZnNfcCA9IENHRi5CdWlsZGVyLkNyZWF0ZVN0cnVjdEdFUChWQUxpc3RBZGRyLCAzLCAiZ3Jfb2Zmc19wIik7Ci0gICAgcmVnX29mZnMgPSBDR0YuQnVpbGRlci5DcmVhdGVMb2FkKHJlZ19vZmZzX3AsICJncl9vZmZzIik7Ci0gICAgcmVnX3RvcF9pbmRleCA9IDE7IC8vIGZpZWxkIG51bWJlciBmb3IgX19ncl90b3AKLSAgICBSZWdTaXplID0gOCAqICg4IC0gRnJlZUludFJlZ3MpOwotICB9IGVsc2UgewotICAgIGFzc2VydChGcmVlVkZQUmVncyA8IDggJiYgIkFyZ3VtZW50IG11c3QgZ28gaW4gVkZQIG9yIGludCByZWdzIik7Ci0gICAgLy8gNCBpcyB0aGUgZmllbGQgbnVtYmVyIG9mIF9fdnJfb2Zmcy4KLSAgICByZWdfb2Zmc19wID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlU3RydWN0R0VQKFZBTGlzdEFkZHIsIDQsICJ2cl9vZmZzX3AiKTsKLSAgICByZWdfb2ZmcyA9IENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQocmVnX29mZnNfcCwgInZyX29mZnMiKTsKLSAgICByZWdfdG9wX2luZGV4ID0gMjsgLy8gZmllbGQgbnVtYmVyIGZvciBfX3ZyX3RvcAotICAgIFJlZ1NpemUgPSAxNiAqICg4IC0gRnJlZVZGUFJlZ3MpOwotICB9Ci0KLSAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gRmluZCBvdXQgd2hlcmUgYXJndW1lbnQgd2FzIHBhc3NlZAotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8vIElmIHJlZ19vZmZzID49IDAgd2UncmUgYWxyZWFkeSB1c2luZyB0aGUgc3RhY2sgZm9yIHRoaXMgdHlwZSBvZgotICAvLyBhcmd1bWVudC4gV2UgZG9uJ3Qgd2FudCB0byBrZWVwIHVwZGF0aW5nIHJlZ19vZmZzIChpbiBjYXNlIGl0IG92ZXJmbG93cywKLSAgLy8gdGhvdWdoIGFueW9uZSBwYXNzaW5nIDJHQiBvZiBhcmd1bWVudHMsIGVhY2ggYXQgbW9zdCAxNiBieXRlcywgZGVzZXJ2ZXMKLSAgLy8gd2hhdGV2ZXIgdGhleSBnZXQpLgotICBsbHZtOjpWYWx1ZSAqVXNpbmdTdGFjayA9IDA7Ci0gIFVzaW5nU3RhY2sgPSBDR0YuQnVpbGRlci5DcmVhdGVJQ21wU0dFKHJlZ19vZmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KENHRi5JbnQzMlR5LCAwKSk7Ci0KLSAgQ0dGLkJ1aWxkZXIuQ3JlYXRlQ29uZEJyKFVzaW5nU3RhY2ssIE9uU3RhY2tCbG9jaywgTWF5YmVSZWdCbG9jayk7Ci0KLSAgLy8gT3RoZXJ3aXNlLCBhdCBsZWFzdCBzb21lIGtpbmQgb2YgYXJndW1lbnQgY291bGQgZ28gaW4gdGhlc2UgcmVnaXN0ZXJzLCB0aGUKLSAgLy8gcXVlc2l0b24gaXMgd2hldGhlciB0aGlzIHBhcnRpY3VsYXIgdHlwZSBpcyB0b28gYmlnLgotICBDR0YuRW1pdEJsb2NrKE1heWJlUmVnQmxvY2spOwotCi0gIC8vIEludGVnZXIgYXJndW1lbnRzIG1heSBuZWVkIHRvIGNvcnJlY3QgcmVnaXN0ZXIgYWxpZ25tZW50IChmb3IgZXhhbXBsZSBhCi0gIC8vICJzdHJ1Y3QgeyBfX2ludDEyOCBhOyB9OyIgZ2V0cyBwYXNzZWQgaW4geF8yTiwgeF97Mk4rMX0pLiBJbiB0aGlzIGNhc2Ugd2UKLSAgLy8gYWxpZ24gX19ncl9vZmZzIHRvIGNhbGN1bGF0ZSB0aGUgcG90ZW50aWFsIGFkZHJlc3MuCi0gIGlmIChGcmVlSW50UmVncyA8IDggJiYgQUkuaXNEaXJlY3QoKSAmJiBnZXRDb250ZXh0KCkuZ2V0VHlwZUFsaWduKFR5KSA+IDY0KSB7Ci0gICAgaW50IEFsaWduID0gZ2V0Q29udGV4dCgpLmdldFR5cGVBbGlnbihUeSkgLyA4OwotCi0gICAgcmVnX29mZnMgPSBDR0YuQnVpbGRlci5DcmVhdGVBZGQocmVnX29mZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KENHRi5JbnQzMlR5LCBBbGlnbiAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsaWduX3JlZ29mZnMiKTsKLSAgICByZWdfb2ZmcyA9IENHRi5CdWlsZGVyLkNyZWF0ZUFuZChyZWdfb2ZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDMyVHksIC1BbGlnbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxpZ25lZF9yZWdvZmZzIik7Ci0gIH0KLQotICAvLyBVcGRhdGUgdGhlIGdyX29mZnMvdnJfb2ZmcyBwb2ludGVyIGZvciBuZXh0IGNhbGwgdG8gdmFfYXJnIG9uIHRoaXMgdmFfbGlzdC4KLSAgbGx2bTo6VmFsdWUgKk5ld09mZnNldCA9IDA7Ci0gIE5ld09mZnNldCA9IENHRi5CdWlsZGVyLkNyZWF0ZUFkZChyZWdfb2ZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDMyVHksIFJlZ1NpemUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ld19yZWdfb2ZmcyIpOwotICBDR0YuQnVpbGRlci5DcmVhdGVTdG9yZShOZXdPZmZzZXQsIHJlZ19vZmZzX3ApOwotCi0gIC8vIE5vdyB3ZSdyZSBpbiBhIHBvc2l0aW9uIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYXJndW1lbnQgcmVhbGx5IHdhcyBpbgotICAvLyByZWdpc3RlcnMgb3Igbm90LgotICBsbHZtOjpWYWx1ZSAqSW5SZWdzID0gMDsKLSAgSW5SZWdzID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlSUNtcFNMRShOZXdPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChDR0YuSW50MzJUeSwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucmVnIik7Ci0KLSAgQ0dGLkJ1aWxkZXIuQ3JlYXRlQ29uZEJyKEluUmVncywgSW5SZWdCbG9jaywgT25TdGFja0Jsb2NrKTsKLQotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBBcmd1bWVudCB3YXMgaW4gcmVnaXN0ZXJzCi0gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLy8gTm93IHdlIGVtaXQgdGhlIGNvZGUgZm9yIGlmIHRoZSBhcmd1bWVudCB3YXMgb3JpZ2luYWxseSBwYXNzZWQgaW4KLSAgLy8gcmVnaXN0ZXJzLiBGaXJzdCBzdGFydCB0aGUgYXBwcm9wcmlhdGUgYmxvY2s6Ci0gIENHRi5FbWl0QmxvY2soSW5SZWdCbG9jayk7Ci0KLSAgbGx2bTo6VmFsdWUgKnJlZ190b3BfcCA9IDAsICpyZWdfdG9wID0gMDsKLSAgcmVnX3RvcF9wID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlU3RydWN0R0VQKFZBTGlzdEFkZHIsIHJlZ190b3BfaW5kZXgsICJyZWdfdG9wX3AiKTsKLSAgcmVnX3RvcCA9IENHRi5CdWlsZGVyLkNyZWF0ZUxvYWQocmVnX3RvcF9wLCAicmVnX3RvcCIpOwotICBsbHZtOjpWYWx1ZSAqQmFzZUFkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVHRVAocmVnX3RvcCwgcmVnX29mZnMpOwotICBsbHZtOjpWYWx1ZSAqUmVnQWRkciA9IDA7Ci0gIGxsdm06OlR5cGUgKk1lbVR5ID0gbGx2bTo6UG9pbnRlclR5cGU6OmdldFVucXVhbChDR0YuQ29udmVydFR5cGVGb3JNZW0oVHkpKTsKLQotICBpZiAoIUFJLmlzRGlyZWN0KCkpIHsKLSAgICAvLyBJZiBpdCdzIGJlZW4gcGFzc2VkIGluZGlyZWN0bHkgKGFjdHVhbGx5IGEgc3RydWN0KSwgd2hhdGV2ZXIgd2UgZmluZCBmcm9tCi0gICAgLy8gc3RvcmVkIHJlZ2lzdGVycyBvciBvbiB0aGUgc3RhY2sgd2lsbCBhY3R1YWxseSBiZSBhIHN0cnVjdCAqKi4KLSAgICBNZW1UeSA9IGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoTWVtVHkpOwotICB9Ci0KLSAgY29uc3QgVHlwZSAqQmFzZSA9IDA7Ci0gIHVpbnQ2NF90IE51bU1lbWJlcnM7Ci0gIGlmIChpc0hvbW9nZW5lb3VzQWdncmVnYXRlKFR5LCBCYXNlLCBnZXRDb250ZXh0KCksICZOdW1NZW1iZXJzKQotICAgICAgJiYgTnVtTWVtYmVycyA+IDEpIHsKLSAgICAvLyBIb21vZ2VuZW91cyBhZ2dyZWdhdGVzIHBhc3NlZCBpbiByZWdpc3RlcnMgd2lsbCBoYXZlIHRoZWlyIGVsZW1lbnRzIHNwbGl0Ci0gICAgLy8gYW5kIHN0b3JlZCAxNi1ieXRlcyBhcGFydCByZWdhcmRsZXNzIG9mIHNpemUgKHRoZXkncmUgbm90aW9uYWxseSBpbiBxTiwKLSAgICAvLyBxTisxLCAuLi4pLiBXZSByZWxvYWQgYW5kIHN0b3JlIGludG8gYSB0ZW1wb3JhcnkgbG9jYWwgdmFyaWFibGUKLSAgICAvLyBjb250aWd1b3VzbHkuCi0gICAgYXNzZXJ0KEFJLmlzRGlyZWN0KCkgJiYgIkhvbW9nZW5lb3VzIGFnZ3JlZ2F0ZXMgc2hvdWxkIGJlIHBhc3NlZCBkaXJlY3RseSIpOwotICAgIGxsdm06OlR5cGUgKkJhc2VUeSA9IENHRi5Db252ZXJ0VHlwZShRdWFsVHlwZShCYXNlLCAwKSk7Ci0gICAgbGx2bTo6VHlwZSAqSEZBVHkgPSBsbHZtOjpBcnJheVR5cGU6OmdldChCYXNlVHksIE51bU1lbWJlcnMpOwotICAgIGxsdm06OlZhbHVlICpUbXAgPSBDR0YuQ3JlYXRlVGVtcEFsbG9jYShIRkFUeSk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtTWVtYmVyczsgKytpKSB7Ci0gICAgICBsbHZtOjpWYWx1ZSAqQmFzZU9mZnNldCA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDMyVHksIDE2ICogaSk7Ci0gICAgICBsbHZtOjpWYWx1ZSAqTG9hZEFkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVHRVAoQmFzZUFkZHIsIEJhc2VPZmZzZXQpOwotICAgICAgTG9hZEFkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KExvYWRBZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlBvaW50ZXJUeXBlOjpnZXRVbnF1YWwoQmFzZVR5KSk7Ci0gICAgICBsbHZtOjpWYWx1ZSAqU3RvcmVBZGRyID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlU3RydWN0R0VQKFRtcCwgaSk7Ci0KLSAgICAgIGxsdm06OlZhbHVlICpFbGVtID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlTG9hZChMb2FkQWRkcik7Ci0gICAgICBDR0YuQnVpbGRlci5DcmVhdGVTdG9yZShFbGVtLCBTdG9yZUFkZHIpOwotICAgIH0KLQotICAgIFJlZ0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVCaXRDYXN0KFRtcCwgTWVtVHkpOwotICB9IGVsc2UgewotICAgIC8vIE90aGVyd2lzZSB0aGUgb2JqZWN0IGlzIGNvbnRpZ3VvdXMgaW4gbWVtb3J5Ci0gICAgUmVnQWRkciA9IENHRi5CdWlsZGVyLkNyZWF0ZUJpdENhc3QoQmFzZUFkZHIsIE1lbVR5KTsKLSAgfQotCi0gIENHRi5FbWl0QnJhbmNoKENvbnRCbG9jayk7Ci0KLSAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gQXJndW1lbnQgd2FzIG9uIHRoZSBzdGFjawotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICBDR0YuRW1pdEJsb2NrKE9uU3RhY2tCbG9jayk7Ci0KLSAgbGx2bTo6VmFsdWUgKnN0YWNrX3AgPSAwLCAqT25TdGFja0FkZHIgPSAwOwotICBzdGFja19wID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlU3RydWN0R0VQKFZBTGlzdEFkZHIsIDAsICJzdGFja19wIik7Ci0gIE9uU3RhY2tBZGRyID0gQ0dGLkJ1aWxkZXIuQ3JlYXRlTG9hZChzdGFja19wLCAic3RhY2siKTsKLQotICAvLyBBZ2Fpbiwgc3RhY2sgYXJndW1lbnRzIG1heSBuZWVkIHJlYWxpZ21uZW50LiBJbiB0aGlzIGNhc2UgYm90aCBpbnRlZ2VyIGFuZAotICAvLyBmbG9hdGluZy1wb2ludCBvbmVzIG1pZ2h0IGJlIGFmZmVjdGVkLgotICBpZiAoQUkuaXNEaXJlY3QoKSAmJiBnZXRDb250ZXh0KCkuZ2V0VHlwZUFsaWduKFR5KSA+IDY0KSB7Ci0gICAgaW50IEFsaWduID0gZ2V0Q29udGV4dCgpLmdldFR5cGVBbGlnbihUeSkgLyA4OwotCi0gICAgT25TdGFja0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVQdHJUb0ludChPblN0YWNrQWRkciwgQ0dGLkludDY0VHkpOwotCi0gICAgT25TdGFja0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVBZGQoT25TdGFja0FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KENHRi5JbnQ2NFR5LCBBbGlnbiAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsaWduX3N0YWNrIik7Ci0gICAgT25TdGFja0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVBbmQoT25TdGFja0FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KENHRi5JbnQ2NFR5LCAtQWxpZ24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsaWduX3N0YWNrIik7Ci0KLSAgICBPblN0YWNrQWRkciA9IENHRi5CdWlsZGVyLkNyZWF0ZUludFRvUHRyKE9uU3RhY2tBZGRyLCBDR0YuSW50OFB0clR5KTsKLSAgfQotCi0gIHVpbnQ2NF90IFN0YWNrU2l6ZTsKLSAgaWYgKEFJLmlzRGlyZWN0KCkpCi0gICAgU3RhY2tTaXplID0gZ2V0Q29udGV4dCgpLmdldFR5cGVTaXplKFR5KSAvIDg7Ci0gIGVsc2UKLSAgICBTdGFja1NpemUgPSA4OwotCi0gIC8vIEFsbCBzdGFjayBzbG90cyBhcmUgOCBieXRlcwotICBTdGFja1NpemUgPSBsbHZtOjpSb3VuZFVwVG9BbGlnbm1lbnQoU3RhY2tTaXplLCA4KTsKLQotICBsbHZtOjpWYWx1ZSAqU3RhY2tTaXplQyA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoQ0dGLkludDMyVHksIFN0YWNrU2l6ZSk7Ci0gIGxsdm06OlZhbHVlICpOZXdTdGFjayA9IENHRi5CdWlsZGVyLkNyZWF0ZUdFUChPblN0YWNrQWRkciwgU3RhY2tTaXplQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdfc3RhY2siKTsKLQotICAvLyBXcml0ZSB0aGUgbmV3IHZhbHVlIG9mIF9fc3RhY2sgZm9yIHRoZSBuZXh0IGNhbGwgdG8gdmFfYXJnCi0gIENHRi5CdWlsZGVyLkNyZWF0ZVN0b3JlKE5ld1N0YWNrLCBzdGFja19wKTsKLQotICBPblN0YWNrQWRkciA9IENHRi5CdWlsZGVyLkNyZWF0ZUJpdENhc3QoT25TdGFja0FkZHIsIE1lbVR5KTsKLQotICBDR0YuRW1pdEJyYW5jaChDb250QmxvY2spOwotCi0gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIFRpZHkgdXAKLSAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgQ0dGLkVtaXRCbG9jayhDb250QmxvY2spOwotCi0gIGxsdm06OlBISU5vZGUgKlJlc0FkZHIgPSBDR0YuQnVpbGRlci5DcmVhdGVQSEkoTWVtVHksIDIsICJ2YWFyZy5hZGRyIik7Ci0gIFJlc0FkZHItPmFkZEluY29taW5nKFJlZ0FkZHIsIEluUmVnQmxvY2spOwotICBSZXNBZGRyLT5hZGRJbmNvbWluZyhPblN0YWNrQWRkciwgT25TdGFja0Jsb2NrKTsKLQotICBpZiAoQUkuaXNEaXJlY3QoKSkKLSAgICByZXR1cm4gUmVzQWRkcjsKLQotICByZXR1cm4gQ0dGLkJ1aWxkZXIuQ3JlYXRlTG9hZChSZXNBZGRyLCAidmFhcmcuYWRkciIpOworICByZXR1cm4gRW1pdEFBcmNoNjRWQUFyZyhWQUxpc3RBZGRyLCBUeSwgOCAtIEZyZWVJbnRSZWdzLCA4IC0gRnJlZVZGUFJlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFJLmlzSW5kaXJlY3QoKSwgQ0dGKTsKIH0KIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTQxNzUsMTggKzQ3NDgsMTggQEAKICAgQUJJQXJnSW5mbyBjbGFzc2lmeVJldHVyblR5cGUoUXVhbFR5cGUgUmV0VHkpIGNvbnN0OwogICBBQklBcmdJbmZvIGNsYXNzaWZ5QXJndW1lbnRUeXBlKFF1YWxUeXBlIFR5KSBjb25zdDsKIAotICB2aXJ0dWFsIHZvaWQgY29tcHV0ZUluZm8oQ0dGdW5jdGlvbkluZm8gJkZJKSBjb25zdDsKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqRW1pdFZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0ZHKSBjb25zdDsKKyAgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IG92ZXJyaWRlOworICBsbHZtOjpWYWx1ZSAqRW1pdFZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNGRykgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBOVlBUWFRhcmdldENvZGVHZW5JbmZvIDogcHVibGljIFRhcmdldENvZGVHZW5JbmZvIHsKIHB1YmxpYzoKICAgTlZQVFhUYXJnZXRDb2RlR2VuSW5mbyhDb2RlR2VuVHlwZXMgJkNHVCkKICAgICA6IFRhcmdldENvZGVHZW5JbmZvKG5ldyBOVlBUWEFCSUluZm8oQ0dUKSkge30KLSAgICAKLSAgdmlydHVhbCB2b2lkIFNldFRhcmdldEF0dHJpYnV0ZXMoY29uc3QgRGVjbCAqRCwgbGx2bTo6R2xvYmFsVmFsdWUgKkdWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZNKSBjb25zdDsKKworICB2b2lkIFNldFRhcmdldEF0dHJpYnV0ZXMoY29uc3QgRGVjbCAqRCwgbGx2bTo6R2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmTSkgY29uc3Qgb3ZlcnJpZGU7CiBwcml2YXRlOgogICBzdGF0aWMgdm9pZCBhZGRLZXJuZWxNZXRhZGF0YShsbHZtOjpGdW5jdGlvbiAqRik7CiB9OwpAQCAtNDIxOCw5ICs0NzkxLDggQEAKIAogdm9pZCBOVlBUWEFCSUluZm86OmNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3QgewogICBGSS5nZXRSZXR1cm5JbmZvKCkgPSBjbGFzc2lmeVJldHVyblR5cGUoRkkuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgZm9yIChDR0Z1bmN0aW9uSW5mbzo6YXJnX2l0ZXJhdG9yIGl0ID0gRkkuYXJnX2JlZ2luKCksIGllID0gRkkuYXJnX2VuZCgpOwotICAgICAgIGl0ICE9IGllOyArK2l0KQotICAgIGl0LT5pbmZvID0gY2xhc3NpZnlBcmd1bWVudFR5cGUoaXQtPnR5cGUpOworICBmb3IgKGF1dG8gJkkgOiBGSS5hcmd1bWVudHMoKSkKKyAgICBJLmluZm8gPSBjbGFzc2lmeUFyZ3VtZW50VHlwZShJLnR5cGUpOwogCiAgIC8vIEFsd2F5cyBob25vciB1c2VyLXNwZWNpZmllZCBjYWxsaW5nIGNvbnZlbnRpb24uCiAgIGlmIChGSS5nZXRDYWxsaW5nQ29udmVudGlvbigpICE9IGxsdm06OkNhbGxpbmdDb252OjpDKQpAQCAtNDI1OSw3ICs0ODMxLDcgQEAKICAgICAvLyBDVURBIF9fZ2xvYmFsX18gZnVuY3Rpb25zIGdldCBhIGtlcm5lbCBtZXRhZGF0YSBlbnRyeS4gIFNpbmNlCiAgICAgLy8gX19nbG9iYWxfXyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIHRoZSBkZXZpY2UsIHdlIGRvIG5vdAogICAgIC8vIG5lZWQgdG8gc2V0IHRoZSBub2lubGluZSBhdHRyaWJ1dGUuCi0gICAgaWYgKEZELT5nZXRBdHRyPENVREFHbG9iYWxBdHRyPigpKQorICAgIGlmIChGRC0+aGFzQXR0cjxDVURBR2xvYmFsQXR0cj4oKSkKICAgICAgIGFkZEtlcm5lbE1ldGFkYXRhKEYpOwogICB9CiB9CkBAIC00MzAwLDE1ICs0ODcyLDE0IEBACiAgIEFCSUFyZ0luZm8gY2xhc3NpZnlSZXR1cm5UeXBlKFF1YWxUeXBlIFJldFR5KSBjb25zdDsKICAgQUJJQXJnSW5mbyBjbGFzc2lmeUFyZ3VtZW50VHlwZShRdWFsVHlwZSBBcmdUeSkgY29uc3Q7CiAKLSAgdmlydHVhbCB2b2lkIGNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3QgeworICB2b2lkIGNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIEZJLmdldFJldHVybkluZm8oKSA9IGNsYXNzaWZ5UmV0dXJuVHlwZShGSS5nZXRSZXR1cm5UeXBlKCkpOwotICAgIGZvciAoQ0dGdW5jdGlvbkluZm86OmFyZ19pdGVyYXRvciBpdCA9IEZJLmFyZ19iZWdpbigpLCBpZSA9IEZJLmFyZ19lbmQoKTsKLSAgICAgICAgIGl0ICE9IGllOyArK2l0KQotICAgICAgaXQtPmluZm8gPSBjbGFzc2lmeUFyZ3VtZW50VHlwZShpdC0+dHlwZSk7CisgICAgZm9yIChhdXRvICZJIDogRkkuYXJndW1lbnRzKCkpCisgICAgICBJLmluZm8gPSBjbGFzc2lmeUFyZ3VtZW50VHlwZShJLnR5cGUpOwogICB9CiAKLSAgdmlydHVhbCBsbHZtOjpWYWx1ZSAqRW1pdFZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdDsKKyAgbGx2bTo6VmFsdWUgKkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgUXVhbFR5cGUgVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0IG92ZXJyaWRlOwogfTsKIAogY2xhc3MgU3lzdGVtWlRhcmdldENvZGVHZW5JbmZvIDogcHVibGljIFRhcmdldENvZGVHZW5JbmZvIHsKQEAgLTQzNjAsOSArNDkzMSw4IEBACiAKICAgICAvLyBJZiB0aGlzIGlzIGEgQysrIHJlY29yZCwgY2hlY2sgdGhlIGJhc2VzIGZpcnN0LgogICAgIGlmIChjb25zdCBDWFhSZWNvcmREZWNsICpDWFhSRCA9IGR5bl9jYXN0PENYWFJlY29yZERlY2w+KFJEKSkKLSAgICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gQ1hYUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgRSA9IENYWFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgICAgUXVhbFR5cGUgQmFzZSA9IEktPmdldFR5cGUoKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmSSA6IENYWFJELT5iYXNlcygpKSB7CisgICAgICAgIFF1YWxUeXBlIEJhc2UgPSBJLmdldFR5cGUoKTsKIAogICAgICAgICAvLyBFbXB0eSBiYXNlcyBkb24ndCBhZmZlY3QgdGhpbmdzIGVpdGhlciB3YXkuCiAgICAgICAgIGlmIChpc0VtcHR5UmVjb3JkKGdldENvbnRleHQoKSwgQmFzZSwgdHJ1ZSkpCkBAIC00Mzc2LDEwICs0OTQ2LDcgQEAKICAgICAgIH0KIAogICAgIC8vIENoZWNrIHRoZSBmaWVsZHMuCi0gICAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBJID0gUkQtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICAgIEUgPSBSRC0+ZmllbGRfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBjb25zdCBGaWVsZERlY2wgKkZEID0gKkk7Ci0KKyAgICBmb3IgKGNvbnN0IGF1dG8gKkZEIDogUkQtPmZpZWxkcygpKSB7CiAgICAgICAvLyBFbXB0eSBiaXRmaWVsZHMgZG9uJ3QgYWZmZWN0IHRoaW5ncyBlaXRoZXIgd2F5LgogICAgICAgLy8gVW5saWtlIGlzU2luZ2xlRWxlbWVudFN0cnVjdCgpLCBlbXB0eSBzdHJ1Y3R1cmUgYW5kIGFycmF5IGZpZWxkcwogICAgICAgLy8gZG8gY291bnQuICBTbyBkbyBhbm9ueW1vdXMgYml0ZmllbGRzIHRoYXQgYXJlbid0IHplcm8tc2l6ZWQuCkBAIC00NDUyLDcgKzUwMTksNyBAQAogICBsbHZtOjpUeXBlICpJbmRleFR5ID0gUmVnQ291bnQtPmdldFR5cGUoKTsKICAgbGx2bTo6VmFsdWUgKk1heFJlZ3NWID0gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChJbmRleFR5LCBNYXhSZWdzKTsKICAgbGx2bTo6VmFsdWUgKkluUmVncyA9IENHRi5CdWlsZGVyLkNyZWF0ZUlDbXBVTFQoUmVnQ291bnQsIE1heFJlZ3NWLAotCQkJCQkJICAiZml0c19pbl9yZWdzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpdHNfaW5fcmVncyIpOwogCiAgIGxsdm06OkJhc2ljQmxvY2sgKkluUmVnQmxvY2sgPSBDR0YuY3JlYXRlQmFzaWNCbG9jaygidmFhcmcuaW5fcmVnIik7CiAgIGxsdm06OkJhc2ljQmxvY2sgKkluTWVtQmxvY2sgPSBDR0YuY3JlYXRlQmFzaWNCbG9jaygidmFhcmcuaW5fbWVtIik7CkBAIC00NTM1LDE1ICs1MTAyLDIyIEBACiAgICAgcmV0dXJuIHRydWU7CiAKICAgc3dpdGNoIChUcmlwbGUuZ2V0T1MoKSkgewotICBjYXNlIGxsdm06OlRyaXBsZTo6Q3lnd2luOgotICBjYXNlIGxsdm06OlRyaXBsZTo6TWluR1czMjoKICAgY2FzZSBsbHZtOjpUcmlwbGU6OkF1cm9yYVVYOgogICBjYXNlIGxsdm06OlRyaXBsZTo6RHJhZ29uRmx5OgogICBjYXNlIGxsdm06OlRyaXBsZTo6RnJlZUJTRDoKICAgY2FzZSBsbHZtOjpUcmlwbGU6Ok9wZW5CU0Q6CiAgIGNhc2UgbGx2bTo6VHJpcGxlOjpCaXRyaWc6Ci0gIGNhc2UgbGx2bTo6VHJpcGxlOjpXaW4zMjoKICAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OldpbjMyOgorICAgIHN3aXRjaCAoVHJpcGxlLmdldEVudmlyb25tZW50KCkpIHsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6VW5rbm93bkVudmlyb25tZW50OgorICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpDeWdudXM6CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkdOVToKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6TVNWQzoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICBkZWZhdWx0OgogICAgIHJldHVybiBmYWxzZTsKICAgfQpAQCAtNDYxMSw3ICs1MTg1LDcgQEAKICAgTVNQNDMwVGFyZ2V0Q29kZUdlbkluZm8oQ29kZUdlblR5cGVzICZDR1QpCiAgICAgOiBUYXJnZXRDb2RlR2VuSW5mbyhuZXcgRGVmYXVsdEFCSUluZm8oQ0dUKSkge30KICAgdm9pZCBTZXRUYXJnZXRBdHRyaWJ1dGVzKGNvbnN0IERlY2wgKkQsIGxsdm06Okdsb2JhbFZhbHVlICpHViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJk0pIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmTSkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiB9CkBAIC00NjYwLDkgKzUyMzQsOSBAQAogCiAgIEFCSUFyZ0luZm8gY2xhc3NpZnlSZXR1cm5UeXBlKFF1YWxUeXBlIFJldFR5KSBjb25zdDsKICAgQUJJQXJnSW5mbyBjbGFzc2lmeUFyZ3VtZW50VHlwZShRdWFsVHlwZSBSZXRUeSwgdWludDY0X3QgJk9mZnNldCkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0OwotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0OworICB2b2lkIGNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3Qgb3ZlcnJpZGU7CisgIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIGNsYXNzIE1JUFNUYXJnZXRDb2RlR2VuSW5mbyA6IHB1YmxpYyBUYXJnZXRDb2RlR2VuSW5mbyB7CkBAIC00NjcyLDEyICs1MjQ2LDEyIEBACiAgICAgOiBUYXJnZXRDb2RlR2VuSW5mbyhuZXcgTWlwc0FCSUluZm8oQ0dULCBJc08zMikpLAogICAgICAgU2l6ZU9mVW53aW5kRXhjZXB0aW9uKElzTzMyID8gMjQgOiAzMikge30KIAotICBpbnQgZ2V0RHdhcmZFSFN0YWNrUG9pbnRlcihDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZDR00pIGNvbnN0IHsKKyAgaW50IGdldER3YXJmRUhTdGFja1BvaW50ZXIoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmQ0dNKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDI5OwogICB9CiAKICAgdm9pZCBTZXRUYXJnZXRBdHRyaWJ1dGVzKGNvbnN0IERlY2wgKkQsIGxsdm06Okdsb2JhbFZhbHVlICpHViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJkNHTSkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmQ0dNKSBjb25zdCBvdmVycmlkZSB7CiAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oRCk7CiAgICAgaWYgKCFGRCkgcmV0dXJuOwogICAgIGxsdm06OkZ1bmN0aW9uICpGbiA9IGNhc3Q8bGx2bTo6RnVuY3Rpb24+KEdWKTsKQEAgLTQ2OTAsOSArNTI2NCw5IEBACiAgIH0KIAogICBib29sIGluaXREd2FyZkVIUmVnU2l6ZVRhYmxlKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlZhbHVlICpBZGRyZXNzKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQWRkcmVzcykgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdW5zaWduZWQgZ2V0U2l6ZU9mVW53aW5kRXhjZXB0aW9uKCkgY29uc3QgeworICB1bnNpZ25lZCBnZXRTaXplT2ZVbndpbmRFeGNlcHRpb24oKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFNpemVPZlVud2luZEV4Y2VwdGlvbjsKICAgfQogfTsKQEAgLTQ5MDEsOSArNTQ3NSw4IEBACiAgIC8vIENoZWNrIGlmIGEgcG9pbnRlciB0byBhbiBhZ2dyZWdhdGUgaXMgcGFzc2VkIGFzIGEgaGlkZGVuIGFyZ3VtZW50LiAgCiAgIHVpbnQ2NF90IE9mZnNldCA9IFJldEluZm8uaXNJbmRpcmVjdCgpID8gTWluQUJJU3RhY2tBbGlnbkluQnl0ZXMgOiAwOwogCi0gIGZvciAoQ0dGdW5jdGlvbkluZm86OmFyZ19pdGVyYXRvciBpdCA9IEZJLmFyZ19iZWdpbigpLCBpZSA9IEZJLmFyZ19lbmQoKTsKLSAgICAgICBpdCAhPSBpZTsgKytpdCkKLSAgICBpdC0+aW5mbyA9IGNsYXNzaWZ5QXJndW1lbnRUeXBlKGl0LT50eXBlLCBPZmZzZXQpOworICBmb3IgKGF1dG8gJkkgOiBGSS5hcmd1bWVudHMoKSkKKyAgICBJLmluZm8gPSBjbGFzc2lmeUFyZ3VtZW50VHlwZShJLnR5cGUsIE9mZnNldCk7CiB9CiAKIGxsdm06OlZhbHVlKiBNaXBzQUJJSW5mbzo6RW1pdFZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKQEAgLTQ5ODQsOCArNTU1Nyw4IEBACiAgIFRDRVRhcmdldENvZGVHZW5JbmZvKENvZGVHZW5UeXBlcyAmQ0dUKQogICAgIDogRGVmYXVsdFRhcmdldENvZGVHZW5JbmZvKENHVCkge30KIAotICB2aXJ0dWFsIHZvaWQgU2V0VGFyZ2V0QXR0cmlidXRlcyhjb25zdCBEZWNsICpELCBsbHZtOjpHbG9iYWxWYWx1ZSAqR1YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJk0pIGNvbnN0OworICB2b2lkIFNldFRhcmdldEF0dHJpYnV0ZXMoY29uc3QgRGVjbCAqRCwgbGx2bTo6R2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmTSkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiB2b2lkIFRDRVRhcmdldENvZGVHZW5JbmZvOjpTZXRUYXJnZXRBdHRyaWJ1dGVzKGNvbnN0IERlY2wgKkQsCkBAIC01MDAwLDkgKzU1NzMsOCBAQAogICAgIGlmIChGRC0+aGFzQXR0cjxPcGVuQ0xLZXJuZWxBdHRyPigpKSB7CiAgICAgICAvLyBPcGVuQ0wgQyBLZXJuZWwgZnVuY3Rpb25zIGFyZSBub3Qgc3ViamVjdCB0byBpbmxpbmluZwogICAgICAgRi0+YWRkRm5BdHRyKGxsdm06OkF0dHJpYnV0ZTo6Tm9JbmxpbmUpOwotICAgICAgICAgIAotICAgICAgaWYgKEZELT5oYXNBdHRyPFJlcWRXb3JrR3JvdXBTaXplQXR0cj4oKSkgewotCisgICAgICBjb25zdCBSZXFkV29ya0dyb3VwU2l6ZUF0dHIgKkF0dHIgPSBGRC0+Z2V0QXR0cjxSZXFkV29ya0dyb3VwU2l6ZUF0dHI+KCk7CisgICAgICBpZiAoQXR0cikgewogICAgICAgICAvLyBDb252ZXJ0IHRoZSByZXFkX3dvcmtfZ3JvdXBfc2l6ZSgpIGF0dHJpYnV0ZXMgdG8gbWV0YWRhdGEuCiAgICAgICAgIGxsdm06OkxMVk1Db250ZXh0ICZDb250ZXh0ID0gRi0+Z2V0Q29udGV4dCgpOwogICAgICAgICBsbHZtOjpOYW1lZE1ETm9kZSAqT3BlbkNMTWV0YWRhdGEgPSAKQEAgLTUwMTIsMTQgKzU1ODQsMTEgQEAKICAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKEYpOwogCiAgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhsbHZtOjpDb25zdGFudDo6Z2V0SW50ZWdlclZhbHVlKE0uSW50MzJUeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFQSW50KDMyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkQtPmdldEF0dHI8UmVxZFdvcmtHcm91cFNpemVBdHRyPigpLT5nZXRYRGltKCkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFQSW50KDMyLCBBdHRyLT5nZXRYRGltKCkpKSk7CiAgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhsbHZtOjpDb25zdGFudDo6Z2V0SW50ZWdlclZhbHVlKE0uSW50MzJUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QVBJbnQoMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkQtPmdldEF0dHI8UmVxZFdvcmtHcm91cFNpemVBdHRyPigpLT5nZXRZRGltKCkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFQSW50KDMyLCBBdHRyLT5nZXRZRGltKCkpKSk7CiAgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjayhsbHZtOjpDb25zdGFudDo6Z2V0SW50ZWdlclZhbHVlKE0uSW50MzJUeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFQSW50KDMyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRC0+Z2V0QXR0cjxSZXFkV29ya0dyb3VwU2l6ZUF0dHI+KCktPmdldFpEaW0oKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QVBJbnQoMzIsIEF0dHItPmdldFpEaW0oKSkpKTsKIAogICAgICAgICAvLyBBZGQgYSBib29sZWFuIGNvbnN0YW50IG9wZXJhbmQgZm9yICJyZXF1aXJlZCIgKHRydWUpIG9yICJoaW50IiAoZmFsc2UpCiAgICAgICAgIC8vIGZvciBpbXBsZW1lbnRpbmcgdGhlIHdvcmtfZ3JvdXBfc2l6ZV9oaW50IGF0dHIgbGF0ZXIuIEN1cnJlbnRseSAKQEAgLTUwNTAsMTAgKzU2MTksMTAgQEAKICAgQUJJQXJnSW5mbyBjbGFzc2lmeVJldHVyblR5cGUoUXVhbFR5cGUgUmV0VHkpIGNvbnN0OwogICBBQklBcmdJbmZvIGNsYXNzaWZ5QXJndW1lbnRUeXBlKFF1YWxUeXBlIFJldFR5KSBjb25zdDsKIAotICB2aXJ0dWFsIHZvaWQgY29tcHV0ZUluZm8oQ0dGdW5jdGlvbkluZm8gJkZJKSBjb25zdDsKKyAgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgbGx2bTo6VmFsdWUgKkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgUXVhbFR5cGUgVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRikgY29uc3Q7CisgIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIGNsYXNzIEhleGFnb25UYXJnZXRDb2RlR2VuSW5mbyA6IHB1YmxpYyBUYXJnZXRDb2RlR2VuSW5mbyB7CkBAIC01MDYxLDcgKzU2MzAsNyBAQAogICBIZXhhZ29uVGFyZ2V0Q29kZUdlbkluZm8oQ29kZUdlblR5cGVzICZDR1QpCiAgICAgOlRhcmdldENvZGVHZW5JbmZvKG5ldyBIZXhhZ29uQUJJSW5mbyhDR1QpKSB7fQogCi0gIGludCBnZXREd2FyZkVIU3RhY2tQb2ludGVyKENvZGVHZW46OkNvZGVHZW5Nb2R1bGUgJk0pIGNvbnN0IHsKKyAgaW50IGdldER3YXJmRUhTdGFja1BvaW50ZXIoQ29kZUdlbjo6Q29kZUdlbk1vZHVsZSAmTSkgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiAyOTsKICAgfQogfTsKQEAgLTUwNzAsOSArNTYzOSw4IEBACiAKIHZvaWQgSGV4YWdvbkFCSUluZm86OmNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3QgewogICBGSS5nZXRSZXR1cm5JbmZvKCkgPSBjbGFzc2lmeVJldHVyblR5cGUoRkkuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgZm9yIChDR0Z1bmN0aW9uSW5mbzo6YXJnX2l0ZXJhdG9yIGl0ID0gRkkuYXJnX2JlZ2luKCksIGllID0gRkkuYXJnX2VuZCgpOwotICAgICAgIGl0ICE9IGllOyArK2l0KQotICAgIGl0LT5pbmZvID0gY2xhc3NpZnlBcmd1bWVudFR5cGUoaXQtPnR5cGUpOworICBmb3IgKGF1dG8gJkkgOiBGSS5hcmd1bWVudHMoKSkKKyAgICBJLmluZm8gPSBjbGFzc2lmeUFyZ3VtZW50VHlwZShJLnR5cGUpOwogfQogCiBBQklBcmdJbmZvIEhleGFnb25BQklJbmZvOjpjbGFzc2lmeUFyZ3VtZW50VHlwZShRdWFsVHlwZSBUeSkgY29uc3QgewpAQCAtNTIwNSw5ICs1NzczLDkgQEAKIAogcHJpdmF0ZToKICAgQUJJQXJnSW5mbyBjbGFzc2lmeVR5cGUoUXVhbFR5cGUgUmV0VHksIHVuc2lnbmVkIFNpemVMaW1pdCkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0OwotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0OworICB2b2lkIGNvbXB1dGVJbmZvKENHRnVuY3Rpb25JbmZvICZGSSkgY29uc3Qgb3ZlcnJpZGU7CisgIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GdW5jdGlvbiAmQ0dGKSBjb25zdCBvdmVycmlkZTsKIAogICAvLyBDb2VyY2lvbiB0eXBlIGJ1aWxkZXIgZm9yIHN0cnVjdHMgcGFzc2VkIGluIHJlZ2lzdGVycy4gVGhlIGNvZXJjaW9uIHR5cGUKICAgLy8gc2VydmVzIHR3byBwdXJwb3NlczoKQEAgLTUzNDYsNiArNTkxNCwxMSBAQAogICBpZiAoIWlzQWdncmVnYXRlVHlwZUZvckFCSShUeSkpCiAgICAgcmV0dXJuIEFCSUFyZ0luZm86OmdldERpcmVjdCgpOwogCisgIC8vIElmIGEgQysrIG9iamVjdCBoYXMgZWl0aGVyIGEgbm9uLXRyaXZpYWwgY29weSBjb25zdHJ1Y3RvciBvciBhIG5vbi10cml2aWFsCisgIC8vIGRlc3RydWN0b3IsIGl0IGlzIHBhc3NlZCB3aXRoIGFuIGV4cGxpY2l0IGluZGlyZWN0IHBvaW50ZXIgLyBzcmV0IHBvaW50ZXIuCisgIGlmIChDR0NYWEFCSTo6UmVjb3JkQXJnQUJJIFJBQSA9IGdldFJlY29yZEFyZ0FCSShUeSwgZ2V0Q1hYQUJJKCkpKQorICAgIHJldHVybiBBQklBcmdJbmZvOjpnZXRJbmRpcmVjdCgwLCBSQUEgPT0gQ0dDWFhBQkk6OlJBQV9EaXJlY3RJbk1lbW9yeSk7CisKICAgLy8gVGhpcyBpcyBhIHNtYWxsIGFnZ3JlZ2F0ZSB0eXBlIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBpbiByZWdpc3RlcnMuCiAgIC8vIEJ1aWxkIGEgY29lcmNpb24gdHlwZSBmcm9tIHRoZSBMTFZNIHN0cnVjdCB0eXBlLgogICBsbHZtOjpTdHJ1Y3RUeXBlICpTdHJUeSA9IGR5bl9jYXN0PGxsdm06OlN0cnVjdFR5cGU+KENHVC5Db252ZXJ0VHlwZShUeSkpOwpAQCAtNTM4Miw2ICs1OTU1LDcgQEAKIAogICBzd2l0Y2ggKEFJLmdldEtpbmQoKSkgewogICBjYXNlIEFCSUFyZ0luZm86OkV4cGFuZDoKKyAgY2FzZSBBQklBcmdJbmZvOjpJbkFsbG9jYToKICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBBQkkga2luZCBmb3IgdmFfYXJnIik7CiAKICAgY2FzZSBBQklBcmdJbmZvOjpFeHRlbmQ6CkBAIC01NDE3LDkgKzU5OTEsOCBAQAogCiB2b2lkIFNwYXJjVjlBQklJbmZvOjpjb21wdXRlSW5mbyhDR0Z1bmN0aW9uSW5mbyAmRkkpIGNvbnN0IHsKICAgRkkuZ2V0UmV0dXJuSW5mbygpID0gY2xhc3NpZnlUeXBlKEZJLmdldFJldHVyblR5cGUoKSwgMzIgKiA4KTsKLSAgZm9yIChDR0Z1bmN0aW9uSW5mbzo6YXJnX2l0ZXJhdG9yIGl0ID0gRkkuYXJnX2JlZ2luKCksIGllID0gRkkuYXJnX2VuZCgpOwotICAgICAgIGl0ICE9IGllOyArK2l0KQotICAgIGl0LT5pbmZvID0gY2xhc3NpZnlUeXBlKGl0LT50eXBlLCAxNiAqIDgpOworICBmb3IgKGF1dG8gJkkgOiBGSS5hcmd1bWVudHMoKSkKKyAgICBJLmluZm8gPSBjbGFzc2lmeVR5cGUoSS50eXBlLCAxNiAqIDgpOwogfQogCiBuYW1lc3BhY2UgewpAQCAtNTQyNywyNCArNjAwMCw2NSBAQAogcHVibGljOgogICBTcGFyY1Y5VGFyZ2V0Q29kZUdlbkluZm8oQ29kZUdlblR5cGVzICZDR1QpCiAgICAgOiBUYXJnZXRDb2RlR2VuSW5mbyhuZXcgU3BhcmNWOUFCSUluZm8oQ0dUKSkge30KKworICBpbnQgZ2V0RHdhcmZFSFN0YWNrUG9pbnRlcihDb2RlR2VuOjpDb2RlR2VuTW9kdWxlICZNKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIDE0OworICB9CisKKyAgYm9vbCBpbml0RHdhcmZFSFJlZ1NpemVUYWJsZShDb2RlR2VuOjpDb2RlR2VuRnVuY3Rpb24gJkNHRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpWYWx1ZSAqQWRkcmVzcykgY29uc3Qgb3ZlcnJpZGU7CiB9OwogfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQogCitib29sCitTcGFyY1Y5VGFyZ2V0Q29kZUdlbkluZm86OmluaXREd2FyZkVIUmVnU2l6ZVRhYmxlKENvZGVHZW46OkNvZGVHZW5GdW5jdGlvbiAmQ0dGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VmFsdWUgKkFkZHJlc3MpIGNvbnN0IHsKKyAgLy8gVGhpcyBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIExMVk0gYW5kIEdDQyB0YWJsZXMgYW5kIHZlcmlmaWVkCisgIC8vIGFnYWluc3QgZ2NjIG91dHB1dC4gIEFGQUlLIGFsbCBBQklzIHVzZSB0aGUgc2FtZSBlbmNvZGluZy4KKworICBDb2RlR2VuOjpDR0J1aWxkZXJUeSAmQnVpbGRlciA9IENHRi5CdWlsZGVyOworCisgIGxsdm06OkludGVnZXJUeXBlICppOCA9IENHRi5JbnQ4VHk7CisgIGxsdm06OlZhbHVlICpGb3VyOCA9IGxsdm06OkNvbnN0YW50SW50OjpnZXQoaTgsIDQpOworICBsbHZtOjpWYWx1ZSAqRWlnaHQ4ID0gbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChpOCwgOCk7CisKKyAgLy8gMC0zMTogdGhlIDgtYnl0ZSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzCisgIEFzc2lnblRvQXJyYXlSYW5nZShCdWlsZGVyLCBBZGRyZXNzLCBFaWdodDgsIDAsIDMxKTsKKworICAvLyAzMi02MzogZjAtMzEsIHRoZSA0LWJ5dGUgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzCisgIEFzc2lnblRvQXJyYXlSYW5nZShCdWlsZGVyLCBBZGRyZXNzLCBGb3VyOCwgMzIsIDYzKTsKKworICAvLyAgIFkgICA9IDY0CisgIC8vICAgUFNSID0gNjUKKyAgLy8gICBXSU0gPSA2NgorICAvLyAgIFRCUiA9IDY3CisgIC8vICAgUEMgID0gNjgKKyAgLy8gICBOUEMgPSA2OQorICAvLyAgIEZTUiA9IDcwCisgIC8vICAgQ1NSID0gNzEKKyAgQXNzaWduVG9BcnJheVJhbmdlKEJ1aWxkZXIsIEFkZHJlc3MsIEVpZ2h0OCwgNjQsIDcxKTsKKyAgIAorICAvLyA3Mi04NzogZDAtMTUsIHRoZSA4LWJ5dGUgZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzCisgIEFzc2lnblRvQXJyYXlSYW5nZShCdWlsZGVyLCBBZGRyZXNzLCBFaWdodDgsIDcyLCA4Nyk7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyBYY29yZSBBQkkgSW1wbGVtZW50YXRpb24KKy8vIFhDb3JlIEFCSSBJbXBsZW1lbnRhdGlvbgogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIG5hbWVzcGFjZSB7CiBjbGFzcyBYQ29yZUFCSUluZm8gOiBwdWJsaWMgRGVmYXVsdEFCSUluZm8gewogcHVibGljOgogICBYQ29yZUFCSUluZm8oQ29kZUdlbjo6Q29kZUdlblR5cGVzICZDR1QpIDogRGVmYXVsdEFCSUluZm8oQ0dUKSB7fQotICB2aXJ0dWFsIGxsdm06OlZhbHVlICpFbWl0VkFBcmcobGx2bTo6VmFsdWUgKlZBTGlzdEFkZHIsIFF1YWxUeXBlIFR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkZ1bmN0aW9uICZDR0YpIGNvbnN0OworICBsbHZtOjpWYWx1ZSAqRW1pdFZBQXJnKGxsdm06OlZhbHVlICpWQUxpc3RBZGRyLCBRdWFsVHlwZSBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuRnVuY3Rpb24gJkNHRikgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCi1jbGFzcyBYY29yZVRhcmdldENvZGVHZW5JbmZvIDogcHVibGljIFRhcmdldENvZGVHZW5JbmZvIHsKK2NsYXNzIFhDb3JlVGFyZ2V0Q29kZUdlbkluZm8gOiBwdWJsaWMgVGFyZ2V0Q29kZUdlbkluZm8gewogcHVibGljOgotICBYY29yZVRhcmdldENvZGVHZW5JbmZvKENvZGVHZW5UeXBlcyAmQ0dUKQorICBYQ29yZVRhcmdldENvZGVHZW5JbmZvKENvZGVHZW5UeXBlcyAmQ0dUKQogICAgIDpUYXJnZXRDb2RlR2VuSW5mbyhuZXcgWENvcmVBQklJbmZvKENHVCkpIHt9CiB9OwogfSAvLyBFbmQgYW5vbnltb3VzIG5hbWVzcGFjZS4KQEAgLTU0NjgsNiArNjA4Miw3IEBACiAgIHVpbnQ2NF90IEFyZ1NpemUgPSAwOwogICBzd2l0Y2ggKEFJLmdldEtpbmQoKSkgewogICBjYXNlIEFCSUFyZ0luZm86OkV4cGFuZDoKKyAgY2FzZSBBQklBcmdJbmZvOjpJbkFsbG9jYToKICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBBQkkga2luZCBmb3IgdmFfYXJnIik7CiAgIGNhc2UgQUJJQXJnSW5mbzo6SWdub3JlOgogICAgIFZhbCA9IGxsdm06OlVuZGVmVmFsdWU6OmdldChBcmdQdHJUeSk7CkBAIC01NTIwLDExICs2MTM1LDIyIEBACiAgIGNhc2UgbGx2bTo6VHJpcGxlOjptaXBzNjRlbDoKICAgICByZXR1cm4gKihUaGVUYXJnZXRDb2RlR2VuSW5mbyA9IG5ldyBNSVBTVGFyZ2V0Q29kZUdlbkluZm8oVHlwZXMsIGZhbHNlKSk7CiAKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OmFybTY0OiB7CisgICAgQVJNNjRBQklJbmZvOjpBQklLaW5kIEtpbmQgPSBBUk02NEFCSUluZm86OkFBUENTOworICAgIGlmIChzdHJjbXAoZ2V0VGFyZ2V0KCkuZ2V0QUJJKCksICJkYXJ3aW5wY3MiKSA9PSAwKQorICAgICAgS2luZCA9IEFSTTY0QUJJSW5mbzo6RGFyd2luUENTOworCisgICAgcmV0dXJuICooVGhlVGFyZ2V0Q29kZUdlbkluZm8gPSBuZXcgQVJNNjRUYXJnZXRDb2RlR2VuSW5mbyhUeXBlcywgS2luZCkpOworICB9CisKICAgY2FzZSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQ6CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphYXJjaDY0X2JlOgogICAgIHJldHVybiAqKFRoZVRhcmdldENvZGVHZW5JbmZvID0gbmV3IEFBcmNoNjRUYXJnZXRDb2RlR2VuSW5mbyhUeXBlcykpOwogCiAgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm06CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm1lYjoKICAgY2FzZSBsbHZtOjpUcmlwbGU6OnRodW1iOgorICBjYXNlIGxsdm06OlRyaXBsZTo6dGh1bWJlYjoKICAgICB7CiAgICAgICBBUk1BQklJbmZvOjpBQklLaW5kIEtpbmQgPSBBUk1BQklJbmZvOjpBQVBDUzsKICAgICAgIGlmIChzdHJjbXAoZ2V0VGFyZ2V0KCkuZ2V0QUJJKCksICJhcGNzLWdudSIpID09IDApCkBAIC01NTcyLDcgKzYxOTgsNyBAQAogICAgIGJvb2wgSXNEYXJ3aW5WZWN0b3JBQkkgPSBUcmlwbGUuaXNPU0RhcndpbigpOwogICAgIGJvb2wgSXNTbWFsbFN0cnVjdEluUmVnQUJJID0KICAgICAgICAgWDg2XzMyVGFyZ2V0Q29kZUdlbkluZm86OmlzU3RydWN0UmV0dXJuSW5SZWdBQkkoVHJpcGxlLCBDb2RlR2VuT3B0cyk7Ci0gICAgYm9vbCBJc1dpbjMyRmxvYXRTdHJ1Y3RBQkkgPSAoVHJpcGxlLmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpXaW4zMik7CisgICAgYm9vbCBJc1dpbjMyRmxvYXRTdHJ1Y3RBQkkgPSBUcmlwbGUuaXNXaW5kb3dzTVNWQ0Vudmlyb25tZW50KCk7CiAKICAgICBpZiAoVHJpcGxlLmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpXaW4zMikgewogICAgICAgcmV0dXJuICooVGhlVGFyZ2V0Q29kZUdlbkluZm8gPQpAQCAtNTYxMCw3ICs2MjM2LDYgQEAKICAgY2FzZSBsbHZtOjpUcmlwbGU6OnNwYXJjdjk6CiAgICAgcmV0dXJuICooVGhlVGFyZ2V0Q29kZUdlbkluZm8gPSBuZXcgU3BhcmNWOVRhcmdldENvZGVHZW5JbmZvKFR5cGVzKSk7CiAgIGNhc2UgbGx2bTo6VHJpcGxlOjp4Y29yZToKLSAgICByZXR1cm4gKihUaGVUYXJnZXRDb2RlR2VuSW5mbyA9IG5ldyBYY29yZVRhcmdldENvZGVHZW5JbmZvKFR5cGVzKSk7Ci0KKyAgICByZXR1cm4gKihUaGVUYXJnZXRDb2RlR2VuSW5mbyA9IG5ldyBYQ29yZVRhcmdldENvZGVHZW5JbmZvKFR5cGVzKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9Db2RlR2VuL1RhcmdldEluZm8uaCBiL2xpYi9Db2RlR2VuL1RhcmdldEluZm8uaAppbmRleCBmNjMxZjMxLi42YzNhYjY0IDEwMDY0NAotLS0gYS9saWIvQ29kZUdlbi9UYXJnZXRJbmZvLmgKKysrIGIvbGliL0NvZGVHZW4vVGFyZ2V0SW5mby5oCkBAIC0xNyw4ICsxNyw4IEBACiAKICNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZS5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgogCiBuYW1lc3BhY2UgbGx2bSB7CiAgIGNsYXNzIENvbnN0YW50OwpAQCAtMTIzLDYgKzEyMywxMCBAQAogICAgICAgcmV0dXJuIFR5OwogICAgIH0KIAorICAgIC8vLyBkb2VzUmV0dXJuU2xvdEludGVyZmVyZVdpdGhBcmdzIC0gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCB1c2VzIGFuCisgICAgLy8vIGFyZ3VtZW50IHNsb3QgZm9yIGFuICdzcmV0JyB0eXBlLgorICAgIHZpcnR1YWwgYm9vbCBkb2VzUmV0dXJuU2xvdEludGVyZmVyZVdpdGhBcmdzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCiAgICAgLy8vIFJldHJpZXZlIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUKICAgICAvLy8gY2FsbGluZyBvYmpjX3JldGFpbkF1dG9yZWxlYXNlZFJldHVyblZhbHVlLiAgVGhlCiAgICAgLy8vIGltcGxlbWVudGF0aW9uIG9mIG9iamNfYXV0b3JlbGVhc2VSZXR1cm5WYWx1ZSBzbmlmZnMgdGhlCkBAIC0xNzYsNyArMTgwLDcgQEAKICAgICAvLy8gSG93ZXZlciwgc29tZSBwbGF0Zm9ybXMgbWFrZSB0aGUgY29udmVudGlvbnMgaWRlbnRpY2FsIGV4Y2VwdAogICAgIC8vLyBmb3IgcGFzc2luZyBhZGRpdGlvbmFsIG91dC1vZi1iYW5kIGluZm9ybWF0aW9uIHRvIGEgdmFyaWFkaWMKICAgICAvLy8gZnVuY3Rpb246IGZvciBleGFtcGxlLCB4ODYtNjQgcGFzc2VzIHRoZSBudW1iZXIgb2YgU1NFCi0gICAgLy8vIGFyZ3VtZW50cyBpbiAlYWwuICBPbiB0aGVzZSBwbGF0Zm9ybXMsIGl0IGlzIGRlc2lyZWFibGUgdG8KKyAgICAvLy8gYXJndW1lbnRzIGluICVhbC4gIE9uIHRoZXNlIHBsYXRmb3JtcywgaXQgaXMgZGVzaXJhYmxlIHRvCiAgICAgLy8vIGNhbGwgdW5wcm90b3R5cGVkIGZ1bmN0aW9ucyB1c2luZyB0aGUgdmFyaWFkaWMgY29udmVudGlvbiBzbwogICAgIC8vLyB0aGF0IHVucHJvdG90eXBlZCBjYWxscyB0byB2YXJhcmdzIGZ1bmN0aW9ucyBzdGlsbCBzdWNjZWVkLgogICAgIC8vLwpkaWZmIC0tZ2l0IGEvbGliL0RyaXZlci9BY3Rpb24uY3BwIGIvbGliL0RyaXZlci9BY3Rpb24uY3BwCmluZGV4IGRkZDJkNTkuLjg2YTQ4ZmQgMTAwNjQ0Ci0tLSBhL2xpYi9Ecml2ZXIvQWN0aW9uLmNwcAorKysgYi9saWIvRHJpdmVyL0FjdGlvbi5jcHAKQEAgLTMzLDcgKzMzLDggQEAKICAgY2FzZSBMaW5rSm9iQ2xhc3M6IHJldHVybiAibGlua2VyIjsKICAgY2FzZSBMaXBvSm9iQ2xhc3M6IHJldHVybiAibGlwbyI7CiAgIGNhc2UgRHN5bXV0aWxKb2JDbGFzczogcmV0dXJuICJkc3ltdXRpbCI7Ci0gIGNhc2UgVmVyaWZ5Sm9iQ2xhc3M6IHJldHVybiAidmVyaWZ5IjsKKyAgY2FzZSBWZXJpZnlEZWJ1Z0luZm9Kb2JDbGFzczogcmV0dXJuICJ2ZXJpZnktZGVidWctaW5mbyI7CisgIGNhc2UgVmVyaWZ5UENISm9iQ2xhc3M6IHJldHVybiAidmVyaWZ5LXBjaCI7CiAgIH0KIAogICBsbHZtX3VucmVhY2hhYmxlKCJpbnZhbGlkIGNsYXNzIik7CkBAIC0xMTcsNiArMTE4LDI5IEBACiAKIHZvaWQgVmVyaWZ5Sm9iQWN0aW9uOjphbmNob3IoKSB7fQogCi1WZXJpZnlKb2JBY3Rpb246OlZlcmlmeUpvYkFjdGlvbihBY3Rpb25MaXN0ICZJbnB1dHMsIHR5cGVzOjpJRCBUeXBlKQotICA6IEpvYkFjdGlvbihWZXJpZnlKb2JDbGFzcywgSW5wdXRzLCBUeXBlKSB7CitWZXJpZnlKb2JBY3Rpb246OlZlcmlmeUpvYkFjdGlvbihBY3Rpb25DbGFzcyBLaW5kLCBBY3Rpb24gKklucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM6OklEIFR5cGUpCisgICAgOiBKb2JBY3Rpb24oS2luZCwgSW5wdXQsIFR5cGUpIHsKKyAgYXNzZXJ0KChLaW5kID09IFZlcmlmeURlYnVnSW5mb0pvYkNsYXNzIHx8IEtpbmQgPT0gVmVyaWZ5UENISm9iQ2xhc3MpICYmCisgICAgICAgICAiQWN0aW9uQ2xhc3MgaXMgbm90IGEgdmFsaWQgVmVyaWZ5Sm9iQWN0aW9uIik7Cit9CisKK1ZlcmlmeUpvYkFjdGlvbjo6VmVyaWZ5Sm9iQWN0aW9uKEFjdGlvbkNsYXNzIEtpbmQsIEFjdGlvbkxpc3QgJklucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzOjpJRCBUeXBlKQorICAgIDogSm9iQWN0aW9uKEtpbmQsIElucHV0cywgVHlwZSkgeworICBhc3NlcnQoKEtpbmQgPT0gVmVyaWZ5RGVidWdJbmZvSm9iQ2xhc3MgfHwgS2luZCA9PSBWZXJpZnlQQ0hKb2JDbGFzcykgJiYKKyAgICAgICAgICAgIkFjdGlvbkNsYXNzIGlzIG5vdCBhIHZhbGlkIFZlcmlmeUpvYkFjdGlvbiIpOworfQorCit2b2lkIFZlcmlmeURlYnVnSW5mb0pvYkFjdGlvbjo6YW5jaG9yKCkge30KKworVmVyaWZ5RGVidWdJbmZvSm9iQWN0aW9uOjpWZXJpZnlEZWJ1Z0luZm9Kb2JBY3Rpb24oQWN0aW9uICpJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzOjpJRCBUeXBlKQorICAgIDogVmVyaWZ5Sm9iQWN0aW9uKFZlcmlmeURlYnVnSW5mb0pvYkNsYXNzLCBJbnB1dCwgVHlwZSkgeworfQorCit2b2lkIFZlcmlmeVBDSEpvYkFjdGlvbjo6YW5jaG9yKCkge30KKworVmVyaWZ5UENISm9iQWN0aW9uOjpWZXJpZnlQQ0hKb2JBY3Rpb24oQWN0aW9uICpJbnB1dCwgdHlwZXM6OklEIFR5cGUpCisgICAgOiBWZXJpZnlKb2JBY3Rpb24oVmVyaWZ5UENISm9iQ2xhc3MsIElucHV0LCBUeXBlKSB7CiB9CmRpZmYgLS1naXQgYS9saWIvRHJpdmVyL0FuZHJvaWQubWsgYi9saWIvRHJpdmVyL0FuZHJvaWQubWsKaW5kZXggZjg0YWVjNi4uNTU5Y2E4MyAxMDA2NDQKLS0tIGEvbGliL0RyaXZlci9BbmRyb2lkLm1rCisrKyBiL2xpYi9Ecml2ZXIvQW5kcm9pZC5tawpAQCAtNiw2ICs2LDcgQEAKIGluY2x1ZGUgJChDTEVBUl9UQkxHRU5fVkFSUykKIAogVEJMR0VOX1RBQkxFUyA6PSBcCisgIEF0dHJWaXNpdG9yLmluYyBcCiAgIERpYWdub3N0aWNDb21tb25LaW5kcy5pbmMgXAogICBEaWFnbm9zdGljRHJpdmVyS2luZHMuaW5jIFwKICAgRGlhZ25vc3RpY1NlbWFLaW5kcy5pbmMgXApAQCAtMjAsNiArMjEsNyBAQAogICBEcml2ZXIuY3BwIFwKICAgRHJpdmVyT3B0aW9ucy5jcHAgXAogICBKb2IuY3BwIFwKKyAgTXVsdGlsaWIuY3BwIFwKICAgUGhhc2VzLmNwcCBcCiAgIFNhbml0aXplckFyZ3MuY3BwIFwKICAgVG9vbC5jcHAgXApkaWZmIC0tZ2l0IGEvbGliL0RyaXZlci9DTWFrZUxpc3RzLnR4dCBiL2xpYi9Ecml2ZXIvQ01ha2VMaXN0cy50eHQKaW5kZXggMDE1MmIxOS4uZjJiZGFlZSAxMDA2NDQKLS0tIGEvbGliL0RyaXZlci9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvRHJpdmVyL0NNYWtlTGlzdHMudHh0CkBAIC0xLDMgKzEsOSBAQAorc2V0KExMVk1fTElOS19DT01QT05FTlRTCisgIE9wdGlvbgorICBTdXBwb3J0CisgIFRyYW5zZm9ybVV0aWxzCisgICkKKwogYWRkX2NsYW5nX2xpYnJhcnkoY2xhbmdEcml2ZXIKICAgQWN0aW9uLmNwcAogICBDQzFBc09wdGlvbnMuY3BwCkBAIC01LDYgKzExLDcgQEAKICAgRHJpdmVyLmNwcAogICBEcml2ZXJPcHRpb25zLmNwcAogICBKb2IuY3BwCisgIE11bHRpbGliLmNwcAogICBQaGFzZXMuY3BwCiAgIFNhbml0aXplckFyZ3MuY3BwCiAgIFRvb2wuY3BwCkBAIC0xMywxOCArMjAsMTEgQEAKICAgV2luZG93c1Rvb2xDaGFpbi5jcHAKICAgVG9vbHMuY3BwCiAgIFR5cGVzLmNwcAotICApCiAKLWFkZF9kZXBlbmRlbmNpZXMoY2xhbmdEcml2ZXIKLSAgQ2xhbmdBdHRyTGlzdAorICBERVBFTkRTCiAgIENsYW5nQ0MxQXNPcHRpb25zCi0gIENsYW5nRGlhZ25vc3RpY0NvbW1vbgotICBDbGFuZ0RpYWdub3N0aWNEcml2ZXIKICAgQ2xhbmdEcml2ZXJPcHRpb25zCi0gICkKIAotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNsYW5nRHJpdmVyCisgIExJTktfTElCUwogICBjbGFuZ0Jhc2ljCi0gIExMVk1PcHRpb24KLSAgTExWTVRyYW5zZm9ybVV0aWxzCiAgICkKZGlmZiAtLWdpdCBhL2xpYi9Ecml2ZXIvQ29tcGlsYXRpb24uY3BwIGIvbGliL0RyaXZlci9Db21waWxhdGlvbi5jcHAKaW5kZXggZjA3N2ZkNi4uYTIwYTJiZCAxMDA2NDQKLS0tIGEvbGliL0RyaXZlci9Db21waWxhdGlvbi5jcHAKKysrIGIvbGliL0RyaXZlci9Db21waWxhdGlvbi5jcHAKQEAgLTcwLDggKzcwLDYgQEAKIH0KIAogYm9vbCBDb21waWxhdGlvbjo6Q2xlYW51cEZpbGUoY29uc3QgY2hhciAqRmlsZSwgYm9vbCBJc3N1ZUVycm9ycykgY29uc3QgewotICBzdGQ6OnN0cmluZyBQKEZpbGUpOwotCiAgIC8vIEZJWE1FOiBXaHkgYXJlIHdlIHRyeWluZyB0byByZW1vdmUgZmlsZXMgdGhhdCB3ZSBoYXZlIG5vdCBjcmVhdGVkPyBGb3IKICAgLy8gZXhhbXBsZSB3ZSBzaG91bGQgb25seSB0cnkgdG8gcmVtb3ZlIGEgdGVtcG9yYXJ5IGFzc2VtYmx5IGZpbGUgaWYKICAgLy8gImNsYW5nIC1jYzEiIHN1Y2NlZWQgaW4gd3JpdGluZyBpdC4gV2FzIHRoaXMgYSB3b3JrYXJvdW5kIGZvciB3aGVuCkBAIC0xMzcsNyArMTM1LDggQEAKICAgICBpZiAoZ2V0RHJpdmVyKCkuQ0NQcmludE9wdGlvbnMgJiYgZ2V0RHJpdmVyKCkuQ0NQcmludE9wdGlvbnNGaWxlbmFtZSkgewogICAgICAgc3RkOjpzdHJpbmcgRXJyb3I7CiAgICAgICBPUyA9IG5ldyBsbHZtOjpyYXdfZmRfb3N0cmVhbShnZXREcml2ZXIoKS5DQ1ByaW50T3B0aW9uc0ZpbGVuYW1lLCBFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6OkZfQXBwZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6OkZfQXBwZW5kIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpzeXM6OmZzOjpGX1RleHQpOwogICAgICAgaWYgKCFFcnJvci5lbXB0eSgpKSB7CiAgICAgICAgIGdldERyaXZlcigpLkRpYWcoY2xhbmc6OmRpYWc6OmVycl9kcnZfY2NfcHJpbnRfb3B0aW9uc19mYWlsdXJlKQogICAgICAgICAgIDw8IEVycm9yOwpkaWZmIC0tZ2l0IGEvbGliL0RyaXZlci9Ecml2ZXIuY3BwIGIvbGliL0RyaXZlci9Ecml2ZXIuY3BwCmluZGV4IDUzMDc5MTAuLjMxN2I4MjIgMTAwNjQ0Ci0tLSBhL2xpYi9Ecml2ZXIvRHJpdmVyLmNwcAorKysgYi9saWIvRHJpdmVyL0RyaXZlci5jcHAKQEAgLTE5LDE1ICsxOSwxNCBAQAogI2luY2x1ZGUgImNsYW5nL0RyaXZlci9Ub29sLmgiCiAjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL1Rvb2xDaGFpbi5oIgogI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgiCiAjaW5jbHVkZSAibGx2bS9PcHRpb24vQXJnLmgiCiAjaW5jbHVkZSAibGx2bS9PcHRpb24vQXJnTGlzdC5oIgorI2luY2x1ZGUgImxsdm0vT3B0aW9uL09wdFNwZWNpZmllci5oIgogI2luY2x1ZGUgImxsdm0vT3B0aW9uL09wdFRhYmxlLmgiCiAjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0aW9uLmgiCi0jaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0U3BlY2lmaWVyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgpAQCAtMzYsNiArMzUsNyBAQAogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qcm9ncmFtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogLy8gRklYTUU6IEl0IHdvdWxkIHByZXZlbnQgdXMgZnJvbSBpbmNsdWRpbmcgbGx2bS1jb25maWcuaAogLy8gaWYgY29uZmlnLmggd2VyZSBpbmNsdWRlZCBiZWZvcmUgc3lzdGVtX2Vycm9yLmguCkBAIC03NywxMCArNzcsNyBAQAogRHJpdmVyOjp+RHJpdmVyKCkgewogICBkZWxldGUgT3B0czsKIAotICBmb3IgKGxsdm06OlN0cmluZ01hcDxUb29sQ2hhaW4gKj46Oml0ZXJhdG9yIEkgPSBUb29sQ2hhaW5zLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IFRvb2xDaGFpbnMuZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpCi0gICAgZGVsZXRlIEktPnNlY29uZDsKKyAgbGx2bTo6RGVsZXRlQ29udGFpbmVyU2Vjb25kcyhUb29sQ2hhaW5zKTsKIH0KIAogdm9pZCBEcml2ZXI6OlBhcnNlRHJpdmVyTW9kZShBcnJheVJlZjxjb25zdCBjaGFyICo+IEFyZ3MpIHsKQEAgLTExMiw3ICsxMDksNyBAQAogCiAgIHVuc2lnbmVkIEluY2x1ZGVkRmxhZ3NCaXRtYXNrOwogICB1bnNpZ25lZCBFeGNsdWRlZEZsYWdzQml0bWFzazsKLSAgbGx2bTo6dGllKEluY2x1ZGVkRmxhZ3NCaXRtYXNrLCBFeGNsdWRlZEZsYWdzQml0bWFzaykgPQorICBzdGQ6OnRpZShJbmNsdWRlZEZsYWdzQml0bWFzaywgRXhjbHVkZWRGbGFnc0JpdG1hc2spID0KICAgICBnZXRJbmNsdWRlRXhjbHVkZU9wdGlvbkZsYWdNYXNrcygpOwogCiAgIHVuc2lnbmVkIE1pc3NpbmdBcmdJbmRleCwgTWlzc2luZ0FyZ0NvdW50OwpAQCAtMTU5LDE1ICsxNTYsMTcgQEAKICAgQXJnICpQaGFzZUFyZyA9IDA7CiAgIHBoYXNlczo6SUQgRmluYWxQaGFzZTsKIAotICAvLyAte0UsTSxNTX0gb25seSBydW4gdGhlIHByZXByb2Nlc3Nvci4KKyAgLy8gLXtFLE0sTU19IGFuZCAvUCBvbmx5IHJ1biB0aGUgcHJlcHJvY2Vzc29yLgogICBpZiAoQ0NDSXNDUFAoKSB8fAogICAgICAgKFBoYXNlQXJnID0gREFMLmdldExhc3RBcmcob3B0aW9uczo6T1BUX0UpKSB8fAotICAgICAgKFBoYXNlQXJnID0gREFMLmdldExhc3RBcmcob3B0aW9uczo6T1BUX00sIG9wdGlvbnM6Ok9QVF9NTSkpKSB7CisgICAgICAoUGhhc2VBcmcgPSBEQUwuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfTSwgb3B0aW9uczo6T1BUX01NKSkgfHwKKyAgICAgIChQaGFzZUFyZyA9IERBTC5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9fU0xBU0hfUCkpKSB7CiAgICAgRmluYWxQaGFzZSA9IHBoYXNlczo6UHJlcHJvY2VzczsKIAogICAgIC8vIC17ZnN5bnRheC1vbmx5LC1hbmFseXplLGVtaXQtYXN0LFN9IG9ubHkgcnVuIHVwIHRvIHRoZSBjb21waWxlci4KICAgfSBlbHNlIGlmICgoUGhhc2VBcmcgPSBEQUwuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfZnN5bnRheF9vbmx5KSkgfHwKICAgICAgICAgICAgICAoUGhhc2VBcmcgPSBEQUwuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfbW9kdWxlX2ZpbGVfaW5mbykpIHx8CisgICAgICAgICAgICAgKFBoYXNlQXJnID0gREFMLmdldExhc3RBcmcob3B0aW9uczo6T1BUX3ZlcmlmeV9wY2gpKSB8fAogICAgICAgICAgICAgIChQaGFzZUFyZyA9IERBTC5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9yZXdyaXRlX29iamMpKSB8fAogICAgICAgICAgICAgIChQaGFzZUFyZyA9IERBTC5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9yZXdyaXRlX2xlZ2FjeV9vYmpjKSkgfHwKICAgICAgICAgICAgICAoUGhhc2VBcmcgPSBEQUwuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfX21pZ3JhdGUpKSB8fApAQCAtMzM2LDkgKzMzNSwxMCBAQAogICAvLyBGSVhNRTogRGVmYXVsdFRhcmdldFRyaXBsZSBpcyB1c2VkIGJ5IHRoZSB0YXJnZXQtcHJlZml4ZWQgY2FsbHMgdG8gYXMvbGQKICAgLy8gYW5kIGdldFRvb2xDaGFpbiBpcyBjb25zdC4KICAgaWYgKElzQ0xNb2RlKCkpIHsKLSAgICAvLyBjbGFuZy1jbCB0YXJnZXRzIFdpbjMyLgorICAgIC8vIGNsYW5nLWNsIHRhcmdldHMgTVNWQy1zdHlsZSBXaW4zMi4KICAgICBsbHZtOjpUcmlwbGUgVChEZWZhdWx0VGFyZ2V0VHJpcGxlKTsKLSAgICBULnNldE9TTmFtZShsbHZtOjpUcmlwbGU6OmdldE9TVHlwZU5hbWUobGx2bTo6VHJpcGxlOjpXaW4zMikpOworICAgIFQuc2V0T1MobGx2bTo6VHJpcGxlOjpXaW4zMik7CisgICAgVC5zZXRFbnZpcm9ubWVudChsbHZtOjpUcmlwbGU6Ok1TVkMpOwogICAgIERlZmF1bHRUYXJnZXRUcmlwbGUgPSBULnN0cigpOwogICB9CiAgIGlmIChjb25zdCBBcmcgKkEgPSBBcmdzLT5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF90YXJnZXQpKQpAQCAtMzc4LDggKzM3OCw4IEBACiAgIEJ1aWxkSW5wdXRzKEMtPmdldERlZmF1bHRUb29sQ2hhaW4oKSwgKlRyYW5zbGF0ZWRBcmdzLCBJbnB1dHMpOwogCiAgIC8vIENvbnN0cnVjdCB0aGUgbGlzdCBvZiBhYnN0cmFjdCBhY3Rpb25zIHRvIHBlcmZvcm0gZm9yIHRoaXMgY29tcGlsYXRpb24uIE9uCi0gIC8vIERhcndpbiB0YXJnZXQgT1NlcyB0aGlzIHVzZXMgdGhlIGRyaXZlci1kcml2ZXIgYW5kIHVuaXZlcnNhbCBhY3Rpb25zLgotICBpZiAoVEMuZ2V0VHJpcGxlKCkuaXNPU0RhcndpbigpKQorICAvLyBNYWNoTyB0YXJnZXRzIHRoaXMgdXNlcyB0aGUgZHJpdmVyLWRyaXZlciBhbmQgdW5pdmVyc2FsIGFjdGlvbnMuCisgIGlmIChUQy5nZXRUcmlwbGUoKS5pc09TQmluRm9ybWF0TWFjaE8oKSkKICAgICBCdWlsZFVuaXZlcnNhbEFjdGlvbnMoQy0+Z2V0RGVmYXVsdFRvb2xDaGFpbigpLCBDLT5nZXRBcmdzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0cywgQy0+Z2V0QWN0aW9ucygpKTsKICAgZWxzZQpAQCAtNDkxLDcgKzQ5MSw3IEBACiAgIC8vIENvbnN0cnVjdCB0aGUgbGlzdCBvZiBhYnN0cmFjdCBhY3Rpb25zIHRvIHBlcmZvcm0gZm9yIHRoaXMgY29tcGlsYXRpb24uIE9uCiAgIC8vIERhcndpbiBPU2VzIHRoaXMgdXNlcyB0aGUgZHJpdmVyLWRyaXZlciBhbmQgYnVpbGRzIHVuaXZlcnNhbCBhY3Rpb25zLgogICBjb25zdCBUb29sQ2hhaW4gJlRDID0gQy5nZXREZWZhdWx0VG9vbENoYWluKCk7Ci0gIGlmIChUQy5nZXRUcmlwbGUoKS5pc09TRGFyd2luKCkpCisgIGlmIChUQy5nZXRUcmlwbGUoKS5pc09TQmluRm9ybWF0TWFjaE8oKSkKICAgICBCdWlsZFVuaXZlcnNhbEFjdGlvbnMoVEMsIEMuZ2V0QXJncygpLCBJbnB1dHMsIEMuZ2V0QWN0aW9ucygpKTsKICAgZWxzZQogICAgIEJ1aWxkQWN0aW9ucyhUQywgQy5nZXRBcmdzKCksIElucHV0cywgQy5nZXRBY3Rpb25zKCkpOwpAQCAtNTIzLDggKzUyMyw3IEBACiAgICAgICBzdGQ6OnN0cmluZyBFcnI7CiAgICAgICBzdGQ6OnN0cmluZyBTY3JpcHQgPSBTdHJpbmdSZWYoKml0KS5yc3BsaXQoJy4nKS5maXJzdDsKICAgICAgIFNjcmlwdCArPSAiLnNoIjsKLSAgICAgIGxsdm06OnJhd19mZF9vc3RyZWFtIFNjcmlwdE9TKAotICAgICAgICAgIFNjcmlwdC5jX3N0cigpLCBFcnIsIGxsdm06OnN5czo6ZnM6OkZfRXhjbCB8IGxsdm06OnN5czo6ZnM6OkZfQmluYXJ5KTsKKyAgICAgIGxsdm06OnJhd19mZF9vc3RyZWFtIFNjcmlwdE9TKFNjcmlwdC5jX3N0cigpLCBFcnIsIGxsdm06OnN5czo6ZnM6OkZfRXhjbCk7CiAgICAgICBpZiAoIUVyci5lbXB0eSgpKSB7CiAgICAgICAgIERpYWcoY2xhbmc6OmRpYWc6Om5vdGVfZHJ2X2NvbW1hbmRfZmFpbGVkX2RpYWdfbXNnKQogICAgICAgICAgIDw8ICJFcnJvciBnZW5lcmF0aW5nIHJ1biBzY3JpcHQ6ICIgKyBTY3JpcHQgKyAiICIgKyBFcnI7CkBAIC02MjEsNyArNjIwLDcgQEAKIHZvaWQgRHJpdmVyOjpQcmludEhlbHAoYm9vbCBTaG93SGlkZGVuKSBjb25zdCB7CiAgIHVuc2lnbmVkIEluY2x1ZGVkRmxhZ3NCaXRtYXNrOwogICB1bnNpZ25lZCBFeGNsdWRlZEZsYWdzQml0bWFzazsKLSAgbGx2bTo6dGllKEluY2x1ZGVkRmxhZ3NCaXRtYXNrLCBFeGNsdWRlZEZsYWdzQml0bWFzaykgPQorICBzdGQ6OnRpZShJbmNsdWRlZEZsYWdzQml0bWFzaywgRXhjbHVkZWRGbGFnc0JpdG1hc2spID0KICAgICBnZXRJbmNsdWRlRXhjbHVkZU9wdGlvbkZsYWdNYXNrcygpOwogCiAgIEV4Y2x1ZGVkRmxhZ3NCaXRtYXNrIHw9IG9wdGlvbnM6Ok5vRHJpdmVyT3B0aW9uOwpAQCAtNzQ2LDU0ICs3NDUsMzcgQEAKICAgfQogCiAgIGlmIChDLmdldEFyZ3MoKS5oYXNBcmcob3B0aW9uczo6T1BUX3ByaW50X211bHRpX2xpYikpIHsKLSAgICAvLyBGSVhNRTogV2UgbmVlZCB0b29sIGNoYWluIHN1cHBvcnQgZm9yIHRoaXMuCi0gICAgbGx2bTo6b3V0cygpIDw8ICIuO1xuIjsKKyAgICBjb25zdCBNdWx0aWxpYlNldCAmTXVsdGlsaWJzID0gVEMuZ2V0TXVsdGlsaWJzKCk7CiAKLSAgICBzd2l0Y2ggKEMuZ2V0RGVmYXVsdFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLmdldEFyY2goKSkgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgbGx2bTo6VHJpcGxlOjp4ODZfNjQ6Ci0gICAgICBsbHZtOjpvdXRzKCkgPDwgIng4Nl82NDtAbTY0IiA8PCAiXG4iOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGxsdm06OlRyaXBsZTo6cHBjNjQ6Ci0gICAgICBsbHZtOjpvdXRzKCkgPDwgInBwYzY0O0BtNjQiIDw8ICJcbiI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpwcGM2NGxlOgotICAgICAgbGx2bTo6b3V0cygpIDw8ICJwcGM2NGxlO0BtNjQiIDw8ICJcbiI7Ci0gICAgICBicmVhazsKKyAgICBmb3IgKE11bHRpbGliU2V0Ojpjb25zdF9pdGVyYXRvciBJID0gTXVsdGlsaWJzLmJlZ2luKCksIEUgPSBNdWx0aWxpYnMuZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgbGx2bTo6b3V0cygpIDw8ICpJIDw8ICJcbiI7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIC8vIEZJWE1FOiBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcHJpbnQtbXVsdGktZGlyZWN0b3J5IGFuZAotICAvLyBwcmludC1tdWx0aS1vcy1kaXJlY3Rvcnk/Ci0gIGlmIChDLmdldEFyZ3MoKS5oYXNBcmcob3B0aW9uczo6T1BUX3ByaW50X211bHRpX2RpcmVjdG9yeSkgfHwKLSAgICAgIEMuZ2V0QXJncygpLmhhc0FyZyhvcHRpb25zOjpPUFRfcHJpbnRfbXVsdGlfb3NfZGlyZWN0b3J5KSkgewotICAgIHN3aXRjaCAoQy5nZXREZWZhdWx0VG9vbENoYWluKCkuZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpKSB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2OgotICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpwcGM6Ci0gICAgICBsbHZtOjpvdXRzKCkgPDwgIi4iIDw8ICJcbiI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgbGx2bTo6VHJpcGxlOjp4ODZfNjQ6Ci0gICAgICBsbHZtOjpvdXRzKCkgPDwgIng4Nl82NCIgPDwgIlxuIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsbHZtOjpUcmlwbGU6OnBwYzY0OgotICAgICAgbGx2bTo6b3V0cygpIDw8ICJwcGM2NCIgPDwgIlxuIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBsbHZtOjpUcmlwbGU6OnBwYzY0bGU6Ci0gICAgICBsbHZtOjpvdXRzKCkgPDwgInBwYzY0bGUiIDw8ICJcbiI7Ci0gICAgICBicmVhazsKKyAgaWYgKEMuZ2V0QXJncygpLmhhc0FyZyhvcHRpb25zOjpPUFRfcHJpbnRfbXVsdGlfZGlyZWN0b3J5KSkgeworICAgIGNvbnN0IE11bHRpbGliU2V0ICZNdWx0aWxpYnMgPSBUQy5nZXRNdWx0aWxpYnMoKTsKKyAgICBmb3IgKE11bHRpbGliU2V0Ojpjb25zdF9pdGVyYXRvciBJID0gTXVsdGlsaWJzLmJlZ2luKCksIEUgPSBNdWx0aWxpYnMuZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKEktPmdjY1N1ZmZpeCgpLmVtcHR5KCkpCisgICAgICAgIGxsdm06Om91dHMoKSA8PCAiLlxuIjsKKyAgICAgIGVsc2UgeworICAgICAgICBTdHJpbmdSZWYgU3VmZml4KEktPmdjY1N1ZmZpeCgpKTsKKyAgICAgICAgYXNzZXJ0KFN1ZmZpeC5mcm9udCgpID09ICcvJyk7CisgICAgICAgIGxsdm06Om91dHMoKSA8PCBTdWZmaXguc3Vic3RyKDEpIDw8ICJcbiI7CisgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfQogCisgIGlmIChDLmdldEFyZ3MoKS5oYXNBcmcob3B0aW9uczo6T1BUX3ByaW50X211bHRpX29zX2RpcmVjdG9yeSkpIHsKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgcHJpbnQgb3V0ICJsaWIvLi4vbGliIiwgImxpYi8uLi9saWI2NCIsIG9yCisgICAgLy8gImxpYi8uLi9saWIzMiIgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSB0b29sY2hhaW4uIEZvciBub3csIHByaW50CisgICAgLy8gbm90aGluZyBiZWNhdXNlIGl0J3Mgbm90IHN1cHBvcnRlZCB5ZXQuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTg2Nyw3ICs4NDksNyBAQAogICAgICAgLy8gVmFsaWRhdGUgdGhlIG9wdGlvbiBoZXJlOyB3ZSBkb24ndCBzYXZlIHRoZSB0eXBlIGhlcmUgYmVjYXVzZSBpdHMKICAgICAgIC8vIHBhcnRpY3VsYXIgc3BlbGxpbmcgbWF5IHBhcnRpY2lwYXRlIGluIG90aGVyIGRyaXZlciBjaG9pY2VzLgogICAgICAgbGx2bTo6VHJpcGxlOjpBcmNoVHlwZSBBcmNoID0KLSAgICAgICAgdG9vbHM6OmRhcndpbjo6Z2V0QXJjaFR5cGVGb3JEYXJ3aW5BcmNoTmFtZShBLT5nZXRWYWx1ZSgpKTsKKyAgICAgICAgdG9vbHM6OmRhcndpbjo6Z2V0QXJjaFR5cGVGb3JNYWNoT0FyY2hOYW1lKEEtPmdldFZhbHVlKCkpOwogICAgICAgaWYgKEFyY2ggPT0gbGx2bTo6VHJpcGxlOjpVbmtub3duQXJjaCkgewogICAgICAgICBEaWFnKGNsYW5nOjpkaWFnOjplcnJfZHJ2X2ludmFsaWRfYXJjaF9uYW1lKQogICAgICAgICAgIDw8IEEtPmdldEFzU3RyaW5nKEFyZ3MpOwpAQCAtOTM0LDEzICs5MTYsMTIgQEAKICAgICAgICAgQWN0aW9ucy5wdXNoX2JhY2sobmV3IERzeW11dGlsSm9iQWN0aW9uKElucHV0cywgdHlwZXM6OlRZX2RTWU0pKTsKICAgICAgIH0KIAotICAgICAgLy8gVmVyaWZ5IHRoZSBvdXRwdXQgKGRlYnVnIGluZm9ybWF0aW9uIG9ubHkpIGlmIHdlIHBhc3NlZCAnLXZlcmlmeScuCi0gICAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3ZlcmlmeSkpIHsKLSAgICAgICAgQWN0aW9uTGlzdCBWZXJpZnlJbnB1dHM7Ci0gICAgICAgIFZlcmlmeUlucHV0cy5wdXNoX2JhY2soQWN0aW9ucy5iYWNrKCkpOworICAgICAgLy8gVmVyaWZ5IHRoZSBkZWJ1ZyBpbmZvIG91dHB1dC4KKyAgICAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfdmVyaWZ5X2RlYnVnX2luZm8pKSB7CisgICAgICAgIEFjdGlvbiAqVmVyaWZ5SW5wdXQgPSBBY3Rpb25zLmJhY2soKTsKICAgICAgICAgQWN0aW9ucy5wb3BfYmFjaygpOwotICAgICAgICBBY3Rpb25zLnB1c2hfYmFjayhuZXcgVmVyaWZ5Sm9iQWN0aW9uKFZlcmlmeUlucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlczo6VFlfTm90aGluZykpOworICAgICAgICBBY3Rpb25zLnB1c2hfYmFjayhuZXcgVmVyaWZ5RGVidWdJbmZvSm9iQWN0aW9uKFZlcmlmeUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzOjpUWV9Ob3RoaW5nKSk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC05NDgsNyArOTI5LDcgQEAKIAogLy8vIFxicmllZiBDaGVjayB0aGF0IHRoZSBmaWxlIHJlZmVyZW5jZWQgYnkgVmFsdWUgZXhpc3RzLiBJZiBpdCBkb2Vzbid0LAogLy8vIGlzc3VlIGEgZGlhZ25vc3RpYyBhbmQgcmV0dXJuIGZhbHNlLgotc3RhdGljIGJvb2wgRGlhZ25vc2VJbnB1dEV4aXN0YW5jZShjb25zdCBEcml2ZXIgJkQsIGNvbnN0IERlcml2ZWRBcmdMaXN0ICZBcmdzLAorc3RhdGljIGJvb2wgRGlhZ25vc2VJbnB1dEV4aXN0ZW5jZShjb25zdCBEcml2ZXIgJkQsIGNvbnN0IERlcml2ZWRBcmdMaXN0ICZBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFsdWUpIHsKICAgaWYgKCFELmdldENoZWNrSW5wdXRzRXhpc3QoKSkKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEwMjksNyArMTAxMCw4IEBACiAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGVtaXQgYW4gZXJyb3IgYnV0IHN0aWxsIHVzZSBhIHZhbGlkIHR5cGUgdG8gYXZvaWQKICAgICAgICAgICAvLyBzcHVyaW91cyBlcnJvcnMgKGUuZy4sIG5vIGlucHV0cykuCiAgICAgICAgICAgaWYgKCFBcmdzLmhhc0FyZ05vQ2xhaW0ob3B0aW9uczo6T1BUX0UpICYmICFDQ0NJc0NQUCgpKQotICAgICAgICAgICAgRGlhZyhjbGFuZzo6ZGlhZzo6ZXJyX2Rydl91bmtub3duX3N0ZGluX3R5cGUpOworICAgICAgICAgICAgRGlhZyhJc0NMTW9kZSgpID8gY2xhbmc6OmRpYWc6OmVycl9kcnZfdW5rbm93bl9zdGRpbl90eXBlX2NsYW5nX2NsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjbGFuZzo6ZGlhZzo6ZXJyX2Rydl91bmtub3duX3N0ZGluX3R5cGUpOwogICAgICAgICAgIFR5ID0gdHlwZXM6OlRZX0M7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGxvb2t1cCBieSBleHRlbnNpb24uCkBAIC0xMDc1LDE5ICsxMDU3LDE5IEBACiAgICAgICAgIFR5ID0gSW5wdXRUeXBlOwogICAgICAgfQogCi0gICAgICBpZiAoRGlhZ25vc2VJbnB1dEV4aXN0YW5jZSgqdGhpcywgQXJncywgVmFsdWUpKQorICAgICAgaWYgKERpYWdub3NlSW5wdXRFeGlzdGVuY2UoKnRoaXMsIEFyZ3MsIFZhbHVlKSkKICAgICAgICAgSW5wdXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihUeSwgQSkpOwogCiAgICAgfSBlbHNlIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9fU0xBU0hfVGMpKSB7CiAgICAgICBTdHJpbmdSZWYgVmFsdWUgPSBBLT5nZXRWYWx1ZSgpOwotICAgICAgaWYgKERpYWdub3NlSW5wdXRFeGlzdGFuY2UoKnRoaXMsIEFyZ3MsIFZhbHVlKSkgeworICAgICAgaWYgKERpYWdub3NlSW5wdXRFeGlzdGVuY2UoKnRoaXMsIEFyZ3MsIFZhbHVlKSkgewogICAgICAgICBBcmcgKklucHV0QXJnID0gTWFrZUlucHV0QXJnKEFyZ3MsIE9wdHMsIEEtPmdldFZhbHVlKCkpOwogICAgICAgICBJbnB1dHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKHR5cGVzOjpUWV9DLCBJbnB1dEFyZykpOwogICAgICAgfQogICAgICAgQS0+Y2xhaW0oKTsKICAgICB9IGVsc2UgaWYgKEEtPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX19TTEFTSF9UcCkpIHsKICAgICAgIFN0cmluZ1JlZiBWYWx1ZSA9IEEtPmdldFZhbHVlKCk7Ci0gICAgICBpZiAoRGlhZ25vc2VJbnB1dEV4aXN0YW5jZSgqdGhpcywgQXJncywgVmFsdWUpKSB7CisgICAgICBpZiAoRGlhZ25vc2VJbnB1dEV4aXN0ZW5jZSgqdGhpcywgQXJncywgVmFsdWUpKSB7CiAgICAgICAgIEFyZyAqSW5wdXRBcmcgPSBNYWtlSW5wdXRBcmcoQXJncywgT3B0cywgQS0+Z2V0VmFsdWUoKSk7CiAgICAgICAgIElucHV0cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIodHlwZXM6OlRZX0NYWCwgSW5wdXRBcmcpKTsKICAgICAgIH0KQEAgLTExNzcsNyArMTE1OSw3IEBACiAKICAgLy8gQ29uc3RydWN0IHRoZSBhY3Rpb25zIHRvIHBlcmZvcm0uCiAgIEFjdGlvbkxpc3QgTGlua2VySW5wdXRzOwotICBBY3Rpb25MaXN0IFNwbGl0SW5wdXRzOworCiAgIGxsdm06OlNtYWxsVmVjdG9yPHBoYXNlczo6SUQsIHBoYXNlczo6TWF4TnVtYmVyT2ZQaGFzZXM+IFBMOwogICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5wdXRzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKICAgICB0eXBlczo6SUQgSW5wdXRUeXBlID0gSW5wdXRzW2ldLmZpcnN0OwpAQCAtMTIxMSwxOCArMTE5MywxOCBAQAogICAgICAgICBEaWFnKGNsYW5nOjpkaWFnOjp3YXJuX2Rydl9wcmVwcm9jZXNzZWRfaW5wdXRfZmlsZV91bnVzZWQpCiAgICAgICAgICAgPDwgSW5wdXRBcmctPmdldEFzU3RyaW5nKEFyZ3MpCiAgICAgICAgICAgPDwgISFGaW5hbFBoYXNlQXJnCi0gICAgICAgICAgPDwgRmluYWxQaGFzZUFyZyA/IEZpbmFsUGhhc2VBcmctPmdldE9wdGlvbigpLmdldE5hbWUoKSA6ICIiOworICAgICAgICAgIDw8IChGaW5hbFBoYXNlQXJnID8gRmluYWxQaGFzZUFyZy0+Z2V0T3B0aW9uKCkuZ2V0TmFtZSgpIDogIiIpOwogICAgICAgZWxzZQogICAgICAgICBEaWFnKGNsYW5nOjpkaWFnOjp3YXJuX2Rydl9pbnB1dF9maWxlX3VudXNlZCkKICAgICAgICAgICA8PCBJbnB1dEFyZy0+Z2V0QXNTdHJpbmcoQXJncykKICAgICAgICAgICA8PCBnZXRQaGFzZU5hbWUoSW5pdGlhbFBoYXNlKQogICAgICAgICAgIDw8ICEhRmluYWxQaGFzZUFyZwotICAgICAgICAgIDw8IEZpbmFsUGhhc2VBcmcgPyBGaW5hbFBoYXNlQXJnLT5nZXRPcHRpb24oKS5nZXROYW1lKCkgOiAiIjsKKyAgICAgICAgICA8PCAoRmluYWxQaGFzZUFyZyA/IEZpbmFsUGhhc2VBcmctPmdldE9wdGlvbigpLmdldE5hbWUoKSA6ICIiKTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIAogICAgIC8vIEJ1aWxkIHRoZSBwaXBlbGluZSBmb3IgdGhpcyBmaWxlLgotICAgIE93bmluZ1B0cjxBY3Rpb24+IEN1cnJlbnQobmV3IElucHV0QWN0aW9uKCpJbnB1dEFyZywgSW5wdXRUeXBlKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEFjdGlvbj4gQ3VycmVudChuZXcgSW5wdXRBY3Rpb24oKklucHV0QXJnLCBJbnB1dFR5cGUpKTsKICAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxwaGFzZXM6OklEPjo6aXRlcmF0b3IKICAgICAgICAgICAgaSA9IFBMLmJlZ2luKCksIGUgPSBQTC5lbmQoKTsgaSAhPSBlOyArK2kpIHsKICAgICAgIHBoYXNlczo6SUQgUGhhc2UgPSAqaTsKQEAgLTEyMzQsNyArMTIxNiw3IEBACiAgICAgICAvLyBRdWV1ZSBsaW5rZXIgaW5wdXRzLgogICAgICAgaWYgKFBoYXNlID09IHBoYXNlczo6TGluaykgewogICAgICAgICBhc3NlcnQoKGkgKyAxKSA9PSBlICYmICJsaW5raW5nIG11c3QgYmUgZmluYWwgY29tcGlsYXRpb24gc3RlcC4iKTsKLSAgICAgICAgTGlua2VySW5wdXRzLnB1c2hfYmFjayhDdXJyZW50LnRha2UoKSk7CisgICAgICAgIExpbmtlcklucHV0cy5wdXNoX2JhY2soQ3VycmVudC5yZWxlYXNlKCkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KIApAQCAtMTI0NSwxNCArMTIyNywxNCBAQAogICAgICAgICBjb250aW51ZTsKIAogICAgICAgLy8gT3RoZXJ3aXNlIGNvbnN0cnVjdCB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uLgotICAgICAgQ3VycmVudC5yZXNldChDb25zdHJ1Y3RQaGFzZUFjdGlvbihBcmdzLCBQaGFzZSwgQ3VycmVudC50YWtlKCkpKTsKKyAgICAgIEN1cnJlbnQucmVzZXQoQ29uc3RydWN0UGhhc2VBY3Rpb24oQXJncywgUGhhc2UsIEN1cnJlbnQucmVsZWFzZSgpKSk7CiAgICAgICBpZiAoQ3VycmVudC0+Z2V0VHlwZSgpID09IHR5cGVzOjpUWV9Ob3RoaW5nKQogICAgICAgICBicmVhazsKICAgICB9CiAKICAgICAvLyBJZiB3ZSBlbmRlZCB3aXRoIHNvbWV0aGluZywgYWRkIHRvIHRoZSBvdXRwdXQgbGlzdC4KICAgICBpZiAoQ3VycmVudCkKLSAgICAgIEFjdGlvbnMucHVzaF9iYWNrKEN1cnJlbnQudGFrZSgpKTsKKyAgICAgIEFjdGlvbnMucHVzaF9iYWNrKEN1cnJlbnQucmVsZWFzZSgpKTsKICAgfQogCiAgIC8vIEFkZCBhIGxpbmsgYWN0aW9uIGlmIG5lY2Vzc2FyeS4KQEAgLTEzMTQsNiArMTI5Niw4IEBACiAgICAgICByZXR1cm4gbmV3IENvbXBpbGVKb2JBY3Rpb24oSW5wdXQsIHR5cGVzOjpUWV9BU1QpOwogICAgIH0gZWxzZSBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX21vZHVsZV9maWxlX2luZm8pKSB7CiAgICAgICByZXR1cm4gbmV3IENvbXBpbGVKb2JBY3Rpb24oSW5wdXQsIHR5cGVzOjpUWV9Nb2R1bGVGaWxlKTsKKyAgICB9IGVsc2UgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF92ZXJpZnlfcGNoKSkgeworICAgICAgcmV0dXJuIG5ldyBWZXJpZnlQQ0hKb2JBY3Rpb24oSW5wdXQsIHR5cGVzOjpUWV9Ob3RoaW5nKTsKICAgICB9IGVsc2UgaWYgKElzVXNpbmdMVE8oQXJncykpIHsKICAgICAgIHR5cGVzOjpJRCBPdXRwdXQgPQogICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfUykgPyB0eXBlczo6VFlfTFRPX0lSIDogdHlwZXM6OlRZX0xUT19CQzsKQEAgLTEzNjIsNyArMTM0Niw3IEBACiAKICAgLy8gQ29sbGVjdCB0aGUgbGlzdCBvZiBhcmNoaXRlY3R1cmVzLgogICBsbHZtOjpTdHJpbmdTZXQ8PiBBcmNoTmFtZXM7Ci0gIGlmIChDLmdldERlZmF1bHRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKS5pc09TRGFyd2luKCkpIHsKKyAgaWYgKEMuZ2V0RGVmYXVsdFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLmlzT1NCaW5Gb3JtYXRNYWNoTygpKSB7CiAgICAgZm9yIChBcmdMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IEMuZ2V0QXJncygpLmJlZ2luKCksIGllID0gQy5nZXRBcmdzKCkuZW5kKCk7CiAgICAgICAgICBpdCAhPSBpZTsgKytpdCkgewogICAgICAgQXJnICpBID0gKml0OwpAQCAtMTQ1Niw2ICsxNDQwLDcgQEAKIAogICBpZiAoVEMtPnVzZUludGVncmF0ZWRBcygpICYmCiAgICAgICAhQy5nZXRBcmdzKCkuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zYXZlX3RlbXBzKSAmJgorICAgICAgIUMuZ2V0QXJncygpLmhhc0FyZyhvcHRpb25zOjpPUFRfdmlhX2ZpbGVfYXNtKSAmJgogICAgICAgIUMuZ2V0QXJncygpLmhhc0FyZyhvcHRpb25zOjpPUFRfX1NMQVNIX0ZBKSAmJgogICAgICAgIUMuZ2V0QXJncygpLmhhc0FyZyhvcHRpb25zOjpPUFRfX1NMQVNIX0ZhKSAmJgogICAgICAgaXNhPEFzc2VtYmxlSm9iQWN0aW9uPihKQSkgJiYKQEAgLTE2MjYsNiArMTYxMSwxNCBAQAogICAgICAgcmV0dXJuIEMuYWRkUmVzdWx0RmlsZShGaW5hbE91dHB1dC0+Z2V0VmFsdWUoKSwgJkpBKTsKICAgfQogCisgIC8vIEZvciAvUCwgcHJlcHJvY2VzcyB0byBmaWxlIG5hbWVkIGFmdGVyIEJhc2VJbnB1dC4KKyAgaWYgKEMuZ2V0QXJncygpLmhhc0FyZyhvcHRpb25zOjpPUFRfX1NMQVNIX1ApKSB7CisgICAgYXNzZXJ0KEF0VG9wTGV2ZWwgJiYgaXNhPFByZXByb2Nlc3NKb2JBY3Rpb24+KEpBKSk7CisgICAgU3RyaW5nUmVmIEJhc2VOYW1lID0gbGx2bTo6c3lzOjpwYXRoOjpmaWxlbmFtZShCYXNlSW5wdXQpOworICAgIHJldHVybiBDLmFkZFJlc3VsdEZpbGUoTWFrZUNMT3V0cHV0RmlsZW5hbWUoQy5nZXRBcmdzKCksICIiLCBCYXNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzOjpUWV9QUF9DKSwgJkpBKTsKKyAgfQorCiAgIC8vIERlZmF1bHQgdG8gd3JpdGluZyB0byBzdGRvdXQ/CiAgIGlmIChBdFRvcExldmVsICYmICFDQ0dlbkRpYWdub3N0aWNzICYmCiAgICAgICAoaXNhPFByZXByb2Nlc3NKb2JBY3Rpb24+KEpBKSB8fCBKQS5nZXRUeXBlKCkgPT0gdHlwZXM6OlRZX01vZHVsZUZpbGUpKQpAQCAtMTg1NCwyMSArMTg0NywxOCBAQAogCiAgIGxsdm06OlRyaXBsZSBUYXJnZXQobGx2bTo6VHJpcGxlOjpub3JtYWxpemUoRGVmYXVsdFRhcmdldFRyaXBsZSkpOwogCi0gIC8vIEhhbmRsZSBEYXJ3aW4tc3BlY2lmaWMgb3B0aW9ucyBhdmFpbGFibGUgaGVyZS4KLSAgaWYgKFRhcmdldC5pc09TRGFyd2luKCkpIHsKKyAgLy8gSGFuZGxlIEFwcGxlLXNwZWNpZmljIG9wdGlvbnMgYXZhaWxhYmxlIGhlcmUuCisgIGlmIChUYXJnZXQuaXNPU0JpbkZvcm1hdE1hY2hPKCkpIHsKICAgICAvLyBJZiBhbiBleHBsaWN0IERhcndpbiBhcmNoIG5hbWUgaXMgZ2l2ZW4sIHRoYXQgdHJ1bXBzIGFsbC4KICAgICBpZiAoIURhcndpbkFyY2hOYW1lLmVtcHR5KCkpIHsKLSAgICAgIFRhcmdldC5zZXRBcmNoKAotICAgICAgICB0b29sczo6ZGFyd2luOjpnZXRBcmNoVHlwZUZvckRhcndpbkFyY2hOYW1lKERhcndpbkFyY2hOYW1lKSk7CisgICAgICB0b29sczo6ZGFyd2luOjpzZXRUcmlwbGVUeXBlRm9yTWFjaE9BcmNoTmFtZShUYXJnZXQsIERhcndpbkFyY2hOYW1lKTsKICAgICAgIHJldHVybiBUYXJnZXQ7CiAgICAgfQogCiAgICAgLy8gSGFuZGxlIHRoZSBEYXJ3aW4gJy1hcmNoJyBmbGFnLgogICAgIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2FyY2gpKSB7Ci0gICAgICBsbHZtOjpUcmlwbGU6OkFyY2hUeXBlIERhcndpbkFyY2gKLSAgICAgICAgPSB0b29sczo6ZGFyd2luOjpnZXRBcmNoVHlwZUZvckRhcndpbkFyY2hOYW1lKEEtPmdldFZhbHVlKCkpOwotICAgICAgaWYgKERhcndpbkFyY2ggIT0gbGx2bTo6VHJpcGxlOjpVbmtub3duQXJjaCkKLSAgICAgICAgVGFyZ2V0LnNldEFyY2goRGFyd2luQXJjaCk7CisgICAgICBTdHJpbmdSZWYgQXJjaE5hbWUgPSBBLT5nZXRWYWx1ZSgpOworICAgICAgdG9vbHM6OmRhcndpbjo6c2V0VHJpcGxlVHlwZUZvck1hY2hPQXJjaE5hbWUoVGFyZ2V0LCBBcmNoTmFtZSk7CiAgICAgfQogICB9CiAKQEAgLTE4OTMsMjAgKzE4ODMsMjMgQEAKICAgICAgIFRhcmdldC5nZXRPUygpID09IGxsdm06OlRyaXBsZTo6TWluaXgpCiAgICAgcmV0dXJuIFRhcmdldDsKIAotICAvLyBIYW5kbGUgcHNldWRvLXRhcmdldCBmbGFncyAnLW0zMicgYW5kICctbTY0Jy4KLSAgLy8gRklYTUU6IFNob3VsZCB0aGlzIGluZm9ybWF0aW9uIGJlIGluIGxsdm06OlRyaXBsZT8KLSAgaWYgKEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfbTMyLCBvcHRpb25zOjpPUFRfbTY0KSkgewotICAgIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9tMzIpKSB7Ci0gICAgICBpZiAoVGFyZ2V0LmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NCkKLSAgICAgICAgVGFyZ2V0LnNldEFyY2gobGx2bTo6VHJpcGxlOjp4ODYpOwotICAgICAgaWYgKFRhcmdldC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpwcGM2NCkKLSAgICAgICAgVGFyZ2V0LnNldEFyY2gobGx2bTo6VHJpcGxlOjpwcGMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoVGFyZ2V0LmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NikKLSAgICAgICAgVGFyZ2V0LnNldEFyY2gobGx2bTo6VHJpcGxlOjp4ODZfNjQpOwotICAgICAgaWYgKFRhcmdldC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpwcGMpCi0gICAgICAgIFRhcmdldC5zZXRBcmNoKGxsdm06OlRyaXBsZTo6cHBjNjQpOworICAvLyBIYW5kbGUgcHNldWRvLXRhcmdldCBmbGFncyAnLW02NCcsICctbTMyJyBhbmQgJy1tMTYnLgorICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tNjQsIG9wdGlvbnM6Ok9QVF9tMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX20xNikpIHsKKyAgICBsbHZtOjpUcmlwbGU6OkFyY2hUeXBlIEFUID0gbGx2bTo6VHJpcGxlOjpVbmtub3duQXJjaDsKKworICAgIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9tNjQpKQorICAgICAgQVQgPSBUYXJnZXQuZ2V0NjRCaXRBcmNoVmFyaWFudCgpLmdldEFyY2goKTsKKyAgICBlbHNlIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9tMzIpKQorICAgICAgQVQgPSBUYXJnZXQuZ2V0MzJCaXRBcmNoVmFyaWFudCgpLmdldEFyY2goKTsKKyAgICBlbHNlIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9tMTYpICYmCisgICAgICAgICAgICAgVGFyZ2V0LmdldDMyQml0QXJjaFZhcmlhbnQoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYpIHsKKyAgICAgIEFUID0gbGx2bTo6VHJpcGxlOjp4ODY7CisgICAgICBUYXJnZXQuc2V0RW52aXJvbm1lbnQobGx2bTo6VHJpcGxlOjpDT0RFMTYpOwogICAgIH0KKworICAgIGlmIChBVCAhPSBsbHZtOjpUcmlwbGU6OlVua25vd25BcmNoKQorICAgICAgVGFyZ2V0LnNldEFyY2goQVQpOwogICB9CiAKICAgcmV0dXJuIFRhcmdldDsKQEAgLTE5MjYsMTMgKzE5MTksNyBAQAogICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpEYXJ3aW46CiAgICAgY2FzZSBsbHZtOjpUcmlwbGU6Ok1hY09TWDoKICAgICBjYXNlIGxsdm06OlRyaXBsZTo6SU9TOgotICAgICAgaWYgKFRhcmdldC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgfHwKLSAgICAgICAgICBUYXJnZXQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0IHx8Ci0gICAgICAgICAgVGFyZ2V0LmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSB8fAotICAgICAgICAgIFRhcmdldC5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYikKLSAgICAgICAgVEMgPSBuZXcgdG9vbGNoYWluczo6RGFyd2luQ2xhbmcoKnRoaXMsIFRhcmdldCwgQXJncyk7Ci0gICAgICBlbHNlCi0gICAgICAgIFRDID0gbmV3IHRvb2xjaGFpbnM6OkRhcndpbl9HZW5lcmljX0dDQygqdGhpcywgVGFyZ2V0LCBBcmdzKTsKKyAgICAgIFRDID0gbmV3IHRvb2xjaGFpbnM6OkRhcndpbkNsYW5nKCp0aGlzLCBUYXJnZXQsIEFyZ3MpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkRyYWdvbkZseToKICAgICAgIFRDID0gbmV3IHRvb2xjaGFpbnM6OkRyYWdvbkZseSgqdGhpcywgVGFyZ2V0LCBBcmdzKTsKQEAgLTE5NjIsMTAgKzE5NDksMjkgQEAKICAgICAgIFRDID0gbmV3IHRvb2xjaGFpbnM6OlNvbGFyaXMoKnRoaXMsIFRhcmdldCwgQXJncyk7CiAgICAgICBicmVhazsKICAgICBjYXNlIGxsdm06OlRyaXBsZTo6V2luMzI6Ci0gICAgICBUQyA9IG5ldyB0b29sY2hhaW5zOjpXaW5kb3dzKCp0aGlzLCBUYXJnZXQsIEFyZ3MpOworICAgICAgc3dpdGNoIChUYXJnZXQuZ2V0RW52aXJvbm1lbnQoKSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKFRhcmdldC5pc09TQmluRm9ybWF0RUxGKCkpCisgICAgICAgICAgVEMgPSBuZXcgdG9vbGNoYWluczo6R2VuZXJpY19FTEYoKnRoaXMsIFRhcmdldCwgQXJncyk7CisgICAgICAgIGVsc2UgaWYgKFRhcmdldC5pc09TQmluRm9ybWF0TWFjaE8oKSkKKyAgICAgICAgICBUQyA9IG5ldyB0b29sY2hhaW5zOjpNYWNoTygqdGhpcywgVGFyZ2V0LCBBcmdzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFRDID0gbmV3IHRvb2xjaGFpbnM6OkdlbmVyaWNfR0NDKCp0aGlzLCBUYXJnZXQsIEFyZ3MpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpHTlU6CisgICAgICAgIC8vIEZJWE1FOiBXZSBuZWVkIGEgTWluR1cgdG9vbGNoYWluLiAgVXNlIHRoZSBkZWZhdWx0IEdlbmVyaWNfR0NDCisgICAgICAgIC8vIHRvb2xjaGFpbiBmb3Igbm93IGFzIHRoZSBkZWZhdWx0IGNhc2Ugd291bGQgYmVsb3cgb3RoZXJ3aXNlLgorICAgICAgICBpZiAoVGFyZ2V0LmlzT1NCaW5Gb3JtYXRFTEYoKSkKKyAgICAgICAgICBUQyA9IG5ldyB0b29sY2hhaW5zOjpHZW5lcmljX0VMRigqdGhpcywgVGFyZ2V0LCBBcmdzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFRDID0gbmV3IHRvb2xjaGFpbnM6OkdlbmVyaWNfR0NDKCp0aGlzLCBUYXJnZXQsIEFyZ3MpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpNU1ZDOgorICAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OlVua25vd25FbnZpcm9ubWVudDoKKyAgICAgICAgVEMgPSBuZXcgdG9vbGNoYWluczo6V2luZG93cygqdGhpcywgVGFyZ2V0LCBBcmdzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgICBicmVhazsKLSAgICBjYXNlIGxsdm06OlRyaXBsZTo6TWluR1czMjoKLSAgICAgIC8vIEZJWE1FOiBXZSBuZWVkIGEgTWluR1cgdG9vbGNoYWluLiBGYWxsdGhyb3VnaCBmb3Igbm93LgogICAgIGRlZmF1bHQ6CiAgICAgICAvLyBUQ0UgaXMgYW4gT1NsZXNzIHRhcmdldAogICAgICAgaWYgKFRhcmdldC5nZXRBcmNoTmFtZSgpID09ICJ0Y2UiKSB7CkBAIC0xOTgxLDYgKzE5ODcsMTQgQEAKICAgICAgICAgVEMgPSBuZXcgdG9vbGNoYWluczo6WENvcmUoKnRoaXMsIFRhcmdldCwgQXJncyk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQorICAgICAgaWYgKFRhcmdldC5pc09TQmluRm9ybWF0RUxGKCkpIHsKKyAgICAgICAgVEMgPSBuZXcgdG9vbGNoYWluczo6R2VuZXJpY19FTEYoKnRoaXMsIFRhcmdldCwgQXJncyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKFRhcmdldC5nZXRPYmplY3RGb3JtYXQoKSA9PSBsbHZtOjpUcmlwbGU6Ok1hY2hPKSB7CisgICAgICAgIFRDID0gbmV3IHRvb2xjaGFpbnM6Ok1hY2hPKCp0aGlzLCBUYXJnZXQsIEFyZ3MpOworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICAgIFRDID0gbmV3IHRvb2xjaGFpbnM6OkdlbmVyaWNfR0NDKCp0aGlzLCBUYXJnZXQsIEFyZ3MpOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMjA1NSwzICsyMDY5LDcgQEAKIAogICByZXR1cm4gc3RkOjptYWtlX3BhaXIoSW5jbHVkZWRGbGFnc0JpdG1hc2ssIEV4Y2x1ZGVkRmxhZ3NCaXRtYXNrKTsKIH0KKworYm9vbCBjbGFuZzo6ZHJpdmVyOjppc09wdGltaXphdGlvbkxldmVsRmFzdChjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpIHsKKyAgcmV0dXJuIEFyZ3MuaGFzRmxhZyhvcHRpb25zOjpPUFRfT2Zhc3QsIG9wdGlvbnM6Ok9QVF9PX0dyb3VwLCBmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvRHJpdmVyL0pvYi5jcHAgYi9saWIvRHJpdmVyL0pvYi5jcHAKaW5kZXggZWU2OGU2Zi4uMjc3NWQ4OSAxMDA2NDQKLS0tIGEvbGliL0RyaXZlci9Kb2IuY3BwCisrKyBiL2xpYi9Ecml2ZXIvSm9iLmNwcApAQCAtNyw3ICs3LDExIEBACiAvLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAorI2luY2x1ZGUgImNsYW5nL0RyaXZlci9Ecml2ZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvRHJpdmVyRGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL0RyaXZlci9Kb2IuaCIKKyNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvVG9vbC5oIgorI2luY2x1ZGUgImNsYW5nL0RyaXZlci9Ub29sQ2hhaW4uaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTd2l0Y2guaCIKQEAgLTE1OSw2ICsxNjMsOSBAQAogICBpZiAoRXhlY3V0aW9uRmFpbGVkKQogICAgICpFeGVjdXRpb25GYWlsZWQgPSBmYWxzZTsKIAorICBjb25zdCBEcml2ZXIgJkQgPSBnZXRDcmVhdG9yKCkuZ2V0VG9vbENoYWluKCkuZ2V0RHJpdmVyKCk7CisgIEQuRGlhZyhkaWFnOjp3YXJuX2Rydl9pbnZva2luZ19mYWxsYmFjaykgPDwgRmFsbGJhY2stPmdldEV4ZWN1dGFibGUoKTsKKwogICBpbnQgU2Vjb25kYXJ5U3RhdHVzID0gRmFsbGJhY2stPkV4ZWN1dGUoUmVkaXJlY3RzLCBFcnJNc2csIEV4ZWN1dGlvbkZhaWxlZCk7CiAgIHJldHVybiBTZWNvbmRhcnlTdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9saWIvRHJpdmVyL011bHRpbGliLmNwcCBiL2xpYi9Ecml2ZXIvTXVsdGlsaWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMGU2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvRHJpdmVyL011bHRpbGliLmNwcApAQCAtMCwwICsxLDM1MSBAQAorLy89PT0tLS0gTXVsdGlsaWIuY3BwIC0gTXVsdGlsaWIgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImNsYW5nL0RyaXZlci9NdWx0aWxpYi5oIgorI2luY2x1ZGUgIlRvb2xzLmgiCisjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL09wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9BcmcuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9BcmdMaXN0LmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0VGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9PcHRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdGguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVnZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFBhcnNlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCit1c2luZyBuYW1lc3BhY2UgY2xhbmc6OmRyaXZlcjsKK3VzaW5nIG5hbWVzcGFjZSBjbGFuZzsKK3VzaW5nIG5hbWVzcGFjZSBsbHZtOjpvcHQ7Cit1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3lzOworCisvLy8gbm9ybWFsaXplIFNlZ21lbnQgdG8gIi9mb28vYmFyIiBvciAiIi4KK3N0YXRpYyB2b2lkIG5vcm1hbGl6ZVBhdGhTZWdtZW50KHN0ZDo6c3RyaW5nICZTZWdtZW50KSB7CisgIFN0cmluZ1JlZiBzZWcgPSBTZWdtZW50OworCisgIC8vIFBydW5lIHRyYWlsaW5nICIvIiBvciAiLi8iCisgIHdoaWxlICgxKSB7CisgICAgU3RyaW5nUmVmIGxhc3QgPSAqLS1wYXRoOjplbmQoc2VnKTsKKyAgICBpZiAobGFzdCAhPSAiLiIpCisgICAgICBicmVhazsKKyAgICBzZWcgPSBwYXRoOjpwYXJlbnRfcGF0aChzZWcpOworICB9CisKKyAgaWYgKHNlZy5lbXB0eSgpIHx8IHNlZyA9PSAiLyIpIHsKKyAgICBTZWdtZW50ID0gIiI7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQWRkIGxlYWRpbmcgJy8nCisgIGlmIChzZWcuZnJvbnQoKSAhPSAnLycpIHsKKyAgICBTZWdtZW50ID0gIi8iICsgc2VnLnN0cigpOworICB9IGVsc2UgeworICAgIFNlZ21lbnQgPSBzZWc7CisgIH0KK30KKworTXVsdGlsaWI6Ok11bHRpbGliKFN0cmluZ1JlZiBHQ0NTdWZmaXgsIFN0cmluZ1JlZiBPU1N1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5jbHVkZVN1ZmZpeCkKKyAgICA6IEdDQ1N1ZmZpeChHQ0NTdWZmaXgpLCBPU1N1ZmZpeChPU1N1ZmZpeCksIEluY2x1ZGVTdWZmaXgoSW5jbHVkZVN1ZmZpeCkgeworICBub3JtYWxpemVQYXRoU2VnbWVudCh0aGlzLT5HQ0NTdWZmaXgpOworICBub3JtYWxpemVQYXRoU2VnbWVudCh0aGlzLT5PU1N1ZmZpeCk7CisgIG5vcm1hbGl6ZVBhdGhTZWdtZW50KHRoaXMtPkluY2x1ZGVTdWZmaXgpOworfQorCitNdWx0aWxpYiAmTXVsdGlsaWI6OmdjY1N1ZmZpeChTdHJpbmdSZWYgUykgeworICBHQ0NTdWZmaXggPSBTOworICBub3JtYWxpemVQYXRoU2VnbWVudChHQ0NTdWZmaXgpOworICByZXR1cm4gKnRoaXM7Cit9CisKK011bHRpbGliICZNdWx0aWxpYjo6b3NTdWZmaXgoU3RyaW5nUmVmIFMpIHsKKyAgT1NTdWZmaXggPSBTOworICBub3JtYWxpemVQYXRoU2VnbWVudChPU1N1ZmZpeCk7CisgIHJldHVybiAqdGhpczsKK30KKworTXVsdGlsaWIgJk11bHRpbGliOjppbmNsdWRlU3VmZml4KFN0cmluZ1JlZiBTKSB7CisgIEluY2x1ZGVTdWZmaXggPSBTOworICBub3JtYWxpemVQYXRoU2VnbWVudChJbmNsdWRlU3VmZml4KTsKKyAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIE11bHRpbGliOjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgYXNzZXJ0KEdDQ1N1ZmZpeC5lbXB0eSgpIHx8IChTdHJpbmdSZWYoR0NDU3VmZml4KS5mcm9udCgpID09ICcvJykpOworICBpZiAoR0NDU3VmZml4LmVtcHR5KCkpCisgICAgT1MgPDwgIi4iOworICBlbHNlIHsKKyAgICBPUyA8PCBTdHJpbmdSZWYoR0NDU3VmZml4KS5kcm9wX2Zyb250KCk7CisgIH0KKyAgT1MgPDwgIjsiOworICBmb3IgKGZsYWdzX2xpc3Q6OmNvbnN0X2l0ZXJhdG9yIEkgPSBGbGFncy5iZWdpbigpLCBFID0gRmxhZ3MuZW5kKCk7IEkgIT0gRTsKKyAgICAgICArK0kpIHsKKyAgICBpZiAoU3RyaW5nUmVmKCpJKS5mcm9udCgpID09ICcrJykKKyAgICAgIE9TIDw8ICJAIiA8PCBJLT5zdWJzdHIoMSk7CisgIH0KK30KKworYm9vbCBNdWx0aWxpYjo6aXNWYWxpZCgpIGNvbnN0IHsKKyAgbGx2bTo6U3RyaW5nTWFwPGludD4gRmxhZ1NldDsKKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IEZsYWdzLnNpemUoKTsgSSAhPSBOOyArK0kpIHsKKyAgICBTdHJpbmdSZWYgRmxhZyhGbGFnc1tJXSk7CisgICAgbGx2bTo6U3RyaW5nTWFwPGludD46Oml0ZXJhdG9yIFNJID0gRmxhZ1NldC5maW5kKEZsYWcuc3Vic3RyKDEpKTsKKworICAgIGFzc2VydChTdHJpbmdSZWYoRmxhZykuZnJvbnQoKSA9PSAnKycgfHwgU3RyaW5nUmVmKEZsYWcpLmZyb250KCkgPT0gJy0nKTsKKworICAgIGlmIChTSSA9PSBGbGFnU2V0LmVuZCgpKQorICAgICAgRmxhZ1NldFtGbGFnLnN1YnN0cigxKV0gPSBJOworICAgIGVsc2UgaWYgKEZsYWdzW0ldICE9IEZsYWdzW1NJLT5nZXRWYWx1ZSgpXSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNdWx0aWxpYjo6b3BlcmF0b3I9PShjb25zdCBNdWx0aWxpYiAmT3RoZXIpIGNvbnN0IHsKKyAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZmxhZ3Mgc2V0cyBtYXRjaAorICAvLyBhbGxvd2luZyBmb3IgdGhlIG1hdGNoIHRvIGJlIG9yZGVyIGludmFyaWFudAorICBsbHZtOjpTdHJpbmdTZXQ8PiBNeUZsYWdzOworICBmb3IgKGZsYWdzX2xpc3Q6OmNvbnN0X2l0ZXJhdG9yIEkgPSBGbGFncy5iZWdpbigpLCBFID0gRmxhZ3MuZW5kKCk7IEkgIT0gRTsKKyAgICAgICArK0kpIHsKKyAgICBNeUZsYWdzLmluc2VydCgqSSk7CisgIH0KKyAgZm9yIChmbGFnc19saXN0Ojpjb25zdF9pdGVyYXRvciBJID0gT3RoZXIuRmxhZ3MuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gT3RoZXIuRmxhZ3MuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoTXlGbGFncy5maW5kKCpJKSA9PSBNeUZsYWdzLmVuZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKG9zU3VmZml4KCkgIT0gT3RoZXIub3NTdWZmaXgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGdjY1N1ZmZpeCgpICE9IE90aGVyLmdjY1N1ZmZpeCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoaW5jbHVkZVN1ZmZpeCgpICE9IE90aGVyLmluY2x1ZGVTdWZmaXgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3Jhd19vc3RyZWFtICZjbGFuZzo6ZHJpdmVyOjpvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTXVsdGlsaWIgJk0pIHsKKyAgTS5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworTXVsdGlsaWJTZXQgJk11bHRpbGliU2V0OjpNYXliZShjb25zdCBNdWx0aWxpYiAmTSkgeworICBNdWx0aWxpYiBPcHBvc2l0ZTsKKyAgLy8gTmVnYXRlIGFueSAnKycgZmxhZ3MKKyAgZm9yIChNdWx0aWxpYjo6ZmxhZ3NfbGlzdDo6Y29uc3RfaXRlcmF0b3IgSSA9IE0uZmxhZ3MoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gTS5mbGFncygpLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgU3RyaW5nUmVmIEZsYWcoKkkpOworICAgIGlmIChGbGFnLmZyb250KCkgPT0gJysnKQorICAgICAgT3Bwb3NpdGUuZmxhZ3MoKS5wdXNoX2JhY2soKCItIiArIEZsYWcuc3Vic3RyKDEpKS5zdHIoKSk7CisgIH0KKyAgcmV0dXJuIEVpdGhlcihNLCBPcHBvc2l0ZSk7Cit9CisKK011bHRpbGliU2V0ICZNdWx0aWxpYlNldDo6RWl0aGVyKGNvbnN0IE11bHRpbGliICZNMSwgY29uc3QgTXVsdGlsaWIgJk0yKSB7CisgIHN0ZDo6dmVjdG9yPE11bHRpbGliPiBNczsKKyAgTXMucHVzaF9iYWNrKE0xKTsKKyAgTXMucHVzaF9iYWNrKE0yKTsKKyAgcmV0dXJuIEVpdGhlcihNcyk7Cit9CisKK011bHRpbGliU2V0ICZNdWx0aWxpYlNldDo6RWl0aGVyKGNvbnN0IE11bHRpbGliICZNMSwgY29uc3QgTXVsdGlsaWIgJk0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlsaWIgJk0zKSB7CisgIHN0ZDo6dmVjdG9yPE11bHRpbGliPiBNczsKKyAgTXMucHVzaF9iYWNrKE0xKTsKKyAgTXMucHVzaF9iYWNrKE0yKTsKKyAgTXMucHVzaF9iYWNrKE0zKTsKKyAgcmV0dXJuIEVpdGhlcihNcyk7Cit9CisKK011bHRpbGliU2V0ICZNdWx0aWxpYlNldDo6RWl0aGVyKGNvbnN0IE11bHRpbGliICZNMSwgY29uc3QgTXVsdGlsaWIgJk0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlsaWIgJk0zLCBjb25zdCBNdWx0aWxpYiAmTTQpIHsKKyAgc3RkOjp2ZWN0b3I8TXVsdGlsaWI+IE1zOworICBNcy5wdXNoX2JhY2soTTEpOworICBNcy5wdXNoX2JhY2soTTIpOworICBNcy5wdXNoX2JhY2soTTMpOworICBNcy5wdXNoX2JhY2soTTQpOworICByZXR1cm4gRWl0aGVyKE1zKTsKK30KKworTXVsdGlsaWJTZXQgJk11bHRpbGliU2V0OjpFaXRoZXIoY29uc3QgTXVsdGlsaWIgJk0xLCBjb25zdCBNdWx0aWxpYiAmTTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aWxpYiAmTTMsIGNvbnN0IE11bHRpbGliICZNNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpbGliICZNNSkgeworICBzdGQ6OnZlY3RvcjxNdWx0aWxpYj4gTXM7CisgIE1zLnB1c2hfYmFjayhNMSk7CisgIE1zLnB1c2hfYmFjayhNMik7CisgIE1zLnB1c2hfYmFjayhNMyk7CisgIE1zLnB1c2hfYmFjayhNNCk7CisgIE1zLnB1c2hfYmFjayhNNSk7CisgIHJldHVybiBFaXRoZXIoTXMpOworfQorCitzdGF0aWMgTXVsdGlsaWIgY29tcG9zZShjb25zdCBNdWx0aWxpYiAmQmFzZSwgY29uc3QgTXVsdGlsaWIgJk5ldykgeworICBTbWFsbFN0cmluZzwxMjg+IEdDQ1N1ZmZpeDsKKyAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoR0NDU3VmZml4LCAiLyIsIEJhc2UuZ2NjU3VmZml4KCksIE5ldy5nY2NTdWZmaXgoKSk7CisgIFNtYWxsU3RyaW5nPDEyOD4gT1NTdWZmaXg7CisgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKE9TU3VmZml4LCAiLyIsIEJhc2Uub3NTdWZmaXgoKSwgTmV3Lm9zU3VmZml4KCkpOworICBTbWFsbFN0cmluZzwxMjg+IEluY2x1ZGVTdWZmaXg7CisgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKEluY2x1ZGVTdWZmaXgsICIvIiwgQmFzZS5pbmNsdWRlU3VmZml4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldy5pbmNsdWRlU3VmZml4KCkpOworCisgIE11bHRpbGliIENvbXBvc2VkKEdDQ1N1ZmZpeC5zdHIoKSwgT1NTdWZmaXguc3RyKCksIEluY2x1ZGVTdWZmaXguc3RyKCkpOworCisgIE11bHRpbGliOjpmbGFnc19saXN0ICZGbGFncyA9IENvbXBvc2VkLmZsYWdzKCk7CisKKyAgRmxhZ3MuaW5zZXJ0KEZsYWdzLmVuZCgpLCBCYXNlLmZsYWdzKCkuYmVnaW4oKSwgQmFzZS5mbGFncygpLmVuZCgpKTsKKyAgRmxhZ3MuaW5zZXJ0KEZsYWdzLmVuZCgpLCBOZXcuZmxhZ3MoKS5iZWdpbigpLCBOZXcuZmxhZ3MoKS5lbmQoKSk7CisKKyAgcmV0dXJuIENvbXBvc2VkOworfQorCitNdWx0aWxpYlNldCAmCitNdWx0aWxpYlNldDo6RWl0aGVyKGNvbnN0IHN0ZDo6dmVjdG9yPE11bHRpbGliPiAmTXVsdGlsaWJTZWdtZW50cykgeworICBtdWx0aWxpYl9saXN0IENvbXBvc2VkOworCisgIGlmIChNdWx0aWxpYnMuZW1wdHkoKSkKKyAgICBNdWx0aWxpYnMuaW5zZXJ0KE11bHRpbGlicy5lbmQoKSwgTXVsdGlsaWJTZWdtZW50cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgTXVsdGlsaWJTZWdtZW50cy5lbmQoKSk7CisgIGVsc2UgeworICAgIGZvciAoc3RkOjp2ZWN0b3I8TXVsdGlsaWI+Ojpjb25zdF9pdGVyYXRvciBOZXdJID0gTXVsdGlsaWJTZWdtZW50cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdFID0gTXVsdGlsaWJTZWdtZW50cy5lbmQoKTsKKyAgICAgICAgIE5ld0kgIT0gTmV3RTsgKytOZXdJKSB7CisgICAgICBmb3IgKGNvbnN0X2l0ZXJhdG9yIEJhc2VJID0gYmVnaW4oKSwgQmFzZUUgPSBlbmQoKTsgQmFzZUkgIT0gQmFzZUU7CisgICAgICAgICAgICsrQmFzZUkpIHsKKyAgICAgICAgTXVsdGlsaWIgTU8gPSBjb21wb3NlKCpCYXNlSSwgKk5ld0kpOworICAgICAgICBpZiAoTU8uaXNWYWxpZCgpKQorICAgICAgICAgIENvbXBvc2VkLnB1c2hfYmFjayhNTyk7CisgICAgICB9CisgICAgfQorCisgICAgTXVsdGlsaWJzID0gQ29tcG9zZWQ7CisgIH0KKworICByZXR1cm4gKnRoaXM7Cit9CisKK011bHRpbGliU2V0ICZNdWx0aWxpYlNldDo6RmlsdGVyT3V0KGNvbnN0IE11bHRpbGliU2V0OjpGaWx0ZXJDYWxsYmFjayAmRikgeworICBmaWx0ZXJJblBsYWNlKEYsIE11bHRpbGlicyk7CisgIHJldHVybiAqdGhpczsKK30KKworTXVsdGlsaWJTZXQgJk11bHRpbGliU2V0OjpGaWx0ZXJPdXQoc3RkOjpzdHJpbmcgUmVnZXgpIHsKKyAgY2xhc3MgUkVGaWx0ZXIgOiBwdWJsaWMgTXVsdGlsaWJTZXQ6OkZpbHRlckNhbGxiYWNrIHsKKyAgICBtdXRhYmxlIGxsdm06OlJlZ2V4IFI7CisKKyAgcHVibGljOgorICAgIFJFRmlsdGVyKHN0ZDo6c3RyaW5nIFJlZ2V4KSA6IFIoUmVnZXgpIHt9CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IE11bHRpbGliICZNKSBjb25zdCBvdmVycmlkZSB7CisgICAgICBzdGQ6OnN0cmluZyBFcnJvcjsKKyAgICAgIGlmICghUi5pc1ZhbGlkKEVycm9yKSkgeworICAgICAgICBsbHZtOjplcnJzKCkgPDwgRXJyb3I7CisgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBSLm1hdGNoKE0uZ2NjU3VmZml4KCkpOworICAgIH0KKyAgfTsKKworICBSRUZpbHRlciBSRUYoUmVnZXgpOworICBmaWx0ZXJJblBsYWNlKFJFRiwgTXVsdGlsaWJzKTsKKyAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIE11bHRpbGliU2V0OjpwdXNoX2JhY2soY29uc3QgTXVsdGlsaWIgJk0pIHsgTXVsdGlsaWJzLnB1c2hfYmFjayhNKTsgfQorCit2b2lkIE11bHRpbGliU2V0Ojpjb21iaW5lV2l0aChjb25zdCBNdWx0aWxpYlNldCAmT3RoZXIpIHsKKyAgTXVsdGlsaWJzLmluc2VydChNdWx0aWxpYnMuZW5kKCksIE90aGVyLmJlZ2luKCksIE90aGVyLmVuZCgpKTsKK30KKworYm9vbCBNdWx0aWxpYlNldDo6c2VsZWN0KGNvbnN0IE11bHRpbGliOjpmbGFnc19saXN0ICZGbGFncywgTXVsdGlsaWIgJk0pIGNvbnN0IHsKKyAgY2xhc3MgRmlsdGVyRmxhZ3NNaXNtYXRjaCA6IHB1YmxpYyBNdWx0aWxpYlNldDo6RmlsdGVyQ2FsbGJhY2sgeworICAgIGxsdm06OlN0cmluZ01hcDxib29sPiBGbGFnU2V0OworCisgIHB1YmxpYzoKKyAgICBGaWx0ZXJGbGFnc01pc21hdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmRmxhZ3MpIHsKKyAgICAgIC8vIFN0dWZmIGFsbCBvZiB0aGUgZmxhZ3MgaW50byB0aGUgRmxhZ1NldCBzdWNoIHRoYXQgYSB0cnVlIG1hcHBlbmQKKyAgICAgIC8vIGluZGljYXRlcyB0aGUgZmxhZyB3YXMgZW5hYmxlZCwgYW5kIGEgZmFsc2UgbWFwcGVuZCBpbmRpY2F0ZXMgdGhlCisgICAgICAvLyBmbGFnIHdhcyBkaXNhYmxlZAorICAgICAgZm9yIChNdWx0aWxpYjo6ZmxhZ3NfbGlzdDo6Y29uc3RfaXRlcmF0b3IgSSA9IEZsYWdzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRmxhZ3MuZW5kKCk7CisgICAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICAgIEZsYWdTZXRbU3RyaW5nUmVmKCpJKS5zdWJzdHIoMSldID0gaXNGbGFnRW5hYmxlZCgqSSk7CisgICAgICB9CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBNdWx0aWxpYiAmTSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgZm9yIChNdWx0aWxpYjo6ZmxhZ3NfbGlzdDo6Y29uc3RfaXRlcmF0b3IgSSA9IE0uZmxhZ3MoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IE0uZmxhZ3MoKS5lbmQoKTsKKyAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgU3RyaW5nUmVmIEZsYWcoKkkpOworICAgICAgICBsbHZtOjpTdHJpbmdNYXA8Ym9vbD46OmNvbnN0X2l0ZXJhdG9yIFNJID0gRmxhZ1NldC5maW5kKEZsYWcuc3Vic3RyKDEpKTsKKyAgICAgICAgaWYgKFNJICE9IEZsYWdTZXQuZW5kKCkpCisgICAgICAgICAgaWYgKCgqU0kpLmdldFZhbHVlKCkgIT0gaXNGbGFnRW5hYmxlZChGbGFnKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBib29sIGlzRmxhZ0VuYWJsZWQoU3RyaW5nUmVmIEZsYWcpIGNvbnN0IHsKKyAgICAgIGNoYXIgSW5kaWNhdG9yID0gRmxhZy5mcm9udCgpOworICAgICAgYXNzZXJ0KEluZGljYXRvciA9PSAnKycgfHwgSW5kaWNhdG9yID09ICctJyk7CisgICAgICByZXR1cm4gSW5kaWNhdG9yID09ICcrJzsKKyAgICB9CisgIH07CisKKyAgRmlsdGVyRmxhZ3NNaXNtYXRjaCBGbGFnc01pc21hdGNoKEZsYWdzKTsKKworICBtdWx0aWxpYl9saXN0IEZpbHRlcmVkID0gZmlsdGVyQ29weShGbGFnc01pc21hdGNoLCBNdWx0aWxpYnMpOworCisgIGlmIChGaWx0ZXJlZC5zaXplKCkgPT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmIChGaWx0ZXJlZC5zaXplKCkgPT0gMSkgeworICAgIE0gPSBGaWx0ZXJlZFswXTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFRPRE86IHBpY2sgdGhlICJiZXN0IiBtdWx0bGliIHdoZW4gbW9yZSB0aGFuIG9uZSBpcyBzdWl0YWJsZQorICBhc3NlcnQoZmFsc2UpOworCisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNdWx0aWxpYlNldDo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgT1MgPDwgKkkgPDwgIlxuIjsKK30KKworTXVsdGlsaWJTZXQ6Om11bHRpbGliX2xpc3QKK011bHRpbGliU2V0OjpmaWx0ZXJDb3B5KGNvbnN0IE11bHRpbGliU2V0OjpGaWx0ZXJDYWxsYmFjayAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG11bHRpbGliX2xpc3QgJk1zKSB7CisgIG11bHRpbGliX2xpc3QgQ29weShNcyk7CisgIGZpbHRlckluUGxhY2UoRiwgQ29weSk7CisgIHJldHVybiBDb3B5OworfQorCit2b2lkIE11bHRpbGliU2V0OjpmaWx0ZXJJblBsYWNlKGNvbnN0IE11bHRpbGliU2V0OjpGaWx0ZXJDYWxsYmFjayAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlsaWJfbGlzdCAmTXMpIHsKKyAgTXMuZXJhc2Uoc3RkOjpyZW1vdmVfaWYoTXMuYmVnaW4oKSwgTXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsmRl0oY29uc3QgTXVsdGlsaWIgJk0pIHsgcmV0dXJuIEYoTSk7IH0pLAorICAgICAgICAgICBNcy5lbmQoKSk7Cit9CisKK3Jhd19vc3RyZWFtICZjbGFuZzo6ZHJpdmVyOjpvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTXVsdGlsaWJTZXQgJk1TKSB7CisgIE1TLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQpkaWZmIC0tZ2l0IGEvbGliL0RyaXZlci9TYW5pdGl6ZXJBcmdzLmNwcCBiL2xpYi9Ecml2ZXIvU2FuaXRpemVyQXJncy5jcHAKaW5kZXggNDMyMDlmMC4uNzhjOGQxOCAxMDA2NDQKLS0tIGEvbGliL0RyaXZlci9TYW5pdGl6ZXJBcmdzLmNwcAorKysgYi9saWIvRHJpdmVyL1Nhbml0aXplckFyZ3MuY3BwCkBAIC03LDE2ICs3LDE2IEBACiAvLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KICNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvU2FuaXRpemVyQXJncy5oIgotCiAjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL0RyaXZlci5oIgogI2luY2x1ZGUgImNsYW5nL0RyaXZlci9Ecml2ZXJEaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL09wdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvVG9vbENoYWluLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgogI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9TcGVjaWFsQ2FzZUxpc3QuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6ZHJpdmVyOwogdXNpbmcgbmFtZXNwYWNlIGxsdm06Om9wdDsKQEAgLTI0LDkgKzI0LDEwIEBACiB2b2lkIFNhbml0aXplckFyZ3M6OmNsZWFyKCkgewogICBLaW5kID0gMDsKICAgQmxhY2tsaXN0RmlsZSA9ICIiOwotICBNc2FuVHJhY2tPcmlnaW5zID0gZmFsc2U7CisgIE1zYW5UcmFja09yaWdpbnMgPSAwOwogICBBc2FuWmVyb0Jhc2VTaGFkb3cgPSBmYWxzZTsKICAgVWJzYW5UcmFwT25FcnJvciA9IGZhbHNlOworICBBc2FuU2hhcmVkUnVudGltZSA9IGZhbHNlOwogfQogCiBTYW5pdGl6ZXJBcmdzOjpTYW5pdGl6ZXJBcmdzKCkgewpAQCAtNzIsMzAgKzczLDE0IEBACiAgIH0KIAogICBVYnNhblRyYXBPbkVycm9yID0KLSAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZmNhdGNoX3VuZGVmaW5lZF9iZWhhdmlvcikgfHwKICAgICBBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX2ZzYW5pdGl6ZV91bmRlZmluZWRfdHJhcF9vbl9lcnJvciwKICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub19zYW5pdGl6ZV91bmRlZmluZWRfdHJhcF9vbl9lcnJvciwgZmFsc2UpOwogCi0gIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZmNhdGNoX3VuZGVmaW5lZF9iZWhhdmlvcikgJiYKLSAgICAgICFBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX2ZzYW5pdGl6ZV91bmRlZmluZWRfdHJhcF9vbl9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub19zYW5pdGl6ZV91bmRlZmluZWRfdHJhcF9vbl9lcnJvciwgdHJ1ZSkpIHsKLSAgICBELkRpYWcoZGlhZzo6ZXJyX2Rydl9hcmd1bWVudF9ub3RfYWxsb3dlZF93aXRoKQotICAgICAgPDwgIi1mY2F0Y2gtdW5kZWZpbmVkLWJlaGF2aW9yIgotICAgICAgPDwgIi1mbm8tc2FuaXRpemUtdW5kZWZpbmVkLXRyYXAtb24tZXJyb3IiOwotICB9Ci0KICAgLy8gV2FybiBhYm91dCB1bmRlZmluZWQgc2FuaXRpemVyIG9wdGlvbnMgdGhhdCByZXF1aXJlIHJ1bnRpbWUgc3VwcG9ydC4KICAgaWYgKFVic2FuVHJhcE9uRXJyb3IgJiYgbm90QWxsb3dlZFdpdGhUcmFwKCkpIHsKLSAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2ZjYXRjaF91bmRlZmluZWRfYmVoYXZpb3IpKQotICAgICAgRC5EaWFnKGRpYWc6OmVycl9kcnZfYXJndW1lbnRfbm90X2FsbG93ZWRfd2l0aCkKLSAgICAgICAgPDwgbGFzdEFyZ3VtZW50Rm9yS2luZChELCBBcmdzLCBOb3RBbGxvd2VkV2l0aFRyYXApCi0gICAgICAgIDw8ICItZmNhdGNoLXVuZGVmaW5lZC1iZWhhdmlvciI7Ci0gICAgZWxzZSBpZiAoQXJncy5oYXNGbGFnKG9wdGlvbnM6Ok9QVF9mc2FuaXRpemVfdW5kZWZpbmVkX3RyYXBfb25fZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mbm9fc2FuaXRpemVfdW5kZWZpbmVkX3RyYXBfb25fZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkKLSAgICAgIEQuRGlhZyhkaWFnOjplcnJfZHJ2X2FyZ3VtZW50X25vdF9hbGxvd2VkX3dpdGgpCi0gICAgICAgIDw8IGxhc3RBcmd1bWVudEZvcktpbmQoRCwgQXJncywgTm90QWxsb3dlZFdpdGhUcmFwKQotICAgICAgICA8PCAiLWZzYW5pdGl6ZS11bmRlZmluZWQtdHJhcC1vbi1lcnJvciI7CisgICAgRC5EaWFnKGRpYWc6OmVycl9kcnZfYXJndW1lbnRfbm90X2FsbG93ZWRfd2l0aCkKKyAgICAgIDw8IGxhc3RBcmd1bWVudEZvcktpbmQoRCwgQXJncywgTm90QWxsb3dlZFdpdGhUcmFwKQorICAgICAgPDwgIi1mc2FuaXRpemUtdW5kZWZpbmVkLXRyYXAtb24tZXJyb3IiOwogICB9CiAKICAgLy8gT25seSBvbmUgcnVudGltZSBsaWJyYXJ5IGNhbiBiZSB1c2VkIGF0IG9uY2UuCkBAIC0xMjMsNyArMTA4LDcgQEAKICAgICBELkRpYWcoZGlhZzo6ZXJyX2Rydl9hcmd1bWVudF9ub3RfYWxsb3dlZF93aXRoKQogICAgICAgPDwgbGFzdEFyZ3VtZW50Rm9yS2luZChELCBBcmdzLCBOZWVkc0xlYWtEZXRlY3Rpb24pCiAgICAgICA8PCBsYXN0QXJndW1lbnRGb3JLaW5kKEQsIEFyZ3MsIE5lZWRzTXNhblJ0KTsKLSAgLy8gRklYTUU6IEN1cnJlbmx5IC1mc2FuaXRpemU9bGVhayBpcyBzaWxlbnRseSBpZ25vcmVkIGluIHRoZSBwcmVzZW5jZSBvZgorICAvLyBGSVhNRTogQ3VycmVudGx5IC1mc2FuaXRpemU9bGVhayBpcyBzaWxlbnRseSBpZ25vcmVkIGluIHRoZSBwcmVzZW5jZSBvZgogICAvLyAtZnNhbml0aXplPWFkZHJlc3MuIFBlcmhhcHMgaXQgc2hvdWxkIHByaW50IGFuIGVycm9yLCBvciBwZXJoYXBzCiAgIC8vIC1mKC1ubylzYW5pdGl6ZT1sZWFrIHNob3VsZCBjaGFuZ2Ugd2hldGhlciBsZWFrIGRldGVjdGlvbiBpcyBlbmFibGVkIGJ5CiAgIC8vIGRlZmF1bHQgaW4gQVNhbj8KQEAgLTE0NCw3ICsxMjksNyBAQAogICAgICAgaWYgKGxsdm06OnN5czo6ZnM6OmV4aXN0cyhCTFBhdGgpKSB7CiAgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBibGFja2xpc3QgZm9ybWF0LgogICAgICAgICBzdGQ6OnN0cmluZyBCTEVycm9yOwotICAgICAgICBsbHZtOjpPd25pbmdQdHI8bGx2bTo6U3BlY2lhbENhc2VMaXN0PiBTQ0woCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpTcGVjaWFsQ2FzZUxpc3Q+IFNDTCgKICAgICAgICAgICAgIGxsdm06OlNwZWNpYWxDYXNlTGlzdDo6Y3JlYXRlKEJMUGF0aCwgQkxFcnJvcikpOwogICAgICAgICBpZiAoIVNDTC5nZXQoKSkKICAgICAgICAgICBELkRpYWcoZGlhZzo6ZXJyX2Rydl9tYWxmb3JtZWRfc2FuaXRpemVyX2JsYWNrbGlzdCkgPDwgQkxFcnJvcjsKQEAgLTE2MywyOCArMTQ4LDM0IEBACiAgICAgICBCbGFja2xpc3RGaWxlID0gQkxQYXRoOwogICB9CiAKLSAgLy8gUGFyc2UgLWYobm8tKXNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zIG9wdGlvbnMuCi0gIGlmIChOZWVkc01zYW4pCi0gICAgTXNhblRyYWNrT3JpZ2lucyA9Ci0gICAgICBBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX2ZzYW5pdGl6ZV9tZW1vcnlfdHJhY2tfb3JpZ2lucywKLSAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX3Nhbml0aXplX21lbW9yeV90cmFja19vcmlnaW5zLAotICAgICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgKi9mYWxzZSk7Ci0KLSAgLy8gUGFyc2UgLWYobm8tKXNhbml0aXplLWFkZHJlc3MtemVyby1iYXNlLXNoYWRvdyBvcHRpb25zLgotICBpZiAoTmVlZHNBc2FuKSB7Ci0gICAgYm9vbCBJc0FuZHJvaWQgPSAoVEMuZ2V0VHJpcGxlKCkuZ2V0RW52aXJvbm1lbnQoKSA9PSBsbHZtOjpUcmlwbGU6OkFuZHJvaWQpOwotICAgIGJvb2wgWmVyb0Jhc2VTaGFkb3dEZWZhdWx0ID0gSXNBbmRyb2lkOwotICAgIEFzYW5aZXJvQmFzZVNoYWRvdyA9Ci0gICAgICAgIEFyZ3MuaGFzRmxhZyhvcHRpb25zOjpPUFRfZnNhbml0aXplX2FkZHJlc3NfemVyb19iYXNlX3NoYWRvdywKLSAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mbm9fc2FuaXRpemVfYWRkcmVzc196ZXJvX2Jhc2Vfc2hhZG93LAotICAgICAgICAgICAgICAgICAgICAgWmVyb0Jhc2VTaGFkb3dEZWZhdWx0KTsKLSAgICAvLyBaZXJvLWJhc2Ugc2hhZG93IGlzIGEgcmVxdWlyZW1lbnQgb24gQW5kcm9pZC4KLSAgICBpZiAoSXNBbmRyb2lkICYmICFBc2FuWmVyb0Jhc2VTaGFkb3cpIHsKLSAgICAgIEQuRGlhZyhkaWFnOjplcnJfZHJ2X2FyZ3VtZW50X25vdF9hbGxvd2VkX3dpdGgpCi0gICAgICAgICAgPDwgIi1mbm8tc2FuaXRpemUtYWRkcmVzcy16ZXJvLWJhc2Utc2hhZG93IgotICAgICAgICAgIDw8IGxhc3RBcmd1bWVudEZvcktpbmQoRCwgQXJncywgQWRkcmVzcyk7CisgIC8vIFBhcnNlIC1mW25vLV1zYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2luc1s9bGV2ZWxdIG9wdGlvbnMuCisgIGlmIChOZWVkc01zYW4pIHsKKyAgICBpZiAoQXJnICpBID0KKyAgICAgICAgICAgIEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfZnNhbml0aXplX21lbW9yeV90cmFja19vcmlnaW5zX0VRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mc2FuaXRpemVfbWVtb3J5X3RyYWNrX29yaWdpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub19zYW5pdGl6ZV9tZW1vcnlfdHJhY2tfb3JpZ2lucykpIHsKKyAgICAgIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9mc2FuaXRpemVfbWVtb3J5X3RyYWNrX29yaWdpbnMpKSB7CisgICAgICAgIE1zYW5UcmFja09yaWdpbnMgPSAxOworICAgICAgfSBlbHNlIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKAorICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub19zYW5pdGl6ZV9tZW1vcnlfdHJhY2tfb3JpZ2lucykpIHsKKyAgICAgICAgTXNhblRyYWNrT3JpZ2lucyA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBTdHJpbmdSZWYgUyA9IEEtPmdldFZhbHVlKCk7CisgICAgICAgIGlmIChTLmdldEFzSW50ZWdlcigwLCBNc2FuVHJhY2tPcmlnaW5zKSB8fCBNc2FuVHJhY2tPcmlnaW5zIDwgMCB8fAorICAgICAgICAgICAgTXNhblRyYWNrT3JpZ2lucyA+IDIpIHsKKyAgICAgICAgICBELkRpYWcoZGlhZzo6ZXJyX2Rydl9pbnZhbGlkX3ZhbHVlKSA8PCBBLT5nZXRBc1N0cmluZyhBcmdzKSA8PCBTOworICAgICAgICB9CisgICAgICB9CiAgICAgfQogICB9CisKKyAgaWYgKE5lZWRzQXNhbikgeworICAgIEFzYW5TaGFyZWRSdW50aW1lID0KKyAgICAgIChUQy5nZXRUcmlwbGUoKS5nZXRFbnZpcm9ubWVudCgpID09IGxsdm06OlRyaXBsZTo6QW5kcm9pZCkgfHwKKyAgICAgIEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zaGFyZWRfbGliYXNhbik7CisgICAgQXNhblplcm9CYXNlU2hhZG93ID0KKyAgICAgICAgKFRDLmdldFRyaXBsZSgpLmdldEVudmlyb25tZW50KCkgPT0gbGx2bTo6VHJpcGxlOjpBbmRyb2lkKTsKKyAgfQogfQogCiB2b2lkIFNhbml0aXplckFyZ3M6OmFkZEFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLApAQCAtMjA1LDExICsxOTYsOCBAQAogICB9CiAKICAgaWYgKE1zYW5UcmFja09yaWdpbnMpCi0gICAgQ21kQXJncy5wdXNoX2JhY2soQXJncy5NYWtlQXJnU3RyaW5nKCItZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zIikpOwotCi0gIGlmIChBc2FuWmVyb0Jhc2VTaGFkb3cpCi0gICAgQ21kQXJncy5wdXNoX2JhY2soCi0gICAgICAgIEFyZ3MuTWFrZUFyZ1N0cmluZygiLWZzYW5pdGl6ZS1hZGRyZXNzLXplcm8tYmFzZS1zaGFkb3ciKSk7CisgICAgQ21kQXJncy5wdXNoX2JhY2soQXJncy5NYWtlQXJnU3RyaW5nKCItZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjp1dG9zdHIoTXNhblRyYWNrT3JpZ2lucykpKTsKIAogICAvLyBXb3JrYXJvdW5kIGZvciBQUjE2Mzg2LgogICBpZiAobmVlZHNNc2FuUnQoKSkKQEAgLTI5NiwyOCArMjg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlJlbW92ZSwgYm9vbCBEaWFnbm9zZUVycm9ycykgewogICBBZGQgPSAwOwogICBSZW1vdmUgPSAwOwotICBjb25zdCBjaGFyICpEZXByZWNhdGVkUmVwbGFjZW1lbnQgPSAwOwotICBpZiAoQS0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZmFkZHJlc3Nfc2FuaXRpemVyKSkgewotICAgIEFkZCA9IEFkZHJlc3M7Ci0gICAgRGVwcmVjYXRlZFJlcGxhY2VtZW50ID0gIi1mc2FuaXRpemU9YWRkcmVzcyI7Ci0gIH0gZWxzZSBpZiAoQS0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZm5vX2FkZHJlc3Nfc2FuaXRpemVyKSkgewotICAgIFJlbW92ZSA9IEFkZHJlc3M7Ci0gICAgRGVwcmVjYXRlZFJlcGxhY2VtZW50ID0gIi1mbm8tc2FuaXRpemU9YWRkcmVzcyI7Ci0gIH0gZWxzZSBpZiAoQS0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZnRocmVhZF9zYW5pdGl6ZXIpKSB7Ci0gICAgQWRkID0gVGhyZWFkOwotICAgIERlcHJlY2F0ZWRSZXBsYWNlbWVudCA9ICItZnNhbml0aXplPXRocmVhZCI7Ci0gIH0gZWxzZSBpZiAoQS0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZm5vX3RocmVhZF9zYW5pdGl6ZXIpKSB7Ci0gICAgUmVtb3ZlID0gVGhyZWFkOwotICAgIERlcHJlY2F0ZWRSZXBsYWNlbWVudCA9ICItZm5vLXNhbml0aXplPXRocmVhZCI7Ci0gIH0gZWxzZSBpZiAoQS0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZmNhdGNoX3VuZGVmaW5lZF9iZWhhdmlvcikpIHsKLSAgICBBZGQgPSBVbmRlZmluZWRUcmFwOwotICAgIERlcHJlY2F0ZWRSZXBsYWNlbWVudCA9Ci0gICAgICAiLWZzYW5pdGl6ZT11bmRlZmluZWQtdHJhcCAtZnNhbml0aXplLXVuZGVmaW5lZC10cmFwLW9uLWVycm9yIjsKLSAgfSBlbHNlIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9mYm91bmRzX2NoZWNraW5nKSB8fAotICAgICAgICAgICAgIEEtPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2Zib3VuZHNfY2hlY2tpbmdfRVEpKSB7Ci0gICAgQWRkID0gTG9jYWxCb3VuZHM7Ci0gICAgRGVwcmVjYXRlZFJlcGxhY2VtZW50ID0gIi1mc2FuaXRpemU9bG9jYWwtYm91bmRzIjsKLSAgfSBlbHNlIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9mc2FuaXRpemVfRVEpKSB7CisgIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9mc2FuaXRpemVfRVEpKSB7CiAgICAgQWRkID0gcGFyc2UoRCwgQSwgRGlhZ25vc2VFcnJvcnMpOwogICB9IGVsc2UgaWYgKEEtPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2Zub19zYW5pdGl6ZV9FUSkpIHsKICAgICBSZW1vdmUgPSBwYXJzZShELCBBLCBEaWFnbm9zZUVycm9ycyk7CkBAIC0zMjUsMTEgKzI5Miw2IEBACiAgICAgLy8gRmxhZyBpcyBub3QgcmVsZXZhbnQgdG8gc2FuaXRpemVycy4KICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgLy8gSWYgdGhpcyBpcyBhIGRlcHJlY2F0ZWQgc3lub255bSwgcHJvZHVjZSBhIHdhcm5pbmcgZGlyZWN0aW5nIHVzZXJzCi0gIC8vIHRvd2FyZHMgdGhlIG5ldyBzcGVsbGluZy4KLSAgaWYgKERlcHJlY2F0ZWRSZXBsYWNlbWVudCAmJiBEaWFnbm9zZUVycm9ycykKLSAgICBELkRpYWcoZGlhZzo6d2Fybl9kcnZfZGVwcmVjYXRlZF9hcmcpCi0gICAgICA8PCBBLT5nZXRBc1N0cmluZyhBcmdzKSA8PCBEZXByZWNhdGVkUmVwbGFjZW1lbnQ7CiAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9saWIvRHJpdmVyL1Rvb2xDaGFpbi5jcHAgYi9saWIvRHJpdmVyL1Rvb2xDaGFpbi5jcHAKaW5kZXggZWZkMzk0NS4uZDE2NGVkZCAxMDA2NDQKLS0tIGEvbGliL0RyaXZlci9Ub29sQ2hhaW4uY3BwCisrKyBiL2xpYi9Ecml2ZXIvVG9vbENoYWluLmNwcApAQCAtMzgsOCArMzgsOCBAQAogfQogCiBib29sIFRvb2xDaGFpbjo6dXNlSW50ZWdyYXRlZEFzKCkgY29uc3QgewotICByZXR1cm4gQXJncy5oYXNGbGFnKG9wdGlvbnM6Ok9QVF9pbnRlZ3JhdGVkX2FzLAotICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9ub19pbnRlZ3JhdGVkX2FzLAorICByZXR1cm4gQXJncy5oYXNGbGFnKG9wdGlvbnM6Ok9QVF9maW50ZWdyYXRlZF9hcywKKyAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX2ludGVncmF0ZWRfYXMsCiAgICAgICAgICAgICAgICAgICAgICAgSXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCgpKTsKIH0KIApAQCAtMTE0LDcgKzExNCw3IEBACiAgIGNhc2UgQWN0aW9uOjpCaW5kQXJjaENsYXNzOgogICBjYXNlIEFjdGlvbjo6TGlwb0pvYkNsYXNzOgogICBjYXNlIEFjdGlvbjo6RHN5bXV0aWxKb2JDbGFzczoKLSAgY2FzZSBBY3Rpb246OlZlcmlmeUpvYkNsYXNzOgorICBjYXNlIEFjdGlvbjo6VmVyaWZ5RGVidWdJbmZvSm9iQ2xhc3M6CiAgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCB0b29sIGtpbmQuIik7CiAKICAgY2FzZSBBY3Rpb246OkNvbXBpbGVKb2JDbGFzczoKQEAgLTEyMiw2ICsxMjIsNyBAQAogICBjYXNlIEFjdGlvbjo6UHJlcHJvY2Vzc0pvYkNsYXNzOgogICBjYXNlIEFjdGlvbjo6QW5hbHl6ZUpvYkNsYXNzOgogICBjYXNlIEFjdGlvbjo6TWlncmF0ZUpvYkNsYXNzOgorICBjYXNlIEFjdGlvbjo6VmVyaWZ5UENISm9iQ2xhc3M6CiAgICAgcmV0dXJuIGdldENsYW5nKCk7CiAgIH0KIApAQCAtMTU0LDEwOSArMTU1LDI3IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBUb29sQ2hhaW46OmlzQ3Jvc3NDb21waWxpbmcoKSBjb25zdCB7CisgIGxsdm06OlRyaXBsZSBIb3N0VHJpcGxlKExMVk1fSE9TVF9UUklQTEUpOworICBzd2l0Y2ggKEhvc3RUcmlwbGUuZ2V0QXJjaCgpKSB7CisgIC8vIFRoZSBBMzIvVDMyL1QxNiBpbnN0cnVjdGlvbiBzZXRzIGFyZSBub3Qgc2VwYXJhdGUgYXJjaGl0ZWN0dXJlcyBpbiB0aGlzCisgIC8vIGNvbnRleHQuCisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm06CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm1lYjoKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OnRodW1iOgorICBjYXNlIGxsdm06OlRyaXBsZTo6dGh1bWJlYjoKKyAgICByZXR1cm4gZ2V0QXJjaCgpICE9IGxsdm06OlRyaXBsZTo6YXJtICYmIGdldEFyY2goKSAhPSBsbHZtOjpUcmlwbGU6OnRodW1iICYmCisgICAgICAgICAgIGdldEFyY2goKSAhPSBsbHZtOjpUcmlwbGU6OmFybWViICYmIGdldEFyY2goKSAhPSBsbHZtOjpUcmlwbGU6OnRodW1iZWI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIEhvc3RUcmlwbGUuZ2V0QXJjaCgpICE9IGdldEFyY2goKTsKKyAgfQorfQorCiBPYmpDUnVudGltZSBUb29sQ2hhaW46OmdldERlZmF1bHRPYmpDUnVudGltZShib29sIGlzTm9uRnJhZ2lsZSkgY29uc3QgewogICByZXR1cm4gT2JqQ1J1bnRpbWUoaXNOb25GcmFnaWxlID8gT2JqQ1J1bnRpbWU6OkdOVXN0ZXAgOiBPYmpDUnVudGltZTo6R0NDLAogICAgICAgICAgICAgICAgICAgICAgVmVyc2lvblR1cGxlKCkpOwogfQogCi0vLy8gZ2V0QVJNVGFyZ2V0Q1BVIC0gR2V0IHRoZSAoTExWTSkgbmFtZSBvZiB0aGUgQVJNIGNwdSB3ZSBhcmUgdGFyZ2V0aW5nLgotLy8KLS8vIEZJWE1FOiB0YmxnZW4gdGhpcy4KLXN0YXRpYyBjb25zdCBjaGFyICpnZXRBUk1UYXJnZXRDUFUoY29uc3QgQXJnTGlzdCAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUpIHsKLSAgLy8gRm9yIERhcndpbiB0YXJnZXRzLCB0aGUgLWFyY2ggb3B0aW9uICh3aGljaCBpcyB0cmFuc2xhdGVkIHRvIGEKLSAgLy8gY29ycmVzcG9uZGluZyAtbWFyY2ggb3B0aW9uKSBzaG91bGQgZGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUKLSAgLy8gKGFuZCB0aGUgTWFjaC1PIHNsaWNlKSByZWdhcmRsZXNzIG9mIGFueSAtbWNwdSBvcHRpb25zLgotICBpZiAoIVRyaXBsZS5pc09TRGFyd2luKCkpIHsKLSAgICAvLyBGSVhNRTogV2FybiBvbiBpbmNvbnNpc3RlbnQgdXNlIG9mIC1tY3B1IGFuZCAtbWFyY2guCi0gICAgLy8gSWYgd2UgaGF2ZSAtbWNwdT0sIHVzZSB0aGF0LgotICAgIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX21jcHVfRVEpKQotICAgICAgcmV0dXJuIEEtPmdldFZhbHVlKCk7Ci0gIH0KLQotICBTdHJpbmdSZWYgTUFyY2g7Ci0gIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX21hcmNoX0VRKSkgewotICAgIC8vIE90aGVyd2lzZSwgaWYgd2UgaGF2ZSAtbWFyY2g9IGNob29zZSB0aGUgYmFzZSBDUFUgZm9yIHRoYXQgYXJjaC4KLSAgICBNQXJjaCA9IEEtPmdldFZhbHVlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gT3RoZXJ3aXNlLCB1c2UgdGhlIEFyY2ggZnJvbSB0aGUgdHJpcGxlLgotICAgIE1BcmNoID0gVHJpcGxlLmdldEFyY2hOYW1lKCk7Ci0gIH0KLQotICBpZiAoVHJpcGxlLmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpOZXRCU0QpIHsKLSAgICBpZiAoTUFyY2ggPT0gImFybXY2IikKLSAgICAgIHJldHVybiAiYXJtMTE3Nmp6Zi1zIjsKLSAgfQotCi0gIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGxsdm06OlN0cmluZ1N3aXRjaDxjb25zdCBjaGFyICo+KE1BcmNoKQotICAgIC5DYXNlcygiYXJtdjIiLCAiYXJtdjJhIiwiYXJtMiIpCi0gICAgLkNhc2UoImFybXYzIiwgImFybTYiKQotICAgIC5DYXNlKCJhcm12M20iLCAiYXJtN20iKQotICAgIC5DYXNlKCJhcm12NCIsICJzdHJvbmdhcm0iKQotICAgIC5DYXNlKCJhcm12NHQiLCAiYXJtN3RkbWkiKQotICAgIC5DYXNlcygiYXJtdjUiLCAiYXJtdjV0IiwgImFybTEwdGRtaSIpCi0gICAgLkNhc2VzKCJhcm12NWUiLCAiYXJtdjV0ZSIsICJhcm0xMDI2ZWpzIikKLSAgICAuQ2FzZSgiYXJtdjV0ZWoiLCAiYXJtOTI2ZWotcyIpCi0gICAgLkNhc2VzKCJhcm12NiIsICJhcm12NmsiLCAiYXJtMTEzNmpmLXMiKQotICAgIC5DYXNlKCJhcm12NmoiLCAiYXJtMTEzNmotcyIpCi0gICAgLkNhc2VzKCJhcm12NnoiLCAiYXJtdjZ6ayIsICJhcm0xMTc2anpmLXMiKQotICAgIC5DYXNlKCJhcm12NnQyIiwgImFybTExNTZ0Mi1zIikKLSAgICAuQ2FzZXMoImFybXY2bSIsICJhcm12Ni1tIiwgImNvcnRleC1tMCIpCi0gICAgLkNhc2VzKCJhcm12NyIsICJhcm12N2EiLCAiYXJtdjctYSIsICJjb3J0ZXgtYTgiKQotICAgIC5DYXNlcygiYXJtdjdsIiwgImFybXY3LWwiLCAiY29ydGV4LWE4IikKLSAgICAuQ2FzZXMoImFybXY3ZiIsICJhcm12Ny1mIiwgImNvcnRleC1hOS1tcCIpCi0gICAgLkNhc2VzKCJhcm12N3MiLCAiYXJtdjctcyIsICJzd2lmdCIpCi0gICAgLkNhc2VzKCJhcm12N3IiLCAiYXJtdjctciIsICJjb3J0ZXgtcjQiKQotICAgIC5DYXNlcygiYXJtdjdtIiwgImFybXY3LW0iLCAiY29ydGV4LW0zIikKLSAgICAuQ2FzZXMoImFybXY3ZW0iLCAiYXJtdjdlLW0iLCAiY29ydGV4LW00IikKLSAgICAuQ2FzZXMoImFybXY4IiwgImFybXY4YSIsICJhcm12OC1hIiwgImNvcnRleC1hNTMiKQotICAgIC5DYXNlKCJlcDkzMTIiLCAiZXA5MzEyIikKLSAgICAuQ2FzZSgiaXdtbXh0IiwgIml3bW14dCIpCi0gICAgLkNhc2UoInhzY2FsZSIsICJ4c2NhbGUiKQotICAgIC8vIElmIGFsbCBlbHNlIGZhaWxlZCwgcmV0dXJuIHRoZSBtb3N0IGJhc2UgQ1BVIHdpdGggdGh1bWIgaW50ZXJ3b3JraW5nCi0gICAgLy8gc3VwcG9ydGVkIGJ5IExMVk0uCi0gICAgLkRlZmF1bHQoMCk7Ci0KLSAgaWYgKHJlc3VsdCkKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIHJldHVybgotICAgIFRyaXBsZS5nZXRFbnZpcm9ubWVudCgpID09IGxsdm06OlRyaXBsZTo6R05VRUFCSUhGCi0gICAgICA/ICJhcm0xMTc2anpmLXMiCi0gICAgICA6ICJhcm03dGRtaSI7Ci19Ci0KLS8vLyBnZXRMTFZNQXJjaFN1ZmZpeEZvckFSTSAtIEdldCB0aGUgTExWTSBhcmNoIG5hbWUgdG8gdXNlIGZvciBhIHBhcnRpY3VsYXIKLS8vLyBDUFUuCi0vLwotLy8gRklYTUU6IFRoaXMgaXMgcmVkdW5kYW50IHdpdGggLW1jcHUsIHdoeSBkb2VzIExMVk0gdXNlIHRoaXMuCi0vLyBGSVhNRTogdGJsZ2VuIHRoaXMsIG9yIGtpbGwgaXQhCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0TExWTUFyY2hTdWZmaXhGb3JBUk0oU3RyaW5nUmVmIENQVSkgewotICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGNvbnN0IGNoYXIgKj4oQ1BVKQotICAgIC5DYXNlKCJzdHJvbmdhcm0iLCAidjQiKQotICAgIC5DYXNlcygiYXJtN3RkbWkiLCAiYXJtN3RkbWktcyIsICJhcm03MTB0IiwgInY0dCIpCi0gICAgLkNhc2VzKCJhcm03MjB0IiwgImFybTkiLCAiYXJtOXRkbWkiLCAidjR0IikKLSAgICAuQ2FzZXMoImFybTkyMCIsICJhcm05MjB0IiwgImFybTkyMnQiLCAidjR0IikKLSAgICAuQ2FzZXMoImFybTk0MHQiLCAiZXA5MzEyIiwidjR0IikKLSAgICAuQ2FzZXMoImFybTEwdGRtaSIsICAiYXJtMTAyMHQiLCAidjUiKQotICAgIC5DYXNlcygiYXJtOWUiLCAgImFybTkyNmVqLXMiLCAgImFybTk0NmUtcyIsICJ2NWUiKQotICAgIC5DYXNlcygiYXJtOTY2ZS1zIiwgICJhcm05NjhlLXMiLCAgImFybTEwZSIsICJ2NWUiKQotICAgIC5DYXNlcygiYXJtMTAyMGUiLCAgImFybTEwMjJlIiwgICJ4c2NhbGUiLCAiaXdtbXh0IiwgInY1ZSIpCi0gICAgLkNhc2VzKCJhcm0xMTM2ai1zIiwgICJhcm0xMTM2amYtcyIsICAiYXJtMTE3Nmp6LXMiLCAidjYiKQotICAgIC5DYXNlcygiYXJtMTE3Nmp6Zi1zIiwgICJtcGNvcmVub3ZmcCIsICAibXBjb3JlIiwgInY2IikKLSAgICAuQ2FzZXMoImFybTExNTZ0Mi1zIiwgICJhcm0xMTU2dDJmLXMiLCAidjZ0MiIpCi0gICAgLkNhc2VzKCJjb3J0ZXgtYTUiLCAiY29ydGV4LWE3IiwgImNvcnRleC1hOCIsICJ2NyIpCi0gICAgLkNhc2VzKCJjb3J0ZXgtYTkiLCAiY29ydGV4LWExMiIsICJjb3J0ZXgtYTE1IiwgInY3IikKLSAgICAuQ2FzZXMoImNvcnRleC1yNCIsICJjb3J0ZXgtcjUiLCAidjdyIikKLSAgICAuQ2FzZSgiY29ydGV4LW0wIiwgInY2bSIpCi0gICAgLkNhc2UoImNvcnRleC1tMyIsICJ2N20iKQotICAgIC5DYXNlKCJjb3J0ZXgtbTQiLCAidjdlbSIpCi0gICAgLkNhc2UoImNvcnRleC1hOS1tcCIsICJ2N2YiKQotICAgIC5DYXNlKCJzd2lmdCIsICJ2N3MiKQotICAgIC5DYXNlcygiY29ydGV4LWE1MyIsICJjb3J0ZXgtYTU3IiwgInY4IikKLSAgICAuRGVmYXVsdCgiIik7Ci19Ci0KIHN0ZDo6c3RyaW5nIFRvb2xDaGFpbjo6Q29tcHV0ZUxMVk1UcmlwbGUoY29uc3QgQXJnTGlzdCAmQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM6OklEIElucHV0VHlwZSkgY29uc3QgewogICBzd2l0Y2ggKGdldFRyaXBsZSgpLmdldEFyY2goKSkgewpAQCAtMjY1LDcgKzE4NCw3IEBACiAKICAgY2FzZSBsbHZtOjpUcmlwbGU6Ong4Nl82NDogewogICAgIGxsdm06OlRyaXBsZSBUcmlwbGUgPSBnZXRUcmlwbGUoKTsKLSAgICBpZiAoIVRyaXBsZS5pc09TRGFyd2luKCkpCisgICAgaWYgKCFUcmlwbGUuaXNPU0JpbkZvcm1hdE1hY2hPKCkpCiAgICAgICByZXR1cm4gZ2V0VHJpcGxlU3RyaW5nKCk7CiAKICAgICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tYXJjaF9FUSkpIHsKQEAgLTI3OCwyMyArMTk3LDM4IEBACiAgICAgcmV0dXJuIFRyaXBsZS5nZXRUcmlwbGUoKTsKICAgfQogICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtOgotICBjYXNlIGxsdm06OlRyaXBsZTo6dGh1bWI6IHsKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OmFybWViOgorICBjYXNlIGxsdm06OlRyaXBsZTo6dGh1bWI6CisgIGNhc2UgbGx2bTo6VHJpcGxlOjp0aHVtYmViOiB7CiAgICAgLy8gRklYTUU6IEZhY3RvciBpbnRvIHN1YmNsYXNzZXMuCiAgICAgbGx2bTo6VHJpcGxlIFRyaXBsZSA9IGdldFRyaXBsZSgpOworICAgIGJvb2wgSXNCaWdFbmRpYW4gPSBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm1lYiB8fAorICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYmViOwogCiAgICAgLy8gVGh1bWIyIGlzIHRoZSBkZWZhdWx0IGZvciBWNyBvbiBEYXJ3aW4uCiAgICAgLy8KICAgICAvLyBGSVhNRTogVGh1bWIgc2hvdWxkIGp1c3QgYmUgYW5vdGhlciAtdGFyZ2V0LWZlYXVyZSwgbm90IGluIHRoZSB0cmlwbGUuCi0gICAgU3RyaW5nUmVmIFN1ZmZpeCA9Ci0gICAgICBnZXRMTFZNQXJjaFN1ZmZpeEZvckFSTShnZXRBUk1UYXJnZXRDUFUoQXJncywgVHJpcGxlKSk7Ci0gICAgYm9vbCBUaHVtYkRlZmF1bHQgPSBTdWZmaXguc3RhcnRzd2l0aCgidjZtIikgfHwKLSAgICAgIChTdWZmaXguc3RhcnRzd2l0aCgidjciKSAmJiBnZXRUcmlwbGUoKS5pc09TRGFyd2luKCkpOwotICAgIHN0ZDo6c3RyaW5nIEFyY2hOYW1lID0gImFybSI7CisgICAgU3RyaW5nUmVmIFN1ZmZpeCA9IFRyaXBsZS5pc09TQmluRm9ybWF0TWFjaE8oKQorICAgICAgPyB0b29sczo6YXJtOjpnZXRMTFZNQXJjaFN1ZmZpeEZvckFSTSh0b29sczo6YXJtOjpnZXRBUk1DUFVGb3JNQXJjaChBcmdzLCBUcmlwbGUpKQorICAgICAgOiB0b29sczo6YXJtOjpnZXRMTFZNQXJjaFN1ZmZpeEZvckFSTSh0b29sczo6YXJtOjpnZXRBUk1UYXJnZXRDUFUoQXJncywgVHJpcGxlKSk7CisgICAgYm9vbCBUaHVtYkRlZmF1bHQgPSBTdWZmaXguc3RhcnRzd2l0aCgidjZtIikgfHwgU3VmZml4LnN0YXJ0c3dpdGgoInY3bSIpIHx8CisgICAgICBTdWZmaXguc3RhcnRzd2l0aCgidjdlbSIpIHx8CisgICAgICAoU3VmZml4LnN0YXJ0c3dpdGgoInY3IikgJiYgZ2V0VHJpcGxlKCkuaXNPU0JpbkZvcm1hdE1hY2hPKCkpOworICAgIHN0ZDo6c3RyaW5nIEFyY2hOYW1lOworICAgIGlmIChJc0JpZ0VuZGlhbikKKyAgICAgIEFyY2hOYW1lID0gImFybWViIjsKKyAgICBlbHNlCisgICAgICBBcmNoTmFtZSA9ICJhcm0iOwogCiAgICAgLy8gQXNzZW1ibHkgZmlsZXMgc2hvdWxkIHN0YXJ0IGluIEFSTSBtb2RlLgogICAgIGlmIChJbnB1dFR5cGUgIT0gdHlwZXM6OlRZX1BQX0FzbSAmJgogICAgICAgICBBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX210aHVtYiwgb3B0aW9uczo6T1BUX21ub190aHVtYiwgVGh1bWJEZWZhdWx0KSkKLSAgICAgIEFyY2hOYW1lID0gInRodW1iIjsKKyAgICB7CisgICAgICBpZiAoSXNCaWdFbmRpYW4pCisgICAgICAgIEFyY2hOYW1lID0gInRodW1iZWIiOworICAgICAgZWxzZQorICAgICAgICBBcmNoTmFtZSA9ICJ0aHVtYiI7CisgICAgfQogICAgIFRyaXBsZS5zZXRBcmNoTmFtZShBcmNoTmFtZSArIFN1ZmZpeC5zdHIoKSk7CiAKICAgICByZXR1cm4gVHJpcGxlLmdldFRyaXBsZSgpOwpAQCAtMzA0LDEzICsyMzgsNiBAQAogCiBzdGQ6OnN0cmluZyBUb29sQ2hhaW46OkNvbXB1dGVFZmZlY3RpdmVDbGFuZ1RyaXBsZShjb25zdCBBcmdMaXN0ICZBcmdzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzOjpJRCBJbnB1dFR5cGUpIGNvbnN0IHsKLSAgLy8gRGlhZ25vc2UgdXNlIG9mIERhcndpbiBPUyBkZXBsb3ltZW50IHRhcmdldCBhcmd1bWVudHMgb24gbm9uLURhcndpbi4KLSAgaWYgKEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfbW1hY29zeF92ZXJzaW9uX21pbl9FUSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfbWlwaG9uZW9zX3ZlcnNpb25fbWluX0VRLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9taW9zX3NpbXVsYXRvcl92ZXJzaW9uX21pbl9FUSkpCi0gICAgZ2V0RHJpdmVyKCkuRGlhZyhkaWFnOjplcnJfZHJ2X2NsYW5nX3Vuc3VwcG9ydGVkKQotICAgICAgPDwgQS0+Z2V0QXNTdHJpbmcoQXJncyk7Ci0KICAgcmV0dXJuIENvbXB1dGVMTFZNVHJpcGxlKEFyZ3MsIElucHV0VHlwZSk7CiB9CiAKQEAgLTMyMyw2ICsyNTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdCB7CiB9CiAKK3ZvaWQgVG9vbENoYWluOjphZGRDbGFuZ1dhcm5pbmdPcHRpb25zKEFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0IHt9CisKIFRvb2xDaGFpbjo6UnVudGltZUxpYlR5cGUgVG9vbENoYWluOjpHZXRSdW50aW1lTGliVHlwZSgKICAgY29uc3QgQXJnTGlzdCAmQXJncykgY29uc3QKIHsKQEAgLTQzMCwxNiArMzU5LDE5IEBACiAKIGJvb2wgVG9vbENoYWluOjpBZGRGYXN0TWF0aFJ1bnRpbWVJZkF2YWlsYWJsZShjb25zdCBBcmdMaXN0ICZBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IHsKLSAgLy8gQ2hlY2sgaWYgLWZmYXN0LW1hdGggb3IgLWZ1bnNhZmUtbWF0aCBpcyBlbmFibGVkLgotICBBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2ZmYXN0X21hdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX2Zhc3RfbWF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mdW5zYWZlX21hdGhfb3B0aW1pemF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mbm9fdW5zYWZlX21hdGhfb3B0aW1pemF0aW9ucyk7CisgIC8vIERvIG5vdCBjaGVjayBmb3IgLWZuby1mYXN0LW1hdGggb3IgLWZuby11bnNhZmUtbWF0aCB3aGVuIC1PZmFzdCBwYXNzZWQKKyAgLy8gKHRvIGtlZXAgdGhlIGxpbmtlciBvcHRpb25zIGNvbnNpc3RlbnQgd2l0aCBnY2MgYW5kIGNsYW5nIGl0c2VsZikuCisgIGlmICghaXNPcHRpbWl6YXRpb25MZXZlbEZhc3QoQXJncykpIHsKKyAgICAvLyBDaGVjayBpZiAtZmZhc3QtbWF0aCBvciAtZnVuc2FmZS1tYXRoLgorICAgIEFyZyAqQSA9CisgICAgICAgIEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfZmZhc3RfbWF0aCwgb3B0aW9uczo6T1BUX2Zub19mYXN0X21hdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZnVuc2FmZV9tYXRoX29wdGltaXphdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX3Vuc2FmZV9tYXRoX29wdGltaXphdGlvbnMpOwogCi0gIGlmICghQSB8fCBBLT5nZXRPcHRpb24oKS5nZXRJRCgpID09IG9wdGlvbnM6Ok9QVF9mbm9fZmFzdF9tYXRoIHx8Ci0gICAgICBBLT5nZXRPcHRpb24oKS5nZXRJRCgpID09IG9wdGlvbnM6Ok9QVF9mbm9fdW5zYWZlX21hdGhfb3B0aW1pemF0aW9ucykKLSAgICByZXR1cm4gZmFsc2U7Ci0KKyAgICBpZiAoIUEgfHwgQS0+Z2V0T3B0aW9uKCkuZ2V0SUQoKSA9PSBvcHRpb25zOjpPUFRfZm5vX2Zhc3RfbWF0aCB8fAorICAgICAgICBBLT5nZXRPcHRpb24oKS5nZXRJRCgpID09IG9wdGlvbnM6Ok9QVF9mbm9fdW5zYWZlX21hdGhfb3B0aW1pemF0aW9ucykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQogICAvLyBJZiBjcnRmYXN0bWF0aC5vIGV4aXN0cyBhZGQgaXQgdG8gdGhlIGFyZ3VtZW50cy4KICAgc3RkOjpzdHJpbmcgUGF0aCA9IEdldEZpbGVQYXRoKCJjcnRmYXN0bWF0aC5vIik7CiAgIGlmIChQYXRoID09ICJjcnRmYXN0bWF0aC5vIikgLy8gTm90IGZvdW5kLgpkaWZmIC0tZ2l0IGEvbGliL0RyaXZlci9Ub29sQ2hhaW5zLmNwcCBiL2xpYi9Ecml2ZXIvVG9vbENoYWlucy5jcHAKaW5kZXggZTU1MjhmMC4uYzFmN2NjYyAxMDA2NDQKLS0tIGEvbGliL0RyaXZlci9Ub29sQ2hhaW5zLmNwcAorKysgYi9saWIvRHJpdmVyL1Rvb2xDaGFpbnMuY3BwCkBAIC0yNyw5ICsyNyw5IEBACiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdGguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJvZ3JhbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9zeXN0ZW1fZXJyb3IuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJvZ3JhbS5oIgogCiAvLyBGSVhNRTogVGhpcyBuZWVkcyB0byBiZSBsaXN0ZWQgbGFzdCB1bnRpbCB3ZSBmaXggdGhlIGJyb2tlbiBpbmNsdWRlIGd1YXJkcwogLy8gaW4gdGhlc2UgZmlsZXMgYW5kIHRoZSBMTFZNIGNvbmZpZy5oIGZpbGVzLgpAQCAtNDIsMTEgKzQyLDE1IEBACiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiB1c2luZyBuYW1lc3BhY2UgbGx2bTo6b3B0OwogCi0vLy8gRGFyd2luIC0gRGFyd2luIHRvb2wgY2hhaW4gZm9yIGkzODYgYW5kIHg4Nl82NC4KK01hY2hPOjpNYWNoTyhjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmdMaXN0ICZBcmdzKQorICA6IFRvb2xDaGFpbihELCBUcmlwbGUsIEFyZ3MpIHsKK30KIAotRGFyd2luOjpEYXJ3aW4oY29uc3QgRHJpdmVyICZELCBjb25zdCBsbHZtOjpUcmlwbGUmIFRyaXBsZSwgY29uc3QgQXJnTGlzdCAmQXJncykKLSAgOiBUb29sQ2hhaW4oRCwgVHJpcGxlLCBBcmdzKSwgVGFyZ2V0SW5pdGlhbGl6ZWQoZmFsc2UpCi17CisvLy8gRGFyd2luIC0gRGFyd2luIHRvb2wgY2hhaW4gZm9yIGkzODYgYW5kIHg4Nl82NC4KK0Rhcndpbjo6RGFyd2luKGNvbnN0IERyaXZlciAmIEQsIGNvbnN0IGxsdm06OlRyaXBsZSAmIFRyaXBsZSwKKyAgICAgICAgICAgICAgIGNvbnN0IEFyZ0xpc3QgJiBBcmdzKQorICA6IE1hY2hPKEQsIFRyaXBsZSwgQXJncyksIFRhcmdldEluaXRpYWxpemVkKGZhbHNlKSB7CiAgIC8vIENvbXB1dGUgdGhlIGluaXRpYWwgRGFyd2luIHZlcnNpb24gZnJvbSB0aGUgdHJpcGxlCiAgIHVuc2lnbmVkIE1ham9yLCBNaW5vciwgTWljcm87CiAgIGlmICghVHJpcGxlLmdldE1hY09TWFZlcnNpb24oTWFqb3IsIE1pbm9yLCBNaWNybykpCkBAIC02Nyw3ICs3MSw3IEBACiAgICAgPDwgTWFqb3IgPDwgJy4nIDw8IE1pbm9yIDw8ICcuJyA8PCBNaWNybzsKIH0KIAotdHlwZXM6OklEIERhcndpbjo6TG9va3VwVHlwZUZvckV4dGVuc2lvbihjb25zdCBjaGFyICpFeHQpIGNvbnN0IHsKK3R5cGVzOjpJRCBNYWNoTzo6TG9va3VwVHlwZUZvckV4dGVuc2lvbihjb25zdCBjaGFyICpFeHQpIGNvbnN0IHsKICAgdHlwZXM6OklEIFR5ID0gdHlwZXM6Omxvb2t1cFR5cGVGb3JFeHRlbnNpb24oRXh0KTsKIAogICAvLyBEYXJ3aW4gYWx3YXlzIHByZXByb2Nlc3NlcyBhc3NlbWJseSBmaWxlcyAodW5sZXNzIC14IGlzIHVzZWQgZXhwbGljaXRseSkuCkBAIC03NywxMyArODEsMTMgQEAKICAgcmV0dXJuIFR5OwogfQogCi1ib29sIERhcndpbjo6SGFzTmF0aXZlTExWTVN1cHBvcnQoKSBjb25zdCB7Citib29sIE1hY2hPOjpIYXNOYXRpdmVMTFZNU3VwcG9ydCgpIGNvbnN0IHsKICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vLyBEYXJ3aW4gcHJvdmlkZXMgYW4gQVJDIHJ1bnRpbWUgc3RhcnRpbmcgaW4gTWFjT1MgWCAxMC43IGFuZCBpT1MgNS4wLgogT2JqQ1J1bnRpbWUgRGFyd2luOjpnZXREZWZhdWx0T2JqQ1J1bnRpbWUoYm9vbCBpc05vbkZyYWdpbGUpIGNvbnN0IHsKLSAgaWYgKGlzVGFyZ2V0SVBob25lT1MoKSkKKyAgaWYgKGlzVGFyZ2V0SU9TQmFzZWQoKSkKICAgICByZXR1cm4gT2JqQ1J1bnRpbWUoT2JqQ1J1bnRpbWU6OmlPUywgVGFyZ2V0VmVyc2lvbik7CiAgIGlmIChpc05vbkZyYWdpbGUpCiAgICAgcmV0dXJuIE9iakNSdW50aW1lKE9iakNSdW50aW1lOjpNYWNPU1gsIFRhcmdldFZlcnNpb24pOwpAQCAtOTIsMTAgKzk2LDEyIEBACiAKIC8vLyBEYXJ3aW4gcHJvdmlkZXMgYSBibG9ja3MgcnVudGltZSBzdGFydGluZyBpbiBNYWNPUyBYIDEwLjYgYW5kIGlPUyAzLjIuCiBib29sIERhcndpbjo6aGFzQmxvY2tzUnVudGltZSgpIGNvbnN0IHsKLSAgaWYgKGlzVGFyZ2V0SVBob25lT1MoKSkKKyAgaWYgKGlzVGFyZ2V0SU9TQmFzZWQoKSkKICAgICByZXR1cm4gIWlzSVBob25lT1NWZXJzaW9uTFQoMywgMik7Ci0gIGVsc2UKKyAgZWxzZSB7CisgICAgYXNzZXJ0KGlzVGFyZ2V0TWFjT1MoKSAmJiAidW5leHBlY3RlZCBkYXJ3aW4gdGFyZ2V0Iik7CiAgICAgcmV0dXJuICFpc01hY29zeFZlcnNpb25MVCgxMCwgNik7CisgIH0KIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKkdldEFybUFyY2hGb3JNQXJjaChTdHJpbmdSZWYgVmFsdWUpIHsKQEAgLTEwOSw3ICsxMTUsNiBAQAogICAgIC5DYXNlcygiYXJtdjdhIiwgImFybXY3LWEiLCAiYXJtdjciKQogICAgIC5DYXNlcygiYXJtdjdyIiwgImFybXY3LXIiLCAiYXJtdjciKQogICAgIC5DYXNlcygiYXJtdjdlbSIsICJhcm12N2UtbSIsICJhcm12N2VtIikKLSAgICAuQ2FzZXMoImFybXY3ZiIsICJhcm12Ny1mIiwgImFybXY3ZiIpCiAgICAgLkNhc2VzKCJhcm12N2siLCAiYXJtdjctayIsICJhcm12N2siKQogICAgIC5DYXNlcygiYXJtdjdtIiwgImFybXY3LW0iLCAiYXJtdjdtIikKICAgICAuQ2FzZXMoImFybXY3cyIsICJhcm12Ny1zIiwgImFybXY3cyIpCkBAIC0xMjQsMTcgKzEyOSwyNyBAQAogICAgIC5DYXNlKCJ4c2NhbGUiLCAieHNjYWxlIikKICAgICAuQ2FzZXMoImFybTExMzZqLXMiLCAiYXJtMTEzNmpmLXMiLCAiYXJtMTE3Nmp6LXMiLCAiYXJtMTE3Nmp6Zi1zIiwgImFybXY2IikKICAgICAuQ2FzZSgiY29ydGV4LW0wIiwgImFybXY2bSIpCi0gICAgLkNhc2VzKCJjb3J0ZXgtYTUiLCAiY29ydGV4LWE3IiwgImNvcnRleC1hOCIsICJhcm12NyIpCi0gICAgLkNhc2VzKCJjb3J0ZXgtYTkiLCAiY29ydGV4LWExMiIsICJjb3J0ZXgtYTE1IiwgImFybXY3IikKKyAgICAuQ2FzZXMoImNvcnRleC1hNSIsICJjb3J0ZXgtYTciLCAiY29ydGV4LWE4IiwgImNvcnRleC1hOS1tcCIsICJhcm12NyIpCisgICAgLkNhc2VzKCJjb3J0ZXgtYTkiLCAiY29ydGV4LWExMiIsICJjb3J0ZXgtYTE1IiwgImtyYWl0IiwgImFybXY3IikKICAgICAuQ2FzZXMoImNvcnRleC1yNCIsICJjb3J0ZXgtcjUiLCAiYXJtdjdyIikKLSAgICAuQ2FzZSgiY29ydGV4LWE5LW1wIiwgImFybXY3ZiIpCiAgICAgLkNhc2UoImNvcnRleC1tMyIsICJhcm12N20iKQogICAgIC5DYXNlKCJjb3J0ZXgtbTQiLCAiYXJtdjdlbSIpCiAgICAgLkNhc2UoInN3aWZ0IiwgImFybXY3cyIpCiAgICAgLkRlZmF1bHQoMCk7CiB9CiAKLVN0cmluZ1JlZiBEYXJ3aW46OmdldERhcndpbkFyY2hOYW1lKGNvbnN0IEFyZ0xpc3QgJkFyZ3MpIGNvbnN0IHsKK3N0YXRpYyBib29sIGlzU29mdEZsb2F0QUJJKGNvbnN0IEFyZ0xpc3QgJkFyZ3MpIHsKKyAgQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tc29mdF9mbG9hdCwgb3B0aW9uczo6T1BUX21oYXJkX2Zsb2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX21mbG9hdF9hYmlfRVEpOworICBpZiAoIUEpCisgICAgcmV0dXJuIGZhbHNlOworIAorICByZXR1cm4gQS0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfbXNvZnRfZmxvYXQpIHx8CisgICAgICAgICAoQS0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfbWZsb2F0X2FiaV9FUSkgJiYKKyAgICAgICAgICBBLT5nZXRWYWx1ZSgpID09IFN0cmluZ1JlZigic29mdCIpKTsKK30KKworU3RyaW5nUmVmIE1hY2hPOjpnZXRNYWNoT0FyY2hOYW1lKGNvbnN0IEFyZ0xpc3QgJkFyZ3MpIGNvbnN0IHsKICAgc3dpdGNoIChnZXRUcmlwbGUoKS5nZXRBcmNoKCkpIHsKICAgZGVmYXVsdDoKICAgICByZXR1cm4gZ2V0QXJjaE5hbWUoKTsKQEAgLTE1Nyw2ICsxNzIsMTcgQEAKIERhcndpbjo6fkRhcndpbigpIHsKIH0KIAorTWFjaE86On5NYWNoTygpIHsKK30KKworCitzdGQ6OnN0cmluZyBNYWNoTzo6Q29tcHV0ZUVmZmVjdGl2ZUNsYW5nVHJpcGxlKGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM6OklEIElucHV0VHlwZSkgY29uc3QgeworICBsbHZtOjpUcmlwbGUgVHJpcGxlKENvbXB1dGVMTFZNVHJpcGxlKEFyZ3MsIElucHV0VHlwZSkpOworCisgIHJldHVybiBUcmlwbGUuZ2V0VHJpcGxlKCk7Cit9CisKIHN0ZDo6c3RyaW5nIERhcndpbjo6Q29tcHV0ZUVmZmVjdGl2ZUNsYW5nVHJpcGxlKGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlczo6SUQgSW5wdXRUeXBlKSBjb25zdCB7CiAgIGxsdm06OlRyaXBsZSBUcmlwbGUoQ29tcHV0ZUxMVk1UcmlwbGUoQXJncywgSW5wdXRUeXBlKSk7CkBAIC0xNjYsMjUgKzE5MiwxNyBAQAogICBpZiAoIWlzVGFyZ2V0SW5pdGlhbGl6ZWQoKSkKICAgICByZXR1cm4gVHJpcGxlLmdldFRyaXBsZSgpOwogCi0gIGlmIChUcmlwbGUuZ2V0QXJjaE5hbWUoKSA9PSAidGh1bWJ2Nm0iIHx8Ci0gICAgICBUcmlwbGUuZ2V0QXJjaE5hbWUoKSA9PSAidGh1bWJ2N20iIHx8Ci0gICAgICBUcmlwbGUuZ2V0QXJjaE5hbWUoKSA9PSAidGh1bWJ2N2VtIikgewotICAgIC8vIE9TIGlzIGlvcyBvciBtYWNvc3ggdW5sZXNzIGl0J3MgdGhlIHY2bSBvciB2N20uCi0gICAgVHJpcGxlLnNldE9TKGxsdm06OlRyaXBsZTo6RGFyd2luKTsKLSAgICBUcmlwbGUuc2V0RW52aXJvbm1lbnQobGx2bTo6VHJpcGxlOjpFQUJJKTsKLSAgfSBlbHNlIHsKLSAgICBTbWFsbFN0cmluZzwxNj4gU3RyOwotICAgIFN0ciArPSBpc1RhcmdldElQaG9uZU9TKCkgPyAiaW9zIiA6ICJtYWNvc3giOwotICAgIFN0ciArPSBnZXRUYXJnZXRWZXJzaW9uKCkuZ2V0QXNTdHJpbmcoKTsKLSAgICBUcmlwbGUuc2V0T1NOYW1lKFN0cik7Ci0gIH0KKyAgU21hbGxTdHJpbmc8MTY+IFN0cjsKKyAgU3RyICs9IGlzVGFyZ2V0SU9TQmFzZWQoKSA/ICJpb3MiIDogIm1hY29zeCI7CisgIFN0ciArPSBnZXRUYXJnZXRWZXJzaW9uKCkuZ2V0QXNTdHJpbmcoKTsKKyAgVHJpcGxlLnNldE9TTmFtZShTdHIpOwogCiAgIHJldHVybiBUcmlwbGUuZ2V0VHJpcGxlKCk7CiB9CiAKIHZvaWQgR2VuZXJpY19FTEY6OmFuY2hvcigpIHt9CiAKLVRvb2wgKkRhcndpbjo6Z2V0VG9vbChBY3Rpb246OkFjdGlvbkNsYXNzIEFDKSBjb25zdCB7CitUb29sICpNYWNoTzo6Z2V0VG9vbChBY3Rpb246OkFjdGlvbkNsYXNzIEFDKSBjb25zdCB7CiAgIHN3aXRjaCAoQUMpIHsKICAgY2FzZSBBY3Rpb246OkxpcG9Kb2JDbGFzczoKICAgICBpZiAoIUxpcG8pCkBAIC0xOTQsNyArMjEyLDcgQEAKICAgICBpZiAoIURzeW11dGlsKQogICAgICAgRHN5bXV0aWwucmVzZXQobmV3IHRvb2xzOjpkYXJ3aW46OkRzeW11dGlsKCp0aGlzKSk7CiAgICAgcmV0dXJuIERzeW11dGlsLmdldCgpOwotICBjYXNlIEFjdGlvbjo6VmVyaWZ5Sm9iQ2xhc3M6CisgIGNhc2UgQWN0aW9uOjpWZXJpZnlEZWJ1Z0luZm9Kb2JDbGFzczoKICAgICBpZiAoIVZlcmlmeURlYnVnKQogICAgICAgVmVyaWZ5RGVidWcucmVzZXQobmV3IHRvb2xzOjpkYXJ3aW46OlZlcmlmeURlYnVnKCp0aGlzKSk7CiAgICAgcmV0dXJuIFZlcmlmeURlYnVnLmdldCgpOwpAQCAtMjAzLDE4ICsyMjEsMTcgQEAKICAgfQogfQogCi1Ub29sICpEYXJ3aW46OmJ1aWxkTGlua2VyKCkgY29uc3QgeworVG9vbCAqTWFjaE86OmJ1aWxkTGlua2VyKCkgY29uc3QgewogICByZXR1cm4gbmV3IHRvb2xzOjpkYXJ3aW46OkxpbmsoKnRoaXMpOwogfQogCi1Ub29sICpEYXJ3aW46OmJ1aWxkQXNzZW1ibGVyKCkgY29uc3QgeworVG9vbCAqTWFjaE86OmJ1aWxkQXNzZW1ibGVyKCkgY29uc3QgewogICByZXR1cm4gbmV3IHRvb2xzOjpkYXJ3aW46OkFzc2VtYmxlKCp0aGlzKTsKIH0KIAogRGFyd2luQ2xhbmc6OkRhcndpbkNsYW5nKGNvbnN0IERyaXZlciAmRCwgY29uc3QgbGx2bTo6VHJpcGxlJiBUcmlwbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnTGlzdCAmQXJncykKLSAgOiBEYXJ3aW4oRCwgVHJpcGxlLCBBcmdzKQoteworICA6IERhcndpbihELCBUcmlwbGUsIEFyZ3MpIHsKICAgZ2V0UHJvZ3JhbVBhdGhzKCkucHVzaF9iYWNrKGdldERyaXZlcigpLmdldEluc3RhbGxlZERpcigpKTsKICAgaWYgKGdldERyaXZlcigpLmdldEluc3RhbGxlZERpcigpICE9IGdldERyaXZlcigpLkRpcikKICAgICBnZXRQcm9ncmFtUGF0aHMoKS5wdXNoX2JhY2soZ2V0RHJpdmVyKCkuRGlyKTsKQEAgLTIyNSw4ICsyNDIsMzcgQEAKICAgICBnZXRQcm9ncmFtUGF0aHMoKS5wdXNoX2JhY2soZ2V0RHJpdmVyKCkuRGlyKTsKIH0KIAordm9pZCBEYXJ3aW5DbGFuZzo6YWRkQ2xhbmdXYXJuaW5nT3B0aW9ucyhBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdCB7CisgIC8vIEZvciBpT1MsIDY0LWJpdCwgcHJvbW90ZSBjZXJ0YWluIHdhcm5pbmdzIHRvIGVycm9ycy4KKyAgaWYgKCFpc1RhcmdldE1hY09TKCkgJiYgZ2V0VHJpcGxlKCkuaXNBcmNoNjRCaXQoKSkgeworICAgIC8vIEFsd2F5cyBlbmFibGUgLVdkZXByZWNhdGVkLW9iamMtaXNhLXVzYWdlIGFuZCBwcm9tb3RlIGl0CisgICAgLy8gdG8gYW4gZXJyb3IuCisgICAgQ0MxQXJncy5wdXNoX2JhY2soIi1XZGVwcmVjYXRlZC1vYmpjLWlzYS11c2FnZSIpOworICAgIENDMUFyZ3MucHVzaF9iYWNrKCItV2Vycm9yPWRlcHJlY2F0ZWQtb2JqYy1pc2EtdXNhZ2UiKTsKKworICAgIC8vIEFsc28gZXJyb3IgYWJvdXQgaW1wbGljaXQgZnVuY3Rpb24gZGVjbGFyYXRpb25zLCBhcyB0aGF0CisgICAgLy8gY2FuIGltcGFjdCBjYWxsaW5nIGNvbnZlbnRpb25zLgorICAgIENDMUFyZ3MucHVzaF9iYWNrKCItV2Vycm9yPWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uIik7CisgIH0KK30KKworLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBPYmplY3RpdmUtQyBhdXRvbWF0ZWQgcmVmZXJlbmNlIGNvdW50aW5nIGlzCisvLy8gZW5hYmxlZC4KK3N0YXRpYyBib29sIGlzT2JqQ0F1dG9SZWZDb3VudChjb25zdCBBcmdMaXN0ICZBcmdzKSB7CisgIHJldHVybiBBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX2ZvYmpjX2FyYywgb3B0aW9uczo6T1BUX2Zub19vYmpjX2FyYywgZmFsc2UpOworfQorCiB2b2lkIERhcndpbkNsYW5nOjpBZGRMaW5rQVJDQXJncyhjb25zdCBBcmdMaXN0ICZBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3QgeworICAvLyBBdm9pZCBsaW5raW5nIGNvbXBhdGliaWxpdHkgc3R1YnMgb24gaTM4NiBtYWMuCisgIGlmIChpc1RhcmdldE1hY09TKCkgJiYgZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2KQorICAgIHJldHVybjsKKworICBPYmpDUnVudGltZSBydW50aW1lID0gZ2V0RGVmYXVsdE9iakNSdW50aW1lKC8qbm9uZnJhZ2lsZSovIHRydWUpOworCisgIGlmICgocnVudGltZS5oYXNOYXRpdmVBUkMoKSB8fCAhaXNPYmpDQXV0b1JlZkNvdW50KEFyZ3MpKSAmJgorICAgICAgcnVudGltZS5oYXNTdWJzY3JpcHRpbmcoKSkKKyAgICByZXR1cm47CiAKICAgQ21kQXJncy5wdXNoX2JhY2soIi1mb3JjZV9sb2FkIik7CiAgIFNtYWxsU3RyaW5nPDEyOD4gUChnZXREcml2ZXIoKS5DbGFuZ0V4ZWN1dGFibGUpOwpAQCAtMjQ1LDEyICsyOTEsMTIgQEAKICAgQ21kQXJncy5wdXNoX2JhY2soQXJncy5NYWtlQXJnU3RyaW5nKFApKTsKIH0KIAotdm9pZCBEYXJ3aW5DbGFuZzo6QWRkTGlua1J1bnRpbWVMaWIoY29uc3QgQXJnTGlzdCAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpEYXJ3aW5TdGF0aWNMaWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsd2F5c0xpbmspIGNvbnN0IHsKK3ZvaWQgTWFjaE86OkFkZExpbmtSdW50aW1lTGliKGNvbnN0IEFyZ0xpc3QgJkFyZ3MsIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGFyd2luU3RhdGljTGliLCBib29sIEFsd2F5c0xpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRW1iZWRkZWQpIGNvbnN0IHsKICAgU21hbGxTdHJpbmc8MTI4PiBQKGdldERyaXZlcigpLlJlc291cmNlRGlyKTsKLSAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoUCwgImxpYiIsICJkYXJ3aW4iLCBEYXJ3aW5TdGF0aWNMaWIpOworICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChQLCAibGliIiwgSXNFbWJlZGRlZCA/ICJtYWNob19lbWJlZGRlZCIgOiAiZGFyd2luIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGFyd2luU3RhdGljTGliKTsKIAogICAvLyBGb3Igbm93LCBhbGxvdyBtaXNzaW5nIHJlc291cmNlIGxpYnJhcmllcyB0byBzdXBwb3J0IGRldmVsb3BlcnMgd2hvIG1heQogICAvLyBub3QgaGF2ZSBjb21waWxlci1ydCBjaGVja2VkIG91dCBvciBpbnRlZ3JhdGVkIGludG8gdGhlaXIgYnVpbGQgKHVubGVzcwpAQCAtMjkwLDE0ICszMzYsMTQgQEAKICAgLy8gSWYgd2UgYXJlIGJ1aWxkaW5nIHByb2ZpbGUgc3VwcG9ydCwgbGluayB0aGF0IGxpYnJhcnkgaW4uCiAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZnByb2ZpbGVfYXJjcykgfHwKICAgICAgIEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mcHJvZmlsZV9nZW5lcmF0ZSkgfHwKKyAgICAgIEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mcHJvZmlsZV9pbnN0cl9nZW5lcmF0ZSkgfHwKICAgICAgIEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mY3JlYXRlX3Byb2ZpbGUpIHx8CiAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfY292ZXJhZ2UpKSB7CiAgICAgLy8gU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBydW50aW1lIGxpYnJhcnkgZm9yIHRoZSB0YXJnZXQuCi0gICAgaWYgKGlzVGFyZ2V0SVBob25lT1MoKSkgeworICAgIGlmIChpc1RhcmdldElPU0Jhc2VkKCkpCiAgICAgICBBZGRMaW5rUnVudGltZUxpYihBcmdzLCBDbWRBcmdzLCAibGliY2xhbmdfcnQucHJvZmlsZV9pb3MuYSIpOwotICAgIH0gZWxzZSB7CisgICAgZWxzZQogICAgICAgQWRkTGlua1J1bnRpbWVMaWIoQXJncywgQ21kQXJncywgImxpYmNsYW5nX3J0LnByb2ZpbGVfb3N4LmEiKTsKLSAgICB9CiAgIH0KIAogICBjb25zdCBTYW5pdGl6ZXJBcmdzICZTYW5pdGl6ZSA9IGdldFNhbml0aXplckFyZ3MoKTsKQEAgLTMwNSwxMCArMzUxLDExIEBACiAgIC8vIEFkZCBVYnNhbiBydW50aW1lIGxpYnJhcnksIGlmIHJlcXVpcmVkLgogICBpZiAoU2FuaXRpemUubmVlZHNVYnNhblJ0KCkpIHsKICAgICAvLyBGSVhNRTogTW92ZSB0aGlzIGNoZWNrIHRvIFNhbml0aXplckFyZ3M6OmZpbHRlclVuc3VwcG9ydGVkS2luZHMuCi0gICAgaWYgKGlzVGFyZ2V0SVBob25lT1MoKSkgeworICAgIGlmIChpc1RhcmdldElPU0Jhc2VkKCkpIHsKICAgICAgIGdldERyaXZlcigpLkRpYWcoZGlhZzo6ZXJyX2Rydl9jbGFuZ191bnN1cHBvcnRlZF9wZXJfcGxhdGZvcm0pCiAgICAgICAgIDw8ICItZnNhbml0aXplPXVuZGVmaW5lZCI7CiAgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChpc1RhcmdldE1hY09TKCkgJiYgInVuZXhwZWN0ZWQgbm9uIE9TIFggdGFyZ2V0Iik7CiAgICAgICBBZGRMaW5rUnVudGltZUxpYihBcmdzLCBDbWRBcmdzLCAibGliY2xhbmdfcnQudWJzYW5fb3N4LmEiLCB0cnVlKTsKIAogICAgICAgLy8gVGhlIFVic2FuIHJ1bnRpbWUgbGlicmFyeSByZXF1aXJlcyBDKysuCkBAIC0zMjAsNyArMzY3LDcgQEAKICAgLy8gc2hvdWxkIG5vdCBiZSBsaW5rZWQgd2l0aCB0aGUgcnVudGltZSBsaWJyYXJ5LgogICBpZiAoU2FuaXRpemUubmVlZHNBc2FuUnQoKSkgewogICAgIC8vIEZJWE1FOiBNb3ZlIHRoaXMgY2hlY2sgdG8gU2FuaXRpemVyQXJnczo6ZmlsdGVyVW5zdXBwb3J0ZWRLaW5kcy4KLSAgICBpZiAoaXNUYXJnZXRJUGhvbmVPUygpICYmICFpc1RhcmdldElPU1NpbXVsYXRvcigpKSB7CisgICAgaWYgKGlzVGFyZ2V0SVBob25lT1MoKSkgewogICAgICAgZ2V0RHJpdmVyKCkuRGlhZyhkaWFnOjplcnJfZHJ2X2NsYW5nX3Vuc3VwcG9ydGVkX3Blcl9wbGF0Zm9ybSkKICAgICAgICAgPDwgIi1mc2FuaXRpemU9YWRkcmVzcyI7CiAgICAgfSBlbHNlIHsKQEAgLTM0OCwxNiArMzk1LDE4IEBACiAgIENtZEFyZ3MucHVzaF9iYWNrKCItbFN5c3RlbSIpOwogCiAgIC8vIFNlbGVjdCB0aGUgZHluYW1pYyBydW50aW1lIGxpYnJhcnkgYW5kIHRoZSB0YXJnZXQgc3BlY2lmaWMgc3RhdGljIGxpYnJhcnkuCi0gIGlmIChpc1RhcmdldElQaG9uZU9TKCkpIHsKKyAgaWYgKGlzVGFyZ2V0SU9TQmFzZWQoKSkgewogICAgIC8vIElmIHdlIGFyZSBjb21waWxpbmcgYXMgaU9TIC8gc2ltdWxhdG9yLCBkb24ndCBhdHRlbXB0IHRvIGxpbmsgbGliZ2NjX3MuMSwKICAgICAvLyBpdCBuZXZlciB3ZW50IGludG8gdGhlIFNESy4KICAgICAvLyBMaW5raW5nIGFnYWluc3QgbGliZ2NjX3MuMSBpc24ndCBuZWVkZWQgZm9yIGlPUyA1LjArCi0gICAgaWYgKGlzSVBob25lT1NWZXJzaW9uTFQoNSwgMCkgJiYgIWlzVGFyZ2V0SU9TU2ltdWxhdG9yKCkpCisgICAgaWYgKGlzSVBob25lT1NWZXJzaW9uTFQoNSwgMCkgJiYgIWlzVGFyZ2V0SU9TU2ltdWxhdG9yKCkgJiYKKyAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpICE9IGxsdm06OlRyaXBsZTo6YXJtNjQpCiAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxnY2Nfcy4xIik7CiAKICAgICAvLyBXZSBjdXJyZW50bHkgYWx3YXlzIG5lZWQgYSBzdGF0aWMgcnVudGltZSBsaWJyYXJ5IGZvciBpT1MuCiAgICAgQWRkTGlua1J1bnRpbWVMaWIoQXJncywgQ21kQXJncywgImxpYmNsYW5nX3J0Lmlvcy5hIik7CiAgIH0gZWxzZSB7CisgICAgYXNzZXJ0KGlzVGFyZ2V0TWFjT1MoKSAmJiAidW5leHBlY3RlZCBub24gTWFjT1MgcGxhdGZvcm0iKTsKICAgICAvLyBUaGUgZHluYW1pYyBydW50aW1lIGxpYnJhcnkgd2FzIG1lcmdlZCB3aXRoIGxpYlN5c3RlbSBmb3IgMTAuNiBhbmQKICAgICAvLyBiZXlvbmQ7IG9ubHkgMTAuNCBhbmQgMTAuNSBuZWVkIGFuIGFkZGl0aW9uYWwgcnVudGltZSBsaWJyYXJ5LgogICAgIGlmIChpc01hY29zeFZlcnNpb25MVCgxMCwgNSkpCkBAIC00NDAsNyArNDg5LDcgQEAKICAgICAgIGlmIChjb25zdCBBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2lzeXNyb290KSkgewogICAgICAgICBTdHJpbmdSZWYgZmlyc3QsIHNlY29uZDsKICAgICAgICAgU3RyaW5nUmVmIGlzeXNyb290ID0gQS0+Z2V0VmFsdWUoKTsKLSAgICAgICAgbGx2bTo6dGllKGZpcnN0LCBzZWNvbmQpID0gaXN5c3Jvb3Quc3BsaXQoU3RyaW5nUmVmKCJTREtzL2lQaG9uZU9TIikpOworICAgICAgICBzdGQ6OnRpZShmaXJzdCwgc2Vjb25kKSA9IGlzeXNyb290LnNwbGl0KFN0cmluZ1JlZigiU0RLcy9pUGhvbmVPUyIpKTsKICAgICAgICAgaWYgKHNlY29uZCAhPSAiIikKICAgICAgICAgICBpT1NUYXJnZXQgPSBzZWNvbmQuc3Vic3RyKDAsMyk7CiAgICAgICB9CkBAIC00NDgsOSArNDk3LDEwIEBACiAKICAgICAvLyBJZiBubyBPU1ggb3IgaU9TIHRhcmdldCBoYXMgYmVlbiBzcGVjaWZpZWQgYW5kIHdlJ3JlIGNvbXBpbGluZyBmb3IgYXJtdjcsCiAgICAgLy8gZ28gYWhlYWQgYXMgYXNzdW1lIHdlJ3JlIHRhcmdldGluZyBpT1MuCisgICAgU3RyaW5nUmVmIE1hY2hPQXJjaE5hbWUgPSBnZXRNYWNoT0FyY2hOYW1lKEFyZ3MpOwogICAgIGlmIChPU1hUYXJnZXQuZW1wdHkoKSAmJiBpT1NUYXJnZXQuZW1wdHkoKSAmJgotICAgICAgICAoZ2V0RGFyd2luQXJjaE5hbWUoQXJncykgPT0gImFybXY3IiB8fAotICAgICAgICAgZ2V0RGFyd2luQXJjaE5hbWUoQXJncykgPT0gImFybXY3cyIpKQorICAgICAgICAoTWFjaE9BcmNoTmFtZSA9PSAiYXJtdjciIHx8IE1hY2hPQXJjaE5hbWUgPT0gImFybXY3cyIgfHwKKyAgICAgICAgIE1hY2hPQXJjaE5hbWUgPT0gImFybTY0IikpCiAgICAgICAgIGlPU1RhcmdldCA9IGlPU1ZlcnNpb25NaW47CiAKICAgICAvLyBIYW5kbGUgY29uZmxpY3RpbmcgZGVwbG95bWVudCB0YXJnZXRzCkBAIC00NjksNiArNTE5LDcgQEAKICAgICAvLyBkZWZhdWx0IHBsYXRmb3JtLgogICAgIGlmICghT1NYVGFyZ2V0LmVtcHR5KCkgJiYgIWlPU1RhcmdldC5lbXB0eSgpKSB7CiAgICAgICBpZiAoZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtIHx8CisgICAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtNjQgfHwKICAgICAgICAgICBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYikKICAgICAgICAgT1NYVGFyZ2V0ID0gIiI7CiAgICAgICBlbHNlCkBAIC00ODgsNyArNTM5LDggQEAKICAgICAgICAgb3B0aW9uczo6T1BUX21pb3Nfc2ltdWxhdG9yX3ZlcnNpb25fbWluX0VRKTsKICAgICAgIGlPU1NpbVZlcnNpb24gPSBBcmdzLk1ha2VKb2luZWRBcmcoMCwgTywgaU9TU2ltVGFyZ2V0KTsKICAgICAgIEFyZ3MuYXBwZW5kKGlPU1NpbVZlcnNpb24pOwotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlIGlmIChNYWNoT0FyY2hOYW1lICE9ICJhcm12Nm0iICYmIE1hY2hPQXJjaE5hbWUgIT0gImFybXY3bSIgJiYKKyAgICAgICAgICAgICAgIE1hY2hPQXJjaE5hbWUgIT0gImFybXY3ZW0iKSB7CiAgICAgICAvLyBPdGhlcndpc2UsIGFzc3VtZSB3ZSBhcmUgdGFyZ2V0aW5nIE9TIFguCiAgICAgICBjb25zdCBPcHRpb24gTyA9IE9wdHMuZ2V0T3B0aW9uKG9wdGlvbnM6Ok9QVF9tbWFjb3N4X3ZlcnNpb25fbWluX0VRKTsKICAgICAgIE9TWFZlcnNpb24gPSBBcmdzLk1ha2VKb2luZWRBcmcoMCwgTywgTWFjb3N4VmVyc2lvbk1pbik7CkBAIC00OTYsNiArNTQ4LDE2IEBACiAgICAgfQogICB9CiAKKyAgRGFyd2luUGxhdGZvcm1LaW5kIFBsYXRmb3JtOworICBpZiAoT1NYVmVyc2lvbikKKyAgICBQbGF0Zm9ybSA9IE1hY09TOworICBlbHNlIGlmIChpT1NWZXJzaW9uKQorICAgIFBsYXRmb3JtID0gSVBob25lT1M7CisgIGVsc2UgaWYgKGlPU1NpbVZlcnNpb24pCisgICAgUGxhdGZvcm0gPSBJUGhvbmVPU1NpbXVsYXRvcjsKKyAgZWxzZQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuYWJsZSB0byBpbmZlciBEYXJ3aW4gdmFyaWFudCIpOworCiAgIC8vIFJlamVjdCBpbnZhbGlkIGFyY2hpdGVjdHVyZSBjb21iaW5hdGlvbnMuCiAgIGlmIChpT1NTaW1WZXJzaW9uICYmIChnZXRUcmlwbGUoKS5nZXRBcmNoKCkgIT0gbGx2bTo6VHJpcGxlOjp4ODYgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyaXBsZSgpLmdldEFyY2goKSAhPSBsbHZtOjpUcmlwbGU6Ong4Nl82NCkpIHsKQEAgLTUwNiwxNCArNTY4LDE0IEBACiAgIC8vIFNldCB0aGUgdG9vbCBjaGFpbiB0YXJnZXQgaW5mb3JtYXRpb24uCiAgIHVuc2lnbmVkIE1ham9yLCBNaW5vciwgTWljcm87CiAgIGJvb2wgSGFkRXh0cmE7Ci0gIGlmIChPU1hWZXJzaW9uKSB7CisgIGlmIChQbGF0Zm9ybSA9PSBNYWNPUykgewogICAgIGFzc2VydCgoIWlPU1ZlcnNpb24gJiYgIWlPU1NpbVZlcnNpb24pICYmICJVbmtub3duIHRhcmdldCBwbGF0Zm9ybSEiKTsKICAgICBpZiAoIURyaXZlcjo6R2V0UmVsZWFzZVZlcnNpb24oT1NYVmVyc2lvbi0+Z2V0VmFsdWUoKSwgTWFqb3IsIE1pbm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNybywgSGFkRXh0cmEpIHx8IEhhZEV4dHJhIHx8CiAgICAgICAgIE1ham9yICE9IDEwIHx8IE1pbm9yID49IDEwMCB8fCBNaWNybyA+PSAxMDApCiAgICAgICBnZXREcml2ZXIoKS5EaWFnKGRpYWc6OmVycl9kcnZfaW52YWxpZF92ZXJzaW9uX251bWJlcikKICAgICAgICAgPDwgT1NYVmVyc2lvbi0+Z2V0QXNTdHJpbmcoQXJncyk7Ci0gIH0gZWxzZSB7CisgIH0gZWxzZSBpZiAoUGxhdGZvcm0gPT0gSVBob25lT1MgfHwgUGxhdGZvcm0gPT0gSVBob25lT1NTaW11bGF0b3IpIHsKICAgICBjb25zdCBBcmcgKlZlcnNpb24gPSBpT1NWZXJzaW9uID8gaU9TVmVyc2lvbiA6IGlPU1NpbVZlcnNpb247CiAgICAgYXNzZXJ0KFZlcnNpb24gJiYgIlVua25vd24gdGFyZ2V0IHBsYXRmb3JtISIpOwogICAgIGlmICghRHJpdmVyOjpHZXRSZWxlYXNlVmVyc2lvbihWZXJzaW9uLT5nZXRWYWx1ZSgpLCBNYWpvciwgTWlub3IsCkBAIC01MjEsOSArNTgzLDggQEAKICAgICAgICAgTWFqb3IgPj0gMTAgfHwgTWlub3IgPj0gMTAwIHx8IE1pY3JvID49IDEwMCkKICAgICAgIGdldERyaXZlcigpLkRpYWcoZGlhZzo6ZXJyX2Rydl9pbnZhbGlkX3ZlcnNpb25fbnVtYmVyKQogICAgICAgICA8PCBWZXJzaW9uLT5nZXRBc1N0cmluZyhBcmdzKTsKLSAgfQotCi0gIGJvb2wgSXNJT1NTaW0gPSBib29sKGlPU1NpbVZlcnNpb24pOworICB9IGVsc2UKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmtub3duIGtpbmQgb2YgRGFyd2luIHBsYXRmb3JtIik7CiAKICAgLy8gSW4gR0NDLCB0aGUgc2ltdWxhdG9yIGhpc3RvcmljYWxseSB3YXMgdHJlYXRlZCBhcyBiZWluZyBPUyBYIGluIHNvbWUKICAgLy8gY29udGV4dHMsIGxpa2UgZGV0ZXJtaW5pbmcgdGhlIGxpbmsgbG9naWMsIGRlc3BpdGUgZ2VuZXJhbGx5IGJlaW5nIGNhbGxlZApAQCAtNTMxLDkgKzU5Miw5IEBACiAgIC8vIHNpbXVsYXRvciBhcyBpT1MgKyB4ODYsIGFuZCB0cmVhdCBpdCBkaWZmZXJlbnRseSBpbiBhIGZldyBjb250ZXh0cy4KICAgaWYgKGlPU1ZlcnNpb24gJiYgKGdldFRyaXBsZSgpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fAogICAgICAgICAgICAgICAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0KSkKLSAgICBJc0lPU1NpbSA9IHRydWU7CisgICAgUGxhdGZvcm0gPSBJUGhvbmVPU1NpbXVsYXRvcjsKIAotICBzZXRUYXJnZXQoLypJc0lQaG9uZU9TPSovICFPU1hWZXJzaW9uLCBNYWpvciwgTWlub3IsIE1pY3JvLCBJc0lPU1NpbSk7CisgIHNldFRhcmdldChQbGF0Zm9ybSwgTWFqb3IsIE1pbm9yLCBNaWNybyk7CiB9CiAKIHZvaWQgRGFyd2luQ2xhbmc6OkFkZENYWFN0ZGxpYkxpYkFyZ3MoY29uc3QgQXJnTGlzdCAmQXJncywKQEAgLTU5NCw2ICs2NTUsNyBAQAogCiAgIC8vIFVzZSB0aGUgbmV3ZXIgY2Nfa2V4dCBmb3IgaU9TIEFSTSBhZnRlciA2LjAuCiAgIGlmICghaXNUYXJnZXRJUGhvbmVPUygpIHx8IGlzVGFyZ2V0SU9TU2ltdWxhdG9yKCkgfHwKKyAgICAgIGdldFRyaXBsZSgpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybTY0IHx8CiAgICAgICAhaXNJUGhvbmVPU1ZlcnNpb25MVCg2LCAwKSkgewogICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKFAsICJsaWJjbGFuZ19ydC5jY19rZXh0LmEiKTsKICAgfSBlbHNlIHsKQEAgLTYwNiw4ICs2NjgsOCBAQAogICAgIENtZEFyZ3MucHVzaF9iYWNrKEFyZ3MuTWFrZUFyZ1N0cmluZyhQLnN0cigpKSk7CiB9CiAKLURlcml2ZWRBcmdMaXN0ICpEYXJ3aW46OlRyYW5zbGF0ZUFyZ3MoY29uc3QgRGVyaXZlZEFyZ0xpc3QgJkFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJvdW5kQXJjaCkgY29uc3QgeworRGVyaXZlZEFyZ0xpc3QgKk1hY2hPOjpUcmFuc2xhdGVBcmdzKGNvbnN0IERlcml2ZWRBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJvdW5kQXJjaCkgY29uc3QgewogICBEZXJpdmVkQXJnTGlzdCAqREFMID0gbmV3IERlcml2ZWRBcmdMaXN0KEFyZ3MuZ2V0QmFzZUFyZ3MoKSk7CiAgIGNvbnN0IE9wdFRhYmxlICZPcHRzID0gZ2V0RHJpdmVyKCkuZ2V0T3B0cygpOwogCkBAIC02MjYsMTAgKzY4OCwxMCBAQAogICAgICAgLy8gU2tpcCB0aGlzIGFyZ3VtZW50IHVubGVzcyB0aGUgYXJjaGl0ZWN0dXJlIG1hdGNoZXMgZWl0aGVyIHRoZSB0b29sY2hhaW4KICAgICAgIC8vIHRyaXBsZSBhcmNoLCBvciB0aGUgYXJjaCBiZWluZyBib3VuZC4KICAgICAgIGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgWGFyY2hBcmNoID0KLSAgICAgICAgdG9vbHM6OmRhcndpbjo6Z2V0QXJjaFR5cGVGb3JEYXJ3aW5BcmNoTmFtZShBLT5nZXRWYWx1ZSgwKSk7CisgICAgICAgIHRvb2xzOjpkYXJ3aW46OmdldEFyY2hUeXBlRm9yTWFjaE9BcmNoTmFtZShBLT5nZXRWYWx1ZSgwKSk7CiAgICAgICBpZiAoIShYYXJjaEFyY2ggPT0gZ2V0QXJjaCgpICB8fAogICAgICAgICAgICAgKEJvdW5kQXJjaCAmJiBYYXJjaEFyY2ggPT0KLSAgICAgICAgICAgICB0b29sczo6ZGFyd2luOjpnZXRBcmNoVHlwZUZvckRhcndpbkFyY2hOYW1lKEJvdW5kQXJjaCkpKSkKKyAgICAgICAgICAgICB0b29sczo6ZGFyd2luOjpnZXRBcmNoVHlwZUZvck1hY2hPQXJjaE5hbWUoQm91bmRBcmNoKSkpKQogICAgICAgICBjb250aW51ZTsKIAogICAgICAgQXJnICpPcmlnaW5hbEFyZyA9IEE7CkBAIC04MTQsOCArODc2LDYgQEAKICAgICAgIERBTC0+QWRkSm9pbmVkQXJnKDAsIE1BcmNoLCAiYXJtdjdhIik7CiAgICAgZWxzZSBpZiAoTmFtZSA9PSAiYXJtdjdlbSIpCiAgICAgICBEQUwtPkFkZEpvaW5lZEFyZygwLCBNQXJjaCwgImFybXY3ZW0iKTsKLSAgICBlbHNlIGlmIChOYW1lID09ICJhcm12N2YiKQotICAgICAgREFMLT5BZGRKb2luZWRBcmcoMCwgTUFyY2gsICJhcm12N2YiKTsKICAgICBlbHNlIGlmIChOYW1lID09ICJhcm12N2siKQogICAgICAgREFMLT5BZGRKb2luZWRBcmcoMCwgTUFyY2gsICJhcm12N2siKTsKICAgICBlbHNlIGlmIChOYW1lID09ICJhcm12N20iKQpAQCAtODIzLDIxICs4ODMsNTIgQEAKICAgICBlbHNlIGlmIChOYW1lID09ICJhcm12N3MiKQogICAgICAgREFMLT5BZGRKb2luZWRBcmcoMCwgTUFyY2gsICJhcm12N3MiKTsKIAotICAgIGVsc2UKLSAgICAgIGxsdm1fdW5yZWFjaGFibGUoImludmFsaWQgRGFyd2luIGFyY2giKTsKKyAgICBlbHNlIGlmIChOYW1lID09ICJhcm02NCIpCisgICAgICBEQUwtPkFkZEpvaW5lZEFyZygwLCBNQXJjaCwgImFybTY0Iik7CisgICAgZWxzZSBpZiAoTmFtZSA9PSAiYXJtdjgiKQorICAgICAgREFMLT5BZGRKb2luZWRBcmcoMCwgTUFyY2gsICJhcm02NCIpOwogICB9CiAKKyAgcmV0dXJuIERBTDsKK30KKwordm9pZCBNYWNoTzo6QWRkTGlua1J1bnRpbWVMaWJBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IHsKKyAgLy8gRW1iZWRkZWQgdGFyZ2V0cyBhcmUgc2ltcGxlIGF0IHRoZSBtb21lbnQsIG5vdCBzdXBwb3J0aW5nIHNhbml0aXplcnMgYW5kCisgIC8vIHdpdGggZGlmZmVyZW50IGxpYnJhcmllcyBmb3IgZWFjaCBtZW1iZXIgb2YgdGhlIHByb2R1Y3QgeyBzdGF0aWMsIFBJQyB9IHgKKyAgLy8geyBoYXJkLWZsb2F0LCBzb2Z0LWZsb2F0IH0KKyAgbGx2bTo6U21hbGxTdHJpbmc8MzI+IENvbXBpbGVyUlQgPSBTdHJpbmdSZWYoImxpYmNsYW5nX3J0LiIpOworICBDb21waWxlclJUICs9CisgICAgICB0b29sczo6YXJtOjpnZXRBUk1GbG9hdEFCSShnZXREcml2ZXIoKSwgQXJncywgZ2V0VHJpcGxlKCkpID09ICJoYXJkIgorICAgICAgICAgID8gImhhcmQiCisgICAgICAgICAgOiAic29mdCI7CisgIENvbXBpbGVyUlQgKz0gQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2ZQSUMpID8gIl9waWMuYSIgOiAiX3N0YXRpYy5hIjsKKworICBBZGRMaW5rUnVudGltZUxpYihBcmdzLCBDbWRBcmdzLCBDb21waWxlclJULCBmYWxzZSwgdHJ1ZSk7Cit9CisKKworRGVyaXZlZEFyZ0xpc3QgKkRhcndpbjo6VHJhbnNsYXRlQXJncyhjb25zdCBEZXJpdmVkQXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQm91bmRBcmNoKSBjb25zdCB7CisgIC8vIEZpcnN0IGdldCB0aGUgZ2VuZXJpYyBBcHBsZSBhcmdzLCBiZWZvcmUgbW92aW5nIG9udG8gRGFyd2luLXNwZWNpZmljIG9uZXMuCisgIERlcml2ZWRBcmdMaXN0ICpEQUwgPSBNYWNoTzo6VHJhbnNsYXRlQXJncyhBcmdzLCBCb3VuZEFyY2gpOworICBjb25zdCBPcHRUYWJsZSAmT3B0cyA9IGdldERyaXZlcigpLmdldE9wdHMoKTsKKworICAvLyBJZiBubyBhcmNoaXRlY3R1cmUgaXMgYm91bmQsIG5vbmUgb2YgdGhlIHRyYW5zbGF0aW9ucyBoZXJlIGFyZSByZWxldmFudC4KKyAgaWYgKCFCb3VuZEFyY2gpCisgICAgcmV0dXJuIERBTDsKKwogICAvLyBBZGQgYW4gZXhwbGljaXQgdmVyc2lvbiBtaW4gYXJndW1lbnQgZm9yIHRoZSBkZXBsb3ltZW50IHRhcmdldC4gV2UgZG8gdGhpcwogICAvLyBhZnRlciBhcmd1bWVudCB0cmFuc2xhdGlvbiBiZWNhdXNlIC1YYXJjaF8gYXJndW1lbnRzIG1heSBhZGQgYSB2ZXJzaW9uIG1pbgogICAvLyBhcmd1bWVudC4KLSAgaWYgKEJvdW5kQXJjaCkKLSAgICBBZGREZXBsb3ltZW50VGFyZ2V0KCpEQUwpOworICBBZGREZXBsb3ltZW50VGFyZ2V0KCpEQUwpOwogCiAgIC8vIEZvciBpT1MgNiwgdW5kbyB0aGUgdHJhbnNsYXRpb24gdG8gYWRkIC1zdGF0aWMgZm9yIC1ta2VybmVsLy1mYXBwbGUta2V4dC4KICAgLy8gRklYTUU6IEl0IHdvdWxkIGJlIGZhciBiZXR0ZXIgdG8gYXZvaWQgaW5zZXJ0aW5nIHRob3NlIC1zdGF0aWMgYXJndW1lbnRzLAogICAvLyBidXQgd2UgY2FuJ3QgY2hlY2sgdGhlIGRlcGxveW1lbnQgdGFyZ2V0IGluIHRoZSB0cmFuc2xhdGlvbiBjb2RlIHVudGlsCiAgIC8vIGl0IGlzIHNldCBoZXJlLgotICBpZiAoaXNUYXJnZXRJUGhvbmVPUygpICYmICFpc0lQaG9uZU9TVmVyc2lvbkxUKDYsIDApKSB7CisgIGlmIChpc1RhcmdldElPU0Jhc2VkKCkgJiYgIWlzSVBob25lT1NWZXJzaW9uTFQoNiwgMCkgJiYKKyAgICAgIGdldFRyaXBsZSgpLmdldEFyY2goKSAhPSBsbHZtOjpUcmlwbGU6OmFybTY0KSB7CiAgICAgZm9yIChBcmdMaXN0OjppdGVyYXRvciBpdCA9IERBTC0+YmVnaW4oKSwgaWUgPSBEQUwtPmVuZCgpOyBpdCAhPSBpZTsgKSB7CiAgICAgICBBcmcgKkEgPSAqaXQ7CiAgICAgICArK2l0OwpAQCAtODU0LDcgKzk0NSw3IEBACiAKICAgLy8gRGVmYXVsdCB0byB1c2UgbGliYysrIG9uIE9TIFggMTAuOSsgYW5kIGlPUyA3Ky4KICAgaWYgKCgoaXNUYXJnZXRNYWNPUygpICYmICFpc01hY29zeFZlcnNpb25MVCgxMCwgOSkpIHx8Ci0gICAgICAgKGlzVGFyZ2V0SVBob25lT1MoKSAmJiAhaXNJUGhvbmVPU1ZlcnNpb25MVCg3LCAwKSkpICYmCisgICAgICAgKGlzVGFyZ2V0SU9TQmFzZWQoKSAmJiAhaXNJUGhvbmVPU1ZlcnNpb25MVCg3LCAwKSkpICYmCiAgICAgICAhQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9zdGRsaWJfRVEpKQogICAgIERBTC0+QWRkSm9pbmVkQXJnKDAsIE9wdHMuZ2V0T3B0aW9uKG9wdGlvbnM6Ok9QVF9zdGRsaWJfRVEpLCAibGliYysrIik7CiAKQEAgLTg2NCw4ICs5NTUsOCBAQAogICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHRhcmdldCBwcm92aWRlcyBsaWJjKysuCiAgICAgU3RyaW5nUmVmIHdoZXJlOwogCi0gICAgLy8gQ29tcGxhaW4gYWJvdXQgdGFyZ2V0dGluZyBpT1MgPCA1LjAgaW4gYW55IHdheS4KLSAgICBpZiAoaXNUYXJnZXRJUGhvbmVPUygpICYmIGlzSVBob25lT1NWZXJzaW9uTFQoNSwgMCkpCisgICAgLy8gQ29tcGxhaW4gYWJvdXQgdGFyZ2V0aW5nIGlPUyA8IDUuMCBpbiBhbnkgd2F5LgorICAgIGlmIChpc1RhcmdldElPU0Jhc2VkKCkgJiYgaXNJUGhvbmVPU1ZlcnNpb25MVCg1LCAwKSkKICAgICAgIHdoZXJlID0gImlPUyA1LjAiOwogCiAgICAgaWYgKHdoZXJlICE9IFN0cmluZ1JlZigpKSB7CkBAIC04NzcsMTEgKzk2OCwxMSBAQAogICByZXR1cm4gREFMOwogfQogCi1ib29sIERhcndpbjo6SXNVbndpbmRUYWJsZXNEZWZhdWx0KCkgY29uc3QgeworYm9vbCBNYWNoTzo6SXNVbndpbmRUYWJsZXNEZWZhdWx0KCkgY29uc3QgewogICByZXR1cm4gZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0OwogfQogCi1ib29sIERhcndpbjo6VXNlRHdhcmZEZWJ1Z0ZsYWdzKCkgY29uc3QgeworYm9vbCBNYWNoTzo6VXNlRHdhcmZEZWJ1Z0ZsYWdzKCkgY29uc3QgewogICBpZiAoY29uc3QgY2hhciAqUyA9IDo6Z2V0ZW52KCJSQ19ERUJVR19PUFRJT05TIikpCiAgICAgcmV0dXJuIFNbMF0gIT0gJ1wwJzsKICAgcmV0dXJuIGZhbHNlOwpAQCAtODkzLDQwICs5ODQsMTQzIEBACiAgICAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6dGh1bWIpOwogfQogCi1ib29sIERhcndpbjo6aXNQSUNEZWZhdWx0KCkgY29uc3QgeworYm9vbCBNYWNoTzo6aXNQSUNEZWZhdWx0KCkgY29uc3QgewogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBEYXJ3aW46OmlzUElFRGVmYXVsdCgpIGNvbnN0IHsKK2Jvb2wgTWFjaE86OmlzUElFRGVmYXVsdCgpIGNvbnN0IHsKICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIERhcndpbjo6aXNQSUNEZWZhdWx0Rm9yY2VkKCkgY29uc3QgewotICByZXR1cm4gZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0OworYm9vbCBNYWNoTzo6aXNQSUNEZWZhdWx0Rm9yY2VkKCkgY29uc3QgeworICByZXR1cm4gKGdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NCB8fAorICAgICAgICAgIGdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybTY0KTsKIH0KIAotYm9vbCBEYXJ3aW46OlN1cHBvcnRzUHJvZmlsaW5nKCkgY29uc3QgeworYm9vbCBNYWNoTzo6U3VwcG9ydHNQcm9maWxpbmcoKSBjb25zdCB7CiAgIC8vIFByb2ZpbGluZyBpbnN0cnVtZW50YXRpb24gaXMgb25seSBzdXBwb3J0ZWQgb24geDg2LgogICByZXR1cm4gZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2IHx8IGdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NDsKIH0KIAordm9pZCBEYXJ3aW46OmFkZE1pblZlcnNpb25BcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IHsKKyAgVmVyc2lvblR1cGxlIFRhcmdldFZlcnNpb24gPSBnZXRUYXJnZXRWZXJzaW9uKCk7CisKKyAgLy8gSWYgd2UgaGFkIGFuIGV4cGxpY2l0IC1taW9zLXNpbXVsYXRvci12ZXJzaW9uLW1pbiBhcmd1bWVudCwgaG9ub3IgdGhhdCwKKyAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgdHJhZGl0aW9uYWwgZGVwbG95bWVudCB0YXJnZXRzLiBXZSBjYW4ndCBqdXN0IGNoZWNrIHRoZQorICAvLyBpcy1zaW0gYXR0cmlidXRlIGJlY2F1c2UgZXhpc3RpbmcgY29kZSBmb2xsb3dzIHRoaXMgcGF0aCwgYW5kIHRoZSBsaW5rZXIKKyAgLy8gbWF5IG5vdCBoYW5kbGUgdGhlIGFyZ3VtZW50LgorICAvLworICAvLyBGSVhNRTogV2UgbWF5IGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMsIG9uY2Ugd2UgY2FuIHZlcmlmeSBubyBvbmUgZGVwZW5kcyBvbgorICAvLyBpdC4KKyAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9taW9zX3NpbXVsYXRvcl92ZXJzaW9uX21pbl9FUSkpCisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1pb3Nfc2ltdWxhdG9yX3ZlcnNpb25fbWluIik7CisgIGVsc2UgaWYgKGlzVGFyZ2V0SU9TQmFzZWQoKSkKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWlwaG9uZW9zX3ZlcnNpb25fbWluIik7CisgIGVsc2UgeworICAgIGFzc2VydChpc1RhcmdldE1hY09TKCkgJiYgInVuZXhwZWN0ZWQgdGFyZ2V0Iik7CisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tYWNvc3hfdmVyc2lvbl9taW4iKTsKKyAgfQorCisgIENtZEFyZ3MucHVzaF9iYWNrKEFyZ3MuTWFrZUFyZ1N0cmluZyhUYXJnZXRWZXJzaW9uLmdldEFzU3RyaW5nKCkpKTsKK30KKwordm9pZCBEYXJ3aW46OmFkZFN0YXJ0T2JqZWN0RmlsZUFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdCB7CisgIC8vIERlcml2ZWQgZnJvbSBzdGFydGZpbGUgc3BlYy4KKyAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9keW5hbWljbGliKSkgeworICAgIC8vIERlcml2ZWQgZnJvbSBkYXJ3aW5fZHlsaWIxIHNwZWMuCisgICAgaWYgKGlzVGFyZ2V0SU9TU2ltdWxhdG9yKCkpIHsKKyAgICAgIDsgLy8gaU9TIHNpbXVsYXRvciBkb2VzIG5vdCBuZWVkIGR5bGliMS5vLgorICAgIH0gZWxzZSBpZiAoaXNUYXJnZXRJUGhvbmVPUygpKSB7CisgICAgICBpZiAoaXNJUGhvbmVPU1ZlcnNpb25MVCgzLCAxKSkKKyAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sZHlsaWIxLm8iKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlzTWFjb3N4VmVyc2lvbkxUKDEwLCA1KSkKKyAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sZHlsaWIxLm8iKTsKKyAgICAgIGVsc2UgaWYgKGlzTWFjb3N4VmVyc2lvbkxUKDEwLCA2KSkKKyAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sZHlsaWIxLjEwLjUubyIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2J1bmRsZSkpIHsKKyAgICAgIGlmICghQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3N0YXRpYykpIHsKKyAgICAgICAgLy8gRGVyaXZlZCBmcm9tIGRhcndpbl9idW5kbGUxIHNwZWMuCisgICAgICAgIGlmIChpc1RhcmdldElPU1NpbXVsYXRvcigpKSB7CisgICAgICAgICAgOyAvLyBpT1Mgc2ltdWxhdG9yIGRvZXMgbm90IG5lZWQgYnVuZGxlMS5vLgorICAgICAgICB9IGVsc2UgaWYgKGlzVGFyZ2V0SVBob25lT1MoKSkgeworICAgICAgICAgIGlmIChpc0lQaG9uZU9TVmVyc2lvbkxUKDMsIDEpKQorICAgICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sYnVuZGxlMS5vIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGlzTWFjb3N4VmVyc2lvbkxUKDEwLCA2KSkKKyAgICAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbGJ1bmRsZTEubyIpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfcGcpICYmIFN1cHBvcnRzUHJvZmlsaW5nKCkpIHsKKyAgICAgICAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zdGF0aWMpIHx8CisgICAgICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfb2JqZWN0KSB8fAorICAgICAgICAgICAgQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3ByZWxvYWQpKSB7CisgICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sZ2NydDAubyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbGdjcnQxLm8iKTsKKworICAgICAgICAgIC8vIGRhcndpbl9jcnQyIHNwZWMgaXMgZW1wdHkuCisgICAgICAgIH0KKyAgICAgICAgLy8gQnkgZGVmYXVsdCBvbiBPUyBYIDEwLjggYW5kIGxhdGVyLCB3ZSBkb24ndCBsaW5rIHdpdGggYSBjcnQxLm8KKyAgICAgICAgLy8gZmlsZSBhbmQgdGhlIGxpbmtlciBrbm93cyB0byB1c2UgX21haW4gYXMgdGhlIGVudHJ5IHBvaW50LiAgQnV0LAorICAgICAgICAvLyB3aGVuIGNvbXBpbGluZyB3aXRoIC1wZywgd2UgbmVlZCB0byBsaW5rIHdpdGggdGhlIGdjcnQxLm8gZmlsZSwKKyAgICAgICAgLy8gc28gcGFzcyB0aGUgLW5vX25ld19tYWluIG9wdGlvbiB0byB0ZWxsIHRoZSBsaW5rZXIgdG8gdXNlIHRoZQorICAgICAgICAvLyAic3RhcnQiIHN5bWJvbCBhcyB0aGUgZW50cnkgcG9pbnQuCisgICAgICAgIGlmIChpc1RhcmdldE1hY09TKCkgJiYgIWlzTWFjb3N4VmVyc2lvbkxUKDEwLCA4KSkKKyAgICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW5vX25ld19tYWluIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3N0YXRpYykgfHwKKyAgICAgICAgICAgIEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9vYmplY3QpIHx8CisgICAgICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfcHJlbG9hZCkpIHsKKyAgICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxjcnQwLm8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBEZXJpdmVkIGZyb20gZGFyd2luX2NydDEgc3BlYy4KKyAgICAgICAgICBpZiAoaXNUYXJnZXRJT1NTaW11bGF0b3IoKSkgeworICAgICAgICAgICAgOyAvLyBpT1Mgc2ltdWxhdG9yIGRvZXMgbm90IG5lZWQgY3J0MS5vLgorICAgICAgICAgIH0gZWxzZSBpZiAoaXNUYXJnZXRJUGhvbmVPUygpKSB7CisgICAgICAgICAgICBpZiAoZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtNjQpCisgICAgICAgICAgICAgIDsgLy8gaU9TIGRvZXMgbm90IG5lZWQgYW55IGNydDEgZmlsZXMgZm9yIGFybTY0CisgICAgICAgICAgICBlbHNlIGlmIChpc0lQaG9uZU9TVmVyc2lvbkxUKDMsIDEpKQorICAgICAgICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxjcnQxLm8iKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlzSVBob25lT1NWZXJzaW9uTFQoNiwgMCkpCisgICAgICAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbGNydDEuMy4xLm8iKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlzTWFjb3N4VmVyc2lvbkxUKDEwLCA1KSkKKyAgICAgICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sY3J0MS5vIik7CisgICAgICAgICAgICBlbHNlIGlmIChpc01hY29zeFZlcnNpb25MVCgxMCwgNikpCisgICAgICAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbGNydDEuMTAuNS5vIik7CisgICAgICAgICAgICBlbHNlIGlmIChpc01hY29zeFZlcnNpb25MVCgxMCwgOCkpCisgICAgICAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbGNydDEuMTAuNi5vIik7CisKKyAgICAgICAgICAgIC8vIGRhcndpbl9jcnQyIHNwZWMgaXMgZW1wdHkuCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCFpc1RhcmdldElQaG9uZU9TKCkgJiYgQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3NoYXJlZF9saWJnY2MpICYmCisgICAgICBpc01hY29zeFZlcnNpb25MVCgxMCwgNSkpIHsKKyAgICBjb25zdCBjaGFyICpTdHIgPSBBcmdzLk1ha2VBcmdTdHJpbmcoR2V0RmlsZVBhdGgoImNydDMubyIpKTsKKyAgICBDbWRBcmdzLnB1c2hfYmFjayhTdHIpOworICB9Cit9CisKIGJvb2wgRGFyd2luOjpTdXBwb3J0c09iakNHQygpIGNvbnN0IHsKLSAgLy8gR2FyYmFnZSBjb2xsZWN0aW9uIGlzIHN1cHBvcnRlZCBldmVyeXdoZXJlIGV4Y2VwdCBvbiBpUGhvbmUgT1MuCi0gIHJldHVybiAhaXNUYXJnZXRJUGhvbmVPUygpOworICByZXR1cm4gaXNUYXJnZXRNYWNPUygpOwogfQogCiB2b2lkIERhcndpbjo6Q2hlY2tPYmpDQVJDKCkgY29uc3QgewotICBpZiAoaXNUYXJnZXRJUGhvbmVPUygpIHx8ICFpc01hY29zeFZlcnNpb25MVCgxMCwgNikpCisgIGlmIChpc1RhcmdldElPU0Jhc2VkKCl8fCAoaXNUYXJnZXRNYWNPUygpICYmICFpc01hY29zeFZlcnNpb25MVCgxMCwgNikpKQogICAgIHJldHVybjsKICAgZ2V0RHJpdmVyKCkuRGlhZyhkaWFnOjplcnJfYXJjX3Vuc3VwcG9ydGVkX29uX3Rvb2xjaGFpbik7CiB9CiAKLXN0ZDo6c3RyaW5nCi1EYXJ3aW5fR2VuZXJpY19HQ0M6OkNvbXB1dGVFZmZlY3RpdmVDbGFuZ1RyaXBsZShjb25zdCBBcmdMaXN0ICZBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM6OklEIElucHV0VHlwZSkgY29uc3QgewotICByZXR1cm4gQ29tcHV0ZUxMVk1UcmlwbGUoQXJncywgSW5wdXRUeXBlKTsKLX0KLQogLy8vIEdlbmVyaWNfR0NDIC0gQSB0b29sIGNoYWluIHVzaW5nIHRoZSAnZ2NjJyBjb21tYW5kIHRvIHBlcmZvcm0KIC8vLyBhbGwgc3ViY29tbWFuZHM7IHRoaXMgcmVsaWVzIG9uIGdjYyB0cmFuc2xhdGluZyB0aGUgbWFqb3JpdHkgb2YKIC8vLyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KQEAgLTEwMDcsMTQgKzEyMDEsMTQgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgU3RyaW5nUmVmIGdldEdDQ1Rvb2xjaGFpbkRpcihjb25zdCBBcmdMaXN0ICZBcmdzKSB7CitzdGF0aWMgbGx2bTo6U3RyaW5nUmVmIGdldEdDQ1Rvb2xjaGFpbkRpcihjb25zdCBBcmdMaXN0ICZBcmdzKSB7CiAgIGNvbnN0IEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfZ2NjX3Rvb2xjaGFpbik7CiAgIGlmIChBKQogICAgIHJldHVybiBBLT5nZXRWYWx1ZSgpOwogICByZXR1cm4gR0NDX0lOU1RBTExfUFJFRklYOwogfQogCi0vLy8gXGJyaWVmIENvbnN0cnVjdCBhIEdDQ0luc3RhbGxhdGlvbkRldGVjdG9yIGZyb20gdGhlIGRyaXZlci4KKy8vLyBcYnJpZWYgSW5pdGlhbGl6ZSBhIEdDQ0luc3RhbGxhdGlvbkRldGVjdG9yIGZyb20gdGhlIGRyaXZlci4KIC8vLwogLy8vIFRoaXMgcGVyZm9ybXMgYWxsIG9mIHRoZSBhdXRvZGV0ZWN0aW9uIGFuZCBzZXRzIHVwIHRoZSB2YXJpb3VzIHBhdGhzLgogLy8vIE9uY2UgY29uc3RydWN0ZWQsIGEgR0NDSW5zdGFsbGF0aW9uRGV0ZWN0b3IgaXMgZXNzZW50aWFsbHkgaW1tdXRhYmxlLgpAQCAtMTAyMywxMyArMTIxNywxMiBAQAogLy8vIHNob3VsZCBpbnN0ZWFkIHB1bGwgdGhlIHRhcmdldCBvdXQgb2YgdGhlIGRyaXZlci4gVGhpcyBpcyBjdXJyZW50bHkKIC8vLyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZHJpdmVyIGRvZXNuJ3Qgc3RvcmUgdGhlIGZpbmFsIHZlcnNpb24gb2YgdGhlIHRhcmdldAogLy8vIHRyaXBsZS4KLUdlbmVyaWNfR0NDOjpHQ0NJbnN0YWxsYXRpb25EZXRlY3Rvcjo6R0NDSW5zdGFsbGF0aW9uRGV0ZWN0b3IoCi0gICAgY29uc3QgRHJpdmVyICZELCBjb25zdCBsbHZtOjpUcmlwbGUgJlRhcmdldFRyaXBsZSwgY29uc3QgQXJnTGlzdCAmQXJncykKLSAgICA6IElzVmFsaWQoZmFsc2UpLCBEKEQpIHsKK3ZvaWQKK0dlbmVyaWNfR0NDOjpHQ0NJbnN0YWxsYXRpb25EZXRlY3Rvcjo6aW5pdCgKKyAgICBjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06OlRyaXBsZSAmVGFyZ2V0VHJpcGxlLCBjb25zdCBBcmdMaXN0ICZBcmdzKSB7CiAgIGxsdm06OlRyaXBsZSBCaWFyY2hWYXJpYW50VHJpcGxlID0KICAgICAgIFRhcmdldFRyaXBsZS5pc0FyY2gzMkJpdCgpID8gVGFyZ2V0VHJpcGxlLmdldDY0Qml0QXJjaFZhcmlhbnQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUYXJnZXRUcmlwbGUuZ2V0MzJCaXRBcmNoVmFyaWFudCgpOwotICBsbHZtOjpUcmlwbGU6OkFyY2hUeXBlIFRhcmdldEFyY2ggPSBUYXJnZXRUcmlwbGUuZ2V0QXJjaCgpOwogICAvLyBUaGUgbGlicmFyeSBkaXJlY3RvcmllcyB3aGljaCBtYXkgY29udGFpbiBHQ0MgaW5zdGFsbGF0aW9ucy4KICAgU21hbGxWZWN0b3I8U3RyaW5nUmVmLCA0PiBDYW5kaWRhdGVMaWJEaXJzLCBDYW5kaWRhdGVCaWFyY2hMaWJEaXJzOwogICAvLyBUaGUgY29tcGF0aWJsZSBHQ0MgdHJpcGxlcyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZS4KQEAgLTEwNzUsNyArMTI2OCw3IEBACiAgICAgICBpZiAoIWxsdm06OnN5czo6ZnM6OmV4aXN0cyhMaWJEaXIpKQogICAgICAgICBjb250aW51ZTsKICAgICAgIGZvciAodW5zaWduZWQgayA9IDAsIGtlID0gQ2FuZGlkYXRlVHJpcGxlQWxpYXNlcy5zaXplKCk7IGsgPCBrZTsgKytrKQotICAgICAgICBTY2FuTGliRGlyRm9yR0NDVHJpcGxlKFRhcmdldEFyY2gsIEFyZ3MsIExpYkRpciwKKyAgICAgICAgU2NhbkxpYkRpckZvckdDQ1RyaXBsZShUYXJnZXRUcmlwbGUsIEFyZ3MsIExpYkRpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5kaWRhdGVUcmlwbGVBbGlhc2VzW2tdKTsKICAgICB9CiAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgamUgPSBDYW5kaWRhdGVCaWFyY2hMaWJEaXJzLnNpemUoKTsgaiA8IGplOyArK2opIHsKQEAgLTEwODQsNyArMTI3Nyw3IEBACiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgZm9yICh1bnNpZ25lZCBrID0gMCwga2UgPSBDYW5kaWRhdGVCaWFyY2hUcmlwbGVBbGlhc2VzLnNpemUoKTsgayA8IGtlOwogICAgICAgICAgICArK2spCi0gICAgICAgIFNjYW5MaWJEaXJGb3JHQ0NUcmlwbGUoVGFyZ2V0QXJjaCwgQXJncywgTGliRGlyLAorICAgICAgICBTY2FuTGliRGlyRm9yR0NDVHJpcGxlKFRhcmdldFRyaXBsZSwgQXJncywgTGliRGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmRpZGF0ZUJpYXJjaFRyaXBsZUFsaWFzZXNba10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypOZWVkc0JpYXJjaFN1ZmZpeD0qLyB0cnVlKTsKICAgICB9CkBAIC0xMDk4LDcgKzEyOTEsMjQgQEAKICAgICAgICBJICE9IEU7ICsrSSkKICAgICBPUyA8PCAiRm91bmQgY2FuZGlkYXRlIEdDQyBpbnN0YWxsYXRpb246ICIgPDwgKkkgPDwgIlxuIjsKIAotICBPUyA8PCAiU2VsZWN0ZWQgR0NDIGluc3RhbGxhdGlvbjogIiA8PCBHQ0NJbnN0YWxsUGF0aCA8PCAiXG4iOworICBpZiAoIUdDQ0luc3RhbGxQYXRoLmVtcHR5KCkpCisgICAgT1MgPDwgIlNlbGVjdGVkIEdDQyBpbnN0YWxsYXRpb246ICIgPDwgR0NDSW5zdGFsbFBhdGggPDwgIlxuIjsKKworICBmb3IgKE11bHRpbGliU2V0Ojpjb25zdF9pdGVyYXRvciBJID0gTXVsdGlsaWJzLmJlZ2luKCksIEUgPSBNdWx0aWxpYnMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBPUyA8PCAiQ2FuZGlkYXRlIG11bHRpbGliOiAiIDw8ICpJIDw8ICJcbiI7CisgIH0KKworICBpZiAoTXVsdGlsaWJzLnNpemUoKSAhPSAwIHx8ICFTZWxlY3RlZE11bHRpbGliLmlzRGVmYXVsdCgpKQorICAgIE9TIDw8ICJTZWxlY3RlZCBtdWx0aWxpYjogIiA8PCBTZWxlY3RlZE11bHRpbGliIDw8ICJcbiI7Cit9CisKK2Jvb2wgR2VuZXJpY19HQ0M6OkdDQ0luc3RhbGxhdGlvbkRldGVjdG9yOjpnZXRCaWFyY2hTaWJsaW5nKE11bHRpbGliICZNKSBjb25zdCB7CisgIGlmIChCaWFyY2hTaWJsaW5nLmhhc1ZhbHVlKCkpIHsKKyAgICBNID0gQmlhcmNoU2libGluZy5nZXRWYWx1ZSgpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKIH0KIAogLypzdGF0aWMqLyB2b2lkIEdlbmVyaWNfR0NDOjpHQ0NJbnN0YWxsYXRpb25EZXRlY3Rvcjo6Q29sbGVjdExpYkRpcnNBbmRUcmlwbGVzKApAQCAtMTExMywyNSArMTMyMywzNCBAQAogICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgQUFyY2g2NExpYkRpcnNbXSA9IHsgIi9saWIiIH07CiAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBBQXJjaDY0VHJpcGxlc1tdID0geyAiYWFyY2g2NC1ub25lLWxpbnV4LWdudSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWFyY2g2NC1saW51eC1nbnUiIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBBQXJjaDY0YmVMaWJEaXJzW10gPSB7ICIvbGliIiB9OworICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgQUFyY2g2NGJlVHJpcGxlc1tdID0geyAiYWFyY2g2NF9iZS1ub25lLWxpbnV4LWdudSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYXJjaDY0X2JlLWxpbnV4LWdudSIgfTsKIAogICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgQVJNTGliRGlyc1tdID0geyAiL2xpYiIgfTsKICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEFSTVRyaXBsZXNbXSA9IHsgImFybS1saW51eC1nbnVlYWJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFybS1saW51eC1hbmRyb2lkZWFiaSIgfTsKICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEFSTUhGVHJpcGxlc1tdID0geyAiYXJtLWxpbnV4LWdudWVhYmloZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFybXY3aGwtcmVkaGF0LWxpbnV4LWdudWVhYmkiIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBBUk1lYkxpYkRpcnNbXSA9IHsgIi9saWIiIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBBUk1lYlRyaXBsZXNbXSA9IHsgImFybWViLWxpbnV4LWdudWVhYmkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcm1lYi1saW51eC1hbmRyb2lkZWFiaSIgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEFSTWViSEZUcmlwbGVzW10gPSB7ICJhcm1lYi1saW51eC1nbnVlYWJpaGYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFybWVidjdobC1yZWRoYXQtbGludXgtZ251ZWFiaSIgfTsKIAogICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgWDg2XzY0TGliRGlyc1tdID0geyAiL2xpYjY0IiwgIi9saWIiIH07CiAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBYODZfNjRUcmlwbGVzW10gPSB7CiAgICAgIng4Nl82NC1saW51eC1nbnUiLCAieDg2XzY0LXVua25vd24tbGludXgtZ251IiwgIng4Nl82NC1wYy1saW51eC1nbnUiLAogICAgICJ4ODZfNjQtcmVkaGF0LWxpbnV4NkUiLCAieDg2XzY0LXJlZGhhdC1saW51eCIsICJ4ODZfNjQtc3VzZS1saW51eCIsCi0gICAgIng4Nl82NC1tYW5iby1saW51eC1nbnUiLCAieDg2XzY0LWxpbnV4LWdudSIsICJ4ODZfNjQtc2xhY2t3YXJlLWxpbnV4IgorICAgICJ4ODZfNjQtbWFuYm8tbGludXgtZ251IiwgIng4Nl82NC1saW51eC1nbnUiLCAieDg2XzY0LXNsYWNrd2FyZS1saW51eCIsCisgICAgIng4Nl82NC1saW51eC1hbmRyb2lkIgogICB9OwogICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgWDg2TGliRGlyc1tdID0geyAiL2xpYjMyIiwgIi9saWIiIH07CiAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBYODZUcmlwbGVzW10gPSB7CiAgICAgImk2ODYtbGludXgtZ251IiwgImk2ODYtcGMtbGludXgtZ251IiwgImk0ODYtbGludXgtZ251IiwgImkzODYtbGludXgtZ251IiwKICAgICAiaTM4Ni1yZWRoYXQtbGludXg2RSIsICJpNjg2LXJlZGhhdC1saW51eCIsICJpNTg2LXJlZGhhdC1saW51eCIsCiAgICAgImkzODYtcmVkaGF0LWxpbnV4IiwgImk1ODYtc3VzZS1saW51eCIsICJpNDg2LXNsYWNrd2FyZS1saW51eCIsCi0gICAgImk2ODYtbW9udGF2aXN0YS1saW51eCIKKyAgICAiaTY4Ni1tb250YXZpc3RhLWxpbnV4IiwgImk2ODYtbGludXgtYW5kcm9pZCIKICAgfTsKIAogICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgTUlQU0xpYkRpcnNbXSA9IHsgIi9saWIiIH07CkBAIC0xMTQ2LDcgKzEzNjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlwcy1tdGktbGludXgtZ251IiB9OwogICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgTUlQUzY0RUxMaWJEaXJzW10gPSB7ICIvbGliNjQiLCAiL2xpYiIgfTsKICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IE1JUFM2NEVMVHJpcGxlc1tdID0geyAibWlwczY0ZWwtbGludXgtZ251IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlwcy1tdGktbGludXgtZ251IiB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXBzLW10aS1saW51eC1nbnUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXBzNjRlbC1saW51eC1hbmRyb2lkIiB9OwogCiAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBQUENMaWJEaXJzW10gPSB7ICIvbGliMzIiLCAiL2xpYiIgfTsKICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFBQQ1RyaXBsZXNbXSA9IHsKQEAgLTExNjQsNiArMTM4NCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvd2VycGM2NGxlLXN1c2UtbGludXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwYzY0bGUtcmVkaGF0LWxpbnV4IiB9OwogCisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBTUEFSQ3Y4TGliRGlyc1tdID0geyAiL2xpYjMyIiwgIi9saWIiIH07CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBTUEFSQ3Y4VHJpcGxlc1tdID0geyAic3BhcmMtbGludXgtZ251IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFyY3Y4LWxpbnV4LWdudSIgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFNQQVJDdjlMaWJEaXJzW10gPSB7ICIvbGliNjQiLCAiL2xpYiIgfTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFNQQVJDdjlUcmlwbGVzW10gPSB7ICJzcGFyYzY0LWxpbnV4LWdudSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BhcmN2OS1saW51eC1nbnUiIH07CisKICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFN5c3RlbVpMaWJEaXJzW10gPSB7ICIvbGliNjQiLCAiL2xpYiIgfTsKICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFN5c3RlbVpUcmlwbGVzW10gPSB7CiAgICAgInMzOTB4LWxpbnV4LWdudSIsICJzMzkweC11bmtub3duLWxpbnV4LWdudSIsICJzMzkweC1pYm0tbGludXgtZ251IiwKQEAgLTExNzEsNiArMTM5OCw3IEBACiAgIH07CiAKICAgc3dpdGNoIChUYXJnZXRUcmlwbGUuZ2V0QXJjaCgpKSB7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm02NDoKICAgY2FzZSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQ6CiAgICAgTGliRGlycy5hcHBlbmQoQUFyY2g2NExpYkRpcnMsCiAgICAgICAgICAgICAgICAgICAgQUFyY2g2NExpYkRpcnMgKyBsbHZtOjphcnJheV9sZW5ndGhvZihBQXJjaDY0TGliRGlycykpOwpAQCAtMTE4MSw2ICsxNDA5LDE2IEBACiAgICAgQmlhcmNoVHJpcGxlQWxpYXNlcy5hcHBlbmQoCiAgICAgICAgIEFBcmNoNjRUcmlwbGVzLCBBQXJjaDY0VHJpcGxlcyArIGxsdm06OmFycmF5X2xlbmd0aG9mKEFBcmNoNjRUcmlwbGVzKSk7CiAgICAgYnJlYWs7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphYXJjaDY0X2JlOgorICAgIExpYkRpcnMuYXBwZW5kKEFBcmNoNjRiZUxpYkRpcnMsCisgICAgICAgICAgICAgICAgICAgQUFyY2g2NGJlTGliRGlycyArIGxsdm06OmFycmF5X2xlbmd0aG9mKEFBcmNoNjRiZUxpYkRpcnMpKTsKKyAgICBUcmlwbGVBbGlhc2VzLmFwcGVuZChBQXJjaDY0YmVUcmlwbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFBcmNoNjRiZVRyaXBsZXMgKyBsbHZtOjphcnJheV9sZW5ndGhvZihBQXJjaDY0YmVUcmlwbGVzKSk7CisgICAgQmlhcmNoTGliRGlycy5hcHBlbmQoQUFyY2g2NGJlTGliRGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBQXJjaDY0YmVMaWJEaXJzICsgbGx2bTo6YXJyYXlfbGVuZ3Rob2YoQUFyY2g2NGJlTGliRGlycykpOworICAgIEJpYXJjaFRyaXBsZUFsaWFzZXMuYXBwZW5kKAorICAgICAgICBBQXJjaDY0YmVUcmlwbGVzLCBBQXJjaDY0YmVUcmlwbGVzICsgbGx2bTo6YXJyYXlfbGVuZ3Rob2YoQUFyY2g2NGJlVHJpcGxlcykpOworICAgIGJyZWFrOwogICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtOgogICBjYXNlIGxsdm06OlRyaXBsZTo6dGh1bWI6CiAgICAgTGliRGlycy5hcHBlbmQoQVJNTGliRGlycywgQVJNTGliRGlycyArIGxsdm06OmFycmF5X2xlbmd0aG9mKEFSTUxpYkRpcnMpKTsKQEAgLTExOTIsNiArMTQzMCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNVHJpcGxlcyArIGxsdm06OmFycmF5X2xlbmd0aG9mKEFSTVRyaXBsZXMpKTsKICAgICB9CiAgICAgYnJlYWs7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm1lYjoKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OnRodW1iZWI6CisgICAgTGliRGlycy5hcHBlbmQoQVJNZWJMaWJEaXJzLCBBUk1lYkxpYkRpcnMgKyBsbHZtOjphcnJheV9sZW5ndGhvZihBUk1lYkxpYkRpcnMpKTsKKyAgICBpZiAoVGFyZ2V0VHJpcGxlLmdldEVudmlyb25tZW50KCkgPT0gbGx2bTo6VHJpcGxlOjpHTlVFQUJJSEYpIHsKKyAgICAgIFRyaXBsZUFsaWFzZXMuYXBwZW5kKEFSTWViSEZUcmlwbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNZWJIRlRyaXBsZXMgKyBsbHZtOjphcnJheV9sZW5ndGhvZihBUk1lYkhGVHJpcGxlcykpOworICAgIH0gZWxzZSB7CisgICAgICBUcmlwbGVBbGlhc2VzLmFwcGVuZChBUk1lYlRyaXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1lYlRyaXBsZXMgKyBsbHZtOjphcnJheV9sZW5ndGhvZihBUk1lYlRyaXBsZXMpKTsKKyAgICB9CisgICAgYnJlYWs7CiAgIGNhc2UgbGx2bTo6VHJpcGxlOjp4ODZfNjQ6CiAgICAgTGliRGlycy5hcHBlbmQoWDg2XzY0TGliRGlycywKICAgICAgICAgICAgICAgICAgICBYODZfNjRMaWJEaXJzICsgbGx2bTo6YXJyYXlfbGVuZ3Rob2YoWDg2XzY0TGliRGlycykpOwpAQCAtMTI4Myw2ICsxNTMyLDI2IEBACiAgICAgVHJpcGxlQWxpYXNlcy5hcHBlbmQoUFBDNjRMRVRyaXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDNjRMRVRyaXBsZXMgKyBsbHZtOjphcnJheV9sZW5ndGhvZihQUEM2NExFVHJpcGxlcykpOwogICAgIGJyZWFrOworICBjYXNlIGxsdm06OlRyaXBsZTo6c3BhcmM6CisgICAgTGliRGlycy5hcHBlbmQoU1BBUkN2OExpYkRpcnMsCisgICAgICAgICAgICAgICAgICAgU1BBUkN2OExpYkRpcnMgKyBsbHZtOjphcnJheV9sZW5ndGhvZihTUEFSQ3Y4TGliRGlycykpOworICAgIFRyaXBsZUFsaWFzZXMuYXBwZW5kKFNQQVJDdjhUcmlwbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNQQVJDdjhUcmlwbGVzICsgbGx2bTo6YXJyYXlfbGVuZ3Rob2YoU1BBUkN2OFRyaXBsZXMpKTsKKyAgICBCaWFyY2hMaWJEaXJzLmFwcGVuZChTUEFSQ3Y5TGliRGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTUEFSQ3Y5TGliRGlycyArIGxsdm06OmFycmF5X2xlbmd0aG9mKFNQQVJDdjlMaWJEaXJzKSk7CisgICAgQmlhcmNoVHJpcGxlQWxpYXNlcy5hcHBlbmQoCisgICAgICAgIFNQQVJDdjlUcmlwbGVzLCBTUEFSQ3Y5VHJpcGxlcyArIGxsdm06OmFycmF5X2xlbmd0aG9mKFNQQVJDdjlUcmlwbGVzKSk7CisgICAgYnJlYWs7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjpzcGFyY3Y5OgorICAgIExpYkRpcnMuYXBwZW5kKFNQQVJDdjlMaWJEaXJzLAorICAgICAgICAgICAgICAgICAgIFNQQVJDdjlMaWJEaXJzICsgbGx2bTo6YXJyYXlfbGVuZ3Rob2YoU1BBUkN2OUxpYkRpcnMpKTsKKyAgICBUcmlwbGVBbGlhc2VzLmFwcGVuZChTUEFSQ3Y5VHJpcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTUEFSQ3Y5VHJpcGxlcyArIGxsdm06OmFycmF5X2xlbmd0aG9mKFNQQVJDdjlUcmlwbGVzKSk7CisgICAgQmlhcmNoTGliRGlycy5hcHBlbmQoU1BBUkN2OExpYkRpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU1BBUkN2OExpYkRpcnMgKyBsbHZtOjphcnJheV9sZW5ndGhvZihTUEFSQ3Y4TGliRGlycykpOworICAgIEJpYXJjaFRyaXBsZUFsaWFzZXMuYXBwZW5kKAorICAgICAgICBTUEFSQ3Y4VHJpcGxlcywgU1BBUkN2OFRyaXBsZXMgKyBsbHZtOjphcnJheV9sZW5ndGhvZihTUEFSQ3Y4VHJpcGxlcykpOworICAgIGJyZWFrOwogICBjYXNlIGxsdm06OlRyaXBsZTo6c3lzdGVtejoKICAgICBMaWJEaXJzLmFwcGVuZChTeXN0ZW1aTGliRGlycywKICAgICAgICAgICAgICAgICAgICBTeXN0ZW1aTGliRGlycyArIGxsdm06OmFycmF5X2xlbmd0aG9mKFN5c3RlbVpMaWJEaXJzKSk7CkBAIC0xMzA1LDIyICsxNTc0LDQ1IEBACiAgICAgQmlhcmNoVHJpcGxlQWxpYXNlcy5wdXNoX2JhY2soQmlhcmNoVHJpcGxlLnN0cigpKTsKIH0KIAotc3RhdGljIGJvb2wgaXNTb2Z0RmxvYXRBQkkoY29uc3QgQXJnTGlzdCAmQXJncykgewotICBBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX21zb2Z0X2Zsb2F0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX21oYXJkX2Zsb2F0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX21mbG9hdF9hYmlfRVEpOwotICBpZiAoIUEpIHJldHVybiBmYWxzZTsKK25hbWVzcGFjZSB7CisvLyBGaWx0ZXIgdG8gcmVtb3ZlIE11bHRpbGlicyB0aGF0IGRvbid0IGV4aXN0IGFzIGEgc3VmZml4IHRvIFBhdGgKK2NsYXNzIEZpbHRlck5vbkV4aXN0ZW50IDogcHVibGljIE11bHRpbGliU2V0OjpGaWx0ZXJDYWxsYmFjayB7CisgIHN0ZDo6c3RyaW5nIEJhc2U7CitwdWJsaWM6CisgIEZpbHRlck5vbkV4aXN0ZW50KHN0ZDo6c3RyaW5nIEJhc2UpIDogQmFzZShCYXNlKSB7fQorICBib29sIG9wZXJhdG9yKCkoY29uc3QgTXVsdGlsaWIgJk0pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gIWxsdm06OnN5czo6ZnM6OmV4aXN0cyhCYXNlICsgTS5nY2NTdWZmaXgoKSArICIvY3J0YmVnaW4ubyIpOworICB9Cit9OworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQogCi0gIHJldHVybiBBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9tc29mdF9mbG9hdCkgfHwKLSAgICAgICAgIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9tZmxvYXRfYWJpX0VRKSAmJgotICAgICAgICAgIEEtPmdldFZhbHVlKCkgPT0gU3RyaW5nUmVmKCJzb2Z0IikpOworc3RhdGljIHZvaWQgYWRkTXVsdGlsaWJGbGFnKGJvb2wgRW5hYmxlZCwgY29uc3QgY2hhciAqY29uc3QgRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkZsYWdzKSB7CisgIGlmIChFbmFibGVkKQorICAgIEZsYWdzLnB1c2hfYmFjayhzdGQ6OnN0cmluZygiKyIpICsgRmxhZyk7CisgIGVsc2UKKyAgICBGbGFncy5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi0iKSArIEZsYWcpOwogfQogCiBzdGF0aWMgYm9vbCBpc01pcHNBcmNoKGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgQXJjaCkgewotICByZXR1cm4gQXJjaCA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwKLSAgICAgICAgIEFyY2ggPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwgfHwKLSAgICAgICAgIEFyY2ggPT0gbGx2bTo6VHJpcGxlOjptaXBzNjQgfHwKLSAgICAgICAgIEFyY2ggPT0gbGx2bTo6VHJpcGxlOjptaXBzNjRlbDsKKyAgcmV0dXJuIEFyY2ggPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IEFyY2ggPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwgfHwKKyAgICAgICAgIEFyY2ggPT0gbGx2bTo6VHJpcGxlOjptaXBzNjQgfHwgQXJjaCA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NGVsOworfQorCitzdGF0aWMgYm9vbCBpc01pcHMzMihsbHZtOjpUcmlwbGU6OkFyY2hUeXBlIEFyY2gpIHsKKyAgcmV0dXJuIEFyY2ggPT0gbGx2bTo6VHJpcGxlOjptaXBzIHx8IEFyY2ggPT0gbGx2bTo6VHJpcGxlOjptaXBzZWw7Cit9CisKK3N0YXRpYyBib29sIGlzTWlwczY0KGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgQXJjaCkgeworICByZXR1cm4gQXJjaCA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NCB8fCBBcmNoID09IGxsdm06OlRyaXBsZTo6bWlwczY0ZWw7Cit9CisKK3N0YXRpYyBib29sIGlzTWlwc0VMKGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgQXJjaCkgeworICByZXR1cm4gQXJjaCA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCB8fCBBcmNoID09IGxsdm06OlRyaXBsZTo6bWlwczY0ZWw7Cit9CisKK3N0YXRpYyBib29sIGlzTWlwc0VCKGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgQXJjaCkgeworICByZXR1cm4gQXJjaCA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwgQXJjaCA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NDsKIH0KIAogc3RhdGljIGJvb2wgaXNNaXBzMTYoY29uc3QgQXJnTGlzdCAmQXJncykgewpAQCAtMTM1OSw0MiArMTY1MSw5IEBACiAgIHJldHVybiBBICYmIEEtPmdldFZhbHVlKCkgPT0gU3RyaW5nUmVmKCIyMDA4Iik7CiB9CiAKLS8vIEZJWE1FOiBUaGVyZSBpcyB0aGUgc2FtZSByb3V0aW5lIGluIHRoZSBUb29scy5jcHAuCi1zdGF0aWMgYm9vbCBoYXNNaXBzTjMyQUJJQXJnKGNvbnN0IEFyZ0xpc3QgJkFyZ3MpIHsKLSAgQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tYWJpX0VRKTsKLSAgcmV0dXJuIEEgJiYgKEEtPmdldFZhbHVlKCkgPT0gU3RyaW5nUmVmKCJuMzIiKSk7Ci19Ci0KLXN0YXRpYyBib29sIGhhc0NydEJlZ2luT2JqKFR3aW5lIFBhdGgpIHsKLSAgcmV0dXJuIGxsdm06OnN5czo6ZnM6OmV4aXN0cyhQYXRoICsgIi9jcnRiZWdpbi5vIik7Ci19Ci0KLXN0YXRpYyBib29sIGZpbmRUYXJnZXRCaWFyY2hTdWZmaXgoc3RkOjpzdHJpbmcgJlN1ZmZpeCwgU3RyaW5nUmVmIFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgVGFyZ2V0QXJjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnTGlzdCAmQXJncykgewotICAvLyBGSVhNRTogVGhpcyByb3V0aW5lIHdhcyBvbmx5IGludGVuZGVkIHRvIG1vZGVsIGJpLWFyY2ggdG9vbGNoYWlucyB3aGljaAotICAvLyB1c2UgLW0zMiBhbmQgLW02NCB0byBzd2FwIGJldHdlZW4gdmFyaWFudHMgb2YgYSB0YXJnZXQuIEl0IHNob3VsZG4ndCBiZQotICAvLyBkb2luZyBBQkktYmFzZWQgYnVpbHRpbiBsb2NhdGlvbiBmb3IgTUlQUy4KLSAgaWYgKGhhc01pcHNOMzJBQklBcmcoQXJncykpCi0gICAgU3VmZml4ID0gIi9uMzIiOwotICBlbHNlIGlmIChUYXJnZXRBcmNoID09IGxsdm06OlRyaXBsZTo6eDg2XzY0IHx8Ci0gICAgICAgICAgIFRhcmdldEFyY2ggPT0gbGx2bTo6VHJpcGxlOjpwcGM2NCB8fAotICAgICAgICAgICBUYXJnZXRBcmNoID09IGxsdm06OlRyaXBsZTo6c3lzdGVteiB8fAotICAgICAgICAgICBUYXJnZXRBcmNoID09IGxsdm06OlRyaXBsZTo6bWlwczY0IHx8Ci0gICAgICAgICAgIFRhcmdldEFyY2ggPT0gbGx2bTo6VHJpcGxlOjptaXBzNjRlbCkKLSAgICBTdWZmaXggPSAiLzY0IjsKLSAgZWxzZQotICAgIFN1ZmZpeCA9ICIvMzIiOwotCi0gIHJldHVybiBoYXNDcnRCZWdpbk9iaihQYXRoICsgU3VmZml4KTsKLX0KLQotdm9pZCBHZW5lcmljX0dDQzo6R0NDSW5zdGFsbGF0aW9uRGV0ZWN0b3I6OmZpbmRNSVBTQUJJRGlyU3VmZml4KAotICAgIHN0ZDo6c3RyaW5nICZTdWZmaXgsIGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgVGFyZ2V0QXJjaCwgU3RyaW5nUmVmIFBhdGgsCitib29sIEdlbmVyaWNfR0NDOjpHQ0NJbnN0YWxsYXRpb25EZXRlY3Rvcjo6ZmluZE1JUFNNdWx0aWxpYnMoCisgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUYXJnZXRUcmlwbGUsIFN0cmluZ1JlZiBQYXRoLAogICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncykgewotICBpZiAoIWlzTWlwc0FyY2goVGFyZ2V0QXJjaCkpCi0gICAgcmV0dXJuOwotCiAgIC8vIFNvbWUgTUlQUyB0b29sY2hhaW5zIHB1dCBsaWJyYXJpZXMgYW5kIG9iamVjdCBmaWxlcyBjb21waWxlZAogICAvLyB1c2luZyBkaWZmZXJlbnQgb3B0aW9ucyBpbiB0byB0aGUgc3ViLWRpcmVjdG9yaXMgd2hpY2ggbmFtZXMKICAgLy8gcmVmbGVjdHMgdGhlIGZsYWdzIHVzZWQgZm9yIGNvbXBpbGF0aW9uLiBGb3IgZXhhbXBsZSBzeXNyb290CkBAIC0xNDE5LDcxICsxNjc4LDMwMiBAQAogICAvLyAvbWlwczMyCiAgIC8vICAgICAvdXNyCiAgIC8vICAgICAgIC9saWIgIDw9IGNydCoubyBmaWxlcyBjb21waWxlZCB3aXRoICctbWlwczMyJwotICAvLwotICAvLyBVbmZvcnR1bmF0ZWx5IGRpZmZlcmVudCB0b29sY2hhaW5zIHVzZSBkaWZmZXJlbnQgYW5kIHBhcnRpYWxseQotICAvLyBvdmVybGFwcGVkIG5hbWluZyBzY2hlbWVzLiBTbyB3ZSBoYXZlIHRvIG1ha2UgYSB0cmljayBmb3IgZGV0ZWN0aW9uCi0gIC8vIG9mIHVzaW5nIHRvb2xjaGFpbi4gV2UgbG9va3VwIGEgcGF0aCB3aGljaCB1bmlxdWUgZm9yIGVhY2ggdG9vbGNoYWlucy4KIAotICBib29sIElzTWVudG9yVG9vbENoYWluID0gaGFzQ3J0QmVnaW5PYmooUGF0aCArICIvbWlwczE2L3NvZnQtZmxvYXQiKTsKLSAgYm9vbCBJc0ZTRlRvb2xDaGFpbiA9IGhhc0NydEJlZ2luT2JqKFBhdGggKyAiL21pcHMzMi9taXBzMTYvc29mIik7CisgIEZpbHRlck5vbkV4aXN0ZW50IE5vbkV4aXN0ZW50KFBhdGgpOwogCi0gIGlmIChJc01lbnRvclRvb2xDaGFpbiAmJiBJc0ZTRlRvb2xDaGFpbikKLSAgICBELkRpYWcoZGlhZzo6ZXJyX2Rydl91bmtub3duX3Rvb2xjaGFpbik7CisgIC8vIENoZWNrIGZvciBGU0YgdG9vbGNoYWluIG11bHRpbGlicworICBNdWx0aWxpYlNldCBGU0ZNaXBzTXVsdGlsaWJzOworICB7CisgICAgTXVsdGlsaWIgTUFyY2hNaXBzMzIgPSBNdWx0aWxpYigpCisgICAgICAuZ2NjU3VmZml4KCIvbWlwczMyIikKKyAgICAgIC5vc1N1ZmZpeCgiL21pcHMzMiIpCisgICAgICAuaW5jbHVkZVN1ZmZpeCgiL21pcHMzMiIpCisgICAgICAuZmxhZygiK20zMiIpLmZsYWcoIi1tNjQiKS5mbGFnKCItbW1pY3JvbWlwcyIpLmZsYWcoIi1tYXJjaD1taXBzMzJyMiIpOwogCi0gIGlmIChJc01lbnRvclRvb2xDaGFpbikgewotICAgIGlmIChpc01pcHMxNihBcmdzKSkKLSAgICAgIFN1ZmZpeCArPSAiL21pcHMxNiI7Ci0gICAgZWxzZSBpZiAoaXNNaWNyb01pcHMoQXJncykpCi0gICAgICBTdWZmaXggKz0gIi9taWNyb21pcHMiOworICAgIE11bHRpbGliIE1BcmNoTWljcm9NaXBzID0gTXVsdGlsaWIoKQorICAgICAgLmdjY1N1ZmZpeCgiL21pY3JvbWlwcyIpCisgICAgICAub3NTdWZmaXgoIi9taWNyb21pcHMiKQorICAgICAgLmluY2x1ZGVTdWZmaXgoIi9taWNyb21pcHMiKQorICAgICAgLmZsYWcoIittMzIiKS5mbGFnKCItbTY0IikuZmxhZygiK21taWNyb21pcHMiKTsKIAotICAgIGlmIChpc1NvZnRGbG9hdEFCSShBcmdzKSkKLSAgICAgIFN1ZmZpeCArPSAiL3NvZnQtZmxvYXQiOworICAgIE11bHRpbGliIE1BcmNoTWlwczY0cjIgPSBNdWx0aWxpYigpCisgICAgICAuZ2NjU3VmZml4KCIvbWlwczY0cjIiKQorICAgICAgLm9zU3VmZml4KCIvbWlwczY0cjIiKQorICAgICAgLmluY2x1ZGVTdWZmaXgoIi9taXBzNjRyMiIpCisgICAgICAuZmxhZygiLW0zMiIpLmZsYWcoIittNjQiKS5mbGFnKCIrbWFyY2g9bWlwczY0cjIiKTsKIAotICAgIGlmIChUYXJnZXRBcmNoID09IGxsdm06OlRyaXBsZTo6bWlwc2VsIHx8Ci0gICAgICAgIFRhcmdldEFyY2ggPT0gbGx2bTo6VHJpcGxlOjptaXBzNjRlbCkKLSAgICAgIFN1ZmZpeCArPSAiL2VsIjsKLSAgfSBlbHNlIGlmIChJc0ZTRlRvb2xDaGFpbikgewotICAgIGlmIChUYXJnZXRBcmNoID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fAotICAgICAgICBUYXJnZXRBcmNoID09IGxsdm06OlRyaXBsZTo6bWlwc2VsKSB7Ci0gICAgICBpZiAoaXNNaWNyb01pcHMoQXJncykpCi0gICAgICAgIFN1ZmZpeCArPSAiL21pY3JvbWlwcyI7Ci0gICAgICBlbHNlIGlmIChpc01pcHMzMnIyKEFyZ3MpKQotICAgICAgICBTdWZmaXggKz0gIiI7Ci0gICAgICBlbHNlCi0gICAgICAgIFN1ZmZpeCArPSAiL21pcHMzMiI7CisgICAgTXVsdGlsaWIgTUFyY2hNaXBzNjQgPSBNdWx0aWxpYigpCisgICAgICAuZ2NjU3VmZml4KCIvbWlwczY0IikKKyAgICAgIC5vc1N1ZmZpeCgiL21pcHM2NCIpCisgICAgICAuaW5jbHVkZVN1ZmZpeCgiL21pcHM2NCIpCisgICAgICAuZmxhZygiLW0zMiIpLmZsYWcoIittNjQiKS5mbGFnKCItbWFyY2g9bWlwczY0cjIiKTsKIAotICAgICAgaWYgKGlzTWlwczE2KEFyZ3MpKQotICAgICAgICBTdWZmaXggKz0gIi9taXBzMTYiOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoaXNNaXBzNjRyMihBcmdzKSkKLSAgICAgICAgU3VmZml4ICs9IGhhc01pcHNOMzJBQklBcmcoQXJncykgPyAiL21pcHM2NHIyIiA6ICIvbWlwczY0cjIvNjQiOwotICAgICAgZWxzZQotICAgICAgICBTdWZmaXggKz0gaGFzTWlwc04zMkFCSUFyZyhBcmdzKSA/ICIvbWlwczY0IiA6ICIvbWlwczY0LzY0IjsKLSAgICB9CisgICAgTXVsdGlsaWIgTUFyY2hEZWZhdWx0ID0gTXVsdGlsaWIoKQorICAgICAgLmZsYWcoIittMzIiKS5mbGFnKCItbTY0IikuZmxhZygiK21hcmNoPW1pcHMzMnIyIik7CiAKLSAgICBpZiAoVGFyZ2V0QXJjaCA9PSBsbHZtOjpUcmlwbGU6Om1pcHNlbCB8fAotICAgICAgICBUYXJnZXRBcmNoID09IGxsdm06OlRyaXBsZTo6bWlwczY0ZWwpCi0gICAgICBTdWZmaXggKz0gIi9lbCI7CisgICAgTXVsdGlsaWIgTWlwczE2ID0gTXVsdGlsaWIoKQorICAgICAgLmdjY1N1ZmZpeCgiL21pcHMxNiIpCisgICAgICAub3NTdWZmaXgoIi9taXBzMTYiKQorICAgICAgLmluY2x1ZGVTdWZmaXgoIi9taXBzMTYiKQorICAgICAgLmZsYWcoIittaXBzMTYiKTsKIAotICAgIGlmIChpc1NvZnRGbG9hdEFCSShBcmdzKSkKLSAgICAgIFN1ZmZpeCArPSAiL3NvZiI7Ci0gICAgZWxzZSB7Ci0gICAgICBpZiAoaXNNaXBzRlA2NChBcmdzKSkKLSAgICAgICAgU3VmZml4ICs9ICIvZnA2NCI7CisgICAgTXVsdGlsaWIgTUFiaTY0ID0gTXVsdGlsaWIoKQorICAgICAgLmdjY1N1ZmZpeCgiLzY0IikKKyAgICAgIC5vc1N1ZmZpeCgiLzY0IikKKyAgICAgIC5pbmNsdWRlU3VmZml4KCIvNjQiKQorICAgICAgLmZsYWcoIittYWJpPTY0IikuZmxhZygiLW1hYmk9bjMyIikuZmxhZygiLW0zMiIpOwogCi0gICAgICBpZiAoaXNNaXBzTmFuMjAwOChBcmdzKSkKLSAgICAgICAgU3VmZml4ICs9ICIvbmFuMjAwOCI7CisgICAgTXVsdGlsaWIgQmlnRW5kaWFuID0gTXVsdGlsaWIoKQorICAgICAgLmZsYWcoIitFQiIpLmZsYWcoIi1FTCIpOworCisgICAgTXVsdGlsaWIgTGl0dGxlRW5kaWFuID0gTXVsdGlsaWIoKQorICAgICAgLmdjY1N1ZmZpeCgiL2VsIikKKyAgICAgIC5vc1N1ZmZpeCgiL2VsIikKKyAgICAgIC5pbmNsdWRlU3VmZml4KCIvZWwiKQorICAgICAgLmZsYWcoIitFTCIpLmZsYWcoIi1FQiIpOworCisgICAgTXVsdGlsaWIgU29mdEZsb2F0ID0gTXVsdGlsaWIoKQorICAgICAgLmdjY1N1ZmZpeCgiL3NvZiIpCisgICAgICAub3NTdWZmaXgoIi9zb2YiKQorICAgICAgLmluY2x1ZGVTdWZmaXgoIi9zb2YiKQorICAgICAgLmZsYWcoIittc29mdC1mbG9hdCIpOworCisgICAgTXVsdGlsaWIgRlA2NCA9IE11bHRpbGliKCkKKyAgICAgIC5nY2NTdWZmaXgoIi9mcDY0IikKKyAgICAgIC5vc1N1ZmZpeCgiL2ZwNjQiKQorICAgICAgLmluY2x1ZGVTdWZmaXgoIi9mcDY0IikKKyAgICAgIC5mbGFnKCIrbWZwNjQiKTsKKworICAgIE11bHRpbGliIE5hbjIwMDggPSBNdWx0aWxpYigpCisgICAgICAuZ2NjU3VmZml4KCIvbmFuMjAwOCIpCisgICAgICAub3NTdWZmaXgoIi9uYW4yMDA4IikKKyAgICAgIC5pbmNsdWRlU3VmZml4KCIvbmFuMjAwOCIpCisgICAgICAuZmxhZygiK21uYW49MjAwOCIpOworCisgICAgRlNGTWlwc011bHRpbGlicyA9IE11bHRpbGliU2V0KCkKKyAgICAgIC5FaXRoZXIoTUFyY2hNaXBzMzIsIE1BcmNoTWljcm9NaXBzLCAKKyAgICAgICAgICAgICAgTUFyY2hNaXBzNjRyMiwgTUFyY2hNaXBzNjQsIE1BcmNoRGVmYXVsdCkKKyAgICAgIC5NYXliZShNaXBzMTYpCisgICAgICAuRmlsdGVyT3V0KCIvbWlwczY0L21pcHMxNiIpCisgICAgICAuRmlsdGVyT3V0KCIvbWlwczY0cjIvbWlwczE2IikKKyAgICAgIC5GaWx0ZXJPdXQoIi9taWNyb21pcHMvbWlwczE2IikKKyAgICAgIC5NYXliZShNQWJpNjQpCisgICAgICAuRmlsdGVyT3V0KCIvbWljcm9taXBzLzY0IikKKyAgICAgIC5GaWx0ZXJPdXQoIi9taXBzMzIvNjQiKQorICAgICAgLkZpbHRlck91dCgiXi82NCIpCisgICAgICAuRmlsdGVyT3V0KCIvbWlwczE2LzY0IikKKyAgICAgIC5FaXRoZXIoQmlnRW5kaWFuLCBMaXR0bGVFbmRpYW4pCisgICAgICAuTWF5YmUoU29mdEZsb2F0KQorICAgICAgLk1heWJlKEZQNjQpCisgICAgICAuTWF5YmUoTmFuMjAwOCkKKyAgICAgIC5GaWx0ZXJPdXQoIi4qc29mL25hbjIwMDgiKQorICAgICAgLkZpbHRlck91dCgiLipzb2YvZnA2NCIpCisgICAgICAuRmlsdGVyT3V0KE5vbkV4aXN0ZW50KTsKKyAgfQorCisgIC8vIENoZWNrIGZvciBDb2RlIFNvdXJjZXJ5IHRvb2xjaGFpbiBtdWx0aWxpYnMKKyAgTXVsdGlsaWJTZXQgQ1NNaXBzTXVsdGlsaWJzOworICB7CisgICAgTXVsdGlsaWIgTUFyY2hNaXBzMTYgPSBNdWx0aWxpYigpCisgICAgICAuZ2NjU3VmZml4KCIvbWlwczE2IikKKyAgICAgIC5vc1N1ZmZpeCgiL21pcHMxNiIpCisgICAgICAuaW5jbHVkZVN1ZmZpeCgiL21pcHMxNiIpCisgICAgICAuZmxhZygiK20zMiIpLmZsYWcoIittaXBzMTYiKTsKKworICAgIE11bHRpbGliIE1BcmNoTWljcm9NaXBzID0gTXVsdGlsaWIoKQorICAgICAgLmdjY1N1ZmZpeCgiL21pY3JvbWlwcyIpCisgICAgICAub3NTdWZmaXgoIi9taWNyb21pcHMiKQorICAgICAgLmluY2x1ZGVTdWZmaXgoIi9taWNyb21pcHMiKQorICAgICAgLmZsYWcoIittMzIiKS5mbGFnKCIrbW1pY3JvbWlwcyIpOworCisgICAgTXVsdGlsaWIgTUFyY2hEZWZhdWx0ID0gTXVsdGlsaWIoKQorICAgICAgLmZsYWcoIi1taXBzMTYiKS5mbGFnKCItbW1pY3JvbWlwcyIpOworCisgICAgTXVsdGlsaWIgU29mdEZsb2F0ID0gTXVsdGlsaWIoKQorICAgICAgLmdjY1N1ZmZpeCgiL3NvZnQtZmxvYXQiKQorICAgICAgLm9zU3VmZml4KCIvc29mdC1mbG9hdCIpCisgICAgICAuaW5jbHVkZVN1ZmZpeCgiL3NvZnQtZmxvYXQiKQorICAgICAgLmZsYWcoIittc29mdC1mbG9hdCIpOworCisgICAgTXVsdGlsaWIgTmFuMjAwOCA9IE11bHRpbGliKCkKKyAgICAgIC5nY2NTdWZmaXgoIi9uYW4yMDA4IikKKyAgICAgIC5vc1N1ZmZpeCgiL25hbjIwMDgiKQorICAgICAgLmluY2x1ZGVTdWZmaXgoIi9uYW4yMDA4IikKKyAgICAgIC5mbGFnKCIrbW5hbj0yMDA4Iik7CisKKyAgICBNdWx0aWxpYiBEZWZhdWx0RmxvYXQgPSBNdWx0aWxpYigpCisgICAgICAuZmxhZygiLW1zb2Z0LWZsb2F0IikuZmxhZygiLW1uYW49MjAwOCIpOworCisgICAgTXVsdGlsaWIgQmlnRW5kaWFuID0gTXVsdGlsaWIoKQorICAgICAgLmZsYWcoIitFQiIpLmZsYWcoIi1FTCIpOworCisgICAgTXVsdGlsaWIgTGl0dGxlRW5kaWFuID0gTXVsdGlsaWIoKQorICAgICAgLmdjY1N1ZmZpeCgiL2VsIikKKyAgICAgIC5vc1N1ZmZpeCgiL2VsIikKKyAgICAgIC5pbmNsdWRlU3VmZml4KCIvZWwiKQorICAgICAgLmZsYWcoIitFTCIpLmZsYWcoIi1FQiIpOworCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgb25lJ3Mgb3NTdWZmaXggaXMgIiIKKyAgICBNdWx0aWxpYiBNQWJpNjQgPSBNdWx0aWxpYigpCisgICAgICAuZ2NjU3VmZml4KCIvNjQiKQorICAgICAgLmluY2x1ZGVTdWZmaXgoIi82NCIpCisgICAgICAuZmxhZygiK21hYmk9NjQiKS5mbGFnKCItbWFiaT1uMzIiKS5mbGFnKCItbTMyIik7CisKKyAgICBDU01pcHNNdWx0aWxpYnMgPSBNdWx0aWxpYlNldCgpCisgICAgICAuRWl0aGVyKE1BcmNoTWlwczE2LCBNQXJjaE1pY3JvTWlwcywgTUFyY2hEZWZhdWx0KQorICAgICAgLkVpdGhlcihTb2Z0RmxvYXQsIE5hbjIwMDgsIERlZmF1bHRGbG9hdCkKKyAgICAgIC5GaWx0ZXJPdXQoIi9taWNyb21pcHMvbmFuMjAwOCIpCisgICAgICAuRmlsdGVyT3V0KCIvbWlwczE2L25hbjIwMDgiKQorICAgICAgLkVpdGhlcihCaWdFbmRpYW4sIExpdHRsZUVuZGlhbikKKyAgICAgIC5NYXliZShNQWJpNjQpCisgICAgICAuRmlsdGVyT3V0KCIvbWlwczE2LiovNjQiKQorICAgICAgLkZpbHRlck91dCgiL21pY3JvbWlwcy4qLzY0IikKKyAgICAgIC5GaWx0ZXJPdXQoTm9uRXhpc3RlbnQpOworICB9CisKKyAgTXVsdGlsaWJTZXQgQW5kcm9pZE1pcHNNdWx0aWxpYnMgPSBNdWx0aWxpYlNldCgpCisgICAgLk1heWJlKE11bHRpbGliKCIvbWlwcy1yMiIpLmZsYWcoIittYXJjaD1taXBzMzJyMiIpKQorICAgIC5GaWx0ZXJPdXQoTm9uRXhpc3RlbnQpOworCisgIE11bHRpbGliU2V0IERlYmlhbk1pcHNNdWx0aWxpYnM7CisgIHsKKyAgICBNdWx0aWxpYiBNQWJpTjMyID0gTXVsdGlsaWIoKQorICAgICAgLmdjY1N1ZmZpeCgiL24zMiIpCisgICAgICAuaW5jbHVkZVN1ZmZpeCgiL24zMiIpCisgICAgICAuZmxhZygiK21hYmk9bjMyIik7CisKKyAgICBNdWx0aWxpYiBNNjQgPSBNdWx0aWxpYigpCisgICAgICAuZ2NjU3VmZml4KCIvNjQiKQorICAgICAgLmluY2x1ZGVTdWZmaXgoIi82NCIpCisgICAgICAuZmxhZygiK202NCIpLmZsYWcoIi1tMzIiKS5mbGFnKCItbWFiaT1uMzIiKTsKKworICAgIE11bHRpbGliIE0zMiA9IE11bHRpbGliKCkKKyAgICAgIC5mbGFnKCItbTY0IikuZmxhZygiK20zMiIpLmZsYWcoIi1tYWJpPW4zMiIpOworCisgICAgRGViaWFuTWlwc011bHRpbGlicyA9IE11bHRpbGliU2V0KCkKKyAgICAgIC5FaXRoZXIoTTMyLCBNNjQsIE1BYmlOMzIpCisgICAgICAuRmlsdGVyT3V0KE5vbkV4aXN0ZW50KTsKKyAgfQorCisgIGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgVGFyZ2V0QXJjaCA9IFRhcmdldFRyaXBsZS5nZXRBcmNoKCk7CisKKyAgTXVsdGlsaWI6OmZsYWdzX2xpc3QgRmxhZ3M7CisgIGFkZE11bHRpbGliRmxhZyhpc01pcHMzMihUYXJnZXRBcmNoKSwgIm0zMiIsIEZsYWdzKTsKKyAgYWRkTXVsdGlsaWJGbGFnKGlzTWlwczY0KFRhcmdldEFyY2gpLCAibTY0IiwgRmxhZ3MpOworICBhZGRNdWx0aWxpYkZsYWcoaXNNaXBzMTYoQXJncyksICJtaXBzMTYiLCBGbGFncyk7CisgIGFkZE11bHRpbGliRmxhZyhpc01pcHMzMnIyKEFyZ3MpLCAibWFyY2g9bWlwczMycjIiLCBGbGFncyk7CisgIGFkZE11bHRpbGliRmxhZyhpc01pcHM2NHIyKEFyZ3MpLCAibWFyY2g9bWlwczY0cjIiLCBGbGFncyk7CisgIGFkZE11bHRpbGliRmxhZyhpc01pY3JvTWlwcyhBcmdzKSwgIm1taWNyb21pcHMiLCBGbGFncyk7CisgIGFkZE11bHRpbGliRmxhZyhpc01pcHNGUDY0KEFyZ3MpLCAibWZwNjQiLCBGbGFncyk7CisgIGFkZE11bHRpbGliRmxhZyghaXNNaXBzRlA2NChBcmdzKSwgIm1mcDMyIiwgRmxhZ3MpOworICBhZGRNdWx0aWxpYkZsYWcoaXNNaXBzTmFuMjAwOChBcmdzKSwgIm1uYW49MjAwOCIsIEZsYWdzKTsKKyAgYWRkTXVsdGlsaWJGbGFnKHRvb2xzOjptaXBzOjpoYXNNaXBzQWJpQXJnKEFyZ3MsICJuMzIiKSwgIm1hYmk9bjMyIiwgRmxhZ3MpOworICAvLyBEZWZhdWx0IGlzIHRvIGFzc3VtZSBtYWJpPTY0CisgIGJvb2wgSXNNQUJJNjQgPQorICAgICAgdG9vbHM6Om1pcHM6Omhhc01pcHNBYmlBcmcoQXJncywgIjY0IikgfHwKKyAgICAgICghdG9vbHM6Om1pcHM6Omhhc01pcHNBYmlBcmcoQXJncywgIm4zMiIpICYmIGlzTWlwczY0KFRhcmdldEFyY2gpKTsKKyAgYWRkTXVsdGlsaWJGbGFnKElzTUFCSTY0LCAibWFiaT02NCIsIEZsYWdzKTsKKyAgYWRkTXVsdGlsaWJGbGFnKGlzU29mdEZsb2F0QUJJKEFyZ3MpLCAibXNvZnQtZmxvYXQiLCBGbGFncyk7CisgIGFkZE11bHRpbGliRmxhZyhpc1NvZnRGbG9hdEFCSShBcmdzKSwgIm1mbG9hdC1hYmk9c29mdCIsIEZsYWdzKTsKKyAgYWRkTXVsdGlsaWJGbGFnKCFpc1NvZnRGbG9hdEFCSShBcmdzKSwgIm1oYXJkLWZsb2F0IiwgRmxhZ3MpOworICBhZGRNdWx0aWxpYkZsYWcoIWlzU29mdEZsb2F0QUJJKEFyZ3MpLCAibWZsb2F0LWFiaT1oYXJkIiwgRmxhZ3MpOworICBhZGRNdWx0aWxpYkZsYWcoaXNNaXBzRUwoVGFyZ2V0QXJjaCksICJFTCIsIEZsYWdzKTsKKyAgYWRkTXVsdGlsaWJGbGFnKGlzTWlwc0VCKFRhcmdldEFyY2gpLCAiRUIiLCBGbGFncyk7CisKKyAgaWYgKFRhcmdldFRyaXBsZS5nZXRFbnZpcm9ubWVudCgpID09IGxsdm06OlRyaXBsZTo6QW5kcm9pZCkgeworICAgIC8vIFNlbGVjdCBBbmRyb2lkIHRvb2xjaGFpbi4gSXQncyB0aGUgb25seSBjaG9pY2UgaW4gdGhhdCBjYXNlLgorICAgIE11bHRpbGlicy5jbGVhcigpOworICAgIE11bHRpbGlicy5jb21iaW5lV2l0aChBbmRyb2lkTWlwc011bHRpbGlicyk7CisgICAgcmV0dXJuIE11bHRpbGlicy5zZWxlY3QoRmxhZ3MsIFNlbGVjdGVkTXVsdGlsaWIpOworICB9CisKKyAgLy8gU29ydCBjYW5kaWRhdGVzLiBUb29sY2hhaW4gdGhhdCBiZXN0IG1lZXRzIHRoZSBkaXJlY3RvcmllcyBnb2VzIGZpcnN0LgorICAvLyBUaGVuIHNlbGVjdCB0aGUgZmlyc3QgdG9vbGNoYWlucyBtYXRjaGVzIGNvbW1hbmQgbGluZSBmbGFncy4KKyAgTXVsdGlsaWJTZXQgKmNhbmRpZGF0ZXNbXSA9IHsgJkRlYmlhbk1pcHNNdWx0aWxpYnMsICZGU0ZNaXBzTXVsdGlsaWJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NNaXBzTXVsdGlsaWJzIH07CisgIHN0ZDo6c29ydCgKKyAgICAgIHN0ZDo6YmVnaW4oY2FuZGlkYXRlcyksIHN0ZDo6ZW5kKGNhbmRpZGF0ZXMpLAorICAgICAgW10oTXVsdGlsaWJTZXQgKmEsIE11bHRpbGliU2V0ICpiKSB7IHJldHVybiBhLT5zaXplKCkgPiBiLT5zaXplKCk7IH0pOworICBmb3IgKGNvbnN0IGF1dG8gJmNhbmRpZGF0ZSA6IGNhbmRpZGF0ZXMpIHsKKyAgICBNdWx0aWxpYnMuY2xlYXIoKTsKKyAgICBNdWx0aWxpYnMuY29tYmluZVdpdGgoKmNhbmRpZGF0ZSk7CisgICAgaWYgKE11bHRpbGlicy5zZWxlY3QoRmxhZ3MsIFNlbGVjdGVkTXVsdGlsaWIpKSB7CisgICAgICBpZiAoY2FuZGlkYXRlID09ICZEZWJpYW5NaXBzTXVsdGlsaWJzKQorICAgICAgICBCaWFyY2hTaWJsaW5nID0gTXVsdGlsaWIoKTsKKyAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgfQogCi0gIGlmICghaGFzQ3J0QmVnaW5PYmooUGF0aCArIFN1ZmZpeCkpCi0gICAgU3VmZml4LmNsZWFyKCk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBHZW5lcmljX0dDQzo6R0NDSW5zdGFsbGF0aW9uRGV0ZWN0b3I6OmZpbmRCaWFyY2hNdWx0aWxpYnMoCisgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUYXJnZXRUcmlwbGUsIFN0cmluZ1JlZiBQYXRoLCBjb25zdCBBcmdMaXN0ICZBcmdzLAorICAgIGJvb2wgTmVlZHNCaWFyY2hTdWZmaXgpIHsKKworICAvLyBTb21lIHZlcnNpb25zIG9mIFNVU0UgYW5kIEZlZG9yYSBvbiBwcGM2NCBwdXQgMzItYml0IGxpYnMKKyAgLy8gaW4gd2hhdCB3b3VsZCBub3JtYWxseSBiZSBHQ0NJbnN0YWxsUGF0aCBhbmQgcHV0IHRoZSA2NC1iaXQKKyAgLy8gbGlicyBpbiBhIHN1YmRpcmVjdG9yeSBuYW1lZCA2NC4gVGhlIHNpbXBsZSBsb2dpYyB3ZSBmb2xsb3cgaXMgdGhhdAorICAvLyAqaWYqIHRoZXJlIGlzIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSByaWdodCBuYW1lIHdpdGggY3J0YmVnaW4ubyBpbiBpdCwKKyAgLy8gd2UgdXNlIHRoYXQuIElmIG5vdCwgYW5kIGlmIG5vdCBhIGJpYXJjaCB0cmlwbGUgYWxpYXMsIHdlIGxvb2sgZm9yCisgIC8vIGNydGJlZ2luLm8gd2l0aG91dCB0aGUgc3ViZGlyZWN0b3J5LgorCisgIE11bHRpbGliIERlZmF1bHQ7CisgIE11bHRpbGliIEFsdDY0ID0gTXVsdGlsaWIoKQorICAgIC5nY2NTdWZmaXgoIi82NCIpCisgICAgLmluY2x1ZGVTdWZmaXgoIi82NCIpCisgICAgLmZsYWcoIi1tMzIiKS5mbGFnKCIrbTY0Iik7CisgIE11bHRpbGliIEFsdDMyID0gTXVsdGlsaWIoKQorICAgIC5nY2NTdWZmaXgoIi8zMiIpCisgICAgLmluY2x1ZGVTdWZmaXgoIi8zMiIpCisgICAgLmZsYWcoIittMzIiKS5mbGFnKCItbTY0Iik7CisKKyAgRmlsdGVyTm9uRXhpc3RlbnQgTm9uRXhpc3RlbnQoUGF0aCk7CisKKyAgLy8gRGVjaWRlIHdoZXRoZXIgdGhlIGRlZmF1bHQgbXVsdGlsaWIgaXMgMzJiaXQsIGNvcnJlY3RpbmcgZm9yCisgIC8vIHdoZW4gdGhlIGRlZmF1bHQgbXVsdGlsaWIgYW5kIHRoZSBhbHRlcm5hdGUgYXBwZWFyIGJhY2t3YXJkcworICBib29sIERlZmF1bHRJczMyQml0OworICBpZiAoVGFyZ2V0VHJpcGxlLmlzQXJjaDMyQml0KCkgJiYgIU5vbkV4aXN0ZW50KEFsdDMyKSkKKyAgICBEZWZhdWx0SXMzMkJpdCA9IGZhbHNlOworICBlbHNlIGlmIChUYXJnZXRUcmlwbGUuaXNBcmNoNjRCaXQoKSAmJiAhTm9uRXhpc3RlbnQoQWx0NjQpKQorICAgIERlZmF1bHRJczMyQml0ID0gdHJ1ZTsKKyAgZWxzZSB7CisgICAgaWYgKE5lZWRzQmlhcmNoU3VmZml4KQorICAgICAgRGVmYXVsdElzMzJCaXQgPSBUYXJnZXRUcmlwbGUuaXNBcmNoNjRCaXQoKTsKKyAgICBlbHNlCisgICAgICBEZWZhdWx0SXMzMkJpdCA9IFRhcmdldFRyaXBsZS5pc0FyY2gzMkJpdCgpOworICB9CisKKyAgaWYgKERlZmF1bHRJczMyQml0KQorICAgIERlZmF1bHQuZmxhZygiK20zMiIpLmZsYWcoIi1tNjQiKTsKKyAgZWxzZQorICAgIERlZmF1bHQuZmxhZygiLW0zMiIpLmZsYWcoIittNjQiKTsKKworICBNdWx0aWxpYnMucHVzaF9iYWNrKERlZmF1bHQpOworICBNdWx0aWxpYnMucHVzaF9iYWNrKEFsdDY0KTsKKyAgTXVsdGlsaWJzLnB1c2hfYmFjayhBbHQzMik7CisKKyAgTXVsdGlsaWJzLkZpbHRlck91dChOb25FeGlzdGVudCk7CisKKyAgTXVsdGlsaWI6OmZsYWdzX2xpc3QgRmxhZ3M7CisgIGFkZE11bHRpbGliRmxhZyhUYXJnZXRUcmlwbGUuaXNBcmNoNjRCaXQoKSwgIm02NCIsIEZsYWdzKTsKKyAgYWRkTXVsdGlsaWJGbGFnKFRhcmdldFRyaXBsZS5pc0FyY2gzMkJpdCgpLCAibTMyIiwgRmxhZ3MpOworCisgIGlmICghTXVsdGlsaWJzLnNlbGVjdChGbGFncywgU2VsZWN0ZWRNdWx0aWxpYikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChTZWxlY3RlZE11bHRpbGliID09IEFsdDY0IHx8IFNlbGVjdGVkTXVsdGlsaWIgPT0gQWx0MzIpIHsKKyAgICBCaWFyY2hTaWJsaW5nID0gRGVmYXVsdDsKKyAgfQorCisgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEdlbmVyaWNfR0NDOjpHQ0NJbnN0YWxsYXRpb25EZXRlY3Rvcjo6U2NhbkxpYkRpckZvckdDQ1RyaXBsZSgKLSAgICBsbHZtOjpUcmlwbGU6OkFyY2hUeXBlIFRhcmdldEFyY2gsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCisgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUYXJnZXRUcmlwbGUsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkxpYkRpciwgU3RyaW5nUmVmIENhbmRpZGF0ZVRyaXBsZSwKICAgICBib29sIE5lZWRzQmlhcmNoU3VmZml4KSB7CisgIGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgVGFyZ2V0QXJjaCA9IFRhcmdldFRyaXBsZS5nZXRBcmNoKCk7CiAgIC8vIFRoZXJlIGFyZSB2YXJpb3VzIGRpZmZlcmVudCBzdWZmaXhlcyBpbnZvbHZpbmcgdGhlIHRyaXBsZSB3ZQogICAvLyBjaGVjayBmb3IuIFdlIGFsc28gcmVjb3JkIHdoYXQgaXMgbmVjZXNzYXJ5IHRvIHdhbGsgZnJvbSBlYWNoIGJhY2sKICAgLy8gdXAgdG8gdGhlIGxpYiBkaXJlY3RvcnkuCkBAIC0xNTI4LDI3ICsyMDE4LDE4IEBACiAgICAgICBpZiAoQ2FuZGlkYXRlVmVyc2lvbiA8PSBWZXJzaW9uKQogICAgICAgICBjb250aW51ZTsKIAotICAgICAgc3RkOjpzdHJpbmcgTUlQU0FCSURpclN1ZmZpeDsKLSAgICAgIGZpbmRNSVBTQUJJRGlyU3VmZml4KE1JUFNBQklEaXJTdWZmaXgsIFRhcmdldEFyY2gsIExJLT5wYXRoKCksIEFyZ3MpOworICAgICAgTXVsdGlsaWJzLmNsZWFyKCk7CisgICAgICBTZWxlY3RlZE11bHRpbGliID0gTXVsdGlsaWIoKTsKKyAgICAgIEJpYXJjaFNpYmxpbmcucmVzZXQoKTsKIAotICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBTVVNFIGFuZCBGZWRvcmEgb24gcHBjNjQgcHV0IDMyLWJpdCBsaWJzCi0gICAgICAvLyBpbiB3aGF0IHdvdWxkIG5vcm1hbGx5IGJlIEdDQ0luc3RhbGxQYXRoIGFuZCBwdXQgdGhlIDY0LWJpdAotICAgICAgLy8gbGlicyBpbiBhIHN1YmRpcmVjdG9yeSBuYW1lZCA2NC4gVGhlIHNpbXBsZSBsb2dpYyB3ZSBmb2xsb3cgaXMgdGhhdAotICAgICAgLy8gKmlmKiB0aGVyZSBpcyBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgcmlnaHQgbmFtZSB3aXRoIGNydGJlZ2luLm8gaW4gaXQsCi0gICAgICAvLyB3ZSB1c2UgdGhhdC4gSWYgbm90LCBhbmQgaWYgbm90IGEgYmlhcmNoIHRyaXBsZSBhbGlhcywgd2UgbG9vayBmb3IKLSAgICAgIC8vIGNydGJlZ2luLm8gd2l0aG91dCB0aGUgc3ViZGlyZWN0b3J5LgotCi0gICAgICBzdGQ6OnN0cmluZyBCaWFyY2hTdWZmaXg7Ci0gICAgICBpZiAoZmluZFRhcmdldEJpYXJjaFN1ZmZpeChCaWFyY2hTdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSS0+cGF0aCgpICsgTUlQU0FCSURpclN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEFyY2gsIEFyZ3MpKSB7Ci0gICAgICAgIEdDQ0JpYXJjaFN1ZmZpeCA9IEJpYXJjaFN1ZmZpeDsKLSAgICAgIH0gZWxzZSBpZiAoTmVlZHNCaWFyY2hTdWZmaXggfHwKLSAgICAgICAgICAgICAgICAgIWhhc0NydEJlZ2luT2JqKExJLT5wYXRoKCkgKyBNSVBTQUJJRGlyU3VmZml4KSkgeworICAgICAgLy8gRGViaWFuIG1pcHMgbXVsdGlsaWJzIGJlaGF2ZSBtb3JlIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIGJpYXJjaCBvbmVzLAorICAgICAgLy8gc28gaGFuZGxlIHRoZW0gdGhlcmUKKyAgICAgIGlmIChpc01pcHNBcmNoKFRhcmdldEFyY2gpKSB7CisgICAgICAgIGlmICghZmluZE1JUFNNdWx0aWxpYnMoVGFyZ2V0VHJpcGxlLCBMSS0+cGF0aCgpLCBBcmdzKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSBpZiAoIWZpbmRCaWFyY2hNdWx0aWxpYnMoVGFyZ2V0VHJpcGxlLCBMSS0+cGF0aCgpLCBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZWVkc0JpYXJjaFN1ZmZpeCkpCiAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgR0NDQmlhcmNoU3VmZml4LmNsZWFyKCk7Ci0gICAgICB9CiAKICAgICAgIFZlcnNpb24gPSBDYW5kaWRhdGVWZXJzaW9uOwogICAgICAgR0NDVHJpcGxlLnNldFRyaXBsZShDYW5kaWRhdGVUcmlwbGUpOwpAQCAtMTU1Nyw3ICsyMDM4LDYgQEAKICAgICAgIC8vIExpbnV4LgogICAgICAgR0NDSW5zdGFsbFBhdGggPSBMaWJEaXIgKyBMaWJTdWZmaXhlc1tpXSArICIvIiArIFZlcnNpb25UZXh0LnN0cigpOwogICAgICAgR0NDUGFyZW50TGliUGF0aCA9IEdDQ0luc3RhbGxQYXRoICsgSW5zdGFsbFN1ZmZpeGVzW2ldOwotICAgICAgR0NDTUlQU0FCSURpclN1ZmZpeCA9IE1JUFNBQklEaXJTdWZmaXg7CiAgICAgICBJc1ZhbGlkID0gdHJ1ZTsKICAgICB9CiAgIH0KQEAgLTE1NjUsNyArMjA0NSw3IEBACiAKIEdlbmVyaWNfR0NDOjpHZW5lcmljX0dDQyhjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06OlRyaXBsZSYgVHJpcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZ0xpc3QgJkFyZ3MpCi0gIDogVG9vbENoYWluKEQsIFRyaXBsZSwgQXJncyksIEdDQ0luc3RhbGxhdGlvbihnZXREcml2ZXIoKSwgVHJpcGxlLCBBcmdzKSB7CisgIDogVG9vbENoYWluKEQsIFRyaXBsZSwgQXJncyksIEdDQ0luc3RhbGxhdGlvbigpIHsKICAgZ2V0UHJvZ3JhbVBhdGhzKCkucHVzaF9iYWNrKGdldERyaXZlcigpLmdldEluc3RhbGxlZERpcigpKTsKICAgaWYgKGdldERyaXZlcigpLmdldEluc3RhbGxlZERpcigpICE9IGdldERyaXZlcigpLkRpcikKICAgICBnZXRQcm9ncmFtUGF0aHMoKS5wdXNoX2JhY2soZ2V0RHJpdmVyKCkuRGlyKTsKQEAgLTE1ODAsMTAgKzIwNjAsNiBAQAogICAgIGlmICghUHJlcHJvY2VzcykKICAgICAgIFByZXByb2Nlc3MucmVzZXQobmV3IHRvb2xzOjpnY2M6OlByZXByb2Nlc3MoKnRoaXMpKTsKICAgICByZXR1cm4gUHJlcHJvY2Vzcy5nZXQoKTsKLSAgY2FzZSBBY3Rpb246OlByZWNvbXBpbGVKb2JDbGFzczoKLSAgICBpZiAoIVByZWNvbXBpbGUpCi0gICAgICBQcmVjb21waWxlLnJlc2V0KG5ldyB0b29sczo6Z2NjOjpQcmVjb21waWxlKCp0aGlzKSk7Ci0gICAgcmV0dXJuIFByZWNvbXBpbGUuZ2V0KCk7CiAgIGNhc2UgQWN0aW9uOjpDb21waWxlSm9iQ2xhc3M6CiAgICAgaWYgKCFDb21waWxlKQogICAgICAgQ29tcGlsZS5yZXNldChuZXcgdG9vbHM6OmdjYzo6Q29tcGlsZSgqdGhpcykpOwpAQCAtMTU5NCw3ICsyMDcwLDcgQEAKIH0KIAogVG9vbCAqR2VuZXJpY19HQ0M6OmJ1aWxkQXNzZW1ibGVyKCkgY29uc3QgewotICByZXR1cm4gbmV3IHRvb2xzOjpnY2M6OkFzc2VtYmxlKCp0aGlzKTsKKyAgcmV0dXJuIG5ldyB0b29sczo6Z251dG9vbHM6OkFzc2VtYmxlKCp0aGlzKTsKIH0KIAogVG9vbCAqR2VuZXJpY19HQ0M6OmJ1aWxkTGlua2VyKCkgY29uc3QgewpAQCAtMTYyMiw2ICsyMDk4LDM1IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBHZW5lcmljX0dDQzo6SXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFRyaXBsZSgpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fAorICAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2XzY0IHx8CisgICAgICAgICBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0IHx8CisgICAgICAgICBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0X2JlIHx8CisgICAgICAgICBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm02NCB8fAorICAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtIHx8CisgICAgICAgICBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm1lYiB8fAorICAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6dGh1bWIgfHwKKyAgICAgICAgIGdldFRyaXBsZSgpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iZWI7Cit9CisKK3ZvaWQgR2VuZXJpY19FTEY6OmFkZENsYW5nVGFyZ2V0T3B0aW9ucyhjb25zdCBBcmdMaXN0ICZEcml2ZXJBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0IHsKKyAgY29uc3QgR2VuZXJpY19HQ0M6OkdDQ1ZlcnNpb24gJlYgPSBHQ0NJbnN0YWxsYXRpb24uZ2V0VmVyc2lvbigpOworICBib29sIFVzZUluaXRBcnJheURlZmF1bHQgPQorICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NCB8fAorICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NF9iZSB8fAorICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtNjQgfHwKKyAgICAgIChnZXRUcmlwbGUoKS5nZXRPUygpID09IGxsdm06OlRyaXBsZTo6TGludXggJiYKKyAgICAgICAoIVYuaXNPbGRlclRoYW4oNCwgNywgMCkgfHwKKyAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0RW52aXJvbm1lbnQoKSA9PSBsbHZtOjpUcmlwbGU6OkFuZHJvaWQpKTsKKworICBpZiAoRHJpdmVyQXJncy5oYXNGbGFnKG9wdGlvbnM6Ok9QVF9mdXNlX2luaXRfYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub191c2VfaW5pdF9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VJbml0QXJyYXlEZWZhdWx0KSkKKyAgICBDQzFBcmdzLnB1c2hfYmFjaygiLWZ1c2UtaW5pdC1hcnJheSIpOworfQorCiAvLy8gSGV4YWdvbiBUb29sY2hhaW4KIAogc3RkOjpzdHJpbmcgSGV4YWdvbl9UQzo6R2V0R251RGlyKGNvbnN0IHN0ZDo6c3RyaW5nICZJbnN0YWxsZWREaXIpIHsKQEAgLTIwMDYsNiArMjUxMSw3IEBACiBib29sIEZyZWVCU0Q6OlVzZVNqTGpFeGNlcHRpb25zKCkgY29uc3QgewogICAvLyBGcmVlQlNEIHVzZXMgU2pMaiBleGNlcHRpb25zIG9uIEFSTSBvYWJpLgogICBzd2l0Y2ggKGdldFRyaXBsZSgpLmdldEVudmlyb25tZW50KCkpIHsKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OkdOVUVBQklIRjoKICAgY2FzZSBsbHZtOjpUcmlwbGU6OkdOVUVBQkk6CiAgIGNhc2UgbGx2bTo6VHJpcGxlOjpFQUJJOgogICAgIHJldHVybiBmYWxzZTsKQEAgLTIwMTYsNiArMjUyMiwxNCBAQAogICB9CiB9CiAKK2Jvb2wgRnJlZUJTRDo6SGFzTmF0aXZlTExWTVN1cHBvcnQoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEZyZWVCU0Q6OmlzUElFRGVmYXVsdCgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFNhbml0aXplckFyZ3MoKS5oYXNaZXJvQmFzZVNoYWRvdygpOworfQorCiAvLy8gTmV0QlNEIC0gTmV0QlNEIHRvb2wgY2hhaW4gd2hpY2ggY2FuIGNhbGwgYXMoMSkgYW5kIGxkKDEpIGRpcmVjdGx5LgogCiBOZXRCU0Q6Ok5ldEJTRChjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06OlRyaXBsZSYgVHJpcGxlLCBjb25zdCBBcmdMaXN0ICZBcmdzKQpAQCAtMjAyNyw4ICsyNTQxLDM0IEBACiAgICAgLy8gZG9lc24ndCB3b3JrLgogICAgIC8vIEZJWE1FOiBJdCdkIGJlIG5pY2VyIHRvIHRlc3QgaWYgdGhpcyBkaXJlY3RvcnkgZXhpc3RzLCBidXQgSSdtIG5vdCBzdXJlCiAgICAgLy8gd2hhdCBhbGwgbG9naWMgaXMgbmVlZGVkIHRvIGVtdWxhdGUgdGhlICc9JyBwcmVmaXggaGVyZS4KLSAgICBpZiAoVHJpcGxlLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NikKKyAgICBzd2l0Y2ggKFRyaXBsZS5nZXRBcmNoKCkpIHsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2OgogICAgICAgZ2V0RmlsZVBhdGhzKCkucHVzaF9iYWNrKCI9L3Vzci9saWIvaTM4NiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OmFybToKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6dGh1bWI6CisgICAgICBzd2l0Y2ggKFRyaXBsZS5nZXRFbnZpcm9ubWVudCgpKSB7CisgICAgICBjYXNlIGxsdm06OlRyaXBsZTo6RUFCSToKKyAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpFQUJJSEY6CisgICAgICBjYXNlIGxsdm06OlRyaXBsZTo6R05VRUFCSToKKyAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpHTlVFQUJJSEY6CisgICAgICAgIGdldEZpbGVQYXRocygpLnB1c2hfYmFjaygiPS91c3IvbGliL2VhYmkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnZXRGaWxlUGF0aHMoKS5wdXNoX2JhY2soIj0vdXNyL2xpYi9vYWJpIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6Om1pcHM2NDoKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6bWlwczY0ZWw6CisgICAgICBpZiAodG9vbHM6Om1pcHM6Omhhc01pcHNBYmlBcmcoQXJncywgIm8zMiIpKQorICAgICAgICBnZXRGaWxlUGF0aHMoKS5wdXNoX2JhY2soIj0vdXNyL2xpYi9vMzIiKTsKKyAgICAgIGVsc2UgaWYgKHRvb2xzOjptaXBzOjpoYXNNaXBzQWJpQXJnKEFyZ3MsICI2NCIpKQorICAgICAgICBnZXRGaWxlUGF0aHMoKS5wdXNoX2JhY2soIj0vdXNyL2xpYi82NCIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGdldEZpbGVQYXRocygpLnB1c2hfYmFjaygiPS91c3IvbGliIik7CiAgIH0KQEAgLTIwNTgsOCArMjU5OCwxMyBAQAogICB1bnNpZ25lZCBNYWpvciwgTWlub3IsIE1pY3JvOwogICBnZXRUcmlwbGUoKS5nZXRPU1ZlcnNpb24oTWFqb3IsIE1pbm9yLCBNaWNybyk7CiAgIGlmIChNYWpvciA+PSA3IHx8IChNYWpvciA9PSA2ICYmIE1pbm9yID09IDk5ICYmIE1pY3JvID49IDIzKSB8fCBNYWpvciA9PSAwKSB7Ci0gICAgaWYgKGdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fCBnZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQpCisgICAgc3dpdGNoIChnZXRBcmNoKCkpIHsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2OgorICAgIGNhc2UgbGx2bTo6VHJpcGxlOjp4ODZfNjQ6CiAgICAgICByZXR1cm4gVG9vbENoYWluOjpDU1RfTGliY3h4OworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CiAgIH0KICAgcmV0dXJuIFRvb2xDaGFpbjo6Q1NUX0xpYnN0ZGN4eDsKIH0KQEAgLTIxOTUsNyArMjc0MCw3IEBACiB9CiAKIHN0YXRpYyBEaXN0cm8gRGV0ZWN0RGlzdHJvKGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgQXJjaCkgewotICBPd25pbmdQdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBGaWxlOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBGaWxlOwogICBpZiAoIWxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZSgiL2V0Yy9sc2ItcmVsZWFzZSIsIEZpbGUpKSB7CiAgICAgU3RyaW5nUmVmIERhdGEgPSBGaWxlLmdldCgpLT5nZXRCdWZmZXIoKTsKICAgICBTbWFsbFZlY3RvcjxTdHJpbmdSZWYsIDg+IExpbmVzOwpAQCAtMjI3MCw3ICsyODE1LDcgQEAKIC8vLyBhIHRhcmdldC10cmlwbGUgZGlyZWN0b3J5IGluIHRoZSBsaWJyYXJ5IGFuZCBoZWFkZXIgc2VhcmNoIHBhdGhzLgogLy8vIFVuZm9ydHVuYXRlbHksIHRoaXMgdHJpcGxlIGRvZXMgbm90IGFsaWduIHdpdGggdGhlIHZhbmlsbGEgdGFyZ2V0IHRyaXBsZSwKIC8vLyBzbyB3ZSBwcm92aWRlIGEgcm91Z2ggbWFwcGluZyBoZXJlLgotc3RhdGljIHN0ZDo6c3RyaW5nIGdldE11bHRpYXJjaFRyaXBsZShjb25zdCBsbHZtOjpUcmlwbGUgVGFyZ2V0VHJpcGxlLAorc3RhdGljIHN0ZDo6c3RyaW5nIGdldE11bHRpYXJjaFRyaXBsZShjb25zdCBsbHZtOjpUcmlwbGUgJlRhcmdldFRyaXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN5c1Jvb3QpIHsKICAgLy8gRm9yIG1vc3QgYXJjaGl0ZWN0dXJlcywganVzdCB1c2Ugd2hhdGV2ZXIgd2UgaGF2ZSByYXRoZXIgdGhhbiB0cnlpbmcgdG8gYmUKICAgLy8gY2xldmVyLgpAQCAtMjI5Miw2ICsyODM3LDE2IEBACiAgICAgICAgIHJldHVybiAiYXJtLWxpbnV4LWdudWVhYmkiOwogICAgIH0KICAgICByZXR1cm4gVGFyZ2V0VHJpcGxlLnN0cigpOworICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtZWI6CisgIGNhc2UgbGx2bTo6VHJpcGxlOjp0aHVtYmViOgorICAgIGlmIChUYXJnZXRUcmlwbGUuZ2V0RW52aXJvbm1lbnQoKSA9PSBsbHZtOjpUcmlwbGU6OkdOVUVBQklIRikgeworICAgICAgaWYgKGxsdm06OnN5czo6ZnM6OmV4aXN0cyhTeXNSb290ICsgIi9saWIvYXJtZWItbGludXgtZ251ZWFiaWhmIikpCisgICAgICAgIHJldHVybiAiYXJtZWItbGludXgtZ251ZWFiaWhmIjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGxsdm06OnN5czo6ZnM6OmV4aXN0cyhTeXNSb290ICsgIi9saWIvYXJtZWItbGludXgtZ251ZWFiaSIpKQorICAgICAgICByZXR1cm4gImFybWViLWxpbnV4LWdudWVhYmkiOworICAgIH0KKyAgICByZXR1cm4gVGFyZ2V0VHJpcGxlLnN0cigpOwogICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2OgogICAgIGlmIChsbHZtOjpzeXM6OmZzOjpleGlzdHMoU3lzUm9vdCArICIvbGliL2kzODYtbGludXgtZ251IikpCiAgICAgICByZXR1cm4gImkzODYtbGludXgtZ251IjsKQEAgLTIzMDAsMTAgKzI4NTUsMTUgQEAKICAgICBpZiAobGx2bTo6c3lzOjpmczo6ZXhpc3RzKFN5c1Jvb3QgKyAiL2xpYi94ODZfNjQtbGludXgtZ251IikpCiAgICAgICByZXR1cm4gIng4Nl82NC1saW51eC1nbnUiOwogICAgIHJldHVybiBUYXJnZXRUcmlwbGUuc3RyKCk7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm02NDoKICAgY2FzZSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQ6CiAgICAgaWYgKGxsdm06OnN5czo6ZnM6OmV4aXN0cyhTeXNSb290ICsgIi9saWIvYWFyY2g2NC1saW51eC1nbnUiKSkKICAgICAgIHJldHVybiAiYWFyY2g2NC1saW51eC1nbnUiOwogICAgIHJldHVybiBUYXJnZXRUcmlwbGUuc3RyKCk7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphYXJjaDY0X2JlOgorICAgIGlmIChsbHZtOjpzeXM6OmZzOjpleGlzdHMoU3lzUm9vdCArICIvbGliL2FhcmNoNjRfYmUtbGludXgtZ251IikpCisgICAgICByZXR1cm4gImFhcmNoNjRfYmUtbGludXgtZ251IjsKKyAgICByZXR1cm4gVGFyZ2V0VHJpcGxlLnN0cigpOwogICBjYXNlIGxsdm06OlRyaXBsZTo6bWlwczoKICAgICBpZiAobGx2bTo6c3lzOjpmczo6ZXhpc3RzKFN5c1Jvb3QgKyAiL2xpYi9taXBzLWxpbnV4LWdudSIpKQogICAgICAgcmV0dXJuICJtaXBzLWxpbnV4LWdudSI7CkBAIC0yMzMyLDI1ICsyODkyLDI0IEBACiAgIGlmIChsbHZtOjpzeXM6OmZzOjpleGlzdHMoUGF0aCkpIFBhdGhzLnB1c2hfYmFjayhQYXRoLnN0cigpKTsKIH0KIAotc3RhdGljIFN0cmluZ1JlZiBnZXRNdWx0aWxpYkRpcihjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnTGlzdCAmQXJncykgeworc3RhdGljIFN0cmluZ1JlZiBnZXRPU0xpYkRpcihjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwgY29uc3QgQXJnTGlzdCAmQXJncykgewogICBpZiAoaXNNaXBzQXJjaChUcmlwbGUuZ2V0QXJjaCgpKSkgewogICAgIC8vIGxpYjMyIGRpcmVjdG9yeSBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgb24gTUlQUyB0YXJnZXRzLgogICAgIC8vIEl0IGNvbnRhaW5zIE4zMiBBQkkgYmluYXJpZXMuIFVzZSB0aGlzIGZvbGRlciBpZiBwcm9kdWNlCiAgICAgLy8gY29kZSBmb3IgTjMyIEFCSSBvbmx5LgotICAgIGlmIChoYXNNaXBzTjMyQUJJQXJnKEFyZ3MpKQorICAgIGlmICh0b29sczo6bWlwczo6aGFzTWlwc0FiaUFyZyhBcmdzLCAibjMyIikpCiAgICAgICByZXR1cm4gImxpYjMyIjsKICAgICByZXR1cm4gVHJpcGxlLmlzQXJjaDMyQml0KCkgPyAibGliIiA6ICJsaWI2NCI7CiAgIH0KIAotICAvLyBJdCBoYXBwZW5zIHRoYXQgb25seSB4ODYgYW5kIFBQQyB1c2UgdGhlICdsaWIzMicgdmFyaWFudCBvZiBtdWx0aWxpYiwgYW5kCisgIC8vIEl0IGhhcHBlbnMgdGhhdCBvbmx5IHg4NiBhbmQgUFBDIHVzZSB0aGUgJ2xpYjMyJyB2YXJpYW50IG9mIG9zbGliZGlyLCBhbmQKICAgLy8gdXNpbmcgdGhhdCB2YXJpYW50IHdoaWxlIHRhcmdldGluZyBvdGhlciBhcmNoaXRlY3R1cmVzIGNhdXNlcyBwcm9ibGVtcwogICAvLyBiZWNhdXNlIHRoZSBsaWJyYXJpZXMgYXJlIGxhaWQgb3V0IGluIHNoYXJlZCBzeXN0ZW0gcm9vdHMgdGhhdCBjYW4ndCBjb3BlCi0gIC8vIHdpdGggYSAnbGliMzInIG11bHRpbGliIHNlYXJjaCBwYXRoIGJlaW5nIGNvbnNpZGVyZWQuIFNvIHdlIG9ubHkgZW5hYmxlCisgIC8vIHdpdGggYSAnbGliMzInIGxpYnJhcnkgc2VhcmNoIHBhdGggYmVpbmcgY29uc2lkZXJlZC4gU28gd2Ugb25seSBlbmFibGUKICAgLy8gdGhlbSB3aGVuIHdlIGtub3cgd2UgbWF5IG5lZWQgaXQuCiAgIC8vCiAgIC8vIEZJWE1FOiBUaGlzIGlzIGEgYml0IG9mIGEgaGFjay4gV2Ugc2hvdWxkIHJlYWxseSB1bmlmeSB0aGlzIGNvZGUgZm9yCi0gIC8vIHJlYXNvbmluZyBhYm91dCBtdWx0aWxpYiBzcGVsbGluZ3Mgd2l0aCB0aGUgbGliIGRpciBzcGVsbGluZ3MgaW4gdGhlCisgIC8vIHJlYXNvbmluZyBhYm91dCBvc2xpYmRpciBzcGVsbGluZ3Mgd2l0aCB0aGUgbGliIGRpciBzcGVsbGluZ3MgaW4gdGhlCiAgIC8vIEdDQ0luc3RhbGxhdGlvbkRldGVjdG9yLCBidXQgdGhhdCBpcyBhIG1vcmUgc2lnbmlmaWNhbnQgcmVmYWN0b3JpbmcuCiAgIGlmIChUcmlwbGUuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2IHx8CiAgICAgICBUcmlwbGUuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6cHBjKQpAQCAtMjM2MSw2ICsyOTIwLDggQEAKIAogTGludXg6OkxpbnV4KGNvbnN0IERyaXZlciAmRCwgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MpCiAgIDogR2VuZXJpY19FTEYoRCwgVHJpcGxlLCBBcmdzKSB7CisgIEdDQ0luc3RhbGxhdGlvbi5pbml0KEQsIFRyaXBsZSwgQXJncyk7CisgIE11bHRpbGlicyA9IEdDQ0luc3RhbGxhdGlvbi5nZXRNdWx0aWxpYnMoKTsKICAgbGx2bTo6VHJpcGxlOjpBcmNoVHlwZSBBcmNoID0gVHJpcGxlLmdldEFyY2goKTsKICAgc3RkOjpzdHJpbmcgU3lzUm9vdCA9IGNvbXB1dGVTeXNSb290KCk7CiAKQEAgLTI0MjgsMjkgKzI5ODksMjAgQEAKICAgLy8gdG8gdGhlIGxpbmsgcGF0aHMuCiAgIHBhdGhfbGlzdCAmUGF0aHMgPSBnZXRGaWxlUGF0aHMoKTsKIAotICBjb25zdCBzdGQ6OnN0cmluZyBNdWx0aWxpYiA9IGdldE11bHRpbGliRGlyKFRyaXBsZSwgQXJncyk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIE9TTGliRGlyID0gZ2V0T1NMaWJEaXIoVHJpcGxlLCBBcmdzKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcgTXVsdGlhcmNoVHJpcGxlID0gZ2V0TXVsdGlhcmNoVHJpcGxlKFRyaXBsZSwgU3lzUm9vdCk7CiAKICAgLy8gQWRkIHRoZSBtdWx0aWxpYiBzdWZmaXhlZCBwYXRocyB3aGVyZSB0aGV5IGFyZSBhdmFpbGFibGUuCiAgIGlmIChHQ0NJbnN0YWxsYXRpb24uaXNWYWxpZCgpKSB7CiAgICAgY29uc3QgbGx2bTo6VHJpcGxlICZHQ0NUcmlwbGUgPSBHQ0NJbnN0YWxsYXRpb24uZ2V0VHJpcGxlKCk7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkxpYlBhdGggPSBHQ0NJbnN0YWxsYXRpb24uZ2V0UGFyZW50TGliUGF0aCgpOworICAgIGNvbnN0IE11bHRpbGliICZNdWx0aWxpYiA9IEdDQ0luc3RhbGxhdGlvbi5nZXRNdWx0aWxpYigpOwogCiAgICAgLy8gU291cmNlcnkgQ29kZUJlbmNoIE1JUFMgdG9vbGNoYWluIGhvbGRzIHNvbWUgbGlicmFyaWVzIHVuZGVyCiAgICAgLy8gYSBiaWFyY2gtbGlrZSBzdWZmaXggb2YgdGhlIEdDQyBpbnN0YWxsYXRpb24uCi0gICAgLy8KLSAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgY2xlYW5lciB0byBtb2RlbCB0aGlzIGFzIGEgdmFyaWFudCBvZiBiaS1hcmNoLiBJRSwKLSAgICAvLyBpbnN0ZWFkIG9mIGEgJzY0JyBiaWFyY2ggc3VmZml4IGl0IHdvdWxkIGJlICdlbCcgb3Igc29tZXRoaW5nLgotICAgIGlmIChJc0FuZHJvaWQgJiYgSXNNaXBzICYmIGlzTWlwczMycjIoQXJncykpIHsKLSAgICAgIGFzc2VydChHQ0NJbnN0YWxsYXRpb24uZ2V0QmlhcmNoU3VmZml4KCkuZW1wdHkoKSAmJgotICAgICAgICAgICAgICJVbmV4cGVjdGVkIGJpLWFyY2ggc3VmZml4Iik7Ci0gICAgICBhZGRQYXRoSWZFeGlzdHMoR0NDSW5zdGFsbGF0aW9uLmdldEluc3RhbGxQYXRoKCkgKyAiL21pcHMtcjIiLCBQYXRocyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFkZFBhdGhJZkV4aXN0cygoR0NDSW5zdGFsbGF0aW9uLmdldEluc3RhbGxQYXRoKCkgKwotICAgICAgICAgICAgICAgICAgICAgICBHQ0NJbnN0YWxsYXRpb24uZ2V0TUlQU0FCSURpclN1ZmZpeCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgR0NDSW5zdGFsbGF0aW9uLmdldEJpYXJjaFN1ZmZpeCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICBQYXRocyk7Ci0gICAgfQorICAgIGFkZFBhdGhJZkV4aXN0cygoR0NDSW5zdGFsbGF0aW9uLmdldEluc3RhbGxQYXRoKCkgKworICAgICAgICAgICAgICAgICAgICAgTXVsdGlsaWIuZ2NjU3VmZml4KCkpLAorICAgICAgICAgICAgICAgICAgICBQYXRocyk7CiAKICAgICAvLyBHQ0MgY3Jvc3MgY29tcGlsaW5nIHRvb2xjaGFpbnMgd2lsbCBpbnN0YWxsIHRhcmdldCBsaWJyYXJpZXMgd2hpY2ggc2hpcAogICAgIC8vIGFzIHBhcnQgb2YgdGhlIHRvb2xjaGFpbiB1bmRlciA8cHJlZml4Pi88dHJpcGxlPi88bGliZGlyPiByYXRoZXIgdGhhbiBhcwpAQCAtMjQ1OCw3ICszMDEwLDcgQEAKICAgICAvLyA8cHJlZml4Pi88bGliZGlyPi9nY2MvPHRyaXBsZT4vPHZlcnNpb24+LiBUaGlzIGRlY2lzaW9uIGlzIHNvbWV3aGF0CiAgICAgLy8gZGViYXRhYmxlLCBidXQgaXMgdGhlIHJlYWxpdHkgdG9kYXkuIFdlIG5lZWQgdG8gc2VhcmNoIHRoaXMgdHJlZSBldmVuCiAgICAgLy8gd2hlbiB3ZSBoYXZlIGEgc3lzcm9vdCBzb21ld2hlcmUgZWxzZS4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mCi0gICAgLy8gd2hvbWV2ZXIgaXMgZG9pbmcgdGhlIGNyb3NzIGJ1aWxkIHRhcmdldHRpbmcgYSBzeXNyb290IHVzaW5nIGEgR0NDCisgICAgLy8gd2hvbWV2ZXIgaXMgZG9pbmcgdGhlIGNyb3NzIGJ1aWxkIHRhcmdldGluZyBhIHN5c3Jvb3QgdXNpbmcgYSBHQ0MKICAgICAvLyBpbnN0YWxsYXRpb24gdGhhdCBpcyAqbm90KiB3aXRoaW4gdGhlIHN5c3RlbSByb290IHRvIGVuc3VyZSB0d28gdGhpbmdzOgogICAgIC8vCiAgICAgLy8gIDEpIEFueSBEU09zIHRoYXQgYXJlIGxpbmtlZCBpbiBmcm9tIHRoaXMgdHJlZSBvciBmcm9tIHRoZSBpbnN0YWxsIHBhdGgKQEAgLTI0NzAsOCArMzAyMiw4IEBACiAgICAgLy8KICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtYXRjaGVzIHRoZSBHQ0MgYmVoYXZpb3IuIFNlZSB0aGUgYmVsb3cgY29tbWVudCBmb3Igd2hlcmUKICAgICAvLyBDbGFuZyBkaXZlcmdlcyBmcm9tIEdDQydzIGJlaGF2aW9yLgotICAgIGFkZFBhdGhJZkV4aXN0cyhMaWJQYXRoICsgIi8uLi8iICsgR0NDVHJpcGxlLnN0cigpICsgIi9saWIvLi4vIiArIE11bHRpbGliICsKLSAgICAgICAgICAgICAgICAgICAgR0NDSW5zdGFsbGF0aW9uLmdldE1JUFNBQklEaXJTdWZmaXgoKSwKKyAgICBhZGRQYXRoSWZFeGlzdHMoTGliUGF0aCArICIvLi4vIiArIEdDQ1RyaXBsZS5zdHIoKSArICIvbGliLy4uLyIgKyBPU0xpYkRpciArCisgICAgICAgICAgICAgICAgICAgIE11bHRpbGliLm9zU3VmZml4KCksCiAgICAgICAgICAgICAgICAgICAgIFBhdGhzKTsKIAogICAgIC8vIElmIHRoZSBHQ0MgaW5zdGFsbGF0aW9uIHdlIGZvdW5kIGlzIGluc2lkZSBvZiB0aGUgc3lzcm9vdCwgd2Ugd2FudCB0bwpAQCAtMjQ4NSw0NSArMzAzNyw2NCBAQAogICAgIC8vIGEgYnVnLgogICAgIGlmIChTdHJpbmdSZWYoTGliUGF0aCkuc3RhcnRzd2l0aChTeXNSb290KSkgewogICAgICAgYWRkUGF0aElmRXhpc3RzKExpYlBhdGggKyAiLyIgKyBNdWx0aWFyY2hUcmlwbGUsIFBhdGhzKTsKLSAgICAgIGFkZFBhdGhJZkV4aXN0cyhMaWJQYXRoICsgIi8uLi8iICsgTXVsdGlsaWIsIFBhdGhzKTsKKyAgICAgIGFkZFBhdGhJZkV4aXN0cyhMaWJQYXRoICsgIi8uLi8iICsgT1NMaWJEaXIsIFBhdGhzKTsKICAgICB9CiAgIH0KKworICAvLyBTaW1pbGFyIHRvIHRoZSBsb2dpYyBmb3IgR0NDIGFib3ZlLCBpZiB3ZSBjdXJyZW50bHkgcnVubmluZyBDbGFuZyBpbnNpZGUKKyAgLy8gb2YgdGhlIHJlcXVlc3RlZCBzeXN0ZW0gcm9vdCwgYWRkIGl0cyBwYXJlbnQgbGlicmFyeSBwYXRocyB0bworICAvLyB0aG9zZSBzZWFyY2hlZC4KKyAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSB0aGUgZHJpdmVyJ3MgaW5zdGFsbGVkCisgIC8vIGRpcmVjdG9yeSAoJ0RpcicgYmVsb3cpIG9yIHRoZSBSZXNvdXJjZURpci4KKyAgaWYgKFN0cmluZ1JlZihELkRpcikuc3RhcnRzd2l0aChTeXNSb290KSkgeworICAgIGFkZFBhdGhJZkV4aXN0cyhELkRpciArICIvLi4vbGliLyIgKyBNdWx0aWFyY2hUcmlwbGUsIFBhdGhzKTsKKyAgICBhZGRQYXRoSWZFeGlzdHMoRC5EaXIgKyAiLy4uLyIgKyBPU0xpYkRpciwgUGF0aHMpOworICB9CisKICAgYWRkUGF0aElmRXhpc3RzKFN5c1Jvb3QgKyAiL2xpYi8iICsgTXVsdGlhcmNoVHJpcGxlLCBQYXRocyk7Ci0gIGFkZFBhdGhJZkV4aXN0cyhTeXNSb290ICsgIi9saWIvLi4vIiArIE11bHRpbGliLCBQYXRocyk7CisgIGFkZFBhdGhJZkV4aXN0cyhTeXNSb290ICsgIi9saWIvLi4vIiArIE9TTGliRGlyLCBQYXRocyk7CiAgIGFkZFBhdGhJZkV4aXN0cyhTeXNSb290ICsgIi91c3IvbGliLyIgKyBNdWx0aWFyY2hUcmlwbGUsIFBhdGhzKTsKLSAgYWRkUGF0aElmRXhpc3RzKFN5c1Jvb3QgKyAiL3Vzci9saWIvLi4vIiArIE11bHRpbGliLCBQYXRocyk7CisgIGFkZFBhdGhJZkV4aXN0cyhTeXNSb290ICsgIi91c3IvbGliLy4uLyIgKyBPU0xpYkRpciwgUGF0aHMpOwogCiAgIC8vIFRyeSB3YWxraW5nIHZpYSB0aGUgR0NDIHRyaXBsZSBwYXRoIGluIGNhc2Ugb2YgYmlhcmNoIG9yIG11bHRpYXJjaCBHQ0MKICAgLy8gaW5zdGFsbGF0aW9ucyB3aXRoIHN0cmFuZ2Ugc3ltbGlua3MuCiAgIGlmIChHQ0NJbnN0YWxsYXRpb24uaXNWYWxpZCgpKSB7CiAgICAgYWRkUGF0aElmRXhpc3RzKFN5c1Jvb3QgKyAiL3Vzci9saWIvIiArIEdDQ0luc3RhbGxhdGlvbi5nZXRUcmlwbGUoKS5zdHIoKSArCi0gICAgICAgICAgICAgICAgICAgICIvLi4vLi4vIiArIE11bHRpbGliLCBQYXRocyk7CisgICAgICAgICAgICAgICAgICAgICIvLi4vLi4vIiArIE9TTGliRGlyLCBQYXRocyk7CiAKLSAgICAvLyBBZGQgdGhlIG5vbi1tdWx0aWxpYiBzdWZmaXhlZCBwYXRocyAoaWYgcG90ZW50aWFsbHkgZGlmZmVyZW50KS4KLSAgICBjb25zdCBzdGQ6OnN0cmluZyAmTGliUGF0aCA9IEdDQ0luc3RhbGxhdGlvbi5nZXRQYXJlbnRMaWJQYXRoKCk7Ci0gICAgY29uc3QgbGx2bTo6VHJpcGxlICZHQ0NUcmlwbGUgPSBHQ0NJbnN0YWxsYXRpb24uZ2V0VHJpcGxlKCk7Ci0gICAgaWYgKCFHQ0NJbnN0YWxsYXRpb24uZ2V0QmlhcmNoU3VmZml4KCkuZW1wdHkoKSkKKyAgICAvLyBBZGQgdGhlICdvdGhlcicgYmlhcmNoIHZhcmlhbnQgcGF0aAorICAgIE11bHRpbGliIEJpYXJjaFNpYmxpbmc7CisgICAgaWYgKEdDQ0luc3RhbGxhdGlvbi5nZXRCaWFyY2hTaWJsaW5nKEJpYXJjaFNpYmxpbmcpKSB7CiAgICAgICBhZGRQYXRoSWZFeGlzdHMoR0NDSW5zdGFsbGF0aW9uLmdldEluc3RhbGxQYXRoKCkgKwotICAgICAgICAgICAgICAgICAgICAgIEdDQ0luc3RhbGxhdGlvbi5nZXRNSVBTQUJJRGlyU3VmZml4KCksIFBhdGhzKTsKKyAgICAgICAgICAgICAgICAgICAgICBCaWFyY2hTaWJsaW5nLmdjY1N1ZmZpeCgpLCBQYXRocyk7CisgICAgfQogCiAgICAgLy8gU2VlIGNvbW1lbnRzIGFib3ZlIG9uIHRoZSBtdWx0aWxpYiB2YXJpYW50IGZvciBkZXRhaWxzIG9mIHdoeSB0aGlzIGlzCiAgICAgLy8gaW5jbHVkZWQgZXZlbiBmcm9tIG91dHNpZGUgdGhlIHN5c3Jvb3QuCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkxpYlBhdGggPSBHQ0NJbnN0YWxsYXRpb24uZ2V0UGFyZW50TGliUGF0aCgpOworICAgIGNvbnN0IGxsdm06OlRyaXBsZSAmR0NDVHJpcGxlID0gR0NDSW5zdGFsbGF0aW9uLmdldFRyaXBsZSgpOworICAgIGNvbnN0IE11bHRpbGliICZNdWx0aWxpYiA9IEdDQ0luc3RhbGxhdGlvbi5nZXRNdWx0aWxpYigpOwogICAgIGFkZFBhdGhJZkV4aXN0cyhMaWJQYXRoICsgIi8uLi8iICsgR0NDVHJpcGxlLnN0cigpICsKLSAgICAgICAgICAgICAgICAgICAgIi9saWIiICsgR0NDSW5zdGFsbGF0aW9uLmdldE1JUFNBQklEaXJTdWZmaXgoKSwgUGF0aHMpOworICAgICAgICAgICAgICAgICAgICAiL2xpYiIgKyBNdWx0aWxpYi5vc1N1ZmZpeCgpLCBQYXRocyk7CiAKICAgICAvLyBTZWUgY29tbWVudHMgYWJvdmUgb24gdGhlIG11bHRpbGliIHZhcmlhbnQgZm9yIGRldGFpbHMgb2Ygd2h5IHRoaXMgaXMKICAgICAvLyBvbmx5IGluY2x1ZGVkIGZyb20gd2l0aGluIHRoZSBzeXNyb290LgogICAgIGlmIChTdHJpbmdSZWYoTGliUGF0aCkuc3RhcnRzd2l0aChTeXNSb290KSkKICAgICAgIGFkZFBhdGhJZkV4aXN0cyhMaWJQYXRoLCBQYXRocyk7CiAgIH0KKworICAvLyBTaW1pbGFyIHRvIHRoZSBsb2dpYyBmb3IgR0NDIGFib3ZlLCBpZiB3ZSBhcmUgY3VycmVudGx5IHJ1bm5pbmcgQ2xhbmcKKyAgLy8gaW5zaWRlIG9mIHRoZSByZXF1ZXN0ZWQgc3lzdGVtIHJvb3QsIGFkZCBpdHMgcGFyZW50IGxpYnJhcnkgcGF0aCB0byB0aG9zZQorICAvLyBzZWFyY2hlZC4KKyAgLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSB0aGUgZHJpdmVyJ3MgaW5zdGFsbGVkCisgIC8vIGRpcmVjdG9yeSAoJ0RpcicgYmVsb3cpIG9yIHRoZSBSZXNvdXJjZURpci4KKyAgaWYgKFN0cmluZ1JlZihELkRpcikuc3RhcnRzd2l0aChTeXNSb290KSkKKyAgICBhZGRQYXRoSWZFeGlzdHMoRC5EaXIgKyAiLy4uL2xpYiIsIFBhdGhzKTsKKwogICBhZGRQYXRoSWZFeGlzdHMoU3lzUm9vdCArICIvbGliIiwgUGF0aHMpOwogICBhZGRQYXRoSWZFeGlzdHMoU3lzUm9vdCArICIvdXNyL2xpYiIsIFBhdGhzKTsKIH0KIAotYm9vbCBGcmVlQlNEOjpIYXNOYXRpdmVMTFZNU3VwcG9ydCgpIGNvbnN0IHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KIGJvb2wgTGludXg6Okhhc05hdGl2ZUxMVk1TdXBwb3J0KCkgY29uc3QgewogICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTI1MzYsMTkgKzMxMDcsNiBAQAogICByZXR1cm4gbmV3IHRvb2xzOjpnbnV0b29sczo6QXNzZW1ibGUoKnRoaXMpOwogfQogCi12b2lkIExpbnV4OjphZGRDbGFuZ1RhcmdldE9wdGlvbnMoY29uc3QgQXJnTGlzdCAmRHJpdmVyQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdCB7Ci0gIGNvbnN0IEdlbmVyaWNfR0NDOjpHQ0NWZXJzaW9uICZWID0gR0NDSW5zdGFsbGF0aW9uLmdldFZlcnNpb24oKTsKLSAgYm9vbCBVc2VJbml0QXJyYXlEZWZhdWx0ID0KLSAgICAgICFWLmlzT2xkZXJUaGFuKDQsIDcsIDApIHx8Ci0gICAgICBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0IHx8Ci0gICAgICBnZXRUcmlwbGUoKS5nZXRFbnZpcm9ubWVudCgpID09IGxsdm06OlRyaXBsZTo6QW5kcm9pZDsKLSAgaWYgKERyaXZlckFyZ3MuaGFzRmxhZyhvcHRpb25zOjpPUFRfZnVzZV9pbml0X2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mbm9fdXNlX2luaXRfYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgVXNlSW5pdEFycmF5RGVmYXVsdCkpCi0gICAgQ0MxQXJncy5wdXNoX2JhY2soIi1mdXNlLWluaXQtYXJyYXkiKTsKLX0KLQogc3RkOjpzdHJpbmcgTGludXg6OmNvbXB1dGVTeXNSb290KCkgY29uc3QgewogICBpZiAoIWdldERyaXZlcigpLlN5c1Jvb3QuZW1wdHkoKSkKICAgICByZXR1cm4gZ2V0RHJpdmVyKCkuU3lzUm9vdDsKQEAgLTI1NjIsMTUgKzMxMjAsMTUgQEAKIAogICBjb25zdCBTdHJpbmdSZWYgSW5zdGFsbERpciA9IEdDQ0luc3RhbGxhdGlvbi5nZXRJbnN0YWxsUGF0aCgpOwogICBjb25zdCBTdHJpbmdSZWYgVHJpcGxlU3RyID0gR0NDSW5zdGFsbGF0aW9uLmdldFRyaXBsZSgpLnN0cigpOwotICBjb25zdCBTdHJpbmdSZWYgTUlQU0FCSURpclN1ZmZpeCA9IEdDQ0luc3RhbGxhdGlvbi5nZXRNSVBTQUJJRGlyU3VmZml4KCk7CisgIGNvbnN0IE11bHRpbGliICZNdWx0aWxpYiA9IEdDQ0luc3RhbGxhdGlvbi5nZXRNdWx0aWxpYigpOwogCiAgIHN0ZDo6c3RyaW5nIFBhdGggPSAoSW5zdGFsbERpciArICIvLi4vLi4vLi4vLi4vIiArIFRyaXBsZVN0ciArICIvbGliYyIgKwotICAgICAgICAgICAgICAgICAgICAgIE1JUFNBQklEaXJTdWZmaXgpLnN0cigpOworICAgICAgICAgICAgICAgICAgICAgIE11bHRpbGliLm9zU3VmZml4KCkpLnN0cigpOwogCiAgIGlmIChsbHZtOjpzeXM6OmZzOjpleGlzdHMoUGF0aCkpCiAgICAgcmV0dXJuIFBhdGg7CiAKLSAgUGF0aCA9IChJbnN0YWxsRGlyICsgIi8uLi8uLi8uLi8uLi9zeXNyb290IiArIE1JUFNBQklEaXJTdWZmaXgpLnN0cigpOworICBQYXRoID0gKEluc3RhbGxEaXIgKyAiLy4uLy4uLy4uLy4uL3N5c3Jvb3QiICsgTXVsdGlsaWIub3NTdWZmaXgoKSkuc3RyKCk7CiAKICAgaWYgKGxsdm06OnN5czo6ZnM6OmV4aXN0cyhQYXRoKSkKICAgICByZXR1cm4gUGF0aDsKQEAgLTI2NzQsNyArMzIzMiw5IEBACiAgICAgTXVsdGlhcmNoSW5jbHVkZURpcnMgPSBYODZfNjRNdWx0aWFyY2hJbmNsdWRlRGlyczsKICAgfSBlbHNlIGlmIChnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYpIHsKICAgICBNdWx0aWFyY2hJbmNsdWRlRGlycyA9IFg4Nk11bHRpYXJjaEluY2x1ZGVEaXJzOwotICB9IGVsc2UgaWYgKGdldFRyaXBsZSgpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQpIHsKKyAgfSBlbHNlIGlmIChnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0IHx8CisgICAgICAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NF9iZSB8fAorICAgICAgICAgICAgIGdldFRyaXBsZSgpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybTY0KSB7CiAgICAgTXVsdGlhcmNoSW5jbHVkZURpcnMgPSBBQXJjaDY0TXVsdGlhcmNoSW5jbHVkZURpcnM7CiAgIH0gZWxzZSBpZiAoZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtKSB7CiAgICAgaWYgKGdldFRyaXBsZSgpLmdldEVudmlyb25tZW50KCkgPT0gbGx2bTo6VHJpcGxlOjpHTlVFQUJJSEYpCkBAIC0yNzI2LDE3ICszMjg2LDE2IEBACiAvLy8gbGlic3RkYysrIGluc3RhbGxhdGlvbi4KIC8qc3RhdGljKi8gYm9vbCBMaW51eDo6YWRkTGliU3RkQ1hYSW5jbHVkZVBhdGhzKFR3aW5lIEJhc2UsIFR3aW5lIFN1ZmZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lIFRhcmdldEFyY2hEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZSBCaWFyY2hTdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZSBNSVBTQUJJRGlyU3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUgSW5jbHVkZVN1ZmZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZ0xpc3QgJkRyaXZlckFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSB7CiAgIGlmICghYWRkTGliU3RkQ1hYSW5jbHVkZVBhdGhzKEJhc2UgKyBTdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEFyY2hEaXIgKyBNSVBTQUJJRGlyU3VmZml4ICsgQmlhcmNoU3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRBcmNoRGlyICsgSW5jbHVkZVN1ZmZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyQXJncywgQ0MxQXJncykpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIGFkZFN5c3RlbUluY2x1ZGUoRHJpdmVyQXJncywgQ0MxQXJncywgQmFzZSArICIvIiArIFRhcmdldEFyY2hEaXIgKyBTdWZmaXgKLSAgICAgICAgICAgICAgICAgICArIE1JUFNBQklEaXJTdWZmaXggKyBCaWFyY2hTdWZmaXgpOworICAgICAgICAgICAgICAgICAgICsgSW5jbHVkZVN1ZmZpeCk7CiAgIHJldHVybiB0cnVlOwogfQogCkBAIC0yNzQ4LDkgKzMzMDcsMjQgQEAKIAogICAvLyBDaGVjayBpZiBsaWJjKysgaGFzIGJlZW4gZW5hYmxlZCBhbmQgcHJvdmlkZSBpdHMgaW5jbHVkZSBwYXRocyBpZiBzby4KICAgaWYgKEdldENYWFN0ZGxpYlR5cGUoRHJpdmVyQXJncykgPT0gVG9vbENoYWluOjpDU1RfTGliY3h4KSB7Ci0gICAgLy8gbGliYysrIGlzIGFsd2F5cyBpbnN0YWxsZWQgYXQgYSBmaXhlZCBwYXRoIG9uIExpbnV4IGN1cnJlbnRseS4KLSAgICBhZGRTeXN0ZW1JbmNsdWRlKERyaXZlckFyZ3MsIENDMUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICBnZXREcml2ZXIoKS5TeXNSb290ICsgIi91c3IvaW5jbHVkZS9jKysvdjEiKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBMaWJDWFhJbmNsdWRlUGF0aENhbmRpZGF0ZXNbXSA9IHsKKyAgICAgIC8vIFRoZSBwcmltYXJ5IGxvY2F0aW9uIGlzIHdpdGhpbiB0aGUgQ2xhbmcgaW5zdGFsbGF0aW9uLgorICAgICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBoYXJkIGNvZGUgJ3YxJyBoZXJlIHRvIG1ha2UgQ2xhbmcgZnV0dXJlIHByb29mIHRvCisgICAgICAvLyBuZXdlciBBQkkgdmVyc2lvbnMuCisgICAgICBnZXREcml2ZXIoKS5EaXIgKyAiLy4uL2luY2x1ZGUvYysrL3YxIiwKKworICAgICAgLy8gV2UgYWxzbyBjaGVjayB0aGUgc3lzdGVtIGFzIGZvciBhIGxvbmcgdGltZSB0aGlzIGlzIHRoZSBvbmx5IHBsYWNlIENsYW5nIGxvb2tlZC4KKyAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5IHJlbW92ZSB0aGlzLiBJdCBkb2Vzbid0IG1ha2UgYW55IHNlbnNlLgorICAgICAgZ2V0RHJpdmVyKCkuU3lzUm9vdCArICIvdXNyL2luY2x1ZGUvYysrL3YxIgorICAgIH07CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxsdm06OmFycmF5X2xlbmd0aG9mKExpYkNYWEluY2x1ZGVQYXRoQ2FuZGlkYXRlcyk7CisgICAgICAgICArK2kpIHsKKyAgICAgIGlmICghbGx2bTo6c3lzOjpmczo6ZXhpc3RzKExpYkNYWEluY2x1ZGVQYXRoQ2FuZGlkYXRlc1tpXSkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gQWRkIHRoZSBmaXJzdCBjYW5kaWRhdGUgdGhhdCBleGlzdHMuCisgICAgICBhZGRTeXN0ZW1JbmNsdWRlKERyaXZlckFyZ3MsIENDMUFyZ3MsIExpYkNYWEluY2x1ZGVQYXRoQ2FuZGlkYXRlc1tpXSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTI3NjUsMTYgKzMzMzksMTUgQEAKICAgU3RyaW5nUmVmIExpYkRpciA9IEdDQ0luc3RhbGxhdGlvbi5nZXRQYXJlbnRMaWJQYXRoKCk7CiAgIFN0cmluZ1JlZiBJbnN0YWxsRGlyID0gR0NDSW5zdGFsbGF0aW9uLmdldEluc3RhbGxQYXRoKCk7CiAgIFN0cmluZ1JlZiBUcmlwbGVTdHIgPSBHQ0NJbnN0YWxsYXRpb24uZ2V0VHJpcGxlKCkuc3RyKCk7Ci0gIFN0cmluZ1JlZiBNSVBTQUJJRGlyU3VmZml4ID0gR0NDSW5zdGFsbGF0aW9uLmdldE1JUFNBQklEaXJTdWZmaXgoKTsKLSAgU3RyaW5nUmVmIEJpYXJjaFN1ZmZpeCA9IEdDQ0luc3RhbGxhdGlvbi5nZXRCaWFyY2hTdWZmaXgoKTsKKyAgY29uc3QgTXVsdGlsaWIgJk11bHRpbGliID0gR0NDSW5zdGFsbGF0aW9uLmdldE11bHRpbGliKCk7CiAgIGNvbnN0IEdDQ1ZlcnNpb24gJlZlcnNpb24gPSBHQ0NJbnN0YWxsYXRpb24uZ2V0VmVyc2lvbigpOwogCiAgIGlmIChhZGRMaWJTdGRDWFhJbmNsdWRlUGF0aHMoTGliRGlyLnN0cigpICsgIi8uLi9pbmNsdWRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2MrKy8iICsgVmVyc2lvbi5UZXh0LCBUcmlwbGVTdHIsIEJpYXJjaFN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVBTQUJJRGlyU3VmZml4LCBEcml2ZXJBcmdzLCBDQzFBcmdzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2MrKy8iICsgVmVyc2lvbi5UZXh0LCBUcmlwbGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlsaWIuaW5jbHVkZVN1ZmZpeCgpLCBEcml2ZXJBcmdzLCBDQzFBcmdzKSkKICAgICByZXR1cm47CiAKLSAgY29uc3Qgc3RkOjpzdHJpbmcgSW5jbHVkZVBhdGhDYW5kaWRhdGVzW10gPSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIExpYlN0ZENYWEluY2x1ZGVQYXRoQ2FuZGlkYXRlc1tdID0gewogICAgIC8vIEdlbnRvbyBpcyB3ZWlyZCBhbmQgcGxhY2VzIGl0cyBoZWFkZXJzIGluc2lkZSB0aGUgR0NDIGluc3RhbGwsIHNvIGlmIHRoZQogICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gZmluZCB0aGUgaGVhZGVycyBmYWlscywgdHJ5IHRoZXNlIHBhdHRlcm5zLgogICAgIEluc3RhbGxEaXIuc3RyKCkgKyAiL2luY2x1ZGUvZysrLXYiICsgVmVyc2lvbi5NYWpvclN0ciArICIuIiArCkBAIC0yNzg3LDkgKzMzNjAsMTAgQEAKICAgICBMaWJEaXIuc3RyKCkgKyAiLy4uL2luY2x1ZGUvYysrIiwKICAgfTsKIAotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGx2bTo6YXJyYXlfbGVuZ3Rob2YoSW5jbHVkZVBhdGhDYW5kaWRhdGVzKTsgKytpKSB7Ci0gICAgaWYgKGFkZExpYlN0ZENYWEluY2x1ZGVQYXRocyhJbmNsdWRlUGF0aENhbmRpZGF0ZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmlwbGVTdHIgKyBNSVBTQUJJRGlyU3VmZml4ICsgQmlhcmNoU3VmZml4LAorICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGx2bTo6YXJyYXlfbGVuZ3Rob2YoTGliU3RkQ1hYSW5jbHVkZVBhdGhDYW5kaWRhdGVzKTsKKyAgICAgICArK2kpIHsKKyAgICBpZiAoYWRkTGliU3RkQ1hYSW5jbHVkZVBhdGhzKExpYlN0ZENYWEluY2x1ZGVQYXRoQ2FuZGlkYXRlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaXBsZVN0ciArIE11bHRpbGliLmluY2x1ZGVTdWZmaXgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlckFyZ3MsIENDMUFyZ3MpKQogICAgICAgYnJlYWs7CiAgIH0KQEAgLTI4NjAsNyArMzQzNCw2IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotCiB2b2lkIFhDb3JlOjpBZGRDbGFuZ1N5c3RlbUluY2x1ZGVBcmdzKGNvbnN0IEFyZ0xpc3QgJkRyaXZlckFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0IHsKICAgaWYgKERyaXZlckFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9ub3N0ZGluYykgfHwKZGlmZiAtLWdpdCBhL2xpYi9Ecml2ZXIvVG9vbENoYWlucy5oIGIvbGliL0RyaXZlci9Ub29sQ2hhaW5zLmgKaW5kZXggNTBkMzcwMC4uYWQ0ZDRjMSAxMDA2NDQKLS0tIGEvbGliL0RyaXZlci9Ub29sQ2hhaW5zLmgKKysrIGIvbGliL0RyaXZlci9Ub29sQ2hhaW5zLmgKQEAgLTEzLDExICsxMywxMyBAQAogI2luY2x1ZGUgIlRvb2xzLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVmVyc2lvblR1cGxlLmgiCiAjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL0FjdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0RyaXZlci9NdWx0aWxpYi5oIgogI2luY2x1ZGUgImNsYW5nL0RyaXZlci9Ub29sQ2hhaW4uaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCi0jaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CiBuYW1lc3BhY2UgZHJpdmVyIHsKQEAgLTY3LDcgKzY5LDYgQEAKICAgICBib29sIG9wZXJhdG9yPj0oY29uc3QgR0NDVmVyc2lvbiAmUkhTKSBjb25zdCB7IHJldHVybiAhKCp0aGlzIDwgUkhTKTsgfQogICB9OwogCi0KICAgLy8vIFxicmllZiBUaGlzIGlzIGEgY2xhc3MgdG8gZmluZCBhIHZpYWJsZSBHQ0MgaW5zdGFsbGF0aW9uIGZvciBDbGFuZyB0bwogICAvLy8gdXNlLgogICAvLy8KQEAgLTc2LDE0ICs3NywxNyBAQAogICAvLy8gRHJpdmVyLCBhbmQgaGFzIGxvZ2ljIGZvciBmdXp6aW5nIHRoYXQgd2hlcmUgYXBwcm9wcmlhdGUuCiAgIGNsYXNzIEdDQ0luc3RhbGxhdGlvbkRldGVjdG9yIHsKICAgICBib29sIElzVmFsaWQ7Ci0gICAgY29uc3QgRHJpdmVyICZEOwogICAgIGxsdm06OlRyaXBsZSBHQ0NUcmlwbGU7CiAKICAgICAvLyBGSVhNRTogVGhlc2UgbWlnaHQgYmUgYmV0dGVyIGFzIHBhdGggb2JqZWN0cy4KICAgICBzdGQ6OnN0cmluZyBHQ0NJbnN0YWxsUGF0aDsKLSAgICBzdGQ6OnN0cmluZyBHQ0NCaWFyY2hTdWZmaXg7CiAgICAgc3RkOjpzdHJpbmcgR0NDUGFyZW50TGliUGF0aDsKLSAgICBzdGQ6OnN0cmluZyBHQ0NNSVBTQUJJRGlyU3VmZml4OworCisgICAgLy8vIFRoZSBwcmltYXJ5IG11bHRpbGliIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gZmxhZ3MuCisgICAgTXVsdGlsaWIgU2VsZWN0ZWRNdWx0aWxpYjsKKyAgICAvLy8gT24gQmlhcmNoIHN5c3RlbXMsIHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGRlZmF1bHQgbXVsdGlsaWIgd2hlbgorICAgIC8vLyB0YXJnZXRpbmcgdGhlIG5vbi1kZWZhdWx0IG11bHRpbGliLiBPdGhlcndpc2UsIGl0IGlzIGVtcHR5LgorICAgIGxsdm06Ok9wdGlvbmFsPE11bHRpbGliPiBCaWFyY2hTaWJsaW5nOwogCiAgICAgR0NDVmVyc2lvbiBWZXJzaW9uOwogCkBAIC05MSw4ICs5NSwxMiBAQAogICAgIC8vIG9yZGVyIHRvIHByaW50IG91dCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBpbiB2ZXJib3NlIG1vZGUuCiAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IENhbmRpZGF0ZUdDQ0luc3RhbGxQYXRoczsKIAorICAgIC8vLyBUaGUgc2V0IG9mIG11bHRpbGlicyB0aGF0IHRoZSBkZXRlY3RlZCBpbnN0YWxsYXRpb24gc3VwcG9ydHMuCisgICAgTXVsdGlsaWJTZXQgTXVsdGlsaWJzOworCiAgIHB1YmxpYzoKLSAgICBHQ0NJbnN0YWxsYXRpb25EZXRlY3Rvcihjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06OlRyaXBsZSAmVGFyZ2V0VHJpcGxlLAorICAgIEdDQ0luc3RhbGxhdGlvbkRldGVjdG9yKCkgOiBJc1ZhbGlkKGZhbHNlKSB7fQorICAgIHZvaWQgaW5pdChjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06OlRyaXBsZSAmVGFyZ2V0VHJpcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CiAKICAgICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgd2UgZGV0ZWN0ZWQgYSB2YWxpZCBHQ0MgaW5zdGFsbC4KQEAgLTEwNCwyNiArMTEyLDE4IEBACiAgICAgLy8vIFxicmllZiBHZXQgdGhlIGRldGVjdGVkIEdDQyBpbnN0YWxsYXRpb24gcGF0aC4KICAgICBTdHJpbmdSZWYgZ2V0SW5zdGFsbFBhdGgoKSBjb25zdCB7IHJldHVybiBHQ0NJbnN0YWxsUGF0aDsgfQogCi0gICAgLy8vIFxicmllZiBHZXQgdGhlIGRldGVjdGVkIEdDQyBpbnN0YWxsYXRpb24gcGF0aCBzdWZmaXggZm9yIHRoZSBiaS1hcmNoCi0gICAgLy8vIHRhcmdldCB2YXJpYW50LgotICAgIFN0cmluZ1JlZiBnZXRCaWFyY2hTdWZmaXgoKSBjb25zdCB7IHJldHVybiBHQ0NCaWFyY2hTdWZmaXg7IH0KLQogICAgIC8vLyBcYnJpZWYgR2V0IHRoZSBkZXRlY3RlZCBHQ0MgcGFyZW50IGxpYiBwYXRoLgogICAgIFN0cmluZ1JlZiBnZXRQYXJlbnRMaWJQYXRoKCkgY29uc3QgeyByZXR1cm4gR0NDUGFyZW50TGliUGF0aDsgfQogCi0gICAgLy8vIFxicmllZiBHZXQgdGhlIGRldGVjdGVkIEdDQyBNSVBTIEFCSSBkaXJlY3Rvcnkgc3VmZml4LgotICAgIC8vLwotICAgIC8vLyBUaGlzIGlzIHVzZWQgYXMgYSBzdWZmaXggYm90aCB0byB0aGUgaW5zdGFsbCBkaXJlY3Rvcnkgb2YgR0NDIGFuZCBhcwotICAgIC8vLyBhIHN1ZmZpeCB0byBpdHMgcGFyZW50IGxpYiBwYXRoIGluIG9yZGVyIHRvIHNlbGVjdCBhIE1JUFMgQUJJLXNwZWNpZmljCi0gICAgLy8vIHN1YmRpcmVjdG9yeS4KLSAgICAvLy8KLSAgICAvLy8gVGhpcyB3aWxsIGFsd2F5cyBiZSBlbXB0eSBmb3IgYW55IG5vbi1NSVBTIHRhcmdldC4KLSAgICAvLy8KLSAgICAvLyBGSVhNRTogVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgZXhpc3QgYXQgYWxsLCBhbmQgc2hvdWxkIGJlIGZhY3RvcmVkCi0gICAgLy8gaW50byB0aGUgbXVsdGlhcmNoIGFuZC9vciBiaWFyY2ggc3VwcG9ydC4gUGxlYXNlIGRvbid0IGFkZCBtb3JlIHVzZXMgb2YKLSAgICAvLyB0aGlzIGludGVyZmFjZSwgaXQgaXMgbWVhbnQgYXMgYSBsZWdhY3kgY3J1dGNoIGZvciB0aGUgTUlQUyBkcml2ZXIKLSAgICAvLyBsb2dpYy4KLSAgICBTdHJpbmdSZWYgZ2V0TUlQU0FCSURpclN1ZmZpeCgpIGNvbnN0IHsgcmV0dXJuIEdDQ01JUFNBQklEaXJTdWZmaXg7IH0KKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgZGV0ZWN0ZWQgTXVsdGlsaWIKKyAgICBjb25zdCBNdWx0aWxpYiAmZ2V0TXVsdGlsaWIoKSBjb25zdCB7IHJldHVybiBTZWxlY3RlZE11bHRpbGliOyB9CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgd2hvbGUgTXVsdGlsaWJTZXQKKyAgICBjb25zdCBNdWx0aWxpYlNldCAmZ2V0TXVsdGlsaWJzKCkgY29uc3QgeyByZXR1cm4gTXVsdGlsaWJzOyB9CisKKyAgICAvLy8gR2V0IHRoZSBiaWFyY2ggc2libGluZyBtdWx0aWxpYiAoaWYgaXQgZXhpc3RzKS4KKyAgICAvLy8gXHJldHVybiB0cnVlIGlmZiBzdWNoIGEgc2libGluZyBleGlzdHMKKyAgICBib29sIGdldEJpYXJjaFNpYmxpbmcoTXVsdGlsaWIgJk0pIGNvbnN0OwogCiAgICAgLy8vIFxicmllZiBHZXQgdGhlIGRldGVjdGVkIEdDQyB2ZXJzaW9uIHN0cmluZy4KICAgICBjb25zdCBHQ0NWZXJzaW9uICZnZXRWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gVmVyc2lvbjsgfQpAQCAtMTQwLDE1ICsxNDAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJkJpYXJjaExpYkRpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZCaWFyY2hUcmlwbGVBbGlhc2VzKTsKIAotICAgIHZvaWQgU2NhbkxpYkRpckZvckdDQ1RyaXBsZShsbHZtOjpUcmlwbGU6OkFyY2hUeXBlIFRhcmdldEFyY2gsCisgICAgdm9pZCBTY2FuTGliRGlyRm9yR0NDVHJpcGxlKGNvbnN0IGxsdm06OlRyaXBsZSAmVGFyZ2V0QXJjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTGliRGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQ2FuZGlkYXRlVHJpcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5lZWRzQmlhcmNoU3VmZml4ID0gZmFsc2UpOwogCi0gICAgdm9pZCBmaW5kTUlQU0FCSURpclN1ZmZpeChzdGQ6OnN0cmluZyAmU3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6VHJpcGxlOjpBcmNoVHlwZSBUYXJnZXRBcmNoLCBTdHJpbmdSZWYgUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CisgICAgYm9vbCBmaW5kTUlQU011bHRpbGlicyhjb25zdCBsbHZtOjpUcmlwbGUgJlRhcmdldEFyY2gsIFN0cmluZ1JlZiBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKTsKKworICAgIGJvb2wgZmluZEJpYXJjaE11bHRpbGlicyhjb25zdCBsbHZtOjpUcmlwbGUgJlRhcmdldEFyY2gsIFN0cmluZ1JlZiBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTmVlZHNCaWFyY2hTdWZmaXgpOwogICB9OwogCiAgIEdDQ0luc3RhbGxhdGlvbkRldGVjdG9yIEdDQ0luc3RhbGxhdGlvbjsKQEAgLTE1OCwxNyArMTYxLDE4IEBACiAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CiAgIH5HZW5lcmljX0dDQygpOwogCi0gIHZpcnR1YWwgdm9pZCBwcmludFZlcmJvc2VJbmZvKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgcHJpbnRWZXJib3NlSW5mbyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgYm9vbCBJc1Vud2luZFRhYmxlc0RlZmF1bHQoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIGlzUElDRGVmYXVsdCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgaXNQSUVEZWZhdWx0KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBpc1BJQ0RlZmF1bHRGb3JjZWQoKSBjb25zdDsKKyAgYm9vbCBJc1Vud2luZFRhYmxlc0RlZmF1bHQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1BJQ0RlZmF1bHQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1BJRURlZmF1bHQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1BJQ0RlZmF1bHRGb3JjZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBJc0ludGVncmF0ZWRBc3NlbWJsZXJEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBUb29sICpnZXRUb29sKEFjdGlvbjo6QWN0aW9uQ2xhc3MgQUMpIGNvbnN0OwotICB2aXJ0dWFsIFRvb2wgKmJ1aWxkQXNzZW1ibGVyKCkgY29uc3Q7Ci0gIHZpcnR1YWwgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdDsKKyAgVG9vbCAqZ2V0VG9vbChBY3Rpb246OkFjdGlvbkNsYXNzIEFDKSBjb25zdCBvdmVycmlkZTsKKyAgVG9vbCAqYnVpbGRBc3NlbWJsZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdCBvdmVycmlkZTsKIAogICAvLy8gXG5hbWUgVG9vbENoYWluIEltcGxlbWVudGF0aW9uIEhlbHBlciBGdW5jdGlvbnMKICAgLy8vIEB7CkBAIC0xODIsMjcgKzE4NiwxMzggQEAKICAgLy8vIEB9CiAKIHByaXZhdGU6Ci0gIG11dGFibGUgT3duaW5nUHRyPHRvb2xzOjpnY2M6OlByZXByb2Nlc3M+IFByZXByb2Nlc3M7Ci0gIG11dGFibGUgT3duaW5nUHRyPHRvb2xzOjpnY2M6OlByZWNvbXBpbGU+IFByZWNvbXBpbGU7Ci0gIG11dGFibGUgT3duaW5nUHRyPHRvb2xzOjpnY2M6OkNvbXBpbGU+IENvbXBpbGU7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPHRvb2xzOjpnY2M6OlByZXByb2Nlc3M+IFByZXByb2Nlc3M7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPHRvb2xzOjpnY2M6OkNvbXBpbGU+IENvbXBpbGU7Cit9OworCitjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBNYWNoTyA6IHB1YmxpYyBUb29sQ2hhaW4geworcHJvdGVjdGVkOgorICBUb29sICpidWlsZEFzc2VtYmxlcigpIGNvbnN0IG92ZXJyaWRlOworICBUb29sICpidWlsZExpbmtlcigpIGNvbnN0IG92ZXJyaWRlOworICBUb29sICpnZXRUb29sKEFjdGlvbjo6QWN0aW9uQ2xhc3MgQUMpIGNvbnN0IG92ZXJyaWRlOworcHJpdmF0ZToKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8dG9vbHM6OmRhcndpbjo6TGlwbz4gTGlwbzsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8dG9vbHM6OmRhcndpbjo6RHN5bXV0aWw+IERzeW11dGlsOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjx0b29sczo6ZGFyd2luOjpWZXJpZnlEZWJ1Zz4gVmVyaWZ5RGVidWc7CisKK3B1YmxpYzoKKyAgTWFjaE8oY29uc3QgRHJpdmVyICZELCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKKyAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpOworICB+TWFjaE8oKTsKKworICAvLy8gQG5hbWUgTWFjaE8gc3BlY2lmaWMgdG9vbGNoYWluIEFQSQorICAvLy8geworCisgIC8vLyBHZXQgdGhlICJNYWNoTyIgYXJjaCBuYW1lIGZvciBhIHBhcnRpY3VsYXIgY29tcGlsZXIgaW52b2NhdGlvbi4gRm9yCisgIC8vLyBleGFtcGxlLCBBcHBsZSB0cmVhdHMgZGlmZmVyZW50IEFSTSB2YXJpYXRpb25zIGFzIGRpc3RpbmN0IGFyY2hpdGVjdHVyZXMuCisgIFN0cmluZ1JlZiBnZXRNYWNoT0FyY2hOYW1lKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncykgY29uc3Q7CisKKworICAvLy8gQWRkIHRoZSBsaW5rZXIgYXJndW1lbnRzIHRvIGxpbmsgdGhlIEFSQyBydW50aW1lIGxpYnJhcnkuCisgIHZpcnR1YWwgdm9pZCBBZGRMaW5rQVJDQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IHt9CisKKyAgLy8vIEFkZCB0aGUgbGlua2VyIGFyZ3VtZW50cyB0byBsaW5rIHRoZSBjb21waWxlciBydW50aW1lIGxpYnJhcnkuCisgIHZpcnR1YWwgdm9pZCBBZGRMaW5rUnVudGltZUxpYkFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkCisgIGFkZFN0YXJ0T2JqZWN0RmlsZUFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3Qge30KKworICB2aXJ0dWFsIHZvaWQgYWRkTWluVmVyc2lvbkFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdCB7fQorCisgIC8vLyBPbiBzb21lIGlPUyBwbGF0Zm9ybXMsIGtlcm5lbCBhbmQga2VybmVsIG1vZHVsZXMgd2VyZSBidWlsdCBzdGF0aWNhbGx5LiBJcworICAvLy8gdGhpcyBzdWNoIGEgdGFyZ2V0PworICB2aXJ0dWFsIGJvb2wgaXNLZXJuZWxTdGF0aWMoKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIElzIHRoZSB0YXJnZXQgZWl0aGVyIGlPUyBvciBhbiBpT1Mgc2ltdWxhdG9yPworICBib29sIGlzVGFyZ2V0SU9TQmFzZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdm9pZCBBZGRMaW5rUnVudGltZUxpYihjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEYXJ3aW5TdGF0aWNMaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbHdheXNMaW5rID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0VtYmVkZGVkID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyB9CisgIC8vLyBAbmFtZSBUb29sQ2hhaW4gSW1wbGVtZW50YXRpb24KKyAgLy8vIHsKKworICBzdGQ6OnN0cmluZyBDb21wdXRlRWZmZWN0aXZlQ2xhbmdUcmlwbGUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM6OklEIElucHV0VHlwZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdHlwZXM6OklEIExvb2t1cFR5cGVGb3JFeHRlbnNpb24oY29uc3QgY2hhciAqRXh0KSBjb25zdCBvdmVycmlkZTsKKworICBib29sIEhhc05hdGl2ZUxMVk1TdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgbGx2bTo6b3B0OjpEZXJpdmVkQXJnTGlzdCAqCisgIFRyYW5zbGF0ZUFyZ3MoY29uc3QgbGx2bTo6b3B0OjpEZXJpdmVkQXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpCb3VuZEFyY2gpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgSXNCbG9ja3NEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIC8vIEFsd2F5cyBhbGxvdyBibG9ja3Mgb24gQXBwbGU7IHVzZXJzIGludGVyZXN0ZWQgaW4gdmVyc2lvbmluZyBhcmUKKyAgICAvLyBleHBlY3RlZCB0byB1c2UgL3Vzci9pbmNsdWRlL0Jsb2Nrcy5oLgorICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgSXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAvLyBEZWZhdWx0IGludGVncmF0ZWQgYXNzZW1ibGVyIHRvIG9uIGZvciBBcHBsZSdzIE1hY2hPIHRhcmdldHMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIElzTWF0aEVycm5vRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIElzRW5jb2RlRXh0ZW5kZWRCbG9ja1NpZ25hdHVyZURlZmF1bHQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIElzT2JqQ05vbkZyYWdpbGVBQklEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIC8vIE5vbi1mcmFnaWxlIEFCSSBpcyBkZWZhdWx0IGZvciBldmVyeXRoaW5nIGJ1dCBpMzg2LgorICAgIHJldHVybiBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgIT0gbGx2bTo6VHJpcGxlOjp4ODY7CisgIH0KKworICBib29sIFVzZU9iakNNaXhlZERpc3BhdGNoKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBJc1Vud2luZFRhYmxlc0RlZmF1bHQoKSBjb25zdCBvdmVycmlkZTsKKworICBSdW50aW1lTGliVHlwZSBHZXREZWZhdWx0UnVudGltZUxpYlR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFRvb2xDaGFpbjo6UkxUX0NvbXBpbGVyUlQ7CisgIH0KKworICBib29sIGlzUElDRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUElFRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUElDRGVmYXVsdEZvcmNlZCgpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgU3VwcG9ydHNQcm9maWxpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIFN1cHBvcnRzT2JqQ0dDKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgVXNlRHdhcmZEZWJ1Z0ZsYWdzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBVc2VTakxqRXhjZXB0aW9ucygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gfQogfTsKIAogICAvLy8gRGFyd2luIC0gVGhlIGJhc2UgRGFyd2luIHRvb2wgY2hhaW4uCi1jbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBEYXJ3aW4gOiBwdWJsaWMgVG9vbENoYWluIHsKK2NsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIERhcndpbiA6IHB1YmxpYyBNYWNoTyB7CiBwdWJsaWM6CiAgIC8vLyBUaGUgaG9zdCB2ZXJzaW9uLgogICB1bnNpZ25lZCBEYXJ3aW5WZXJzaW9uWzNdOwogCi1wcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgVG9vbCAqYnVpbGRBc3NlbWJsZXIoKSBjb25zdDsKLSAgdmlydHVhbCBUb29sICpidWlsZExpbmtlcigpIGNvbnN0OwotICB2aXJ0dWFsIFRvb2wgKmdldFRvb2woQWN0aW9uOjpBY3Rpb25DbGFzcyBBQykgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gIG11dGFibGUgT3duaW5nUHRyPHRvb2xzOjpkYXJ3aW46OkxpcG8+IExpcG87Ci0gIG11dGFibGUgT3duaW5nUHRyPHRvb2xzOjpkYXJ3aW46OkRzeW11dGlsPiBEc3ltdXRpbDsKLSAgbXV0YWJsZSBPd25pbmdQdHI8dG9vbHM6OmRhcndpbjo6VmVyaWZ5RGVidWc+IFZlcmlmeURlYnVnOwotCiAgIC8vLyBXaGV0aGVyIHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgdGFyZ2V0IGhhcyBiZWVuIGluaXRpYWxpemVkLgogICAvLwogICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZWxpbWluYXRlZC4gV2hhdCB3ZSB3YW50IHRvIGRvIGlzIG1ha2UgdGhpcyBwYXJ0IG9mCkBAIC0yMTAsMTEgKzMyNSwxMyBAQAogICAvLyB0aGUgYXJndW1lbnQgdHJhbnNsYXRpb24gYnVzaW5lc3MuCiAgIG11dGFibGUgYm9vbCBUYXJnZXRJbml0aWFsaXplZDsKIAotICAvLy8gV2hldGhlciB3ZSBhcmUgdGFyZ2V0aW5nIGlQaG9uZU9TIHRhcmdldC4KLSAgbXV0YWJsZSBib29sIFRhcmdldElzSVBob25lT1M7CisgIGVudW0gRGFyd2luUGxhdGZvcm1LaW5kIHsKKyAgICBNYWNPUywKKyAgICBJUGhvbmVPUywKKyAgICBJUGhvbmVPU1NpbXVsYXRvcgorICB9OwogCi0gIC8vLyBXaGV0aGVyIHdlIGFyZSB0YXJnZXRpbmcgdGhlIGlQaG9uZU9TIHNpbXVsYXRvciB0YXJnZXQuCi0gIG11dGFibGUgYm9vbCBUYXJnZXRJc0lQaG9uZU9TU2ltdWxhdG9yOworICBtdXRhYmxlIERhcndpblBsYXRmb3JtS2luZCBUYXJnZXRQbGF0Zm9ybTsKIAogICAvLy8gVGhlIE9TIHZlcnNpb24gd2UgYXJlIHRhcmdldGluZy4KICAgbXV0YWJsZSBWZXJzaW9uVHVwbGUgVGFyZ2V0VmVyc2lvbjsKQEAgLTIzNyw0MyArMzU0LDYyIEBACiAgIH5EYXJ3aW4oKTsKIAogICBzdGQ6OnN0cmluZyBDb21wdXRlRWZmZWN0aXZlQ2xhbmdUcmlwbGUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM6OklEIElucHV0VHlwZSkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlczo6SUQgSW5wdXRUeXBlKSBjb25zdCBvdmVycmlkZTsKIAotICAvLy8gQG5hbWUgRGFyd2luIFNwZWNpZmljIFRvb2xjaGFpbiBBUEkKKyAgLy8vIEBuYW1lIEFwcGxlIFNwZWNpZmljIFRvb2xjaGFpbiBJbXBsZW1lbnRhdGlvbgorICAvLy8geworCisgIHZvaWQKKyAgYWRkTWluVmVyc2lvbkFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQKKyAgYWRkU3RhcnRPYmplY3RGaWxlQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGlzS2VybmVsU3RhdGljKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiAhaXNUYXJnZXRJUGhvbmVPUygpIHx8IGlzSVBob25lT1NWZXJzaW9uTFQoNiwgMCkgfHwKKyAgICAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtNjQ7CisgIH0KKworcHJvdGVjdGVkOgorICAvLy8gfQorICAvLy8gQG5hbWUgRGFyd2luIHNwZWNpZmljIFRvb2xjaGFpbiBmdW5jdGlvbnMKICAgLy8vIHsKIAogICAvLyBGSVhNRTogRWxpbWluYXRlIHRoZXNlIC4uLlRhcmdldCBmdW5jdGlvbnMgYW5kIGRlcml2ZSBzZXBhcmF0ZSB0b29sIGNoYWlucwogICAvLyBmb3IgdGhlc2UgdGFyZ2V0cyBhbmQgcHV0IHZlcnNpb24gaW4gY29uc3RydWN0b3IuCi0gIHZvaWQgc2V0VGFyZ2V0KGJvb2wgSXNJUGhvbmVPUywgdW5zaWduZWQgTWFqb3IsIHVuc2lnbmVkIE1pbm9yLAotICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNaWNybywgYm9vbCBJc0lPU1NpbSkgY29uc3QgewotICAgIGFzc2VydCgoIUlzSU9TU2ltIHx8IElzSVBob25lT1MpICYmICJVbmV4cGVjdGVkIGRlcGxveW1lbnQgdGFyZ2V0ISIpOwotCisgIHZvaWQgc2V0VGFyZ2V0KERhcndpblBsYXRmb3JtS2luZCBQbGF0Zm9ybSwgdW5zaWduZWQgTWFqb3IsIHVuc2lnbmVkIE1pbm9yLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNaWNybykgY29uc3QgewogICAgIC8vIEZJWE1FOiBGb3Igbm93LCBhbGxvdyByZWluaXRpYWxpemF0aW9uIGFzIGxvbmcgYXMgdmFsdWVzIGRvbid0CiAgICAgLy8gY2hhbmdlLiBUaGlzIHdpbGwgZ28gYXdheSB3aGVuIHdlIG1vdmUgYXdheSBmcm9tIGFyZ3VtZW50IHRyYW5zbGF0aW9uLgotICAgIGlmIChUYXJnZXRJbml0aWFsaXplZCAmJiBUYXJnZXRJc0lQaG9uZU9TID09IElzSVBob25lT1MgJiYKLSAgICAgICAgVGFyZ2V0SXNJUGhvbmVPU1NpbXVsYXRvciA9PSBJc0lPU1NpbSAmJgorICAgIGlmIChUYXJnZXRJbml0aWFsaXplZCAmJiBUYXJnZXRQbGF0Zm9ybSA9PSBQbGF0Zm9ybSAmJgogICAgICAgICBUYXJnZXRWZXJzaW9uID09IFZlcnNpb25UdXBsZShNYWpvciwgTWlub3IsIE1pY3JvKSkKICAgICAgIHJldHVybjsKIAogICAgIGFzc2VydCghVGFyZ2V0SW5pdGlhbGl6ZWQgJiYgIlRhcmdldCBhbHJlYWR5IGluaXRpYWxpemVkISIpOwogICAgIFRhcmdldEluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICBUYXJnZXRJc0lQaG9uZU9TID0gSXNJUGhvbmVPUzsKLSAgICBUYXJnZXRJc0lQaG9uZU9TU2ltdWxhdG9yID0gSXNJT1NTaW07CisgICAgVGFyZ2V0UGxhdGZvcm0gPSBQbGF0Zm9ybTsKICAgICBUYXJnZXRWZXJzaW9uID0gVmVyc2lvblR1cGxlKE1ham9yLCBNaW5vciwgTWljcm8pOwogICB9CiAKICAgYm9vbCBpc1RhcmdldElQaG9uZU9TKCkgY29uc3QgewogICAgIGFzc2VydChUYXJnZXRJbml0aWFsaXplZCAmJiAiVGFyZ2V0IG5vdCBpbml0aWFsaXplZCEiKTsKLSAgICByZXR1cm4gVGFyZ2V0SXNJUGhvbmVPUzsKKyAgICByZXR1cm4gVGFyZ2V0UGxhdGZvcm0gPT0gSVBob25lT1M7CiAgIH0KIAogICBib29sIGlzVGFyZ2V0SU9TU2ltdWxhdG9yKCkgY29uc3QgewogICAgIGFzc2VydChUYXJnZXRJbml0aWFsaXplZCAmJiAiVGFyZ2V0IG5vdCBpbml0aWFsaXplZCEiKTsKLSAgICByZXR1cm4gVGFyZ2V0SXNJUGhvbmVPU1NpbXVsYXRvcjsKKyAgICByZXR1cm4gVGFyZ2V0UGxhdGZvcm0gPT0gSVBob25lT1NTaW11bGF0b3I7CisgIH0KKworICBib29sIGlzVGFyZ2V0SU9TQmFzZWQoKSBjb25zdCB7CisgICAgYXNzZXJ0KFRhcmdldEluaXRpYWxpemVkICYmICJUYXJnZXQgbm90IGluaXRpYWxpemVkISIpOworICAgIHJldHVybiBpc1RhcmdldElQaG9uZU9TKCkgfHwgaXNUYXJnZXRJT1NTaW11bGF0b3IoKTsKICAgfQogCiAgIGJvb2wgaXNUYXJnZXRNYWNPUygpIGNvbnN0IHsKLSAgICByZXR1cm4gIWlzVGFyZ2V0SU9TU2ltdWxhdG9yKCkgJiYgIWlzVGFyZ2V0SVBob25lT1MoKTsKKyAgICByZXR1cm4gVGFyZ2V0UGxhdGZvcm0gPT0gTWFjT1M7CiAgIH0KIAogICBib29sIGlzVGFyZ2V0SW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBUYXJnZXRJbml0aWFsaXplZDsgfQpAQCAtMjgzLDEwMSArNDE5LDUzIEBACiAgICAgcmV0dXJuIFRhcmdldFZlcnNpb247CiAgIH0KIAotICAvLy8gZ2V0RGFyd2luQXJjaE5hbWUgLSBHZXQgdGhlICJEYXJ3aW4iIGFyY2ggbmFtZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbXBpbGVyCi0gIC8vLyBpbnZvY2F0aW9uLiBGb3IgZXhhbXBsZSwgRGFyd2luIHRyZWF0cyBkaWZmZXJlbnQgQVJNIHZhcmlhdGlvbnMgYXMKLSAgLy8vIGRpc3RpbmN0IGFyY2hpdGVjdHVyZXMuCi0gIFN0cmluZ1JlZiBnZXREYXJ3aW5BcmNoTmFtZShjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpIGNvbnN0OwotCiAgIGJvb2wgaXNJUGhvbmVPU1ZlcnNpb25MVCh1bnNpZ25lZCBWMCwgdW5zaWduZWQgVjE9MCwgdW5zaWduZWQgVjI9MCkgY29uc3QgewotICAgIGFzc2VydChpc1RhcmdldElQaG9uZU9TKCkgJiYgIlVuZXhwZWN0ZWQgY2FsbCBmb3IgT1MgWCB0YXJnZXQhIik7CisgICAgYXNzZXJ0KGlzVGFyZ2V0SU9TQmFzZWQoKSAmJiAiVW5leHBlY3RlZCBjYWxsIGZvciBub24gaU9TIHRhcmdldCEiKTsKICAgICByZXR1cm4gVGFyZ2V0VmVyc2lvbiA8IFZlcnNpb25UdXBsZShWMCwgVjEsIFYyKTsKICAgfQogCiAgIGJvb2wgaXNNYWNvc3hWZXJzaW9uTFQodW5zaWduZWQgVjAsIHVuc2lnbmVkIFYxPTAsIHVuc2lnbmVkIFYyPTApIGNvbnN0IHsKLSAgICBhc3NlcnQoIWlzVGFyZ2V0SVBob25lT1MoKSAmJiAiVW5leHBlY3RlZCBjYWxsIGZvciBpUGhvbmVPUyB0YXJnZXQhIik7CisgICAgYXNzZXJ0KGlzVGFyZ2V0TWFjT1MoKSAmJiAiVW5leHBlY3RlZCBjYWxsIGZvciBub24gT1MgWCB0YXJnZXQhIik7CiAgICAgcmV0dXJuIFRhcmdldFZlcnNpb24gPCBWZXJzaW9uVHVwbGUoVjAsIFYxLCBWMik7CiAgIH0KIAotICAvLy8gQWRkTGlua0FSQ0FyZ3MgLSBBZGQgdGhlIGxpbmtlciBhcmd1bWVudHMgdG8gbGluayB0aGUgQVJDIHJ1bnRpbWUgbGlicmFyeS4KLSAgdmlydHVhbCB2b2lkIEFkZExpbmtBUkNBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3QgPSAwOwotCi0gIC8vLyBBZGRMaW5rUnVudGltZUxpYkFyZ3MgLSBBZGQgdGhlIGxpbmtlciBhcmd1bWVudHMgdG8gbGluayB0aGUgY29tcGlsZXIKLSAgLy8vIHJ1bnRpbWUgbGlicmFyeS4KLSAgdmlydHVhbCB2b2lkCi0gIEFkZExpbmtSdW50aW1lTGliQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0ID0gMDsKLQorcHVibGljOgogICAvLy8gfQogICAvLy8gQG5hbWUgVG9vbENoYWluIEltcGxlbWVudGF0aW9uCiAgIC8vLyB7CiAKLSAgdmlydHVhbCB0eXBlczo6SUQgTG9va3VwVHlwZUZvckV4dGVuc2lvbihjb25zdCBjaGFyICpFeHQpIGNvbnN0OwotCi0gIHZpcnR1YWwgYm9vbCBIYXNOYXRpdmVMTFZNU3VwcG9ydCgpIGNvbnN0OwotCi0gIHZpcnR1YWwgT2JqQ1J1bnRpbWUgZ2V0RGVmYXVsdE9iakNSdW50aW1lKGJvb2wgaXNOb25GcmFnaWxlKSBjb25zdDsKLSAgdmlydHVhbCBib29sIGhhc0Jsb2Nrc1J1bnRpbWUoKSBjb25zdDsKLQotICB2aXJ0dWFsIGxsdm06Om9wdDo6RGVyaXZlZEFyZ0xpc3QgKgorICBsbHZtOjpvcHQ6OkRlcml2ZWRBcmdMaXN0ICoKICAgVHJhbnNsYXRlQXJncyhjb25zdCBsbHZtOjpvcHQ6OkRlcml2ZWRBcmdMaXN0ICZBcmdzLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJvdW5kQXJjaCkgY29uc3Q7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQm91bmRBcmNoKSBjb25zdCBvdmVycmlkZTsKIAotICB2aXJ0dWFsIGJvb2wgSXNCbG9ja3NEZWZhdWx0KCkgY29uc3QgewotICAgIC8vIEFsd2F5cyBhbGxvdyBibG9ja3Mgb24gRGFyd2luOyB1c2VycyBpbnRlcmVzdGVkIGluIHZlcnNpb25pbmcgYXJlCi0gICAgLy8gZXhwZWN0ZWQgdG8gdXNlIC91c3IvaW5jbHVkZS9CbG9ja3MuaC4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB2aXJ0dWFsIGJvb2wgSXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCgpIGNvbnN0IHsKLSAgICAvLyBEZWZhdWx0IGludGVncmF0ZWQgYXNzZW1ibGVyIHRvIG9uIGZvciBEYXJ3aW4uCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KKyAgT2JqQ1J1bnRpbWUgZ2V0RGVmYXVsdE9iakNSdW50aW1lKGJvb2wgaXNOb25GcmFnaWxlKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNCbG9ja3NSdW50aW1lKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBib29sIElzTWF0aEVycm5vRGVmYXVsdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgSXNFbmNvZGVFeHRlbmRlZEJsb2NrU2lnbmF0dXJlRGVmYXVsdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgdmlydHVhbCBib29sIElzT2JqQ05vbkZyYWdpbGVBQklEZWZhdWx0KCkgY29uc3QgewotICAgIC8vIE5vbi1mcmFnaWxlIEFCSSBpcyBkZWZhdWx0IGZvciBldmVyeXRoaW5nIGJ1dCBpMzg2LgotICAgIHJldHVybiBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgIT0gbGx2bTo6VHJpcGxlOjp4ODY7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgVXNlT2JqQ01peGVkRGlzcGF0Y2goKSBjb25zdCB7CisgIGJvb2wgVXNlT2JqQ01peGVkRGlzcGF0Y2goKSBjb25zdCBvdmVycmlkZSB7CiAgICAgLy8gVGhpcyBpcyBvbmx5IHVzZWQgd2l0aCB0aGUgbm9uLWZyYWdpbGUgQUJJIGFuZCBub24tbGVnYWN5IGRpc3BhdGNoLgogCiAgICAgLy8gTWl4ZWQgZGlzcGF0Y2ggaXMgdXNlZCBldmVyeXdoZXJlIGV4Y2VwdCBPUyBYIGJlZm9yZSAxMC42LgotICAgIHJldHVybiAhKCFpc1RhcmdldElQaG9uZU9TKCkgJiYgaXNNYWNvc3hWZXJzaW9uTFQoMTAsIDYpKTsKKyAgICByZXR1cm4gIShpc1RhcmdldE1hY09TKCkgJiYgaXNNYWNvc3hWZXJzaW9uTFQoMTAsIDYpKTsKICAgfQotICB2aXJ0dWFsIGJvb2wgSXNVbndpbmRUYWJsZXNEZWZhdWx0KCkgY29uc3Q7Ci0gIHZpcnR1YWwgdW5zaWduZWQgR2V0RGVmYXVsdFN0YWNrUHJvdGVjdG9yTGV2ZWwoYm9vbCBLZXJuZWxPcktleHQpIGNvbnN0IHsKKworICB1bnNpZ25lZCBHZXREZWZhdWx0U3RhY2tQcm90ZWN0b3JMZXZlbChib29sIEtlcm5lbE9yS2V4dCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIC8vIFN0YWNrIHByb3RlY3RvcnMgZGVmYXVsdCB0byBvbiBmb3IgdXNlciBjb2RlIG9uIDEwLjUsCiAgICAgLy8gYW5kIGZvciBldmVyeXRoaW5nIGluIDEwLjYgYW5kIGJleW9uZAotICAgIHJldHVybiBpc1RhcmdldElQaG9uZU9TKCkgfHwKLSAgICAgICghaXNNYWNvc3hWZXJzaW9uTFQoMTAsIDYpIHx8Ci0gICAgICAgICAoIWlzTWFjb3N4VmVyc2lvbkxUKDEwLCA1KSAmJiAhS2VybmVsT3JLZXh0KSk7CisgICAgaWYgKGlzVGFyZ2V0SU9TQmFzZWQoKSkKKyAgICAgIHJldHVybiAxOworICAgIGVsc2UgaWYgKGlzVGFyZ2V0TWFjT1MoKSAmJiAhaXNNYWNvc3hWZXJzaW9uTFQoMTAsIDYpKQorICAgICAgcmV0dXJuIDE7CisgICAgZWxzZSBpZiAoaXNUYXJnZXRNYWNPUygpICYmICFpc01hY29zeFZlcnNpb25MVCgxMCwgNSkgJiYgIUtlcm5lbE9yS2V4dCkKKyAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIDA7CiAgIH0KLSAgdmlydHVhbCBSdW50aW1lTGliVHlwZSBHZXREZWZhdWx0UnVudGltZUxpYlR5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIFRvb2xDaGFpbjo6UkxUX0NvbXBpbGVyUlQ7Ci0gIH0KLSAgdmlydHVhbCBib29sIGlzUElDRGVmYXVsdCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgaXNQSUVEZWZhdWx0KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBpc1BJQ0RlZmF1bHRGb3JjZWQoKSBjb25zdDsKIAotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNQcm9maWxpbmcoKSBjb25zdDsKKyAgYm9vbCBTdXBwb3J0c09iakNHQygpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c09iakNHQygpIGNvbnN0OworICB2b2lkIENoZWNrT2JqQ0FSQygpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBDaGVja09iakNBUkMoKSBjb25zdDsKLQotICB2aXJ0dWFsIGJvb2wgVXNlRHdhcmZEZWJ1Z0ZsYWdzKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBib29sIFVzZVNqTGpFeGNlcHRpb25zKCkgY29uc3Q7Ci0KLSAgLy8vIH0KKyAgYm9vbCBVc2VTakxqRXhjZXB0aW9ucygpIGNvbnN0IG92ZXJyaWRlOwogfTsKIAogLy8vIERhcndpbkNsYW5nIC0gVGhlIERhcndpbiB0b29sY2hhaW4gdXNlZCBieSBDbGFuZy4KQEAgLTM4Niw0MCArNDc0LDI5IEBACiAgIERhcndpbkNsYW5nKGNvbnN0IERyaXZlciAmRCwgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCiAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CiAKLSAgLy8vIEBuYW1lIERhcndpbiBUb29sQ2hhaW4gSW1wbGVtZW50YXRpb24KKyAgLy8vIEBuYW1lIEFwcGxlIFRvb2xDaGFpbiBJbXBsZW1lbnRhdGlvbgogICAvLy8gewogCi0gIHZpcnR1YWwgdm9pZCBBZGRMaW5rUnVudGltZUxpYkFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3Q7Ci0gIHZvaWQgQWRkTGlua1J1bnRpbWVMaWIoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpEYXJ3aW5TdGF0aWNMaWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbHdheXNMaW5rID0gZmFsc2UpIGNvbnN0OworICB2b2lkCisgIEFkZExpbmtSdW50aW1lTGliQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBBZGRDWFhTdGRsaWJMaWJBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdDsKKyAgdm9pZAorICBBZGRDWFhTdGRsaWJMaWJBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBBZGRDQ0tleHRMaWJBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdDsKKyAgdm9pZAorICBBZGRDQ0tleHRMaWJBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBBZGRMaW5rQVJDQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgYWRkQ2xhbmdXYXJuaW5nT3B0aW9ucyhsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0OworCisgIHZvaWQKKyAgQWRkTGlua0FSQ0FyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IG92ZXJyaWRlOwogICAvLy8gfQogfTsKIAotLy8vIERhcndpbl9HZW5lcmljX0dDQyAtIEdlbmVyaWMgRGFyd2luIHRvb2wgY2hhaW4gdXNpbmcgZ2NjLgotY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgRGFyd2luX0dlbmVyaWNfR0NDIDogcHVibGljIEdlbmVyaWNfR0NDIHsKLXB1YmxpYzoKLSAgRGFyd2luX0dlbmVyaWNfR0NDKGNvbnN0IERyaXZlciAmRCwgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpCi0gICAgICA6IEdlbmVyaWNfR0NDKEQsIFRyaXBsZSwgQXJncykge30KLQotICBzdGQ6OnN0cmluZyBDb21wdXRlRWZmZWN0aXZlQ2xhbmdUcmlwbGUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM6OklEIElucHV0VHlwZSkgY29uc3Q7Ci0KLSAgdmlydHVhbCBib29sIGlzUElDRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci19OwotCiBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBHZW5lcmljX0VMRiA6IHB1YmxpYyBHZW5lcmljX0dDQyB7CiAgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKIHB1YmxpYzoKQEAgLTQyNywxMiArNTA0LDggQEAKICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKQogICAgICAgOiBHZW5lcmljX0dDQyhELCBUcmlwbGUsIEFyZ3MpIHt9CiAKLSAgdmlydHVhbCBib29sIElzSW50ZWdyYXRlZEFzc2VtYmxlckRlZmF1bHQoKSBjb25zdCB7Ci0gICAgLy8gRGVmYXVsdCBpbnRlZ3JhdGVkIGFzc2VtYmxlciB0byBvbiBmb3IgeDg2LgotICAgIHJldHVybiAoZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NCB8fAotICAgICAgICAgICAgZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2IHx8Ci0gICAgICAgICAgICBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQpOwotICB9CisgIHZvaWQgYWRkQ2xhbmdUYXJnZXRPcHRpb25zKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmRHJpdmVyQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIEF1cm9yYVVYIDogcHVibGljIEdlbmVyaWNfR0NDIHsKQEAgLTQ0MSw4ICs1MTQsOCBAQAogICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpOwogCiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgVG9vbCAqYnVpbGRBc3NlbWJsZXIoKSBjb25zdDsKLSAgdmlydHVhbCBUb29sICpidWlsZExpbmtlcigpIGNvbnN0OworICBUb29sICpidWlsZEFzc2VtYmxlcigpIGNvbnN0IG92ZXJyaWRlOworICBUb29sICpidWlsZExpbmtlcigpIGNvbnN0IG92ZXJyaWRlOwogfTsKIAogY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgU29sYXJpcyA6IHB1YmxpYyBHZW5lcmljX0dDQyB7CkBAIC00NTAsMTAgKzUyMywxMCBAQAogICBTb2xhcmlzKGNvbnN0IERyaXZlciAmRCwgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCiAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKTsKIAotICB2aXJ0dWFsIGJvb2wgSXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBJc0ludGVncmF0ZWRBc3NlbWJsZXJEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogcHJvdGVjdGVkOgotICB2aXJ0dWFsIFRvb2wgKmJ1aWxkQXNzZW1ibGVyKCkgY29uc3Q7Ci0gIHZpcnR1YWwgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdDsKKyAgVG9vbCAqYnVpbGRBc3NlbWJsZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdCBvdmVycmlkZTsKIAogfTsKIApAQCAtNDYzLDE3ICs1MzYsMTcgQEAKICAgT3BlbkJTRChjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAogICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CiAKLSAgdmlydHVhbCBib29sIElzTWF0aEVycm5vRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBJc09iakNOb25GcmFnaWxlQUJJRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgdmlydHVhbCBib29sIGlzUElFRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBJc01hdGhFcnJub0RlZmF1bHQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICBib29sIElzT2JqQ05vbkZyYWdpbGVBQklEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIGlzUElFRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICB2aXJ0dWFsIHVuc2lnbmVkIEdldERlZmF1bHRTdGFja1Byb3RlY3RvckxldmVsKGJvb2wgS2VybmVsT3JLZXh0KSBjb25zdCB7CisgIHVuc2lnbmVkIEdldERlZmF1bHRTdGFja1Byb3RlY3RvckxldmVsKGJvb2wgS2VybmVsT3JLZXh0KSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIDE7CiAgIH0KIAogcHJvdGVjdGVkOgotICB2aXJ0dWFsIFRvb2wgKmJ1aWxkQXNzZW1ibGVyKCkgY29uc3Q7Ci0gIHZpcnR1YWwgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdDsKKyAgVG9vbCAqYnVpbGRBc3NlbWJsZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIEJpdHJpZyA6IHB1YmxpYyBHZW5lcmljX0VMRiB7CkBAIC00ODEsNDMgKzU1NCw0OCBAQAogICBCaXRyaWcoY29uc3QgRHJpdmVyICZELCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CiAKLSAgdmlydHVhbCBib29sIElzTWF0aEVycm5vRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBJc09iakNOb25GcmFnaWxlQUJJRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgdmlydHVhbCBib29sIElzT2JqQ0xlZ2FjeURpc3BhdGNoRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgSXNNYXRoRXJybm9EZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgYm9vbCBJc09iakNOb25GcmFnaWxlQUJJRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICB2aXJ0dWFsIHZvaWQKKyAgdm9pZAogICBBZGRDbGFuZ0NYWFN0ZGxpYkluY2x1ZGVBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmRHJpdmVyQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgQWRkQ1hYU3RkbGliTGliQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3Q7Ci0gIHZpcnR1YWwgdW5zaWduZWQgR2V0RGVmYXVsdFN0YWNrUHJvdGVjdG9yTGV2ZWwoYm9vbCBLZXJuZWxPcktleHQpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgQWRkQ1hYU3RkbGliTGliQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IG92ZXJyaWRlOworICB1bnNpZ25lZCBHZXREZWZhdWx0U3RhY2tQcm90ZWN0b3JMZXZlbChib29sIEtlcm5lbE9yS2V4dCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICByZXR1cm4gMTsKICAgfQogCiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgVG9vbCAqYnVpbGRBc3NlbWJsZXIoKSBjb25zdDsKLSAgdmlydHVhbCBUb29sICpidWlsZExpbmtlcigpIGNvbnN0OworICBUb29sICpidWlsZEFzc2VtYmxlcigpIGNvbnN0IG92ZXJyaWRlOworICBUb29sICpidWlsZExpbmtlcigpIGNvbnN0IG92ZXJyaWRlOwogfTsKIAogY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgRnJlZUJTRCA6IHB1YmxpYyBHZW5lcmljX0VMRiB7CiBwdWJsaWM6CiAgIEZyZWVCU0QoY29uc3QgRHJpdmVyICZELCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpOwotICB2aXJ0dWFsIGJvb2wgSGFzTmF0aXZlTExWTVN1cHBvcnQoKSBjb25zdDsKKyAgYm9vbCBIYXNOYXRpdmVMTFZNU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgYm9vbCBJc01hdGhFcnJub0RlZmF1bHQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgSXNPYmpDTm9uRnJhZ2lsZUFCSURlZmF1bHQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgSXNNYXRoRXJybm9EZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgYm9vbCBJc09iakNOb25GcmFnaWxlQUJJRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICB2aXJ0dWFsIENYWFN0ZGxpYlR5cGUgR2V0Q1hYU3RkbGliVHlwZShjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQKKyAgQ1hYU3RkbGliVHlwZSBHZXRDWFhTdGRsaWJUeXBlKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQKICAgQWRkQ2xhbmdDWFhTdGRsaWJJbmNsdWRlQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0IG92ZXJyaWRlOworICBib29sIElzSW50ZWdyYXRlZEFzc2VtYmxlckRlZmF1bHQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKGdldFRyaXBsZSgpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnBwYyB8fAorICAgICAgICBnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpwcGM2NCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBHZW5lcmljX0VMRjo6SXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCgpOworICB9CiAKLQotICB2aXJ0dWFsIGJvb2wgVXNlU2pMakV4Y2VwdGlvbnMoKSBjb25zdDsKKyAgYm9vbCBVc2VTakxqRXhjZXB0aW9ucygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUElFRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlOwogcHJvdGVjdGVkOgotICB2aXJ0dWFsIFRvb2wgKmJ1aWxkQXNzZW1ibGVyKCkgY29uc3Q7Ci0gIHZpcnR1YWwgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdDsKKyAgVG9vbCAqYnVpbGRBc3NlbWJsZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdCBvdmVycmlkZTsKIH07CiAKIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIE5ldEJTRCA6IHB1YmxpYyBHZW5lcmljX0VMRiB7CkBAIC01MjUsMjYgKzYwMywyNiBAQAogICBOZXRCU0QoY29uc3QgRHJpdmVyICZELCBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CiAKLSAgdmlydHVhbCBib29sIElzTWF0aEVycm5vRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBJc09iakNOb25GcmFnaWxlQUJJRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBJc01hdGhFcnJub0RlZmF1bHQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICBib29sIElzT2JqQ05vbkZyYWdpbGVBQklEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCi0gIHZpcnR1YWwgQ1hYU3RkbGliVHlwZSBHZXRDWFhTdGRsaWJUeXBlKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncykgY29uc3Q7CisgIENYWFN0ZGxpYlR5cGUgR2V0Q1hYU3RkbGliVHlwZShjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZAorICB2b2lkCiAgIEFkZENsYW5nQ1hYU3RkbGliSW5jbHVkZUFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZEcml2ZXJBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncykgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBJc1Vud2luZFRhYmxlc0RlZmF1bHQoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0IG92ZXJyaWRlOworICBib29sIElzVW53aW5kVGFibGVzRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQotICB2aXJ0dWFsIGJvb2wgSXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCgpIGNvbnN0IHsKKyAgYm9vbCBJc0ludGVncmF0ZWRBc3NlbWJsZXJEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIGlmIChnZXRUcmlwbGUoKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpwcGMpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICByZXR1cm4gR2VuZXJpY19FTEY6OklzSW50ZWdyYXRlZEFzc2VtYmxlckRlZmF1bHQoKTsKICAgfQogCiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgVG9vbCAqYnVpbGRBc3NlbWJsZXIoKSBjb25zdDsKLSAgdmlydHVhbCBUb29sICpidWlsZExpbmtlcigpIGNvbnN0OworICBUb29sICpidWlsZEFzc2VtYmxlcigpIGNvbnN0IG92ZXJyaWRlOworICBUb29sICpidWlsZExpbmtlcigpIGNvbnN0IG92ZXJyaWRlOwogfTsKIAogY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgTWluaXggOiBwdWJsaWMgR2VuZXJpY19FTEYgewpAQCAtNTUzLDggKzYzMSw4IEBACiAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBUb29sICpidWlsZEFzc2VtYmxlcigpIGNvbnN0OwotICB2aXJ0dWFsIFRvb2wgKmJ1aWxkTGlua2VyKCkgY29uc3Q7CisgIFRvb2wgKmJ1aWxkQXNzZW1ibGVyKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFRvb2wgKmJ1aWxkTGlua2VyKCkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBEcmFnb25GbHkgOiBwdWJsaWMgR2VuZXJpY19FTEYgewpAQCAtNTYyLDExICs2NDAsMTEgQEAKICAgRHJhZ29uRmx5KGNvbnN0IERyaXZlciAmRCwgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCiAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpOwogCi0gIHZpcnR1YWwgYm9vbCBJc01hdGhFcnJub0RlZmF1bHQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBib29sIElzTWF0aEVycm5vRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBUb29sICpidWlsZEFzc2VtYmxlcigpIGNvbnN0OwotICB2aXJ0dWFsIFRvb2wgKmJ1aWxkTGlua2VyKCkgY29uc3Q7CisgIFRvb2wgKmJ1aWxkQXNzZW1ibGVyKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFRvb2wgKmJ1aWxkTGlua2VyKCkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBMaW51eCA6IHB1YmxpYyBHZW5lcmljX0VMRiB7CkBAIC01NzQsMzAgKzY1MiwyNiBAQAogICBMaW51eChjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAogICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MpOwogCi0gIHZpcnR1YWwgYm9vbCBIYXNOYXRpdmVMTFZNU3VwcG9ydCgpIGNvbnN0OworICBib29sIEhhc05hdGl2ZUxMVk1TdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkCisgIHZvaWQKICAgQWRkQ2xhbmdTeXN0ZW1JbmNsdWRlQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIGFkZENsYW5nVGFyZ2V0T3B0aW9ucyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZAogICBBZGRDbGFuZ0NYWFN0ZGxpYkluY2x1ZGVBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmRHJpdmVyQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgaXNQSUVEZWZhdWx0KCkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1BJRURlZmF1bHQoKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGQ6OnN0cmluZyBMaW5rZXI7CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBFeHRyYU9wdHM7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBUb29sICpidWlsZEFzc2VtYmxlcigpIGNvbnN0OwotICB2aXJ0dWFsIFRvb2wgKmJ1aWxkTGlua2VyKCkgY29uc3Q7CisgIFRvb2wgKmJ1aWxkQXNzZW1ibGVyKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFRvb2wgKmJ1aWxkTGlua2VyKCkgY29uc3Qgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgIHN0YXRpYyBib29sIGFkZExpYlN0ZENYWEluY2x1ZGVQYXRocyhUd2luZSBCYXNlLCBUd2luZSBTdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2luZSBUYXJnZXRBcmNoRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUgQmlhcmNoU3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUgTUlQU0FCSURpclN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lIFRhcmdldEFyY2hEaXIsIFR3aW5lIEluY2x1ZGVTdWZmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpOwogICBzdGF0aWMgYm9vbCBhZGRMaWJTdGRDWFhJbmNsdWRlUGF0aHMoVHdpbmUgQmFzZSwgVHdpbmUgVGFyZ2V0QXJjaERpciwKQEAgLTYxMCwyMSArNjg0LDIxIEBACiBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBIZXhhZ29uX1RDIDogcHVibGljIExpbnV4IHsKIHByb3RlY3RlZDoKICAgR0NDVmVyc2lvbiBHQ0NMaWJBbmRJbmNWZXJzaW9uOwotICB2aXJ0dWFsIFRvb2wgKmJ1aWxkQXNzZW1ibGVyKCkgY29uc3Q7Ci0gIHZpcnR1YWwgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdDsKKyAgVG9vbCAqYnVpbGRBc3NlbWJsZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdCBvdmVycmlkZTsKIAogcHVibGljOgogICBIZXhhZ29uX1RDKGNvbnN0IERyaXZlciAmRCwgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCiAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKTsKICAgfkhleGFnb25fVEMoKTsKIAotICB2aXJ0dWFsIHZvaWQKKyAgdm9pZAogICBBZGRDbGFuZ1N5c3RlbUluY2x1ZGVBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmRHJpdmVyQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkCiAgIEFkZENsYW5nQ1hYU3RkbGliSW5jbHVkZUFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZEcml2ZXJBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncykgY29uc3Q7Ci0gIHZpcnR1YWwgQ1hYU3RkbGliVHlwZSBHZXRDWFhTdGRsaWJUeXBlKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncykgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0IG92ZXJyaWRlOworICBDWFhTdGRsaWJUeXBlIEdldENYWFN0ZGxpYlR5cGUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKSBjb25zdCBvdmVycmlkZTsKIAogICBTdHJpbmdSZWYgR2V0R0NDTGliQW5kSW5jVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIEdDQ0xpYkFuZEluY1ZlcnNpb24uVGV4dDsgfQogCkBAIC02NDEsMTAgKzcxNSwxMCBAQAogICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKTsKICAgflRDRVRvb2xDaGFpbigpOwogCi0gIGJvb2wgSXNNYXRoRXJybm9EZWZhdWx0KCkgY29uc3Q7Ci0gIGJvb2wgaXNQSUNEZWZhdWx0KCkgY29uc3Q7Ci0gIGJvb2wgaXNQSUVEZWZhdWx0KCkgY29uc3Q7Ci0gIGJvb2wgaXNQSUNEZWZhdWx0Rm9yY2VkKCkgY29uc3Q7CisgIGJvb2wgSXNNYXRoRXJybm9EZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQSUNEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQSUVEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQSUNEZWZhdWx0Rm9yY2VkKCkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBXaW5kb3dzIDogcHVibGljIFRvb2xDaGFpbiB7CkBAIC02NTIsMjIgKzcyNiwyMiBAQAogICBXaW5kb3dzKGNvbnN0IERyaXZlciAmRCwgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsCiAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzKTsKIAotICB2aXJ0dWFsIGJvb2wgSXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgSXNVbndpbmRUYWJsZXNEZWZhdWx0KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBpc1BJQ0RlZmF1bHQoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIGlzUElFRGVmYXVsdCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgaXNQSUNEZWZhdWx0Rm9yY2VkKCkgY29uc3Q7CisgIGJvb2wgSXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIElzVW53aW5kVGFibGVzRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUElDRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUElFRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUElDRGVmYXVsdEZvcmNlZCgpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZAorICB2b2lkCiAgIEFkZENsYW5nU3lzdGVtSW5jbHVkZUFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZEcml2ZXJBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncykgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQKICAgQWRkQ2xhbmdDWFhTdGRsaWJJbmNsdWRlQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0IG92ZXJyaWRlOwogCiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgVG9vbCAqYnVpbGRMaW5rZXIoKSBjb25zdDsKLSAgdmlydHVhbCBUb29sICpidWlsZEFzc2VtYmxlcigpIGNvbnN0OworICBUb29sICpidWlsZExpbmtlcigpIGNvbnN0IG92ZXJyaWRlOworICBUb29sICpidWlsZEFzc2VtYmxlcigpIGNvbnN0IG92ZXJyaWRlOwogfTsKIAogCkBAIC02NzYsMjIgKzc1MCwyMiBAQAogICBYQ29yZShjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAogICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncyk7CiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgVG9vbCAqYnVpbGRBc3NlbWJsZXIoKSBjb25zdDsKLSAgdmlydHVhbCBUb29sICpidWlsZExpbmtlcigpIGNvbnN0OworICBUb29sICpidWlsZEFzc2VtYmxlcigpIGNvbnN0IG92ZXJyaWRlOworICBUb29sICpidWlsZExpbmtlcigpIGNvbnN0IG92ZXJyaWRlOwogcHVibGljOgotICB2aXJ0dWFsIGJvb2wgaXNQSUNEZWZhdWx0KCkgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCBpc1BJRURlZmF1bHQoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIGlzUElDRGVmYXVsdEZvcmNlZCgpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNQcm9maWxpbmcoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIGhhc0Jsb2Nrc1J1bnRpbWUoKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIEFkZENsYW5nU3lzdGVtSW5jbHVkZUFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZEcml2ZXJBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncykgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBhZGRDbGFuZ1RhcmdldE9wdGlvbnMoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZEcml2ZXJBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncykgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBBZGRDbGFuZ0NYWFN0ZGxpYkluY2x1ZGVBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmRHJpdmVyQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNDMUFyZ3MpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgQWRkQ1hYU3RkbGliTGliQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3Q7CisgIGJvb2wgaXNQSUNEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQSUVEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQSUNEZWZhdWx0Rm9yY2VkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgU3VwcG9ydHNQcm9maWxpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNCbG9ja3NSdW50aW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgQWRkQ2xhbmdTeXN0ZW1JbmNsdWRlQXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkRyaXZlckFyZ3MsCisgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ0MxQXJncykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgYWRkQ2xhbmdUYXJnZXRPcHRpb25zKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmRHJpdmVyQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBBZGRDbGFuZ0NYWFN0ZGxpYkluY2x1ZGVBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmRHJpdmVyQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDQzFBcmdzKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBBZGRDWFhTdGRsaWJMaWJBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiB9IC8vIGVuZCBuYW1lc3BhY2UgdG9vbGNoYWlucwpkaWZmIC0tZ2l0IGEvbGliL0RyaXZlci9Ub29scy5jcHAgYi9saWIvRHJpdmVyL1Rvb2xzLmNwcAppbmRleCAyOTcxM2VkLi42YWNjM2Q1IDEwMDY0NAotLS0gYS9saWIvRHJpdmVyL1Rvb2xzLmNwcAorKysgYi9saWIvRHJpdmVyL1Rvb2xzLmNwcApAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgIlRvb2xzLmgiCiAjaW5jbHVkZSAiSW5wdXRJbmZvLmgiCiAjaW5jbHVkZSAiVG9vbENoYWlucy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT2JqQ1J1bnRpbWUuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9WZXJzaW9uLmgiCiAjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL0FjdGlvbi5oIgpAQCAtMjEsNyArMjIsNiBAQAogI2luY2x1ZGUgImNsYW5nL0RyaXZlci9TYW5pdGl6ZXJBcmdzLmgiCiAjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL1Rvb2xDaGFpbi5oIgogI2luY2x1ZGUgImNsYW5nL0RyaXZlci9VdGlsLmgiCi0jaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hRGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgiCkBAIC0yOSwxMyArMjksMTQgQEAKICNpbmNsdWRlICJsbHZtL09wdGlvbi9BcmcuaCIKICNpbmNsdWRlICJsbHZtL09wdGlvbi9BcmdMaXN0LmgiCiAjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXByZXNzaW9uLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSG9zdC5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Byb2dyYW0uaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJvY2Vzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qcm9ncmFtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIApAQCAtNDQsNiArNDUsMjEgQEAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpvcHQ7CiAKK3N0YXRpYyB2b2lkIGFkZEFzc2VtYmxlcktQSUMoY29uc3QgQXJnTGlzdCAmQXJncywgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgeworICBBcmcgKkxhc3RQSUNBcmcgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2ZQSUMsIG9wdGlvbnM6Ok9QVF9mbm9fUElDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2ZwaWMsIG9wdGlvbnM6Ok9QVF9mbm9fcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2ZQSUUsIG9wdGlvbnM6Ok9QVF9mbm9fUElFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2ZwaWUsIG9wdGlvbnM6Ok9QVF9mbm9fcGllKTsKKyAgaWYgKCFMYXN0UElDQXJnKQorICAgIHJldHVybjsKKyAgaWYgKExhc3RQSUNBcmctPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2ZQSUMpIHx8CisgICAgICBMYXN0UElDQXJnLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9mcGljKSB8fAorICAgICAgTGFzdFBJQ0FyZy0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZlBJRSkgfHwKKyAgICAgIExhc3RQSUNBcmctPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2ZwaWUpKSB7CisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1LUElDIik7CisgIH0KK30KKwogLy8vIENoZWNrUHJlcHJvY2Vzc2luZ09wdGlvbnMgLSBQZXJmb3JtIHNvbWUgdmFsaWRhdGlvbiBvZiBwcmVwcm9jZXNzaW5nCiAvLy8gYXJndW1lbnRzIHRoYXQgaXMgc2hhcmVkIHdpdGggZ2NjLgogc3RhdGljIHZvaWQgQ2hlY2tQcmVwcm9jZXNzaW5nT3B0aW9ucyhjb25zdCBEcml2ZXIgJkQsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MpIHsKQEAgLTE5MCw3ICsyMDYsOSBAQAogICB9CiAKICAgLy8gTElCUkFSWV9QQVRIIC0gaW5jbHVkZWQgZm9sbG93aW5nIHRoZSB1c2VyIHNwZWNpZmllZCBsaWJyYXJ5IHBhdGhzLgotICBhZGREaXJlY3RvcnlMaXN0KEFyZ3MsIENtZEFyZ3MsICItTCIsICJMSUJSQVJZX1BBVEgiKTsKKyAgLy8gICAgICAgICAgICAgICAgYW5kIG9ubHkgc3VwcG9ydGVkIG9uIG5hdGl2ZSB0b29sY2hhaW5zLgorICBpZiAoIVRDLmlzQ3Jvc3NDb21waWxpbmcoKSkKKyAgICBhZGREaXJlY3RvcnlMaXN0KEFyZ3MsIENtZEFyZ3MsICItTCIsICJMSUJSQVJZX1BBVEgiKTsKIH0KIAogLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBPYmplY3RpdmUtQyBhdXRvbWF0ZWQgcmVmZXJlbmNlIGNvdW50aW5nIGlzCkBAIC0yMDgsMjUgKzIyNiw2IEBACiAgIHJldHVybiBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZm9iamNfbGlua19ydW50aW1lKTsKIH0KIAotc3RhdGljIHZvaWQgYWRkUHJvZmlsZVJUKGNvbnN0IFRvb2xDaGFpbiAmVEMsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpUcmlwbGUgVHJpcGxlKSB7Ci0gIGlmICghKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mcHJvZmlsZV9hcmNzKSB8fAotICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZnByb2ZpbGVfZ2VuZXJhdGUpIHx8Ci0gICAgICAgIEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mY3JlYXRlX3Byb2ZpbGUpIHx8Ci0gICAgICAgIEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9jb3ZlcmFnZSkpKQotICAgIHJldHVybjsKLQotICAvLyBHQ0MgbGlua3MgbGliZ2Nvdi5hIGJ5IGFkZGluZyAtTDxpbnN0Pi9nY2MvbGliL2djYy88dHJpcGxlPi88dmVyPiAtbGdjb3YgdG8KLSAgLy8gdGhlIGxpbmsgbGluZS4gV2UgY2Fubm90IGRvIHRoZSBzYW1lIHRoaW5nIGJlY2F1c2UgdW5saWtlIGdjb3YgdGhlcmUgaXMgYQotICAvLyBsaWJwcm9maWxlX3J0LnNvLiBXZSB1c2VkIHRvIHVzZSB0aGUgLWw6bGlicHJvZmlsZV9ydC5hIHN5bnRheCwgYnV0IHRoYXQgaXMKLSAgLy8gbm90IHN1cHBvcnRlZCBieSBvbGQgbGlua2Vycy4KLSAgc3RkOjpzdHJpbmcgUHJvZmlsZVJUID0KLSAgICBzdGQ6OnN0cmluZyhUQy5nZXREcml2ZXIoKS5EaXIpICsgIi8uLi9saWIvbGlicHJvZmlsZV9ydC5hIjsKLQotICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoUHJvZmlsZVJUKSk7Ci19Ci0KIHN0YXRpYyBib29sIGZvcndhcmRUb0dDQyhjb25zdCBPcHRpb24gJk8pIHsKICAgLy8gRG9uJ3QgZm9yd2FyZCBpbnB1dHMgZnJvbSB0aGUgb3JpZ2luYWwgY29tbWFuZCBsaW5lLiAgVGhleSBhcmUgYWRkZWQgZnJvbQogICAvLyBJbnB1dEluZm9MaXN0LgpAQCAtMjk3LDYgKzI5Niw5IEBACiAgICAgaWYgKEEtPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX00pIHx8CiAgICAgICAgIEEtPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX01EKSkKICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItc3lzLWhlYWRlci1kZXBzIik7CisKKyAgICBpZiAoaXNhPFByZWNvbXBpbGVKb2JBY3Rpb24+KEpBKSkKKyAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbW9kdWxlLWZpbGUtZGVwcyIpOwogICB9CiAKICAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9NRykpIHsKQEAgLTQ0MiwxMDkgKzQ0NCw2IEBACiAgIGdldFRvb2xDaGFpbigpLkFkZENsYW5nU3lzdGVtSW5jbHVkZUFyZ3MoQXJncywgQ21kQXJncyk7CiB9CiAKLS8vLyBnZXRMTFZNQXJjaFN1ZmZpeEZvckFSTSAtIEdldCB0aGUgTExWTSBhcmNoIG5hbWUgdG8gdXNlIGZvciBhIHBhcnRpY3VsYXIKLS8vLyBDUFUuCi0vLwotLy8gRklYTUU6IFRoaXMgaXMgcmVkdW5kYW50IHdpdGggLW1jcHUsIHdoeSBkb2VzIExMVk0gdXNlIHRoaXMuCi0vLyBGSVhNRTogdGJsZ2VuIHRoaXMsIG9yIGtpbGwgaXQhCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0TExWTUFyY2hTdWZmaXhGb3JBUk0oU3RyaW5nUmVmIENQVSkgewotICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGNvbnN0IGNoYXIgKj4oQ1BVKQotICAgIC5DYXNlKCJzdHJvbmdhcm0iLCAidjQiKQotICAgIC5DYXNlcygiYXJtN3RkbWkiLCAiYXJtN3RkbWktcyIsICJhcm03MTB0IiwgInY0dCIpCi0gICAgLkNhc2VzKCJhcm03MjB0IiwgImFybTkiLCAiYXJtOXRkbWkiLCAidjR0IikKLSAgICAuQ2FzZXMoImFybTkyMCIsICJhcm05MjB0IiwgImFybTkyMnQiLCAidjR0IikKLSAgICAuQ2FzZXMoImFybTk0MHQiLCAiZXA5MzEyIiwidjR0IikKLSAgICAuQ2FzZXMoImFybTEwdGRtaSIsICAiYXJtMTAyMHQiLCAidjUiKQotICAgIC5DYXNlcygiYXJtOWUiLCAgImFybTkyNmVqLXMiLCAgImFybTk0NmUtcyIsICJ2NWUiKQotICAgIC5DYXNlcygiYXJtOTY2ZS1zIiwgICJhcm05NjhlLXMiLCAgImFybTEwZSIsICJ2NWUiKQotICAgIC5DYXNlcygiYXJtMTAyMGUiLCAgImFybTEwMjJlIiwgICJ4c2NhbGUiLCAiaXdtbXh0IiwgInY1ZSIpCi0gICAgLkNhc2VzKCJhcm0xMTM2ai1zIiwgICJhcm0xMTM2amYtcyIsICAiYXJtMTE3Nmp6LXMiLCAidjYiKQotICAgIC5DYXNlcygiYXJtMTE3Nmp6Zi1zIiwgICJtcGNvcmVub3ZmcCIsICAibXBjb3JlIiwgInY2IikKLSAgICAuQ2FzZXMoImFybTExNTZ0Mi1zIiwgICJhcm0xMTU2dDJmLXMiLCAidjZ0MiIpCi0gICAgLkNhc2VzKCJjb3J0ZXgtYTUiLCAiY29ydGV4LWE3IiwgImNvcnRleC1hOCIsICJ2NyIpCi0gICAgLkNhc2VzKCJjb3J0ZXgtYTkiLCAiY29ydGV4LWExMiIsICJjb3J0ZXgtYTE1IiwgInY3IikKLSAgICAuQ2FzZXMoImNvcnRleC1yNCIsICJjb3J0ZXgtcjUiLCAidjdyIikKLSAgICAuQ2FzZSgiY29ydGV4LW0wIiwgInY2bSIpCi0gICAgLkNhc2UoImNvcnRleC1tMyIsICJ2N20iKQotICAgIC5DYXNlKCJjb3J0ZXgtbTQiLCAidjdlbSIpCi0gICAgLkNhc2UoImNvcnRleC1hOS1tcCIsICJ2N2YiKQotICAgIC5DYXNlKCJzd2lmdCIsICJ2N3MiKQotICAgIC5DYXNlcygiY29ydGV4LWE1MyIsICJjb3J0ZXgtYTU3IiwgInY4IikKLSAgICAuRGVmYXVsdCgiIik7Ci19Ci0KLS8vLyBnZXRBUk1UYXJnZXRDUFUgLSBHZXQgdGhlIChMTFZNKSBuYW1lIG9mIHRoZSBBUk0gY3B1IHdlIGFyZSB0YXJnZXRpbmcuCi0vLwotLy8gRklYTUU6IHRibGdlbiB0aGlzLgotc3RhdGljIHN0ZDo6c3RyaW5nIGdldEFSTVRhcmdldENQVShjb25zdCBBcmdMaXN0ICZBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkgewotICAvLyBGSVhNRTogV2FybiBvbiBpbmNvbnNpc3RlbnQgdXNlIG9mIC1tY3B1IGFuZCAtbWFyY2guCi0KLSAgLy8gSWYgd2UgaGF2ZSAtbWNwdT0sIHVzZSB0aGF0LgotICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tY3B1X0VRKSkgewotICAgIFN0cmluZ1JlZiBNQ1BVID0gQS0+Z2V0VmFsdWUoKTsKLSAgICAvLyBIYW5kbGUgLW1jcHU9bmF0aXZlLgotICAgIGlmIChNQ1BVID09ICJuYXRpdmUiKQotICAgICAgcmV0dXJuIGxsdm06OnN5czo6Z2V0SG9zdENQVU5hbWUoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gTUNQVTsKLSAgfQotCi0gIFN0cmluZ1JlZiBNQXJjaDsKLSAgaWYgKEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfbWFyY2hfRVEpKSB7Ci0gICAgLy8gT3RoZXJ3aXNlLCBpZiB3ZSBoYXZlIC1tYXJjaD0gY2hvb3NlIHRoZSBiYXNlIENQVSBmb3IgdGhhdCBhcmNoLgotICAgIE1BcmNoID0gQS0+Z2V0VmFsdWUoKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgQXJjaCBmcm9tIHRoZSB0cmlwbGUuCi0gICAgTUFyY2ggPSBUcmlwbGUuZ2V0QXJjaE5hbWUoKTsKLSAgfQotCi0gIGlmIChUcmlwbGUuZ2V0T1MoKSA9PSBsbHZtOjpUcmlwbGU6Ok5ldEJTRCkgewotICAgIGlmIChNQXJjaCA9PSAiYXJtdjYiKQotICAgICAgcmV0dXJuICJhcm0xMTc2anpmLXMiOwotICB9Ci0KLSAgLy8gSGFuZGxlIC1tYXJjaD1uYXRpdmUuCi0gIHN0ZDo6c3RyaW5nIE5hdGl2ZU1BcmNoOwotICBpZiAoTUFyY2ggPT0gIm5hdGl2ZSIpIHsKLSAgICBzdGQ6OnN0cmluZyBDUFUgPSBsbHZtOjpzeXM6OmdldEhvc3RDUFVOYW1lKCk7Ci0gICAgaWYgKENQVSAhPSAiZ2VuZXJpYyIpIHsKLSAgICAgIC8vIFRyYW5zbGF0ZSB0aGUgbmF0aXZlIGNwdSBpbnRvIHRoZSBhcmNoaXRlY3R1cmUuIFRoZSBzd2l0Y2ggYmVsb3cgd2lsbAotICAgICAgLy8gdGhlbiBjaG9zZSB0aGUgbWluaW11bSBjcHUgZm9yIHRoYXQgYXJjaC4KLSAgICAgIE5hdGl2ZU1BcmNoID0gc3RkOjpzdHJpbmcoImFybSIpICsgZ2V0TExWTUFyY2hTdWZmaXhGb3JBUk0oQ1BVKTsKLSAgICAgIE1BcmNoID0gTmF0aXZlTUFyY2g7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGxsdm06OlN0cmluZ1N3aXRjaDxjb25zdCBjaGFyICo+KE1BcmNoKQotICAgIC5DYXNlcygiYXJtdjIiLCAiYXJtdjJhIiwiYXJtMiIpCi0gICAgLkNhc2UoImFybXYzIiwgImFybTYiKQotICAgIC5DYXNlKCJhcm12M20iLCAiYXJtN20iKQotICAgIC5DYXNlKCJhcm12NCIsICJzdHJvbmdhcm0iKQotICAgIC5DYXNlKCJhcm12NHQiLCAiYXJtN3RkbWkiKQotICAgIC5DYXNlcygiYXJtdjUiLCAiYXJtdjV0IiwgImFybTEwdGRtaSIpCi0gICAgLkNhc2VzKCJhcm12NWUiLCAiYXJtdjV0ZSIsICJhcm0xMDIyZSIpCi0gICAgLkNhc2UoImFybXY1dGVqIiwgImFybTkyNmVqLXMiKQotICAgIC5DYXNlcygiYXJtdjYiLCAiYXJtdjZrIiwgImFybTExMzZqZi1zIikKLSAgICAuQ2FzZSgiYXJtdjZqIiwgImFybTExMzZqLXMiKQotICAgIC5DYXNlcygiYXJtdjZ6IiwgImFybXY2emsiLCAiYXJtMTE3Nmp6Zi1zIikKLSAgICAuQ2FzZSgiYXJtdjZ0MiIsICJhcm0xMTU2dDItcyIpCi0gICAgLkNhc2VzKCJhcm12Nm0iLCAiYXJtdjYtbSIsICJjb3J0ZXgtbTAiKQotICAgIC5DYXNlcygiYXJtdjciLCAiYXJtdjdhIiwgImFybXY3LWEiLCAiY29ydGV4LWE4IikKLSAgICAuQ2FzZXMoImFybXY3ZW0iLCAiYXJtdjdlLW0iLCAiY29ydGV4LW00IikKLSAgICAuQ2FzZXMoImFybXY3ZiIsICJhcm12Ny1mIiwgImNvcnRleC1hOS1tcCIpCi0gICAgLkNhc2VzKCJhcm12N3MiLCAiYXJtdjctcyIsICJzd2lmdCIpCi0gICAgLkNhc2VzKCJhcm12N3IiLCAiYXJtdjctciIsICJjb3J0ZXgtcjQiKQotICAgIC5DYXNlcygiYXJtdjdtIiwgImFybXY3LW0iLCAiY29ydGV4LW0zIikKLSAgICAuQ2FzZXMoImFybXY4IiwgImFybXY4YSIsICJhcm12OC1hIiwgImNvcnRleC1hNTMiKQotICAgIC5DYXNlKCJlcDkzMTIiLCAiZXA5MzEyIikKLSAgICAuQ2FzZSgiaXdtbXh0IiwgIml3bW14dCIpCi0gICAgLkNhc2UoInhzY2FsZSIsICJ4c2NhbGUiKQotICAgIC8vIElmIGFsbCBlbHNlIGZhaWxlZCwgcmV0dXJuIHRoZSBtb3N0IGJhc2UgQ1BVIHdpdGggdGh1bWIgaW50ZXJ3b3JraW5nCi0gICAgLy8gc3VwcG9ydGVkIGJ5IExMVk0uCi0gICAgLkRlZmF1bHQoImFybTd0ZG1pIik7Ci19Ci0KIC8vLyBnZXRBQXJjaDY0VGFyZ2V0Q1BVIC0gR2V0IHRoZSAoTExWTSkgbmFtZSBvZiB0aGUgQUFyY2g2NCBjcHUgd2UgYXJlIHRhcmdldGluZy4KIC8vCiAvLyBGSVhNRTogdGJsZ2VuIHRoaXMuCkBAIC01NzIsNyArNDcxLDEwIEBACiAgICAgcmV0dXJuIHRydWU7CiAKICAgY2FzZSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQ6CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphYXJjaDY0X2JlOgorICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtNjQ6CiAgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm06CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm1lYjoKICAgY2FzZSBsbHZtOjpUcmlwbGU6OnBwYzoKICAgY2FzZSBsbHZtOjpUcmlwbGU6OnBwYzY0OgogICAgIGlmIChUcmlwbGUuaXNPU0RhcndpbigpKQpAQCAtNjE1LDEwICs1MTcsNiBAQAogICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiK2NyeXB0byIpOwogICB9IGVsc2UgaWYgKEZQVSA9PSAibmVvbiIpIHsKICAgICBGZWF0dXJlcy5wdXNoX2JhY2soIituZW9uIik7Ci0gIH0gZWxzZSBpZiAoRlBVID09ICJub25lIikgewotICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiLWZwLWFybXY4Iik7Ci0gICAgRmVhdHVyZXMucHVzaF9iYWNrKCItY3J5cHRvIik7Ci0gICAgRmVhdHVyZXMucHVzaF9iYWNrKCItbmVvbiIpOwogICB9IGVsc2UKICAgICBELkRpYWcoZGlhZzo6ZXJyX2Rydl9jbGFuZ191bnN1cHBvcnRlZCkgPDwgQS0+Z2V0QXNTdHJpbmcoQXJncyk7CiB9CkBAIC02NTksMTYgKzU1NywyOCBAQAogICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiLXZmcDIiKTsKICAgICBGZWF0dXJlcy5wdXNoX2JhY2soIi12ZnAzIik7CiAgICAgRmVhdHVyZXMucHVzaF9iYWNrKCItbmVvbiIpOworICB9IGVsc2UgaWYgKEZQVSA9PSAidmZwIikgeworICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiK3ZmcDIiKTsKKyAgICBGZWF0dXJlcy5wdXNoX2JhY2soIi1uZW9uIik7CiAgIH0gZWxzZSBpZiAoRlBVID09ICJ2ZnAzLWQxNiIgfHwgRlBVID09ICJ2ZnB2My1kMTYiKSB7CiAgICAgRmVhdHVyZXMucHVzaF9iYWNrKCIrdmZwMyIpOwogICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiK2QxNiIpOwogICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiLW5lb24iKTsKLSAgfSBlbHNlIGlmIChGUFUgPT0gInZmcCIpIHsKLSAgICBGZWF0dXJlcy5wdXNoX2JhY2soIit2ZnAyIik7Ci0gICAgRmVhdHVyZXMucHVzaF9iYWNrKCItbmVvbiIpOwogICB9IGVsc2UgaWYgKEZQVSA9PSAidmZwMyIgfHwgRlBVID09ICJ2ZnB2MyIpIHsKICAgICBGZWF0dXJlcy5wdXNoX2JhY2soIit2ZnAzIik7CiAgICAgRmVhdHVyZXMucHVzaF9iYWNrKCItbmVvbiIpOworICB9IGVsc2UgaWYgKEZQVSA9PSAidmZwNC1kMTYiIHx8IEZQVSA9PSAidmZwdjQtZDE2IikgeworICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiK3ZmcDQiKTsKKyAgICBGZWF0dXJlcy5wdXNoX2JhY2soIitkMTYiKTsKKyAgICBGZWF0dXJlcy5wdXNoX2JhY2soIi1uZW9uIik7CisgIH0gZWxzZSBpZiAoRlBVID09ICJ2ZnA0IiB8fCBGUFUgPT0gInZmcHY0IikgeworICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiK3ZmcDQiKTsKKyAgICBGZWF0dXJlcy5wdXNoX2JhY2soIi1uZW9uIik7CisgIH0gZWxzZSBpZiAoRlBVID09ICJmcDQtc3AtZDE2IiB8fCBGUFUgPT0gImZwdjQtc3AtZDE2IikgeworICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiK3ZmcDQiKTsKKyAgICBGZWF0dXJlcy5wdXNoX2JhY2soIitkMTYiKTsKKyAgICBGZWF0dXJlcy5wdXNoX2JhY2soIitmcC1vbmx5LXNwIik7CisgICAgRmVhdHVyZXMucHVzaF9iYWNrKCItbmVvbiIpOwogICB9IGVsc2UgaWYgKEZQVSA9PSAiZnAtYXJtdjgiKSB7CiAgICAgRmVhdHVyZXMucHVzaF9iYWNrKCIrZnAtYXJtdjgiKTsKICAgICBGZWF0dXJlcy5wdXNoX2JhY2soIi1uZW9uIik7CkBAIC02OTYsOSArNjA2LDggQEAKIAogLy8gU2VsZWN0IHRoZSBmbG9hdCBBQkkgYXMgZGV0ZXJtaW5lZCBieSAtbXNvZnQtZmxvYXQsIC1taGFyZC1mbG9hdCwgYW5kCiAvLyAtbWZsb2F0LWFiaT0uCi1zdGF0aWMgU3RyaW5nUmVmIGdldEFSTUZsb2F0QUJJKGNvbnN0IERyaXZlciAmRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnTGlzdCAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUpIHsKK1N0cmluZ1JlZiB0b29sczo6YXJtOjpnZXRBUk1GbG9hdEFCSShjb25zdCBEcml2ZXIgJkQsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUpIHsKICAgU3RyaW5nUmVmIEZsb2F0QUJJOwogICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tc29mdF9mbG9hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfbWhhcmRfZmxvYXQsCkBAIC03MjcsNyArNjM2LDcgQEAKICAgICAgIC8vCiAgICAgICAvLyBGSVhNRTogRmFjdG9yIG91dCBhbiBBUk0gY2xhc3Mgc28gd2UgY2FuIGNhY2hlIHRoZSBhcmNoIHNvbWV3aGVyZS4KICAgICAgIHN0ZDo6c3RyaW5nIEFyY2hOYW1lID0KLSAgICAgICAgZ2V0TExWTUFyY2hTdWZmaXhGb3JBUk0oZ2V0QVJNVGFyZ2V0Q1BVKEFyZ3MsIFRyaXBsZSkpOworICAgICAgICBhcm06OmdldExMVk1BcmNoU3VmZml4Rm9yQVJNKGFybTo6Z2V0QVJNVGFyZ2V0Q1BVKEFyZ3MsIFRyaXBsZSkpOwogICAgICAgaWYgKFN0cmluZ1JlZihBcmNoTmFtZSkuc3RhcnRzd2l0aCgidjYiKSB8fAogICAgICAgICAgIFN0cmluZ1JlZihBcmNoTmFtZSkuc3RhcnRzd2l0aCgidjciKSkKICAgICAgICAgRmxvYXRBQkkgPSAic29mdGZwIjsKQEAgLTczNyw4ICs2NDYsMTUgQEAKICAgICB9CiAKICAgICBjYXNlIGxsdm06OlRyaXBsZTo6RnJlZUJTRDoKLSAgICAgIC8vIEZyZWVCU0QgZGVmYXVsdHMgdG8gc29mdCBmbG9hdAotICAgICAgRmxvYXRBQkkgPSAic29mdCI7CisgICAgICBzd2l0Y2goVHJpcGxlLmdldEVudmlyb25tZW50KCkpIHsKKyAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpHTlVFQUJJSEY6CisgICAgICAgIEZsb2F0QUJJID0gImhhcmQiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIEZyZWVCU0QgZGVmYXVsdHMgdG8gc29mdCBmbG9hdAorICAgICAgICBGbG9hdEFCSSA9ICJzb2Z0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6CkBAIC03NDksMTMgKzY2NSwxNiBAQAogICAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkdOVUVBQkk6CiAgICAgICAgIEZsb2F0QUJJID0gInNvZnRmcCI7CiAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkVBQklIRjoKKyAgICAgICAgRmxvYXRBQkkgPSAiaGFyZCI7CisgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkVBQkk6CiAgICAgICAgIC8vIEVBQkkgaXMgYWx3YXlzIEFBUENTLCBhbmQgaWYgaXQgd2FzIG5vdCBtYXJrZWQgJ2hhcmQnLCBpdCdzIHNvZnRmcAogICAgICAgICBGbG9hdEFCSSA9ICJzb2Z0ZnAiOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpBbmRyb2lkOiB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIEFyY2hOYW1lID0KLSAgICAgICAgICBnZXRMTFZNQXJjaFN1ZmZpeEZvckFSTShnZXRBUk1UYXJnZXRDUFUoQXJncywgVHJpcGxlKSk7CisgICAgICAgICAgYXJtOjpnZXRMTFZNQXJjaFN1ZmZpeEZvckFSTShhcm06OmdldEFSTVRhcmdldENQVShBcmdzLCBUcmlwbGUpKTsKICAgICAgICAgaWYgKFN0cmluZ1JlZihBcmNoTmFtZSkuc3RhcnRzd2l0aCgidjciKSkKICAgICAgICAgICBGbG9hdEFCSSA9ICJzb2Z0ZnAiOwogICAgICAgICBlbHNlCkBAIC03NjUsNyArNjg0LDkgQEAKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIC8vIEFzc3VtZSAic29mdCIsIGJ1dCB3YXJuIHRoZSB1c2VyIHdlIGFyZSBndWVzc2luZy4KICAgICAgICAgRmxvYXRBQkkgPSAic29mdCI7Ci0gICAgICAgIEQuRGlhZyhkaWFnOjp3YXJuX2Rydl9hc3N1bWluZ19tZmxvYXRfYWJpX2lzKSA8PCAic29mdCI7CisgICAgICAgIGlmIChUcmlwbGUuZ2V0T1MoKSAhPSBsbHZtOjpUcmlwbGU6OlVua25vd25PUyB8fAorICAgICAgICAgICAgIVRyaXBsZS5pc09TQmluRm9ybWF0TWFjaE8oKSkKKyAgICAgICAgICBELkRpYWcoZGlhZzo6d2Fybl9kcnZfYXNzdW1pbmdfbWZsb2F0X2FiaV9pcykgPDwgInNvZnQiOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CkBAIC03NzYsMTggKzY5NywzMCBAQAogCiBzdGF0aWMgdm9pZCBnZXRBUk1UYXJnZXRGZWF0dXJlcyhjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnTGlzdCAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gJkZlYXR1cmVzKSB7Ci0gIFN0cmluZ1JlZiBGbG9hdEFCSSA9IGdldEFSTUZsb2F0QUJJKEQsIEFyZ3MsIFRyaXBsZSk7Ci0gIC8vIEZJWE1FOiBOb3RlLCB0aGlzIGlzIGEgaGFjaywgdGhlIExMVk0gYmFja2VuZCBkb2Vzbid0IGFjdHVhbGx5IHVzZSB0aGVzZQotICAvLyB5ZXQgKGl0IHVzZXMgdGhlIC1tZmxvYXQtYWJpIGFuZCAtbXNvZnQtZmxvYXQgb3B0aW9ucyksIGFuZCBpdCBpcwotICAvLyBzdHJpcHBlZCBvdXQgYnkgdGhlIEFSTSB0YXJnZXQuCi0gIC8vIFVzZSBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zPwotICBpZiAoRmxvYXRBQkkgPT0gInNvZnQiKQotICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiK3NvZnQtZmxvYXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gJkZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3JBUykgeworICBTdHJpbmdSZWYgRmxvYXRBQkkgPSB0b29sczo6YXJtOjpnZXRBUk1GbG9hdEFCSShELCBBcmdzLCBUcmlwbGUpOworICBpZiAoIUZvckFTKSB7CisgICAgLy8gRklYTUU6IE5vdGUsIHRoaXMgaXMgYSBoYWNrLCB0aGUgTExWTSBiYWNrZW5kIGRvZXNuJ3QgYWN0dWFsbHkgdXNlIHRoZXNlCisgICAgLy8geWV0IChpdCB1c2VzIHRoZSAtbWZsb2F0LWFiaSBhbmQgLW1zb2Z0LWZsb2F0IG9wdGlvbnMpLCBhbmQgaXQgaXMKKyAgICAvLyBzdHJpcHBlZCBvdXQgYnkgdGhlIEFSTSB0YXJnZXQuIFdlIHNob3VsZCBwcm9iYWJseSBwYXNzIHRoaXMgYSBuZXcKKyAgICAvLyAtdGFyZ2V0LW9wdGlvbiwgd2hpY2ggaXMgaGFuZGxlZCBieSB0aGUgLWNjMS8tY2MxYXMgaW52b2NhdGlvbi4KKyAgICAvLworICAgIC8vIEZJWE1FMjogIEZvciBjb25zaXN0ZW5jeSwgaXQgd291bGQgYmUgaWRlYWwgaWYgd2Ugc2V0IHVwIHRoZSB0YXJnZXQKKyAgICAvLyBtYWNoaW5lIHN0YXRlIHRoZSBzYW1lIHdoZW4gdXNpbmcgdGhlIGZyb250ZW5kIG9yIHRoZSBhc3NlbWJsZXIuIFdlIGRvbid0CisgICAgLy8gY3VycmVudGx5IGRvIHRoYXQgZm9yIHRoZSBhc3NlbWJsZXIsIHdlIHBhc3MgdGhlIG9wdGlvbnMgZGlyZWN0bHkgdG8gdGhlCisgICAgLy8gYmFja2VuZCBhbmQgbmV2ZXIgZXZlbiBpbnN0YW50aWF0ZSB0aGUgZnJvbnRlbmQgVGFyZ2V0SW5mby4gSWYgd2UgZGlkLAorICAgIC8vIGFuZCB1c2VkIGl0cyBoYW5kbGVUYXJnZXRGZWF0dXJlcyBob29rLCB0aGVuIHdlIGNvdWxkIGVuc3VyZSB0aGUKKyAgICAvLyBhc3NlbWJsZXIgYW5kIHRoZSBmcm9udGVuZCBiZWhhdmUgdGhlIHNhbWUuCiAKLSAgLy8gVXNlIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50IHBhc3Npbmc/Ci0gIGlmIChGbG9hdEFCSSAhPSAiaGFyZCIpCi0gICAgRmVhdHVyZXMucHVzaF9iYWNrKCIrc29mdC1mbG9hdC1hYmkiKTsKKyAgICAvLyBVc2Ugc29mdHdhcmUgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucz8KKyAgICBpZiAoRmxvYXRBQkkgPT0gInNvZnQiKQorICAgICAgRmVhdHVyZXMucHVzaF9iYWNrKCIrc29mdC1mbG9hdCIpOworCisgICAgLy8gVXNlIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50IHBhc3Npbmc/CisgICAgaWYgKEZsb2F0QUJJICE9ICJoYXJkIikKKyAgICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiK3NvZnQtZmxvYXQtYWJpIik7CisgIH0KIAogICAvLyBIb25vciAtbWZwdT0uCiAgIGlmIChjb25zdCBBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX21mcHVfRVEpKQpAQCAtNzk3LDggKzczMCwxMSBAQAogCiAgIC8vIFNldHRpbmcgLW1zb2Z0LWZsb2F0IGVmZmVjdGl2ZWx5IGRpc2FibGVzIE5FT04gYmVjYXVzZSBvZiB0aGUgR0NDCiAgIC8vIGltcGxlbWVudGF0aW9uLCBhbHRob3VnaCB0aGUgc2FtZSBpc24ndCB0cnVlIG9mIFZGUCBvciBWRlAzLgotICBpZiAoRmxvYXRBQkkgPT0gInNvZnQiKQorICBpZiAoRmxvYXRBQkkgPT0gInNvZnQiKSB7CiAgICAgRmVhdHVyZXMucHVzaF9iYWNrKCItbmVvbiIpOworICAgIC8vIEFsc28gbmVlZCB0byBleHBsaWNpdGx5IGRpc2FibGUgZmVhdHVyZXMgd2hpY2ggaW1wbHkgTkVPTi4KKyAgICBGZWF0dXJlcy5wdXNoX2JhY2soIi1jcnlwdG8iKTsKKyAgfQogCiAgIC8vIEVuL2Rpc2FibGUgY3JjCiAgIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX21jcmMsCkBAIC04MTcsNyArNzUzLDcgQEAKICAgLy8gR2V0IHRoZSBlZmZlY3RpdmUgdHJpcGxlLCB3aGljaCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGRlcGxveW1lbnQgdGFyZ2V0LgogICBzdGQ6OnN0cmluZyBUcmlwbGVTdHIgPSBnZXRUb29sQ2hhaW4oKS5Db21wdXRlRWZmZWN0aXZlQ2xhbmdUcmlwbGUoQXJncyk7CiAgIGxsdm06OlRyaXBsZSBUcmlwbGUoVHJpcGxlU3RyKTsKLSAgc3RkOjpzdHJpbmcgQ1BVTmFtZSA9IGdldEFSTVRhcmdldENQVShBcmdzLCBUcmlwbGUpOworICBzdGQ6OnN0cmluZyBDUFVOYW1lID0gYXJtOjpnZXRBUk1UYXJnZXRDUFUoQXJncywgVHJpcGxlKTsKIAogICAvLyBTZWxlY3QgdGhlIEFCSSB0byB1c2UuCiAgIC8vCkBAIC04MjksNiArNzY1LDggQEAKICAgICAvLyBUaGUgYmFja2VuZCBpcyBoYXJkd2lyZWQgdG8gYXNzdW1lIEFBUENTIGZvciBNLWNsYXNzIHByb2Nlc3NvcnMsIGVuc3VyZQogICAgIC8vIHRoZSBmcm9udGVuZCBtYXRjaGVzIHRoYXQuCiAgICAgaWYgKFRyaXBsZS5nZXRFbnZpcm9ubWVudCgpID09IGxsdm06OlRyaXBsZTo6RUFCSSB8fAorICAgICAgICAoVHJpcGxlLmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpVbmtub3duT1MgJiYKKyAgICAgICAgIFRyaXBsZS5nZXRPYmplY3RGb3JtYXQoKSA9PSBsbHZtOjpUcmlwbGU6Ok1hY2hPKSB8fAogICAgICAgICBTdHJpbmdSZWYoQ1BVTmFtZSkuc3RhcnRzd2l0aCgiY29ydGV4LW0iKSkgewogICAgICAgQUJJTmFtZSA9ICJhYXBjcyI7CiAgICAgfSBlbHNlIHsKQEAgLTg0Miw2ICs3ODAsNyBAQAogICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpHTlVFQUJJSEY6CiAgICAgICBBQklOYW1lID0gImFhcGNzLWxpbnV4IjsKICAgICAgIGJyZWFrOworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpFQUJJSEY6CiAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkVBQkk6CiAgICAgICBBQklOYW1lID0gImFhcGNzIjsKICAgICAgIGJyZWFrOwpAQCAtODUzLDcgKzc5Miw3IEBACiAgIENtZEFyZ3MucHVzaF9iYWNrKEFCSU5hbWUpOwogCiAgIC8vIERldGVybWluZSBmbG9hdGluZyBwb2ludCBBQkkgZnJvbSB0aGUgb3B0aW9ucyAmIHRhcmdldCBkZWZhdWx0cy4KLSAgU3RyaW5nUmVmIEZsb2F0QUJJID0gZ2V0QVJNRmxvYXRBQkkoRCwgQXJncywgVHJpcGxlKTsKKyAgU3RyaW5nUmVmIEZsb2F0QUJJID0gdG9vbHM6OmFybTo6Z2V0QVJNRmxvYXRBQkkoRCwgQXJncywgVHJpcGxlKTsKICAgaWYgKEZsb2F0QUJJID09ICJzb2Z0IikgewogICAgIC8vIEZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgYW5kIGFyZ3VtZW50IHBhc3NpbmcgYXJlIHNvZnQuCiAgICAgLy8KQEAgLTkwMCwxMyArODM5LDY2IEBACiAgICAgICAgICAgICAgICAgICAgIHRydWUpKQogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbm8taW1wbGljaXQtZmxvYXQiKTsKIAotICAgIC8vIGxsdm0gZG9lcyBub3Qgc3VwcG9ydCByZXNlcnZpbmcgcmVnaXN0ZXJzIGluIGdlbmVyYWwuIFRoZXJlIGlzIHN1cHBvcnQKLSAgICAvLyBmb3IgcmVzZXJ2aW5nIHI5IG9uIEFSTSB0aG91Z2ggKGRlZmluZWQgYXMgYSBwbGF0Zm9ybS1zcGVjaWZpYyByZWdpc3RlcgotICAgIC8vIGluIEFSTSBFQUJJKS4KLSAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2ZmaXhlZF9yOSkpIHsKLSAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItYmFja2VuZC1vcHRpb24iKTsKLSAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItYXJtLXJlc2VydmUtcjkiKTsKLSAgICB9CisgIC8vIGxsdm0gZG9lcyBub3Qgc3VwcG9ydCByZXNlcnZpbmcgcmVnaXN0ZXJzIGluIGdlbmVyYWwuIFRoZXJlIGlzIHN1cHBvcnQKKyAgLy8gZm9yIHJlc2VydmluZyByOSBvbiBBUk0gdGhvdWdoIChkZWZpbmVkIGFzIGEgcGxhdGZvcm0tc3BlY2lmaWMgcmVnaXN0ZXIKKyAgLy8gaW4gQVJNIEVBQkkpLgorICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2ZmaXhlZF9yOSkpIHsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWJhY2tlbmQtb3B0aW9uIik7CisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1hcm0tcmVzZXJ2ZS1yOSIpOworICB9Cit9CisKKy8vLyBnZXRBUk02NFRhcmdldENQVSAtIEdldCB0aGUgKExMVk0pIG5hbWUgb2YgdGhlIEFSTTY0IGNwdSB3ZSBhcmUgdGFyZ2V0aW5nLgorc3RhdGljIHN0ZDo6c3RyaW5nIGdldEFSTTY0VGFyZ2V0Q1BVKGNvbnN0IEFyZ0xpc3QgJkFyZ3MpIHsKKyAgLy8gSWYgd2UgaGF2ZSAtbWNwdT0sIHVzZSB0aGF0LgorICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tY3B1X0VRKSkgeworICAgIFN0cmluZ1JlZiBNQ1BVID0gQS0+Z2V0VmFsdWUoKTsKKyAgICAvLyBIYW5kbGUgLW1jcHU9bmF0aXZlLgorICAgIGlmIChNQ1BVID09ICJuYXRpdmUiKQorICAgICAgcmV0dXJuIGxsdm06OnN5czo6Z2V0SG9zdENQVU5hbWUoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gTUNQVTsKKyAgfQorCisgIC8vIEF0IHNvbWUgcG9pbnQsIHdlIG1heSBuZWVkIHRvIGNoZWNrIC1tYXJjaCBoZXJlLCBidXQgZm9yIG5vdyB3ZSBvbmx5CisgIC8vIG9uZSBhcm02NCBhcmNoaXRlY3R1cmUuCisKKyAgLy8gRGVmYXVsdCB0byAiY3ljbG9uZSIgQ1BVLgorICByZXR1cm4gImN5Y2xvbmUiOworfQorCit2b2lkIENsYW5nOjpBZGRBUk02NFRhcmdldEFyZ3MoY29uc3QgQXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIFRyaXBsZVN0ciA9IGdldFRvb2xDaGFpbigpLkNvbXB1dGVFZmZlY3RpdmVDbGFuZ1RyaXBsZShBcmdzKTsKKyAgbGx2bTo6VHJpcGxlIFRyaXBsZShUcmlwbGVTdHIpOworCisgIGlmICghQXJncy5oYXNGbGFnKG9wdGlvbnM6Ok9QVF9tcmVkX3pvbmUsIG9wdGlvbnM6Ok9QVF9tbm9fcmVkX3pvbmUsIHRydWUpIHx8CisgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfbWtlcm5lbCkgfHwKKyAgICAgIEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mYXBwbGVfa2V4dCkpCisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1kaXNhYmxlLXJlZC16b25lIik7CisKKyAgaWYgKCFBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX21pbXBsaWNpdF9mbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX21ub19pbXBsaWNpdF9mbG9hdCwgdHJ1ZSkpCisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1uby1pbXBsaWNpdC1mbG9hdCIpOworCisgIGNvbnN0IGNoYXIgKkFCSU5hbWUgPSAwOworICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tYWJpX0VRKSkKKyAgICBBQklOYW1lID0gQS0+Z2V0VmFsdWUoKTsKKyAgZWxzZSBpZiAoVHJpcGxlLmlzT1NEYXJ3aW4oKSkKKyAgICBBQklOYW1lID0gImRhcndpbnBjcyI7CisgIGVsc2UKKyAgICBBQklOYW1lID0gImFhcGNzIjsKKworICBDbWRBcmdzLnB1c2hfYmFjaygiLXRhcmdldC1hYmkiKTsKKyAgQ21kQXJncy5wdXNoX2JhY2soQUJJTmFtZSk7CisKKyAgQ21kQXJncy5wdXNoX2JhY2soIi10YXJnZXQtY3B1Iik7CisgIENtZEFyZ3MucHVzaF9iYWNrKEFyZ3MuTWFrZUFyZ1N0cmluZyhnZXRBUk02NFRhcmdldENQVShBcmdzKSkpOworCisgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfbXN0cmljdF9hbGlnbikpIHsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWJhY2tlbmQtb3B0aW9uIik7CisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1hcm02NC1zdHJpY3QtYWxpZ24iKTsKKyAgfQogfQogCiAvLyBHZXQgQ1BVIGFuZCBBQkkgbmFtZXMuIFRoZXkgYXJlIG5vdCBpbmRlcGVuZGVudApAQCAtOTE1LDggKzkwNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJkNQVU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmQUJJTmFtZSkgewotICBjb25zdCBjaGFyICpEZWZNaXBzMzJDUFUgPSAibWlwczMyIjsKLSAgY29uc3QgY2hhciAqRGVmTWlwczY0Q1BVID0gIm1pcHM2NCI7CisgIGNvbnN0IGNoYXIgKkRlZk1pcHMzMkNQVSA9ICJtaXBzMzJyMiI7CisgIGNvbnN0IGNoYXIgKkRlZk1pcHM2NENQVSA9ICJtaXBzNjRyMiI7CiAKICAgaWYgKEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfbWFyY2hfRVEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX21jcHVfRVEpKQpAQCAtMTAyMCw4ICsxMDEyLDcgQEAKIHN0YXRpYyB2b2lkIGdldE1JUFNUYXJnZXRGZWF0dXJlcyhjb25zdCBEcml2ZXIgJkQsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiAmRmVhdHVyZXMpIHsKICAgU3RyaW5nUmVmIEZsb2F0QUJJID0gZ2V0TWlwc0Zsb2F0QUJJKEQsIEFyZ3MpOwotICBib29sIElzTWlwczE2ID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9taXBzMTYpICE9IE5VTEw7Ci0gIGlmIChGbG9hdEFCSSA9PSAic29mdCIgfHwgKEZsb2F0QUJJID09ICJoYXJkIiAmJiBJc01pcHMxNikpIHsKKyAgaWYgKEZsb2F0QUJJID09ICJzb2Z0IikgewogICAgIC8vIEZJWE1FOiBOb3RlLCB0aGlzIGlzIGEgaGFjay4gV2UgbmVlZCB0byBwYXNzIHRoZSBzZWxlY3RlZCBmbG9hdAogICAgIC8vIG1vZGUgdG8gdGhlIE1pcHNUYXJnZXRJbmZvQmFzZSB0byBkZWZpbmUgYXBwcm9wcmlhdGUgbWFjcm9zIHRoZXJlLgogICAgIC8vIE5vdyBpdCBpcyB0aGUgb25seSBtZXRob2QuCkBAIC0xMDYyLDE4ICsxMDUzLDExIEBACiAKICAgU3RyaW5nUmVmIEZsb2F0QUJJID0gZ2V0TWlwc0Zsb2F0QUJJKEQsIEFyZ3MpOwogCi0gIGJvb2wgSXNNaXBzMTYgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX21pcHMxNikgIT0gTlVMTDsKLQotICBpZiAoRmxvYXRBQkkgPT0gInNvZnQiIHx8IChGbG9hdEFCSSA9PSAiaGFyZCIgJiYgSXNNaXBzMTYpKSB7CisgIGlmIChGbG9hdEFCSSA9PSAic29mdCIpIHsKICAgICAvLyBGbG9hdGluZyBwb2ludCBvcGVyYXRpb25zIGFuZCBhcmd1bWVudCBwYXNzaW5nIGFyZSBzb2Z0LgogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbXNvZnQtZmxvYXQiKTsKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW1mbG9hdC1hYmkiKTsKICAgICBDbWRBcmdzLnB1c2hfYmFjaygic29mdCIpOwotCi0gICAgaWYgKEZsb2F0QUJJID09ICJoYXJkIiAmJiBJc01pcHMxNikgewotICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tbGx2bSIpOwotICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1taXBzMTYtaGFyZC1mbG9hdCIpOwotICAgIH0KICAgfQogICBlbHNlIHsKICAgICAvLyBGbG9hdGluZyBwb2ludCBvcGVyYXRpb25zIGFuZCBhcmd1bWVudCBwYXNzaW5nIGFyZSBoYXJkLgpAQCAtMTMwOCwxMCArMTI5Miw5IEBACiAgICAgcmV0dXJuIElzNjRCaXQgPyAiY29yZTIiIDogInlvbmFoIjsKICAgfQogCi0gIC8vIEFsbCB4ODYgZGV2aWNlcyBydW5uaW5nIEFuZHJvaWQgaGF2ZSBjb3JlMiBhcyB0aGVpciBjb21tb24KLSAgLy8gZGVub21pbmF0b3IuIFRoaXMgbWFrZXMgYSBiZXR0ZXIgY2hvaWNlIHRoYW4gcGVudGl1bTQuCisgIC8vIE9uIEFuZHJvaWQgdXNlIHRhcmdldHMgY29tcGF0aWJsZSB3aXRoIGdjYwogICBpZiAoVHJpcGxlLmdldEVudmlyb25tZW50KCkgPT0gbGx2bTo6VHJpcGxlOjpBbmRyb2lkKQotICAgIHJldHVybiAiY29yZTIiOworICAgIHJldHVybiBJczY0Qml0ID8gIng4Ni02NCIgOiAiaTY4NiI7CiAKICAgLy8gRXZlcnl0aGluZyBlbHNlIGdvZXMgdG8geDg2LTY0IGluIDY0LWJpdCBtb2RlLgogICBpZiAoSXM2NEJpdCkKQEAgLTEzMzgsMTEgKzEzMjEsMTQgQEAKICAgICByZXR1cm4gIiI7CiAKICAgY2FzZSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQ6CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphYXJjaDY0X2JlOgogICAgIHJldHVybiBnZXRBQXJjaDY0VGFyZ2V0Q1BVKEFyZ3MsIFQpOwogCiAgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm06CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm1lYjoKICAgY2FzZSBsbHZtOjpUcmlwbGU6OnRodW1iOgotICAgIHJldHVybiBnZXRBUk1UYXJnZXRDUFUoQXJncywgVCk7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjp0aHVtYmViOgorICAgIHJldHVybiBhcm06OmdldEFSTVRhcmdldENQVShBcmdzLCBUKTsKIAogICBjYXNlIGxsdm06OlRyaXBsZTo6bWlwczoKICAgY2FzZSBsbHZtOjpUcmlwbGU6Om1pcHNlbDoKQEAgLTEzNzMsNyArMTM1OSw4IEBACiAgIH0KIAogICBjYXNlIGxsdm06OlRyaXBsZTo6c3BhcmM6Ci0gICAgaWYgKGNvbnN0IEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfbWFyY2hfRVEpKQorICBjYXNlIGxsdm06OlRyaXBsZTo6c3BhcmN2OToKKyAgICBpZiAoY29uc3QgQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tY3B1X0VRKSkKICAgICAgIHJldHVybiBBLT5nZXRWYWx1ZSgpOwogICAgIHJldHVybiAiIjsKIApAQCAtMTM5Miw2ICsxMzc5LDI0IEBACiAgIH0KIH0KIAorc3RhdGljIHZvaWQgQWRkR29sZFBsdWdpbihjb25zdCBUb29sQ2hhaW4gJlRvb2xDaGFpbiwgY29uc3QgQXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgeworICAvLyBUZWxsIHRoZSBsaW5rZXIgdG8gbG9hZCB0aGUgcGx1Z2luLiBUaGlzIGhhcyB0byBjb21lIGJlZm9yZSBBZGRMaW5rZXJJbnB1dHMKKyAgLy8gYXMgZ29sZCByZXF1aXJlcyAtcGx1Z2luIHRvIGNvbWUgYmVmb3JlIGFueSAtcGx1Z2luLW9wdCB0aGF0IC1XbCBtaWdodAorICAvLyBmb3J3YXJkLgorICBDbWRBcmdzLnB1c2hfYmFjaygiLXBsdWdpbiIpOworICBzdGQ6OnN0cmluZyBQbHVnaW4gPSBUb29sQ2hhaW4uZ2V0RHJpdmVyKCkuRGlyICsgIi8uLi9saWIvTExWTWdvbGQuc28iOworICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoUGx1Z2luKSk7CisKKyAgLy8gVHJ5IHRvIHBhc3MgZHJpdmVyIGxldmVsIGZsYWdzIHJlbGV2YW50IHRvIExUTyBjb2RlIGdlbmVyYXRpb24gZG93biB0bworICAvLyB0aGUgcGx1Z2luLgorCisgIC8vIEhhbmRsZSBmbGFncyBmb3Igc2VsZWN0aW5nIENQVSB2YXJpYW50cy4KKyAgc3RkOjpzdHJpbmcgQ1BVID0gZ2V0Q1BVTmFtZShBcmdzLCBUb29sQ2hhaW4uZ2V0VHJpcGxlKCkpOworICBpZiAoIUNQVS5lbXB0eSgpKQorICAgIENtZEFyZ3MucHVzaF9iYWNrKEFyZ3MuTWFrZUFyZ1N0cmluZyhUd2luZSgiLXBsdWdpbi1vcHQ9bWNwdT0iKSArIENQVSkpOworfQorCiBzdGF0aWMgdm9pZCBnZXRYODZUYXJnZXRGZWF0dXJlcyhjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+ICZGZWF0dXJlcykgewpAQCAtMTQwNiw2ICsxNDExLDExIEBACiAgICAgRmVhdHVyZXMucHVzaF9iYWNrKCItZnNnc2Jhc2UiKTsKICAgfQogCisgIGlmIChUcmlwbGUuZ2V0RW52aXJvbm1lbnQoKSA9PSBsbHZtOjpUcmlwbGU6OkFuZHJvaWQpIHsKKyAgICAvLyBBZGQgc3NlMyBmZWF0dXJlIHRvIGNvbXBseSB3aXRoIGdjYyBvbiBBbmRyb2lkCisgICAgRmVhdHVyZXMucHVzaF9iYWNrKCIrc3NlMyIpOworICB9CisKICAgLy8gTm93IGFkZCBhbnkgdGhhdCB0aGUgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLAogICAvLyB3aGljaCBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLgogICBmb3IgKGFyZ19pdGVyYXRvciBpdCA9IEFyZ3MuZmlsdGVyZWRfYmVnaW4ob3B0aW9uczo6T1BUX21feDg2X0ZlYXR1cmVzX0dyb3VwKSwKQEAgLTE1MDEsMTAgKzE1MTEsMTkgQEAKICAgLy8gSG9ub3IgLW1mcHU9LgogICBpZiAoY29uc3QgQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tZnB1X0VRKSkKICAgICBnZXRBQXJjaDY0RlBVRmVhdHVyZXMoRCwgQSwgQXJncywgRmVhdHVyZXMpOworICBlbHNlCisgICAgRmVhdHVyZXMucHVzaF9iYWNrKCIrbmVvbiIpOworCisgIGlmIChBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX21nZW5lcmFsX3JlZ3Nfb25seSkpIHsKKyAgICBGZWF0dXJlcy5wdXNoX2JhY2soIi1mcC1hcm12OCIpOworICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiLWNyeXB0byIpOworICAgIEZlYXR1cmVzLnB1c2hfYmFjaygiLW5lb24iKTsKKyAgfQogfQogCiBzdGF0aWMgdm9pZCBnZXRUYXJnZXRGZWF0dXJlcyhjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnTGlzdCAmQXJncywgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnTGlzdCAmQXJncywgQXJnU3RyaW5nTGlzdCAmQ21kQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yQVMpIHsKICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBGZWF0dXJlczsKICAgc3dpdGNoIChUcmlwbGUuZ2V0QXJjaCgpKSB7CiAgIGRlZmF1bHQ6CkBAIC0xNTE3LDggKzE1MzYsMTAgQEAKICAgICBicmVhazsKIAogICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtOgorICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtZWI6CiAgIGNhc2UgbGx2bTo6VHJpcGxlOjp0aHVtYjoKLSAgICBnZXRBUk1UYXJnZXRGZWF0dXJlcyhELCBUcmlwbGUsIEFyZ3MsIEZlYXR1cmVzKTsKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OnRodW1iZWI6CisgICAgZ2V0QVJNVGFyZ2V0RmVhdHVyZXMoRCwgVHJpcGxlLCBBcmdzLCBGZWF0dXJlcywgRm9yQVMpOwogICAgIGJyZWFrOwogCiAgIGNhc2UgbGx2bTo6VHJpcGxlOjpwcGM6CkBAIC0xNTMwLDYgKzE1NTEsNyBAQAogICAgIGdldFNwYXJjVGFyZ2V0RmVhdHVyZXMoQXJncywgRmVhdHVyZXMpOwogICAgIGJyZWFrOwogICBjYXNlIGxsdm06OlRyaXBsZTo6YWFyY2g2NDoKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OmFhcmNoNjRfYmU6CiAgICAgZ2V0QUFyY2g2NFRhcmdldEZlYXR1cmVzKEQsIEFyZ3MsIEZlYXR1cmVzKTsKICAgICBicmVhazsKICAgY2FzZSBsbHZtOjpUcmlwbGU6Ong4NjoKQEAgLTE1NjksNyArMTU5MSw3IEBACiAgIGlmIChydW50aW1lLmlzTm9uRnJhZ2lsZSgpKQogICAgIHJldHVybiB0cnVlOwogCi0gIGlmICghVHJpcGxlLmlzT1NEYXJ3aW4oKSkKKyAgaWYgKCFUcmlwbGUuaXNNYWNPU1goKSkKICAgICByZXR1cm4gZmFsc2U7CiAKICAgcmV0dXJuICghVHJpcGxlLmlzTWFjT1NYVmVyc2lvbkxUKDEwLDUpICYmCkBAIC0xNTc3LDYgKzE1OTksNDQgQEAKICAgICAgICAgICAgVHJpcGxlLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSkpOwogfQogCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRXhjZXB0aW9uU2V0dGluZ3MgeworICAgIGJvb2wgRXhjZXB0aW9uc0VuYWJsZWQ7CisgICAgYm9vbCBTaG91bGRVc2VFeGNlcHRpb25UYWJsZXM7CisgICAgRXhjZXB0aW9uU2V0dGluZ3MoKSA6IEV4Y2VwdGlvbnNFbmFibGVkKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdWxkVXNlRXhjZXB0aW9uVGFibGVzKGZhbHNlKSB7fQorICB9OworfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZS4KKworLy8gZXhjZXB0aW9uU2V0dGluZ3MoKSBleGlzdHMgdG8gc2hhcmUgdGhlIGxvZ2ljIGJldHdlZW4gLWNjMSBhbmQgbGlua2VyIGludm9jYXRpb25zLgorc3RhdGljIEV4Y2VwdGlvblNldHRpbmdzIGV4Y2VwdGlvblNldHRpbmdzKGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUpIHsKKyAgRXhjZXB0aW9uU2V0dGluZ3MgRVM7CisKKyAgLy8gQXJlIGV4Y2VwdGlvbnMgZW5hYmxlZCBieSBkZWZhdWx0PworICBFUy5FeGNlcHRpb25zRW5hYmxlZCA9IChUcmlwbGUuZ2V0QXJjaCgpICE9IGxsdm06OlRyaXBsZTo6eGNvcmUpOworCisgIC8vIFRoaXMga2VlcHMgdHJhY2sgb2Ygd2hldGhlciBleGNlcHRpb25zIHdlcmUgZXhwbGljaXRseSB0dXJuZWQgb24gb3Igb2ZmLgorICBib29sIERpZEhhdmVFeHBsaWNpdEV4Y2VwdGlvbkZsYWcgPSBmYWxzZTsKKworICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9mZXhjZXB0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX2V4Y2VwdGlvbnMpKSB7CisgICAgaWYgKEEtPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2ZleGNlcHRpb25zKSkKKyAgICAgIEVTLkV4Y2VwdGlvbnNFbmFibGVkID0gdHJ1ZTsKKyAgICBlbHNlCisgICAgICBFUy5FeGNlcHRpb25zRW5hYmxlZCA9IGZhbHNlOworCisgICAgRGlkSGF2ZUV4cGxpY2l0RXhjZXB0aW9uRmxhZyA9IHRydWU7CisgIH0KKworICAvLyBFeGNlcHRpb24gdGFibGVzIGFuZCBjbGVhbnVwcyBjYW4gYmUgZW5hYmxlZCB3aXRoIC1mZXhjZXB0aW9ucyBldmVuIGlmIHRoZQorICAvLyBsYW5ndWFnZSBpdHNlbGYgZG9lc24ndCBzdXBwb3J0IGV4Y2VwdGlvbnMuCisgIGlmIChFUy5FeGNlcHRpb25zRW5hYmxlZCAmJiBEaWRIYXZlRXhwbGljaXRFeGNlcHRpb25GbGFnKQorICAgIEVTLlNob3VsZFVzZUV4Y2VwdGlvblRhYmxlcyA9IHRydWU7CisKKyAgcmV0dXJuIEVTOworfQorCiAvLy8gYWRkRXhjZXB0aW9uQXJncyAtIEFkZHMgZXhjZXB0aW9uIHJlbGF0ZWQgYXJndW1lbnRzIHRvIHRoZSBkcml2ZXIgY29tbWFuZAogLy8vIGFyZ3VtZW50cy4gVGhlcmUncyBhIG1hc3RlciBmbGFnLCAtZmV4Y2VwdGlvbnMgYW5kIGFsc28gbGFuZ3VhZ2Ugc3BlY2lmaWMKIC8vLyBmbGFncyB0byBlbmFibGUvZGlzYWJsZSBDKysgYW5kIE9iamVjdGl2ZS1DIGV4Y2VwdGlvbnMuCkBAIC0xNTk5LDI4ICsxNjU5LDggQEAKICAgICByZXR1cm47CiAgIH0KIAotICAvLyBFeGNlcHRpb25zIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gIGJvb2wgRXhjZXB0aW9uc0VuYWJsZWQgPSB0cnVlOwotCi0gIC8vIFRoaXMga2VlcHMgdHJhY2sgb2Ygd2hldGhlciBleGNlcHRpb25zIHdlcmUgZXhwbGljaXRseSB0dXJuZWQgb24gb3Igb2ZmLgotICBib29sIERpZEhhdmVFeHBsaWNpdEV4Y2VwdGlvbkZsYWcgPSBmYWxzZTsKLQotICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9mZXhjZXB0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX2V4Y2VwdGlvbnMpKSB7Ci0gICAgaWYgKEEtPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2ZleGNlcHRpb25zKSkKLSAgICAgIEV4Y2VwdGlvbnNFbmFibGVkID0gdHJ1ZTsKLSAgICBlbHNlCi0gICAgICBFeGNlcHRpb25zRW5hYmxlZCA9IGZhbHNlOwotCi0gICAgRGlkSGF2ZUV4cGxpY2l0RXhjZXB0aW9uRmxhZyA9IHRydWU7Ci0gIH0KLQotICBib29sIFNob3VsZFVzZUV4Y2VwdGlvblRhYmxlcyA9IGZhbHNlOwotCi0gIC8vIEV4Y2VwdGlvbiB0YWJsZXMgYW5kIGNsZWFudXBzIGNhbiBiZSBlbmFibGVkIHdpdGggLWZleGNlcHRpb25zIGV2ZW4gaWYgdGhlCi0gIC8vIGxhbmd1YWdlIGl0c2VsZiBkb2Vzbid0IHN1cHBvcnQgZXhjZXB0aW9ucy4KLSAgaWYgKEV4Y2VwdGlvbnNFbmFibGVkICYmIERpZEhhdmVFeHBsaWNpdEV4Y2VwdGlvbkZsYWcpCi0gICAgU2hvdWxkVXNlRXhjZXB0aW9uVGFibGVzID0gdHJ1ZTsKKyAgIC8vIEdhdGhlciB0aGUgZXhjZXB0aW9uIHNldHRpbmdzIGZyb20gdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICBFeGNlcHRpb25TZXR0aW5ncyBFUyA9IGV4Y2VwdGlvblNldHRpbmdzKEFyZ3MsIFRyaXBsZSk7CiAKICAgLy8gT2JqLUMgZXhjZXB0aW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LCByZWdhcmRsZXNzIG9mIC1mZXhjZXB0aW9ucy4gVGhpcwogICAvLyBpcyBub3QgbmVjZXNzYXJpbHkgc2Vuc2libGUsIGJ1dCBmb2xsb3dzIEdDQy4KQEAgLTE2MzAsMTIgKzE2NzAsMTIgQEAKICAgICAgICAgICAgICAgICAgICB0cnVlKSkgewogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZm9iamMtZXhjZXB0aW9ucyIpOwogCi0gICAgU2hvdWxkVXNlRXhjZXB0aW9uVGFibGVzIHw9CisgICAgRVMuU2hvdWxkVXNlRXhjZXB0aW9uVGFibGVzIHw9CiAgICAgICBzaG91bGRVc2VFeGNlcHRpb25UYWJsZXNGb3JPYmpDRXhjZXB0aW9ucyhvYmpjUnVudGltZSwgVHJpcGxlKTsKICAgfQogCiAgIGlmICh0eXBlczo6aXNDWFgoSW5wdXRUeXBlKSkgewotICAgIGJvb2wgQ1hYRXhjZXB0aW9uc0VuYWJsZWQgPSBFeGNlcHRpb25zRW5hYmxlZDsKKyAgICBib29sIENYWEV4Y2VwdGlvbnNFbmFibGVkID0gRVMuRXhjZXB0aW9uc0VuYWJsZWQ7CiAKICAgICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9mY3h4X2V4Y2VwdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX2N4eF9leGNlcHRpb25zLApAQCAtMTY1MCwxMSArMTY5MCwxMSBAQAogICAgIGlmIChDWFhFeGNlcHRpb25zRW5hYmxlZCkgewogICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1mY3h4LWV4Y2VwdGlvbnMiKTsKIAotICAgICAgU2hvdWxkVXNlRXhjZXB0aW9uVGFibGVzID0gdHJ1ZTsKKyAgICAgIEVTLlNob3VsZFVzZUV4Y2VwdGlvblRhYmxlcyA9IHRydWU7CiAgICAgfQogICB9CiAKLSAgaWYgKFNob3VsZFVzZUV4Y2VwdGlvblRhYmxlcykKKyAgaWYgKEVTLlNob3VsZFVzZUV4Y2VwdGlvblRhYmxlcykKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWZleGNlcHRpb25zIik7CiB9CiAKQEAgLTE3NDIsNiArMTc4Miw3IEBACiAKICAgICAvLyBXaGVuIHVzaW5nIGFuIGludGVncmF0ZWQgYXNzZW1ibGVyLCB0cmFuc2xhdGUgLVdhLCBhbmQgLVhhc3NlbWJsZXIKICAgICAvLyBvcHRpb25zLgorICAgIGJvb2wgQ29tcHJlc3NEZWJ1Z1NlY3Rpb25zID0gZmFsc2U7CiAgICAgZm9yIChhcmdfaXRlcmF0b3IgaXQgPSBBcmdzLmZpbHRlcmVkX2JlZ2luKG9wdGlvbnM6Ok9QVF9XYV9DT01NQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX1hhc3NlbWJsZXIpLAogICAgICAgICAgICBpZSA9IEFyZ3MuZmlsdGVyZWRfZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CkBAIC0xNzY1LDYgKzE4MDYsMTIgQEAKICAgICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWZhdGFsLWFzc2VtYmxlci13YXJuaW5ncyIpOwogICAgICAgICB9IGVsc2UgaWYgKFZhbHVlID09ICItLW5vZXhlY3N0YWNrIikgewogICAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbW5vZXhlY3N0YWNrIik7CisgICAgICAgIH0gZWxzZSBpZiAoVmFsdWUgPT0gIi1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucyIgfHwKKyAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PSAiLS1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucyIpIHsKKyAgICAgICAgICBDb21wcmVzc0RlYnVnU2VjdGlvbnMgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKFZhbHVlID09ICItbm9jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucyIgfHwKKyAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PSAiLS1ub2NvbXByZXNzLWRlYnVnLXNlY3Rpb25zIikgeworICAgICAgICAgIENvbXByZXNzRGVidWdTZWN0aW9ucyA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgaWYgKFZhbHVlLnN0YXJ0c3dpdGgoIi1JIikpIHsKICAgICAgICAgICBDbWRBcmdzLnB1c2hfYmFjayhWYWx1ZS5kYXRhKCkpOwogICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY29uc3VtZSB0aGUgbmV4dCBhcmd1bWVudCBpZiB0aGUgY3VycmVudCBhcmcgaXMgYSBwbGFpbgpAQCAtMTc3NywzNiArMTgyNCw4OCBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQorICAgIGlmIChDb21wcmVzc0RlYnVnU2VjdGlvbnMpIHsKKyAgICAgIGlmIChsbHZtOjp6bGliOjppc0F2YWlsYWJsZSgpKQorICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zIik7CisgICAgICBlbHNlCisgICAgICAgIEQuRGlhZyhkaWFnOjp3YXJuX2RlYnVnX2NvbXByZXNzaW9uX3VuYXZhaWxhYmxlKTsKKyAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGFkZFByb2ZpbGVSVExpbnV4KAorLy8gVW50aWwgQVJNIGxpYnJhcmllcyBhcmUgYnVpbGQgc2VwYXJhdGVseSwgd2UgaGF2ZSB0aGVtIGFsbCBpbiBvbmUgbGlicmFyeQorc3RhdGljIFN0cmluZ1JlZiBnZXRBcmNoTmFtZUZvckNvbXBpbGVyUlRMaWIoY29uc3QgVG9vbENoYWluICZUQykgeworICBpZiAoVEMuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtIHx8CisgICAgICBUQy5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm1lYikKKyAgICByZXR1cm4gImFybSI7CisgIGVsc2UKKyAgICByZXR1cm4gVEMuZ2V0QXJjaE5hbWUoKTsKK30KKworc3RhdGljIFNtYWxsU3RyaW5nPDEyOD4gZ2V0Q29tcGlsZXJSVExpYkRpcihjb25zdCBUb29sQ2hhaW4gJlRDKSB7CisgIC8vIFRoZSBydW50aW1lcyBhcmUgbG9jYXRlZCBpbiB0aGUgT1Mtc3BlY2lmaWMgcmVzb3VyY2UgZGlyZWN0b3J5LgorICBTbWFsbFN0cmluZzwxMjg+IFJlcyhUQy5nZXREcml2ZXIoKS5SZXNvdXJjZURpcik7CisgIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlID0gVEMuZ2V0VHJpcGxlKCk7CisgIC8vIFRDLmdldE9TKCkgeWllbGQgImZyZWVic2QxMC4wIiB3aGVyZWFzICJmcmVlYnNkIiBpcyBleHBlY3RlZC4KKyAgU3RyaW5nUmVmIE9TTGliTmFtZSA9IChUcmlwbGUuZ2V0T1MoKSA9PSBsbHZtOjpUcmlwbGU6OkZyZWVCU0QpID8KKyAgICAiZnJlZWJzZCIgOiBUQy5nZXRPUygpOworICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChSZXMsICJsaWIiLCBPU0xpYk5hbWUpOworICByZXR1cm4gUmVzOworfQorCisvLyBUaGlzIGFkZHMgdGhlIHN0YXRpYyBsaWJjbGFuZ19ydC5hcmNoLmEgZGlyZWN0bHkgdG8gdGhlIGNvbW1hbmQgbGluZQorLy8gRklYTUU6IE1ha2Ugc3VyZSB3ZSBjYW4gYWxzbyBlbWl0IHNoYXJlZCBvYmplY3RzIGlmIHRoZXkncmUgcmVxdWVzdGVkCisvLyBhbmQgYXZhaWxhYmxlLCBjaGVjayBmb3IgcG9zc2libGUgZXJyb3JzLCBldGMuCitzdGF0aWMgdm9pZCBhZGRDbGFuZ1JUTGludXgoCisgICAgY29uc3QgVG9vbENoYWluICZUQywgY29uc3QgQXJnTGlzdCAmQXJncywgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgeworICBTbWFsbFN0cmluZzwxMjg+IExpYkNsYW5nUlQgPSBnZXRDb21waWxlclJUTGliRGlyKFRDKTsKKyAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoTGliQ2xhbmdSVCwKKyAgICAgIFR3aW5lKCJsaWJjbGFuZ19ydC4iKSArIGdldEFyY2hOYW1lRm9yQ29tcGlsZXJSVExpYihUQykgKyAiLmEiKTsKKworICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoTGliQ2xhbmdSVCkpOworICBDbWRBcmdzLnB1c2hfYmFjaygiLWxnY2NfcyIpOworICBpZiAoVEMuZ2V0RHJpdmVyKCkuQ0NDSXNDWFgoKSkKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxnY2NfZWgiKTsKK30KKworc3RhdGljIHZvaWQgYWRkUHJvZmlsZVJUKAogICAgIGNvbnN0IFRvb2xDaGFpbiAmVEMsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIHsKICAgaWYgKCEoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2Zwcm9maWxlX2FyY3MpIHx8CiAgICAgICAgIEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mcHJvZmlsZV9nZW5lcmF0ZSkgfHwKKyAgICAgICAgQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2Zwcm9maWxlX2luc3RyX2dlbmVyYXRlKSB8fAogICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZmNyZWF0ZV9wcm9maWxlKSB8fAogICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfY292ZXJhZ2UpKSkKICAgICByZXR1cm47CiAKLSAgLy8gVGhlIHByb2ZpbGUgcnVudGltZSBpcyBsb2NhdGVkIGluIHRoZSBMaW51eCBsaWJyYXJ5IGRpcmVjdG9yeSBhbmQgaGFzIG5hbWUKLSAgLy8gImxpYmNsYW5nX3J0LnByb2ZpbGUtPEFyY2hOYW1lPi5hIi4KLSAgU21hbGxTdHJpbmc8MTI4PiBMaWJQcm9maWxlKFRDLmdldERyaXZlcigpLlJlc291cmNlRGlyKTsKLSAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoCi0gICAgICBMaWJQcm9maWxlLCAibGliIiwgImxpbnV4IiwKLSAgICAgIFR3aW5lKCJsaWJjbGFuZ19ydC5wcm9maWxlLSIpICsgVEMuZ2V0QXJjaE5hbWUoKSArICIuYSIpOworICBTbWFsbFN0cmluZzwxMjg+IExpYlByb2ZpbGUgPSBnZXRDb21waWxlclJUTGliRGlyKFRDKTsKKyAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoTGliUHJvZmlsZSwKKyAgICAgIFR3aW5lKCJsaWJjbGFuZ19ydC5wcm9maWxlLSIpICsgZ2V0QXJjaE5hbWVGb3JDb21waWxlclJUTGliKFRDKSArICIuYSIpOwogCiAgIENtZEFyZ3MucHVzaF9iYWNrKEFyZ3MuTWFrZUFyZ1N0cmluZyhMaWJQcm9maWxlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGFkZFNhbml0aXplclJUTGlua0ZsYWdzTGludXgoCi0gICAgY29uc3QgVG9vbENoYWluICZUQywgY29uc3QgQXJnTGlzdCAmQXJncywgQXJnU3RyaW5nTGlzdCAmQ21kQXJncywKLSAgICBjb25zdCBTdHJpbmdSZWYgU2FuaXRpemVyLCBib29sIEJlZm9yZUxpYlN0ZENYWCwKLSAgICBib29sIEV4cG9ydFN5bWJvbHMgPSB0cnVlKSB7Ci0gIC8vIFNhbml0aXplciBydW50aW1lIGlzIGxvY2F0ZWQgaW4gdGhlIExpbnV4IGxpYnJhcnkgZGlyZWN0b3J5IGFuZAotICAvLyBoYXMgbmFtZSAibGliY2xhbmdfcnQuPFNhbml0aXplcj4tPEFyY2hOYW1lPi5hIi4KLSAgU21hbGxTdHJpbmc8MTI4PiBMaWJTYW5pdGl6ZXIoVEMuZ2V0RHJpdmVyKCkuUmVzb3VyY2VEaXIpOwotICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZCgKLSAgICAgIExpYlNhbml0aXplciwgImxpYiIsICJsaW51eCIsCi0gICAgICAoVHdpbmUoImxpYmNsYW5nX3J0LiIpICsgU2FuaXRpemVyICsgIi0iICsgVEMuZ2V0QXJjaE5hbWUoKSArICIuYSIpKTsKK3N0YXRpYyBTbWFsbFN0cmluZzwxMjg+IGdldFNhbml0aXplclJUTGliTmFtZShjb25zdCBUb29sQ2hhaW4gJlRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ1JlZiBTYW5pdGl6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaGFyZWQpIHsKKyAgLy8gU2FuaXRpemVyIHJ1bnRpbWUgaGFzIG5hbWUgImxpYmNsYW5nX3J0LjxTYW5pdGl6ZXI+LTxBcmNoTmFtZT4ue2Esc299IgorICAvLyAob3IgImxpYmNsYW5nX3J0LjxTYW5pdGl6ZXI+LTxBcmNoTmFtZT4tYW5kcm9pZC5zbyBmb3IgQW5kcm9pZCkKKyAgY29uc3QgY2hhciAqRW52U3VmZml4ID0KKyAgICBUQy5nZXRUcmlwbGUoKS5nZXRFbnZpcm9ubWVudCgpID09IGxsdm06OlRyaXBsZTo6QW5kcm9pZCA/ICAiLWFuZHJvaWQiIDogIiI7CisgIFNtYWxsU3RyaW5nPDEyOD4gTGliU2FuaXRpemVyID0gZ2V0Q29tcGlsZXJSVExpYkRpcihUQyk7CisgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKExpYlNhbml0aXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoImxpYmNsYW5nX3J0LiIpICsgU2FuaXRpemVyICsgIi0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFyY2hOYW1lRm9yQ29tcGlsZXJSVExpYihUQykgKyBFbnZTdWZmaXggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNoYXJlZCA/ICIuc28iIDogIi5hIikpOworICByZXR1cm4gTGliU2FuaXRpemVyOworfQorCitzdGF0aWMgdm9pZCBhZGRTYW5pdGl6ZXJSVExpbmtGbGFncyhjb25zdCBUb29sQ2hhaW4gJlRDLCBjb25zdCBBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ1JlZiBTYW5pdGl6ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEJlZm9yZUxpYlN0ZENYWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwb3J0U3ltYm9scyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExpbmtEZXBzID0gdHJ1ZSkgeworICBTbWFsbFN0cmluZzwxMjg+IExpYlNhbml0aXplciA9CisgICAgICBnZXRTYW5pdGl6ZXJSVExpYk5hbWUoVEMsIFNhbml0aXplciwgLypTaGFyZWQqLyBmYWxzZSk7CiAKICAgLy8gU2FuaXRpemVyIHJ1bnRpbWUgbWF5IG5lZWQgdG8gY29tZSBiZWZvcmUgLWxzdGRjKysgKG9yIC1sYysrLCBsaWJzdGRjKysuYSwKICAgLy8gZXRjLikgc28gdGhhdCB0aGUgbGlua2VyIHBpY2tzIGN1c3RvbSB2ZXJzaW9ucyBvZiB0aGUgZ2xvYmFsICdvcGVyYXRvcgpAQCAtMTgyMiwxMCArMTkyMSwxNSBAQAogICBDbWRBcmdzLmluc2VydChCZWZvcmVMaWJTdGRDWFggPyBDbWRBcmdzLmJlZ2luKCkgOiBDbWRBcmdzLmVuZCgpLAogICAgICAgICAgICAgICAgICBMaWJTYW5pdGl6ZXJBcmdzLmJlZ2luKCksIExpYlNhbml0aXplckFyZ3MuZW5kKCkpOwogCi0gIENtZEFyZ3MucHVzaF9iYWNrKCItbHB0aHJlYWQiKTsKLSAgQ21kQXJncy5wdXNoX2JhY2soIi1scnQiKTsKLSAgQ21kQXJncy5wdXNoX2JhY2soIi1sZGwiKTsKLSAgQ21kQXJncy5wdXNoX2JhY2soIi1sbSIpOworICBpZiAoTGlua0RlcHMpIHsKKyAgICAvLyBMaW5rIHNhbml0aXplciBkZXBlbmRlbmNpZXMgZXhwbGljaXRseQorICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbHB0aHJlYWQiKTsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxydCIpOworICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbG0iKTsKKyAgICAvLyBUaGVyZSdzIG5vIGxpYmRsIG9uIEZyZWVCU0QuCisgICAgaWYgKFRDLmdldFRyaXBsZSgpLmdldE9TKCkgIT0gbGx2bTo6VHJpcGxlOjpGcmVlQlNEKQorICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sZGwiKTsKKyAgfQogCiAgIC8vIElmIHBvc3NpYmxlLCB1c2UgYSBkeW5hbWljIHN5bWJvbHMgZmlsZSB0byBleHBvcnQgdGhlIHN5bWJvbHMgZnJvbSB0aGUKICAgLy8gcnVudGltZSBsaWJyYXJ5LiBJZiB3ZSBjYW4ndCBkbyBzbywgdXNlIC1leHBvcnQtZHluYW1pYyBpbnN0ZWFkIHRvIGV4cG9ydApAQCAtMTg0MSw2NiArMTk0NSw5MyBAQAogCiAvLy8gSWYgQWRkcmVzc1Nhbml0aXplciBpcyBlbmFibGVkLCBhZGQgYXBwcm9wcmlhdGUgbGlua2VyIGZsYWdzIChMaW51eCkuCiAvLy8gVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIHdlIGFkZCB0aGUgQyBydW4tdGltZSAobWFsbG9jLCBldGMpLgotc3RhdGljIHZvaWQgYWRkQXNhblJUTGludXgoY29uc3QgVG9vbENoYWluICZUQywgY29uc3QgQXJnTGlzdCAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIHsKLSAgaWYgKFRDLmdldFRyaXBsZSgpLmdldEVudmlyb25tZW50KCkgPT0gbGx2bTo6VHJpcGxlOjpBbmRyb2lkKSB7Ci0gICAgU21hbGxTdHJpbmc8MTI4PiBMaWJBc2FuKFRDLmdldERyaXZlcigpLlJlc291cmNlRGlyKTsKLSAgICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChMaWJBc2FuLCAibGliIiwgImxpbnV4IiwKLSAgICAgICAgKFR3aW5lKCJsaWJjbGFuZ19ydC5hc2FuLSIpICsKLSAgICAgICAgICAgIFRDLmdldEFyY2hOYW1lKCkgKyAiLWFuZHJvaWQuc28iKSk7Ci0gICAgQ21kQXJncy5pbnNlcnQoQ21kQXJncy5iZWdpbigpLCBBcmdzLk1ha2VBcmdTdHJpbmcoTGliQXNhbikpOwotICB9IGVsc2UgewotICAgIGlmICghQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3NoYXJlZCkpCi0gICAgICBhZGRTYW5pdGl6ZXJSVExpbmtGbGFnc0xpbnV4KFRDLCBBcmdzLCBDbWRBcmdzLCAiYXNhbiIsIHRydWUpOworc3RhdGljIHZvaWQgYWRkQXNhblJUKGNvbnN0IFRvb2xDaGFpbiAmVEMsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncywgYm9vbCBTaGFyZWQpIHsKKyAgaWYgKFNoYXJlZCkgeworICAgIC8vIExpbmsgZHluYW1pYyBydW50aW1lIGlmIG5lY2Vzc2FyeS4KKyAgICBTbWFsbFN0cmluZzwxMjg+IExpYlNhbml0aXplciA9CisgICAgICAgIGdldFNhbml0aXplclJUTGliTmFtZShUQywgImFzYW4iLCBTaGFyZWQpOworICAgIENtZEFyZ3MuaW5zZXJ0KENtZEFyZ3MuYmVnaW4oKSwgQXJncy5NYWtlQXJnU3RyaW5nKExpYlNhbml0aXplcikpOwogICB9CisKKyAgLy8gRG8gbm90IGxpbmsgc3RhdGljIHJ1bnRpbWUgdG8gRFNPcyBvciBpZiBjb21waWxpbmcgZm9yIEFuZHJvaWQuCisgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfc2hhcmVkKSB8fAorICAgICAgKFRDLmdldFRyaXBsZSgpLmdldEVudmlyb25tZW50KCkgPT0gbGx2bTo6VHJpcGxlOjpBbmRyb2lkKSkKKyAgICByZXR1cm47CisKKyAgY29uc3QgY2hhciAqTGliQXNhblN0YXRpY1BhcnQgPSBTaGFyZWQgPyAiYXNhbi1wcmVpbml0IiA6ICJhc2FuIjsKKyAgYWRkU2FuaXRpemVyUlRMaW5rRmxhZ3MoVEMsIEFyZ3MsIENtZEFyZ3MsIExpYkFzYW5TdGF0aWNQYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAvKkJlZm9yZUxpYlN0ZENYWCovIHRydWUsIC8qRXhwb3J0U3ltYm9scyovICFTaGFyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qTGlua0RlcHMqLyAhU2hhcmVkKTsKIH0KIAogLy8vIElmIFRocmVhZFNhbml0aXplciBpcyBlbmFibGVkLCBhZGQgYXBwcm9wcmlhdGUgbGlua2VyIGZsYWdzIChMaW51eCkuCiAvLy8gVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIHdlIGFkZCB0aGUgQyBydW4tdGltZSAobWFsbG9jLCBldGMpLgotc3RhdGljIHZvaWQgYWRkVHNhblJUTGludXgoY29uc3QgVG9vbENoYWluICZUQywgY29uc3QgQXJnTGlzdCAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIHsKK3N0YXRpYyB2b2lkIGFkZFRzYW5SVChjb25zdCBUb29sQ2hhaW4gJlRDLCBjb25zdCBBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIHsKICAgaWYgKCFBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfc2hhcmVkKSkKLSAgICBhZGRTYW5pdGl6ZXJSVExpbmtGbGFnc0xpbnV4KFRDLCBBcmdzLCBDbWRBcmdzLCAidHNhbiIsIHRydWUpOworICAgIGFkZFNhbml0aXplclJUTGlua0ZsYWdzKFRDLCBBcmdzLCBDbWRBcmdzLCAidHNhbiIsIHRydWUpOwogfQogCiAvLy8gSWYgTWVtb3J5U2FuaXRpemVyIGlzIGVuYWJsZWQsIGFkZCBhcHByb3ByaWF0ZSBsaW5rZXIgZmxhZ3MgKExpbnV4KS4KIC8vLyBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgd2UgYWRkIHRoZSBDIHJ1bi10aW1lIChtYWxsb2MsIGV0YykuCi1zdGF0aWMgdm9pZCBhZGRNc2FuUlRMaW51eChjb25zdCBUb29sQ2hhaW4gJlRDLCBjb25zdCBBcmdMaXN0ICZBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgeworc3RhdGljIHZvaWQgYWRkTXNhblJUKGNvbnN0IFRvb2xDaGFpbiAmVEMsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgewogICBpZiAoIUFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zaGFyZWQpKQotICAgIGFkZFNhbml0aXplclJUTGlua0ZsYWdzTGludXgoVEMsIEFyZ3MsIENtZEFyZ3MsICJtc2FuIiwgdHJ1ZSk7CisgICAgYWRkU2FuaXRpemVyUlRMaW5rRmxhZ3MoVEMsIEFyZ3MsIENtZEFyZ3MsICJtc2FuIiwgdHJ1ZSk7CiB9CiAKIC8vLyBJZiBMZWFrU2FuaXRpemVyIGlzIGVuYWJsZWQsIGFkZCBhcHByb3ByaWF0ZSBsaW5rZXIgZmxhZ3MgKExpbnV4KS4KIC8vLyBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgd2UgYWRkIHRoZSBDIHJ1bi10aW1lIChtYWxsb2MsIGV0YykuCi1zdGF0aWMgdm9pZCBhZGRMc2FuUlRMaW51eChjb25zdCBUb29sQ2hhaW4gJlRDLCBjb25zdCBBcmdMaXN0ICZBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgeworc3RhdGljIHZvaWQgYWRkTHNhblJUKGNvbnN0IFRvb2xDaGFpbiAmVEMsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgewogICBpZiAoIUFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zaGFyZWQpKQotICAgIGFkZFNhbml0aXplclJUTGlua0ZsYWdzTGludXgoVEMsIEFyZ3MsIENtZEFyZ3MsICJsc2FuIiwgdHJ1ZSk7CisgICAgYWRkU2FuaXRpemVyUlRMaW5rRmxhZ3MoVEMsIEFyZ3MsIENtZEFyZ3MsICJsc2FuIiwgdHJ1ZSk7CiB9CiAKIC8vLyBJZiBVbmRlZmluZWRCZWhhdmlvclNhbml0aXplciBpcyBlbmFibGVkLCBhZGQgYXBwcm9wcmlhdGUgbGlua2VyIGZsYWdzCiAvLy8gKExpbnV4KS4KLXN0YXRpYyB2b2lkIGFkZFVic2FuUlRMaW51eChjb25zdCBUb29sQ2hhaW4gJlRDLCBjb25zdCBBcmdMaXN0ICZBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MsIGJvb2wgSXNDWFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNPdGhlclNhbml0aXplclJ0KSB7CitzdGF0aWMgdm9pZCBhZGRVYnNhblJUKGNvbnN0IFRvb2xDaGFpbiAmVEMsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MsIGJvb2wgSXNDWFgsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzT3RoZXJTYW5pdGl6ZXJSdCkgewogICAvLyBOZWVkIGEgY29weSBvZiBzYW5pdGl6ZXJfY29tbW9uLiBUaGlzIGNvdWxkIGNvbWUgZnJvbSBhbm90aGVyIHNhbml0aXplcgogICAvLyBydW50aW1lOyBpZiB3ZSdyZSBub3QgaW5jbHVkaW5nIG9uZSwgaW5jbHVkZSBvdXIgb3duIGNvcHkuCiAgIGlmICghSGFzT3RoZXJTYW5pdGl6ZXJSdCkKLSAgICBhZGRTYW5pdGl6ZXJSVExpbmtGbGFnc0xpbnV4KFRDLCBBcmdzLCBDbWRBcmdzLCAic2FuIiwgdHJ1ZSwgZmFsc2UpOworICAgIGFkZFNhbml0aXplclJUTGlua0ZsYWdzKFRDLCBBcmdzLCBDbWRBcmdzLCAic2FuIiwgdHJ1ZSwgZmFsc2UpOwogCi0gIGFkZFNhbml0aXplclJUTGlua0ZsYWdzTGludXgoVEMsIEFyZ3MsIENtZEFyZ3MsICJ1YnNhbiIsIGZhbHNlKTsKKyAgYWRkU2FuaXRpemVyUlRMaW5rRmxhZ3MoVEMsIEFyZ3MsIENtZEFyZ3MsICJ1YnNhbiIsIGZhbHNlKTsKIAogICAvLyBPbmx5IGluY2x1ZGUgdGhlIGJpdHMgb2YgdGhlIHJ1bnRpbWUgd2hpY2ggbmVlZCBhIEMrKyBBQkkgbGlicmFyeSBpZgogICAvLyB3ZSdyZSBsaW5raW5nIGluIEMrKyBtb2RlLgogICBpZiAoSXNDWFgpCi0gICAgYWRkU2FuaXRpemVyUlRMaW5rRmxhZ3NMaW51eChUQywgQXJncywgQ21kQXJncywgInVic2FuX2N4eCIsIGZhbHNlKTsKKyAgICBhZGRTYW5pdGl6ZXJSVExpbmtGbGFncyhUQywgQXJncywgQ21kQXJncywgInVic2FuX2N4eCIsIGZhbHNlKTsKIH0KIAotc3RhdGljIHZvaWQgYWRkRGZzYW5SVExpbnV4KGNvbnN0IFRvb2xDaGFpbiAmVEMsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgeworc3RhdGljIHZvaWQgYWRkRGZzYW5SVChjb25zdCBUb29sQ2hhaW4gJlRDLCBjb25zdCBBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICBBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSB7CiAgIGlmICghQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3NoYXJlZCkpCi0gICAgYWRkU2FuaXRpemVyUlRMaW5rRmxhZ3NMaW51eChUQywgQXJncywgQ21kQXJncywgImRmc2FuIiwgdHJ1ZSk7CisgICAgYWRkU2FuaXRpemVyUlRMaW5rRmxhZ3MoVEMsIEFyZ3MsIENtZEFyZ3MsICJkZnNhbiIsIHRydWUpOworfQorCisvLyBTaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB3ZSBhZGQgQysrIEFCSSBsaWJyYXJ5Lgorc3RhdGljIHZvaWQgYWRkU2FuaXRpemVyUnVudGltZXMoY29uc3QgVG9vbENoYWluICZUQywgY29uc3QgQXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIHsKKyAgY29uc3QgU2FuaXRpemVyQXJncyAmU2FuaXRpemUgPSBUQy5nZXRTYW5pdGl6ZXJBcmdzKCk7CisgIGNvbnN0IERyaXZlciAmRCA9IFRDLmdldERyaXZlcigpOworICBpZiAoU2FuaXRpemUubmVlZHNVYnNhblJ0KCkpCisgICAgYWRkVWJzYW5SVChUQywgQXJncywgQ21kQXJncywgRC5DQ0NJc0NYWCgpLAorICAgICAgICAgICAgICAgICAgICBTYW5pdGl6ZS5uZWVkc0FzYW5SdCgpIHx8IFNhbml0aXplLm5lZWRzVHNhblJ0KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgU2FuaXRpemUubmVlZHNNc2FuUnQoKSB8fCBTYW5pdGl6ZS5uZWVkc0xzYW5SdCgpKTsKKyAgaWYgKFNhbml0aXplLm5lZWRzQXNhblJ0KCkpCisgICAgYWRkQXNhblJUKFRDLCBBcmdzLCBDbWRBcmdzLCBTYW5pdGl6ZS5uZWVkc1NoYXJlZEFzYW5SdCgpKTsKKyAgaWYgKFNhbml0aXplLm5lZWRzVHNhblJ0KCkpCisgICAgYWRkVHNhblJUKFRDLCBBcmdzLCBDbWRBcmdzKTsKKyAgaWYgKFNhbml0aXplLm5lZWRzTXNhblJ0KCkpCisgICAgYWRkTXNhblJUKFRDLCBBcmdzLCBDbWRBcmdzKTsKKyAgaWYgKFNhbml0aXplLm5lZWRzTHNhblJ0KCkpCisgICAgYWRkTHNhblJUKFRDLCBBcmdzLCBDbWRBcmdzKTsKKyAgaWYgKFNhbml0aXplLm5lZWRzRGZzYW5SdCgpKQorICAgIGFkZERmc2FuUlQoVEMsIEFyZ3MsIENtZEFyZ3MpOwogfQogCiBzdGF0aWMgYm9vbCBzaG91bGRVc2VGcmFtZVBvaW50ZXJGb3JUYXJnZXQoY29uc3QgQXJnTGlzdCAmQXJncywKQEAgLTE5OTUsMTMgKzIxMjYsNiBAQAogICBDLmFkZENvbW1hbmQobmV3IENvbW1hbmQoSkEsIFQsIEV4ZWMsIFN0cmlwQXJncykpOwogfQogCi1zdGF0aWMgYm9vbCBpc09wdGltaXphdGlvbkxldmVsRmFzdChjb25zdCBBcmdMaXN0ICZBcmdzKSB7Ci0gIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX09fR3JvdXApKQotICAgIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9PZmFzdCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCiAvLy8gXGJyaWVmIFZlY3Rvcml6ZSBhdCBhbGwgb3B0aW1pemF0aW9uIGxldmVscyBncmVhdGVyIHRoYW4gMSBleGNlcHQgZm9yIC1Pei4KIHN0YXRpYyBib29sIHNob3VsZEVuYWJsZVZlY3Rvcml6ZXJBdE9MZXZlbChjb25zdCBBcmdMaXN0ICZBcmdzKSB7CiAgIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX09fR3JvdXApKSB7CkBAIC0yMDMzLDYgKzIxNTcsMjEgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCisvLy8gQWRkIC14IGxhbmcgdG8gXHAgQ21kQXJncyBmb3IgXHAgSW5wdXQuCitzdGF0aWMgdm9pZCBhZGREYXNoWEZvcklucHV0KGNvbnN0IEFyZ0xpc3QgJkFyZ3MsIGNvbnN0IElucHV0SW5mbyAmSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIHsKKyAgLy8gV2hlbiB1c2luZyAtdmVyaWZ5LXBjaCwgd2UgZG9uJ3Qgd2FudCB0byBwcm92aWRlIHRoZSB0eXBlCisgIC8vICdwcmVjb21waWxlZC1oZWFkZXInIGlmIGl0IHdhcyBpbmZlcnJlZCBmcm9tIHRoZSBmaWxlIGV4dGVuc2lvbgorICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3ZlcmlmeV9wY2gpICYmIElucHV0LmdldFR5cGUoKSA9PSB0eXBlczo6VFlfUENIKQorICAgIHJldHVybjsKKworICBDbWRBcmdzLnB1c2hfYmFjaygiLXgiKTsKKyAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9yZXdyaXRlX29iamMpKQorICAgIENtZEFyZ3MucHVzaF9iYWNrKHR5cGVzOjpnZXRUeXBlTmFtZSh0eXBlczo6VFlfUFBfT2JqQ1hYKSk7CisgIGVsc2UKKyAgICBDbWRBcmdzLnB1c2hfYmFjayh0eXBlczo6Z2V0VHlwZU5hbWUoSW5wdXQuZ2V0VHlwZSgpKSk7Cit9CisKIHZvaWQgQ2xhbmc6OkNvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCkBAIC0yMDQzLDYgKzIxODIsMTAgQEAKICAgY29uc3QgRHJpdmVyICZEID0gZ2V0VG9vbENoYWluKCkuZ2V0RHJpdmVyKCk7CiAgIEFyZ1N0cmluZ0xpc3QgQ21kQXJnczsKIAorICBib29sIElzV2luZG93c0dOVSA9IGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLmlzV2luZG93c0dOVUVudmlyb25tZW50KCk7CisgIGJvb2wgSXNXaW5kb3dzQ3lnbnVzID0gZ2V0VG9vbENoYWluKCkuZ2V0VHJpcGxlKCkuaXNXaW5kb3dzQ3lnd2luRW52aXJvbm1lbnQoKTsKKyAgYm9vbCBJc1dpbmRvd3NNU1ZDID0gZ2V0VG9vbENoYWluKCkuZ2V0VHJpcGxlKCkuaXNXaW5kb3dzTVNWQ0Vudmlyb25tZW50KCk7CisKICAgYXNzZXJ0KElucHV0cy5zaXplKCkgPT0gMSAmJiAiVW5hYmxlIHRvIGhhbmRsZSBtdWx0aXBsZSBpbnB1dHMuIik7CiAKICAgLy8gSW52b2tlIG91cnNlbHZlcyBpbiAtY2MxIG1vZGUuCkBAIC0yMDU1LDYgKzIxOTgsMTEgQEAKICAgc3RkOjpzdHJpbmcgVHJpcGxlU3RyID0gZ2V0VG9vbENoYWluKCkuQ29tcHV0ZUVmZmVjdGl2ZUNsYW5nVHJpcGxlKEFyZ3MpOwogICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoVHJpcGxlU3RyKSk7CiAKKyAgLy8gUHVzaCBhbGwgZGVmYXVsdCB3YXJuaW5nIGFyZ3VtZW50cyB0aGF0IGFyZSBzcGVjaWZpYyB0bworICAvLyB0aGUgZ2l2ZW4gdGFyZ2V0LiAgVGhlc2UgY29tZSBiZWZvcmUgdXNlciBwcm92aWRlZCB3YXJuaW5nIG9wdGlvbnMKKyAgLy8gYXJlIHByb3ZpZGVkLgorICBnZXRUb29sQ2hhaW4oKS5hZGRDbGFuZ1dhcm5pbmdPcHRpb25zKENtZEFyZ3MpOworCiAgIC8vIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uLgogICBSZXdyaXRlS2luZCByZXdyaXRlS2luZCA9IFJLX05vbmU7CiAgIApAQCAtMjA4OSw2ICsyMjM3LDggQEAKICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZW1pdC1wY2giKTsKICAgICBlbHNlCiAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWVtaXQtcHRoIik7CisgIH0gZWxzZSBpZiAoaXNhPFZlcmlmeVBDSEpvYkFjdGlvbj4oSkEpKSB7CisgICAgQ21kQXJncy5wdXNoX2JhY2soIi12ZXJpZnktcGNoIik7CiAgIH0gZWxzZSB7CiAgICAgYXNzZXJ0KGlzYTxDb21waWxlSm9iQWN0aW9uPihKQSkgJiYgIkludmFsaWQgYWN0aW9uIGZvciBjbGFuZyB0b29sLiIpOwogCkBAIC0yMTQ5LDcgKzIyOTksNyBAQAogICAgIGlmICghQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX19hbmFseXplcl9ub19kZWZhdWx0X2NoZWNrcykpIHsKICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItYW5hbHl6ZXItY2hlY2tlcj1jb3JlIik7CiAKLSAgICAgIGlmIChnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKS5nZXRPUygpICE9IGxsdm06OlRyaXBsZTo6V2luMzIpCisgICAgICBpZiAoIUlzV2luZG93c01TVkMpCiAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItYW5hbHl6ZXItY2hlY2tlcj11bml4Iik7CiAKICAgICAgIGlmIChnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKS5nZXRWZW5kb3IoKSA9PSBsbHZtOjpUcmlwbGU6OkFwcGxlKQpAQCAtMjE5Miw2ICsyMzQyLDMxIEBACiAgIGJvb2wgUElDID0gUElFIHx8IGdldFRvb2xDaGFpbigpLmlzUElDRGVmYXVsdCgpOwogICBib29sIElzUElDTGV2ZWxUd28gPSBQSUM7CiAKKyAgLy8gQW5kcm9pZC1zcGVjaWZpYyBkZWZhdWx0cyBmb3IgUElDL1BJRQorICBpZiAoZ2V0VG9vbENoYWluKCkuZ2V0VHJpcGxlKCkuZ2V0RW52aXJvbm1lbnQoKSA9PSBsbHZtOjpUcmlwbGU6OkFuZHJvaWQpIHsKKyAgICBzd2l0Y2ggKGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLmdldEFyY2goKSkgeworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm06CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OmFybWViOgorICAgIGNhc2UgbGx2bTo6VHJpcGxlOjp0aHVtYjoKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6dGh1bWJlYjoKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6bWlwczoKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6bWlwc2VsOgorICAgIGNhc2UgbGx2bTo6VHJpcGxlOjptaXBzNjQ6CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6Om1pcHM2NGVsOgorICAgICAgUElDID0gdHJ1ZTsgLy8gIi1mcGljIgorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2OgorICAgIGNhc2UgbGx2bTo6VHJpcGxlOjp4ODZfNjQ6CisgICAgICBQSUMgPSB0cnVlOyAvLyAiLWZQSUMiCisgICAgICBJc1BJQ0xldmVsVHdvID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCiAgIC8vIEZvciB0aGUgUElDIGFuZCBQSUUgZmxhZyBvcHRpb25zLCB0aGlzIGxvZ2ljIGlzIGRpZmZlcmVudCBmcm9tIHRoZQogICAvLyBsZWdhY3kgbG9naWMgaW4gdmVyeSBvbGQgdmVyc2lvbnMgb2YgR0NDLCBhcyB0aGF0IGxvZ2ljIHdhcyBqdXN0CiAgIC8vIGEgYnVnIG5vIG9uZSBoYWQgZXZlciBmaXhlZC4gVGhpcyBsb2dpYyBpcyBib3RoIG1vcmUgcmF0aW9uYWwgYW5kCkBAIC0yMjMyLDggKzI0MDcsOCBAQAogICAvLyBOb3RlIHRoYXQgdGhlc2UgZmxhZ3MgYXJlIHRydW1wLWNhcmRzLiBSZWdhcmRsZXNzIG9mIHRoZSBvcmRlciB3LnIudC4gdGhlCiAgIC8vIFBJQyBvciBQSUUgb3B0aW9ucyBhYm92ZSwgaWYgdGhlc2Ugc2hvdyB1cCwgUElDIGlzIGRpc2FibGVkLgogICBsbHZtOjpUcmlwbGUgVHJpcGxlKFRyaXBsZVN0cik7Ci0gIGlmIChLZXJuZWxPcktleHQgJiYKLSAgICAgICghVHJpcGxlLmlzaU9TKCkgfHwgVHJpcGxlLmlzT1NWZXJzaW9uTFQoNikpKQorICBpZiAoS2VybmVsT3JLZXh0ICYmICghVHJpcGxlLmlzaU9TKCkgfHwgVHJpcGxlLmlzT1NWZXJzaW9uTFQoNikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgVHJpcGxlLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybTY0KSkKICAgICBQSUMgPSBQSUUgPSBmYWxzZTsKICAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zdGF0aWMpKQogICAgIFBJQyA9IFBJRSA9IGZhbHNlOwpAQCAtMjQ2NSwxMiArMjY0MCwxNyBAQAogCiAgIC8vIERlY2lkZSB3aGV0aGVyIHRvIHVzZSB2ZXJib3NlIGFzbS4gVmVyYm9zZSBhc3NlbWJseSBpcyB0aGUgZGVmYXVsdCBvbgogICAvLyB0b29sY2hhaW5zIHdoaWNoIGhhdmUgdGhlIGludGVncmF0ZWQgYXNzZW1ibGVyIG9uIGJ5IGRlZmF1bHQuCi0gIGJvb2wgSXNWZXJib3NlQXNtRGVmYXVsdCA9IGdldFRvb2xDaGFpbigpLklzSW50ZWdyYXRlZEFzc2VtYmxlckRlZmF1bHQoKTsKKyAgYm9vbCBJc0ludGVncmF0ZWRBc3NlbWJsZXJEZWZhdWx0ID0KKyAgICAgIGdldFRvb2xDaGFpbigpLklzSW50ZWdyYXRlZEFzc2VtYmxlckRlZmF1bHQoKTsKICAgaWYgKEFyZ3MuaGFzRmxhZyhvcHRpb25zOjpPUFRfZnZlcmJvc2VfYXNtLCBvcHRpb25zOjpPUFRfZm5vX3ZlcmJvc2VfYXNtLAotICAgICAgICAgICAgICAgICAgIElzVmVyYm9zZUFzbURlZmF1bHQpIHx8CisgICAgICAgICAgICAgICAgICAgSXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCkgfHwKICAgICAgIEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9kQSkpCiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tYXNtLXZlcmJvc2UiKTsKIAorICBpZiAoIUFyZ3MuaGFzRmxhZyhvcHRpb25zOjpPUFRfZmludGVncmF0ZWRfYXMsIG9wdGlvbnM6Ok9QVF9mbm9faW50ZWdyYXRlZF9hcywKKyAgICAgICAgICAgICAgICAgICAgSXNJbnRlZ3JhdGVkQXNzZW1ibGVyRGVmYXVsdCkpCisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1uby1pbnRlZ3JhdGVkLWFzIik7CisKICAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mZGVidWdfcGFzc19zdHJ1Y3R1cmUpKSB7CiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tZGVidWctcGFzcyIpOwogICAgIENtZEFyZ3MucHVzaF9iYWNrKCJTdHJ1Y3R1cmUiKTsKQEAgLTI0OTgsMTAgKzI2NzgsMTEgQEAKICAgLy8gLWZhc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyBhbmQgLWZub24tY2FsbC1leGNlcHRpb25zIGludGVyYWN0IGluIG1vcmUKICAgLy8gY29tcGxpY2F0ZWQgd2F5cy4KICAgYm9vbCBBc3luY2hyb25vdXNVbndpbmRUYWJsZXMgPQotICAgIEFyZ3MuaGFzRmxhZyhvcHRpb25zOjpPUFRfZmFzeW5jaHJvbm91c191bndpbmRfdGFibGVzLAotICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX2FzeW5jaHJvbm91c191bndpbmRfdGFibGVzLAotICAgICAgICAgICAgICAgICBnZXRUb29sQ2hhaW4oKS5Jc1Vud2luZFRhYmxlc0RlZmF1bHQoKSAmJgotICAgICAgICAgICAgICAgICAhS2VybmVsT3JLZXh0KTsKKyAgICAgIEFyZ3MuaGFzRmxhZyhvcHRpb25zOjpPUFRfZmFzeW5jaHJvbm91c191bndpbmRfdGFibGVzLAorICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mbm9fYXN5bmNocm9ub3VzX3Vud2luZF90YWJsZXMsCisgICAgICAgICAgICAgICAgICAgKGdldFRvb2xDaGFpbigpLklzVW53aW5kVGFibGVzRGVmYXVsdCgpIHx8CisgICAgICAgICAgICAgICAgICAgIGdldFRvb2xDaGFpbigpLmdldFNhbml0aXplckFyZ3MoKS5uZWVkc1Vud2luZFRhYmxlcygpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAhS2VybmVsT3JLZXh0KTsKICAgaWYgKEFyZ3MuaGFzRmxhZyhvcHRpb25zOjpPUFRfZnVud2luZF90YWJsZXMsIG9wdGlvbnM6Ok9QVF9mbm9fdW53aW5kX3RhYmxlcywKICAgICAgICAgICAgICAgICAgICBBc3luY2hyb25vdXNVbndpbmRUYWJsZXMpKQogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbXVud2luZC10YWJsZXMiKTsKQEAgLTI1MzYsNyArMjcxNyw3IEBACiAgIH0KIAogICAvLyBBZGQgdGhlIHRhcmdldCBmZWF0dXJlcwotICBnZXRUYXJnZXRGZWF0dXJlcyhELCBFVHJpcGxlLCBBcmdzLCBDbWRBcmdzKTsKKyAgZ2V0VGFyZ2V0RmVhdHVyZXMoRCwgRVRyaXBsZSwgQXJncywgQ21kQXJncywgZmFsc2UpOwogCiAgIC8vIEFkZCB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MuCiAgIHN3aXRjaChnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkpIHsKQEAgLTI1NDQsMTAgKzI3MjUsMTYgQEAKICAgICBicmVhazsKIAogICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtOgorICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtZWI6CiAgIGNhc2UgbGx2bTo6VHJpcGxlOjp0aHVtYjoKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OnRodW1iZWI6CiAgICAgQWRkQVJNVGFyZ2V0QXJncyhBcmdzLCBDbWRBcmdzLCBLZXJuZWxPcktleHQpOwogICAgIGJyZWFrOwogCisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm02NDoKKyAgICBBZGRBUk02NFRhcmdldEFyZ3MoQXJncywgQ21kQXJncyk7CisgICAgYnJlYWs7CisKICAgY2FzZSBsbHZtOjpUcmlwbGU6Om1pcHM6CiAgIGNhc2UgbGx2bTo6VHJpcGxlOjptaXBzZWw6CiAgIGNhc2UgbGx2bTo6VHJpcGxlOjptaXBzNjQ6CkBAIC0yNjEzLDEzICsyODAwLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgRC5DQ0xvZ0RpYWdub3N0aWNzRmlsZW5hbWUgOiAiLSIpOwogICB9CiAKLSAgLy8gVXNlIHRoZSBsYXN0IG9wdGlvbiBmcm9tICItZyIgZ3JvdXAuICItZ2xpbmUtdGFibGVzLW9ubHkiCi0gIC8vIGlzIHByZXNlcnZlZCwgYWxsIG90aGVyIGRlYnVnIG9wdGlvbnMgYXJlIHN1YnN0aXR1dGVkIHdpdGggIi1nIi4KKyAgLy8gVXNlIHRoZSBsYXN0IG9wdGlvbiBmcm9tICItZyIgZ3JvdXAuICItZ2xpbmUtdGFibGVzLW9ubHkiIGFuZCAiLWdkd2FyZi14IgorICAvLyBhcmUgcHJlc2VydmVkLCBhbGwgb3RoZXIgZGVidWcgb3B0aW9ucyBhcmUgc3Vic3RpdHV0ZWQgd2l0aCAiLWciLgogICBBcmdzLkNsYWltQWxsQXJncyhvcHRpb25zOjpPUFRfZ19Hcm91cCk7CiAgIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2dfR3JvdXApKSB7Ci0gICAgaWYgKEEtPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2dsaW5lX3RhYmxlc19vbmx5KSkKKyAgICBpZiAoQS0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZ2xpbmVfdGFibGVzX29ubHkpKSB7CisgICAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIHN1cHBvcnQgc3BlY2lmeWluZyBkd2FyZiB2ZXJzaW9uIHdpdGgKKyAgICAgIC8vIC1nbGluZS10YWJsZXMtb25seS4KICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZ2xpbmUtdGFibGVzLW9ubHkiKTsKLSAgICBlbHNlIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9nZHdhcmZfMikpCisgICAgICAvLyBEZWZhdWx0IGlzIGR3YXJmLTIgZm9yIGRhcndpbi4KKyAgICAgIGlmIChnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKS5pc09TRGFyd2luKCkpCisgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZ2R3YXJmLTIiKTsKKyAgICB9IGVsc2UgaWYgKEEtPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2dkd2FyZl8yKSkKICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZ2R3YXJmLTIiKTsKICAgICBlbHNlIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9nZHdhcmZfMykpCiAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWdkd2FyZi0zIik7CkBAIC0yNjU3LDEzICsyODQ5LDQ0IEBACiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1nZW5lcmF0ZS1nbnUtZHdhcmYtcHViLXNlY3Rpb25zIik7CiAgIH0KIAotICBBcmdzLkFkZEFsbEFyZ3MoQ21kQXJncywgb3B0aW9uczo6T1BUX2ZkZWJ1Z190eXBlc19zZWN0aW9uKTsKKyAgLy8gLWdkd2FyZi1hcmFuZ2VzIHR1cm5zIG9uIHRoZSBlbWlzc2lvbiBvZiB0aGUgYXJhbmdlcyBzZWN0aW9uIGluIHRoZQorICAvLyBiYWNrZW5kLgorICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2dkd2FyZl9hcmFuZ2VzKSkgeworICAgIENtZEFyZ3MucHVzaF9iYWNrKCItYmFja2VuZC1vcHRpb24iKTsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWdlbmVyYXRlLWFyYW5nZS1zZWN0aW9uIik7CisgIH0KIAotICBBcmdzLkFkZEFsbEFyZ3MoQ21kQXJncywgb3B0aW9uczo6T1BUX2ZmdW5jdGlvbl9zZWN0aW9ucyk7Ci0gIEFyZ3MuQWRkQWxsQXJncyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfZmRhdGFfc2VjdGlvbnMpOworICBpZiAoQXJncy5oYXNGbGFnKG9wdGlvbnM6Ok9QVF9mZGVidWdfdHlwZXNfc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX2RlYnVnX3R5cGVzX3NlY3Rpb24sIGZhbHNlKSkgeworICAgIENtZEFyZ3MucHVzaF9iYWNrKCItYmFja2VuZC1vcHRpb24iKTsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWdlbmVyYXRlLXR5cGUtdW5pdHMiKTsKKyAgfQorCisgIGlmIChBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX2ZmdW5jdGlvbl9zZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX2Z1bmN0aW9uX3NlY3Rpb25zLCBmYWxzZSkpIHsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWZmdW5jdGlvbi1zZWN0aW9ucyIpOworICB9CisKKyAgaWYgKEFyZ3MuaGFzRmxhZyhvcHRpb25zOjpPUFRfZmRhdGFfc2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub19kYXRhX3NlY3Rpb25zLCBmYWxzZSkpIHsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWZkYXRhLXNlY3Rpb25zIik7CisgIH0KIAogICBBcmdzLkFkZEFsbEFyZ3MoQ21kQXJncywgb3B0aW9uczo6T1BUX2ZpbnN0cnVtZW50X2Z1bmN0aW9ucyk7CiAKKyAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mcHJvZmlsZV9pbnN0cl9nZW5lcmF0ZSkgJiYKKyAgICAgIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZnByb2ZpbGVfaW5zdHJfdXNlKSB8fAorICAgICAgIEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mcHJvZmlsZV9pbnN0cl91c2VfRVEpKSkKKyAgICBELkRpYWcoZGlhZzo6ZXJyX2Rydl9hcmd1bWVudF9ub3RfYWxsb3dlZF93aXRoKQorICAgICAgPDwgIi1mcHJvZmlsZS1pbnN0ci1nZW5lcmF0ZSIgPDwgIi1mcHJvZmlsZS1pbnN0ci11c2UiOworCisgIEFyZ3MuQWRkQWxsQXJncyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfZnByb2ZpbGVfaW5zdHJfZ2VuZXJhdGUpOworCisgIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2Zwcm9maWxlX2luc3RyX3VzZV9FUSkpCisgICAgQS0+cmVuZGVyKEFyZ3MsIENtZEFyZ3MpOworICBlbHNlIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZnByb2ZpbGVfaW5zdHJfdXNlKSkKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWZwcm9maWxlLWluc3RyLXVzZT1wZ28tZGF0YSIpOworCiAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZnRlc3RfY292ZXJhZ2UpIHx8CiAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfY292ZXJhZ2UpKQogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZmVtaXQtY292ZXJhZ2Utbm90ZXMiKTsKQEAgLTI3NjksNyArMjk5Miw4IEBACiAgICAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9vYmpjbXRfYXRvbWljX3Byb3BlcnR5KTsKICAgICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX29iamNtdF9yZXR1cm5zX2lubmVycG9pbnRlcl9wcm9wZXJ0eSk7CiAgICAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9vYmpjbXRfbnNfbm9uYXRvbWljX2lvc29ubHkpOwotICAgIEFyZ3MuQWRkTGFzdEFyZyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfb2JqY210X3doaXRlX2xpc3RfZGlyX3BhdGgpOworICAgIEFyZ3MuQWRkTGFzdEFyZyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfb2JqY210X21pZ3JhdGVfZGVzaWduYXRlZF9pbml0KTsKKyAgICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX29iamNtdF93aGl0ZWxpc3RfZGlyX3BhdGgpOwogICB9CiAKICAgLy8gQWRkIHByZXByb2Nlc3Npbmcgb3B0aW9ucyBsaWtlIC1JLCAtRCwgZXRjLiBpZiB3ZSBhcmUgdXNpbmcgdGhlCkBAIC0yODMzLDcgKzMwNTcsNyBAQAogICAgIGlmICghdHlwZXM6OmlzQ1hYKElucHV0VHlwZSkpCiAgICAgICBBcmdzLkFkZEFsbEFyZ3NUcmFuc2xhdGVkKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9zdGRfZGVmYXVsdF9FUSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1zdGQ9IiwgLypKb2luZWQ9Ki90cnVlKTsKLSAgICBlbHNlIGlmIChnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKS5nZXRPUygpID09IGxsdm06OlRyaXBsZTo6V2luMzIpCisgICAgZWxzZSBpZiAoSXNXaW5kb3dzTVNWQykKICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItc3RkPWMrKzExIik7CiAKICAgICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX3RyaWdyYXBocyk7CkBAIC0yODQ5LDkgKzMwNzMsMTMgQEAKICAgLy8gYmVoYXZpb3IgZm9yIG5vdy4gRklYTUU6IERpcmVjdGx5IGRpYWdub3NlIHVzZXMgb2YgYSBzdHJpbmcgbGl0ZXJhbCBhcwogICAvLyBhIG5vbi1jb25zdCBjaGFyKiBpbiBDLCByYXRoZXIgdGhhbiB1c2luZyB0aGlzIGNydWRlIGhhY2suCiAgIGlmICghdHlwZXM6OmlzQ1hYKElucHV0VHlwZSkpIHsKLSAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgRGlhZ0xldmVsID0gRC5nZXREaWFncygpLmdldERpYWdub3N0aWNMZXZlbCgKLSAgICAgICAgZGlhZzo6d2Fybl9kZXByZWNhdGVkX3N0cmluZ19saXRlcmFsX2NvbnZlcnNpb25fYywgU291cmNlTG9jYXRpb24oKSk7Ci0gICAgaWYgKERpYWdMZXZlbCA+IERpYWdub3N0aWNzRW5naW5lOjpJZ25vcmVkKQorICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZWhhdmUganVzdCBsaWtlIGEgd2FybmluZyBmbGFnLCBhbmQgdGh1cyBzaG91bGQgYWxzbworICAgIC8vIHJlc3BlY3QgLVdldmVyeXRoaW5nLCAtV25vLWV2ZXJ5dGhpbmcsIC1XZXJyb3I9d3JpdGUtc3RyaW5ncywgYW5kIHNvIG9uLgorICAgIEFyZyAqV3JpdGVTdHJpbmdzID0KKyAgICAgICAgQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9Xd3JpdGVfc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9Xbm9fd3JpdGVfc3RyaW5ncywgb3B0aW9uczo6T1BUX3cpOworICAgIGlmIChXcml0ZVN0cmluZ3MgJiYKKyAgICAgICAgV3JpdGVTdHJpbmdzLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9Xd3JpdGVfc3RyaW5ncykpCiAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWZjb25zdC1zdHJpbmdzIik7CiAgIH0KIApAQCAtMjk5Miw4ICszMjIwLDggQEAKICAgLy8gRm9yd2FyZCAtZiAoZmxhZykgb3B0aW9ucyB3aGljaCB3ZSBjYW4gcGFzcyBkaXJlY3RseS4KICAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9mZW1pdF9hbGxfZGVjbHMpOwogICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX2ZoZWlub3VzX2dudV9leHRlbnNpb25zKTsKLSAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9mbGltaXRfZGVidWdfaW5mbyk7Ci0gIEFyZ3MuQWRkTGFzdEFyZyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfZm5vX2xpbWl0X2RlYnVnX2luZm8pOworICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX2ZzdGFuZGFsb25lX2RlYnVnKTsKKyAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9mbm9fc3RhbmRhbG9uZV9kZWJ1Zyk7CiAgIEFyZ3MuQWRkTGFzdEFyZyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfZm5vX29wZXJhdG9yX25hbWVzKTsKICAgLy8gQWx0aVZlYyBsYW5ndWFnZSBleHRlbnNpb25zIGFyZW4ndCByZWxldmFudCBmb3IgYXNzZW1ibGluZy4KICAgaWYgKCFpc2E8UHJlcHJvY2Vzc0pvYkFjdGlvbj4oSkEpIHx8IApAQCAtMzAxMCw4ICszMjM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpCiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1mbm8tc2FuaXRpemUtcmVjb3ZlciIpOwogCi0gIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZmNhdGNoX3VuZGVmaW5lZF9iZWhhdmlvcikgfHwKLSAgICAgIEFyZ3MuaGFzRmxhZyhvcHRpb25zOjpPUFRfZnNhbml0aXplX3VuZGVmaW5lZF90cmFwX29uX2Vycm9yLAorICBpZiAoQXJncy5oYXNGbGFnKG9wdGlvbnM6Ok9QVF9mc2FuaXRpemVfdW5kZWZpbmVkX3RyYXBfb25fZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub19zYW5pdGl6ZV91bmRlZmluZWRfdHJhcF9vbl9lcnJvciwgZmFsc2UpKQogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZnNhbml0aXplLXVuZGVmaW5lZC10cmFwLW9uLWVycm9yIik7CiAKQEAgLTMwNzksMTEgKzMzMDYsMTQgQEAKICAgdW5zaWduZWQgU3RhY2tQcm90ZWN0b3JMZXZlbCA9IDA7CiAgIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2Zub19zdGFja19wcm90ZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2ZzdGFja19wcm90ZWN0b3JfYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mc3RhY2tfcHJvdGVjdG9yX3N0cm9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZnN0YWNrX3Byb3RlY3RvcikpIHsKICAgICBpZiAoQS0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZnN0YWNrX3Byb3RlY3RvcikpCi0gICAgICBTdGFja1Byb3RlY3RvckxldmVsID0gMTsKKyAgICAgIFN0YWNrUHJvdGVjdG9yTGV2ZWwgPSBMYW5nT3B0aW9uczo6U1NQT247CisgICAgZWxzZSBpZiAoQS0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZnN0YWNrX3Byb3RlY3Rvcl9zdHJvbmcpKQorICAgICAgU3RhY2tQcm90ZWN0b3JMZXZlbCA9IExhbmdPcHRpb25zOjpTU1BTdHJvbmc7CiAgICAgZWxzZSBpZiAoQS0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZnN0YWNrX3Byb3RlY3Rvcl9hbGwpKQotICAgICAgU3RhY2tQcm90ZWN0b3JMZXZlbCA9IDI7CisgICAgICBTdGFja1Byb3RlY3RvckxldmVsID0gTGFuZ09wdGlvbnM6OlNTUFJlcTsKICAgfSBlbHNlIHsKICAgICBTdGFja1Byb3RlY3RvckxldmVsID0KICAgICAgIGdldFRvb2xDaGFpbigpLkdldERlZmF1bHRTdGFja1Byb3RlY3RvckxldmVsKEtlcm5lbE9yS2V4dCk7CkBAIC0zMjQ3LDExICszNDc3LDMwIEBACiAgICAgQ21kQXJncy5wdXNoX2JhY2soQXJncy5NYWtlQXJnU3RyaW5nKERlZmF1bHRNb2R1bGVDYWNoZSkpOwogICB9CiAKKyAgaWYgKEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfZm1vZHVsZXNfdXNlcl9idWlsZF9wYXRoKSkgeworICAgIEEtPmNsYWltKCk7CisgICAgaWYgKEhhdmVNb2R1bGVzKSB7CisgICAgICBBLT5yZW5kZXIoQXJncywgQ21kQXJncyk7CisgICAgfQorICB9CisKICAgLy8gUGFzcyB0aHJvdWdoIGFsbCAtZm1vZHVsZXMtaWdub3JlLW1hY3JvIGFyZ3VtZW50cy4KICAgQXJncy5BZGRBbGxBcmdzKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9mbW9kdWxlc19pZ25vcmVfbWFjcm8pOwogICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX2Ztb2R1bGVzX3BydW5lX2ludGVydmFsKTsKICAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9mbW9kdWxlc19wcnVuZV9hZnRlcik7CiAKKyAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9mYnVpbGRfc2Vzc2lvbl90aW1lc3RhbXApOworCisgIGlmIChBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2Ztb2R1bGVzX3ZhbGlkYXRlX29uY2VfcGVyX2J1aWxkX3Nlc3Npb24pKSB7CisgICAgaWYgKCFBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2ZidWlsZF9zZXNzaW9uX3RpbWVzdGFtcCkpCisgICAgICBELkRpYWcoZGlhZzo6ZXJyX2Rydl9tb2R1bGVzX3ZhbGlkYXRlX29uY2VfcmVxdWlyZXNfdGltZXN0YW1wKTsKKworICAgIEFyZ3MuQWRkTGFzdEFyZyhDbWRBcmdzLAorICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm1vZHVsZXNfdmFsaWRhdGVfb25jZV9wZXJfYnVpbGRfc2Vzc2lvbik7CisgIH0KKworICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX2Ztb2R1bGVzX3ZhbGlkYXRlX3N5c3RlbV9oZWFkZXJzKTsKKwogICAvLyAtZmFjY2Vzcy1jb250cm9sIGlzIGRlZmF1bHQuCiAgIGlmIChBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX2Zub19hY2Nlc3NfY29udHJvbCwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZmFjY2Vzc19jb250cm9sLApAQCAtMzI5OCwzMyArMzU0NywzMCBAQAogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZm5vLXRocmVhZHNhZmUtc3RhdGljcyIpOwogCiAgIC8vIC1mdXNlLWN4YS1hdGV4aXQgaXMgZGVmYXVsdC4KLSAgaWYgKCFBcmdzLmhhc0ZsYWcoCi0gICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mdXNlX2N4YV9hdGV4aXQsIG9wdGlvbnM6Ok9QVF9mbm9fdXNlX2N4YV9hdGV4aXQsCi0gICAgICAgICAgIGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLmdldE9TKCkgIT0gbGx2bTo6VHJpcGxlOjpDeWd3aW4gJiYKLSAgICAgICAgICAgICAgIGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLmdldE9TKCkgIT0gbGx2bTo6VHJpcGxlOjpNaW5HVzMyICYmCi0gICAgICAgICAgICAgICBnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgIT0gbGx2bTo6VHJpcGxlOjpoZXhhZ29uICYmCi0gICAgICAgICAgICAgICBnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgIT0gbGx2bTo6VHJpcGxlOjp4Y29yZSkgfHwKKyAgaWYgKCFBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX2Z1c2VfY3hhX2F0ZXhpdCwKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub191c2VfY3hhX2F0ZXhpdCwKKyAgICAgICAgICAgICAgICAgICAgIUlzV2luZG93c0N5Z251cyAmJiAhSXNXaW5kb3dzR05VICYmCisgICAgICAgICAgICAgICAgICAgIGdldFRvb2xDaGFpbigpLmdldEFyY2goKSAhPSBsbHZtOjpUcmlwbGU6OmhleGFnb24gJiYKKyAgICAgICAgICAgICAgICAgICAgZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpICE9IGxsdm06OlRyaXBsZTo6eGNvcmUpIHx8CiAgICAgICBLZXJuZWxPcktleHQpCiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1mbm8tdXNlLWN4YS1hdGV4aXQiKTsKIAogICAvLyAtZm1zLWV4dGVuc2lvbnM9MCBpcyBkZWZhdWx0LgogICBpZiAoQXJncy5oYXNGbGFnKG9wdGlvbnM6Ok9QVF9mbXNfZXh0ZW5zaW9ucywgb3B0aW9uczo6T1BUX2Zub19tc19leHRlbnNpb25zLAotICAgICAgICAgICAgICAgICAgIGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpXaW4zMikpCisgICAgICAgICAgICAgICAgICAgSXNXaW5kb3dzTVNWQykpCiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1mbXMtZXh0ZW5zaW9ucyIpOwogCiAgIC8vIC1mbXMtY29tcGF0aWJpbGl0eT0wIGlzIGRlZmF1bHQuCiAgIGlmIChBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX2Ztc19jb21wYXRpYmlsaXR5LCAKICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX21zX2NvbXBhdGliaWxpdHksCi0gICAgICAgICAgICAgICAgICAgKGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpXaW4zMiAmJgotICAgICAgICAgICAgICAgICAgICBBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX2Ztc19leHRlbnNpb25zLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mbm9fbXNfZXh0ZW5zaW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKSkpCisgICAgICAgICAgICAgICAgICAgKElzV2luZG93c01TVkMgJiYgQXJncy5oYXNGbGFnKG9wdGlvbnM6Ok9QVF9mbXNfZXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub19tc19leHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSkpKQogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZm1zLWNvbXBhdGliaWxpdHkiKTsKIAogICAvLyAtZm1zYy12ZXJzaW9uPTE3MDAgaXMgZGVmYXVsdC4KICAgaWYgKEFyZ3MuaGFzRmxhZyhvcHRpb25zOjpPUFRfZm1zX2V4dGVuc2lvbnMsIG9wdGlvbnM6Ok9QVF9mbm9fbXNfZXh0ZW5zaW9ucywKLSAgICAgICAgICAgICAgICAgICBnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKS5nZXRPUygpID09IGxsdm06OlRyaXBsZTo6V2luMzIpIHx8Ci0gICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZm1zY192ZXJzaW9uKSkgeworICAgICAgICAgICAgICAgICAgIElzV2luZG93c01TVkMpIHx8IEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mbXNjX3ZlcnNpb24pKSB7CiAgICAgU3RyaW5nUmVmIG1zY192ZXIgPSBBcmdzLmdldExhc3RBcmdWYWx1ZShvcHRpb25zOjpPUFRfZm1zY192ZXJzaW9uKTsKICAgICBpZiAobXNjX3Zlci5lbXB0eSgpKQogICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1mbXNjLXZlcnNpb249MTcwMCIpOwpAQCAtMzM0MSw4ICszNTg3LDcgQEAKICAgLy8gLWZuby1kZWxheWVkLXRlbXBsYXRlLXBhcnNpbmcgaXMgZGVmYXVsdCwgZXhjZXB0IGZvciBXaW5kb3dzIHdoZXJlIE1TVkMgU1RMCiAgIC8vIG5lZWRzIGl0LgogICBpZiAoQXJncy5oYXNGbGFnKG9wdGlvbnM6Ok9QVF9mZGVsYXllZF90ZW1wbGF0ZV9wYXJzaW5nLAotICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mbm9fZGVsYXllZF90ZW1wbGF0ZV9wYXJzaW5nLAotICAgICAgICAgICAgICAgICAgIGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpXaW4zMikpCisgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub19kZWxheWVkX3RlbXBsYXRlX3BhcnNpbmcsIElzV2luZG93c01TVkMpKQogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZmRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyIpOwogCiAgIC8vIC1mZ251LWtleXdvcmRzIGRlZmF1bHQgdmFyaWVzIGRlcGVuZGluZyBvbiBsYW5ndWFnZTsgb25seSBwYXNzIGlmCkBAIC0zMzY1LDkgKzM2MTAsMTAgQEAKICAgT2JqQ1J1bnRpbWUgb2JqY1J1bnRpbWUgPSBBZGRPYmpDUnVudGltZUFyZ3MoQXJncywgQ21kQXJncywgcmV3cml0ZUtpbmQpOwogCiAgIC8vIC1mb2JqYy1kaXNwYXRjaC1tZXRob2QgaXMgb25seSByZWxldmFudCB3aXRoIHRoZSBub25mcmFnaWxlLWFiaSwgYW5kCi0gIC8vIGxlZ2FjeSBpcyB0aGUgZGVmYXVsdC4gTmV4dCBydW50aW1lIGlzIGFsd2F5cyBsZWdhY3kgZGlzcGF0Y2ggYW5kCi0gIC8vIC1mbm8tb2JqYy1sZWdhY3ktZGlzcGF0Y2ggZ2V0cyBpZ25vcmVkIHNpbGVudGx5LgotICBpZiAob2JqY1J1bnRpbWUuaXNOb25GcmFnaWxlKCkgJiYgIW9iamNSdW50aW1lLmlzTmVYVEZhbWlseSgpKSB7CisgIC8vIGxlZ2FjeSBpcyB0aGUgZGVmYXVsdC4gRXhjZXB0IGZvciBkZXBsb3ltZW50IHRhZ2V0IG9mIDEwLjUsCisgIC8vIG5leHQgcnVudGltZSBpcyBhbHdheXMgbGVnYWN5IGRpc3BhdGNoIGFuZCAtZm5vLW9iamMtbGVnYWN5LWRpc3BhdGNoCisgIC8vIGdldHMgaWdub3JlZCBzaWxlbnRseS4KKyAgaWYgKG9iamNSdW50aW1lLmlzTm9uRnJhZ2lsZSgpKSB7CiAgICAgaWYgKCFBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX2ZvYmpjX2xlZ2FjeV9kaXNwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX29iamNfbGVnYWN5X2Rpc3BhdGNoLAogICAgICAgICAgICAgICAgICAgICAgIG9iamNSdW50aW1lLmlzTGVnYWN5RGlzcGF0Y2hEZWZhdWx0Rm9yQXJjaCgKQEAgLTM0NjUsNyArMzcxMSw4IEBACiAKICAgLy8gLWZzaG9ydC13Y2hhciBkZWZhdWx0IHZhcmllcyBkZXBlbmRpbmcgb24gcGxhdGZvcm07IG9ubHkKICAgLy8gcGFzcyBpZiBzcGVjaWZpZWQuCi0gIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2ZzaG9ydF93Y2hhcikpCisgIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2ZzaG9ydF93Y2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZm5vX3Nob3J0X3djaGFyKSkKICAgICBBLT5yZW5kZXIoQXJncywgQ21kQXJncyk7CiAKICAgLy8gLWZuby1wYXNjYWwtc3RyaW5ncyBpcyBkZWZhdWx0LCBvbmx5IHBhc3Mgbm9uLWRlZmF1bHQuCkBAIC0zNzI2LDExICszOTczLDkgQEAKICAgZm9yIChJbnB1dEluZm9MaXN0Ojpjb25zdF9pdGVyYXRvcgogICAgICAgICAgaXQgPSBJbnB1dHMuYmVnaW4oKSwgaWUgPSBJbnB1dHMuZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CiAgICAgY29uc3QgSW5wdXRJbmZvICZJSSA9ICppdDsKLSAgICBDbWRBcmdzLnB1c2hfYmFjaygiLXgiKTsKLSAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3Jld3JpdGVfb2JqYykpCi0gICAgICBDbWRBcmdzLnB1c2hfYmFjayh0eXBlczo6Z2V0VHlwZU5hbWUodHlwZXM6OlRZX1BQX09iakNYWCkpOwotICAgIGVsc2UKLSAgICAgIENtZEFyZ3MucHVzaF9iYWNrKHR5cGVzOjpnZXRUeXBlTmFtZShJSS5nZXRUeXBlKCkpKTsKKworICAgIGFkZERhc2hYRm9ySW5wdXQoQXJncywgSUksIENtZEFyZ3MpOworCiAgICAgaWYgKElJLmlzRmlsZW5hbWUoKSkKICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKElJLmdldEZpbGVuYW1lKCkpOwogICAgIGVsc2UKQEAgLTM3NzIsNyArNDAxNyw4IEBACiAgIH0KIAogICAvLyBGaW5hbGx5IGFkZCB0aGUgY29tcGlsZSBjb21tYW5kIHRvIHRoZSBjb21waWxhdGlvbi4KLSAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9fU0xBU0hfZmFsbGJhY2spKSB7CisgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfX1NMQVNIX2ZhbGxiYWNrKSAmJgorICAgICAgT3V0cHV0LmdldFR5cGUoKSA9PSB0eXBlczo6VFlfT2JqZWN0KSB7CiAgICAgdG9vbHM6OnZpc3VhbHN0dWRpbzo6Q29tcGlsZSBDTChnZXRUb29sQ2hhaW4oKSk7CiAgICAgQ29tbWFuZCAqQ0xDb21tYW5kID0gQ0wuR2V0Q29tbWFuZChDLCBKQSwgT3V0cHV0LCBJbnB1dHMsIEFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5raW5nT3V0cHV0KTsKQEAgLTM5NzksMTMgKzQyMjUsNDkgQEAKICAgLy8gaW1wbGVtZW50ZWQgaW4gY2xhbmcuCiAgIENtZEFyZ3MucHVzaF9iYWNrKCItLWRlcGVuZGVudC1saWI9b2xkbmFtZXMiKTsKIAotICAvLyBGSVhNRTogTWFrZSB0aGlzIGRlZmF1bHQgZm9yIHRoZSB3aW4zMiB0cmlwbGUuCi0gIENtZEFyZ3MucHVzaF9iYWNrKCItY3h4LWFiaSIpOwotICBDbWRBcmdzLnB1c2hfYmFjaygibWljcm9zb2Z0Iik7Ci0KICAgaWYgKEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfc2hvd19pbmNsdWRlcykpCiAgICAgQS0+cmVuZGVyKEFyZ3MsIENtZEFyZ3MpOwogCisgIC8vIFJUVEkgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQsIHNvIGRpc2FibGUgaXQgYnkgZGVmYXVsdC4KKyAgaWYgKCFBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZnJ0dGksIG9wdGlvbnM6Ok9QVF9mbm9fcnR0aSkpCisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1mbm8tcnR0aSIpOworCisgIC8vIExldCAtZmZ1bmN0aW9uLXNlY3Rpb25zIGltcGx5IC1mZGF0YS1zZWN0aW9ucy4KKyAgaWYgKEFyZyAqIEEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2ZmdW5jdGlvbl9zZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub19mdW5jdGlvbl9zZWN0aW9ucykpCisgICAgaWYgKEEtPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2ZmdW5jdGlvbl9zZWN0aW9ucykpCisgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWZkYXRhLXNlY3Rpb25zIik7CisKKyAgY29uc3QgRHJpdmVyICZEID0gZ2V0VG9vbENoYWluKCkuZ2V0RHJpdmVyKCk7CisgIEFyZyAqTW9zdEdlbmVyYWxBcmcgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX19TTEFTSF92bWcpOworICBBcmcgKkJlc3RDYXNlQXJnID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9fU0xBU0hfdm1iKTsKKyAgaWYgKE1vc3RHZW5lcmFsQXJnICYmIEJlc3RDYXNlQXJnKQorICAgIEQuRGlhZyhjbGFuZzo6ZGlhZzo6ZXJyX2Rydl9hcmd1bWVudF9ub3RfYWxsb3dlZF93aXRoKQorICAgICAgICA8PCBNb3N0R2VuZXJhbEFyZy0+Z2V0QXNTdHJpbmcoQXJncykgPDwgQmVzdENhc2VBcmctPmdldEFzU3RyaW5nKEFyZ3MpOworCisgIGlmIChNb3N0R2VuZXJhbEFyZykgeworICAgIEFyZyAqU2luZ2xlQXJnID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9fU0xBU0hfdm1zKTsKKyAgICBBcmcgKk11bHRpcGxlQXJnID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9fU0xBU0hfdm1tKTsKKyAgICBBcmcgKlZpcnR1YWxBcmcgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX19TTEFTSF92bXYpOworCisgICAgQXJnICpGaXJzdENvbmZsaWN0ID0gU2luZ2xlQXJnID8gU2luZ2xlQXJnIDogTXVsdGlwbGVBcmc7CisgICAgQXJnICpTZWNvbmRDb25mbGljdCA9IFZpcnR1YWxBcmcgPyBWaXJ0dWFsQXJnIDogTXVsdGlwbGVBcmc7CisgICAgaWYgKEZpcnN0Q29uZmxpY3QgJiYgU2Vjb25kQ29uZmxpY3QgJiYgRmlyc3RDb25mbGljdCAhPSBTZWNvbmRDb25mbGljdCkKKyAgICAgIEQuRGlhZyhjbGFuZzo6ZGlhZzo6ZXJyX2Rydl9hcmd1bWVudF9ub3RfYWxsb3dlZF93aXRoKQorICAgICAgICAgIDw8IEZpcnN0Q29uZmxpY3QtPmdldEFzU3RyaW5nKEFyZ3MpCisgICAgICAgICAgPDwgU2Vjb25kQ29uZmxpY3QtPmdldEFzU3RyaW5nKEFyZ3MpOworCisgICAgaWYgKFNpbmdsZUFyZykKKyAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZm1zLW1lbXB0ci1yZXA9c2luZ2xlIik7CisgICAgZWxzZSBpZiAoTXVsdGlwbGVBcmcpCisgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWZtcy1tZW1wdHItcmVwPW11bHRpcGxlIik7CisgICAgZWxzZQorICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1mbXMtbWVtcHRyLXJlcD12aXJ0dWFsIik7CisgIH0KKworICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF92dG9yZGlzcF9tb2RlX0VRKSkKKyAgICBBLT5yZW5kZXIoQXJncywgQ21kQXJncyk7CisKICAgaWYgKCFBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZmRpYWdub3N0aWNzX2Zvcm1hdF9FUSkpIHsKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWZkaWFnbm9zdGljcy1mb3JtYXQiKTsKICAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX19TTEFTSF9mYWxsYmFjaykpCkBAIC00MDQxLDcgKzQzMjMsNyBAQAogCiAgIC8vIEFkZCB0aGUgdGFyZ2V0IGZlYXR1cmVzCiAgIGNvbnN0IERyaXZlciAmRCA9IGdldFRvb2xDaGFpbigpLmdldERyaXZlcigpOwotICBnZXRUYXJnZXRGZWF0dXJlcyhELCBUcmlwbGUsIEFyZ3MsIENtZEFyZ3MpOworICBnZXRUYXJnZXRGZWF0dXJlcyhELCBUcmlwbGUsIEFyZ3MsIENtZEFyZ3MsIHRydWUpOwogCiAgIC8vIElnbm9yZSBleHBsaWNpdCAtZm9yY2VfY3B1c3VidHlwZV9BTEwgb3B0aW9uLgogICAodm9pZCkgQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2ZvcmNlX19jcHVzdWJ0eXBlX19BTEwpOwpAQCAtNDA5Miw2ICs0Mzc0LDE2IEBACiAKICAgLy8gRklYTUU6IEFkZCAtc3RhdGljIHN1cHBvcnQsIG9uY2Ugd2UgaGF2ZSBpdC4KIAorICAvLyBDb25zdW1lIGFsbCB0aGUgd2FybmluZyBmbGFncy4gVXN1YWxseSB0aGlzIHdvdWxkIGJlIGhhbmRsZWQgbW9yZQorICAvLyBncmFjZWZ1bGx5IGJ5IC1jYzEgKHdhcm5pbmcgYWJvdXQgdW5rbm93biB3YXJuaW5nIGZsYWdzLCBldGMpIGJ1dCAtY2MxYXMKKyAgLy8gZG9lc24ndCBoYW5kbGUgdGhhdCBzbyByYXRoZXIgdGhhbiB3YXJuaW5nIGFib3V0IHVudXNlZCBmbGFncyB0aGF0IGFyZQorICAvLyBhY3R1YWxseSB1c2VkLCB3ZSdsbCBsaWUgYnkgb21pc3Npb24gaW5zdGVhZC4KKyAgLy8gRklYTUU6IFN0b3AgbHlpbmcgYW5kIGNvbnN1bWUgb25seSB0aGUgYXBwcm9wcmlhdGUgZHJpdmVyIGZsYWdzCisgIGZvciAoYXJnX2l0ZXJhdG9yIGl0ID0gQXJncy5maWx0ZXJlZF9iZWdpbihvcHRpb25zOjpPUFRfV19Hcm91cCksCisgICAgICAgICAgICAgICAgICAgIGllID0gQXJncy5maWx0ZXJlZF9lbmQoKTsKKyAgICAgICBpdCAhPSBpZTsgKytpdCkKKyAgICAoKml0KS0+Y2xhaW0oKTsKKwogICBDb2xsZWN0QXJnc0ZvckludGVncmF0ZWRBc3NlbWJsZXIoQywgQXJncywgQ21kQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRvb2xDaGFpbigpLmdldERyaXZlcigpKTsKIApAQCAtNDI1MSwxMSArNDU0Myw2IEBACiAgIENtZEFyZ3MucHVzaF9iYWNrKCItRSIpOwogfQogCi12b2lkIGdjYzo6UHJlY29tcGlsZTo6UmVuZGVyRXh0cmFUb29sQXJncyhjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3QgewotICAvLyBUaGUgdHlwZSBpcyBnb29kIGVub3VnaC4KLX0KLQogdm9pZCBnY2M6OkNvbXBpbGU6OlJlbmRlckV4dHJhVG9vbEFyZ3MoY29uc3QgSm9iQWN0aW9uICZKQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IHsKICAgY29uc3QgRHJpdmVyICZEID0gZ2V0VG9vbENoYWluKCkuZ2V0RHJpdmVyKCk7CkBAIC00MjczLDExICs0NTYwLDYgQEAKICAgfQogfQogCi12b2lkIGdjYzo6QXNzZW1ibGU6OlJlbmRlckV4dHJhVG9vbEFyZ3MoY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdCB7Ci0gIENtZEFyZ3MucHVzaF9iYWNrKCItYyIpOwotfQotCiB2b2lkIGdjYzo6TGluazo6UmVuZGVyRXh0cmFUb29sQXJncyhjb25zdCBKb2JBY3Rpb24gJkpBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3QgewogICAvLyBUaGUgdHlwZXMgYXJlIChob3BlZnVsbHkpIGdvb2QgZW5vdWdoLgpAQCAtNDUyOSw3ICs0ODExLDE2OCBAQAogfQogLy8gSGV4YWdvbiB0b29scyBlbmQuCiAKLWxsdm06OlRyaXBsZTo6QXJjaFR5cGUgZGFyd2luOjpnZXRBcmNoVHlwZUZvckRhcndpbkFyY2hOYW1lKFN0cmluZ1JlZiBTdHIpIHsKKy8vLyBnZXRBUk1DUFVGb3JNQXJjaCAtIEdldCB0aGUgKExMVk0pIG5hbWUgb2YgdGhlIG1pbmltdW0gQVJNIENQVSBmb3IgdGhlIGFyY2ggd2UgYXJlIHRhcmdldGluZworLy8KKy8vIEZJWE1FOiB0YmxnZW4gdGhpcy4KK2NvbnN0IGNoYXIgKmFybTo6Z2V0QVJNQ1BVRm9yTUFyY2goY29uc3QgQXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUpIHsKKyAgU3RyaW5nUmVmIE1BcmNoOworICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tYXJjaF9FUSkpIHsKKyAgICAvLyBPdGhlcndpc2UsIGlmIHdlIGhhdmUgLW1hcmNoPSBjaG9vc2UgdGhlIGJhc2UgQ1BVIGZvciB0aGF0IGFyY2guCisgICAgTUFyY2ggPSBBLT5nZXRWYWx1ZSgpOworICB9IGVsc2UgeworICAgIC8vIE90aGVyd2lzZSwgdXNlIHRoZSBBcmNoIGZyb20gdGhlIHRyaXBsZS4KKyAgICBNQXJjaCA9IFRyaXBsZS5nZXRBcmNoTmFtZSgpOworICB9CisKKyAgLy8gSGFuZGxlIC1tYXJjaD1uYXRpdmUuCisgIGlmIChNQXJjaCA9PSAibmF0aXZlIikgeworICAgIHN0ZDo6c3RyaW5nIENQVSA9IGxsdm06OnN5czo6Z2V0SG9zdENQVU5hbWUoKTsKKyAgICBpZiAoQ1BVICE9ICJnZW5lcmljIikgeworICAgICAgLy8gVHJhbnNsYXRlIHRoZSBuYXRpdmUgY3B1IGludG8gdGhlIGFyY2hpdGVjdHVyZS4gVGhlIHN3aXRjaCBiZWxvdyB3aWxsCisgICAgICAvLyB0aGVuIGNob3NlIHRoZSBtaW5pbXVtIGNwdSBmb3IgdGhhdCBhcmNoLgorICAgICAgTUFyY2ggPSBzdGQ6OnN0cmluZygiYXJtIikgKyBhcm06OmdldExMVk1BcmNoU3VmZml4Rm9yQVJNKENQVSk7CisgICAgfQorICB9CisKKyAgaWYgKFRyaXBsZS5nZXRPUygpID09IGxsdm06OlRyaXBsZTo6TmV0QlNEKSB7CisgICAgaWYgKE1BcmNoID09ICJhcm12NiIpCisgICAgICByZXR1cm4gImFybTExNzZqemYtcyI7CisgIH0KKworICBjb25zdCBjaGFyICpyZXN1bHQgPSBsbHZtOjpTdHJpbmdTd2l0Y2g8Y29uc3QgY2hhciAqPihNQXJjaCkKKyAgICAuQ2FzZXMoImFybXYyIiwgImFybXYyYSIsImFybTIiKQorICAgIC5DYXNlKCJhcm12MyIsICJhcm02IikKKyAgICAuQ2FzZSgiYXJtdjNtIiwgImFybTdtIikKKyAgICAuQ2FzZSgiYXJtdjQiLCAic3Ryb25nYXJtIikKKyAgICAuQ2FzZSgiYXJtdjR0IiwgImFybTd0ZG1pIikKKyAgICAuQ2FzZSgidGh1bWJ2NHQiLCAiYXJtN3RkbWkiKQorICAgIC5DYXNlcygiYXJtdjUiLCAiYXJtdjV0IiwgImFybTEwdGRtaSIpCisgICAgLkNhc2VzKCJ0aHVtYnY1IiwgInRodW1idjV0IiwgImFybTEwdGRtaSIpCisgICAgLkNhc2VzKCJhcm12NWUiLCAiYXJtdjV0ZSIsICJhcm0xMDIyZSIpCisgICAgLkNhc2VzKCJ0aHVtYnY1ZSIsICJ0aHVtYnY1dGUiLCAiYXJtMTAyMmUiKQorICAgIC5DYXNlKCJhcm12NXRlaiIsICJhcm05MjZlai1zIikKKyAgICAuQ2FzZSgidGh1bWJ2NXRlaiIsICJhcm05MjZlai1zIikKKyAgICAuQ2FzZXMoImFybXY2IiwgImFybXY2ayIsICJhcm0xMTM2amYtcyIpCisgICAgLkNhc2VzKCJ0aHVtYnY2IiwgInRodW1idjZrIiwgImFybTExMzZqZi1zIikKKyAgICAuQ2FzZSgiYXJtdjZqIiwgImFybTExMzZqLXMiKQorICAgIC5DYXNlKCJ0aHVtYnY2aiIsICJhcm0xMTM2ai1zIikKKyAgICAuQ2FzZXMoImFybXY2eiIsICJhcm12NnprIiwgImFybTExNzZqemYtcyIpCisgICAgLkNhc2VzKCJ0aHVtYnY2eiIsICJ0aHVtYnY2emsiLCAiYXJtMTE3Nmp6Zi1zIikKKyAgICAuQ2FzZSgiYXJtdjZ0MiIsICJhcm0xMTU2dDItcyIpCisgICAgLkNhc2UoInRodW1idjZ0MiIsICJhcm0xMTU2dDItcyIpCisgICAgLkNhc2VzKCJhcm12Nm0iLCAiYXJtdjYtbSIsICJjb3J0ZXgtbTAiKQorICAgIC5DYXNlKCJ0aHVtYnY2bSIsICJjb3J0ZXgtbTAiKQorICAgIC5DYXNlcygiYXJtdjciLCAiYXJtdjdhIiwgImFybXY3LWEiLCAiY29ydGV4LWE4IikKKyAgICAuQ2FzZXMoImFybWVidjciLCAiYXJtZWJ2N2EiLCAiYXJtZWJ2Ny1hIiwgImNvcnRleC1hOCIpCisgICAgLkNhc2VzKCJ0aHVtYnY3IiwgInRodW1idjdhIiwgImNvcnRleC1hOCIpCisgICAgLkNhc2VzKCJ0aHVtYmVidjciLCAidGh1bWJlYnY3YSIsICJjb3J0ZXgtYTgiKQorICAgIC5DYXNlcygiYXJtdjdsIiwgImFybXY3LWwiLCAiY29ydGV4LWE4IikKKyAgICAuQ2FzZXMoImFybWVidjdsIiwgImFybWVidjctbCIsICJjb3J0ZXgtYTgiKQorICAgIC5DYXNlcygiYXJtdjdzIiwgImFybXY3LXMiLCAic3dpZnQiKQorICAgIC5DYXNlcygiYXJtZWJ2N3MiLCAiYXJtZWJ2Ny1zIiwgInN3aWZ0IikKKyAgICAuQ2FzZXMoImFybXY3ciIsICJhcm12Ny1yIiwgImNvcnRleC1yNCIpCisgICAgLkNhc2VzKCJhcm1lYnY3ciIsICJhcm1lYnY3LXIiLCAiY29ydGV4LXI0IikKKyAgICAuQ2FzZSgidGh1bWJ2N3IiLCAiY29ydGV4LXI0IikKKyAgICAuQ2FzZSgidGh1bWJlYnY3ciIsICJjb3J0ZXgtcjQiKQorICAgIC5DYXNlcygiYXJtdjdtIiwgImFybXY3LW0iLCAiY29ydGV4LW0zIikKKyAgICAuQ2FzZXMoImFybWVidjdtIiwgImFybWVidjctbSIsICJjb3J0ZXgtbTMiKQorICAgIC5DYXNlKCJ0aHVtYnY3bSIsICJjb3J0ZXgtbTMiKQorICAgIC5DYXNlKCJ0aHVtYmVidjdtIiwgImNvcnRleC1tMyIpCisgICAgLkNhc2VzKCJhcm12N2VtIiwgImFybXY3ZS1tIiwgImNvcnRleC1tNCIpCisgICAgLkNhc2VzKCJhcm1lYnY3ZW0iLCAiYXJtZWJ2N2UtbSIsICJjb3J0ZXgtbTQiKQorICAgIC5DYXNlcygidGh1bWJ2N2VtIiwgInRodW1idjdlLW0iLCAiY29ydGV4LW00IikKKyAgICAuQ2FzZXMoInRodW1iZWJ2N2VtIiwgInRodW1iZWJ2N2UtbSIsICJjb3J0ZXgtbTQiKQorICAgIC5DYXNlcygiYXJtdjgiLCAiYXJtdjhhIiwgImFybXY4LWEiLCAiY29ydGV4LWE1MyIpCisgICAgLkNhc2VzKCJhcm1lYnY4IiwgImFybWVidjhhIiwgImFybWVidjgtYSIsICJjb3J0ZXgtYTUzIikKKyAgICAuQ2FzZXMoInRodW1idjgiLCAidGh1bWJ2OGEiLCAiY29ydGV4LWE1MyIpCisgICAgLkNhc2VzKCJ0aHVtYmVidjgiLCAidGh1bWJlYnY4YSIsICJjb3J0ZXgtYTUzIikKKyAgICAuQ2FzZSgiZXA5MzEyIiwgImVwOTMxMiIpCisgICAgLkNhc2UoIml3bW14dCIsICJpd21teHQiKQorICAgIC5DYXNlKCJ4c2NhbGUiLCAieHNjYWxlIikKKyAgICAvLyBJZiBhbGwgZWxzZSBmYWlsZWQsIHJldHVybiB0aGUgbW9zdCBiYXNlIENQVSB3aXRoIHRodW1iIGludGVyd29ya2luZworICAgIC8vIHN1cHBvcnRlZCBieSBMTFZNLgorICAgIC5EZWZhdWx0KDApOworCisgIGlmIChyZXN1bHQpCisgICAgcmV0dXJuIHJlc3VsdDsKKworICBzd2l0Y2ggKFRyaXBsZS5nZXRPUygpKSB7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjpOZXRCU0Q6CisgICAgc3dpdGNoIChUcmlwbGUuZ2V0RW52aXJvbm1lbnQoKSkgeworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpHTlVFQUJJSEY6CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkdOVUVBQkk6CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkVBQklIRjoKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6RUFCSToKKyAgICAgIHJldHVybiAiYXJtOTI2ZWotcyI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAic3Ryb25nYXJtIjsKKyAgICB9CisgIGRlZmF1bHQ6CisgICAgc3dpdGNoIChUcmlwbGUuZ2V0RW52aXJvbm1lbnQoKSkgeworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpFQUJJSEY6CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkdOVUVBQklIRjoKKyAgICAgIHJldHVybiAiYXJtMTE3Nmp6Zi1zIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJhcm03dGRtaSI7CisgICAgfQorICB9Cit9CisKKy8vLyBnZXRBUk1UYXJnZXRDUFUgLSBHZXQgdGhlIChMTFZNKSBuYW1lIG9mIHRoZSBBUk0gY3B1IHdlIGFyZSB0YXJnZXRpbmcuCitTdHJpbmdSZWYgYXJtOjpnZXRBUk1UYXJnZXRDUFUoY29uc3QgQXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSkgeworICAvLyBGSVhNRTogV2FybiBvbiBpbmNvbnNpc3RlbnQgdXNlIG9mIC1tY3B1IGFuZCAtbWFyY2guCisgIC8vIElmIHdlIGhhdmUgLW1jcHU9LCB1c2UgdGhhdC4KKyAgaWYgKEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfbWNwdV9FUSkpIHsKKyAgICBTdHJpbmdSZWYgTUNQVSA9IEEtPmdldFZhbHVlKCk7CisgICAgLy8gSGFuZGxlIC1tY3B1PW5hdGl2ZS4KKyAgICBpZiAoTUNQVSA9PSAibmF0aXZlIikKKyAgICAgIHJldHVybiBsbHZtOjpzeXM6OmdldEhvc3RDUFVOYW1lKCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIE1DUFU7CisgIH0KKworICByZXR1cm4gZ2V0QVJNQ1BVRm9yTUFyY2goQXJncywgVHJpcGxlKTsKK30KKworLy8vIGdldExMVk1BcmNoU3VmZml4Rm9yQVJNIC0gR2V0IHRoZSBMTFZNIGFyY2ggbmFtZSB0byB1c2UgZm9yIGEgcGFydGljdWxhcgorLy8vIENQVS4KKy8vCisvLyBGSVhNRTogVGhpcyBpcyByZWR1bmRhbnQgd2l0aCAtbWNwdSwgd2h5IGRvZXMgTExWTSB1c2UgdGhpcy4KKy8vIEZJWE1FOiB0YmxnZW4gdGhpcywgb3Iga2lsbCBpdCEKK2NvbnN0IGNoYXIgKmFybTo6Z2V0TExWTUFyY2hTdWZmaXhGb3JBUk0oU3RyaW5nUmVmIENQVSkgeworICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGNvbnN0IGNoYXIgKj4oQ1BVKQorICAgIC5DYXNlKCJzdHJvbmdhcm0iLCAidjQiKQorICAgIC5DYXNlcygiYXJtN3RkbWkiLCAiYXJtN3RkbWktcyIsICJhcm03MTB0IiwgInY0dCIpCisgICAgLkNhc2VzKCJhcm03MjB0IiwgImFybTkiLCAiYXJtOXRkbWkiLCAidjR0IikKKyAgICAuQ2FzZXMoImFybTkyMCIsICJhcm05MjB0IiwgImFybTkyMnQiLCAidjR0IikKKyAgICAuQ2FzZXMoImFybTk0MHQiLCAiZXA5MzEyIiwidjR0IikKKyAgICAuQ2FzZXMoImFybTEwdGRtaSIsICAiYXJtMTAyMHQiLCAidjUiKQorICAgIC5DYXNlcygiYXJtOWUiLCAgImFybTkyNmVqLXMiLCAgImFybTk0NmUtcyIsICJ2NWUiKQorICAgIC5DYXNlcygiYXJtOTY2ZS1zIiwgICJhcm05NjhlLXMiLCAgImFybTEwZSIsICJ2NWUiKQorICAgIC5DYXNlcygiYXJtMTAyMGUiLCAgImFybTEwMjJlIiwgICJ4c2NhbGUiLCAiaXdtbXh0IiwgInY1ZSIpCisgICAgLkNhc2VzKCJhcm0xMTM2ai1zIiwgICJhcm0xMTM2amYtcyIsICAiYXJtMTE3Nmp6LXMiLCAidjYiKQorICAgIC5DYXNlcygiYXJtMTE3Nmp6Zi1zIiwgICJtcGNvcmVub3ZmcCIsICAibXBjb3JlIiwgInY2IikKKyAgICAuQ2FzZXMoImFybTExNTZ0Mi1zIiwgICJhcm0xMTU2dDJmLXMiLCAidjZ0MiIpCisgICAgLkNhc2VzKCJjb3J0ZXgtYTUiLCAiY29ydGV4LWE3IiwgImNvcnRleC1hOCIsICJjb3J0ZXgtYTktbXAiLCAidjciKQorICAgIC5DYXNlcygiY29ydGV4LWE5IiwgImNvcnRleC1hMTIiLCAiY29ydGV4LWExNSIsICJrcmFpdCIsICJ2NyIpCisgICAgLkNhc2VzKCJjb3J0ZXgtcjQiLCAiY29ydGV4LXI1IiwgInY3ciIpCisgICAgLkNhc2UoImNvcnRleC1tMCIsICJ2Nm0iKQorICAgIC5DYXNlKCJjb3J0ZXgtbTMiLCAidjdtIikKKyAgICAuQ2FzZSgiY29ydGV4LW00IiwgInY3ZW0iKQorICAgIC5DYXNlKCJzd2lmdCIsICJ2N3MiKQorICAgIC5DYXNlKCJjeWNsb25lIiwgInY4IikKKyAgICAuQ2FzZXMoImNvcnRleC1hNTMiLCAiY29ydGV4LWE1NyIsICJ2OCIpCisgICAgLkRlZmF1bHQoIiIpOworfQorCitib29sIG1pcHM6Omhhc01pcHNBYmlBcmcoY29uc3QgQXJnTGlzdCAmQXJncywgY29uc3QgY2hhciAqVmFsdWUpIHsKKyAgQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9tYWJpX0VRKTsKKyAgcmV0dXJuIEEgJiYgKEEtPmdldFZhbHVlKCkgPT0gU3RyaW5nUmVmKFZhbHVlKSk7Cit9CisKK2xsdm06OlRyaXBsZTo6QXJjaFR5cGUgZGFyd2luOjpnZXRBcmNoVHlwZUZvck1hY2hPQXJjaE5hbWUoU3RyaW5nUmVmIFN0cikgewogICAvLyBTZWUgYXJjaCgzKSBhbmQgbGx2bS1nY2MncyBkcml2ZXItZHJpdmVyLmMuIFdlIGRvbid0IGltcGxlbWVudCBzdXBwb3J0IGZvcgogICAvLyBhcmNocyB3aGljaCBEYXJ3aW4gZG9lc24ndCB1c2UuCiAKQEAgLTQ1NTIsOCArNDk5NSw5IEBACiAgICAgLkNhc2VzKCJ4ODZfNjQiLCAieDg2XzY0aCIsIGxsdm06OlRyaXBsZTo6eDg2XzY0KQogICAgIC8vIFRoaXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBkcml2ZXIgZHJpdmVyLgogICAgIC5DYXNlcygiYXJtIiwgImFybXY0dCIsICJhcm12NSIsICJhcm12NiIsICJhcm12Nm0iLCBsbHZtOjpUcmlwbGU6OmFybSkKLSAgICAuQ2FzZXMoImFybXY3IiwgImFybXY3ZW0iLCAiYXJtdjdmIiwgImFybXY3ayIsICJhcm12N20iLCBsbHZtOjpUcmlwbGU6OmFybSkKKyAgICAuQ2FzZXMoImFybXY3IiwgImFybXY3ZW0iLCAiYXJtdjdrIiwgImFybXY3bSIsIGxsdm06OlRyaXBsZTo6YXJtKQogICAgIC5DYXNlcygiYXJtdjdzIiwgInhzY2FsZSIsIGxsdm06OlRyaXBsZTo6YXJtKQorICAgIC5DYXNlKCJhcm02NCIsIGxsdm06OlRyaXBsZTo6YXJtNjQpCiAgICAgLkNhc2UoInI2MDAiLCBsbHZtOjpUcmlwbGU6OnI2MDApCiAgICAgLkNhc2UoIm52cHR4IiwgbGx2bTo6VHJpcGxlOjpudnB0eCkKICAgICAuQ2FzZSgibnZwdHg2NCIsIGxsdm06OlRyaXBsZTo6bnZwdHg2NCkKQEAgLTQ1NjIsNiArNTAwNiwxOCBAQAogICAgIC5EZWZhdWx0KGxsdm06OlRyaXBsZTo6VW5rbm93bkFyY2gpOwogfQogCit2b2lkIGRhcndpbjo6c2V0VHJpcGxlVHlwZUZvck1hY2hPQXJjaE5hbWUobGx2bTo6VHJpcGxlICZULCBTdHJpbmdSZWYgU3RyKSB7CisgIGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgQXJjaCA9IGdldEFyY2hUeXBlRm9yTWFjaE9BcmNoTmFtZShTdHIpOworICBULnNldEFyY2goQXJjaCk7CisKKyAgaWYgKFN0ciA9PSAieDg2XzY0aCIpCisgICAgVC5zZXRBcmNoTmFtZShTdHIpOworICBlbHNlIGlmIChTdHIgPT0gImFybXY2bSIgfHwgU3RyID09ICJhcm12N20iIHx8IFN0ciA9PSAiYXJtdjdlbSIpIHsKKyAgICBULnNldE9TKGxsdm06OlRyaXBsZTo6VW5rbm93bk9TKTsKKyAgICBULnNldE9iamVjdEZvcm1hdChsbHZtOjpUcmlwbGU6Ok1hY2hPKTsKKyAgfQorfQorCiBjb25zdCBjaGFyICpDbGFuZzo6Z2V0QmFzZUlucHV0TmFtZShjb25zdCBBcmdMaXN0ICZBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzKSB7CiAgIHJldHVybiBBcmdzLk1ha2VBcmdTdHJpbmcoCkBAIC00NjA5LDEwICs1MDY1LDE2IEBACiAgICAgU291cmNlQWN0aW9uID0gU291cmNlQWN0aW9uLT5nZXRJbnB1dHMoKVswXTsKICAgfQogCi0gIC8vIElmIC1ub19pbnRlZ3JhdGVkX2FzIGlzIHVzZWQgYWRkIC1RIHRvIHRoZSBkYXJ3aW4gYXNzZW1iZXIgZHJpdmVyIHRvIG1ha2UKKyAgLy8gSWYgLWZub19pbnRlZ3JhdGVkX2FzIGlzIHVzZWQgYWRkIC1RIHRvIHRoZSBkYXJ3aW4gYXNzZW1iZXIgZHJpdmVyIHRvIG1ha2UKICAgLy8gc3VyZSBpdCBydW5zIGl0cyBzeXN0ZW0gYXNzZW1ibGVyIG5vdCBjbGFuZydzIGludGVncmF0ZWQgYXNzZW1ibGVyLgotICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX25vX2ludGVncmF0ZWRfYXMpKQotICAgIENtZEFyZ3MucHVzaF9iYWNrKCItUSIpOworICAvLyBBcHBsaWNhYmxlIHRvIGRhcndpbjExKyBhbmQgWGNvZGUgNCsuICBkYXJ3aW48MTAgbGFja2VkIGludGVncmF0ZWQtYXMuCisgIC8vIEZJWE1FOiBhdCBydW4tdGltZSBkZXRlY3QgYXNzZW1ibGVyIGNhcGFiaWxpdGllcyBvciByZWx5IG9uIHZlcnNpb24KKyAgLy8gaW5mb3JtYXRpb24gZm9yd2FyZGVkIGJ5IC10YXJnZXQtYXNzZW1ibGVyLXZlcnNpb24gKGZ1dHVyZSkKKyAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mbm9faW50ZWdyYXRlZF9hcykpIHsKKyAgICBjb25zdCBsbHZtOjpUcmlwbGUgJlQoZ2V0VG9vbENoYWluKCkuZ2V0VHJpcGxlKCkpOworICAgIGlmICghKFQuaXNNYWNPU1goKSAmJiBULmlzTWFjT1NYVmVyc2lvbkxUKDEwLCA3KSkpCisgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLVEiKTsKKyAgfQogCiAgIC8vIEZvcndhcmQgLWcsIGFzc3VtaW5nIHdlIGFyZSBkZWFsaW5nIHdpdGggYW4gYWN0dWFsIGFzc2VtYmx5IGZpbGUuCiAgIGlmIChTb3VyY2VBY3Rpb24tPmdldFR5cGUoKSA9PSB0eXBlczo6VFlfQXNtIHx8CkBAIC00NjI0LDcgKzUwODYsNyBAQAogICB9CiAKICAgLy8gRGVyaXZlZCBmcm9tIGFzbSBzcGVjLgotICBBZGREYXJ3aW5BcmNoKEFyZ3MsIENtZEFyZ3MpOworICBBZGRNYWNoT0FyY2goQXJncywgQ21kQXJncyk7CiAKICAgLy8gVXNlIC1mb3JjZV9jcHVzdWJ0eXBlX0FMTCBvbiB4ODYgYnkgZGVmYXVsdC4KICAgaWYgKGdldFRvb2xDaGFpbigpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fApAQCAtNDYzNSw4ICs1MDk3LDcgQEAKICAgaWYgKGdldFRvb2xDaGFpbigpLmdldEFyY2goKSAhPSBsbHZtOjpUcmlwbGU6Ong4Nl82NCAmJgogICAgICAgKCgoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX21rZXJuZWwpIHx8CiAgICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZmFwcGxlX2tleHQpKSAmJgotICAgICAgICAoIWdldERhcndpblRvb2xDaGFpbigpLmlzVGFyZ2V0SVBob25lT1MoKSB8fAotICAgICAgICAgZ2V0RGFyd2luVG9vbENoYWluKCkuaXNJUGhvbmVPU1ZlcnNpb25MVCg2LCAwKSkpIHx8CisgICAgICAgIGdldE1hY2hPVG9vbENoYWluKCkuaXNLZXJuZWxTdGF0aWMoKSkgfHwKICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfc3RhdGljKSkpCiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1zdGF0aWMiKTsKIApAQCAtNDY1NywxMSArNTExOCwxMSBAQAogICBDLmFkZENvbW1hbmQobmV3IENvbW1hbmQoSkEsICp0aGlzLCBFeGVjLCBDbWRBcmdzKSk7CiB9CiAKLXZvaWQgZGFyd2luOjpEYXJ3aW5Ub29sOjphbmNob3IoKSB7fQordm9pZCBkYXJ3aW46Ok1hY2hPVG9vbDo6YW5jaG9yKCkge30KIAotdm9pZCBkYXJ3aW46OkRhcndpblRvb2w6OkFkZERhcndpbkFyY2goY29uc3QgQXJnTGlzdCAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IHsKLSAgU3RyaW5nUmVmIEFyY2hOYW1lID0gZ2V0RGFyd2luVG9vbENoYWluKCkuZ2V0RGFyd2luQXJjaE5hbWUoQXJncyk7Cit2b2lkIGRhcndpbjo6TWFjaE9Ub29sOjpBZGRNYWNoT0FyY2goY29uc3QgQXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdCB7CisgIFN0cmluZ1JlZiBBcmNoTmFtZSA9IGdldE1hY2hPVG9vbENoYWluKCkuZ2V0TWFjaE9BcmNoTmFtZShBcmdzKTsKIAogICAvLyBEZXJpdmVkIGZyb20gZGFyd2luX2FyY2ggc3BlYy4KICAgQ21kQXJncy5wdXNoX2JhY2soIi1hcmNoIik7CkBAIC00Njg5LDcgKzUxNTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzKSBjb25zdCB7CiAgIGNvbnN0IERyaXZlciAmRCA9IGdldFRvb2xDaGFpbigpLmdldERyaXZlcigpOwotICBjb25zdCB0b29sY2hhaW5zOjpEYXJ3aW4gJkRhcndpblRDID0gZ2V0RGFyd2luVG9vbENoYWluKCk7CisgIGNvbnN0IHRvb2xjaGFpbnM6Ok1hY2hPICZNYWNoT1RDID0gZ2V0TWFjaE9Ub29sQ2hhaW4oKTsKIAogICB1bnNpZ25lZCBWZXJzaW9uWzNdID0geyAwLCAwLCAwIH07CiAgIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX21saW5rZXJfdmVyc2lvbl9FUSkpIHsKQEAgLTQ3MDEsMjcgKzUxNjIsMTAgQEAKICAgICAgICAgPDwgQS0+Z2V0QXNTdHJpbmcoQXJncyk7CiAgIH0KIAotICAvLyBOZXdlciBsaW5rZXJzIHN1cHBvcnQgLWRlbWFuZ2xlLCBwYXNzIGl0IGlmIHN1cHBvcnRlZCBhbmQgbm90IGRpc2FibGVkIGJ5CisgIC8vIE5ld2VyIGxpbmtlcnMgc3VwcG9ydCAtZGVtYW5nbGUuIFBhc3MgaXQgaWYgc3VwcG9ydGVkIGFuZCBub3QgZGlzYWJsZWQgYnkKICAgLy8gdGhlIHVzZXIuCi0gIGlmIChWZXJzaW9uWzBdID49IDEwMCAmJiAhQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX1pfWGxpbmtlcl9fbm9fZGVtYW5nbGUpKSB7Ci0gICAgLy8gRG9uJ3QgcGFzcyAtZGVtYW5nbGUgdG8gbGRfY2xhc3NpYy4KLSAgICAvLwotICAgIC8vIEZJWE1FOiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQsIGxkIHNob3VsZCBiZSBoYW5kbGluZyB0aGlzLgotICAgIGJvb2wgVXNlc0xkQ2xhc3NpYyA9IChnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3N0YXRpYykpOwotICAgIGlmIChnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYpIHsKLSAgICAgIGZvciAoYXJnX2l0ZXJhdG9yIGl0ID0gQXJncy5maWx0ZXJlZF9iZWdpbihvcHRpb25zOjpPUFRfWGxpbmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfV2xfQ09NTUEpLAotICAgICAgICAgICAgIGllID0gQXJncy5maWx0ZXJlZF9lbmQoKTsgaXQgIT0gaWU7ICsraXQpIHsKLSAgICAgICAgY29uc3QgQXJnICpBID0gKml0OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQS0+Z2V0TnVtVmFsdWVzKCk7IGkgIT0gZTsgKytpKQotICAgICAgICAgIGlmIChTdHJpbmdSZWYoQS0+Z2V0VmFsdWUoaSkpID09ICIta2V4dCIpCi0gICAgICAgICAgICBVc2VzTGRDbGFzc2ljID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFVc2VzTGRDbGFzc2ljKQotICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1kZW1hbmdsZSIpOwotICB9CisgIGlmIChWZXJzaW9uWzBdID49IDEwMCAmJiAhQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX1pfWGxpbmtlcl9fbm9fZGVtYW5nbGUpKQorICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZGVtYW5nbGUiKTsKIAogICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3JkeW5hbWljKSAmJiBWZXJzaW9uWzBdID49IDEzNykKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWV4cG9ydF9keW5hbWljIik7CkBAIC00NzQ3LDcgKzUxOTEsNyBAQAogICB9CiAKICAgaWYgKCFBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZHluYW1pY2xpYikpIHsKLSAgICBBZGREYXJ3aW5BcmNoKEFyZ3MsIENtZEFyZ3MpOworICAgIEFkZE1hY2hPQXJjaChBcmdzLCBDbWRBcmdzKTsKICAgICAvLyBGSVhNRTogV2h5IGRvIHRoaXMgb25seSBvbiB0aGlzIHBhdGg/CiAgICAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9mb3JjZV9fY3B1c3VidHlwZV9fQUxMKTsKIApAQCAtNDc4Myw3ICs1MjI3LDcgQEAKICAgICBBcmdzLkFkZEFsbEFyZ3NUcmFuc2xhdGVkKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9jdXJyZW50X192ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1keWxpYl9jdXJyZW50X3ZlcnNpb24iKTsKIAotICAgIEFkZERhcndpbkFyY2goQXJncywgQ21kQXJncyk7CisgICAgQWRkTWFjaE9BcmNoKEFyZ3MsIENtZEFyZ3MpOwogCiAgICAgQXJncy5BZGRBbGxBcmdzVHJhbnNsYXRlZChDbWRBcmdzLCBvcHRpb25zOjpPUFRfaW5zdGFsbF9fbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItZHlsaWJfaW5zdGFsbF9uYW1lIik7CkBAIC00NzkyLDcgKzUyMzYsNyBAQAogICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX2FsbF9fbG9hZCk7CiAgIEFyZ3MuQWRkQWxsQXJncyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfYWxsb3dhYmxlX19jbGllbnQpOwogICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX2JpbmRfX2F0X19sb2FkKTsKLSAgaWYgKERhcndpblRDLmlzVGFyZ2V0SVBob25lT1MoKSkKKyAgaWYgKE1hY2hPVEMuaXNUYXJnZXRJT1NCYXNlZCgpKQogICAgIEFyZ3MuQWRkTGFzdEFyZyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfYXJjaF9fZXJyb3JzX19mYXRhbCk7CiAgIEFyZ3MuQWRkTGFzdEFyZyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfZGVhZF9fc3RyaXApOwogICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX25vX19kZWFkX19zdHJpcF9faW5pdHNfX2FuZF9fdGVybXMpOwpAQCAtNDgwNiwyMiArNTI1MCw3IEBACiAgIEFyZ3MuQWRkQWxsQXJncyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfaW5pdCk7CiAKICAgLy8gQWRkIHRoZSBkZXBsb3ltZW50IHRhcmdldC4KLSAgVmVyc2lvblR1cGxlIFRhcmdldFZlcnNpb24gPSBEYXJ3aW5UQy5nZXRUYXJnZXRWZXJzaW9uKCk7Ci0KLSAgLy8gSWYgd2UgaGFkIGFuIGV4cGxpY2l0IC1taW9zLXNpbXVsYXRvci12ZXJzaW9uLW1pbiBhcmd1bWVudCwgaG9ub3IgdGhhdCwKLSAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgdHJhZGl0aW9uYWwgZGVwbG95bWVudCB0YXJnZXRzLiBXZSBjYW4ndCBqdXN0IGNoZWNrIHRoZQotICAvLyBpcy1zaW0gYXR0cmlidXRlIGJlY2F1c2UgZXhpc3RpbmcgY29kZSBmb2xsb3dzIHRoaXMgcGF0aCwgYW5kIHRoZSBsaW5rZXIKLSAgLy8gbWF5IG5vdCBoYW5kbGUgdGhlIGFyZ3VtZW50LgotICAvLwotICAvLyBGSVhNRTogV2UgbWF5IGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMsIG9uY2Ugd2UgY2FuIHZlcmlmeSBubyBvbmUgZGVwZW5kcyBvbgotICAvLyBpdC4KLSAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9taW9zX3NpbXVsYXRvcl92ZXJzaW9uX21pbl9FUSkpCi0gICAgQ21kQXJncy5wdXNoX2JhY2soIi1pb3Nfc2ltdWxhdG9yX3ZlcnNpb25fbWluIik7Ci0gIGVsc2UgaWYgKERhcndpblRDLmlzVGFyZ2V0SVBob25lT1MoKSkKLSAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWlwaG9uZW9zX3ZlcnNpb25fbWluIik7Ci0gIGVsc2UKLSAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW1hY29zeF92ZXJzaW9uX21pbiIpOwotICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoVGFyZ2V0VmVyc2lvbi5nZXRBc1N0cmluZygpKSk7CisgIE1hY2hPVEMuYWRkTWluVmVyc2lvbkFyZ3MoQXJncywgQ21kQXJncyk7CiAKICAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9ub211bHRpZGVmcyk7CiAgIEFyZ3MuQWRkTGFzdEFyZyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfbXVsdGlfX21vZHVsZSk7CkBAIC00ODkwLDYgKzUzMTksMTIgQEAKICAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9NYWNoKTsKIH0KIAorZW51bSBMaWJPcGVuTVAgeworICBMaWJVbmtub3duLAorICBMaWJHT01QLAorICBMaWJJT01QNQorfTsKKwogdm9pZCBkYXJ3aW46Okxpbms6OkNvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKQEAgLTQ5MzYsMTIwICs1MzcxLDQyIEBACiAgIENtZEFyZ3MucHVzaF9iYWNrKE91dHB1dC5nZXRGaWxlbmFtZSgpKTsKIAogICBpZiAoIUFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9ub3N0ZGxpYikgJiYKLSAgICAgICFBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfbm9zdGFydGZpbGVzKSkgewotICAgIC8vIERlcml2ZWQgZnJvbSBzdGFydGZpbGUgc3BlYy4KLSAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2R5bmFtaWNsaWIpKSB7Ci0gICAgICAvLyBEZXJpdmVkIGZyb20gZGFyd2luX2R5bGliMSBzcGVjLgotICAgICAgaWYgKGdldERhcndpblRvb2xDaGFpbigpLmlzVGFyZ2V0SU9TU2ltdWxhdG9yKCkpIHsKLSAgICAgICAgLy8gVGhlIHNpbXVsYXRvciBkb2Vzbid0IGhhdmUgYSB2ZXJzaW9uZWQgY3J0MSBmaWxlLgotICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxkeWxpYjEubyIpOwotICAgICAgfSBlbHNlIGlmIChnZXREYXJ3aW5Ub29sQ2hhaW4oKS5pc1RhcmdldElQaG9uZU9TKCkpIHsKLSAgICAgICAgaWYgKGdldERhcndpblRvb2xDaGFpbigpLmlzSVBob25lT1NWZXJzaW9uTFQoMywgMSkpCi0gICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sZHlsaWIxLm8iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChnZXREYXJ3aW5Ub29sQ2hhaW4oKS5pc01hY29zeFZlcnNpb25MVCgxMCwgNSkpCi0gICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sZHlsaWIxLm8iKTsKLSAgICAgICAgZWxzZSBpZiAoZ2V0RGFyd2luVG9vbENoYWluKCkuaXNNYWNvc3hWZXJzaW9uTFQoMTAsIDYpKQotICAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbGR5bGliMS4xMC41Lm8iKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9idW5kbGUpKSB7Ci0gICAgICAgIGlmICghQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3N0YXRpYykpIHsKLSAgICAgICAgICAvLyBEZXJpdmVkIGZyb20gZGFyd2luX2J1bmRsZTEgc3BlYy4KLSAgICAgICAgICBpZiAoZ2V0RGFyd2luVG9vbENoYWluKCkuaXNUYXJnZXRJT1NTaW11bGF0b3IoKSkgewotICAgICAgICAgICAgLy8gVGhlIHNpbXVsYXRvciBkb2Vzbid0IGhhdmUgYSB2ZXJzaW9uZWQgY3J0MSBmaWxlLgotICAgICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sYnVuZGxlMS5vIik7Ci0gICAgICAgICAgfSBlbHNlIGlmIChnZXREYXJ3aW5Ub29sQ2hhaW4oKS5pc1RhcmdldElQaG9uZU9TKCkpIHsKLSAgICAgICAgICAgIGlmIChnZXREYXJ3aW5Ub29sQ2hhaW4oKS5pc0lQaG9uZU9TVmVyc2lvbkxUKDMsIDEpKQotICAgICAgICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxidW5kbGUxLm8iKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldERhcndpblRvb2xDaGFpbigpLmlzTWFjb3N4VmVyc2lvbkxUKDEwLCA2KSkKLSAgICAgICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sYnVuZGxlMS5vIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3BnKSAmJgotICAgICAgICAgICAgZ2V0VG9vbENoYWluKCkuU3VwcG9ydHNQcm9maWxpbmcoKSkgewotICAgICAgICAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfc3RhdGljKSB8fAotICAgICAgICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfb2JqZWN0KSB8fAotICAgICAgICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfcHJlbG9hZCkpIHsKLSAgICAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbGdjcnQwLm8iKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sZ2NydDEubyIpOwotCi0gICAgICAgICAgICAvLyBkYXJ3aW5fY3J0MiBzcGVjIGlzIGVtcHR5LgotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBCeSBkZWZhdWx0IG9uIE9TIFggMTAuOCBhbmQgbGF0ZXIsIHdlIGRvbid0IGxpbmsgd2l0aCBhIGNydDEubwotICAgICAgICAgIC8vIGZpbGUgYW5kIHRoZSBsaW5rZXIga25vd3MgdG8gdXNlIF9tYWluIGFzIHRoZSBlbnRyeSBwb2ludC4gIEJ1dCwKLSAgICAgICAgICAvLyB3aGVuIGNvbXBpbGluZyB3aXRoIC1wZywgd2UgbmVlZCB0byBsaW5rIHdpdGggdGhlIGdjcnQxLm8gZmlsZSwKLSAgICAgICAgICAvLyBzbyBwYXNzIHRoZSAtbm9fbmV3X21haW4gb3B0aW9uIHRvIHRlbGwgdGhlIGxpbmtlciB0byB1c2UgdGhlCi0gICAgICAgICAgLy8gInN0YXJ0IiBzeW1ib2wgYXMgdGhlIGVudHJ5IHBvaW50LgotICAgICAgICAgIGlmIChnZXREYXJ3aW5Ub29sQ2hhaW4oKS5pc1RhcmdldE1hY09TKCkgJiYKLSAgICAgICAgICAgICAgIWdldERhcndpblRvb2xDaGFpbigpLmlzTWFjb3N4VmVyc2lvbkxUKDEwLCA4KSkKLSAgICAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbm9fbmV3X21haW4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3N0YXRpYykgfHwKLSAgICAgICAgICAgICAgQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX29iamVjdCkgfHwKLSAgICAgICAgICAgICAgQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3ByZWxvYWQpKSB7Ci0gICAgICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxjcnQwLm8iKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRGVyaXZlZCBmcm9tIGRhcndpbl9jcnQxIHNwZWMuCi0gICAgICAgICAgICBpZiAoZ2V0RGFyd2luVG9vbENoYWluKCkuaXNUYXJnZXRJT1NTaW11bGF0b3IoKSkgewotICAgICAgICAgICAgICAvLyBUaGUgc2ltdWxhdG9yIGRvZXNuJ3QgaGF2ZSBhIHZlcnNpb25lZCBjcnQxIGZpbGUuCi0gICAgICAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbGNydDEubyIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXREYXJ3aW5Ub29sQ2hhaW4oKS5pc1RhcmdldElQaG9uZU9TKCkpIHsKLSAgICAgICAgICAgICAgaWYgKGdldERhcndpblRvb2xDaGFpbigpLmlzSVBob25lT1NWZXJzaW9uTFQoMywgMSkpCi0gICAgICAgICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sY3J0MS5vIik7Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKGdldERhcndpblRvb2xDaGFpbigpLmlzSVBob25lT1NWZXJzaW9uTFQoNiwgMCkpCi0gICAgICAgICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1sY3J0MS4zLjEubyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaWYgKGdldERhcndpblRvb2xDaGFpbigpLmlzTWFjb3N4VmVyc2lvbkxUKDEwLCA1KSkKLSAgICAgICAgICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxjcnQxLm8iKTsKLSAgICAgICAgICAgICAgZWxzZSBpZiAoZ2V0RGFyd2luVG9vbENoYWluKCkuaXNNYWNvc3hWZXJzaW9uTFQoMTAsIDYpKQotICAgICAgICAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbGNydDEuMTAuNS5vIik7Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKGdldERhcndpblRvb2xDaGFpbigpLmlzTWFjb3N4VmVyc2lvbkxUKDEwLCA4KSkKLSAgICAgICAgICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxjcnQxLjEwLjYubyIpOwotCi0gICAgICAgICAgICAgIC8vIGRhcndpbl9jcnQyIHNwZWMgaXMgZW1wdHkuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFnZXREYXJ3aW5Ub29sQ2hhaW4oKS5pc1RhcmdldElQaG9uZU9TKCkgJiYKLSAgICAgICAgQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3NoYXJlZF9saWJnY2MpICYmCi0gICAgICAgIGdldERhcndpblRvb2xDaGFpbigpLmlzTWFjb3N4VmVyc2lvbkxUKDEwLCA1KSkgewotICAgICAgY29uc3QgY2hhciAqU3RyID0KLSAgICAgICAgQXJncy5NYWtlQXJnU3RyaW5nKGdldFRvb2xDaGFpbigpLkdldEZpbGVQYXRoKCJjcnQzLm8iKSk7Ci0gICAgICBDbWRBcmdzLnB1c2hfYmFjayhTdHIpOwotICAgIH0KLSAgfQorICAgICAgIUFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9ub3N0YXJ0ZmlsZXMpKQorICAgIGdldE1hY2hPVG9vbENoYWluKCkuYWRkU3RhcnRPYmplY3RGaWxlQXJncyhBcmdzLCBDbWRBcmdzKTsKIAogICBBcmdzLkFkZEFsbEFyZ3MoQ21kQXJncywgb3B0aW9uczo6T1BUX0wpOwogCi0gIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZm9wZW5tcCkpCi0gICAgLy8gVGhpcyBpcyBtb3JlIGNvbXBsaWNhdGVkIGluIGdjYy4uLgorICBMaWJPcGVuTVAgVXNlZE9wZW5NUExpYiA9IExpYlVua25vd247CisgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZm9wZW5tcCkpIHsKKyAgICBVc2VkT3Blbk1QTGliID0gTGliR09NUDsKKyAgfSBlbHNlIGlmIChjb25zdCBBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2ZvcGVubXBfRVEpKSB7CisgICAgVXNlZE9wZW5NUExpYiA9IGxsdm06OlN0cmluZ1N3aXRjaDxMaWJPcGVuTVA+KEEtPmdldFZhbHVlKCkpCisgICAgICAgIC5DYXNlKCJsaWJnb21wIiwgIExpYkdPTVApCisgICAgICAgIC5DYXNlKCJsaWJpb21wNSIsIExpYklPTVA1KQorICAgICAgICAuRGVmYXVsdChMaWJVbmtub3duKTsKKyAgICBpZiAoVXNlZE9wZW5NUExpYiA9PSBMaWJVbmtub3duKQorICAgICAgZ2V0VG9vbENoYWluKCkuZ2V0RHJpdmVyKCkuRGlhZyhkaWFnOjplcnJfZHJ2X3Vuc3VwcG9ydGVkX29wdGlvbl9hcmd1bWVudCkKKyAgICAgICAgPDwgQS0+Z2V0T3B0aW9uKCkuZ2V0TmFtZSgpIDw8IEEtPmdldFZhbHVlKCk7CisgIH0KKyAgc3dpdGNoIChVc2VkT3Blbk1QTGliKSB7CisgIGNhc2UgTGliR09NUDoKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxnb21wIik7CisgICAgYnJlYWs7CisgIGNhc2UgTGliSU9NUDU6CisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1saW9tcDUiKTsKKyAgICBicmVhazsKKyAgY2FzZSBMaWJVbmtub3duOgorICAgIGJyZWFrOworICB9CiAKICAgQWRkTGlua2VySW5wdXRzKGdldFRvb2xDaGFpbigpLCBJbnB1dHMsIEFyZ3MsIENtZEFyZ3MpOwogICAKICAgaWYgKGlzT2JqQ1J1bnRpbWVMaW5rZWQoQXJncykgJiYKICAgICAgICFBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfbm9zdGRsaWIpICYmCiAgICAgICAhQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX25vZGVmYXVsdGxpYnMpKSB7Ci0gICAgLy8gQXZvaWQgbGlua2luZyBjb21wYXRpYmlsaXR5IHN0dWJzIG9uIGkzODYgbWFjLgotICAgIGlmICghZ2V0RGFyd2luVG9vbENoYWluKCkuaXNUYXJnZXRNYWNPUygpIHx8Ci0gICAgICAgIGdldERhcndpblRvb2xDaGFpbigpLmdldEFyY2goKSAhPSBsbHZtOjpUcmlwbGU6Ong4NikgewotICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBBUkMgb3Igc3Vic2NyaXB0aW5nIHJ1bnRpbWUgc3VwcG9ydCwgbGluayBpbiB0aGUKLSAgICAgIC8vIHJ1bnRpbWUgc3R1YnMuICBXZSBoYXZlIHRvIGRvIHRoaXMgKmJlZm9yZSogYWRkaW5nIGFueSBvZiB0aGUgbm9ybWFsCi0gICAgICAvLyBsaW5rZXIgaW5wdXRzIHNvIHRoYXQgaXRzIGluaXRpYWxpemVyIGdldHMgcnVuIGZpcnN0LgotICAgICAgT2JqQ1J1bnRpbWUgcnVudGltZSA9Ci0gICAgICAgIGdldERhcndpblRvb2xDaGFpbigpLmdldERlZmF1bHRPYmpDUnVudGltZSgvKm5vbmZyYWdpbGUqLyB0cnVlKTsKLSAgICAgIC8vIFdlIHVzZSBhcmNsaXRlIGxpYnJhcnkgZm9yIGJvdGggQVJDIGFuZCBzdWJzY3JpcHRpbmcgc3VwcG9ydC4KLSAgICAgIGlmICgoIXJ1bnRpbWUuaGFzTmF0aXZlQVJDKCkgJiYgaXNPYmpDQXV0b1JlZkNvdW50KEFyZ3MpKSB8fAotICAgICAgICAgICFydW50aW1lLmhhc1N1YnNjcmlwdGluZygpKQotICAgICAgICBnZXREYXJ3aW5Ub29sQ2hhaW4oKS5BZGRMaW5rQVJDQXJncyhBcmdzLCBDbWRBcmdzKTsKLSAgICB9CisgICAgLy8gV2UgdXNlIGFyY2xpdGUgbGlicmFyeSBmb3IgYm90aCBBUkMgYW5kIHN1YnNjcmlwdGluZyBzdXBwb3J0LgorICAgIGdldE1hY2hPVG9vbENoYWluKCkuQWRkTGlua0FSQ0FyZ3MoQXJncywgQ21kQXJncyk7CisKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWZyYW1ld29yayIpOwogICAgIENtZEFyZ3MucHVzaF9iYWNrKCJGb3VuZGF0aW9uIik7CiAgICAgLy8gTGluayBsaWJvYmouCkBAIC01MDczLDcgKzU0MzAsNyBAQAogICAgIC8vIGxpbmtfc3NwIHNwZWMgaXMgZW1wdHkuCiAKICAgICAvLyBMZXQgdGhlIHRvb2wgY2hhaW4gY2hvb3NlIHdoaWNoIHJ1bnRpbWUgbGlicmFyeSB0byBsaW5rLgotICAgIGdldERhcndpblRvb2xDaGFpbigpLkFkZExpbmtSdW50aW1lTGliQXJncyhBcmdzLCBDbWRBcmdzKTsKKyAgICBnZXRNYWNoT1Rvb2xDaGFpbigpLkFkZExpbmtSdW50aW1lTGliQXJncyhBcmdzLCBDbWRBcmdzKTsKICAgfQogCiAgIGlmICghQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX25vc3RkbGliKSAmJgpAQCAtNTI3OSw3ICs1NjM2LDcgQEAKICAgfQogICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoTGliUGF0aCArICJjcnRuLm8iKSk7CiAKLSAgYWRkUHJvZmlsZVJUKGdldFRvb2xDaGFpbigpLCBBcmdzLCBDbWRBcmdzLCBnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKSk7CisgIGFkZFByb2ZpbGVSVChnZXRUb29sQ2hhaW4oKSwgQXJncywgQ21kQXJncyk7CiAKICAgY29uc3QgY2hhciAqRXhlYyA9CiAgICAgQXJncy5NYWtlQXJnU3RyaW5nKGdldFRvb2xDaGFpbigpLkdldFByb2dyYW1QYXRoKCJsZCIpKTsKQEAgLTUzOTEsNyArNTc0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRvb2xDaGFpbigpLkdldEZpbGVQYXRoKCJjcnRlbmQubyIpKSk7CiAgIH0KIAotICBhZGRQcm9maWxlUlQoZ2V0VG9vbENoYWluKCksIEFyZ3MsIENtZEFyZ3MsIGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpKTsKKyAgYWRkUHJvZmlsZVJUKGdldFRvb2xDaGFpbigpLCBBcmdzLCBDbWRBcmdzKTsKIAogICBjb25zdCBjaGFyICpFeGVjID0KICAgICBBcmdzLk1ha2VBcmdTdHJpbmcoZ2V0VG9vbENoYWluKCkuR2V0UHJvZ3JhbVBhdGgoImxkIikpOwpAQCAtNTQwNCwxNiArNTc2MSwzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZ0xpc3QgJkFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3QgewogICBBcmdTdHJpbmdMaXN0IENtZEFyZ3M7CisgIGJvb2wgTmVlZHNLUElDID0gZmFsc2U7CiAKLSAgLy8gV2hlbiBidWlsZGluZyAzMi1iaXQgY29kZSBvbiBPcGVuQlNEL2FtZDY0LCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkKLSAgLy8gaW5zdHJ1Y3QgYXMgaW4gdGhlIGJhc2Ugc3lzdGVtIHRvIGFzc2VtYmxlIDMyLWJpdCBjb2RlLgotICBpZiAoZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2KQorICBzd2l0Y2ggKGdldFRvb2xDaGFpbigpLmdldEFyY2goKSkgeworICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2OgorICAgIC8vIFdoZW4gYnVpbGRpbmcgMzItYml0IGNvZGUgb24gT3BlbkJTRC9hbWQ2NCwgd2UgaGF2ZSB0byBleHBsaWNpdGx5CisgICAgLy8gaW5zdHJ1Y3QgYXMgaW4gdGhlIGJhc2Ugc3lzdGVtIHRvIGFzc2VtYmxlIDMyLWJpdCBjb2RlLgogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItLTMyIik7Ci0gIGVsc2UgaWYgKGdldFRvb2xDaGFpbigpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnBwYykgeworICAgIGJyZWFrOworCisgIGNhc2UgbGx2bTo6VHJpcGxlOjpwcGM6CiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tcHBjIik7CiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tYW55Iik7Ci0gIH0gZWxzZSBpZiAoZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0IHx8Ci0gICAgICAgICAgICAgZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0ZWwpIHsKKyAgICBicmVhazsKKworICBjYXNlIGxsdm06OlRyaXBsZTo6c3BhcmM6CisgICAgQ21kQXJncy5wdXNoX2JhY2soIi0zMiIpOworICAgIE5lZWRzS1BJQyA9IHRydWU7CisgICAgYnJlYWs7CisKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OnNwYXJjdjk6CisgICAgQ21kQXJncy5wdXNoX2JhY2soIi02NCIpOworICAgIENtZEFyZ3MucHVzaF9iYWNrKCItQXY5YSIpOworICAgIE5lZWRzS1BJQyA9IHRydWU7CisgICAgYnJlYWs7CisKKyAgY2FzZSBsbHZtOjpUcmlwbGU6Om1pcHM2NDoKKyAgY2FzZSBsbHZtOjpUcmlwbGU6Om1pcHM2NGVsOiB7CiAgICAgU3RyaW5nUmVmIENQVU5hbWU7CiAgICAgU3RyaW5nUmVmIEFCSU5hbWU7CiAgICAgZ2V0TWlwc0NQVUFuZEFCSShBcmdzLCBnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKSwgQ1BVTmFtZSwgQUJJTmFtZSk7CkBAIC01NDI2LDE5ICs1ODAwLDE3IEBACiAgICAgZWxzZQogICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1FTCIpOwogCi0gICAgQXJnICpMYXN0UElDQXJnID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9mUElDLCBvcHRpb25zOjpPUFRfZm5vX1BJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2ZwaWMsIG9wdGlvbnM6Ok9QVF9mbm9fcGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZlBJRSwgb3B0aW9uczo6T1BUX2Zub19QSUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mcGllLCBvcHRpb25zOjpPUFRfZm5vX3BpZSk7Ci0gICAgaWYgKExhc3RQSUNBcmcgJiYKLSAgICAgICAgKExhc3RQSUNBcmctPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2ZQSUMpIHx8Ci0gICAgICAgICBMYXN0UElDQXJnLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9mcGljKSB8fAotICAgICAgICAgTGFzdFBJQ0FyZy0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZlBJRSkgfHwKLSAgICAgICAgIExhc3RQSUNBcmctPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2ZwaWUpKSkgewotICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1LUElDIik7Ci0gICAgfQorICAgIE5lZWRzS1BJQyA9IHRydWU7CisgICAgYnJlYWs7CiAgIH0KIAorICBkZWZhdWx0OgorICAgIGJyZWFrOworICB9CisKKyAgaWYgKE5lZWRzS1BJQykKKyAgICBhZGRBc3NlbWJsZXJLUElDKEFyZ3MsIENtZEFyZ3MpOworCiAgIEFyZ3MuQWRkQWxsQXJnVmFsdWVzKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9XYV9DT01NQSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX1hhc3NlbWJsZXIpOwogCkBAIC01NzYxLDIxICs2MTMzLDIzIEBACiAgICAgZWxzZQogICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1FTCIpOwogCi0gICAgQXJnICpMYXN0UElDQXJnID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9mUElDLCBvcHRpb25zOjpPUFRfZm5vX1BJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2ZwaWMsIG9wdGlvbnM6Ok9QVF9mbm9fcGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZlBJRSwgb3B0aW9uczo6T1BUX2Zub19QSUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mcGllLCBvcHRpb25zOjpPUFRfZm5vX3BpZSk7Ci0gICAgaWYgKExhc3RQSUNBcmcgJiYKLSAgICAgICAgKExhc3RQSUNBcmctPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2ZQSUMpIHx8Ci0gICAgICAgICBMYXN0UElDQXJnLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9mcGljKSB8fAotICAgICAgICAgTGFzdFBJQ0FyZy0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZlBJRSkgfHwKLSAgICAgICAgIExhc3RQSUNBcmctPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2ZwaWUpKSkgewotICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1LUElDIik7Ci0gICAgfQorICAgIGFkZEFzc2VtYmxlcktQSUMoQXJncywgQ21kQXJncyk7CiAgIH0gZWxzZSBpZiAoZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtIHx8Ci0gICAgICAgICAgICAgZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6dGh1bWIpIHsKLSAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW1mcHU9c29mdHZmcCIpOworICAgICAgICAgICAgIGdldFRvb2xDaGFpbigpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybWViIHx8CisgICAgICAgICAgICAgZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6dGh1bWIgfHwKKyAgICAgICAgICAgICBnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYmViKSB7CisgICAgY29uc3QgRHJpdmVyICZEID0gZ2V0VG9vbENoYWluKCkuZ2V0RHJpdmVyKCk7CisgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUgPSBnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKTsKKyAgICBTdHJpbmdSZWYgRmxvYXRBQkkgPSBhcm06OmdldEFSTUZsb2F0QUJJKEQsIEFyZ3MsIFRyaXBsZSk7CisKKyAgICBpZiAoRmxvYXRBQkkgPT0gImhhcmQiKSB7CisgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW1mcHU9dmZwIik7CisgICAgfSBlbHNlIHsKKyAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbWZwdT1zb2Z0dmZwIik7CisgICAgfQorCiAgICAgc3dpdGNoKGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLmdldEVudmlyb25tZW50KCkpIHsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6R05VRUFCSUhGOgogICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpHTlVFQUJJOgogICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpFQUJJOgogICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tZWFiaT01Iik7CkBAIC01Nzg0LDYgKzYxNTgsMTQgQEAKICAgICBkZWZhdWx0OgogICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tYXRwY3MiKTsKICAgICB9CisgIH0gZWxzZSBpZiAoZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6c3BhcmMgfHwKKyAgICAgICAgICAgICBnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpzcGFyY3Y5KSB7CisgICAgaWYgKGdldFRvb2xDaGFpbigpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnNwYXJjKQorICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1BdjhwbHVzYSIpOworICAgIGVsc2UKKyAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItQXY5YSIpOworCisgICAgYWRkQXNzZW1ibGVyS1BJQyhBcmdzLCBDbWRBcmdzKTsKICAgfQogCiAgIEFyZ3MuQWRkQWxsQXJnVmFsdWVzKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9XYV9DT01NQSwKQEAgLTU4MTEsNiArNjE5Myw5IEBACiAgIGNvbnN0IHRvb2xjaGFpbnM6OkZyZWVCU0QmIFRvb2xDaGFpbiA9IAogICAgIHN0YXRpY19jYXN0PGNvbnN0IHRvb2xjaGFpbnM6OkZyZWVCU0QmPihnZXRUb29sQ2hhaW4oKSk7CiAgIGNvbnN0IERyaXZlciAmRCA9IFRvb2xDaGFpbi5nZXREcml2ZXIoKTsKKyAgY29uc3QgYm9vbCBJc1BJRSA9CisgICAgIUFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zaGFyZWQpICYmCisgICAgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9waWUpIHx8IFRvb2xDaGFpbi5pc1BJRURlZmF1bHQoKSk7CiAgIEFyZ1N0cmluZ0xpc3QgQ21kQXJnczsKIAogICAvLyBTaWxlbmNlIHdhcm5pbmcgZm9yICJjbGFuZyAtZyBmb28ubyAtbyBmb28iCkBAIC01ODI0LDcgKzYyMDksNyBAQAogICBpZiAoIUQuU3lzUm9vdC5lbXB0eSgpKQogICAgIENtZEFyZ3MucHVzaF9iYWNrKEFyZ3MuTWFrZUFyZ1N0cmluZygiLS1zeXNyb290PSIgKyBELlN5c1Jvb3QpKTsKIAotICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3BpZSkpCisgIGlmIChJc1BJRSkKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLXBpZSIpOwogCiAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfc3RhdGljKSkgewpAQCAtNTg3NCw3ICs2MjU5LDcgQEAKICAgICBpZiAoIUFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zaGFyZWQpKSB7CiAgICAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3BnKSkKICAgICAgICAgY3J0MSA9ICJnY3J0MS5vIjsKLSAgICAgIGVsc2UgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9waWUpKQorICAgICAgZWxzZSBpZiAoSXNQSUUpCiAgICAgICAgIGNydDEgPSAiU2NydDEubyI7CiAgICAgICBlbHNlCiAgICAgICAgIGNydDEgPSAiY3J0MS5vIjsKQEAgLTU4ODcsNyArNjI3Miw3IEBACiAgICAgY29uc3QgY2hhciAqY3J0YmVnaW4gPSBOVUxMOwogICAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfc3RhdGljKSkKICAgICAgIGNydGJlZ2luID0gImNydGJlZ2luVC5vIjsKLSAgICBlbHNlIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfc2hhcmVkKSB8fCBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfcGllKSkKKyAgICBlbHNlIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfc2hhcmVkKSB8fCBJc1BJRSkKICAgICAgIGNydGJlZ2luID0gImNydGJlZ2luUy5vIjsKICAgICBlbHNlCiAgICAgICBjcnRiZWdpbiA9ICJjcnRiZWdpbi5vIjsKQEAgLTU5MDcsMjUgKzYyOTIsOCBAQAogICBBcmdzLkFkZEFsbEFyZ3MoQ21kQXJncywgb3B0aW9uczo6T1BUX1pfRmxhZyk7CiAgIEFyZ3MuQWRkQWxsQXJncyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfcik7CiAKLSAgLy8gVGVsbCB0aGUgbGlua2VyIHRvIGxvYWQgdGhlIHBsdWdpbi4gVGhpcyBoYXMgdG8gY29tZSBiZWZvcmUgQWRkTGlua2VySW5wdXRzCi0gIC8vIGFzIGdvbGQgcmVxdWlyZXMgLXBsdWdpbiB0byBjb21lIGJlZm9yZSBhbnkgLXBsdWdpbi1vcHQgdGhhdCAtV2wgbWlnaHQKLSAgLy8gZm9yd2FyZC4KLSAgaWYgKEQuSXNVc2luZ0xUTyhBcmdzKSkgewotICAgIENtZEFyZ3MucHVzaF9iYWNrKCItcGx1Z2luIik7Ci0gICAgc3RkOjpzdHJpbmcgUGx1Z2luID0gVG9vbENoYWluLmdldERyaXZlcigpLkRpciArICIvLi4vbGliL0xMVk1nb2xkLnNvIjsKLSAgICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoUGx1Z2luKSk7Ci0KLSAgICAvLyBUcnkgdG8gcGFzcyBkcml2ZXIgbGV2ZWwgZmxhZ3MgcmVsZXZhbnQgdG8gTFRPIGNvZGUgZ2VuZXJhdGlvbiBkb3duIHRvCi0gICAgLy8gdGhlIHBsdWdpbi4KLQotICAgIC8vIEhhbmRsZSBmbGFncyBmb3Igc2VsZWN0aW5nIENQVSB2YXJpYW50cy4KLSAgICBzdGQ6OnN0cmluZyBDUFUgPSBnZXRDUFVOYW1lKEFyZ3MsIFRvb2xDaGFpbi5nZXRUcmlwbGUoKSk7Ci0gICAgaWYgKCFDUFUuZW1wdHkoKSkgewotICAgICAgQ21kQXJncy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICBBcmdzLk1ha2VBcmdTdHJpbmcoVHdpbmUoIi1wbHVnaW4tb3B0PW1jcHU9IikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVSkpOwotICAgIH0KLSAgfQorICBpZiAoRC5Jc1VzaW5nTFRPKEFyZ3MpKQorICAgIEFkZEdvbGRQbHVnaW4oVG9vbENoYWluLCBBcmdzLCBDbWRBcmdzKTsKIAogICBBZGRMaW5rZXJJbnB1dHMoVG9vbENoYWluLCBJbnB1dHMsIEFyZ3MsIENtZEFyZ3MpOwogCkBAIC01OTg1LDE0ICs2MzUzLDE2IEBACiAKICAgaWYgKCFBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfbm9zdGRsaWIpICYmCiAgICAgICAhQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX25vc3RhcnRmaWxlcykpIHsKLSAgICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3NoYXJlZCkgfHwgQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX3BpZSkpCisgICAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zaGFyZWQpIHx8IElzUElFKQogICAgICAgQ21kQXJncy5wdXNoX2JhY2soQXJncy5NYWtlQXJnU3RyaW5nKFRvb2xDaGFpbi5HZXRGaWxlUGF0aCgiY3J0ZW5kUy5vIikpKTsKICAgICBlbHNlCiAgICAgICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoVG9vbENoYWluLkdldEZpbGVQYXRoKCJjcnRlbmQubyIpKSk7CiAgICAgQ21kQXJncy5wdXNoX2JhY2soQXJncy5NYWtlQXJnU3RyaW5nKFRvb2xDaGFpbi5HZXRGaWxlUGF0aCgiY3J0bi5vIikpKTsKICAgfQogCi0gIGFkZFByb2ZpbGVSVChUb29sQ2hhaW4sIEFyZ3MsIENtZEFyZ3MsIFRvb2xDaGFpbi5nZXRUcmlwbGUoKSk7CisgIGFkZFNhbml0aXplclJ1bnRpbWVzKGdldFRvb2xDaGFpbigpLCBBcmdzLCBDbWRBcmdzKTsKKworICBhZGRQcm9maWxlUlQoVG9vbENoYWluLCBBcmdzLCBDbWRBcmdzKTsKIAogICBjb25zdCBjaGFyICpFeGVjID0KICAgICBBcmdzLk1ha2VBcmdTdHJpbmcoVG9vbENoYWluLkdldFByb2dyYW1QYXRoKCJsZCIpKTsKQEAgLTYwMDYsMjIgKzYzNzYsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdCB7CiAgIEFyZ1N0cmluZ0xpc3QgQ21kQXJnczsKIAotICAvLyBXaGVuIGJ1aWxkaW5nIDMyLWJpdCBjb2RlIG9uIE5ldEJTRC9hbWQ2NCwgd2UgaGF2ZSB0byBleHBsaWNpdGx5Ci0gIC8vIGluc3RydWN0IGFzIGluIHRoZSBiYXNlIHN5c3RlbSB0byBhc3NlbWJsZSAzMi1iaXQgY29kZS4KLSAgaWYgKGdldFRvb2xDaGFpbigpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NikKKyAgLy8gR05VIGFzIG5lZWRzIGRpZmZlcmVudCBmbGFncyBmb3IgY3JlYXRpbmcgdGhlIGNvcnJlY3Qgb3V0cHV0IGZvcm1hdAorICAvLyBvbiBhcmNoaXRlY3R1cmVzIHdpdGggZGlmZmVyZW50IEFCSXMgb3Igb3B0aW9uYWwgZmVhdHVyZSBzZXRzLgorICBzd2l0Y2ggKGdldFRvb2xDaGFpbigpLmdldEFyY2goKSkgeworICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2OgogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItLTMyIik7Ci0KLSAgLy8gUGFzcyB0aGUgdGFyZ2V0IENQVSB0byBHTlUgYXMgZm9yIEFSTSwgc2luY2UgdGhlIHNvdXJjZSBjb2RlIG1pZ2h0Ci0gIC8vIG5vdCBoYXZlIHRoZSBjb3JyZWN0IC5jcHUgYW5ub3RhdGlvbi4KLSAgaWYgKGdldFRvb2xDaGFpbigpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSkgewotICAgIHN0ZDo6c3RyaW5nIE1BcmNoKGdldEFSTVRhcmdldENQVShBcmdzLCBnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKSkpOworICAgIGJyZWFrOworICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtOgorICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtZWI6CisgIGNhc2UgbGx2bTo6VHJpcGxlOjp0aHVtYjoKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OnRodW1iZWI6IHsKKyAgICBzdGQ6OnN0cmluZyBNQXJjaChhcm06OmdldEFSTVRhcmdldENQVShBcmdzLCBnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKSkpOwogICAgIENtZEFyZ3MucHVzaF9iYWNrKEFyZ3MuTWFrZUFyZ1N0cmluZygiLW1jcHU9IiArIE1BcmNoKSk7CisgICAgYnJlYWs7CiAgIH0KIAotICBpZiAoZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fAotICAgICAgZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsIHx8Ci0gICAgICBnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjQgfHwKLSAgICAgIGdldFRvb2xDaGFpbigpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NGVsKSB7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjptaXBzOgorICBjYXNlIGxsdm06OlRyaXBsZTo6bWlwc2VsOgorICBjYXNlIGxsdm06OlRyaXBsZTo6bWlwczY0OgorICBjYXNlIGxsdm06OlRyaXBsZTo6bWlwczY0ZWw6IHsKICAgICBTdHJpbmdSZWYgQ1BVTmFtZTsKICAgICBTdHJpbmdSZWYgQUJJTmFtZTsKICAgICBnZXRNaXBzQ1BVQW5kQUJJKEFyZ3MsIGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLCBDUFVOYW1lLCBBQklOYW1lKTsKQEAgLTYwMzgsMTcgKzY0MTEsMjMgQEAKICAgICBlbHNlCiAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLUVMIik7CiAKLSAgICBBcmcgKkxhc3RQSUNBcmcgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2ZQSUMsIG9wdGlvbnM6Ok9QVF9mbm9fUElDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZnBpYywgb3B0aW9uczo6T1BUX2Zub19waWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mUElFLCBvcHRpb25zOjpPUFRfZm5vX1BJRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2ZwaWUsIG9wdGlvbnM6Ok9QVF9mbm9fcGllKTsKLSAgICBpZiAoTGFzdFBJQ0FyZyAmJgotICAgICAgICAoTGFzdFBJQ0FyZy0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZlBJQykgfHwKLSAgICAgICAgIExhc3RQSUNBcmctPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2ZwaWMpIHx8Ci0gICAgICAgICBMYXN0UElDQXJnLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9mUElFKSB8fAotICAgICAgICAgTGFzdFBJQ0FyZy0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZnBpZSkpKSB7Ci0gICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLUtQSUMiKTsKLSAgICB9CisgICAgYWRkQXNzZW1ibGVyS1BJQyhBcmdzLCBDbWRBcmdzKTsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgbGx2bTo6VHJpcGxlOjpzcGFyYzoKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLTMyIik7CisgICAgYWRkQXNzZW1ibGVyS1BJQyhBcmdzLCBDbWRBcmdzKTsKKyAgICBicmVhazsKKworICBjYXNlIGxsdm06OlRyaXBsZTo6c3BhcmN2OToKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLTY0Iik7CisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1BdjkiKTsKKyAgICBhZGRBc3NlbWJsZXJLUElDKEFyZ3MsIENtZEFyZ3MpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgYnJlYWs7ICAKICAgfQogCiAgIEFyZ3MuQWRkQWxsQXJnVmFsdWVzKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9XYV9DT01NQSwKQEAgLTYwNzgsMTIgKzY0NTcsMTIgQEAKICAgaWYgKCFELlN5c1Jvb3QuZW1wdHkoKSkKICAgICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoIi0tc3lzcm9vdD0iICsgRC5TeXNSb290KSk7CiAKKyAgQ21kQXJncy5wdXNoX2JhY2soIi0tZWgtZnJhbWUtaGRyIik7CiAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfc3RhdGljKSkgewogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItQnN0YXRpYyIpOwogICB9IGVsc2UgewogICAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfcmR5bmFtaWMpKQogICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1leHBvcnQtZHluYW1pYyIpOwotICAgIENtZEFyZ3MucHVzaF9iYWNrKCItLWVoLWZyYW1lLWhkciIpOwogICAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfc2hhcmVkKSkgewogICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1Cc2hhcmVhYmxlIik7CiAgICAgfSBlbHNlIHsKQEAgLTYwOTIsMTEgKzY0NzEsNjEgQEAKICAgICB9CiAgIH0KIAotICAvLyBXaGVuIGJ1aWxkaW5nIDMyLWJpdCBjb2RlIG9uIE5ldEJTRC9hbWQ2NCwgd2UgaGF2ZSB0byBleHBsaWNpdGx5Ci0gIC8vIGluc3RydWN0IGxkIGluIHRoZSBiYXNlIHN5c3RlbSB0byBsaW5rIDMyLWJpdCBjb2RlLgotICBpZiAoZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2KSB7CisgIC8vIE1hbnkgTmV0QlNEIGFyY2hpdGVjdHVyZXMgc3VwcG9ydCBtb3JlIHRoYW4gb25lIEFCSS4KKyAgLy8gRGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGVtdWxhdGlvbiBmb3IgbGQuCisgIHN3aXRjaCAoZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpKSB7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjp4ODY6CiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tIik7CiAgICAgQ21kQXJncy5wdXNoX2JhY2soImVsZl9pMzg2Iik7CisgICAgYnJlYWs7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm06CisgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm1lYjoKKyAgY2FzZSBsbHZtOjpUcmlwbGU6OnRodW1iOgorICBjYXNlIGxsdm06OlRyaXBsZTo6dGh1bWJlYjoKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW0iKTsKKyAgICBzd2l0Y2ggKGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpLmdldEVudmlyb25tZW50KCkpIHsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6RUFCSToKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6R05VRUFCSToKKyAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCJhcm1lbGZfbmJzZF9lYWJpIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6RUFCSUhGOgorICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpHTlVFQUJJSEY6CisgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiYXJtZWxmX25ic2RfZWFiaWhmIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgQ21kQXJncy5wdXNoX2JhY2soImFybWVsZl9uYnNkIik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjptaXBzNjQ6CisgIGNhc2UgbGx2bTo6VHJpcGxlOjptaXBzNjRlbDoKKyAgICBpZiAobWlwczo6aGFzTWlwc0FiaUFyZyhBcmdzLCAiMzIiKSkgeworICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tIik7CisgICAgICBpZiAoZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0KQorICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiZWxmMzJidHNtaXAiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soImVsZjMybHRzbWlwIik7CisgICB9IGVsc2UgaWYgKG1pcHM6Omhhc01pcHNBYmlBcmcoQXJncywgIjY0IikpIHsKKyAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tIik7CisgICAgIGlmIChnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjQpCisgICAgICAgQ21kQXJncy5wdXNoX2JhY2soImVsZjY0YnRzbWlwIik7CisgICAgIGVsc2UKKyAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiZWxmNjRsdHNtaXAiKTsKKyAgIH0KKyAgIGJyZWFrOworCisgIGNhc2UgbGx2bTo6VHJpcGxlOjpzcGFyYzoKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW0iKTsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiZWxmMzJfc3BhcmMiKTsKKyAgICBicmVhazsKKworICBjYXNlIGxsdm06OlRyaXBsZTo6c3BhcmN2OToKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW0iKTsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiZWxmNjRfc3BhcmMiKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIGJyZWFrOwogICB9CiAKICAgaWYgKE91dHB1dC5pc0ZpbGVuYW1lKCkpIHsKQEAgLTYxMzcsOSArNjU2NiwxNCBAQAogICBnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKS5nZXRPU1ZlcnNpb24oTWFqb3IsIE1pbm9yLCBNaWNybyk7CiAgIGJvb2wgdXNlTGliZ2NjID0gdHJ1ZTsKICAgaWYgKE1ham9yID49IDcgfHwgKE1ham9yID09IDYgJiYgTWlub3IgPT0gOTkgJiYgTWljcm8gPj0gMjMpIHx8IE1ham9yID09IDApIHsKLSAgICBpZiAoZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6eDg2IHx8Ci0gICAgICAgIGdldFRvb2xDaGFpbigpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4Nl82NCkKKyAgICBzd2l0Y2goZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpKSB7CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6Ong4NjoKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2XzY0OgogICAgICAgdXNlTGliZ2NjID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQogICB9CiAKICAgaWYgKCFBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfbm9zdGRsaWIpICYmCkBAIC02MTgxLDcgKzY2MTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3J0bi5vIikpKTsKICAgfQogCi0gIGFkZFByb2ZpbGVSVChnZXRUb29sQ2hhaW4oKSwgQXJncywgQ21kQXJncywgZ2V0VG9vbENoYWluKCkuZ2V0VHJpcGxlKCkpOworICBhZGRQcm9maWxlUlQoZ2V0VG9vbENoYWluKCksIEFyZ3MsIENtZEFyZ3MpOwogCiAgIGNvbnN0IGNoYXIgKkV4ZWMgPSBBcmdzLk1ha2VBcmdTdHJpbmcoZ2V0VG9vbENoYWluKCkuR2V0UHJvZ3JhbVBhdGgoImxkIikpOwogICBDLmFkZENvbW1hbmQobmV3IENvbW1hbmQoSkEsICp0aGlzLCBFeGVjLCBDbWRBcmdzKSk7CkBAIC02MTkzLDYgKzY2MjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmdMaXN0ICZBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdCB7CiAgIEFyZ1N0cmluZ0xpc3QgQ21kQXJnczsKKyAgYm9vbCBOZWVkc0tQSUMgPSBmYWxzZTsKIAogICAvLyBBZGQgLS0zMi8tLTY0IHRvIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIGZvcm1hdCB3ZSB3YW50LgogICAvLyBUaGlzIGlzIGluY29tcGxldGUKQEAgLTYyMTAsMjEgKzY2NDUsNDEgQEAKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW1hbnkiKTsKICAgfSBlbHNlIGlmIChnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpwcGM2NGxlKSB7CiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1hNjQiKTsKLSAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW1wcGM2NGxlIik7CisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tcHBjNjQiKTsKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW1hbnkiKTsKLSAgfSBlbHNlIGlmIChnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm0pIHsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW1saXR0bGUtZW5kaWFuIik7CisgIH0gZWxzZSBpZiAoZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6c3BhcmMpIHsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLTMyIik7CisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1BdjhwbHVzYSIpOworICAgIE5lZWRzS1BJQyA9IHRydWU7CisgIH0gZWxzZSBpZiAoZ2V0VG9vbENoYWluKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6c3BhcmN2OSkgeworICAgIENtZEFyZ3MucHVzaF9iYWNrKCItNjQiKTsKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLUF2OWEiKTsKKyAgICBOZWVkc0tQSUMgPSB0cnVlOworICB9IGVsc2UgaWYgKGdldFRvb2xDaGFpbigpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSB8fAorICAgICAgICAgICAgIGdldFRvb2xDaGFpbigpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybWViKSB7CiAgICAgU3RyaW5nUmVmIE1BcmNoID0gZ2V0VG9vbENoYWluKCkuZ2V0QXJjaE5hbWUoKTsKICAgICBpZiAoTUFyY2ggPT0gImFybXY3IiB8fCBNQXJjaCA9PSAiYXJtdjdhIiB8fCBNQXJjaCA9PSAiYXJtdjctYSIpCiAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW1mcHU9bmVvbiIpOwotICAgIGlmIChNQXJjaCA9PSAiYXJtdjgiIHx8IE1BcmNoID09ICJhcm12OGEiIHx8IE1BcmNoID09ICJhcm12OC1hIikKKyAgICBpZiAoTUFyY2ggPT0gImFybXY4IiB8fCBNQXJjaCA9PSAiYXJtdjhhIiB8fCBNQXJjaCA9PSAiYXJtdjgtYSIgfHwKKyAgICAgICAgTUFyY2ggPT0gImFybWVidjgiIHx8IE1BcmNoID09ICJhcm1lYnY4YSIgfHwgTUFyY2ggPT0gImFybWVidjgtYSIpCiAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLW1mcHU9Y3J5cHRvLW5lb24tZnAtYXJtdjgiKTsKIAotICAgIFN0cmluZ1JlZiBBUk1GbG9hdEFCSSA9IGdldEFSTUZsb2F0QUJJKGdldFRvb2xDaGFpbigpLmdldERyaXZlcigpLCBBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpKTsKKyAgICBTdHJpbmdSZWYgQVJNRmxvYXRBQkkgPSB0b29sczo6YXJtOjpnZXRBUk1GbG9hdEFCSSgKKyAgICAgICAgZ2V0VG9vbENoYWluKCkuZ2V0RHJpdmVyKCksIEFyZ3MsIGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpKTsKICAgICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoIi1tZmxvYXQtYWJpPSIgKyBBUk1GbG9hdEFCSSkpOwogCiAgICAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9tYXJjaF9FUSk7Ci0gICAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9tY3B1X0VRKTsKKworICAgIC8vIEZJWE1FOiByZW1vdmUga3JhaXQgY2hlY2sgd2hlbiBHTlUgdG9vbHMgc3VwcG9ydCBrcmFpdCBjcHUKKyAgICAvLyBmb3Igbm93IHJlcGxhY2UgaXQgd2l0aCAtbWFyY2g9YXJtdjctYSAgdG8gYXZvaWQgYSBsb3dlcgorICAgIC8vIG1hcmNoIGZyb20gYmVpbmcgcGlja2VkIGluIHRoZSBhYnNlbmNlIG9mIGEgY3B1IGZsYWcuCisgICAgQXJnICpBOworICAgIGlmICgoQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfbWNwdV9FUSkpICYmCisgICAgICBTdHJpbmdSZWYoQS0+Z2V0VmFsdWUoKSkgPT0gImtyYWl0IikKKyAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1tYXJjaD1hcm12Ny1hIik7CisgICAgZWxzZQorICAgICAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9tY3B1X0VRKTsKICAgICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX21mcHVfRVEpOwogICB9IGVsc2UgaWYgKGdldFRvb2xDaGFpbigpLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHMgfHwKICAgICAgICAgICAgICBnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwgfHwKQEAgLTYyNTEsMTMgKzY3MDYsNyBAQAogICAgICAgICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoIi1tbmFuPTIwMDgiKSk7CiAgICAgfQogCi0gICAgaWYgKEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfbWZwMzIsIG9wdGlvbnM6Ok9QVF9tZnA2NCkpIHsKLSAgICAgIGlmIChBLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9tZnAzMikpCi0gICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKEFyZ3MuTWFrZUFyZ1N0cmluZygiLW1mcDMyIikpOwotICAgICAgZWxzZQotICAgICAgICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoIi1tZnA2NCIpKTsKLSAgICB9Ci0KKyAgICBBcmdzLkFkZExhc3RBcmcoQ21kQXJncywgb3B0aW9uczo6T1BUX21mcDMyLCBvcHRpb25zOjpPUFRfbWZwNjQpOwogICAgIEFyZ3MuQWRkTGFzdEFyZyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfbWlwczE2LCBvcHRpb25zOjpPUFRfbW5vX21pcHMxNik7CiAgICAgQXJncy5BZGRMYXN0QXJnKENtZEFyZ3MsIG9wdGlvbnM6Ok9QVF9tbWljcm9taXBzLAogICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfbW5vX21pY3JvbWlwcyk7CkBAIC02MjcxLDE3ICs2NzIwLDcgQEAKICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soQXJncy5NYWtlQXJnU3RyaW5nKCItbW1zYSIpKTsKICAgICB9CiAKLSAgICBBcmcgKkxhc3RQSUNBcmcgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX2ZQSUMsIG9wdGlvbnM6Ok9QVF9mbm9fUElDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfZnBpYywgb3B0aW9uczo6T1BUX2Zub19waWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9mUElFLCBvcHRpb25zOjpPUFRfZm5vX1BJRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2ZwaWUsIG9wdGlvbnM6Ok9QVF9mbm9fcGllKTsKLSAgICBpZiAoTGFzdFBJQ0FyZyAmJgotICAgICAgICAoTGFzdFBJQ0FyZy0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZlBJQykgfHwKLSAgICAgICAgIExhc3RQSUNBcmctPmdldE9wdGlvbigpLm1hdGNoZXMob3B0aW9uczo6T1BUX2ZwaWMpIHx8Ci0gICAgICAgICBMYXN0UElDQXJnLT5nZXRPcHRpb24oKS5tYXRjaGVzKG9wdGlvbnM6Ok9QVF9mUElFKSB8fAotICAgICAgICAgTGFzdFBJQ0FyZy0+Z2V0T3B0aW9uKCkubWF0Y2hlcyhvcHRpb25zOjpPUFRfZnBpZSkpKSB7Ci0gICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLUtQSUMiKTsKLSAgICB9CisgICAgTmVlZHNLUElDID0gdHJ1ZTsKICAgfSBlbHNlIGlmIChnZXRUb29sQ2hhaW4oKS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpzeXN0ZW16KSB7CiAgICAgLy8gQWx3YXlzIHBhc3MgYW4gLW1hcmNoIG9wdGlvbiwgc2luY2Ugb3VyIGRlZmF1bHQgb2YgejEwIGlzIGxhdGVyCiAgICAgLy8gdGhhbiB0aGUgR05VIGFzc2VtYmxlcidzIGRlZmF1bHQuCkBAIC02Mjg5LDYgKzY3MjgsOSBAQAogICAgIENtZEFyZ3MucHVzaF9iYWNrKEFyZ3MuTWFrZUFyZ1N0cmluZygiLW1hcmNoPSIgKyBDUFVOYW1lKSk7CiAgIH0KIAorICBpZiAoTmVlZHNLUElDKQorICAgIGFkZEFzc2VtYmxlcktQSUMoQXJncywgQ21kQXJncyk7CisKICAgQXJncy5BZGRBbGxBcmdWYWx1ZXMoQ21kQXJncywgb3B0aW9uczo6T1BUX1dhX0NPTU1BLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjpPUFRfWGFzc2VtYmxlcik7CiAKQEAgLTYzMTQsNyArNjc1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgU3BsaXREZWJ1Z05hbWUoQXJncywgSW5wdXRzKSk7CiB9CiAKLXN0YXRpYyB2b2lkIEFkZExpYmdjYyhsbHZtOjpUcmlwbGUgVHJpcGxlLCBjb25zdCBEcml2ZXIgJkQsCitzdGF0aWMgdm9pZCBBZGRMaWJnY2MoY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUsIGNvbnN0IERyaXZlciAmRCwKICAgICAgICAgICAgICAgICAgICAgICBBcmdTdHJpbmdMaXN0ICZDbWRBcmdzLCBjb25zdCBBcmdMaXN0ICZBcmdzKSB7CiAgIGJvb2wgaXNBbmRyb2lkID0gVHJpcGxlLmdldEVudmlyb25tZW50KCkgPT0gbGx2bTo6VHJpcGxlOjpBbmRyb2lkOwogICBib29sIFN0YXRpY0xpYmdjYyA9IEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zdGF0aWNfbGliZ2NjKSB8fApAQCAtNjM0NywzMSArNjc4OSwzOSBAQAogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbGRsIik7CiB9CiAKLXN0YXRpYyBib29sIGhhc01pcHNOMzJBQklBcmcoY29uc3QgQXJnTGlzdCAmQXJncykgewotICBBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcob3B0aW9uczo6T1BUX21hYmlfRVEpOwotICByZXR1cm4gQSAmJiAoQS0+Z2V0VmFsdWUoKSA9PSBTdHJpbmdSZWYoIm4zMiIpKTsKLX0KLQogc3RhdGljIFN0cmluZ1JlZiBnZXRMaW51eER5bmFtaWNMaW5rZXIoY29uc3QgQXJnTGlzdCAmQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xjaGFpbnM6OkxpbnV4ICZUb29sQ2hhaW4pIHsKLSAgaWYgKFRvb2xDaGFpbi5nZXRUcmlwbGUoKS5nZXRFbnZpcm9ubWVudCgpID09IGxsdm06OlRyaXBsZTo6QW5kcm9pZCkKLSAgICByZXR1cm4gIi9zeXN0ZW0vYmluL2xpbmtlciI7Ci0gIGVsc2UgaWYgKFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYpCisgIGlmIChUb29sQ2hhaW4uZ2V0VHJpcGxlKCkuZ2V0RW52aXJvbm1lbnQoKSA9PSBsbHZtOjpUcmlwbGU6OkFuZHJvaWQpIHsKKyAgICBpZiAoVG9vbENoYWluLmdldFRyaXBsZSgpLmlzQXJjaDY0Qml0KCkpCisgICAgICByZXR1cm4gIi9zeXN0ZW0vYmluL2xpbmtlcjY0IjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gIi9zeXN0ZW0vYmluL2xpbmtlciI7CisgIH0gZWxzZSBpZiAoVG9vbENoYWluLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Ong4NiB8fAorICAgICAgICAgICAgIFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpzcGFyYykKICAgICByZXR1cm4gIi9saWIvbGQtbGludXguc28uMiI7Ci0gIGVsc2UgaWYgKFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0KQorICBlbHNlIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NCB8fAorICAgICAgICAgICBUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtNjQpCiAgICAgcmV0dXJuICIvbGliL2xkLWxpbnV4LWFhcmNoNjQuc28uMSI7CisgIGVsc2UgaWYgKFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0X2JlKQorICAgIHJldHVybiAiL2xpYi9sZC1saW51eC1hYXJjaDY0X2JlLnNvLjEiOwogICBlbHNlIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtIHx8CiAgICAgICAgICAgIFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYikgewogICAgIGlmIChUb29sQ2hhaW4uZ2V0VHJpcGxlKCkuZ2V0RW52aXJvbm1lbnQoKSA9PSBsbHZtOjpUcmlwbGU6OkdOVUVBQklIRikKICAgICAgIHJldHVybiAiL2xpYi9sZC1saW51eC1hcm1oZi5zby4zIjsKICAgICBlbHNlCiAgICAgICByZXR1cm4gIi9saWIvbGQtbGludXguc28uMyI7CisgIH0gZWxzZSBpZiAoVG9vbENoYWluLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybWViIHx8CisgICAgICAgICAgICAgVG9vbENoYWluLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iZWIpIHsKKyAgICBpZiAoVG9vbENoYWluLmdldFRyaXBsZSgpLmdldEVudmlyb25tZW50KCkgPT0gbGx2bTo6VHJpcGxlOjpHTlVFQUJJSEYpCisgICAgICByZXR1cm4gIi9saWIvbGQtbGludXgtYXJtaGYuc28uMyI7ICAgICAgICAvKiBUT0RPOiBjaGVjayB3aGljaCBkeW5hbWljIGxpbmtlciBuYW1lLiAgKi8KKyAgICBlbHNlCisgICAgICByZXR1cm4gIi9saWIvbGQtbGludXguc28uMyI7ICAgICAgICAgICAgICAvKiBUT0RPOiBjaGVjayB3aGljaCBkeW5hbWljIGxpbmtlciBuYW1lLiAgKi8KICAgfSBlbHNlIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwcyB8fAogICAgICAgICAgICAgIFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzZWwpCiAgICAgcmV0dXJuICIvbGliL2xkLnNvLjEiOwogICBlbHNlIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0IHx8CiAgICAgICAgICAgIFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzNjRlbCkgewotICAgIGlmIChoYXNNaXBzTjMyQUJJQXJnKEFyZ3MpKQorICAgIGlmIChtaXBzOjpoYXNNaXBzQWJpQXJnKEFyZ3MsICJuMzIiKSkKICAgICAgIHJldHVybiAiL2xpYjMyL2xkLnNvLjEiOwogICAgIGVsc2UKICAgICAgIHJldHVybiAiL2xpYjY0L2xkLnNvLjEiOwpAQCAtNjM4MSwxMCArNjgzMSwyNyBAQAogICAgICAgICAgICBUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6cHBjNjRsZSB8fAogICAgICAgICAgICBUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6c3lzdGVteikKICAgICByZXR1cm4gIi9saWI2NC9sZDY0LnNvLjEiOworICBlbHNlIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6c3BhcmN2OSkKKyAgICByZXR1cm4gIi9saWI2NC9sZC1saW51eC5zby4yIjsKICAgZWxzZQogICAgIHJldHVybiAiL2xpYjY0L2xkLWxpbnV4LXg4Ni02NC5zby4yIjsKIH0KIAorc3RhdGljIHZvaWQgQWRkUnVuVGltZUxpYnMoY29uc3QgVG9vbENoYWluICZUQywgY29uc3QgRHJpdmVyICZELAorICAgICAgICAgICAgICAgICAgICAgIEFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MsIGNvbnN0IEFyZ0xpc3QgJkFyZ3MpIHsKKyAgLy8gTWFrZSB1c2Ugb2YgY29tcGlsZXItcnQgaWYgLS1ydGxpYiBvcHRpb24gaXMgdXNlZAorICBUb29sQ2hhaW46OlJ1bnRpbWVMaWJUeXBlIFJMVCA9IFRDLkdldFJ1bnRpbWVMaWJUeXBlKEFyZ3MpOworCisgIHN3aXRjaChSTFQpIHsKKyAgY2FzZSBUb29sQ2hhaW46OlJMVF9Db21waWxlclJUOgorICAgIGFkZENsYW5nUlRMaW51eChUQywgQXJncywgQ21kQXJncyk7CisgICAgYnJlYWs7CisgIGNhc2UgVG9vbENoYWluOjpSTFRfTGliZ2NjOgorICAgIEFkZExpYmdjYyhUQy5nZXRUcmlwbGUoKSwgRCwgQ21kQXJncywgQXJncyk7CisgICAgYnJlYWs7CisgIH0KK30KKwogdm9pZCBnbnV0b29sczo6TGluazo6Q29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKQEAgLTYzOTUsMTAgKzY4NjIsOSBAQAogICBjb25zdCBEcml2ZXIgJkQgPSBUb29sQ2hhaW4uZ2V0RHJpdmVyKCk7CiAgIGNvbnN0IGJvb2wgaXNBbmRyb2lkID0KICAgICBUb29sQ2hhaW4uZ2V0VHJpcGxlKCkuZ2V0RW52aXJvbm1lbnQoKSA9PSBsbHZtOjpUcmlwbGU6OkFuZHJvaWQ7Ci0gIGNvbnN0IFNhbml0aXplckFyZ3MgJlNhbml0aXplID0gVG9vbENoYWluLmdldFNhbml0aXplckFyZ3MoKTsKICAgY29uc3QgYm9vbCBJc1BJRSA9CiAgICAgIUFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zaGFyZWQpICYmCi0gICAgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9waWUpIHx8IFNhbml0aXplLmhhc1plcm9CYXNlU2hhZG93KCkpOworICAgIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfcGllKSB8fCBUb29sQ2hhaW4uaXNQSUVEZWZhdWx0KCkpOwogCiAgIEFyZ1N0cmluZ0xpc3QgQ21kQXJnczsKIApAQCAtNjQzNCwyNyArNjkwMCwzOSBAQAogICBDbWRBcmdzLnB1c2hfYmFjaygiLW0iKTsKICAgaWYgKFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp4ODYpCiAgICAgQ21kQXJncy5wdXNoX2JhY2soImVsZl9pMzg2Iik7Ci0gIGVsc2UgaWYgKFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0KQorICBlbHNlIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NCB8fAorICAgICAgICAgICBUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtNjQpCiAgICAgQ21kQXJncy5wdXNoX2JhY2soImFhcmNoNjRsaW51eCIpOworICBlbHNlIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NF9iZSkKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiYWFyY2g2NF9iZV9saW51eCIpOwogICBlbHNlIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtCiAgICAgICAgICAgIHx8ICBUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6dGh1bWIpCiAgICAgQ21kQXJncy5wdXNoX2JhY2soImFybWVsZl9saW51eF9lYWJpIik7CisgIGVsc2UgaWYgKFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm1lYgorICAgICAgICAgICB8fCAgVG9vbENoYWluLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iZWIpCisgICAgQ21kQXJncy5wdXNoX2JhY2soImFybWViZWxmX2xpbnV4X2VhYmkiKTsgLyogVE9ETzogY2hlY2sgd2hpY2ggTkFNRS4gICovCiAgIGVsc2UgaWYgKFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpwcGMpCiAgICAgQ21kQXJncy5wdXNoX2JhY2soImVsZjMycHBjbGludXgiKTsKICAgZWxzZSBpZiAoVG9vbENoYWluLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnBwYzY0KQogICAgIENtZEFyZ3MucHVzaF9iYWNrKCJlbGY2NHBwYyIpOworICBlbHNlIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6cHBjNjRsZSkKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiZWxmNjRscHBjIik7CisgIGVsc2UgaWYgKFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjpzcGFyYykKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiZWxmMzJfc3BhcmMiKTsKKyAgZWxzZSBpZiAoVG9vbENoYWluLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnNwYXJjdjkpCisgICAgQ21kQXJncy5wdXNoX2JhY2soImVsZjY0X3NwYXJjIik7CiAgIGVsc2UgaWYgKFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjptaXBzKQogICAgIENtZEFyZ3MucHVzaF9iYWNrKCJlbGYzMmJ0c21pcCIpOwogICBlbHNlIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwc2VsKQogICAgIENtZEFyZ3MucHVzaF9iYWNrKCJlbGYzMmx0c21pcCIpOwogICBlbHNlIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bWlwczY0KSB7Ci0gICAgaWYgKGhhc01pcHNOMzJBQklBcmcoQXJncykpCisgICAgaWYgKG1pcHM6Omhhc01pcHNBYmlBcmcoQXJncywgIm4zMiIpKQogICAgICAgQ21kQXJncy5wdXNoX2JhY2soImVsZjMyYnRzbWlwbjMyIik7CiAgICAgZWxzZQogICAgICAgQ21kQXJncy5wdXNoX2JhY2soImVsZjY0YnRzbWlwIik7CiAgIH0KICAgZWxzZSBpZiAoVG9vbENoYWluLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6Om1pcHM2NGVsKSB7Ci0gICAgaWYgKGhhc01pcHNOMzJBQklBcmcoQXJncykpCisgICAgaWYgKG1pcHM6Omhhc01pcHNBYmlBcmcoQXJncywgIm4zMiIpKQogICAgICAgQ21kQXJncy5wdXNoX2JhY2soImVsZjMybHRzbWlwbjMyIik7CiAgICAgZWxzZQogICAgICAgQ21kQXJncy5wdXNoX2JhY2soImVsZjY0bHRzbWlwIik7CkBAIC02NDY1LDggKzY5NDMsMTAgQEAKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiZWxmX3g4Nl82NCIpOwogCiAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfc3RhdGljKSkgewotICAgIGlmIChUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtCi0gICAgICAgIHx8IFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYikKKyAgICBpZiAoVG9vbENoYWluLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSB8fAorICAgICAgICBUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YXJtZWIgfHwKKyAgICAgICAgVG9vbENoYWluLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OnRodW1iIHx8CisgICAgICAgIFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYmViKQogICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1Cc3RhdGljIik7CiAgICAgZWxzZQogICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1zdGF0aWMiKTsKQEAgLTY0NzgsNyArNjk1OCw5IEBACiAgIH0KIAogICBpZiAoVG9vbENoYWluLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybSB8fAorICAgICAgVG9vbENoYWluLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybWViIHx8CiAgICAgICBUb29sQ2hhaW4uZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6dGh1bWIgfHwKKyAgICAgIFRvb2xDaGFpbi5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjp0aHVtYmViIHx8CiAgICAgICAoIUFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zdGF0aWMpICYmCiAgICAgICAgIUFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zaGFyZWQpKSkgewogICAgIENtZEFyZ3MucHVzaF9iYWNrKCItZHluYW1pYy1saW5rZXIiKTsKQEAgLTY1MzAsNTAgKzcwMTIsMTcgQEAKICAgICAgICBpICE9IGU7ICsraSkKICAgICBDbWRBcmdzLnB1c2hfYmFjayhBcmdzLk1ha2VBcmdTdHJpbmcoU3RyaW5nUmVmKCItTCIpICsgKmkpKTsKIAotICAvLyBUZWxsIHRoZSBsaW5rZXIgdG8gbG9hZCB0aGUgcGx1Z2luLiBUaGlzIGhhcyB0byBjb21lIGJlZm9yZSBBZGRMaW5rZXJJbnB1dHMKLSAgLy8gYXMgZ29sZCByZXF1aXJlcyAtcGx1Z2luIHRvIGNvbWUgYmVmb3JlIGFueSAtcGx1Z2luLW9wdCB0aGF0IC1XbCBtaWdodAotICAvLyBmb3J3YXJkLgotICBpZiAoRC5Jc1VzaW5nTFRPKEFyZ3MpKSB7Ci0gICAgQ21kQXJncy5wdXNoX2JhY2soIi1wbHVnaW4iKTsKLSAgICBzdGQ6OnN0cmluZyBQbHVnaW4gPSBUb29sQ2hhaW4uZ2V0RHJpdmVyKCkuRGlyICsgIi8uLi9saWIvTExWTWdvbGQuc28iOwotICAgIENtZEFyZ3MucHVzaF9iYWNrKEFyZ3MuTWFrZUFyZ1N0cmluZyhQbHVnaW4pKTsKLQotICAgIC8vIFRyeSB0byBwYXNzIGRyaXZlciBsZXZlbCBmbGFncyByZWxldmFudCB0byBMVE8gY29kZSBnZW5lcmF0aW9uIGRvd24gdG8KLSAgICAvLyB0aGUgcGx1Z2luLgotCi0gICAgLy8gSGFuZGxlIGZsYWdzIGZvciBzZWxlY3RpbmcgQ1BVIHZhcmlhbnRzLgotICAgIHN0ZDo6c3RyaW5nIENQVSA9IGdldENQVU5hbWUoQXJncywgVG9vbENoYWluLmdldFRyaXBsZSgpKTsKLSAgICBpZiAoIUNQVS5lbXB0eSgpKSB7Ci0gICAgICBDbWRBcmdzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MuTWFrZUFyZ1N0cmluZyhUd2luZSgiLXBsdWdpbi1vcHQ9bWNwdT0iKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVKSk7Ci0gICAgfQotICB9Ci0KKyAgaWYgKEQuSXNVc2luZ0xUTyhBcmdzKSkKKyAgICBBZGRHb2xkUGx1Z2luKFRvb2xDaGFpbiwgQXJncywgQ21kQXJncyk7CiAKICAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9aX1hsaW5rZXJfX25vX2RlbWFuZ2xlKSkKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLS1uby1kZW1hbmdsZSIpOwogCiAgIEFkZExpbmtlcklucHV0cyhUb29sQ2hhaW4sIElucHV0cywgQXJncywgQ21kQXJncyk7CiAKLSAgLy8gQ2FsbCB0aGVzZSBiZWZvcmUgd2UgYWRkIHRoZSBDKysgQUJJIGxpYnJhcnkuCi0gIGlmIChTYW5pdGl6ZS5uZWVkc1Vic2FuUnQoKSkKLSAgICBhZGRVYnNhblJUTGludXgoZ2V0VG9vbENoYWluKCksIEFyZ3MsIENtZEFyZ3MsIEQuQ0NDSXNDWFgoKSwKLSAgICAgICAgICAgICAgICAgICAgU2FuaXRpemUubmVlZHNBc2FuUnQoKSB8fCBTYW5pdGl6ZS5uZWVkc1RzYW5SdCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFNhbml0aXplLm5lZWRzTXNhblJ0KCkgfHwgU2FuaXRpemUubmVlZHNMc2FuUnQoKSk7Ci0gIGlmIChTYW5pdGl6ZS5uZWVkc0FzYW5SdCgpKQotICAgIGFkZEFzYW5SVExpbnV4KGdldFRvb2xDaGFpbigpLCBBcmdzLCBDbWRBcmdzKTsKLSAgaWYgKFNhbml0aXplLm5lZWRzVHNhblJ0KCkpCi0gICAgYWRkVHNhblJUTGludXgoZ2V0VG9vbENoYWluKCksIEFyZ3MsIENtZEFyZ3MpOwotICBpZiAoU2FuaXRpemUubmVlZHNNc2FuUnQoKSkKLSAgICBhZGRNc2FuUlRMaW51eChnZXRUb29sQ2hhaW4oKSwgQXJncywgQ21kQXJncyk7Ci0gIGlmIChTYW5pdGl6ZS5uZWVkc0xzYW5SdCgpKQotICAgIGFkZExzYW5SVExpbnV4KGdldFRvb2xDaGFpbigpLCBBcmdzLCBDbWRBcmdzKTsKLSAgaWYgKFNhbml0aXplLm5lZWRzRGZzYW5SdCgpKQotICAgIGFkZERmc2FuUlRMaW51eChnZXRUb29sQ2hhaW4oKSwgQXJncywgQ21kQXJncyk7Ci0KKyAgYWRkU2FuaXRpemVyUnVudGltZXMoZ2V0VG9vbENoYWluKCksIEFyZ3MsIENtZEFyZ3MpOwogICAvLyBUaGUgcHJvZmlsZSBydW50aW1lIGFsc28gbmVlZHMgYWNjZXNzIHRvIHN5c3RlbSBsaWJyYXJpZXMuCi0gIGFkZFByb2ZpbGVSVExpbnV4KGdldFRvb2xDaGFpbigpLCBBcmdzLCBDbWRBcmdzKTsKKyAgYWRkUHJvZmlsZVJUKGdldFRvb2xDaGFpbigpLCBBcmdzLCBDbWRBcmdzKTsKIAogICBpZiAoRC5DQ0NJc0NYWCgpICYmCiAgICAgICAhQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX25vc3RkbGliKSAmJgpAQCAtNjU5MywxOSArNzA0MiwzNiBAQAogICAgICAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zdGF0aWMpKQogICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLS1zdGFydC1ncm91cCIpOwogCi0gICAgICBib29sIE9wZW5NUCA9IEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9mb3Blbm1wKTsKLSAgICAgIGlmIChPcGVuTVApIHsKKyAgICAgIExpYk9wZW5NUCBVc2VkT3Blbk1QTGliID0gTGliVW5rbm93bjsKKyAgICAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfZm9wZW5tcCkpIHsKKyAgICAgICAgVXNlZE9wZW5NUExpYiA9IExpYkdPTVA7CisgICAgICB9IGVsc2UgaWYgKGNvbnN0IEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfZm9wZW5tcF9FUSkpIHsKKyAgICAgICAgVXNlZE9wZW5NUExpYiA9IGxsdm06OlN0cmluZ1N3aXRjaDxMaWJPcGVuTVA+KEEtPmdldFZhbHVlKCkpCisgICAgICAgICAgICAuQ2FzZSgibGliZ29tcCIsICBMaWJHT01QKQorICAgICAgICAgICAgLkNhc2UoImxpYmlvbXA1IiwgTGliSU9NUDUpCisgICAgICAgICAgICAuRGVmYXVsdChMaWJVbmtub3duKTsKKyAgICAgICAgaWYgKFVzZWRPcGVuTVBMaWIgPT0gTGliVW5rbm93bikKKyAgICAgICAgICBELkRpYWcoZGlhZzo6ZXJyX2Rydl91bnN1cHBvcnRlZF9vcHRpb25fYXJndW1lbnQpCisgICAgICAgICAgICA8PCBBLT5nZXRPcHRpb24oKS5nZXROYW1lKCkgPDwgQS0+Z2V0VmFsdWUoKTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoVXNlZE9wZW5NUExpYikgeworICAgICAgY2FzZSBMaWJHT01QOgogICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxnb21wIik7CiAKLSAgICAgICAgLy8gRklYTUU6IEV4Y2x1ZGUgdGhpcyBmb3IgcGxhdGZvcm1zIHdoaXRoIGxpYmdvbXAgdGhhdCBkb2Vzbid0IHJlcXVpcmUKLSAgICAgICAgLy8gbGlicnQuIE1vc3QgbW9kZXJuIExpbnV4IHBsYXRmcm9tcyByZXF1aXJlIGl0LCBidXQgc29tZSBtYXkgbm90LgorICAgICAgICAvLyBGSVhNRTogRXhjbHVkZSB0aGlzIGZvciBwbGF0Zm9ybXMgd2l0aCBsaWJnb21wIHRoYXQgZG9uJ3QgcmVxdWlyZQorICAgICAgICAvLyBsaWJydC4gTW9zdCBtb2Rlcm4gTGludXggcGxhdGZvcm1zIHJlcXVpcmUgaXQsIGJ1dCBzb21lIG1heSBub3QuCiAgICAgICAgIENtZEFyZ3MucHVzaF9iYWNrKCItbHJ0Iik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMaWJJT01QNToKKyAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1saW9tcDUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIExpYlVua25vd246CisgICAgICAgIGJyZWFrOwogICAgICAgfQotCi0gICAgICBBZGRMaWJnY2MoVG9vbENoYWluLmdldFRyaXBsZSgpLCBELCBDbWRBcmdzLCBBcmdzKTsKKyAgICAgIEFkZFJ1blRpbWVMaWJzKFRvb2xDaGFpbiwgRCwgQ21kQXJncywgQXJncyk7CiAKICAgICAgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfcHRocmVhZCkgfHwKLSAgICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfcHRocmVhZHMpIHx8IE9wZW5NUCkKKyAgICAgICAgICBBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfcHRocmVhZHMpIHx8IFVzZWRPcGVuTVBMaWIgIT0gTGliVW5rbm93bikKICAgICAgICAgQ21kQXJncy5wdXNoX2JhY2soIi1scHRocmVhZCIpOwogCiAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWxjIik7CkBAIC02NjEzLDcgKzcwNzksNyBAQAogICAgICAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9zdGF0aWMpKQogICAgICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLS1lbmQtZ3JvdXAiKTsKICAgICAgIGVsc2UKLSAgICAgICAgQWRkTGliZ2NjKFRvb2xDaGFpbi5nZXRUcmlwbGUoKSwgRCwgQ21kQXJncywgQXJncyk7CisgICAgICAgIEFkZFJ1blRpbWVMaWJzKFRvb2xDaGFpbiwgRCwgQ21kQXJncywgQXJncyk7CiAgICAgfQogCiAgICAgaWYgKCFBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfbm9zdGFydGZpbGVzKSkgewpAQCAtNjY4Nyw3ICs3MTUzLDcgQEAKIAogICBBZGRMaW5rZXJJbnB1dHMoZ2V0VG9vbENoYWluKCksIElucHV0cywgQXJncywgQ21kQXJncyk7CiAKLSAgYWRkUHJvZmlsZVJUKGdldFRvb2xDaGFpbigpLCBBcmdzLCBDbWRBcmdzLCBnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKSk7CisgIGFkZFByb2ZpbGVSVChnZXRUb29sQ2hhaW4oKSwgQXJncywgQ21kQXJncyk7CiAKICAgaWYgKCFBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfbm9zdGRsaWIpICYmCiAgICAgICAhQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX25vZGVmYXVsdGxpYnMpKSB7CkBAIC02ODg5LDcgKzczNTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRvb2xDaGFpbigpLkdldEZpbGVQYXRoKCJjcnRuLm8iKSkpOwogICB9CiAKLSAgYWRkUHJvZmlsZVJUKGdldFRvb2xDaGFpbigpLCBBcmdzLCBDbWRBcmdzLCBnZXRUb29sQ2hhaW4oKS5nZXRUcmlwbGUoKSk7CisgIGFkZFByb2ZpbGVSVChnZXRUb29sQ2hhaW4oKSwgQXJncywgQ21kQXJncyk7CiAKICAgY29uc3QgY2hhciAqRXhlYyA9CiAgICAgQXJncy5NYWtlQXJnU3RyaW5nKGdldFRvb2xDaGFpbigpLkdldFByb2dyYW1QYXRoKCJsZCIpKTsKQEAgLTcwMzgsOCArNzUwNCwxNSBAQAogICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9mcnR0aSwgb3B0aW9uczo6T1BUX2Zub19ydHRpKSkKICAgICBDbWRBcmdzLnB1c2hfYmFjayhBLT5nZXRPcHRpb24oKS5nZXRJRCgpID09IG9wdGlvbnM6Ok9QVF9mcnR0aSA/ICIvR1IiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiL0dSLSIpOworICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKG9wdGlvbnM6Ok9QVF9mZnVuY3Rpb25fc2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczo6T1BUX2Zub19mdW5jdGlvbl9zZWN0aW9ucykpCisgICAgQ21kQXJncy5wdXNoX2JhY2soQS0+Z2V0T3B0aW9uKCkuZ2V0SUQoKSA9PSBvcHRpb25zOjpPUFRfZmZ1bmN0aW9uX3NlY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gIi9HeSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiL0d5LSIpOwogICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2ZzeW50YXhfb25seSkpCiAgICAgQ21kQXJncy5wdXNoX2JhY2soIi9acyIpOworICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2dfRmxhZywgb3B0aW9uczo6T1BUX2dsaW5lX3RhYmxlc19vbmx5KSkKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiL1o3Iik7CiAKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEluY2x1ZGVzID0gQXJncy5nZXRBbGxBcmdWYWx1ZXMob3B0aW9uczo6T1BUX2luY2x1ZGUpOwogICBmb3IgKHNpemVfdCBJID0gMCwgRSA9IEluY2x1ZGVzLnNpemUoKTsgSSAhPSBFOyArK0kpCkBAIC03MDkzLDkgKzc1NjYsMTUgQEAKIAogICBDbWRBcmdzLnB1c2hfYmFjaygiLWMiKTsKIAotICBpZiAoQXJncy5oYXNBcmcob3B0aW9uczo6T1BUX2dfR3JvdXApKSB7CisgIGlmIChBcmdzLmhhc0FyZyhvcHRpb25zOjpPUFRfdikpCisgICAgQ21kQXJncy5wdXNoX2JhY2soIi12Iik7CisKKyAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF9nX0dyb3VwKSkKICAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWciKTsKLSAgfQorCisgIGlmIChBcmdzLmhhc0ZsYWcob3B0aW9uczo6T1BUX2Z2ZXJib3NlX2FzbSwgb3B0aW9uczo6T1BUX2Zub192ZXJib3NlX2FzbSwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSkpCisgICAgQ21kQXJncy5wdXNoX2JhY2soIi1mdmVyYm9zZS1hc20iKTsKIAogICBBcmdzLkFkZEFsbEFyZ1ZhbHVlcyhDbWRBcmdzLCBvcHRpb25zOjpPUFRfV2FfQ09NTUEsCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6Ok9QVF9YYXNzZW1ibGVyKTsKQEAgLTcxMjUsNiArNzYwNCwxMyBAQAogICAgIGFzc2VydChPdXRwdXQuaXNOb3RoaW5nKCkgJiYgIkludmFsaWQgb3V0cHV0LiIpOwogICB9CiAKKyAgaWYgKEFyZ3MuaGFzQXJnKG9wdGlvbnM6Ok9QVF92KSkKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLXYiKTsKKworICBFeGNlcHRpb25TZXR0aW5ncyBFSCA9IGV4Y2VwdGlvblNldHRpbmdzKEFyZ3MsIGdldFRvb2xDaGFpbigpLmdldFRyaXBsZSgpKTsKKyAgaWYgKEVILlNob3VsZFVzZUV4Y2VwdGlvblRhYmxlcykKKyAgICBDbWRBcmdzLnB1c2hfYmFjaygiLWZleGNlcHRpb25zIik7CisKICAgQWRkTGlua2VySW5wdXRzKGdldFRvb2xDaGFpbigpLCBJbnB1dHMsIEFyZ3MsIENtZEFyZ3MpOwogCiAgIGNvbnN0IGNoYXIgKkV4ZWMgPQpkaWZmIC0tZ2l0IGEvbGliL0RyaXZlci9Ub29scy5oIGIvbGliL0RyaXZlci9Ub29scy5oCmluZGV4IGQ1YjI4NDguLjU3NWM5ODggMTAwNjQ0Ci0tLSBhL2xpYi9Ecml2ZXIvVG9vbHMuaAorKysgYi9saWIvRHJpdmVyL1Rvb2xzLmgKQEAgLTI1LDcgKzI1LDcgQEAKICAgY2xhc3MgRHJpdmVyOwogCiBuYW1lc3BhY2UgdG9vbGNoYWlucyB7Ci0gIGNsYXNzIERhcndpbjsKKyAgY2xhc3MgTWFjaE87CiB9CiAKIG5hbWVzcGFjZSB0b29scyB7CkBAIC01NCw2ICs1NCw4IEBACiAgICAgdm9pZCBBZGRBUk1UYXJnZXRBcmdzKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtlcm5lbE9yS2V4dCkgY29uc3Q7CisgICAgdm9pZCBBZGRBUk02NFRhcmdldEFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3Q7CiAgICAgdm9pZCBBZGRNSVBTVGFyZ2V0QXJncyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0OwogICAgIHZvaWQgQWRkUjYwMFRhcmdldEFyZ3MoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLApAQCAtNzksMTUgKzgxLDE0IEBACiAgIHB1YmxpYzoKICAgICBDbGFuZyhjb25zdCBUb29sQ2hhaW4gJlRDKSA6IFRvb2woImNsYW5nIiwgImNsYW5nIGZyb250ZW5kIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzR29vZERpYWdub3N0aWNzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQXNzZW1ibGVyKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgaGFzR29vZERpYWdub3N0aWNzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgaGFzSW50ZWdyYXRlZEFzc2VtYmxlcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0OworICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LCBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiAKICAgLy8vIFxicmllZiBDbGFuZyBpbnRlZ3JhdGVkIGFzc2VtYmxlciB0b29sLgpAQCAtOTYsMTUgKzk3LDE0IEBACiAgICAgQ2xhbmdBcyhjb25zdCBUb29sQ2hhaW4gJlRDKSA6IFRvb2woImNsYW5nOjphcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYW5nIGludGVncmF0ZWQgYXNzZW1ibGVyIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzR29vZERpYWdub3N0aWNzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQXNzZW1ibGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBoYXNHb29kRGlhZ25vc3RpY3MoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQXNzZW1ibGVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogCi0gICAgdmlydHVhbCB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogCiAgIC8vLyBnY2MgLSBHZW5lcmljIEdDQyB0b29sIGltcGxlbWVudGF0aW9ucy4KQEAgLTExNCwxMSArMTE0LDExIEBACiAgICAgQ29tbW9uKGNvbnN0IGNoYXIgKk5hbWUsIGNvbnN0IGNoYXIgKlNob3J0TmFtZSwKICAgICAgICAgICAgY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKE5hbWUsIFNob3J0TmFtZSwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0OworICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdCBvdmVycmlkZTsKIAogICAgIC8vLyBSZW5kZXJFeHRyYVRvb2xBcmdzIC0gUmVuZGVyIGFueSBhcmd1bWVudHMgbmVjZXNzYXJ5IHRvIGZvcmNlCiAgICAgLy8vIHRoZSBwYXJ0aWN1bGFyIHRvb2wgbW9kZS4KQEAgLTEzMiwyMyArMTMyLDExIEBACiAgICAgUHJlcHJvY2Vzcyhjb25zdCBUb29sQ2hhaW4gJlRDKSA6IENvbW1vbigiZ2NjOjpQcmVwcm9jZXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnY2MgcHJlcHJvY2Vzc29yIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzR29vZERpYWdub3N0aWNzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGhhc0dvb2REaWFnbm9zdGljcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogCi0gICAgdmlydHVhbCB2b2lkIFJlbmRlckV4dHJhVG9vbEFyZ3MoY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0OwotICB9OwotCi0gIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIFByZWNvbXBpbGUgOiBwdWJsaWMgQ29tbW9uICB7Ci0gIHB1YmxpYzoKLSAgICBQcmVjb21waWxlKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogQ29tbW9uKCJnY2M6OlByZWNvbXBpbGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdjYyBwcmVjb21waWxlIiwgVEMpIHt9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzR29vZERpYWdub3N0aWNzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIFJlbmRlckV4dHJhVG9vbEFyZ3MoY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0OworICAgIHZvaWQgUmVuZGVyRXh0cmFUb29sQXJncyhjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogCiAgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIENvbXBpbGUgOiBwdWJsaWMgQ29tbW9uICB7CkBAIC0xNTYsMjIgKzE0NCwxMSBAQAogICAgIENvbXBpbGUoY29uc3QgVG9vbENoYWluICZUQykgOiBDb21tb24oImdjYzo6Q29tcGlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2NjIGZyb250ZW5kIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzR29vZERpYWdub3N0aWNzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgaGFzR29vZERpYWdub3N0aWNzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBSZW5kZXJFeHRyYVRvb2xBcmdzKGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdDsKLSAgfTsKLQotICBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBBc3NlbWJsZSA6IHB1YmxpYyBDb21tb24gIHsKLSAgcHVibGljOgotICAgIEFzc2VtYmxlKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogQ29tbW9uKCJnY2M6OkFzc2VtYmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzZW1ibGVyICh2aWEgZ2NjKSIsIFRDKSB7fQotCi0gICAgdmlydHVhbCBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIFJlbmRlckV4dHJhVG9vbEFyZ3MoY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0OworICAgIHZvaWQgUmVuZGVyRXh0cmFUb29sQXJncyhjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogCiAgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIExpbmsgOiBwdWJsaWMgQ29tbW9uICB7CkBAIC0xNzksMTEgKzE1NiwxMSBAQAogICAgIExpbmsoY29uc3QgVG9vbENoYWluICZUQykgOiBDb21tb24oImdjYzo6TGluayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlua2VyICh2aWEgZ2NjKSIsIFRDKSB7fQogCi0gICAgdmlydHVhbCBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0xpbmtKb2IoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGlzTGlua0pvYigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBSZW5kZXJFeHRyYVRvb2xBcmdzKGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdDsKKyAgICB2b2lkIFJlbmRlckV4dHJhVG9vbEFyZ3MoY29uc3QgSm9iQWN0aW9uICZKQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdCBvdmVycmlkZTsKICAgfTsKIH0gLy8gZW5kIG5hbWVzcGFjZSBnY2MKIApAQCAtMTk1LDE1ICsxNzIsMTQgQEAKICAgICBBc3NlbWJsZShjb25zdCBUb29sQ2hhaW4gJlRDKSA6IFRvb2woImhleGFnb246OkFzc2VtYmxlIiwKICAgICAgICJoZXhhZ29uLWFzIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBSZW5kZXJFeHRyYVRvb2xBcmdzKGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0OworICAgIHZvaWQgUmVuZGVyRXh0cmFUb29sQXJncyhjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MpIGNvbnN0OworICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LCBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiAKICAgY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgTGluayA6IHB1YmxpYyBUb29sIHsKQEAgLTIxMSwxMTEgKzE4NywxMTggQEAKICAgICBMaW5rKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogVG9vbCgiaGV4YWdvbjo6TGluayIsCiAgICAgICAiaGV4YWdvbi1sZCIsIFRDKSB7fQogCi0gICAgdmlydHVhbCBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0xpbmtKb2IoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGlzTGlua0pvYigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBSZW5kZXJFeHRyYVRvb2xBcmdzKGNvbnN0IEpvYkFjdGlvbiAmSkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6b3B0OjpBcmdTdHJpbmdMaXN0ICZDbWRBcmdzKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0OworICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LCBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiB9IC8vIGVuZCBuYW1lc3BhY2UgaGV4YWdvbi4KIAorbmFtZXNwYWNlIGFybSB7CisgIFN0cmluZ1JlZiBnZXRBUk1UYXJnZXRDUFUoY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKTsKKyAgY29uc3QgY2hhciogZ2V0QVJNQ1BVRm9yTUFyY2goY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSk7CisgIGNvbnN0IGNoYXIqIGdldExMVk1BcmNoU3VmZml4Rm9yQVJNKFN0cmluZ1JlZiBDUFUpOworfQorCituYW1lc3BhY2UgbWlwcyB7CisgIGJvb2wgaGFzTWlwc0FiaUFyZyhjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsIGNvbnN0IGNoYXIgKlZhbHVlKTsKK30KIAogbmFtZXNwYWNlIGRhcndpbiB7Ci0gIGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgZ2V0QXJjaFR5cGVGb3JEYXJ3aW5BcmNoTmFtZShTdHJpbmdSZWYgU3RyKTsKKyAgbGx2bTo6VHJpcGxlOjpBcmNoVHlwZSBnZXRBcmNoVHlwZUZvck1hY2hPQXJjaE5hbWUoU3RyaW5nUmVmIFN0cik7CisgIHZvaWQgc2V0VHJpcGxlVHlwZUZvck1hY2hPQXJjaE5hbWUobGx2bTo6VHJpcGxlICZULCBTdHJpbmdSZWYgU3RyKTsKIAotICBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBEYXJ3aW5Ub29sIDogcHVibGljIFRvb2wgeworICBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBNYWNoT1Rvb2wgOiBwdWJsaWMgVG9vbCB7CiAgICAgdmlydHVhbCB2b2lkIGFuY2hvcigpOwogICBwcm90ZWN0ZWQ6Ci0gICAgdm9pZCBBZGREYXJ3aW5BcmNoKGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKKyAgICB2b2lkIEFkZE1hY2hPQXJjaChjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAmQ21kQXJncykgY29uc3Q7CiAKLSAgICBjb25zdCB0b29sY2hhaW5zOjpEYXJ3aW4gJmdldERhcndpblRvb2xDaGFpbigpIGNvbnN0IHsKLSAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHRvb2xjaGFpbnM6OkRhcndpbiY+KGdldFRvb2xDaGFpbigpKTsKKyAgICBjb25zdCB0b29sY2hhaW5zOjpNYWNoTyAmZ2V0TWFjaE9Ub29sQ2hhaW4oKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0b29sY2hhaW5zOjpNYWNoTyY+KGdldFRvb2xDaGFpbigpKTsKICAgICB9CiAKICAgcHVibGljOgotICAgIERhcndpblRvb2woY29uc3QgY2hhciAqTmFtZSwgY29uc3QgY2hhciAqU2hvcnROYW1lLAorICAgIE1hY2hPVG9vbChjb25zdCBjaGFyICpOYW1lLCBjb25zdCBjaGFyICpTaG9ydE5hbWUsCiAgICAgICAgICAgICAgICBjb25zdCBUb29sQ2hhaW4gJlRDKSA6IFRvb2woTmFtZSwgU2hvcnROYW1lLCBUQykge30KICAgfTsKIAotICBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBBc3NlbWJsZSA6IHB1YmxpYyBEYXJ3aW5Ub29sICB7CisgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIEFzc2VtYmxlIDogcHVibGljIE1hY2hPVG9vbCAgewogICBwdWJsaWM6Ci0gICAgQXNzZW1ibGUoY29uc3QgVG9vbENoYWluICZUQykgOiBEYXJ3aW5Ub29sKCJkYXJ3aW46OkFzc2VtYmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzc2VtYmxlciIsIFRDKSB7fQorICAgIEFzc2VtYmxlKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogTWFjaE9Ub29sKCJkYXJ3aW46OkFzc2VtYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzZW1ibGVyIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Q7CisgICAgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdCBvdmVycmlkZTsKICAgfTsKIAotICBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBMaW5rIDogcHVibGljIERhcndpblRvb2wgIHsKKyAgY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgTGluayA6IHB1YmxpYyBNYWNoT1Rvb2wgIHsKICAgICBib29sIE5lZWRzVGVtcFBhdGgoY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzKSBjb25zdDsKICAgICB2b2lkIEFkZExpbmtBcmdzKENvbXBpbGF0aW9uICZDLCBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJkFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpvcHQ6OkFyZ1N0cmluZ0xpc3QgJkNtZEFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMpIGNvbnN0OwogCiAgIHB1YmxpYzoKLSAgICBMaW5rKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogRGFyd2luVG9vbCgiZGFyd2luOjpMaW5rIiwgImxpbmtlciIsIFRDKSB7fQorICAgIExpbmsoY29uc3QgVG9vbENoYWluICZUQykgOiBNYWNoT1Rvb2woImRhcndpbjo6TGluayIsICJsaW5rZXIiLCBUQykge30KIAotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNMaW5rSm9iKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBpc0xpbmtKb2IoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0OworICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LCBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiAKLSAgY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgTGlwbyA6IHB1YmxpYyBEYXJ3aW5Ub29sICB7CisgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIExpcG8gOiBwdWJsaWMgTWFjaE9Ub29sICB7CiAgIHB1YmxpYzoKLSAgICBMaXBvKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogRGFyd2luVG9vbCgiZGFyd2luOjpMaXBvIiwgImxpcG8iLCBUQykge30KKyAgICBMaXBvKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogTWFjaE9Ub29sKCJkYXJ3aW46OkxpcG8iLCAibGlwbyIsIFRDKSB7fQogCi0gICAgdmlydHVhbCBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0OworICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LCBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiAKLSAgY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgRHN5bXV0aWwgOiBwdWJsaWMgRGFyd2luVG9vbCAgeworICBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBEc3ltdXRpbCA6IHB1YmxpYyBNYWNoT1Rvb2wgIHsKICAgcHVibGljOgotICAgIERzeW11dGlsKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogRGFyd2luVG9vbCgiZGFyd2luOjpEc3ltdXRpbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc3ltdXRpbCIsIFRDKSB7fQorICAgIERzeW11dGlsKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogTWFjaE9Ub29sKCJkYXJ3aW46OkRzeW11dGlsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHN5bXV0aWwiLCBUQykge30KIAotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNEc3ltdXRpbEpvYigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICAgIGJvb2wgaXNEc3ltdXRpbEpvYigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Q7CisgICAgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogCi0gIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIFZlcmlmeURlYnVnIDogcHVibGljIERhcndpblRvb2wgIHsKKyAgY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgVmVyaWZ5RGVidWcgOiBwdWJsaWMgTWFjaE9Ub29sICB7CiAgIHB1YmxpYzoKLSAgICBWZXJpZnlEZWJ1Zyhjb25zdCBUb29sQ2hhaW4gJlRDKSA6IERhcndpblRvb2woImRhcndpbjo6VmVyaWZ5RGVidWciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHdhcmZkdW1wIiwgVEMpIHt9CisgICAgVmVyaWZ5RGVidWcoY29uc3QgVG9vbENoYWluICZUQykgOiBNYWNoT1Rvb2woImRhcndpbjo6VmVyaWZ5RGVidWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkd2FyZmR1bXAiLCBUQykge30KIAotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogCi0gICAgdmlydHVhbCB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogCiB9CkBAIC0zMjcsMjYgKzMxMCwyNSBAQAogICAgIEFzc2VtYmxlKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogVG9vbCgib3BlbmJzZDo6QXNzZW1ibGUiLCAiYXNzZW1ibGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Q7CisgICAgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogICBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBMaW5rIDogcHVibGljIFRvb2wgIHsKICAgcHVibGljOgogICAgIExpbmsoY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKCJvcGVuYnNkOjpMaW5rIiwgImxpbmtlciIsIFRDKSB7fQogCi0gICAgdmlydHVhbCBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0xpbmtKb2IoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGlzTGlua0pvYigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Q7CisgICAgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdCBvdmVycmlkZTsKICAgfTsKIH0gLy8gZW5kIG5hbWVzcGFjZSBvcGVuYnNkCiAKQEAgLTM1NywyNiArMzM5LDI0IEBACiAgICAgQXNzZW1ibGUoY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKCJiaXRyaWc6OkFzc2VtYmxlIiwgImFzc2VtYmxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDKSB7fQogCi0gICAgdmlydHVhbCBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0OworICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LCBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiAgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIExpbmsgOiBwdWJsaWMgVG9vbCAgewogICBwdWJsaWM6CiAgICAgTGluayhjb25zdCBUb29sQ2hhaW4gJlRDKSA6IFRvb2woImJpdHJpZzo6TGluayIsICJsaW5rZXIiLCBUQykge30KIAotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNMaW5rSm9iKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBpc0xpbmtKb2IoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0OworICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LCBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiB9IC8vIGVuZCBuYW1lc3BhY2UgYml0cmlnCiAKQEAgLTM4NywyNiArMzY3LDI0IEBACiAgICAgQXNzZW1ibGUoY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKCJmcmVlYnNkOjpBc3NlbWJsZSIsICJhc3NlbWJsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQykge30KIAotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogCi0gICAgdmlydHVhbCB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogICBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBMaW5rIDogcHVibGljIFRvb2wgIHsKICAgcHVibGljOgogICAgIExpbmsoY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKCJmcmVlYnNkOjpMaW5rIiwgImxpbmtlciIsIFRDKSB7fQogCi0gICAgdmlydHVhbCBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0xpbmtKb2IoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGlzTGlua0pvYigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Q7CisgICAgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdCBvdmVycmlkZTsKICAgfTsKIH0gLy8gZW5kIG5hbWVzcGFjZSBmcmVlYnNkCiAKQEAgLTQxOCwxMyArMzk2LDEyIEBACiAgICAgQXNzZW1ibGUoY29uc3QgVG9vbENoYWluICZUQykKICAgICAgIDogVG9vbCgibmV0YnNkOjpBc3NlbWJsZSIsICJhc3NlbWJsZXIiLCBUQykge30KIAotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogCi0gICAgdmlydHVhbCB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogICBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBMaW5rIDogcHVibGljIFRvb2wgIHsKIApAQCAtNDMyLDE0ICs0MDksMTMgQEAKICAgICBMaW5rKGNvbnN0IFRvb2xDaGFpbiAmVEMpCiAgICAgICA6IFRvb2woIm5ldGJzZDo6TGluayIsICJsaW5rZXIiLCBUQykge30KIAotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNMaW5rSm9iKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBpc0xpbmtKb2IoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0OworICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LCBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiB9IC8vIGVuZCBuYW1lc3BhY2UgbmV0YnNkCiAKQEAgLTQ0OSwyNiArNDI1LDI2IEBACiAgIHB1YmxpYzoKICAgICBBc3NlbWJsZShjb25zdCBUb29sQ2hhaW4gJlRDKSA6IFRvb2woIkdOVTo6QXNzZW1ibGUiLCAiYXNzZW1ibGVyIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Q7CisgICAgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogICBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBMaW5rIDogcHVibGljIFRvb2wgIHsKICAgcHVibGljOgogICAgIExpbmsoY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKCJHTlU6OkxpbmsiLCAibGlua2VyIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzTGlua0pvYigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICAgIGJvb2wgaXNMaW5rSm9iKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCi0gICAgdmlydHVhbCB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiB9CiAgIC8vLyBtaW5peCAtLSBEaXJlY3RseSBjYWxsIEdOVSBCaW51dGlscyBhc3NlbWJsZXIgYW5kIGxpbmtlcgpAQCAtNDc4LDI2ICs0NTQsMjYgQEAKICAgICBBc3NlbWJsZShjb25zdCBUb29sQ2hhaW4gJlRDKSA6IFRvb2woIm1pbml4OjpBc3NlbWJsZSIsICJhc3NlbWJsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQykge30KIAotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogCi0gICAgdmlydHVhbCB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiAgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIExpbmsgOiBwdWJsaWMgVG9vbCAgewogICBwdWJsaWM6CiAgICAgTGluayhjb25zdCBUb29sQ2hhaW4gJlRDKSA6IFRvb2woIm1pbml4OjpMaW5rIiwgImxpbmtlciIsIFRDKSB7fQogCi0gICAgdmlydHVhbCBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0xpbmtKb2IoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGlzTGlua0pvYigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Q7CisgICAgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogfSAvLyBlbmQgbmFtZXNwYWNlIG1pbml4CiAKQEAgLTUwOCwyNiArNDg0LDI0IEBACiAgICAgQXNzZW1ibGUoY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKCJzb2xhcmlzOjpBc3NlbWJsZSIsICJhc3NlbWJsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQykge30KIAotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogCi0gICAgdmlydHVhbCB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogICBjbGFzcyBMTFZNX0xJQlJBUllfVklTSUJJTElUWSBMaW5rIDogcHVibGljIFRvb2wgIHsKICAgcHVibGljOgogICAgIExpbmsoY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKCJzb2xhcmlzOjpMaW5rIiwgImxpbmtlciIsIFRDKSB7fQogCi0gICAgdmlydHVhbCBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0xpbmtKb2IoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGlzTGlua0pvYigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Q7CisgICAgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdCBvdmVycmlkZTsKICAgfTsKIH0gLy8gZW5kIG5hbWVzcGFjZSBzb2xhcmlzCiAKQEAgLTUzOCwyNiArNTEyLDI0IEBACiAgICAgQXNzZW1ibGUoY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKCJhdXJvcmF1eDo6QXNzZW1ibGUiLCAiYXNzZW1ibGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Q7CisgICAgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdCBvdmVycmlkZTsKICAgfTsKICAgY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgTGluayA6IHB1YmxpYyBUb29sICB7CiAgIHB1YmxpYzoKICAgICBMaW5rKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogVG9vbCgiYXVyb3JhdXg6OkxpbmsiLCAibGlua2VyIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzTGlua0pvYigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICAgIGJvb2wgaXNMaW5rSm9iKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCi0gICAgdmlydHVhbCB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogfSAvLyBlbmQgbmFtZXNwYWNlIGF1cm9yYXV4CiAKQEAgLTU2OCwyNiArNTQwLDI1IEBACiAgICAgQXNzZW1ibGUoY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKCJkcmFnb25mbHk6OkFzc2VtYmxlIiwgImFzc2VtYmxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDKSB7fQogCi0gICAgdmlydHVhbCBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0OworICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LCBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiAgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIExpbmsgOiBwdWJsaWMgVG9vbCAgewogICBwdWJsaWM6CiAgICAgTGluayhjb25zdCBUb29sQ2hhaW4gJlRDKSA6IFRvb2woImRyYWdvbmZseTo6TGluayIsICJsaW5rZXIiLCBUQykge30KIAotICAgIHZpcnR1YWwgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNMaW5rSm9iKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBpc0xpbmtKb2IoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0OworICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdCBvdmVycmlkZTsKICAgfTsKIH0gLy8gZW5kIG5hbWVzcGFjZSBkcmFnb25mbHkKIApAQCAtNTk3LDI5ICs1NjgsMjcgQEAKICAgcHVibGljOgogICAgIExpbmsoY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKCJ2aXN1YWxzdHVkaW86OkxpbmsiLCAibGlua2VyIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzTGlua0pvYigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICAgIGJvb2wgaXNMaW5rSm9iKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCi0gICAgdmlydHVhbCB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdDsKKyAgICB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkxpbmtpbmdPdXRwdXQpIGNvbnN0IG92ZXJyaWRlOwogICB9OwogCiAgIGNsYXNzIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIENvbXBpbGUgOiBwdWJsaWMgVG9vbCB7CiAgIHB1YmxpYzoKICAgICBDb21waWxlKGNvbnN0IFRvb2xDaGFpbiAmVEMpIDogVG9vbCgidmlzdWFsc3R1ZGlvOjpDb21waWxlIiwgImNvbXBpbGVyIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZEFzc2VtYmxlcigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNMaW5rSm9iKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGhhc0ludGVncmF0ZWRBc3NlbWJsZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgICAgYm9vbCBoYXNJbnRlZ3JhdGVkQ1BQKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgaXNMaW5rSm9iKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAotICAgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmVENBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Q7CisgICAgdm9pZCBDb25zdHJ1Y3RKb2IoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvICZPdXRwdXQsIGNvbnN0IElucHV0SW5mb0xpc3QgJklucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpvcHQ6OkFyZ0xpc3QgJlRDQXJncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdCBvdmVycmlkZTsKIAogICAgIENvbW1hbmQgKkdldENvbW1hbmQoQ29tcGlsYXRpb24gJkMsIGNvbnN0IEpvYkFjdGlvbiAmSkEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnB1dEluZm8gJk91dHB1dCwKQEAgLTYyOSw2ICs1OTgsMTAgQEAKICAgfTsKIH0gLy8gZW5kIG5hbWVzcGFjZSB2aXN1YWxzdHVkaW8KIAorbmFtZXNwYWNlIGFybSB7CisgIFN0cmluZ1JlZiBnZXRBUk1GbG9hdEFCSShjb25zdCBEcml2ZXIgJkQsIGNvbnN0IGxsdm06Om9wdDo6QXJnTGlzdCAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsbHZtOjpUcmlwbGUgJlRyaXBsZSk7Cit9CiBuYW1lc3BhY2UgWENvcmUgewogICAvLyBGb3IgWENvcmUsIHdlIGRvIG5vdCBuZWVkIHRvIGluc3RhbnRpYXRlIHRvb2xzIGZvciBQcmVQcm9jZXNzLCBQcmVDb21waWxlIGFuZCBDb21waWxlLgogICAvLyBXZSBzaW1wbHkgdXNlICJjbGFuZyAtY2MxIiBmb3IgdGhvc2UgYWN0aW9ucy4KQEAgLTYzNywxMiArNjEwLDExIEBACiAgICAgQXNzZW1ibGUoY29uc3QgVG9vbENoYWluICZUQykgOiBUb29sKCJYQ29yZTo6QXNzZW1ibGUiLAogICAgICAgIlhDb3JlLWFzIiwgVEMpIHt9CiAKLSAgICB2aXJ0dWFsIGJvb2wgaGFzSW50ZWdyYXRlZENQUCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdDsKKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LCBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiAKICAgY2xhc3MgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgTGluayA6IHB1YmxpYyBUb29sIHsKQEAgLTY1MCwxMyArNjIyLDEyIEBACiAgICAgTGluayhjb25zdCBUb29sQ2hhaW4gJlRDKSA6IFRvb2woIlhDb3JlOjpMaW5rIiwKICAgICAgICJYQ29yZS1sZCIsIFRDKSB7fQogCi0gICAgdmlydHVhbCBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0xpbmtKb2IoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCB2b2lkIENvbnN0cnVjdEpvYihDb21waWxhdGlvbiAmQywgY29uc3QgSm9iQWN0aW9uICZKQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRJbmZvTGlzdCAmSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpMaW5raW5nT3V0cHV0KSBjb25zdDsKKyAgICBib29sIGhhc0ludGVncmF0ZWRDUFAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICAgIGJvb2wgaXNMaW5rSm9iKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHZvaWQgQ29uc3RydWN0Sm9iKENvbXBpbGF0aW9uICZDLCBjb25zdCBKb2JBY3Rpb24gJkpBLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0SW5mbyAmT3V0cHV0LCBjb25zdCBJbnB1dEluZm9MaXN0ICZJbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6b3B0OjpBcmdMaXN0ICZUQ0FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTGlua2luZ091dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CiAgIH07CiB9IC8vIGVuZCBuYW1lc3BhY2UgWENvcmUuCiAKZGlmZiAtLWdpdCBhL2xpYi9Ecml2ZXIvVHlwZXMuY3BwIGIvbGliL0RyaXZlci9UeXBlcy5jcHAKaW5kZXggZDk0N2FlNy4uMzUzOGRiYyAxMDA2NDQKLS0tIGEvbGliL0RyaXZlci9UeXBlcy5jcHAKKysrIGIvbGliL0RyaXZlci9UeXBlcy5jcHAKQEAgLTE3NCw2ICsxNzQsOCBAQAogICAgICAgICAgICAuQ2FzZSgiRjk1IiwgVFlfRm9ydHJhbikKICAgICAgICAgICAgLkNhc2UoIm1paSIsIFRZX1BQX09iakNYWCkKICAgICAgICAgICAgLkNhc2UoInBjbSIsIFRZX01vZHVsZUZpbGUpCisgICAgICAgICAgIC5DYXNlKCJwY2giLCBUWV9QQ0gpCisgICAgICAgICAgIC5DYXNlKCJnY2giLCBUWV9QQ0gpCiAgICAgICAgICAgIC5EZWZhdWx0KFRZX0lOVkFMSUQpOwogfQogCmRpZmYgLS1naXQgYS9saWIvRHJpdmVyL1dpbmRvd3NUb29sQ2hhaW4uY3BwIGIvbGliL0RyaXZlci9XaW5kb3dzVG9vbENoYWluLmNwcAppbmRleCAyYjYzMjBhLi5hMzJhN2JmIDEwMDY0NAotLS0gYS9saWIvRHJpdmVyL1dpbmRvd3NUb29sQ2hhaW4uY3BwCisrKyBiL2xpYi9Ecml2ZXIvV2luZG93c1Rvb2xDaGFpbi5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKIH0KIAogVG9vbCAqV2luZG93czo6YnVpbGRBc3NlbWJsZXIoKSBjb25zdCB7Ci0gIGlmIChnZXRUcmlwbGUoKS5nZXRFbnZpcm9ubWVudCgpID09IGxsdm06OlRyaXBsZTo6TWFjaE8pCisgIGlmIChnZXRUcmlwbGUoKS5pc09TQmluRm9ybWF0TWFjaE8oKSkKICAgICByZXR1cm4gbmV3IHRvb2xzOjpkYXJ3aW46OkFzc2VtYmxlKCp0aGlzKTsKICAgZ2V0RHJpdmVyKCkuRGlhZyhjbGFuZzo6ZGlhZzo6ZXJyX25vX2V4dGVybmFsX2Fzc2VtYmxlcik7CiAgIHJldHVybiBOVUxMOwpAQCAtMzI0LDcgKzMyNCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIFZTRGlyICsgIlxcVkNcXFBsYXRmb3JtU0RLXFxJbmNsdWRlIik7CiAgICAgcmV0dXJuOwogICB9Ci0jZW5kaWYgLy8gX01TQ19WRVIKIAogICAvLyBBcyBhIGZhbGxiYWNrLCBzZWxlY3QgZGVmYXVsdCBpbnN0YWxsIHBhdGhzLgogICBjb25zdCBTdHJpbmdSZWYgUGF0aHNbXSA9IHsKQEAgLTMzNSw2ICszMzQsNyBAQAogICAgICJDOi9Qcm9ncmFtIEZpbGVzL01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDgvVkMvUGxhdGZvcm1TREsvSW5jbHVkZSIKICAgfTsKICAgYWRkU3lzdGVtSW5jbHVkZXMoRHJpdmVyQXJncywgQ0MxQXJncywgUGF0aHMpOworI2VuZGlmIC8vIF9NU0NfVkVSCiB9CiAKIHZvaWQgV2luZG93czo6QWRkQ2xhbmdDWFhTdGRsaWJJbmNsdWRlQXJncyhjb25zdCBBcmdMaXN0ICZEcml2ZXJBcmdzLApkaWZmIC0tZ2l0IGEvbGliL0VkaXQvQ01ha2VMaXN0cy50eHQgYi9saWIvRWRpdC9DTWFrZUxpc3RzLnR4dAppbmRleCBjY2UxYzE5Li4wODQ5NWY4IDEwMDY0NAotLS0gYS9saWIvRWRpdC9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvRWRpdC9DTWFrZUxpc3RzLnR4dApAQCAtMSwxOSArMSwxMyBAQAorc2V0KExMVk1fTElOS19DT01QT05FTlRTCisgIFN1cHBvcnQKKyAgKQorCiBhZGRfY2xhbmdfbGlicmFyeShjbGFuZ0VkaXQKICAgQ29tbWl0LmNwcAogICBFZGl0ZWRTb3VyY2UuY3BwCiAgIFJld3JpdGVPYmpDRm91bmRhdGlvbkFQSS5jcHAKLSAgKQogCi1hZGRfZGVwZW5kZW5jaWVzKGNsYW5nRWRpdAotICBDbGFuZ0F0dHJDbGFzc2VzCi0gIENsYW5nQXR0ckxpc3QKLSAgQ2xhbmdDb21tZW50Tm9kZXMKLSAgQ2xhbmdEZWNsTm9kZXMKLSAgQ2xhbmdEaWFnbm9zdGljQ29tbW9uCi0gIENsYW5nU3RtdE5vZGVzCi0gICkKLQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNsYW5nRWRpdAorICBMSU5LX0xJQlMKICAgY2xhbmdCYXNpYwogICBjbGFuZ0FTVAogICBjbGFuZ0xleApkaWZmIC0tZ2l0IGEvbGliL0VkaXQvRWRpdGVkU291cmNlLmNwcCBiL2xpYi9FZGl0L0VkaXRlZFNvdXJjZS5jcHAKaW5kZXggMzRiNWU2Mi4uOGZhMmVlNSAxMDA2NDQKLS0tIGEvbGliL0VkaXQvRWRpdGVkU291cmNlLmNwcAorKysgYi9saWIvRWRpdC9FZGl0ZWRTb3VyY2UuY3BwCkBAIC03MiwxMyArNzIsMTEgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIFR3aW5lIGNvbmNhdDsKICAgaWYgKGJlZm9yZVByZXZpb3VzSW5zZXJ0aW9ucykKLSAgICBjb25jYXQgPSBUd2luZSh0ZXh0KSArIEZBLlRleHQ7CisgICAgRkEuVGV4dCA9IGNvcHlTdHJpbmcoVHdpbmUodGV4dCkgKyBGQS5UZXh0KTsKICAgZWxzZQotICAgIGNvbmNhdCA9IFR3aW5lKEZBLlRleHQpICsgIHRleHQ7CisgICAgRkEuVGV4dCA9IGNvcHlTdHJpbmcoVHdpbmUoRkEuVGV4dCkgKyB0ZXh0KTsKIAotICBGQS5UZXh0ID0gY29weVN0cmluZyhjb25jYXQpOwogICByZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL0VkaXQvUmV3cml0ZU9iakNGb3VuZGF0aW9uQVBJLmNwcCBiL2xpYi9FZGl0L1Jld3JpdGVPYmpDRm91bmRhdGlvbkFQSS5jcHAKaW5kZXggZjQyMDZmYi4uODc5YzE3YSAxMDA2NDQKLS0tIGEvbGliL0VkaXQvUmV3cml0ZU9iakNGb3VuZGF0aW9uQVBJLmNwcAorKysgYi9saWIvRWRpdC9SZXdyaXRlT2JqQ0ZvdW5kYXRpb25BUEkuY3BwCkBAIC0xMDMzLDYgKzEwMzMsNyBAQAogICAgIGNhc2UgQ0tfSW50ZWdyYWxDb21wbGV4VG9SZWFsOgogICAgIGNhc2UgQ0tfSW50ZWdyYWxDb21wbGV4VG9Cb29sZWFuOgogICAgIGNhc2UgQ0tfQXRvbWljVG9Ob25BdG9taWM6CisgICAgY2FzZSBDS19BZGRyZXNzU3BhY2VDb252ZXJzaW9uOgogICAgICAgbmVlZHNDYXN0ID0gdHJ1ZTsKICAgICAgIGJyZWFrOwogCmRpZmYgLS1naXQgYS9saWIvRm9ybWF0L0FuZHJvaWQubWsgYi9saWIvRm9ybWF0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyZjI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9Gb3JtYXQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQzIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBGb3IgdGhlIGhvc3Qgb25seQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitpbmNsdWRlICQoQ0xFQVJfVEJMR0VOX1ZBUlMpCisKK1RCTEdFTl9UQUJMRVMgOj0gXAorICBBdHRySGFzQXR0cmlidXRlSW1wbC5pbmMgXAorICBEaWFnbm9zdGljQVNUS2luZHMuaW5jIFwKKyAgRGlhZ25vc3RpY0FuYWx5c2lzS2luZHMuaW5jIFwKKyAgRGlhZ25vc3RpY0NvbW1lbnRLaW5kcy5pbmMgXAorICBEaWFnbm9zdGljQ29tbW9uS2luZHMuaW5jIFwKKyAgRGlhZ25vc3RpY0RyaXZlcktpbmRzLmluYyBcCisgIERpYWdub3N0aWNGcm9udGVuZEtpbmRzLmluYyBcCisgIERpYWdub3N0aWNHcm91cHMuaW5jIFwKKyAgRGlhZ25vc3RpY0luZGV4TmFtZS5pbmMgXAorICBEaWFnbm9zdGljTGV4S2luZHMuaW5jIFwKKyAgRGlhZ25vc3RpY1BhcnNlS2luZHMuaW5jIFwKKyAgRGlhZ25vc3RpY1NlbWFLaW5kcy5pbmMgXAorICBEaWFnbm9zdGljU2VyaWFsaXphdGlvbktpbmRzLmluYyBcCisgIGFybV9uZW9uLmluYworCitjbGFuZ19mb3JtYXRfU1JDX0ZJTEVTIDo9IFwKKyAgQnJlYWthYmxlVG9rZW4uY3BwIFwKKyAgQ29udGludWF0aW9uSW5kZW50ZXIuY3BwIFwKKyAgRm9ybWF0LmNwcCBcCisgIEZvcm1hdFRva2VuLmNwcCBcCisgIFRva2VuQW5ub3RhdG9yLmNwcCBcCisgIFVud3JhcHBlZExpbmVQYXJzZXIuY3BwIFwKKyAgV2hpdGVzcGFjZU1hbmFnZXIuY3BwCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNsYW5nX2Zvcm1hdF9TUkNfRklMRVMpCisKK0xPQ0FMX01PRFVMRTo9IGxpYmNsYW5nRm9ybWF0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQ0xBTkdfSE9TVF9CVUlMRF9NSykKK2luY2x1ZGUgJChDTEFOR19WRVJTSU9OX0lOQ19NSykKK2luY2x1ZGUgJChDTEFOR19UQkxHRU5fUlVMRVNfTUspCitpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYi9Gb3JtYXQvQnJlYWthYmxlVG9rZW4uY3BwIGIvbGliL0Zvcm1hdC9CcmVha2FibGVUb2tlbi5jcHAKaW5kZXggZDcyMGNlOS4uZDQzYTc3NCAxMDA2NDQKLS0tIGEvbGliL0Zvcm1hdC9CcmVha2FibGVUb2tlbi5jcHAKKysrIGIvbGliL0Zvcm1hdC9CcmVha2FibGVUb2tlbi5jcHAKQEAgLTkyLDkgKzkyLDcgQEAKICAgICByZXR1cm4gQnJlYWthYmxlVG9rZW46OlNwbGl0KFN0cmluZ1JlZjo6bnBvcywgMCk7CiAgIGlmIChDb2x1bW5MaW1pdCA8PSBVc2VkQ29sdW1ucykKICAgICByZXR1cm4gQnJlYWthYmxlVG9rZW46OlNwbGl0KFN0cmluZ1JlZjo6bnBvcywgMCk7Ci0gIHVuc2lnbmVkIE1heFNwbGl0ID0gc3RkOjptaW48dW5zaWduZWQ+KAotICAgICAgQ29sdW1uTGltaXQgLSBVc2VkQ29sdW1ucywKLSAgICAgIGVuY29kaW5nOjpjb2x1bW5XaWR0aFdpdGhUYWJzKFRleHQsIFVzZWRDb2x1bW5zLCBUYWJXaWR0aCwgRW5jb2RpbmcpIC0gMSk7CisgIHVuc2lnbmVkIE1heFNwbGl0ID0gQ29sdW1uTGltaXQgLSBVc2VkQ29sdW1uczsKICAgU3RyaW5nUmVmOjpzaXplX3R5cGUgU3BhY2VPZmZzZXQgPSAwOwogICBTdHJpbmdSZWY6OnNpemVfdHlwZSBTbGFzaE9mZnNldCA9IDA7CiAgIFN0cmluZ1JlZjo6c2l6ZV90eXBlIFdvcmRTdGFydE9mZnNldCA9IDA7CkBAIC0xMTAsNyArMTA4LDcgQEAKICAgICAgICAgICBUZXh0LnN1YnN0cigwLCBBZHZhbmNlKSwgVXNlZENvbHVtbnMgKyBDaGFycywgVGFiV2lkdGgsIEVuY29kaW5nKTsKICAgICB9CiAKLSAgICBpZiAoQ2hhcnMgPiBNYXhTcGxpdCkKKyAgICBpZiAoQ2hhcnMgPiBNYXhTcGxpdCB8fCBUZXh0LnNpemUoKSA9PSBBZHZhbmNlKQogICAgICAgYnJlYWs7CiAKICAgICBpZiAoSXNCbGFuayhUZXh0WzBdKSkKQEAgLTE1MSw3ICsxNDksNyBAQAogICAgIGVuY29kaW5nOjpFbmNvZGluZyBFbmNvZGluZywgY29uc3QgRm9ybWF0U3R5bGUgJlN0eWxlKQogICAgIDogQnJlYWthYmxlVG9rZW4oVG9rLCBJbmRlbnRMZXZlbCwgSW5QUERpcmVjdGl2ZSwgRW5jb2RpbmcsIFN0eWxlKSwKICAgICAgIFN0YXJ0Q29sdW1uKFN0YXJ0Q29sdW1uKSwgUHJlZml4KFByZWZpeCksIFBvc3RmaXgoUG9zdGZpeCkgewotICBhc3NlcnQoVG9rLlRva2VuVGV4dC5zdGFydHN3aXRoKFByZWZpeCkgJiYgVG9rLlRva2VuVGV4dC5lbmRzd2l0aChQb3N0Zml4KSk7CisgIGFzc2VydChUb2suVG9rZW5UZXh0LmVuZHN3aXRoKFBvc3RmaXgpKTsKICAgTGluZSA9IFRvay5Ub2tlblRleHQuc3Vic3RyKAogICAgICAgUHJlZml4LnNpemUoKSwgVG9rLlRva2VuVGV4dC5zaXplKCkgLSBQcmVmaXguc2l6ZSgpIC0gUG9zdGZpeC5zaXplKCkpOwogfQpAQCAtMTc0LDI0ICsxNzIsMzggQEAKIHZvaWQgQnJlYWthYmxlU3RyaW5nTGl0ZXJhbDo6aW5zZXJ0QnJlYWsodW5zaWduZWQgTGluZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUYWlsT2Zmc2V0LCBTcGxpdCBTcGxpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpdGVzcGFjZU1hbmFnZXIgJldoaXRlc3BhY2VzKSB7CisgIHVuc2lnbmVkIExlYWRpbmdTcGFjZXMgPSBTdGFydENvbHVtbjsKKyAgLy8gVGhlICdAJyBvZiBhbiBPYmpDIHN0cmluZyBsaXRlcmFsIChAIlRlc3QiKSBkb2VzIG5vdCBiZWNvbWUgcGFydCBvZiB0aGUKKyAgLy8gc3RyaW5nIHRva2VuLgorICAvLyBGSVhNRTogSXQgbWlnaHQgYmUgYSBjbGVhbmVyIHNvbHV0aW9uIHRvIG1lcmdlIHRoZSB0b2tlbnMgYXMgYQorICAvLyBwcmVjb21wdXRhdGlvbiBzdGVwLgorICBpZiAoUHJlZml4LnN0YXJ0c3dpdGgoIkAiKSkKKyAgICAtLUxlYWRpbmdTcGFjZXM7CiAgIFdoaXRlc3BhY2VzLnJlcGxhY2VXaGl0ZXNwYWNlSW5Ub2tlbigKICAgICAgIFRvaywgUHJlZml4LnNpemUoKSArIFRhaWxPZmZzZXQgKyBTcGxpdC5maXJzdCwgU3BsaXQuc2Vjb25kLCBQb3N0Zml4LAotICAgICAgUHJlZml4LCBJblBQRGlyZWN0aXZlLCAxLCBJbmRlbnRMZXZlbCwgU3RhcnRDb2x1bW4pOworICAgICAgUHJlZml4LCBJblBQRGlyZWN0aXZlLCAxLCBJbmRlbnRMZXZlbCwgTGVhZGluZ1NwYWNlcyk7CiB9CiAKLXN0YXRpYyBTdHJpbmdSZWYgZ2V0TGluZUNvbW1lbnRQcmVmaXgoU3RyaW5nUmVmIENvbW1lbnQpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEtub3duUHJlZml4ZXNbXSA9IHsgIi8vLyAiLCAiLy8vIiwgIi8vICIsICIvLyIgfTsKLSAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBsbHZtOjphcnJheV9sZW5ndGhvZihLbm93blByZWZpeGVzKTsgaSAhPSBlOyArK2kpCi0gICAgaWYgKENvbW1lbnQuc3RhcnRzd2l0aChLbm93blByZWZpeGVzW2ldKSkKLSAgICAgIHJldHVybiBLbm93blByZWZpeGVzW2ldOwotICByZXR1cm4gIiI7CitzdGF0aWMgU3RyaW5nUmVmIGdldExpbmVDb21tZW50SW5kZW50UHJlZml4KFN0cmluZ1JlZiBDb21tZW50KSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBLbm93blByZWZpeGVzW10gPSB7ICIvLy8iLCAiLy8iIH07CisgIFN0cmluZ1JlZiBMb25nZXN0UHJlZml4OworICBmb3IgKFN0cmluZ1JlZiBLbm93blByZWZpeCA6IEtub3duUHJlZml4ZXMpIHsKKyAgICBpZiAoQ29tbWVudC5zdGFydHN3aXRoKEtub3duUHJlZml4KSkgeworICAgICAgc2l6ZV90IFByZWZpeExlbmd0aCA9IEtub3duUHJlZml4LnNpemUoKTsKKyAgICAgIHdoaWxlIChQcmVmaXhMZW5ndGggPCBDb21tZW50LnNpemUoKSAmJiBDb21tZW50W1ByZWZpeExlbmd0aF0gPT0gJyAnKQorICAgICAgICArK1ByZWZpeExlbmd0aDsKKyAgICAgIGlmIChQcmVmaXhMZW5ndGggPiBMb25nZXN0UHJlZml4LnNpemUoKSkKKyAgICAgICAgTG9uZ2VzdFByZWZpeCA9IENvbW1lbnQuc3Vic3RyKDAsIFByZWZpeExlbmd0aCk7CisgICAgfQorICB9CisgIHJldHVybiBMb25nZXN0UHJlZml4OwogfQogCiBCcmVha2FibGVMaW5lQ29tbWVudDo6QnJlYWthYmxlTGluZUNvbW1lbnQoCiAgICAgY29uc3QgRm9ybWF0VG9rZW4gJlRva2VuLCB1bnNpZ25lZCBJbmRlbnRMZXZlbCwgdW5zaWduZWQgU3RhcnRDb2x1bW4sCiAgICAgYm9vbCBJblBQRGlyZWN0aXZlLCBlbmNvZGluZzo6RW5jb2RpbmcgRW5jb2RpbmcsIGNvbnN0IEZvcm1hdFN0eWxlICZTdHlsZSkKICAgICA6IEJyZWFrYWJsZVNpbmdsZUxpbmVUb2tlbihUb2tlbiwgSW5kZW50TGV2ZWwsIFN0YXJ0Q29sdW1uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmVDb21tZW50UHJlZml4KFRva2VuLlRva2VuVGV4dCksICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmVDb21tZW50SW5kZW50UHJlZml4KFRva2VuLlRva2VuVGV4dCksICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluUFBEaXJlY3RpdmUsIEVuY29kaW5nLCBTdHlsZSkgewogICBPcmlnaW5hbFByZWZpeCA9IFByZWZpeDsKICAgaWYgKFRva2VuLlRva2VuVGV4dC5zaXplKCkgPiBQcmVmaXguc2l6ZSgpICYmCkBAIC0zMzcsNyArMzQ5LDcgQEAKICAgTGVhZGluZ1doaXRlc3BhY2VbTGluZUluZGV4XSA9CiAgICAgICBMaW5lc1tMaW5lSW5kZXhdLmJlZ2luKCkgLSBMaW5lc1tMaW5lSW5kZXggLSAxXS5lbmQoKTsKIAotICAvLyBBZGp1c3QgdGhlIHN0YXJ0IGNvbHVtbiB1bmlmb3JtbHkgYWNjcm9zcyBhbGwgbGluZXMuCisgIC8vIEFkanVzdCB0aGUgc3RhcnQgY29sdW1uIHVuaWZvcm1seSBhY3Jvc3MgYWxsIGxpbmVzLgogICBTdGFydE9mTGluZUNvbHVtbltMaW5lSW5kZXhdID0gc3RkOjptYXg8aW50PigKICAgICAgIDAsCiAgICAgICBlbmNvZGluZzo6Y29sdW1uV2lkdGhXaXRoVGFicyhXaGl0ZXNwYWNlLCAwLCBTdHlsZS5UYWJXaWR0aCwgRW5jb2RpbmcpICsKZGlmZiAtLWdpdCBhL2xpYi9Gb3JtYXQvQnJlYWthYmxlVG9rZW4uaCBiL2xpYi9Gb3JtYXQvQnJlYWthYmxlVG9rZW4uaAppbmRleCBiOTY1MTkwLi5lMjk0YTUwIDEwMDY0NAotLS0gYS9saWIvRm9ybWF0L0JyZWFrYWJsZVRva2VuLmgKKysrIGIvbGliL0Zvcm1hdC9CcmVha2FibGVUb2tlbi5oCkBAIC05MCwxMCArOTAsOSBAQAogLy8vIFxjIGdldFNwbGl0KCkgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2hpbGQgY2xhc3Nlcy4KIGNsYXNzIEJyZWFrYWJsZVNpbmdsZUxpbmVUb2tlbiA6IHB1YmxpYyBCcmVha2FibGVUb2tlbiB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgdW5zaWduZWQgZ2V0TGluZUNvdW50KCkgY29uc3Q7Ci0gIHZpcnR1YWwgdW5zaWduZWQgZ2V0TGluZUxlbmd0aEFmdGVyU3BsaXQodW5zaWduZWQgTGluZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRhaWxPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmOjpzaXplX3R5cGUgTGVuZ3RoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0TGluZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVuc2lnbmVkIGdldExpbmVMZW5ndGhBZnRlclNwbGl0KHVuc2lnbmVkIExpbmVJbmRleCwgdW5zaWduZWQgVGFpbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmOjpzaXplX3R5cGUgTGVuZ3RoKSBjb25zdCBvdmVycmlkZTsKIAogcHJvdGVjdGVkOgogICBCcmVha2FibGVTaW5nbGVMaW5lVG9rZW4oY29uc3QgRm9ybWF0VG9rZW4gJlRvaywgdW5zaWduZWQgSW5kZW50TGV2ZWwsCkBAIC0xMjMsMTMgKzEyMiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBQb3N0Zml4LCBib29sIEluUFBEaXJlY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6OkVuY29kaW5nIEVuY29kaW5nLCBjb25zdCBGb3JtYXRTdHlsZSAmU3R5bGUpOwogCi0gIHZpcnR1YWwgU3BsaXQgZ2V0U3BsaXQodW5zaWduZWQgTGluZUluZGV4LCB1bnNpZ25lZCBUYWlsT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbHVtbkxpbWl0KSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIGluc2VydEJyZWFrKHVuc2lnbmVkIExpbmVJbmRleCwgdW5zaWduZWQgVGFpbE9mZnNldCwgU3BsaXQgU3BsaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZXNwYWNlTWFuYWdlciAmV2hpdGVzcGFjZXMpOwotICB2aXJ0dWFsIHZvaWQgcmVwbGFjZVdoaXRlc3BhY2UodW5zaWduZWQgTGluZUluZGV4LCB1bnNpZ25lZCBUYWlsT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BsaXQgU3BsaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZXNwYWNlTWFuYWdlciAmV2hpdGVzcGFjZXMpIHt9CisgIFNwbGl0IGdldFNwbGl0KHVuc2lnbmVkIExpbmVJbmRleCwgdW5zaWduZWQgVGFpbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sdW1uTGltaXQpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGluc2VydEJyZWFrKHVuc2lnbmVkIExpbmVJbmRleCwgdW5zaWduZWQgVGFpbE9mZnNldCwgU3BsaXQgU3BsaXQsCisgICAgICAgICAgICAgICAgICAgV2hpdGVzcGFjZU1hbmFnZXIgJldoaXRlc3BhY2VzKSBvdmVycmlkZTsKKyAgdm9pZCByZXBsYWNlV2hpdGVzcGFjZSh1bnNpZ25lZCBMaW5lSW5kZXgsIHVuc2lnbmVkIFRhaWxPZmZzZXQsIFNwbGl0IFNwbGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdoaXRlc3BhY2VNYW5hZ2VyICZXaGl0ZXNwYWNlcykgb3ZlcnJpZGUge30KIH07CiAKIGNsYXNzIEJyZWFrYWJsZUxpbmVDb21tZW50IDogcHVibGljIEJyZWFrYWJsZVNpbmdsZUxpbmVUb2tlbiB7CkBAIC0xNDIsMTUgKzE0MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdGFydENvbHVtbiwgYm9vbCBJblBQRGlyZWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzo6RW5jb2RpbmcgRW5jb2RpbmcsIGNvbnN0IEZvcm1hdFN0eWxlICZTdHlsZSk7CiAKLSAgdmlydHVhbCBTcGxpdCBnZXRTcGxpdCh1bnNpZ25lZCBMaW5lSW5kZXgsIHVuc2lnbmVkIFRhaWxPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sdW1uTGltaXQpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgaW5zZXJ0QnJlYWsodW5zaWduZWQgTGluZUluZGV4LCB1bnNpZ25lZCBUYWlsT2Zmc2V0LCBTcGxpdCBTcGxpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoaXRlc3BhY2VNYW5hZ2VyICZXaGl0ZXNwYWNlcyk7Ci0gIHZpcnR1YWwgdm9pZCByZXBsYWNlV2hpdGVzcGFjZSh1bnNpZ25lZCBMaW5lSW5kZXgsIHVuc2lnbmVkIFRhaWxPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGxpdCBTcGxpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoaXRlc3BhY2VNYW5hZ2VyICZXaGl0ZXNwYWNlcyk7Ci0gIHZpcnR1YWwgdm9pZCByZXBsYWNlV2hpdGVzcGFjZUJlZm9yZSh1bnNpZ25lZCBMaW5lSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZXNwYWNlTWFuYWdlciAmV2hpdGVzcGFjZXMpOworICBTcGxpdCBnZXRTcGxpdCh1bnNpZ25lZCBMaW5lSW5kZXgsIHVuc2lnbmVkIFRhaWxPZmZzZXQsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbHVtbkxpbWl0KSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBpbnNlcnRCcmVhayh1bnNpZ25lZCBMaW5lSW5kZXgsIHVuc2lnbmVkIFRhaWxPZmZzZXQsIFNwbGl0IFNwbGl0LAorICAgICAgICAgICAgICAgICAgIFdoaXRlc3BhY2VNYW5hZ2VyICZXaGl0ZXNwYWNlcykgb3ZlcnJpZGU7CisgIHZvaWQgcmVwbGFjZVdoaXRlc3BhY2UodW5zaWduZWQgTGluZUluZGV4LCB1bnNpZ25lZCBUYWlsT2Zmc2V0LCBTcGxpdCBTcGxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZXNwYWNlTWFuYWdlciAmV2hpdGVzcGFjZXMpIG92ZXJyaWRlOworICB2b2lkIHJlcGxhY2VXaGl0ZXNwYWNlQmVmb3JlKHVuc2lnbmVkIExpbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZXNwYWNlTWFuYWdlciAmV2hpdGVzcGFjZXMpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAvLyBUaGUgcHJlZml4IHdpdGhvdXQgYW4gYWRkaXRpb25hbCBzcGFjZSBpZiBvbmUgd2FzIGFkZGVkLgpAQCAtMTcwLDE5ICsxNjcsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRmlyc3RJbkxpbmUsIGJvb2wgSW5QUERpcmVjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOjpFbmNvZGluZyBFbmNvZGluZywgY29uc3QgRm9ybWF0U3R5bGUgJlN0eWxlKTsKIAotICB2aXJ0dWFsIHVuc2lnbmVkIGdldExpbmVDb3VudCgpIGNvbnN0OwotICB2aXJ0dWFsIHVuc2lnbmVkIGdldExpbmVMZW5ndGhBZnRlclNwbGl0KHVuc2lnbmVkIExpbmVJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUYWlsT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZjo6c2l6ZV90eXBlIExlbmd0aCkgY29uc3Q7Ci0gIHZpcnR1YWwgU3BsaXQgZ2V0U3BsaXQodW5zaWduZWQgTGluZUluZGV4LCB1bnNpZ25lZCBUYWlsT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbHVtbkxpbWl0KSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIGluc2VydEJyZWFrKHVuc2lnbmVkIExpbmVJbmRleCwgdW5zaWduZWQgVGFpbE9mZnNldCwgU3BsaXQgU3BsaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZXNwYWNlTWFuYWdlciAmV2hpdGVzcGFjZXMpOwotICB2aXJ0dWFsIHZvaWQgcmVwbGFjZVdoaXRlc3BhY2UodW5zaWduZWQgTGluZUluZGV4LCB1bnNpZ25lZCBUYWlsT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BsaXQgU3BsaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZXNwYWNlTWFuYWdlciAmV2hpdGVzcGFjZXMpOwotICB2aXJ0dWFsIHZvaWQgcmVwbGFjZVdoaXRlc3BhY2VCZWZvcmUodW5zaWduZWQgTGluZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpdGVzcGFjZU1hbmFnZXIgJldoaXRlc3BhY2VzKTsKKyAgdW5zaWduZWQgZ2V0TGluZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVuc2lnbmVkIGdldExpbmVMZW5ndGhBZnRlclNwbGl0KHVuc2lnbmVkIExpbmVJbmRleCwgdW5zaWduZWQgVGFpbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmOjpzaXplX3R5cGUgTGVuZ3RoKSBjb25zdCBvdmVycmlkZTsKKyAgU3BsaXQgZ2V0U3BsaXQodW5zaWduZWQgTGluZUluZGV4LCB1bnNpZ25lZCBUYWlsT2Zmc2V0LAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW5MaW1pdCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgaW5zZXJ0QnJlYWsodW5zaWduZWQgTGluZUluZGV4LCB1bnNpZ25lZCBUYWlsT2Zmc2V0LCBTcGxpdCBTcGxpdCwKKyAgICAgICAgICAgICAgICAgICBXaGl0ZXNwYWNlTWFuYWdlciAmV2hpdGVzcGFjZXMpIG92ZXJyaWRlOworICB2b2lkIHJlcGxhY2VXaGl0ZXNwYWNlKHVuc2lnbmVkIExpbmVJbmRleCwgdW5zaWduZWQgVGFpbE9mZnNldCwgU3BsaXQgU3BsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2hpdGVzcGFjZU1hbmFnZXIgJldoaXRlc3BhY2VzKSBvdmVycmlkZTsKKyAgdm9pZCByZXBsYWNlV2hpdGVzcGFjZUJlZm9yZSh1bnNpZ25lZCBMaW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpdGVzcGFjZU1hbmFnZXIgJldoaXRlc3BhY2VzKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgLy8gUmVhcnJhbmdlcyB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIExpbmVzW0xpbmVJbmRleC0xXSBhbmQgTGluZXNbTGluZUluZGV4XSwKZGlmZiAtLWdpdCBhL2xpYi9Gb3JtYXQvQ01ha2VMaXN0cy50eHQgYi9saWIvRm9ybWF0L0NNYWtlTGlzdHMudHh0CmluZGV4IGUzZWY1YmQuLjQ3ZTE1YmQgMTAwNjQ0Ci0tLSBhL2xpYi9Gb3JtYXQvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL0Zvcm1hdC9DTWFrZUxpc3RzLnR4dApAQCAtOCwyMyArOCw5IEBACiAgIFRva2VuQW5ub3RhdG9yLmNwcAogICBVbndyYXBwZWRMaW5lUGFyc2VyLmNwcAogICBXaGl0ZXNwYWNlTWFuYWdlci5jcHAKLSAgKQogCi1hZGRfZGVwZW5kZW5jaWVzKGNsYW5nRm9ybWF0Ci0gIENsYW5nQXR0ckNsYXNzZXMKLSAgQ2xhbmdBdHRyTGlzdAotICBDbGFuZ0RlY2xOb2RlcwotICBDbGFuZ0RpYWdub3N0aWNDb21tb24KLSAgQ2xhbmdEaWFnbm9zdGljRnJvbnRlbmQKLSAgQ2xhbmdTdG10Tm9kZXMKLSAgKQotCi10YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmdGb3JtYXQKKyAgTElOS19MSUJTCiAgIGNsYW5nQmFzaWMKLSAgY2xhbmdGcm9udGVuZAotICBjbGFuZ0FTVAotICBjbGFuZ0FTVE1hdGNoZXJzCi0gIGNsYW5nUmV3cml0ZUNvcmUKLSAgY2xhbmdSZXdyaXRlRnJvbnRlbmQKKyAgY2xhbmdMZXgKICAgY2xhbmdUb29saW5nCiAgICkKZGlmZiAtLWdpdCBhL2xpYi9Gb3JtYXQvQ29udGludWF0aW9uSW5kZW50ZXIuY3BwIGIvbGliL0Zvcm1hdC9Db250aW51YXRpb25JbmRlbnRlci5jcHAKaW5kZXggOTcxYWNjMi4uNWEzZGVlNiAxMDA2NDQKLS0tIGEvbGliL0Zvcm1hdC9Db250aW51YXRpb25JbmRlbnRlci5jcHAKKysrIGIvbGliL0Zvcm1hdC9Db250aW51YXRpb25JbmRlbnRlci5jcHAKQEAgLTYzLDcgKzYzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEJpblBhY2tJbmNvbmNsdXNpdmVGdW5jdGlvbnMpCiAgICAgOiBTdHlsZShTdHlsZSksIFNvdXJjZU1ncihTb3VyY2VNZ3IpLCBXaGl0ZXNwYWNlcyhXaGl0ZXNwYWNlcyksCiAgICAgICBFbmNvZGluZyhFbmNvZGluZyksCi0gICAgICBCaW5QYWNrSW5jb25jbHVzaXZlRnVuY3Rpb25zKEJpblBhY2tJbmNvbmNsdXNpdmVGdW5jdGlvbnMpIHt9CisgICAgICBCaW5QYWNrSW5jb25jbHVzaXZlRnVuY3Rpb25zKEJpblBhY2tJbmNvbmNsdXNpdmVGdW5jdGlvbnMpLAorICAgICAgQ29tbWVudFByYWdtYXNSZWdleChTdHlsZS5Db21tZW50UHJhZ21hcykge30KIAogTGluZVN0YXRlIENvbnRpbnVhdGlvbkluZGVudGVyOjpnZXRJbml0aWFsU3RhdGUodW5zaWduZWQgRmlyc3RJbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbm5vdGF0ZWRMaW5lICpMaW5lLApAQCAtMTA3LDcgKzEwOCw4IEBACiAgIC8vICAgU29tZVBhcmFtZXRlciwgT3RoZXJQYXJhbWV0ZXIpLkRvU29tZXRoaW5nKAogICAvLyAgIC4uLgogICAvLyBBcyB0aGV5IGhpZGUgIkRvU29tZXRoaW5nIiBhbmQgYXJlIGdlbmVyYWxseSBiYWQgZm9yIHJlYWRhYmlsaXR5LgotICBpZiAoUHJldmlvdXMub3BlbnNTY29wZSgpICYmIFN0YXRlLkxvd2VzdExldmVsT25MaW5lIDwgU3RhdGUuU3RhcnRPZkxpbmVMZXZlbCkKKyAgaWYgKFByZXZpb3VzLm9wZW5zU2NvcGUoKSAmJiBQcmV2aW91cy5pc05vdCh0b2s6OmxfYnJhY2UpICYmCisgICAgICBTdGF0ZS5Mb3dlc3RMZXZlbE9uTGluZSA8IFN0YXRlLlN0YXJ0T2ZMaW5lTGV2ZWwpCiAgICAgcmV0dXJuIGZhbHNlOwogICBpZiAoQ3VycmVudC5pc01lbWJlckFjY2VzcygpICYmIFN0YXRlLlN0YWNrLmJhY2soKS5Db250YWluc1Vud3JhcHBlZEJ1aWxkZXIpCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTM2LDEzICsxMzgsMTkgQEAKICAgaWYgKFN0eWxlLkFsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5ncyAmJgogICAgICAgU3RhdGUuQ29sdW1uID4gU3RhdGUuU3RhY2suYmFjaygpLkluZGVudCAmJiAvLyBCcmVha2luZyBzYXZlcyBjb2x1bW5zLgogICAgICAgIVByZXZpb3VzLmlzT25lT2YodG9rOjprd19yZXR1cm4sIHRvazo6bGVzc2xlc3MsIHRvazo6YXQpICYmCi0gICAgICBQcmV2aW91cy5UeXBlICE9IFRUX0lubGluZUFTTUNvbG9uICYmIE5leHRJc011bHRpbGluZVN0cmluZyhTdGF0ZSkpCisgICAgICBQcmV2aW91cy5UeXBlICE9IFRUX0lubGluZUFTTUNvbG9uICYmIG5leHRJc011bHRpbGluZVN0cmluZyhTdGF0ZSkpCiAgICAgcmV0dXJuIHRydWU7CiAgIGlmICgoKFByZXZpb3VzLlR5cGUgPT0gVFRfRGljdExpdGVyYWwgJiYgUHJldmlvdXMuaXModG9rOjpsX2JyYWNlKSkgfHwKICAgICAgICBQcmV2aW91cy5UeXBlID09IFRUX0FycmF5SW5pdGlhbGl6ZXJMU3F1YXJlKSAmJgogICAgICAgZ2V0TGVuZ3RoVG9NYXRjaGluZ1BhcmVuKFByZXZpb3VzKSArIFN0YXRlLkNvbHVtbiA+IGdldENvbHVtbkxpbWl0KFN0YXRlKSkKICAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKEN1cnJlbnQuVHlwZSA9PSBUVF9DdG9ySW5pdGlhbGl6ZXJDb2xvbiAmJgorICAgICAgKCFTdHlsZS5BbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZSB8fAorICAgICAgIFN0eWxlLkJyZWFrQ29uc3RydWN0b3JJbml0aWFsaXplcnNCZWZvcmVDb21tYSB8fCBTdHlsZS5Db2x1bW5MaW1pdCAhPSAwKSkKKyAgICByZXR1cm4gdHJ1ZTsKIAorICBpZiAoU3RhdGUuQ29sdW1uIDwgZ2V0TmV3TGluZUNvbHVtbihTdGF0ZSkpCisgICAgcmV0dXJuIGZhbHNlOwogICBpZiAoIVN0eWxlLkJyZWFrQmVmb3JlQmluYXJ5T3BlcmF0b3JzKSB7CiAgICAgLy8gSWYgd2UgbmVlZCB0byBicmVhayBzb21ld2hlcmUgaW5zaWRlIHRoZSBMSFMgb2YgYSBiaW5hcnkgZXhwcmVzc2lvbiwgd2UKICAgICAvLyBzaG91bGQgYWxzbyBicmVhayBhZnRlciB0aGUgb3BlcmF0b3IuIE90aGVyd2lzZSwgdGhlIGZvcm1hdHRpbmcgd291bGQKQEAgLTE3MywxOSArMTgxLDE3IEBACiAgIH0KIAogICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgZm9yIHRoZSBmaXJzdCAiPDwiIG9wZXJhdG9yLgotICBpZiAoQ3VycmVudC5pcyh0b2s6Omxlc3NsZXNzKSAmJiBTdGF0ZS5TdGFjay5iYWNrKCkuQnJlYWtCZWZvcmVQYXJhbWV0ZXIgJiYKKyAgaWYgKEN1cnJlbnQuaXModG9rOjpsZXNzbGVzcykgJiYgQ3VycmVudC5UeXBlICE9IFRUX092ZXJsb2FkZWRPcGVyYXRvciAmJgorICAgICAgU3RhdGUuU3RhY2suYmFjaygpLkJyZWFrQmVmb3JlUGFyYW1ldGVyICYmCiAgICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuRmlyc3RMZXNzTGVzcyA9PSAwKQogICAgIHJldHVybiB0cnVlOwogCi0gIC8vIEZJWE1FOiBDb21wYXJpbmcgTG9uZ2VzdE9iakNTZWxlY3Rvck5hbWUgdG8gMCBpcyBhIGhhY2t5IHdheSBvZiBmaW5kaW5nCi0gIC8vIG91dCB3aGV0aGVyIGl0IGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuIENsZWFuIHRoaXMgdXAuCiAgIGlmIChDdXJyZW50LlR5cGUgPT0gVFRfT2JqQ1NlbGVjdG9yTmFtZSAmJgotICAgICAgQ3VycmVudC5Mb25nZXN0T2JqQ1NlbGVjdG9yTmFtZSA9PSAwICYmCisgICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuT2JqQ1NlbGVjdG9yTmFtZUZvdW5kICYmCiAgICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuQnJlYWtCZWZvcmVQYXJhbWV0ZXIpCiAgICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoQ3VycmVudC5UeXBlID09IFRUX0N0b3JJbml0aWFsaXplckNvbG9uIHx8Ci0gICAgICAgKFByZXZpb3VzLkNsb3Nlc1RlbXBsYXRlRGVjbGFyYXRpb24gJiYgU3RhdGUuUGFyZW5MZXZlbCA9PSAwICYmCi0gICAgICAgICFDdXJyZW50LmlzVHJhaWxpbmdDb21tZW50KCkpKSkKKyAgaWYgKFByZXZpb3VzLkNsb3Nlc1RlbXBsYXRlRGVjbGFyYXRpb24gJiYgU3RhdGUuUGFyZW5MZXZlbCA9PSAwICYmCisgICAgICAhQ3VycmVudC5pc1RyYWlsaW5nQ29tbWVudCgpKQogICAgIHJldHVybiB0cnVlOwogCiAgIGlmICgoQ3VycmVudC5UeXBlID09IFRUX1N0YXJ0T2ZOYW1lIHx8IEN1cnJlbnQuaXModG9rOjprd19vcGVyYXRvcikpICYmCkBAIC0xOTcsNiArMjAzLDE0IEBACiAgICAgICAgKFN0YXRlLlN0YWNrLmJhY2soKS5CcmVha0JlZm9yZVBhcmFtZXRlciAmJgogICAgICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuQ29udGFpbnNVbndyYXBwZWRCdWlsZGVyKSkpCiAgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBjb3VsZCBiZSBwcmVjb21wdXRlZCBhcyB0aGV5IGRvIG5vdCBkZXBlbmQgb24gdGhlIHN0YXRlLgorICAvLyBIb3dldmVyLCBhcyB0aGV5IHNob3VsZCB0YWtlIGVmZmVjdCBvbmx5IGlmIHRoZSBVbndyYXBwZWRMaW5lIGRvZXMgbm90IGZpdAorICAvLyBpbnRvIHRoZSBDb2x1bW5MaW1pdCwgdGhleSBhcmUgY2hlY2tlZCBoZXJlIGluIHRoZSBDb250aW51YXRpb25JbmRlbnRlci4KKyAgaWYgKFByZXZpb3VzLkJsb2NrS2luZCA9PSBCS19CbG9jayAmJiBQcmV2aW91cy5pcyh0b2s6OmxfYnJhY2UpICYmCisgICAgICAhQ3VycmVudC5pc09uZU9mKHRvazo6cl9icmFjZSwgdG9rOjpjb21tZW50KSkKKyAgICByZXR1cm4gdHJ1ZTsKKwogICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTIwNSw4ICsyMTksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFeHRyYVNwYWNlcykgewogICBjb25zdCBGb3JtYXRUb2tlbiAmQ3VycmVudCA9ICpTdGF0ZS5OZXh0VG9rZW47CiAKLSAgaWYgKFN0YXRlLlN0YWNrLnNpemUoKSA9PSAwIHx8Ci0gICAgICAoQ3VycmVudC5UeXBlID09IFRUX0ltcGxpY2l0U3RyaW5nTGl0ZXJhbCAmJgorICBhc3NlcnQoIVN0YXRlLlN0YWNrLmVtcHR5KCkpOworICBpZiAoKEN1cnJlbnQuVHlwZSA9PSBUVF9JbXBsaWNpdFN0cmluZ0xpdGVyYWwgJiYKICAgICAgICAoQ3VycmVudC5QcmV2aW91cy0+VG9rLmdldElkZW50aWZpZXJJbmZvKCkgPT0gTlVMTCB8fAogICAgICAgICBDdXJyZW50LlByZXZpb3VzLT5Ub2suZ2V0SWRlbnRpZmllckluZm8oKS0+Z2V0UFBLZXl3b3JkSUQoKSA9PQogICAgICAgICAgICAgdG9rOjpwcF9ub3Rfa2V5d29yZCkpKSB7CkBAIC0yMTUsOCArMjI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZS5OZXh0VG9rZW4tPldoaXRlc3BhY2VSYW5nZS5nZXRFbmQoKSkgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTWdyLmdldFNwZWxsaW5nQ29sdW1uTnVtYmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlLk5leHRUb2tlbi0+V2hpdGVzcGFjZVJhbmdlLmdldEJlZ2luKCkpOwotICAgIFN0YXRlLkNvbHVtbiArPSBXaGl0ZXNwYWNlTGVuZ3RoICsgU3RhdGUuTmV4dFRva2VuLT5Db2x1bW5XaWR0aDsKLSAgICBTdGF0ZS5OZXh0VG9rZW4gPSBTdGF0ZS5OZXh0VG9rZW4tPk5leHQ7CisgICAgU3RhdGUuQ29sdW1uICs9IFdoaXRlc3BhY2VMZW5ndGg7CisgICAgbW92ZVN0YXRlVG9OZXh0VG9rZW4oU3RhdGUsIERyeVJ1biwgLypOZXdsaW5lPSovZmFsc2UpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTI1NSw5ICsyNjksMTIgQEAKICAgICBXaGl0ZXNwYWNlcy5yZXBsYWNlV2hpdGVzcGFjZShDdXJyZW50LCAvKk5ld2xpbmVzPSovMCwgLypJbmRlbnRMZXZlbD0qLzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhY2VzLCBTdGF0ZS5Db2x1bW4gKyBTcGFjZXMpOwogCi0gIGlmIChDdXJyZW50LlR5cGUgPT0gVFRfT2JqQ1NlbGVjdG9yTmFtZSAmJiBTdGF0ZS5TdGFjay5iYWNrKCkuQ29sb25Qb3MgPT0gMCkgewotICAgIGlmIChTdGF0ZS5TdGFjay5iYWNrKCkuSW5kZW50ICsgQ3VycmVudC5Mb25nZXN0T2JqQ1NlbGVjdG9yTmFtZSA+Ci0gICAgICAgIFN0YXRlLkNvbHVtbiArIFNwYWNlcyArIEN1cnJlbnQuQ29sdW1uV2lkdGgpCisgIGlmIChDdXJyZW50LlR5cGUgPT0gVFRfT2JqQ1NlbGVjdG9yTmFtZSAmJgorICAgICAgIVN0YXRlLlN0YWNrLmJhY2soKS5PYmpDU2VsZWN0b3JOYW1lRm91bmQpIHsKKyAgICBpZiAoQ3VycmVudC5Mb25nZXN0T2JqQ1NlbGVjdG9yTmFtZSA9PSAwKQorICAgICAgU3RhdGUuU3RhY2suYmFjaygpLkFsaWduQ29sb25zID0gZmFsc2U7CisgICAgZWxzZSBpZiAoU3RhdGUuU3RhY2suYmFjaygpLkluZGVudCArIEN1cnJlbnQuTG9uZ2VzdE9iakNTZWxlY3Rvck5hbWUgPgorICAgICAgICAgICAgIFN0YXRlLkNvbHVtbiArIFNwYWNlcyArIEN1cnJlbnQuQ29sdW1uV2lkdGgpCiAgICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuQ29sb25Qb3MgPQogICAgICAgICAgIFN0YXRlLlN0YWNrLmJhY2soKS5JbmRlbnQgKyBDdXJyZW50Lkxvbmdlc3RPYmpDU2VsZWN0b3JOYW1lOwogICAgIGVsc2UKQEAgLTI2NSw3ICsyODIsNyBAQAogICB9CiAKICAgaWYgKFByZXZpb3VzLm9wZW5zU2NvcGUoKSAmJiBQcmV2aW91cy5UeXBlICE9IFRUX09iakNNZXRob2RFeHByICYmCi0gICAgICBDdXJyZW50LlR5cGUgIT0gVFRfTGluZUNvbW1lbnQpCisgICAgICAoQ3VycmVudC5UeXBlICE9IFRUX0xpbmVDb21tZW50IHx8IFByZXZpb3VzLkJsb2NrS2luZCA9PSBCS19CcmFjZWRJbml0KSkKICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuSW5kZW50ID0gU3RhdGUuQ29sdW1uICsgU3BhY2VzOwogICBpZiAoU3RhdGUuU3RhY2suYmFjaygpLkF2b2lkQmluUGFja2luZyAmJiBzdGFydHNOZXh0UGFyYW1ldGVyKEN1cnJlbnQsIFN0eWxlKSkKICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuTm9MaW5lQnJlYWsgPSB0cnVlOwpAQCAtMjc3LDExICsyOTQsMTIgQEAKICAgICAvLyBUcmVhdCB0aGUgY29uZGl0aW9uIGluc2lkZSBhbiBpZiBhcyBpZiBpdCB3YXMgYSBzZWNvbmQgZnVuY3Rpb24KICAgICAvLyBwYXJhbWV0ZXIsIGkuZS4gbGV0IG5lc3RlZCBjYWxscyBoYXZlIGEgY29udGludWF0aW9uIGluZGVudC4KICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuTGFzdFNwYWNlID0gU3RhdGUuQ29sdW1uICsgMTsgLy8gMSBpcyBsZW5ndGggb2YgIigiLgotICBlbHNlIGlmIChQcmV2aW91cy5pcyh0b2s6OmNvbW1hKSB8fCBQcmV2aW91cy5UeXBlID09IFRUX09iakNNZXRob2RFeHByKQorICBlbHNlIGlmIChDdXJyZW50LmlzTm90KHRvazo6Y29tbWVudCkgJiYKKyAgICAgICAgICAgKFByZXZpb3VzLmlzKHRvazo6Y29tbWEpIHx8CisgICAgICAgICAgICAoUHJldmlvdXMuaXModG9rOjpjb2xvbikgJiYgUHJldmlvdXMuVHlwZSA9PSBUVF9PYmpDTWV0aG9kRXhwcikpKQogICAgIFN0YXRlLlN0YWNrLmJhY2soKS5MYXN0U3BhY2UgPSBTdGF0ZS5Db2x1bW47CiAgIGVsc2UgaWYgKChQcmV2aW91cy5UeXBlID09IFRUX0JpbmFyeU9wZXJhdG9yIHx8CiAgICAgICAgICAgICBQcmV2aW91cy5UeXBlID09IFRUX0NvbmRpdGlvbmFsRXhwciB8fAotICAgICAgICAgICAgUHJldmlvdXMuVHlwZSA9PSBUVF9VbmFyeU9wZXJhdG9yIHx8CiAgICAgICAgICAgICBQcmV2aW91cy5UeXBlID09IFRUX0N0b3JJbml0aWFsaXplckNvbG9uKSAmJgogICAgICAgICAgICAoUHJldmlvdXMuZ2V0UHJlY2VkZW5jZSgpICE9IHByZWM6OkFzc2lnbm1lbnQgfHwKICAgICAgICAgICAgIEN1cnJlbnQuU3RhcnRzQmluYXJ5RXhwcmVzc2lvbikpCkBAIC0zMTMsMTYgKzMzMSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRHJ5UnVuKSB7CiAgIEZvcm1hdFRva2VuICZDdXJyZW50ID0gKlN0YXRlLk5leHRUb2tlbjsKICAgY29uc3QgRm9ybWF0VG9rZW4gJlByZXZpb3VzID0gKlN0YXRlLk5leHRUb2tlbi0+UHJldmlvdXM7Ci0gIC8vIElmIHdlIGFyZSBjb250aW51aW5nIGFuIGV4cHJlc3Npb24sIHdlIHdhbnQgdG8gdXNlIHRoZSBjb250aW51YXRpb24gaW5kZW50LgotICB1bnNpZ25lZCBDb250aW51YXRpb25JbmRlbnQgPQotICAgICAgc3RkOjptYXgoU3RhdGUuU3RhY2suYmFjaygpLkxhc3RTcGFjZSwgU3RhdGUuU3RhY2suYmFjaygpLkluZGVudCkgKwotICAgICAgU3R5bGUuQ29udGludWF0aW9uSW5kZW50V2lkdGg7CisKICAgLy8gRXh0cmEgcGVuYWx0eSB0aGF0IG5lZWRzIHRvIGJlIGFkZGVkIGJlY2F1c2Ugb2YgdGhlIHdheSBjZXJ0YWluIGxpbmUKICAgLy8gYnJlYWtzIGFyZSBjaG9zZW4uCiAgIHVuc2lnbmVkIFBlbmFsdHkgPSAwOwogCi0gIGNvbnN0IEZvcm1hdFRva2VuICpQcmV2aW91c05vbkNvbW1lbnQgPQotICAgICAgU3RhdGUuTmV4dFRva2VuLT5nZXRQcmV2aW91c05vbkNvbW1lbnQoKTsKKyAgY29uc3QgRm9ybWF0VG9rZW4gKlByZXZpb3VzTm9uQ29tbWVudCA9IEN1cnJlbnQuZ2V0UHJldmlvdXNOb25Db21tZW50KCk7CisgIGNvbnN0IEZvcm1hdFRva2VuICpOZXh0Tm9uQ29tbWVudCA9IFByZXZpb3VzLmdldE5leHROb25Db21tZW50KCk7CisgIGlmICghTmV4dE5vbkNvbW1lbnQpCisgICAgTmV4dE5vbkNvbW1lbnQgPSAmQ3VycmVudDsKICAgLy8gVGhlIGZpcnN0IGxpbmUgYnJlYWsgb24gYW55IFBhcmVuTGV2ZWwgY2F1c2VzIGFuIGV4dHJhIHBlbmFsdHkgaW4gb3JkZXIKICAgLy8gcHJlZmVyIHNpbWlsYXIgbGluZSBicmVha3MuCiAgIGlmICghU3RhdGUuU3RhY2suYmFjaygpLkNvbnRhaW5zTGluZUJyZWFrKQpAQCAtMzMyLDc5ICszNDksNDYgQEAKICAgUGVuYWx0eSArPSBTdGF0ZS5OZXh0VG9rZW4tPlNwbGl0UGVuYWx0eTsKIAogICAvLyBCcmVha2luZyBiZWZvcmUgdGhlIGZpcnN0ICI8PCIgaXMgZ2VuZXJhbGx5IG5vdCBkZXNpcmFibGUgaWYgdGhlIExIUyBpcwotICAvLyBzaG9ydC4KLSAgaWYgKEN1cnJlbnQuaXModG9rOjpsZXNzbGVzcykgJiYgU3RhdGUuU3RhY2suYmFjaygpLkZpcnN0TGVzc0xlc3MgPT0gMCAmJgotICAgICAgU3RhdGUuQ29sdW1uIDw9IFN0eWxlLkNvbHVtbkxpbWl0IC8gMikKKyAgLy8gc2hvcnQuIEFsc28gYWx3YXlzIGFkZCB0aGUgcGVuYWx0eSBpZiB0aGUgTEhTIGlzIHNwbGl0IG92ZXIgbXV0bGlwbGUgbGluZXMKKyAgLy8gdG8gYXZvaWQgdW5uZWNlc3NhcnkgbGluZSBicmVha3MgdGhhdCBqdXN0IHdvcmsgYXJvdW5kIHRoaXMgcGVuYWx0eS4KKyAgaWYgKE5leHROb25Db21tZW50LT5pcyh0b2s6Omxlc3NsZXNzKSAmJgorICAgICAgU3RhdGUuU3RhY2suYmFjaygpLkZpcnN0TGVzc0xlc3MgPT0gMCAmJgorICAgICAgKFN0YXRlLkNvbHVtbiA8PSBTdHlsZS5Db2x1bW5MaW1pdCAvIDMgfHwKKyAgICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuQnJlYWtCZWZvcmVQYXJhbWV0ZXIpKQogICAgIFBlbmFsdHkgKz0gU3R5bGUuUGVuYWx0eUJyZWFrRmlyc3RMZXNzTGVzczsKIAotICBpZiAoQ3VycmVudC5pcyh0b2s6OmxfYnJhY2UpICYmIEN1cnJlbnQuQmxvY2tLaW5kID09IEJLX0Jsb2NrKSB7Ci0gICAgU3RhdGUuQ29sdW1uID0gU3RhdGUuRmlyc3RJbmRlbnQ7Ci0gIH0gZWxzZSBpZiAoQ3VycmVudC5pc09uZU9mKHRvazo6cl9icmFjZSwgdG9rOjpyX3NxdWFyZSkpIHsKLSAgICBpZiAoQ3VycmVudC5jbG9zZXNCbG9ja1R5cGVMaXN0KFN0eWxlKSB8fAotICAgICAgICAoQ3VycmVudC5NYXRjaGluZ1BhcmVuICYmCi0gICAgICAgICBDdXJyZW50Lk1hdGNoaW5nUGFyZW4tPkJsb2NrS2luZCA9PSBCS19CcmFjZWRJbml0KSkKLSAgICAgIFN0YXRlLkNvbHVtbiA9IFN0YXRlLlN0YWNrW1N0YXRlLlN0YWNrLnNpemUoKSAtIDJdLkxhc3RTcGFjZTsKLSAgICBlbHNlCi0gICAgICBTdGF0ZS5Db2x1bW4gPSBTdGF0ZS5GaXJzdEluZGVudDsKLSAgfSBlbHNlIGlmIChDdXJyZW50LmlzKHRvazo6c3RyaW5nX2xpdGVyYWwpICYmCi0gICAgICAgICAgICAgU3RhdGUuU3RhcnRPZlN0cmluZ0xpdGVyYWwgIT0gMCkgewotICAgIFN0YXRlLkNvbHVtbiA9IFN0YXRlLlN0YXJ0T2ZTdHJpbmdMaXRlcmFsOwotICAgIFN0YXRlLlN0YWNrLmJhY2soKS5CcmVha0JlZm9yZVBhcmFtZXRlciA9IHRydWU7Ci0gIH0gZWxzZSBpZiAoQ3VycmVudC5pcyh0b2s6Omxlc3NsZXNzKSAmJgotICAgICAgICAgICAgIFN0YXRlLlN0YWNrLmJhY2soKS5GaXJzdExlc3NMZXNzICE9IDApIHsKLSAgICBTdGF0ZS5Db2x1bW4gPSBTdGF0ZS5TdGFjay5iYWNrKCkuRmlyc3RMZXNzTGVzczsKLSAgfSBlbHNlIGlmIChDdXJyZW50LmlzTWVtYmVyQWNjZXNzKCkpIHsKLSAgICBpZiAoU3RhdGUuU3RhY2suYmFjaygpLkNhbGxDb250aW51YXRpb24gPT0gMCkgewotICAgICAgU3RhdGUuQ29sdW1uID0gQ29udGludWF0aW9uSW5kZW50OworICBTdGF0ZS5Db2x1bW4gPSBnZXROZXdMaW5lQ29sdW1uKFN0YXRlKTsKKyAgaWYgKE5leHROb25Db21tZW50LT5pc01lbWJlckFjY2VzcygpKSB7CisgICAgaWYgKFN0YXRlLlN0YWNrLmJhY2soKS5DYWxsQ29udGludWF0aW9uID09IDApCiAgICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuQ2FsbENvbnRpbnVhdGlvbiA9IFN0YXRlLkNvbHVtbjsKLSAgICB9IGVsc2UgewotICAgICAgU3RhdGUuQ29sdW1uID0gU3RhdGUuU3RhY2suYmFjaygpLkNhbGxDb250aW51YXRpb247CisgIH0gZWxzZSBpZiAoTmV4dE5vbkNvbW1lbnQtPlR5cGUgPT0gVFRfT2JqQ1NlbGVjdG9yTmFtZSkgeworICAgIGlmICghU3RhdGUuU3RhY2suYmFjaygpLk9iakNTZWxlY3Rvck5hbWVGb3VuZCkgeworICAgICAgaWYgKE5leHROb25Db21tZW50LT5Mb25nZXN0T2JqQ1NlbGVjdG9yTmFtZSA9PSAwKSB7CisgICAgICAgIFN0YXRlLlN0YWNrLmJhY2soKS5BbGlnbkNvbG9ucyA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU3RhdGUuU3RhY2suYmFjaygpLkNvbG9uUG9zID0KKyAgICAgICAgICAgIFN0YXRlLlN0YWNrLmJhY2soKS5JbmRlbnQgKyBOZXh0Tm9uQ29tbWVudC0+TG9uZ2VzdE9iakNTZWxlY3Rvck5hbWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChTdGF0ZS5TdGFjay5iYWNrKCkuQWxpZ25Db2xvbnMgJiYKKyAgICAgICAgICAgICAgIFN0YXRlLlN0YWNrLmJhY2soKS5Db2xvblBvcyA8PSBOZXh0Tm9uQ29tbWVudC0+Q29sdW1uV2lkdGgpIHsKKyAgICAgIFN0YXRlLlN0YWNrLmJhY2soKS5Db2xvblBvcyA9IFN0YXRlLkNvbHVtbiArIE5leHROb25Db21tZW50LT5Db2x1bW5XaWR0aDsKICAgICB9Ci0gIH0gZWxzZSBpZiAoU3RhdGUuU3RhY2suYmFjaygpLlF1ZXN0aW9uQ29sdW1uICE9IDAgJiYKLSAgICAgICAgICAgICAoQ3VycmVudC5UeXBlID09IFRUX0NvbmRpdGlvbmFsRXhwciB8fAotICAgICAgICAgICAgICBQcmV2aW91cy5UeXBlID09IFRUX0NvbmRpdGlvbmFsRXhwcikpIHsKLSAgICBTdGF0ZS5Db2x1bW4gPSBTdGF0ZS5TdGFjay5iYWNrKCkuUXVlc3Rpb25Db2x1bW47Ci0gIH0gZWxzZSBpZiAoUHJldmlvdXMuaXModG9rOjpjb21tYSkgJiYgU3RhdGUuU3RhY2suYmFjaygpLlZhcmlhYmxlUG9zICE9IDApIHsKLSAgICBTdGF0ZS5Db2x1bW4gPSBTdGF0ZS5TdGFjay5iYWNrKCkuVmFyaWFibGVQb3M7Ci0gIH0gZWxzZSBpZiAoKFByZXZpb3VzTm9uQ29tbWVudCAmJgotICAgICAgICAgICAgICBQcmV2aW91c05vbkNvbW1lbnQtPkNsb3Nlc1RlbXBsYXRlRGVjbGFyYXRpb24pIHx8Ci0gICAgICAgICAgICAgKChDdXJyZW50LlR5cGUgPT0gVFRfU3RhcnRPZk5hbWUgfHwKLSAgICAgICAgICAgICAgIEN1cnJlbnQuaXModG9rOjprd19vcGVyYXRvcikpICYmCi0gICAgICAgICAgICAgIFN0YXRlLlBhcmVuTGV2ZWwgPT0gMCAmJgotICAgICAgICAgICAgICAoIVN0eWxlLkluZGVudEZ1bmN0aW9uRGVjbGFyYXRpb25BZnRlclR5cGUgfHwKLSAgICAgICAgICAgICAgIFN0YXRlLkxpbmUtPlN0YXJ0c0RlZmluaXRpb24pKSkgewotICAgIFN0YXRlLkNvbHVtbiA9IFN0YXRlLlN0YWNrLmJhY2soKS5JbmRlbnQ7Ci0gIH0gZWxzZSBpZiAoQ3VycmVudC5UeXBlID09IFRUX09iakNTZWxlY3Rvck5hbWUpIHsKLSAgICBpZiAoU3RhdGUuU3RhY2suYmFjaygpLkNvbG9uUG9zID09IDApIHsKLSAgICAgIFN0YXRlLlN0YWNrLmJhY2soKS5Db2xvblBvcyA9Ci0gICAgICAgICAgU3RhdGUuU3RhY2suYmFjaygpLkluZGVudCArIEN1cnJlbnQuTG9uZ2VzdE9iakNTZWxlY3Rvck5hbWU7Ci0gICAgICBTdGF0ZS5Db2x1bW4gPSBTdGF0ZS5TdGFjay5iYWNrKCkuQ29sb25Qb3MgLSBDdXJyZW50LkNvbHVtbldpZHRoOwotICAgIH0gZWxzZSBpZiAoU3RhdGUuU3RhY2suYmFjaygpLkNvbG9uUG9zID4gQ3VycmVudC5Db2x1bW5XaWR0aCkgewotICAgICAgU3RhdGUuQ29sdW1uID0gU3RhdGUuU3RhY2suYmFjaygpLkNvbG9uUG9zIC0gQ3VycmVudC5Db2x1bW5XaWR0aDsKLSAgICB9IGVsc2UgewotICAgICAgU3RhdGUuQ29sdW1uID0gU3RhdGUuU3RhY2suYmFjaygpLkluZGVudDsKLSAgICAgIFN0YXRlLlN0YWNrLmJhY2soKS5Db2xvblBvcyA9IFN0YXRlLkNvbHVtbiArIEN1cnJlbnQuQ29sdW1uV2lkdGg7Ci0gICAgfQotICB9IGVsc2UgaWYgKEN1cnJlbnQuVHlwZSA9PSBUVF9BcnJheVN1YnNjcmlwdExTcXVhcmUpIHsKLSAgICBpZiAoU3RhdGUuU3RhY2suYmFjaygpLlN0YXJ0T2ZBcnJheVN1YnNjcmlwdHMgIT0gMCkKLSAgICAgIFN0YXRlLkNvbHVtbiA9IFN0YXRlLlN0YWNrLmJhY2soKS5TdGFydE9mQXJyYXlTdWJzY3JpcHRzOwotICAgIGVsc2UKLSAgICAgIFN0YXRlLkNvbHVtbiA9IENvbnRpbnVhdGlvbkluZGVudDsKLSAgfSBlbHNlIGlmIChDdXJyZW50LlR5cGUgPT0gVFRfU3RhcnRPZk5hbWUgfHwKLSAgICAgICAgICAgICBQcmV2aW91cy5pc09uZU9mKHRvazo6Y29sb25jb2xvbiwgdG9rOjplcXVhbCkgfHwKLSAgICAgICAgICAgICBQcmV2aW91cy5UeXBlID09IFRUX09iakNNZXRob2RFeHByKSB7Ci0gICAgU3RhdGUuQ29sdW1uID0gQ29udGludWF0aW9uSW5kZW50OwotICB9IGVsc2UgaWYgKEN1cnJlbnQuVHlwZSA9PSBUVF9DdG9ySW5pdGlhbGl6ZXJDb2xvbikgewotICAgIFN0YXRlLkNvbHVtbiA9IFN0YXRlLkZpcnN0SW5kZW50ICsgU3R5bGUuQ29uc3RydWN0b3JJbml0aWFsaXplckluZGVudFdpZHRoOwotICB9IGVsc2UgaWYgKEN1cnJlbnQuVHlwZSA9PSBUVF9DdG9ySW5pdGlhbGl6ZXJDb21tYSkgewotICAgIFN0YXRlLkNvbHVtbiA9IFN0YXRlLlN0YWNrLmJhY2soKS5JbmRlbnQ7Ci0gIH0gZWxzZSB7Ci0gICAgU3RhdGUuQ29sdW1uID0gU3RhdGUuU3RhY2suYmFjaygpLkluZGVudDsKLSAgICAvLyBFbnN1cmUgdGhhdCB3ZSBmYWxsIGJhY2sgdG8gdGhlIGNvbnRpbnVhdGlvbiBpbmRlbnQgd2lkdGggaW5zdGVhZCBvZiBqdXN0Ci0gICAgLy8gZmx1c2hpbmcgY29udGludWF0aW9ucyBsZWZ0LgotICAgIGlmIChTdGF0ZS5Db2x1bW4gPT0gU3RhdGUuRmlyc3RJbmRlbnQgJiYKLSAgICAgICAgUHJldmlvdXNOb25Db21tZW50LT5pc05vdCh0b2s6OnJfYnJhY2UpKQotICAgICAgU3RhdGUuQ29sdW1uICs9IFN0eWxlLkNvbnRpbnVhdGlvbkluZGVudFdpZHRoOworICB9IGVsc2UgaWYgKFByZXZpb3VzTm9uQ29tbWVudCAmJiBQcmV2aW91c05vbkNvbW1lbnQtPmlzKHRvazo6Y29sb24pICYmCisgICAgICAgICAgICAgKFByZXZpb3VzTm9uQ29tbWVudC0+VHlwZSA9PSBUVF9PYmpDTWV0aG9kRXhwciB8fAorICAgICAgICAgICAgICBQcmV2aW91c05vbkNvbW1lbnQtPlR5cGUgPT0gVFRfRGljdExpdGVyYWwpKSB7CisgICAgLy8gRklYTUU6IFRoaXMgaXMgaGFja3ksIGZpbmQgYSBiZXR0ZXIgd2F5LiBUaGUgcHJvYmxlbSBpcyB0aGF0IGluIGFuIE9iakMKKyAgICAvLyBtZXRob2QgZXhwcmVzc2lvbiwgdGhlIGJsb2NrIHNob3VsZCBiZSBhbGlnbmVkIHRvIHRoZSBsaW5lIHN0YXJ0aW5nIGl0LAorICAgIC8vIGUuZy46CisgICAgLy8gICBbYWFhYWFhYWFhYWFhYWFhIGFhYWFhYWFhYTogXFwgYnJlYWsgZm9yIHNvbWUgcmVhc29uCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBeKGludCAqaSkgeworICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgfV07CisgICAgLy8gVGh1cywgd2Ugc2V0IExhc3RTcGFjZSBvZiB0aGUgbmV4dCBoaWdoZXIgUGFyZW5MZXZlbCwgdG8gd2hpY2ggd2UgbW92ZQorICAgIC8vIHdoZW4gd2UgY29uc3VtZSBhbGwgb2YgdGhlICJ9IidzIEZha2VSUGFyZW5zIGF0IHRoZSAieyIuCisgICAgaWYgKFN0YXRlLlN0YWNrLnNpemUoKSA+IDEpCisgICAgICBTdGF0ZS5TdGFja1tTdGF0ZS5TdGFjay5zaXplKCkgLSAyXS5MYXN0U3BhY2UgPQorICAgICAgICAgIHN0ZDo6bWF4KFN0YXRlLlN0YWNrLmJhY2soKS5MYXN0U3BhY2UsIFN0YXRlLlN0YWNrLmJhY2soKS5JbmRlbnQpICsKKyAgICAgICAgICBTdHlsZS5Db250aW51YXRpb25JbmRlbnRXaWR0aDsKICAgfQogCiAgIGlmICgoUHJldmlvdXMuaXNPbmVPZih0b2s6OmNvbW1hLCB0b2s6OnNlbWkpICYmCkBAIC00MTMsNyArMzk3LDcgQEAKICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuQnJlYWtCZWZvcmVQYXJhbWV0ZXIgPSBmYWxzZTsKICAgaWYgKFByZXZpb3VzLlR5cGUgPT0gVFRfVGVtcGxhdGVDbG9zZXIgJiYgU3RhdGUuUGFyZW5MZXZlbCA9PSAwKQogICAgIFN0YXRlLlN0YWNrLmJhY2soKS5CcmVha0JlZm9yZVBhcmFtZXRlciA9IGZhbHNlOwotICBpZiAoQ3VycmVudC5pcyh0b2s6OnF1ZXN0aW9uKSB8fAorICBpZiAoTmV4dE5vbkNvbW1lbnQtPmlzKHRvazo6cXVlc3Rpb24pIHx8CiAgICAgICAoUHJldmlvdXNOb25Db21tZW50ICYmIFByZXZpb3VzTm9uQ29tbWVudC0+aXModG9rOjpxdWVzdGlvbikpKQogICAgIFN0YXRlLlN0YWNrLmJhY2soKS5CcmVha0JlZm9yZVBhcmFtZXRlciA9IHRydWU7CiAKQEAgLTQyOSw4ICs0MTMsNiBAQAogCiAgIGlmICghQ3VycmVudC5pc1RyYWlsaW5nQ29tbWVudCgpKQogICAgIFN0YXRlLlN0YWNrLmJhY2soKS5MYXN0U3BhY2UgPSBTdGF0ZS5Db2x1bW47Ci0gIGlmIChDdXJyZW50LmlzTWVtYmVyQWNjZXNzKCkpCi0gICAgU3RhdGUuU3RhY2suYmFjaygpLkxhc3RTcGFjZSArPSBDdXJyZW50LkNvbHVtbldpZHRoOwogICBTdGF0ZS5TdGFydE9mTGluZUxldmVsID0gU3RhdGUuUGFyZW5MZXZlbDsKICAgU3RhdGUuTG93ZXN0TGV2ZWxPbkxpbmUgPSBTdGF0ZS5QYXJlbkxldmVsOwogCkBAIC00NDMsNyArNDI1LDcgQEAKICAgICAgICFQcmV2aW91c05vbkNvbW1lbnQtPmlzT25lT2YodG9rOjpjb21tYSwgdG9rOjpzZW1pKSAmJgogICAgICAgUHJldmlvdXNOb25Db21tZW50LT5UeXBlICE9IFRUX1RlbXBsYXRlQ2xvc2VyICYmCiAgICAgICBQcmV2aW91c05vbkNvbW1lbnQtPlR5cGUgIT0gVFRfQmluYXJ5T3BlcmF0b3IgJiYKLSAgICAgIEN1cnJlbnQuVHlwZSAhPSBUVF9CaW5hcnlPcGVyYXRvciAmJiAKKyAgICAgIEN1cnJlbnQuVHlwZSAhPSBUVF9CaW5hcnlPcGVyYXRvciAmJgogICAgICAgIVByZXZpb3VzTm9uQ29tbWVudC0+b3BlbnNTY29wZSgpKQogICAgIFN0YXRlLlN0YWNrLmJhY2soKS5CcmVha0JlZm9yZVBhcmFtZXRlciA9IHRydWU7CiAKQEAgLTQ2NSw2ICs0NDcsOTkgQEAKICAgcmV0dXJuIFBlbmFsdHk7CiB9CiAKK3Vuc2lnbmVkIENvbnRpbnVhdGlvbkluZGVudGVyOjpnZXROZXdMaW5lQ29sdW1uKGNvbnN0IExpbmVTdGF0ZSAmU3RhdGUpIHsKKyAgaWYgKCFTdGF0ZS5OZXh0VG9rZW4gfHwgIVN0YXRlLk5leHRUb2tlbi0+UHJldmlvdXMpCisgICAgcmV0dXJuIDA7CisgIEZvcm1hdFRva2VuICZDdXJyZW50ID0gKlN0YXRlLk5leHRUb2tlbjsKKyAgY29uc3QgRm9ybWF0VG9rZW4gJlByZXZpb3VzID0gKlN0YXRlLk5leHRUb2tlbi0+UHJldmlvdXM7CisgIC8vIElmIHdlIGFyZSBjb250aW51aW5nIGFuIGV4cHJlc3Npb24sIHdlIHdhbnQgdG8gdXNlIHRoZSBjb250aW51YXRpb24gaW5kZW50LgorICB1bnNpZ25lZCBDb250aW51YXRpb25JbmRlbnQgPQorICAgICAgc3RkOjptYXgoU3RhdGUuU3RhY2suYmFjaygpLkxhc3RTcGFjZSwgU3RhdGUuU3RhY2suYmFjaygpLkluZGVudCkgKworICAgICAgU3R5bGUuQ29udGludWF0aW9uSW5kZW50V2lkdGg7CisgIGNvbnN0IEZvcm1hdFRva2VuICpQcmV2aW91c05vbkNvbW1lbnQgPSBDdXJyZW50LmdldFByZXZpb3VzTm9uQ29tbWVudCgpOworICBjb25zdCBGb3JtYXRUb2tlbiAqTmV4dE5vbkNvbW1lbnQgPSBQcmV2aW91cy5nZXROZXh0Tm9uQ29tbWVudCgpOworICBpZiAoIU5leHROb25Db21tZW50KQorICAgIE5leHROb25Db21tZW50ID0gJkN1cnJlbnQ7CisgIGlmIChOZXh0Tm9uQ29tbWVudC0+aXModG9rOjpsX2JyYWNlKSAmJgorICAgICAgTmV4dE5vbkNvbW1lbnQtPkJsb2NrS2luZCA9PSBCS19CbG9jaykKKyAgICByZXR1cm4gU3RhdGUuUGFyZW5MZXZlbCA9PSAwID8gU3RhdGUuRmlyc3RJbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3RhdGUuU3RhY2suYmFjaygpLkluZGVudDsKKyAgaWYgKEN1cnJlbnQuaXNPbmVPZih0b2s6OnJfYnJhY2UsIHRvazo6cl9zcXVhcmUpKSB7CisgICAgaWYgKEN1cnJlbnQuY2xvc2VzQmxvY2tUeXBlTGlzdChTdHlsZSkgfHwKKyAgICAgICAgKEN1cnJlbnQuTWF0Y2hpbmdQYXJlbiAmJgorICAgICAgICAgQ3VycmVudC5NYXRjaGluZ1BhcmVuLT5CbG9ja0tpbmQgPT0gQktfQnJhY2VkSW5pdCkpCisgICAgICByZXR1cm4gU3RhdGUuU3RhY2tbU3RhdGUuU3RhY2suc2l6ZSgpIC0gMl0uTGFzdFNwYWNlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBTdGF0ZS5GaXJzdEluZGVudDsKKyAgfQorICBpZiAoTmV4dE5vbkNvbW1lbnQtPmlzU3RyaW5nTGl0ZXJhbCgpICYmIFN0YXRlLlN0YXJ0T2ZTdHJpbmdMaXRlcmFsICE9IDApCisgICAgcmV0dXJuIFN0YXRlLlN0YXJ0T2ZTdHJpbmdMaXRlcmFsOworICBpZiAoTmV4dE5vbkNvbW1lbnQtPmlzKHRvazo6bGVzc2xlc3MpICYmCisgICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuRmlyc3RMZXNzTGVzcyAhPSAwKQorICAgIHJldHVybiBTdGF0ZS5TdGFjay5iYWNrKCkuRmlyc3RMZXNzTGVzczsKKyAgaWYgKE5leHROb25Db21tZW50LT5pc01lbWJlckFjY2VzcygpKSB7CisgICAgaWYgKFN0YXRlLlN0YWNrLmJhY2soKS5DYWxsQ29udGludWF0aW9uID09IDApIHsKKyAgICAgIHJldHVybiBDb250aW51YXRpb25JbmRlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBTdGF0ZS5TdGFjay5iYWNrKCkuQ2FsbENvbnRpbnVhdGlvbjsKKyAgICB9CisgIH0KKyAgaWYgKFN0YXRlLlN0YWNrLmJhY2soKS5RdWVzdGlvbkNvbHVtbiAhPSAwICYmCisgICAgICAoTmV4dE5vbkNvbW1lbnQtPlR5cGUgPT0gVFRfQ29uZGl0aW9uYWxFeHByIHx8CisgICAgICAgUHJldmlvdXMuVHlwZSA9PSBUVF9Db25kaXRpb25hbEV4cHIpKQorICAgIHJldHVybiBTdGF0ZS5TdGFjay5iYWNrKCkuUXVlc3Rpb25Db2x1bW47CisgIGlmIChQcmV2aW91cy5pcyh0b2s6OmNvbW1hKSAmJiBTdGF0ZS5TdGFjay5iYWNrKCkuVmFyaWFibGVQb3MgIT0gMCkKKyAgICByZXR1cm4gU3RhdGUuU3RhY2suYmFjaygpLlZhcmlhYmxlUG9zOworICBpZiAoKFByZXZpb3VzTm9uQ29tbWVudCAmJiAoUHJldmlvdXNOb25Db21tZW50LT5DbG9zZXNUZW1wbGF0ZURlY2xhcmF0aW9uIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2aW91c05vbkNvbW1lbnQtPlR5cGUgPT0gVFRfQXR0cmlidXRlUGFyZW4pKSB8fAorICAgICAgKChOZXh0Tm9uQ29tbWVudC0+VHlwZSA9PSBUVF9TdGFydE9mTmFtZSB8fAorICAgICAgICBOZXh0Tm9uQ29tbWVudC0+aXModG9rOjprd19vcGVyYXRvcikpICYmCisgICAgICAgU3RhdGUuUGFyZW5MZXZlbCA9PSAwICYmICghU3R5bGUuSW5kZW50RnVuY3Rpb25EZWNsYXJhdGlvbkFmdGVyVHlwZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUuTGluZS0+U3RhcnRzRGVmaW5pdGlvbikpKQorICAgIHJldHVybiBzdGQ6Om1heChTdGF0ZS5TdGFjay5iYWNrKCkuTGFzdFNwYWNlLCBTdGF0ZS5TdGFjay5iYWNrKCkuSW5kZW50KTsKKyAgaWYgKE5leHROb25Db21tZW50LT5UeXBlID09IFRUX09iakNTZWxlY3Rvck5hbWUpIHsKKyAgICBpZiAoIVN0YXRlLlN0YWNrLmJhY2soKS5PYmpDU2VsZWN0b3JOYW1lRm91bmQpIHsKKyAgICAgIGlmIChOZXh0Tm9uQ29tbWVudC0+TG9uZ2VzdE9iakNTZWxlY3Rvck5hbWUgPT0gMCkgeworICAgICAgICByZXR1cm4gU3RhdGUuU3RhY2suYmFjaygpLkluZGVudDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTdGF0ZS5TdGFjay5iYWNrKCkuSW5kZW50ICsKKyAgICAgICAgICAgICAgIE5leHROb25Db21tZW50LT5Mb25nZXN0T2JqQ1NlbGVjdG9yTmFtZSAtCisgICAgICAgICAgICAgICBOZXh0Tm9uQ29tbWVudC0+Q29sdW1uV2lkdGg7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghU3RhdGUuU3RhY2suYmFjaygpLkFsaWduQ29sb25zKSB7CisgICAgICByZXR1cm4gU3RhdGUuU3RhY2suYmFjaygpLkluZGVudDsKKyAgICB9IGVsc2UgaWYgKFN0YXRlLlN0YWNrLmJhY2soKS5Db2xvblBvcyA+IE5leHROb25Db21tZW50LT5Db2x1bW5XaWR0aCkgeworICAgICAgcmV0dXJuIFN0YXRlLlN0YWNrLmJhY2soKS5Db2xvblBvcyAtIE5leHROb25Db21tZW50LT5Db2x1bW5XaWR0aDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFN0YXRlLlN0YWNrLmJhY2soKS5JbmRlbnQ7CisgICAgfQorICB9CisgIGlmIChOZXh0Tm9uQ29tbWVudC0+VHlwZSA9PSBUVF9BcnJheVN1YnNjcmlwdExTcXVhcmUpIHsKKyAgICBpZiAoU3RhdGUuU3RhY2suYmFjaygpLlN0YXJ0T2ZBcnJheVN1YnNjcmlwdHMgIT0gMCkKKyAgICAgIHJldHVybiBTdGF0ZS5TdGFjay5iYWNrKCkuU3RhcnRPZkFycmF5U3Vic2NyaXB0czsKKyAgICBlbHNlCisgICAgICByZXR1cm4gQ29udGludWF0aW9uSW5kZW50OworICB9CisgIGlmIChOZXh0Tm9uQ29tbWVudC0+VHlwZSA9PSBUVF9TdGFydE9mTmFtZSB8fAorICAgICAgUHJldmlvdXMuaXNPbmVPZih0b2s6OmNvbG9uY29sb24sIHRvazo6ZXF1YWwpKSB7CisgICAgcmV0dXJuIENvbnRpbnVhdGlvbkluZGVudDsKKyAgfQorICBpZiAoUHJldmlvdXNOb25Db21tZW50ICYmIFByZXZpb3VzTm9uQ29tbWVudC0+aXModG9rOjpjb2xvbikgJiYKKyAgICAgIChQcmV2aW91c05vbkNvbW1lbnQtPlR5cGUgPT0gVFRfT2JqQ01ldGhvZEV4cHIgfHwKKyAgICAgICBQcmV2aW91c05vbkNvbW1lbnQtPlR5cGUgPT0gVFRfRGljdExpdGVyYWwpKQorICAgIHJldHVybiBDb250aW51YXRpb25JbmRlbnQ7CisgIGlmIChOZXh0Tm9uQ29tbWVudC0+VHlwZSA9PSBUVF9DdG9ySW5pdGlhbGl6ZXJDb2xvbikKKyAgICByZXR1cm4gU3RhdGUuRmlyc3RJbmRlbnQgKyBTdHlsZS5Db25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGg7CisgIGlmIChOZXh0Tm9uQ29tbWVudC0+VHlwZSA9PSBUVF9DdG9ySW5pdGlhbGl6ZXJDb21tYSkKKyAgICByZXR1cm4gU3RhdGUuU3RhY2suYmFjaygpLkluZGVudDsKKyAgaWYgKFN0YXRlLlN0YWNrLmJhY2soKS5JbmRlbnQgPT0gU3RhdGUuRmlyc3RJbmRlbnQgJiYgUHJldmlvdXNOb25Db21tZW50ICYmCisgICAgICBQcmV2aW91c05vbkNvbW1lbnQtPmlzTm90KHRvazo6cl9icmFjZSkpCisgICAgLy8gRW5zdXJlIHRoYXQgd2UgZmFsbCBiYWNrIHRvIHRoZSBjb250aW51YXRpb24gaW5kZW50IHdpZHRoIGluc3RlYWQgb2YKKyAgICAvLyBqdXN0IGZsdXNoaW5nIGNvbnRpbnVhdGlvbnMgbGVmdC4KKyAgICByZXR1cm4gU3RhdGUuU3RhY2suYmFjaygpLkluZGVudCArIFN0eWxlLkNvbnRpbnVhdGlvbkluZGVudFdpZHRoOworICByZXR1cm4gU3RhdGUuU3RhY2suYmFjaygpLkluZGVudDsKK30KKwogdW5zaWduZWQgQ29udGludWF0aW9uSW5kZW50ZXI6Om1vdmVTdGF0ZVRvTmV4dFRva2VuKExpbmVTdGF0ZSAmU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEcnlSdW4sIGJvb2wgTmV3bGluZSkgewogICBjb25zdCBGb3JtYXRUb2tlbiAmQ3VycmVudCA9ICpTdGF0ZS5OZXh0VG9rZW47CkBAIC00NzIsNyArNTQ3LDggQEAKIAogICBpZiAoQ3VycmVudC5UeXBlID09IFRUX0luaGVyaXRhbmNlQ29sb24pCiAgICAgU3RhdGUuU3RhY2suYmFjaygpLkF2b2lkQmluUGFja2luZyA9IHRydWU7Ci0gIGlmIChDdXJyZW50LmlzKHRvazo6bGVzc2xlc3MpICYmIFN0YXRlLlN0YWNrLmJhY2soKS5GaXJzdExlc3NMZXNzID09IDApCisgIGlmIChDdXJyZW50LmlzKHRvazo6bGVzc2xlc3MpICYmIEN1cnJlbnQuVHlwZSAhPSBUVF9PdmVybG9hZGVkT3BlcmF0b3IgJiYKKyAgICAgIFN0YXRlLlN0YWNrLmJhY2soKS5GaXJzdExlc3NMZXNzID09IDApCiAgICAgU3RhdGUuU3RhY2suYmFjaygpLkZpcnN0TGVzc0xlc3MgPSBTdGF0ZS5Db2x1bW47CiAgIGlmIChDdXJyZW50LlR5cGUgPT0gVFRfQXJyYXlTdWJzY3JpcHRMU3F1YXJlICYmCiAgICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuU3RhcnRPZkFycmF5U3Vic2NyaXB0cyA9PSAwKQpAQCAtNDg4LDYgKzU2NCw4IEBACiAgIGlmIChDdXJyZW50LmlzTWVtYmVyQWNjZXNzKCkpCiAgICAgU3RhdGUuU3RhY2suYmFjaygpLlN0YXJ0T2ZGdW5jdGlvbkNhbGwgPQogICAgICAgICBDdXJyZW50Lkxhc3RJbkNoYWluT2ZDYWxscyA/IDAgOiBTdGF0ZS5Db2x1bW4gKyBDdXJyZW50LkNvbHVtbldpZHRoOworICBpZiAoQ3VycmVudC5UeXBlID09IFRUX09iakNTZWxlY3Rvck5hbWUpCisgICAgU3RhdGUuU3RhY2suYmFjaygpLk9iakNTZWxlY3Rvck5hbWVGb3VuZCA9IHRydWU7CiAgIGlmIChDdXJyZW50LlR5cGUgPT0gVFRfQ3RvckluaXRpYWxpemVyQ29sb24pIHsKICAgICAvLyBJbmRlbnQgMiBmcm9tIHRoZSBjb2x1bW4sIHNvOgogICAgIC8vIFNvbWVDbGFzczo6U29tZUNsYXNzKCkKQEAgLTUzMSw2ICs2MDksMTggQEAKICAgICAgICAgICBzdGQ6Om1heChzdGQ6Om1heChTdGF0ZS5Db2x1bW4sIE5ld1BhcmVuU3RhdGUuSW5kZW50KSwKICAgICAgICAgICAgICAgICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuTGFzdFNwYWNlKTsKIAorICAgIC8vIERvbid0IGFsbG93IHRoZSBSSFMgb2YgYW4gb3BlcmF0b3IgdG8gYmUgc3BsaXQgb3ZlciBtdWx0aXBsZSBsaW5lcyB1bmxlc3MKKyAgICAvLyB0aGVyZSBpcyBhIGxpbmUtYnJlYWsgcmlnaHQgYWZ0ZXIgdGhlIG9wZXJhdG9yLgorICAgIC8vIEV4Y2x1ZGUgcmVsYXRpb25hbCBvcGVyYXRvcnMsIGFzIHRoZXJlLCBpdCBpcyBhbHdheXMgbW9yZSBkZXNpcmFibGUgdG8KKyAgICAvLyBoYXZlIHRoZSBMSFMgJ2xlZnQnIG9mIHRoZSBSSFMuCisgICAgLy8gRklYTUU6IEltcGxlbWVudCB0aGlzIGZvciAnPDwnIGFuZCBCcmVha0JlZm9yZUJpbmFyeU9wZXJhdG9ycy4KKyAgICBpZiAoIU5ld2xpbmUgJiYgUHJldmlvdXMgJiYgUHJldmlvdXMtPlR5cGUgPT0gVFRfQmluYXJ5T3BlcmF0b3IgJiYKKyAgICAgICAgIVByZXZpb3VzLT5pc09uZU9mKHRvazo6bGVzc2xlc3MsIHRvazo6cXVlc3Rpb24sIHRvazo6Y29sb24pICYmCisgICAgICAgIFByZXZpb3VzLT5nZXRQcmVjZWRlbmNlKCkgPiBwcmVjOjpBc3NpZ25tZW50ICYmCisgICAgICAgIFByZXZpb3VzLT5nZXRQcmVjZWRlbmNlKCkgIT0gcHJlYzo6UmVsYXRpb25hbCAmJgorICAgICAgICAhU3R5bGUuQnJlYWtCZWZvcmVCaW5hcnlPcGVyYXRvcnMpCisgICAgICBOZXdQYXJlblN0YXRlLk5vTGluZUJyZWFrID0gdHJ1ZTsKKwogICAgIC8vIERvIG5vdCBpbmRlbnQgcmVsYXRpdmUgdG8gdGhlIGZha2UgcGFyZW50aGVzZXMgaW5zZXJ0ZWQgZm9yICIuIiBvciAiLT4iLgogICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdG8gbWFrZSB0aGUgZm9sbG93aW5nIHRvIHN0YXRlbWVudHMgY29uc2lzdGVudDoKICAgICAvLyAgIE91dGVyRnVuY3Rpb24oSW5uZXJGdW5jdGlvbkNhbGwoIC8vIGJyZWFrCkBAIC01MzksNiArNjI5LDcgQEAKICAgICAvLyAgICAgICBQYXJhbWV0ZXJUb0lubmVyRnVuY3Rpb24pKTsKICAgICBpZiAoKkkgPiBwcmVjOjpVbmtub3duKQogICAgICAgTmV3UGFyZW5TdGF0ZS5MYXN0U3BhY2UgPSBzdGQ6Om1heChOZXdQYXJlblN0YXRlLkxhc3RTcGFjZSwgU3RhdGUuQ29sdW1uKTsKKyAgICBOZXdQYXJlblN0YXRlLlN0YXJ0T2ZGdW5jdGlvbkNhbGwgPSBTdGF0ZS5Db2x1bW47CiAKICAgICAvLyBBbHdheXMgaW5kZW50IGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zLiBOZXZlciBpbmRlbnQgZXhwcmVzc2lvbiB3aGVyZQogICAgIC8vIHRoZSAnb3BlcmF0b3InIGlzICcsJywgJzsnIG9yIGFuIGFzc2lnbm1lbnQgKGkuZS4gKkkgPD0KQEAgLTU2Niw3ICs2NTcsNyBAQAogICAgICAgaWYgKEN1cnJlbnQuTWF0Y2hpbmdQYXJlbiAmJiBDdXJyZW50LkJsb2NrS2luZCA9PSBCS19CbG9jaykgewogICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGxfYnJhY2Ugc3RhcnRpbmcgYSBuZXN0ZWQgYmxvY2ssIHdlIHByZXRlbmQgKHdydC4gdG8KICAgICAgICAgLy8gaW5kZW50YXRpb24pIHRoYXQgd2UgYWxyZWFkeSBjb25zdW1lZCB0aGUgY29ycmVzcG9uZGluZyByX2JyYWNlLgotICAgICAgICAvLyBUaHVzLCB3ZSByZW1vdmUgYWxsIFBhcmVuU3RhdGVzIGNhdXNlZCBiYWtlIGZha2UgcGFyZW50aGVzZXMgdGhhdCBlbmQKKyAgICAgICAgLy8gVGh1cywgd2UgcmVtb3ZlIGFsbCBQYXJlblN0YXRlcyBjYXVzZWQgYnkgZmFrZSBwYXJlbnRoZXNlcyB0aGF0IGVuZAogICAgICAgICAvLyBhdCB0aGUgcl9icmFjZS4gVGhlIG5ldCBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHdlIGRvbid0IGluZGVudAogICAgICAgICAvLyByZWxhdGl2ZSB0byB0aGUgbF9icmFjZSwgaWYgdGhlIG5lc3RlZCBibG9jayBpcyB0aGUgbGFzdCBwYXJhbWV0ZXIgb2YKICAgICAgICAgLy8gYSBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsIHRoaXMgZm9ybWF0czoKQEAgLTU3NywyMCArNjY4LDMyIEBACiAgICAgICAgIC8vCiAgICAgICAgIC8vIGluc3RlYWQgb2Y6CiAgICAgICAgIC8vICAgU29tZUZ1bmN0aW9uKGEsIFtdIHsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBmKCk7ICAvLyBicmVhawotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBDdXJyZW50Lk1hdGNoaW5nUGFyZW4tPkZha2VSUGFyZW5zOyArK2kpCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZigpOyAgLy8gYnJlYWsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gQ3VycmVudC5NYXRjaGluZ1BhcmVuLT5GYWtlUlBhcmVuczsgKytpKSB7CisgICAgICAgICAgYXNzZXJ0KFN0YXRlLlN0YWNrLnNpemUoKSA+IDEpOworICAgICAgICAgIGlmIChTdGF0ZS5TdGFjay5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgLy8gRG8gbm90IHBvcCB0aGUgbGFzdCBlbGVtZW50LgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQogICAgICAgICAgIFN0YXRlLlN0YWNrLnBvcF9iYWNrKCk7Ci0gICAgICAgIE5ld0luZGVudCA9IFN0YXRlLlN0YWNrLmJhY2soKS5MYXN0U3BhY2UgKyBTdHlsZS5JbmRlbnRXaWR0aDsKKyAgICAgICAgfQorICAgICAgICAvLyBGb3Igc29tZSByZWFzb24sIE9iakMgYmxvY2tzIGFyZSBpbmRlbnRlZCBsaWtlIGNvbnRpbnVhdGlvbnMuCisgICAgICAgIE5ld0luZGVudCA9CisgICAgICAgICAgICBTdGF0ZS5TdGFjay5iYWNrKCkuTGFzdFNwYWNlICsgKEN1cnJlbnQuVHlwZSA9PSBUVF9PYmpDQmxvY2tMQnJhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU3R5bGUuQ29udGludWF0aW9uSW5kZW50V2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3R5bGUuSW5kZW50V2lkdGgpOwogICAgICAgICArK05ld0luZGVudExldmVsOwogICAgICAgICBCcmVha0JlZm9yZVBhcmFtZXRlciA9IHRydWU7CiAgICAgICB9IGVsc2UgewogICAgICAgICBOZXdJbmRlbnQgPSBTdGF0ZS5TdGFjay5iYWNrKCkuTGFzdFNwYWNlOwogICAgICAgICBpZiAoQ3VycmVudC5vcGVuc0Jsb2NrVHlwZUxpc3QoU3R5bGUpKSB7CiAgICAgICAgICAgTmV3SW5kZW50ICs9IFN0eWxlLkluZGVudFdpZHRoOworICAgICAgICAgIE5ld0luZGVudCA9IHN0ZDo6bWluKFN0YXRlLkNvbHVtbiArIDIsIE5ld0luZGVudCk7CiAgICAgICAgICAgKytOZXdJbmRlbnRMZXZlbDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBOZXdJbmRlbnQgKz0gU3R5bGUuQ29udGludWF0aW9uSW5kZW50V2lkdGg7CisgICAgICAgICAgTmV3SW5kZW50ID0gc3RkOjptaW4oU3RhdGUuQ29sdW1uICsgMSwgTmV3SW5kZW50KTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgY29uc3QgRm9ybWF0VG9rZW4gKk5leHROb0NvbW1lbnQgPSBDdXJyZW50LmdldE5leHROb25Db21tZW50KCk7CkBAIC02NDksMTUgKzc1MiwyMCBAQAogICAgIC8vIGFzIHRoZXkgd2lsbCBoYXZlIGJlZW4gcmVtb3ZlZCBlYXJseSAoc2VlIGFib3ZlKS4KICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ3VycmVudC5GYWtlUlBhcmVuczsgaSAhPSBlOyArK2kpIHsKICAgICAgIHVuc2lnbmVkIFZhcmlhYmxlUG9zID0gU3RhdGUuU3RhY2suYmFjaygpLlZhcmlhYmxlUG9zOworICAgICAgYXNzZXJ0KFN0YXRlLlN0YWNrLnNpemUoKSA+IDEpOworICAgICAgaWYgKFN0YXRlLlN0YWNrLnNpemUoKSA9PSAxKSB7CisgICAgICAgIC8vIERvIG5vdCBwb3AgdGhlIGxhc3QgZWxlbWVudC4KKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgICBTdGF0ZS5TdGFjay5wb3BfYmFjaygpOwogICAgICAgU3RhdGUuU3RhY2suYmFjaygpLlZhcmlhYmxlUG9zID0gVmFyaWFibGVQb3M7CiAgICAgfQogICB9CiAKLSAgaWYgKEN1cnJlbnQuaXModG9rOjpzdHJpbmdfbGl0ZXJhbCkgJiYgU3RhdGUuU3RhcnRPZlN0cmluZ0xpdGVyYWwgPT0gMCkgeworICBpZiAoQ3VycmVudC5pc1N0cmluZ0xpdGVyYWwoKSAmJiBTdGF0ZS5TdGFydE9mU3RyaW5nTGl0ZXJhbCA9PSAwKSB7CiAgICAgU3RhdGUuU3RhcnRPZlN0cmluZ0xpdGVyYWwgPSBTdGF0ZS5Db2x1bW47Ci0gIH0gZWxzZSBpZiAoIUN1cnJlbnQuaXNPbmVPZih0b2s6OmNvbW1lbnQsIHRvazo6aWRlbnRpZmllciwgdG9rOjpoYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rOjpzdHJpbmdfbGl0ZXJhbCkpIHsKKyAgfSBlbHNlIGlmICghQ3VycmVudC5pc09uZU9mKHRvazo6Y29tbWVudCwgdG9rOjppZGVudGlmaWVyLCB0b2s6Omhhc2gpICYmCisgICAgICAgICAgICAgIUN1cnJlbnQuaXNTdHJpbmdMaXRlcmFsKCkpIHsKICAgICBTdGF0ZS5TdGFydE9mU3RyaW5nTGl0ZXJhbCA9IDA7CiAgIH0KIApAQCAtNjY5LDEzICs3NzcsMTUgQEAKICAgICBQZW5hbHR5ICs9IFN0eWxlLlBlbmFsdHlFeGNlc3NDaGFyYWN0ZXIgKiBFeGNlc3NDaGFyYWN0ZXJzOwogICB9CiAKKyAgaWYgKEN1cnJlbnQuUm9sZSkKKyAgICBDdXJyZW50LlJvbGUtPmZvcm1hdEZyb21Ub2tlbihTdGF0ZSwgdGhpcywgRHJ5UnVuKTsKICAgLy8gSWYgdGhlIHByZXZpb3VzIGhhcyBhIHNwZWNpYWwgcm9sZSwgbGV0IGl0IGNvbnN1bWUgdG9rZW5zIGFzIGFwcHJvcHJpYXRlLgogICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gc3RhcnQgYXQgdGhlIHByZXZpb3VzIHRva2VuIGZvciB0aGUgb25seSBpbXBsZW1lbnRlZAogICAvLyByb2xlIChjb21tYSBzZXBhcmF0ZWQgbGlzdCkuIFRoYXQgd2F5LCB0aGUgZGVjaXNpb24gd2hldGhlciBvciBub3QgdG8gYnJlYWsKICAgLy8gYWZ0ZXIgdGhlICJ7IiBpcyBhbHJlYWR5IGRvbmUgYW5kIGJvdGggb3B0aW9ucyBhcmUgdHJpZWQgYW5kIGV2YWx1YXRlZC4KICAgLy8gRklYTUU6IFRoaXMgaXMgdWdseSwgZmluZCBhIGJldHRlciB3YXkuCiAgIGlmIChQcmV2aW91cyAmJiBQcmV2aW91cy0+Um9sZSkKLSAgICBQZW5hbHR5ICs9IFByZXZpb3VzLT5Sb2xlLT5mb3JtYXQoU3RhdGUsIHRoaXMsIERyeVJ1bik7CisgICAgUGVuYWx0eSArPSBQcmV2aW91cy0+Um9sZS0+Zm9ybWF0QWZ0ZXJUb2tlbihTdGF0ZSwgdGhpcywgRHJ5UnVuKTsKIAogICByZXR1cm4gUGVuYWx0eTsKIH0KQEAgLTcyNywxOSArODM3LDE0IEBACiAgIGlmIChDdXJyZW50LlR5cGUgPT0gVFRfSW1wbGljaXRTdHJpbmdMaXRlcmFsKQogICAgIHJldHVybiAwOwogCi0gIGlmICghQ3VycmVudC5pc09uZU9mKHRvazo6c3RyaW5nX2xpdGVyYWwsIHRvazo6d2lkZV9zdHJpbmdfbGl0ZXJhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rOjp1dGY4X3N0cmluZ19saXRlcmFsLCB0b2s6OnV0ZjE2X3N0cmluZ19saXRlcmFsLAotICAgICAgICAgICAgICAgICAgICAgICB0b2s6OnV0ZjMyX3N0cmluZ19saXRlcmFsLCB0b2s6OmNvbW1lbnQpKQorICBpZiAoIUN1cnJlbnQuaXNTdHJpbmdMaXRlcmFsKCkgJiYgIUN1cnJlbnQuaXModG9rOjpjb21tZW50KSkKICAgICByZXR1cm4gMDsKIAotICBsbHZtOjpPd25pbmdQdHI8QnJlYWthYmxlVG9rZW4+IFRva2VuOworICBzdGQ6OnVuaXF1ZV9wdHI8QnJlYWthYmxlVG9rZW4+IFRva2VuOwogICB1bnNpZ25lZCBTdGFydENvbHVtbiA9IFN0YXRlLkNvbHVtbiAtIEN1cnJlbnQuQ29sdW1uV2lkdGg7CiAgIHVuc2lnbmVkIENvbHVtbkxpbWl0ID0gZ2V0Q29sdW1uTGltaXQoU3RhdGUpOwogCi0gIGlmIChDdXJyZW50LmlzT25lT2YodG9rOjpzdHJpbmdfbGl0ZXJhbCwgdG9rOjp3aWRlX3N0cmluZ19saXRlcmFsLAotICAgICAgICAgICAgICAgICAgICAgIHRvazo6dXRmOF9zdHJpbmdfbGl0ZXJhbCwgdG9rOjp1dGYxNl9zdHJpbmdfbGl0ZXJhbCwKLSAgICAgICAgICAgICAgICAgICAgICB0b2s6OnV0ZjMyX3N0cmluZ19saXRlcmFsKSAmJgotICAgICAgQ3VycmVudC5UeXBlICE9IFRUX0ltcGxpY2l0U3RyaW5nTGl0ZXJhbCkgeworICBpZiAoQ3VycmVudC5pc1N0cmluZ0xpdGVyYWwoKSkgewogICAgIC8vIERvbid0IGJyZWFrIHN0cmluZyBsaXRlcmFscyBpbnNpZGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgKGV4Y2VwdCBmb3IKICAgICAvLyAjZGVmaW5lIGRpcmVjdGl2ZXMsIGFzIHRoZWlyIGNvbnRlbnRzIGFyZSBzdG9yZWQgaW4gc2VwYXJhdGUgbGluZXMgYW5kCiAgICAgLy8gYXJlIG5vdCBhZmZlY3RlZCBieSB0aGlzIGNoZWNrKS4KQEAgLTc1NSwxMyArODYwLDIwIEBACiAgICAgU3RyaW5nUmVmIFRleHQgPSBDdXJyZW50LlRva2VuVGV4dDsKICAgICBTdHJpbmdSZWYgUHJlZml4OwogICAgIFN0cmluZ1JlZiBQb3N0Zml4OworICAgIGJvb2wgSXNOU1N0cmluZ0xpdGVyYWwgPSBmYWxzZTsKICAgICAvLyBGSVhNRTogSGFuZGxlIHdoaXRlc3BhY2UgYmV0d2VlbiAnX1QnLCAnKCcsICciLi4uIicsIGFuZCAnKScuCiAgICAgLy8gRklYTUU6IFN0b3JlIFByZWZpeCBhbmQgU3VmZml4IChvciBQcmVmaXhMZW5ndGggYW5kIFN1ZmZpeExlbmd0aCB0bwogICAgIC8vIHJlZHVjZSB0aGUgb3ZlcmhlYWQpIGZvciBlYWNoIEZvcm1hdFRva2VuLCB3aGljaCBpcyBhIHN0cmluZywgc28gdGhhdCB3ZQogICAgIC8vIGRvbid0IHJ1biBtdWx0aXBsZSBjaGVja3MgaGVyZSBvbiB0aGUgaG90IHBhdGguCisgICAgaWYgKFRleHQuc3RhcnRzd2l0aCgiXCIiKSAmJiBDdXJyZW50LlByZXZpb3VzICYmCisgICAgICAgIEN1cnJlbnQuUHJldmlvdXMtPmlzKHRvazo6YXQpKSB7CisgICAgICBJc05TU3RyaW5nTGl0ZXJhbCA9IHRydWU7CisgICAgICBQcmVmaXggPSAiQFwiIjsKKyAgICB9CiAgICAgaWYgKChUZXh0LmVuZHN3aXRoKFBvc3RmaXggPSAiXCIiKSAmJgotICAgICAgICAgKFRleHQuc3RhcnRzd2l0aChQcmVmaXggPSAiXCIiKSB8fCBUZXh0LnN0YXJ0c3dpdGgoUHJlZml4ID0gInVcIiIpIHx8Ci0gICAgICAgICAgVGV4dC5zdGFydHN3aXRoKFByZWZpeCA9ICJVXCIiKSB8fCBUZXh0LnN0YXJ0c3dpdGgoUHJlZml4ID0gInU4XCIiKSB8fAorICAgICAgICAgKElzTlNTdHJpbmdMaXRlcmFsIHx8IFRleHQuc3RhcnRzd2l0aChQcmVmaXggPSAiXCIiKSB8fAorICAgICAgICAgIFRleHQuc3RhcnRzd2l0aChQcmVmaXggPSAidVwiIikgfHwgVGV4dC5zdGFydHN3aXRoKFByZWZpeCA9ICJVXCIiKSB8fAorICAgICAgICAgIFRleHQuc3RhcnRzd2l0aChQcmVmaXggPSAidThcIiIpIHx8CiAgICAgICAgICAgVGV4dC5zdGFydHN3aXRoKFByZWZpeCA9ICJMXCIiKSkpIHx8CiAgICAgICAgIChUZXh0LnN0YXJ0c3dpdGgoUHJlZml4ID0gIl9UKFwiIikgJiYgVGV4dC5lbmRzd2l0aChQb3N0Zml4ID0gIlwiKSIpKSB8fAogICAgICAgICBnZXRSYXdTdHJpbmdMaXRlcmFsUHJlZml4UG9zdGZpeChUZXh0LCBQcmVmaXgsIFBvc3RmaXgpKSB7CkBAIC03NzIsMTIgKzg4NCwxNiBAQAogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9IGVsc2UgaWYgKEN1cnJlbnQuVHlwZSA9PSBUVF9CbG9ja0NvbW1lbnQgJiYgQ3VycmVudC5pc1RyYWlsaW5nQ29tbWVudCgpKSB7CisgICAgaWYgKENvbW1lbnRQcmFnbWFzUmVnZXgubWF0Y2goQ3VycmVudC5Ub2tlblRleHQuc3Vic3RyKDIpKSkKKyAgICAgIHJldHVybiAwOwogICAgIFRva2VuLnJlc2V0KG5ldyBCcmVha2FibGVCbG9ja0NvbW1lbnQoCiAgICAgICAgIEN1cnJlbnQsIFN0YXRlLkxpbmUtPkxldmVsLCBTdGFydENvbHVtbiwgQ3VycmVudC5PcmlnaW5hbENvbHVtbiwKICAgICAgICAgIUN1cnJlbnQuUHJldmlvdXMsIFN0YXRlLkxpbmUtPkluUFBEaXJlY3RpdmUsIEVuY29kaW5nLCBTdHlsZSkpOwogICB9IGVsc2UgaWYgKEN1cnJlbnQuVHlwZSA9PSBUVF9MaW5lQ29tbWVudCAmJgogICAgICAgICAgICAgIChDdXJyZW50LlByZXZpb3VzID09IE5VTEwgfHwKICAgICAgICAgICAgICAgQ3VycmVudC5QcmV2aW91cy0+VHlwZSAhPSBUVF9JbXBsaWNpdFN0cmluZ0xpdGVyYWwpKSB7CisgICAgaWYgKENvbW1lbnRQcmFnbWFzUmVnZXgubWF0Y2goQ3VycmVudC5Ub2tlblRleHQuc3Vic3RyKDIpKSkKKyAgICAgIHJldHVybiAwOwogICAgIFRva2VuLnJlc2V0KG5ldyBCcmVha2FibGVMaW5lQ29tbWVudChDdXJyZW50LCBTdGF0ZS5MaW5lLT5MZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRDb2x1bW4sIC8qSW5QUERpcmVjdGl2ZT0qL2ZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZywgU3R5bGUpKTsKQEAgLTg0OCw4ICs5NjQsOCBAQAogICAgICAgICBTdGF0ZS5TdGFja1tpXS5CcmVha0JlZm9yZVBhcmFtZXRlciA9IHRydWU7CiAgICAgfQogCi0gICAgUGVuYWx0eSArPSBDdXJyZW50LmlzKHRvazo6c3RyaW5nX2xpdGVyYWwpID8gU3R5bGUuUGVuYWx0eUJyZWFrU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3R5bGUuUGVuYWx0eUJyZWFrQ29tbWVudDsKKyAgICBQZW5hbHR5ICs9IEN1cnJlbnQuaXNTdHJpbmdMaXRlcmFsKCkgPyBTdHlsZS5QZW5hbHR5QnJlYWtTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHlsZS5QZW5hbHR5QnJlYWtDb21tZW50OwogCiAgICAgU3RhdGUuU3RhY2suYmFjaygpLkxhc3RTcGFjZSA9IFN0YXJ0Q29sdW1uOwogICB9CkBAIC04NjEsMTggKzk3NywxOSBAQAogICByZXR1cm4gU3R5bGUuQ29sdW1uTGltaXQgLSAoU3RhdGUuTGluZS0+SW5QUERpcmVjdGl2ZSA/IDIgOiAwKTsKIH0KIAotYm9vbCBDb250aW51YXRpb25JbmRlbnRlcjo6TmV4dElzTXVsdGlsaW5lU3RyaW5nKGNvbnN0IExpbmVTdGF0ZSAmU3RhdGUpIHsKK2Jvb2wgQ29udGludWF0aW9uSW5kZW50ZXI6Om5leHRJc011bHRpbGluZVN0cmluZyhjb25zdCBMaW5lU3RhdGUgJlN0YXRlKSB7CiAgIGNvbnN0IEZvcm1hdFRva2VuICZDdXJyZW50ID0gKlN0YXRlLk5leHRUb2tlbjsKLSAgaWYgKCFDdXJyZW50LmlzKHRvazo6c3RyaW5nX2xpdGVyYWwpKQorICBpZiAoIUN1cnJlbnQuaXNTdHJpbmdMaXRlcmFsKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogICAvLyBXZSBuZXZlciBjb25zaWRlciByYXcgc3RyaW5nIGxpdGVyYWxzICJtdWx0aWxpbmUiIGZvciB0aGUgcHVycG9zZSBvZgotICAvLyBBbHdheXNCcmVha0JlZm9yZU11bHRpbGluZVN0cmluZ3MgaW1wbGVtZW50YXRpb24uCisgIC8vIEFsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5ncyBpbXBsZW1lbnRhdGlvbiBhcyB0aGV5IGFyZSBzcGVjaWFsLWNhc2VkCisgIC8vIChzZWUgVG9rZW5Bbm5vdGF0b3I6Om11c3RCcmVha0JlZm9yZSgpLgogICBpZiAoQ3VycmVudC5Ub2tlblRleHQuc3RhcnRzd2l0aCgiUlwiIikpCiAgICAgcmV0dXJuIGZhbHNlOwogICBpZiAoQ3VycmVudC5Jc011bHRpbGluZSkKICAgICByZXR1cm4gdHJ1ZTsKICAgaWYgKEN1cnJlbnQuZ2V0TmV4dE5vbkNvbW1lbnQoKSAmJgotICAgICAgQ3VycmVudC5nZXROZXh0Tm9uQ29tbWVudCgpLT5pcyh0b2s6OnN0cmluZ19saXRlcmFsKSkKKyAgICAgIEN1cnJlbnQuZ2V0TmV4dE5vbkNvbW1lbnQoKS0+aXNTdHJpbmdMaXRlcmFsKCkpCiAgICAgcmV0dXJuIHRydWU7IC8vIEltcGxpY2l0IGNvbmNhdGVuYXRpb24uCiAgIGlmIChTdGF0ZS5Db2x1bW4gKyBDdXJyZW50LkNvbHVtbldpZHRoICsgQ3VycmVudC5VbmJyZWFrYWJsZVRhaWxMZW5ndGggPgogICAgICAgU3R5bGUuQ29sdW1uTGltaXQpCmRpZmYgLS1naXQgYS9saWIvRm9ybWF0L0NvbnRpbnVhdGlvbkluZGVudGVyLmggYi9saWIvRm9ybWF0L0NvbnRpbnVhdGlvbkluZGVudGVyLmgKaW5kZXggYjMxNzU2NS4uOWEzYzExOCAxMDA2NDQKLS0tIGEvbGliL0Zvcm1hdC9Db250aW51YXRpb25JbmRlbnRlci5oCisrKyBiL2xpYi9Gb3JtYXQvQ29udGludWF0aW9uSW5kZW50ZXIuaApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSAiRW5jb2RpbmcuaCIKICNpbmNsdWRlICJjbGFuZy9Gb3JtYXQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlZ2V4LmgiCiAKIG5hbWVzcGFjZSBjbGFuZyB7CiBjbGFzcyBTb3VyY2VNYW5hZ2VyOwpAQCAtMTAzLDYgKzEwNCw5IEBACiAgIC8vLyBcYyBSZXBsYWNlbWVudC4KICAgdW5zaWduZWQgYWRkVG9rZW5Pbk5ld0xpbmUoTGluZVN0YXRlICZTdGF0ZSwgYm9vbCBEcnlSdW4pOwogCisgIC8vLyBcYnJpZWYgQ2FsY3VsYXRlIHRoZSBuZXcgY29sdW1uIGZvciBhIGxpbmUgd3JhcCBiZWZvcmUgdGhlIG5leHQgdG9rZW4uCisgIHVuc2lnbmVkIGdldE5ld0xpbmVDb2x1bW4oY29uc3QgTGluZVN0YXRlICZTdGF0ZSk7CisKICAgLy8vIFxicmllZiBBZGRzIGEgbXVsdGlsaW5lIHRva2VuIHRvIHRoZSBccCBTdGF0ZS4KICAgLy8vCiAgIC8vLyBccmV0dXJucyBFeHRyYSBwZW5hbHR5IGZvciB0aGUgZmlyc3QgbGluZSBvZiB0aGUgbGl0ZXJhbDogbGFzdCBsaW5lIGlzCkBAIC0xMTUsMTMgKzExOSwxNCBAQAogICAvLy8KICAgLy8vIFRoaXMgaW5jbHVkZXMgaW1wbGljaXRseSBjb25jYXRlbmF0ZWQgc3RyaW5ncywgc3RyaW5ncyB0aGF0IHdpbGwgYmUgYnJva2VuCiAgIC8vLyBieSBjbGFuZy1mb3JtYXQgYW5kIHN0cmluZyBsaXRlcmFscyB3aXRoIGVzY2FwZWQgbmV3bGluZXMuCi0gIGJvb2wgTmV4dElzTXVsdGlsaW5lU3RyaW5nKGNvbnN0IExpbmVTdGF0ZSAmU3RhdGUpOworICBib29sIG5leHRJc011bHRpbGluZVN0cmluZyhjb25zdCBMaW5lU3RhdGUgJlN0YXRlKTsKIAogICBGb3JtYXRTdHlsZSBTdHlsZTsKICAgU291cmNlTWFuYWdlciAmU291cmNlTWdyOwogICBXaGl0ZXNwYWNlTWFuYWdlciAmV2hpdGVzcGFjZXM7CiAgIGVuY29kaW5nOjpFbmNvZGluZyBFbmNvZGluZzsKICAgYm9vbCBCaW5QYWNrSW5jb25jbHVzaXZlRnVuY3Rpb25zOworICBsbHZtOjpSZWdleCBDb21tZW50UHJhZ21hc1JlZ2V4OwogfTsKIAogc3RydWN0IFBhcmVuU3RhdGUgewpAQCAtMTMzLDcgKzEzOCw4IEBACiAgICAgICAgIE5vTGluZUJyZWFrKE5vTGluZUJyZWFrKSwgQ29sb25Qb3MoMCksIFN0YXJ0T2ZGdW5jdGlvbkNhbGwoMCksCiAgICAgICAgIFN0YXJ0T2ZBcnJheVN1YnNjcmlwdHMoMCksIE5lc3RlZE5hbWVTcGVjaWZpZXJDb250aW51YXRpb24oMCksCiAgICAgICAgIENhbGxDb250aW51YXRpb24oMCksIFZhcmlhYmxlUG9zKDApLCBDb250YWluc0xpbmVCcmVhayhmYWxzZSksCi0gICAgICAgIENvbnRhaW5zVW53cmFwcGVkQnVpbGRlcigwKSB7fQorICAgICAgICBDb250YWluc1Vud3JhcHBlZEJ1aWxkZXIoMCksIEFsaWduQ29sb25zKHRydWUpLAorICAgICAgICBPYmpDU2VsZWN0b3JOYW1lRm91bmQoZmFsc2UpIHt9CiAKICAgLy8vIFxicmllZiBUaGUgcG9zaXRpb24gdG8gd2hpY2ggYSBzcGVjaWZpYyBwYXJlbnRoZXNpcyBsZXZlbCBuZWVkcyB0byBiZQogICAvLy8gaW5kZW50ZWQuCkBAIC0yMTAsNiArMjE2LDIwIEBACiAgIC8vLyBidWlsZGVyLXR5cGUgY2FsbCBvbiBvbmUgbGluZS4KICAgYm9vbCBDb250YWluc1Vud3JhcHBlZEJ1aWxkZXI7CiAKKyAgLy8vIFxicmllZiBcYyB0cnVlIGlmIHRoZSBjb2xvbnMgb2YgdGhlIGN1cnJlbiBPYmpDIG1ldGhvZCBleHByZXNzaW9uIHNob3VsZAorICAvLy8gYmUgYWxpZ25lZC4KKyAgLy8vCisgIC8vLyBOb3QgY29uc2lkZXJlZCBmb3IgbWVtb2l6YXRpb24gYXMgaXQgd2lsbCBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhdAorICAvLy8gdGhlIHNhbWUgdG9rZW4uCisgIGJvb2wgQWxpZ25Db2xvbnM7CisKKyAgLy8vIFxicmllZiBcYyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBzZWxlY3RvciBuYW1lIHdhcyBmb3VuZCBpbiB0aGUgY3VycmVudAorICAvLy8gT2JqQyBtZXRob2QgZXhwcmVzc2lvbi4KKyAgLy8vCisgIC8vLyBOb3QgY29uc2lkZXJlZCBmb3IgbWVtb2l6YXRpb24gYXMgaXQgd2lsbCBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhdAorICAvLy8gdGhlIHNhbWUgdG9rZW4uCisgIGJvb2wgT2JqQ1NlbGVjdG9yTmFtZUZvdW5kOworCiAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFBhcmVuU3RhdGUgJk90aGVyKSBjb25zdCB7CiAgICAgaWYgKEluZGVudCAhPSBPdGhlci5JbmRlbnQpCiAgICAgICByZXR1cm4gSW5kZW50IDwgT3RoZXIuSW5kZW50OwpkaWZmIC0tZ2l0IGEvbGliL0Zvcm1hdC9FbmNvZGluZy5oIGIvbGliL0Zvcm1hdC9FbmNvZGluZy5oCmluZGV4IDM1NjMzNGQuLmRiYTUxNzQgMTAwNjQ0Ci0tLSBhL2xpYi9Gb3JtYXQvRW5jb2RpbmcuaAorKysgYi9saWIvRm9ybWF0L0VuY29kaW5nLmgKQEAgLTY0LDYgKzY0LDEwIEBACiBpbmxpbmUgdW5zaWduZWQgY29sdW1uV2lkdGgoU3RyaW5nUmVmIFRleHQsIEVuY29kaW5nIEVuY29kaW5nKSB7CiAgIGlmIChFbmNvZGluZyA9PSBFbmNvZGluZ19VVEY4KSB7CiAgICAgaW50IENvbnRlbnRXaWR0aCA9IGxsdm06OnN5czo6dW5pY29kZTo6Y29sdW1uV2lkdGhVVEY4KFRleHQpOworICAgIC8vIEZJWE1FOiBGaWd1cmUgb3V0IHRoZSBjb3JyZWN0IHdheSB0byBoYW5kbGUgdGhpcyBpbiB0aGUgcHJlc2VuY2Ugb2YgYm90aAorICAgIC8vIHByaW50YWJsZSBhbmQgdW5wcmludGFibGUgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzLiBGYWxsaW5nIGJhY2sgdG8KKyAgICAvLyByZXR1cm5pbmcgdGhlIG51bWJlciBvZiBieXRlcyBtYXkgY2F1c2UgcHJvYmxlbXMsIGFzIGNvbHVtbldpZHRoIHN1ZGRlbmx5CisgICAgLy8gYmVjb21lcyBub24tYWRkaXRpdmUuCiAgICAgaWYgKENvbnRlbnRXaWR0aCA+PSAwKQogICAgICAgcmV0dXJuIENvbnRlbnRXaWR0aDsKICAgfQpAQCAtODEsOSArODUsNyBAQAogICAgIFN0cmluZ1JlZjo6c2l6ZV90eXBlIFRhYlBvcyA9IFRhaWwuZmluZCgnXHQnKTsKICAgICBpZiAoVGFiUG9zID09IFN0cmluZ1JlZjo6bnBvcykKICAgICAgIHJldHVybiBUb3RhbFdpZHRoICsgY29sdW1uV2lkdGgoVGFpbCwgRW5jb2RpbmcpOwotICAgIGludCBXaWR0aCA9IGNvbHVtbldpZHRoKFRhaWwuc3Vic3RyKDAsIFRhYlBvcyksIEVuY29kaW5nKTsKLSAgICBhc3NlcnQoV2lkdGggPj0gMCk7Ci0gICAgVG90YWxXaWR0aCArPSBXaWR0aDsKKyAgICBUb3RhbFdpZHRoICs9IGNvbHVtbldpZHRoKFRhaWwuc3Vic3RyKDAsIFRhYlBvcyksIEVuY29kaW5nKTsKICAgICBUb3RhbFdpZHRoICs9IFRhYldpZHRoIC0gKFRvdGFsV2lkdGggKyBTdGFydENvbHVtbikgJSBUYWJXaWR0aDsKICAgICBUYWlsID0gVGFpbC5zdWJzdHIoVGFiUG9zICsgMSk7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9Gb3JtYXQvRm9ybWF0LmNwcCBiL2xpYi9Gb3JtYXQvRm9ybWF0LmNwcAppbmRleCAwMWMxMjJlLi5jYjA3Y2I1IDEwMDY0NAotLS0gYS9saWIvRm9ybWF0L0Zvcm1hdC5jcHAKKysrIGIvbGliL0Zvcm1hdC9Gb3JtYXQuY3BwCkBAIC0yNiw3MSArMjYsOTMgQEAKICNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCiAjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8c3RyaW5nPgogCit1c2luZyBjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZTsKKworTExWTV9ZQU1MX0lTX0ZMT1dfU0VRVUVOQ0VfVkVDVE9SKHN0ZDo6c3RyaW5nKQorCiBuYW1lc3BhY2UgbGx2bSB7CiBuYW1lc3BhY2UgeWFtbCB7Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Rm9ybWF0U3R5bGU6Okxhbmd1YWdlS2luZD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEZvcm1hdFN0eWxlOjpMYW5ndWFnZUtpbmQgJlZhbHVlKSB7CisgICAgSU8uZW51bUNhc2UoVmFsdWUsICJDcHAiLCBGb3JtYXRTdHlsZTo6TEtfQ3BwKTsKKyAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgIkphdmFTY3JpcHQiLCBGb3JtYXRTdHlsZTo6TEtfSmF2YVNjcmlwdCk7CisgICAgSU8uZW51bUNhc2UoVmFsdWUsICJQcm90byIsIEZvcm1hdFN0eWxlOjpMS19Qcm90byk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxGb3JtYXRTdHlsZTo6TGFuZ3VhZ2VTdGFuZGFyZD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEZvcm1hdFN0eWxlOjpMYW5ndWFnZVN0YW5kYXJkICZWYWx1ZSkgeworICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQ3BwMDMiLCBGb3JtYXRTdHlsZTo6TFNfQ3BwMDMpOworICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQysrMDMiLCBGb3JtYXRTdHlsZTo6TFNfQ3BwMDMpOworICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQ3BwMTEiLCBGb3JtYXRTdHlsZTo6TFNfQ3BwMTEpOworICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQysrMTEiLCBGb3JtYXRTdHlsZTo6TFNfQ3BwMTEpOworICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQXV0byIsIEZvcm1hdFN0eWxlOjpMU19BdXRvKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEZvcm1hdFN0eWxlOjpVc2VUYWJTdHlsZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEZvcm1hdFN0eWxlOjpVc2VUYWJTdHlsZSAmVmFsdWUpIHsKKyAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgIk5ldmVyIiwgRm9ybWF0U3R5bGU6OlVUX05ldmVyKTsKKyAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgImZhbHNlIiwgRm9ybWF0U3R5bGU6OlVUX05ldmVyKTsKKyAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgIkFsd2F5cyIsIEZvcm1hdFN0eWxlOjpVVF9BbHdheXMpOworICAgIElPLmVudW1DYXNlKFZhbHVlLCAidHJ1ZSIsIEZvcm1hdFN0eWxlOjpVVF9BbHdheXMpOworICAgIElPLmVudW1DYXNlKFZhbHVlLCAiRm9ySW5kZW50YXRpb24iLCBGb3JtYXRTdHlsZTo6VVRfRm9ySW5kZW50YXRpb24pOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Rm9ybWF0U3R5bGU6OkJyYWNlQnJlYWtpbmdTdHlsZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEZvcm1hdFN0eWxlOjpCcmFjZUJyZWFraW5nU3R5bGUgJlZhbHVlKSB7CisgICAgSU8uZW51bUNhc2UoVmFsdWUsICJBdHRhY2giLCBGb3JtYXRTdHlsZTo6QlNfQXR0YWNoKTsKKyAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgIkxpbnV4IiwgRm9ybWF0U3R5bGU6OkJTX0xpbnV4KTsKKyAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgIlN0cm91c3RydXAiLCBGb3JtYXRTdHlsZTo6QlNfU3Ryb3VzdHJ1cCk7CisgICAgSU8uZW51bUNhc2UoVmFsdWUsICJBbGxtYW4iLCBGb3JtYXRTdHlsZTo6QlNfQWxsbWFuKTsKKyAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgIkdOVSIsIEZvcm1hdFN0eWxlOjpCU19HTlUpOworICB9Cit9OworCiB0ZW1wbGF0ZSA8Pgotc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPGNsYW5nOjpmb3JtYXQ6OkZvcm1hdFN0eWxlOjpMYW5ndWFnZVN0YW5kYXJkPiB7CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Rm9ybWF0U3R5bGU6Ok5hbWVzcGFjZUluZGVudGF0aW9uS2luZD4gewogICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nOjpmb3JtYXQ6OkZvcm1hdFN0eWxlOjpMYW5ndWFnZVN0YW5kYXJkICZWYWx1ZSkgewotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQ3BwMDMiLCBjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZTo6TFNfQ3BwMDMpOwotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQysrMDMiLCBjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZTo6TFNfQ3BwMDMpOwotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQ3BwMTEiLCBjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZTo6TFNfQ3BwMTEpOwotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQysrMTEiLCBjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZTo6TFNfQ3BwMTEpOwotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQXV0byIsIGNsYW5nOjpmb3JtYXQ6OkZvcm1hdFN0eWxlOjpMU19BdXRvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0U3R5bGU6Ok5hbWVzcGFjZUluZGVudGF0aW9uS2luZCAmVmFsdWUpIHsKKyAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgIk5vbmUiLCBGb3JtYXRTdHlsZTo6TklfTm9uZSk7CisgICAgSU8uZW51bUNhc2UoVmFsdWUsICJJbm5lciIsIEZvcm1hdFN0eWxlOjpOSV9Jbm5lcik7CisgICAgSU8uZW51bUNhc2UoVmFsdWUsICJBbGwiLCBGb3JtYXRTdHlsZTo6TklfQWxsKTsKICAgfQogfTsKIAogdGVtcGxhdGUgPD4KLXN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZTo6VXNlVGFiU3R5bGU+IHsKK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxGb3JtYXRTdHlsZTo6U3BhY2VCZWZvcmVQYXJlbnNPcHRpb25zPiB7CiAgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhbmc6OmZvcm1hdDo6Rm9ybWF0U3R5bGU6OlVzZVRhYlN0eWxlICZWYWx1ZSkgewotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiTmV2ZXIiLCBjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZTo6VVRfTmV2ZXIpOwotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiZmFsc2UiLCBjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZTo6VVRfTmV2ZXIpOwotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQWx3YXlzIiwgY2xhbmc6OmZvcm1hdDo6Rm9ybWF0U3R5bGU6OlVUX0Fsd2F5cyk7Ci0gICAgSU8uZW51bUNhc2UoVmFsdWUsICJ0cnVlIiwgY2xhbmc6OmZvcm1hdDo6Rm9ybWF0U3R5bGU6OlVUX0Fsd2F5cyk7Ci0gICAgSU8uZW51bUNhc2UoVmFsdWUsICJGb3JJbmRlbnRhdGlvbiIsCi0gICAgICAgICAgICAgICAgY2xhbmc6OmZvcm1hdDo6Rm9ybWF0U3R5bGU6OlVUX0ZvckluZGVudGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0U3R5bGU6OlNwYWNlQmVmb3JlUGFyZW5zT3B0aW9ucyAmVmFsdWUpIHsKKyAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgIk5ldmVyIiwgRm9ybWF0U3R5bGU6OlNCUE9fTmV2ZXIpOworICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQ29udHJvbFN0YXRlbWVudHMiLAorICAgICAgICAgICAgICAgIEZvcm1hdFN0eWxlOjpTQlBPX0NvbnRyb2xTdGF0ZW1lbnRzKTsKKyAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgIkFsd2F5cyIsIEZvcm1hdFN0eWxlOjpTQlBPX0Fsd2F5cyk7CisKKyAgICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgImZhbHNlIiwgRm9ybWF0U3R5bGU6OlNCUE9fTmV2ZXIpOworICAgIElPLmVudW1DYXNlKFZhbHVlLCAidHJ1ZSIsIEZvcm1hdFN0eWxlOjpTQlBPX0NvbnRyb2xTdGF0ZW1lbnRzKTsKICAgfQogfTsKIAotdGVtcGxhdGUgPD4KLXN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZTo6QnJhY2VCcmVha2luZ1N0eWxlPiB7Ci0gIHN0YXRpYyB2b2lkCi0gIGVudW1lcmF0aW9uKElPICZJTywgY2xhbmc6OmZvcm1hdDo6Rm9ybWF0U3R5bGU6OkJyYWNlQnJlYWtpbmdTdHlsZSAmVmFsdWUpIHsKLSAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgIkF0dGFjaCIsIGNsYW5nOjpmb3JtYXQ6OkZvcm1hdFN0eWxlOjpCU19BdHRhY2gpOwotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiTGludXgiLCBjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZTo6QlNfTGludXgpOwotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiU3Ryb3VzdHJ1cCIsIGNsYW5nOjpmb3JtYXQ6OkZvcm1hdFN0eWxlOjpCU19TdHJvdXN0cnVwKTsKLSAgICBJTy5lbnVtQ2FzZShWYWx1ZSwgIkFsbG1hbiIsIGNsYW5nOjpmb3JtYXQ6OkZvcm1hdFN0eWxlOjpCU19BbGxtYW4pOwotICB9Ci19OwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8Rm9ybWF0U3R5bGU+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIEZvcm1hdFN0eWxlICZTdHlsZSkgeworICAgIC8vIFdoZW4gcmVhZGluZywgcmVhZCB0aGUgbGFuZ3VhZ2UgZmlyc3QsIHdlIG5lZWQgaXQgZm9yIGdldFByZWRlZmluZWRTdHlsZS4KKyAgICBJTy5tYXBPcHRpb25hbCgiTGFuZ3VhZ2UiLCBTdHlsZS5MYW5ndWFnZSk7CiAKLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Ci0gICAgY2xhbmc6OmZvcm1hdDo6Rm9ybWF0U3R5bGU6Ok5hbWVzcGFjZUluZGVudGF0aW9uS2luZD4gewotICBzdGF0aWMgdm9pZAotICBlbnVtZXJhdGlvbihJTyAmSU8sCi0gICAgICAgICAgICAgIGNsYW5nOjpmb3JtYXQ6OkZvcm1hdFN0eWxlOjpOYW1lc3BhY2VJbmRlbnRhdGlvbktpbmQgJlZhbHVlKSB7Ci0gICAgSU8uZW51bUNhc2UoVmFsdWUsICJOb25lIiwgY2xhbmc6OmZvcm1hdDo6Rm9ybWF0U3R5bGU6Ok5JX05vbmUpOwotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiSW5uZXIiLCBjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZTo6TklfSW5uZXIpOwotICAgIElPLmVudW1DYXNlKFZhbHVlLCAiQWxsIiwgY2xhbmc6OmZvcm1hdDo6Rm9ybWF0U3R5bGU6Ok5JX0FsbCk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPGNsYW5nOjpmb3JtYXQ6OkZvcm1hdFN0eWxlPiB7Ci0gIHN0YXRpYyB2b2lkIG1hcHBpbmcobGx2bTo6eWFtbDo6SU8gJklPLCBjbGFuZzo6Zm9ybWF0OjpGb3JtYXRTdHlsZSAmU3R5bGUpIHsKICAgICBpZiAoSU8ub3V0cHV0dGluZygpKSB7CiAgICAgICBTdHJpbmdSZWYgU3R5bGVzQXJyYXlbXSA9IHsgIkxMVk0iLCAgICAiR29vZ2xlIiwgIkNocm9taXVtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW96aWxsYSIsICJXZWJLaXQiIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vemlsbGEiLCAiV2ViS2l0IiwgIkdOVSIgfTsKICAgICAgIEFycmF5UmVmPFN0cmluZ1JlZj4gU3R5bGVzKFN0eWxlc0FycmF5KTsKICAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gU3R5bGVzLnNpemUoKTsgaSA8IGU7ICsraSkgewogICAgICAgICBTdHJpbmdSZWYgU3R5bGVOYW1lKFN0eWxlc1tpXSk7Ci0gICAgICAgIGNsYW5nOjpmb3JtYXQ6OkZvcm1hdFN0eWxlIFByZWRlZmluZWRTdHlsZTsKLSAgICAgICAgaWYgKGNsYW5nOjpmb3JtYXQ6OmdldFByZWRlZmluZWRTdHlsZShTdHlsZU5hbWUsICZQcmVkZWZpbmVkU3R5bGUpICYmCisgICAgICAgIEZvcm1hdFN0eWxlIFByZWRlZmluZWRTdHlsZTsKKyAgICAgICAgaWYgKGdldFByZWRlZmluZWRTdHlsZShTdHlsZU5hbWUsIFN0eWxlLkxhbmd1YWdlLCAmUHJlZGVmaW5lZFN0eWxlKSAmJgogICAgICAgICAgICAgU3R5bGUgPT0gUHJlZGVmaW5lZFN0eWxlKSB7CiAgICAgICAgICAgSU8ubWFwT3B0aW9uYWwoIiMgQmFzZWRPblN0eWxlIiwgU3R5bGVOYW1lKTsKICAgICAgICAgICBicmVhazsKQEAgLTk5LDExICsxMjEsMTYgQEAKICAgICB9IGVsc2UgewogICAgICAgU3RyaW5nUmVmIEJhc2VkT25TdHlsZTsKICAgICAgIElPLm1hcE9wdGlvbmFsKCJCYXNlZE9uU3R5bGUiLCBCYXNlZE9uU3R5bGUpOwotICAgICAgaWYgKCFCYXNlZE9uU3R5bGUuZW1wdHkoKSkKLSAgICAgICAgaWYgKCFjbGFuZzo6Zm9ybWF0OjpnZXRQcmVkZWZpbmVkU3R5bGUoQmFzZWRPblN0eWxlLCAmU3R5bGUpKSB7CisgICAgICBpZiAoIUJhc2VkT25TdHlsZS5lbXB0eSgpKSB7CisgICAgICAgIEZvcm1hdFN0eWxlOjpMYW5ndWFnZUtpbmQgT2xkTGFuZ3VhZ2UgPSBTdHlsZS5MYW5ndWFnZTsKKyAgICAgICAgRm9ybWF0U3R5bGU6Okxhbmd1YWdlS2luZCBMYW5ndWFnZSA9CisgICAgICAgICAgICAoKEZvcm1hdFN0eWxlICopSU8uZ2V0Q29udGV4dCgpKS0+TGFuZ3VhZ2U7CisgICAgICAgIGlmICghZ2V0UHJlZGVmaW5lZFN0eWxlKEJhc2VkT25TdHlsZSwgTGFuZ3VhZ2UsICZTdHlsZSkpIHsKICAgICAgICAgICBJTy5zZXRFcnJvcihUd2luZSgiVW5rbm93biB2YWx1ZSBmb3IgQmFzZWRPblN0eWxlOiAiLCBCYXNlZE9uU3R5bGUpKTsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgU3R5bGUuTGFuZ3VhZ2UgPSBPbGRMYW5ndWFnZTsKKyAgICAgIH0KICAgICB9CiAKICAgICBJTy5tYXBPcHRpb25hbCgiQWNjZXNzTW9kaWZpZXJPZmZzZXQiLCBTdHlsZS5BY2Nlc3NNb2RpZmllck9mZnNldCk7CkBAIC0xMTcsNiArMTQ0LDggQEAKICAgICAgICAgICAgICAgICAgICBTdHlsZS5BbGxvd1Nob3J0SWZTdGF0ZW1lbnRzT25BU2luZ2xlTGluZSk7CiAgICAgSU8ubWFwT3B0aW9uYWwoIkFsbG93U2hvcnRMb29wc09uQVNpbmdsZUxpbmUiLAogICAgICAgICAgICAgICAgICAgIFN0eWxlLkFsbG93U2hvcnRMb29wc09uQVNpbmdsZUxpbmUpOworICAgIElPLm1hcE9wdGlvbmFsKCJBbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZSIsCisgICAgICAgICAgICAgICAgICAgU3R5bGUuQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmUpOwogICAgIElPLm1hcE9wdGlvbmFsKCJBbHdheXNCcmVha1RlbXBsYXRlRGVjbGFyYXRpb25zIiwKICAgICAgICAgICAgICAgICAgICBTdHlsZS5BbHdheXNCcmVha1RlbXBsYXRlRGVjbGFyYXRpb25zKTsKICAgICBJTy5tYXBPcHRpb25hbCgiQWx3YXlzQnJlYWtCZWZvcmVNdWx0aWxpbmVTdHJpbmdzIiwKQEAgLTEzNiw3ICsxNjUsMTAgQEAKICAgICAgICAgICAgICAgICAgICBTdHlsZS5FeHBlcmltZW50YWxBdXRvRGV0ZWN0QmluUGFja2luZyk7CiAgICAgSU8ubWFwT3B0aW9uYWwoIkluZGVudENhc2VMYWJlbHMiLCBTdHlsZS5JbmRlbnRDYXNlTGFiZWxzKTsKICAgICBJTy5tYXBPcHRpb25hbCgiTWF4RW1wdHlMaW5lc1RvS2VlcCIsIFN0eWxlLk1heEVtcHR5TGluZXNUb0tlZXApOworICAgIElPLm1hcE9wdGlvbmFsKCJLZWVwRW1wdHlMaW5lc0F0VGhlU3RhcnRPZkJsb2NrcyIsCisgICAgICAgICAgICAgICAgICAgU3R5bGUuS2VlcEVtcHR5TGluZXNBdFRoZVN0YXJ0T2ZCbG9ja3MpOwogICAgIElPLm1hcE9wdGlvbmFsKCJOYW1lc3BhY2VJbmRlbnRhdGlvbiIsIFN0eWxlLk5hbWVzcGFjZUluZGVudGF0aW9uKTsKKyAgICBJTy5tYXBPcHRpb25hbCgiT2JqQ1NwYWNlQWZ0ZXJQcm9wZXJ0eSIsIFN0eWxlLk9iakNTcGFjZUFmdGVyUHJvcGVydHkpOwogICAgIElPLm1hcE9wdGlvbmFsKCJPYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3QiLAogICAgICAgICAgICAgICAgICAgIFN0eWxlLk9iakNTcGFjZUJlZm9yZVByb3RvY29sTGlzdCk7CiAgICAgSU8ubWFwT3B0aW9uYWwoIlBlbmFsdHlCcmVha0JlZm9yZUZpcnN0Q2FsbFBhcmFtZXRlciIsCkBAIC0xNjQsMTEgKzE5Niw0NiBAQAogICAgIElPLm1hcE9wdGlvbmFsKCJTcGFjZUluRW1wdHlQYXJlbnRoZXNlcyIsIFN0eWxlLlNwYWNlSW5FbXB0eVBhcmVudGhlc2VzKTsKICAgICBJTy5tYXBPcHRpb25hbCgiU3BhY2VzSW5DU3R5bGVDYXN0UGFyZW50aGVzZXMiLAogICAgICAgICAgICAgICAgICAgIFN0eWxlLlNwYWNlc0luQ1N0eWxlQ2FzdFBhcmVudGhlc2VzKTsKLSAgICBJTy5tYXBPcHRpb25hbCgiU3BhY2VBZnRlckNvbnRyb2xTdGF0ZW1lbnRLZXl3b3JkIiwKLSAgICAgICAgICAgICAgICAgICBTdHlsZS5TcGFjZUFmdGVyQ29udHJvbFN0YXRlbWVudEtleXdvcmQpOworICAgIElPLm1hcE9wdGlvbmFsKCJTcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzIiwKKyAgICAgICAgICAgICAgICAgICBTdHlsZS5TcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzKTsKICAgICBJTy5tYXBPcHRpb25hbCgiU3BhY2VCZWZvcmVBc3NpZ25tZW50T3BlcmF0b3JzIiwKICAgICAgICAgICAgICAgICAgICBTdHlsZS5TcGFjZUJlZm9yZUFzc2lnbm1lbnRPcGVyYXRvcnMpOwogICAgIElPLm1hcE9wdGlvbmFsKCJDb250aW51YXRpb25JbmRlbnRXaWR0aCIsIFN0eWxlLkNvbnRpbnVhdGlvbkluZGVudFdpZHRoKTsKKyAgICBJTy5tYXBPcHRpb25hbCgiQ29tbWVudFByYWdtYXMiLCBTdHlsZS5Db21tZW50UHJhZ21hcyk7CisgICAgSU8ubWFwT3B0aW9uYWwoIkZvckVhY2hNYWNyb3MiLCBTdHlsZS5Gb3JFYWNoTWFjcm9zKTsgCisKKyAgICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAgICBpZiAoIUlPLm91dHB1dHRpbmcoKSkgeworICAgICAgSU8ubWFwT3B0aW9uYWwoIlNwYWNlQWZ0ZXJDb250cm9sU3RhdGVtZW50S2V5d29yZCIsCisgICAgICAgICAgICAgICAgICAgICBTdHlsZS5TcGFjZUJlZm9yZVBhcmVucyk7CisgICAgfQorICAgIElPLm1hcE9wdGlvbmFsKCJTcGFjZUJlZm9yZVBhcmVucyIsIFN0eWxlLlNwYWNlQmVmb3JlUGFyZW5zKTsKKyAgfQorfTsKKworLy8gQWxsb3dzIHRvIHJlYWQgdmVjdG9yPEZvcm1hdFN0eWxlPiB3aGlsZSBrZWVwaW5nIGRlZmF1bHQgdmFsdWVzLgorLy8gSU8uZ2V0Q29udGV4dCgpIHNob3VsZCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgRm9ybWF0U3R5bGUgc3RydWN0dXJlLCB0aGF0CisvLyB3aWxsIGJlIHVzZWQgdG8gZ2V0IGRlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIGtleXMuCisvLyBJZiB0aGUgZmlyc3QgZWxlbWVudCBoYXMgbm8gTGFuZ3VhZ2Ugc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgdGhlCisvLyBkZWZhdWx0IG9uZSBmb3IgdGhlIGZvbGxvd2luZyBlbGVtZW50cy4KK3RlbXBsYXRlIDw+IHN0cnVjdCBEb2N1bWVudExpc3RUcmFpdHM8c3RkOjp2ZWN0b3I8Rm9ybWF0U3R5bGU+ID4geworICBzdGF0aWMgc2l6ZV90IHNpemUoSU8gJklPLCBzdGQ6OnZlY3RvcjxGb3JtYXRTdHlsZT4gJlNlcSkgeworICAgIHJldHVybiBTZXEuc2l6ZSgpOworICB9CisgIHN0YXRpYyBGb3JtYXRTdHlsZSAmZWxlbWVudChJTyAmSU8sIHN0ZDo6dmVjdG9yPEZvcm1hdFN0eWxlPiAmU2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEluZGV4KSB7CisgICAgaWYgKEluZGV4ID49IFNlcS5zaXplKCkpIHsKKyAgICAgIGFzc2VydChJbmRleCA9PSBTZXEuc2l6ZSgpKTsKKyAgICAgIEZvcm1hdFN0eWxlIFRlbXBsYXRlOworICAgICAgaWYgKFNlcS5zaXplKCkgPiAwICYmIFNlcVswXS5MYW5ndWFnZSA9PSBGb3JtYXRTdHlsZTo6TEtfTm9uZSkgeworICAgICAgICBUZW1wbGF0ZSA9IFNlcVswXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFRlbXBsYXRlID0gKigoY29uc3QgRm9ybWF0U3R5bGUqKUlPLmdldENvbnRleHQoKSk7CisgICAgICAgIFRlbXBsYXRlLkxhbmd1YWdlID0gRm9ybWF0U3R5bGU6OkxLX05vbmU7CisgICAgICB9CisgICAgICBTZXEucmVzaXplKEluZGV4ICsgMSwgVGVtcGxhdGUpOworICAgIH0KKyAgICByZXR1cm4gU2VxW0luZGV4XTsKICAgfQogfTsKIH0KQEAgLTE3NywxOSArMjQ0LDE0IEBACiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIGZvcm1hdCB7CiAKLXZvaWQgc2V0RGVmYXVsdFBlbmFsdGllcyhGb3JtYXRTdHlsZSAmU3R5bGUpIHsKLSAgU3R5bGUuUGVuYWx0eUJyZWFrQ29tbWVudCA9IDYwOwotICBTdHlsZS5QZW5hbHR5QnJlYWtGaXJzdExlc3NMZXNzID0gMTIwOwotICBTdHlsZS5QZW5hbHR5QnJlYWtTdHJpbmcgPSAxMDAwOwotICBTdHlsZS5QZW5hbHR5RXhjZXNzQ2hhcmFjdGVyID0gMTAwMDAwMDsKLX0KLQogRm9ybWF0U3R5bGUgZ2V0TExWTVN0eWxlKCkgewogICBGb3JtYXRTdHlsZSBMTFZNU3R5bGU7CisgIExMVk1TdHlsZS5MYW5ndWFnZSA9IEZvcm1hdFN0eWxlOjpMS19DcHA7CiAgIExMVk1TdHlsZS5BY2Nlc3NNb2RpZmllck9mZnNldCA9IC0yOwogICBMTFZNU3R5bGUuQWxpZ25Fc2NhcGVkTmV3bGluZXNMZWZ0ID0gZmFsc2U7CiAgIExMVk1TdHlsZS5BbGlnblRyYWlsaW5nQ29tbWVudHMgPSB0cnVlOwogICBMTFZNU3R5bGUuQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmUgPSB0cnVlOworICBMTFZNU3R5bGUuQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmUgPSB0cnVlOwogICBMTFZNU3R5bGUuQWxsb3dTaG9ydElmU3RhdGVtZW50c09uQVNpbmdsZUxpbmUgPSBmYWxzZTsKICAgTExWTVN0eWxlLkFsbG93U2hvcnRMb29wc09uQVNpbmdsZUxpbmUgPSBmYWxzZTsKICAgTExWTVN0eWxlLkFsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5ncyA9IGZhbHNlOwpAQCAtMjAwLDg2ICsyNjIsODQgQEAKICAgTExWTVN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID0gRm9ybWF0U3R5bGU6OkJTX0F0dGFjaDsKICAgTExWTVN0eWxlLkJyZWFrQ29uc3RydWN0b3JJbml0aWFsaXplcnNCZWZvcmVDb21tYSA9IGZhbHNlOwogICBMTFZNU3R5bGUuQ29sdW1uTGltaXQgPSA4MDsKKyAgTExWTVN0eWxlLkNvbW1lbnRQcmFnbWFzID0gIl4gSVdZVSBwcmFnbWE6IjsKICAgTExWTVN0eWxlLkNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJBbGxPbk9uZUxpbmVPck9uZVBlckxpbmUgPSBmYWxzZTsKICAgTExWTVN0eWxlLkNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJJbmRlbnRXaWR0aCA9IDQ7Ci0gIExMVk1TdHlsZS5DcHAxMUJyYWNlZExpc3RTdHlsZSA9IGZhbHNlOworICBMTFZNU3R5bGUuQ29udGludWF0aW9uSW5kZW50V2lkdGggPSA0OworICBMTFZNU3R5bGUuQ3BwMTFCcmFjZWRMaXN0U3R5bGUgPSB0cnVlOwogICBMTFZNU3R5bGUuRGVyaXZlUG9pbnRlckJpbmRpbmcgPSBmYWxzZTsKICAgTExWTVN0eWxlLkV4cGVyaW1lbnRhbEF1dG9EZXRlY3RCaW5QYWNraW5nID0gZmFsc2U7CisgIExMVk1TdHlsZS5Gb3JFYWNoTWFjcm9zLnB1c2hfYmFjaygiZm9yZWFjaCIpOworICBMTFZNU3R5bGUuRm9yRWFjaE1hY3Jvcy5wdXNoX2JhY2soIlFfRk9SRUFDSCIpOworICBMTFZNU3R5bGUuRm9yRWFjaE1hY3Jvcy5wdXNoX2JhY2soIkJPT1NUX0ZPUkVBQ0giKTsKICAgTExWTVN0eWxlLkluZGVudENhc2VMYWJlbHMgPSBmYWxzZTsKICAgTExWTVN0eWxlLkluZGVudEZ1bmN0aW9uRGVjbGFyYXRpb25BZnRlclR5cGUgPSBmYWxzZTsKICAgTExWTVN0eWxlLkluZGVudFdpZHRoID0gMjsKICAgTExWTVN0eWxlLlRhYldpZHRoID0gODsKICAgTExWTVN0eWxlLk1heEVtcHR5TGluZXNUb0tlZXAgPSAxOworICBMTFZNU3R5bGUuS2VlcEVtcHR5TGluZXNBdFRoZVN0YXJ0T2ZCbG9ja3MgPSB0cnVlOwogICBMTFZNU3R5bGUuTmFtZXNwYWNlSW5kZW50YXRpb24gPSBGb3JtYXRTdHlsZTo6TklfTm9uZTsKKyAgTExWTVN0eWxlLk9iakNTcGFjZUFmdGVyUHJvcGVydHkgPSBmYWxzZTsKICAgTExWTVN0eWxlLk9iakNTcGFjZUJlZm9yZVByb3RvY29sTGlzdCA9IHRydWU7CiAgIExMVk1TdHlsZS5Qb2ludGVyQmluZHNUb1R5cGUgPSBmYWxzZTsKICAgTExWTVN0eWxlLlNwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHMgPSAxOwotICBMTFZNU3R5bGUuU3RhbmRhcmQgPSBGb3JtYXRTdHlsZTo6TFNfQ3BwMDM7CisgIExMVk1TdHlsZS5TdGFuZGFyZCA9IEZvcm1hdFN0eWxlOjpMU19DcHAxMTsKICAgTExWTVN0eWxlLlVzZVRhYiA9IEZvcm1hdFN0eWxlOjpVVF9OZXZlcjsKICAgTExWTVN0eWxlLlNwYWNlc0luUGFyZW50aGVzZXMgPSBmYWxzZTsKICAgTExWTVN0eWxlLlNwYWNlSW5FbXB0eVBhcmVudGhlc2VzID0gZmFsc2U7CisgIExMVk1TdHlsZS5TcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzID0gdHJ1ZTsKICAgTExWTVN0eWxlLlNwYWNlc0luQ1N0eWxlQ2FzdFBhcmVudGhlc2VzID0gZmFsc2U7Ci0gIExMVk1TdHlsZS5TcGFjZUFmdGVyQ29udHJvbFN0YXRlbWVudEtleXdvcmQgPSB0cnVlOworICBMTFZNU3R5bGUuU3BhY2VCZWZvcmVQYXJlbnMgPSBGb3JtYXRTdHlsZTo6U0JQT19Db250cm9sU3RhdGVtZW50czsKICAgTExWTVN0eWxlLlNwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9ycyA9IHRydWU7Ci0gIExMVk1TdHlsZS5Db250aW51YXRpb25JbmRlbnRXaWR0aCA9IDQ7CiAgIExMVk1TdHlsZS5TcGFjZXNJbkFuZ2xlcyA9IGZhbHNlOwogCi0gIHNldERlZmF1bHRQZW5hbHRpZXMoTExWTVN0eWxlKTsKKyAgTExWTVN0eWxlLlBlbmFsdHlCcmVha0NvbW1lbnQgPSAzMDA7CisgIExMVk1TdHlsZS5QZW5hbHR5QnJlYWtGaXJzdExlc3NMZXNzID0gMTIwOworICBMTFZNU3R5bGUuUGVuYWx0eUJyZWFrU3RyaW5nID0gMTAwMDsKKyAgTExWTVN0eWxlLlBlbmFsdHlFeGNlc3NDaGFyYWN0ZXIgPSAxMDAwMDAwOwogICBMTFZNU3R5bGUuUGVuYWx0eVJldHVyblR5cGVPbkl0c093bkxpbmUgPSA2MDsKICAgTExWTVN0eWxlLlBlbmFsdHlCcmVha0JlZm9yZUZpcnN0Q2FsbFBhcmFtZXRlciA9IDE5OwogCiAgIHJldHVybiBMTFZNU3R5bGU7CiB9CiAKLUZvcm1hdFN0eWxlIGdldEdvb2dsZVN0eWxlKCkgewotICBGb3JtYXRTdHlsZSBHb29nbGVTdHlsZTsKK0Zvcm1hdFN0eWxlIGdldEdvb2dsZVN0eWxlKEZvcm1hdFN0eWxlOjpMYW5ndWFnZUtpbmQgTGFuZ3VhZ2UpIHsKKyAgRm9ybWF0U3R5bGUgR29vZ2xlU3R5bGUgPSBnZXRMTFZNU3R5bGUoKTsKKyAgR29vZ2xlU3R5bGUuTGFuZ3VhZ2UgPSBMYW5ndWFnZTsKKwogICBHb29nbGVTdHlsZS5BY2Nlc3NNb2RpZmllck9mZnNldCA9IC0xOwogICBHb29nbGVTdHlsZS5BbGlnbkVzY2FwZWROZXdsaW5lc0xlZnQgPSB0cnVlOwotICBHb29nbGVTdHlsZS5BbGlnblRyYWlsaW5nQ29tbWVudHMgPSB0cnVlOwotICBHb29nbGVTdHlsZS5BbGxvd0FsbFBhcmFtZXRlcnNPZkRlY2xhcmF0aW9uT25OZXh0TGluZSA9IHRydWU7CiAgIEdvb2dsZVN0eWxlLkFsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lID0gdHJ1ZTsKICAgR29vZ2xlU3R5bGUuQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZSA9IHRydWU7CiAgIEdvb2dsZVN0eWxlLkFsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5ncyA9IHRydWU7CiAgIEdvb2dsZVN0eWxlLkFsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnMgPSB0cnVlOwotICBHb29nbGVTdHlsZS5CaW5QYWNrUGFyYW1ldGVycyA9IHRydWU7Ci0gIEdvb2dsZVN0eWxlLkJyZWFrQmVmb3JlQmluYXJ5T3BlcmF0b3JzID0gZmFsc2U7Ci0gIEdvb2dsZVN0eWxlLkJyZWFrQmVmb3JlVGVybmFyeU9wZXJhdG9ycyA9IHRydWU7Ci0gIEdvb2dsZVN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID0gRm9ybWF0U3R5bGU6OkJTX0F0dGFjaDsKLSAgR29vZ2xlU3R5bGUuQnJlYWtDb25zdHJ1Y3RvckluaXRpYWxpemVyc0JlZm9yZUNvbW1hID0gZmFsc2U7Ci0gIEdvb2dsZVN0eWxlLkNvbHVtbkxpbWl0ID0gODA7CiAgIEdvb2dsZVN0eWxlLkNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJBbGxPbk9uZUxpbmVPck9uZVBlckxpbmUgPSB0cnVlOwotICBHb29nbGVTdHlsZS5Db25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGggPSA0OwotICBHb29nbGVTdHlsZS5DcHAxMUJyYWNlZExpc3RTdHlsZSA9IHRydWU7CiAgIEdvb2dsZVN0eWxlLkRlcml2ZVBvaW50ZXJCaW5kaW5nID0gdHJ1ZTsKLSAgR29vZ2xlU3R5bGUuRXhwZXJpbWVudGFsQXV0b0RldGVjdEJpblBhY2tpbmcgPSBmYWxzZTsKICAgR29vZ2xlU3R5bGUuSW5kZW50Q2FzZUxhYmVscyA9IHRydWU7CiAgIEdvb2dsZVN0eWxlLkluZGVudEZ1bmN0aW9uRGVjbGFyYXRpb25BZnRlclR5cGUgPSB0cnVlOwotICBHb29nbGVTdHlsZS5JbmRlbnRXaWR0aCA9IDI7Ci0gIEdvb2dsZVN0eWxlLlRhYldpZHRoID0gODsKLSAgR29vZ2xlU3R5bGUuTWF4RW1wdHlMaW5lc1RvS2VlcCA9IDE7Ci0gIEdvb2dsZVN0eWxlLk5hbWVzcGFjZUluZGVudGF0aW9uID0gRm9ybWF0U3R5bGU6Ok5JX05vbmU7CisgIEdvb2dsZVN0eWxlLktlZXBFbXB0eUxpbmVzQXRUaGVTdGFydE9mQmxvY2tzID0gZmFsc2U7CisgIEdvb2dsZVN0eWxlLk9iakNTcGFjZUFmdGVyUHJvcGVydHkgPSBmYWxzZTsKICAgR29vZ2xlU3R5bGUuT2JqQ1NwYWNlQmVmb3JlUHJvdG9jb2xMaXN0ID0gZmFsc2U7CiAgIEdvb2dsZVN0eWxlLlBvaW50ZXJCaW5kc1RvVHlwZSA9IHRydWU7CiAgIEdvb2dsZVN0eWxlLlNwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHMgPSAyOwogICBHb29nbGVTdHlsZS5TdGFuZGFyZCA9IEZvcm1hdFN0eWxlOjpMU19BdXRvOwotICBHb29nbGVTdHlsZS5Vc2VUYWIgPSBGb3JtYXRTdHlsZTo6VVRfTmV2ZXI7Ci0gIEdvb2dsZVN0eWxlLlNwYWNlc0luUGFyZW50aGVzZXMgPSBmYWxzZTsKLSAgR29vZ2xlU3R5bGUuU3BhY2VJbkVtcHR5UGFyZW50aGVzZXMgPSBmYWxzZTsKLSAgR29vZ2xlU3R5bGUuU3BhY2VzSW5DU3R5bGVDYXN0UGFyZW50aGVzZXMgPSBmYWxzZTsKLSAgR29vZ2xlU3R5bGUuU3BhY2VBZnRlckNvbnRyb2xTdGF0ZW1lbnRLZXl3b3JkID0gdHJ1ZTsKLSAgR29vZ2xlU3R5bGUuU3BhY2VCZWZvcmVBc3NpZ25tZW50T3BlcmF0b3JzID0gdHJ1ZTsKLSAgR29vZ2xlU3R5bGUuQ29udGludWF0aW9uSW5kZW50V2lkdGggPSA0OwotICBHb29nbGVTdHlsZS5TcGFjZXNJbkFuZ2xlcyA9IGZhbHNlOwogCi0gIHNldERlZmF1bHRQZW5hbHRpZXMoR29vZ2xlU3R5bGUpOwogICBHb29nbGVTdHlsZS5QZW5hbHR5UmV0dXJuVHlwZU9uSXRzT3duTGluZSA9IDIwMDsKICAgR29vZ2xlU3R5bGUuUGVuYWx0eUJyZWFrQmVmb3JlRmlyc3RDYWxsUGFyYW1ldGVyID0gMTsKIAorICBpZiAoTGFuZ3VhZ2UgPT0gRm9ybWF0U3R5bGU6OkxLX0phdmFTY3JpcHQpIHsKKyAgICBHb29nbGVTdHlsZS5CcmVha0JlZm9yZVRlcm5hcnlPcGVyYXRvcnMgPSBmYWxzZTsKKyAgICBHb29nbGVTdHlsZS5NYXhFbXB0eUxpbmVzVG9LZWVwID0gMjsKKyAgICBHb29nbGVTdHlsZS5TcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzID0gZmFsc2U7CisgIH0gZWxzZSBpZiAoTGFuZ3VhZ2UgPT0gRm9ybWF0U3R5bGU6OkxLX1Byb3RvKSB7CisgICAgR29vZ2xlU3R5bGUuQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmUgPSBmYWxzZTsKKyAgfQorCiAgIHJldHVybiBHb29nbGVTdHlsZTsKIH0KIAotRm9ybWF0U3R5bGUgZ2V0Q2hyb21pdW1TdHlsZSgpIHsKLSAgRm9ybWF0U3R5bGUgQ2hyb21pdW1TdHlsZSA9IGdldEdvb2dsZVN0eWxlKCk7CitGb3JtYXRTdHlsZSBnZXRDaHJvbWl1bVN0eWxlKEZvcm1hdFN0eWxlOjpMYW5ndWFnZUtpbmQgTGFuZ3VhZ2UpIHsKKyAgRm9ybWF0U3R5bGUgQ2hyb21pdW1TdHlsZSA9IGdldEdvb2dsZVN0eWxlKExhbmd1YWdlKTsKICAgQ2hyb21pdW1TdHlsZS5BbGxvd0FsbFBhcmFtZXRlcnNPZkRlY2xhcmF0aW9uT25OZXh0TGluZSA9IGZhbHNlOwogICBDaHJvbWl1bVN0eWxlLkFsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lID0gZmFsc2U7CiAgIENocm9taXVtU3R5bGUuQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZSA9IGZhbHNlOwpAQCAtMjkyLDEyICszNTIsMTUgQEAKIEZvcm1hdFN0eWxlIGdldE1vemlsbGFTdHlsZSgpIHsKICAgRm9ybWF0U3R5bGUgTW96aWxsYVN0eWxlID0gZ2V0TExWTVN0eWxlKCk7CiAgIE1vemlsbGFTdHlsZS5BbGxvd0FsbFBhcmFtZXRlcnNPZkRlY2xhcmF0aW9uT25OZXh0TGluZSA9IGZhbHNlOworICBNb3ppbGxhU3R5bGUuQ3BwMTFCcmFjZWRMaXN0U3R5bGUgPSBmYWxzZTsKICAgTW96aWxsYVN0eWxlLkNvbnN0cnVjdG9ySW5pdGlhbGl6ZXJBbGxPbk9uZUxpbmVPck9uZVBlckxpbmUgPSB0cnVlOwogICBNb3ppbGxhU3R5bGUuRGVyaXZlUG9pbnRlckJpbmRpbmcgPSB0cnVlOwogICBNb3ppbGxhU3R5bGUuSW5kZW50Q2FzZUxhYmVscyA9IHRydWU7CisgIE1vemlsbGFTdHlsZS5PYmpDU3BhY2VBZnRlclByb3BlcnR5ID0gdHJ1ZTsKICAgTW96aWxsYVN0eWxlLk9iakNTcGFjZUJlZm9yZVByb3RvY29sTGlzdCA9IGZhbHNlOwogICBNb3ppbGxhU3R5bGUuUGVuYWx0eVJldHVyblR5cGVPbkl0c093bkxpbmUgPSAyMDA7CiAgIE1vemlsbGFTdHlsZS5Qb2ludGVyQmluZHNUb1R5cGUgPSB0cnVlOworICBNb3ppbGxhU3R5bGUuU3RhbmRhcmQgPSBGb3JtYXRTdHlsZTo6TFNfQ3BwMDM7CiAgIHJldHVybiBNb3ppbGxhU3R5bGU7CiB9CiAKQEAgLTMwOCwzNiArMzcxLDk0IEBACiAgIFN0eWxlLkJyZWFrQmVmb3JlQmluYXJ5T3BlcmF0b3JzID0gdHJ1ZTsKICAgU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPSBGb3JtYXRTdHlsZTo6QlNfU3Ryb3VzdHJ1cDsKICAgU3R5bGUuQnJlYWtDb25zdHJ1Y3RvckluaXRpYWxpemVyc0JlZm9yZUNvbW1hID0gdHJ1ZTsKKyAgU3R5bGUuQ3BwMTFCcmFjZWRMaXN0U3R5bGUgPSBmYWxzZTsKICAgU3R5bGUuQ29sdW1uTGltaXQgPSAwOwogICBTdHlsZS5JbmRlbnRXaWR0aCA9IDQ7CiAgIFN0eWxlLk5hbWVzcGFjZUluZGVudGF0aW9uID0gRm9ybWF0U3R5bGU6Ok5JX0lubmVyOworICBTdHlsZS5PYmpDU3BhY2VBZnRlclByb3BlcnR5ID0gdHJ1ZTsKICAgU3R5bGUuUG9pbnRlckJpbmRzVG9UeXBlID0gdHJ1ZTsKKyAgU3R5bGUuU3RhbmRhcmQgPSBGb3JtYXRTdHlsZTo6TFNfQ3BwMDM7CiAgIHJldHVybiBTdHlsZTsKIH0KIAotYm9vbCBnZXRQcmVkZWZpbmVkU3R5bGUoU3RyaW5nUmVmIE5hbWUsIEZvcm1hdFN0eWxlICpTdHlsZSkgewotICBpZiAoTmFtZS5lcXVhbHNfbG93ZXIoImxsdm0iKSkKLSAgICAqU3R5bGUgPSBnZXRMTFZNU3R5bGUoKTsKLSAgZWxzZSBpZiAoTmFtZS5lcXVhbHNfbG93ZXIoImNocm9taXVtIikpCi0gICAgKlN0eWxlID0gZ2V0Q2hyb21pdW1TdHlsZSgpOwotICBlbHNlIGlmIChOYW1lLmVxdWFsc19sb3dlcigibW96aWxsYSIpKQotICAgICpTdHlsZSA9IGdldE1vemlsbGFTdHlsZSgpOwotICBlbHNlIGlmIChOYW1lLmVxdWFsc19sb3dlcigiZ29vZ2xlIikpCi0gICAgKlN0eWxlID0gZ2V0R29vZ2xlU3R5bGUoKTsKLSAgZWxzZSBpZiAoTmFtZS5lcXVhbHNfbG93ZXIoIndlYmtpdCIpKQotICAgICpTdHlsZSA9IGdldFdlYktpdFN0eWxlKCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7CitGb3JtYXRTdHlsZSBnZXRHTlVTdHlsZSgpIHsKKyAgRm9ybWF0U3R5bGUgU3R5bGUgPSBnZXRMTFZNU3R5bGUoKTsKKyAgU3R5bGUuQnJlYWtCZWZvcmVCaW5hcnlPcGVyYXRvcnMgPSB0cnVlOworICBTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyA9IEZvcm1hdFN0eWxlOjpCU19HTlU7CisgIFN0eWxlLkJyZWFrQmVmb3JlVGVybmFyeU9wZXJhdG9ycyA9IHRydWU7CisgIFN0eWxlLkNwcDExQnJhY2VkTGlzdFN0eWxlID0gZmFsc2U7CisgIFN0eWxlLkNvbHVtbkxpbWl0ID0gNzk7CisgIFN0eWxlLlNwYWNlQmVmb3JlUGFyZW5zID0gRm9ybWF0U3R5bGU6OlNCUE9fQWx3YXlzOworICBTdHlsZS5TdGFuZGFyZCA9IEZvcm1hdFN0eWxlOjpMU19DcHAwMzsKKyAgcmV0dXJuIFN0eWxlOworfQogCitib29sIGdldFByZWRlZmluZWRTdHlsZShTdHJpbmdSZWYgTmFtZSwgRm9ybWF0U3R5bGU6Okxhbmd1YWdlS2luZCBMYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFN0eWxlICpTdHlsZSkgeworICBpZiAoTmFtZS5lcXVhbHNfbG93ZXIoImxsdm0iKSkgeworICAgICpTdHlsZSA9IGdldExMVk1TdHlsZSgpOworICB9IGVsc2UgaWYgKE5hbWUuZXF1YWxzX2xvd2VyKCJjaHJvbWl1bSIpKSB7CisgICAgKlN0eWxlID0gZ2V0Q2hyb21pdW1TdHlsZShMYW5ndWFnZSk7CisgIH0gZWxzZSBpZiAoTmFtZS5lcXVhbHNfbG93ZXIoIm1vemlsbGEiKSkgeworICAgICpTdHlsZSA9IGdldE1vemlsbGFTdHlsZSgpOworICB9IGVsc2UgaWYgKE5hbWUuZXF1YWxzX2xvd2VyKCJnb29nbGUiKSkgeworICAgICpTdHlsZSA9IGdldEdvb2dsZVN0eWxlKExhbmd1YWdlKTsKKyAgfSBlbHNlIGlmIChOYW1lLmVxdWFsc19sb3dlcigid2Via2l0IikpIHsKKyAgICAqU3R5bGUgPSBnZXRXZWJLaXRTdHlsZSgpOworICB9IGVsc2UgaWYgKE5hbWUuZXF1YWxzX2xvd2VyKCJnbnUiKSkgeworICAgICpTdHlsZSA9IGdldEdOVVN0eWxlKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU3R5bGUtPkxhbmd1YWdlID0gTGFuZ3VhZ2U7CiAgIHJldHVybiB0cnVlOwogfQogCiBsbHZtOjplcnJvcl9jb2RlIHBhcnNlQ29uZmlndXJhdGlvbihTdHJpbmdSZWYgVGV4dCwgRm9ybWF0U3R5bGUgKlN0eWxlKSB7CisgIGFzc2VydChTdHlsZSk7CisgIEZvcm1hdFN0eWxlOjpMYW5ndWFnZUtpbmQgTGFuZ3VhZ2UgPSBTdHlsZS0+TGFuZ3VhZ2U7CisgIGFzc2VydChMYW5ndWFnZSAhPSBGb3JtYXRTdHlsZTo6TEtfTm9uZSk7CiAgIGlmIChUZXh0LnRyaW0oKS5lbXB0eSgpKQogICAgIHJldHVybiBsbHZtOjptYWtlX2Vycm9yX2NvZGUobGx2bTo6ZXJyYzo6aW52YWxpZF9hcmd1bWVudCk7CisKKyAgc3RkOjp2ZWN0b3I8Rm9ybWF0U3R5bGU+IFN0eWxlczsKICAgbGx2bTo6eWFtbDo6SW5wdXQgSW5wdXQoVGV4dCk7Ci0gIElucHV0ID4+ICpTdHlsZTsKLSAgcmV0dXJuIElucHV0LmVycm9yKCk7CisgIC8vIERvY3VtZW50TGlzdFRyYWl0czx2ZWN0b3I8Rm9ybWF0U3R5bGU+PiB1c2VzIHRoZSBjb250ZXh0IHRvIGdldCBkZWZhdWx0CisgIC8vIHZhbHVlcyBmb3IgdGhlIGZpZWxkcywga2V5cyBmb3Igd2hpY2ggYXJlIG1pc3NpbmcgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KKyAgLy8gTWFwcGluZyBhbHNvIHVzZXMgdGhlIGNvbnRleHQgdG8gZ2V0IHRoZSBsYW5ndWFnZSB0byBmaW5kIHRoZSBjb3JyZWN0CisgIC8vIGJhc2Ugc3R5bGUuCisgIElucHV0LnNldENvbnRleHQoU3R5bGUpOworICBJbnB1dCA+PiBTdHlsZXM7CisgIGlmIChJbnB1dC5lcnJvcigpKQorICAgIHJldHVybiBJbnB1dC5lcnJvcigpOworCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBTdHlsZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAvLyBFbnN1cmVzIHRoYXQgb25seSB0aGUgZmlyc3QgY29uZmlndXJhdGlvbiBjYW4gc2tpcCB0aGUgTGFuZ3VhZ2Ugb3B0aW9uLgorICAgIGlmIChTdHlsZXNbaV0uTGFuZ3VhZ2UgPT0gRm9ybWF0U3R5bGU6OkxLX05vbmUgJiYgaSAhPSAwKQorICAgICAgcmV0dXJuIGxsdm06Om1ha2VfZXJyb3JfY29kZShsbHZtOjplcnJjOjppbnZhbGlkX2FyZ3VtZW50KTsKKyAgICAvLyBFbnN1cmUgdGhhdCBlYWNoIGxhbmd1YWdlIGlzIGNvbmZpZ3VyZWQgYXQgbW9zdCBvbmNlLgorICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBpOyArK2opIHsKKyAgICAgIGlmIChTdHlsZXNbaV0uTGFuZ3VhZ2UgPT0gU3R5bGVzW2pdLkxhbmd1YWdlKSB7CisgICAgICAgIERFQlVHKGxsdm06OmRiZ3MoKQorICAgICAgICAgICAgICA8PCAiRHVwbGljYXRlIGxhbmd1YWdlcyBpbiB0aGUgY29uZmlnIGZpbGUgb24gcG9zaXRpb25zICIgPDwgagorICAgICAgICAgICAgICA8PCAiIGFuZCAiIDw8IGkgPDwgIlxuIik7CisgICAgICAgIHJldHVybiBsbHZtOjptYWtlX2Vycm9yX2NvZGUobGx2bTo6ZXJyYzo6aW52YWxpZF9hcmd1bWVudCk7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIExvb2sgZm9yIGEgc3VpdGFibGUgY29uZmlndXJhdGlvbiBzdGFydGluZyBmcm9tIHRoZSBlbmQsIHNvIHdlIGNhbgorICAvLyBmaW5kIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZmlyc3QsIGFuZCB0aGUgZGVmYXVsdAorICAvLyBjb25maWd1cmF0aW9uICh3aGljaCBjYW4gb25seSBiZSBhdCBzbG90IDApIGFmdGVyIGl0LgorICBmb3IgKGludCBpID0gU3R5bGVzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgaWYgKFN0eWxlc1tpXS5MYW5ndWFnZSA9PSBMYW5ndWFnZSB8fAorICAgICAgICBTdHlsZXNbaV0uTGFuZ3VhZ2UgPT0gRm9ybWF0U3R5bGU6OkxLX05vbmUpIHsKKyAgICAgICpTdHlsZSA9IFN0eWxlc1tpXTsKKyAgICAgIFN0eWxlLT5MYW5ndWFnZSA9IExhbmd1YWdlOworICAgICAgcmV0dXJuIGxsdm06Om1ha2VfZXJyb3JfY29kZShsbHZtOjplcnJjOjpzdWNjZXNzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGxsdm06Om1ha2VfZXJyb3JfY29kZShsbHZtOjplcnJjOjpub3Rfc3VwcG9ydGVkKTsKIH0KIAogc3RkOjpzdHJpbmcgY29uZmlndXJhdGlvbkFzVGV4dChjb25zdCBGb3JtYXRTdHlsZSAmU3R5bGUpIHsKQEAgLTM4MSwxNCArNTAyLDE0IEBACiAgIC8vLyBcYnJpZWYgQ2FsY3VsYXRlcyBob3cgbWFueSBsaW5lcyBjYW4gYmUgbWVyZ2VkIGludG8gMSBzdGFydGluZyBhdCBccCBJLgogICB1bnNpZ25lZAogICB0cnlGaXRNdWx0aXBsZUxpbmVzSW5PbmUodW5zaWduZWQgSW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEFubm90YXRlZExpbmUgKj46OmNvbnN0X2l0ZXJhdG9yICZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEFubm90YXRlZExpbmUgKj46OmNvbnN0X2l0ZXJhdG9yIEksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8QW5ub3RhdGVkTGluZSAqPjo6Y29uc3RfaXRlcmF0b3IgRSkgewogICAgIC8vIFdlIGNhbiBuZXZlciBtZXJnZSBzdHVmZiBpZiB0aGVyZSBhcmUgdHJhaWxpbmcgbGluZSBjb21tZW50cy4KLSAgICBBbm5vdGF0ZWRMaW5lICpUaGVMaW5lID0gKkk7CisgICAgY29uc3QgQW5ub3RhdGVkTGluZSAqVGhlTGluZSA9ICpJOwogICAgIGlmIChUaGVMaW5lLT5MYXN0LT5UeXBlID09IFRUX0xpbmVDb21tZW50KQogICAgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAoSW5kZW50ID4gU3R5bGUuQ29sdW1uTGltaXQpCisgICAgaWYgKFN0eWxlLkNvbHVtbkxpbWl0ID4gMCAmJiBJbmRlbnQgPiBTdHlsZS5Db2x1bW5MaW1pdCkKICAgICAgIHJldHVybiAwOwogCiAgICAgdW5zaWduZWQgTGltaXQgPQpAQCAtNDAyLDE2ICs1MjMsNDYgQEAKICAgICBpZiAoSSArIDEgPT0gRSB8fCBJWzFdLT5UeXBlID09IExUX0ludmFsaWQpCiAgICAgICByZXR1cm4gMDsKIAorICAgIGlmIChUaGVMaW5lLT5MYXN0LT5UeXBlID09IFRUX0Z1bmN0aW9uTEJyYWNlICYmCisgICAgICAgIFRoZUxpbmUtPkZpcnN0ICE9IFRoZUxpbmUtPkxhc3QpIHsKKyAgICAgIHJldHVybiBTdHlsZS5BbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZQorICAgICAgICAgICAgICAgICA/IHRyeU1lcmdlU2ltcGxlQmxvY2soSSwgRSwgTGltaXQpCisgICAgICAgICAgICAgICAgIDogMDsKKyAgICB9CiAgICAgaWYgKFRoZUxpbmUtPkxhc3QtPmlzKHRvazo6bF9icmFjZSkpIHsKLSAgICAgIHJldHVybiB0cnlNZXJnZVNpbXBsZUJsb2NrKEksIEUsIExpbWl0KTsKLSAgICB9IGVsc2UgaWYgKFN0eWxlLkFsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lICYmCi0gICAgICAgICAgICAgICBUaGVMaW5lLT5GaXJzdC0+aXModG9rOjprd19pZikpIHsKLSAgICAgIHJldHVybiB0cnlNZXJnZVNpbXBsZUNvbnRyb2xTdGF0ZW1lbnQoSSwgRSwgTGltaXQpOwotICAgIH0gZWxzZSBpZiAoU3R5bGUuQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZSAmJgotICAgICAgICAgICAgICAgVGhlTGluZS0+Rmlyc3QtPmlzT25lT2YodG9rOjprd19mb3IsIHRvazo6a3dfd2hpbGUpKSB7Ci0gICAgICByZXR1cm4gdHJ5TWVyZ2VTaW1wbGVDb250cm9sU3RhdGVtZW50KEksIEUsIExpbWl0KTsKLSAgICB9IGVsc2UgaWYgKFRoZUxpbmUtPkluUFBEaXJlY3RpdmUgJiYgKFRoZUxpbmUtPkZpcnN0LT5IYXNVbmVzY2FwZWROZXdsaW5lIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVMaW5lLT5GaXJzdC0+SXNGaXJzdCkpIHsKKyAgICAgIHJldHVybiBTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyA9PSBGb3JtYXRTdHlsZTo6QlNfQXR0YWNoCisgICAgICAgICAgICAgICAgID8gdHJ5TWVyZ2VTaW1wbGVCbG9jayhJLCBFLCBMaW1pdCkKKyAgICAgICAgICAgICAgICAgOiAwOworICAgIH0KKyAgICBpZiAoSVsxXS0+Rmlyc3QtPlR5cGUgPT0gVFRfRnVuY3Rpb25MQnJhY2UgJiYKKyAgICAgICAgU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgIT0gRm9ybWF0U3R5bGU6OkJTX0F0dGFjaCkgeworICAgICAgLy8gQ2hlY2sgZm9yIExpbWl0IDw9IDIgdG8gYWNjb3VudCBmb3IgdGhlICIgeyIuCisgICAgICBpZiAoTGltaXQgPD0gMiB8fCAoU3R5bGUuQ29sdW1uTGltaXQgPT0gMCAmJiBjb250YWluc011c3RCcmVhayhUaGVMaW5lKSkpCisgICAgICAgIHJldHVybiAwOworICAgICAgTGltaXQgLT0gMjsKKworICAgICAgdW5zaWduZWQgTWVyZ2VkTGluZXMgPSAwOworICAgICAgaWYgKFN0eWxlLkFsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lKSB7CisgICAgICAgIE1lcmdlZExpbmVzID0gdHJ5TWVyZ2VTaW1wbGVCbG9jayhJICsgMSwgRSwgTGltaXQpOworICAgICAgICAvLyBJZiB3ZSBtYW5hZ2VkIHRvIG1lcmdlIHRoZSBibG9jaywgY291bnQgdGhlIGZ1bmN0aW9uIGhlYWRlciwgd2hpY2ggaXMKKyAgICAgICAgLy8gb24gYSBzZXBhcmF0ZSBsaW5lLgorICAgICAgICBpZiAoTWVyZ2VkTGluZXMgPiAwKQorICAgICAgICAgICsrTWVyZ2VkTGluZXM7CisgICAgICB9CisgICAgICByZXR1cm4gTWVyZ2VkTGluZXM7CisgICAgfQorICAgIGlmIChUaGVMaW5lLT5GaXJzdC0+aXModG9rOjprd19pZikpIHsKKyAgICAgIHJldHVybiBTdHlsZS5BbGxvd1Nob3J0SWZTdGF0ZW1lbnRzT25BU2luZ2xlTGluZQorICAgICAgICAgICAgICAgICA/IHRyeU1lcmdlU2ltcGxlQ29udHJvbFN0YXRlbWVudChJLCBFLCBMaW1pdCkKKyAgICAgICAgICAgICAgICAgOiAwOworICAgIH0KKyAgICBpZiAoVGhlTGluZS0+Rmlyc3QtPmlzT25lT2YodG9rOjprd19mb3IsIHRvazo6a3dfd2hpbGUpKSB7CisgICAgICByZXR1cm4gU3R5bGUuQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZQorICAgICAgICAgICAgICAgICA/IHRyeU1lcmdlU2ltcGxlQ29udHJvbFN0YXRlbWVudChJLCBFLCBMaW1pdCkKKyAgICAgICAgICAgICAgICAgOiAwOworICAgIH0KKyAgICBpZiAoVGhlTGluZS0+SW5QUERpcmVjdGl2ZSAmJgorICAgICAgICAoVGhlTGluZS0+Rmlyc3QtPkhhc1VuZXNjYXBlZE5ld2xpbmUgfHwgVGhlTGluZS0+Rmlyc3QtPklzRmlyc3QpKSB7CiAgICAgICByZXR1cm4gdHJ5TWVyZ2VTaW1wbGVQUERpcmVjdGl2ZShJLCBFLCBMaW1pdCk7CiAgICAgfQogICAgIHJldHVybiAwOwpAQCAtNDE5LDcgKzU3MCw3IEBACiAKIHByaXZhdGU6CiAgIHVuc2lnbmVkCi0gIHRyeU1lcmdlU2ltcGxlUFBEaXJlY3RpdmUoU21hbGxWZWN0b3JJbXBsPEFubm90YXRlZExpbmUgKj46OmNvbnN0X2l0ZXJhdG9yICZJLAorICB0cnlNZXJnZVNpbXBsZVBQRGlyZWN0aXZlKFNtYWxsVmVjdG9ySW1wbDxBbm5vdGF0ZWRMaW5lICo+Ojpjb25zdF9pdGVyYXRvciBJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxBbm5vdGF0ZWRMaW5lICo+Ojpjb25zdF9pdGVyYXRvciBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbWl0KSB7CiAgICAgaWYgKExpbWl0ID09IDApCkBAIC00MzQsMjMgKzU4NSwyNSBAQAogICB9CiAKICAgdW5zaWduZWQgdHJ5TWVyZ2VTaW1wbGVDb250cm9sU3RhdGVtZW50KAotICAgICAgU21hbGxWZWN0b3JJbXBsPEFubm90YXRlZExpbmUgKj46OmNvbnN0X2l0ZXJhdG9yICZJLAorICAgICAgU21hbGxWZWN0b3JJbXBsPEFubm90YXRlZExpbmUgKj46OmNvbnN0X2l0ZXJhdG9yIEksCiAgICAgICBTbWFsbFZlY3RvckltcGw8QW5ub3RhdGVkTGluZSAqPjo6Y29uc3RfaXRlcmF0b3IgRSwgdW5zaWduZWQgTGltaXQpIHsKICAgICBpZiAoTGltaXQgPT0gMCkKICAgICAgIHJldHVybiAwOwotICAgIGlmIChTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyA9PSBGb3JtYXRTdHlsZTo6QlNfQWxsbWFuICYmCisgICAgaWYgKChTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyA9PSBGb3JtYXRTdHlsZTo6QlNfQWxsbWFuIHx8CisgICAgICAgICBTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyA9PSBGb3JtYXRTdHlsZTo6QlNfR05VKSAmJgogICAgICAgICBJWzFdLT5GaXJzdC0+aXModG9rOjpsX2JyYWNlKSkKICAgICAgIHJldHVybiAwOwogICAgIGlmIChJWzFdLT5JblBQRGlyZWN0aXZlICE9ICgqSSktPkluUFBEaXJlY3RpdmUgfHwKICAgICAgICAgKElbMV0tPkluUFBEaXJlY3RpdmUgJiYgSVsxXS0+Rmlyc3QtPkhhc1VuZXNjYXBlZE5ld2xpbmUpKQogICAgICAgcmV0dXJuIDA7CisgICAgTGltaXQgPSBsaW1pdENvbnNpZGVyaW5nTWFjcm9zKEkgKyAxLCBFLCBMaW1pdCk7CiAgICAgQW5ub3RhdGVkTGluZSAmTGluZSA9ICoqSTsKICAgICBpZiAoTGluZS5MYXN0LT5pc05vdCh0b2s6OnJfcGFyZW4pKQogICAgICAgcmV0dXJuIDA7CiAgICAgaWYgKDEgKyBJWzFdLT5MYXN0LT5Ub3RhbExlbmd0aCA+IExpbWl0KQogICAgICAgcmV0dXJuIDA7CiAgICAgaWYgKElbMV0tPkZpcnN0LT5pc09uZU9mKHRvazo6c2VtaSwgdG9rOjprd19pZiwgdG9rOjprd19mb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6a3dfd2hpbGUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6a3dfd2hpbGUpIHx8CiAgICAgICAgIElbMV0tPkZpcnN0LT5UeXBlID09IFRUX0xpbmVDb21tZW50KQogICAgICAgcmV0dXJuIDA7CiAgICAgLy8gT25seSBpbmxpbmUgc2ltcGxlIGlmJ3MgKG5vIG5lc3RlZCBpZiBvciBlbHNlKS4KQEAgLTQ2MSwxMyArNjE0LDkgQEAKICAgfQogCiAgIHVuc2lnbmVkCi0gIHRyeU1lcmdlU2ltcGxlQmxvY2soU21hbGxWZWN0b3JJbXBsPEFubm90YXRlZExpbmUgKj46OmNvbnN0X2l0ZXJhdG9yICZJLAorICB0cnlNZXJnZVNpbXBsZUJsb2NrKFNtYWxsVmVjdG9ySW1wbDxBbm5vdGF0ZWRMaW5lICo+Ojpjb25zdF9pdGVyYXRvciBJLAogICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxBbm5vdGF0ZWRMaW5lICo+Ojpjb25zdF9pdGVyYXRvciBFLAogICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbWl0KSB7Ci0gICAgLy8gTm8gbWVyZ2luZyBpZiB0aGUgYnJhY2UgYWxyZWFkeSBpcyBvbiB0aGUgbmV4dCBsaW5lLgotICAgIGlmIChTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyAhPSBGb3JtYXRTdHlsZTo6QlNfQXR0YWNoKQotICAgICAgcmV0dXJuIDA7Ci0KICAgICAvLyBGaXJzdCwgY2hlY2sgdGhhdCB0aGUgY3VycmVudCBsaW5lIGFsbG93cyBtZXJnaW5nLiBUaGlzIGlzIHRoZSBjYXNlIGlmCiAgICAgLy8gd2UncmUgbm90IGluIGEgY29udHJvbCBmbG93IHN0YXRlbWVudCBhbmQgdGhlIGxhc3QgdG9rZW4gaXMgYW4gb3BlbmluZwogICAgIC8vIGJyYWNlLgpAQCAtNDkxLDYgKzY0MCw3IEBACiAgICAgICAvLyBDaGVjayB0aGF0IHdlIHN0aWxsIGhhdmUgdGhyZWUgbGluZXMgYW5kIHRoZXkgZml0IGludG8gdGhlIGxpbWl0LgogICAgICAgaWYgKEkgKyAyID09IEUgfHwgSVsyXS0+VHlwZSA9PSBMVF9JbnZhbGlkKQogICAgICAgICByZXR1cm4gMDsKKyAgICAgIExpbWl0ID0gbGltaXRDb25zaWRlcmluZ01hY3JvcyhJICsgMiwgRSwgTGltaXQpOwogCiAgICAgICBpZiAoIW5leHRUd29MaW5lc0ZpdEludG8oSSwgTGltaXQpKQogICAgICAgICByZXR1cm4gMDsKQEAgLTUxNiwzNCArNjY2LDUxIEBACiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICAvLy8gUmV0dXJucyB0aGUgbW9kaWZpZWQgY29sdW1uIGxpbWl0IGZvciBccCBJIGlmIGl0IGlzIGluc2lkZSBhIG1hY3JvIGFuZAorICAvLy8gbmVlZHMgYSB0cmFpbGluZyAnXCcuCisgIHVuc2lnbmVkCisgIGxpbWl0Q29uc2lkZXJpbmdNYWNyb3MoU21hbGxWZWN0b3JJbXBsPEFubm90YXRlZExpbmUgKj46OmNvbnN0X2l0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEFubm90YXRlZExpbmUgKj46OmNvbnN0X2l0ZXJhdG9yIEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGltaXQpIHsKKyAgICBpZiAoSVswXS0+SW5QUERpcmVjdGl2ZSAmJiBJICsgMSAhPSBFICYmCisgICAgICAgICFJWzFdLT5GaXJzdC0+SGFzVW5lc2NhcGVkTmV3bGluZSAmJiAhSVsxXS0+Rmlyc3QtPmlzKHRvazo6ZW9mKSkgeworICAgICAgcmV0dXJuIExpbWl0IDwgMiA/IDAgOiBMaW1pdCAtIDI7CisgICAgfQorICAgIHJldHVybiBMaW1pdDsKKyAgfQorCiAgIGJvb2wgbmV4dFR3b0xpbmVzRml0SW50byhTbWFsbFZlY3RvckltcGw8QW5ub3RhdGVkTGluZSAqPjo6Y29uc3RfaXRlcmF0b3IgSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbWl0KSB7CiAgICAgcmV0dXJuIDEgKyBJWzFdLT5MYXN0LT5Ub3RhbExlbmd0aCArIDEgKyBJWzJdLT5MYXN0LT5Ub3RhbExlbmd0aCA8PSBMaW1pdDsKICAgfQogCisgIGJvb2wgY29udGFpbnNNdXN0QnJlYWsoY29uc3QgQW5ub3RhdGVkTGluZSAqTGluZSkgeworICAgIGZvciAoY29uc3QgRm9ybWF0VG9rZW4gKlRvayA9IExpbmUtPkZpcnN0OyBUb2s7IFRvayA9IFRvay0+TmV4dCkgeworICAgICAgaWYgKFRvay0+TXVzdEJyZWFrQmVmb3JlKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgY29uc3QgRm9ybWF0U3R5bGUgJlN0eWxlOwogfTsKIAogY2xhc3MgVW53cmFwcGVkTGluZUZvcm1hdHRlciB7CiBwdWJsaWM6Ci0gIFVud3JhcHBlZExpbmVGb3JtYXR0ZXIoU291cmNlTWFuYWdlciAmU291cmNlTWdyLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDaGFyU291cmNlUmFuZ2U+ICZSYW5nZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29udGludWF0aW9uSW5kZW50ZXIgKkluZGVudGVyLAorICBVbndyYXBwZWRMaW5lRm9ybWF0dGVyKENvbnRpbnVhdGlvbkluZGVudGVyICpJbmRlbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZXNwYWNlTWFuYWdlciAqV2hpdGVzcGFjZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0U3R5bGUgJlN0eWxlKQotICAgICAgOiBTb3VyY2VNZ3IoU291cmNlTWdyKSwgUmFuZ2VzKFJhbmdlcyksIEluZGVudGVyKEluZGVudGVyKSwKLSAgICAgICAgV2hpdGVzcGFjZXMoV2hpdGVzcGFjZXMpLCBTdHlsZShTdHlsZSksIEpvaW5lcihTdHlsZSkge30KKyAgICAgIDogSW5kZW50ZXIoSW5kZW50ZXIpLCBXaGl0ZXNwYWNlcyhXaGl0ZXNwYWNlcyksIFN0eWxlKFN0eWxlKSwKKyAgICAgICAgSm9pbmVyKFN0eWxlKSB7fQogCiAgIHVuc2lnbmVkIGZvcm1hdChjb25zdCBTbWFsbFZlY3RvckltcGw8QW5ub3RhdGVkTGluZSAqPiAmTGluZXMsIGJvb2wgRHJ5UnVuLAotICAgICAgICAgICAgICAgICAgaW50IEFkZGl0aW9uYWxJbmRlbnQgPSAwKSB7CisgICAgICAgICAgICAgICAgICBpbnQgQWRkaXRpb25hbEluZGVudCA9IDAsIGJvb2wgRml4QmFkSW5kZW50YXRpb24gPSBmYWxzZSkgewogICAgIGFzc2VydCghTGluZXMuZW1wdHkoKSk7CiAgICAgdW5zaWduZWQgUGVuYWx0eSA9IDA7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBJbmRlbnRGb3JMZXZlbDsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTGluZXNbMF0tPkxldmVsOyBpICE9IGU7ICsraSkKICAgICAgIEluZGVudEZvckxldmVsLnB1c2hfYmFjayhTdHlsZS5JbmRlbnRXaWR0aCAqIGkgKyBBZGRpdGlvbmFsSW5kZW50KTsKLSAgICBib29sIFByZXZpb3VzTGluZVdhc1RvdWNoZWQgPSBmYWxzZTsKICAgICBjb25zdCBBbm5vdGF0ZWRMaW5lICpQcmV2aW91c0xpbmUgPSBOVUxMOwotICAgIGJvb2wgRm9ybWF0UFBEaXJlY3RpdmUgPSBmYWxzZTsKICAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxBbm5vdGF0ZWRMaW5lICo+Ojpjb25zdF9pdGVyYXRvciBJID0gTGluZXMuYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gTGluZXMuZW5kKCk7CiAgICAgICAgICBJICE9IEU7ICsrSSkgewpAQCAtNTUxLDIxICs3MTgsMzAgQEAKICAgICAgIGNvbnN0IEZvcm1hdFRva2VuICpGaXJzdFRvayA9IFRoZUxpbmUuRmlyc3Q7CiAgICAgICBpbnQgT2Zmc2V0ID0gZ2V0SW5kZW50T2Zmc2V0KCpGaXJzdFRvayk7CiAKLSAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBsaW5lIGlzIHBhcnQgb2YgYSBmb3JtYXR0ZWQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZS4KLSAgICAgIGlmIChGaXJzdFRvay0+SGFzVW5lc2NhcGVkTmV3bGluZSkKLSAgICAgICAgRm9ybWF0UFBEaXJlY3RpdmUgPSBmYWxzZTsKLSAgICAgIGlmICghRm9ybWF0UFBEaXJlY3RpdmUgJiYgVGhlTGluZS5JblBQRGlyZWN0aXZlICYmCi0gICAgICAgICAgKHRvdWNoZXNMaW5lKFRoZUxpbmUpIHx8IHRvdWNoZXNQUERpcmVjdGl2ZShJICsgMSwgRSkpKQotICAgICAgICBGb3JtYXRQUERpcmVjdGl2ZSA9IHRydWU7Ci0KICAgICAgIC8vIERldGVybWluZSBpbmRlbnQgYW5kIHRyeSB0byBtZXJnZSBtdWx0aXBsZSB1bndyYXBwZWQgbGluZXMuCi0gICAgICB3aGlsZSAoSW5kZW50Rm9yTGV2ZWwuc2l6ZSgpIDw9IFRoZUxpbmUuTGV2ZWwpCi0gICAgICAgIEluZGVudEZvckxldmVsLnB1c2hfYmFjaygtMSk7Ci0gICAgICBJbmRlbnRGb3JMZXZlbC5yZXNpemUoVGhlTGluZS5MZXZlbCArIDEpOwotICAgICAgdW5zaWduZWQgSW5kZW50ID0gZ2V0SW5kZW50KEluZGVudEZvckxldmVsLCBUaGVMaW5lLkxldmVsKTsKKyAgICAgIHVuc2lnbmVkIEluZGVudDsKKyAgICAgIGlmIChUaGVMaW5lLkluUFBEaXJlY3RpdmUpIHsKKyAgICAgICAgSW5kZW50ID0gVGhlTGluZS5MZXZlbCAqIFN0eWxlLkluZGVudFdpZHRoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKEluZGVudEZvckxldmVsLnNpemUoKSA8PSBUaGVMaW5lLkxldmVsKQorICAgICAgICAgIEluZGVudEZvckxldmVsLnB1c2hfYmFjaygtMSk7CisgICAgICAgIEluZGVudEZvckxldmVsLnJlc2l6ZShUaGVMaW5lLkxldmVsICsgMSk7CisgICAgICAgIEluZGVudCA9IGdldEluZGVudChJbmRlbnRGb3JMZXZlbCwgVGhlTGluZS5MZXZlbCk7CisgICAgICB9CisgICAgICB1bnNpZ25lZCBMZXZlbEluZGVudCA9IEluZGVudDsKICAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KEluZGVudCkgKyBPZmZzZXQgPj0gMCkKICAgICAgICAgSW5kZW50ICs9IE9mZnNldDsKKworICAgICAgLy8gTWVyZ2UgbXVsdGlwbGUgbGluZXMgaWYgcG9zc2libGUuCiAgICAgICB1bnNpZ25lZCBNZXJnZWRMaW5lcyA9IEpvaW5lci50cnlGaXRNdWx0aXBsZUxpbmVzSW5PbmUoSW5kZW50LCBJLCBFKTsKKyAgICAgIGlmIChNZXJnZWRMaW5lcyA+IDAgJiYgU3R5bGUuQ29sdW1uTGltaXQgPT0gMCkgeworICAgICAgICAvLyBEaXNhbGxvdyBsaW5lIG1lcmdpbmcgaWYgdGhlcmUgaXMgYSBicmVhayBhdCB0aGUgc3RhcnQgb2Ygb25lIG9mIHRoZQorICAgICAgICAvLyBpbnB1dCBsaW5lcy4KKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE1lcmdlZExpbmVzOyArK2kpIHsKKyAgICAgICAgICBpZiAoSVtpICsgMV0tPkZpcnN0LT5OZXdsaW5lc0JlZm9yZSA+IDApCisgICAgICAgICAgICBNZXJnZWRMaW5lcyA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KICAgICAgIGlmICghRHJ5UnVuKSB7CiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBNZXJnZWRMaW5lczsgKytpKSB7CiAgICAgICAgICAgam9pbigqSVtpXSwgKklbaSArIDFdKTsKQEAgLTU3MywxOCArNzQ5LDE4IEBACiAgICAgICB9CiAgICAgICBJICs9IE1lcmdlZExpbmVzOwogCi0gICAgICBib29sIFdhc01vdmVkID0gUHJldmlvdXNMaW5lV2FzVG91Y2hlZCAmJiBGaXJzdFRvay0+TmV3bGluZXNCZWZvcmUgPT0gMDsKKyAgICAgIGJvb2wgRml4SW5kZW50YXRpb24gPQorICAgICAgICAgIEZpeEJhZEluZGVudGF0aW9uICYmIChMZXZlbEluZGVudCAhPSBGaXJzdFRvay0+T3JpZ2luYWxDb2x1bW4pOwogICAgICAgaWYgKFRoZUxpbmUuRmlyc3QtPmlzKHRvazo6ZW9mKSkgewotICAgICAgICBpZiAoUHJldmlvdXNMaW5lV2FzVG91Y2hlZCAmJiAhRHJ5UnVuKSB7CisgICAgICAgIGlmIChQcmV2aW91c0xpbmUgJiYgUHJldmlvdXNMaW5lLT5BZmZlY3RlZCAmJiAhRHJ5UnVuKSB7CisgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBmaWxlJ3MgdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICAgICAgICB1bnNpZ25lZCBOZXdsaW5lcyA9IHN0ZDo6bWluKEZpcnN0VG9rLT5OZXdsaW5lc0JlZm9yZSwgMXUpOwogICAgICAgICAgIFdoaXRlc3BhY2VzLT5yZXBsYWNlV2hpdGVzcGFjZSgqVGhlTGluZS5GaXJzdCwgTmV3bGluZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSW5kZW50TGV2ZWw9Ki8wLCAvKlNwYWNlcz0qLzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGFyZ2V0Q29sdW1uPSovMCk7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSBpZiAoVGhlTGluZS5UeXBlICE9IExUX0ludmFsaWQgJiYKLSAgICAgICAgICAgICAgICAgKFdhc01vdmVkIHx8IEZvcm1hdFBQRGlyZWN0aXZlIHx8IHRvdWNoZXNMaW5lKFRoZUxpbmUpKSkgewotICAgICAgICB1bnNpZ25lZCBMZXZlbEluZGVudCA9Ci0gICAgICAgICAgICBnZXRJbmRlbnQoSW5kZW50Rm9yTGV2ZWwsIFRoZUxpbmUuTGV2ZWwpOworICAgICAgICAgICAgICAgICAoVGhlTGluZS5BZmZlY3RlZCB8fCBGaXhJbmRlbnRhdGlvbikpIHsKICAgICAgICAgaWYgKEZpcnN0VG9rLT5XaGl0ZXNwYWNlUmFuZ2UuaXNWYWxpZCgpKSB7CiAgICAgICAgICAgaWYgKCFEcnlSdW4pCiAgICAgICAgICAgICBmb3JtYXRGaXJzdFRva2VuKCpUaGVMaW5lLkZpcnN0LCBQcmV2aW91c0xpbmUsIFRoZUxpbmUuTGV2ZWwsCkBAIC02MDYsNiArNzgyLDcgQEAKICAgICAgICAgICB3aGlsZSAoU3RhdGUuTmV4dFRva2VuICE9IE5VTEwpCiAgICAgICAgICAgICBJbmRlbnRlci0+YWRkVG9rZW5Ub1N0YXRlKFN0YXRlLCAvKk5ld2xpbmU9Ki9mYWxzZSwgRHJ5UnVuKTsKICAgICAgICAgfSBlbHNlIGlmIChTdHlsZS5Db2x1bW5MaW1pdCA9PSAwKSB7CisgICAgICAgICAgLy8gRklYTUU6IEltcGxlbWVudCBuZXN0ZWQgYmxvY2tzIGZvciBDb2x1bW5MaW1pdCA9IDAuCiAgICAgICAgICAgTm9Db2x1bW5MaW1pdEZvcm1hdHRlciBGb3JtYXR0ZXIoSW5kZW50ZXIpOwogICAgICAgICAgIGlmICghRHJ5UnVuKQogICAgICAgICAgICAgRm9ybWF0dGVyLmZvcm1hdChJbmRlbnQsICZUaGVMaW5lKTsKQEAgLTYxMyw4ICs3OTAsMTAgQEAKICAgICAgICAgICBQZW5hbHR5ICs9IGZvcm1hdChUaGVMaW5lLCBJbmRlbnQsIERyeVJ1bik7CiAgICAgICAgIH0KIAotICAgICAgICBJbmRlbnRGb3JMZXZlbFtUaGVMaW5lLkxldmVsXSA9IExldmVsSW5kZW50OwotICAgICAgICBQcmV2aW91c0xpbmVXYXNUb3VjaGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFUaGVMaW5lLkluUFBEaXJlY3RpdmUpCisgICAgICAgICAgSW5kZW50Rm9yTGV2ZWxbVGhlTGluZS5MZXZlbF0gPSBMZXZlbEluZGVudDsKKyAgICAgIH0gZWxzZSBpZiAoVGhlTGluZS5DaGlsZHJlbkFmZmVjdGVkKSB7CisgICAgICAgIGZvcm1hdChUaGVMaW5lLkNoaWxkcmVuLCBEcnlSdW4pOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRm9ybWF0IHRoZSBmaXJzdCB0b2tlbiBpZiBuZWNlc3NhcnksIGFuZCBub3RpZnkgdGhlIFdoaXRlc3BhY2VNYW5hZ2VyCiAgICAgICAgIC8vIGFib3V0IHRoZSB1bmNoYW5nZWQgd2hpdGVzcGFjZS4KQEAgLTYyMyw5ICs4MDIsOSBAQAogICAgICAgICAgICAgICAoVG9rLT5OZXdsaW5lc0JlZm9yZSA+IDAgfHwgVG9rLT5Jc0ZpcnN0KSkgewogICAgICAgICAgICAgdW5zaWduZWQgTGV2ZWxJbmRlbnQgPSBUb2stPk9yaWdpbmFsQ29sdW1uOwogICAgICAgICAgICAgaWYgKCFEcnlSdW4pIHsKLSAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb2YgdGhlIHByZXZpb3VzIGxpbmUgaWYgaXQgd2FzCi0gICAgICAgICAgICAgIC8vIHRvdWNoZWQuCi0gICAgICAgICAgICAgIGlmIChQcmV2aW91c0xpbmVXYXNUb3VjaGVkIHx8IHRvdWNoZXNFbXB0eUxpbmVCZWZvcmUoVGhlTGluZSkpIHsKKyAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb2YgdGhlIHByZXZpb3VzIGxpbmUuCisgICAgICAgICAgICAgIGlmICgoUHJldmlvdXNMaW5lICYmIFByZXZpb3VzTGluZS0+QWZmZWN0ZWQpIHx8CisgICAgICAgICAgICAgICAgICBUaGVMaW5lLkxlYWRpbmdFbXB0eUxpbmVzQWZmZWN0ZWQpIHsKICAgICAgICAgICAgICAgICBmb3JtYXRGaXJzdFRva2VuKCpUb2ssIFByZXZpb3VzTGluZSwgVGhlTGluZS5MZXZlbCwgTGV2ZWxJbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVMaW5lLkluUFBEaXJlY3RpdmUpOwogICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjM1LDE2ICs4MTQsMTIgQEAKIAogICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludD4oTGV2ZWxJbmRlbnQpIC0gT2Zmc2V0ID49IDApCiAgICAgICAgICAgICAgIExldmVsSW5kZW50IC09IE9mZnNldDsKLSAgICAgICAgICAgIGlmIChUb2stPmlzTm90KHRvazo6Y29tbWVudCkpCisgICAgICAgICAgICBpZiAoVG9rLT5pc05vdCh0b2s6OmNvbW1lbnQpICYmICFUaGVMaW5lLkluUFBEaXJlY3RpdmUpCiAgICAgICAgICAgICAgIEluZGVudEZvckxldmVsW1RoZUxpbmUuTGV2ZWxdID0gTGV2ZWxJbmRlbnQ7CiAgICAgICAgICAgfSBlbHNlIGlmICghRHJ5UnVuKSB7CiAgICAgICAgICAgICBXaGl0ZXNwYWNlcy0+YWRkVW50b3VjaGFibGVUb2tlbigqVG9rLCBUaGVMaW5lLkluUFBEaXJlY3RpdmUpOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyBJZiB3ZSBkaWQgbm90IHJlZm9ybWF0IHRoaXMgdW53cmFwcGVkIGxpbmUsIHRoZSBjb2x1bW4gYXQgdGhlIGVuZCBvZgotICAgICAgICAvLyB0aGUgbGFzdCB0b2tlbiBpcyB1bmNoYW5nZWQgLSB0aHVzLCB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBlbmQgb2YgdGhlCi0gICAgICAgIC8vIGxhc3QgdG9rZW4uCi0gICAgICAgIFByZXZpb3VzTGluZVdhc1RvdWNoZWQgPSBmYWxzZTsKICAgICAgIH0KICAgICAgIGlmICghRHJ5UnVuKSB7CiAgICAgICAgIGZvciAoRm9ybWF0VG9rZW4gKlRvayA9IFRoZUxpbmUuRmlyc3Q7IFRvayAhPSBOVUxMOyBUb2sgPSBUb2stPk5leHQpIHsKQEAgLTcyMyw2ICs4OTgsMTIgQEAKICAgICBpZiAoTmV3bGluZXMgPT0gMCAmJiAhUm9vdFRva2VuLklzRmlyc3QpCiAgICAgICBOZXdsaW5lcyA9IDE7CiAKKyAgICAvLyBSZW1vdmUgZW1wdHkgbGluZXMgYWZ0ZXIgInsiLgorICAgIGlmICghU3R5bGUuS2VlcEVtcHR5TGluZXNBdFRoZVN0YXJ0T2ZCbG9ja3MgJiYgUHJldmlvdXNMaW5lICYmCisgICAgICAgIFByZXZpb3VzTGluZS0+TGFzdC0+aXModG9rOjpsX2JyYWNlKSAmJgorICAgICAgICBQcmV2aW91c0xpbmUtPkZpcnN0LT5pc05vdCh0b2s6Omt3X25hbWVzcGFjZSkpCisgICAgICBOZXdsaW5lcyA9IDE7CisKICAgICAvLyBJbnNlcnQgZXh0cmEgbmV3IGxpbmUgYmVmb3JlIGFjY2VzcyBzcGVjaWZpZXJzLgogICAgIGlmIChQcmV2aW91c0xpbmUgJiYgUHJldmlvdXNMaW5lLT5MYXN0LT5pc09uZU9mKHRvazo6c2VtaSwgdG9rOjpyX2JyYWNlKSAmJgogICAgICAgICBSb290VG9rZW4uaXNBY2Nlc3NTcGVjaWZpZXIoKSAmJiBSb290VG9rZW4uTmV3bGluZXNCZWZvcmUgPT0gMSkKQEAgLTczMiw5ICs5MTMsOSBAQAogICAgIGlmIChQcmV2aW91c0xpbmUgJiYgUHJldmlvdXNMaW5lLT5GaXJzdC0+aXNBY2Nlc3NTcGVjaWZpZXIoKSkKICAgICAgIE5ld2xpbmVzID0gc3RkOjptaW4oMXUsIE5ld2xpbmVzKTsKIAotICAgIFdoaXRlc3BhY2VzLT5yZXBsYWNlV2hpdGVzcGFjZSgKLSAgICAgICAgUm9vdFRva2VuLCBOZXdsaW5lcywgSW5kZW50TGV2ZWwsIEluZGVudCwgSW5kZW50LAotICAgICAgICBJblBQRGlyZWN0aXZlICYmICFSb290VG9rZW4uSGFzVW5lc2NhcGVkTmV3bGluZSk7CisgICAgV2hpdGVzcGFjZXMtPnJlcGxhY2VXaGl0ZXNwYWNlKFJvb3RUb2tlbiwgTmV3bGluZXMsIEluZGVudExldmVsLCBJbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGVudCwgSW5QUERpcmVjdGl2ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhUm9vdFRva2VuLkhhc1VuZXNjYXBlZE5ld2xpbmUpOwogICB9CiAKICAgLy8vIFxicmllZiBHZXQgdGhlIGluZGVudCBvZiBccCBMZXZlbCBmcm9tIFxwIEluZGVudEZvckxldmVsLgpAQCAtNzUzLDYgKzkzNCw4IEBACiAgIHZvaWQgam9pbihBbm5vdGF0ZWRMaW5lICZBLCBjb25zdCBBbm5vdGF0ZWRMaW5lICZCKSB7CiAgICAgYXNzZXJ0KCFBLkxhc3QtPk5leHQpOwogICAgIGFzc2VydCghQi5GaXJzdC0+UHJldmlvdXMpOworICAgIGlmIChCLkFmZmVjdGVkKQorICAgICAgQS5BZmZlY3RlZCA9IHRydWU7CiAgICAgQS5MYXN0LT5OZXh0ID0gQi5GaXJzdDsKICAgICBCLkZpcnN0LT5QcmV2aW91cyA9IEEuTGFzdDsKICAgICBCLkZpcnN0LT5DYW5CcmVha0JlZm9yZSA9IHRydWU7CkBAIC03NjgsNDggKzk1MSw2IEBACiAgICAgcmV0dXJuIFN0eWxlLkNvbHVtbkxpbWl0IC0gKEluUFBEaXJlY3RpdmUgPyAyIDogMCk7CiAgIH0KIAotICBib29sIHRvdWNoZXNSYW5nZXMoY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSYW5nZSkgewotICAgIGZvciAoU21hbGxWZWN0b3JJbXBsPENoYXJTb3VyY2VSYW5nZT46OmNvbnN0X2l0ZXJhdG9yIEkgPSBSYW5nZXMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gUmFuZ2VzLmVuZCgpOwotICAgICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICAgIGlmICghU291cmNlTWdyLmlzQmVmb3JlSW5UcmFuc2xhdGlvblVuaXQoUmFuZ2UuZ2V0RW5kKCksIEktPmdldEJlZ2luKCkpICYmCi0gICAgICAgICAgIVNvdXJjZU1nci5pc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0KEktPmdldEVuZCgpLCBSYW5nZS5nZXRCZWdpbigpKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJvb2wgdG91Y2hlc0xpbmUoY29uc3QgQW5ub3RhdGVkTGluZSAmVGhlTGluZSkgewotICAgIGNvbnN0IEZvcm1hdFRva2VuICpGaXJzdCA9IFRoZUxpbmUuRmlyc3Q7Ci0gICAgY29uc3QgRm9ybWF0VG9rZW4gKkxhc3QgPSBUaGVMaW5lLkxhc3Q7Ci0gICAgQ2hhclNvdXJjZVJhbmdlIExpbmVSYW5nZSA9IENoYXJTb3VyY2VSYW5nZTo6Z2V0Q2hhclJhbmdlKAotICAgICAgICBGaXJzdC0+V2hpdGVzcGFjZVJhbmdlLmdldEJlZ2luKCkuZ2V0TG9jV2l0aE9mZnNldCgKLSAgICAgICAgICAgIEZpcnN0LT5MYXN0TmV3bGluZU9mZnNldCksCi0gICAgICAgIExhc3QtPmdldFN0YXJ0T2ZOb25XaGl0ZXNwYWNlKCkuZ2V0TG9jV2l0aE9mZnNldCgKLSAgICAgICAgICAgIExhc3QtPlRva2VuVGV4dC5zaXplKCkgLSAxKSk7Ci0gICAgcmV0dXJuIHRvdWNoZXNSYW5nZXMoTGluZVJhbmdlKTsKLSAgfQotCi0gIGJvb2wgdG91Y2hlc1BQRGlyZWN0aXZlKFNtYWxsVmVjdG9ySW1wbDxBbm5vdGF0ZWRMaW5lICo+Ojpjb25zdF9pdGVyYXRvciBJLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8QW5ub3RhdGVkTGluZSAqPjo6Y29uc3RfaXRlcmF0b3IgRSkgewotICAgIGZvciAoOyBJICE9IEU7ICsrSSkgewotICAgICAgaWYgKCgqSSktPkZpcnN0LT5IYXNVbmVzY2FwZWROZXdsaW5lKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodG91Y2hlc0xpbmUoKipJKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJvb2wgdG91Y2hlc0VtcHR5TGluZUJlZm9yZShjb25zdCBBbm5vdGF0ZWRMaW5lICZUaGVMaW5lKSB7Ci0gICAgY29uc3QgRm9ybWF0VG9rZW4gKkZpcnN0ID0gVGhlTGluZS5GaXJzdDsKLSAgICBDaGFyU291cmNlUmFuZ2UgTGluZVJhbmdlID0gQ2hhclNvdXJjZVJhbmdlOjpnZXRDaGFyUmFuZ2UoCi0gICAgICAgIEZpcnN0LT5XaGl0ZXNwYWNlUmFuZ2UuZ2V0QmVnaW4oKSwKLSAgICAgICAgRmlyc3QtPldoaXRlc3BhY2VSYW5nZS5nZXRCZWdpbigpLmdldExvY1dpdGhPZmZzZXQoCi0gICAgICAgICAgICBGaXJzdC0+TGFzdE5ld2xpbmVPZmZzZXQpKTsKLSAgICByZXR1cm4gdG91Y2hlc1JhbmdlcyhMaW5lUmFuZ2UpOwotICB9Ci0KICAgLy8vIFxicmllZiBBbmFseXplIHRoZSBlbnRpcmUgc29sdXRpb24gc3BhY2Ugc3RhcnRpbmcgZnJvbSBccCBJbml0aWFsU3RhdGUuCiAgIC8vLwogICAvLy8gVGhpcyBpbXBsZW1lbnRzIGEgdmFyaWFudCBvZiBEaWprc3RyYSdzIGFsZ29yaXRobSBvbiB0aGUgZ3JhcGggdGhhdCBzcGFucwpAQCAtOTU1LDEzICsxMDk2LDE0IEBACiAgICAgaWYgKE5ld0xpbmUpIHsKICAgICAgIGludCBBZGRpdGlvbmFsSW5kZW50ID0gU3RhdGUuU3RhY2suYmFjaygpLkluZGVudCAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZpb3VzLkNoaWxkcmVuWzBdLT5MZXZlbCAqIFN0eWxlLkluZGVudFdpZHRoOwotICAgICAgUGVuYWx0eSArPSBmb3JtYXQoUHJldmlvdXMuQ2hpbGRyZW4sIERyeVJ1biwgQWRkaXRpb25hbEluZGVudCk7CisgICAgICBQZW5hbHR5ICs9IGZvcm1hdChQcmV2aW91cy5DaGlsZHJlbiwgRHJ5UnVuLCBBZGRpdGlvbmFsSW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgLypGaXhCYWRJbmRlbnRhdGlvbj0qL3RydWUpOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgLy8gQ2Fubm90IG1lcmdlIG11bHRpcGxlIHN0YXRlbWVudHMgaW50byBhIHNpbmdsZSBsaW5lLgogICAgIGlmIChQcmV2aW91cy5DaGlsZHJlbi5zaXplKCkgPiAxKQotICAgICAgcmV0dXJuIGZhbHNlOyAKKyAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIC8vIFdlIGNhbid0IHB1dCB0aGUgY2xvc2luZyAifSIgb24gYSBsaW5lIHdpdGggYSB0cmFpbGluZyBjb21tZW50LgogICAgIGlmIChQcmV2aW91cy5DaGlsZHJlblswXS0+TGFzdC0+aXNUcmFpbGluZ0NvbW1lbnQoKSkKQEAgLTk3OSw4ICsxMTIxLDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1ncjsKLSAgU21hbGxWZWN0b3JJbXBsPENoYXJTb3VyY2VSYW5nZT4gJlJhbmdlczsKICAgQ29udGludWF0aW9uSW5kZW50ZXIgKkluZGVudGVyOwogICBXaGl0ZXNwYWNlTWFuYWdlciAqV2hpdGVzcGFjZXM7CiAgIEZvcm1hdFN0eWxlIFN0eWxlOwpAQCAtOTk3LDEzICsxMTM3LDE3IEBACiAgICAgICAgIFRyYWlsaW5nV2hpdGVzcGFjZSgwKSwgTGV4KExleCksIFNvdXJjZU1ncihTb3VyY2VNZ3IpLCBTdHlsZShTdHlsZSksCiAgICAgICAgIElkZW50VGFibGUoZ2V0Rm9ybWF0dGluZ0xhbmdPcHRzKCkpLCBFbmNvZGluZyhFbmNvZGluZykgewogICAgIExleC5TZXRLZWVwV2hpdGVzcGFjZU1vZGUodHJ1ZSk7CisKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBGb3JFYWNoTWFjcm8gOiBTdHlsZS5Gb3JFYWNoTWFjcm9zKQorICAgICAgRm9yRWFjaE1hY3Jvcy5wdXNoX2JhY2soJklkZW50VGFibGUuZ2V0KEZvckVhY2hNYWNybykpOworICAgIHN0ZDo6c29ydChGb3JFYWNoTWFjcm9zLmJlZ2luKCksIEZvckVhY2hNYWNyb3MuZW5kKCkpOwogICB9CiAKICAgQXJyYXlSZWY8Rm9ybWF0VG9rZW4gKj4gbGV4KCkgewogICAgIGFzc2VydChUb2tlbnMuZW1wdHkoKSk7CiAgICAgZG8gewogICAgICAgVG9rZW5zLnB1c2hfYmFjayhnZXROZXh0VG9rZW4oKSk7Ci0gICAgICBtYXliZUpvaW5QcmV2aW91c1Rva2VucygpOworICAgICAgdHJ5TWVyZ2VQcmV2aW91c1Rva2VucygpOwogICAgIH0gd2hpbGUgKFRva2Vucy5iYWNrKCktPlRvay5pc05vdCh0b2s6OmVvZikpOwogICAgIHJldHVybiBUb2tlbnM7CiAgIH0KQEAgLTEwMTEsMjMgKzExNTUsNjUgQEAKICAgSWRlbnRpZmllclRhYmxlICZnZXRJZGVudFRhYmxlKCkgeyByZXR1cm4gSWRlbnRUYWJsZTsgfQogCiBwcml2YXRlOgotICB2b2lkIG1heWJlSm9pblByZXZpb3VzVG9rZW5zKCkgewotICAgIGlmIChUb2tlbnMuc2l6ZSgpIDwgNCkKKyAgdm9pZCB0cnlNZXJnZVByZXZpb3VzVG9rZW5zKCkgeworICAgIGlmICh0cnlNZXJnZV9UTWFjcm8oKSkKICAgICAgIHJldHVybjsKKworICAgIGlmIChTdHlsZS5MYW5ndWFnZSA9PSBGb3JtYXRTdHlsZTo6TEtfSmF2YVNjcmlwdCkgeworICAgICAgc3RhdGljIHRvazo6VG9rZW5LaW5kIEpTSWRlbnRpdHlbXSA9IHsgdG9rOjplcXVhbGVxdWFsLCB0b2s6OmVxdWFsIH07CisgICAgICBzdGF0aWMgdG9rOjpUb2tlbktpbmQgSlNOb3RJZGVudGl0eVtdID0geyB0b2s6OmV4Y2xhaW1lcXVhbCwgdG9rOjplcXVhbCB9OworICAgICAgc3RhdGljIHRvazo6VG9rZW5LaW5kIEpTU2hpZnRFcXVhbFtdID0geyB0b2s6OmdyZWF0ZXIsIHRvazo6Z3JlYXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rOjpncmVhdGVyZXF1YWwgfTsKKyAgICAgIC8vIEZJWE1FOiBXZSBwcm9iYWJseSBuZWVkIHRvIGNoYW5nZSB0b2tlbiB0eXBlIHRvIG1pbWljIG9wZXJhdG9yIHdpdGggdGhlCisgICAgICAvLyBjb3JyZWN0IHByaW9yaXR5LgorICAgICAgaWYgKHRyeU1lcmdlVG9rZW5zKEpTSWRlbnRpdHkpKQorICAgICAgICByZXR1cm47CisgICAgICBpZiAodHJ5TWVyZ2VUb2tlbnMoSlNOb3RJZGVudGl0eSkpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmICh0cnlNZXJnZVRva2VucyhKU1NoaWZ0RXF1YWwpKQorICAgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgYm9vbCB0cnlNZXJnZVRva2VucyhBcnJheVJlZjx0b2s6OlRva2VuS2luZD4gS2luZHMpIHsKKyAgICBpZiAoVG9rZW5zLnNpemUoKSA8IEtpbmRzLnNpemUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFNtYWxsVmVjdG9ySW1wbDxGb3JtYXRUb2tlbiAqPjo6Y29uc3RfaXRlcmF0b3IgRmlyc3QgPQorICAgICAgICBUb2tlbnMuZW5kKCkgLSBLaW5kcy5zaXplKCk7CisgICAgaWYgKCFGaXJzdFswXS0+aXMoS2luZHNbMF0pKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHVuc2lnbmVkIEFkZExlbmd0aCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IEtpbmRzLnNpemUoKTsgKytpKSB7CisgICAgICBpZiAoIUZpcnN0W2ldLT5pcyhLaW5kc1tpXSkgfHwgRmlyc3RbaV0tPldoaXRlc3BhY2VSYW5nZS5nZXRCZWdpbigpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0W2ldLT5XaGl0ZXNwYWNlUmFuZ2UuZ2V0RW5kKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIEFkZExlbmd0aCArPSBGaXJzdFtpXS0+VG9rZW5UZXh0LnNpemUoKTsKKyAgICB9CisgICAgVG9rZW5zLnJlc2l6ZShUb2tlbnMuc2l6ZSgpIC0gS2luZHMuc2l6ZSgpICsgMSk7CisgICAgRmlyc3RbMF0tPlRva2VuVGV4dCA9IFN0cmluZ1JlZihGaXJzdFswXS0+VG9rZW5UZXh0LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0WzBdLT5Ub2tlblRleHQuc2l6ZSgpICsgQWRkTGVuZ3RoKTsKKyAgICBGaXJzdFswXS0+Q29sdW1uV2lkdGggKz0gQWRkTGVuZ3RoOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB0cnlNZXJnZV9UTWFjcm8oKSB7CisgICAgaWYgKFRva2Vucy5zaXplKCkgPCA0KQorICAgICAgcmV0dXJuIGZhbHNlOwogICAgIEZvcm1hdFRva2VuICpMYXN0ID0gVG9rZW5zLmJhY2soKTsKICAgICBpZiAoIUxhc3QtPmlzKHRvazo6cl9wYXJlbikpCi0gICAgICByZXR1cm47CisgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBGb3JtYXRUb2tlbiAqU3RyaW5nID0gVG9rZW5zW1Rva2Vucy5zaXplKCkgLSAyXTsKICAgICBpZiAoIVN0cmluZy0+aXModG9rOjpzdHJpbmdfbGl0ZXJhbCkgfHwgU3RyaW5nLT5Jc011bHRpbGluZSkKLSAgICAgIHJldHVybjsKKyAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmICghVG9rZW5zW1Rva2Vucy5zaXplKCkgLSAzXS0+aXModG9rOjpsX3BhcmVuKSkKLSAgICAgIHJldHVybjsKKyAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIEZvcm1hdFRva2VuICpNYWNybyA9IFRva2Vuc1tUb2tlbnMuc2l6ZSgpIC0gNF07CiAgICAgaWYgKE1hY3JvLT5Ub2tlblRleHQgIT0gIl9UIikKLSAgICAgIHJldHVybjsKKyAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGNvbnN0IGNoYXIgKlN0YXJ0ID0gTWFjcm8tPlRva2VuVGV4dC5kYXRhKCk7CiAgICAgY29uc3QgY2hhciAqRW5kID0gTGFzdC0+VG9rZW5UZXh0LmRhdGEoKSArIExhc3QtPlRva2VuVGV4dC5zaXplKCk7CkBAIC0xMDQzLDYgKzEyMjksNyBAQAogICAgIFRva2Vucy5wb3BfYmFjaygpOwogICAgIFRva2Vucy5wb3BfYmFjaygpOwogICAgIFRva2Vucy5iYWNrKCkgPSBTdHJpbmc7CisgICAgcmV0dXJuIHRydWU7CiAgIH0KIAogICBGb3JtYXRUb2tlbiAqZ2V0TmV4dFRva2VuKCkgewpAQCAtMTE3NCw2ICsxMzYxLDEwIEBACiAgICAgICBDb2x1bW4gPSBGb3JtYXRUb2stPkxhc3RMaW5lQ29sdW1uV2lkdGg7CiAgICAgfQogCisgICAgRm9ybWF0VG9rLT5Jc0ZvckVhY2hNYWNybyA9CisgICAgICAgIHN0ZDo6YmluYXJ5X3NlYXJjaChGb3JFYWNoTWFjcm9zLmJlZ2luKCksIEZvckVhY2hNYWNyb3MuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXRUb2stPlRvay5nZXRJZGVudGlmaWVySW5mbygpKTsKKwogICAgIHJldHVybiBGb3JtYXRUb2s7CiAgIH0KIApAQCAtMTE4OSw2ICsxMzgwLDcgQEAKICAgZW5jb2Rpbmc6OkVuY29kaW5nIEVuY29kaW5nOwogICBsbHZtOjpTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I8Rm9ybWF0VG9rZW4+IEFsbG9jYXRvcjsKICAgU21hbGxWZWN0b3I8Rm9ybWF0VG9rZW4gKiwgMTY+IFRva2VuczsKKyAgU21hbGxWZWN0b3I8SWRlbnRpZmllckluZm8qLCA4PiBGb3JFYWNoTWFjcm9zOwogCiAgIHZvaWQgcmVhZFJhd1Rva2VuKEZvcm1hdFRva2VuICZUb2spIHsKICAgICBMZXguTGV4RnJvbVJhd0xleGVyKFRvay5Ub2spOwpAQCAtMTE5NiwxNCArMTM4OCwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rLlRvay5nZXRMZW5ndGgoKSk7CiAgICAgLy8gRm9yIGZvcm1hdHRpbmcsIHRyZWF0IHVudGVybWluYXRlZCBzdHJpbmcgbGl0ZXJhbHMgbGlrZSBub3JtYWwgc3RyaW5nCiAgICAgLy8gbGl0ZXJhbHMuCi0gICAgaWYgKFRvay5pcyh0b2s6OnVua25vd24pICYmICFUb2suVG9rZW5UZXh0LmVtcHR5KCkgJiYKLSAgICAgICAgVG9rLlRva2VuVGV4dFswXSA9PSAnIicpIHsKLSAgICAgIFRvay5Ub2suc2V0S2luZCh0b2s6OnN0cmluZ19saXRlcmFsKTsKLSAgICAgIFRvay5Jc1VudGVybWluYXRlZExpdGVyYWwgPSB0cnVlOworICAgIGlmIChUb2suaXModG9rOjp1bmtub3duKSkgeworICAgICAgaWYgKCFUb2suVG9rZW5UZXh0LmVtcHR5KCkgJiYgVG9rLlRva2VuVGV4dFswXSA9PSAnIicpIHsKKyAgICAgICAgVG9rLlRvay5zZXRLaW5kKHRvazo6c3RyaW5nX2xpdGVyYWwpOworICAgICAgICBUb2suSXNVbnRlcm1pbmF0ZWRMaXRlcmFsID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoU3R5bGUuTGFuZ3VhZ2UgPT0gRm9ybWF0U3R5bGU6OkxLX0phdmFTY3JpcHQgJiYKKyAgICAgICAgICAgICAgICAgVG9rLlRva2VuVGV4dCA9PSAiJyciKSB7CisgICAgICAgIFRvay5Ub2suc2V0S2luZCh0b2s6OmNoYXJfY29uc3RhbnQpOworICAgICAgfQogICAgIH0KICAgfQogfTsKIAorc3RhdGljIFN0cmluZ1JlZiBnZXRMYW5ndWFnZU5hbWUoRm9ybWF0U3R5bGU6Okxhbmd1YWdlS2luZCBMYW5ndWFnZSkgeworICBzd2l0Y2ggKExhbmd1YWdlKSB7CisgIGNhc2UgRm9ybWF0U3R5bGU6OkxLX0NwcDoKKyAgICByZXR1cm4gIkMrKyI7CisgIGNhc2UgRm9ybWF0U3R5bGU6OkxLX0phdmFTY3JpcHQ6CisgICAgcmV0dXJuICJKYXZhU2NyaXB0IjsKKyAgY2FzZSBGb3JtYXRTdHlsZTo6TEtfUHJvdG86CisgICAgcmV0dXJuICJQcm90byI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuICJVbmtub3duIjsKKyAgfQorfQorCiBjbGFzcyBGb3JtYXR0ZXIgOiBwdWJsaWMgVW53cmFwcGVkTGluZUNvbnN1bWVyIHsKIHB1YmxpYzoKICAgRm9ybWF0dGVyKGNvbnN0IEZvcm1hdFN0eWxlICZTdHlsZSwgTGV4ZXIgJkxleCwgU291cmNlTWFuYWdlciAmU291cmNlTWdyLApAQCAtMTIxNiw2ICsxNDI1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgPDwgKEVuY29kaW5nID09IGVuY29kaW5nOjpFbmNvZGluZ19VVEY4ID8gIlVURjgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJ1bmtub3duIikKICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIik7CisgICAgREVCVUcobGx2bTo6ZGJncygpIDw8ICJMYW5ndWFnZTogIiA8PCBnZXRMYW5ndWFnZU5hbWUoU3R5bGUuTGFuZ3VhZ2UpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIpOwogICB9CiAKICAgdG9vbGluZzo6UmVwbGFjZW1lbnRzIGZvcm1hdCgpIHsKQEAgLTEyNjEsMTcgKzE0NzIsMTUyIEBACiAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFubm90YXRlZExpbmVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKICAgICAgIEFubm90YXRvci5jYWxjdWxhdGVGb3JtYXR0aW5nSW5mb3JtYXRpb24oKkFubm90YXRlZExpbmVzW2ldKTsKICAgICB9CisgICAgY29tcHV0ZUFmZmVjdGVkTGluZXMoQW5ub3RhdGVkTGluZXMuYmVnaW4oKSwgQW5ub3RhdGVkTGluZXMuZW5kKCkpOwogCiAgICAgQW5ub3RhdG9yLnNldENvbW1lbnRMaW5lTGV2ZWxzKEFubm90YXRlZExpbmVzKTsKICAgICBDb250aW51YXRpb25JbmRlbnRlciBJbmRlbnRlcihTdHlsZSwgU291cmNlTWdyLCBXaGl0ZXNwYWNlcywgRW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluUGFja0luY29uY2x1c2l2ZUZ1bmN0aW9ucyk7Ci0gICAgVW53cmFwcGVkTGluZUZvcm1hdHRlciBGb3JtYXR0ZXIoU291cmNlTWdyLCBSYW5nZXMsICZJbmRlbnRlciwgJldoaXRlc3BhY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlKTsKKyAgICBVbndyYXBwZWRMaW5lRm9ybWF0dGVyIEZvcm1hdHRlcigmSW5kZW50ZXIsICZXaGl0ZXNwYWNlcywgU3R5bGUpOwogICAgIEZvcm1hdHRlci5mb3JtYXQoQW5ub3RhdGVkTGluZXMsIC8qRHJ5UnVuPSovZmFsc2UpOwogICAgIHJldHVybiBXaGl0ZXNwYWNlcy5nZW5lcmF0ZVJlcGxhY2VtZW50cygpOwogICB9CiAKIHByaXZhdGU6CisgIC8vIERldGVybWluZXMgd2hpY2ggbGluZXMgYXJlIGFmZmVjdGVkIGJ5IHRoZSBTb3VyY2VSYW5nZXMgZ2l2ZW4gYXMgaW5wdXQuCisgIC8vIFJldHVybnMgXGMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgbGluZSBiZXR3ZWVuIEkgYW5kIEUgb3Igb25lIG9mIHRoZWlyCisgIC8vIGNoaWxkcmVuIGlzIGFmZmVjdGVkLgorICBib29sIGNvbXB1dGVBZmZlY3RlZExpbmVzKFNtYWxsVmVjdG9ySW1wbDxBbm5vdGF0ZWRMaW5lICo+OjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxBbm5vdGF0ZWRMaW5lICo+OjppdGVyYXRvciBFKSB7CisgICAgYm9vbCBTb21lTGluZUFmZmVjdGVkID0gZmFsc2U7CisgICAgY29uc3QgQW5ub3RhdGVkTGluZSAqUHJldmlvdXNMaW5lID0gTlVMTDsKKyAgICB3aGlsZSAoSSAhPSBFKSB7CisgICAgICBBbm5vdGF0ZWRMaW5lICpMaW5lID0gKkk7CisgICAgICBMaW5lLT5MZWFkaW5nRW1wdHlMaW5lc0FmZmVjdGVkID0gYWZmZWN0c0xlYWRpbmdFbXB0eUxpbmVzKCpMaW5lLT5GaXJzdCk7CisKKyAgICAgIC8vIElmIGEgbGluZSBpcyBwYXJ0IG9mIGEgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSwgaXQgbmVlZHMgdG8gYmUgZm9ybWF0dGVkCisgICAgICAvLyBpZiBhbnkgdG9rZW4gd2l0aGluIHRoZSBkaXJlY3RpdmUgaXMgYWZmZWN0ZWQuCisgICAgICBpZiAoTGluZS0+SW5QUERpcmVjdGl2ZSkgeworICAgICAgICBGb3JtYXRUb2tlbiAqTGFzdCA9IExpbmUtPkxhc3Q7CisgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxBbm5vdGF0ZWRMaW5lICo+OjppdGVyYXRvciBQUEVuZCA9IEkgKyAxOworICAgICAgICB3aGlsZSAoUFBFbmQgIT0gRSAmJiAhKCpQUEVuZCktPkZpcnN0LT5IYXNVbmVzY2FwZWROZXdsaW5lKSB7CisgICAgICAgICAgTGFzdCA9ICgqUFBFbmQpLT5MYXN0OworICAgICAgICAgICsrUFBFbmQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWZmZWN0c1Rva2VuUmFuZ2UoKkxpbmUtPkZpcnN0LCAqTGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSW5jbHVkZUxlYWRpbmdOZXdsaW5lcz0qL2ZhbHNlKSkgeworICAgICAgICAgIFNvbWVMaW5lQWZmZWN0ZWQgPSB0cnVlOworICAgICAgICAgIG1hcmtBbGxBc0FmZmVjdGVkKEksIFBQRW5kKTsKKyAgICAgICAgfQorICAgICAgICBJID0gUFBFbmQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAobm9uUFBMaW5lQWZmZWN0ZWQoTGluZSwgUHJldmlvdXNMaW5lKSkKKyAgICAgICAgU29tZUxpbmVBZmZlY3RlZCA9IHRydWU7CisKKyAgICAgIFByZXZpb3VzTGluZSA9IExpbmU7CisgICAgICArK0k7CisgICAgfQorICAgIHJldHVybiBTb21lTGluZUFmZmVjdGVkOworICB9CisKKyAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyICdMaW5lJyBpcyBhZmZlY3RlZCBieSB0aGUgU291cmNlUmFuZ2VzIGdpdmVuIGFzIGlucHV0LgorICAvLyBSZXR1cm5zIFxjIHRydWUgaWYgbGluZSBvciBvbmUgaWYgaXRzIGNoaWxkcmVuIGlzIGFmZmVjdGVkLgorICBib29sIG5vblBQTGluZUFmZmVjdGVkKEFubm90YXRlZExpbmUgKkxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQW5ub3RhdGVkTGluZSAqUHJldmlvdXNMaW5lKSB7CisgICAgYm9vbCBTb21lTGluZUFmZmVjdGVkID0gZmFsc2U7CisgICAgTGluZS0+Q2hpbGRyZW5BZmZlY3RlZCA9CisgICAgICAgIGNvbXB1dGVBZmZlY3RlZExpbmVzKExpbmUtPkNoaWxkcmVuLmJlZ2luKCksIExpbmUtPkNoaWxkcmVuLmVuZCgpKTsKKyAgICBpZiAoTGluZS0+Q2hpbGRyZW5BZmZlY3RlZCkKKyAgICAgIFNvbWVMaW5lQWZmZWN0ZWQgPSB0cnVlOworCisgICAgLy8gU3RvcmVzIHdoZXRoZXIgb25lIG9mIHRoZSBsaW5lJ3MgdG9rZW5zIGlzIGRpcmVjdGx5IGFmZmVjdGVkLgorICAgIGJvb2wgU29tZVRva2VuQWZmZWN0ZWQgPSBmYWxzZTsKKyAgICAvLyBTdG9yZXMgd2hldGhlciB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlIGxlYWRpbmcgbmV3bGluZXMgb2YgdGhlIG5leHQgdG9rZW4KKyAgICAvLyBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciBpdCB3YXMgYWZmZWN0ZWQuCisgICAgYm9vbCBJbmNsdWRlTGVhZGluZ05ld2xpbmVzID0gZmFsc2U7CisKKyAgICAvLyBTdG9yZXMgd2hldGhlciB0aGUgZmlyc3QgY2hpbGQgbGluZSBvZiBhbnkgb2YgdGhpcyBsaW5lJ3MgdG9rZW5zIGlzCisgICAgLy8gYWZmZWN0ZWQuCisgICAgYm9vbCBTb21lRmlyc3RDaGlsZEFmZmVjdGVkID0gZmFsc2U7CisKKyAgICBmb3IgKEZvcm1hdFRva2VuICpUb2sgPSBMaW5lLT5GaXJzdDsgVG9rOyBUb2sgPSBUb2stPk5leHQpIHsKKyAgICAgIC8vIERldGVybWluZSB3aGV0aGVyICdUb2snIHdhcyBhZmZlY3RlZC4KKyAgICAgIGlmIChhZmZlY3RzVG9rZW5SYW5nZSgqVG9rLCAqVG9rLCBJbmNsdWRlTGVhZGluZ05ld2xpbmVzKSkKKyAgICAgICAgU29tZVRva2VuQWZmZWN0ZWQgPSB0cnVlOworCisgICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZmlyc3QgY2hpbGQgb2YgJ1Rvaycgd2FzIGFmZmVjdGVkLgorICAgICAgaWYgKCFUb2stPkNoaWxkcmVuLmVtcHR5KCkgJiYgVG9rLT5DaGlsZHJlbi5mcm9udCgpLT5BZmZlY3RlZCkKKyAgICAgICAgU29tZUZpcnN0Q2hpbGRBZmZlY3RlZCA9IHRydWU7CisKKyAgICAgIEluY2x1ZGVMZWFkaW5nTmV3bGluZXMgPSBUb2stPkNoaWxkcmVuLmVtcHR5KCk7CisgICAgfQorCisgICAgLy8gV2FzIHRoaXMgbGluZSBtb3ZlZCwgaS5lLiBoYXMgaXQgcHJldmlvdXNseSBiZWVuIG9uIHRoZSBzYW1lIGxpbmUgYXMgYW4KKyAgICAvLyBhZmZlY3RlZCBsaW5lPworICAgIGJvb2wgTGluZU1vdmVkID0gUHJldmlvdXNMaW5lICYmIFByZXZpb3VzTGluZS0+QWZmZWN0ZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgIExpbmUtPkZpcnN0LT5OZXdsaW5lc0JlZm9yZSA9PSAwOworCisgICAgYm9vbCBJc0NvbnRpbnVlZENvbW1lbnQgPSBMaW5lLT5GaXJzdC0+aXModG9rOjpjb21tZW50KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZS0+Rmlyc3QtPk5leHQgPT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZS0+Rmlyc3QtPk5ld2xpbmVzQmVmb3JlIDwgMiAmJiBQcmV2aW91c0xpbmUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZpb3VzTGluZS0+QWZmZWN0ZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZpb3VzTGluZS0+TGFzdC0+aXModG9rOjpjb21tZW50KTsKKworICAgIGlmIChTb21lVG9rZW5BZmZlY3RlZCB8fCBTb21lRmlyc3RDaGlsZEFmZmVjdGVkIHx8IExpbmVNb3ZlZCB8fAorICAgICAgICBJc0NvbnRpbnVlZENvbW1lbnQpIHsKKyAgICAgIExpbmUtPkFmZmVjdGVkID0gdHJ1ZTsKKyAgICAgIFNvbWVMaW5lQWZmZWN0ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gU29tZUxpbmVBZmZlY3RlZDsKKyAgfQorCisgIC8vIE1hcmtzIGFsbCBsaW5lcyBiZXR3ZWVuIEkgYW5kIEUgYXMgd2VsbCBhcyBhbGwgdGhlaXIgY2hpbGRyZW4gYXMgYWZmZWN0ZWQuCisgIHZvaWQgbWFya0FsbEFzQWZmZWN0ZWQoU21hbGxWZWN0b3JJbXBsPEFubm90YXRlZExpbmUgKj46Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEFubm90YXRlZExpbmUgKj46Oml0ZXJhdG9yIEUpIHsKKyAgICB3aGlsZSAoSSAhPSBFKSB7CisgICAgICAoKkkpLT5BZmZlY3RlZCA9IHRydWU7CisgICAgICBtYXJrQWxsQXNBZmZlY3RlZCgoKkkpLT5DaGlsZHJlbi5iZWdpbigpLCAoKkkpLT5DaGlsZHJlbi5lbmQoKSk7CisgICAgICArK0k7CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSByYW5nZSBmcm9tICdGaXJzdCcgdG8gJ0xhc3QnIGludGVyc2VjdHMgd2l0aCBvbmUgb2YgdGhlCisgIC8vIGlucHV0IHJhbmdlcy4KKyAgYm9vbCBhZmZlY3RzVG9rZW5SYW5nZShjb25zdCBGb3JtYXRUb2tlbiAmRmlyc3QsIGNvbnN0IEZvcm1hdFRva2VuICZMYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZUxlYWRpbmdOZXdsaW5lcykgeworICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0ID0gRmlyc3QuV2hpdGVzcGFjZVJhbmdlLmdldEJlZ2luKCk7CisgICAgaWYgKCFJbmNsdWRlTGVhZGluZ05ld2xpbmVzKQorICAgICAgU3RhcnQgPSBTdGFydC5nZXRMb2NXaXRoT2Zmc2V0KEZpcnN0Lkxhc3ROZXdsaW5lT2Zmc2V0KTsKKyAgICBTb3VyY2VMb2NhdGlvbiBFbmQgPSBMYXN0LmdldFN0YXJ0T2ZOb25XaGl0ZXNwYWNlKCk7CisgICAgaWYgKExhc3QuVG9rZW5UZXh0LnNpemUoKSA+IDApCisgICAgICBFbmQgPSBFbmQuZ2V0TG9jV2l0aE9mZnNldChMYXN0LlRva2VuVGV4dC5zaXplKCkgLSAxKTsKKyAgICBDaGFyU291cmNlUmFuZ2UgUmFuZ2UgPSBDaGFyU291cmNlUmFuZ2U6OmdldENoYXJSYW5nZShTdGFydCwgRW5kKTsKKyAgICByZXR1cm4gYWZmZWN0c0NoYXJTb3VyY2VSYW5nZShSYW5nZSk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSBpbnB1dCByYW5nZXMgaW50ZXJzZWN0IHRoZSBsZWFkaW5nIGVtcHR5IGxpbmVzCisgIC8vIGJlZm9yZSAnVG9rJy4KKyAgYm9vbCBhZmZlY3RzTGVhZGluZ0VtcHR5TGluZXMoY29uc3QgRm9ybWF0VG9rZW4gJlRvaykgeworICAgIENoYXJTb3VyY2VSYW5nZSBFbXB0eUxpbmVSYW5nZSA9IENoYXJTb3VyY2VSYW5nZTo6Z2V0Q2hhclJhbmdlKAorICAgICAgICBUb2suV2hpdGVzcGFjZVJhbmdlLmdldEJlZ2luKCksCisgICAgICAgIFRvay5XaGl0ZXNwYWNlUmFuZ2UuZ2V0QmVnaW4oKS5nZXRMb2NXaXRoT2Zmc2V0KFRvay5MYXN0TmV3bGluZU9mZnNldCkpOworICAgIHJldHVybiBhZmZlY3RzQ2hhclNvdXJjZVJhbmdlKEVtcHR5TGluZVJhbmdlKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiAnUmFuZ2UnIGludGVyc2VjdHMgd2l0aCBvbmUgb2YgdGhlIGlucHV0IHJhbmdlcy4KKyAgYm9vbCBhZmZlY3RzQ2hhclNvdXJjZVJhbmdlKGNvbnN0IENoYXJTb3VyY2VSYW5nZSAmUmFuZ2UpIHsKKyAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxDaGFyU291cmNlUmFuZ2U+Ojpjb25zdF9pdGVyYXRvciBJID0gUmFuZ2VzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IFJhbmdlcy5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoIVNvdXJjZU1nci5pc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0KFJhbmdlLmdldEVuZCgpLCBJLT5nZXRCZWdpbigpKSAmJgorICAgICAgICAgICFTb3VyY2VNZ3IuaXNCZWZvcmVJblRyYW5zbGF0aW9uVW5pdChJLT5nZXRFbmQoKSwgUmFuZ2UuZ2V0QmVnaW4oKSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICBzdGF0aWMgYm9vbCBpbnB1dFVzZXNDUkxGKFN0cmluZ1JlZiBUZXh0KSB7CiAgICAgcmV0dXJuIFRleHQuY291bnQoJ1xyJykgKiAyID4gVGV4dC5jb3VudCgnXG4nKTsKICAgfQpAQCAtMTMzMCwxMiArMTY3NiwxMiBAQAogICAgICAgICBIYXNCaW5QYWNrZWRGdW5jdGlvbiB8fCAhSGFzT25lUGVyTGluZUZ1bmN0aW9uOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGNvbnN1bWVVbndyYXBwZWRMaW5lKGNvbnN0IFVud3JhcHBlZExpbmUgJlRoZUxpbmUpIHsKKyAgdm9pZCBjb25zdW1lVW53cmFwcGVkTGluZShjb25zdCBVbndyYXBwZWRMaW5lICZUaGVMaW5lKSBvdmVycmlkZSB7CiAgICAgYXNzZXJ0KCFVbndyYXBwZWRMaW5lcy5lbXB0eSgpKTsKICAgICBVbndyYXBwZWRMaW5lcy5iYWNrKCkucHVzaF9iYWNrKFRoZUxpbmUpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGZpbmlzaFJ1bigpIHsKKyAgdm9pZCBmaW5pc2hSdW4oKSBvdmVycmlkZSB7CiAgICAgVW53cmFwcGVkTGluZXMucHVzaF9iYWNrKFNtYWxsVmVjdG9yPFVud3JhcHBlZExpbmUsIDE2PigpKTsKICAgfQogCkBAIC0xNDA3LDExICsxNzUzLDI1IEBACiAgICAgInBhcmFtZXRlcnMsIGUuZy46XG4iCiAgICAgIiAgLXN0eWxlPVwie0Jhc2VkT25TdHlsZTogbGx2bSwgSW5kZW50V2lkdGg6IDh9XCIiOwogCi1Gb3JtYXRTdHlsZSBnZXRTdHlsZShTdHJpbmdSZWYgU3R5bGVOYW1lLCBTdHJpbmdSZWYgRmlsZU5hbWUpIHsKLSAgLy8gRmFsbGJhY2sgc3R5bGUgaW4gY2FzZSB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIGNhbid0IGRldGVybWluZSBhIHN0eWxlLgotICBTdHJpbmdSZWYgRmFsbGJhY2tTdHlsZSA9ICJMTFZNIjsKLSAgRm9ybWF0U3R5bGUgU3R5bGU7Ci0gIGdldFByZWRlZmluZWRTdHlsZShGYWxsYmFja1N0eWxlLCAmU3R5bGUpOworc3RhdGljIEZvcm1hdFN0eWxlOjpMYW5ndWFnZUtpbmQgZ2V0TGFuZ3VhZ2VCeUZpbGVOYW1lKFN0cmluZ1JlZiBGaWxlTmFtZSkgeworICBpZiAoRmlsZU5hbWUuZW5kc3dpdGhfbG93ZXIoIi5qcyIpKSB7CisgICAgcmV0dXJuIEZvcm1hdFN0eWxlOjpMS19KYXZhU2NyaXB0OworICB9IGVsc2UgaWYgKEZpbGVOYW1lLmVuZHN3aXRoX2xvd2VyKCIucHJvdG8iKSB8fAorICAgICAgICAgICAgIEZpbGVOYW1lLmVuZHN3aXRoX2xvd2VyKCIucHJvdG9kZXZlbCIpKSB7CisgICAgcmV0dXJuIEZvcm1hdFN0eWxlOjpMS19Qcm90bzsKKyAgfQorICByZXR1cm4gRm9ybWF0U3R5bGU6OkxLX0NwcDsKK30KKworRm9ybWF0U3R5bGUgZ2V0U3R5bGUoU3RyaW5nUmVmIFN0eWxlTmFtZSwgU3RyaW5nUmVmIEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZhbGxiYWNrU3R5bGUpIHsKKyAgRm9ybWF0U3R5bGUgU3R5bGUgPSBnZXRMTFZNU3R5bGUoKTsKKyAgU3R5bGUuTGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZUJ5RmlsZU5hbWUoRmlsZU5hbWUpOworICBpZiAoIWdldFByZWRlZmluZWRTdHlsZShGYWxsYmFja1N0eWxlLCBTdHlsZS5MYW5ndWFnZSwgJlN0eWxlKSkgeworICAgIGxsdm06OmVycnMoKSA8PCAiSW52YWxpZCBmYWxsYmFjayBzdHlsZSBcIiIgPDwgRmFsbGJhY2tTdHlsZQorICAgICAgICAgICAgICAgICA8PCAiXCIgdXNpbmcgTExWTSBzdHlsZVxuIjsKKyAgICByZXR1cm4gU3R5bGU7CisgIH0KIAogICBpZiAoU3R5bGVOYW1lLnN0YXJ0c3dpdGgoInsiKSkgewogICAgIC8vIFBhcnNlIFlBTUwvSlNPTiBzdHlsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCkBAIC0xNDIzLDEyICsxNzgzLDE0IEBACiAgIH0KIAogICBpZiAoIVN0eWxlTmFtZS5lcXVhbHNfbG93ZXIoImZpbGUiKSkgewotICAgIGlmICghZ2V0UHJlZGVmaW5lZFN0eWxlKFN0eWxlTmFtZSwgJlN0eWxlKSkKKyAgICBpZiAoIWdldFByZWRlZmluZWRTdHlsZShTdHlsZU5hbWUsIFN0eWxlLkxhbmd1YWdlLCAmU3R5bGUpKQogICAgICAgbGx2bTo6ZXJycygpIDw8ICJJbnZhbGlkIHZhbHVlIGZvciAtc3R5bGUsIHVzaW5nICIgPDwgRmFsbGJhY2tTdHlsZQogICAgICAgICAgICAgICAgICAgIDw8ICIgc3R5bGVcbiI7CiAgICAgcmV0dXJuIFN0eWxlOwogICB9CiAKKyAgLy8gTG9vayBmb3IgLmNsYW5nLWZvcm1hdC9fY2xhbmctZm9ybWF0IGZpbGUgaW4gdGhlIGZpbGUncyBwYXJlbnQgZGlyZWN0b3JpZXMuCisgIFNtYWxsU3RyaW5nPDEyOD4gVW5zdWl0YWJsZUNvbmZpZ0ZpbGVzOwogICBTbWFsbFN0cmluZzwxMjg+IFBhdGgoRmlsZU5hbWUpOwogICBsbHZtOjpzeXM6OmZzOjptYWtlX2Fic29sdXRlKFBhdGgpOwogICBmb3IgKFN0cmluZ1JlZiBEaXJlY3RvcnkgPSBQYXRoOyAhRGlyZWN0b3J5LmVtcHR5KCk7CkBAIC0xNDUzLDE2ICsxODE1LDIyIEBACiAgICAgfQogCiAgICAgaWYgKElzRmlsZSkgewotICAgICAgT3duaW5nUHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gVGV4dDsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IFRleHQ7CiAgICAgICBpZiAobGx2bTo6ZXJyb3JfY29kZSBlYyA9CiAgICAgICAgICAgICAgIGxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZShDb25maWdGaWxlLmNfc3RyKCksIFRleHQpKSB7CiAgICAgICAgIGxsdm06OmVycnMoKSA8PCBlYy5tZXNzYWdlKCkgPDwgIlxuIjsKLSAgICAgICAgY29udGludWU7CisgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgaWYgKGxsdm06OmVycm9yX2NvZGUgZWMgPSBwYXJzZUNvbmZpZ3VyYXRpb24oVGV4dC0+Z2V0QnVmZmVyKCksICZTdHlsZSkpIHsKKyAgICAgICAgaWYgKGVjID09IGxsdm06OmVycmM6Om5vdF9zdXBwb3J0ZWQpIHsKKyAgICAgICAgICBpZiAoIVVuc3VpdGFibGVDb25maWdGaWxlcy5lbXB0eSgpKQorICAgICAgICAgICAgVW5zdWl0YWJsZUNvbmZpZ0ZpbGVzLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICBVbnN1aXRhYmxlQ29uZmlnRmlsZXMuYXBwZW5kKENvbmZpZ0ZpbGUpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIGxsdm06OmVycnMoKSA8PCAiRXJyb3IgcmVhZGluZyAiIDw8IENvbmZpZ0ZpbGUgPDwgIjogIiA8PCBlYy5tZXNzYWdlKCkKICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiI7Ci0gICAgICAgIGNvbnRpbnVlOworICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIERFQlVHKGxsdm06OmRiZ3MoKSA8PCAiVXNpbmcgY29uZmlndXJhdGlvbiBmaWxlICIgPDwgQ29uZmlnRmlsZSA8PCAiXG4iKTsKICAgICAgIHJldHVybiBTdHlsZTsKQEAgLTE0NzAsNiArMTgzOCwxMSBAQAogICB9CiAgIGxsdm06OmVycnMoKSA8PCAiQ2FuJ3QgZmluZCB1c2FibGUgLmNsYW5nLWZvcm1hdCwgdXNpbmcgIiA8PCBGYWxsYmFja1N0eWxlCiAgICAgICAgICAgICAgICA8PCAiIHN0eWxlXG4iOworICBpZiAoIVVuc3VpdGFibGVDb25maWdGaWxlcy5lbXB0eSgpKSB7CisgICAgbGx2bTo6ZXJycygpIDw8ICJDb25maWd1cmF0aW9uIGZpbGUocykgZG8oZXMpIG5vdCBzdXBwb3J0ICIKKyAgICAgICAgICAgICAgICAgPDwgZ2V0TGFuZ3VhZ2VOYW1lKFN0eWxlLkxhbmd1YWdlKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgIDw8IFVuc3VpdGFibGVDb25maWdGaWxlcyA8PCAiXG4iOworICB9CiAgIHJldHVybiBTdHlsZTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL0Zvcm1hdC9Gb3JtYXRUb2tlbi5jcHAgYi9saWIvRm9ybWF0L0Zvcm1hdFRva2VuLmNwcAppbmRleCA4YWM3MDRhLi5jMTQ3ZGJiIDEwMDY0NAotLS0gYS9saWIvRm9ybWF0L0Zvcm1hdFRva2VuLmNwcAorKysgYi9saWIvRm9ybWF0L0Zvcm1hdFRva2VuLmNwcApAQCAtMjIsMTUgKzIyLDQ0IEBACiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIGZvcm1hdCB7CiAKKy8vIEZJWE1FOiBUaGlzIGlzIGNvcHkmcGFzdGVkIGZyb20gU2VtYS4gUHV0IGl0IGluIGEgY29tbW9uIHBsYWNlIGFuZCByZW1vdmUKKy8vIGR1cGxpY2F0aW9uLgorYm9vbCBGb3JtYXRUb2tlbjo6aXNTaW1wbGVUeXBlU3BlY2lmaWVyKCkgY29uc3QgeworICBzd2l0Y2ggKFRvay5nZXRLaW5kKCkpIHsKKyAgY2FzZSB0b2s6Omt3X3Nob3J0OgorICBjYXNlIHRvazo6a3dfbG9uZzoKKyAgY2FzZSB0b2s6Omt3X19faW50NjQ6CisgIGNhc2UgdG9rOjprd19fX2ludDEyODoKKyAgY2FzZSB0b2s6Omt3X3NpZ25lZDoKKyAgY2FzZSB0b2s6Omt3X3Vuc2lnbmVkOgorICBjYXNlIHRvazo6a3dfdm9pZDoKKyAgY2FzZSB0b2s6Omt3X2NoYXI6CisgIGNhc2UgdG9rOjprd19pbnQ6CisgIGNhc2UgdG9rOjprd19oYWxmOgorICBjYXNlIHRvazo6a3dfZmxvYXQ6CisgIGNhc2UgdG9rOjprd19kb3VibGU6CisgIGNhc2UgdG9rOjprd193Y2hhcl90OgorICBjYXNlIHRvazo6a3dfYm9vbDoKKyAgY2FzZSB0b2s6Omt3X19fdW5kZXJseWluZ190eXBlOgorICBjYXNlIHRvazo6YW5ub3RfdHlwZW5hbWU6CisgIGNhc2UgdG9rOjprd19jaGFyMTZfdDoKKyAgY2FzZSB0b2s6Omt3X2NoYXIzMl90OgorICBjYXNlIHRvazo6a3dfdHlwZW9mOgorICBjYXNlIHRvazo6a3dfZGVjbHR5cGU6CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKIFRva2VuUm9sZTo6flRva2VuUm9sZSgpIHt9CiAKIHZvaWQgVG9rZW5Sb2xlOjpwcmVjb21wdXRlRm9ybWF0dGluZ0luZm9zKGNvbnN0IEZvcm1hdFRva2VuICpUb2tlbikge30KIAotdW5zaWduZWQgQ29tbWFTZXBhcmF0ZWRMaXN0Ojpmb3JtYXQoTGluZVN0YXRlICZTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRpbnVhdGlvbkluZGVudGVyICpJbmRlbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRHJ5UnVuKSB7Ci0gIGlmICghU3RhdGUuTmV4dFRva2VuLT5QcmV2aW91cyB8fCAhU3RhdGUuTmV4dFRva2VuLT5QcmV2aW91cy0+UHJldmlvdXMgfHwKLSAgICAgIENvbW1hcy5zaXplKCkgPD0gMikKK3Vuc2lnbmVkIENvbW1hU2VwYXJhdGVkTGlzdDo6Zm9ybWF0QWZ0ZXJUb2tlbihMaW5lU3RhdGUgJlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRpbnVhdGlvbkluZGVudGVyICpJbmRlbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERyeVJ1bikgeworICBpZiAoIVN0YXRlLk5leHRUb2tlbi0+UHJldmlvdXMgfHwgIVN0YXRlLk5leHRUb2tlbi0+UHJldmlvdXMtPlByZXZpb3VzKQogICAgIHJldHVybiAwOwogCiAgIC8vIEVuc3VyZSB0aGF0IHdlIHN0YXJ0IG9uIHRoZSBvcGVuaW5nIGJyYWNlLgpAQCAtNDgsOCArNzcsMTEgQEAKIAogICAvLyBGaW5kIHRoZSBiZXN0IENvbHVtbkZvcm1hdCwgaS5lLiB0aGUgYmVzdCBudW1iZXIgb2YgY29sdW1ucyB0byB1c2UuCiAgIGNvbnN0IENvbHVtbkZvcm1hdCAqRm9ybWF0ID0gZ2V0Q29sdW1uRm9ybWF0KFJlbWFpbmluZ0NvZGVQb2ludHMpOworICAvLyBJZiBubyBDb2x1bW5Gb3JtYXQgY2FuIGJlIHVzZWQsIHRoZSBicmFjZWQgbGlzdCB3b3VsZCBnZW5lcmFsbHkgYmUKKyAgLy8gYmluLXBhY2tlZC4gQWRkIGEgc2V2ZXJlIHBlbmFsdHkgdG8gdGhpcyBzbyB0aGF0IGNvbHVtbiBsYXlvdXRzIGFyZQorICAvLyBwcmVmZXJyZWQgaWYgcG9zc2libGUuCiAgIGlmICghRm9ybWF0KQotICAgIHJldHVybiAwOworICAgIHJldHVybiAxMDAwMDsKIAogICAvLyBGb3JtYXQgdGhlIGVudGlyZSBsaXN0LgogICB1bnNpZ25lZCBQZW5hbHR5ID0gMDsKQEAgLTc5LDYgKzExMSwxNCBAQAogICByZXR1cm4gUGVuYWx0eTsKIH0KIAordW5zaWduZWQgQ29tbWFTZXBhcmF0ZWRMaXN0Ojpmb3JtYXRGcm9tVG9rZW4oTGluZVN0YXRlICZTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRpbnVhdGlvbkluZGVudGVyICpJbmRlbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRHJ5UnVuKSB7CisgIGlmIChIYXNOZXN0ZWRCcmFjZWRMaXN0KQorICAgIFN0YXRlLlN0YWNrLmJhY2soKS5Bdm9pZEJpblBhY2tpbmcgPSB0cnVlOworICByZXR1cm4gMDsKK30KKwogLy8gUmV0dXJucyB0aGUgbGVuZ3RocyBpbiBjb2RlIHBvaW50cyBiZXR3ZWVuIEJlZ2luIGFuZCBFbmQgKGJvdGggaW5jbHVkZWQpLAogLy8gYXNzdW1pbmcgdGhhdCB0aGUgZW50aXJlIHNlcXVlbmNlIGlzIHB1dCBvbiBhIHNpbmdsZSBsaW5lLgogc3RhdGljIHVuc2lnbmVkIENvZGVQb2ludHNCZXR3ZWVuKGNvbnN0IEZvcm1hdFRva2VuICpCZWdpbiwKQEAgLTk5LDcgKzEzOSw2IEBACiAgIC8vIHRyYWlsaW5nIGNvbW1lbnRzIHdoaWNoIGFyZSBvdGhlcndpc2UgaWdub3JlZCBmb3IgY29sdW1uIGFsaWdubWVudC4KICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IEVuZE9mTGluZUl0ZW1MZW5ndGg7CiAKLSAgYm9vbCBIYXNOZXN0ZWRCcmFjZWRMaXN0ID0gZmFsc2U7CiAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBDb21tYXMuc2l6ZSgpICsgMTsgaSAhPSBlOyArK2kpIHsKICAgICAvLyBTa2lwIGNvbW1lbnRzIG9uIHRoZWlyIG93biBsaW5lLgogICAgIHdoaWxlIChJdGVtQmVnaW4tPkhhc1VuZXNjYXBlZE5ld2xpbmUgJiYgSXRlbUJlZ2luLT5pc1RyYWlsaW5nQ29tbWVudCgpKQpAQCAtMTM5LDYgKzE3OCwxMyBAQAogICAgIEl0ZW1CZWdpbiA9IEl0ZW1FbmQtPk5leHQ7CiAgIH0KIAorICAvLyBJZiB0aGlzIGRvZXNuJ3QgaGF2ZSBhIG5lc3RlZCBsaXN0LCB3ZSByZXF1aXJlIGF0IGxlYXN0IDYgZWxlbWVudHMgaW4gb3JkZXIKKyAgLy8gY3JlYXRlIGEgY29sdW1uIGxheW91dC4gSWYgaXQgaGFzIGEgbmVzdGVkIGxpc3QsIGNvbHVtbiBsYXlvdXQgZW5zdXJlcyBvbmUKKyAgLy8gbGlzdCBlbGVtZW50IHBlciBsaW5lLgorICBpZiAoSGFzTmVzdGVkQnJhY2VkTGlzdCB8fCBDb21tYXMuc2l6ZSgpIDwgNSB8fAorICAgICAgVG9rZW4tPk5lc3RpbmdMZXZlbCAhPSAwKQorICAgIHJldHVybjsKKwogICAvLyBXZSBjYW4gbmV2ZXIgcGxhY2UgbW9yZSB0aGFuIENvbHVtbkxpbWl0IC8gMyBpdGVtcyBpbiBhIHJvdyAoYmVjYXVzZSBvZiB0aGUKICAgLy8gc3BhY2VzIGFuZCB0aGUgY29tbWEpLgogICBmb3IgKHVuc2lnbmVkIENvbHVtbnMgPSAxOyBDb2x1bW5zIDw9IFN0eWxlLkNvbHVtbkxpbWl0IC8gMzsgKytDb2x1bW5zKSB7CkBAIC0xNzUsMTEgKzIyMSw2IEBACiAgICAgaWYgKEZvcm1hdC5Ub3RhbFdpZHRoID4gU3R5bGUuQ29sdW1uTGltaXQpCiAgICAgICBjb250aW51ZTsKIAotICAgIC8vIElmIHRoaXMgYnJhY2VkIGxpc3QgaGFzIG5lc3RlZCBicmFjZWQgbGlzdCwgd2UgZm9ybWF0IGl0IGVpdGhlciB3aXRoIG9uZQotICAgIC8vIGVsZW1lbnQgcGVyIGxpbmUgb3Igd2l0aCBhbGwgZWxlbWVudHMgb24gb25lIGxpbmUuCi0gICAgaWYgKEhhc05lc3RlZEJyYWNlZExpc3QgJiYgQ29sdW1ucyA+IDEgJiYgRm9ybWF0LkxpbmVDb3VudCA+IDEpCi0gICAgICBjb250aW51ZTsKLQogICAgIEZvcm1hdHMucHVzaF9iYWNrKEZvcm1hdCk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9Gb3JtYXQvRm9ybWF0VG9rZW4uaCBiL2xpYi9Gb3JtYXQvRm9ybWF0VG9rZW4uaAppbmRleCAyMTQ1ZWUyLi5hNWFhYTZmIDEwMDY0NAotLS0gYS9saWIvRm9ybWF0L0Zvcm1hdFRva2VuLmgKKysrIGIvbGliL0Zvcm1hdC9Gb3JtYXRUb2tlbi5oCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlcmF0b3JQcmVjZWRlbmNlLmgiCiAjaW5jbHVkZSAiY2xhbmcvRm9ybWF0L0Zvcm1hdC5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9MZXhlci5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGNsYW5nIHsKIG5hbWVzcGFjZSBmb3JtYXQgewpAQCAtMjcsNiArMjcsNyBAQAogZW51bSBUb2tlblR5cGUgewogICBUVF9BcnJheUluaXRpYWxpemVyTFNxdWFyZSwKICAgVFRfQXJyYXlTdWJzY3JpcHRMU3F1YXJlLAorICBUVF9BdHRyaWJ1dGVQYXJlbiwKICAgVFRfQmluYXJ5T3BlcmF0b3IsCiAgIFRUX0JpdEZpZWxkQ29sb24sCiAgIFRUX0Jsb2NrQ29tbWVudCwKQEAgLTM5LDEwICs0MCwxMiBAQAogICBUVF9JbXBsaWNpdFN0cmluZ0xpdGVyYWwsCiAgIFRUX0lubGluZUFTTUNvbG9uLAogICBUVF9Jbmhlcml0YW5jZUNvbG9uLAorICBUVF9GdW5jdGlvbkxCcmFjZSwKICAgVFRfRnVuY3Rpb25UeXBlTFBhcmVuLAogICBUVF9MYW1iZGFMU3F1YXJlLAogICBUVF9MaW5lQ29tbWVudCwKICAgVFRfT2JqQ0Jsb2NrTFBhcmVuLAorICBUVF9PYmpDQmxvY2tMQnJhY2UsCiAgIFRUX09iakNEZWNsLAogICBUVF9PYmpDRm9ySW4sCiAgIFRUX09iakNNZXRob2RFeHByLApAQCAtNTcsNiArNjAsNyBAQAogICBUVF9TdGFydE9mTmFtZSwKICAgVFRfVGVtcGxhdGVDbG9zZXIsCiAgIFRUX1RlbXBsYXRlT3BlbmVyLAorICBUVF9UcmFpbGluZ0Fubm90YXRpb24sCiAgIFRUX1RyYWlsaW5nUmV0dXJuQXJyb3csCiAgIFRUX1RyYWlsaW5nVW5hcnlPcGVyYXRvciwKICAgVFRfVW5hcnlPcGVyYXRvciwKQEAgLTg3LDcgKzkxLDcgQEAKIGNsYXNzIEFubm90YXRlZExpbmU7CiAKIC8vLyBcYnJpZWYgQSB3cmFwcGVyIGFyb3VuZCBhIFxjIFRva2VuIHN0b3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0vLy8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZWRpbmcgaXQuCisvLy8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyBpdC4KIHN0cnVjdCBGb3JtYXRUb2tlbiB7CiAgIEZvcm1hdFRva2VuKCkKICAgICAgIDogTmV3bGluZXNCZWZvcmUoMCksIEhhc1VuZXNjYXBlZE5ld2xpbmUoZmFsc2UpLCBMYXN0TmV3bGluZU9mZnNldCgwKSwKQEAgLTk2LDExICsxMDAsMTEgQEAKICAgICAgICAgQmxvY2tLaW5kKEJLX1Vua25vd24pLCBUeXBlKFRUX1Vua25vd24pLCBTcGFjZXNSZXF1aXJlZEJlZm9yZSgwKSwKICAgICAgICAgQ2FuQnJlYWtCZWZvcmUoZmFsc2UpLCBDbG9zZXNUZW1wbGF0ZURlY2xhcmF0aW9uKGZhbHNlKSwKICAgICAgICAgUGFyYW1ldGVyQ291bnQoMCksIFBhY2tpbmdLaW5kKFBQS19JbmNvbmNsdXNpdmUpLCBUb3RhbExlbmd0aCgwKSwKLSAgICAgICAgVW5icmVha2FibGVUYWlsTGVuZ3RoKDApLCBCaW5kaW5nU3RyZW5ndGgoMCksIFNwbGl0UGVuYWx0eSgwKSwKLSAgICAgICAgTG9uZ2VzdE9iakNTZWxlY3Rvck5hbWUoMCksIEZha2VSUGFyZW5zKDApLAorICAgICAgICBVbmJyZWFrYWJsZVRhaWxMZW5ndGgoMCksIEJpbmRpbmdTdHJlbmd0aCgwKSwgTmVzdGluZ0xldmVsKDApLAorICAgICAgICBTcGxpdFBlbmFsdHkoMCksIExvbmdlc3RPYmpDU2VsZWN0b3JOYW1lKDApLCBGYWtlUlBhcmVucygwKSwKICAgICAgICAgU3RhcnRzQmluYXJ5RXhwcmVzc2lvbihmYWxzZSksIEVuZHNCaW5hcnlFeHByZXNzaW9uKGZhbHNlKSwKICAgICAgICAgTGFzdEluQ2hhaW5PZkNhbGxzKGZhbHNlKSwgUGFydE9mTXVsdGlWYXJpYWJsZURlY2xTdG10KGZhbHNlKSwKLSAgICAgICAgTWF0Y2hpbmdQYXJlbihOVUxMKSwgUHJldmlvdXMoTlVMTCksIE5leHQoTlVMTCksCisgICAgICAgIElzRm9yRWFjaE1hY3JvKGZhbHNlKSwgTWF0Y2hpbmdQYXJlbihOVUxMKSwgUHJldmlvdXMoTlVMTCksIE5leHQoTlVMTCksCiAgICAgICAgIERlY2lzaW9uKEZEX1VuZm9ybWF0dGVkKSwgRmluYWxpemVkKGZhbHNlKSB7fQogCiAgIC8vLyBcYnJpZWYgVGhlIFxjIFRva2VuLgpAQCAtMTE2LDcgKzEyMCw3IEBACiAgIC8vLyBUb2tlbi4KICAgYm9vbCBIYXNVbmVzY2FwZWROZXdsaW5lOwogCi0gIC8vLyBcYnJpZWYgVGhlIHJhbmdlIG9mIHRoZSB3aGl0ZXNwYWNlIGltbWVkaWF0ZWx5IHByZWNlZWRpbmcgdGhlIFxjIFRva2VuLgorICAvLy8gXGJyaWVmIFRoZSByYW5nZSBvZiB0aGUgd2hpdGVzcGFjZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlIFxjIFRva2VuLgogICBTb3VyY2VSYW5nZSBXaGl0ZXNwYWNlUmFuZ2U7CiAKICAgLy8vIFxicmllZiBUaGUgb2Zmc2V0IGp1c3QgcGFzdCB0aGUgbGFzdCAnXG4nIGluIHRoaXMgdG9rZW4ncyBsZWFkaW5nCkBAIC0xODQsNyArMTg4LDcgQEAKIAogICAvLy8gXGJyaWVmIEEgdG9rZW4gY2FuIGhhdmUgYSBzcGVjaWFsIHJvbGUgdGhhdCBjYW4gY2FycnkgZXh0cmEgaW5mb3JtYXRpb24KICAgLy8vIGFib3V0IHRoZSB0b2tlbidzIGZvcm1hdHRpbmcuCi0gIGxsdm06Ok93bmluZ1B0cjxUb2tlblJvbGU+IFJvbGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxUb2tlblJvbGU+IFJvbGU7CiAKICAgLy8vIFxicmllZiBJZiB0aGlzIGlzIGFuIG9wZW5pbmcgcGFyZW50aGVzaXMsIGhvdyBhcmUgdGhlIHBhcmFtZXRlcnMgcGFja2VkPwogICBQYXJhbWV0ZXJQYWNraW5nS2luZCBQYWNraW5nS2luZDsKQEAgLTIwNiwxMSArMjEwLDE4IEBACiAgIC8vLyBvcGVyYXRvciBwcmVjZWRlbmNlLCBwYXJlbnRoZXNpcyBuZXN0aW5nLCBldGMuCiAgIHVuc2lnbmVkIEJpbmRpbmdTdHJlbmd0aDsKIAorICAvLy8gXGJyaWVmIFRoZSBuZXN0aW5nIGxldmVsIG9mIHRoaXMgdG9rZW4sIGkuZS4gdGhlIG51bWJlciBvZiBzdXJyb3VuZGluZyAoKSwKKyAgLy8vIFtdLCB7fSBvciA8Pi4KKyAgdW5zaWduZWQgTmVzdGluZ0xldmVsOworCiAgIC8vLyBcYnJpZWYgUGVuYWx0eSBmb3IgaW5zZXJ0aW5nIGEgbGluZSBicmVhayBiZWZvcmUgdGhpcyB0b2tlbi4KICAgdW5zaWduZWQgU3BsaXRQZW5hbHR5OwogCiAgIC8vLyBcYnJpZWYgSWYgdGhpcyBpcyB0aGUgZmlyc3QgT2JqQyBzZWxlY3RvciBuYW1lIGluIGFuIE9iakMgbWV0aG9kCiAgIC8vLyBkZWZpbml0aW9uIG9yIGNhbGwsIHRoaXMgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBuYW1lLgorICAvLy8KKyAgLy8vIFRoaXMgYmVpbmcgc2V0IHRvIDAgbWVhbnMgdGhhdCB0aGUgc2VsZWN0b3JzIHNob3VsZCBub3QgYmUgY29sb24tYWxpZ25lZCwKKyAgLy8vIGUuZy4gYmVjYXVzZSBzZXZlcmFsIG9mIHRoZW0gYXJlIGJsb2NrLXR5cGUuCiAgIHVuc2lnbmVkIExvbmdlc3RPYmpDU2VsZWN0b3JOYW1lOwogCiAgIC8vLyBcYnJpZWYgU3RvcmVzIHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgZmFrZSBwYXJlbnRoZXNlcyBhbmQgdGhlCkBAIC0yMzYsNiArMjQ3LDkgQEAKICAgLy8vIE9ubHkgc2V0IGlmIFxjIFR5cGUgPT0gXGMgVFRfU3RhcnRPZk5hbWUuCiAgIGJvb2wgUGFydE9mTXVsdGlWYXJpYWJsZURlY2xTdG10OwogCisgIC8vLyBcYnJpZWYgSXMgdGhpcyBhIGZvcmVhY2ggbWFjcm8/CisgIGJvb2wgSXNGb3JFYWNoTWFjcm87CisKICAgYm9vbCBpcyh0b2s6OlRva2VuS2luZCBLaW5kKSBjb25zdCB7IHJldHVybiBUb2suaXMoS2luZCk7IH0KIAogICBib29sIGlzT25lT2YodG9rOjpUb2tlbktpbmQgSzEsIHRvazo6VG9rZW5LaW5kIEsyKSBjb25zdCB7CkBAIC0yNjAsNiArMjc0LDcgQEAKICAgfQogCiAgIGJvb2wgaXNOb3QodG9rOjpUb2tlbktpbmQgS2luZCkgY29uc3QgeyByZXR1cm4gVG9rLmlzTm90KEtpbmQpOyB9CisgIGJvb2wgaXNTdHJpbmdMaXRlcmFsKCkgY29uc3QgeyByZXR1cm4gdG9rOjppc1N0cmluZ0xpdGVyYWwoVG9rLmdldEtpbmQoKSk7IH0KIAogICBib29sIGlzT2JqQ0F0S2V5d29yZCh0b2s6Ok9iakNLZXl3b3JkS2luZCBLaW5kKSBjb25zdCB7CiAgICAgcmV0dXJuIFRvay5pc09iakNBdEtleXdvcmQoS2luZCk7CkBAIC0yNzAsNiArMjg1LDkgQEAKICAgICAgICAgICAgKCFDb2xvblJlcXVpcmVkIHx8IChOZXh0ICYmIE5leHQtPmlzKHRvazo6Y29sb24pKSk7CiAgIH0KIAorICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSB0b2tlbiBpcyBhIHNpbXBsZS10eXBlLXNwZWNpZmllci4KKyAgYm9vbCBpc1NpbXBsZVR5cGVTcGVjaWZpZXIoKSBjb25zdDsKKwogICBib29sIGlzT2JqQ0FjY2Vzc1NwZWNpZmllcigpIGNvbnN0IHsKICAgICByZXR1cm4gaXModG9rOjphdCkgJiYgTmV4dCAmJiAoTmV4dC0+aXNPYmpDQXRLZXl3b3JkKHRvazo6b2JqY19wdWJsaWMpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHQtPmlzT2JqQ0F0S2V5d29yZCh0b2s6Om9iamNfcHJvdGVjdGVkKSB8fApAQCAtMzg4LDEwICs0MDYsMjEgQEAKIAogICAvLy8gXGJyaWVmIEFwcGx5IHRoZSBzcGVjaWFsIGZvcm1hdHRpbmcgdGhhdCB0aGUgZ2l2ZW4gcm9sZSBkZW1hbmRzLgogICAvLy8KKyAgLy8vIEFzc3VtZXMgdGhhdCB0aGUgdG9rZW4gaGF2aW5nIHRoaXMgcm9sZSBpcyBhbHJlYWR5IGZvcm1hdHRlZC4KKyAgLy8vCiAgIC8vLyBDb250aW51ZXMgZm9ybWF0dGluZyBmcm9tIFxwIFN0YXRlIGxlYXZpbmcgaW5kZW50YXRpb24gdG8gXHAgSW5kZW50ZXIgYW5kCiAgIC8vLyByZXR1cm5zIHRoZSB0b3RhbCBwZW5hbHR5IHRoYXQgdGhpcyBmb3JtYXR0aW5nIGluY3Vycy4KLSAgdmlydHVhbCB1bnNpZ25lZCBmb3JtYXQoTGluZVN0YXRlICZTdGF0ZSwgQ29udGludWF0aW9uSW5kZW50ZXIgKkluZGVudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERyeVJ1bikgeworICB2aXJ0dWFsIHVuc2lnbmVkIGZvcm1hdEZyb21Ub2tlbihMaW5lU3RhdGUgJlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250aW51YXRpb25JbmRlbnRlciAqSW5kZW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRHJ5UnVuKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gXGJyaWVmIFNhbWUgYXMgXGMgZm9ybWF0RnJvbVRva2VuLCBidXQgYXNzdW1lcyB0aGF0IHRoZSBmaXJzdCB0b2tlbiBoYXMKKyAgLy8vIGFscmVhZHkgYmVlbiBzZXQgdGhlcmVieSBkZWNpZGluZyBvbiB0aGUgZmlyc3QgbGluZSBicmVhay4KKyAgdmlydHVhbCB1bnNpZ25lZCBmb3JtYXRBZnRlclRva2VuKExpbmVTdGF0ZSAmU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250aW51YXRpb25JbmRlbnRlciAqSW5kZW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERyeVJ1bikgewogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTQwNCwxNSArNDMzLDE5IEBACiAKIGNsYXNzIENvbW1hU2VwYXJhdGVkTGlzdCA6IHB1YmxpYyBUb2tlblJvbGUgewogcHVibGljOgotICBDb21tYVNlcGFyYXRlZExpc3QoY29uc3QgRm9ybWF0U3R5bGUgJlN0eWxlKSA6IFRva2VuUm9sZShTdHlsZSkge30KKyAgQ29tbWFTZXBhcmF0ZWRMaXN0KGNvbnN0IEZvcm1hdFN0eWxlICZTdHlsZSkKKyAgICAgIDogVG9rZW5Sb2xlKFN0eWxlKSwgSGFzTmVzdGVkQnJhY2VkTGlzdChmYWxzZSkge30KIAotICB2aXJ0dWFsIHZvaWQgcHJlY29tcHV0ZUZvcm1hdHRpbmdJbmZvcyhjb25zdCBGb3JtYXRUb2tlbiAqVG9rZW4pOworICB2b2lkIHByZWNvbXB1dGVGb3JtYXR0aW5nSW5mb3MoY29uc3QgRm9ybWF0VG9rZW4gKlRva2VuKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHVuc2lnbmVkIGZvcm1hdChMaW5lU3RhdGUgJlN0YXRlLCBDb250aW51YXRpb25JbmRlbnRlciAqSW5kZW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRHJ5UnVuKTsKKyAgdW5zaWduZWQgZm9ybWF0QWZ0ZXJUb2tlbihMaW5lU3RhdGUgJlN0YXRlLCBDb250aW51YXRpb25JbmRlbnRlciAqSW5kZW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEcnlSdW4pIG92ZXJyaWRlOworCisgIHVuc2lnbmVkIGZvcm1hdEZyb21Ub2tlbihMaW5lU3RhdGUgJlN0YXRlLCBDb250aW51YXRpb25JbmRlbnRlciAqSW5kZW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERyeVJ1bikgb3ZlcnJpZGU7CiAKICAgLy8vIFxicmllZiBBZGRzIFxwIFRva2VuIGFzIHRoZSBuZXh0IGNvbW1hIHRvIHRoZSBcYyBDb21tYVNlcGFyYXRlZCBsaXN0LgotICB2aXJ0dWFsIHZvaWQgQ29tbWFGb3VuZChjb25zdCBGb3JtYXRUb2tlbiAqVG9rZW4pIHsgQ29tbWFzLnB1c2hfYmFjayhUb2tlbik7IH0KKyAgdm9pZCBDb21tYUZvdW5kKGNvbnN0IEZvcm1hdFRva2VuICpUb2tlbikgb3ZlcnJpZGUgeyBDb21tYXMucHVzaF9iYWNrKFRva2VuKTt9CiAKIHByaXZhdGU6CiAgIC8vLyBcYnJpZWYgQSBzdHJ1Y3QgdGhhdCBob2xkcyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZm9ybWF0IGEgZ2l2ZW4gbGlzdCB3aXRoCkBAIC00NDQsNiArNDc3LDggQEAKIAogICAvLy8gXGJyaWVmIFByZWNvbXB1dGVkIGZvcm1hdHMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGhpcyBsaXN0LgogICBTbWFsbFZlY3RvcjxDb2x1bW5Gb3JtYXQsIDQ+IEZvcm1hdHM7CisKKyAgYm9vbCBIYXNOZXN0ZWRCcmFjZWRMaXN0OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgZm9ybWF0CmRpZmYgLS1naXQgYS9saWIvRm9ybWF0L1Rva2VuQW5ub3RhdG9yLmNwcCBiL2xpYi9Gb3JtYXQvVG9rZW5Bbm5vdGF0b3IuY3BwCmluZGV4IDA3NGUxZDcuLjAwMzQyMzUgMTAwNjQ0Ci0tLSBhL2xpYi9Gb3JtYXQvVG9rZW5Bbm5vdGF0b3IuY3BwCisrKyBiL2xpYi9Gb3JtYXQvVG9rZW5Bbm5vdGF0b3IuY3BwCkBAIC0zNCw2ICszNCw3IEBACiAgICAgICA6IFN0eWxlKFN0eWxlKSwgTGluZShMaW5lKSwgQ3VycmVudFRva2VuKExpbmUuRmlyc3QpLAogICAgICAgICBLZXl3b3JkVmlydHVhbEZvdW5kKGZhbHNlKSwgQXV0b0ZvdW5kKGZhbHNlKSwgSWRlbnRfaW4oSWRlbnRfaW4pIHsKICAgICBDb250ZXh0cy5wdXNoX2JhY2soQ29udGV4dCh0b2s6OnVua25vd24sIDEsIC8qSXNFeHByZXNzaW9uPSovZmFsc2UpKTsKKyAgICByZXNldFRva2VuTWV0YWRhdGEoQ3VycmVudFRva2VuKTsKICAgfQogCiBwcml2YXRlOgpAQCAtNDMsNiArNDQsMTEgQEAKICAgICBTY29wZWRDb250ZXh0Q3JlYXRvciBDb250ZXh0Q3JlYXRvcigqdGhpcywgdG9rOjpsZXNzLCAxMCk7CiAgICAgRm9ybWF0VG9rZW4gKkxlZnQgPSBDdXJyZW50VG9rZW4tPlByZXZpb3VzOwogICAgIENvbnRleHRzLmJhY2soKS5Jc0V4cHJlc3Npb24gPSBmYWxzZTsKKyAgICAvLyBJZiB0aGVyZSdzIGEgdGVtcGxhdGUga2V5d29yZCBiZWZvcmUgdGhlIG9wZW5pbmcgYW5nbGUgYnJhY2tldCwgdGhpcyBpcyBhCisgICAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyLCBub3QgYW4gYXJndW1lbnQuCisgICAgQ29udGV4dHMuYmFjaygpLkluVGVtcGxhdGVBcmd1bWVudCA9CisgICAgICAgIExlZnQtPlByZXZpb3VzICE9IE5VTEwgJiYgTGVmdC0+UHJldmlvdXMtPlRvay5pc05vdCh0b2s6Omt3X3RlbXBsYXRlKTsKKwogICAgIHdoaWxlIChDdXJyZW50VG9rZW4gIT0gTlVMTCkgewogICAgICAgaWYgKEN1cnJlbnRUb2tlbi0+aXModG9rOjpncmVhdGVyKSkgewogICAgICAgICBMZWZ0LT5NYXRjaGluZ1BhcmVuID0gQ3VycmVudFRva2VuOwpAQCAtNjEsNyArNjcsMTEgQEAKICAgICAgIC8vIHBhcmFtZXRlcnMuCiAgICAgICAvLyBGSVhNRTogVGhpcyBpcyBnZXR0aW5nIG91dCBvZiBoYW5kLCB3cml0ZSBhIGRlY2VudCBwYXJzZXIuCiAgICAgICBpZiAoQ3VycmVudFRva2VuLT5QcmV2aW91cy0+aXNPbmVPZih0b2s6OnBpcGVwaXBlLCB0b2s6OmFtcGFtcCkgJiYKLSAgICAgICAgICAoQ3VycmVudFRva2VuLT5QcmV2aW91cy0+VHlwZSA9PSBUVF9CaW5hcnlPcGVyYXRvciB8fAorICAgICAgICAgICgoQ3VycmVudFRva2VuLT5QcmV2aW91cy0+VHlwZSA9PSBUVF9CaW5hcnlPcGVyYXRvciAmJgorICAgICAgICAgICAgLy8gVG9wbGV2ZWwgYm9vbCBleHByZXNzaW9ucyBkbyBub3QgbWFrZSBsb3RzIG9mIHNlbnNlOworICAgICAgICAgICAgLy8gSWYgd2UncmUgb24gdGhlIHRvcCBsZXZlbCwgaXQgY29udGFpbnMgb25seSB0aGUgYmFzZSBjb250ZXh0IGFuZAorICAgICAgICAgICAgLy8gdGhlIGNvbnRleHQgZm9yIHRoZSBjdXJyZW50IG9wZW5pbmcgYW5nbGUgYnJhY2tldC4KKyAgICAgICAgICAgIENvbnRleHRzLnNpemUoKSA+IDIpIHx8CiAgICAgICAgICAgIENvbnRleHRzW0NvbnRleHRzLnNpemUoKSAtIDJdLklzRXhwcmVzc2lvbikgJiYKICAgICAgICAgICBMaW5lLkZpcnN0LT5pc05vdCh0b2s6Omt3X3RlbXBsYXRlKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtODQsNyArOTQsNyBAQAogICAgIGJvb2wgU3RhcnRzT2JqQ01ldGhvZEV4cHIgPSBmYWxzZTsKICAgICBGb3JtYXRUb2tlbiAqTGVmdCA9IEN1cnJlbnRUb2tlbi0+UHJldmlvdXM7CiAgICAgaWYgKEN1cnJlbnRUb2tlbi0+aXModG9rOjpjYXJldCkpIHsKLSAgICAgIC8vIF4oIHN0YXJ0cyBhIGJsb2NrLgorICAgICAgLy8gKF4gY2FuIHN0YXJ0IGEgYmxvY2sgdHlwZS4KICAgICAgIExlZnQtPlR5cGUgPSBUVF9PYmpDQmxvY2tMUGFyZW47CiAgICAgfSBlbHNlIGlmIChGb3JtYXRUb2tlbiAqTWF5YmVTZWwgPSBMZWZ0LT5QcmV2aW91cykgewogICAgICAgLy8gQHNlbGVjdG9yKCBzdGFydHMgYSBzZWxlY3Rvci4KQEAgLTk0LDggKzEwNCwxMCBAQAogICAgICAgfQogICAgIH0KIAotICAgIGlmIChMZWZ0LT5QcmV2aW91cyAmJiBMZWZ0LT5QcmV2aW91cy0+aXNPbmVPZih0b2s6Omt3X3N0YXRpY19hc3NlcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6a3dfaWYsIHRvazo6a3dfd2hpbGUpKSB7CisgICAgaWYgKExlZnQtPlByZXZpb3VzICYmCisgICAgICAgIChMZWZ0LT5QcmV2aW91cy0+aXNPbmVPZih0b2s6Omt3X3N0YXRpY19hc3NlcnQsIHRvazo6a3dfaWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6Omt3X3doaWxlLCB0b2s6OmxfcGFyZW4sIHRvazo6Y29tbWEpIHx8CisgICAgICAgICBMZWZ0LT5QcmV2aW91cy0+VHlwZSA9PSBUVF9CaW5hcnlPcGVyYXRvcikpIHsKICAgICAgIC8vIHN0YXRpY19hc3NlcnQsIGlmIGFuZCB3aGlsZSB1c3VhbGx5IGNvbnRhaW4gZXhwcmVzc2lvbnMuCiAgICAgICBDb250ZXh0cy5iYWNrKCkuSXNFeHByZXNzaW9uID0gdHJ1ZTsKICAgICB9IGVsc2UgaWYgKExlZnQtPlByZXZpb3VzICYmIExlZnQtPlByZXZpb3VzLT5pcyh0b2s6OnJfc3F1YXJlKSAmJgpAQCAtMTAzLDYgKzExNSwxNSBAQAogICAgICAgICAgICAgICAgTGVmdC0+UHJldmlvdXMtPk1hdGNoaW5nUGFyZW4tPlR5cGUgPT0gVFRfTGFtYmRhTFNxdWFyZSkgewogICAgICAgLy8gVGhpcyBpcyBhIHBhcmFtZXRlciBsaXN0IG9mIGEgbGFtYmRhIGV4cHJlc3Npb24uCiAgICAgICBDb250ZXh0cy5iYWNrKCkuSXNFeHByZXNzaW9uID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChDb250ZXh0c1tDb250ZXh0cy5zaXplKCkgLSAyXS5DYXJldEZvdW5kKSB7CisgICAgICAvLyBUaGlzIGlzIHRoZSBwYXJhbWV0ZXIgbGlzdCBvZiBhbiBPYmpDIGJsb2NrLgorICAgICAgQ29udGV4dHMuYmFjaygpLklzRXhwcmVzc2lvbiA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoTGVmdC0+UHJldmlvdXMgJiYgTGVmdC0+UHJldmlvdXMtPmlzKHRvazo6a3dfX19hdHRyaWJ1dGUpKSB7CisgICAgICBMZWZ0LT5UeXBlID0gVFRfQXR0cmlidXRlUGFyZW47CisgICAgfSBlbHNlIGlmIChMZWZ0LT5QcmV2aW91cyAmJiBMZWZ0LT5QcmV2aW91cy0+SXNGb3JFYWNoTWFjcm8pIHsKKyAgICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCB0byBhIGZvcmVhY2ggbWFjcm8gaXMgYSBkZWNsYXJhdGlvbi4KKyAgICAgIENvbnRleHRzLmJhY2soKS5Jc0ZvckVhY2hNYWNybyA9IHRydWU7CisgICAgICBDb250ZXh0cy5iYWNrKCkuSXNFeHByZXNzaW9uID0gZmFsc2U7CiAgICAgfQogCiAgICAgaWYgKFN0YXJ0c09iakNNZXRob2RFeHByKSB7CkBAIC0xNTMsNiArMTc0LDkgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoTGVmdC0+VHlwZSA9PSBUVF9BdHRyaWJ1dGVQYXJlbikKKyAgICAgICAgICBDdXJyZW50VG9rZW4tPlR5cGUgPSBUVF9BdHRyaWJ1dGVQYXJlbjsKKwogICAgICAgICBpZiAoIUhhc011bHRpcGxlTGluZXMpCiAgICAgICAgICAgTGVmdC0+UGFja2luZ0tpbmQgPSBQUEtfSW5jb25jbHVzaXZlOwogICAgICAgICBlbHNlIGlmIChIYXNNdWx0aXBsZVBhcmFtZXRlcnNPbkFMaW5lKQpAQCAtMTY1LDExICsxODksMTYgQEAKICAgICAgIH0KICAgICAgIGlmIChDdXJyZW50VG9rZW4tPmlzT25lT2YodG9rOjpyX3NxdWFyZSwgdG9rOjpyX2JyYWNlKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgZWxzZSBpZiAoQ3VycmVudFRva2VuLT5pcyh0b2s6OmxfYnJhY2UpKQorICAgICAgICBMZWZ0LT5UeXBlID0gVFRfVW5rbm93bjsgLy8gTm90IFRUX09iakNCbG9ja0xQYXJlbgogICAgICAgdXBkYXRlUGFyYW1ldGVyQ291bnQoTGVmdCwgQ3VycmVudFRva2VuKTsKICAgICAgIGlmIChDdXJyZW50VG9rZW4tPmlzKHRvazo6Y29tbWEpICYmIEN1cnJlbnRUb2tlbi0+TmV4dCAmJgogICAgICAgICAgICFDdXJyZW50VG9rZW4tPk5leHQtPkhhc1VuZXNjYXBlZE5ld2xpbmUgJiYKICAgICAgICAgICAhQ3VycmVudFRva2VuLT5OZXh0LT5pc1RyYWlsaW5nQ29tbWVudCgpKQogICAgICAgICBIYXNNdWx0aXBsZVBhcmFtZXRlcnNPbkFMaW5lID0gdHJ1ZTsKKyAgICAgIGlmIChDdXJyZW50VG9rZW4tPmlzT25lT2YodG9rOjprd19jb25zdCwgdG9rOjprd19hdXRvKSB8fAorICAgICAgICAgIEN1cnJlbnRUb2tlbi0+aXNTaW1wbGVUeXBlU3BlY2lmaWVyKCkpCisgICAgICAgIENvbnRleHRzLmJhY2soKS5Jc0V4cHJlc3Npb24gPSBmYWxzZTsKICAgICAgIGlmICghY29uc3VtZVRva2VuKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIGlmIChDdXJyZW50VG9rZW4gJiYgQ3VycmVudFRva2VuLT5IYXNVbmVzY2FwZWROZXdsaW5lKQpAQCAtMjI2LDkgKzI1NSwxMiBAQAogICAgICAgICB9CiAgICAgICAgIExlZnQtPk1hdGNoaW5nUGFyZW4gPSBDdXJyZW50VG9rZW47CiAgICAgICAgIEN1cnJlbnRUb2tlbi0+TWF0Y2hpbmdQYXJlbiA9IExlZnQ7Ci0gICAgICAgIGlmIChDb250ZXh0cy5iYWNrKCkuRmlyc3RPYmpDU2VsZWN0b3JOYW1lICE9IE5VTEwpCisgICAgICAgIGlmIChDb250ZXh0cy5iYWNrKCkuRmlyc3RPYmpDU2VsZWN0b3JOYW1lICE9IE5VTEwpIHsKICAgICAgICAgICBDb250ZXh0cy5iYWNrKCkuRmlyc3RPYmpDU2VsZWN0b3JOYW1lLT5Mb25nZXN0T2JqQ1NlbGVjdG9yTmFtZSA9CiAgICAgICAgICAgICAgIENvbnRleHRzLmJhY2soKS5Mb25nZXN0T2JqQ1NlbGVjdG9yTmFtZTsKKyAgICAgICAgICBpZiAoQ29udGV4dHMuYmFjaygpLk51bUJsb2NrUGFyYW1ldGVycyA+IDEpCisgICAgICAgICAgICBDb250ZXh0cy5iYWNrKCkuRmlyc3RPYmpDU2VsZWN0b3JOYW1lLT5Mb25nZXN0T2JqQ1NlbGVjdG9yTmFtZSA9IDA7CisgICAgICAgIH0KICAgICAgICAgbmV4dCgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KQEAgLTIzNyw2ICsyNjksNyBAQAogICAgICAgaWYgKEN1cnJlbnRUb2tlbi0+aXModG9rOjpjb2xvbikpCiAgICAgICAgIENvbG9uRm91bmQgPSB0cnVlOwogICAgICAgaWYgKEN1cnJlbnRUb2tlbi0+aXModG9rOjpjb21tYSkgJiYKKyAgICAgICAgICBTdHlsZS5MYW5ndWFnZSAhPSBGb3JtYXRTdHlsZTo6TEtfUHJvdG8gJiYKICAgICAgICAgICAoTGVmdC0+VHlwZSA9PSBUVF9BcnJheVN1YnNjcmlwdExTcXVhcmUgfHwKICAgICAgICAgICAgKExlZnQtPlR5cGUgPT0gVFRfT2JqQ01ldGhvZEV4cHIgJiYgIUNvbG9uRm91bmQpKSkKICAgICAgICAgTGVmdC0+VHlwZSA9IFRUX0FycmF5SW5pdGlhbGl6ZXJMU3F1YXJlOwpAQCAtMjUwLDYgKzI4MywxMSBAQAogICBib29sIHBhcnNlQnJhY2UoKSB7CiAgICAgaWYgKEN1cnJlbnRUb2tlbiAhPSBOVUxMKSB7CiAgICAgICBGb3JtYXRUb2tlbiAqTGVmdCA9IEN1cnJlbnRUb2tlbi0+UHJldmlvdXM7CisKKyAgICAgIGlmIChDb250ZXh0cy5iYWNrKCkuQ2FyZXRGb3VuZCkKKyAgICAgICAgTGVmdC0+VHlwZSA9IFRUX09iakNCbG9ja0xCcmFjZTsKKyAgICAgIENvbnRleHRzLmJhY2soKS5DYXJldEZvdW5kID0gZmFsc2U7CisKICAgICAgIFNjb3BlZENvbnRleHRDcmVhdG9yIENvbnRleHRDcmVhdG9yKCp0aGlzLCB0b2s6OmxfYnJhY2UsIDEpOwogICAgICAgQ29udGV4dHMuYmFjaygpLkNvbG9uSXNEaWN0TGl0ZXJhbCA9IHRydWU7CiAKQEAgLTI2Myw3ICszMDEsOCBAQAogICAgICAgICBpZiAoQ3VycmVudFRva2VuLT5pc09uZU9mKHRvazo6cl9wYXJlbiwgdG9rOjpyX3NxdWFyZSkpCiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB1cGRhdGVQYXJhbWV0ZXJDb3VudChMZWZ0LCBDdXJyZW50VG9rZW4pOwotICAgICAgICBpZiAoQ3VycmVudFRva2VuLT5pcyh0b2s6OmNvbG9uKSkKKyAgICAgICAgaWYgKEN1cnJlbnRUb2tlbi0+aXModG9rOjpjb2xvbikgJiYKKyAgICAgICAgICAgIFN0eWxlLkxhbmd1YWdlICE9IEZvcm1hdFN0eWxlOjpMS19Qcm90bykKICAgICAgICAgICBMZWZ0LT5UeXBlID0gVFRfRGljdExpdGVyYWw7CiAgICAgICAgIGlmICghY29uc3VtZVRva2VuKCkpCiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzY3LDcgKzQwNiw3IEBACiAgICAgICBpZiAoIXBhcnNlUGFyZW5zKCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIGlmIChMaW5lLk11c3RCZURlY2xhcmF0aW9uICYmIENvbnRleHRzLnNpemUoKSA9PSAxICYmCi0gICAgICAgICAgIUNvbnRleHRzLmJhY2soKS5Jc0V4cHJlc3Npb24pCisgICAgICAgICAgIUNvbnRleHRzLmJhY2soKS5Jc0V4cHJlc3Npb24gJiYgTGluZS5GaXJzdC0+VHlwZSAhPSBUVF9PYmpDUHJvcGVydHkpCiAgICAgICAgIExpbmUuTWlnaHRCZUZ1bmN0aW9uRGVjbCA9IHRydWU7CiAgICAgICBicmVhazsKICAgICBjYXNlIHRvazo6bF9zcXVhcmU6CkBAIC00MjksNiArNDY4LDggQEAKICAgICAgICAgQ29udGV4dHMuYmFjaygpLkZpcnN0U3RhcnRPZk5hbWUtPlBhcnRPZk11bHRpVmFyaWFibGVEZWNsU3RtdCA9IHRydWU7CiAgICAgICBpZiAoQ29udGV4dHMuYmFjaygpLkluQ3RvckluaXRpYWxpemVyKQogICAgICAgICBUb2stPlR5cGUgPSBUVF9DdG9ySW5pdGlhbGl6ZXJDb21tYTsKKyAgICAgIGlmIChDb250ZXh0cy5iYWNrKCkuSXNGb3JFYWNoTWFjcm8pCisgICAgICAgIENvbnRleHRzLmJhY2soKS5Jc0V4cHJlc3Npb24gPSB0cnVlOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwpAQCAtNDY3LDYgKzUwOCwxOCBAQAogICAgIH0KICAgfQogCisgIHZvaWQgcGFyc2VQcmFnbWEoKSB7CisgICAgbmV4dCgpOyAvLyBDb25zdW1lICJwcmFnbWEiLgorICAgIGlmIChDdXJyZW50VG9rZW4gJiYgQ3VycmVudFRva2VuLT5Ub2tlblRleHQgPT0gIm1hcmsiKSB7CisgICAgICBuZXh0KCk7IC8vIENvbnN1bWUgIm1hcmsiLgorICAgICAgbmV4dCgpOyAvLyBDb25zdW1lIGZpcnN0IHRva2VuIChzbyB3ZSBmaXggbGVhZGluZyB3aGl0ZXNwYWNlKS4KKyAgICAgIHdoaWxlIChDdXJyZW50VG9rZW4gIT0gTlVMTCkgeworICAgICAgICBDdXJyZW50VG9rZW4tPlR5cGUgPSBUVF9JbXBsaWNpdFN0cmluZ0xpdGVyYWw7CisgICAgICAgIG5leHQoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKwogICB2b2lkIHBhcnNlUHJlcHJvY2Vzc29yRGlyZWN0aXZlKCkgewogICAgIG5leHQoKTsKICAgICBpZiAoQ3VycmVudFRva2VuID09IE5VTEwpCkBAIC00ODgsOCArNTQxLDEyIEBACiAgICAgY2FzZSB0b2s6OnBwX3dhcm5pbmc6CiAgICAgICBwYXJzZVdhcm5pbmdPckVycm9yKCk7CiAgICAgICBicmVhazsKKyAgICBjYXNlIHRvazo6cHBfcHJhZ21hOgorICAgICAgcGFyc2VQcmFnbWEoKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjpwcF9pZjoKICAgICBjYXNlIHRvazo6cHBfZWxpZjoKKyAgICAgIENvbnRleHRzLmJhY2soKS5Jc0V4cHJlc3Npb24gPSB0cnVlOwogICAgICAgcGFyc2VMaW5lKCk7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtNTA1LDYgKzU2MiwxNSBAQAogICAgICAgcGFyc2VQcmVwcm9jZXNzb3JEaXJlY3RpdmUoKTsKICAgICAgIHJldHVybiBMVF9QcmVwcm9jZXNzb3JEaXJlY3RpdmU7CiAgICAgfQorCisgICAgLy8gRGlyZWN0bHkgYWxsb3cgdG8gJ2ltcG9ydCA8c3RyaW5nLWxpdGVyYWw+JyB0byBzdXBwb3J0IHByb3RvY29sIGJ1ZmZlcgorICAgIC8vIGRlZmluaXRpb25zIChjb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zikgb3IgbWlzc2luZyAiIyIgKGVpdGhlciB3YXkgd2UKKyAgICAvLyBzaG91bGQgbm90IGJyZWFrIHRoZSBsaW5lKS4KKyAgICBJZGVudGlmaWVySW5mbyAqSW5mbyA9IEN1cnJlbnRUb2tlbi0+VG9rLmdldElkZW50aWZpZXJJbmZvKCk7CisgICAgaWYgKEluZm8gJiYgSW5mby0+Z2V0UFBLZXl3b3JkSUQoKSA9PSB0b2s6OnBwX2ltcG9ydCAmJgorICAgICAgICBDdXJyZW50VG9rZW4tPk5leHQgJiYgQ3VycmVudFRva2VuLT5OZXh0LT5pcyh0b2s6OnN0cmluZ19saXRlcmFsKSkKKyAgICAgIHBhcnNlSW5jbHVkZURpcmVjdGl2ZSgpOworCiAgICAgd2hpbGUgKEN1cnJlbnRUb2tlbiAhPSBOVUxMKSB7CiAgICAgICBpZiAoQ3VycmVudFRva2VuLT5pcyh0b2s6Omt3X3ZpcnR1YWwpKQogICAgICAgICBLZXl3b3JkVmlydHVhbEZvdW5kID0gdHJ1ZTsKQEAgLTUyNSwyNiArNTkxLDMzIEBACiAgIH0KIAogcHJpdmF0ZToKKyAgdm9pZCByZXNldFRva2VuTWV0YWRhdGEoRm9ybWF0VG9rZW4gKlRva2VuKSB7CisgICAgaWYgKFRva2VuID09IG51bGxwdHIpIHJldHVybjsKKworICAgIC8vIFJlc2V0IHRva2VuIHR5cGUgaW4gY2FzZSB3ZSBoYXZlIGFscmVhZHkgbG9va2VkIGF0IGl0IGFuZCB0aGVuCisgICAgLy8gcmVjb3ZlcmVkIGZyb20gYW4gZXJyb3IgKGUuZy4gZmFpbHVyZSB0byBmaW5kIHRoZSBtYXRjaGluZyA+KS4KKyAgICBpZiAoQ3VycmVudFRva2VuLT5UeXBlICE9IFRUX0xhbWJkYUxTcXVhcmUgJiYKKyAgICAgICAgQ3VycmVudFRva2VuLT5UeXBlICE9IFRUX0Z1bmN0aW9uTEJyYWNlICYmCisgICAgICAgIEN1cnJlbnRUb2tlbi0+VHlwZSAhPSBUVF9JbXBsaWNpdFN0cmluZ0xpdGVyYWwgJiYKKyAgICAgICAgQ3VycmVudFRva2VuLT5UeXBlICE9IFRUX1RyYWlsaW5nUmV0dXJuQXJyb3cpCisgICAgICBDdXJyZW50VG9rZW4tPlR5cGUgPSBUVF9Vbmtub3duOworICAgIGlmIChDdXJyZW50VG9rZW4tPlJvbGUpCisgICAgICBDdXJyZW50VG9rZW4tPlJvbGUucmVzZXQoTlVMTCk7CisgICAgQ3VycmVudFRva2VuLT5GYWtlTFBhcmVucy5jbGVhcigpOworICAgIEN1cnJlbnRUb2tlbi0+RmFrZVJQYXJlbnMgPSAwOworICB9CisKICAgdm9pZCBuZXh0KCkgewogICAgIGlmIChDdXJyZW50VG9rZW4gIT0gTlVMTCkgewogICAgICAgZGV0ZXJtaW5lVG9rZW5UeXBlKCpDdXJyZW50VG9rZW4pOwogICAgICAgQ3VycmVudFRva2VuLT5CaW5kaW5nU3RyZW5ndGggPSBDb250ZXh0cy5iYWNrKCkuQmluZGluZ1N0cmVuZ3RoOworICAgICAgQ3VycmVudFRva2VuLT5OZXN0aW5nTGV2ZWwgPSBDb250ZXh0cy5zaXplKCkgLSAxOwogICAgIH0KIAogICAgIGlmIChDdXJyZW50VG9rZW4gIT0gTlVMTCkKICAgICAgIEN1cnJlbnRUb2tlbiA9IEN1cnJlbnRUb2tlbi0+TmV4dDsKIAotICAgIGlmIChDdXJyZW50VG9rZW4gIT0gTlVMTCkgewotICAgICAgLy8gUmVzZXQgdG9rZW4gdHlwZSBpbiBjYXNlIHdlIGhhdmUgYWxyZWFkeSBsb29rZWQgYXQgaXQgYW5kIHRoZW4KLSAgICAgIC8vIHJlY292ZXJlZCBmcm9tIGFuIGVycm9yIChlLmcuIGZhaWx1cmUgdG8gZmluZCB0aGUgbWF0Y2hpbmcgPikuCi0gICAgICBpZiAoQ3VycmVudFRva2VuLT5UeXBlICE9IFRUX0xhbWJkYUxTcXVhcmUgJiYKLSAgICAgICAgICBDdXJyZW50VG9rZW4tPlR5cGUgIT0gVFRfSW1wbGljaXRTdHJpbmdMaXRlcmFsKQotICAgICAgICBDdXJyZW50VG9rZW4tPlR5cGUgPSBUVF9Vbmtub3duOwotICAgICAgaWYgKEN1cnJlbnRUb2tlbi0+Um9sZSkKLSAgICAgICAgQ3VycmVudFRva2VuLT5Sb2xlLnJlc2V0KE5VTEwpOwotICAgICAgQ3VycmVudFRva2VuLT5GYWtlTFBhcmVucy5jbGVhcigpOwotICAgICAgQ3VycmVudFRva2VuLT5GYWtlUlBhcmVucyA9IDA7Ci0gICAgfQorICAgIHJlc2V0VG9rZW5NZXRhZGF0YShDdXJyZW50VG9rZW4pOwogICB9CiAKICAgLy8vIFxicmllZiBBIHN0cnVjdCB0byBob2xkIGluZm9ybWF0aW9uIHZhbGlkIGluIGEgc3BlY2lmaWMgY29udGV4dCwgZS5nLgpAQCAtNTUzLDE1ICs2MjYsMTcgQEAKICAgICBDb250ZXh0KHRvazo6VG9rZW5LaW5kIENvbnRleHRLaW5kLCB1bnNpZ25lZCBCaW5kaW5nU3RyZW5ndGgsCiAgICAgICAgICAgICBib29sIElzRXhwcmVzc2lvbikKICAgICAgICAgOiBDb250ZXh0S2luZChDb250ZXh0S2luZCksIEJpbmRpbmdTdHJlbmd0aChCaW5kaW5nU3RyZW5ndGgpLAotICAgICAgICAgIExvbmdlc3RPYmpDU2VsZWN0b3JOYW1lKDApLCBDb2xvbklzRm9yUmFuZ2VFeHByKGZhbHNlKSwKLSAgICAgICAgICBDb2xvbklzRGljdExpdGVyYWwoZmFsc2UpLCBDb2xvbklzT2JqQ01ldGhvZEV4cHIoZmFsc2UpLAotICAgICAgICAgIEZpcnN0T2JqQ1NlbGVjdG9yTmFtZShOVUxMKSwgRmlyc3RTdGFydE9mTmFtZShOVUxMKSwKLSAgICAgICAgICBJc0V4cHJlc3Npb24oSXNFeHByZXNzaW9uKSwgQ2FuQmVFeHByZXNzaW9uKHRydWUpLAotICAgICAgICAgIEluQ3RvckluaXRpYWxpemVyKGZhbHNlKSB7fQorICAgICAgICAgIExvbmdlc3RPYmpDU2VsZWN0b3JOYW1lKDApLCBOdW1CbG9ja1BhcmFtZXRlcnMoMCksCisgICAgICAgICAgQ29sb25Jc0ZvclJhbmdlRXhwcihmYWxzZSksIENvbG9uSXNEaWN0TGl0ZXJhbChmYWxzZSksCisgICAgICAgICAgQ29sb25Jc09iakNNZXRob2RFeHByKGZhbHNlKSwgRmlyc3RPYmpDU2VsZWN0b3JOYW1lKE5VTEwpLAorICAgICAgICAgIEZpcnN0U3RhcnRPZk5hbWUoTlVMTCksIElzRXhwcmVzc2lvbihJc0V4cHJlc3Npb24pLAorICAgICAgICAgIENhbkJlRXhwcmVzc2lvbih0cnVlKSwgSW5UZW1wbGF0ZUFyZ3VtZW50KGZhbHNlKSwKKyAgICAgICAgICBJbkN0b3JJbml0aWFsaXplcihmYWxzZSksIENhcmV0Rm91bmQoZmFsc2UpLCBJc0ZvckVhY2hNYWNybyhmYWxzZSkge30KIAogICAgIHRvazo6VG9rZW5LaW5kIENvbnRleHRLaW5kOwogICAgIHVuc2lnbmVkIEJpbmRpbmdTdHJlbmd0aDsKICAgICB1bnNpZ25lZCBMb25nZXN0T2JqQ1NlbGVjdG9yTmFtZTsKKyAgICB1bnNpZ25lZCBOdW1CbG9ja1BhcmFtZXRlcnM7CiAgICAgYm9vbCBDb2xvbklzRm9yUmFuZ2VFeHByOwogICAgIGJvb2wgQ29sb25Jc0RpY3RMaXRlcmFsOwogICAgIGJvb2wgQ29sb25Jc09iakNNZXRob2RFeHByOwpAQCAtNTY5LDcgKzY0NCwxMCBAQAogICAgIEZvcm1hdFRva2VuICpGaXJzdFN0YXJ0T2ZOYW1lOwogICAgIGJvb2wgSXNFeHByZXNzaW9uOwogICAgIGJvb2wgQ2FuQmVFeHByZXNzaW9uOworICAgIGJvb2wgSW5UZW1wbGF0ZUFyZ3VtZW50OwogICAgIGJvb2wgSW5DdG9ySW5pdGlhbGl6ZXI7CisgICAgYm9vbCBDYXJldEZvdW5kOworICAgIGJvb2wgSXNGb3JFYWNoTWFjcm87CiAgIH07CiAKICAgLy8vIFxicmllZiBQdXRzIGEgbmV3IFxjIENvbnRleHQgb250byB0aGUgc3RhY2sgXGMgQ29udGV4dHMgZm9yIHRoZSBsaWZldGltZQpAQCAtNjAzLDEyICs2ODEsMTcgQEAKICAgICAgICAgICBQcmV2aW91cy0+VHlwZSA9IFRUX1BvaW50ZXJPclJlZmVyZW5jZTsKICAgICAgICAgfQogICAgICAgfQotICAgIH0gZWxzZSBpZiAoQ3VycmVudC5pc09uZU9mKHRvazo6a3dfcmV0dXJuLCB0b2s6Omt3X3Rocm93KSB8fAotICAgICAgICAgICAgICAgKEN1cnJlbnQuaXModG9rOjpsX3BhcmVuKSAmJiAhTGluZS5NdXN0QmVEZWNsYXJhdGlvbiAmJgotICAgICAgICAgICAgICAgICFMaW5lLkluUFBEaXJlY3RpdmUgJiYKLSAgICAgICAgICAgICAgICAoIUN1cnJlbnQuUHJldmlvdXMgfHwKLSAgICAgICAgICAgICAgICAgIUN1cnJlbnQuUHJldmlvdXMtPmlzT25lT2YodG9rOjprd19mb3IsIHRvazo6a3dfY2F0Y2gpKSkpIHsKKyAgICB9IGVsc2UgaWYgKEN1cnJlbnQuaXNPbmVPZih0b2s6Omt3X3JldHVybiwgdG9rOjprd190aHJvdykpIHsKICAgICAgIENvbnRleHRzLmJhY2soKS5Jc0V4cHJlc3Npb24gPSB0cnVlOworICAgIH0gZWxzZSBpZiAoQ3VycmVudC5pcyh0b2s6OmxfcGFyZW4pICYmICFMaW5lLk11c3RCZURlY2xhcmF0aW9uICYmCisgICAgICAgICAgICAgICAhTGluZS5JblBQRGlyZWN0aXZlKSB7CisgICAgICBib29sIFBhcmFtZXRlcnNPZkZ1bmN0aW9uVHlwZSA9CisgICAgICAgICAgQ3VycmVudC5QcmV2aW91cyAmJiBDdXJyZW50LlByZXZpb3VzLT5pcyh0b2s6OnJfcGFyZW4pICYmCisgICAgICAgICAgQ3VycmVudC5QcmV2aW91cy0+TWF0Y2hpbmdQYXJlbiAmJgorICAgICAgICAgIEN1cnJlbnQuUHJldmlvdXMtPk1hdGNoaW5nUGFyZW4tPlR5cGUgPT0gVFRfRnVuY3Rpb25UeXBlTFBhcmVuOworICAgICAgYm9vbCBJc0Zvck9yQ2F0Y2ggPSBDdXJyZW50LlByZXZpb3VzICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQuUHJldmlvdXMtPmlzT25lT2YodG9rOjprd19mb3IsIHRvazo6a3dfY2F0Y2gpOworICAgICAgQ29udGV4dHMuYmFjaygpLklzRXhwcmVzc2lvbiA9ICFQYXJhbWV0ZXJzT2ZGdW5jdGlvblR5cGUgJiYgIUlzRm9yT3JDYXRjaDsKICAgICB9IGVsc2UgaWYgKEN1cnJlbnQuaXNPbmVPZih0b2s6OnJfcGFyZW4sIHRvazo6Z3JlYXRlciwgdG9rOjpjb21tYSkpIHsKICAgICAgIGZvciAoRm9ybWF0VG9rZW4gKlByZXZpb3VzID0gQ3VycmVudC5QcmV2aW91czsKICAgICAgICAgICAgUHJldmlvdXMgJiYgUHJldmlvdXMtPmlzT25lT2YodG9rOjpzdGFyLCB0b2s6OmFtcCk7CkBAIC02NDAsOSArNzIzLDE1IEBACiAgICAgICB9IGVsc2UgaWYgKEN1cnJlbnQuaXNPbmVPZih0b2s6OnN0YXIsIHRvazo6YW1wLCB0b2s6OmFtcGFtcCkpIHsKICAgICAgICAgQ3VycmVudC5UeXBlID0KICAgICAgICAgICAgIGRldGVybWluZVN0YXJBbXBVc2FnZShDdXJyZW50LCBDb250ZXh0cy5iYWNrKCkuQ2FuQmVFeHByZXNzaW9uICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRzLmJhY2soKS5Jc0V4cHJlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0cy5iYWNrKCkuSXNFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRzLmJhY2soKS5JblRlbXBsYXRlQXJndW1lbnQpOwogICAgICAgfSBlbHNlIGlmIChDdXJyZW50LmlzT25lT2YodG9rOjptaW51cywgdG9rOjpwbHVzLCB0b2s6OmNhcmV0KSkgewogICAgICAgICBDdXJyZW50LlR5cGUgPSBkZXRlcm1pbmVQbHVzTWludXNDYXJldFVzYWdlKEN1cnJlbnQpOworICAgICAgICBpZiAoQ3VycmVudC5UeXBlID09IFRUX1VuYXJ5T3BlcmF0b3IpIHsKKyAgICAgICAgICArK0NvbnRleHRzLmJhY2soKS5OdW1CbG9ja1BhcmFtZXRlcnM7CisgICAgICAgICAgaWYgKEN1cnJlbnQuaXModG9rOjpjYXJldCkpCisgICAgICAgICAgICBDb250ZXh0cy5iYWNrKCkuQ2FyZXRGb3VuZCA9IHRydWU7CisgICAgICAgIH0KICAgICAgIH0gZWxzZSBpZiAoQ3VycmVudC5pc09uZU9mKHRvazo6bWludXNtaW51cywgdG9rOjpwbHVzcGx1cykpIHsKICAgICAgICAgQ3VycmVudC5UeXBlID0gZGV0ZXJtaW5lSW5jcmVtZW50VXNhZ2UoQ3VycmVudCk7CiAgICAgICB9IGVsc2UgaWYgKEN1cnJlbnQuaXModG9rOjpleGNsYWltKSkgewpAQCAtNjY1LDcgKzc1NCw3IEBACiAgICAgICAgIGJvb2wgUGFyZW5zQXJlVHlwZSA9ICFDdXJyZW50LlByZXZpb3VzIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQuUHJldmlvdXMtPlR5cGUgPT0gVFRfUG9pbnRlck9yUmVmZXJlbmNlIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQuUHJldmlvdXMtPlR5cGUgPT0gVFRfVGVtcGxhdGVDbG9zZXIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTaW1wbGVUeXBlU3BlY2lmaWVyKCpDdXJyZW50LlByZXZpb3VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudC5QcmV2aW91cy0+aXNTaW1wbGVUeXBlU3BlY2lmaWVyKCk7CiAgICAgICAgIGJvb2wgUGFyZW5zQ291bGRFbmREZWNsID0KICAgICAgICAgICAgIEN1cnJlbnQuTmV4dCAmJgogICAgICAgICAgICAgQ3VycmVudC5OZXh0LT5pc09uZU9mKHRvazo6ZXF1YWwsIHRvazo6c2VtaSwgdG9rOjpsX2JyYWNlKTsKQEAgLTY3Myw3ICs3NjIsOCBAQAogICAgICAgICAgICAgTGVmdE9mUGFyZW5zICYmCiAgICAgICAgICAgICBMZWZ0T2ZQYXJlbnMtPmlzT25lT2YodG9rOjprd19zaXplb2YsIHRvazo6a3dfYWxpZ25vZik7CiAgICAgICAgIGlmIChQYXJlbnNBcmVUeXBlICYmICFQYXJlbnNDb3VsZEVuZERlY2wgJiYgIUlzU2l6ZU9mT3JBbGlnbk9mICYmCi0gICAgICAgICAgICAoQ29udGV4dHMuYmFjaygpLklzRXhwcmVzc2lvbiB8fAorICAgICAgICAgICAgKChDb250ZXh0cy5zaXplKCkgPiAxICYmCisgICAgICAgICAgICAgIENvbnRleHRzW0NvbnRleHRzLnNpemUoKSAtIDJdLklzRXhwcmVzc2lvbikgfHwKICAgICAgICAgICAgICAoQ3VycmVudC5OZXh0ICYmIEN1cnJlbnQuTmV4dC0+aXNCaW5hcnlPcGVyYXRvcigpKSkpCiAgICAgICAgICAgSXNDYXN0ID0gdHJ1ZTsKICAgICAgICAgaWYgKEN1cnJlbnQuTmV4dCAmJiBDdXJyZW50Lk5leHQtPmlzTm90KHRvazo6c3RyaW5nX2xpdGVyYWwpICYmCkBAIC02ODUsNiArNzc1LDcgQEAKICAgICAgICAgaWYgKExlZnRPZlBhcmVucyAmJiAoTGVmdE9mUGFyZW5zLT5Ub2suZ2V0SWRlbnRpZmllckluZm8oKSA9PSBOVUxMIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZnRPZlBhcmVucy0+aXModG9rOjprd19yZXR1cm4pKSAmJgogICAgICAgICAgICAgTGVmdE9mUGFyZW5zLT5UeXBlICE9IFRUX092ZXJsb2FkZWRPcGVyYXRvciAmJgorICAgICAgICAgICAgTGVmdE9mUGFyZW5zLT5pc05vdCh0b2s6OmF0KSAmJgogICAgICAgICAgICAgTGVmdE9mUGFyZW5zLT5UeXBlICE9IFRUX1RlbXBsYXRlQ2xvc2VyICYmIEN1cnJlbnQuTmV4dCAmJgogICAgICAgICAgICAgQ3VycmVudC5OZXh0LT5pcyh0b2s6OmlkZW50aWZpZXIpKQogICAgICAgICAgIElzQ2FzdCA9IHRydWU7CkBAIC03MDgsNiArNzk5LDExIEBACiAgICAgICAgIGlmIChQcmV2aW91c05vQ29tbWVudCAmJgogICAgICAgICAgICAgUHJldmlvdXNOb0NvbW1lbnQtPmlzT25lT2YodG9rOjpjb21tYSwgdG9rOjpsX2JyYWNlKSkKICAgICAgICAgICBDdXJyZW50LlR5cGUgPSBUVF9EZXNpZ25hdGVkSW5pdGlhbGl6ZXJQZXJpb2Q7CisgICAgICB9IGVsc2UgaWYgKEN1cnJlbnQuaXNPbmVPZih0b2s6OmlkZW50aWZpZXIsIHRvazo6a3dfY29uc3QpICYmCisgICAgICAgICAgICAgICAgIExpbmUuTWlnaHRCZUZ1bmN0aW9uRGVjbCAmJiBDb250ZXh0cy5zaXplKCkgPT0gMSkgeworICAgICAgICAvLyBMaW5lLk1pZ2h0QmVGdW5jdGlvbkRlY2wgY2FuIG9ubHkgYmUgdHJ1ZSBhZnRlciB0aGUgcGFyZW50aGVzZXMgb2YgYQorICAgICAgICAvLyBmdW5jdGlvbiBkZWNsYXJhdGlvbiBoYXZlIGJlZW4gZm91bmQuCisgICAgICAgIEN1cnJlbnQuVHlwZSA9IFRUX1RyYWlsaW5nQW5ub3RhdGlvbjsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTc0MCwxMSArODM2LDEyIEBACiAKICAgICByZXR1cm4gKCFJc1BQS2V5d29yZCAmJiBQcmV2aW91c05vdENvbnN0LT5pcyh0b2s6OmlkZW50aWZpZXIpKSB8fAogICAgICAgICAgICBQcmV2aW91c05vdENvbnN0LT5UeXBlID09IFRUX1BvaW50ZXJPclJlZmVyZW5jZSB8fAotICAgICAgICAgICBpc1NpbXBsZVR5cGVTcGVjaWZpZXIoKlByZXZpb3VzTm90Q29uc3QpOworICAgICAgICAgICBQcmV2aW91c05vdENvbnN0LT5pc1NpbXBsZVR5cGVTcGVjaWZpZXIoKTsKICAgfQogCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiB0b2tlbiBhc3N1bWluZyBpdCBpcyAqIG9yICYuCi0gIFRva2VuVHlwZSBkZXRlcm1pbmVTdGFyQW1wVXNhZ2UoY29uc3QgRm9ybWF0VG9rZW4gJlRvaywgYm9vbCBJc0V4cHJlc3Npb24pIHsKKyAgVG9rZW5UeXBlIGRldGVybWluZVN0YXJBbXBVc2FnZShjb25zdCBGb3JtYXRUb2tlbiAmVG9rLCBib29sIElzRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluVGVtcGxhdGVBcmd1bWVudCkgewogICAgIGNvbnN0IEZvcm1hdFRva2VuICpQcmV2VG9rZW4gPSBUb2suZ2V0UHJldmlvdXNOb25Db21tZW50KCk7CiAgICAgaWYgKFByZXZUb2tlbiA9PSBOVUxMKQogICAgICAgcmV0dXJuIFRUX1VuYXJ5T3BlcmF0b3I7CkBAIC03NzMsOCArODcwLDE1IEBACiAgICAgICByZXR1cm4gVFRfUG9pbnRlck9yUmVmZXJlbmNlOwogCiAgICAgaWYgKFByZXZUb2tlbi0+VG9rLmlzTGl0ZXJhbCgpIHx8Ci0gICAgICAgIFByZXZUb2tlbi0+aXNPbmVPZih0b2s6OnJfcGFyZW4sIHRvazo6cl9zcXVhcmUpIHx8Ci0gICAgICAgIE5leHRUb2tlbi0+VG9rLmlzTGl0ZXJhbCgpIHx8IE5leHRUb2tlbi0+aXNVbmFyeU9wZXJhdG9yKCkpCisgICAgICAgIFByZXZUb2tlbi0+aXNPbmVPZih0b2s6OnJfcGFyZW4sIHRvazo6cl9zcXVhcmUsIHRvazo6a3dfdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6a3dfZmFsc2UpIHx8CisgICAgICAgIE5leHRUb2tlbi0+VG9rLmlzTGl0ZXJhbCgpIHx8CisgICAgICAgIE5leHRUb2tlbi0+aXNPbmVPZih0b2s6Omt3X3RydWUsIHRvazo6a3dfZmFsc2UpIHx8CisgICAgICAgIE5leHRUb2tlbi0+aXNVbmFyeU9wZXJhdG9yKCkgfHwKKyAgICAgICAgLy8gSWYgd2Uga25vdyB3ZSdyZSBpbiBhIHRlbXBsYXRlIGFyZ3VtZW50LCB0aGVyZSBhcmUgbm8gbmFtZWQKKyAgICAgICAgLy8gZGVjbGFyYXRpb25zLiBUaHVzLCBoYXZpbmcgYW4gaWRlbnRpZmllciBvbiB0aGUgcmlnaHQtaGFuZCBzaWRlCisgICAgICAgIC8vIGluZGljYXRlcyBhIGJpbmFyeSBvcGVyYXRvci4KKyAgICAgICAgKEluVGVtcGxhdGVBcmd1bWVudCAmJiBOZXh0VG9rZW4tPlRvay5pc0FueUlkZW50aWZpZXIoKSkpCiAgICAgICByZXR1cm4gVFRfQmluYXJ5T3BlcmF0b3I7CiAKICAgICAvLyBJdCBpcyB2ZXJ5IHVubGlrZWx5IHRoYXQgd2UgYXJlIGdvaW5nIHRvIGZpbmQgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSB0eXBlCkBAIC04MTUsMzYgKzkxOSw2IEBACiAgICAgcmV0dXJuIFRUX1VuYXJ5T3BlcmF0b3I7CiAgIH0KIAotICAvLyBGSVhNRTogVGhpcyBpcyBjb3B5JnBhc3RlZCBmcm9tIFNlbWEuIFB1dCBpdCBpbiBhIGNvbW1vbiBwbGFjZSBhbmQgcmVtb3ZlCi0gIC8vIGR1cGxpY2F0aW9uLgotICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSB0b2tlbiBraW5kIHN0YXJ0cyBhIHNpbXBsZS10eXBlLXNwZWNpZmllci4KLSAgYm9vbCBpc1NpbXBsZVR5cGVTcGVjaWZpZXIoY29uc3QgRm9ybWF0VG9rZW4gJlRvaykgY29uc3QgewotICAgIHN3aXRjaCAoVG9rLlRvay5nZXRLaW5kKCkpIHsKLSAgICBjYXNlIHRvazo6a3dfc2hvcnQ6Ci0gICAgY2FzZSB0b2s6Omt3X2xvbmc6Ci0gICAgY2FzZSB0b2s6Omt3X19faW50NjQ6Ci0gICAgY2FzZSB0b2s6Omt3X19faW50MTI4OgotICAgIGNhc2UgdG9rOjprd19zaWduZWQ6Ci0gICAgY2FzZSB0b2s6Omt3X3Vuc2lnbmVkOgotICAgIGNhc2UgdG9rOjprd192b2lkOgotICAgIGNhc2UgdG9rOjprd19jaGFyOgotICAgIGNhc2UgdG9rOjprd19pbnQ6Ci0gICAgY2FzZSB0b2s6Omt3X2hhbGY6Ci0gICAgY2FzZSB0b2s6Omt3X2Zsb2F0OgotICAgIGNhc2UgdG9rOjprd19kb3VibGU6Ci0gICAgY2FzZSB0b2s6Omt3X3djaGFyX3Q6Ci0gICAgY2FzZSB0b2s6Omt3X2Jvb2w6Ci0gICAgY2FzZSB0b2s6Omt3X19fdW5kZXJseWluZ190eXBlOgotICAgIGNhc2UgdG9rOjphbm5vdF90eXBlbmFtZToKLSAgICBjYXNlIHRvazo6a3dfY2hhcjE2X3Q6Ci0gICAgY2FzZSB0b2s6Omt3X2NoYXIzMl90OgotICAgIGNhc2UgdG9rOjprd190eXBlb2Y6Ci0gICAgY2FzZSB0b2s6Omt3X2RlY2x0eXBlOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KIAogICBTbWFsbFZlY3RvcjxDb250ZXh0LCA4PiBDb250ZXh0czsKIApAQCAtOTA0LDggKzk3OCwxMSBAQAogICAgICAgaW50IEN1cnJlbnRQcmVjZWRlbmNlID0gZ2V0Q3VycmVudFByZWNlZGVuY2UoKTsKIAogICAgICAgaWYgKEN1cnJlbnQgJiYgQ3VycmVudC0+VHlwZSA9PSBUVF9PYmpDU2VsZWN0b3JOYW1lICYmCi0gICAgICAgICAgUHJlY2VkZW5jZSA9PSBDdXJyZW50UHJlY2VkZW5jZSkKKyAgICAgICAgICBQcmVjZWRlbmNlID09IEN1cnJlbnRQcmVjZWRlbmNlKSB7CisgICAgICAgIGlmIChMYXRlc3RPcGVyYXRvcikKKyAgICAgICAgICBhZGRGYWtlUGFyZW50aGVzaXMoU3RhcnQsIHByZWM6OkxldmVsKFByZWNlZGVuY2UpKTsKICAgICAgICAgU3RhcnQgPSBDdXJyZW50OworICAgICAgfQogCiAgICAgICAvLyBBdCB0aGUgZW5kIG9mIHRoZSBsaW5lIG9yIHdoZW4gYW4gb3BlcmF0b3Igd2l0aCBoaWdoZXIgcHJlY2VkZW5jZSBpcwogICAgICAgLy8gZm91bmQsIGluc2VydCBmYWtlIHBhcmVudGhlc2lzIGFuZCByZXR1cm4uCkBAIC05NTAsNiArMTAyNyw4IEBACiAgICAgICBlbHNlIGlmIChDdXJyZW50LT5pcyh0b2s6OnNlbWkpIHx8IEN1cnJlbnQtPlR5cGUgPT0gVFRfSW5saW5lQVNNQ29sb24gfHwKICAgICAgICAgICAgICAgIEN1cnJlbnQtPlR5cGUgPT0gVFRfT2JqQ1NlbGVjdG9yTmFtZSkKICAgICAgICAgcmV0dXJuIDA7CisgICAgICBlbHNlIGlmIChDdXJyZW50LT5UeXBlID09IFRUX1JhbmdlQmFzZWRGb3JMb29wQ29sb24pCisgICAgICAgIHJldHVybiBwcmVjOjpDb21tYTsKICAgICAgIGVsc2UgaWYgKEN1cnJlbnQtPlR5cGUgPT0gVFRfQmluYXJ5T3BlcmF0b3IgfHwgQ3VycmVudC0+aXModG9rOjpjb21tYSkpCiAgICAgICAgIHJldHVybiBDdXJyZW50LT5nZXRQcmVjZWRlbmNlKCk7CiAgICAgICBlbHNlIGlmIChDdXJyZW50LT5pc09uZU9mKHRvazo6cGVyaW9kLCB0b2s6OmFycm93KSkKQEAgLTEwNjAsMTEgKzExMzksMzcgQEAKICAgRm9ybWF0VG9rZW4gKkN1cnJlbnQgPSBMaW5lLkZpcnN0LT5OZXh0OwogICBib29sIEluRnVuY3Rpb25EZWNsID0gTGluZS5NaWdodEJlRnVuY3Rpb25EZWNsOwogICB3aGlsZSAoQ3VycmVudCAhPSBOVUxMKSB7Ci0gICAgaWYgKEN1cnJlbnQtPlR5cGUgPT0gVFRfTGluZUNvbW1lbnQpCi0gICAgICBDdXJyZW50LT5TcGFjZXNSZXF1aXJlZEJlZm9yZSA9IFN0eWxlLlNwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM7Ci0gICAgZWxzZSBpZiAoQ3VycmVudC0+U3BhY2VzUmVxdWlyZWRCZWZvcmUgPT0gMCAmJgotICAgICAgICAgICAgIHNwYWNlUmVxdWlyZWRCZWZvcmUoTGluZSwgKkN1cnJlbnQpKQorICAgIGlmIChDdXJyZW50LT5UeXBlID09IFRUX0xpbmVDb21tZW50KSB7CisgICAgICBpZiAoQ3VycmVudC0+UHJldmlvdXMtPkJsb2NrS2luZCA9PSBCS19CcmFjZWRJbml0ICYmCisgICAgICAgICAgQ3VycmVudC0+UHJldmlvdXMtPm9wZW5zU2NvcGUoKSkKKyAgICAgICAgQ3VycmVudC0+U3BhY2VzUmVxdWlyZWRCZWZvcmUgPSBTdHlsZS5DcHAxMUJyYWNlZExpc3RTdHlsZSA/IDAgOiAxOworICAgICAgZWxzZQorICAgICAgICBDdXJyZW50LT5TcGFjZXNSZXF1aXJlZEJlZm9yZSA9IFN0eWxlLlNwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM7CisKKyAgICAgIC8vIElmIHdlIGZpbmQgYSB0cmFpbGluZyBjb21tZW50LCBpdGVyYXRlIGJhY2t3YXJkcyB0byBkZXRlcm1pbmUgd2hldGhlcgorICAgICAgLy8gaXQgc2VlbXMgdG8gcmVsYXRlIHRvIGEgc3BlY2lmaWMgcGFyYW1ldGVyLiBJZiBzbywgYnJlYWsgYmVmb3JlIHRoYXQKKyAgICAgIC8vIHBhcmFtZXRlciB0byBhdm9pZCBjaGFuZ2luZyB0aGUgY29tbWVudCdzIG1lYW5pbmcuIEUuZy4gZG9uJ3QgbW92ZSAnYicKKyAgICAgIC8vIHRvIHRoZSBwcmV2aW91cyBsaW5lIGluOgorICAgICAgLy8gICBTb21lRnVuY3Rpb24oYSwKKyAgICAgIC8vICAgICAgICAgICAgICAgIGIsIC8vIGNvbW1lbnQKKyAgICAgIC8vICAgICAgICAgICAgICAgIGMpOworICAgICAgaWYgKCFDdXJyZW50LT5IYXNVbmVzY2FwZWROZXdsaW5lKSB7CisgICAgICAgIGZvciAoRm9ybWF0VG9rZW4gKlBhcmFtZXRlciA9IEN1cnJlbnQtPlByZXZpb3VzOyBQYXJhbWV0ZXI7CisgICAgICAgICAgICAgUGFyYW1ldGVyID0gUGFyYW1ldGVyLT5QcmV2aW91cykgeworICAgICAgICAgIGlmIChQYXJhbWV0ZXItPmlzT25lT2YodG9rOjpjb21tZW50LCB0b2s6OnJfYnJhY2UpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaWYgKFBhcmFtZXRlci0+UHJldmlvdXMgJiYgUGFyYW1ldGVyLT5QcmV2aW91cy0+aXModG9rOjpjb21tYSkpIHsKKyAgICAgICAgICAgIGlmIChQYXJhbWV0ZXItPlByZXZpb3VzLT5UeXBlICE9IFRUX0N0b3JJbml0aWFsaXplckNvbW1hICYmCisgICAgICAgICAgICAgICAgUGFyYW1ldGVyLT5IYXNVbmVzY2FwZWROZXdsaW5lKQorICAgICAgICAgICAgICBQYXJhbWV0ZXItPk11c3RCcmVha0JlZm9yZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKEN1cnJlbnQtPlNwYWNlc1JlcXVpcmVkQmVmb3JlID09IDAgJiYKKyAgICAgICAgICAgICBzcGFjZVJlcXVpcmVkQmVmb3JlKExpbmUsICpDdXJyZW50KSkgewogICAgICAgQ3VycmVudC0+U3BhY2VzUmVxdWlyZWRCZWZvcmUgPSAxOworICAgIH0KIAogICAgIEN1cnJlbnQtPk11c3RCcmVha0JlZm9yZSA9CiAgICAgICAgIEN1cnJlbnQtPk11c3RCcmVha0JlZm9yZSB8fCBtdXN0QnJlYWtCZWZvcmUoTGluZSwgKkN1cnJlbnQpOwpAQCAtMTEzMiwxNiArMTIzNywxOCBAQAogICAgIHJldHVybiAwOwogICBpZiAoTGVmdC5pcyh0b2s6OmNvbW1hKSkKICAgICByZXR1cm4gMTsKLSAgaWYgKFJpZ2h0LmlzKHRvazo6bF9zcXVhcmUpKQotICAgIHJldHVybiAxNTA7Ci0KKyAgaWYgKFJpZ2h0LmlzKHRvazo6bF9zcXVhcmUpKSB7CisgICAgaWYgKFN0eWxlLkxhbmd1YWdlID09IEZvcm1hdFN0eWxlOjpMS19Qcm90bykKKyAgICAgIHJldHVybiAxOworICAgIGlmIChSaWdodC5UeXBlICE9IFRUX09iakNNZXRob2RFeHByKQorICAgICAgcmV0dXJuIDI1MDsKKyAgfQogICBpZiAoUmlnaHQuVHlwZSA9PSBUVF9TdGFydE9mTmFtZSB8fCBSaWdodC5pcyh0b2s6Omt3X29wZXJhdG9yKSkgewogICAgIGlmIChMaW5lLkZpcnN0LT5pcyh0b2s6Omt3X2ZvcikgJiYgUmlnaHQuUGFydE9mTXVsdGlWYXJpYWJsZURlY2xTdG10KQogICAgICAgcmV0dXJuIDM7CiAgICAgaWYgKExlZnQuVHlwZSA9PSBUVF9TdGFydE9mTmFtZSkKICAgICAgIHJldHVybiAyMDsKLSAgICBpZiAoSW5GdW5jdGlvbkRlY2wgJiYgUmlnaHQuQmluZGluZ1N0cmVuZ3RoID09IDEpCi0gICAgICAvLyBGSVhNRTogQ2xlYW4gdXAgaGFjayBvZiB1c2luZyBCaW5kaW5nU3RyZW5ndGggdG8gZmluZCB0b3AtbGV2ZWwgbmFtZXMuCisgICAgaWYgKEluRnVuY3Rpb25EZWNsICYmIFJpZ2h0Lk5lc3RpbmdMZXZlbCA9PSAwKQogICAgICAgcmV0dXJuIFN0eWxlLlBlbmFsdHlSZXR1cm5UeXBlT25JdHNPd25MaW5lOwogICAgIHJldHVybiAyMDA7CiAgIH0KQEAgLTExNDksNyArMTI1Niw4IEBACiAgICAgcmV0dXJuIDE1MDsKICAgaWYgKExlZnQuVHlwZSA9PSBUVF9DYXN0UlBhcmVuKQogICAgIHJldHVybiAxMDA7Ci0gIGlmIChMZWZ0LmlzKHRvazo6Y29sb25jb2xvbikpCisgIGlmIChMZWZ0LmlzKHRvazo6Y29sb25jb2xvbikgfHwKKyAgICAgIChSaWdodC5pcyh0b2s6OnBlcmlvZCkgJiYgU3R5bGUuTGFuZ3VhZ2UgPT0gRm9ybWF0U3R5bGU6OkxLX1Byb3RvKSkKICAgICByZXR1cm4gNTAwOwogICBpZiAoTGVmdC5pc09uZU9mKHRvazo6a3dfY2xhc3MsIHRvazo6a3dfc3RydWN0KSkKICAgICByZXR1cm4gNTAwMDsKQEAgLTExNTksMTcgKzEyNjcsMjUgQEAKICAgICByZXR1cm4gMjsKIAogICBpZiAoUmlnaHQuaXNNZW1iZXJBY2Nlc3MoKSkgewotICAgIGlmIChMZWZ0LmlzT25lT2YodG9rOjpyX3BhcmVuLCB0b2s6OnJfc3F1YXJlKSAmJiBMZWZ0Lk1hdGNoaW5nUGFyZW4gJiYKKyAgICBpZiAoTGVmdC5pcyh0b2s6OnJfcGFyZW4pICYmIExlZnQuTWF0Y2hpbmdQYXJlbiAmJgogICAgICAgICBMZWZ0Lk1hdGNoaW5nUGFyZW4tPlBhcmFtZXRlckNvdW50ID4gMCkKICAgICAgIHJldHVybiAyMDsgLy8gU2hvdWxkIGJlIHNtYWxsZXIgdGhhbiBicmVha2luZyBhdCBhIG5lc3RlZCBjb21tYS4KICAgICByZXR1cm4gMTUwOwogICB9CiAKLSAgLy8gQnJlYWtpbmcgYmVmb3JlIGEgdHJhaWxpbmcgJ2NvbnN0JyBvciBub3QtZnVuY3Rpb24tbGlrZSBhbm5vdGF0aW9uIGlzIGJhZC4KLSAgaWYgKExlZnQuaXModG9rOjpyX3BhcmVuKSAmJiBMaW5lLlR5cGUgIT0gTFRfT2JqQ1Byb3BlcnR5ICYmCi0gICAgICAoUmlnaHQuaXModG9rOjprd19jb25zdCkgfHwgKFJpZ2h0LmlzKHRvazo6aWRlbnRpZmllcikgJiYgUmlnaHQuTmV4dCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWdodC5OZXh0LT5pc05vdCh0b2s6OmxfcGFyZW4pKSkpCi0gICAgcmV0dXJuIDEwMDsKKyAgaWYgKFJpZ2h0LlR5cGUgPT0gVFRfVHJhaWxpbmdBbm5vdGF0aW9uICYmIFJpZ2h0Lk5leHQgJiYKKyAgICAgIFJpZ2h0Lk5leHQtPmlzTm90KHRvazo6bF9wYXJlbikpIHsKKyAgICAvLyBHZW5lcmFsbHksIGJyZWFraW5nIGJlZm9yZSBhIHRyYWlsaW5nIGFubm90YXRpb24gaXMgYmFkIHVubGVzcyBpdCBpcworICAgIC8vIGZ1bmN0aW9uLWxpa2UuIEl0IHNlZW1zIHRvIGJlIGVzcGVjaWFsbHkgcHJlZmVyYWJsZSB0byBrZWVwIHN0YW5kYXJkCisgICAgLy8gYW5ub3RhdGlvbnMgKGkuZS4gImNvbnN0IiwgImZpbmFsIiBhbmQgIm92ZXJyaWRlIikgb24gdGhlIHNhbWUgbGluZS4KKyAgICAvLyBVc2UgYSBzbGlnaHRseSBoaWdoZXIgcGVuYWx0eSBhZnRlciAiKSIgc28gdGhhdCBhbm5vdGF0aW9ucyBsaWtlCisgICAgLy8gImNvbnN0IG92ZXJyaWRlIiBhcmUga2VwdCB0b2dldGhlci4KKyAgICBib29sIGlzX3N0YW5kYXJkX2Fubm90YXRpb24gPSBSaWdodC5pcyh0b2s6Omt3X2NvbnN0KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0LlRva2VuVGV4dCA9PSAib3ZlcnJpZGUiIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQuVG9rZW5UZXh0ID09ICJmaW5hbCI7CisgICAgcmV0dXJuIChMZWZ0LmlzKHRvazo6cl9wYXJlbikgPyAxMDAgOiAxMjApICsKKyAgICAgICAgICAgKGlzX3N0YW5kYXJkX2Fubm90YXRpb24gPyA1MCA6IDApOworICB9CiAKICAgLy8gSW4gZm9yLWxvb3BzLCBwcmVmZXIgYnJlYWtpbmcgYXQgJywnIGFuZCAnOycuCiAgIGlmIChMaW5lLkZpcnN0LT5pcyh0b2s6Omt3X2ZvcikgJiYgTGVmdC5pcyh0b2s6OmVxdWFsKSkKQEAgLTExODAsMTAgKzEyOTYsMTIgQEAKICAgaWYgKFJpZ2h0LlR5cGUgPT0gVFRfT2JqQ1NlbGVjdG9yTmFtZSkKICAgICByZXR1cm4gMDsKICAgaWYgKExlZnQuaXModG9rOjpjb2xvbikgJiYgTGVmdC5UeXBlID09IFRUX09iakNNZXRob2RFeHByKQotICAgIHJldHVybiA1MDsKKyAgICByZXR1cm4gTGluZS5NaWdodEJlRnVuY3Rpb25EZWNsID8gNTAgOiA1MDA7CiAKICAgaWYgKExlZnQuaXModG9rOjpsX3BhcmVuKSAmJiBJbkZ1bmN0aW9uRGVjbCkKICAgICByZXR1cm4gMTAwOworICBpZiAoTGVmdC5pcyh0b2s6OmVxdWFsKSAmJiBJbkZ1bmN0aW9uRGVjbCkKKyAgICByZXR1cm4gMTEwOwogICBpZiAoTGVmdC5vcGVuc1Njb3BlKCkpCiAgICAgcmV0dXJuIExlZnQuUGFyYW1ldGVyQ291bnQgPiAxID8gU3R5bGUuUGVuYWx0eUJyZWFrQmVmb3JlRmlyc3RDYWxsUGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMTk7CkBAIC0xMjE1LDYgKzEzMzMsMTQgQEAKIGJvb2wgVG9rZW5Bbm5vdGF0b3I6OnNwYWNlUmVxdWlyZWRCZXR3ZWVuKGNvbnN0IEFubm90YXRlZExpbmUgJkxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXRUb2tlbiAmTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdFRva2VuICZSaWdodCkgeworICBpZiAoU3R5bGUuTGFuZ3VhZ2UgPT0gRm9ybWF0U3R5bGU6OkxLX1Byb3RvKSB7CisgICAgaWYgKFJpZ2h0LmlzKHRvazo6bF9wYXJlbikgJiYKKyAgICAgICAgKExlZnQuVG9rZW5UZXh0ID09ICJyZXR1cm5zIiB8fCBMZWZ0LlRva2VuVGV4dCA9PSAib3B0aW9uIikpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoU3R5bGUuT2JqQ1NwYWNlQWZ0ZXJQcm9wZXJ0eSAmJiBMaW5lLlR5cGUgPT0gTFRfT2JqQ1Byb3BlcnR5ICYmCisgICAgICBMZWZ0LlRvay5nZXRPYmpDS2V5d29yZElEKCkgPT0gdG9rOjpvYmpjX3Byb3BlcnR5KQorICAgIHJldHVybiB0cnVlOwogICBpZiAoUmlnaHQuaXModG9rOjpoYXNoaGFzaCkpCiAgICAgcmV0dXJuIExlZnQuaXModG9rOjpoYXNoKTsKICAgaWYgKExlZnQuaXNPbmVPZih0b2s6Omhhc2hoYXNoLCB0b2s6Omhhc2gpKQpAQCAtMTI0Niw3ICsxMzcyLDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIGlmIChMZWZ0LmlzKHRvazo6Y29sb25jb2xvbikpCiAgICAgcmV0dXJuIGZhbHNlOwotICBpZiAoUmlnaHQuaXModG9rOjpjb2xvbmNvbG9uKSkKKyAgaWYgKFJpZ2h0LmlzKHRvazo6Y29sb25jb2xvbikgJiYgTGVmdC5pc05vdCh0b2s6OmxfYnJhY2UpKQogICAgIHJldHVybiAoTGVmdC5pcyh0b2s6Omxlc3MpICYmIFN0eWxlLlN0YW5kYXJkID09IEZvcm1hdFN0eWxlOjpMU19DcHAwMykgfHwKICAgICAgICAgICAgIUxlZnQuaXNPbmVPZih0b2s6OmlkZW50aWZpZXIsIHRvazo6Z3JlYXRlciwgdG9rOjpsX3BhcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6cl9wYXJlbiwgdG9rOjpsZXNzKTsKQEAgLTEyNzMsMzUgKzEzOTksMzkgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIGlmIChMZWZ0LmlzKHRvazo6bF9zcXVhcmUpKQogICAgIHJldHVybiBMZWZ0LlR5cGUgPT0gVFRfQXJyYXlJbml0aWFsaXplckxTcXVhcmUgJiYKLSAgICAgICAgICAgUmlnaHQuaXNOb3QodG9rOjpyX3NxdWFyZSk7CisgICAgICAgICAgIFN0eWxlLlNwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHMgJiYgUmlnaHQuaXNOb3QodG9rOjpyX3NxdWFyZSk7CiAgIGlmIChSaWdodC5pcyh0b2s6OnJfc3F1YXJlKSkKLSAgICByZXR1cm4gUmlnaHQuTWF0Y2hpbmdQYXJlbiAmJgorICAgIHJldHVybiBSaWdodC5NYXRjaGluZ1BhcmVuICYmIFN0eWxlLlNwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHMgJiYKICAgICAgICAgICAgUmlnaHQuTWF0Y2hpbmdQYXJlbi0+VHlwZSA9PSBUVF9BcnJheUluaXRpYWxpemVyTFNxdWFyZTsKICAgaWYgKFJpZ2h0LmlzKHRvazo6bF9zcXVhcmUpICYmIFJpZ2h0LlR5cGUgIT0gVFRfT2JqQ01ldGhvZEV4cHIgJiYKICAgICAgIFJpZ2h0LlR5cGUgIT0gVFRfTGFtYmRhTFNxdWFyZSAmJiBMZWZ0LmlzTm90KHRvazo6bnVtZXJpY19jb25zdGFudCkpCiAgICAgcmV0dXJuIGZhbHNlOwogICBpZiAoTGVmdC5pcyh0b2s6OmNvbG9uKSkKICAgICByZXR1cm4gTGVmdC5UeXBlICE9IFRUX09iakNNZXRob2RFeHByOwotICBpZiAoUmlnaHQuaXModG9rOjpjb2xvbikpCi0gICAgcmV0dXJuIFJpZ2h0LlR5cGUgIT0gVFRfT2JqQ01ldGhvZEV4cHIgJiYgIUxlZnQuaXModG9rOjpxdWVzdGlvbik7CiAgIGlmIChSaWdodC5pcyh0b2s6OmxfcGFyZW4pKSB7Ci0gICAgaWYgKExlZnQuaXModG9rOjpyX3BhcmVuKSAmJiBMZWZ0Lk1hdGNoaW5nUGFyZW4gJiYKLSAgICAgICAgTGVmdC5NYXRjaGluZ1BhcmVuLT5QcmV2aW91cyAmJgotICAgICAgICBMZWZ0Lk1hdGNoaW5nUGFyZW4tPlByZXZpb3VzLT5pcyh0b2s6Omt3X19fYXR0cmlidXRlKSkKKyAgICBpZiAoTGVmdC5pcyh0b2s6OnJfcGFyZW4pICYmIExlZnQuVHlwZSA9PSBUVF9BdHRyaWJ1dGVQYXJlbikKICAgICAgIHJldHVybiB0cnVlOwogICAgIHJldHVybiBMaW5lLlR5cGUgPT0gTFRfT2JqQ0RlY2wgfHwKICAgICAgICAgICAgTGVmdC5pc09uZU9mKHRvazo6a3dfcmV0dXJuLCB0b2s6Omt3X25ldywgdG9rOjprd19kZWxldGUsCiAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OnNlbWkpIHx8Ci0gICAgICAgICAgIChTdHlsZS5TcGFjZUFmdGVyQ29udHJvbFN0YXRlbWVudEtleXdvcmQgJiYKLSAgICAgICAgICAgIExlZnQuaXNPbmVPZih0b2s6Omt3X2lmLCB0b2s6Omt3X2ZvciwgdG9rOjprd193aGlsZSwgdG9rOjprd19zd2l0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdG9rOjprd19jYXRjaCkpOworICAgICAgICAgICAoU3R5bGUuU3BhY2VCZWZvcmVQYXJlbnMgIT0gRm9ybWF0U3R5bGU6OlNCUE9fTmV2ZXIgJiYKKyAgICAgICAgICAgIChMZWZ0LmlzT25lT2YodG9rOjprd19pZiwgdG9rOjprd19mb3IsIHRvazo6a3dfd2hpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6a3dfc3dpdGNoLCB0b2s6Omt3X2NhdGNoKSB8fAorICAgICAgICAgICAgIExlZnQuSXNGb3JFYWNoTWFjcm8pKSB8fAorICAgICAgICAgICAoU3R5bGUuU3BhY2VCZWZvcmVQYXJlbnMgPT0gRm9ybWF0U3R5bGU6OlNCUE9fQWx3YXlzICYmCisgICAgICAgICAgICBMZWZ0LmlzT25lT2YodG9rOjppZGVudGlmaWVyLCB0b2s6Omt3X19fYXR0cmlidXRlKSAmJgorICAgICAgICAgICAgTGluZS5UeXBlICE9IExUX1ByZXByb2Nlc3NvckRpcmVjdGl2ZSk7CiAgIH0KICAgaWYgKExlZnQuaXModG9rOjphdCkgJiYgUmlnaHQuVG9rLmdldE9iakNLZXl3b3JkSUQoKSAhPSB0b2s6Om9iamNfbm90X2tleXdvcmQpCiAgICAgcmV0dXJuIGZhbHNlOwogICBpZiAoTGVmdC5pcyh0b2s6OmxfYnJhY2UpICYmIFJpZ2h0LmlzKHRvazo6cl9icmFjZSkpCiAgICAgcmV0dXJuICFMZWZ0LkNoaWxkcmVuLmVtcHR5KCk7IC8vIE5vIHNwYWNlcyBpbiAie30iLgotICBpZiAoTGVmdC5pcyh0b2s6OmxfYnJhY2UpIHx8IFJpZ2h0LmlzKHRvazo6cl9icmFjZSkpCisgIGlmICgoTGVmdC5pcyh0b2s6OmxfYnJhY2UpICYmIExlZnQuQmxvY2tLaW5kICE9IEJLX0Jsb2NrKSB8fAorICAgICAgKFJpZ2h0LmlzKHRvazo6cl9icmFjZSkgJiYgUmlnaHQuTWF0Y2hpbmdQYXJlbiAmJgorICAgICAgIFJpZ2h0Lk1hdGNoaW5nUGFyZW4tPkJsb2NrS2luZCAhPSBCS19CbG9jaykpCiAgICAgcmV0dXJuICFTdHlsZS5DcHAxMUJyYWNlZExpc3RTdHlsZTsKKyAgaWYgKExlZnQuVHlwZSA9PSBUVF9CbG9ja0NvbW1lbnQgJiYgTGVmdC5Ub2tlblRleHQuZW5kc3dpdGgoIj0qLyIpKQorICAgIHJldHVybiBmYWxzZTsKICAgaWYgKFJpZ2h0LlR5cGUgPT0gVFRfVW5hcnlPcGVyYXRvcikKICAgICByZXR1cm4gIUxlZnQuaXNPbmVPZih0b2s6OmxfcGFyZW4sIHRvazo6bF9zcXVhcmUsIHRvazo6YXQpICYmCiAgICAgICAgICAgIChMZWZ0LmlzTm90KHRvazo6Y29sb24pIHx8IExlZnQuVHlwZSAhPSBUVF9PYmpDTWV0aG9kRXhwcik7CkBAIC0xMzExLDggKzE0NDEsNiBAQAogICAgIHJldHVybiBmYWxzZTsKICAgaWYgKExlZnQuaXModG9rOjpwZXJpb2QpIHx8IFJpZ2h0LmlzKHRvazo6cGVyaW9kKSkKICAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChMZWZ0LlR5cGUgPT0gVFRfQmxvY2tDb21tZW50ICYmIExlZnQuVG9rZW5UZXh0LmVuZHN3aXRoKCI9Ki8iKSkKLSAgICByZXR1cm4gZmFsc2U7CiAgIGlmIChSaWdodC5pcyh0b2s6Omhhc2gpICYmIExlZnQuaXModG9rOjppZGVudGlmaWVyKSAmJiBMZWZ0LlRva2VuVGV4dCA9PSAiTCIpCiAgICAgcmV0dXJuIGZhbHNlOwogICByZXR1cm4gdHJ1ZTsKQEAgLTEzNTEsMTAgKzE0NzksMTEgQEAKICAgaWYgKFRvay5pcyh0b2s6OmNvbG9uKSkKICAgICByZXR1cm4gIUxpbmUuRmlyc3QtPmlzT25lT2YodG9rOjprd19jYXNlLCB0b2s6Omt3X2RlZmF1bHQpICYmCiAgICAgICAgICAgIFRvay5nZXROZXh0Tm9uQ29tbWVudCgpICE9IE5VTEwgJiYgVG9rLlR5cGUgIT0gVFRfT2JqQ01ldGhvZEV4cHIgJiYKLSAgICAgICAgICAgIVRvay5QcmV2aW91cy0+aXModG9rOjpxdWVzdGlvbik7CisgICAgICAgICAgICFUb2suUHJldmlvdXMtPmlzKHRvazo6cXVlc3Rpb24pICYmCisgICAgICAgICAgIChUb2suVHlwZSAhPSBUVF9EaWN0TGl0ZXJhbCB8fCBTdHlsZS5TcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzKTsKICAgaWYgKFRvay5QcmV2aW91cy0+VHlwZSA9PSBUVF9VbmFyeU9wZXJhdG9yIHx8CiAgICAgICBUb2suUHJldmlvdXMtPlR5cGUgPT0gVFRfQ2FzdFJQYXJlbikKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIFRvay5UeXBlID09IFRUX0JpbmFyeU9wZXJhdG9yOwogICBpZiAoVG9rLlByZXZpb3VzLT5pcyh0b2s6OmdyZWF0ZXIpICYmIFRvay5pcyh0b2s6OmdyZWF0ZXIpKSB7CiAgICAgcmV0dXJuIFRvay5UeXBlID09IFRUX1RlbXBsYXRlQ2xvc2VyICYmCiAgICAgICAgICAgIFRvay5QcmV2aW91cy0+VHlwZSA9PSBUVF9UZW1wbGF0ZUNsb3NlciAmJgpAQCAtMTM4MSwxMSArMTUxMCwxMyBAQAogCiBib29sIFRva2VuQW5ub3RhdG9yOjptdXN0QnJlYWtCZWZvcmUoY29uc3QgQW5ub3RhdGVkTGluZSAmTGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXRUb2tlbiAmUmlnaHQpIHsKKyAgY29uc3QgRm9ybWF0VG9rZW4gJkxlZnQgPSAqUmlnaHQuUHJldmlvdXM7CiAgIGlmIChSaWdodC5pcyh0b2s6OmNvbW1lbnQpKSB7Ci0gICAgcmV0dXJuIFJpZ2h0Lk5ld2xpbmVzQmVmb3JlID4gMDsKKyAgICByZXR1cm4gUmlnaHQuUHJldmlvdXMtPkJsb2NrS2luZCAhPSBCS19CcmFjZWRJbml0ICYmCisgICAgICAgICAgIFJpZ2h0LlByZXZpb3VzLT5UeXBlICE9IFRUX0N0b3JJbml0aWFsaXplckNvbG9uICYmCisgICAgICAgICAgIFJpZ2h0Lk5ld2xpbmVzQmVmb3JlID4gMDsKICAgfSBlbHNlIGlmIChSaWdodC5QcmV2aW91cy0+aXNUcmFpbGluZ0NvbW1lbnQoKSB8fAotICAgICAgICAgICAgIChSaWdodC5pcyh0b2s6OnN0cmluZ19saXRlcmFsKSAmJgotICAgICAgICAgICAgICBSaWdodC5QcmV2aW91cy0+aXModG9rOjpzdHJpbmdfbGl0ZXJhbCkpKSB7CisgICAgICAgICAgICAgKFJpZ2h0LmlzU3RyaW5nTGl0ZXJhbCgpICYmIFJpZ2h0LlByZXZpb3VzLT5pc1N0cmluZ0xpdGVyYWwoKSkpIHsKICAgICByZXR1cm4gdHJ1ZTsKICAgfSBlbHNlIGlmIChSaWdodC5QcmV2aW91cy0+SXNVbnRlcm1pbmF0ZWRMaXRlcmFsKSB7CiAgICAgcmV0dXJuIHRydWU7CkBAIC0xMzk1LDE5ICsxNTI2LDM0IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0gZWxzZSBpZiAoUmlnaHQuUHJldmlvdXMtPkNsb3Nlc1RlbXBsYXRlRGVjbGFyYXRpb24gJiYKICAgICAgICAgICAgICBSaWdodC5QcmV2aW91cy0+TWF0Y2hpbmdQYXJlbiAmJgotICAgICAgICAgICAgIFJpZ2h0LlByZXZpb3VzLT5NYXRjaGluZ1BhcmVuLT5CaW5kaW5nU3RyZW5ndGggPT0gMSAmJgorICAgICAgICAgICAgIFJpZ2h0LlByZXZpb3VzLT5NYXRjaGluZ1BhcmVuLT5OZXN0aW5nTGV2ZWwgPT0gMCAmJgogICAgICAgICAgICAgIFN0eWxlLkFsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnMpIHsKLSAgICAvLyBGSVhNRTogRml4IGhvcnJpYmxlIGhhY2sgb2YgdXNpbmcgQmluZGluZ1N0cmVuZ3RoIHRvIGZpbmQgdG9wLWxldmVsIDw+LgogICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKFJpZ2h0LlR5cGUgPT0gVFRfQ3RvckluaXRpYWxpemVyQ29tbWEgJiYKKyAgfSBlbHNlIGlmICgoUmlnaHQuVHlwZSA9PSBUVF9DdG9ySW5pdGlhbGl6ZXJDb21tYSB8fAorICAgICAgICAgICAgICBSaWdodC5UeXBlID09IFRUX0N0b3JJbml0aWFsaXplckNvbG9uKSAmJgogICAgICAgICAgICAgIFN0eWxlLkJyZWFrQ29uc3RydWN0b3JJbml0aWFsaXplcnNCZWZvcmVDb21tYSAmJgogICAgICAgICAgICAgICFTdHlsZS5Db25zdHJ1Y3RvckluaXRpYWxpemVyQWxsT25PbmVMaW5lT3JPbmVQZXJMaW5lKSB7CiAgICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoUmlnaHQuUHJldmlvdXMtPkJsb2NrS2luZCA9PSBCS19CbG9jayAmJgotICAgICAgICAgICAgIFJpZ2h0LlByZXZpb3VzLT5pc05vdCh0b2s6OnJfYnJhY2UpICYmIFJpZ2h0LmlzTm90KHRvazo6cl9icmFjZSkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKICAgfSBlbHNlIGlmIChSaWdodC5pcyh0b2s6OmxfYnJhY2UpICYmIChSaWdodC5CbG9ja0tpbmQgPT0gQktfQmxvY2spKSB7Ci0gICAgcmV0dXJuIFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19BbGxtYW47CisgICAgcmV0dXJuIFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19BbGxtYW4gfHwKKyAgICAgICAgICAgU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX0dOVTsKKyAgfSBlbHNlIGlmIChSaWdodC5pcyh0b2s6OnN0cmluZ19saXRlcmFsKSAmJgorICAgICAgICAgICAgIFJpZ2h0LlRva2VuVGV4dC5zdGFydHN3aXRoKCJSXCIiKSkgeworICAgIC8vIFJhdyBzdHJpbmcgbGl0ZXJhbHMgYXJlIHNwZWNpYWwgd3J0LiBsaW5lIGJyZWFrcy4gVGhlIGF1dGhvciBoYXMgbWFkZSBhCisgICAgLy8gZGVsaWJlcmF0ZSBjaG9pY2UgYW5kIG1pZ2h0IGhhdmUgYWxpZ25lZCB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZworICAgIC8vIGxpdGVyYWwgYWNjb3JkaW5nbHkuIFRodXMsIHdlIHRyeSBrZWVwIGV4aXN0aW5nIGxpbmUgYnJlYWtzLgorICAgIHJldHVybiBSaWdodC5OZXdsaW5lc0JlZm9yZSA+IDA7CisgIH0gZWxzZSBpZiAoUmlnaHQuUHJldmlvdXMtPmlzKHRvazo6bF9icmFjZSkgJiYgUmlnaHQuTmVzdGluZ0xldmVsID09IDEgJiYKKyAgICAgICAgICAgICBTdHlsZS5MYW5ndWFnZSA9PSBGb3JtYXRTdHlsZTo6TEtfUHJvdG8pIHsKKyAgICAvLyBEb24ndCBlbnVtcyBvbnRvIHNpbmdsZSBsaW5lcyBpbiBwcm90b2NvbCBidWZmZXJzLgorICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKChMZWZ0LmlzKHRvazo6bF9icmFjZSkgJiYgTGVmdC5NYXRjaGluZ1BhcmVuICYmCisgICAgICAgICAgICAgIExlZnQuTWF0Y2hpbmdQYXJlbi0+UHJldmlvdXMgJiYKKyAgICAgICAgICAgICAgTGVmdC5NYXRjaGluZ1BhcmVuLT5QcmV2aW91cy0+aXModG9rOjpjb21tYSkpIHx8CisgICAgICAgICAgICAgKFJpZ2h0LmlzKHRvazo6cl9icmFjZSkgJiYgTGVmdC5pcyh0b2s6OmNvbW1hKSkpIHsKKyAgICAvLyBJZiB0aGUgbGFzdCB0b2tlbiBiZWZvcmUgYSAnfScgaXMgYSBjb21tYSwgdGhlIGludGVudGlvbiBpcyB0byBpbnNlcnQgYQorICAgIC8vIGxpbmUgYnJlYWsgYWZ0ZXIgaXQgaW4gb3JkZXIgdG8gbWFrZSBzaHVmZmxpbmcgYXJvdW5kIGVudHJpZXMgZWFzaWVyLgorICAgIHJldHVybiB0cnVlOwogICB9CiAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTE0MTUsMTIgKzE1NjEsMTcgQEAKIGJvb2wgVG9rZW5Bbm5vdGF0b3I6OmNhbkJyZWFrQmVmb3JlKGNvbnN0IEFubm90YXRlZExpbmUgJkxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXRUb2tlbiAmUmlnaHQpIHsKICAgY29uc3QgRm9ybWF0VG9rZW4gJkxlZnQgPSAqUmlnaHQuUHJldmlvdXM7CisgIGlmIChMZWZ0LmlzKHRvazo6YXQpKQorICAgIHJldHVybiBmYWxzZTsKICAgaWYgKFJpZ2h0LlR5cGUgPT0gVFRfU3RhcnRPZk5hbWUgfHwgUmlnaHQuaXModG9rOjprd19vcGVyYXRvcikpCiAgICAgcmV0dXJuIHRydWU7CiAgIGlmIChSaWdodC5pc1RyYWlsaW5nQ29tbWVudCgpKQogICAgIC8vIFdlIHJlbHkgb24gTXVzdEJyZWFrQmVmb3JlIGJlaW5nIHNldCBjb3JyZWN0bHkgaGVyZSBhcyB3ZSBzaG91bGQgbm90CiAgICAgLy8gY2hhbmdlIHRoZSAiYmluZGluZyIgYmVoYXZpb3Igb2YgYSBjb21tZW50LgotICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBUaGUgZmlyc3QgY29tbWVudCBpbiBhIGJyYWNlZCBsaXN0cyBpcyBhbHdheXMgaW50ZXJwcmV0ZWQgYXMgYmVsb25naW5nIHRvCisgICAgLy8gdGhlIGZpcnN0IGxpc3QgZWxlbWVudC4gT3RoZXJ3aXNlLCBpdCBzaG91bGQgYmUgcGxhY2VkIG91dHNpZGUgb2YgdGhlCisgICAgLy8gbGlzdC4KKyAgICByZXR1cm4gTGVmdC5CbG9ja0tpbmQgPT0gQktfQnJhY2VkSW5pdDsKICAgaWYgKExlZnQuaXModG9rOjpxdWVzdGlvbikgJiYgUmlnaHQuaXModG9rOjpjb2xvbikpCiAgICAgcmV0dXJuIGZhbHNlOwogICBpZiAoUmlnaHQuVHlwZSA9PSBUVF9Db25kaXRpb25hbEV4cHIgfHwgUmlnaHQuaXModG9rOjpxdWVzdGlvbikpCkBAIC0xNDMwLDYgKzE1ODEsOCBAQAogICBpZiAoUmlnaHQuaXModG9rOjpjb2xvbikgJiYKICAgICAgIChSaWdodC5UeXBlID09IFRUX0RpY3RMaXRlcmFsIHx8IFJpZ2h0LlR5cGUgPT0gVFRfT2JqQ01ldGhvZEV4cHIpKQogICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKFJpZ2h0LlR5cGUgPT0gVFRfSW5oZXJpdGFuY2VDb2xvbikKKyAgICByZXR1cm4gdHJ1ZTsKICAgaWYgKExlZnQuaXModG9rOjpjb2xvbikgJiYKICAgICAgIChMZWZ0LlR5cGUgPT0gVFRfRGljdExpdGVyYWwgfHwgTGVmdC5UeXBlID09IFRUX09iakNNZXRob2RFeHByKSkKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE0NTIsMTQgKzE2MDUsMTIgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIGlmIChMZWZ0LmlzKHRvazo6ZXF1YWwpICYmIExpbmUuVHlwZSA9PSBMVF9WaXJ0dWFsRnVuY3Rpb25EZWNsKQogICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKExlZnQuUHJldmlvdXMpIHsKLSAgICBpZiAoTGVmdC5pcyh0b2s6OmxfcGFyZW4pICYmIFJpZ2h0LmlzKHRvazo6bF9wYXJlbikgJiYKLSAgICAgICAgTGVmdC5QcmV2aW91cy0+aXModG9rOjprd19fX2F0dHJpYnV0ZSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKExlZnQuaXModG9rOjpsX3BhcmVuKSAmJiAoTGVmdC5QcmV2aW91cy0+VHlwZSA9PSBUVF9CaW5hcnlPcGVyYXRvciB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZnQuUHJldmlvdXMtPlR5cGUgPT0gVFRfQ2FzdFJQYXJlbikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKyAgaWYgKExlZnQuaXModG9rOjpsX3BhcmVuKSAmJiBMZWZ0LlR5cGUgPT0gVFRfQXR0cmlidXRlUGFyZW4pCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoTGVmdC5pcyh0b2s6OmxfcGFyZW4pICYmIExlZnQuUHJldmlvdXMgJiYKKyAgICAgIChMZWZ0LlByZXZpb3VzLT5UeXBlID09IFRUX0JpbmFyeU9wZXJhdG9yIHx8CisgICAgICAgTGVmdC5QcmV2aW91cy0+VHlwZSA9PSBUVF9DYXN0UlBhcmVuKSkKKyAgICByZXR1cm4gZmFsc2U7CiAgIGlmIChSaWdodC5UeXBlID09IFRUX0ltcGxpY2l0U3RyaW5nTGl0ZXJhbCkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTE0ODksNyArMTY0MCw3IEBACiAgIGlmIChSaWdodC5UeXBlID09IFRUX0N0b3JJbml0aWFsaXplckNvbW1hICYmCiAgICAgICBTdHlsZS5CcmVha0NvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzQmVmb3JlQ29tbWEpCiAgICAgcmV0dXJuIHRydWU7Ci0gIGlmIChSaWdodC5pc0JpbmFyeU9wZXJhdG9yKCkgJiYgU3R5bGUuQnJlYWtCZWZvcmVCaW5hcnlPcGVyYXRvcnMpCisgIGlmIChSaWdodC5UeXBlID09IFRUX0JpbmFyeU9wZXJhdG9yICYmIFN0eWxlLkJyZWFrQmVmb3JlQmluYXJ5T3BlcmF0b3JzKQogICAgIHJldHVybiB0cnVlOwogICBpZiAoTGVmdC5pcyh0b2s6OmdyZWF0ZXIpICYmIFJpZ2h0LmlzKHRvazo6Z3JlYXRlcikgJiYKICAgICAgIExlZnQuVHlwZSAhPSBUVF9UZW1wbGF0ZUNsb3NlcikKQEAgLTE1MDMsNyArMTY1NCw3IEBACiAgICAgICAgICBSaWdodC5pc09uZU9mKHRvazo6bGVzc2xlc3MsIHRvazo6YXJyb3csIHRvazo6cGVyaW9kLCB0b2s6OmNvbG9uLAogICAgICAgICAgICAgICAgICAgICAgICB0b2s6Omxfc3F1YXJlLCB0b2s6OmF0KSB8fAogICAgICAgICAgKExlZnQuaXModG9rOjpyX3BhcmVuKSAmJgotICAgICAgICAgIFJpZ2h0LmlzT25lT2YodG9rOjppZGVudGlmaWVyLCB0b2s6Omt3X2NvbnN0LCB0b2s6Omt3X19fYXR0cmlidXRlKSkgfHwKKyAgICAgICAgICBSaWdodC5pc09uZU9mKHRvazo6aWRlbnRpZmllciwgdG9rOjprd19jb25zdCkpIHx8CiAgICAgICAgICAoTGVmdC5pcyh0b2s6OmxfcGFyZW4pICYmICFSaWdodC5pcyh0b2s6OnJfcGFyZW4pKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL0Zvcm1hdC9Ub2tlbkFubm90YXRvci5oIGIvbGliL0Zvcm1hdC9Ub2tlbkFubm90YXRvci5oCmluZGV4IGFhNDliMmEuLmJkOTE5ODAgMTAwNjQ0Ci0tLSBhL2xpYi9Gb3JtYXQvVG9rZW5Bbm5vdGF0b3IuaAorKysgYi9saWIvRm9ybWF0L1Rva2VuQW5ub3RhdG9yLmgKQEAgLTQxLDcgKzQxLDggQEAKICAgICAgIDogRmlyc3QoTGluZS5Ub2tlbnMuZnJvbnQoKS5Ub2spLCBMZXZlbChMaW5lLkxldmVsKSwKICAgICAgICAgSW5QUERpcmVjdGl2ZShMaW5lLkluUFBEaXJlY3RpdmUpLAogICAgICAgICBNdXN0QmVEZWNsYXJhdGlvbihMaW5lLk11c3RCZURlY2xhcmF0aW9uKSwgTWlnaHRCZUZ1bmN0aW9uRGVjbChmYWxzZSksCi0gICAgICAgIFN0YXJ0c0RlZmluaXRpb24oZmFsc2UpIHsKKyAgICAgICAgU3RhcnRzRGVmaW5pdGlvbihmYWxzZSksIEFmZmVjdGVkKGZhbHNlKSwKKyAgICAgICAgTGVhZGluZ0VtcHR5TGluZXNBZmZlY3RlZChmYWxzZSksIENoaWxkcmVuQWZmZWN0ZWQoZmFsc2UpIHsKICAgICBhc3NlcnQoIUxpbmUuVG9rZW5zLmVtcHR5KCkpOwogCiAgICAgLy8gQ2FsY3VsYXRlIE5leHQgYW5kIFByZXZpb3VzIGZvciBhbGwgdG9rZW5zLiBOb3RlIHRoYXQgd2UgbXVzdCBvdmVyd3JpdGUKQEAgLTg3LDYgKzg4LDE3IEBACiAgIGJvb2wgTWlnaHRCZUZ1bmN0aW9uRGVjbDsKICAgYm9vbCBTdGFydHNEZWZpbml0aW9uOwogCisgIC8vLyBcYyBUcnVlIGlmIHRoaXMgbGluZSBzaG91bGQgYmUgZm9ybWF0dGVkLCBpLmUuIGludGVyc2VjdHMgZGlyZWN0bHkgb3IKKyAgLy8vIGluZGlyZWN0bHkgd2l0aCBvbmUgb2YgdGhlIGlucHV0IHJhbmdlcy4KKyAgYm9vbCBBZmZlY3RlZDsKKworICAvLy8gXGMgVHJ1ZSBpZiB0aGUgbGVhZGluZyBlbXB0eSBsaW5lcyBvZiB0aGlzIGxpbmUgaW50ZXJzZWN0IHdpdGggb25lIG9mIHRoZQorICAvLy8gaW5wdXQgcmFuZ2VzLgorICBib29sIExlYWRpbmdFbXB0eUxpbmVzQWZmZWN0ZWQ7CisKKyAgLy8vIFxjIFRydWUgaWYgYSBvbmUgb2YgdGhpcyBsaW5lJ3MgY2hpbGRyZW4gaW50ZXJzZWN0cyB3aXRoIGFuIGlucHV0IHJhbmdlLgorICBib29sIENoaWxkcmVuQWZmZWN0ZWQ7CisKIHByaXZhdGU6CiAgIC8vIERpc2FsbG93IGNvcHlpbmcuCiAgIEFubm90YXRlZExpbmUoY29uc3QgQW5ub3RhdGVkTGluZSAmKSBMTFZNX0RFTEVURURfRlVOQ1RJT047CmRpZmYgLS1naXQgYS9saWIvRm9ybWF0L1Vud3JhcHBlZExpbmVQYXJzZXIuY3BwIGIvbGliL0Zvcm1hdC9VbndyYXBwZWRMaW5lUGFyc2VyLmNwcAppbmRleCBlMGIwOTBmLi45NmQ4MTU1IDEwMDY0NAotLS0gYS9saWIvRm9ybWF0L1Vud3JhcHBlZExpbmVQYXJzZXIuY3BwCisrKyBiL2xpYi9Gb3JtYXQvVW53cmFwcGVkTGluZVBhcnNlci5jcHAKQEAgLTc0LDcgKzc0LDcgQEAKICAgICBTdHJ1Y3R1cmFsRXJyb3IgPSBQcmV2aW91c1N0cnVjdHVyYWxFcnJvcjsKICAgfQogCi0gIHZpcnR1YWwgRm9ybWF0VG9rZW4gKmdldE5leHRUb2tlbigpIHsKKyAgRm9ybWF0VG9rZW4gKmdldE5leHRUb2tlbigpIG92ZXJyaWRlIHsKICAgICAvLyBUaGUgXGMgVW53cmFwcGVkTGluZVBhcnNlciBndWFyZHMgYWdhaW5zdCB0aGlzIGJ5IG5ldmVyIGNhbGxpbmcKICAgICAvLyBcYyBnZXROZXh0VG9rZW4oKSBhZnRlciBpdCBoYXMgZW5jb3VudGVyZWQgdGhlIGZpcnN0IGVvZiB0b2tlbi4KICAgICBhc3NlcnQoIWVvZigpKTsKQEAgLTg0LDkgKzg0LDkgQEAKICAgICByZXR1cm4gVG9rZW47CiAgIH0KIAotICB2aXJ0dWFsIHVuc2lnbmVkIGdldFBvc2l0aW9uKCkgeyByZXR1cm4gUHJldmlvdXNUb2tlblNvdXJjZS0+Z2V0UG9zaXRpb24oKTsgfQorICB1bnNpZ25lZCBnZXRQb3NpdGlvbigpIG92ZXJyaWRlIHsgcmV0dXJuIFByZXZpb3VzVG9rZW5Tb3VyY2UtPmdldFBvc2l0aW9uKCk7IH0KIAotICB2aXJ0dWFsIEZvcm1hdFRva2VuICpzZXRQb3NpdGlvbih1bnNpZ25lZCBQb3NpdGlvbikgeworICBGb3JtYXRUb2tlbiAqc2V0UG9zaXRpb24odW5zaWduZWQgUG9zaXRpb24pIG92ZXJyaWRlIHsKICAgICBUb2tlbiA9IFByZXZpb3VzVG9rZW5Tb3VyY2UtPnNldFBvc2l0aW9uKFBvc2l0aW9uKTsKICAgICByZXR1cm4gVG9rZW47CiAgIH0KQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgICAgUGFyc2VyLkN1cnJlbnRMaW5lcyA9ICZQYXJzZXIuUHJlcHJvY2Vzc29yRGlyZWN0aXZlczsKICAgICBlbHNlIGlmICghUGFyc2VyLkxpbmUtPlRva2Vucy5lbXB0eSgpKQogICAgICAgUGFyc2VyLkN1cnJlbnRMaW5lcyA9ICZQYXJzZXIuTGluZS0+VG9rZW5zLmJhY2soKS5DaGlsZHJlbjsKLSAgICBQcmVCbG9ja0xpbmUgPSBQYXJzZXIuTGluZS50YWtlKCk7CisgICAgUHJlQmxvY2tMaW5lID0gUGFyc2VyLkxpbmUucmVsZWFzZSgpOwogICAgIFBhcnNlci5MaW5lLnJlc2V0KG5ldyBVbndyYXBwZWRMaW5lKCkpOwogICAgIFBhcnNlci5MaW5lLT5MZXZlbCA9IFByZUJsb2NrTGluZS0+TGV2ZWw7CiAgICAgUGFyc2VyLkxpbmUtPkluUFBEaXJlY3RpdmUgPSBQcmVCbG9ja0xpbmUtPkluUFBEaXJlY3RpdmU7CkBAIC0xNTIsNiArMTUyLDI3IEBACiAgIFNtYWxsVmVjdG9ySW1wbDxVbndyYXBwZWRMaW5lPiAqT3JpZ2luYWxMaW5lczsKIH07CiAKK2NsYXNzIENvbXBvdW5kU3RhdGVtZW50SW5kZW50ZXIgeworcHVibGljOgorICBDb21wb3VuZFN0YXRlbWVudEluZGVudGVyKFVud3JhcHBlZExpbmVQYXJzZXIgKlBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXRTdHlsZSAmU3R5bGUsIHVuc2lnbmVkICZMaW5lTGV2ZWwpCisgICAgICA6IExpbmVMZXZlbChMaW5lTGV2ZWwpLCBPbGRMaW5lTGV2ZWwoTGluZUxldmVsKSB7CisgICAgaWYgKFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19BbGxtYW4pIHsKKyAgICAgIFBhcnNlci0+YWRkVW53cmFwcGVkTGluZSgpOworICAgIH0gZWxzZSBpZiAoU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX0dOVSkgeworICAgICAgUGFyc2VyLT5hZGRVbndyYXBwZWRMaW5lKCk7CisgICAgICArK0xpbmVMZXZlbDsKKyAgICB9CisgIH0KKyAgfkNvbXBvdW5kU3RhdGVtZW50SW5kZW50ZXIoKSB7CisgICAgTGluZUxldmVsID0gT2xkTGluZUxldmVsOworICB9CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkICZMaW5lTGV2ZWw7CisgIHVuc2lnbmVkIE9sZExpbmVMZXZlbDsKK307CisKIG5hbWVzcGFjZSB7CiAKIGNsYXNzIEluZGV4ZWRUb2tlblNvdXJjZSA6IHB1YmxpYyBGb3JtYXRUb2tlblNvdXJjZSB7CkBAIC0xNTksMTcgKzE4MCwxNyBAQAogICBJbmRleGVkVG9rZW5Tb3VyY2UoQXJyYXlSZWY8Rm9ybWF0VG9rZW4gKj4gVG9rZW5zKQogICAgICAgOiBUb2tlbnMoVG9rZW5zKSwgUG9zaXRpb24oLTEpIHt9CiAKLSAgdmlydHVhbCBGb3JtYXRUb2tlbiAqZ2V0TmV4dFRva2VuKCkgeworICBGb3JtYXRUb2tlbiAqZ2V0TmV4dFRva2VuKCkgb3ZlcnJpZGUgewogICAgICsrUG9zaXRpb247CiAgICAgcmV0dXJuIFRva2Vuc1tQb3NpdGlvbl07CiAgIH0KIAotICB2aXJ0dWFsIHVuc2lnbmVkIGdldFBvc2l0aW9uKCkgeworICB1bnNpZ25lZCBnZXRQb3NpdGlvbigpIG92ZXJyaWRlIHsKICAgICBhc3NlcnQoUG9zaXRpb24gPj0gMCk7CiAgICAgcmV0dXJuIFBvc2l0aW9uOwogICB9CiAKLSAgdmlydHVhbCBGb3JtYXRUb2tlbiAqc2V0UG9zaXRpb24odW5zaWduZWQgUCkgeworICBGb3JtYXRUb2tlbiAqc2V0UG9zaXRpb24odW5zaWduZWQgUCkgb3ZlcnJpZGUgewogICAgIFBvc2l0aW9uID0gUDsKICAgICByZXR1cm4gVG9rZW5zW1Bvc2l0aW9uXTsKICAgfQpAQCAtMzIyLDcgKzM0Myw3IEBACiAgICAgICAgICAgLy8gKGZvciBleGFtcGxlIHdoaWxlIHBhcnNpbmcgbGFtYmRhcykuCiAgICAgICAgICAgLy8KICAgICAgICAgICAvLyBXZSBleGNsdWRlICsgYW5kIC0gYXMgdGhleSBjYW4gYmUgT2JqQyB2aXNpYmlsaXR5IG1vZGlmaWVycy4KLSAgICAgICAgICBpZiAoTmV4dFRvay0+aXNPbmVPZih0b2s6OmNvbW1hLCB0b2s6OnNlbWksIHRvazo6cl9wYXJlbiwKKyAgICAgICAgICBpZiAoTmV4dFRvay0+aXNPbmVPZih0b2s6OmNvbW1hLCB0b2s6OnNlbWksIHRvazo6cl9wYXJlbiwgdG9rOjpwZXJpb2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rOjpyX3NxdWFyZSwgdG9rOjpsX2JyYWNlLCB0b2s6OmNvbG9uKSB8fAogICAgICAgICAgICAgICAoTmV4dFRvay0+aXNCaW5hcnlPcGVyYXRvcigpICYmCiAgICAgICAgICAgICAgICAhTmV4dFRvay0+aXNPbmVPZih0b2s6OnBsdXMsIHRvazo6bWludXMpKSkgewpAQCAtMzM2LDYgKzM1Nyw3IEBACiAgICAgICAgIExCcmFjZVN0YWNrLnBvcF9iYWNrKCk7CiAgICAgICB9CiAgICAgICBicmVhazsKKyAgICBjYXNlIHRvazo6YXQ6CiAgICAgY2FzZSB0b2s6OnNlbWk6CiAgICAgY2FzZSB0b2s6Omt3X2lmOgogICAgIGNhc2UgdG9rOjprd193aGlsZToKQEAgLTQ4OCw3ICs1MTAsOSBAQAogICAgICAgUFBMZXZlbEJyYW5jaENvdW50W1BQQnJhbmNoTGV2ZWxdID0gUFBDaGFpbkJyYW5jaEluZGV4LnRvcCgpICsgMTsKICAgICB9CiAgIH0KLSAgLS1QUEJyYW5jaExldmVsOworICAvLyBHdWFyZCBhZ2FpbnN0ICNlbmRpZidzIHdpdGhvdXQgI2lmLgorICBpZiAoUFBCcmFuY2hMZXZlbCA+IDApCisgICAgLS1QUEJyYW5jaExldmVsOwogICBpZiAoIVBQQ2hhaW5CcmFuY2hJbmRleC5lbXB0eSgpKQogICAgIFBQQ2hhaW5CcmFuY2hJbmRleC5wb3AoKTsKICAgaWYgKCFQUFN0YWNrLmVtcHR5KCkpCkBAIC02MjAsOSArNjQ0LDYgQEAKICAgY2FzZSB0b2s6Omt3X2Nhc2U6CiAgICAgcGFyc2VDYXNlTGFiZWwoKTsKICAgICByZXR1cm47Ci0gIGNhc2UgdG9rOjprd19yZXR1cm46Ci0gICAgcGFyc2VSZXR1cm4oKTsKLSAgICByZXR1cm47CiAgIGNhc2UgdG9rOjprd19leHRlcm46CiAgICAgbmV4dFRva2VuKCk7CiAgICAgaWYgKEZvcm1hdFRvay0+VG9rLmlzKHRvazo6c3RyaW5nX2xpdGVyYWwpKSB7CkBAIC02MzMsNiArNjU0LDEyIEBACiAgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgdG9rOjppZGVudGlmaWVyOgorICAgIGlmIChGb3JtYXRUb2stPklzRm9yRWFjaE1hY3JvKSB7CisgICAgICBwYXJzZUZvck9yV2hpbGVMb29wKCk7CisgICAgICByZXR1cm47CisgICAgfQogICAgIC8vIEluIGFsbCBvdGhlciBjYXNlcywgcGFyc2UgdGhlIGRlY2xhcmF0aW9uLgogICAgIGJyZWFrOwogICBkZWZhdWx0OgpAQCAtNjQ4LDYgKzY3NSwxMiBAQAogICAgIGNhc2UgdG9rOjprd19lbnVtOgogICAgICAgcGFyc2VFbnVtKCk7CiAgICAgICBicmVhazsKKyAgICBjYXNlIHRvazo6a3dfdHlwZWRlZjoKKyAgICAgIG5leHRUb2tlbigpOworICAgICAgLy8gRklYTUU6IFVzZSB0aGUgSWRlbnRpZmllclRhYmxlIGluc3RlYWQuCisgICAgICBpZiAoRm9ybWF0VG9rLT5Ub2tlblRleHQgPT0gIk5TX0VOVU0iKQorICAgICAgICBwYXJzZUVudW0oKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19zdHJ1Y3Q6CiAgICAgY2FzZSB0b2s6Omt3X3VuaW9uOgogICAgIGNhc2UgdG9rOjprd19jbGFzczoKQEAgLTY2Nyw5ICs3MDAsMTMgQEAKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjpjYXJldDoKICAgICAgIG5leHRUb2tlbigpOwotICAgICAgaWYgKEZvcm1hdFRvay0+aXModG9rOjpsX2JyYWNlKSkgeworICAgICAgaWYgKEZvcm1hdFRvay0+VG9rLmlzQW55SWRlbnRpZmllcigpIHx8CisgICAgICAgICAgRm9ybWF0VG9rLT5pc1NpbXBsZVR5cGVTcGVjaWZpZXIoKSkKKyAgICAgICAgbmV4dFRva2VuKCk7CisgICAgICBpZiAoRm9ybWF0VG9rLT5pcyh0b2s6OmxfcGFyZW4pKQorICAgICAgICBwYXJzZVBhcmVucygpOworICAgICAgaWYgKEZvcm1hdFRvay0+aXModG9rOjpsX2JyYWNlKSkKICAgICAgICAgcGFyc2VDaGlsZEJsb2NrKCk7Ci0gICAgICB9CiAgICAgICBicmVhazsKICAgICBjYXNlIHRvazo6bF9icmFjZToKICAgICAgIGlmICghdHJ5VG9QYXJzZUJyYWNlZExpc3QoKSkgewpAQCAtNjc3LDEwICs3MTQsOSBAQAogICAgICAgICAvLyBzdHJ1Y3R1cmFsIGVsZW1lbnQuCiAgICAgICAgIC8vIEZJWE1FOiBGaWd1cmUgb3V0IGNhc2VzIHdoZXJlIHRoaXMgaXMgbm90IHRydWUsIGFuZCBhZGQgcHJvamVjdGlvbnMKICAgICAgICAgLy8gZm9yIHRoZW0gKHRoZSBvbmUgd2Uga25vdyBpcyBtaXNzaW5nIGFyZSBsYW1iZGFzKS4KLSAgICAgICAgaWYgKFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19MaW51eCB8fAotICAgICAgICAgICAgU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX1N0cm91c3RydXAgfHwKLSAgICAgICAgICAgIFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19BbGxtYW4pCisgICAgICAgIGlmIChTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyAhPSBGb3JtYXRTdHlsZTo6QlNfQXR0YWNoKQogICAgICAgICAgIGFkZFVud3JhcHBlZExpbmUoKTsKKyAgICAgICAgRm9ybWF0VG9rLT5UeXBlID0gVFRfRnVuY3Rpb25MQnJhY2U7CiAgICAgICAgIHBhcnNlQmxvY2soLypNdXN0QmVEZWNsYXJhdGlvbj0qL2ZhbHNlKTsKICAgICAgICAgYWRkVW53cmFwcGVkTGluZSgpOwogICAgICAgICByZXR1cm47CkBAIC02OTksOCArNzM1LDggQEAKICAgICAgICAgLy8gUmVjb2duaXplIGZ1bmN0aW9uLWxpa2UgbWFjcm8gdXNhZ2VzIHdpdGhvdXQgdHJhaWxpbmcgc2VtaWNvbG9uLgogICAgICAgICBpZiAoRm9ybWF0VG9rLT5Ub2suaXModG9rOjpsX3BhcmVuKSkgewogICAgICAgICAgIHBhcnNlUGFyZW5zKCk7Ci0gICAgICAgICAgaWYgKEZvcm1hdFRvay0+SGFzVW5lc2NhcGVkTmV3bGluZSAmJgotICAgICAgICAgICAgICB0b2tlbkNhblN0YXJ0TmV3TGluZShGb3JtYXRUb2stPlRvaykpIHsKKyAgICAgICAgICBpZiAoRm9ybWF0VG9rLT5OZXdsaW5lc0JlZm9yZSA+IDAgJiYKKyAgICAgICAgICAgICAgdG9rZW5DYW5TdGFydE5ld0xpbmUoRm9ybWF0VG9rLT5Ub2spICYmIFRleHQgPT0gVGV4dC51cHBlcigpKSB7CiAgICAgICAgICAgICBhZGRVbndyYXBwZWRMaW5lKCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgfQpAQCAtNzIwLDcgKzc1Niw3IEBACiAgICAgICB9CiAgICAgICBicmVhazsKICAgICBjYXNlIHRvazo6bF9zcXVhcmU6Ci0gICAgICB0cnlUb1BhcnNlTGFtYmRhKCk7CisgICAgICBwYXJzZVNxdWFyZSgpOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIG5leHRUb2tlbigpOwpAQCAtNzI5LDM2ICs3NjUsNTAgQEAKICAgfSB3aGlsZSAoIWVvZigpKTsKIH0KIAotdm9pZCBVbndyYXBwZWRMaW5lUGFyc2VyOjp0cnlUb1BhcnNlTGFtYmRhKCkgeworYm9vbCBVbndyYXBwZWRMaW5lUGFyc2VyOjp0cnlUb1BhcnNlTGFtYmRhKCkgewogICAvLyBGSVhNRTogVGhpcyBpcyBhIGRpcnR5IHdheSB0byBhY2Nlc3MgdGhlIHByZXZpb3VzIHRva2VuLiBGaW5kIGEgYmV0dGVyCiAgIC8vIHNvbHV0aW9uLgogICBpZiAoIUxpbmUtPlRva2Vucy5lbXB0eSgpICYmCi0gICAgICBMaW5lLT5Ub2tlbnMuYmFjaygpLlRvay0+aXNPbmVPZih0b2s6OmlkZW50aWZpZXIsIHRvazo6a3dfb3BlcmF0b3IpKSB7CisgICAgICAoTGluZS0+VG9rZW5zLmJhY2soKS5Ub2stPmlzT25lT2YodG9rOjppZGVudGlmaWVyLCB0b2s6Omt3X29wZXJhdG9yKSB8fAorICAgICAgIExpbmUtPlRva2Vucy5iYWNrKCkuVG9rLT5jbG9zZXNTY29wZSgpIHx8CisgICAgICAgTGluZS0+VG9rZW5zLmJhY2soKS5Ub2stPmlzU2ltcGxlVHlwZVNwZWNpZmllcigpKSkgewogICAgIG5leHRUb2tlbigpOwotICAgIHJldHVybjsKKyAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgYXNzZXJ0KEZvcm1hdFRvay0+aXModG9rOjpsX3NxdWFyZSkpOwogICBGb3JtYXRUb2tlbiAmTFNxdWFyZSA9ICpGb3JtYXRUb2s7CiAgIGlmICghdHJ5VG9QYXJzZUxhbWJkYUludHJvZHVjZXIoKSkKLSAgICByZXR1cm47CisgICAgcmV0dXJuIGZhbHNlOwogCiAgIHdoaWxlIChGb3JtYXRUb2stPmlzTm90KHRvazo6bF9icmFjZSkpIHsKKyAgICBpZiAoRm9ybWF0VG9rLT5pc1NpbXBsZVR5cGVTcGVjaWZpZXIoKSkgeworICAgICAgbmV4dFRva2VuKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CiAgICAgc3dpdGNoIChGb3JtYXRUb2stPlRvay5nZXRLaW5kKCkpIHsKICAgICBjYXNlIHRvazo6bF9icmFjZToKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjpsX3BhcmVuOgogICAgICAgcGFyc2VQYXJlbnMoKTsKICAgICAgIGJyZWFrOworICAgIGNhc2UgdG9rOjpsZXNzOgorICAgIGNhc2UgdG9rOjpncmVhdGVyOgogICAgIGNhc2UgdG9rOjppZGVudGlmaWVyOgorICAgIGNhc2UgdG9rOjpjb2xvbmNvbG9uOgogICAgIGNhc2UgdG9rOjprd19tdXRhYmxlOgogICAgICAgbmV4dFRva2VuKCk7CiAgICAgICBicmVhazsKKyAgICBjYXNlIHRvazo6YXJyb3c6CisgICAgICBGb3JtYXRUb2stPlR5cGUgPSBUVF9UcmFpbGluZ1JldHVybkFycm93OworICAgICAgbmV4dFRva2VuKCk7CisgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuOworICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICB9CiAgIExTcXVhcmUuVHlwZSA9IFRUX0xhbWJkYUxTcXVhcmU7CiAgIHBhcnNlQ2hpbGRCbG9jaygpOworICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBVbndyYXBwZWRMaW5lUGFyc2VyOjp0cnlUb1BhcnNlTGFtYmRhSW50cm9kdWNlcigpIHsKQEAgLTg2MSw0MCArOTExLDYgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIFVud3JhcHBlZExpbmVQYXJzZXI6OnBhcnNlUmV0dXJuKCkgewotICBuZXh0VG9rZW4oKTsKLQotICBkbyB7Ci0gICAgc3dpdGNoIChGb3JtYXRUb2stPlRvay5nZXRLaW5kKCkpIHsKLSAgICBjYXNlIHRvazo6bF9icmFjZToKLSAgICAgIHBhcnNlQnJhY2VkTGlzdCgpOwotICAgICAgaWYgKEZvcm1hdFRvay0+VG9rLmlzTm90KHRvazo6c2VtaSkpIHsKLSAgICAgICAgLy8gQXNzdW1lIG1pc3NpbmcgJzsnLgotICAgICAgICBhZGRVbndyYXBwZWRMaW5lKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdG9rOjpsX3BhcmVuOgotICAgICAgcGFyc2VQYXJlbnMoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdG9rOjpyX2JyYWNlOgotICAgICAgLy8gQXNzdW1lIG1pc3NpbmcgJzsnLgotICAgICAgYWRkVW53cmFwcGVkTGluZSgpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgdG9rOjpzZW1pOgotICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICBhZGRVbndyYXBwZWRMaW5lKCk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSB0b2s6Omxfc3F1YXJlOgotICAgICAgdHJ5VG9QYXJzZUxhbWJkYSgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG5leHRUb2tlbigpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9IHdoaWxlICghZW9mKCkpOwotfQotCiB2b2lkIFVud3JhcHBlZExpbmVQYXJzZXI6OnBhcnNlUGFyZW5zKCkgewogICBhc3NlcnQoRm9ybWF0VG9rLT5Ub2suaXModG9rOjpsX3BhcmVuKSAmJiAiJygnIGV4cGVjdGVkLiIpOwogICBuZXh0VG9rZW4oKTsKQEAgLTkzMCw2ICs5NDYsNDIgQEAKICAgfSB3aGlsZSAoIWVvZigpKTsKIH0KIAordm9pZCBVbndyYXBwZWRMaW5lUGFyc2VyOjpwYXJzZVNxdWFyZSgpIHsKKyAgYXNzZXJ0KEZvcm1hdFRvay0+VG9rLmlzKHRvazo6bF9zcXVhcmUpICYmICInWycgZXhwZWN0ZWQuIik7CisgIGlmICh0cnlUb1BhcnNlTGFtYmRhKCkpCisgICAgcmV0dXJuOworICBkbyB7CisgICAgc3dpdGNoIChGb3JtYXRUb2stPlRvay5nZXRLaW5kKCkpIHsKKyAgICBjYXNlIHRvazo6bF9wYXJlbjoKKyAgICAgIHBhcnNlUGFyZW5zKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRvazo6cl9zcXVhcmU6CisgICAgICBuZXh0VG9rZW4oKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRvazo6cl9icmFjZToKKyAgICAgIC8vIEEgIn0iIGluc2lkZSBwYXJlbnRoZXNpcyBpcyBhbiBlcnJvciBpZiB0aGVyZSB3YXNuJ3QgYSBtYXRjaGluZyAieyIuCisgICAgICByZXR1cm47CisgICAgY2FzZSB0b2s6Omxfc3F1YXJlOgorICAgICAgcGFyc2VTcXVhcmUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdG9rOjpsX2JyYWNlOiB7CisgICAgICBpZiAoIXRyeVRvUGFyc2VCcmFjZWRMaXN0KCkpIHsKKyAgICAgICAgcGFyc2VDaGlsZEJsb2NrKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSB0b2s6OmF0OgorICAgICAgbmV4dFRva2VuKCk7CisgICAgICBpZiAoRm9ybWF0VG9rLT5Ub2suaXModG9rOjpsX2JyYWNlKSkKKyAgICAgICAgcGFyc2VCcmFjZWRMaXN0KCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbmV4dFRva2VuKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKCFlb2YoKSk7Cit9CisKIHZvaWQgVW53cmFwcGVkTGluZVBhcnNlcjo6cGFyc2VJZlRoZW5FbHNlKCkgewogICBhc3NlcnQoRm9ybWF0VG9rLT5Ub2suaXModG9rOjprd19pZikgJiYgIidpZicgZXhwZWN0ZWQiKTsKICAgbmV4dFRva2VuKCk7CkBAIC05MzcsMTMgKzk4OSwxNCBAQAogICAgIHBhcnNlUGFyZW5zKCk7CiAgIGJvb2wgTmVlZHNVbndyYXBwZWRMaW5lID0gZmFsc2U7CiAgIGlmIChGb3JtYXRUb2stPlRvay5pcyh0b2s6OmxfYnJhY2UpKSB7Ci0gICAgaWYgKFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19BbGxtYW4pCi0gICAgICBhZGRVbndyYXBwZWRMaW5lKCk7CisgICAgQ29tcG91bmRTdGF0ZW1lbnRJbmRlbnRlciBJbmRlbnRlcih0aGlzLCBTdHlsZSwgTGluZS0+TGV2ZWwpOwogICAgIHBhcnNlQmxvY2soLypNdXN0QmVEZWNsYXJhdGlvbj0qL2ZhbHNlKTsKLSAgICBpZiAoU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX0FsbG1hbikKKyAgICBpZiAoU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX0FsbG1hbiB8fAorICAgICAgICBTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyA9PSBGb3JtYXRTdHlsZTo6QlNfR05VKSB7CiAgICAgICBhZGRVbndyYXBwZWRMaW5lKCk7Ci0gICAgZWxzZQorICAgIH0gZWxzZSB7CiAgICAgICBOZWVkc1Vud3JhcHBlZExpbmUgPSB0cnVlOworICAgIH0KICAgfSBlbHNlIHsKICAgICBhZGRVbndyYXBwZWRMaW5lKCk7CiAgICAgKytMaW5lLT5MZXZlbDsKQEAgLTk1Myw4ICsxMDA2LDcgQEAKICAgaWYgKEZvcm1hdFRvay0+VG9rLmlzKHRvazo6a3dfZWxzZSkpIHsKICAgICBuZXh0VG9rZW4oKTsKICAgICBpZiAoRm9ybWF0VG9rLT5Ub2suaXModG9rOjpsX2JyYWNlKSkgewotICAgICAgaWYgKFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19BbGxtYW4pCi0gICAgICAgIGFkZFVud3JhcHBlZExpbmUoKTsKKyAgICAgIENvbXBvdW5kU3RhdGVtZW50SW5kZW50ZXIgSW5kZW50ZXIodGhpcywgU3R5bGUsIExpbmUtPkxldmVsKTsKICAgICAgIHBhcnNlQmxvY2soLypNdXN0QmVEZWNsYXJhdGlvbj0qL2ZhbHNlKTsKICAgICAgIGFkZFVud3JhcHBlZExpbmUoKTsKICAgICB9IGVsc2UgaWYgKEZvcm1hdFRvay0+VG9rLmlzKHRvazo6a3dfaWYpKSB7CkBAIC05NzcsNyArMTAyOSw4IEBACiAgICAgbmV4dFRva2VuKCk7CiAgIGlmIChGb3JtYXRUb2stPlRvay5pcyh0b2s6OmxfYnJhY2UpKSB7CiAgICAgaWYgKFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19MaW51eCB8fAotICAgICAgICBTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyA9PSBGb3JtYXRTdHlsZTo6QlNfQWxsbWFuKQorICAgICAgICBTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyA9PSBGb3JtYXRTdHlsZTo6QlNfQWxsbWFuIHx8CisgICAgICAgIFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19HTlUpCiAgICAgICBhZGRVbndyYXBwZWRMaW5lKCk7CiAKICAgICBib29sIEFkZExldmVsID0gU3R5bGUuTmFtZXNwYWNlSW5kZW50YXRpb24gPT0gRm9ybWF0U3R5bGU6Ok5JX0FsbCB8fApAQCAtOTk0LDE0ICsxMDQ3LDE0IEBACiB9CiAKIHZvaWQgVW53cmFwcGVkTGluZVBhcnNlcjo6cGFyc2VGb3JPcldoaWxlTG9vcCgpIHsKLSAgYXNzZXJ0KChGb3JtYXRUb2stPlRvay5pcyh0b2s6Omt3X2ZvcikgfHwgRm9ybWF0VG9rLT5Ub2suaXModG9rOjprd193aGlsZSkpICYmCi0gICAgICAgICAiJ2Zvcicgb3IgJ3doaWxlJyBleHBlY3RlZCIpOworICBhc3NlcnQoKEZvcm1hdFRvay0+VG9rLmlzKHRvazo6a3dfZm9yKSB8fCBGb3JtYXRUb2stPlRvay5pcyh0b2s6Omt3X3doaWxlKSB8fAorICAgICAgICAgIEZvcm1hdFRvay0+SXNGb3JFYWNoTWFjcm8pICYmCisgICAgICAgICAiJ2ZvcicsICd3aGlsZScgb3IgZm9yZWFjaCBtYWNybyBleHBlY3RlZCIpOwogICBuZXh0VG9rZW4oKTsKICAgaWYgKEZvcm1hdFRvay0+VG9rLmlzKHRvazo6bF9wYXJlbikpCiAgICAgcGFyc2VQYXJlbnMoKTsKICAgaWYgKEZvcm1hdFRvay0+VG9rLmlzKHRvazo6bF9icmFjZSkpIHsKLSAgICBpZiAoU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX0FsbG1hbikKLSAgICAgIGFkZFVud3JhcHBlZExpbmUoKTsKKyAgICBDb21wb3VuZFN0YXRlbWVudEluZGVudGVyIEluZGVudGVyKHRoaXMsIFN0eWxlLCBMaW5lLT5MZXZlbCk7CiAgICAgcGFyc2VCbG9jaygvKk11c3RCZURlY2xhcmF0aW9uPSovZmFsc2UpOwogICAgIGFkZFVud3JhcHBlZExpbmUoKTsKICAgfSBlbHNlIHsKQEAgLTEwMTYsOSArMTA2OSwxMCBAQAogICBhc3NlcnQoRm9ybWF0VG9rLT5Ub2suaXModG9rOjprd19kbykgJiYgIidkbycgZXhwZWN0ZWQiKTsKICAgbmV4dFRva2VuKCk7CiAgIGlmIChGb3JtYXRUb2stPlRvay5pcyh0b2s6OmxfYnJhY2UpKSB7Ci0gICAgaWYgKFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19BbGxtYW4pCi0gICAgICBhZGRVbndyYXBwZWRMaW5lKCk7CisgICAgQ29tcG91bmRTdGF0ZW1lbnRJbmRlbnRlciBJbmRlbnRlcih0aGlzLCBTdHlsZSwgTGluZS0+TGV2ZWwpOwogICAgIHBhcnNlQmxvY2soLypNdXN0QmVEZWNsYXJhdGlvbj0qL2ZhbHNlKTsKKyAgICBpZiAoU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX0dOVSkKKyAgICAgIGFkZFVud3JhcHBlZExpbmUoKTsKICAgfSBlbHNlIHsKICAgICBhZGRVbndyYXBwZWRMaW5lKCk7CiAgICAgKytMaW5lLT5MZXZlbDsKQEAgLTEwNDIsMTcgKzEwOTYsMjAgQEAKICAgaWYgKExpbmUtPkxldmVsID4gMSB8fCAoIUxpbmUtPkluUFBEaXJlY3RpdmUgJiYgTGluZS0+TGV2ZWwgPiAwKSkKICAgICAtLUxpbmUtPkxldmVsOwogICBpZiAoQ29tbWVudHNCZWZvcmVOZXh0VG9rZW4uZW1wdHkoKSAmJiBGb3JtYXRUb2stPlRvay5pcyh0b2s6OmxfYnJhY2UpKSB7Ci0gICAgaWYgKFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19BbGxtYW4pCi0gICAgICBhZGRVbndyYXBwZWRMaW5lKCk7CisgICAgQ29tcG91bmRTdGF0ZW1lbnRJbmRlbnRlciBJbmRlbnRlcih0aGlzLCBTdHlsZSwgTGluZS0+TGV2ZWwpOwogICAgIHBhcnNlQmxvY2soLypNdXN0QmVEZWNsYXJhdGlvbj0qL2ZhbHNlKTsKICAgICBpZiAoRm9ybWF0VG9rLT5Ub2suaXModG9rOjprd19icmVhaykpIHsKLSAgICAgIC8vICJicmVhazsiIGFmdGVyICJ9IiBvbiBpdHMgb3duIGxpbmUgb25seSBmb3IgQlNfQWxsbWFuCi0gICAgICBpZiAoU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX0FsbG1hbikKKyAgICAgIC8vICJicmVhazsiIGFmdGVyICJ9IiBvbiBpdHMgb3duIGxpbmUgb25seSBmb3IgQlNfQWxsbWFuIGFuZCBCU19HTlUKKyAgICAgIGlmIChTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyA9PSBGb3JtYXRTdHlsZTo6QlNfQWxsbWFuIHx8CisgICAgICAgICAgU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX0dOVSkgewogICAgICAgICBhZGRVbndyYXBwZWRMaW5lKCk7CisgICAgICB9CiAgICAgICBwYXJzZVN0cnVjdHVyYWxFbGVtZW50KCk7CiAgICAgfQorICAgIGFkZFVud3JhcHBlZExpbmUoKTsKKyAgfSBlbHNlIHsKKyAgICBhZGRVbndyYXBwZWRMaW5lKCk7CiAgIH0KLSAgYWRkVW53cmFwcGVkTGluZSgpOwogICBMaW5lLT5MZXZlbCA9IE9sZExpbmVMZXZlbDsKIH0KIApAQCAtMTA3MSw4ICsxMTI4LDcgQEAKICAgaWYgKEZvcm1hdFRvay0+VG9rLmlzKHRvazo6bF9wYXJlbikpCiAgICAgcGFyc2VQYXJlbnMoKTsKICAgaWYgKEZvcm1hdFRvay0+VG9rLmlzKHRvazo6bF9icmFjZSkpIHsKLSAgICBpZiAoU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX0FsbG1hbikKLSAgICAgIGFkZFVud3JhcHBlZExpbmUoKTsKKyAgICBDb21wb3VuZFN0YXRlbWVudEluZGVudGVyIEluZGVudGVyKHRoaXMsIFN0eWxlLCBMaW5lLT5MZXZlbCk7CiAgICAgcGFyc2VCbG9jaygvKk11c3RCZURlY2xhcmF0aW9uPSovZmFsc2UpOwogICAgIGFkZFVud3JhcHBlZExpbmUoKTsKICAgfSBlbHNlIHsKQEAgLTEwODUsNiArMTE0MSwxMCBAQAogCiB2b2lkIFVud3JhcHBlZExpbmVQYXJzZXI6OnBhcnNlQWNjZXNzU3BlY2lmaWVyKCkgewogICBuZXh0VG9rZW4oKTsKKyAgLy8gVW5kZXJzdGFuZCBRdCdzIHNsb3RzLgorICBpZiAoRm9ybWF0VG9rLT5pcyh0b2s6OmlkZW50aWZpZXIpICYmCisgICAgICAoRm9ybWF0VG9rLT5Ub2tlblRleHQgPT0gInNsb3RzIiB8fCBGb3JtYXRUb2stPlRva2VuVGV4dCA9PSAiUV9TTE9UUyIpKQorICAgIG5leHRUb2tlbigpOwogICAvLyBPdGhlcndpc2UsIHdlIGRvbid0IGtub3cgd2hhdCBpdCBpcywgYW5kIHdlJ2QgYmV0dGVyIGtlZXAgdGhlIG5leHQgdG9rZW4uCiAgIGlmIChGb3JtYXRUb2stPlRvay5pcyh0b2s6OmNvbG9uKSkKICAgICBuZXh0VG9rZW4oKTsKQEAgLTEwOTIsNyArMTE1MiwxMCBAQAogfQogCiB2b2lkIFVud3JhcHBlZExpbmVQYXJzZXI6OnBhcnNlRW51bSgpIHsKLSAgbmV4dFRva2VuKCk7CisgIGlmIChGb3JtYXRUb2stPlRvay5pcyh0b2s6Omt3X2VudW0pKSB7CisgICAgLy8gV29uJ3QgYmUgJ2VudW0nIGZvciBOU19FTlVNcy4KKyAgICBuZXh0VG9rZW4oKTsKKyAgfQogICAvLyBFYXQgdXAgZW51bSBjbGFzcyAuLi4KICAgaWYgKEZvcm1hdFRvay0+VG9rLmlzKHRvazo6a3dfY2xhc3MpIHx8CiAgICAgICBGb3JtYXRUb2stPlRvay5pcyh0b2s6Omt3X3N0cnVjdCkpCkBAIC0xMTU5LDEwICsxMjIyLDExIEBACiAgIH0KICAgaWYgKEZvcm1hdFRvay0+VG9rLmlzKHRvazo6bF9icmFjZSkpIHsKICAgICBpZiAoU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX0xpbnV4IHx8Ci0gICAgICAgIFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19BbGxtYW4pCisgICAgICAgIFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID09IEZvcm1hdFN0eWxlOjpCU19BbGxtYW4gfHwKKyAgICAgICAgU3R5bGUuQnJlYWtCZWZvcmVCcmFjZXMgPT0gRm9ybWF0U3R5bGU6OkJTX0dOVSkKICAgICAgIGFkZFVud3JhcHBlZExpbmUoKTsKIAotICAgIHBhcnNlQmxvY2soLypNdXN0QmVEZWNsYXJhdGlvbj0qL3RydWUsIC8qQWRkbGV2ZWw9Ki90cnVlLAorICAgIHBhcnNlQmxvY2soLypNdXN0QmVEZWNsYXJhdGlvbj0qL3RydWUsIC8qQWRkTGV2ZWw9Ki90cnVlLAogICAgICAgICAgICAgICAgLypNdW5jaFNlbWk9Ki9mYWxzZSk7CiAgIH0KICAgLy8gV2UgZmFsbCB0aHJvdWdoIHRvIHBhcnNpbmcgYSBzdHJ1Y3R1cmFsIGVsZW1lbnQgYWZ0ZXJ3YXJkcywgc28KQEAgLTExODksNiArMTI1MywxMCBAQAogICAgICAgcGFyc2VCbG9jaygvKk11c3RCZURlY2xhcmF0aW9uPSovZmFsc2UpOwogICAgICAgLy8gSW4gT2JqQyBpbnRlcmZhY2VzLCBub3RoaW5nIHNob3VsZCBiZSBmb2xsb3dpbmcgdGhlICJ9Ii4KICAgICAgIGFkZFVud3JhcHBlZExpbmUoKTsKKyAgICB9IGVsc2UgaWYgKEZvcm1hdFRvay0+aXModG9rOjpyX2JyYWNlKSkgeworICAgICAgLy8gSWdub3JlIHN0cmF5ICJ9Ii4gcGFyc2VTdHJ1Y3R1cmFsRWxlbWVudCBkb2Vzbid0IGNvbnN1bWUgdGhlbS4KKyAgICAgIG5leHRUb2tlbigpOworICAgICAgYWRkVW53cmFwcGVkTGluZSgpOwogICAgIH0gZWxzZSB7CiAgICAgICBwYXJzZVN0cnVjdHVyYWxFbGVtZW50KCk7CiAgICAgfQpAQCAtMTMxMiw2ICsxMzgwLDcgQEAKICAgYm9vbCBDb21tZW50c0luQ3VycmVudExpbmUgPSB0cnVlOwogICBkbyB7CiAgICAgRm9ybWF0VG9rID0gVG9rZW5zLT5nZXROZXh0VG9rZW4oKTsKKyAgICBhc3NlcnQoRm9ybWF0VG9rKTsKICAgICB3aGlsZSAoIUxpbmUtPkluUFBEaXJlY3RpdmUgJiYgRm9ybWF0VG9rLT5Ub2suaXModG9rOjpoYXNoKSAmJgogICAgICAgICAgICAoRm9ybWF0VG9rLT5IYXNVbmVzY2FwZWROZXdsaW5lIHx8IEZvcm1hdFRvay0+SXNGaXJzdCkpIHsKICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIHVuZmluaXNoZWQgdW53cmFwcGVkIGxpbmUsIHdlIGZsdXNoIHRoZSBwcmVwcm9jZXNzb3IKZGlmZiAtLWdpdCBhL2xpYi9Gb3JtYXQvVW53cmFwcGVkTGluZVBhcnNlci5oIGIvbGliL0Zvcm1hdC9VbndyYXBwZWRMaW5lUGFyc2VyLmgKaW5kZXggZjFmNGU1Ny4uNjJlMGI1OCAxMDA2NDQKLS0tIGEvbGliL0Zvcm1hdC9VbndyYXBwZWRMaW5lUGFyc2VyLmgKKysrIGIvbGliL0Zvcm1hdC9VbndyYXBwZWRMaW5lUGFyc2VyLmgKQEAgLTE2LDkgKzE2LDkgQEAKICNpZm5kZWYgTExWTV9DTEFOR19GT1JNQVRfVU5XUkFQUEVEX0xJTkVfUEFSU0VSX0gKICNkZWZpbmUgTExWTV9DTEFOR19GT1JNQVRfVU5XUkFQUEVEX0xJTkVfUEFSU0VSX0gKIAorI2luY2x1ZGUgIkZvcm1hdFRva2VuLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvSWRlbnRpZmllclRhYmxlLmgiCiAjaW5jbHVkZSAiY2xhbmcvRm9ybWF0L0Zvcm1hdC5oIgotI2luY2x1ZGUgIkZvcm1hdFRva2VuLmgiCiAjaW5jbHVkZSA8bGlzdD4KIAogbmFtZXNwYWNlIGNsYW5nIHsKQEAgLTgyLDggKzgyLDggQEAKICAgdm9pZCBwYXJzZVN0cnVjdHVyYWxFbGVtZW50KCk7CiAgIGJvb2wgdHJ5VG9QYXJzZUJyYWNlZExpc3QoKTsKICAgYm9vbCBwYXJzZUJyYWNlZExpc3QoYm9vbCBDb250aW51ZU9uU2VtaWNvbG9ucyA9IGZhbHNlKTsKLSAgdm9pZCBwYXJzZVJldHVybigpOwogICB2b2lkIHBhcnNlUGFyZW5zKCk7CisgIHZvaWQgcGFyc2VTcXVhcmUoKTsKICAgdm9pZCBwYXJzZUlmVGhlbkVsc2UoKTsKICAgdm9pZCBwYXJzZUZvck9yV2hpbGVMb29wKCk7CiAgIHZvaWQgcGFyc2VEb1doaWxlKCk7CkBAIC05OCw3ICs5OCw3IEBACiAgIHZvaWQgcGFyc2VPYmpDVW50aWxBdEVuZCgpOwogICB2b2lkIHBhcnNlT2JqQ0ludGVyZmFjZU9ySW1wbGVtZW50YXRpb24oKTsKICAgdm9pZCBwYXJzZU9iakNQcm90b2NvbCgpOwotICB2b2lkIHRyeVRvUGFyc2VMYW1iZGEoKTsKKyAgYm9vbCB0cnlUb1BhcnNlTGFtYmRhKCk7CiAgIGJvb2wgdHJ5VG9QYXJzZUxhbWJkYUludHJvZHVjZXIoKTsKICAgdm9pZCBhZGRVbndyYXBwZWRMaW5lKCk7CiAgIGJvb2wgZW9mKCkgY29uc3Q7CkBAIC0xMTIsNyArMTEyLDcgQEAKICAgLy8gRklYTUU6IFdlIGFyZSBjb25zdGFudGx5IHJ1bm5pbmcgaW50byBidWdzIHdoZXJlIExpbmUuTGV2ZWwgaXMgaW5jb3JyZWN0bHkKICAgLy8gc3VidHJhY3RlZCBmcm9tIGJleW9uZCAwLiBJbnRyb2R1Y2UgYSBtZXRob2QgdG8gc3VidHJhY3QgZnJvbSBMaW5lLkxldmVsCiAgIC8vIGFuZCB1c2UgdGhhdCBldmVyeXdoZXJlIGluIHRoZSBQYXJzZXIuCi0gIE93bmluZ1B0cjxVbndyYXBwZWRMaW5lPiBMaW5lOworICBzdGQ6OnVuaXF1ZV9wdHI8VW53cmFwcGVkTGluZT4gTGluZTsKIAogICAvLyBDb21tZW50cyBhcmUgc29ydGVkIGludG8gdW53cmFwcGVkIGxpbmVzIGJ5IHdoZXRoZXIgdGhleSBhcmUgaW4gdGhlIHNhbWUKICAgLy8gbGluZSBhcyB0aGUgcHJldmlvdXMgdG9rZW4sIG9yIG5vdC4gSWYgbm90LCB0aGV5IGJlbG9uZyB0byB0aGUgbmV4dCB0b2tlbi4KQEAgLTE4NSw2ICsxODUsNyBAQAogICBzdGQ6OnN0YWNrPGludD4gUFBDaGFpbkJyYW5jaEluZGV4OwogCiAgIGZyaWVuZCBjbGFzcyBTY29wZWRMaW5lU3RhdGU7CisgIGZyaWVuZCBjbGFzcyBDb21wb3VuZFN0YXRlbWVudEluZGVudGVyOwogfTsKIAogc3RydWN0IFVud3JhcHBlZExpbmVOb2RlIHsKZGlmZiAtLWdpdCBhL2xpYi9Gb3JtYXQvV2hpdGVzcGFjZU1hbmFnZXIuY3BwIGIvbGliL0Zvcm1hdC9XaGl0ZXNwYWNlTWFuYWdlci5jcHAKaW5kZXggMjZhOGQ0MS4uNGMzOTNlZCAxMDA2NDQKLS0tIGEvbGliL0Zvcm1hdC9XaGl0ZXNwYWNlTWFuYWdlci5jcHAKKysrIGIvbGliL0Zvcm1hdC9XaGl0ZXNwYWNlTWFuYWdlci5jcHAKQEAgLTE5Myw2ICsxOTMsMTAgQEAKICAgICBpZiAoQ2hhbmdlc1tpXS5Jc1RyYWlsaW5nQ29tbWVudCkgewogICAgICAgYXNzZXJ0KENvbHVtbiA+PSBDaGFuZ2VzW2ldLlN0YXJ0T2ZUb2tlbkNvbHVtbik7CiAgICAgICBDaGFuZ2VzW2ldLlNwYWNlcyArPSBDb2x1bW4gLSBDaGFuZ2VzW2ldLlN0YXJ0T2ZUb2tlbkNvbHVtbjsKKyAgICAgIGlmIChpICsgMSAhPSBFbmQpIHsKKyAgICAgICAgQ2hhbmdlc1tpICsgMV0uUHJldmlvdXNFbmRPZlRva2VuQ29sdW1uICs9CisgICAgICAgICAgICBDb2x1bW4gLSBDaGFuZ2VzW2ldLlN0YXJ0T2ZUb2tlbkNvbHVtbjsKKyAgICAgIH0KICAgICAgIENoYW5nZXNbaV0uU3RhcnRPZlRva2VuQ29sdW1uID0gQ29sdW1uOwogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvbGliL0Zvcm1hdC9XaGl0ZXNwYWNlTWFuYWdlci5oIGIvbGliL0Zvcm1hdC9XaGl0ZXNwYWNlTWFuYWdlci5oCmluZGV4IGFlNjIwMjMuLmY5NDQ2NGYgMTAwNjQ0Ci0tLSBhL2xpYi9Gb3JtYXQvV2hpdGVzcGFjZU1hbmFnZXIuaAorKysgYi9saWIvRm9ybWF0L1doaXRlc3BhY2VNYW5hZ2VyLmgKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdGFydE9mVG9rZW5Db2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJblBQRGlyZWN0aXZlID0gZmFsc2UpOwogCi0gIC8vLyBcYnJpZWYgQWRkcyBpbmZvcm1hdGlvbiBhYm91dCBhbiB1bmNoYW5nYWJsZSB0b2tlbidzIHdoaXRlc3BhY2UuCisgIC8vLyBcYnJpZWYgQWRkcyBpbmZvcm1hdGlvbiBhYm91dCBhbiB1bmNoYW5nZWFibGUgdG9rZW4ncyB3aGl0ZXNwYWNlLgogICAvLy8KICAgLy8vIE5lZWRzIHRvIGJlIGNhbGxlZCBmb3IgZXZlcnkgdG9rZW4gZm9yIHdoaWNoIFxjIHJlcGxhY2VXaGl0ZXNwYWNlCiAgIC8vLyB3YXMgbm90IGNhbGxlZC4KZGlmZiAtLWdpdCBhL2xpYi9Gcm9udGVuZC9BU1RDb25zdW1lcnMuY3BwIGIvbGliL0Zyb250ZW5kL0FTVENvbnN1bWVycy5jcHAKaW5kZXggMWVmNGMxOC4uZjkwYzBhOSAxMDA2NDQKLS0tIGEvbGliL0Zyb250ZW5kL0FTVENvbnN1bWVycy5jcHAKKysrIGIvbGliL0Zyb250ZW5kL0FTVENvbnN1bWVycy5jcHAKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgICAgOiBPdXQoT3V0ID8gKk91dCA6IGxsdm06Om91dHMoKSksIER1bXAoRHVtcCksCiAgICAgICAgICAgRmlsdGVyU3RyaW5nKEZpbHRlclN0cmluZyksIER1bXBMb29rdXBzKER1bXBMb29rdXBzKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDb250ZXh0KSB7CisgICAgdm9pZCBIYW5kbGVUcmFuc2xhdGlvblVuaXQoQVNUQ29udGV4dCAmQ29udGV4dCkgb3ZlcnJpZGUgewogICAgICAgVHJhbnNsYXRpb25Vbml0RGVjbCAqRCA9IENvbnRleHQuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpOwogCiAgICAgICBpZiAoRmlsdGVyU3RyaW5nLmVtcHR5KCkpCkBAIC0xMDEsMTMgKzEwMSwxMyBAQAogICAgIEFTVERlY2xOb2RlTGlzdGVyKHJhd19vc3RyZWFtICpPdXQgPSBOVUxMKQogICAgICAgICA6IE91dChPdXQgPyAqT3V0IDogbGx2bTo6b3V0cygpKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDb250ZXh0KSB7CisgICAgdm9pZCBIYW5kbGVUcmFuc2xhdGlvblVuaXQoQVNUQ29udGV4dCAmQ29udGV4dCkgb3ZlcnJpZGUgewogICAgICAgVHJhdmVyc2VEZWNsKENvbnRleHQuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpKTsKICAgICB9CiAKICAgICBib29sIHNob3VsZFdhbGtUeXBlc09mVHlwZUxvY3MoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCi0gICAgdmlydHVhbCBib29sIFZpc2l0TmFtZWREZWNsKE5hbWVkRGVjbCAqRCkgeworICAgIGJvb2wgVmlzaXROYW1lZERlY2woTmFtZWREZWNsICpEKSB7CiAgICAgICBELT5wcmludFF1YWxpZmllZE5hbWUoT3V0KTsKICAgICAgIE91dCA8PCAnXG4nOwogICAgICAgcmV0dXJuIHRydWU7CkBAIC0xMzgsMTEgKzEzOCwxMSBAQAogICBjbGFzcyBBU1RWaWV3ZXIgOiBwdWJsaWMgQVNUQ29uc3VtZXIgewogICAgIEFTVENvbnRleHQgKkNvbnRleHQ7CiAgIHB1YmxpYzoKLSAgICB2b2lkIEluaXRpYWxpemUoQVNUQ29udGV4dCAmQ29udGV4dCkgeworICAgIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDb250ZXh0KSBvdmVycmlkZSB7CiAgICAgICB0aGlzLT5Db250ZXh0ID0gJkNvbnRleHQ7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIEhhbmRsZVRvcExldmVsRGVjbChEZWNsR3JvdXBSZWYgRCkgeworICAgIGJvb2wgSGFuZGxlVG9wTGV2ZWxEZWNsKERlY2xHcm91cFJlZiBEKSBvdmVycmlkZSB7CiAgICAgICBmb3IgKERlY2xHcm91cFJlZjo6aXRlcmF0b3IgSSA9IEQuYmVnaW4oKSwgRSA9IEQuZW5kKCk7IEkgIT0gRTsgKytJKQogICAgICAgICBIYW5kbGVUb3BMZXZlbFNpbmdsZURlY2woKkkpOwogICAgICAgcmV0dXJuIHRydWU7CkBAIC0xNzcsNyArMTc3LDcgQEAKIHB1YmxpYzoKICAgRGVjbENvbnRleHRQcmludGVyKCkgOiBPdXQobGx2bTo6ZXJycygpKSB7fQogCi0gIHZvaWQgSGFuZGxlVHJhbnNsYXRpb25Vbml0KEFTVENvbnRleHQgJkMpIHsKKyAgdm9pZCBIYW5kbGVUcmFuc2xhdGlvblVuaXQoQVNUQ29udGV4dCAmQykgb3ZlcnJpZGUgewogICAgIFByaW50RGVjbENvbnRleHQoQy5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCksIDQpOwogICB9CiAKQEAgLTI1OSwxMyArMjU5LDEyIEBACiAgICAgLy8gUHJpbnQgdGhlIHBhcmFtZXRlcnMuCiAgICAgT3V0IDw8ICIoIjsKICAgICBib29sIFByaW50Q29tbWEgPSBmYWxzZTsKLSAgICBmb3IgKEZ1bmN0aW9uRGVjbDo6cGFyYW1fY29uc3RfaXRlcmF0b3IgSSA9IEZELT5wYXJhbV9iZWdpbigpLAotICAgICAgICAgICBFID0gRkQtPnBhcmFtX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGZvciAoYXV0byBJIDogRkQtPnBhcmFtcygpKSB7CiAgICAgICBpZiAoUHJpbnRDb21tYSkKICAgICAgICAgT3V0IDw8ICIsICI7CiAgICAgICBlbHNlCiAgICAgICAgIFByaW50Q29tbWEgPSB0cnVlOwotICAgICAgT3V0IDw8ICoqSTsKKyAgICAgIE91dCA8PCAqSTsKICAgICB9CiAgICAgT3V0IDw8ICIpIjsKICAgICBicmVhazsKQEAgLTM2OSw4ICszNjgsNyBAQAogICBPdXQgPDwgIlxuIjsKIAogICAvLyBQcmludCBkZWNscyBpbiB0aGUgRGVjbENvbnRleHQuCi0gIGZvciAoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgSSA9IERDLT5kZWNsc19iZWdpbigpLCBFID0gREMtPmRlY2xzX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7CisgIGZvciAoYXV0byAqSSA6IERDLT5kZWNscygpKSB7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEluZGVudGF0aW9uOyArK2kpCiAgICAgICBPdXQgPDwgIiAgIjsKIApAQCAtMzk0LDU4ICszOTIsNTggQEAKICAgICBjYXNlIERlY2w6OkNYWERlc3RydWN0b3I6CiAgICAgY2FzZSBEZWNsOjpDWFhDb252ZXJzaW9uOgogICAgIHsKLSAgICAgIERlY2xDb250ZXh0KiBEQyA9IGNhc3Q8RGVjbENvbnRleHQ+KCpJKTsKKyAgICAgIERlY2xDb250ZXh0KiBEQyA9IGNhc3Q8RGVjbENvbnRleHQ+KEkpOwogICAgICAgUHJpbnREZWNsQ29udGV4dChEQywgSW5kZW50YXRpb24rMik7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBEZWNsOjpJbmRpcmVjdEZpZWxkOiB7Ci0gICAgICBJbmRpcmVjdEZpZWxkRGVjbCogSUZEID0gY2FzdDxJbmRpcmVjdEZpZWxkRGVjbD4oKkkpOworICAgICAgSW5kaXJlY3RGaWVsZERlY2wqIElGRCA9IGNhc3Q8SW5kaXJlY3RGaWVsZERlY2w+KEkpOwogICAgICAgT3V0IDw8ICI8SW5kaXJlY3RGaWVsZD4gIiA8PCAqSUZEIDw8ICdcbic7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBEZWNsOjpMYWJlbDogewotICAgICAgTGFiZWxEZWNsICpMRCA9IGNhc3Q8TGFiZWxEZWNsPigqSSk7CisgICAgICBMYWJlbERlY2wgKkxEID0gY2FzdDxMYWJlbERlY2w+KEkpOwogICAgICAgT3V0IDw8ICI8TGFiZWw+ICIgPDwgKkxEIDw8ICdcbic7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBEZWNsOjpGaWVsZDogewotICAgICAgRmllbGREZWNsICpGRCA9IGNhc3Q8RmllbGREZWNsPigqSSk7CisgICAgICBGaWVsZERlY2wgKkZEID0gY2FzdDxGaWVsZERlY2w+KEkpOwogICAgICAgT3V0IDw8ICI8ZmllbGQ+ICIgPDwgKkZEIDw8ICdcbic7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBEZWNsOjpUeXBlZGVmOgogICAgIGNhc2UgRGVjbDo6VHlwZUFsaWFzOiB7Ci0gICAgICBUeXBlZGVmTmFtZURlY2wqIFREID0gY2FzdDxUeXBlZGVmTmFtZURlY2w+KCpJKTsKKyAgICAgIFR5cGVkZWZOYW1lRGVjbCogVEQgPSBjYXN0PFR5cGVkZWZOYW1lRGVjbD4oSSk7CiAgICAgICBPdXQgPDwgIjx0eXBlZGVmPiAiIDw8ICpURCA8PCAnXG4nOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgRGVjbDo6RW51bUNvbnN0YW50OiB7Ci0gICAgICBFbnVtQ29uc3RhbnREZWNsKiBFQ0QgPSBjYXN0PEVudW1Db25zdGFudERlY2w+KCpJKTsKKyAgICAgIEVudW1Db25zdGFudERlY2wqIEVDRCA9IGNhc3Q8RW51bUNvbnN0YW50RGVjbD4oSSk7CiAgICAgICBPdXQgPDwgIjxlbnVtIGNvbnN0YW50PiAiIDw8ICpFQ0QgPDwgJ1xuJzsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIERlY2w6OlZhcjogewotICAgICAgVmFyRGVjbCogVkQgPSBjYXN0PFZhckRlY2w+KCpJKTsKKyAgICAgIFZhckRlY2wqIFZEID0gY2FzdDxWYXJEZWNsPihJKTsKICAgICAgIE91dCA8PCAiPHZhcj4gIiA8PCAqVkQgPDwgJ1xuJzsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIERlY2w6OkltcGxpY2l0UGFyYW06IHsKLSAgICAgIEltcGxpY2l0UGFyYW1EZWNsKiBJUEQgPSBjYXN0PEltcGxpY2l0UGFyYW1EZWNsPigqSSk7CisgICAgICBJbXBsaWNpdFBhcmFtRGVjbCogSVBEID0gY2FzdDxJbXBsaWNpdFBhcmFtRGVjbD4oSSk7CiAgICAgICBPdXQgPDwgIjxpbXBsaWNpdCBwYXJhbWV0ZXI+ICIgPDwgKklQRCA8PCAnXG4nOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgRGVjbDo6UGFybVZhcjogewotICAgICAgUGFybVZhckRlY2wqIFBWRCA9IGNhc3Q8UGFybVZhckRlY2w+KCpJKTsKKyAgICAgIFBhcm1WYXJEZWNsKiBQVkQgPSBjYXN0PFBhcm1WYXJEZWNsPihJKTsKICAgICAgIE91dCA8PCAiPHBhcmFtZXRlcj4gIiA8PCAqUFZEIDw8ICdcbic7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBEZWNsOjpPYmpDUHJvcGVydHk6IHsKLSAgICAgIE9iakNQcm9wZXJ0eURlY2wqIE9QRCA9IGNhc3Q8T2JqQ1Byb3BlcnR5RGVjbD4oKkkpOworICAgICAgT2JqQ1Byb3BlcnR5RGVjbCogT1BEID0gY2FzdDxPYmpDUHJvcGVydHlEZWNsPihJKTsKICAgICAgIE91dCA8PCAiPG9iamMgcHJvcGVydHk+ICIgPDwgKk9QRCA8PCAnXG4nOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgRGVjbDo6RnVuY3Rpb25UZW1wbGF0ZTogewotICAgICAgRnVuY3Rpb25UZW1wbGF0ZURlY2wqIEZURCA9IGNhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KCpJKTsKKyAgICAgIEZ1bmN0aW9uVGVtcGxhdGVEZWNsKiBGVEQgPSBjYXN0PEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihJKTsKICAgICAgIE91dCA8PCAiPGZ1bmN0aW9uIHRlbXBsYXRlPiAiIDw8ICpGVEQgPDwgJ1xuJzsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTQ1OCwyMSArNDU2LDIxIEBACiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBEZWNsOjpOYW1lc3BhY2VBbGlhczogewotICAgICAgTmFtZXNwYWNlQWxpYXNEZWNsKiBOQUQgPSBjYXN0PE5hbWVzcGFjZUFsaWFzRGVjbD4oKkkpOworICAgICAgTmFtZXNwYWNlQWxpYXNEZWNsKiBOQUQgPSBjYXN0PE5hbWVzcGFjZUFsaWFzRGVjbD4oSSk7CiAgICAgICBPdXQgPDwgIjxuYW1lc3BhY2UgYWxpYXM+ICIgPDwgKk5BRCA8PCAnXG4nOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgRGVjbDo6Q2xhc3NUZW1wbGF0ZTogewotICAgICAgQ2xhc3NUZW1wbGF0ZURlY2wgKkNURCA9IGNhc3Q8Q2xhc3NUZW1wbGF0ZURlY2w+KCpJKTsKKyAgICAgIENsYXNzVGVtcGxhdGVEZWNsICpDVEQgPSBjYXN0PENsYXNzVGVtcGxhdGVEZWNsPihJKTsKICAgICAgIE91dCA8PCAiPGNsYXNzIHRlbXBsYXRlPiAiIDw8ICpDVEQgPDwgJ1xuJzsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIERlY2w6Ok9NUFRocmVhZFByaXZhdGU6IHsKLSAgICAgIE91dCA8PCAiPG9tcCB0aHJlYWRwcml2YXRlPiAiIDw8ICciJyA8PCAqSSA8PCAiXCJcbiI7CisgICAgICBPdXQgPDwgIjxvbXAgdGhyZWFkcHJpdmF0ZT4gIiA8PCAnIicgPDwgSSA8PCAiXCJcbiI7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgZGVmYXVsdDoKLSAgICAgIE91dCA8PCAiRGVjbEtpbmQ6ICIgPDwgREsgPDwgJyInIDw8ICpJIDw8ICJcIlxuIjsKKyAgICAgIE91dCA8PCAiRGVjbEtpbmQ6ICIgPDwgREsgPDwgJyInIDw8IEkgPDwgIlwiXG4iOwogICAgICAgbGx2bV91bnJlYWNoYWJsZSgiZGVjbCB1bmhhbmRsZWQiKTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9Gcm9udGVuZC9BU1RNZXJnZS5jcHAgYi9saWIvRnJvbnRlbmQvQVNUTWVyZ2UuY3BwCmluZGV4IGI2YzY0NGUuLmZmNjQzNGMgMTAwNjQ0Ci0tLSBhL2xpYi9Gcm9udGVuZC9BU1RNZXJnZS5jcHAKKysrIGIvbGliL0Zyb250ZW5kL0FTVE1lcmdlLmNwcApAQCAtNTcsMTYgKzU3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgLypNaW5pbWFsSW1wb3J0PSovZmFsc2UpOwogCiAgICAgVHJhbnNsYXRpb25Vbml0RGVjbCAqVFUgPSBVbml0LT5nZXRBU1RDb250ZXh0KCkuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpOwotICAgIGZvciAoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgRCA9IFRVLT5kZWNsc19iZWdpbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFbmQgPSBUVS0+ZGVjbHNfZW5kKCk7Ci0gICAgICAgICBEICE9IERFbmQ7ICsrRCkgeworICAgIGZvciAoYXV0byAqRCA6IFRVLT5kZWNscygpKSB7CiAgICAgICAvLyBEb24ndCByZS1pbXBvcnQgX192YV9saXN0X3RhZywgX19idWlsdGluX3ZhX2xpc3QuCi0gICAgICBpZiAoTmFtZWREZWNsICpORCA9IGR5bl9jYXN0PE5hbWVkRGVjbD4oKkQpKQorICAgICAgaWYgKGNvbnN0IGF1dG8gKk5EID0gZHluX2Nhc3Q8TmFtZWREZWNsPihEKSkKICAgICAgICAgaWYgKElkZW50aWZpZXJJbmZvICpJSSA9IE5ELT5nZXRJZGVudGlmaWVyKCkpCiAgICAgICAgICAgaWYgKElJLT5pc1N0cigiX192YV9saXN0X3RhZyIpIHx8IElJLT5pc1N0cigiX19idWlsdGluX3ZhX2xpc3QiKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgCi0gICAgICBJbXBvcnRlci5JbXBvcnQoKkQpOworICAgICAgSW1wb3J0ZXIuSW1wb3J0KEQpOwogICAgIH0KIAogICAgIGRlbGV0ZSBVbml0OwpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0FTVFVuaXQuY3BwIGIvbGliL0Zyb250ZW5kL0FTVFVuaXQuY3BwCmluZGV4IGE4YzU4NzYuLmM0Zjc1OTYgMTAwNjQ0Ci0tLSBhL2xpYi9Gcm9udGVuZC9BU1RVbml0LmNwcAorKysgYi9saWIvRnJvbnRlbmQvQVNUVW5pdC5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9WaXJ0dWFsRmlsZVN5c3RlbS5oIgogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0NvbXBpbGVySW5zdGFuY2UuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZERpYWdub3N0aWMuaCIKQEAgLTM1LDkgKzM2LDcgQEAKICNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BdG9taWMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ3Jhc2hSZWNvdmVyeUNvbnRleHQuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Ib3N0LmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NdXRleC5oIgpAQCAtNDUsNiArNDQsNyBAQAogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RpbWVyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPGNzdGRpbz4KICNpbmNsdWRlIDxjc3RkbGliPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CkBAIC0xOTEsMTAgKzE5MSw3IEBACiB9OwogCiB2b2lkIEFTVFVuaXQ6OmNsZWFyRmlsZUxldmVsRGVjbHMoKSB7Ci0gIGZvciAoRmlsZURlY2xzVHk6Oml0ZXJhdG9yCi0gICAgICAgICBJID0gRmlsZURlY2xzLmJlZ2luKCksIEUgPSBGaWxlRGVjbHMuZW5kKCk7IEkgIT0gRTsgKytJKQotICAgIGRlbGV0ZSBJLT5zZWNvbmQ7Ci0gIEZpbGVEZWNscy5jbGVhcigpOworICBsbHZtOjpEZWxldGVDb250YWluZXJTZWNvbmRzKEZpbGVEZWNscyk7CiB9CiAKIHZvaWQgQVNUVW5pdDo6Q2xlYW5UZW1wb3JhcnlGaWxlcygpIHsKQEAgLTIxNCw3ICsyMTEsNyBAQAogLy8vIFxicmllZiBUcmFja3MgdGhlIG51bWJlciBvZiBBU1RVbml0IG9iamVjdHMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZS4KIC8vLwogLy8vIFVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5Lgotc3RhdGljIGxsdm06OnN5czo6Y2FzX2ZsYWcgQWN0aXZlQVNUVW5pdE9iamVjdHM7CitzdGF0aWMgc3RkOjphdG9taWM8dW5zaWduZWQ+IEFjdGl2ZUFTVFVuaXRPYmplY3RzOwogCiBBU1RVbml0OjpBU1RVbml0KGJvb2wgX01haW5GaWxlSXNBU1QpCiAgIDogUmVhZGVyKDApLCBIYWRNb2R1bGVMb2FkZXJGYXRhbEZhaWx1cmUoZmFsc2UpLApAQCAtMjMxLDEwICsyMjgsOCBAQAogICAgIFByZWFtYmxlVG9wTGV2ZWxIYXNoVmFsdWUoMCksCiAgICAgQ3VycmVudFRvcExldmVsSGFzaFZhbHVlKDApLAogICAgIFVuc2FmZVRvRnJlZShmYWxzZSkgeyAKLSAgaWYgKGdldGVudigiTElCQ0xBTkdfT0JKVFJBQ0tJTkciKSkgewotICAgIGxsdm06OnN5czo6QXRvbWljSW5jcmVtZW50KCZBY3RpdmVBU1RVbml0T2JqZWN0cyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICIrKysgJWQgdHJhbnNsYXRpb24gdW5pdHNcbiIsIEFjdGl2ZUFTVFVuaXRPYmplY3RzKTsKLSAgfSAgICAKKyAgaWYgKGdldGVudigiTElCQ0xBTkdfT0JKVFJBQ0tJTkciKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIisrKyAldSB0cmFuc2xhdGlvbiB1bml0c1xuIiwgKytBY3RpdmVBU1RVbml0T2JqZWN0cyk7CiB9CiAKIEFTVFVuaXQ6On5BU1RVbml0KCkgewpAQCAtMjY3LDEwICsyNjIsOCBAQAogCiAgIENsZWFyQ2FjaGVkQ29tcGxldGlvblJlc3VsdHMoKTsgIAogICAKLSAgaWYgKGdldGVudigiTElCQ0xBTkdfT0JKVFJBQ0tJTkciKSkgewotICAgIGxsdm06OnN5czo6QXRvbWljRGVjcmVtZW50KCZBY3RpdmVBU1RVbml0T2JqZWN0cyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICItLS0gJWQgdHJhbnNsYXRpb24gdW5pdHNcbiIsIEFjdGl2ZUFTVFVuaXRPYmplY3RzKTsKLSAgfSAgICAKKyAgaWYgKGdldGVudigiTElCQ0xBTkdfT0JKVFJBQ0tJTkciKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIi0tLSAldSB0cmFuc2xhdGlvbiB1bml0c1xuIiwgLS1BY3RpdmVBU1RVbml0T2JqZWN0cyk7CiB9CiAKIHZvaWQgQVNUVW5pdDo6c2V0UHJlcHJvY2Vzc29yKFByZXByb2Nlc3NvciAqcHApIHsgUFAgPSBwcDsgfQpAQCAtNTI2LDggKzUxOSw4IEBACiAgICAgICBDb3VudGVyKENvdW50ZXIpLAogICAgICAgSW5pdGlhbGl6ZWRMYW5ndWFnZShmYWxzZSkge30KIAotICB2aXJ0dWFsIGJvb2wgUmVhZExhbmd1YWdlT3B0aW9ucyhjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIHsKKyAgYm9vbCBSZWFkTGFuZ3VhZ2VPcHRpb25zKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIG92ZXJyaWRlIHsKICAgICBpZiAoSW5pdGlhbGl6ZWRMYW5ndWFnZSkKICAgICAgIHJldHVybiBmYWxzZTsKICAgICAKQEAgLTUzOCw4ICs1MzEsOCBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIHZpcnR1YWwgYm9vbCBSZWFkVGFyZ2V0T3B0aW9ucyhjb25zdCBUYXJnZXRPcHRpb25zICZUYXJnZXRPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbikgeworICBib29sIFJlYWRUYXJnZXRPcHRpb25zKGNvbnN0IFRhcmdldE9wdGlvbnMgJlRhcmdldE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbikgb3ZlcnJpZGUgewogICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhlIHRhcmdldCwgZG9uJ3QgZG8gaXQgYWdhaW4uCiAgICAgaWYgKFRhcmdldCkKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTU1Miw3ICs1NDUsOCBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBSZWFkQ291bnRlcihjb25zdCBzZXJpYWxpemF0aW9uOjpNb2R1bGVGaWxlICZNLCB1bnNpZ25lZCBWYWx1ZSkgeworICB2b2lkIFJlYWRDb3VudGVyKGNvbnN0IHNlcmlhbGl6YXRpb246Ok1vZHVsZUZpbGUgJk0sCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWUpIG92ZXJyaWRlIHsKICAgICBDb3VudGVyID0gVmFsdWU7CiAgIH0KIApAQCAtNTkwLDE0ICs1ODQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFN0b3JlZERpYWdub3N0aWM+ICZTdG9yZWREaWFncykKICAgICA6IFN0b3JlZERpYWdzKFN0b3JlZERpYWdzKSwgU291cmNlTWdyKDApIHsgfQogCi0gIHZpcnR1YWwgdm9pZCBCZWdpblNvdXJjZUZpbGUoY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXByb2Nlc3NvciAqUFAgPSAwKSB7CisgIHZvaWQgQmVnaW5Tb3VyY2VGaWxlKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJlcHJvY2Vzc29yICpQUCA9IDApIG92ZXJyaWRlIHsKICAgICBpZiAoUFApCiAgICAgICBTb3VyY2VNZ3IgPSAmUFAtPmdldFNvdXJjZU1hbmFnZXIoKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpYyAmSW5mbyk7CisgIHZvaWQgSGFuZGxlRGlhZ25vc3RpYyhEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljICZJbmZvKSBvdmVycmlkZTsKIH07CiAKIC8vLyBcYnJpZWYgUkFJSSBvYmplY3QgdGhhdCBvcHRpb25hbGx5IGNhcHR1cmVzIGRpYWdub3N0aWNzLCBpZgpAQCAtNjgwLDEyICs2NzQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZVN5c3RlbU9wdGlvbnMgJkZpbGVTeXN0ZW1PcHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seUxvY2FsRGVjbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtYXBwZWRGaWxlICpSZW1hcHBlZEZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVJlbWFwcGVkRmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UmVtYXBwZWRGaWxlPiBSZW1hcHBlZEZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2FwdHVyZURpYWdub3N0aWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dQQ0hXaXRoQ29tcGlsZXJFcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VyRmlsZXNBcmVWb2xhdGlsZSkgewotICBPd25pbmdQdHI8QVNUVW5pdD4gQVNUKG5ldyBBU1RVbml0KHRydWUpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVFVuaXQ+IEFTVChuZXcgQVNUVW5pdCh0cnVlKSk7CiAKICAgLy8gUmVjb3ZlciByZXNvdXJjZXMgaWYgd2UgY3Jhc2ggYmVmb3JlIGV4aXRpbmcgdGhpcyBtZXRob2QuCiAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhcjxBU1RVbml0PgpAQCAtNzExLDYyICs3MDQsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNULT5nZXREaWFnbm9zdGljcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1QtPkFTVEZpbGVMYW5nT3B0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUYXJnZXQ9Ki8wKSk7Ci0gIAotICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bVJlbWFwcGVkRmlsZXM7ICsrSSkgewotICAgIEZpbGVuYW1lT3JNZW1CdWYgZmlsZU9yQnVmID0gUmVtYXBwZWRGaWxlc1tJXS5zZWNvbmQ7Ci0gICAgaWYgKGNvbnN0IGxsdm06Ok1lbW9yeUJ1ZmZlciAqCi0gICAgICAgICAgbWVtQnVmID0gZmlsZU9yQnVmLmR5bl9jYXN0PGNvbnN0IGxsdm06Ok1lbW9yeUJ1ZmZlciAqPigpKSB7Ci0gICAgICAvLyBDcmVhdGUgdGhlIGZpbGUgZW50cnkgZm9yIHRoZSBmaWxlIHRoYXQgd2UncmUgbWFwcGluZyBmcm9tLgotICAgICAgY29uc3QgRmlsZUVudHJ5ICpGcm9tRmlsZQotICAgICAgICA9IEFTVC0+Z2V0RmlsZU1hbmFnZXIoKS5nZXRWaXJ0dWFsRmlsZShSZW1hcHBlZEZpbGVzW0ldLmZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1CdWYtPmdldEJ1ZmZlclNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICBpZiAoIUZyb21GaWxlKSB7Ci0gICAgICAgIEFTVC0+Z2V0RGlhZ25vc3RpY3MoKS5SZXBvcnQoZGlhZzo6ZXJyX2ZlX3JlbWFwX21pc3NpbmdfZnJvbV9maWxlKQotICAgICAgICAgIDw8IFJlbWFwcGVkRmlsZXNbSV0uZmlyc3Q7Ci0gICAgICAgIGRlbGV0ZSBtZW1CdWY7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBPdmVycmlkZSB0aGUgY29udGVudHMgb2YgdGhlICJmcm9tIiBmaWxlIHdpdGggdGhlIGNvbnRlbnRzIG9mCi0gICAgICAvLyB0aGUgInRvIiBmaWxlLgotICAgICAgQVNULT5nZXRTb3VyY2VNYW5hZ2VyKCkub3ZlcnJpZGVGaWxlQ29udGVudHMoRnJvbUZpbGUsIG1lbUJ1Zik7CiAKLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgY2hhciAqZm5hbWUgPSBmaWxlT3JCdWYuZ2V0PGNvbnN0IGNoYXIgKj4oKTsKLSAgICAgIGNvbnN0IEZpbGVFbnRyeSAqVG9GaWxlID0gQVNULT5GaWxlTWdyLT5nZXRGaWxlKGZuYW1lKTsKLSAgICAgIGlmICghVG9GaWxlKSB7Ci0gICAgICAgIEFTVC0+Z2V0RGlhZ25vc3RpY3MoKS5SZXBvcnQoZGlhZzo6ZXJyX2ZlX3JlbWFwX21pc3NpbmdfdG9fZmlsZSkKLSAgICAgICAgPDwgUmVtYXBwZWRGaWxlc1tJXS5maXJzdCA8PCBmbmFtZTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9CisgIFByZXByb2Nlc3Nvck9wdGlvbnMgKlBQT3B0cyA9IG5ldyBQcmVwcm9jZXNzb3JPcHRpb25zKCk7CiAKLSAgICAgIC8vIENyZWF0ZSB0aGUgZmlsZSBlbnRyeSBmb3IgdGhlIGZpbGUgdGhhdCB3ZSdyZSBtYXBwaW5nIGZyb20uCi0gICAgICBjb25zdCBGaWxlRW50cnkgKkZyb21GaWxlCi0gICAgICAgID0gQVNULT5nZXRGaWxlTWFuYWdlcigpLmdldFZpcnR1YWxGaWxlKFJlbWFwcGVkRmlsZXNbSV0uZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvRmlsZS0+Z2V0U2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgIGlmICghRnJvbUZpbGUpIHsKLSAgICAgICAgQVNULT5nZXREaWFnbm9zdGljcygpLlJlcG9ydChkaWFnOjplcnJfZmVfcmVtYXBfbWlzc2luZ19mcm9tX2ZpbGUpCi0gICAgICAgICAgPDwgUmVtYXBwZWRGaWxlc1tJXS5maXJzdDsKLSAgICAgICAgZGVsZXRlIG1lbUJ1ZjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIE92ZXJyaWRlIHRoZSBjb250ZW50cyBvZiB0aGUgImZyb20iIGZpbGUgd2l0aCB0aGUgY29udGVudHMgb2YKLSAgICAgIC8vIHRoZSAidG8iIGZpbGUuCi0gICAgICBBU1QtPmdldFNvdXJjZU1hbmFnZXIoKS5vdmVycmlkZUZpbGVDb250ZW50cyhGcm9tRmlsZSwgVG9GaWxlKTsKLSAgICB9Ci0gIH0KLSAgCisgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBSZW1hcHBlZEZpbGVzLnNpemUoKTsgSSAhPSBOOyArK0kpCisgICAgUFBPcHRzLT5hZGRSZW1hcHBlZEZpbGUoUmVtYXBwZWRGaWxlc1tJXS5maXJzdCwgUmVtYXBwZWRGaWxlc1tJXS5zZWNvbmQpOworCiAgIC8vIEdhdGhlciBJbmZvIGZvciBwcmVwcm9jZXNzb3IgY29uc3RydWN0aW9uIGxhdGVyIG9uLgogCiAgIEhlYWRlclNlYXJjaCAmSGVhZGVySW5mbyA9ICpBU1QtPkhlYWRlckluZm8uZ2V0KCk7CiAgIHVuc2lnbmVkIENvdW50ZXI7CiAKLSAgT3duaW5nUHRyPEFTVFJlYWRlcj4gUmVhZGVyOwotCi0gIEFTVC0+UFAgPSBuZXcgUHJlcHJvY2Vzc29yKG5ldyBQcmVwcm9jZXNzb3JPcHRpb25zKCksCisgIEFTVC0+UFAgPSBuZXcgUHJlcHJvY2Vzc29yKFBQT3B0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNULT5nZXREaWFnbm9zdGljcygpLCBBU1QtPkFTVEZpbGVMYW5nT3B0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUYXJnZXQ9Ki8wLCBBU1QtPmdldFNvdXJjZU1hbmFnZXIoKSwgSGVhZGVySW5mbywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpBU1QsIApAQCAtNzg4LDIxICs3MzcsMTcgQEAKICAgYm9vbCBkaXNhYmxlVmFsaWQgPSBmYWxzZTsKICAgaWYgKDo6Z2V0ZW52KCJMSUJDTEFOR19ESVNBQkxFX1BDSF9WQUxJREFUSU9OIikpCiAgICAgZGlzYWJsZVZhbGlkID0gdHJ1ZTsKLSAgUmVhZGVyLnJlc2V0KG5ldyBBU1RSZWFkZXIoUFAsIENvbnRleHQsCisgIEFTVC0+UmVhZGVyID0gbmV3IEFTVFJlYWRlcihQUCwgQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc3lzcm9vdD0qLyIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkRpc2FibGVWYWxpZGF0aW9uPSovZGlzYWJsZVZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvd1BDSFdpdGhDb21waWxlckVycm9ycykpOwotICAKLSAgLy8gUmVjb3ZlciByZXNvdXJjZXMgaWYgd2UgY3Jhc2ggYmVmb3JlIGV4aXRpbmcgdGhpcyBtZXRob2QuCi0gIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhcjxBU1RSZWFkZXI+Ci0gICAgUmVhZGVyQ2xlYW51cChSZWFkZXIuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvd1BDSFdpdGhDb21waWxlckVycm9ycyk7CiAKLSAgUmVhZGVyLT5zZXRMaXN0ZW5lcihuZXcgQVNUSW5mb0NvbGxlY3RvcigqQVNULT5QUCwgQ29udGV4dCwKKyAgQVNULT5SZWFkZXItPnNldExpc3RlbmVyKG5ldyBBU1RJbmZvQ29sbGVjdG9yKCpBU1QtPlBQLCBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVC0+QVNURmlsZUxhbmdPcHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVC0+VGFyZ2V0T3B0cywgQVNULT5UYXJnZXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXIpKTsKIAotICBzd2l0Y2ggKFJlYWRlci0+UmVhZEFTVChGaWxlbmFtZSwgc2VyaWFsaXphdGlvbjo6TUtfTWFpbkZpbGUsCisgIHN3aXRjaCAoQVNULT5SZWFkZXItPlJlYWRBU1QoRmlsZW5hbWUsIHNlcmlhbGl6YXRpb246Ok1LX01haW5GaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBBU1RSZWFkZXI6OkFSUl9Ob25lKSkgewogICBjYXNlIEFTVFJlYWRlcjo6U3VjY2VzczoKICAgICBicmVhazsKQEAgLTgxNywyMSArNzYyLDE0IEBACiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAotICBBU1QtPk9yaWdpbmFsU291cmNlRmlsZSA9IFJlYWRlci0+Z2V0T3JpZ2luYWxTb3VyY2VGaWxlKCk7CisgIEFTVC0+T3JpZ2luYWxTb3VyY2VGaWxlID0gQVNULT5SZWFkZXItPmdldE9yaWdpbmFsU291cmNlRmlsZSgpOwogCiAgIFBQLnNldENvdW50ZXJWYWx1ZShDb3VudGVyKTsKIAogICAvLyBBdHRhY2ggdGhlIEFTVCByZWFkZXIgdG8gdGhlIEFTVCBjb250ZXh0IGFzIGFuIGV4dGVybmFsIEFTVAogICAvLyBzb3VyY2UsIHNvIHRoYXQgZGVjbGFyYXRpb25zIHdpbGwgYmUgZGVzZXJpYWxpemVkIGZyb20gdGhlCiAgIC8vIEFTVCBmaWxlIGFzIG5lZWRlZC4KLSAgQVNUUmVhZGVyICpSZWFkZXJQdHIgPSBSZWFkZXIuZ2V0KCk7Ci0gIE93bmluZ1B0cjxFeHRlcm5hbEFTVFNvdXJjZT4gU291cmNlKFJlYWRlci50YWtlKCkpOwotCi0gIC8vIFVucmVnaXN0ZXIgdGhlIGNsZWFudXAgZm9yIEFTVFJlYWRlci4gIEl0IHdpbGwgZ2V0IGNsZWFuZWQgdXAKLSAgLy8gYnkgdGhlIEFTVFVuaXQgY2xlYW51cC4KLSAgUmVhZGVyQ2xlYW51cC51bnJlZ2lzdGVyKCk7Ci0KLSAgQ29udGV4dC5zZXRFeHRlcm5hbFNvdXJjZShTb3VyY2UpOworICBDb250ZXh0LnNldEV4dGVybmFsU291cmNlKEFTVC0+UmVhZGVyKTsKIAogICAvLyBDcmVhdGUgYW4gQVNUIGNvbnN1bWVyLCBldmVuIHRob3VnaCBpdCBpc24ndCB1c2VkLgogICBBU1QtPkNvbnN1bWVyLnJlc2V0KG5ldyBBU1RDb25zdW1lcik7CkBAIC04MzksMTMgKzc3NywxMiBAQAogICAvLyBDcmVhdGUgYSBzZW1hbnRpYyBhbmFseXNpcyBvYmplY3QgYW5kIHRlbGwgdGhlIEFTVCByZWFkZXIgYWJvdXQgaXQuCiAgIEFTVC0+VGhlU2VtYS5yZXNldChuZXcgU2VtYShQUCwgQ29udGV4dCwgKkFTVC0+Q29uc3VtZXIpKTsKICAgQVNULT5UaGVTZW1hLT5Jbml0aWFsaXplKCk7Ci0gIFJlYWRlclB0ci0+SW5pdGlhbGl6ZVNlbWEoKkFTVC0+VGhlU2VtYSk7Ci0gIEFTVC0+UmVhZGVyID0gUmVhZGVyUHRyOworICBBU1QtPlJlYWRlci0+SW5pdGlhbGl6ZVNlbWEoKkFTVC0+VGhlU2VtYSk7CiAKICAgLy8gVGVsbCB0aGUgZGlhZ25vc3RpYyBjbGllbnQgdGhhdCB3ZSBoYXZlIHN0YXJ0ZWQgYSBzb3VyY2UgZmlsZS4KICAgQVNULT5nZXREaWFnbm9zdGljcygpLmdldENsaWVudCgpLT5CZWdpblNvdXJjZUZpbGUoQ29udGV4dC5nZXRMYW5nT3B0cygpLCZQUCk7CiAKLSAgcmV0dXJuIEFTVC50YWtlKCk7CisgIHJldHVybiBBU1QucmVsZWFzZSgpOwogfQogCiBuYW1lc3BhY2UgewpAQCAtODU3LDkgKzc5NCw5IEBACiAgIAogcHVibGljOgogICBleHBsaWNpdCBNYWNyb0RlZmluaXRpb25UcmFja2VyUFBDYWxsYmFja3ModW5zaWduZWQgJkhhc2gpIDogSGFzaChIYXNoKSB7IH0KLSAgCi0gIHZpcnR1YWwgdm9pZCBNYWNyb0RlZmluZWQoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpIHsKKworICB2b2lkIE1hY3JvRGVmaW5lZChjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpIG92ZXJyaWRlIHsKICAgICBIYXNoID0gbGx2bTo6SGFzaFN0cmluZyhNYWNyb05hbWVUb2suZ2V0SWRlbnRpZmllckluZm8oKS0+Z2V0TmFtZSgpLCBIYXNoKTsKICAgfQogfTsKQEAgLTg4MSwxMCArODE4LDkgQEAKICAgICAgIC8vIEZvciBhbiB1bnNjb3BlZCBlbnVtIGluY2x1ZGUgdGhlIGVudW1lcmF0b3JzIGluIHRoZSBoYXNoIHNpbmNlIHRoZXkKICAgICAgIC8vIGVudGVyIHRoZSB0b3AtbGV2ZWwgbmFtZXNwYWNlLgogICAgICAgaWYgKCFFbnVtRC0+aXNTY29wZWQoKSkgewotICAgICAgICBmb3IgKEVudW1EZWNsOjplbnVtZXJhdG9yX2l0ZXJhdG9yIEVJID0gRW51bUQtPmVudW1lcmF0b3JfYmVnaW4oKSwKLSAgICAgICAgICAgICAgIEVFID0gRW51bUQtPmVudW1lcmF0b3JfZW5kKCk7IEVJICE9IEVFOyArK0VJKSB7Ci0gICAgICAgICAgaWYgKCgqRUkpLT5nZXRJZGVudGlmaWVyKCkpCi0gICAgICAgICAgICBIYXNoID0gbGx2bTo6SGFzaFN0cmluZygoKkVJKS0+Z2V0SWRlbnRpZmllcigpLT5nZXROYW1lKCksIEhhc2gpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gKkVJIDogRW51bUQtPmVudW1lcmF0b3JzKCkpIHsKKyAgICAgICAgICBpZiAoRUktPmdldElkZW50aWZpZXIoKSkKKyAgICAgICAgICAgIEhhc2ggPSBsbHZtOjpIYXNoU3RyaW5nKEVJLT5nZXRJZGVudGlmaWVyKCktPmdldE5hbWUoKSwgSGFzaCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC05MzcsMzEgKzg3MywzMCBAQAogICB2b2lkIGhhbmRsZUZpbGVMZXZlbERlY2woRGVjbCAqRCkgewogICAgIFVuaXQuYWRkRmlsZUxldmVsRGVjbChEKTsKICAgICBpZiAoTmFtZXNwYWNlRGVjbCAqTlNEID0gZHluX2Nhc3Q8TmFtZXNwYWNlRGVjbD4oRCkpIHsKLSAgICAgIGZvciAoTmFtZXNwYWNlRGVjbDo6ZGVjbF9pdGVyYXRvcgotICAgICAgICAgICAgIEkgPSBOU0QtPmRlY2xzX2JlZ2luKCksIEUgPSBOU0QtPmRlY2xzX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICAgICAgaGFuZGxlRmlsZUxldmVsRGVjbCgqSSk7CisgICAgICBmb3IgKGF1dG8gKkkgOiBOU0QtPmRlY2xzKCkpCisgICAgICAgIGhhbmRsZUZpbGVMZXZlbERlY2woSSk7CiAgICAgfQogICB9CiAKLSAgYm9vbCBIYW5kbGVUb3BMZXZlbERlY2woRGVjbEdyb3VwUmVmIEQpIHsKKyAgYm9vbCBIYW5kbGVUb3BMZXZlbERlY2woRGVjbEdyb3VwUmVmIEQpIG92ZXJyaWRlIHsKICAgICBmb3IgKERlY2xHcm91cFJlZjo6aXRlcmF0b3IgaXQgPSBELmJlZ2luKCksIGllID0gRC5lbmQoKTsgaXQgIT0gaWU7ICsraXQpCiAgICAgICBoYW5kbGVUb3BMZXZlbERlY2woKml0KTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCiAgIC8vIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluICJpbnRlcmVzdGluZyIgZGVjbHMuCi0gIHZvaWQgSGFuZGxlSW50ZXJlc3RpbmdEZWNsKERlY2xHcm91cFJlZikge30KKyAgdm9pZCBIYW5kbGVJbnRlcmVzdGluZ0RlY2woRGVjbEdyb3VwUmVmKSBvdmVycmlkZSB7fQogCi0gIHZvaWQgSGFuZGxlVG9wTGV2ZWxEZWNsSW5PYmpDQ29udGFpbmVyKERlY2xHcm91cFJlZiBEKSB7CisgIHZvaWQgSGFuZGxlVG9wTGV2ZWxEZWNsSW5PYmpDQ29udGFpbmVyKERlY2xHcm91cFJlZiBEKSBvdmVycmlkZSB7CiAgICAgZm9yIChEZWNsR3JvdXBSZWY6Oml0ZXJhdG9yIGl0ID0gRC5iZWdpbigpLCBpZSA9IEQuZW5kKCk7IGl0ICE9IGllOyArK2l0KQogICAgICAgaGFuZGxlVG9wTGV2ZWxEZWNsKCppdCk7CiAgIH0KIAotICB2aXJ0dWFsIEFTVE11dGF0aW9uTGlzdGVuZXIgKkdldEFTVE11dGF0aW9uTGlzdGVuZXIoKSB7CisgIEFTVE11dGF0aW9uTGlzdGVuZXIgKkdldEFTVE11dGF0aW9uTGlzdGVuZXIoKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFVuaXQuZ2V0QVNUTXV0YXRpb25MaXN0ZW5lcigpOwogICB9CiAKLSAgdmlydHVhbCBBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lciAqR2V0QVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIoKSB7CisgIEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyICpHZXRBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lcigpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gVW5pdC5nZXREZXNlcmlhbGl6YXRpb25MaXN0ZW5lcigpOwogICB9CiB9OwpAQCAtOTcwLDggKzkwNSw4IEBACiBwdWJsaWM6CiAgIEFTVFVuaXQgJlVuaXQ7CiAKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIHsKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGUgewogICAgIENJLmdldFByZXByb2Nlc3NvcigpLmFkZFBQQ2FsbGJhY2tzKAogICAgICBuZXcgTWFjcm9EZWZpbml0aW9uVHJhY2tlclBQQ2FsbGJhY2tzKFVuaXQuZ2V0Q3VycmVudFRvcExldmVsSGFzaFZhbHVlKCkpKTsKICAgICByZXR1cm4gbmV3IFRvcExldmVsRGVjbFRyYWNrZXJDb25zdW1lcihVbml0LCAKQEAgLTk4MSw4ICs5MTYsOCBAQAogcHVibGljOgogICBUb3BMZXZlbERlY2xUcmFja2VyQWN0aW9uKEFTVFVuaXQgJl9Vbml0KSA6IFVuaXQoX1VuaXQpIHt9CiAKLSAgdmlydHVhbCBib29sIGhhc0NvZGVDb21wbGV0aW9uU3VwcG9ydCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgVHJhbnNsYXRpb25Vbml0S2luZCBnZXRUcmFuc2xhdGlvblVuaXRLaW5kKCkgIHsgCisgIGJvb2wgaGFzQ29kZUNvbXBsZXRpb25TdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgVHJhbnNsYXRpb25Vbml0S2luZCBnZXRUcmFuc2xhdGlvblVuaXRLaW5kKCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBVbml0LmdldFRyYW5zbGF0aW9uVW5pdEtpbmQoKTsgCiAgIH0KIH07CkBAIC05OTUsMTUgKzkzMCwxNSBAQAogICBleHBsaWNpdCBQcmVjb21waWxlUHJlYW1ibGVBY3Rpb24oQVNUVW5pdCAmVW5pdCkKICAgICAgIDogVW5pdChVbml0KSwgSGFzRW1pdHRlZFByZWFtYmxlUENIKGZhbHNlKSB7fQogCi0gIHZpcnR1YWwgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSW5GaWxlKTsKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGU7CiAgIGJvb2wgaGFzRW1pdHRlZFByZWFtYmxlUENIKCkgY29uc3QgeyByZXR1cm4gSGFzRW1pdHRlZFByZWFtYmxlUENIOyB9CiAgIHZvaWQgc2V0SGFzRW1pdHRlZFByZWFtYmxlUENIKCkgeyBIYXNFbWl0dGVkUHJlYW1ibGVQQ0ggPSB0cnVlOyB9Ci0gIHZpcnR1YWwgYm9vbCBzaG91bGRFcmFzZU91dHB1dEZpbGVzKCkgeyByZXR1cm4gIWhhc0VtaXR0ZWRQcmVhbWJsZVBDSCgpOyB9CisgIGJvb2wgc2hvdWxkRXJhc2VPdXRwdXRGaWxlcygpIG92ZXJyaWRlIHsgcmV0dXJuICFoYXNFbWl0dGVkUHJlYW1ibGVQQ0goKTsgfQogCi0gIHZpcnR1YWwgYm9vbCBoYXNDb2RlQ29tcGxldGlvblN1cHBvcnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaGFzQVNURmlsZVN1cHBvcnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIFRyYW5zbGF0aW9uVW5pdEtpbmQgZ2V0VHJhbnNsYXRpb25Vbml0S2luZCgpIHsgcmV0dXJuIFRVX1ByZWZpeDsgfQorICBib29sIGhhc0NvZGVDb21wbGV0aW9uU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgaGFzQVNURmlsZVN1cHBvcnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICBUcmFuc2xhdGlvblVuaXRLaW5kIGdldFRyYW5zbGF0aW9uVW5pdEtpbmQoKSBvdmVycmlkZSB7IHJldHVybiBUVV9QcmVmaXg7IH0KIH07CiAKIGNsYXNzIFByZWNvbXBpbGVQcmVhbWJsZUNvbnN1bWVyIDogcHVibGljIFBDSEdlbmVyYXRvciB7CkBAIC0xMDIxLDcgKzk1Niw3IEBACiAgICAgSGFzaCA9IDA7CiAgIH0KIAotICB2aXJ0dWFsIGJvb2wgSGFuZGxlVG9wTGV2ZWxEZWNsKERlY2xHcm91cFJlZiBEKSB7CisgIGJvb2wgSGFuZGxlVG9wTGV2ZWxEZWNsKERlY2xHcm91cFJlZiBEKSBvdmVycmlkZSB7CiAgICAgZm9yIChEZWNsR3JvdXBSZWY6Oml0ZXJhdG9yIGl0ID0gRC5iZWdpbigpLCBpZSA9IEQuZW5kKCk7IGl0ICE9IGllOyArK2l0KSB7CiAgICAgICBEZWNsICpEID0gKml0OwogICAgICAgLy8gRklYTUU6IEN1cnJlbnRseSBPYmpDIG1ldGhvZCBkZWNsYXJhdGlvbnMgYXJlIGluY29ycmVjdGx5IGJlaW5nCkBAIC0xMDM2LDcgKzk3MSw3IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgSGFuZGxlVHJhbnNsYXRpb25Vbml0KEFTVENvbnRleHQgJkN0eCkgeworICB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDdHgpIG92ZXJyaWRlIHsKICAgICBQQ0hHZW5lcmF0b3I6OkhhbmRsZVRyYW5zbGF0aW9uVW5pdChDdHgpOwogICAgIGlmIChoYXNFbWl0dGVkUENIKCkpIHsKICAgICAgIC8vIFRyYW5zbGF0ZSB0aGUgdG9wLWxldmVsIGRlY2xhcmF0aW9ucyB3ZSBjYXB0dXJlZCBkdXJpbmcKQEAgLTExMjAsNyArMTA1NSw3IEBACiAgIH0KICAgCiAgIC8vIENyZWF0ZSB0aGUgY29tcGlsZXIgaW5zdGFuY2UgdG8gdXNlIGZvciBidWlsZGluZyB0aGUgQVNULgotICBPd25pbmdQdHI8Q29tcGlsZXJJbnN0YW5jZT4gQ2xhbmcobmV3IENvbXBpbGVySW5zdGFuY2UoKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb21waWxlckluc3RhbmNlPiBDbGFuZyhuZXcgQ29tcGlsZXJJbnN0YW5jZSgpKTsKIAogICAvLyBSZWNvdmVyIHJlc291cmNlcyBpZiB3ZSBjcmFzaCBiZWZvcmUgZXhpdGluZyB0aGlzIG1ldGhvZC4KICAgbGx2bTo6Q3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwUmVnaXN0cmFyPENvbXBpbGVySW5zdGFuY2U+CkBAIC0xMjA2LDEwICsxMTQxLDEwIEBACiAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgb3ZlcnJpZGUgYnVmZmVyOwogICAgIFNhdmVkTWFpbkZpbGVCdWZmZXIgPSBPdmVycmlkZU1haW5CdWZmZXI7CiAgIH0KLSAgCi0gIE93bmluZ1B0cjxUb3BMZXZlbERlY2xUcmFja2VyQWN0aW9uPiBBY3QoCi0gICAgbmV3IFRvcExldmVsRGVjbFRyYWNrZXJBY3Rpb24oKnRoaXMpKTsKLSAgICAKKworICBzdGQ6OnVuaXF1ZV9wdHI8VG9wTGV2ZWxEZWNsVHJhY2tlckFjdGlvbj4gQWN0KAorICAgICAgbmV3IFRvcExldmVsRGVjbFRyYWNrZXJBY3Rpb24oKnRoaXMpKTsKKwogICAvLyBSZWNvdmVyIHJlc291cmNlcyBpZiB3ZSBjcmFzaCBiZWZvcmUgZXhpdGluZyB0aGlzIG1ldGhvZC4KICAgbGx2bTo6Q3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwUmVnaXN0cmFyPFRvcExldmVsRGVjbFRyYWNrZXJBY3Rpb24+CiAgICAgQWN0Q2xlYW51cChBY3QuZ2V0KCkpOwpAQCAtMTIxOSw5ICsxMTU0LDggQEAKIAogICBpZiAoT3ZlcnJpZGVNYWluQnVmZmVyKSB7CiAgICAgc3RkOjpzdHJpbmcgTW9kTmFtZSA9IGdldFByZWFtYmxlRmlsZSh0aGlzKTsKLSAgICBUcmFuc2xhdGVTdG9yZWREaWFnbm9zdGljcyhDbGFuZy0+Z2V0TW9kdWxlTWFuYWdlcigpLCBNb2ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZU1hbmFnZXIoKSwgUHJlYW1ibGVEaWFnbm9zdGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yZWREaWFnbm9zdGljcyk7CisgICAgVHJhbnNsYXRlU3RvcmVkRGlhZ25vc3RpY3MoZ2V0RmlsZU1hbmFnZXIoKSwgZ2V0U291cmNlTWFuYWdlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlRGlhZ25vc3RpY3MsIFN0b3JlZERpYWdub3N0aWNzKTsKICAgfQogCiAgIGlmICghQWN0LT5FeGVjdXRlKCkpCkBAIC0xMzQ1LDIwICsxMjc5LDgzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4TGluZXMpKTsKIH0KIAotc3RhdGljIGxsdm06Ok1lbW9yeUJ1ZmZlciAqQ3JlYXRlUGFkZGVkTWFpbkZpbGVCdWZmZXIobGx2bTo6TWVtb3J5QnVmZmVyICpPbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOZXdTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5ld05hbWUpIHsKLSAgbGx2bTo6TWVtb3J5QnVmZmVyICpSZXN1bHQKLSAgICA9IGxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0TmV3VW5pbml0TWVtQnVmZmVyKE5ld1NpemUsIE5ld05hbWUpOwotICBtZW1jcHkoY29uc3RfY2FzdDxjaGFyKj4oUmVzdWx0LT5nZXRCdWZmZXJTdGFydCgpKSwgCi0gICAgICAgICBPbGQtPmdldEJ1ZmZlclN0YXJ0KCksIE9sZC0+Z2V0QnVmZmVyU2l6ZSgpKTsKLSAgbWVtc2V0KGNvbnN0X2Nhc3Q8Y2hhcio+KFJlc3VsdC0+Z2V0QnVmZmVyU3RhcnQoKSkgKyBPbGQtPmdldEJ1ZmZlclNpemUoKSwgCi0gICAgICAgICAnICcsIE5ld1NpemUgLSBPbGQtPmdldEJ1ZmZlclNpemUoKSAtIDEpOwotICBjb25zdF9jYXN0PGNoYXIqPihSZXN1bHQtPmdldEJ1ZmZlckVuZCgpKVstMV0gPSAnXG4nOyAgCi0gIAorQVNUVW5pdDo6UHJlYW1ibGVGaWxlSGFzaAorQVNUVW5pdDo6UHJlYW1ibGVGaWxlSGFzaDo6Y3JlYXRlRm9yRmlsZShvZmZfdCBTaXplLCB0aW1lX3QgTW9kVGltZSkgeworICBQcmVhbWJsZUZpbGVIYXNoIFJlc3VsdDsKKyAgUmVzdWx0LlNpemUgPSBTaXplOworICBSZXN1bHQuTW9kVGltZSA9IE1vZFRpbWU7CisgIG1lbXNldChSZXN1bHQuTUQ1LCAwLCBzaXplb2YoUmVzdWx0Lk1ENSkpOwogICByZXR1cm4gUmVzdWx0OwogfQogCitBU1RVbml0OjpQcmVhbWJsZUZpbGVIYXNoIEFTVFVuaXQ6OlByZWFtYmxlRmlsZUhhc2g6OmNyZWF0ZUZvck1lbW9yeUJ1ZmZlcigKKyAgICBjb25zdCBsbHZtOjpNZW1vcnlCdWZmZXIgKkJ1ZmZlcikgeworICBQcmVhbWJsZUZpbGVIYXNoIFJlc3VsdDsKKyAgUmVzdWx0LlNpemUgPSBCdWZmZXItPmdldEJ1ZmZlclNpemUoKTsKKyAgUmVzdWx0Lk1vZFRpbWUgPSAwOworCisgIGxsdm06Ok1ENSBNRDVDdHg7CisgIE1ENUN0eC51cGRhdGUoQnVmZmVyLT5nZXRCdWZmZXIoKS5kYXRhKCkpOworICBNRDVDdHguZmluYWwoUmVzdWx0Lk1ENSk7CisKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworbmFtZXNwYWNlIGNsYW5nIHsKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBBU1RVbml0OjpQcmVhbWJsZUZpbGVIYXNoICZMSFMsCisgICAgICAgICAgICAgICAgY29uc3QgQVNUVW5pdDo6UHJlYW1ibGVGaWxlSGFzaCAmUkhTKSB7CisgIHJldHVybiBMSFMuU2l6ZSA9PSBSSFMuU2l6ZSAmJiBMSFMuTW9kVGltZSA9PSBSSFMuTW9kVGltZSAmJgorICAgICAgICAgbWVtY21wKExIUy5NRDUsIFJIUy5NRDUsIHNpemVvZihMSFMuTUQ1KSkgPT0gMDsKK30KK30gLy8gbmFtZXNwYWNlIGNsYW5nCisKK3N0YXRpYyBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPgorbWFrZVN0YW5kYWxvbmVSYW5nZShDaGFyU291cmNlUmFuZ2UgUmFuZ2UsIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKKyAgQ2hhclNvdXJjZVJhbmdlIEZpbGVSYW5nZSA9IExleGVyOjptYWtlRmlsZUNoYXJSYW5nZShSYW5nZSwgU00sIExhbmdPcHRzKTsKKyAgdW5zaWduZWQgT2Zmc2V0ID0gU00uZ2V0RmlsZU9mZnNldChGaWxlUmFuZ2UuZ2V0QmVnaW4oKSk7CisgIHVuc2lnbmVkIEVuZE9mZnNldCA9IFNNLmdldEZpbGVPZmZzZXQoRmlsZVJhbmdlLmdldEVuZCgpKTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKE9mZnNldCwgRW5kT2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgbWFrZVN0YW5kYWxvbmVGaXhJdChjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaXhJdEhpbnQgJkluRml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RVbml0OjpTdGFuZGFsb25lRml4SXQgJk91dEZpeCkgeworICBPdXRGaXguUmVtb3ZlUmFuZ2UgPSBtYWtlU3RhbmRhbG9uZVJhbmdlKEluRml4LlJlbW92ZVJhbmdlLCBTTSwgTGFuZ09wdHMpOworICBPdXRGaXguSW5zZXJ0RnJvbVJhbmdlID0gbWFrZVN0YW5kYWxvbmVSYW5nZShJbkZpeC5JbnNlcnRGcm9tUmFuZ2UsIFNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5nT3B0cyk7CisgIE91dEZpeC5Db2RlVG9JbnNlcnQgPSBJbkZpeC5Db2RlVG9JbnNlcnQ7CisgIE91dEZpeC5CZWZvcmVQcmV2aW91c0luc2VydGlvbnMgPSBJbkZpeC5CZWZvcmVQcmV2aW91c0luc2VydGlvbnM7Cit9CisKK3N0YXRpYyB2b2lkIG1ha2VTdGFuZGFsb25lRGlhZ25vc3RpYyhjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RvcmVkRGlhZ25vc3RpYyAmSW5EaWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVFVuaXQ6OlN0YW5kYWxvbmVEaWFnbm9zdGljICZPdXREaWFnKSB7CisgIE91dERpYWcuSUQgPSBJbkRpYWcuZ2V0SUQoKTsKKyAgT3V0RGlhZy5MZXZlbCA9IEluRGlhZy5nZXRMZXZlbCgpOworICBPdXREaWFnLk1lc3NhZ2UgPSBJbkRpYWcuZ2V0TWVzc2FnZSgpOworICBPdXREaWFnLkxvY09mZnNldCA9IDA7CisgIGlmIChJbkRpYWcuZ2V0TG9jYXRpb24oKS5pc0ludmFsaWQoKSkKKyAgICByZXR1cm47CisgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNID0gSW5EaWFnLmdldExvY2F0aW9uKCkuZ2V0TWFuYWdlcigpOworICBTb3VyY2VMb2NhdGlvbiBGaWxlTG9jID0gU00uZ2V0RmlsZUxvYyhJbkRpYWcuZ2V0TG9jYXRpb24oKSk7CisgIE91dERpYWcuRmlsZW5hbWUgPSBTTS5nZXRGaWxlbmFtZShGaWxlTG9jKTsKKyAgaWYgKE91dERpYWcuRmlsZW5hbWUuZW1wdHkoKSkKKyAgICByZXR1cm47CisgIE91dERpYWcuTG9jT2Zmc2V0ID0gU00uZ2V0RmlsZU9mZnNldChGaWxlTG9jKTsKKyAgZm9yIChTdG9yZWREaWFnbm9zdGljOjpyYW5nZV9pdGVyYXRvcgorICAgICAgICAgSSA9IEluRGlhZy5yYW5nZV9iZWdpbigpLCBFID0gSW5EaWFnLnJhbmdlX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIE91dERpYWcuUmFuZ2VzLnB1c2hfYmFjayhtYWtlU3RhbmRhbG9uZVJhbmdlKCpJLCBTTSwgTGFuZ09wdHMpKTsKKyAgfQorICBmb3IgKFN0b3JlZERpYWdub3N0aWM6OmZpeGl0X2l0ZXJhdG9yCisgICAgICAgICBJID0gSW5EaWFnLmZpeGl0X2JlZ2luKCksIEUgPSBJbkRpYWcuZml4aXRfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgQVNUVW5pdDo6U3RhbmRhbG9uZUZpeEl0IEZpeDsKKyAgICBtYWtlU3RhbmRhbG9uZUZpeEl0KFNNLCBMYW5nT3B0cywgKkksIEZpeCk7CisgICAgT3V0RGlhZy5GaXhJdHMucHVzaF9iYWNrKEZpeCk7CisgIH0KK30KKwogLy8vIFxicmllZiBBdHRlbXB0IHRvIGJ1aWxkIG9yIHJlLXVzZSBhIHByZWNvbXBpbGVkIHByZWFtYmxlIHdoZW4gKHJlLSlwYXJzaW5nCiAvLy8gdGhlIHNvdXJjZSBmaWxlLgogLy8vCkBAIC0xMzk1LDcgKzEzOTIsNyBAQAogICAgID0gQ29tcHV0ZVByZWFtYmxlKCpQcmVhbWJsZUludm9jYXRpb24sIE1heExpbmVzLCBDcmVhdGVkUHJlYW1ibGVCdWZmZXIpOwogCiAgIC8vIElmIENvbXB1dGVQcmVhbWJsZSgpIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBwcmVhbWJsZSBidWZmZXIuCi0gIE93bmluZ1B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IE93bmVkUHJlYW1ibGVCdWZmZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IE93bmVkUHJlYW1ibGVCdWZmZXI7CiAgIGlmIChDcmVhdGVkUHJlYW1ibGVCdWZmZXIpCiAgICAgT3duZWRQcmVhbWJsZUJ1ZmZlci5yZXNldChOZXdQcmVhbWJsZS5maXJzdCk7CiAKQEAgLTE0MTcsNyArMTQxNCw2IEBACiAgICAgLy8gbmV3IG1haW4gZmlsZS4KICAgICBpZiAoUHJlYW1ibGUuc2l6ZSgpID09IE5ld1ByZWFtYmxlLnNlY29uZC5maXJzdCAmJgogICAgICAgICBQcmVhbWJsZUVuZHNBdFN0YXJ0T2ZMaW5lID09IE5ld1ByZWFtYmxlLnNlY29uZC5zZWNvbmQgJiYKLSAgICAgICAgTmV3UHJlYW1ibGUuZmlyc3QtPmdldEJ1ZmZlclNpemUoKSA8IFByZWFtYmxlUmVzZXJ2ZWRTaXplLTIgJiYKICAgICAgICAgbWVtY21wKFByZWFtYmxlLmdldEJ1ZmZlclN0YXJ0KCksIE5ld1ByZWFtYmxlLmZpcnN0LT5nZXRCdWZmZXJTdGFydCgpLAogICAgICAgICAgICAgICAgTmV3UHJlYW1ibGUuc2Vjb25kLmZpcnN0KSA9PSAwKSB7CiAgICAgICAvLyBUaGUgcHJlYW1ibGUgaGFzIG5vdCBjaGFuZ2VkLiBXZSBtYXkgYmUgYWJsZSB0byByZS11c2UgdGhlIHByZWNvbXBpbGVkCkBAIC0xNDI4LDEzICsxNDI0LDEzIEBACiAgICAgICAgICAgCiAgICAgICAvLyBGaXJzdCwgbWFrZSBhIHJlY29yZCBvZiB0aG9zZSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBvdmVycmlkZGVuIHZpYQogICAgICAgLy8gcmVtYXBwaW5nIG9yIHVuc2F2ZWRfZmlsZXMuCi0gICAgICBsbHZtOjpTdHJpbmdNYXA8c3RkOjpwYWlyPG9mZl90LCB0aW1lX3Q+ID4gT3ZlcnJpZGRlbkZpbGVzOworICAgICAgbGx2bTo6U3RyaW5nTWFwPFByZWFtYmxlRmlsZUhhc2g+IE92ZXJyaWRkZW5GaWxlczsKICAgICAgIGZvciAoUHJlcHJvY2Vzc29yT3B0aW9uczo6cmVtYXBwZWRfZmlsZV9pdGVyYXRvcgogICAgICAgICAgICAgICAgIFIgPSBQcmVwcm9jZXNzb3JPcHRzLnJlbWFwcGVkX2ZpbGVfYmVnaW4oKSwKICAgICAgICAgICAgICBSRW5kID0gUHJlcHJvY2Vzc29yT3B0cy5yZW1hcHBlZF9maWxlX2VuZCgpOwogICAgICAgICAgICAhQW55RmlsZUNoYW5nZWQgJiYgUiAhPSBSRW5kOwogICAgICAgICAgICArK1IpIHsKLSAgICAgICAgbGx2bTo6c3lzOjpmczo6ZmlsZV9zdGF0dXMgU3RhdHVzOworICAgICAgICB2ZnM6OlN0YXR1cyBTdGF0dXM7CiAgICAgICAgIGlmIChGaWxlTWdyLT5nZXROb25jYWNoZWRTdGF0VmFsdWUoUi0+c2Vjb25kLCBTdGF0dXMpKSB7CiAgICAgICAgICAgLy8gSWYgd2UgY2FuJ3Qgc3RhdCB0aGUgZmlsZSB3ZSdyZSByZW1hcHBpbmcgdG8sIGFzc3VtZSB0aGF0IHNvbWV0aGluZwogICAgICAgICAgIC8vIGhvcnJpYmxlIGhhcHBlbmVkLgpAQCAtMTQ0Miw3ICsxNDM4LDcgQEAKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIE92ZXJyaWRkZW5GaWxlc1tSLT5maXJzdF0gPSBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgT3ZlcnJpZGRlbkZpbGVzW1ItPmZpcnN0XSA9IFByZWFtYmxlRmlsZUhhc2g6OmNyZWF0ZUZvckZpbGUoCiAgICAgICAgICAgICBTdGF0dXMuZ2V0U2l6ZSgpLCBTdGF0dXMuZ2V0TGFzdE1vZGlmaWNhdGlvblRpbWUoKS50b0Vwb2NoVGltZSgpKTsKICAgICAgIH0KICAgICAgIGZvciAoUHJlcHJvY2Vzc29yT3B0aW9uczo6cmVtYXBwZWRfZmlsZV9idWZmZXJfaXRlcmF0b3IKQEAgLTE0NTAsMTggKzE0NDYsMTYgQEAKICAgICAgICAgICAgICBSRW5kID0gUHJlcHJvY2Vzc29yT3B0cy5yZW1hcHBlZF9maWxlX2J1ZmZlcl9lbmQoKTsKICAgICAgICAgICAgIUFueUZpbGVDaGFuZ2VkICYmIFIgIT0gUkVuZDsKICAgICAgICAgICAgKytSKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgYWN0dWFsbHkgY29tcGFyZSB0aGUgY29udGVudHMgb2YgZmlsZS0+YnVmZmVyCi0gICAgICAgIC8vIHJlbWFwcGluZ3M/Ci0gICAgICAgIE92ZXJyaWRkZW5GaWxlc1tSLT5maXJzdF0gPSBzdGQ6Om1ha2VfcGFpcihSLT5zZWNvbmQtPmdldEJ1ZmZlclNpemUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgT3ZlcnJpZGRlbkZpbGVzW1ItPmZpcnN0XSA9CisgICAgICAgICAgICBQcmVhbWJsZUZpbGVIYXNoOjpjcmVhdGVGb3JNZW1vcnlCdWZmZXIoUi0+c2Vjb25kKTsKICAgICAgIH0KICAgICAgICAKICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYW55dGhpbmcgaGFzIGNoYW5nZWQuCi0gICAgICBmb3IgKGxsdm06OlN0cmluZ01hcDxzdGQ6OnBhaXI8b2ZmX3QsIHRpbWVfdD4gPjo6aXRlcmF0b3IgCisgICAgICBmb3IgKGxsdm06OlN0cmluZ01hcDxQcmVhbWJsZUZpbGVIYXNoPjo6aXRlcmF0b3IgCiAgICAgICAgICAgICAgRiA9IEZpbGVzSW5QcmVhbWJsZS5iZWdpbigpLCBGRW5kID0gRmlsZXNJblByZWFtYmxlLmVuZCgpOwogICAgICAgICAgICAhQW55RmlsZUNoYW5nZWQgJiYgRiAhPSBGRW5kOyAKICAgICAgICAgICAgKytGKSB7Ci0gICAgICAgIGxsdm06OlN0cmluZ01hcDxzdGQ6OnBhaXI8b2ZmX3QsIHRpbWVfdD4gPjo6aXRlcmF0b3IgT3ZlcnJpZGRlbgorICAgICAgICBsbHZtOjpTdHJpbmdNYXA8UHJlYW1ibGVGaWxlSGFzaD46Oml0ZXJhdG9yIE92ZXJyaWRkZW4KICAgICAgICAgICA9IE92ZXJyaWRkZW5GaWxlcy5maW5kKEYtPmZpcnN0KCkpOwogICAgICAgICBpZiAoT3ZlcnJpZGRlbiAhPSBPdmVycmlkZGVuRmlsZXMuZW5kKCkpIHsKICAgICAgICAgICAvLyBUaGlzIGZpbGUgd2FzIHJlbWFwcGVkOyBjaGVjayB3aGV0aGVyIHRoZSBuZXdseS1tYXBwZWQgZmlsZSAKQEAgLTE0NzIsMTMgKzE0NjYsMTMgQEAKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgLy8gVGhlIGZpbGUgd2FzIG5vdCByZW1hcHBlZDsgY2hlY2sgd2hldGhlciBpdCBoYXMgY2hhbmdlZCBvbiBkaXNrLgotICAgICAgICBsbHZtOjpzeXM6OmZzOjpmaWxlX3N0YXR1cyBTdGF0dXM7CisgICAgICAgIHZmczo6U3RhdHVzIFN0YXR1czsKICAgICAgICAgaWYgKEZpbGVNZ3ItPmdldE5vbmNhY2hlZFN0YXRWYWx1ZShGLT5maXJzdCgpLCBTdGF0dXMpKSB7CiAgICAgICAgICAgLy8gSWYgd2UgY2FuJ3Qgc3RhdCB0aGUgZmlsZSwgYXNzdW1lIHRoYXQgc29tZXRoaW5nIGhvcnJpYmxlIGhhcHBlbmVkLgogICAgICAgICAgIEFueUZpbGVDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChTdGF0dXMuZ2V0U2l6ZSgpICE9IHVpbnQ2NF90KEYtPnNlY29uZC5maXJzdCkgfHwKKyAgICAgICAgfSBlbHNlIGlmIChTdGF0dXMuZ2V0U2l6ZSgpICE9IHVpbnQ2NF90KEYtPnNlY29uZC5TaXplKSB8fAogICAgICAgICAgICAgICAgICAgIFN0YXR1cy5nZXRMYXN0TW9kaWZpY2F0aW9uVGltZSgpLnRvRXBvY2hUaW1lKCkgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QoRi0+c2Vjb25kLnNlY29uZCkpCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KEYtPnNlY29uZC5Nb2RUaW1lKSkKICAgICAgICAgICBBbnlGaWxlQ2hhbmdlZCA9IHRydWU7CiAgICAgICB9CiAgICAgICAgICAgCkBAIC0xNDkyLDExICsxNDg2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlSW52b2NhdGlvbi0+Z2V0RGlhZ25vc3RpY09wdHMoKSk7CiAgICAgICAgIGdldERpYWdub3N0aWNzKCkuc2V0TnVtV2FybmluZ3MoTnVtV2FybmluZ3NJblByZWFtYmxlKTsKIAotICAgICAgICAvLyBDcmVhdGUgYSB2ZXJzaW9uIG9mIHRoZSBtYWluIGZpbGUgYnVmZmVyIHRoYXQgaXMgcGFkZGVkIHRvCi0gICAgICAgIC8vIGJ1ZmZlciBzaXplIHdlIHJlc2VydmVkIHdoZW4gY3JlYXRpbmcgdGhlIHByZWFtYmxlLgotICAgICAgICByZXR1cm4gQ3JlYXRlUGFkZGVkTWFpbkZpbGVCdWZmZXIoTmV3UHJlYW1ibGUuZmlyc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGVSZXNlcnZlZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9udGVuZE9wdHMuSW5wdXRzWzBdLmdldEZpbGUoKSk7CisgICAgICAgIHJldHVybiBsbHZtOjpNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlckNvcHkoCisgICAgICAgICAgICBOZXdQcmVhbWJsZS5maXJzdC0+Z2V0QnVmZmVyKCksIEZyb250ZW5kT3B0cy5JbnB1dHNbMF0uZ2V0RmlsZSgpKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTE1MzYsMjAgKzE1MjcsMTAgQEAKICAgLy8gV2UgZGlkIG5vdCBwcmV2aW91c2x5IGNvbXB1dGUgYSBwcmVhbWJsZSwgb3IgaXQgY2FuJ3QgYmUgcmV1c2VkIGFueXdheS4KICAgU2ltcGxlVGltZXIgUHJlYW1ibGVUaW1lcihXYW50VGltaW5nKTsKICAgUHJlYW1ibGVUaW1lci5zZXRPdXRwdXQoIlByZWNvbXBpbGluZyBwcmVhbWJsZSIpOwotICAKLSAgLy8gQ3JlYXRlIGEgbmV3IGJ1ZmZlciB0aGF0IHN0b3JlcyB0aGUgcHJlYW1ibGUuIFRoZSBidWZmZXIgYWxzbyBjb250YWlucwotICAvLyBleHRyYSBzcGFjZSBmb3IgdGhlIG9yaWdpbmFsIGNvbnRlbnRzIG9mIHRoZSBmaWxlICh3aGljaCB3aWxsIGJlIHByZXNlbnQKLSAgLy8gd2hlbiB3ZSBhY3R1YWxseSBwYXJzZSB0aGUgZmlsZSkgYWxvbmcgd2l0aCBtb3JlIHJvb20gaW4gY2FzZSB0aGUgZmlsZQotICAvLyBncm93cy4gIAotICBQcmVhbWJsZVJlc2VydmVkU2l6ZSA9IE5ld1ByZWFtYmxlLmZpcnN0LT5nZXRCdWZmZXJTaXplKCk7Ci0gIGlmIChQcmVhbWJsZVJlc2VydmVkU2l6ZSA8IDQwOTYpCi0gICAgUHJlYW1ibGVSZXNlcnZlZFNpemUgPSA4MTkxOwotICBlbHNlCi0gICAgUHJlYW1ibGVSZXNlcnZlZFNpemUgKj0gMjsKIAogICAvLyBTYXZlIHRoZSBwcmVhbWJsZSB0ZXh0IGZvciBsYXRlcjsgd2UnbGwgbmVlZCB0byBjb21wYXJlIGFnYWluc3QgaXQgZm9yCiAgIC8vIHN1YnNlcXVlbnQgcmVwYXJzZXMuCi0gIFN0cmluZ1JlZiBNYWluRmlsZW5hbWUgPSBQcmVhbWJsZUludm9jYXRpb24tPmdldEZyb250ZW5kT3B0cygpLklucHV0c1swXS5nZXRGaWxlKCk7CisgIFN0cmluZ1JlZiBNYWluRmlsZW5hbWUgPSBGcm9udGVuZE9wdHMuSW5wdXRzWzBdLmdldEZpbGUoKTsKICAgUHJlYW1ibGUuYXNzaWduKEZpbGVNZ3ItPmdldEZpbGUoTWFpbkZpbGVuYW1lKSwKICAgICAgICAgICAgICAgICAgIE5ld1ByZWFtYmxlLmZpcnN0LT5nZXRCdWZmZXJTdGFydCgpLCAKICAgICAgICAgICAgICAgICAgIE5ld1ByZWFtYmxlLmZpcnN0LT5nZXRCdWZmZXJTdGFydCgpIApAQCAtMTU1OCwxMyArMTUzOSw4IEBACiAKICAgZGVsZXRlIFByZWFtYmxlQnVmZmVyOwogICBQcmVhbWJsZUJ1ZmZlcgotICAgID0gbGx2bTo6TWVtb3J5QnVmZmVyOjpnZXROZXdVbmluaXRNZW1CdWZmZXIoUHJlYW1ibGVSZXNlcnZlZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9udGVuZE9wdHMuSW5wdXRzWzBdLmdldEZpbGUoKSk7Ci0gIG1lbWNweShjb25zdF9jYXN0PGNoYXIqPihQcmVhbWJsZUJ1ZmZlci0+Z2V0QnVmZmVyU3RhcnQoKSksIAotICAgICAgICAgTmV3UHJlYW1ibGUuZmlyc3QtPmdldEJ1ZmZlclN0YXJ0KCksIFByZWFtYmxlLnNpemUoKSk7Ci0gIG1lbXNldChjb25zdF9jYXN0PGNoYXIqPihQcmVhbWJsZUJ1ZmZlci0+Z2V0QnVmZmVyU3RhcnQoKSkgKyBQcmVhbWJsZS5zaXplKCksIAotICAgICAgICAgJyAnLCBQcmVhbWJsZVJlc2VydmVkU2l6ZSAtIFByZWFtYmxlLnNpemUoKSAtIDEpOwotICBjb25zdF9jYXN0PGNoYXIqPihQcmVhbWJsZUJ1ZmZlci0+Z2V0QnVmZmVyRW5kKCkpWy0xXSA9ICdcbic7ICAKKyAgICA9IGxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyQ29weSgKKyAgICAgICAgTmV3UHJlYW1ibGUuZmlyc3QtPmdldEJ1ZmZlcigpLnNsaWNlKDAsIFByZWFtYmxlLnNpemUoKSksIE1haW5GaWxlbmFtZSk7CiAKICAgLy8gUmVtYXAgdGhlIG1haW4gc291cmNlIGZpbGUgdG8gdGhlIHByZWFtYmxlIGJ1ZmZlci4KICAgU3RyaW5nUmVmIE1haW5GaWxlUGF0aCA9IEZyb250ZW5kT3B0cy5JbnB1dHNbMF0uZ2V0RmlsZSgpOwpAQCAtMTU3OCw3ICsxNTU0LDcgQEAKICAgUHJlcHJvY2Vzc29yT3B0cy5QcmVjb21waWxlZFByZWFtYmxlQnl0ZXMuc2Vjb25kID0gZmFsc2U7CiAgIAogICAvLyBDcmVhdGUgdGhlIGNvbXBpbGVyIGluc3RhbmNlIHRvIHVzZSBmb3IgYnVpbGRpbmcgdGhlIHByZWNvbXBpbGVkIHByZWFtYmxlLgotICBPd25pbmdQdHI8Q29tcGlsZXJJbnN0YW5jZT4gQ2xhbmcobmV3IENvbXBpbGVySW5zdGFuY2UoKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb21waWxlckluc3RhbmNlPiBDbGFuZyhuZXcgQ29tcGlsZXJJbnN0YW5jZSgpKTsKIAogICAvLyBSZWNvdmVyIHJlc291cmNlcyBpZiB3ZSBjcmFzaCBiZWZvcmUgZXhpdGluZyB0aGlzIG1ldGhvZC4KICAgbGx2bTo6Q3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwUmVnaXN0cmFyPENvbXBpbGVySW5zdGFuY2U+CkBAIC0xNjIxLDYgKzE1OTcsNyBAQAogICBjaGVja0FuZFJlbW92ZU5vbkRyaXZlckRpYWdzKFN0b3JlZERpYWdub3N0aWNzKTsKICAgVG9wTGV2ZWxEZWNscy5jbGVhcigpOwogICBUb3BMZXZlbERlY2xzSW5QcmVhbWJsZS5jbGVhcigpOworICBQcmVhbWJsZURpYWdub3N0aWNzLmNsZWFyKCk7CiAgIAogICAvLyBDcmVhdGUgYSBmaWxlIG1hbmFnZXIgb2JqZWN0IHRvIHByb3ZpZGUgYWNjZXNzIHRvIGFuZCBjYWNoZSB0aGUgZmlsZXN5c3RlbS4KICAgQ2xhbmctPnNldEZpbGVNYW5hZ2VyKG5ldyBGaWxlTWFuYWdlcihDbGFuZy0+Z2V0RmlsZVN5c3RlbU9wdHMoKSkpOwpAQCAtMTYyOCw4ICsxNjA1LDggQEAKICAgLy8gQ3JlYXRlIHRoZSBzb3VyY2UgbWFuYWdlci4KICAgQ2xhbmctPnNldFNvdXJjZU1hbmFnZXIobmV3IFNvdXJjZU1hbmFnZXIoZ2V0RGlhZ25vc3RpY3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhbmctPmdldEZpbGVNYW5hZ2VyKCkpKTsKLSAgCi0gIE93bmluZ1B0cjxQcmVjb21waWxlUHJlYW1ibGVBY3Rpb24+IEFjdDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8UHJlY29tcGlsZVByZWFtYmxlQWN0aW9uPiBBY3Q7CiAgIEFjdC5yZXNldChuZXcgUHJlY29tcGlsZVByZWFtYmxlQWN0aW9uKCp0aGlzKSk7CiAgIGlmICghQWN0LT5CZWdpblNvdXJjZUZpbGUoKkNsYW5nLmdldCgpLCBDbGFuZy0+Z2V0RnJvbnRlbmRPcHRzKCkuSW5wdXRzWzBdKSkgewogICAgIGxsdm06OnN5czo6ZnM6OnJlbW92ZShGcm9udGVuZE9wdHMuT3V0cHV0RmlsZSk7CkBAIC0xNjQxLDggKzE2MTgsMjEgQEAKICAgfQogICAKICAgQWN0LT5FeGVjdXRlKCk7CisKKyAgLy8gVHJhbnNmZXIgYW55IGRpYWdub3N0aWNzIGdlbmVyYXRlZCB3aGVuIHBhcnNpbmcgdGhlIHByZWFtYmxlIGludG8gdGhlIHNldAorICAvLyBvZiBwcmVhbWJsZSBkaWFnbm9zdGljcy4KKyAgZm9yIChzdG9yZWRfZGlhZ19pdGVyYXRvcgorICAgICAgICAgSSA9IHN0b3JlZF9kaWFnX2FmdGVyRHJpdmVyX2JlZ2luKCksCisgICAgICAgICBFID0gc3RvcmVkX2RpYWdfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgU3RhbmRhbG9uZURpYWdub3N0aWMgRGlhZzsKKyAgICBtYWtlU3RhbmRhbG9uZURpYWdub3N0aWMoQ2xhbmctPmdldExhbmdPcHRzKCksICpJLCBEaWFnKTsKKyAgICBQcmVhbWJsZURpYWdub3N0aWNzLnB1c2hfYmFjayhEaWFnKTsKKyAgfQorCiAgIEFjdC0+RW5kU291cmNlRmlsZSgpOwogCisgIGNoZWNrQW5kUmVtb3ZlTm9uRHJpdmVyRGlhZ3MoU3RvcmVkRGlhZ25vc3RpY3MpOworCiAgIGlmICghQWN0LT5oYXNFbWl0dGVkUHJlYW1ibGVQQ0goKSkgewogICAgIC8vIFRoZSBwcmVhbWJsZSBQQ0ggZmFpbGVkIChlLmcuIHRoZXJlIHdhcyBhIG1vZHVsZSBsb2FkaW5nIGZhdGFsIGVycm9yKSwKICAgICAvLyBzbyBubyBwcmVjb21waWxlZCBoZWFkZXIgd2FzIGdlbmVyYXRlZC4gRm9yZ2V0IHRoYXQgd2UgZXZlbiB0cmllZC4KQEAgLTE2NTYsMTMgKzE2NDYsNiBAQAogICAgIHJldHVybiAwOwogICB9CiAgIAotICAvLyBUcmFuc2ZlciBhbnkgZGlhZ25vc3RpY3MgZ2VuZXJhdGVkIHdoZW4gcGFyc2luZyB0aGUgcHJlYW1ibGUgaW50byB0aGUgc2V0Ci0gIC8vIG9mIHByZWFtYmxlIGRpYWdub3N0aWNzLgotICBQcmVhbWJsZURpYWdub3N0aWNzLmNsZWFyKCk7Ci0gIFByZWFtYmxlRGlhZ25vc3RpY3MuaW5zZXJ0KFByZWFtYmxlRGlhZ25vc3RpY3MuZW5kKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZF9kaWFnX2FmdGVyRHJpdmVyX2JlZ2luKCksIHN0b3JlZF9kaWFnX2VuZCgpKTsKLSAgY2hlY2tBbmRSZW1vdmVOb25Ecml2ZXJEaWFncyhTdG9yZWREaWFnbm9zdGljcyk7Ci0gIAogICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmVhbWJsZSB3ZSBwcmVjb21waWxlZC4KICAgc2V0UHJlYW1ibGVGaWxlKHRoaXMsIEZyb250ZW5kT3B0cy5PdXRwdXRGaWxlKTsKICAgTnVtV2FybmluZ3NJblByZWFtYmxlID0gZ2V0RGlhZ25vc3RpY3MoKS5nZXROdW1XYXJuaW5ncygpOwpAQCAtMTY3OCwxMSArMTY2MSwyMCBAQAogICAgICAgIEYgIT0gRkVuZDsKICAgICAgICArK0YpIHsKICAgICBjb25zdCBGaWxlRW50cnkgKkZpbGUgPSBGLT5zZWNvbmQtPk9yaWdFbnRyeTsKLSAgICBpZiAoIUZpbGUgfHwgRi0+c2Vjb25kLT5nZXRSYXdCdWZmZXIoKSA9PSBNYWluRmlsZUJ1ZmZlcikKKyAgICBpZiAoIUZpbGUpCiAgICAgICBjb250aW51ZTsKLSAgICAKLSAgICBGaWxlc0luUHJlYW1ibGVbRmlsZS0+Z2V0TmFtZSgpXQotICAgICAgPSBzdGQ6Om1ha2VfcGFpcihGLT5zZWNvbmQtPmdldFNpemUoKSwgRmlsZS0+Z2V0TW9kaWZpY2F0aW9uVGltZSgpKTsKKyAgICBjb25zdCBsbHZtOjpNZW1vcnlCdWZmZXIgKkJ1ZmZlciA9IEYtPnNlY29uZC0+Z2V0UmF3QnVmZmVyKCk7CisgICAgaWYgKEJ1ZmZlciA9PSBNYWluRmlsZUJ1ZmZlcikKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHRpbWVfdCBNb2RUaW1lID0gRmlsZS0+Z2V0TW9kaWZpY2F0aW9uVGltZSgpKSB7CisgICAgICBGaWxlc0luUHJlYW1ibGVbRmlsZS0+Z2V0TmFtZSgpXSA9IFByZWFtYmxlRmlsZUhhc2g6OmNyZWF0ZUZvckZpbGUoCisgICAgICAgICAgRi0+c2Vjb25kLT5nZXRTaXplKCksIE1vZFRpbWUpOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoRi0+c2Vjb25kLT5nZXRTaXplKCkgPT0gQnVmZmVyLT5nZXRCdWZmZXJTaXplKCkpOworICAgICAgRmlsZXNJblByZWFtYmxlW0ZpbGUtPmdldE5hbWUoKV0gPQorICAgICAgICAgIFByZWFtYmxlRmlsZUhhc2g6OmNyZWF0ZUZvck1lbW9yeUJ1ZmZlcihCdWZmZXIpOworICAgIH0KICAgfQogICAKICAgUHJlYW1ibGVSZWJ1aWxkQ291bnRlciA9IDE7CkBAIC0xNjk3LDkgKzE2ODksOCBAQAogICAgIFByZWFtYmxlVG9wTGV2ZWxIYXNoVmFsdWUgPSBDdXJyZW50VG9wTGV2ZWxIYXNoVmFsdWU7CiAgIH0KICAgCi0gIHJldHVybiBDcmVhdGVQYWRkZWRNYWluRmlsZUJ1ZmZlcihOZXdQcmVhbWJsZS5maXJzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZVJlc2VydmVkU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kT3B0cy5JbnB1dHNbMF0uZ2V0RmlsZSgpKTsKKyAgcmV0dXJuIGxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyQ29weShOZXdQcmVhbWJsZS5maXJzdC0+Z2V0QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbkZpbGVuYW1lKTsKIH0KIAogdm9pZCBBU1RVbml0OjpSZWFsaXplVG9wTGV2ZWxEZWNsc0Zyb21QcmVhbWJsZSgpIHsKQEAgLTE3NjEsNyArMTc1Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNzRW5naW5lPiBEaWFncywKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhcHR1cmVEaWFnbm9zdGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVzZXJGaWxlc0FyZVZvbGF0aWxlKSB7Ci0gIE93bmluZ1B0cjxBU1RVbml0PiBBU1Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RVbml0PiBBU1Q7CiAgIEFTVC5yZXNldChuZXcgQVNUVW5pdChmYWxzZSkpOwogICBDb25maWd1cmVEaWFncyhEaWFncywgMCwgMCwgKkFTVCwgQ2FwdHVyZURpYWdub3N0aWNzKTsKICAgQVNULT5EaWFnbm9zdGljcyA9IERpYWdzOwpAQCAtMTc3MiwyNSArMTc2MywxOSBAQAogICBBU1QtPlNvdXJjZU1nciA9IG5ldyBTb3VyY2VNYW5hZ2VyKEFTVC0+Z2V0RGlhZ25vc3RpY3MoKSwgKkFTVC0+RmlsZU1nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRmlsZXNBcmVWb2xhdGlsZSk7CiAKLSAgcmV0dXJuIEFTVC50YWtlKCk7CisgIHJldHVybiBBU1QucmVsZWFzZSgpOwogfQogCi1BU1RVbml0ICpBU1RVbml0OjpMb2FkRnJvbUNvbXBpbGVySW52b2NhdGlvbkFjdGlvbihDb21waWxlckludm9jYXRpb24gKkNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNzRW5naW5lPiBEaWFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVEZyb250ZW5kQWN0aW9uICpBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RVbml0ICpVbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQZXJzaXN0ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlc291cmNlRmlsZXNQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPbmx5TG9jYWxEZWNscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2FwdHVyZURpYWdub3N0aWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcmVjb21waWxlUHJlYW1ibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhY2hlQ29kZUNvbXBsZXRpb25SZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlQnJpZWZDb21tZW50c0luQ29kZUNvbXBsZXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVzZXJGaWxlc0FyZVZvbGF0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duaW5nUHRyPEFTVFVuaXQ+ICpFcnJBU1QpIHsKK0FTVFVuaXQgKkFTVFVuaXQ6OkxvYWRGcm9tQ29tcGlsZXJJbnZvY2F0aW9uQWN0aW9uKAorICAgIENvbXBpbGVySW52b2NhdGlvbiAqQ0ksIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MsCisgICAgQVNURnJvbnRlbmRBY3Rpb24gKkFjdGlvbiwgQVNUVW5pdCAqVW5pdCwgYm9vbCBQZXJzaXN0ZW50LAorICAgIFN0cmluZ1JlZiBSZXNvdXJjZUZpbGVzUGF0aCwgYm9vbCBPbmx5TG9jYWxEZWNscywgYm9vbCBDYXB0dXJlRGlhZ25vc3RpY3MsCisgICAgYm9vbCBQcmVjb21waWxlUHJlYW1ibGUsIGJvb2wgQ2FjaGVDb2RlQ29tcGxldGlvblJlc3VsdHMsCisgICAgYm9vbCBJbmNsdWRlQnJpZWZDb21tZW50c0luQ29kZUNvbXBsZXRpb24sIGJvb2wgVXNlckZpbGVzQXJlVm9sYXRpbGUsCisgICAgc3RkOjp1bmlxdWVfcHRyPEFTVFVuaXQ+ICpFcnJBU1QpIHsKICAgYXNzZXJ0KENJICYmICJBIENvbXBpbGVySW52b2NhdGlvbiBpcyByZXF1aXJlZCIpOwogCi0gIE93bmluZ1B0cjxBU1RVbml0PiBPd25BU1Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RVbml0PiBPd25BU1Q7CiAgIEFTVFVuaXQgKkFTVCA9IFVuaXQ7CiAgIGlmICghQVNUKSB7CiAgICAgLy8gQ3JlYXRlIHRoZSBBU1QgdW5pdC4KQEAgLTE4MjQsNyArMTgwOSw3IEBACiAgIFByb2Nlc3NXYXJuaW5nT3B0aW9ucyhBU1QtPmdldERpYWdub3N0aWNzKCksIENJLT5nZXREaWFnbm9zdGljT3B0cygpKTsKIAogICAvLyBDcmVhdGUgdGhlIGNvbXBpbGVyIGluc3RhbmNlIHRvIHVzZSBmb3IgYnVpbGRpbmcgdGhlIEFTVC4KLSAgT3duaW5nUHRyPENvbXBpbGVySW5zdGFuY2U+IENsYW5nKG5ldyBDb21waWxlckluc3RhbmNlKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsZXJJbnN0YW5jZT4gQ2xhbmcobmV3IENvbXBpbGVySW5zdGFuY2UoKSk7CiAKICAgLy8gUmVjb3ZlciByZXNvdXJjZXMgaWYgd2UgY3Jhc2ggYmVmb3JlIGV4aXRpbmcgdGhpcyBtZXRob2QuCiAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhcjxDb21waWxlckluc3RhbmNlPgpAQCAtMTg3MCw3ICsxODU1LDcgQEAKIAogICBBU1RGcm9udGVuZEFjdGlvbiAqQWN0ID0gQWN0aW9uOwogCi0gIE93bmluZ1B0cjxUb3BMZXZlbERlY2xUcmFja2VyQWN0aW9uPiBUcmFja2VyQWN0OworICBzdGQ6OnVuaXF1ZV9wdHI8VG9wTGV2ZWxEZWNsVHJhY2tlckFjdGlvbj4gVHJhY2tlckFjdDsKICAgaWYgKCFBY3QpIHsKICAgICBUcmFja2VyQWN0LnJlc2V0KG5ldyBUb3BMZXZlbERlY2xUcmFja2VyQWN0aW9uKCpBU1QpKTsKICAgICBBY3QgPSBUcmFja2VyQWN0LmdldCgpOwpAQCAtMTkxMiw3ICsxODk3LDcgQEAKICAgQWN0LT5FbmRTb3VyY2VGaWxlKCk7CiAKICAgaWYgKE93bkFTVCkKLSAgICByZXR1cm4gT3duQVNULnRha2UoKTsKKyAgICByZXR1cm4gT3duQVNULnJlbGVhc2UoKTsKICAgZWxzZQogICAgIHJldHVybiBBU1Q7CiB9CkBAIC0xOTUzLDcgKzE5MzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlQnJpZWZDb21tZW50c0luQ29kZUNvbXBsZXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVzZXJGaWxlc0FyZVZvbGF0aWxlKSB7CiAgIC8vIENyZWF0ZSB0aGUgQVNUIHVuaXQuCi0gIE93bmluZ1B0cjxBU1RVbml0PiBBU1Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RVbml0PiBBU1Q7CiAgIEFTVC5yZXNldChuZXcgQVNUVW5pdChmYWxzZSkpOwogICBDb25maWd1cmVEaWFncyhEaWFncywgMCwgMCwgKkFTVCwgQ2FwdHVyZURpYWdub3N0aWNzKTsKICAgQVNULT5EaWFnbm9zdGljcyA9IERpYWdzOwpAQCAtMTk3NSwyNyArMTk2MCwyMCBAQAogICAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0UmVsZWFzZVJlZkNsZWFudXA8RGlhZ25vc3RpY3NFbmdpbmU+ID4KICAgICBEaWFnQ2xlYW51cChEaWFncy5nZXRQdHIoKSk7CiAKLSAgcmV0dXJuIEFTVC0+TG9hZEZyb21Db21waWxlckludm9jYXRpb24oUHJlY29tcGlsZVByZWFtYmxlKT8gMCA6IEFTVC50YWtlKCk7CisgIHJldHVybiBBU1QtPkxvYWRGcm9tQ29tcGlsZXJJbnZvY2F0aW9uKFByZWNvbXBpbGVQcmVhbWJsZSkgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBU1QucmVsZWFzZSgpOwogfQogCi1BU1RVbml0ICpBU1RVbml0OjpMb2FkRnJvbUNvbW1hbmRMaW5lKGNvbnN0IGNoYXIgKipBcmdCZWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKkFyZ0VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBSZXNvdXJjZUZpbGVzUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPbmx5TG9jYWxEZWNscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDYXB0dXJlRGlhZ25vc3RpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFwcGVkRmlsZSAqUmVtYXBwZWRGaWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVtYXBwZWRGaWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZW1hcHBlZEZpbGVzS2VlcE9yaWdpbmFsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcmVjb21waWxlUHJlYW1ibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uVW5pdEtpbmQgVFVLaW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENhY2hlQ29kZUNvbXBsZXRpb25SZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluY2x1ZGVCcmllZkNvbW1lbnRzSW5Db2RlQ29tcGxldGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1BDSFdpdGhDb21waWxlckVycm9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTa2lwRnVuY3Rpb25Cb2RpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXNlckZpbGVzQXJlVm9sYXRpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yU2VyaWFsaXphdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duaW5nUHRyPEFTVFVuaXQ+ICpFcnJBU1QpIHsKK0FTVFVuaXQgKkFTVFVuaXQ6OkxvYWRGcm9tQ29tbWFuZExpbmUoCisgICAgY29uc3QgY2hhciAqKkFyZ0JlZ2luLCBjb25zdCBjaGFyICoqQXJnRW5kLAorICAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MsIFN0cmluZ1JlZiBSZXNvdXJjZUZpbGVzUGF0aCwKKyAgICBib29sIE9ubHlMb2NhbERlY2xzLCBib29sIENhcHR1cmVEaWFnbm9zdGljcywKKyAgICBBcnJheVJlZjxSZW1hcHBlZEZpbGU+IFJlbWFwcGVkRmlsZXMsIGJvb2wgUmVtYXBwZWRGaWxlc0tlZXBPcmlnaW5hbE5hbWUsCisgICAgYm9vbCBQcmVjb21waWxlUHJlYW1ibGUsIFRyYW5zbGF0aW9uVW5pdEtpbmQgVFVLaW5kLAorICAgIGJvb2wgQ2FjaGVDb2RlQ29tcGxldGlvblJlc3VsdHMsIGJvb2wgSW5jbHVkZUJyaWVmQ29tbWVudHNJbkNvZGVDb21wbGV0aW9uLAorICAgIGJvb2wgQWxsb3dQQ0hXaXRoQ29tcGlsZXJFcnJvcnMsIGJvb2wgU2tpcEZ1bmN0aW9uQm9kaWVzLAorICAgIGJvb2wgVXNlckZpbGVzQXJlVm9sYXRpbGUsIGJvb2wgRm9yU2VyaWFsaXphdGlvbiwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QVNUVW5pdD4gKkVyckFTVCkgewogICBpZiAoIURpYWdzLmdldFB0cigpKSB7CiAgICAgLy8gTm8gZGlhZ25vc3RpY3MgZW5naW5lIHdhcyBwcm92aWRlZCwgc28gY3JlYXRlIG91ciBvd24gZGlhZ25vc3RpY3Mgb2JqZWN0CiAgICAgLy8gd2l0aCB0aGUgZGVmYXVsdCBvcHRpb25zLgpAQCAtMjAxOSwxNSArMTk5Nyw5IEBACiAgIH0KIAogICAvLyBPdmVycmlkZSBhbnkgZmlsZXMgdGhhdCBuZWVkIHJlbWFwcGluZwotICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bVJlbWFwcGVkRmlsZXM7ICsrSSkgewotICAgIEZpbGVuYW1lT3JNZW1CdWYgZmlsZU9yQnVmID0gUmVtYXBwZWRGaWxlc1tJXS5zZWNvbmQ7Ci0gICAgaWYgKGNvbnN0IGxsdm06Ok1lbW9yeUJ1ZmZlciAqCi0gICAgICAgICAgICBtZW1CdWYgPSBmaWxlT3JCdWYuZHluX2Nhc3Q8Y29uc3QgbGx2bTo6TWVtb3J5QnVmZmVyICo+KCkpIHsKLSAgICAgIENJLT5nZXRQcmVwcm9jZXNzb3JPcHRzKCkuYWRkUmVtYXBwZWRGaWxlKFJlbWFwcGVkRmlsZXNbSV0uZmlyc3QsIG1lbUJ1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZuYW1lID0gZmlsZU9yQnVmLmdldDxjb25zdCBjaGFyICo+KCk7Ci0gICAgICBDSS0+Z2V0UHJlcHJvY2Vzc29yT3B0cygpLmFkZFJlbWFwcGVkRmlsZShSZW1hcHBlZEZpbGVzW0ldLmZpcnN0LCBmbmFtZSk7Ci0gICAgfQorICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gUmVtYXBwZWRGaWxlcy5zaXplKCk7IEkgIT0gTjsgKytJKSB7CisgICAgQ0ktPmdldFByZXByb2Nlc3Nvck9wdHMoKS5hZGRSZW1hcHBlZEZpbGUoUmVtYXBwZWRGaWxlc1tJXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1hcHBlZEZpbGVzW0ldLnNlY29uZCk7CiAgIH0KICAgUHJlcHJvY2Vzc29yT3B0aW9ucyAmUFBPcHRzID0gQ0ktPmdldFByZXByb2Nlc3Nvck9wdHMoKTsKICAgUFBPcHRzLlJlbWFwcGVkRmlsZXNLZWVwT3JpZ2luYWxOYW1lID0gUmVtYXBwZWRGaWxlc0tlZXBPcmlnaW5hbE5hbWU7CkBAIC0yMDM5LDcgKzIwMTEsNyBAQAogICBDSS0+Z2V0RnJvbnRlbmRPcHRzKCkuU2tpcEZ1bmN0aW9uQm9kaWVzID0gU2tpcEZ1bmN0aW9uQm9kaWVzOwogCiAgIC8vIENyZWF0ZSB0aGUgQVNUIHVuaXQuCi0gIE93bmluZ1B0cjxBU1RVbml0PiBBU1Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RVbml0PiBBU1Q7CiAgIEFTVC5yZXNldChuZXcgQVNUVW5pdChmYWxzZSkpOwogICBDb25maWd1cmVEaWFncyhEaWFncywgQXJnQmVnaW4sIEFyZ0VuZCwgKkFTVCwgQ2FwdHVyZURpYWdub3N0aWNzKTsKICAgQVNULT5EaWFnbm9zdGljcyA9IERpYWdzOwpAQCAtMjA3NCwxMCArMjA0NiwxMCBAQAogICAgIHJldHVybiAwOwogICB9CiAKLSAgcmV0dXJuIEFTVC50YWtlKCk7CisgIHJldHVybiBBU1QucmVsZWFzZSgpOwogfQogCi1ib29sIEFTVFVuaXQ6OlJlcGFyc2UoUmVtYXBwZWRGaWxlICpSZW1hcHBlZEZpbGVzLCB1bnNpZ25lZCBOdW1SZW1hcHBlZEZpbGVzKSB7Citib29sIEFTVFVuaXQ6OlJlcGFyc2UoQXJyYXlSZWY8UmVtYXBwZWRGaWxlPiBSZW1hcHBlZEZpbGVzKSB7CiAgIGlmICghSW52b2NhdGlvbikKICAgICByZXR1cm4gdHJ1ZTsKIApAQCAtMjA5NiwxOSArMjA2OCwxMSBAQAogICAgIGRlbGV0ZSBSLT5zZWNvbmQ7CiAgIH0KICAgSW52b2NhdGlvbi0+Z2V0UHJlcHJvY2Vzc29yT3B0cygpLmNsZWFyUmVtYXBwZWRGaWxlcygpOwotICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bVJlbWFwcGVkRmlsZXM7ICsrSSkgewotICAgIEZpbGVuYW1lT3JNZW1CdWYgZmlsZU9yQnVmID0gUmVtYXBwZWRGaWxlc1tJXS5zZWNvbmQ7Ci0gICAgaWYgKGNvbnN0IGxsdm06Ok1lbW9yeUJ1ZmZlciAqCi0gICAgICAgICAgICBtZW1CdWYgPSBmaWxlT3JCdWYuZHluX2Nhc3Q8Y29uc3QgbGx2bTo6TWVtb3J5QnVmZmVyICo+KCkpIHsKLSAgICAgIEludm9jYXRpb24tPmdldFByZXByb2Nlc3Nvck9wdHMoKS5hZGRSZW1hcHBlZEZpbGUoUmVtYXBwZWRGaWxlc1tJXS5maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtQnVmKTsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgY2hhciAqZm5hbWUgPSBmaWxlT3JCdWYuZ2V0PGNvbnN0IGNoYXIgKj4oKTsKLSAgICAgIEludm9jYXRpb24tPmdldFByZXByb2Nlc3Nvck9wdHMoKS5hZGRSZW1hcHBlZEZpbGUoUmVtYXBwZWRGaWxlc1tJXS5maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUpOwotICAgIH0KKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IFJlbWFwcGVkRmlsZXMuc2l6ZSgpOyBJICE9IE47ICsrSSkgeworICAgIEludm9jYXRpb24tPmdldFByZXByb2Nlc3Nvck9wdHMoKS5hZGRSZW1hcHBlZEZpbGUoUmVtYXBwZWRGaWxlc1tJXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFwcGVkRmlsZXNbSV0uc2Vjb25kKTsKICAgfQotICAKKwogICAvLyBJZiB3ZSBoYXZlIGEgcHJlYW1ibGUgZmlsZSBseWluZyBhcm91bmQsIG9yIGlmIHdlIG1pZ2h0IHRyeSB0bwogICAvLyBidWlsZCBhIHByZWNvbXBpbGVkIHByZWFtYmxlLCBkbyBzbyBub3cuCiAgIGxsdm06Ok1lbW9yeUJ1ZmZlciAqT3ZlcnJpZGVNYWluQnVmZmVyID0gMDsKQEAgLTIxNzgsMjMgKzIxNDIsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgfCAgKDFMTCA8PCBDb2RlQ29tcGxldGlvbkNvbnRleHQ6OkNDQ19VbmlvblRhZykKICAgICAgICAgICAgICAgICAgICAgICAgfCAgKDFMTCA8PCBDb2RlQ29tcGxldGlvbkNvbnRleHQ6OkNDQ19DbGFzc09yU3RydWN0VGFnKTsKICAgICB9Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIFByb2Nlc3NDb2RlQ29tcGxldGVSZXN1bHRzKFNlbWEgJlMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlQ29tcGxldGlvbkNvbnRleHQgQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUNvbXBsZXRpb25SZXN1bHQgKlJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVJlc3VsdHMpOwotICAgIAotICAgIHZpcnR1YWwgdm9pZCBQcm9jZXNzT3ZlcmxvYWRDYW5kaWRhdGVzKFNlbWEgJlMsIHVuc2lnbmVkIEN1cnJlbnRBcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGUgKkNhbmRpZGF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQ2FuZGlkYXRlcykgeyAKKworICAgIHZvaWQgUHJvY2Vzc0NvZGVDb21wbGV0ZVJlc3VsdHMoU2VtYSAmUywgQ29kZUNvbXBsZXRpb25Db250ZXh0IENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlQ29tcGxldGlvblJlc3VsdCAqUmVzdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVJlc3VsdHMpIG92ZXJyaWRlOworCisgICAgdm9pZCBQcm9jZXNzT3ZlcmxvYWRDYW5kaWRhdGVzKFNlbWEgJlMsIHVuc2lnbmVkIEN1cnJlbnRBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkQ2FuZGlkYXRlICpDYW5kaWRhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DYW5kaWRhdGVzKSBvdmVycmlkZSB7CiAgICAgICBOZXh0LlByb2Nlc3NPdmVybG9hZENhbmRpZGF0ZXMoUywgQ3VycmVudEFyZywgQ2FuZGlkYXRlcywgTnVtQ2FuZGlkYXRlcyk7CiAgICAgfQotICAgIAotICAgIHZpcnR1YWwgQ29kZUNvbXBsZXRpb25BbGxvY2F0b3IgJmdldEFsbG9jYXRvcigpIHsKKworICAgIENvZGVDb21wbGV0aW9uQWxsb2NhdG9yICZnZXRBbGxvY2F0b3IoKSBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gTmV4dC5nZXRBbGxvY2F0b3IoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIENvZGVDb21wbGV0aW9uVFVJbmZvICZnZXRDb2RlQ29tcGxldGlvblRVSW5mbygpIHsKKyAgICBDb2RlQ29tcGxldGlvblRVSW5mbyAmZ2V0Q29kZUNvbXBsZXRpb25UVUluZm8oKSBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gTmV4dC5nZXRDb2RlQ29tcGxldGlvblRVSW5mbygpOwogICAgIH0KICAgfTsKQEAgLTIzNzgsOCArMjM0MSw3IEBACiAKIAogdm9pZCBBU1RVbml0OjpDb2RlQ29tcGxldGUoU3RyaW5nUmVmIEZpbGUsIHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbHVtbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFwcGVkRmlsZSAqUmVtYXBwZWRGaWxlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZW1hcHBlZEZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UmVtYXBwZWRGaWxlPiBSZW1hcHBlZEZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlTWFjcm9zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZUNvZGVQYXR0ZXJucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZUJyaWVmQ29tbWVudHMsCkBAIC0yNDE3LDcgKzIzNzksNyBAQAogICAvLyBTZXQgdGhlIGxhbmd1YWdlIG9wdGlvbnMgYXBwcm9wcmlhdGVseS4KICAgTGFuZ09wdHMgPSAqQ0NJbnZvY2F0aW9uLT5nZXRMYW5nT3B0cygpOwogCi0gIE93bmluZ1B0cjxDb21waWxlckluc3RhbmNlPiBDbGFuZyhuZXcgQ29tcGlsZXJJbnN0YW5jZSgpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENvbXBpbGVySW5zdGFuY2U+IENsYW5nKG5ldyBDb21waWxlckluc3RhbmNlKCkpOwogCiAgIC8vIFJlY292ZXIgcmVzb3VyY2VzIGlmIHdlIGNyYXNoIGJlZm9yZSBleGl0aW5nIHRoaXMgbWV0aG9kLgogICBsbHZtOjpDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXBSZWdpc3RyYXI8Q29tcGlsZXJJbnN0YW5jZT4KQEAgLTI0NjIsMTggKzI0MjQsMTIgQEAKICAgLy8gUmVtYXAgZmlsZXMuCiAgIFByZXByb2Nlc3Nvck9wdHMuY2xlYXJSZW1hcHBlZEZpbGVzKCk7CiAgIFByZXByb2Nlc3Nvck9wdHMuUmV0YWluUmVtYXBwZWRGaWxlQnVmZmVycyA9IHRydWU7Ci0gIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gTnVtUmVtYXBwZWRGaWxlczsgKytJKSB7Ci0gICAgRmlsZW5hbWVPck1lbUJ1ZiBmaWxlT3JCdWYgPSBSZW1hcHBlZEZpbGVzW0ldLnNlY29uZDsKLSAgICBpZiAoY29uc3QgbGx2bTo6TWVtb3J5QnVmZmVyICoKLSAgICAgICAgICAgIG1lbUJ1ZiA9IGZpbGVPckJ1Zi5keW5fY2FzdDxjb25zdCBsbHZtOjpNZW1vcnlCdWZmZXIgKj4oKSkgewotICAgICAgUHJlcHJvY2Vzc29yT3B0cy5hZGRSZW1hcHBlZEZpbGUoUmVtYXBwZWRGaWxlc1tJXS5maXJzdCwgbWVtQnVmKTsKLSAgICAgIE93bmVkQnVmZmVycy5wdXNoX2JhY2sobWVtQnVmKTsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgY2hhciAqZm5hbWUgPSBmaWxlT3JCdWYuZ2V0PGNvbnN0IGNoYXIgKj4oKTsKLSAgICAgIFByZXByb2Nlc3Nvck9wdHMuYWRkUmVtYXBwZWRGaWxlKFJlbWFwcGVkRmlsZXNbSV0uZmlyc3QsIGZuYW1lKTsKLSAgICB9CisgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBSZW1hcHBlZEZpbGVzLnNpemUoKTsgSSAhPSBOOyArK0kpIHsKKyAgICBQcmVwcm9jZXNzb3JPcHRzLmFkZFJlbWFwcGVkRmlsZShSZW1hcHBlZEZpbGVzW0ldLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFwcGVkRmlsZXNbSV0uc2Vjb25kKTsKKyAgICBPd25lZEJ1ZmZlcnMucHVzaF9iYWNrKFJlbWFwcGVkRmlsZXNbSV0uc2Vjb25kKTsKICAgfQotICAKKwogICAvLyBVc2UgdGhlIGNvZGUgY29tcGxldGlvbiBjb25zdW1lciB3ZSB3ZXJlIGdpdmVuLCBidXQgYWRkaW5nIGFueSBjYWNoZWQKICAgLy8gY29kZS1jb21wbGV0aW9uIHJlc3VsdHMuCiAgIEF1Z21lbnRlZENvZGVDb21wbGV0ZUNvbnN1bWVyICpBdWdtZW50ZWRDb25zdW1lcgpAQCAtMjUyMCw4ICsyNDc2LDggQEAKICAgLy8gRGlzYWJsZSB0aGUgcHJlcHJvY2Vzc2luZyByZWNvcmQgaWYgbW9kdWxlcyBhcmUgbm90IGVuYWJsZWQuCiAgIGlmICghQ2xhbmctPmdldExhbmdPcHRzKCkuTW9kdWxlcykKICAgICBQcmVwcm9jZXNzb3JPcHRzLkRldGFpbGVkUmVjb3JkID0gZmFsc2U7Ci0gIAotICBPd25pbmdQdHI8U3ludGF4T25seUFjdGlvbj4gQWN0OworCisgIHN0ZDo6dW5pcXVlX3B0cjxTeW50YXhPbmx5QWN0aW9uPiBBY3Q7CiAgIEFjdC5yZXNldChuZXcgU3ludGF4T25seUFjdGlvbik7CiAgIGlmIChBY3QtPkJlZ2luU291cmNlRmlsZSgqQ2xhbmcuZ2V0KCksIENsYW5nLT5nZXRGcm9udGVuZE9wdHMoKS5JbnB1dHNbMF0pKSB7CiAgICAgQWN0LT5FeGVjdXRlKCk7CkBAIC0yNTU0LDggKzI1MTAsNyBAQAogICB9CiAKICAgaWYgKGxsdm06OnN5czo6ZnM6OnJlbmFtZShUZW1wUGF0aC5zdHIoKSwgRmlsZSkpIHsKLSAgICBib29sIGV4aXN0czsKLSAgICBsbHZtOjpzeXM6OmZzOjpyZW1vdmUoVGVtcFBhdGguc3RyKCksIGV4aXN0cyk7CisgICAgbGx2bTo6c3lzOjpmczo6cmVtb3ZlKFRlbXBQYXRoLnN0cigpKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCkBAIC0yNTkxLDY4ICsyNTQ2LDU3IEBACiAKIHR5cGVkZWYgQ29udGludW91c1JhbmdlTWFwPHVuc2lnbmVkLCBpbnQsIDI+IFNMb2NSZW1hcDsKIAotc3RhdGljIHZvaWQgVHJhbnNsYXRlU0xvYyhTb3VyY2VMb2NhdGlvbiAmTCwgU0xvY1JlbWFwICZSZW1hcCkgewotICB1bnNpZ25lZCBSYXcgPSBMLmdldFJhd0VuY29kaW5nKCk7Ci0gIGNvbnN0IHVuc2lnbmVkIE1hY3JvQml0ID0gMVUgPDwgMzE7Ci0gIEwgPSBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKChSYXcgJiBNYWNyb0JpdCkgfAotICAgICAgKChSYXcgJiB+TWFjcm9CaXQpICsgUmVtYXAuZmluZChSYXcgJiB+TWFjcm9CaXQpLT5zZWNvbmQpKTsKLX0KLQogdm9pZCBBU1RVbml0OjpUcmFuc2xhdGVTdG9yZWREaWFnbm9zdGljcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUUmVhZGVyICpNTWFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTW9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU1hbmFnZXIgJkZpbGVNZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU1hbmFnZXIgJlNyY01nciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFN0b3JlZERpYWdub3N0aWM+ICZEaWFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPFN0YW5kYWxvbmVEaWFnbm9zdGljPiAmRGlhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTdG9yZWREaWFnbm9zdGljPiAmT3V0KSB7Ci0gIC8vIFRoZSBzdG9yZWQgZGlhZ25vc3RpYyBoYXMgdGhlIG9sZCBzb3VyY2UgbWFuYWdlciBpbiBpdDsgdXBkYXRlCi0gIC8vIHRoZSBsb2NhdGlvbnMgdG8gcmVmZXIgaW50byB0aGUgbmV3IHNvdXJjZSBtYW5hZ2VyLiBXZSBhbHNvIG5lZWQgdG8gcmVtYXAKLSAgLy8gYWxsIHRoZSBsb2NhdGlvbnMgdG8gdGhlIG5ldyB2aWV3LiBUaGlzIGluY2x1ZGVzIHRoZSBkaWFnIGxvY2F0aW9uLCBhbnkKLSAgLy8gYXNzb2NpYXRlZCBzb3VyY2UgcmFuZ2VzLCBhbmQgdGhlIHNvdXJjZSByYW5nZXMgb2YgYXNzb2NpYXRlZCBmaXgtaXRzLgorICAvLyBNYXAgdGhlIHN0YW5kYWxvbmUgZGlhZ25vc3RpYyBpbnRvIHRoZSBuZXcgc291cmNlIG1hbmFnZXIuIFdlIGFsc28gbmVlZCB0bworICAvLyByZW1hcCBhbGwgdGhlIGxvY2F0aW9ucyB0byB0aGUgbmV3IHZpZXcuIFRoaXMgaW5jbHVkZXMgdGhlIGRpYWcgbG9jYXRpb24sCisgIC8vIGFueSBhc3NvY2lhdGVkIHNvdXJjZSByYW5nZXMsIGFuZCB0aGUgc291cmNlIHJhbmdlcyBvZiBhc3NvY2lhdGVkIGZpeC1pdHMuCiAgIC8vIEZJWE1FOiBUaGVyZSBzaG91bGQgYmUgYSBjbGVhbmVyIHdheSB0byBkbyB0aGlzLgogCiAgIFNtYWxsVmVjdG9yPFN0b3JlZERpYWdub3N0aWMsIDQ+IFJlc3VsdDsKICAgUmVzdWx0LnJlc2VydmUoRGlhZ3Muc2l6ZSgpKTsKLSAgYXNzZXJ0KE1NYW4gJiYgIkRvbid0IGhhdmUgYSBtb2R1bGUgbWFuYWdlciIpOwotICBzZXJpYWxpemF0aW9uOjpNb2R1bGVGaWxlICpNb2QgPSBNTWFuLT5Nb2R1bGVNZ3IubG9va3VwKE1vZE5hbWUpOwotICBhc3NlcnQoTW9kICYmICJEb24ndCBoYXZlIHByZWFtYmxlIG1vZHVsZSIpOwotICBTTG9jUmVtYXAgJlJlbWFwID0gTW9kLT5TTG9jUmVtYXA7CiAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBEaWFncy5zaXplKCk7IEkgIT0gTjsgKytJKSB7CiAgICAgLy8gUmVidWlsZCB0aGUgU3RvcmVkRGlhZ25vc3RpYy4KLSAgICBjb25zdCBTdG9yZWREaWFnbm9zdGljICZTRCA9IERpYWdzW0ldOwotICAgIFNvdXJjZUxvY2F0aW9uIEwgPSBTRC5nZXRMb2NhdGlvbigpOwotICAgIFRyYW5zbGF0ZVNMb2MoTCwgUmVtYXApOworICAgIGNvbnN0IFN0YW5kYWxvbmVEaWFnbm9zdGljICZTRCA9IERpYWdzW0ldOworICAgIGlmIChTRC5GaWxlbmFtZS5lbXB0eSgpKQorICAgICAgY29udGludWU7CisgICAgY29uc3QgRmlsZUVudHJ5ICpGRSA9IEZpbGVNZ3IuZ2V0RmlsZShTRC5GaWxlbmFtZSk7CisgICAgaWYgKCFGRSkKKyAgICAgIGNvbnRpbnVlOworICAgIEZpbGVJRCBGSUQgPSBTcmNNZ3IudHJhbnNsYXRlRmlsZShGRSk7CisgICAgU291cmNlTG9jYXRpb24gRmlsZUxvYyA9IFNyY01nci5nZXRMb2NGb3JTdGFydE9mRmlsZShGSUQpOworICAgIGlmIChGaWxlTG9jLmlzSW52YWxpZCgpKQorICAgICAgY29udGludWU7CisgICAgU291cmNlTG9jYXRpb24gTCA9IEZpbGVMb2MuZ2V0TG9jV2l0aE9mZnNldChTRC5Mb2NPZmZzZXQpOwogICAgIEZ1bGxTb3VyY2VMb2MgTG9jKEwsIFNyY01ncik7CiAKICAgICBTbWFsbFZlY3RvcjxDaGFyU291cmNlUmFuZ2UsIDQ+IFJhbmdlczsKLSAgICBSYW5nZXMucmVzZXJ2ZShTRC5yYW5nZV9zaXplKCkpOwotICAgIGZvciAoU3RvcmVkRGlhZ25vc3RpYzo6cmFuZ2VfaXRlcmF0b3IgSSA9IFNELnJhbmdlX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gU0QucmFuZ2VfZW5kKCk7Ci0gICAgICAgICBJICE9IEU7ICsrSSkgewotICAgICAgU291cmNlTG9jYXRpb24gQkwgPSBJLT5nZXRCZWdpbigpOwotICAgICAgVHJhbnNsYXRlU0xvYyhCTCwgUmVtYXApOwotICAgICAgU291cmNlTG9jYXRpb24gRUwgPSBJLT5nZXRFbmQoKTsKLSAgICAgIFRyYW5zbGF0ZVNMb2MoRUwsIFJlbWFwKTsKLSAgICAgIFJhbmdlcy5wdXNoX2JhY2soQ2hhclNvdXJjZVJhbmdlKFNvdXJjZVJhbmdlKEJMLCBFTCksIEktPmlzVG9rZW5SYW5nZSgpKSk7CisgICAgUmFuZ2VzLnJlc2VydmUoU0QuUmFuZ2VzLnNpemUoKSk7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiA+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICBJID0gU0QuUmFuZ2VzLmJlZ2luKCksIEUgPSBTRC5SYW5nZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBTb3VyY2VMb2NhdGlvbiBCTCA9IEZpbGVMb2MuZ2V0TG9jV2l0aE9mZnNldCgoKkkpLmZpcnN0KTsKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEVMID0gRmlsZUxvYy5nZXRMb2NXaXRoT2Zmc2V0KCgqSSkuc2Vjb25kKTsKKyAgICAgIFJhbmdlcy5wdXNoX2JhY2soQ2hhclNvdXJjZVJhbmdlOjpnZXRDaGFyUmFuZ2UoQkwsIEVMKSk7CiAgICAgfQogCiAgICAgU21hbGxWZWN0b3I8Rml4SXRIaW50LCAyPiBGaXhJdHM7Ci0gICAgRml4SXRzLnJlc2VydmUoU0QuZml4aXRfc2l6ZSgpKTsKLSAgICBmb3IgKFN0b3JlZERpYWdub3N0aWM6OmZpeGl0X2l0ZXJhdG9yIEkgPSBTRC5maXhpdF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IFNELmZpeGl0X2VuZCgpOworICAgIEZpeEl0cy5yZXNlcnZlKFNELkZpeEl0cy5zaXplKCkpOworICAgIGZvciAoc3RkOjp2ZWN0b3I8U3RhbmRhbG9uZUZpeEl0Pjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgSSA9IFNELkZpeEl0cy5iZWdpbigpLCBFID0gU0QuRml4SXRzLmVuZCgpOwogICAgICAgICAgSSAhPSBFOyArK0kpIHsKICAgICAgIEZpeEl0cy5wdXNoX2JhY2soRml4SXRIaW50KCkpOwogICAgICAgRml4SXRIaW50ICZGSCA9IEZpeEl0cy5iYWNrKCk7CiAgICAgICBGSC5Db2RlVG9JbnNlcnQgPSBJLT5Db2RlVG9JbnNlcnQ7Ci0gICAgICBTb3VyY2VMb2NhdGlvbiBCTCA9IEktPlJlbW92ZVJhbmdlLmdldEJlZ2luKCk7Ci0gICAgICBUcmFuc2xhdGVTTG9jKEJMLCBSZW1hcCk7Ci0gICAgICBTb3VyY2VMb2NhdGlvbiBFTCA9IEktPlJlbW92ZVJhbmdlLmdldEVuZCgpOwotICAgICAgVHJhbnNsYXRlU0xvYyhFTCwgUmVtYXApOwotICAgICAgRkguUmVtb3ZlUmFuZ2UgPSBDaGFyU291cmNlUmFuZ2UoU291cmNlUmFuZ2UoQkwsIEVMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEktPlJlbW92ZVJhbmdlLmlzVG9rZW5SYW5nZSgpKTsKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEJMID0gRmlsZUxvYy5nZXRMb2NXaXRoT2Zmc2V0KEktPlJlbW92ZVJhbmdlLmZpcnN0KTsKKyAgICAgIFNvdXJjZUxvY2F0aW9uIEVMID0gRmlsZUxvYy5nZXRMb2NXaXRoT2Zmc2V0KEktPlJlbW92ZVJhbmdlLnNlY29uZCk7CisgICAgICBGSC5SZW1vdmVSYW5nZSA9IENoYXJTb3VyY2VSYW5nZTo6Z2V0Q2hhclJhbmdlKEJMLCBFTCk7CiAgICAgfQogCi0gICAgUmVzdWx0LnB1c2hfYmFjayhTdG9yZWREaWFnbm9zdGljKFNELmdldExldmVsKCksIFNELmdldElEKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRC5nZXRNZXNzYWdlKCksIExvYywgUmFuZ2VzLCBGaXhJdHMpKTsKKyAgICBSZXN1bHQucHVzaF9iYWNrKFN0b3JlZERpYWdub3N0aWMoU0QuTGV2ZWwsIFNELklELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0QuTWVzc2FnZSwgTG9jLCBSYW5nZXMsIEZpeEl0cykpOwogICB9CiAgIFJlc3VsdC5zd2FwKE91dCk7CiB9CkBAIC0yNjc3LDcgKzI2MjEsNyBAQAogICBhc3NlcnQoU00uaXNMb2NhbFNvdXJjZUxvY2F0aW9uKEZpbGVMb2MpKTsKICAgRmlsZUlEIEZJRDsKICAgdW5zaWduZWQgT2Zmc2V0OwotICBsbHZtOjp0aWUoRklELCBPZmZzZXQpID0gU00uZ2V0RGVjb21wb3NlZExvYyhGaWxlTG9jKTsKKyAgc3RkOjp0aWUoRklELCBPZmZzZXQpID0gU00uZ2V0RGVjb21wb3NlZExvYyhGaWxlTG9jKTsKICAgaWYgKEZJRC5pc0ludmFsaWQoKSkKICAgICByZXR1cm47CiAKQEAgLTI4NjAsNyArMjgwNCw3IEBACiAgICAgc2VyaWFsaXphdGlvbjo6TW9kdWxlRmlsZSAmCiAgICAgICBNb2QgPSBSZWFkZXItPmdldE1vZHVsZU1hbmFnZXIoKS5nZXRQcmltYXJ5TW9kdWxlKCk7CiAgICAgQVNUUmVhZGVyOjpNb2R1bGVEZWNsSXRlcmF0b3IgTURJLCBNREU7Ci0gICAgbGx2bTo6dGllKE1ESSwgTURFKSA9IFJlYWRlci0+Z2V0TW9kdWxlRmlsZUxldmVsRGVjbHMoTW9kKTsKKyAgICBzdGQ6OnRpZShNREksIE1ERSkgPSBSZWFkZXItPmdldE1vZHVsZUZpbGVMZXZlbERlY2xzKE1vZCk7CiAgICAgZm9yICg7IE1ESSAhPSBNREU7ICsrTURJKSB7CiAgICAgICBpZiAoIUZuKGNvbnRleHQsICpNREkpKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yOTUzLDcgKzI4OTcsNyBAQAogCiAjZWxzZSAvLyBOREVCVUcKIAotQVNUVW5pdDo6Q29uY3VycmVuY3lTdGF0ZTo6Q29uY3VycmVuY3lTdGF0ZSgpIHt9CitBU1RVbml0OjpDb25jdXJyZW5jeVN0YXRlOjpDb25jdXJyZW5jeVN0YXRlKCkgeyBNdXRleCA9IDA7IH0KIEFTVFVuaXQ6OkNvbmN1cnJlbmN5U3RhdGU6On5Db25jdXJyZW5jeVN0YXRlKCkge30KIHZvaWQgQVNUVW5pdDo6Q29uY3VycmVuY3lTdGF0ZTo6c3RhcnQoKSB7fQogdm9pZCBBU1RVbml0OjpDb25jdXJyZW5jeVN0YXRlOjpmaW5pc2goKSB7fQpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0FuZHJvaWQubWsgYi9saWIvRnJvbnRlbmQvQW5kcm9pZC5tawppbmRleCAwODM5ZGVjLi5jM2M0MmMzIDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmQvQW5kcm9pZC5taworKysgYi9saWIvRnJvbnRlbmQvQW5kcm9pZC5tawpAQCAtOSw2ICs5LDcgQEAKICAgQXR0ckxpc3QuaW5jIFwKICAgQXR0cnMuaW5jIFwKICAgQXR0clBhcnNlZEF0dHJMaXN0LmluYyBcCisgIEF0dHJWaXNpdG9yLmluYyBcCiAgIENDMU9wdGlvbnMuaW5jIFwKICAgQ29tbWVudENvbW1hbmRMaXN0LmluYyBcCiAgIENvbW1lbnROb2Rlcy5pbmMgXApkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0NNYWtlTGlzdHMudHh0IGIvbGliL0Zyb250ZW5kL0NNYWtlTGlzdHMudHh0CmluZGV4IDA1NjZkNTQuLmYxYzc4OTcgMTAwNjQ0Ci0tLSBhL2xpYi9Gcm9udGVuZC9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvRnJvbnRlbmQvQ01ha2VMaXN0cy50eHQKQEAgLTEsMyArMSw4IEBACitzZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMKKyAgT3B0aW9uCisgIFN1cHBvcnQKKyAgKQorCiBhZGRfY2xhbmdfbGlicmFyeShjbGFuZ0Zyb250ZW5kCiAgIEFTVENvbnN1bWVycy5jcHAKICAgQVNUTWVyZ2UuY3BwCkBAIC0yOCwyNSArMzMsMTEgQEAKICAgVGV4dERpYWdub3N0aWNQcmludGVyLmNwcAogICBWZXJpZnlEaWFnbm9zdGljQ29uc3VtZXIuY3BwCiAgIFdhcm5pbmdzLmNwcAotICApCiAKLWFkZF9kZXBlbmRlbmNpZXMoY2xhbmdGcm9udGVuZAotICBDbGFuZ0F0dHJDbGFzc2VzCi0gIENsYW5nQXR0ckxpc3QKLSAgQ2xhbmdBdHRyUGFyc2VkQXR0ckxpc3QKLSAgQ2xhbmdDb21tZW50Tm9kZXMKLSAgQ2xhbmdEZWNsTm9kZXMKLSAgQ2xhbmdEaWFnbm9zdGljQVNUCi0gIENsYW5nRGlhZ25vc3RpY0NvbW1vbgotICBDbGFuZ0RpYWdub3N0aWNEcml2ZXIKLSAgQ2xhbmdEaWFnbm9zdGljRnJvbnRlbmQKLSAgQ2xhbmdEaWFnbm9zdGljTGV4Ci0gIENsYW5nRGlhZ25vc3RpY1NlbWEKKyAgREVQRU5EUwogICBDbGFuZ0RyaXZlck9wdGlvbnMKLSAgQ2xhbmdTdG10Tm9kZXMKLSAgKQogCi10YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmdGcm9udGVuZAorICBMSU5LX0xJQlMKICAgY2xhbmdBU1QKICAgY2xhbmdCYXNpYwogICBjbGFuZ0RyaXZlcgpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0NhY2hlVG9rZW5zLmNwcCBiL2xpYi9Gcm9udGVuZC9DYWNoZVRva2Vucy5jcHAKaW5kZXggMGMzMGIwNC4uMmNiNjU4MiAxMDA2NDQKLS0tIGEvbGliL0Zyb250ZW5kL0NhY2hlVG9rZW5zLmNwcAorKysgYi9saWIvRnJvbnRlbmQvQ2FjaGVUb2tlbnMuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3Nvci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW5TdHJlYW0uaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgpAQCAtNzgsMjEgKzc5LDIzIEBACiAgIHVuc2lnbmVkIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQpIEtpbmQ7IH0KIAogICB2b2lkIEVtaXREYXRhKHJhd19vc3RyZWFtJiBPdXQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+IExFKE91dCk7CiAgICAgc3dpdGNoIChLaW5kKSB7CiAgICAgY2FzZSBJc0ZFOiB7CiAgICAgICAvLyBFbWl0IHN0YXQgaW5mb3JtYXRpb24uCiAgICAgICBsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRCBVSUQgPSBGRS0+Z2V0VW5pcXVlSUQoKTsKLSAgICAgIDo6RW1pdDY0KE91dCwgVUlELmdldEZpbGUoKSk7Ci0gICAgICA6OkVtaXQ2NChPdXQsIFVJRC5nZXREZXZpY2UoKSk7Ci0gICAgICA6OkVtaXQ2NChPdXQsIEZFLT5nZXRNb2RpZmljYXRpb25UaW1lKCkpOwotICAgICAgOjpFbWl0NjQoT3V0LCBGRS0+Z2V0U2l6ZSgpKTsKKyAgICAgIExFLndyaXRlPHVpbnQ2NF90PihVSUQuZ2V0RmlsZSgpKTsKKyAgICAgIExFLndyaXRlPHVpbnQ2NF90PihVSUQuZ2V0RGV2aWNlKCkpOworICAgICAgTEUud3JpdGU8dWludDY0X3Q+KEZFLT5nZXRNb2RpZmljYXRpb25UaW1lKCkpOworICAgICAgTEUud3JpdGU8dWludDY0X3Q+KEZFLT5nZXRTaXplKCkpOwogICAgIH0gYnJlYWs7CiAgICAgY2FzZSBJc0RFOgogICAgICAgLy8gRW1pdCBzdGF0IGluZm9ybWF0aW9uLgotICAgICAgOjpFbWl0NjQoT3V0LCBEYXRhLT5VbmlxdWVJRC5nZXRGaWxlKCkpOwotICAgICAgOjpFbWl0NjQoT3V0LCBEYXRhLT5VbmlxdWVJRC5nZXREZXZpY2UoKSk7Ci0gICAgICA6OkVtaXQ2NChPdXQsIERhdGEtPk1vZFRpbWUpOwotICAgICAgOjpFbWl0NjQoT3V0LCBEYXRhLT5TaXplKTsKKyAgICAgIExFLndyaXRlPHVpbnQ2NF90PihEYXRhLT5VbmlxdWVJRC5nZXRGaWxlKCkpOworICAgICAgTEUud3JpdGU8dWludDY0X3Q+KERhdGEtPlVuaXF1ZUlELmdldERldmljZSgpKTsKKyAgICAgIExFLndyaXRlPHVpbnQ2NF90PihEYXRhLT5Nb2RUaW1lKTsKKyAgICAgIExFLndyaXRlPHVpbnQ2NF90PihEYXRhLT5TaXplKTsKICAgICAgIGRlbGV0ZSBEYXRhOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTEyMCwzMiArMTIzLDM2IEBACiAgIHN0YXRpYyBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+CiAgIEVtaXRLZXlEYXRhTGVuZ3RoKHJhd19vc3RyZWFtJiBPdXQsIFBUSEVudHJ5S2V5VmFyaWFudCBWLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBQVEhFbnRyeSYgRSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgIGVuZGlhbjo6V3JpdGVyPGxpdHRsZT4gTEUoT3V0KTsKIAogICAgIHVuc2lnbmVkIG4gPSBWLmdldFN0cmluZygpLnNpemUoKSArIDEgKyAxOwotICAgIDo6RW1pdDE2KE91dCwgbik7CisgICAgTEUud3JpdGU8dWludDE2X3Q+KG4pOwogCiAgICAgdW5zaWduZWQgbSA9IFYuZ2V0UmVwcmVzZW50YXRpb25MZW5ndGgoKSArIChWLmlzRmlsZSgpID8gNCArIDQgOiAwKTsKLSAgICA6OkVtaXQ4KE91dCwgbSk7CisgICAgTEUud3JpdGU8dWludDhfdD4obSk7CiAKICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIobiwgbSk7CiAgIH0KIAogICBzdGF0aWMgdm9pZCBFbWl0S2V5KHJhd19vc3RyZWFtJiBPdXQsIFBUSEVudHJ5S2V5VmFyaWFudCBWLCB1bnNpZ25lZCBuKXsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKICAgICAvLyBFbWl0IHRoZSBlbnRyeSBraW5kLgotICAgIDo6RW1pdDgoT3V0LCAodW5zaWduZWQpIFYuZ2V0S2luZCgpKTsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+KE91dCkud3JpdGU8dWludDhfdD4oKHVuc2lnbmVkKVYuZ2V0S2luZCgpKTsKICAgICAvLyBFbWl0IHRoZSBzdHJpbmcuCiAgICAgT3V0LndyaXRlKFYuZ2V0U3RyaW5nKCkuZGF0YSgpLCBuIC0gMSk7CiAgIH0KIAogICBzdGF0aWMgdm9pZCBFbWl0RGF0YShyYXdfb3N0cmVhbSYgT3V0LCBQVEhFbnRyeUtleVZhcmlhbnQgViwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFRIRW50cnkmIEUsIHVuc2lnbmVkKSB7Ci0KKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+IExFKE91dCk7CiAKICAgICAvLyBGb3IgZmlsZSBlbnRyaWVzIGVtaXQgdGhlIG9mZnNldHMgaW50byB0aGUgUFRIIGZpbGUgZm9yIHRva2VuIGRhdGEKICAgICAvLyBhbmQgdGhlIHByZXByb2Nlc3NvciBibG9ja3MgdGFibGUuCiAgICAgaWYgKFYuaXNGaWxlKCkpIHsKLSAgICAgIDo6RW1pdDMyKE91dCwgRS5nZXRUb2tlbk9mZnNldCgpKTsKLSAgICAgIDo6RW1pdDMyKE91dCwgRS5nZXRQUENvbmRUYWJsZU9mZnNldCgpKTsKKyAgICAgIExFLndyaXRlPHVpbnQzMl90PihFLmdldFRva2VuT2Zmc2V0KCkpOworICAgICAgTEUud3JpdGU8dWludDMyX3Q+KEUuZ2V0UFBDb25kVGFibGVPZmZzZXQoKSk7CiAgICAgfQogCiAgICAgLy8gRW1pdCBhbnkgb3RoZXIgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSAoaS5lLiwgc3RhdCBpbmZvcm1hdGlvbikuCkBAIC0xODYsMTggKzE5MywyOCBAQAogICAvLy8gRW1pdCBhIHRva2VuIHRvIHRoZSBQVEggZmlsZS4KICAgdm9pZCBFbWl0VG9rZW4oY29uc3QgVG9rZW4mIFQpOwogCi0gIHZvaWQgRW1pdDgodWludDMyX3QgVikgeyA6OkVtaXQ4KE91dCwgVik7IH0KKyAgdm9pZCBFbWl0OCh1aW50MzJfdCBWKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgZW5kaWFuOjpXcml0ZXI8bGl0dGxlPihPdXQpLndyaXRlPHVpbnQ4X3Q+KFYpOworICB9CiAKLSAgdm9pZCBFbWl0MTYodWludDMyX3QgVikgeyA6OkVtaXQxNihPdXQsIFYpOyB9CisgIHZvaWQgRW1pdDE2KHVpbnQzMl90IFYpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+KE91dCkud3JpdGU8dWludDE2X3Q+KFYpOworICB9CiAKLSAgdm9pZCBFbWl0MzIodWludDMyX3QgVikgeyA6OkVtaXQzMihPdXQsIFYpOyB9CisgIHZvaWQgRW1pdDMyKHVpbnQzMl90IFYpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+KE91dCkud3JpdGU8dWludDMyX3Q+KFYpOworICB9CiAKICAgdm9pZCBFbWl0QnVmKGNvbnN0IGNoYXIgKlB0ciwgdW5zaWduZWQgTnVtQnl0ZXMpIHsKICAgICBPdXQud3JpdGUoUHRyLCBOdW1CeXRlcyk7CiAgIH0KIAogICB2b2lkIEVtaXRTdHJpbmcoU3RyaW5nUmVmIFYpIHsKLSAgICA6OkVtaXQxNihPdXQsIFYuc2l6ZSgpKTsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+KE91dCkud3JpdGU8dWludDE2X3Q+KFYuc2l6ZSgpKTsKICAgICBFbWl0QnVmKFYuZGF0YSgpLCBWLnNpemUoKSk7CiAgIH0KIApAQCAtNTE2LDggKzUzMyw4IEBACiAgIH5TdGF0TGlzdGVuZXIoKSB7fQogCiAgIExvb2t1cFJlc3VsdCBnZXRTdGF0KGNvbnN0IGNoYXIgKlBhdGgsIEZpbGVEYXRhICZEYXRhLCBib29sIGlzRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ICpGaWxlRGVzY3JpcHRvcikgewotICAgIExvb2t1cFJlc3VsdCBSZXN1bHQgPSBzdGF0Q2hhaW5lZChQYXRoLCBEYXRhLCBpc0ZpbGUsIEZpbGVEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgdmZzOjpGaWxlICoqRiwgdmZzOjpGaWxlU3lzdGVtICZGUykgb3ZlcnJpZGUgeworICAgIExvb2t1cFJlc3VsdCBSZXN1bHQgPSBzdGF0Q2hhaW5lZChQYXRoLCBEYXRhLCBpc0ZpbGUsIEYsIEZTKTsKIAogICAgIGlmIChSZXN1bHQgPT0gQ2FjaGVNaXNzaW5nKSAvLyBGYWlsZWQgJ3N0YXQnLgogICAgICAgUE0uaW5zZXJ0KFBUSEVudHJ5S2V5VmFyaWFudChQYXRoKSwgUFRIRW50cnkoKSk7CkBAIC01ODQsOCArNjAxLDkgQEAKIAogICBzdGF0aWMgc3RkOjpwYWlyPHVuc2lnbmVkLHVuc2lnbmVkPgogICBFbWl0S2V5RGF0YUxlbmd0aChyYXdfb3N0cmVhbSYgT3V0LCBjb25zdCBQVEhJZEtleSoga2V5LCB1aW50MzJfdCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OwogICAgIHVuc2lnbmVkIG4gPSBrZXktPklJLT5nZXRMZW5ndGgoKSArIDE7Ci0gICAgOjpFbWl0MTYoT3V0LCBuKTsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+KE91dCkud3JpdGU8dWludDE2X3Q+KG4pOwogICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihuLCBzaXplb2YodWludDMyX3QpKTsKICAgfQogCkBAIC01OTgsNyArNjE2LDggQEAKIAogICBzdGF0aWMgdm9pZCBFbWl0RGF0YShyYXdfb3N0cmVhbSYgT3V0LCBQVEhJZEtleSosIHVpbnQzMl90IHBJRCwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQpIHsKLSAgICA6OkVtaXQzMihPdXQsIHBJRCk7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgZW5kaWFuOjpXcml0ZXI8bGl0dGxlPihPdXQpLndyaXRlPHVpbnQzMl90PihwSUQpOwogICB9CiB9OwogfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0NoYWluZWRJbmNsdWRlc1NvdXJjZS5jcHAgYi9saWIvRnJvbnRlbmQvQ2hhaW5lZEluY2x1ZGVzU291cmNlLmNwcAppbmRleCA0NDIxNzdlLi42NzQxMTYwIDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmQvQ2hhaW5lZEluY2x1ZGVzU291cmNlLmNwcAorKysgYi9saWIvRnJvbnRlbmQvQ2hhaW5lZEluY2x1ZGVzU291cmNlLmNwcApAQCAtMzEsNyArMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpzdHJpbmc+ICZidWZOYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIgKmRlc2VyaWFsTGlzdGVuZXIgPSAwKSB7CiAgIFByZXByb2Nlc3NvciAmUFAgPSBDSS5nZXRQcmVwcm9jZXNzb3IoKTsKLSAgT3duaW5nUHRyPEFTVFJlYWRlcj4gUmVhZGVyOworICBzdGQ6OnVuaXF1ZV9wdHI8QVNUUmVhZGVyPiBSZWFkZXI7CiAgIFJlYWRlci5yZXNldChuZXcgQVNUUmVhZGVyKFBQLCBDSS5nZXRBU1RDb250ZXh0KCksIC8qaXN5c3Jvb3Q9Ki8iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypEaXNhYmxlVmFsaWRhdGlvbj0qL3RydWUpKTsKICAgZm9yICh1bnNpZ25lZCB0aSA9IDA7IHRpIDwgYnVmTmFtZXMuc2l6ZSgpOyArK3RpKSB7CkBAIC00NCw3ICs0NCw3IEBACiAgIGNhc2UgQVNUUmVhZGVyOjpTdWNjZXNzOgogICAgIC8vIFNldCB0aGUgcHJlZGVmaW5lcyBidWZmZXIgYXMgc3VnZ2VzdGVkIGJ5IHRoZSBQQ0ggcmVhZGVyLgogICAgIFBQLnNldFByZWRlZmluZXMoUmVhZGVyLT5nZXRTdWdnZXN0ZWRQcmVkZWZpbmVzKCkpOwotICAgIHJldHVybiBSZWFkZXIudGFrZSgpOworICAgIHJldHVybiBSZWFkZXIucmVsZWFzZSgpOwogCiAgIGNhc2UgQVNUUmVhZGVyOjpGYWlsdXJlOgogICBjYXNlIEFTVFJlYWRlcjo6TWlzc2luZzoKQEAgLTYyLDEyICs2MiwxMyBAQAogICAgIGRlbGV0ZSBDSXNbaV07CiB9CiAKLUNoYWluZWRJbmNsdWRlc1NvdXJjZSAqQ2hhaW5lZEluY2x1ZGVzU291cmNlOjpjcmVhdGUoQ29tcGlsZXJJbnN0YW5jZSAmQ0kpIHsKK0ludHJ1c2l2ZVJlZkNudFB0cjxDaGFpbmVkSW5jbHVkZXNTb3VyY2U+CitDaGFpbmVkSW5jbHVkZXNTb3VyY2U6OmNyZWF0ZShDb21waWxlckluc3RhbmNlICZDSSkgewogCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmaW5jbHVkZXMgPSBDSS5nZXRQcmVwcm9jZXNzb3JPcHRzKCkuQ2hhaW5lZEluY2x1ZGVzOwogICBhc3NlcnQoIWluY2x1ZGVzLmVtcHR5KCkgJiYgIk5vICctY2hhaW4taW5jbHVkZScgaW4gb3B0aW9ucyEiKTsKIAotICBPd25pbmdQdHI8Q2hhaW5lZEluY2x1ZGVzU291cmNlPiBzb3VyY2UobmV3IENoYWluZWRJbmNsdWRlc1NvdXJjZSgpKTsKKyAgSW50cnVzaXZlUmVmQ250UHRyPENoYWluZWRJbmNsdWRlc1NvdXJjZT4gc291cmNlKG5ldyBDaGFpbmVkSW5jbHVkZXNTb3VyY2UoKSk7CiAgIElucHV0S2luZCBJSyA9IENJLmdldEZyb250ZW5kT3B0cygpLklucHV0c1swXS5nZXRLaW5kKCk7CiAKICAgU21hbGxWZWN0b3I8bGx2bTo6TWVtb3J5QnVmZmVyICosIDQ+IHNlcmlhbEJ1ZnM7CkBAIC03NSw3ICs3Niw3IEBACiAKICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGluY2x1ZGVzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKICAgICBib29sIGZpcnN0SW5jbHVkZSA9IChpID09IDApOwotICAgIE93bmluZ1B0cjxDb21waWxlckludm9jYXRpb24+IENJbnZvazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsZXJJbnZvY2F0aW9uPiBDSW52b2s7CiAgICAgQ0ludm9rLnJlc2V0KG5ldyBDb21waWxlckludm9jYXRpb24oQ0kuZ2V0SW52b2NhdGlvbigpKSk7CiAgICAgCiAgICAgQ0ludm9rLT5nZXRQcmVwcm9jZXNzb3JPcHRzKCkuQ2hhaW5lZEluY2x1ZGVzLmNsZWFyKCk7CkBAIC05NiwyNiArOTcsMjYgQEAKICAgICBJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY3NFbmdpbmU+IERpYWdzKAogICAgICAgICBuZXcgRGlhZ25vc3RpY3NFbmdpbmUoRGlhZ0lELCAmQ0kuZ2V0RGlhZ25vc3RpY09wdHMoKSwgRGlhZ0NsaWVudCkpOwogCi0gICAgT3duaW5nUHRyPENvbXBpbGVySW5zdGFuY2U+IENsYW5nKG5ldyBDb21waWxlckluc3RhbmNlKCkpOwotICAgIENsYW5nLT5zZXRJbnZvY2F0aW9uKENJbnZvay50YWtlKCkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21waWxlckluc3RhbmNlPiBDbGFuZyhuZXcgQ29tcGlsZXJJbnN0YW5jZSgpKTsKKyAgICBDbGFuZy0+c2V0SW52b2NhdGlvbihDSW52b2sucmVsZWFzZSgpKTsKICAgICBDbGFuZy0+c2V0RGlhZ25vc3RpY3MoRGlhZ3MuZ2V0UHRyKCkpOwogICAgIENsYW5nLT5zZXRUYXJnZXQoVGFyZ2V0SW5mbzo6Q3JlYXRlVGFyZ2V0SW5mbyhDbGFuZy0+Z2V0RGlhZ25vc3RpY3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsYW5nLT5nZXRUYXJnZXRPcHRzKCkpKTsKICAgICBDbGFuZy0+Y3JlYXRlRmlsZU1hbmFnZXIoKTsKICAgICBDbGFuZy0+Y3JlYXRlU291cmNlTWFuYWdlcihDbGFuZy0+Z2V0RmlsZU1hbmFnZXIoKSk7Ci0gICAgQ2xhbmctPmNyZWF0ZVByZXByb2Nlc3NvcigpOworICAgIENsYW5nLT5jcmVhdGVQcmVwcm9jZXNzb3IoVFVfUHJlZml4KTsKICAgICBDbGFuZy0+Z2V0RGlhZ25vc3RpY0NsaWVudCgpLkJlZ2luU291cmNlRmlsZShDbGFuZy0+Z2V0TGFuZ09wdHMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2xhbmctPmdldFByZXByb2Nlc3NvcigpKTsKICAgICBDbGFuZy0+Y3JlYXRlQVNUQ29udGV4dCgpOwogCiAgICAgU21hbGxWZWN0b3I8Y2hhciwgMjU2PiBzZXJpYWxBU1Q7CiAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhzZXJpYWxBU1QpOwotICAgIE93bmluZ1B0cjxBU1RDb25zdW1lcj4gY29uc3VtZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBjb25zdW1lcjsKICAgICBjb25zdW1lci5yZXNldChuZXcgUENIR2VuZXJhdG9yKENsYW5nLT5nZXRQcmVwcm9jZXNzb3IoKSwgIi0iLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc3lzcm9vdD0qLyIiLCAmT1MpKTsKICAgICBDbGFuZy0+Z2V0QVNUQ29udGV4dCgpLnNldEFTVE11dGF0aW9uTGlzdGVuZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyLT5HZXRBU1RNdXRhdGlvbkxpc3RlbmVyKCkpOwotICAgIENsYW5nLT5zZXRBU1RDb25zdW1lcihjb25zdW1lci50YWtlKCkpOworICAgIENsYW5nLT5zZXRBU1RDb25zdW1lcihjb25zdW1lci5yZWxlYXNlKCkpOwogICAgIENsYW5nLT5jcmVhdGVTZW1hKFRVX1ByZWZpeCwgMCk7CiAKICAgICBpZiAoZmlyc3RJbmNsdWRlKSB7CkBAIC0xMzcsMTMgKzEzOCwxMiBAQAogICAgICAgCiAgICAgICBzZXJpYWxCdWZOYW1lcy5wdXNoX2JhY2socGNoTmFtZSk7CiAKLSAgICAgIE93bmluZ1B0cjxFeHRlcm5hbEFTVFNvdXJjZT4gUmVhZGVyOwotCi0gICAgICBSZWFkZXIucmVzZXQoY3JlYXRlQVNUUmVhZGVyKCpDbGFuZywgcGNoTmFtZSwgYnVmcywgc2VyaWFsQnVmTmFtZXMsIAotICAgICAgICBDbGFuZy0+Z2V0QVNUQ29uc3VtZXIoKS5HZXRBU1REZXNlcmlhbGl6YXRpb25MaXN0ZW5lcigpKSk7CisgICAgICBJbnRydXNpdmVSZWZDbnRQdHI8QVNUUmVhZGVyPiBSZWFkZXI7CisgICAgICBSZWFkZXIgPSBjcmVhdGVBU1RSZWFkZXIoKkNsYW5nLCBwY2hOYW1lLCBidWZzLCBzZXJpYWxCdWZOYW1lcywgCisgICAgICAgIENsYW5nLT5nZXRBU1RDb25zdW1lcigpLkdldEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyKCkpOwogICAgICAgaWYgKCFSZWFkZXIpCiAgICAgICAgIHJldHVybiAwOwotICAgICAgQ2xhbmctPnNldE1vZHVsZU1hbmFnZXIoc3RhdGljX2Nhc3Q8QVNUUmVhZGVyKj4oUmVhZGVyLmdldCgpKSk7CisgICAgICBDbGFuZy0+c2V0TW9kdWxlTWFuYWdlcihSZWFkZXIpOwogICAgICAgQ2xhbmctPmdldEFTVENvbnRleHQoKS5zZXRFeHRlcm5hbFNvdXJjZShSZWFkZXIpOwogICAgIH0KICAgICAKQEAgLTE1NiwxOSArMTU2LDE5IEBACiAgICAgc2VyaWFsQnVmcy5wdXNoX2JhY2soCiAgICAgICBsbHZtOjpNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlckNvcHkoU3RyaW5nUmVmKHNlcmlhbEFTVC5kYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbEFTVC5zaXplKCkpKSk7Ci0gICAgc291cmNlLT5DSXMucHVzaF9iYWNrKENsYW5nLnRha2UoKSk7CisgICAgc291cmNlLT5DSXMucHVzaF9iYWNrKENsYW5nLnJlbGVhc2UoKSk7CiAgIH0KIAogICBhc3NlcnQoIXNlcmlhbEJ1ZnMuZW1wdHkoKSk7CiAgIHN0ZDo6c3RyaW5nIHBjaE5hbWUgPSBpbmNsdWRlcy5iYWNrKCkgKyAiLnBjaC1maW5hbCI7CiAgIHNlcmlhbEJ1Zk5hbWVzLnB1c2hfYmFjayhwY2hOYW1lKTsKLSAgT3duaW5nUHRyPEFTVFJlYWRlcj4gUmVhZGVyOwotICBSZWFkZXIucmVzZXQoY3JlYXRlQVNUUmVhZGVyKENJLCBwY2hOYW1lLCBzZXJpYWxCdWZzLCBzZXJpYWxCdWZOYW1lcykpOworICBJbnRydXNpdmVSZWZDbnRQdHI8QVNUUmVhZGVyPiBSZWFkZXI7CisgIFJlYWRlciA9IGNyZWF0ZUFTVFJlYWRlcihDSSwgcGNoTmFtZSwgc2VyaWFsQnVmcywgc2VyaWFsQnVmTmFtZXMpOwogICBpZiAoIVJlYWRlcikKICAgICByZXR1cm4gMDsKIAotICBzb3VyY2UtPkZpbmFsUmVhZGVyLnJlc2V0KFJlYWRlci50YWtlKCkpOwotICByZXR1cm4gc291cmNlLnRha2UoKTsKKyAgc291cmNlLT5GaW5hbFJlYWRlciA9IFJlYWRlcjsKKyAgcmV0dXJuIHNvdXJjZTsKIH0KIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KZGlmZiAtLWdpdCBhL2xpYi9Gcm9udGVuZC9Db21waWxlckluc3RhbmNlLmNwcCBiL2xpYi9Gcm9udGVuZC9Db21waWxlckluc3RhbmNlLmNwcAppbmRleCBlY2NiOTRjLi5jZTQ3Njc0IDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmQvQ29tcGlsZXJJbnN0YW5jZS5jcHAKKysrIGIvbGliL0Zyb250ZW5kL0NvbXBpbGVySW5zdGFuY2UuY3BwCkBAIC03OSw2ICs3OSwxMCBAQAogCiB2b2lkIENvbXBpbGVySW5zdGFuY2U6OnNldEZpbGVNYW5hZ2VyKEZpbGVNYW5hZ2VyICpWYWx1ZSkgewogICBGaWxlTWdyID0gVmFsdWU7CisgIGlmIChWYWx1ZSkKKyAgICBWaXJ0dWFsRmlsZVN5c3RlbSA9IFZhbHVlLT5nZXRWaXJ0dWFsRmlsZVN5c3RlbSgpOworICBlbHNlCisgICAgVmlydHVhbEZpbGVTeXN0ZW0ucmVzZXQoKTsKIH0KIAogdm9pZCBDb21waWxlckluc3RhbmNlOjpzZXRTb3VyY2VNYW5hZ2VyKFNvdXJjZU1hbmFnZXIgKlZhbHVlKSB7CkBAIC0xMDAsNiArMTA0LDEzIEBACiB2b2lkIENvbXBpbGVySW5zdGFuY2U6OnNldENvZGVDb21wbGV0aW9uQ29uc3VtZXIoQ29kZUNvbXBsZXRlQ29uc3VtZXIgKlZhbHVlKSB7CiAgIENvbXBsZXRpb25Db25zdW1lci5yZXNldChWYWx1ZSk7CiB9CisgCitJbnRydXNpdmVSZWZDbnRQdHI8QVNUUmVhZGVyPiBDb21waWxlckluc3RhbmNlOjpnZXRNb2R1bGVNYW5hZ2VyKCkgY29uc3QgeworICByZXR1cm4gTW9kdWxlTWFuYWdlcjsKK30KK3ZvaWQgQ29tcGlsZXJJbnN0YW5jZTo6c2V0TW9kdWxlTWFuYWdlcihJbnRydXNpdmVSZWZDbnRQdHI8QVNUUmVhZGVyPiBSZWFkZXIpIHsKKyAgTW9kdWxlTWFuYWdlciA9IFJlYWRlcjsKK30KIAogLy8gRGlhZ25vc3RpY3MKIHN0YXRpYyB2b2lkIFNldFVwRGlhZ25vc3RpY0xvZyhEaWFnbm9zdGljT3B0aW9ucyAqRGlhZ09wdHMsCkBAIC0xMTAsOSArMTIxLDkgQEAKICAgcmF3X29zdHJlYW0gKk9TID0gJmxsdm06OmVycnMoKTsKICAgaWYgKERpYWdPcHRzLT5EaWFnbm9zdGljTG9nRmlsZSAhPSAiLSIpIHsKICAgICAvLyBDcmVhdGUgdGhlIG91dHB1dCBzdHJlYW0uCi0gICAgbGx2bTo6cmF3X2ZkX29zdHJlYW0gKkZpbGVPUygKLSAgICAgICAgbmV3IGxsdm06OnJhd19mZF9vc3RyZWFtKERpYWdPcHRzLT5EaWFnbm9zdGljTG9nRmlsZS5jX3N0cigpLCBFcnJvckluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpzeXM6OmZzOjpGX0FwcGVuZCkpOworICAgIGxsdm06OnJhd19mZF9vc3RyZWFtICpGaWxlT1MobmV3IGxsdm06OnJhd19mZF9vc3RyZWFtKAorICAgICAgICBEaWFnT3B0cy0+RGlhZ25vc3RpY0xvZ0ZpbGUuY19zdHIoKSwgRXJyb3JJbmZvLAorICAgICAgICBsbHZtOjpzeXM6OmZzOjpGX0FwcGVuZCB8IGxsdm06OnN5czo6ZnM6OkZfVGV4dCkpOwogICAgIGlmICghRXJyb3JJbmZvLmVtcHR5KCkpIHsKICAgICAgIERpYWdzLlJlcG9ydChkaWFnOjp3YXJuX2ZlX2NjX2xvZ19kaWFnbm9zdGljc19mYWlsdXJlKQogICAgICAgICA8PCBEaWFnT3B0cy0+RGlhZ25vc3RpY0xvZ0ZpbGUgPDwgRXJyb3JJbmZvOwpAQCAtMTM2LDIwICsxNDcsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBPdXRwdXRGaWxlKSB7CiAgIHN0ZDo6c3RyaW5nIEVycm9ySW5mbzsKLSAgT3duaW5nUHRyPGxsdm06OnJhd19mZF9vc3RyZWFtPiBPUzsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06OnJhd19mZF9vc3RyZWFtPiBPUzsKICAgT1MucmVzZXQobmV3IGxsdm06OnJhd19mZF9vc3RyZWFtKE91dHB1dEZpbGUuc3RyKCkuY19zdHIoKSwgRXJyb3JJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6c3lzOjpmczo6Rl9CaW5hcnkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6OkZfTm9uZSkpOwogCiAgIGlmICghRXJyb3JJbmZvLmVtcHR5KCkpIHsKICAgICBEaWFncy5SZXBvcnQoZGlhZzo6d2Fybl9mZV9zZXJpYWxpemVkX2RpYWdfZmFpbHVyZSkKICAgICAgIDw8IE91dHB1dEZpbGUgPDwgRXJyb3JJbmZvOwogICAgIHJldHVybjsKICAgfQotICAKLSAgRGlhZ25vc3RpY0NvbnN1bWVyICpTZXJpYWxpemVkQ29uc3VtZXIgPQotICAgIGNsYW5nOjpzZXJpYWxpemVkX2RpYWdzOjpjcmVhdGUoT1MudGFrZSgpLCBEaWFnT3B0cyk7CiAKLSAgCisgIERpYWdub3N0aWNDb25zdW1lciAqU2VyaWFsaXplZENvbnN1bWVyID0KKyAgICAgIGNsYW5nOjpzZXJpYWxpemVkX2RpYWdzOjpjcmVhdGUoT1MucmVsZWFzZSgpLCBEaWFnT3B0cyk7CisKICAgRGlhZ3Muc2V0Q2xpZW50KG5ldyBDaGFpbmVkRGlhZ25vc3RpY0NvbnN1bWVyKERpYWdzLnRha2VDbGllbnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6ZWRDb25zdW1lcikpOwogfQpAQCAtMTk3LDcgKzIwNywxMSBAQAogLy8gRmlsZSBNYW5hZ2VyCiAKIHZvaWQgQ29tcGlsZXJJbnN0YW5jZTo6Y3JlYXRlRmlsZU1hbmFnZXIoKSB7Ci0gIEZpbGVNZ3IgPSBuZXcgRmlsZU1hbmFnZXIoZ2V0RmlsZVN5c3RlbU9wdHMoKSk7CisgIGlmICghaGFzVmlydHVhbEZpbGVTeXN0ZW0oKSkgeworICAgIC8vIFRPRE86IGNob29zZSB0aGUgdmlydHVhbCBmaWxlIHN5c3RlbSBiYXNlZCBvbiB0aGUgQ29tcGlsZXJJbnZvY2F0aW9uLgorICAgIHNldFZpcnR1YWxGaWxlU3lzdGVtKHZmczo6Z2V0UmVhbEZpbGVTeXN0ZW0oKSk7CisgIH0KKyAgRmlsZU1nciA9IG5ldyBGaWxlTWFuYWdlcihnZXRGaWxlU3lzdGVtT3B0cygpLCBWaXJ0dWFsRmlsZVN5c3RlbSk7CiB9CiAKIC8vIFNvdXJjZSBNYW5hZ2VyCkBAIC0yMDgsNyArMjIyLDcgQEAKIAogLy8gUHJlcHJvY2Vzc29yCiAKLXZvaWQgQ29tcGlsZXJJbnN0YW5jZTo6Y3JlYXRlUHJlcHJvY2Vzc29yKCkgewordm9pZCBDb21waWxlckluc3RhbmNlOjpjcmVhdGVQcmVwcm9jZXNzb3IoVHJhbnNsYXRpb25Vbml0S2luZCBUVUtpbmQpIHsKICAgY29uc3QgUHJlcHJvY2Vzc29yT3B0aW9ucyAmUFBPcHRzID0gZ2V0UHJlcHJvY2Vzc29yT3B0cygpOwogCiAgIC8vIENyZWF0ZSBhIFBUSCBtYW5hZ2VyIGlmIHdlIGFyZSB1c2luZyBzb21lIGZvcm0gb2YgYSB0b2tlbiBjYWNoZS4KQEAgLTIyNSw3ICsyMzksMTAgQEAKICAgUFAgPSBuZXcgUHJlcHJvY2Vzc29yKCZnZXRQcmVwcm9jZXNzb3JPcHRzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXREaWFnbm9zdGljcygpLCBnZXRMYW5nT3B0cygpLCAmZ2V0VGFyZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VNYW5hZ2VyKCksICpIZWFkZXJJbmZvLCAqdGhpcywgUFRITWdyLAotICAgICAgICAgICAgICAgICAgICAgICAgLypPd25zSGVhZGVyU2VhcmNoPSovdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKk93bnNIZWFkZXJTZWFyY2g9Ki90cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgLypEZWxheUluaXRpYWxpemF0aW9uPSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAvKkluY3JQcm9jZXNzaW5nPSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBUVUtpbmQpOwogCiAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0aGVuIHBhc3NpbmcgUFRITWdyIHRvIFByZXByb2Nlc3NvcidzIGN0b3IuCiAgIC8vIFRoYXQgYXJndW1lbnQgaXMgdXNlZCBhcyB0aGUgSWRlbnRpZmllckluZm9Mb29rdXAgYXJndW1lbnQgdG8KQEAgLTI1NCw3ICsyNzEsOCBAQAogICAvLyBIYW5kbGUgZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMsIGlmIHJlcXVlc3RlZC4KICAgY29uc3QgRGVwZW5kZW5jeU91dHB1dE9wdGlvbnMgJkRlcE9wdHMgPSBnZXREZXBlbmRlbmN5T3V0cHV0T3B0cygpOwogICBpZiAoIURlcE9wdHMuT3V0cHV0RmlsZS5lbXB0eSgpKQotICAgIEF0dGFjaERlcGVuZGVuY3lGaWxlR2VuKCpQUCwgRGVwT3B0cyk7CisgICAgVGhlRGVwZW5kZW5jeUZpbGVHZW5lcmF0b3IucmVzZXQoCisgICAgICAgIERlcGVuZGVuY3lGaWxlR2VuZXJhdG9yOjpDcmVhdGVBbmRBdHRhY2hUb1ByZXByb2Nlc3NvcigqUFAsIERlcE9wdHMpKTsKICAgaWYgKCFEZXBPcHRzLkRPVE91dHB1dEZpbGUuZW1wdHkoKSkKICAgICBBdHRhY2hEZXBlbmRlbmN5R3JhcGhHZW4oKlBQLCBEZXBPcHRzLkRPVE91dHB1dEZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEhlYWRlclNlYXJjaE9wdHMoKS5TeXNyb290KTsKQEAgLTI5MywxNiArMzExLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlzYWJsZVBDSFZhbGlkYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93UENIV2l0aENvbXBpbGVyRXJyb3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRlc2VyaWFsaXphdGlvbkxpc3RlbmVyKXsKLSAgT3duaW5nUHRyPEV4dGVybmFsQVNUU291cmNlPiBTb3VyY2U7CisgIEludHJ1c2l2ZVJlZkNudFB0cjxFeHRlcm5hbEFTVFNvdXJjZT4gU291cmNlOwogICBib29sIFByZWFtYmxlID0gZ2V0UHJlcHJvY2Vzc29yT3B0cygpLlByZWNvbXBpbGVkUHJlYW1ibGVCeXRlcy5maXJzdCAhPSAwOwotICBTb3VyY2UucmVzZXQoY3JlYXRlUENIRXh0ZXJuYWxBU1RTb3VyY2UoUGF0aCwgZ2V0SGVhZGVyU2VhcmNoT3B0cygpLlN5c3Jvb3QsCisgIFNvdXJjZSA9IGNyZWF0ZVBDSEV4dGVybmFsQVNUU291cmNlKFBhdGgsIGdldEhlYWRlclNlYXJjaE9wdHMoKS5TeXNyb290LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZVBDSFZhbGlkYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvd1BDSFdpdGhDb21waWxlckVycm9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByZXByb2Nlc3NvcigpLCBnZXRBU1RDb250ZXh0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNlcmlhbGl6YXRpb25MaXN0ZW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnJvbnRlbmRPcHRzKCkuVXNlR2xvYmFsTW9kdWxlSW5kZXgpKTsKLSAgTW9kdWxlTWFuYWdlciA9IHN0YXRpY19jYXN0PEFTVFJlYWRlcio+KFNvdXJjZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcm9udGVuZE9wdHMoKS5Vc2VHbG9iYWxNb2R1bGVJbmRleCk7CisgIE1vZHVsZU1hbmFnZXIgPSBzdGF0aWNfY2FzdDxBU1RSZWFkZXIqPihTb3VyY2UuZ2V0UHRyKCkpOwogICBnZXRBU1RDb250ZXh0KCkuc2V0RXh0ZXJuYWxTb3VyY2UoU291cmNlKTsKIH0KIApAQCAtMzE2LDExICszMzQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRlc2VyaWFsaXphdGlvbkxpc3RlbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcmVhbWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXNlR2xvYmFsTW9kdWxlSW5kZXgpIHsKLSAgT3duaW5nUHRyPEFTVFJlYWRlcj4gUmVhZGVyOworICBIZWFkZXJTZWFyY2hPcHRpb25zICZIU09wdHMgPSBQUC5nZXRIZWFkZXJTZWFyY2hJbmZvKCkuZ2V0SGVhZGVyU2VhcmNoT3B0cygpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RSZWFkZXI+IFJlYWRlcjsKICAgUmVhZGVyLnJlc2V0KG5ldyBBU1RSZWFkZXIoUFAsIENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3Jvb3QuZW1wdHkoKSA/ICIiIDogU3lzcm9vdC5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlUENIVmFsaWRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dQQ0hXaXRoQ29tcGlsZXJFcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQWxsb3dDb25maWd1cmF0aW9uTWlzbWF0Y2gqL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIU09wdHMuTW9kdWxlc1ZhbGlkYXRlU3lzdGVtSGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlR2xvYmFsTW9kdWxlSW5kZXgpKTsKIAogICBSZWFkZXItPnNldERlc2VyaWFsaXphdGlvbkxpc3RlbmVyKApAQCAtMzM0LDcgKzM1Niw3IEBACiAgICAgLy8gU2V0IHRoZSBwcmVkZWZpbmVzIGJ1ZmZlciBhcyBzdWdnZXN0ZWQgYnkgdGhlIFBDSCByZWFkZXIuIFR5cGljYWxseSwgdGhlCiAgICAgLy8gcHJlZGVmaW5lcyBidWZmZXIgd2lsbCBiZSBlbXB0eS4KICAgICBQUC5zZXRQcmVkZWZpbmVzKFJlYWRlci0+Z2V0U3VnZ2VzdGVkUHJlZGVmaW5lcygpKTsKLSAgICByZXR1cm4gUmVhZGVyLnRha2UoKTsKKyAgICByZXR1cm4gUmVhZGVyLnJlbGVhc2UoKTsKIAogICBjYXNlIEFTVFJlYWRlcjo6RmFpbHVyZToKICAgICAvLyBVbnJlY292ZXJhYmxlIGZhaWx1cmU6IGRvbid0IGV2ZW4gdHJ5IHRvIHByb2Nlc3MgdGhlIGlucHV0IGZpbGUuCkBAIC00MzIsOCArNDU0LDcgQEAKICAgICBkZWxldGUgaXQtPk9TOwogICAgIGlmICghaXQtPlRlbXBGaWxlbmFtZS5lbXB0eSgpKSB7CiAgICAgICBpZiAoRXJhc2VGaWxlcykgewotICAgICAgICBib29sIGV4aXN0ZWQ7Ci0gICAgICAgIGxsdm06OnN5czo6ZnM6OnJlbW92ZShpdC0+VGVtcEZpbGVuYW1lLCBleGlzdGVkKTsKKyAgICAgICAgbGx2bTo6c3lzOjpmczo6cmVtb3ZlKGl0LT5UZW1wRmlsZW5hbWUpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgU21hbGxTdHJpbmc8MTI4PiBOZXdPdXRGaWxlKGl0LT5GaWxlbmFtZSk7CiAKQEAgLTQ0NSw4ICs0NjYsNyBAQAogICAgICAgICAgIGdldERpYWdub3N0aWNzKCkuUmVwb3J0KGRpYWc6OmVycl91bmFibGVfdG9fcmVuYW1lX3RlbXApCiAgICAgICAgICAgICA8PCBpdC0+VGVtcEZpbGVuYW1lIDw8IGl0LT5GaWxlbmFtZSA8PCBlYy5tZXNzYWdlKCk7CiAKLSAgICAgICAgICBib29sIGV4aXN0ZWQ7Ci0gICAgICAgICAgbGx2bTo6c3lzOjpmczo6cmVtb3ZlKGl0LT5UZW1wRmlsZW5hbWUsIGV4aXN0ZWQpOworICAgICAgICAgIGxsdm06OnN5czo6ZnM6OnJlbW92ZShpdC0+VGVtcEZpbGVuYW1lKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0gZWxzZSBpZiAoIWl0LT5GaWxlbmFtZS5lbXB0eSgpICYmIEVyYXNlRmlsZXMpCkBAIC01MjEsNyArNTQxLDcgQEAKICAgICBPdXRGaWxlID0gIi0iOwogICB9CiAKLSAgT3duaW5nUHRyPGxsdm06OnJhd19mZF9vc3RyZWFtPiBPUzsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06OnJhd19mZF9vc3RyZWFtPiBPUzsKICAgc3RkOjpzdHJpbmcgT1NGaWxlOwogCiAgIGlmIChVc2VUZW1wb3JhcnkpIHsKQEAgLTU3NCw3ICs1OTQsNyBAQAogICAgIE9TRmlsZSA9IE91dEZpbGU7CiAgICAgT1MucmVzZXQobmV3IGxsdm06OnJhd19mZF9vc3RyZWFtKAogICAgICAgICBPU0ZpbGUuY19zdHIoKSwgRXJyb3IsCi0gICAgICAgIChCaW5hcnkgPyBsbHZtOjpzeXM6OmZzOjpGX0JpbmFyeSA6IGxsdm06OnN5czo6ZnM6OkZfTm9uZSkpKTsKKyAgICAgICAgKEJpbmFyeSA/IGxsdm06OnN5czo6ZnM6OkZfTm9uZSA6IGxsdm06OnN5czo6ZnM6OkZfVGV4dCkpKTsKICAgICBpZiAoIUVycm9yLmVtcHR5KCkpCiAgICAgICByZXR1cm4gMDsKICAgfQpAQCAtNTg4LDcgKzYwOCw3IEBACiAgIGlmIChUZW1wUGF0aE5hbWUpCiAgICAgKlRlbXBQYXRoTmFtZSA9IFRlbXBGaWxlOwogCi0gIHJldHVybiBPUy50YWtlKCk7CisgIHJldHVybiBPUy5yZWxlYXNlKCk7CiB9CiAKIC8vIEluaXRpYWxpemF0aW9uIFV0aWxpdGllcwpAQCAtNjQ0LDcgKzY2NCw3IEBACiAKICAgICBTb3VyY2VNZ3IuY3JlYXRlTWFpbkZpbGVJRChGaWxlLCBLaW5kKTsKICAgfSBlbHNlIHsKLSAgICBPd25pbmdQdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBTQjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBTQjsKICAgICBpZiAobGx2bTo6ZXJyb3JfY29kZSBlYyA9IGxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0U1RESU4oU0IpKSB7CiAgICAgICBEaWFncy5SZXBvcnQoZGlhZzo6ZXJyX2ZlX2Vycm9yX3JlYWRpbmdfc3RkaW4pIDw8IGVjLm1lc3NhZ2UoKTsKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTY1Miw3ICs2NzIsNyBAQAogICAgIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSA9IEZpbGVNZ3IuZ2V0VmlydHVhbEZpbGUoU0ItPmdldEJ1ZmZlcklkZW50aWZpZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCLT5nZXRCdWZmZXJTaXplKCksIDApOwogICAgIFNvdXJjZU1nci5jcmVhdGVNYWluRmlsZUlEKEZpbGUsIEtpbmQpOwotICAgIFNvdXJjZU1nci5vdmVycmlkZUZpbGVDb250ZW50cyhGaWxlLCBTQi50YWtlKCkpOworICAgIFNvdXJjZU1nci5vdmVycmlkZUZpbGVDb250ZW50cyhGaWxlLCBTQi5yZWxlYXNlKCkpOwogICB9CiAKICAgYXNzZXJ0KCFTb3VyY2VNZ3IuZ2V0TWFpbkZpbGVJRCgpLmlzSW52YWxpZCgpICYmCkBAIC03NDgsMzggKzc2OCw2IEBACiAgIHJldHVybiBMYW5nT3B0cy5DUGx1c1BsdXM/IElLX0NYWCA6IElLX0M7CiB9CiAKLW5hbWVzcGFjZSB7Ci0gIHN0cnVjdCBDb21waWxlTW9kdWxlTWFwRGF0YSB7Ci0gICAgQ29tcGlsZXJJbnN0YW5jZSAmSW5zdGFuY2U7Ci0gICAgR2VuZXJhdGVNb2R1bGVBY3Rpb24gJkNyZWF0ZU1vZHVsZUFjdGlvbjsKLSAgfTsKLX0KLQotLy8vIFxicmllZiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBleGVjdXRlcyB0aGUgbW9kdWxlLWdlbmVyYXRpbmcgYWN0aW9uIHVuZGVyCi0vLy8gYSBjcmFzaCByZWNvdmVyeSBjb250ZXh0Lgotc3RhdGljIHZvaWQgZG9Db21waWxlTWFwTW9kdWxlKHZvaWQgKlVzZXJEYXRhKSB7Ci0gIENvbXBpbGVNb2R1bGVNYXBEYXRhICZEYXRhCi0gICAgPSAqcmVpbnRlcnByZXRfY2FzdDxDb21waWxlTW9kdWxlTWFwRGF0YSAqPihVc2VyRGF0YSk7Ci0gIERhdGEuSW5zdGFuY2UuRXhlY3V0ZUFjdGlvbihEYXRhLkNyZWF0ZU1vZHVsZUFjdGlvbik7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0gIC8vLyBcYnJpZWYgRnVuY3Rpb24gb2JqZWN0IHRoYXQgY2hlY2tzIHdpdGggdGhlIGdpdmVuIG1hY3JvIGRlZmluaXRpb24gc2hvdWxkCi0gIC8vLyBiZSByZW1vdmVkLCBiZWNhdXNlIGl0IGlzIG9uZSBvZiB0aGUgaWdub3JlZCBtYWNyb3MuCi0gIGNsYXNzIFJlbW92ZUlnbm9yZWRNYWNybyB7Ci0gICAgY29uc3QgSGVhZGVyU2VhcmNoT3B0aW9ucyAmSFNPcHRzOwotCi0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBSZW1vdmVJZ25vcmVkTWFjcm8oY29uc3QgSGVhZGVyU2VhcmNoT3B0aW9ucyAmSFNPcHRzKQotICAgICAgOiBIU09wdHMoSFNPcHRzKSB7IH0KLQotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGJvb2w+ICZkZWYpIGNvbnN0IHsKLSAgICAgIFN0cmluZ1JlZiBNYWNyb0RlZiA9IGRlZi5maXJzdDsKLSAgICAgIHJldHVybiBIU09wdHMuTW9kdWxlc0lnbm9yZU1hY3Jvcy5jb3VudChNYWNyb0RlZi5zcGxpdCgnPScpLmZpcnN0KSA+IDA7Ci0gICAgfQotICB9OwotfQotCiAvLy8gXGJyaWVmIENvbXBpbGUgYSBtb2R1bGUgZmlsZSBmb3IgdGhlIGdpdmVuIG1vZHVsZSwgdXNpbmcgdGhlIG9wdGlvbnMgCiAvLy8gcHJvdmlkZWQgYnkgdGhlIGltcG9ydGluZyBjb21waWxlciBpbnN0YW5jZS4KIHN0YXRpYyB2b2lkIGNvbXBpbGVNb2R1bGUoQ29tcGlsZXJJbnN0YW5jZSAmSW1wb3J0aW5nSW5zdGFuY2UsCkBAIC04MjQsMTAgKzgxMiwxMyBAQAogICAvLyBSZW1vdmUgYW55IG1hY3JvIGRlZmluaXRpb25zIHRoYXQgYXJlIGV4cGxpY2l0bHkgaWdub3JlZCBieSB0aGUgbW9kdWxlLgogICAvLyBUaGV5IGFyZW4ndCBzdXBwb3NlZCB0byBhZmZlY3QgaG93IHRoZSBtb2R1bGUgaXMgYnVpbHQgYW55d2F5LgogICBjb25zdCBIZWFkZXJTZWFyY2hPcHRpb25zICZIU09wdHMgPSBJbnZvY2F0aW9uLT5nZXRIZWFkZXJTZWFyY2hPcHRzKCk7Ci0gIFBQT3B0cy5NYWNyb3MuZXJhc2Uoc3RkOjpyZW1vdmVfaWYoUFBPcHRzLk1hY3Jvcy5iZWdpbigpLCBQUE9wdHMuTWFjcm9zLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZUlnbm9yZWRNYWNybyhIU09wdHMpKSwKLSAgICAgICAgICAgICAgICAgICAgICBQUE9wdHMuTWFjcm9zLmVuZCgpKTsKLQorICBQUE9wdHMuTWFjcm9zLmVyYXNlKAorICAgICAgc3RkOjpyZW1vdmVfaWYoUFBPcHRzLk1hY3Jvcy5iZWdpbigpLCBQUE9wdHMuTWFjcm9zLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgWyZIU09wdHNdKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgYm9vbD4gJmRlZikgeworICAgICAgICBTdHJpbmdSZWYgTWFjcm9EZWYgPSBkZWYuZmlyc3Q7CisgICAgICAgIHJldHVybiBIU09wdHMuTW9kdWxlc0lnbm9yZU1hY3Jvcy5jb3VudChNYWNyb0RlZi5zcGxpdCgnPScpLmZpcnN0KSA+IDA7CisgICAgICB9KSwKKyAgICAgIFBQT3B0cy5NYWNyb3MuZW5kKCkpOwogCiAgIC8vIE5vdGUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3ZSdyZSBidWlsZGluZy4KICAgSW52b2NhdGlvbi0+Z2V0TGFuZ09wdHMoKS0+Q3VycmVudE1vZHVsZSA9IE1vZHVsZS0+Z2V0VG9wTGV2ZWxNb2R1bGVOYW1lKCk7CkBAIC04NjcsOSArODU4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydGluZ0luc3RhbmNlLmdldERpYWdub3N0aWNDbGllbnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qU2hvdWxkT3duQ2xpZW50PSovdHJ1ZSk7CiAKKyAgSW5zdGFuY2Uuc2V0VmlydHVhbEZpbGVTeXN0ZW0oJkltcG9ydGluZ0luc3RhbmNlLmdldFZpcnR1YWxGaWxlU3lzdGVtKCkpOworCiAgIC8vIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBtb2R1bGUgYnVpbGQgc3RhY2ssIHNvIHRoYXQgd2UKICAgLy8gY2FuIGRldGVjdCBjeWNsZXMgaW4gdGhlIG1vZHVsZSBncmFwaC4KLSAgSW5zdGFuY2UuY3JlYXRlRmlsZU1hbmFnZXIoKTsgLy8gRklYTUU6IEFkb3B0IGZpbGUgbWFuYWdlciBmcm9tIGltcG9ydGVyPworICBJbnN0YW5jZS5zZXRGaWxlTWFuYWdlcigmSW1wb3J0aW5nSW5zdGFuY2UuZ2V0RmlsZU1hbmFnZXIoKSk7CiAgIEluc3RhbmNlLmNyZWF0ZVNvdXJjZU1hbmFnZXIoSW5zdGFuY2UuZ2V0RmlsZU1hbmFnZXIoKSk7CiAgIFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1nciA9IEluc3RhbmNlLmdldFNvdXJjZU1hbmFnZXIoKTsKICAgU291cmNlTWdyLnNldE1vZHVsZUJ1aWxkU3RhY2soCkBAIC05MDUsMTAgKzg5OCw5IEBACiAgIC8vIHRocmVhZCBzbyB0aGF0IHdlIGdldCBhIHN0YWNrIGxhcmdlIGVub3VnaC4KICAgY29uc3QgdW5zaWduZWQgVGhyZWFkU3RhY2tTaXplID0gOCA8PCAyMDsKICAgbGx2bTo6Q3Jhc2hSZWNvdmVyeUNvbnRleHQgQ1JDOwotICBDb21waWxlTW9kdWxlTWFwRGF0YSBEYXRhID0geyBJbnN0YW5jZSwgQ3JlYXRlTW9kdWxlQWN0aW9uIH07Ci0gIENSQy5SdW5TYWZlbHlPblRocmVhZCgmZG9Db21waWxlTWFwTW9kdWxlLCAmRGF0YSwgVGhyZWFkU3RhY2tTaXplKTsKKyAgQ1JDLlJ1blNhZmVseU9uVGhyZWFkKFsmXSgpIHsgSW5zdGFuY2UuRXhlY3V0ZUFjdGlvbihDcmVhdGVNb2R1bGVBY3Rpb24pOyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkU3RhY2tTaXplKTsKIAotICAKICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgbW9kdWxlIG1hcCBmaWxlLgogICAvLyBGSVhNRTogRXZlbiB0aG91Z2ggd2UncmUgZXhlY3V0aW5nIHVuZGVyIGNyYXNoIHByb3RlY3Rpb24sIGl0IHdvdWxkIHN0aWxsCiAgIC8vIGJlIG5pY2UgdG8gZG8gdGhpcyB3aXRoIFJlbW92ZUZpbGVPblNpZ25hbCB3aGVuIHdlIGNhbi4gSG93ZXZlciwgdGhhdApAQCAtMTAxMiw3ICsxMDA0LDcgQEAKIHN0YXRpYyB2b2lkIHdyaXRlVGltZXN0YW1wRmlsZShTdHJpbmdSZWYgVGltZXN0YW1wRmlsZSkgewogICBzdGQ6OnN0cmluZyBFcnJvckluZm87CiAgIGxsdm06OnJhd19mZF9vc3RyZWFtIE91dChUaW1lc3RhbXBGaWxlLnN0cigpLmNfc3RyKCksIEVycm9ySW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6OkZfQmluYXJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6OkZfTm9uZSk7CiB9CiAKIC8vLyBcYnJpZWYgUHJ1bmUgdGhlIG1vZHVsZSBjYWNoZSBvZiBtb2R1bGVzIHRoYXQgaGF2ZW4ndCBiZWVuIGFjY2Vzc2VkIGluCkBAIC0xMDU3LDQ0ICsxMDQ5LDM5IEBACiAgICAgICBjb250aW51ZTsKIAogICAgIC8vIFdhbGsgYWxsIG9mIHRoZSBmaWxlcyB3aXRoaW4gdGhpcyBkaXJlY3RvcnkuCi0gICAgYm9vbCBSZW1vdmVkQWxsRmlsZXMgPSB0cnVlOwogICAgIGZvciAobGx2bTo6c3lzOjpmczo6ZGlyZWN0b3J5X2l0ZXJhdG9yIEZpbGUoRGlyLT5wYXRoKCksIEVDKSwgRmlsZUVuZDsKICAgICAgICAgIEZpbGUgIT0gRmlsZUVuZCAmJiAhRUM7IEZpbGUuaW5jcmVtZW50KEVDKSkgewogICAgICAgLy8gV2Ugb25seSBjYXJlIGFib3V0IG1vZHVsZSBhbmQgZ2xvYmFsIG1vZHVsZSBpbmRleCBmaWxlcy4KLSAgICAgIGlmIChsbHZtOjpzeXM6OnBhdGg6OmV4dGVuc2lvbihGaWxlLT5wYXRoKCkpICE9ICIucGNtIiAmJgotICAgICAgICAgIGxsdm06OnN5czo6cGF0aDo6ZmlsZW5hbWUoRmlsZS0+cGF0aCgpKSAhPSAibW9kdWxlcy5pZHgiKSB7Ci0gICAgICAgIFJlbW92ZWRBbGxGaWxlcyA9IGZhbHNlOworICAgICAgU3RyaW5nUmVmIEV4dGVuc2lvbiA9IGxsdm06OnN5czo6cGF0aDo6ZXh0ZW5zaW9uKEZpbGUtPnBhdGgoKSk7CisgICAgICBpZiAoRXh0ZW5zaW9uICE9ICIucGNtIiAmJiBFeHRlbnNpb24gIT0gIi50aW1lc3RhbXAiICYmCisgICAgICAgICAgbGx2bTo6c3lzOjpwYXRoOjpmaWxlbmFtZShGaWxlLT5wYXRoKCkpICE9ICJtb2R1bGVzLmlkeCIpCiAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQogCiAgICAgICAvLyBMb29rIGF0IHRoaXMgZmlsZS4gSWYgd2UgY2FuJ3Qgc3RhdCBpdCwgdGhlcmUncyBub3RoaW5nIGludGVyZXN0aW5nCiAgICAgICAvLyB0aGVyZS4KLSAgICAgIGlmICg6OnN0YXQoRmlsZS0+cGF0aCgpLmNfc3RyKCksICZTdGF0QnVmKSkgewotICAgICAgICBSZW1vdmVkQWxsRmlsZXMgPSBmYWxzZTsKKyAgICAgIGlmICg6OnN0YXQoRmlsZS0+cGF0aCgpLmNfc3RyKCksICZTdGF0QnVmKSkKICAgICAgICAgY29udGludWU7Ci0gICAgICB9CiAKICAgICAgIC8vIElmIHRoZSBmaWxlIGhhcyBiZWVuIHVzZWQgcmVjZW50bHkgZW5vdWdoLCBsZWF2ZSBpdCB0aGVyZS4KICAgICAgIHRpbWVfdCBGaWxlQWNjZXNzVGltZSA9IFN0YXRCdWYuc3RfYXRpbWU7CiAgICAgICBpZiAoQ3VycmVudFRpbWUgLSBGaWxlQWNjZXNzVGltZSA8PQogICAgICAgICAgICAgICB0aW1lX3QoSFNPcHRzLk1vZHVsZUNhY2hlUHJ1bmVBZnRlcikpIHsKLSAgICAgICAgUmVtb3ZlZEFsbEZpbGVzID0gZmFsc2U7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogCiAgICAgICAvLyBSZW1vdmUgdGhlIGZpbGUuCi0gICAgICBib29sIEV4aXN0ZWQ7Ci0gICAgICBpZiAobGx2bTo6c3lzOjpmczo6cmVtb3ZlKEZpbGUtPnBhdGgoKSwgRXhpc3RlZCkgfHwgIUV4aXN0ZWQpIHsKLSAgICAgICAgUmVtb3ZlZEFsbEZpbGVzID0gZmFsc2U7Ci0gICAgICB9CisgICAgICBsbHZtOjpzeXM6OmZzOjpyZW1vdmUoRmlsZS0+cGF0aCgpKTsKKworICAgICAgLy8gUmVtb3ZlIHRoZSB0aW1lc3RhbXAgZmlsZS4KKyAgICAgIHN0ZDo6c3RyaW5nIFRpbXBlc3RhbXBGaWxlbmFtZSA9IEZpbGUtPnBhdGgoKSArICIudGltZXN0YW1wIjsKKyAgICAgIGxsdm06OnN5czo6ZnM6OnJlbW92ZShUaW1wZXN0YW1wRmlsZW5hbWUpOwogICAgIH0KIAogICAgIC8vIElmIHdlIHJlbW92ZWQgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5LCByZW1vdmUgdGhlIGRpcmVjdG9yeQogICAgIC8vIGl0c2VsZi4KLSAgICBpZiAoUmVtb3ZlZEFsbEZpbGVzKSB7Ci0gICAgICBib29sIEV4aXN0ZWQ7Ci0gICAgICBsbHZtOjpzeXM6OmZzOjpyZW1vdmUoRGlyLT5wYXRoKCksIEV4aXN0ZWQpOwotICAgIH0KKyAgICBpZiAobGx2bTo6c3lzOjpmczo6ZGlyZWN0b3J5X2l0ZXJhdG9yKERpci0+cGF0aCgpLCBFQykgPT0KKyAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6OmRpcmVjdG9yeV9pdGVyYXRvcigpICYmICFFQykKKyAgICAgIGxsdm06OnN5czo6ZnM6OnJlbW92ZShEaXItPnBhdGgoKSk7CiAgIH0KIH0KIApAQCAtMTEzMywxMSArMTEyMCwxNSBAQAogICB9IGVsc2UgewogICAgIC8vIFNlYXJjaCBmb3IgYSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KICAgICBNb2R1bGUgPSBQUC0+Z2V0SGVhZGVyU2VhcmNoSW5mbygpLmxvb2t1cE1vZHVsZShNb2R1bGVOYW1lKTsKLSAgICBzdGQ6OnN0cmluZyBNb2R1bGVGaWxlTmFtZTsKLSAgICBpZiAoTW9kdWxlKSB7Ci0gICAgICBNb2R1bGVGaWxlTmFtZSA9IFBQLT5nZXRIZWFkZXJTZWFyY2hJbmZvKCkuZ2V0TW9kdWxlRmlsZU5hbWUoTW9kdWxlKTsKLSAgICB9IGVsc2UKLSAgICAgIE1vZHVsZUZpbGVOYW1lID0gUFAtPmdldEhlYWRlclNlYXJjaEluZm8oKS5nZXRNb2R1bGVGaWxlTmFtZShNb2R1bGVOYW1lKTsKKyAgICBpZiAoIU1vZHVsZSkgeworICAgICAgZ2V0RGlhZ25vc3RpY3MoKS5SZXBvcnQoTW9kdWxlTmFtZUxvYywgZGlhZzo6ZXJyX21vZHVsZV9ub3RfZm91bmQpCisgICAgICA8PCBNb2R1bGVOYW1lCisgICAgICA8PCBTb3VyY2VSYW5nZShJbXBvcnRMb2MsIE1vZHVsZU5hbWVMb2MpOworICAgICAgTW9kdWxlQnVpbGRGYWlsZWQgPSB0cnVlOworICAgICAgcmV0dXJuIE1vZHVsZUxvYWRSZXN1bHQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBNb2R1bGVGaWxlTmFtZSA9IFBQLT5nZXRIZWFkZXJTZWFyY2hJbmZvKCkuZ2V0TW9kdWxlRmlsZU5hbWUoTW9kdWxlKTsKIAogICAgIC8vIElmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhbiBBU1RSZWFkZXIsIGNyZWF0ZSBvbmUgbm93LgogICAgIGlmICghTW9kdWxlTWFuYWdlcikgewpAQCAtMTE1MiwxMiArMTE0MywxNSBAQAogICAgICAgICBwcnVuZU1vZHVsZUNhY2hlKGdldEhlYWRlclNlYXJjaE9wdHMoKSk7CiAgICAgICB9CiAKLSAgICAgIHN0ZDo6c3RyaW5nIFN5c3Jvb3QgPSBnZXRIZWFkZXJTZWFyY2hPcHRzKCkuU3lzcm9vdDsKKyAgICAgIEhlYWRlclNlYXJjaE9wdGlvbnMgJkhTT3B0cyA9IGdldEhlYWRlclNlYXJjaE9wdHMoKTsKKyAgICAgIHN0ZDo6c3RyaW5nIFN5c3Jvb3QgPSBIU09wdHMuU3lzcm9vdDsKICAgICAgIGNvbnN0IFByZXByb2Nlc3Nvck9wdGlvbnMgJlBQT3B0cyA9IGdldFByZXByb2Nlc3Nvck9wdHMoKTsKICAgICAgIE1vZHVsZU1hbmFnZXIgPSBuZXcgQVNUUmVhZGVyKGdldFByZXByb2Nlc3NvcigpLCAqQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3Jvb3QuZW1wdHkoKSA/ICIiIDogU3lzcm9vdC5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBPcHRzLkRpc2FibGVQQ0hWYWxpZGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypBbGxvd0FTVFdpdGhDb21waWxlckVycm9ycz0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypBbGxvd0NvbmZpZ3VyYXRpb25NaXNtYXRjaD0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFNPcHRzLk1vZHVsZXNWYWxpZGF0ZVN5c3RlbUhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcm9udGVuZE9wdHMoKS5Vc2VHbG9iYWxNb2R1bGVJbmRleCk7CiAgICAgICBpZiAoaGFzQVNUQ29uc3VtZXIoKSkgewogICAgICAgICBNb2R1bGVNYW5hZ2VyLT5zZXREZXNlcmlhbGl6YXRpb25MaXN0ZW5lcigKQEAgLTExNjUsMTUgKzExNTksMTYgQEAKICAgICAgICAgZ2V0QVNUQ29udGV4dCgpLnNldEFTVE11dGF0aW9uTGlzdGVuZXIoCiAgICAgICAgICAgZ2V0QVNUQ29uc3VtZXIoKS5HZXRBU1RNdXRhdGlvbkxpc3RlbmVyKCkpOwogICAgICAgfQotICAgICAgT3duaW5nUHRyPEV4dGVybmFsQVNUU291cmNlPiBTb3VyY2U7Ci0gICAgICBTb3VyY2UucmVzZXQoTW9kdWxlTWFuYWdlcik7Ci0gICAgICBnZXRBU1RDb250ZXh0KCkuc2V0RXh0ZXJuYWxTb3VyY2UoU291cmNlKTsKKyAgICAgIGdldEFTVENvbnRleHQoKS5zZXRFeHRlcm5hbFNvdXJjZShNb2R1bGVNYW5hZ2VyKTsKICAgICAgIGlmIChoYXNTZW1hKCkpCiAgICAgICAgIE1vZHVsZU1hbmFnZXItPkluaXRpYWxpemVTZW1hKGdldFNlbWEoKSk7CiAgICAgICBpZiAoaGFzQVNUQ29uc3VtZXIoKSkKICAgICAgICAgTW9kdWxlTWFuYWdlci0+U3RhcnRUcmFuc2xhdGlvblVuaXQoJmdldEFTVENvbnN1bWVyKCkpOwogICAgIH0KIAorICAgIGlmIChUaGVEZXBlbmRlbmN5RmlsZUdlbmVyYXRvcikKKyAgICAgIFRoZURlcGVuZGVuY3lGaWxlR2VuZXJhdG9yLT5BdHRhY2hUb0FTVFJlYWRlcigqTW9kdWxlTWFuYWdlcik7CisKICAgICAvLyBUcnkgdG8gbG9hZCB0aGUgbW9kdWxlIGZpbGUuCiAgICAgdW5zaWduZWQgQVJSRmxhZ3MgPSBBU1RSZWFkZXI6OkFSUl9PdXRPZkRhdGUgfCBBU1RSZWFkZXI6OkFSUl9NaXNzaW5nOwogICAgIHN3aXRjaCAoTW9kdWxlTWFuYWdlci0+UmVhZEFTVChNb2R1bGVGaWxlTmFtZSwgc2VyaWFsaXphdGlvbjo6TUtfTW9kdWxlLApAQCAtMTE4NCwxNyArMTE3OSw3IEBACiAgICAgY2FzZSBBU1RSZWFkZXI6Ok91dE9mRGF0ZToKICAgICBjYXNlIEFTVFJlYWRlcjo6TWlzc2luZzogewogICAgICAgLy8gVGhlIG1vZHVsZSBmaWxlIGlzIG1pc3Npbmcgb3Igb3V0LW9mLWRhdGUuIEJ1aWxkIGl0LgotCi0gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgbW9kdWxlLCB3ZSBkb24ndCBrbm93IGhvdyB0byBidWlsZCB0aGUgbW9kdWxlIGZpbGUuCi0gICAgICAvLyBDb21wbGFpbiBhbmQgcmV0dXJuLgotICAgICAgaWYgKCFNb2R1bGUpIHsKLSAgICAgICAgZ2V0RGlhZ25vc3RpY3MoKS5SZXBvcnQoTW9kdWxlTmFtZUxvYywgZGlhZzo6ZXJyX21vZHVsZV9ub3RfZm91bmQpCi0gICAgICAgICAgPDwgTW9kdWxlTmFtZQotICAgICAgICAgIDw8IFNvdXJjZVJhbmdlKEltcG9ydExvYywgTW9kdWxlTmFtZUxvYyk7Ci0gICAgICAgIE1vZHVsZUJ1aWxkRmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIE1vZHVsZUxvYWRSZXN1bHQoKTsKLSAgICAgIH0KLQorICAgICAgYXNzZXJ0KE1vZHVsZSAmJiAibWlzc2luZyBtb2R1bGUgZmlsZSIpOwogICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIGN5Y2xlIGluIHRoZSBtb2R1bGUgZ3JhcGguCiAgICAgICBNb2R1bGVCdWlsZFN0YWNrIE1vZFBhdGggPSBnZXRTb3VyY2VNYW5hZ2VyKCkuZ2V0TW9kdWxlQnVpbGRTdGFjaygpOwogICAgICAgTW9kdWxlQnVpbGRTdGFjazo6aXRlcmF0b3IgUG9zID0gTW9kUGF0aC5iZWdpbigpLCBQb3NFbmQgPSBNb2RQYXRoLmVuZCgpOwpAQCAtMTI3MSwxMyArMTI1Niw2IEBACiAgICAgICBNb2R1bGVCdWlsZEZhaWxlZCA9IHRydWU7CiAgICAgICByZXR1cm4gTW9kdWxlTG9hZFJlc3VsdCgpOwogICAgIH0KLSAgICAKLSAgICBpZiAoIU1vZHVsZSkgewotICAgICAgLy8gSWYgd2UgbG9hZGVkIHRoZSBtb2R1bGUgZGlyZWN0bHksIHdpdGhvdXQgZmluZGluZyBhIG1vZHVsZSBtYXAgZmlyc3QsCi0gICAgICAvLyB3ZSdsbCBoYXZlIGxvYWRlZCB0aGUgbW9kdWxlJ3MgaW5mb3JtYXRpb24gZnJvbSB0aGUgbW9kdWxlIGl0c2VsZi4KLSAgICAgIE1vZHVsZSA9IFBQLT5nZXRIZWFkZXJTZWFyY2hJbmZvKCkuZ2V0TW9kdWxlTWFwKCkKLSAgICAgICAgICAgICAgICAgLmZpbmRNb2R1bGUoKFBhdGhbMF0uZmlyc3QtPmdldE5hbWUoKSkpOwotICAgIH0KIAogICAgIC8vIENhY2hlIHRoZSByZXN1bHQgb2YgdGhpcyB0b3AtbGV2ZWwgbW9kdWxlIGxvb2t1cCBmb3IgbGF0ZXIuCiAgICAgS25vd24gPSBLbm93bk1vZHVsZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFBhdGhbMF0uZmlyc3QsIE1vZHVsZSkpLmZpcnN0OwpAQCAtMTM2MCwxMSArMTMzOCwxOSBAQAogCiAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIG1vZHVsZSBpcyBhdmFpbGFibGUuCiAgICAgY2xhbmc6Ok1vZHVsZTo6UmVxdWlyZW1lbnQgUmVxdWlyZW1lbnQ7Ci0gICAgaWYgKCFNb2R1bGUtPmlzQXZhaWxhYmxlKGdldExhbmdPcHRzKCksIGdldFRhcmdldCgpLCBSZXF1aXJlbWVudCkpIHsKLSAgICAgIGdldERpYWdub3N0aWNzKCkuUmVwb3J0KEltcG9ydExvYywgZGlhZzo6ZXJyX21vZHVsZV91bmF2YWlsYWJsZSkKLSAgICAgICAgPDwgTW9kdWxlLT5nZXRGdWxsTW9kdWxlTmFtZSgpCi0gICAgICAgIDw8IFJlcXVpcmVtZW50LnNlY29uZCA8PCBSZXF1aXJlbWVudC5maXJzdAotICAgICAgICA8PCBTb3VyY2VSYW5nZShQYXRoLmZyb250KCkuc2Vjb25kLCBQYXRoLmJhY2soKS5zZWNvbmQpOworICAgIGNsYW5nOjpNb2R1bGU6OkhlYWRlckRpcmVjdGl2ZSBNaXNzaW5nSGVhZGVyOworICAgIGlmICghTW9kdWxlLT5pc0F2YWlsYWJsZShnZXRMYW5nT3B0cygpLCBnZXRUYXJnZXQoKSwgUmVxdWlyZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc3NpbmdIZWFkZXIpKSB7CisgICAgICBpZiAoTWlzc2luZ0hlYWRlci5GaWxlTmFtZUxvYy5pc1ZhbGlkKCkpIHsKKyAgICAgICAgZ2V0RGlhZ25vc3RpY3MoKS5SZXBvcnQoTWlzc2luZ0hlYWRlci5GaWxlTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX21vZHVsZV9oZWFkZXJfbWlzc2luZykKKyAgICAgICAgICA8PCBNaXNzaW5nSGVhZGVyLklzVW1icmVsbGEgPDwgTWlzc2luZ0hlYWRlci5GaWxlTmFtZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdldERpYWdub3N0aWNzKCkuUmVwb3J0KEltcG9ydExvYywgZGlhZzo6ZXJyX21vZHVsZV91bmF2YWlsYWJsZSkKKyAgICAgICAgICA8PCBNb2R1bGUtPmdldEZ1bGxNb2R1bGVOYW1lKCkKKyAgICAgICAgICA8PCBSZXF1aXJlbWVudC5zZWNvbmQgPDwgUmVxdWlyZW1lbnQuZmlyc3QKKyAgICAgICAgICA8PCBTb3VyY2VSYW5nZShQYXRoLmZyb250KCkuc2Vjb25kLCBQYXRoLmJhY2soKS5zZWNvbmQpOworICAgICAgfQogICAgICAgTGFzdE1vZHVsZUltcG9ydExvYyA9IEltcG9ydExvYzsKICAgICAgIExhc3RNb2R1bGVJbXBvcnRSZXN1bHQgPSBNb2R1bGVMb2FkUmVzdWx0KCk7CiAgICAgICByZXR1cm4gTW9kdWxlTG9hZFJlc3VsdCgpOwpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0NvbXBpbGVySW52b2NhdGlvbi5jcHAgYi9saWIvRnJvbnRlbmQvQ29tcGlsZXJJbnZvY2F0aW9uLmNwcAppbmRleCA4ZGI1Y2YxLi5iOTcwNmU4IDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmQvQ29tcGlsZXJJbnZvY2F0aW9uLmNwcAorKysgYi9saWIvRnJvbnRlbmQvQ29tcGlsZXJJbnZvY2F0aW9uLmNwcApAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgImNsYW5nL0xleC9IZWFkZXJTZWFyY2hPcHRpb25zLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RSZWFkZXIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9IYXNoaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTd2l0Y2guaCIKQEAgLTM0LDYgKzMzLDggQEAKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qcm9jZXNzLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3N5c3RlbV9lcnJvci5oIgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIApAQCAtMjYyLDcgKzI2Myw3IEBACiAgICAgY29uZmlnTGlzdC5zcGxpdChjb25maWdWYWxzLCAiLCIpOwogICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBjb25maWdWYWxzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKICAgICAgIFN0cmluZ1JlZiBrZXksIHZhbDsKLSAgICAgIGxsdm06OnRpZShrZXksIHZhbCkgPSBjb25maWdWYWxzW2ldLnNwbGl0KCI9Iik7CisgICAgICBzdGQ6OnRpZShrZXksIHZhbCkgPSBjb25maWdWYWxzW2ldLnNwbGl0KCI9Iik7CiAgICAgICBpZiAodmFsLmVtcHR5KCkpIHsKICAgICAgICAgRGlhZ3MuUmVwb3J0KFNvdXJjZUxvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfYW5hbHl6ZXJfY29uZmlnX25vX3ZhbHVlKSA8PCBjb25maWdWYWxzW2ldOwpAQCAtMjk1LDcgKzI5Niw4IEBACiB9CiAKIHN0YXRpYyBib29sIFBhcnNlQ29kZUdlbkFyZ3MoQ29kZUdlbk9wdGlvbnMgJk9wdHMsIEFyZ0xpc3QgJkFyZ3MsIElucHV0S2luZCBJSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICZEaWFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0T3B0aW9ucyAmVGFyZ2V0T3B0cykgewogICB1c2luZyBuYW1lc3BhY2Ugb3B0aW9uczsKICAgYm9vbCBTdWNjZXNzID0gdHJ1ZTsKIApAQCAtMzIyLDEwICszMjQsMTYgQEAKICAgICBPcHRzLnNldERlYnVnSW5mbyhDb2RlR2VuT3B0aW9uczo6RGVidWdMaW5lVGFibGVzT25seSk7CiAgIH0gZWxzZSBpZiAoQXJncy5oYXNBcmcoT1BUX2dfRmxhZykgfHwgQXJncy5oYXNBcmcoT1BUX2dkd2FyZl8yKSB8fAogICAgICAgICAgICAgIEFyZ3MuaGFzQXJnKE9QVF9nZHdhcmZfMykgfHwgQXJncy5oYXNBcmcoT1BUX2dkd2FyZl80KSkgewotICAgIGlmIChBcmdzLmhhc0ZsYWcoT1BUX2ZsaW1pdF9kZWJ1Z19pbmZvLCBPUFRfZm5vX2xpbWl0X2RlYnVnX2luZm8sIHRydWUpKQotICAgICAgT3B0cy5zZXREZWJ1Z0luZm8oQ29kZUdlbk9wdGlvbnM6OkxpbWl0ZWREZWJ1Z0luZm8pOwotICAgIGVsc2UKKyAgICBib29sIERlZmF1bHQgPSBmYWxzZTsKKyAgICAvLyBVbnRpbCBkdHJhY2UgKHZpYSBDVEYpIGNhbiBkZWFsIHdpdGggZGlzdHJpYnV0ZWQgZGVidWcgaW5mbywKKyAgICAvLyBEYXJ3aW4gZGVmYXVsdHMgdG8gc3RhbmRhbG9uZS9mdWxsIGRlYnVnIGluZm8uCisgICAgaWYgKGxsdm06OlRyaXBsZShUYXJnZXRPcHRzLlRyaXBsZSkuaXNPU0RhcndpbigpKQorICAgICAgRGVmYXVsdCA9IHRydWU7CisKKyAgICBpZiAoQXJncy5oYXNGbGFnKE9QVF9mc3RhbmRhbG9uZV9kZWJ1ZywgT1BUX2Zub19zdGFuZGFsb25lX2RlYnVnLCBEZWZhdWx0KSkKICAgICAgIE9wdHMuc2V0RGVidWdJbmZvKENvZGVHZW5PcHRpb25zOjpGdWxsRGVidWdJbmZvKTsKKyAgICBlbHNlCisgICAgICBPcHRzLnNldERlYnVnSW5mbyhDb2RlR2VuT3B0aW9uczo6TGltaXRlZERlYnVnSW5mbyk7CiAgIH0KICAgT3B0cy5EZWJ1Z0NvbHVtbkluZm8gPSBBcmdzLmhhc0FyZyhPUFRfZHdhcmZfY29sdW1uX2luZm8pOwogICBPcHRzLlNwbGl0RHdhcmZGaWxlID0gQXJncy5nZXRMYXN0QXJnVmFsdWUoT1BUX3NwbGl0X2R3YXJmX2ZpbGUpOwpAQCAtMzU4LDggKzM2NiwxMSBAQAogICAgICAgICAgICAgICAgICAgIChPcHRzLk9wdGltaXphdGlvbkxldmVsID4gMSAmJiAhT3B0cy5PcHRpbWl6ZVNpemUpKTsKICAgT3B0cy5SZXJvbGxMb29wcyA9IEFyZ3MuaGFzQXJnKE9QVF9mcmVyb2xsX2xvb3BzKTsKIAorICBPcHRzLkRpc2FibGVJbnRlZ3JhdGVkQVMgPSBBcmdzLmhhc0FyZyhPUFRfZm5vX2ludGVncmF0ZWRfYXMpOwogICBPcHRzLkF1dG9saW5rID0gIUFyZ3MuaGFzQXJnKE9QVF9mbm9fYXV0b2xpbmspOwogICBPcHRzLlNhbXBsZVByb2ZpbGVGaWxlID0gQXJncy5nZXRMYXN0QXJnVmFsdWUoT1BUX2Zwcm9maWxlX3NhbXBsZV91c2VfRVEpOworICBPcHRzLlByb2ZpbGVJbnN0ckdlbmVyYXRlID0gQXJncy5oYXNBcmcoT1BUX2Zwcm9maWxlX2luc3RyX2dlbmVyYXRlKTsKKyAgT3B0cy5JbnN0clByb2ZpbGVJbnB1dCA9IEFyZ3MuZ2V0TGFzdEFyZ1ZhbHVlKE9QVF9mcHJvZmlsZV9pbnN0cl91c2VfRVEpOwogICBPcHRzLkFzbVZlcmJvc2UgPSBBcmdzLmhhc0FyZyhPUFRfbWFzbV92ZXJib3NlKTsKICAgT3B0cy5PYmpDQXV0b1JlZkNvdW50RXhjZXB0aW9ucyA9IEFyZ3MuaGFzQXJnKE9QVF9mb2JqY19hcmNfZXhjZXB0aW9ucyk7CiAgIE9wdHMuQ1VEQUlzRGV2aWNlID0gQXJncy5oYXNBcmcoT1BUX2ZjdWRhX2lzX2RldmljZSk7CkBAIC0zNzEsNyArMzgyLDYgQEAKICAgT3B0cy5EaXNhYmxlRnJlZSA9IEFyZ3MuaGFzQXJnKE9QVF9kaXNhYmxlX2ZyZWUpOwogICBPcHRzLkRpc2FibGVUYWlsQ2FsbHMgPSBBcmdzLmhhc0FyZyhPUFRfbWRpc2FibGVfdGFpbF9jYWxscyk7CiAgIE9wdHMuRmxvYXRBQkkgPSBBcmdzLmdldExhc3RBcmdWYWx1ZShPUFRfbWZsb2F0X2FiaSk7Ci0gIE9wdHMuSGlkZGVuV2Vha1ZUYWJsZXMgPSBBcmdzLmhhc0FyZyhPUFRfZmhpZGRlbl93ZWFrX3Z0YWJsZXMpOwogICBPcHRzLkxlc3NQcmVjaXNlRlBNQUQgPSBBcmdzLmhhc0FyZyhPUFRfY2xfbWFkX2VuYWJsZSk7CiAgIE9wdHMuTGltaXRGbG9hdFByZWNpc2lvbiA9IEFyZ3MuZ2V0TGFzdEFyZ1ZhbHVlKE9QVF9tbGltaXRfZmxvYXRfcHJlY2lzaW9uKTsKICAgT3B0cy5Ob0luZnNGUE1hdGggPSAoQXJncy5oYXNBcmcoT1BUX21lbmFibGVfbm9faW5maW5pdGllcykgfHwKQEAgLTQzNywxNSArNDQ3LDE0IEBACiAgIE9wdHMuSW5zdHJ1bWVudEZ1bmN0aW9ucyA9IEFyZ3MuaGFzQXJnKE9QVF9maW5zdHJ1bWVudF9mdW5jdGlvbnMpOwogICBPcHRzLkluc3RydW1lbnRGb3JQcm9maWxpbmcgPSBBcmdzLmhhc0FyZyhPUFRfcGcpOwogICBPcHRzLkVtaXRPcGVuQ0xBcmdNZXRhZGF0YSA9IEFyZ3MuaGFzQXJnKE9QVF9jbF9rZXJuZWxfYXJnX2luZm8pOworICBPcHRzLkNvbXByZXNzRGVidWdTZWN0aW9ucyA9IEFyZ3MuaGFzQXJnKE9QVF9jb21wcmVzc19kZWJ1Z19zZWN0aW9ucyk7CiAgIE9wdHMuRGVidWdDb21waWxhdGlvbkRpciA9IEFyZ3MuZ2V0TGFzdEFyZ1ZhbHVlKE9QVF9mZGVidWdfY29tcGlsYXRpb25fZGlyKTsKICAgT3B0cy5MaW5rQml0Y29kZUZpbGUgPSBBcmdzLmdldExhc3RBcmdWYWx1ZShPUFRfbWxpbmtfYml0Y29kZV9maWxlKTsKICAgT3B0cy5TYW5pdGl6ZXJCbGFja2xpc3RGaWxlID0gQXJncy5nZXRMYXN0QXJnVmFsdWUoT1BUX2ZzYW5pdGl6ZV9ibGFja2xpc3QpOwogICBPcHRzLlNhbml0aXplTWVtb3J5VHJhY2tPcmlnaW5zID0KLSAgICBBcmdzLmhhc0FyZyhPUFRfZnNhbml0aXplX21lbW9yeV90cmFja19vcmlnaW5zKTsKLSAgT3B0cy5TYW5pdGl6ZUFkZHJlc3NaZXJvQmFzZVNoYWRvdyA9Ci0gICAgQXJncy5oYXNBcmcoT1BUX2ZzYW5pdGl6ZV9hZGRyZXNzX3plcm9fYmFzZV9zaGFkb3cpOworICAgICAgZ2V0TGFzdEFyZ0ludFZhbHVlKEFyZ3MsIE9QVF9mc2FuaXRpemVfbWVtb3J5X3RyYWNrX29yaWdpbnNfRVEsIDAsIERpYWdzKTsKICAgT3B0cy5TYW5pdGl6ZVVuZGVmaW5lZFRyYXBPbkVycm9yID0KLSAgICBBcmdzLmhhc0FyZyhPUFRfZnNhbml0aXplX3VuZGVmaW5lZF90cmFwX29uX2Vycm9yKTsKKyAgICAgIEFyZ3MuaGFzQXJnKE9QVF9mc2FuaXRpemVfdW5kZWZpbmVkX3RyYXBfb25fZXJyb3IpOwogICBPcHRzLlNTUEJ1ZmZlclNpemUgPQogICAgICAgZ2V0TGFzdEFyZ0ludFZhbHVlKEFyZ3MsIE9QVF9zdGFja19wcm90ZWN0b3JfYnVmZmVyX3NpemUsIDgsIERpYWdzKTsKICAgT3B0cy5TdGFja1JlYWxpZ25tZW50ID0gQXJncy5oYXNBcmcoT1BUX21zdGFja3JlYWxpZ24pOwpAQCAtNTIwLDYgKzUyOSw3IEBACiAgIE9wdHMuT3V0cHV0RmlsZSA9IEFyZ3MuZ2V0TGFzdEFyZ1ZhbHVlKE9QVF9kZXBlbmRlbmN5X2ZpbGUpOwogICBPcHRzLlRhcmdldHMgPSBBcmdzLmdldEFsbEFyZ1ZhbHVlcyhPUFRfTVQpOwogICBPcHRzLkluY2x1ZGVTeXN0ZW1IZWFkZXJzID0gQXJncy5oYXNBcmcoT1BUX3N5c19oZWFkZXJfZGVwcyk7CisgIE9wdHMuSW5jbHVkZU1vZHVsZUZpbGVzID0gQXJncy5oYXNBcmcoT1BUX21vZHVsZV9maWxlX2RlcHMpOwogICBPcHRzLlVzZVBob255VGFyZ2V0cyA9IEFyZ3MuaGFzQXJnKE9QVF9NUCk7CiAgIE9wdHMuU2hvd0hlYWRlckluY2x1ZGVzID0gQXJncy5oYXNBcmcoT1BUX0gpOwogICBPcHRzLkhlYWRlckluY2x1ZGVPdXRwdXRGaWxlID0gQXJncy5nZXRMYXN0QXJnVmFsdWUoT1BUX2hlYWRlcl9pbmNsdWRlX2ZpbGUpOwpAQCAtNjkyLDYgKzcwMiw4IEBACiAgICAgICBPcHRzLlByb2dyYW1BY3Rpb24gPSBmcm9udGVuZDo6UGFyc2VTeW50YXhPbmx5OyBicmVhazsKICAgICBjYXNlIE9QVF9tb2R1bGVfZmlsZV9pbmZvOgogICAgICAgT3B0cy5Qcm9ncmFtQWN0aW9uID0gZnJvbnRlbmQ6Ok1vZHVsZUZpbGVJbmZvOyBicmVhazsKKyAgICBjYXNlIE9QVF92ZXJpZnlfcGNoOgorICAgICAgT3B0cy5Qcm9ncmFtQWN0aW9uID0gZnJvbnRlbmQ6OlZlcmlmeVBDSDsgYnJlYWs7CiAgICAgY2FzZSBPUFRfcHJpbnRfZGVjbF9jb250ZXh0czoKICAgICAgIE9wdHMuUHJvZ3JhbUFjdGlvbiA9IGZyb250ZW5kOjpQcmludERlY2xDb250ZXh0OyBicmVhazsKICAgICBjYXNlIE9QVF9wcmludF9wcmVhbWJsZToKQEAgLTgyMCwxMCArODMyLDEyIEBACiAgICAgT3B0cy5PYmpDTVRBY3Rpb24gfD0gRnJvbnRlbmRPcHRpb25zOjpPYmpDTVRfQXRvbWljUHJvcGVydHk7CiAgIGlmIChBcmdzLmhhc0FyZyhPUFRfb2JqY210X25zX25vbmF0b21pY19pb3Nvbmx5KSkKICAgICBPcHRzLk9iakNNVEFjdGlvbiB8PSBGcm9udGVuZE9wdGlvbnM6Ok9iakNNVF9Oc0F0b21pY0lPU09ubHlQcm9wZXJ0eTsKKyAgaWYgKEFyZ3MuaGFzQXJnKE9QVF9vYmpjbXRfbWlncmF0ZV9kZXNpZ25hdGVkX2luaXQpKQorICAgIE9wdHMuT2JqQ01UQWN0aW9uIHw9IEZyb250ZW5kT3B0aW9uczo6T2JqQ01UX0Rlc2lnbmF0ZWRJbml0aWFsaXplcjsKICAgaWYgKEFyZ3MuaGFzQXJnKE9QVF9vYmpjbXRfbWlncmF0ZV9hbGwpKQogICAgIE9wdHMuT2JqQ01UQWN0aW9uIHw9IEZyb250ZW5kT3B0aW9uczo6T2JqQ01UX01pZ3JhdGVEZWNsczsKIAotICBPcHRzLk9iakNNVFdoaXRlTGlzdFBhdGggPSBBcmdzLmdldExhc3RBcmdWYWx1ZShPUFRfb2JqY210X3doaXRlX2xpc3RfZGlyX3BhdGgpOworICBPcHRzLk9iakNNVFdoaXRlTGlzdFBhdGggPSBBcmdzLmdldExhc3RBcmdWYWx1ZShPUFRfb2JqY210X3doaXRlbGlzdF9kaXJfcGF0aCk7CiAKICAgaWYgKE9wdHMuQVJDTVRBY3Rpb24gIT0gRnJvbnRlbmRPcHRpb25zOjpBUkNNVF9Ob25lICYmCiAgICAgICBPcHRzLk9iakNNVEFjdGlvbiAhPSBGcm9udGVuZE9wdGlvbnM6Ok9iakNNVF9Ob25lKSB7CkBAIC05MDYsNiArOTIwLDcgQEAKICAgICBPcHRzLlVzZUxpYmN4eCA9IChzdHJjbXAoQS0+Z2V0VmFsdWUoKSwgImxpYmMrKyIpID09IDApOwogICBPcHRzLlJlc291cmNlRGlyID0gQXJncy5nZXRMYXN0QXJnVmFsdWUoT1BUX3Jlc291cmNlX2Rpcik7CiAgIE9wdHMuTW9kdWxlQ2FjaGVQYXRoID0gQXJncy5nZXRMYXN0QXJnVmFsdWUoT1BUX2Ztb2R1bGVzX2NhY2hlX3BhdGgpOworICBPcHRzLk1vZHVsZVVzZXJCdWlsZFBhdGggPSBBcmdzLmdldExhc3RBcmdWYWx1ZShPUFRfZm1vZHVsZXNfdXNlcl9idWlsZF9wYXRoKTsKICAgT3B0cy5EaXNhYmxlTW9kdWxlSGFzaCA9IEFyZ3MuaGFzQXJnKE9QVF9mZGlzYWJsZV9tb2R1bGVfaGFzaCk7CiAgIC8vIC1mbW9kdWxlcyBpbXBsaWVzIC1mbW9kdWxlLW1hcHMKICAgT3B0cy5Nb2R1bGVNYXBzID0gQXJncy5oYXNBcmcoT1BUX2Ztb2R1bGVfbWFwcykgfHwgQXJncy5oYXNBcmcoT1BUX2Ztb2R1bGVzKTsKQEAgLTkxMyw2ICs5MjgsMTMgQEAKICAgICAgIGdldExhc3RBcmdJbnRWYWx1ZShBcmdzLCBPUFRfZm1vZHVsZXNfcHJ1bmVfaW50ZXJ2YWwsIDcgKiAyNCAqIDYwICogNjApOwogICBPcHRzLk1vZHVsZUNhY2hlUHJ1bmVBZnRlciA9CiAgICAgICBnZXRMYXN0QXJnSW50VmFsdWUoQXJncywgT1BUX2Ztb2R1bGVzX3BydW5lX2FmdGVyLCAzMSAqIDI0ICogNjAgKiA2MCk7CisgIE9wdHMuTW9kdWxlc1ZhbGlkYXRlT25jZVBlckJ1aWxkU2Vzc2lvbiA9CisgICAgICBBcmdzLmhhc0FyZyhPUFRfZm1vZHVsZXNfdmFsaWRhdGVfb25jZV9wZXJfYnVpbGRfc2Vzc2lvbik7CisgIE9wdHMuQnVpbGRTZXNzaW9uVGltZXN0YW1wID0KKyAgICAgIGdldExhc3RBcmdVSW50NjRWYWx1ZShBcmdzLCBPUFRfZmJ1aWxkX3Nlc3Npb25fdGltZXN0YW1wLCAwKTsKKyAgT3B0cy5Nb2R1bGVzVmFsaWRhdGVTeXN0ZW1IZWFkZXJzID0KKyAgICAgIEFyZ3MuaGFzQXJnKE9QVF9mbW9kdWxlc192YWxpZGF0ZV9zeXN0ZW1faGVhZGVycyk7CisKICAgZm9yIChhcmdfaXRlcmF0b3IgaXQgPSBBcmdzLmZpbHRlcmVkX2JlZ2luKE9QVF9mbW9kdWxlc19pZ25vcmVfbWFjcm8pLAogICAgICAgICAgICAgICAgICAgICBpZSA9IEFyZ3MuZmlsdGVyZWRfZW5kKCk7CiAgICAgICAgaXQgIT0gaWU7ICsraXQpIHsKQEAgLTk5OCwxMiArMTAyMCwxNiBAQAogICB9CiAKICAgLy8gQWRkIHRoZSBwYXRoIHByZWZpeGVzIHdoaWNoIGFyZSBpbXBsaWNpdGx5IHRyZWF0ZWQgYXMgYmVpbmcgc3lzdGVtIGhlYWRlcnMuCi0gIGZvciAoYXJnX2l0ZXJhdG9yIEkgPSBBcmdzLmZpbHRlcmVkX2JlZ2luKE9QVF9pc3lzdGVtX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUX2lub19zeXN0ZW1fcHJlZml4KSwKKyAgZm9yIChhcmdfaXRlcmF0b3IgSSA9IEFyZ3MuZmlsdGVyZWRfYmVnaW4oT1BUX3N5c3RlbV9oZWFkZXJfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRfbm9fc3lzdGVtX2hlYWRlcl9wcmVmaXgpLAogICAgICAgICAgICAgICAgICAgICBFID0gQXJncy5maWx0ZXJlZF9lbmQoKTsKICAgICAgICBJICE9IEU7ICsrSSkKLSAgICBPcHRzLkFkZFN5c3RlbUhlYWRlclByZWZpeCgoKkkpLT5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqSSktPmdldE9wdGlvbigpLm1hdGNoZXMoT1BUX2lzeXN0ZW1fcHJlZml4KSk7CisgICAgT3B0cy5BZGRTeXN0ZW1IZWFkZXJQcmVmaXgoCisgICAgICAgICgqSSktPmdldFZhbHVlKCksICgqSSktPmdldE9wdGlvbigpLm1hdGNoZXMoT1BUX3N5c3RlbV9oZWFkZXJfcHJlZml4KSk7CisKKyAgZm9yIChhcmdfaXRlcmF0b3IgSSA9IEFyZ3MuZmlsdGVyZWRfYmVnaW4oT1BUX2l2ZnNvdmVybGF5KSwKKyAgICAgICBFID0gQXJncy5maWx0ZXJlZF9lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgT3B0cy5BZGRWRlNPdmVybGF5RmlsZSgoKkkpLT5nZXRWYWx1ZSgpKTsKIH0KIAogdm9pZCBDb21waWxlckludm9jYXRpb246OnNldExhbmdEZWZhdWx0cyhMYW5nT3B0aW9ucyAmT3B0cywgSW5wdXRLaW5kIElLLApAQCAtMTA5MSw2ICsxMTE3LDkgQEAKICAgLy8gT3BlbkNMIGFuZCBDKysgYm90aCBoYXZlIGJvb2wsIHRydWUsIGZhbHNlIGtleXdvcmRzLgogICBPcHRzLkJvb2wgPSBPcHRzLk9wZW5DTCB8fCBPcHRzLkNQbHVzUGx1czsKIAorICAvLyBPcGVuQ0wgaGFzIGhhbGYga2V5d29yZAorICBPcHRzLkhhbGYgPSBPcHRzLk9wZW5DTDsKKwogICAvLyBDKysgaGFzIHdjaGFyX3Qga2V5d29yZC4KICAgT3B0cy5XQ2hhciA9IE9wdHMuQ1BsdXNQbHVzOwogCkBAIC0xMTM5LDcgKzExNjgsOCBAQAogICAgICAgRGlhZ3MuUmVwb3J0KGRpYWc6OmVycl9kcnZfaW52YWxpZF92YWx1ZSkKICAgICAgICAgPDwgQS0+Z2V0QXNTdHJpbmcoQXJncykgPDwgQS0+Z2V0VmFsdWUoKTsKICAgICBlbHNlIHsKLSAgICAgIC8vIFZhbGlkIHN0YW5kYXJkLCBjaGVjayB0byBtYWtlIHN1cmUgbGFuZ3VhZ2UgYW5kIHN0YW5kYXJkIGFyZSBjb21wYXRhYmxlLiAgICAKKyAgICAgIC8vIFZhbGlkIHN0YW5kYXJkLCBjaGVjayB0byBtYWtlIHN1cmUgbGFuZ3VhZ2UgYW5kIHN0YW5kYXJkIGFyZQorICAgICAgLy8gY29tcGF0aWJsZS4KICAgICAgIGNvbnN0IExhbmdTdGFuZGFyZCAmU3RkID0gTGFuZ1N0YW5kYXJkOjpnZXRMYW5nU3RhbmRhcmRGb3JLaW5kKExhbmdTdGQpOwogICAgICAgc3dpdGNoIChJSykgewogICAgICAgY2FzZSBJS19DOgpAQCAtMTI5MCwxMSArMTMyMCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRfZm5vX2RvbGxhcnNfaW5faWRlbnRpZmllcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMuRG9sbGFySWRlbnRzKTsKICAgT3B0cy5QYXNjYWxTdHJpbmdzID0gQXJncy5oYXNBcmcoT1BUX2ZwYXNjYWxfc3RyaW5ncyk7Ci0gIE9wdHMuTWljcm9zb2Z0RXh0Ci0gICAgPSBBcmdzLmhhc0FyZyhPUFRfZm1zX2V4dGVuc2lvbnMpIHx8IEFyZ3MuaGFzQXJnKE9QVF9mbXNfY29tcGF0aWJpbGl0eSk7Ci0gIE9wdHMuTWljcm9zb2Z0TW9kZSA9IEFyZ3MuaGFzQXJnKE9QVF9mbXNfY29tcGF0aWJpbGl0eSk7CisgIE9wdHMuTVNWQ0NvbXBhdCA9IEFyZ3MuaGFzQXJnKE9QVF9mbXNfY29tcGF0aWJpbGl0eSk7CisgIE9wdHMuTWljcm9zb2Z0RXh0ID0gT3B0cy5NU1ZDQ29tcGF0IHx8IEFyZ3MuaGFzQXJnKE9QVF9mbXNfZXh0ZW5zaW9ucyk7CiAgIE9wdHMuQXNtQmxvY2tzID0gQXJncy5oYXNBcmcoT1BUX2Zhc21fYmxvY2tzKSB8fCBPcHRzLk1pY3Jvc29mdEV4dDsKICAgT3B0cy5NU0NWZXJzaW9uID0gZ2V0TGFzdEFyZ0ludFZhbHVlKEFyZ3MsIE9QVF9mbXNjX3ZlcnNpb24sIDAsIERpYWdzKTsKKyAgT3B0cy5WdG9yRGlzcE1vZGUgPSBnZXRMYXN0QXJnSW50VmFsdWUoQXJncywgT1BUX3Z0b3JkaXNwX21vZGVfRVEsIDEsIERpYWdzKTsKICAgT3B0cy5Cb3JsYW5kID0gQXJncy5oYXNBcmcoT1BUX2Zib3JsYW5kX2V4dGVuc2lvbnMpOwogICBPcHRzLldyaXRhYmxlU3RyaW5ncyA9IEFyZ3MuaGFzQXJnKE9QVF9md3JpdGFibGVfc3RyaW5ncyk7CiAgIE9wdHMuQ29uc3RTdHJpbmdzID0gQXJncy5oYXNGbGFnKE9QVF9mY29uc3Rfc3RyaW5ncywgT1BUX2Zub19jb25zdF9zdHJpbmdzLApAQCAtMTMxNiw3ICsxMzQ2LDcgQEAKICAgT3B0cy5Nb2R1bGVzRGVjbFVzZSA9IEFyZ3MuaGFzQXJnKE9QVF9mbW9kdWxlc19kZWNsdXNlKTsKICAgT3B0cy5DaGFySXNTaWduZWQgPSBPcHRzLk9wZW5DTCB8fCAhQXJncy5oYXNBcmcoT1BUX2Zub19zaWduZWRfY2hhcik7CiAgIE9wdHMuV0NoYXIgPSBPcHRzLkNQbHVzUGx1cyAmJiAhQXJncy5oYXNBcmcoT1BUX2Zub193Y2hhcik7Ci0gIE9wdHMuU2hvcnRXQ2hhciA9IEFyZ3MuaGFzQXJnKE9QVF9mc2hvcnRfd2NoYXIpOworICBPcHRzLlNob3J0V0NoYXIgPSBBcmdzLmhhc0ZsYWcoT1BUX2ZzaG9ydF93Y2hhciwgT1BUX2Zub19zaG9ydF93Y2hhciwgZmFsc2UpOwogICBPcHRzLlNob3J0RW51bXMgPSBBcmdzLmhhc0FyZyhPUFRfZnNob3J0X2VudW1zKTsKICAgT3B0cy5GcmVlc3RhbmRpbmcgPSBBcmdzLmhhc0FyZyhPUFRfZmZyZWVzdGFuZGluZyk7CiAgIE9wdHMuTm9CdWlsdGluID0gQXJncy5oYXNBcmcoT1BUX2Zub19idWlsdGluKSB8fCBPcHRzLkZyZWVzdGFuZGluZzsKQEAgLTEzOTEsOCArMTQyMSwzMCBAQAogICAgIH0KICAgfQogCi0gIC8vIENoZWNrIGlmIC1mb3Blbm1wIGlzIHNwZWNpZmllZC4KLSAgT3B0cy5PcGVuTVAgPSBBcmdzLmhhc0FyZyhPUFRfZm9wZW5tcCk7CisgIGlmIChBcmcgKkEgPSBBcmdzLmdldExhc3RBcmcoT1BUX2Ztc19tZW1wdHJfcmVwX0VRKSkgeworICAgIExhbmdPcHRpb25zOjpQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzS2luZCBJbmhlcml0YW5jZU1vZGVsID0KKyAgICAgICAgbGx2bTo6U3RyaW5nU3dpdGNoPExhbmdPcHRpb25zOjpQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzS2luZD4oCisgICAgICAgICAgICBBLT5nZXRWYWx1ZSgpKQorICAgICAgICAgICAgLkNhc2UoInNpbmdsZSIsCisgICAgICAgICAgICAgICAgICBMYW5nT3B0aW9uczo6UFBUTUtfRnVsbEdlbmVyYWxpdHlTaW5nbGVJbmhlcml0YW5jZSkKKyAgICAgICAgICAgIC5DYXNlKCJtdWx0aXBsZSIsCisgICAgICAgICAgICAgICAgICBMYW5nT3B0aW9uczo6UFBUTUtfRnVsbEdlbmVyYWxpdHlNdWx0aXBsZUluaGVyaXRhbmNlKQorICAgICAgICAgICAgLkNhc2UoInZpcnR1YWwiLAorICAgICAgICAgICAgICAgICAgTGFuZ09wdGlvbnM6OlBQVE1LX0Z1bGxHZW5lcmFsaXR5VmlydHVhbEluaGVyaXRhbmNlKQorICAgICAgICAgICAgLkRlZmF1bHQoTGFuZ09wdGlvbnM6OlBQVE1LX0Jlc3RDYXNlKTsKKyAgICBpZiAoSW5oZXJpdGFuY2VNb2RlbCA9PSBMYW5nT3B0aW9uczo6UFBUTUtfQmVzdENhc2UpCisgICAgICBEaWFncy5SZXBvcnQoZGlhZzo6ZXJyX2Rydl9pbnZhbGlkX3ZhbHVlKQorICAgICAgICAgIDw8ICItZm1zLW1lbXB0ci1yZXA9IiA8PCBBLT5nZXRWYWx1ZSgpOworCisgICAgT3B0cy5zZXRNU1BvaW50ZXJUb01lbWJlclJlcHJlc2VudGF0aW9uTWV0aG9kKEluaGVyaXRhbmNlTW9kZWwpOworICB9CisKKyAgLy8gQ2hlY2sgaWYgLWZvcGVubXA9IGlzIHNwZWNpZmllZC4KKyAgaWYgKGNvbnN0IEFyZyAqQSA9IEFyZ3MuZ2V0TGFzdEFyZyhvcHRpb25zOjpPUFRfZm9wZW5tcF9FUSkpIHsKKyAgICBPcHRzLk9wZW5NUCA9IGxsdm06OlN0cmluZ1N3aXRjaDxib29sPihBLT5nZXRWYWx1ZSgpKQorICAgICAgICAuQ2FzZSgibGliaW9tcDUiLCB0cnVlKQorICAgICAgICAuRGVmYXVsdChmYWxzZSk7CisgIH0KIAogICAvLyBSZWNvcmQgd2hldGhlciB0aGUgX19ERVBSRUNBVEVEIGRlZmluZSB3YXMgcmVxdWVzdGVkLgogICBPcHRzLkRlcHJlY2F0ZWQgPSBBcmdzLmhhc0ZsYWcoT1BUX2ZkZXByZWNhdGVkX21hY3JvLApAQCAtMTQyNCw3ICsxNDc2LDggQEAKICAgICBicmVhazsKICAgY2FzZSAwOiBPcHRzLnNldFN0YWNrUHJvdGVjdG9yKExhbmdPcHRpb25zOjpTU1BPZmYpOyBicmVhazsKICAgY2FzZSAxOiBPcHRzLnNldFN0YWNrUHJvdGVjdG9yKExhbmdPcHRpb25zOjpTU1BPbik7ICBicmVhazsKLSAgY2FzZSAyOiBPcHRzLnNldFN0YWNrUHJvdGVjdG9yKExhbmdPcHRpb25zOjpTU1BSZXEpOyBicmVhazsKKyAgY2FzZSAyOiBPcHRzLnNldFN0YWNrUHJvdGVjdG9yKExhbmdPcHRpb25zOjpTU1BTdHJvbmcpOyBicmVhazsKKyAgY2FzZSAzOiBPcHRzLnNldFN0YWNrUHJvdGVjdG9yKExhbmdPcHRpb25zOjpTU1BSZXEpOyBicmVhazsKICAgfQogCiAgIC8vIFBhcnNlIC1mc2FuaXRpemU9IGFyZ3VtZW50cy4KQEAgLTE1NzUsNiArMTYyOCw3IEBACiAgIGNhc2UgZnJvbnRlbmQ6OkdlbmVyYXRlUFRIOgogICBjYXNlIGZyb250ZW5kOjpQYXJzZVN5bnRheE9ubHk6CiAgIGNhc2UgZnJvbnRlbmQ6Ok1vZHVsZUZpbGVJbmZvOgorICBjYXNlIGZyb250ZW5kOjpWZXJpZnlQQ0g6CiAgIGNhc2UgZnJvbnRlbmQ6OlBsdWdpbkFjdGlvbjoKICAgY2FzZSBmcm9udGVuZDo6UHJpbnREZWNsQ29udGV4dDoKICAgY2FzZSBmcm9udGVuZDo6UmV3cml0ZU9iakM6CkBAIC0xNjA1LDcgKzE2NTksNiBAQAogc3RhdGljIHZvaWQgUGFyc2VUYXJnZXRBcmdzKFRhcmdldE9wdGlvbnMgJk9wdHMsIEFyZ0xpc3QgJkFyZ3MpIHsKICAgdXNpbmcgbmFtZXNwYWNlIG9wdGlvbnM7CiAgIE9wdHMuQUJJID0gQXJncy5nZXRMYXN0QXJnVmFsdWUoT1BUX3RhcmdldF9hYmkpOwotICBPcHRzLkNYWEFCSSA9IEFyZ3MuZ2V0TGFzdEFyZ1ZhbHVlKE9QVF9jeHhfYWJpKTsKICAgT3B0cy5DUFUgPSBBcmdzLmdldExhc3RBcmdWYWx1ZShPUFRfdGFyZ2V0X2NwdSk7CiAgIE9wdHMuRlBNYXRoID0gQXJncy5nZXRMYXN0QXJnVmFsdWUoT1BUX21mcG1hdGgpOwogICBPcHRzLkZlYXR1cmVzQXNXcml0dGVuID0gQXJncy5nZXRBbGxBcmdWYWx1ZXMoT1BUX3RhcmdldF9mZWF0dXJlKTsKQEAgLTE2MTcsOCArMTY3MCw2IEBACiAgICAgT3B0cy5UcmlwbGUgPSBsbHZtOjpzeXM6OmdldERlZmF1bHRUYXJnZXRUcmlwbGUoKTsKIH0KIAotLy8KLQogYm9vbCBDb21waWxlckludm9jYXRpb246OkNyZWF0ZUZyb21BcmdzKENvbXBpbGVySW52b2NhdGlvbiAmUmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0ICpBcmdCZWdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCAqQXJnRW5kLApAQCAtMTYyNiwxMiArMTY3NywxMiBAQAogICBib29sIFN1Y2Nlc3MgPSB0cnVlOwogCiAgIC8vIFBhcnNlIHRoZSBhcmd1bWVudHMuCi0gIE93bmluZ1B0cjxPcHRUYWJsZT4gT3B0cyhjcmVhdGVEcml2ZXJPcHRUYWJsZSgpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPE9wdFRhYmxlPiBPcHRzKGNyZWF0ZURyaXZlck9wdFRhYmxlKCkpOwogICBjb25zdCB1bnNpZ25lZCBJbmNsdWRlZEZsYWdzQml0bWFzayA9IG9wdGlvbnM6OkNDMU9wdGlvbjsKICAgdW5zaWduZWQgTWlzc2luZ0FyZ0luZGV4LCBNaXNzaW5nQXJnQ291bnQ7Ci0gIE93bmluZ1B0cjxJbnB1dEFyZ0xpc3Q+IEFyZ3MoCi0gICAgT3B0cy0+UGFyc2VBcmdzKEFyZ0JlZ2luLCBBcmdFbmQsIE1pc3NpbmdBcmdJbmRleCwgTWlzc2luZ0FyZ0NvdW50LAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlZEZsYWdzQml0bWFzaykpOworICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRBcmdMaXN0PiBBcmdzKAorICAgICAgT3B0cy0+UGFyc2VBcmdzKEFyZ0JlZ2luLCBBcmdFbmQsIE1pc3NpbmdBcmdJbmRleCwgTWlzc2luZ0FyZ0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGVkRmxhZ3NCaXRtYXNrKSk7CiAKICAgLy8gQ2hlY2sgZm9yIG1pc3NpbmcgYXJndW1lbnQgZXJyb3IuCiAgIGlmIChNaXNzaW5nQXJnQ291bnQpIHsKQEAgLTE2NTYsOCArMTcwNyw5IEBACiAgIFBhcnNlRmlsZVN5c3RlbUFyZ3MoUmVzLmdldEZpbGVTeXN0ZW1PcHRzKCksICpBcmdzKTsKICAgLy8gRklYTUU6IFdlIHNob3VsZG4ndCBoYXZlIHRvIHBhc3MgdGhlIERhc2hYIG9wdGlvbiBhcm91bmQgaGVyZQogICBJbnB1dEtpbmQgRGFzaFggPSBQYXJzZUZyb250ZW5kQXJncyhSZXMuZ2V0RnJvbnRlbmRPcHRzKCksICpBcmdzLCBEaWFncyk7Ci0gIFN1Y2Nlc3MgPSBQYXJzZUNvZGVHZW5BcmdzKFJlcy5nZXRDb2RlR2VuT3B0cygpLCAqQXJncywgRGFzaFgsIERpYWdzKQotICAgICAgICAgICAgJiYgU3VjY2VzczsKKyAgUGFyc2VUYXJnZXRBcmdzKFJlcy5nZXRUYXJnZXRPcHRzKCksICpBcmdzKTsKKyAgU3VjY2VzcyA9IFBhcnNlQ29kZUdlbkFyZ3MoUmVzLmdldENvZGVHZW5PcHRzKCksICpBcmdzLCBEYXNoWCwgRGlhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcy5nZXRUYXJnZXRPcHRzKCkpICYmIFN1Y2Nlc3M7CiAgIFBhcnNlSGVhZGVyU2VhcmNoQXJncyhSZXMuZ2V0SGVhZGVyU2VhcmNoT3B0cygpLCAqQXJncyk7CiAgIGlmIChEYXNoWCAhPSBJS19BU1QgJiYgRGFzaFggIT0gSUtfTExWTV9JUikgewogICAgIFBhcnNlTGFuZ0FyZ3MoKlJlcy5nZXRMYW5nT3B0cygpLCAqQXJncywgRGFzaFgsIERpYWdzKTsKQEAgLTE2NzIsOCArMTcyNCw2IEBACiAgIFBhcnNlUHJlcHJvY2Vzc29yQXJncyhSZXMuZ2V0UHJlcHJvY2Vzc29yT3B0cygpLCAqQXJncywgRmlsZU1nciwgRGlhZ3MpOwogICBQYXJzZVByZXByb2Nlc3Nvck91dHB1dEFyZ3MoUmVzLmdldFByZXByb2Nlc3Nvck91dHB1dE9wdHMoKSwgKkFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXMuZ2V0RnJvbnRlbmRPcHRzKCkuUHJvZ3JhbUFjdGlvbik7Ci0gIFBhcnNlVGFyZ2V0QXJncyhSZXMuZ2V0VGFyZ2V0T3B0cygpLCAqQXJncyk7Ci0KICAgcmV0dXJuIFN1Y2Nlc3M7CiB9CiAKQEAgLTE3NTMsOCArMTgwMyw3IEBACiAgIAogICAvLyBFeHRlbmQgdGhlIHNpZ25hdHVyZSB3aXRoIHRoZSB0YXJnZXQgb3B0aW9ucy4KICAgY29kZSA9IGhhc2hfY29tYmluZShjb2RlLCBUYXJnZXRPcHRzLT5UcmlwbGUsIFRhcmdldE9wdHMtPkNQVSwKLSAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPcHRzLT5BQkksIFRhcmdldE9wdHMtPkNYWEFCSSwKLSAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPcHRzLT5MaW5rZXJWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPcHRzLT5BQkksIFRhcmdldE9wdHMtPkxpbmtlclZlcnNpb24pOwogICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBuID0gVGFyZ2V0T3B0cy0+RmVhdHVyZXNBc1dyaXR0ZW4uc2l6ZSgpOyBpICE9IG47ICsraSkKICAgICBjb2RlID0gaGFzaF9jb21iaW5lKGNvZGUsIFRhcmdldE9wdHMtPkZlYXR1cmVzQXNXcml0dGVuW2ldKTsKIApAQCAtMTc2Myw3ICsxODEyLDYgQEAKICAgY29uc3QgSGVhZGVyU2VhcmNoT3B0aW9ucyAmaHNPcHRzID0gZ2V0SGVhZGVyU2VhcmNoT3B0cygpOwogICBjb2RlID0gaGFzaF9jb21iaW5lKGNvZGUsIHBwT3B0cy5Vc2VQcmVkZWZpbmVzLCBwcE9wdHMuRGV0YWlsZWRSZWNvcmQpOwogCi0gIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gTWFjcm9EZWZzOwogICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgYm9vbC8qaXNVbmRlZiovPiA+Ojpjb25zdF9pdGVyYXRvciAKICAgICAgICAgICAgIEkgPSBnZXRQcmVwcm9jZXNzb3JPcHRzKCkuTWFjcm9zLmJlZ2luKCksCiAgICAgICAgICBJRW5kID0gZ2V0UHJlcHJvY2Vzc29yT3B0cygpLk1hY3Jvcy5lbmQoKTsKQEAgLTE3ODYsMTIgKzE4MzQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICBoc09wdHMuVXNlU3RhbmRhcmRDWFhJbmNsdWRlcywKICAgICAgICAgICAgICAgICAgICAgICBoc09wdHMuVXNlTGliY3h4KTsKIAorICAvLyBFeHRlbmQgdGhlIHNpZ25hdHVyZSB3aXRoIHRoZSB1c2VyIGJ1aWxkIHBhdGguCisgIGNvZGUgPSBoYXNoX2NvbWJpbmUoY29kZSwgaHNPcHRzLk1vZHVsZVVzZXJCdWlsZFBhdGgpOworCiAgIC8vIERhcndpbi1zcGVjaWZpYyBoYWNrOiBpZiB3ZSBoYXZlIGEgc3lzcm9vdCwgdXNlIHRoZSBjb250ZW50cyBhbmQKICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUgb2YKICAgLy8gICAkc3lzcm9vdC9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtVmVyc2lvbi5wbGlzdAogICAvLyBhcyBwYXJ0IG9mIHRoZSBtb2R1bGUgaGFzaC4KICAgaWYgKCFoc09wdHMuU3lzcm9vdC5lbXB0eSgpKSB7Ci0gICAgbGx2bTo6T3duaW5nUHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gYnVmZmVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IGJ1ZmZlcjsKICAgICBTbWFsbFN0cmluZzwxMjg+IHN5c3RlbVZlcnNpb25GaWxlOwogICAgIHN5c3RlbVZlcnNpb25GaWxlICs9IGhzT3B0cy5TeXNyb290OwogICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKHN5c3RlbVZlcnNpb25GaWxlLCAiU3lzdGVtIik7CkBAIC0xODEyLDEwICsxODYzLDExIEBACiAKIG5hbWVzcGFjZSBjbGFuZyB7CiAKLS8vIERlY2xhcmVkIGluIGNsYW5nL0Zyb250ZW5kL1V0aWxzLmguCi1pbnQgZ2V0TGFzdEFyZ0ludFZhbHVlKGNvbnN0IEFyZ0xpc3QgJkFyZ3MsIE9wdFNwZWNpZmllciBJZCwgaW50IERlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICpEaWFncykgewotICBpbnQgUmVzID0gRGVmYXVsdDsKK3RlbXBsYXRlPHR5cGVuYW1lIEludFR5Pgorc3RhdGljIEludFR5IGdldExhc3RBcmdJbnRWYWx1ZUltcGwoY29uc3QgQXJnTGlzdCAmQXJncywgT3B0U3BlY2lmaWVyIElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50VHkgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICpEaWFncykgeworICBJbnRUeSBSZXMgPSBEZWZhdWx0OwogICBpZiAoQXJnICpBID0gQXJncy5nZXRMYXN0QXJnKElkKSkgewogICAgIGlmIChTdHJpbmdSZWYoQS0+Z2V0VmFsdWUoKSkuZ2V0QXNJbnRlZ2VyKDEwLCBSZXMpKSB7CiAgICAgICBpZiAoRGlhZ3MpCkBAIC0xODI1LDQgKzE4NzcsMzIgQEAKICAgfQogICByZXR1cm4gUmVzOwogfQorCisKKy8vIERlY2xhcmVkIGluIGNsYW5nL0Zyb250ZW5kL1V0aWxzLmguCitpbnQgZ2V0TGFzdEFyZ0ludFZhbHVlKGNvbnN0IEFyZ0xpc3QgJkFyZ3MsIE9wdFNwZWNpZmllciBJZCwgaW50IERlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lICpEaWFncykgeworICByZXR1cm4gZ2V0TGFzdEFyZ0ludFZhbHVlSW1wbDxpbnQ+KEFyZ3MsIElkLCBEZWZhdWx0LCBEaWFncyk7Cit9CisKK3VpbnQ2NF90IGdldExhc3RBcmdVSW50NjRWYWx1ZShjb25zdCBBcmdMaXN0ICZBcmdzLCBPcHRTcGVjaWZpZXIgSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAqRGlhZ3MpIHsKKyAgcmV0dXJuIGdldExhc3RBcmdJbnRWYWx1ZUltcGw8dWludDY0X3Q+KEFyZ3MsIElkLCBEZWZhdWx0LCBEaWFncyk7Cit9CisKK3ZvaWQgQnVyeVBvaW50ZXIoY29uc3Qgdm9pZCAqUHRyKSB7CisgIC8vIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBvbmx5IGEgc21hbGwgZml4ZWQgYW1vdW50IG9mIHRpbWVzIHBlciBlYWNoCisgIC8vIGludm9jYXRpb24sIG90aGVyd2lzZSB3ZSBkbyBhY3R1YWxseSBoYXZlIGEgbGVhayB3aGljaCB3ZSB3YW50IHRvIHJlcG9ydC4KKyAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgbW9yZSB0aGFuIGtHcmF2ZVlhcmRNYXhTaXplIHRpbWVzLCB0aGUgcG9pbnRlcnMKKyAgLy8gd2lsbCBub3QgYmUgcHJvcGVybHkgYnVyaWVkIGFuZCBhIGxlYWsgZGV0ZWN0b3Igd2lsbCByZXBvcnQgYSBsZWFrLCB3aGljaAorICAvLyBpcyB3aGF0IHdlIHdhbnQgaW4gc3VjaCBjYXNlLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtHcmF2ZVlhcmRNYXhTaXplID0gMTY7CisgIExMVk1fQVRUUklCVVRFX1VOVVNFRCBzdGF0aWMgY29uc3Qgdm9pZCAqR3JhdmVZYXJkW2tHcmF2ZVlhcmRNYXhTaXplXTsKKyAgc3RhdGljIHN0ZDo6YXRvbWljPHVuc2lnbmVkPiBHcmF2ZVlhcmRTaXplOworICB1bnNpZ25lZCBJZHggPSBHcmF2ZVlhcmRTaXplKys7CisgIGlmIChJZHggPj0ga0dyYXZlWWFyZE1heFNpemUpCisgICAgcmV0dXJuOworICBHcmF2ZVlhcmRbSWR4XSA9IFB0cjsKK30KIH0KZGlmZiAtLWdpdCBhL2xpYi9Gcm9udGVuZC9DcmVhdGVJbnZvY2F0aW9uRnJvbUNvbW1hbmRMaW5lLmNwcCBiL2xpYi9Gcm9udGVuZC9DcmVhdGVJbnZvY2F0aW9uRnJvbUNvbW1hbmRMaW5lLmNwcAppbmRleCA3OGYzOWQ0Li5lZGVkZjlhIDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmQvQ3JlYXRlSW52b2NhdGlvbkZyb21Db21tYW5kTGluZS5jcHAKKysrIGIvbGliL0Zyb250ZW5kL0NyZWF0ZUludm9jYXRpb25Gcm9tQ29tbWFuZExpbmUuY3BwCkBAIC01Miw3ICs1Miw3IEBACiAgIC8vIERvbid0IGNoZWNrIHRoYXQgaW5wdXRzIGV4aXN0LCB0aGV5IG1heSBoYXZlIGJlZW4gcmVtYXBwZWQuCiAgIFRoZURyaXZlci5zZXRDaGVja0lucHV0c0V4aXN0KGZhbHNlKTsKIAotICBPd25pbmdQdHI8ZHJpdmVyOjpDb21waWxhdGlvbj4gQyhUaGVEcml2ZXIuQnVpbGRDb21waWxhdGlvbihBcmdzKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxkcml2ZXI6OkNvbXBpbGF0aW9uPiBDKFRoZURyaXZlci5CdWlsZENvbXBpbGF0aW9uKEFyZ3MpKTsKIAogICAvLyBKdXN0IHByaW50IHRoZSBjYzEgb3B0aW9ucyBpZiAtIyMjIHdhcyBwcmVzZW50LgogICBpZiAoQy0+Z2V0QXJncygpLmhhc0FyZyhkcml2ZXI6Om9wdGlvbnM6Ok9QVF9fSEFTSF9IQVNIX0hBU0gpKSB7CkBAIC03OCwxMiArNzgsMTIgQEAKICAgfQogCiAgIGNvbnN0IEFyZ1N0cmluZ0xpc3QgJkNDQXJncyA9IENtZC0+Z2V0QXJndW1lbnRzKCk7Ci0gIE93bmluZ1B0cjxDb21waWxlckludm9jYXRpb24+IENJKG5ldyBDb21waWxlckludm9jYXRpb24oKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDb21waWxlckludm9jYXRpb24+IENJKG5ldyBDb21waWxlckludm9jYXRpb24oKSk7CiAgIGlmICghQ29tcGlsZXJJbnZvY2F0aW9uOjpDcmVhdGVGcm9tQXJncygqQ0ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjb25zdCBjaGFyICoqPihDQ0FyZ3MuZGF0YSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNvbnN0IGNoYXIgKio+KENDQXJncy5kYXRhKCkpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0FyZ3Muc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpEaWFncykpCiAgICAgcmV0dXJuIDA7Ci0gIHJldHVybiBDSS50YWtlKCk7CisgIHJldHVybiBDSS5yZWxlYXNlKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvRnJvbnRlbmQvRGVwZW5kZW5jeUZpbGUuY3BwIGIvbGliL0Zyb250ZW5kL0RlcGVuZGVuY3lGaWxlLmNwcAppbmRleCA0MDM3YWY5Li5iNDcyZWFhIDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmQvRGVwZW5kZW5jeUZpbGUuY3BwCisrKyBiL2xpYi9Gcm9udGVuZC9EZXBlbmRlbmN5RmlsZS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJjbGFuZy9MZXgvTGV4RGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9QUENhbGxiYWNrcy5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJjbGFuZy9TZXJpYWxpemF0aW9uL0FTVFJlYWRlci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdGguaCIKQEAgLTI4LDcgKzI5LDggQEAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIAogbmFtZXNwYWNlIHsKLWNsYXNzIERlcGVuZGVuY3lGaWxlQ2FsbGJhY2sgOiBwdWJsaWMgUFBDYWxsYmFja3MgeworLy8vIFByaXZhdGUgaW1wbGVtZW50YXRpb24gZm9yIERlcGVuZGVuY3lGaWxlR2VuZXJhdG9yCitjbGFzcyBERkdJbXBsIDogcHVibGljIFBQQ2FsbGJhY2tzIHsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEZpbGVzOwogICBsbHZtOjpTdHJpbmdTZXQ8PiBGaWxlc1NldDsKICAgY29uc3QgUHJlcHJvY2Vzc29yICpQUDsKQEAgLTM4LDU4ICs0MCw4NCBAQAogICBib29sIFBob255VGFyZ2V0OwogICBib29sIEFkZE1pc3NpbmdIZWFkZXJEZXBzOwogICBib29sIFNlZW5NaXNzaW5nSGVhZGVyOworICBib29sIEluY2x1ZGVNb2R1bGVGaWxlczsKIHByaXZhdGU6CiAgIGJvb2wgRmlsZU1hdGNoZXNEZXBDcml0ZXJpYShjb25zdCBjaGFyICpGaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVUeXBlKTsKLSAgdm9pZCBBZGRGaWxlbmFtZShTdHJpbmdSZWYgRmlsZW5hbWUpOwogICB2b2lkIE91dHB1dERlcGVuZGVuY3lGaWxlKCk7CiAKIHB1YmxpYzoKLSAgRGVwZW5kZW5jeUZpbGVDYWxsYmFjayhjb25zdCBQcmVwcm9jZXNzb3IgKl9QUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXBlbmRlbmN5T3V0cHV0T3B0aW9ucyAmT3B0cykKKyAgREZHSW1wbChjb25zdCBQcmVwcm9jZXNzb3IgKl9QUCwgY29uc3QgRGVwZW5kZW5jeU91dHB1dE9wdGlvbnMgJk9wdHMpCiAgICAgOiBQUChfUFApLCBPdXRwdXRGaWxlKE9wdHMuT3V0cHV0RmlsZSksIFRhcmdldHMoT3B0cy5UYXJnZXRzKSwKICAgICAgIEluY2x1ZGVTeXN0ZW1IZWFkZXJzKE9wdHMuSW5jbHVkZVN5c3RlbUhlYWRlcnMpLAogICAgICAgUGhvbnlUYXJnZXQoT3B0cy5Vc2VQaG9ueVRhcmdldHMpLAogICAgICAgQWRkTWlzc2luZ0hlYWRlckRlcHMoT3B0cy5BZGRNaXNzaW5nSGVhZGVyRGVwcyksCi0gICAgICBTZWVuTWlzc2luZ0hlYWRlcihmYWxzZSkge30KKyAgICAgIFNlZW5NaXNzaW5nSGVhZGVyKGZhbHNlKSwKKyAgICAgIEluY2x1ZGVNb2R1bGVGaWxlcyhPcHRzLkluY2x1ZGVNb2R1bGVGaWxlcykge30KIAotICB2aXJ0dWFsIHZvaWQgRmlsZUNoYW5nZWQoU291cmNlTG9jYXRpb24gTG9jLCBGaWxlQ2hhbmdlUmVhc29uIFJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEIFByZXZGSUQpOwotICB2aXJ0dWFsIHZvaWQgSW5jbHVzaW9uRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIEhhc2hMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVG9rZW4gJkluY2x1ZGVUb2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNBbmdsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNvdXJjZVJhbmdlIEZpbGVuYW1lUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZUVudHJ5ICpGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZWFyY2hQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBSZWxhdGl2ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kdWxlICpJbXBvcnRlZCk7CisgIHZvaWQgRmlsZUNoYW5nZWQoU291cmNlTG9jYXRpb24gTG9jLCBGaWxlQ2hhbmdlUmVhc29uIFJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBGaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICBGaWxlSUQgUHJldkZJRCkgb3ZlcnJpZGU7CisgIHZvaWQgSW5jbHVzaW9uRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIEhhc2hMb2MsIGNvbnN0IFRva2VuICZJbmNsdWRlVG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUsIGJvb2wgSXNBbmdsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTb3VyY2VSYW5nZSBGaWxlbmFtZVJhbmdlLCBjb25zdCBGaWxlRW50cnkgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZWFyY2hQYXRoLCBTdHJpbmdSZWYgUmVsYXRpdmVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkltcG9ydGVkKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgRW5kT2ZNYWluRmlsZSgpIHsKKyAgdm9pZCBFbmRPZk1haW5GaWxlKCkgb3ZlcnJpZGUgewogICAgIE91dHB1dERlcGVuZGVuY3lGaWxlKCk7CiAgIH0KKworICB2b2lkIEFkZEZpbGVuYW1lKFN0cmluZ1JlZiBGaWxlbmFtZSk7CisgIGJvb2wgaW5jbHVkZVN5c3RlbUhlYWRlcnMoKSBjb25zdCB7IHJldHVybiBJbmNsdWRlU3lzdGVtSGVhZGVyczsgfQorICBib29sIGluY2x1ZGVNb2R1bGVGaWxlcygpIGNvbnN0IHsgcmV0dXJuIEluY2x1ZGVNb2R1bGVGaWxlczsgfQorfTsKKworY2xhc3MgREZHQVNUUmVhZGVyTGlzdGVuZXIgOiBwdWJsaWMgQVNUUmVhZGVyTGlzdGVuZXIgeworICBERkdJbXBsICZQYXJlbnQ7CitwdWJsaWM6CisgIERGR0FTVFJlYWRlckxpc3RlbmVyKERGR0ltcGwgJlBhcmVudCkKKyAgOiBQYXJlbnQoUGFyZW50KSB7IH0KKyAgYm9vbCBuZWVkc0lucHV0RmlsZVZpc2l0YXRpb24oKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgbmVlZHNTeXN0ZW1JbnB1dEZpbGVWaXNpdGF0aW9uKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBQYXJlbnQuaW5jbHVkZVN5c3RlbUhlYWRlcnMoKTsKKyAgfQorICB2b2lkIHZpc2l0TW9kdWxlRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUpIG92ZXJyaWRlOworICBib29sIHZpc2l0SW5wdXRGaWxlKFN0cmluZ1JlZiBGaWxlbmFtZSwgYm9vbCBpc1N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3ZlcnJpZGRlbikgb3ZlcnJpZGU7CiB9OwogfQogCi12b2lkIGNsYW5nOjpBdHRhY2hEZXBlbmRlbmN5RmlsZUdlbihQcmVwcm9jZXNzb3IgJlBQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVwZW5kZW5jeU91dHB1dE9wdGlvbnMgJk9wdHMpIHsKK0RlcGVuZGVuY3lGaWxlR2VuZXJhdG9yOjpEZXBlbmRlbmN5RmlsZUdlbmVyYXRvcih2b2lkICpJbXBsKQorOiBJbXBsKEltcGwpIHsgfQorCitEZXBlbmRlbmN5RmlsZUdlbmVyYXRvciAqRGVwZW5kZW5jeUZpbGVHZW5lcmF0b3I6OkNyZWF0ZUFuZEF0dGFjaFRvUHJlcHJvY2Vzc29yKAorICAgIGNsYW5nOjpQcmVwcm9jZXNzb3IgJlBQLCBjb25zdCBjbGFuZzo6RGVwZW5kZW5jeU91dHB1dE9wdGlvbnMgJk9wdHMpIHsKKwogICBpZiAoT3B0cy5UYXJnZXRzLmVtcHR5KCkpIHsKICAgICBQUC5nZXREaWFnbm9zdGljcygpLlJlcG9ydChkaWFnOjplcnJfZmVfZGVwZW5kZW5jeV9maWxlX3JlcXVpcmVzX01UKTsKLSAgICByZXR1cm47CisgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAogICAvLyBEaXNhYmxlIHRoZSAiZmlsZSBub3QgZm91bmQiIGRpYWdub3N0aWMgaWYgdGhlIC1NRyBvcHRpb24gd2FzIGdpdmVuLgogICBpZiAoT3B0cy5BZGRNaXNzaW5nSGVhZGVyRGVwcykKICAgICBQUC5TZXRTdXBwcmVzc0luY2x1ZGVOb3RGb3VuZEVycm9yKHRydWUpOwogCi0gIFBQLmFkZFBQQ2FsbGJhY2tzKG5ldyBEZXBlbmRlbmN5RmlsZUNhbGxiYWNrKCZQUCwgT3B0cykpOworICBERkdJbXBsICpDYWxsYmFjayA9IG5ldyBERkdJbXBsKCZQUCwgT3B0cyk7CisgIFBQLmFkZFBQQ2FsbGJhY2tzKENhbGxiYWNrKTsgLy8gUFAgb3ducyB0aGUgQ2FsbGJhY2sKKyAgcmV0dXJuIG5ldyBEZXBlbmRlbmN5RmlsZUdlbmVyYXRvcihDYWxsYmFjayk7Cit9CisKK3ZvaWQgRGVwZW5kZW5jeUZpbGVHZW5lcmF0b3I6OkF0dGFjaFRvQVNUUmVhZGVyKEFTVFJlYWRlciAmUikgeworICBERkdJbXBsICpJID0gcmVpbnRlcnByZXRfY2FzdDxERkdJbXBsICo+KEltcGwpOworICBhc3NlcnQoSSAmJiAibWlzc2luZyBpbXBsZW1lbnRhdGlvbiIpOworICBSLmFkZExpc3RlbmVyKG5ldyBERkdBU1RSZWFkZXJMaXN0ZW5lcigqSSkpOwogfQogCiAvLy8gRmlsZU1hdGNoZXNEZXBDcml0ZXJpYSAtIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBGaWxlbmFtZSBzaG91bGQgYmUKIC8vLyBjb25zaWRlcmVkIGFzIGEgZGVwZW5kZW5jeS4KLWJvb2wgRGVwZW5kZW5jeUZpbGVDYWxsYmFjazo6RmlsZU1hdGNoZXNEZXBDcml0ZXJpYShjb25zdCBjaGFyICpGaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVUeXBlKSB7Citib29sIERGR0ltcGw6OkZpbGVNYXRjaGVzRGVwQ3JpdGVyaWEoY29uc3QgY2hhciAqRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZVR5cGUpIHsKICAgaWYgKHN0cmNtcCgiPGJ1aWx0LWluPiIsIEZpbGVuYW1lKSA9PSAwKQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtOTksMTAgKzEyNywxMCBAQAogICByZXR1cm4gRmlsZVR5cGUgPT0gU3JjTWdyOjpDX1VzZXI7CiB9CiAKLXZvaWQgRGVwZW5kZW5jeUZpbGVDYWxsYmFjazo6RmlsZUNoYW5nZWQoU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlQ2hhbmdlUmVhc29uIFJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJRCBQcmV2RklEKSB7Cit2b2lkIERGR0ltcGw6OkZpbGVDaGFuZ2VkKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUNoYW5nZVJlYXNvbiBSZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgUHJldkZJRCkgewogICBpZiAoUmVhc29uICE9IFBQQ2FsbGJhY2tzOjpFbnRlckZpbGUpCiAgICAgcmV0dXJuOwogCkBAIC0xMzAsMTUgKzE1OCwxNSBAQAogICBBZGRGaWxlbmFtZShGaWxlbmFtZSk7CiB9CiAKLXZvaWQgRGVwZW5kZW5jeUZpbGVDYWxsYmFjazo6SW5jbHVzaW9uRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIEhhc2hMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUb2tlbiAmSW5jbHVkZVRvaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNBbmdsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU291cmNlUmFuZ2UgRmlsZW5hbWVSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZWFyY2hQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlbGF0aXZlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqSW1wb3J0ZWQpIHsKK3ZvaWQgREZHSW1wbDo6SW5jbHVzaW9uRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIEhhc2hMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUb2tlbiAmSW5jbHVkZVRvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNBbmdsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU291cmNlUmFuZ2UgRmlsZW5hbWVSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZWFyY2hQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqSW1wb3J0ZWQpIHsKICAgaWYgKCFGaWxlKSB7CiAgICAgaWYgKEFkZE1pc3NpbmdIZWFkZXJEZXBzKQogICAgICAgQWRkRmlsZW5hbWUoRmlsZU5hbWUpOwpAQCAtMTQ3LDcgKzE3NSw3IEBACiAgIH0KIH0KIAotdm9pZCBEZXBlbmRlbmN5RmlsZUNhbGxiYWNrOjpBZGRGaWxlbmFtZShTdHJpbmdSZWYgRmlsZW5hbWUpIHsKK3ZvaWQgREZHSW1wbDo6QWRkRmlsZW5hbWUoU3RyaW5nUmVmIEZpbGVuYW1lKSB7CiAgIGlmIChGaWxlc1NldC5pbnNlcnQoRmlsZW5hbWUpKQogICAgIEZpbGVzLnB1c2hfYmFjayhGaWxlbmFtZSk7CiB9CkBAIC0xNjQsMTUgKzE5MiwxNCBAQAogICB9CiB9CiAKLXZvaWQgRGVwZW5kZW5jeUZpbGVDYWxsYmFjazo6T3V0cHV0RGVwZW5kZW5jeUZpbGUoKSB7Cit2b2lkIERGR0ltcGw6Ok91dHB1dERlcGVuZGVuY3lGaWxlKCkgewogICBpZiAoU2Vlbk1pc3NpbmdIZWFkZXIpIHsKLSAgICBib29sIGV4aXN0ZWQ7Ci0gICAgbGx2bTo6c3lzOjpmczo6cmVtb3ZlKE91dHB1dEZpbGUsIGV4aXN0ZWQpOworICAgIGxsdm06OnN5czo6ZnM6OnJlbW92ZShPdXRwdXRGaWxlKTsKICAgICByZXR1cm47CiAgIH0KIAogICBzdGQ6OnN0cmluZyBFcnI7Ci0gIGxsdm06OnJhd19mZF9vc3RyZWFtIE9TKE91dHB1dEZpbGUuY19zdHIoKSwgRXJyKTsKKyAgbGx2bTo6cmF3X2ZkX29zdHJlYW0gT1MoT3V0cHV0RmlsZS5jX3N0cigpLCBFcnIsIGxsdm06OnN5czo6ZnM6OkZfVGV4dCk7CiAgIGlmICghRXJyLmVtcHR5KCkpIHsKICAgICBQUC0+Z2V0RGlhZ25vc3RpY3MoKS5SZXBvcnQoZGlhZzo6ZXJyX2ZlX2Vycm9yX29wZW5pbmcpCiAgICAgICA8PCBPdXRwdXRGaWxlIDw8IEVycjsKQEAgLTIzNSwzICsyNjIsMTcgQEAKICAgfQogfQogCitib29sIERGR0FTVFJlYWRlckxpc3RlbmVyOjp2aXNpdElucHV0RmlsZShsbHZtOjpTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU3lzdGVtLCBib29sIElzT3ZlcnJpZGRlbikgeworICBhc3NlcnQoIUlzU3lzdGVtIHx8IG5lZWRzU3lzdGVtSW5wdXRGaWxlVmlzaXRhdGlvbigpKTsKKyAgaWYgKElzT3ZlcnJpZGRlbikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBQYXJlbnQuQWRkRmlsZW5hbWUoRmlsZW5hbWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBERkdBU1RSZWFkZXJMaXN0ZW5lcjo6dmlzaXRNb2R1bGVGaWxlKGxsdm06OlN0cmluZ1JlZiBGaWxlbmFtZSkgeworICBpZiAoUGFyZW50LmluY2x1ZGVNb2R1bGVGaWxlcygpKQorICAgIFBhcmVudC5BZGRGaWxlbmFtZShGaWxlbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvRnJvbnRlbmQvRGVwZW5kZW5jeUdyYXBoLmNwcCBiL2xpYi9Gcm9udGVuZC9EZXBlbmRlbmN5R3JhcGguY3BwCmluZGV4IGUxMjhkOTEuLjRiZmYzZGIgMTAwNjQ0Ci0tLSBhL2xpYi9Gcm9udGVuZC9EZXBlbmRlbmN5R3JhcGguY3BwCisrKyBiL2xpYi9Gcm9udGVuZC9EZXBlbmRlbmN5R3JhcGguY3BwCkBAIC00NiwxNyArNDYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN5c1Jvb3QpCiAgICAgOiBQUChfUFApLCBPdXRwdXRGaWxlKE91dHB1dEZpbGUuc3RyKCkpLCBTeXNSb290KFN5c1Jvb3Quc3RyKCkpIHsgfQogCi0gIHZpcnR1YWwgdm9pZCBJbmNsdXNpb25EaXJlY3RpdmUoU291cmNlTG9jYXRpb24gSGFzaExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUb2tlbiAmSW5jbHVkZVRvaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0FuZ2xlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU291cmNlUmFuZ2UgRmlsZW5hbWVSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRW50cnkgKkZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNlYXJjaFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlbGF0aXZlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkltcG9ydGVkKTsKKyAgdm9pZCBJbmNsdXNpb25EaXJlY3RpdmUoU291cmNlTG9jYXRpb24gSGFzaExvYywgY29uc3QgVG9rZW4gJkluY2x1ZGVUb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwgYm9vbCBJc0FuZ2xlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNvdXJjZVJhbmdlIEZpbGVuYW1lUmFuZ2UsIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNlYXJjaFBhdGgsIFN0cmluZ1JlZiBSZWxhdGl2ZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqSW1wb3J0ZWQpIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBFbmRPZk1haW5GaWxlKCkgeworICB2b2lkIEVuZE9mTWFpbkZpbGUoKSBvdmVycmlkZSB7CiAgICAgT3V0cHV0R3JhcGhGaWxlKCk7CiAgIH0KICAgCkBAIC0xMDEsNyArOTcsNyBAQAogCiB2b2lkIERlcGVuZGVuY3lHcmFwaENhbGxiYWNrOjpPdXRwdXRHcmFwaEZpbGUoKSB7CiAgIHN0ZDo6c3RyaW5nIEVycjsKLSAgbGx2bTo6cmF3X2ZkX29zdHJlYW0gT1MoT3V0cHV0RmlsZS5jX3N0cigpLCBFcnIpOworICBsbHZtOjpyYXdfZmRfb3N0cmVhbSBPUyhPdXRwdXRGaWxlLmNfc3RyKCksIEVyciwgbGx2bTo6c3lzOjpmczo6Rl9UZXh0KTsKICAgaWYgKCFFcnIuZW1wdHkoKSkgewogICAgIFBQLT5nZXREaWFnbm9zdGljcygpLlJlcG9ydChkaWFnOjplcnJfZmVfZXJyb3Jfb3BlbmluZykKICAgICAgIDw8IE91dHB1dEZpbGUgPDwgRXJyOwpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0RpYWdub3N0aWNSZW5kZXJlci5jcHAgYi9saWIvRnJvbnRlbmQvRGlhZ25vc3RpY1JlbmRlcmVyLmNwcAppbmRleCA0ZWVlNTk1Li44NWU4N2EyIDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmQvRGlhZ25vc3RpY1JlbmRlcmVyLmNwcAorKysgYi9saWIvRnJvbnRlbmQvRGlhZ25vc3RpY1JlbmRlcmVyLmNwcApAQCAtNzksMTAgKzc5LDEwIEBACiBwdWJsaWM6CiAgIEZpeGl0UmVjZWl2ZXIoU21hbGxWZWN0b3JJbXBsPEZpeEl0SGludD4gJk1lcmdlZEZpeGl0cykKICAgICA6IE1lcmdlZEZpeGl0cyhNZXJnZWRGaXhpdHMpIHsgfQotICB2aXJ0dWFsIHZvaWQgaW5zZXJ0KFNvdXJjZUxvY2F0aW9uIGxvYywgU3RyaW5nUmVmIHRleHQpIHsKKyAgdm9pZCBpbnNlcnQoU291cmNlTG9jYXRpb24gbG9jLCBTdHJpbmdSZWYgdGV4dCkgb3ZlcnJpZGUgewogICAgIE1lcmdlZEZpeGl0cy5wdXNoX2JhY2soRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24obG9jLCB0ZXh0KSk7CiAgIH0KLSAgdmlydHVhbCB2b2lkIHJlcGxhY2UoQ2hhclNvdXJjZVJhbmdlIHJhbmdlLCBTdHJpbmdSZWYgdGV4dCkgeworICB2b2lkIHJlcGxhY2UoQ2hhclNvdXJjZVJhbmdlIHJhbmdlLCBTdHJpbmdSZWYgdGV4dCkgb3ZlcnJpZGUgewogICAgIE1lcmdlZEZpeGl0cy5wdXNoX2JhY2soRml4SXRIaW50OjpDcmVhdGVSZXBsYWNlbWVudChyYW5nZSwgdGV4dCkpOwogICB9CiB9OwpAQCAtNDk5LDggKzQ5OSwxMSBAQAogICAvLyBHZW5lcmF0ZSBhIG5vdGUgaW5kaWNhdGluZyB0aGUgaW5jbHVkZSBsb2NhdGlvbi4KICAgU21hbGxTdHJpbmc8MjAwPiBNZXNzYWdlU3RvcmFnZTsKICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBNZXNzYWdlKE1lc3NhZ2VTdG9yYWdlKTsKLSAgTWVzc2FnZSA8PCAid2hpbGUgYnVpbGRpbmcgbW9kdWxlICciIDw8IE1vZHVsZU5hbWUgPDwgIicgaW1wb3J0ZWQgZnJvbSAiCi0gICAgICAgICAgPDwgUExvYy5nZXRGaWxlbmFtZSgpIDw8ICc6JyA8PCBQTG9jLmdldExpbmUoKSA8PCAiOiI7CisgIGlmIChQTG9jLmdldEZpbGVuYW1lKCkpCisgICAgTWVzc2FnZSA8PCAid2hpbGUgYnVpbGRpbmcgbW9kdWxlICciIDw8IE1vZHVsZU5hbWUgPDwgIicgaW1wb3J0ZWQgZnJvbSAiCisgICAgICAgICAgICA8PCBQTG9jLmdldEZpbGVuYW1lKCkgPDwgJzonIDw8IFBMb2MuZ2V0TGluZSgpIDw8ICI6IjsKKyAgZWxzZQorICAgIE1lc3NhZ2UgPDwgIndoaWxlIGJ1aWxkaW5nIG1vZHVsZSAnIiA8PCBNb2R1bGVOYW1lIDw8ICI6IjsKICAgZW1pdE5vdGUoTG9jLCBNZXNzYWdlLnN0cigpLCAmU00pOwogfQogCmRpZmYgLS1naXQgYS9saWIvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb24uY3BwIGIvbGliL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9uLmNwcAppbmRleCAwNzVmZTkzLi5kMmVjZTdlIDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb24uY3BwCisrKyBiL2xpYi9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbi5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZFBsdWdpblJlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvTGF5b3V0T3ZlcnJpZGVTb3VyY2UuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9NdWx0aXBsZXhDb25zdW1lci5oIgorI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL1V0aWxzLmgiCiAjaW5jbHVkZSAiY2xhbmcvTGV4L0hlYWRlclNlYXJjaC5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKICNpbmNsdWRlICJjbGFuZy9QYXJzZS9QYXJzZUFTVC5oIgpAQCAtNDIsMjkgKzQzLDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIgKlByZXZpb3VzKQogICAgIDogUHJldmlvdXMoUHJldmlvdXMpIHsgfQogCi0gIHZpcnR1YWwgdm9pZCBSZWFkZXJJbml0aWFsaXplZChBU1RSZWFkZXIgKlJlYWRlcikgeworICB2b2lkIFJlYWRlckluaXRpYWxpemVkKEFTVFJlYWRlciAqUmVhZGVyKSBvdmVycmlkZSB7CiAgICAgaWYgKFByZXZpb3VzKQogICAgICAgUHJldmlvdXMtPlJlYWRlckluaXRpYWxpemVkKFJlYWRlcik7CiAgIH0KLSAgdmlydHVhbCB2b2lkIElkZW50aWZpZXJSZWFkKHNlcmlhbGl6YXRpb246OklkZW50SUQgSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSUkpIHsKKyAgdm9pZCBJZGVudGlmaWVyUmVhZChzZXJpYWxpemF0aW9uOjpJZGVudElEIElELAorICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpJSSkgb3ZlcnJpZGUgewogICAgIGlmIChQcmV2aW91cykKICAgICAgIFByZXZpb3VzLT5JZGVudGlmaWVyUmVhZChJRCwgSUkpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBUeXBlUmVhZChzZXJpYWxpemF0aW9uOjpUeXBlSWR4IElkeCwgUXVhbFR5cGUgVCkgeworICB2b2lkIFR5cGVSZWFkKHNlcmlhbGl6YXRpb246OlR5cGVJZHggSWR4LCBRdWFsVHlwZSBUKSBvdmVycmlkZSB7CiAgICAgaWYgKFByZXZpb3VzKQogICAgICAgUHJldmlvdXMtPlR5cGVSZWFkKElkeCwgVCk7CiAgIH0KLSAgdmlydHVhbCB2b2lkIERlY2xSZWFkKHNlcmlhbGl6YXRpb246OkRlY2xJRCBJRCwgY29uc3QgRGVjbCAqRCkgeworICB2b2lkIERlY2xSZWFkKHNlcmlhbGl6YXRpb246OkRlY2xJRCBJRCwgY29uc3QgRGVjbCAqRCkgb3ZlcnJpZGUgewogICAgIGlmIChQcmV2aW91cykKICAgICAgIFByZXZpb3VzLT5EZWNsUmVhZChJRCwgRCk7CiAgIH0KLSAgdmlydHVhbCB2b2lkIFNlbGVjdG9yUmVhZChzZXJpYWxpemF0aW9uOjpTZWxlY3RvcklEIElELCBTZWxlY3RvciBTZWwpIHsKKyAgdm9pZCBTZWxlY3RvclJlYWQoc2VyaWFsaXphdGlvbjo6U2VsZWN0b3JJRCBJRCwgU2VsZWN0b3IgU2VsKSBvdmVycmlkZSB7CiAgICAgaWYgKFByZXZpb3VzKQogICAgICAgUHJldmlvdXMtPlNlbGVjdG9yUmVhZChJRCwgU2VsKTsKICAgfQotICB2aXJ0dWFsIHZvaWQgTWFjcm9EZWZpbml0aW9uUmVhZChzZXJpYWxpemF0aW9uOjpQcmVwcm9jZXNzZWRFbnRpdHlJRCBQUElELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9EZWZpbml0aW9uICpNRCkgeworICB2b2lkIE1hY3JvRGVmaW5pdGlvblJlYWQoc2VyaWFsaXphdGlvbjo6UHJlcHJvY2Vzc2VkRW50aXR5SUQgUFBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvRGVmaW5pdGlvbiAqTUQpIG92ZXJyaWRlIHsKICAgICBpZiAoUHJldmlvdXMpCiAgICAgICBQcmV2aW91cy0+TWFjcm9EZWZpbml0aW9uUmVhZChQUElELCBNRCk7CiAgIH0KQEAgLTc2LDcgKzc3LDcgQEAKICAgZXhwbGljaXQgRGVzZXJpYWxpemVkRGVjbHNEdW1wZXIoQVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIgKlByZXZpb3VzKQogICAgIDogRGVsZWdhdGluZ0Rlc2VyaWFsaXphdGlvbkxpc3RlbmVyKFByZXZpb3VzKSB7IH0KIAotICB2aXJ0dWFsIHZvaWQgRGVjbFJlYWQoc2VyaWFsaXphdGlvbjo6RGVjbElEIElELCBjb25zdCBEZWNsICpEKSB7CisgIHZvaWQgRGVjbFJlYWQoc2VyaWFsaXphdGlvbjo6RGVjbElEIElELCBjb25zdCBEZWNsICpEKSBvdmVycmlkZSB7CiAgICAgbGx2bTo6b3V0cygpIDw8ICJQQ0ggREVDTDogIiA8PCBELT5nZXREZWNsS2luZE5hbWUoKTsKICAgICBpZiAoY29uc3QgTmFtZWREZWNsICpORCA9IGR5bl9jYXN0PE5hbWVkRGVjbD4oRCkpCiAgICAgICBsbHZtOjpvdXRzKCkgPDwgIiAtICIgPDwgKk5EOwpAQCAtOTksNyArMTAwLDcgQEAKICAgICA6IERlbGVnYXRpbmdEZXNlcmlhbGl6YXRpb25MaXN0ZW5lcihQcmV2aW91cyksCiAgICAgICBDdHgoQ3R4KSwgTmFtZXNUb0NoZWNrKE5hbWVzVG9DaGVjaykgeyB9CiAKLSAgdmlydHVhbCB2b2lkIERlY2xSZWFkKHNlcmlhbGl6YXRpb246OkRlY2xJRCBJRCwgY29uc3QgRGVjbCAqRCkgeworICB2b2lkIERlY2xSZWFkKHNlcmlhbGl6YXRpb246OkRlY2xJRCBJRCwgY29uc3QgRGVjbCAqRCkgb3ZlcnJpZGUgewogICAgIGlmIChjb25zdCBOYW1lZERlY2wgKk5EID0gZHluX2Nhc3Q8TmFtZWREZWNsPihEKSkKICAgICAgIGlmIChOYW1lc1RvQ2hlY2suZmluZChORC0+Z2V0TmFtZUFzU3RyaW5nKCkpICE9IE5hbWVzVG9DaGVjay5lbmQoKSkgewogICAgICAgICB1bnNpZ25lZCBEaWFnSUQKQEAgLTE0Nyw3ICsxNDgsNyBAQAogICAgICAgICBpZSA9IEZyb250ZW5kUGx1Z2luUmVnaXN0cnk6OmVuZCgpOwogICAgICAgICBpdCAhPSBpZTsgKytpdCkgewogICAgICAgaWYgKGl0LT5nZXROYW1lKCkgPT0gQ0kuZ2V0RnJvbnRlbmRPcHRzKCkuQWRkUGx1Z2luQWN0aW9uc1tpXSkgewotICAgICAgICBPd25pbmdQdHI8UGx1Z2luQVNUQWN0aW9uPiBQKGl0LT5pbnN0YW50aWF0ZSgpKTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBsdWdpbkFTVEFjdGlvbj4gUChpdC0+aW5zdGFudGlhdGUoKSk7CiAgICAgICAgIEZyb250ZW5kQWN0aW9uKiBjID0gUC5nZXQoKTsKICAgICAgICAgaWYgKFAtPlBhcnNlQXJncyhDSSwgQ0kuZ2V0RnJvbnRlbmRPcHRzKCkuQWRkUGx1Z2luQXJnc1tpXSkpCiAgICAgICAgICAgQ29uc3VtZXJzLnB1c2hfYmFjayhjLT5DcmVhdGVBU1RDb25zdW1lcihDSSwgSW5GaWxlKSk7CkBAIC0xNTgsNyArMTU5LDYgQEAKICAgcmV0dXJuIG5ldyBNdWx0aXBsZXhDb25zdW1lcihDb25zdW1lcnMpOwogfQogCi0KIGJvb2wgRnJvbnRlbmRBY3Rpb246OkJlZ2luU291cmNlRmlsZShDb21waWxlckluc3RhbmNlICZDSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcm9udGVuZElucHV0RmlsZSAmSW5wdXQpIHsKICAgYXNzZXJ0KCFJbnN0YW5jZSAmJiAiQWxyZWFkeSBwcm9jZXNzaW5nIGEgc291cmNlIGZpbGUhIik7CkBAIC0xODAsNyArMTgwLDcgQEAKICAgICAgICAgICAgIlRoaXMgYWN0aW9uIGRvZXMgbm90IGhhdmUgQVNUIGZpbGUgc3VwcG9ydCEiKTsKIAogICAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljc0VuZ2luZT4gRGlhZ3MoJkNJLmdldERpYWdub3N0aWNzKCkpOwotICAgIHN0ZDo6c3RyaW5nIEVycm9yOworCiAgICAgQVNUVW5pdCAqQVNUID0gQVNUVW5pdDo6TG9hZEZyb21BU1RGaWxlKElucHV0RmlsZSwgRGlhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJLmdldEZpbGVTeXN0ZW1PcHRzKCkpOwogICAgIGlmICghQVNUKQpAQCAtMjExLDYgKzIxMSwzMiBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKKyAgaWYgKCFDSS5nZXRIZWFkZXJTZWFyY2hPcHRzKCkuVkZTT3ZlcmxheUZpbGVzLmVtcHR5KCkpIHsKKyAgICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpPdmVybGF5RmlsZVN5c3RlbT4KKyAgICAgICAgT3ZlcmxheShuZXcgdmZzOjpPdmVybGF5RmlsZVN5c3RlbSh2ZnM6OmdldFJlYWxGaWxlU3lzdGVtKCkpKTsKKyAgICAvLyBlYXJsaWVyIHZmcyBmaWxlcyBhcmUgb24gdGhlIGJvdHRvbQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmRmlsZXMgPQorICAgICAgICBDSS5nZXRIZWFkZXJTZWFyY2hPcHRzKCkuVkZTT3ZlcmxheUZpbGVzOworICAgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBJID0gRmlsZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IEZpbGVzLmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IEJ1ZmZlcjsKKyAgICAgIGlmIChsbHZtOjplcnJjOjpzdWNjZXNzICE9IGxsdm06Ok1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZSgqSSwgQnVmZmVyKSkgeworICAgICAgICBDSS5nZXREaWFnbm9zdGljcygpLlJlcG9ydChkaWFnOjplcnJfbWlzc2luZ192ZnNfb3ZlcmxheV9maWxlKSA8PCAqSTsKKyAgICAgICAgZ290byBmYWlsdXJlOworICAgICAgfQorCisgICAgICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBGUyA9CisgICAgICAgICAgdmZzOjpnZXRWRlNGcm9tWUFNTChCdWZmZXIucmVsZWFzZSgpLCAvKkRpYWdIYW5kbGVyKi8gMCk7CisgICAgICBpZiAoIUZTLmdldFB0cigpKSB7CisgICAgICAgIENJLmdldERpYWdub3N0aWNzKCkuUmVwb3J0KGRpYWc6OmVycl9pbnZhbGlkX3Zmc19vdmVybGF5KSA8PCAqSTsKKyAgICAgICAgZ290byBmYWlsdXJlOworICAgICAgfQorICAgICAgT3ZlcmxheS0+cHVzaE92ZXJsYXkoRlMpOworICAgIH0KKyAgICBDSS5zZXRWaXJ0dWFsRmlsZVN5c3RlbShPdmVybGF5KTsKKyAgfQorCiAgIC8vIFNldCB1cCB0aGUgZmlsZSBhbmQgc291cmNlIG1hbmFnZXJzLCBpZiBuZWVkZWQuCiAgIGlmICghQ0kuaGFzRmlsZU1hbmFnZXIoKSkKICAgICBDSS5jcmVhdGVGaWxlTWFuYWdlcigpOwpAQCAtMjY1LDcgKzI5MSw3IEBACiAgIH0KIAogICAvLyBTZXQgdXAgdGhlIHByZXByb2Nlc3Nvci4KLSAgQ0kuY3JlYXRlUHJlcHJvY2Vzc29yKCk7CisgIENJLmNyZWF0ZVByZXByb2Nlc3NvcihnZXRUcmFuc2xhdGlvblVuaXRLaW5kKCkpOwogCiAgIC8vIEluZm9ybSB0aGUgZGlhZ25vc3RpYyBjbGllbnQgd2UgYXJlIHByb2Nlc3NpbmcgYSBzb3VyY2UgZmlsZS4KICAgQ0kuZ2V0RGlhZ25vc3RpY0NsaWVudCgpLkJlZ2luU291cmNlRmlsZShDSS5nZXRMYW5nT3B0cygpLApAQCAtMjgxLDggKzMwNyw4IEBACiAgIGlmICghdXNlc1ByZXByb2Nlc3Nvck9ubHkoKSkgewogICAgIENJLmNyZWF0ZUFTVENvbnRleHQoKTsKIAotICAgIE93bmluZ1B0cjxBU1RDb25zdW1lcj4gQ29uc3VtZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVdyYXBwZWRBU1RDb25zdW1lcihDSSwgSW5wdXRGaWxlKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEFTVENvbnN1bWVyPiBDb25zdW1lcigKKyAgICAgICAgQ3JlYXRlV3JhcHBlZEFTVENvbnN1bWVyKENJLCBJbnB1dEZpbGUpKTsKICAgICBpZiAoIUNvbnN1bWVyKQogICAgICAgZ290byBmYWlsdXJlOwogCkBAIC0yOTAsMTIgKzMxNiwxMSBAQAogICAgIAogICAgIGlmICghQ0kuZ2V0UHJlcHJvY2Vzc29yT3B0cygpLkNoYWluZWRJbmNsdWRlcy5lbXB0eSgpKSB7CiAgICAgICAvLyBDb252ZXJ0IGhlYWRlcnMgdG8gUENIIGFuZCBjaGFpbiB0aGVtLgotICAgICAgT3duaW5nUHRyPEV4dGVybmFsQVNUU291cmNlPiBzb3VyY2U7Ci0gICAgICBzb3VyY2UucmVzZXQoQ2hhaW5lZEluY2x1ZGVzU291cmNlOjpjcmVhdGUoQ0kpKTsKKyAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxDaGFpbmVkSW5jbHVkZXNTb3VyY2U+IHNvdXJjZTsKKyAgICAgIHNvdXJjZSA9IENoYWluZWRJbmNsdWRlc1NvdXJjZTo6Y3JlYXRlKENJKTsKICAgICAgIGlmICghc291cmNlKQogICAgICAgICBnb3RvIGZhaWx1cmU7Ci0gICAgICBDSS5zZXRNb2R1bGVNYW5hZ2VyKHN0YXRpY19jYXN0PEFTVFJlYWRlcio+KAotICAgICAgICAgJnN0YXRpY19jYXN0PENoYWluZWRJbmNsdWRlc1NvdXJjZSo+KHNvdXJjZS5nZXQoKSktPmdldEZpbmFsUmVhZGVyKCkpKTsKKyAgICAgIENJLnNldE1vZHVsZU1hbmFnZXIoc3RhdGljX2Nhc3Q8QVNUUmVhZGVyKj4oJnNvdXJjZS0+Z2V0RmluYWxSZWFkZXIoKSkpOwogICAgICAgQ0kuZ2V0QVNUQ29udGV4dCgpLnNldEV4dGVybmFsU291cmNlKHNvdXJjZSk7CiAKICAgICB9IGVsc2UgaWYgKCFDSS5nZXRQcmVwcm9jZXNzb3JPcHRzKCkuSW1wbGljaXRQQ0hJbmNsdWRlLmVtcHR5KCkpIHsKQEAgLTMxOCw3ICszNDMsNyBAQAogICAgICAgICBnb3RvIGZhaWx1cmU7CiAgICAgfQogCi0gICAgQ0kuc2V0QVNUQ29uc3VtZXIoQ29uc3VtZXIudGFrZSgpKTsKKyAgICBDSS5zZXRBU1RDb25zdW1lcihDb25zdW1lci5yZWxlYXNlKCkpOwogICAgIGlmICghQ0kuaGFzQVNUQ29uc3VtZXIoKSkKICAgICAgIGdvdG8gZmFpbHVyZTsKICAgfQpAQCAtMzM1LDcgKzM2MCw3IEBACiAgIC8vIHByb3ZpZGVzIHRoZSBsYXlvdXRzIGZyb20gdGhhdCBmaWxlLgogICBpZiAoIUNJLmdldEZyb250ZW5kT3B0cygpLk92ZXJyaWRlUmVjb3JkTGF5b3V0c0ZpbGUuZW1wdHkoKSAmJiAKICAgICAgIENJLmhhc0FTVENvbnRleHQoKSAmJiAhQ0kuZ2V0QVNUQ29udGV4dCgpLmdldEV4dGVybmFsU291cmNlKCkpIHsKLSAgICBPd25pbmdQdHI8RXh0ZXJuYWxBU1RTb3VyY2U+IAorICAgIEludHJ1c2l2ZVJlZkNudFB0cjxFeHRlcm5hbEFTVFNvdXJjZT4gCiAgICAgICBPdmVycmlkZShuZXcgTGF5b3V0T3ZlcnJpZGVTb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgICBDSS5nZXRGcm9udGVuZE9wdHMoKS5PdmVycmlkZVJlY29yZExheW91dHNGaWxlKSk7CiAgICAgQ0kuZ2V0QVNUQ29udGV4dCgpLnNldEV4dGVybmFsU291cmNlKE92ZXJyaWRlKTsKQEAgLTQwMyw5ICs0MjgsOSBAQAogICAvLwogICAvLyBGSVhNRTogVGhlcmUgaXMgbW9yZSBwZXItZmlsZSBzdHVmZiB3ZSBjb3VsZCBqdXN0IGRyb3AgaGVyZT8KICAgaWYgKENJLmdldEZyb250ZW5kT3B0cygpLkRpc2FibGVGcmVlKSB7Ci0gICAgQ0kudGFrZUFTVENvbnN1bWVyKCk7CisgICAgQnVyeVBvaW50ZXIoQ0kudGFrZUFTVENvbnN1bWVyKCkpOwogICAgIGlmICghaXNDdXJyZW50RmlsZUFTVCgpKSB7Ci0gICAgICBDSS50YWtlU2VtYSgpOworICAgICAgQnVyeVBvaW50ZXIoQ0kudGFrZVNlbWEoKSk7CiAgICAgICBDSS5yZXNldEFuZExlYWtBU1RDb250ZXh0KCk7CiAgICAgfQogICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5jcHAgYi9saWIvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmNwcAppbmRleCBhM2FiMWJlLi4yNjU3Yzk4IDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmNwcAorKysgYi9saWIvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmNwcApAQCAtMjEsMTEgKzIxLDExIEBACiAjaW5jbHVkZSAiY2xhbmcvUGFyc2UvUGFyc2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VyaWFsaXphdGlvbi9BU1RSZWFkZXIuaCIKICNpbmNsdWRlICJjbGFuZy9TZXJpYWxpemF0aW9uL0FTVFdyaXRlci5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9zeXN0ZW1fZXJyb3IuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIApAQCAtMTI4LDIxICsxMjgsMzggQEAKICAgcmV0dXJuIEluY2x1ZGVzOwogfQogCi1zdGF0aWMgdm9pZCBhZGRIZWFkZXJJbmNsdWRlKFN0cmluZ1JlZiBIZWFkZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkluY2x1ZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMpIHsKK3N0YXRpYyBsbHZtOjplcnJvcl9jb2RlIGFkZEhlYWRlckluY2x1ZGUoU3RyaW5nUmVmIEhlYWRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmSW5jbHVkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0V4dGVybkMpIHsKKyAgaWYgKElzRXh0ZXJuQyAmJiBMYW5nT3B0cy5DUGx1c1BsdXMpCisgICAgSW5jbHVkZXMgKz0gImV4dGVybiBcIkNcIiB7XG4iOwogICBpZiAoTGFuZ09wdHMuT2JqQzEpCiAgICAgSW5jbHVkZXMgKz0gIiNpbXBvcnQgXCIiOwogICBlbHNlCiAgICAgSW5jbHVkZXMgKz0gIiNpbmNsdWRlIFwiIjsKLSAgSW5jbHVkZXMgKz0gSGVhZGVyTmFtZTsKKyAgLy8gVXNlIGFuIGFic29sdXRlIHBhdGggZm9yIHRoZSBpbmNsdWRlOyB0aGVyZSdzIG5vIHJlYXNvbiB0byB0aGluayB0aGF0CisgIC8vIGEgcmVsYXRpdmUgcGF0aCB3aWxsIHdvcmsgKC4gbWlnaHQgbm90IGJlIG9uIG91ciBpbmNsdWRlIHBhdGgpIG9yIHRoYXQKKyAgLy8gaXQgd2lsbCBmaW5kIHRoZSBzYW1lIGZpbGUuCisgIGlmIChsbHZtOjpzeXM6OnBhdGg6OmlzX2Fic29sdXRlKEhlYWRlck5hbWUpKSB7CisgICAgSW5jbHVkZXMgKz0gSGVhZGVyTmFtZTsKKyAgfSBlbHNlIHsKKyAgICBTbWFsbFN0cmluZzwyNTY+IEhlYWRlciA9IEhlYWRlck5hbWU7CisgICAgaWYgKGxsdm06OmVycm9yX2NvZGUgRXJyID0gbGx2bTo6c3lzOjpmczo6bWFrZV9hYnNvbHV0ZShIZWFkZXIpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICBJbmNsdWRlcyArPSBIZWFkZXI7CisgIH0KICAgSW5jbHVkZXMgKz0gIlwiXG4iOworICBpZiAoSXNFeHRlcm5DICYmIExhbmdPcHRzLkNQbHVzUGx1cykKKyAgICBJbmNsdWRlcyArPSAifVxuIjsKKyAgcmV0dXJuIGxsdm06OmVycm9yX2NvZGU6OnN1Y2Nlc3MoKTsKIH0KIAotc3RhdGljIHZvaWQgYWRkSGVhZGVySW5jbHVkZShjb25zdCBGaWxlRW50cnkgKkhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZJbmNsdWRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzKSB7Ci0gIGFkZEhlYWRlckluY2x1ZGUoSGVhZGVyLT5nZXROYW1lKCksIEluY2x1ZGVzLCBMYW5nT3B0cyk7CitzdGF0aWMgbGx2bTo6ZXJyb3JfY29kZSBhZGRIZWFkZXJJbmNsdWRlKGNvbnN0IEZpbGVFbnRyeSAqSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkluY2x1ZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNFeHRlcm5DKSB7CisgIHJldHVybiBhZGRIZWFkZXJJbmNsdWRlKEhlYWRlci0+Z2V0TmFtZSgpLCBJbmNsdWRlcywgTGFuZ09wdHMsIElzRXh0ZXJuQyk7CiB9CiAKIC8vLyBcYnJpZWYgQ29sbGVjdCB0aGUgc2V0IG9mIGhlYWRlciBpbmNsdWRlcyBuZWVkZWQgdG8gY29uc3RydWN0IHRoZSBnaXZlbiAKQEAgLTE1MiwyMCArMTY5LDIxIEBACiAvLy8KIC8vLyBccGFyYW0gSW5jbHVkZXMgV2lsbCBiZSBhdWdtZW50ZWQgd2l0aCB0aGUgc2V0IG9mIFwjaW5jbHVkZXMgb3IgXCNpbXBvcnRzCiAvLy8gbmVlZGVkIHRvIGxvYWQgYWxsIG9mIHRoZSBuYW1lZCBoZWFkZXJzLgotc3RhdGljIHZvaWQgY29sbGVjdE1vZHVsZUhlYWRlckluY2x1ZGVzKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTWFuYWdlciAmRmlsZU1nciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVNYXAgJk1vZE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFuZzo6TW9kdWxlICpNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZJbmNsdWRlcykgeworc3RhdGljIGxsdm06OmVycm9yX2NvZGUKK2NvbGxlY3RNb2R1bGVIZWFkZXJJbmNsdWRlcyhjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsIEZpbGVNYW5hZ2VyICZGaWxlTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZU1hcCAmTW9kTWFwLCBjbGFuZzo6TW9kdWxlICpNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZJbmNsdWRlcykgewogICAvLyBEb24ndCBjb2xsZWN0IGFueSBoZWFkZXJzIGZvciB1bmF2YWlsYWJsZSBtb2R1bGVzLgogICBpZiAoIU1vZHVsZS0+aXNBdmFpbGFibGUoKSkKLSAgICByZXR1cm47CisgICAgcmV0dXJuIGxsdm06OmVycm9yX2NvZGU6OnN1Y2Nlc3MoKTsKIAogICAvLyBBZGQgaW5jbHVkZXMgZm9yIGVhY2ggb2YgdGhlc2UgaGVhZGVycy4KICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IE1vZHVsZS0+Tm9ybWFsSGVhZGVycy5zaXplKCk7IEkgIT0gTjsgKytJKSB7CiAgICAgY29uc3QgRmlsZUVudHJ5ICpIZWFkZXIgPSBNb2R1bGUtPk5vcm1hbEhlYWRlcnNbSV07CiAgICAgTW9kdWxlLT5hZGRUb3BIZWFkZXIoSGVhZGVyKTsKLSAgICBhZGRIZWFkZXJJbmNsdWRlKEhlYWRlciwgSW5jbHVkZXMsIExhbmdPcHRzKTsKKyAgICBpZiAobGx2bTo6ZXJyb3JfY29kZSBFcnIgPQorICAgICAgICAgICAgYWRkSGVhZGVySW5jbHVkZShIZWFkZXIsIEluY2x1ZGVzLCBMYW5nT3B0cywgTW9kdWxlLT5Jc0V4dGVybkMpKQorICAgICAgcmV0dXJuIEVycjsKICAgfQogICAvLyBOb3RlIHRoYXQgTW9kdWxlLT5Qcml2YXRlSGVhZGVycyB3aWxsIG5vdCBiZSBhIFRvcEhlYWRlci4KIApAQCAtMTczLDcgKzE5MSw5IEBACiAgICAgTW9kdWxlLT5hZGRUb3BIZWFkZXIoVW1icmVsbGFIZWFkZXIpOwogICAgIGlmIChNb2R1bGUtPlBhcmVudCkgewogICAgICAgLy8gSW5jbHVkZSB0aGUgdW1icmVsbGEgaGVhZGVyIGZvciBzdWJtb2R1bGVzLgotICAgICAgYWRkSGVhZGVySW5jbHVkZShVbWJyZWxsYUhlYWRlciwgSW5jbHVkZXMsIExhbmdPcHRzKTsKKyAgICAgIGlmIChsbHZtOjplcnJvcl9jb2RlIEVyciA9IGFkZEhlYWRlckluY2x1ZGUoVW1icmVsbGFIZWFkZXIsIEluY2x1ZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5nT3B0cywgTW9kdWxlLT5Jc0V4dGVybkMpKQorICAgICAgICByZXR1cm4gRXJyOwogICAgIH0KICAgfSBlbHNlIGlmIChjb25zdCBEaXJlY3RvcnlFbnRyeSAqVW1icmVsbGFEaXIgPSBNb2R1bGUtPmdldFVtYnJlbGxhRGlyKCkpIHsKICAgICAvLyBBZGQgYWxsIG9mIHRoZSBoZWFkZXJzIHdlIGZpbmQgaW4gdGhpcyBzdWJkaXJlY3RvcnkuCkBAIC0xOTgsMTYgKzIxOCwyNSBAQAogICAgICAgICBNb2R1bGUtPmFkZFRvcEhlYWRlcihIZWFkZXIpOwogICAgICAgfQogICAgICAgCi0gICAgICAvLyBJbmNsdWRlIHRoaXMgaGVhZGVyIHVtYnJlbGxhIGhlYWRlciBmb3Igc3VibW9kdWxlcy4KLSAgICAgIGFkZEhlYWRlckluY2x1ZGUoRGlyLT5wYXRoKCksIEluY2x1ZGVzLCBMYW5nT3B0cyk7CisgICAgICAvLyBJbmNsdWRlIHRoaXMgaGVhZGVyIGFzIHBhcnQgb2YgdGhlIHVtYnJlbGxhIGRpcmVjdG9yeS4KKyAgICAgIGlmIChsbHZtOjplcnJvcl9jb2RlIEVyciA9IGFkZEhlYWRlckluY2x1ZGUoRGlyLT5wYXRoKCksIEluY2x1ZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5nT3B0cywgTW9kdWxlLT5Jc0V4dGVybkMpKQorICAgICAgICByZXR1cm4gRXJyOwogICAgIH0KKworICAgIGlmIChFQykKKyAgICAgIHJldHVybiBFQzsKICAgfQogICAKICAgLy8gUmVjdXJzZSBpbnRvIHN1Ym1vZHVsZXMuCiAgIGZvciAoY2xhbmc6Ok1vZHVsZTo6c3VibW9kdWxlX2l0ZXJhdG9yIFN1YiA9IE1vZHVsZS0+c3VibW9kdWxlX2JlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YkVuZCA9IE1vZHVsZS0+c3VibW9kdWxlX2VuZCgpOwogICAgICAgIFN1YiAhPSBTdWJFbmQ7ICsrU3ViKQotICAgIGNvbGxlY3RNb2R1bGVIZWFkZXJJbmNsdWRlcyhMYW5nT3B0cywgRmlsZU1nciwgTW9kTWFwLCAqU3ViLCBJbmNsdWRlcyk7CisgICAgaWYgKGxsdm06OmVycm9yX2NvZGUgRXJyID0gY29sbGVjdE1vZHVsZUhlYWRlckluY2x1ZGVzKAorICAgICAgICAgICAgTGFuZ09wdHMsIEZpbGVNZ3IsIE1vZE1hcCwgKlN1YiwgSW5jbHVkZXMpKQorICAgICAgcmV0dXJuIEVycjsKKworICByZXR1cm4gbGx2bTo6ZXJyb3JfY29kZTo6c3VjY2VzcygpOwogfQogCiBib29sIEdlbmVyYXRlTW9kdWxlQWN0aW9uOjpCZWdpblNvdXJjZUZpbGVBY3Rpb24oQ29tcGlsZXJJbnN0YW5jZSAmQ0ksIApAQCAtMjM0LDcgKzI2MywxNSBAQAogICAgIC8vIG1hcCB3aXRoIGEgc2luZ2xlIG1vZHVsZSAodGhlIGNvbW1vbiBjYXNlKS4KICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgCisKKyAgLy8gSWYgd2UncmUgYmVpbmcgcnVuIGZyb20gdGhlIGNvbW1hbmQtbGluZSwgdGhlIG1vZHVsZSBidWlsZCBzdGFjayB3aWxsIG5vdAorICAvLyBoYXZlIGJlZW4gZmlsbGVkIGluIHlldCwgc28gY29tcGxldGUgaXQgbm93IGluIG9yZGVyIHRvIGFsbG93IHVzIHRvIGRldGVjdAorICAvLyBtb2R1bGUgY3ljbGVzLgorICBTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IgPSBDSS5nZXRTb3VyY2VNYW5hZ2VyKCk7CisgIGlmIChTb3VyY2VNZ3IuZ2V0TW9kdWxlQnVpbGRTdGFjaygpLmVtcHR5KCkpCisgICAgU291cmNlTWdyLnB1c2hNb2R1bGVCdWlsZFN0YWNrKENJLmdldExhbmdPcHRzKCkuQ3VycmVudE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVsbFNvdXJjZUxvYyhTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VNZ3IpKTsKKwogICAvLyBEaWcgb3V0IHRoZSBtb2R1bGUgZGVmaW5pdGlvbi4KICAgTW9kdWxlID0gSFMubG9va3VwTW9kdWxlKENJLmdldExhbmdPcHRzKCkuQ3VycmVudE1vZHVsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkFsbG93U2VhcmNoPSovZmFsc2UpOwpAQCAtMjQ3LDEwICsyODQsMTcgQEAKIAogICAvLyBDaGVjayB3aGV0aGVyIHdlIGNhbiBidWlsZCB0aGlzIG1vZHVsZSBhdCBhbGwuCiAgIGNsYW5nOjpNb2R1bGU6OlJlcXVpcmVtZW50IFJlcXVpcmVtZW50OwotICBpZiAoIU1vZHVsZS0+aXNBdmFpbGFibGUoQ0kuZ2V0TGFuZ09wdHMoKSwgQ0kuZ2V0VGFyZ2V0KCksIFJlcXVpcmVtZW50KSkgewotICAgIENJLmdldERpYWdub3N0aWNzKCkuUmVwb3J0KGRpYWc6OmVycl9tb2R1bGVfdW5hdmFpbGFibGUpCi0gICAgICA8PCBNb2R1bGUtPmdldEZ1bGxNb2R1bGVOYW1lKCkKLSAgICAgIDw8IFJlcXVpcmVtZW50LnNlY29uZCA8PCBSZXF1aXJlbWVudC5maXJzdDsKKyAgY2xhbmc6Ok1vZHVsZTo6SGVhZGVyRGlyZWN0aXZlIE1pc3NpbmdIZWFkZXI7CisgIGlmICghTW9kdWxlLT5pc0F2YWlsYWJsZShDSS5nZXRMYW5nT3B0cygpLCBDSS5nZXRUYXJnZXQoKSwgUmVxdWlyZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNzaW5nSGVhZGVyKSkgeworICAgIGlmIChNaXNzaW5nSGVhZGVyLkZpbGVOYW1lTG9jLmlzVmFsaWQoKSkgeworICAgICAgQ0kuZ2V0RGlhZ25vc3RpY3MoKS5SZXBvcnQoZGlhZzo6ZXJyX21vZHVsZV9oZWFkZXJfbWlzc2luZykKKyAgICAgICAgPDwgTWlzc2luZ0hlYWRlci5Jc1VtYnJlbGxhIDw8IE1pc3NpbmdIZWFkZXIuRmlsZU5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIENJLmdldERpYWdub3N0aWNzKCkuUmVwb3J0KGRpYWc6OmVycl9tb2R1bGVfdW5hdmFpbGFibGUpCisgICAgICAgIDw8IE1vZHVsZS0+Z2V0RnVsbE1vZHVsZU5hbWUoKQorICAgICAgICA8PCBSZXF1aXJlbWVudC5zZWNvbmQgPDwgUmVxdWlyZW1lbnQuZmlyc3Q7CisgICAgfQogCiAgICAgcmV0dXJuIGZhbHNlOwogICB9CkBAIC0yNTksMTYgKzMwMywyNiBAQAogCiAgIC8vIENvbGxlY3QgdGhlIHNldCBvZiAjaW5jbHVkZXMgd2UgbmVlZCB0byBidWlsZCB0aGUgbW9kdWxlLgogICBTbWFsbFN0cmluZzwyNTY+IEhlYWRlckNvbnRlbnRzOworICBsbHZtOjplcnJvcl9jb2RlIEVyciA9IGxsdm06OmVycm9yX2NvZGU6OnN1Y2Nlc3MoKTsKICAgaWYgKGNvbnN0IEZpbGVFbnRyeSAqVW1icmVsbGFIZWFkZXIgPSBNb2R1bGUtPmdldFVtYnJlbGxhSGVhZGVyKCkpCi0gICAgYWRkSGVhZGVySW5jbHVkZShVbWJyZWxsYUhlYWRlciwgSGVhZGVyQ29udGVudHMsIENJLmdldExhbmdPcHRzKCkpOwotICBjb2xsZWN0TW9kdWxlSGVhZGVySW5jbHVkZXMoQ0kuZ2V0TGFuZ09wdHMoKSwgRmlsZU1nciwKLSAgICBDSS5nZXRQcmVwcm9jZXNzb3IoKS5nZXRIZWFkZXJTZWFyY2hJbmZvKCkuZ2V0TW9kdWxlTWFwKCksCi0gICAgTW9kdWxlLCBIZWFkZXJDb250ZW50cyk7CisgICAgRXJyID0gYWRkSGVhZGVySW5jbHVkZShVbWJyZWxsYUhlYWRlciwgSGVhZGVyQ29udGVudHMsIENJLmdldExhbmdPcHRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUtPklzRXh0ZXJuQyk7CisgIGlmICghRXJyKQorICAgIEVyciA9IGNvbGxlY3RNb2R1bGVIZWFkZXJJbmNsdWRlcygKKyAgICAgICAgQ0kuZ2V0TGFuZ09wdHMoKSwgRmlsZU1nciwKKyAgICAgICAgQ0kuZ2V0UHJlcHJvY2Vzc29yKCkuZ2V0SGVhZGVyU2VhcmNoSW5mbygpLmdldE1vZHVsZU1hcCgpLCBNb2R1bGUsCisgICAgICAgIEhlYWRlckNvbnRlbnRzKTsKKworICBpZiAoRXJyKSB7CisgICAgQ0kuZ2V0RGlhZ25vc3RpY3MoKS5SZXBvcnQoZGlhZzo6ZXJyX21vZHVsZV9jYW5ub3RfY3JlYXRlX2luY2x1ZGVzKQorICAgICAgPDwgTW9kdWxlLT5nZXRGdWxsTW9kdWxlTmFtZSgpIDw8IEVyci5tZXNzYWdlKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CiAKICAgbGx2bTo6TWVtb3J5QnVmZmVyICpJbnB1dEJ1ZmZlciA9CiAgICAgICBsbHZtOjpNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlckNvcHkoSGVhZGVyQ29udGVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlOjpnZXRNb2R1bGVJbnB1dEJ1ZmZlck5hbWUoKSk7Ci0gIC8vIE93bmVyc2hpcCBvZiBJbnB1dEJ1ZmZlciB3aWxsIGJlIHRyYW5zZmVyZWQgdG8gdGhlIFNvdXJjZU1hbmFnZXIuCisgIC8vIE93bmVyc2hpcCBvZiBJbnB1dEJ1ZmZlciB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBTb3VyY2VNYW5hZ2VyLgogICBzZXRDdXJyZW50SW5wdXQoRnJvbnRlbmRJbnB1dEZpbGUoSW5wdXRCdWZmZXIsIGdldEN1cnJlbnRGaWxlS2luZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlLT5Jc1N5c3RlbSkpOwogICByZXR1cm4gdHJ1ZTsKQEAgLTMxMyw2ICszNjcsMzAgQEAKICAgcmV0dXJuIG5ldyBBU1RDb25zdW1lcigpOwogfQogCitBU1RDb25zdW1lciAqVmVyaWZ5UENIQWN0aW9uOjpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIHsKKyAgcmV0dXJuIG5ldyBBU1RDb25zdW1lcigpOworfQorCit2b2lkIFZlcmlmeVBDSEFjdGlvbjo6RXhlY3V0ZUFjdGlvbigpIHsKKyAgQ29tcGlsZXJJbnN0YW5jZSAmQ0kgPSBnZXRDb21waWxlckluc3RhbmNlKCk7CisgIGJvb2wgUHJlYW1ibGUgPSBDSS5nZXRQcmVwcm9jZXNzb3JPcHRzKCkuUHJlY29tcGlsZWRQcmVhbWJsZUJ5dGVzLmZpcnN0ICE9IDA7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZTeXNyb290ID0gQ0kuZ2V0SGVhZGVyU2VhcmNoT3B0cygpLlN5c3Jvb3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RSZWFkZXI+IFJlYWRlcigKKyAgICAgIG5ldyBBU1RSZWFkZXIoQ0kuZ2V0UHJlcHJvY2Vzc29yKCksIENJLmdldEFTVENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgU3lzcm9vdC5lbXB0eSgpID8gIiIgOiBTeXNyb290LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIC8qRGlzYWJsZVZhbGlkYXRpb24qLyBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLypBbGxvd1BDSFdpdGhDb21waWxlckVycm9ycyovIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAvKkFsbG93Q29uZmlndXJhdGlvbk1pc21hdGNoKi8gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgLypWYWxpZGF0ZVN5c3RlbUlucHV0cyovIHRydWUpKTsKKworICBSZWFkZXItPlJlYWRBU1QoZ2V0Q3VycmVudEZpbGUoKSwKKyAgICAgICAgICAgICAgICAgIFByZWFtYmxlID8gc2VyaWFsaXphdGlvbjo6TUtfUHJlYW1ibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2VyaWFsaXphdGlvbjo6TUtfUENILAorICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgIEFTVFJlYWRlcjo6QVJSX0NvbmZpZ3VyYXRpb25NaXNtYXRjaCk7Cit9CisKIG5hbWVzcGFjZSB7CiAgIC8vLyBcYnJpZWYgQVNUIHJlYWRlciBsaXN0ZW5lciB0aGF0IGR1bXBzIG1vZHVsZSBpbmZvcm1hdGlvbiBmb3IgYSBtb2R1bGUKICAgLy8vIGZpbGUuCkBAIC0zMjUsNyArNDAzLDcgQEAKICNkZWZpbmUgRFVNUF9CT09MRUFOKFZhbHVlLCBUZXh0KSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE91dC5pbmRlbnQoNCkgPDwgVGV4dCA8PCAiOiAiIDw8IChWYWx1ZT8gIlllcyIgOiAiTm8iKSA8PCAiXG4iCiAKLSAgICB2aXJ0dWFsIGJvb2wgUmVhZEZ1bGxWZXJzaW9uSW5mb3JtYXRpb24oU3RyaW5nUmVmIEZ1bGxWZXJzaW9uKSB7CisgICAgYm9vbCBSZWFkRnVsbFZlcnNpb25JbmZvcm1hdGlvbihTdHJpbmdSZWYgRnVsbFZlcnNpb24pIG92ZXJyaWRlIHsKICAgICAgIE91dC5pbmRlbnQoMikKICAgICAgICAgPDwgIkdlbmVyYXRlZCBieSAiCiAgICAgICAgIDw8IChGdWxsVmVyc2lvbiA9PSBnZXRDbGFuZ0Z1bGxSZXBvc2l0b3J5VmVyc2lvbigpPyAidGhpcyIKQEAgLTMzNCw4ICs0MTIsOCBAQAogICAgICAgcmV0dXJuIEFTVFJlYWRlckxpc3RlbmVyOjpSZWFkRnVsbFZlcnNpb25JbmZvcm1hdGlvbihGdWxsVmVyc2lvbik7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIFJlYWRMYW5ndWFnZU9wdGlvbnMoY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIHsKKyAgICBib29sIFJlYWRMYW5ndWFnZU9wdGlvbnMoY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKSBvdmVycmlkZSB7CiAgICAgICBPdXQuaW5kZW50KDIpIDw8ICJMYW5ndWFnZSBvcHRpb25zOlxuIjsKICNkZWZpbmUgTEFOR09QVChOYW1lLCBCaXRzLCBEZWZhdWx0LCBEZXNjcmlwdGlvbikgXAogICAgICAgRFVNUF9CT09MRUFOKExhbmdPcHRzLk5hbWUsIERlc2NyaXB0aW9uKTsKQEAgLTM1MCwxMyArNDI4LDEyIEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIFJlYWRUYXJnZXRPcHRpb25zKGNvbnN0IFRhcmdldE9wdGlvbnMgJlRhcmdldE9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIHsKKyAgICBib29sIFJlYWRUYXJnZXRPcHRpb25zKGNvbnN0IFRhcmdldE9wdGlvbnMgJlRhcmdldE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKSBvdmVycmlkZSB7CiAgICAgICBPdXQuaW5kZW50KDIpIDw8ICJUYXJnZXQgb3B0aW9uczpcbiI7CiAgICAgICBPdXQuaW5kZW50KDQpIDw8ICIgIFRyaXBsZTogIiA8PCBUYXJnZXRPcHRzLlRyaXBsZSA8PCAiXG4iOwogICAgICAgT3V0LmluZGVudCg0KSA8PCAiICBDUFU6ICIgPDwgVGFyZ2V0T3B0cy5DUFUgPDwgIlxuIjsKICAgICAgIE91dC5pbmRlbnQoNCkgPDwgIiAgQUJJOiAiIDw8IFRhcmdldE9wdHMuQUJJIDw8ICJcbiI7Ci0gICAgICBPdXQuaW5kZW50KDQpIDw8ICIgIEMrKyBBQkk6ICIgPDwgVGFyZ2V0T3B0cy5DWFhBQkkgPDwgIlxuIjsKICAgICAgIE91dC5pbmRlbnQoNCkgPDwgIiAgTGlua2VyIHZlcnNpb246ICIgPDwgVGFyZ2V0T3B0cy5MaW5rZXJWZXJzaW9uIDw8ICJcbiI7CiAKICAgICAgIGlmICghVGFyZ2V0T3B0cy5GZWF0dXJlc0FzV3JpdHRlbi5lbXB0eSgpKSB7CkBAIC0zNzAsOCArNDQ3LDggQEAKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wgUmVhZEhlYWRlclNlYXJjaE9wdGlvbnMoY29uc3QgSGVhZGVyU2VhcmNoT3B0aW9ucyAmSFNPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKSB7CisgICAgYm9vbCBSZWFkSGVhZGVyU2VhcmNoT3B0aW9ucyhjb25zdCBIZWFkZXJTZWFyY2hPcHRpb25zICZIU09wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKSBvdmVycmlkZSB7CiAgICAgICBPdXQuaW5kZW50KDIpIDw8ICJIZWFkZXIgc2VhcmNoIG9wdGlvbnM6XG4iOwogICAgICAgT3V0LmluZGVudCg0KSA8PCAiU3lzdGVtIHJvb3QgWy1pc3lzcm9vdD1dOiAnIiA8PCBIU09wdHMuU3lzcm9vdCA8PCAiJ1xuIjsKICAgICAgIERVTVBfQk9PTEVBTihIU09wdHMuVXNlQnVpbHRpbkluY2x1ZGVzLApAQCAtMzg1LDkgKzQ2Miw5IEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIFJlYWRQcmVwcm9jZXNzb3JPcHRpb25zKGNvbnN0IFByZXByb2Nlc3Nvck9wdGlvbnMgJlBQT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlN1Z2dlc3RlZFByZWRlZmluZXMpIHsKKyAgICBib29sIFJlYWRQcmVwcm9jZXNzb3JPcHRpb25zKGNvbnN0IFByZXByb2Nlc3Nvck9wdGlvbnMgJlBQT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmU3VnZ2VzdGVkUHJlZGVmaW5lcykgb3ZlcnJpZGUgewogICAgICAgT3V0LmluZGVudCgyKSA8PCAiUHJlcHJvY2Vzc29yIG9wdGlvbnM6XG4iOwogICAgICAgRFVNUF9CT09MRUFOKFBQT3B0cy5Vc2VQcmVkZWZpbmVzLAogICAgICAgICAgICAgICAgICAgICJVc2VzIGNvbXBpbGVyL3RhcmdldC1zcGVjaWZpYyBwcmVkZWZpbmVzIFstdW5kZWZdIik7CkBAIC00MTYsMTIgKzQ5MywxMiBAQAogCiB2b2lkIER1bXBNb2R1bGVJbmZvQWN0aW9uOjpFeGVjdXRlQWN0aW9uKCkgewogICAvLyBTZXQgdXAgdGhlIG91dHB1dCBmaWxlLgotICBsbHZtOjpPd25pbmdQdHI8bGx2bTo6cmF3X2ZkX29zdHJlYW0+IE91dEZpbGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpyYXdfZmRfb3N0cmVhbT4gT3V0RmlsZTsKICAgU3RyaW5nUmVmIE91dHB1dEZpbGVOYW1lID0gZ2V0Q29tcGlsZXJJbnN0YW5jZSgpLmdldEZyb250ZW5kT3B0cygpLk91dHB1dEZpbGU7CiAgIGlmICghT3V0cHV0RmlsZU5hbWUuZW1wdHkoKSAmJiBPdXRwdXRGaWxlTmFtZSAhPSAiLSIpIHsKICAgICBzdGQ6OnN0cmluZyBFcnJvckluZm87CiAgICAgT3V0RmlsZS5yZXNldChuZXcgbGx2bTo6cmF3X2ZkX29zdHJlYW0oT3V0cHV0RmlsZU5hbWUuc3RyKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckluZm8sIGxsdm06OnN5czo6ZnM6OkZfVGV4dCkpOwogICB9CiAgIGxsdm06OnJhd19vc3RyZWFtICZPdXQgPSBPdXRGaWxlLmdldCgpPyAqT3V0RmlsZS5nZXQoKSA6IGxsdm06Om91dHMoKTsKIApkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0hlYWRlckluY2x1ZGVHZW4uY3BwIGIvbGliL0Zyb250ZW5kL0hlYWRlckluY2x1ZGVHZW4uY3BwCmluZGV4IDIzN2U1YjEuLjZkMmUzNzggMTAwNjQ0Ci0tLSBhL2xpYi9Gcm9udGVuZC9IZWFkZXJJbmNsdWRlR2VuLmNwcAorKysgYi9saWIvRnJvbnRlbmQvSGVhZGVySW5jbHVkZUdlbi5jcHAKQEAgLTQwLDkgKzQwLDkgQEAKICAgICAgIGRlbGV0ZSBPdXRwdXRGaWxlOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIEZpbGVDaGFuZ2VkKFNvdXJjZUxvY2F0aW9uIExvYywgRmlsZUNoYW5nZVJlYXNvbiBSZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJRCBQcmV2RklEKTsKKyAgdm9pZCBGaWxlQ2hhbmdlZChTb3VyY2VMb2NhdGlvbiBMb2MsIEZpbGVDaGFuZ2VSZWFzb24gUmVhc29uLAorICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgIEZpbGVJRCBQcmV2RklEKSBvdmVycmlkZTsKIH07CiB9CiAKQEAgLTU2LDcgKzU2LDggQEAKICAgaWYgKCFPdXRwdXRQYXRoLmVtcHR5KCkpIHsKICAgICBzdGQ6OnN0cmluZyBFcnJvcjsKICAgICBsbHZtOjpyYXdfZmRfb3N0cmVhbSAqT1MgPSBuZXcgbGx2bTo6cmF3X2ZkX29zdHJlYW0oCi0gICAgICAgIE91dHB1dFBhdGguc3RyKCkuY19zdHIoKSwgRXJyb3IsIGxsdm06OnN5czo6ZnM6OkZfQXBwZW5kKTsKKyAgICAgICAgT3V0cHV0UGF0aC5zdHIoKS5jX3N0cigpLCBFcnJvciwKKyAgICAgICAgbGx2bTo6c3lzOjpmczo6Rl9BcHBlbmQgfCBsbHZtOjpzeXM6OmZzOjpGX1RleHQpOwogICAgIGlmICghRXJyb3IuZW1wdHkoKSkgewogICAgICAgUFAuZ2V0RGlhZ25vc3RpY3MoKS5SZXBvcnQoCiAgICAgICAgIGNsYW5nOjpkaWFnOjp3YXJuX2ZlX2NjX3ByaW50X2hlYWRlcl9mYWlsdXJlKSA8PCBFcnJvcjsKZGlmZiAtLWdpdCBhL2xpYi9Gcm9udGVuZC9Jbml0SGVhZGVyU2VhcmNoLmNwcCBiL2xpYi9Gcm9udGVuZC9Jbml0SGVhZGVyU2VhcmNoLmNwcAppbmRleCBkMTQ0Y2JiLi4zNGMwMWI0IDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmQvSW5pdEhlYWRlclNlYXJjaC5jcHAKKysrIGIvbGliL0Zyb250ZW5kL0luaXRIZWFkZXJTZWFyY2guY3BwCkBAIC0xMTAsNyArMTEwLDcgQEAKIH0gIC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlLgogCiBzdGF0aWMgYm9vbCBDYW5QcmVmaXhTeXNyb290KFN0cmluZ1JlZiBQYXRoKSB7Ci0jaWYgZGVmaW5lZChfV0lOMzIpCisjaWYgZGVmaW5lZChMTFZNX09OX1dJTjMyKQogICByZXR1cm4gIVBhdGguZW1wdHkoKSAmJiBsbHZtOjpzeXM6OnBhdGg6OmlzX3NlcGFyYXRvcihQYXRoWzBdKTsKICNlbHNlCiAgIHJldHVybiBsbHZtOjpzeXM6OnBhdGg6OmlzX2Fic29sdXRlKFBhdGgpOwpAQCAtMjY4LDcgKzI2OCw2IEBACiAKICAgc3dpdGNoIChvcykgewogICBjYXNlIGxsdm06OlRyaXBsZTo6TGludXg6Ci0gIGNhc2UgbGx2bTo6VHJpcGxlOjpXaW4zMjoKICAgICBsbHZtX3VucmVhY2hhYmxlKCJJbmNsdWRlIG1hbmFnZW1lbnQgaXMgaGFuZGxlZCBpbiB0aGUgZHJpdmVyLiIpOwogCiAgIGNhc2UgbGx2bTo6VHJpcGxlOjpIYWlrdToKQEAgLTMwNywxMCArMzA2LDEzIEBACiAgICAgYnJlYWs7CiAgIGNhc2UgbGx2bTo6VHJpcGxlOjpSVEVNUzoKICAgICBicmVhazsKLSAgY2FzZSBsbHZtOjpUcmlwbGU6OkN5Z3dpbjoKLSAgICBBZGRQYXRoKCIvdXNyL2luY2x1ZGUvdzMyYXBpIiwgU3lzdGVtLCBmYWxzZSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgbGx2bTo6VHJpcGxlOjpNaW5HVzMyOiB7IAorICBjYXNlIGxsdm06OlRyaXBsZTo6V2luMzI6CisgICAgc3dpdGNoICh0cmlwbGUuZ2V0RW52aXJvbm1lbnQoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIkluY2x1ZGUgbWFuYWdlbWVudCBpcyBoYW5kbGVkIGluIHRoZSBkcml2ZXIuIik7CisgICAgY2FzZSBsbHZtOjpUcmlwbGU6OkN5Z251czoKKyAgICAgIEFkZFBhdGgoIi91c3IvaW5jbHVkZS93MzJhcGkiLCBTeXN0ZW0sIGZhbHNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbGx2bTo6VHJpcGxlOjpHTlU6CiAgICAgICAvLyBtaW5ndy13NjQgY3J0IGluY2x1ZGUgcGF0aHMKICAgICAgIC8vIDxzeXNyb290Pi9pNjg2LXc2NC1taW5ndzMyL2luY2x1ZGUKICAgICAgIFNtYWxsU3RyaW5nPDEyOD4gUCA9IFN0cmluZ1JlZihIU09wdHMuUmVzb3VyY2VEaXIpOwpAQCAtMzI4LDEyICszMzAsMTIgQEAKICAgICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKFAsICIuLi8uLi8uLi9pbmNsdWRlIik7CiAgICAgICBBZGRQYXRoKFAuc3RyKCksIFN5c3RlbSwgZmFsc2UpOwogICAgICAgQWRkUGF0aCgiL21pbmd3L2luY2x1ZGUiLCBTeXN0ZW0sIGZhbHNlKTsKLSNpZiBkZWZpbmVkKF9XSU4zMikKKyNpZiBkZWZpbmVkKExMVk1fT05fV0lOMzIpCiAgICAgICBBZGRQYXRoKCJjOi9taW5ndy9pbmNsdWRlIiwgU3lzdGVtLCBmYWxzZSk7IAogI2VuZGlmCisgICAgICBicmVhazsKICAgICB9CiAgICAgYnJlYWs7Ci0gICAgICAKICAgZGVmYXVsdDoKICAgICBicmVhazsKICAgfQpAQCAtMzc2LDU4ICszNzgsNTcgQEAKICAgICAgIEFkZEdudUNQbHVzUGx1c0luY2x1ZGVQYXRocygiL3Vzci9pbmNsdWRlL2MrKy80LjIuMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFybS1hcHBsZS1kYXJ3aW4xMCIsICJ2NiIsICIiLCB0cmlwbGUpOwogICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6YXJtNjQ6CisgICAgICBBZGRHbnVDUGx1c1BsdXNJbmNsdWRlUGF0aHMoIi91c3IvaW5jbHVkZS9jKysvNC4yLjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcm02NC1hcHBsZS1kYXJ3aW4xMCIsICIiLCAiIiwgdHJpcGxlKTsKKyAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm47CiAgIH0KIAogICBzd2l0Y2ggKG9zKSB7CiAgIGNhc2UgbGx2bTo6VHJpcGxlOjpMaW51eDoKLSAgY2FzZSBsbHZtOjpUcmlwbGU6OldpbjMyOgogICAgIGxsdm1fdW5yZWFjaGFibGUoIkluY2x1ZGUgbWFuYWdlbWVudCBpcyBoYW5kbGVkIGluIHRoZSBkcml2ZXIuIik7CiAKLSAgY2FzZSBsbHZtOjpUcmlwbGU6OkN5Z3dpbjoKLSAgICAvLyBDeWd3aW4tMS43Ci0gICAgQWRkTWluR1dDUGx1c1BsdXNJbmNsdWRlUGF0aHMoIi91c3IvbGliL2djYyIsICJpNjg2LXBjLWN5Z3dpbiIsICI0LjcuMyIpOwotICAgIEFkZE1pbkdXQ1BsdXNQbHVzSW5jbHVkZVBhdGhzKCIvdXNyL2xpYi9nY2MiLCAiaTY4Ni1wYy1jeWd3aW4iLCAiNC41LjMiKTsKLSAgICBBZGRNaW5HV0NQbHVzUGx1c0luY2x1ZGVQYXRocygiL3Vzci9saWIvZ2NjIiwgImk2ODYtcGMtY3lnd2luIiwgIjQuMy40Iik7Ci0gICAgLy8gZysrLTQgLyBDeWd3aW4tMS41Ci0gICAgQWRkTWluR1dDUGx1c1BsdXNJbmNsdWRlUGF0aHMoIi91c3IvbGliL2djYyIsICJpNjg2LXBjLWN5Z3dpbiIsICI0LjMuMiIpOwotICAgIGJyZWFrOwotICBjYXNlIGxsdm06OlRyaXBsZTo6TWluR1czMjoKLSAgICAvLyBtaW5ndy13NjQgQysrIGluY2x1ZGUgcGF0aHMgKGk2ODYtdzY0LW1pbmd3MzIgYW5kIHg4Nl82NC13NjQtbWluZ3czMikKLSAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC41LjAiKTsKLSAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC41LjEiKTsKLSAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC41LjIiKTsKLSAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC41LjMiKTsKLSAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC41LjQiKTsKLSAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC42LjAiKTsKLSAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC42LjEiKTsKLSAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC42LjIiKTsKLSAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC42LjMiKTsKLSAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC43LjAiKTsKLSAgICAvLyBtaW5ndy5vcmcgQysrIGluY2x1ZGUgcGF0aHMKLSAgICBBZGRNaW5HV0NQbHVzUGx1c0luY2x1ZGVQYXRocygiL21pbmd3L2xpYi9nY2MiLCAibWluZ3czMiIsICI0LjUuMiIpOyAvL01TWVMKLSNpZiBkZWZpbmVkKF9XSU4zMikKLSAgICBBZGRNaW5HV0NQbHVzUGx1c0luY2x1ZGVQYXRocygiYzovTWluR1cvbGliL2djYyIsICJtaW5ndzMyIiwgIjQuOC4xIik7Ci0gICAgQWRkTWluR1dDUGx1c1BsdXNJbmNsdWRlUGF0aHMoImM6L01pbkdXL2xpYi9nY2MiLCAibWluZ3czMiIsICI0LjYuMiIpOwotICAgIEFkZE1pbkdXQ1BsdXNQbHVzSW5jbHVkZVBhdGhzKCJjOi9NaW5HVy9saWIvZ2NjIiwgIm1pbmd3MzIiLCAiNC42LjEiKTsKLSAgICBBZGRNaW5HV0NQbHVzUGx1c0luY2x1ZGVQYXRocygiYzovTWluR1cvbGliL2djYyIsICJtaW5ndzMyIiwgIjQuNS4yIik7Ci0gICAgQWRkTWluR1dDUGx1c1BsdXNJbmNsdWRlUGF0aHMoImM6L01pbkdXL2xpYi9nY2MiLCAibWluZ3czMiIsICI0LjUuMCIpOwotICAgIEFkZE1pbkdXQ1BsdXNQbHVzSW5jbHVkZVBhdGhzKCJjOi9NaW5HVy9saWIvZ2NjIiwgIm1pbmd3MzIiLCAiNC40LjAiKTsKLSAgICBBZGRNaW5HV0NQbHVzUGx1c0luY2x1ZGVQYXRocygiYzovTWluR1cvbGliL2djYyIsICJtaW5ndzMyIiwgIjQuMy4wIik7CisgIGNhc2UgbGx2bTo6VHJpcGxlOjpXaW4zMjoKKyAgICBzd2l0Y2ggKHRyaXBsZS5nZXRFbnZpcm9ubWVudCgpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW5jbHVkZSBtYW5hZ2VtZW50IGlzIGhhbmRsZWQgaW4gdGhlIGRyaXZlci4iKTsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6Q3lnbnVzOgorICAgICAgLy8gQ3lnd2luLTEuNworICAgICAgQWRkTWluR1dDUGx1c1BsdXNJbmNsdWRlUGF0aHMoIi91c3IvbGliL2djYyIsICJpNjg2LXBjLWN5Z3dpbiIsICI0LjcuMyIpOworICAgICAgQWRkTWluR1dDUGx1c1BsdXNJbmNsdWRlUGF0aHMoIi91c3IvbGliL2djYyIsICJpNjg2LXBjLWN5Z3dpbiIsICI0LjUuMyIpOworICAgICAgQWRkTWluR1dDUGx1c1BsdXNJbmNsdWRlUGF0aHMoIi91c3IvbGliL2djYyIsICJpNjg2LXBjLWN5Z3dpbiIsICI0LjMuNCIpOworICAgICAgLy8gZysrLTQgLyBDeWd3aW4tMS41CisgICAgICBBZGRNaW5HV0NQbHVzUGx1c0luY2x1ZGVQYXRocygiL3Vzci9saWIvZ2NjIiwgImk2ODYtcGMtY3lnd2luIiwgIjQuMy4yIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGxsdm06OlRyaXBsZTo6R05VOgorICAgICAgLy8gbWluZ3ctdzY0IEMrKyBpbmNsdWRlIHBhdGhzIChpNjg2LXc2NC1taW5ndzMyIGFuZCB4ODZfNjQtdzY0LW1pbmd3MzIpCisgICAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC43LjAiKTsKKyAgICAgIEFkZE1pbkdXNjRDWFhQYXRocyhIU09wdHMuUmVzb3VyY2VEaXIsICI0LjcuMSIpOworICAgICAgQWRkTWluR1c2NENYWFBhdGhzKEhTT3B0cy5SZXNvdXJjZURpciwgIjQuNy4yIik7CisgICAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC43LjMiKTsKKyAgICAgIEFkZE1pbkdXNjRDWFhQYXRocyhIU09wdHMuUmVzb3VyY2VEaXIsICI0LjguMCIpOworICAgICAgQWRkTWluR1c2NENYWFBhdGhzKEhTT3B0cy5SZXNvdXJjZURpciwgIjQuOC4xIik7CisgICAgICBBZGRNaW5HVzY0Q1hYUGF0aHMoSFNPcHRzLlJlc291cmNlRGlyLCAiNC44LjIiKTsKKyAgICAgIC8vIG1pbmd3Lm9yZyBDKysgaW5jbHVkZSBwYXRocworI2lmIGRlZmluZWQoTExWTV9PTl9XSU4zMikKKyAgICAgIEFkZE1pbkdXQ1BsdXNQbHVzSW5jbHVkZVBhdGhzKCJjOi9NaW5HVy9saWIvZ2NjIiwgIm1pbmd3MzIiLCAiNC43LjAiKTsKKyAgICAgIEFkZE1pbkdXQ1BsdXNQbHVzSW5jbHVkZVBhdGhzKCJjOi9NaW5HVy9saWIvZ2NjIiwgIm1pbmd3MzIiLCAiNC43LjEiKTsKKyAgICAgIEFkZE1pbkdXQ1BsdXNQbHVzSW5jbHVkZVBhdGhzKCJjOi9NaW5HVy9saWIvZ2NjIiwgIm1pbmd3MzIiLCAiNC43LjIiKTsKKyAgICAgIEFkZE1pbkdXQ1BsdXNQbHVzSW5jbHVkZVBhdGhzKCJjOi9NaW5HVy9saWIvZ2NjIiwgIm1pbmd3MzIiLCAiNC43LjMiKTsKKyAgICAgIEFkZE1pbkdXQ1BsdXNQbHVzSW5jbHVkZVBhdGhzKCJjOi9NaW5HVy9saWIvZ2NjIiwgIm1pbmd3MzIiLCAiNC44LjAiKTsKKyAgICAgIEFkZE1pbkdXQ1BsdXNQbHVzSW5jbHVkZVBhdGhzKCJjOi9NaW5HVy9saWIvZ2NjIiwgIm1pbmd3MzIiLCAiNC44LjEiKTsKKyAgICAgIEFkZE1pbkdXQ1BsdXNQbHVzSW5jbHVkZVBhdGhzKCJjOi9NaW5HVy9saWIvZ2NjIiwgIm1pbmd3MzIiLCAiNC44LjIiKTsKICNlbmRpZgotICAgIGJyZWFrOworICAgICAgYnJlYWs7CisgICAgfQogICBjYXNlIGxsdm06OlRyaXBsZTo6RHJhZ29uRmx5OgogICAgIGlmIChsbHZtOjpzeXM6OmZzOjpleGlzdHMoIi91c3IvbGliL2djYzQ3IikpCiAgICAgICBBZGRQYXRoKCIvdXNyL2luY2x1ZGUvYysrLzQuNyIsIENYWFN5c3RlbSwgZmFsc2UpOwogICAgIGVsc2UKICAgICAgIEFkZFBhdGgoIi91c3IvaW5jbHVkZS9jKysvNC40IiwgQ1hYU3lzdGVtLCBmYWxzZSk7CiAgICAgYnJlYWs7Ci0gIGNhc2UgbGx2bTo6VHJpcGxlOjpGcmVlQlNEOgotICAgIC8vIEZyZWVCU0QgOC4wCi0gICAgLy8gRnJlZUJTRCA3LjMKLSAgICBBZGRHbnVDUGx1c1BsdXNJbmNsdWRlUGF0aHMoIi91c3IvaW5jbHVkZS9jKysvNC4yIiwgIiIsICIiLCAiIiwgdHJpcGxlKTsKLSAgICBicmVhazsKICAgY2FzZSBsbHZtOjpUcmlwbGU6Ok9wZW5CU0Q6IHsKICAgICBzdGQ6OnN0cmluZyB0ID0gdHJpcGxlLmdldFRyaXBsZSgpOwogICAgIGlmICh0LnN1YnN0cigwLCA2KSA9PSAieDg2XzY0IikKQEAgLTQ2Niw4ICs0NjcsMTMgQEAKICAgICBicmVhazsgLy8gRXZlcnl0aGluZyBlbHNlIGNvbnRpbnVlcyB0byB1c2UgdGhpcyByb3V0aW5lJ3MgbG9naWMuCiAKICAgY2FzZSBsbHZtOjpUcmlwbGU6OkxpbnV4OgotICBjYXNlIGxsdm06OlRyaXBsZTo6V2luMzI6CiAgICAgcmV0dXJuOworCisgIGNhc2UgbGx2bTo6VHJpcGxlOjpXaW4zMjoKKyAgICBpZiAodHJpcGxlLmdldEVudmlyb25tZW50KCkgPT0gbGx2bTo6VHJpcGxlOjpNU1ZDIHx8CisgICAgICAgIHRyaXBsZS5nZXRFbnZpcm9ubWVudCgpID09IGxsdm06OlRyaXBsZTo6SXRhbml1bSkKKyAgICAgIHJldHVybjsKKyAgICBicmVhazsKICAgfQogCiAgIGlmIChMYW5nLkNQbHVzUGx1cyAmJiBIU09wdHMuVXNlU3RhbmRhcmRDWFhJbmNsdWRlcyAmJgpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0luaXRQcmVwcm9jZXNzb3IuY3BwIGIvbGliL0Zyb250ZW5kL0luaXRQcmVwcm9jZXNzb3IuY3BwCmluZGV4IGM3ZDI1NTAuLjc2MWRiYTQgMTAwNjQ0Ci0tLSBhL2xpYi9Gcm9udGVuZC9Jbml0UHJlcHJvY2Vzc29yLmNwcAorKysgYi9saWIvRnJvbnRlbmQvSW5pdFByZXByb2Nlc3Nvci5jcHAKQEAgLTMwMCw3ICszMDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyb250ZW5kT3B0aW9ucyAmRkVPcHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0J1aWxkZXIgJkJ1aWxkZXIpIHsKLSAgaWYgKCFMYW5nT3B0cy5NaWNyb3NvZnRNb2RlICYmICFMYW5nT3B0cy5UcmFkaXRpb25hbENQUCkKKyAgaWYgKCFMYW5nT3B0cy5NU1ZDQ29tcGF0ICYmICFMYW5nT3B0cy5UcmFkaXRpb25hbENQUCkKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX1NURENfXyIpOwogICBpZiAoTGFuZ09wdHMuRnJlZXN0YW5kaW5nKQogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fU1REQ19IT1NURURfXyIsICIwIik7CkBAIC0zMTUsOSArMzE1LDExIEBACiAgICAgZWxzZSBpZiAoIUxhbmdPcHRzLkdOVU1vZGUgJiYgTGFuZ09wdHMuRGlncmFwaHMpCiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX1NURENfVkVSU0lPTl9fIiwgIjE5OTQwOUwiKTsKICAgfSBlbHNlIHsKLSAgICAvLyBGSVhNRTogVXNlIHRoZSByaWdodCB2YWx1ZSBmb3IgX19jcGx1c3BsdXMgZm9yIEMrKzF5IG9uY2Ugb25lIGlzIGNob3Nlbi4KLSAgICBpZiAoTGFuZ09wdHMuQ1BsdXNQbHVzMXkpCi0gICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX2NwbHVzcGx1cyIsICIyMDEzMDVMIik7CisgICAgLy8gQysrMXkgW2NwcC5wcmVkZWZpbmVkXXAxOgorICAgIC8vICAgVGhlIG5hbWUgX19jcGx1c3BsdXMgaXMgZGVmaW5lZCB0byB0aGUgdmFsdWUgMjAxNDAyTCB3aGVuIGNvbXBpbGluZyBhCisgICAgLy8gICBDKysgdHJhbnNsYXRpb24gdW5pdC4KKyAgICAgaWYgKExhbmdPcHRzLkNQbHVzUGx1czF5KQorICAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19jcGx1c3BsdXMiLCAiMjAxNDAyTCIpOwogICAgIC8vIEMrKzExIFtjcHAucHJlZGVmaW5lZF1wMToKICAgICAvLyAgIFRoZSBuYW1lIF9fY3BsdXNwbHVzIGlzIGRlZmluZWQgdG8gdGhlIHZhbHVlIDIwMTEwM0wgd2hlbiBjb21waWxpbmcgYQogICAgIC8vICAgQysrIHRyYW5zbGF0aW9uIHVuaXQuCkBAIC0zOTksNyArNDAxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICArIGdldENsYW5nRnVsbFJlcG9zaXRvcnlWZXJzaW9uKCkgKyAiXCIiKTsKICN1bmRlZiBUT1NUUgogI3VuZGVmIFRPU1RSMgotICBpZiAoIUxhbmdPcHRzLk1pY3Jvc29mdE1vZGUpIHsKKyAgaWYgKCFMYW5nT3B0cy5NU1ZDQ29tcGF0KSB7CiAgICAgLy8gQ3VycmVudGx5IGNsYWltIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBHQ0MgNC4yLjEtNTYyMSwgYnV0IG9ubHkgaWYgd2UncmUKICAgICAvLyBub3QgY29tcGlsaW5nIGZvciBNU1ZDIGNvbXBhdGliaWxpdHkKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0dOVUNfTUlOT1JfXyIsICIyIik7CkBAIC01MTUsMTEgKzUxNyw2IEBACiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfV0NIQVJfVF9ERUZJTkVEIik7CiAgICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfTkFUSVZFX1dDSEFSX1RfREVGSU5FRCIpOwogICAgIH0KLSAgICBpZiAoTGFuZ09wdHMuQ1BsdXNQbHVzKSB7Ci0gICAgICAvLyBGSVhNRTogU3VwcG9ydCBNaWNyb3NvZnQncyBfX2lkZW50aWZpZXIgZXh0ZW5zaW9uIGluIHRoZSBsZXhlci4KLSAgICAgIEJ1aWxkZXIuYXBwZW5kKCIjZGVmaW5lIF9faWRlbnRpZmllcih4KSB4Iik7Ci0gICAgICBCdWlsZGVyLmFwcGVuZCgiY2xhc3MgdHlwZV9pbmZvOyIpOwotICAgIH0KICAgfQogCiAgIGlmIChMYW5nT3B0cy5PcHRpbWl6ZSkKQEAgLTU0MCwxMSArNTM3LDEzIEBACiAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fT1JERVJfTElUVExFX0VORElBTl9fIiwgIjEyMzQiKTsKICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19PUkRFUl9CSUdfRU5ESUFOX18iLCAgICAiNDMyMSIpOwogICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX09SREVSX1BEUF9FTkRJQU5fXyIsICAgICIzNDEyIik7Ci0gIGlmIChUSS5pc0JpZ0VuZGlhbigpKQorICBpZiAoVEkuaXNCaWdFbmRpYW4oKSkgewogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQllURV9PUkRFUl9fIiwgIl9fT1JERVJfQklHX0VORElBTl9fIik7Ci0gIGVsc2UKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0JJR19FTkRJQU5fXyIpOworICB9IGVsc2UgewogICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9fQllURV9PUkRFUl9fIiwgIl9fT1JERVJfTElUVExFX0VORElBTl9fIik7Ci0KKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX0xJVFRMRV9FTkRJQU5fXyIpOworICB9CiAKICAgaWYgKFRJLmdldFBvaW50ZXJXaWR0aCgwKSA9PSA2NCAmJiBUSS5nZXRMb25nV2lkdGgoKSA9PSA2NAogICAgICAgJiYgVEkuZ2V0SW50V2lkdGgoKSA9PSAzMikgewpAQCAtNjkzLDggKzY5MiwxMCBAQAogCiAgIGlmIChMYW5nT3B0cy5nZXRTdGFja1Byb3RlY3RvcigpID09IExhbmdPcHRpb25zOjpTU1BPbikKICAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX1NTUF9fIik7CisgIGVsc2UgaWYgKExhbmdPcHRzLmdldFN0YWNrUHJvdGVjdG9yKCkgPT0gTGFuZ09wdGlvbnM6OlNTUFN0cm9uZykKKyAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX1NTUF9TVFJPTkdfXyIsICIyIik7CiAgIGVsc2UgaWYgKExhbmdPcHRzLmdldFN0YWNrUHJvdGVjdG9yKCkgPT0gTGFuZ09wdGlvbnM6OlNTUFJlcSkKLSAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfX1NTUF9BTExfXyIsICIyIik7CisgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX19TU1BfQUxMX18iLCAiMyIpOwogCiAgIGlmIChGRU9wdHMuUHJvZ3JhbUFjdGlvbiA9PSBmcm9udGVuZDo6UmV3cml0ZU9iakMpCiAgICAgQnVpbGRlci5kZWZpbmVNYWNybygiX193ZWFrIiwgIl9fYXR0cmlidXRlX18oKG9iamNfZ2Mod2VhaykpKSIpOwpAQCAtNzE3LDEyICs3MTgsMTIgQEAKIAogICAvLyBPcGVuTVAgZGVmaW5pdGlvbgogICBpZiAoTGFuZ09wdHMuT3Blbk1QKSB7Ci0gICAgLy8gT3Blbk1QIDIuMjogCisgICAgLy8gT3Blbk1QIDIuMjoKICAgICAvLyAgIEluIGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgYSBwcmVwcm9jZXNzb3IsIHRoZSBfT1BFTk1QCiAgICAgLy8gICBtYWNybyBuYW1lIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgZGVjaW1hbCB2YWx1ZSB5eXl5bW0gd2hlcmUKICAgICAvLyAgIHl5eXkgYW5kIG1tIGFyZSB0aGUgeWVhciBhbmQgdGhlIG1vbnRoIGRlc2lnbmF0aW9ucyBvZiB0aGUKICAgICAvLyAgIHZlcnNpb24gb2YgdGhlIE9wZW5NUCBBUEkgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydC4KLSAgICBCdWlsZGVyLmRlZmluZU1hY3JvKCJfT1BFTk1QIiwgIjIwMTEwNyIpOworICAgIEJ1aWxkZXIuZGVmaW5lTWFjcm8oIl9PUEVOTVAiLCAiMjAxMzA3Iik7CiAgIH0KIAogICAvLyBHZXQgb3RoZXIgdGFyZ2V0ICNkZWZpbmVzLgpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL0xvZ0RpYWdub3N0aWNQcmludGVyLmNwcCBiL2xpYi9Gcm9udGVuZC9Mb2dEaWFnbm9zdGljUHJpbnRlci5jcHAKaW5kZXggMjE4OWI4Ni4uNTNiMTNmYyAxMDA2NDQKLS0tIGEvbGliL0Zyb250ZW5kL0xvZ0RpYWdub3N0aWNQcmludGVyLmNwcAorKysgYi9saWIvRnJvbnRlbmQvTG9nRGlhZ25vc3RpY1ByaW50ZXIuY3BwCkBAIC0zMSw2ICszMSw3IEBACiBzdGF0aWMgU3RyaW5nUmVmIGdldExldmVsTmFtZShEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwpIHsKICAgc3dpdGNoIChMZXZlbCkgewogICBjYXNlIERpYWdub3N0aWNzRW5naW5lOjpJZ25vcmVkOiByZXR1cm4gImlnbm9yZWQiOworICBjYXNlIERpYWdub3N0aWNzRW5naW5lOjpSZW1hcms6ICByZXR1cm4gInJlbWFyayI7CiAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6Ok5vdGU6ICAgIHJldHVybiAibm90ZSI7CiAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6Oldhcm5pbmc6IHJldHVybiAid2FybmluZyI7CiAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6OkVycm9yOiAgIHJldHVybiAiZXJyb3IiOwpAQCAtMTMwLDcgKzEzMSw3IEBACiAgICAgRmlsZUlEIEZJRCA9IFNNLmdldE1haW5GaWxlSUQoKTsKICAgICBpZiAoIUZJRC5pc0ludmFsaWQoKSkgewogICAgICAgY29uc3QgRmlsZUVudHJ5ICpGRSA9IFNNLmdldEZpbGVFbnRyeUZvcklEKEZJRCk7Ci0gICAgICBpZiAoRkUgJiYgRkUtPmdldE5hbWUoKSkKKyAgICAgIGlmIChGRSAmJiBGRS0+aXNWYWxpZCgpKQogICAgICAgICBNYWluRmlsZW5hbWUgPSBGRS0+Z2V0TmFtZSgpOwogICAgIH0KICAgfQpAQCAtMTU3LDcgKzE1OCw3IEBACiAgICAgICBGaWxlSUQgRklEID0gU00uZ2V0RmlsZUlEKEluZm8uZ2V0TG9jYXRpb24oKSk7CiAgICAgICBpZiAoIUZJRC5pc0ludmFsaWQoKSkgewogICAgICAgICBjb25zdCBGaWxlRW50cnkgKkZFID0gU00uZ2V0RmlsZUVudHJ5Rm9ySUQoRklEKTsKLSAgICAgICAgaWYgKEZFICYmIEZFLT5nZXROYW1lKCkpCisgICAgICAgIGlmIChGRSAmJiBGRS0+aXNWYWxpZCgpKQogICAgICAgICAgIERFLkZpbGVuYW1lID0gRkUtPmdldE5hbWUoKTsKICAgICAgIH0KICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL011bHRpcGxleENvbnN1bWVyLmNwcCBiL2xpYi9Gcm9udGVuZC9NdWx0aXBsZXhDb25zdW1lci5jcHAKaW5kZXggOWNmNjhhNS4uNGI0ODA0ZiAxMDA2NDQKLS0tIGEvbGliL0Zyb250ZW5kL011bHRpcGxleENvbnN1bWVyLmNwcAorKysgYi9saWIvRnJvbnRlbmQvTXVsdGlwbGV4Q29uc3VtZXIuY3BwCkBAIC0zMCwxNCArMzAsMTQgQEAKICAgLy8gRG9lcyBOT1QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGVsZW1lbnRzIGluIEwuCiAgIE11bHRpcGxleEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyKAogICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QVNURGVzZXJpYWxpemF0aW9uTGlzdGVuZXIqPiYgTCk7Ci0gIHZpcnR1YWwgdm9pZCBSZWFkZXJJbml0aWFsaXplZChBU1RSZWFkZXIgKlJlYWRlcik7Ci0gIHZpcnR1YWwgdm9pZCBJZGVudGlmaWVyUmVhZChzZXJpYWxpemF0aW9uOjpJZGVudElEIElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKklJKTsKLSAgdmlydHVhbCB2b2lkIFR5cGVSZWFkKHNlcmlhbGl6YXRpb246OlR5cGVJZHggSWR4LCBRdWFsVHlwZSBUKTsKLSAgdmlydHVhbCB2b2lkIERlY2xSZWFkKHNlcmlhbGl6YXRpb246OkRlY2xJRCBJRCwgY29uc3QgRGVjbCAqRCk7Ci0gIHZpcnR1YWwgdm9pZCBTZWxlY3RvclJlYWQoc2VyaWFsaXphdGlvbjo6U2VsZWN0b3JJRCBpRCwgU2VsZWN0b3IgU2VsKTsKLSAgdmlydHVhbCB2b2lkIE1hY3JvRGVmaW5pdGlvblJlYWQoc2VyaWFsaXphdGlvbjo6UHJlcHJvY2Vzc2VkRW50aXR5SUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0RlZmluaXRpb24gKk1EKTsKKyAgdm9pZCBSZWFkZXJJbml0aWFsaXplZChBU1RSZWFkZXIgKlJlYWRlcikgb3ZlcnJpZGU7CisgIHZvaWQgSWRlbnRpZmllclJlYWQoc2VyaWFsaXphdGlvbjo6SWRlbnRJRCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSUkpIG92ZXJyaWRlOworICB2b2lkIFR5cGVSZWFkKHNlcmlhbGl6YXRpb246OlR5cGVJZHggSWR4LCBRdWFsVHlwZSBUKSBvdmVycmlkZTsKKyAgdm9pZCBEZWNsUmVhZChzZXJpYWxpemF0aW9uOjpEZWNsSUQgSUQsIGNvbnN0IERlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIFNlbGVjdG9yUmVhZChzZXJpYWxpemF0aW9uOjpTZWxlY3RvcklEIGlELCBTZWxlY3RvciBTZWwpIG92ZXJyaWRlOworICB2b2lkIE1hY3JvRGVmaW5pdGlvblJlYWQoc2VyaWFsaXphdGlvbjo6UHJlcHJvY2Vzc2VkRW50aXR5SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0RlZmluaXRpb24gKk1EKSBvdmVycmlkZTsKIHByaXZhdGU6CiAgIHN0ZDo6dmVjdG9yPEFTVERlc2VyaWFsaXphdGlvbkxpc3RlbmVyKj4gTGlzdGVuZXJzOwogfTsKQEAgLTg5LDI1ICs4OSwyNCBAQAogcHVibGljOgogICAvLyBEb2VzIE5PVCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgZWxlbWVudHMgaW4gTC4KICAgTXVsdGlwbGV4QVNUTXV0YXRpb25MaXN0ZW5lcihBcnJheVJlZjxBU1RNdXRhdGlvbkxpc3RlbmVyKj4gTCk7Ci0gIHZpcnR1YWwgdm9pZCBDb21wbGV0ZWRUYWdEZWZpbml0aW9uKGNvbnN0IFRhZ0RlY2wgKkQpOwotICB2aXJ0dWFsIHZvaWQgQWRkZWRWaXNpYmxlRGVjbChjb25zdCBEZWNsQ29udGV4dCAqREMsIGNvbnN0IERlY2wgKkQpOwotICB2aXJ0dWFsIHZvaWQgQWRkZWRDWFhJbXBsaWNpdE1lbWJlcihjb25zdCBDWFhSZWNvcmREZWNsICpSRCwgY29uc3QgRGVjbCAqRCk7Ci0gIHZpcnR1YWwgdm9pZCBBZGRlZENYWFRlbXBsYXRlU3BlY2lhbGl6YXRpb24oY29uc3QgQ2xhc3NUZW1wbGF0ZURlY2wgKlRELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqRCk7Ci0gIHZpcnR1YWwgdm9pZAotICBBZGRlZENYWFRlbXBsYXRlU3BlY2lhbGl6YXRpb24oY29uc3QgVmFyVGVtcGxhdGVEZWNsICpURCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsICpEKTsKLSAgdmlydHVhbCB2b2lkIEFkZGVkQ1hYVGVtcGxhdGVTcGVjaWFsaXphdGlvbihjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqVEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpEKTsKLSAgdmlydHVhbCB2b2lkIERlZHVjZWRSZXR1cm5UeXBlKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQsIFF1YWxUeXBlIFJldHVyblR5cGUpOwotICB2aXJ0dWFsIHZvaWQgQ29tcGxldGVkSW1wbGljaXREZWZpbml0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCk7Ci0gIHZpcnR1YWwgdm9pZCBTdGF0aWNEYXRhTWVtYmVySW5zdGFudGlhdGVkKGNvbnN0IFZhckRlY2wgKkQpOwotICB2aXJ0dWFsIHZvaWQgQWRkZWRPYmpDQ2F0ZWdvcnlUb0ludGVyZmFjZShjb25zdCBPYmpDQ2F0ZWdvcnlEZWNsICpDYXRELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUZEKTsKLSAgdmlydHVhbCB2b2lkIEFkZGVkT2JqQ1Byb3BlcnR5SW5DbGFzc0V4dGVuc2lvbihjb25zdCBPYmpDUHJvcGVydHlEZWNsICpQcm9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICpPcmlnUHJvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0NhdGVnb3J5RGVjbCAqQ2xhc3NFeHQpOwotICB2b2lkIERlY2xhcmF0aW9uTWFya2VkVXNlZChjb25zdCBEZWNsICpEKSBMTFZNX09WRVJSSURFOworICB2b2lkIENvbXBsZXRlZFRhZ0RlZmluaXRpb24oY29uc3QgVGFnRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgQWRkZWRWaXNpYmxlRGVjbChjb25zdCBEZWNsQ29udGV4dCAqREMsIGNvbnN0IERlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEFkZGVkQ1hYSW1wbGljaXRNZW1iZXIoY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQsIGNvbnN0IERlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEFkZGVkQ1hYVGVtcGxhdGVTcGVjaWFsaXphdGlvbihjb25zdCBDbGFzc1RlbXBsYXRlRGVjbCAqVEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgQWRkZWRDWFhUZW1wbGF0ZVNwZWNpYWxpemF0aW9uKGNvbnN0IFZhclRlbXBsYXRlRGVjbCAqVEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKkQpIG92ZXJyaWRlOworICB2b2lkIEFkZGVkQ1hYVGVtcGxhdGVTcGVjaWFsaXphdGlvbihjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqVEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgRGVkdWNlZFJldHVyblR5cGUoY29uc3QgRnVuY3Rpb25EZWNsICpGRCwgUXVhbFR5cGUgUmV0dXJuVHlwZSkgb3ZlcnJpZGU7CisgIHZvaWQgQ29tcGxldGVkSW1wbGljaXREZWZpbml0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCkgb3ZlcnJpZGU7CisgIHZvaWQgU3RhdGljRGF0YU1lbWJlckluc3RhbnRpYXRlZChjb25zdCBWYXJEZWNsICpEKSBvdmVycmlkZTsKKyAgdm9pZCBBZGRlZE9iakNDYXRlZ29yeVRvSW50ZXJmYWNlKGNvbnN0IE9iakNDYXRlZ29yeURlY2wgKkNhdEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUZEKSBvdmVycmlkZTsKKyAgdm9pZCBBZGRlZE9iakNQcm9wZXJ0eUluQ2xhc3NFeHRlbnNpb24oY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqUHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgKk9yaWdQcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0NhdGVnb3J5RGVjbCAqQ2xhc3NFeHQpIG92ZXJyaWRlOworICB2b2lkIERlY2xhcmF0aW9uTWFya2VkVXNlZChjb25zdCBEZWNsICpEKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgc3RkOjp2ZWN0b3I8QVNUTXV0YXRpb25MaXN0ZW5lcio+IExpc3RlbmVyczsKQEAgLTE4NCwxMCArMTgzLDkgQEAKIAogfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwogCi0KLU11bHRpcGxleENvbnN1bWVyOjpNdWx0aXBsZXhDb25zdW1lcihBcnJheVJlZjxBU1RDb25zdW1lcio+IEMpCi0gICAgOiBDb25zdW1lcnMoQy5iZWdpbigpLCBDLmVuZCgpKSwKLSAgICAgIE11dGF0aW9uTGlzdGVuZXIoMCksIERlc2VyaWFsaXphdGlvbkxpc3RlbmVyKDApIHsKK011bHRpcGxleENvbnN1bWVyOjpNdWx0aXBsZXhDb25zdW1lcihBcnJheVJlZjxBU1RDb25zdW1lciAqPiBDKQorICAgIDogQ29uc3VtZXJzKEMuYmVnaW4oKSwgQy5lbmQoKSksIE11dGF0aW9uTGlzdGVuZXIoKSwKKyAgICAgIERlc2VyaWFsaXphdGlvbkxpc3RlbmVyKCkgewogICAvLyBDb2xsZWN0IHRoZSBtdXRhdGlvbiBsaXN0ZW5lcnMgYW5kIGRlc2VyaWFsaXphdGlvbiBsaXN0ZW5lcnMgb2YgYWxsCiAgIC8vIGNoaWxkcmVuLCBhbmQgY3JlYXRlIGEgbXVsdGlwbGV4IGxpc3RlbmVyIGVhY2ggaWYgc28uCiAgIHN0ZDo6dmVjdG9yPEFTVE11dGF0aW9uTGlzdGVuZXIqPiBtdXRhdGlvbkxpc3RlbmVyczsKZGlmZiAtLWdpdCBhL2xpYi9Gcm9udGVuZC9QcmludFByZXByb2Nlc3NlZE91dHB1dC5jcHAgYi9saWIvRnJvbnRlbmQvUHJpbnRQcmVwcm9jZXNzZWRPdXRwdXQuY3BwCmluZGV4IDU1YTY2ZDguLjM0OTQwMWEgMTAwNjQ0Ci0tLSBhL2xpYi9Gcm9udGVuZC9QcmludFByZXByb2Nlc3NlZE91dHB1dC5jcHAKKysrIGIvbGliL0Zyb250ZW5kL1ByaW50UHJlcHJvY2Vzc2VkT3V0cHV0LmNwcApAQCAtMTIzLDM5ICsxMjMsMjcgQEAKICAgfQogCiAgIGJvb2wgc3RhcnROZXdMaW5lSWZOZWVkZWQoYm9vbCBTaG91bGRVcGRhdGVDdXJyZW50TGluZSA9IHRydWUpOwotICAKLSAgdmlydHVhbCB2b2lkIEZpbGVDaGFuZ2VkKFNvdXJjZUxvY2F0aW9uIExvYywgRmlsZUNoYW5nZVJlYXNvbiBSZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJRCBQcmV2RklEKTsKLSAgdmlydHVhbCB2b2lkIEluY2x1c2lvbkRpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBIYXNoTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRva2VuICZJbmNsdWRlVG9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQW5nbGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTb3VyY2VSYW5nZSBGaWxlbmFtZVJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VhcmNoUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVsYXRpdmVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqSW1wb3J0ZWQpOwotICB2aXJ0dWFsIHZvaWQgSWRlbnQoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmc3RyKTsKLSAgdmlydHVhbCB2b2lkIFByYWdtYUNhcHR1cmVkKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIFN0cik7Ci0gIHZpcnR1YWwgdm9pZCBQcmFnbWFDb21tZW50KFNvdXJjZUxvY2F0aW9uIExvYywgY29uc3QgSWRlbnRpZmllckluZm8gKktpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZTdHIpOwotICB2aXJ0dWFsIHZvaWQgUHJhZ21hRGV0ZWN0TWlzbWF0Y2goU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmVmFsdWUpOwotICB2aXJ0dWFsIHZvaWQgUHJhZ21hTWVzc2FnZShTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBOYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByYWdtYU1lc3NhZ2VLaW5kIEtpbmQsIFN0cmluZ1JlZiBTdHIpOwotICB2aXJ0dWFsIHZvaWQgUHJhZ21hRGVidWcoU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgRGVidWdUeXBlKTsKLSAgdmlydHVhbCB2b2lkIFByYWdtYURpYWdub3N0aWNQdXNoKFNvdXJjZUxvY2F0aW9uIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lc3BhY2UpOwotICB2aXJ0dWFsIHZvaWQgUHJhZ21hRGlhZ25vc3RpY1BvcChTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lc3BhY2UpOwotICB2aXJ0dWFsIHZvaWQgUHJhZ21hRGlhZ25vc3RpYyhTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBOYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6Ok1hcHBpbmcgTWFwLCBTdHJpbmdSZWYgU3RyKTsKLSAgdmlydHVhbCB2b2lkIFByYWdtYVdhcm5pbmcoU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgV2FybmluZ1NwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGludD4gSWRzKTsKLSAgdmlydHVhbCB2b2lkIFByYWdtYVdhcm5pbmdQdXNoKFNvdXJjZUxvY2F0aW9uIExvYywgaW50IExldmVsKTsKLSAgdmlydHVhbCB2b2lkIFByYWdtYVdhcm5pbmdQb3AoU291cmNlTG9jYXRpb24gTG9jKTsKKworICB2b2lkIEZpbGVDaGFuZ2VkKFNvdXJjZUxvY2F0aW9uIExvYywgRmlsZUNoYW5nZVJlYXNvbiBSZWFzb24sCisgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgRmlsZUlEIFByZXZGSUQpIG92ZXJyaWRlOworICB2b2lkIEluY2x1c2lvbkRpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBIYXNoTG9jLCBjb25zdCBUb2tlbiAmSW5jbHVkZVRvaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lLCBib29sIElzQW5nbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU291cmNlUmFuZ2UgRmlsZW5hbWVSYW5nZSwgY29uc3QgRmlsZUVudHJ5ICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VhcmNoUGF0aCwgU3RyaW5nUmVmIFJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kdWxlICpJbXBvcnRlZCkgb3ZlcnJpZGU7CisgIHZvaWQgSWRlbnQoU291cmNlTG9jYXRpb24gTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmc3RyKSBvdmVycmlkZTsKKyAgdm9pZCBQcmFnbWFNZXNzYWdlKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIE5hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgIFByYWdtYU1lc3NhZ2VLaW5kIEtpbmQsIFN0cmluZ1JlZiBTdHIpIG92ZXJyaWRlOworICB2b2lkIFByYWdtYURlYnVnKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIERlYnVnVHlwZSkgb3ZlcnJpZGU7CisgIHZvaWQgUHJhZ21hRGlhZ25vc3RpY1B1c2goU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgTmFtZXNwYWNlKSBvdmVycmlkZTsKKyAgdm9pZCBQcmFnbWFEaWFnbm9zdGljUG9wKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIE5hbWVzcGFjZSkgb3ZlcnJpZGU7CisgIHZvaWQgUHJhZ21hRGlhZ25vc3RpYyhTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBOYW1lc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjpNYXBwaW5nIE1hcCwgU3RyaW5nUmVmIFN0cikgb3ZlcnJpZGU7CisgIHZvaWQgUHJhZ21hV2FybmluZyhTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBXYXJuaW5nU3BlYywKKyAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGludD4gSWRzKSBvdmVycmlkZTsKKyAgdm9pZCBQcmFnbWFXYXJuaW5nUHVzaChTb3VyY2VMb2NhdGlvbiBMb2MsIGludCBMZXZlbCkgb3ZlcnJpZGU7CisgIHZvaWQgUHJhZ21hV2FybmluZ1BvcChTb3VyY2VMb2NhdGlvbiBMb2MpIG92ZXJyaWRlOwogCiAgIGJvb2wgSGFuZGxlRmlyc3RUb2tPbkxpbmUoVG9rZW4gJlRvayk7CiAKQEAgLTE3OSwxMCArMTY3LDEyIEBACiAgIHZvaWQgSGFuZGxlTmV3bGluZXNJblRva2VuKGNvbnN0IGNoYXIgKlRva1N0ciwgdW5zaWduZWQgTGVuKTsKIAogICAvLy8gTWFjcm9EZWZpbmVkIC0gVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciBhIG1hY3JvIGRlZmluaXRpb24gaXMgc2Vlbi4KLSAgdm9pZCBNYWNyb0RlZmluZWQoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKTsKKyAgdm9pZCBNYWNyb0RlZmluZWQoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKSBvdmVycmlkZTsKIAogICAvLy8gTWFjcm9VbmRlZmluZWQgLSBUaGlzIGhvb2sgaXMgY2FsbGVkIHdoZW5ldmVyIGEgbWFjcm8gI3VuZGVmIGlzIHNlZW4uCi0gIHZvaWQgTWFjcm9VbmRlZmluZWQoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKTsKKyAgdm9pZCBNYWNyb1VuZGVmaW5lZChjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCkgb3ZlcnJpZGU7CiB9OwogfSAgLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIApAQCAtMzU1LDE1ICszNDUsNiBAQAogICBFbWl0dGVkVG9rZW5zT25UaGlzTGluZSA9IHRydWU7CiB9CiAKLXZvaWQgUHJpbnRQUE91dHB1dFBQQ2FsbGJhY2tzOjpQcmFnbWFDYXB0dXJlZChTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN0cikgewotICBzdGFydE5ld0xpbmVJZk5lZWRlZCgpOwotICBNb3ZlVG9MaW5lKExvYyk7Ci0gIE9TIDw8ICIjcHJhZ21hIGNhcHR1cmVkIjsKLQotICBzZXRFbWl0dGVkRGlyZWN0aXZlT25UaGlzTGluZSgpOwotfQotCiAvLy8gTWFjcm9EZWZpbmVkIC0gVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciBhIG1hY3JvIGRlZmluaXRpb24gaXMgc2Vlbi4KIHZvaWQgUHJpbnRQUE91dHB1dFBQQ2FsbGJhY2tzOjpNYWNyb0RlZmluZWQoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKSB7CkBAIC00MDIsMzYgKzM4Myw2IEBACiAgICAgfQogfQogCi12b2lkIFByaW50UFBPdXRwdXRQUENhbGxiYWNrczo6UHJhZ21hQ29tbWVudChTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJZGVudGlmaWVySW5mbyAqS2luZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZTdHIpIHsKLSAgc3RhcnROZXdMaW5lSWZOZWVkZWQoKTsKLSAgTW92ZVRvTGluZShMb2MpOwotICBPUyA8PCAiI3ByYWdtYSBjb21tZW50KCIgPDwgS2luZC0+Z2V0TmFtZSgpOwotCi0gIGlmICghU3RyLmVtcHR5KCkpIHsKLSAgICBPUyA8PCAiLCBcIiI7Ci0gICAgb3V0cHV0UHJpbnRhYmxlKE9TLCBTdHIpOwotICAgIE9TIDw8ICciJzsKLSAgfQotCi0gIE9TIDw8ICcpJzsKLSAgc2V0RW1pdHRlZERpcmVjdGl2ZU9uVGhpc0xpbmUoKTsKLX0KLQotdm9pZCBQcmludFBQT3V0cHV0UFBDYWxsYmFja3M6OlByYWdtYURldGVjdE1pc21hdGNoKFNvdXJjZUxvY2F0aW9uIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmVmFsdWUpIHsKLSAgc3RhcnROZXdMaW5lSWZOZWVkZWQoKTsKLSAgTW92ZVRvTGluZShMb2MpOwotICBPUyA8PCAiI3ByYWdtYSBkZXRlY3RfbWlzbWF0Y2goXCIiIDw8IE5hbWUgPDwgJyInOwotICBvdXRwdXRQcmludGFibGUoT1MsIE5hbWUpOwotICBPUyA8PCAiXCIsIFwiIjsKLSAgb3V0cHV0UHJpbnRhYmxlKE9TLCBWYWx1ZSk7Ci0gIE9TIDw8ICJcIikiOwotICBzZXRFbWl0dGVkRGlyZWN0aXZlT25UaGlzTGluZSgpOwotfQotCiB2b2lkIFByaW50UFBPdXRwdXRQUENhbGxiYWNrczo6UHJhZ21hTWVzc2FnZShTb3VyY2VMb2NhdGlvbiBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZXNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJhZ21hTWVzc2FnZUtpbmQgS2luZCwKQEAgLTQ5NCw2ICs0NDUsOSBAQAogICBNb3ZlVG9MaW5lKExvYyk7CiAgIE9TIDw8ICIjcHJhZ21hICIgPDwgTmFtZXNwYWNlIDw8ICIgZGlhZ25vc3RpYyAiOwogICBzd2l0Y2ggKE1hcCkgeworICBjYXNlIGRpYWc6Ok1BUF9SRU1BUks6CisgICAgT1MgPDwgInJlbWFyayI7CisgICAgYnJlYWs7CiAgIGNhc2UgZGlhZzo6TUFQX1dBUk5JTkc6CiAgICAgT1MgPDwgIndhcm5pbmciOwogICAgIGJyZWFrOwpAQCAtNTU2LDYgKzUxMCwxMyBAQAogICAvLyBpbmRlbnRlZCBmb3IgZWFzeSByZWFkaW5nLgogICB1bnNpZ25lZCBDb2xObyA9IFNNLmdldEV4cGFuc2lvbkNvbHVtbk51bWJlcihUb2suZ2V0TG9jYXRpb24oKSk7CiAKKyAgLy8gVGhlIGZpcnN0IHRva2VuIG9uIGEgbGluZSBjYW4gaGF2ZSBhIGNvbHVtbiBudW1iZXIgb2YgMSwgeWV0IHN0aWxsIGV4cGVjdAorICAvLyBsZWFkaW5nIHdoaXRlIHNwYWNlLCBpZiBhIG1hY3JvIGV4cGFuc2lvbiBpbiBjb2x1bW4gMSBzdGFydHMgd2l0aCBhbiBlbXB0eQorICAvLyBtYWNybyBhcmd1bWVudCwgb3IgYW4gZW1wdHkgbmVzdGVkIG1hY3JvIGV4cGFuc2lvbi4gSW4gdGhpcyBjYXNlLCBtb3ZlIHRoZQorICAvLyB0b2tlbiB0byBjb2x1bW4gMi4KKyAgaWYgKENvbE5vID09IDEgJiYgVG9rLmhhc0xlYWRpbmdTcGFjZSgpKQorICAgIENvbE5vID0gMjsKKwogICAvLyBUaGlzIGhhY2sgcHJldmVudHMgc3R1ZmYgbGlrZToKICAgLy8gI2RlZmluZSBIQVNIICMKICAgLy8gSEFTSCBkZWZpbmUgZm9vIGJhcgpAQCAtNjAyLDggKzU2Myw4IEBACiAKICAgVW5rbm93blByYWdtYUhhbmRsZXIoY29uc3QgY2hhciAqcHJlZml4LCBQcmludFBQT3V0cHV0UFBDYWxsYmFja3MgKmNhbGxiYWNrcykKICAgICA6IFByZWZpeChwcmVmaXgpLCBDYWxsYmFja3MoY2FsbGJhY2tzKSB7fQotICB2aXJ0dWFsIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gJlByYWdtYVRvaykgeworICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmUHJhZ21hVG9rKSBvdmVycmlkZSB7CiAgICAgLy8gRmlndXJlIG91dCB3aGF0IGxpbmUgd2Ugd2VudCB0byBhbmQgaW5zZXJ0IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YKICAgICAvLyBuZXdsaW5lIGNoYXJhY3RlcnMuCiAgICAgQ2FsbGJhY2tzLT5zdGFydE5ld0xpbmVJZk5lZWRlZCgpOwpAQCAtNjE1LDcgKzU3NiwxMyBAQAogICAgICAgICBDYWxsYmFja3MtPk9TIDw8ICcgJzsKICAgICAgIHN0ZDo6c3RyaW5nIFRva1NwZWxsID0gUFAuZ2V0U3BlbGxpbmcoUHJhZ21hVG9rKTsKICAgICAgIENhbGxiYWNrcy0+T1Mud3JpdGUoJlRva1NwZWxsWzBdLCBUb2tTcGVsbC5zaXplKCkpOwotICAgICAgUFAuTGV4VW5leHBhbmRlZFRva2VuKFByYWdtYVRvayk7CisKKyAgICAgIC8vIEV4cGFuZCBtYWNyb3MgaW4gcHJhZ21hcyB3aXRoIC1mbXMtZXh0ZW5zaW9ucy4gIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQKKyAgICAgIC8vIHRoZSBtYWpvcml0eSBvZiBwcmFnbWFzIGluIHN1Y2ggYSBmaWxlIHdpbGwgYmUgTWljcm9zb2Z0IHByYWdtYXMuCisgICAgICBpZiAoUFAuZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRFeHQpCisgICAgICAgIFBQLkxleChQcmFnbWFUb2spOworICAgICAgZWxzZQorICAgICAgICBQUC5MZXhVbmV4cGFuZGVkVG9rZW4oUHJhZ21hVG9rKTsKICAgICB9CiAgICAgQ2FsbGJhY2tzLT5zZXRFbWl0dGVkRGlyZWN0aXZlT25UaGlzTGluZSgpOwogICB9CkBAIC02NTcsNyArNjI0LDkgQEAKICAgICAgIC8vIC10cmFkaXRpb25hbC1jcHAgdGhlIGxleGVyIGtlZXBzIC9hbGwvIHdoaXRlc3BhY2UsIGluY2x1ZGluZyBjb21tZW50cy4KICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jID0gVG9rLmdldExvY2F0aW9uKCk7CiAgICAgICBDYWxsYmFja3MtPk1vdmVUb0xpbmUoU3RhcnRMb2MuZ2V0TG9jV2l0aE9mZnNldChUb2suZ2V0TGVuZ3RoKCkpKTsKLSAgICB9IGVsc2UgaWYgKFRvay5pcyh0b2s6OmFubm90X21vZHVsZV9pbmNsdWRlKSkgeworICAgIH0gZWxzZSBpZiAoVG9rLmlzKHRvazo6YW5ub3RfbW9kdWxlX2luY2x1ZGUpIHx8CisgICAgICAgICAgICAgICBUb2suaXModG9rOjphbm5vdF9tb2R1bGVfYmVnaW4pIHx8CisgICAgICAgICAgICAgICBUb2suaXModG9rOjphbm5vdF9tb2R1bGVfZW5kKSkgewogICAgICAgLy8gUHJpbnRQUE91dHB1dFBQQ2FsbGJhY2tzOjpJbmNsdXNpb25EaXJlY3RpdmUgaGFuZGxlcyBwcm9kdWNpbmcKICAgICAgIC8vIGFwcHJvcHJpYXRlIG91dHB1dCBoZXJlLiBJZ25vcmUgdGhpcyB0b2tlbiBlbnRpcmVseS4KICAgICAgIFBQLkxleChUb2spOwpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL1NlcmlhbGl6ZWREaWFnbm9zdGljUHJpbnRlci5jcHAgYi9saWIvRnJvbnRlbmQvU2VyaWFsaXplZERpYWdub3N0aWNQcmludGVyLmNwcAppbmRleCA2NTE0MzIxLi41MjdmNzI3IDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmQvU2VyaWFsaXplZERpYWdub3N0aWNQcmludGVyLmNwcAorKysgYi9saWIvRnJvbnRlbmQvU2VyaWFsaXplZERpYWdub3N0aWNQcmludGVyLmNwcApAQCAtNTksMzIgKzU5LDMyIEBACiAgIHZpcnR1YWwgflNEaWFnc1JlbmRlcmVyKCkge30KICAgCiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBlbWl0RGlhZ25vc3RpY01lc3NhZ2UoU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXN1bWVkTG9jIFBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENoYXJTb3VyY2VSYW5nZT4gUmFuZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgKlNNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdPclN0b3JlZERpYWcgRCk7Ci0gIAotICB2aXJ0dWFsIHZvaWQgZW1pdERpYWdub3N0aWNMb2MoU291cmNlTG9jYXRpb24gTG9jLCBQcmVzdW1lZExvYyBQTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q2hhclNvdXJjZVJhbmdlPiBSYW5nZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkge30KKyAgdm9pZCBlbWl0RGlhZ25vc3RpY01lc3NhZ2UoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVzdW1lZExvYyBQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDaGFyU291cmNlUmFuZ2U+IFJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAqU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdPclN0b3JlZERpYWcgRCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIGVtaXROb3RlKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICpTTSk7CisgIHZvaWQgZW1pdERpYWdub3N0aWNMb2MoU291cmNlTG9jYXRpb24gTG9jLCBQcmVzdW1lZExvYyBQTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDaGFyU291cmNlUmFuZ2U+IFJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgb3ZlcnJpZGUge30KIAotICB2aXJ0dWFsIHZvaWQgZW1pdENvZGVDb250ZXh0KFNvdXJjZUxvY2F0aW9uIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENoYXJTb3VyY2VSYW5nZT4mIFJhbmdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxGaXhJdEhpbnQ+IEhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKTsKKyAgdm9pZCBlbWl0Tm90ZShTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBNZXNzYWdlLAorICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgKlNNKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgYmVnaW5EaWFnbm9zdGljKERpYWdPclN0b3JlZERpYWcgRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwpOwotICB2aXJ0dWFsIHZvaWQgZW5kRGlhZ25vc3RpYyhEaWFnT3JTdG9yZWREaWFnIEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCk7CisgIHZvaWQgZW1pdENvZGVDb250ZXh0KFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q2hhclNvdXJjZVJhbmdlPiYgUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxGaXhJdEhpbnQ+IEhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBiZWdpbkRpYWdub3N0aWMoRGlhZ09yU3RvcmVkRGlhZyBELAorICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwpIG92ZXJyaWRlOworICB2b2lkIGVuZERpYWdub3N0aWMoRGlhZ09yU3RvcmVkRGlhZyBELAorICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsKSBvdmVycmlkZTsKIH07CiAgIAogY2xhc3MgU0RpYWdzV3JpdGVyIDogcHVibGljIERpYWdub3N0aWNDb25zdW1lciB7CkBAIC0xMDMsMTYgKzEwMywxNSBAQAogICB9CiAKICAgflNEaWFnc1dyaXRlcigpIHt9Ci0gIAorCiAgIHZvaWQgSGFuZGxlRGlhZ25vc3RpYyhEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgRGlhZ0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpYyAmSW5mbyk7Ci0gIAotICB2b2lkIEJlZ2luU291cmNlRmlsZShjb25zdCBMYW5nT3B0aW9ucyAmTE8sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXByb2Nlc3NvciAqUFApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pIG92ZXJyaWRlOworCisgIHZvaWQgQmVnaW5Tb3VyY2VGaWxlKGNvbnN0IExhbmdPcHRpb25zICZMTywgY29uc3QgUHJlcHJvY2Vzc29yICpQUCkgb3ZlcnJpZGUgewogICAgIExhbmdPcHRzID0gJkxPOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGZpbmlzaCgpOworICB2b2lkIGZpbmlzaCgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAvLy8gXGJyaWVmIEVtaXQgdGhlIHByZWFtYmxlIGZvciB0aGUgc2VyaWFsaXplZCBkaWFnbm9zdGljcy4KQEAgLTE3NCw3ICsxNzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKTsKIAogICAvLy8gXGJyaWVmIFRoZSB2ZXJzaW9uIG9mIHRoZSBkaWFnbm9zdGljcyBmaWxlLgotICBlbnVtIHsgVmVyc2lvbiA9IDEgfTsKKyAgZW51bSB7IFZlcnNpb24gPSAyIH07CiAKICAgLy8vIFxicmllZiBMYW5ndWFnZSBvcHRpb25zLCB3aGljaCBjYW4gZGlmZmVyIGZyb20gb25lIGNsb25lIG9mIHRoaXMgY2xpZW50CiAgIC8vLyB0byBhbm90aGVyLgpAQCAtMjAwLDcgKzE5OSw3IEBACiAgICAgbGx2bTo6Qml0c3RyZWFtV3JpdGVyIFN0cmVhbTsKIAogICAgIC8vLyBcYnJpZWYgVGhlIG5hbWUgb2YgdGhlIGRpYWdub3N0aWNzIGZpbGUuCi0gICAgT3duaW5nUHRyPHJhd19vc3RyZWFtPiBPUzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8cmF3X29zdHJlYW0+IE9TOwogCiAgICAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGNvbnN0cnVjdGVkIHJlY29yZCBhYmJyZXZpYXRpb25zLgogICAgIEFiYnJldmlhdGlvbk1hcCBBYmJyZXZzOwpAQCAtNTY2LDYgKzU2NSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5mbyk7CiB9CiAKK3N0YXRpYyBzZXJpYWxpemVkX2RpYWdzOjpMZXZlbCBnZXRTdGFibGVMZXZlbChEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwpIHsKKyAgc3dpdGNoIChMZXZlbCkgeworI2RlZmluZSBDQVNFKFgpIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6Olg6IHJldHVybiBzZXJpYWxpemVkX2RpYWdzOjpYOworICBDQVNFKElnbm9yZWQpCisgIENBU0UoTm90ZSkKKyAgQ0FTRShSZW1hcmspCisgIENBU0UoV2FybmluZykKKyAgQ0FTRShFcnJvcikKKyAgQ0FTRShGYXRhbCkKKyN1bmRlZiBDQVNFCisgIH0KKworICBsbHZtX3VucmVhY2hhYmxlKCJpbnZhbGlkIGRpYWdub3N0aWMgbGV2ZWwiKTsKK30KKwogdm9pZCBTRGlhZ3NXcml0ZXI6OkVtaXREaWFnbm9zdGljTWVzc2FnZShTb3VyY2VMb2NhdGlvbiBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXN1bWVkTG9jIFBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKQEAgLTU3OSw3ICs1OTMsNyBAQAogICAvLyBFbWl0IHRoZSBSRUNPUkRfRElBRyByZWNvcmQuCiAgIFJlY29yZC5jbGVhcigpOwogICBSZWNvcmQucHVzaF9iYWNrKFJFQ09SRF9ESUFHKTsKLSAgUmVjb3JkLnB1c2hfYmFjayhMZXZlbCk7CisgIFJlY29yZC5wdXNoX2JhY2soZ2V0U3RhYmxlTGV2ZWwoTGV2ZWwpKTsKICAgQWRkTG9jVG9SZWNvcmQoTG9jLCBTTSwgUExvYywgUmVjb3JkKTsKIAogICBpZiAoY29uc3QgRGlhZ25vc3RpYyAqSW5mbyA9IEQuZHluX2Nhc3Q8Y29uc3QgRGlhZ25vc3RpYyo+KCkpIHsKZGlmZiAtLWdpdCBhL2xpYi9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpYy5jcHAgYi9saWIvRnJvbnRlbmQvVGV4dERpYWdub3N0aWMuY3BwCmluZGV4IGEyZGM5NTMuLjRjOTBkMDEgMTAwNjQ0Ci0tLSBhL2xpYi9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpYy5jcHAKKysrIGIvbGliL0Zyb250ZW5kL1RleHREaWFnbm9zdGljLmNwcApAQCAtMjYsNiArMjYsOCBAQAogCiBzdGF0aWMgY29uc3QgZW51bSByYXdfb3N0cmVhbTo6Q29sb3JzIG5vdGVDb2xvciA9CiAgIHJhd19vc3RyZWFtOjpCTEFDSzsKK3N0YXRpYyBjb25zdCBlbnVtIHJhd19vc3RyZWFtOjpDb2xvcnMgcmVtYXJrQ29sb3IgPQorICByYXdfb3N0cmVhbTo6QkxVRTsKIHN0YXRpYyBjb25zdCBlbnVtIHJhd19vc3RyZWFtOjpDb2xvcnMgZml4aXRDb2xvciA9CiAgIHJhd19vc3RyZWFtOjpHUkVFTjsKIHN0YXRpYyBjb25zdCBlbnVtIHJhd19vc3RyZWFtOjpDb2xvcnMgY2FyZXRDb2xvciA9CkBAIC0zMTIsMTQgKzMxNCw2IEBACiAgIFNtYWxsVmVjdG9yPGludCwyMDA+IG1fYnl0ZVRvQ29sdW1uOwogICBTbWFsbFZlY3RvcjxpbnQsMjAwPiBtX2NvbHVtblRvQnl0ZTsKIH07Ci0KLS8vIHVzZWQgaW4gYXNzZXJ0IGluIHNlbGVjdEludGVyZXN0aW5nU291cmNlUmVnaW9uKCkKLXN0cnVjdCBjaGFyX291dF9vZl9yYW5nZSB7Ci0gIGNvbnN0IGNoYXIgbG93ZXIsdXBwZXI7Ci0gIGNoYXJfb3V0X29mX3JhbmdlKGNoYXIgbG93ZXIsIGNoYXIgdXBwZXIpIDoKLSAgICBsb3dlcihsb3dlciksIHVwcGVyKHVwcGVyKSB7fQotICBib29sIG9wZXJhdG9yKCkoY2hhciBjKSB7IHJldHVybiBjIDwgbG93ZXIgfHwgdXBwZXIgPCBjOyB9Ci19OwogfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQogCiAvLy8gXGJyaWVmIFdoZW4gdGhlIHNvdXJjZSBjb2RlIGxpbmUgd2Ugd2FudCB0byBwcmludCBpcyB0b28gbG9uZyBmb3IKQEAgLTMzOSw3ICszMzMsNyBAQAogICAvLyBObyBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQgaW4gQ2FyZXRMaW5lLgogICBhc3NlcnQoQ2FyZXRMaW5lLmVuZCgpID09CiAgICAgICAgICBzdGQ6OmZpbmRfaWYoQ2FyZXRMaW5lLmJlZ2luKCksIENhcmV0TGluZS5lbmQoKSwKLSAgICAgICAgIGNoYXJfb3V0X29mX3JhbmdlKCcgJywnficpKSk7CisgICAgICAgICAgICAgICAgICAgICAgW10oY2hhciBjKSB7IHJldHVybiBjIDwgJyAnIHx8ICd+JyA8IGM7IH0pKTsKIAogICAvLyBGaW5kIHRoZSBzbGljZSB0aGF0IHdlIG5lZWQgdG8gZGlzcGxheSB0aGUgZnVsbCBjYXJldCBsaW5lCiAgIC8vIGNvcnJlY3RseS4KQEAgLTcxMSw2ICs3MDUsNyBAQAogICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6Oklnbm9yZWQ6CiAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGRpYWdub3N0aWMgdHlwZSIpOwogICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6Ok5vdGU6ICAgIE9TLmNoYW5nZUNvbG9yKG5vdGVDb2xvciwgdHJ1ZSk7IGJyZWFrOworICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6OlJlbWFyazogIE9TLmNoYW5nZUNvbG9yKHJlbWFya0NvbG9yLCB0cnVlKTsgYnJlYWs7CiAgICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6V2FybmluZzogT1MuY2hhbmdlQ29sb3Iod2FybmluZ0NvbG9yLCB0cnVlKTsgYnJlYWs7CiAgICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3I6ICAgT1MuY2hhbmdlQ29sb3IoZXJyb3JDb2xvciwgdHJ1ZSk7IGJyZWFrOwogICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6OkZhdGFsOiAgIE9TLmNoYW5nZUNvbG9yKGZhdGFsQ29sb3IsIHRydWUpOyBicmVhazsKQEAgLTcyMSw2ICs3MTYsNyBAQAogICBjYXNlIERpYWdub3N0aWNzRW5naW5lOjpJZ25vcmVkOgogICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgZGlhZ25vc3RpYyB0eXBlIik7CiAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6Ok5vdGU6ICAgIE9TIDw8ICJub3RlIjsgYnJlYWs7CisgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6OlJlbWFyazogIE9TIDw8ICJyZW1hcmsiOyBicmVhazsKICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6V2FybmluZzogT1MgPDwgIndhcm5pbmciOyBicmVhazsKICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3I6ICAgT1MgPDwgImVycm9yIjsgYnJlYWs7CiAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6OkZhdGFsOiAgIE9TIDw8ICJmYXRhbCBlcnJvciI7IGJyZWFrOwpAQCAtNzg3LDcgKzc4Myw3IEBACiAgICAgRmlsZUlEIEZJRCA9IFNNLmdldEZpbGVJRChMb2MpOwogICAgIGlmICghRklELmlzSW52YWxpZCgpKSB7CiAgICAgICBjb25zdCBGaWxlRW50cnkqIEZFID0gU00uZ2V0RmlsZUVudHJ5Rm9ySUQoRklEKTsKLSAgICAgIGlmIChGRSAmJiBGRS0+Z2V0TmFtZSgpKSB7CisgICAgICBpZiAoRkUgJiYgRkUtPmlzVmFsaWQoKSkgewogICAgICAgICBPUyA8PCBGRS0+Z2V0TmFtZSgpOwogICAgICAgICBpZiAoRkUtPmlzSW5QQ0goKSkKICAgICAgICAgICBPUyA8PCAiIChpbiBQQ0gpIjsKQEAgLTgxNiw3ICs4MTIsOSBAQAogICAgIGlmICh1bnNpZ25lZCBDb2xObyA9IFBMb2MuZ2V0Q29sdW1uKCkpIHsKICAgICAgIGlmIChEaWFnT3B0cy0+Z2V0Rm9ybWF0KCkgPT0gRGlhZ25vc3RpY09wdGlvbnM6Ok1zdmMpIHsKICAgICAgICAgT1MgPDwgJywnOwotICAgICAgICBDb2xOby0tOworICAgICAgICAvLyBWaXN1YWwgU3R1ZGlvIDIwMTAgb3IgZWFybGllciBleHBlY3RzIGNvbHVtbiBudW1iZXIgdG8gYmUgb2ZmIGJ5IG9uZQorICAgICAgICBpZiAoTGFuZ09wdHMuTVNDVmVyc2lvbiAmJiBMYW5nT3B0cy5NU0NWZXJzaW9uIDwgMTcwMCkKKyAgICAgICAgICBDb2xOby0tOwogICAgICAgfSBlbHNlCiAgICAgICAgIE9TIDw8ICc6JzsKICAgICAgIE9TIDw8IENvbE5vOwpkaWZmIC0tZ2l0IGEvbGliL0Zyb250ZW5kL1RleHREaWFnbm9zdGljQnVmZmVyLmNwcCBiL2xpYi9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpY0J1ZmZlci5jcHAKaW5kZXggNTgyMTQzNi4uYjFjNzkzYSAxMDA2NDQKLS0tIGEvbGliL0Zyb250ZW5kL1RleHREaWFnbm9zdGljQnVmZmVyLmNwcAorKysgYi9saWIvRnJvbnRlbmQvVGV4dERpYWdub3N0aWNCdWZmZXIuY3BwCkBAIC00MiwzNiArNDIsMTYgQEAKICAgfQogfQogCi0vLy8gXGJyaWVmIEVzY2FwZSBkaWFnbm9zdGljIHRleHRzIHRvIGF2b2lkIHByb2JsZW1zIHdoZW4gdGhleSBhcmUgZmVkIGludG8gdGhlCi0vLy8gZGlhZ25vc3RpYyBmb3JtYXR0ZXIgYSBzZWNvbmQgdGltZS4KLXN0YXRpYyBTdHJpbmdSZWYgZXNjYXBlRGlhZyhTdHJpbmdSZWYgU3RyLCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkJ1ZikgewotICBzaXplX3QgUG9zID0gU3RyLmZpbmQoJyUnKTsKLSAgaWYgKFBvcyA9PSBTdHJpbmdSZWY6Om5wb3MpCi0gICAgcmV0dXJuIFN0cjsKLQotICAvLyBXZSBmb3VuZCBhICclJy4gUmVwbGFjZSB0aGlzIGFuZCBhbGwgZm9sbG93aW5nICclJyB3aXRoICclJScuCi0gIEJ1Zi5jbGVhcigpOwotICBCdWYuYXBwZW5kKFN0ci5kYXRhKCksIFN0ci5kYXRhKCkgKyBQb3MpOwotICBmb3IgKHNpemVfdCBJID0gUG9zLCBFID0gU3RyLnNpemUoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoU3RyW0ldID09ICclJykKLSAgICAgIEJ1Zi5wdXNoX2JhY2soJyUnKTsKLSAgICBCdWYucHVzaF9iYWNrKFN0cltJXSk7Ci0gIH0KLQotICByZXR1cm4gU3RyaW5nUmVmKEJ1Zi5kYXRhKCksIEJ1Zi5zaXplKCkpOwotfQotCiB2b2lkIFRleHREaWFnbm9zdGljQnVmZmVyOjpGbHVzaERpYWdub3N0aWNzKERpYWdub3N0aWNzRW5naW5lICZEaWFncykgY29uc3QgewotICBTbWFsbFZlY3RvcjxjaGFyLCA2ND4gQnVmOwogICAvLyBGSVhNRTogRmx1c2ggdGhlIGRpYWdub3N0aWNzIGluIG9yZGVyLgogICBmb3IgKGNvbnN0X2l0ZXJhdG9yIGl0ID0gZXJyX2JlZ2luKCksIGllID0gZXJyX2VuZCgpOyBpdCAhPSBpZTsgKytpdCkKLSAgICBEaWFncy5SZXBvcnQoRGlhZ3MuZ2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNzRW5naW5lOjpFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZURpYWcoaXQtPnNlY29uZCwgQnVmKSkpOworICAgIERpYWdzLlJlcG9ydChEaWFncy5nZXRDdXN0b21EaWFnSUQoRGlhZ25vc3RpY3NFbmdpbmU6OkVycm9yLCAiJTAiKSkKKyAgICAgICAgPDwgaXQtPnNlY29uZDsKICAgZm9yIChjb25zdF9pdGVyYXRvciBpdCA9IHdhcm5fYmVnaW4oKSwgaWUgPSB3YXJuX2VuZCgpOyBpdCAhPSBpZTsgKytpdCkKLSAgICBEaWFncy5SZXBvcnQoRGlhZ3MuZ2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNzRW5naW5lOjpXYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlRGlhZyhpdC0+c2Vjb25kLCBCdWYpKSk7CisgICAgRGlhZ3MuUmVwb3J0KERpYWdzLmdldEN1c3RvbURpYWdJRChEaWFnbm9zdGljc0VuZ2luZTo6V2FybmluZywgIiUwIikpCisgICAgICAgIDw8IGl0LT5zZWNvbmQ7CiAgIGZvciAoY29uc3RfaXRlcmF0b3IgaXQgPSBub3RlX2JlZ2luKCksIGllID0gbm90ZV9lbmQoKTsgaXQgIT0gaWU7ICsraXQpCi0gICAgRGlhZ3MuUmVwb3J0KERpYWdzLmdldEN1c3RvbURpYWdJRChEaWFnbm9zdGljc0VuZ2luZTo6Tm90ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZURpYWcoaXQtPnNlY29uZCwgQnVmKSkpOworICAgIERpYWdzLlJlcG9ydChEaWFncy5nZXRDdXN0b21EaWFnSUQoRGlhZ25vc3RpY3NFbmdpbmU6Ok5vdGUsICIlMCIpKQorICAgICAgICA8PCBpdC0+c2Vjb25kOwogfQogCmRpZmYgLS1naXQgYS9saWIvRnJvbnRlbmQvVmVyaWZ5RGlhZ25vc3RpY0NvbnN1bWVyLmNwcCBiL2xpYi9Gcm9udGVuZC9WZXJpZnlEaWFnbm9zdGljQ29uc3VtZXIuY3BwCmluZGV4IDA0NWU2MGEuLjAyMjFhNTUgMTAwNjQ0Ci0tLSBhL2xpYi9Gcm9udGVuZC9WZXJpZnlEaWFnbm9zdGljQ29uc3VtZXIuY3BwCisrKyBiL2xpYi9Gcm9udGVuZC9WZXJpZnlEaWFnbm9zdGljQ29uc3VtZXIuY3BwCkBAIC0xNjYsMTIgKzE2NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVGV4dCwgdW5zaWduZWQgTWluLCB1bnNpZ25lZCBNYXgpCiAgICAgOiBEaXJlY3RpdmUoRGlyZWN0aXZlTG9jLCBEaWFnbm9zdGljTG9jLCBUZXh0LCBNaW4sIE1heCkgeyB9CiAKLSAgdmlydHVhbCBib29sIGlzVmFsaWQoc3RkOjpzdHJpbmcgJkVycm9yKSB7CisgIGJvb2wgaXNWYWxpZChzdGQ6OnN0cmluZyAmRXJyb3IpIG92ZXJyaWRlIHsKICAgICAvLyBhbGwgc3RyaW5ncyBhcmUgY29uc2lkZXJlZCB2YWxpZDsgZXZlbiBlbXB0eSBvbmVzCiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICB2aXJ0dWFsIGJvb2wgbWF0Y2goU3RyaW5nUmVmIFMpIHsKKyAgYm9vbCBtYXRjaChTdHJpbmdSZWYgUykgb3ZlcnJpZGUgewogICAgIHJldHVybiBTLmZpbmQoVGV4dCkgIT0gU3RyaW5nUmVmOjpucG9zOwogICB9CiB9OwpAQCAtMTgxLDE2ICsxODEsMTYgQEAKIGNsYXNzIFJlZ2V4RGlyZWN0aXZlIDogcHVibGljIERpcmVjdGl2ZSB7CiBwdWJsaWM6CiAgIFJlZ2V4RGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIERpcmVjdGl2ZUxvYywgU291cmNlTG9jYXRpb24gRGlhZ25vc3RpY0xvYywKLSAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFRleHQsIHVuc2lnbmVkIE1pbiwgdW5zaWduZWQgTWF4KQotICAgIDogRGlyZWN0aXZlKERpcmVjdGl2ZUxvYywgRGlhZ25vc3RpY0xvYywgVGV4dCwgTWluLCBNYXgpLCBSZWdleChUZXh0KSB7IH0KKyAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFRleHQsIHVuc2lnbmVkIE1pbiwgdW5zaWduZWQgTWF4LCBTdHJpbmdSZWYgUmVnZXhTdHIpCisgICAgOiBEaXJlY3RpdmUoRGlyZWN0aXZlTG9jLCBEaWFnbm9zdGljTG9jLCBUZXh0LCBNaW4sIE1heCksIFJlZ2V4KFJlZ2V4U3RyKSB7IH0KIAotICB2aXJ0dWFsIGJvb2wgaXNWYWxpZChzdGQ6OnN0cmluZyAmRXJyb3IpIHsKKyAgYm9vbCBpc1ZhbGlkKHN0ZDo6c3RyaW5nICZFcnJvcikgb3ZlcnJpZGUgewogICAgIGlmIChSZWdleC5pc1ZhbGlkKEVycm9yKSkKICAgICAgIHJldHVybiB0cnVlOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIHZpcnR1YWwgYm9vbCBtYXRjaChTdHJpbmdSZWYgUykgeworICBib29sIG1hdGNoKFN0cmluZ1JlZiBTKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFJlZ2V4Lm1hdGNoKFMpOwogICB9CiAKQEAgLTI0MCw3ICsyNDAsNyBAQAogICAgICAgaWYgKCFFbnN1cmVTdGFydE9mV29yZAogICAgICAgICAgICAgLy8gQ2hlY2sgaWYgc3RyaW5nIGxpdGVyYWwgc3RhcnRzIGEgbmV3IHdvcmQuCiAgICAgICAgICAgICB8fCBQID09IEJlZ2luIHx8IGlzV2hpdGVzcGFjZShQWy0xXSkKLSAgICAgICAgICAgIC8vIE9yIGl0IGNvdWxkIGJlIHByZWNlZWRlZCBieSB0aGUgc3RhcnQgb2YgYSBjb21tZW50LgorICAgICAgICAgICAgLy8gT3IgaXQgY291bGQgYmUgcHJlY2VkZWQgYnkgdGhlIHN0YXJ0IG9mIGEgY29tbWVudC4KICAgICAgICAgICAgIHx8IChQID4gKEJlZ2luICsgMSkgJiYgKFBbLTFdID09ICcvJyB8fCBQWy0xXSA9PSAnKicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICBQWy0yXSA9PSAnLycpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTI0OSw2ICsyNDksMzAgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAorICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIENsb3NlQnJhY2UgdGhhdCBjbG9zZXMgdGhlIE9wZW5CcmFjZSBhdCB0aGUgY3VycmVudCBuZXN0CisgIC8vIGxldmVsIGlzIGZvdW5kLiBXaGVuIHRydWUsIFAgbWFya3MgYmVnaW4tcG9zaXRpb24gb2YgQ2xvc2VCcmFjZS4KKyAgYm9vbCBTZWFyY2hDbG9zaW5nQnJhY2UoU3RyaW5nUmVmIE9wZW5CcmFjZSwgU3RyaW5nUmVmIENsb3NlQnJhY2UpIHsKKyAgICB1bnNpZ25lZCBEZXB0aCA9IDE7CisgICAgUCA9IEM7CisgICAgd2hpbGUgKFAgPCBFbmQpIHsKKyAgICAgIFN0cmluZ1JlZiBTKFAsIEVuZCAtIFApOworICAgICAgaWYgKFMuc3RhcnRzd2l0aChPcGVuQnJhY2UpKSB7CisgICAgICAgICsrRGVwdGg7CisgICAgICAgIFAgKz0gT3BlbkJyYWNlLnNpemUoKTsKKyAgICAgIH0gZWxzZSBpZiAoUy5zdGFydHN3aXRoKENsb3NlQnJhY2UpKSB7CisgICAgICAgIC0tRGVwdGg7CisgICAgICAgIGlmIChEZXB0aCA9PSAwKSB7CisgICAgICAgICAgUEVuZCA9IFAgKyBDbG9zZUJyYWNlLnNpemUoKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBQICs9IENsb3NlQnJhY2Uuc2l6ZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKytQOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICAvLyBBZHZhbmNlIDEtcGFzdCBwcmV2aW91cyBuZXh0L3NlYXJjaC4KICAgLy8gQmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIHByZXZpb3VzIG5leHQvc2VhcmNoIGZhaWxlZC4KICAgYm9vbCBBZHZhbmNlKCkgewpAQCAtNDM3LDcgKzQ2MSw3IEBACiAgICAgY29uc3QgY2hhciogY29uc3QgQ29udGVudEJlZ2luID0gUEguQzsgLy8gbWFyayBjb250ZW50IGJlZ2luCiAKICAgICAvLyBTZWFyY2ggZm9yIHRva2VuOiB9fQotICAgIGlmICghUEguU2VhcmNoKCJ9fSIpKSB7CisgICAgaWYgKCFQSC5TZWFyY2hDbG9zaW5nQnJhY2UoInt7IiwgIn19IikpIHsKICAgICAgIERpYWdzLlJlcG9ydChQb3MuZ2V0TG9jV2l0aE9mZnNldChQSC5DLVBILkJlZ2luKSwKICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfdmVyaWZ5X21pc3NpbmdfZW5kKSA8PCBLaW5kU3RyOwogICAgICAgY29udGludWU7CkBAIC00NTksNiArNDgzLDEzIEBACiAgICAgaWYgKFRleHQuZW1wdHkoKSkKICAgICAgIFRleHQuYXNzaWduKENvbnRlbnRCZWdpbiwgQ29udGVudEVuZCk7CiAKKyAgICAvLyBDaGVjayB0aGF0IHJlZ2V4IGRpcmVjdGl2ZXMgY29udGFpbiBhdCBsZWFzdCBvbmUgcmVnZXguCisgICAgaWYgKFJlZ2V4S2luZCAmJiBUZXh0LmZpbmQoInt7IikgPT0gU3RyaW5nUmVmOjpucG9zKSB7CisgICAgICBEaWFncy5SZXBvcnQoUG9zLmdldExvY1dpdGhPZmZzZXQoQ29udGVudEJlZ2luLVBILkJlZ2luKSwKKyAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfdmVyaWZ5X21pc3NpbmdfcmVnZXgpIDw8IFRleHQ7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgLy8gQ29uc3RydWN0IG5ldyBkaXJlY3RpdmUuCiAgICAgRGlyZWN0aXZlICpEID0gRGlyZWN0aXZlOjpjcmVhdGUoUmVnZXhLaW5kLCBQb3MsIEV4cGVjdGVkTG9jLCBUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbiwgTWF4KTsKQEAgLTgyMyw3ICs4NTQsMzEgQEAKIERpcmVjdGl2ZSAqRGlyZWN0aXZlOjpjcmVhdGUoYm9vbCBSZWdleEtpbmQsIFNvdXJjZUxvY2F0aW9uIERpcmVjdGl2ZUxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRGlhZ25vc3RpY0xvYywgU3RyaW5nUmVmIFRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pbiwgdW5zaWduZWQgTWF4KSB7Ci0gIGlmIChSZWdleEtpbmQpCi0gICAgcmV0dXJuIG5ldyBSZWdleERpcmVjdGl2ZShEaXJlY3RpdmVMb2MsIERpYWdub3N0aWNMb2MsIFRleHQsIE1pbiwgTWF4KTsKLSAgcmV0dXJuIG5ldyBTdGFuZGFyZERpcmVjdGl2ZShEaXJlY3RpdmVMb2MsIERpYWdub3N0aWNMb2MsIFRleHQsIE1pbiwgTWF4KTsKKyAgaWYgKCFSZWdleEtpbmQpCisgICAgcmV0dXJuIG5ldyBTdGFuZGFyZERpcmVjdGl2ZShEaXJlY3RpdmVMb2MsIERpYWdub3N0aWNMb2MsIFRleHQsIE1pbiwgTWF4KTsKKworICAvLyBQYXJzZSB0aGUgZGlyZWN0aXZlIGludG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCisgIHN0ZDo6c3RyaW5nIFJlZ2V4U3RyOworICBTdHJpbmdSZWYgUyA9IFRleHQ7CisgIHdoaWxlICghUy5lbXB0eSgpKSB7CisgICAgaWYgKFMuc3RhcnRzd2l0aCgie3siKSkgeworICAgICAgUyA9IFMuZHJvcF9mcm9udCgyKTsKKyAgICAgIHNpemVfdCBSZWdleE1hdGNoTGVuZ3RoID0gUy5maW5kKCJ9fSIpOworICAgICAgYXNzZXJ0KFJlZ2V4TWF0Y2hMZW5ndGggIT0gU3RyaW5nUmVmOjpucG9zKTsKKyAgICAgIC8vIEFwcGVuZCB0aGUgcmVnZXgsIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLgorICAgICAgUmVnZXhTdHIgKz0gIigiOworICAgICAgUmVnZXhTdHIuYXBwZW5kKFMuZGF0YSgpLCBSZWdleE1hdGNoTGVuZ3RoKTsKKyAgICAgIFJlZ2V4U3RyICs9ICIpIjsKKyAgICAgIFMgPSBTLmRyb3BfZnJvbnQoUmVnZXhNYXRjaExlbmd0aCArIDIpOworICAgIH0gZWxzZSB7CisgICAgICBzaXplX3QgVmVyYmF0aW1NYXRjaExlbmd0aCA9IFMuZmluZCgie3siKTsKKyAgICAgIGlmIChWZXJiYXRpbU1hdGNoTGVuZ3RoID09IFN0cmluZ1JlZjo6bnBvcykKKyAgICAgICAgVmVyYmF0aW1NYXRjaExlbmd0aCA9IFMuc2l6ZSgpOworICAgICAgLy8gRXNjYXBlIGFuZCBhcHBlbmQgdGhlIGZpeGVkIHN0cmluZy4KKyAgICAgIFJlZ2V4U3RyICs9IGxsdm06OlJlZ2V4Ojplc2NhcGUoUy5zdWJzdHIoMCwgVmVyYmF0aW1NYXRjaExlbmd0aCkpOworICAgICAgUyA9IFMuZHJvcF9mcm9udChWZXJiYXRpbU1hdGNoTGVuZ3RoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gbmV3IFJlZ2V4RGlyZWN0aXZlKERpcmVjdGl2ZUxvYywgRGlhZ25vc3RpY0xvYywgVGV4dCwgTWluLCBNYXgsIFJlZ2V4U3RyKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9Gcm9udGVuZFRvb2wvQW5kcm9pZC5tayBiL2xpYi9Gcm9udGVuZFRvb2wvQW5kcm9pZC5tawppbmRleCAyNDk2ZjZiLi41ODE2MDk1IDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmRUb29sL0FuZHJvaWQubWsKKysrIGIvbGliL0Zyb250ZW5kVG9vbC9BbmRyb2lkLm1rCkBAIC0xNyw2ICsxNyw5IEBACiBjbGFuZ19mcm9udGVuZF90b29sX1NSQ19GSUxFUyA6PSBcCiAgIEV4ZWN1dGVDb21waWxlckludm9jYXRpb24uY3BwCiAKK0xPQ0FMX0NGTEFHUyArPSAtRENMQU5HX0VOQUJMRV9TVEFUSUNfQU5BTFlaRVIKK0xPQ0FMX0NGTEFHUyArPSAtRENMQU5HX0VOQUJMRV9SRVdSSVRFUgorCiBMT0NBTF9TUkNfRklMRVMgOj0gJChjbGFuZ19mcm9udGVuZF90b29sX1NSQ19GSUxFUykKIAogaW5jbHVkZSAkKENMQU5HX0hPU1RfQlVJTERfTUspCmRpZmYgLS1naXQgYS9saWIvRnJvbnRlbmRUb29sL0NNYWtlTGlzdHMudHh0IGIvbGliL0Zyb250ZW5kVG9vbC9DTWFrZUxpc3RzLnR4dAppbmRleCAyOGE4NjRhLi43ZTExYmUwIDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmRUb29sL0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9Gcm9udGVuZFRvb2wvQ01ha2VMaXN0cy50eHQKQEAgLTEsMzEgKzEsMzQgQEAKLWFkZF9jbGFuZ19saWJyYXJ5KGNsYW5nRnJvbnRlbmRUb29sCi0gIEV4ZWN1dGVDb21waWxlckludm9jYXRpb24uY3BwCitzZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMKKyAgT3B0aW9uCisgIFN1cHBvcnQKICAgKQogCi1hZGRfZGVwZW5kZW5jaWVzKGNsYW5nRnJvbnRlbmRUb29sCi0gIENsYW5nRGlhZ25vc3RpY0NvbW1vbgotICBDbGFuZ0RpYWdub3N0aWNGcm9udGVuZAotICBDbGFuZ0RyaXZlck9wdGlvbnMKLSAgKQotCi10YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmdGcm9udGVuZFRvb2wKK3NldChsaW5rX2xpYnMKKyAgY2xhbmdCYXNpYworICBjbGFuZ0NvZGVHZW4KICAgY2xhbmdEcml2ZXIKICAgY2xhbmdGcm9udGVuZAotICBjbGFuZ1Jld3JpdGVDb3JlCiAgIGNsYW5nUmV3cml0ZUZyb250ZW5kCi0gIGNsYW5nQ29kZUdlbgogICApCiAKIGlmKENMQU5HX0VOQUJMRV9BUkNNVCkKLSAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNsYW5nRnJvbnRlbmRUb29sCisgIGxpc3QoQVBQRU5EIGxpbmtfbGlicwogICAgIGNsYW5nQVJDTWlncmF0ZQogICAgICkKIGVuZGlmKCkKIAogaWYoQ0xBTkdfRU5BQkxFX1NUQVRJQ19BTkFMWVpFUikKLSAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNsYW5nRnJvbnRlbmRUb29sCisgIGxpc3QoQVBQRU5EIGxpbmtfbGlicwogICAgIGNsYW5nU3RhdGljQW5hbHl6ZXJGcm9udGVuZAotICAgIGNsYW5nU3RhdGljQW5hbHl6ZXJDaGVja2VycwotICAgIGNsYW5nU3RhdGljQW5hbHl6ZXJDb3JlCiAgICAgKQogZW5kaWYoKQorCithZGRfY2xhbmdfbGlicmFyeShjbGFuZ0Zyb250ZW5kVG9vbAorICBFeGVjdXRlQ29tcGlsZXJJbnZvY2F0aW9uLmNwcAorCisgIERFUEVORFMKKyAgQ2xhbmdEcml2ZXJPcHRpb25zCisKKyAgTElOS19MSUJTCisgICR7bGlua19saWJzfQorICApCmRpZmYgLS1naXQgYS9saWIvRnJvbnRlbmRUb29sL0V4ZWN1dGVDb21waWxlckludm9jYXRpb24uY3BwIGIvbGliL0Zyb250ZW5kVG9vbC9FeGVjdXRlQ29tcGlsZXJJbnZvY2F0aW9uLmNwcAppbmRleCBkNzU1ODM5Li4wZWRkNTc3IDEwMDY0NAotLS0gYS9saWIvRnJvbnRlbmRUb29sL0V4ZWN1dGVDb21waWxlckludm9jYXRpb24uY3BwCisrKyBiL2xpYi9Gcm9udGVuZFRvb2wvRXhlY3V0ZUNvbXBpbGVySW52b2NhdGlvbi5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZERpYWdub3N0aWMuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZFBsdWdpblJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvVXRpbHMuaCIKICNpbmNsdWRlICJjbGFuZy9SZXdyaXRlL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5oIgogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5oIgogI2luY2x1ZGUgImxsdm0vT3B0aW9uL09wdFRhYmxlLmgiCkBAIC0zMyw2ICszNCw3IEBACiBzdGF0aWMgRnJvbnRlbmRBY3Rpb24gKkNyZWF0ZUZyb250ZW5kQmFzZUFjdGlvbihDb21waWxlckluc3RhbmNlICZDSSkgewogICB1c2luZyBuYW1lc3BhY2UgY2xhbmc6OmZyb250ZW5kOwogICBTdHJpbmdSZWYgQWN0aW9uKCJ1bmtub3duIik7CisgICh2b2lkKUFjdGlvbjsKIAogICBzd2l0Y2ggKENJLmdldEZyb250ZW5kT3B0cygpLlByb2dyYW1BY3Rpb24pIHsKICAgY2FzZSBBU1REZWNsTGlzdDogICAgICAgICAgICByZXR1cm4gbmV3IEFTVERlY2xMaXN0QWN0aW9uKCk7CkBAIC02MywxNiArNjUsMTcgQEAKICAgY2FzZSBJbml0T25seTogICAgICAgICAgICAgICByZXR1cm4gbmV3IEluaXRPbmx5QWN0aW9uKCk7CiAgIGNhc2UgUGFyc2VTeW50YXhPbmx5OiAgICAgICAgcmV0dXJuIG5ldyBTeW50YXhPbmx5QWN0aW9uKCk7CiAgIGNhc2UgTW9kdWxlRmlsZUluZm86ICAgICAgICAgcmV0dXJuIG5ldyBEdW1wTW9kdWxlSW5mb0FjdGlvbigpOworICBjYXNlIFZlcmlmeVBDSDogICAgICAgICAgICAgIHJldHVybiBuZXcgVmVyaWZ5UENIQWN0aW9uKCk7CiAKICAgY2FzZSBQbHVnaW5BY3Rpb246IHsKICAgICBmb3IgKEZyb250ZW5kUGx1Z2luUmVnaXN0cnk6Oml0ZXJhdG9yIGl0ID0KICAgICAgICAgICAgRnJvbnRlbmRQbHVnaW5SZWdpc3RyeTo6YmVnaW4oKSwgaWUgPSBGcm9udGVuZFBsdWdpblJlZ2lzdHJ5OjplbmQoKTsKICAgICAgICAgIGl0ICE9IGllOyArK2l0KSB7CiAgICAgICBpZiAoaXQtPmdldE5hbWUoKSA9PSBDSS5nZXRGcm9udGVuZE9wdHMoKS5BY3Rpb25OYW1lKSB7Ci0gICAgICAgIE93bmluZ1B0cjxQbHVnaW5BU1RBY3Rpb24+IFAoaXQtPmluc3RhbnRpYXRlKCkpOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGx1Z2luQVNUQWN0aW9uPiBQKGl0LT5pbnN0YW50aWF0ZSgpKTsKICAgICAgICAgaWYgKCFQLT5QYXJzZUFyZ3MoQ0ksIENJLmdldEZyb250ZW5kT3B0cygpLlBsdWdpbkFyZ3MpKQogICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gUC50YWtlKCk7CisgICAgICAgIHJldHVybiBQLnJlbGVhc2UoKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTE3OCw3ICsxODEsNyBAQAogYm9vbCBjbGFuZzo6RXhlY3V0ZUNvbXBpbGVySW52b2NhdGlvbihDb21waWxlckluc3RhbmNlICpDbGFuZykgewogICAvLyBIb25vciAtaGVscC4KICAgaWYgKENsYW5nLT5nZXRGcm9udGVuZE9wdHMoKS5TaG93SGVscCkgewotICAgIE93bmluZ1B0cjxPcHRUYWJsZT4gT3B0cyhkcml2ZXI6OmNyZWF0ZURyaXZlck9wdFRhYmxlKCkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxPcHRUYWJsZT4gT3B0cyhkcml2ZXI6OmNyZWF0ZURyaXZlck9wdFRhYmxlKCkpOwogICAgIE9wdHMtPlByaW50SGVscChsbHZtOjpvdXRzKCksICJjbGFuZyAtY2MxIiwKICAgICAgICAgICAgICAgICAgICAgIkxMVk0gJ0NsYW5nJyBDb21waWxlcjogaHR0cDovL2NsYW5nLmxsdm0ub3JnIiwKICAgICAgICAgICAgICAgICAgICAgLypJbmNsdWRlPSovIGRyaXZlcjo6b3B0aW9uczo6Q0MxT3B0aW9uLCAvKkV4Y2x1ZGU9Ki8gMCk7CkBAIC0yMzAsMTEgKzIzMywxMSBAQAogICBpZiAoQ2xhbmctPmdldERpYWdub3N0aWNzKCkuaGFzRXJyb3JPY2N1cnJlZCgpKQogICAgIHJldHVybiBmYWxzZTsKICAgLy8gQ3JlYXRlIGFuZCBleGVjdXRlIHRoZSBmcm9udGVuZCBhY3Rpb24uCi0gIE93bmluZ1B0cjxGcm9udGVuZEFjdGlvbj4gQWN0KENyZWF0ZUZyb250ZW5kQWN0aW9uKCpDbGFuZykpOworICBzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb24+IEFjdChDcmVhdGVGcm9udGVuZEFjdGlvbigqQ2xhbmcpKTsKICAgaWYgKCFBY3QpCiAgICAgcmV0dXJuIGZhbHNlOwogICBib29sIFN1Y2Nlc3MgPSBDbGFuZy0+RXhlY3V0ZUFjdGlvbigqQWN0KTsKICAgaWYgKENsYW5nLT5nZXRGcm9udGVuZE9wdHMoKS5EaXNhYmxlRnJlZSkKLSAgICBBY3QudGFrZSgpOworICAgIEJ1cnlQb2ludGVyKEFjdC5yZWxlYXNlKCkpOwogICByZXR1cm4gU3VjY2VzczsKIH0KZGlmZiAtLWdpdCBhL2xpYi9IZWFkZXJzL0NNYWtlTGlzdHMudHh0IGIvbGliL0hlYWRlcnMvQ01ha2VMaXN0cy50eHQKaW5kZXggMmRhMWEyOC4uZDBjMjY4NCAxMDA2NDQKLS0tIGEvbGliL0hlYWRlcnMvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL0hlYWRlcnMvQ01ha2VMaXN0cy50eHQKQEAgLTEwLDYgKzEwLDcgQEAKICAgZmxvYXQuaAogICBmbWE0aW50cmluLmgKICAgZm1haW50cmluLmgKKyAgaWEzMmludHJpbi5oCiAgIGltbWludHJpbi5oCiAgIGlzbzY0Ni5oCiAgIEludHJpbi5oCkBAIC00NywxNyArNDgsMTAgQEAKICAgbW9kdWxlLm1hcAogICApCiAKLXNldChvdXRwdXRfZGlyICR7Q01BS0VfTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZfS9jbGFuZy8ke0NMQU5HX1ZFUlNJT059L2luY2x1ZGUpCi0KLSMgSWYgd2UgYXJlIGluIGFuIElERSB0aGF0IGhhcyBhIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LCB3ZSBuZWVkIHRvCi0jIGNyZWF0ZSBhIHNlY29uZCBjb3B5IG9mIHRoZSBoZWFkZXJzIHNvIHRoYXQgJ2NsYW5nJyBjYW4gZmluZCB0aGVtIGlmCi0jIGl0J3MgcnVuIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLWlmKE1TVkNfSURFIE9SIFhDT0RFKQotICAgc2V0KG90aGVyX291dHB1dF9kaXIgJHtDTUFLRV9SVU5USU1FX09VVFBVVF9ESVJFQ1RPUll9L2xpYi9jbGFuZy8ke0NMQU5HX1ZFUlNJT059L2luY2x1ZGUpCi1lbmRpZigpCitzZXQob3V0cHV0X2RpciAke0xMVk1fTElCUkFSWV9PVVRQVVRfSU5URElSfS9jbGFuZy8ke0NMQU5HX1ZFUlNJT059L2luY2x1ZGUpCiAKICMgR2VuZXJhdGUgYXJtX25lb24uaAotY2xhbmdfdGFibGVnZW4oYXJtX25lb24uaC5pbmMgLWdlbi1hcm0tbmVvbgorY2xhbmdfdGFibGVnZW4oYXJtX25lb24uaCAtZ2VuLWFybS1uZW9uCiAgIFNPVVJDRSAke0NMQU5HX1NPVVJDRV9ESVJ9L2luY2x1ZGUvY2xhbmcvQmFzaWMvYXJtX25lb24udGQpCiAKIHNldChvdXRfZmlsZXMpCkBAIC02OSw0MyArNjMsMTggQEAKICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgJHtzcmN9ICR7ZHN0fQogICAgIENPTU1FTlQgIkNvcHlpbmcgY2xhbmcncyAke2Z9Li4uIikKICAgbGlzdChBUFBFTkQgb3V0X2ZpbGVzICR7ZHN0fSkKLQotICBpZihvdGhlcl9vdXRwdXRfZGlyKQotICAgc2V0KG90aGVyX2RzdCAke290aGVyX291dHB1dF9kaXJ9LyR7Zn0pCi0gICAgYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCAke290aGVyX2RzdH0KLSAgICAgIERFUEVORFMgJHtzcmN9Ci0gICAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weV9pZl9kaWZmZXJlbnQgJHtzcmN9ICR7b3RoZXJfZHN0fQotICAgICAgQ09NTUVOVCAiQ29weWluZyBjbGFuZydzICR7Zn0uLi4iKSAgICAKLSAgICBsaXN0KEFQUEVORCBvdXRfZmlsZXMgJHtvdGhlcl9kc3R9KQotICBlbmRpZigpCiBlbmRmb3JlYWNoKCBmICkKIAogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCAke291dHB1dF9kaXJ9L2FybV9uZW9uLmggCi0gIERFUEVORFMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2FybV9uZW9uLmguaW5jCi0gIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYXJtX25lb24uaC5pbmMgJHtvdXRwdXRfZGlyfS9hcm1fbmVvbi5oCisgIERFUEVORFMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2FybV9uZW9uLmgKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9hcm1fbmVvbi5oICR7b3V0cHV0X2Rpcn0vYXJtX25lb24uaAogICBDT01NRU5UICJDb3B5aW5nIGNsYW5nJ3MgYXJtX25lb24uaC4uLiIpCiBsaXN0KEFQUEVORCBvdXRfZmlsZXMgJHtvdXRwdXRfZGlyfS9hcm1fbmVvbi5oKQogCi1pZiAob3RoZXJfb3V0cHV0X2RpcikKLSAgICBzZXQob3RoZXJfZHN0ICR7b3RoZXJfb3V0cHV0X2Rpcn0vYXJtX25lb24uaCkKLSAgICBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICR7b3RoZXJfZHN0fQotICAgICAgREVQRU5EUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYXJtX25lb24uaC5pbmMKLSAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYXJtX25lb24uaC5pbmMgJHtvdGhlcl9kc3R9Ci0gICAgICBDT01NRU5UICJDb3B5aW5nIGNsYW5nJ3MgYXJtX25lb24uaC4uLiIpCi0gICAgbGlzdChBUFBFTkQgb3V0X2ZpbGVzICR7b3RoZXJfZHN0fSkKLWVuZGlmICgpCi0KIGFkZF9jdXN0b21fdGFyZ2V0KGNsYW5nLWhlYWRlcnMgQUxMIERFUEVORFMgJHtvdXRfZmlsZXN9KQogc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGNsYW5nLWhlYWRlcnMgUFJPUEVSVElFUyBGT0xERVIgIk1pc2MiKQogCi1pZiAob3RoZXJfb3V0cHV0X2RpcikKLSAgaWYoVU5JWCkKLSAgICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIGNsYW5nLWhlYWRlcnMgUE9TVF9CVUlMRAotICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAiJHtDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUll9LyR7Q01BS0VfQ0ZHX0lOVERJUn0iCi0gICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNyZWF0ZV9zeW1saW5rICIke0NNQUtFX1JVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWX0vbGliL2NsYW5nIiAiJHtDTUFLRV9MSUJSQVJZX09VVFBVVF9ESVJFQ1RPUll9LyR7Q01BS0VfQ0ZHX0lOVERJUn0vY2xhbmciKQotICBlbmRpZigpCi1lbmRpZiAoKQotCi1pbnN0YWxsKEZJTEVTICR7ZmlsZXN9ICR7b3V0cHV0X2Rpcn0vYXJtX25lb24uaAoraW5zdGFsbCgKKyAgRklMRVMgJHtmaWxlc30gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2FybV9uZW9uLmgKICAgUEVSTUlTU0lPTlMgT1dORVJfUkVBRCBPV05FUl9XUklURSBHUk9VUF9SRUFEIFdPUkxEX1JFQUQKICAgREVTVElOQVRJT04gbGliJHtMTFZNX0xJQkRJUl9TVUZGSVh9L2NsYW5nLyR7Q0xBTkdfVkVSU0lPTn0vaW5jbHVkZSkKZGlmZiAtLWdpdCBhL2xpYi9IZWFkZXJzL0ludHJpbi5oIGIvbGliL0hlYWRlcnMvSW50cmluLmgKaW5kZXggNDM3NjQ2NC4uZTM2NWFiZSAxMDA2NDQKLS0tIGEvbGliL0hlYWRlcnMvSW50cmluLmgKKysrIGIvbGliL0hlYWRlcnMvSW50cmluLmgKQEAgLTMyLDYgKzMyLDkgQEAKIC8qIEZpcnN0IGluY2x1ZGUgdGhlIHN0YW5kYXJkIGludHJpbnNpY3MuICovCiAjaW5jbHVkZSA8eDg2aW50cmluLmg+CiAKKy8qIEZvciB0aGUgZGVmaW5pdGlvbiBvZiBqbXBfYnVmLiAqLworI2luY2x1ZGUgPHNldGptcC5oPgorCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCkBAIC00OCwxMyArNTEsMTYgQEAKIHZvaWQgX19hZGRmc2R3b3JkKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogdm9pZCBfX2FkZGZzd29yZCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBzaG9ydCk7CiB2b2lkIF9fY29kZV9zZWcoY29uc3QgY2hhciAqKTsKK3N0YXRpYyBfX2lubGluZV9fCiB2b2lkIF9fY3B1aWQoaW50WzRdLCBpbnQpOworc3RhdGljIF9faW5saW5lX18KIHZvaWQgX19jcHVpZGV4KGludFs0XSwgaW50LCBpbnQpOwogdm9pZCBfX2RlYnVnYnJlYWsodm9pZCk7CiBfX2ludDY0IF9fZW11bChpbnQsIGludCk7CiB1bnNpZ25lZCBfX2ludDY0IF9fZW11bHUodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogdm9pZCBfX2NkZWNsIF9fZmFzdGZhaWwodW5zaWduZWQgaW50KTsKIHVuc2lnbmVkIGludCBfX2dldGNhbGxlcnNlZmxhZ3Modm9pZCk7CitzdGF0aWMgX19pbmxpbmVfXwogdm9pZCBfX2hhbHQodm9pZCk7CiB1bnNpZ25lZCBjaGFyIF9faW5ieXRlKHVuc2lnbmVkIHNob3J0KTsKIHZvaWQgX19pbmJ5dGVzdHJpbmcodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZyk7CkBAIC03NSw4ICs4MSwxMSBAQAogdm9pZCBfX2x3cHZhbDMyKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogdW5zaWduZWQgaW50IF9fbHpjbnQodW5zaWduZWQgaW50KTsKIHVuc2lnbmVkIHNob3J0IF9fbHpjbnQxNih1bnNpZ25lZCBzaG9ydCk7CitzdGF0aWMgX19pbmxpbmVfXwogdm9pZCBfX21vdnNiKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciBjb25zdCAqLCBzaXplX3QpOworc3RhdGljIF9faW5saW5lX18KIHZvaWQgX19tb3ZzZCh1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgY29uc3QgKiwgc2l6ZV90KTsKK3N0YXRpYyBfX2lubGluZV9fCiB2b2lkIF9fbW92c3codW5zaWduZWQgc2hvcnQgKiwgdW5zaWduZWQgc2hvcnQgY29uc3QgKiwgc2l6ZV90KTsKIHZvaWQgX19ub3Aodm9pZCk7CiB2b2lkIF9fbnZyZWdfcmVzdG9yZV9mZW5jZSh2b2lkKTsKQEAgLTkxLDI2ICsxMDAsMzUgQEAKIHVuc2lnbmVkIGludCBfX3BvcGNudCh1bnNpZ25lZCBpbnQpOwogc3RhdGljIF9faW5saW5lX18KIHVuc2lnbmVkIHNob3J0IF9fcG9wY250MTYodW5zaWduZWQgc2hvcnQpOworc3RhdGljIF9faW5saW5lX18KIHVuc2lnbmVkIF9faW50NjQgX19yZHRzYyh2b2lkKTsKIHVuc2lnbmVkIF9faW50NjQgX19yZHRzY3AodW5zaWduZWQgaW50ICopOwogdW5zaWduZWQgbG9uZyBfX3JlYWRjcjAodm9pZCk7CiB1bnNpZ25lZCBsb25nIF9fcmVhZGNyMih2b2lkKTsKIHVuc2lnbmVkIGxvbmcgX19yZWFkY3IzKHZvaWQpOwotdW5zaWduZWQgbG9uZyBfX3JlYWRjcjUodm9pZCk7Cit1bnNpZ25lZCBsb25nIF9fcmVhZGNyNCh2b2lkKTsKIHVuc2lnbmVkIGxvbmcgX19yZWFkY3I4KHZvaWQpOwogdW5zaWduZWQgaW50IF9fcmVhZGRyKHVuc2lnbmVkIGludCk7Ci11bnNpZ25lZCBpbnQgX19yZWFkZWZsYWdzKHZvaWQpOworI2lmZGVmIF9faTM4Nl9fCitzdGF0aWMgX19pbmxpbmVfXwogdW5zaWduZWQgY2hhciBfX3JlYWRmc2J5dGUodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgX19pbmxpbmVfXwogdW5zaWduZWQgbG9uZyBfX3JlYWRmc2R3b3JkKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIF9faW5saW5lX18KIHVuc2lnbmVkIF9faW50NjQgX19yZWFkZnNxd29yZCh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBfX2lubGluZV9fCiB1bnNpZ25lZCBzaG9ydCBfX3JlYWRmc3dvcmQodW5zaWduZWQgbG9uZyk7CisjZW5kaWYKIHVuc2lnbmVkIF9faW50NjQgX19yZWFkbXNyKHVuc2lnbmVkIGxvbmcpOwogdW5zaWduZWQgX19pbnQ2NCBfX3JlYWRwbWModW5zaWduZWQgbG9uZyk7CiB1bnNpZ25lZCBsb25nIF9fc2VnbWVudGxpbWl0KHVuc2lnbmVkIGxvbmcpOwogdm9pZCBfX3NpZHQodm9pZCAqKTsKIHZvaWQgKl9fc2x3cGNiKHZvaWQpOworc3RhdGljIF9faW5saW5lX18KIHZvaWQgX19zdG9zYih1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIsIHNpemVfdCk7CitzdGF0aWMgX19pbmxpbmVfXwogdm9pZCBfX3N0b3NkKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90KTsKK3N0YXRpYyBfX2lubGluZV9fCiB2b2lkIF9fc3Rvc3codW5zaWduZWQgc2hvcnQgKiwgdW5zaWduZWQgc2hvcnQsIHNpemVfdCk7CiB2b2lkIF9fc3ZtX2NsZ2kodm9pZCk7CiB2b2lkIF9fc3ZtX2ludmxwZ2Eodm9pZCAqLCBpbnQpOwpAQCAtMTI5LDcgKzE0Nyw2IEBACiB2b2lkIF9fd3JpdGVjcjQodW5zaWduZWQgaW50KTsKIHZvaWQgX193cml0ZWNyOCh1bnNpZ25lZCBpbnQpOwogdm9pZCBfX3dyaXRlZHIodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwotdm9pZCBfX3dyaXRlZWZsYWdzKHVuc2lnbmVkIGludCk7CiB2b2lkIF9fd3JpdGVmc2J5dGUodW5zaWduZWQgbG9uZywgdW5zaWduZWQgY2hhcik7CiB2b2lkIF9fd3JpdGVmc2R3b3JkKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogdm9pZCBfX3dyaXRlZnNxd29yZCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBfX2ludDY0KTsKQEAgLTEzOSw3ICsxNTYsNiBAQAogdm9pZCAqX0FkZHJlc3NPZlJldHVybkFkZHJlc3Modm9pZCk7CiB1bnNpZ25lZCBpbnQgX2FuZG5fdTMyKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIHVuc2lnbmVkIGludCBfYmV4dHJfdTMyKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwotdW5zaWduZWQgaW50IF9iZXh0cl91MzIodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CiB1bnNpZ25lZCBpbnQgX2JleHRyaV91MzIodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogc3RhdGljIF9faW5saW5lX18KIHVuc2lnbmVkIGNoYXIgX0JpdFNjYW5Gb3J3YXJkKHVuc2lnbmVkIGxvbmcgKl9JbmRleCwgdW5zaWduZWQgbG9uZyBfTWFzayk7CkBAIC0xNjIsOCArMTc4LDYgQEAKIHVuc2lnbmVkIGludCBfYmxzaV91MzIodW5zaWduZWQgaW50KTsKIHVuc2lnbmVkIGludCBfYmxzaWNfdTMyKHVuc2lnbmVkIGludCk7CiB1bnNpZ25lZCBpbnQgX2Jsc21za191MzIodW5zaWduZWQgaW50KTsKLXVuc2lnbmVkIGludCBfYmxzbXNrX3UzMih1bnNpZ25lZCBpbnQpOwotdW5zaWduZWQgaW50IF9ibHNyX3UzMih1bnNpZ25lZCBpbnQpOwogdW5zaWduZWQgaW50IF9ibHNyX3UzMih1bnNpZ25lZCBpbnQpOwogdW5zaWduZWQgX19pbnQ2NCBfX2NkZWNsIF9ieXRlc3dhcF91aW50NjQodW5zaWduZWQgX19pbnQ2NCk7CiB1bnNpZ25lZCBsb25nIF9fY2RlY2wgX2J5dGVzd2FwX3Vsb25nKHVuc2lnbmVkIGxvbmcpOwpAQCAtMTgxLDYgKzE5NSw3IEBACiBzdGF0aWMgX19pbmxpbmVfXwogY2hhciBfSW50ZXJsb2NrZWRBbmQ4KGNoYXIgdm9sYXRpbGUgKl9WYWx1ZSwgY2hhciBfTWFzayk7CiB1bnNpZ25lZCBjaGFyIF9pbnRlcmxvY2tlZGJpdHRlc3RhbmRyZXNldChsb25nIHZvbGF0aWxlICosIGxvbmcpOworc3RhdGljIF9faW5saW5lX18KIHVuc2lnbmVkIGNoYXIgX2ludGVybG9ja2VkYml0dGVzdGFuZHNldChsb25nIHZvbGF0aWxlICosIGxvbmcpOwogc3RhdGljIF9faW5saW5lX18KIGxvbmcgX19jZGVjbCBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UobG9uZyB2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLApAQCAtMjE5LDYgKzIzNCwxMCBAQAogbG9uZyBfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZF9ITEVBY3F1aXJlKGxvbmcgdm9sYXRpbGUgKiwgbG9uZyk7CiBsb25nIF9JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkX0hMRVJlbGVhc2UobG9uZyB2b2xhdGlsZSAqLCBsb25nKTsKIHN0YXRpYyBfX2lubGluZV9fCitzaG9ydCBfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDE2KHNob3J0IHZvbGF0aWxlICpfQWRkZW5kLCBzaG9ydCBfVmFsdWUpOworX19pbnQ2NCBfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0X0hMRUFjcXVpcmUoX19pbnQ2NCB2b2xhdGlsZSAqLCBfX2ludDY0KTsKK19faW50NjQgX0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NF9ITEVSZWxlYXNlKF9faW50NjQgdm9sYXRpbGUgKiwgX19pbnQ2NCk7CitzdGF0aWMgX19pbmxpbmVfXwogY2hhciBfSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDgoY2hhciB2b2xhdGlsZSAqX0FkZGVuZCwgY2hhciBfVmFsdWUpOwogc3RhdGljIF9faW5saW5lX18KIGxvbmcgX19jZGVjbCBfSW50ZXJsb2NrZWRJbmNyZW1lbnQobG9uZyB2b2xhdGlsZSAqX0FkZGVuZCk7CkBAIC0yNjksMTAgKzI4OCw3IEBACiBzdGF0aWMgX19pbmxpbmVfXwogdW5zaWduZWQgY2hhciBfcm90cjgodW5zaWduZWQgY2hhciBfVmFsdWUsIHVuc2lnbmVkIGNoYXIgX1NoaWZ0KTsKIGludCBfc2FyeF9pMzIoaW50LCB1bnNpZ25lZCBpbnQpOwotCi0vKiBGSVhNRTogTmVlZCBkZWZpbml0aW9uIGZvciBqbXBfYnVmLgotICAgaW50IF9fY2RlY2wgX3NldGptcChqbXBfYnVmKTsgKi8KLQoraW50IF9fY2RlY2wgX3NldGptcChqbXBfYnVmKTsKIHVuc2lnbmVkIGludCBfc2hseF91MzIodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogdW5zaWduZWQgaW50IF9zaHJ4X3UzMih1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CiB2b2lkIF9TdG9yZV9ITEVSZWxlYXNlKGxvbmcgdm9sYXRpbGUgKiwgbG9uZyk7CkBAIC0yODAsMTMgKzI5NiwxMyBAQAogdm9pZCBfU3RvcmVQb2ludGVyX0hMRVJlbGVhc2Uodm9pZCAqdm9sYXRpbGUgKiwgdm9pZCAqKTsKIHVuc2lnbmVkIGludCBfdDFtc2tjX3UzMih1bnNpZ25lZCBpbnQpOwogdW5zaWduZWQgaW50IF90emNudF91MzIodW5zaWduZWQgaW50KTsKLXVuc2lnbmVkIGludCBfdHpjbnRfdTMyKHVuc2lnbmVkIGludCk7CiB1bnNpZ25lZCBpbnQgX3R6bXNrX3UzMih1bnNpZ25lZCBpbnQpOwogc3RhdGljIF9faW5saW5lX18KIHZvaWQgX1dyaXRlQmFycmllcih2b2lkKTsKIHZvaWQgX3hhYm9ydChjb25zdCB1bnNpZ25lZCBpbnQgaW1tKTsKIHVuc2lnbmVkIF9faW50MzIgeGJlZ2luKHZvaWQpOwogdm9pZCBfeGVuZCh2b2lkKTsKK3N0YXRpYyBfX2lubGluZV9fCiB1bnNpZ25lZCBfX2ludDY0IF9fY2RlY2wgX3hnZXRidih1bnNpZ25lZCBpbnQpOwogdm9pZCBfX2NkZWNsIF94cnN0b3Iodm9pZCBjb25zdCAqLCB1bnNpZ25lZCBfX2ludDY0KTsKIHZvaWQgX19jZGVjbCBfeHNhdmUodm9pZCAqLCB1bnNpZ25lZCBfX2ludDY0KTsKQEAgLTMwMCwxOSArMzE2LDQ3IEBACiB2b2lkIF9fYWRkZ3Nkd29yZCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIHZvaWQgX19hZGRnc3F3b3JkKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIF9faW50NjQpOwogdm9pZCBfX2FkZGdzd29yZCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBzaG9ydCk7CitzdGF0aWMgX19pbmxpbmVfXwogdm9pZCBfX2Zhc3RzdG9yZWZlbmNlKHZvaWQpOwogdm9pZCBfX2luY2dzYnl0ZSh1bnNpZ25lZCBsb25nKTsKIHZvaWQgX19pbmNnc2R3b3JkKHVuc2lnbmVkIGxvbmcpOwogdm9pZCBfX2luY2dzcXdvcmQodW5zaWduZWQgbG9uZyk7CiB2b2lkIF9faW5jZ3N3b3JkKHVuc2lnbmVkIGxvbmcpOwordW5zaWduZWQgY2hhciBfX2x3cGluczY0KHVuc2lnbmVkIF9faW50NjQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK3ZvaWQgX19sd3B2YWw2NCh1bnNpZ25lZCBfX2ludDY0LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Cit1bnNpZ25lZCBfX2ludDY0IF9fbHpjbnQ2NCh1bnNpZ25lZCBfX2ludDY0KTsKK3N0YXRpYyBfX2lubGluZV9fCit2b2lkIF9fbW92c3EodW5zaWduZWQgbG9uZyBsb25nICosIHVuc2lnbmVkIGxvbmcgbG9uZyBjb25zdCAqLCBzaXplX3QpOworX19pbnQ2NCBfX211bGgoX19pbnQ2NCwgX19pbnQ2NCk7CitzdGF0aWMgX19pbmxpbmVfXwogdW5zaWduZWQgX19pbnQ2NCBfX3BvcGNudDY0KHVuc2lnbmVkIF9faW50NjQpOworc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIGNoYXIgX19yZWFkZ3NieXRlKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIF9faW5saW5lX18KK3Vuc2lnbmVkIGxvbmcgX19yZWFkZ3Nkd29yZCh1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBfX2lubGluZV9fCit1bnNpZ25lZCBfX2ludDY0IF9fcmVhZGdzcXdvcmQodW5zaWduZWQgbG9uZyk7Cit1bnNpZ25lZCBzaG9ydCBfX3JlYWRnc3dvcmQodW5zaWduZWQgbG9uZyk7CiB1bnNpZ25lZCBfX2ludDY0IF9fc2hpZnRsZWZ0MTI4KHVuc2lnbmVkIF9faW50NjQgX0xvd1BhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIF9faW50NjQgX0hpZ2hQYXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9TaGlmdCk7CiB1bnNpZ25lZCBfX2ludDY0IF9fc2hpZnRyaWdodDEyOCh1bnNpZ25lZCBfX2ludDY0IF9Mb3dQYXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX19pbnQ2NCBfSGlnaFBhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIF9TaGlmdCk7CitzdGF0aWMgX19pbmxpbmVfXwogdm9pZCBfX3N0b3NxKHVuc2lnbmVkIF9faW50NjQgKiwgdW5zaWduZWQgX19pbnQ2NCwgc2l6ZV90KTsKK3Vuc2lnbmVkIF9faW50NjQgX191bXVsaCh1bnNpZ25lZCBfX2ludDY0LCB1bnNpZ25lZCBfX2ludDY0KTsKK3Vuc2lnbmVkIGNoYXIgX192bXhfb24odW5zaWduZWQgX19pbnQ2NCAqKTsKK3Vuc2lnbmVkIGNoYXIgX192bXhfdm1jbGVhcih1bnNpZ25lZCBfX2ludDY0ICopOwordW5zaWduZWQgY2hhciBfX3ZteF92bWxhdW5jaCh2b2lkKTsKK3Vuc2lnbmVkIGNoYXIgX192bXhfdm1wdHJsZCh1bnNpZ25lZCBfX2ludDY0ICopOwordW5zaWduZWQgY2hhciBfX3ZteF92bXJlYWQoc2l6ZV90LCBzaXplX3QgKik7Cit1bnNpZ25lZCBjaGFyIF9fdm14X3ZtcmVzdW1lKHZvaWQpOwordW5zaWduZWQgY2hhciBfX3ZteF92bXdyaXRlKHNpemVfdCwgc2l6ZV90KTsKK3ZvaWQgX193cml0ZWdzYnl0ZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBjaGFyKTsKK3ZvaWQgX193cml0ZWdzZHdvcmQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7Cit2b2lkIF9fd3JpdGVnc3F3b3JkKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIF9faW50NjQpOwordm9pZCBfX3dyaXRlZ3N3b3JkKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIHNob3J0KTsKIHVuc2lnbmVkIF9faW50NjQgX2FuZG5fdTY0KHVuc2lnbmVkIF9faW50NjQsIHVuc2lnbmVkIF9faW50NjQpOwogdW5zaWduZWQgX19pbnQ2NCBfYmV4dHJfdTY0KHVuc2lnbmVkIF9faW50NjQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIHVuc2lnbmVkIF9faW50NjQgX2JleHRyaV91NjQodW5zaWduZWQgX19pbnQ2NCwgdW5zaWduZWQgaW50KTsKQEAgLTMzNiw3ICszODAsNyBAQAogdW5zaWduZWQgX19pbnQ2NCBfYmxzZmlsbF91NjQodW5zaWduZWQgX19pbnQ2NCk7CiB1bnNpZ25lZCBfX2ludDY0IF9ibHNpX3U2NCh1bnNpZ25lZCBfX2ludDY0KTsKIHVuc2lnbmVkIF9faW50NjQgX2Jsc2ljX3U2NCh1bnNpZ25lZCBfX2ludDY0KTsKLXVuc2lnbmVkIF9faW50NjQgX2JsbXNrX3U2NCh1bnNpZ25lZCBfX2ludDY0KTsKK3Vuc2lnbmVkIF9faW50NjQgX2Jsc21za191NjQodW5zaWduZWQgX19pbnQ2NCk7CiB1bnNpZ25lZCBfX2ludDY0IF9ibHNyX3U2NCh1bnNpZ25lZCBfX2ludDY0KTsKIHVuc2lnbmVkIF9faW50NjQgX19jZGVjbCBfYnl0ZXN3YXBfdWludDY0KHVuc2lnbmVkIF9faW50NjQpOwogdW5zaWduZWQgX19pbnQ2NCBfYnpoaV91NjQodW5zaWduZWQgX19pbnQ2NCwgdW5zaWduZWQgaW50KTsKQEAgLTM0Nyw2ICszOTEsNyBAQAogX19pbnQ2NCBfSW50ZXJsb2NrZWRBbmQ2NF9ucChfX2ludDY0IHZvbGF0aWxlICpfVmFsdWUsIF9faW50NjQgX01hc2spOwogY2hhciBfSW50ZXJsb2NrZWRBbmQ4X25wKGNoYXIgdm9sYXRpbGUgKl9WYWx1ZSwgY2hhciBfTWFzayk7CiB1bnNpZ25lZCBjaGFyIF9pbnRlcmxvY2tlZGJpdHRlc3RhbmRyZXNldDY0KF9faW50NjQgdm9sYXRpbGUgKiwgX19pbnQ2NCk7CitzdGF0aWMgX19pbmxpbmVfXwogdW5zaWduZWQgY2hhciBfaW50ZXJsb2NrZWRiaXR0ZXN0YW5kc2V0NjQoX19pbnQ2NCB2b2xhdGlsZSAqLCBfX2ludDY0KTsKIGxvbmcgX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlX25wKGxvbmcgdm9sYXRpbGUgKl9EZXN0aW5hdGlvbiwgbG9uZyBfRXhjaGFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIF9Db21wYXJhbmQpOwpAQCAtMzYwLDE4ICs0MDUsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW50NjQgKl9Db21wYXJhbmRSZXN1bHQpOwogc2hvcnQgX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlMTZfbnAoc2hvcnQgdm9sYXRpbGUgKl9EZXN0aW5hdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IF9FeGNoYW5nZSwgc2hvcnQgX0NvbXBhcmFuZCk7CitfX2ludDY0IF9JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0X0hMRUFjcXVpcmUoX19pbnQ2NCB2b2xhdGlsZSAqLCBfX2ludDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW50NjQpOworX19pbnQ2NCBfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NF9ITEVSZWxlYXNlKF9faW50NjQgdm9sYXRpbGUgKiwgX19pbnQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ludDY0KTsKIF9faW50NjQgX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjRfbnAoX19pbnQ2NCB2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ludDY0IF9FeGNoYW5nZSwgX19pbnQ2NCBfQ29tcGFyYW5kKTsKK3N0YXRpYyBfX2lubGluZV9fCit2b2lkICpfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKHZvaWQgKnZvbGF0aWxlICpfRGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKl9FeGNoYW5nZSwgdm9pZCAqX0NvbXBhcmFuZCk7CiB2b2lkICpfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyX25wKHZvaWQgKnZvbGF0aWxlICpfRGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKl9FeGNoYW5nZSwgdm9pZCAqX0NvbXBhcmFuZCk7CitzdGF0aWMgX19pbmxpbmVfXworX19pbnQ2NCBfSW50ZXJsb2NrZWREZWNyZW1lbnQ2NChfX2ludDY0IHZvbGF0aWxlICpfQWRkZW5kKTsKK3N0YXRpYyBfX2lubGluZV9fCitfX2ludDY0IF9JbnRlcmxvY2tlZEV4Y2hhbmdlNjQoX19pbnQ2NCB2b2xhdGlsZSAqX1RhcmdldCwgX19pbnQ2NCBfVmFsdWUpOworc3RhdGljIF9faW5saW5lX18KK19faW50NjQgX0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NChfX2ludDY0IHZvbGF0aWxlICpfQWRkZW5kLCBfX2ludDY0IF9WYWx1ZSk7CitzdGF0aWMgX19pbmxpbmVfXwordm9pZCAqX0ludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKHZvaWQgKnZvbGF0aWxlICpfVGFyZ2V0LCB2b2lkICpfVmFsdWUpOworc3RhdGljIF9faW5saW5lX18KK19faW50NjQgX0ludGVybG9ja2VkSW5jcmVtZW50NjQoX19pbnQ2NCB2b2xhdGlsZSAqX0FkZGVuZCk7CiBsb25nIF9JbnRlcmxvY2tlZE9yX25wKGxvbmcgdm9sYXRpbGUgKl9WYWx1ZSwgbG9uZyBfTWFzayk7CiBzaG9ydCBfSW50ZXJsb2NrZWRPcjE2X25wKHNob3J0IHZvbGF0aWxlICpfVmFsdWUsIHNob3J0IF9NYXNrKTsKK3N0YXRpYyBfX2lubGluZV9fCitfX2ludDY0IF9JbnRlcmxvY2tlZE9yNjQoX19pbnQ2NCB2b2xhdGlsZSAqX1ZhbHVlLCBfX2ludDY0IF9NYXNrKTsKIF9faW50NjQgX0ludGVybG9ja2VkT3I2NF9ucChfX2ludDY0IHZvbGF0aWxlICpfVmFsdWUsIF9faW50NjQgX01hc2spOwogY2hhciBfSW50ZXJsb2NrZWRPcjhfbnAoY2hhciB2b2xhdGlsZSAqX1ZhbHVlLCBjaGFyIF9NYXNrKTsKIGxvbmcgX0ludGVybG9ja2VkWG9yX25wKGxvbmcgdm9sYXRpbGUgKl9WYWx1ZSwgbG9uZyBfTWFzayk7CiBzaG9ydCBfSW50ZXJsb2NrZWRYb3IxNl9ucChzaG9ydCB2b2xhdGlsZSAqX1ZhbHVlLCBzaG9ydCBfTWFzayk7CitzdGF0aWMgX19pbmxpbmVfXworX19pbnQ2NCBfSW50ZXJsb2NrZWRYb3I2NChfX2ludDY0IHZvbGF0aWxlICpfVmFsdWUsIF9faW50NjQgX01hc2spOwogX19pbnQ2NCBfSW50ZXJsb2NrZWRYb3I2NF9ucChfX2ludDY0IHZvbGF0aWxlICpfVmFsdWUsIF9faW50NjQgX01hc2spOwogY2hhciBfSW50ZXJsb2NrZWRYb3I4X25wKGNoYXIgdm9sYXRpbGUgKl9WYWx1ZSwgY2hhciBfTWFzayk7CitzdGF0aWMgX19pbmxpbmVfXwogdW5zaWduZWQgX19pbnQ2NCBfbHpjbnRfdTY0KHVuc2lnbmVkIF9faW50NjQpOwogX19pbnQ2NCBfbXVsMTI4KF9faW50NjQgX011bHRpcGxpZXIsIF9faW50NjQgX011bHRpcGxpY2FuZCwKICAgICAgICAgICAgICAgICBfX2ludDY0ICpfSGlnaFByb2R1Y3QpOwpAQCAtMzgwLDYgKzQ0NywxMSBAQAogdW5zaWduZWQgaW50IF9fY2RlY2wgX3JlYWRnc2Jhc2VfdTMyKHZvaWQpOwogdW5zaWduZWQgX19pbnQ2NCBfX2NkZWNsIF9yZWFkZ3NiYXNlX3U2NCh2b2lkKTsKIHVuc2lnbmVkIF9faW50NjQgX3JvcnhfdTY0KHVuc2lnbmVkIF9faW50NjQsIGNvbnN0IHVuc2lnbmVkIGludCk7CitfX2ludDY0IF9zYXJ4X2k2NChfX2ludDY0LCB1bnNpZ25lZCBpbnQpOworLyogRklYTUU6IE5lZWQgZGVmaW5pdGlvbiBmb3Igam1wX2J1Zi4KKyAgaW50IF9fY2RlY2wgX3NldGptcGV4KGptcF9idWYpOyAqLwordW5zaWduZWQgX19pbnQ2NCBfc2hseF91NjQodW5zaWduZWQgX19pbnQ2NCwgdW5zaWduZWQgaW50KTsKK3Vuc2lnbmVkIF9faW50NjQgc2hyeF91NjQodW5zaWduZWQgX19pbnQ2NCwgdW5zaWduZWQgaW50KTsKIHVuc2lnbmVkIF9faW50NjQgX3R6Y250X3U2NCh1bnNpZ25lZCBfX2ludDY0KTsKIHVuc2lnbmVkIF9faW50NjQgX3R6bXNrX3U2NCh1bnNpZ25lZCBfX2ludDY0KTsKIHVuc2lnbmVkIF9faW50NjQgX3VtdWwxMjgodW5zaWduZWQgX19pbnQ2NCBfTXVsdGlwbGllciwKQEAgLTUwMyw2ICs1NzUsMTYgQEAKICAgKmEgPSAqYSB8ICgxIDw8IGIpOwogICByZXR1cm4geDsKIH0KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19pbnRlcmxvY2tlZGJpdHRlc3RhbmRzZXQobG9uZyB2b2xhdGlsZSAqX19CaXRCYXNlLCBsb25nIF9fQml0UG9zKSB7CisgIHVuc2lnbmVkIGNoYXIgX19SZXM7CisgIF9fYXNtX18gKCJ4b3IgJTAsICUwXG4iCisgICAgICAgICAgICJsb2NrIGJ0cyAlMiwgJTFcbiIKKyAgICAgICAgICAgInNldGMgJTBcbiIKKyAgICAgICAgICAgOiAiPXIiIChfX1JlcyksICIrbSIoKl9fQml0QmFzZSkKKyAgICAgICAgICAgOiAiSXIiKF9fQml0UG9zKSk7CisgIHJldHVybiBfX1JlczsKK30KICNpZmRlZiBfX3g4Nl82NF9fCiBzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCiBfQml0U2NhbkZvcndhcmQ2NCh1bnNpZ25lZCBsb25nICpfSW5kZXgsIHVuc2lnbmVkIF9faW50NjQgX01hc2spIHsKQEAgLTU1Miw2ICs2MzQsMTYgQEAKICAgKmEgPSAqYSB8ICgxbGwgPDwgYik7CiAgIHJldHVybiB4OwogfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX2ludGVybG9ja2VkYml0dGVzdGFuZHNldDY0KF9faW50NjQgdm9sYXRpbGUgKl9fQml0QmFzZSwgX19pbnQ2NCBfX0JpdFBvcykgeworICB1bnNpZ25lZCBjaGFyIF9fUmVzOworICBfX2FzbV9fICgieG9yICUwLCAlMFxuIgorICAgICAgICAgICAibG9jayBidHMgJTIsICUxXG4iCisgICAgICAgICAgICJzZXRjICUwXG4iCisgICAgICAgICAgIDogIj1yIiAoX19SZXMpLCAiK20iKCpfX0JpdEJhc2UpCisgICAgICAgICAgIDogIklyIihfX0JpdFBvcykpOworICByZXR1cm4gX19SZXM7Cit9CiAjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCiB8KiBJbnRlcmxvY2tlZCBFeGNoYW5nZSBBZGQKQEAgLTU2NCwxMCArNjU2LDYgQEAKIF9JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkMTYoc2hvcnQgdm9sYXRpbGUgKl9BZGRlbmQsIHNob3J0IF9WYWx1ZSkgewogICByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKF9BZGRlbmQsIF9WYWx1ZSwgMCkgLSBfVmFsdWU7CiB9Ci1zdGF0aWMgX19pbmxpbmVfXyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCi1fSW50ZXJsb2NrZWRFeGNoYW5nZUFkZChsb25nIHZvbGF0aWxlICpfQWRkZW5kLCBsb25nIF9WYWx1ZSkgewotICByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKF9BZGRlbmQsIF9WYWx1ZSwgMCkgLSBfVmFsdWU7Ci19CiAjaWZkZWYgX194ODZfNjRfXwogc3RhdGljIF9faW5saW5lX18gX19pbnQ2NCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQogX0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NChfX2ludDY0IHZvbGF0aWxlICpfQWRkZW5kLCBfX2ludDY0IF9WYWx1ZSkgewpAQCAtNTk4LDEyICs2ODYsOCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKIHwqIEludGVybG9ja2VkIEluY3JlbWVudAogXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBfX2lubGluZV9fIGNoYXIgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKLV9JbnRlcmxvY2tlZEluY3JlbWVudDE2KGNoYXIgdm9sYXRpbGUgKl9WYWx1ZSkgewotICByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKF9WYWx1ZSwgMSwgMCk7Ci19Ci1zdGF0aWMgX19pbmxpbmVfXyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCi1fSW50ZXJsb2NrZWRJbmNyZW1lbnQobG9uZyB2b2xhdGlsZSAqX1ZhbHVlKSB7CitzdGF0aWMgX19pbmxpbmVfXyBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX0ludGVybG9ja2VkSW5jcmVtZW50MTYoc2hvcnQgdm9sYXRpbGUgKl9WYWx1ZSkgewogICByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKF9WYWx1ZSwgMSwgMCk7CiB9CiAjaWZkZWYgX194ODZfNjRfXwpAQCAtNjE1LDEyICs2OTksOCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKIHwqIEludGVybG9ja2VkIERlY3JlbWVudAogXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBfX2lubGluZV9fIGNoYXIgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKLV9JbnRlcmxvY2tlZERlY3JlbWVudDE2KGNoYXIgdm9sYXRpbGUgKl9WYWx1ZSkgewotICByZXR1cm4gX19hdG9taWNfc3ViX2ZldGNoKF9WYWx1ZSwgMSwgMCk7Ci19Ci1zdGF0aWMgX19pbmxpbmVfXyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCi1fSW50ZXJsb2NrZWREZWNyZW1lbnQobG9uZyB2b2xhdGlsZSAqX1ZhbHVlKSB7CitzdGF0aWMgX19pbmxpbmVfXyBzaG9ydCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX0ludGVybG9ja2VkRGVjcmVtZW50MTYoc2hvcnQgdm9sYXRpbGUgKl9WYWx1ZSkgewogICByZXR1cm4gX19hdG9taWNfc3ViX2ZldGNoKF9WYWx1ZSwgMSwgMCk7CiB9CiAjaWZkZWYgX194ODZfNjRfXwpAQCAtNzE2LDYgKzc5NiwxMSBAQAogICBfX2F0b21pY19leGNoYW5nZShfVGFyZ2V0LCAmX1ZhbHVlLCAmX1ZhbHVlLCAwKTsKICAgcmV0dXJuIF9WYWx1ZTsKIH0KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgKl9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIodm9pZCAqdm9sYXRpbGUgKl9UYXJnZXQsIHZvaWQgKl9WYWx1ZSkgeworICBfX2F0b21pY19leGNoYW5nZShfVGFyZ2V0LCAmX1ZhbHVlLCAmX1ZhbHVlLCAwKTsKKyAgcmV0dXJuIF9WYWx1ZTsKK30KICNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKIHwqIEludGVybG9ja2VkIENvbXBhcmUgRXhjaGFuZ2UKQEAgLTczMiwxMiArODE3LDE0IEBACiAgIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UoX0Rlc3RpbmF0aW9uLCAmX0NvbXBhcmFuZCwgJl9FeGNoYW5nZSwgMCwgMCwgMCk7CiAgIHJldHVybiBfQ29tcGFyYW5kOwogfQotc3RhdGljIF9faW5saW5lX18gbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQotX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKGxvbmcgdm9sYXRpbGUgKl9EZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIF9FeGNoYW5nZSwgbG9uZyBfQ29tcGFyYW5kKSB7CisjaWZkZWYgX194ODZfNjRfXworc3RhdGljIF9faW5saW5lX18gdm9pZCAqX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19JbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZVBvaW50ZXIodm9pZCAqdm9sYXRpbGUgKl9EZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqX0V4Y2hhbmdlLCB2b2lkICpfQ29tcGFyYW5kKSB7CiAgIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UoX0Rlc3RpbmF0aW9uLCAmX0NvbXBhcmFuZCwgJl9FeGNoYW5nZSwgMCwgMCwgMCk7CiAgIHJldHVybiBfQ29tcGFyYW5kOwogfQorI2VuZGlmCiAjaWZkZWYgX194ODZfNjRfXwogc3RhdGljIF9faW5saW5lX18gX19pbnQ2NCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQogX0ludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoX19pbnQ2NCB2b2xhdGlsZSAqX0Rlc3RpbmF0aW9uLApAQCAtNzY0LDYgKzg1MSwxMDQgQEAKIF9Xcml0ZUJhcnJpZXIodm9pZCkgewogICBfX2FzbV9fIHZvbGF0aWxlICgiIiA6IDogOiAibWVtb3J5Iik7CiB9CisjaWZkZWYgX194ODZfNjRfXworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19mYXN0c3RvcmVmZW5jZSh2b2lkKSB7CisgIF9fYXNtX18gdm9sYXRpbGUoImxvY2sgb3JxICQwLCAoJSVyc3ApIiA6IDogOiAibWVtb3J5Iik7Cit9CisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCit8KiByZWFkZnMsIHJlYWRncworfCogKFBvaW50ZXJzIGluIGFkZHJlc3Mgc3BhY2UgIzI1NiBhbmQgIzI1NyBhcmUgcmVsYXRpdmUgdG8gdGhlIEdTIGFuZCBGUworfCogc2VnbWVudCByZWdpc3RlcnMsIHJlc3BlY3RpdmVseS4pCitcKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBfX3B0cl90b19hZGRyX3NwYWNlKF9fYWRkcl9zcGFjZV9uYnIsIF9fdHlwZSwgX19vZmZzZXQpICAgICAgICAgICAgICBcCisgICAgKCh2b2xhdGlsZSBfX3R5cGUgX19hdHRyaWJ1dGVfXygoX19hZGRyZXNzX3NwYWNlX18oX19hZGRyX3NwYWNlX25icikpKSopIFwKKyAgICAoX19vZmZzZXQpKQorCisjaWZkZWYgX19pMzg2X18KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGNoYXIgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fcmVhZGZzYnl0ZSh1bnNpZ25lZCBsb25nIF9fb2Zmc2V0KSB7CisgIHJldHVybiAqX19wdHJfdG9fYWRkcl9zcGFjZSgyNTcsIHVuc2lnbmVkIGNoYXIsIF9fb2Zmc2V0KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fcmVhZGZzZHdvcmQodW5zaWduZWQgbG9uZyBfX29mZnNldCkgeworICByZXR1cm4gKl9fcHRyX3RvX2FkZHJfc3BhY2UoMjU3LCB1bnNpZ25lZCBsb25nLCBfX29mZnNldCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBfX2ludDY0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JlYWRmc3F3b3JkKHVuc2lnbmVkIGxvbmcgX19vZmZzZXQpIHsKKyAgcmV0dXJuICpfX3B0cl90b19hZGRyX3NwYWNlKDI1NywgdW5zaWduZWQgX19pbnQ2NCwgX19vZmZzZXQpOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fcmVhZGZzd29yZCh1bnNpZ25lZCBsb25nIF9fb2Zmc2V0KSB7CisgIHJldHVybiAqX19wdHJfdG9fYWRkcl9zcGFjZSgyNTcsIHVuc2lnbmVkIHNob3J0LCBfX29mZnNldCk7Cit9CisjZW5kaWYKKyNpZmRlZiBfX3g4Nl82NF9fCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBjaGFyIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JlYWRnc2J5dGUodW5zaWduZWQgbG9uZyBfX29mZnNldCkgeworICByZXR1cm4gKl9fcHRyX3RvX2FkZHJfc3BhY2UoMjU2LCB1bnNpZ25lZCBjaGFyLCBfX29mZnNldCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JlYWRnc2R3b3JkKHVuc2lnbmVkIGxvbmcgX19vZmZzZXQpIHsKKyAgcmV0dXJuICpfX3B0cl90b19hZGRyX3NwYWNlKDI1NiwgdW5zaWduZWQgbG9uZywgX19vZmZzZXQpOworfQorc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgX19pbnQ2NCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19yZWFkZ3Nxd29yZCh1bnNpZ25lZCBsb25nIF9fb2Zmc2V0KSB7CisgIHJldHVybiAqX19wdHJfdG9fYWRkcl9zcGFjZSgyNTYsIHVuc2lnbmVkIF9faW50NjQsIF9fb2Zmc2V0KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JlYWRnc3dvcmQodW5zaWduZWQgbG9uZyBfX29mZnNldCkgeworICByZXR1cm4gKl9fcHRyX3RvX2FkZHJfc3BhY2UoMjU2LCB1bnNpZ25lZCBzaG9ydCwgX19vZmZzZXQpOworfQorI2VuZGlmCisjdW5kZWYgX19wdHJfdG9fYWRkcl9zcGFjZQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKK3wqIG1vdnMsIHN0b3MKK1wqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX21vdnNiKHVuc2lnbmVkIGNoYXIgKl9fZHN0LCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpfX3NyYywgc2l6ZV90IF9fbikgeworICBfX2FzbV9fKCJyZXAgbW92c2IiIDogOiAiRCIoX19kc3QpLCAiUyIoX19zcmMpLCAiYyIoX19uKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiJWVkaSIsICIlZXNpIiwgIiVlY3giKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fbW92c2QodW5zaWduZWQgbG9uZyAqX19kc3QsIHVuc2lnbmVkIGxvbmcgY29uc3QgKl9fc3JjLCBzaXplX3QgX19uKSB7CisgIF9fYXNtX18oInJlcCBtb3ZzbCIgOiA6ICJEIihfX2RzdCksICJTIihfX3NyYyksICJjIihfX24pCisgICAgICAgICAgICAgICAgICAgICAgICA6ICIlZWRpIiwgIiVlc2kiLCAiJWVjeCIpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19tb3Zzdyh1bnNpZ25lZCBzaG9ydCAqX19kc3QsIHVuc2lnbmVkIHNob3J0IGNvbnN0ICpfX3NyYywgc2l6ZV90IF9fbikgeworICBfX2FzbV9fKCJyZXAgbW92c2giIDogOiAiRCIoX19kc3QpLCAiUyIoX19zcmMpLCAiYyIoX19uKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiJWVkaSIsICIlZXNpIiwgIiVlY3giKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fc3Rvc2IodW5zaWduZWQgY2hhciAqX19kc3QsIHVuc2lnbmVkIGNoYXIgX194LCBzaXplX3QgX19uKSB7CisgIF9fYXNtX18oInJlcCBzdG9zYiIgOiA6ICJEIihfX2RzdCksICJhIihfX3gpLCAiYyIoX19uKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiJWVkaSIsICIlZWN4Iik7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3N0b3NkKHVuc2lnbmVkIGxvbmcgKl9fZHN0LCB1bnNpZ25lZCBsb25nIF9feCwgc2l6ZV90IF9fbikgeworICBfX2FzbV9fKCJyZXAgc3Rvc2wiIDogOiAiRCIoX19kc3QpLCAiYSIoX194KSwgImMiKF9fbikKKyAgICAgICAgICAgICAgICAgICAgICAgIDogIiVlZGkiLCAiJWVjeCIpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19zdG9zdyh1bnNpZ25lZCBzaG9ydCAqX19kc3QsIHVuc2lnbmVkIHNob3J0IF9feCwgc2l6ZV90IF9fbikgeworICBfX2FzbV9fKCJyZXAgc3Rvc2giIDogOiAiRCIoX19kc3QpLCAiYSIoX194KSwgImMiKF9fbikKKyAgICAgICAgICAgICAgICAgICAgICAgIDogIiVlZGkiLCAiJWVjeCIpOworfQorI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fbW92c3EodW5zaWduZWQgbG9uZyBsb25nICpfX2RzdCwgdW5zaWduZWQgbG9uZyBsb25nIGNvbnN0ICpfX3NyYywgc2l6ZV90IF9fbikgeworICBfX2FzbV9fKCJyZXAgbW92c3EiIDogOiAiRCIoX19kc3QpLCAiUyIoX19zcmMpLCAiYyIoX19uKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiJWVkaSIsICIlZXNpIiwgIiVlY3giKTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fc3Rvc3EodW5zaWduZWQgX19pbnQ2NCAqX19kc3QsIHVuc2lnbmVkIF9faW50NjQgX194LCBzaXplX3QgX19uKSB7CisgIF9fYXNtX18oInJlcCBzdG9zcSIgOiA6ICJEIihfX2RzdCksICJhIihfX3gpLCAiYyIoX19uKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiJWVkaSIsICIlZWN4Iik7Cit9CisjZW5kaWYKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKIHwqIE1pc2MKIFwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC03NzUsNiArOTYwLDI2IEBACiBfUmV0dXJuQWRkcmVzcyh2b2lkKSB7CiAgIHJldHVybiBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CiB9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX2NwdWlkKGludCBfX2luZm9bNF0sIGludCBfX2xldmVsKSB7CisgIF9fYXNtX18gKCJjcHVpZCIgOiAiPWEiKF9faW5mb1swXSksICI9YiIgKF9faW5mb1sxXSksICI9YyIoX19pbmZvWzJdKSwgIj1kIihfX2luZm9bM10pCisgICAgICAgICAgICAgICAgICAgOiAiYSIoX19sZXZlbCkpOworfQorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19jcHVpZGV4KGludCBfX2luZm9bNF0sIGludCBfX2xldmVsLCBpbnQgX19lY3gpIHsKKyAgX19hc21fXyAoImNwdWlkIiA6ICI9YSIoX19pbmZvWzBdKSwgIj1iIiAoX19pbmZvWzFdKSwgIj1jIihfX2luZm9bMl0pLCAiPWQiKF9faW5mb1szXSkKKyAgICAgICAgICAgICAgICAgICA6ICJhIihfX2xldmVsKSwgImMiKF9fZWN4KSk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBfX2ludDY0IF9fY2RlY2wgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK194Z2V0YnYodW5zaWduZWQgaW50IF9feGNyX25vKSB7CisgIHVuc2lnbmVkIGludCBfX2VheCwgX19lZHg7CisgIF9fYXNtX18gKCJ4Z2V0YnYiIDogIj1hIiAoX19lYXgpLCAiPWQiIChfX2VkeCkgOiAiYyIgKF9feGNyX25vKSk7CisgIHJldHVybiAoKHVuc2lnbmVkIF9faW50NjQpX19lZHggPDwgMzIpIHwgX19lYXg7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX2hhbHQodm9pZCkgeworICBfX2FzbV9fIHZvbGF0aWxlICgiaGx0Iik7Cit9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbGliL0hlYWRlcnMvYXJtX25lb24uaCBiL2xpYi9IZWFkZXJzL2FybV9uZW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTc1MTguLjAwMDAwMDAKLS0tIGEvbGliL0hlYWRlcnMvYXJtX25lb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDk1OTUgKzAsMCBAQAotLyo9PT0tLS0tIGFybV9uZW9uLmggLSBBUk0gTmVvbiBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLSAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi0gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi0gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCi0gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLSAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KLSAqIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ci0gKi8KLQotI2lmbmRlZiBfX0FSTV9ORU9OX0gKLSNkZWZpbmUgX19BUk1fTkVPTl9ICi0KLSNpZiAhZGVmaW5lZChfX0FSTV9ORU9OX18pICYmICFkZWZpbmVkKF9fQVJNX05FT04pCi0jZXJyb3IgIk5FT04gc3VwcG9ydCBub3QgZW5hYmxlZCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLXR5cGVkZWYgZmxvYXQgZmxvYXQzMl90OwotdHlwZWRlZiBfX2ZwMTYgZmxvYXQxNl90OwotI2lmZGVmIF9fYWFyY2g2NF9fCi10eXBlZGVmIGRvdWJsZSBmbG9hdDY0X3Q7Ci0jZW5kaWYKLQotI2lmZGVmIF9fYWFyY2g2NF9fCi10eXBlZGVmIHVpbnQ4X3QgcG9seThfdDsKLXR5cGVkZWYgdWludDE2X3QgcG9seTE2X3Q7Ci10eXBlZGVmIHVpbnQ2NF90IHBvbHk2NF90OwotI2Vsc2UKLXR5cGVkZWYgaW50OF90IHBvbHk4X3Q7Ci10eXBlZGVmIGludDE2X3QgcG9seTE2X3Q7Ci0jZW5kaWYKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSg4KSkpICBpbnQ4X3QgaW50OHg4X3Q7Ci10eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fdmVjdG9yX3R5cGUoMTYpKSkgaW50OF90IGludDh4MTZfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSg0KSkpICBpbnQxNl90IGludDE2eDRfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSg4KSkpICBpbnQxNl90IGludDE2eDhfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSgyKSkpICBpbnQzMl90IGludDMyeDJfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSg0KSkpICBpbnQzMl90IGludDMyeDRfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSgxKSkpICBpbnQ2NF90IGludDY0eDFfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSgyKSkpICBpbnQ2NF90IGludDY0eDJfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSg4KSkpICB1aW50OF90IHVpbnQ4eDhfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSgxNikpKSB1aW50OF90IHVpbnQ4eDE2X3Q7Ci10eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fdmVjdG9yX3R5cGUoNCkpKSAgdWludDE2X3QgdWludDE2eDRfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSg4KSkpICB1aW50MTZfdCB1aW50MTZ4OF90OwotdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDIpKSkgIHVpbnQzMl90IHVpbnQzMngyX3Q7Ci10eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fdmVjdG9yX3R5cGUoNCkpKSAgdWludDMyX3QgdWludDMyeDRfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSgxKSkpICB1aW50NjRfdCB1aW50NjR4MV90OwotdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDIpKSkgIHVpbnQ2NF90IHVpbnQ2NHgyX3Q7Ci10eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fdmVjdG9yX3R5cGUoNCkpKSAgZmxvYXQxNl90IGZsb2F0MTZ4NF90OwotdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDgpKSkgIGZsb2F0MTZfdCBmbG9hdDE2eDhfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSgyKSkpICBmbG9hdDMyX3QgZmxvYXQzMngyX3Q7Ci10eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fdmVjdG9yX3R5cGUoNCkpKSAgZmxvYXQzMl90IGZsb2F0MzJ4NF90OwotI2lmZGVmIF9fYWFyY2g2NF9fCi10eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fdmVjdG9yX3R5cGUoMSkpKSAgZmxvYXQ2NF90IGZsb2F0NjR4MV90OwotdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDIpKSkgIGZsb2F0NjRfdCBmbG9hdDY0eDJfdDsKLSNlbmRpZgotdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3BvbHl2ZWN0b3JfdHlwZSg4KSkpICBwb2x5OF90IHBvbHk4eDhfdDsKLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl9wb2x5dmVjdG9yX3R5cGUoMTYpKSkgcG9seThfdCBwb2x5OHgxNl90OwotdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3BvbHl2ZWN0b3JfdHlwZSg0KSkpICBwb2x5MTZfdCBwb2x5MTZ4NF90OwotdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3BvbHl2ZWN0b3JfdHlwZSg4KSkpICBwb2x5MTZfdCBwb2x5MTZ4OF90OwotI2lmZGVmIF9fYWFyY2g2NF9fCi10eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fcG9seXZlY3Rvcl90eXBlKDEpKSkgIHBvbHk2NF90IHBvbHk2NHgxX3Q7Ci10eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fcG9seXZlY3Rvcl90eXBlKDIpKSkgIHBvbHk2NF90IHBvbHk2NHgyX3Q7Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgaW50OHg4eDJfdCB7Ci0gIGludDh4OF90IHZhbFsyXTsKLX0gaW50OHg4eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaW50OHgxNngyX3QgewotICBpbnQ4eDE2X3QgdmFsWzJdOwotfSBpbnQ4eDE2eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaW50MTZ4NHgyX3QgewotICBpbnQxNng0X3QgdmFsWzJdOwotfSBpbnQxNng0eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaW50MTZ4OHgyX3QgewotICBpbnQxNng4X3QgdmFsWzJdOwotfSBpbnQxNng4eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaW50MzJ4MngyX3QgewotICBpbnQzMngyX3QgdmFsWzJdOwotfSBpbnQzMngyeDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaW50MzJ4NHgyX3QgewotICBpbnQzMng0X3QgdmFsWzJdOwotfSBpbnQzMng0eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaW50NjR4MXgyX3QgewotICBpbnQ2NHgxX3QgdmFsWzJdOwotfSBpbnQ2NHgxeDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaW50NjR4MngyX3QgewotICBpbnQ2NHgyX3QgdmFsWzJdOwotfSBpbnQ2NHgyeDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgdWludDh4OHgyX3QgewotICB1aW50OHg4X3QgdmFsWzJdOwotfSB1aW50OHg4eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgdWludDh4MTZ4Ml90IHsKLSAgdWludDh4MTZfdCB2YWxbMl07Ci19IHVpbnQ4eDE2eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgdWludDE2eDR4Ml90IHsKLSAgdWludDE2eDRfdCB2YWxbMl07Ci19IHVpbnQxNng0eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgdWludDE2eDh4Ml90IHsKLSAgdWludDE2eDhfdCB2YWxbMl07Ci19IHVpbnQxNng4eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgdWludDMyeDJ4Ml90IHsKLSAgdWludDMyeDJfdCB2YWxbMl07Ci19IHVpbnQzMngyeDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgdWludDMyeDR4Ml90IHsKLSAgdWludDMyeDRfdCB2YWxbMl07Ci19IHVpbnQzMng0eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgdWludDY0eDF4Ml90IHsKLSAgdWludDY0eDFfdCB2YWxbMl07Ci19IHVpbnQ2NHgxeDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgdWludDY0eDJ4Ml90IHsKLSAgdWludDY0eDJfdCB2YWxbMl07Ci19IHVpbnQ2NHgyeDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZmxvYXQxNng0eDJfdCB7Ci0gIGZsb2F0MTZ4NF90IHZhbFsyXTsKLX0gZmxvYXQxNng0eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZmxvYXQxNng4eDJfdCB7Ci0gIGZsb2F0MTZ4OF90IHZhbFsyXTsKLX0gZmxvYXQxNng4eDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZmxvYXQzMngyeDJfdCB7Ci0gIGZsb2F0MzJ4Ml90IHZhbFsyXTsKLX0gZmxvYXQzMngyeDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZmxvYXQzMng0eDJfdCB7Ci0gIGZsb2F0MzJ4NF90IHZhbFsyXTsKLX0gZmxvYXQzMng0eDJfdDsKLQotI2lmZGVmIF9fYWFyY2g2NF9fCi10eXBlZGVmIHN0cnVjdCBmbG9hdDY0eDF4Ml90IHsKLSAgZmxvYXQ2NHgxX3QgdmFsWzJdOwotfSBmbG9hdDY0eDF4Ml90OwotCi10eXBlZGVmIHN0cnVjdCBmbG9hdDY0eDJ4Ml90IHsKLSAgZmxvYXQ2NHgyX3QgdmFsWzJdOwotfSBmbG9hdDY0eDJ4Ml90OwotCi0jZW5kaWYKLXR5cGVkZWYgc3RydWN0IHBvbHk4eDh4Ml90IHsKLSAgcG9seTh4OF90IHZhbFsyXTsKLX0gcG9seTh4OHgyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHBvbHk4eDE2eDJfdCB7Ci0gIHBvbHk4eDE2X3QgdmFsWzJdOwotfSBwb2x5OHgxNngyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHBvbHkxNng0eDJfdCB7Ci0gIHBvbHkxNng0X3QgdmFsWzJdOwotfSBwb2x5MTZ4NHgyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHBvbHkxNng4eDJfdCB7Ci0gIHBvbHkxNng4X3QgdmFsWzJdOwotfSBwb2x5MTZ4OHgyX3Q7Ci0KLSNpZmRlZiBfX2FhcmNoNjRfXwotdHlwZWRlZiBzdHJ1Y3QgcG9seTY0eDF4Ml90IHsKLSAgcG9seTY0eDFfdCB2YWxbMl07Ci19IHBvbHk2NHgxeDJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcG9seTY0eDJ4Ml90IHsKLSAgcG9seTY0eDJfdCB2YWxbMl07Ci19IHBvbHk2NHgyeDJfdDsKLQotI2VuZGlmCi10eXBlZGVmIHN0cnVjdCBpbnQ4eDh4M190IHsKLSAgaW50OHg4X3QgdmFsWzNdOwotfSBpbnQ4eDh4M190OwotCi10eXBlZGVmIHN0cnVjdCBpbnQ4eDE2eDNfdCB7Ci0gIGludDh4MTZfdCB2YWxbM107Ci19IGludDh4MTZ4M190OwotCi10eXBlZGVmIHN0cnVjdCBpbnQxNng0eDNfdCB7Ci0gIGludDE2eDRfdCB2YWxbM107Ci19IGludDE2eDR4M190OwotCi10eXBlZGVmIHN0cnVjdCBpbnQxNng4eDNfdCB7Ci0gIGludDE2eDhfdCB2YWxbM107Ci19IGludDE2eDh4M190OwotCi10eXBlZGVmIHN0cnVjdCBpbnQzMngyeDNfdCB7Ci0gIGludDMyeDJfdCB2YWxbM107Ci19IGludDMyeDJ4M190OwotCi10eXBlZGVmIHN0cnVjdCBpbnQzMng0eDNfdCB7Ci0gIGludDMyeDRfdCB2YWxbM107Ci19IGludDMyeDR4M190OwotCi10eXBlZGVmIHN0cnVjdCBpbnQ2NHgxeDNfdCB7Ci0gIGludDY0eDFfdCB2YWxbM107Ci19IGludDY0eDF4M190OwotCi10eXBlZGVmIHN0cnVjdCBpbnQ2NHgyeDNfdCB7Ci0gIGludDY0eDJfdCB2YWxbM107Ci19IGludDY0eDJ4M190OwotCi10eXBlZGVmIHN0cnVjdCB1aW50OHg4eDNfdCB7Ci0gIHVpbnQ4eDhfdCB2YWxbM107Ci19IHVpbnQ4eDh4M190OwotCi10eXBlZGVmIHN0cnVjdCB1aW50OHgxNngzX3QgewotICB1aW50OHgxNl90IHZhbFszXTsKLX0gdWludDh4MTZ4M190OwotCi10eXBlZGVmIHN0cnVjdCB1aW50MTZ4NHgzX3QgewotICB1aW50MTZ4NF90IHZhbFszXTsKLX0gdWludDE2eDR4M190OwotCi10eXBlZGVmIHN0cnVjdCB1aW50MTZ4OHgzX3QgewotICB1aW50MTZ4OF90IHZhbFszXTsKLX0gdWludDE2eDh4M190OwotCi10eXBlZGVmIHN0cnVjdCB1aW50MzJ4MngzX3QgewotICB1aW50MzJ4Ml90IHZhbFszXTsKLX0gdWludDMyeDJ4M190OwotCi10eXBlZGVmIHN0cnVjdCB1aW50MzJ4NHgzX3QgewotICB1aW50MzJ4NF90IHZhbFszXTsKLX0gdWludDMyeDR4M190OwotCi10eXBlZGVmIHN0cnVjdCB1aW50NjR4MXgzX3QgewotICB1aW50NjR4MV90IHZhbFszXTsKLX0gdWludDY0eDF4M190OwotCi10eXBlZGVmIHN0cnVjdCB1aW50NjR4MngzX3QgewotICB1aW50NjR4Ml90IHZhbFszXTsKLX0gdWludDY0eDJ4M190OwotCi10eXBlZGVmIHN0cnVjdCBmbG9hdDE2eDR4M190IHsKLSAgZmxvYXQxNng0X3QgdmFsWzNdOwotfSBmbG9hdDE2eDR4M190OwotCi10eXBlZGVmIHN0cnVjdCBmbG9hdDE2eDh4M190IHsKLSAgZmxvYXQxNng4X3QgdmFsWzNdOwotfSBmbG9hdDE2eDh4M190OwotCi10eXBlZGVmIHN0cnVjdCBmbG9hdDMyeDJ4M190IHsKLSAgZmxvYXQzMngyX3QgdmFsWzNdOwotfSBmbG9hdDMyeDJ4M190OwotCi10eXBlZGVmIHN0cnVjdCBmbG9hdDMyeDR4M190IHsKLSAgZmxvYXQzMng0X3QgdmFsWzNdOwotfSBmbG9hdDMyeDR4M190OwotCi0jaWZkZWYgX19hYXJjaDY0X18KLXR5cGVkZWYgc3RydWN0IGZsb2F0NjR4MXgzX3QgewotICBmbG9hdDY0eDFfdCB2YWxbM107Ci19IGZsb2F0NjR4MXgzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGZsb2F0NjR4MngzX3QgewotICBmbG9hdDY0eDJfdCB2YWxbM107Ci19IGZsb2F0NjR4MngzX3Q7Ci0KLSNlbmRpZgotdHlwZWRlZiBzdHJ1Y3QgcG9seTh4OHgzX3QgewotICBwb2x5OHg4X3QgdmFsWzNdOwotfSBwb2x5OHg4eDNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcG9seTh4MTZ4M190IHsKLSAgcG9seTh4MTZfdCB2YWxbM107Ci19IHBvbHk4eDE2eDNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcG9seTE2eDR4M190IHsKLSAgcG9seTE2eDRfdCB2YWxbM107Ci19IHBvbHkxNng0eDNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcG9seTE2eDh4M190IHsKLSAgcG9seTE2eDhfdCB2YWxbM107Ci19IHBvbHkxNng4eDNfdDsKLQotI2lmZGVmIF9fYWFyY2g2NF9fCi10eXBlZGVmIHN0cnVjdCBwb2x5NjR4MXgzX3QgewotICBwb2x5NjR4MV90IHZhbFszXTsKLX0gcG9seTY0eDF4M190OwotCi10eXBlZGVmIHN0cnVjdCBwb2x5NjR4MngzX3QgewotICBwb2x5NjR4Ml90IHZhbFszXTsKLX0gcG9seTY0eDJ4M190OwotCi0jZW5kaWYKLXR5cGVkZWYgc3RydWN0IGludDh4OHg0X3QgewotICBpbnQ4eDhfdCB2YWxbNF07Ci19IGludDh4OHg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGludDh4MTZ4NF90IHsKLSAgaW50OHgxNl90IHZhbFs0XTsKLX0gaW50OHgxNng0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGludDE2eDR4NF90IHsKLSAgaW50MTZ4NF90IHZhbFs0XTsKLX0gaW50MTZ4NHg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGludDE2eDh4NF90IHsKLSAgaW50MTZ4OF90IHZhbFs0XTsKLX0gaW50MTZ4OHg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGludDMyeDJ4NF90IHsKLSAgaW50MzJ4Ml90IHZhbFs0XTsKLX0gaW50MzJ4Mng0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGludDMyeDR4NF90IHsKLSAgaW50MzJ4NF90IHZhbFs0XTsKLX0gaW50MzJ4NHg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGludDY0eDF4NF90IHsKLSAgaW50NjR4MV90IHZhbFs0XTsKLX0gaW50NjR4MXg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGludDY0eDJ4NF90IHsKLSAgaW50NjR4Ml90IHZhbFs0XTsKLX0gaW50NjR4Mng0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHVpbnQ4eDh4NF90IHsKLSAgdWludDh4OF90IHZhbFs0XTsKLX0gdWludDh4OHg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHVpbnQ4eDE2eDRfdCB7Ci0gIHVpbnQ4eDE2X3QgdmFsWzRdOwotfSB1aW50OHgxNng0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHVpbnQxNng0eDRfdCB7Ci0gIHVpbnQxNng0X3QgdmFsWzRdOwotfSB1aW50MTZ4NHg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHVpbnQxNng4eDRfdCB7Ci0gIHVpbnQxNng4X3QgdmFsWzRdOwotfSB1aW50MTZ4OHg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHVpbnQzMngyeDRfdCB7Ci0gIHVpbnQzMngyX3QgdmFsWzRdOwotfSB1aW50MzJ4Mng0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHVpbnQzMng0eDRfdCB7Ci0gIHVpbnQzMng0X3QgdmFsWzRdOwotfSB1aW50MzJ4NHg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHVpbnQ2NHgxeDRfdCB7Ci0gIHVpbnQ2NHgxX3QgdmFsWzRdOwotfSB1aW50NjR4MXg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHVpbnQ2NHgyeDRfdCB7Ci0gIHVpbnQ2NHgyX3QgdmFsWzRdOwotfSB1aW50NjR4Mng0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGZsb2F0MTZ4NHg0X3QgewotICBmbG9hdDE2eDRfdCB2YWxbNF07Ci19IGZsb2F0MTZ4NHg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGZsb2F0MTZ4OHg0X3QgewotICBmbG9hdDE2eDhfdCB2YWxbNF07Ci19IGZsb2F0MTZ4OHg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGZsb2F0MzJ4Mng0X3QgewotICBmbG9hdDMyeDJfdCB2YWxbNF07Ci19IGZsb2F0MzJ4Mng0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGZsb2F0MzJ4NHg0X3QgewotICBmbG9hdDMyeDRfdCB2YWxbNF07Ci19IGZsb2F0MzJ4NHg0X3Q7Ci0KLSNpZmRlZiBfX2FhcmNoNjRfXwotdHlwZWRlZiBzdHJ1Y3QgZmxvYXQ2NHgxeDRfdCB7Ci0gIGZsb2F0NjR4MV90IHZhbFs0XTsKLX0gZmxvYXQ2NHgxeDRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZmxvYXQ2NHgyeDRfdCB7Ci0gIGZsb2F0NjR4Ml90IHZhbFs0XTsKLX0gZmxvYXQ2NHgyeDRfdDsKLQotI2VuZGlmCi10eXBlZGVmIHN0cnVjdCBwb2x5OHg4eDRfdCB7Ci0gIHBvbHk4eDhfdCB2YWxbNF07Ci19IHBvbHk4eDh4NF90OwotCi10eXBlZGVmIHN0cnVjdCBwb2x5OHgxNng0X3QgewotICBwb2x5OHgxNl90IHZhbFs0XTsKLX0gcG9seTh4MTZ4NF90OwotCi10eXBlZGVmIHN0cnVjdCBwb2x5MTZ4NHg0X3QgewotICBwb2x5MTZ4NF90IHZhbFs0XTsKLX0gcG9seTE2eDR4NF90OwotCi10eXBlZGVmIHN0cnVjdCBwb2x5MTZ4OHg0X3QgewotICBwb2x5MTZ4OF90IHZhbFs0XTsKLX0gcG9seTE2eDh4NF90OwotCi0jaWZkZWYgX19hYXJjaDY0X18KLXR5cGVkZWYgc3RydWN0IHBvbHk2NHgxeDRfdCB7Ci0gIHBvbHk2NHgxX3QgdmFsWzRdOwotfSBwb2x5NjR4MXg0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHBvbHk2NHgyeDRfdCB7Ci0gIHBvbHk2NHgyX3QgdmFsWzRdOwotfSBwb2x5NjR4Mng0X3Q7Ci0KLSNlbmRpZgotCi0jZGVmaW5lIF9fYWkgc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQotCi1fX2FpIGludDE2eDhfdCB2bW92bF9zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdm1vdmxfdihfX2EsIDMzKTsgfQotX19haSBpbnQzMng0X3Qgdm1vdmxfczE2KGludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdm1vdmxfdigoaW50OHg4X3QpX19hLCAzNCk7IH0KLV9fYWkgaW50NjR4Ml90IHZtb3ZsX3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3Ztb3ZsX3YoKGludDh4OF90KV9fYSwgMzUpOyB9Ci1fX2FpIHVpbnQxNng4X3Qgdm1vdmxfdTgodWludDh4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdm1vdmxfdigoaW50OHg4X3QpX19hLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2bW92bF91MTYodWludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3Ztb3ZsX3YoKGludDh4OF90KV9fYSwgNTApOyB9Ci1fX2FpIHVpbnQ2NHgyX3Qgdm1vdmxfdTMyKHVpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92bW92bF92KChpbnQ4eDhfdClfX2EsIDUxKTsgfQotCi1fX2FpIGludDE2eDhfdCB2bXVsbF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92bXVsbF92KF9fYSwgX19iLCAzMyk7IH0KLV9fYWkgaW50MzJ4NF90IHZtdWxsX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZtdWxsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMzQpOyB9Ci1fX2FpIGludDY0eDJfdCB2bXVsbF9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92bXVsbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDM1KTsgfQotX19haSB1aW50MTZ4OF90IHZtdWxsX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZtdWxsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgNDkpOyB9Ci1fX2FpIHVpbnQzMng0X3Qgdm11bGxfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdm11bGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA1MCk7IH0KLV9fYWkgdWludDY0eDJfdCB2bXVsbF91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92bXVsbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDUxKTsgfQotX19haSBwb2x5MTZ4OF90IHZtdWxsX3A4KHBvbHk4eDhfdCBfX2EsIHBvbHk4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChwb2x5MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZtdWxsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMzcpOyB9Ci0KLV9fYWkgaW50OHg4X3QgdmFiZF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZhYmRfdihfX2EsIF9fYiwgMCk7IH0KLV9fYWkgaW50MTZ4NF90IHZhYmRfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdmFiZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2YWJkX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZhYmRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAyKTsgfQotX19haSB1aW50OHg4X3QgdmFiZF91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZhYmRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2YWJkX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZhYmRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2YWJkX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZhYmRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOCk7IH0KLV9fYWkgZmxvYXQzMngyX3QgdmFiZF9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92YWJkX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgOCk7IH0KLV9fYWkgaW50OHgxNl90IHZhYmRxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmFiZHFfdihfX2EsIF9fYiwgMzIpOyB9Ci1fX2FpIGludDE2eDhfdCB2YWJkcV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92YWJkcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzMpOyB9Ci1fX2FpIGludDMyeDRfdCB2YWJkcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92YWJkcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzQpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmFiZHFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92YWJkcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDgpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmFiZHFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdmFiZHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ5KTsgfQotX19haSB1aW50MzJ4NF90IHZhYmRxX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZhYmRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MCk7IH0KLV9fYWkgZmxvYXQzMng0X3QgdmFiZHFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX25lb25fdmFiZHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQwKTsgfQotCi1fX2FpIGludDE2eDhfdCB2YWJkbF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDE2eDhfdCl2bW92bF91OCgodWludDh4OF90KXZhYmRfczgoX19hLCBfX2IpKTsgfQotX19haSBpbnQzMng0X3QgdmFiZGxfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMng0X3Qpdm1vdmxfdTE2KCh1aW50MTZ4NF90KXZhYmRfczE2KF9fYSwgX19iKSk7IH0KLV9fYWkgaW50NjR4Ml90IHZhYmRsX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KXZtb3ZsX3UzMigodWludDMyeDJfdCl2YWJkX3MzMihfX2EsIF9fYikpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmFiZGxfdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gdm1vdmxfdTgodmFiZF91OChfX2EsIF9fYikpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmFiZGxfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gdm1vdmxfdTE2KHZhYmRfdTE2KF9fYSwgX19iKSk7IH0KLV9fYWkgdWludDY0eDJfdCB2YWJkbF91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiB2bW92bF91MzIodmFiZF91MzIoX19hLCBfX2IpKTsgfQotCi1fX2FpIGludDh4OF90IHZhYmFfczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IsIGludDh4OF90IF9fYykgewotICByZXR1cm4gX19hICsgdmFiZF9zOChfX2IsIF9fYyk7IH0KLV9fYWkgaW50MTZ4NF90IHZhYmFfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IsIGludDE2eDRfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZhYmRfczE2KF9fYiwgX19jKTsgfQotX19haSBpbnQzMngyX3QgdmFiYV9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYiwgaW50MzJ4Ml90IF9fYykgewotICByZXR1cm4gX19hICsgdmFiZF9zMzIoX19iLCBfX2MpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2YWJhX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IsIHVpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZhYmRfdTgoX19iLCBfX2MpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdmFiYV91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iLCB1aW50MTZ4NF90IF9fYykgewotICByZXR1cm4gX19hICsgdmFiZF91MTYoX19iLCBfX2MpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmFiYV91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iLCB1aW50MzJ4Ml90IF9fYykgewotICByZXR1cm4gX19hICsgdmFiZF91MzIoX19iLCBfX2MpOyB9Ci1fX2FpIGludDh4MTZfdCB2YWJhcV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iLCBpbnQ4eDE2X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyB2YWJkcV9zOChfX2IsIF9fYyk7IH0KLV9fYWkgaW50MTZ4OF90IHZhYmFxX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iLCBpbnQxNng4X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyB2YWJkcV9zMTYoX19iLCBfX2MpOyB9Ci1fX2FpIGludDMyeDRfdCB2YWJhcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYiwgaW50MzJ4NF90IF9fYykgewotICByZXR1cm4gX19hICsgdmFiZHFfczMyKF9fYiwgX19jKTsgfQotX19haSB1aW50OHgxNl90IHZhYmFxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYiwgdWludDh4MTZfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZhYmRxX3U4KF9fYiwgX19jKTsgfQotX19haSB1aW50MTZ4OF90IHZhYmFxX3UxNih1aW50MTZ4OF90IF9fYSwgdWludDE2eDhfdCBfX2IsIHVpbnQxNng4X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyB2YWJkcV91MTYoX19iLCBfX2MpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmFiYXFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYiwgdWludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZhYmRxX3UzMihfX2IsIF9fYyk7IH0KLQotX19haSBpbnQxNng4X3QgdmFiYWxfczgoaW50MTZ4OF90IF9fYSwgaW50OHg4X3QgX19iLCBpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZhYmRsX3M4KF9fYiwgX19jKTsgfQotX19haSBpbnQzMng0X3QgdmFiYWxfczE2KGludDMyeDRfdCBfX2EsIGludDE2eDRfdCBfX2IsIGludDE2eDRfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZhYmRsX3MxNihfX2IsIF9fYyk7IH0KLV9fYWkgaW50NjR4Ml90IHZhYmFsX3MzMihpbnQ2NHgyX3QgX19hLCBpbnQzMngyX3QgX19iLCBpbnQzMngyX3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyB2YWJkbF9zMzIoX19iLCBfX2MpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmFiYWxfdTgodWludDE2eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IsIHVpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZhYmRsX3U4KF9fYiwgX19jKTsgfQotX19haSB1aW50MzJ4NF90IHZhYmFsX3UxNih1aW50MzJ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IsIHVpbnQxNng0X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyB2YWJkbF91MTYoX19iLCBfX2MpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmFiYWxfdTMyKHVpbnQ2NHgyX3QgX19hLCB1aW50MzJ4Ml90IF9fYiwgdWludDMyeDJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZhYmRsX3UzMihfX2IsIF9fYyk7IH0KLQotCi1fX2FpIGludDh4OF90IHZhYnNfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19idWlsdGluX25lb25fdmFic192KF9fYSwgMCk7IH0KLV9fYWkgaW50MTZ4NF90IHZhYnNfczE2KGludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdmFic192KChpbnQ4eDhfdClfX2EsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2YWJzX3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZhYnNfdigoaW50OHg4X3QpX19hLCAyKTsgfQotX19haSBmbG9hdDMyeDJfdCB2YWJzX2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92YWJzX3YoKGludDh4OF90KV9fYSwgOCk7IH0KLV9fYWkgaW50OHgxNl90IHZhYnNxX3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmFic3FfdihfX2EsIDMyKTsgfQotX19haSBpbnQxNng4X3QgdmFic3FfczE2KGludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdmFic3FfdigoaW50OHgxNl90KV9fYSwgMzMpOyB9Ci1fX2FpIGludDMyeDRfdCB2YWJzcV9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92YWJzcV92KChpbnQ4eDE2X3QpX19hLCAzNCk7IH0KLV9fYWkgZmxvYXQzMng0X3QgdmFic3FfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZhYnNxX3YoKGludDh4MTZfdClfX2EsIDQwKTsgfQotCi1fX2FpIGludDh4OF90IHZhZGRfczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSArIF9fYjsgfQotX19haSBpbnQxNng0X3QgdmFkZF9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gX19hICsgX19iOyB9Ci1fX2FpIGludDMyeDJfdCB2YWRkX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKyBfX2I7IH0KLV9fYWkgaW50NjR4MV90IHZhZGRfczY0KGludDY0eDFfdCBfX2EsIGludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSArIF9fYjsgfQotX19haSBmbG9hdDMyeDJfdCB2YWRkX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICByZXR1cm4gX19hICsgX19iOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2YWRkX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSArIF9fYjsgfQotX19haSB1aW50MTZ4NF90IHZhZGRfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gX19hICsgX19iOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmFkZF91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKyBfX2I7IH0KLV9fYWkgdWludDY0eDFfdCB2YWRkX3U2NCh1aW50NjR4MV90IF9fYSwgdWludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSArIF9fYjsgfQotX19haSBpbnQ4eDE2X3QgdmFkZHFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19hICsgX19iOyB9Ci1fX2FpIGludDE2eDhfdCB2YWRkcV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19hICsgX19iOyB9Ci1fX2FpIGludDMyeDRfdCB2YWRkcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hICsgX19iOyB9Ci1fX2FpIGludDY0eDJfdCB2YWRkcV9zNjQoaW50NjR4Ml90IF9fYSwgaW50NjR4Ml90IF9fYikgewotICByZXR1cm4gX19hICsgX19iOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZhZGRxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hICsgX19iOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmFkZHFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKyBfX2I7IH0KLV9fYWkgdWludDE2eDhfdCB2YWRkcV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKyBfX2I7IH0KLV9fYWkgdWludDMyeDRfdCB2YWRkcV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKyBfX2I7IH0KLV9fYWkgdWludDY0eDJfdCB2YWRkcV91NjQodWludDY0eDJfdCBfX2EsIHVpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKyBfX2I7IH0KLQotX19haSBpbnQ4eDhfdCB2YWRkaG5fczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92YWRkaG5fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDApOyB9Ci1fX2FpIGludDE2eDRfdCB2YWRkaG5fczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdmFkZGhuX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAxKTsgfQotX19haSBpbnQzMngyX3QgdmFkZGhuX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZhZGRobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMik7IH0KLV9fYWkgdWludDh4OF90IHZhZGRobl91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZhZGRobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMTYpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdmFkZGhuX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZhZGRobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmFkZGhuX3U2NCh1aW50NjR4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZhZGRobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMTgpOyB9Ci0KLV9fYWkgaW50MTZ4OF90IHZhZGRsX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiB2bW92bF9zOChfX2EpICsgdm1vdmxfczgoX19iKTsgfQotX19haSBpbnQzMng0X3QgdmFkZGxfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIHZtb3ZsX3MxNihfX2EpICsgdm1vdmxfczE2KF9fYik7IH0KLV9fYWkgaW50NjR4Ml90IHZhZGRsX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiB2bW92bF9zMzIoX19hKSArIHZtb3ZsX3MzMihfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmFkZGxfdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gdm1vdmxfdTgoX19hKSArIHZtb3ZsX3U4KF9fYik7IH0KLV9fYWkgdWludDMyeDRfdCB2YWRkbF91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiB2bW92bF91MTYoX19hKSArIHZtb3ZsX3UxNihfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmFkZGxfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gdm1vdmxfdTMyKF9fYSkgKyB2bW92bF91MzIoX19iKTsgfQotCi1fX2FpIGludDE2eDhfdCB2YWRkd19zOChpbnQxNng4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSArIHZtb3ZsX3M4KF9fYik7IH0KLV9fYWkgaW50MzJ4NF90IHZhZGR3X3MxNihpbnQzMng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKyB2bW92bF9zMTYoX19iKTsgfQotX19haSBpbnQ2NHgyX3QgdmFkZHdfczMyKGludDY0eDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSArIHZtb3ZsX3MzMihfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmFkZHdfdTgodWludDE2eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSArIHZtb3ZsX3U4KF9fYik7IH0KLV9fYWkgdWludDMyeDRfdCB2YWRkd191MTYodWludDMyeDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKyB2bW92bF91MTYoX19iKTsgfQotX19haSB1aW50NjR4Ml90IHZhZGR3X3UzMih1aW50NjR4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSArIHZtb3ZsX3UzMihfX2IpOyB9Ci0KLV9fYWkgaW50OHg4X3QgdmFuZF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gX19hICYgX19iOyB9Ci1fX2FpIGludDE2eDRfdCB2YW5kX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiBfX2I7IH0KLV9fYWkgaW50MzJ4Ml90IHZhbmRfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAmIF9fYjsgfQotX19haSBpbnQ2NHgxX3QgdmFuZF9zNjQoaW50NjR4MV90IF9fYSwgaW50NjR4MV90IF9fYikgewotICByZXR1cm4gX19hICYgX19iOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2YW5kX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAmIF9fYjsgfQotX19haSB1aW50MTZ4NF90IHZhbmRfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gX19hICYgX19iOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmFuZF91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiBfX2I7IH0KLV9fYWkgdWludDY0eDFfdCB2YW5kX3U2NCh1aW50NjR4MV90IF9fYSwgdWludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAmIF9fYjsgfQotX19haSBpbnQ4eDE2X3QgdmFuZHFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19hICYgX19iOyB9Ci1fX2FpIGludDE2eDhfdCB2YW5kcV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19hICYgX19iOyB9Ci1fX2FpIGludDMyeDRfdCB2YW5kcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hICYgX19iOyB9Ci1fX2FpIGludDY0eDJfdCB2YW5kcV9zNjQoaW50NjR4Ml90IF9fYSwgaW50NjR4Ml90IF9fYikgewotICByZXR1cm4gX19hICYgX19iOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmFuZHFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiBfX2I7IH0KLV9fYWkgdWludDE2eDhfdCB2YW5kcV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiBfX2I7IH0KLV9fYWkgdWludDMyeDRfdCB2YW5kcV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiBfX2I7IH0KLV9fYWkgdWludDY0eDJfdCB2YW5kcV91NjQodWludDY0eDJfdCBfX2EsIHVpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiBfX2I7IH0KLQotX19haSBpbnQ4eDhfdCB2YmljX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiB+X19iOyB9Ci1fX2FpIGludDE2eDRfdCB2YmljX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiB+X19iOyB9Ci1fX2FpIGludDMyeDJfdCB2YmljX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiB+X19iOyB9Ci1fX2FpIGludDY0eDFfdCB2YmljX3M2NChpbnQ2NHgxX3QgX19hLCBpbnQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiB+X19iOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2YmljX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAmIH5fX2I7IH0KLV9fYWkgdWludDE2eDRfdCB2YmljX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAmIH5fX2I7IH0KLV9fYWkgdWludDMyeDJfdCB2YmljX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAmIH5fX2I7IH0KLV9fYWkgdWludDY0eDFfdCB2YmljX3U2NCh1aW50NjR4MV90IF9fYSwgdWludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAmIH5fX2I7IH0KLV9fYWkgaW50OHgxNl90IHZiaWNxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAmIH5fX2I7IH0KLV9fYWkgaW50MTZ4OF90IHZiaWNxX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiB+X19iOyB9Ci1fX2FpIGludDMyeDRfdCB2YmljcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hICYgfl9fYjsgfQotX19haSBpbnQ2NHgyX3QgdmJpY3FfczY0KGludDY0eDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAmIH5fX2I7IH0KLV9fYWkgdWludDh4MTZfdCB2YmljcV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAmIH5fX2I7IH0KLV9fYWkgdWludDE2eDhfdCB2YmljcV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgJiB+X19iOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmJpY3FfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hICYgfl9fYjsgfQotX19haSB1aW50NjR4Ml90IHZiaWNxX3U2NCh1aW50NjR4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAmIH5fX2I7IH0KLQotX19haSBpbnQ4eDhfdCB2YnNsX3M4KHVpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYiwgaW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19idWlsdGluX25lb25fdmJzbF92KChpbnQ4eDhfdClfX2EsIF9fYiwgX19jLCAwKTsgfQotX19haSBpbnQxNng0X3QgdmJzbF9zMTYodWludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IsIGludDE2eDRfdCBfX2MpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdmJzbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2YnNsX3MzMih1aW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYiwgaW50MzJ4Ml90IF9fYykgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92YnNsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgKGludDh4OF90KV9fYywgMik7IH0KLV9fYWkgaW50NjR4MV90IHZic2xfczY0KHVpbnQ2NHgxX3QgX19hLCBpbnQ2NHgxX3QgX19iLCBpbnQ2NHgxX3QgX19jKSB7Ci0gIHJldHVybiAoaW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3Zic2xfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAoaW50OHg4X3QpX19jLCAzKTsgfQotX19haSB1aW50OHg4X3QgdmJzbF91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iLCB1aW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Zic2xfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAoaW50OHg4X3QpX19jLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2YnNsX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IsIHVpbnQxNng0X3QgX19jKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92YnNsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgKGludDh4OF90KV9fYywgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmJzbF91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iLCB1aW50MzJ4Ml90IF9fYykgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmJzbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDE4KTsgfQotX19haSB1aW50NjR4MV90IHZic2xfdTY0KHVpbnQ2NHgxX3QgX19hLCB1aW50NjR4MV90IF9fYiwgdWludDY0eDFfdCBfX2MpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3Zic2xfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAoaW50OHg4X3QpX19jLCAxOSk7IH0KLV9fYWkgZmxvYXQzMngyX3QgdmJzbF9mMzIodWludDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYiwgZmxvYXQzMngyX3QgX19jKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdmJzbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDgpOyB9Ci1fX2FpIHBvbHk4eDhfdCB2YnNsX3A4KHVpbnQ4eDhfdCBfX2EsIHBvbHk4eDhfdCBfX2IsIHBvbHk4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIChwb2x5OHg4X3QpX19idWlsdGluX25lb25fdmJzbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDQpOyB9Ci1fX2FpIHBvbHkxNng0X3QgdmJzbF9wMTYodWludDE2eDRfdCBfX2EsIHBvbHkxNng0X3QgX19iLCBwb2x5MTZ4NF90IF9fYykgewotICByZXR1cm4gKHBvbHkxNng0X3QpX19idWlsdGluX25lb25fdmJzbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDUpOyB9Ci1fX2FpIGludDh4MTZfdCB2YnNscV9zOCh1aW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYiwgaW50OHgxNl90IF9fYykgewotICByZXR1cm4gKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92YnNscV92KChpbnQ4eDE2X3QpX19hLCBfX2IsIF9fYywgMzIpOyB9Ci1fX2FpIGludDE2eDhfdCB2YnNscV9zMTYodWludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IsIGludDE2eDhfdCBfX2MpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdmJzbHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCAzMyk7IH0KLV9fYWkgaW50MzJ4NF90IHZic2xxX3MzMih1aW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYiwgaW50MzJ4NF90IF9fYykgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92YnNscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgKGludDh4MTZfdClfX2MsIDM0KTsgfQotX19haSBpbnQ2NHgyX3QgdmJzbHFfczY0KHVpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iLCBpbnQ2NHgyX3QgX19jKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3Zic2xxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAoaW50OHgxNl90KV9fYywgMzUpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmJzbHFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iLCB1aW50OHgxNl90IF9fYykgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmJzbHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2YnNscV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iLCB1aW50MTZ4OF90IF9fYykgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdmJzbHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2YnNscV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iLCB1aW50MzJ4NF90IF9fYykgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdmJzbHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCA1MCk7IH0KLV9fYWkgdWludDY0eDJfdCB2YnNscV91NjQodWludDY0eDJfdCBfX2EsIHVpbnQ2NHgyX3QgX19iLCB1aW50NjR4Ml90IF9fYykgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmJzbHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCA1MSk7IH0KLV9fYWkgZmxvYXQzMng0X3QgdmJzbHFfZjMyKHVpbnQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IsIGZsb2F0MzJ4NF90IF9fYykgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3Zic2xxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAoaW50OHgxNl90KV9fYywgNDApOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdmJzbHFfcDgodWludDh4MTZfdCBfX2EsIHBvbHk4eDE2X3QgX19iLCBwb2x5OHgxNl90IF9fYykgewotICByZXR1cm4gKHBvbHk4eDE2X3QpX19idWlsdGluX25lb25fdmJzbHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCAzNik7IH0KLV9fYWkgcG9seTE2eDhfdCB2YnNscV9wMTYodWludDE2eDhfdCBfX2EsIHBvbHkxNng4X3QgX19iLCBwb2x5MTZ4OF90IF9fYykgewotICByZXR1cm4gKHBvbHkxNng4X3QpX19idWlsdGluX25lb25fdmJzbHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCAzNyk7IH0KLQotX19haSB1aW50MzJ4Ml90IHZjYWdlX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmNhZ2VfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOCk7IH0KLV9fYWkgdWludDMyeDRfdCB2Y2FnZXFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y2FnZXFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUwKTsgfQotCi1fX2FpIHVpbnQzMngyX3QgdmNhZ3RfZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92Y2FndF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE4KTsgfQotX19haSB1aW50MzJ4NF90IHZjYWd0cV9mMzIoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZjYWd0cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTApOyB9Ci0KLV9fYWkgdWludDMyeDJfdCB2Y2FsZV9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjYWxlX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTgpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNhbGVxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdmNhbGVxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MCk7IH0KLQotX19haSB1aW50MzJ4Ml90IHZjYWx0X2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmNhbHRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOCk7IH0KLV9fYWkgdWludDMyeDRfdCB2Y2FsdHFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y2FsdHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUwKTsgfQotCi1fX2FpIHVpbnQ4eDhfdCB2Y2VxX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KShfX2EgPT0gX19iKTsgfQotX19haSB1aW50MTZ4NF90IHZjZXFfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KShfX2EgPT0gX19iKTsgfQotX19haSB1aW50MzJ4Ml90IHZjZXFfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KShfX2EgPT0gX19iKTsgfQotX19haSB1aW50MzJ4Ml90IHZjZXFfZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdCkoX19hID09IF9fYik7IH0KLV9fYWkgdWludDh4OF90IHZjZXFfdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdCkoX19hID09IF9fYik7IH0KLV9fYWkgdWludDE2eDRfdCB2Y2VxX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KShfX2EgPT0gX19iKTsgfQotX19haSB1aW50MzJ4Ml90IHZjZXFfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpKF9fYSA9PSBfX2IpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2Y2VxX3A4KHBvbHk4eDhfdCBfX2EsIHBvbHk4eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpKF9fYSA9PSBfX2IpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmNlcXFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpKF9fYSA9PSBfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmNlcXFfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KShfX2EgPT0gX19iKTsgfQotX19haSB1aW50MzJ4NF90IHZjZXFxX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdCkoX19hID09IF9fYik7IH0KLV9fYWkgdWludDMyeDRfdCB2Y2VxcV9mMzIoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KShfX2EgPT0gX19iKTsgfQotX19haSB1aW50OHgxNl90IHZjZXFxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpKF9fYSA9PSBfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmNlcXFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpKF9fYSA9PSBfX2IpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNlcXFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpKF9fYSA9PSBfX2IpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmNlcXFfcDgocG9seTh4MTZfdCBfX2EsIHBvbHk4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4MTZfdCkoX19hID09IF9fYik7IH0KLQotX19haSB1aW50OHg4X3QgdmNnZV9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdCkoX19hID49IF9fYik7IH0KLV9fYWkgdWludDE2eDRfdCB2Y2dlX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDRfdCkoX19hID49IF9fYik7IH0KLV9fYWkgdWludDMyeDJfdCB2Y2dlX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdCkoX19hID49IF9fYik7IH0KLV9fYWkgdWludDMyeDJfdCB2Y2dlX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpKF9fYSA+PSBfX2IpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2Y2dlX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpKF9fYSA+PSBfX2IpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdmNnZV91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDRfdCkoX19hID49IF9fYik7IH0KLV9fYWkgdWludDMyeDJfdCB2Y2dlX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KShfX2EgPj0gX19iKTsgfQotX19haSB1aW50OHgxNl90IHZjZ2VxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KShfX2EgPj0gX19iKTsgfQotX19haSB1aW50MTZ4OF90IHZjZ2VxX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDhfdCkoX19hID49IF9fYik7IH0KLV9fYWkgdWludDMyeDRfdCB2Y2dlcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpKF9fYSA+PSBfX2IpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNnZXFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdCkoX19hID49IF9fYik7IH0KLV9fYWkgdWludDh4MTZfdCB2Y2dlcV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KShfX2EgPj0gX19iKTsgfQotX19haSB1aW50MTZ4OF90IHZjZ2VxX3UxNih1aW50MTZ4OF90IF9fYSwgdWludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KShfX2EgPj0gX19iKTsgfQotX19haSB1aW50MzJ4NF90IHZjZ2VxX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KShfX2EgPj0gX19iKTsgfQotCi1fX2FpIHVpbnQ4eDhfdCB2Y2d0X3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KShfX2EgPiBfX2IpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdmNndF9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng0X3QpKF9fYSA+IF9fYik7IH0KLV9fYWkgdWludDMyeDJfdCB2Y2d0X3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdCkoX19hID4gX19iKTsgfQotX19haSB1aW50MzJ4Ml90IHZjZ3RfZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdCkoX19hID4gX19iKTsgfQotX19haSB1aW50OHg4X3QgdmNndF91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KShfX2EgPiBfX2IpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdmNndF91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDRfdCkoX19hID4gX19iKTsgfQotX19haSB1aW50MzJ4Ml90IHZjZ3RfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpKF9fYSA+IF9fYik7IH0KLV9fYWkgdWludDh4MTZfdCB2Y2d0cV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4MTZfdCkoX19hID4gX19iKTsgfQotX19haSB1aW50MTZ4OF90IHZjZ3RxX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDhfdCkoX19hID4gX19iKTsgfQotX19haSB1aW50MzJ4NF90IHZjZ3RxX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdCkoX19hID4gX19iKTsgfQotX19haSB1aW50MzJ4NF90IHZjZ3RxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpKF9fYSA+IF9fYik7IH0KLV9fYWkgdWludDh4MTZfdCB2Y2d0cV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KShfX2EgPiBfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmNndHFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpKF9fYSA+IF9fYik7IH0KLV9fYWkgdWludDMyeDRfdCB2Y2d0cV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdCkoX19hID4gX19iKTsgfQotCi1fX2FpIHVpbnQ4eDhfdCB2Y2xlX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KShfX2EgPD0gX19iKTsgfQotX19haSB1aW50MTZ4NF90IHZjbGVfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KShfX2EgPD0gX19iKTsgfQotX19haSB1aW50MzJ4Ml90IHZjbGVfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KShfX2EgPD0gX19iKTsgfQotX19haSB1aW50MzJ4Ml90IHZjbGVfZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdCkoX19hIDw9IF9fYik7IH0KLV9fYWkgdWludDh4OF90IHZjbGVfdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdCkoX19hIDw9IF9fYik7IH0KLV9fYWkgdWludDE2eDRfdCB2Y2xlX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KShfX2EgPD0gX19iKTsgfQotX19haSB1aW50MzJ4Ml90IHZjbGVfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpKF9fYSA8PSBfX2IpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmNsZXFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpKF9fYSA8PSBfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmNsZXFfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KShfX2EgPD0gX19iKTsgfQotX19haSB1aW50MzJ4NF90IHZjbGVxX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdCkoX19hIDw9IF9fYik7IH0KLV9fYWkgdWludDMyeDRfdCB2Y2xlcV9mMzIoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KShfX2EgPD0gX19iKTsgfQotX19haSB1aW50OHgxNl90IHZjbGVxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpKF9fYSA8PSBfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmNsZXFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpKF9fYSA8PSBfX2IpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNsZXFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpKF9fYSA8PSBfX2IpOyB9Ci0KLV9fYWkgaW50OHg4X3QgdmNsc19zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92Y2xzX3YoX19hLCAwKTsgfQotX19haSBpbnQxNng0X3QgdmNsc19zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92Y2xzX3YoKGludDh4OF90KV9fYSwgMSk7IH0KLV9fYWkgaW50MzJ4Ml90IHZjbHNfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdmNsc192KChpbnQ4eDhfdClfX2EsIDIpOyB9Ci1fX2FpIGludDh4MTZfdCB2Y2xzcV9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZjbHNxX3YoX19hLCAzMik7IH0KLV9fYWkgaW50MTZ4OF90IHZjbHNxX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZjbHNxX3YoKGludDh4MTZfdClfX2EsIDMzKTsgfQotX19haSBpbnQzMng0X3QgdmNsc3FfczMyKGludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdmNsc3FfdigoaW50OHgxNl90KV9fYSwgMzQpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZjbHRfczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpKF9fYSA8IF9fYik7IH0KLV9fYWkgdWludDE2eDRfdCB2Y2x0X3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDRfdCkoX19hIDwgX19iKTsgfQotX19haSB1aW50MzJ4Ml90IHZjbHRfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KShfX2EgPCBfX2IpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmNsdF9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KShfX2EgPCBfX2IpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2Y2x0X3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpKF9fYSA8IF9fYik7IH0KLV9fYWkgdWludDE2eDRfdCB2Y2x0X3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KShfX2EgPCBfX2IpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmNsdF91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdCkoX19hIDwgX19iKTsgfQotX19haSB1aW50OHgxNl90IHZjbHRxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KShfX2EgPCBfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmNsdHFfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KShfX2EgPCBfX2IpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNsdHFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KShfX2EgPCBfX2IpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNsdHFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdCkoX19hIDwgX19iKTsgfQotX19haSB1aW50OHgxNl90IHZjbHRxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpKF9fYSA8IF9fYik7IH0KLV9fYWkgdWludDE2eDhfdCB2Y2x0cV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDhfdCkoX19hIDwgX19iKTsgfQotX19haSB1aW50MzJ4NF90IHZjbHRxX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KShfX2EgPCBfX2IpOyB9Ci0KLV9fYWkgaW50OHg4X3QgdmNsel9zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92Y2x6X3YoX19hLCAwKTsgfQotX19haSBpbnQxNng0X3QgdmNsel9zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92Y2x6X3YoKGludDh4OF90KV9fYSwgMSk7IH0KLV9fYWkgaW50MzJ4Ml90IHZjbHpfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdmNsel92KChpbnQ4eDhfdClfX2EsIDIpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2Y2x6X3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdmNsel92KChpbnQ4eDhfdClfX2EsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZjbHpfdTE2KHVpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92Y2x6X3YoKGludDh4OF90KV9fYSwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmNsel91MzIodWludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjbHpfdigoaW50OHg4X3QpX19hLCAxOCk7IH0KLV9fYWkgaW50OHgxNl90IHZjbHpxX3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmNsenFfdihfX2EsIDMyKTsgfQotX19haSBpbnQxNng4X3QgdmNsenFfczE2KGludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdmNsenFfdigoaW50OHgxNl90KV9fYSwgMzMpOyB9Ci1fX2FpIGludDMyeDRfdCB2Y2x6cV9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y2x6cV92KChpbnQ4eDE2X3QpX19hLCAzNCk7IH0KLV9fYWkgdWludDh4MTZfdCB2Y2x6cV91OCh1aW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmNsenFfdigoaW50OHgxNl90KV9fYSwgNDgpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmNsenFfdTE2KHVpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92Y2x6cV92KChpbnQ4eDE2X3QpX19hLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2Y2x6cV91MzIodWludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZjbHpxX3YoKGludDh4MTZfdClfX2EsIDUwKTsgfQotCi1fX2FpIHVpbnQ4eDhfdCB2Y250X3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdmNudF92KChpbnQ4eDhfdClfX2EsIDE2KTsgfQotX19haSBpbnQ4eDhfdCB2Y250X3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZjbnRfdihfX2EsIDApOyB9Ci1fX2FpIHBvbHk4eDhfdCB2Y250X3A4KHBvbHk4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5OHg4X3QpX19idWlsdGluX25lb25fdmNudF92KChpbnQ4eDhfdClfX2EsIDQpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmNudHFfdTgodWludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZjbnRxX3YoKGludDh4MTZfdClfX2EsIDQ4KTsgfQotX19haSBpbnQ4eDE2X3QgdmNudHFfczgoaW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92Y250cV92KF9fYSwgMzIpOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdmNudHFfcDgocG9seTh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZjbnRxX3YoKGludDh4MTZfdClfX2EsIDM2KTsgfQotCi1fX2FpIGludDh4MTZfdCB2Y29tYmluZV9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4MTZfdClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoaW50NjR4MV90KV9fYSwgKGludDY0eDFfdClfX2IsIDAsIDEpOyB9Ci1fX2FpIGludDE2eDhfdCB2Y29tYmluZV9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKGludDE2eDhfdClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoaW50NjR4MV90KV9fYSwgKGludDY0eDFfdClfX2IsIDAsIDEpOyB9Ci1fX2FpIGludDMyeDRfdCB2Y29tYmluZV9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoaW50NjR4MV90KV9fYSwgKGludDY0eDFfdClfX2IsIDAsIDEpOyB9Ci1fX2FpIGludDY0eDJfdCB2Y29tYmluZV9zNjQoaW50NjR4MV90IF9fYSwgaW50NjR4MV90IF9fYikgewotICByZXR1cm4gKGludDY0eDJfdClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoaW50NjR4MV90KV9fYSwgKGludDY0eDFfdClfX2IsIDAsIDEpOyB9Ci1fX2FpIGZsb2F0MTZ4OF90IHZjb21iaW5lX2YxNihmbG9hdDE2eDRfdCBfX2EsIGZsb2F0MTZ4NF90IF9fYikgewotICByZXR1cm4gKGZsb2F0MTZ4OF90KV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChpbnQ2NHgxX3QpX19hLCAoaW50NjR4MV90KV9fYiwgMCwgMSk7IH0KLV9fYWkgZmxvYXQzMng0X3QgdmNvbWJpbmVfZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKGludDY0eDFfdClfX2EsIChpbnQ2NHgxX3QpX19iLCAwLCAxKTsgfQotX19haSB1aW50OHgxNl90IHZjb21iaW5lX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChpbnQ2NHgxX3QpX19hLCAoaW50NjR4MV90KV9fYiwgMCwgMSk7IH0KLV9fYWkgdWludDE2eDhfdCB2Y29tYmluZV91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoaW50NjR4MV90KV9fYSwgKGludDY0eDFfdClfX2IsIDAsIDEpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNvbWJpbmVfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKGludDY0eDFfdClfX2EsIChpbnQ2NHgxX3QpX19iLCAwLCAxKTsgfQotX19haSB1aW50NjR4Ml90IHZjb21iaW5lX3U2NCh1aW50NjR4MV90IF9fYSwgdWludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKChpbnQ2NHgxX3QpX19hLCAoaW50NjR4MV90KV9fYiwgMCwgMSk7IH0KLV9fYWkgcG9seTh4MTZfdCB2Y29tYmluZV9wOChwb2x5OHg4X3QgX19hLCBwb2x5OHg4X3QgX19iKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoaW50NjR4MV90KV9fYSwgKGludDY0eDFfdClfX2IsIDAsIDEpOyB9Ci1fX2FpIHBvbHkxNng4X3QgdmNvbWJpbmVfcDE2KHBvbHkxNng0X3QgX19hLCBwb2x5MTZ4NF90IF9fYikgewotICByZXR1cm4gKHBvbHkxNng4X3QpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKGludDY0eDFfdClfX2EsIChpbnQ2NHgxX3QpX19iLCAwLCAxKTsgfQotCi1fX2FpIGludDh4OF90IHZjcmVhdGVfczgodWludDY0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19hOyB9Ci1fX2FpIGludDE2eDRfdCB2Y3JlYXRlX3MxNih1aW50NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19hOyB9Ci1fX2FpIGludDMyeDJfdCB2Y3JlYXRlX3MzMih1aW50NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19hOyB9Ci1fX2FpIGZsb2F0MTZ4NF90IHZjcmVhdGVfZjE2KHVpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4NF90KV9fYTsgfQotX19haSBmbG9hdDMyeDJfdCB2Y3JlYXRlX2YzMih1aW50NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2E7IH0KLV9fYWkgdWludDh4OF90IHZjcmVhdGVfdTgodWludDY0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYTsgfQotX19haSB1aW50MTZ4NF90IHZjcmVhdGVfdTE2KHVpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19hOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmNyZWF0ZV91MzIodWludDY0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2E7IH0KLV9fYWkgdWludDY0eDFfdCB2Y3JlYXRlX3U2NCh1aW50NjRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYTsgfQotX19haSBwb2x5OHg4X3QgdmNyZWF0ZV9wOCh1aW50NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5OHg4X3QpX19hOyB9Ci1fX2FpIHBvbHkxNng0X3QgdmNyZWF0ZV9wMTYodWludDY0X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDRfdClfX2E7IH0KLV9fYWkgaW50NjR4MV90IHZjcmVhdGVfczY0KHVpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2E7IH0KLQotX19haSBmbG9hdDE2eDRfdCB2Y3Z0X2YxNl9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQxNng0X3QpX19idWlsdGluX25lb25fdmN2dF9mMTZfdigoaW50OHgxNl90KV9fYSwgNyk7IH0KLQotX19haSBmbG9hdDMyeDJfdCB2Y3Z0X2YzMl9zMzIoaW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjMyX3YoKGludDh4OF90KV9fYSwgMik7IH0KLV9fYWkgZmxvYXQzMngyX3QgdmN2dF9mMzJfdTMyKHVpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdmN2dF9mMzJfdigoaW50OHg4X3QpX19hLCAxOCk7IH0KLV9fYWkgZmxvYXQzMng0X3QgdmN2dHFfZjMyX3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX25lb25fdmN2dHFfZjMyX3YoKGludDh4MTZfdClfX2EsIDM0KTsgfQotX19haSBmbG9hdDMyeDRfdCB2Y3Z0cV9mMzJfdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX25lb25fdmN2dHFfZjMyX3YoKGludDh4MTZfdClfX2EsIDUwKTsgfQotCi1fX2FpIGZsb2F0MzJ4NF90IHZjdnRfZjMyX2YxNihmbG9hdDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0X2YzMl9mMTYoKGludDh4OF90KV9fYSwgNyk7IH0KLQotI2RlZmluZSB2Y3Z0X25fZjMyX3MzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBcCi0gIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0X25fZjMyX3YoKGludDh4OF90KV9fYSwgX19iLCAyKTsgfSkKLSNkZWZpbmUgdmN2dF9uX2YzMl91MzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJfdCBfX2EgPSAoYSk7IFwKLSAgKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9mMzJfdigoaW50OHg4X3QpX19hLCBfX2IsIDE4KTsgfSkKLSNkZWZpbmUgdmN2dHFfbl9mMzJfczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fZjMyX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMzQpOyB9KQotI2RlZmluZSB2Y3Z0cV9uX2YzMl91MzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fZjMyX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNTApOyB9KQotCi0jZGVmaW5lIHZjdnRfbl9zMzJfZjMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4Ml90IF9fYSA9IChhKTsgXAotICAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl9zMzJfdigoaW50OHg4X3QpX19hLCBfX2IsIDIpOyB9KQotI2RlZmluZSB2Y3Z0cV9uX3MzMl9mMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0X3QgX19hID0gKGEpOyBcCi0gIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdmN2dHFfbl9zMzJfdigoaW50OHgxNl90KV9fYSwgX19iLCAzNCk7IH0pCi0KLSNkZWZpbmUgdmN2dF9uX3UzMl9mMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyX3QgX19hID0gKGEpOyBcCi0gICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjdnRfbl91MzJfdigoaW50OHg4X3QpX19hLCBfX2IsIDE4KTsgfSkKLSNkZWZpbmUgdmN2dHFfbl91MzJfZjMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NF90IF9fYSA9IChhKTsgXAotICAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX3UzMl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDUwKTsgfSkKLQotX19haSBpbnQzMngyX3QgdmN2dF9zMzJfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0X3MzMl92KChpbnQ4eDhfdClfX2EsIDIpOyB9Ci1fX2FpIGludDMyeDRfdCB2Y3Z0cV9zMzJfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cV9zMzJfdigoaW50OHgxNl90KV9fYSwgMzQpOyB9Ci0KLV9fYWkgdWludDMyeDJfdCB2Y3Z0X3UzMl9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0X3UzMl92KChpbnQ4eDhfdClfX2EsIDE4KTsgfQotX19haSB1aW50MzJ4NF90IHZjdnRxX3UzMl9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cV91MzJfdigoaW50OHgxNl90KV9fYSwgNTApOyB9Ci0KLSNkZWZpbmUgdmR1cF9sYW5lX3U4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cF9sYW5lX3UxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NF90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cF9sYW5lX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Ml90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwX2xhbmVfczgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBfbGFuZV9zMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NF90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cF9sYW5lX3MzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBfbGFuZV9wOChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHg4X3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBfbGFuZV9wMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDRfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBfbGFuZV9mMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyX3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVfdTgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4OF90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHFfbGFuZV91MTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHFfbGFuZV91MzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVfczgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwcV9sYW5lX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVfczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVfcDgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OF90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHFfbGFuZV9wMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDRfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHFfbGFuZV9mMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyX3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYiwgX19iLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwX2xhbmVfczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDFfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBfbGFuZV91NjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDFfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVfczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDFfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHFfbGFuZV91NjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDFfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iKTsgfSkKLQotX19haSB1aW50OHg4X3QgdmR1cF9uX3U4KHVpbnQ4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSB1aW50MTZ4NF90IHZkdXBfbl91MTYodWludDE2X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdCl7IF9fYSwgX19hLCBfX2EsIF9fYSB9OyB9Ci1fX2FpIHVpbnQzMngyX3QgdmR1cF9uX3UzMih1aW50MzJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KXsgX19hLCBfX2EgfTsgfQotX19haSBpbnQ4eDhfdCB2ZHVwX25fczgoaW50OF90IF9fYSkgewotICByZXR1cm4gKGludDh4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBpbnQxNng0X3QgdmR1cF9uX3MxNihpbnQxNl90IF9fYSkgewotICByZXR1cm4gKGludDE2eDRfdCl7IF9fYSwgX19hLCBfX2EsIF9fYSB9OyB9Ci1fX2FpIGludDMyeDJfdCB2ZHVwX25fczMyKGludDMyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KXsgX19hLCBfX2EgfTsgfQotX19haSBwb2x5OHg4X3QgdmR1cF9uX3A4KHBvbHk4X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBwb2x5MTZ4NF90IHZkdXBfbl9wMTYocG9seTE2X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDRfdCl7IF9fYSwgX19hLCBfX2EsIF9fYSB9OyB9Ci1fX2FpIGZsb2F0MzJ4Ml90IHZkdXBfbl9mMzIoZmxvYXQzMl90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KXsgX19hLCBfX2EgfTsgfQotX19haSB1aW50OHgxNl90IHZkdXBxX25fdTgodWludDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hIH07IH0KLV9fYWkgdWludDE2eDhfdCB2ZHVwcV9uX3UxNih1aW50MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSB1aW50MzJ4NF90IHZkdXBxX25fdTMyKHVpbnQzMl90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMng0X3QpeyBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBpbnQ4eDE2X3QgdmR1cHFfbl9zOChpbnQ4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hIH07IH0KLV9fYWkgaW50MTZ4OF90IHZkdXBxX25fczE2KGludDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBpbnQzMng0X3QgdmR1cHFfbl9zMzIoaW50MzJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpeyBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBwb2x5OHgxNl90IHZkdXBxX25fcDgocG9seThfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5OHgxNl90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hIH07IH0KLV9fYWkgcG9seTE2eDhfdCB2ZHVwcV9uX3AxNihwb2x5MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBmbG9hdDMyeDRfdCB2ZHVwcV9uX2YzMihmbG9hdDMyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpeyBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBpbnQ2NHgxX3QgdmR1cF9uX3M2NChpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdCl7IF9fYSB9OyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdmR1cF9uX3U2NCh1aW50NjRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KXsgX19hIH07IH0KLV9fYWkgaW50NjR4Ml90IHZkdXBxX25fczY0KGludDY0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KXsgX19hLCBfX2EgfTsgfQotX19haSB1aW50NjR4Ml90IHZkdXBxX25fdTY0KHVpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpeyBfX2EsIF9fYSB9OyB9Ci0KLV9fYWkgaW50OHg4X3QgdmVvcl9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gX19hIF4gX19iOyB9Ci1fX2FpIGludDE2eDRfdCB2ZW9yX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgXiBfX2I7IH0KLV9fYWkgaW50MzJ4Ml90IHZlb3JfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSBeIF9fYjsgfQotX19haSBpbnQ2NHgxX3QgdmVvcl9zNjQoaW50NjR4MV90IF9fYSwgaW50NjR4MV90IF9fYikgewotICByZXR1cm4gX19hIF4gX19iOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2ZW9yX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSBeIF9fYjsgfQotX19haSB1aW50MTZ4NF90IHZlb3JfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gX19hIF4gX19iOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmVvcl91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgXiBfX2I7IH0KLV9fYWkgdWludDY0eDFfdCB2ZW9yX3U2NCh1aW50NjR4MV90IF9fYSwgdWludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSBeIF9fYjsgfQotX19haSBpbnQ4eDE2X3QgdmVvcnFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19hIF4gX19iOyB9Ci1fX2FpIGludDE2eDhfdCB2ZW9ycV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19hIF4gX19iOyB9Ci1fX2FpIGludDMyeDRfdCB2ZW9ycV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hIF4gX19iOyB9Ci1fX2FpIGludDY0eDJfdCB2ZW9ycV9zNjQoaW50NjR4Ml90IF9fYSwgaW50NjR4Ml90IF9fYikgewotICByZXR1cm4gX19hIF4gX19iOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmVvcnFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgXiBfX2I7IH0KLV9fYWkgdWludDE2eDhfdCB2ZW9ycV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgXiBfX2I7IH0KLV9fYWkgdWludDMyeDRfdCB2ZW9ycV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgXiBfX2I7IH0KLV9fYWkgdWludDY0eDJfdCB2ZW9ycV91NjQodWludDY0eDJfdCBfX2EsIHVpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgXiBfX2I7IH0KLQotI2RlZmluZSB2ZXh0X3M4KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4OF90IF9fYSA9IChhKTsgaW50OHg4X3QgX19iID0gKGIpOyBcCi0gIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92ZXh0X3YoX19hLCBfX2IsIF9fYywgMCk7IH0pCi0jZGVmaW5lIHZleHRfdTgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4OF90IF9fYSA9IChhKTsgdWludDh4OF90IF9fYiA9IChiKTsgXAotICAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZleHRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE2KTsgfSkKLSNkZWZpbmUgdmV4dF9wOChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHg4X3QgX19hID0gKGEpOyBwb2x5OHg4X3QgX19iID0gKGIpOyBcCi0gIChwb2x5OHg4X3QpX19idWlsdGluX25lb25fdmV4dF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgNCk7IH0pCi0jZGVmaW5lIHZleHRfczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IGludDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92ZXh0X3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCAxKTsgfSkKLSNkZWZpbmUgdmV4dF91MTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IHVpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZleHRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE3KTsgfSkKLSNkZWZpbmUgdmV4dF9wMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDRfdCBfX2EgPSAoYSk7IHBvbHkxNng0X3QgX19iID0gKGIpOyBcCi0gIChwb2x5MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZleHRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDUpOyB9KQotI2RlZmluZSB2ZXh0X3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdmV4dF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMik7IH0pCi0jZGVmaW5lIHZleHRfdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hID0gKGEpOyB1aW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92ZXh0X3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCAxOCk7IH0pCi0jZGVmaW5lIHZleHRfczY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDFfdCBfX2EgPSAoYSk7IGludDY0eDFfdCBfX2IgPSAoYik7IFwKLSAgKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92ZXh0X3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCAzKTsgfSkKLSNkZWZpbmUgdmV4dF91NjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDFfdCBfX2EgPSAoYSk7IHVpbnQ2NHgxX3QgX19iID0gKGIpOyBcCi0gICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZleHRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE5KTsgfSkKLSNkZWZpbmUgdmV4dF9mMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyX3QgX19hID0gKGEpOyBmbG9hdDMyeDJfdCBfX2IgPSAoYik7IFwKLSAgKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZleHRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDgpOyB9KQotI2RlZmluZSB2ZXh0cV9zOChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDE2X3QgX19hID0gKGEpOyBpbnQ4eDE2X3QgX19iID0gKGIpOyBcCi0gIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmV4dHFfdihfX2EsIF9fYiwgX19jLCAzMik7IH0pCi0jZGVmaW5lIHZleHRxX3U4KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2X3QgX19hID0gKGEpOyB1aW50OHgxNl90IF9fYiA9IChiKTsgXAotICAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92ZXh0cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCA0OCk7IH0pCi0jZGVmaW5lIHZleHRxX3A4KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2X3QgX19hID0gKGEpOyBwb2x5OHgxNl90IF9fYiA9IChiKTsgXAotICAocG9seTh4MTZfdClfX2J1aWx0aW5fbmVvbl92ZXh0cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzNik7IH0pCi0jZGVmaW5lIHZleHRxX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdmV4dHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzMpOyB9KQotI2RlZmluZSB2ZXh0cV91MTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IHVpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZleHRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDQ5KTsgfSkKLSNkZWZpbmUgdmV4dHFfcDE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4X3QgX19hID0gKGEpOyBwb2x5MTZ4OF90IF9fYiA9IChiKTsgXAotICAocG9seTE2eDhfdClfX2J1aWx0aW5fbmVvbl92ZXh0cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzNyk7IH0pCi0jZGVmaW5lIHZleHRxX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdmV4dHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzQpOyB9KQotI2RlZmluZSB2ZXh0cV91MzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDRfdCBfX2EgPSAoYSk7IHVpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZleHRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDUwKTsgfSkKLSNkZWZpbmUgdmV4dHFfczY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IGludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92ZXh0cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzNSk7IH0pCi0jZGVmaW5lIHZleHRxX3U2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Ml90IF9fYSA9IChhKTsgdWludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmV4dHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNTEpOyB9KQotI2RlZmluZSB2ZXh0cV9mMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0X3QgX19hID0gKGEpOyBmbG9hdDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZleHRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDQwKTsgfSkKLQotX19haSBmbG9hdDMyeDJfdCB2Zm1hX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYiwgZmxvYXQzMngyX3QgX19jKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdmZtYV92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDgpOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZmbWFxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYiwgZmxvYXQzMng0X3QgX19jKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX25lb25fdmZtYXFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCA0MCk7IH0KLQotX19haSBpbnQ4eDhfdCB2Z2V0X2hpZ2hfczgoaW50OHgxNl90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUpOyB9Ci1fX2FpIGludDE2eDRfdCB2Z2V0X2hpZ2hfczE2KGludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCA0LCA1LCA2LCA3KTsgfQotX19haSBpbnQzMngyX3QgdmdldF9oaWdoX3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMiwgMyk7IH0KLV9fYWkgaW50NjR4MV90IHZnZXRfaGlnaF9zNjQoaW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDEpOyB9Ci1fX2FpIGZsb2F0MTZ4NF90IHZnZXRfaGlnaF9mMTYoZmxvYXQxNng4X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgNCwgNSwgNiwgNyk7IH0KLV9fYWkgZmxvYXQzMngyX3QgdmdldF9oaWdoX2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAyLCAzKTsgfQotX19haSB1aW50OHg4X3QgdmdldF9oaWdoX3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSk7IH0KLV9fYWkgdWludDE2eDRfdCB2Z2V0X2hpZ2hfdTE2KHVpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgNCwgNSwgNiwgNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2Z2V0X2hpZ2hfdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMiwgMyk7IH0KLV9fYWkgdWludDY0eDFfdCB2Z2V0X2hpZ2hfdTY0KHVpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMSk7IH0KLV9fYWkgcG9seTh4OF90IHZnZXRfaGlnaF9wOChwb2x5OHgxNl90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUpOyB9Ci1fX2FpIHBvbHkxNng0X3QgdmdldF9oaWdoX3AxNihwb2x5MTZ4OF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDQsIDUsIDYsIDcpOyB9Ci0KLSNkZWZpbmUgdmdldF9sYW5lX3U4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ4X3QpX19idWlsdGluX25lb25fdmdldF9sYW5lX2k4KChpbnQ4eDhfdClfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZnZXRfbGFuZV91MTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pMTYoKGludDE2eDRfdClfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZnZXRfbGFuZV91MzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pMzIoKGludDMyeDJfdClfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZnZXRfbGFuZV9zOChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDhfdCBfX2EgPSAoYSk7IFwKLSAgKGludDhfdClfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfaTgoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2Z2V0X2xhbmVfczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IFwKLSAgKGludDE2X3QpX19idWlsdGluX25lb25fdmdldF9sYW5lX2kxNihfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZnZXRfbGFuZV9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Ml90IF9fYSA9IChhKTsgXAotICAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfaTMyKF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmdldF9sYW5lX3A4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHBvbHk4X3QpX19idWlsdGluX25lb25fdmdldF9sYW5lX2k4KChpbnQ4eDhfdClfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZnZXRfbGFuZV9wMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDRfdCBfX2EgPSAoYSk7IFwKLSAgKHBvbHkxNl90KV9fYnVpbHRpbl9uZW9uX3ZnZXRfbGFuZV9pMTYoKGludDE2eDRfdClfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZnZXRfbGFuZV9mMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyX3QgX19hID0gKGEpOyBcCi0gIChmbG9hdDMyX3QpX19idWlsdGluX25lb25fdmdldF9sYW5lX2YzMihfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZnZXRxX2xhbmVfdTgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ4X3QpX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pOCgoaW50OHgxNl90KV9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmdldHFfbGFuZV91MTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTE2KChpbnQxNng4X3QpX19hLCBfX2IpOyB9KQotI2RlZmluZSB2Z2V0cV9sYW5lX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAodWludDMyX3QpX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pMzIoKGludDMyeDRfdClfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZnZXRxX2xhbmVfczgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNl90IF9fYSA9IChhKTsgXAotICAoaW50OF90KV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTgoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2Z2V0cV9sYW5lX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hID0gKGEpOyBcCi0gIChpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTE2KF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmdldHFfbGFuZV9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2kzMihfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZnZXRxX2xhbmVfcDgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4MTZfdCBfX2EgPSAoYSk7IFwKLSAgKHBvbHk4X3QpX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pOCgoaW50OHgxNl90KV9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmdldHFfbGFuZV9wMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHBvbHkxNl90KV9fYnVpbHRpbl9uZW9uX3ZnZXRxX2xhbmVfaTE2KChpbnQxNng4X3QpX19hLCBfX2IpOyB9KQotI2RlZmluZSB2Z2V0cV9sYW5lX2YzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2YzMihfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZnZXRfbGFuZV9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MV90IF9fYSA9IChhKTsgXAotICAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfaTY0KF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmdldF9sYW5lX3U2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4MV90IF9fYSA9IChhKTsgXAotICAodWludDY0X3QpX19idWlsdGluX25lb25fdmdldF9sYW5lX2k2NCgoaW50NjR4MV90KV9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmdldHFfbGFuZV9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Ml90IF9fYSA9IChhKTsgXAotICAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2k2NChfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZnZXRxX2xhbmVfdTY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2k2NCgoaW50NjR4Ml90KV9fYSwgX19iKTsgfSkKLQotX19haSBpbnQ4eDhfdCB2Z2V0X2xvd19zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNyk7IH0KLV9fYWkgaW50MTZ4NF90IHZnZXRfbG93X3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMCwgMSwgMiwgMyk7IH0KLV9fYWkgaW50MzJ4Ml90IHZnZXRfbG93X3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMCwgMSk7IH0KLV9fYWkgaW50NjR4MV90IHZnZXRfbG93X3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMCk7IH0KLV9fYWkgZmxvYXQxNng0X3QgdmdldF9sb3dfZjE2KGZsb2F0MTZ4OF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDAsIDEsIDIsIDMpOyB9Ci1fX2FpIGZsb2F0MzJ4Ml90IHZnZXRfbG93X2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAwLCAxKTsgfQotX19haSB1aW50OHg4X3QgdmdldF9sb3dfdTgodWludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3KTsgfQotX19haSB1aW50MTZ4NF90IHZnZXRfbG93X3UxNih1aW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDAsIDEsIDIsIDMpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmdldF9sb3dfdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMCwgMSk7IH0KLV9fYWkgdWludDY0eDFfdCB2Z2V0X2xvd191NjQodWludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAwKTsgfQotX19haSBwb2x5OHg4X3QgdmdldF9sb3dfcDgocG9seTh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3KTsgfQotX19haSBwb2x5MTZ4NF90IHZnZXRfbG93X3AxNihwb2x5MTZ4OF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDAsIDEsIDIsIDMpOyB9Ci0KLV9fYWkgaW50OHg4X3QgdmhhZGRfczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92aGFkZF92KF9fYSwgX19iLCAwKTsgfQotX19haSBpbnQxNng0X3QgdmhhZGRfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdmhhZGRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxKTsgfQotX19haSBpbnQzMngyX3QgdmhhZGRfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdmhhZGRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAyKTsgfQotX19haSB1aW50OHg4X3QgdmhhZGRfdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92aGFkZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZoYWRkX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZoYWRkX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmhhZGRfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmhhZGRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOCk7IH0KLV9fYWkgaW50OHgxNl90IHZoYWRkcV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZoYWRkcV92KF9fYSwgX19iLCAzMik7IH0KLV9fYWkgaW50MTZ4OF90IHZoYWRkcV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92aGFkZHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDMzKTsgfQotX19haSBpbnQzMng0X3QgdmhhZGRxX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZoYWRkcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzQpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmhhZGRxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmhhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2aGFkZHFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdmhhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2aGFkZHFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdmhhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MCk7IH0KLQotX19haSBpbnQ4eDhfdCB2aHN1Yl9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Zoc3ViX3YoX19hLCBfX2IsIDApOyB9Ci1fX2FpIGludDE2eDRfdCB2aHN1Yl9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92aHN1Yl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2aHN1Yl9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92aHN1Yl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDIpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2aHN1Yl91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Zoc3ViX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTYpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdmhzdWJfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdmhzdWJfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2aHN1Yl91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92aHN1Yl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE4KTsgfQotX19haSBpbnQ4eDE2X3QgdmhzdWJxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmhzdWJxX3YoX19hLCBfX2IsIDMyKTsgfQotX19haSBpbnQxNng4X3QgdmhzdWJxX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3Zoc3VicV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzMpOyB9Ci1fX2FpIGludDMyeDRfdCB2aHN1YnFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdmhzdWJxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzNCk7IH0KLV9fYWkgdWludDh4MTZfdCB2aHN1YnFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92aHN1YnFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ4KTsgfQotX19haSB1aW50MTZ4OF90IHZoc3VicV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92aHN1YnFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ5KTsgfQotX19haSB1aW50MzJ4NF90IHZoc3VicV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92aHN1YnFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUwKTsgfQotCi0jZGVmaW5lIHZsZDFxX3U4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3YoX19hLCA0OCk7IH0pCi0jZGVmaW5lIHZsZDFxX3UxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92bGQxcV92KF9fYSwgNDkpOyB9KQotI2RlZmluZSB2bGQxcV91MzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdmxkMXFfdihfX2EsIDUwKTsgfSkKLSNkZWZpbmUgdmxkMXFfdTY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3YoX19hLCA1MSk7IH0pCi0jZGVmaW5lIHZsZDFxX3M4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmxkMXFfdihfX2EsIDMyKTsgfSkKLSNkZWZpbmUgdmxkMXFfczE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdmxkMXFfdihfX2EsIDMzKTsgfSkKLSNkZWZpbmUgdmxkMXFfczMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdmxkMXFfdihfX2EsIDM0KTsgfSkKLSNkZWZpbmUgdmxkMXFfczY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmxkMXFfdihfX2EsIDM1KTsgfSkKLSNkZWZpbmUgdmxkMXFfZjE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChmbG9hdDE2eDhfdClfX2J1aWx0aW5fbmVvbl92bGQxcV92KF9fYSwgMzkpOyB9KQotI2RlZmluZSB2bGQxcV9mMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3YoX19hLCA0MCk7IH0pCi0jZGVmaW5lIHZsZDFxX3A4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChwb2x5OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX3YoX19hLCAzNik7IH0pCi0jZGVmaW5lIHZsZDFxX3AxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAocG9seTE2eDhfdClfX2J1aWx0aW5fbmVvbl92bGQxcV92KF9fYSwgMzcpOyB9KQotI2RlZmluZSB2bGQxX3U4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdmxkMV92KF9fYSwgMTYpOyB9KQotI2RlZmluZSB2bGQxX3UxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92bGQxX3YoX19hLCAxNyk7IH0pCi0jZGVmaW5lIHZsZDFfdTMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfdihfX2EsIDE4KTsgfSkKLSNkZWZpbmUgdmxkMV91NjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdmxkMV92KF9fYSwgMTkpOyB9KQotI2RlZmluZSB2bGQxX3M4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92bGQxX3YoX19hLCAwKTsgfSkKLSNkZWZpbmUgdmxkMV9zMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92bGQxX3YoX19hLCAxKTsgfSkKLSNkZWZpbmUgdmxkMV9zMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92bGQxX3YoX19hLCAyKTsgfSkKLSNkZWZpbmUgdmxkMV9zNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92bGQxX3YoX19hLCAzKTsgfSkKLSNkZWZpbmUgdmxkMV9mMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKGZsb2F0MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfdihfX2EsIDcpOyB9KQotI2RlZmluZSB2bGQxX2YzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdmxkMV92KF9fYSwgOCk7IH0pCi0jZGVmaW5lIHZsZDFfcDgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKHBvbHk4eDhfdClfX2J1aWx0aW5fbmVvbl92bGQxX3YoX19hLCA0KTsgfSkKLSNkZWZpbmUgdmxkMV9wMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKHBvbHkxNng0X3QpX19idWlsdGluX25lb25fdmxkMV92KF9fYSwgNSk7IH0pCi0KLSNkZWZpbmUgdmxkMXFfZHVwX3U4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2R1cF92KF9fYSwgNDgpOyB9KQotI2RlZmluZSB2bGQxcV9kdXBfdTE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2R1cF92KF9fYSwgNDkpOyB9KQotI2RlZmluZSB2bGQxcV9kdXBfdTMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2R1cF92KF9fYSwgNTApOyB9KQotI2RlZmluZSB2bGQxcV9kdXBfdTY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2R1cF92KF9fYSwgNTEpOyB9KQotI2RlZmluZSB2bGQxcV9kdXBfczgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92bGQxcV9kdXBfdihfX2EsIDMyKTsgfSkKLSNkZWZpbmUgdmxkMXFfZHVwX3MxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2R1cF92KF9fYSwgMzMpOyB9KQotI2RlZmluZSB2bGQxcV9kdXBfczMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdmxkMXFfZHVwX3YoX19hLCAzNCk7IH0pCi0jZGVmaW5lIHZsZDFxX2R1cF9zNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92bGQxcV9kdXBfdihfX2EsIDM1KTsgfSkKLSNkZWZpbmUgdmxkMXFfZHVwX2YxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAoZmxvYXQxNng4X3QpX19idWlsdGluX25lb25fdmxkMXFfZHVwX3YoX19hLCAzOSk7IH0pCi0jZGVmaW5lIHZsZDFxX2R1cF9mMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2R1cF92KF9fYSwgNDApOyB9KQotI2RlZmluZSB2bGQxcV9kdXBfcDgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKHBvbHk4eDE2X3QpX19idWlsdGluX25lb25fdmxkMXFfZHVwX3YoX19hLCAzNik7IH0pCi0jZGVmaW5lIHZsZDFxX2R1cF9wMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKHBvbHkxNng4X3QpX19idWlsdGluX25lb25fdmxkMXFfZHVwX3YoX19hLCAzNyk7IH0pCi0jZGVmaW5lIHZsZDFfZHVwX3U4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdmxkMV9kdXBfdihfX2EsIDE2KTsgfSkKLSNkZWZpbmUgdmxkMV9kdXBfdTE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfZHVwX3YoX19hLCAxNyk7IH0pCi0jZGVmaW5lIHZsZDFfZHVwX3UzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92bGQxX2R1cF92KF9fYSwgMTgpOyB9KQotI2RlZmluZSB2bGQxX2R1cF91NjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdmxkMV9kdXBfdihfX2EsIDE5KTsgfSkKLSNkZWZpbmUgdmxkMV9kdXBfczgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfZHVwX3YoX19hLCAwKTsgfSkKLSNkZWZpbmUgdmxkMV9kdXBfczE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdmxkMV9kdXBfdihfX2EsIDEpOyB9KQotI2RlZmluZSB2bGQxX2R1cF9zMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92bGQxX2R1cF92KF9fYSwgMik7IH0pCi0jZGVmaW5lIHZsZDFfZHVwX3M2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAoaW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfZHVwX3YoX19hLCAzKTsgfSkKLSNkZWZpbmUgdmxkMV9kdXBfZjE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChmbG9hdDE2eDRfdClfX2J1aWx0aW5fbmVvbl92bGQxX2R1cF92KF9fYSwgNyk7IH0pCi0jZGVmaW5lIHZsZDFfZHVwX2YzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdmxkMV9kdXBfdihfX2EsIDgpOyB9KQotI2RlZmluZSB2bGQxX2R1cF9wOChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAocG9seTh4OF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfZHVwX3YoX19hLCA0KTsgfSkKLSNkZWZpbmUgdmxkMV9kdXBfcDE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChwb2x5MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfZHVwX3YoX19hLCA1KTsgfSkKLQotI2RlZmluZSB2bGQxcV9sYW5lX3U4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmxkMXFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNDgpOyB9KQotI2RlZmluZSB2bGQxcV9sYW5lX3UxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDQ5KTsgfSkKLSNkZWZpbmUgdmxkMXFfbGFuZV91MzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYiA9IChiKTsgXAotICAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92bGQxcV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCA1MCk7IH0pCi0jZGVmaW5lIHZsZDFxX2xhbmVfdTY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmxkMXFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNTEpOyB9KQotI2RlZmluZSB2bGQxcV9sYW5lX3M4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNl90IF9fYiA9IChiKTsgXAotICAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2xhbmVfdihfX2EsIF9fYiwgX19jLCAzMik7IH0pCi0jZGVmaW5lIHZsZDFxX2xhbmVfczE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYiA9IChiKTsgXAotICAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDMzKTsgfSkKLSNkZWZpbmUgdmxkMXFfbGFuZV9zMzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdmxkMXFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzQpOyB9KQotI2RlZmluZSB2bGQxcV9sYW5lX3M2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92bGQxcV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzNSk7IH0pCi0jZGVmaW5lIHZsZDFxX2xhbmVfZjE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng4X3QgX19iID0gKGIpOyBcCi0gIChmbG9hdDE2eDhfdClfX2J1aWx0aW5fbmVvbl92bGQxcV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzOSk7IH0pCi0jZGVmaW5lIHZsZDFxX2xhbmVfZjMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0X3QgX19iID0gKGIpOyBcCi0gIChmbG9hdDMyeDRfdClfX2J1aWx0aW5fbmVvbl92bGQxcV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCA0MCk7IH0pCi0jZGVmaW5lIHZsZDFxX2xhbmVfcDgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHgxNl90IF9fYiA9IChiKTsgXAotICAocG9seTh4MTZfdClfX2J1aWx0aW5fbmVvbl92bGQxcV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzNik7IH0pCi0jZGVmaW5lIHZsZDFxX2xhbmVfcDE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDhfdCBfX2IgPSAoYik7IFwKLSAgKHBvbHkxNng4X3QpX19idWlsdGluX25lb25fdmxkMXFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzcpOyB9KQotI2RlZmluZSB2bGQxX2xhbmVfdTgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4X3QgX19iID0gKGIpOyBcCi0gICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdmxkMV9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE2KTsgfSkKLSNkZWZpbmUgdmxkMV9sYW5lX3UxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYiwgX19jLCAxNyk7IH0pCi0jZGVmaW5lIHZsZDFfbGFuZV91MzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92bGQxX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMTgpOyB9KQotI2RlZmluZSB2bGQxX2xhbmVfdTY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDFfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdmxkMV9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE5KTsgfSkKLSNkZWZpbmUgdmxkMV9sYW5lX3M4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19iID0gKGIpOyBcCi0gIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92bGQxX2xhbmVfdihfX2EsIF9fYiwgX19jLCAwKTsgfSkKLSNkZWZpbmUgdmxkMV9sYW5lX3MxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92bGQxX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMSk7IH0pCi0jZGVmaW5lIHZsZDFfbGFuZV9zMzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdmxkMV9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDIpOyB9KQotI2RlZmluZSB2bGQxX2xhbmVfczY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MV90IF9fYiA9IChiKTsgXAotICAoaW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYiwgX19jLCAzKTsgfSkKLSNkZWZpbmUgdmxkMV9sYW5lX2YxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4NF90IF9fYiA9IChiKTsgXAotICAoZmxvYXQxNng0X3QpX19idWlsdGluX25lb25fdmxkMV9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDcpOyB9KQotI2RlZmluZSB2bGQxX2xhbmVfZjMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyX3QgX19iID0gKGIpOyBcCi0gIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92bGQxX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgOCk7IH0pCi0jZGVmaW5lIHZsZDFfbGFuZV9wOChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDhfdCBfX2IgPSAoYik7IFwKLSAgKHBvbHk4eDhfdClfX2J1aWx0aW5fbmVvbl92bGQxX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgNCk7IH0pCi0jZGVmaW5lIHZsZDFfbGFuZV9wMTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4NF90IF9fYiA9IChiKTsgXAotICAocG9seTE2eDRfdClfX2J1aWx0aW5fbmVvbl92bGQxX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgNSk7IH0pCi0KLSNkZWZpbmUgdmxkMnFfdTgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX3YoJnIsIF9fYSwgNDgpOyByOyB9KQotI2RlZmluZSB2bGQycV91MTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX3YoJnIsIF9fYSwgNDkpOyByOyB9KQotI2RlZmluZSB2bGQycV91MzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX3YoJnIsIF9fYSwgNTApOyByOyB9KQotI2RlZmluZSB2bGQycV9zOChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDE2eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV92KCZyLCBfX2EsIDMyKTsgcjsgfSkKLSNkZWZpbmUgdmxkMnFfczE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX3YoJnIsIF9fYSwgMzMpOyByOyB9KQotI2RlZmluZSB2bGQycV9zMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMnFfdigmciwgX19hLCAzNCk7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2YxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX3YoJnIsIF9fYSwgMzkpOyByOyB9KQotI2RlZmluZSB2bGQycV9mMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV92KCZyLCBfX2EsIDQwKTsgcjsgfSkKLSNkZWZpbmUgdmxkMnFfcDgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4MTZ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX3YoJnIsIF9fYSwgMzYpOyByOyB9KQotI2RlZmluZSB2bGQycV9wMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX3YoJnIsIF9fYSwgMzcpOyByOyB9KQotI2RlZmluZSB2bGQyX3U4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJfdigmciwgX19hLCAxNik7IHI7IH0pCi0jZGVmaW5lIHZsZDJfdTE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX3YoJnIsIF9fYSwgMTcpOyByOyB9KQotI2RlZmluZSB2bGQyX3UzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl92KCZyLCBfX2EsIDE4KTsgcjsgfSkKLSNkZWZpbmUgdmxkMl91NjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDF4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJfdigmciwgX19hLCAxOSk7IHI7IH0pCi0jZGVmaW5lIHZsZDJfczgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX3YoJnIsIF9fYSwgMCk7IHI7IH0pCi0jZGVmaW5lIHZsZDJfczE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJfdigmciwgX19hLCAxKTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9zMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl92KCZyLCBfX2EsIDIpOyByOyB9KQotI2RlZmluZSB2bGQyX3M2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgxeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX3YoJnIsIF9fYSwgMyk7IHI7IH0pCi0jZGVmaW5lIHZsZDJfZjE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl92KCZyLCBfX2EsIDcpOyByOyB9KQotI2RlZmluZSB2bGQyX2YzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJfdigmciwgX19hLCA4KTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9wOChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHg4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX3YoJnIsIF9fYSwgNCk7IHI7IH0pCi0jZGVmaW5lIHZsZDJfcDE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX3YoJnIsIF9fYSwgNSk7IHI7IH0pCi0KLSNkZWZpbmUgdmxkMl9kdXBfdTgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9kdXBfdigmciwgX19hLCAxNik7IHI7IH0pCi0jZGVmaW5lIHZsZDJfZHVwX3UxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9kdXBfdigmciwgX19hLCAxNyk7IHI7IH0pCi0jZGVmaW5lIHZsZDJfZHVwX3UzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9kdXBfdigmciwgX19hLCAxOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDJfZHVwX3U2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4MXgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9kdXBfdigmciwgX19hLCAxOSk7IHI7IH0pCi0jZGVmaW5lIHZsZDJfZHVwX3M4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9kdXBfdigmciwgX19hLCAwKTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9kdXBfczE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJfZHVwX3YoJnIsIF9fYSwgMSk7IHI7IH0pCi0jZGVmaW5lIHZsZDJfZHVwX3MzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX2R1cF92KCZyLCBfX2EsIDIpOyByOyB9KQotI2RlZmluZSB2bGQyX2R1cF9zNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9kdXBfdigmciwgX19hLCAzKTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9kdXBfZjE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9kdXBfdigmciwgX19hLCA3KTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9kdXBfZjMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9kdXBfdigmciwgX19hLCA4KTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9kdXBfcDgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9kdXBfdigmciwgX19hLCA0KTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9kdXBfcDE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX2R1cF92KCZyLCBfX2EsIDUpOyByOyB9KQotCi0jZGVmaW5lIHZsZDJxX2xhbmVfdTE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDh4Ml90IF9fYiA9IChiKTsgXAotICB1aW50MTZ4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMnFfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCBfX2MsIDQ5KTsgcjsgfSkKLSNkZWZpbmUgdmxkMnFfbGFuZV91MzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NHgyX3QgX19iID0gKGIpOyBcCi0gIHVpbnQzMng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9sYW5lX3YoJnIsIF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIF9fYywgNTApOyByOyB9KQotI2RlZmluZSB2bGQycV9sYW5lX3MxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDh4Ml90IF9fYiA9IChiKTsgXAotICBpbnQxNng4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9sYW5lX3YoJnIsIF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIF9fYywgMzMpOyByOyB9KQotI2RlZmluZSB2bGQycV9sYW5lX3MzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDR4Ml90IF9fYiA9IChiKTsgXAotICBpbnQzMng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9sYW5lX3YoJnIsIF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIF9fYywgMzQpOyByOyB9KQotI2RlZmluZSB2bGQycV9sYW5lX2YxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4OHgyX3QgX19iID0gKGIpOyBcCi0gIGZsb2F0MTZ4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMnFfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCBfX2MsIDM5KTsgcjsgfSkKLSNkZWZpbmUgdmxkMnFfbGFuZV9mMzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDR4Ml90IF9fYiA9IChiKTsgXAotICBmbG9hdDMyeDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgX19jLCA0MCk7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2xhbmVfcDE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDh4Ml90IF9fYiA9IChiKTsgXAotICBwb2x5MTZ4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMnFfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCBfX2MsIDM3KTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9sYW5lX3U4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4OHgyX3QgX19iID0gKGIpOyBcCi0gIHVpbnQ4eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgX19jLCAxNik7IHI7IH0pCi0jZGVmaW5lIHZsZDJfbGFuZV91MTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NHgyX3QgX19iID0gKGIpOyBcCi0gIHVpbnQxNng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX2xhbmVfdigmciwgX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIF9fYywgMTcpOyByOyB9KQotI2RlZmluZSB2bGQyX2xhbmVfdTMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJ4Ml90IF9fYiA9IChiKTsgXAotICB1aW50MzJ4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCBfX2MsIDE4KTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9sYW5lX3M4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4eDJfdCBfX2IgPSAoYik7IFwKLSAgaW50OHg4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX2xhbmVfdigmciwgX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2MsIDApOyByOyB9KQotI2RlZmluZSB2bGQyX2xhbmVfczE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NHgyX3QgX19iID0gKGIpOyBcCi0gIGludDE2eDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgX19jLCAxKTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9sYW5lX3MzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJ4Ml90IF9fYiA9IChiKTsgXAotICBpbnQzMngyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX2xhbmVfdigmciwgX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIF9fYywgMik7IHI7IH0pCi0jZGVmaW5lIHZsZDJfbGFuZV9mMTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDR4Ml90IF9fYiA9IChiKTsgXAotICBmbG9hdDE2eDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgX19jLCA3KTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9sYW5lX2YzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4MngyX3QgX19iID0gKGIpOyBcCi0gIGZsb2F0MzJ4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCBfX2MsIDgpOyByOyB9KQotI2RlZmluZSB2bGQyX2xhbmVfcDgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHg4eDJfdCBfX2IgPSAoYik7IFwKLSAgcG9seTh4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCBfX2MsIDQpOyByOyB9KQotI2RlZmluZSB2bGQyX2xhbmVfcDE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDR4Ml90IF9fYiA9IChiKTsgXAotICBwb2x5MTZ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCBfX2MsIDUpOyByOyB9KQotCi0jZGVmaW5lIHZsZDNxX3U4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV92KCZyLCBfX2EsIDQ4KTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfdTE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV92KCZyLCBfX2EsIDQ5KTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfdTMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV92KCZyLCBfX2EsIDUwKTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfczgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNngzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfdigmciwgX19hLCAzMik7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX3MxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV92KCZyLCBfX2EsIDMzKTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfczMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDR4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNxX3YoJnIsIF9fYSwgMzQpOyByOyB9KQotI2RlZmluZSB2bGQzcV9mMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV92KCZyLCBfX2EsIDM5KTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfZjMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfdigmciwgX19hLCA0MCk7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX3A4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV92KCZyLCBfX2EsIDM2KTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfcDE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV92KCZyLCBfX2EsIDM3KTsgcjsgfSkKLSNkZWZpbmUgdmxkM191OChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX3YoJnIsIF9fYSwgMTYpOyByOyB9KQotI2RlZmluZSB2bGQzX3UxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM192KCZyLCBfX2EsIDE3KTsgcjsgfSkKLSNkZWZpbmUgdmxkM191MzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJ4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfdigmciwgX19hLCAxOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfdTY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX3YoJnIsIF9fYSwgMTkpOyByOyB9KQotI2RlZmluZSB2bGQzX3M4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4OHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM192KCZyLCBfX2EsIDApOyByOyB9KQotI2RlZmluZSB2bGQzX3MxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX3YoJnIsIF9fYSwgMSk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfczMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJ4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfdigmciwgX19hLCAyKTsgcjsgfSkKLSNkZWZpbmUgdmxkM19zNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM192KCZyLCBfX2EsIDMpOyByOyB9KQotI2RlZmluZSB2bGQzX2YxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDR4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfdigmciwgX19hLCA3KTsgcjsgfSkKLSNkZWZpbmUgdmxkM19mMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX3YoJnIsIF9fYSwgOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfcDgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM192KCZyLCBfX2EsIDQpOyByOyB9KQotI2RlZmluZSB2bGQzX3AxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4NHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM192KCZyLCBfX2EsIDUpOyByOyB9KQotCi0jZGVmaW5lIHZsZDNfZHVwX3U4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDh4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3YoJnIsIF9fYSwgMTYpOyByOyB9KQotI2RlZmluZSB2bGQzX2R1cF91MTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDR4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3YoJnIsIF9fYSwgMTcpOyByOyB9KQotI2RlZmluZSB2bGQzX2R1cF91MzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJ4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3YoJnIsIF9fYSwgMTgpOyByOyB9KQotI2RlZmluZSB2bGQzX2R1cF91NjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDF4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3YoJnIsIF9fYSwgMTkpOyByOyB9KQotI2RlZmluZSB2bGQzX2R1cF9zOChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDh4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3YoJnIsIF9fYSwgMCk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfZHVwX3MxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX2R1cF92KCZyLCBfX2EsIDEpOyByOyB9KQotI2RlZmluZSB2bGQzX2R1cF9zMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4MngzX3QgcjsgX19idWlsdGluX25lb25fdmxkM19kdXBfdigmciwgX19hLCAyKTsgcjsgfSkKLSNkZWZpbmUgdmxkM19kdXBfczY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDF4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3YoJnIsIF9fYSwgMyk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfZHVwX2YxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDR4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3YoJnIsIF9fYSwgNyk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfZHVwX2YzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJ4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3YoJnIsIF9fYSwgOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfZHVwX3A4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDh4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfZHVwX3YoJnIsIF9fYSwgNCk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfZHVwX3AxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4NHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM19kdXBfdigmciwgX19hLCA1KTsgcjsgfSkKLQotI2RlZmluZSB2bGQzcV9sYW5lX3UxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4eDNfdCBfX2IgPSAoYik7IFwKLSAgdWludDE2eDh4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCBfX2MsIDQ5KTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfbGFuZV91MzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NHgzX3QgX19iID0gKGIpOyBcCi0gIHVpbnQzMng0eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV9sYW5lX3YoJnIsIF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgX19jLCA1MCk7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX2xhbmVfczE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OHgzX3QgX19iID0gKGIpOyBcCi0gIGludDE2eDh4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCBfX2MsIDMzKTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfbGFuZV9zMzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0eDNfdCBfX2IgPSAoYik7IFwKLSAgaW50MzJ4NHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgMzQpOyByOyB9KQotI2RlZmluZSB2bGQzcV9sYW5lX2YxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4OHgzX3QgX19iID0gKGIpOyBcCi0gIGZsb2F0MTZ4OHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgMzkpOyByOyB9KQotI2RlZmluZSB2bGQzcV9sYW5lX2YzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NHgzX3QgX19iID0gKGIpOyBcCi0gIGZsb2F0MzJ4NHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgNDApOyByOyB9KQotI2RlZmluZSB2bGQzcV9sYW5lX3AxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4eDNfdCBfX2IgPSAoYik7IFwKLSAgcG9seTE2eDh4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCBfX2MsIDM3KTsgcjsgfSkKLSNkZWZpbmUgdmxkM19sYW5lX3U4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4OHgzX3QgX19iID0gKGIpOyBcCi0gIHVpbnQ4eDh4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIF9fYywgMTYpOyByOyB9KQotI2RlZmluZSB2bGQzX2xhbmVfdTE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDR4M190IF9fYiA9IChiKTsgXAotICB1aW50MTZ4NHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM19sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgX19jLCAxNyk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfbGFuZV91MzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4MngzX3QgX19iID0gKGIpOyBcCi0gIHVpbnQzMngyeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX2xhbmVfdigmciwgX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCBfX2MsIDE4KTsgcjsgfSkKLSNkZWZpbmUgdmxkM19sYW5lX3M4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4eDNfdCBfX2IgPSAoYik7IFwKLSAgaW50OHg4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX2xhbmVfdigmciwgX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCBfX2MsIDApOyByOyB9KQotI2RlZmluZSB2bGQzX2xhbmVfczE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NHgzX3QgX19iID0gKGIpOyBcCi0gIGludDE2eDR4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIF9fYywgMSk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfbGFuZV9zMzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyeDNfdCBfX2IgPSAoYik7IFwKLSAgaW50MzJ4MngzX3QgcjsgX19idWlsdGluX25lb25fdmxkM19sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgX19jLCAyKTsgcjsgfSkKLSNkZWZpbmUgdmxkM19sYW5lX2YxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4NHgzX3QgX19iID0gKGIpOyBcCi0gIGZsb2F0MTZ4NHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM19sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgX19jLCA3KTsgcjsgfSkKLSNkZWZpbmUgdmxkM19sYW5lX2YzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4MngzX3QgX19iID0gKGIpOyBcCi0gIGZsb2F0MzJ4MngzX3QgcjsgX19idWlsdGluX25lb25fdmxkM19sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgX19jLCA4KTsgcjsgfSkKLSNkZWZpbmUgdmxkM19sYW5lX3A4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OHgzX3QgX19iID0gKGIpOyBcCi0gIHBvbHk4eDh4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIF9fYywgNCk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfbGFuZV9wMTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4NHgzX3QgX19iID0gKGIpOyBcCi0gIHBvbHkxNng0eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX2xhbmVfdigmciwgX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCBfX2MsIDUpOyByOyB9KQotCi0jZGVmaW5lIHZsZDRxX3U4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV92KCZyLCBfX2EsIDQ4KTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfdTE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV92KCZyLCBfX2EsIDQ5KTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfdTMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV92KCZyLCBfX2EsIDUwKTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfczgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNng0X3QgcjsgX19idWlsdGluX25lb25fdmxkNHFfdigmciwgX19hLCAzMik7IHI7IH0pCi0jZGVmaW5lIHZsZDRxX3MxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV92KCZyLCBfX2EsIDMzKTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfczMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDR4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX3YoJnIsIF9fYSwgMzQpOyByOyB9KQotI2RlZmluZSB2bGQ0cV9mMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV92KCZyLCBfX2EsIDM5KTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfZjMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNHFfdigmciwgX19hLCA0MCk7IHI7IH0pCi0jZGVmaW5lIHZsZDRxX3A4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV92KCZyLCBfX2EsIDM2KTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfcDE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV92KCZyLCBfX2EsIDM3KTsgcjsgfSkKLSNkZWZpbmUgdmxkNF91OChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0X3YoJnIsIF9fYSwgMTYpOyByOyB9KQotI2RlZmluZSB2bGQ0X3UxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF92KCZyLCBfX2EsIDE3KTsgcjsgfSkKLSNkZWZpbmUgdmxkNF91MzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfdigmciwgX19hLCAxOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDRfdTY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0X3YoJnIsIF9fYSwgMTkpOyByOyB9KQotI2RlZmluZSB2bGQ0X3M4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4OHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF92KCZyLCBfX2EsIDApOyByOyB9KQotI2RlZmluZSB2bGQ0X3MxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0X3YoJnIsIF9fYSwgMSk7IHI7IH0pCi0jZGVmaW5lIHZsZDRfczMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfdigmciwgX19hLCAyKTsgcjsgfSkKLSNkZWZpbmUgdmxkNF9zNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF92KCZyLCBfX2EsIDMpOyByOyB9KQotI2RlZmluZSB2bGQ0X2YxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDR4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfdigmciwgX19hLCA3KTsgcjsgfSkKLSNkZWZpbmUgdmxkNF9mMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyeDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0X3YoJnIsIF9fYSwgOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDRfcDgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF92KCZyLCBfX2EsIDQpOyByOyB9KQotI2RlZmluZSB2bGQ0X3AxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4NHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF92KCZyLCBfX2EsIDUpOyByOyB9KQotCi0jZGVmaW5lIHZsZDRfZHVwX3U4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDh4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3YoJnIsIF9fYSwgMTYpOyByOyB9KQotI2RlZmluZSB2bGQ0X2R1cF91MTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDR4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3YoJnIsIF9fYSwgMTcpOyByOyB9KQotI2RlZmluZSB2bGQ0X2R1cF91MzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3YoJnIsIF9fYSwgMTgpOyByOyB9KQotI2RlZmluZSB2bGQ0X2R1cF91NjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDF4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3YoJnIsIF9fYSwgMTkpOyByOyB9KQotI2RlZmluZSB2bGQ0X2R1cF9zOChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDh4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3YoJnIsIF9fYSwgMCk7IHI7IH0pCi0jZGVmaW5lIHZsZDRfZHVwX3MxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0X2R1cF92KCZyLCBfX2EsIDEpOyByOyB9KQotI2RlZmluZSB2bGQ0X2R1cF9zMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Mng0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF9kdXBfdigmciwgX19hLCAyKTsgcjsgfSkKLSNkZWZpbmUgdmxkNF9kdXBfczY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDF4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3YoJnIsIF9fYSwgMyk7IHI7IH0pCi0jZGVmaW5lIHZsZDRfZHVwX2YxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDR4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3YoJnIsIF9fYSwgNyk7IHI7IH0pCi0jZGVmaW5lIHZsZDRfZHVwX2YzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3YoJnIsIF9fYSwgOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDRfZHVwX3A4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDh4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3YoJnIsIF9fYSwgNCk7IHI7IH0pCi0jZGVmaW5lIHZsZDRfZHVwX3AxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4NHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF9kdXBfdigmciwgX19hLCA1KTsgcjsgfSkKLQotI2RlZmluZSB2bGQ0cV9sYW5lX3UxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4eDRfdCBfX2IgPSAoYik7IFwKLSAgdWludDE2eDh4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgNDkpOyByOyB9KQotI2RlZmluZSB2bGQ0cV9sYW5lX3UzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0eDRfdCBfX2IgPSAoYik7IFwKLSAgdWludDMyeDR4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgNTApOyByOyB9KQotI2RlZmluZSB2bGQ0cV9sYW5lX3MxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDh4NF90IF9fYiA9IChiKTsgXAotICBpbnQxNng4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV9sYW5lX3YoJnIsIF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCBfX2MsIDMzKTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfbGFuZV9zMzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0eDRfdCBfX2IgPSAoYik7IFwKLSAgaW50MzJ4NHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNHFfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgX19jLCAzNCk7IHI7IH0pCi0jZGVmaW5lIHZsZDRxX2xhbmVfZjE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng4eDRfdCBfX2IgPSAoYik7IFwKLSAgZmxvYXQxNng4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV9sYW5lX3YoJnIsIF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCBfX2MsIDM5KTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfbGFuZV9mMzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDR4NF90IF9fYiA9IChiKTsgXAotICBmbG9hdDMyeDR4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgNDApOyByOyB9KQotI2RlZmluZSB2bGQ0cV9sYW5lX3AxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4eDRfdCBfX2IgPSAoYik7IFwKLSAgcG9seTE2eDh4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgMzcpOyByOyB9KQotI2RlZmluZSB2bGQ0X2xhbmVfdTgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4eDRfdCBfX2IgPSAoYik7IFwKLSAgdWludDh4OHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIF9fYywgMTYpOyByOyB9KQotI2RlZmluZSB2bGQ0X2xhbmVfdTE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDR4NF90IF9fYiA9IChiKTsgXAotICB1aW50MTZ4NHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIF9fYywgMTcpOyByOyB9KQotI2RlZmluZSB2bGQ0X2xhbmVfdTMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJ4NF90IF9fYiA9IChiKTsgXAotICB1aW50MzJ4Mng0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIF9fYywgMTgpOyByOyB9KQotI2RlZmluZSB2bGQ0X2xhbmVfczgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDh4NF90IF9fYiA9IChiKTsgXAotICBpbnQ4eDh4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfbGFuZV92KCZyLCBfX2EsIF9fYi52YWxbMF0sIF9fYi52YWxbMV0sIF9fYi52YWxbMl0sIF9fYi52YWxbM10sIF9fYywgMCk7IHI7IH0pCi0jZGVmaW5lIHZsZDRfbGFuZV9zMTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0eDRfdCBfX2IgPSAoYik7IFwKLSAgaW50MTZ4NHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIF9fYywgMSk7IHI7IH0pCi0jZGVmaW5lIHZsZDRfbGFuZV9zMzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyeDRfdCBfX2IgPSAoYik7IFwKLSAgaW50MzJ4Mng0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIF9fYywgMik7IHI7IH0pCi0jZGVmaW5lIHZsZDRfbGFuZV9mMTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDR4NF90IF9fYiA9IChiKTsgXAotICBmbG9hdDE2eDR4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCBfX2MsIDcpOyByOyB9KQotI2RlZmluZSB2bGQ0X2xhbmVfZjMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyeDRfdCBfX2IgPSAoYik7IFwKLSAgZmxvYXQzMngyeDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0X2xhbmVfdigmciwgX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgX19jLCA4KTsgcjsgfSkKLSNkZWZpbmUgdmxkNF9sYW5lX3A4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OHg0X3QgX19iID0gKGIpOyBcCi0gIHBvbHk4eDh4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCBfX2MsIDQpOyByOyB9KQotI2RlZmluZSB2bGQ0X2xhbmVfcDE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDR4NF90IF9fYiA9IChiKTsgXAotICBwb2x5MTZ4NHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIF9fYywgNSk7IHI7IH0pCi0KLV9fYWkgaW50OHg4X3Qgdm1heF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZtYXhfdihfX2EsIF9fYiwgMCk7IH0KLV9fYWkgaW50MTZ4NF90IHZtYXhfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdm1heF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2bWF4X3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZtYXhfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAyKTsgfQotX19haSB1aW50OHg4X3Qgdm1heF91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZtYXhfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2bWF4X3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZtYXhfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2bWF4X3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZtYXhfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOCk7IH0KLV9fYWkgZmxvYXQzMngyX3Qgdm1heF9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92bWF4X3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgOCk7IH0KLV9fYWkgaW50OHgxNl90IHZtYXhxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdm1heHFfdihfX2EsIF9fYiwgMzIpOyB9Ci1fX2FpIGludDE2eDhfdCB2bWF4cV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92bWF4cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzMpOyB9Ci1fX2FpIGludDMyeDRfdCB2bWF4cV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92bWF4cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzQpOyB9Ci1fX2FpIHVpbnQ4eDE2X3Qgdm1heHFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92bWF4cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDgpOyB9Ci1fX2FpIHVpbnQxNng4X3Qgdm1heHFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdm1heHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ5KTsgfQotX19haSB1aW50MzJ4NF90IHZtYXhxX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZtYXhxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MCk7IH0KLV9fYWkgZmxvYXQzMng0X3Qgdm1heHFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX25lb25fdm1heHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQwKTsgfQotCi1fX2FpIGludDh4OF90IHZtaW5fczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92bWluX3YoX19hLCBfX2IsIDApOyB9Ci1fX2FpIGludDE2eDRfdCB2bWluX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZtaW5fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxKTsgfQotX19haSBpbnQzMngyX3Qgdm1pbl9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92bWluX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMik7IH0KLV9fYWkgdWludDh4OF90IHZtaW5fdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92bWluX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTYpOyB9Ci1fX2FpIHVpbnQxNng0X3Qgdm1pbl91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92bWluX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3Qgdm1pbl91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92bWluX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTgpOyB9Ci1fX2FpIGZsb2F0MzJ4Ml90IHZtaW5fZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdm1pbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDgpOyB9Ci1fX2FpIGludDh4MTZfdCB2bWlucV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZtaW5xX3YoX19hLCBfX2IsIDMyKTsgfQotX19haSBpbnQxNng4X3Qgdm1pbnFfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdm1pbnFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDMzKTsgfQotX19haSBpbnQzMng0X3Qgdm1pbnFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdm1pbnFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM0KTsgfQotX19haSB1aW50OHgxNl90IHZtaW5xX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdm1pbnFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ4KTsgfQotX19haSB1aW50MTZ4OF90IHZtaW5xX3UxNih1aW50MTZ4OF90IF9fYSwgdWludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZtaW5xX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2bWlucV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92bWlucV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTApOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZtaW5xX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZtaW5xX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0MCk7IH0KLQotX19haSBpbnQ4eDhfdCB2bWxhX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iLCBpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIChfX2IgKiBfX2MpOyB9Ci1fX2FpIGludDE2eDRfdCB2bWxhX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iLCBpbnQxNng0X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyAoX19iICogX19jKTsgfQotX19haSBpbnQzMngyX3Qgdm1sYV9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYiwgaW50MzJ4Ml90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqIF9fYyk7IH0KLV9fYWkgZmxvYXQzMngyX3Qgdm1sYV9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IsIGZsb2F0MzJ4Ml90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqIF9fYyk7IH0KLV9fYWkgdWludDh4OF90IHZtbGFfdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYiwgdWludDh4OF90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqIF9fYyk7IH0KLV9fYWkgdWludDE2eDRfdCB2bWxhX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IsIHVpbnQxNng0X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyAoX19iICogX19jKTsgfQotX19haSB1aW50MzJ4Ml90IHZtbGFfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYiwgdWludDMyeDJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIChfX2IgKiBfX2MpOyB9Ci1fX2FpIGludDh4MTZfdCB2bWxhcV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iLCBpbnQ4eDE2X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyAoX19iICogX19jKTsgfQotX19haSBpbnQxNng4X3Qgdm1sYXFfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IsIGludDE2eDhfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIChfX2IgKiBfX2MpOyB9Ci1fX2FpIGludDMyeDRfdCB2bWxhcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYiwgaW50MzJ4NF90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqIF9fYyk7IH0KLV9fYWkgZmxvYXQzMng0X3Qgdm1sYXFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iLCBmbG9hdDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIChfX2IgKiBfX2MpOyB9Ci1fX2FpIHVpbnQ4eDE2X3Qgdm1sYXFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iLCB1aW50OHgxNl90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqIF9fYyk7IH0KLV9fYWkgdWludDE2eDhfdCB2bWxhcV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iLCB1aW50MTZ4OF90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqIF9fYyk7IH0KLV9fYWkgdWludDMyeDRfdCB2bWxhcV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iLCB1aW50MzJ4NF90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqIF9fYyk7IH0KLQotX19haSBpbnQxNng4X3Qgdm1sYWxfczgoaW50MTZ4OF90IF9fYSwgaW50OHg4X3QgX19iLCBpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZtdWxsX3M4KF9fYiwgX19jKTsgfQotX19haSBpbnQzMng0X3Qgdm1sYWxfczE2KGludDMyeDRfdCBfX2EsIGludDE2eDRfdCBfX2IsIGludDE2eDRfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZtdWxsX3MxNihfX2IsIF9fYyk7IH0KLV9fYWkgaW50NjR4Ml90IHZtbGFsX3MzMihpbnQ2NHgyX3QgX19hLCBpbnQzMngyX3QgX19iLCBpbnQzMngyX3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyB2bXVsbF9zMzIoX19iLCBfX2MpOyB9Ci1fX2FpIHVpbnQxNng4X3Qgdm1sYWxfdTgodWludDE2eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IsIHVpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZtdWxsX3U4KF9fYiwgX19jKTsgfQotX19haSB1aW50MzJ4NF90IHZtbGFsX3UxNih1aW50MzJ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IsIHVpbnQxNng0X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyB2bXVsbF91MTYoX19iLCBfX2MpOyB9Ci1fX2FpIHVpbnQ2NHgyX3Qgdm1sYWxfdTMyKHVpbnQ2NHgyX3QgX19hLCB1aW50MzJ4Ml90IF9fYiwgdWludDMyeDJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZtdWxsX3UzMihfX2IsIF9fYyk7IH0KLQotI2RlZmluZSB2bWxhbF9sYW5lX3MxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBpbnQxNng0X3QgX19iID0gKGIpOyBpbnQxNng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSArIHZtdWxsX3MxNihfX2IsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCwgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sYWxfbGFuZV9zMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Ml90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgaW50MzJ4Ml90IF9fYyA9IChjKTsgXAotICBfX2EgKyB2bXVsbF9zMzIoX19iLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sYWxfbGFuZV91MTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDRfdCBfX2EgPSAoYSk7IHVpbnQxNng0X3QgX19iID0gKGIpOyB1aW50MTZ4NF90IF9fYyA9IChjKTsgXAotICBfX2EgKyB2bXVsbF91MTYoX19iLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFsX2xhbmVfdTMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyX3QgX19hID0gKGEpOyB1aW50MzJ4Ml90IF9fYiA9IChiKTsgdWludDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgdm11bGxfdTMyKF9fYiwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0KLV9fYWkgaW50MzJ4NF90IHZtbGFsX25fczE2KGludDMyeDRfdCBfX2EsIGludDE2eDRfdCBfX2IsIGludDE2X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyB2bXVsbF9zMTYoX19iLCAoaW50MTZ4NF90KXsgX19jLCBfX2MsIF9fYywgX19jIH0pOyB9Ci1fX2FpIGludDY0eDJfdCB2bWxhbF9uX3MzMihpbnQ2NHgyX3QgX19hLCBpbnQzMngyX3QgX19iLCBpbnQzMl90IF9fYykgewotICByZXR1cm4gX19hICsgdm11bGxfczMyKF9fYiwgKGludDMyeDJfdCl7IF9fYywgX19jIH0pOyB9Ci1fX2FpIHVpbnQzMng0X3Qgdm1sYWxfbl91MTYodWludDMyeDRfdCBfX2EsIHVpbnQxNng0X3QgX19iLCB1aW50MTZfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZtdWxsX3UxNihfX2IsICh1aW50MTZ4NF90KXsgX19jLCBfX2MsIF9fYywgX19jIH0pOyB9Ci1fX2FpIHVpbnQ2NHgyX3Qgdm1sYWxfbl91MzIodWludDY0eDJfdCBfX2EsIHVpbnQzMngyX3QgX19iLCB1aW50MzJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIHZtdWxsX3UzMihfX2IsICh1aW50MzJ4Ml90KXsgX19jLCBfX2MgfSk7IH0KLQotI2RlZmluZSB2bWxhX2xhbmVfczE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IGludDE2eDRfdCBfX2IgPSAoYik7IGludDE2eDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCwgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sYV9sYW5lX3MzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBpbnQzMngyX3QgX19iID0gKGIpOyBpbnQzMngyX3QgX19jID0gKGMpOyBcCi0gIF9fYSArIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sYV9sYW5lX3UxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NF90IF9fYSA9IChhKTsgdWludDE2eDRfdCBfX2IgPSAoYik7IHVpbnQxNng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSArIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFfbGFuZV91MzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJfdCBfX2EgPSAoYSk7IHVpbnQzMngyX3QgX19iID0gKGIpOyB1aW50MzJ4Ml90IF9fYyA9IChjKTsgXAotICBfX2EgKyAoX19iICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFfbGFuZV9mMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyX3QgX19hID0gKGEpOyBmbG9hdDMyeDJfdCBfX2IgPSAoYik7IGZsb2F0MzJ4Ml90IF9fYyA9IChjKTsgXAotICBfX2EgKyAoX19iICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFxX2xhbmVfczE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IGludDE2eDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxhcV9sYW5lX3MzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBpbnQzMngyX3QgX19jID0gKGMpOyBcCi0gIF9fYSArIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFxX2xhbmVfdTE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4X3QgX19hID0gKGEpOyB1aW50MTZ4OF90IF9fYiA9IChiKTsgdWludDE2eDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxhcV9sYW5lX3UzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgdWludDMyeDRfdCBfX2IgPSAoYik7IHVpbnQzMngyX3QgX19jID0gKGMpOyBcCi0gIF9fYSArIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFxX2xhbmVfZjMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NF90IF9fYSA9IChhKTsgZmxvYXQzMng0X3QgX19iID0gKGIpOyBmbG9hdDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCwgX19kLCBfX2QpKTsgfSkKLQotX19haSBpbnQxNng0X3Qgdm1sYV9uX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iLCBpbnQxNl90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqIChpbnQxNng0X3QpeyBfX2MsIF9fYywgX19jLCBfX2MgfSk7IH0KLV9fYWkgaW50MzJ4Ml90IHZtbGFfbl9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYiwgaW50MzJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIChfX2IgKiAoaW50MzJ4Ml90KXsgX19jLCBfX2MgfSk7IH0KLV9fYWkgdWludDE2eDRfdCB2bWxhX25fdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYiwgdWludDE2X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyAoX19iICogKHVpbnQxNng0X3QpeyBfX2MsIF9fYywgX19jLCBfX2MgfSk7IH0KLV9fYWkgdWludDMyeDJfdCB2bWxhX25fdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYiwgdWludDMyX3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyAoX19iICogKHVpbnQzMngyX3QpeyBfX2MsIF9fYyB9KTsgfQotX19haSBmbG9hdDMyeDJfdCB2bWxhX25fZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iLCBmbG9hdDMyX3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyAoX19iICogKGZsb2F0MzJ4Ml90KXsgX19jLCBfX2MgfSk7IH0KLV9fYWkgaW50MTZ4OF90IHZtbGFxX25fczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IsIGludDE2X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyAoX19iICogKGludDE2eDhfdCl7IF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jIH0pOyB9Ci1fX2FpIGludDMyeDRfdCB2bWxhcV9uX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iLCBpbnQzMl90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqIChpbnQzMng0X3QpeyBfX2MsIF9fYywgX19jLCBfX2MgfSk7IH0KLV9fYWkgdWludDE2eDhfdCB2bWxhcV9uX3UxNih1aW50MTZ4OF90IF9fYSwgdWludDE2eDhfdCBfX2IsIHVpbnQxNl90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqICh1aW50MTZ4OF90KXsgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MgfSk7IH0KLV9fYWkgdWludDMyeDRfdCB2bWxhcV9uX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IsIHVpbnQzMl90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqICh1aW50MzJ4NF90KXsgX19jLCBfX2MsIF9fYywgX19jIH0pOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZtbGFxX25fZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iLCBmbG9hdDMyX3QgX19jKSB7Ci0gIHJldHVybiBfX2EgKyAoX19iICogKGZsb2F0MzJ4NF90KXsgX19jLCBfX2MsIF9fYywgX19jIH0pOyB9Ci0KLV9fYWkgaW50OHg4X3Qgdm1sc19zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYiwgaW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgLSAoX19iICogX19jKTsgfQotX19haSBpbnQxNng0X3Qgdm1sc19zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYiwgaW50MTZ4NF90IF9fYykgewotICByZXR1cm4gX19hIC0gKF9fYiAqIF9fYyk7IH0KLV9fYWkgaW50MzJ4Ml90IHZtbHNfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IsIGludDMyeDJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiBfX2MpOyB9Ci1fX2FpIGZsb2F0MzJ4Ml90IHZtbHNfZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iLCBmbG9hdDMyeDJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiBfX2MpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2bWxzX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IsIHVpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiBfX2MpOyB9Ci1fX2FpIHVpbnQxNng0X3Qgdm1sc191MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iLCB1aW50MTZ4NF90IF9fYykgewotICByZXR1cm4gX19hIC0gKF9fYiAqIF9fYyk7IH0KLV9fYWkgdWludDMyeDJfdCB2bWxzX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IsIHVpbnQzMngyX3QgX19jKSB7Ci0gIHJldHVybiBfX2EgLSAoX19iICogX19jKTsgfQotX19haSBpbnQ4eDE2X3Qgdm1sc3FfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYiwgaW50OHgxNl90IF9fYykgewotICByZXR1cm4gX19hIC0gKF9fYiAqIF9fYyk7IH0KLV9fYWkgaW50MTZ4OF90IHZtbHNxX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iLCBpbnQxNng4X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgLSAoX19iICogX19jKTsgfQotX19haSBpbnQzMng0X3Qgdm1sc3FfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IsIGludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiBfX2MpOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZtbHNxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYiwgZmxvYXQzMng0X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgLSAoX19iICogX19jKTsgfQotX19haSB1aW50OHgxNl90IHZtbHNxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYiwgdWludDh4MTZfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiBfX2MpOyB9Ci1fX2FpIHVpbnQxNng4X3Qgdm1sc3FfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYiwgdWludDE2eDhfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiBfX2MpOyB9Ci1fX2FpIHVpbnQzMng0X3Qgdm1sc3FfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYiwgdWludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiBfX2MpOyB9Ci0KLV9fYWkgaW50MTZ4OF90IHZtbHNsX3M4KGludDE2eDhfdCBfX2EsIGludDh4OF90IF9fYiwgaW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgLSB2bXVsbF9zOChfX2IsIF9fYyk7IH0KLV9fYWkgaW50MzJ4NF90IHZtbHNsX3MxNihpbnQzMng0X3QgX19hLCBpbnQxNng0X3QgX19iLCBpbnQxNng0X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgLSB2bXVsbF9zMTYoX19iLCBfX2MpOyB9Ci1fX2FpIGludDY0eDJfdCB2bWxzbF9zMzIoaW50NjR4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYiwgaW50MzJ4Ml90IF9fYykgewotICByZXR1cm4gX19hIC0gdm11bGxfczMyKF9fYiwgX19jKTsgfQotX19haSB1aW50MTZ4OF90IHZtbHNsX3U4KHVpbnQxNng4X3QgX19hLCB1aW50OHg4X3QgX19iLCB1aW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgLSB2bXVsbF91OChfX2IsIF9fYyk7IH0KLV9fYWkgdWludDMyeDRfdCB2bWxzbF91MTYodWludDMyeDRfdCBfX2EsIHVpbnQxNng0X3QgX19iLCB1aW50MTZ4NF90IF9fYykgewotICByZXR1cm4gX19hIC0gdm11bGxfdTE2KF9fYiwgX19jKTsgfQotX19haSB1aW50NjR4Ml90IHZtbHNsX3UzMih1aW50NjR4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IsIHVpbnQzMngyX3QgX19jKSB7Ci0gIHJldHVybiBfX2EgLSB2bXVsbF91MzIoX19iLCBfX2MpOyB9Ci0KLSNkZWZpbmUgdm1sc2xfbGFuZV9zMTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgaW50MTZ4NF90IF9fYyA9IChjKTsgXAotICBfX2EgLSB2bXVsbF9zMTYoX19iLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbHNsX2xhbmVfczMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IGludDMyeDJfdCBfX2IgPSAoYik7IGludDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gdm11bGxfczMyKF9fYiwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbHNsX2xhbmVfdTE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MTZ4NF90IF9fYiA9IChiKTsgdWludDE2eDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gdm11bGxfdTE2KF9fYiwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzbF9sYW5lX3UzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Ml90IF9fYSA9IChhKTsgdWludDMyeDJfdCBfX2IgPSAoYik7IHVpbnQzMngyX3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIHZtdWxsX3UzMihfX2IsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotCi1fX2FpIGludDMyeDRfdCB2bWxzbF9uX3MxNihpbnQzMng0X3QgX19hLCBpbnQxNng0X3QgX19iLCBpbnQxNl90IF9fYykgewotICByZXR1cm4gX19hIC0gdm11bGxfczE2KF9fYiwgKGludDE2eDRfdCl7IF9fYywgX19jLCBfX2MsIF9fYyB9KTsgfQotX19haSBpbnQ2NHgyX3Qgdm1sc2xfbl9zMzIoaW50NjR4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYiwgaW50MzJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIHZtdWxsX3MzMihfX2IsIChpbnQzMngyX3QpeyBfX2MsIF9fYyB9KTsgfQotX19haSB1aW50MzJ4NF90IHZtbHNsX25fdTE2KHVpbnQzMng0X3QgX19hLCB1aW50MTZ4NF90IF9fYiwgdWludDE2X3QgX19jKSB7Ci0gIHJldHVybiBfX2EgLSB2bXVsbF91MTYoX19iLCAodWludDE2eDRfdCl7IF9fYywgX19jLCBfX2MsIF9fYyB9KTsgfQotX19haSB1aW50NjR4Ml90IHZtbHNsX25fdTMyKHVpbnQ2NHgyX3QgX19hLCB1aW50MzJ4Ml90IF9fYiwgdWludDMyX3QgX19jKSB7Ci0gIHJldHVybiBfX2EgLSB2bXVsbF91MzIoX19iLCAodWludDMyeDJfdCl7IF9fYywgX19jIH0pOyB9Ci0KLSNkZWZpbmUgdm1sc19sYW5lX3MxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBpbnQxNng0X3QgX19iID0gKGIpOyBpbnQxNng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbHNfbGFuZV9zMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Ml90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgaW50MzJ4Ml90IF9fYyA9IChjKTsgXAotICBfX2EgLSAoX19iICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbHNfbGFuZV91MTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IHVpbnQxNng0X3QgX19iID0gKGIpOyB1aW50MTZ4NF90IF9fYyA9IChjKTsgXAotICBfX2EgLSAoX19iICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzX2xhbmVfdTMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hID0gKGEpOyB1aW50MzJ4Ml90IF9fYiA9IChiKTsgdWludDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzX2xhbmVfZjMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4Ml90IF9fYSA9IChhKTsgZmxvYXQzMngyX3QgX19iID0gKGIpOyBmbG9hdDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzcV9sYW5lX3MxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBpbnQxNng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sc3FfbGFuZV9zMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgaW50MzJ4Ml90IF9fYyA9IChjKTsgXAotICBfX2EgLSAoX19iICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzcV9sYW5lX3UxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OF90IF9fYSA9IChhKTsgdWludDE2eDhfdCBfX2IgPSAoYik7IHVpbnQxNng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sc3FfbGFuZV91MzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDRfdCBfX2EgPSAoYSk7IHVpbnQzMng0X3QgX19iID0gKGIpOyB1aW50MzJ4Ml90IF9fYyA9IChjKTsgXAotICBfX2EgLSAoX19iICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzcV9sYW5lX2YzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDRfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4NF90IF9fYiA9IChiKTsgZmxvYXQzMngyX3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0KLV9fYWkgaW50MTZ4NF90IHZtbHNfbl9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYiwgaW50MTZfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiAoaW50MTZ4NF90KXsgX19jLCBfX2MsIF9fYywgX19jIH0pOyB9Ci1fX2FpIGludDMyeDJfdCB2bWxzX25fczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IsIGludDMyX3QgX19jKSB7Ci0gIHJldHVybiBfX2EgLSAoX19iICogKGludDMyeDJfdCl7IF9fYywgX19jIH0pOyB9Ci1fX2FpIHVpbnQxNng0X3Qgdm1sc19uX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IsIHVpbnQxNl90IF9fYykgewotICByZXR1cm4gX19hIC0gKF9fYiAqICh1aW50MTZ4NF90KXsgX19jLCBfX2MsIF9fYywgX19jIH0pOyB9Ci1fX2FpIHVpbnQzMngyX3Qgdm1sc19uX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IsIHVpbnQzMl90IF9fYykgewotICByZXR1cm4gX19hIC0gKF9fYiAqICh1aW50MzJ4Ml90KXsgX19jLCBfX2MgfSk7IH0KLV9fYWkgZmxvYXQzMngyX3Qgdm1sc19uX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYiwgZmxvYXQzMl90IF9fYykgewotICByZXR1cm4gX19hIC0gKF9fYiAqIChmbG9hdDMyeDJfdCl7IF9fYywgX19jIH0pOyB9Ci1fX2FpIGludDE2eDhfdCB2bWxzcV9uX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iLCBpbnQxNl90IF9fYykgewotICByZXR1cm4gX19hIC0gKF9fYiAqIChpbnQxNng4X3QpeyBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYyB9KTsgfQotX19haSBpbnQzMng0X3Qgdm1sc3Ffbl9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYiwgaW50MzJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiAoaW50MzJ4NF90KXsgX19jLCBfX2MsIF9fYywgX19jIH0pOyB9Ci1fX2FpIHVpbnQxNng4X3Qgdm1sc3Ffbl91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iLCB1aW50MTZfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiAodWludDE2eDhfdCl7IF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jIH0pOyB9Ci1fX2FpIHVpbnQzMng0X3Qgdm1sc3Ffbl91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iLCB1aW50MzJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiAodWludDMyeDRfdCl7IF9fYywgX19jLCBfX2MsIF9fYyB9KTsgfQotX19haSBmbG9hdDMyeDRfdCB2bWxzcV9uX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYiwgZmxvYXQzMl90IF9fYykgewotICByZXR1cm4gX19hIC0gKF9fYiAqIChmbG9hdDMyeDRfdCl7IF9fYywgX19jLCBfX2MsIF9fYyB9KTsgfQotCi1fX2FpIGludDh4OF90IHZtb3ZuX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19idWlsdGluX25lb25fdm1vdm5fdigoaW50OHgxNl90KV9fYSwgMCk7IH0KLV9fYWkgaW50MTZ4NF90IHZtb3ZuX3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Ztb3ZuX3YoKGludDh4MTZfdClfX2EsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2bW92bl9zNjQoaW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92bW92bl92KChpbnQ4eDE2X3QpX19hLCAyKTsgfQotX19haSB1aW50OHg4X3Qgdm1vdm5fdTE2KHVpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Ztb3ZuX3YoKGludDh4MTZfdClfX2EsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZtb3ZuX3UzMih1aW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdm1vdm5fdigoaW50OHgxNl90KV9fYSwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3Qgdm1vdm5fdTY0KHVpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92bW92bl92KChpbnQ4eDE2X3QpX19hLCAxOCk7IH0KLQotX19haSB1aW50OHg4X3Qgdm1vdl9uX3U4KHVpbnQ4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSB1aW50MTZ4NF90IHZtb3Zfbl91MTYodWludDE2X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdCl7IF9fYSwgX19hLCBfX2EsIF9fYSB9OyB9Ci1fX2FpIHVpbnQzMngyX3Qgdm1vdl9uX3UzMih1aW50MzJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KXsgX19hLCBfX2EgfTsgfQotX19haSBpbnQ4eDhfdCB2bW92X25fczgoaW50OF90IF9fYSkgewotICByZXR1cm4gKGludDh4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBpbnQxNng0X3Qgdm1vdl9uX3MxNihpbnQxNl90IF9fYSkgewotICByZXR1cm4gKGludDE2eDRfdCl7IF9fYSwgX19hLCBfX2EsIF9fYSB9OyB9Ci1fX2FpIGludDMyeDJfdCB2bW92X25fczMyKGludDMyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KXsgX19hLCBfX2EgfTsgfQotX19haSBwb2x5OHg4X3Qgdm1vdl9uX3A4KHBvbHk4X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBwb2x5MTZ4NF90IHZtb3Zfbl9wMTYocG9seTE2X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDRfdCl7IF9fYSwgX19hLCBfX2EsIF9fYSB9OyB9Ci1fX2FpIGZsb2F0MzJ4Ml90IHZtb3Zfbl9mMzIoZmxvYXQzMl90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KXsgX19hLCBfX2EgfTsgfQotX19haSB1aW50OHgxNl90IHZtb3ZxX25fdTgodWludDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hIH07IH0KLV9fYWkgdWludDE2eDhfdCB2bW92cV9uX3UxNih1aW50MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSB1aW50MzJ4NF90IHZtb3ZxX25fdTMyKHVpbnQzMl90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMng0X3QpeyBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBpbnQ4eDE2X3Qgdm1vdnFfbl9zOChpbnQ4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hIH07IH0KLV9fYWkgaW50MTZ4OF90IHZtb3ZxX25fczE2KGludDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBpbnQzMng0X3Qgdm1vdnFfbl9zMzIoaW50MzJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpeyBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBwb2x5OHgxNl90IHZtb3ZxX25fcDgocG9seThfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5OHgxNl90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hIH07IH0KLV9fYWkgcG9seTE2eDhfdCB2bW92cV9uX3AxNihwb2x5MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4OF90KXsgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBmbG9hdDMyeDRfdCB2bW92cV9uX2YzMihmbG9hdDMyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpeyBfX2EsIF9fYSwgX19hLCBfX2EgfTsgfQotX19haSBpbnQ2NHgxX3Qgdm1vdl9uX3M2NChpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdCl7IF9fYSB9OyB9Ci1fX2FpIHVpbnQ2NHgxX3Qgdm1vdl9uX3U2NCh1aW50NjRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KXsgX19hIH07IH0KLV9fYWkgaW50NjR4Ml90IHZtb3ZxX25fczY0KGludDY0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KXsgX19hLCBfX2EgfTsgfQotX19haSB1aW50NjR4Ml90IHZtb3ZxX25fdTY0KHVpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpeyBfX2EsIF9fYSB9OyB9Ci0KLV9fYWkgaW50OHg4X3Qgdm11bF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gX19hICogX19iOyB9Ci1fX2FpIGludDE2eDRfdCB2bXVsX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKiBfX2I7IH0KLV9fYWkgaW50MzJ4Ml90IHZtdWxfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAqIF9fYjsgfQotX19haSBmbG9hdDMyeDJfdCB2bXVsX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICByZXR1cm4gX19hICogX19iOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2bXVsX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAqIF9fYjsgfQotX19haSB1aW50MTZ4NF90IHZtdWxfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gX19hICogX19iOyB9Ci1fX2FpIHVpbnQzMngyX3Qgdm11bF91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKiBfX2I7IH0KLV9fYWkgaW50OHgxNl90IHZtdWxxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAqIF9fYjsgfQotX19haSBpbnQxNng4X3Qgdm11bHFfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAqIF9fYjsgfQotX19haSBpbnQzMng0X3Qgdm11bHFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAqIF9fYjsgfQotX19haSBmbG9hdDMyeDRfdCB2bXVscV9mMzIoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAqIF9fYjsgfQotX19haSB1aW50OHgxNl90IHZtdWxxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19hICogX19iOyB9Ci1fX2FpIHVpbnQxNng4X3Qgdm11bHFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19hICogX19iOyB9Ci1fX2FpIHVpbnQzMng0X3Qgdm11bHFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hICogX19iOyB9Ci0KLSNkZWZpbmUgdm11bGxfbGFuZV9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NF90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgXAotICB2bXVsbF9zMTYoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0jZGVmaW5lIHZtdWxsX2xhbmVfczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IGludDMyeDJfdCBfX2IgPSAoYik7IFwKLSAgdm11bGxfczMyKF9fYSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jKSk7IH0pCi0jZGVmaW5lIHZtdWxsX2xhbmVfdTE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0X3QgX19hID0gKGEpOyB1aW50MTZ4NF90IF9fYiA9IChiKTsgXAotICB2bXVsbF91MTYoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0jZGVmaW5lIHZtdWxsX2xhbmVfdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hID0gKGEpOyB1aW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICB2bXVsbF91MzIoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MpKTsgfSkKLQotX19haSBpbnQzMng0X3Qgdm11bGxfbl9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdm11bGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpKGludDE2eDRfdCl7IF9fYiwgX19iLCBfX2IsIF9fYiB9LCAzNCk7IH0KLV9fYWkgaW50NjR4Ml90IHZtdWxsX25fczMyKGludDMyeDJfdCBfX2EsIGludDMyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZtdWxsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KShpbnQzMngyX3QpeyBfX2IsIF9fYiB9LCAzNSk7IH0KLV9fYWkgdWludDMyeDRfdCB2bXVsbF9uX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92bXVsbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdCkodWludDE2eDRfdCl7IF9fYiwgX19iLCBfX2IsIF9fYiB9LCA1MCk7IH0KLV9fYWkgdWludDY0eDJfdCB2bXVsbF9uX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92bXVsbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdCkodWludDMyeDJfdCl7IF9fYiwgX19iIH0sIDUxKTsgfQotCi1fX2FpIHBvbHk4eDhfdCB2bXVsX3A4KHBvbHk4eDhfdCBfX2EsIHBvbHk4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChwb2x5OHg4X3QpX19idWlsdGluX25lb25fdm11bF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDQpOyB9Ci1fX2FpIHBvbHk4eDE2X3Qgdm11bHFfcDgocG9seTh4MTZfdCBfX2EsIHBvbHk4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2J1aWx0aW5fbmVvbl92bXVscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzYpOyB9Ci0KLSNkZWZpbmUgdm11bF9sYW5lX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gIF9fYSAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYywgX19jLCBfX2MpOyB9KQotI2RlZmluZSB2bXVsX2xhbmVfczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IGludDMyeDJfdCBfX2IgPSAoYik7IFwKLSAgX19hICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jKTsgfSkKLSNkZWZpbmUgdm11bF9sYW5lX2YzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2EgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MpOyB9KQotI2RlZmluZSB2bXVsX2xhbmVfdTE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0X3QgX19hID0gKGEpOyB1aW50MTZ4NF90IF9fYiA9IChiKTsgXAotICBfX2EgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKTsgfSkKLSNkZWZpbmUgdm11bF9sYW5lX3UzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Ml90IF9fYSA9IChhKTsgdWludDMyeDJfdCBfX2IgPSAoYik7IFwKLSAgX19hICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jKTsgfSkKLSNkZWZpbmUgdm11bHFfbGFuZV9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgXAotICBfX2EgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MpOyB9KQotI2RlZmluZSB2bXVscV9sYW5lX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIF9fYSAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYywgX19jLCBfX2MpOyB9KQotI2RlZmluZSB2bXVscV9sYW5lX2YzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDRfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2EgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKTsgfSkKLSNkZWZpbmUgdm11bHFfbGFuZV91MTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IHVpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gIF9fYSAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYyk7IH0pCi0jZGVmaW5lIHZtdWxxX2xhbmVfdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2EgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKTsgfSkKLQotX19haSBpbnQxNng0X3Qgdm11bF9uX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNl90IF9fYikgewotICByZXR1cm4gX19hICogKGludDE2eDRfdCl7IF9fYiwgX19iLCBfX2IsIF9fYiB9OyB9Ci1fX2FpIGludDMyeDJfdCB2bXVsX25fczMyKGludDMyeDJfdCBfX2EsIGludDMyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKiAoaW50MzJ4Ml90KXsgX19iLCBfX2IgfTsgfQotX19haSBmbG9hdDMyeDJfdCB2bXVsX25fZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMl90IF9fYikgewotICByZXR1cm4gX19hICogKGZsb2F0MzJ4Ml90KXsgX19iLCBfX2IgfTsgfQotX19haSB1aW50MTZ4NF90IHZtdWxfbl91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNl90IF9fYikgewotICByZXR1cm4gX19hICogKHVpbnQxNng0X3QpeyBfX2IsIF9fYiwgX19iLCBfX2IgfTsgfQotX19haSB1aW50MzJ4Ml90IHZtdWxfbl91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMl90IF9fYikgewotICByZXR1cm4gX19hICogKHVpbnQzMngyX3QpeyBfX2IsIF9fYiB9OyB9Ci1fX2FpIGludDE2eDhfdCB2bXVscV9uX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNl90IF9fYikgewotICByZXR1cm4gX19hICogKGludDE2eDhfdCl7IF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iIH07IH0KLV9fYWkgaW50MzJ4NF90IHZtdWxxX25fczMyKGludDMyeDRfdCBfX2EsIGludDMyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKiAoaW50MzJ4NF90KXsgX19iLCBfX2IsIF9fYiwgX19iIH07IH0KLV9fYWkgZmxvYXQzMng0X3Qgdm11bHFfbl9mMzIoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKiAoZmxvYXQzMng0X3QpeyBfX2IsIF9fYiwgX19iLCBfX2IgfTsgfQotX19haSB1aW50MTZ4OF90IHZtdWxxX25fdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAqICh1aW50MTZ4OF90KXsgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IgfTsgfQotX19haSB1aW50MzJ4NF90IHZtdWxxX25fdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAqICh1aW50MzJ4NF90KXsgX19iLCBfX2IsIF9fYiwgX19iIH07IH0KLQotX19haSBpbnQ4eDhfdCB2bXZuX3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gIH5fX2E7IH0KLV9fYWkgaW50MTZ4NF90IHZtdm5fczE2KGludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuICB+X19hOyB9Ci1fX2FpIGludDMyeDJfdCB2bXZuX3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAgfl9fYTsgfQotX19haSB1aW50OHg4X3Qgdm12bl91OCh1aW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAgfl9fYTsgfQotX19haSB1aW50MTZ4NF90IHZtdm5fdTE2KHVpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAgfl9fYTsgfQotX19haSB1aW50MzJ4Ml90IHZtdm5fdTMyKHVpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAgfl9fYTsgfQotX19haSBwb2x5OHg4X3Qgdm12bl9wOChwb2x5OHg4X3QgX19hKSB7Ci0gIHJldHVybiAgfl9fYTsgfQotX19haSBpbnQ4eDE2X3Qgdm12bnFfczgoaW50OHgxNl90IF9fYSkgewotICByZXR1cm4gIH5fX2E7IH0KLV9fYWkgaW50MTZ4OF90IHZtdm5xX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAgfl9fYTsgfQotX19haSBpbnQzMng0X3Qgdm12bnFfczMyKGludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICB+X19hOyB9Ci1fX2FpIHVpbnQ4eDE2X3Qgdm12bnFfdTgodWludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICB+X19hOyB9Ci1fX2FpIHVpbnQxNng4X3Qgdm12bnFfdTE2KHVpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAgfl9fYTsgfQotX19haSB1aW50MzJ4NF90IHZtdm5xX3UzMih1aW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gIH5fX2E7IH0KLV9fYWkgcG9seTh4MTZfdCB2bXZucV9wOChwb2x5OHgxNl90IF9fYSkgewotICByZXR1cm4gIH5fX2E7IH0KLQotX19haSBpbnQ4eDhfdCB2bmVnX3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gIC1fX2E7IH0KLV9fYWkgaW50MTZ4NF90IHZuZWdfczE2KGludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuICAtX19hOyB9Ci1fX2FpIGludDMyeDJfdCB2bmVnX3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAgLV9fYTsgfQotX19haSBmbG9hdDMyeDJfdCB2bmVnX2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuICAtX19hOyB9Ci1fX2FpIGludDh4MTZfdCB2bmVncV9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAgLV9fYTsgfQotX19haSBpbnQxNng4X3Qgdm5lZ3FfczE2KGludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuICAtX19hOyB9Ci1fX2FpIGludDMyeDRfdCB2bmVncV9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gIC1fX2E7IH0KLV9fYWkgZmxvYXQzMng0X3Qgdm5lZ3FfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gIC1fX2E7IH0KLQotX19haSBpbnQ4eDhfdCB2b3JuX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCB+X19iOyB9Ci1fX2FpIGludDE2eDRfdCB2b3JuX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCB+X19iOyB9Ci1fX2FpIGludDMyeDJfdCB2b3JuX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCB+X19iOyB9Ci1fX2FpIGludDY0eDFfdCB2b3JuX3M2NChpbnQ2NHgxX3QgX19hLCBpbnQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCB+X19iOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2b3JuX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IH5fX2I7IH0KLV9fYWkgdWludDE2eDRfdCB2b3JuX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IH5fX2I7IH0KLV9fYWkgdWludDMyeDJfdCB2b3JuX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IH5fX2I7IH0KLV9fYWkgdWludDY0eDFfdCB2b3JuX3U2NCh1aW50NjR4MV90IF9fYSwgdWludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IH5fX2I7IH0KLV9fYWkgaW50OHgxNl90IHZvcm5xX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IH5fX2I7IH0KLV9fYWkgaW50MTZ4OF90IHZvcm5xX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCB+X19iOyB9Ci1fX2FpIGludDMyeDRfdCB2b3JucV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hIHwgfl9fYjsgfQotX19haSBpbnQ2NHgyX3Qgdm9ybnFfczY0KGludDY0eDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IH5fX2I7IH0KLV9fYWkgdWludDh4MTZfdCB2b3JucV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IH5fX2I7IH0KLV9fYWkgdWludDE2eDhfdCB2b3JucV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCB+X19iOyB9Ci1fX2FpIHVpbnQzMng0X3Qgdm9ybnFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hIHwgfl9fYjsgfQotX19haSB1aW50NjR4Ml90IHZvcm5xX3U2NCh1aW50NjR4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IH5fX2I7IH0KLQotX19haSBpbnQ4eDhfdCB2b3JyX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCBfX2I7IH0KLV9fYWkgaW50MTZ4NF90IHZvcnJfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IF9fYjsgfQotX19haSBpbnQzMngyX3Qgdm9ycl9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gX19hIHwgX19iOyB9Ci1fX2FpIGludDY0eDFfdCB2b3JyX3M2NChpbnQ2NHgxX3QgX19hLCBpbnQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCBfX2I7IH0KLV9fYWkgdWludDh4OF90IHZvcnJfdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gX19hIHwgX19iOyB9Ci1fX2FpIHVpbnQxNng0X3Qgdm9ycl91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCBfX2I7IH0KLV9fYWkgdWludDMyeDJfdCB2b3JyX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IF9fYjsgfQotX19haSB1aW50NjR4MV90IHZvcnJfdTY0KHVpbnQ2NHgxX3QgX19hLCB1aW50NjR4MV90IF9fYikgewotICByZXR1cm4gX19hIHwgX19iOyB9Ci1fX2FpIGludDh4MTZfdCB2b3JycV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCBfX2I7IH0KLV9fYWkgaW50MTZ4OF90IHZvcnJxX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCBfX2I7IH0KLV9fYWkgaW50MzJ4NF90IHZvcnJxX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCBfX2I7IH0KLV9fYWkgaW50NjR4Ml90IHZvcnJxX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgfCBfX2I7IH0KLV9fYWkgdWludDh4MTZfdCB2b3JycV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IF9fYjsgfQotX19haSB1aW50MTZ4OF90IHZvcnJxX3UxNih1aW50MTZ4OF90IF9fYSwgdWludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IF9fYjsgfQotX19haSB1aW50MzJ4NF90IHZvcnJxX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IF9fYjsgfQotX19haSB1aW50NjR4Ml90IHZvcnJxX3U2NCh1aW50NjR4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSB8IF9fYjsgfQotCi1fX2FpIGludDE2eDRfdCB2cGFkYWxfczgoaW50MTZ4NF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwYWRhbF92KChpbnQ4eDhfdClfX2EsIF9fYiwgMSk7IH0KLV9fYWkgaW50MzJ4Ml90IHZwYWRhbF9zMTYoaW50MzJ4Ml90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cGFkYWxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAyKTsgfQotX19haSBpbnQ2NHgxX3QgdnBhZGFsX3MzMihpbnQ2NHgxX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZwYWRhbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDMpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdnBhZGFsX3U4KHVpbnQxNng0X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cGFkYWxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2cGFkYWxfdTE2KHVpbnQzMngyX3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnBhZGFsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTgpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdnBhZGFsX3UzMih1aW50NjR4MV90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZwYWRhbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE5KTsgfQotX19haSBpbnQxNng4X3QgdnBhZGFscV9zOChpbnQxNng4X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZwYWRhbHFfdigoaW50OHgxNl90KV9fYSwgX19iLCAzMyk7IH0KLV9fYWkgaW50MzJ4NF90IHZwYWRhbHFfczE2KGludDMyeDRfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdnBhZGFscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzQpOyB9Ci1fX2FpIGludDY0eDJfdCB2cGFkYWxxX3MzMihpbnQ2NHgyX3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZwYWRhbHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM1KTsgfQotX19haSB1aW50MTZ4OF90IHZwYWRhbHFfdTgodWludDE2eDhfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92cGFkYWxxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2cGFkYWxxX3UxNih1aW50MzJ4NF90IF9fYSwgdWludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwYWRhbHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUwKTsgfQotX19haSB1aW50NjR4Ml90IHZwYWRhbHFfdTMyKHVpbnQ2NHgyX3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnBhZGFscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTEpOyB9Ci0KLV9fYWkgaW50OHg4X3QgdnBhZGRfczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cGFkZF92KF9fYSwgX19iLCAwKTsgfQotX19haSBpbnQxNng0X3QgdnBhZGRfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdnBhZGRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxKTsgfQotX19haSBpbnQzMngyX3QgdnBhZGRfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnBhZGRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAyKTsgfQotX19haSB1aW50OHg4X3QgdnBhZGRfdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cGFkZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZwYWRkX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdnBhZGRfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnBhZGRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOCk7IH0KLV9fYWkgZmxvYXQzMngyX3QgdnBhZGRfZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdnBhZGRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA4KTsgfQotCi1fX2FpIGludDE2eDRfdCB2cGFkZGxfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkbF92KF9fYSwgMSk7IH0KLV9fYWkgaW50MzJ4Ml90IHZwYWRkbF9zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cGFkZGxfdigoaW50OHg4X3QpX19hLCAyKTsgfQotX19haSBpbnQ2NHgxX3QgdnBhZGRsX3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkbF92KChpbnQ4eDhfdClfX2EsIDMpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdnBhZGRsX3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkbF92KChpbnQ4eDhfdClfX2EsIDE3KTsgfQotX19haSB1aW50MzJ4Ml90IHZwYWRkbF91MTYodWludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkbF92KChpbnQ4eDhfdClfX2EsIDE4KTsgfQotX19haSB1aW50NjR4MV90IHZwYWRkbF91MzIodWludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkbF92KChpbnQ4eDhfdClfX2EsIDE5KTsgfQotX19haSBpbnQxNng4X3QgdnBhZGRscV9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkbHFfdihfX2EsIDMzKTsgfQotX19haSBpbnQzMng0X3QgdnBhZGRscV9zMTYoaW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cGFkZGxxX3YoKGludDh4MTZfdClfX2EsIDM0KTsgfQotX19haSBpbnQ2NHgyX3QgdnBhZGRscV9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92cGFkZGxxX3YoKGludDh4MTZfdClfX2EsIDM1KTsgfQotX19haSB1aW50MTZ4OF90IHZwYWRkbHFfdTgodWludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkbHFfdigoaW50OHgxNl90KV9fYSwgNDkpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnBhZGRscV91MTYodWludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkbHFfdigoaW50OHgxNl90KV9fYSwgNTApOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnBhZGRscV91MzIodWludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkbHFfdigoaW50OHgxNl90KV9fYSwgNTEpOyB9Ci0KLV9fYWkgaW50OHg4X3QgdnBtYXhfczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cG1heF92KF9fYSwgX19iLCAwKTsgfQotX19haSBpbnQxNng0X3QgdnBtYXhfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdnBtYXhfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxKTsgfQotX19haSBpbnQzMngyX3QgdnBtYXhfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnBtYXhfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAyKTsgfQotX19haSB1aW50OHg4X3QgdnBtYXhfdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cG1heF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZwbWF4X3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwbWF4X3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdnBtYXhfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnBtYXhfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOCk7IH0KLV9fYWkgZmxvYXQzMngyX3QgdnBtYXhfZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdnBtYXhfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA4KTsgfQotCi1fX2FpIGludDh4OF90IHZwbWluX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnBtaW5fdihfX2EsIF9fYiwgMCk7IH0KLV9fYWkgaW50MTZ4NF90IHZwbWluX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwbWluX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMSk7IH0KLV9fYWkgaW50MzJ4Ml90IHZwbWluX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZwbWluX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMik7IH0KLV9fYWkgdWludDh4OF90IHZwbWluX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnBtaW5fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2cG1pbl91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cG1pbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE3KTsgfQotX19haSB1aW50MzJ4Ml90IHZwbWluX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZwbWluX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTgpOyB9Ci1fX2FpIGZsb2F0MzJ4Ml90IHZwbWluX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZwbWluX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgOCk7IH0KLQotX19haSBpbnQ4eDhfdCB2cWFic19zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cWFic192KF9fYSwgMCk7IH0KLV9fYWkgaW50MTZ4NF90IHZxYWJzX3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZxYWJzX3YoKGludDh4OF90KV9fYSwgMSk7IH0KLV9fYWkgaW50MzJ4Ml90IHZxYWJzX3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZxYWJzX3YoKGludDh4OF90KV9fYSwgMik7IH0KLV9fYWkgaW50OHgxNl90IHZxYWJzcV9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZxYWJzcV92KF9fYSwgMzIpOyB9Ci1fX2FpIGludDE2eDhfdCB2cWFic3FfczE2KGludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdnFhYnNxX3YoKGludDh4MTZfdClfX2EsIDMzKTsgfQotX19haSBpbnQzMng0X3QgdnFhYnNxX3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZxYWJzcV92KChpbnQ4eDE2X3QpX19hLCAzNCk7IH0KLQotX19haSBpbnQ4eDhfdCB2cWFkZF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxYWRkX3YoX19hLCBfX2IsIDApOyB9Ci1fX2FpIGludDE2eDRfdCB2cWFkZF9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cWFkZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2cWFkZF9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cWFkZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDIpOyB9Ci1fX2FpIGludDY0eDFfdCB2cWFkZF9zNjQoaW50NjR4MV90IF9fYSwgaW50NjR4MV90IF9fYikgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cWFkZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDMpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cWFkZF91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxYWRkX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTYpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdnFhZGRfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdnFhZGRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2cWFkZF91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cWFkZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE4KTsgfQotX19haSB1aW50NjR4MV90IHZxYWRkX3U2NCh1aW50NjR4MV90IF9fYSwgdWludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZxYWRkX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTkpOyB9Ci1fX2FpIGludDh4MTZfdCB2cWFkZHFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cWFkZHFfdihfX2EsIF9fYiwgMzIpOyB9Ci1fX2FpIGludDE2eDhfdCB2cWFkZHFfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdnFhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzMyk7IH0KLV9fYWkgaW50MzJ4NF90IHZxYWRkcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cWFkZHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM0KTsgfQotX19haSBpbnQ2NHgyX3QgdnFhZGRxX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZxYWRkcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzUpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnFhZGRxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnFhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2cWFkZHFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnFhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2cWFkZHFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnFhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MCk7IH0KLV9fYWkgdWludDY0eDJfdCB2cWFkZHFfdTY0KHVpbnQ2NHgyX3QgX19hLCB1aW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnFhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MSk7IH0KLQotX19haSBpbnQzMng0X3QgdnFkbWxhbF9zMTYoaW50MzJ4NF90IF9fYSwgaW50MTZ4NF90IF9fYiwgaW50MTZ4NF90IF9fYykgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cWRtbGFsX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDM0KTsgfQotX19haSBpbnQ2NHgyX3QgdnFkbWxhbF9zMzIoaW50NjR4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYiwgaW50MzJ4Ml90IF9fYykgewotICByZXR1cm4gKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92cWRtbGFsX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDM1KTsgfQotCi0jZGVmaW5lIHZxZG1sYWxfbGFuZV9zMTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgaW50MTZ4NF90IF9fYyA9IChjKTsgXAotICB2cWRtbGFsX3MxNihfX2EsIF9fYiwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2cWRtbGFsX2xhbmVfczMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IGludDMyeDJfdCBfX2IgPSAoYik7IGludDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgdnFkbWxhbF9zMzIoX19hLCBfX2IsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotCi1fX2FpIGludDMyeDRfdCB2cWRtbGFsX25fczE2KGludDMyeDRfdCBfX2EsIGludDE2eDRfdCBfX2IsIGludDE2X3QgX19jKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxfdigoaW50OHgxNl90KV9fYSwgKGludDh4OF90KV9fYiwgKGludDh4OF90KShpbnQxNng0X3QpeyBfX2MsIF9fYywgX19jLCBfX2MgfSwgMzQpOyB9Ci1fX2FpIGludDY0eDJfdCB2cWRtbGFsX25fczMyKGludDY0eDJfdCBfX2EsIGludDMyeDJfdCBfX2IsIGludDMyX3QgX19jKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxfdigoaW50OHgxNl90KV9fYSwgKGludDh4OF90KV9fYiwgKGludDh4OF90KShpbnQzMngyX3QpeyBfX2MsIF9fYyB9LCAzNSk7IH0KLQotX19haSBpbnQzMng0X3QgdnFkbWxzbF9zMTYoaW50MzJ4NF90IF9fYSwgaW50MTZ4NF90IF9fYiwgaW50MTZ4NF90IF9fYykgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cWRtbHNsX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDM0KTsgfQotX19haSBpbnQ2NHgyX3QgdnFkbWxzbF9zMzIoaW50NjR4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYiwgaW50MzJ4Ml90IF9fYykgewotICByZXR1cm4gKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92cWRtbHNsX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDM1KTsgfQotCi0jZGVmaW5lIHZxZG1sc2xfbGFuZV9zMTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgaW50MTZ4NF90IF9fYyA9IChjKTsgXAotICB2cWRtbHNsX3MxNihfX2EsIF9fYiwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2cWRtbHNsX2xhbmVfczMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IGludDMyeDJfdCBfX2IgPSAoYik7IGludDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgdnFkbWxzbF9zMzIoX19hLCBfX2IsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotCi1fX2FpIGludDMyeDRfdCB2cWRtbHNsX25fczE2KGludDMyeDRfdCBfX2EsIGludDE2eDRfdCBfX2IsIGludDE2X3QgX19jKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xfdigoaW50OHgxNl90KV9fYSwgKGludDh4OF90KV9fYiwgKGludDh4OF90KShpbnQxNng0X3QpeyBfX2MsIF9fYywgX19jLCBfX2MgfSwgMzQpOyB9Ci1fX2FpIGludDY0eDJfdCB2cWRtbHNsX25fczMyKGludDY0eDJfdCBfX2EsIGludDMyeDJfdCBfX2IsIGludDMyX3QgX19jKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xfdigoaW50OHgxNl90KV9fYSwgKGludDh4OF90KV9fYiwgKGludDh4OF90KShpbnQzMngyX3QpeyBfX2MsIF9fYyB9LCAzNSk7IH0KLQotX19haSBpbnQxNng0X3QgdnFkbXVsaF9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cWRtdWxoX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMSk7IH0KLV9fYWkgaW50MzJ4Ml90IHZxZG11bGhfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnFkbXVsaF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDIpOyB9Ci1fX2FpIGludDE2eDhfdCB2cWRtdWxocV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92cWRtdWxocV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzMpOyB9Ci1fX2FpIGludDMyeDRfdCB2cWRtdWxocV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cWRtdWxocV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzQpOyB9Ci0KLSNkZWZpbmUgdnFkbXVsaF9sYW5lX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGhfczE2KF9fYSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jLCBfX2MsIF9fYykpOyB9KQotI2RlZmluZSB2cWRtdWxoX2xhbmVfczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IGludDMyeDJfdCBfX2IgPSAoYik7IFwKLSAgdnFkbXVsaF9zMzIoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFkbXVsaHFfbGFuZV9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgXAotICB2cWRtdWxocV9zMTYoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFkbXVsaHFfbGFuZV9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICB2cWRtdWxocV9zMzIoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0KLV9fYWkgaW50MTZ4NF90IHZxZG11bGhfbl9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdnFkbXVsaF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdCkoaW50MTZ4NF90KXsgX19iLCBfX2IsIF9fYiwgX19iIH0sIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2cWRtdWxoX25fczMyKGludDMyeDJfdCBfX2EsIGludDMyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZxZG11bGhfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpKGludDMyeDJfdCl7IF9fYiwgX19iIH0sIDIpOyB9Ci1fX2FpIGludDE2eDhfdCB2cWRtdWxocV9uX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNl90IF9fYikgewotICByZXR1cm4gKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92cWRtdWxocV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KShpbnQxNng4X3QpeyBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiB9LCAzMyk7IH0KLV9fYWkgaW50MzJ4NF90IHZxZG11bGhxX25fczMyKGludDMyeDRfdCBfX2EsIGludDMyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZxZG11bGhxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpKGludDMyeDRfdCl7IF9fYiwgX19iLCBfX2IsIF9fYiB9LCAzNCk7IH0KLQotX19haSBpbnQzMng0X3QgdnFkbXVsbF9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cWRtdWxsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMzQpOyB9Ci1fX2FpIGludDY0eDJfdCB2cWRtdWxsX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZxZG11bGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAzNSk7IH0KLQotI2RlZmluZSB2cWRtdWxsX2xhbmVfczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IGludDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgdnFkbXVsbF9zMTYoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0jZGVmaW5lIHZxZG11bGxfbGFuZV9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Ml90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICB2cWRtdWxsX3MzMihfX2EsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYykpOyB9KQotCi1fX2FpIGludDMyeDRfdCB2cWRtdWxsX25fczE2KGludDE2eDRfdCBfX2EsIGludDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZxZG11bGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpKGludDE2eDRfdCl7IF9fYiwgX19iLCBfX2IsIF9fYiB9LCAzNCk7IH0KLV9fYWkgaW50NjR4Ml90IHZxZG11bGxfbl9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnFkbXVsbF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdCkoaW50MzJ4Ml90KXsgX19iLCBfX2IgfSwgMzUpOyB9Ci0KLV9fYWkgaW50OHg4X3QgdnFtb3ZuX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnFtb3ZuX3YoKGludDh4MTZfdClfX2EsIDApOyB9Ci1fX2FpIGludDE2eDRfdCB2cW1vdm5fczMyKGludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdnFtb3ZuX3YoKGludDh4MTZfdClfX2EsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2cW1vdm5fczY0KGludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnFtb3ZuX3YoKGludDh4MTZfdClfX2EsIDIpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cW1vdm5fdTE2KHVpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxbW92bl92KChpbnQ4eDE2X3QpX19hLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2cW1vdm5fdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cW1vdm5fdigoaW50OHgxNl90KV9fYSwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdnFtb3ZuX3U2NCh1aW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnFtb3ZuX3YoKGludDh4MTZfdClfX2EsIDE4KTsgfQotCi1fX2FpIHVpbnQ4eDhfdCB2cW1vdnVuX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxbW92dW5fdigoaW50OHgxNl90KV9fYSwgMTYpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdnFtb3Z1bl9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdnFtb3Z1bl92KChpbnQ4eDE2X3QpX19hLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2cW1vdnVuX3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cW1vdnVuX3YoKGludDh4MTZfdClfX2EsIDE4KTsgfQotCi1fX2FpIGludDh4OF90IHZxbmVnX3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxbmVnX3YoX19hLCAwKTsgfQotX19haSBpbnQxNng0X3QgdnFuZWdfczE2KGludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdnFuZWdfdigoaW50OHg4X3QpX19hLCAxKTsgfQotX19haSBpbnQzMngyX3QgdnFuZWdfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnFuZWdfdigoaW50OHg4X3QpX19hLCAyKTsgfQotX19haSBpbnQ4eDE2X3QgdnFuZWdxX3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnFuZWdxX3YoX19hLCAzMik7IH0KLV9fYWkgaW50MTZ4OF90IHZxbmVncV9zMTYoaW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92cW5lZ3FfdigoaW50OHgxNl90KV9fYSwgMzMpOyB9Ci1fX2FpIGludDMyeDRfdCB2cW5lZ3FfczMyKGludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdnFuZWdxX3YoKGludDh4MTZfdClfX2EsIDM0KTsgfQotCi1fX2FpIGludDE2eDRfdCB2cXJkbXVsaF9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cXJkbXVsaF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2cXJkbXVsaF9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cXJkbXVsaF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDIpOyB9Ci1fX2FpIGludDE2eDhfdCB2cXJkbXVsaHFfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdnFyZG11bGhxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzMyk7IH0KLV9fYWkgaW50MzJ4NF90IHZxcmRtdWxocV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cXJkbXVsaHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM0KTsgfQotCi0jZGVmaW5lIHZxcmRtdWxoX2xhbmVfczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IGludDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgdnFyZG11bGhfczE2KF9fYSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jLCBfX2MsIF9fYykpOyB9KQotI2RlZmluZSB2cXJkbXVsaF9sYW5lX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIHZxcmRtdWxoX3MzMihfX2EsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYykpOyB9KQotI2RlZmluZSB2cXJkbXVsaHFfbGFuZV9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgXAotICB2cXJkbXVsaHFfczE2KF9fYSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0jZGVmaW5lIHZxcmRtdWxocV9sYW5lX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIHZxcmRtdWxocV9zMzIoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0KLV9fYWkgaW50MTZ4NF90IHZxcmRtdWxoX25fczE2KGludDE2eDRfdCBfX2EsIGludDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZxcmRtdWxoX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KShpbnQxNng0X3QpeyBfX2IsIF9fYiwgX19iLCBfX2IgfSwgMSk7IH0KLV9fYWkgaW50MzJ4Ml90IHZxcmRtdWxoX25fczMyKGludDMyeDJfdCBfX2EsIGludDMyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZxcmRtdWxoX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KShpbnQzMngyX3QpeyBfX2IsIF9fYiB9LCAyKTsgfQotX19haSBpbnQxNng4X3QgdnFyZG11bGhxX25fczE2KGludDE2eDhfdCBfX2EsIGludDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZxcmRtdWxocV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KShpbnQxNng4X3QpeyBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiB9LCAzMyk7IH0KLV9fYWkgaW50MzJ4NF90IHZxcmRtdWxocV9uX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMl90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cXJkbXVsaHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdCkoaW50MzJ4NF90KXsgX19iLCBfX2IsIF9fYiwgX19iIH0sIDM0KTsgfQotCi1fX2FpIGludDh4OF90IHZxcnNobF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxcnNobF92KF9fYSwgX19iLCAwKTsgfQotX19haSBpbnQxNng0X3QgdnFyc2hsX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZxcnNobF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2cXJzaGxfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnFyc2hsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMik7IH0KLV9fYWkgaW50NjR4MV90IHZxcnNobF9zNjQoaW50NjR4MV90IF9fYSwgaW50NjR4MV90IF9fYikgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cXJzaGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAzKTsgfQotX19haSB1aW50OHg4X3QgdnFyc2hsX3U4KHVpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cXJzaGxfdigoaW50OHg4X3QpX19hLCBfX2IsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZxcnNobF91MTYodWludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZxcnNobF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE3KTsgfQotX19haSB1aW50MzJ4Ml90IHZxcnNobF91MzIodWludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZxcnNobF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE4KTsgfQotX19haSB1aW50NjR4MV90IHZxcnNobF91NjQodWludDY0eDFfdCBfX2EsIGludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZxcnNobF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE5KTsgfQotX19haSBpbnQ4eDE2X3QgdnFyc2hscV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZxcnNobHFfdihfX2EsIF9fYiwgMzIpOyB9Ci1fX2FpIGludDE2eDhfdCB2cXJzaGxxX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZxcnNobHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDMzKTsgfQotX19haSBpbnQzMng0X3QgdnFyc2hscV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cXJzaGxxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzNCk7IH0KLV9fYWkgaW50NjR4Ml90IHZxcnNobHFfczY0KGludDY0eDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnFyc2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzUpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnFyc2hscV91OCh1aW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnFyc2hscV92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDQ4KTsgfQotX19haSB1aW50MTZ4OF90IHZxcnNobHFfdTE2KHVpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92cXJzaGxxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2cXJzaGxxX3UzMih1aW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnFyc2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTApOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnFyc2hscV91NjQodWludDY0eDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZxcnNobHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUxKTsgfQotCi0jZGVmaW5lIHZxcnNocm5fbl9zMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYSA9IChhKTsgXAotICAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnFyc2hybl9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMCk7IH0pCi0jZGVmaW5lIHZxcnNocm5fbl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5fbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDEpOyB9KQotI2RlZmluZSB2cXJzaHJuX25fczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cXJzaHJuX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAyKTsgfSkKLSNkZWZpbmUgdnFyc2hybl9uX3UxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OF90IF9fYSA9IChhKTsgXAotICAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5fbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDE2KTsgfSkKLSNkZWZpbmUgdnFyc2hybl9uX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cXJzaHJuX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAxNyk7IH0pCi0jZGVmaW5lIHZxcnNocm5fbl91NjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnFyc2hybl9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMTgpOyB9KQotCi0jZGVmaW5lIHZxcnNocnVuX25fczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bl9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMTYpOyB9KQotI2RlZmluZSB2cXJzaHJ1bl9uX3MzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBcCi0gICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZxcnNocnVuX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAxNyk7IH0pCi0jZGVmaW5lIHZxcnNocnVuX25fczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnFyc2hydW5fbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDE4KTsgfSkKLQotX19haSBpbnQ4eDhfdCB2cXNobF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hsX3YoX19hLCBfX2IsIDApOyB9Ci1fX2FpIGludDE2eDRfdCB2cXNobF9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cXNobF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2cXNobF9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cXNobF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDIpOyB9Ci1fX2FpIGludDY0eDFfdCB2cXNobF9zNjQoaW50NjR4MV90IF9fYSwgaW50NjR4MV90IF9fYikgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cXNobF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDMpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cXNobF91OCh1aW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnFzaGxfdigoaW50OHg4X3QpX19hLCBfX2IsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZxc2hsX3UxNih1aW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdnFzaGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2cXNobF91MzIodWludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3Zxc2hsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTgpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdnFzaGxfdTY0KHVpbnQ2NHgxX3QgX19hLCBpbnQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cXNobF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE5KTsgfQotX19haSBpbnQ4eDE2X3QgdnFzaGxxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnFzaGxxX3YoX19hLCBfX2IsIDMyKTsgfQotX19haSBpbnQxNng4X3QgdnFzaGxxX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzMpOyB9Ci1fX2FpIGludDMyeDRfdCB2cXNobHFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdnFzaGxxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzNCk7IH0KLV9fYWkgaW50NjR4Ml90IHZxc2hscV9zNjQoaW50NjR4Ml90IF9fYSwgaW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92cXNobHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM1KTsgfQotX19haSB1aW50OHgxNl90IHZxc2hscV91OCh1aW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnFzaGxxX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNDgpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdnFzaGxxX3UxNih1aW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnFzaGxxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2cXNobHFfdTMyKHVpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cXNobHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUwKTsgfQotX19haSB1aW50NjR4Ml90IHZxc2hscV91NjQodWludDY0eDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3Zxc2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTEpOyB9Ci0KLSNkZWZpbmUgdnFzaGx1X25fczgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19hID0gKGEpOyBcCi0gICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnFzaGx1X25fdihfX2EsIF9fYiwgMTYpOyB9KQotI2RlZmluZSB2cXNobHVfbl9zMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NF90IF9fYSA9IChhKTsgXAotICAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cXNobHVfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgMTcpOyB9KQotI2RlZmluZSB2cXNobHVfbl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Ml90IF9fYSA9IChhKTsgXAotICAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cXNobHVfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgMTgpOyB9KQotI2RlZmluZSB2cXNobHVfbl9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MV90IF9fYSA9IChhKTsgXAotICAodWludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cXNobHVfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgMTkpOyB9KQotI2RlZmluZSB2cXNobHVxX25fczgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNl90IF9fYSA9IChhKTsgXAotICAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cXNobHVxX25fdihfX2EsIF9fYiwgNDgpOyB9KQotI2RlZmluZSB2cXNobHVxX25fczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnFzaGx1cV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNDkpOyB9KQotI2RlZmluZSB2cXNobHVxX25fczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnFzaGx1cV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNTApOyB9KQotI2RlZmluZSB2cXNobHVxX25fczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnFzaGx1cV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNTEpOyB9KQotCi0jZGVmaW5lIHZxc2hsX25fczgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19hID0gKGEpOyBcCi0gIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cXNobF9uX3YoX19hLCBfX2IsIDApOyB9KQotI2RlZmluZSB2cXNobF9uX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBcCi0gIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdnFzaGxfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgMSk7IH0pCi0jZGVmaW5lIHZxc2hsX25fczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IFwKLSAgKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cXNobF9uX3YoKGludDh4OF90KV9fYSwgX19iLCAyKTsgfSkKLSNkZWZpbmUgdnFzaGxfbl9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MV90IF9fYSA9IChhKTsgXAotICAoaW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3Zxc2hsX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDMpOyB9KQotI2RlZmluZSB2cXNobF9uX3U4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cXNobF9uX3YoKGludDh4OF90KV9fYSwgX19iLCAxNik7IH0pCi0jZGVmaW5lIHZxc2hsX25fdTE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0X3QgX19hID0gKGEpOyBcCi0gICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hsX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDE3KTsgfSkKLSNkZWZpbmUgdnFzaGxfbl91MzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnFzaGxfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgMTgpOyB9KQotI2RlZmluZSB2cXNobF9uX3U2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4MV90IF9fYSA9IChhKTsgXAotICAodWludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cXNobF9uX3YoKGludDh4OF90KV9fYSwgX19iLCAxOSk7IH0pCi0jZGVmaW5lIHZxc2hscV9uX3M4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4MTZfdCBfX2EgPSAoYSk7IFwKLSAgKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cXNobHFfbl92KF9fYSwgX19iLCAzMik7IH0pCi0jZGVmaW5lIHZxc2hscV9uX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hID0gKGEpOyBcCi0gIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdnFzaGxxX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAzMyk7IH0pCi0jZGVmaW5lIHZxc2hscV9uX3MzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBcCi0gIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdnFzaGxxX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAzNCk7IH0pCi0jZGVmaW5lIHZxc2hscV9uX3M2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnFzaGxxX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAzNSk7IH0pCi0jZGVmaW5lIHZxc2hscV9uX3U4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2X3QgX19hID0gKGEpOyBcCi0gICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3Zxc2hscV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNDgpOyB9KQotI2RlZmluZSB2cXNobHFfbl91MTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnFzaGxxX25fdigoaW50OHgxNl90KV9fYSwgX19iLCA0OSk7IH0pCi0jZGVmaW5lIHZxc2hscV9uX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cXNobHFfbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDUwKTsgfSkKLSNkZWZpbmUgdnFzaGxxX25fdTY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3Zxc2hscV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNTEpOyB9KQotCi0jZGVmaW5lIHZxc2hybl9uX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hID0gKGEpOyBcCi0gIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cXNocm5fbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDApOyB9KQotI2RlZmluZSB2cXNocm5fbl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hybl9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMSk7IH0pCi0jZGVmaW5lIHZxc2hybl9uX3M2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnFzaHJuX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAyKTsgfSkKLSNkZWZpbmUgdnFzaHJuX25fdTE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4X3QgX19hID0gKGEpOyBcCi0gICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnFzaHJuX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAxNik7IH0pCi0jZGVmaW5lIHZxc2hybl9uX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cXNocm5fbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDE3KTsgfSkKLSNkZWZpbmUgdnFzaHJuX25fdTY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3Zxc2hybl9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMTgpOyB9KQotCi0jZGVmaW5lIHZxc2hydW5fbl9zMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYSA9IChhKTsgXAotICAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hydW5fbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDE2KTsgfSkKLSNkZWZpbmUgdnFzaHJ1bl9uX3MzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBcCi0gICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hydW5fbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDE3KTsgfSkKLSNkZWZpbmUgdnFzaHJ1bl9uX3M2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3Zxc2hydW5fbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDE4KTsgfSkKLQotX19haSBpbnQ4eDhfdCB2cXN1Yl9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Zxc3ViX3YoX19hLCBfX2IsIDApOyB9Ci1fX2FpIGludDE2eDRfdCB2cXN1Yl9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cXN1Yl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2cXN1Yl9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cXN1Yl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDIpOyB9Ci1fX2FpIGludDY0eDFfdCB2cXN1Yl9zNjQoaW50NjR4MV90IF9fYSwgaW50NjR4MV90IF9fYikgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cXN1Yl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDMpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cXN1Yl91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Zxc3ViX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTYpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdnFzdWJfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdnFzdWJfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2cXN1Yl91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cXN1Yl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE4KTsgfQotX19haSB1aW50NjR4MV90IHZxc3ViX3U2NCh1aW50NjR4MV90IF9fYSwgdWludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3Zxc3ViX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTkpOyB9Ci1fX2FpIGludDh4MTZfdCB2cXN1YnFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cXN1YnFfdihfX2EsIF9fYiwgMzIpOyB9Ci1fX2FpIGludDE2eDhfdCB2cXN1YnFfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdnFzdWJxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzMyk7IH0KLV9fYWkgaW50MzJ4NF90IHZxc3VicV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cXN1YnFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM0KTsgfQotX19haSBpbnQ2NHgyX3QgdnFzdWJxX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3Zxc3VicV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzUpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnFzdWJxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnFzdWJxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2cXN1YnFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnFzdWJxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2cXN1YnFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnFzdWJxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MCk7IH0KLV9fYWkgdWludDY0eDJfdCB2cXN1YnFfdTY0KHVpbnQ2NHgyX3QgX19hLCB1aW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnFzdWJxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MSk7IH0KLQotX19haSBpbnQ4eDhfdCB2cmFkZGhuX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnJhZGRobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMCk7IH0KLV9fYWkgaW50MTZ4NF90IHZyYWRkaG5fczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdnJhZGRobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMSk7IH0KLV9fYWkgaW50MzJ4Ml90IHZyYWRkaG5fczY0KGludDY0eDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnJhZGRobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMik7IH0KLV9fYWkgdWludDh4OF90IHZyYWRkaG5fdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cmFkZGhuX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2cmFkZGhuX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZyYWRkaG5fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDE3KTsgfQotX19haSB1aW50MzJ4Ml90IHZyYWRkaG5fdTY0KHVpbnQ2NHgyX3QgX19hLCB1aW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnJhZGRobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMTgpOyB9Ci0KLV9fYWkgZmxvYXQzMngyX3QgdnJlY3BlX2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cmVjcGVfdigoaW50OHg4X3QpX19hLCA4KTsgfQotX19haSB1aW50MzJ4Ml90IHZyZWNwZV91MzIodWludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZyZWNwZV92KChpbnQ4eDhfdClfX2EsIDE4KTsgfQotX19haSBmbG9hdDMyeDRfdCB2cmVjcGVxX2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cmVjcGVxX3YoKGludDh4MTZfdClfX2EsIDQwKTsgfQotX19haSB1aW50MzJ4NF90IHZyZWNwZXFfdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cmVjcGVxX3YoKGludDh4MTZfdClfX2EsIDUwKTsgfQotCi1fX2FpIGZsb2F0MzJ4Ml90IHZyZWNwc19mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cmVjcHNfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA4KTsgfQotX19haSBmbG9hdDMyeDRfdCB2cmVjcHNxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZyZWNwc3FfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQwKTsgfQotCi1fX2FpIGludDh4OF90IHZyZWludGVycHJldF9zOF9zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDh4OF90KV9fYTsgfQotX19haSBpbnQ4eDhfdCB2cmVpbnRlcnByZXRfczhfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2E7IH0KLV9fYWkgaW50OHg4X3QgdnJlaW50ZXJwcmV0X3M4X3M2NChpbnQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19hOyB9Ci1fX2FpIGludDh4OF90IHZyZWludGVycHJldF9zOF91OCh1aW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19hOyB9Ci1fX2FpIGludDh4OF90IHZyZWludGVycHJldF9zOF91MTYodWludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2E7IH0KLV9fYWkgaW50OHg4X3QgdnJlaW50ZXJwcmV0X3M4X3UzMih1aW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGludDh4OF90KV9fYTsgfQotX19haSBpbnQ4eDhfdCB2cmVpbnRlcnByZXRfczhfdTY0KHVpbnQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19hOyB9Ci1fX2FpIGludDh4OF90IHZyZWludGVycHJldF9zOF9mMTYoZmxvYXQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19hOyB9Ci1fX2FpIGludDh4OF90IHZyZWludGVycHJldF9zOF9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19hOyB9Ci1fX2FpIGludDh4OF90IHZyZWludGVycHJldF9zOF9wOChwb2x5OHg4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19hOyB9Ci1fX2FpIGludDh4OF90IHZyZWludGVycHJldF9zOF9wMTYocG9seTE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2E7IH0KLV9fYWkgaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYTsgfQotX19haSBpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3MxNl9zMzIoaW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGludDE2eDRfdClfX2E7IH0KLV9fYWkgaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfczY0KGludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19hOyB9Ci1fX2FpIGludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19hOyB9Ci1fX2FpIGludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X3UxNih1aW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDE2eDRfdClfX2E7IH0KLV9fYWkgaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfdTMyKHVpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYTsgfQotX19haSBpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3MxNl91NjQodWludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19hOyB9Ci1fX2FpIGludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X2YxNihmbG9hdDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19hOyB9Ci1fX2FpIGludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19hOyB9Ci1fX2FpIGludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X3A4KHBvbHk4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19hOyB9Ci1fX2FpIGludDE2eDRfdCB2cmVpbnRlcnByZXRfczE2X3AxNihwb2x5MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDE2eDRfdClfX2E7IH0KLV9fYWkgaW50MzJ4Ml90IHZyZWludGVycHJldF9zMzJfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYTsgfQotX19haSBpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3MzMl9zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDJfdClfX2E7IH0KLV9fYWkgaW50MzJ4Ml90IHZyZWludGVycHJldF9zMzJfczY0KGludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19hOyB9Ci1fX2FpIGludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19hOyB9Ci1fX2FpIGludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX3UxNih1aW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDJfdClfX2E7IH0KLV9fYWkgaW50MzJ4Ml90IHZyZWludGVycHJldF9zMzJfdTMyKHVpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYTsgfQotX19haSBpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3MzMl91NjQodWludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19hOyB9Ci1fX2FpIGludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX2YxNihmbG9hdDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19hOyB9Ci1fX2FpIGludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19hOyB9Ci1fX2FpIGludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX3A4KHBvbHk4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19hOyB9Ci1fX2FpIGludDMyeDJfdCB2cmVpbnRlcnByZXRfczMyX3AxNihwb2x5MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDJfdClfX2E7IH0KLV9fYWkgaW50NjR4MV90IHZyZWludGVycHJldF9zNjRfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4MV90KV9fYTsgfQotX19haSBpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3M2NF9zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2E7IH0KLV9fYWkgaW50NjR4MV90IHZyZWludGVycHJldF9zNjRfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgxX3QpX19hOyB9Ci1fX2FpIGludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgxX3QpX19hOyB9Ci1fX2FpIGludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3UxNih1aW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2E7IH0KLV9fYWkgaW50NjR4MV90IHZyZWludGVycHJldF9zNjRfdTMyKHVpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4MV90KV9fYTsgfQotX19haSBpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3M2NF91NjQodWludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgxX3QpX19hOyB9Ci1fX2FpIGludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X2YxNihmbG9hdDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgxX3QpX19hOyB9Ci1fX2FpIGludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgxX3QpX19hOyB9Ci1fX2FpIGludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3A4KHBvbHk4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgxX3QpX19hOyB9Ci1fX2FpIGludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3AxNihwb2x5MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2E7IH0KLV9fYWkgdWludDh4OF90IHZyZWludGVycHJldF91OF9zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cmVpbnRlcnByZXRfdThfczE2KGludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cmVpbnRlcnByZXRfdThfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cmVpbnRlcnByZXRfdThfczY0KGludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cmVpbnRlcnByZXRfdThfdTE2KHVpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYTsgfQotX19haSB1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X3UzMih1aW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2E7IH0KLV9fYWkgdWludDh4OF90IHZyZWludGVycHJldF91OF91NjQodWludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cmVpbnRlcnByZXRfdThfZjE2KGZsb2F0MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2E7IH0KLV9fYWkgdWludDh4OF90IHZyZWludGVycHJldF91OF9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYTsgfQotX19haSB1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X3A4KHBvbHk4eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cmVpbnRlcnByZXRfdThfcDE2KHBvbHkxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYTsgfQotX19haSB1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2E7IH0KLV9fYWkgdWludDE2eDRfdCB2cmVpbnRlcnByZXRfdTE2X3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2E7IH0KLV9fYWkgdWludDE2eDRfdCB2cmVpbnRlcnByZXRfdTE2X3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2E7IH0KLV9fYWkgdWludDE2eDRfdCB2cmVpbnRlcnByZXRfdTE2X3M2NChpbnQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2E7IH0KLV9fYWkgdWludDE2eDRfdCB2cmVpbnRlcnByZXRfdTE2X3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYTsgfQotX19haSB1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfdTMyKHVpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2E7IH0KLV9fYWkgdWludDE2eDRfdCB2cmVpbnRlcnByZXRfdTE2X3U2NCh1aW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19hOyB9Ci1fX2FpIHVpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3UxNl9mMTYoZmxvYXQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2E7IH0KLV9fYWkgdWludDE2eDRfdCB2cmVpbnRlcnByZXRfdTE2X2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYTsgfQotX19haSB1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfcDgocG9seTh4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19hOyB9Ci1fX2FpIHVpbnQxNng0X3QgdnJlaW50ZXJwcmV0X3UxNl9wMTYocG9seTE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYTsgfQotX19haSB1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2E7IH0KLV9fYWkgdWludDMyeDJfdCB2cmVpbnRlcnByZXRfdTMyX3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2E7IH0KLV9fYWkgdWludDMyeDJfdCB2cmVpbnRlcnByZXRfdTMyX3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2E7IH0KLV9fYWkgdWludDMyeDJfdCB2cmVpbnRlcnByZXRfdTMyX3M2NChpbnQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2E7IH0KLV9fYWkgdWludDMyeDJfdCB2cmVpbnRlcnByZXRfdTMyX3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYTsgfQotX19haSB1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfdTE2KHVpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2E7IH0KLV9fYWkgdWludDMyeDJfdCB2cmVpbnRlcnByZXRfdTMyX3U2NCh1aW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19hOyB9Ci1fX2FpIHVpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3UzMl9mMTYoZmxvYXQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2E7IH0KLV9fYWkgdWludDMyeDJfdCB2cmVpbnRlcnByZXRfdTMyX2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYTsgfQotX19haSB1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfcDgocG9seTh4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19hOyB9Ci1fX2FpIHVpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3UzMl9wMTYocG9seTE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYTsgfQotX19haSB1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2E7IH0KLV9fYWkgdWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2E7IH0KLV9fYWkgdWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2E7IH0KLV9fYWkgdWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3M2NChpbnQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2E7IH0KLV9fYWkgdWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYTsgfQotX19haSB1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfdTE2KHVpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2E7IH0KLV9fYWkgdWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X3UzMih1aW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19hOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3U2NF9mMTYoZmxvYXQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2E7IH0KLV9fYWkgdWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYTsgfQotX19haSB1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfcDgocG9seTh4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19hOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdnJlaW50ZXJwcmV0X3U2NF9wMTYocG9seTE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYTsgfQotX19haSBmbG9hdDE2eDRfdCB2cmVpbnRlcnByZXRfZjE2X3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4NF90KV9fYTsgfQotX19haSBmbG9hdDE2eDRfdCB2cmVpbnRlcnByZXRfZjE2X3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQxNng0X3QpX19hOyB9Ci1fX2FpIGZsb2F0MTZ4NF90IHZyZWludGVycHJldF9mMTZfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDE2eDRfdClfX2E7IH0KLV9fYWkgZmxvYXQxNng0X3QgdnJlaW50ZXJwcmV0X2YxNl9zNjQoaW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4NF90KV9fYTsgfQotX19haSBmbG9hdDE2eDRfdCB2cmVpbnRlcnByZXRfZjE2X3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDE2eDRfdClfX2E7IH0KLV9fYWkgZmxvYXQxNng0X3QgdnJlaW50ZXJwcmV0X2YxNl91MTYodWludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDE2eDRfdClfX2E7IH0KLV9fYWkgZmxvYXQxNng0X3QgdnJlaW50ZXJwcmV0X2YxNl91MzIodWludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDE2eDRfdClfX2E7IH0KLV9fYWkgZmxvYXQxNng0X3QgdnJlaW50ZXJwcmV0X2YxNl91NjQodWludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDE2eDRfdClfX2E7IH0KLV9fYWkgZmxvYXQxNng0X3QgdnJlaW50ZXJwcmV0X2YxNl9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQxNng0X3QpX19hOyB9Ci1fX2FpIGZsb2F0MTZ4NF90IHZyZWludGVycHJldF9mMTZfcDgocG9seTh4OF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4NF90KV9fYTsgfQotX19haSBmbG9hdDE2eDRfdCB2cmVpbnRlcnByZXRfZjE2X3AxNihwb2x5MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4NF90KV9fYTsgfQotX19haSBmbG9hdDMyeDJfdCB2cmVpbnRlcnByZXRfZjMyX3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYTsgfQotX19haSBmbG9hdDMyeDJfdCB2cmVpbnRlcnByZXRfZjMyX3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19hOyB9Ci1fX2FpIGZsb2F0MzJ4Ml90IHZyZWludGVycHJldF9mMzJfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2E7IH0KLV9fYWkgZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl9zNjQoaW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYTsgfQotX19haSBmbG9hdDMyeDJfdCB2cmVpbnRlcnByZXRfZjMyX3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2E7IH0KLV9fYWkgZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl91MTYodWludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2E7IH0KLV9fYWkgZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl91MzIodWludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2E7IH0KLV9fYWkgZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl91NjQodWludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2E7IH0KLV9fYWkgZmxvYXQzMngyX3QgdnJlaW50ZXJwcmV0X2YzMl9mMTYoZmxvYXQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19hOyB9Ci1fX2FpIGZsb2F0MzJ4Ml90IHZyZWludGVycHJldF9mMzJfcDgocG9seTh4OF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYTsgfQotX19haSBmbG9hdDMyeDJfdCB2cmVpbnRlcnByZXRfZjMyX3AxNihwb2x5MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYTsgfQotX19haSBwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2E7IH0KLV9fYWkgcG9seTh4OF90IHZyZWludGVycHJldF9wOF9zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2E7IH0KLV9fYWkgcG9seTh4OF90IHZyZWludGVycHJldF9wOF9zMzIoaW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2E7IH0KLV9fYWkgcG9seTh4OF90IHZyZWludGVycHJldF9wOF9zNjQoaW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2E7IH0KLV9fYWkgcG9seTh4OF90IHZyZWludGVycHJldF9wOF91OCh1aW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4OF90KV9fYTsgfQotX19haSBwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X3UxNih1aW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2E7IH0KLV9fYWkgcG9seTh4OF90IHZyZWludGVycHJldF9wOF91MzIodWludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5OHg4X3QpX19hOyB9Ci1fX2FpIHBvbHk4eDhfdCB2cmVpbnRlcnByZXRfcDhfdTY0KHVpbnQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4OF90KV9fYTsgfQotX19haSBwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X2YxNihmbG9hdDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5OHg4X3QpX19hOyB9Ci1fX2FpIHBvbHk4eDhfdCB2cmVpbnRlcnByZXRfcDhfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2E7IH0KLV9fYWkgcG9seTh4OF90IHZyZWludGVycHJldF9wOF9wMTYocG9seTE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5OHg4X3QpX19hOyB9Ci1fX2FpIHBvbHkxNng0X3QgdnJlaW50ZXJwcmV0X3AxNl9zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4NF90KV9fYTsgfQotX19haSBwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfczE2KGludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4NF90KV9fYTsgfQotX19haSBwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4NF90KV9fYTsgfQotX19haSBwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfczY0KGludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4NF90KV9fYTsgfQotX19haSBwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfdTgodWludDh4OF90IF9fYSkgewotICByZXR1cm4gKHBvbHkxNng0X3QpX19hOyB9Ci1fX2FpIHBvbHkxNng0X3QgdnJlaW50ZXJwcmV0X3AxNl91MTYodWludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4NF90KV9fYTsgfQotX19haSBwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfdTMyKHVpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDRfdClfX2E7IH0KLV9fYWkgcG9seTE2eDRfdCB2cmVpbnRlcnByZXRfcDE2X3U2NCh1aW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKHBvbHkxNng0X3QpX19hOyB9Ci1fX2FpIHBvbHkxNng0X3QgdnJlaW50ZXJwcmV0X3AxNl9mMTYoZmxvYXQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDRfdClfX2E7IH0KLV9fYWkgcG9seTE2eDRfdCB2cmVpbnRlcnByZXRfcDE2X2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4NF90KV9fYTsgfQotX19haSBwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfcDgocG9seTh4OF90IF9fYSkgewotICByZXR1cm4gKHBvbHkxNng0X3QpX19hOyB9Ci1fX2FpIGludDh4MTZfdCB2cmVpbnRlcnByZXRxX3M4X3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYTsgfQotX19haSBpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDh4MTZfdClfX2E7IH0KLV9fYWkgaW50OHgxNl90IHZyZWludGVycHJldHFfczhfczY0KGludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19hOyB9Ci1fX2FpIGludDh4MTZfdCB2cmVpbnRlcnByZXRxX3M4X3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYTsgfQotX19haSBpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF91MTYodWludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19hOyB9Ci1fX2FpIGludDh4MTZfdCB2cmVpbnRlcnByZXRxX3M4X3UzMih1aW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDh4MTZfdClfX2E7IH0KLV9fYWkgaW50OHgxNl90IHZyZWludGVycHJldHFfczhfdTY0KHVpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYTsgfQotX19haSBpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF9mMTYoZmxvYXQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYTsgfQotX19haSBpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYTsgfQotX19haSBpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV9zOF9wOChwb2x5OHgxNl90IF9fYSkgewotICByZXR1cm4gKGludDh4MTZfdClfX2E7IH0KLV9fYWkgaW50OHgxNl90IHZyZWludGVycHJldHFfczhfcDE2KHBvbHkxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYTsgfQotX19haSBpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfczgoaW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKGludDE2eDhfdClfX2E7IH0KLV9fYWkgaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KV9fYTsgfQotX19haSBpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfczY0KGludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19hOyB9Ci1fX2FpIGludDE2eDhfdCB2cmVpbnRlcnByZXRxX3MxNl91OCh1aW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKGludDE2eDhfdClfX2E7IH0KLV9fYWkgaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X3UxNih1aW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKGludDE2eDhfdClfX2E7IH0KLV9fYWkgaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X3UzMih1aW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDE2eDhfdClfX2E7IH0KLV9fYWkgaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X3U2NCh1aW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGludDE2eDhfdClfX2E7IH0KLV9fYWkgaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X2YxNihmbG9hdDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19hOyB9Ci1fX2FpIGludDE2eDhfdCB2cmVpbnRlcnByZXRxX3MxNl9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KV9fYTsgfQotX19haSBpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfcDgocG9seTh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19hOyB9Ci1fX2FpIGludDE2eDhfdCB2cmVpbnRlcnByZXRxX3MxNl9wMTYocG9seTE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19hOyB9Ci1fX2FpIGludDMyeDRfdCB2cmVpbnRlcnByZXRxX3MzMl9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYTsgfQotX19haSBpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfczE2KGludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19hOyB9Ci1fX2FpIGludDMyeDRfdCB2cmVpbnRlcnByZXRxX3MzMl9zNjQoaW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2E7IH0KLV9fYWkgaW50MzJ4NF90IHZyZWludGVycHJldHFfczMyX3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYTsgfQotX19haSBpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfdTE2KHVpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYTsgfQotX19haSBpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYTsgfQotX19haSBpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfdTY0KHVpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYTsgfQotX19haSBpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV9zMzJfZjE2KGZsb2F0MTZ4OF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2E7IH0KLV9fYWkgaW50MzJ4NF90IHZyZWludGVycHJldHFfczMyX2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19hOyB9Ci1fX2FpIGludDMyeDRfdCB2cmVpbnRlcnByZXRxX3MzMl9wOChwb2x5OHgxNl90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2E7IH0KLV9fYWkgaW50MzJ4NF90IHZyZWludGVycHJldHFfczMyX3AxNihwb2x5MTZ4OF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2E7IH0KLV9fYWkgaW50NjR4Ml90IHZyZWludGVycHJldHFfczY0X3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpX19hOyB9Ci1fX2FpIGludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF9zMTYoaW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKGludDY0eDJfdClfX2E7IH0KLV9fYWkgaW50NjR4Ml90IHZyZWludGVycHJldHFfczY0X3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYTsgfQotX19haSBpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9zNjRfdTgodWludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpX19hOyB9Ci1fX2FpIGludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF91MTYodWludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpX19hOyB9Ci1fX2FpIGludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF91MzIodWludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpX19hOyB9Ci1fX2FpIGludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF91NjQodWludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpX19hOyB9Ci1fX2FpIGludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF9mMTYoZmxvYXQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYTsgfQotX19haSBpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9zNjRfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDY0eDJfdClfX2E7IH0KLV9fYWkgaW50NjR4Ml90IHZyZWludGVycHJldHFfczY0X3A4KHBvbHk4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYTsgfQotX19haSBpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9zNjRfcDE2KHBvbHkxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYTsgfQotX19haSB1aW50OHgxNl90IHZyZWludGVycHJldHFfdThfczgoaW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF9zMTYoaW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF9zNjQoaW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF91MTYodWludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYTsgfQotX19haSB1aW50OHgxNl90IHZyZWludGVycHJldHFfdThfdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2E7IH0KLV9fYWkgdWludDh4MTZfdCB2cmVpbnRlcnByZXRxX3U4X3U2NCh1aW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF9mMTYoZmxvYXQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2E7IH0KLV9fYWkgdWludDh4MTZfdCB2cmVpbnRlcnByZXRxX3U4X2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYTsgfQotX19haSB1aW50OHgxNl90IHZyZWludGVycHJldHFfdThfcDgocG9seTh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYTsgfQotX19haSB1aW50OHgxNl90IHZyZWludGVycHJldHFfdThfcDE2KHBvbHkxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2E7IH0KLV9fYWkgdWludDE2eDhfdCB2cmVpbnRlcnByZXRxX3UxNl9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2E7IH0KLV9fYWkgdWludDE2eDhfdCB2cmVpbnRlcnByZXRxX3UxNl9zMTYoaW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19hOyB9Ci1fX2FpIHVpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV91MTZfczMyKGludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYTsgfQotX19haSB1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2E7IH0KLV9fYWkgdWludDE2eDhfdCB2cmVpbnRlcnByZXRxX3UxNl91OCh1aW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19hOyB9Ci1fX2FpIHVpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV91MTZfdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2E7IH0KLV9fYWkgdWludDE2eDhfdCB2cmVpbnRlcnByZXRxX3UxNl91NjQodWludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYTsgfQotX19haSB1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X2YxNihmbG9hdDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYTsgfQotX19haSB1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYTsgfQotX19haSB1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X3A4KHBvbHk4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2E7IH0KLV9fYWkgdWludDE2eDhfdCB2cmVpbnRlcnByZXRxX3UxNl9wMTYocG9seTE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYTsgfQotX19haSB1aW50MzJ4NF90IHZyZWludGVycHJldHFfdTMyX3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYTsgfQotX19haSB1aW50MzJ4NF90IHZyZWludGVycHJldHFfdTMyX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2E7IH0KLV9fYWkgdWludDMyeDRfdCB2cmVpbnRlcnByZXRxX3UzMl9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19hOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfczY0KGludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYTsgfQotX19haSB1aW50MzJ4NF90IHZyZWludGVycHJldHFfdTMyX3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2E7IH0KLV9fYWkgdWludDMyeDRfdCB2cmVpbnRlcnByZXRxX3UzMl91MTYodWludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYTsgfQotX19haSB1aW50MzJ4NF90IHZyZWludGVycHJldHFfdTMyX3U2NCh1aW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19hOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfZjE2KGZsb2F0MTZ4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19hOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19hOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfcDgocG9seTh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYTsgfQotX19haSB1aW50MzJ4NF90IHZyZWludGVycHJldHFfdTMyX3AxNihwb2x5MTZ4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19hOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV91NjRfczgoaW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19hOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV91NjRfczE2KGludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYTsgfQotX19haSB1aW50NjR4Ml90IHZyZWludGVycHJldHFfdTY0X3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2E7IH0KLV9fYWkgdWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9zNjQoaW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19hOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV91NjRfdTgodWludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYTsgfQotX19haSB1aW50NjR4Ml90IHZyZWludGVycHJldHFfdTY0X3UxNih1aW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19hOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV91NjRfdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2E7IH0KLV9fYWkgdWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9mMTYoZmxvYXQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2E7IH0KLV9fYWkgdWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2E7IH0KLV9fYWkgdWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9wOChwb2x5OHgxNl90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19hOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV91NjRfcDE2KHBvbHkxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2E7IH0KLV9fYWkgZmxvYXQxNng4X3QgdnJlaW50ZXJwcmV0cV9mMTZfczgoaW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4OF90KV9fYTsgfQotX19haSBmbG9hdDE2eDhfdCB2cmVpbnRlcnByZXRxX2YxNl9zMTYoaW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4OF90KV9fYTsgfQotX19haSBmbG9hdDE2eDhfdCB2cmVpbnRlcnByZXRxX2YxNl9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4OF90KV9fYTsgfQotX19haSBmbG9hdDE2eDhfdCB2cmVpbnRlcnByZXRxX2YxNl9zNjQoaW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4OF90KV9fYTsgfQotX19haSBmbG9hdDE2eDhfdCB2cmVpbnRlcnByZXRxX2YxNl91OCh1aW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4OF90KV9fYTsgfQotX19haSBmbG9hdDE2eDhfdCB2cmVpbnRlcnByZXRxX2YxNl91MTYodWludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDE2eDhfdClfX2E7IH0KLV9fYWkgZmxvYXQxNng4X3QgdnJlaW50ZXJwcmV0cV9mMTZfdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQxNng4X3QpX19hOyB9Ci1fX2FpIGZsb2F0MTZ4OF90IHZyZWludGVycHJldHFfZjE2X3U2NCh1aW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4OF90KV9fYTsgfQotX19haSBmbG9hdDE2eDhfdCB2cmVpbnRlcnByZXRxX2YxNl9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQxNng4X3QpX19hOyB9Ci1fX2FpIGZsb2F0MTZ4OF90IHZyZWludGVycHJldHFfZjE2X3A4KHBvbHk4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQxNng4X3QpX19hOyB9Ci1fX2FpIGZsb2F0MTZ4OF90IHZyZWludGVycHJldHFfZjE2X3AxNihwb2x5MTZ4OF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4OF90KV9fYTsgfQotX19haSBmbG9hdDMyeDRfdCB2cmVpbnRlcnByZXRxX2YzMl9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19hOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19hOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19hOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19hOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19hOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX3UxNih1aW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYTsgfQotX19haSBmbG9hdDMyeDRfdCB2cmVpbnRlcnByZXRxX2YzMl91MzIodWludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDRfdClfX2E7IH0KLV9fYWkgZmxvYXQzMng0X3QgdnJlaW50ZXJwcmV0cV9mMzJfdTY0KHVpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19hOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX2YxNihmbG9hdDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDRfdClfX2E7IH0KLV9fYWkgZmxvYXQzMng0X3QgdnJlaW50ZXJwcmV0cV9mMzJfcDgocG9seTh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDRfdClfX2E7IH0KLV9fYWkgZmxvYXQzMng0X3QgdnJlaW50ZXJwcmV0cV9mMzJfcDE2KHBvbHkxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19hOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdnJlaW50ZXJwcmV0cV9wOF9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2E7IH0KLV9fYWkgcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2E7IH0KLV9fYWkgcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2E7IH0KLV9fYWkgcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2E7IH0KLV9fYWkgcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2E7IH0KLV9fYWkgcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3UxNih1aW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDE2X3QpX19hOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdnJlaW50ZXJwcmV0cV9wOF91MzIodWludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5OHgxNl90KV9fYTsgfQotX19haSBwb2x5OHgxNl90IHZyZWludGVycHJldHFfcDhfdTY0KHVpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2E7IH0KLV9fYWkgcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X2YxNihmbG9hdDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5OHgxNl90KV9fYTsgfQotX19haSBwb2x5OHgxNl90IHZyZWludGVycHJldHFfcDhfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDE2X3QpX19hOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdnJlaW50ZXJwcmV0cV9wOF9wMTYocG9seTE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5OHgxNl90KV9fYTsgfQotX19haSBwb2x5MTZ4OF90IHZyZWludGVycHJldHFfcDE2X3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4OF90KV9fYTsgfQotX19haSBwb2x5MTZ4OF90IHZyZWludGVycHJldHFfcDE2X3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDhfdClfX2E7IH0KLV9fYWkgcG9seTE2eDhfdCB2cmVpbnRlcnByZXRxX3AxNl9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHBvbHkxNng4X3QpX19hOyB9Ci1fX2FpIHBvbHkxNng4X3QgdnJlaW50ZXJwcmV0cV9wMTZfczY0KGludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4OF90KV9fYTsgfQotX19haSBwb2x5MTZ4OF90IHZyZWludGVycHJldHFfcDE2X3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDhfdClfX2E7IH0KLV9fYWkgcG9seTE2eDhfdCB2cmVpbnRlcnByZXRxX3AxNl91MTYodWludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4OF90KV9fYTsgfQotX19haSBwb2x5MTZ4OF90IHZyZWludGVycHJldHFfcDE2X3UzMih1aW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHBvbHkxNng4X3QpX19hOyB9Ci1fX2FpIHBvbHkxNng4X3QgdnJlaW50ZXJwcmV0cV9wMTZfdTY0KHVpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDhfdClfX2E7IH0KLV9fYWkgcG9seTE2eDhfdCB2cmVpbnRlcnByZXRxX3AxNl9mMTYoZmxvYXQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDhfdClfX2E7IH0KLV9fYWkgcG9seTE2eDhfdCB2cmVpbnRlcnByZXRxX3AxNl9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDhfdClfX2E7IH0KLV9fYWkgcG9seTE2eDhfdCB2cmVpbnRlcnByZXRxX3AxNl9wOChwb2x5OHgxNl90IF9fYSkgewotICByZXR1cm4gKHBvbHkxNng4X3QpX19hOyB9Ci0KLV9fYWkgaW50OHg4X3QgdnJldjE2X3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDEsIDAsIDMsIDIsIDUsIDQsIDcsIDYpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cmV2MTZfdTgodWludDh4OF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDEsIDAsIDMsIDIsIDUsIDQsIDcsIDYpOyB9Ci1fX2FpIHBvbHk4eDhfdCB2cmV2MTZfcDgocG9seTh4OF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDEsIDAsIDMsIDIsIDUsIDQsIDcsIDYpOyB9Ci1fX2FpIGludDh4MTZfdCB2cmV2MTZxX3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAxLCAwLCAzLCAyLCA1LCA0LCA3LCA2LCA5LCA4LCAxMSwgMTAsIDEzLCAxMiwgMTUsIDE0KTsgfQotX19haSB1aW50OHgxNl90IHZyZXYxNnFfdTgodWludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAxLCAwLCAzLCAyLCA1LCA0LCA3LCA2LCA5LCA4LCAxMSwgMTAsIDEzLCAxMiwgMTUsIDE0KTsgfQotX19haSBwb2x5OHgxNl90IHZyZXYxNnFfcDgocG9seTh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAxLCAwLCAzLCAyLCA1LCA0LCA3LCA2LCA5LCA4LCAxMSwgMTAsIDEzLCAxMiwgMTUsIDE0KTsgfQotCi1fX2FpIGludDh4OF90IHZyZXYzMl9zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAzLCAyLCAxLCAwLCA3LCA2LCA1LCA0KTsgfQotX19haSBpbnQxNng0X3QgdnJldjMyX3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMSwgMCwgMywgMik7IH0KLV9fYWkgdWludDh4OF90IHZyZXYzMl91OCh1aW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMywgMiwgMSwgMCwgNywgNiwgNSwgNCk7IH0KLV9fYWkgdWludDE2eDRfdCB2cmV2MzJfdTE2KHVpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMSwgMCwgMywgMik7IH0KLV9fYWkgcG9seTh4OF90IHZyZXYzMl9wOChwb2x5OHg4X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMywgMiwgMSwgMCwgNywgNiwgNSwgNCk7IH0KLV9fYWkgcG9seTE2eDRfdCB2cmV2MzJfcDE2KHBvbHkxNng0X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMSwgMCwgMywgMik7IH0KLV9fYWkgaW50OHgxNl90IHZyZXYzMnFfczgoaW50OHgxNl90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDMsIDIsIDEsIDAsIDcsIDYsIDUsIDQsIDExLCAxMCwgOSwgOCwgMTUsIDE0LCAxMywgMTIpOyB9Ci1fX2FpIGludDE2eDhfdCB2cmV2MzJxX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMSwgMCwgMywgMiwgNSwgNCwgNywgNik7IH0KLV9fYWkgdWludDh4MTZfdCB2cmV2MzJxX3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMywgMiwgMSwgMCwgNywgNiwgNSwgNCwgMTEsIDEwLCA5LCA4LCAxNSwgMTQsIDEzLCAxMik7IH0KLV9fYWkgdWludDE2eDhfdCB2cmV2MzJxX3UxNih1aW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDEsIDAsIDMsIDIsIDUsIDQsIDcsIDYpOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdnJldjMycV9wOChwb2x5OHgxNl90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDMsIDIsIDEsIDAsIDcsIDYsIDUsIDQsIDExLCAxMCwgOSwgOCwgMTUsIDE0LCAxMywgMTIpOyB9Ci1fX2FpIHBvbHkxNng4X3QgdnJldjMycV9wMTYocG9seTE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAxLCAwLCAzLCAyLCA1LCA0LCA3LCA2KTsgfQotCi1fX2FpIGludDh4OF90IHZyZXY2NF9zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwKTsgfQotX19haSBpbnQxNng0X3QgdnJldjY0X3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMywgMiwgMSwgMCk7IH0KLV9fYWkgaW50MzJ4Ml90IHZyZXY2NF9zMzIoaW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDEsIDApOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2cmV2NjRfdTgodWludDh4OF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDApOyB9Ci1fX2FpIHVpbnQxNng0X3QgdnJldjY0X3UxNih1aW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDMsIDIsIDEsIDApOyB9Ci1fX2FpIHVpbnQzMngyX3QgdnJldjY0X3UzMih1aW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDEsIDApOyB9Ci1fX2FpIHBvbHk4eDhfdCB2cmV2NjRfcDgocG9seTh4OF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDApOyB9Ci1fX2FpIHBvbHkxNng0X3QgdnJldjY0X3AxNihwb2x5MTZ4NF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDMsIDIsIDEsIDApOyB9Ci1fX2FpIGZsb2F0MzJ4Ml90IHZyZXY2NF9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMSwgMCk7IH0KLV9fYWkgaW50OHgxNl90IHZyZXY2NHFfczgoaW50OHgxNl90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgpOyB9Ci1fX2FpIGludDE2eDhfdCB2cmV2NjRxX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMywgMiwgMSwgMCwgNywgNiwgNSwgNCk7IH0KLV9fYWkgaW50MzJ4NF90IHZyZXY2NHFfczMyKGludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAxLCAwLCAzLCAyKTsgfQotX19haSB1aW50OHgxNl90IHZyZXY2NHFfdTgodWludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4KTsgfQotX19haSB1aW50MTZ4OF90IHZyZXY2NHFfdTE2KHVpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMywgMiwgMSwgMCwgNywgNiwgNSwgNCk7IH0KLV9fYWkgdWludDMyeDRfdCB2cmV2NjRxX3UzMih1aW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDEsIDAsIDMsIDIpOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdnJldjY0cV9wOChwb2x5OHgxNl90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgpOyB9Ci1fX2FpIHBvbHkxNng4X3QgdnJldjY0cV9wMTYocG9seTE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAzLCAyLCAxLCAwLCA3LCA2LCA1LCA0KTsgfQotX19haSBmbG9hdDMyeDRfdCB2cmV2NjRxX2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCAxLCAwLCAzLCAyKTsgfQotCi1fX2FpIGludDh4OF90IHZyaGFkZF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZyaGFkZF92KF9fYSwgX19iLCAwKTsgfQotX19haSBpbnQxNng0X3QgdnJoYWRkX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZyaGFkZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2cmhhZGRfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnJoYWRkX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMik7IH0KLV9fYWkgdWludDh4OF90IHZyaGFkZF91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZyaGFkZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZyaGFkZF91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cmhhZGRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2cmhhZGRfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnJoYWRkX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTgpOyB9Ci1fX2FpIGludDh4MTZfdCB2cmhhZGRxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnJoYWRkcV92KF9fYSwgX19iLCAzMik7IH0KLV9fYWkgaW50MTZ4OF90IHZyaGFkZHFfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdnJoYWRkcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzMpOyB9Ci1fX2FpIGludDMyeDRfdCB2cmhhZGRxX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZyaGFkZHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM0KTsgfQotX19haSB1aW50OHgxNl90IHZyaGFkZHFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cmhhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2cmhhZGRxX3UxNih1aW50MTZ4OF90IF9fYSwgdWludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZyaGFkZHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ5KTsgfQotX19haSB1aW50MzJ4NF90IHZyaGFkZHFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnJoYWRkcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTApOyB9Ci0KLV9fYWkgaW50OHg4X3QgdnJzaGxfczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cnNobF92KF9fYSwgX19iLCAwKTsgfQotX19haSBpbnQxNng0X3QgdnJzaGxfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdnJzaGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxKTsgfQotX19haSBpbnQzMngyX3QgdnJzaGxfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnJzaGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAyKTsgfQotX19haSBpbnQ2NHgxX3QgdnJzaGxfczY0KGludDY0eDFfdCBfX2EsIGludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdnJzaGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAzKTsgfQotX19haSB1aW50OHg4X3QgdnJzaGxfdTgodWludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Zyc2hsX3YoKGludDh4OF90KV9fYSwgX19iLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2cnNobF91MTYodWludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Zyc2hsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdnJzaGxfdTMyKHVpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cnNobF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE4KTsgfQotX19haSB1aW50NjR4MV90IHZyc2hsX3U2NCh1aW50NjR4MV90IF9fYSwgaW50NjR4MV90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdnJzaGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOSk7IH0KLV9fYWkgaW50OHgxNl90IHZyc2hscV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3Zyc2hscV92KF9fYSwgX19iLCAzMik7IH0KLV9fYWkgaW50MTZ4OF90IHZyc2hscV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92cnNobHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDMzKTsgfQotX19haSBpbnQzMng0X3QgdnJzaGxxX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3Zyc2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzQpOyB9Ci1fX2FpIGludDY0eDJfdCB2cnNobHFfczY0KGludDY0eDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnJzaGxxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzNSk7IH0KLV9fYWkgdWludDh4MTZfdCB2cnNobHFfdTgodWludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3Zyc2hscV92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDQ4KTsgfQotX19haSB1aW50MTZ4OF90IHZyc2hscV91MTYodWludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3Zyc2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDkpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnJzaGxxX3UzMih1aW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnJzaGxxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MCk7IH0KLV9fYWkgdWludDY0eDJfdCB2cnNobHFfdTY0KHVpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92cnNobHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUxKTsgfQotCi0jZGVmaW5lIHZyc2hybl9uX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hID0gKGEpOyBcCi0gIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cnNocm5fbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDApOyB9KQotI2RlZmluZSB2cnNocm5fbl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Zyc2hybl9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMSk7IH0pCi0jZGVmaW5lIHZyc2hybl9uX3M2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnJzaHJuX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAyKTsgfSkKLSNkZWZpbmUgdnJzaHJuX25fdTE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4X3QgX19hID0gKGEpOyBcCi0gICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnJzaHJuX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAxNik7IH0pCi0jZGVmaW5lIHZyc2hybl9uX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cnNocm5fbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDE3KTsgfSkKLSNkZWZpbmUgdnJzaHJuX25fdTY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3Zyc2hybl9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMTgpOyB9KQotCi0jZGVmaW5lIHZyc2hyX25fczgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19hID0gKGEpOyBcCi0gIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cnNocl9uX3YoX19hLCBfX2IsIDApOyB9KQotI2RlZmluZSB2cnNocl9uX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBcCi0gIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdnJzaHJfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgMSk7IH0pCi0jZGVmaW5lIHZyc2hyX25fczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IFwKLSAgKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cnNocl9uX3YoKGludDh4OF90KV9fYSwgX19iLCAyKTsgfSkKLSNkZWZpbmUgdnJzaHJfbl9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MV90IF9fYSA9IChhKTsgXAotICAoaW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3Zyc2hyX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDMpOyB9KQotI2RlZmluZSB2cnNocl9uX3U4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cnNocl9uX3YoKGludDh4OF90KV9fYSwgX19iLCAxNik7IH0pCi0jZGVmaW5lIHZyc2hyX25fdTE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0X3QgX19hID0gKGEpOyBcCi0gICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Zyc2hyX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDE3KTsgfSkKLSNkZWZpbmUgdnJzaHJfbl91MzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnJzaHJfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgMTgpOyB9KQotI2RlZmluZSB2cnNocl9uX3U2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4MV90IF9fYSA9IChhKTsgXAotICAodWludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cnNocl9uX3YoKGludDh4OF90KV9fYSwgX19iLCAxOSk7IH0pCi0jZGVmaW5lIHZyc2hycV9uX3M4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4MTZfdCBfX2EgPSAoYSk7IFwKLSAgKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cnNocnFfbl92KF9fYSwgX19iLCAzMik7IH0pCi0jZGVmaW5lIHZyc2hycV9uX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hID0gKGEpOyBcCi0gIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdnJzaHJxX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAzMyk7IH0pCi0jZGVmaW5lIHZyc2hycV9uX3MzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBcCi0gIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdnJzaHJxX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAzNCk7IH0pCi0jZGVmaW5lIHZyc2hycV9uX3M2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnJzaHJxX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAzNSk7IH0pCi0jZGVmaW5lIHZyc2hycV9uX3U4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2X3QgX19hID0gKGEpOyBcCi0gICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3Zyc2hycV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNDgpOyB9KQotI2RlZmluZSB2cnNocnFfbl91MTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnJzaHJxX25fdigoaW50OHgxNl90KV9fYSwgX19iLCA0OSk7IH0pCi0jZGVmaW5lIHZyc2hycV9uX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cnNocnFfbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDUwKTsgfSkKLSNkZWZpbmUgdnJzaHJxX25fdTY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3Zyc2hycV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNTEpOyB9KQotCi1fX2FpIGZsb2F0MzJ4Ml90IHZyc3FydGVfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3Zyc3FydGVfdigoaW50OHg4X3QpX19hLCA4KTsgfQotX19haSB1aW50MzJ4Ml90IHZyc3FydGVfdTMyKHVpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cnNxcnRlX3YoKGludDh4OF90KV9fYSwgMTgpOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZyc3FydGVxX2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cnNxcnRlcV92KChpbnQ4eDE2X3QpX19hLCA0MCk7IH0KLV9fYWkgdWludDMyeDRfdCB2cnNxcnRlcV91MzIodWludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3Zyc3FydGVxX3YoKGludDh4MTZfdClfX2EsIDUwKTsgfQotCi1fX2FpIGZsb2F0MzJ4Ml90IHZyc3FydHNfZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdnJzcXJ0c192KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDgpOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZyc3FydHNxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3Zyc3FydHNxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0MCk7IH0KLQotI2RlZmluZSB2cnNyYV9uX3M4KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4OF90IF9fYSA9IChhKTsgaW50OHg4X3QgX19iID0gKGIpOyBcCi0gIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cnNyYV9uX3YoX19hLCBfX2IsIF9fYywgMCk7IH0pCi0jZGVmaW5lIHZyc3JhX25fczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IGludDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cnNyYV9uX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCAxKTsgfSkKLSNkZWZpbmUgdnJzcmFfbl9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Ml90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3Zyc3JhX25fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDIpOyB9KQotI2RlZmluZSB2cnNyYV9uX3M2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgxX3QgX19hID0gKGEpOyBpbnQ2NHgxX3QgX19iID0gKGIpOyBcCi0gIChpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdnJzcmFfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMyk7IH0pCi0jZGVmaW5lIHZyc3JhX25fdTgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4OF90IF9fYSA9IChhKTsgdWludDh4OF90IF9fYiA9IChiKTsgXAotICAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Zyc3JhX25fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE2KTsgfSkKLSNkZWZpbmUgdnJzcmFfbl91MTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IHVpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Zyc3JhX25fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE3KTsgfSkKLSNkZWZpbmUgdnJzcmFfbl91MzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJfdCBfX2EgPSAoYSk7IHVpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3Zyc3JhX25fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE4KTsgfSkKLSNkZWZpbmUgdnJzcmFfbl91NjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDFfdCBfX2EgPSAoYSk7IHVpbnQ2NHgxX3QgX19iID0gKGIpOyBcCi0gICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3Zyc3JhX25fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE5KTsgfSkKLSNkZWZpbmUgdnJzcmFxX25fczgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNl90IF9fYSA9IChhKTsgaW50OHgxNl90IF9fYiA9IChiKTsgXAotICAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3Zyc3JhcV9uX3YoX19hLCBfX2IsIF9fYywgMzIpOyB9KQotI2RlZmluZSB2cnNyYXFfbl9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYSA9IChhKTsgaW50MTZ4OF90IF9fYiA9IChiKTsgXAotICAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3Zyc3JhcV9uX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDMzKTsgfSkKLSNkZWZpbmUgdnJzcmFxX25fczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IGludDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cnNyYXFfbl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzNCk7IH0pCi0jZGVmaW5lIHZyc3JhcV9uX3M2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBpbnQ2NHgyX3QgX19iID0gKGIpOyBcCi0gIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnJzcmFxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzUpOyB9KQotI2RlZmluZSB2cnNyYXFfbl91OChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHgxNl90IF9fYSA9IChhKTsgdWludDh4MTZfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnJzcmFxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNDgpOyB9KQotI2RlZmluZSB2cnNyYXFfbl91MTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IHVpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3Zyc3JhcV9uX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDQ5KTsgfSkKLSNkZWZpbmUgdnJzcmFxX25fdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MzJ4NF90IF9fYiA9IChiKTsgXAotICAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cnNyYXFfbl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCA1MCk7IH0pCi0jZGVmaW5lIHZyc3JhcV9uX3U2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Ml90IF9fYSA9IChhKTsgdWludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnJzcmFxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNTEpOyB9KQotCi1fX2FpIGludDh4OF90IHZyc3ViaG5fczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cnN1YmhuX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAwKTsgfQotX19haSBpbnQxNng0X3QgdnJzdWJobl9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92cnN1YmhuX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAxKTsgfQotX19haSBpbnQzMngyX3QgdnJzdWJobl9zNjQoaW50NjR4Ml90IF9fYSwgaW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cnN1YmhuX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAyKTsgfQotX19haSB1aW50OHg4X3QgdnJzdWJobl91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Zyc3ViaG5fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZyc3ViaG5fdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdnJzdWJobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdnJzdWJobl91NjQodWludDY0eDJfdCBfX2EsIHVpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cnN1YmhuX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAxOCk7IH0KLQotI2RlZmluZSB2c2V0X2xhbmVfdTgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDhfdCBfX2EgPSAoYSk7IHVpbnQ4eDhfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTgoX19hLCAoaW50OHg4X3QpX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c2V0X2xhbmVfdTE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNl90IF9fYSA9IChhKTsgdWludDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdnNldF9sYW5lX2kxNihfX2EsIChpbnQxNng0X3QpX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c2V0X2xhbmVfdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMl90IF9fYSA9IChhKTsgdWludDMyeDJfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnNldF9sYW5lX2kzMihfX2EsIChpbnQzMngyX3QpX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c2V0X2xhbmVfczgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OF90IF9fYSA9IChhKTsgaW50OHg4X3QgX19iID0gKGIpOyBcCi0gIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTgoX19hLCBfX2IsIF9fYyk7IH0pCi0jZGVmaW5lIHZzZXRfbGFuZV9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZfdCBfX2EgPSAoYSk7IGludDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfaTE2KF9fYSwgX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c2V0X2xhbmVfczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyX3QgX19hID0gKGEpOyBpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnNldF9sYW5lX2kzMihfX2EsIF9fYiwgX19jKTsgfSkKLSNkZWZpbmUgdnNldF9sYW5lX3A4KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4X3QgX19hID0gKGEpOyBwb2x5OHg4X3QgX19iID0gKGIpOyBcCi0gIChwb2x5OHg4X3QpX19idWlsdGluX25lb25fdnNldF9sYW5lX2k4KF9fYSwgKGludDh4OF90KV9fYiwgX19jKTsgfSkKLSNkZWZpbmUgdnNldF9sYW5lX3AxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZfdCBfX2EgPSAoYSk7IHBvbHkxNng0X3QgX19iID0gKGIpOyBcCi0gIChwb2x5MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pMTYoX19hLCAoaW50MTZ4NF90KV9fYiwgX19jKTsgfSkKLSNkZWZpbmUgdnNldF9sYW5lX2YzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyX3QgX19hID0gKGEpOyBmbG9hdDMyeDJfdCBfX2IgPSAoYik7IFwKLSAgKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9mMzIoX19hLCBfX2IsIF9fYyk7IH0pCi0jZGVmaW5lIHZzZXRxX2xhbmVfdTgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDhfdCBfX2EgPSAoYSk7IHVpbnQ4eDE2X3QgX19iID0gKGIpOyBcCi0gICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTgoX19hLCAoaW50OHgxNl90KV9fYiwgX19jKTsgfSkKLSNkZWZpbmUgdnNldHFfbGFuZV91MTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2X3QgX19hID0gKGEpOyB1aW50MTZ4OF90IF9fYiA9IChiKTsgXAotICAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2kxNihfX2EsIChpbnQxNng4X3QpX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c2V0cV9sYW5lX3UzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJfdCBfX2EgPSAoYSk7IHVpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTMyKF9fYSwgKGludDMyeDRfdClfX2IsIF9fYyk7IH0pCi0jZGVmaW5lIHZzZXRxX2xhbmVfczgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OF90IF9fYSA9IChhKTsgaW50OHgxNl90IF9fYiA9IChiKTsgXAotICAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTgoX19hLCBfX2IsIF9fYyk7IH0pCi0jZGVmaW5lIHZzZXRxX2xhbmVfczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdnNldHFfbGFuZV9pMTYoX19hLCBfX2IsIF9fYyk7IH0pCi0jZGVmaW5lIHZzZXRxX2xhbmVfczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyX3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdnNldHFfbGFuZV9pMzIoX19hLCBfX2IsIF9fYyk7IH0pCi0jZGVmaW5lIHZzZXRxX2xhbmVfcDgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seThfdCBfX2EgPSAoYSk7IHBvbHk4eDE2X3QgX19iID0gKGIpOyBcCi0gIChwb2x5OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTgoX19hLCAoaW50OHgxNl90KV9fYiwgX19jKTsgfSkKLSNkZWZpbmUgdnNldHFfbGFuZV9wMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2X3QgX19hID0gKGEpOyBwb2x5MTZ4OF90IF9fYiA9IChiKTsgXAotICAocG9seTE2eDhfdClfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2kxNihfX2EsIChpbnQxNng4X3QpX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c2V0cV9sYW5lX2YzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyX3QgX19hID0gKGEpOyBmbG9hdDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfZjMyKF9fYSwgX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c2V0X2xhbmVfczY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0X3QgX19hID0gKGEpOyBpbnQ2NHgxX3QgX19iID0gKGIpOyBcCi0gIChpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdnNldF9sYW5lX2k2NChfX2EsIF9fYiwgX19jKTsgfSkKLSNkZWZpbmUgdnNldF9sYW5lX3U2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjRfdCBfX2EgPSAoYSk7IHVpbnQ2NHgxX3QgX19iID0gKGIpOyBcCi0gICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZzZXRfbGFuZV9pNjQoX19hLCAoaW50NjR4MV90KV9fYiwgX19jKTsgfSkKLSNkZWZpbmUgdnNldHFfbGFuZV9zNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjRfdCBfX2EgPSAoYSk7IGludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2k2NChfX2EsIF9fYiwgX19jKTsgfSkKLSNkZWZpbmUgdnNldHFfbGFuZV91NjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0X3QgX19hID0gKGEpOyB1aW50NjR4Ml90IF9fYiA9IChiKTsgXAotICAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92c2V0cV9sYW5lX2k2NChfX2EsIChpbnQ2NHgyX3QpX19iLCBfX2MpOyB9KQotCi1fX2FpIGludDh4OF90IHZzaGxfczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92c2hsX3YoX19hLCBfX2IsIDApOyB9Ci1fX2FpIGludDE2eDRfdCB2c2hsX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzaGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxKTsgfQotX19haSBpbnQzMngyX3QgdnNobF9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92c2hsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMik7IH0KLV9fYWkgaW50NjR4MV90IHZzaGxfczY0KGludDY0eDFfdCBfX2EsIGludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdnNobF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDMpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2c2hsX3U4KHVpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92c2hsX3YoKGludDh4OF90KV9fYSwgX19iLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2c2hsX3UxNih1aW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdnNobF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE3KTsgfQotX19haSB1aW50MzJ4Ml90IHZzaGxfdTMyKHVpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92c2hsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTgpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdnNobF91NjQodWludDY0eDFfdCBfX2EsIGludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZzaGxfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOSk7IH0KLV9fYWkgaW50OHgxNl90IHZzaGxxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnNobHFfdihfX2EsIF9fYiwgMzIpOyB9Ci1fX2FpIGludDE2eDhfdCB2c2hscV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92c2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzMpOyB9Ci1fX2FpIGludDMyeDRfdCB2c2hscV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92c2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzQpOyB9Ci1fX2FpIGludDY0eDJfdCB2c2hscV9zNjQoaW50NjR4Ml90IF9fYSwgaW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92c2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzUpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnNobHFfdTgodWludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZzaGxxX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNDgpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdnNobHFfdTE2KHVpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92c2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDkpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnNobHFfdTMyKHVpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92c2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTApOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnNobHFfdTY0KHVpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92c2hscV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTEpOyB9Ci0KLSNkZWZpbmUgdnNobGxfbl9zOChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDhfdCBfX2EgPSAoYSk7IFwKLSAgKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92c2hsbF9uX3YoX19hLCBfX2IsIDMzKTsgfSkKLSNkZWZpbmUgdnNobGxfbl9zMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NF90IF9fYSA9IChhKTsgXAotICAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzaGxsX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDM0KTsgfSkKLSNkZWZpbmUgdnNobGxfbl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Ml90IF9fYSA9IChhKTsgXAotICAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzaGxsX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDM1KTsgfSkKLSNkZWZpbmUgdnNobGxfbl91OChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4X3QgX19hID0gKGEpOyBcCi0gICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZzaGxsX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDQ5KTsgfSkKLSNkZWZpbmUgdnNobGxfbl91MTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnNobGxfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgNTApOyB9KQotI2RlZmluZSB2c2hsbF9uX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Ml90IF9fYSA9IChhKTsgXAotICAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92c2hsbF9uX3YoKGludDh4OF90KV9fYSwgX19iLCA1MSk7IH0pCi0KLSNkZWZpbmUgdnNobF9uX3M4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4OF90IF9fYSA9IChhKTsgXAotICAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnNobF9uX3YoX19hLCBfX2IsIDApOyB9KQotI2RlZmluZSB2c2hsX25fczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IFwKLSAgKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92c2hsX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDEpOyB9KQotI2RlZmluZSB2c2hsX25fczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IFwKLSAgKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92c2hsX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDIpOyB9KQotI2RlZmluZSB2c2hsX25fczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDFfdCBfX2EgPSAoYSk7IFwKLSAgKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92c2hsX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDMpOyB9KQotI2RlZmluZSB2c2hsX25fdTgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4OF90IF9fYSA9IChhKTsgXAotICAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZzaGxfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgMTYpOyB9KQotI2RlZmluZSB2c2hsX25fdTE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0X3QgX19hID0gKGEpOyBcCi0gICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzaGxfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgMTcpOyB9KQotI2RlZmluZSB2c2hsX25fdTMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hID0gKGEpOyBcCi0gICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzaGxfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgMTgpOyB9KQotI2RlZmluZSB2c2hsX25fdTY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxX3QgX19hID0gKGEpOyBcCi0gICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZzaGxfbl92KChpbnQ4eDhfdClfX2EsIF9fYiwgMTkpOyB9KQotI2RlZmluZSB2c2hscV9uX3M4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4MTZfdCBfX2EgPSAoYSk7IFwKLSAgKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92c2hscV9uX3YoX19hLCBfX2IsIDMyKTsgfSkKLSNkZWZpbmUgdnNobHFfbl9zMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYSA9IChhKTsgXAotICAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZzaGxxX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAzMyk7IH0pCi0jZGVmaW5lIHZzaGxxX25fczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92c2hscV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMzQpOyB9KQotI2RlZmluZSB2c2hscV9uX3M2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnNobHFfbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDM1KTsgfSkKLSNkZWZpbmUgdnNobHFfbl91OChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHgxNl90IF9fYSA9IChhKTsgXAotICAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92c2hscV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNDgpOyB9KQotI2RlZmluZSB2c2hscV9uX3UxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OF90IF9fYSA9IChhKTsgXAotICAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92c2hscV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNDkpOyB9KQotI2RlZmluZSB2c2hscV9uX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92c2hscV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNTApOyB9KQotI2RlZmluZSB2c2hscV9uX3U2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Ml90IF9fYSA9IChhKTsgXAotICAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92c2hscV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgNTEpOyB9KQotCi0jZGVmaW5lIHZzaHJuX25fczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZzaHJuX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAwKTsgfSkKLSNkZWZpbmUgdnNocm5fbl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzaHJuX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAxKTsgfSkKLSNkZWZpbmUgdnNocm5fbl9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Ml90IF9fYSA9IChhKTsgXAotICAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzaHJuX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAyKTsgfSkKLSNkZWZpbmUgdnNocm5fbl91MTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92c2hybl9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMTYpOyB9KQotI2RlZmluZSB2c2hybl9uX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92c2hybl9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMTcpOyB9KQotI2RlZmluZSB2c2hybl9uX3U2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Ml90IF9fYSA9IChhKTsgXAotICAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92c2hybl9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMTgpOyB9KQotCi0jZGVmaW5lIHZzaHJfbl9zOChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDhfdCBfX2EgPSAoYSk7IFwKLSAgKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZzaHJfbl92KF9fYSwgX19iLCAwKTsgfSkKLSNkZWZpbmUgdnNocl9uX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBcCi0gIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdnNocl9uX3YoKGludDh4OF90KV9fYSwgX19iLCAxKTsgfSkKLSNkZWZpbmUgdnNocl9uX3MzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBcCi0gIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnNocl9uX3YoKGludDh4OF90KV9fYSwgX19iLCAyKTsgfSkKLSNkZWZpbmUgdnNocl9uX3M2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgxX3QgX19hID0gKGEpOyBcCi0gIChpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdnNocl9uX3YoKGludDh4OF90KV9fYSwgX19iLCAzKTsgfSkKLSNkZWZpbmUgdnNocl9uX3U4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92c2hyX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDE2KTsgfSkKLSNkZWZpbmUgdnNocl9uX3UxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NF90IF9fYSA9IChhKTsgXAotICAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92c2hyX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDE3KTsgfSkKLSNkZWZpbmUgdnNocl9uX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Ml90IF9fYSA9IChhKTsgXAotICAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92c2hyX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDE4KTsgfSkKLSNkZWZpbmUgdnNocl9uX3U2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4MV90IF9fYSA9IChhKTsgXAotICAodWludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92c2hyX25fdigoaW50OHg4X3QpX19hLCBfX2IsIDE5KTsgfSkKLSNkZWZpbmUgdnNocnFfbl9zOChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDE2X3QgX19hID0gKGEpOyBcCi0gIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnNocnFfbl92KF9fYSwgX19iLCAzMik7IH0pCi0jZGVmaW5lIHZzaHJxX25fczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92c2hycV9uX3YoKGludDh4MTZfdClfX2EsIF9fYiwgMzMpOyB9KQotI2RlZmluZSB2c2hycV9uX3MzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBcCi0gIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdnNocnFfbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDM0KTsgfSkKLSNkZWZpbmUgdnNocnFfbl9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Ml90IF9fYSA9IChhKTsgXAotICAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzaHJxX25fdigoaW50OHgxNl90KV9fYSwgX19iLCAzNSk7IH0pCi0jZGVmaW5lIHZzaHJxX25fdTgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnNocnFfbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDQ4KTsgfSkKLSNkZWZpbmUgdnNocnFfbl91MTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnNocnFfbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDQ5KTsgfSkKLSNkZWZpbmUgdnNocnFfbl91MzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnNocnFfbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDUwKTsgfSkKLSNkZWZpbmUgdnNocnFfbl91NjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnNocnFfbl92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDUxKTsgfSkKLQotI2RlZmluZSB2c2xpX25fczgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19hID0gKGEpOyBpbnQ4eDhfdCBfX2IgPSAoYik7IFwKLSAgKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZzbGlfbl92KF9fYSwgX19iLCBfX2MsIDApOyB9KQotI2RlZmluZSB2c2xpX25fczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IGludDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgKGludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92c2xpX25fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDEpOyB9KQotI2RlZmluZSB2c2xpX25fczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IGludDMyeDJfdCBfX2IgPSAoYik7IFwKLSAgKGludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92c2xpX25fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDIpOyB9KQotI2RlZmluZSB2c2xpX25fczY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDFfdCBfX2EgPSAoYSk7IGludDY0eDFfdCBfX2IgPSAoYik7IFwKLSAgKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92c2xpX25fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDMpOyB9KQotI2RlZmluZSB2c2xpX25fdTgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4OF90IF9fYSA9IChhKTsgdWludDh4OF90IF9fYiA9IChiKTsgXAotICAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZzbGlfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMTYpOyB9KQotI2RlZmluZSB2c2xpX25fdTE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0X3QgX19hID0gKGEpOyB1aW50MTZ4NF90IF9fYiA9IChiKTsgXAotICAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92c2xpX25fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE3KTsgfSkKLSNkZWZpbmUgdnNsaV9uX3UzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Ml90IF9fYSA9IChhKTsgdWludDMyeDJfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnNsaV9uX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCAxOCk7IH0pCi0jZGVmaW5lIHZzbGlfbl91NjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDFfdCBfX2EgPSAoYSk7IHVpbnQ2NHgxX3QgX19iID0gKGIpOyBcCi0gICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZzbGlfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMTkpOyB9KQotI2RlZmluZSB2c2xpX25fcDgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OF90IF9fYSA9IChhKTsgcG9seTh4OF90IF9fYiA9IChiKTsgXAotICAocG9seTh4OF90KV9fYnVpbHRpbl9uZW9uX3ZzbGlfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgNCk7IH0pCi0jZGVmaW5lIHZzbGlfbl9wMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDRfdCBfX2EgPSAoYSk7IHBvbHkxNng0X3QgX19iID0gKGIpOyBcCi0gIChwb2x5MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzbGlfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgNSk7IH0pCi0jZGVmaW5lIHZzbGlxX25fczgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNl90IF9fYSA9IChhKTsgaW50OHgxNl90IF9fYiA9IChiKTsgXAotICAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZzbGlxX25fdihfX2EsIF9fYiwgX19jLCAzMik7IH0pCi0jZGVmaW5lIHZzbGlxX25fczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92c2xpcV9uX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDMzKTsgfSkKLSNkZWZpbmUgdnNsaXFfbl9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgXAotICAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzbGlxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzQpOyB9KQotI2RlZmluZSB2c2xpcV9uX3M2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBpbnQ2NHgyX3QgX19iID0gKGIpOyBcCi0gIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnNsaXFfbl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzNSk7IH0pCi0jZGVmaW5lIHZzbGlxX25fdTgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZfdCBfX2EgPSAoYSk7IHVpbnQ4eDE2X3QgX19iID0gKGIpOyBcCi0gICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZzbGlxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNDgpOyB9KQotI2RlZmluZSB2c2xpcV9uX3UxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OF90IF9fYSA9IChhKTsgdWludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnNsaXFfbl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCA0OSk7IH0pCi0jZGVmaW5lIHZzbGlxX25fdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MzJ4NF90IF9fYiA9IChiKTsgXAotICAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92c2xpcV9uX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDUwKTsgfSkKLSNkZWZpbmUgdnNsaXFfbl91NjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJfdCBfX2EgPSAoYSk7IHVpbnQ2NHgyX3QgX19iID0gKGIpOyBcCi0gICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzbGlxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNTEpOyB9KQotI2RlZmluZSB2c2xpcV9uX3A4KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2X3QgX19hID0gKGEpOyBwb2x5OHgxNl90IF9fYiA9IChiKTsgXAotICAocG9seTh4MTZfdClfX2J1aWx0aW5fbmVvbl92c2xpcV9uX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDM2KTsgfSkKLSNkZWZpbmUgdnNsaXFfbl9wMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDhfdCBfX2EgPSAoYSk7IHBvbHkxNng4X3QgX19iID0gKGIpOyBcCi0gIChwb2x5MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZzbGlxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzcpOyB9KQotCi0jZGVmaW5lIHZzcmFfbl9zOChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDhfdCBfX2EgPSAoYSk7IGludDh4OF90IF9fYiA9IChiKTsgXAotICAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnNyYV9uX3YoX19hLCBfX2IsIF9fYywgMCk7IH0pCi0jZGVmaW5lIHZzcmFfbl9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NF90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgXAotICAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzcmFfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMSk7IH0pCi0jZGVmaW5lIHZzcmFfbl9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Ml90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzcmFfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMik7IH0pCi0jZGVmaW5lIHZzcmFfbl9zNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MV90IF9fYSA9IChhKTsgaW50NjR4MV90IF9fYiA9IChiKTsgXAotICAoaW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZzcmFfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMyk7IH0pCi0jZGVmaW5lIHZzcmFfbl91OChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4X3QgX19hID0gKGEpOyB1aW50OHg4X3QgX19iID0gKGIpOyBcCi0gICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnNyYV9uX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCAxNik7IH0pCi0jZGVmaW5lIHZzcmFfbl91MTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IHVpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzcmFfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMTcpOyB9KQotI2RlZmluZSB2c3JhX25fdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hID0gKGEpOyB1aW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92c3JhX25fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE4KTsgfSkKLSNkZWZpbmUgdnNyYV9uX3U2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4MV90IF9fYSA9IChhKTsgdWludDY0eDFfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdnNyYV9uX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCAxOSk7IH0pCi0jZGVmaW5lIHZzcmFxX25fczgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNl90IF9fYSA9IChhKTsgaW50OHgxNl90IF9fYiA9IChiKTsgXAotICAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZzcmFxX25fdihfX2EsIF9fYiwgX19jLCAzMik7IH0pCi0jZGVmaW5lIHZzcmFxX25fczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92c3JhcV9uX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDMzKTsgfSkKLSNkZWZpbmUgdnNyYXFfbl9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgXAotICAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzcmFxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzQpOyB9KQotI2RlZmluZSB2c3JhcV9uX3M2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBpbnQ2NHgyX3QgX19iID0gKGIpOyBcCi0gIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnNyYXFfbl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzNSk7IH0pCi0jZGVmaW5lIHZzcmFxX25fdTgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZfdCBfX2EgPSAoYSk7IHVpbnQ4eDE2X3QgX19iID0gKGIpOyBcCi0gICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZzcmFxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNDgpOyB9KQotI2RlZmluZSB2c3JhcV9uX3UxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OF90IF9fYSA9IChhKTsgdWludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnNyYXFfbl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCA0OSk7IH0pCi0jZGVmaW5lIHZzcmFxX25fdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MzJ4NF90IF9fYiA9IChiKTsgXAotICAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92c3JhcV9uX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDUwKTsgfSkKLSNkZWZpbmUgdnNyYXFfbl91NjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJfdCBfX2EgPSAoYSk7IHVpbnQ2NHgyX3QgX19iID0gKGIpOyBcCi0gICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzcmFxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNTEpOyB9KQotCi0jZGVmaW5lIHZzcmlfbl9zOChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDhfdCBfX2EgPSAoYSk7IGludDh4OF90IF9fYiA9IChiKTsgXAotICAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnNyaV9uX3YoX19hLCBfX2IsIF9fYywgMCk7IH0pCi0jZGVmaW5lIHZzcmlfbl9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NF90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgXAotICAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Zzcmlfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMSk7IH0pCi0jZGVmaW5lIHZzcmlfbl9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Ml90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3Zzcmlfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMik7IH0pCi0jZGVmaW5lIHZzcmlfbl9zNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MV90IF9fYSA9IChhKTsgaW50NjR4MV90IF9fYiA9IChiKTsgXAotICAoaW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3Zzcmlfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMyk7IH0pCi0jZGVmaW5lIHZzcmlfbl91OChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4X3QgX19hID0gKGEpOyB1aW50OHg4X3QgX19iID0gKGIpOyBcCi0gICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnNyaV9uX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCAxNik7IH0pCi0jZGVmaW5lIHZzcmlfbl91MTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IHVpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Zzcmlfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMTcpOyB9KQotI2RlZmluZSB2c3JpX25fdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hID0gKGEpOyB1aW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92c3JpX25fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE4KTsgfSkKLSNkZWZpbmUgdnNyaV9uX3U2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4MV90IF9fYSA9IChhKTsgdWludDY0eDFfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdnNyaV9uX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCAxOSk7IH0pCi0jZGVmaW5lIHZzcmlfbl9wOChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHg4X3QgX19hID0gKGEpOyBwb2x5OHg4X3QgX19iID0gKGIpOyBcCi0gIChwb2x5OHg4X3QpX19idWlsdGluX25lb25fdnNyaV9uX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCA0KTsgfSkKLSNkZWZpbmUgdnNyaV9uX3AxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4NF90IF9fYSA9IChhKTsgcG9seTE2eDRfdCBfX2IgPSAoYik7IFwKLSAgKHBvbHkxNng0X3QpX19idWlsdGluX25lb25fdnNyaV9uX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCA1KTsgfSkKLSNkZWZpbmUgdnNyaXFfbl9zOChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDE2X3QgX19hID0gKGEpOyBpbnQ4eDE2X3QgX19iID0gKGIpOyBcCi0gIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnNyaXFfbl92KF9fYSwgX19iLCBfX2MsIDMyKTsgfSkKLSNkZWZpbmUgdnNyaXFfbl9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYSA9IChhKTsgaW50MTZ4OF90IF9fYiA9IChiKTsgXAotICAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZzcmlxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzMpOyB9KQotI2RlZmluZSB2c3JpcV9uX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdnNyaXFfbl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzNCk7IH0pCi0jZGVmaW5lIHZzcmlxX25fczY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IGludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92c3JpcV9uX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDM1KTsgfSkKLSNkZWZpbmUgdnNyaXFfbl91OChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHgxNl90IF9fYSA9IChhKTsgdWludDh4MTZfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnNyaXFfbl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCA0OCk7IH0pCi0jZGVmaW5lIHZzcmlxX25fdTE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4X3QgX19hID0gKGEpOyB1aW50MTZ4OF90IF9fYiA9IChiKTsgXAotICAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92c3JpcV9uX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDQ5KTsgfSkKLSNkZWZpbmUgdnNyaXFfbl91MzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDRfdCBfX2EgPSAoYSk7IHVpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzcmlxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNTApOyB9KQotI2RlZmluZSB2c3JpcV9uX3U2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Ml90IF9fYSA9IChhKTsgdWludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnNyaXFfbl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCA1MSk7IH0pCi0jZGVmaW5lIHZzcmlxX25fcDgoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4MTZfdCBfX2EgPSAoYSk7IHBvbHk4eDE2X3QgX19iID0gKGIpOyBcCi0gIChwb2x5OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZzcmlxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzYpOyB9KQotI2RlZmluZSB2c3JpcV9uX3AxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4OF90IF9fYSA9IChhKTsgcG9seTE2eDhfdCBfX2IgPSAoYik7IFwKLSAgKHBvbHkxNng4X3QpX19idWlsdGluX25lb25fdnNyaXFfbl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzNyk7IH0pCi0KLSNkZWZpbmUgdnN0MXFfdTgoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfdihfX2EsIChpbnQ4eDE2X3QpX19iLCA0OCk7IH0pCi0jZGVmaW5lIHZzdDFxX3UxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV92KF9fYSwgKGludDh4MTZfdClfX2IsIDQ5KTsgfSkKLSNkZWZpbmUgdnN0MXFfdTMyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3YoX19hLCAoaW50OHgxNl90KV9fYiwgNTApOyB9KQotI2RlZmluZSB2c3QxcV91NjQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfdihfX2EsIChpbnQ4eDE2X3QpX19iLCA1MSk7IH0pCi0jZGVmaW5lIHZzdDFxX3M4KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4MTZfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfdihfX2EsIF9fYiwgMzIpOyB9KQotI2RlZmluZSB2c3QxcV9zMTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV92KF9fYSwgKGludDh4MTZfdClfX2IsIDMzKTsgfSkKLSNkZWZpbmUgdnN0MXFfczMyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfdihfX2EsIChpbnQ4eDE2X3QpX19iLCAzNCk7IH0pCi0jZGVmaW5lIHZzdDFxX3M2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3YoX19hLCAoaW50OHgxNl90KV9fYiwgMzUpOyB9KQotI2RlZmluZSB2c3QxcV9mMTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng4X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3YoX19hLCAoaW50OHgxNl90KV9fYiwgMzkpOyB9KQotI2RlZmluZSB2c3QxcV9mMzIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3YoX19hLCAoaW50OHgxNl90KV9fYiwgNDApOyB9KQotI2RlZmluZSB2c3QxcV9wOChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHgxNl90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV92KF9fYSwgKGludDh4MTZfdClfX2IsIDM2KTsgfSkKLSNkZWZpbmUgdnN0MXFfcDE2KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3YoX19hLCAoaW50OHgxNl90KV9fYiwgMzcpOyB9KQotI2RlZmluZSB2c3QxX3U4KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV92KF9fYSwgKGludDh4OF90KV9fYiwgMTYpOyB9KQotI2RlZmluZSB2c3QxX3UxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3YoX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0pCi0jZGVmaW5lIHZzdDFfdTMyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfdihfX2EsIChpbnQ4eDhfdClfX2IsIDE4KTsgfSkKLSNkZWZpbmUgdnN0MV91NjQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDFfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV92KF9fYSwgKGludDh4OF90KV9fYiwgMTkpOyB9KQotI2RlZmluZSB2c3QxX3M4KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4OF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3YoX19hLCBfX2IsIDApOyB9KQotI2RlZmluZSB2c3QxX3MxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfdihfX2EsIChpbnQ4eDhfdClfX2IsIDEpOyB9KQotI2RlZmluZSB2c3QxX3MzMihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfdihfX2EsIChpbnQ4eDhfdClfX2IsIDIpOyB9KQotI2RlZmluZSB2c3QxX3M2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgxX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfdihfX2EsIChpbnQ4eDhfdClfX2IsIDMpOyB9KQotI2RlZmluZSB2c3QxX2YxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV92KF9fYSwgKGludDh4OF90KV9fYiwgNyk7IH0pCi0jZGVmaW5lIHZzdDFfZjMyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3YoX19hLCAoaW50OHg4X3QpX19iLCA4KTsgfSkKLSNkZWZpbmUgdnN0MV9wOChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHg4X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfdihfX2EsIChpbnQ4eDhfdClfX2IsIDQpOyB9KQotI2RlZmluZSB2c3QxX3AxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3YoX19hLCAoaW50OHg4X3QpX19iLCA1KTsgfSkKLQotI2RlZmluZSB2c3QxcV9sYW5lX3U4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNDgpOyB9KQotI2RlZmluZSB2c3QxcV9sYW5lX3UxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDQ5KTsgfSkKLSNkZWZpbmUgdnN0MXFfbGFuZV91MzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCA1MCk7IH0pCi0jZGVmaW5lIHZzdDFxX2xhbmVfdTY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNTEpOyB9KQotI2RlZmluZSB2c3QxcV9sYW5lX3M4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNl90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV9sYW5lX3YoX19hLCBfX2IsIF9fYywgMzIpOyB9KQotI2RlZmluZSB2c3QxcV9sYW5lX3MxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzMpOyB9KQotI2RlZmluZSB2c3QxcV9sYW5lX3MzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzQpOyB9KQotI2RlZmluZSB2c3QxcV9sYW5lX3M2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzUpOyB9KQotI2RlZmluZSB2c3QxcV9sYW5lX2YxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4OF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzOSk7IH0pCi0jZGVmaW5lIHZzdDFxX2xhbmVfZjMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDQwKTsgfSkKLSNkZWZpbmUgdnN0MXFfbGFuZV9wOChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDM2KTsgfSkKLSNkZWZpbmUgdnN0MXFfbGFuZV9wMTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4OF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzNyk7IH0pCi0jZGVmaW5lIHZzdDFfbGFuZV91OChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE2KTsgfSkKLSNkZWZpbmUgdnN0MV9sYW5lX3UxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYiwgX19jLCAxNyk7IH0pCi0jZGVmaW5lIHZzdDFfbGFuZV91MzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMTgpOyB9KQotI2RlZmluZSB2c3QxX2xhbmVfdTY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDFfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDE5KTsgfSkKLSNkZWZpbmUgdnN0MV9sYW5lX3M4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfbGFuZV92KF9fYSwgX19iLCBfX2MsIDApOyB9KQotI2RlZmluZSB2c3QxX2xhbmVfczE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgMSk7IH0pCi0jZGVmaW5lIHZzdDFfbGFuZV9zMzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYiwgX19jLCAyKTsgfSkKLSNkZWZpbmUgdnN0MV9sYW5lX3M2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDFfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDMpOyB9KQotI2RlZmluZSB2c3QxX2xhbmVfZjE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYiwgX19jLCA3KTsgfSkKLSNkZWZpbmUgdnN0MV9sYW5lX2YzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgOCk7IH0pCi0jZGVmaW5lIHZzdDFfbGFuZV9wOChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDhfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDQpOyB9KQotI2RlZmluZSB2c3QxX2xhbmVfcDE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDUpOyB9KQotCi0jZGVmaW5lIHZzdDJxX3U4KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MnFfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCA0OCk7IH0pCi0jZGVmaW5lIHZzdDJxX3UxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgNDkpOyB9KQotI2RlZmluZSB2c3QycV91MzIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDR4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QycV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIDUwKTsgfSkKLSNkZWZpbmUgdnN0MnFfczgoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJxX3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCAzMik7IH0pCi0jZGVmaW5lIHZzdDJxX3MxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MnFfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAzMyk7IH0pCi0jZGVmaW5lIHZzdDJxX3MzMihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MnFfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAzNCk7IH0pCi0jZGVmaW5lIHZzdDJxX2YxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDh4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QycV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIDM5KTsgfSkKLSNkZWZpbmUgdnN0MnFfZjMyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgNDApOyB9KQotI2RlZmluZSB2c3QycV9wOChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHgxNngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgMzYpOyB9KQotI2RlZmluZSB2c3QycV9wMTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDh4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QycV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIDM3KTsgfSkKLSNkZWZpbmUgdnN0Ml91OChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAxNik7IH0pCi0jZGVmaW5lIHZzdDJfdTE2KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAxNyk7IH0pCi0jZGVmaW5lIHZzdDJfdTMyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAxOCk7IH0pCi0jZGVmaW5lIHZzdDJfdTY0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAxOSk7IH0pCi0jZGVmaW5lIHZzdDJfczgoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml92KF9fYSwgX19iLnZhbFswXSwgX19iLnZhbFsxXSwgMCk7IH0pCi0jZGVmaW5lIHZzdDJfczE2KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDR4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QyX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIDEpOyB9KQotI2RlZmluZSB2c3QyX3MzMihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAyKTsgfSkKLSNkZWZpbmUgdnN0Ml9zNjQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgMyk7IH0pCi0jZGVmaW5lIHZzdDJfZjE2KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4NHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgNyk7IH0pCi0jZGVmaW5lIHZzdDJfZjMyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4MngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgOCk7IH0pCi0jZGVmaW5lIHZzdDJfcDgoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgNCk7IH0pCi0jZGVmaW5lIHZzdDJfcDE2KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCA1KTsgfSkKLQotI2RlZmluZSB2c3QycV9sYW5lX3UxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIF9fYywgNDkpOyB9KQotI2RlZmluZSB2c3QycV9sYW5lX3UzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIF9fYywgNTApOyB9KQotI2RlZmluZSB2c3QycV9sYW5lX3MxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDh4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QycV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgX19jLCAzMyk7IH0pCi0jZGVmaW5lIHZzdDJxX2xhbmVfczMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCBfX2MsIDM0KTsgfSkKLSNkZWZpbmUgdnN0MnFfbGFuZV9mMTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDh4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QycV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgX19jLCAzOSk7IH0pCi0jZGVmaW5lIHZzdDJxX2xhbmVfZjMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIF9fYywgNDApOyB9KQotI2RlZmluZSB2c3QycV9sYW5lX3AxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIF9fYywgMzcpOyB9KQotI2RlZmluZSB2c3QyX2xhbmVfdTgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIF9fYywgMTYpOyB9KQotI2RlZmluZSB2c3QyX2xhbmVfdTE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDR4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QyX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgX19jLCAxNyk7IH0pCi0jZGVmaW5lIHZzdDJfbGFuZV91MzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4MngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCBfX2MsIDE4KTsgfSkKLSNkZWZpbmUgdnN0Ml9sYW5lX3M4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml9sYW5lX3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2MsIDApOyB9KQotI2RlZmluZSB2c3QyX2xhbmVfczE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCBfX2MsIDEpOyB9KQotI2RlZmluZSB2c3QyX2xhbmVfczMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4MngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCBfX2MsIDIpOyB9KQotI2RlZmluZSB2c3QyX2xhbmVfZjE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIF9fYywgNyk7IH0pCi0jZGVmaW5lIHZzdDJfbGFuZV9mMzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QyX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgX19jLCA4KTsgfSkKLSNkZWZpbmUgdnN0Ml9sYW5lX3A4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCBfX2MsIDQpOyB9KQotI2RlZmluZSB2c3QyX2xhbmVfcDE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDR4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QyX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgX19jLCA1KTsgfSkKLQotI2RlZmluZSB2c3QzcV91OChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHgxNngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCA0OCk7IH0pCi0jZGVmaW5lIHZzdDNxX3UxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCA0OSk7IH0pCi0jZGVmaW5lIHZzdDNxX3UzMihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCA1MCk7IH0pCi0jZGVmaW5lIHZzdDNxX3M4KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4MTZ4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzcV92KF9fYSwgX19iLnZhbFswXSwgX19iLnZhbFsxXSwgX19iLnZhbFsyXSwgMzIpOyB9KQotI2RlZmluZSB2c3QzcV9zMTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAzMyk7IH0pCi0jZGVmaW5lIHZzdDNxX3MzMihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M3FfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIDM0KTsgfSkKLSNkZWZpbmUgdnN0M3FfZjE2KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4OHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAzOSk7IH0pCi0jZGVmaW5lIHZzdDNxX2YzMihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDR4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzcV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgNDApOyB9KQotI2RlZmluZSB2c3QzcV9wOChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHgxNngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAzNik7IH0pCi0jZGVmaW5lIHZzdDNxX3AxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4OHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAzNyk7IH0pCi0jZGVmaW5lIHZzdDNfdTgoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4OHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIDE2KTsgfSkKLSNkZWZpbmUgdnN0M191MTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDR4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAxNyk7IH0pCi0jZGVmaW5lIHZzdDNfdTMyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyeDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M192KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgMTgpOyB9KQotI2RlZmluZSB2c3QzX3U2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4MXgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIDE5KTsgfSkKLSNkZWZpbmUgdnN0M19zOChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDh4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzX3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCAwKTsgfSkKLSNkZWZpbmUgdnN0M19zMTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIDEpOyB9KQotI2RlZmluZSB2c3QzX3MzMihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyeDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M192KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgMik7IH0pCi0jZGVmaW5lIHZzdDNfczY0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDF4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAzKTsgfSkKLSNkZWZpbmUgdnN0M19mMTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng0eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M192KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgNyk7IH0pCi0jZGVmaW5lIHZzdDNfZjMyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4MngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIDgpOyB9KQotI2RlZmluZSB2c3QzX3A4KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDh4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCA0KTsgfSkKLSNkZWZpbmUgdnN0M19wMTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDR4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCA1KTsgfSkKLQotI2RlZmluZSB2c3QzcV9sYW5lX3UxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M3FfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgX19jLCA0OSk7IH0pCi0jZGVmaW5lIHZzdDNxX2xhbmVfdTMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDR4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzcV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCBfX2MsIDUwKTsgfSkKLSNkZWZpbmUgdnN0M3FfbGFuZV9zMTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M3FfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgX19jLCAzMyk7IH0pCi0jZGVmaW5lIHZzdDNxX2xhbmVfczMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgMzQpOyB9KQotI2RlZmluZSB2c3QzcV9sYW5lX2YxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4OHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgMzkpOyB9KQotI2RlZmluZSB2c3QzcV9sYW5lX2YzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgNDApOyB9KQotI2RlZmluZSB2c3QzcV9sYW5lX3AxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M3FfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgX19jLCAzNyk7IH0pCi0jZGVmaW5lIHZzdDNfbGFuZV91OChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDh4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIF9fYywgMTYpOyB9KQotI2RlZmluZSB2c3QzX2xhbmVfdTE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDR4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIF9fYywgMTcpOyB9KQotI2RlZmluZSB2c3QzX2xhbmVfdTMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJ4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIF9fYywgMTgpOyB9KQotI2RlZmluZSB2c3QzX2xhbmVfczgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDh4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzX2xhbmVfdihfX2EsIF9fYi52YWxbMF0sIF9fYi52YWxbMV0sIF9fYi52YWxbMl0sIF9fYywgMCk7IH0pCi0jZGVmaW5lIHZzdDNfbGFuZV9zMTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M19sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCBfX2MsIDEpOyB9KQotI2RlZmluZSB2c3QzX2xhbmVfczMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4MngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgX19jLCAyKTsgfSkKLSNkZWZpbmUgdnN0M19sYW5lX2YxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4NHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgX19jLCA3KTsgfSkKLSNkZWZpbmUgdnN0M19sYW5lX2YzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4MngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgX19jLCA4KTsgfSkKLSNkZWZpbmUgdnN0M19sYW5lX3A4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgX19jLCA0KTsgfSkKLSNkZWZpbmUgdnN0M19sYW5lX3AxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng0eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M19sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCBfX2MsIDUpOyB9KQotCi0jZGVmaW5lIHZzdDRxX3U4KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NHFfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgNDgpOyB9KQotI2RlZmluZSB2c3Q0cV91MTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDh4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0cV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCA0OSk7IH0pCi0jZGVmaW5lIHZzdDRxX3UzMihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIDUwKTsgfSkKLSNkZWZpbmUgdnN0NHFfczgoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRxX3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCBfX2IudmFsWzNdLCAzMik7IH0pCi0jZGVmaW5lIHZzdDRxX3MxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NHFfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgMzMpOyB9KQotI2RlZmluZSB2c3Q0cV9zMzIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIDM0KTsgfSkKLSNkZWZpbmUgdnN0NHFfZjE2KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4OHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIDM5KTsgfSkKLSNkZWZpbmUgdnN0NHFfZjMyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIDQwKTsgfSkKLSNkZWZpbmUgdnN0NHFfcDgoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4MTZ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0cV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCAzNik7IH0pCi0jZGVmaW5lIHZzdDRxX3AxNihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4OHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIDM3KTsgfSkKLSNkZWZpbmUgdnN0NF91OChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NF92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIDE2KTsgfSkKLSNkZWZpbmUgdnN0NF91MTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDR4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0X3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgMTcpOyB9KQotI2RlZmluZSB2c3Q0X3UzMihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Mng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCAxOCk7IH0pCi0jZGVmaW5lIHZzdDRfdTY0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NF92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIDE5KTsgfSkKLSNkZWZpbmUgdnN0NF9zOChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDh4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0X3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCBfX2IudmFsWzNdLCAwKTsgfSkKLSNkZWZpbmUgdnN0NF9zMTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCAxKTsgfSkKLSNkZWZpbmUgdnN0NF9zMzIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Mng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCAyKTsgfSkKLSNkZWZpbmUgdnN0NF9zNjQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCAzKTsgfSkKLSNkZWZpbmUgdnN0NF9mMTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng0eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NF92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIDcpOyB9KQotI2RlZmluZSB2c3Q0X2YzMihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0X3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgOCk7IH0pCi0jZGVmaW5lIHZzdDRfcDgoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCA0KTsgfSkKLSNkZWZpbmUgdnN0NF9wMTYoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDR4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0X3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgNSk7IH0pCi0KLSNkZWZpbmUgdnN0NHFfbGFuZV91MTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgX19jLCA0OSk7IH0pCi0jZGVmaW5lIHZzdDRxX2xhbmVfdTMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDR4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgNTApOyB9KQotI2RlZmluZSB2c3Q0cV9sYW5lX3MxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDh4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgMzMpOyB9KQotI2RlZmluZSB2c3Q0cV9sYW5lX3MzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDR4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgMzQpOyB9KQotI2RlZmluZSB2c3Q0cV9sYW5lX2YxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4OHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgX19jLCAzOSk7IH0pCi0jZGVmaW5lIHZzdDRxX2xhbmVfZjMyKF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NHFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCBfX2MsIDQwKTsgfSkKLSNkZWZpbmUgdnN0NHFfbGFuZV9wMTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4OHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgX19jLCAzNyk7IH0pCi0jZGVmaW5lIHZzdDRfbGFuZV91OChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDh4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0X2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCBfX2MsIDE2KTsgfSkKLSNkZWZpbmUgdnN0NF9sYW5lX3UxNihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NF9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgX19jLCAxNyk7IH0pCi0jZGVmaW5lIHZzdDRfbGFuZV91MzIoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Mng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIF9fYywgMTgpOyB9KQotI2RlZmluZSB2c3Q0X2xhbmVfczgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDh4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0X2xhbmVfdihfX2EsIF9fYi52YWxbMF0sIF9fYi52YWxbMV0sIF9fYi52YWxbMl0sIF9fYi52YWxbM10sIF9fYywgMCk7IH0pCi0jZGVmaW5lIHZzdDRfbGFuZV9zMTYoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NF9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgX19jLCAxKTsgfSkKLSNkZWZpbmUgdnN0NF9sYW5lX3MzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0X2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCBfX2MsIDIpOyB9KQotI2RlZmluZSB2c3Q0X2xhbmVfZjE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng0eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NF9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgX19jLCA3KTsgfSkKLSNkZWZpbmUgdnN0NF9sYW5lX2YzMihfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4Mng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIF9fYywgOCk7IH0pCi0jZGVmaW5lIHZzdDRfbGFuZV9wOChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDh4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0X2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCBfX2MsIDQpOyB9KQotI2RlZmluZSB2c3Q0X2xhbmVfcDE2KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDR4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0X2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCBfX2MsIDUpOyB9KQotCi1fX2FpIGludDh4OF90IHZzdWJfczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAtIF9fYjsgfQotX19haSBpbnQxNng0X3QgdnN1Yl9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gX19hIC0gX19iOyB9Ci1fX2FpIGludDMyeDJfdCB2c3ViX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgLSBfX2I7IH0KLV9fYWkgaW50NjR4MV90IHZzdWJfczY0KGludDY0eDFfdCBfX2EsIGludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAtIF9fYjsgfQotX19haSBmbG9hdDMyeDJfdCB2c3ViX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICByZXR1cm4gX19hIC0gX19iOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2c3ViX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAtIF9fYjsgfQotX19haSB1aW50MTZ4NF90IHZzdWJfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gX19hIC0gX19iOyB9Ci1fX2FpIHVpbnQzMngyX3QgdnN1Yl91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgLSBfX2I7IH0KLV9fYWkgdWludDY0eDFfdCB2c3ViX3U2NCh1aW50NjR4MV90IF9fYSwgdWludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAtIF9fYjsgfQotX19haSBpbnQ4eDE2X3QgdnN1YnFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19hIC0gX19iOyB9Ci1fX2FpIGludDE2eDhfdCB2c3VicV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19hIC0gX19iOyB9Ci1fX2FpIGludDMyeDRfdCB2c3VicV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hIC0gX19iOyB9Ci1fX2FpIGludDY0eDJfdCB2c3VicV9zNjQoaW50NjR4Ml90IF9fYSwgaW50NjR4Ml90IF9fYikgewotICByZXR1cm4gX19hIC0gX19iOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZzdWJxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hIC0gX19iOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnN1YnFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgLSBfX2I7IH0KLV9fYWkgdWludDE2eDhfdCB2c3VicV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgLSBfX2I7IH0KLV9fYWkgdWludDMyeDRfdCB2c3VicV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgLSBfX2I7IH0KLV9fYWkgdWludDY0eDJfdCB2c3VicV91NjQodWludDY0eDJfdCBfX2EsIHVpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiBfX2EgLSBfX2I7IH0KLQotX19haSBpbnQ4eDhfdCB2c3ViaG5fczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92c3ViaG5fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDApOyB9Ci1fX2FpIGludDE2eDRfdCB2c3ViaG5fczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng0X3QpX19idWlsdGluX25lb25fdnN1YmhuX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAxKTsgfQotX19haSBpbnQzMngyX3QgdnN1YmhuX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzdWJobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMik7IH0KLV9fYWkgdWludDh4OF90IHZzdWJobl91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZzdWJobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMTYpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdnN1YmhuX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzdWJobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdnN1YmhuX3U2NCh1aW50NjR4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzdWJobl92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMTgpOyB9Ci0KLV9fYWkgaW50MTZ4OF90IHZzdWJsX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiB2bW92bF9zOChfX2EpIC0gdm1vdmxfczgoX19iKTsgfQotX19haSBpbnQzMng0X3QgdnN1YmxfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIHZtb3ZsX3MxNihfX2EpIC0gdm1vdmxfczE2KF9fYik7IH0KLV9fYWkgaW50NjR4Ml90IHZzdWJsX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiB2bW92bF9zMzIoX19hKSAtIHZtb3ZsX3MzMihfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdnN1YmxfdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gdm1vdmxfdTgoX19hKSAtIHZtb3ZsX3U4KF9fYik7IH0KLV9fYWkgdWludDMyeDRfdCB2c3VibF91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiB2bW92bF91MTYoX19hKSAtIHZtb3ZsX3UxNihfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnN1YmxfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gdm1vdmxfdTMyKF9fYSkgLSB2bW92bF91MzIoX19iKTsgfQotCi1fX2FpIGludDE2eDhfdCB2c3Vid19zOChpbnQxNng4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAtIHZtb3ZsX3M4KF9fYik7IH0KLV9fYWkgaW50MzJ4NF90IHZzdWJ3X3MxNihpbnQzMng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgLSB2bW92bF9zMTYoX19iKTsgfQotX19haSBpbnQ2NHgyX3QgdnN1YndfczMyKGludDY0eDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAtIHZtb3ZsX3MzMihfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdnN1YndfdTgodWludDE2eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAtIHZtb3ZsX3U4KF9fYik7IH0KLV9fYWkgdWludDMyeDRfdCB2c3Vid191MTYodWludDMyeDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgLSB2bW92bF91MTYoX19iKTsgfQotX19haSB1aW50NjR4Ml90IHZzdWJ3X3UzMih1aW50NjR4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAtIHZtb3ZsX3UzMihfX2IpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZ0YmwxX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnRibDFfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNik7IH0KLV9fYWkgaW50OHg4X3QgdnRibDFfczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJsMV92KF9fYSwgX19iLCAwKTsgfQotX19haSBwb2x5OHg4X3QgdnRibDFfcDgocG9seTh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJsMV92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDQpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZ0YmwyX3U4KHVpbnQ4eDh4Ml90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJsMl92KChpbnQ4eDhfdClfX2EudmFsWzBdLCAoaW50OHg4X3QpX19hLnZhbFsxXSwgKGludDh4OF90KV9fYiwgMTYpOyB9Ci1fX2FpIGludDh4OF90IHZ0YmwyX3M4KGludDh4OHgyX3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJsMl92KF9fYS52YWxbMF0sIF9fYS52YWxbMV0sIF9fYiwgMCk7IH0KLV9fYWkgcG9seTh4OF90IHZ0YmwyX3A4KHBvbHk4eDh4Ml90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJsMl92KChpbnQ4eDhfdClfX2EudmFsWzBdLCAoaW50OHg4X3QpX19hLnZhbFsxXSwgKGludDh4OF90KV9fYiwgNCk7IH0KLQotX19haSB1aW50OHg4X3QgdnRibDNfdTgodWludDh4OHgzX3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Z0YmwzX3YoKGludDh4OF90KV9fYS52YWxbMF0sIChpbnQ4eDhfdClfX2EudmFsWzFdLCAoaW50OHg4X3QpX19hLnZhbFsyXSwgKGludDh4OF90KV9fYiwgMTYpOyB9Ci1fX2FpIGludDh4OF90IHZ0YmwzX3M4KGludDh4OHgzX3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJsM192KF9fYS52YWxbMF0sIF9fYS52YWxbMV0sIF9fYS52YWxbMl0sIF9fYiwgMCk7IH0KLV9fYWkgcG9seTh4OF90IHZ0YmwzX3A4KHBvbHk4eDh4M190IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJsM192KChpbnQ4eDhfdClfX2EudmFsWzBdLCAoaW50OHg4X3QpX19hLnZhbFsxXSwgKGludDh4OF90KV9fYS52YWxbMl0sIChpbnQ4eDhfdClfX2IsIDQpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZ0Ymw0X3U4KHVpbnQ4eDh4NF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJsNF92KChpbnQ4eDhfdClfX2EudmFsWzBdLCAoaW50OHg4X3QpX19hLnZhbFsxXSwgKGludDh4OF90KV9fYS52YWxbMl0sIChpbnQ4eDhfdClfX2EudmFsWzNdLCAoaW50OHg4X3QpX19iLCAxNik7IH0KLV9fYWkgaW50OHg4X3QgdnRibDRfczgoaW50OHg4eDRfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Z0Ymw0X3YoX19hLnZhbFswXSwgX19hLnZhbFsxXSwgX19hLnZhbFsyXSwgX19hLnZhbFszXSwgX19iLCAwKTsgfQotX19haSBwb2x5OHg4X3QgdnRibDRfcDgocG9seTh4OHg0X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAocG9seTh4OF90KV9fYnVpbHRpbl9uZW9uX3Z0Ymw0X3YoKGludDh4OF90KV9fYS52YWxbMF0sIChpbnQ4eDhfdClfX2EudmFsWzFdLCAoaW50OHg4X3QpX19hLnZhbFsyXSwgKGludDh4OF90KV9fYS52YWxbM10sIChpbnQ4eDhfdClfX2IsIDQpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZ0YngxX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IsIHVpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnRieDFfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAoaW50OHg4X3QpX19jLCAxNik7IH0KLV9fYWkgaW50OHg4X3QgdnRieDFfczgoaW50OHg4X3QgX19hLCBpbnQ4eDhfdCBfX2IsIGludDh4OF90IF9fYykgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Z0YngxX3YoX19hLCBfX2IsIF9fYywgMCk7IH0KLV9fYWkgcG9seTh4OF90IHZ0YngxX3A4KHBvbHk4eDhfdCBfX2EsIHBvbHk4eDhfdCBfX2IsIHVpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIChwb2x5OHg4X3QpX19idWlsdGluX25lb25fdnRieDFfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAoaW50OHg4X3QpX19jLCA0KTsgfQotCi1fX2FpIHVpbnQ4eDhfdCB2dGJ4Ml91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4eDJfdCBfX2IsIHVpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnRieDJfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2MsIDE2KTsgfQotX19haSBpbnQ4eDhfdCB2dGJ4Ml9zOChpbnQ4eDhfdCBfX2EsIGludDh4OHgyX3QgX19iLCBpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJ4Ml92KF9fYSwgX19iLnZhbFswXSwgX19iLnZhbFsxXSwgX19jLCAwKTsgfQotX19haSBwb2x5OHg4X3QgdnRieDJfcDgocG9seTh4OF90IF9fYSwgcG9seTh4OHgyX3QgX19iLCB1aW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiAocG9seTh4OF90KV9fYnVpbHRpbl9uZW9uX3Z0YngyX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19jLCA0KTsgfQotCi1fX2FpIHVpbnQ4eDhfdCB2dGJ4M191OCh1aW50OHg4X3QgX19hLCB1aW50OHg4eDNfdCBfX2IsIHVpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnRieDNfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19jLCAxNik7IH0KLV9fYWkgaW50OHg4X3QgdnRieDNfczgoaW50OHg4X3QgX19hLCBpbnQ4eDh4M190IF9fYiwgaW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnRieDNfdihfX2EsIF9fYi52YWxbMF0sIF9fYi52YWxbMV0sIF9fYi52YWxbMl0sIF9fYywgMCk7IH0KLV9fYWkgcG9seTh4OF90IHZ0YngzX3A4KHBvbHk4eDhfdCBfX2EsIHBvbHk4eDh4M190IF9fYiwgdWludDh4OF90IF9fYykgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJ4M192KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2MsIDQpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZ0Yng0X3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDh4NF90IF9fYiwgdWludDh4OF90IF9fYykgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJ4NF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCAoaW50OHg4X3QpX19jLCAxNik7IH0KLV9fYWkgaW50OHg4X3QgdnRieDRfczgoaW50OHg4X3QgX19hLCBpbnQ4eDh4NF90IF9fYiwgaW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnRieDRfdihfX2EsIF9fYi52YWxbMF0sIF9fYi52YWxbMV0sIF9fYi52YWxbMl0sIF9fYi52YWxbM10sIF9fYywgMCk7IH0KLV9fYWkgcG9seTh4OF90IHZ0Yng0X3A4KHBvbHk4eDhfdCBfX2EsIHBvbHk4eDh4NF90IF9fYiwgdWludDh4OF90IF9fYykgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2J1aWx0aW5fbmVvbl92dGJ4NF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCAoaW50OHg4X3QpX19jLCA0KTsgfQotCi1fX2FpIGludDh4OHgyX3QgdnRybl9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICBpbnQ4eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z0cm5fdigmciwgX19hLCBfX2IsIDApOyByZXR1cm4gcjsgfQotX19haSBpbnQxNng0eDJfdCB2dHJuX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIGludDE2eDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z0cm5fdigmciwgKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMSk7IHJldHVybiByOyB9Ci1fX2FpIGludDMyeDJ4Ml90IHZ0cm5fczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgaW50MzJ4MngyX3QgcjsgX19idWlsdGluX25lb25fdnRybl92KCZyLCAoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAyKTsgcmV0dXJuIHI7IH0KLV9fYWkgdWludDh4OHgyX3QgdnRybl91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHVpbnQ4eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z0cm5fdigmciwgKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTYpOyByZXR1cm4gcjsgfQotX19haSB1aW50MTZ4NHgyX3QgdnRybl91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHVpbnQxNng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dHJuX3YoJnIsIChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE3KTsgcmV0dXJuIHI7IH0KLV9fYWkgdWludDMyeDJ4Ml90IHZ0cm5fdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICB1aW50MzJ4MngyX3QgcjsgX19idWlsdGluX25lb25fdnRybl92KCZyLCAoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOCk7IHJldHVybiByOyB9Ci1fX2FpIGZsb2F0MzJ4MngyX3QgdnRybl9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgZmxvYXQzMngyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dHJuX3YoJnIsIChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDgpOyByZXR1cm4gcjsgfQotX19haSBwb2x5OHg4eDJfdCB2dHJuX3A4KHBvbHk4eDhfdCBfX2EsIHBvbHk4eDhfdCBfX2IpIHsKLSAgcG9seTh4OHgyX3QgcjsgX19idWlsdGluX25lb25fdnRybl92KCZyLCAoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA0KTsgcmV0dXJuIHI7IH0KLV9fYWkgcG9seTE2eDR4Ml90IHZ0cm5fcDE2KHBvbHkxNng0X3QgX19hLCBwb2x5MTZ4NF90IF9fYikgewotICBwb2x5MTZ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdnRybl92KCZyLCAoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA1KTsgcmV0dXJuIHI7IH0KLV9fYWkgaW50OHgxNngyX3QgdnRybnFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICBpbnQ4eDE2eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dHJucV92KCZyLCBfX2EsIF9fYiwgMzIpOyByZXR1cm4gcjsgfQotX19haSBpbnQxNng4eDJfdCB2dHJucV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICBpbnQxNng4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dHJucV92KCZyLCAoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDMzKTsgcmV0dXJuIHI7IH0KLV9fYWkgaW50MzJ4NHgyX3QgdnRybnFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgaW50MzJ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdnRybnFfdigmciwgKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzNCk7IHJldHVybiByOyB9Ci1fX2FpIHVpbnQ4eDE2eDJfdCB2dHJucV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgdWludDh4MTZ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z0cm5xX3YoJnIsIChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDgpOyByZXR1cm4gcjsgfQotX19haSB1aW50MTZ4OHgyX3QgdnRybnFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICB1aW50MTZ4OHgyX3QgcjsgX19idWlsdGluX25lb25fdnRybnFfdigmciwgKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OSk7IHJldHVybiByOyB9Ci1fX2FpIHVpbnQzMng0eDJfdCB2dHJucV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHVpbnQzMng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dHJucV92KCZyLCAoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUwKTsgcmV0dXJuIHI7IH0KLV9fYWkgZmxvYXQzMng0eDJfdCB2dHJucV9mMzIoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IpIHsKLSAgZmxvYXQzMng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dHJucV92KCZyLCAoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQwKTsgcmV0dXJuIHI7IH0KLV9fYWkgcG9seTh4MTZ4Ml90IHZ0cm5xX3A4KHBvbHk4eDE2X3QgX19hLCBwb2x5OHgxNl90IF9fYikgewotICBwb2x5OHgxNngyX3QgcjsgX19idWlsdGluX25lb25fdnRybnFfdigmciwgKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzNik7IHJldHVybiByOyB9Ci1fX2FpIHBvbHkxNng4eDJfdCB2dHJucV9wMTYocG9seTE2eDhfdCBfX2EsIHBvbHkxNng4X3QgX19iKSB7Ci0gIHBvbHkxNng4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dHJucV92KCZyLCAoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM3KTsgcmV0dXJuIHI7IH0KLQotX19haSB1aW50OHg4X3QgdnRzdF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92dHN0X3YoX19hLCBfX2IsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZ0c3RfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Z0c3RfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2dHN0X3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92dHN0X3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTgpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2dHN0X3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnRzdF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZ0c3RfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdnRzdF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE3KTsgfQotX19haSB1aW50MzJ4Ml90IHZ0c3RfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnRzdF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE4KTsgfQotX19haSB1aW50OHg4X3QgdnRzdF9wOChwb2x5OHg4X3QgX19hLCBwb2x5OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Z0c3RfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2dHN0X3AxNihwb2x5MTZ4NF90IF9fYSwgcG9seTE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Z0c3RfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0KLV9fYWkgdWludDh4MTZfdCB2dHN0cV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92dHN0cV92KF9fYSwgX19iLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2dHN0cV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnRzdHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ5KTsgfQotX19haSB1aW50MzJ4NF90IHZ0c3RxX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92dHN0cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTApOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnRzdHFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92dHN0cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDgpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdnRzdHFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnRzdHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ5KTsgfQotX19haSB1aW50MzJ4NF90IHZ0c3RxX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3Z0c3RxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MCk7IH0KLV9fYWkgdWludDh4MTZfdCB2dHN0cV9wOChwb2x5OHgxNl90IF9fYSwgcG9seTh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3Z0c3RxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2dHN0cV9wMTYocG9seTE2eDhfdCBfX2EsIHBvbHkxNng4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92dHN0cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDkpOyB9Ci0KLV9fYWkgaW50OHg4eDJfdCB2dXpwX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIGludDh4OHgyX3QgcjsgX19idWlsdGluX25lb25fdnV6cF92KCZyLCBfX2EsIF9fYiwgMCk7IHJldHVybiByOyB9Ci1fX2FpIGludDE2eDR4Ml90IHZ1enBfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgaW50MTZ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdnV6cF92KCZyLCAoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxKTsgcmV0dXJuIHI7IH0KLV9fYWkgaW50MzJ4MngyX3QgdnV6cF9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICBpbnQzMngyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dXpwX3YoJnIsIChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDIpOyByZXR1cm4gcjsgfQotX19haSB1aW50OHg4eDJfdCB2dXpwX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgdWludDh4OHgyX3QgcjsgX19idWlsdGluX25lb25fdnV6cF92KCZyLCAoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNik7IHJldHVybiByOyB9Ci1fX2FpIHVpbnQxNng0eDJfdCB2dXpwX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgdWludDE2eDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z1enBfdigmciwgKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTcpOyByZXR1cm4gcjsgfQotX19haSB1aW50MzJ4MngyX3QgdnV6cF91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHVpbnQzMngyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dXpwX3YoJnIsIChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE4KTsgcmV0dXJuIHI7IH0KLV9fYWkgZmxvYXQzMngyeDJfdCB2dXpwX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICBmbG9hdDMyeDJ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z1enBfdigmciwgKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgOCk7IHJldHVybiByOyB9Ci1fX2FpIHBvbHk4eDh4Ml90IHZ1enBfcDgocG9seTh4OF90IF9fYSwgcG9seTh4OF90IF9fYikgewotICBwb2x5OHg4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dXpwX3YoJnIsIChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDQpOyByZXR1cm4gcjsgfQotX19haSBwb2x5MTZ4NHgyX3QgdnV6cF9wMTYocG9seTE2eDRfdCBfX2EsIHBvbHkxNng0X3QgX19iKSB7Ci0gIHBvbHkxNng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dXpwX3YoJnIsIChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDUpOyByZXR1cm4gcjsgfQotX19haSBpbnQ4eDE2eDJfdCB2dXpwcV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIGludDh4MTZ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z1enBxX3YoJnIsIF9fYSwgX19iLCAzMik7IHJldHVybiByOyB9Ci1fX2FpIGludDE2eDh4Ml90IHZ1enBxX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIGludDE2eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z1enBxX3YoJnIsIChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzMpOyByZXR1cm4gcjsgfQotX19haSBpbnQzMng0eDJfdCB2dXpwcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICBpbnQzMng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dXpwcV92KCZyLCAoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM0KTsgcmV0dXJuIHI7IH0KLV9fYWkgdWludDh4MTZ4Ml90IHZ1enBxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICB1aW50OHgxNngyX3QgcjsgX19idWlsdGluX25lb25fdnV6cHFfdigmciwgKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OCk7IHJldHVybiByOyB9Ci1fX2FpIHVpbnQxNng4eDJfdCB2dXpwcV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHVpbnQxNng4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dXpwcV92KCZyLCAoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ5KTsgcmV0dXJuIHI7IH0KLV9fYWkgdWludDMyeDR4Ml90IHZ1enBxX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgdWludDMyeDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z1enBxX3YoJnIsIChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTApOyByZXR1cm4gcjsgfQotX19haSBmbG9hdDMyeDR4Ml90IHZ1enBxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICBmbG9hdDMyeDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z1enBxX3YoJnIsIChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDApOyByZXR1cm4gcjsgfQotX19haSBwb2x5OHgxNngyX3QgdnV6cHFfcDgocG9seTh4MTZfdCBfX2EsIHBvbHk4eDE2X3QgX19iKSB7Ci0gIHBvbHk4eDE2eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92dXpwcV92KCZyLCAoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM2KTsgcmV0dXJuIHI7IH0KLV9fYWkgcG9seTE2eDh4Ml90IHZ1enBxX3AxNihwb2x5MTZ4OF90IF9fYSwgcG9seTE2eDhfdCBfX2IpIHsKLSAgcG9seTE2eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z1enBxX3YoJnIsIChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzcpOyByZXR1cm4gcjsgfQotCi1fX2FpIGludDh4OHgyX3QgdnppcF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICBpbnQ4eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z6aXBfdigmciwgX19hLCBfX2IsIDApOyByZXR1cm4gcjsgfQotX19haSBpbnQxNng0eDJfdCB2emlwX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIGludDE2eDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z6aXBfdigmciwgKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMSk7IHJldHVybiByOyB9Ci1fX2FpIGludDMyeDJ4Ml90IHZ6aXBfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgaW50MzJ4MngyX3QgcjsgX19idWlsdGluX25lb25fdnppcF92KCZyLCAoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAyKTsgcmV0dXJuIHI7IH0KLV9fYWkgdWludDh4OHgyX3QgdnppcF91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHVpbnQ4eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z6aXBfdigmciwgKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTYpOyByZXR1cm4gcjsgfQotX19haSB1aW50MTZ4NHgyX3QgdnppcF91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHVpbnQxNng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92emlwX3YoJnIsIChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE3KTsgcmV0dXJuIHI7IH0KLV9fYWkgdWludDMyeDJ4Ml90IHZ6aXBfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICB1aW50MzJ4MngyX3QgcjsgX19idWlsdGluX25lb25fdnppcF92KCZyLCAoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOCk7IHJldHVybiByOyB9Ci1fX2FpIGZsb2F0MzJ4MngyX3QgdnppcF9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgZmxvYXQzMngyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92emlwX3YoJnIsIChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDgpOyByZXR1cm4gcjsgfQotX19haSBwb2x5OHg4eDJfdCB2emlwX3A4KHBvbHk4eDhfdCBfX2EsIHBvbHk4eDhfdCBfX2IpIHsKLSAgcG9seTh4OHgyX3QgcjsgX19idWlsdGluX25lb25fdnppcF92KCZyLCAoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA0KTsgcmV0dXJuIHI7IH0KLV9fYWkgcG9seTE2eDR4Ml90IHZ6aXBfcDE2KHBvbHkxNng0X3QgX19hLCBwb2x5MTZ4NF90IF9fYikgewotICBwb2x5MTZ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdnppcF92KCZyLCAoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA1KTsgcmV0dXJuIHI7IH0KLV9fYWkgaW50OHgxNngyX3QgdnppcHFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICBpbnQ4eDE2eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92emlwcV92KCZyLCBfX2EsIF9fYiwgMzIpOyByZXR1cm4gcjsgfQotX19haSBpbnQxNng4eDJfdCB2emlwcV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICBpbnQxNng4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92emlwcV92KCZyLCAoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDMzKTsgcmV0dXJuIHI7IH0KLV9fYWkgaW50MzJ4NHgyX3QgdnppcHFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgaW50MzJ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdnppcHFfdigmciwgKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzNCk7IHJldHVybiByOyB9Ci1fX2FpIHVpbnQ4eDE2eDJfdCB2emlwcV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgdWludDh4MTZ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3Z6aXBxX3YoJnIsIChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDgpOyByZXR1cm4gcjsgfQotX19haSB1aW50MTZ4OHgyX3QgdnppcHFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICB1aW50MTZ4OHgyX3QgcjsgX19idWlsdGluX25lb25fdnppcHFfdigmciwgKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OSk7IHJldHVybiByOyB9Ci1fX2FpIHVpbnQzMng0eDJfdCB2emlwcV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHVpbnQzMng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92emlwcV92KCZyLCAoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUwKTsgcmV0dXJuIHI7IH0KLV9fYWkgZmxvYXQzMng0eDJfdCB2emlwcV9mMzIoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IpIHsKLSAgZmxvYXQzMng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92emlwcV92KCZyLCAoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQwKTsgcmV0dXJuIHI7IH0KLV9fYWkgcG9seTh4MTZ4Ml90IHZ6aXBxX3A4KHBvbHk4eDE2X3QgX19hLCBwb2x5OHgxNl90IF9fYikgewotICBwb2x5OHgxNngyX3QgcjsgX19idWlsdGluX25lb25fdnppcHFfdigmciwgKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzNik7IHJldHVybiByOyB9Ci1fX2FpIHBvbHkxNng4eDJfdCB2emlwcV9wMTYocG9seTE2eDhfdCBfX2EsIHBvbHkxNng4X3QgX19iKSB7Ci0gIHBvbHkxNng4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92emlwcV92KCZyLCAoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM3KTsgcmV0dXJuIHI7IH0KLQotI2lmZGVmIF9fYWFyY2g2NF9fCi1fX2FpIGludDE2eDhfdCB2bW92bF9oaWdoX3M4KGludDh4MTZfdCBfX2EpIHsKLSAgaW50OHg4X3QgX19hMSA9IHZnZXRfaGlnaF9zOChfX2EpOwotICByZXR1cm4gKGludDE2eDhfdCl2c2hsbF9uX3M4KF9fYTEsIDApOyB9Ci1fX2FpIGludDMyeDRfdCB2bW92bF9oaWdoX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIGludDE2eDRfdCBfX2ExID0gdmdldF9oaWdoX3MxNihfX2EpOwotICByZXR1cm4gKGludDMyeDRfdCl2c2hsbF9uX3MxNihfX2ExLCAwKTsgfQotX19haSBpbnQ2NHgyX3Qgdm1vdmxfaGlnaF9zMzIoaW50MzJ4NF90IF9fYSkgewotICBpbnQzMngyX3QgX19hMSA9IHZnZXRfaGlnaF9zMzIoX19hKTsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpdnNobGxfbl9zMzIoX19hMSwgMCk7IH0KLV9fYWkgdWludDE2eDhfdCB2bW92bF9oaWdoX3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHVpbnQ4eDhfdCBfX2ExID0gdmdldF9oaWdoX3U4KF9fYSk7Ci0gIHJldHVybiAodWludDE2eDhfdCl2c2hsbF9uX3U4KF9fYTEsIDApOyB9Ci1fX2FpIHVpbnQzMng0X3Qgdm1vdmxfaGlnaF91MTYodWludDE2eDhfdCBfX2EpIHsKLSAgdWludDE2eDRfdCBfX2ExID0gdmdldF9oaWdoX3UxNihfX2EpOwotICByZXR1cm4gKHVpbnQzMng0X3QpdnNobGxfbl91MTYoX19hMSwgMCk7IH0KLV9fYWkgdWludDY0eDJfdCB2bW92bF9oaWdoX3UzMih1aW50MzJ4NF90IF9fYSkgewotICB1aW50MzJ4Ml90IF9fYTEgPSB2Z2V0X2hpZ2hfdTMyKF9fYSk7Ci0gIHJldHVybiAodWludDY0eDJfdCl2c2hsbF9uX3UzMihfX2ExLCAwKTsgfQotCi1fX2FpIGludDE2eDhfdCB2bXVsbF9oaWdoX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIHZtdWxsX3M4KHZnZXRfaGlnaF9zOChfX2EpLCB2Z2V0X2hpZ2hfczgoX19iKSk7IH0KLV9fYWkgaW50MzJ4NF90IHZtdWxsX2hpZ2hfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIHZtdWxsX3MxNih2Z2V0X2hpZ2hfczE2KF9fYSksIHZnZXRfaGlnaF9zMTYoX19iKSk7IH0KLV9fYWkgaW50NjR4Ml90IHZtdWxsX2hpZ2hfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIHZtdWxsX3MzMih2Z2V0X2hpZ2hfczMyKF9fYSksIHZnZXRfaGlnaF9zMzIoX19iKSk7IH0KLV9fYWkgdWludDE2eDhfdCB2bXVsbF9oaWdoX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gdm11bGxfdTgodmdldF9oaWdoX3U4KF9fYSksIHZnZXRfaGlnaF91OChfX2IpKTsgfQotX19haSB1aW50MzJ4NF90IHZtdWxsX2hpZ2hfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gdm11bGxfdTE2KHZnZXRfaGlnaF91MTYoX19hKSwgdmdldF9oaWdoX3UxNihfX2IpKTsgfQotX19haSB1aW50NjR4Ml90IHZtdWxsX2hpZ2hfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gdm11bGxfdTMyKHZnZXRfaGlnaF91MzIoX19hKSwgdmdldF9oaWdoX3UzMihfX2IpKTsgfQotX19haSBwb2x5MTZ4OF90IHZtdWxsX2hpZ2hfcDgocG9seTh4MTZfdCBfX2EsIHBvbHk4eDE2X3QgX19iKSB7Ci0gIHJldHVybiB2bXVsbF9wOCh2Z2V0X2hpZ2hfcDgoX19hKSwgdmdldF9oaWdoX3A4KF9fYikpOyB9Ci0KLV9fYWkgaW50MTZ4OF90IHZhYmRsX2hpZ2hfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gdmFiZGxfczgodmdldF9oaWdoX3M4KF9fYSksIHZnZXRfaGlnaF9zOChfX2IpKTsgfQotX19haSBpbnQzMng0X3QgdmFiZGxfaGlnaF9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gdmFiZGxfczE2KHZnZXRfaGlnaF9zMTYoX19hKSwgdmdldF9oaWdoX3MxNihfX2IpKTsgfQotX19haSBpbnQ2NHgyX3QgdmFiZGxfaGlnaF9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gdmFiZGxfczMyKHZnZXRfaGlnaF9zMzIoX19hKSwgdmdldF9oaWdoX3MzMihfX2IpKTsgfQotX19haSB1aW50MTZ4OF90IHZhYmRsX2hpZ2hfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiB2YWJkbF91OCh2Z2V0X2hpZ2hfdTgoX19hKSwgdmdldF9oaWdoX3U4KF9fYikpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmFiZGxfaGlnaF91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiB2YWJkbF91MTYodmdldF9oaWdoX3UxNihfX2EpLCB2Z2V0X2hpZ2hfdTE2KF9fYikpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmFiZGxfaGlnaF91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiB2YWJkbF91MzIodmdldF9oaWdoX3UzMihfX2EpLCB2Z2V0X2hpZ2hfdTMyKF9fYikpOyB9Ci0KLV9fYWkgZmxvYXQ2NHgxX3QgdmFiZF9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92YWJkX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgOSk7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdmFiZHFfZjY0KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19idWlsdGluX25lb25fdmFiZHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQxKTsgfQotCi1fX2FpIGludDY0eDFfdCB2YWJzX3M2NChpbnQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZhYnNfdigoaW50OHg4X3QpX19hLCAzKTsgfQotX19haSBmbG9hdDY0eDFfdCB2YWJzX2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92YWJzX3YoKGludDh4OF90KV9fYSwgOSk7IH0KLV9fYWkgaW50NjR4Ml90IHZhYnNxX3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZhYnNxX3YoKGludDh4MTZfdClfX2EsIDM1KTsgfQotX19haSBmbG9hdDY0eDJfdCB2YWJzcV9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19idWlsdGluX25lb25fdmFic3FfdigoaW50OHgxNl90KV9fYSwgNDEpOyB9Ci0KLV9fYWkgZmxvYXQ2NHgxX3QgdmFkZF9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSArIF9fYjsgfQotX19haSBmbG9hdDY0eDJfdCB2YWRkcV9mNjQoZmxvYXQ2NHgyX3QgX19hLCBmbG9hdDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSArIF9fYjsgfQotCi1fX2FpIGludDh4MTZfdCB2cGFkZHFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cGFkZHFfdihfX2EsIF9fYiwgMzIpOyB9Ci1fX2FpIGludDE2eDhfdCB2cGFkZHFfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNng4X3QpX19idWlsdGluX25lb25fdnBhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzMyk7IH0KLV9fYWkgaW50MzJ4NF90IHZwYWRkcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cGFkZHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDM0KTsgfQotX19haSBpbnQ2NHgyX3QgdnBhZGRxX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzUpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnBhZGRxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnBhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2cGFkZHFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnBhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2cGFkZHFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnBhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MCk7IH0KLV9fYWkgdWludDY0eDJfdCB2cGFkZHFfdTY0KHVpbnQ2NHgyX3QgX19hLCB1aW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnBhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MSk7IH0KLV9fYWkgZmxvYXQzMng0X3QgdnBhZGRxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDApOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZwYWRkcV9mNjQoZmxvYXQ2NHgyX3QgX19hLCBmbG9hdDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92cGFkZHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQxKTsgfQotCi1fX2FpIGZsb2F0NjR4MV90IHZic2xfZjY0KHVpbnQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IsIGZsb2F0NjR4MV90IF9fYykgewotICByZXR1cm4gKGZsb2F0NjR4MV90KV9fYnVpbHRpbl9uZW9uX3Zic2xfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAoaW50OHg4X3QpX19jLCA5KTsgfQotX19haSBmbG9hdDY0eDJfdCB2YnNscV9mNjQodWludDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYiwgZmxvYXQ2NHgyX3QgX19jKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19idWlsdGluX25lb25fdmJzbHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCA0MSk7IH0KLV9fYWkgcG9seTY0eDFfdCB2YnNsX3A2NCh1aW50NjR4MV90IF9fYSwgcG9seTY0eDFfdCBfX2IsIHBvbHk2NHgxX3QgX19jKSB7Ci0gIHJldHVybiAocG9seTY0eDFfdClfX2J1aWx0aW5fbmVvbl92YnNsX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgKGludDh4OF90KV9fYywgNik7IH0KLV9fYWkgcG9seTY0eDJfdCB2YnNscV9wNjQodWludDY0eDJfdCBfX2EsIHBvbHk2NHgyX3QgX19iLCBwb2x5NjR4Ml90IF9fYykgewotICByZXR1cm4gKHBvbHk2NHgyX3QpX19idWlsdGluX25lb25fdmJzbHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCAzOCk7IH0KLQotX19haSB1aW50NjR4MV90IHZjZXFfczY0KGludDY0eDFfdCBfX2EsIGludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KShfX2EgPT0gX19iKTsgfQotX19haSB1aW50NjR4MV90IHZjZXFfdTY0KHVpbnQ2NHgxX3QgX19hLCB1aW50NjR4MV90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpKF9fYSA9PSBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdmNlcV9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KShfX2EgPT0gX19iKTsgfQotX19haSB1aW50NjR4Ml90IHZjZXFxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpKF9fYSA9PSBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNlcXFfdTY0KHVpbnQ2NHgyX3QgX19hLCB1aW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpKF9fYSA9PSBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNlcXFfczY0KGludDY0eDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KShfX2EgPT0gX19iKTsgfQotX19haSB1aW50NjR4MV90IHZjZXFfcDY0KHBvbHk2NHgxX3QgX19hLCBwb2x5NjR4MV90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpKF9fYSA9PSBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNlcXFfcDY0KHBvbHk2NHgyX3QgX19hLCBwb2x5NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpKF9fYSA9PSBfX2IpOyB9Ci0KLV9fYWkgdWludDY0eDFfdCB2Y2dlX3M2NChpbnQ2NHgxX3QgX19hLCBpbnQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDFfdCkoX19hID49IF9fYik7IH0KLV9fYWkgdWludDY0eDFfdCB2Y2dlX3U2NCh1aW50NjR4MV90IF9fYSwgdWludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KShfX2EgPj0gX19iKTsgfQotX19haSB1aW50NjR4Ml90IHZjZ2VxX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdCkoX19hID49IF9fYik7IH0KLV9fYWkgdWludDY0eDJfdCB2Y2dlcV91NjQodWludDY0eDJfdCBfX2EsIHVpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdCkoX19hID49IF9fYik7IH0KLV9fYWkgdWludDY0eDFfdCB2Y2dlX2Y2NChmbG9hdDY0eDFfdCBfX2EsIGZsb2F0NjR4MV90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpKF9fYSA+PSBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNnZXFfZjY0KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdCkoX19hID49IF9fYik7IH0KLQotX19haSB1aW50NjR4MV90IHZjZ3RfczY0KGludDY0eDFfdCBfX2EsIGludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KShfX2EgPiBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdmNndF91NjQodWludDY0eDFfdCBfX2EsIHVpbnQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDFfdCkoX19hID4gX19iKTsgfQotX19haSB1aW50NjR4Ml90IHZjZ3RxX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdCkoX19hID4gX19iKTsgfQotX19haSB1aW50NjR4Ml90IHZjZ3RxX3U2NCh1aW50NjR4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KShfX2EgPiBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdmNndF9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KShfX2EgPiBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNndHFfZjY0KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdCkoX19hID4gX19iKTsgfQotCi1fX2FpIHVpbnQ2NHgxX3QgdmNsZV9zNjQoaW50NjR4MV90IF9fYSwgaW50NjR4MV90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpKF9fYSA8PSBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdmNsZV91NjQodWludDY0eDFfdCBfX2EsIHVpbnQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDFfdCkoX19hIDw9IF9fYik7IH0KLV9fYWkgdWludDY0eDJfdCB2Y2xlcV9zNjQoaW50NjR4Ml90IF9fYSwgaW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpKF9fYSA8PSBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNsZXFfdTY0KHVpbnQ2NHgyX3QgX19hLCB1aW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpKF9fYSA8PSBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdmNsZV9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KShfX2EgPD0gX19iKTsgfQotX19haSB1aW50NjR4Ml90IHZjbGVxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpKF9fYSA8PSBfX2IpOyB9Ci0KLV9fYWkgdWludDY0eDFfdCB2Y2x0X3M2NChpbnQ2NHgxX3QgX19hLCBpbnQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDFfdCkoX19hIDwgX19iKTsgfQotX19haSB1aW50NjR4MV90IHZjbHRfdTY0KHVpbnQ2NHgxX3QgX19hLCB1aW50NjR4MV90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpKF9fYSA8IF9fYik7IH0KLV9fYWkgdWludDY0eDJfdCB2Y2x0cV9zNjQoaW50NjR4Ml90IF9fYSwgaW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpKF9fYSA8IF9fYik7IH0KLV9fYWkgdWludDY0eDJfdCB2Y2x0cV91NjQodWludDY0eDJfdCBfX2EsIHVpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdCkoX19hIDwgX19iKTsgfQotX19haSB1aW50NjR4MV90IHZjbHRfZjY0KGZsb2F0NjR4MV90IF9fYSwgZmxvYXQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDFfdCkoX19hIDwgX19iKTsgfQotX19haSB1aW50NjR4Ml90IHZjbHRxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpKF9fYSA8IF9fYik7IH0KLQotX19haSB1aW50OHg4X3QgdmNlcXpfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZjZXF6X3YoX19hLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2Y2Vxel9zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdmNlcXpfdigoaW50OHg4X3QpX19hLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2Y2Vxel9zMzIoaW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmNlcXpfdigoaW50OHg4X3QpX19hLCAxOCk7IH0KLV9fYWkgdWludDY0eDFfdCB2Y2Vxel9zNjQoaW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdmNlcXpfdigoaW50OHg4X3QpX19hLCAxOSk7IH0KLV9fYWkgdWludDMyeDJfdCB2Y2Vxel9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92Y2Vxel92KChpbnQ4eDhfdClfX2EsIDE4KTsgfQotX19haSB1aW50OHg4X3QgdmNlcXpfdTgodWludDh4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92Y2Vxel92KChpbnQ4eDhfdClfX2EsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZjZXF6X3UxNih1aW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdmNlcXpfdigoaW50OHg4X3QpX19hLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2Y2Vxel91MzIodWludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjZXF6X3YoKGludDh4OF90KV9fYSwgMTgpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdmNlcXpfdTY0KHVpbnQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y2Vxel92KChpbnQ4eDhfdClfX2EsIDE5KTsgfQotX19haSB1aW50OHg4X3QgdmNlcXpfcDgocG9seTh4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92Y2Vxel92KChpbnQ4eDhfdClfX2EsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZjZXF6X3AxNihwb2x5MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdmNlcXpfdigoaW50OHg4X3QpX19hLCAxNyk7IH0KLV9fYWkgdWludDY0eDFfdCB2Y2Vxel9wNjQocG9seTY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZjZXF6X3YoKGludDh4OF90KV9fYSwgMTkpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmNlcXpxX3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZjZXF6cV92KF9fYSwgNDgpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmNlcXpxX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92Y2VxenFfdigoaW50OHgxNl90KV9fYSwgNDkpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNlcXpxX3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y2VxenFfdigoaW50OHgxNl90KV9fYSwgNTApOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNlcXpxX3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Y2VxenFfdigoaW50OHgxNl90KV9fYSwgNTEpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNlcXpxX2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZjZXF6cV92KChpbnQ4eDE2X3QpX19hLCA1MCk7IH0KLV9fYWkgdWludDh4MTZfdCB2Y2VxenFfdTgodWludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZjZXF6cV92KChpbnQ4eDE2X3QpX19hLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2Y2VxenFfdTE2KHVpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92Y2VxenFfdigoaW50OHgxNl90KV9fYSwgNDkpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNlcXpxX3UzMih1aW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdmNlcXpxX3YoKGludDh4MTZfdClfX2EsIDUwKTsgfQotX19haSB1aW50NjR4Ml90IHZjZXF6cV91NjQodWludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjZXF6cV92KChpbnQ4eDE2X3QpX19hLCA1MSk7IH0KLV9fYWkgdWludDh4MTZfdCB2Y2VxenFfcDgocG9seTh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZjZXF6cV92KChpbnQ4eDE2X3QpX19hLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2Y2VxenFfcDE2KHBvbHkxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92Y2VxenFfdigoaW50OHgxNl90KV9fYSwgNDkpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdmNlcXpfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdmNlcXpfdigoaW50OHg4X3QpX19hLCAxOSk7IH0KLV9fYWkgdWludDY0eDJfdCB2Y2VxenFfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmNlcXpxX3YoKGludDh4MTZfdClfX2EsIDUxKTsgfQotX19haSB1aW50NjR4Ml90IHZjZXF6cV9wNjQocG9seTY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjZXF6cV92KChpbnQ4eDE2X3QpX19hLCA1MSk7IH0KLQotX19haSB1aW50OHg4X3QgdmNnZXpfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZjZ2V6X3YoX19hLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2Y2dlel9zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdmNnZXpfdigoaW50OHg4X3QpX19hLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2Y2dlel9zMzIoaW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmNnZXpfdigoaW50OHg4X3QpX19hLCAxOCk7IH0KLV9fYWkgdWludDY0eDFfdCB2Y2dlel9zNjQoaW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdmNnZXpfdigoaW50OHg4X3QpX19hLCAxOSk7IH0KLV9fYWkgdWludDMyeDJfdCB2Y2dlel9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92Y2dlel92KChpbnQ4eDhfdClfX2EsIDE4KTsgfQotX19haSB1aW50NjR4MV90IHZjZ2V6X2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZjZ2V6X3YoKGludDh4OF90KV9fYSwgMTkpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmNnZXpxX3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZjZ2V6cV92KF9fYSwgNDgpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmNnZXpxX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92Y2dlenFfdigoaW50OHgxNl90KV9fYSwgNDkpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNnZXpxX3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y2dlenFfdigoaW50OHgxNl90KV9fYSwgNTApOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNnZXpxX3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Y2dlenFfdigoaW50OHgxNl90KV9fYSwgNTEpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNnZXpxX2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZjZ2V6cV92KChpbnQ4eDE2X3QpX19hLCA1MCk7IH0KLV9fYWkgdWludDY0eDJfdCB2Y2dlenFfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmNnZXpxX3YoKGludDh4MTZfdClfX2EsIDUxKTsgfQotCi1fX2FpIHVpbnQ4eDhfdCB2Y2d0el9zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdmNndHpfdihfX2EsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZjZ3R6X3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92Y2d0el92KChpbnQ4eDhfdClfX2EsIDE3KTsgfQotX19haSB1aW50MzJ4Ml90IHZjZ3R6X3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92Y2d0el92KChpbnQ4eDhfdClfX2EsIDE4KTsgfQotX19haSB1aW50NjR4MV90IHZjZ3R6X3M2NChpbnQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y2d0el92KChpbnQ4eDhfdClfX2EsIDE5KTsgfQotX19haSB1aW50MzJ4Ml90IHZjZ3R6X2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjZ3R6X3YoKGludDh4OF90KV9fYSwgMTgpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdmNndHpfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdmNndHpfdigoaW50OHg4X3QpX19hLCAxOSk7IH0KLV9fYWkgdWludDh4MTZfdCB2Y2d0enFfczgoaW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmNndHpxX3YoX19hLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2Y2d0enFfczE2KGludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZjZ3R6cV92KChpbnQ4eDE2X3QpX19hLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2Y2d0enFfczMyKGludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZjZ3R6cV92KChpbnQ4eDE2X3QpX19hLCA1MCk7IH0KLV9fYWkgdWludDY0eDJfdCB2Y2d0enFfczY0KGludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjZ3R6cV92KChpbnQ4eDE2X3QpX19hLCA1MSk7IH0KLV9fYWkgdWludDMyeDRfdCB2Y2d0enFfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdmNndHpxX3YoKGludDh4MTZfdClfX2EsIDUwKTsgfQotX19haSB1aW50NjR4Ml90IHZjZ3R6cV9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Y2d0enFfdigoaW50OHgxNl90KV9fYSwgNTEpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZjbGV6X3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92Y2xlel92KF9fYSwgMTYpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdmNsZXpfczE2KGludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3ZjbGV6X3YoKGludDh4OF90KV9fYSwgMTcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmNsZXpfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjbGV6X3YoKGludDh4OF90KV9fYSwgMTgpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdmNsZXpfczY0KGludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZjbGV6X3YoKGludDh4OF90KV9fYSwgMTkpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdmNsZXpfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmNsZXpfdigoaW50OHg4X3QpX19hLCAxOCk7IH0KLV9fYWkgdWludDY0eDFfdCB2Y2xlel9mNjQoZmxvYXQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y2xlel92KChpbnQ4eDhfdClfX2EsIDE5KTsgfQotX19haSB1aW50OHgxNl90IHZjbGV6cV9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92Y2xlenFfdihfX2EsIDQ4KTsgfQotX19haSB1aW50MTZ4OF90IHZjbGV6cV9zMTYoaW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdmNsZXpxX3YoKGludDh4MTZfdClfX2EsIDQ5KTsgfQotX19haSB1aW50MzJ4NF90IHZjbGV6cV9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdmNsZXpxX3YoKGludDh4MTZfdClfX2EsIDUwKTsgfQotX19haSB1aW50NjR4Ml90IHZjbGV6cV9zNjQoaW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmNsZXpxX3YoKGludDh4MTZfdClfX2EsIDUxKTsgfQotX19haSB1aW50MzJ4NF90IHZjbGV6cV9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y2xlenFfdigoaW50OHgxNl90KV9fYSwgNTApOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNsZXpxX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjbGV6cV92KChpbnQ4eDE2X3QpX19hLCA1MSk7IH0KLQotX19haSB1aW50OHg4X3QgdmNsdHpfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZjbHR6X3YoX19hLCAxNik7IH0KLV9fYWkgdWludDE2eDRfdCB2Y2x0el9zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng0X3QpX19idWlsdGluX25lb25fdmNsdHpfdigoaW50OHg4X3QpX19hLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2Y2x0el9zMzIoaW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmNsdHpfdigoaW50OHg4X3QpX19hLCAxOCk7IH0KLV9fYWkgdWludDY0eDFfdCB2Y2x0el9zNjQoaW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdmNsdHpfdigoaW50OHg4X3QpX19hLCAxOSk7IH0KLV9fYWkgdWludDMyeDJfdCB2Y2x0el9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2J1aWx0aW5fbmVvbl92Y2x0el92KChpbnQ4eDhfdClfX2EsIDE4KTsgfQotX19haSB1aW50NjR4MV90IHZjbHR6X2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZjbHR6X3YoKGludDh4OF90KV9fYSwgMTkpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdmNsdHpxX3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZjbHR6cV92KF9fYSwgNDgpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmNsdHpxX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92Y2x0enFfdigoaW50OHgxNl90KV9fYSwgNDkpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNsdHpxX3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y2x0enFfdigoaW50OHgxNl90KV9fYSwgNTApOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNsdHpxX3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Y2x0enFfdigoaW50OHgxNl90KV9fYSwgNTEpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmNsdHpxX2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZjbHR6cV92KChpbnQ4eDE2X3QpX19hLCA1MCk7IH0KLV9fYWkgdWludDY0eDJfdCB2Y2x0enFfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmNsdHpxX3YoKGludDh4MTZfdClfX2EsIDUxKTsgfQotCi1fX2FpIHVpbnQ2NHgxX3QgdnRzdF9zNjQoaW50NjR4MV90IF9fYSwgaW50NjR4MV90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdnRzdF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE5KTsgfQotX19haSB1aW50NjR4MV90IHZ0c3RfdTY0KHVpbnQ2NHgxX3QgX19hLCB1aW50NjR4MV90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdnRzdF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE5KTsgfQotX19haSB1aW50NjR4Ml90IHZ0c3RxX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92dHN0cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTEpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnRzdHFfdTY0KHVpbnQ2NHgyX3QgX19hLCB1aW50NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnRzdHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUxKTsgfQotX19haSB1aW50NjR4MV90IHZ0c3RfcDY0KHBvbHk2NHgxX3QgX19hLCBwb2x5NjR4MV90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdnRzdF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE5KTsgfQotX19haSB1aW50NjR4Ml90IHZ0c3RxX3A2NChwb2x5NjR4Ml90IF9fYSwgcG9seTY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3Z0c3RxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MSk7IH0KLQotX19haSBmbG9hdDY0eDJfdCB2Y29tYmluZV9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcigoaW50NjR4MV90KV9fYSwgKGludDY0eDFfdClfX2IsIDAsIDEpOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdmNvbWJpbmVfcDY0KHBvbHk2NHgxX3QgX19hLCBwb2x5NjR4MV90IF9fYikgewotICByZXR1cm4gKHBvbHk2NHgyX3QpX19idWlsdGluX3NodWZmbGV2ZWN0b3IoKGludDY0eDFfdClfX2EsIChpbnQ2NHgxX3QpX19iLCAwLCAxKTsgfQotCi0jZGVmaW5lIHZjb3B5cV9sYW5lX3M4KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4MTZfdCBfX2ExID0gKGExKTsgaW50OHg4X3QgX19jMSA9IChjMSk7IFwKLSAgaW50OF90IF9fYzIgPSB2Z2V0X2xhbmVfczgoX19jMSwgX19kMSk7IFwKLSAgdnNldHFfbGFuZV9zOChfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlxX2xhbmVfczE2KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2ExID0gKGExKTsgaW50MTZ4NF90IF9fYzEgPSAoYzEpOyBcCi0gIGludDE2X3QgX19jMiA9IHZnZXRfbGFuZV9zMTYoX19jMSwgX19kMSk7IFwKLSAgdnNldHFfbGFuZV9zMTYoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5cV9sYW5lX3MzMihhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hMSA9IChhMSk7IGludDMyeDJfdCBfX2MxID0gKGMxKTsgXAotICBpbnQzMl90IF9fYzIgPSB2Z2V0X2xhbmVfczMyKF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRxX2xhbmVfczMyKF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weXFfbGFuZV9zNjQoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Ml90IF9fYTEgPSAoYTEpOyBpbnQ2NHgxX3QgX19jMSA9IChjMSk7IFwKLSAgaW50NjRfdCBfX2MyID0gdmdldF9sYW5lX3M2NChfX2MxLCBfX2QxKTsgXAotICB2c2V0cV9sYW5lX3M2NChfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlxX2xhbmVfdTgoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZfdCBfX2ExID0gKGExKTsgdWludDh4OF90IF9fYzEgPSAoYzEpOyBcCi0gIHVpbnQ4X3QgX19jMiA9IHZnZXRfbGFuZV91OChfX2MxLCBfX2QxKTsgXAotICB2c2V0cV9sYW5lX3U4KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weXFfbGFuZV91MTYoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2ExID0gKGExKTsgdWludDE2eDRfdCBfX2MxID0gKGMxKTsgXAotICB1aW50MTZfdCBfX2MyID0gdmdldF9sYW5lX3UxNihfX2MxLCBfX2QxKTsgXAotICB2c2V0cV9sYW5lX3UxNihfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlxX2xhbmVfdTMyKGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hMSA9IChhMSk7IHVpbnQzMngyX3QgX19jMSA9IChjMSk7IFwKLSAgdWludDMyX3QgX19jMiA9IHZnZXRfbGFuZV91MzIoX19jMSwgX19kMSk7IFwKLSAgdnNldHFfbGFuZV91MzIoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5cV9sYW5lX3U2NChhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Ml90IF9fYTEgPSAoYTEpOyB1aW50NjR4MV90IF9fYzEgPSAoYzEpOyBcCi0gIHVpbnQ2NF90IF9fYzIgPSB2Z2V0X2xhbmVfdTY0KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRxX2xhbmVfdTY0KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weXFfbGFuZV9wOChhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHgxNl90IF9fYTEgPSAoYTEpOyBwb2x5OHg4X3QgX19jMSA9IChjMSk7IFwKLSAgcG9seThfdCBfX2MyID0gdmdldF9sYW5lX3A4KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRxX2xhbmVfcDgoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5cV9sYW5lX3AxNihhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4OF90IF9fYTEgPSAoYTEpOyBwb2x5MTZ4NF90IF9fYzEgPSAoYzEpOyBcCi0gIHBvbHkxNl90IF9fYzIgPSB2Z2V0X2xhbmVfcDE2KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRxX2xhbmVfcDE2KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weXFfbGFuZV9mMzIoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0X3QgX19hMSA9IChhMSk7IGZsb2F0MzJ4Ml90IF9fYzEgPSAoYzEpOyBcCi0gIGZsb2F0MzJfdCBfX2MyID0gdmdldF9sYW5lX2YzMihfX2MxLCBfX2QxKTsgXAotICB2c2V0cV9sYW5lX2YzMihfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlxX2xhbmVfZjY0KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4Ml90IF9fYTEgPSAoYTEpOyBmbG9hdDY0eDFfdCBfX2MxID0gKGMxKTsgXAotICBmbG9hdDY0X3QgX19jMiA9IHZnZXRfbGFuZV9mNjQoX19jMSwgX19kMSk7IFwKLSAgdnNldHFfbGFuZV9mNjQoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5cV9sYW5lX3A2NChhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4Ml90IF9fYTEgPSAoYTEpOyBwb2x5NjR4MV90IF9fYzEgPSAoYzEpOyBcCi0gIHBvbHk2NF90IF9fYzIgPSB2Z2V0X2xhbmVfcDY0KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRxX2xhbmVfcDY0KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotCi0jZGVmaW5lIHZjb3B5cV9sYW5lcV9zOChhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDE2X3QgX19hMSA9IChhMSk7IGludDh4MTZfdCBfX2MxID0gKGMxKTsgXAotICBpbnQ4X3QgX19jMiA9IHZnZXRxX2xhbmVfczgoX19jMSwgX19kMSk7IFwKLSAgdnNldHFfbGFuZV9zOChfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlxX2xhbmVxX3MxNihhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hMSA9IChhMSk7IGludDE2eDhfdCBfX2MxID0gKGMxKTsgXAotICBpbnQxNl90IF9fYzIgPSB2Z2V0cV9sYW5lX3MxNihfX2MxLCBfX2QxKTsgXAotICB2c2V0cV9sYW5lX3MxNihfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlxX2xhbmVxX3MzMihhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hMSA9IChhMSk7IGludDMyeDRfdCBfX2MxID0gKGMxKTsgXAotICBpbnQzMl90IF9fYzIgPSB2Z2V0cV9sYW5lX3MzMihfX2MxLCBfX2QxKTsgXAotICB2c2V0cV9sYW5lX3MzMihfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlxX2xhbmVxX3M2NChhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hMSA9IChhMSk7IGludDY0eDJfdCBfX2MxID0gKGMxKTsgXAotICBpbnQ2NF90IF9fYzIgPSB2Z2V0cV9sYW5lX3M2NChfX2MxLCBfX2QxKTsgXAotICB2c2V0cV9sYW5lX3M2NChfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlxX2xhbmVxX3U4KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2X3QgX19hMSA9IChhMSk7IHVpbnQ4eDE2X3QgX19jMSA9IChjMSk7IFwKLSAgdWludDhfdCBfX2MyID0gdmdldHFfbGFuZV91OChfX2MxLCBfX2QxKTsgXAotICB2c2V0cV9sYW5lX3U4KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weXFfbGFuZXFfdTE2KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4X3QgX19hMSA9IChhMSk7IHVpbnQxNng4X3QgX19jMSA9IChjMSk7IFwKLSAgdWludDE2X3QgX19jMiA9IHZnZXRxX2xhbmVfdTE2KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRxX2xhbmVfdTE2KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weXFfbGFuZXFfdTMyKGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hMSA9IChhMSk7IHVpbnQzMng0X3QgX19jMSA9IChjMSk7IFwKLSAgdWludDMyX3QgX19jMiA9IHZnZXRxX2xhbmVfdTMyKF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRxX2xhbmVfdTMyKF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weXFfbGFuZXFfdTY0KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyX3QgX19hMSA9IChhMSk7IHVpbnQ2NHgyX3QgX19jMSA9IChjMSk7IFwKLSAgdWludDY0X3QgX19jMiA9IHZnZXRxX2xhbmVfdTY0KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRxX2xhbmVfdTY0KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weXFfbGFuZXFfcDgoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4MTZfdCBfX2ExID0gKGExKTsgcG9seTh4MTZfdCBfX2MxID0gKGMxKTsgXAotICBwb2x5OF90IF9fYzIgPSB2Z2V0cV9sYW5lX3A4KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRxX2xhbmVfcDgoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5cV9sYW5lcV9wMTYoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDhfdCBfX2ExID0gKGExKTsgcG9seTE2eDhfdCBfX2MxID0gKGMxKTsgXAotICBwb2x5MTZfdCBfX2MyID0gdmdldHFfbGFuZV9wMTYoX19jMSwgX19kMSk7IFwKLSAgdnNldHFfbGFuZV9wMTYoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5cV9sYW5lcV9mMzIoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0X3QgX19hMSA9IChhMSk7IGZsb2F0MzJ4NF90IF9fYzEgPSAoYzEpOyBcCi0gIGZsb2F0MzJfdCBfX2MyID0gdmdldHFfbGFuZV9mMzIoX19jMSwgX19kMSk7IFwKLSAgdnNldHFfbGFuZV9mMzIoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5cV9sYW5lcV9mNjQoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyX3QgX19hMSA9IChhMSk7IGZsb2F0NjR4Ml90IF9fYzEgPSAoYzEpOyBcCi0gIGZsb2F0NjRfdCBfX2MyID0gdmdldHFfbGFuZV9mNjQoX19jMSwgX19kMSk7IFwKLSAgdnNldHFfbGFuZV9mNjQoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5cV9sYW5lcV9wNjQoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDJfdCBfX2ExID0gKGExKTsgcG9seTY0eDJfdCBfX2MxID0gKGMxKTsgXAotICBwb2x5NjRfdCBfX2MyID0gdmdldHFfbGFuZV9wNjQoX19jMSwgX19kMSk7IFwKLSAgdnNldHFfbGFuZV9wNjQoX19jMiwgX19hMSwgX19iMSk7IH0pCi0KLSNkZWZpbmUgdmNvcHlfbGFuZV9zOChhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDhfdCBfX2ExID0gKGExKTsgaW50OHg4X3QgX19jMSA9IChjMSk7IFwKLSAgaW50OF90IF9fYzIgPSB2Z2V0X2xhbmVfczgoX19jMSwgX19kMSk7IFwKLSAgdnNldF9sYW5lX3M4KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weV9sYW5lX3MxNihhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hMSA9IChhMSk7IGludDE2eDRfdCBfX2MxID0gKGMxKTsgXAotICBpbnQxNl90IF9fYzIgPSB2Z2V0X2xhbmVfczE2KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRfbGFuZV9zMTYoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5X2xhbmVfczMyKGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2ExID0gKGExKTsgaW50MzJ4Ml90IF9fYzEgPSAoYzEpOyBcCi0gIGludDMyX3QgX19jMiA9IHZnZXRfbGFuZV9zMzIoX19jMSwgX19kMSk7IFwKLSAgdnNldF9sYW5lX3MzMihfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlfbGFuZV9zNjQoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MV90IF9fYTEgPSAoYTEpOyBpbnQ2NHgxX3QgX19jMSA9IChjMSk7IFwKLSAgaW50NjRfdCBfX2MyID0gdmdldF9sYW5lX3M2NChfX2MxLCBfX2QxKTsgXAotICB2c2V0X2xhbmVfczY0KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weV9sYW5lX3A4KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDhfdCBfX2ExID0gKGExKTsgcG9seTh4OF90IF9fYzEgPSAoYzEpOyBcCi0gIHBvbHk4X3QgX19jMiA9IHZnZXRfbGFuZV9wOChfX2MxLCBfX2QxKTsgXAotICB2c2V0X2xhbmVfcDgoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5X2xhbmVfcDE2KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng0X3QgX19hMSA9IChhMSk7IHBvbHkxNng0X3QgX19jMSA9IChjMSk7IFwKLSAgcG9seTE2X3QgX19jMiA9IHZnZXRfbGFuZV9wMTYoX19jMSwgX19kMSk7IFwKLSAgdnNldF9sYW5lX3AxNihfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlfbGFuZV91OChhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4X3QgX19hMSA9IChhMSk7IHVpbnQ4eDhfdCBfX2MxID0gKGMxKTsgXAotICB1aW50OF90IF9fYzIgPSB2Z2V0X2xhbmVfdTgoX19jMSwgX19kMSk7IFwKLSAgdnNldF9sYW5lX3U4KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weV9sYW5lX3UxNihhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NF90IF9fYTEgPSAoYTEpOyB1aW50MTZ4NF90IF9fYzEgPSAoYzEpOyBcCi0gIHVpbnQxNl90IF9fYzIgPSB2Z2V0X2xhbmVfdTE2KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRfbGFuZV91MTYoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5X2xhbmVfdTMyKGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hMSA9IChhMSk7IHVpbnQzMngyX3QgX19jMSA9IChjMSk7IFwKLSAgdWludDMyX3QgX19jMiA9IHZnZXRfbGFuZV91MzIoX19jMSwgX19kMSk7IFwKLSAgdnNldF9sYW5lX3UzMihfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlfbGFuZV91NjQoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDFfdCBfX2ExID0gKGExKTsgdWludDY0eDFfdCBfX2MxID0gKGMxKTsgXAotICB1aW50NjRfdCBfX2MyID0gdmdldF9sYW5lX3U2NChfX2MxLCBfX2QxKTsgXAotICB2c2V0X2xhbmVfdTY0KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weV9sYW5lX3A2NChhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MV90IF9fYTEgPSAoYTEpOyBwb2x5NjR4MV90IF9fYzEgPSAoYzEpOyBcCi0gIHBvbHk2NF90IF9fYzIgPSB2Z2V0X2xhbmVfcDY0KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRfbGFuZV9wNjQoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5X2xhbmVfZjMyKGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4Ml90IF9fYTEgPSAoYTEpOyBmbG9hdDMyeDJfdCBfX2MxID0gKGMxKTsgXAotICBmbG9hdDMyX3QgX19jMiA9IHZnZXRfbGFuZV9mMzIoX19jMSwgX19kMSk7IFwKLSAgdnNldF9sYW5lX2YzMihfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlfbGFuZV9mNjQoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgxX3QgX19hMSA9IChhMSk7IGZsb2F0NjR4MV90IF9fYzEgPSAoYzEpOyBcCi0gIGZsb2F0NjRfdCBfX2MyID0gdmdldF9sYW5lX2Y2NChfX2MxLCBfX2QxKTsgXAotICB2c2V0X2xhbmVfZjY0KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotCi0jZGVmaW5lIHZjb3B5X2xhbmVxX3M4KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4OF90IF9fYTEgPSAoYTEpOyBpbnQ4eDE2X3QgX19jMSA9IChjMSk7IFwKLSAgaW50OF90IF9fYzIgPSB2Z2V0cV9sYW5lX3M4KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRfbGFuZV9zOChfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlfbGFuZXFfczE2KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2ExID0gKGExKTsgaW50MTZ4OF90IF9fYzEgPSAoYzEpOyBcCi0gIGludDE2X3QgX19jMiA9IHZnZXRxX2xhbmVfczE2KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRfbGFuZV9zMTYoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5X2xhbmVxX3MzMihhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hMSA9IChhMSk7IGludDMyeDRfdCBfX2MxID0gKGMxKTsgXAotICBpbnQzMl90IF9fYzIgPSB2Z2V0cV9sYW5lX3MzMihfX2MxLCBfX2QxKTsgXAotICB2c2V0X2xhbmVfczMyKF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weV9sYW5lcV9zNjQoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MV90IF9fYTEgPSAoYTEpOyBpbnQ2NHgyX3QgX19jMSA9IChjMSk7IFwKLSAgaW50NjRfdCBfX2MyID0gdmdldHFfbGFuZV9zNjQoX19jMSwgX19kMSk7IFwKLSAgdnNldF9sYW5lX3M2NChfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlfbGFuZXFfcDgoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OF90IF9fYTEgPSAoYTEpOyBwb2x5OHgxNl90IF9fYzEgPSAoYzEpOyBcCi0gIHBvbHk4X3QgX19jMiA9IHZnZXRxX2xhbmVfcDgoX19jMSwgX19kMSk7IFwKLSAgdnNldF9sYW5lX3A4KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weV9sYW5lcV9wMTYoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDRfdCBfX2ExID0gKGExKTsgcG9seTE2eDhfdCBfX2MxID0gKGMxKTsgXAotICBwb2x5MTZfdCBfX2MyID0gdmdldHFfbGFuZV9wMTYoX19jMSwgX19kMSk7IFwKLSAgdnNldF9sYW5lX3AxNihfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlfbGFuZXFfcDY0KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxX3QgX19hMSA9IChhMSk7IHBvbHk2NHgyX3QgX19jMSA9IChjMSk7IFwKLSAgcG9seTY0X3QgX19jMiA9IHZnZXRxX2xhbmVfcDY0KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRfbGFuZV9wNjQoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5X2xhbmVxX3U4KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2ExID0gKGExKTsgdWludDh4MTZfdCBfX2MxID0gKGMxKTsgXAotICB1aW50OF90IF9fYzIgPSB2Z2V0cV9sYW5lX3U4KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRfbGFuZV91OChfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlfbGFuZXFfdTE2KGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0X3QgX19hMSA9IChhMSk7IHVpbnQxNng4X3QgX19jMSA9IChjMSk7IFwKLSAgdWludDE2X3QgX19jMiA9IHZnZXRxX2xhbmVfdTE2KF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRfbGFuZV91MTYoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5X2xhbmVxX3UzMihhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Ml90IF9fYTEgPSAoYTEpOyB1aW50MzJ4NF90IF9fYzEgPSAoYzEpOyBcCi0gIHVpbnQzMl90IF9fYzIgPSB2Z2V0cV9sYW5lX3UzMihfX2MxLCBfX2QxKTsgXAotICB2c2V0X2xhbmVfdTMyKF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotI2RlZmluZSB2Y29weV9sYW5lcV91NjQoYTEsIF9fYjEsIGMxLCBfX2QxKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDFfdCBfX2ExID0gKGExKTsgdWludDY0eDJfdCBfX2MxID0gKGMxKTsgXAotICB1aW50NjRfdCBfX2MyID0gdmdldHFfbGFuZV91NjQoX19jMSwgX19kMSk7IFwKLSAgdnNldF9sYW5lX3U2NChfX2MyLCBfX2ExLCBfX2IxKTsgfSkKLSNkZWZpbmUgdmNvcHlfbGFuZXFfZjMyKGExLCBfX2IxLCBjMSwgX19kMSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4Ml90IF9fYTEgPSAoYTEpOyBmbG9hdDMyeDRfdCBfX2MxID0gKGMxKTsgXAotICBmbG9hdDMyX3QgX19jMiA9IHZnZXRxX2xhbmVfZjMyKF9fYzEsIF9fZDEpOyBcCi0gIHZzZXRfbGFuZV9mMzIoX19jMiwgX19hMSwgX19iMSk7IH0pCi0jZGVmaW5lIHZjb3B5X2xhbmVxX2Y2NChhMSwgX19iMSwgYzEsIF9fZDEpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDFfdCBfX2ExID0gKGExKTsgZmxvYXQ2NHgyX3QgX19jMSA9IChjMSk7IFwKLSAgZmxvYXQ2NF90IF9fYzIgPSB2Z2V0cV9sYW5lX2Y2NChfX2MxLCBfX2QxKTsgXAotICB2c2V0X2xhbmVfZjY0KF9fYzIsIF9fYTEsIF9fYjEpOyB9KQotCi1fX2FpIGZsb2F0NjR4MV90IHZjcmVhdGVfZjY0KHVpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4MV90KV9fYTsgfQotX19haSBwb2x5NjR4MV90IHZjcmVhdGVfcDY0KHVpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgxX3QpX19hOyB9Ci0KLSNkZWZpbmUgdmN2dF9uX2Y2NF9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MV90IF9fYSA9IChhKTsgXAotICAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdmN2dF9uX2Y2NF92KChpbnQ4eDhfdClfX2EsIF9fYiwgMyk7IH0pCi0jZGVmaW5lIHZjdnRfbl9mNjRfdTY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxX3QgX19hID0gKGEpOyBcCi0gIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y3Z0X25fZjY0X3YoKGludDh4OF90KV9fYSwgX19iLCAxOSk7IH0pCi0jZGVmaW5lIHZjdnRxX25fZjY0X3M2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2Y2NF92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDM1KTsgfSkKLSNkZWZpbmUgdmN2dHFfbl9mNjRfdTY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cV9uX2Y2NF92KChpbnQ4eDE2X3QpX19hLCBfX2IsIDUxKTsgfSkKLQotX19haSBmbG9hdDY0eDFfdCB2ZHVwX25fZjY0KGZsb2F0NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdCl7IF9fYSB9OyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZkdXBxX25fZjY0KGZsb2F0NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdCl7IF9fYSwgX19hIH07IH0KLV9fYWkgcG9seTY0eDFfdCB2ZHVwX25fcDY0KHBvbHk2NF90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgxX3QpeyBfX2EgfTsgfQotX19haSBwb2x5NjR4Ml90IHZkdXBxX25fcDY0KHBvbHk2NF90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgyX3QpeyBfX2EsIF9fYSB9OyB9Ci0KLV9fYWkgdWludDY0eDFfdCB2Y2FnZV9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZjYWdlX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTkpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNhZ2VxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmNhZ2VxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MSk7IH0KLQotX19haSB1aW50NjR4MV90IHZjYWd0X2Y2NChmbG9hdDY0eDFfdCBfX2EsIGZsb2F0NjR4MV90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgxX3QpX19idWlsdGluX25lb25fdmNhZ3RfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxOSk7IH0KLV9fYWkgdWludDY0eDJfdCB2Y2FndHFfZjY0KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Y2FndHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUxKTsgfQotCi1fX2FpIHVpbnQ2NHgxX3QgdmNhbGVfZjY0KGZsb2F0NjR4MV90IF9fYSwgZmxvYXQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y2FsZV92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE5KTsgfQotX19haSB1aW50NjR4Ml90IHZjYWxlcV9mNjQoZmxvYXQ2NHgyX3QgX19hLCBmbG9hdDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjYWxlcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTEpOyB9Ci0KLV9fYWkgdWludDY0eDFfdCB2Y2FsdF9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZjYWx0X3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTkpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmNhbHRxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmNhbHRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MSk7IH0KLQotX19haSBpbnQzMngyX3QgdmN2dGFfczMyX2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdmN2dGFfczMyX3YoKGludDh4OF90KV9fYSwgMik7IH0KLV9fYWkgaW50MzJ4NF90IHZjdnRhcV9zMzJfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0YXFfczMyX3YoKGludDh4MTZfdClfX2EsIDM0KTsgfQotCi1fX2FpIGludDY0eDFfdCB2Y3Z0YV9zNjRfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y3Z0YV9zNjRfdigoaW50OHg4X3QpX19hLCAzKTsgfQotX19haSBpbnQ2NHgyX3QgdmN2dGFxX3M2NF9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjdnRhcV9zNjRfdigoaW50OHgxNl90KV9fYSwgMzUpOyB9Ci0KLV9fYWkgdWludDMyeDJfdCB2Y3Z0YV91MzJfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmN2dGFfdTMyX3YoKGludDh4OF90KV9fYSwgMTgpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmN2dGFxX3UzMl9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0YXFfdTMyX3YoKGludDh4MTZfdClfX2EsIDUwKTsgfQotCi1fX2FpIHVpbnQ2NHgxX3QgdmN2dGFfdTY0X2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZjdnRhX3U2NF92KChpbnQ4eDhfdClfX2EsIDE5KTsgfQotX19haSB1aW50NjR4Ml90IHZjdnRhcV91NjRfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmN2dGFxX3U2NF92KChpbnQ4eDE2X3QpX19hLCA1MSk7IH0KLQotX19haSBpbnQzMngyX3QgdmN2dG1fczMyX2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdmN2dG1fczMyX3YoKGludDh4OF90KV9fYSwgMik7IH0KLV9fYWkgaW50MzJ4NF90IHZjdnRtcV9zMzJfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0bXFfczMyX3YoKGludDh4MTZfdClfX2EsIDM0KTsgfQotCi1fX2FpIGludDY0eDFfdCB2Y3Z0bV9zNjRfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y3Z0bV9zNjRfdigoaW50OHg4X3QpX19hLCAzKTsgfQotX19haSBpbnQ2NHgyX3QgdmN2dG1xX3M2NF9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjdnRtcV9zNjRfdigoaW50OHgxNl90KV9fYSwgMzUpOyB9Ci0KLV9fYWkgdWludDMyeDJfdCB2Y3Z0bV91MzJfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmN2dG1fdTMyX3YoKGludDh4OF90KV9fYSwgMTgpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmN2dG1xX3UzMl9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0bXFfdTMyX3YoKGludDh4MTZfdClfX2EsIDUwKTsgfQotCi1fX2FpIHVpbnQ2NHgxX3QgdmN2dG1fdTY0X2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZjdnRtX3U2NF92KChpbnQ4eDhfdClfX2EsIDE5KTsgfQotX19haSB1aW50NjR4Ml90IHZjdnRtcV91NjRfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmN2dG1xX3U2NF92KChpbnQ4eDE2X3QpX19hLCA1MSk7IH0KLQotX19haSBpbnQzMngyX3QgdmN2dG5fczMyX2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdmN2dG5fczMyX3YoKGludDh4OF90KV9fYSwgMik7IH0KLV9fYWkgaW50MzJ4NF90IHZjdnRucV9zMzJfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0bnFfczMyX3YoKGludDh4MTZfdClfX2EsIDM0KTsgfQotCi1fX2FpIGludDY0eDFfdCB2Y3Z0bl9zNjRfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y3Z0bl9zNjRfdigoaW50OHg4X3QpX19hLCAzKTsgfQotX19haSBpbnQ2NHgyX3QgdmN2dG5xX3M2NF9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjdnRucV9zNjRfdigoaW50OHgxNl90KV9fYSwgMzUpOyB9Ci0KLV9fYWkgdWludDMyeDJfdCB2Y3Z0bl91MzJfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmN2dG5fdTMyX3YoKGludDh4OF90KV9fYSwgMTgpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmN2dG5xX3UzMl9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0bnFfdTMyX3YoKGludDh4MTZfdClfX2EsIDUwKTsgfQotCi1fX2FpIHVpbnQ2NHgxX3QgdmN2dG5fdTY0X2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZjdnRuX3U2NF92KChpbnQ4eDhfdClfX2EsIDE5KTsgfQotX19haSB1aW50NjR4Ml90IHZjdnRucV91NjRfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmN2dG5xX3U2NF92KChpbnQ4eDE2X3QpX19hLCA1MSk7IH0KLQotX19haSBpbnQzMngyX3QgdmN2dHBfczMyX2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdmN2dHBfczMyX3YoKGludDh4OF90KV9fYSwgMik7IH0KLV9fYWkgaW50MzJ4NF90IHZjdnRwcV9zMzJfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfczMyX3YoKGludDh4MTZfdClfX2EsIDM0KTsgfQotCi1fX2FpIGludDY0eDFfdCB2Y3Z0cF9zNjRfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cF9zNjRfdigoaW50OHg4X3QpX19hLCAzKTsgfQotX19haSBpbnQ2NHgyX3QgdmN2dHBxX3M2NF9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjdnRwcV9zNjRfdigoaW50OHgxNl90KV9fYSwgMzUpOyB9Ci0KLV9fYWkgdWludDMyeDJfdCB2Y3Z0cF91MzJfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdmN2dHBfdTMyX3YoKGludDh4OF90KV9fYSwgMTgpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdmN2dHBxX3UzMl9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cHFfdTMyX3YoKGludDh4MTZfdClfX2EsIDUwKTsgfQotCi1fX2FpIHVpbnQ2NHgxX3QgdmN2dHBfdTY0X2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZjdnRwX3U2NF92KChpbnQ4eDhfdClfX2EsIDE5KTsgfQotX19haSB1aW50NjR4Ml90IHZjdnRwcV91NjRfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmN2dHBxX3U2NF92KChpbnQ4eDE2X3QpX19hLCA1MSk7IH0KLQotI2RlZmluZSB2Y3Z0X25fczY0X2Y2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDFfdCBfX2EgPSAoYSk7IFwKLSAgKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y3Z0X25fczY0X3YoKGludDh4OF90KV9fYSwgX19iLCAzKTsgfSkKLSNkZWZpbmUgdmN2dHFfbl9zNjRfZjY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4Ml90IF9fYSA9IChhKTsgXAotICAoaW50NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjdnRxX25fczY0X3YoKGludDh4MTZfdClfX2EsIF9fYiwgMzUpOyB9KQotCi0jZGVmaW5lIHZjdnRfbl91NjRfZjY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MV90IF9fYSA9IChhKTsgXAotICAodWludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y3Z0X25fdTY0X3YoKGludDh4OF90KV9fYSwgX19iLCAxOSk7IH0pCi0jZGVmaW5lIHZjdnRxX25fdTY0X2Y2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdmN2dHFfbl91NjRfdigoaW50OHgxNl90KV9fYSwgX19iLCA1MSk7IH0pCi0KLV9fYWkgZmxvYXQzMngyX3QgdmRpdl9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAvIF9fYjsgfQotX19haSBmbG9hdDY0eDFfdCB2ZGl2X2Y2NChmbG9hdDY0eDFfdCBfX2EsIGZsb2F0NjR4MV90IF9fYikgewotICByZXR1cm4gX19hIC8gX19iOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZkaXZxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hIC8gX19iOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZkaXZxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gX19hIC8gX19iOyB9Ci0KLV9fYWkgZmxvYXQzMngyX3Qgdm1heG5tX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZtYXhubV92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDgpOyB9Ci1fX2FpIGZsb2F0NjR4MV90IHZtYXhubV9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92bWF4bm1fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA5KTsgfQotX19haSBmbG9hdDMyeDRfdCB2bWF4bm1xX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZtYXhubXFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQwKTsgfQotX19haSBmbG9hdDY0eDJfdCB2bWF4bm1xX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZtYXhubXFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQxKTsgfQotCi1fX2FpIGZsb2F0MzJ4Ml90IHZwbWF4bm1fZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdnBtYXhubV92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDgpOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZwbWF4bm1xX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwbWF4bm1xX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0MCk7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnBtYXhubXFfZjY0KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19idWlsdGluX25lb25fdnBtYXhubXFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQxKTsgfQotCi1fX2FpIGZsb2F0MzJfdCB2bWF4bm12X2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyX3QpX19idWlsdGluX25lb25fdm1heG5tdl9mMzIoX19hKTsgfQotX19haSBmbG9hdDMyX3Qgdm1heG5tdnFfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92bWF4bm12cV9mMzIoX19hKTsgfQotX19haSBmbG9hdDY0X3Qgdm1heG5tdnFfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjRfdClfX2J1aWx0aW5fbmVvbl92bWF4bm12cV9mNjQoX19hKTsgfQotCi1fX2FpIGZsb2F0MzJ4Ml90IHZtaW5ubV9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92bWlubm1fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA4KTsgfQotX19haSBmbG9hdDY0eDFfdCB2bWlubm1fZjY0KGZsb2F0NjR4MV90IF9fYSwgZmxvYXQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdm1pbm5tX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgOSk7IH0KLV9fYWkgZmxvYXQzMng0X3Qgdm1pbm5tcV9mMzIoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDRfdClfX2J1aWx0aW5fbmVvbl92bWlubm1xX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0MCk7IH0KLV9fYWkgZmxvYXQ2NHgyX3Qgdm1pbm5tcV9mNjQoZmxvYXQ2NHgyX3QgX19hLCBmbG9hdDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92bWlubm1xX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0MSk7IH0KLQotX19haSBmbG9hdDMyeDJfdCB2cG1pbm5tX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZwbWlubm1fdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA4KTsgfQotX19haSBmbG9hdDMyeDRfdCB2cG1pbm5tcV9mMzIoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cG1pbm5tcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDApOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZwbWlubm1xX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZwbWlubm1xX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0MSk7IH0KLQotX19haSBmbG9hdDMyX3Qgdm1pbm5tdl9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMl90KV9fYnVpbHRpbl9uZW9uX3ZtaW5ubXZfZjMyKF9fYSk7IH0KLV9fYWkgZmxvYXQzMl90IHZtaW5ubXZxX2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyX3QpX19idWlsdGluX25lb25fdm1pbm5tdnFfZjMyKF9fYSk7IH0KLV9fYWkgZmxvYXQ2NF90IHZtaW5ubXZxX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdm1pbm5tdnFfZjY0KF9fYSk7IH0KLQotX19haSBmbG9hdDY0eDFfdCB2Zm1hX2Y2NChmbG9hdDY0eDFfdCBfX2EsIGZsb2F0NjR4MV90IF9fYiwgZmxvYXQ2NHgxX3QgX19jKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdmZtYV92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDkpOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZmbWFxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYiwgZmxvYXQ2NHgyX3QgX19jKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19idWlsdGluX25lb25fdmZtYXFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCA0MSk7IH0KLQotX19haSBmbG9hdDMyeDJfdCB2Zm1hX25fZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iLCBmbG9hdDMyX3QgX19jKSB7Ci0gIHJldHVybiB2Zm1hX2YzMihfX2EsIF9fYiwgKGZsb2F0MzJ4Ml90KXsgX19jLCBfX2MgfSk7IH0KLV9fYWkgZmxvYXQzMng0X3QgdmZtYXFfbl9mMzIoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IsIGZsb2F0MzJfdCBfX2MpIHsKLSAgcmV0dXJuIHZmbWFxX2YzMihfX2EsIF9fYiwgKGZsb2F0MzJ4NF90KXsgX19jLCBfX2MsIF9fYywgX19jIH0pOyB9Ci0KLV9fYWkgZmxvYXQzMngyX3QgdmZtc19mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IsIGZsb2F0MzJ4Ml90IF9fYykgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZmbXNfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAoaW50OHg4X3QpX19jLCA4KTsgfQotX19haSBmbG9hdDY0eDFfdCB2Zm1zX2Y2NChmbG9hdDY0eDFfdCBfX2EsIGZsb2F0NjR4MV90IF9fYiwgZmxvYXQ2NHgxX3QgX19jKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdmZtc192KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIDkpOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZmbXNxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYiwgZmxvYXQzMng0X3QgX19jKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX25lb25fdmZtc3FfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDE2X3QpX19jLCA0MCk7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdmZtc3FfZjY0KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iLCBmbG9hdDY0eDJfdCBfX2MpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Zm1zcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgKGludDh4MTZfdClfX2MsIDQxKTsgfQotCi1fX2FpIGZsb2F0MzJ4Ml90IHZmbXNfbl9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IsIGZsb2F0MzJfdCBfX2MpIHsKLSAgcmV0dXJuIHZmbXNfZjMyKF9fYSwgX19iLCAoZmxvYXQzMngyX3QpeyBfX2MsIF9fYyB9KTsgfQotX19haSBmbG9hdDMyeDRfdCB2Zm1zcV9uX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYiwgZmxvYXQzMl90IF9fYykgewotICByZXR1cm4gdmZtc3FfZjMyKF9fYSwgX19iLCAoZmxvYXQzMng0X3QpeyBfX2MsIF9fYywgX19jLCBfX2MgfSk7IH0KLQotX19haSBmbG9hdDY0eDFfdCB2cmVjcGVfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZyZWNwZV92KChpbnQ4eDhfdClfX2EsIDkpOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZyZWNwZXFfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZyZWNwZXFfdigoaW50OHgxNl90KV9fYSwgNDEpOyB9Ci0KLV9fYWkgZmxvYXQ2NHgxX3QgdnJlY3BzX2Y2NChmbG9hdDY0eDFfdCBfX2EsIGZsb2F0NjR4MV90IF9fYikgewotICByZXR1cm4gKGZsb2F0NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZyZWNwc192KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDkpOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZyZWNwc3FfZjY0KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19idWlsdGluX25lb25fdnJlY3BzcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDEpOyB9Ci0KLV9fYWkgZmxvYXQzMngyX3QgdnJuZGFfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZybmRhX3YoKGludDh4OF90KV9fYSwgOCk7IH0KLV9fYWkgZmxvYXQ2NHgxX3QgdnJuZGFfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZybmRhX3YoKGludDh4OF90KV9fYSwgOSk7IH0KLV9fYWkgZmxvYXQzMng0X3QgdnJuZGFxX2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cm5kYXFfdigoaW50OHgxNl90KV9fYSwgNDApOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZybmRhcV9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19idWlsdGluX25lb25fdnJuZGFxX3YoKGludDh4MTZfdClfX2EsIDQxKTsgfQotCi1fX2FpIGZsb2F0MzJ4Ml90IHZybmRpX2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cm5kaV92KChpbnQ4eDhfdClfX2EsIDgpOyB9Ci1fX2FpIGZsb2F0NjR4MV90IHZybmRpX2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cm5kaV92KChpbnQ4eDhfdClfX2EsIDkpOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZybmRpcV9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX25lb25fdnJuZGlxX3YoKGludDh4MTZfdClfX2EsIDQwKTsgfQotX19haSBmbG9hdDY0eDJfdCB2cm5kaXFfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZybmRpcV92KChpbnQ4eDE2X3QpX19hLCA0MSk7IH0KLQotX19haSBmbG9hdDMyeDJfdCB2cm5kbV9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdnJuZG1fdigoaW50OHg4X3QpX19hLCA4KTsgfQotX19haSBmbG9hdDY0eDFfdCB2cm5kbV9mNjQoZmxvYXQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdnJuZG1fdigoaW50OHg4X3QpX19hLCA5KTsgfQotX19haSBmbG9hdDMyeDRfdCB2cm5kbXFfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZybmRtcV92KChpbnQ4eDE2X3QpX19hLCA0MCk7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnJuZG1xX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92cm5kbXFfdigoaW50OHgxNl90KV9fYSwgNDEpOyB9Ci0KLV9fYWkgZmxvYXQzMngyX3QgdnJuZG5fZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZybmRuX3YoKGludDh4OF90KV9fYSwgOCk7IH0KLV9fYWkgZmxvYXQ2NHgxX3QgdnJuZG5fZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZybmRuX3YoKGludDh4OF90KV9fYSwgOSk7IH0KLV9fYWkgZmxvYXQzMng0X3QgdnJuZG5xX2YzMihmbG9hdDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cm5kbnFfdigoaW50OHgxNl90KV9fYSwgNDApOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZybmRucV9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19idWlsdGluX25lb25fdnJuZG5xX3YoKGludDh4MTZfdClfX2EsIDQxKTsgfQotCi1fX2FpIGZsb2F0MzJ4Ml90IHZybmRwX2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92cm5kcF92KChpbnQ4eDhfdClfX2EsIDgpOyB9Ci1fX2FpIGZsb2F0NjR4MV90IHZybmRwX2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cm5kcF92KChpbnQ4eDhfdClfX2EsIDkpOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZybmRwcV9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX25lb25fdnJuZHBxX3YoKGludDh4MTZfdClfX2EsIDQwKTsgfQotX19haSBmbG9hdDY0eDJfdCB2cm5kcHFfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZybmRwcV92KChpbnQ4eDE2X3QpX19hLCA0MSk7IH0KLQotX19haSBmbG9hdDMyeDJfdCB2cm5keF9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdnJuZHhfdigoaW50OHg4X3QpX19hLCA4KTsgfQotX19haSBmbG9hdDY0eDFfdCB2cm5keF9mNjQoZmxvYXQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdnJuZHhfdigoaW50OHg4X3QpX19hLCA5KTsgfQotX19haSBmbG9hdDMyeDRfdCB2cm5keHFfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZybmR4cV92KChpbnQ4eDE2X3QpX19hLCA0MCk7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnJuZHhxX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92cm5keHFfdigoaW50OHgxNl90KV9fYSwgNDEpOyB9Ci0KLV9fYWkgZmxvYXQzMngyX3QgdnJuZF9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdnJuZF92KChpbnQ4eDhfdClfX2EsIDgpOyB9Ci1fX2FpIGZsb2F0NjR4MV90IHZybmRfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZybmRfdigoaW50OHg4X3QpX19hLCA5KTsgfQotX19haSBmbG9hdDMyeDRfdCB2cm5kcV9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX25lb25fdnJuZHFfdigoaW50OHgxNl90KV9fYSwgNDApOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZybmRxX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92cm5kcV92KChpbnQ4eDE2X3QpX19hLCA0MSk7IH0KLQotX19haSBmbG9hdDY0eDFfdCB2cnNxcnRlX2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cnNxcnRlX3YoKGludDh4OF90KV9fYSwgOSk7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnJzcXJ0ZXFfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3Zyc3FydGVxX3YoKGludDh4MTZfdClfX2EsIDQxKTsgfQotCi1fX2FpIGZsb2F0NjR4MV90IHZyc3FydHNfZjY0KGZsb2F0NjR4MV90IF9fYSwgZmxvYXQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdnJzcXJ0c192KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDkpOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZyc3FydHNxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3Zyc3FydHNxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0MSk7IH0KLQotX19haSBmbG9hdDMyeDJfdCB2c3FydF9mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdnNxcnRfdigoaW50OHg4X3QpX19hLCA4KTsgfQotX19haSBmbG9hdDY0eDFfdCB2c3FydF9mNjQoZmxvYXQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdnNxcnRfdigoaW50OHg4X3QpX19hLCA5KTsgfQotX19haSBmbG9hdDMyeDRfdCB2c3FydHFfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzcXJ0cV92KChpbnQ4eDE2X3QpX19hLCA0MCk7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnNxcnRxX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92c3FydHFfdigoaW50OHgxNl90KV9fYSwgNDEpOyB9Ci0KLSNkZWZpbmUgdmdldF9sYW5lX2Y2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDFfdCBfX2EgPSAoYSk7IFwKLSAgKGZsb2F0NjRfdClfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfZjY0KF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmdldHFfbGFuZV9mNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyX3QgX19hID0gKGEpOyBcCi0gIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdmdldHFfbGFuZV9mNjQoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2Z2V0X2xhbmVfcDY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxX3QgX19hID0gKGEpOyBcCi0gIChwb2x5NjRfdClfX2J1aWx0aW5fbmVvbl92Z2V0X2xhbmVfaTY0KChpbnQ2NHgxX3QpX19hLCBfX2IpOyB9KQotI2RlZmluZSB2Z2V0cV9sYW5lX3A2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4Ml90IF9fYSA9IChhKTsgXAotICAocG9seTY0X3QpX19idWlsdGluX25lb25fdmdldHFfbGFuZV9pNjQoKGludDY0eDJfdClfX2EsIF9fYik7IH0pCi0KLSNkZWZpbmUgdmxkMXFfZjY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92bGQxcV92KF9fYSwgNDEpOyB9KQotI2RlZmluZSB2bGQxX2Y2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdmxkMV92KF9fYSwgOSk7IH0pCi0jZGVmaW5lIHZsZDFfcDY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChwb2x5NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfdihfX2EsIDYpOyB9KQotI2RlZmluZSB2bGQxcV9wNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgKHBvbHk2NHgyX3QpX19idWlsdGluX25lb25fdmxkMXFfdihfX2EsIDM4KTsgfSkKLQotI2RlZmluZSB2bGQxcV9kdXBfZjY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92bGQxcV9kdXBfdihfX2EsIDQxKTsgfSkKLSNkZWZpbmUgdmxkMXFfZHVwX3A2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAocG9seTY0eDJfdClfX2J1aWx0aW5fbmVvbl92bGQxcV9kdXBfdihfX2EsIDM4KTsgfSkKLSNkZWZpbmUgdmxkMV9kdXBfZjY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92bGQxX2R1cF92KF9fYSwgOSk7IH0pCi0jZGVmaW5lIHZsZDFfZHVwX3A2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICAocG9seTY0eDFfdClfX2J1aWx0aW5fbmVvbl92bGQxX2R1cF92KF9fYSwgNik7IH0pCi0KLSNkZWZpbmUgdmxkMXFfbGFuZV9mNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZsZDFxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDQxKTsgfSkKLSNkZWZpbmUgdmxkMXFfbGFuZV9wNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4Ml90IF9fYiA9IChiKTsgXAotICAocG9seTY0eDJfdClfX2J1aWx0aW5fbmVvbl92bGQxcV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzOCk7IH0pCi0jZGVmaW5lIHZsZDFfbGFuZV9mNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDFfdCBfX2IgPSAoYik7IFwKLSAgKGZsb2F0NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYiwgX19jLCA5KTsgfSkKLSNkZWZpbmUgdmxkMV9sYW5lX3A2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxX3QgX19iID0gKGIpOyBcCi0gIChwb2x5NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZsZDFfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYiwgX19jLCA2KTsgfSkKLQotI2RlZmluZSB2bGQxcV91OF94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHgxNngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDJfdigmciwgX19hLCA0OCk7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX3UxNl94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDJfdigmciwgX19hLCA0OSk7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX3UzMl94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDJfdigmciwgX19hLCA1MCk7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX3U2NF94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDJfdigmciwgX19hLCA1MSk7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX3M4X3gyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4MTZ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFxX3gyX3YoJnIsIF9fYSwgMzIpOyByOyB9KQotI2RlZmluZSB2bGQxcV9zMTZfeDIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDJfdigmciwgX19hLCAzMyk7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX3MzMl94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94Ml92KCZyLCBfX2EsIDM0KTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfczY0X3gyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFxX3gyX3YoJnIsIF9fYSwgMzUpOyByOyB9KQotI2RlZmluZSB2bGQxcV9mMTZfeDIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94Ml92KCZyLCBfX2EsIDM5KTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfZjMyX3gyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDJfdigmciwgX19hLCA0MCk7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX2Y2NF94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFxX3gyX3YoJnIsIF9fYSwgNDEpOyByOyB9KQotI2RlZmluZSB2bGQxcV9wOF94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHgxNngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDJfdigmciwgX19hLCAzNik7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX3AxNl94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDJfdigmciwgX19hLCAzNyk7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX3A2NF94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDJfdigmciwgX19hLCAzOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDFfdThfeDIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMV94Ml92KCZyLCBfX2EsIDE2KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV91MTZfeDIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDJfdigmciwgX19hLCAxNyk7IHI7IH0pCi0jZGVmaW5lIHZsZDFfdTMyX3gyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3gyX3YoJnIsIF9fYSwgMTgpOyByOyB9KQotI2RlZmluZSB2bGQxX3U2NF94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4MXgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMV94Ml92KCZyLCBfX2EsIDE5KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9zOF94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDJfdigmciwgX19hLCAwKTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9zMTZfeDIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMV94Ml92KCZyLCBfX2EsIDEpOyByOyB9KQotI2RlZmluZSB2bGQxX3MzMl94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3gyX3YoJnIsIF9fYSwgMik7IHI7IH0pCi0jZGVmaW5lIHZsZDFfczY0X3gyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDF4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDJfdigmciwgX19hLCAzKTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9mMTZfeDIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3gyX3YoJnIsIF9fYSwgNyk7IHI7IH0pCi0jZGVmaW5lIHZsZDFfZjMyX3gyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMV94Ml92KCZyLCBfX2EsIDgpOyByOyB9KQotI2RlZmluZSB2bGQxX2Y2NF94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDF4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDJfdigmciwgX19hLCA5KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9wOF94MihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHg4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3gyX3YoJnIsIF9fYSwgNCk7IHI7IH0pCi0jZGVmaW5lIHZsZDFfcDE2X3gyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3gyX3YoJnIsIF9fYSwgNSk7IHI7IH0pCi0jZGVmaW5lIHZsZDFfcDY0X3gyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3gyX3YoJnIsIF9fYSwgNik7IHI7IH0pCi0KLSNkZWZpbmUgdmxkMnFfdTY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV92KCZyLCBfX2EsIDUxKTsgcjsgfSkKLSNkZWZpbmUgdmxkMnFfczY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX3YoJnIsIF9fYSwgMzUpOyByOyB9KQotI2RlZmluZSB2bGQycV9mNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV92KCZyLCBfX2EsIDQxKTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9mNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgxeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX3YoJnIsIF9fYSwgOSk7IHI7IH0pCi0jZGVmaW5lIHZsZDJfcDY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX3YoJnIsIF9fYSwgNik7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX3A2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMnFfdigmciwgX19hLCAzOCk7IHI7IH0pCi0KLSNkZWZpbmUgdmxkMnFfZHVwX3U4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9kdXBfdigmciwgX19hLCA0OCk7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2R1cF91MTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDh4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX2R1cF92KCZyLCBfX2EsIDQ5KTsgcjsgfSkKLSNkZWZpbmUgdmxkMnFfZHVwX3UzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMnFfZHVwX3YoJnIsIF9fYSwgNTApOyByOyB9KQotI2RlZmluZSB2bGQycV9kdXBfdTY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9kdXBfdigmciwgX19hLCA1MSk7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2R1cF9zOChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDE2eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9kdXBfdigmciwgX19hLCAzMik7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2R1cF9zMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OHgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMnFfZHVwX3YoJnIsIF9fYSwgMzMpOyByOyB9KQotI2RlZmluZSB2bGQycV9kdXBfczMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDR4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX2R1cF92KCZyLCBfX2EsIDM0KTsgcjsgfSkKLSNkZWZpbmUgdmxkMnFfZHVwX3M2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9kdXBfdigmciwgX19hLCAzNSk7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2R1cF9mMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9kdXBfdigmciwgX19hLCAzOSk7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2R1cF9mMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9kdXBfdigmciwgX19hLCA0MCk7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2R1cF9mNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9kdXBfdigmciwgX19hLCA0MSk7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2R1cF9wOChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHgxNngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMnFfZHVwX3YoJnIsIF9fYSwgMzYpOyByOyB9KQotI2RlZmluZSB2bGQycV9kdXBfcDE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9kdXBfdigmciwgX19hLCAzNyk7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2R1cF9wNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDJ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX2R1cF92KCZyLCBfX2EsIDM4KTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9kdXBfZjY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MXgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9kdXBfdigmciwgX19hLCA5KTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9kdXBfcDY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX2R1cF92KCZyLCBfX2EsIDYpOyByOyB9KQotCi0jZGVmaW5lIHZsZDJxX2xhbmVfdTgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHgxNngyX3QgX19iID0gKGIpOyBcCi0gIHVpbnQ4eDE2eDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9sYW5lX3YoJnIsIF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIF9fYywgNDgpOyByOyB9KQotI2RlZmluZSB2bGQycV9sYW5lX3U2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDJfdCBfX2IgPSAoYik7IFwKLSAgdWludDY0eDJ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgX19jLCA1MSk7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2xhbmVfczgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDE2eDJfdCBfX2IgPSAoYik7IFwKLSAgaW50OHgxNngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMnFfbGFuZV92KCZyLCBfX2EsIF9fYi52YWxbMF0sIF9fYi52YWxbMV0sIF9fYywgMzIpOyByOyB9KQotI2RlZmluZSB2bGQycV9sYW5lX3M2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJ4Ml90IF9fYiA9IChiKTsgXAotICBpbnQ2NHgyeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQycV9sYW5lX3YoJnIsIF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIF9fYywgMzUpOyByOyB9KQotI2RlZmluZSB2bGQycV9sYW5lX2Y2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MngyX3QgX19iID0gKGIpOyBcCi0gIGZsb2F0NjR4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMnFfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCBfX2MsIDQxKTsgcjsgfSkKLSNkZWZpbmUgdmxkMnFfbGFuZV9wOChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2eDJfdCBfX2IgPSAoYik7IFwKLSAgcG9seTh4MTZ4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgX19jLCAzNik7IHI7IH0pCi0jZGVmaW5lIHZsZDJxX2xhbmVfcDY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDJ4Ml90IF9fYiA9IChiKTsgXAotICBwb2x5NjR4MngyX3QgcjsgX19idWlsdGluX25lb25fdmxkMnFfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCBfX2MsIDM4KTsgcjsgfSkKLSNkZWZpbmUgdmxkMl9sYW5lX3U2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDJfdCBfX2IgPSAoYik7IFwKLSAgdWludDY0eDF4Ml90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDJfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgX19jLCAxOSk7IHI7IH0pCi0jZGVmaW5lIHZsZDJfbGFuZV9zNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgxeDJfdCBfX2IgPSAoYik7IFwKLSAgaW50NjR4MXgyX3QgcjsgX19idWlsdGluX25lb25fdmxkMl9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCBfX2MsIDMpOyByOyB9KQotI2RlZmluZSB2bGQyX2xhbmVfZjY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgxeDJfdCBfX2IgPSAoYik7IFwKLSAgZmxvYXQ2NHgxeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX2xhbmVfdigmciwgX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIF9fYywgOSk7IHI7IH0pCi0jZGVmaW5lIHZsZDJfbGFuZV9wNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MXgyX3QgX19iID0gKGIpOyBcCi0gIHBvbHk2NHgxeDJfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQyX2xhbmVfdigmciwgX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIF9fYywgNik7IHI7IH0pCi0KLSNkZWZpbmUgdmxkM3FfdTY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV92KCZyLCBfX2EsIDUxKTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfczY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJ4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNxX3YoJnIsIF9fYSwgMzUpOyByOyB9KQotI2RlZmluZSB2bGQzcV9mNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV92KCZyLCBfX2EsIDQxKTsgcjsgfSkKLSNkZWZpbmUgdmxkM19mNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgxeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX3YoJnIsIF9fYSwgOSk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfcDY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX3YoJnIsIF9fYSwgNik7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX3A2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MngzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfdigmciwgX19hLCAzOCk7IHI7IH0pCi0KLSNkZWZpbmUgdmxkM3FfZHVwX3U4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdigmciwgX19hLCA0OCk7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX2R1cF91MTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDh4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNxX2R1cF92KCZyLCBfX2EsIDQ5KTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfZHVwX3UzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfZHVwX3YoJnIsIF9fYSwgNTApOyByOyB9KQotI2RlZmluZSB2bGQzcV9kdXBfdTY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdigmciwgX19hLCA1MSk7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX2R1cF9zOChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDE2eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdigmciwgX19hLCAzMik7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX2R1cF9zMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfZHVwX3YoJnIsIF9fYSwgMzMpOyByOyB9KQotI2RlZmluZSB2bGQzcV9kdXBfczMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDR4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNxX2R1cF92KCZyLCBfX2EsIDM0KTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfZHVwX3M2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdigmciwgX19hLCAzNSk7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX2R1cF9mMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdigmciwgX19hLCAzOSk7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX2R1cF9mMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdigmciwgX19hLCA0MCk7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX2R1cF9mNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdigmciwgX19hLCA0MSk7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX2R1cF9wOChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHgxNngzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfZHVwX3YoJnIsIF9fYSwgMzYpOyByOyB9KQotI2RlZmluZSB2bGQzcV9kdXBfcDE2KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV9kdXBfdigmciwgX19hLCAzNyk7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX2R1cF9wNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDJ4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNxX2R1cF92KCZyLCBfX2EsIDM4KTsgcjsgfSkKLSNkZWZpbmUgdmxkM19kdXBfZjY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MXgzX3QgcjsgX19idWlsdGluX25lb25fdmxkM19kdXBfdigmciwgX19hLCA5KTsgcjsgfSkKLSNkZWZpbmUgdmxkM19kdXBfcDY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX2R1cF92KCZyLCBfX2EsIDYpOyByOyB9KQotCi0jZGVmaW5lIHZsZDNxX2xhbmVfdTgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHgxNngzX3QgX19iID0gKGIpOyBcCi0gIHVpbnQ4eDE2eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzcV9sYW5lX3YoJnIsIF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgX19jLCA0OCk7IHI7IH0pCi0jZGVmaW5lIHZsZDNxX2xhbmVfdTY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJ4M190IF9fYiA9IChiKTsgXAotICB1aW50NjR4MngzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgNTEpOyByOyB9KQotI2RlZmluZSB2bGQzcV9sYW5lX3M4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNngzX3QgX19iID0gKGIpOyBcCi0gIGludDh4MTZ4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNxX2xhbmVfdigmciwgX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCBfX2MsIDMyKTsgcjsgfSkKLSNkZWZpbmUgdmxkM3FfbGFuZV9zNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyeDNfdCBfX2IgPSAoYik7IFwKLSAgaW50NjR4MngzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgMzUpOyByOyB9KQotI2RlZmluZSB2bGQzcV9sYW5lX2Y2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MngzX3QgX19iID0gKGIpOyBcCi0gIGZsb2F0NjR4MngzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgNDEpOyByOyB9KQotI2RlZmluZSB2bGQzcV9sYW5lX3A4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4MTZ4M190IF9fYiA9IChiKTsgXAotICBwb2x5OHgxNngzX3QgcjsgX19idWlsdGluX25lb25fdmxkM3FfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgMzYpOyByOyB9KQotI2RlZmluZSB2bGQzcV9sYW5lX3A2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgyeDNfdCBfX2IgPSAoYik7IFwKLSAgcG9seTY0eDJ4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCBfX2MsIDM4KTsgcjsgfSkKLSNkZWZpbmUgdmxkM19sYW5lX3U2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDNfdCBfX2IgPSAoYik7IFwKLSAgdWludDY0eDF4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIF9fYywgMTkpOyByOyB9KQotI2RlZmluZSB2bGQzX2xhbmVfczY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXgzX3QgX19iID0gKGIpOyBcCi0gIGludDY0eDF4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIF9fYywgMyk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfbGFuZV9mNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDF4M190IF9fYiA9IChiKTsgXAotICBmbG9hdDY0eDF4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDNfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIF9fYywgOSk7IHI7IH0pCi0jZGVmaW5lIHZsZDNfbGFuZV9wNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MXgzX3QgX19iID0gKGIpOyBcCi0gIHBvbHk2NHgxeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQzX2xhbmVfdigmciwgX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCBfX2MsIDYpOyByOyB9KQotCi0jZGVmaW5lIHZsZDFxX3U4X3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94M192KCZyLCBfX2EsIDQ4KTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfdTE2X3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94M192KCZyLCBfX2EsIDQ5KTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfdTMyX3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94M192KCZyLCBfX2EsIDUwKTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfdTY0X3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94M192KCZyLCBfX2EsIDUxKTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfczhfeDMoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNngzX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDNfdigmciwgX19hLCAzMik7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX3MxNl94MyhfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94M192KCZyLCBfX2EsIDMzKTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfczMyX3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDR4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFxX3gzX3YoJnIsIF9fYSwgMzQpOyByOyB9KQotI2RlZmluZSB2bGQxcV9zNjRfeDMoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MngzX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDNfdigmciwgX19hLCAzNSk7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX2YxNl94MyhfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDh4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFxX3gzX3YoJnIsIF9fYSwgMzkpOyByOyB9KQotI2RlZmluZSB2bGQxcV9mMzJfeDMoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94M192KCZyLCBfX2EsIDQwKTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfZjY0X3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MngzX3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDNfdigmciwgX19hLCA0MSk7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX3A4X3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94M192KCZyLCBfX2EsIDM2KTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfcDE2X3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94M192KCZyLCBfX2EsIDM3KTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfcDY0X3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgyeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94M192KCZyLCBfX2EsIDM4KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV91OF94MyhfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3gzX3YoJnIsIF9fYSwgMTYpOyByOyB9KQotI2RlZmluZSB2bGQxX3UxNl94MyhfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkMV94M192KCZyLCBfX2EsIDE3KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV91MzJfeDMoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJ4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdigmciwgX19hLCAxOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDFfdTY0X3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3gzX3YoJnIsIF9fYSwgMTkpOyByOyB9KQotI2RlZmluZSB2bGQxX3M4X3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4OHgzX3QgcjsgX19idWlsdGluX25lb25fdmxkMV94M192KCZyLCBfX2EsIDApOyByOyB9KQotI2RlZmluZSB2bGQxX3MxNl94MyhfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0eDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3gzX3YoJnIsIF9fYSwgMSk7IHI7IH0pCi0jZGVmaW5lIHZsZDFfczMyX3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJ4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdigmciwgX19hLCAyKTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9zNjRfeDMoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXgzX3QgcjsgX19idWlsdGluX25lb25fdmxkMV94M192KCZyLCBfX2EsIDMpOyByOyB9KQotI2RlZmluZSB2bGQxX2YxNl94MyhfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDR4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdigmciwgX19hLCA3KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9mMzJfeDMoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyeDNfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3gzX3YoJnIsIF9fYSwgOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDFfZjY0X3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MXgzX3QgcjsgX19idWlsdGluX25lb25fdmxkMV94M192KCZyLCBfX2EsIDkpOyByOyB9KQotI2RlZmluZSB2bGQxX3A4X3gzKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDh4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdigmciwgX19hLCA0KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9wMTZfeDMoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDR4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdigmciwgX19hLCA1KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9wNjRfeDMoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDF4M190IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDNfdigmciwgX19hLCA2KTsgcjsgfSkKLQotI2RlZmluZSB2bGQ0cV91NjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX3YoJnIsIF9fYSwgNTEpOyByOyB9KQotI2RlZmluZSB2bGQ0cV9zNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Mng0X3QgcjsgX19idWlsdGluX25lb25fdmxkNHFfdigmciwgX19hLCAzNSk7IHI7IH0pCi0jZGVmaW5lIHZsZDRxX2Y2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX3YoJnIsIF9fYSwgNDEpOyByOyB9KQotI2RlZmluZSB2bGQ0X2Y2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDF4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfdigmciwgX19hLCA5KTsgcjsgfSkKLSNkZWZpbmUgdmxkNF9wNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDF4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfdigmciwgX19hLCA2KTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfcDY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgyeDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV92KCZyLCBfX2EsIDM4KTsgcjsgfSkKLQotI2RlZmluZSB2bGQ0cV9kdXBfdTgoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92KCZyLCBfX2EsIDQ4KTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfZHVwX3UxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNHFfZHVwX3YoJnIsIF9fYSwgNDkpOyByOyB9KQotI2RlZmluZSB2bGQ0cV9kdXBfdTMyKF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV9kdXBfdigmciwgX19hLCA1MCk7IHI7IH0pCi0jZGVmaW5lIHZsZDRxX2R1cF91NjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92KCZyLCBfX2EsIDUxKTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfZHVwX3M4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4MTZ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92KCZyLCBfX2EsIDMyKTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfZHVwX3MxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV9kdXBfdigmciwgX19hLCAzMyk7IHI7IH0pCi0jZGVmaW5lIHZsZDRxX2R1cF9zMzIoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNHFfZHVwX3YoJnIsIF9fYSwgMzQpOyByOyB9KQotI2RlZmluZSB2bGQ0cV9kdXBfczY0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92KCZyLCBfX2EsIDM1KTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfZHVwX2YxNihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDh4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92KCZyLCBfX2EsIDM5KTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfZHVwX2YzMihfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDR4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92KCZyLCBfX2EsIDQwKTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfZHVwX2Y2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92KCZyLCBfX2EsIDQxKTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfZHVwX3A4KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV9kdXBfdigmciwgX19hLCAzNik7IHI7IH0pCi0jZGVmaW5lIHZsZDRxX2R1cF9wMTYoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDh4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2R1cF92KCZyLCBfX2EsIDM3KTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfZHVwX3A2NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4Mng0X3QgcjsgX19idWlsdGluX25lb25fdmxkNHFfZHVwX3YoJnIsIF9fYSwgMzgpOyByOyB9KQotI2RlZmluZSB2bGQ0X2R1cF9mNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgxeDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0X2R1cF92KCZyLCBfX2EsIDkpOyByOyB9KQotI2RlZmluZSB2bGQ0X2R1cF9wNjQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDF4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfZHVwX3YoJnIsIF9fYSwgNik7IHI7IH0pCi0KLSNkZWZpbmUgdmxkNHFfbGFuZV91OChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgdWludDh4MTZ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgNDgpOyByOyB9KQotI2RlZmluZSB2bGQ0cV9sYW5lX3U2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDRfdCBfX2IgPSAoYik7IFwKLSAgdWludDY0eDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgNTEpOyByOyB9KQotI2RlZmluZSB2bGQ0cV9sYW5lX3M4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNng0X3QgX19iID0gKGIpOyBcCi0gIGludDh4MTZ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdigmciwgX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCBfX2IudmFsWzNdLCBfX2MsIDMyKTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfbGFuZV9zNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyeDRfdCBfX2IgPSAoYik7IFwKLSAgaW50NjR4Mng0X3QgcjsgX19idWlsdGluX25lb25fdmxkNHFfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgX19jLCAzNSk7IHI7IH0pCi0jZGVmaW5lIHZsZDRxX2xhbmVfZjY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyeDRfdCBfX2IgPSAoYik7IFwKLSAgZmxvYXQ2NHgyeDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0cV9sYW5lX3YoJnIsIF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCBfX2MsIDQxKTsgcjsgfSkKLSNkZWZpbmUgdmxkNHFfbGFuZV9wOChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgcG9seTh4MTZ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgMzYpOyByOyB9KQotI2RlZmluZSB2bGQ0cV9sYW5lX3A2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgyeDRfdCBfX2IgPSAoYik7IFwKLSAgcG9seTY0eDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRxX2xhbmVfdigmciwgX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgMzgpOyByOyB9KQotI2RlZmluZSB2bGQ0X2xhbmVfdTY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDF4NF90IF9fYiA9IChiKTsgXAotICB1aW50NjR4MXg0X3QgcjsgX19idWlsdGluX25lb25fdmxkNF9sYW5lX3YoJnIsIF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIF9fYywgMTkpOyByOyB9KQotI2RlZmluZSB2bGQ0X2xhbmVfczY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXg0X3QgX19iID0gKGIpOyBcCi0gIGludDY0eDF4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCBfX2MsIDMpOyByOyB9KQotI2RlZmluZSB2bGQ0X2xhbmVfZjY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgxeDRfdCBfX2IgPSAoYik7IFwKLSAgZmxvYXQ2NHgxeDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQ0X2xhbmVfdigmciwgX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgX19jLCA5KTsgcjsgfSkKLSNkZWZpbmUgdmxkNF9sYW5lX3A2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxeDRfdCBfX2IgPSAoYik7IFwKLSAgcG9seTY0eDF4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDRfbGFuZV92KCZyLCBfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCBfX2MsIDYpOyByOyB9KQotCi0jZGVmaW5lIHZsZDFxX3U4X3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92KCZyLCBfX2EsIDQ4KTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfdTE2X3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92KCZyLCBfX2EsIDQ5KTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfdTMyX3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92KCZyLCBfX2EsIDUwKTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfdTY0X3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92KCZyLCBfX2EsIDUxKTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfczhfeDQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNng0X3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDRfdigmciwgX19hLCAzMik7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX3MxNl94NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92KCZyLCBfX2EsIDMzKTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfczMyX3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDR4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFxX3g0X3YoJnIsIF9fYSwgMzQpOyByOyB9KQotI2RlZmluZSB2bGQxcV9zNjRfeDQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Mng0X3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDRfdigmciwgX19hLCAzNSk7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX2YxNl94NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDh4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFxX3g0X3YoJnIsIF9fYSwgMzkpOyByOyB9KQotI2RlZmluZSB2bGQxcV9mMzJfeDQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92KCZyLCBfX2EsIDQwKTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfZjY0X3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4Mng0X3QgcjsgX19idWlsdGluX25lb25fdmxkMXFfeDRfdigmciwgX19hLCA0MSk7IHI7IH0pCi0jZGVmaW5lIHZsZDFxX3A4X3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92KCZyLCBfX2EsIDM2KTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfcDE2X3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92KCZyLCBfX2EsIDM3KTsgcjsgfSkKLSNkZWZpbmUgdmxkMXFfcDY0X3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgyeDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxcV94NF92KCZyLCBfX2EsIDM4KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV91OF94NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3g0X3YoJnIsIF9fYSwgMTYpOyByOyB9KQotI2RlZmluZSB2bGQxX3UxNl94NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkMV94NF92KCZyLCBfX2EsIDE3KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV91MzJfeDQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDRfdigmciwgX19hLCAxOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDFfdTY0X3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3g0X3YoJnIsIF9fYSwgMTkpOyByOyB9KQotI2RlZmluZSB2bGQxX3M4X3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4OHg0X3QgcjsgX19idWlsdGluX25lb25fdmxkMV94NF92KCZyLCBfX2EsIDApOyByOyB9KQotI2RlZmluZSB2bGQxX3MxNl94NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0eDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3g0X3YoJnIsIF9fYSwgMSk7IHI7IH0pCi0jZGVmaW5lIHZsZDFfczMyX3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJ4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDRfdigmciwgX19hLCAyKTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9zNjRfeDQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXg0X3QgcjsgX19idWlsdGluX25lb25fdmxkMV94NF92KCZyLCBfX2EsIDMpOyByOyB9KQotI2RlZmluZSB2bGQxX2YxNl94NChfX2EpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDR4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDRfdigmciwgX19hLCA3KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9mMzJfeDQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyeDRfdCByOyBfX2J1aWx0aW5fbmVvbl92bGQxX3g0X3YoJnIsIF9fYSwgOCk7IHI7IH0pCi0jZGVmaW5lIHZsZDFfZjY0X3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MXg0X3QgcjsgX19idWlsdGluX25lb25fdmxkMV94NF92KCZyLCBfX2EsIDkpOyByOyB9KQotI2RlZmluZSB2bGQxX3A4X3g0KF9fYSkgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDh4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDRfdigmciwgX19hLCA0KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9wMTZfeDQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDR4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDRfdigmciwgX19hLCA1KTsgcjsgfSkKLSNkZWZpbmUgdmxkMV9wNjRfeDQoX19hKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDF4NF90IHI7IF9fYnVpbHRpbl9uZW9uX3ZsZDFfeDRfdigmciwgX19hLCA2KTsgcjsgfSkKLQotX19haSBmbG9hdDY0eDFfdCB2bWF4X2Y2NChmbG9hdDY0eDFfdCBfX2EsIGZsb2F0NjR4MV90IF9fYikgewotICByZXR1cm4gKGZsb2F0NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZtYXhfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA5KTsgfQotX19haSBmbG9hdDY0eDJfdCB2bWF4cV9mNjQoZmxvYXQ2NHgyX3QgX19hLCBmbG9hdDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92bWF4cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDEpOyB9Ci0KLV9fYWkgaW50OHgxNl90IHZwbWF4cV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZwbWF4cV92KF9fYSwgX19iLCAzMik7IH0KLV9fYWkgaW50MTZ4OF90IHZwbWF4cV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKGludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92cG1heHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDMzKTsgfQotX19haSBpbnQzMng0X3QgdnBtYXhxX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwbWF4cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzQpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnBtYXhxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnBtYXhxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2cG1heHFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19idWlsdGluX25lb25fdnBtYXhxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OSk7IH0KLV9fYWkgdWludDMyeDRfdCB2cG1heHFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnBtYXhxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MCk7IH0KLV9fYWkgZmxvYXQzMng0X3QgdnBtYXhxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZwbWF4cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDApOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZwbWF4cV9mNjQoZmxvYXQ2NHgyX3QgX19hLCBmbG9hdDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92cG1heHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQxKTsgfQotCi1fX2FpIGZsb2F0NjR4MV90IHZtaW5fZjY0KGZsb2F0NjR4MV90IF9fYSwgZmxvYXQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdm1pbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDkpOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZtaW5xX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZtaW5xX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0MSk7IH0KLQotX19haSBpbnQ4eDE2X3QgdnBtaW5xX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnBtaW5xX3YoX19hLCBfX2IsIDMyKTsgfQotX19haSBpbnQxNng4X3QgdnBtaW5xX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZwbWlucV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzMpOyB9Ci1fX2FpIGludDMyeDRfdCB2cG1pbnFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19idWlsdGluX25lb25fdnBtaW5xX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzNCk7IH0KLV9fYWkgdWludDh4MTZfdCB2cG1pbnFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cG1pbnFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ4KTsgfQotX19haSB1aW50MTZ4OF90IHZwbWlucV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDhfdClfX2J1aWx0aW5fbmVvbl92cG1pbnFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ5KTsgfQotX19haSB1aW50MzJ4NF90IHZwbWlucV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92cG1pbnFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUwKTsgfQotX19haSBmbG9hdDMyeDRfdCB2cG1pbnFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX25lb25fdnBtaW5xX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0MCk7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnBtaW5xX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZwbWlucV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDEpOyB9Ci0KLV9fYWkgZmxvYXQ2NHgxX3Qgdm1sYV9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IsIGZsb2F0NjR4MV90IF9fYykgewotICByZXR1cm4gX19hICsgKF9fYiAqIF9fYyk7IH0KLV9fYWkgZmxvYXQ2NHgyX3Qgdm1sYXFfZjY0KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iLCBmbG9hdDY0eDJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSArIChfX2IgKiBfX2MpOyB9Ci0KLV9fYWkgZmxvYXQ2NHgxX3Qgdm1sc19mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IsIGZsb2F0NjR4MV90IF9fYykgewotICByZXR1cm4gX19hIC0gKF9fYiAqIF9fYyk7IH0KLV9fYWkgZmxvYXQ2NHgyX3Qgdm1sc3FfZjY0KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iLCBmbG9hdDY0eDJfdCBfX2MpIHsKLSAgcmV0dXJuIF9fYSAtIChfX2IgKiBfX2MpOyB9Ci0KLV9fYWkgZmxvYXQ2NHgxX3Qgdm1vdl9uX2Y2NChmbG9hdDY0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpeyBfX2EgfTsgfQotX19haSBmbG9hdDY0eDJfdCB2bW92cV9uX2Y2NChmbG9hdDY0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpeyBfX2EsIF9fYSB9OyB9Ci0KLV9fYWkgZmxvYXQ2NHgxX3Qgdm11bF9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAqIF9fYjsgfQotX19haSBmbG9hdDY0eDJfdCB2bXVscV9mNjQoZmxvYXQ2NHgyX3QgX19hLCBmbG9hdDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAqIF9fYjsgfQotCi1fX2FpIGZsb2F0MzJ4Ml90IHZtdWx4X2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYnVpbHRpbl9uZW9uX3ZtdWx4X3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgOCk7IH0KLV9fYWkgZmxvYXQ2NHgxX3Qgdm11bHhfZjY0KGZsb2F0NjR4MV90IF9fYSwgZmxvYXQ2NHgxX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdm11bHhfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCA5KTsgfQotX19haSBmbG9hdDMyeDRfdCB2bXVseHFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19idWlsdGluX25lb25fdm11bHhxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0MCk7IH0KLV9fYWkgZmxvYXQ2NHgyX3Qgdm11bHhxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZtdWx4cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDEpOyB9Ci0KLV9fYWkgaW50NjR4MV90IHZuZWdfczY0KGludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICAtX19hOyB9Ci1fX2FpIGZsb2F0NjR4MV90IHZuZWdfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gIC1fX2E7IH0KLV9fYWkgZmxvYXQ2NHgyX3Qgdm5lZ3FfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gIC1fX2E7IH0KLV9fYWkgaW50NjR4Ml90IHZuZWdxX3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAgLV9fYTsgfQotCi1fX2FpIGludDY0eDFfdCB2cWFic19zNjQoaW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cWFic192KChpbnQ4eDhfdClfX2EsIDMpOyB9Ci1fX2FpIGludDY0eDJfdCB2cWFic3FfczY0KGludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnFhYnNxX3YoKGludDh4MTZfdClfX2EsIDM1KTsgfQotCi1fX2FpIGludDY0eDFfdCB2cW5lZ19zNjQoaW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92cW5lZ192KChpbnQ4eDhfdClfX2EsIDMpOyB9Ci1fX2FpIGludDY0eDJfdCB2cW5lZ3FfczY0KGludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnFuZWdxX3YoKGludDh4MTZfdClfX2EsIDM1KTsgfQotCi0jZGVmaW5lIHZxcnNocm5faGlnaF9uX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDhfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgKGludDh4MTZfdCl2Y29tYmluZV9zMTYoX19hLCB2cXJzaHJuX25fczE2KF9fYiwgX19jKSk7IH0pCi0jZGVmaW5lIHZxcnNocm5faGlnaF9uX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIChpbnQxNng4X3QpdmNvbWJpbmVfczMyKF9fYSwgdnFyc2hybl9uX3MzMihfX2IsIF9fYykpOyB9KQotI2RlZmluZSB2cXJzaHJuX2hpZ2hfbl9zNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Ml90IF9fYSA9IChhKTsgaW50NjR4Ml90IF9fYiA9IChiKTsgXAotICAoaW50MzJ4NF90KXZjb21iaW5lX3M2NChfX2EsIHZxcnNocm5fbl9zNjQoX19iLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFyc2hybl9oaWdoX25fdTE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2EgPSAoYSk7IHVpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gICh1aW50OHgxNl90KXZjb21iaW5lX3UxNihfX2EsIHZxcnNocm5fbl91MTYoX19iLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFyc2hybl9oaWdoX25fdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0X3QgX19hID0gKGEpOyB1aW50MzJ4NF90IF9fYiA9IChiKTsgXAotICAodWludDE2eDhfdCl2Y29tYmluZV91MzIoX19hLCB2cXJzaHJuX25fdTMyKF9fYiwgX19jKSk7IH0pCi0jZGVmaW5lIHZxcnNocm5faGlnaF9uX3U2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Ml90IF9fYSA9IChhKTsgdWludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQzMng0X3QpdmNvbWJpbmVfdTY0KF9fYSwgdnFyc2hybl9uX3U2NChfX2IsIF9fYykpOyB9KQotCi0jZGVmaW5lIHZxcnNocnVuX2hpZ2hfbl9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIChpbnQ4eDE2X3QpdmNvbWJpbmVfczE2KF9fYSwgdnFyc2hydW5fbl9zMTYoX19iLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFyc2hydW5faGlnaF9uX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIChpbnQxNng4X3QpdmNvbWJpbmVfczMyKF9fYSwgdnFyc2hydW5fbl9zMzIoX19iLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFyc2hydW5faGlnaF9uX3M2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBpbnQ2NHgyX3QgX19iID0gKGIpOyBcCi0gIChpbnQzMng0X3QpdmNvbWJpbmVfczY0KF9fYSwgdnFyc2hydW5fbl9zNjQoX19iLCBfX2MpKTsgfSkKLQotI2RlZmluZSB2cXNocm5faGlnaF9uX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDhfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgKGludDh4MTZfdCl2Y29tYmluZV9zMTYoX19hLCB2cXNocm5fbl9zMTYoX19iLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFzaHJuX2hpZ2hfbl9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NF90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgXAotICAoaW50MTZ4OF90KXZjb21iaW5lX3MzMihfX2EsIHZxc2hybl9uX3MzMihfX2IsIF9fYykpOyB9KQotI2RlZmluZSB2cXNocm5faGlnaF9uX3M2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBpbnQ2NHgyX3QgX19iID0gKGIpOyBcCi0gIChpbnQzMng0X3QpdmNvbWJpbmVfczY0KF9fYSwgdnFzaHJuX25fczY0KF9fYiwgX19jKSk7IH0pCi0jZGVmaW5lIHZxc2hybl9oaWdoX25fdTE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2EgPSAoYSk7IHVpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gICh1aW50OHgxNl90KXZjb21iaW5lX3UxNihfX2EsIHZxc2hybl9uX3UxNihfX2IsIF9fYykpOyB9KQotI2RlZmluZSB2cXNocm5faGlnaF9uX3UzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NF90IF9fYSA9IChhKTsgdWludDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQxNng4X3QpdmNvbWJpbmVfdTMyKF9fYSwgdnFzaHJuX25fdTMyKF9fYiwgX19jKSk7IH0pCi0jZGVmaW5lIHZxc2hybl9oaWdoX25fdTY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hID0gKGEpOyB1aW50NjR4Ml90IF9fYiA9IChiKTsgXAotICAodWludDMyeDRfdCl2Y29tYmluZV91NjQoX19hLCB2cXNocm5fbl91NjQoX19iLCBfX2MpKTsgfSkKLQotI2RlZmluZSB2cXNocnVuX2hpZ2hfbl9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIChpbnQ4eDE2X3QpdmNvbWJpbmVfczE2KF9fYSwgdnFzaHJ1bl9uX3MxNihfX2IsIF9fYykpOyB9KQotI2RlZmluZSB2cXNocnVuX2hpZ2hfbl9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NF90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgXAotICAoaW50MTZ4OF90KXZjb21iaW5lX3MzMihfX2EsIHZxc2hydW5fbl9zMzIoX19iLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFzaHJ1bl9oaWdoX25fczY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IGludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKGludDMyeDRfdCl2Y29tYmluZV9zNjQoX19hLCB2cXNocnVuX25fczY0KF9fYiwgX19jKSk7IH0pCi0KLV9fYWkgaW50OHgxNl90IHZxbW92bl9oaWdoX3MxNihpbnQ4eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgaW50OHg4X3QgX19hMSA9IHZxbW92bl9zMTYoX19iKTsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSk7IH0KLV9fYWkgaW50MTZ4OF90IHZxbW92bl9oaWdoX3MzMihpbnQxNng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIGludDE2eDRfdCBfX2ExID0gdnFtb3ZuX3MzMihfX2IpOwotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2ExLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3KTsgfQotX19haSBpbnQzMng0X3QgdnFtb3ZuX2hpZ2hfczY0KGludDMyeDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgaW50MzJ4Ml90IF9fYTEgPSB2cW1vdm5fczY0KF9fYik7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYTEsIDAsIDEsIDIsIDMpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnFtb3ZuX2hpZ2hfdTE2KHVpbnQ4eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHVpbnQ4eDhfdCBfX2ExID0gdnFtb3ZuX3UxNihfX2IpOwotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2ExLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1KTsgfQotX19haSB1aW50MTZ4OF90IHZxbW92bl9oaWdoX3UzMih1aW50MTZ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgdWludDE2eDRfdCBfX2ExID0gdnFtb3ZuX3UzMihfX2IpOwotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2ExLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3KTsgfQotX19haSB1aW50MzJ4NF90IHZxbW92bl9oaWdoX3U2NCh1aW50MzJ4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IpIHsKLSAgdWludDMyeDJfdCBfX2ExID0gdnFtb3ZuX3U2NChfX2IpOwotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2ExLCAwLCAxLCAyLCAzKTsgfQotCi1fX2FpIGludDh4OF90IHZyYml0X3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZyYml0X3YoX19hLCAwKTsgfQotX19haSB1aW50OHg4X3QgdnJiaXRfdTgodWludDh4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cmJpdF92KChpbnQ4eDhfdClfX2EsIDE2KTsgfQotX19haSBwb2x5OHg4X3QgdnJiaXRfcDgocG9seTh4OF90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2J1aWx0aW5fbmVvbl92cmJpdF92KChpbnQ4eDhfdClfX2EsIDQpOyB9Ci1fX2FpIGludDh4MTZfdCB2cmJpdHFfczgoaW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cmJpdHFfdihfX2EsIDMyKTsgfQotX19haSB1aW50OHgxNl90IHZyYml0cV91OCh1aW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnJiaXRxX3YoKGludDh4MTZfdClfX2EsIDQ4KTsgfQotX19haSBwb2x5OHgxNl90IHZyYml0cV9wOChwb2x5OHgxNl90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDE2X3QpX19idWlsdGluX25lb25fdnJiaXRxX3YoKGludDh4MTZfdClfX2EsIDM2KTsgfQotCi1fX2FpIGludDh4OF90IHZyZWludGVycHJldF9zOF9mNjQoZmxvYXQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19hOyB9Ci1fX2FpIGludDh4OF90IHZyZWludGVycHJldF9zOF9wNjQocG9seTY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2E7IH0KLV9fYWkgaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKGludDE2eDRfdClfX2E7IH0KLV9fYWkgaW50MTZ4NF90IHZyZWludGVycHJldF9zMTZfcDY0KHBvbHk2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYTsgfQotX19haSBpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3MzMl9mNjQoZmxvYXQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJ4Ml90KV9fYTsgfQotX19haSBpbnQzMngyX3QgdnJlaW50ZXJwcmV0X3MzMl9wNjQocG9seTY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19hOyB9Ci1fX2FpIGludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NHgxX3QpX19hOyB9Ci1fX2FpIGludDY0eDFfdCB2cmVpbnRlcnByZXRfczY0X3A2NChwb2x5NjR4MV90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2E7IH0KLV9fYWkgdWludDh4OF90IHZyZWludGVycHJldF91OF9mNjQoZmxvYXQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYTsgfQotX19haSB1aW50OHg4X3QgdnJlaW50ZXJwcmV0X3U4X3A2NChwb2x5NjR4MV90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2E7IH0KLV9fYWkgdWludDE2eDRfdCB2cmVpbnRlcnByZXRfdTE2X2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4NF90KV9fYTsgfQotX19haSB1aW50MTZ4NF90IHZyZWludGVycHJldF91MTZfcDY0KHBvbHk2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2E7IH0KLV9fYWkgdWludDMyeDJfdCB2cmVpbnRlcnByZXRfdTMyX2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJ4Ml90KV9fYTsgfQotX19haSB1aW50MzJ4Ml90IHZyZWludGVycHJldF91MzJfcDY0KHBvbHk2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDJfdClfX2E7IH0KLV9fYWkgdWludDY0eDFfdCB2cmVpbnRlcnByZXRfdTY0X2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYTsgfQotX19haSB1aW50NjR4MV90IHZyZWludGVycHJldF91NjRfcDY0KHBvbHk2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2E7IH0KLV9fYWkgZmxvYXQxNng0X3QgdnJlaW50ZXJwcmV0X2YxNl9mNjQoZmxvYXQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQxNng0X3QpX19hOyB9Ci1fX2FpIGZsb2F0MTZ4NF90IHZyZWludGVycHJldF9mMTZfcDY0KHBvbHk2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQxNng0X3QpX19hOyB9Ci1fX2FpIGZsb2F0MzJ4Ml90IHZyZWludGVycHJldF9mMzJfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYTsgfQotX19haSBmbG9hdDMyeDJfdCB2cmVpbnRlcnByZXRfZjMyX3A2NChwb2x5NjR4MV90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4Ml90KV9fYTsgfQotX19haSBmbG9hdDY0eDFfdCB2cmVpbnRlcnByZXRfZjY0X3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4MV90KV9fYTsgfQotX19haSBmbG9hdDY0eDFfdCB2cmVpbnRlcnByZXRfZjY0X3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19hOyB9Ci1fX2FpIGZsb2F0NjR4MV90IHZyZWludGVycHJldF9mNjRfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2E7IH0KLV9fYWkgZmxvYXQ2NHgxX3QgdnJlaW50ZXJwcmV0X2Y2NF9zNjQoaW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4MV90KV9fYTsgfQotX19haSBmbG9hdDY0eDFfdCB2cmVpbnRlcnByZXRfZjY0X3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2E7IH0KLV9fYWkgZmxvYXQ2NHgxX3QgdnJlaW50ZXJwcmV0X2Y2NF91MTYodWludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2E7IH0KLV9fYWkgZmxvYXQ2NHgxX3QgdnJlaW50ZXJwcmV0X2Y2NF91MzIodWludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2E7IH0KLV9fYWkgZmxvYXQ2NHgxX3QgdnJlaW50ZXJwcmV0X2Y2NF91NjQodWludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2E7IH0KLV9fYWkgZmxvYXQ2NHgxX3QgdnJlaW50ZXJwcmV0X2Y2NF9mMTYoZmxvYXQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19hOyB9Ci1fX2FpIGZsb2F0NjR4MV90IHZyZWludGVycHJldF9mNjRfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4MV90KV9fYTsgfQotX19haSBmbG9hdDY0eDFfdCB2cmVpbnRlcnByZXRfZjY0X3A4KHBvbHk4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2E7IH0KLV9fYWkgZmxvYXQ2NHgxX3QgdnJlaW50ZXJwcmV0X2Y2NF9wMTYocG9seTE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2E7IH0KLV9fYWkgZmxvYXQ2NHgxX3QgdnJlaW50ZXJwcmV0X2Y2NF9wNjQocG9seTY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2E7IH0KLV9fYWkgcG9seTh4OF90IHZyZWludGVycHJldF9wOF9mNjQoZmxvYXQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4OF90KV9fYTsgfQotX19haSBwb2x5OHg4X3QgdnJlaW50ZXJwcmV0X3A4X3A2NChwb2x5NjR4MV90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2E7IH0KLV9fYWkgcG9seTE2eDRfdCB2cmVpbnRlcnByZXRfcDE2X2Y2NChmbG9hdDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5MTZ4NF90KV9fYTsgfQotX19haSBwb2x5MTZ4NF90IHZyZWludGVycHJldF9wMTZfcDY0KHBvbHk2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDRfdClfX2E7IH0KLV9fYWkgcG9seTY0eDFfdCB2cmVpbnRlcnByZXRfcDY0X3M4KGludDh4OF90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgxX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgxX3QgdnJlaW50ZXJwcmV0X3A2NF9zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgxX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgxX3QgdnJlaW50ZXJwcmV0X3A2NF9zMzIoaW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgxX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgxX3QgdnJlaW50ZXJwcmV0X3A2NF9zNjQoaW50NjR4MV90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgxX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgxX3QgdnJlaW50ZXJwcmV0X3A2NF91OCh1aW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTY0eDFfdClfX2E7IH0KLV9fYWkgcG9seTY0eDFfdCB2cmVpbnRlcnByZXRfcDY0X3UxNih1aW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgxX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgxX3QgdnJlaW50ZXJwcmV0X3A2NF91MzIodWludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5NjR4MV90KV9fYTsgfQotX19haSBwb2x5NjR4MV90IHZyZWludGVycHJldF9wNjRfdTY0KHVpbnQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTY0eDFfdClfX2E7IH0KLV9fYWkgcG9seTY0eDFfdCB2cmVpbnRlcnByZXRfcDY0X2YxNihmbG9hdDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5NjR4MV90KV9fYTsgfQotX19haSBwb2x5NjR4MV90IHZyZWludGVycHJldF9wNjRfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgxX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgxX3QgdnJlaW50ZXJwcmV0X3A2NF9mNjQoZmxvYXQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTY0eDFfdClfX2E7IH0KLV9fYWkgcG9seTY0eDFfdCB2cmVpbnRlcnByZXRfcDY0X3A4KHBvbHk4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5NjR4MV90KV9fYTsgfQotX19haSBwb2x5NjR4MV90IHZyZWludGVycHJldF9wNjRfcDE2KHBvbHkxNng0X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTY0eDFfdClfX2E7IH0KLV9fYWkgaW50OHgxNl90IHZyZWludGVycHJldHFfczhfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGludDh4MTZfdClfX2E7IH0KLV9fYWkgaW50OHgxNl90IHZyZWludGVycHJldHFfczhfcDY0KHBvbHk2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYTsgfQotX19haSBpbnQxNng4X3QgdnJlaW50ZXJwcmV0cV9zMTZfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGludDE2eDhfdClfX2E7IH0KLV9fYWkgaW50MTZ4OF90IHZyZWludGVycHJldHFfczE2X3A2NChwb2x5NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGludDE2eDhfdClfX2E7IH0KLV9fYWkgaW50MzJ4NF90IHZyZWludGVycHJldHFfczMyX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19hOyB9Ci1fX2FpIGludDMyeDRfdCB2cmVpbnRlcnByZXRxX3MzMl9wNjQocG9seTY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMng0X3QpX19hOyB9Ci1fX2FpIGludDY0eDJfdCB2cmVpbnRlcnByZXRxX3M2NF9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYTsgfQotX19haSBpbnQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9zNjRfcDY0KHBvbHk2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjR4Ml90KV9fYTsgfQotX19haSB1aW50OHgxNl90IHZyZWludGVycHJldHFfdThfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19hOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnJlaW50ZXJwcmV0cV91OF9wNjQocG9seTY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYTsgfQotX19haSB1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYTsgfQotX19haSB1aW50MTZ4OF90IHZyZWludGVycHJldHFfdTE2X3A2NChwb2x5NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNng4X3QpX19hOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19hOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnJlaW50ZXJwcmV0cV91MzJfcDY0KHBvbHk2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyeDRfdClfX2E7IH0KLV9fYWkgdWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2E7IH0KLV9fYWkgdWludDY0eDJfdCB2cmVpbnRlcnByZXRxX3U2NF9wNjQocG9seTY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjR4Ml90KV9fYTsgfQotX19haSBmbG9hdDE2eDhfdCB2cmVpbnRlcnByZXRxX2YxNl9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQxNng4X3QpX19hOyB9Ci1fX2FpIGZsb2F0MTZ4OF90IHZyZWludGVycHJldHFfZjE2X3A2NChwb2x5NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MTZ4OF90KV9fYTsgfQotX19haSBmbG9hdDMyeDRfdCB2cmVpbnRlcnByZXRxX2YzMl9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMng0X3QpX19hOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZyZWludGVycHJldHFfZjMyX3A2NChwb2x5NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJ4NF90KV9fYTsgfQotX19haSBmbG9hdDY0eDJfdCB2cmVpbnRlcnByZXRxX2Y2NF9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19hOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZyZWludGVycHJldHFfZjY0X3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19hOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZyZWludGVycHJldHFfZjY0X3MzMihpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19hOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZyZWludGVycHJldHFfZjY0X3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19hOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZyZWludGVycHJldHFfZjY0X3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19hOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZyZWludGVycHJldHFfZjY0X3UxNih1aW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYTsgfQotX19haSBmbG9hdDY0eDJfdCB2cmVpbnRlcnByZXRxX2Y2NF91MzIodWludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2E7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9mNjRfdTY0KHVpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19hOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZyZWludGVycHJldHFfZjY0X2YxNihmbG9hdDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2E7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9mNjRfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYTsgfQotX19haSBmbG9hdDY0eDJfdCB2cmVpbnRlcnByZXRxX2Y2NF9wOChwb2x5OHgxNl90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYTsgfQotX19haSBmbG9hdDY0eDJfdCB2cmVpbnRlcnByZXRxX2Y2NF9wMTYocG9seTE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2E7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnJlaW50ZXJwcmV0cV9mNjRfcDY0KHBvbHk2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgyX3QpX19hOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdnJlaW50ZXJwcmV0cV9wOF9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2E7IH0KLV9fYWkgcG9seTh4MTZfdCB2cmVpbnRlcnByZXRxX3A4X3A2NChwb2x5NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHBvbHk4eDE2X3QpX19hOyB9Ci1fX2FpIHBvbHkxNng4X3QgdnJlaW50ZXJwcmV0cV9wMTZfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHBvbHkxNng4X3QpX19hOyB9Ci1fX2FpIHBvbHkxNng4X3QgdnJlaW50ZXJwcmV0cV9wMTZfcDY0KHBvbHk2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTE2eDhfdClfX2E7IH0KLV9fYWkgcG9seTY0eDJfdCB2cmVpbnRlcnByZXRxX3A2NF9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTY0eDJfdClfX2E7IH0KLV9fYWkgcG9seTY0eDJfdCB2cmVpbnRlcnByZXRxX3A2NF9zMTYoaW50MTZ4OF90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgyX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnJlaW50ZXJwcmV0cV9wNjRfczMyKGludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5NjR4Ml90KV9fYTsgfQotX19haSBwb2x5NjR4Ml90IHZyZWludGVycHJldHFfcDY0X3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAocG9seTY0eDJfdClfX2E7IH0KLV9fYWkgcG9seTY0eDJfdCB2cmVpbnRlcnByZXRxX3A2NF91OCh1aW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgyX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnJlaW50ZXJwcmV0cV9wNjRfdTE2KHVpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAocG9seTY0eDJfdClfX2E7IH0KLV9fYWkgcG9seTY0eDJfdCB2cmVpbnRlcnByZXRxX3A2NF91MzIodWludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5NjR4Ml90KV9fYTsgfQotX19haSBwb2x5NjR4Ml90IHZyZWludGVycHJldHFfcDY0X3U2NCh1aW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgyX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnJlaW50ZXJwcmV0cV9wNjRfZjE2KGZsb2F0MTZ4OF90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgyX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnJlaW50ZXJwcmV0cV9wNjRfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgyX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnJlaW50ZXJwcmV0cV9wNjRfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgyX3QpX19hOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnJlaW50ZXJwcmV0cV9wNjRfcDgocG9seTh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChwb2x5NjR4Ml90KV9fYTsgfQotX19haSBwb2x5NjR4Ml90IHZyZWludGVycHJldHFfcDY0X3AxNihwb2x5MTZ4OF90IF9fYSkgewotICByZXR1cm4gKHBvbHk2NHgyX3QpX19hOyB9Ci0KLSNkZWZpbmUgdnJzaHJuX2hpZ2hfbl9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIChpbnQ4eDE2X3QpdmNvbWJpbmVfczE2KF9fYSwgdnJzaHJuX25fczE2KF9fYiwgX19jKSk7IH0pCi0jZGVmaW5lIHZyc2hybl9oaWdoX25fczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IGludDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgKGludDE2eDhfdCl2Y29tYmluZV9zMzIoX19hLCB2cnNocm5fbl9zMzIoX19iLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnJzaHJuX2hpZ2hfbl9zNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Ml90IF9fYSA9IChhKTsgaW50NjR4Ml90IF9fYiA9IChiKTsgXAotICAoaW50MzJ4NF90KXZjb21iaW5lX3M2NChfX2EsIHZyc2hybl9uX3M2NChfX2IsIF9fYykpOyB9KQotI2RlZmluZSB2cnNocm5faGlnaF9uX3UxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4X3QgX19hID0gKGEpOyB1aW50MTZ4OF90IF9fYiA9IChiKTsgXAotICAodWludDh4MTZfdCl2Y29tYmluZV91MTYoX19hLCB2cnNocm5fbl91MTYoX19iLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnJzaHJuX2hpZ2hfbl91MzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IHVpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gICh1aW50MTZ4OF90KXZjb21iaW5lX3UzMihfX2EsIHZyc2hybl9uX3UzMihfX2IsIF9fYykpOyB9KQotI2RlZmluZSB2cnNocm5faGlnaF9uX3U2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Ml90IF9fYSA9IChhKTsgdWludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKHVpbnQzMng0X3QpdmNvbWJpbmVfdTY0KF9fYSwgdnJzaHJuX25fdTY0KF9fYiwgX19jKSk7IH0pCi0KLV9fYWkgZmxvYXQzMl90IHZhYmRzX2YzMihmbG9hdDMyX3QgX19hLCBmbG9hdDMyX3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQzMl90KV9fYnVpbHRpbl9uZW9uX3ZhYmRzX2YzMihfX2EsIF9fYik7IH0KLV9fYWkgZmxvYXQ2NF90IHZhYmRkX2Y2NChmbG9hdDY0X3QgX19hLCBmbG9hdDY0X3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZhYmRkX2Y2NChfX2EsIF9fYik7IH0KLQotX19haSBpbnQ2NF90IHZhYnNkX3M2NChpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdmFic2RfczY0KF9fYSk7IH0KLQotX19haSBpbnQ2NF90IHZhZGRkX3M2NChpbnQ2NF90IF9fYSwgaW50NjRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZhZGRkX3M2NChfX2EsIF9fYik7IH0KLV9fYWkgdWludDY0X3QgdmFkZGRfdTY0KHVpbnQ2NF90IF9fYSwgdWludDY0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdmFkZGRfdTY0KF9fYSwgX19iKTsgfQotCi1fX2FpIGZsb2F0MzJfdCB2cGFkZHNfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92cGFkZHNfZjMyKF9fYSk7IH0KLV9fYWkgaW50NjRfdCB2cGFkZGRfczY0KGludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZwYWRkZF9zNjQoX19hKTsgfQotX19haSBmbG9hdDY0X3QgdnBhZGRkX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdnBhZGRkX2Y2NChfX2EpOyB9Ci1fX2FpIHVpbnQ2NF90IHZwYWRkZF91NjQodWludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92cGFkZGRfdTY0KChpbnQ2NHgyX3QpX19hKTsgfQotCi1fX2FpIGludDY0X3QgdmNlcWRfczY0KGludDY0X3QgX19hLCBpbnQ2NF90IF9fYikgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdmNlcWRfczY0KF9fYSwgX19iKTsgfQotX19haSB1aW50NjRfdCB2Y2VxZF91NjQodWludDY0X3QgX19hLCB1aW50NjRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y2VxZF91NjQoX19hLCBfX2IpOyB9Ci0KLV9fYWkgaW50NjRfdCB2Y2VxemRfczY0KGludDY0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y2VxemRfczY0KF9fYSk7IH0KLV9fYWkgdWludDY0X3QgdmNlcXpkX3U2NCh1aW50NjRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y2VxemRfdTY0KF9fYSk7IH0KLQotX19haSBpbnQ2NF90IHZjZ2VkX3M2NChpbnQ2NF90IF9fYSwgaW50NjRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjZ2VkX3M2NChfX2EsIF9fYik7IH0KLQotX19haSBpbnQ2NF90IHZjZ2V6ZF9zNjQoaW50NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjZ2V6ZF9zNjQoX19hKTsgfQotCi1fX2FpIGludDY0X3QgdmNndGRfczY0KGludDY0X3QgX19hLCBpbnQ2NF90IF9fYikgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdmNndGRfczY0KF9fYSwgX19iKTsgfQotCi1fX2FpIGludDY0X3QgdmNndHpkX3M2NChpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdmNndHpkX3M2NChfX2EpOyB9Ci0KLV9fYWkgdWludDY0X3QgdmNndGRfdTY0KHVpbnQ2NF90IF9fYSwgdWludDY0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdmNndGRfdTY0KF9fYSwgX19iKTsgfQotCi1fX2FpIHVpbnQ2NF90IHZjZ2VkX3U2NCh1aW50NjRfdCBfX2EsIHVpbnQ2NF90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjZ2VkX3U2NChfX2EsIF9fYik7IH0KLQotX19haSBpbnQ2NF90IHZjbGVkX3M2NChpbnQ2NF90IF9fYSwgaW50NjRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjbGVkX3M2NChfX2EsIF9fYik7IH0KLV9fYWkgdWludDY0X3QgdmNsZWRfdTY0KHVpbnQ2NF90IF9fYSwgdWludDY0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdmNsZWRfdTY0KF9fYSwgX19iKTsgfQotCi1fX2FpIGludDY0X3QgdmNsZXpkX3M2NChpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdmNsZXpkX3M2NChfX2EpOyB9Ci0KLV9fYWkgaW50NjRfdCB2Y2x0ZF9zNjQoaW50NjRfdCBfX2EsIGludDY0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y2x0ZF9zNjQoX19hLCBfX2IpOyB9Ci1fX2FpIHVpbnQ2NF90IHZjbHRkX3U2NCh1aW50NjRfdCBfX2EsIHVpbnQ2NF90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjbHRkX3U2NChfX2EsIF9fYik7IH0KLQotX19haSBpbnQ2NF90IHZjbHR6ZF9zNjQoaW50NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjbHR6ZF9zNjQoX19hKTsgfQotCi1fX2FpIGludDY0X3QgdnRzdGRfczY0KGludDY0X3QgX19hLCBpbnQ2NF90IF9fYikgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdnRzdGRfczY0KF9fYSwgX19iKTsgfQotX19haSB1aW50NjRfdCB2dHN0ZF91NjQodWludDY0X3QgX19hLCB1aW50NjRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92dHN0ZF91NjQoX19hLCBfX2IpOyB9Ci0KLV9fYWkgdWludDMyX3QgdmNhZ2VzX2YzMihmbG9hdDMyX3QgX19hLCBmbG9hdDMyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdmNhZ2VzX2YzMihfX2EsIF9fYik7IH0KLV9fYWkgdWludDY0X3QgdmNhZ2VkX2Y2NChmbG9hdDY0X3QgX19hLCBmbG9hdDY0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdmNhZ2VkX2Y2NChfX2EsIF9fYik7IH0KLQotX19haSB1aW50MzJfdCB2Y2FndHNfZjMyKGZsb2F0MzJfdCBfX2EsIGZsb2F0MzJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92Y2FndHNfZjMyKF9fYSwgX19iKTsgfQotX19haSB1aW50NjRfdCB2Y2FndGRfZjY0KGZsb2F0NjRfdCBfX2EsIGZsb2F0NjRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y2FndGRfZjY0KF9fYSwgX19iKTsgfQotCi1fX2FpIHVpbnQzMl90IHZjYWxlc19mMzIoZmxvYXQzMl90IF9fYSwgZmxvYXQzMl90IF9fYikgewotICByZXR1cm4gKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZjYWxlc19mMzIoX19hLCBfX2IpOyB9Ci1fX2FpIHVpbnQ2NF90IHZjYWxlZF9mNjQoZmxvYXQ2NF90IF9fYSwgZmxvYXQ2NF90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjYWxlZF9mNjQoX19hLCBfX2IpOyB9Ci0KLV9fYWkgdWludDMyX3QgdmNhbHRzX2YzMihmbG9hdDMyX3QgX19hLCBmbG9hdDMyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdmNhbHRzX2YzMihfX2EsIF9fYik7IH0KLV9fYWkgdWludDY0X3QgdmNhbHRkX2Y2NChmbG9hdDY0X3QgX19hLCBmbG9hdDY0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdmNhbHRkX2Y2NChfX2EsIF9fYik7IH0KLQotX19haSB1aW50MzJfdCB2Y2Vxc19mMzIoZmxvYXQzMl90IF9fYSwgZmxvYXQzMl90IF9fYikgewotICByZXR1cm4gKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZjZXFzX2YzMihfX2EsIF9fYik7IH0KLV9fYWkgdWludDY0X3QgdmNlcWRfZjY0KGZsb2F0NjRfdCBfX2EsIGZsb2F0NjRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y2VxZF9mNjQoX19hLCBfX2IpOyB9Ci0KLV9fYWkgdWludDMyX3QgdmNlcXpzX2YzMihmbG9hdDMyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdmNlcXpzX2YzMihfX2EpOyB9Ci1fX2FpIHVpbnQ2NF90IHZjZXF6ZF9mNjQoZmxvYXQ2NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjZXF6ZF9mNjQoX19hKTsgfQotCi1fX2FpIHVpbnQzMl90IHZjZ2VzX2YzMihmbG9hdDMyX3QgX19hLCBmbG9hdDMyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdmNnZXNfZjMyKF9fYSwgX19iKTsgfQotX19haSB1aW50NjRfdCB2Y2dlZF9mNjQoZmxvYXQ2NF90IF9fYSwgZmxvYXQ2NF90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjZ2VkX2Y2NChfX2EsIF9fYik7IH0KLQotX19haSB1aW50MzJfdCB2Y2dlenNfZjMyKGZsb2F0MzJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92Y2dlenNfZjMyKF9fYSk7IH0KLV9fYWkgdWludDY0X3QgdmNnZXpkX2Y2NChmbG9hdDY0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdmNnZXpkX2Y2NChfX2EpOyB9Ci0KLV9fYWkgdWludDMyX3QgdmNndHNfZjMyKGZsb2F0MzJfdCBfX2EsIGZsb2F0MzJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92Y2d0c19mMzIoX19hLCBfX2IpOyB9Ci1fX2FpIHVpbnQ2NF90IHZjZ3RkX2Y2NChmbG9hdDY0X3QgX19hLCBmbG9hdDY0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdmNndGRfZjY0KF9fYSwgX19iKTsgfQotCi1fX2FpIHVpbnQzMl90IHZjZ3R6c19mMzIoZmxvYXQzMl90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZjZ3R6c19mMzIoX19hKTsgfQotX19haSB1aW50NjRfdCB2Y2d0emRfZjY0KGZsb2F0NjRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y2d0emRfZjY0KF9fYSk7IH0KLQotX19haSB1aW50MzJfdCB2Y2xlc19mMzIoZmxvYXQzMl90IF9fYSwgZmxvYXQzMl90IF9fYikgewotICByZXR1cm4gKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZjbGVzX2YzMihfX2EsIF9fYik7IH0KLV9fYWkgdWludDY0X3QgdmNsZWRfZjY0KGZsb2F0NjRfdCBfX2EsIGZsb2F0NjRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y2xlZF9mNjQoX19hLCBfX2IpOyB9Ci0KLV9fYWkgdWludDMyX3QgdmNsZXpzX2YzMihmbG9hdDMyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdmNsZXpzX2YzMihfX2EpOyB9Ci1fX2FpIHVpbnQ2NF90IHZjbGV6ZF9mNjQoZmxvYXQ2NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjbGV6ZF9mNjQoX19hKTsgfQotCi1fX2FpIHVpbnQzMl90IHZjbHRzX2YzMihmbG9hdDMyX3QgX19hLCBmbG9hdDMyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdmNsdHNfZjMyKF9fYSwgX19iKTsgfQotX19haSB1aW50NjRfdCB2Y2x0ZF9mNjQoZmxvYXQ2NF90IF9fYSwgZmxvYXQ2NF90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjbHRkX2Y2NChfX2EsIF9fYik7IH0KLQotX19haSB1aW50MzJfdCB2Y2x0enNfZjMyKGZsb2F0MzJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92Y2x0enNfZjMyKF9fYSk7IH0KLV9fYWkgdWludDY0X3QgdmNsdHpkX2Y2NChmbG9hdDY0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdmNsdHpkX2Y2NChfX2EpOyB9Ci0KLV9fYWkgaW50NjRfdCB2Y3Z0YWRfczY0X2Y2NChmbG9hdDY0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0YWRfczY0X2Y2NChfX2EpOyB9Ci0KLV9fYWkgaW50MzJfdCB2Y3Z0YXNfczMyX2YzMihmbG9hdDMyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0YXNfczMyX2YzMihfX2EpOyB9Ci0KLV9fYWkgdWludDY0X3QgdmN2dGFkX3U2NF9mNjQoZmxvYXQ2NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjdnRhZF91NjRfZjY0KF9fYSk7IH0KLQotX19haSB1aW50MzJfdCB2Y3Z0YXNfdTMyX2YzMihmbG9hdDMyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdmN2dGFzX3UzMl9mMzIoX19hKTsgfQotCi1fX2FpIGludDY0X3QgdmN2dG1kX3M2NF9mNjQoZmxvYXQ2NF90IF9fYSkgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdmN2dG1kX3M2NF9mNjQoX19hKTsgfQotCi1fX2FpIGludDMyX3QgdmN2dG1zX3MzMl9mMzIoZmxvYXQzMl90IF9fYSkgewotICByZXR1cm4gKGludDMyX3QpX19idWlsdGluX25lb25fdmN2dG1zX3MzMl9mMzIoX19hKTsgfQotCi1fX2FpIHVpbnQ2NF90IHZjdnRtZF91NjRfZjY0KGZsb2F0NjRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0bWRfdTY0X2Y2NChfX2EpOyB9Ci0KLV9fYWkgdWludDMyX3QgdmN2dG1zX3UzMl9mMzIoZmxvYXQzMl90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZjdnRtc191MzJfZjMyKF9fYSk7IH0KLQotX19haSBpbnQ2NF90IHZjdnRuZF9zNjRfZjY0KGZsb2F0NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjdnRuZF9zNjRfZjY0KF9fYSk7IH0KLQotX19haSBpbnQzMl90IHZjdnRuc19zMzJfZjMyKGZsb2F0MzJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZjdnRuc19zMzJfZjMyKF9fYSk7IH0KLQotX19haSB1aW50NjRfdCB2Y3Z0bmRfdTY0X2Y2NChmbG9hdDY0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdmN2dG5kX3U2NF9mNjQoX19hKTsgfQotCi1fX2FpIHVpbnQzMl90IHZjdnRuc191MzJfZjMyKGZsb2F0MzJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0bnNfdTMyX2YzMihfX2EpOyB9Ci0KLV9fYWkgaW50NjRfdCB2Y3Z0cGRfczY0X2Y2NChmbG9hdDY0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cGRfczY0X2Y2NChfX2EpOyB9Ci0KLV9fYWkgaW50MzJfdCB2Y3Z0cHNfczMyX2YzMihmbG9hdDMyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cHNfczMyX2YzMihfX2EpOyB9Ci0KLV9fYWkgdWludDY0X3QgdmN2dHBkX3U2NF9mNjQoZmxvYXQ2NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjdnRwZF91NjRfZjY0KF9fYSk7IH0KLQotX19haSB1aW50MzJfdCB2Y3Z0cHNfdTMyX2YzMihmbG9hdDMyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdmN2dHBzX3UzMl9mMzIoX19hKTsgfQotCi1fX2FpIGZsb2F0MzJfdCB2Y3Z0eGRfZjMyX2Y2NChmbG9hdDY0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMl90KV9fYnVpbHRpbl9uZW9uX3ZjdnR4ZF9mMzJfZjY0KF9fYSk7IH0KLQotX19haSBpbnQ2NF90IHZjdnRkX3M2NF9mNjQoZmxvYXQ2NF90IF9fYSkgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdmN2dGRfczY0X2Y2NChfX2EpOyB9Ci0KLV9fYWkgaW50MzJfdCB2Y3Z0c19zMzJfZjMyKGZsb2F0MzJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZjdnRzX3MzMl9mMzIoX19hKTsgfQotCi0jZGVmaW5lIHZjdnRzX25fczMyX2YzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyX3QgX19hID0gKGEpOyBcCi0gIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZjdnRzX25fczMyX2YzMihfX2EsIF9fYik7IH0pCi0KLSNkZWZpbmUgdmN2dGRfbl9zNjRfZjY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjRfdCBfX2EgPSAoYSk7IFwKLSAgKGludDY0X3QpX19idWlsdGluX25lb25fdmN2dGRfbl9zNjRfZjY0KF9fYSwgX19iKTsgfSkKLQotX19haSB1aW50NjRfdCB2Y3Z0ZF91NjRfZjY0KGZsb2F0NjRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0ZF91NjRfZjY0KF9fYSk7IH0KLQotX19haSB1aW50MzJfdCB2Y3Z0c191MzJfZjMyKGZsb2F0MzJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0c191MzJfZjMyKF9fYSk7IH0KLQotI2RlZmluZSB2Y3Z0c19uX3UzMl9mMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMl90IF9fYSA9IChhKTsgXAotICAodWludDMyX3QpX19idWlsdGluX25lb25fdmN2dHNfbl91MzJfZjMyKF9fYSwgX19iKTsgfSkKLQotI2RlZmluZSB2Y3Z0ZF9uX3U2NF9mNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NF90IF9fYSA9IChhKTsgXAotICAodWludDY0X3QpX19idWlsdGluX25lb25fdmN2dGRfbl91NjRfZjY0KF9fYSwgX19iKTsgfSkKLQotX19haSBmbG9hdDMyX3QgdnBtYXhubXNfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92cG1heG5tc19mMzIoX19hKTsgfQotX19haSBmbG9hdDY0X3QgdnBtYXhubXFkX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdnBtYXhubXFkX2Y2NChfX2EpOyB9Ci0KLV9fYWkgZmxvYXQzMl90IHZwbWF4c19mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMl90KV9fYnVpbHRpbl9uZW9uX3ZwbWF4c19mMzIoX19hKTsgfQotX19haSBmbG9hdDY0X3QgdnBtYXhxZF9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZwbWF4cWRfZjY0KF9fYSk7IH0KLQotX19haSBmbG9hdDMyX3QgdnBtaW5ubXNfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92cG1pbm5tc19mMzIoX19hKTsgfQotX19haSBmbG9hdDY0X3QgdnBtaW5ubXFkX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdnBtaW5ubXFkX2Y2NChfX2EpOyB9Ci0KLV9fYWkgZmxvYXQzMl90IHZwbWluc19mMzIoZmxvYXQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMl90KV9fYnVpbHRpbl9uZW9uX3ZwbWluc19mMzIoX19hKTsgfQotX19haSBmbG9hdDY0X3QgdnBtaW5xZF9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZwbWlucWRfZjY0KF9fYSk7IH0KLQotI2RlZmluZSB2Zm1hc19sYW5lX2YzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyX3QgX19hID0gKGEpOyBmbG9hdDMyX3QgX19iID0gKGIpOyBmbG9hdDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92Zm1hc19sYW5lX2YzMihfX2EsIF9fYiwgX19jLCBfX2QpOyB9KQotI2RlZmluZSB2Zm1hZF9sYW5lX2Y2NChhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0X3QgX19hID0gKGEpOyBmbG9hdDY0X3QgX19iID0gKGIpOyBmbG9hdDY0eDFfdCBfX2MgPSAoYyk7IFwKLSAgKGZsb2F0NjRfdClfX2J1aWx0aW5fbmVvbl92Zm1hZF9sYW5lX2Y2NChfX2EsIF9fYiwgX19jLCBfX2QpOyB9KQotCi0jZGVmaW5lIHZmbWFzX2xhbmVxX2YzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyX3QgX19hID0gKGEpOyBmbG9hdDMyX3QgX19iID0gKGIpOyBmbG9hdDMyeDRfdCBfX2MgPSAoYyk7IFwKLSAgKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92Zm1hc19sYW5lcV9mMzIoX19hLCBfX2IsIF9fYywgX19kKTsgfSkKLSNkZWZpbmUgdmZtYWRfbGFuZXFfZjY0KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjRfdCBfX2EgPSAoYSk7IGZsb2F0NjRfdCBfX2IgPSAoYik7IGZsb2F0NjR4Ml90IF9fYyA9IChjKTsgXAotICAoZmxvYXQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZmbWFkX2xhbmVxX2Y2NChfX2EsIF9fYiwgX19jLCBfX2QpOyB9KQotCi0jZGVmaW5lIHZmbXNzX2xhbmVfZjMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJfdCBfX2EgPSAoYSk7IGZsb2F0MzJfdCBfX2IgPSAoYik7IGZsb2F0MzJ4Ml90IF9fYyA9IChjKTsgXAotICBmbG9hdDMyX3QgX19hMSA9IF9fYTsgXAotICBmbG9hdDMyX3QgX19iMSA9IF9fYjsgXAotICBmbG9hdDMyeDJfdCBfX2MxID0gX19jOyBcCi0gIHZmbWFzX2xhbmVfZjMyKF9fYTEsIF9fYjEsIC1fX2MxLCBfX2QpOyB9KQotI2RlZmluZSB2Zm1zZF9sYW5lX2Y2NChhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0X3QgX19hID0gKGEpOyBmbG9hdDY0X3QgX19iID0gKGIpOyBmbG9hdDY0eDFfdCBfX2MgPSAoYyk7IFwKLSAgZmxvYXQ2NF90IF9fYTEgPSBfX2E7IFwKLSAgZmxvYXQ2NF90IF9fYjEgPSBfX2I7IFwKLSAgZmxvYXQ2NHgxX3QgX19jMSA9IF9fYzsgXAotICB2Zm1hZF9sYW5lX2Y2NChfX2ExLCBfX2IxLCAtX19jMSwgX19kKTsgfSkKLQotI2RlZmluZSB2Zm1zc19sYW5lcV9mMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMl90IF9fYSA9IChhKTsgZmxvYXQzMl90IF9fYiA9IChiKTsgZmxvYXQzMng0X3QgX19jID0gKGMpOyBcCi0gIGZsb2F0MzJfdCBfX2ExID0gX19hOyBcCi0gIGZsb2F0MzJfdCBfX2IxID0gX19iOyBcCi0gIGZsb2F0MzJ4NF90IF9fYzEgPSBfX2M7IFwKLSAgdmZtYXNfbGFuZXFfZjMyKF9fYTEsIF9fYjEsIC1fX2MxLCBfX2QpOyB9KQotI2RlZmluZSB2Zm1zZF9sYW5lcV9mNjQoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NF90IF9fYSA9IChhKTsgZmxvYXQ2NF90IF9fYiA9IChiKTsgZmxvYXQ2NHgyX3QgX19jID0gKGMpOyBcCi0gIGZsb2F0NjRfdCBfX2ExID0gX19hOyBcCi0gIGZsb2F0NjRfdCBfX2IxID0gX19iOyBcCi0gIGZsb2F0NjR4Ml90IF9fYzEgPSBfX2M7IFwKLSAgdmZtYWRfbGFuZXFfZjY0KF9fYTEsIF9fYjEsIC1fX2MxLCBfX2QpOyB9KQotCi1fX2FpIGZsb2F0MzJfdCB2bXVseHNfZjMyKGZsb2F0MzJfdCBfX2EsIGZsb2F0MzJfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDMyX3QpX19idWlsdGluX25lb25fdm11bHhzX2YzMihfX2EsIF9fYik7IH0KLV9fYWkgZmxvYXQ2NF90IHZtdWx4ZF9mNjQoZmxvYXQ2NF90IF9fYSwgZmxvYXQ2NF90IF9fYikgewotICByZXR1cm4gKGZsb2F0NjRfdClfX2J1aWx0aW5fbmVvbl92bXVseGRfZjY0KF9fYSwgX19iKTsgfQotCi0jZGVmaW5lIHZtdWx4c19sYW5lX2YzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyX3QgX19hID0gKGEpOyBmbG9hdDMyeDJfdCBfX2IgPSAoYik7IFwKLSAgZmxvYXQzMl90IF9fZDEgPSB2Z2V0X2xhbmVfZjMyKF9fYiwgX19jKTtcCi0gIHZtdWx4c19mMzIoX19hLCBfX2QxKTsgfSkKLSNkZWZpbmUgdm11bHhkX2xhbmVfZjY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjRfdCBfX2EgPSAoYSk7IGZsb2F0NjR4MV90IF9fYiA9IChiKTsgXAotICBmbG9hdDY0X3QgX19kMSA9IHZnZXRfbGFuZV9mNjQoX19iLCBfX2MpO1wKLSAgdm11bHhkX2Y2NChfX2EsIF9fZDEpOyB9KQotCi0jZGVmaW5lIHZtdWx4c19sYW5lcV9mMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMl90IF9fYSA9IChhKTsgZmxvYXQzMng0X3QgX19iID0gKGIpOyBcCi0gIGZsb2F0MzJfdCBfX2QxID0gdmdldHFfbGFuZV9mMzIoX19iLCBfX2MpO1wKLSAgdm11bHhzX2YzMihfX2EsIF9fZDEpOyB9KQotI2RlZmluZSB2bXVseGRfbGFuZXFfZjY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjRfdCBfX2EgPSAoYSk7IGZsb2F0NjR4Ml90IF9fYiA9IChiKTsgXAotICBmbG9hdDY0X3QgX19kMSA9IHZnZXRxX2xhbmVfZjY0KF9fYiwgX19jKTtcCi0gIHZtdWx4ZF9mNjQoX19hLCBfX2QxKTsgfSkKLQotI2RlZmluZSB2bXVsc19sYW5lX2YzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyX3QgX19hID0gKGEpOyBmbG9hdDMyeDJfdCBfX2IgPSAoYik7IFwKLSAgZmxvYXQzMl90IF9fZDEgPSB2Z2V0X2xhbmVfZjMyKF9fYiwgX19jKTtcCi0gIF9fYSAqIF9fZDE7IH0pCi0jZGVmaW5lIHZtdWxkX2xhbmVfZjY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjRfdCBfX2EgPSAoYSk7IGZsb2F0NjR4MV90IF9fYiA9IChiKTsgXAotICBmbG9hdDY0X3QgX19kMSA9IHZnZXRfbGFuZV9mNjQoX19iLCBfX2MpO1wKLSAgX19hICogX19kMTsgfSkKLQotI2RlZmluZSB2bXVsc19sYW5lcV9mMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMl90IF9fYSA9IChhKTsgZmxvYXQzMng0X3QgX19iID0gKGIpOyBcCi0gIGZsb2F0MzJfdCBfX2QxID0gdmdldHFfbGFuZV9mMzIoX19iLCBfX2MpO1wKLSAgX19hICogX19kMTsgfSkKLSNkZWZpbmUgdm11bGRfbGFuZXFfZjY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjRfdCBfX2EgPSAoYSk7IGZsb2F0NjR4Ml90IF9fYiA9IChiKTsgXAotICBmbG9hdDY0X3QgX19kMSA9IHZnZXRxX2xhbmVfZjY0KF9fYiwgX19jKTtcCi0gIF9fYSAqIF9fZDE7IH0pCi0KLV9fYWkgZmxvYXQzMl90IHZyZWNwZXNfZjMyKGZsb2F0MzJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyX3QpX19idWlsdGluX25lb25fdnJlY3Blc19mMzIoX19hKTsgfQotX19haSBmbG9hdDY0X3QgdnJlY3BlZF9mNjQoZmxvYXQ2NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjRfdClfX2J1aWx0aW5fbmVvbl92cmVjcGVkX2Y2NChfX2EpOyB9Ci0KLV9fYWkgZmxvYXQzMl90IHZyZWNwc3NfZjMyKGZsb2F0MzJfdCBfX2EsIGZsb2F0MzJfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDMyX3QpX19idWlsdGluX25lb25fdnJlY3Bzc19mMzIoX19hLCBfX2IpOyB9Ci1fX2FpIGZsb2F0NjRfdCB2cmVjcHNkX2Y2NChmbG9hdDY0X3QgX19hLCBmbG9hdDY0X3QgX19iKSB7Ci0gIHJldHVybiAoZmxvYXQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZyZWNwc2RfZjY0KF9fYSwgX19iKTsgfQotCi1fX2FpIGZsb2F0MzJfdCB2cmVjcHhzX2YzMihmbG9hdDMyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMl90KV9fYnVpbHRpbl9uZW9uX3ZyZWNweHNfZjMyKF9fYSk7IH0KLV9fYWkgZmxvYXQ2NF90IHZyZWNweGRfZjY0KGZsb2F0NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdnJlY3B4ZF9mNjQoX19hKTsgfQotCi1fX2FpIGZsb2F0MzJfdCB2cnNxcnRlc19mMzIoZmxvYXQzMl90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92cnNxcnRlc19mMzIoX19hKTsgfQotX19haSBmbG9hdDY0X3QgdnJzcXJ0ZWRfZjY0KGZsb2F0NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdnJzcXJ0ZWRfZjY0KF9fYSk7IH0KLQotX19haSBmbG9hdDMyX3QgdnJzcXJ0c3NfZjMyKGZsb2F0MzJfdCBfX2EsIGZsb2F0MzJfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDMyX3QpX19idWlsdGluX25lb25fdnJzcXJ0c3NfZjMyKF9fYSwgX19iKTsgfQotX19haSBmbG9hdDY0X3QgdnJzcXJ0c2RfZjY0KGZsb2F0NjRfdCBfX2EsIGZsb2F0NjRfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdnJzcXJ0c2RfZjY0KF9fYSwgX19iKTsgfQotCi0jZGVmaW5lIHZnZXRfbGFuZV9mMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng0X3QgX19hID0gKGEpOyBcCi0gIGludDE2eDRfdCBfX2ExID0gdnJlaW50ZXJwcmV0X3MxNl9mMTYoX19hKTtcCi0gIHZnZXRfbGFuZV9zMTYoX19hMSwgX19iKTsgfSkKLSNkZWZpbmUgdmdldHFfbGFuZV9mMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng4X3QgX19hID0gKGEpOyBcCi0gIGludDE2eDhfdCBfX2ExID0gdnJlaW50ZXJwcmV0cV9zMTZfZjE2KF9fYSk7XAotICB2Z2V0cV9sYW5lX3MxNihfX2ExLCBfX2IpOyB9KQotCi1fX2FpIGludDY0X3Qgdm5lZ2RfczY0KGludDY0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92bmVnZF9zNjQoX19hKTsgfQotCi1fX2FpIGludDhfdCB2cWFkZGJfczgoaW50OF90IF9fYSwgaW50OF90IF9fYikgewotICByZXR1cm4gKGludDhfdClfX2J1aWx0aW5fbmVvbl92cWFkZGJfczgoX19hLCBfX2IpOyB9Ci1fX2FpIGludDE2X3QgdnFhZGRoX3MxNihpbnQxNl90IF9fYSwgaW50MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZxYWRkaF9zMTYoX19hLCBfX2IpOyB9Ci1fX2FpIGludDMyX3QgdnFhZGRzX3MzMihpbnQzMl90IF9fYSwgaW50MzJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZxYWRkc19zMzIoX19hLCBfX2IpOyB9Ci1fX2FpIGludDY0X3QgdnFhZGRkX3M2NChpbnQ2NF90IF9fYSwgaW50NjRfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZxYWRkZF9zNjQoX19hLCBfX2IpOyB9Ci1fX2FpIHVpbnQ4X3QgdnFhZGRiX3U4KHVpbnQ4X3QgX19hLCB1aW50OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4X3QpX19idWlsdGluX25lb25fdnFhZGRiX3U4KF9fYSwgX19iKTsgfQotX19haSB1aW50MTZfdCB2cWFkZGhfdTE2KHVpbnQxNl90IF9fYSwgdWludDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2X3QpX19idWlsdGluX25lb25fdnFhZGRoX3UxNihfX2EsIF9fYik7IH0KLV9fYWkgdWludDMyX3QgdnFhZGRzX3UzMih1aW50MzJfdCBfX2EsIHVpbnQzMl90IF9fYikgewotICByZXR1cm4gKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZxYWRkc191MzIoX19hLCBfX2IpOyB9Ci1fX2FpIHVpbnQ2NF90IHZxYWRkZF91NjQodWludDY0X3QgX19hLCB1aW50NjRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92cWFkZGRfdTY0KF9fYSwgX19iKTsgfQotCi1fX2FpIGludDhfdCB2cXJzaGxiX3M4KGludDhfdCBfX2EsIGludDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4X3QpX19idWlsdGluX25lb25fdnFyc2hsYl9zOChfX2EsIF9fYik7IH0KLV9fYWkgaW50MTZfdCB2cXJzaGxoX3MxNihpbnQxNl90IF9fYSwgaW50MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZxcnNobGhfczE2KF9fYSwgX19iKTsgfQotX19haSBpbnQzMl90IHZxcnNobHNfczMyKGludDMyX3QgX19hLCBpbnQzMl90IF9fYikgewotICByZXR1cm4gKGludDMyX3QpX19idWlsdGluX25lb25fdnFyc2hsc19zMzIoX19hLCBfX2IpOyB9Ci1fX2FpIGludDY0X3QgdnFyc2hsZF9zNjQoaW50NjRfdCBfX2EsIGludDY0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92cXJzaGxkX3M2NChfX2EsIF9fYik7IH0KLV9fYWkgdWludDhfdCB2cXJzaGxiX3U4KHVpbnQ4X3QgX19hLCB1aW50OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4X3QpX19idWlsdGluX25lb25fdnFyc2hsYl91OChfX2EsIF9fYik7IH0KLV9fYWkgdWludDE2X3QgdnFyc2hsaF91MTYodWludDE2X3QgX19hLCB1aW50MTZfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZfdClfX2J1aWx0aW5fbmVvbl92cXJzaGxoX3UxNihfX2EsIF9fYik7IH0KLV9fYWkgdWludDMyX3QgdnFyc2hsc191MzIodWludDMyX3QgX19hLCB1aW50MzJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92cXJzaGxzX3UzMihfX2EsIF9fYik7IH0KLV9fYWkgdWludDY0X3QgdnFyc2hsZF91NjQodWludDY0X3QgX19hLCB1aW50NjRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92cXJzaGxkX3U2NChfX2EsIF9fYik7IH0KLQotX19haSBpbnQ4X3QgdnFzaGxiX3M4KGludDhfdCBfX2EsIGludDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4X3QpX19idWlsdGluX25lb25fdnFzaGxiX3M4KF9fYSwgX19iKTsgfQotX19haSBpbnQxNl90IHZxc2hsaF9zMTYoaW50MTZfdCBfX2EsIGludDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZfdClfX2J1aWx0aW5fbmVvbl92cXNobGhfczE2KF9fYSwgX19iKTsgfQotX19haSBpbnQzMl90IHZxc2hsc19zMzIoaW50MzJfdCBfX2EsIGludDMyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92cXNobHNfczMyKF9fYSwgX19iKTsgfQotX19haSBpbnQ2NF90IHZxc2hsZF9zNjQoaW50NjRfdCBfX2EsIGludDY0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92cXNobGRfczY0KF9fYSwgX19iKTsgfQotX19haSB1aW50OF90IHZxc2hsYl91OCh1aW50OF90IF9fYSwgdWludDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hsYl91OChfX2EsIF9fYik7IH0KLV9fYWkgdWludDE2X3QgdnFzaGxoX3UxNih1aW50MTZfdCBfX2EsIHVpbnQxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3Zxc2hsaF91MTYoX19hLCBfX2IpOyB9Ci1fX2FpIHVpbnQzMl90IHZxc2hsc191MzIodWludDMyX3QgX19hLCB1aW50MzJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92cXNobHNfdTMyKF9fYSwgX19iKTsgfQotX19haSB1aW50NjRfdCB2cXNobGRfdTY0KHVpbnQ2NF90IF9fYSwgdWludDY0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdnFzaGxkX3U2NChfX2EsIF9fYik7IH0KLQotX19haSBpbnQ4X3QgdnFzdWJiX3M4KGludDhfdCBfX2EsIGludDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4X3QpX19idWlsdGluX25lb25fdnFzdWJiX3M4KF9fYSwgX19iKTsgfQotX19haSBpbnQxNl90IHZxc3ViaF9zMTYoaW50MTZfdCBfX2EsIGludDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZfdClfX2J1aWx0aW5fbmVvbl92cXN1YmhfczE2KF9fYSwgX19iKTsgfQotX19haSBpbnQzMl90IHZxc3Vic19zMzIoaW50MzJfdCBfX2EsIGludDMyX3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92cXN1YnNfczMyKF9fYSwgX19iKTsgfQotX19haSBpbnQ2NF90IHZxc3ViZF9zNjQoaW50NjRfdCBfX2EsIGludDY0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92cXN1YmRfczY0KF9fYSwgX19iKTsgfQotX19haSB1aW50OF90IHZxc3ViYl91OCh1aW50OF90IF9fYSwgdWludDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OF90KV9fYnVpbHRpbl9uZW9uX3Zxc3ViYl91OChfX2EsIF9fYik7IH0KLV9fYWkgdWludDE2X3QgdnFzdWJoX3UxNih1aW50MTZfdCBfX2EsIHVpbnQxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3Zxc3ViaF91MTYoX19hLCBfX2IpOyB9Ci1fX2FpIHVpbnQzMl90IHZxc3Vic191MzIodWludDMyX3QgX19hLCB1aW50MzJfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92cXN1YnNfdTMyKF9fYSwgX19iKTsgfQotX19haSB1aW50NjRfdCB2cXN1YmRfdTY0KHVpbnQ2NF90IF9fYSwgdWludDY0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdnFzdWJkX3U2NChfX2EsIF9fYik7IH0KLQotX19haSBpbnQ2NF90IHZyc2hsZF9zNjQoaW50NjRfdCBfX2EsIGludDY0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92cnNobGRfczY0KF9fYSwgX19iKTsgfQotX19haSB1aW50NjRfdCB2cnNobGRfdTY0KHVpbnQ2NF90IF9fYSwgdWludDY0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0X3QpX19idWlsdGluX25lb25fdnJzaGxkX3U2NChfX2EsIF9fYik7IH0KLQotX19haSBmbG9hdDY0X3QgdmN2dGRfZjY0X3M2NChpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9mNjRfczY0KF9fYSk7IH0KLQotX19haSBmbG9hdDMyX3QgdmN2dHNfZjMyX3MzMihpbnQzMl90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0c19mMzJfczMyKF9fYSk7IH0KLQotI2RlZmluZSB2Y3Z0c19uX2YzMl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJfdCBfX2EgPSAoYSk7IFwKLSAgKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0c19uX2YzMl9zMzIoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2Y3Z0c19uX2YzMl91MzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyX3QgX19hID0gKGEpOyBcCi0gIChmbG9hdDMyX3QpX19idWlsdGluX25lb25fdmN2dHNfbl9mMzJfdTMyKF9fYSwgX19iKTsgfSkKLQotI2RlZmluZSB2Y3Z0ZF9uX2Y2NF9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjRfdCBfX2EgPSAoYSk7IFwKLSAgKGZsb2F0NjRfdClfX2J1aWx0aW5fbmVvbl92Y3Z0ZF9uX2Y2NF9zNjQoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2Y3Z0ZF9uX2Y2NF91NjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0X3QgX19hID0gKGEpOyBcCi0gIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdmN2dGRfbl9mNjRfdTY0KF9fYSwgX19iKTsgfSkKLQotI2RlZmluZSB2c2V0X2xhbmVfZjE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZfdCBfX2EgPSAoYSk7IGZsb2F0MTZ4NF90IF9fYiA9IChiKTsgXAotICBpbnQxNl90IF9fYTEgPSAoaW50MTZfdClfX2E7XAotICBpbnQxNng0X3QgX19iMSA9IHZyZWludGVycHJldF9zMTZfZjE2KGIpO1wKLSAgaW50MTZ4NF90IF9fYjIgPSB2c2V0X2xhbmVfczE2KF9fYTEsIF9fYjEsIF9fYyk7XAotICB2cmVpbnRlcnByZXRfZjE2X3MxNihfX2IyKTsgfSkKLSNkZWZpbmUgdnNldHFfbGFuZV9mMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNl90IF9fYSA9IChhKTsgZmxvYXQxNng4X3QgX19iID0gKGIpOyBcCi0gIGludDE2X3QgX19hMSA9IChpbnQxNl90KV9fYTtcCi0gIGludDE2eDhfdCBfX2IxID0gdnJlaW50ZXJwcmV0cV9zMTZfZjE2KGIpO1wKLSAgaW50MTZ4OF90IF9fYjIgPSB2c2V0cV9sYW5lX3MxNihfX2ExLCBfX2IxLCBfX2MpO1wKLSAgdnJlaW50ZXJwcmV0cV9mMTZfczE2KF9fYjIpOyB9KQotCi1fX2FpIGludDY0X3QgdnNobGRfczY0KGludDY0X3QgX19hLCBpbnQ2NF90IF9fYikgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdnNobGRfczY0KF9fYSwgX19iKTsgfQotX19haSB1aW50NjRfdCB2c2hsZF91NjQodWludDY0X3QgX19hLCB1aW50NjRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92c2hsZF91NjQoX19hLCBfX2IpOyB9Ci0KLSNkZWZpbmUgdnNobGRfbl9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjRfdCBfX2EgPSAoYSk7IFwKLSAgKGludDY0X3QpX19idWlsdGluX25lb25fdnNobGRfbl9zNjQoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2c2hsZF9uX3U2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjRfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZzaGxkX25fdTY0KF9fYSwgX19iKTsgfSkKLQotI2RlZmluZSB2c2xpZF9uX3M2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NF90IF9fYSA9IChhKTsgaW50NjRfdCBfX2IgPSAoYik7IFwKLSAgKGludDY0X3QpX19idWlsdGluX25lb25fdnNsaWRfbl9zNjQoX19hLCBfX2IsIF9fYyk7IH0pCi0jZGVmaW5lIHZzbGlkX25fdTY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NF90IF9fYSA9IChhKTsgdWludDY0X3QgX19iID0gKGIpOyBcCi0gICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92c2xpZF9uX3U2NChfX2EsIF9fYiwgX19jKTsgfSkKLQotX19haSBpbnQ4X3QgdnFhYnNiX3M4KGludDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4X3QpX19idWlsdGluX25lb25fdnFhYnNiX3M4KF9fYSk7IH0KLV9fYWkgaW50MTZfdCB2cWFic2hfczE2KGludDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZfdClfX2J1aWx0aW5fbmVvbl92cWFic2hfczE2KF9fYSk7IH0KLV9fYWkgaW50MzJfdCB2cWFic3NfczMyKGludDMyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92cWFic3NfczMyKF9fYSk7IH0KLV9fYWkgaW50NjRfdCB2cWFic2RfczY0KGludDY0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92cWFic2RfczY0KF9fYSk7IH0KLQotX19haSBpbnQzMl90IHZxZG1sYWxoX3MxNihpbnQzMl90IF9fYSwgaW50MTZfdCBfX2IsIGludDE2X3QgX19jKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92cWRtbGFsaF9zMTYoX19hLCBfX2IsIF9fYyk7IH0KLV9fYWkgaW50NjRfdCB2cWRtbGFsc19zMzIoaW50NjRfdCBfX2EsIGludDMyX3QgX19iLCBpbnQzMl90IF9fYykgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdnFkbWxhbHNfczMyKF9fYSwgX19iLCBfX2MpOyB9Ci0KLSNkZWZpbmUgdnFkbWxhbGhfbGFuZV9zMTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJfdCBfX2EgPSAoYSk7IGludDE2X3QgX19iID0gKGIpOyBpbnQxNng0X3QgX19jID0gKGMpOyBcCi0gIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZxZG1sYWxoX2xhbmVfczE2KF9fYSwgX19iLCBfX2MsIF9fZCk7IH0pCi0jZGVmaW5lIHZxZG1sYWxzX2xhbmVfczMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0X3QgX19hID0gKGEpOyBpbnQzMl90IF9fYiA9IChiKTsgaW50MzJ4Ml90IF9fYyA9IChjKTsgXAotICAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92cWRtbGFsc19sYW5lX3MzMihfX2EsIF9fYiwgX19jLCBfX2QpOyB9KQotCi0jZGVmaW5lIHZxZG1sYWxoX2xhbmVxX3MxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMl90IF9fYSA9IChhKTsgaW50MTZfdCBfX2IgPSAoYik7IGludDE2eDhfdCBfX2MgPSAoYyk7IFwKLSAgKGludDMyX3QpX19idWlsdGluX25lb25fdnFkbWxhbGhfbGFuZXFfczE2KF9fYSwgX19iLCBfX2MsIF9fZCk7IH0pCi0jZGVmaW5lIHZxZG1sYWxzX2xhbmVxX3MzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NF90IF9fYSA9IChhKTsgaW50MzJfdCBfX2IgPSAoYik7IGludDMyeDRfdCBfX2MgPSAoYyk7IFwKLSAgKGludDY0X3QpX19idWlsdGluX25lb25fdnFkbWxhbHNfbGFuZXFfczMyKF9fYSwgX19iLCBfX2MsIF9fZCk7IH0pCi0KLV9fYWkgaW50MzJfdCB2cWRtbHNsaF9zMTYoaW50MzJfdCBfX2EsIGludDE2X3QgX19iLCBpbnQxNl90IF9fYykgewotICByZXR1cm4gKGludDMyX3QpX19idWlsdGluX25lb25fdnFkbWxzbGhfczE2KF9fYSwgX19iLCBfX2MpOyB9Ci1fX2FpIGludDY0X3QgdnFkbWxzbHNfczMyKGludDY0X3QgX19hLCBpbnQzMl90IF9fYiwgaW50MzJfdCBfX2MpIHsKLSAgcmV0dXJuIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xzX3MzMihfX2EsIF9fYiwgX19jKTsgfQotCi0jZGVmaW5lIHZxZG1sc2xoX2xhbmVfczE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyX3QgX19hID0gKGEpOyBpbnQxNl90IF9fYiA9IChiKTsgaW50MTZ4NF90IF9fYyA9IChjKTsgXAotICAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92cWRtbHNsaF9sYW5lX3MxNihfX2EsIF9fYiwgX19jLCBfX2QpOyB9KQotI2RlZmluZSB2cWRtbHNsc19sYW5lX3MzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NF90IF9fYSA9IChhKTsgaW50MzJfdCBfX2IgPSAoYik7IGludDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgKGludDY0X3QpX19idWlsdGluX25lb25fdnFkbWxzbHNfbGFuZV9zMzIoX19hLCBfX2IsIF9fYywgX19kKTsgfSkKLQotI2RlZmluZSB2cWRtbHNsaF9sYW5lcV9zMTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJfdCBfX2EgPSAoYSk7IGludDE2X3QgX19iID0gKGIpOyBpbnQxNng4X3QgX19jID0gKGMpOyBcCi0gIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xoX2xhbmVxX3MxNihfX2EsIF9fYiwgX19jLCBfX2QpOyB9KQotI2RlZmluZSB2cWRtbHNsc19sYW5lcV9zMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjRfdCBfX2EgPSAoYSk7IGludDMyX3QgX19iID0gKGIpOyBpbnQzMng0X3QgX19jID0gKGMpOyBcCi0gIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZxZG1sc2xzX2xhbmVxX3MzMihfX2EsIF9fYiwgX19jLCBfX2QpOyB9KQotCi1fX2FpIGludDE2X3QgdnFkbXVsaGhfczE2KGludDE2X3QgX19hLCBpbnQxNl90IF9fYikgewotICByZXR1cm4gKGludDE2X3QpX19idWlsdGluX25lb25fdnFkbXVsaGhfczE2KF9fYSwgX19iKTsgfQotX19haSBpbnQzMl90IHZxZG11bGhzX3MzMihpbnQzMl90IF9fYSwgaW50MzJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZxZG11bGhzX3MzMihfX2EsIF9fYik7IH0KLQotI2RlZmluZSB2cWRtdWxoaF9sYW5lX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNl90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgXAotICB2cWRtdWxoaF9zMTYoX19hLCB2Z2V0X2xhbmVfczE2KF9fYiwgX19jKSk7IH0pCi0jZGVmaW5lIHZxZG11bGhzX2xhbmVfczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyX3QgX19hID0gKGEpOyBpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGhzX3MzMihfX2EsIHZnZXRfbGFuZV9zMzIoX19iLCBfX2MpKTsgfSkKLQotI2RlZmluZSB2cWRtdWxoaF9sYW5lcV9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgdnFkbXVsaGhfczE2KF9fYSwgdmdldHFfbGFuZV9zMTYoX19iLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFkbXVsaHNfbGFuZXFfczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyX3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGhzX3MzMihfX2EsIHZnZXRxX2xhbmVfczMyKF9fYiwgX19jKSk7IH0pCi0KLV9fYWkgaW50MzJfdCB2cWRtdWxsaF9zMTYoaW50MTZfdCBfX2EsIGludDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92cWRtdWxsaF9zMTYoX19hLCBfX2IpOyB9Ci1fX2FpIGludDY0X3QgdnFkbXVsbHNfczMyKGludDMyX3QgX19hLCBpbnQzMl90IF9fYikgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdnFkbXVsbHNfczMyKF9fYSwgX19iKTsgfQotCi0jZGVmaW5lIHZxZG11bGxoX2xhbmVfczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2X3QgX19hID0gKGEpOyBpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGxoX3MxNihfX2EsIHZnZXRfbGFuZV9zMTYoYiwgX19jKSk7IH0pCi0jZGVmaW5lIHZxZG11bGxzX2xhbmVfczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyX3QgX19hID0gKGEpOyBpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGxzX3MzMihfX2EsIHZnZXRfbGFuZV9zMzIoYiwgX19jKSk7IH0pCi0KLSNkZWZpbmUgdnFkbXVsbGhfbGFuZXFfczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGxoX3MxNihfX2EsIHZnZXRxX2xhbmVfczE2KGIsIF9fYykpOyB9KQotI2RlZmluZSB2cWRtdWxsc19sYW5lcV9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJfdCBfX2EgPSAoYSk7IGludDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgdnFkbXVsbHNfczMyKF9fYSwgdmdldHFfbGFuZV9zMzIoYiwgX19jKSk7IH0pCi0KLV9fYWkgaW50OF90IHZxbmVnYl9zOChpbnQ4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OF90KV9fYnVpbHRpbl9uZW9uX3ZxbmVnYl9zOChfX2EpOyB9Ci1fX2FpIGludDE2X3QgdnFuZWdoX3MxNihpbnQxNl90IF9fYSkgewotICByZXR1cm4gKGludDE2X3QpX19idWlsdGluX25lb25fdnFuZWdoX3MxNihfX2EpOyB9Ci1fX2FpIGludDMyX3QgdnFuZWdzX3MzMihpbnQzMl90IF9fYSkgewotICByZXR1cm4gKGludDMyX3QpX19idWlsdGluX25lb25fdnFuZWdzX3MzMihfX2EpOyB9Ci1fX2FpIGludDY0X3QgdnFuZWdkX3M2NChpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdnFuZWdkX3M2NChfX2EpOyB9Ci0KLV9fYWkgaW50MTZfdCB2cXJkbXVsaGhfczE2KGludDE2X3QgX19hLCBpbnQxNl90IF9fYikgewotICByZXR1cm4gKGludDE2X3QpX19idWlsdGluX25lb25fdnFyZG11bGhoX3MxNihfX2EsIF9fYik7IH0KLV9fYWkgaW50MzJfdCB2cXJkbXVsaHNfczMyKGludDMyX3QgX19hLCBpbnQzMl90IF9fYikgewotICByZXR1cm4gKGludDMyX3QpX19idWlsdGluX25lb25fdnFyZG11bGhzX3MzMihfX2EsIF9fYik7IH0KLQotI2RlZmluZSB2cXJkbXVsaGhfbGFuZV9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZfdCBfX2EgPSAoYSk7IGludDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgdnFyZG11bGhoX3MxNihfX2EsIHZnZXRfbGFuZV9zMTYoX19iLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFyZG11bGhzX2xhbmVfczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyX3QgX19hID0gKGEpOyBpbnQzMngyX3QgX19iID0gKGIpOyBcCi0gIHZxcmRtdWxoc19zMzIoX19hLCB2Z2V0X2xhbmVfczMyKF9fYiwgX19jKSk7IH0pCi0KLSNkZWZpbmUgdnFyZG11bGhoX2xhbmVxX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNl90IF9fYSA9IChhKTsgaW50MTZ4OF90IF9fYiA9IChiKTsgXAotICB2cXJkbXVsaGhfczE2KF9fYSwgdmdldHFfbGFuZV9zMTYoX19iLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFyZG11bGhzX2xhbmVxX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMl90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgXAotICB2cXJkbXVsaHNfczMyKF9fYSwgdmdldHFfbGFuZV9zMzIoX19iLCBfX2MpKTsgfSkKLQotI2RlZmluZSB2cXJzaHJuaF9uX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNl90IF9fYSA9IChhKTsgXAotICAoaW50OF90KV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5oX25fczE2KF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdnFyc2hybnNfbl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJfdCBfX2EgPSAoYSk7IFwKLSAgKGludDE2X3QpX19idWlsdGluX25lb25fdnFyc2hybnNfbl9zMzIoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2cXJzaHJuZF9uX3M2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NF90IF9fYSA9IChhKTsgXAotICAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92cXJzaHJuZF9uX3M2NChfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZxcnNocm5oX25fdTE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNl90IF9fYSA9IChhKTsgXAotICAodWludDhfdClfX2J1aWx0aW5fbmVvbl92cXJzaHJuaF9uX3UxNihfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZxcnNocm5zX25fdTMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMl90IF9fYSA9IChhKTsgXAotICAodWludDE2X3QpX19idWlsdGluX25lb25fdnFyc2hybnNfbl91MzIoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2cXJzaHJuZF9uX3U2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjRfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZxcnNocm5kX25fdTY0KF9fYSwgX19iKTsgfSkKLQotI2RlZmluZSB2cXJzaHJ1bmhfbl9zMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZfdCBfX2EgPSAoYSk7IFwKLSAgKGludDhfdClfX2J1aWx0aW5fbmVvbl92cXJzaHJ1bmhfbl9zMTYoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2cXJzaHJ1bnNfbl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJfdCBfX2EgPSAoYSk7IFwKLSAgKGludDE2X3QpX19idWlsdGluX25lb25fdnFyc2hydW5zX25fczMyKF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdnFyc2hydW5kX25fczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0X3QgX19hID0gKGEpOyBcCi0gIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZxcnNocnVuZF9uX3M2NChfX2EsIF9fYik7IH0pCi0KLSNkZWZpbmUgdnFzaGx1Yl9uX3M4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDhfdCBfX2EgPSAoYSk7IFwKLSAgKGludDhfdClfX2J1aWx0aW5fbmVvbl92cXNobHViX25fczgoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2cXNobHVoX25fczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2X3QgX19hID0gKGEpOyBcCi0gIChpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3Zxc2hsdWhfbl9zMTYoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2cXNobHVzX25fczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyX3QgX19hID0gKGEpOyBcCi0gIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3Zxc2hsdXNfbl9zMzIoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2cXNobHVkX25fczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0X3QgX19hID0gKGEpOyBcCi0gIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hsdWRfbl9zNjQoX19hLCBfX2IpOyB9KQotCi0jZGVmaW5lIHZxc2hsYl9uX3M4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDhfdCBfX2EgPSAoYSk7IFwKLSAgKGludDhfdClfX2J1aWx0aW5fbmVvbl92cXNobGJfbl9zOChfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZxc2hsaF9uX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNl90IF9fYSA9IChhKTsgXAotICAoaW50MTZfdClfX2J1aWx0aW5fbmVvbl92cXNobGhfbl9zMTYoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2cXNobHNfbl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJfdCBfX2EgPSAoYSk7IFwKLSAgKGludDMyX3QpX19idWlsdGluX25lb25fdnFzaGxzX25fczMyKF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdnFzaGxkX25fczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0X3QgX19hID0gKGEpOyBcCi0gIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hsZF9uX3M2NChfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZxc2hsYl9uX3U4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4X3QgX19hID0gKGEpOyBcCi0gICh1aW50OF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hsYl9uX3U4KF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdnFzaGxoX25fdTE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNl90IF9fYSA9IChhKTsgXAotICAodWludDE2X3QpX19idWlsdGluX25lb25fdnFzaGxoX25fdTE2KF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdnFzaGxzX25fdTMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMl90IF9fYSA9IChhKTsgXAotICAodWludDMyX3QpX19idWlsdGluX25lb25fdnFzaGxzX25fdTMyKF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdnFzaGxkX25fdTY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NF90IF9fYSA9IChhKTsgXAotICAodWludDY0X3QpX19idWlsdGluX25lb25fdnFzaGxkX25fdTY0KF9fYSwgX19iKTsgfSkKLQotI2RlZmluZSB2cXNocm5oX25fczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2X3QgX19hID0gKGEpOyBcCi0gIChpbnQ4X3QpX19idWlsdGluX25lb25fdnFzaHJuaF9uX3MxNihfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZxc2hybnNfbl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJfdCBfX2EgPSAoYSk7IFwKLSAgKGludDE2X3QpX19idWlsdGluX25lb25fdnFzaHJuc19uX3MzMihfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZxc2hybmRfbl9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjRfdCBfX2EgPSAoYSk7IFwKLSAgKGludDMyX3QpX19idWlsdGluX25lb25fdnFzaHJuZF9uX3M2NChfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZxc2hybmhfbl91MTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2X3QgX19hID0gKGEpOyBcCi0gICh1aW50OF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hybmhfbl91MTYoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2cXNocm5zX25fdTMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMl90IF9fYSA9IChhKTsgXAotICAodWludDE2X3QpX19idWlsdGluX25lb25fdnFzaHJuc19uX3UzMihfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZxc2hybmRfbl91NjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0X3QgX19hID0gKGEpOyBcCi0gICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92cXNocm5kX25fdTY0KF9fYSwgX19iKTsgfSkKLQotI2RlZmluZSB2cXNocnVuaF9uX3MxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNl90IF9fYSA9IChhKTsgXAotICAoaW50OF90KV9fYnVpbHRpbl9uZW9uX3Zxc2hydW5oX25fczE2KF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdnFzaHJ1bnNfbl9zMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJfdCBfX2EgPSAoYSk7IFwKLSAgKGludDE2X3QpX19idWlsdGluX25lb25fdnFzaHJ1bnNfbl9zMzIoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2cXNocnVuZF9uX3M2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NF90IF9fYSA9IChhKTsgXAotICAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92cXNocnVuZF9uX3M2NChfX2EsIF9fYik7IH0pCi0KLV9fYWkgaW50OF90IHZxbW92bmhfczE2KGludDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OF90KV9fYnVpbHRpbl9uZW9uX3ZxbW92bmhfczE2KF9fYSk7IH0KLV9fYWkgaW50MTZfdCB2cW1vdm5zX3MzMihpbnQzMl90IF9fYSkgewotICByZXR1cm4gKGludDE2X3QpX19idWlsdGluX25lb25fdnFtb3Zuc19zMzIoX19hKTsgfQotX19haSBpbnQzMl90IHZxbW92bmRfczY0KGludDY0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92cW1vdm5kX3M2NChfX2EpOyB9Ci0KLV9fYWkgaW50OF90IHZxbW92dW5oX3MxNihpbnQxNl90IF9fYSkgewotICByZXR1cm4gKGludDhfdClfX2J1aWx0aW5fbmVvbl92cW1vdnVuaF9zMTYoX19hKTsgfQotX19haSBpbnQxNl90IHZxbW92dW5zX3MzMihpbnQzMl90IF9fYSkgewotICByZXR1cm4gKGludDE2X3QpX19idWlsdGluX25lb25fdnFtb3Z1bnNfczMyKF9fYSk7IH0KLV9fYWkgaW50MzJfdCB2cW1vdnVuZF9zNjQoaW50NjRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZxbW92dW5kX3M2NChfX2EpOyB9Ci0KLSNkZWZpbmUgdnNyaWRfbl9zNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjRfdCBfX2EgPSAoYSk7IGludDY0X3QgX19iID0gKGIpOyBcCi0gIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZzcmlkX25fczY0KF9fYSwgX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c3JpZF9uX3U2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjRfdCBfX2EgPSAoYSk7IHVpbnQ2NF90IF9fYiA9IChiKTsgXAotICAodWludDY0X3QpX19idWlsdGluX25lb25fdnNyaWRfbl91NjQoX19hLCBfX2IsIF9fYyk7IH0pCi0KLSNkZWZpbmUgdnJzaHJkX25fczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0X3QgX19hID0gKGEpOyBcCi0gIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3Zyc2hyZF9uX3M2NChfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZyc2hyZF9uX3U2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjRfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3Zyc2hyZF9uX3U2NChfX2EsIF9fYik7IH0pCi0KLSNkZWZpbmUgdnJzcmFkX25fczY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0X3QgX19hID0gKGEpOyBpbnQ2NF90IF9fYiA9IChiKTsgXAotICAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92cnNyYWRfbl9zNjQoX19hLCBfX2IsIF9fYyk7IH0pCi0jZGVmaW5lIHZyc3JhZF9uX3U2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjRfdCBfX2EgPSAoYSk7IHVpbnQ2NF90IF9fYiA9IChiKTsgXAotICAodWludDY0X3QpX19idWlsdGluX25lb25fdnJzcmFkX25fdTY0KF9fYSwgX19iLCBfX2MpOyB9KQotCi0jZGVmaW5lIHZzaHJkX25fczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0X3QgX19hID0gKGEpOyBcCi0gIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZzaHJkX25fczY0KF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdnNocmRfbl91NjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0X3QgX19hID0gKGEpOyBcCi0gICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92c2hyZF9uX3U2NChfX2EsIF9fYik7IH0pCi0KLSNkZWZpbmUgdnNyYWRfbl9zNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjRfdCBfX2EgPSAoYSk7IGludDY0X3QgX19iID0gKGIpOyBcCi0gIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZzcmFkX25fczY0KF9fYSwgX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c3JhZF9uX3U2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjRfdCBfX2EgPSAoYSk7IHVpbnQ2NF90IF9fYiA9IChiKTsgXAotICAodWludDY0X3QpX19idWlsdGluX25lb25fdnNyYWRfbl91NjQoX19hLCBfX2IsIF9fYyk7IH0pCi0KLV9fYWkgaW50NjRfdCB2c3ViZF9zNjQoaW50NjRfdCBfX2EsIGludDY0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92c3ViZF9zNjQoX19hLCBfX2IpOyB9Ci1fX2FpIHVpbnQ2NF90IHZzdWJkX3U2NCh1aW50NjRfdCBfX2EsIHVpbnQ2NF90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZzdWJkX3U2NChfX2EsIF9fYik7IH0KLQotX19haSBpbnQ4X3QgdnVxYWRkYl9zOChpbnQ4X3QgX19hLCBpbnQ4X3QgX19iKSB7Ci0gIHJldHVybiAoaW50OF90KV9fYnVpbHRpbl9uZW9uX3Z1cWFkZGJfczgoX19hLCBfX2IpOyB9Ci1fX2FpIGludDE2X3QgdnVxYWRkaF9zMTYoaW50MTZfdCBfX2EsIGludDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZfdClfX2J1aWx0aW5fbmVvbl92dXFhZGRoX3MxNihfX2EsIF9fYik7IH0KLV9fYWkgaW50MzJfdCB2dXFhZGRzX3MzMihpbnQzMl90IF9fYSwgaW50MzJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3Z1cWFkZHNfczMyKF9fYSwgX19iKTsgfQotX19haSBpbnQ2NF90IHZ1cWFkZGRfczY0KGludDY0X3QgX19hLCBpbnQ2NF90IF9fYikgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdnVxYWRkZF9zNjQoX19hLCBfX2IpOyB9Ci0KLV9fYWkgZmxvYXQ2NF90IHZjdnRkX2Y2NF91NjQodWludDY0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZjdnRkX2Y2NF91NjQoX19hKTsgfQotCi1fX2FpIGZsb2F0MzJfdCB2Y3Z0c19mMzJfdTMyKHVpbnQzMl90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0c19mMzJfdTMyKF9fYSk7IH0KLQotX19haSB1aW50OF90IHZxbW92bmhfdTE2KHVpbnQxNl90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4X3QpX19idWlsdGluX25lb25fdnFtb3ZuaF91MTYoX19hKTsgfQotX19haSB1aW50MTZfdCB2cW1vdm5zX3UzMih1aW50MzJfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZfdClfX2J1aWx0aW5fbmVvbl92cW1vdm5zX3UzMihfX2EpOyB9Ci1fX2FpIHVpbnQzMl90IHZxbW92bmRfdTY0KHVpbnQ2NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZxbW92bmRfdTY0KF9fYSk7IH0KLQotX19haSB1aW50OF90IHZzcWFkZGJfdTgodWludDhfdCBfX2EsIHVpbnQ4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDhfdClfX2J1aWx0aW5fbmVvbl92c3FhZGRiX3U4KF9fYSwgX19iKTsgfQotX19haSB1aW50MTZfdCB2c3FhZGRoX3UxNih1aW50MTZfdCBfX2EsIHVpbnQxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZzcWFkZGhfdTE2KF9fYSwgX19iKTsgfQotX19haSB1aW50MzJfdCB2c3FhZGRzX3UzMih1aW50MzJfdCBfX2EsIHVpbnQzMl90IF9fYikgewotICByZXR1cm4gKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZzcWFkZHNfdTMyKF9fYSwgX19iKTsgfQotX19haSB1aW50NjRfdCB2c3FhZGRkX3U2NCh1aW50NjRfdCBfX2EsIHVpbnQ2NF90IF9fYikgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZzcWFkZGRfdTY0KF9fYSwgX19iKTsgfQotCi0jZGVmaW5lIHZkdXBiX2xhbmVfczgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4X3QgX19hID0gKGEpOyBcCi0gIChpbnQ4X3QpX19idWlsdGluX25lb25fdmR1cGJfbGFuZV9pOChfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBoX2xhbmVfczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IFwKLSAgKGludDE2X3QpX19idWlsdGluX25lb25fdmR1cGhfbGFuZV9pMTYoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwc19sYW5lX3MzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBcCi0gIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZkdXBzX2xhbmVfaTMyKF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cGRfbGFuZV9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MV90IF9fYSA9IChhKTsgXAotICAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92ZHVwZF9sYW5lX2k2NChfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBzX2xhbmVfZjMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4Ml90IF9fYSA9IChhKTsgXAotICAoZmxvYXQzMl90KV9fYnVpbHRpbl9uZW9uX3ZkdXBzX2xhbmVfZjMyKF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cGRfbGFuZV9mNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgxX3QgX19hID0gKGEpOyBcCi0gIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdmR1cGRfbGFuZV9mNjQoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwYl9sYW5lX3U4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ4X3QpX19idWlsdGluX25lb25fdmR1cGJfbGFuZV9pOCgoaW50OHg4X3QpX19hLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwaF9sYW5lX3UxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NF90IF9fYSA9IChhKTsgXAotICAodWludDE2X3QpX19idWlsdGluX25lb25fdmR1cGhfbGFuZV9pMTYoKGludDE2eDRfdClfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBzX2xhbmVfdTMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hID0gKGEpOyBcCi0gICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92ZHVwc19sYW5lX2kzMigoaW50MzJ4Ml90KV9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cGRfbGFuZV91NjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDFfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZkdXBkX2xhbmVfaTY0KChpbnQ2NHgxX3QpX19hLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwYl9sYW5lX3A4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDhfdCBfX2EgPSAoYSk7IFwKLSAgKHBvbHk4X3QpX19idWlsdGluX25lb25fdmR1cGJfbGFuZV9pOCgoaW50OHg4X3QpX19hLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwaF9sYW5lX3AxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4NF90IF9fYSA9IChhKTsgXAotICAocG9seTE2X3QpX19idWlsdGluX25lb25fdmR1cGhfbGFuZV9pMTYoKGludDE2eDRfdClfX2EsIF9fYik7IH0pCi0KLSNkZWZpbmUgdmR1cGJfbGFuZXFfczgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNl90IF9fYSA9IChhKTsgXAotICAoaW50OF90KV9fYnVpbHRpbl9uZW9uX3ZkdXBiX2xhbmVxX2k4KF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cGhfbGFuZXFfczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgKGludDE2X3QpX19idWlsdGluX25lb25fdmR1cGhfbGFuZXFfaTE2KF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHNfbGFuZXFfczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgKGludDMyX3QpX19idWlsdGluX25lb25fdmR1cHNfbGFuZXFfaTMyKF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cGRfbGFuZXFfczY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgKGludDY0X3QpX19idWlsdGluX25lb25fdmR1cGRfbGFuZXFfaTY0KF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHNfbGFuZXFfZjMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NF90IF9fYSA9IChhKTsgXAotICAoZmxvYXQzMl90KV9fYnVpbHRpbl9uZW9uX3ZkdXBzX2xhbmVxX2YzMihfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBkX2xhbmVxX2Y2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgKGZsb2F0NjRfdClfX2J1aWx0aW5fbmVvbl92ZHVwZF9sYW5lcV9mNjQoX19hLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwYl9sYW5lcV91OChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHgxNl90IF9fYSA9IChhKTsgXAotICAodWludDhfdClfX2J1aWx0aW5fbmVvbl92ZHVwYl9sYW5lcV9pOCgoaW50OHgxNl90KV9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cGhfbGFuZXFfdTE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4X3QgX19hID0gKGEpOyBcCi0gICh1aW50MTZfdClfX2J1aWx0aW5fbmVvbl92ZHVwaF9sYW5lcV9pMTYoKGludDE2eDhfdClfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBzX2xhbmVxX3UzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgXAotICAodWludDMyX3QpX19idWlsdGluX25lb25fdmR1cHNfbGFuZXFfaTMyKChpbnQzMng0X3QpX19hLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwZF9sYW5lcV91NjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZkdXBkX2xhbmVxX2k2NCgoaW50NjR4Ml90KV9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cGJfbGFuZXFfcDgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4MTZfdCBfX2EgPSAoYSk7IFwKLSAgKHBvbHk4X3QpX19idWlsdGluX25lb25fdmR1cGJfbGFuZXFfaTgoKGludDh4MTZfdClfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBoX2xhbmVxX3AxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4OF90IF9fYSA9IChhKTsgXAotICAocG9seTE2X3QpX19idWlsdGluX25lb25fdmR1cGhfbGFuZXFfaTE2KChpbnQxNng4X3QpX19hLCBfX2IpOyB9KQotCi0jZGVmaW5lIHZtdWx4X2xhbmVfZjY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MV90IF9fYSA9IChhKTsgZmxvYXQ2NHgxX3QgX19iID0gKGIpOyBcCi0gIGZsb2F0NjRfdCBfX2QxID0gdmdldF9sYW5lX2Y2NChfX2EsIDApO1wKLSAgZmxvYXQ2NF90IF9fZTEgPSB2Z2V0X2xhbmVfZjY0KF9fYiwgX19jKTtcCi0gIGZsb2F0NjRfdCBfX2YxID0gdm11bHhkX2Y2NChfX2QxLCBfX2UxKTtcCi0gIGZsb2F0NjR4MV90IF9fZzE7XAotICB2c2V0X2xhbmVfZjY0KF9fZjEsIF9fZzEsIF9fYyk7IH0pCi0KLSNkZWZpbmUgdm11bHhfbGFuZXFfZjY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MV90IF9fYSA9IChhKTsgZmxvYXQ2NHgyX3QgX19iID0gKGIpOyBcCi0gIGZsb2F0NjRfdCBfX2QxID0gdmdldF9sYW5lX2Y2NChfX2EsIDApO1wKLSAgZmxvYXQ2NF90IF9fZTEgPSB2Z2V0cV9sYW5lX2Y2NChfX2IsIF9fYyk7XAotICBmbG9hdDY0X3QgX19mMSA9IHZtdWx4ZF9mNjQoX19kMSwgX19lMSk7XAotICBmbG9hdDY0eDFfdCBfX2cxO1wKLSAgdnNldF9sYW5lX2Y2NChfX2YxLCBfX2cxLCAwKTsgfSkKLQotI2RlZmluZSB2bXVsX2xhbmVfZjY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MV90IF9fYSA9IChhKTsgZmxvYXQ2NHgxX3QgX19iID0gKGIpOyBcCi0gIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92bXVsX2xhbmVfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCBfX2MsIDkpOyB9KQotCi0jZGVmaW5lIHZtdWxfbGFuZXFfZjY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MV90IF9fYSA9IChhKTsgZmxvYXQ2NHgyX3QgX19iID0gKGIpOyBcCi0gIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92bXVsX2xhbmVxX3YoKGludDh4OF90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgOSk7IH0pCi0KLV9fYWkgZmxvYXQ2NHgxX3Qgdm11bF9uX2Y2NChmbG9hdDY0eDFfdCBfX2EsIGZsb2F0NjRfdCBfX2IpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92bXVsX25fZjY0KF9fYSwgX19iKTsgfQotCi0jZGVmaW5lIHZzZXRfbGFuZV9mNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NF90IF9fYSA9IChhKTsgZmxvYXQ2NHgxX3QgX19iID0gKGIpOyBcCi0gIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92c2V0X2xhbmVfZjY0KF9fYSwgX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c2V0cV9sYW5lX2Y2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0X3QgX19hID0gKGEpOyBmbG9hdDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfZjY0KF9fYSwgX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c2V0X2xhbmVfcDY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NF90IF9fYSA9IChhKTsgcG9seTY0eDFfdCBfX2IgPSAoYik7IFwKLSAgKHBvbHk2NHgxX3QpX19idWlsdGluX25lb25fdnNldF9sYW5lX2k2NChfX2EsIChpbnQ2NHgxX3QpX19iLCBfX2MpOyB9KQotI2RlZmluZSB2c2V0cV9sYW5lX3A2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjRfdCBfX2EgPSAoYSk7IHBvbHk2NHgyX3QgX19iID0gKGIpOyBcCi0gIChwb2x5NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzZXRxX2xhbmVfaTY0KF9fYSwgKGludDY0eDJfdClfX2IsIF9fYyk7IH0pCi0KLSNkZWZpbmUgdnNobGxfaGlnaF9uX3M4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4MTZfdCBfX2EgPSAoYSk7IFwKLSAgaW50OHg4X3QgX19hMSA9IHZnZXRfaGlnaF9zOChfX2EpOyBcCi0gIChpbnQxNng4X3QpdnNobGxfbl9zOChfX2ExLCBfX2IpOyB9KQotI2RlZmluZSB2c2hsbF9oaWdoX25fczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgaW50MTZ4NF90IF9fYTEgPSB2Z2V0X2hpZ2hfczE2KF9fYSk7IFwKLSAgKGludDMyeDRfdCl2c2hsbF9uX3MxNihfX2ExLCBfX2IpOyB9KQotI2RlZmluZSB2c2hsbF9oaWdoX25fczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgaW50MzJ4Ml90IF9fYTEgPSB2Z2V0X2hpZ2hfczMyKF9fYSk7IFwKLSAgKGludDY0eDJfdCl2c2hsbF9uX3MzMihfX2ExLCBfX2IpOyB9KQotI2RlZmluZSB2c2hsbF9oaWdoX25fdTgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZfdCBfX2EgPSAoYSk7IFwKLSAgdWludDh4OF90IF9fYTEgPSB2Z2V0X2hpZ2hfdTgoX19hKTsgXAotICAodWludDE2eDhfdCl2c2hsbF9uX3U4KF9fYTEsIF9fYik7IH0pCi0jZGVmaW5lIHZzaGxsX2hpZ2hfbl91MTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgdWludDE2eDRfdCBfX2ExID0gdmdldF9oaWdoX3UxNihfX2EpOyBcCi0gICh1aW50MzJ4NF90KXZzaGxsX25fdTE2KF9fYTEsIF9fYik7IH0pCi0jZGVmaW5lIHZzaGxsX2hpZ2hfbl91MzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgdWludDMyeDJfdCBfX2ExID0gdmdldF9oaWdoX3UzMihfX2EpOyBcCi0gICh1aW50NjR4Ml90KXZzaGxsX25fdTMyKF9fYTEsIF9fYik7IH0pCi0KLSNkZWZpbmUgdnNocm5faGlnaF9uX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDhfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgKGludDh4MTZfdCl2Y29tYmluZV9zMTYoX19hLCB2c2hybl9uX3MxNihfX2IsIF9fYykpOyB9KQotI2RlZmluZSB2c2hybl9oaWdoX25fczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IGludDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgKGludDE2eDhfdCl2Y29tYmluZV9zMzIoX19hLCB2c2hybl9uX3MzMihfX2IsIF9fYykpOyB9KQotI2RlZmluZSB2c2hybl9oaWdoX25fczY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IGludDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgKGludDMyeDRfdCl2Y29tYmluZV9zNjQoX19hLCB2c2hybl9uX3M2NChfX2IsIF9fYykpOyB9KQotI2RlZmluZSB2c2hybl9oaWdoX25fdTE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDhfdCBfX2EgPSAoYSk7IHVpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gICh1aW50OHgxNl90KXZjb21iaW5lX3UxNihfX2EsIHZzaHJuX25fdTE2KF9fYiwgX19jKSk7IH0pCi0jZGVmaW5lIHZzaHJuX2hpZ2hfbl91MzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IHVpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gICh1aW50MTZ4OF90KXZjb21iaW5lX3UzMihfX2EsIHZzaHJuX25fdTMyKF9fYiwgX19jKSk7IH0pCi0jZGVmaW5lIHZzaHJuX2hpZ2hfbl91NjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJfdCBfX2EgPSAoYSk7IHVpbnQ2NHgyX3QgX19iID0gKGIpOyBcCi0gICh1aW50MzJ4NF90KXZjb21iaW5lX3U2NChfX2EsIHZzaHJuX25fdTY0KF9fYiwgX19jKSk7IH0pCi0KLSNkZWZpbmUgdnNsaV9uX3A2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MV90IF9fYSA9IChhKTsgcG9seTY0eDFfdCBfX2IgPSAoYik7IFwKLSAgKHBvbHk2NHgxX3QpX19idWlsdGluX25lb25fdnNsaV9uX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCA2KTsgfSkKLSNkZWZpbmUgdnNsaXFfbl9wNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDJfdCBfX2EgPSAoYSk7IHBvbHk2NHgyX3QgX19iID0gKGIpOyBcCi0gIChwb2x5NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZzbGlxX25fdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgMzgpOyB9KQotCi1fX2FpIGludDh4MTZfdCB2cW1vdnVuX2hpZ2hfczE2KGludDh4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICBpbnQ4eDhfdCBfX2ExID0gdnFtb3Z1bl9zMTYoX19iKTsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSk7IH0KLV9fYWkgaW50MTZ4OF90IHZxbW92dW5faGlnaF9zMzIoaW50MTZ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICBpbnQxNng0X3QgX19hMSA9IHZxbW92dW5fczMyKF9fYik7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcpOyB9Ci1fX2FpIGludDMyeDRfdCB2cW1vdnVuX2hpZ2hfczY0KGludDMyeDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgaW50MzJ4Ml90IF9fYTEgPSB2cW1vdnVuX3M2NChfX2IpOwotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2ExLCAwLCAxLCAyLCAzKTsgfQotCi0jZGVmaW5lIHZzcmlfbl9wNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDFfdCBfX2EgPSAoYSk7IHBvbHk2NHgxX3QgX19iID0gKGIpOyBcCi0gIChwb2x5NjR4MV90KV9fYnVpbHRpbl9uZW9uX3Zzcmlfbl92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgNik7IH0pCi0jZGVmaW5lIHZzcmlxX25fcDY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgyX3QgX19hID0gKGEpOyBwb2x5NjR4Ml90IF9fYiA9IChiKTsgXAotICAocG9seTY0eDJfdClfX2J1aWx0aW5fbmVvbl92c3JpcV9uX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDM4KTsgfSkKLQotI2RlZmluZSB2c3QxcV9mNjQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3YoX19hLCAoaW50OHgxNl90KV9fYiwgNDEpOyB9KQotI2RlZmluZSB2c3QxX2Y2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDFfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV92KF9fYSwgKGludDh4OF90KV9fYiwgOSk7IH0pCi0jZGVmaW5lIHZzdDFfcDY0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfdihfX2EsIChpbnQ4eDhfdClfX2IsIDYpOyB9KQotI2RlZmluZSB2c3QxcV9wNjQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfdihfX2EsIChpbnQ4eDE2X3QpX19iLCAzOCk7IH0pCi0KLSNkZWZpbmUgdnN0MXFfbGFuZV9mNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IsIF9fYywgNDEpOyB9KQotI2RlZmluZSB2c3QxcV9sYW5lX3A2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLCBfX2MsIDM4KTsgfSkKLSNkZWZpbmUgdnN0MV9sYW5lX2Y2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MV90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgOSk7IH0pCi0jZGVmaW5lIHZzdDFfbGFuZV9wNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MV90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IsIF9fYywgNik7IH0pCi0KLSNkZWZpbmUgdnN0MXFfdThfeDIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94Ml92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIDQ4KTsgfSkKLSNkZWZpbmUgdnN0MXFfdTE2X3gyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDJfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCA0OSk7IH0pCi0jZGVmaW5lIHZzdDFxX3UzMl94MihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gyX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgNTApOyB9KQotI2RlZmluZSB2c3QxcV91NjRfeDIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94Ml92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIDUxKTsgfSkKLSNkZWZpbmUgdnN0MXFfczhfeDIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gyX3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCAzMik7IH0pCi0jZGVmaW5lIHZzdDFxX3MxNl94MihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDJfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAzMyk7IH0pCi0jZGVmaW5lIHZzdDFxX3MzMl94MihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDJfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAzNCk7IH0pCi0jZGVmaW5lIHZzdDFxX3M2NF94MihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDJfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAzNSk7IH0pCi0jZGVmaW5lIHZzdDFxX2YxNl94MihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDh4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94Ml92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIDM5KTsgfSkKLSNkZWZpbmUgdnN0MXFfZjMyX3gyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gyX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgNDApOyB9KQotI2RlZmluZSB2c3QxcV9mNjRfeDIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDJfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCA0MSk7IH0pCi0jZGVmaW5lIHZzdDFxX3A4X3gyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDJfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAzNik7IH0pCi0jZGVmaW5lIHZzdDFxX3AxNl94MihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4OHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gyX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgMzcpOyB9KQotI2RlZmluZSB2c3QxcV9wNjRfeDIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94Ml92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIDM4KTsgfSkKLSNkZWZpbmUgdnN0MV91OF94MihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAxNik7IH0pCi0jZGVmaW5lIHZzdDFfdTE2X3gyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAxNyk7IH0pCi0jZGVmaW5lIHZzdDFfdTMyX3gyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAxOCk7IH0pCi0jZGVmaW5lIHZzdDFfdTY0X3gyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAxOSk7IH0pCi0jZGVmaW5lIHZzdDFfczhfeDIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHg4eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94Ml92KF9fYSwgX19iLnZhbFswXSwgX19iLnZhbFsxXSwgMCk7IH0pCi0jZGVmaW5lIHZzdDFfczE2X3gyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDR4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3gyX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIDEpOyB9KQotI2RlZmluZSB2c3QxX3MzMl94MihfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAyKTsgfSkKLSNkZWZpbmUgdnN0MV9zNjRfeDIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDJfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgMyk7IH0pCi0jZGVmaW5lIHZzdDFfZjE2X3gyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4NHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDJfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgNyk7IH0pCi0jZGVmaW5lIHZzdDFfZjMyX3gyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4MngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDJfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgOCk7IH0pCi0jZGVmaW5lIHZzdDFfZjY0X3gyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MXgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDJfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgOSk7IH0pCi0jZGVmaW5lIHZzdDFfcDhfeDIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4OHgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDJfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgNCk7IH0pCi0jZGVmaW5lIHZzdDFfcDE2X3gyKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCA1KTsgfSkKLSNkZWZpbmUgdnN0MV9wNjRfeDIoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDF4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3gyX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIDYpOyB9KQotCi0jZGVmaW5lIHZzdDFxX3U4X3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ4eDE2eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDNfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIDQ4KTsgfSkKLSNkZWZpbmUgdnN0MXFfdTE2X3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDNfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIDQ5KTsgfSkKLSNkZWZpbmUgdnN0MXFfdTMyX3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDNfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIDUwKTsgfSkKLSNkZWZpbmUgdnN0MXFfdTY0X3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDNfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIDUxKTsgfSkKLSNkZWZpbmUgdnN0MXFfczhfeDMoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gzX3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCAzMik7IH0pCi0jZGVmaW5lIHZzdDFxX3MxNl94MyhfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDNfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIDMzKTsgfSkKLSNkZWZpbmUgdnN0MXFfczMyX3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDR4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94M192KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgMzQpOyB9KQotI2RlZmluZSB2c3QxcV9zNjRfeDMoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gzX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAzNSk7IH0pCi0jZGVmaW5lIHZzdDFxX2YxNl94MyhfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDh4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94M192KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgMzkpOyB9KQotI2RlZmluZSB2c3QxcV9mMzJfeDMoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDNfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIDQwKTsgfSkKLSNkZWZpbmUgdnN0MXFfZjY0X3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3gzX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCA0MSk7IH0pCi0jZGVmaW5lIHZzdDFxX3A4X3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDNfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIDM2KTsgfSkKLSNkZWZpbmUgdnN0MXFfcDE2X3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHkxNng4eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDNfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIDM3KTsgfSkKLSNkZWZpbmUgdnN0MXFfcDY0X3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgyeDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDNfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIDM4KTsgfSkKLSNkZWZpbmUgdnN0MV91OF94MyhfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94M192KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgMTYpOyB9KQotI2RlZmluZSB2c3QxX3UxNl94MyhfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDNfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIDE3KTsgfSkKLSNkZWZpbmUgdnN0MV91MzJfeDMoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDJ4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3gzX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAxOCk7IH0pCi0jZGVmaW5lIHZzdDFfdTY0X3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94M192KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgMTkpOyB9KQotI2RlZmluZSB2c3QxX3M4X3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4OHgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDNfdihfX2EsIF9fYi52YWxbMF0sIF9fYi52YWxbMV0sIF9fYi52YWxbMl0sIDApOyB9KQotI2RlZmluZSB2c3QxX3MxNl94MyhfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94M192KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgMSk7IH0pCi0jZGVmaW5lIHZzdDFfczMyX3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJ4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3gzX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAyKTsgfSkKLSNkZWZpbmUgdnN0MV9zNjRfeDMoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDNfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIDMpOyB9KQotI2RlZmluZSB2c3QxX2YxNl94MyhfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDR4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3gzX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCA3KTsgfSkKLSNkZWZpbmUgdnN0MV9mMzJfeDMoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyeDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94M192KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgOCk7IH0pCi0jZGVmaW5lIHZzdDFfZjY0X3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MXgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDNfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIDkpOyB9KQotI2RlZmluZSB2c3QxX3A4X3gzKF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDh4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3gzX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCA0KTsgfSkKLSNkZWZpbmUgdnN0MV9wMTZfeDMoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDR4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3gzX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCA1KTsgfSkKLSNkZWZpbmUgdnN0MV9wNjRfeDMoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDF4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3gzX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCA2KTsgfSkKLQotI2RlZmluZSB2c3QxcV91OF94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHgxNng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3g0X3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIDQ4KTsgfSkKLSNkZWZpbmUgdnN0MXFfdTE2X3g0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDRfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgNDkpOyB9KQotI2RlZmluZSB2c3QxcV91MzJfeDQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDR4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94NF92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCA1MCk7IH0pCi0jZGVmaW5lIHZzdDFxX3U2NF94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Mng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3g0X3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIDUxKTsgfSkKLSNkZWZpbmUgdnN0MXFfczhfeDQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3g0X3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCBfX2IudmFsWzNdLCAzMik7IH0pCi0jZGVmaW5lIHZzdDFxX3MxNl94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDRfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgMzMpOyB9KQotI2RlZmluZSB2c3QxcV9zMzJfeDQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3g0X3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIDM0KTsgfSkKLSNkZWZpbmUgdnN0MXFfczY0X3g0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94NF92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCAzNSk7IH0pCi0jZGVmaW5lIHZzdDFxX2YxNl94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDh4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94NF92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCAzOSk7IH0pCi0jZGVmaW5lIHZzdDFxX2YzMl94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDR4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94NF92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCA0MCk7IH0pCi0jZGVmaW5lIHZzdDFxX2Y2NF94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94NF92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCA0MSk7IH0pCi0jZGVmaW5lIHZzdDFxX3A4X3g0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MXFfeDRfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgMzYpOyB9KQotI2RlZmluZSB2c3QxcV9wMTZfeDQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDh4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxcV94NF92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCAzNyk7IH0pCi0jZGVmaW5lIHZzdDFxX3A2NF94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4Mng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFxX3g0X3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIDM4KTsgfSkKLSNkZWZpbmUgdnN0MV91OF94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHg4eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94NF92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIDE2KTsgfSkKLSNkZWZpbmUgdnN0MV91MTZfeDQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDR4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3g0X3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgMTcpOyB9KQotI2RlZmluZSB2c3QxX3UzMl94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Mng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCAxOCk7IH0pCi0jZGVmaW5lIHZzdDFfdTY0X3g0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94NF92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIDE5KTsgfSkKLSNkZWZpbmUgdnN0MV9zOF94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDh4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3g0X3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCBfX2IudmFsWzNdLCAwKTsgfSkKLSNkZWZpbmUgdnN0MV9zMTZfeDQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCAxKTsgfSkKLSNkZWZpbmUgdnN0MV9zMzJfeDQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Mng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCAyKTsgfSkKLSNkZWZpbmUgdnN0MV9zNjRfeDQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCAzKTsgfSkKLSNkZWZpbmUgdnN0MV9mMTZfeDQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng0eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94NF92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIDcpOyB9KQotI2RlZmluZSB2c3QxX2YzMl94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3g0X3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgOCk7IH0pCi0jZGVmaW5lIHZzdDFfZjY0X3g0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MXg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCA5KTsgfSkKLSNkZWZpbmUgdnN0MV9wOF94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHg4eDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MV94NF92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIDQpOyB9KQotI2RlZmluZSB2c3QxX3AxNl94NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4NHg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDFfeDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCA1KTsgfSkKLSNkZWZpbmUgdnN0MV9wNjRfeDQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDF4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QxX3g0X3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgNik7IH0pCi0KLSNkZWZpbmUgdnN0MnFfdTY0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MnFfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCA1MSk7IH0pCi0jZGVmaW5lIHZzdDJxX3M2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MnFfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAzNSk7IH0pCi0jZGVmaW5lIHZzdDJxX2Y2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QycV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIDQxKTsgfSkKLSNkZWZpbmUgdnN0Ml9mNjQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgxeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCA5KTsgfSkKLSNkZWZpbmUgdnN0Ml9wNjQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDF4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QyX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIDYpOyB9KQotI2RlZmluZSB2c3QycV9wNjQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QycV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIDM4KTsgfSkKLQotI2RlZmluZSB2c3QycV9sYW5lX3U4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QycV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgX19jLCA0OCk7IH0pCi0jZGVmaW5lIHZzdDJxX2xhbmVfdTY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QycV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgX19jLCA1MSk7IH0pCi0jZGVmaW5lIHZzdDJxX2xhbmVfczgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDE2eDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0MnFfbGFuZV92KF9fYSwgX19iLnZhbFswXSwgX19iLnZhbFsxXSwgX19jLCAzMik7IH0pCi0jZGVmaW5lIHZzdDJxX2xhbmVfczY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCBfX2MsIDM1KTsgfSkKLSNkZWZpbmUgdnN0MnFfbGFuZV9mNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJ4Ml90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QycV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgX19jLCA0MSk7IH0pCi0jZGVmaW5lIHZzdDJxX2xhbmVfcDgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHgxNngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCBfX2MsIDM2KTsgfSkKLSNkZWZpbmUgdnN0MnFfbGFuZV9wNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MngyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCBfX2MsIDM4KTsgfSkKLSNkZWZpbmUgdnN0Ml9sYW5lX3U2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIF9fYywgMTkpOyB9KQotI2RlZmluZSB2c3QyX2xhbmVfczY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCBfX2MsIDMpOyB9KQotI2RlZmluZSB2c3QyX2xhbmVfZjY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgxeDJfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0Ml9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIF9fYywgOSk7IH0pCi0jZGVmaW5lIHZzdDJfbGFuZV9wNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MXgyX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDJfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCBfX2MsIDYpOyB9KQotCi0jZGVmaW5lIHZzdDNxX3U2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4MngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCA1MSk7IH0pCi0jZGVmaW5lIHZzdDNxX3M2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyeDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M3FfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIDM1KTsgfSkKLSNkZWZpbmUgdnN0M3FfZjY0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCA0MSk7IH0pCi0jZGVmaW5lIHZzdDNfZjY0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MXgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIDkpOyB9KQotI2RlZmluZSB2c3QzX3A2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MXgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIDYpOyB9KQotI2RlZmluZSB2c3QzcV9wNjQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDJ4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzcV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgMzgpOyB9KQotCi0jZGVmaW5lIHZzdDNxX2xhbmVfdTgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHgxNngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgNDgpOyB9KQotI2RlZmluZSB2c3QzcV9sYW5lX3U2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M3FfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgX19jLCA1MSk7IH0pCi0jZGVmaW5lIHZzdDNxX2xhbmVfczgoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDE2eDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M3FfbGFuZV92KF9fYSwgX19iLnZhbFswXSwgX19iLnZhbFsxXSwgX19iLnZhbFsyXSwgX19jLCAzMik7IH0pCi0jZGVmaW5lIHZzdDNxX2xhbmVfczY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgMzUpOyB9KQotI2RlZmluZSB2c3QzcV9sYW5lX2Y2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgNDEpOyB9KQotI2RlZmluZSB2c3QzcV9sYW5lX3A4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4MTZ4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzcV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCBfX2MsIDM2KTsgfSkKLSNkZWZpbmUgdnN0M3FfbGFuZV9wNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MngzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNxX2xhbmVfdihfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIF9fYywgMzgpOyB9KQotI2RlZmluZSB2c3QzX2xhbmVfdTY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDF4M190IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3QzX2xhbmVfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIF9fYywgMTkpOyB9KQotI2RlZmluZSB2c3QzX2xhbmVfczY0KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4MXgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgX19jLCAzKTsgfSkKLSNkZWZpbmUgdnN0M19sYW5lX2Y2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MXgzX3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDNfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgX19jLCA5KTsgfSkKLSNkZWZpbmUgdnN0M19sYW5lX3A2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxeDNfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0M19sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCBfX2MsIDYpOyB9KQotCi0jZGVmaW5lIHZzdDRxX3U2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Mng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIDUxKTsgfSkKLSNkZWZpbmUgdnN0NHFfczY0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0cV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCAzNSk7IH0pCi0jZGVmaW5lIHZzdDRxX2Y2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0cV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCA0MSk7IH0pCi0jZGVmaW5lIHZzdDRfZjY0KF9fYSwgYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MXg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRfdihfX2EsIChpbnQ4eDhfdClfX2IudmFsWzBdLCAoaW50OHg4X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2IudmFsWzNdLCA5KTsgfSkKLSNkZWZpbmUgdnN0NF9wNjQoX19hLCBiKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDF4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0X3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgNik7IH0pCi0jZGVmaW5lIHZzdDRxX3A2NChfX2EsIGIpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4Mng0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRxX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIDM4KTsgfSkKLQotI2RlZmluZSB2c3Q0cV9sYW5lX3U4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgNDgpOyB9KQotI2RlZmluZSB2c3Q0cV9sYW5lX3U2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyeDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NHFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCBfX2MsIDUxKTsgfSkKLSNkZWZpbmUgdnN0NHFfbGFuZV9zOChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDh4MTZ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCBfX2IudmFsWzNdLCBfX2MsIDMyKTsgfSkKLSNkZWZpbmUgdnN0NHFfbGFuZV9zNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyeDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NHFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCBfX2MsIDM1KTsgfSkKLSNkZWZpbmUgdnN0NHFfbGFuZV9mNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgNDEpOyB9KQotI2RlZmluZSB2c3Q0cV9sYW5lX3A4KF9fYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTh4MTZ4NF90IF9fYiA9IChiKTsgXAotICBfX2J1aWx0aW5fbmVvbl92c3Q0cV9sYW5lX3YoX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIF9fYywgMzYpOyB9KQotI2RlZmluZSB2c3Q0cV9sYW5lX3A2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgyeDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NHFfbGFuZV92KF9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCBfX2MsIDM4KTsgfSkKLSNkZWZpbmUgdnN0NF9sYW5lX3U2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgxeDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NF9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgX19jLCAxOSk7IH0pCi0jZGVmaW5lIHZzdDRfbGFuZV9zNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgxeDRfdCBfX2IgPSAoYik7IFwKLSAgX19idWlsdGluX25lb25fdnN0NF9sYW5lX3YoX19hLCAoaW50OHg4X3QpX19iLnZhbFswXSwgKGludDh4OF90KV9fYi52YWxbMV0sIChpbnQ4eDhfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19iLnZhbFszXSwgX19jLCAzKTsgfSkKLSNkZWZpbmUgdnN0NF9sYW5lX2Y2NChfX2EsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MXg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIF9fYywgOSk7IH0pCi0jZGVmaW5lIHZzdDRfbGFuZV9wNjQoX19hLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4MXg0X3QgX19iID0gKGIpOyBcCi0gIF9fYnVpbHRpbl9uZW9uX3ZzdDRfbGFuZV92KF9fYSwgKGludDh4OF90KV9fYi52YWxbMF0sIChpbnQ4eDhfdClfX2IudmFsWzFdLCAoaW50OHg4X3QpX19iLnZhbFsyXSwgKGludDh4OF90KV9fYi52YWxbM10sIF9fYywgNik7IH0pCi0KLV9fYWkgZmxvYXQ2NHgxX3QgdnN1Yl9mNjQoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAtIF9fYjsgfQotX19haSBmbG9hdDY0eDJfdCB2c3VicV9mNjQoZmxvYXQ2NHgyX3QgX19hLCBmbG9hdDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAtIF9fYjsgfQotCi1fX2FpIGludDh4OF90IHZ1cWFkZF9zOChpbnQ4eDhfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3Z1cWFkZF92KF9fYSwgX19iLCAwKTsgfQotX19haSBpbnQxNng0X3QgdnVxYWRkX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4NF90KV9fYnVpbHRpbl9uZW9uX3Z1cWFkZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDEpOyB9Ci1fX2FpIGludDMyeDJfdCB2dXFhZGRfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQzMngyX3QpX19idWlsdGluX25lb25fdnVxYWRkX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMik7IH0KLV9fYWkgaW50NjR4MV90IHZ1cWFkZF9zNjQoaW50NjR4MV90IF9fYSwgaW50NjR4MV90IF9fYikgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92dXFhZGRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAzKTsgfQotX19haSBpbnQ4eDE2X3QgdnVxYWRkcV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3Z1cWFkZHFfdihfX2EsIF9fYiwgMzIpOyB9Ci1fX2FpIGludDE2eDhfdCB2dXFhZGRxX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiAoaW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3Z1cWFkZHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDMzKTsgfQotX19haSBpbnQzMng0X3QgdnVxYWRkcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKGludDMyeDRfdClfX2J1aWx0aW5fbmVvbl92dXFhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAzNCk7IH0KLV9fYWkgaW50NjR4Ml90IHZ1cWFkZHFfczY0KGludDY0eDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ2NHgyX3QpX19idWlsdGluX25lb25fdnVxYWRkcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzUpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZzcWFkZF91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZzcWFkZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE2KTsgfQotX19haSB1aW50MTZ4NF90IHZzcWFkZF91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiAodWludDE2eDRfdClfX2J1aWx0aW5fbmVvbl92c3FhZGRfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAxNyk7IH0KLV9fYWkgdWludDMyeDJfdCB2c3FhZGRfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gKHVpbnQzMngyX3QpX19idWlsdGluX25lb25fdnNxYWRkX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgMTgpOyB9Ci1fX2FpIHVpbnQ2NHgxX3QgdnNxYWRkX3U2NCh1aW50NjR4MV90IF9fYSwgdWludDY0eDFfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZzcWFkZF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIDE5KTsgfQotX19haSB1aW50OHgxNl90IHZzcWFkZHFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92c3FhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OCk7IH0KLV9fYWkgdWludDE2eDhfdCB2c3FhZGRxX3UxNih1aW50MTZ4OF90IF9fYSwgdWludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MTZ4OF90KV9fYnVpbHRpbl9uZW9uX3ZzcWFkZHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDQ5KTsgfQotX19haSB1aW50MzJ4NF90IHZzcWFkZHFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnNxYWRkcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTApOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnNxYWRkcV91NjQodWludDY0eDJfdCBfX2EsIHVpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92c3FhZGRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA1MSk7IH0KLQotX19haSBpbnQxNng4X3QgdmFiYWxfaGlnaF9zOChpbnQxNng4X3QgX19hLCBpbnQ4eDE2X3QgX19iLCBpbnQ4eDE2X3QgX19jKSB7Ci0gIHJldHVybiB2YWJhbF9zOChfX2EsIHZnZXRfaGlnaF9zOChfX2IpLCB2Z2V0X2hpZ2hfczgoX19jKSk7IH0KLV9fYWkgaW50MzJ4NF90IHZhYmFsX2hpZ2hfczE2KGludDMyeDRfdCBfX2EsIGludDE2eDhfdCBfX2IsIGludDE2eDhfdCBfX2MpIHsKLSAgcmV0dXJuIHZhYmFsX3MxNihfX2EsIHZnZXRfaGlnaF9zMTYoX19iKSwgdmdldF9oaWdoX3MxNihfX2MpKTsgfQotX19haSBpbnQ2NHgyX3QgdmFiYWxfaGlnaF9zMzIoaW50NjR4Ml90IF9fYSwgaW50MzJ4NF90IF9fYiwgaW50MzJ4NF90IF9fYykgewotICByZXR1cm4gdmFiYWxfczMyKF9fYSwgdmdldF9oaWdoX3MzMihfX2IpLCB2Z2V0X2hpZ2hfczMyKF9fYykpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmFiYWxfaGlnaF91OCh1aW50MTZ4OF90IF9fYSwgdWludDh4MTZfdCBfX2IsIHVpbnQ4eDE2X3QgX19jKSB7Ci0gIHJldHVybiB2YWJhbF91OChfX2EsIHZnZXRfaGlnaF91OChfX2IpLCB2Z2V0X2hpZ2hfdTgoX19jKSk7IH0KLV9fYWkgdWludDMyeDRfdCB2YWJhbF9oaWdoX3UxNih1aW50MzJ4NF90IF9fYSwgdWludDE2eDhfdCBfX2IsIHVpbnQxNng4X3QgX19jKSB7Ci0gIHJldHVybiB2YWJhbF91MTYoX19hLCB2Z2V0X2hpZ2hfdTE2KF9fYiksIHZnZXRfaGlnaF91MTYoX19jKSk7IH0KLV9fYWkgdWludDY0eDJfdCB2YWJhbF9oaWdoX3UzMih1aW50NjR4Ml90IF9fYSwgdWludDMyeDRfdCBfX2IsIHVpbnQzMng0X3QgX19jKSB7Ci0gIHJldHVybiB2YWJhbF91MzIoX19hLCB2Z2V0X2hpZ2hfdTMyKF9fYiksIHZnZXRfaGlnaF91MzIoX19jKSk7IH0KLQotCi1fX2FpIGludDh4MTZfdCB2YWRkaG5faGlnaF9zMTYoaW50OHg4X3QgX19hLCBpbnQxNng4X3QgX19iLCBpbnQxNng4X3QgX19jKSB7Ci0gIHJldHVybiB2Y29tYmluZV9zOChfX2EsIHZhZGRobl9zMTYoX19iLCBfX2MpKTsgfQotX19haSBpbnQxNng4X3QgdmFkZGhuX2hpZ2hfczMyKGludDE2eDRfdCBfX2EsIGludDMyeDRfdCBfX2IsIGludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuIHZjb21iaW5lX3MxNihfX2EsIHZhZGRobl9zMzIoX19iLCBfX2MpKTsgfQotX19haSBpbnQzMng0X3QgdmFkZGhuX2hpZ2hfczY0KGludDMyeDJfdCBfX2EsIGludDY0eDJfdCBfX2IsIGludDY0eDJfdCBfX2MpIHsKLSAgcmV0dXJuIHZjb21iaW5lX3MzMihfX2EsIHZhZGRobl9zNjQoX19iLCBfX2MpKTsgfQotX19haSB1aW50OHgxNl90IHZhZGRobl9oaWdoX3UxNih1aW50OHg4X3QgX19hLCB1aW50MTZ4OF90IF9fYiwgdWludDE2eDhfdCBfX2MpIHsKLSAgcmV0dXJuIHZjb21iaW5lX3U4KF9fYSwgdmFkZGhuX3UxNihfX2IsIF9fYykpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmFkZGhuX2hpZ2hfdTMyKHVpbnQxNng0X3QgX19hLCB1aW50MzJ4NF90IF9fYiwgdWludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuIHZjb21iaW5lX3UxNihfX2EsIHZhZGRobl91MzIoX19iLCBfX2MpKTsgfQotX19haSB1aW50MzJ4NF90IHZhZGRobl9oaWdoX3U2NCh1aW50MzJ4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IsIHVpbnQ2NHgyX3QgX19jKSB7Ci0gIHJldHVybiB2Y29tYmluZV91MzIoX19hLCB2YWRkaG5fdTY0KF9fYiwgX19jKSk7IH0KLQotX19haSBpbnQxNl90IHZhZGRsdl9zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZhZGRsdl9zOChfX2EpOyB9Ci1fX2FpIGludDMyX3QgdmFkZGx2X3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92YWRkbHZfczE2KF9fYSk7IH0KLV9fYWkgaW50NjRfdCB2YWRkbHZfczMyKGludDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZhZGRsdl9zMzIoX19hKTsgfQotX19haSB1aW50MTZfdCB2YWRkbHZfdTgodWludDh4OF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZhZGRsdl91OCgoaW50OHg4X3QpX19hKTsgfQotX19haSB1aW50MzJfdCB2YWRkbHZfdTE2KHVpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdmFkZGx2X3UxNigoaW50MTZ4NF90KV9fYSk7IH0KLV9fYWkgdWludDY0X3QgdmFkZGx2X3UzMih1aW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZhZGRsdl91MzIoKGludDMyeDJfdClfX2EpOyB9Ci1fX2FpIGludDE2X3QgdmFkZGx2cV9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZfdClfX2J1aWx0aW5fbmVvbl92YWRkbHZxX3M4KF9fYSk7IH0KLV9fYWkgaW50MzJfdCB2YWRkbHZxX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92YWRkbHZxX3MxNihfX2EpOyB9Ci1fX2FpIGludDY0X3QgdmFkZGx2cV9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDY0X3QpX19idWlsdGluX25lb25fdmFkZGx2cV9zMzIoX19hKTsgfQotX19haSB1aW50MTZfdCB2YWRkbHZxX3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2X3QpX19idWlsdGluX25lb25fdmFkZGx2cV91OCgoaW50OHgxNl90KV9fYSk7IH0KLV9fYWkgdWludDMyX3QgdmFkZGx2cV91MTYodWludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MzJfdClfX2J1aWx0aW5fbmVvbl92YWRkbHZxX3UxNigoaW50MTZ4OF90KV9fYSk7IH0KLV9fYWkgdWludDY0X3QgdmFkZGx2cV91MzIodWludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50NjRfdClfX2J1aWx0aW5fbmVvbl92YWRkbHZxX3UzMigoaW50MzJ4NF90KV9fYSk7IH0KLQotX19haSBpbnQxNng4X3QgdmFkZGxfaGlnaF9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiB2bW92bF9oaWdoX3M4KF9fYSkgKyB2bW92bF9oaWdoX3M4KF9fYik7IH0KLV9fYWkgaW50MzJ4NF90IHZhZGRsX2hpZ2hfczE2KGludDE2eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIHZtb3ZsX2hpZ2hfczE2KF9fYSkgKyB2bW92bF9oaWdoX3MxNihfX2IpOyB9Ci1fX2FpIGludDY0eDJfdCB2YWRkbF9oaWdoX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiB2bW92bF9oaWdoX3MzMihfX2EpICsgdm1vdmxfaGlnaF9zMzIoX19iKTsgfQotX19haSB1aW50MTZ4OF90IHZhZGRsX2hpZ2hfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiB2bW92bF9oaWdoX3U4KF9fYSkgKyB2bW92bF9oaWdoX3U4KF9fYik7IH0KLV9fYWkgdWludDMyeDRfdCB2YWRkbF9oaWdoX3UxNih1aW50MTZ4OF90IF9fYSwgdWludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIHZtb3ZsX2hpZ2hfdTE2KF9fYSkgKyB2bW92bF9oaWdoX3UxNihfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdmFkZGxfaGlnaF91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiB2bW92bF9oaWdoX3UzMihfX2EpICsgdm1vdmxfaGlnaF91MzIoX19iKTsgfQotCi1fX2FpIGludDhfdCB2YWRkdl9zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4X3QpX19idWlsdGluX25lb25fdmFkZHZfczgoX19hKTsgfQotX19haSBpbnQxNl90IHZhZGR2X3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZfdClfX2J1aWx0aW5fbmVvbl92YWRkdl9zMTYoX19hKTsgfQotX19haSBpbnQzMl90IHZhZGR2X3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92YWRkdl9zMzIoX19hKTsgfQotX19haSBmbG9hdDMyX3QgdmFkZHZfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92YWRkdl9mMzIoX19hKTsgfQotX19haSB1aW50OF90IHZhZGR2X3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OF90KV9fYnVpbHRpbl9uZW9uX3ZhZGR2X3U4KChpbnQ4eDhfdClfX2EpOyB9Ci1fX2FpIHVpbnQxNl90IHZhZGR2X3UxNih1aW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZhZGR2X3UxNigoaW50MTZ4NF90KV9fYSk7IH0KLV9fYWkgdWludDMyX3QgdmFkZHZfdTMyKHVpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdmFkZHZfdTMyKChpbnQzMngyX3QpX19hKTsgfQotX19haSBpbnQ4X3QgdmFkZHZxX3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4X3QpX19idWlsdGluX25lb25fdmFkZHZxX3M4KF9fYSk7IH0KLV9fYWkgaW50MTZfdCB2YWRkdnFfczE2KGludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZhZGR2cV9zMTYoX19hKTsgfQotX19haSBpbnQzMl90IHZhZGR2cV9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyX3QpX19idWlsdGluX25lb25fdmFkZHZxX3MzMihfX2EpOyB9Ci1fX2FpIHVpbnQ4X3QgdmFkZHZxX3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAodWludDhfdClfX2J1aWx0aW5fbmVvbl92YWRkdnFfdTgoKGludDh4MTZfdClfX2EpOyB9Ci1fX2FpIHVpbnQxNl90IHZhZGR2cV91MTYodWludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZfdClfX2J1aWx0aW5fbmVvbl92YWRkdnFfdTE2KChpbnQxNng4X3QpX19hKTsgfQotX19haSB1aW50MzJfdCB2YWRkdnFfdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdmFkZHZxX3UzMigoaW50MzJ4NF90KV9fYSk7IH0KLV9fYWkgZmxvYXQzMl90IHZhZGR2cV9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMl90KV9fYnVpbHRpbl9uZW9uX3ZhZGR2cV9mMzIoX19hKTsgfQotX19haSBmbG9hdDY0X3QgdmFkZHZxX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdmFkZHZxX2Y2NChfX2EpOyB9Ci1fX2FpIGludDY0X3QgdmFkZHZxX3M2NChpbnQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50NjRfdClfX2J1aWx0aW5fbmVvbl92YWRkdnFfczY0KF9fYSk7IH0KLV9fYWkgdWludDY0X3QgdmFkZHZxX3U2NCh1aW50NjR4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZhZGR2cV91NjQoKGludDY0eDJfdClfX2EpOyB9Ci0KLV9fYWkgaW50MTZ4OF90IHZhZGR3X2hpZ2hfczgoaW50MTZ4OF90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19hICsgdm1vdmxfaGlnaF9zOChfX2IpOyB9Ci1fX2FpIGludDMyeDRfdCB2YWRkd19oaWdoX3MxNihpbnQzMng0X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKyB2bW92bF9oaWdoX3MxNihfX2IpOyB9Ci1fX2FpIGludDY0eDJfdCB2YWRkd19oaWdoX3MzMihpbnQ2NHgyX3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgKyB2bW92bF9oaWdoX3MzMihfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdmFkZHdfaGlnaF91OCh1aW50MTZ4OF90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSArIHZtb3ZsX2hpZ2hfdTgoX19iKTsgfQotX19haSB1aW50MzJ4NF90IHZhZGR3X2hpZ2hfdTE2KHVpbnQzMng0X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19hICsgdm1vdmxfaGlnaF91MTYoX19iKTsgfQotX19haSB1aW50NjR4Ml90IHZhZGR3X2hpZ2hfdTMyKHVpbnQ2NHgyX3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hICsgdm1vdmxfaGlnaF91MzIoX19iKTsgfQotCi1fX2FpIGZsb2F0MzJ4Ml90IHZjdnR4X2YzMl9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMngyX3QpX19idWlsdGluX25lb25fdmN2dHhfZjMyX3YoKGludDh4MTZfdClfX2EsIDQxKTsgfQotCi1fX2FpIGZsb2F0MzJ4NF90IHZjdnR4X2hpZ2hfZjMyX2Y2NChmbG9hdDMyeDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICBmbG9hdDMyeDJfdCBfX2ExID0gdmN2dHhfZjMyX2Y2NChfX2IpOwotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2ExLCAwLCAxLCAyLCAzKTsgfQotCi1fX2FpIGZsb2F0MzJ4Ml90IHZjdnRfZjMyX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0X2YzMl9mNjQoKGludDh4MTZfdClfX2EsIDQxKTsgfQotCi1fX2FpIGZsb2F0NjR4MV90IHZjdnRfZjY0X3M2NChpbnQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NHgxX3QpX19idWlsdGluX25lb25fdmN2dF9mNjRfdigoaW50OHg4X3QpX19hLCAzKTsgfQotX19haSBmbG9hdDY0eDFfdCB2Y3Z0X2Y2NF91NjQodWludDY0eDFfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y3Z0X2Y2NF92KChpbnQ4eDhfdClfX2EsIDE5KTsgfQotX19haSBmbG9hdDY0eDJfdCB2Y3Z0cV9mNjRfczY0KGludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cV9mNjRfdigoaW50OHgxNl90KV9fYSwgMzUpOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZjdnRxX2Y2NF91NjQodWludDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cV9mNjRfdigoaW50OHgxNl90KV9fYSwgNTEpOyB9Ci0KLV9fYWkgZmxvYXQ2NHgyX3QgdmN2dF9mNjRfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0NjR4Ml90KV9fYnVpbHRpbl9uZW9uX3ZjdnRfZjY0X2YzMigoaW50OHg4X3QpX19hLCA0MSk7IH0KLQotX19haSBmbG9hdDE2eDhfdCB2Y3Z0X2hpZ2hfZjE2X2YzMihmbG9hdDE2eDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICBmbG9hdDE2eDRfdCBfX2ExID0gdmN2dF9mMTZfZjMyKF9fYik7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcpOyB9Ci0KLV9fYWkgZmxvYXQzMng0X3QgdmN2dF9oaWdoX2YzMl9mMTYoZmxvYXQxNng4X3QgX19hKSB7Ci0gIGZsb2F0MTZ4NF90IF9fYTEgPSB2Z2V0X2hpZ2hfZjE2KF9fYSk7Ci0gIHJldHVybiB2Y3Z0X2YzMl9mMTYoX19hMSk7IH0KLQotX19haSBmbG9hdDMyeDRfdCB2Y3Z0X2hpZ2hfZjMyX2Y2NChmbG9hdDMyeDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICBmbG9hdDMyeDJfdCBfX2ExID0gdmN2dF9mMzJfZjY0KF9fYik7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYTEsIDAsIDEsIDIsIDMpOyB9Ci0KLV9fYWkgZmxvYXQ2NHgyX3QgdmN2dF9oaWdoX2Y2NF9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIGZsb2F0MzJ4Ml90IF9fYTEgPSB2Z2V0X2hpZ2hfZjMyKF9fYSk7Ci0gIHJldHVybiB2Y3Z0X2Y2NF9mMzIoX19hMSk7IH0KLQotX19haSBpbnQ2NHgxX3QgdmN2dF9zNjRfZjY0KGZsb2F0NjR4MV90IF9fYSkgewotICByZXR1cm4gKGludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y3Z0X3M2NF92KChpbnQ4eDhfdClfX2EsIDMpOyB9Ci1fX2FpIGludDY0eDJfdCB2Y3Z0cV9zNjRfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gKGludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cV9zNjRfdigoaW50OHgxNl90KV9fYSwgMzUpOyB9Ci0KLV9fYWkgdWludDY0eDFfdCB2Y3Z0X3U2NF9mNjQoZmxvYXQ2NHgxX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDFfdClfX2J1aWx0aW5fbmVvbl92Y3Z0X3U2NF92KChpbnQ4eDhfdClfX2EsIDE5KTsgfQotX19haSB1aW50NjR4Ml90IHZjdnRxX3U2NF9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Y3Z0cV91NjRfdigoaW50OHgxNl90KV9fYSwgNTEpOyB9Ci0KLSNkZWZpbmUgdmR1cF9sYW5lX2YxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDRfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBfbGFuZV9mNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgxX3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwcV9sYW5lX2YxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDE2eDRfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHFfbGFuZV9mNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgxX3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBfbGFuZV9wNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDFfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVfcDY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxX3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYik7IH0pCi0KLSNkZWZpbmUgdmR1cF9sYW5lcV9zOChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ4eDE2X3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBfbGFuZXFfczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBfbGFuZXFfczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cF9sYW5lcV9zNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Ml90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cF9sYW5lcV9wOChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5OHgxNl90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwX2xhbmVxX3AxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5MTZ4OF90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cF9sYW5lcV91OChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50OHgxNl90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwX2xhbmVxX3UxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OF90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cF9sYW5lcV91MzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cF9sYW5lcV91NjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBfbGFuZXFfZjE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MTZ4OF90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cF9sYW5lcV9mMzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0X3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBfbGFuZXFfZjY0KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4Ml90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHFfbGFuZXFfczgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50OHgxNl90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHFfbGFuZXFfczE2KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHFfbGFuZXFfczMyKGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVxX3M2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVxX3A4KGEsIF9fYikgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk4eDE2X3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwcV9sYW5lcV9wMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTE2eDhfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cHFfbGFuZXFfdTgoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDh4MTZfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVxX3UxNihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OF90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwcV9sYW5lcV91MzIoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVxX3U2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Ml90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IpOyB9KQotI2RlZmluZSB2ZHVwcV9sYW5lcV9mMTYoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQxNng4X3QgX19hID0gKGEpOyBcCi0gIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVxX2YzMihhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDRfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iLCBfX2IsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVxX2Y2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYiwgX19iKTsgfSkKLSNkZWZpbmUgdmR1cF9sYW5lcV9wNjQoYSwgX19iKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgcG9seTY0eDJfdCBfX2EgPSAoYSk7IFwKLSAgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIF9fYik7IH0pCi0jZGVmaW5lIHZkdXBxX2xhbmVxX3A2NChhLCBfX2IpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBwb2x5NjR4Ml90IF9fYSA9IChhKTsgXAotICBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgX19iLCBfX2IpOyB9KQotCi0jZGVmaW5lIHZleHRfZjY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MV90IF9fYSA9IChhKTsgZmxvYXQ2NHgxX3QgX19iID0gKGIpOyBcCi0gIChmbG9hdDY0eDFfdClfX2J1aWx0aW5fbmVvbl92ZXh0X3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCA5KTsgfSkKLSNkZWZpbmUgdmV4dHFfZjY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4Ml90IF9fYSA9IChhKTsgZmxvYXQ2NHgyX3QgX19iID0gKGIpOyBcCi0gIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92ZXh0cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCA0MSk7IH0pCi0jZGVmaW5lIHZleHRfcDY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgxX3QgX19hID0gKGEpOyBwb2x5NjR4MV90IF9fYiA9IChiKTsgXAotICAocG9seTY0eDFfdClfX2J1aWx0aW5fbmVvbl92ZXh0X3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgX19jLCA2KTsgfSkKLSNkZWZpbmUgdmV4dHFfcDY0KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHBvbHk2NHgyX3QgX19hID0gKGEpOyBwb2x5NjR4Ml90IF9fYiA9IChiKTsgXAotICAocG9seTY0eDJfdClfX2J1aWx0aW5fbmVvbl92ZXh0cV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgX19jLCAzOCk7IH0pCi0KLSNkZWZpbmUgdmZtYV9sYW5lX2YzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4Ml90IF9fYiA9IChiKTsgZmxvYXQzMngyX3QgX19jID0gKGMpOyBcCi0gIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92Zm1hX2xhbmVfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAoaW50OHg4X3QpX19jLCBfX2QsIDgpOyB9KQotI2RlZmluZSB2Zm1hX2xhbmVfZjY0KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MV90IF9fYSA9IChhKTsgZmxvYXQ2NHgxX3QgX19iID0gKGIpOyBmbG9hdDY0eDFfdCBfX2MgPSAoYyk7IFwKLSAgKGZsb2F0NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZmbWFfbGFuZV92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDhfdClfX2IsIChpbnQ4eDhfdClfX2MsIF9fZCwgOSk7IH0pCi0jZGVmaW5lIHZmbWFxX2xhbmVfZjMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NF90IF9fYSA9IChhKTsgZmxvYXQzMng0X3QgX19iID0gKGIpOyBmbG9hdDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZmbWFxX2xhbmVfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDhfdClfX2MsIF9fZCwgNDApOyB9KQotI2RlZmluZSB2Zm1hcV9sYW5lX2Y2NChhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJfdCBfX2EgPSAoYSk7IGZsb2F0NjR4Ml90IF9fYiA9IChiKTsgZmxvYXQ2NHgxX3QgX19jID0gKGMpOyBcCi0gIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Zm1hcV9sYW5lX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAoaW50OHg4X3QpX19jLCBfX2QsIDQxKTsgfSkKLQotI2RlZmluZSB2Zm1hX2xhbmVxX2YzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4Ml90IF9fYiA9IChiKTsgZmxvYXQzMng0X3QgX19jID0gKGMpOyBcCi0gIChmbG9hdDMyeDJfdClfX2J1aWx0aW5fbmVvbl92Zm1hX2xhbmVxX3YoKGludDh4OF90KV9fYSwgKGludDh4OF90KV9fYiwgKGludDh4MTZfdClfX2MsIF9fZCwgOCk7IH0pCi0jZGVmaW5lIHZmbWFfbGFuZXFfZjY0KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MV90IF9fYSA9IChhKTsgZmxvYXQ2NHgxX3QgX19iID0gKGIpOyBmbG9hdDY0eDJfdCBfX2MgPSAoYyk7IFwKLSAgKGZsb2F0NjR4MV90KV9fYnVpbHRpbl9uZW9uX3ZmbWFfbGFuZXFfdigoaW50OHg4X3QpX19hLCAoaW50OHg4X3QpX19iLCAoaW50OHgxNl90KV9fYywgX19kLCA5KTsgfSkKLSNkZWZpbmUgdmZtYXFfbGFuZXFfZjMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NF90IF9fYSA9IChhKTsgZmxvYXQzMng0X3QgX19iID0gKGIpOyBmbG9hdDMyeDRfdCBfX2MgPSAoYyk7IFwKLSAgKGZsb2F0MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZmbWFxX2xhbmVxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAoaW50OHgxNl90KV9fYywgX19kLCA0MCk7IH0pCi0jZGVmaW5lIHZmbWFxX2xhbmVxX2Y2NChhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJfdCBfX2EgPSAoYSk7IGZsb2F0NjR4Ml90IF9fYiA9IChiKTsgZmxvYXQ2NHgyX3QgX19jID0gKGMpOyBcCi0gIChmbG9hdDY0eDJfdClfX2J1aWx0aW5fbmVvbl92Zm1hcV9sYW5lcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgKGludDh4MTZfdClfX2MsIF9fZCwgNDEpOyB9KQotCi0jZGVmaW5lIHZmbXNfbGFuZV9mMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyX3QgX19hID0gKGEpOyBmbG9hdDMyeDJfdCBfX2IgPSAoYik7IGZsb2F0MzJ4Ml90IF9fYyA9IChjKTsgXAotICBmbG9hdDMyeDJfdCBfX2ExID0gX19hOyBcCi0gIGZsb2F0MzJ4Ml90IF9fYjEgPSBfX2I7IFwKLSAgZmxvYXQzMngyX3QgX19jMSA9IF9fYzsgXAotICB2Zm1hX2xhbmVfZjMyKF9fYTEsIF9fYjEsIC1fX2MxLCBfX2QpOyB9KQotI2RlZmluZSB2Zm1zX2xhbmVfZjY0KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0NjR4MV90IF9fYSA9IChhKTsgZmxvYXQ2NHgxX3QgX19iID0gKGIpOyBmbG9hdDY0eDFfdCBfX2MgPSAoYyk7IFwKLSAgZmxvYXQ2NHgxX3QgX19hMSA9IF9fYTsgXAotICBmbG9hdDY0eDFfdCBfX2IxID0gX19iOyBcCi0gIGZsb2F0NjR4MV90IF9fYzEgPSBfX2M7IFwKLSAgdmZtYV9sYW5lX2Y2NChfX2ExLCBfX2IxLCAtX19jMSwgX19kKTsgfSkKLSNkZWZpbmUgdmZtc3FfbGFuZV9mMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0X3QgX19hID0gKGEpOyBmbG9hdDMyeDRfdCBfX2IgPSAoYik7IGZsb2F0MzJ4Ml90IF9fYyA9IChjKTsgXAotICBmbG9hdDMyeDRfdCBfX2ExID0gX19hOyBcCi0gIGZsb2F0MzJ4NF90IF9fYjEgPSBfX2I7IFwKLSAgZmxvYXQzMngyX3QgX19jMSA9IF9fYzsgXAotICB2Zm1hcV9sYW5lX2YzMihfX2ExLCBfX2IxLCAtX19jMSwgX19kKTsgfSkKLSNkZWZpbmUgdmZtc3FfbGFuZV9mNjQoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyX3QgX19hID0gKGEpOyBmbG9hdDY0eDJfdCBfX2IgPSAoYik7IGZsb2F0NjR4MV90IF9fYyA9IChjKTsgXAotICBmbG9hdDY0eDJfdCBfX2ExID0gX19hOyBcCi0gIGZsb2F0NjR4Ml90IF9fYjEgPSBfX2I7IFwKLSAgZmxvYXQ2NHgxX3QgX19jMSA9IF9fYzsgXAotICB2Zm1hcV9sYW5lX2Y2NChfX2ExLCBfX2IxLCAtX19jMSwgX19kKTsgfSkKLQotI2RlZmluZSB2Zm1zX2xhbmVxX2YzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4Ml90IF9fYiA9IChiKTsgZmxvYXQzMng0X3QgX19jID0gKGMpOyBcCi0gIGZsb2F0MzJ4Ml90IF9fYTEgPSBfX2E7IFwKLSAgZmxvYXQzMngyX3QgX19iMSA9IF9fYjsgXAotICBmbG9hdDMyeDRfdCBfX2MxID0gX19jOyBcCi0gIHZmbWFfbGFuZXFfZjMyKF9fYTEsIF9fYjEsIC1fX2MxLCBfX2QpOyB9KQotI2RlZmluZSB2Zm1zX2xhbmVxX2Y2NChhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDFfdCBfX2EgPSAoYSk7IGZsb2F0NjR4MV90IF9fYiA9IChiKTsgZmxvYXQ2NHgyX3QgX19jID0gKGMpOyBcCi0gIGZsb2F0NjR4MV90IF9fYTEgPSBfX2E7IFwKLSAgZmxvYXQ2NHgxX3QgX19iMSA9IF9fYjsgXAotICBmbG9hdDY0eDJfdCBfX2MxID0gX19jOyBcCi0gIHZmbWFfbGFuZXFfZjY0KF9fYTEsIF9fYjEsIC1fX2MxLCBfX2QpOyB9KQotI2RlZmluZSB2Zm1zcV9sYW5lcV9mMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMng0X3QgX19hID0gKGEpOyBmbG9hdDMyeDRfdCBfX2IgPSAoYik7IGZsb2F0MzJ4NF90IF9fYyA9IChjKTsgXAotICBmbG9hdDMyeDRfdCBfX2ExID0gX19hOyBcCi0gIGZsb2F0MzJ4NF90IF9fYjEgPSBfX2I7IFwKLSAgZmxvYXQzMng0X3QgX19jMSA9IF9fYzsgXAotICB2Zm1hcV9sYW5lcV9mMzIoX19hMSwgX19iMSwgLV9fYzEsIF9fZCk7IH0pCi0jZGVmaW5lIHZmbXNxX2xhbmVxX2Y2NChhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJfdCBfX2EgPSAoYSk7IGZsb2F0NjR4Ml90IF9fYiA9IChiKTsgZmxvYXQ2NHgyX3QgX19jID0gKGMpOyBcCi0gIGZsb2F0NjR4Ml90IF9fYTEgPSBfX2E7IFwKLSAgZmxvYXQ2NHgyX3QgX19iMSA9IF9fYjsgXAotICBmbG9hdDY0eDJfdCBfX2MxID0gX19jOyBcCi0gIHZmbWFxX2xhbmVxX2Y2NChfX2ExLCBfX2IxLCAtX19jMSwgX19kKTsgfSkKLQotX19haSBmbG9hdDY0eDFfdCB2Z2V0X2hpZ2hfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDEpOyB9Ci1fX2FpIHBvbHk2NHgxX3QgdmdldF9oaWdoX3A2NChwb2x5NjR4Ml90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDEpOyB9Ci0KLV9fYWkgZmxvYXQ2NHgxX3QgdmdldF9sb3dfZjY0KGZsb2F0NjR4Ml90IF9fYSkgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2EsIDApOyB9Ci1fX2FpIHBvbHk2NHgxX3QgdmdldF9sb3dfcDY0KHBvbHk2NHgyX3QgX19hKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYSwgMCk7IH0KLQotX19haSBpbnQ4X3Qgdm1heHZfczgoaW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OF90KV9fYnVpbHRpbl9uZW9uX3ZtYXh2X3M4KF9fYSk7IH0KLV9fYWkgaW50MTZfdCB2bWF4dl9zMTYoaW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKGludDE2X3QpX19idWlsdGluX25lb25fdm1heHZfczE2KF9fYSk7IH0KLV9fYWkgaW50MzJfdCB2bWF4dl9zMzIoaW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGludDMyX3QpX19idWlsdGluX25lb25fdm1heHZfczMyKF9fYSk7IH0KLV9fYWkgZmxvYXQzMl90IHZtYXh2X2YzMihmbG9hdDMyeDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDMyX3QpX19idWlsdGluX25lb25fdm1heHZfZjMyKF9fYSk7IH0KLV9fYWkgdWludDhfdCB2bWF4dl91OCh1aW50OHg4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDhfdClfX2J1aWx0aW5fbmVvbl92bWF4dl91OCgoaW50OHg4X3QpX19hKTsgfQotX19haSB1aW50MTZfdCB2bWF4dl91MTYodWludDE2eDRfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZfdClfX2J1aWx0aW5fbmVvbl92bWF4dl91MTYoKGludDE2eDRfdClfX2EpOyB9Ci1fX2FpIHVpbnQzMl90IHZtYXh2X3UzMih1aW50MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZtYXh2X3UzMigoaW50MzJ4Ml90KV9fYSk7IH0KLV9fYWkgaW50OF90IHZtYXh2cV9zOChpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAoaW50OF90KV9fYnVpbHRpbl9uZW9uX3ZtYXh2cV9zOChfX2EpOyB9Ci1fX2FpIGludDE2X3Qgdm1heHZxX3MxNihpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZfdClfX2J1aWx0aW5fbmVvbl92bWF4dnFfczE2KF9fYSk7IH0KLV9fYWkgaW50MzJfdCB2bWF4dnFfczMyKGludDMyeDRfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZtYXh2cV9zMzIoX19hKTsgfQotX19haSB1aW50OF90IHZtYXh2cV91OCh1aW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4X3QpX19idWlsdGluX25lb25fdm1heHZxX3U4KChpbnQ4eDE2X3QpX19hKTsgfQotX19haSB1aW50MTZfdCB2bWF4dnFfdTE2KHVpbnQxNng4X3QgX19hKSB7Ci0gIHJldHVybiAodWludDE2X3QpX19idWlsdGluX25lb25fdm1heHZxX3UxNigoaW50MTZ4OF90KV9fYSk7IH0KLV9fYWkgdWludDMyX3Qgdm1heHZxX3UzMih1aW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQzMl90KV9fYnVpbHRpbl9uZW9uX3ZtYXh2cV91MzIoKGludDMyeDRfdClfX2EpOyB9Ci1fX2FpIGZsb2F0MzJfdCB2bWF4dnFfZjMyKGZsb2F0MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92bWF4dnFfZjMyKF9fYSk7IH0KLV9fYWkgZmxvYXQ2NF90IHZtYXh2cV9mNjQoZmxvYXQ2NHgyX3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQ2NF90KV9fYnVpbHRpbl9uZW9uX3ZtYXh2cV9mNjQoX19hKTsgfQotCi1fX2FpIGludDhfdCB2bWludl9zOChpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4X3QpX19idWlsdGluX25lb25fdm1pbnZfczgoX19hKTsgfQotX19haSBpbnQxNl90IHZtaW52X3MxNihpbnQxNng0X3QgX19hKSB7Ci0gIHJldHVybiAoaW50MTZfdClfX2J1aWx0aW5fbmVvbl92bWludl9zMTYoX19hKTsgfQotX19haSBpbnQzMl90IHZtaW52X3MzMihpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAoaW50MzJfdClfX2J1aWx0aW5fbmVvbl92bWludl9zMzIoX19hKTsgfQotX19haSBmbG9hdDMyX3Qgdm1pbnZfZjMyKGZsb2F0MzJ4Ml90IF9fYSkgewotICByZXR1cm4gKGZsb2F0MzJfdClfX2J1aWx0aW5fbmVvbl92bWludl9mMzIoX19hKTsgfQotX19haSB1aW50OF90IHZtaW52X3U4KHVpbnQ4eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50OF90KV9fYnVpbHRpbl9uZW9uX3ZtaW52X3U4KChpbnQ4eDhfdClfX2EpOyB9Ci1fX2FpIHVpbnQxNl90IHZtaW52X3UxNih1aW50MTZ4NF90IF9fYSkgewotICByZXR1cm4gKHVpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZtaW52X3UxNigoaW50MTZ4NF90KV9fYSk7IH0KLV9fYWkgdWludDMyX3Qgdm1pbnZfdTMyKHVpbnQzMngyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdm1pbnZfdTMyKChpbnQzMngyX3QpX19hKTsgfQotX19haSBpbnQ4X3Qgdm1pbnZxX3M4KGludDh4MTZfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQ4X3QpX19idWlsdGluX25lb25fdm1pbnZxX3M4KF9fYSk7IH0KLV9fYWkgaW50MTZfdCB2bWludnFfczE2KGludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuIChpbnQxNl90KV9fYnVpbHRpbl9uZW9uX3ZtaW52cV9zMTYoX19hKTsgfQotX19haSBpbnQzMl90IHZtaW52cV9zMzIoaW50MzJ4NF90IF9fYSkgewotICByZXR1cm4gKGludDMyX3QpX19idWlsdGluX25lb25fdm1pbnZxX3MzMihfX2EpOyB9Ci1fX2FpIHVpbnQ4X3Qgdm1pbnZxX3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAodWludDhfdClfX2J1aWx0aW5fbmVvbl92bWludnFfdTgoKGludDh4MTZfdClfX2EpOyB9Ci1fX2FpIHVpbnQxNl90IHZtaW52cV91MTYodWludDE2eDhfdCBfX2EpIHsKLSAgcmV0dXJuICh1aW50MTZfdClfX2J1aWx0aW5fbmVvbl92bWludnFfdTE2KChpbnQxNng4X3QpX19hKTsgfQotX19haSB1aW50MzJfdCB2bWludnFfdTMyKHVpbnQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdm1pbnZxX3UzMigoaW50MzJ4NF90KV9fYSk7IH0KLV9fYWkgZmxvYXQzMl90IHZtaW52cV9mMzIoZmxvYXQzMng0X3QgX19hKSB7Ci0gIHJldHVybiAoZmxvYXQzMl90KV9fYnVpbHRpbl9uZW9uX3ZtaW52cV9mMzIoX19hKTsgfQotX19haSBmbG9hdDY0X3Qgdm1pbnZxX2Y2NChmbG9hdDY0eDJfdCBfX2EpIHsKLSAgcmV0dXJuIChmbG9hdDY0X3QpX19idWlsdGluX25lb25fdm1pbnZxX2Y2NChfX2EpOyB9Ci0KLV9fYWkgaW50MTZ4OF90IHZtbGFsX2hpZ2hfczgoaW50MTZ4OF90IF9fYSwgaW50OHgxNl90IF9fYiwgaW50OHgxNl90IF9fYykgewotICByZXR1cm4gdm1sYWxfczgoX19hLCB2Z2V0X2hpZ2hfczgoX19iKSwgdmdldF9oaWdoX3M4KF9fYykpOyB9Ci1fX2FpIGludDMyeDRfdCB2bWxhbF9oaWdoX3MxNihpbnQzMng0X3QgX19hLCBpbnQxNng4X3QgX19iLCBpbnQxNng4X3QgX19jKSB7Ci0gIHJldHVybiB2bWxhbF9zMTYoX19hLCB2Z2V0X2hpZ2hfczE2KF9fYiksIHZnZXRfaGlnaF9zMTYoX19jKSk7IH0KLV9fYWkgaW50NjR4Ml90IHZtbGFsX2hpZ2hfczMyKGludDY0eDJfdCBfX2EsIGludDMyeDRfdCBfX2IsIGludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuIHZtbGFsX3MzMihfX2EsIHZnZXRfaGlnaF9zMzIoX19iKSwgdmdldF9oaWdoX3MzMihfX2MpKTsgfQotX19haSB1aW50MTZ4OF90IHZtbGFsX2hpZ2hfdTgodWludDE2eDhfdCBfX2EsIHVpbnQ4eDE2X3QgX19iLCB1aW50OHgxNl90IF9fYykgewotICByZXR1cm4gdm1sYWxfdTgoX19hLCB2Z2V0X2hpZ2hfdTgoX19iKSwgdmdldF9oaWdoX3U4KF9fYykpOyB9Ci1fX2FpIHVpbnQzMng0X3Qgdm1sYWxfaGlnaF91MTYodWludDMyeDRfdCBfX2EsIHVpbnQxNng4X3QgX19iLCB1aW50MTZ4OF90IF9fYykgewotICByZXR1cm4gdm1sYWxfdTE2KF9fYSwgdmdldF9oaWdoX3UxNihfX2IpLCB2Z2V0X2hpZ2hfdTE2KF9fYykpOyB9Ci1fX2FpIHVpbnQ2NHgyX3Qgdm1sYWxfaGlnaF91MzIodWludDY0eDJfdCBfX2EsIHVpbnQzMng0X3QgX19iLCB1aW50MzJ4NF90IF9fYykgewotICByZXR1cm4gdm1sYWxfdTMyKF9fYSwgdmdldF9oaWdoX3UzMihfX2IpLCB2Z2V0X2hpZ2hfdTMyKF9fYykpOyB9Ci0KLSNkZWZpbmUgdm1sYWxfaGlnaF9sYW5lX3MxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBpbnQxNng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSArIHZtdWxsX3MxNih2Z2V0X2hpZ2hfczE2KF9fYiksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCwgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sYWxfaGlnaF9sYW5lX3MzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBpbnQzMngyX3QgX19jID0gKGMpOyBcCi0gIF9fYSArIHZtdWxsX3MzMih2Z2V0X2hpZ2hfczMyKF9fYiksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxhbF9oaWdoX2xhbmVfdTE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MTZ4OF90IF9fYiA9IChiKTsgdWludDE2eDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgdm11bGxfdTE2KHZnZXRfaGlnaF91MTYoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxhbF9oaWdoX2xhbmVfdTMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyX3QgX19hID0gKGEpOyB1aW50MzJ4NF90IF9fYiA9IChiKTsgdWludDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgdm11bGxfdTMyKHZnZXRfaGlnaF91MzIoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0KLSNkZWZpbmUgdm1sYWxfaGlnaF9sYW5lcV9zMTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MTZ4OF90IF9fYiA9IChiKTsgaW50MTZ4OF90IF9fYyA9IChjKTsgXAotICBfX2EgKyB2bXVsbF9zMTYodmdldF9oaWdoX3MxNihfX2IpLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFsX2hpZ2hfbGFuZXFfczMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IGludDMyeDRfdCBfX2IgPSAoYik7IGludDMyeDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgdm11bGxfczMyKHZnZXRfaGlnaF9zMzIoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFsX2hpZ2hfbGFuZXFfdTE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MTZ4OF90IF9fYiA9IChiKTsgdWludDE2eDhfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgdm11bGxfdTE2KHZnZXRfaGlnaF91MTYoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxhbF9oaWdoX2xhbmVxX3UzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Ml90IF9fYSA9IChhKTsgdWludDMyeDRfdCBfX2IgPSAoYik7IHVpbnQzMng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSArIHZtdWxsX3UzMih2Z2V0X2hpZ2hfdTMyKF9fYiksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotCi1fX2FpIGludDMyeDRfdCB2bWxhbF9oaWdoX25fczE2KGludDMyeDRfdCBfX2EsIGludDE2eDhfdCBfX2IsIGludDE2X3QgX19jKSB7Ci0gIHJldHVybiB2bWxhbF9uX3MxNihfX2EsIHZnZXRfaGlnaF9zMTYoX19iKSwgX19jKTsgfQotX19haSBpbnQ2NHgyX3Qgdm1sYWxfaGlnaF9uX3MzMihpbnQ2NHgyX3QgX19hLCBpbnQzMng0X3QgX19iLCBpbnQzMl90IF9fYykgewotICByZXR1cm4gdm1sYWxfbl9zMzIoX19hLCB2Z2V0X2hpZ2hfczMyKF9fYiksIF9fYyk7IH0KLV9fYWkgdWludDMyeDRfdCB2bWxhbF9oaWdoX25fdTE2KHVpbnQzMng0X3QgX19hLCB1aW50MTZ4OF90IF9fYiwgdWludDE2X3QgX19jKSB7Ci0gIHJldHVybiB2bWxhbF9uX3UxNihfX2EsIHZnZXRfaGlnaF91MTYoX19iKSwgX19jKTsgfQotX19haSB1aW50NjR4Ml90IHZtbGFsX2hpZ2hfbl91MzIodWludDY0eDJfdCBfX2EsIHVpbnQzMng0X3QgX19iLCB1aW50MzJfdCBfX2MpIHsKLSAgcmV0dXJuIHZtbGFsX25fdTMyKF9fYSwgdmdldF9oaWdoX3UzMihfX2IpLCBfX2MpOyB9Ci0KLSNkZWZpbmUgdm1sYWxfbGFuZXFfczE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IGludDE2eDRfdCBfX2IgPSAoYik7IGludDE2eDhfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgdm11bGxfczE2KF9fYiwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxhbF9sYW5lcV9zMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Ml90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgaW50MzJ4NF90IF9fYyA9IChjKTsgXAotICBfX2EgKyB2bXVsbF9zMzIoX19iLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sYWxfbGFuZXFfdTE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MTZ4NF90IF9fYiA9IChiKTsgdWludDE2eDhfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgdm11bGxfdTE2KF9fYiwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxhbF9sYW5lcV91MzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJfdCBfX2EgPSAoYSk7IHVpbnQzMngyX3QgX19iID0gKGIpOyB1aW50MzJ4NF90IF9fYyA9IChjKTsgXAotICBfX2EgKyB2bXVsbF91MzIoX19iLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QpKTsgfSkKLQotI2RlZmluZSB2bWxhX2xhbmVxX3MxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBpbnQxNng0X3QgX19iID0gKGIpOyBpbnQxNng4X3QgX19jID0gKGMpOyBcCi0gIF9fYSArIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFfbGFuZXFfczMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IGludDMyeDJfdCBfX2IgPSAoYik7IGludDMyeDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxhX2xhbmVxX3UxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NF90IF9fYSA9IChhKTsgdWludDE2eDRfdCBfX2IgPSAoYik7IHVpbnQxNng4X3QgX19jID0gKGMpOyBcCi0gIF9fYSArIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFfbGFuZXFfdTMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hID0gKGEpOyB1aW50MzJ4Ml90IF9fYiA9IChiKTsgdWludDMyeDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxhX2xhbmVxX2YzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4Ml90IF9fYiA9IChiKTsgZmxvYXQzMng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSArIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sYXFfbGFuZXFfczE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IGludDE2eDhfdCBfX2MgPSAoYyk7IFwKLSAgX19hICsgKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxhcV9sYW5lcV9zMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgaW50MzJ4NF90IF9fYyA9IChjKTsgXAotICBfX2EgKyAoX19iICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxhcV9sYW5lcV91MTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IHVpbnQxNng4X3QgX19iID0gKGIpOyB1aW50MTZ4OF90IF9fYyA9IChjKTsgXAotICBfX2EgKyAoX19iICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFxX2xhbmVxX3UzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgdWludDMyeDRfdCBfX2IgPSAoYik7IHVpbnQzMng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSArIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbGFxX2xhbmVxX2YzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDRfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4NF90IF9fYiA9IChiKTsgZmxvYXQzMng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSArIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0KLV9fYWkgaW50MTZ4OF90IHZtbHNsX2hpZ2hfczgoaW50MTZ4OF90IF9fYSwgaW50OHgxNl90IF9fYiwgaW50OHgxNl90IF9fYykgewotICByZXR1cm4gdm1sc2xfczgoX19hLCB2Z2V0X2hpZ2hfczgoX19iKSwgdmdldF9oaWdoX3M4KF9fYykpOyB9Ci1fX2FpIGludDMyeDRfdCB2bWxzbF9oaWdoX3MxNihpbnQzMng0X3QgX19hLCBpbnQxNng4X3QgX19iLCBpbnQxNng4X3QgX19jKSB7Ci0gIHJldHVybiB2bWxzbF9zMTYoX19hLCB2Z2V0X2hpZ2hfczE2KF9fYiksIHZnZXRfaGlnaF9zMTYoX19jKSk7IH0KLV9fYWkgaW50NjR4Ml90IHZtbHNsX2hpZ2hfczMyKGludDY0eDJfdCBfX2EsIGludDMyeDRfdCBfX2IsIGludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuIHZtbHNsX3MzMihfX2EsIHZnZXRfaGlnaF9zMzIoX19iKSwgdmdldF9oaWdoX3MzMihfX2MpKTsgfQotX19haSB1aW50MTZ4OF90IHZtbHNsX2hpZ2hfdTgodWludDE2eDhfdCBfX2EsIHVpbnQ4eDE2X3QgX19iLCB1aW50OHgxNl90IF9fYykgewotICByZXR1cm4gdm1sc2xfdTgoX19hLCB2Z2V0X2hpZ2hfdTgoX19iKSwgdmdldF9oaWdoX3U4KF9fYykpOyB9Ci1fX2FpIHVpbnQzMng0X3Qgdm1sc2xfaGlnaF91MTYodWludDMyeDRfdCBfX2EsIHVpbnQxNng4X3QgX19iLCB1aW50MTZ4OF90IF9fYykgewotICByZXR1cm4gdm1sc2xfdTE2KF9fYSwgdmdldF9oaWdoX3UxNihfX2IpLCB2Z2V0X2hpZ2hfdTE2KF9fYykpOyB9Ci1fX2FpIHVpbnQ2NHgyX3Qgdm1sc2xfaGlnaF91MzIodWludDY0eDJfdCBfX2EsIHVpbnQzMng0X3QgX19iLCB1aW50MzJ4NF90IF9fYykgewotICByZXR1cm4gdm1sc2xfdTMyKF9fYSwgdmdldF9oaWdoX3UzMihfX2IpLCB2Z2V0X2hpZ2hfdTMyKF9fYykpOyB9Ci0KLSNkZWZpbmUgdm1sc2xfaGlnaF9sYW5lX3MxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBpbnQxNng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIHZtdWxsX3MxNih2Z2V0X2hpZ2hfczE2KF9fYiksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCwgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sc2xfaGlnaF9sYW5lX3MzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBpbnQzMngyX3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIHZtdWxsX3MzMih2Z2V0X2hpZ2hfczMyKF9fYiksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzbF9oaWdoX2xhbmVfdTE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MTZ4OF90IF9fYiA9IChiKTsgdWludDE2eDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gdm11bGxfdTE2KHZnZXRfaGlnaF91MTYoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzbF9oaWdoX2xhbmVfdTMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQ2NHgyX3QgX19hID0gKGEpOyB1aW50MzJ4NF90IF9fYiA9IChiKTsgdWludDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gdm11bGxfdTMyKHZnZXRfaGlnaF91MzIoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0KLSNkZWZpbmUgdm1sc2xfaGlnaF9sYW5lcV9zMTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MTZ4OF90IF9fYiA9IChiKTsgaW50MTZ4OF90IF9fYyA9IChjKTsgXAotICBfX2EgLSB2bXVsbF9zMTYodmdldF9oaWdoX3MxNihfX2IpLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbHNsX2hpZ2hfbGFuZXFfczMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IGludDMyeDRfdCBfX2IgPSAoYik7IGludDMyeDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gdm11bGxfczMyKHZnZXRfaGlnaF9zMzIoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbHNsX2hpZ2hfbGFuZXFfdTE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MTZ4OF90IF9fYiA9IChiKTsgdWludDE2eDhfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gdm11bGxfdTE2KHZnZXRfaGlnaF91MTYoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzbF9oaWdoX2xhbmVxX3UzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50NjR4Ml90IF9fYSA9IChhKTsgdWludDMyeDRfdCBfX2IgPSAoYik7IHVpbnQzMng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIHZtdWxsX3UzMih2Z2V0X2hpZ2hfdTMyKF9fYiksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotCi1fX2FpIGludDMyeDRfdCB2bWxzbF9oaWdoX25fczE2KGludDMyeDRfdCBfX2EsIGludDE2eDhfdCBfX2IsIGludDE2X3QgX19jKSB7Ci0gIHJldHVybiB2bWxzbF9uX3MxNihfX2EsIHZnZXRfaGlnaF9zMTYoX19iKSwgX19jKTsgfQotX19haSBpbnQ2NHgyX3Qgdm1sc2xfaGlnaF9uX3MzMihpbnQ2NHgyX3QgX19hLCBpbnQzMng0X3QgX19iLCBpbnQzMl90IF9fYykgewotICByZXR1cm4gdm1sc2xfbl9zMzIoX19hLCB2Z2V0X2hpZ2hfczMyKF9fYiksIF9fYyk7IH0KLV9fYWkgdWludDMyeDRfdCB2bWxzbF9oaWdoX25fdTE2KHVpbnQzMng0X3QgX19hLCB1aW50MTZ4OF90IF9fYiwgdWludDE2X3QgX19jKSB7Ci0gIHJldHVybiB2bWxzbF9uX3UxNihfX2EsIHZnZXRfaGlnaF91MTYoX19iKSwgX19jKTsgfQotX19haSB1aW50NjR4Ml90IHZtbHNsX2hpZ2hfbl91MzIodWludDY0eDJfdCBfX2EsIHVpbnQzMng0X3QgX19iLCB1aW50MzJfdCBfX2MpIHsKLSAgcmV0dXJuIHZtbHNsX25fdTMyKF9fYSwgdmdldF9oaWdoX3UzMihfX2IpLCBfX2MpOyB9Ci0KLSNkZWZpbmUgdm1sc2xfbGFuZXFfczE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IGludDE2eDRfdCBfX2IgPSAoYik7IGludDE2eDhfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gdm11bGxfczE2KF9fYiwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzbF9sYW5lcV9zMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Ml90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgaW50MzJ4NF90IF9fYyA9IChjKTsgXAotICBfX2EgLSB2bXVsbF9zMzIoX19iLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sc2xfbGFuZXFfdTE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MTZ4NF90IF9fYiA9IChiKTsgdWludDE2eDhfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gdm11bGxfdTE2KF9fYiwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzbF9sYW5lcV91MzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDY0eDJfdCBfX2EgPSAoYSk7IHVpbnQzMngyX3QgX19iID0gKGIpOyB1aW50MzJ4NF90IF9fYyA9IChjKTsgXAotICBfX2EgLSB2bXVsbF91MzIoX19iLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QpKTsgfSkKLQotI2RlZmluZSB2bWxzX2xhbmVxX3MxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBpbnQxNng0X3QgX19iID0gKGIpOyBpbnQxNng4X3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbHNfbGFuZXFfczMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IGludDMyeDJfdCBfX2IgPSAoYik7IGludDMyeDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzX2xhbmVxX3UxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4NF90IF9fYSA9IChhKTsgdWludDE2eDRfdCBfX2IgPSAoYik7IHVpbnQxNng4X3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbHNfbGFuZXFfdTMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hID0gKGEpOyB1aW50MzJ4Ml90IF9fYiA9IChiKTsgdWludDMyeDRfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzX2xhbmVxX2YzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4Ml90IF9fYiA9IChiKTsgZmxvYXQzMng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdm1sc3FfbGFuZXFfczE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IGludDE2eDhfdCBfX2MgPSAoYyk7IFwKLSAgX19hIC0gKF9fYiAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzcV9sYW5lcV9zMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgaW50MzJ4NF90IF9fYyA9IChjKTsgXAotICBfX2EgLSAoX19iICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2bWxzcV9sYW5lcV91MTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IHVpbnQxNng4X3QgX19iID0gKGIpOyB1aW50MTZ4OF90IF9fYyA9IChjKTsgXAotICBfX2EgLSAoX19iICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCwgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbHNxX2xhbmVxX3UzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4NF90IF9fYSA9IChhKTsgdWludDMyeDRfdCBfX2IgPSAoYik7IHVpbnQzMng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZtbHNxX2xhbmVxX2YzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDRfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4NF90IF9fYiA9IChiKTsgZmxvYXQzMng0X3QgX19jID0gKGMpOyBcCi0gIF9fYSAtIChfX2IgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0KLQotCi0jZGVmaW5lIHZtdWxsX2hpZ2hfbGFuZV9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgXAotICB2bXVsbF9zMTYodmdldF9oaWdoX3MxNihfX2EpLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0jZGVmaW5lIHZtdWxsX2hpZ2hfbGFuZV9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICB2bXVsbF9zMzIodmdldF9oaWdoX3MzMihfX2EpLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MpKTsgfSkKLSNkZWZpbmUgdm11bGxfaGlnaF9sYW5lX3UxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MTZ4OF90IF9fYSA9IChhKTsgdWludDE2eDRfdCBfX2IgPSAoYik7IFwKLSAgdm11bGxfdTE2KHZnZXRfaGlnaF91MTYoX19hKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jLCBfX2MsIF9fYykpOyB9KQotI2RlZmluZSB2bXVsbF9oaWdoX2xhbmVfdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMng0X3QgX19hID0gKGEpOyB1aW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICB2bXVsbF91MzIodmdldF9oaWdoX3UzMihfX2EpLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MpKTsgfSkKLQotI2RlZmluZSB2bXVsbF9oaWdoX2xhbmVxX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIHZtdWxsX3MxNih2Z2V0X2hpZ2hfczE2KF9fYSksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYywgX19jLCBfX2MpKTsgfSkKLSNkZWZpbmUgdm11bGxfaGlnaF9sYW5lcV9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgXAotICB2bXVsbF9zMzIodmdldF9oaWdoX3MzMihfX2EpLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MpKTsgfSkKLSNkZWZpbmUgdm11bGxfaGlnaF9sYW5lcV91MTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDhfdCBfX2EgPSAoYSk7IHVpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIHZtdWxsX3UxNih2Z2V0X2hpZ2hfdTE2KF9fYSksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYywgX19jLCBfX2MpKTsgfSkKLSNkZWZpbmUgdm11bGxfaGlnaF9sYW5lcV91MzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDRfdCBfX2EgPSAoYSk7IHVpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIHZtdWxsX3UzMih2Z2V0X2hpZ2hfdTMyKF9fYSksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYykpOyB9KQotCi1fX2FpIGludDMyeDRfdCB2bXVsbF9oaWdoX25fczE2KGludDE2eDhfdCBfX2EsIGludDE2X3QgX19iKSB7Ci0gIHJldHVybiB2bXVsbF9uX3MxNih2Z2V0X2hpZ2hfczE2KF9fYSksIF9fYik7IH0KLV9fYWkgaW50NjR4Ml90IHZtdWxsX2hpZ2hfbl9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJfdCBfX2IpIHsKLSAgcmV0dXJuIHZtdWxsX25fczMyKHZnZXRfaGlnaF9zMzIoX19hKSwgX19iKTsgfQotX19haSB1aW50MzJ4NF90IHZtdWxsX2hpZ2hfbl91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNl90IF9fYikgewotICByZXR1cm4gdm11bGxfbl91MTYodmdldF9oaWdoX3UxNihfX2EpLCBfX2IpOyB9Ci1fX2FpIHVpbnQ2NHgyX3Qgdm11bGxfaGlnaF9uX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyX3QgX19iKSB7Ci0gIHJldHVybiB2bXVsbF9uX3UzMih2Z2V0X2hpZ2hfdTMyKF9fYSksIF9fYik7IH0KLQotI2RlZmluZSB2bXVsbF9sYW5lcV9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4NF90IF9fYSA9IChhKTsgaW50MTZ4OF90IF9fYiA9IChiKTsgXAotICB2bXVsbF9zMTYoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0jZGVmaW5lIHZtdWxsX2xhbmVxX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIHZtdWxsX3MzMihfX2EsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYykpOyB9KQotI2RlZmluZSB2bXVsbF9sYW5lcV91MTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IHVpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIHZtdWxsX3UxNihfX2EsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYywgX19jLCBfX2MpKTsgfSkKLSNkZWZpbmUgdm11bGxfbGFuZXFfdTMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQzMngyX3QgX19hID0gKGEpOyB1aW50MzJ4NF90IF9fYiA9IChiKTsgXAotICB2bXVsbF91MzIoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MpKTsgfSkKLQotI2RlZmluZSB2bXVseF9sYW5lX2YzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDJfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4Ml90IF9fYiA9IChiKTsgXAotICB2bXVseF9mMzIoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MpKTsgfSkKLSNkZWZpbmUgdm11bHhxX2xhbmVfZjMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NF90IF9fYSA9IChhKTsgZmxvYXQzMngyX3QgX19iID0gKGIpOyBcCi0gIHZtdWx4cV9mMzIoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0jZGVmaW5lIHZtdWx4cV9sYW5lX2Y2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJfdCBfX2EgPSAoYSk7IGZsb2F0NjR4MV90IF9fYiA9IChiKTsgXAotICB2bXVseHFfZjY0KF9fYSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jKSk7IH0pCi0KLSNkZWZpbmUgdm11bHhfbGFuZXFfZjMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4Ml90IF9fYSA9IChhKTsgZmxvYXQzMng0X3QgX19iID0gKGIpOyBcCi0gIHZtdWx4X2YzMihfX2EsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYykpOyB9KQotI2RlZmluZSB2bXVseHFfbGFuZXFfZjMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGZsb2F0MzJ4NF90IF9fYSA9IChhKTsgZmxvYXQzMng0X3QgX19iID0gKGIpOyBcCi0gIHZtdWx4cV9mMzIoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0jZGVmaW5lIHZtdWx4cV9sYW5lcV9mNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyX3QgX19hID0gKGEpOyBmbG9hdDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgdm11bHhxX2Y2NChfX2EsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYykpOyB9KQotCi0jZGVmaW5lIHZtdWxfbGFuZXFfczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgX19hICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jLCBfX2MsIF9fYyk7IH0pCi0jZGVmaW5lIHZtdWxfbGFuZXFfczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDJfdCBfX2EgPSAoYSk7IGludDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgX19hICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jKTsgfSkKLSNkZWZpbmUgdm11bF9sYW5lcV9mMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQzMngyX3QgX19hID0gKGEpOyBmbG9hdDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgX19hICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jKTsgfSkKLSNkZWZpbmUgdm11bF9sYW5lcV91MTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDE2eDRfdCBfX2EgPSAoYSk7IHVpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIF9fYSAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYywgX19jLCBfX2MpOyB9KQotI2RlZmluZSB2bXVsX2xhbmVxX3UzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICB1aW50MzJ4Ml90IF9fYSA9IChhKTsgdWludDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgX19hICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jKTsgfSkKLSNkZWZpbmUgdm11bHFfbGFuZXFfczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDhfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgX19hICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jKTsgfSkKLSNkZWZpbmUgdm11bHFfbGFuZXFfczMyKGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IGludDMyeDRfdCBfX2IgPSAoYik7IFwKLSAgX19hICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jLCBfX2MsIF9fYyk7IH0pCi0jZGVmaW5lIHZtdWxxX2xhbmVxX2YzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDMyeDRfdCBfX2EgPSAoYSk7IGZsb2F0MzJ4NF90IF9fYiA9IChiKTsgXAotICBfX2EgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKTsgfSkKLSNkZWZpbmUgdm11bHFfbGFuZXFfdTE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIHVpbnQxNng4X3QgX19hID0gKGEpOyB1aW50MTZ4OF90IF9fYiA9IChiKTsgXAotICBfX2EgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MpOyB9KQotI2RlZmluZSB2bXVscV9sYW5lcV91MzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgdWludDMyeDRfdCBfX2EgPSAoYSk7IHVpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIF9fYSAqIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYywgX19jLCBfX2MpOyB9KQotI2RlZmluZSB2bXVscV9sYW5lcV9mNjQoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgZmxvYXQ2NHgyX3QgX19hID0gKGEpOyBmbG9hdDY0eDJfdCBfX2IgPSAoYik7IFwKLSAgX19hICogX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jKTsgfSkKLQotI2RlZmluZSB2bXVscV9sYW5lX2Y2NChhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBmbG9hdDY0eDJfdCBfX2EgPSAoYSk7IGZsb2F0NjR4MV90IF9fYiA9IChiKTsgXAotICBfX2EgKiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MpOyB9KQotCi1fX2FpIGZsb2F0NjR4Ml90IHZtdWxxX25fZjY0KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NF90IF9fYikgewotICByZXR1cm4gX19hICogKGZsb2F0NjR4Ml90KXsgX19iLCBfX2IgfTsgfQotCi1fX2FpIGludDMyeDRfdCB2cWRtbGFsX2hpZ2hfczE2KGludDMyeDRfdCBfX2EsIGludDE2eDhfdCBfX2IsIGludDE2eDhfdCBfX2MpIHsKLSAgcmV0dXJuIHZxZG1sYWxfczE2KF9fYSwgdmdldF9oaWdoX3MxNihfX2IpLCB2Z2V0X2hpZ2hfczE2KF9fYykpOyB9Ci1fX2FpIGludDY0eDJfdCB2cWRtbGFsX2hpZ2hfczMyKGludDY0eDJfdCBfX2EsIGludDMyeDRfdCBfX2IsIGludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuIHZxZG1sYWxfczMyKF9fYSwgdmdldF9oaWdoX3MzMihfX2IpLCB2Z2V0X2hpZ2hfczMyKF9fYykpOyB9Ci0KLSNkZWZpbmUgdnFkbWxhbF9oaWdoX2xhbmVfczE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IGludDE2eDRfdCBfX2MgPSAoYyk7IFwKLSAgdnFkbWxhbF9zMTYoX19hLCB2Z2V0X2hpZ2hfczE2KF9fYiksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCwgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdnFkbWxhbF9oaWdoX2xhbmVfczMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IGludDMyeDRfdCBfX2IgPSAoYik7IGludDMyeDJfdCBfX2MgPSAoYyk7IFwKLSAgdnFkbWxhbF9zMzIoX19hLCB2Z2V0X2hpZ2hfczMyKF9fYiksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotCi0jZGVmaW5lIHZxZG1sYWxfaGlnaF9sYW5lcV9zMTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MTZ4OF90IF9fYiA9IChiKTsgaW50MTZ4OF90IF9fYyA9IChjKTsgXAotICB2cWRtbGFsX3MxNihfX2EsIHZnZXRfaGlnaF9zMTYoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2cWRtbGFsX2hpZ2hfbGFuZXFfczMyKGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDY0eDJfdCBfX2EgPSAoYSk7IGludDMyeDRfdCBfX2IgPSAoYik7IGludDMyeDRfdCBfX2MgPSAoYyk7IFwKLSAgdnFkbWxhbF9zMzIoX19hLCB2Z2V0X2hpZ2hfczMyKF9fYiksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCkpOyB9KQotCi1fX2FpIGludDMyeDRfdCB2cWRtbGFsX2hpZ2hfbl9zMTYoaW50MzJ4NF90IF9fYSwgaW50MTZ4OF90IF9fYiwgaW50MTZfdCBfX2MpIHsKLSAgcmV0dXJuIHZxZG1sYWxfbl9zMTYoX19hLCB2Z2V0X2hpZ2hfczE2KF9fYiksIF9fYyk7IH0KLV9fYWkgaW50NjR4Ml90IHZxZG1sYWxfaGlnaF9uX3MzMihpbnQ2NHgyX3QgX19hLCBpbnQzMng0X3QgX19iLCBpbnQzMl90IF9fYykgewotICByZXR1cm4gdnFkbWxhbF9uX3MzMihfX2EsIHZnZXRfaGlnaF9zMzIoX19iKSwgX19jKTsgfQotCi0jZGVmaW5lIHZxZG1sYWxfbGFuZXFfczE2KGEsIGIsIGMsIF9fZCkgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDMyeDRfdCBfX2EgPSAoYSk7IGludDE2eDRfdCBfX2IgPSAoYik7IGludDE2eDhfdCBfX2MgPSAoYyk7IFwKLSAgdnFkbWxhbF9zMTYoX19hLCBfX2IsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYywgX19jLCBfX2QsIF9fZCwgX19kLCBfX2QpKTsgfSkKLSNkZWZpbmUgdnFkbWxhbF9sYW5lcV9zMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Ml90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgaW50MzJ4NF90IF9fYyA9IChjKTsgXAotICB2cWRtbGFsX3MzMihfX2EsIF9fYiwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0KLV9fYWkgaW50MzJ4NF90IHZxZG1sc2xfaGlnaF9zMTYoaW50MzJ4NF90IF9fYSwgaW50MTZ4OF90IF9fYiwgaW50MTZ4OF90IF9fYykgewotICByZXR1cm4gdnFkbWxzbF9zMTYoX19hLCB2Z2V0X2hpZ2hfczE2KF9fYiksIHZnZXRfaGlnaF9zMTYoX19jKSk7IH0KLV9fYWkgaW50NjR4Ml90IHZxZG1sc2xfaGlnaF9zMzIoaW50NjR4Ml90IF9fYSwgaW50MzJ4NF90IF9fYiwgaW50MzJ4NF90IF9fYykgewotICByZXR1cm4gdnFkbWxzbF9zMzIoX19hLCB2Z2V0X2hpZ2hfczMyKF9fYiksIHZnZXRfaGlnaF9zMzIoX19jKSk7IH0KLQotI2RlZmluZSB2cWRtbHNsX2hpZ2hfbGFuZV9zMTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MTZ4OF90IF9fYiA9IChiKTsgaW50MTZ4NF90IF9fYyA9IChjKTsgXAotICB2cWRtbHNsX3MxNihfX2EsIHZnZXRfaGlnaF9zMTYoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2cWRtbHNsX2hpZ2hfbGFuZV9zMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Ml90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgaW50MzJ4Ml90IF9fYyA9IChjKTsgXAotICB2cWRtbHNsX3MzMihfX2EsIHZnZXRfaGlnaF9zMzIoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0KLSNkZWZpbmUgdnFkbWxzbF9oaWdoX2xhbmVxX3MxNihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBpbnQxNng4X3QgX19jID0gKGMpOyBcCi0gIHZxZG1sc2xfczE2KF9fYSwgdmdldF9oaWdoX3MxNihfX2IpLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QsIF9fZCwgX19kKSk7IH0pCi0jZGVmaW5lIHZxZG1sc2xfaGlnaF9sYW5lcV9zMzIoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50NjR4Ml90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgaW50MzJ4NF90IF9fYyA9IChjKTsgXAotICB2cWRtbHNsX3MzMihfX2EsIHZnZXRfaGlnaF9zMzIoX19iKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kKSk7IH0pCi0KLV9fYWkgaW50MzJ4NF90IHZxZG1sc2xfaGlnaF9uX3MxNihpbnQzMng0X3QgX19hLCBpbnQxNng4X3QgX19iLCBpbnQxNl90IF9fYykgewotICByZXR1cm4gdnFkbWxzbF9uX3MxNihfX2EsIHZnZXRfaGlnaF9zMTYoX19iKSwgX19jKTsgfQotX19haSBpbnQ2NHgyX3QgdnFkbWxzbF9oaWdoX25fczMyKGludDY0eDJfdCBfX2EsIGludDMyeDRfdCBfX2IsIGludDMyX3QgX19jKSB7Ci0gIHJldHVybiB2cWRtbHNsX25fczMyKF9fYSwgdmdldF9oaWdoX3MzMihfX2IpLCBfX2MpOyB9Ci0KLSNkZWZpbmUgdnFkbWxzbF9sYW5lcV9zMTYoYSwgYiwgYywgX19kKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MTZ4NF90IF9fYiA9IChiKTsgaW50MTZ4OF90IF9fYyA9IChjKTsgXAotICB2cWRtbHNsX3MxNihfX2EsIF9fYiwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19jLCBfX2MsIF9fZCwgX19kLCBfX2QsIF9fZCkpOyB9KQotI2RlZmluZSB2cWRtbHNsX2xhbmVxX3MzMihhLCBiLCBjLCBfX2QpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQ2NHgyX3QgX19hID0gKGEpOyBpbnQzMngyX3QgX19iID0gKGIpOyBpbnQzMng0X3QgX19jID0gKGMpOyBcCi0gIHZxZG1sc2xfczMyKF9fYSwgX19iLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2MsIF9fYywgX19kLCBfX2QpKTsgfSkKLQotI2RlZmluZSB2cWRtdWxoX2xhbmVxX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGhfczE2KF9fYSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jLCBfX2MsIF9fYykpOyB9KQotI2RlZmluZSB2cWRtdWxoX2xhbmVxX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGhfczMyKF9fYSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jKSk7IH0pCi0jZGVmaW5lIHZxZG11bGhxX2xhbmVxX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGhxX3MxNihfX2EsIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYykpOyB9KQotI2RlZmluZSB2cWRtdWxocV9sYW5lcV9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgXAotICB2cWRtdWxocV9zMzIoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0KLV9fYWkgaW50MzJ4NF90IHZxZG11bGxfaGlnaF9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gdnFkbXVsbF9zMTYodmdldF9oaWdoX3MxNihfX2EpLCB2Z2V0X2hpZ2hfczE2KF9fYikpOyB9Ci1fX2FpIGludDY0eDJfdCB2cWRtdWxsX2hpZ2hfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIHZxZG11bGxfczMyKHZnZXRfaGlnaF9zMzIoX19hKSwgdmdldF9oaWdoX3MzMihfX2IpKTsgfQotCi0jZGVmaW5lIHZxZG11bGxfaGlnaF9sYW5lX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hID0gKGEpOyBpbnQxNng0X3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGxfczE2KHZnZXRfaGlnaF9zMTYoX19hKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jLCBfX2MsIF9fYykpOyB9KQotI2RlZmluZSB2cWRtdWxsX2hpZ2hfbGFuZV9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4NF90IF9fYSA9IChhKTsgaW50MzJ4Ml90IF9fYiA9IChiKTsgXAotICB2cWRtdWxsX3MzMih2Z2V0X2hpZ2hfczMyKF9fYSksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYykpOyB9KQotCi0jZGVmaW5lIHZxZG11bGxfaGlnaF9sYW5lcV9zMTYoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MTZ4OF90IF9fYSA9IChhKTsgaW50MTZ4OF90IF9fYiA9IChiKTsgXAotICB2cWRtdWxsX3MxNih2Z2V0X2hpZ2hfczE2KF9fYSksIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYiwgX19iLCBfX2MsIF9fYywgX19jLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFkbXVsbF9oaWdoX2xhbmVxX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGxfczMyKHZnZXRfaGlnaF9zMzIoX19hKSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jKSk7IH0pCi0KLV9fYWkgaW50MzJ4NF90IHZxZG11bGxfaGlnaF9uX3MxNihpbnQxNng4X3QgX19hLCBpbnQxNl90IF9fYikgewotICByZXR1cm4gdnFkbXVsbF9uX3MxNih2Z2V0X2hpZ2hfczE2KF9fYSksIF9fYik7IH0KLV9fYWkgaW50NjR4Ml90IHZxZG11bGxfaGlnaF9uX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMl90IF9fYikgewotICByZXR1cm4gdnFkbXVsbF9uX3MzMih2Z2V0X2hpZ2hfczMyKF9fYSksIF9fYik7IH0KLQotI2RlZmluZSB2cWRtdWxsX2xhbmVxX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng0X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGxfczE2KF9fYSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jLCBfX2MsIF9fYykpOyB9KQotI2RlZmluZSB2cWRtdWxsX2xhbmVxX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMngyX3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIHZxZG11bGxfczMyKF9fYSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jKSk7IH0pCi0KLSNkZWZpbmUgdnFyZG11bGhfbGFuZXFfczE2KGEsIGIsIF9fYykgX19leHRlbnNpb25fXyAoeyBcCi0gIGludDE2eDRfdCBfX2EgPSAoYSk7IGludDE2eDhfdCBfX2IgPSAoYik7IFwKLSAgdnFyZG11bGhfczE2KF9fYSwgX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19iLCBfX2IsIF9fYywgX19jLCBfX2MsIF9fYykpOyB9KQotI2RlZmluZSB2cXJkbXVsaF9sYW5lcV9zMzIoYSwgYiwgX19jKSBfX2V4dGVuc2lvbl9fICh7IFwKLSAgaW50MzJ4Ml90IF9fYSA9IChhKTsgaW50MzJ4NF90IF9fYiA9IChiKTsgXAotICB2cXJkbXVsaF9zMzIoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFyZG11bGhxX2xhbmVxX3MxNihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQxNng4X3QgX19hID0gKGEpOyBpbnQxNng4X3QgX19iID0gKGIpOyBcCi0gIHZxcmRtdWxocV9zMTYoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jLCBfX2MsIF9fYywgX19jLCBfX2MpKTsgfSkKLSNkZWZpbmUgdnFyZG11bGhxX2xhbmVxX3MzMihhLCBiLCBfX2MpIF9fZXh0ZW5zaW9uX18gKHsgXAotICBpbnQzMng0X3QgX19hID0gKGEpOyBpbnQzMng0X3QgX19iID0gKGIpOyBcCi0gIHZxcmRtdWxocV9zMzIoX19hLCBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2IsIF9fYiwgX19jLCBfX2MsIF9fYywgX19jKSk7IH0pCi0KLV9fYWkgdWludDh4OF90IHZxdGJsMV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cXRibDFfdigoaW50OHgxNl90KV9fYSwgKGludDh4OF90KV9fYiwgMTYpOyB9Ci1fX2FpIGludDh4OF90IHZxdGJsMV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cXRibDFfdihfX2EsIF9fYiwgMCk7IH0KLV9fYWkgcG9seTh4OF90IHZxdGJsMV9wOChwb2x5OHgxNl90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2J1aWx0aW5fbmVvbl92cXRibDFfdigoaW50OHgxNl90KV9fYSwgKGludDh4OF90KV9fYiwgNCk7IH0KLV9fYWkgdWludDh4MTZfdCB2cXRibDFxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnF0YmwxcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDgpOyB9Ci1fX2FpIGludDh4MTZfdCB2cXRibDFxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnF0YmwxcV92KF9fYSwgX19iLCAzMik7IH0KLV9fYWkgcG9seTh4MTZfdCB2cXRibDFxX3A4KHBvbHk4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHBvbHk4eDE2X3QpX19idWlsdGluX25lb25fdnF0YmwxcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgMzYpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZxdGJsMl91OCh1aW50OHgxNngyX3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxdGJsMl92KChpbnQ4eDE2X3QpX19hLnZhbFswXSwgKGludDh4MTZfdClfX2EudmFsWzFdLCAoaW50OHg4X3QpX19iLCAxNik7IH0KLV9fYWkgaW50OHg4X3QgdnF0YmwyX3M4KGludDh4MTZ4Ml90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnF0YmwyX3YoX19hLnZhbFswXSwgX19hLnZhbFsxXSwgX19iLCAwKTsgfQotX19haSBwb2x5OHg4X3QgdnF0YmwyX3A4KHBvbHk4eDE2eDJfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIChwb2x5OHg4X3QpX19idWlsdGluX25lb25fdnF0YmwyX3YoKGludDh4MTZfdClfX2EudmFsWzBdLCAoaW50OHgxNl90KV9fYS52YWxbMV0sIChpbnQ4eDhfdClfX2IsIDQpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnF0YmwycV91OCh1aW50OHgxNngyX3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnF0YmwycV92KChpbnQ4eDE2X3QpX19hLnZhbFswXSwgKGludDh4MTZfdClfX2EudmFsWzFdLCAoaW50OHgxNl90KV9fYiwgNDgpOyB9Ci1fX2FpIGludDh4MTZfdCB2cXRibDJxX3M4KGludDh4MTZ4Ml90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cXRibDJxX3YoX19hLnZhbFswXSwgX19hLnZhbFsxXSwgX19iLCAzMik7IH0KLV9fYWkgcG9seTh4MTZfdCB2cXRibDJxX3A4KHBvbHk4eDE2eDJfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2J1aWx0aW5fbmVvbl92cXRibDJxX3YoKGludDh4MTZfdClfX2EudmFsWzBdLCAoaW50OHgxNl90KV9fYS52YWxbMV0sIChpbnQ4eDE2X3QpX19iLCAzNik7IH0KLQotX19haSB1aW50OHg4X3QgdnF0YmwzX3U4KHVpbnQ4eDE2eDNfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHg4X3QpX19idWlsdGluX25lb25fdnF0YmwzX3YoKGludDh4MTZfdClfX2EudmFsWzBdLCAoaW50OHgxNl90KV9fYS52YWxbMV0sIChpbnQ4eDE2X3QpX19hLnZhbFsyXSwgKGludDh4OF90KV9fYiwgMTYpOyB9Ci1fX2FpIGludDh4OF90IHZxdGJsM19zOChpbnQ4eDE2eDNfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxdGJsM192KF9fYS52YWxbMF0sIF9fYS52YWxbMV0sIF9fYS52YWxbMl0sIF9fYiwgMCk7IH0KLV9fYWkgcG9seTh4OF90IHZxdGJsM19wOChwb2x5OHgxNngzX3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAocG9seTh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxdGJsM192KChpbnQ4eDE2X3QpX19hLnZhbFswXSwgKGludDh4MTZfdClfX2EudmFsWzFdLCAoaW50OHgxNl90KV9fYS52YWxbMl0sIChpbnQ4eDhfdClfX2IsIDQpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnF0YmwzcV91OCh1aW50OHgxNngzX3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnF0YmwzcV92KChpbnQ4eDE2X3QpX19hLnZhbFswXSwgKGludDh4MTZfdClfX2EudmFsWzFdLCAoaW50OHgxNl90KV9fYS52YWxbMl0sIChpbnQ4eDE2X3QpX19iLCA0OCk7IH0KLV9fYWkgaW50OHgxNl90IHZxdGJsM3FfczgoaW50OHgxNngzX3QgX19hLCBpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAoaW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZxdGJsM3FfdihfX2EudmFsWzBdLCBfX2EudmFsWzFdLCBfX2EudmFsWzJdLCBfX2IsIDMyKTsgfQotX19haSBwb2x5OHgxNl90IHZxdGJsM3FfcDgocG9seTh4MTZ4M190IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIChwb2x5OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZxdGJsM3FfdigoaW50OHgxNl90KV9fYS52YWxbMF0sIChpbnQ4eDE2X3QpX19hLnZhbFsxXSwgKGludDh4MTZfdClfX2EudmFsWzJdLCAoaW50OHgxNl90KV9fYiwgMzYpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZxdGJsNF91OCh1aW50OHgxNng0X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxdGJsNF92KChpbnQ4eDE2X3QpX19hLnZhbFswXSwgKGludDh4MTZfdClfX2EudmFsWzFdLCAoaW50OHgxNl90KV9fYS52YWxbMl0sIChpbnQ4eDE2X3QpX19hLnZhbFszXSwgKGludDh4OF90KV9fYiwgMTYpOyB9Ci1fX2FpIGludDh4OF90IHZxdGJsNF9zOChpbnQ4eDE2eDRfdCBfX2EsIGludDh4OF90IF9fYikgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxdGJsNF92KF9fYS52YWxbMF0sIF9fYS52YWxbMV0sIF9fYS52YWxbMl0sIF9fYS52YWxbM10sIF9fYiwgMCk7IH0KLV9fYWkgcG9seTh4OF90IHZxdGJsNF9wOChwb2x5OHgxNng0X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiAocG9seTh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxdGJsNF92KChpbnQ4eDE2X3QpX19hLnZhbFswXSwgKGludDh4MTZfdClfX2EudmFsWzFdLCAoaW50OHgxNl90KV9fYS52YWxbMl0sIChpbnQ4eDE2X3QpX19hLnZhbFszXSwgKGludDh4OF90KV9fYiwgNCk7IH0KLV9fYWkgdWludDh4MTZfdCB2cXRibDRxX3U4KHVpbnQ4eDE2eDRfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cXRibDRxX3YoKGludDh4MTZfdClfX2EudmFsWzBdLCAoaW50OHgxNl90KV9fYS52YWxbMV0sIChpbnQ4eDE2X3QpX19hLnZhbFsyXSwgKGludDh4MTZfdClfX2EudmFsWzNdLCAoaW50OHgxNl90KV9fYiwgNDgpOyB9Ci1fX2FpIGludDh4MTZfdCB2cXRibDRxX3M4KGludDh4MTZ4NF90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cXRibDRxX3YoX19hLnZhbFswXSwgX19hLnZhbFsxXSwgX19hLnZhbFsyXSwgX19hLnZhbFszXSwgX19iLCAzMik7IH0KLV9fYWkgcG9seTh4MTZfdCB2cXRibDRxX3A4KHBvbHk4eDE2eDRfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2J1aWx0aW5fbmVvbl92cXRibDRxX3YoKGludDh4MTZfdClfX2EudmFsWzBdLCAoaW50OHgxNl90KV9fYS52YWxbMV0sIChpbnQ4eDE2X3QpX19hLnZhbFsyXSwgKGludDh4MTZfdClfX2EudmFsWzNdLCAoaW50OHgxNl90KV9fYiwgMzYpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZxdGJ4MV91OCh1aW50OHg4X3QgX19hLCB1aW50OHgxNl90IF9fYiwgdWludDh4OF90IF9fYykgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cXRieDFfdigoaW50OHg4X3QpX19hLCAoaW50OHgxNl90KV9fYiwgKGludDh4OF90KV9fYywgMTYpOyB9Ci1fX2FpIGludDh4OF90IHZxdGJ4MV9zOChpbnQ4eDhfdCBfX2EsIGludDh4MTZfdCBfX2IsIGludDh4OF90IF9fYykgewotICByZXR1cm4gKGludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxdGJ4MV92KF9fYSwgX19iLCBfX2MsIDApOyB9Ci1fX2FpIHBvbHk4eDhfdCB2cXRieDFfcDgocG9seTh4OF90IF9fYSwgcG9seTh4MTZfdCBfX2IsIHVpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIChwb2x5OHg4X3QpX19idWlsdGluX25lb25fdnF0YngxX3YoKGludDh4OF90KV9fYSwgKGludDh4MTZfdClfX2IsIChpbnQ4eDhfdClfX2MsIDQpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnF0YngxcV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZfdCBfX2IsIHVpbnQ4eDE2X3QgX19jKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cXRieDFxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAoaW50OHgxNl90KV9fYywgNDgpOyB9Ci1fX2FpIGludDh4MTZfdCB2cXRieDFxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IsIGludDh4MTZfdCBfX2MpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnF0YngxcV92KF9fYSwgX19iLCBfX2MsIDMyKTsgfQotX19haSBwb2x5OHgxNl90IHZxdGJ4MXFfcDgocG9seTh4MTZfdCBfX2EsIHBvbHk4eDE2X3QgX19iLCB1aW50OHgxNl90IF9fYykgewotICByZXR1cm4gKHBvbHk4eDE2X3QpX19idWlsdGluX25lb25fdnF0YngxcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgKGludDh4MTZfdClfX2MsIDM2KTsgfQotCi1fX2FpIHVpbnQ4eDhfdCB2cXRieDJfdTgodWludDh4OF90IF9fYSwgdWludDh4MTZ4Ml90IF9fYiwgdWludDh4OF90IF9fYykgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cXRieDJfdigoaW50OHg4X3QpX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYywgMTYpOyB9Ci1fX2FpIGludDh4OF90IHZxdGJ4Ml9zOChpbnQ4eDhfdCBfX2EsIGludDh4MTZ4Ml90IF9fYiwgaW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnF0YngyX3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2MsIDApOyB9Ci1fX2FpIHBvbHk4eDhfdCB2cXRieDJfcDgocG9seTh4OF90IF9fYSwgcG9seTh4MTZ4Ml90IF9fYiwgdWludDh4OF90IF9fYykgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2J1aWx0aW5fbmVvbl92cXRieDJfdigoaW50OHg4X3QpX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4OF90KV9fYywgNCk7IH0KLV9fYWkgdWludDh4MTZfdCB2cXRieDJxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNngyX3QgX19iLCB1aW50OHgxNl90IF9fYykgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnF0YngycV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2MsIDQ4KTsgfQotX19haSBpbnQ4eDE2X3QgdnF0YngycV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2eDJfdCBfX2IsIGludDh4MTZfdCBfX2MpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnF0YngycV92KF9fYSwgX19iLnZhbFswXSwgX19iLnZhbFsxXSwgX19jLCAzMik7IH0KLV9fYWkgcG9seTh4MTZfdCB2cXRieDJxX3A4KHBvbHk4eDE2X3QgX19hLCBwb2x5OHgxNngyX3QgX19iLCB1aW50OHgxNl90IF9fYykgewotICByZXR1cm4gKHBvbHk4eDE2X3QpX19idWlsdGluX25lb25fdnF0YngycV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2MsIDM2KTsgfQotCi1fX2FpIHVpbnQ4eDhfdCB2cXRieDNfdTgodWludDh4OF90IF9fYSwgdWludDh4MTZ4M190IF9fYiwgdWludDh4OF90IF9fYykgewotICByZXR1cm4gKHVpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cXRieDNfdigoaW50OHg4X3QpX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHg4X3QpX19jLCAxNik7IH0KLV9fYWkgaW50OHg4X3QgdnF0YngzX3M4KGludDh4OF90IF9fYSwgaW50OHgxNngzX3QgX19iLCBpbnQ4eDhfdCBfX2MpIHsKLSAgcmV0dXJuIChpbnQ4eDhfdClfX2J1aWx0aW5fbmVvbl92cXRieDNfdihfX2EsIF9fYi52YWxbMF0sIF9fYi52YWxbMV0sIF9fYi52YWxbMl0sIF9fYywgMCk7IH0KLV9fYWkgcG9seTh4OF90IHZxdGJ4M19wOChwb2x5OHg4X3QgX19hLCBwb2x5OHgxNngzX3QgX19iLCB1aW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiAocG9seTh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxdGJ4M192KChpbnQ4eDhfdClfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDhfdClfX2MsIDQpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnF0YngzcV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZ4M190IF9fYiwgdWludDh4MTZfdCBfX2MpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZxdGJ4M3FfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2MsIDQ4KTsgfQotX19haSBpbnQ4eDE2X3QgdnF0YngzcV9zOChpbnQ4eDE2X3QgX19hLCBpbnQ4eDE2eDNfdCBfX2IsIGludDh4MTZfdCBfX2MpIHsKLSAgcmV0dXJuIChpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdnF0YngzcV92KF9fYSwgX19iLnZhbFswXSwgX19iLnZhbFsxXSwgX19iLnZhbFsyXSwgX19jLCAzMik7IH0KLV9fYWkgcG9seTh4MTZfdCB2cXRieDNxX3A4KHBvbHk4eDE2X3QgX19hLCBwb2x5OHgxNngzX3QgX19iLCB1aW50OHgxNl90IF9fYykgewotICByZXR1cm4gKHBvbHk4eDE2X3QpX19idWlsdGluX25lb25fdnF0YngzcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYywgMzYpOyB9Ci0KLV9fYWkgdWludDh4OF90IHZxdGJ4NF91OCh1aW50OHg4X3QgX19hLCB1aW50OHgxNng0X3QgX19iLCB1aW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiAodWludDh4OF90KV9fYnVpbHRpbl9uZW9uX3ZxdGJ4NF92KChpbnQ4eDhfdClfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgKGludDh4OF90KV9fYywgMTYpOyB9Ci1fX2FpIGludDh4OF90IHZxdGJ4NF9zOChpbnQ4eDhfdCBfX2EsIGludDh4MTZ4NF90IF9fYiwgaW50OHg4X3QgX19jKSB7Ci0gIHJldHVybiAoaW50OHg4X3QpX19idWlsdGluX25lb25fdnF0Yng0X3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCBfX2IudmFsWzNdLCBfX2MsIDApOyB9Ci1fX2FpIHBvbHk4eDhfdCB2cXRieDRfcDgocG9seTh4OF90IF9fYSwgcG9seTh4MTZ4NF90IF9fYiwgdWludDh4OF90IF9fYykgewotICByZXR1cm4gKHBvbHk4eDhfdClfX2J1aWx0aW5fbmVvbl92cXRieDRfdigoaW50OHg4X3QpX19hLCAoaW50OHgxNl90KV9fYi52YWxbMF0sIChpbnQ4eDE2X3QpX19iLnZhbFsxXSwgKGludDh4MTZfdClfX2IudmFsWzJdLCAoaW50OHgxNl90KV9fYi52YWxbM10sIChpbnQ4eDhfdClfX2MsIDQpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnF0Yng0cV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZ4NF90IF9fYiwgdWludDh4MTZfdCBfX2MpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZxdGJ4NHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IudmFsWzBdLCAoaW50OHgxNl90KV9fYi52YWxbMV0sIChpbnQ4eDE2X3QpX19iLnZhbFsyXSwgKGludDh4MTZfdClfX2IudmFsWzNdLCAoaW50OHgxNl90KV9fYywgNDgpOyB9Ci1fX2FpIGludDh4MTZfdCB2cXRieDRxX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZ4NF90IF9fYiwgaW50OHgxNl90IF9fYykgewotICByZXR1cm4gKGludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92cXRieDRxX3YoX19hLCBfX2IudmFsWzBdLCBfX2IudmFsWzFdLCBfX2IudmFsWzJdLCBfX2IudmFsWzNdLCBfX2MsIDMyKTsgfQotX19haSBwb2x5OHgxNl90IHZxdGJ4NHFfcDgocG9seTh4MTZfdCBfX2EsIHBvbHk4eDE2eDRfdCBfX2IsIHVpbnQ4eDE2X3QgX19jKSB7Ci0gIHJldHVybiAocG9seTh4MTZfdClfX2J1aWx0aW5fbmVvbl92cXRieDRxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLnZhbFswXSwgKGludDh4MTZfdClfX2IudmFsWzFdLCAoaW50OHgxNl90KV9fYi52YWxbMl0sIChpbnQ4eDE2X3QpX19iLnZhbFszXSwgKGludDh4MTZfdClfX2MsIDM2KTsgfQotCi1fX2FpIGludDh4MTZfdCB2cmFkZGhuX2hpZ2hfczE2KGludDh4OF90IF9fYSwgaW50MTZ4OF90IF9fYiwgaW50MTZ4OF90IF9fYykgewotICByZXR1cm4gdmNvbWJpbmVfczgoX19hLCB2cmFkZGhuX3MxNihfX2IsIF9fYykpOyB9Ci1fX2FpIGludDE2eDhfdCB2cmFkZGhuX2hpZ2hfczMyKGludDE2eDRfdCBfX2EsIGludDMyeDRfdCBfX2IsIGludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuIHZjb21iaW5lX3MxNihfX2EsIHZyYWRkaG5fczMyKF9fYiwgX19jKSk7IH0KLV9fYWkgaW50MzJ4NF90IHZyYWRkaG5faGlnaF9zNjQoaW50MzJ4Ml90IF9fYSwgaW50NjR4Ml90IF9fYiwgaW50NjR4Ml90IF9fYykgewotICByZXR1cm4gdmNvbWJpbmVfczMyKF9fYSwgdnJhZGRobl9zNjQoX19iLCBfX2MpKTsgfQotX19haSB1aW50OHgxNl90IHZyYWRkaG5faGlnaF91MTYodWludDh4OF90IF9fYSwgdWludDE2eDhfdCBfX2IsIHVpbnQxNng4X3QgX19jKSB7Ci0gIHJldHVybiB2Y29tYmluZV91OChfX2EsIHZyYWRkaG5fdTE2KF9fYiwgX19jKSk7IH0KLV9fYWkgdWludDE2eDhfdCB2cmFkZGhuX2hpZ2hfdTMyKHVpbnQxNng0X3QgX19hLCB1aW50MzJ4NF90IF9fYiwgdWludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuIHZjb21iaW5lX3UxNihfX2EsIHZyYWRkaG5fdTMyKF9fYiwgX19jKSk7IH0KLV9fYWkgdWludDMyeDRfdCB2cmFkZGhuX2hpZ2hfdTY0KHVpbnQzMngyX3QgX19hLCB1aW50NjR4Ml90IF9fYiwgdWludDY0eDJfdCBfX2MpIHsKLSAgcmV0dXJuIHZjb21iaW5lX3UzMihfX2EsIHZyYWRkaG5fdTY0KF9fYiwgX19jKSk7IH0KLQotX19haSBpbnQ4eDE2X3QgdnJzdWJobl9oaWdoX3MxNihpbnQ4eDhfdCBfX2EsIGludDE2eDhfdCBfX2IsIGludDE2eDhfdCBfX2MpIHsKLSAgcmV0dXJuIHZjb21iaW5lX3M4KF9fYSwgdnJzdWJobl9zMTYoX19iLCBfX2MpKTsgfQotX19haSBpbnQxNng4X3QgdnJzdWJobl9oaWdoX3MzMihpbnQxNng0X3QgX19hLCBpbnQzMng0X3QgX19iLCBpbnQzMng0X3QgX19jKSB7Ci0gIHJldHVybiB2Y29tYmluZV9zMTYoX19hLCB2cnN1YmhuX3MzMihfX2IsIF9fYykpOyB9Ci1fX2FpIGludDMyeDRfdCB2cnN1YmhuX2hpZ2hfczY0KGludDMyeDJfdCBfX2EsIGludDY0eDJfdCBfX2IsIGludDY0eDJfdCBfX2MpIHsKLSAgcmV0dXJuIHZjb21iaW5lX3MzMihfX2EsIHZyc3ViaG5fczY0KF9fYiwgX19jKSk7IH0KLV9fYWkgdWludDh4MTZfdCB2cnN1YmhuX2hpZ2hfdTE2KHVpbnQ4eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iLCB1aW50MTZ4OF90IF9fYykgewotICByZXR1cm4gdmNvbWJpbmVfdTgoX19hLCB2cnN1YmhuX3UxNihfX2IsIF9fYykpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdnJzdWJobl9oaWdoX3UzMih1aW50MTZ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IsIHVpbnQzMng0X3QgX19jKSB7Ci0gIHJldHVybiB2Y29tYmluZV91MTYoX19hLCB2cnN1YmhuX3UzMihfX2IsIF9fYykpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnJzdWJobl9oaWdoX3U2NCh1aW50MzJ4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IsIHVpbnQ2NHgyX3QgX19jKSB7Ci0gIHJldHVybiB2Y29tYmluZV91MzIoX19hLCB2cnN1YmhuX3U2NChfX2IsIF9fYykpOyB9Ci0KLV9fYWkgaW50OHgxNl90IHZzdWJobl9oaWdoX3MxNihpbnQ4eDhfdCBfX2EsIGludDE2eDhfdCBfX2IsIGludDE2eDhfdCBfX2MpIHsKLSAgcmV0dXJuIHZjb21iaW5lX3M4KF9fYSwgdnN1YmhuX3MxNihfX2IsIF9fYykpOyB9Ci1fX2FpIGludDE2eDhfdCB2c3ViaG5faGlnaF9zMzIoaW50MTZ4NF90IF9fYSwgaW50MzJ4NF90IF9fYiwgaW50MzJ4NF90IF9fYykgewotICByZXR1cm4gdmNvbWJpbmVfczE2KF9fYSwgdnN1YmhuX3MzMihfX2IsIF9fYykpOyB9Ci1fX2FpIGludDMyeDRfdCB2c3ViaG5faGlnaF9zNjQoaW50MzJ4Ml90IF9fYSwgaW50NjR4Ml90IF9fYiwgaW50NjR4Ml90IF9fYykgewotICByZXR1cm4gdmNvbWJpbmVfczMyKF9fYSwgdnN1YmhuX3M2NChfX2IsIF9fYykpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnN1YmhuX2hpZ2hfdTE2KHVpbnQ4eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iLCB1aW50MTZ4OF90IF9fYykgewotICByZXR1cm4gdmNvbWJpbmVfdTgoX19hLCB2c3ViaG5fdTE2KF9fYiwgX19jKSk7IH0KLV9fYWkgdWludDE2eDhfdCB2c3ViaG5faGlnaF91MzIodWludDE2eDRfdCBfX2EsIHVpbnQzMng0X3QgX19iLCB1aW50MzJ4NF90IF9fYykgewotICByZXR1cm4gdmNvbWJpbmVfdTE2KF9fYSwgdnN1YmhuX3UzMihfX2IsIF9fYykpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnN1YmhuX2hpZ2hfdTY0KHVpbnQzMngyX3QgX19hLCB1aW50NjR4Ml90IF9fYiwgdWludDY0eDJfdCBfX2MpIHsKLSAgcmV0dXJuIHZjb21iaW5lX3UzMihfX2EsIHZzdWJobl91NjQoX19iLCBfX2MpKTsgfQotCi1fX2FpIGludDE2eDhfdCB2c3VibF9oaWdoX3M4KGludDh4MTZfdCBfX2EsIGludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIHZtb3ZsX2hpZ2hfczgoX19hKSAtIHZtb3ZsX2hpZ2hfczgoX19iKTsgfQotX19haSBpbnQzMng0X3QgdnN1YmxfaGlnaF9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gdm1vdmxfaGlnaF9zMTYoX19hKSAtIHZtb3ZsX2hpZ2hfczE2KF9fYik7IH0KLV9fYWkgaW50NjR4Ml90IHZzdWJsX2hpZ2hfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIHZtb3ZsX2hpZ2hfczMyKF9fYSkgLSB2bW92bF9oaWdoX3MzMihfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdnN1YmxfaGlnaF91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIHZtb3ZsX2hpZ2hfdTgoX19hKSAtIHZtb3ZsX2hpZ2hfdTgoX19iKTsgfQotX19haSB1aW50MzJ4NF90IHZzdWJsX2hpZ2hfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gdm1vdmxfaGlnaF91MTYoX19hKSAtIHZtb3ZsX2hpZ2hfdTE2KF9fYik7IH0KLV9fYWkgdWludDY0eDJfdCB2c3VibF9oaWdoX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIHZtb3ZsX2hpZ2hfdTMyKF9fYSkgLSB2bW92bF9oaWdoX3UzMihfX2IpOyB9Ci0KLV9fYWkgaW50MTZ4OF90IHZzdWJ3X2hpZ2hfczgoaW50MTZ4OF90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19hIC0gdm1vdmxfaGlnaF9zOChfX2IpOyB9Ci1fX2FpIGludDMyeDRfdCB2c3Vid19oaWdoX3MxNihpbnQzMng0X3QgX19hLCBpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgLSB2bW92bF9oaWdoX3MxNihfX2IpOyB9Ci1fX2FpIGludDY0eDJfdCB2c3Vid19oaWdoX3MzMihpbnQ2NHgyX3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2EgLSB2bW92bF9oaWdoX3MzMihfX2IpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdnN1YndfaGlnaF91OCh1aW50MTZ4OF90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYSAtIHZtb3ZsX2hpZ2hfdTgoX19iKTsgfQotX19haSB1aW50MzJ4NF90IHZzdWJ3X2hpZ2hfdTE2KHVpbnQzMng0X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19hIC0gdm1vdmxfaGlnaF91MTYoX19iKTsgfQotX19haSB1aW50NjR4Ml90IHZzdWJ3X2hpZ2hfdTMyKHVpbnQ2NHgyX3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19hIC0gdm1vdmxfaGlnaF91MzIoX19iKTsgfQotCi1fX2FpIGludDh4OF90IHZ0cm4xX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgOCwgMiwgMTAsIDQsIDEyLCA2LCAxNCk7IH0KLV9fYWkgaW50MTZ4NF90IHZ0cm4xX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgNCwgMiwgNik7IH0KLV9fYWkgaW50MzJ4Ml90IHZ0cm4xX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMik7IH0KLV9fYWkgdWludDh4OF90IHZ0cm4xX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCA4LCAyLCAxMCwgNCwgMTIsIDYsIDE0KTsgfQotX19haSB1aW50MTZ4NF90IHZ0cm4xX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCA0LCAyLCA2KTsgfQotX19haSB1aW50MzJ4Ml90IHZ0cm4xX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotX19haSBmbG9hdDMyeDJfdCB2dHJuMV9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotX19haSBwb2x5OHg4X3QgdnRybjFfcDgocG9seTh4OF90IF9fYSwgcG9seTh4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDgsIDIsIDEwLCA0LCAxMiwgNiwgMTQpOyB9Ci1fX2FpIHBvbHkxNng0X3QgdnRybjFfcDE2KHBvbHkxNng0X3QgX19hLCBwb2x5MTZ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDQsIDIsIDYpOyB9Ci1fX2FpIGludDh4MTZfdCB2dHJuMXFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDE2LCAyLCAxOCwgNCwgMjAsIDYsIDIyLCA4LCAyNCwgMTAsIDI2LCAxMiwgMjgsIDE0LCAzMCk7IH0KLV9fYWkgaW50MTZ4OF90IHZ0cm4xcV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDgsIDIsIDEwLCA0LCAxMiwgNiwgMTQpOyB9Ci1fX2FpIGludDMyeDRfdCB2dHJuMXFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCA0LCAyLCA2KTsgfQotX19haSBpbnQ2NHgyX3QgdnRybjFxX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMik7IH0KLV9fYWkgdWludDh4MTZfdCB2dHJuMXFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMTYsIDIsIDE4LCA0LCAyMCwgNiwgMjIsIDgsIDI0LCAxMCwgMjYsIDEyLCAyOCwgMTQsIDMwKTsgfQotX19haSB1aW50MTZ4OF90IHZ0cm4xcV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgOCwgMiwgMTAsIDQsIDEyLCA2LCAxNCk7IH0KLV9fYWkgdWludDMyeDRfdCB2dHJuMXFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDQsIDIsIDYpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnRybjFxX3U2NCh1aW50NjR4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotX19haSBmbG9hdDMyeDRfdCB2dHJuMXFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgNCwgMiwgNik7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnRybjFxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDIpOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdnRybjFxX3A4KHBvbHk4eDE2X3QgX19hLCBwb2x5OHgxNl90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDE2LCAyLCAxOCwgNCwgMjAsIDYsIDIyLCA4LCAyNCwgMTAsIDI2LCAxMiwgMjgsIDE0LCAzMCk7IH0KLV9fYWkgcG9seTE2eDhfdCB2dHJuMXFfcDE2KHBvbHkxNng4X3QgX19hLCBwb2x5MTZ4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDgsIDIsIDEwLCA0LCAxMiwgNiwgMTQpOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnRybjFxX3A2NChwb2x5NjR4Ml90IF9fYSwgcG9seTY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotCi1fX2FpIGludDh4OF90IHZ0cm4yX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgOSwgMywgMTEsIDUsIDEzLCA3LCAxNSk7IH0KLV9fYWkgaW50MTZ4NF90IHZ0cm4yX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgNSwgMywgNyk7IH0KLV9fYWkgaW50MzJ4Ml90IHZ0cm4yX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgMyk7IH0KLV9fYWkgdWludDh4OF90IHZ0cm4yX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCA5LCAzLCAxMSwgNSwgMTMsIDcsIDE1KTsgfQotX19haSB1aW50MTZ4NF90IHZ0cm4yX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCA1LCAzLCA3KTsgfQotX19haSB1aW50MzJ4Ml90IHZ0cm4yX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzKTsgfQotX19haSBmbG9hdDMyeDJfdCB2dHJuMl9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzKTsgfQotX19haSBwb2x5OHg4X3QgdnRybjJfcDgocG9seTh4OF90IF9fYSwgcG9seTh4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDksIDMsIDExLCA1LCAxMywgNywgMTUpOyB9Ci1fX2FpIHBvbHkxNng0X3QgdnRybjJfcDE2KHBvbHkxNng0X3QgX19hLCBwb2x5MTZ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDUsIDMsIDcpOyB9Ci1fX2FpIGludDh4MTZfdCB2dHJuMnFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDE3LCAzLCAxOSwgNSwgMjEsIDcsIDIzLCA5LCAyNSwgMTEsIDI3LCAxMywgMjksIDE1LCAzMSk7IH0KLV9fYWkgaW50MTZ4OF90IHZ0cm4ycV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDksIDMsIDExLCA1LCAxMywgNywgMTUpOyB9Ci1fX2FpIGludDMyeDRfdCB2dHJuMnFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCA1LCAzLCA3KTsgfQotX19haSBpbnQ2NHgyX3QgdnRybjJxX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgMyk7IH0KLV9fYWkgdWludDh4MTZfdCB2dHJuMnFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgMTcsIDMsIDE5LCA1LCAyMSwgNywgMjMsIDksIDI1LCAxMSwgMjcsIDEzLCAyOSwgMTUsIDMxKTsgfQotX19haSB1aW50MTZ4OF90IHZ0cm4ycV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgOSwgMywgMTEsIDUsIDEzLCA3LCAxNSk7IH0KLV9fYWkgdWludDMyeDRfdCB2dHJuMnFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDUsIDMsIDcpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnRybjJxX3U2NCh1aW50NjR4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzKTsgfQotX19haSBmbG9hdDMyeDRfdCB2dHJuMnFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgNSwgMywgNyk7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnRybjJxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMpOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdnRybjJxX3A4KHBvbHk4eDE2X3QgX19hLCBwb2x5OHgxNl90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDE3LCAzLCAxOSwgNSwgMjEsIDcsIDIzLCA5LCAyNSwgMTEsIDI3LCAxMywgMjksIDE1LCAzMSk7IH0KLV9fYWkgcG9seTE2eDhfdCB2dHJuMnFfcDE2KHBvbHkxNng4X3QgX19hLCBwb2x5MTZ4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDksIDMsIDExLCA1LCAxMywgNywgMTUpOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnRybjJxX3A2NChwb2x5NjR4Ml90IF9fYSwgcG9seTY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzKTsgfQotCi1fX2FpIGludDh4OF90IHZ1enAxX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCk7IH0KLV9fYWkgaW50MTZ4NF90IHZ1enAxX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMiwgNCwgNik7IH0KLV9fYWkgaW50MzJ4Ml90IHZ1enAxX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMik7IH0KLV9fYWkgdWludDh4OF90IHZ1enAxX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0KTsgfQotX19haSB1aW50MTZ4NF90IHZ1enAxX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyLCA0LCA2KTsgfQotX19haSB1aW50MzJ4Ml90IHZ1enAxX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotX19haSBmbG9hdDMyeDJfdCB2dXpwMV9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotX19haSBwb2x5OHg4X3QgdnV6cDFfcDgocG9seTh4OF90IF9fYSwgcG9seTh4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQpOyB9Ci1fX2FpIHBvbHkxNng0X3QgdnV6cDFfcDE2KHBvbHkxNng0X3QgX19hLCBwb2x5MTZ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDIsIDQsIDYpOyB9Ci1fX2FpIGludDh4MTZfdCB2dXpwMXFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4LCAzMCk7IH0KLV9fYWkgaW50MTZ4OF90IHZ1enAxcV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQpOyB9Ci1fX2FpIGludDMyeDRfdCB2dXpwMXFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyLCA0LCA2KTsgfQotX19haSBpbnQ2NHgyX3QgdnV6cDFxX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMik7IH0KLV9fYWkgdWludDh4MTZfdCB2dXpwMXFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwgMTYsIDE4LCAyMCwgMjIsIDI0LCAyNiwgMjgsIDMwKTsgfQotX19haSB1aW50MTZ4OF90IHZ1enAxcV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCk7IH0KLV9fYWkgdWludDMyeDRfdCB2dXpwMXFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDIsIDQsIDYpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnV6cDFxX3U2NCh1aW50NjR4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotX19haSBmbG9hdDMyeDRfdCB2dXpwMXFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMiwgNCwgNik7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnV6cDFxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDIpOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdnV6cDFxX3A4KHBvbHk4eDE2X3QgX19hLCBwb2x5OHgxNl90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4LCAzMCk7IH0KLV9fYWkgcG9seTE2eDhfdCB2dXpwMXFfcDE2KHBvbHkxNng4X3QgX19hLCBwb2x5MTZ4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQpOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnV6cDFxX3A2NChwb2x5NjR4Ml90IF9fYSwgcG9seTY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotCi1fX2FpIGludDh4OF90IHZ1enAyX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSk7IH0KLV9fYWkgaW50MTZ4NF90IHZ1enAyX3MxNihpbnQxNng0X3QgX19hLCBpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgMywgNSwgNyk7IH0KLV9fYWkgaW50MzJ4Ml90IHZ1enAyX3MzMihpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgMyk7IH0KLV9fYWkgdWludDh4OF90IHZ1enAyX3U4KHVpbnQ4eDhfdCBfX2EsIHVpbnQ4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1KTsgfQotX19haSB1aW50MTZ4NF90IHZ1enAyX3UxNih1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzLCA1LCA3KTsgfQotX19haSB1aW50MzJ4Ml90IHZ1enAyX3UzMih1aW50MzJ4Ml90IF9fYSwgdWludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzKTsgfQotX19haSBmbG9hdDMyeDJfdCB2dXpwMl9mMzIoZmxvYXQzMngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzKTsgfQotX19haSBwb2x5OHg4X3QgdnV6cDJfcDgocG9seTh4OF90IF9fYSwgcG9seTh4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUpOyB9Ci1fX2FpIHBvbHkxNng0X3QgdnV6cDJfcDE2KHBvbHkxNng0X3QgX19hLCBwb2x5MTZ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMsIDUsIDcpOyB9Ci1fX2FpIGludDh4MTZfdCB2dXpwMnFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LCAzMSk7IH0KLV9fYWkgaW50MTZ4OF90IHZ1enAycV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUpOyB9Ci1fX2FpIGludDMyeDRfdCB2dXpwMnFfczMyKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzLCA1LCA3KTsgfQotX19haSBpbnQ2NHgyX3QgdnV6cDJxX3M2NChpbnQ2NHgyX3QgX19hLCBpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgMyk7IH0KLV9fYWkgdWludDh4MTZfdCB2dXpwMnFfdTgodWludDh4MTZfdCBfX2EsIHVpbnQ4eDE2X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMSwgMjMsIDI1LCAyNywgMjksIDMxKTsgfQotX19haSB1aW50MTZ4OF90IHZ1enAycV91MTYodWludDE2eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgMywgNSwgNywgOSwgMTEsIDEzLCAxNSk7IH0KLV9fYWkgdWludDMyeDRfdCB2dXpwMnFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMsIDUsIDcpOyB9Ci1fX2FpIHVpbnQ2NHgyX3QgdnV6cDJxX3U2NCh1aW50NjR4Ml90IF9fYSwgdWludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzKTsgfQotX19haSBmbG9hdDMyeDRfdCB2dXpwMnFfZjMyKGZsb2F0MzJ4NF90IF9fYSwgZmxvYXQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgMywgNSwgNyk7IH0KLV9fYWkgZmxvYXQ2NHgyX3QgdnV6cDJxX2Y2NChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjR4Ml90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMpOyB9Ci1fX2FpIHBvbHk4eDE2X3QgdnV6cDJxX3A4KHBvbHk4eDE2X3QgX19hLCBwb2x5OHgxNl90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LCAzMSk7IH0KLV9fYWkgcG9seTE2eDhfdCB2dXpwMnFfcDE2KHBvbHkxNng4X3QgX19hLCBwb2x5MTZ4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMsIDUsIDcsIDksIDExLCAxMywgMTUpOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnV6cDJxX3A2NChwb2x5NjR4Ml90IF9fYSwgcG9seTY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzKTsgfQotCi1fX2FpIGludDh4OF90IHZ6aXAxX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgOCwgMSwgOSwgMiwgMTAsIDMsIDExKTsgfQotX19haSBpbnQxNng0X3QgdnppcDFfczE2KGludDE2eDRfdCBfX2EsIGludDE2eDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCA0LCAxLCA1KTsgfQotX19haSBpbnQzMngyX3QgdnppcDFfczMyKGludDMyeDJfdCBfX2EsIGludDMyeDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotX19haSB1aW50OHg4X3QgdnppcDFfdTgodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDgsIDEsIDksIDIsIDEwLCAzLCAxMSk7IH0KLV9fYWkgdWludDE2eDRfdCB2emlwMV91MTYodWludDE2eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgNCwgMSwgNSk7IH0KLV9fYWkgdWludDMyeDJfdCB2emlwMV91MzIodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMik7IH0KLV9fYWkgZmxvYXQzMngyX3QgdnppcDFfZjMyKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMngyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMik7IH0KLV9fYWkgcG9seTh4OF90IHZ6aXAxX3A4KHBvbHk4eDhfdCBfX2EsIHBvbHk4eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCA4LCAxLCA5LCAyLCAxMCwgMywgMTEpOyB9Ci1fX2FpIHBvbHkxNng0X3QgdnppcDFfcDE2KHBvbHkxNng0X3QgX19hLCBwb2x5MTZ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDQsIDEsIDUpOyB9Ci1fX2FpIGludDh4MTZfdCB2emlwMXFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDE2LCAxLCAxNywgMiwgMTgsIDMsIDE5LCA0LCAyMCwgNSwgMjEsIDYsIDIyLCA3LCAyMyk7IH0KLV9fYWkgaW50MTZ4OF90IHZ6aXAxcV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDgsIDEsIDksIDIsIDEwLCAzLCAxMSk7IH0KLV9fYWkgaW50MzJ4NF90IHZ6aXAxcV9zMzIoaW50MzJ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDQsIDEsIDUpOyB9Ci1fX2FpIGludDY0eDJfdCB2emlwMXFfczY0KGludDY0eDJfdCBfX2EsIGludDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotX19haSB1aW50OHgxNl90IHZ6aXAxcV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAxNiwgMSwgMTcsIDIsIDE4LCAzLCAxOSwgNCwgMjAsIDUsIDIxLCA2LCAyMiwgNywgMjMpOyB9Ci1fX2FpIHVpbnQxNng4X3QgdnppcDFxX3UxNih1aW50MTZ4OF90IF9fYSwgdWludDE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCA4LCAxLCA5LCAyLCAxMCwgMywgMTEpOyB9Ci1fX2FpIHVpbnQzMng0X3QgdnppcDFxX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCA0LCAxLCA1KTsgfQotX19haSB1aW50NjR4Ml90IHZ6aXAxcV91NjQodWludDY0eDJfdCBfX2EsIHVpbnQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMCwgMik7IH0KLV9fYWkgZmxvYXQzMng0X3QgdnppcDFxX2YzMihmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDAsIDQsIDEsIDUpOyB9Ci1fX2FpIGZsb2F0NjR4Ml90IHZ6aXAxcV9mNjQoZmxvYXQ2NHgyX3QgX19hLCBmbG9hdDY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotX19haSBwb2x5OHgxNl90IHZ6aXAxcV9wOChwb2x5OHgxNl90IF9fYSwgcG9seTh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAxNiwgMSwgMTcsIDIsIDE4LCAzLCAxOSwgNCwgMjAsIDUsIDIxLCA2LCAyMiwgNywgMjMpOyB9Ci1fX2FpIHBvbHkxNng4X3QgdnppcDFxX3AxNihwb2x5MTZ4OF90IF9fYSwgcG9seTE2eDhfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCA4LCAxLCA5LCAyLCAxMCwgMywgMTEpOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnppcDFxX3A2NChwb2x5NjR4Ml90IF9fYSwgcG9seTY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAwLCAyKTsgfQotCi1fX2FpIGludDh4OF90IHZ6aXAyX3M4KGludDh4OF90IF9fYSwgaW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgNCwgMTIsIDUsIDEzLCA2LCAxNCwgNywgMTUpOyB9Ci1fX2FpIGludDE2eDRfdCB2emlwMl9zMTYoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDIsIDYsIDMsIDcpOyB9Ci1fX2FpIGludDMyeDJfdCB2emlwMl9zMzIoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMpOyB9Ci1fX2FpIHVpbnQ4eDhfdCB2emlwMl91OCh1aW50OHg4X3QgX19hLCB1aW50OHg4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgNCwgMTIsIDUsIDEzLCA2LCAxNCwgNywgMTUpOyB9Ci1fX2FpIHVpbnQxNng0X3QgdnppcDJfdTE2KHVpbnQxNng0X3QgX19hLCB1aW50MTZ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDIsIDYsIDMsIDcpOyB9Ci1fX2FpIHVpbnQzMngyX3QgdnppcDJfdTMyKHVpbnQzMngyX3QgX19hLCB1aW50MzJ4Ml90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMpOyB9Ci1fX2FpIGZsb2F0MzJ4Ml90IHZ6aXAyX2YzMihmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4Ml90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMpOyB9Ci1fX2FpIHBvbHk4eDhfdCB2emlwMl9wOChwb2x5OHg4X3QgX19hLCBwb2x5OHg4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgNCwgMTIsIDUsIDEzLCA2LCAxNCwgNywgMTUpOyB9Ci1fX2FpIHBvbHkxNng0X3QgdnppcDJfcDE2KHBvbHkxNng0X3QgX19hLCBwb2x5MTZ4NF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDIsIDYsIDMsIDcpOyB9Ci1fX2FpIGludDh4MTZfdCB2emlwMnFfczgoaW50OHgxNl90IF9fYSwgaW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDgsIDI0LCA5LCAyNSwgMTAsIDI2LCAxMSwgMjcsIDEyLCAyOCwgMTMsIDI5LCAxNCwgMzAsIDE1LCAzMSk7IH0KLV9fYWkgaW50MTZ4OF90IHZ6aXAycV9zMTYoaW50MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDQsIDEyLCA1LCAxMywgNiwgMTQsIDcsIDE1KTsgfQotX19haSBpbnQzMng0X3QgdnppcDJxX3MzMihpbnQzMng0X3QgX19hLCBpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMiwgNiwgMywgNyk7IH0KLV9fYWkgaW50NjR4Ml90IHZ6aXAycV9zNjQoaW50NjR4Ml90IF9fYSwgaW50NjR4Ml90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMpOyB9Ci1fX2FpIHVpbnQ4eDE2X3QgdnppcDJxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDgsIDI0LCA5LCAyNSwgMTAsIDI2LCAxMSwgMjcsIDEyLCAyOCwgMTMsIDI5LCAxNCwgMzAsIDE1LCAzMSk7IH0KLV9fYWkgdWludDE2eDhfdCB2emlwMnFfdTE2KHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDQsIDEyLCA1LCAxMywgNiwgMTQsIDcsIDE1KTsgfQotX19haSB1aW50MzJ4NF90IHZ6aXAycV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMiwgNiwgMywgNyk7IH0KLV9fYWkgdWludDY0eDJfdCB2emlwMnFfdTY0KHVpbnQ2NHgyX3QgX19hLCB1aW50NjR4Ml90IF9fYikgewotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2IsIDEsIDMpOyB9Ci1fX2FpIGZsb2F0MzJ4NF90IHZ6aXAycV9mMzIoZmxvYXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAyLCA2LCAzLCA3KTsgfQotX19haSBmbG9hdDY0eDJfdCB2emlwMnFfZjY0KGZsb2F0NjR4Ml90IF9fYSwgZmxvYXQ2NHgyX3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgMSwgMyk7IH0KLV9fYWkgcG9seTh4MTZfdCB2emlwMnFfcDgocG9seTh4MTZfdCBfX2EsIHBvbHk4eDE2X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgOCwgMjQsIDksIDI1LCAxMCwgMjYsIDExLCAyNywgMTIsIDI4LCAxMywgMjksIDE0LCAzMCwgMTUsIDMxKTsgfQotX19haSBwb2x5MTZ4OF90IHZ6aXAycV9wMTYocG9seTE2eDhfdCBfX2EsIHBvbHkxNng4X3QgX19iKSB7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYiwgNCwgMTIsIDUsIDEzLCA2LCAxNCwgNywgMTUpOyB9Ci1fX2FpIHBvbHk2NHgyX3QgdnppcDJxX3A2NChwb2x5NjR4Ml90IF9fYSwgcG9seTY0eDJfdCBfX2IpIHsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19iLCAxLCAzKTsgfQotCi1fX2FpIGludDh4MTZfdCB2bW92bl9oaWdoX3MxNihpbnQ4eDhfdCBfX2EsIGludDE2eDhfdCBfX2IpIHsKLSAgaW50OHg4X3QgX19hMSA9IHZtb3ZuX3MxNihfX2IpOwotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2ExLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1KTsgfQotX19haSBpbnQxNng4X3Qgdm1vdm5faGlnaF9zMzIoaW50MTZ4NF90IF9fYSwgaW50MzJ4NF90IF9fYikgewotICBpbnQxNng0X3QgX19hMSA9IHZtb3ZuX3MzMihfX2IpOwotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2ExLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3KTsgfQotX19haSBpbnQzMng0X3Qgdm1vdm5faGlnaF9zNjQoaW50MzJ4Ml90IF9fYSwgaW50NjR4Ml90IF9fYikgewotICBpbnQzMngyX3QgX19hMSA9IHZtb3ZuX3M2NChfX2IpOwotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2ExLCAwLCAxLCAyLCAzKTsgfQotX19haSB1aW50OHgxNl90IHZtb3ZuX2hpZ2hfdTE2KHVpbnQ4eDhfdCBfX2EsIHVpbnQxNng4X3QgX19iKSB7Ci0gIHVpbnQ4eDhfdCBfX2ExID0gdm1vdm5fdTE2KF9fYik7Ci0gIHJldHVybiBfX2J1aWx0aW5fc2h1ZmZsZXZlY3RvcihfX2EsIF9fYTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUpOyB9Ci1fX2FpIHVpbnQxNng4X3Qgdm1vdm5faGlnaF91MzIodWludDE2eDRfdCBfX2EsIHVpbnQzMng0X3QgX19iKSB7Ci0gIHVpbnQxNng0X3QgX19hMSA9IHZtb3ZuX3UzMihfX2IpOwotICByZXR1cm4gX19idWlsdGluX3NodWZmbGV2ZWN0b3IoX19hLCBfX2ExLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3KTsgfQotX19haSB1aW50MzJ4NF90IHZtb3ZuX2hpZ2hfdTY0KHVpbnQzMngyX3QgX19hLCB1aW50NjR4Ml90IF9fYikgewotICB1aW50MzJ4Ml90IF9fYTEgPSB2bW92bl91NjQoX19iKTsKLSAgcmV0dXJuIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yKF9fYSwgX19hMSwgMCwgMSwgMiwgMyk7IH0KLQotI2lmZGVmIF9fQVJNX0ZFQVRVUkVfQ1JZUFRPCi1fX2FpIHVpbnQ4eDE2X3QgdmFlc2RxX3U4KHVpbnQ4eDE2X3QgX19hLCB1aW50OHgxNl90IF9fYikgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmFlc2RxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCA0OCk7IH0KLQotX19haSB1aW50OHgxNl90IHZhZXNlcV91OCh1aW50OHgxNl90IF9fYSwgdWludDh4MTZfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50OHgxNl90KV9fYnVpbHRpbl9uZW9uX3ZhZXNlcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNDgpOyB9Ci0KLV9fYWkgdWludDh4MTZfdCB2YWVzaW1jcV91OCh1aW50OHgxNl90IF9fYSkgewotICByZXR1cm4gKHVpbnQ4eDE2X3QpX19idWlsdGluX25lb25fdmFlc2ltY3FfdigoaW50OHgxNl90KV9fYSwgNDgpOyB9Ci0KLV9fYWkgdWludDh4MTZfdCB2YWVzbWNxX3U4KHVpbnQ4eDE2X3QgX19hKSB7Ci0gIHJldHVybiAodWludDh4MTZfdClfX2J1aWx0aW5fbmVvbl92YWVzbWNxX3YoKGludDh4MTZfdClfX2EsIDQ4KTsgfQotCi1fX2FpIHVpbnQzMng0X3QgdnNoYTFjcV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMl90IF9fYiwgdWludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzaGExY3FfdTMyKChpbnQzMng0X3QpX19hLCBfX2IsIChpbnQzMng0X3QpX19jKTsgfQotCi1fX2FpIHVpbnQzMl90IHZzaGExaF91MzIodWludDMyX3QgX19hKSB7Ci0gIHJldHVybiAodWludDMyX3QpX19idWlsdGluX25lb25fdnNoYTFoX3UzMihfX2EpOyB9Ci0KLV9fYWkgdWludDMyeDRfdCB2c2hhMW1xX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyX3QgX19iLCB1aW50MzJ4NF90IF9fYykgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnNoYTFtcV91MzIoKGludDMyeDRfdClfX2EsIF9fYiwgKGludDMyeDRfdClfX2MpOyB9Ci0KLV9fYWkgdWludDMyeDRfdCB2c2hhMXBxX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyX3QgX19iLCB1aW50MzJ4NF90IF9fYykgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnNoYTFwcV91MzIoKGludDMyeDRfdClfX2EsIF9fYiwgKGludDMyeDRfdClfX2MpOyB9Ci0KLV9fYWkgdWludDMyeDRfdCB2c2hhMXN1MHFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYiwgdWludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzaGExc3UwcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgKGludDh4MTZfdClfX2MsIDUwKTsgfQotCi1fX2FpIHVpbnQzMng0X3QgdnNoYTFzdTFxX3UzMih1aW50MzJ4NF90IF9fYSwgdWludDMyeDRfdCBfX2IpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzaGExc3UxcV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgNTApOyB9Ci0KLV9fYWkgdWludDMyeDRfdCB2c2hhMjU2aHFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYiwgdWludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzaGEyNTZocV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgKGludDh4MTZfdClfX2MsIDUwKTsgfQotCi1fX2FpIHVpbnQzMng0X3QgdnNoYTI1NmgycV91MzIodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iLCB1aW50MzJ4NF90IF9fYykgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnNoYTI1NmgycV92KChpbnQ4eDE2X3QpX19hLCAoaW50OHgxNl90KV9fYiwgKGludDh4MTZfdClfX2MsIDUwKTsgfQotCi1fX2FpIHVpbnQzMng0X3QgdnNoYTI1NnN1MHFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYikgewotICByZXR1cm4gKHVpbnQzMng0X3QpX19idWlsdGluX25lb25fdnNoYTI1NnN1MHFfdigoaW50OHgxNl90KV9fYSwgKGludDh4MTZfdClfX2IsIDUwKTsgfQotCi1fX2FpIHVpbnQzMng0X3QgdnNoYTI1NnN1MXFfdTMyKHVpbnQzMng0X3QgX19hLCB1aW50MzJ4NF90IF9fYiwgdWludDMyeDRfdCBfX2MpIHsKLSAgcmV0dXJuICh1aW50MzJ4NF90KV9fYnVpbHRpbl9uZW9uX3ZzaGEyNTZzdTFxX3YoKGludDh4MTZfdClfX2EsIChpbnQ4eDE2X3QpX19iLCAoaW50OHgxNl90KV9fYywgNTApOyB9Ci0KLSNlbmRpZgotCi0jZW5kaWYKLQotI3VuZGVmIF9fYWkKLQotI2VuZGlmIC8qIF9fQVJNX05FT05fSCAqLwpkaWZmIC0tZ2l0IGEvbGliL0hlYWRlcnMvY3B1aWQuaCBiL2xpYi9IZWFkZXJzL2NwdWlkLmgKaW5kZXggOGYxMmNhZS4uZjkyNTRlOSAxMDA2NDQKLS0tIGEvbGliL0hlYWRlcnMvY3B1aWQuaAorKysgYi9saWIvSGVhZGVycy9jcHVpZC5oCkBAIC03OSw2ICs3OSw3IEBACiAjZGVmaW5lIGJpdF9BQ1BJICAgICAgICAweDAwNDAwMDAwCiAjZGVmaW5lIGJpdF9NTVggICAgICAgICAweDAwODAwMDAwCiAjZGVmaW5lIGJpdF9GWFNSICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIGJpdF9GWFNBVkUgICAgICBiaXRfRlhTUiAgICAvKiBmb3IgZ2NjIGNvbXBhdCAqLwogI2RlZmluZSBiaXRfU1NFICAgICAgICAgMHgwMjAwMDAwMAogI2RlZmluZSBiaXRfU1NFMiAgICAgICAgMHgwNDAwMDAwMAogI2RlZmluZSBiaXRfU1MgICAgICAgICAgMHgwODAwMDAwMApkaWZmIC0tZ2l0IGEvbGliL0hlYWRlcnMvZmxvYXQuaCBiL2xpYi9IZWFkZXJzL2Zsb2F0LmgKaW5kZXggMmNiMTNkMy4uMDJlZjZiZiAxMDA2NDQKLS0tIGEvbGliL0hlYWRlcnMvZmxvYXQuaAorKysgYi9saWIvSGVhZGVycy9mbG9hdC5oCkBAIC0yOSw3ICsyOSw3IEBACiAgKiBGb3IgbW9yZSBkZXRhaWxzIHNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkveTB5Ync5ZnkuYXNweAogICovCiAjaWYgKGRlZmluZWQoX19NSU5HVzMyX18pIHx8IGRlZmluZWQoX01TQ19WRVIpKSAmJiBcCi0gICAgZGVmaW5lZChfX2hhc19pbmNsdWRlX25leHQpICYmIF9faGFzX2luY2x1ZGVfbmV4dCg8ZmxvYXQuaD4pCisgICAgX19oYXNfaW5jbHVkZV9uZXh0KDxmbG9hdC5oPikKICMgIGluY2x1ZGVfbmV4dCA8ZmxvYXQuaD4KIAogLyogVW5kZWZpbmUgYW55dGhpbmcgdGhhdCB3ZSdsbCBiZSByZWRlZmluaW5nIGJlbG93LiAqLwpkaWZmIC0tZ2l0IGEvbGliL0hlYWRlcnMvaWEzMmludHJpbi5oIGIvbGliL0hlYWRlcnMvaWEzMmludHJpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTg1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvSGVhZGVycy9pYTMyaW50cmluLmgKQEAgLTAsMCArMSw5MiBAQAorLyogPT09LS0tLS0tLS0gaWEzMmludHJpbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgKi8KKworI2lmbmRlZiBfX1g4NklOVFJJTl9ICisjZXJyb3IgIk5ldmVyIHVzZSA8aWEzMmludHJpbi5oPiBkaXJlY3RseTsgaW5jbHVkZSA8eDg2aW50cmluLmg+IGluc3RlYWQuIgorI2VuZGlmCisKKyNpZm5kZWYgX19JQTMySU5UUklOX0gKKyNkZWZpbmUgX19JQTMySU5UUklOX0gKKworI2lmZGVmIF9feDg2XzY0X18KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX19yZWFkZWZsYWdzKHZvaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3JlcyA9IDA7CisgIF9fYXNtX18gX192b2xhdGlsZV9fICgicHVzaGZcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgInBvcHEgJTBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIDoiPXIiKF9fcmVzKQorICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICAgICApOworICByZXR1cm4gX19yZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKK19fd3JpdGVlZmxhZ3ModW5zaWduZWQgbG9uZyBsb25nIF9fZikKK3sKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwdXNocSAlMFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAicG9wZlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICAgICAgOiJyIihfX2YpCisgICAgICAgICAgICAgICAgICAgICAgICA6ImZsYWdzIgorICAgICAgICAgICAgICAgICAgICAgICApOworfQorCisjZWxzZSAvKiAhX194ODZfNjRfXyAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JlYWRlZmxhZ3Modm9pZCkKK3sKKyAgdW5zaWduZWQgaW50IF9fcmVzID0gMDsKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwdXNoZlxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAicG9wbCAlMFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgOiI9ciIoX19yZXMpCisgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgICAgICk7CisgIHJldHVybiBfX3JlczsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2F0dHJpYnV0ZV9fKChfX2Fsd2F5c19pbmxpbmVfXywgX19ub2RlYnVnX18pKQorX193cml0ZWVmbGFncyh1bnNpZ25lZCBpbnQgX19mKQoreworICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInB1c2hsICUwXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwb3BmXG4iCisgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgICAgICA6InIiKF9fZikKKyAgICAgICAgICAgICAgICAgICAgICAgIDoiZmxhZ3MiCisgICAgICAgICAgICAgICAgICAgICAgICk7Cit9CisjZW5kaWYgLyogIV9feDg2XzY0X18gKi8KKworLyogX19yZHRzYyAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fLCBfX25vZGVidWdfXykpCitfX3JkdHNjKHZvaWQpIHsKKyAgdW5zaWduZWQgaW50IF9fZWF4LCBfX2VkeDsKKyAgX19hc21fXyAoInJkdHNjIiA6ICI9YSIgKF9fZWF4KSwgIj1kIiAoX19lZHgpKTsKKyAgcmV0dXJuICgodW5zaWduZWQgbG9uZyBsb25nKV9fZWR4IDw8IDMyKSB8IF9fZWF4OworfQorCisjZGVmaW5lIF9yZHRzYygpIF9fcmR0c2MoKQorCisjZW5kaWYgLyogX19JQTMySU5UUklOX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9IZWFkZXJzL2ltbWludHJpbi5oIGIvbGliL0hlYWRlcnMvaW1taW50cmluLmgKaW5kZXggMTVkNmUwNS4uZGY0YmVhOCAxMDA2NDQKLS0tIGEvbGliL0hlYWRlcnMvaW1taW50cmluLmgKKysrIGIvbGliL0hlYWRlcnMvaW1taW50cmluLmgKQEAgLTQ4LDcgKzQ4LDcgQEAKICNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoX19BRVNfXykKKyNpZiBkZWZpbmVkIChfX0FFU19fKSB8fCBkZWZpbmVkIChfX1BDTE1VTF9fKQogI2luY2x1ZGUgPHdtbWludHJpbi5oPgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2xpYi9IZWFkZXJzL2xpbWl0cy5oIGIvbGliL0hlYWRlcnMvbGltaXRzLmgKaW5kZXggOTFiZDQwNC4uZjA0MTg3YyAxMDA2NDQKLS0tIGEvbGliL0hlYWRlcnMvbGltaXRzLmgKKysrIGIvbGliL0hlYWRlcnMvbGltaXRzLmgKQEAgLTMzLDggKzMzLDcgQEAKIAogLyogU3lzdGVtIGhlYWRlcnMgaW5jbHVkZSBhIG51bWJlciBvZiBjb25zdGFudHMgZnJvbSBQT1NJWCBpbiA8bGltaXRzLmg+LgogICAgSW5jbHVkZSBpdCBpZiB3ZSdyZSBob3N0ZWQuICovCi0jaWYgX19TVERDX0hPU1RFRF9fICYmIFwKLSAgICBkZWZpbmVkKF9faGFzX2luY2x1ZGVfbmV4dCkgJiYgX19oYXNfaW5jbHVkZV9uZXh0KDxsaW1pdHMuaD4pCisjaWYgX19TVERDX0hPU1RFRF9fICYmIF9faGFzX2luY2x1ZGVfbmV4dCg8bGltaXRzLmg+KQogI2luY2x1ZGVfbmV4dCA8bGltaXRzLmg+CiAjZW5kaWYKIApAQCAtOTAsNyArODksNyBAQAogLyogQzk5IDUuMi40LjIuMTogQWRkZWQgbG9uZyBsb25nLgogICAgQysrMTEgMTguMy4zLjI6IHNhbWUgY29udGVudHMgYXMgdGhlIFN0YW5kYXJkIEMgTGlicmFyeSBoZWFkZXIgPGxpbWl0cy5oPi4KICAqLwotI2lmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxIHx8IF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwgfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAogCiAjdW5kZWYgIExMT05HX01JTgogI3VuZGVmICBMTE9OR19NQVgKZGlmZiAtLWdpdCBhL2xpYi9IZWFkZXJzL3N0ZGFyZy5oIGIvbGliL0hlYWRlcnMvc3RkYXJnLmgKaW5kZXggMjk1N2JmMC4uNjExMGEwNiAxMDA2NDQKLS0tIGEvbGliL0hlYWRlcnMvc3RkYXJnLmgKKysrIGIvbGliL0hlYWRlcnMvc3RkYXJnLmgKQEAgLTM5LDcgKzM5LDcgQEAKICAqLwogI2RlZmluZSBfX3ZhX2NvcHkoZCxzKSBfX2J1aWx0aW5fdmFfY29weShkLHMpCiAKLSNpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMEwgfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTCB8fCAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCisjaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMIHx8IF9fY3BsdXNwbHVzID49IDIwMTEwM0wgfHwgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKQogI2RlZmluZSB2YV9jb3B5KGRlc3QsIHNyYykgIF9fYnVpbHRpbl92YV9jb3B5KGRlc3QsIHNyYykKICNlbmRpZgogCmRpZmYgLS1naXQgYS9saWIvSGVhZGVycy9zdGRkZWYuaCBiL2xpYi9IZWFkZXJzL3N0ZGRlZi5oCmluZGV4IDZhNjRkNmQuLjk3MTI2ZWQgMTAwNjQ0Ci0tLSBhL2xpYi9IZWFkZXJzL3N0ZGRlZi5oCisrKyBiL2xpYi9IZWFkZXJzL3N0ZGRlZi5oCkBAIC04NCw2ICs4NCwyMCBAQAogI2VuZGlmCiAjZW5kaWYKIAorI2lmIF9fU1REQ19WRVJTSU9OX18gPj0gMjAxMTEyTCB8fCBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjaWZuZGVmIF9NU0NfVkVSCit0eXBlZGVmIHN0cnVjdCB7CisgIGxvbmcgbG9uZyBfX2NsYW5nX21heF9hbGlnbl9ub25jZTEKKyAgICAgIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKF9fYWxpZ25vZl9fKGxvbmcgbG9uZykpKSk7CisgIGxvbmcgZG91YmxlIF9fY2xhbmdfbWF4X2FsaWduX25vbmNlMgorICAgICAgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oX19hbGlnbm9mX18obG9uZyBkb3VibGUpKSkpOworfSBtYXhfYWxpZ25fdDsKKyNlbHNlCit0eXBlZGVmIGRvdWJsZSBtYXhfYWxpZ25fdDsKKyNlbmRpZgorI2RlZmluZSBfX0NMQU5HX01BWF9BTElHTl9UX0RFRklORUQKKyNlbmRpZgorCiAjZGVmaW5lIG9mZnNldG9mKHQsIGQpIF9fYnVpbHRpbl9vZmZzZXRvZih0LCBkKQogCiAjZW5kaWYgLyogX19TVERERUZfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL0hlYWRlcnMvc3RkaW50LmggYi9saWIvSGVhZGVycy9zdGRpbnQuaAppbmRleCAxMTUyOWMwLi4yYjFiYzA5IDEwMDY0NAotLS0gYS9saWIvSGVhZGVycy9zdGRpbnQuaAorKysgYi9saWIvSGVhZGVycy9zdGRpbnQuaApAQCAtMjgsOCArMjgsNyBAQAogLyogSWYgd2UncmUgaG9zdGVkLCBmYWxsIGJhY2sgdG8gdGhlIHN5c3RlbSdzIHN0ZGludC5oLCB3aGljaCBtaWdodCBoYXZlCiAgKiBhZGRpdGlvbmFsIGRlZmluaXRpb25zLgogICovCi0jaWYgX19TVERDX0hPU1RFRF9fICYmIFwKLSAgICBkZWZpbmVkKF9faGFzX2luY2x1ZGVfbmV4dCkgJiYgX19oYXNfaW5jbHVkZV9uZXh0KDxzdGRpbnQuaD4pCisjaWYgX19TVERDX0hPU1RFRF9fICYmIF9faGFzX2luY2x1ZGVfbmV4dCg8c3RkaW50Lmg+KQogCiAvLyBDOTkgNy4xOC4zIExpbWl0cyBvZiBvdGhlciBpbnRlZ2VyIHR5cGVzCiAvLwpkaWZmIC0tZ2l0IGEvbGliL0hlYWRlcnMveDg2aW50cmluLmggYi9saWIvSGVhZGVycy94ODZpbnRyaW4uaAppbmRleCAzOTkwMTZmLi5iZTllNzFkIDEwMDY0NAotLS0gYS9saWIvSGVhZGVycy94ODZpbnRyaW4uaAorKysgYi9saWIvSGVhZGVycy94ODZpbnRyaW4uaApAQCAtMjQsNiArMjQsOCBAQAogI2lmbmRlZiBfX1g4NklOVFJJTl9ICiAjZGVmaW5lIF9fWDg2SU5UUklOX0gKIAorI2luY2x1ZGUgPGlhMzJpbnRyaW4uaD4KKwogI2luY2x1ZGUgPGltbWludHJpbi5oPgogCiAjaWZkZWYgX18zZE5PV19fCmRpZmYgLS1naXQgYS9saWIvSGVhZGVycy94bW1pbnRyaW4uaCBiL2xpYi9IZWFkZXJzL3htbWludHJpbi5oCmluZGV4IGM2OGQzZWQuLmM4NzY1YTcgMTAwNjQ0Ci0tLSBhL2xpYi9IZWFkZXJzL3htbWludHJpbi5oCisrKyBiL2xpYi9IZWFkZXJzL3htbWludHJpbi5oCkBAIC02NzIsMTAgKzY3MiwxMiBAQAogI2RlZmluZSBfTU1fSElOVF9UMiAxCiAjZGVmaW5lIF9NTV9ISU5UX05UQSAwCiAKKyNpZm5kZWYgX01TQ19WRVIKIC8qIEZJWE1FOiBXZSBoYXZlIHRvICNkZWZpbmUgdGhpcyBiZWNhdXNlICJzZWwiIG11c3QgYmUgYSBjb25zdGFudCBpbnRlZ2VyLCBhbmQKICAgIFNlbWEgZG9lc24ndCBkbyBhbnkgZm9ybSBvZiBjb25zdGFudCBwcm9wYWdhdGlvbiB5ZXQuICovCiAKICNkZWZpbmUgX21tX3ByZWZldGNoKGEsIHNlbCkgKF9fYnVpbHRpbl9wcmVmZXRjaCgodm9pZCAqKShhKSwgMCwgKHNlbCkpKQorI2VuZGlmCiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18sIF9fbm9kZWJ1Z19fKSkKIF9tbV9zdHJlYW1fcGkoX19tNjQgKl9fcCwgX19tNjQgX19hKQpkaWZmIC0tZ2l0IGEvbGliL0luZGV4L0NNYWtlTGlzdHMudHh0IGIvbGliL0luZGV4L0NNYWtlTGlzdHMudHh0CmluZGV4IGM0ZmY1YTAuLmZkOTgxMGQgMTAwNjQ0Ci0tLSBhL2xpYi9JbmRleC9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvSW5kZXgvQ01ha2VMaXN0cy50eHQKQEAgLTEsMTEgKzEsMTkgQEAKLWFkZF9jbGFuZ19saWJyYXJ5KGNsYW5nSW5kZXgKLSAgQ29tbWVudFRvWE1MLmNwcAotICBTaW1wbGVGb3JtYXRDb250ZXh0LmgKLSAgVVNSR2VuZXJhdGlvbi5jcHAKK3NldChMTFZNX0xJTktfQ09NUE9ORU5UUworICBTdXBwb3J0CiAgICkKIAotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNsYW5nSW5kZXgKLSAgY2xhbmdCYXNpYworYWRkX2NsYW5nX2xpYnJhcnkoY2xhbmdJbmRleAorICBDb21tZW50VG9YTUwuY3BwCisgIFVTUkdlbmVyYXRpb24uY3BwCisKKyAgQURESVRJT05BTF9IRUFERVJTCisgIFNpbXBsZUZvcm1hdENvbnRleHQuaAorCisgIExJTktfTElCUwogICBjbGFuZ0FTVAorICBjbGFuZ0Jhc2ljCiAgIGNsYW5nRm9ybWF0CisgIGNsYW5nTGV4CisgIGNsYW5nUmV3cml0ZUNvcmUKKyAgY2xhbmdUb29saW5nCiAgICkKZGlmZiAtLWdpdCBhL2xpYi9JbmRleC9Db21tZW50VG9YTUwuY3BwIGIvbGliL0luZGV4L0NvbW1lbnRUb1hNTC5jcHAKaW5kZXggMGE5NjE5ZC4uNDNjNDIzMiAxMDA2NDQKLS0tIGEvbGliL0luZGV4L0NvbW1lbnRUb1hNTC5jcHAKKysrIGIvbGliL0luZGV4L0NvbW1lbnRUb1hNTC5jcHAKQEAgLTksOCArOSw4IEBACiAKICNpbmNsdWRlICJjbGFuZy9JbmRleC9Db21tZW50VG9YTUwuaCIKICNpbmNsdWRlICJTaW1wbGVGb3JtYXRDb250ZXh0LmgiCi0jaW5jbHVkZSAiY2xhbmcvQVNUL0F0dHIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9BdHRyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0NvbW1lbnQuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQ29tbWVudFZpc2l0b3IuaCIKICNpbmNsdWRlICJjbGFuZy9Gb3JtYXQvRm9ybWF0LmgiCmRpZmYgLS1naXQgYS9saWIvSW5kZXgvVVNSR2VuZXJhdGlvbi5jcHAgYi9saWIvSW5kZXgvVVNSR2VuZXJhdGlvbi5jcHAKaW5kZXggMTZkODlmOC4uMTVhYTg3NSAxMDA2NDQKLS0tIGEvbGliL0luZGV4L1VTUkdlbmVyYXRpb24uY3BwCisrKyBiL2xpYi9JbmRleC9VU1JHZW5lcmF0aW9uLmNwcApAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsVmlzaXRvci5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzaW5nUmVjb3JkLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgpAQCAtMjIsNiArMjMsMzAgQEAKIC8vIFVTUiBnZW5lcmF0aW9uLgogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAorLy8vIFxyZXR1cm5zIHRydWUgb24gZXJyb3IuCitzdGF0aWMgYm9vbCBwcmludExvYyhsbHZtOjpyYXdfb3N0cmVhbSAmT1MsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLCBib29sIEluY2x1ZGVPZmZzZXQpIHsKKyAgaWYgKExvYy5pc0ludmFsaWQoKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIExvYyA9IFNNLmdldEV4cGFuc2lvbkxvYyhMb2MpOworICBjb25zdCBzdGQ6OnBhaXI8RmlsZUlELCB1bnNpZ25lZD4gJkRlY29tcG9zZWQgPSBTTS5nZXREZWNvbXBvc2VkTG9jKExvYyk7CisgIGNvbnN0IEZpbGVFbnRyeSAqRkUgPSBTTS5nZXRGaWxlRW50cnlGb3JJRChEZWNvbXBvc2VkLmZpcnN0KTsKKyAgaWYgKEZFKSB7CisgICAgT1MgPDwgbGx2bTo6c3lzOjpwYXRoOjpmaWxlbmFtZShGRS0+Z2V0TmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGlzIGNhc2UgcmVhbGx5IGlzbid0IGludGVyZXN0aW5nLgorICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChJbmNsdWRlT2Zmc2V0KSB7CisgICAgLy8gVXNlIHRoZSBvZmZlc3QgaW50byB0aGUgRmlsZUlEIHRvIHJlcHJlc2VudCB0aGUgbG9jYXRpb24uICBVc2luZworICAgIC8vIGEgbGluZS9jb2x1bW4gY2FuIGNhdXNlIHVzIHRvIGxvb2sgYmFjayBhdCB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUsCisgICAgLy8gd2hpY2ggaXMgZXhwZW5zaXZlLgorICAgIE9TIDw8ICdAJyA8PCBEZWNvbXBvc2VkLnNlY29uZDsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKIG5hbWVzcGFjZSB7CiBjbGFzcyBVU1JHZW5lcmF0b3IgOiBwdWJsaWMgQ29uc3REZWNsVmlzaXRvcjxVU1JHZW5lcmF0b3I+IHsKICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZCdWY7CkBAIC04MCwxMCArMTA1LDE2IEBACiAgIHZvaWQgVmlzaXRVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2woY29uc3QgVW5yZXNvbHZlZFVzaW5nVHlwZW5hbWVEZWNsICpEKSB7CiAgICAgSWdub3JlUmVzdWx0cyA9IHRydWU7CiAgIH0KLSAgCisKKyAgYm9vbCBTaG91bGRHZW5lcmF0ZUxvY2F0aW9uKGNvbnN0IE5hbWVkRGVjbCAqRCk7CisKKyAgYm9vbCBpc0xvY2FsKGNvbnN0IE5hbWVkRGVjbCAqRCkgeworICAgIHJldHVybiBELT5nZXRQYXJlbnRGdW5jdGlvbk9yTWV0aG9kKCkgIT0gMDsKKyAgfQorCiAgIC8vLyBHZW5lcmF0ZSB0aGUgc3RyaW5nIGNvbXBvbmVudCBjb250YWluaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUKICAgLy8vICBkZWNsYXJhdGlvbi4KLSAgYm9vbCBHZW5Mb2MoY29uc3QgRGVjbCAqRCk7CisgIGJvb2wgR2VuTG9jKGNvbnN0IERlY2wgKkQsIGJvb2wgSW5jbHVkZU9mZnNldCk7CiAKICAgLy8vIFN0cmluZyBnZW5lcmF0aW9uIG1ldGhvZHMgdXNlZCBib3RoIGJ5IHRoZSB2aXNpdGF0aW9uIG1ldGhvZHMKICAgLy8vIGFuZCBmcm9tIG90aGVyIGNsaWVudHMgdGhhdCB3YW50IHRvIGRpcmVjdGx5IGdlbmVyYXRlIFVTUnMuICBUaGVzZQpAQCAtOTksMTYgKzEzMCw2IEBACiAgIHZvaWQgR2VuT2JqQ0NhdGVnb3J5KFN0cmluZ1JlZiBjbHMsIFN0cmluZ1JlZiBjYXQpIHsKICAgICBnZW5lcmF0ZVVTUkZvck9iakNDYXRlZ29yeShjbHMsIGNhdCwgT3V0KTsKICAgfQotICAvLy8gR2VuZXJhdGUgYSBVU1IgZnJhZ21lbnQgZm9yIGFuIE9iamVjdGl2ZS1DIGluc3RhbmNlIHZhcmlhYmxlLiAgVGhlCi0gIC8vLyBjb21wbGV0ZSBVU1IgY2FuIGJlIGNyZWF0ZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgVVNSIGZvciB0aGUKLSAgLy8vIGVuY29tcGFzc2luZyBjbGFzcyB3aXRoIHRoaXMgVVNSIGZyYWdtZW50LgotICB2b2lkIEdlbk9iakNJdmFyKFN0cmluZ1JlZiBpdmFyKSB7Ci0gICAgZ2VuZXJhdGVVU1JGb3JPYmpDSXZhcihpdmFyLCBPdXQpOwotICB9Ci0gIC8vLyBHZW5lcmF0ZSBhIFVTUiBmcmFnbWVudCBmb3IgYW4gT2JqZWN0aXZlLUMgbWV0aG9kLgotICB2b2lkIEdlbk9iakNNZXRob2QoU3RyaW5nUmVmIHNlbCwgYm9vbCBpc0luc3RhbmNlTWV0aG9kKSB7Ci0gICAgZ2VuZXJhdGVVU1JGb3JPYmpDTWV0aG9kKHNlbCwgaXNJbnN0YW5jZU1ldGhvZCwgT3V0KTsKLSAgfQogICAvLy8gR2VuZXJhdGUgYSBVU1IgZnJhZ21lbnQgZm9yIGFuIE9iamVjdGl2ZS1DIHByb3BlcnR5LgogICB2b2lkIEdlbk9iakNQcm9wZXJ0eShTdHJpbmdSZWYgcHJvcCkgewogICAgIGdlbmVyYXRlVVNSRm9yT2JqQ1Byb3BlcnR5KHByb3AsIE91dCk7CkBAIC0xNDMsOCArMTY0LDEzIEBACiAgIHJldHVybiBzdGFydFNpemUgPT0gZW5kU2l6ZTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIFNob3VsZEdlbmVyYXRlTG9jYXRpb24oY29uc3QgTmFtZWREZWNsICpEKSB7Ci0gIHJldHVybiAhRC0+aXNFeHRlcm5hbGx5VmlzaWJsZSgpOworYm9vbCBVU1JHZW5lcmF0b3I6OlNob3VsZEdlbmVyYXRlTG9jYXRpb24oY29uc3QgTmFtZWREZWNsICpEKSB7CisgIGlmIChELT5pc0V4dGVybmFsbHlWaXNpYmxlKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoRC0+Z2V0UGFyZW50RnVuY3Rpb25Pck1ldGhvZCgpKQorICAgIHJldHVybiB0cnVlOworICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSA9IENvbnRleHQtPmdldFNvdXJjZU1hbmFnZXIoKTsKKyAgcmV0dXJuICFTTS5pc0luU3lzdGVtSGVhZGVyKEQtPmdldExvY2F0aW9uKCkpOwogfQogCiB2b2lkIFVTUkdlbmVyYXRvcjo6VmlzaXREZWNsQ29udGV4dChjb25zdCBEZWNsQ29udGV4dCAqREMpIHsKQEAgLTE2OCw3ICsxOTQsNyBAQAogfQogCiB2b2lkIFVTUkdlbmVyYXRvcjo6VmlzaXRGdW5jdGlvbkRlY2woY29uc3QgRnVuY3Rpb25EZWNsICpEKSB7Ci0gIGlmIChTaG91bGRHZW5lcmF0ZUxvY2F0aW9uKEQpICYmIEdlbkxvYyhEKSkKKyAgaWYgKFNob3VsZEdlbmVyYXRlTG9jYXRpb24oRCkgJiYgR2VuTG9jKEQsIC8qSW5jbHVkZU9mZnNldD0qL2lzTG9jYWwoRCkpKQogICAgIHJldHVybjsKIAogICBWaXNpdERlY2xDb250ZXh0KEQtPmdldERlY2xDb250ZXh0KCkpOwpAQCAtMTk0LDEyICsyMjAsOSBAQAogICB9CiAKICAgLy8gTWFuZ2xlIGluIHR5cGUgaW5mb3JtYXRpb24gZm9yIHRoZSBhcmd1bWVudHMuCi0gIGZvciAoRnVuY3Rpb25EZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBJID0gRC0+cGFyYW1fYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBELT5wYXJhbV9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgeworICBmb3IgKGF1dG8gUEQgOiBELT5wYXJhbXMoKSkgewogICAgIE91dCA8PCAnIyc7Ci0gICAgaWYgKFBhcm1WYXJEZWNsICpQRCA9ICpJKQotICAgICAgVmlzaXRUeXBlKFBELT5nZXRUeXBlKCkpOworICAgIFZpc2l0VHlwZShQRC0+Z2V0VHlwZSgpKTsKICAgfQogICBpZiAoRC0+aXNWYXJpYWRpYygpKQogICAgIE91dCA8PCAnLic7CkBAIC0yMjksNyArMjUyLDcgQEAKICAgLy8gVmFyRGVjbHMgY2FuIGJlIGRlY2xhcmVkICdleHRlcm4nIHdpdGhpbiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBib2R5LAogICAvLyBidXQgdGhlaXIgZW5jbG9zaW5nIERlY2xDb250ZXh0IGlzIHRoZSBmdW5jdGlvbiwgbm90IHRoZSBUVS4gIFdlIG5lZWQKICAgLy8gdG8gY2hlY2sgdGhlIHN0b3JhZ2UgY2xhc3MgdG8gY29ycmVjdGx5IGdlbmVyYXRlIHRoZSBVU1IuCi0gIGlmIChTaG91bGRHZW5lcmF0ZUxvY2F0aW9uKEQpICYmIEdlbkxvYyhEKSkKKyAgaWYgKFNob3VsZEdlbmVyYXRlTG9jYXRpb24oRCkgJiYgR2VuTG9jKEQsIC8qSW5jbHVkZU9mZnNldD0qL2lzTG9jYWwoRCkpKQogICAgIHJldHVybjsKIAogICBWaXNpdERlY2xDb250ZXh0KEQtPmdldERlY2xDb250ZXh0KCkpOwpAQCAtMjQ5LDEzICsyNzIsMTMgQEAKIAogdm9pZCBVU1JHZW5lcmF0b3I6OlZpc2l0Tm9uVHlwZVRlbXBsYXRlUGFybURlY2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTm9uVHlwZVRlbXBsYXRlUGFybURlY2wgKkQpIHsKLSAgR2VuTG9jKEQpOworICBHZW5Mb2MoRCwgLypJbmNsdWRlT2Zmc2V0PSovdHJ1ZSk7CiAgIHJldHVybjsKIH0KIAogdm9pZCBVU1JHZW5lcmF0b3I6OlZpc2l0VGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCAqRCkgewotICBHZW5Mb2MoRCk7CisgIEdlbkxvYyhELCAvKkluY2x1ZGVPZmZzZXQ9Ki90cnVlKTsKICAgcmV0dXJuOwogfQogCkBAIC0zMjksNyArMzUyLDcgQEAKICAgICAgIC8vIFdlIHdhbnQgdG8gbWFuZ2xlIGluIHRoZSBsb2NhdGlvbiB0byB1bmlxdWVseSBkaXN0aW5ndWlzaCB0aGVtLgogICAgICAgaWYgKENELT5Jc0NsYXNzRXh0ZW5zaW9uKCkpIHsKICAgICAgICAgT3V0IDw8ICJvYmpjKGV4dCkiIDw8IElELT5nZXROYW1lKCkgPDwgJ0AnOwotICAgICAgICBHZW5Mb2MoQ0QpOworICAgICAgICBHZW5Mb2MoQ0QsIC8qSW5jbHVkZU9mZnNldD0qL3RydWUpOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgICBHZW5PYmpDQ2F0ZWdvcnkoSUQtPmdldE5hbWUoKSwgQ0QtPmdldE5hbWUoKSk7CkBAIC0zNzgsNyArNDAxLDcgQEAKIHZvaWQgVVNSR2VuZXJhdG9yOjpWaXNpdFRhZ0RlY2woY29uc3QgVGFnRGVjbCAqRCkgewogICAvLyBBZGQgdGhlIGxvY2F0aW9uIG9mIHRoZSB0YWcgZGVjbCB0byBoYW5kbGUgcmVzb2x1dGlvbiBhY3Jvc3MKICAgLy8gdHJhbnNsYXRpb24gdW5pdHMuCi0gIGlmIChTaG91bGRHZW5lcmF0ZUxvY2F0aW9uKEQpICYmIEdlbkxvYyhEKSkKKyAgaWYgKFNob3VsZEdlbmVyYXRlTG9jYXRpb24oRCkgJiYgR2VuTG9jKEQsIC8qSW5jbHVkZU9mZnNldD0qL2lzTG9jYWwoRCkpKQogICAgIHJldHVybjsKIAogICBEID0gRC0+Z2V0Q2Fub25pY2FsRGVjbCgpOwpAQCAtNDQ5LDcgKzQ3Miw3IEBACiB9CiAKIHZvaWQgVVNSR2VuZXJhdG9yOjpWaXNpdFR5cGVkZWZEZWNsKGNvbnN0IFR5cGVkZWZEZWNsICpEKSB7Ci0gIGlmIChTaG91bGRHZW5lcmF0ZUxvY2F0aW9uKEQpICYmIEdlbkxvYyhEKSkKKyAgaWYgKFNob3VsZEdlbmVyYXRlTG9jYXRpb24oRCkgJiYgR2VuTG9jKEQsIC8qSW5jbHVkZU9mZnNldD0qL2lzTG9jYWwoRCkpKQogICAgIHJldHVybjsKICAgY29uc3QgRGVjbENvbnRleHQgKkRDID0gRC0+Z2V0RGVjbENvbnRleHQoKTsKICAgaWYgKGNvbnN0IE5hbWVkRGVjbCAqRENOID0gZHluX2Nhc3Q8TmFtZWREZWNsPihEQykpCkBAIC00NTksMTUgKzQ4MiwxNSBAQAogfQogCiB2b2lkIFVTUkdlbmVyYXRvcjo6VmlzaXRUZW1wbGF0ZVR5cGVQYXJtRGVjbChjb25zdCBUZW1wbGF0ZVR5cGVQYXJtRGVjbCAqRCkgewotICBHZW5Mb2MoRCk7CisgIEdlbkxvYyhELCAvKkluY2x1ZGVPZmZzZXQ9Ki90cnVlKTsKICAgcmV0dXJuOwogfQogCi1ib29sIFVTUkdlbmVyYXRvcjo6R2VuTG9jKGNvbnN0IERlY2wgKkQpIHsKK2Jvb2wgVVNSR2VuZXJhdG9yOjpHZW5Mb2MoY29uc3QgRGVjbCAqRCwgYm9vbCBJbmNsdWRlT2Zmc2V0KSB7CiAgIGlmIChnZW5lcmF0ZWRMb2MpCiAgICAgcmV0dXJuIElnbm9yZVJlc3VsdHM7CiAgIGdlbmVyYXRlZExvYyA9IHRydWU7Ci0gIAorCiAgIC8vIEd1YXJkIGFnYWluc3QgbnVsbCBkZWNsYXJhdGlvbnMgaW4gaW52YWxpZCBjb2RlLgogICBpZiAoIUQpIHsKICAgICBJZ25vcmVSZXN1bHRzID0gdHJ1ZTsKQEAgLTQ3NywyNyArNTAwLDEwIEBACiAgIC8vIFVzZSB0aGUgbG9jYXRpb24gb2YgY2Fub25pY2FsIGRlY2wuCiAgIEQgPSBELT5nZXRDYW5vbmljYWxEZWNsKCk7CiAKLSAgY29uc3QgU291cmNlTWFuYWdlciAmU00gPSBDb250ZXh0LT5nZXRTb3VyY2VNYW5hZ2VyKCk7Ci0gIFNvdXJjZUxvY2F0aW9uIEwgPSBELT5nZXRMb2NTdGFydCgpOwotICBpZiAoTC5pc0ludmFsaWQoKSkgewotICAgIElnbm9yZVJlc3VsdHMgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIEwgPSBTTS5nZXRFeHBhbnNpb25Mb2MoTCk7Ci0gIGNvbnN0IHN0ZDo6cGFpcjxGaWxlSUQsIHVuc2lnbmVkPiAmRGVjb21wb3NlZCA9IFNNLmdldERlY29tcG9zZWRMb2MoTCk7Ci0gIGNvbnN0IEZpbGVFbnRyeSAqRkUgPSBTTS5nZXRGaWxlRW50cnlGb3JJRChEZWNvbXBvc2VkLmZpcnN0KTsKLSAgaWYgKEZFKSB7Ci0gICAgT3V0IDw8IGxsdm06OnN5czo6cGF0aDo6ZmlsZW5hbWUoRkUtPmdldE5hbWUoKSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgLy8gVGhpcyBjYXNlIHJlYWxseSBpc24ndCBpbnRlcmVzdGluZy4KLSAgICBJZ25vcmVSZXN1bHRzID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAvLyBVc2UgdGhlIG9mZmVzdCBpbnRvIHRoZSBGaWxlSUQgdG8gcmVwcmVzZW50IHRoZSBsb2NhdGlvbi4gIFVzaW5nCi0gIC8vIGEgbGluZS9jb2x1bW4gY2FuIGNhdXNlIHVzIHRvIGxvb2sgYmFjayBhdCB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUsCi0gIC8vIHdoaWNoIGlzIGV4cGVuc2l2ZS4KLSAgT3V0IDw8ICdAJyA8PCBEZWNvbXBvc2VkLnNlY29uZDsKKyAgSWdub3JlUmVzdWx0cyA9CisgICAgICBJZ25vcmVSZXN1bHRzIHx8IHByaW50TG9jKE91dCwgRC0+Z2V0TG9jU3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC0+Z2V0U291cmNlTWFuYWdlcigpLCBJbmNsdWRlT2Zmc2V0KTsKKwogICByZXR1cm4gSWdub3JlUmVzdWx0czsKIH0KIApAQCAtNjI3LDExICs2MzMsOSBAQAogICAgIH0KICAgICBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZUID0gVC0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCkpIHsKICAgICAgIE91dCA8PCAnRic7Ci0gICAgICBWaXNpdFR5cGUoRlQtPmdldFJlc3VsdFR5cGUoKSk7Ci0gICAgICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjphcmdfdHlwZV9pdGVyYXRvcgotICAgICAgICAgICAgSSA9IEZULT5hcmdfdHlwZV9iZWdpbigpLCBFID0gRlQtPmFyZ190eXBlX2VuZCgpOyBJIT1FOyArK0kpIHsKLSAgICAgICAgVmlzaXRUeXBlKCpJKTsKLSAgICAgIH0KKyAgICAgIFZpc2l0VHlwZShGVC0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmSSA6IEZULT5wYXJhbV90eXBlcygpKQorICAgICAgICBWaXNpdFR5cGUoSSk7CiAgICAgICBpZiAoRlQtPmlzVmFyaWFkaWMoKSkKICAgICAgICAgT3V0IDw8ICcuJzsKICAgICAgIHJldHVybjsKQEAgLTgwMSwzICs4MDUsMjYgQEAKICAgVUcuVmlzaXQoRCk7CiAgIHJldHVybiBVRy5pZ25vcmVSZXN1bHRzKCk7CiB9CisKK2Jvb2wgY2xhbmc6OmluZGV4OjpnZW5lcmF0ZVVTUkZvck1hY3JvKGNvbnN0IE1hY3JvRGVmaW5pdGlvbiAqTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmQnVmKSB7CisgIC8vIERvbid0IGdlbmVyYXRlIFVTUnMgZm9yIHRoaW5ncyB3aXRoIGludmFsaWQgbG9jYXRpb25zLgorICBpZiAoIU1EIHx8IE1ELT5nZXRMb2NhdGlvbigpLmlzSW52YWxpZCgpKQorICAgIHJldHVybiB0cnVlOworCisgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gT3V0KEJ1Zik7CisKKyAgLy8gQXNzdW1lIHRoYXQgc3lzdGVtIGhlYWRlcnMgYXJlIHNhbmUuICBEb24ndCBwdXQgc291cmNlIGxvY2F0aW9uCisgIC8vIGluZm9ybWF0aW9uIGludG8gdGhlIFVTUiBpZiB0aGUgbWFjcm8gY29tZXMgZnJvbSBhIHN5c3RlbSBoZWFkZXIuCisgIFNvdXJjZUxvY2F0aW9uIExvYyA9IE1ELT5nZXRMb2NhdGlvbigpOworICBib29sIFNob3VsZEdlbmVyYXRlTG9jYXRpb24gPSAhU00uaXNJblN5c3RlbUhlYWRlcihMb2MpOworCisgIE91dCA8PCBnZXRVU1JTcGFjZVByZWZpeCgpOworICBpZiAoU2hvdWxkR2VuZXJhdGVMb2NhdGlvbikKKyAgICBwcmludExvYyhPdXQsIExvYywgU00sIC8qSW5jbHVkZU9mZnNldD0qL3RydWUpOworICBPdXQgPDwgIkBtYWNyb0AiOworICBPdXQgPDwgTUQtPmdldE5hbWUoKS0+Z2V0TmFtZVN0YXJ0KCk7CisgIHJldHVybiBmYWxzZTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL0xleC9BbmRyb2lkLm1rIGIvbGliL0xleC9BbmRyb2lkLm1rCmluZGV4IGYzZTI5NGYuLmE1ZTk2NjEgMTAwNjQ0Ci0tLSBhL2xpYi9MZXgvQW5kcm9pZC5taworKysgYi9saWIvTGV4L0FuZHJvaWQubWsKQEAgLTcsOCArNyw3IEBACiAKIFRCTEdFTl9UQUJMRVMgOj0gXAogICBEaWFnbm9zdGljTGV4S2luZHMuaW5jIFwKLSAgRGlhZ25vc3RpY0NvbW1vbktpbmRzLmluYyBcCi0gIEF0dHJTcGVsbGluZ3MuaW5jCisgIERpYWdub3N0aWNDb21tb25LaW5kcy5pbmMKIAogY2xhbmdfbGV4X1NSQ19GSUxFUyA6PSBcCiAgIEhlYWRlck1hcC5jcHAgXApkaWZmIC0tZ2l0IGEvbGliL0xleC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9MZXgvQ01ha2VMaXN0cy50eHQKaW5kZXggMmVlNDY4Mi4uMzhkZjE0NCAxMDA2NDQKLS0tIGEvbGliL0xleC9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvTGV4L0NNYWtlTGlzdHMudHh0CkBAIC0yNSwxNCArMjUsNyBAQAogICBTY3JhdGNoQnVmZmVyLmNwcAogICBUb2tlbkNvbmNhdGVuYXRpb24uY3BwCiAgIFRva2VuTGV4ZXIuY3BwCi0gICkKIAotYWRkX2RlcGVuZGVuY2llcyhjbGFuZ0xleAotICBDbGFuZ0F0dHJTcGVsbGluZ3MKLSAgQ2xhbmdEaWFnbm9zdGljQ29tbW9uCi0gIENsYW5nRGlhZ25vc3RpY0xleAotICApCi0KLXRhcmdldF9saW5rX2xpYnJhcmllcyhjbGFuZ0xleAorICBMSU5LX0xJQlMKICAgY2xhbmdCYXNpYwogICApCmRpZmYgLS1naXQgYS9saWIvTGV4L0hlYWRlck1hcC5jcHAgYi9saWIvTGV4L0hlYWRlck1hcC5jcHAKaW5kZXggNDc4NDYyYy4uMmQwNzQyOCAxMDA2NDQKLS0tIGEvbGliL0xleC9IZWFkZXJNYXAuY3BwCisrKyBiL2xpYi9MZXgvSGVhZGVyTWFwLmNwcApAQCAtMTQsMTIgKzE0LDEyIEBACiAjaW5jbHVkZSAiY2xhbmcvTGV4L0hlYWRlck1hcC5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0NoYXJJbmZvLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRmlsZU1hbmFnZXIuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKICNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8bWVtb3J5PgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtODEsNyArODEsNyBAQAogICB1bnNpZ25lZCBGaWxlU2l6ZSA9IEZFLT5nZXRTaXplKCk7CiAgIGlmIChGaWxlU2l6ZSA8PSBzaXplb2YoSE1hcEhlYWRlcikpIHJldHVybiAwOwogCi0gIE93bmluZ1B0cjxjb25zdCBsbHZtOjpNZW1vcnlCdWZmZXI+IEZpbGVCdWZmZXIoRk0uZ2V0QnVmZmVyRm9yRmlsZShGRSkpOworICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgbGx2bTo6TWVtb3J5QnVmZmVyPiBGaWxlQnVmZmVyKEZNLmdldEJ1ZmZlckZvckZpbGUoRkUpKTsKICAgaWYgKCFGaWxlQnVmZmVyKSByZXR1cm4gMDsgIC8vIFVucmVhZGFibGUgZmlsZT8KICAgY29uc3QgY2hhciAqRmlsZVN0YXJ0ID0gRmlsZUJ1ZmZlci0+Z2V0QnVmZmVyU3RhcnQoKTsKIApAQCAtMTAzLDcgKzEwMyw3IEBACiAgIGlmIChIZWFkZXItPlJlc2VydmVkICE9IDApIHJldHVybiAwOwogCiAgIC8vIE9rYXksIGV2ZXJ5dGhpbmcgbG9va3MgZ29vZCwgY3JlYXRlIHRoZSBoZWFkZXIgbWFwLgotICByZXR1cm4gbmV3IEhlYWRlck1hcChGaWxlQnVmZmVyLnRha2UoKSwgTmVlZHNCeXRlU3dhcCk7CisgIHJldHVybiBuZXcgSGVhZGVyTWFwKEZpbGVCdWZmZXIucmVsZWFzZSgpLCBOZWVkc0J5dGVTd2FwKTsKIH0KIAogSGVhZGVyTWFwOjp+SGVhZGVyTWFwKCkgewpAQCAtMjAxLDE4ICsyMDEsMjkgQEAKIC8vLyB0aGlzIEhlYWRlck1hcC4gIElmIHNvLCBvcGVuIGl0IGFuZCByZXR1cm4gaXRzIEZpbGVFbnRyeS4KIGNvbnN0IEZpbGVFbnRyeSAqSGVhZGVyTWFwOjpMb29rdXBGaWxlKAogICAgIFN0cmluZ1JlZiBGaWxlbmFtZSwgRmlsZU1hbmFnZXIgJkZNKSBjb25zdCB7CisKKyAgU21hbGxTdHJpbmc8MTAyND4gUGF0aDsKKyAgU3RyaW5nUmVmIERlc3QgPSBsb29rdXBGaWxlbmFtZShGaWxlbmFtZSwgUGF0aCk7CisgIGlmIChEZXN0LmVtcHR5KCkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIEZNLmdldEZpbGUoRGVzdCk7Cit9CisKK1N0cmluZ1JlZiBIZWFkZXJNYXA6Omxvb2t1cEZpbGVuYW1lKFN0cmluZ1JlZiBGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmRGVzdFBhdGgpIGNvbnN0IHsKICAgY29uc3QgSE1hcEhlYWRlciAmSGRyID0gZ2V0SGVhZGVyKCk7CiAgIHVuc2lnbmVkIE51bUJ1Y2tldHMgPSBnZXRFbmRpYW5BZGp1c3RlZFdvcmQoSGRyLk51bUJ1Y2tldHMpOwogCiAgIC8vIElmIHRoZSBudW1iZXIgb2YgYnVja2V0cyBpcyBub3QgYSBwb3dlciBvZiB0d28sIHRoZSBoZWFkZXJtYXAgaXMgY29ycnVwdC4KICAgLy8gRG9uJ3QgcHJvYmUgaW5maW5pdGVseS4KICAgaWYgKE51bUJ1Y2tldHMgJiAoTnVtQnVja2V0cy0xKSkKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gU3RyaW5nUmVmKCk7CiAKICAgLy8gTGluZWFybHkgcHJvYmUgdGhlIGhhc2ggdGFibGUuCiAgIGZvciAodW5zaWduZWQgQnVja2V0ID0gSGFzaEhNYXBLZXkoRmlsZW5hbWUpOzsgKytCdWNrZXQpIHsKICAgICBITWFwQnVja2V0IEIgPSBnZXRCdWNrZXQoQnVja2V0ICYgKE51bUJ1Y2tldHMtMSkpOwotICAgIGlmIChCLktleSA9PSBITUFQX0VtcHR5QnVja2V0S2V5KSByZXR1cm4gMDsgLy8gSGFzaCBtaXNzLgorICAgIGlmIChCLktleSA9PSBITUFQX0VtcHR5QnVja2V0S2V5KSByZXR1cm4gU3RyaW5nUmVmKCk7IC8vIEhhc2ggbWlzcy4KIAogICAgIC8vIFNlZSBpZiB0aGUga2V5IG1hdGNoZXMuICBJZiBub3QsIHByb2JlIG9uLgogICAgIGlmICghRmlsZW5hbWUuZXF1YWxzX2xvd2VyKGdldFN0cmluZyhCLktleSkpKQpAQCAtMjIwLDkgKzIzMSwxMSBAQAogCiAgICAgLy8gSWYgc28sIHdlIGhhdmUgYSBtYXRjaCBpbiB0aGUgaGFzaCB0YWJsZS4gIENvbnN0cnVjdCB0aGUgZGVzdGluYXRpb24KICAgICAvLyBwYXRoLgotICAgIFNtYWxsU3RyaW5nPDEwMjQ+IERlc3RQYXRoOwotICAgIERlc3RQYXRoICs9IGdldFN0cmluZyhCLlByZWZpeCk7Ci0gICAgRGVzdFBhdGggKz0gZ2V0U3RyaW5nKEIuU3VmZml4KTsKLSAgICByZXR1cm4gRk0uZ2V0RmlsZShEZXN0UGF0aC5zdHIoKSk7CisgICAgU3RyaW5nUmVmIFByZWZpeCA9IGdldFN0cmluZyhCLlByZWZpeCk7CisgICAgU3RyaW5nUmVmIFN1ZmZpeCA9IGdldFN0cmluZyhCLlN1ZmZpeCk7CisgICAgRGVzdFBhdGguY2xlYXIoKTsKKyAgICBEZXN0UGF0aC5hcHBlbmQoUHJlZml4LmJlZ2luKCksIFByZWZpeC5lbmQoKSk7CisgICAgRGVzdFBhdGguYXBwZW5kKFN1ZmZpeC5iZWdpbigpLCBTdWZmaXguZW5kKCkpOworICAgIHJldHVybiBTdHJpbmdSZWYoRGVzdFBhdGguYmVnaW4oKSwgRGVzdFBhdGguc2l6ZSgpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL0xleC9IZWFkZXJTZWFyY2guY3BwIGIvbGliL0xleC9IZWFkZXJTZWFyY2guY3BwCmluZGV4IDllNDNkZGEuLmYwODEwMjQgMTAwNjQ0Ci0tLSBhL2xpYi9MZXgvSGVhZGVyU2VhcmNoLmNwcAorKysgYi9saWIvTGV4L0hlYWRlclNlYXJjaC5jcHAKQEAgLTEyLDExICsxMiwxMSBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgImNsYW5nL0xleC9IZWFkZXJTZWFyY2guaCIKLSNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRmlsZU1hbmFnZXIuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvSGVhZGVyTWFwLmgiCiAjaW5jbHVkZSAiY2xhbmcvTGV4L0hlYWRlclNlYXJjaE9wdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvTGV4RGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9MZXhlci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NhcGFjaXR5LmgiCkBAIC00NSwxMSArNDUsMTAgQEAKIAogSGVhZGVyU2VhcmNoOjpIZWFkZXJTZWFyY2goSW50cnVzaXZlUmVmQ250UHRyPEhlYWRlclNlYXJjaE9wdGlvbnM+IEhTT3B0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU1hbmFnZXIgJlNvdXJjZU1nciwgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxhbmdPcHRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluZm8gKlRhcmdldCkKLSAgOiBIU09wdHMoSFNPcHRzKSwgRmlsZU1ncihTb3VyY2VNZ3IuZ2V0RmlsZU1hbmFnZXIoKSksIEZyYW1ld29ya01hcCg2NCksCi0gICAgTW9kTWFwKFNvdXJjZU1nciwgKkRpYWdzLmdldENsaWVudCgpLCBMYW5nT3B0cywgVGFyZ2V0LCAqdGhpcykKLXsKKyAgICA6IEhTT3B0cyhIU09wdHMpLCBEaWFncyhEaWFncyksIEZpbGVNZ3IoU291cmNlTWdyLmdldEZpbGVNYW5hZ2VyKCkpLAorICAgICAgRnJhbWV3b3JrTWFwKDY0KSwgTW9kTWFwKFNvdXJjZU1nciwgRGlhZ3MsIExhbmdPcHRzLCBUYXJnZXQsICp0aGlzKSB7CiAgIEFuZ2xlZERpcklkeCA9IDA7CiAgIFN5c3RlbURpcklkeCA9IDA7CiAgIE5vQ3VyRGlyU2VhcmNoID0gZmFsc2U7CkBAIC01OSw2ICs1OCw4IEBACiAgIE51bUluY2x1ZGVkID0gMDsKICAgTnVtTXVsdGlJbmNsdWRlRmlsZU9wdHpuID0gMDsKICAgTnVtRnJhbWV3b3JrTG9va3VwcyA9IE51bVN1YkZyYW1ld29ya0xvb2t1cHMgPSAwOworCisgIEVuYWJsZWRNb2R1bGVzID0gTGFuZ09wdHMuTW9kdWxlczsKIH0KIAogSGVhZGVyU2VhcmNoOjp+SGVhZGVyU2VhcmNoKCkgewpAQCAtMTY0LDggKzE2NSw4IEBACiAKICAgICBib29sIElzU3lzdGVtID0gU2VhcmNoRGlyc1tJZHhdLmlzU3lzdGVtSGVhZGVyRGlyZWN0b3J5KCk7CiAgICAgLy8gU2VhcmNoIGZvciBhIG1vZHVsZSBtYXAgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeS4KLSAgICBpZiAobG9hZE1vZHVsZU1hcEZpbGUoU2VhcmNoRGlyc1tJZHhdLmdldERpcigpLCBJc1N5c3RlbSkKLSAgICAgICAgICA9PSBMTU1fTmV3bHlMb2FkZWQpIHsKKyAgICBpZiAobG9hZE1vZHVsZU1hcEZpbGUoU2VhcmNoRGlyc1tJZHhdLmdldERpcigpLCBJc1N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLypJc0ZyYW1ld29yayovZmFsc2UpID09IExNTV9OZXdseUxvYWRlZCkgewogICAgICAgLy8gV2UganVzdCBsb2FkZWQgYSBtb2R1bGUgbWFwIGZpbGU7IGNoZWNrIHdoZXRoZXIgdGhlIG1vZHVsZSBpcwogICAgICAgLy8gYXZhaWxhYmxlIG5vdy4KICAgICAgIE1vZHVsZSA9IE1vZE1hcC5maW5kTW9kdWxlKE1vZHVsZU5hbWUpOwpAQCAtMTc4LDcgKzE3OSw4IEBACiAgICAgU21hbGxTdHJpbmc8MTI4PiBOZXN0ZWRNb2R1bGVNYXBEaXJOYW1lOwogICAgIE5lc3RlZE1vZHVsZU1hcERpck5hbWUgPSBTZWFyY2hEaXJzW0lkeF0uZ2V0RGlyKCktPmdldE5hbWUoKTsKICAgICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChOZXN0ZWRNb2R1bGVNYXBEaXJOYW1lLCBNb2R1bGVOYW1lKTsKLSAgICBpZiAobG9hZE1vZHVsZU1hcEZpbGUoTmVzdGVkTW9kdWxlTWFwRGlyTmFtZSwgSXNTeXN0ZW0pID09IExNTV9OZXdseUxvYWRlZCl7CisgICAgaWYgKGxvYWRNb2R1bGVNYXBGaWxlKE5lc3RlZE1vZHVsZU1hcERpck5hbWUsIElzU3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAvKklzRnJhbWV3b3JrKi9mYWxzZSkgPT0gTE1NX05ld2x5TG9hZGVkKXsKICAgICAgIC8vIElmIHdlIGp1c3QgbG9hZGVkIGEgbW9kdWxlIG1hcCBmaWxlLCBsb29rIGZvciB0aGUgbW9kdWxlIGFnYWluLgogICAgICAgTW9kdWxlID0gTW9kTWFwLmZpbmRNb2R1bGUoTW9kdWxlTmFtZSk7CiAgICAgICBpZiAoTW9kdWxlKQpAQCAtMjE4LDE3ICsyMjAsNDYgQEAKICAgcmV0dXJuIGdldEhlYWRlck1hcCgpLT5nZXRGaWxlTmFtZSgpOwogfQogCitzdGF0aWMgY29uc3QgRmlsZUVudHJ5ICoKK2dldEZpbGVBbmRTdWdnZXN0TW9kdWxlKEhlYWRlclNlYXJjaCAmSFMsIFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXIsIGJvb2wgSXNTeXN0ZW1IZWFkZXJEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVNYXA6Oktub3duSGVhZGVyICpTdWdnZXN0ZWRNb2R1bGUpIHsKKyAgLy8gSWYgd2UgaGF2ZSBhIG1vZHVsZSBtYXAgdGhhdCBtaWdodCBtYXAgdGhpcyBoZWFkZXIsIGxvYWQgaXQgYW5kCisgIC8vIGNoZWNrIHdoZXRoZXIgd2UnbGwgaGF2ZSBhIHN1Z2dlc3Rpb24gZm9yIGEgbW9kdWxlLgorICBIUy5oYXNNb2R1bGVNYXAoRmlsZU5hbWUsIERpciwgSXNTeXN0ZW1IZWFkZXJEaXIpOworICBpZiAoU3VnZ2VzdGVkTW9kdWxlKSB7CisgICAgY29uc3QgRmlsZUVudHJ5ICpGaWxlID0gSFMuZ2V0RmlsZU1ncigpLmdldEZpbGUoRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypPcGVuRmlsZT0qL2ZhbHNlKTsKKyAgICBpZiAoRmlsZSkgeworICAgICAgLy8gSWYgdGhlcmUgaXMgYSBtb2R1bGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIGhlYWRlciwgc3VnZ2VzdCBpdC4KKyAgICAgICpTdWdnZXN0ZWRNb2R1bGUgPSBIUy5maW5kTW9kdWxlRm9ySGVhZGVyKEZpbGUpOworCisgICAgICAvLyBGSVhNRTogVGhpcyBhcHBlYXJzIHRvIGJlIGEgbm8tb3AuIFdlIGxvYWRlZCB0aGUgbW9kdWxlIG1hcCBmb3IgdGhpcworICAgICAgLy8gZGlyZWN0b3J5IGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uLgorICAgICAgaWYgKCFTdWdnZXN0ZWRNb2R1bGUtPmdldE1vZHVsZSgpICYmCisgICAgICAgICAgSFMuaGFzTW9kdWxlTWFwKEZpbGVOYW1lLCBEaXIsIElzU3lzdGVtSGVhZGVyRGlyKSkKKyAgICAgICAgKlN1Z2dlc3RlZE1vZHVsZSA9IEhTLmZpbmRNb2R1bGVGb3JIZWFkZXIoRmlsZSk7CisgICAgfQorCisgICAgcmV0dXJuIEZpbGU7CisgIH0KKworICByZXR1cm4gSFMuZ2V0RmlsZU1ncigpLmdldEZpbGUoRmlsZU5hbWUsIC8qb3BlbkZpbGU9Ki90cnVlKTsKK30KIAogLy8vIExvb2t1cEZpbGUgLSBMb29rdXAgdGhlIHNwZWNpZmllZCBmaWxlIGluIHRoaXMgc2VhcmNoIHBhdGgsIHJldHVybmluZyBpdAogLy8vIGlmIGl0IGV4aXN0cyBvciByZXR1cm5pbmcgbnVsbCBpZiBub3QuCiBjb25zdCBGaWxlRW50cnkgKkRpcmVjdG9yeUxvb2t1cDo6TG9va3VwRmlsZSgKLSAgICBTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgU3RyaW5nUmVmICZGaWxlbmFtZSwKICAgICBIZWFkZXJTZWFyY2ggJkhTLAogICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqU2VhcmNoUGF0aCwKICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gKlJlbGF0aXZlUGF0aCwKICAgICBNb2R1bGVNYXA6Oktub3duSGVhZGVyICpTdWdnZXN0ZWRNb2R1bGUsCi0gICAgYm9vbCAmSW5Vc2VyU3BlY2lmaWVkU3lzdGVtRnJhbWV3b3JrKSBjb25zdCB7CisgICAgYm9vbCAmSW5Vc2VyU3BlY2lmaWVkU3lzdGVtRnJhbWV3b3JrLAorICAgIGJvb2wgJkhhc0JlZW5NYXBwZWQsCisgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZNYXBwZWROYW1lKSBjb25zdCB7CiAgIEluVXNlclNwZWNpZmllZFN5c3RlbUZyYW1ld29yayA9IGZhbHNlOworICBIYXNCZWVuTWFwcGVkID0gZmFsc2U7CiAKICAgU21hbGxTdHJpbmc8MTAyND4gVG1wRGlyOwogICBpZiAoaXNOb3JtYWxEaXIoKSkgewpAQCAtMjQ0LDI1ICsyNzUsMTAgQEAKICAgICAgIFJlbGF0aXZlUGF0aC0+Y2xlYXIoKTsKICAgICAgIFJlbGF0aXZlUGF0aC0+YXBwZW5kKEZpbGVuYW1lLmJlZ2luKCksIEZpbGVuYW1lLmVuZCgpKTsKICAgICB9Ci0gICAgCi0gICAgLy8gSWYgd2UgaGF2ZSBhIG1vZHVsZSBtYXAgdGhhdCBtaWdodCBtYXAgdGhpcyBoZWFkZXIsIGxvYWQgaXQgYW5kCi0gICAgLy8gY2hlY2sgd2hldGhlciB3ZSdsbCBoYXZlIGEgc3VnZ2VzdGlvbiBmb3IgYSBtb2R1bGUuCi0gICAgSFMuaGFzTW9kdWxlTWFwKFRtcERpciwgZ2V0RGlyKCksIGlzU3lzdGVtSGVhZGVyRGlyZWN0b3J5KCkpOwotICAgIGlmIChTdWdnZXN0ZWRNb2R1bGUpIHsKLSAgICAgIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSA9IEhTLmdldEZpbGVNZ3IoKS5nZXRGaWxlKFRtcERpci5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3BlbkZpbGU9Ki9mYWxzZSk7Ci0gICAgICBpZiAoIUZpbGUpCi0gICAgICAgIHJldHVybiBGaWxlOwotICAgICAgCi0gICAgICAvLyBJZiB0aGVyZSBpcyBhIG1vZHVsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgaGVhZGVyLCBzdWdnZXN0IGl0LgotICAgICAgKlN1Z2dlc3RlZE1vZHVsZSA9IEhTLmZpbmRNb2R1bGVGb3JIZWFkZXIoRmlsZSk7Ci0gICAgICBpZiAoIVN1Z2dlc3RlZE1vZHVsZS0+Z2V0TW9kdWxlKCkgJiYKLSAgICAgICAgICBIUy5oYXNNb2R1bGVNYXAoVG1wRGlyLCBnZXREaXIoKSwgaXNTeXN0ZW1IZWFkZXJEaXJlY3RvcnkoKSkpCi0gICAgICAgICpTdWdnZXN0ZWRNb2R1bGUgPSBIUy5maW5kTW9kdWxlRm9ySGVhZGVyKEZpbGUpOwotICAgICAgcmV0dXJuIEZpbGU7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBIUy5nZXRGaWxlTWdyKCkuZ2V0RmlsZShUbXBEaXIuc3RyKCksIC8qb3BlbkZpbGU9Ki90cnVlKTsKKworICAgIHJldHVybiBnZXRGaWxlQW5kU3VnZ2VzdE1vZHVsZShIUywgVG1wRGlyLnN0cigpLCBnZXREaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTeXN0ZW1IZWFkZXJEaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VnZ2VzdGVkTW9kdWxlKTsKICAgfQogCiAgIGlmIChpc0ZyYW1ld29yaygpKQpAQCAtMjcwLDggKzI4NiwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWdnZXN0ZWRNb2R1bGUsIEluVXNlclNwZWNpZmllZFN5c3RlbUZyYW1ld29yayk7CiAKICAgYXNzZXJ0KGlzSGVhZGVyTWFwKCkgJiYgIlVua25vd24gZGlyZWN0b3J5IGxvb2t1cCIpOwotICBjb25zdCBGaWxlRW50cnkgKiBjb25zdCBSZXN1bHQgPSBnZXRIZWFkZXJNYXAoKS0+TG9va3VwRmlsZSgKLSAgICAgIEZpbGVuYW1lLCBIUy5nZXRGaWxlTWdyKCkpOworICBjb25zdCBIZWFkZXJNYXAgKkhNID0gZ2V0SGVhZGVyTWFwKCk7CisgIFNtYWxsU3RyaW5nPDEwMjQ+IFBhdGg7CisgIFN0cmluZ1JlZiBEZXN0ID0gSE0tPmxvb2t1cEZpbGVuYW1lKEZpbGVuYW1lLCBQYXRoKTsKKyAgaWYgKERlc3QuZW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKworICBjb25zdCBGaWxlRW50cnkgKlJlc3VsdDsKKworICAvLyBDaGVjayBpZiB0aGUgaGVhZGVybWFwIG1hcHMgdGhlIGZpbGVuYW1lIHRvIGEgZnJhbWV3b3JrIGluY2x1ZGUKKyAgLy8gKCJGb28uaCIgLT4gIkZvby9Gb28uaCIpLCBpbiB3aGljaCBjYXNlIGNvbnRpbnVlIGhlYWRlciBsb29rdXAgdXNpbmcgdGhlCisgIC8vIGZyYW1ld29yayBpbmNsdWRlLgorICBpZiAobGx2bTo6c3lzOjpwYXRoOjppc19yZWxhdGl2ZShEZXN0KSkgeworICAgIE1hcHBlZE5hbWUuY2xlYXIoKTsKKyAgICBNYXBwZWROYW1lLmFwcGVuZChEZXN0LmJlZ2luKCksIERlc3QuZW5kKCkpOworICAgIEZpbGVuYW1lID0gU3RyaW5nUmVmKE1hcHBlZE5hbWUuYmVnaW4oKSwgTWFwcGVkTmFtZS5zaXplKCkpOworICAgIEhhc0JlZW5NYXBwZWQgPSB0cnVlOworICAgIFJlc3VsdCA9IEhNLT5Mb29rdXBGaWxlKEZpbGVuYW1lLCBIUy5nZXRGaWxlTWdyKCkpOworCisgIH0gZWxzZSB7CisgICAgUmVzdWx0ID0gSFMuZ2V0RmlsZU1ncigpLmdldEZpbGUoRGVzdCk7CisgIH0KKwogICBpZiAoUmVzdWx0KSB7CiAgICAgaWYgKFNlYXJjaFBhdGggIT0gTlVMTCkgewogICAgICAgU3RyaW5nUmVmIFNlYXJjaFBhdGhSZWYoZ2V0TmFtZSgpKTsKQEAgLTQ4OCwyOCArNTI0LDQzIEBACiAvLyBIZWFkZXIgRmlsZSBMb2NhdGlvbi4KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKKy8vLyBcYnJpZWYgUmV0dXJuIHRydWUgd2l0aCBhIGRpYWdub3N0aWMgaWYgdGhlIGZpbGUgdGhhdCBNU1ZDIHdvdWxkIGhhdmUgZm91bmQKKy8vLyBmYWlscyB0byBtYXRjaCB0aGUgb25lIHRoYXQgQ2xhbmcgd291bGQgaGF2ZSBmb3VuZCB3aXRoIE1TVkMgaGVhZGVyIHNlYXJjaAorLy8vIGRpc2FibGVkLgorc3RhdGljIGJvb2wgY2hlY2tNU1ZDSGVhZGVyU2VhcmNoKERpYWdub3N0aWNzRW5naW5lICZEaWFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRW50cnkgKk1TRkUsIGNvbnN0IEZpbGVFbnRyeSAqRkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW5jbHVkZUxvYykgeworICBpZiAoTVNGRSAmJiBGRSAhPSBNU0ZFKSB7CisgICAgRGlhZ3MuUmVwb3J0KEluY2x1ZGVMb2MsIGRpYWc6OmV4dF9wcF9pbmNsdWRlX3NlYXJjaF9tcykgPDwgTVNGRS0+Z2V0TmFtZSgpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvcHlTdHJpbmcoU3RyaW5nUmVmIFN0ciwgbGx2bTo6QnVtcFB0ckFsbG9jYXRvciAmQWxsb2MpIHsKKyAgYXNzZXJ0KCFTdHIuZW1wdHkoKSk7CisgIGNoYXIgKkNvcHlTdHIgPSBBbGxvYy5BbGxvY2F0ZTxjaGFyPihTdHIuc2l6ZSgpKzEpOworICBzdGQ6OmNvcHkoU3RyLmJlZ2luKCksIFN0ci5lbmQoKSwgQ29weVN0cik7CisgIENvcHlTdHJbU3RyLnNpemUoKV0gPSAnXDAnOworICByZXR1cm4gQ29weVN0cjsKK30KIAogLy8vIExvb2t1cEZpbGUgLSBHaXZlbiBhICJmb28iIG9yIFw8Zm9vPiByZWZlcmVuY2UsIGxvb2sgdXAgdGhlIGluZGljYXRlZCBmaWxlLAogLy8vIHJldHVybiBudWxsIG9uIGZhaWx1cmUuICBpc0FuZ2xlZCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlsZSByZWZlcmVuY2UgaXMKLS8vLyBmb3Igc3lzdGVtIFwjaW5jbHVkZSdzIG9yIG5vdCAoaS5lLiB1c2luZyA8PiBpbnN0ZWFkIG9mICIiKS4gIEN1ckZpbGVFbnQsIGlmCi0vLy8gbm9uLW51bGwsIGluZGljYXRlcyB3aGVyZSB0aGUgXCNpbmNsdWRpbmcgZmlsZSBpcywgaW4gY2FzZSBhIHJlbGF0aXZlIHNlYXJjaAotLy8vIGlzIG5lZWRlZC4KKy8vLyBmb3Igc3lzdGVtIFwjaW5jbHVkZSdzIG9yIG5vdCAoaS5lLiB1c2luZyA8PiBpbnN0ZWFkIG9mICIiKS4gSW5jbHVkZXJzLCBpZgorLy8vIG5vbi1lbXB0eSwgaW5kaWNhdGVzIHdoZXJlIHRoZSBcI2luY2x1ZGluZyBmaWxlKHMpIGFyZSwgaW4gY2FzZSBhIHJlbGF0aXZlCisvLy8gc2VhcmNoIGlzIG5lZWRlZC4gTWljcm9zb2Z0IG1vZGUgd2lsbCBwYXNzIGFsbCBcI2luY2x1ZGluZyBmaWxlcy4KIGNvbnN0IEZpbGVFbnRyeSAqSGVhZGVyU2VhcmNoOjpMb29rdXBGaWxlKAotICAgIFN0cmluZ1JlZiBGaWxlbmFtZSwKLSAgICBib29sIGlzQW5nbGVkLAotICAgIGNvbnN0IERpcmVjdG9yeUxvb2t1cCAqRnJvbURpciwKLSAgICBjb25zdCBEaXJlY3RvcnlMb29rdXAgKiZDdXJEaXIsCi0gICAgY29uc3QgRmlsZUVudHJ5ICpDdXJGaWxlRW50LAotICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqU2VhcmNoUGF0aCwKKyAgICBTdHJpbmdSZWYgRmlsZW5hbWUsIFNvdXJjZUxvY2F0aW9uIEluY2x1ZGVMb2MsIGJvb2wgaXNBbmdsZWQsCisgICAgY29uc3QgRGlyZWN0b3J5TG9va3VwICpGcm9tRGlyLCBjb25zdCBEaXJlY3RvcnlMb29rdXAgKiZDdXJEaXIsCisgICAgQXJyYXlSZWY8Y29uc3QgRmlsZUVudHJ5ICo+IEluY2x1ZGVycywgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICpTZWFyY2hQYXRoLAogICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAqUmVsYXRpdmVQYXRoLAotICAgIE1vZHVsZU1hcDo6S25vd25IZWFkZXIgKlN1Z2dlc3RlZE1vZHVsZSwKLSAgICBib29sIFNraXBDYWNoZSkKLXsKKyAgICBNb2R1bGVNYXA6Oktub3duSGVhZGVyICpTdWdnZXN0ZWRNb2R1bGUsIGJvb2wgU2tpcENhY2hlKSB7CiAgIGlmICghSFNPcHRzLT5Nb2R1bGVNYXBGaWxlcy5lbXB0eSgpKSB7CiAgICAgLy8gUHJlbG9hZCBhbGwgZXhwbGljaXRseSBzcGVjaWZpZWQgbW9kdWxlIG1hcCBmaWxlcy4gVGhpcyBlbmFibGVzIG1vZHVsZXMKICAgICAvLyBtYXAgZmlsZXMgbHlpbmcgaW4gYSBkaXJlY3Rvcnkgc3RydWN0dXJlIHNlcGFyYXRlIGZyb20gdGhlIGhlYWRlciBmaWxlcwogICAgIC8vIHRoYXQgdGhleSBkZXNjcmliZS4gVGhlc2UgY2Fubm90IGJlIGxvYWRlZCBsYXppbHkgdXBvbiBlbmNvdW50ZXJpbmcgYQotICAgIC8vIGhlYWRlciBmaWxlLCBhcyB0aGVyZSBpcyBubyBvdGhlciBrbndvbiBtYXBwaW5nIGZyb20gYSBoZWFkZXIgZmlsZSB0byBpdHMKKyAgICAvLyBoZWFkZXIgZmlsZSwgYXMgdGhlcmUgaXMgbm8gb3RoZXIga25vd24gbWFwcGluZyBmcm9tIGEgaGVhZGVyIGZpbGUgdG8gaXRzCiAgICAgLy8gbW9kdWxlIG1hcCBmaWxlLgogICAgIGZvciAobGx2bTo6U2V0VmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IKICAgICAgICAgICAgICBJID0gSFNPcHRzLT5Nb2R1bGVNYXBGaWxlcy5iZWdpbigpLApAQCAtNTQzLDQ1ICs1OTQsODAgQEAKICAgICByZXR1cm4gRmlsZU1nci5nZXRGaWxlKEZpbGVuYW1lLCAvKm9wZW5GaWxlPSovdHJ1ZSk7CiAgIH0KIAorICAvLyBUaGlzIGlzIHRoZSBoZWFkZXIgdGhhdCBNU1ZDJ3MgaGVhZGVyIHNlYXJjaCB3b3VsZCBoYXZlIGZvdW5kLgorICBjb25zdCBGaWxlRW50cnkgKk1TRkUgPSAwOworICBNb2R1bGVNYXA6Oktub3duSGVhZGVyIE1TU3VnZ2VzdGVkTW9kdWxlOworCiAgIC8vIFVubGVzcyBkaXNhYmxlZCwgY2hlY2sgdG8gc2VlIGlmIHRoZSBmaWxlIGlzIGluIHRoZSAjaW5jbHVkZXIncwotICAvLyBkaXJlY3RvcnkuICBUaGlzIGhhcyB0byBiZSBiYXNlZCBvbiBDdXJGaWxlRW50LCBub3QgQ3VyRGlyLCBiZWNhdXNlCi0gIC8vIEN1ckZpbGVFbnQgY291bGQgYmUgYSAjaW5jbHVkZSBvZiBhIHN1YmRpcmVjdG9yeSAoI2luY2x1ZGUgImZvby9iYXIuaCIpIGFuZAotICAvLyBhIHN1YnNlcXVlbnQgaW5jbHVkZSBvZiAiYmF6LmgiIHNob3VsZCByZXNvbHZlIHRvICJ3aGF0ZXZlci9mb28vYmF6LmgiLgorICAvLyBkaXJlY3RvcnkuICBUaGlzIGNhbm5vdCBiZSBiYXNlZCBvbiBDdXJEaXIsIGJlY2F1c2UgZWFjaCBpbmNsdWRlciBjb3VsZCBiZQorICAvLyBhICNpbmNsdWRlIG9mIGEgc3ViZGlyZWN0b3J5ICgjaW5jbHVkZSAiZm9vL2Jhci5oIikgYW5kIGEgc3Vic2VxdWVudAorICAvLyBpbmNsdWRlIG9mICJiYXouaCIgc2hvdWxkIHJlc29sdmUgdG8gIndoYXRldmVyL2Zvby9iYXouaCIuCiAgIC8vIFRoaXMgc2VhcmNoIGlzIG5vdCBkb25lIGZvciA8PiBoZWFkZXJzLgotICBpZiAoQ3VyRmlsZUVudCAmJiAhaXNBbmdsZWQgJiYgIU5vQ3VyRGlyU2VhcmNoKSB7CisgIGlmICghSW5jbHVkZXJzLmVtcHR5KCkgJiYgIWlzQW5nbGVkICYmICFOb0N1ckRpclNlYXJjaCkgewogICAgIFNtYWxsU3RyaW5nPDEwMjQ+IFRtcERpcjsKLSAgICAvLyBDb25jYXRlbmF0ZSB0aGUgcmVxdWVzdGVkIGZpbGUgb250byB0aGUgZGlyZWN0b3J5LgotICAgIC8vIEZJWE1FOiBQb3J0YWJpbGl0eS4gIEZpbGVuYW1lIGNvbmNhdGVuYXRpb24gc2hvdWxkIGJlIGluIHN5czo6UGF0aC4KLSAgICBUbXBEaXIgKz0gQ3VyRmlsZUVudC0+Z2V0RGlyKCktPmdldE5hbWUoKTsKLSAgICBUbXBEaXIucHVzaF9iYWNrKCcvJyk7Ci0gICAgVG1wRGlyLmFwcGVuZChGaWxlbmFtZS5iZWdpbigpLCBGaWxlbmFtZS5lbmQoKSk7Ci0gICAgaWYgKGNvbnN0IEZpbGVFbnRyeSAqRkUgPSBGaWxlTWdyLmdldEZpbGUoVG1wRGlyLnN0cigpLC8qb3BlbkZpbGU9Ki90cnVlKSkgewotICAgICAgLy8gTGVhdmUgQ3VyRGlyIHVuc2V0LgotICAgICAgLy8gVGhpcyBmaWxlIGlzIGEgc3lzdGVtIGhlYWRlciBvciBDKysgdW5mcmllbmRseSBpZiB0aGUgb2xkIGZpbGUgaXMuCi0gICAgICAvLwotICAgICAgLy8gTm90ZSB0aGF0IHdlIG9ubHkgdXNlIG9uZSBvZiBGcm9tSEZJL1RvSEZJIGF0IG9uY2UsIGR1ZSB0byBwb3RlbnRpYWwKLSAgICAgIC8vIHJlYWxsb2NhdGlvbiBvZiB0aGUgdW5kZXJseWluZyB2ZWN0b3IgcG90ZW50aWFsbHkgbWFraW5nIHRoZSBmaXJzdAotICAgICAgLy8gcmVmZXJlbmNlIGJpbmRpbmcgZGFuZ2xpbmcuCi0gICAgICBIZWFkZXJGaWxlSW5mbyAmRnJvbUhGSSA9IGdldEZpbGVJbmZvKEN1ckZpbGVFbnQpOwotICAgICAgdW5zaWduZWQgRGlySW5mbyA9IEZyb21IRkkuRGlySW5mbzsKLSAgICAgIGJvb2wgSW5kZXhIZWFkZXJNYXBIZWFkZXIgPSBGcm9tSEZJLkluZGV4SGVhZGVyTWFwSGVhZGVyOwotICAgICAgU3RyaW5nUmVmIEZyYW1ld29yayA9IEZyb21IRkkuRnJhbWV3b3JrOworICAgIGZvciAoQXJyYXlSZWY8Y29uc3QgRmlsZUVudHJ5ICo+OjppdGVyYXRvciBJID0gSW5jbHVkZXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBJbmNsdWRlcnMuZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgY29uc3QgRmlsZUVudHJ5ICpJbmNsdWRlciA9ICpJOworICAgICAgLy8gQ29uY2F0ZW5hdGUgdGhlIHJlcXVlc3RlZCBmaWxlIG9udG8gdGhlIGRpcmVjdG9yeS4KKyAgICAgIC8vIEZJWE1FOiBQb3J0YWJpbGl0eS4gIEZpbGVuYW1lIGNvbmNhdGVuYXRpb24gc2hvdWxkIGJlIGluIHN5czo6UGF0aC4KKyAgICAgIFRtcERpciA9IEluY2x1ZGVyLT5nZXREaXIoKS0+Z2V0TmFtZSgpOworICAgICAgVG1wRGlyLnB1c2hfYmFjaygnLycpOworICAgICAgVG1wRGlyLmFwcGVuZChGaWxlbmFtZS5iZWdpbigpLCBGaWxlbmFtZS5lbmQoKSk7CiAKLSAgICAgIEhlYWRlckZpbGVJbmZvICZUb0hGSSA9IGdldEZpbGVJbmZvKEZFKTsKLSAgICAgIFRvSEZJLkRpckluZm8gPSBEaXJJbmZvOwotICAgICAgVG9IRkkuSW5kZXhIZWFkZXJNYXBIZWFkZXIgPSBJbmRleEhlYWRlck1hcEhlYWRlcjsKLSAgICAgIFRvSEZJLkZyYW1ld29yayA9IEZyYW1ld29yazsKKyAgICAgIC8vIEZJWE1FOiBXZSBkb24ndCBjYWNoZSB0aGUgcmVzdWx0IG9mIGdldEZpbGVJbmZvIGFjcm9zcyB0aGUgY2FsbCB0bworICAgICAgLy8gZ2V0RmlsZUFuZFN1Z2dlc3RNb2R1bGUsIGJlY2F1c2UgaXQncyBhIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50IG9mCisgICAgICAvLyBhIGNvbnRhaW5lciB0aGF0IGNvdWxkIGJlIHJlYWxsb2NhdGVkIGFjcm9zcyB0aGlzIGNhbGwuCisgICAgICBib29sIEluY2x1ZGVySXNTeXN0ZW1IZWFkZXIgPQorICAgICAgICAgIGdldEZpbGVJbmZvKEluY2x1ZGVyKS5EaXJJbmZvICE9IFNyY01ncjo6Q19Vc2VyOworICAgICAgaWYgKGNvbnN0IEZpbGVFbnRyeSAqRkUgPQorICAgICAgICAgICAgICBnZXRGaWxlQW5kU3VnZ2VzdE1vZHVsZSgqdGhpcywgVG1wRGlyLnN0cigpLCBJbmNsdWRlci0+Z2V0RGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGVySXNTeXN0ZW1IZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Z2dlc3RlZE1vZHVsZSkpIHsKKyAgICAgICAgLy8gTGVhdmUgQ3VyRGlyIHVuc2V0LgorICAgICAgICAvLyBUaGlzIGZpbGUgaXMgYSBzeXN0ZW0gaGVhZGVyIG9yIEMrKyB1bmZyaWVuZGx5IGlmIHRoZSBvbGQgZmlsZSBpcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm90ZSB0aGF0IHdlIG9ubHkgdXNlIG9uZSBvZiBGcm9tSEZJL1RvSEZJIGF0IG9uY2UsIGR1ZSB0byBwb3RlbnRpYWwKKyAgICAgICAgLy8gcmVhbGxvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIHZlY3RvciBwb3RlbnRpYWxseSBtYWtpbmcgdGhlIGZpcnN0CisgICAgICAgIC8vIHJlZmVyZW5jZSBiaW5kaW5nIGRhbmdsaW5nLgorICAgICAgICBIZWFkZXJGaWxlSW5mbyAmRnJvbUhGSSA9IGdldEZpbGVJbmZvKEluY2x1ZGVyKTsKKyAgICAgICAgdW5zaWduZWQgRGlySW5mbyA9IEZyb21IRkkuRGlySW5mbzsKKyAgICAgICAgYm9vbCBJbmRleEhlYWRlck1hcEhlYWRlciA9IEZyb21IRkkuSW5kZXhIZWFkZXJNYXBIZWFkZXI7CisgICAgICAgIFN0cmluZ1JlZiBGcmFtZXdvcmsgPSBGcm9tSEZJLkZyYW1ld29yazsKIAotICAgICAgaWYgKFNlYXJjaFBhdGggIT0gTlVMTCkgewotICAgICAgICBTdHJpbmdSZWYgU2VhcmNoUGF0aFJlZihDdXJGaWxlRW50LT5nZXREaXIoKS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgU2VhcmNoUGF0aC0+Y2xlYXIoKTsKLSAgICAgICAgU2VhcmNoUGF0aC0+YXBwZW5kKFNlYXJjaFBhdGhSZWYuYmVnaW4oKSwgU2VhcmNoUGF0aFJlZi5lbmQoKSk7CisgICAgICAgIEhlYWRlckZpbGVJbmZvICZUb0hGSSA9IGdldEZpbGVJbmZvKEZFKTsKKyAgICAgICAgVG9IRkkuRGlySW5mbyA9IERpckluZm87CisgICAgICAgIFRvSEZJLkluZGV4SGVhZGVyTWFwSGVhZGVyID0gSW5kZXhIZWFkZXJNYXBIZWFkZXI7CisgICAgICAgIFRvSEZJLkZyYW1ld29yayA9IEZyYW1ld29yazsKKworICAgICAgICBpZiAoU2VhcmNoUGF0aCAhPSBOVUxMKSB7CisgICAgICAgICAgU3RyaW5nUmVmIFNlYXJjaFBhdGhSZWYoSW5jbHVkZXItPmdldERpcigpLT5nZXROYW1lKCkpOworICAgICAgICAgIFNlYXJjaFBhdGgtPmNsZWFyKCk7CisgICAgICAgICAgU2VhcmNoUGF0aC0+YXBwZW5kKFNlYXJjaFBhdGhSZWYuYmVnaW4oKSwgU2VhcmNoUGF0aFJlZi5lbmQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFJlbGF0aXZlUGF0aCAhPSBOVUxMKSB7CisgICAgICAgICAgUmVsYXRpdmVQYXRoLT5jbGVhcigpOworICAgICAgICAgIFJlbGF0aXZlUGF0aC0+YXBwZW5kKEZpbGVuYW1lLmJlZ2luKCksIEZpbGVuYW1lLmVuZCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoSSA9PSBJbmNsdWRlcnMuYmVnaW4oKSkKKyAgICAgICAgICByZXR1cm4gRkU7CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBmb3VuZCB0aGUgcGF0aCB2aWEgTVNWQyBoZWFkZXIgc2VhcmNoIHJ1bGVzLiAgSWYKKyAgICAgICAgLy8gLVdtc3ZjLWluY2x1ZGUgaXMgZW5hYmxlZCwgd2UgaGF2ZSB0byBrZWVwIHNlYXJjaGluZyB0byBzZWUgaWYgd2UKKyAgICAgICAgLy8gd291bGQndmUgZm91bmQgdGhpcyBoZWFkZXIgaW4gLUkgb3IgLWlzeXN0ZW0gZGlyZWN0b3JpZXMuCisgICAgICAgIGlmIChEaWFncy5nZXREaWFnbm9zdGljTGV2ZWwoZGlhZzo6ZXh0X3BwX2luY2x1ZGVfc2VhcmNoX21zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGVMb2MpID09CisgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6SWdub3JlZCkgeworICAgICAgICAgIHJldHVybiBGRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBNU0ZFID0gRkU7CisgICAgICAgICAgaWYgKFN1Z2dlc3RlZE1vZHVsZSkgeworICAgICAgICAgICAgTVNTdWdnZXN0ZWRNb2R1bGUgPSAqU3VnZ2VzdGVkTW9kdWxlOworICAgICAgICAgICAgKlN1Z2dlc3RlZE1vZHVsZSA9IE1vZHVsZU1hcDo6S25vd25IZWFkZXIoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmIChSZWxhdGl2ZVBhdGggIT0gTlVMTCkgewotICAgICAgICBSZWxhdGl2ZVBhdGgtPmNsZWFyKCk7Ci0gICAgICAgIFJlbGF0aXZlUGF0aC0+YXBwZW5kKEZpbGVuYW1lLmJlZ2luKCksIEZpbGVuYW1lLmVuZCgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBGRTsKICAgICB9CiAgIH0KIApAQCAtNTk5LDI4ICs2ODUsMzggQEAKICAgLy8gbXVsdGlwbHkgaW5jbHVkZWQsIGFuZCB0aGUgInByYWdtYSBvbmNlIiBvcHRpbWl6YXRpb24gcHJldmVudHMgdGhlbSBmcm9tCiAgIC8vIGJlaW5nIHJlbGV4L3BwJ2QsIGJ1dCB0aGV5IHdvdWxkIHN0aWxsIGhhdmUgdG8gc2VhcmNoIHRocm91Z2ggYQogICAvLyAocG90ZW50aWFsbHkgaHVnZSkgc2VyaWVzIG9mIFNlYXJjaERpcnMgdG8gZmluZCBpdC4KLSAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gJkNhY2hlTG9va3VwID0KKyAgTG9va3VwRmlsZUNhY2hlSW5mbyAmQ2FjaGVMb29rdXAgPQogICAgIExvb2t1cEZpbGVDYWNoZS5HZXRPckNyZWF0ZVZhbHVlKEZpbGVuYW1lKS5nZXRWYWx1ZSgpOwogCiAgIC8vIElmIHRoZSBlbnRyeSBoYXMgYmVlbiBwcmV2aW91c2x5IGxvb2tlZCB1cCwgdGhlIGZpcnN0IHZhbHVlIHdpbGwgYmUKICAgLy8gbm9uLXplcm8uICBJZiB0aGUgdmFsdWUgaXMgZXF1YWwgdG8gaSAodGhlIHN0YXJ0IHBvaW50IG9mIG91ciBzZWFyY2gpLCB0aGVuCiAgIC8vIHRoaXMgaXMgYSBtYXRjaGluZyBoaXQuCi0gIGlmICghU2tpcENhY2hlICYmIENhY2hlTG9va3VwLmZpcnN0ID09IGkrMSkgeworICBpZiAoIVNraXBDYWNoZSAmJiBDYWNoZUxvb2t1cC5TdGFydElkeCA9PSBpKzEpIHsKICAgICAvLyBTa2lwIHF1ZXJ5aW5nIHBvdGVudGlhbGx5IGxvdHMgb2YgZGlyZWN0b3JpZXMgZm9yIHRoaXMgbG9va3VwLgotICAgIGkgPSBDYWNoZUxvb2t1cC5zZWNvbmQ7CisgICAgaSA9IENhY2hlTG9va3VwLkhpdElkeDsKKyAgICBpZiAoQ2FjaGVMb29rdXAuTWFwcGVkTmFtZSkKKyAgICAgIEZpbGVuYW1lID0gQ2FjaGVMb29rdXAuTWFwcGVkTmFtZTsKICAgfSBlbHNlIHsKICAgICAvLyBPdGhlcndpc2UsIHRoaXMgaXMgdGhlIGZpcnN0IHF1ZXJ5LCBvciB0aGUgcHJldmlvdXMgcXVlcnkgZGlkbid0IG1hdGNoCiAgICAgLy8gb3VyIHNlYXJjaCBzdGFydC4gIFdlIHdpbGwgZmlsbCBpbiBvdXIgZm91bmQgbG9jYXRpb24gYmVsb3csIHNvIHByaW1lIHRoZQogICAgIC8vIHN0YXJ0IHBvaW50IHZhbHVlLgotICAgIENhY2hlTG9va3VwLmZpcnN0ID0gaSsxOworICAgIENhY2hlTG9va3VwLnJlc2V0KC8qU3RhcnRJZHg9Ki9pKzEpOwogICB9CiAKKyAgU21hbGxTdHJpbmc8NjQ+IE1hcHBlZE5hbWU7CisKICAgLy8gQ2hlY2sgZWFjaCBkaXJlY3RvcnkgaW4gc2VxdWVuY2UgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIHRoaXMgZmlsZS4KICAgZm9yICg7IGkgIT0gU2VhcmNoRGlycy5zaXplKCk7ICsraSkgewogICAgIGJvb2wgSW5Vc2VyU3BlY2lmaWVkU3lzdGVtRnJhbWV3b3JrID0gZmFsc2U7CisgICAgYm9vbCBIYXNCZWVuTWFwcGVkID0gZmFsc2U7CiAgICAgY29uc3QgRmlsZUVudHJ5ICpGRSA9CiAgICAgICBTZWFyY2hEaXJzW2ldLkxvb2t1cEZpbGUoRmlsZW5hbWUsICp0aGlzLCBTZWFyY2hQYXRoLCBSZWxhdGl2ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VnZ2VzdGVkTW9kdWxlLCBJblVzZXJTcGVjaWZpZWRTeXN0ZW1GcmFtZXdvcmspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Z2dlc3RlZE1vZHVsZSwgSW5Vc2VyU3BlY2lmaWVkU3lzdGVtRnJhbWV3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc0JlZW5NYXBwZWQsIE1hcHBlZE5hbWUpOworICAgIGlmIChIYXNCZWVuTWFwcGVkKSB7CisgICAgICBDYWNoZUxvb2t1cC5NYXBwZWROYW1lID0KKyAgICAgICAgICBjb3B5U3RyaW5nKEZpbGVuYW1lLCBMb29rdXBGaWxlQ2FjaGUuZ2V0QWxsb2NhdG9yKCkpOworICAgIH0KICAgICBpZiAoIUZFKSBjb250aW51ZTsKIAogICAgIEN1ckRpciA9ICZTZWFyY2hEaXJzW2ldOwpAQCAtNjU1LDkgKzc1MSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xhc2hQb3MpKTsKICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICBpZiAoY2hlY2tNU1ZDSGVhZGVyU2VhcmNoKERpYWdzLCBNU0ZFLCBGRSwgSW5jbHVkZUxvYykpIHsKKyAgICAgIGlmIChTdWdnZXN0ZWRNb2R1bGUpCisgICAgICAgICpTdWdnZXN0ZWRNb2R1bGUgPSBNU1N1Z2dlc3RlZE1vZHVsZTsKKyAgICAgIHJldHVybiBNU0ZFOworICAgIH0KKwogICAgIC8vIFJlbWVtYmVyIHRoaXMgbG9jYXRpb24gZm9yIHRoZSBuZXh0IGxvb2t1cCB3ZSBkby4KLSAgICBDYWNoZUxvb2t1cC5zZWNvbmQgPSBpOworICAgIENhY2hlTG9va3VwLkhpdElkeCA9IGk7CiAgICAgcmV0dXJuIEZFOwogICB9CiAKQEAgLTY2NSwyOCArNzY3LDQyIEBACiAgIC8vIGEgaGVhZGVyIGluIGEgZnJhbWV3b3JrIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGJ1aWx0LCBhbmQgd2UgY291bGRuJ3QKICAgLy8gcmVzb2x2ZSAiZm9vLmgiIGFueSBvdGhlciB3YXksIGNoYW5nZSB0aGUgaW5jbHVkZSB0byA8Rm9vL2Zvby5oPiwgd2hlcmUKICAgLy8gIkZvbyIgaXMgdGhlIG5hbWUgb2YgdGhlIGZyYW1ld29yayBpbiB3aGljaCB0aGUgaW5jbHVkaW5nIGhlYWRlciB3YXMgZm91bmQuCi0gIGlmIChDdXJGaWxlRW50ICYmICFpc0FuZ2xlZCAmJiBGaWxlbmFtZS5maW5kKCcvJykgPT0gU3RyaW5nUmVmOjpucG9zKSB7Ci0gICAgSGVhZGVyRmlsZUluZm8gJkluY2x1ZGluZ0hGSSA9IGdldEZpbGVJbmZvKEN1ckZpbGVFbnQpOworICBpZiAoIUluY2x1ZGVycy5lbXB0eSgpICYmICFpc0FuZ2xlZCAmJgorICAgICAgRmlsZW5hbWUuZmluZCgnLycpID09IFN0cmluZ1JlZjo6bnBvcykgeworICAgIEhlYWRlckZpbGVJbmZvICZJbmNsdWRpbmdIRkkgPSBnZXRGaWxlSW5mbyhJbmNsdWRlcnMuZnJvbnQoKSk7CiAgICAgaWYgKEluY2x1ZGluZ0hGSS5JbmRleEhlYWRlck1hcEhlYWRlcikgewogICAgICAgU21hbGxTdHJpbmc8MTI4PiBTY3JhdGNoRmlsZW5hbWU7CiAgICAgICBTY3JhdGNoRmlsZW5hbWUgKz0gSW5jbHVkaW5nSEZJLkZyYW1ld29yazsKICAgICAgIFNjcmF0Y2hGaWxlbmFtZSArPSAnLyc7CiAgICAgICBTY3JhdGNoRmlsZW5hbWUgKz0gRmlsZW5hbWU7Ci0gICAgICAKLSAgICAgIGNvbnN0IEZpbGVFbnRyeSAqUmVzdWx0ID0gTG9va3VwRmlsZShTY3JhdGNoRmlsZW5hbWUsIC8qaXNBbmdsZWQ9Ki90cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb21EaXIsIEN1ckRpciwgQ3VyRmlsZUVudCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoUGF0aCwgUmVsYXRpdmVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Z2dlc3RlZE1vZHVsZSk7Ci0gICAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiAmQ2FjaGVMb29rdXAgCisKKyAgICAgIGNvbnN0IEZpbGVFbnRyeSAqRkUgPSBMb29rdXBGaWxlKAorICAgICAgICAgIFNjcmF0Y2hGaWxlbmFtZSwgSW5jbHVkZUxvYywgLyppc0FuZ2xlZD0qL3RydWUsIEZyb21EaXIsIEN1ckRpciwKKyAgICAgICAgICBJbmNsdWRlcnMuZnJvbnQoKSwgU2VhcmNoUGF0aCwgUmVsYXRpdmVQYXRoLCBTdWdnZXN0ZWRNb2R1bGUpOworCisgICAgICBpZiAoY2hlY2tNU1ZDSGVhZGVyU2VhcmNoKERpYWdzLCBNU0ZFLCBGRSwgSW5jbHVkZUxvYykpIHsKKyAgICAgICAgaWYgKFN1Z2dlc3RlZE1vZHVsZSkKKyAgICAgICAgICAqU3VnZ2VzdGVkTW9kdWxlID0gTVNTdWdnZXN0ZWRNb2R1bGU7CisgICAgICAgIHJldHVybiBNU0ZFOworICAgICAgfQorCisgICAgICBMb29rdXBGaWxlQ2FjaGVJbmZvICZDYWNoZUxvb2t1cCAKICAgICAgICAgPSBMb29rdXBGaWxlQ2FjaGUuR2V0T3JDcmVhdGVWYWx1ZShGaWxlbmFtZSkuZ2V0VmFsdWUoKTsKLSAgICAgIENhY2hlTG9va3VwLnNlY29uZAotICAgICAgICA9IExvb2t1cEZpbGVDYWNoZS5HZXRPckNyZWF0ZVZhbHVlKFNjcmF0Y2hGaWxlbmFtZSkuZ2V0VmFsdWUoKS5zZWNvbmQ7Ci0gICAgICByZXR1cm4gUmVzdWx0OworICAgICAgQ2FjaGVMb29rdXAuSGl0SWR4CisgICAgICAgID0gTG9va3VwRmlsZUNhY2hlLkdldE9yQ3JlYXRlVmFsdWUoU2NyYXRjaEZpbGVuYW1lKS5nZXRWYWx1ZSgpLkhpdElkeDsKKyAgICAgIC8vIEZJWE1FOiBTdWdnZXN0ZWRNb2R1bGUuCisgICAgICByZXR1cm4gRkU7CiAgICAgfQogICB9CiAKKyAgaWYgKGNoZWNrTVNWQ0hlYWRlclNlYXJjaChEaWFncywgTVNGRSwgMCwgSW5jbHVkZUxvYykpIHsKKyAgICBpZiAoU3VnZ2VzdGVkTW9kdWxlKQorICAgICAgKlN1Z2dlc3RlZE1vZHVsZSA9IE1TU3VnZ2VzdGVkTW9kdWxlOworICAgIHJldHVybiBNU0ZFOworICB9CisKICAgLy8gT3RoZXJ3aXNlLCBkaWRuJ3QgZmluZCBpdC4gUmVtZW1iZXIgd2UgZGlkbid0IGZpbmQgdGhpcy4KLSAgQ2FjaGVMb29rdXAuc2Vjb25kID0gU2VhcmNoRGlycy5zaXplKCk7CisgIENhY2hlTG9va3VwLkhpdElkeCA9IFNlYXJjaERpcnMuc2l6ZSgpOwogICByZXR1cm4gMDsKIH0KIApAQCAtODczLDkgKzk4OSwyMSBAQAogICBIZWFkZXJGaWxlSW5mbyAmSEZJID0gRmlsZUluZm9bRkUtPmdldFVJRCgpXTsKICAgaWYgKEV4dGVybmFsU291cmNlICYmICFIRkkuUmVzb2x2ZWQpCiAgICAgbWVyZ2VIZWFkZXJGaWxlSW5mbyhIRkksIEV4dGVybmFsU291cmNlLT5HZXRIZWFkZXJGaWxlSW5mbyhGRSkpOworICBIRkkuSXNWYWxpZCA9IDE7CiAgIHJldHVybiBIRkk7CiB9CiAKK2Jvb2wgSGVhZGVyU2VhcmNoOjp0cnlHZXRGaWxlSW5mbyhjb25zdCBGaWxlRW50cnkgKkZFLCBIZWFkZXJGaWxlSW5mbyAmUmVzdWx0KSBjb25zdCB7CisgIGlmIChGRS0+Z2V0VUlEKCkgPj0gRmlsZUluZm8uc2l6ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgY29uc3QgSGVhZGVyRmlsZUluZm8gJkhGSSA9IEZpbGVJbmZvW0ZFLT5nZXRVSUQoKV07CisgIGlmIChIRkkuSXNWYWxpZCkgeworICAgIFJlc3VsdCA9IEhGSTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKIGJvb2wgSGVhZGVyU2VhcmNoOjppc0ZpbGVNdWx0aXBsZUluY2x1ZGVHdWFyZGVkKGNvbnN0IEZpbGVFbnRyeSAqRmlsZSkgewogICAvLyBDaGVjayBpZiB3ZSd2ZSBldmVyIHNlZW4gdGhpcyBmaWxlIGFzIGEgaGVhZGVyLgogICBpZiAoRmlsZS0+Z2V0VUlEKCkgPj0gRmlsZUluZm8uc2l6ZSgpKQpAQCAtOTUzLDYgKzEwODEsOSBAQAogYm9vbCBIZWFkZXJTZWFyY2g6Omhhc01vZHVsZU1hcChTdHJpbmdSZWYgRmlsZU5hbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaXJlY3RvcnlFbnRyeSAqUm9vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1N5c3RlbSkgeworICBpZiAoIWVuYWJsZWRNb2R1bGVzKCkpCisgICAgcmV0dXJuIGZhbHNlOworCiAgIFNtYWxsVmVjdG9yPGNvbnN0IERpcmVjdG9yeUVudHJ5ICosIDI+IEZpeFVwRGlyZWN0b3JpZXM7CiAgIAogICBTdHJpbmdSZWYgRGlyTmFtZSA9IEZpbGVOYW1lOwpAQCAtOTY3LDggKzEwOTgsOCBAQAogICAgIGlmICghRGlyKQogICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgLy8gVHJ5IHRvIGxvYWQgdGhlICJtb2R1bGUubWFwIiBmaWxlIGluIHRoaXMgZGlyZWN0b3J5LgotICAgIHN3aXRjaCAobG9hZE1vZHVsZU1hcEZpbGUoRGlyLCBJc1N5c3RlbSkpIHsKKyAgICAvLyBUcnkgdG8gbG9hZCB0aGUgbW9kdWxlIG1hcCBmaWxlIGluIHRoaXMgZGlyZWN0b3J5LgorICAgIHN3aXRjaCAobG9hZE1vZHVsZU1hcEZpbGUoRGlyLCBJc1N5c3RlbSwgLypJc0ZyYW1ld29yayovZmFsc2UpKSB7CiAgICAgY2FzZSBMTU1fTmV3bHlMb2FkZWQ6CiAgICAgY2FzZSBMTU1fQWxyZWFkeUxvYWRlZDoKICAgICAgIC8vIFN1Y2Nlc3MuIEFsbCBvZiB0aGUgZGlyZWN0b3JpZXMgd2Ugc3RlcHBlZCB0aHJvdWdoIGluaGVyaXQgdGhpcyBtb2R1bGUKQEAgLTEwMDIsMzYgKzExMzMsODUgQEAKICAgcmV0dXJuIE1vZE1hcC5maW5kTW9kdWxlRm9ySGVhZGVyKEZpbGUpOwogfQogCi1ib29sIEhlYWRlclNlYXJjaDo6bG9hZE1vZHVsZU1hcEZpbGUoY29uc3QgRmlsZUVudHJ5ICpGaWxlLCBib29sIElzU3lzdGVtKSB7Ci0gIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXIgPSBGaWxlLT5nZXREaXIoKTsKLSAgCi0gIGxsdm06OkRlbnNlTWFwPGNvbnN0IERpcmVjdG9yeUVudHJ5ICosIGJvb2w+OjppdGVyYXRvciBLbm93bkRpcgotICAgID0gRGlyZWN0b3J5SGFzTW9kdWxlTWFwLmZpbmQoRGlyKTsKLSAgaWYgKEtub3duRGlyICE9IERpcmVjdG9yeUhhc01vZHVsZU1hcC5lbmQoKSkKLSAgICByZXR1cm4gIUtub3duRGlyLT5zZWNvbmQ7Ci0gIAotICBib29sIFJlc3VsdCA9IE1vZE1hcC5wYXJzZU1vZHVsZU1hcEZpbGUoRmlsZSwgSXNTeXN0ZW0pOwotICBpZiAoIVJlc3VsdCAmJiBsbHZtOjpzeXM6OnBhdGg6OmZpbGVuYW1lKEZpbGUtPmdldE5hbWUoKSkgPT0gIm1vZHVsZS5tYXAiKSB7Ci0gICAgLy8gSWYgdGhlIGZpbGUgd2UgbG9hZGVkIHdhcyBhIG1vZHVsZS5tYXAsIGxvb2sgZm9yIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgLy8gbW9kdWxlX3ByaXZhdGUubWFwLgotICAgIFNtYWxsU3RyaW5nPDEyOD4gUHJpdmF0ZUZpbGVuYW1lKERpci0+Z2V0TmFtZSgpKTsKK3N0YXRpYyBjb25zdCBGaWxlRW50cnkgKmdldFByaXZhdGVNb2R1bGVNYXAoU3RyaW5nUmVmIE1vZHVsZU1hcFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVNYW5hZ2VyICZGaWxlTWdyKSB7CisgIFN0cmluZ1JlZiBGaWxlbmFtZSA9IGxsdm06OnN5czo6cGF0aDo6ZmlsZW5hbWUoTW9kdWxlTWFwUGF0aCk7CisgIFNtYWxsU3RyaW5nPDEyOD4gIFByaXZhdGVGaWxlbmFtZShEaXJlY3RvcnktPmdldE5hbWUoKSk7CisgIGlmIChGaWxlbmFtZSA9PSAibW9kdWxlLm1hcCIpCiAgICAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoUHJpdmF0ZUZpbGVuYW1lLCAibW9kdWxlX3ByaXZhdGUubWFwIik7Ci0gICAgaWYgKGNvbnN0IEZpbGVFbnRyeSAqUHJpdmF0ZUZpbGUgPSBGaWxlTWdyLmdldEZpbGUoUHJpdmF0ZUZpbGVuYW1lKSkKLSAgICAgIFJlc3VsdCA9IE1vZE1hcC5wYXJzZU1vZHVsZU1hcEZpbGUoUHJpdmF0ZUZpbGUsIElzU3lzdGVtKTsKLSAgfQotICAKLSAgRGlyZWN0b3J5SGFzTW9kdWxlTWFwW0Rpcl0gPSAhUmVzdWx0OyAgCi0gIHJldHVybiBSZXN1bHQ7CisgIGVsc2UgaWYgKEZpbGVuYW1lID09ICJtb2R1bGUubW9kdWxlbWFwIikKKyAgICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChQcml2YXRlRmlsZW5hbWUsICJtb2R1bGUucHJpdmF0ZS5tb2R1bGVtYXAiKTsKKyAgZWxzZQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gRmlsZU1nci5nZXRGaWxlKFByaXZhdGVGaWxlbmFtZSk7CiB9CiAKLU1vZHVsZSAqSGVhZGVyU2VhcmNoOjpsb2FkRnJhbWV3b3JrTW9kdWxlKFN0cmluZ1JlZiBOYW1lLCAKK2Jvb2wgSGVhZGVyU2VhcmNoOjpsb2FkTW9kdWxlTWFwRmlsZShjb25zdCBGaWxlRW50cnkgKkZpbGUsIGJvb2wgSXNTeXN0ZW0pIHsKKyAgc3dpdGNoIChsb2FkTW9kdWxlTWFwRmlsZUltcGwoRmlsZSwgSXNTeXN0ZW0pKSB7CisgIGNhc2UgTE1NX0FscmVhZHlMb2FkZWQ6CisgIGNhc2UgTE1NX05ld2x5TG9hZGVkOgorICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBMTU1fTm9EaXJlY3Rvcnk6CisgIGNhc2UgTE1NX0ludmFsaWRNb2R1bGVNYXA6CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBsb2FkIG1vZHVsZSBtYXAgcmVzdWx0Iik7Cit9CisKK0hlYWRlclNlYXJjaDo6TG9hZE1vZHVsZU1hcFJlc3VsdAorSGVhZGVyU2VhcmNoOjpsb2FkTW9kdWxlTWFwRmlsZUltcGwoY29uc3QgRmlsZUVudHJ5ICpGaWxlLCBib29sIElzU3lzdGVtKSB7CisgIGFzc2VydChGaWxlICYmICJleHBlY3RlZCBGaWxlRW50cnkiKTsKKworICBjb25zdCBEaXJlY3RvcnlFbnRyeSAqRGlyID0gRmlsZS0+Z2V0RGlyKCk7CisgIGF1dG8gS25vd25EaXIgPSBEaXJlY3RvcnlIYXNNb2R1bGVNYXAuZmluZChEaXIpOworICBpZiAoS25vd25EaXIgIT0gRGlyZWN0b3J5SGFzTW9kdWxlTWFwLmVuZCgpKQorICAgIHJldHVybiBLbm93bkRpci0+c2Vjb25kID8gTE1NX0FscmVhZHlMb2FkZWQgOiBMTU1fSW52YWxpZE1vZHVsZU1hcDsKKworICBpZiAoTW9kTWFwLnBhcnNlTW9kdWxlTWFwRmlsZShGaWxlLCBJc1N5c3RlbSkpIHsKKyAgICBEaXJlY3RvcnlIYXNNb2R1bGVNYXBbRGlyXSA9IGZhbHNlOworICAgIHJldHVybiBMTU1fSW52YWxpZE1vZHVsZU1hcDsKKyAgfQorCisgIC8vIFRyeSB0byBsb2FkIGEgY29ycmVzcG9uZGluZyBwcml2YXRlIG1vZHVsZSBtYXAuCisgIGlmIChjb25zdCBGaWxlRW50cnkgKlBNTUZpbGUgPQorICAgICAgICBnZXRQcml2YXRlTW9kdWxlTWFwKEZpbGUtPmdldE5hbWUoKSwgRGlyLCBGaWxlTWdyKSkgeworICAgIGlmIChNb2RNYXAucGFyc2VNb2R1bGVNYXBGaWxlKFBNTUZpbGUsIElzU3lzdGVtKSkgeworICAgICAgRGlyZWN0b3J5SGFzTW9kdWxlTWFwW0Rpcl0gPSBmYWxzZTsKKyAgICAgIHJldHVybiBMTU1fSW52YWxpZE1vZHVsZU1hcDsKKyAgICB9CisgIH0KKworICAvLyBUaGlzIGRpcmVjdG9yeSBoYXMgYSBtb2R1bGUgbWFwLgorICBEaXJlY3RvcnlIYXNNb2R1bGVNYXBbRGlyXSA9IHRydWU7CisgIHJldHVybiBMTU1fTmV3bHlMb2FkZWQ7Cit9CisKK2NvbnN0IEZpbGVFbnRyeSAqCitIZWFkZXJTZWFyY2g6Omxvb2t1cE1vZHVsZU1hcEZpbGUoY29uc3QgRGlyZWN0b3J5RW50cnkgKkRpciwgYm9vbCBJc0ZyYW1ld29yaykgeworICAvLyBGb3IgZnJhbWV3b3JrcywgdGhlIHByZWZlcnJlZCBzcGVsbGluZyBpcyBNb2R1bGVzL21vZHVsZS5tb2R1bGVtYXAsIGJ1dAorICAvLyBtb2R1bGUubWFwIGF0IHRoZSBmcmFtZXdvcmsgcm9vdCBpcyBhbHNvIGFjY2VwdGVkLgorICBTbWFsbFN0cmluZzwxMjg+IE1vZHVsZU1hcEZpbGVOYW1lKERpci0+Z2V0TmFtZSgpKTsKKyAgaWYgKElzRnJhbWV3b3JrKQorICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKE1vZHVsZU1hcEZpbGVOYW1lLCAiTW9kdWxlcyIpOworICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChNb2R1bGVNYXBGaWxlTmFtZSwgIm1vZHVsZS5tb2R1bGVtYXAiKTsKKyAgaWYgKGNvbnN0IEZpbGVFbnRyeSAqRiA9IEZpbGVNZ3IuZ2V0RmlsZShNb2R1bGVNYXBGaWxlTmFtZSkpCisgICAgcmV0dXJuIEY7CisKKyAgLy8gQ29udGludWUgdG8gYWxsb3cgbW9kdWxlLm1hcAorICBNb2R1bGVNYXBGaWxlTmFtZSA9IERpci0+Z2V0TmFtZSgpOworICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChNb2R1bGVNYXBGaWxlTmFtZSwgIm1vZHVsZS5tYXAiKTsKKyAgcmV0dXJuIEZpbGVNZ3IuZ2V0RmlsZShNb2R1bGVNYXBGaWxlTmFtZSk7Cit9CisKK01vZHVsZSAqSGVhZGVyU2VhcmNoOjpsb2FkRnJhbWV3b3JrTW9kdWxlKFN0cmluZ1JlZiBOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlyZWN0b3J5RW50cnkgKkRpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNTeXN0ZW0pIHsKICAgaWYgKE1vZHVsZSAqTW9kdWxlID0gTW9kTWFwLmZpbmRNb2R1bGUoTmFtZSkpCiAgICAgcmV0dXJuIE1vZHVsZTsKICAgCiAgIC8vIFRyeSB0byBsb2FkIGEgbW9kdWxlIG1hcCBmaWxlLgotICBzd2l0Y2ggKGxvYWRNb2R1bGVNYXBGaWxlKERpciwgSXNTeXN0ZW0pKSB7CisgIHN3aXRjaCAobG9hZE1vZHVsZU1hcEZpbGUoRGlyLCBJc1N5c3RlbSwgLypJc0ZyYW1ld29yayovdHJ1ZSkpIHsKICAgY2FzZSBMTU1fSW52YWxpZE1vZHVsZU1hcDoKICAgICBicmVhazsKICAgICAKQEAgLTEwNDMsODEgKzEyMjMsMzcgQEAKICAgICByZXR1cm4gTW9kTWFwLmZpbmRNb2R1bGUoTmFtZSk7CiAgIH0KIAotICAvLyBGaWd1cmUgb3V0IHRoZSB0b3AtbGV2ZWwgZnJhbWV3b3JrIGRpcmVjdG9yeSBhbmQgdGhlIHN1Ym1vZHVsZSBwYXRoIGZyb20KLSAgLy8gdGhhdCB0b3AtbGV2ZWwgZnJhbWV3b3JrIHRvIHRoZSByZXF1ZXN0ZWQgZnJhbWV3b3JrLgotICBTbWFsbFZlY3RvcjxzdGQ6OnN0cmluZywgMj4gU3VibW9kdWxlUGF0aDsKLSAgU3VibW9kdWxlUGF0aC5wdXNoX2JhY2soTmFtZSk7Ci0gIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpUb3BGcmFtZXdvcmtEaXIKLSAgICA9IDo6Z2V0VG9wRnJhbWV3b3JrRGlyKEZpbGVNZ3IsIERpci0+Z2V0TmFtZSgpLCBTdWJtb2R1bGVQYXRoKTsKIAotCi0gIC8vIFRyeSB0byBpbmZlciBhIG1vZHVsZSBtYXAgZnJvbSB0aGUgdG9wLWxldmVsIGZyYW1ld29yayBkaXJlY3RvcnkuCi0gIE1vZHVsZSAqUmVzdWx0ID0gTW9kTWFwLmluZmVyRnJhbWV3b3JrTW9kdWxlKFN1Ym1vZHVsZVBhdGguYmFjaygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9wRnJhbWV3b3JrRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc1N5c3RlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypQYXJlbnQ9Ki8wKTsKLSAgaWYgKCFSZXN1bHQpCi0gICAgcmV0dXJuIDA7Ci0gIAotICAvLyBGb2xsb3cgdGhlIHN1Ym1vZHVsZSBwYXRoIHRvIGZpbmQgdGhlIHJlcXVlc3RlZCAoc3ViKWZyYW1ld29yayBtb2R1bGUKLSAgLy8gd2l0aGluIHRoZSB0b3AtbGV2ZWwgZnJhbWV3b3JrIG1vZHVsZS4KLSAgU3VibW9kdWxlUGF0aC5wb3BfYmFjaygpOwotICB3aGlsZSAoIVN1Ym1vZHVsZVBhdGguZW1wdHkoKSAmJiBSZXN1bHQpIHsKLSAgICBSZXN1bHQgPSBNb2RNYXAubG9va3VwTW9kdWxlUXVhbGlmaWVkKFN1Ym1vZHVsZVBhdGguYmFjaygpLCBSZXN1bHQpOwotICAgIFN1Ym1vZHVsZVBhdGgucG9wX2JhY2soKTsKLSAgfQotICByZXR1cm4gUmVzdWx0OworICAvLyBUcnkgdG8gaW5mZXIgYSBtb2R1bGUgbWFwIGZyb20gdGhlIGZyYW1ld29yayBkaXJlY3RvcnkuCisgIHJldHVybiBNb2RNYXAuaW5mZXJGcmFtZXdvcmtNb2R1bGUoTmFtZSwgRGlyLCBJc1N5c3RlbSwgLypQYXJlbnQ9Ki8wKTsKIH0KIAogCiBIZWFkZXJTZWFyY2g6OkxvYWRNb2R1bGVNYXBSZXN1bHQgCi1IZWFkZXJTZWFyY2g6OmxvYWRNb2R1bGVNYXBGaWxlKFN0cmluZ1JlZiBEaXJOYW1lLCBib29sIElzU3lzdGVtKSB7CitIZWFkZXJTZWFyY2g6OmxvYWRNb2R1bGVNYXBGaWxlKFN0cmluZ1JlZiBEaXJOYW1lLCBib29sIElzU3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRnJhbWV3b3JrKSB7CiAgIGlmIChjb25zdCBEaXJlY3RvcnlFbnRyeSAqRGlyID0gRmlsZU1nci5nZXREaXJlY3RvcnkoRGlyTmFtZSkpCi0gICAgcmV0dXJuIGxvYWRNb2R1bGVNYXBGaWxlKERpciwgSXNTeXN0ZW0pOworICAgIHJldHVybiBsb2FkTW9kdWxlTWFwRmlsZShEaXIsIElzU3lzdGVtLCBJc0ZyYW1ld29yayk7CiAgIAogICByZXR1cm4gTE1NX05vRGlyZWN0b3J5OwogfQogCiBIZWFkZXJTZWFyY2g6OkxvYWRNb2R1bGVNYXBSZXN1bHQgCi1IZWFkZXJTZWFyY2g6OmxvYWRNb2R1bGVNYXBGaWxlKGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXIsIGJvb2wgSXNTeXN0ZW0pIHsKLSAgbGx2bTo6RGVuc2VNYXA8Y29uc3QgRGlyZWN0b3J5RW50cnkgKiwgYm9vbD46Oml0ZXJhdG9yIEtub3duRGlyCi0gICAgPSBEaXJlY3RvcnlIYXNNb2R1bGVNYXAuZmluZChEaXIpOworSGVhZGVyU2VhcmNoOjpsb2FkTW9kdWxlTWFwRmlsZShjb25zdCBEaXJlY3RvcnlFbnRyeSAqRGlyLCBib29sIElzU3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRnJhbWV3b3JrKSB7CisgIGF1dG8gS25vd25EaXIgPSBEaXJlY3RvcnlIYXNNb2R1bGVNYXAuZmluZChEaXIpOwogICBpZiAoS25vd25EaXIgIT0gRGlyZWN0b3J5SGFzTW9kdWxlTWFwLmVuZCgpKQogICAgIHJldHVybiBLbm93bkRpci0+c2Vjb25kPyBMTU1fQWxyZWFkeUxvYWRlZCA6IExNTV9JbnZhbGlkTW9kdWxlTWFwOwotICAKLSAgU21hbGxTdHJpbmc8MTI4PiBNb2R1bGVNYXBGaWxlTmFtZTsKLSAgTW9kdWxlTWFwRmlsZU5hbWUgKz0gRGlyLT5nZXROYW1lKCk7Ci0gIHVuc2lnbmVkIE1vZHVsZU1hcERpck5hbWVMZW4gPSBNb2R1bGVNYXBGaWxlTmFtZS5zaXplKCk7Ci0gIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKE1vZHVsZU1hcEZpbGVOYW1lLCAibW9kdWxlLm1hcCIpOwotICBpZiAoY29uc3QgRmlsZUVudHJ5ICpNb2R1bGVNYXBGaWxlID0gRmlsZU1nci5nZXRGaWxlKE1vZHVsZU1hcEZpbGVOYW1lKSkgewotICAgIC8vIFdlIGhhdmUgZm91bmQgYSBtb2R1bGUgbWFwIGZpbGUuIFRyeSB0byBwYXJzZSBpdC4KLSAgICBpZiAoTW9kTWFwLnBhcnNlTW9kdWxlTWFwRmlsZShNb2R1bGVNYXBGaWxlLCBJc1N5c3RlbSkpIHsKLSAgICAgIC8vIE5vIHN1aXRhYmxlIG1vZHVsZSBtYXAuCi0gICAgICBEaXJlY3RvcnlIYXNNb2R1bGVNYXBbRGlyXSA9IGZhbHNlOwotICAgICAgcmV0dXJuIExNTV9JbnZhbGlkTW9kdWxlTWFwOwotICAgIH0KIAotICAgIC8vIFRoaXMgZGlyZWN0b3J5IGhhcyBhIG1vZHVsZSBtYXAuCi0gICAgRGlyZWN0b3J5SGFzTW9kdWxlTWFwW0Rpcl0gPSB0cnVlOwotICAgIAotICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYSBwcml2YXRlIG1vZHVsZSBtYXAgdGhhdCB3ZSBuZWVkIHRvIGxvYWQgYXMgd2VsbC4KLSAgICBNb2R1bGVNYXBGaWxlTmFtZS5lcmFzZShNb2R1bGVNYXBGaWxlTmFtZS5iZWdpbigpICsgTW9kdWxlTWFwRGlyTmFtZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVNYXBGaWxlTmFtZS5lbmQoKSk7Ci0gICAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoTW9kdWxlTWFwRmlsZU5hbWUsICJtb2R1bGVfcHJpdmF0ZS5tYXAiKTsKLSAgICBpZiAoY29uc3QgRmlsZUVudHJ5ICpQcml2YXRlTW9kdWxlTWFwRmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRmlsZU1nci5nZXRGaWxlKE1vZHVsZU1hcEZpbGVOYW1lKSkgewotICAgICAgaWYgKE1vZE1hcC5wYXJzZU1vZHVsZU1hcEZpbGUoUHJpdmF0ZU1vZHVsZU1hcEZpbGUsIElzU3lzdGVtKSkgewotICAgICAgICAvLyBObyBzdWl0YWJsZSBtb2R1bGUgbWFwLgotICAgICAgICBEaXJlY3RvcnlIYXNNb2R1bGVNYXBbRGlyXSA9IGZhbHNlOwotICAgICAgICByZXR1cm4gTE1NX0ludmFsaWRNb2R1bGVNYXA7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBMTU1fTmV3bHlMb2FkZWQ7CisgIGlmIChjb25zdCBGaWxlRW50cnkgKk1vZHVsZU1hcEZpbGUgPSBsb29rdXBNb2R1bGVNYXBGaWxlKERpciwgSXNGcmFtZXdvcmspKSB7CisgICAgTG9hZE1vZHVsZU1hcFJlc3VsdCBSZXN1bHQgPSBsb2FkTW9kdWxlTWFwRmlsZUltcGwoTW9kdWxlTWFwRmlsZSwgSXNTeXN0ZW0pOworICAgIC8vIEFkZCBEaXIgZXhwbGljaXRseSBpbiBjYXNlIE1vZHVsZU1hcEZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgLy8gRS5nLiBGb28uZnJhbWV3b3JrL01vZHVsZXMvbW9kdWxlLm1vZHVsZW1hcAorICAgIC8vICAgICAgXkRpciAgICAgICAgICAgICAgICAgIF5Nb2R1bGVNYXBGaWxlCisgICAgaWYgKFJlc3VsdCA9PSBMTU1fTmV3bHlMb2FkZWQpCisgICAgICBEaXJlY3RvcnlIYXNNb2R1bGVNYXBbRGlyXSA9IHRydWU7CisgICAgcmV0dXJuIFJlc3VsdDsKICAgfQotICAKLSAgLy8gTm8gc3VpdGFibGUgbW9kdWxlIG1hcC4KLSAgRGlyZWN0b3J5SGFzTW9kdWxlTWFwW0Rpcl0gPSBmYWxzZTsKICAgcmV0dXJuIExNTV9JbnZhbGlkTW9kdWxlTWFwOwogfQogCkBAIC0xMTU1LDcgKzEyOTEsNyBAQAogICAgICAgY29udGludWU7CiAgICAgCiAgICAgLy8gVHJ5IHRvIGxvYWQgYSBtb2R1bGUgbWFwIGZpbGUgZm9yIHRoZSBzZWFyY2ggZGlyZWN0b3J5LgotICAgIGxvYWRNb2R1bGVNYXBGaWxlKFNlYXJjaERpcnNbSWR4XS5nZXREaXIoKSwgSXNTeXN0ZW0pOworICAgIGxvYWRNb2R1bGVNYXBGaWxlKFNlYXJjaERpcnNbSWR4XS5nZXREaXIoKSwgSXNTeXN0ZW0sIC8qSXNGcmFtZXdvcmsqL2ZhbHNlKTsKICAgICAKICAgICAvLyBUcnkgdG8gbG9hZCBtb2R1bGUgbWFwIGZpbGVzIGZvciBpbW1lZGlhdGUgc3ViZGlyZWN0b3JpZXMgb2YgdGhpcyBzZWFyY2gKICAgICAvLyBkaXJlY3RvcnkuCkBAIC0xMTgwLDcgKzEzMTYsOCBAQAogCiAgICAgLy8gVHJ5IHRvIGxvYWQgYSBtb2R1bGUgbWFwIGZpbGUgZm9yIHRoZSBzZWFyY2ggZGlyZWN0b3J5LgogICAgIGxvYWRNb2R1bGVNYXBGaWxlKFNlYXJjaERpcnNbSWR4XS5nZXREaXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hEaXJzW0lkeF0uaXNTeXN0ZW1IZWFkZXJEaXJlY3RvcnkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoRGlyc1tJZHhdLmlzU3lzdGVtSGVhZGVyRGlyZWN0b3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoRGlyc1tJZHhdLmlzRnJhbWV3b3JrKCkpOwogICB9CiB9CiAKQEAgLTExOTMsNyArMTMzMCw4IEBACiAgIGxsdm06OnN5czo6cGF0aDo6bmF0aXZlKFNlYXJjaERpci5nZXREaXIoKS0+Z2V0TmFtZSgpLCBEaXJOYXRpdmUpOwogICBmb3IgKGxsdm06OnN5czo6ZnM6OmRpcmVjdG9yeV9pdGVyYXRvciBEaXIoRGlyTmF0aXZlLnN0cigpLCBFQyksIERpckVuZDsKICAgICAgICBEaXIgIT0gRGlyRW5kICYmICFFQzsgRGlyLmluY3JlbWVudChFQykpIHsKLSAgICBsb2FkTW9kdWxlTWFwRmlsZShEaXItPnBhdGgoKSwgU2VhcmNoRGlyLmlzU3lzdGVtSGVhZGVyRGlyZWN0b3J5KCkpOworICAgIGxvYWRNb2R1bGVNYXBGaWxlKERpci0+cGF0aCgpLCBTZWFyY2hEaXIuaXNTeXN0ZW1IZWFkZXJEaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hEaXIuaXNGcmFtZXdvcmsoKSk7CiAgIH0KIAogICBTZWFyY2hEaXIuc2V0U2VhcmNoZWRBbGxNb2R1bGVNYXBzKHRydWUpOwpkaWZmIC0tZ2l0IGEvbGliL0xleC9MZXhlci5jcHAgYi9saWIvTGV4L0xleGVyLmNwcAppbmRleCBjMDcxNDU1Li44NmQwMWQ2IDEwMDY0NAotLS0gYS9saWIvTGV4L0xleGVyLmNwcAorKysgYi9saWIvTGV4L0xleGVyLmNwcApAQCAtMjUsNiArMjUsNyBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgImNsYW5nL0xleC9MZXhlci5oIgorI2luY2x1ZGUgIlVuaWNvZGVDaGFyU2V0cy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0NoYXJJbmZvLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9Db2RlQ29tcGxldGlvbkhhbmRsZXIuaCIKQEAgLTM3LDcgKzM4LDYgQEAKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29udmVydFVURi5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKLSNpbmNsdWRlICJVbmljb2RlQ2hhclNldHMuaCIKICNpbmNsdWRlIDxjc3RyaW5nPgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogCkBAIC04NjEsNyArODYxLDcgQEAKICAgLy8gQnJlYWsgZG93biB0aGUgc291cmNlIGxvY2F0aW9ucy4KICAgRmlsZUlEIEZJRDsKICAgdW5zaWduZWQgQmVnaW5PZmZzOwotICBsbHZtOjp0aWUoRklELCBCZWdpbk9mZnMpID0gU00uZ2V0RGVjb21wb3NlZExvYyhCZWdpbik7CisgIHN0ZDo6dGllKEZJRCwgQmVnaW5PZmZzKSA9IFNNLmdldERlY29tcG9zZWRMb2MoQmVnaW4pOwogICBpZiAoRklELmlzSW52YWxpZCgpKQogICAgIHJldHVybiBDaGFyU291cmNlUmFuZ2UoKTsKIApAQCAtMTQ0NSw3ICsxNDQ1LDUwIEBACiAgICAgICAgIDw8IFJhbmdlOwogICAgIH0KICAgfQotIH0KK30KKworYm9vbCBMZXhlcjo6dHJ5Q29uc3VtZUlkZW50aWZpZXJVQ04oY29uc3QgY2hhciAqJkN1clB0ciwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZSZXN1bHQpIHsKKyAgY29uc3QgY2hhciAqVUNOUHRyID0gQ3VyUHRyICsgU2l6ZTsKKyAgdWludDMyX3QgQ29kZVBvaW50ID0gdHJ5UmVhZFVDTihVQ05QdHIsIEN1clB0ciwgLypUb2tlbj0qLzApOworICBpZiAoQ29kZVBvaW50ID09IDAgfHwgIWlzQWxsb3dlZElEQ2hhcihDb2RlUG9pbnQsIExhbmdPcHRzKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFpc0xleGluZ1Jhd01vZGUoKSkKKyAgICBtYXliZURpYWdub3NlSURDaGFyQ29tcGF0KFBQLT5nZXREaWFnbm9zdGljcygpLCBDb2RlUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlQ2hhclJhbmdlKCp0aGlzLCBDdXJQdHIsIFVDTlB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKklzRmlyc3Q9Ki9mYWxzZSk7CisKKyAgUmVzdWx0LnNldEZsYWcoVG9rZW46Okhhc1VDTik7CisgIGlmICgoVUNOUHRyIC0gQ3VyUHRyID09ICA2ICYmIEN1clB0clsxXSA9PSAndScpIHx8CisgICAgICAoVUNOUHRyIC0gQ3VyUHRyID09IDEwICYmIEN1clB0clsxXSA9PSAnVScpKQorICAgIEN1clB0ciA9IFVDTlB0cjsKKyAgZWxzZQorICAgIHdoaWxlIChDdXJQdHIgIT0gVUNOUHRyKQorICAgICAgKHZvaWQpZ2V0QW5kQWR2YW5jZUNoYXIoQ3VyUHRyLCBSZXN1bHQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBMZXhlcjo6dHJ5Q29uc3VtZUlkZW50aWZpZXJVVEY4Q2hhcihjb25zdCBjaGFyIComQ3VyUHRyKSB7CisgIGNvbnN0IGNoYXIgKlVuaWNvZGVQdHIgPSBDdXJQdHI7CisgIFVURjMyIENvZGVQb2ludDsKKyAgQ29udmVyc2lvblJlc3VsdCBSZXN1bHQgPQorICAgICAgbGx2bTo6Y29udmVydFVURjhTZXF1ZW5jZSgoY29uc3QgVVRGOCAqKikmVW5pY29kZVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFVURjggKilCdWZmZXJFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2RlUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdENvbnZlcnNpb24pOworICBpZiAoUmVzdWx0ICE9IGNvbnZlcnNpb25PSyB8fAorICAgICAgIWlzQWxsb3dlZElEQ2hhcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oQ29kZVBvaW50KSwgTGFuZ09wdHMpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIWlzTGV4aW5nUmF3TW9kZSgpKQorICAgIG1heWJlRGlhZ25vc2VJRENoYXJDb21wYXQoUFAtPmdldERpYWdub3N0aWNzKCksIENvZGVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VDaGFyUmFuZ2UoKnRoaXMsIEN1clB0ciwgVW5pY29kZVB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKklzRmlyc3Q9Ki9mYWxzZSk7CisKKyAgQ3VyUHRyID0gVW5pY29kZVB0cjsKKyAgcmV0dXJuIHRydWU7Cit9CiAKIGJvb2wgTGV4ZXI6OkxleElkZW50aWZpZXIoVG9rZW4gJlJlc3VsdCwgY29uc3QgY2hhciAqQ3VyUHRyKSB7CiAgIC8vIE1hdGNoIFtfQS1aYS16MC05XSosIHdlIGhhdmUgYWxyZWFkeSBtYXRjaGVkIFtfQS1aYS16JF0KQEAgLTE1MDAsNDcgKzE1NDMsMTAgQEAKICAgICAgIEMgPSBnZXRDaGFyQW5kU2l6ZShDdXJQdHIsIFNpemUpOwogICAgICAgY29udGludWU7CiAKLSAgICB9IGVsc2UgaWYgKEMgPT0gJ1xcJykgewotICAgICAgY29uc3QgY2hhciAqVUNOUHRyID0gQ3VyUHRyICsgU2l6ZTsKLSAgICAgIHVpbnQzMl90IENvZGVQb2ludCA9IHRyeVJlYWRVQ04oVUNOUHRyLCBDdXJQdHIsIC8qVG9rZW49Ki8wKTsKLSAgICAgIGlmIChDb2RlUG9pbnQgPT0gMCB8fCAhaXNBbGxvd2VkSURDaGFyKENvZGVQb2ludCwgTGFuZ09wdHMpKQotICAgICAgICBnb3RvIEZpbmlzaElkZW50aWZpZXI7Ci0KLSAgICAgIGlmICghaXNMZXhpbmdSYXdNb2RlKCkpIHsKLSAgICAgICAgbWF5YmVEaWFnbm9zZUlEQ2hhckNvbXBhdChQUC0+Z2V0RGlhZ25vc3RpY3MoKSwgQ29kZVBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VDaGFyUmFuZ2UoKnRoaXMsIEN1clB0ciwgVUNOUHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKklzRmlyc3Q9Ki9mYWxzZSk7Ci0gICAgICB9Ci0KLSAgICAgIFJlc3VsdC5zZXRGbGFnKFRva2VuOjpIYXNVQ04pOwotICAgICAgaWYgKChVQ05QdHIgLSBDdXJQdHIgPT0gIDYgJiYgQ3VyUHRyWzFdID09ICd1JykgfHwKLSAgICAgICAgICAoVUNOUHRyIC0gQ3VyUHRyID09IDEwICYmIEN1clB0clsxXSA9PSAnVScpKQotICAgICAgICBDdXJQdHIgPSBVQ05QdHI7Ci0gICAgICBlbHNlCi0gICAgICAgIHdoaWxlIChDdXJQdHIgIT0gVUNOUHRyKQotICAgICAgICAgICh2b2lkKWdldEFuZEFkdmFuY2VDaGFyKEN1clB0ciwgUmVzdWx0KTsKLQorICAgIH0gZWxzZSBpZiAoQyA9PSAnXFwnICYmIHRyeUNvbnN1bWVJZGVudGlmaWVyVUNOKEN1clB0ciwgU2l6ZSwgUmVzdWx0KSkgewogICAgICAgQyA9IGdldENoYXJBbmRTaXplKEN1clB0ciwgU2l6ZSk7CiAgICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgaWYgKCFpc0FTQ0lJKEMpKSB7Ci0gICAgICBjb25zdCBjaGFyICpVbmljb2RlUHRyID0gQ3VyUHRyOwotICAgICAgVVRGMzIgQ29kZVBvaW50OwotICAgICAgQ29udmVyc2lvblJlc3VsdCBSZXN1bHQgPQotICAgICAgICAgIGxsdm06OmNvbnZlcnRVVEY4U2VxdWVuY2UoKGNvbnN0IFVURjggKiopJlVuaWNvZGVQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgVVRGOCAqKUJ1ZmZlckVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2RlUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RDb252ZXJzaW9uKTsKLSAgICAgIGlmIChSZXN1bHQgIT0gY29udmVyc2lvbk9LIHx8Ci0gICAgICAgICAgIWlzQWxsb3dlZElEQ2hhcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oQ29kZVBvaW50KSwgTGFuZ09wdHMpKQotICAgICAgICBnb3RvIEZpbmlzaElkZW50aWZpZXI7Ci0KLSAgICAgIGlmICghaXNMZXhpbmdSYXdNb2RlKCkpIHsKLSAgICAgICAgbWF5YmVEaWFnbm9zZUlEQ2hhckNvbXBhdChQUC0+Z2V0RGlhZ25vc3RpY3MoKSwgQ29kZVBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VDaGFyUmFuZ2UoKnRoaXMsIEN1clB0ciwgVW5pY29kZVB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypJc0ZpcnN0PSovZmFsc2UpOwotICAgICAgfQotCi0gICAgICBDdXJQdHIgPSBVbmljb2RlUHRyOworICAgIH0gZWxzZSBpZiAoIWlzQVNDSUkoQykgJiYgdHJ5Q29uc3VtZUlkZW50aWZpZXJVVEY4Q2hhcihDdXJQdHIpKSB7CiAgICAgICBDID0gZ2V0Q2hhckFuZFNpemUoQ3VyUHRyLCBTaXplKTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0gZWxzZSBpZiAoIWlzSWRlbnRpZmllckJvZHkoQykpIHsKQEAgLTE1NzYsNyArMTU4Miw3IEBACiAgIHVuc2lnbmVkIFNpemU7CiAgIGNoYXIgQyA9IGdldENoYXJBbmRTaXplKEN1clB0ciwgU2l6ZSk7CiAgIGNoYXIgUHJldkNoID0gMDsKLSAgd2hpbGUgKGlzUHJlcHJvY2Vzc2luZ051bWJlckJvZHkoQykpIHsgLy8gRklYTUU6IFVDTnMgaW4gdWQtc3VmZml4LgorICB3aGlsZSAoaXNQcmVwcm9jZXNzaW5nTnVtYmVyQm9keShDKSkgewogICAgIEN1clB0ciA9IENvbnN1bWVDaGFyKEN1clB0ciwgU2l6ZSwgUmVzdWx0KTsKICAgICBQcmV2Q2ggPSBDOwogICAgIEMgPSBnZXRDaGFyQW5kU2l6ZShDdXJQdHIsIFNpemUpOwpAQCAtMTYxNCwxMCArMTYyMCwxNyBAQAogICAgICAgaWYgKCFpc0xleGluZ1Jhd01vZGUoKSkKICAgICAgICAgRGlhZyhDdXJQdHIsIGRpYWc6Ondhcm5fY3h4MTFfY29tcGF0X2RpZ2l0X3NlcGFyYXRvcik7CiAgICAgICBDdXJQdHIgPSBDb25zdW1lQ2hhcihDdXJQdHIsIFNpemUsIFJlc3VsdCk7CisgICAgICBDdXJQdHIgPSBDb25zdW1lQ2hhcihDdXJQdHIsIE5leHRTaXplLCBSZXN1bHQpOwogICAgICAgcmV0dXJuIExleE51bWVyaWNDb25zdGFudChSZXN1bHQsIEN1clB0cik7CiAgICAgfQogICB9CiAKKyAgLy8gSWYgd2UgaGF2ZSBhIFVDTiBvciBVVEYtOCBjaGFyYWN0ZXIgKHBlcmhhcHMgaW4gYSB1ZC1zdWZmaXgpLCBjb250aW51ZS4KKyAgaWYgKEMgPT0gJ1xcJyAmJiB0cnlDb25zdW1lSWRlbnRpZmllclVDTihDdXJQdHIsIFNpemUsIFJlc3VsdCkpCisgICAgcmV0dXJuIExleE51bWVyaWNDb25zdGFudChSZXN1bHQsIEN1clB0cik7CisgIGlmICghaXNBU0NJSShDKSAmJiB0cnlDb25zdW1lSWRlbnRpZmllclVURjhDaGFyKEN1clB0cikpCisgICAgcmV0dXJuIExleE51bWVyaWNDb25zdGFudChSZXN1bHQsIEN1clB0cik7CisKICAgLy8gVXBkYXRlIHRoZSBsb2NhdGlvbiBvZiB0b2tlbiBhcyB3ZWxsIGFzIEJ1ZmZlclB0ci4KICAgY29uc3QgY2hhciAqVG9rU3RhcnQgPSBCdWZmZXJQdHI7CiAgIEZvcm1Ub2tlbldpdGhDaGFycyhSZXN1bHQsIEN1clB0ciwgdG9rOjpudW1lcmljX2NvbnN0YW50KTsKQEAgLTE2MzEsMjMgKzE2NDQsMzUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU3RyaW5nTGl0ZXJhbCkgewogICBhc3NlcnQoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMpOwogCi0gIC8vIE1heGltYWxseSBtdW5jaCBhbiBpZGVudGlmaWVyLiBGSVhNRTogVUNOcy4KKyAgLy8gTWF4aW1hbGx5IG11bmNoIGFuIGlkZW50aWZpZXIuCiAgIHVuc2lnbmVkIFNpemU7CiAgIGNoYXIgQyA9IGdldENoYXJBbmRTaXplKEN1clB0ciwgU2l6ZSk7Ci0gIGlmIChpc0lkZW50aWZpZXJIZWFkKEMpKSB7Ci0gICAgaWYgKCFnZXRMYW5nT3B0cygpLkNQbHVzUGx1czExKSB7Ci0gICAgICBpZiAoIWlzTGV4aW5nUmF3TW9kZSgpKQotICAgICAgICBEaWFnKEN1clB0ciwKLSAgICAgICAgICAgICBDID09ICdfJyA/IGRpYWc6Ondhcm5fY3h4MTFfY29tcGF0X3VzZXJfZGVmaW5lZF9saXRlcmFsCi0gICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjp3YXJuX2N4eDExX2NvbXBhdF9yZXNlcnZlZF91c2VyX2RlZmluZWRfbGl0ZXJhbCkKLSAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihnZXRTb3VyY2VMb2NhdGlvbihDdXJQdHIpLCAiICIpOwotICAgICAgcmV0dXJuIEN1clB0cjsKLSAgICB9CisgIGJvb2wgQ29uc3VtZWQgPSBmYWxzZTsKIAotICAgIC8vIEMrKzExIFtsZXguZXh0XXAxMCwgW3VzcmxpdC5zdWZmaXhdcDE6IEEgcHJvZ3JhbSBjb250YWluaW5nIGEgdWQtc3VmZml4Ci0gICAgLy8gdGhhdCBkb2VzIG5vdCBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUgaXMgaWxsLWZvcm1lZC4gQXMgYSBjb25mb3JtaW5nCi0gICAgLy8gZXh0ZW5zaW9uLCB3ZSB0cmVhdCBhbGwgc3VjaCBzdWZmaXhlcyBhcyBpZiB0aGV5IGhhZCB3aGl0ZXNwYWNlIGJlZm9yZQotICAgIC8vIHRoZW0uCisgIGlmICghaXNJZGVudGlmaWVySGVhZChDKSkgeworICAgIGlmIChDID09ICdcXCcgJiYgdHJ5Q29uc3VtZUlkZW50aWZpZXJVQ04oQ3VyUHRyLCBTaXplLCBSZXN1bHQpKQorICAgICAgQ29uc3VtZWQgPSB0cnVlOworICAgIGVsc2UgaWYgKCFpc0FTQ0lJKEMpICYmIHRyeUNvbnN1bWVJZGVudGlmaWVyVVRGOENoYXIoQ3VyUHRyKSkKKyAgICAgIENvbnN1bWVkID0gdHJ1ZTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gQ3VyUHRyOworICB9CisKKyAgaWYgKCFnZXRMYW5nT3B0cygpLkNQbHVzUGx1czExKSB7CisgICAgaWYgKCFpc0xleGluZ1Jhd01vZGUoKSkKKyAgICAgIERpYWcoQ3VyUHRyLAorICAgICAgICAgICBDID09ICdfJyA/IGRpYWc6Ondhcm5fY3h4MTFfY29tcGF0X3VzZXJfZGVmaW5lZF9saXRlcmFsCisgICAgICAgICAgICAgICAgICAgIDogZGlhZzo6d2Fybl9jeHgxMV9jb21wYXRfcmVzZXJ2ZWRfdXNlcl9kZWZpbmVkX2xpdGVyYWwpCisgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKGdldFNvdXJjZUxvY2F0aW9uKEN1clB0ciksICIgIik7CisgICAgcmV0dXJuIEN1clB0cjsKKyAgfQorCisgIC8vIEMrKzExIFtsZXguZXh0XXAxMCwgW3VzcmxpdC5zdWZmaXhdcDE6IEEgcHJvZ3JhbSBjb250YWluaW5nIGEgdWQtc3VmZml4CisgIC8vIHRoYXQgZG9lcyBub3Qgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlIGlzIGlsbC1mb3JtZWQuIEFzIGEgY29uZm9ybWluZworICAvLyBleHRlbnNpb24sIHdlIHRyZWF0IGFsbCBzdWNoIHN1ZmZpeGVzIGFzIGlmIHRoZXkgaGFkIHdoaXRlc3BhY2UgYmVmb3JlCisgIC8vIHRoZW0uIFdlIGFzc3VtZSBhIHN1ZmZpeCBiZWdpbm5pbmcgd2l0aCBhIFVDTiBvciBVVEYtOCBjaGFyYWN0ZXIgaXMgbW9yZQorICAvLyBsaWtlbHkgdG8gYmUgYSB1ZC1zdWZmaXggdGhhbiBhIG1hY3JvLCBob3dldmVyLCBhbmQgYWNjZXB0IHRoYXQuCisgIGlmICghQ29uc3VtZWQpIHsKICAgICBib29sIElzVURTdWZmaXggPSBmYWxzZTsKICAgICBpZiAoQyA9PSAnXycpCiAgICAgICBJc1VEU3VmZml4ID0gdHJ1ZTsKQEAgLTE2ODIsMTkgKzE3MDcsMjUgQEAKIAogICAgIGlmICghSXNVRFN1ZmZpeCkgewogICAgICAgaWYgKCFpc0xleGluZ1Jhd01vZGUoKSkKLSAgICAgICAgRGlhZyhDdXJQdHIsIGdldExhbmdPcHRzKCkuTWljcm9zb2Z0TW9kZSA/Ci0gICAgICAgICAgICBkaWFnOjpleHRfbXNfcmVzZXJ2ZWRfdXNlcl9kZWZpbmVkX2xpdGVyYWwgOgotICAgICAgICAgICAgZGlhZzo6ZXh0X3Jlc2VydmVkX3VzZXJfZGVmaW5lZF9saXRlcmFsKQorICAgICAgICBEaWFnKEN1clB0ciwgZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgPyBkaWFnOjpleHRfbXNfcmVzZXJ2ZWRfdXNlcl9kZWZpbmVkX2xpdGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6OmV4dF9yZXNlcnZlZF91c2VyX2RlZmluZWRfbGl0ZXJhbCkKICAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihnZXRTb3VyY2VMb2NhdGlvbihDdXJQdHIpLCAiICIpOwogICAgICAgcmV0dXJuIEN1clB0cjsKICAgICB9CiAKLSAgICBSZXN1bHQuc2V0RmxhZyhUb2tlbjo6SGFzVURTdWZmaXgpOwotICAgIGRvIHsKLSAgICAgIEN1clB0ciA9IENvbnN1bWVDaGFyKEN1clB0ciwgU2l6ZSwgUmVzdWx0KTsKLSAgICAgIEMgPSBnZXRDaGFyQW5kU2l6ZShDdXJQdHIsIFNpemUpOwotICAgIH0gd2hpbGUgKGlzSWRlbnRpZmllckJvZHkoQykpOworICAgIEN1clB0ciA9IENvbnN1bWVDaGFyKEN1clB0ciwgU2l6ZSwgUmVzdWx0KTsKICAgfQorCisgIFJlc3VsdC5zZXRGbGFnKFRva2VuOjpIYXNVRFN1ZmZpeCk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgQyA9IGdldENoYXJBbmRTaXplKEN1clB0ciwgU2l6ZSk7CisgICAgaWYgKGlzSWRlbnRpZmllckJvZHkoQykpIHsgQ3VyUHRyID0gQ29uc3VtZUNoYXIoQ3VyUHRyLCBTaXplLCBSZXN1bHQpOyB9CisgICAgZWxzZSBpZiAoQyA9PSAnXFwnICYmIHRyeUNvbnN1bWVJZGVudGlmaWVyVUNOKEN1clB0ciwgU2l6ZSwgUmVzdWx0KSkge30KKyAgICBlbHNlIGlmICghaXNBU0NJSShDKSAmJiB0cnlDb25zdW1lSWRlbnRpZmllclVURjhDaGFyKEN1clB0cikpIHt9CisgICAgZWxzZSBicmVhazsKKyAgfQorCiAgIHJldHVybiBDdXJQdHI7CiB9CiAKQEAgLTIwMjMsOCArMjA1NCwxMSBAQAogICAgIGlmIChDICE9IDApIHsKICAgICAgIC8vIFdlIGZvdW5kIGEgbmV3bGluZSwgc2VlIGlmIGl0J3MgZXNjYXBlZC4KICAgICAgIGNvbnN0IGNoYXIgKkVzY2FwZVB0ciA9IEN1clB0ci0xOwotICAgICAgd2hpbGUgKGlzSG9yaXpvbnRhbFdoaXRlc3BhY2UoKkVzY2FwZVB0cikpIC8vIFNraXAgd2hpdGVzcGFjZS4KKyAgICAgIGJvb2wgSGFzU3BhY2UgPSBmYWxzZTsKKyAgICAgIHdoaWxlIChpc0hvcml6b250YWxXaGl0ZXNwYWNlKCpFc2NhcGVQdHIpKSB7IC8vIFNraXAgd2hpdGVzcGFjZS4KICAgICAgICAgLS1Fc2NhcGVQdHI7CisgICAgICAgIEhhc1NwYWNlID0gdHJ1ZTsKKyAgICAgIH0KIAogICAgICAgaWYgKCpFc2NhcGVQdHIgPT0gJ1xcJykgLy8gRXNjYXBlZCBuZXdsaW5lLgogICAgICAgICBDdXJQdHIgPSBFc2NhcGVQdHI7CkBAIC0yMDMzLDYgKzIwNjcsMTAgQEAKICAgICAgICAgQ3VyUHRyID0gRXNjYXBlUHRyLTI7CiAgICAgICBlbHNlCiAgICAgICAgIGJyZWFrOyAvLyBUaGlzIGlzIGEgbmV3bGluZSwgd2UncmUgZG9uZS4KKworICAgICAgLy8gSWYgdGhlcmUgd2FzIHNwYWNlIGJldHdlZW4gdGhlIGJhY2tzbGFzaCBhbmQgbmV3bGluZSwgd2FybiBhYm91dCBpdC4KKyAgICAgIGlmIChIYXNTcGFjZSAmJiAhaXNMZXhpbmdSYXdNb2RlKCkpCisgICAgICAgIERpYWcoRXNjYXBlUHRyLCBkaWFnOjpiYWNrc2xhc2hfbmV3bGluZV9zcGFjZSk7CiAgICAgfQogCiAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgaGFyZCBjYXNlLiAgRmFsbCBiYWNrIG9uIGdldEFuZEFkdmFuY2VDaGFyIHRvCkBAIC0yMjEzLDYgKzIyNTEsOCBAQAogCiAjaWZkZWYgX19TU0UyX18KICNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNlbGlmIF9fQVZYMl9fCisjaW5jbHVkZSA8YXZ4MmludHJpbi5oPgogI2VsaWYgX19BTFRJVkVDX18KICNpbmNsdWRlIDxhbHRpdmVjLmg+CiAjdW5kZWYgYm9vbApAQCAtMjI2OCwxNyArMjMwOCwzMyBAQAogICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGNvZGUtY29tcGxldGlvbiBwb2ludCBhdm9pZCB0aGUgZmFzdCBzY2FuIGJlY2F1c2UgaXQKICAgICAgICAgLy8gZG9lc24ndCBjaGVjayBmb3IgJ1wwJy4KICAgICAgICAgIShQUCAmJiBQUC0+Z2V0Q29kZUNvbXBsZXRpb25GaWxlTG9jKCkgPT0gRmlsZUxvYykpIHsKKyNpZm5kZWYgX19BVlgyX18KICAgICAgIC8vIFdoaWxlIG5vdCBhbGlnbmVkIHRvIGEgMTYtYnl0ZSBib3VuZGFyeS4KICAgICAgIHdoaWxlIChDICE9ICcvJyAmJiAoKGludHB0cl90KUN1clB0ciAmIDB4MEYpICE9IDApCiAgICAgICAgIEMgPSAqQ3VyUHRyKys7CisjZW5kaWYKIAogICAgICAgaWYgKEMgPT0gJy8nKSBnb3RvIEZvdW5kU2xhc2g7CiAKICNpZmRlZiBfX1NTRTJfXwotICAgICAgX19tMTI4aSBTbGFzaGVzID0gX21tX3NldDFfZXBpOCgnLycpOwotICAgICAgd2hpbGUgKEN1clB0cisxNiA8PSBCdWZmZXJFbmQpIHsKLSAgICAgICAgaW50IGNtcCA9IF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGk4KCooY29uc3QgX19tMTI4aSopQ3VyUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xhc2hlcykpOworI2RlZmluZSBWRUNUT1JfVFlQRSAgICAgICAgICAgICBfX20xMjhpCisjZGVmaW5lIFNFVDFfRVBJOCh2KSAgICAgICAgICAgIF9tbV9zZXQxX2VwaTgodikKKyNkZWZpbmUgQ01QRVFfRVBJOCh2MSx2MikgICAgICAgX21tX2NtcGVxX2VwaTgodjEsdjIpCisjZGVmaW5lIE1PVkVNQVNLX0VQSTgodikgICAgICAgIF9tbV9tb3ZlbWFza19lcGk4KHYpCisjZGVmaW5lIFNURVAgICAgICAgICAgICAgICAgICAgIDE2CisjZWxpZiBfX0FWWDJfXworI2RlZmluZSBWRUNUT1JfVFlQRSAgICAgICAgICAgICBfX20yNTZpCisjZGVmaW5lIFNFVDFfRVBJOCh2KSAgICAgICAgICAgIF9tbTI1Nl9zZXQxX2VwaTgodikKKyNkZWZpbmUgQ01QRVFfRVBJOCh2MSx2MikgICAgICAgX21tMjU2X2NtcGVxX2VwaTgodjEsdjIpCisjZGVmaW5lIE1PVkVNQVNLX0VQSTgodikgICAgICAgIF9tbTI1Nl9tb3ZlbWFza19lcGk4KHYpCisjZGVmaW5lIFNURVAgICAgICAgICAgICAgICAgICAgIDMyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19TU0UyX18pIHx8IGRlZmluZWQoX19BVlgyX18pCisgICAgICBWRUNUT1JfVFlQRSBTbGFzaGVzID0gU0VUMV9FUEk4KCcvJyk7CisgICAgICB3aGlsZSAoQ3VyUHRyK1NURVAgPD0gQnVmZmVyRW5kKSB7CisgICAgICAgIGludCBjbXAgPSBNT1ZFTUFTS19FUEk4KENNUEVRX0VQSTgoKihjb25zdCBWRUNUT1JfVFlQRSopQ3VyUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGFzaGVzKSk7CiAgICAgICAgIGlmIChjbXAgIT0gMCkgewogICAgICAgICAgIC8vIEFkanVzdCB0aGUgcG9pbnRlciB0byBwb2ludCBkaXJlY3RseSBhZnRlciB0aGUgZmlyc3Qgc2xhc2guIEl0J3MKICAgICAgICAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIHNldCBDIGhlcmUsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gYXQgdGhlIGVuZCBvZgpAQCAtMjI4Niw4ICsyMzQyLDEzIEBACiAgICAgICAgICAgQ3VyUHRyICs9IGxsdm06OmNvdW50VHJhaWxpbmdaZXJvczx1bnNpZ25lZD4oY21wKSArIDE7CiAgICAgICAgICAgZ290byBGb3VuZFNsYXNoOwogICAgICAgICB9Ci0gICAgICAgIEN1clB0ciArPSAxNjsKKyAgICAgICAgQ3VyUHRyICs9IFNURVA7CiAgICAgICB9CisjdW5kZWYgVkVDVE9SX1RZUEUKKyN1bmRlZiBTRVQxX0VQSTgKKyN1bmRlZiBDTVBFUV9FUEk4CisjdW5kZWYgTU9WRU1BU0tfRVBJOAorI3VuZGVmIFNURVAKICNlbGlmIF9fQUxUSVZFQ19fCiAgICAgICBfX3ZlY3RvciB1bnNpZ25lZCBjaGFyIFNsYXNoZXMgPSB7CiAgICAgICAgICcvJywgJy8nLCAnLycsICcvJywgICcvJywgJy8nLCAnLycsICcvJywKQEAgLTI0NjAsNyArMjUyMSw4IEBACiAgICAgRm9ybVRva2VuV2l0aENoYXJzKFJlc3VsdCwgQ3VyUHRyLCB0b2s6OmVvZCk7CiAKICAgICAvLyBSZXN0b3JlIGNvbW1lbnQgc2F2aW5nIG1vZGUsIGluIGNhc2UgaXQgd2FzIGRpc2FibGVkIGZvciBkaXJlY3RpdmUuCi0gICAgcmVzZXRFeHRlbmRlZFRva2VuTW9kZSgpOworICAgIGlmIChQUCkKKyAgICAgIHJlc2V0RXh0ZW5kZWRUb2tlbk1vZGUoKTsKICAgICByZXR1cm4gdHJ1ZTsgIC8vIEhhdmUgYSB0b2tlbi4KICAgfQogIApkaWZmIC0tZ2l0IGEvbGliL0xleC9MaXRlcmFsU3VwcG9ydC5jcHAgYi9saWIvTGV4L0xpdGVyYWxTdXBwb3J0LmNwcAppbmRleCAxN2M2YmIzLi5kZGZhMTBjIDEwMDY0NAotLS0gYS9saWIvTGV4L0xpdGVyYWxTdXBwb3J0LmNwcAorKysgYi9saWIvTGV4L0xpdGVyYWxTdXBwb3J0LmNwcApAQCAtMjEyLDYgKzIxMiw0OCBAQAogICByZXR1cm4gUmVzdWx0Q2hhcjsKIH0KIAorc3RhdGljIHZvaWQgYXBwZW5kQ29kZVBvaW50KHVuc2lnbmVkIENvZGVwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0cikgeworICBjaGFyIFJlc3VsdEJ1Zls0XTsKKyAgY2hhciAqUmVzdWx0UHRyID0gUmVzdWx0QnVmOworICBib29sIFJlcyA9IGxsdm06OkNvbnZlcnRDb2RlUG9pbnRUb1VURjgoQ29kZXBvaW50LCBSZXN1bHRQdHIpOworICAodm9pZClSZXM7CisgIGFzc2VydChSZXMgJiYgIlVuZXhwZWN0ZWQgY29udmVyc2lvbiBmYWlsdXJlIik7CisgIFN0ci5hcHBlbmQoUmVzdWx0QnVmLCBSZXN1bHRQdHIpOworfQorCit2b2lkIGNsYW5nOjpleHBhbmRVQ05zKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmQnVmLCBTdHJpbmdSZWYgSW5wdXQpIHsKKyAgZm9yIChTdHJpbmdSZWY6Oml0ZXJhdG9yIEkgPSBJbnB1dC5iZWdpbigpLCBFID0gSW5wdXQuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKCpJICE9ICdcXCcpIHsKKyAgICAgIEJ1Zi5wdXNoX2JhY2soKkkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgKytJOworICAgIGFzc2VydCgqSSA9PSAndScgfHwgKkkgPT0gJ1UnKTsKKworICAgIHVuc2lnbmVkIE51bUhleERpZ2l0czsKKyAgICBpZiAoKkkgPT0gJ3UnKQorICAgICAgTnVtSGV4RGlnaXRzID0gNDsKKyAgICBlbHNlCisgICAgICBOdW1IZXhEaWdpdHMgPSA4OworCisgICAgYXNzZXJ0KEkgKyBOdW1IZXhEaWdpdHMgPD0gRSk7CisKKyAgICB1aW50MzJfdCBDb2RlUG9pbnQgPSAwOworICAgIGZvciAoKytJOyBOdW1IZXhEaWdpdHMgIT0gMDsgKytJLCAtLU51bUhleERpZ2l0cykgeworICAgICAgdW5zaWduZWQgVmFsdWUgPSBsbHZtOjpoZXhEaWdpdFZhbHVlKCpJKTsKKyAgICAgIGFzc2VydChWYWx1ZSAhPSAtMVUpOworCisgICAgICBDb2RlUG9pbnQgPDw9IDQ7CisgICAgICBDb2RlUG9pbnQgKz0gVmFsdWU7CisgICAgfQorCisgICAgYXBwZW5kQ29kZVBvaW50KENvZGVQb2ludCwgQnVmKTsKKyAgICAtLUk7CisgIH0KK30KKwogLy8vIFByb2Nlc3NVQ05Fc2NhcGUgLSBSZWFkIHRoZSBVbml2ZXJzYWwgQ2hhcmFjdGVyIE5hbWUsIGNoZWNrIGNvbnN0cmFpbnRzIGFuZAogLy8vIHJldHVybiB0aGUgVVRGMzIuCiBzdGF0aWMgYm9vbCBQcm9jZXNzVUNORXNjYXBlKGNvbnN0IGNoYXIgKlRoaXNUb2tCZWdpbiwgY29uc3QgY2hhciAqJlRoaXNUb2tCdWYsCkBAIC02MjUsOCArNjY3LDkgQEAKICAgfQogCiAgIGlmIChzICE9IFRoaXNUb2tFbmQpIHsKLSAgICBpZiAoaXNWYWxpZFVEU3VmZml4KFBQLmdldExhbmdPcHRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYoU3VmZml4QmVnaW4sIFRoaXNUb2tFbmQgLSBTdWZmaXhCZWdpbikpKSB7CisgICAgLy8gRklYTUU6IERvbid0IGJvdGhlciBleHBhbmRpbmcgVUNOcyBpZiAhdG9rLmhhc1VDTigpLgorICAgIGV4cGFuZFVDTnMoVURTdWZmaXhCdWYsIFN0cmluZ1JlZihTdWZmaXhCZWdpbiwgVGhpc1Rva0VuZCAtIFN1ZmZpeEJlZ2luKSk7CisgICAgaWYgKGlzVmFsaWRVRFN1ZmZpeChQUC5nZXRMYW5nT3B0cygpLCBVRFN1ZmZpeEJ1ZikpIHsKICAgICAgIC8vIEFueSBzdWZmaXggcGllY2VzIHdlIG1pZ2h0IGhhdmUgcGFyc2VkIGFyZSBhY3R1YWxseSBwYXJ0IG9mIHRoZQogICAgICAgLy8gdWQtc3VmZml4LgogICAgICAgaXNMb25nID0gZmFsc2U7CkBAIC05OTIsNyArMTAzNSw4IEBACiAgICAgZG8gewogICAgICAgLS1lbmQ7CiAgICAgfSB3aGlsZSAoZW5kWy0xXSAhPSAnXCcnKTsKLSAgICBVRFN1ZmZpeEJ1Zi5hc3NpZ24oZW5kLCBVRFN1ZmZpeEVuZCk7CisgICAgLy8gRklYTUU6IERvbid0IGJvdGhlciB3aXRoIHRoaXMgaWYgIXRvay5oYXNVQ04oKS4KKyAgICBleHBhbmRVQ05zKFVEU3VmZml4QnVmLCBTdHJpbmdSZWYoZW5kLCBVRFN1ZmZpeEVuZCAtIGVuZCkpOwogICAgIFVEU3VmZml4T2Zmc2V0ID0gZW5kIC0gVG9rQmVnaW47CiAgIH0KIApAQCAtMTMxMSwyMyArMTM1NSwzNCBAQAogICAgICAgU3RyaW5nUmVmIFVEU3VmZml4KFRoaXNUb2tFbmQsIFVEU3VmZml4RW5kIC0gVGhpc1Rva0VuZCk7CiAKICAgICAgIGlmIChVRFN1ZmZpeEJ1Zi5lbXB0eSgpKSB7Ci0gICAgICAgIFVEU3VmZml4QnVmLmFzc2lnbihVRFN1ZmZpeCk7CisgICAgICAgIGlmIChTdHJpbmdUb2tzW2ldLmhhc1VDTigpKQorICAgICAgICAgIGV4cGFuZFVDTnMoVURTdWZmaXhCdWYsIFVEU3VmZml4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFVEU3VmZml4QnVmLmFzc2lnbihVRFN1ZmZpeCk7CiAgICAgICAgIFVEU3VmZml4VG9rZW4gPSBpOwogICAgICAgICBVRFN1ZmZpeE9mZnNldCA9IFRoaXNUb2tFbmQgLSBUaGlzVG9rQnVmOwogICAgICAgICBVRFN1ZmZpeFRva0xvYyA9IFN0cmluZ1Rva3NbaV0uZ2V0TG9jYXRpb24oKTsKLSAgICAgIH0gZWxzZSBpZiAoIVVEU3VmZml4QnVmLmVxdWFscyhVRFN1ZmZpeCkpIHsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNtYWxsU3RyaW5nPDMyPiBFeHBhbmRlZFVEU3VmZml4OworICAgICAgICBpZiAoU3RyaW5nVG9rc1tpXS5oYXNVQ04oKSkgeworICAgICAgICAgIGV4cGFuZFVDTnMoRXhwYW5kZWRVRFN1ZmZpeCwgVURTdWZmaXgpOworICAgICAgICAgIFVEU3VmZml4ID0gRXhwYW5kZWRVRFN1ZmZpeDsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIEMrKzExIFtsZXguZXh0XXA4OiBBdCB0aGUgZW5kIG9mIHBoYXNlIDYsIGlmIGEgc3RyaW5nIGxpdGVyYWwgaXMgdGhlCiAgICAgICAgIC8vIHJlc3VsdCBvZiBhIGNvbmNhdGVuYXRpb24gaW52b2x2aW5nIGF0IGxlYXN0IG9uZSB1c2VyLWRlZmluZWQtc3RyaW5nLQogICAgICAgICAvLyBsaXRlcmFsLCBhbGwgdGhlIHBhcnRpY2lwYXRpbmcgdXNlci1kZWZpbmVkLXN0cmluZy1saXRlcmFscyBzaGFsbAogICAgICAgICAvLyBoYXZlIHRoZSBzYW1lIHVkLXN1ZmZpeC4KLSAgICAgICAgaWYgKERpYWdzKSB7Ci0gICAgICAgICAgU291cmNlTG9jYXRpb24gVG9rTG9jID0gU3RyaW5nVG9rc1tpXS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgIERpYWdzLT5SZXBvcnQoVG9rTG9jLCBkaWFnOjplcnJfc3RyaW5nX2NvbmNhdF9taXhlZF9zdWZmaXgpCi0gICAgICAgICAgICA8PCBVRFN1ZmZpeEJ1ZiA8PCBVRFN1ZmZpeAotICAgICAgICAgICAgPDwgU291cmNlUmFuZ2UoVURTdWZmaXhUb2tMb2MsIFVEU3VmZml4VG9rTG9jKQotICAgICAgICAgICAgPDwgU291cmNlUmFuZ2UoVG9rTG9jLCBUb2tMb2MpOworICAgICAgICBpZiAoVURTdWZmaXhCdWYgIT0gVURTdWZmaXgpIHsKKyAgICAgICAgICBpZiAoRGlhZ3MpIHsKKyAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRva0xvYyA9IFN0cmluZ1Rva3NbaV0uZ2V0TG9jYXRpb24oKTsKKyAgICAgICAgICAgIERpYWdzLT5SZXBvcnQoVG9rTG9jLCBkaWFnOjplcnJfc3RyaW5nX2NvbmNhdF9taXhlZF9zdWZmaXgpCisgICAgICAgICAgICAgIDw8IFVEU3VmZml4QnVmIDw8IFVEU3VmZml4CisgICAgICAgICAgICAgIDw8IFNvdXJjZVJhbmdlKFVEU3VmZml4VG9rTG9jLCBVRFN1ZmZpeFRva0xvYykKKyAgICAgICAgICAgICAgPDwgU291cmNlUmFuZ2UoVG9rTG9jLCBUb2tMb2MpOworICAgICAgICAgIH0KKyAgICAgICAgICBoYWRFcnJvciA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaGFkRXJyb3IgPSB0cnVlOwogICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL0xleC9NYWNyb0luZm8uY3BwIGIvbGliL0xleC9NYWNyb0luZm8uY3BwCmluZGV4IGI2MWZmNzEuLjAzMjVhODAgMTAwNjQ0Ci0tLSBhL2xpYi9MZXgvTWFjcm9JbmZvLmNwcAorKysgYi9saWIvTGV4L01hY3JvSW5mby5jcHAKQEAgLTEyNSwxNCArMTI1LDExIEBACiAgIHJldHVybiB0cnVlOwogfQogCi1NYWNyb0RpcmVjdGl2ZTo6RGVmSW5mbyBNYWNyb0RpcmVjdGl2ZTo6Z2V0RGVmaW5pdGlvbihib29sIEFsbG93SGlkZGVuKSB7CitNYWNyb0RpcmVjdGl2ZTo6RGVmSW5mbyBNYWNyb0RpcmVjdGl2ZTo6Z2V0RGVmaW5pdGlvbigpIHsKICAgTWFjcm9EaXJlY3RpdmUgKk1EID0gdGhpczsKICAgU291cmNlTG9jYXRpb24gVW5kZWZMb2M7CiAgIE9wdGlvbmFsPGJvb2w+IGlzUHVibGljOwogICBmb3IgKDsgTUQ7IE1EID0gTUQtPmdldFByZXZpb3VzKCkpIHsKLSAgICBpZiAoIUFsbG93SGlkZGVuICYmIE1ELT5pc0hpZGRlbigpKQotICAgICAgY29udGludWU7Ci0KICAgICBpZiAoRGVmTWFjcm9EaXJlY3RpdmUgKkRlZk1EID0gZHluX2Nhc3Q8RGVmTWFjcm9EaXJlY3RpdmU+KE1EKSkKICAgICAgIHJldHVybiBEZWZJbmZvKERlZk1ELCBVbmRlZkxvYywKICAgICAgICAgICAgICAgICAgICAgICFpc1B1YmxpYy5oYXNWYWx1ZSgpIHx8IGlzUHVibGljLmdldFZhbHVlKCkpOwpAQCAtMTQ3LDcgKzE0NCw3IEBACiAgICAgICBpc1B1YmxpYyA9IFZpc01ELT5pc1B1YmxpYygpOwogICB9CiAKLSAgcmV0dXJuIERlZkluZm8oKTsKKyAgcmV0dXJuIERlZkluZm8oMCwgVW5kZWZMb2MsICFpc1B1YmxpYy5oYXNWYWx1ZSgpIHx8IGlzUHVibGljLmdldFZhbHVlKCkpOwogfQogCiBjb25zdCBNYWNyb0RpcmVjdGl2ZTo6RGVmSW5mbwpkaWZmIC0tZ2l0IGEvbGliL0xleC9Nb2R1bGVNYXAuY3BwIGIvbGliL0xleC9Nb2R1bGVNYXAuY3BwCmluZGV4IGY0ZGZhMTIuLmU3ODgwNmQgMTAwNjQ0Ci0tLSBhL2xpYi9MZXgvTW9kdWxlTWFwLmNwcAorKysgYi9saWIvTGV4L01vZHVsZU1hcC5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKICAgTW9kdWxlICpDb250ZXh0ID0gbG9va3VwTW9kdWxlVW5xdWFsaWZpZWQoSWRbMF0uZmlyc3QsIE1vZCk7CiAgIGlmICghQ29udGV4dCkgewogICAgIGlmIChDb21wbGFpbikKLSAgICAgIERpYWdzLT5SZXBvcnQoSWRbMF0uc2Vjb25kLCBkaWFnOjplcnJfbW1hcF9taXNzaW5nX21vZHVsZV91bnF1YWxpZmllZCkKKyAgICAgIERpYWdzLlJlcG9ydChJZFswXS5zZWNvbmQsIGRpYWc6OmVycl9tbWFwX21pc3NpbmdfbW9kdWxlX3VucXVhbGlmaWVkKQogICAgICAgPDwgSWRbMF0uZmlyc3QgPDwgTW9kLT5nZXRGdWxsTW9kdWxlTmFtZSgpOwogCiAgICAgcmV0dXJuIDA7CkBAIC03MCw3ICs3MCw3IEBACiAgICAgTW9kdWxlICpTdWIgPSBsb29rdXBNb2R1bGVRdWFsaWZpZWQoSWRbSV0uZmlyc3QsIENvbnRleHQpOwogICAgIGlmICghU3ViKSB7CiAgICAgICBpZiAoQ29tcGxhaW4pCi0gICAgICAgIERpYWdzLT5SZXBvcnQoSWRbSV0uc2Vjb25kLCBkaWFnOjplcnJfbW1hcF9taXNzaW5nX21vZHVsZV9xdWFsaWZpZWQpCisgICAgICAgIERpYWdzLlJlcG9ydChJZFtJXS5zZWNvbmQsIGRpYWc6OmVycl9tbWFwX21pc3NpbmdfbW9kdWxlX3F1YWxpZmllZCkKICAgICAgICAgPDwgSWRbSV0uZmlyc3QgPDwgQ29udGV4dC0+Z2V0RnVsbE1vZHVsZU5hbWUoKQogICAgICAgICA8PCBTb3VyY2VSYW5nZShJZFswXS5zZWNvbmQsIElkW0ktMV0uc2Vjb25kKTsKIApAQCAtODMsMTkgKzgzLDEyIEBACiAgIHJldHVybiBDb250ZXh0OwogfQogCi1Nb2R1bGVNYXA6Ok1vZHVsZU1hcChTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IsIERpYWdub3N0aWNDb25zdW1lciAmREMsCitNb2R1bGVNYXA6Ok1vZHVsZU1hcChTb3VyY2VNYW5hZ2VyICZTb3VyY2VNZ3IsIERpYWdub3N0aWNzRW5naW5lICZEaWFncywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywgY29uc3QgVGFyZ2V0SW5mbyAqVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgSGVhZGVyU2VhcmNoICZIZWFkZXJJbmZvKQotICAgIDogU291cmNlTWdyKFNvdXJjZU1nciksIExhbmdPcHRzKExhbmdPcHRzKSwgVGFyZ2V0KFRhcmdldCksCisgICAgOiBTb3VyY2VNZ3IoU291cmNlTWdyKSwgRGlhZ3MoRGlhZ3MpLCBMYW5nT3B0cyhMYW5nT3B0cyksIFRhcmdldChUYXJnZXQpLAogICAgICAgSGVhZGVySW5mbyhIZWFkZXJJbmZvKSwgQnVpbHRpbkluY2x1ZGVEaXIoMCksIENvbXBpbGluZ01vZHVsZSgwKSwKLSAgICAgIFNvdXJjZU1vZHVsZSgwKSB7Ci0gIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljSURzPiBEaWFnSURzKG5ldyBEaWFnbm9zdGljSURzKTsKLSAgRGlhZ3MgPSBJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY3NFbmdpbmU+KAotICAgICAgICAgICAgbmV3IERpYWdub3N0aWNzRW5naW5lKERpYWdJRHMsIG5ldyBEaWFnbm9zdGljT3B0aW9ucykpOwotICBEaWFncy0+c2V0Q2xpZW50KG5ldyBGb3J3YXJkaW5nRGlhZ25vc3RpY0NvbnN1bWVyKERDKSwKLSAgICAgICAgICAgICAgICAgICAvKlNob3VsZE93bkNsaWVudD0qL3RydWUpOwotICBEaWFncy0+c2V0U291cmNlTWFuYWdlcigmU291cmNlTWdyKTsKLX0KKyAgICAgIFNvdXJjZU1vZHVsZSgwKSB7fQogCiBNb2R1bGVNYXA6On5Nb2R1bGVNYXAoKSB7CiAgIGZvciAobGx2bTo6U3RyaW5nTWFwPE1vZHVsZSAqPjo6aXRlcmF0b3IgSSA9IE1vZHVsZXMuYmVnaW4oKSwgCkBAIC0xNjYsMTAgKzE1OSwxMTUgQEAKICAgICAgICAgICAgLkRlZmF1bHQoZmFsc2UpOwogfQogCitNb2R1bGVNYXA6OkhlYWRlcnNNYXA6Oml0ZXJhdG9yCitNb2R1bGVNYXA6OmZpbmRLbm93bkhlYWRlcihjb25zdCBGaWxlRW50cnkgKkZpbGUpIHsKKyAgSGVhZGVyc01hcDo6aXRlcmF0b3IgS25vd24gPSBIZWFkZXJzLmZpbmQoRmlsZSk7CisgIGlmIChLbm93biA9PSBIZWFkZXJzLmVuZCgpICYmIEZpbGUtPmdldERpcigpID09IEJ1aWx0aW5JbmNsdWRlRGlyICYmCisgICAgICBpc0J1aWx0aW5IZWFkZXIobGx2bTo6c3lzOjpwYXRoOjpmaWxlbmFtZShGaWxlLT5nZXROYW1lKCkpKSkgeworICAgIEhlYWRlckluZm8ubG9hZFRvcExldmVsU3lzdGVtTW9kdWxlcygpOworICAgIHJldHVybiBIZWFkZXJzLmZpbmQoRmlsZSk7CisgIH0KKyAgcmV0dXJuIEtub3duOworfQorCisvLyBSZXR1cm5zICd0cnVlJyBpZiAnUmVxdWVzdGluZ01vZHVsZSBkaXJlY3RseSB1c2VzICdSZXF1ZXN0ZWRNb2R1bGUnLgorc3RhdGljIGJvb2wgZGlyZWN0bHlVc2VzKGNvbnN0IE1vZHVsZSAqUmVxdWVzdGluZ01vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKlJlcXVlc3RlZE1vZHVsZSkgeworICByZXR1cm4gc3RkOjpmaW5kKFJlcXVlc3RpbmdNb2R1bGUtPkRpcmVjdFVzZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICBSZXF1ZXN0aW5nTW9kdWxlLT5EaXJlY3RVc2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZE1vZHVsZSkgIT0gUmVxdWVzdGluZ01vZHVsZS0+RGlyZWN0VXNlcy5lbmQoKTsKK30KKworc3RhdGljIGJvb2wgdmlvbGF0ZXNQcml2YXRlSW5jbHVkZShNb2R1bGUgKlJlcXVlc3RpbmdNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqSW5jRmlsZUVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlTWFwOjpNb2R1bGVIZWFkZXJSb2xlIFJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqUmVxdWVzdGVkTW9kdWxlKSB7CisgICNpZm5kZWYgTkRFQlVHCisgIC8vIENoZWNrIGZvciBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSBtb2R1bGUgaGVhZGVyIHJvbGUKKyAgLy8gYXMgb2J0YWluZWQgZnJvbSB0aGUgbG9va3VwIGFuZCBhcyBvYnRhaW5lZCBmcm9tIHRoZSBtb2R1bGUuCisgIC8vIFRoaXMgY2hlY2sgaXMgbm90IGNoZWFwLCBzbyBlbmFibGUgaXQgb25seSBmb3IgZGVidWdnaW5nLgorICBTbWFsbFZlY3RvckltcGw8Y29uc3QgRmlsZUVudHJ5ICo+ICZQdnRIZHJzCisgICAgICA9IFJlcXVlc3RlZE1vZHVsZS0+UHJpdmF0ZUhlYWRlcnM7CisgIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBGaWxlRW50cnkgKj46Oml0ZXJhdG9yIExvb2sKKyAgICAgID0gc3RkOjpmaW5kKFB2dEhkcnMuYmVnaW4oKSwgUHZ0SGRycy5lbmQoKSwgSW5jRmlsZUVudCk7CisgIGJvb2wgSXNQcml2YXRlID0gTG9vayAhPSBQdnRIZHJzLmVuZCgpOworICBhc3NlcnQoKElzUHJpdmF0ZSAmJiBSb2xlID09IE1vZHVsZU1hcDo6UHJpdmF0ZUhlYWRlcikKKyAgICAgICAgICAgICAgIHx8ICghSXNQcml2YXRlICYmIFJvbGUgIT0gTW9kdWxlTWFwOjpQcml2YXRlSGVhZGVyKSk7CisgICNlbmRpZgorICByZXR1cm4gUm9sZSA9PSBNb2R1bGVNYXA6OlByaXZhdGVIZWFkZXIgJiYKKyAgICAgICAgIFJlcXVlc3RlZE1vZHVsZS0+Z2V0VG9wTGV2ZWxNb2R1bGUoKSAhPSBSZXF1ZXN0aW5nTW9kdWxlOworfQorCit2b2lkIE1vZHVsZU1hcDo6ZGlhZ25vc2VIZWFkZXJJbmNsdXNpb24oTW9kdWxlICpSZXF1ZXN0aW5nTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEZpbGVuYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRW50cnkgKkZpbGUpIHsKKyAgLy8gTm8gZXJyb3JzIGZvciBpbmRpcmVjdCBtb2R1bGVzLiBUaGlzIG1heSBiZSBhIGJpdCBvZiBhIHByb2JsZW0gZm9yIG1vZHVsZXMKKyAgLy8gd2l0aCBubyBzb3VyY2UgZmlsZXMuCisgIGlmIChSZXF1ZXN0aW5nTW9kdWxlICE9IFNvdXJjZU1vZHVsZSkKKyAgICByZXR1cm47CisKKyAgaWYgKFJlcXVlc3RpbmdNb2R1bGUpCisgICAgcmVzb2x2ZVVzZXMoUmVxdWVzdGluZ01vZHVsZSwgLypDb21wbGFpbj0qL2ZhbHNlKTsKKworICBIZWFkZXJzTWFwOjppdGVyYXRvciBLbm93biA9IGZpbmRLbm93bkhlYWRlcihGaWxlKTsKKyAgaWYgKEtub3duID09IEhlYWRlcnMuZW5kKCkpCisgICAgcmV0dXJuOworCisgIE1vZHVsZSAqUHJpdmF0ZSA9IE5VTEw7CisgIE1vZHVsZSAqTm90VXNlZCA9IE5VTEw7CisgIGZvciAoU21hbGxWZWN0b3JJbXBsPEtub3duSGVhZGVyPjo6aXRlcmF0b3IgSSA9IEtub3duLT5zZWNvbmQuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gS25vd24tPnNlY29uZC5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIC8vIEV4Y2x1ZGVkIGhlYWRlcnMgZG9uJ3QgcmVhbGx5IGJlbG9uZyB0byBhIG1vZHVsZS4KKyAgICBpZiAoSS0+Z2V0Um9sZSgpID09IE1vZHVsZU1hcDo6RXhjbHVkZWRIZWFkZXIpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIElmICdGaWxlJyBpcyBwYXJ0IG9mICdSZXF1ZXN0aW5nTW9kdWxlJyB3ZSBjYW4gZGVmaW5pdGVseSBpbmNsdWRlIGl0LgorICAgIGlmIChJLT5nZXRNb2R1bGUoKSA9PSBSZXF1ZXN0aW5nTW9kdWxlKQorICAgICAgcmV0dXJuOworCisgICAgLy8gUmVtZW1iZXIgcHJpdmF0ZSBoZWFkZXJzIGZvciBsYXRlciBwcmludGluZyBvZiBhIGRpYWdub3N0aWMuCisgICAgaWYgKHZpb2xhdGVzUHJpdmF0ZUluY2x1ZGUoUmVxdWVzdGluZ01vZHVsZSwgRmlsZSwgSS0+Z2V0Um9sZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEktPmdldE1vZHVsZSgpKSkgeworICAgICAgUHJpdmF0ZSA9IEktPmdldE1vZHVsZSgpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSWYgdXNlcyBuZWVkIHRvIGJlIHNwZWNpZmllZCBleHBsaWNpdGx5LCB3ZSBhcmUgb25seSBhbGxvd2VkIHRvIHJldHVybgorICAgIC8vIG1vZHVsZXMgdGhhdCBhcmUgZXhwbGljaXRseSB1c2VkIGJ5IHRoZSByZXF1ZXN0aW5nIG1vZHVsZS4KKyAgICBpZiAoUmVxdWVzdGluZ01vZHVsZSAmJiBMYW5nT3B0cy5Nb2R1bGVzRGVjbFVzZSAmJgorICAgICAgICAhZGlyZWN0bHlVc2VzKFJlcXVlc3RpbmdNb2R1bGUsIEktPmdldE1vZHVsZSgpKSkgeworICAgICAgTm90VXNlZCA9IEktPmdldE1vZHVsZSgpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSBmb3VuZCBhIG1vZHVsZSB0aGF0IHdlIGNhbiBoYXBwaWx5IHVzZS4KKyAgICByZXR1cm47CisgIH0KKworICAvLyBXZSBoYXZlIGZvdW5kIGEgaGVhZGVyLCBidXQgaXQgaXMgcHJpdmF0ZS4KKyAgaWYgKFByaXZhdGUgIT0gTlVMTCkgeworICAgIERpYWdzLlJlcG9ydChGaWxlbmFtZUxvYywgZGlhZzo6ZXJyb3JfdXNlX29mX3ByaXZhdGVfaGVhZGVyX291dHNpZGVfbW9kdWxlKQorICAgICAgICA8PCBGaWxlbmFtZTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBXZSBoYXZlIGZvdW5kIGEgbW9kdWxlLCBidXQgd2UgZG9uJ3QgdXNlIGl0LgorICBpZiAoTm90VXNlZCAhPSBOVUxMKSB7CisgICAgRGlhZ3MuUmVwb3J0KEZpbGVuYW1lTG9jLCBkaWFnOjplcnJvcl91bmRlY2xhcmVkX3VzZV9vZl9tb2R1bGUpCisgICAgICAgIDw8IFJlcXVlc3RpbmdNb2R1bGUtPmdldEZ1bGxNb2R1bGVOYW1lKCkgPDwgRmlsZW5hbWU7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSGVhZGVycyBmb3Igd2hpY2ggd2UgaGF2ZSBub3QgZm91bmQgYSBtb2R1bGUgYXJlIGZpbmUgdG8gaW5jbHVkZS4KK30KKwogTW9kdWxlTWFwOjpLbm93bkhlYWRlcgogTW9kdWxlTWFwOjpmaW5kTW9kdWxlRm9ySGVhZGVyKGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKlJlcXVlc3RpbmdNb2R1bGUpIHsKLSAgSGVhZGVyc01hcDo6aXRlcmF0b3IgS25vd24gPSBIZWFkZXJzLmZpbmQoRmlsZSk7CisgIEhlYWRlcnNNYXA6Oml0ZXJhdG9yIEtub3duID0gZmluZEtub3duSGVhZGVyKEZpbGUpOworCiAgIGlmIChLbm93biAhPSBIZWFkZXJzLmVuZCgpKSB7CiAgICAgTW9kdWxlTWFwOjpLbm93bkhlYWRlciBSZXN1bHQgPSBLbm93bkhlYWRlcigpOwogCkBAIC0xNzcsOSArMjc1LDEyIEBACiAgICAgZm9yIChTbWFsbFZlY3RvckltcGw8S25vd25IZWFkZXI+OjppdGVyYXRvciBJID0gS25vd24tPnNlY29uZC5iZWdpbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IEtub3duLT5zZWNvbmQuZW5kKCk7CiAgICAgICAgICBJICE9IEU7ICsrSSkgewotICAgICAgLy8gQ2Fubm90IHVzZSBhIG1vZHVsZSBpZiB0aGUgaGVhZGVyIGlzIGV4Y2x1ZGVkIG9yIHVuYXZhaWxhYmxlIGluIGl0LgotICAgICAgaWYgKEktPmdldFJvbGUoKSA9PSBNb2R1bGVNYXA6OkV4Y2x1ZGVkSGVhZGVyIHx8Ci0gICAgICAgICAgIUktPmdldE1vZHVsZSgpLT5pc0F2YWlsYWJsZSgpKQorICAgICAgLy8gQ2Fubm90IHVzZSBhIG1vZHVsZSBpZiB0aGUgaGVhZGVyIGlzIGV4Y2x1ZGVkIGluIGl0LgorICAgICAgaWYgKEktPmdldFJvbGUoKSA9PSBNb2R1bGVNYXA6OkV4Y2x1ZGVkSGVhZGVyKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gQ2Fubm90IHVzZSBhIG1vZHVsZSBpZiBpdCBpcyB1bmF2YWlsYWJsZS4KKyAgICAgIGlmICghSS0+Z2V0TW9kdWxlKCktPmlzQXZhaWxhYmxlKCkpCiAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAvLyBJZiAnRmlsZScgaXMgcGFydCBvZiAnUmVxdWVzdGluZ01vZHVsZScsICdSZXF1ZXN0aW5nTW9kdWxlJyBpcyB0aGUKQEAgLTE5MCwzMSArMjkxLDIwIEBACiAgICAgICAvLyBJZiB1c2VzIG5lZWQgdG8gYmUgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHdlIGFyZSBvbmx5IGFsbG93ZWQgdG8gcmV0dXJuCiAgICAgICAvLyBtb2R1bGVzIHRoYXQgYXJlIGV4cGxpY2l0bHkgdXNlZCBieSB0aGUgcmVxdWVzdGluZyBtb2R1bGUuCiAgICAgICBpZiAoUmVxdWVzdGluZ01vZHVsZSAmJiBMYW5nT3B0cy5Nb2R1bGVzRGVjbFVzZSAmJgotICAgICAgICAgIHN0ZDo6ZmluZChSZXF1ZXN0aW5nTW9kdWxlLT5EaXJlY3RVc2VzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgIFJlcXVlc3RpbmdNb2R1bGUtPkRpcmVjdFVzZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgIEktPmdldE1vZHVsZSgpKSA9PSBSZXF1ZXN0aW5nTW9kdWxlLT5EaXJlY3RVc2VzLmVuZCgpKQorICAgICAgICAgICFkaXJlY3RseVVzZXMoUmVxdWVzdGluZ01vZHVsZSwgSS0+Z2V0TW9kdWxlKCkpKQogICAgICAgICBjb250aW51ZTsKKwogICAgICAgUmVzdWx0ID0gKkk7CiAgICAgICAvLyBJZiAnRmlsZScgaXMgYSBwdWJsaWMgaGVhZGVyIG9mIHRoaXMgbW9kdWxlLCB0aGlzIGlzIGFzIGdvb2QgYXMgd2UKICAgICAgIC8vIGFyZSBnb2luZyB0byBnZXQuCisgICAgICAvLyBGSVhNRTogSWYgd2UgaGF2ZSBhIFJlcXVlc3RpbmdNb2R1bGUsIHdlIHNob3VsZCBwcmVmZXIgdGhlIGhlYWRlciBmcm9tCisgICAgICAvLyB0aGF0IG1vZHVsZS4KICAgICAgIGlmIChJLT5nZXRSb2xlKCkgPT0gTW9kdWxlTWFwOjpOb3JtYWxIZWFkZXIpCiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gUmVzdWx0OwogICB9CiAKLSAgLy8gSWYgd2UndmUgZm91bmQgYSBidWlsdGluIGhlYWRlciB3aXRoaW4gQ2xhbmcncyBidWlsdGluIGluY2x1ZGUgZGlyZWN0b3J5LAotICAvLyBsb2FkIGFsbCBvZiB0aGUgbW9kdWxlIG1hcHMgdG8gc2VlIGlmIGl0IHdpbGwgZ2V0IGFzc29jaWF0ZWQgd2l0aCBhCi0gIC8vIHNwZWNpZmljIG1vZHVsZSAoZS5nLiwgaW4gL3Vzci9pbmNsdWRlKS4KLSAgaWYgKEZpbGUtPmdldERpcigpID09IEJ1aWx0aW5JbmNsdWRlRGlyICYmCi0gICAgICBpc0J1aWx0aW5IZWFkZXIobGx2bTo6c3lzOjpwYXRoOjpmaWxlbmFtZShGaWxlLT5nZXROYW1lKCkpKSkgewotICAgIEhlYWRlckluZm8ubG9hZFRvcExldmVsU3lzdGVtTW9kdWxlcygpOwotCi0gICAgLy8gQ2hlY2sgYWdhaW4uCi0gICAgaWYgKEhlYWRlcnMuZmluZChGaWxlKSAhPSBIZWFkZXJzLmVuZCgpKQotICAgICAgcmV0dXJuIGZpbmRNb2R1bGVGb3JIZWFkZXIoRmlsZSwgUmVxdWVzdGluZ01vZHVsZSk7Ci0gIH0KLSAgCiAgIGNvbnN0IERpcmVjdG9yeUVudHJ5ICpEaXIgPSBGaWxlLT5nZXREaXIoKTsKICAgU21hbGxWZWN0b3I8Y29uc3QgRGlyZWN0b3J5RW50cnkgKiwgMj4gU2tpcHBlZERpcnM7CiAKQEAgLTUwNCw5ICs1OTQsOSBAQAogICAgICAgICBpZiAoaW5mZXJyZWQgPT0gSW5mZXJyZWREaXJlY3Rvcmllcy5lbmQoKSkgewogICAgICAgICAgIC8vIFdlIGhhdmVuJ3QgbG9va2VkIGhlcmUgYmVmb3JlLiBMb2FkIGEgbW9kdWxlIG1hcCwgaWYgdGhlcmUgaXMKICAgICAgICAgICAvLyBvbmUuCi0gICAgICAgICAgU21hbGxTdHJpbmc8MTI4PiBNb2RNYXBQYXRoID0gUGFyZW50OwotICAgICAgICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKE1vZE1hcFBhdGgsICJtb2R1bGUubWFwIik7Ci0gICAgICAgICAgaWYgKGNvbnN0IEZpbGVFbnRyeSAqTW9kTWFwRmlsZSA9IEZpbGVNZ3IuZ2V0RmlsZShNb2RNYXBQYXRoKSkgeworICAgICAgICAgIGJvb2wgSXNGcmFtZXdvcmtEaXIgPSBQYXJlbnQuZW5kc3dpdGgoIi5mcmFtZXdvcmsiKTsKKyAgICAgICAgICBpZiAoY29uc3QgRmlsZUVudHJ5ICpNb2RNYXBGaWxlID0KKyAgICAgICAgICAgICAgICBIZWFkZXJJbmZvLmxvb2t1cE1vZHVsZU1hcEZpbGUoUGFyZW50RGlyLCBJc0ZyYW1ld29ya0RpcikpIHsKICAgICAgICAgICAgIHBhcnNlTW9kdWxlTWFwRmlsZShNb2RNYXBGaWxlLCBJc1N5c3RlbSk7CiAgICAgICAgICAgICBpbmZlcnJlZCA9IEluZmVycmVkRGlyZWN0b3JpZXMuZmluZChQYXJlbnREaXIpOwogICAgICAgICAgIH0KQEAgLTgxOCwxMSArOTA4LDE0IEBACiAKICAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBtb2R1bGUuCiAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKLSAgICBBdHRyaWJ1dGVzKCkgOiBJc1N5c3RlbSgpLCBJc0V4aGF1c3RpdmUoKSB7IH0KKyAgICBBdHRyaWJ1dGVzKCkgOiBJc1N5c3RlbSgpLCBJc0V4dGVybkMoKSwgSXNFeGhhdXN0aXZlKCkgeyB9CiAKICAgICAvLy8gXGJyaWVmIFdoZXRoZXIgdGhpcyBpcyBhIHN5c3RlbSBtb2R1bGUuCiAgICAgdW5zaWduZWQgSXNTeXN0ZW0gOiAxOwogCisgICAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgaXMgYW4gZXh0ZXJuICJDIiBtb2R1bGUuCisgICAgdW5zaWduZWQgSXNFeHRlcm5DIDogMTsKKwogICAgIC8vLyBcYnJpZWYgV2hldGhlciB0aGlzIGlzIGFuIGV4aGF1c3RpdmUgc2V0IG9mIGNvbmZpZ3VyYXRpb24gbWFjcm9zLgogICAgIHVuc2lnbmVkIElzRXhoYXVzdGl2ZSA6IDE7CiAgIH07CkBAIC0xMDY2LDcgKzExNTksNyBAQAogYm9vbCBNb2R1bGVNYXBQYXJzZXI6OnBhcnNlTW9kdWxlSWQoTW9kdWxlSWQgJklkKSB7CiAgIElkLmNsZWFyKCk7CiAgIGRvIHsKLSAgICBpZiAoVG9rLmlzKE1NVG9rZW46OklkZW50aWZpZXIpKSB7CisgICAgaWYgKFRvay5pcyhNTVRva2VuOjpJZGVudGlmaWVyKSB8fCBUb2suaXMoTU1Ub2tlbjo6U3RyaW5nTGl0ZXJhbCkpIHsKICAgICAgIElkLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihUb2suZ2V0U3RyaW5nKCksIFRvay5nZXRMb2NhdGlvbigpKSk7CiAgICAgICBjb25zdW1lVG9rZW4oKTsKICAgICB9IGVsc2UgewpAQCAtMTA5MCw2ICsxMTgzLDggQEAKICAgICBBVF91bmtub3duLAogICAgIC8vLyBcYnJpZWYgVGhlICdzeXN0ZW0nIGF0dHJpYnV0ZS4KICAgICBBVF9zeXN0ZW0sCisgICAgLy8vIFxicmllZiBUaGUgJ2V4dGVybl9jJyBhdHRyaWJ1dGUuCisgICAgQVRfZXh0ZXJuX2MsCiAgICAgLy8vIFxicmllZiBUaGUgJ2V4aGF1c3RpdmUnIGF0dHJpYnV0ZS4KICAgICBBVF9leGhhdXN0aXZlCiAgIH07CkBAIC0xMTg3LDcgKzEyODIsOCBAQAogICAgICAgCiAgICAgICBpZiAoQWN0aXZlTW9kdWxlKSB7CiAgICAgICAgIERpYWdzLlJlcG9ydChJZFtJXS5zZWNvbmQsIGRpYWc6OmVycl9tbWFwX21pc3NpbmdfbW9kdWxlX3F1YWxpZmllZCkKLSAgICAgICAgICA8PCBJZFtJXS5maXJzdCA8PCBBY3RpdmVNb2R1bGUtPmdldFRvcExldmVsTW9kdWxlKCk7CisgICAgICAgICAgPDwgSWRbSV0uZmlyc3QKKyAgICAgICAgICA8PCBBY3RpdmVNb2R1bGUtPmdldFRvcExldmVsTW9kdWxlKCktPmdldEZ1bGxNb2R1bGVOYW1lKCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBEaWFncy5SZXBvcnQoSWRbSV0uc2Vjb25kLCBkaWFnOjplcnJfbW1hcF9leHBlY3RlZF9tb2R1bGVfbmFtZSk7CiAgICAgICB9CkBAIC0xMjQ2LDcgKzEzNDIsOSBAQAogICBBY3RpdmVNb2R1bGUtPkRlZmluaXRpb25Mb2MgPSBNb2R1bGVOYW1lTG9jOwogICBpZiAoQXR0cnMuSXNTeXN0ZW0gfHwgSXNTeXN0ZW0pCiAgICAgQWN0aXZlTW9kdWxlLT5Jc1N5c3RlbSA9IHRydWU7Ci0gIAorICBpZiAoQXR0cnMuSXNFeHRlcm5DKQorICAgIEFjdGl2ZU1vZHVsZS0+SXNFeHRlcm5DID0gdHJ1ZTsKKwogICBib29sIERvbmUgPSBmYWxzZTsKICAgZG8gewogICAgIHN3aXRjaCAoVG9rLktpbmQpIHsKQEAgLTE0NzQsMTIgKzE1NzIsMTMgQEAKICAgICBIYWRFcnJvciA9IHRydWU7CiAgICAgcmV0dXJuOwogICB9Ci0gIHN0ZDo6c3RyaW5nIEZpbGVOYW1lID0gVG9rLmdldFN0cmluZygpOwotICBTb3VyY2VMb2NhdGlvbiBGaWxlTmFtZUxvYyA9IGNvbnN1bWVUb2tlbigpOworICBNb2R1bGU6OkhlYWRlckRpcmVjdGl2ZSBIZWFkZXI7CisgIEhlYWRlci5GaWxlTmFtZSA9IFRvay5nZXRTdHJpbmcoKTsKKyAgSGVhZGVyLkZpbGVOYW1lTG9jID0gY29uc3VtZVRva2VuKCk7CiAgIAogICAvLyBDaGVjayB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSBhbiB1bWJyZWxsYS4KICAgaWYgKExlYWRpbmdUb2tlbiA9PSBNTVRva2VuOjpVbWJyZWxsYUtleXdvcmQgJiYgQWN0aXZlTW9kdWxlLT5VbWJyZWxsYSkgewotICAgIERpYWdzLlJlcG9ydChGaWxlTmFtZUxvYywgZGlhZzo6ZXJyX21tYXBfdW1icmVsbGFfY2xhc2gpCisgICAgRGlhZ3MuUmVwb3J0KEhlYWRlci5GaWxlTmFtZUxvYywgZGlhZzo6ZXJyX21tYXBfdW1icmVsbGFfY2xhc2gpCiAgICAgICA8PCBBY3RpdmVNb2R1bGUtPmdldEZ1bGxNb2R1bGVOYW1lKCk7CiAgICAgSGFkRXJyb3IgPSB0cnVlOwogICAgIHJldHVybjsKQEAgLTE0ODksMTIgKzE1ODgsMTIgQEAKICAgY29uc3QgRmlsZUVudHJ5ICpGaWxlID0gMDsKICAgY29uc3QgRmlsZUVudHJ5ICpCdWlsdGluRmlsZSA9IDA7CiAgIFNtYWxsU3RyaW5nPDEyOD4gUGF0aE5hbWU7Ci0gIGlmIChsbHZtOjpzeXM6OnBhdGg6OmlzX2Fic29sdXRlKEZpbGVOYW1lKSkgewotICAgIFBhdGhOYW1lID0gRmlsZU5hbWU7CisgIGlmIChsbHZtOjpzeXM6OnBhdGg6OmlzX2Fic29sdXRlKEhlYWRlci5GaWxlTmFtZSkpIHsKKyAgICBQYXRoTmFtZSA9IEhlYWRlci5GaWxlTmFtZTsKICAgICBGaWxlID0gU291cmNlTWdyLmdldEZpbGVNYW5hZ2VyKCkuZ2V0RmlsZShQYXRoTmFtZSk7CiAgIH0gZWxzZSBpZiAoY29uc3QgRGlyZWN0b3J5RW50cnkgKkRpciA9IGdldE92ZXJyaWRkZW5IZWFkZXJTZWFyY2hEaXIoKSkgewogICAgIFBhdGhOYW1lID0gRGlyLT5nZXROYW1lKCk7Ci0gICAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoUGF0aE5hbWUsIEZpbGVOYW1lKTsKKyAgICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChQYXRoTmFtZSwgSGVhZGVyLkZpbGVOYW1lKTsKICAgICBGaWxlID0gU291cmNlTWdyLmdldEZpbGVNYW5hZ2VyKCkuZ2V0RmlsZShQYXRoTmFtZSk7CiAgIH0gZWxzZSB7CiAgICAgLy8gU2VhcmNoIGZvciB0aGUgaGVhZGVyIGZpbGUgd2l0aGluIHRoZSBzZWFyY2ggZGlyZWN0b3J5LgpAQCAtMTUwNSwxOCArMTYwNCwxOCBAQAogICAgICAgYXBwZW5kU3ViZnJhbWV3b3JrUGF0aHMoQWN0aXZlTW9kdWxlLCBQYXRoTmFtZSk7CiAgICAgICAKICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgaGVhZGVycy4KLSAgICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKFBhdGhOYW1lLCAiSGVhZGVycyIsIEZpbGVOYW1lKTsKKyAgICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKFBhdGhOYW1lLCAiSGVhZGVycyIsIEhlYWRlci5GaWxlTmFtZSk7CiAgICAgICBGaWxlID0gU291cmNlTWdyLmdldEZpbGVNYW5hZ2VyKCkuZ2V0RmlsZShQYXRoTmFtZSk7CiAgICAgICAKICAgICAgIGlmICghRmlsZSkgewogICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgZmlsZSBpcyBpbiB0aGUgcHJpdmF0ZSBoZWFkZXJzLgogICAgICAgICBQYXRoTmFtZS5yZXNpemUoUGF0aExlbmd0aCk7Ci0gICAgICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKFBhdGhOYW1lLCAiUHJpdmF0ZUhlYWRlcnMiLCBGaWxlTmFtZSk7CisgICAgICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKFBhdGhOYW1lLCAiUHJpdmF0ZUhlYWRlcnMiLCBIZWFkZXIuRmlsZU5hbWUpOwogICAgICAgICBGaWxlID0gU291cmNlTWdyLmdldEZpbGVNYW5hZ2VyKCkuZ2V0RmlsZShQYXRoTmFtZSk7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIExvb2t1cCBmb3Igbm9ybWFsIGhlYWRlcnMuCi0gICAgICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChQYXRoTmFtZSwgRmlsZU5hbWUpOworICAgICAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoUGF0aE5hbWUsIEhlYWRlci5GaWxlTmFtZSk7CiAgICAgICBGaWxlID0gU291cmNlTWdyLmdldEZpbGVNYW5hZ2VyKCkuZ2V0RmlsZShQYXRoTmFtZSk7CiAgICAgICAKICAgICAgIC8vIElmIHRoaXMgaXMgYSBzeXN0ZW0gbW9kdWxlIHdpdGggYSB0b3AtbGV2ZWwgaGVhZGVyLCB0aGlzIGhlYWRlcgpAQCAtMTUyNCw5ICsxNjIzLDkgQEAKICAgICAgIC8vIHN1cHBsaWVkIGJ5IENsYW5nLiBGaW5kIHRoYXQgYnVpbHRpbiBoZWFkZXIuCiAgICAgICBpZiAoQWN0aXZlTW9kdWxlLT5Jc1N5c3RlbSAmJiBMZWFkaW5nVG9rZW4gIT0gTU1Ub2tlbjo6VW1icmVsbGFLZXl3b3JkICYmCiAgICAgICAgICAgQnVpbHRpbkluY2x1ZGVEaXIgJiYgQnVpbHRpbkluY2x1ZGVEaXIgIT0gRGlyZWN0b3J5ICYmCi0gICAgICAgICAgaXNCdWlsdGluSGVhZGVyKEZpbGVOYW1lKSkgeworICAgICAgICAgIGlzQnVpbHRpbkhlYWRlcihIZWFkZXIuRmlsZU5hbWUpKSB7CiAgICAgICAgIFNtYWxsU3RyaW5nPDEyOD4gQnVpbHRpblBhdGhOYW1lKEJ1aWx0aW5JbmNsdWRlRGlyLT5nZXROYW1lKCkpOwotICAgICAgICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChCdWlsdGluUGF0aE5hbWUsIEZpbGVOYW1lKTsKKyAgICAgICAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoQnVpbHRpblBhdGhOYW1lLCBIZWFkZXIuRmlsZU5hbWUpOwogICAgICAgICBCdWlsdGluRmlsZSA9IFNvdXJjZU1nci5nZXRGaWxlTWFuYWdlcigpLmdldEZpbGUoQnVpbHRpblBhdGhOYW1lKTsKICAgICAgICAgCiAgICAgICAgIC8vIElmIENsYW5nIHN1cHBsaWVzIHRoaXMgaGVhZGVyIGJ1dCB0aGUgdW5kZXJseWluZyBzeXN0ZW0gZG9lcyBub3QsCkBAIC0xNTcxLDEwICsxNjcwLDEzIEBACiAgICAgfQogICB9IGVsc2UgaWYgKExlYWRpbmdUb2tlbiAhPSBNTVRva2VuOjpFeGNsdWRlS2V5d29yZCkgewogICAgIC8vIElnbm9yZSBleGNsdWRlZCBoZWFkZXIgZmlsZXMuIFRoZXkncmUgb3B0aW9uYWwgYW55d2F5LgotICAgIAotICAgIERpYWdzLlJlcG9ydChGaWxlTmFtZUxvYywgZGlhZzo6ZXJyX21tYXBfaGVhZGVyX25vdF9mb3VuZCkKLSAgICAgIDw8IChMZWFkaW5nVG9rZW4gPT0gTU1Ub2tlbjo6VW1icmVsbGFLZXl3b3JkKSA8PCBGaWxlTmFtZTsKLSAgICBIYWRFcnJvciA9IHRydWU7CisKKyAgICAvLyBJZiB3ZSBmaW5kIGEgbW9kdWxlIHRoYXQgaGFzIGEgbWlzc2luZyBoZWFkZXIsIHdlIG1hcmsgdGhpcyBtb2R1bGUgYXMKKyAgICAvLyB1bmF2YWlsYWJsZSBhbmQgc3RvcmUgdGhlIGhlYWRlciBkaXJlY3RpdmUgZm9yIGRpc3BsYXlpbmcgZGlhZ25vc3RpY3MuCisgICAgLy8gT3RoZXIgc3VibW9kdWxlcyBpbiB0aGUgc2FtZSBtb2R1bGUgY2FuIHN0aWxsIGJlIHVzZWQuCisgICAgSGVhZGVyLklzVW1icmVsbGEgPSBMZWFkaW5nVG9rZW4gPT0gTU1Ub2tlbjo6VW1icmVsbGFLZXl3b3JkOworICAgIEFjdGl2ZU1vZHVsZS0+SXNBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBBY3RpdmVNb2R1bGUtPk1pc3NpbmdIZWFkZXJzLnB1c2hfYmFjayhIZWFkZXIpOwogICB9CiB9CiAKQEAgLTE2ODcsMjUgKzE3ODksNyBAQAogICBjb25zdW1lVG9rZW4oKTsKICAgLy8gUGFyc2UgdGhlIG1vZHVsZS1pZC4KICAgTW9kdWxlSWQgUGFyc2VkTW9kdWxlSWQ7Ci0KLSAgZG8gewotICAgIGlmIChUb2suaXMoTU1Ub2tlbjo6SWRlbnRpZmllcikpIHsKLSAgICAgIFBhcnNlZE1vZHVsZUlkLnB1c2hfYmFjaygKLSAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihUb2suZ2V0U3RyaW5nKCksIFRvay5nZXRMb2NhdGlvbigpKSk7Ci0gICAgICBjb25zdW1lVG9rZW4oKTsKLQotICAgICAgaWYgKFRvay5pcyhNTVRva2VuOjpQZXJpb2QpKSB7Ci0gICAgICAgIGNvbnN1bWVUb2tlbigpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgRGlhZ3MuUmVwb3J0KFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfbW1hcF9tb2R1bGVfaWQpOwotICAgIEhhZEVycm9yID0gdHJ1ZTsKLSAgICByZXR1cm47Ci0gIH0gd2hpbGUgKHRydWUpOworICBwYXJzZU1vZHVsZUlkKFBhcnNlZE1vZHVsZUlkKTsKIAogICBBY3RpdmVNb2R1bGUtPlVucmVzb2x2ZWREaXJlY3RVc2VzLnB1c2hfYmFjayhQYXJzZWRNb2R1bGVJZCk7CiB9CkBAIC0xOTEzLDYgKzE5OTcsNyBAQAogICAgIC8vIFdlJ2xsIGJlIGluZmVycmluZyBmcmFtZXdvcmsgbW9kdWxlcyBmb3IgdGhpcyBkaXJlY3RvcnkuCiAgICAgTWFwLkluZmVycmVkRGlyZWN0b3JpZXNbRGlyZWN0b3J5XS5JbmZlck1vZHVsZXMgPSB0cnVlOwogICAgIE1hcC5JbmZlcnJlZERpcmVjdG9yaWVzW0RpcmVjdG9yeV0uSW5mZXJTeXN0ZW1Nb2R1bGVzID0gQXR0cnMuSXNTeXN0ZW07CisgICAgLy8gRklYTUU6IEhhbmRsZSB0aGUgJ2ZyYW1ld29yaycga2V5d29yZC4KICAgfQogCiAgIC8vIFBhcnNlIHRoZSBvcGVuaW5nIGJyYWNlLgpAQCAtMjAyMyw2ICsyMTA4LDcgQEAKICAgICBBdHRyaWJ1dGVLaW5kIEF0dHJpYnV0ZQogICAgICAgPSBsbHZtOjpTdHJpbmdTd2l0Y2g8QXR0cmlidXRlS2luZD4oVG9rLmdldFN0cmluZygpKQogICAgICAgICAgIC5DYXNlKCJleGhhdXN0aXZlIiwgQVRfZXhoYXVzdGl2ZSkKKyAgICAgICAgICAuQ2FzZSgiZXh0ZXJuX2MiLCBBVF9leHRlcm5fYykKICAgICAgICAgICAuQ2FzZSgic3lzdGVtIiwgQVRfc3lzdGVtKQogICAgICAgICAgIC5EZWZhdWx0KEFUX3Vua25vd24pOwogICAgIHN3aXRjaCAoQXR0cmlidXRlKSB7CkBAIC0yMDM1LDYgKzIxMjEsMTAgQEAKICAgICAgIEF0dHJzLklzU3lzdGVtID0gdHJ1ZTsKICAgICAgIGJyZWFrOwogCisgICAgY2FzZSBBVF9leHRlcm5fYzoKKyAgICAgIEF0dHJzLklzRXh0ZXJuQyA9IHRydWU7CisgICAgICBicmVhazsKKwogICAgIGNhc2UgQVRfZXhoYXVzdGl2ZToKICAgICAgIEF0dHJzLklzRXhoYXVzdGl2ZSA9IHRydWU7CiAgICAgICBicmVhazsKQEAgLTIxMjQsMTggKzIyMTQsMjggQEAKICAgICByZXR1cm4gS25vd24tPnNlY29uZDsKIAogICBhc3NlcnQoVGFyZ2V0ICE9IDAgJiYgIk1pc3NpbmcgdGFyZ2V0IGluZm9ybWF0aW9uIik7Ci0gIEZpbGVJRCBJRCA9IFNvdXJjZU1nci5jcmVhdGVGaWxlSUQoRmlsZSwgU291cmNlTG9jYXRpb24oKSwgU3JjTWdyOjpDX1VzZXIpOworICBhdXRvIEZpbGVDaGFyYWN0ZXIgPSBJc1N5c3RlbSA/IFNyY01ncjo6Q19TeXN0ZW0gOiBTcmNNZ3I6OkNfVXNlcjsKKyAgRmlsZUlEIElEID0gU291cmNlTWdyLmNyZWF0ZUZpbGVJRChGaWxlLCBTb3VyY2VMb2NhdGlvbigpLCBGaWxlQ2hhcmFjdGVyKTsKICAgY29uc3QgbGx2bTo6TWVtb3J5QnVmZmVyICpCdWZmZXIgPSBTb3VyY2VNZ3IuZ2V0QnVmZmVyKElEKTsKICAgaWYgKCFCdWZmZXIpCiAgICAgcmV0dXJuIFBhcnNlZE1vZHVsZU1hcFtGaWxlXSA9IHRydWU7CisKKyAgLy8gRmluZCB0aGUgZGlyZWN0b3J5IGZvciB0aGUgbW9kdWxlLiBGb3IgZnJhbWV3b3JrcywgdGhhdCBtYXkgcmVxdWlyZSBnb2luZworICAvLyB1cCBmcm9tIHRoZSAnTW9kdWxlcycgZGlyZWN0b3J5LgorICBjb25zdCBEaXJlY3RvcnlFbnRyeSAqRGlyID0gRmlsZS0+Z2V0RGlyKCk7CisgIFN0cmluZ1JlZiBEaXJOYW1lKERpci0+Z2V0TmFtZSgpKTsKKyAgaWYgKGxsdm06OnN5czo6cGF0aDo6ZmlsZW5hbWUoRGlyTmFtZSkgPT0gIk1vZHVsZXMiKSB7CisgICAgRGlyTmFtZSA9IGxsdm06OnN5czo6cGF0aDo6cGFyZW50X3BhdGgoRGlyTmFtZSk7CisgICAgaWYgKERpck5hbWUuZW5kc3dpdGgoIi5mcmFtZXdvcmsiKSkKKyAgICAgIERpciA9IFNvdXJjZU1nci5nZXRGaWxlTWFuYWdlcigpLmdldERpcmVjdG9yeShEaXJOYW1lKTsKKyAgICBhc3NlcnQoRGlyICYmICJwYXJlbnQgbXVzdCBleGlzdCIpOworICB9CiAgIAogICAvLyBQYXJzZSB0aGlzIG1vZHVsZSBtYXAgZmlsZS4KICAgTGV4ZXIgTChJRCwgU291cmNlTWdyLmdldEJ1ZmZlcihJRCksIFNvdXJjZU1nciwgTU1hcExhbmdPcHRzKTsKLSAgRGlhZ3MtPmdldENsaWVudCgpLT5CZWdpblNvdXJjZUZpbGUoTU1hcExhbmdPcHRzKTsKLSAgTW9kdWxlTWFwUGFyc2VyIFBhcnNlcihMLCBTb3VyY2VNZ3IsIFRhcmdldCwgKkRpYWdzLCAqdGhpcywgRmlsZS0+Z2V0RGlyKCksCisgIE1vZHVsZU1hcFBhcnNlciBQYXJzZXIoTCwgU291cmNlTWdyLCBUYXJnZXQsIERpYWdzLCAqdGhpcywgRGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5JbmNsdWRlRGlyLCBJc1N5c3RlbSk7CiAgIGJvb2wgUmVzdWx0ID0gUGFyc2VyLnBhcnNlTW9kdWxlTWFwRmlsZSgpOwotICBEaWFncy0+Z2V0Q2xpZW50KCktPkVuZFNvdXJjZUZpbGUoKTsKICAgUGFyc2VkTW9kdWxlTWFwW0ZpbGVdID0gUmVzdWx0OwogICByZXR1cm4gUmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvbGliL0xleC9QUENhY2hpbmcuY3BwIGIvbGliL0xleC9QUENhY2hpbmcuY3BwCmluZGV4IDZmNGMxODkuLmJkNDhhZTYgMTAwNjQ0Ci0tLSBhL2xpYi9MZXgvUFBDYWNoaW5nLmNwcAorKysgYi9saWIvTGV4L1BQQ2FjaGluZy5jcHAKQEAgLTE1LDI4ICsxNSwyOCBAQAogI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIAotLy8vIEVuYWJsZUJhY2t0cmFja0F0VGhpc1BvcyAtIEZyb20gdGhlIHBvaW50IHRoYXQgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBhbmQKLS8vLyB1bnRpbCBDb21taXRCYWNrdHJhY2tlZFRva2VucygpIG9yIEJhY2t0cmFjaygpIGlzIGNhbGxlZCwgdGhlIFByZXByb2Nlc3NvcgotLy8vIGtlZXBzIHRyYWNrIG9mIHRoZSBsZXhlZCB0b2tlbnMgc28gdGhhdCBhIHN1YnNlcXVlbnQgQmFja3RyYWNrKCkgY2FsbCB3aWxsCi0vLy8gbWFrZSB0aGUgUHJlcHJvY2Vzc29yIHJlLWxleCB0aGUgc2FtZSB0b2tlbnMuCi0vLy8KLS8vLyBOZXN0ZWQgYmFja3RyYWNrcyBhcmUgYWxsb3dlZCwgbWVhbmluZyB0aGF0IEVuYWJsZUJhY2t0cmFja0F0VGhpc1BvcyBjYW4KLS8vLyBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYW5kIENvbW1pdEJhY2t0cmFja2VkVG9rZW5zL0JhY2t0cmFjayBjYWxscyB3aWxsCi0vLy8gYmUgY29tYmluZWQgd2l0aCB0aGUgRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zIGNhbGxzIGluIHJldmVyc2Ugb3JkZXIuCisvLyBFbmFibGVCYWNrdHJhY2tBdFRoaXNQb3MgLSBGcm9tIHRoZSBwb2ludCB0aGF0IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgYW5kCisvLyB1bnRpbCBDb21taXRCYWNrdHJhY2tlZFRva2VucygpIG9yIEJhY2t0cmFjaygpIGlzIGNhbGxlZCwgdGhlIFByZXByb2Nlc3NvcgorLy8ga2VlcHMgdHJhY2sgb2YgdGhlIGxleGVkIHRva2VucyBzbyB0aGF0IGEgc3Vic2VxdWVudCBCYWNrdHJhY2soKSBjYWxsIHdpbGwKKy8vIG1ha2UgdGhlIFByZXByb2Nlc3NvciByZS1sZXggdGhlIHNhbWUgdG9rZW5zLgorLy8KKy8vIE5lc3RlZCBiYWNrdHJhY2tzIGFyZSBhbGxvd2VkLCBtZWFuaW5nIHRoYXQgRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zIGNhbgorLy8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFuZCBDb21taXRCYWNrdHJhY2tlZFRva2Vucy9CYWNrdHJhY2sgY2FsbHMgd2lsbAorLy8gYmUgY29tYmluZWQgd2l0aCB0aGUgRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zIGNhbGxzIGluIHJldmVyc2Ugb3JkZXIuCiB2b2lkIFByZXByb2Nlc3Nvcjo6RW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zKCkgewogICBCYWNrdHJhY2tQb3NpdGlvbnMucHVzaF9iYWNrKENhY2hlZExleFBvcyk7CiAgIEVudGVyQ2FjaGluZ0xleE1vZGUoKTsKIH0KIAotLy8vIENvbW1pdEJhY2t0cmFja2VkVG9rZW5zIC0gRGlzYWJsZSB0aGUgbGFzdCBFbmFibGVCYWNrdHJhY2tBdFRoaXNQb3MgY2FsbC4KKy8vIERpc2FibGUgdGhlIGxhc3QgRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zIGNhbGwuCiB2b2lkIFByZXByb2Nlc3Nvcjo6Q29tbWl0QmFja3RyYWNrZWRUb2tlbnMoKSB7CiAgIGFzc2VydCghQmFja3RyYWNrUG9zaXRpb25zLmVtcHR5KCkKICAgICAgICAgICYmICJFbmFibGVCYWNrdHJhY2tBdFRoaXNQb3Mgd2FzIG5vdCBjYWxsZWQhIik7CiAgIEJhY2t0cmFja1Bvc2l0aW9ucy5wb3BfYmFjaygpOwogfQogCi0vLy8gQmFja3RyYWNrIC0gTWFrZSBQcmVwcm9jZXNzb3IgcmUtbGV4IHRoZSB0b2tlbnMgdGhhdCB3ZXJlIGxleGVkIHNpbmNlCi0vLy8gRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zKCkgd2FzIHByZXZpb3VzbHkgY2FsbGVkLgorLy8gTWFrZSBQcmVwcm9jZXNzb3IgcmUtbGV4IHRoZSB0b2tlbnMgdGhhdCB3ZXJlIGxleGVkIHNpbmNlCisvLyBFbmFibGVCYWNrdHJhY2tBdFRoaXNQb3MoKSB3YXMgcHJldmlvdXNseSBjYWxsZWQuCiB2b2lkIFByZXByb2Nlc3Nvcjo6QmFja3RyYWNrKCkgewogICBhc3NlcnQoIUJhY2t0cmFja1Bvc2l0aW9ucy5lbXB0eSgpCiAgICAgICAgICAmJiAiRW5hYmxlQmFja3RyYWNrQXRUaGlzUG9zIHdhcyBub3QgY2FsbGVkISIpOwpkaWZmIC0tZ2l0IGEvbGliL0xleC9QUENvbmRpdGlvbmFsRGlyZWN0aXZlUmVjb3JkLmNwcCBiL2xpYi9MZXgvUFBDb25kaXRpb25hbERpcmVjdGl2ZVJlY29yZC5jcHAKaW5kZXggMTZkYzFkOC4uOTliODdhMCAxMDA2NDQKLS0tIGEvbGliL0xleC9QUENvbmRpdGlvbmFsRGlyZWN0aXZlUmVjb3JkLmNwcAorKysgYi9saWIvTGV4L1BQQ29uZGl0aW9uYWxEaXJlY3RpdmVSZWNvcmQuY3BwCkBAIC03Nyw3ICs3Nyw3IEBACiAKIHZvaWQgUFBDb25kaXRpb25hbERpcmVjdGl2ZVJlY29yZDo6SWYoU291cmNlTG9jYXRpb24gTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBDb25kaXRpb25SYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb25kaXRpb25WYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25WYWx1ZUtpbmQgQ29uZGl0aW9uVmFsdWUpIHsKICAgYWRkQ29uZERpcmVjdGl2ZUxvYyhDb25kRGlyZWN0aXZlTG9jKExvYywgQ29uZERpcmVjdGl2ZVN0YWNrLmJhY2soKSkpOwogICBDb25kRGlyZWN0aXZlU3RhY2sucHVzaF9iYWNrKExvYyk7CiB9CkBAIC05OCw3ICs5OCw3IEBACiAKIHZvaWQgUFBDb25kaXRpb25hbERpcmVjdGl2ZVJlY29yZDo6RWxpZihTb3VyY2VMb2NhdGlvbiBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgQ29uZGl0aW9uUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb25kaXRpb25WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25WYWx1ZUtpbmQgQ29uZGl0aW9uVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSWZMb2MpIHsKICAgYWRkQ29uZERpcmVjdGl2ZUxvYyhDb25kRGlyZWN0aXZlTG9jKExvYywgQ29uZERpcmVjdGl2ZVN0YWNrLmJhY2soKSkpOwogICBDb25kRGlyZWN0aXZlU3RhY2suYmFjaygpID0gTG9jOwpkaWZmIC0tZ2l0IGEvbGliL0xleC9QUERpcmVjdGl2ZXMuY3BwIGIvbGliL0xleC9QUERpcmVjdGl2ZXMuY3BwCmluZGV4IDg2YzUwOGYuLjU3ZGM0OTUgMTAwNjQ0Ci0tLSBhL2xpYi9MZXgvUFBEaXJlY3RpdmVzLmNwcAorKysgYi9saWIvTGV4L1BQRGlyZWN0aXZlcy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJjbGFuZy9MZXgvUHJhZ21hLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NhdmVBbmRSZXN0b3JlLmgiCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiAKQEAgLTYwLDggKzYxLDggQEAKIAogTWFjcm9JbmZvICpQcmVwcm9jZXNzb3I6OkFsbG9jYXRlRGVzZXJpYWxpemVkTWFjcm9JbmZvKFNvdXJjZUxvY2F0aW9uIEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3ViTW9kdWxlSUQpIHsKLSAgTExWTV9TVEFUSUNfQVNTRVJUKGxsdm06OkFsaWduT2Y8TWFjcm9JbmZvPjo6QWxpZ25tZW50ID49IHNpemVvZihTdWJNb2R1bGVJRCksCi0gICAgICAgICAgICAgICAgICAgICAiYWxpZ25tZW50IGZvciBNYWNyb0luZm8gaXMgbGVzcyB0aGFuIHRoZSBJRCIpOworICBzdGF0aWNfYXNzZXJ0KGxsdm06OkFsaWduT2Y8TWFjcm9JbmZvPjo6QWxpZ25tZW50ID49IHNpemVvZihTdWJNb2R1bGVJRCksCisgICAgICAgICAgICAgICAgImFsaWdubWVudCBmb3IgTWFjcm9JbmZvIGlzIGxlc3MgdGhhbiB0aGUgSUQiKTsKICAgRGVzZXJpYWxpemVkTWFjcm9JbmZvQ2hhaW4gKk1JQ2hhaW4gPQogICAgICAgQlAuQWxsb2NhdGU8RGVzZXJpYWxpemVkTWFjcm9JbmZvQ2hhaW4+KCk7CiAgIE1JQ2hhaW4tPk5leHQgPSBEZXNlcmlhbE1JQ2hhaW5IZWFkOwpAQCAtMTYyLDcgKzE2Myw3IEBACiAgICAgY29uc3QgSWRlbnRpZmllckluZm8gJkluZm8gPSBJZGVudGlmaWVycy5nZXQoU3BlbGxpbmcpOwogCiAgICAgLy8gQWxsb3cgI2RlZmluaW5nIHxhbmR8IGFuZCBmcmllbmRzIGluIG1pY3Jvc29mdCBtb2RlLgotICAgIGlmIChJbmZvLmlzQ1BsdXNQbHVzT3BlcmF0b3JLZXl3b3JkKCkgJiYgZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRNb2RlKSB7CisgICAgaWYgKEluZm8uaXNDUGx1c1BsdXNPcGVyYXRvcktleXdvcmQoKSAmJiBnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQpIHsKICAgICAgIE1hY3JvTmFtZVRvay5zZXRJZGVudGlmaWVySW5mbyhnZXRJZGVudGlmaWVySW5mbyhTcGVsbGluZykpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQwNCwzNSArNDA1LDMzIEBACiAgICAgICB9IGVsc2UgaWYgKFN1YiA9PSAibGlmIikgeyAgLy8gImVsaWYiLgogICAgICAgICBQUENvbmRpdGlvbmFsSW5mbyAmQ29uZEluZm8gPSBDdXJQUExleGVyLT5wZWVrQ29uZGl0aW9uYWxMZXZlbCgpOwogCi0gICAgICAgIGJvb2wgU2hvdWxkRW50ZXI7Ci0gICAgICAgIGNvbnN0IFNvdXJjZUxvY2F0aW9uIENvbmRpdGlvbmFsQmVnaW4gPSBDdXJQUExleGVyLT5nZXRTb3VyY2VMb2NhdGlvbigpOworICAgICAgICAvLyBJZiB0aGlzIGlzIGEgI2VsaWYgd2l0aCBhICNlbHNlIGJlZm9yZSBpdCwgcmVwb3J0IHRoZSBlcnJvci4KKyAgICAgICAgaWYgKENvbmRJbmZvLkZvdW5kRWxzZSkgRGlhZyhUb2ssIGRpYWc6OnBwX2Vycl9lbGlmX2FmdGVyX2Vsc2UpOworCiAgICAgICAgIC8vIElmIHRoaXMgaXMgaW4gYSBza2lwcGluZyBibG9jayBvciBpZiB3ZSdyZSBhbHJlYWR5IGhhbmRsZWQgdGhpcyAjaWYKICAgICAgICAgLy8gYmxvY2ssIGRvbid0IGJvdGhlciBwYXJzaW5nIHRoZSBjb25kaXRpb24uCiAgICAgICAgIGlmIChDb25kSW5mby5XYXNTa2lwcGluZyB8fCBDb25kSW5mby5Gb3VuZE5vblNraXApIHsKICAgICAgICAgICBEaXNjYXJkVW50aWxFbmRPZkRpcmVjdGl2ZSgpOwotICAgICAgICAgIFNob3VsZEVudGVyID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29uc3QgU291cmNlTG9jYXRpb24gQ29uZEJlZ2luID0gQ3VyUFBMZXhlci0+Z2V0U291cmNlTG9jYXRpb24oKTsKICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSB2YWx1ZSBvZiBMZXhpbmdSYXdNb2RlIHNvIHRoYXQgaWRlbnRpZmllcnMgYXJlCiAgICAgICAgICAgLy8gbG9va2VkIHVwLCBldGMsIGluc2lkZSB0aGUgI2VsaWYgZXhwcmVzc2lvbi4KICAgICAgICAgICBhc3NlcnQoQ3VyUFBMZXhlci0+TGV4aW5nUmF3TW9kZSAmJiAiV2UgaGF2ZSB0byBiZSBza2lwcGluZyBoZXJlISIpOwogICAgICAgICAgIEN1clBQTGV4ZXItPkxleGluZ1Jhd01vZGUgPSBmYWxzZTsKICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqSWZORGVmTWFjcm8gPSAwOwotICAgICAgICAgIFNob3VsZEVudGVyID0gRXZhbHVhdGVEaXJlY3RpdmVFeHByZXNzaW9uKElmTkRlZk1hY3JvKTsKKyAgICAgICAgICBjb25zdCBib29sIENvbmRWYWx1ZSA9IEV2YWx1YXRlRGlyZWN0aXZlRXhwcmVzc2lvbihJZk5EZWZNYWNybyk7CiAgICAgICAgICAgQ3VyUFBMZXhlci0+TGV4aW5nUmF3TW9kZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgU291cmNlTG9jYXRpb24gQ29uZGl0aW9uYWxFbmQgPSBDdXJQUExleGVyLT5nZXRTb3VyY2VMb2NhdGlvbigpOwotCi0gICAgICAgIC8vIElmIHRoaXMgaXMgYSAjZWxpZiB3aXRoIGEgI2Vsc2UgYmVmb3JlIGl0LCByZXBvcnQgdGhlIGVycm9yLgotICAgICAgICBpZiAoQ29uZEluZm8uRm91bmRFbHNlKSBEaWFnKFRvaywgZGlhZzo6cHBfZXJyX2VsaWZfYWZ0ZXJfZWxzZSk7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBjb25kaXRpb24gaXMgdHJ1ZSwgZW50ZXIgaXQhCi0gICAgICAgIGlmIChTaG91bGRFbnRlcikgewotICAgICAgICAgIENvbmRJbmZvLkZvdW5kTm9uU2tpcCA9IHRydWU7Ci0gICAgICAgICAgaWYgKENhbGxiYWNrcykKKyAgICAgICAgICBpZiAoQ2FsbGJhY2tzKSB7CisgICAgICAgICAgICBjb25zdCBTb3VyY2VMb2NhdGlvbiBDb25kRW5kID0gQ3VyUFBMZXhlci0+Z2V0U291cmNlTG9jYXRpb24oKTsKICAgICAgICAgICAgIENhbGxiYWNrcy0+RWxpZihUb2suZ2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZShDb25kaXRpb25hbEJlZ2luLCBDb25kaXRpb25hbEVuZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdWxkRW50ZXIsIENvbmRJbmZvLklmTG9jKTsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZShDb25kQmVnaW4sIENvbmRFbmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb25kVmFsdWUgPyBQUENhbGxiYWNrczo6Q1ZLX1RydWUgOiBQUENhbGxiYWNrczo6Q1ZLX0ZhbHNlKSwgQ29uZEluZm8uSWZMb2MpOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBJZiB0aGlzIGNvbmRpdGlvbiBpcyB0cnVlLCBlbnRlciBpdCEKKyAgICAgICAgICBpZiAoQ29uZFZhbHVlKSB7CisgICAgICAgICAgICBDb25kSW5mby5Gb3VuZE5vblNraXAgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNTQwLDcgKzUzOSw4IEBACiAgICAgcmV0dXJuIEhlYWRlckluZm8uZ2V0TW9kdWxlTWFwKCkuU291cmNlTW9kdWxlOyAvLyBDb21waWxpbmcgYSBzb3VyY2UuCiAgIH0KICAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgbW9kdWxlIG9mIHRoZSBpbmNsdWRlIGRpcmVjdGl2ZS4KLSAgRmlsZUlEIElET2ZJbmNsID0gU291cmNlTWdyLmdldEZpbGVJRChGaWxlbmFtZUxvYyk7CisgIC8vIEZJWE1FOiBMb29rIGludG8gZGlyZWN0bHkgcGFzc2luZyB0aGUgRmlsZUVudHJ5IGZyb20gTG9va3VwRmlsZSBpbnN0ZWFkLgorICBGaWxlSUQgSURPZkluY2wgPSBTb3VyY2VNZ3IuZ2V0RmlsZUlEKFNvdXJjZU1nci5nZXRFeHBhbnNpb25Mb2MoRmlsZW5hbWVMb2MpKTsKICAgaWYgKGNvbnN0IEZpbGVFbnRyeSAqRW50cnlPZkluY2wgPSBTb3VyY2VNZ3IuZ2V0RmlsZUVudHJ5Rm9ySUQoSURPZkluY2wpKSB7CiAgICAgLy8gVGhlIGluY2x1ZGUgY29tZXMgZnJvbSBhIGZpbGUuCiAgICAgcmV0dXJuIE1vZE1hcC5maW5kTW9kdWxlRm9ySGVhZGVyKEVudHJ5T2ZJbmNsKS5nZXRNb2R1bGUoKTsKQEAgLTU1MSw2OSArNTUxLDYgQEAKICAgfQogfQogCi1ib29sIFByZXByb2Nlc3Nvcjo6dmlvbGF0ZXNQcml2YXRlSW5jbHVkZSgKLSAgICBNb2R1bGUgKlJlcXVlc3RpbmdNb2R1bGUsCi0gICAgY29uc3QgRmlsZUVudHJ5ICpJbmNGaWxlRW50LAotICAgIE1vZHVsZU1hcDo6TW9kdWxlSGVhZGVyUm9sZSBSb2xlLAotICAgIE1vZHVsZSAqUmVxdWVzdGVkTW9kdWxlKSB7Ci0gICNpZm5kZWYgTkRFQlVHCi0gIC8vIENoZWNrIGZvciBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSBtb2R1bGUgaGVhZGVyIHJvbGUKLSAgLy8gYXMgb2J0YWluZWQgZnJvbSB0aGUgbG9va3VwIGFuZCBhcyBvYnRhaW5lZCBmcm9tIHRoZSBtb2R1bGUuCi0gIC8vIFRoaXMgY2hlY2sgaXMgbm90IGNoZWFwLCBzbyBlbmFibGUgaXQgb25seSBmb3IgZGVidWdnaW5nLgotICBTbWFsbFZlY3RvckltcGw8Y29uc3QgRmlsZUVudHJ5ICo+ICZQdnRIZHJzCi0gICAgICA9IFJlcXVlc3RlZE1vZHVsZS0+UHJpdmF0ZUhlYWRlcnM7Ci0gIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBGaWxlRW50cnkgKj46Oml0ZXJhdG9yIExvb2sKLSAgICAgID0gc3RkOjpmaW5kKFB2dEhkcnMuYmVnaW4oKSwgUHZ0SGRycy5lbmQoKSwgSW5jRmlsZUVudCk7Ci0gIGJvb2wgSXNQcml2YXRlID0gTG9vayAhPSBQdnRIZHJzLmVuZCgpOwotICBhc3NlcnQoKElzUHJpdmF0ZSAmJiBSb2xlID09IE1vZHVsZU1hcDo6UHJpdmF0ZUhlYWRlcikKLSAgICAgICAgICAgICAgIHx8ICghSXNQcml2YXRlICYmIFJvbGUgIT0gTW9kdWxlTWFwOjpQcml2YXRlSGVhZGVyKSk7Ci0gICNlbmRpZgotICByZXR1cm4gUm9sZSA9PSBNb2R1bGVNYXA6OlByaXZhdGVIZWFkZXIgJiYKLSAgICAgICAgIFJlcXVlc3RlZE1vZHVsZS0+Z2V0VG9wTGV2ZWxNb2R1bGUoKSAhPSBSZXF1ZXN0aW5nTW9kdWxlOwotfQotCi1ib29sIFByZXByb2Nlc3Nvcjo6dmlvbGF0ZXNVc2VEZWNsYXJhdGlvbnMoCi0gICAgTW9kdWxlICpSZXF1ZXN0aW5nTW9kdWxlLAotICAgIE1vZHVsZSAqUmVxdWVzdGVkTW9kdWxlKSB7Ci0gIE1vZHVsZU1hcCAmTW9kTWFwID0gSGVhZGVySW5mby5nZXRNb2R1bGVNYXAoKTsKLSAgTW9kTWFwLnJlc29sdmVVc2VzKFJlcXVlc3RpbmdNb2R1bGUsIC8qQ29tcGxhaW49Ki9mYWxzZSk7Ci0gIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNb2R1bGUgKj4gJkFsbG93ZWRVc2VzID0gUmVxdWVzdGluZ01vZHVsZS0+RGlyZWN0VXNlczsKLSAgU21hbGxWZWN0b3JJbXBsPE1vZHVsZSAqPjo6Y29uc3RfaXRlcmF0b3IgRGVjbGFyZWQgPQotICAgICAgc3RkOjpmaW5kKEFsbG93ZWRVc2VzLmJlZ2luKCksIEFsbG93ZWRVc2VzLmVuZCgpLCBSZXF1ZXN0ZWRNb2R1bGUpOwotICByZXR1cm4gRGVjbGFyZWQgPT0gQWxsb3dlZFVzZXMuZW5kKCk7Ci19Ci0KLXZvaWQgUHJlcHJvY2Vzc29yOjp2ZXJpZnlNb2R1bGVJbmNsdWRlKFNvdXJjZUxvY2F0aW9uIEZpbGVuYW1lTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZUVudHJ5ICpJbmNGaWxlRW50KSB7Ci0gIE1vZHVsZSAqUmVxdWVzdGluZ01vZHVsZSA9IGdldE1vZHVsZUZvckxvY2F0aW9uKEZpbGVuYW1lTG9jKTsKLSAgaWYgKFJlcXVlc3RpbmdNb2R1bGUpCi0gICAgSGVhZGVySW5mby5nZXRNb2R1bGVNYXAoKS5yZXNvbHZlVXNlcyhSZXF1ZXN0aW5nTW9kdWxlLCAvKkNvbXBsYWluPSovZmFsc2UpOwotICBNb2R1bGVNYXA6Oktub3duSGVhZGVyIFJlcXVlc3RlZE1vZHVsZSA9Ci0gICAgICBIZWFkZXJJbmZvLmdldE1vZHVsZU1hcCgpLmZpbmRNb2R1bGVGb3JIZWFkZXIoSW5jRmlsZUVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0aW5nTW9kdWxlKTsKLQotICBpZiAoUmVxdWVzdGluZ01vZHVsZSA9PSBSZXF1ZXN0ZWRNb2R1bGUuZ2V0TW9kdWxlKCkpCi0gICAgcmV0dXJuOyAvLyBObyBmYXVsdHMgd2loaW4gYSBtb2R1bGUsIG9yIGJldHdlZW4gZmlsZXMgYm90aCBub3QgaW4gbW9kdWxlcy4KLQotICBpZiAoUmVxdWVzdGluZ01vZHVsZSAhPSBIZWFkZXJJbmZvLmdldE1vZHVsZU1hcCgpLlNvdXJjZU1vZHVsZSkKLSAgICByZXR1cm47IC8vIE5vIGVycm9ycyBmb3IgaW5kaXJlY3QgbW9kdWxlcy4KLSAgICAgICAgICAgIC8vIFRoaXMgbWF5IGJlIGEgYml0IG9mIGEgcHJvYmxlbSBmb3IgbW9kdWxlcyB3aXRoIG5vIHNvdXJjZSBmaWxlcy4KLQotICBpZiAoUmVxdWVzdGVkTW9kdWxlICYmIHZpb2xhdGVzUHJpdmF0ZUluY2x1ZGUoUmVxdWVzdGluZ01vZHVsZSwgSW5jRmlsZUVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZE1vZHVsZS5nZXRSb2xlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRNb2R1bGUuZ2V0TW9kdWxlKCkpKQotICAgIERpYWcoRmlsZW5hbWVMb2MsIGRpYWc6OmVycm9yX3VzZV9vZl9wcml2YXRlX2hlYWRlcl9vdXRzaWRlX21vZHVsZSkKLSAgICAgICAgPDwgRmlsZW5hbWU7Ci0KLSAgLy8gRklYTUU6IEFkZCBzdXBwb3J0IGZvciBGaXhJdHMgaW4gbW9kdWxlIG1hcCBmaWxlcyBhbmQgb2ZmZXIgYWRkaW5nIHRoZQotICAvLyByZXF1aXJlZCB1c2UgZGVjbGFyYXRpb24uCi0gIGlmIChSZXF1ZXN0aW5nTW9kdWxlICYmIGdldExhbmdPcHRzKCkuTW9kdWxlc0RlY2xVc2UgJiYKLSAgICAgIHZpb2xhdGVzVXNlRGVjbGFyYXRpb25zKFJlcXVlc3RpbmdNb2R1bGUsIFJlcXVlc3RlZE1vZHVsZS5nZXRNb2R1bGUoKSkpCi0gICAgRGlhZyhGaWxlbmFtZUxvYywgZGlhZzo6ZXJyb3JfdW5kZWNsYXJlZF91c2Vfb2ZfbW9kdWxlKQotICAgICAgICA8PCBGaWxlbmFtZTsKLX0KLQogY29uc3QgRmlsZUVudHJ5ICpQcmVwcm9jZXNzb3I6Okxvb2t1cEZpbGUoCiAgICAgU291cmNlTG9jYXRpb24gRmlsZW5hbWVMb2MsCiAgICAgU3RyaW5nUmVmIEZpbGVuYW1lLApAQCAtNjI0LDEyICs1NjEsMTIgQEAKICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gKlJlbGF0aXZlUGF0aCwKICAgICBNb2R1bGVNYXA6Oktub3duSGVhZGVyICpTdWdnZXN0ZWRNb2R1bGUsCiAgICAgYm9vbCBTa2lwQ2FjaGUpIHsKLSAgLy8gSWYgdGhlIGhlYWRlciBsb29rdXAgbWVjaGFuaXNtIG1heSBiZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBmaWxlLCBwYXNzIGluCi0gIC8vIGluZm8gYWJvdXQgd2hlcmUgdGhlIGN1cnJlbnQgZmlsZSBpcy4KLSAgY29uc3QgRmlsZUVudHJ5ICpDdXJGaWxlRW50ID0gMDsKKyAgLy8gSWYgdGhlIGhlYWRlciBsb29rdXAgbWVjaGFuaXNtIG1heSBiZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBpbmNsdXNpb24KKyAgLy8gc3RhY2ssIHJlY29yZCB0aGUgcGFyZW50ICNpbmNsdWRlcy4KKyAgU21hbGxWZWN0b3I8Y29uc3QgRmlsZUVudHJ5ICosIDE2PiBJbmNsdWRlcnM7CiAgIGlmICghRnJvbURpcikgewogICAgIEZpbGVJRCBGSUQgPSBnZXRDdXJyZW50RmlsZUxleGVyKCktPmdldEZpbGVJRCgpOwotICAgIEN1ckZpbGVFbnQgPSBTb3VyY2VNZ3IuZ2V0RmlsZUVudHJ5Rm9ySUQoRklEKTsKKyAgICBjb25zdCBGaWxlRW50cnkgKkZpbGVFbnQgPSBTb3VyY2VNZ3IuZ2V0RmlsZUVudHJ5Rm9ySUQoRklEKTsKIAogICAgIC8vIElmIHRoZXJlIGlzIG5vIGZpbGUgZW50cnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZSwgaXQgbXVzdCBiZSB0aGUKICAgICAvLyBwcmVkZWZpbmVzIGJ1ZmZlci4gIEFueSBvdGhlciBmaWxlIGlzIG5vdCBsZXhlZCB3aXRoIGEgbm9ybWFsIGxleGVyLCBzbwpAQCAtNjM3LDIzICs1NzQsMzkgQEAKICAgICAvLyBwcmVkZWZpbmVzIGJ1ZmZlciwgcmVzb2x2ZSAjaW5jbHVkZSByZWZlcmVuY2VzICh3aGljaCBjb21lIGZyb20gdGhlCiAgICAgLy8gLWluY2x1ZGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50KSBhcyBpZiB0aGV5IGNhbWUgZnJvbSB0aGUgbWFpbiBmaWxlLCB0aGlzCiAgICAgLy8gYWZmZWN0cyBmaWxlIGxvb2t1cCBldGMuCi0gICAgaWYgKEN1ckZpbGVFbnQgPT0gMCkgewotICAgICAgRklEID0gU291cmNlTWdyLmdldE1haW5GaWxlSUQoKTsKLSAgICAgIEN1ckZpbGVFbnQgPSBTb3VyY2VNZ3IuZ2V0RmlsZUVudHJ5Rm9ySUQoRklEKTsKKyAgICBpZiAoIUZpbGVFbnQpCisgICAgICBGaWxlRW50ID0gU291cmNlTWdyLmdldEZpbGVFbnRyeUZvcklEKFNvdXJjZU1nci5nZXRNYWluRmlsZUlEKCkpOworCisgICAgaWYgKEZpbGVFbnQpCisgICAgICBJbmNsdWRlcnMucHVzaF9iYWNrKEZpbGVFbnQpOworCisgICAgLy8gTVNWQyBzZWFyY2hlcyB0aGUgY3VycmVudCBpbmNsdWRlIHN0YWNrIGZyb20gdG9wIHRvIGJvdHRvbSBmb3IKKyAgICAvLyBoZWFkZXJzIGluY2x1ZGVkIGJ5IHF1b3RlZCBpbmNsdWRlIGRpcmVjdGl2ZXMuCisgICAgLy8gU2VlOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvMzZrMmNkZDQuYXNweAorICAgIGlmIChMYW5nT3B0cy5NU1ZDQ29tcGF0ICYmICFpc0FuZ2xlZCkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEluY2x1ZGVNYWNyb1N0YWNrLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgSW5jbHVkZVN0YWNrSW5mbyAmSVNFbnRyeSA9IEluY2x1ZGVNYWNyb1N0YWNrW2UgLSBpIC0gMV07CisgICAgICAgIGlmIChJc0ZpbGVMZXhlcihJU0VudHJ5KSkKKyAgICAgICAgICBpZiAoKEZpbGVFbnQgPSBTb3VyY2VNZ3IuZ2V0RmlsZUVudHJ5Rm9ySUQoCisgICAgICAgICAgICAgICAgICAgSVNFbnRyeS5UaGVQUExleGVyLT5nZXRGaWxlSUQoKSkpKQorICAgICAgICAgICAgSW5jbHVkZXJzLnB1c2hfYmFjayhGaWxlRW50KTsKKyAgICAgIH0KICAgICB9CiAgIH0KIAogICAvLyBEbyBhIHN0YW5kYXJkIGZpbGUgZW50cnkgbG9va3VwLgogICBDdXJEaXIgPSBDdXJEaXJMb29rdXA7CiAgIGNvbnN0IEZpbGVFbnRyeSAqRkUgPSBIZWFkZXJJbmZvLkxvb2t1cEZpbGUoCi0gICAgICBGaWxlbmFtZSwgaXNBbmdsZWQsIEZyb21EaXIsIEN1ckRpciwgQ3VyRmlsZUVudCwKLSAgICAgIFNlYXJjaFBhdGgsIFJlbGF0aXZlUGF0aCwgU3VnZ2VzdGVkTW9kdWxlLCBTa2lwQ2FjaGUpOworICAgICAgRmlsZW5hbWUsIEZpbGVuYW1lTG9jLCBpc0FuZ2xlZCwgRnJvbURpciwgQ3VyRGlyLCBJbmNsdWRlcnMsIFNlYXJjaFBhdGgsCisgICAgICBSZWxhdGl2ZVBhdGgsIFN1Z2dlc3RlZE1vZHVsZSwgU2tpcENhY2hlKTsKICAgaWYgKEZFKSB7Ci0gICAgaWYgKFN1Z2dlc3RlZE1vZHVsZSkKLSAgICAgIHZlcmlmeU1vZHVsZUluY2x1ZGUoRmlsZW5hbWVMb2MsIEZpbGVuYW1lLCBGRSk7CisgICAgaWYgKFN1Z2dlc3RlZE1vZHVsZSAmJiAhTGFuZ09wdHMuQXNtUHJlcHJvY2Vzc29yKQorICAgICAgSGVhZGVySW5mby5nZXRNb2R1bGVNYXAoKS5kaWFnbm9zZUhlYWRlckluY2x1c2lvbigKKyAgICAgICAgICBnZXRNb2R1bGVGb3JMb2NhdGlvbihGaWxlbmFtZUxvYyksIEZpbGVuYW1lTG9jLCBGaWxlbmFtZSwgRkUpOwogICAgIHJldHVybiBGRTsKICAgfQogCisgIGNvbnN0IEZpbGVFbnRyeSAqQ3VyRmlsZUVudDsKICAgLy8gT3RoZXJ3aXNlLCBzZWUgaWYgdGhpcyBpcyBhIHN1YmZyYW1ld29yayBoZWFkZXIuICBJZiBzbywgdGhpcyBpcyByZWxhdGl2ZQogICAvLyB0byBvbmUgb2YgdGhlIGhlYWRlcnMgb24gdGhlICNpbmNsdWRlIHN0YWNrLiAgV2FsayB0aGUgbGlzdCBvZiB0aGUgY3VycmVudAogICAvLyBoZWFkZXJzIG9uIHRoZSAjaW5jbHVkZSBzdGFjayBhbmQgcGFzcyB0aGVtIHRvIEhlYWRlckluZm8uCkBAIC0xMzI3LDIxICsxMjgwLDIwIEBACiAgIHJldHVybiBpc0FuZ2xlZDsKIH0KIAotLy8vIFxicmllZiBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIFwjaW5jbHVkZSBuYW1lIGlzIGV4cGFuZGVkIGZyb20gYSBtYWNybwotLy8vIGFzIG11bHRpcGxlIHRva2Vucywgd2hpY2ggbmVlZCB0byBiZSBnbHVlZCB0b2dldGhlci4KLS8vLwotLy8vIFRoaXMgb2NjdXJzIGZvciBjb2RlIGxpa2U6Ci0vLy8gXGNvZGUKLS8vLyAgICBcI2RlZmluZSBGT08gPGEvYi5oPgotLy8vICAgIFwjaW5jbHVkZSBGT08KLS8vLyBcZW5kY29kZQotLy8vIGJlY2F1c2UgaW4gdGhpcyBjYXNlLCAiPGEvYi5oPiIgaXMgcmV0dXJuZWQgYXMgNyB0b2tlbnMsIG5vdCBvbmUuCi0vLy8KLS8vLyBUaGlzIGNvZGUgY29uY2F0ZW5hdGVzIGFuZCBjb25zdW1lcyB0b2tlbnMgdXAgdG8gdGhlICc+JyB0b2tlbi4gIEl0IHJldHVybnMKLS8vLyBmYWxzZSBpZiB0aGUgPiB3YXMgZm91bmQsIG90aGVyd2lzZSBpdCByZXR1cm5zIHRydWUgaWYgaXQgZmluZHMgYW5kIGNvbnN1bWVzCi0vLy8gdGhlIEVPRCBtYXJrZXIuCi1ib29sIFByZXByb2Nlc3Nvcjo6Q29uY2F0ZW5hdGVJbmNsdWRlTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFN0cmluZzwxMjg+ICZGaWxlbmFtZUJ1ZmZlciwKKy8vIFxicmllZiBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIFwjaW5jbHVkZSBuYW1lIGlzIGV4cGFuZGVkIGZyb20gYSBtYWNybworLy8gYXMgbXVsdGlwbGUgdG9rZW5zLCB3aGljaCBuZWVkIHRvIGJlIGdsdWVkIHRvZ2V0aGVyLgorLy8KKy8vIFRoaXMgb2NjdXJzIGZvciBjb2RlIGxpa2U6CisvLyBcY29kZQorLy8gICAgXCNkZWZpbmUgRk9PIDxhL2IuaD4KKy8vICAgIFwjaW5jbHVkZSBGT08KKy8vIFxlbmRjb2RlCisvLyBiZWNhdXNlIGluIHRoaXMgY2FzZSwgIjxhL2IuaD4iIGlzIHJldHVybmVkIGFzIDcgdG9rZW5zLCBub3Qgb25lLgorLy8KKy8vIFRoaXMgY29kZSBjb25jYXRlbmF0ZXMgYW5kIGNvbnN1bWVzIHRva2VucyB1cCB0byB0aGUgJz4nIHRva2VuLiAgSXQgcmV0dXJucworLy8gZmFsc2UgaWYgdGhlID4gd2FzIGZvdW5kLCBvdGhlcndpc2UgaXQgcmV0dXJucyB0cnVlIGlmIGl0IGZpbmRzIGFuZCBjb25zdW1lcworLy8gdGhlIEVPRCBtYXJrZXIuCitib29sIFByZXByb2Nlc3Nvcjo6Q29uY2F0ZW5hdGVJbmNsdWRlTmFtZShTbWFsbFN0cmluZzwxMjg+ICZGaWxlbmFtZUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICZFbmQpIHsKICAgVG9rZW4gQ3VyVG9rOwogCkBAIC0xMzg5LDYgKzEzNDEsMTkgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vLyBcYnJpZWYgUHVzaCBhIHRva2VuIG9udG8gdGhlIHRva2VuIHN0cmVhbSBjb250YWluaW5nIGFuIGFubm90YXRpb24uCitzdGF0aWMgdm9pZCBFbnRlckFubm90YXRpb25Ub2tlbihQcmVwcm9jZXNzb3IgJlBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQmVnaW4sIFNvdXJjZUxvY2F0aW9uIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazo6VG9rZW5LaW5kIEtpbmQsIHZvaWQgKkFubm90YXRpb25WYWwpIHsKKyAgVG9rZW4gKlRvayA9IG5ldyBUb2tlblsxXTsKKyAgVG9rWzBdLnN0YXJ0VG9rZW4oKTsKKyAgVG9rWzBdLnNldEtpbmQoS2luZCk7CisgIFRva1swXS5zZXRMb2NhdGlvbihCZWdpbik7CisgIFRva1swXS5zZXRBbm5vdGF0aW9uRW5kTG9jKEVuZCk7CisgIFRva1swXS5zZXRBbm5vdGF0aW9uVmFsdWUoQW5ub3RhdGlvblZhbCk7CisgIFBQLkVudGVyVG9rZW5TdHJlYW0oVG9rLCAxLCB0cnVlLCB0cnVlKTsKK30KKwogLy8vIEhhbmRsZUluY2x1ZGVEaXJlY3RpdmUgLSBUaGUgIlwjaW5jbHVkZSIgdG9rZW5zIGhhdmUganVzdCBiZWVuIHJlYWQsIHJlYWQKIC8vLyB0aGUgZmlsZSB0byBiZSBpbmNsdWRlZCBmcm9tIHRoZSBsZXhlciwgdGhlbiBpbmNsdWRlIGl0ISAgVGhpcyBpcyBhIGNvbW1vbgogLy8vIHJvdXRpbmUgd2l0aCBmdW5jdGlvbmFsaXR5IHNoYXJlZCBiZXR3ZWVuIFwjaW5jbHVkZSwgXCNpbmNsdWRlX25leHQgYW5kCkBAIC0xNDg1LDkgKzE0NTAsMTUgQEAKICAgLy8gdGhlIHBhdGguCiAgIE1vZHVsZU1hcDo6S25vd25IZWFkZXIgU3VnZ2VzdGVkTW9kdWxlOwogICBTb3VyY2VMb2NhdGlvbiBGaWxlbmFtZUxvYyA9IEZpbGVuYW1lVG9rLmdldExvY2F0aW9uKCk7CisgIFNtYWxsU3RyaW5nPDEyOD4gTm9ybWFsaXplZFBhdGg7CisgIGlmIChMYW5nT3B0cy5NU1ZDQ29tcGF0KSB7CisgICAgTm9ybWFsaXplZFBhdGggPSBGaWxlbmFtZS5zdHIoKTsKKyAgICBsbHZtOjpzeXM6OmZzOjpub3JtYWxpemVfc2VwYXJhdG9ycyhOb3JtYWxpemVkUGF0aCk7CisgIH0KICAgY29uc3QgRmlsZUVudHJ5ICpGaWxlID0gTG9va3VwRmlsZSgKLSAgICAgIEZpbGVuYW1lTG9jLCBGaWxlbmFtZSwgaXNBbmdsZWQsIExvb2t1cEZyb20sIEN1ckRpciwKLSAgICAgIENhbGxiYWNrcyA/ICZTZWFyY2hQYXRoIDogTlVMTCwgQ2FsbGJhY2tzID8gJlJlbGF0aXZlUGF0aCA6IE5VTEwsCisgICAgICBGaWxlbmFtZUxvYywgTGFuZ09wdHMuTVNWQ0NvbXBhdCA/IE5vcm1hbGl6ZWRQYXRoLmNfc3RyKCkgOiBGaWxlbmFtZSwKKyAgICAgIGlzQW5nbGVkLCBMb29rdXBGcm9tLCBDdXJEaXIsIENhbGxiYWNrcyA/ICZTZWFyY2hQYXRoIDogTlVMTCwKKyAgICAgIENhbGxiYWNrcyA/ICZSZWxhdGl2ZVBhdGggOiBOVUxMLAogICAgICAgSGVhZGVySW5mby5nZXRIZWFkZXJTZWFyY2hPcHRzKCkuTW9kdWxlTWFwcyA/ICZTdWdnZXN0ZWRNb2R1bGUgOiAwKTsKIAogICBpZiAoQ2FsbGJhY2tzKSB7CkBAIC0xNTAxLDggKzE0NzIsMTEgQEAKICAgICAgICAgICBIZWFkZXJJbmZvLkFkZFNlYXJjaFBhdGgoREwsIGlzQW5nbGVkKTsKICAgICAgICAgICAKICAgICAgICAgICAvLyBUcnkgdGhlIGxvb2t1cCBhZ2Fpbiwgc2tpcHBpbmcgdGhlIGNhY2hlLgotICAgICAgICAgIEZpbGUgPSBMb29rdXBGaWxlKEZpbGVuYW1lTG9jLCBGaWxlbmFtZSwgaXNBbmdsZWQsIExvb2t1cEZyb20sIEN1ckRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBIZWFkZXJJbmZvLmdldEhlYWRlclNlYXJjaE9wdHMoKS5Nb2R1bGVNYXBzCisgICAgICAgICAgRmlsZSA9IExvb2t1cEZpbGUoRmlsZW5hbWVMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFuZ09wdHMuTVNWQ0NvbXBhdCA/IE5vcm1hbGl6ZWRQYXRoLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmdsZWQsIExvb2t1cEZyb20sIEN1ckRpciwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXJJbmZvLmdldEhlYWRlclNlYXJjaE9wdHMoKS5Nb2R1bGVNYXBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJlN1Z2dlc3RlZE1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypTa2lwQ2FjaGUqLyB0cnVlKTsKQEAgLTE1MTIsMTAgKzE0ODYsMTEgQEAKICAgICAKICAgICBpZiAoIVN1Z2dlc3RlZE1vZHVsZSB8fCAhZ2V0TGFuZ09wdHMoKS5Nb2R1bGVzKSB7CiAgICAgICAvLyBOb3RpZnkgdGhlIGNhbGxiYWNrIG9iamVjdCB0aGF0IHdlJ3ZlIHNlZW4gYW4gaW5jbHVzaW9uIGRpcmVjdGl2ZS4KLSAgICAgIENhbGxiYWNrcy0+SW5jbHVzaW9uRGlyZWN0aXZlKEhhc2hMb2MsIEluY2x1ZGVUb2ssIEZpbGVuYW1lLCBpc0FuZ2xlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lUmFuZ2UsIEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hQYXRoLCBSZWxhdGl2ZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkltcG9ydGVkTW9kdWxlPSovMCk7CisgICAgICBDYWxsYmFja3MtPkluY2x1c2lvbkRpcmVjdGl2ZShIYXNoTG9jLCBJbmNsdWRlVG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFuZ09wdHMuTVNWQ0NvbXBhdCA/IE5vcm1hbGl6ZWRQYXRoLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5nbGVkLCBGaWxlbmFtZVJhbmdlLCBGaWxlLCBTZWFyY2hQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpdmVQYXRoLCAvKkltcG9ydGVkTW9kdWxlPSovMCk7CiAgICAgfQogICB9CiAgIApAQCAtMTUyNiw4ICsxNTAxLDkgQEAKICAgICAgIC8vIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCBhIHBvc3NpYmxlIGZpeGl0LgogICAgICAgaWYgKGlzQW5nbGVkKSB7CiAgICAgICAgIEZpbGUgPSBMb29rdXBGaWxlKAotICAgICAgICAgICAgRmlsZW5hbWVMb2MsIEZpbGVuYW1lLCBmYWxzZSwgTG9va3VwRnJvbSwgQ3VyRGlyLAotICAgICAgICAgICAgQ2FsbGJhY2tzID8gJlNlYXJjaFBhdGggOiAwLCBDYWxsYmFja3MgPyAmUmVsYXRpdmVQYXRoIDogMCwKKyAgICAgICAgICAgIEZpbGVuYW1lTG9jLCBMYW5nT3B0cy5NU1ZDQ29tcGF0ID8gTm9ybWFsaXplZFBhdGguY19zdHIoKSA6IEZpbGVuYW1lLAorICAgICAgICAgICAgZmFsc2UsIExvb2t1cEZyb20sIEN1ckRpciwgQ2FsbGJhY2tzID8gJlNlYXJjaFBhdGggOiAwLAorICAgICAgICAgICAgQ2FsbGJhY2tzID8gJlJlbGF0aXZlUGF0aCA6IDAsCiAgICAgICAgICAgICBIZWFkZXJJbmZvLmdldEhlYWRlclNlYXJjaE9wdHMoKS5Nb2R1bGVNYXBzID8gJlN1Z2dlc3RlZE1vZHVsZSA6IDApOwogICAgICAgICBpZiAoRmlsZSkgewogICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlKEZpbGVuYW1lVG9rLmdldExvY2F0aW9uKCksIENoYXJFbmQpOwpAQCAtMTU5MCw3ICsxNTY2LDcgQEAKICAgICAvLyBpbmNsdWRlIGRpcmVjdGl2ZSBtYXBzIHRvLgogICAgIGJvb2wgQnVpbGRpbmdJbXBvcnRlZE1vZHVsZQogICAgICAgPSBQYXRoWzBdLmZpcnN0LT5nZXROYW1lKCkgPT0gZ2V0TGFuZ09wdHMoKS5DdXJyZW50TW9kdWxlOwotICAgIAorCiAgICAgaWYgKCFCdWlsZGluZ0ltcG9ydGVkTW9kdWxlICYmIGdldExhbmdPcHRzKCkuT2JqQzIpIHsKICAgICAgIC8vIElmIHdlJ3JlIG5vdCBidWlsZGluZyB0aGUgaW1wb3J0ZWQgbW9kdWxlLCB3YXJuIHRoYXQgd2UncmUgZ29pbmcKICAgICAgIC8vIHRvIGF1dG9tYXRpY2FsbHkgdHVybiB0aGlzIGluY2x1c2lvbiBkaXJlY3RpdmUgaW50byBhIG1vZHVsZSBpbXBvcnQuCkBAIC0xNjM5LDEzICsxNjE1LDggQEAKICAgICAgICAgLy8gbWFrZSB0aGUgbW9kdWxlIHZpc2libGUuCiAgICAgICAgIC8vIEZJWE1FOiBQcm9kdWNlIHRoaXMgYXMgdGhlIGN1cnJlbnQgdG9rZW4gZGlyZWN0bHksIHJhdGhlciB0aGFuCiAgICAgICAgIC8vIGFsbG9jYXRpbmcgYSBuZXcgdG9rZW4gZm9yIGl0LgotICAgICAgICBUb2tlbiAqVG9rID0gbmV3IFRva2VuWzFdOwotICAgICAgICBUb2tbMF0uc3RhcnRUb2tlbigpOwotICAgICAgICBUb2tbMF0uc2V0S2luZCh0b2s6OmFubm90X21vZHVsZV9pbmNsdWRlKTsKLSAgICAgICAgVG9rWzBdLnNldExvY2F0aW9uKEhhc2hMb2MpOwotICAgICAgICBUb2tbMF0uc2V0QW5ub3RhdGlvbkVuZExvYyhFbmQpOwotICAgICAgICBUb2tbMF0uc2V0QW5ub3RhdGlvblZhbHVlKEltcG9ydGVkKTsKLSAgICAgICAgRW50ZXJUb2tlblN0cmVhbShUb2ssIDEsIHRydWUsIHRydWUpOworICAgICAgICBFbnRlckFubm90YXRpb25Ub2tlbigqdGhpcywgSGFzaExvYywgRW5kLCB0b2s6OmFubm90X21vZHVsZV9pbmNsdWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRlZCk7CiAgICAgICB9CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTY5Miw4ICsxNjYzLDI3IEBACiAgIEZpbGVJRCBGSUQgPSBTb3VyY2VNZ3IuY3JlYXRlRmlsZUlEKEZpbGUsIEluY2x1ZGVQb3MsIEZpbGVDaGFyYWN0ZXIpOwogICBhc3NlcnQoIUZJRC5pc0ludmFsaWQoKSAmJiAiRXhwZWN0ZWQgdmFsaWQgZmlsZSBJRCIpOwogCi0gIC8vIEZpbmFsbHksIGlmIGFsbCBpcyBnb29kLCBlbnRlciB0aGUgbmV3IGZpbGUhCi0gIEVudGVyU291cmNlRmlsZShGSUQsIEN1ckRpciwgRmlsZW5hbWVUb2suZ2V0TG9jYXRpb24oKSk7CisgIC8vIERldGVybWluZSBpZiB3ZSdyZSBzd2l0Y2hpbmcgdG8gYnVpbGRpbmcgYSBuZXcgc3VibW9kdWxlLCBhbmQgd2hpY2ggb25lLgorICBNb2R1bGVNYXA6Oktub3duSGVhZGVyIEJ1aWxkaW5nTW9kdWxlOworICBpZiAoZ2V0TGFuZ09wdHMoKS5Nb2R1bGVzICYmICFnZXRMYW5nT3B0cygpLkN1cnJlbnRNb2R1bGUuZW1wdHkoKSkgeworICAgIE1vZHVsZSAqUmVxdWVzdGluZ01vZHVsZSA9IGdldE1vZHVsZUZvckxvY2F0aW9uKEZpbGVuYW1lTG9jKTsKKyAgICBCdWlsZGluZ01vZHVsZSA9CisgICAgICAgIEhlYWRlckluZm8uZ2V0TW9kdWxlTWFwKCkuZmluZE1vZHVsZUZvckhlYWRlcihGaWxlLCBSZXF1ZXN0aW5nTW9kdWxlKTsKKyAgfQorCisgIC8vIElmIGFsbCBpcyBnb29kLCBlbnRlciB0aGUgbmV3IGZpbGUhCisgIGlmIChFbnRlclNvdXJjZUZpbGUoRklELCBDdXJEaXIsIEZpbGVuYW1lVG9rLmdldExvY2F0aW9uKCkpKQorICAgIHJldHVybjsKKworICAvLyBJZiB3ZSdyZSB3YWxraW5nIGludG8gYW5vdGhlciBwYXJ0IG9mIHRoZSBzYW1lIG1vZHVsZSwgbGV0IHRoZSBwYXJzZXIKKyAgLy8ga25vdyB0aGF0IGFueSBmdXR1cmUgZGVjbGFyYXRpb25zIGFyZSB3aXRoaW4gdGhhdCBvdGhlciBzdWJtb2R1bGUuCisgIGlmIChCdWlsZGluZ01vZHVsZSkgeworICAgIGFzc2VydCghQ3VyU3VibW9kdWxlICYmICJzaG91bGQgbm90IGhhdmUgbWFya2VkIHRoaXMgYXMgYSBtb2R1bGUgeWV0Iik7CisgICAgQ3VyU3VibW9kdWxlID0gQnVpbGRpbmdNb2R1bGUuZ2V0TW9kdWxlKCk7CisKKyAgICBFbnRlckFubm90YXRpb25Ub2tlbigqdGhpcywgSGFzaExvYywgRW5kLCB0b2s6OmFubm90X21vZHVsZV9iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdXJTdWJtb2R1bGUpOworICB9CiB9CiAKIC8vLyBIYW5kbGVJbmNsdWRlTmV4dERpcmVjdGl2ZSAtIEltcGxlbWVudHMgXCNpbmNsdWRlX25leHQuCkBAIC0xNzM4LDcgKzE3MjgsNyBAQAogdm9pZCBQcmVwcm9jZXNzb3I6OkhhbmRsZUltcG9ydERpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBIYXNoTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmSW1wb3J0VG9rKSB7CiAgIGlmICghTGFuZ09wdHMuT2JqQzEpIHsgIC8vICNpbXBvcnQgaXMgc3RhbmRhcmQgZm9yIE9iakMuCi0gICAgaWYgKExhbmdPcHRzLk1pY3Jvc29mdE1vZGUpCisgICAgaWYgKExhbmdPcHRzLk1TVkNDb21wYXQpCiAgICAgICByZXR1cm4gSGFuZGxlTWljcm9zb2Z0SW1wb3J0RGlyZWN0aXZlKEltcG9ydFRvayk7CiAgICAgRGlhZyhJbXBvcnRUb2ssIGRpYWc6OmV4dF9wcF9pbXBvcnRfZGlyZWN0aXZlKTsKICAgfQpAQCAtMjI1OSw3ICsyMjQ5LDcgQEAKICAgaWYgKENhbGxiYWNrcykKICAgICBDYWxsYmFja3MtPklmKElmVG9rZW4uZ2V0TG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlKENvbmRpdGlvbmFsQmVnaW4sIENvbmRpdGlvbmFsRW5kKSwKLSAgICAgICAgICAgICAgICAgIENvbmRpdGlvbmFsVHJ1ZSk7CisgICAgICAgICAgICAgICAgICAoQ29uZGl0aW9uYWxUcnVlID8gUFBDYWxsYmFja3M6OkNWS19UcnVlIDogUFBDYWxsYmFja3M6OkNWS19GYWxzZSkpOwogCiAgIC8vIFNob3VsZCB3ZSBpbmNsdWRlIHRoZSBzdHVmZiBjb250YWluZWQgYnkgdGhpcyBkaXJlY3RpdmU/CiAgIGlmIChDb25kaXRpb25hbFRydWUpIHsKQEAgLTIzNTYsNyArMjM0Niw3IEBACiAgIGlmIChDYWxsYmFja3MpCiAgICAgQ2FsbGJhY2tzLT5FbGlmKEVsaWZUb2tlbi5nZXRMb2NhdGlvbigpLAogICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZShDb25kaXRpb25hbEJlZ2luLCBDb25kaXRpb25hbEVuZCksCi0gICAgICAgICAgICAgICAgICAgIHRydWUsIENJLklmTG9jKTsKKyAgICAgICAgICAgICAgICAgICAgUFBDYWxsYmFja3M6OkNWS19Ob3RFdmFsdWF0ZWQsIENJLklmTG9jKTsKIAogICAvLyBGaW5hbGx5LCBza2lwIHRoZSByZXN0IG9mIHRoZSBjb250ZW50cyBvZiB0aGlzIGJsb2NrLgogICBTa2lwRXhjbHVkZWRDb25kaXRpb25hbEJsb2NrKENJLklmTG9jLCAvKkZvdW5kbm9uc2tpcCovdHJ1ZSwKZGlmZiAtLWdpdCBhL2xpYi9MZXgvUFBFeHByZXNzaW9ucy5jcHAgYi9saWIvTGV4L1BQRXhwcmVzc2lvbnMuY3BwCmluZGV4IDg3YzBhNmEuLjY5NzVkMzEgMTAwNjQ0Ci0tLSBhL2xpYi9MZXgvUFBFeHByZXNzaW9ucy5jcHAKKysrIGIvbGliL0xleC9QUEV4cHJlc3Npb25zLmNwcApAQCAtMTMwLDggKzEzMCw5IEBACiAgICAgUFAuTGV4VW5leHBhbmRlZE5vbkNvbW1lbnQoUGVla1Rvayk7CiAKICAgICBpZiAoUGVla1Rvay5pc05vdCh0b2s6OnJfcGFyZW4pKSB7Ci0gICAgICBQUC5EaWFnKFBlZWtUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX3BwX21pc3NpbmdfcnBhcmVuKSA8PCAiZGVmaW5lZCI7Ci0gICAgICBQUC5EaWFnKExQYXJlbkxvYywgZGlhZzo6bm90ZV9tYXRjaGluZykgPDwgIigiOworICAgICAgUFAuRGlhZyhQZWVrVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9wcF9leHBlY3RlZF9hZnRlcikKKyAgICAgICAgICA8PCAiJ2RlZmluZWQnIiA8PCB0b2s6OnJfcGFyZW47CisgICAgICBQUC5EaWFnKExQYXJlbkxvYywgZGlhZzo6bm90ZV9tYXRjaGluZykgPDwgdG9rOjpsX3BhcmVuOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIC8vIENvbnN1bWUgdGhlICkuCkBAIC0yNTcsOSArMjU4LDEwIEBACiAgICAgICAvLyBsYXJnZSB0aGF0IGl0IGlzIHVuc2lnbmVkIiBlLmcuIG9uIDEyMzQ1Njc4OTAxMjM0NTY3ODkwIHdoZXJlIGludG1heF90CiAgICAgICAvLyBpcyA2NC1iaXRzLgogICAgICAgaWYgKCFMaXRlcmFsLmlzVW5zaWduZWQgJiYgUmVzdWx0LlZhbC5pc05lZ2F0aXZlKCkpIHsKLSAgICAgICAgLy8gRG9uJ3Qgd2FybiBmb3IgYSBoZXggb3Igb2N0YWwgbGl0ZXJhbDogMHg4MDAwLi4wIHNob3VsZG4ndCB3YXJuLgorICAgICAgICAvLyBPY3RhbCwgaGV4YWRlY2ltYWwsIGFuZCBiaW5hcnkgbGl0ZXJhbHMgYXJlIGltcGxpY2l0bHkgdW5zaWduZWQgaWYKKyAgICAgICAgLy8gdGhlIHZhbHVlIGRvZXMgbm90IGZpdCBpbnRvIGEgc2lnbmVkIGludGVnZXIgdHlwZS4KICAgICAgICAgaWYgKFZhbHVlTGl2ZSAmJiBMaXRlcmFsLmdldFJhZGl4KCkgPT0gMTApCi0gICAgICAgICAgUFAuRGlhZyhQZWVrVG9rLCBkaWFnOjp3YXJuX2ludGVnZXJfdG9vX2xhcmdlX2Zvcl9zaWduZWQpOworICAgICAgICAgIFBQLkRpYWcoUGVla1RvaywgZGlhZzo6ZXh0X2ludGVnZXJfdG9vX2xhcmdlX2Zvcl9zaWduZWQpOwogICAgICAgICBSZXN1bHQuVmFsLnNldElzVW5zaWduZWQodHJ1ZSk7CiAgICAgICB9CiAgICAgfQpAQCAtMzQyLDcgKzM0NCw3IEBACiAgICAgICBpZiAoUGVla1Rvay5pc05vdCh0b2s6OnJfcGFyZW4pKSB7CiAgICAgICAgIFBQLkRpYWcoUGVla1Rvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfcHBfZXhwZWN0ZWRfcnBhcmVuKQogICAgICAgICAgIDw8IFJlc3VsdC5nZXRSYW5nZSgpOwotICAgICAgICBQUC5EaWFnKFN0YXJ0LCBkaWFnOjpub3RlX21hdGNoaW5nKSA8PCAiKCI7CisgICAgICAgIFBQLkRpYWcoU3RhcnQsIGRpYWc6Om5vdGVfbWF0Y2hpbmcpIDw8IHRvazo6bF9wYXJlbjsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAgICAgICBEVC5TdGF0ZSA9IERlZmluZWRUcmFja2VyOjpVbmtub3duOwpAQCAtNjgwLDkgKzY4Miw5IEBACiAgICAgY2FzZSB0b2s6OnF1ZXN0aW9uOiB7CiAgICAgICAvLyBQYXJzZSB0aGUgOiBwYXJ0IG9mIHRoZSBleHByZXNzaW9uLgogICAgICAgaWYgKFBlZWtUb2suaXNOb3QodG9rOjpjb2xvbikpIHsKLSAgICAgICAgUFAuRGlhZyhQZWVrVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZF9jb2xvbikKLSAgICAgICAgICA8PCBMSFMuZ2V0UmFuZ2UoKSwgUkhTLmdldFJhbmdlKCk7Ci0gICAgICAgIFBQLkRpYWcoT3BMb2MsIGRpYWc6Om5vdGVfbWF0Y2hpbmcpIDw8ICI/IjsKKyAgICAgICAgUFAuRGlhZyhQZWVrVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZCkKKyAgICAgICAgICAgIDw8IHRvazo6Y29sb24gPDwgTEhTLmdldFJhbmdlKCkgPDwgUkhTLmdldFJhbmdlKCk7CisgICAgICAgIFBQLkRpYWcoT3BMb2MsIGRpYWc6Om5vdGVfbWF0Y2hpbmcpIDw8IHRvazo6cXVlc3Rpb247CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQogICAgICAgLy8gQ29uc3VtZSB0aGUgOi4KZGlmZiAtLWdpdCBhL2xpYi9MZXgvUFBMZXhlckNoYW5nZS5jcHAgYi9saWIvTGV4L1BQTGV4ZXJDaGFuZ2UuY3BwCmluZGV4IDFmOTcwYTQuLjk0OWNkNjMgMTAwNjQ0Ci0tLSBhL2xpYi9MZXgvUFBMZXhlckNoYW5nZS5jcHAKKysrIGIvbGliL0xleC9QUExleGVyQ2hhbmdlLmNwcApAQCAtNjgsNyArNjgsNyBAQAogCiAvLy8gRW50ZXJTb3VyY2VGaWxlIC0gQWRkIGEgc291cmNlIGZpbGUgdG8gdGhlIHRvcCBvZiB0aGUgaW5jbHVkZSBzdGFjayBhbmQKIC8vLyBzdGFydCBsZXhpbmcgdG9rZW5zIGZyb20gaXQgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBidWZmZXIuCi12b2lkIFByZXByb2Nlc3Nvcjo6RW50ZXJTb3VyY2VGaWxlKEZpbGVJRCBGSUQsIGNvbnN0IERpcmVjdG9yeUxvb2t1cCAqQ3VyRGlyLAorYm9vbCBQcmVwcm9jZXNzb3I6OkVudGVyU291cmNlRmlsZShGaWxlSUQgRklELCBjb25zdCBEaXJlY3RvcnlMb29rdXAgKkN1ckRpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKSB7CiAgIGFzc2VydCghQ3VyVG9rZW5MZXhlciAmJiAiQ2Fubm90ICNpbmNsdWRlIGEgZmlsZSBpbnNpZGUgYSBtYWNybyEiKTsKICAgKytOdW1FbnRlcmVkU291cmNlRmlsZXM7CkBAIC03OSw3ICs3OSw3IEBACiAgIGlmIChQVEgpIHsKICAgICBpZiAoUFRITGV4ZXIgKlBMID0gUFRILT5DcmVhdGVMZXhlcihGSUQpKSB7CiAgICAgICBFbnRlclNvdXJjZUZpbGVXaXRoUFRIKFBMLCBDdXJEaXIpOwotICAgICAgcmV0dXJuOworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfQogICAKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBTb3VyY2VMb2NhdGlvbiBGaWxlU3RhcnQgPSBTb3VyY2VNZ3IuZ2V0TG9jRm9yU3RhcnRPZkZpbGUoRklEKTsKICAgICBEaWFnKExvYywgZGlhZzo6ZXJyX3BwX2Vycm9yX29wZW5pbmdfZmlsZSkKICAgICAgIDw8IHN0ZDo6c3RyaW5nKFNvdXJjZU1nci5nZXRCdWZmZXJOYW1lKEZpbGVTdGFydCkpIDw8ICIiOwotICAgIHJldHVybjsKKyAgICByZXR1cm4gdHJ1ZTsKICAgfQogCiAgIGlmIChpc0NvZGVDb21wbGV0aW9uRW5hYmxlZCgpICYmCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgfQogCiAgIEVudGVyU291cmNlRmlsZVdpdGhMZXhlcihuZXcgTGV4ZXIoRklELCBJbnB1dEZpbGUsICp0aGlzKSwgQ3VyRGlyKTsKLSAgcmV0dXJuOworICByZXR1cm4gZmFsc2U7CiB9CiAKIC8vLyBFbnRlclNvdXJjZUZpbGVXaXRoTGV4ZXIgLSBBZGQgYSBzb3VyY2UgZmlsZSB0byB0aGUgdG9wIG9mIHRoZSBpbmNsdWRlIHN0YWNrCkBAIC0xMTcsNiArMTE3LDcgQEAKICAgQ3VyTGV4ZXIucmVzZXQoVGhlTGV4ZXIpOwogICBDdXJQUExleGVyID0gVGhlTGV4ZXI7CiAgIEN1ckRpckxvb2t1cCA9IEN1ckRpcjsKKyAgQ3VyU3VibW9kdWxlID0gMDsKICAgaWYgKEN1ckxleGVyS2luZCAhPSBDTEtfTGV4QWZ0ZXJNb2R1bGVJbXBvcnQpCiAgICAgQ3VyTGV4ZXJLaW5kID0gQ0xLX0xleGVyOwogICAKQEAgLTE0MSw2ICsxNDIsNyBAQAogICBDdXJEaXJMb29rdXAgPSBDdXJEaXI7CiAgIEN1clBUSExleGVyLnJlc2V0KFBMKTsKICAgQ3VyUFBMZXhlciA9IEN1clBUSExleGVyLmdldCgpOworICBDdXJTdWJtb2R1bGUgPSAwOwogICBpZiAoQ3VyTGV4ZXJLaW5kICE9IENMS19MZXhBZnRlck1vZHVsZUltcG9ydCkKICAgICBDdXJMZXhlcktpbmQgPSBDTEtfUFRITGV4ZXI7CiAgIApAQCAtMjQ0LDYgKzI0NiwyOSBAQAogICAvLyBidXQgaXQgbWlnaHQgaWYgdGhleSdyZSBlbXB0eT8KIH0KIAorLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGxvY2F0aW9uIHRvIHVzZSBhcyB0aGUgZW5kIG9mIHRoZSBidWZmZXIgZm9yIGEgbGV4ZXIuCisvLy8KKy8vLyBJZiB0aGUgZmlsZSBlbmRzIHdpdGggYSBuZXdsaW5lLCBmb3JtIHRoZSBFT0YgdG9rZW4gb24gdGhlIG5ld2xpbmUgaXRzZWxmLAorLy8vIHJhdGhlciB0aGFuICJvbiB0aGUgbGluZSBmb2xsb3dpbmcgaXQiLCB3aGljaCBkb2Vzbid0IGV4aXN0LiAgVGhpcyBtYWtlcworLy8vIGRpYWdub3N0aWNzIHJlbGF0aW5nIHRvIHRoZSBlbmQgb2YgZmlsZSBpbmNsdWRlIHRoZSBsYXN0IGZpbGUgdGhhdCB0aGUgdXNlcgorLy8vIGFjdHVhbGx5IHR5cGVkLCB3aGljaCBpcyBnb29kbmVzcy4KK2NvbnN0IGNoYXIgKlByZXByb2Nlc3Nvcjo6Z2V0Q3VyTGV4ZXJFbmRQb3MoKSB7CisgIGNvbnN0IGNoYXIgKkVuZFBvcyA9IEN1ckxleGVyLT5CdWZmZXJFbmQ7CisgIGlmIChFbmRQb3MgIT0gQ3VyTGV4ZXItPkJ1ZmZlclN0YXJ0ICYmCisgICAgICAoRW5kUG9zWy0xXSA9PSAnXG4nIHx8IEVuZFBvc1stMV0gPT0gJ1xyJykpIHsKKyAgICAtLUVuZFBvczsKKworICAgIC8vIEhhbmRsZSBcblxyIGFuZCBcclxuOgorICAgIGlmIChFbmRQb3MgIT0gQ3VyTGV4ZXItPkJ1ZmZlclN0YXJ0ICYmCisgICAgICAgIChFbmRQb3NbLTFdID09ICdcbicgfHwgRW5kUG9zWy0xXSA9PSAnXHInKSAmJgorICAgICAgICBFbmRQb3NbLTFdICE9IEVuZFBvc1swXSkKKyAgICAgIC0tRW5kUG9zOworICB9CisKKyAgcmV0dXJuIEVuZFBvczsKK30KKworCiAvLy8gSGFuZGxlRW5kT2ZGaWxlIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gdGhlIGxleGVyIGhpdHMgdGhlIGVuZCBvZgogLy8vIHRoZSBjdXJyZW50IGZpbGUuICBUaGlzIGVpdGhlciByZXR1cm5zIHRoZSBFT0YgdG9rZW4gb3IgcG9wcyBhIGxldmVsIG9mZgogLy8vIHRoZSBpbmNsdWRlIHN0YWNrIGFuZCBrZWVwcyBnb2luZy4KQEAgLTM0Miw3ICszNjcsMTggQEAKICAgICBGaWxlSUQgRXhpdGVkRklEOwogICAgIGlmIChDYWxsYmFja3MgJiYgIWlzRW5kT2ZNYWNybyAmJiBDdXJQUExleGVyKQogICAgICAgRXhpdGVkRklEID0gQ3VyUFBMZXhlci0+Z2V0RmlsZUlEKCk7Ci0gICAgCisKKyAgICBib29sIExlYXZpbmdTdWJtb2R1bGUgPSBDdXJTdWJtb2R1bGUgJiYgQ3VyTGV4ZXI7CisgICAgaWYgKExlYXZpbmdTdWJtb2R1bGUpIHsKKyAgICAgIC8vIE5vdGlmeSB0aGUgcGFyc2VyIHRoYXQgd2UndmUgbGVmdCB0aGUgbW9kdWxlLgorICAgICAgY29uc3QgY2hhciAqRW5kUG9zID0gZ2V0Q3VyTGV4ZXJFbmRQb3MoKTsKKyAgICAgIFJlc3VsdC5zdGFydFRva2VuKCk7CisgICAgICBDdXJMZXhlci0+QnVmZmVyUHRyID0gRW5kUG9zOworICAgICAgQ3VyTGV4ZXItPkZvcm1Ub2tlbldpdGhDaGFycyhSZXN1bHQsIEVuZFBvcywgdG9rOjphbm5vdF9tb2R1bGVfZW5kKTsKKyAgICAgIFJlc3VsdC5zZXRBbm5vdGF0aW9uRW5kTG9jKFJlc3VsdC5nZXRMb2NhdGlvbigpKTsKKyAgICAgIFJlc3VsdC5zZXRBbm5vdGF0aW9uVmFsdWUoQ3VyU3VibW9kdWxlKTsKKyAgICB9CisKICAgICAvLyBXZSdyZSBkb25lIHdpdGggdGhlICNpbmNsdWRlZCBmaWxlLgogICAgIFJlbW92ZVRvcE9mTGV4ZXJTdGFjaygpOwogCkBAIC0zNTcsMjcgKzM5MywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENhbGxiYWNrczo6RXhpdEZpbGUsIEZpbGVUeXBlLCBFeGl0ZWRGSUQpOwogICAgIH0KIAotICAgIC8vIENsaWVudCBzaG91bGQgbGV4IGFub3RoZXIgdG9rZW4uCi0gICAgcmV0dXJuIGZhbHNlOworICAgIC8vIENsaWVudCBzaG91bGQgbGV4IGFub3RoZXIgdG9rZW4gdW5sZXNzIHdlIGdlbmVyYXRlZCBhbiBFT00uCisgICAgcmV0dXJuIExlYXZpbmdTdWJtb2R1bGU7CiAgIH0KIAotICAvLyBJZiB0aGUgZmlsZSBlbmRzIHdpdGggYSBuZXdsaW5lLCBmb3JtIHRoZSBFT0YgdG9rZW4gb24gdGhlIG5ld2xpbmUgaXRzZWxmLAotICAvLyByYXRoZXIgdGhhbiAib24gdGhlIGxpbmUgZm9sbG93aW5nIGl0Iiwgd2hpY2ggZG9lc24ndCBleGlzdC4gIFRoaXMgbWFrZXMKLSAgLy8gZGlhZ25vc3RpY3MgcmVsYXRpbmcgdG8gdGhlIGVuZCBvZiBmaWxlIGluY2x1ZGUgdGhlIGxhc3QgZmlsZSB0aGF0IHRoZSB1c2VyCi0gIC8vIGFjdHVhbGx5IHR5cGVkLCB3aGljaCBpcyBnb29kbmVzcy4KKyAgLy8gSWYgdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBtYWluIGZpbGUsIGZvcm0gYW4gRU9GIHRva2VuLgogICBpZiAoQ3VyTGV4ZXIpIHsKLSAgICBjb25zdCBjaGFyICpFbmRQb3MgPSBDdXJMZXhlci0+QnVmZmVyRW5kOwotICAgIGlmIChFbmRQb3MgIT0gQ3VyTGV4ZXItPkJ1ZmZlclN0YXJ0ICYmCi0gICAgICAgIChFbmRQb3NbLTFdID09ICdcbicgfHwgRW5kUG9zWy0xXSA9PSAnXHInKSkgewotICAgICAgLS1FbmRQb3M7Ci0KLSAgICAgIC8vIEhhbmRsZSBcblxyIGFuZCBcclxuOgotICAgICAgaWYgKEVuZFBvcyAhPSBDdXJMZXhlci0+QnVmZmVyU3RhcnQgJiYKLSAgICAgICAgICAoRW5kUG9zWy0xXSA9PSAnXG4nIHx8IEVuZFBvc1stMV0gPT0gJ1xyJykgJiYKLSAgICAgICAgICBFbmRQb3NbLTFdICE9IEVuZFBvc1swXSkKLSAgICAgICAgLS1FbmRQb3M7Ci0gICAgfQotCisgICAgY29uc3QgY2hhciAqRW5kUG9zID0gZ2V0Q3VyTGV4ZXJFbmRQb3MoKTsKICAgICBSZXN1bHQuc3RhcnRUb2tlbigpOwogICAgIEN1ckxleGVyLT5CdWZmZXJQdHIgPSBFbmRQb3M7CiAgICAgQ3VyTGV4ZXItPkZvcm1Ub2tlbldpdGhDaGFycyhSZXN1bHQsIEVuZFBvcywgdG9rOjplb2YpOwpAQCAtNDA1LDExICs0MjcsMTUgQEAKICAgaWYgKCFpc0luY3JlbWVudGFsUHJvY2Vzc2luZ0VuYWJsZWQoKSkKICAgICBDdXJQUExleGVyID0gMDsKIAotICAvLyBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIHRvcC1sZXZlbCBmaWxlLiAnV2FyblVudXNlZE1hY3JvTG9jcycgaGFzIGNvbGxlY3RlZAotICAvLyBhbGwgbWFjcm8gbG9jYXRpb25zIHRoYXQgd2UgbmVlZCB0byB3YXJuIGJlY2F1c2UgdGhleSBhcmUgbm90IHVzZWQuCi0gIGZvciAoV2FyblVudXNlZE1hY3JvTG9jc1R5OjppdGVyYXRvcgotICAgICAgICAgST1XYXJuVW51c2VkTWFjcm9Mb2NzLmJlZ2luKCksIEU9V2FyblVudXNlZE1hY3JvTG9jcy5lbmQoKTsgSSE9RTsgKytJKQotICAgIERpYWcoKkksIGRpYWc6OnBwX21hY3JvX25vdF91c2VkKTsKKyAgaWYgKFRVS2luZCA9PSBUVV9Db21wbGV0ZSkgeworICAgIC8vIFRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgdG9wLWxldmVsIGZpbGUuICdXYXJuVW51c2VkTWFjcm9Mb2NzJyBoYXMKKyAgICAvLyBjb2xsZWN0ZWQgYWxsIG1hY3JvIGxvY2F0aW9ucyB0aGF0IHdlIG5lZWQgdG8gd2FybiBiZWNhdXNlIHRoZXkgYXJlIG5vdAorICAgIC8vIHVzZWQuCisgICAgZm9yIChXYXJuVW51c2VkTWFjcm9Mb2NzVHk6Oml0ZXJhdG9yCisgICAgICAgICAgIEk9V2FyblVudXNlZE1hY3JvTG9jcy5iZWdpbigpLCBFPVdhcm5VbnVzZWRNYWNyb0xvY3MuZW5kKCk7CisgICAgICAgICAgIEkhPUU7ICsrSSkKKyAgICAgIERpYWcoKkksIGRpYWc6OnBwX21hY3JvX25vdF91c2VkKTsKKyAgfQogCiAgIC8vIElmIHdlIGFyZSBidWlsZGluZyBhIG1vZHVsZSB0aGF0IGhhcyBhbiB1bWJyZWxsYSBoZWFkZXIsIG1ha2Ugc3VyZSB0aGF0CiAgIC8vIGVhY2ggb2YgdGhlIGhlYWRlcnMgd2l0aGluIHRoZSBkaXJlY3RvcnkgY292ZXJlZCBieSB0aGUgdW1icmVsbGEgaGVhZGVyCkBAIC00OTgsNyArNTI0LDcgQEAKICAgaWYgKE51bUNhY2hlZFRva2VuTGV4ZXJzID09IFRva2VuTGV4ZXJDYWNoZVNpemUpCiAgICAgQ3VyVG9rZW5MZXhlci5yZXNldCgpOwogICBlbHNlCi0gICAgVG9rZW5MZXhlckNhY2hlW051bUNhY2hlZFRva2VuTGV4ZXJzKytdID0gQ3VyVG9rZW5MZXhlci50YWtlKCk7CisgICAgVG9rZW5MZXhlckNhY2hlW051bUNhY2hlZFRva2VuTGV4ZXJzKytdID0gQ3VyVG9rZW5MZXhlci5yZWxlYXNlKCk7CiAKICAgLy8gSGFuZGxlIHRoaXMgbGlrZSBhICNpbmNsdWRlIGZpbGUgYmVpbmcgcG9wcGVkIG9mZiB0aGUgc3RhY2suCiAgIHJldHVybiBIYW5kbGVFbmRPZkZpbGUoUmVzdWx0LCB0cnVlKTsKQEAgLTUxNSw3ICs1NDEsNyBAQAogICAgIGlmIChOdW1DYWNoZWRUb2tlbkxleGVycyA9PSBUb2tlbkxleGVyQ2FjaGVTaXplKQogICAgICAgQ3VyVG9rZW5MZXhlci5yZXNldCgpOwogICAgIGVsc2UKLSAgICAgIFRva2VuTGV4ZXJDYWNoZVtOdW1DYWNoZWRUb2tlbkxleGVycysrXSA9IEN1clRva2VuTGV4ZXIudGFrZSgpOworICAgICAgVG9rZW5MZXhlckNhY2hlW051bUNhY2hlZFRva2VuTGV4ZXJzKytdID0gQ3VyVG9rZW5MZXhlci5yZWxlYXNlKCk7CiAgIH0KIAogICBQb3BJbmNsdWRlTWFjcm9TdGFjaygpOwpkaWZmIC0tZ2l0IGEvbGliL0xleC9QUE1hY3JvRXhwYW5zaW9uLmNwcCBiL2xpYi9MZXgvUFBNYWNyb0V4cGFuc2lvbi5jcHAKaW5kZXggZjIwNjMzZi4uMzVmOTE5MiAxMDA2NDQKLS0tIGEvbGliL0xleC9QUE1hY3JvRXhwYW5zaW9uLmNwcAorKysgYi9saWIvTGV4L1BQTWFjcm9FeHBhbnNpb24uY3BwCkBAIC03LDE5ICs3LDIwIEBACiAvLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIC8vCi0vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgdG9wIGxldmVsIGhhbmRsaW5nIG9mIG1hY3JvIGV4cGFzaW9uIGZvciB0aGUKKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSB0b3AgbGV2ZWwgaGFuZGxpbmcgb2YgbWFjcm8gZXhwYW5zaW9uIGZvciB0aGUKIC8vIHByZXByb2Nlc3Nvci4KIC8vCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiAjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3Nvci5oIgotI2luY2x1ZGUgImNsYW5nL0xleC9NYWNyb0FyZ3MuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9BdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRmlsZU1hbmFnZXIuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9Db2RlQ29tcGxldGlvbkhhbmRsZXIuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvRXh0ZXJuYWxQcmVwcm9jZXNzb3JTb3VyY2UuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvTGV4RGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9NYWNyb0FyZ3MuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvTWFjcm9JbmZvLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKQEAgLTk3LDYgKzk4LDE1IEBACiAgIElkZW50X19JTkNMVURFX0xFVkVMX18gPSBSZWdpc3RlckJ1aWx0aW5NYWNybygqdGhpcywgIl9fSU5DTFVERV9MRVZFTF9fIik7CiAgIElkZW50X19USU1FU1RBTVBfXyAgICAgPSBSZWdpc3RlckJ1aWx0aW5NYWNybygqdGhpcywgIl9fVElNRVNUQU1QX18iKTsKIAorICAvLyBNaWNyb3NvZnQgRXh0ZW5zaW9ucy4KKyAgaWYgKExhbmdPcHRzLk1pY3Jvc29mdEV4dCkgeworICAgIElkZW50X19pZGVudGlmaWVyID0gUmVnaXN0ZXJCdWlsdGluTWFjcm8oKnRoaXMsICJfX2lkZW50aWZpZXIiKTsKKyAgICBJZGVudF9fcHJhZ21hID0gUmVnaXN0ZXJCdWlsdGluTWFjcm8oKnRoaXMsICJfX3ByYWdtYSIpOworICB9IGVsc2UgeworICAgIElkZW50X19pZGVudGlmaWVyID0gMDsKKyAgICBJZGVudF9fcHJhZ21hID0gMDsKKyAgfQorCiAgIC8vIENsYW5nIEV4dGVuc2lvbnMuCiAgIElkZW50X19oYXNfZmVhdHVyZSAgICAgID0gUmVnaXN0ZXJCdWlsdGluTWFjcm8oKnRoaXMsICJfX2hhc19mZWF0dXJlIik7CiAgIElkZW50X19oYXNfZXh0ZW5zaW9uICAgID0gUmVnaXN0ZXJCdWlsdGluTWFjcm8oKnRoaXMsICJfX2hhc19leHRlbnNpb24iKTsKQEAgLTExOSwxMiArMTI5LDYgQEAKICAgICBJZGVudF9fYnVpbGRpbmdfbW9kdWxlID0gMDsKICAgICBJZGVudF9fTU9EVUxFX18gPSAwOwogICB9Ci0gIAotICAvLyBNaWNyb3NvZnQgRXh0ZW5zaW9ucy4KLSAgaWYgKExhbmdPcHRzLk1pY3Jvc29mdEV4dCkgCi0gICAgSWRlbnRfX3ByYWdtYSA9IFJlZ2lzdGVyQnVpbHRpbk1hY3JvKCp0aGlzLCAiX19wcmFnbWEiKTsKLSAgZWxzZQotICAgIElkZW50X19wcmFnbWEgPSAwOwogfQogCiAvLy8gaXNUcml2aWFsU2luZ2xlVG9rZW5FeHBhbnNpb24gLSBSZXR1cm4gdHJ1ZSBpZiBNSSwgd2hpY2ggaGFzIGEgc2luZ2xlIHRva2VuCkBAIC0yOTMsMTEgKzI5NywxMSBAQAogICAgIGZvciAoTWFjcm9EaXJlY3RpdmU6OkRlZkluZm8gUHJldkRlZiA9IERlZi5nZXRQcmV2aW91c0RlZmluaXRpb24oKTsKICAgICAgICAgIFByZXZEZWYgJiYgIVByZXZEZWYuaXNVbmRlZmluZWQoKTsKICAgICAgICAgIFByZXZEZWYgPSBQcmV2RGVmLmdldFByZXZpb3VzRGVmaW5pdGlvbigpKSB7Ci0gICAgICBpZiAoUHJldkRlZi5nZXREaXJlY3RpdmUoKS0+aXNBbWJpZ3VvdXMoKSkgewotICAgICAgICBEaWFnKFByZXZEZWYuZ2V0TWFjcm9JbmZvKCktPmdldERlZmluaXRpb25Mb2MoKSwKLSAgICAgICAgICAgICBkaWFnOjpub3RlX3BwX2FtYmlndW91c19tYWNyb19vdGhlcikKLSAgICAgICAgICA8PCBJZGVudGlmaWVyLmdldElkZW50aWZpZXJJbmZvKCk7Ci0gICAgICB9CisgICAgICBEaWFnKFByZXZEZWYuZ2V0TWFjcm9JbmZvKCktPmdldERlZmluaXRpb25Mb2MoKSwKKyAgICAgICAgICAgZGlhZzo6bm90ZV9wcF9hbWJpZ3VvdXNfbWFjcm9fb3RoZXIpCisgICAgICAgIDw8IElkZW50aWZpZXIuZ2V0SWRlbnRpZmllckluZm8oKTsKKyAgICAgIGlmICghUHJldkRlZi5nZXREaXJlY3RpdmUoKS0+aXNBbWJpZ3VvdXMoKSkKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKQEAgLTc5Niw3ICs4MDAsNyBAQAogICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBNYWNyb0V4cGFuZGluZ0xleGVyc1N0YWNrLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKICAgICAgIFRva2VuTGV4ZXIgKnByZXZMZXhlcjsKICAgICAgIHNpemVfdCB0b2tJbmRleDsKLSAgICAgIGxsdm06OnRpZShwcmV2TGV4ZXIsIHRva0luZGV4KSA9IE1hY3JvRXhwYW5kaW5nTGV4ZXJzU3RhY2tbaV07CisgICAgICBzdGQ6OnRpZShwcmV2TGV4ZXIsIHRva0luZGV4KSA9IE1hY3JvRXhwYW5kaW5nTGV4ZXJzU3RhY2tbaV07CiAgICAgICBwcmV2TGV4ZXItPlRva2VucyA9IE1hY3JvRXhwYW5kZWRUb2tlbnMuZGF0YSgpICsgdG9rSW5kZXg7CiAgICAgfQogICB9CkBAIC05NzUsNiArOTc5LDcgQEAKICAgICAgICAgICAgLkNhc2UoImlzX2Fic3RyYWN0IiwgTGFuZ09wdHMuQ1BsdXNQbHVzKQogICAgICAgICAgICAuQ2FzZSgiaXNfYmFzZV9vZiIsIExhbmdPcHRzLkNQbHVzUGx1cykKICAgICAgICAgICAgLkNhc2UoImlzX2NsYXNzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzKQorICAgICAgICAgICAuQ2FzZSgiaXNfY29uc3RydWN0aWJsZSIsIExhbmdPcHRzLkNQbHVzUGx1cykKICAgICAgICAgICAgLkNhc2UoImlzX2NvbnZlcnRpYmxlX3RvIiwgTGFuZ09wdHMuQ1BsdXNQbHVzKQogICAgICAgICAgICAuQ2FzZSgiaXNfZW1wdHkiLCBMYW5nT3B0cy5DUGx1c1BsdXMpCiAgICAgICAgICAgIC5DYXNlKCJpc19lbnVtIiwgTGFuZ09wdHMuQ1BsdXNQbHVzKQpAQCAtMTAzOSwyNCArMTA0NCwxMCBAQAogICAgICAgICAgICAvLyBDKysxeSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgb3RoZXIgbGFuZ3VhZ2VzIGFzIGV4dGVuc2lvbnMuCiAgICAgICAgICAgIC5DYXNlKCJjeHhfYmluYXJ5X2xpdGVyYWxzIiwgdHJ1ZSkKICAgICAgICAgICAgLkNhc2UoImN4eF9pbml0X2NhcHR1cmVzIiwgTGFuZ09wdHMuQ1BsdXNQbHVzMTEpCi0gICAgICAgICAgIC5DYXNlKCJjeHhfdmFyaWFibGVfdGVtcGxhdGVzIiwgdHJ1ZSkKKyAgICAgICAgICAgLkNhc2UoImN4eF92YXJpYWJsZV90ZW1wbGF0ZXMiLCBMYW5nT3B0cy5DUGx1c1BsdXMpCiAgICAgICAgICAgIC5EZWZhdWx0KGZhbHNlKTsKIH0KIAotLy8vIEhhc0F0dHJpYnV0ZSAtICBSZXR1cm4gdHJ1ZSBpZiB3ZSByZWNvZ25pemUgYW5kIGltcGxlbWVudCB0aGUgYXR0cmlidXRlCi0vLy8gc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBpZGVudGlmaWVyLgotc3RhdGljIGJvb2wgSGFzQXR0cmlidXRlKGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSkgewotICBTdHJpbmdSZWYgTmFtZSA9IElJLT5nZXROYW1lKCk7Ci0gIC8vIE5vcm1hbGl6ZSB0aGUgYXR0cmlidXRlIG5hbWUsIF9fZm9vX18gYmVjb21lcyBmb28uCi0gIGlmIChOYW1lLnN0YXJ0c3dpdGgoIl9fIikgJiYgTmFtZS5lbmRzd2l0aCgiX18iKSAmJiBOYW1lLnNpemUoKSA+PSA0KQotICAgIE5hbWUgPSBOYW1lLnN1YnN0cigyLCBOYW1lLnNpemUoKSAtIDQpOwotCi0gIC8vIEZJWE1FOiBEbyB3ZSBuZWVkIHRvIGhhbmRsZSBuYW1lc3BhY2VzIGhlcmU/Ci0gIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8Ym9vbD4oTmFtZSkKLSNpbmNsdWRlICJjbGFuZy9MZXgvQXR0clNwZWxsaW5ncy5pbmMiCi0gICAgICAgIC5EZWZhdWx0KGZhbHNlKTsKLX0KLQogLy8vIEV2YWx1YXRlSGFzSW5jbHVkZUNvbW1vbiAtIFByb2Nlc3MgYSAnX19oYXNfaW5jbHVkZSgicGF0aCIpJwogLy8vIG9yICdfX2hhc19pbmNsdWRlX25leHQoInBhdGgiKScgZXhwcmVzc2lvbi4KIC8vLyBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4KQEAgLTEwODAsNyArMTA3MSw3IEBACiAgIGlmIChUb2suaXNOb3QodG9rOjpsX3BhcmVuKSkgewogICAgIC8vIE5vICcoJywgdXNlIGVuZCBvZiBsYXN0IHRva2VuLgogICAgIExQYXJlbkxvYyA9IFBQLmdldExvY0ZvckVuZE9mVG9rZW4oTFBhcmVuTG9jKTsKLSAgICBQUC5EaWFnKExQYXJlbkxvYywgZGlhZzo6ZXJyX3BwX21pc3NpbmdfbHBhcmVuKSA8PCBJSS0+Z2V0TmFtZSgpOworICAgIFBQLkRpYWcoTFBhcmVuTG9jLCBkaWFnOjplcnJfcHBfZXhwZWN0ZWRfYWZ0ZXIpIDw8IElJIDw8IHRvazo6bF9wYXJlbjsKICAgICAvLyBJZiB0aGUgbmV4dCB0b2tlbiBsb29rcyBsaWtlIGEgZmlsZW5hbWUgb3IgdGhlIHN0YXJ0IG9mIG9uZSwKICAgICAvLyBhc3N1bWUgaXQgaXMgYW5kIHByb2Nlc3MgaXQgYXMgc3VjaC4KICAgICBpZiAoIVRvay5pcyh0b2s6OmFuZ2xlX3N0cmluZ19saXRlcmFsKSAmJiAhVG9rLmlzKHRvazo6c3RyaW5nX2xpdGVyYWwpICYmCkBAIC0xMTQyLDkgKzExMzMsOSBAQAogCiAgIC8vIEVuc3VyZSB3ZSBoYXZlIGEgdHJhaWxpbmcgKS4KICAgaWYgKFRvay5pc05vdCh0b2s6OnJfcGFyZW4pKSB7Ci0gICAgUFAuRGlhZyhQUC5nZXRMb2NGb3JFbmRPZlRva2VuKEZpbGVuYW1lTG9jKSwgZGlhZzo6ZXJyX3BwX21pc3NpbmdfcnBhcmVuKQotICAgICAgICA8PCBJSS0+Z2V0TmFtZSgpOwotICAgIFBQLkRpYWcoTFBhcmVuTG9jLCBkaWFnOjpub3RlX21hdGNoaW5nKSA8PCAiKCI7CisgICAgUFAuRGlhZyhQUC5nZXRMb2NGb3JFbmRPZlRva2VuKEZpbGVuYW1lTG9jKSwgZGlhZzo6ZXJyX3BwX2V4cGVjdGVkX2FmdGVyKQorICAgICAgICA8PCBJSSA8PCB0b2s6OnJfcGFyZW47CisgICAgUFAuRGlhZyhMUGFyZW5Mb2MsIGRpYWc6Om5vdGVfbWF0Y2hpbmcpIDw8IHRvazo6bF9wYXJlbjsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIApAQCAtMTIwMSw3ICsxMTkyLDggQEAKIAogICAvLyBFbnN1cmUgd2UgaGF2ZSBhICcoJy4KICAgaWYgKFRvay5pc05vdCh0b2s6OmxfcGFyZW4pKSB7Ci0gICAgUFAuRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX3BwX21pc3NpbmdfbHBhcmVuKSA8PCBJSS0+Z2V0TmFtZSgpOworICAgIFBQLkRpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9wcF9leHBlY3RlZF9hZnRlcikgPDwgSUkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRvazo6bF9wYXJlbjsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIApAQCAtMTIyNSw4ICsxMjE3LDkgQEAKIAogICAvLyBFbnN1cmUgd2UgaGF2ZSBhIHRyYWlsaW5nICkuCiAgIGlmIChUb2suaXNOb3QodG9rOjpyX3BhcmVuKSkgewotICAgIFBQLkRpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9wcF9taXNzaW5nX3JwYXJlbikgPDwgSUktPmdldE5hbWUoKTsKLSAgICBQUC5EaWFnKExQYXJlbkxvYywgZGlhZzo6bm90ZV9tYXRjaGluZykgPDwgIigiOworICAgIFBQLkRpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9wcF9leHBlY3RlZF9hZnRlcikgPDwgSUkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRvazo6cl9wYXJlbjsKKyAgICBQUC5EaWFnKExQYXJlbkxvYywgZGlhZzo6bm90ZV9tYXRjaGluZykgPDwgdG9rOjpsX3BhcmVuOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCkBAIC0xMzkzLDcgKzEzODYsOCBAQAogICAgICAgLy8gQ2hlY2sgZm9yIGEgYnVpbHRpbiBpcyB0cml2aWFsLgogICAgICAgVmFsdWUgPSBGZWF0dXJlSUktPmdldEJ1aWx0aW5JRCgpICE9IDA7CiAgICAgfSBlbHNlIGlmIChJSSA9PSBJZGVudF9faGFzX2F0dHJpYnV0ZSkKLSAgICAgIFZhbHVlID0gSGFzQXR0cmlidXRlKEZlYXR1cmVJSSk7CisgICAgICBWYWx1ZSA9IGhhc0F0dHJpYnV0ZShBdHRyU3ludGF4OjpHZW5lcmljLCBudWxscHRyLCBGZWF0dXJlSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUYXJnZXRJbmZvKCkuZ2V0VHJpcGxlKCksIGdldExhbmdPcHRzKCkpOwogICAgIGVsc2UgaWYgKElJID09IElkZW50X19oYXNfZXh0ZW5zaW9uKQogICAgICAgVmFsdWUgPSBIYXNFeHRlbnNpb24oKnRoaXMsIEZlYXR1cmVJSSk7CiAgICAgZWxzZSB7CkBAIC0xNDc5LDYgKzE0NzMsNDQgQEAKICAgICBJZGVudGlmaWVySW5mbyAqTW9kdWxlSUkgPSBnZXRJZGVudGlmaWVySW5mbyhnZXRMYW5nT3B0cygpLkN1cnJlbnRNb2R1bGUpOwogICAgIFRvay5zZXRJZGVudGlmaWVySW5mbyhNb2R1bGVJSSk7CiAgICAgVG9rLnNldEtpbmQoTW9kdWxlSUktPmdldFRva2VuSUQoKSk7CisgIH0gZWxzZSBpZiAoSUkgPT0gSWRlbnRfX2lkZW50aWZpZXIpIHsKKyAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBUb2suZ2V0TG9jYXRpb24oKTsKKworICAgIC8vIFdlJ3JlIGV4cGVjdGluZyAnX19pZGVudGlmaWVyJyAnKCcgaWRlbnRpZmllciAnKScuIFRyeSB0byByZWNvdmVyCisgICAgLy8gaWYgdGhlIHBhcmVucyBhcmUgbWlzc2luZy4KKyAgICBMZXhOb25Db21tZW50KFRvayk7CisgICAgaWYgKFRvay5pc05vdCh0b2s6OmxfcGFyZW4pKSB7CisgICAgICAvLyBObyAnKCcsIHVzZSBlbmQgb2YgbGFzdCB0b2tlbi4KKyAgICAgIERpYWcoZ2V0TG9jRm9yRW5kT2ZUb2tlbihMb2MpLCBkaWFnOjplcnJfcHBfZXhwZWN0ZWRfYWZ0ZXIpCisgICAgICAgIDw8IElJIDw8IHRvazo6bF9wYXJlbjsKKyAgICAgIC8vIElmIHRoZSBuZXh0IHRva2VuIGlzbid0IHZhbGlkIGFzIG91ciBhcmd1bWVudCwgd2UgY2FuJ3QgcmVjb3Zlci4KKyAgICAgIGlmICghVG9rLmlzQW5ub3RhdGlvbigpICYmIFRvay5nZXRJZGVudGlmaWVySW5mbygpKQorICAgICAgICBUb2suc2V0S2luZCh0b2s6OmlkZW50aWZpZXIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYyA9IFRvay5nZXRMb2NhdGlvbigpOworICAgIExleE5vbkNvbW1lbnQoVG9rKTsKKworICAgIGlmICghVG9rLmlzQW5ub3RhdGlvbigpICYmIFRvay5nZXRJZGVudGlmaWVySW5mbygpKQorICAgICAgVG9rLnNldEtpbmQodG9rOjppZGVudGlmaWVyKTsKKyAgICBlbHNlIHsKKyAgICAgIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9wcF9pZGVudGlmaWVyX2FyZ19ub3RfaWRlbnRpZmllcikKKyAgICAgICAgPDwgVG9rLmdldEtpbmQoKTsKKyAgICAgIC8vIERvbid0IHdhbGsgcGFzdCBhbnl0aGluZyB0aGF0J3Mgbm90IGEgcmVhbCB0b2tlbi4KKyAgICAgIGlmIChUb2suaXModG9rOjplb2YpIHx8IFRvay5pcyh0b2s6OmVvZCkgfHwgVG9rLmlzQW5ub3RhdGlvbigpKQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRGlzY2FyZCB0aGUgJyknLCBwcmVzZXJ2aW5nICdUb2snIGFzIG91ciByZXN1bHQuCisgICAgVG9rZW4gUlBhcmVuOworICAgIExleE5vbkNvbW1lbnQoUlBhcmVuKTsKKyAgICBpZiAoUlBhcmVuLmlzTm90KHRvazo6cl9wYXJlbikpIHsKKyAgICAgIERpYWcoZ2V0TG9jRm9yRW5kT2ZUb2tlbihUb2suZ2V0TG9jYXRpb24oKSksIGRpYWc6OmVycl9wcF9leHBlY3RlZF9hZnRlcikKKyAgICAgICAgPDwgVG9rLmdldEtpbmQoKSA8PCB0b2s6OnJfcGFyZW47CisgICAgICBEaWFnKExQYXJlbkxvYywgZGlhZzo6bm90ZV9tYXRjaGluZykgPDwgdG9rOjpsX3BhcmVuOworICAgIH0KKyAgICByZXR1cm47CiAgIH0gZWxzZSB7CiAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBpZGVudGlmaWVyISIpOwogICB9CmRpZmYgLS1naXQgYS9saWIvTGV4L1BUSExleGVyLmNwcCBiL2xpYi9MZXgvUFRITGV4ZXIuY3BwCmluZGV4IGUyNjI5YTMuLjFjYTE2ZDMgMTAwNjQ0Ci0tLSBhL2xpYi9MZXgvUFRITGV4ZXIuY3BwCisrKyBiL2xpYi9MZXgvUFRITGV4ZXIuY3BwCkBAIC0yMSwxMSArMjEsMTIgQEAKICNpbmNsdWRlICJjbGFuZy9MZXgvUFRITWFuYWdlci5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvVG9rZW4uaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuU3RyZWFtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9zeXN0ZW1fZXJyb3IuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiB1c2luZyBuYW1lc3BhY2UgY2xhbmc6OmlvOwogCkBAIC00NywxNCArNDgsMTcgQEAKICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09Ly8KICAgLy8gUmVhZCB0aGUgcmF3IHRva2VuIGRhdGEuCiAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PS8vCisgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OwogCiAgIC8vIFNoYWRvdyBDdXJQdHIgaW50byBhbiBhdXRvbWF0aWMgdmFyaWFibGUuCiAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkN1clB0clNoYWRvdyA9IEN1clB0cjsKIAogICAvLyBSZWFkIGluIHRoZSBkYXRhIGZvciB0aGUgdG9rZW4uCi0gIHVuc2lnbmVkIFdvcmQwID0gUmVhZExFMzIoQ3VyUHRyU2hhZG93KTsKLSAgdWludDMyX3QgSWRlbnRpZmllcklEID0gUmVhZExFMzIoQ3VyUHRyU2hhZG93KTsKLSAgdWludDMyX3QgRmlsZU9mZnNldCA9IFJlYWRMRTMyKEN1clB0clNoYWRvdyk7CisgIHVuc2lnbmVkIFdvcmQwID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPihDdXJQdHJTaGFkb3cpOworICB1aW50MzJfdCBJZGVudGlmaWVySUQgPQorICAgICAgZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPihDdXJQdHJTaGFkb3cpOworICB1aW50MzJfdCBGaWxlT2Zmc2V0ID0KKyAgICAgIGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgYWxpZ25lZD4oQ3VyUHRyU2hhZG93KTsKIAogICB0b2s6OlRva2VuS2luZCBUS2luZCA9ICh0b2s6OlRva2VuS2luZCkgKFdvcmQwICYgMHhGRik7CiAgIFRva2VuOjpUb2tlbkZsYWdzIFRGbGFncyA9IChUb2tlbjo6VG9rZW5GbGFncykgKChXb3JkMCA+PiA4KSAmIDB4RkYpOwpAQCAtMTg0LDYgKzE4OCw3IEBACiAKIC8vLyBTa2lwQmxvY2sgLSBVc2VkIGJ5IFByZXByb2Nlc3NvciB0byBza2lwIHRoZSBjdXJyZW50IGNvbmRpdGlvbmFsIGJsb2NrLgogYm9vbCBQVEhMZXhlcjo6U2tpcEJsb2NrKCkgeworICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKICAgYXNzZXJ0KEN1clBQQ29uZFB0ciAmJiAiTm8gY2FjaGVkIFBQIGNvbmRpdGlvbmFsIGluZm9ybWF0aW9uLiIpOwogICBhc3NlcnQoTGFzdEhhc2hUb2tQdHIgJiYgIk5vIGtub3duICcjJyB0b2tlbi4iKTsKIApAQCAtMTkyLDEwICsxOTcsMTAgQEAKIAogICBkbyB7CiAgICAgLy8gUmVhZCB0aGUgdG9rZW4gb2Zmc2V0IGZyb20gdGhlIHNpZGUtdGFibGUuCi0gICAgdWludDMyX3QgT2Zmc2V0ID0gUmVhZExFMzIoQ3VyUFBDb25kUHRyKTsKKyAgICB1aW50MzJfdCBPZmZzZXQgPSBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIGFsaWduZWQ+KEN1clBQQ29uZFB0cik7CiAKICAgICAvLyBSZWFkIHRoZSB0YXJnZXQgdGFibGUgaW5kZXggZnJvbSB0aGUgc2lkZS10YWJsZS4KLSAgICBUYWJsZUlkeCA9IFJlYWRMRTMyKEN1clBQQ29uZFB0cik7CisgICAgVGFibGVJZHggPSBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIGFsaWduZWQ+KEN1clBQQ29uZFB0cik7CiAKICAgICAvLyBDb21wdXRlIHRoZSBhY3R1YWwgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlICcjJyB0b2tlbiBkYXRhIGZvciB0aGlzIGVudHJ5LgogICAgIEhhc2hFbnRyeUkgPSBUb2tCdWYgKyBPZmZzZXQ7CkBAIC0yMTIsMTIgKzIxNywxMyBAQAogICAgICAgICBQUENvbmQgKyBUYWJsZUlkeCooc2l6ZW9mKHVpbnQzMl90KSoyKTsKICAgICAgIGFzc2VydChOZXh0UFBDb25kUHRyID49IEN1clBQQ29uZFB0cik7CiAgICAgICAvLyBSZWFkIHdoZXJlIHdlIHNob3VsZCBqdW1wIHRvLgotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogSGFzaEVudHJ5SiA9IFRva0J1ZiArIFJlYWRMRTMyKE5leHRQUENvbmRQdHIpOworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqSGFzaEVudHJ5SiA9CisgICAgICAgICAgVG9rQnVmICsgZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPihOZXh0UFBDb25kUHRyKTsKIAogICAgICAgaWYgKEhhc2hFbnRyeUogPD0gTGFzdEhhc2hUb2tQdHIpIHsKICAgICAgICAgLy8gSnVtcCBkaXJlY3RseSB0byB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgc2lkZSB0YWJsZS4KICAgICAgICAgSGFzaEVudHJ5SSA9IEhhc2hFbnRyeUo7Ci0gICAgICAgIFRhYmxlSWR4ID0gUmVhZExFMzIoTmV4dFBQQ29uZFB0cik7CisgICAgICAgIFRhYmxlSWR4ID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPihOZXh0UFBDb25kUHRyKTsKICAgICAgICAgQ3VyUFBDb25kUHRyID0gTmV4dFBQQ29uZFB0cjsKICAgICAgIH0KICAgICB9CkBAIC0yMzIsOCArMjM4LDkgQEAKICAgQ3VyUFBDb25kUHRyID0gTmV4dFBQQ29uZFB0cjsKIAogICAvLyBSZWFkIHdoZXJlIHdlIHNob3VsZCBqdW1wIHRvLgotICBIYXNoRW50cnlJID0gVG9rQnVmICsgUmVhZExFMzIoTmV4dFBQQ29uZFB0cik7Ci0gIHVpbnQzMl90IE5leHRJZHggPSBSZWFkTEUzMihOZXh0UFBDb25kUHRyKTsKKyAgSGFzaEVudHJ5SSA9CisgICAgICBUb2tCdWYgKyBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIGFsaWduZWQ+KE5leHRQUENvbmRQdHIpOworICB1aW50MzJfdCBOZXh0SWR4ID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPihOZXh0UFBDb25kUHRyKTsKIAogICAvLyBCeSBjb25zdHJ1Y3Rpb24gTmV4dElkeCB3aWxsIGJlIHplcm8gaWYgdGhpcyBpcyBhICNlbmRpZi4gIFRoaXMgaXMgdXNlZnVsCiAgIC8vIHRvIGtub3cgdG8gb2J2aWF0ZSBsZXhpbmcgYW5vdGhlciB0b2tlbi4KQEAgLTI4Miw4ICsyODksMTAgQEAKICAgLy8gaGFuZGxpbmcgYSAjaW5jbHVkZWQgZmlsZS4gIEp1c3QgcmVhZCB0aGUgbmVjZXNzYXJ5IGRhdGEgZnJvbSB0aGUgdG9rZW4KICAgLy8gZGF0YSBidWZmZXIgdG8gY29uc3RydWN0IHRoZSBTb3VyY2VMb2NhdGlvbiBvYmplY3QuCiAgIC8vIE5PVEU6IFRoaXMgaXMgYSB2aXJ0dWFsIGZ1bmN0aW9uOyBoZW5jZSBpdCBpcyBkZWZpbmVkIG91dC1vZi1saW5lLgorICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKwogICBjb25zdCB1bnNpZ25lZCBjaGFyICpPZmZzZXRQdHIgPSBDdXJQdHIgKyAoRElTS19UT0tFTl9TSVpFIC0gNCk7Ci0gIHVpbnQzMl90IE9mZnNldCA9IFJlYWRMRTMyKE9mZnNldFB0cik7CisgIHVpbnQzMl90IE9mZnNldCA9IGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgYWxpZ25lZD4oT2Zmc2V0UHRyKTsKICAgcmV0dXJuIEZpbGVTdGFydExvYy5nZXRMb2NXaXRoT2Zmc2V0KE9mZnNldCk7CiB9CiAKQEAgLTMxNyw3ICszMjYsOSBAQAogCiAgIHN0YXRpYyBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPgogICBSZWFkS2V5RGF0YUxlbmd0aChjb25zdCB1bnNpZ25lZCBjaGFyKiYgZCkgewotICAgIHVuc2lnbmVkIGtleUxlbiA9ICh1bnNpZ25lZCkgUmVhZFVuYWxpZ25lZExFMTYoZCk7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgdW5zaWduZWQga2V5TGVuID0KKyAgICAgICAgKHVuc2lnbmVkKWVuZGlhbjo6cmVhZE5leHQ8dWludDE2X3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKTsKICAgICB1bnNpZ25lZCBkYXRhTGVuID0gKHVuc2lnbmVkKSAqKGQrKyk7CiAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGtleUxlbiwgZGF0YUxlbik7CiAgIH0KQEAgLTM0NCw4ICszNTUsOSBAQAogICBzdGF0aWMgUFRIRmlsZURhdGEgUmVhZERhdGEoY29uc3QgaW50ZXJuYWxfa2V5X3R5cGUmIGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkLCB1bnNpZ25lZCkgewogICAgIGFzc2VydChrLmZpcnN0ID09IDB4MSAmJiAiT25seSBmaWxlIGxvb2t1cHMgY2FuIG1hdGNoISIpOwotICAgIHVpbnQzMl90IHggPSA6OlJlYWRVbmFsaWduZWRMRTMyKGQpOwotICAgIHVpbnQzMl90IHkgPSA6OlJlYWRVbmFsaWduZWRMRTMyKGQpOworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgIHVpbnQzMl90IHggPSBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CisgICAgdWludDMyX3QgeSA9IGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKTsKICAgICByZXR1cm4gUFRIRmlsZURhdGEoeCwgeSk7CiAgIH0KIH07CkBAIC0zNzYsNyArMzg4LDEwIEBACiAKICAgc3RhdGljIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+CiAgIFJlYWRLZXlEYXRhTGVuZ3RoKGNvbnN0IHVuc2lnbmVkIGNoYXIqJiBkKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCh1bnNpZ25lZCkgUmVhZFVuYWxpZ25lZExFMTYoZCksIHNpemVvZih1aW50MzJfdCkpOworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgKHVuc2lnbmVkKWVuZGlhbjo6cmVhZE5leHQ8dWludDE2X3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKSwKKyAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSk7CiAgIH0KIAogICBzdGF0aWMgc3RkOjpwYWlyPGNvbnN0IGNoYXIqLCB1bnNpZ25lZD4KQEAgLTM4Nyw3ICs0MDIsOCBAQAogCiAgIHN0YXRpYyB1aW50MzJfdCBSZWFkRGF0YShjb25zdCBpbnRlcm5hbF9rZXlfdHlwZSYgaywgY29uc3QgdW5zaWduZWQgY2hhciogZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKSB7Ci0gICAgcmV0dXJuIDo6UmVhZFVuYWxpZ25lZExFMzIoZCk7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgcmV0dXJuIGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKTsKICAgfQogfTsKIApAQCAtNDE5LDEzICs0MzUsMTMgQEAKIH0KIAogc3RhdGljIHZvaWQgSW52YWxpZFBUSChEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MsIGNvbnN0IGNoYXIgKk1zZykgewotICBEaWFncy5SZXBvcnQoRGlhZ3MuZ2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNzRW5naW5lOjpFcnJvciwgTXNnKSk7CisgIERpYWdzLlJlcG9ydChEaWFncy5nZXRDdXN0b21EaWFnSUQoRGlhZ25vc3RpY3NFbmdpbmU6OkVycm9yLCAiJTAiKSkgPDwgTXNnOwogfQogCiBQVEhNYW5hZ2VyICpQVEhNYW5hZ2VyOjpDcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJkRpYWdzKSB7CiAgIC8vIE1lbW9yeSBtYXAgdGhlIFBUSCBmaWxlLgotICBPd25pbmdQdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBGaWxlOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBGaWxlOwogCiAgIGlmIChsbHZtOjpNZW1vcnlCdWZmZXI6OmdldEZpbGUoZmlsZSwgRmlsZSkpIHsKICAgICAvLyBGSVhNRTogQWRkIGVjLm1lc3NhZ2UoKSB0byB0aGlzIGRpYWcuCkBAIC00MzMsNiArNDQ5LDggQEAKICAgICByZXR1cm4gMDsKICAgfQogCisgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworCiAgIC8vIEdldCB0aGUgYnVmZmVyIHJhbmdlcyBhbmQgY2hlY2sgaWYgdGhlcmUgYXJlIGF0IGxlYXN0IHRocmVlIDMyLWJpdAogICAvLyB3b3JkcyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgogICBjb25zdCB1bnNpZ25lZCBjaGFyICpCdWZCZWcgPSAoY29uc3QgdW5zaWduZWQgY2hhciopRmlsZS0+Z2V0QnVmZmVyU3RhcnQoKTsKQEAgLTQ0Nyw3ICs0NjUsNyBAQAogCiAgIC8vIFJlYWQgdGhlIFBUSCB2ZXJzaW9uLgogICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gQnVmQmVnICsgKHNpemVvZigiY2ZlLXB0aCIpKTsKLSAgdW5zaWduZWQgVmVyc2lvbiA9IFJlYWRMRTMyKHApOworICB1bnNpZ25lZCBWZXJzaW9uID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPihwKTsKIAogICBpZiAoVmVyc2lvbiA8IFBUSE1hbmFnZXI6OlZlcnNpb24pIHsKICAgICBJbnZhbGlkUFRIKERpYWdzLApAQCAtNDY4LDE0ICs0ODYsMTUgQEAKICAgLy8gQ29uc3RydWN0IHRoZSBmaWxlIGxvb2t1cCB0YWJsZS4gIFRoaXMgd2lsbCBiZSB1c2VkIGZvciBtYXBwaW5nIGZyb20KICAgLy8gRmlsZUVudHJ5KidzIHRvIGNhY2hlZCB0b2tlbnMuCiAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIEZpbGVUYWJsZU9mZnNldCA9IFByb2xvZ3VlT2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KSoyOwotICBjb25zdCB1bnNpZ25lZCBjaGFyKiBGaWxlVGFibGUgPSBCdWZCZWcgKyBSZWFkTEUzMihGaWxlVGFibGVPZmZzZXQpOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpGaWxlVGFibGUgPQorICAgICAgQnVmQmVnICsgZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPihGaWxlVGFibGVPZmZzZXQpOwogCiAgIGlmICghKEZpbGVUYWJsZSA+IEJ1ZkJlZyAmJiBGaWxlVGFibGUgPCBCdWZFbmQpKSB7CiAgICAgRGlhZ3MuUmVwb3J0KGRpYWc6OmVycl9pbnZhbGlkX3B0aF9maWxlKSA8PCBmaWxlOwogICAgIHJldHVybiAwOyAvLyBGSVhNRTogUHJvcGVyIGVycm9yIGRpYWdub3N0aWM/CiAgIH0KIAotICBPd25pbmdQdHI8UFRIRmlsZUxvb2t1cD4gRkwoUFRIRmlsZUxvb2t1cDo6Q3JlYXRlKEZpbGVUYWJsZSwgQnVmQmVnKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxQVEhGaWxlTG9va3VwPiBGTChQVEhGaWxlTG9va3VwOjpDcmVhdGUoRmlsZVRhYmxlLCBCdWZCZWcpKTsKIAogICAvLyBXYXJuIGlmIHRoZSBQVEggZmlsZSBpcyBlbXB0eS4gIFdlIHN0aWxsIHdhbnQgdG8gY3JlYXRlIGEgUFRITWFuYWdlcgogICAvLyBhcyB0aGUgUFRIIGNvdWxkIGJlIHVzZWQgd2l0aCAtaW5jbHVkZS1wdGguCkBAIC00ODUsNyArNTA0LDggQEAKICAgLy8gR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgdGFibGUgbWFwcGluZyBmcm9tIHBlcnNpc3RlbnQgaWRzIHRvIHRoZQogICAvLyBkYXRhIG5lZWRlZCB0byByZWNvbnN0cnVjdCBpZGVudGlmaWVycy4KICAgY29uc3QgdW5zaWduZWQgY2hhciogSURUYWJsZU9mZnNldCA9IFByb2xvZ3VlT2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KSowOwotICBjb25zdCB1bnNpZ25lZCBjaGFyKiBJRGF0YSA9IEJ1ZkJlZyArIFJlYWRMRTMyKElEVGFibGVPZmZzZXQpOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpJRGF0YSA9CisgICAgICBCdWZCZWcgKyBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIGFsaWduZWQ+KElEVGFibGVPZmZzZXQpOwogCiAgIGlmICghKElEYXRhID49IEJ1ZkJlZyAmJiBJRGF0YSA8IEJ1ZkVuZCkpIHsKICAgICBEaWFncy5SZXBvcnQoZGlhZzo6ZXJyX2ludmFsaWRfcHRoX2ZpbGUpIDw8IGZpbGU7CkBAIC00OTUsMjUgKzUxNSwyNyBAQAogICAvLyBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBoYXNodGFibGUgbWFwcGluZyBiZXR3ZWVuIHN0cmluZ3MgYW5kCiAgIC8vIHBlcnNpc3RlbnQgSURzLgogICBjb25zdCB1bnNpZ25lZCBjaGFyKiBTdHJpbmdJZFRhYmxlT2Zmc2V0ID0gUHJvbG9ndWVPZmZzZXQgKyBzaXplb2YodWludDMyX3QpKjE7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIqIFN0cmluZ0lkVGFibGUgPSBCdWZCZWcgKyBSZWFkTEUzMihTdHJpbmdJZFRhYmxlT2Zmc2V0KTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqU3RyaW5nSWRUYWJsZSA9CisgICAgICBCdWZCZWcgKyBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIGFsaWduZWQ+KFN0cmluZ0lkVGFibGVPZmZzZXQpOwogICBpZiAoIShTdHJpbmdJZFRhYmxlID49IEJ1ZkJlZyAmJiBTdHJpbmdJZFRhYmxlIDwgQnVmRW5kKSkgewogICAgIERpYWdzLlJlcG9ydChkaWFnOjplcnJfaW52YWxpZF9wdGhfZmlsZSkgPDwgZmlsZTsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIE93bmluZ1B0cjxQVEhTdHJpbmdJZExvb2t1cD4gU0woUFRIU3RyaW5nSWRMb29rdXA6OkNyZWF0ZShTdHJpbmdJZFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmQmVnKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxQVEhTdHJpbmdJZExvb2t1cD4gU0woCisgICAgICBQVEhTdHJpbmdJZExvb2t1cDo6Q3JlYXRlKFN0cmluZ0lkVGFibGUsIEJ1ZkJlZykpOwogCiAgIC8vIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIHNwZWxsaW5nIGNhY2hlLgogICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcGVsbGluZ0Jhc2VPZmZzZXQgPSBQcm9sb2d1ZU9mZnNldCArIHNpemVvZih1aW50MzJfdCkqMzsKLSAgY29uc3QgdW5zaWduZWQgY2hhciogc3BlbGxpbmdCYXNlID0gQnVmQmVnICsgUmVhZExFMzIoc3BlbGxpbmdCYXNlT2Zmc2V0KTsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3BlbGxpbmdCYXNlID0KKyAgICAgIEJ1ZkJlZyArIGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgYWxpZ25lZD4oc3BlbGxpbmdCYXNlT2Zmc2V0KTsKICAgaWYgKCEoc3BlbGxpbmdCYXNlID49IEJ1ZkJlZyAmJiBzcGVsbGluZ0Jhc2UgPCBCdWZFbmQpKSB7CiAgICAgRGlhZ3MuUmVwb3J0KGRpYWc6OmVycl9pbnZhbGlkX3B0aF9maWxlKSA8PCBmaWxlOwogICAgIHJldHVybiAwOwogICB9CiAKICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgSWRlbnRpZmllckluZm9zIGFuZCBwcmUtYWxsb2NhdGUgdGhlIGlkZW50aWZpZXIgY2FjaGUuCi0gIHVpbnQzMl90IE51bUlkcyA9IFJlYWRMRTMyKElEYXRhKTsKKyAgdWludDMyX3QgTnVtSWRzID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPihJRGF0YSk7CiAKICAgLy8gUHJlLWFsbG9jYXRlIHRoZSBwZXJzaXN0ZW50IElEIC0+IElkZW50aWZpZXJJbmZvKiBjYWNoZS4gIFdlIHVzZSBjYWxsb2MoKQogICAvLyBzbyB0aGF0IHdlIGluIHRoZSBiZXN0IGNhc2Ugb25seSB6ZXJvIG91dCBtZW1vcnkgb25jZSB3aGVuIHRoZSBPUyByZXR1cm5zCkBAIC01MzAsMjAgKzU1MiwyMyBAQAogCiAgIC8vIENvbXB1dGUgdGhlIGFkZHJlc3Mgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLgogICBjb25zdCB1bnNpZ25lZCBjaGFyKiBvcmlnaW5hbFNvdXJjZUJhc2UgPSBQcm9sb2d1ZU9mZnNldCArIHNpemVvZih1aW50MzJfdCkqNDsKLSAgdW5zaWduZWQgbGVuID0gUmVhZFVuYWxpZ25lZExFMTYob3JpZ2luYWxTb3VyY2VCYXNlKTsKKyAgdW5zaWduZWQgbGVuID0KKyAgICAgIGVuZGlhbjo6cmVhZE5leHQ8dWludDE2X3QsIGxpdHRsZSwgdW5hbGlnbmVkPihvcmlnaW5hbFNvdXJjZUJhc2UpOwogICBpZiAoIWxlbikgb3JpZ2luYWxTb3VyY2VCYXNlID0gMDsKIAogICAvLyBDcmVhdGUgdGhlIG5ldyBQVEhNYW5hZ2VyLgotICByZXR1cm4gbmV3IFBUSE1hbmFnZXIoRmlsZS50YWtlKCksIEZMLnRha2UoKSwgSURhdGEsIFBlcklEQ2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBTTC50YWtlKCksIE51bUlkcywgc3BlbGxpbmdCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKSBvcmlnaW5hbFNvdXJjZUJhc2UpOworICByZXR1cm4gbmV3IFBUSE1hbmFnZXIoRmlsZS5yZWxlYXNlKCksIEZMLnJlbGVhc2UoKSwgSURhdGEsIFBlcklEQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICBTTC5yZWxlYXNlKCksIE51bUlkcywgc3BlbGxpbmdCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilvcmlnaW5hbFNvdXJjZUJhc2UpOwogfQogCiBJZGVudGlmaWVySW5mbyogUFRITWFuYWdlcjo6TGF6aWx5Q3JlYXRlSWRlbnRpZmllckluZm8odW5zaWduZWQgUGVyc2lzdGVudElEKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OwogICAvLyBMb29rIGluIHRoZSBQVEggZmlsZSBmb3IgdGhlIHN0cmluZyBkYXRhIGZvciB0aGUgSWRlbnRpZmllckluZm8gb2JqZWN0LgogICBjb25zdCB1bnNpZ25lZCBjaGFyKiBUYWJsZUVudHJ5ID0gSWREYXRhVGFibGUgKyBzaXplb2YodWludDMyX3QpKlBlcnNpc3RlbnRJRDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciogSUREYXRhID0KLSAgICAoY29uc3QgdW5zaWduZWQgY2hhciopQnVmLT5nZXRCdWZmZXJTdGFydCgpICsgUmVhZExFMzIoVGFibGVFbnRyeSk7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKklERGF0YSA9CisgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKUJ1Zi0+Z2V0QnVmZmVyU3RhcnQoKSArCisgICAgICBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIGFsaWduZWQ+KFRhYmxlRW50cnkpOwogICBhc3NlcnQoSUREYXRhIDwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKUJ1Zi0+Z2V0QnVmZmVyRW5kKCkpOwogCiAgIC8vIEFsbG9jYXRlIHRoZSBvYmplY3QuCkBAIC01NzksNiArNjA0LDggQEAKICAgaWYgKCFGRSkKICAgICByZXR1cm4gMDsKIAorICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKwogICAvLyBMb29rdXAgdGhlIEZpbGVFbnRyeSBvYmplY3QgaW4gb3VyIGZpbGUgbG9va3VwIGRhdGEgc3RydWN0dXJlLiAgSXQgd2lsbAogICAvLyByZXR1cm4gYSB2YXJpYW50IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGFuIG9mZnNldCB3aXRoaW4KICAgLy8gdGhlIFBUSCBmaWxlIHRoYXQgY29udGFpbnMgY2FjaGVkIHRva2Vucy4KQEAgLTU5Niw3ICs2MjMsNyBAQAogCiAgIC8vIEdldCB0aGUgbG9jYXRpb24gb2YgcHAtY29uZGl0aW9uYWwgdGFibGUuCiAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBwY29uZCA9IEJ1ZlN0YXJ0ICsgRmlsZURhdGEuZ2V0UFBDb25kT2Zmc2V0KCk7Ci0gIHVpbnQzMl90IExlbiA9IFJlYWRMRTMyKHBwY29uZCk7CisgIHVpbnQzMl90IExlbiA9IGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgYWxpZ25lZD4ocHBjb25kKTsKICAgaWYgKExlbiA9PSAwKSBwcGNvbmQgPSAwOwogCiAgIGFzc2VydChQUCAmJiAiTm8gcHJlcHJvY2Vzc29yIHNldCB5ZXQhIik7CkBAIC02NTAsMTEgKzY3NywxMyBAQAogICAgICAgICBkICs9IDQgKiAyOyAvLyBTa2lwIHRoZSBmaXJzdCAyIHdvcmRzLgogICAgICAgfQogCi0gICAgICB1aW50NjRfdCBGaWxlID0gUmVhZFVuYWxpZ25lZExFNjQoZCk7Ci0gICAgICB1aW50NjRfdCBEZXZpY2UgPSBSZWFkVW5hbGlnbmVkTEU2NChkKTsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworCisgICAgICB1aW50NjRfdCBGaWxlID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50NjRfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpOworICAgICAgdWludDY0X3QgRGV2aWNlID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50NjRfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpOwogICAgICAgbGx2bTo6c3lzOjpmczo6VW5pcXVlSUQgVW5pcXVlSUQoRmlsZSwgRGV2aWNlKTsKLSAgICAgIHRpbWVfdCBNb2RUaW1lID0gUmVhZFVuYWxpZ25lZExFNjQoZCk7Ci0gICAgICB1aW50NjRfdCBTaXplID0gUmVhZFVuYWxpZ25lZExFNjQoZCk7CisgICAgICB0aW1lX3QgTW9kVGltZSA9IGVuZGlhbjo6cmVhZE5leHQ8dWludDY0X3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKTsKKyAgICAgIHVpbnQ2NF90IFNpemUgPSBlbmRpYW46OnJlYWROZXh0PHVpbnQ2NF90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CiAgICAgICByZXR1cm4gZGF0YV90eXBlKFNpemUsIE1vZFRpbWUsIFVuaXF1ZUlELCBJc0RpcmVjdG9yeSk7CiAgICAgfQogCkBAIC02NzUsMTkgKzcwNCwyMCBAQAogICB+UFRIU3RhdENhY2hlKCkge30KIAogICBMb29rdXBSZXN1bHQgZ2V0U3RhdChjb25zdCBjaGFyICpQYXRoLCBGaWxlRGF0YSAmRGF0YSwgYm9vbCBpc0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCAqRmlsZURlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgdmZzOjpGaWxlICoqRiwgdmZzOjpGaWxlU3lzdGVtICZGUykgb3ZlcnJpZGUgewogICAgIC8vIERvIHRoZSBsb29rdXAgZm9yIHRoZSBmaWxlJ3MgZGF0YSBpbiB0aGUgUFRIIGZpbGUuCiAgICAgQ2FjaGVUeTo6aXRlcmF0b3IgSSA9IENhY2hlLmZpbmQoUGF0aCk7CiAKICAgICAvLyBJZiB3ZSBkb24ndCBnZXQgYSBoaXQgaW4gdGhlIFBUSCBmaWxlIGp1c3QgZm9yd2FyZCB0byAnc3RhdCcuCiAgICAgaWYgKEkgPT0gQ2FjaGUuZW5kKCkpCi0gICAgICByZXR1cm4gc3RhdENoYWluZWQoUGF0aCwgRGF0YSwgaXNGaWxlLCBGaWxlRGVzY3JpcHRvcik7CisgICAgICByZXR1cm4gc3RhdENoYWluZWQoUGF0aCwgRGF0YSwgaXNGaWxlLCBGLCBGUyk7CiAKICAgICBjb25zdCBQVEhTdGF0RGF0YSAmRCA9ICpJOwogCiAgICAgaWYgKCFELkhhc0RhdGEpCiAgICAgICByZXR1cm4gQ2FjaGVNaXNzaW5nOwogCisgICAgRGF0YS5OYW1lID0gUGF0aDsKICAgICBEYXRhLlNpemUgPSBELlNpemU7CiAgICAgRGF0YS5Nb2RUaW1lID0gRC5Nb2RUaW1lOwogICAgIERhdGEuVW5pcXVlSUQgPSBELlVuaXF1ZUlEOwpkaWZmIC0tZ2l0IGEvbGliL0xleC9QcmFnbWEuY3BwIGIvbGliL0xleC9QcmFnbWEuY3BwCmluZGV4IGU0MDU5ZWUuLjk5YmE4ZGUgMTAwNjQ0Ci0tLSBhL2xpYi9MZXgvUHJhZ21hLmNwcAorKysgYi9saWIvTGV4L1ByYWdtYS5jcHAKQEAgLTQ4LDkgKzQ4LDcgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKIFByYWdtYU5hbWVzcGFjZTo6flByYWdtYU5hbWVzcGFjZSgpIHsKLSAgZm9yIChsbHZtOjpTdHJpbmdNYXA8UHJhZ21hSGFuZGxlcio+OjppdGVyYXRvcgotICAgICAgICAgSSA9IEhhbmRsZXJzLmJlZ2luKCksIEUgPSBIYW5kbGVycy5lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgZGVsZXRlIEktPnNlY29uZDsKKyAgbGx2bTo6RGVsZXRlQ29udGFpbmVyU2Vjb25kcyhIYW5kbGVycyk7CiB9CiAKIC8vLyBGaW5kSGFuZGxlciAtIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgaGFuZGxlciBmb3IgdGhlCkBAIC04MTIsOCArODEwLDggQEAKIC8vLyBQcmFnbWFPbmNlSGFuZGxlciAtICJcI3ByYWdtYSBvbmNlIiBtYXJrcyB0aGUgZmlsZSBhcyBhdG9taWNhbGx5IGluY2x1ZGVkLgogc3RydWN0IFByYWdtYU9uY2VIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewogICBQcmFnbWFPbmNlSGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigib25jZSIpIHt9Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmT25jZVRvaykgeworICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmT25jZVRvaykgb3ZlcnJpZGUgewogICAgIFBQLkNoZWNrRW5kT2ZEaXJlY3RpdmUoInByYWdtYSBvbmNlIik7CiAgICAgUFAuSGFuZGxlUHJhZ21hT25jZShPbmNlVG9rKTsKICAgfQpAQCAtODIzLDggKzgyMSw4IEBACiAvLy8gcmVzdCBvZiB0aGUgbGluZSBpcyBub3QgbGV4ZWQuCiBzdHJ1Y3QgUHJhZ21hTWFya0hhbmRsZXIgOiBwdWJsaWMgUHJhZ21hSGFuZGxlciB7CiAgIFByYWdtYU1hcmtIYW5kbGVyKCkgOiBQcmFnbWFIYW5kbGVyKCJtYXJrIikge30KLSAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZNYXJrVG9rKSB7CisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZNYXJrVG9rKSBvdmVycmlkZSB7CiAgICAgUFAuSGFuZGxlUHJhZ21hTWFyaygpOwogICB9CiB9OwpAQCAtODMyLDggKzgzMCw4IEBACiAvLy8gUHJhZ21hUG9pc29uSGFuZGxlciAtICJcI3ByYWdtYSBwb2lzb24geCIgbWFya3MgeCBhcyBub3QgdXNhYmxlLgogc3RydWN0IFByYWdtYVBvaXNvbkhhbmRsZXIgOiBwdWJsaWMgUHJhZ21hSGFuZGxlciB7CiAgIFByYWdtYVBvaXNvbkhhbmRsZXIoKSA6IFByYWdtYUhhbmRsZXIoInBvaXNvbiIpIHt9Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmUG9pc29uVG9rKSB7CisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZQb2lzb25Ub2spIG92ZXJyaWRlIHsKICAgICBQUC5IYW5kbGVQcmFnbWFQb2lzb24oUG9pc29uVG9rKTsKICAgfQogfTsKQEAgLTg0MiwyNCArODQwLDI0IEBACiAvLy8gYXMgYSBzeXN0ZW0gaGVhZGVyLCB3aGljaCBzaWxlbmNlcyB3YXJuaW5ncyBpbiBpdC4KIHN0cnVjdCBQcmFnbWFTeXN0ZW1IZWFkZXJIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewogICBQcmFnbWFTeXN0ZW1IZWFkZXJIYW5kbGVyKCkgOiBQcmFnbWFIYW5kbGVyKCJzeXN0ZW1faGVhZGVyIikge30KLSAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZTSFRva2VuKSB7CisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZTSFRva2VuKSBvdmVycmlkZSB7CiAgICAgUFAuSGFuZGxlUHJhZ21hU3lzdGVtSGVhZGVyKFNIVG9rZW4pOwogICAgIFBQLkNoZWNrRW5kT2ZEaXJlY3RpdmUoInByYWdtYSIpOwogICB9CiB9Owogc3RydWN0IFByYWdtYURlcGVuZGVuY3lIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewogICBQcmFnbWFEZXBlbmRlbmN5SGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigiZGVwZW5kZW5jeSIpIHt9Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRGVwVG9rZW4pIHsKKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkRlcFRva2VuKSBvdmVycmlkZSB7CiAgICAgUFAuSGFuZGxlUHJhZ21hRGVwZW5kZW5jeShEZXBUb2tlbik7CiAgIH0KIH07CiAKIHN0cnVjdCBQcmFnbWFEZWJ1Z0hhbmRsZXIgOiBwdWJsaWMgUHJhZ21hSGFuZGxlciB7CiAgIFByYWdtYURlYnVnSGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigiX19kZWJ1ZyIpIHt9Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRGVwVG9rZW4pIHsKKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkRlcFRva2VuKSBvdmVycmlkZSB7CiAgICAgVG9rZW4gVG9rOwogICAgIFBQLkxleFVuZXhwYW5kZWRUb2tlbihUb2spOwogICAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkgewpAQCAtOTI2LDggKzkyNCw5IEBACiAjaWZkZWYgX01TQ19WRVIKICAgICAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ3MTcpCiAjZW5kaWYKLSAgdm9pZCBEZWJ1Z092ZXJmbG93U3RhY2soKSB7Ci0gICAgRGVidWdPdmVyZmxvd1N0YWNrKCk7CisgIHN0YXRpYyB2b2lkIERlYnVnT3ZlcmZsb3dTdGFjaygpIHsKKyAgICB2b2lkICgqdm9sYXRpbGUgU2VsZikoKSA9IERlYnVnT3ZlcmZsb3dTdGFjazsKKyAgICBTZWxmKCk7CiAgIH0KICNpZmRlZiBfTVNDX1ZFUgogICAgICNwcmFnbWEgd2FybmluZyhkZWZhdWx0IDogNDcxNykKQEAgLTk0Miw4ICs5NDEsOCBAQAogcHVibGljOgogICBleHBsaWNpdCBQcmFnbWFEaWFnbm9zdGljSGFuZGxlcihjb25zdCBjaGFyICpOUykgOgogICAgIFByYWdtYUhhbmRsZXIoImRpYWdub3N0aWMiKSwgTmFtZXNwYWNlKE5TKSB7fQotICB2aXJ0dWFsIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkRpYWdUb2tlbikgeworICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRGlhZ1Rva2VuKSBvdmVycmlkZSB7CiAgICAgU291cmNlTG9jYXRpb24gRGlhZ0xvYyA9IERpYWdUb2tlbi5nZXRMb2NhdGlvbigpOwogICAgIFRva2VuIFRvazsKICAgICBQUC5MZXhVbmV4cGFuZGVkVG9rZW4oVG9rKTsKQEAgLTEwMDcsMzIgKzEwMDYsMTQgQEAKICAgfQogfTsKIAotLy8gUmV0dXJucyAtMSBvbiBmYWlsdXJlLgotc3RhdGljIGludCBMZXhTaW1wbGVJbnQoUHJlcHJvY2Vzc29yICZQUCwgVG9rZW4gJlRvaykgewotICBhc3NlcnQoVG9rLmlzKHRvazo6bnVtZXJpY19jb25zdGFudCkpOwotICBTbWFsbFN0cmluZzw4PiBJbnRlZ2VyQnVmZmVyOwotICBib29sIE51bWJlckludmFsaWQgPSBmYWxzZTsKLSAgU3RyaW5nUmVmIFNwZWxsaW5nID0gUFAuZ2V0U3BlbGxpbmcoVG9rLCBJbnRlZ2VyQnVmZmVyLCAmTnVtYmVySW52YWxpZCk7Ci0gIGlmIChOdW1iZXJJbnZhbGlkKQotICAgIHJldHVybiAtMTsKLSAgTnVtZXJpY0xpdGVyYWxQYXJzZXIgTGl0ZXJhbChTcGVsbGluZywgVG9rLmdldExvY2F0aW9uKCksIFBQKTsKLSAgaWYgKExpdGVyYWwuaGFkRXJyb3IgfHwgIUxpdGVyYWwuaXNJbnRlZ2VyTGl0ZXJhbCgpIHx8IExpdGVyYWwuaGFzVURTdWZmaXgoKSkKLSAgICByZXR1cm4gLTE7Ci0gIGxsdm06OkFQSW50IEFQVmFsKDMyLCAwKTsKLSAgaWYgKExpdGVyYWwuR2V0SW50ZWdlclZhbHVlKEFQVmFsKSkKLSAgICByZXR1cm4gLTE7Ci0gIFBQLkxleChUb2spOwotICByZXR1cm4gaW50KEFQVmFsLmdldExpbWl0ZWRWYWx1ZShJTlRfTUFYKSk7Ci19Ci0KIC8vLyAiXCNwcmFnbWEgd2FybmluZyguLi4pIi4gIE1TVkMncyBkaWFnbm9zdGljcyBkbyBub3QgbWFwIGNsZWFubHkgdG8gY2xhbmcncwogLy8vIGRpYWdub3N0aWNzLCBzbyB3ZSBkb24ndCByZWFsbHkgaW1wbGVtZW50IHRoaXMgcHJhZ21hLiAgV2UgcGFyc2UgaXQgYW5kCiAvLy8gaWdub3JlIGl0IHRvIGF2b2lkIC1XdW5rbm93bi1wcmFnbWEgd2FybmluZ3MuCiBzdHJ1Y3QgUHJhZ21hV2FybmluZ0hhbmRsZXIgOiBwdWJsaWMgUHJhZ21hSGFuZGxlciB7CiAgIFByYWdtYVdhcm5pbmdIYW5kbGVyKCkgOiBQcmFnbWFIYW5kbGVyKCJ3YXJuaW5nIikge30KIAotICB2aXJ0dWFsIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gJlRvaykgeworICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmVG9rKSBvdmVycmlkZSB7CiAgICAgLy8gUGFyc2UgdGhpbmdzIGxpa2U6CiAgICAgLy8gd2FybmluZyhwdXNoLCAxKQogICAgIC8vIHdhcm5pbmcocG9wKQpAQCAtMTA1OSw4ICsxMDQwLDEwIEBACiAgICAgICBQUC5MZXgoVG9rKTsKICAgICAgIGlmIChUb2suaXModG9rOjpjb21tYSkpIHsKICAgICAgICAgUFAuTGV4KFRvayk7Ci0gICAgICAgIGlmIChUb2suaXModG9rOjpudW1lcmljX2NvbnN0YW50KSkKLSAgICAgICAgICBMZXZlbCA9IExleFNpbXBsZUludChQUCwgVG9rKTsKKyAgICAgICAgdWludDY0X3QgVmFsdWU7CisgICAgICAgIGlmIChUb2suaXModG9rOjpudW1lcmljX2NvbnN0YW50KSAmJgorICAgICAgICAgICAgUFAucGFyc2VTaW1wbGVJbnRlZ2VyTGl0ZXJhbChUb2ssIFZhbHVlKSkKKyAgICAgICAgICBMZXZlbCA9IGludChWYWx1ZSk7CiAgICAgICAgIGlmIChMZXZlbCA8IDAgfHwgTGV2ZWwgPiA0KSB7CiAgICAgICAgICAgUFAuRGlhZyhUb2ssIGRpYWc6Ondhcm5fcHJhZ21hX3dhcm5pbmdfcHVzaF9sZXZlbCk7CiAgICAgICAgICAgcmV0dXJuOwpAQCAtMTEwNCwxMiArMTA4NywxMyBAQAogICAgICAgICBTbWFsbFZlY3RvcjxpbnQsIDQ+IElkczsKICAgICAgICAgUFAuTGV4KFRvayk7CiAgICAgICAgIHdoaWxlIChUb2suaXModG9rOjpudW1lcmljX2NvbnN0YW50KSkgewotICAgICAgICAgIGludCBJZCA9IExleFNpbXBsZUludChQUCwgVG9rKTsKLSAgICAgICAgICBpZiAoSWQgPD0gMCkgeworICAgICAgICAgIHVpbnQ2NF90IFZhbHVlOworICAgICAgICAgIGlmICghUFAucGFyc2VTaW1wbGVJbnRlZ2VyTGl0ZXJhbChUb2ssIFZhbHVlKSB8fCBWYWx1ZSA9PSAwIHx8CisgICAgICAgICAgICAgIFZhbHVlID4gSU5UX01BWCkgewogICAgICAgICAgICAgUFAuRGlhZyhUb2ssIGRpYWc6Ondhcm5fcHJhZ21hX3dhcm5pbmdfZXhwZWN0ZWRfbnVtYmVyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9Ci0gICAgICAgICAgSWRzLnB1c2hfYmFjayhJZCk7CisgICAgICAgICAgSWRzLnB1c2hfYmFjayhpbnQoVmFsdWUpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoQ2FsbGJhY2tzKQogICAgICAgICAgIENhbGxiYWNrcy0+UHJhZ21hV2FybmluZyhEaWFnTG9jLCBTcGVjaWZpZXIsIElkcyk7CkBAIC0xMTM1LDggKzExMTksOCBAQAogLy8vIFByYWdtYUluY2x1ZGVBbGlhc0hhbmRsZXIgLSAiXCNwcmFnbWEgaW5jbHVkZV9hbGlhcygiLi4uIikiLgogc3RydWN0IFByYWdtYUluY2x1ZGVBbGlhc0hhbmRsZXIgOiBwdWJsaWMgUHJhZ21hSGFuZGxlciB7CiAgIFByYWdtYUluY2x1ZGVBbGlhc0hhbmRsZXIoKSA6IFByYWdtYUhhbmRsZXIoImluY2x1ZGVfYWxpYXMiKSB7fQotICB2aXJ0dWFsIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkluY2x1ZGVBbGlhc1RvaykgeworICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmSW5jbHVkZUFsaWFzVG9rKSBvdmVycmlkZSB7CiAgICAgUFAuSGFuZGxlUHJhZ21hSW5jbHVkZUFsaWFzKEluY2x1ZGVBbGlhc1Rvayk7CiAgIH0KIH07CkBAIC0xMTc3LDggKzExNjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZXNwYWNlID0gU3RyaW5nUmVmKCkpCiAgICAgOiBQcmFnbWFIYW5kbGVyKFByYWdtYUtpbmQoS2luZCwgdHJ1ZSkpLCBLaW5kKEtpbmQpLCBOYW1lc3BhY2UoTmFtZXNwYWNlKSB7fQogCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmVG9rKSB7CisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZUb2spIG92ZXJyaWRlIHsKICAgICBTb3VyY2VMb2NhdGlvbiBNZXNzYWdlTG9jID0gVG9rLmdldExvY2F0aW9uKCk7CiAgICAgUFAuTGV4KFRvayk7CiAgICAgYm9vbCBFeHBlY3RDbG9zaW5nUGFyZW4gPSBmYWxzZTsKQEAgLTEyMzAsOCArMTIxNCw4IEBACiAvLy8gbWFjcm8gb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suCiBzdHJ1Y3QgUHJhZ21hUHVzaE1hY3JvSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKICAgUHJhZ21hUHVzaE1hY3JvSGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigicHVzaF9tYWNybyIpIHt9Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmUHVzaE1hY3JvVG9rKSB7CisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZQdXNoTWFjcm9Ub2spIG92ZXJyaWRlIHsKICAgICBQUC5IYW5kbGVQcmFnbWFQdXNoTWFjcm8oUHVzaE1hY3JvVG9rKTsKICAgfQogfTsKQEAgLTEyNDEsOCArMTIyNSw4IEBACiAvLy8gbWFjcm8gdG8gdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgogc3RydWN0IFByYWdtYVBvcE1hY3JvSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKICAgUHJhZ21hUG9wTWFjcm9IYW5kbGVyKCkgOiBQcmFnbWFIYW5kbGVyKCJwb3BfbWFjcm8iKSB7fQotICB2aXJ0dWFsIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gJlBvcE1hY3JvVG9rKSB7CisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZQb3BNYWNyb1Rvaykgb3ZlcnJpZGUgewogICAgIFBQLkhhbmRsZVByYWdtYVBvcE1hY3JvKFBvcE1hY3JvVG9rKTsKICAgfQogfTsKQEAgLTEyNTIsOCArMTIzNiw4IEBACiAvLy8gUHJhZ21hU1REQ19GRU5WX0FDQ0VTU0hhbmRsZXIgLSAiXCNwcmFnbWEgU1REQyBGRU5WX0FDQ0VTUyAuLi4iLgogc3RydWN0IFByYWdtYVNURENfRkVOVl9BQ0NFU1NIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewogICBQcmFnbWFTVERDX0ZFTlZfQUNDRVNTSGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigiRkVOVl9BQ0NFU1MiKSB7fQotICB2aXJ0dWFsIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gJlRvaykgeworICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmVG9rKSBvdmVycmlkZSB7CiAgICAgdG9rOjpPbk9mZlN3aXRjaCBPT1M7CiAgICAgaWYgKFBQLkxleE9uT2ZmU3dpdGNoKE9PUykpCiAgICAgIHJldHVybjsKQEAgLTEyNjYsOCArMTI1MCw4IEBACiBzdHJ1Y3QgUHJhZ21hU1REQ19DWF9MSU1JVEVEX1JBTkdFSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKICAgUHJhZ21hU1REQ19DWF9MSU1JVEVEX1JBTkdFSGFuZGxlcigpCiAgICAgOiBQcmFnbWFIYW5kbGVyKCJDWF9MSU1JVEVEX1JBTkdFIikge30KLSAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZUb2spIHsKKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJlRvaykgb3ZlcnJpZGUgewogICAgIHRvazo6T25PZmZTd2l0Y2ggT09TOwogICAgIFBQLkxleE9uT2ZmU3dpdGNoKE9PUyk7CiAgIH0KQEAgLTEyNzYsOCArMTI2MCw4IEBACiAvLy8gUHJhZ21hU1REQ19Vbmtub3duSGFuZGxlciAtICJcI3ByYWdtYSBTVERDIC4uLiIuCiBzdHJ1Y3QgUHJhZ21hU1REQ19Vbmtub3duSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKICAgUHJhZ21hU1REQ19Vbmtub3duSGFuZGxlcigpIHt9Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmVW5rbm93blRvaykgeworICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmVW5rbm93blRvaykgb3ZlcnJpZGUgewogICAgIC8vIEM5OSA2LjEwLjZwMiwgdW5rbm93biBmb3JtcyBhcmUgbm90IGFsbG93ZWQuCiAgICAgUFAuRGlhZyhVbmtub3duVG9rLCBkaWFnOjpleHRfc3RkY19wcmFnbWFfaWdub3JlZCk7CiAgIH0KQEAgLTEyODcsOCArMTI3MSw4IEBACiAvLy8gICBcI3ByYWdtYSBjbGFuZyBhcmNfY2ZfY29kZV9hdWRpdGVkIGJlZ2luL2VuZAogc3RydWN0IFByYWdtYUFSQ0NGQ29kZUF1ZGl0ZWRIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewogICBQcmFnbWFBUkNDRkNvZGVBdWRpdGVkSGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigiYXJjX2NmX2NvZGVfYXVkaXRlZCIpIHt9Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmTmFtZVRvaykgeworICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmTmFtZVRvaykgb3ZlcnJpZGUgewogICAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IE5hbWVUb2suZ2V0TG9jYXRpb24oKTsKICAgICBib29sIElzQmVnaW47CiAKQEAgLTEzNTEsOCArMTMzNSw4IEBACiBzdHJ1Y3QgUHJhZ21hUmVnaW9uSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKICAgUHJhZ21hUmVnaW9uSGFuZGxlcihjb25zdCBjaGFyICpwcmFnbWEpIDogUHJhZ21hSGFuZGxlcihwcmFnbWEpIHsgfQogCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmTmFtZVRvaykgeworICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmTmFtZVRvaykgb3ZlcnJpZGUgewogICAgIC8vICNwcmFnbWEgcmVnaW9uOiBlbmRyZWdpb24gbWF0Y2hlcyBjYW4gYmUgdmVyaWZpZWQKICAgICAvLyBfX3ByYWdtYShyZWdpb24pOiBubyBzZW5zZSwgYnV0IGlnbm9yZWQgYnkgbXN2YwogICAgIC8vIF9QcmFnbWEgaXMgbm90IHZhbGlkIGZvciBNU1ZDLCBidXQgdGhlcmUgaXNuJ3QgYW55IHBvaW50CmRpZmYgLS1naXQgYS9saWIvTGV4L1ByZXByb2Nlc3NpbmdSZWNvcmQuY3BwIGIvbGliL0xleC9QcmVwcm9jZXNzaW5nUmVjb3JkLmNwcAppbmRleCAwOTBhZWVkLi5kYjVhOWY5IDEwMDY0NAotLS0gYS9saWIvTGV4L1ByZXByb2Nlc3NpbmdSZWNvcmQuY3BwCisrKyBiL2xpYi9MZXgvUHJlcHJvY2Vzc2luZ1JlY29yZC5jcHAKQEAgLTQwNiw2ICs0MDYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICBNYWNyb05hbWVUb2suZ2V0TG9jYXRpb24oKSk7CiB9CiAKK3ZvaWQgUHJlcHJvY2Vzc2luZ1JlY29yZDo6U291cmNlUmFuZ2VTa2lwcGVkKFNvdXJjZVJhbmdlIFJhbmdlKSB7CisgIFNraXBwZWRSYW5nZXMucHVzaF9iYWNrKFJhbmdlKTsKK30KKwogdm9pZCBQcmVwcm9jZXNzaW5nUmVjb3JkOjpNYWNyb0V4cGFuZHMoY29uc3QgVG9rZW4gJklkLGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjcm9BcmdzICpBcmdzKSB7CmRpZmYgLS1naXQgYS9saWIvTGV4L1ByZXByb2Nlc3Nvci5jcHAgYi9saWIvTGV4L1ByZXByb2Nlc3Nvci5jcHAKaW5kZXggYjUwMGVmZS4uZDg1ZGYzOCAxMDA2NDQKLS0tIGEvbGliL0xleC9QcmVwcm9jZXNzb3IuY3BwCisrKyBiL2xpYi9MZXgvUHJlcHJvY2Vzc29yLmNwcApAQCAtMjYsNyArMjYsNiBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKLSNpbmNsdWRlICJjbGFuZy9MZXgvTWFjcm9BcmdzLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRmlsZU1hbmFnZXIuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIgpAQCAtMzUsNiArMzQsNyBAQAogI2luY2x1ZGUgImNsYW5nL0xleC9IZWFkZXJTZWFyY2guaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvTGV4RGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9MaXRlcmFsU3VwcG9ydC5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9NYWNyb0FyZ3MuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvTWFjcm9JbmZvLmgiCiAjaW5jbHVkZSAiY2xhbmcvTGV4L01vZHVsZUxvYWRlci5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9QcmFnbWEuaCIKQEAgLTQyLDggKzQyLDggQEAKICNpbmNsdWRlICJjbGFuZy9MZXgvUHJlcHJvY2Vzc29yT3B0aW9ucy5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9TY3JhdGNoQnVmZmVyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvQVBGbG9hdC5oIgotI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FwYWNpdHkuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29udmVydFVURi5oIgpAQCAtNTksMTYgKzU5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbmZvICp0YXJnZXQsIFNvdXJjZU1hbmFnZXIgJlNNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyU2VhcmNoICZIZWFkZXJzLCBNb2R1bGVMb2FkZXIgJlRoZU1vZHVsZUxvYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvTG9va3VwICpJSUxvb2t1cCwgYm9vbCBPd25zSGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVsYXlJbml0aWFsaXphdGlvbiwgYm9vbCBJbmNyUHJvY2Vzc2luZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVsYXlJbml0aWFsaXphdGlvbiwgYm9vbCBJbmNyUHJvY2Vzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uVW5pdEtpbmQgVFVLaW5kKQogICAgIDogUFBPcHRzKFBQT3B0cyksIERpYWdzKCZkaWFncyksIExhbmdPcHRzKG9wdHMpLCBUYXJnZXQodGFyZ2V0KSwKICAgICAgIEZpbGVNZ3IoSGVhZGVycy5nZXRGaWxlTWdyKCkpLCBTb3VyY2VNZ3IoU00pLCBIZWFkZXJJbmZvKEhlYWRlcnMpLAogICAgICAgVGhlTW9kdWxlTG9hZGVyKFRoZU1vZHVsZUxvYWRlciksIEV4dGVybmFsU291cmNlKDApLAogICAgICAgSWRlbnRpZmllcnMob3B0cywgSUlMb29rdXApLCBJbmNyZW1lbnRhbFByb2Nlc3NpbmcoSW5jclByb2Nlc3NpbmcpLAorICAgICAgVFVLaW5kKFRVS2luZCksCiAgICAgICBDb2RlQ29tcGxldGUoMCksIENvZGVDb21wbGV0aW9uRmlsZSgwKSwgQ29kZUNvbXBsZXRpb25PZmZzZXQoMCksCiAgICAgICBMYXN0VG9rZW5XYXNBdChmYWxzZSksIE1vZHVsZUltcG9ydEV4cGVjdHNJZGVudGlmaWVyKGZhbHNlKSwKICAgICAgIENvZGVDb21wbGV0aW9uUmVhY2hlZCgwKSwgU2tpcE1haW5GaWxlUHJlYW1ibGUoMCwgdHJ1ZSksIEN1clBQTGV4ZXIoMCksCi0gICAgICBDdXJEaXJMb29rdXAoMCksIEN1ckxleGVyS2luZChDTEtfTGV4ZXIpLCBDYWxsYmFja3MoMCksCi0gICAgICBNYWNyb0FyZ0NhY2hlKDApLCBSZWNvcmQoMCksIE1JQ2hhaW5IZWFkKDApLCBNSUNhY2hlKDApLAorICAgICAgQ3VyRGlyTG9va3VwKDApLCBDdXJMZXhlcktpbmQoQ0xLX0xleGVyKSwgQ3VyU3VibW9kdWxlKDApLAorICAgICAgQ2FsbGJhY2tzKDApLCBNYWNyb0FyZ0NhY2hlKDApLCBSZWNvcmQoMCksIE1JQ2hhaW5IZWFkKDApLCBNSUNhY2hlKDApLAogICAgICAgRGVzZXJpYWxNSUNoYWluSGVhZCgwKSB7CiAgIE93bnNIZWFkZXJTZWFyY2ggPSBPd25zSGVhZGVyczsKICAgCkBAIC0xNDEsMTEgKzE0Myw3IEBACiBQcmVwcm9jZXNzb3I6On5QcmVwcm9jZXNzb3IoKSB7CiAgIGFzc2VydChCYWNrdHJhY2tQb3NpdGlvbnMuZW1wdHkoKSAmJiAiRW5hYmxlQmFja3RyYWNrL0JhY2t0cmFjayBpbWJhbGFuY2UhIik7CiAKLSAgd2hpbGUgKCFJbmNsdWRlTWFjcm9TdGFjay5lbXB0eSgpKSB7Ci0gICAgZGVsZXRlIEluY2x1ZGVNYWNyb1N0YWNrLmJhY2soKS5UaGVMZXhlcjsKLSAgICBkZWxldGUgSW5jbHVkZU1hY3JvU3RhY2suYmFjaygpLlRoZVRva2VuTGV4ZXI7Ci0gICAgSW5jbHVkZU1hY3JvU3RhY2sucG9wX2JhY2soKTsKLSAgfQorICBJbmNsdWRlTWFjcm9TdGFjay5jbGVhcigpOwogCiAgIC8vIEZyZWUgYW55IG1hY3JvIGRlZmluaXRpb25zLgogICBmb3IgKE1hY3JvSW5mb0NoYWluICpJID0gTUlDaGFpbkhlYWQgOyBJIDsgSSA9IEktPk5leHQpCkBAIC01MDMsNDggKzUwMSw2IEBACiAvLyBMZXhlciBFdmVudCBIYW5kbGluZy4KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKLXN0YXRpYyB2b2lkIGFwcGVuZENvZGVQb2ludCh1bnNpZ25lZCBDb2RlcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPGNoYXI+ICZTdHIpIHsKLSAgY2hhciBSZXN1bHRCdWZbNF07Ci0gIGNoYXIgKlJlc3VsdFB0ciA9IFJlc3VsdEJ1ZjsKLSAgYm9vbCBSZXMgPSBsbHZtOjpDb252ZXJ0Q29kZVBvaW50VG9VVEY4KENvZGVwb2ludCwgUmVzdWx0UHRyKTsKLSAgKHZvaWQpUmVzOwotICBhc3NlcnQoUmVzICYmICJVbmV4cGVjdGVkIGNvbnZlcnNpb24gZmFpbHVyZSIpOwotICBTdHIuYXBwZW5kKFJlc3VsdEJ1ZiwgUmVzdWx0UHRyKTsKLX0KLQotc3RhdGljIHZvaWQgZXhwYW5kVUNOcyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkJ1ZiwgU3RyaW5nUmVmIElucHV0KSB7Ci0gIGZvciAoU3RyaW5nUmVmOjppdGVyYXRvciBJID0gSW5wdXQuYmVnaW4oKSwgRSA9IElucHV0LmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGlmICgqSSAhPSAnXFwnKSB7Ci0gICAgICBCdWYucHVzaF9iYWNrKCpJKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgICsrSTsKLSAgICBhc3NlcnQoKkkgPT0gJ3UnIHx8ICpJID09ICdVJyk7Ci0KLSAgICB1bnNpZ25lZCBOdW1IZXhEaWdpdHM7Ci0gICAgaWYgKCpJID09ICd1JykKLSAgICAgIE51bUhleERpZ2l0cyA9IDQ7Ci0gICAgZWxzZQotICAgICAgTnVtSGV4RGlnaXRzID0gODsKLQotICAgIGFzc2VydChJICsgTnVtSGV4RGlnaXRzIDw9IEUpOwotCi0gICAgdWludDMyX3QgQ29kZVBvaW50ID0gMDsKLSAgICBmb3IgKCsrSTsgTnVtSGV4RGlnaXRzICE9IDA7ICsrSSwgLS1OdW1IZXhEaWdpdHMpIHsKLSAgICAgIHVuc2lnbmVkIFZhbHVlID0gbGx2bTo6aGV4RGlnaXRWYWx1ZSgqSSk7Ci0gICAgICBhc3NlcnQoVmFsdWUgIT0gLTFVKTsKLQotICAgICAgQ29kZVBvaW50IDw8PSA0OwotICAgICAgQ29kZVBvaW50ICs9IFZhbHVlOwotICAgIH0KLQotICAgIGFwcGVuZENvZGVQb2ludChDb2RlUG9pbnQsIEJ1Zik7Ci0gICAgLS1JOwotICB9Ci19Ci0KIC8vLyBMb29rVXBJZGVudGlmaWVySW5mbyAtIEdpdmVuIGEgdG9rOjpyYXdfaWRlbnRpZmllciB0b2tlbiwgbG9vayB1cCB0aGUKIC8vLyBpZGVudGlmaWVyIGluZm9ybWF0aW9uIGZvciB0aGUgdG9rZW4gYW5kIGluc3RhbGwgaXQgaW50byB0aGUgdG9rZW4sCiAvLy8gdXBkYXRpbmcgdGhlIHRva2VuIGtpbmQgYWNjb3JkaW5nbHkuCkBAIC02NjksNyArNjI1LDcgQEAKICAgLy8gbmFtZSBvZiBhIG1hY3JvLgogICAvLyBGSVhNRTogVGhpcyB3YXJuaW5nIGlzIGRpc2FibGVkIGluIGNhc2VzIHdoZXJlIGl0IHNob3VsZG4ndCBiZSwgbGlrZQogICAvLyAgICIjZGVmaW5lIGNvbnN0ZXhwciBjb25zdGV4cHIiLCAiaW50IGNvbnN0ZXhwcjsiCi0gIGlmIChJSS5pc0NYWDExQ29tcGF0S2V5d29yZCgpICYgIURpc2FibGVNYWNyb0V4cGFuc2lvbikgeworICBpZiAoSUkuaXNDWFgxMUNvbXBhdEtleXdvcmQoKSAmJiAhRGlzYWJsZU1hY3JvRXhwYW5zaW9uKSB7CiAgICAgRGlhZyhJZGVudGlmaWVyLCBkaWFnOjp3YXJuX2N4eDExX2tleXdvcmQpIDw8IElJLmdldE5hbWUoKTsKICAgICAvLyBEb24ndCBkaWFnbm9zZSB0aGlzIGtleXdvcmQgYWdhaW4gaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0LgogICAgIElJLnNldElzQ1hYMTFDb21wYXRLZXl3b3JkKGZhbHNlKTsKQEAgLTgxOSw2ICs3NzUsMjQgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgUHJlcHJvY2Vzc29yOjpwYXJzZVNpbXBsZUludGVnZXJMaXRlcmFsKFRva2VuICZUb2ssIHVpbnQ2NF90ICZWYWx1ZSkgeworICBhc3NlcnQoVG9rLmlzKHRvazo6bnVtZXJpY19jb25zdGFudCkpOworICBTbWFsbFN0cmluZzw4PiBJbnRlZ2VyQnVmZmVyOworICBib29sIE51bWJlckludmFsaWQgPSBmYWxzZTsKKyAgU3RyaW5nUmVmIFNwZWxsaW5nID0gZ2V0U3BlbGxpbmcoVG9rLCBJbnRlZ2VyQnVmZmVyLCAmTnVtYmVySW52YWxpZCk7CisgIGlmIChOdW1iZXJJbnZhbGlkKQorICAgIHJldHVybiBmYWxzZTsKKyAgTnVtZXJpY0xpdGVyYWxQYXJzZXIgTGl0ZXJhbChTcGVsbGluZywgVG9rLmdldExvY2F0aW9uKCksICp0aGlzKTsKKyAgaWYgKExpdGVyYWwuaGFkRXJyb3IgfHwgIUxpdGVyYWwuaXNJbnRlZ2VyTGl0ZXJhbCgpIHx8IExpdGVyYWwuaGFzVURTdWZmaXgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGxsdm06OkFQSW50IEFQVmFsKDY0LCAwKTsKKyAgaWYgKExpdGVyYWwuR2V0SW50ZWdlclZhbHVlKEFQVmFsKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIExleChUb2spOworICBWYWx1ZSA9IEFQVmFsLmdldExpbWl0ZWRWYWx1ZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBQcmVwcm9jZXNzb3I6OmFkZENvbW1lbnRIYW5kbGVyKENvbW1lbnRIYW5kbGVyICpIYW5kbGVyKSB7CiAgIGFzc2VydChIYW5kbGVyICYmICJOVUxMIGNvbW1lbnQgaGFuZGxlciIpOwogICBhc3NlcnQoc3RkOjpmaW5kKENvbW1lbnRIYW5kbGVycy5iZWdpbigpLCBDb21tZW50SGFuZGxlcnMuZW5kKCksIEhhbmRsZXIpID09CmRpZmYgLS1naXQgYS9saWIvTGV4L1Rva2VuTGV4ZXIuY3BwIGIvbGliL0xleC9Ub2tlbkxleGVyLmNwcAppbmRleCAwMjEzYWZjLi40MGU5NzA3IDEwMDY0NAotLS0gYS9saWIvTGV4L1Rva2VuTGV4ZXIuY3BwCisrKyBiL2xpYi9MZXgvVG9rZW5MZXhlci5jcHAKQEAgLTEyLDkgKzEyLDkgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJjbGFuZy9MZXgvVG9rZW5MZXhlci5oIgotI2luY2x1ZGUgImNsYW5nL0xleC9NYWNyb0FyZ3MuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvTGV4L0xleERpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9MZXgvTWFjcm9BcmdzLmgiCiAjaW5jbHVkZSAiY2xhbmcvTGV4L01hY3JvSW5mby5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgpAQCAtMzcsNiArMzcsNyBAQAogICBFeHBhbmRMb2NFbmQgPSBFTEVuZDsKICAgQXRTdGFydE9mTGluZSA9IFRvay5pc0F0U3RhcnRPZkxpbmUoKTsKICAgSGFzTGVhZGluZ1NwYWNlID0gVG9rLmhhc0xlYWRpbmdTcGFjZSgpOworICBOZXh0VG9rR2V0c1NwYWNlID0gZmFsc2U7CiAgIFRva2VucyA9ICYqTWFjcm8tPnRva2Vuc19iZWdpbigpOwogICBPd25zVG9rZW5zID0gZmFsc2U7CiAgIERpc2FibGVNYWNyb0V4cGFuc2lvbiA9IGZhbHNlOwpAQCAtOTUsNiArOTYsNyBAQAogICBFeHBhbmRMb2NTdGFydCA9IEV4cGFuZExvY0VuZCA9IFNvdXJjZUxvY2F0aW9uKCk7CiAgIEF0U3RhcnRPZkxpbmUgPSBmYWxzZTsKICAgSGFzTGVhZGluZ1NwYWNlID0gZmFsc2U7CisgIE5leHRUb2tHZXRzU3BhY2UgPSBmYWxzZTsKICAgTWFjcm9FeHBhbnNpb25TdGFydCA9IFNvdXJjZUxvY2F0aW9uKCk7CiAKICAgLy8gU2V0IEhhc0xlYWRpbmdTcGFjZS9BdFN0YXJ0T2ZMaW5lIHNvIHRoYXQgdGhlIGZpcnN0IHRva2VuIHdpbGwgYmUKQEAgLTExOSwxMyArMTIxLDEwIEBACiAgIGlmIChBY3R1YWxBcmdzKSBBY3R1YWxBcmdzLT5kZXN0cm95KFBQKTsKIH0KIAotLy8vIFJlbW92ZSBjb21tYSBhaGVhZCBvZiBfX1ZBX0FSR1NfXywgaWYgcHJlc2VudCwgYWNjb3JkaW5nIHRvIGNvbXBpbGVyIGRpYWxlY3QKLS8vLyBzZXR0aW5ncy4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tbWEgaXMgcmVtb3ZlZC4KLXN0YXRpYyBib29sIE1heWJlUmVtb3ZlQ29tbWFCZWZvcmVWYUFyZ3MoU21hbGxWZWN0b3JJbXBsPFRva2VuPiAmUmVzdWx0VG9rcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmTmV4dFRva0dldHNTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNQYXN0ZU9wZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb0luZm8gKk1hY3JvLCB1bnNpZ25lZCBNYWNyb0FyZ05vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3IgJlBQKSB7Citib29sIFRva2VuTGV4ZXI6Ok1heWJlUmVtb3ZlQ29tbWFCZWZvcmVWYUFyZ3MoU21hbGxWZWN0b3JJbXBsPFRva2VuPiAmUmVzdWx0VG9rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1Bhc3RlT3BlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm9JbmZvICpNYWNybywgdW5zaWduZWQgTWFjcm9BcmdObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3IgJlBQKSB7CiAgIC8vIElzIHRoZSBtYWNybyBhcmd1bWVudCBfX1ZBX0FSR1NfXz8KICAgaWYgKCFNYWNyby0+aXNWYXJpYWRpYygpIHx8IE1hY3JvQXJnTm8gIT0gTWFjcm8tPmdldE51bUFyZ3MoKS0xKQogICAgIHJldHVybiBmYWxzZTsKQEAgLTEzMyw3ICsxMzIsNyBAQAogICAvLyBJbiBNaWNyb3NvZnQtY29tcGF0aWJpbGl0eSBtb2RlLCBhIGNvbW1hIGlzIHJlbW92ZWQgaW4gdGhlIGV4cGFuc2lvbgogICAvLyBvZiAiIC4uLiAsIF9fVkFfQVJHU19fICIgaWYgX19WQV9BUkdTX18gaXMgZW1wdHkuICBUaGlzIGV4dGVuc2lvbiBpcwogICAvLyBub3Qgc3VwcG9ydGVkIGJ5IGdjYy4KLSAgaWYgKCFIYXNQYXN0ZU9wZXJhdG9yICYmICFQUC5nZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUpCisgIGlmICghSGFzUGFzdGVPcGVyYXRvciAmJiAhUFAuZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0KQogICAgIHJldHVybiBmYWxzZTsKIAogICAvLyBHQ0MgcmVtb3ZlcyB0aGUgY29tbWEgaW4gdGhlIGV4cGFuc2lvbiBvZiAiIC4uLiAsICMjIF9fVkFfQVJHU19fICIgaWYKQEAgLTE3OSwxNiArMTc4LDE0IEBACiAgIC8vIHdlIGluc3RhbGwgdGhlIG5ld2x5IGV4cGFuZGVkIHNlcXVlbmNlIGFzIHRoZSBuZXcgJ1Rva2VucycgbGlzdC4KICAgYm9vbCBNYWRlQ2hhbmdlID0gZmFsc2U7CiAKLSAgLy8gTmV4dFRva0dldHNTcGFjZSAtIFdoZW4gdGhpcyBpcyB0cnVlLCB0aGUgbmV4dCB0b2tlbiBhcHBlbmRlZCB0byB0aGUKLSAgLy8gb3V0cHV0IGxpc3Qgd2lsbCBnZXQgYSBsZWFkaW5nIHNwYWNlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaGFkIG9uZSB0bwotICAvLyBiZWdpbiB3aXRoIG9yIG5vdC4gIFRoaXMgaXMgdXNlZCBmb3IgcGxhY2VtYXJrZXIgc3VwcG9ydC4KLSAgYm9vbCBOZXh0VG9rR2V0c1NwYWNlID0gZmFsc2U7Ci0KICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE51bVRva2VuczsgaSAhPSBlOyArK2kpIHsKICAgICAvLyBJZiB3ZSBmb3VuZCB0aGUgc3RyaW5naWZ5IG9wZXJhdG9yLCBnZXQgdGhlIGFyZ3VtZW50IHN0cmluZ2lmaWVkLiAgVGhlCiAgICAgLy8gcHJlcHJvY2Vzc29yIGFscmVhZHkgdmVyaWZpZWQgdGhhdCB0aGUgZm9sbG93aW5nIHRva2VuIGlzIGEgbWFjcm8gbmFtZQogICAgIC8vIHdoZW4gdGhlICNkZWZpbmUgd2FzIHBhcnNlZC4KICAgICBjb25zdCBUb2tlbiAmQ3VyVG9rID0gVG9rZW5zW2ldOworICAgIGlmIChpICE9IDAgJiYgIVRva2Vuc1tpLTFdLmlzKHRvazo6aGFzaGhhc2gpICYmIEN1clRvay5oYXNMZWFkaW5nU3BhY2UoKSkKKyAgICAgIE5leHRUb2tHZXRzU3BhY2UgPSB0cnVlOworCiAgICAgaWYgKEN1clRvay5pcyh0b2s6Omhhc2gpIHx8IEN1clRvay5pcyh0b2s6Omhhc2hhdCkpIHsKICAgICAgIGludCBBcmdObyA9IE1hY3JvLT5nZXRBcmd1bWVudE51bShUb2tlbnNbaSsxXS5nZXRJZGVudGlmaWVySW5mbygpKTsKICAgICAgIGFzc2VydChBcmdObyAhPSAtMSAmJiAiVG9rZW4gZm9sbG93aW5nICMgaXMgbm90IGFuIGFyZ3VtZW50PyIpOwpAQCAtMjEzLDcgKzIxMCw3IEBACiAKICAgICAgIC8vIFRoZSBzdHJpbmdpZmllZC9jaGFyaWZpZWQgc3RyaW5nIGxlYWRpbmcgc3BhY2UgZmxhZyBnZXRzIHNldCB0byBtYXRjaAogICAgICAgLy8gdGhlICMvI0Agb3BlcmF0b3IuCi0gICAgICBpZiAoQ3VyVG9rLmhhc0xlYWRpbmdTcGFjZSgpIHx8IE5leHRUb2tHZXRzU3BhY2UpCisgICAgICBpZiAoTmV4dFRva0dldHNTcGFjZSkKICAgICAgICAgUmVzLnNldEZsYWcoVG9rZW46OkxlYWRpbmdTcGFjZSk7CiAKICAgICAgIFJlc3VsdFRva3MucHVzaF9iYWNrKFJlcyk7CkBAIC0yMjMsNiArMjIwLDEzIEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAKKyAgICAvLyBGaW5kIG91dCBpZiB0aGVyZSBpcyBhIHBhc3RlICgjIykgb3BlcmF0b3IgYmVmb3JlIG9yIGFmdGVyIHRoZSB0b2tlbi4KKyAgICBib29sIE5vbkVtcHR5UGFzdGVCZWZvcmUgPQorICAgICAgIVJlc3VsdFRva3MuZW1wdHkoKSAmJiBSZXN1bHRUb2tzLmJhY2soKS5pcyh0b2s6Omhhc2hoYXNoKTsKKyAgICBib29sIFBhc3RlQmVmb3JlID0gaSAhPSAwICYmIFRva2Vuc1tpLTFdLmlzKHRvazo6aGFzaGhhc2gpOworICAgIGJvb2wgUGFzdGVBZnRlciA9IGkrMSAhPSBlICYmIFRva2Vuc1tpKzFdLmlzKHRvazo6aGFzaGhhc2gpOworICAgIGFzc2VydCghTm9uRW1wdHlQYXN0ZUJlZm9yZSB8fCBQYXN0ZUJlZm9yZSk7CisKICAgICAvLyBPdGhlcndpc2UsIGlmIHRoaXMgaXMgbm90IGFuIGFyZ3VtZW50IHRva2VuLCBqdXN0IGFkZCB0aGUgdG9rZW4gdG8gdGhlCiAgICAgLy8gb3V0cHV0IGJ1ZmZlci4KICAgICBJZGVudGlmaWVySW5mbyAqSUkgPSBDdXJUb2suZ2V0SWRlbnRpZmllckluZm8oKTsKQEAgLTIzNCw3ICsyMzgsOSBAQAogICAgICAgaWYgKE5leHRUb2tHZXRzU3BhY2UpIHsKICAgICAgICAgUmVzdWx0VG9rcy5iYWNrKCkuc2V0RmxhZyhUb2tlbjo6TGVhZGluZ1NwYWNlKTsKICAgICAgICAgTmV4dFRva0dldHNTcGFjZSA9IGZhbHNlOwotICAgICAgfQorICAgICAgfSBlbHNlIGlmIChQYXN0ZUJlZm9yZSAmJiAhTm9uRW1wdHlQYXN0ZUJlZm9yZSkKKyAgICAgICAgUmVzdWx0VG9rcy5iYWNrKCkuY2xlYXJGbGFnKFRva2VuOjpMZWFkaW5nU3BhY2UpOworCiAgICAgICBjb250aW51ZTsKICAgICB9CiAKQEAgLTI0MiwxOCArMjQ4LDEyIEBACiAgICAgLy8gaW5wdXQuCiAgICAgTWFkZUNoYW5nZSA9IHRydWU7CiAKLSAgICAvLyBPdGhlcndpc2UsIHRoaXMgaXMgYSB1c2Ugb2YgdGhlIGFyZ3VtZW50LiAgRmluZCBvdXQgaWYgdGhlcmUgaXMgYSBwYXN0ZQotICAgIC8vICgjIykgb3BlcmF0b3IgYmVmb3JlIG9yIGFmdGVyIHRoZSBhcmd1bWVudC4KLSAgICBib29sIE5vbkVtcHR5UGFzdGVCZWZvcmUgPQotICAgICAgIVJlc3VsdFRva3MuZW1wdHkoKSAmJiBSZXN1bHRUb2tzLmJhY2soKS5pcyh0b2s6Omhhc2hoYXNoKTsKLSAgICBib29sIFBhc3RlQmVmb3JlID0gaSAhPSAwICYmIFRva2Vuc1tpLTFdLmlzKHRvazo6aGFzaGhhc2gpOwotICAgIGJvb2wgUGFzdGVBZnRlciA9IGkrMSAhPSBlICYmIFRva2Vuc1tpKzFdLmlzKHRvazo6aGFzaGhhc2gpOwotICAgIGFzc2VydCghTm9uRW1wdHlQYXN0ZUJlZm9yZSB8fCBQYXN0ZUJlZm9yZSk7CisgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgdXNlIG9mIHRoZSBhcmd1bWVudC4KIAogICAgIC8vIEluIE1pY3Jvc29mdCBtb2RlLCByZW1vdmUgdGhlIGNvbW1hIGJlZm9yZSBfX1ZBX0FSR1NfXyB0byBlbnN1cmUgdGhlcmUKICAgICAvLyBhcmUgbm8gdHJhaWxpbmcgY29tbWFzIGlmIF9fVkFfQVJHU19fIGlzIGVtcHR5LgogICAgIGlmICghUGFzdGVCZWZvcmUgJiYgQWN0dWFsQXJncy0+aXNWYXJhcmdzRWxpZGVkVXNlKCkgJiYKLSAgICAgICAgTWF5YmVSZW1vdmVDb21tYUJlZm9yZVZhQXJncyhSZXN1bHRUb2tzLCBOZXh0VG9rR2V0c1NwYWNlLAorICAgICAgICBNYXliZVJlbW92ZUNvbW1hQmVmb3JlVmFBcmdzKFJlc3VsdFRva3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypIYXNQYXN0ZU9wZXJhdG9yPSovZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm8sIEFyZ05vLCBQUCkpCiAgICAgICBjb250aW51ZTsKQEAgLTI4Miw3ICsyODIsNyBAQAogICAgICAgICAvLyBiZWhhdmlvciBieSBub3QgY29uc2lkZXJpbmcgc2luZ2xlIGNvbW1hcyBmcm9tIG5lc3RlZCBtYWNybwogICAgICAgICAvLyBleHBhbnNpb25zIGFzIGFyZ3VtZW50IHNlcGFyYXRvcnMuIFNldCBhIGZsYWcgb24gdGhlIHRva2VuIHNvIHdlIGNhbgogICAgICAgICAvLyB0ZXN0IGZvciB0aGlzIGxhdGVyIHdoZW4gdGhlIG1hY3JvIGV4cGFuc2lvbiBpcyBwcm9jZXNzZWQuCi0gICAgICAgIGlmIChQUC5nZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUgJiYgTnVtVG9rcyA9PSAxICYmCisgICAgICAgIGlmIChQUC5nZXRMYW5nT3B0cygpLk1TVkNDb21wYXQgJiYgTnVtVG9rcyA9PSAxICYmCiAgICAgICAgICAgICBSZXN1bHRUb2tzLmJhY2soKS5pcyh0b2s6OmNvbW1hKSkKICAgICAgICAgICBSZXN1bHRUb2tzLmJhY2soKS5zZXRGbGFnKFRva2VuOjpJZ25vcmVkQ29tbWEpOwogCkBAIC0zMDQsMTMgKzMwNCw4IEBACiAgICAgICAgIC8vIGJlZm9yZSB0aGUgZmlyc3QgdG9rZW4gc2hvdWxkIG1hdGNoIHRoZSB3aGl0ZXNwYWNlIG9mIHRoZSBhcmcKICAgICAgICAgLy8gaWRlbnRpZmllci4KICAgICAgICAgUmVzdWx0VG9rc1tGaXJzdFJlc3VsdF0uc2V0RmxhZ1ZhbHVlKFRva2VuOjpMZWFkaW5nU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJUb2suaGFzTGVhZGluZ1NwYWNlKCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHRUb2tHZXRzU3BhY2UpOwogICAgICAgICBOZXh0VG9rR2V0c1NwYWNlID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGVtcHR5IGFyZ3VtZW50LCBhbmQgaWYgdGhlcmUgd2FzIHdoaXRlc3BhY2UgYmVmb3JlIHRoZQotICAgICAgICAvLyBmb3JtYWwgdG9rZW4sIG1ha2Ugc3VyZSB0aGUgbmV4dCB0b2tlbiBnZXRzIHdoaXRlc3BhY2UgYmVmb3JlIGl0LgotICAgICAgICBOZXh0VG9rR2V0c1NwYWNlID0gQ3VyVG9rLmhhc0xlYWRpbmdTcGFjZSgpOwogICAgICAgfQogICAgICAgY29udGludWU7CiAgICAgfQpAQCAtMzU4LDggKzM1Myw3IEBACiAgICAgICAvLyBhc3NlbWJsZXItd2l0aC1jcHAgbW9kZSwgaW52YWxpZCBwYXN0ZXMgYXJlIGFsbG93ZWQgdGhyb3VnaDogaW4gdGhpcwogICAgICAgLy8gY2FzZSwgd2UgZG8gbm90IHdhbnQgdGhlIGV4dHJhIHdoaXRlc3BhY2UgdG8gYmUgYWRkZWQuICBGb3IgZXhhbXBsZSwKICAgICAgIC8vIHdlIHdhbnQgIi4gIyMgZm9vIiAtPiAiLmZvbyIgbm90ICIuIGZvbyIuCi0gICAgICBpZiAoKEN1clRvay5oYXNMZWFkaW5nU3BhY2UoKSB8fCBOZXh0VG9rR2V0c1NwYWNlKSAmJgotICAgICAgICAgICFOb25FbXB0eVBhc3RlQmVmb3JlKQorICAgICAgaWYgKE5leHRUb2tHZXRzU3BhY2UpCiAgICAgICAgIFJlc3VsdFRva3NbUmVzdWx0VG9rcy5zaXplKCktTnVtVG9rc10uc2V0RmxhZyhUb2tlbjo6TGVhZGluZ1NwYWNlKTsKIAogICAgICAgTmV4dFRva0dldHNTcGFjZSA9IGZhbHNlOwpAQCAtMzcwLDExICszNjQsOSBAQAogICAgIC8vIDYuMTAuMy4zcDIsMykgY2FsbHMgZm9yIGEgYnVuY2ggb2YgcGxhY2VtYXJrZXIgc3R1ZmYgdG8gb2NjdXIuICBXZQogICAgIC8vIGltcGxlbWVudCB0aGlzIGJ5IGVhdGluZyAjIyBvcGVyYXRvcnMgd2hlbiBhIExIUyBvciBSSFMgZXhwYW5kcyB0bwogICAgIC8vIGVtcHR5LgotICAgIE5leHRUb2tHZXRzU3BhY2UgfD0gQ3VyVG9rLmhhc0xlYWRpbmdTcGFjZSgpOwogICAgIGlmIChQYXN0ZUFmdGVyKSB7CiAgICAgICAvLyBEaXNjYXJkIHRoZSBhcmd1bWVudCB0b2tlbiBhbmQgc2tpcCAoZG9uJ3QgY29weSB0byB0aGUgZXhwYW5zaW9uCiAgICAgICAvLyBidWZmZXIpIHRoZSBwYXN0ZSBvcGVyYXRvciBhZnRlciBpdC4KLSAgICAgIE5leHRUb2tHZXRzU3BhY2UgfD0gVG9rZW5zW2krMV0uaGFzTGVhZGluZ1NwYWNlKCk7CiAgICAgICArK2k7CiAgICAgICBjb250aW51ZTsKICAgICB9CkBAIC0zODUsNyArMzc3LDcgQEAKICAgICBhc3NlcnQoUGFzdGVCZWZvcmUpOwogICAgIGlmIChOb25FbXB0eVBhc3RlQmVmb3JlKSB7CiAgICAgICBhc3NlcnQoUmVzdWx0VG9rcy5iYWNrKCkuaXModG9rOjpoYXNoaGFzaCkpOwotICAgICAgTmV4dFRva0dldHNTcGFjZSB8PSBSZXN1bHRUb2tzLnBvcF9iYWNrX3ZhbCgpLmhhc0xlYWRpbmdTcGFjZSgpOworICAgICAgUmVzdWx0VG9rcy5wb3BfYmFjaygpOwogICAgIH0KIAogICAgIC8vIElmIHRoaXMgaXMgdGhlIF9fVkFfQVJHU19fIHRva2VuLCBhbmQgaWYgdGhlIGFyZ3VtZW50IHdhc24ndCBwcm92aWRlZCwKQEAgLTM5Myw3ICszODUsNyBAQAogICAgIC8vIHRoZSAjIyB3YXMgYSBjb21tYSwgcmVtb3ZlIHRoZSBjb21tYS4gIFRoaXMgaXMgYSBHQ0MgZXh0ZW5zaW9uIHdoaWNoIGlzCiAgICAgLy8gZGlzYWJsZWQgd2hlbiB1c2luZyAtc3RkPWM5OS4KICAgICBpZiAoQWN0dWFsQXJncy0+aXNWYXJhcmdzRWxpZGVkVXNlKCkpCi0gICAgICBNYXliZVJlbW92ZUNvbW1hQmVmb3JlVmFBcmdzKFJlc3VsdFRva3MsIE5leHRUb2tHZXRzU3BhY2UsCisgICAgICBNYXliZVJlbW92ZUNvbW1hQmVmb3JlVmFBcmdzKFJlc3VsdFRva3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSGFzUGFzdGVPcGVyYXRvcj0qL3RydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvLCBBcmdObywgUFApOwogCkBAIC00MjUsNyArNDE3LDcgQEAKIAogICAgIFRvay5zdGFydFRva2VuKCk7CiAgICAgVG9rLnNldEZsYWdWYWx1ZShUb2tlbjo6U3RhcnRPZkxpbmUgLCBBdFN0YXJ0T2ZMaW5lKTsKLSAgICBUb2suc2V0RmxhZ1ZhbHVlKFRva2VuOjpMZWFkaW5nU3BhY2UsIEhhc0xlYWRpbmdTcGFjZSk7CisgICAgVG9rLnNldEZsYWdWYWx1ZShUb2tlbjo6TGVhZGluZ1NwYWNlLCBIYXNMZWFkaW5nU3BhY2UgfHwgTmV4dFRva0dldHNTcGFjZSk7CiAgICAgaWYgKEN1clRva2VuID09IDApCiAgICAgICBUb2suc2V0RmxhZyhUb2tlbjo6TGVhZGluZ0VtcHR5TWFjcm8pOwogICAgIHJldHVybiBQUC5IYW5kbGVFbmRPZlRva2VuTGV4ZXIoVG9rKTsKQEAgLTQ3OSw5ICs0NzEsMTQgQEAKICAgaWYgKGlzRmlyc3RUb2tlbikgewogICAgIFRvay5zZXRGbGFnVmFsdWUoVG9rZW46OlN0YXJ0T2ZMaW5lICwgQXRTdGFydE9mTGluZSk7CiAgICAgVG9rLnNldEZsYWdWYWx1ZShUb2tlbjo6TGVhZGluZ1NwYWNlLCBIYXNMZWFkaW5nU3BhY2UpOwotICAgIEF0U3RhcnRPZkxpbmUgPSBmYWxzZTsKLSAgICBIYXNMZWFkaW5nU3BhY2UgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgdG9rZW4sIHdlIG1heSBzdGlsbCBuZWVkIHRvIHBhc3MgdGhyb3VnaAorICAgIC8vIGxlYWRpbmcgd2hpdGVzcGFjZSBpZiB3ZSd2ZSBleHBhbmRlZCBhIG1hY3JvLgorICAgIGlmIChBdFN0YXJ0T2ZMaW5lKSBUb2suc2V0RmxhZyhUb2tlbjo6U3RhcnRPZkxpbmUpOworICAgIGlmIChIYXNMZWFkaW5nU3BhY2UpIFRvay5zZXRGbGFnKFRva2VuOjpMZWFkaW5nU3BhY2UpOwogICB9CisgIEF0U3RhcnRPZkxpbmUgPSBmYWxzZTsKKyAgSGFzTGVhZGluZ1NwYWNlID0gZmFsc2U7CiAKICAgLy8gSGFuZGxlIHJlY3Vyc2l2ZSBleHBhbnNpb24hCiAgIGlmICghVG9rLmlzQW5ub3RhdGlvbigpICYmIFRvay5nZXRJZGVudGlmaWVySW5mbygpICE9IDApIHsKQEAgLTYyMCwxMiArNjE3LDExIEBACiAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jID0KICAgICAgICAgICAgIFNNLmNyZWF0ZUV4cGFuc2lvbkxvYyhQYXN0ZU9wTG9jLCBFeHBhbmRMb2NTdGFydCwgRXhwYW5kTG9jRW5kLCAyKTsKICAgICAgICAgICAvLyBJZiB3ZSdyZSBpbiBtaWNyb3NvZnQgZXh0ZW5zaW9ucyBtb2RlLCBkb3duZ3JhZGUgdGhpcyBmcm9tIGEgaGFyZAotICAgICAgICAgIC8vIGVycm9yIHRvIGEgd2FybmluZyB0aGF0IGRlZmF1bHRzIHRvIGFuIGVycm9yLiAgVGhpcyBhbGxvd3MKKyAgICAgICAgICAvLyBlcnJvciB0byBhbiBleHRlbnNpb24gdGhhdCBkZWZhdWx0cyB0byBhbiBlcnJvci4gIFRoaXMgYWxsb3dzCiAgICAgICAgICAgLy8gZGlzYWJsaW5nIGl0LgotICAgICAgICAgIFBQLkRpYWcoTG9jLAotICAgICAgICAgICAgICAgICAgUFAuZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRFeHQgPyBkaWFnOjplcnJfcHBfYmFkX3Bhc3RlX21zIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjplcnJfcHBfYmFkX3Bhc3RlKQotICAgICAgICAgICAgPDwgQnVmZmVyLnN0cigpOworICAgICAgICAgIFBQLkRpYWcoTG9jLCBQUC5nZXRMYW5nT3B0cygpLk1pY3Jvc29mdEV4dCA/IGRpYWc6OmV4dF9wcF9iYWRfcGFzdGVfbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjplcnJfcHBfYmFkX3Bhc3RlKQorICAgICAgICAgICAgICA8PCBCdWZmZXIuc3RyKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBBbiBlcnJvciBoYXMgb2NjdXJyZWQgc28gZXhpdCBsb29wLgpkaWZmIC0tZ2l0IGEvbGliL0xleC9Vbmljb2RlQ2hhclNldHMuaCBiL2xpYi9MZXgvVW5pY29kZUNoYXJTZXRzLmgKaW5kZXggMDFhZTdlOC4uMTJiMjQ1NiAxMDA2NDQKLS0tIGEvbGliL0xleC9Vbmljb2RlQ2hhclNldHMuaAorKysgYi9saWIvTGV4L1VuaWNvZGVDaGFyU2V0cy5oCkBAIC0yOTgsNyArMjk4LDcgQEAKICAgLy8gTWFsYXlhbQogICB7IDB4MEQwMiwgMHgwRDAzIH0sIHsgMHgwRDA1LCAweDBEMEMgfSwgeyAweDBEMEUsIDB4MEQxMCB9LAogICB7IDB4MEQxMiwgMHgwRDI4IH0sIHsgMHgwRDJBLCAweDBEMzkgfSwgeyAweDBEM0UsIDB4MEQ0MyB9LAotICB7IDB4MEQ0NiwgMHgwRDQ4IH0sIHsgMHgwRDRBLCAweDBENEQgfSwgeyAweDBENjAsIDB4MEQ2MCB9LAorICB7IDB4MEQ0NiwgMHgwRDQ4IH0sIHsgMHgwRDRBLCAweDBENEQgfSwgeyAweDBENjAsIDB4MEQ2MSB9LAogCiAgIC8vIERpZ2l0cyAoMTEpCiAgIHsgMHgwRDY2LCAweDBENkYgfSwKZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9BbmRyb2lkLm1rIGIvbGliL1BhcnNlL0FuZHJvaWQubWsKaW5kZXggM2Y4ZjQ1Ni4uNWJjMjIwMCAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL0FuZHJvaWQubWsKKysrIGIvbGliL1BhcnNlL0FuZHJvaWQubWsKQEAgLTYsMTMgKzYsMTEgQEAKIGluY2x1ZGUgJChDTEVBUl9UQkxHRU5fVkFSUykKIAogVEJMR0VOX1RBQkxFUyA6PSAgXAotCUF0dHJFeHByQXJncy5pbmMgXAotCUF0dHJJZGVudGlmaWVyQXJnLmluYyBcCiAJQXR0ckxpc3QuaW5jICBcCi0JQXR0ckxhdGVQYXJzZWQuaW5jICBcCiAJQXR0clBhcnNlZEF0dHJMaXN0LmluYyAgXAotCUF0dHJUeXBlQXJnLmluYyAgXAogCUF0dHJzLmluYyAgXAorICAgICAgICBBdHRyVmlzaXRvci5pbmMgXAorICAgICAgICBBdHRyUGFyc2VyU3RyaW5nU3dpdGNoZXMuaW5jIFwKIAlDb21tZW50Q29tbWFuZExpc3QuaW5jIFwKIAlDb21tZW50Tm9kZXMuaW5jIFwKIAlEZWNsTm9kZXMuaW5jICBcCmRpZmYgLS1naXQgYS9saWIvUGFyc2UvQ01ha2VMaXN0cy50eHQgYi9saWIvUGFyc2UvQ01ha2VMaXN0cy50eHQKaW5kZXggMDhiZjRlMS4uMTBiMTQ2ZiAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9QYXJzZS9DTWFrZUxpc3RzLnR4dApAQCAtMSwzICsxLDkgQEAKK3NldChMTFZNX0xJTktfQ09NUE9ORU5UUworICBNQ1BhcnNlcgorICBNQworICBTdXBwb3J0CisgICkKKwogYWRkX2NsYW5nX2xpYnJhcnkoY2xhbmdQYXJzZQogICBQYXJzZUFTVC5jcHAKICAgUGFyc2VDWFhJbmxpbmVNZXRob2RzLmNwcApAQCAtMTMsMjMgKzE5LDggQEAKICAgUGFyc2VUZW1wbGF0ZS5jcHAKICAgUGFyc2VUZW50YXRpdmUuY3BwCiAgIFBhcnNlci5jcHAKLSAgKQogCi1hZGRfZGVwZW5kZW5jaWVzKGNsYW5nUGFyc2UKLSAgQ2xhbmdBdHRyQ2xhc3NlcwotICBDbGFuZ0F0dHJJZGVudGlmaWVyQXJnCi0gIENsYW5nQXR0ckxhdGVQYXJzZWQKLSAgQ2xhbmdBdHRyTGlzdAotICBDbGFuZ0F0dHJQYXJzZWRBdHRyTGlzdAotICBDbGFuZ0F0dHJUeXBlQXJnCi0gIENsYW5nQ29tbWVudE5vZGVzCi0gIENsYW5nRGVjbE5vZGVzCi0gIENsYW5nRGlhZ25vc3RpY0NvbW1vbgotICBDbGFuZ0RpYWdub3N0aWNQYXJzZQotICBDbGFuZ1N0bXROb2RlcwotICApCi0KLXRhcmdldF9saW5rX2xpYnJhcmllcyhjbGFuZ1BhcnNlCisgIExJTktfTElCUwogICBjbGFuZ0Jhc2ljCiAgIGNsYW5nQVNUCiAgIGNsYW5nTGV4CmRpZmYgLS1naXQgYS9saWIvUGFyc2UvUGFyc2VBU1QuY3BwIGIvbGliL1BhcnNlL1BhcnNlQVNULmNwcAppbmRleCA1Njc4ZWNlLi4wZjVhMWIzIDEwMDY0NAotLS0gYS9saWIvUGFyc2UvUGFyc2VBU1QuY3BwCisrKyBiL2xpYi9QYXJzZS9QYXJzZUFTVC5jcHAKQEAgLTIzLDkgKzIzLDkgQEAKICNpbmNsdWRlICJjbGFuZy9TZW1hL0V4dGVybmFsU2VtYVNvdXJjZS5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2VtYS5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2VtYUNvbnN1bWVyLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NyYXNoUmVjb3ZlcnlDb250ZXh0LmgiCiAjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogCkBAIC0zNiw3ICszNiw3IEBACiAgIGNvbnN0IFBhcnNlciAmUDsKIHB1YmxpYzoKICAgUHJldHR5U3RhY2tUcmFjZVBhcnNlckVudHJ5KGNvbnN0IFBhcnNlciAmcCkgOiBQKHApIHt9Ci0gIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiAvLy8gSWYgYSBjcmFzaCBoYXBwZW5zIHdoaWxlIHRoZSBwYXJzZXIgaXMgYWN0aXZlLCBwcmludCBvdXQgYSBsaW5lIGluZGljYXRpbmcKQEAgLTg4LDcgKzg4LDggQEAKICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0ZUNvbnN1bWVyICpDb21wbGV0aW9uQ29uc3VtZXIsCiAgICAgICAgICAgICAgICAgICAgICBib29sIFNraXBGdW5jdGlvbkJvZGllcykgewogCi0gIE93bmluZ1B0cjxTZW1hPiBTKG5ldyBTZW1hKFBQLCBDdHgsICpDb25zdW1lciwgVFVLaW5kLCBDb21wbGV0aW9uQ29uc3VtZXIpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPFNlbWE+IFMoCisgICAgICBuZXcgU2VtYShQUCwgQ3R4LCAqQ29uc3VtZXIsIFRVS2luZCwgQ29tcGxldGlvbkNvbnN1bWVyKSk7CiAKICAgLy8gUmVjb3ZlciByZXNvdXJjZXMgaWYgd2UgY3Jhc2ggYmVmb3JlIGV4aXRpbmcgdGhpcyBtZXRob2QuCiAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhcjxTZW1hPiBDbGVhbnVwU2VtYShTLmdldCgpKTsKQEAgLTEwOSw4ICsxMTAsOCBAQAogCiAgIEFTVENvbnN1bWVyICpDb25zdW1lciA9ICZTLmdldEFTVENvbnN1bWVyKCk7CiAKLSAgT3duaW5nUHRyPFBhcnNlcj4gUGFyc2VPUChuZXcgUGFyc2VyKFMuZ2V0UHJlcHJvY2Vzc29yKCksIFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwRnVuY3Rpb25Cb2RpZXMpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPFBhcnNlcj4gUGFyc2VPUCgKKyAgICAgIG5ldyBQYXJzZXIoUy5nZXRQcmVwcm9jZXNzb3IoKSwgUywgU2tpcEZ1bmN0aW9uQm9kaWVzKSk7CiAgIFBhcnNlciAmUCA9ICpQYXJzZU9QLmdldCgpOwogCiAgIFByZXR0eVN0YWNrVHJhY2VQYXJzZXJFbnRyeSBDcmFzaEluZm8oUCk7CmRpZmYgLS1naXQgYS9saWIvUGFyc2UvUGFyc2VDWFhJbmxpbmVNZXRob2RzLmNwcCBiL2xpYi9QYXJzZS9QYXJzZUNYWElubGluZU1ldGhvZHMuY3BwCmluZGV4IDc3OTIzMDUuLjRjZjg3ZTUgMTAwNjQ0Ci0tLSBhL2xpYi9QYXJzZS9QYXJzZUNYWElubGluZU1ldGhvZHMuY3BwCisrKyBiL2xpYi9QYXJzZS9QYXJzZUNYWElubGluZU1ldGhvZHMuY3BwCkBAIC0xOSwxMyArMTksNiBAQAogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2NvcGUuaCIKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIAotLy8vIEdldCB0aGUgRnVuY3Rpb25EZWNsIGZvciBhIGZ1bmN0aW9uIG9yIGZ1bmN0aW9uIHRlbXBsYXRlIGRlY2wuCi1zdGF0aWMgRnVuY3Rpb25EZWNsICpnZXRGdW5jdGlvbkRlY2woRGVjbCAqRCkgewotICBpZiAoRnVuY3Rpb25EZWNsICpmbiA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oRCkpCi0gICAgcmV0dXJuIGZuOwotICByZXR1cm4gY2FzdDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oRCktPmdldFRlbXBsYXRlZERlY2woKTsKLX0KLQogLy8vIFBhcnNlQ1hYSW5saW5lTWV0aG9kRGVmIC0gV2UgcGFyc2VkIGFuZCB2ZXJpZmllZCB0aGF0IHRoZSBzcGVjaWZpZWQKIC8vLyBEZWNsYXJhdG9yIGlzIGEgd2VsbCBmb3JtZWQgQysrIGlubGluZSBtZXRob2QgZGVmaW5pdGlvbi4gTm93IGxleCBpdHMgYm9keQogLy8vIGFuZCBzdG9yZSBpdHMgdG9rZW5zIGZvciBwYXJzaW5nIGFmdGVyIHRoZSBDKysgY2xhc3MgaXMgY29tcGxldGUuCkBAIC02OSw5ICs2Miw3IEBACiAKICAgRC5jb21wbGV0ZShGbkQpOwogCi0gIGlmIChUb2suaXModG9rOjplcXVhbCkpIHsKLSAgICBDb25zdW1lVG9rZW4oKTsKLQorICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6ZXF1YWwpKSB7CiAgICAgaWYgKCFGbkQpIHsKICAgICAgIFNraXBVbnRpbCh0b2s6OnNlbWkpOwogICAgICAgcmV0dXJuIDA7CkBAIC03OSwyMCArNzAsMTYgQEAKIAogICAgIGJvb2wgRGVsZXRlID0gZmFsc2U7CiAgICAgU291cmNlTG9jYXRpb24gS1dMb2M7Ci0gICAgaWYgKFRvay5pcyh0b2s6Omt3X2RlbGV0ZSkpIHsKLSAgICAgIERpYWcoVG9rLCBnZXRMYW5nT3B0cygpLkNQbHVzUGx1czExID8KLSAgICAgICAgICAgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfZGVsZXRlZF9mdW5jdGlvbiA6Ci0gICAgICAgICAgIGRpYWc6OmV4dF9kZWxldGVkX2Z1bmN0aW9uKTsKLQotICAgICAgS1dMb2MgPSBDb25zdW1lVG9rZW4oKTsKKyAgICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6a3dfZGVsZXRlLCBLV0xvYykpIHsKKyAgICAgIERpYWcoS1dMb2MsIGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEKKyAgICAgICAgICAgICAgICAgICAgICA/IGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2RlbGV0ZWRfZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6OmV4dF9kZWxldGVkX2Z1bmN0aW9uKTsKICAgICAgIEFjdGlvbnMuU2V0RGVjbERlbGV0ZWQoRm5ELCBLV0xvYyk7CiAgICAgICBEZWxldGUgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoVG9rLmlzKHRvazo6a3dfZGVmYXVsdCkpIHsKLSAgICAgIERpYWcoVG9rLCBnZXRMYW5nT3B0cygpLkNQbHVzUGx1czExID8KLSAgICAgICAgICAgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfZGVmYXVsdGVkX2Z1bmN0aW9uIDoKLSAgICAgICAgICAgZGlhZzo6ZXh0X2RlZmF1bHRlZF9mdW5jdGlvbik7Ci0KLSAgICAgIEtXTG9jID0gQ29uc3VtZVRva2VuKCk7CisgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjprd19kZWZhdWx0LCBLV0xvYykpIHsKKyAgICAgIERpYWcoS1dMb2MsIGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEKKyAgICAgICAgICAgICAgICAgICAgICA/IGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2RlZmF1bHRlZF9mdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgIDogZGlhZzo6ZXh0X2RlZmF1bHRlZF9mdW5jdGlvbik7CiAgICAgICBBY3Rpb25zLlNldERlY2xEZWZhdWx0ZWQoRm5ELCBLV0xvYyk7CiAgICAgfSBlbHNlIHsKICAgICAgIGxsdm1fdW5yZWFjaGFibGUoImZ1bmN0aW9uIGRlZmluaXRpb24gYWZ0ZXIgPSBub3QgJ2RlbGV0ZScgb3IgJ2RlZmF1bHQnIik7CkBAIC0xMDIsOSArODksOSBAQAogICAgICAgRGlhZyhLV0xvYywgZGlhZzo6ZXJyX2RlZmF1bHRfZGVsZXRlX2luX211bHRpcGxlX2RlY2xhcmF0aW9uKQogICAgICAgICA8PCBEZWxldGU7CiAgICAgICBTa2lwVW50aWwodG9rOjpzZW1pKTsKLSAgICB9IGVsc2UgewotICAgICAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2FmdGVyLAotICAgICAgICAgICAgICAgICAgICAgICBEZWxldGUgPyAiZGVsZXRlIiA6ICJkZWZhdWx0IiwgdG9rOjpzZW1pKTsKKyAgICB9IGVsc2UgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLCBkaWFnOjplcnJfZXhwZWN0ZWRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSA/ICJkZWxldGUiIDogImRlZmF1bHQiKSkgeworICAgICAgU2tpcFVudGlsKHRvazo6c2VtaSk7CiAgICAgfQogCiAgICAgcmV0dXJuIEZuRDsKQEAgLTExNSw5ICsxMDIsOSBAQAogICAvLyB0aGUgdG9rZW5zIGFuZCBzdG9yZSB0aGVtIGZvciBwYXJzaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbGF0aW9uIHVuaXQuCiAgIGlmIChnZXRMYW5nT3B0cygpLkRlbGF5ZWRUZW1wbGF0ZVBhcnNpbmcgJiYKICAgICAgIERlZmluaXRpb25LaW5kID09IEZES19EZWZpbml0aW9uICYmCi0gICAgICAhRC5nZXREZWNsU3BlYygpLmlzQ29uc3RleHByU3BlY2lmaWVkKCkgJiYgCi0gICAgICAhKEZuRCAmJiBnZXRGdW5jdGlvbkRlY2woRm5EKSAmJiAKLSAgICAgICAgICBnZXRGdW5jdGlvbkRlY2woRm5EKS0+Z2V0UmVzdWx0VHlwZSgpLT5nZXRDb250YWluZWRBdXRvVHlwZSgpKSAmJgorICAgICAgIUQuZ2V0RGVjbFNwZWMoKS5pc0NvbnN0ZXhwclNwZWNpZmllZCgpICYmCisgICAgICAhKEZuRCAmJiBGbkQtPmdldEFzRnVuY3Rpb24oKSAmJgorICAgICAgICBGbkQtPmdldEFzRnVuY3Rpb24oKS0+Z2V0UmV0dXJuVHlwZSgpLT5nZXRDb250YWluZWRBdXRvVHlwZSgpKSAmJgogICAgICAgKChBY3Rpb25zLkN1ckNvbnRleHQtPmlzRGVwZW5kZW50Q29udGV4dCgpIHx8CiAgICAgICAgIChUZW1wbGF0ZUluZm8uS2luZCAhPSBQYXJzZWRUZW1wbGF0ZUluZm86Ok5vblRlbXBsYXRlICYmCiAgICAgICAgICBUZW1wbGF0ZUluZm8uS2luZCAhPSBQYXJzZWRUZW1wbGF0ZUluZm86OkV4cGxpY2l0U3BlY2lhbGl6YXRpb24pKSAmJgpAQCAtMTI3LDcgKzExNCw3IEBACiAgICAgTGV4VGVtcGxhdGVGdW5jdGlvbkZvckxhdGVQYXJzaW5nKFRva3MpOwogCiAgICAgaWYgKEZuRCkgewotICAgICAgRnVuY3Rpb25EZWNsICpGRCA9IGdldEZ1bmN0aW9uRGVjbChGbkQpOworICAgICAgRnVuY3Rpb25EZWNsICpGRCA9IEZuRC0+Z2V0QXNGdW5jdGlvbigpOwogICAgICAgQWN0aW9ucy5DaGVja0ZvckZ1bmN0aW9uUmVkZWZpbml0aW9uKEZEKTsKICAgICAgIEFjdGlvbnMuTWFya0FzTGF0ZVBhcnNlZFRlbXBsYXRlKEZELCBGbkQsIFRva3MpOwogICAgIH0KQEAgLTE3OSw3ICsxNjYsNyBAQAogICAgIC8vIElmIHlvdSByZW1vdmUgdGhpcywgeW91IGNhbiByZW1vdmUgdGhlIGNvZGUgdGhhdCBjbGVhcnMgdGhlIGZsYWcKICAgICAvLyBhZnRlciBwYXJzaW5nIHRoZSBtZW1iZXIuCiAgICAgaWYgKEQuZ2V0RGVjbFNwZWMoKS5pc0ZyaWVuZFNwZWNpZmllZCgpKSB7Ci0gICAgICBGdW5jdGlvbkRlY2wgKkZEID0gZ2V0RnVuY3Rpb25EZWNsKEZuRCk7CisgICAgICBGdW5jdGlvbkRlY2wgKkZEID0gRm5ELT5nZXRBc0Z1bmN0aW9uKCk7CiAgICAgICBBY3Rpb25zLkNoZWNrRm9yRnVuY3Rpb25SZWRlZmluaXRpb24oRkQpOwogICAgICAgRkQtPnNldExhdGVUZW1wbGF0ZVBhcnNlZCh0cnVlKTsKICAgICB9CkBAIC0zNDgsOSArMzM1LDcgQEAKICAgICAgIGlmIChEZWZBcmdSZXN1bHQuaXNJbnZhbGlkKCkpCiAgICAgICAgIEFjdGlvbnMuQWN0T25QYXJhbURlZmF1bHRBcmd1bWVudEVycm9yKExNLkRlZmF1bHRBcmdzW0ldLlBhcmFtKTsKICAgICAgIGVsc2UgewotICAgICAgICBpZiAoVG9rLmlzKHRvazo6Y3h4X2RlZmF1bHRhcmdfZW5kKSkKLSAgICAgICAgICBDb25zdW1lVG9rZW4oKTsKLSAgICAgICAgZWxzZSB7CisgICAgICAgIGlmICghVHJ5Q29uc3VtZVRva2VuKHRvazo6Y3h4X2RlZmF1bHRhcmdfZW5kKSkgewogICAgICAgICAgIC8vIFRoZSBsYXN0IHR3byB0b2tlbnMgYXJlIHRoZSB0ZXJtaW5hdG9yIGFuZCB0aGUgc2F2ZWQgdmFsdWUgb2YKICAgICAgICAgICAvLyBUb2s7IHRoZSBsYXN0IHRva2VuIGluIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGlzIHRoZSBvbmUgYmVmb3JlCiAgICAgICAgICAgLy8gdGhvc2UuCkBAIC00NjQsNyArNDQ5LDggQEAKICAgUGFyc2VGdW5jdGlvblN0YXRlbWVudEJvZHkoTE0uRCwgRm5TY29wZSk7CiAKICAgLy8gQ2xlYXIgdGhlIGxhdGUtdGVtcGxhdGUtcGFyc2VkIGJpdCBpZiB3ZSBzZXQgaXQgYmVmb3JlLgotICBpZiAoTE0uRCkgZ2V0RnVuY3Rpb25EZWNsKExNLkQpLT5zZXRMYXRlVGVtcGxhdGVQYXJzZWQoZmFsc2UpOworICBpZiAoTE0uRCkKKyAgICBMTS5ELT5nZXRBc0Z1bmN0aW9uKCktPnNldExhdGVUZW1wbGF0ZVBhcnNlZChmYWxzZSk7CiAKICAgaWYgKFRvay5nZXRMb2NhdGlvbigpICE9IG9yaWdMb2MpIHsKICAgICAvLyBEdWUgdG8gcGFyc2luZyBlcnJvciwgd2UgZWl0aGVyIHdlbnQgb3ZlciB0aGUgY2FjaGVkIHRva2VucyBvcgpAQCAtNTM2LDEwICs1MjIsMTMgQEAKIAogICBTb3VyY2VMb2NhdGlvbiBFcXVhbExvYzsKIAorICBBY3Rpb25zLkFjdE9uU3RhcnRDWFhJbkNsYXNzTWVtYmVySW5pdGlhbGl6ZXIoKTsKKwogICBFeHByUmVzdWx0IEluaXQgPSBQYXJzZUNYWE1lbWJlckluaXRpYWxpemVyKE1JLkZpZWxkLCAvKklzRnVuY3Rpb249Ki9mYWxzZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXF1YWxMb2MpOwogCi0gIEFjdGlvbnMuQWN0T25DWFhJbkNsYXNzTWVtYmVySW5pdGlhbGl6ZXIoTUkuRmllbGQsIEVxdWFsTG9jLCBJbml0LnJlbGVhc2UoKSk7CisgIEFjdGlvbnMuQWN0T25GaW5pc2hDWFhJbkNsYXNzTWVtYmVySW5pdGlhbGl6ZXIoTUkuRmllbGQsIEVxdWFsTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXQucmVsZWFzZSgpKTsKIAogICAvLyBUaGUgbmV4dCB0b2tlbiBzaG91bGQgYmUgb3VyIGFydGlmaWNpYWwgdGVybWluYXRpbmcgRU9GIHRva2VuLgogICBpZiAoVG9rLmlzTm90KHRvazo6ZW9mKSkgewpAQCAtNTgwLDYgKzU2OSw5IEBACiAKICAgICBzd2l0Y2ggKFRvay5nZXRLaW5kKCkpIHsKICAgICBjYXNlIHRvazo6ZW9mOgorICAgIGNhc2UgdG9rOjphbm5vdF9tb2R1bGVfYmVnaW46CisgICAgY2FzZSB0b2s6OmFubm90X21vZHVsZV9lbmQ6CisgICAgY2FzZSB0b2s6OmFubm90X21vZHVsZV9pbmNsdWRlOgogICAgICAgLy8gUmFuIG91dCBvZiB0b2tlbnMuCiAgICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTY3NSw3ICs2NjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIC8qU3RvcEF0U2VtaT0qL3RydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgLypDb25zdW1lRmluYWxUb2tlbj0qL2ZhbHNlKTsKICAgICBpZiAoVG9rLmlzTm90KHRvazo6bF9icmFjZSkpCi0gICAgICByZXR1cm4gRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2xicmFjZSk7CisgICAgICByZXR1cm4gRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfYnJhY2U7CiAKICAgICBUb2tzLnB1c2hfYmFjayhUb2spOwogICAgIENvbnN1bWVCcmFjZSgpOwpAQCAtNzA4LDggKzcwMCw4IEBACiAgICAgICBUb2tzLnB1c2hfYmFjayhUb2spOwogICAgICAgQ29uc3VtZVBhcmVuKCk7CiAgICAgICBpZiAoIUNvbnN1bWVBbmRTdG9yZVVudGlsKHRvazo6cl9wYXJlbiwgVG9rcywgLypTdG9wQXRTZW1pPSovdHJ1ZSkpIHsKLSAgICAgICAgRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2V4cGVjdGVkX3JwYXJlbik7Ci0gICAgICAgIERpYWcoT3BlbkxvYywgZGlhZzo6bm90ZV9tYXRjaGluZykgPDwgIigiOworICAgICAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6cl9wYXJlbjsKKyAgICAgICAgRGlhZyhPcGVuTG9jLCBkaWFnOjpub3RlX21hdGNoaW5nKSA8PCB0b2s6OmxfcGFyZW47CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQogICAgIH0KQEAgLTc1NiwxMyArNzQ4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQ29uc3VtZUZpbmFsVG9rZW49Ki9mYWxzZSkpIHsKICAgICAgICAgLy8gV2UncmUgbm90IGp1c3QgbWlzc2luZyB0aGUgaW5pdGlhbGl6ZXIsIHdlJ3JlIGFsc28gbWlzc2luZyB0aGUKICAgICAgICAgLy8gZnVuY3Rpb24gYm9keSEKLSAgICAgICAgcmV0dXJuIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZF9sYnJhY2UpOworICAgICAgICByZXR1cm4gRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfYnJhY2U7CiAgICAgICB9CiAgICAgfSBlbHNlIGlmIChUb2suaXNOb3QodG9rOjpsX3BhcmVuKSAmJiBUb2suaXNOb3QodG9rOjpsX2JyYWNlKSkgewogICAgICAgLy8gV2UgZm91bmQgc29tZXRoaW5nIHdlaXJkIGluIGEgbWVtLWluaXRpYWxpemVyLWlkLgotICAgICAgcmV0dXJuIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkaWFnOjplcnJfZXhwZWN0ZWRfbHBhcmVuX29yX2xicmFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6OmVycl9leHBlY3RlZF9scGFyZW4pOworICAgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEpCisgICAgICAgIHJldHVybiBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWRfZWl0aGVyKQorICAgICAgICAgICAgICAgPDwgdG9rOjpsX3BhcmVuIDw8IHRvazo6bF9icmFjZTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjpsX3BhcmVuOwogICAgIH0KIAogICAgIHRvazo6VG9rZW5LaW5kIGtpbmQgPSBUb2suZ2V0S2luZCgpOwpAQCAtNzg0LDExICs3NzgsMTAgQEAKICAgICAvLyBHcmFiIHRoZSBpbml0aWFsaXplciAob3IgdGhlIHN1YmV4cHJlc3Npb24gb2YgdGhlIHRlbXBsYXRlIGFyZ3VtZW50KS4KICAgICAvLyBGSVhNRTogSWYgd2Ugc3VwcG9ydCBsYW1iZGFzIGhlcmUsIHdlJ2xsIG5lZWQgdG8gc2V0IFN0b3BBdFNlbWkgdG8gZmFsc2UKICAgICAvLyAgICAgICAgaWYgd2UgbWlnaHQgYmUgaW5zaWRlIHRoZSBicmFjZXMgb2YgYSBsYW1iZGEtZXhwcmVzc2lvbi4KLSAgICBpZiAoIUNvbnN1bWVBbmRTdG9yZVVudGlsKElzTFBhcmVuID8gdG9rOjpyX3BhcmVuIDogdG9rOjpyX2JyYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rcywgLypTdG9wQXRTZW1pPSovdHJ1ZSkpIHsKLSAgICAgIERpYWcoVG9rLCBJc0xQYXJlbiA/IGRpYWc6OmVycl9leHBlY3RlZF9ycGFyZW4gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX2V4cGVjdGVkX3JicmFjZSk7Ci0gICAgICBEaWFnKE9wZW5Mb2MsIGRpYWc6Om5vdGVfbWF0Y2hpbmcpIDw8IChJc0xQYXJlbiA/ICIoIiA6ICJ7Iik7CisgICAgdG9rOjpUb2tlbktpbmQgQ2xvc2VLaW5kID0gSXNMUGFyZW4gPyB0b2s6OnJfcGFyZW4gOiB0b2s6OnJfYnJhY2U7CisgICAgaWYgKCFDb25zdW1lQW5kU3RvcmVVbnRpbChDbG9zZUtpbmQsIFRva3MsIC8qU3RvcEF0U2VtaT0qL3RydWUpKSB7CisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCBDbG9zZUtpbmQ7CisgICAgICBEaWFnKE9wZW5Mb2MsIGRpYWc6Om5vdGVfbWF0Y2hpbmcpIDw8IGtpbmQ7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTgyMiw3ICs4MTUsOCBAQAogICAgICAgQ29uc3VtZUJyYWNlKCk7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfSBlbHNlIGlmICghTWlnaHRCZVRlbXBsYXRlQXJndW1lbnQpIHsKLSAgICAgIHJldHVybiBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWRfbGJyYWNlX29yX2NvbW1hKTsKKyAgICAgIHJldHVybiBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWRfZWl0aGVyKSA8PCB0b2s6OmxfYnJhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0b2s6OmNvbW1hOwogICAgIH0KICAgfQogfQpAQCAtOTY1LDYgKzk1OSw5IEBACiAgICAgICBnb3RvIGNvbnN1bWVfdG9rZW47CiAKICAgICBjYXNlIHRvazo6ZW9mOgorICAgIGNhc2UgdG9rOjphbm5vdF9tb2R1bGVfYmVnaW46CisgICAgY2FzZSB0b2s6OmFubm90X21vZHVsZV9lbmQ6CisgICAgY2FzZSB0b2s6OmFubm90X21vZHVsZV9pbmNsdWRlOgogICAgICAgLy8gUmFuIG91dCBvZiB0b2tlbnMuCiAgICAgICByZXR1cm4gZmFsc2U7CiAKZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZURlY2wuY3BwIGIvbGliL1BhcnNlL1BhcnNlRGVjbC5jcHAKaW5kZXggN2I4MDkzNC4uMzMxYzVlNCAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL1BhcnNlRGVjbC5jcHAKKysrIGIvbGliL1BhcnNlL1BhcnNlRGVjbC5jcHAKQEAgLTEzLDEwICsxMywxMiBAQAogCiAjaW5jbHVkZSAiY2xhbmcvUGFyc2UvUGFyc2VyLmgiCiAjaW5jbHVkZSAiUkFJSU9iamVjdHNGb3JQYXJzZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsVGVtcGxhdGUuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9BZGRyZXNzU3BhY2VzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0NoYXJJbmZvLmgiCi0jaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlbkNMLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIgogI2luY2x1ZGUgImNsYW5nL1BhcnNlL1BhcnNlRGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvTG9va3VwLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9QYXJzZWRUZW1wbGF0ZS5oIgpAQCAtNjksOSArNzEsMTEgQEAKIC8vLyBpc0F0dHJpYnV0ZUxhdGVQYXJzZWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGhhcyBhcmd1bWVudHMgdGhhdAogLy8vIHJlcXVpcmUgbGF0ZSBwYXJzaW5nLgogc3RhdGljIGJvb2wgaXNBdHRyaWJ1dGVMYXRlUGFyc2VkKGNvbnN0IElkZW50aWZpZXJJbmZvICZJSSkgeworI2RlZmluZSBDTEFOR19BVFRSX0xBVEVfUEFSU0VEX0xJU1QKICAgICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGJvb2w+KElJLmdldE5hbWUoKSkKLSNpbmNsdWRlICJjbGFuZy9QYXJzZS9BdHRyTGF0ZVBhcnNlZC5pbmMiCisjaW5jbHVkZSAiY2xhbmcvUGFyc2UvQXR0clBhcnNlclN0cmluZ1N3aXRjaGVzLmluYyIKICAgICAgICAgLkRlZmF1bHQoZmFsc2UpOworI3VuZGVmIENMQU5HX0FUVFJfTEFURV9QQVJTRURfTElTVAogfQogCiAvLy8gUGFyc2VHTlVBdHRyaWJ1dGVzIC0gUGFyc2UgYSBub24tZW1wdHkgYXR0cmlidXRlcyBsaXN0LgpAQCAtMTE3LDcgKzEyMSw4IEBACiAvLy8gV2UgZm9sbG93IHRoZSBDKysgbW9kZWwsIGJ1dCBkb24ndCBhbGxvdyBqdW5rIGFmdGVyIHRoZSBpZGVudGlmaWVyLgogdm9pZCBQYXJzZXI6OlBhcnNlR05VQXR0cmlidXRlcyhQYXJzZWRBdHRyaWJ1dGVzICZhdHRycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKmVuZExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZVBhcnNlZEF0dHJMaXN0ICpMYXRlQXR0cnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZVBhcnNlZEF0dHJMaXN0ICpMYXRlQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0b3IgKkQpIHsKICAgYXNzZXJ0KFRvay5pcyh0b2s6Omt3X19fYXR0cmlidXRlKSAmJiAiTm90IGEgR05VIGF0dHJpYnV0ZSBsaXN0ISIpOwogCiAgIHdoaWxlIChUb2suaXModG9rOjprd19fX2F0dHJpYnV0ZSkpIHsKQEAgLTEzMiw0OSArMTM3LDU0IEBACiAgICAgICByZXR1cm47CiAgICAgfQogICAgIC8vIFBhcnNlIHRoZSBhdHRyaWJ1dGUtbGlzdC4gZS5nLiBfX2F0dHJpYnV0ZV9fKCggd2VhaywgYWxpYXMoIl9fZiIpICkpCi0gICAgd2hpbGUgKFRvay5pcyh0b2s6OmlkZW50aWZpZXIpIHx8IGlzRGVjbGFyYXRpb25TcGVjaWZpZXIoKSB8fAotICAgICAgICAgICBUb2suaXModG9rOjpjb21tYSkpIHsKLSAgICAgIGlmIChUb2suaXModG9rOjpjb21tYSkpIHsKLSAgICAgICAgLy8gYWxsb3dzIGZvciBlbXB0eS9ub24tZW1wdHkgYXR0cmlidXRlcy4gKChfX3ZlY3Rvcl9zaXplX18oMTYpLCwsLCkpCi0gICAgICAgIENvbnN1bWVUb2tlbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAvLyBBbGxvdyBlbXB0eS9ub24tZW1wdHkgYXR0cmlidXRlcy4gKChfX3ZlY3Rvcl9zaXplX18oMTYpLCwsLCkpCisgICAgICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29tbWEpKQogICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIC8vIHdlIGhhdmUgYW4gaWRlbnRpZmllciBvciBkZWNsYXJhdGlvbiBzcGVjaWZpZXIgKGNvbnN0LCBpbnQsIGV0Yy4pCisKKyAgICAgIC8vIEV4cGVjdCBhbiBpZGVudGlmaWVyIG9yIGRlY2xhcmF0aW9uIHNwZWNpZmllciAoY29uc3QsIGludCwgZXRjLikKKyAgICAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSAmJiAhaXNEZWNsYXJhdGlvblNwZWNpZmllcigpKQorICAgICAgICBicmVhazsKKwogICAgICAgSWRlbnRpZmllckluZm8gKkF0dHJOYW1lID0gVG9rLmdldElkZW50aWZpZXJJbmZvKCk7CiAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyTmFtZUxvYyA9IENvbnN1bWVUb2tlbigpOwogCi0gICAgICBpZiAoVG9rLmlzKHRvazo6bF9wYXJlbikpIHsKLSAgICAgICAgLy8gaGFuZGxlICJwYXJhbWV0ZXJpemVkIiBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChMYXRlQXR0cnMgJiYgaXNBdHRyaWJ1dGVMYXRlUGFyc2VkKCpBdHRyTmFtZSkpIHsKLSAgICAgICAgICBMYXRlUGFyc2VkQXR0cmlidXRlICpMQSA9Ci0gICAgICAgICAgICBuZXcgTGF0ZVBhcnNlZEF0dHJpYnV0ZSh0aGlzLCAqQXR0ck5hbWUsIEF0dHJOYW1lTG9jKTsKLSAgICAgICAgICBMYXRlQXR0cnMtPnB1c2hfYmFjayhMQSk7Ci0KLSAgICAgICAgICAvLyBBdHRyaWJ1dGVzIGluIGEgY2xhc3MgYXJlIHBhcnNlZCBhdCB0aGUgZW5kIG9mIHRoZSBjbGFzcywgYWxvbmcKLSAgICAgICAgICAvLyB3aXRoIG90aGVyIGxhdGUtcGFyc2VkIGRlY2xhcmF0aW9ucy4KLSAgICAgICAgICBpZiAoIUNsYXNzU3RhY2suZW1wdHkoKSAmJiAhTGF0ZUF0dHJzLT5wYXJzZVNvb24oKSkKLSAgICAgICAgICAgIGdldEN1cnJlbnRDbGFzcygpLkxhdGVQYXJzZWREZWNsYXJhdGlvbnMucHVzaF9iYWNrKExBKTsKLQotICAgICAgICAgIC8vIGNvbnN1bWUgZXZlcnl0aGluZyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBtYXRjaGluZyByaWdodCBwYXJlbnMKLSAgICAgICAgICBDb25zdW1lQW5kU3RvcmVVbnRpbCh0b2s6OnJfcGFyZW4sIExBLT5Ub2tzLCB0cnVlLCBmYWxzZSk7Ci0KLSAgICAgICAgICBUb2tlbiBFb2Y7Ci0gICAgICAgICAgRW9mLnN0YXJ0VG9rZW4oKTsKLSAgICAgICAgICBFb2Yuc2V0TG9jYXRpb24oVG9rLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgIExBLT5Ub2tzLnB1c2hfYmFjayhFb2YpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFBhcnNlR05VQXR0cmlidXRlQXJncyhBdHRyTmFtZSwgQXR0ck5hbWVMb2MsIGF0dHJzLCBlbmRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFNvdXJjZUxvY2F0aW9uKCksIEF0dHJpYnV0ZUxpc3Q6OkFTX0dOVSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7CisgICAgICBpZiAoVG9rLmlzTm90KHRvazo6bF9wYXJlbikpIHsKICAgICAgICAgYXR0cnMuYWRkTmV3KEF0dHJOYW1lLCBBdHRyTmFtZUxvYywgMCwgQXR0ck5hbWVMb2MsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpBU19HTlUpOworICAgICAgICBjb250aW51ZTsKICAgICAgIH0KKworICAgICAgLy8gSGFuZGxlICJwYXJhbWV0ZXJpemVkIiBhdHRyaWJ1dGVzCisgICAgICBpZiAoIUxhdGVBdHRycyB8fCAhaXNBdHRyaWJ1dGVMYXRlUGFyc2VkKCpBdHRyTmFtZSkpIHsKKyAgICAgICAgUGFyc2VHTlVBdHRyaWJ1dGVBcmdzKEF0dHJOYW1lLCBBdHRyTmFtZUxvYywgYXR0cnMsIGVuZExvYywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIEF0dHJpYnV0ZUxpc3Q6OkFTX0dOVSwgRCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBIYW5kbGUgYXR0cmlidXRlcyB3aXRoIGFyZ3VtZW50cyB0aGF0IHJlcXVpcmUgbGF0ZSBwYXJzaW5nLgorICAgICAgTGF0ZVBhcnNlZEF0dHJpYnV0ZSAqTEEgPQorICAgICAgICAgIG5ldyBMYXRlUGFyc2VkQXR0cmlidXRlKHRoaXMsICpBdHRyTmFtZSwgQXR0ck5hbWVMb2MpOworICAgICAgTGF0ZUF0dHJzLT5wdXNoX2JhY2soTEEpOworCisgICAgICAvLyBBdHRyaWJ1dGVzIGluIGEgY2xhc3MgYXJlIHBhcnNlZCBhdCB0aGUgZW5kIG9mIHRoZSBjbGFzcywgYWxvbmcKKyAgICAgIC8vIHdpdGggb3RoZXIgbGF0ZS1wYXJzZWQgZGVjbGFyYXRpb25zLgorICAgICAgaWYgKCFDbGFzc1N0YWNrLmVtcHR5KCkgJiYgIUxhdGVBdHRycy0+cGFyc2VTb29uKCkpCisgICAgICAgIGdldEN1cnJlbnRDbGFzcygpLkxhdGVQYXJzZWREZWNsYXJhdGlvbnMucHVzaF9iYWNrKExBKTsKKworICAgICAgLy8gY29uc3VtZSBldmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIG1hdGNoaW5nIHJpZ2h0IHBhcmVucworICAgICAgQ29uc3VtZUFuZFN0b3JlVW50aWwodG9rOjpyX3BhcmVuLCBMQS0+VG9rcywgdHJ1ZSwgZmFsc2UpOworCisgICAgICBUb2tlbiBFb2Y7CisgICAgICBFb2Yuc3RhcnRUb2tlbigpOworICAgICAgRW9mLnNldExvY2F0aW9uKFRvay5nZXRMb2NhdGlvbigpKTsKKyAgICAgIExBLT5Ub2tzLnB1c2hfYmFjayhFb2YpOwogICAgIH0KLSAgICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnJfcGFyZW4sIGRpYWc6OmVycl9leHBlY3RlZF9ycGFyZW4pKQorCisgICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpyX3BhcmVuKSkKICAgICAgIFNraXBVbnRpbCh0b2s6OnJfcGFyZW4sIFN0b3BBdFNlbWkpOwogICAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IFRvay5nZXRMb2NhdGlvbigpOwotICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6cl9wYXJlbiwgZGlhZzo6ZXJyX2V4cGVjdGVkX3JwYXJlbikpCisgICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpyX3BhcmVuKSkKICAgICAgIFNraXBVbnRpbCh0b2s6OnJfcGFyZW4sIFN0b3BBdFNlbWkpOwogICAgIGlmIChlbmRMb2MpCiAgICAgICAqZW5kTG9jID0gTG9jOwpAQCAtMTkwLDE2ICsyMDAsMzAgQEAKIAogLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYXR0cmlidXRlIGhhcyBhbiBpZGVudGlmaWVyIGFyZ3VtZW50Lgogc3RhdGljIGJvb2wgYXR0cmlidXRlSGFzSWRlbnRpZmllckFyZyhjb25zdCBJZGVudGlmaWVySW5mbyAmSUkpIHsKKyNkZWZpbmUgQ0xBTkdfQVRUUl9JREVOVElGSUVSX0FSR19MSVNUCiAgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8Ym9vbD4obm9ybWFsaXplQXR0ck5hbWUoSUkuZ2V0TmFtZSgpKSkKLSNpbmNsdWRlICJjbGFuZy9QYXJzZS9BdHRySWRlbnRpZmllckFyZy5pbmMiCisjaW5jbHVkZSAiY2xhbmcvUGFyc2UvQXR0clBhcnNlclN0cmluZ1N3aXRjaGVzLmluYyIKICAgICAgICAgICAgLkRlZmF1bHQoZmFsc2UpOworI3VuZGVmIENMQU5HX0FUVFJfSURFTlRJRklFUl9BUkdfTElTVAogfQogCiAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBhdHRyaWJ1dGUgcGFyc2VzIGEgdHlwZSBhcmd1bWVudC4KIHN0YXRpYyBib29sIGF0dHJpYnV0ZUlzVHlwZUFyZ0F0dHIoY29uc3QgSWRlbnRpZmllckluZm8gJklJKSB7CisjZGVmaW5lIENMQU5HX0FUVFJfVFlQRV9BUkdfTElTVAogICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGJvb2w+KG5vcm1hbGl6ZUF0dHJOYW1lKElJLmdldE5hbWUoKSkpCi0jaW5jbHVkZSAiY2xhbmcvUGFyc2UvQXR0clR5cGVBcmcuaW5jIgorI2luY2x1ZGUgImNsYW5nL1BhcnNlL0F0dHJQYXJzZXJTdHJpbmdTd2l0Y2hlcy5pbmMiCiAgICAgICAgICAgIC5EZWZhdWx0KGZhbHNlKTsKKyN1bmRlZiBDTEFOR19BVFRSX1RZUEVfQVJHX0xJU1QKK30KKworLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYXR0cmlidXRlIHJlcXVpcmVzIHBhcnNpbmcgaXRzIGFyZ3VtZW50cworLy8vIGluIGFuIHVuZXZhbHVhdGVkIGNvbnRleHQgb3Igbm90Lgorc3RhdGljIGJvb2wgYXR0cmlidXRlUGFyc2VkQXJnc1VuZXZhbHVhdGVkKGNvbnN0IElkZW50aWZpZXJJbmZvICZJSSkgeworI2RlZmluZSBDTEFOR19BVFRSX0FSR19DT05URVhUX0xJU1QKKyAgcmV0dXJuIGxsdm06OlN0cmluZ1N3aXRjaDxib29sPihub3JtYWxpemVBdHRyTmFtZShJSS5nZXROYW1lKCkpKQorI2luY2x1ZGUgImNsYW5nL1BhcnNlL0F0dHJQYXJzZXJTdHJpbmdTd2l0Y2hlcy5pbmMiCisgICAgICAgICAgIC5EZWZhdWx0KGZhbHNlKTsKKyN1bmRlZiBDTEFOR19BVFRSX0FSR19DT05URVhUX0xJU1QKIH0KIAogSWRlbnRpZmllckxvYyAqUGFyc2VyOjpQYXJzZUlkZW50aWZpZXJMb2MoKSB7CkBAIC0yMzcsNTQgKzI2MSwxOSBAQAogICAgICAgICAgICAgICAgICAwLCBBdHRyTmFtZUxvYywgMCwgMCwgQXR0cmlidXRlTGlzdDo6QVNfR05VKTsKIH0KIAotLy8vIFBhcnNlIHRoZSBhcmd1bWVudHMgdG8gYSBwYXJhbWV0ZXJpemVkIEdOVSBhdHRyaWJ1dGUgb3IKLS8vLyBhIEMrKzExIGF0dHJpYnV0ZSBpbiAiZ251IiBuYW1lc3BhY2UuCi12b2lkIFBhcnNlcjo6UGFyc2VHTlVBdHRyaWJ1dGVBcmdzKElkZW50aWZpZXJJbmZvICpBdHRyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXR0ck5hbWVMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZEF0dHJpYnV0ZXMgJkF0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqRW5kTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqU2NvcGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTY29wZUxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdDo6U3ludGF4IFN5bnRheCkgewotCi0gIGFzc2VydChUb2suaXModG9rOjpsX3BhcmVuKSAmJiAiQXR0cmlidXRlIGFyZyBsaXN0IG5vdCBzdGFydGluZyB3aXRoICcoJyIpOwotCi0gIEF0dHJpYnV0ZUxpc3Q6OktpbmQgQXR0cktpbmQgPQotICAgICAgQXR0cmlidXRlTGlzdDo6Z2V0S2luZChBdHRyTmFtZSwgU2NvcGVOYW1lLCBTeW50YXgpOwotCi0gIC8vIEF2YWlsYWJpbGl0eSBhdHRyaWJ1dGVzIGhhdmUgdGhlaXIgb3duIGdyYW1tYXIuCi0gIC8vIEZJWE1FOiBBbGwgdGhlc2UgY2FzZXMgZmFpbCB0byBwYXNzIGluIHRoZSBzeW50YXggYW5kIHNjb3BlLCBhbmQgbWlnaHQgYmUKLSAgLy8gd3JpdHRlbiBhcyBDKysxMSBnbnU6OiBhdHRyaWJ1dGVzLgotICBpZiAoQXR0cktpbmQgPT0gQXR0cmlidXRlTGlzdDo6QVRfQXZhaWxhYmlsaXR5KSB7Ci0gICAgUGFyc2VBdmFpbGFiaWxpdHlBdHRyaWJ1dGUoKkF0dHJOYW1lLCBBdHRyTmFtZUxvYywgQXR0cnMsIEVuZExvYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIFRocmVhZCBzYWZldHkgYXR0cmlidXRlcyBhcmUgcGFyc2VkIGluIGFuIHVuZXZhbHVhdGVkIGNvbnRleHQuCi0gIC8vIEZJWE1FOiBTaGFyZSB0aGUgYnVsayBvZiB0aGUgcGFyc2luZyBjb2RlIGhlcmUgYW5kIGp1c3QgcHVsbCBvdXQKLSAgLy8gdGhlIHVuZXZhbHVhdGVkIGNvbnRleHQuCi0gIGlmIChJc1RocmVhZFNhZmV0eUF0dHJpYnV0ZShBdHRyTmFtZS0+Z2V0TmFtZSgpKSkgewotICAgIFBhcnNlVGhyZWFkU2FmZXR5QXR0cmlidXRlKCpBdHRyTmFtZSwgQXR0ck5hbWVMb2MsIEF0dHJzLCBFbmRMb2MpOwotICAgIHJldHVybjsKLSAgfQotICAvLyBUeXBlIHNhZmV0eSBhdHRyaWJ1dGVzIGhhdmUgdGhlaXIgb3duIGdyYW1tYXIuCi0gIGlmIChBdHRyS2luZCA9PSBBdHRyaWJ1dGVMaXN0OjpBVF9UeXBlVGFnRm9yRGF0YXR5cGUpIHsKLSAgICBQYXJzZVR5cGVUYWdGb3JEYXRhdHlwZUF0dHJpYnV0ZSgqQXR0ck5hbWUsIEF0dHJOYW1lTG9jLCBBdHRycywgRW5kTG9jKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gU29tZSBhdHRyaWJ1dGVzIGV4cGVjdCBzb2xlbHkgYSB0eXBlIHBhcmFtZXRlci4KLSAgaWYgKGF0dHJpYnV0ZUlzVHlwZUFyZ0F0dHIoKkF0dHJOYW1lKSkgewotICAgIFBhcnNlQXR0cmlidXRlV2l0aFR5cGVBcmcoKkF0dHJOYW1lLCBBdHRyTmFtZUxvYywgQXR0cnMsIEVuZExvYyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KK3ZvaWQgUGFyc2VyOjpQYXJzZUF0dHJpYnV0ZUFyZ3NDb21tb24oCisgICAgSWRlbnRpZmllckluZm8gKkF0dHJOYW1lLCBTb3VyY2VMb2NhdGlvbiBBdHRyTmFtZUxvYywKKyAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywgU291cmNlTG9jYXRpb24gKkVuZExvYywgSWRlbnRpZmllckluZm8gKlNjb3BlTmFtZSwKKyAgICBTb3VyY2VMb2NhdGlvbiBTY29wZUxvYywgQXR0cmlidXRlTGlzdDo6U3ludGF4IFN5bnRheCkgewogICAvLyBJZ25vcmUgdGhlIGxlZnQgcGFyZW4gbG9jYXRpb24gZm9yIG5vdy4KICAgQ29uc3VtZVBhcmVuKCk7CiAKICAgQXJnc1ZlY3RvciBBcmdFeHByczsKLQogICBpZiAoVG9rLmlzKHRvazo6aWRlbnRpZmllcikpIHsKICAgICAvLyBJZiB0aGlzIGF0dHJpYnV0ZSB3YW50cyBhbiAnaWRlbnRpZmllcicgYXJndW1lbnQsIG1ha2UgaXQgc28uCiAgICAgYm9vbCBJc0lkZW50aWZpZXJBcmcgPSBhdHRyaWJ1dGVIYXNJZGVudGlmaWVyQXJnKCpBdHRyTmFtZSk7CisgICAgQXR0cmlidXRlTGlzdDo6S2luZCBBdHRyS2luZCA9CisgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OmdldEtpbmQoQXR0ck5hbWUsIFNjb3BlTmFtZSwgU3ludGF4KTsKIAogICAgIC8vIElmIHdlIGRvbid0IGtub3cgaG93IHRvIHBhcnNlIHRoaXMgYXR0cmlidXRlLCBidXQgdGhpcyBpcyB0aGUgb25seQogICAgIC8vIHRva2VuIGluIHRoaXMgYXJndW1lbnQsIGFzc3VtZSBpdCdzIG1lYW50IHRvIGJlIGFuIGlkZW50aWZpZXIuCkBAIC0zMDQsMTEyICsyOTMsMTIwIEBACiAgICAgICBDb25zdW1lVG9rZW4oKTsKIAogICAgIC8vIFBhcnNlIHRoZSBub24tZW1wdHkgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMuCi0gICAgd2hpbGUgKDEpIHsKKyAgICBkbyB7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RW50ZXJFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQ+IFVuZXZhbHVhdGVkOworICAgICAgaWYgKGF0dHJpYnV0ZVBhcnNlZEFyZ3NVbmV2YWx1YXRlZCgqQXR0ck5hbWUpKQorICAgICAgICBVbmV2YWx1YXRlZC5yZXNldCgKKyAgICAgICAgICAgIG5ldyBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dChBY3Rpb25zLCBTZW1hOjpVbmV2YWx1YXRlZCkpOworCiAgICAgICBFeHByUmVzdWx0IEFyZ0V4cHIoUGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpKTsKICAgICAgIGlmIChBcmdFeHByLmlzSW52YWxpZCgpKSB7CiAgICAgICAgIFNraXBVbnRpbCh0b2s6OnJfcGFyZW4sIFN0b3BBdFNlbWkpOwogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgICBBcmdFeHBycy5wdXNoX2JhY2soQXJnRXhwci5yZWxlYXNlKCkpOwotICAgICAgaWYgKFRvay5pc05vdCh0b2s6OmNvbW1hKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBDb25zdW1lVG9rZW4oKTsgLy8gRWF0IHRoZSBjb21tYSwgbW92ZSB0byB0aGUgbmV4dCBhcmd1bWVudAotICAgIH0KKyAgICAgIC8vIEVhdCB0aGUgY29tbWEsIG1vdmUgdG8gdGhlIG5leHQgYXJndW1lbnQKKyAgICB9IHdoaWxlIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpOwogICB9CiAKICAgU291cmNlTG9jYXRpb24gUlBhcmVuID0gVG9rLmdldExvY2F0aW9uKCk7Ci0gIGlmICghRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnJfcGFyZW4sIGRpYWc6OmVycl9leHBlY3RlZF9ycGFyZW4pKSB7CisgIGlmICghRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnJfcGFyZW4pKSB7CiAgICAgU291cmNlTG9jYXRpb24gQXR0ckxvYyA9IFNjb3BlTG9jLmlzVmFsaWQoKSA/IFNjb3BlTG9jIDogQXR0ck5hbWVMb2M7CiAgICAgQXR0cnMuYWRkTmV3KEF0dHJOYW1lLCBTb3VyY2VSYW5nZShBdHRyTG9jLCBSUGFyZW4pLCBTY29wZU5hbWUsIFNjb3BlTG9jLAogICAgICAgICAgICAgICAgICBBcmdFeHBycy5kYXRhKCksIEFyZ0V4cHJzLnNpemUoKSwgU3ludGF4KTsKICAgfQorCisgIGlmIChFbmRMb2MpCisgICAgKkVuZExvYyA9IFJQYXJlbjsKIH0KIAotLy8vIFxicmllZiBQYXJzZXMgYSBzaW5nbGUgYXJndW1lbnQgZm9yIGEgZGVjbHNwZWMsIGluY2x1ZGluZyB0aGUKLS8vLyBzdXJyb3VuZGluZyBwYXJlbnMuCi12b2lkIFBhcnNlcjo6UGFyc2VNaWNyb3NvZnREZWNsU3BlY1dpdGhTaW5nbGVBcmcoSWRlbnRpZmllckluZm8gKkF0dHJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0dHJOYW1lTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZEF0dHJpYnV0ZXMgJkF0dHJzKQotewotICBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIgVCgqdGhpcywgdG9rOjpsX3BhcmVuKTsKLSAgaWYgKFQuZXhwZWN0QW5kQ29uc3VtZShkaWFnOjplcnJfZXhwZWN0ZWRfbHBhcmVuX2FmdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJOYW1lLT5nZXROYW1lU3RhcnQoKSwgdG9rOjpyX3BhcmVuKSkKLSAgICByZXR1cm47CisvLy8gUGFyc2UgdGhlIGFyZ3VtZW50cyB0byBhIHBhcmFtZXRlcml6ZWQgR05VIGF0dHJpYnV0ZSBvcgorLy8vIGEgQysrMTEgYXR0cmlidXRlIGluICJnbnUiIG5hbWVzcGFjZS4KK3ZvaWQgUGFyc2VyOjpQYXJzZUdOVUF0dHJpYnV0ZUFyZ3MoSWRlbnRpZmllckluZm8gKkF0dHJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWZpZXJJbmZvICpTY29wZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFNjb3BlTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpTeW50YXggU3ludGF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdG9yICpEKSB7CiAKLSAgRXhwclJlc3VsdCBBcmdFeHByKFBhcnNlQ29uc3RhbnRFeHByZXNzaW9uKCkpOwotICBpZiAoQXJnRXhwci5pc0ludmFsaWQoKSkgewotICAgIFQuc2tpcFRvRW5kKCk7CisgIGFzc2VydChUb2suaXModG9rOjpsX3BhcmVuKSAmJiAiQXR0cmlidXRlIGFyZyBsaXN0IG5vdCBzdGFydGluZyB3aXRoICcoJyIpOworCisgIEF0dHJpYnV0ZUxpc3Q6OktpbmQgQXR0cktpbmQgPQorICAgICAgQXR0cmlidXRlTGlzdDo6Z2V0S2luZChBdHRyTmFtZSwgU2NvcGVOYW1lLCBTeW50YXgpOworCisgIC8vIEF2YWlsYWJpbGl0eSBhdHRyaWJ1dGVzIGhhdmUgdGhlaXIgb3duIGdyYW1tYXIuCisgIC8vIEZJWE1FOiBBbGwgdGhlc2UgY2FzZXMgZmFpbCB0byBwYXNzIGluIHRoZSBzeW50YXggYW5kIHNjb3BlLCBhbmQgbWlnaHQgYmUKKyAgLy8gd3JpdHRlbiBhcyBDKysxMSBnbnU6OiBhdHRyaWJ1dGVzLgorICBpZiAoQXR0cktpbmQgPT0gQXR0cmlidXRlTGlzdDo6QVRfQXZhaWxhYmlsaXR5KSB7CisgICAgUGFyc2VBdmFpbGFiaWxpdHlBdHRyaWJ1dGUoKkF0dHJOYW1lLCBBdHRyTmFtZUxvYywgQXR0cnMsIEVuZExvYyk7CiAgICAgcmV0dXJuOwogICB9Ci0gIEFyZ3NVbmlvbiBFeHByTGlzdCA9IEFyZ0V4cHIudGFrZSgpOwotICBBdHRycy5hZGROZXcoQXR0ck5hbWUsIEF0dHJOYW1lTG9jLCAwLCBBdHRyTmFtZUxvYywgJkV4cHJMaXN0LCAxLAotICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdDo6QVNfRGVjbHNwZWMpOwogCi0gIFQuY29uc3VtZUNsb3NlKCk7CisgIGlmIChBdHRyS2luZCA9PSBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDQnJpZGdlUmVsYXRlZCkgeworICAgIFBhcnNlT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyaWJ1dGUoKkF0dHJOYW1lLCBBdHRyTmFtZUxvYywgQXR0cnMsIEVuZExvYyk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVHlwZSBzYWZldHkgYXR0cmlidXRlcyBoYXZlIHRoZWlyIG93biBncmFtbWFyLgorICBpZiAoQXR0cktpbmQgPT0gQXR0cmlidXRlTGlzdDo6QVRfVHlwZVRhZ0ZvckRhdGF0eXBlKSB7CisgICAgUGFyc2VUeXBlVGFnRm9yRGF0YXR5cGVBdHRyaWJ1dGUoKkF0dHJOYW1lLCBBdHRyTmFtZUxvYywgQXR0cnMsIEVuZExvYyk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gU29tZSBhdHRyaWJ1dGVzIGV4cGVjdCBzb2xlbHkgYSB0eXBlIHBhcmFtZXRlci4KKyAgaWYgKGF0dHJpYnV0ZUlzVHlwZUFyZ0F0dHIoKkF0dHJOYW1lKSkgeworICAgIFBhcnNlQXR0cmlidXRlV2l0aFR5cGVBcmcoKkF0dHJOYW1lLCBBdHRyTmFtZUxvYywgQXR0cnMsIEVuZExvYyk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVGhlc2UgbWF5IHJlZmVyIHRvIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMsIGJ1dCBuZWVkIHRvIGJlIHBhcnNlZCBlYXJseSB0bworICAvLyBwYXJ0aWNpcGF0ZSBpbiBkZXRlcm1pbmluZyB3aGV0aGVyIGl0J3MgYSByZWRlY2xhcmF0aW9uLgorICBzdGQ6OnVuaXF1ZV9wdHI8UGFyc2VTY29wZT4gUHJvdG90eXBlU2NvcGU7CisgIGlmIChBdHRyTmFtZS0+aXNTdHIoImVuYWJsZV9pZiIpICYmIEQgJiYgRC0+aXNGdW5jdGlvbkRlY2xhcmF0b3IoKSkgeworICAgIERlY2xhcmF0b3JDaHVuazo6RnVuY3Rpb25UeXBlSW5mbyBGVEkgPSBELT5nZXRGdW5jdGlvblR5cGVJbmZvKCk7CisgICAgUHJvdG90eXBlU2NvcGUucmVzZXQobmV3IFBhcnNlU2NvcGUodGhpcywgU2NvcGU6OkZ1bmN0aW9uUHJvdG90eXBlU2NvcGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlOjpGdW5jdGlvbkRlY2xhcmF0aW9uU2NvcGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlOjpEZWNsU2NvcGUpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IEZUSS5OdW1QYXJhbXM7ICsraSkgeworICAgICAgUGFybVZhckRlY2wgKlBhcmFtID0gY2FzdDxQYXJtVmFyRGVjbD4oRlRJLlBhcmFtc1tpXS5QYXJhbSk7CisgICAgICBBY3Rpb25zLkFjdE9uUmVlbnRlckNYWE1ldGhvZFBhcmFtZXRlcihnZXRDdXJTY29wZSgpLCBQYXJhbSk7CisgICAgfQorICB9CisKKyAgUGFyc2VBdHRyaWJ1dGVBcmdzQ29tbW9uKEF0dHJOYW1lLCBBdHRyTmFtZUxvYywgQXR0cnMsIEVuZExvYywgU2NvcGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGVMb2MsIFN5bnRheCk7CiB9CiAKLS8vLyBcYnJpZWYgRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZGVjbHNwZWMgaXMgYSAic2ltcGxlIiBvbmUgcmVxdWlyaW5nIG5vCi0vLy8gYXJndW1lbnRzLgotYm9vbCBQYXJzZXI6OklzU2ltcGxlTWljcm9zb2Z0RGVjbFNwZWMoSWRlbnRpZmllckluZm8gKklkZW50KSB7Ci0gIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8Ym9vbD4oSWRlbnQtPmdldE5hbWUoKSkKLSAgICAuQ2FzZSgiZGxsaW1wb3J0IiwgdHJ1ZSkKLSAgICAuQ2FzZSgiZGxsZXhwb3J0IiwgdHJ1ZSkKLSAgICAuQ2FzZSgibm9yZXR1cm4iLCB0cnVlKQotICAgIC5DYXNlKCJub3Rocm93IiwgdHJ1ZSkKLSAgICAuQ2FzZSgibm9pbmxpbmUiLCB0cnVlKQotICAgIC5DYXNlKCJuYWtlZCIsIHRydWUpCi0gICAgLkNhc2UoImFwcGRvbWFpbiIsIHRydWUpCi0gICAgLkNhc2UoInByb2Nlc3MiLCB0cnVlKQotICAgIC5DYXNlKCJqaXRpbnRyaW5zaWMiLCB0cnVlKQotICAgIC5DYXNlKCJub2FsaWFzIiwgdHJ1ZSkKLSAgICAuQ2FzZSgicmVzdHJpY3QiLCB0cnVlKQotICAgIC5DYXNlKCJub3Z0YWJsZSIsIHRydWUpCi0gICAgLkNhc2UoInNlbGVjdGFueSIsIHRydWUpCi0gICAgLkNhc2UoInRocmVhZCIsIHRydWUpCi0gICAgLkNhc2UoInNhZmVidWZmZXJzIiwgdHJ1ZSApCi0gICAgLkRlZmF1bHQoZmFsc2UpOwotfQorYm9vbCBQYXJzZXI6OlBhcnNlTWljcm9zb2Z0RGVjbFNwZWNBcmdzKElkZW50aWZpZXJJbmZvICpBdHRyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyTmFtZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycykgeworICAvLyBJZiB0aGUgYXR0cmlidXRlIGlzbid0IGtub3duLCB3ZSB3aWxsIG5vdCBhdHRlbXB0IHRvIHBhcnNlIGFueQorICAvLyBhcmd1bWVudHMuCisgIGlmICghaGFzQXR0cmlidXRlKEF0dHJTeW50YXg6OkRlY2xzcGVjLCBudWxscHRyLCBBdHRyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0VGFyZ2V0SW5mbygpLmdldFRyaXBsZSgpLCBnZXRMYW5nT3B0cygpKSkgeworICAgIC8vIEVhdCB0aGUgbGVmdCBwYXJlbiwgdGhlbiBza2lwIHRvIHRoZSBlbmRpbmcgcmlnaHQgcGFyZW4uCisgICAgQ29uc3VtZVBhcmVuKCk7CisgICAgU2tpcFVudGlsKHRvazo6cl9wYXJlbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CiAKLS8vLyBcYnJpZWYgQXR0ZW1wdHMgdG8gcGFyc2UgYSBkZWNsc3BlYyB3aGljaCBpcyBub3Qgc2ltcGxlIChvbmUgdGhhdCB0YWtlcwotLy8vIHBhcmFtZXRlcnMpLiAgV2lsbCByZXR1cm4gZmFsc2UgaWYgd2UgcHJvcGVybHkgaGFuZGxlZCB0aGUgZGVjbHNwZWMsIG9yCi0vLy8gdHJ1ZSBpZiBpdCBpcyBhbiB1bmtub3duIGRlY2xzcGVjLgotdm9pZCBQYXJzZXI6OlBhcnNlQ29tcGxleE1pY3Jvc29mdERlY2xTcGVjKElkZW50aWZpZXJJbmZvICpJZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmQXR0cnMpIHsKLSAgLy8gVHJ5IHRvIGhhbmRsZSB0aGUgZWFzeSBjYXNlIGZpcnN0IC0tIHRoZXNlIGRlY2xzcGVjcyBhbGwgdGFrZSBhIHNpbmdsZQotICAvLyBwYXJhbWV0ZXIgYXMgdGhlaXIgYXJndW1lbnQuCi0gIGlmIChsbHZtOjpTdHJpbmdTd2l0Y2g8Ym9vbD4oSWRlbnQtPmdldE5hbWUoKSkKLSAgICAgIC5DYXNlKCJ1dWlkIiwgdHJ1ZSkKLSAgICAgIC5DYXNlKCJhbGlnbiIsIHRydWUpCi0gICAgICAuQ2FzZSgiYWxsb2NhdGUiLCB0cnVlKQotICAgICAgLkRlZmF1bHQoZmFsc2UpKSB7Ci0gICAgUGFyc2VNaWNyb3NvZnREZWNsU3BlY1dpdGhTaW5nbGVBcmcoSWRlbnQsIExvYywgQXR0cnMpOwotICB9IGVsc2UgaWYgKElkZW50LT5nZXROYW1lKCkgPT0gImRlcHJlY2F0ZWQiKSB7Ci0gICAgLy8gVGhlIGRlcHJlY2F0ZWQgZGVjbHNwZWMgaGFzIGFuIG9wdGlvbmFsIHNpbmdsZSBhcmd1bWVudCwgc28gd2Ugd2lsbAotICAgIC8vIGNoZWNrIGZvciBhIGwtcGFyZW4gdG8gZGVjaWRlIHdoZXRoZXIgd2Ugc2hvdWxkIHBhcnNlIGFuIGFyZ3VtZW50IG9yCi0gICAgLy8gbm90LgotICAgIGlmIChUb2suZ2V0S2luZCgpID09IHRvazo6bF9wYXJlbikKLSAgICAgIFBhcnNlTWljcm9zb2Z0RGVjbFNwZWNXaXRoU2luZ2xlQXJnKElkZW50LCBMb2MsIEF0dHJzKTsKLSAgICBlbHNlCi0gICAgICBBdHRycy5hZGROZXcoSWRlbnQsIExvYywgMCwgTG9jLCAwLCAwLCBBdHRyaWJ1dGVMaXN0OjpBU19EZWNsc3BlYyk7Ci0gIH0gZWxzZSBpZiAoSWRlbnQtPmdldE5hbWUoKSA9PSAicHJvcGVydHkiKSB7CisgIGlmIChBdHRyTmFtZS0+Z2V0TmFtZSgpID09ICJwcm9wZXJ0eSIpIHsKICAgICAvLyBUaGUgcHJvcGVydHkgZGVjbHNwZWMgaXMgbW9yZSBjb21wbGV4IGluIHRoYXQgaXQgY2FuIHRha2Ugb25lIG9yIHR3bwogICAgIC8vIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMgYXMgYSBwYXJhbWV0ZXIsIGJ1dCB0aGUgbGhzIG9mIHRoZSBhc3NpZ25tZW50CiAgICAgLy8gbXVzdCBiZSBuYW1lZCBnZXQgb3IgcHV0LgotICAgIGlmIChUb2suaXNOb3QodG9rOjpsX3BhcmVuKSkgewotICAgICAgRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2xwYXJlbl9hZnRlcikKLSAgICAgICAgPDwgSWRlbnQtPmdldE5hbWVTdGFydCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KKwogICAgIEJhbGFuY2VkRGVsaW1pdGVyVHJhY2tlciBUKCp0aGlzLCB0b2s6OmxfcGFyZW4pOwogICAgIFQuZXhwZWN0QW5kQ29uc3VtZShkaWFnOjplcnJfZXhwZWN0ZWRfbHBhcmVuX2FmdGVyLAotICAgICAgICAgICAgICAgICAgICAgICBJZGVudC0+Z2V0TmFtZVN0YXJ0KCksIHRvazo6cl9wYXJlbik7CisgICAgICAgICAgICAgICAgICAgICAgIEF0dHJOYW1lLT5nZXROYW1lU3RhcnQoKSwgdG9rOjpyX3BhcmVuKTsKIAogICAgIGVudW0gQWNjZXNzb3JLaW5kIHsKICAgICAgIEFLX0ludmFsaWQgPSAtMSwKLSAgICAgIEFLX1B1dCA9IDAsIEFLX0dldCA9IDEgLy8gaW5kaWNlcyBpbnRvIEFjY2Vzc29yTmFtZXMKKyAgICAgIEFLX1B1dCA9IDAsCisgICAgICBBS19HZXQgPSAxIC8vIGluZGljZXMgaW50byBBY2Nlc3Nvck5hbWVzCiAgICAgfTsKLSAgICBJZGVudGlmaWVySW5mbyAqQWNjZXNzb3JOYW1lc1tdID0geyAwLCAwIH07CisgICAgSWRlbnRpZmllckluZm8gKkFjY2Vzc29yTmFtZXNbXSA9IHswLCAwfTsKICAgICBib29sIEhhc0ludmFsaWRBY2Nlc3NvciA9IGZhbHNlOwogCiAgICAgLy8gUGFyc2UgdGhlIGFjY2Vzc29yIHNwZWNpZmljYXRpb25zLgpAQCAtNDE5LDcgKzQxNiw3IEBACiAgICAgICAgIC8vIElmIHRoZSB1c2VyIHdyb3RlIGEgY29tcGxldGVseSBlbXB0eSBsaXN0LCB1c2UgYSBzcGVjaWFsIGRpYWdub3N0aWMuCiAgICAgICAgIGlmIChUb2suaXModG9rOjpyX3BhcmVuKSAmJiAhSGFzSW52YWxpZEFjY2Vzc29yICYmCiAgICAgICAgICAgICBBY2Nlc3Nvck5hbWVzW0FLX1B1dF0gPT0gMCAmJiBBY2Nlc3Nvck5hbWVzW0FLX0dldF0gPT0gMCkgewotICAgICAgICAgIERpYWcoTG9jLCBkaWFnOjplcnJfbXNfcHJvcGVydHlfbm9fZ2V0dGVyX29yX3B1dHRlcik7CisgICAgICAgICAgRGlhZyhBdHRyTmFtZUxvYywgZGlhZzo6ZXJyX21zX3Byb3BlcnR5X25vX2dldHRlcl9vcl9wdXR0ZXIpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTQzNSwzOSArNDMyLDM4IEBACiAgICAgICB9IGVsc2UgaWYgKEtpbmRTdHIgPT0gInB1dCIpIHsKICAgICAgICAgS2luZCA9IEFLX1B1dDsKIAotICAgICAgLy8gUmVjb3ZlciBmcm9tIHRoZSBjb21tb24gbWlzdGFrZSBvZiB1c2luZyAnc2V0JyBpbnN0ZWFkIG9mICdwdXQnLgorICAgICAgICAvLyBSZWNvdmVyIGZyb20gdGhlIGNvbW1vbiBtaXN0YWtlIG9mIHVzaW5nICdzZXQnIGluc3RlYWQgb2YgJ3B1dCcuCiAgICAgICB9IGVsc2UgaWYgKEtpbmRTdHIgPT0gInNldCIpIHsKICAgICAgICAgRGlhZyhLaW5kTG9jLCBkaWFnOjplcnJfbXNfcHJvcGVydHlfaGFzX3NldF9hY2Nlc3NvcikKLSAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlcGxhY2VtZW50KEtpbmRMb2MsICJwdXQiKTsKKyAgICAgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlUmVwbGFjZW1lbnQoS2luZExvYywgInB1dCIpOwogICAgICAgICBLaW5kID0gQUtfUHV0OwogCi0gICAgICAvLyBIYW5kbGUgdGhlIG1pc3Rha2Ugb2YgZm9yZ2V0dGluZyB0aGUgYWNjZXNzb3Iga2luZCBieSBza2lwcGluZwotICAgICAgLy8gdGhpcyBhY2Nlc3Nvci4KKyAgICAgICAgLy8gSGFuZGxlIHRoZSBtaXN0YWtlIG9mIGZvcmdldHRpbmcgdGhlIGFjY2Vzc29yIGtpbmQgYnkgc2tpcHBpbmcKKyAgICAgICAgLy8gdGhpcyBhY2Nlc3Nvci4KICAgICAgIH0gZWxzZSBpZiAoTmV4dFRva2VuKCkuaXModG9rOjpjb21tYSkgfHwgTmV4dFRva2VuKCkuaXModG9rOjpyX3BhcmVuKSkgewogICAgICAgICBEaWFnKEtpbmRMb2MsIGRpYWc6OmVycl9tc19wcm9wZXJ0eV9taXNzaW5nX2FjY2Vzc29yX2tpbmQpOwogICAgICAgICBDb25zdW1lVG9rZW4oKTsKICAgICAgICAgSGFzSW52YWxpZEFjY2Vzc29yID0gdHJ1ZTsKICAgICAgICAgZ290byBuZXh0X3Byb3BlcnR5X2FjY2Vzc29yOwogCi0gICAgICAvLyBPdGhlcndpc2UsIGNvbXBsYWluIGFib3V0IHRoZSB1bmtub3duIGFjY2Vzc29yIGtpbmQuCisgICAgICAgIC8vIE90aGVyd2lzZSwgY29tcGxhaW4gYWJvdXQgdGhlIHVua25vd24gYWNjZXNzb3Iga2luZC4KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIERpYWcoS2luZExvYywgZGlhZzo6ZXJyX21zX3Byb3BlcnR5X3Vua25vd25fYWNjZXNzb3IpOwogICAgICAgICBIYXNJbnZhbGlkQWNjZXNzb3IgPSB0cnVlOwogICAgICAgICBLaW5kID0gQUtfSW52YWxpZDsKIAogICAgICAgICAvLyBUcnkgdG8ga2VlcCBwYXJzaW5nIHVubGVzcyBpdCBkb2Vzbid0IGxvb2sgbGlrZSBhbiBhY2Nlc3NvciBzcGVjLgotICAgICAgICBpZiAoIU5leHRUb2tlbigpLmlzKHRvazo6ZXF1YWwpKSBicmVhazsKKyAgICAgICAgaWYgKCFOZXh0VG9rZW4oKS5pcyh0b2s6OmVxdWFsKSkKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KIAogICAgICAgLy8gQ29uc3VtZSB0aGUgaWRlbnRpZmllci4KICAgICAgIENvbnN1bWVUb2tlbigpOwogCiAgICAgICAvLyBDb25zdW1lIHRoZSAnPScuCi0gICAgICBpZiAoVG9rLmlzKHRvazo6ZXF1YWwpKSB7Ci0gICAgICAgIENvbnN1bWVUb2tlbigpOwotICAgICAgfSBlbHNlIHsKKyAgICAgIGlmICghVHJ5Q29uc3VtZVRva2VuKHRvazo6ZXF1YWwpKSB7CiAgICAgICAgIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9tc19wcm9wZXJ0eV9leHBlY3RlZF9lcXVhbCkKLSAgICAgICAgICA8PCBLaW5kU3RyOworICAgICAgICAgICAgPDwgS2luZFN0cjsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKQEAgLTQ4OSw0MSArNDg1LDI5IEBACiAKICAgICBuZXh0X3Byb3BlcnR5X2FjY2Vzc29yOgogICAgICAgLy8gS2VlcCBwcm9jZXNzaW5nIGFjY2Vzc29ycyB1bnRpbCB3ZSBydW4gb3V0LgotICAgICAgaWYgKFRvay5pcyh0b2s6OmNvbW1hKSkgewotICAgICAgICBDb25zdW1lQW55VG9rZW4oKTsKKyAgICAgIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpCiAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAvLyBJZiB3ZSBydW4gaW50byB0aGUgJyknLCBzdG9wIHdpdGhvdXQgY29uc3VtaW5nIGl0LgotICAgICAgfSBlbHNlIGlmIChUb2suaXModG9rOjpyX3BhcmVuKSkgeworICAgICAgaWYgKFRvay5pcyh0b2s6OnJfcGFyZW4pKQogICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9tc19wcm9wZXJ0eV9leHBlY3RlZF9jb21tYV9vcl9ycGFyZW4pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KKworICAgICAgRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX21zX3Byb3BlcnR5X2V4cGVjdGVkX2NvbW1hX29yX3JwYXJlbik7CisgICAgICBicmVhazsKICAgICB9CiAKICAgICAvLyBPbmx5IGFkZCB0aGUgcHJvcGVydHkgYXR0cmlidXRlIGlmIGl0IHdhcyB3ZWxsLWZvcm1lZC4KLSAgICBpZiAoIUhhc0ludmFsaWRBY2Nlc3NvcikgewotICAgICAgQXR0cnMuYWRkTmV3UHJvcGVydHlBdHRyKElkZW50LCBMb2MsIDAsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgaWYgKCFIYXNJbnZhbGlkQWNjZXNzb3IpCisgICAgICBBdHRycy5hZGROZXdQcm9wZXJ0eUF0dHIoQXR0ck5hbWUsIEF0dHJOYW1lTG9jLCAwLCBTb3VyY2VMb2NhdGlvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc29yTmFtZXNbQUtfR2V0XSwgQWNjZXNzb3JOYW1lc1tBS19QdXRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OkFTX0RlY2xzcGVjKTsKLSAgICB9CiAgICAgVC5za2lwVG9FbmQoKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBXZSBkb24ndCByZWNvZ25pemUgdGhpcyBhcyBhIHZhbGlkIGRlY2xzcGVjLCBidXQgaW5zdGVhZCBvZiBjcmVhdGluZyB0aGUKLSAgICAvLyBhdHRyaWJ1dGUgYW5kIGFsbG93aW5nIHNlbWEgdG8gd2FybiBhYm91dCBpdCwgd2Ugd2lsbCB3YXJuIGhlcmUgaW5zdGVhZC4KLSAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugc29tZSBhdHRyaWJ1dGVzIGhhdmUgbXVsdGlwbGUgc3BlbGxpbmdzLCBidXQgd2UgbmVlZCB0bwotICAgIC8vIGRpc2FsbG93IHRoYXQgZm9yIGRlY2xzcGVjcyAoc3VjaCBhcyBhbGlnbiB2cyBhbGlnbmVkKS4gIElmIHdlIG1hZGUgdGhlCi0gICAgLy8gYXR0cmlidXRlLCB3ZSdkIGhhdmUgdG8gc3BsaXQgdGhlIHZhbGlkIGRlY2xzcGVjIHNwZWxsaW5nIGxvZ2ljIGludG8KLSAgICAvLyBib3RoIGxvY2F0aW9ucy4KLSAgICBEaWFnKExvYywgZGlhZzo6d2Fybl9tc19kZWNsc3BlY191bmtub3duKSA8PCBJZGVudDsKLQotICAgIC8vIElmIHRoZXJlJ3MgYW4gb3BlbiBwYXJlbiwgd2Ugc2hvdWxkIGVhdCB0aGUgb3BlbiBhbmQgY2xvc2UgcGFyZW5zIHVuZGVyCi0gICAgLy8gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIHVua25vd24gZGVjbHNwZWMgaGFzIHBhcmFtZXRlcnMuCi0gICAgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyIFQoKnRoaXMsIHRvazo6bF9wYXJlbik7Ci0gICAgaWYgKCFULmNvbnN1bWVPcGVuKCkpCi0gICAgICBULnNraXBUb0VuZCgpOworICAgIHJldHVybiAhSGFzSW52YWxpZEFjY2Vzc29yOwogICB9CisKKyAgUGFyc2VBdHRyaWJ1dGVBcmdzQ29tbW9uKEF0dHJOYW1lLCBBdHRyTmFtZUxvYywgQXR0cnMsIG51bGxwdHIsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBBdHRyaWJ1dGVMaXN0OjpBU19EZWNsc3BlYyk7CisgIHJldHVybiB0cnVlOwogfQogCiAvLy8gW01TXSBkZWNsLXNwZWNpZmllcjoKQEAgLTU0Myw3ICs1MjcsMTEgQEAKIAogICAvLyBBbiBlbXB0eSBkZWNsc3BlYyBpcyBwZXJmZWN0bHkgbGVnYWwgYW5kIHNob3VsZCBub3Qgd2Fybi4gIEFkZGl0aW9uYWxseSwKICAgLy8geW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGF0dHJpYnV0ZXMgcGVyIGRlY2xzcGVjLgotICB3aGlsZSAoVG9rLmdldEtpbmQoKSAhPSB0b2s6OnJfcGFyZW4pIHsKKyAgd2hpbGUgKFRvay5pc05vdCh0b2s6OnJfcGFyZW4pKSB7CisgICAgLy8gQXR0cmlidXRlIG5vdCBwcmVzZW50LgorICAgIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpCisgICAgICBjb250aW51ZTsKKwogICAgIC8vIFdlIGV4cGVjdCBlaXRoZXIgYSB3ZWxsLWtub3duIGlkZW50aWZpZXIgb3IgYSBnZW5lcmljIHN0cmluZy4gIEFueXRoaW5nCiAgICAgLy8gZWxzZSBpcyBhIG1hbGZvcm1lZCBkZWNsc3BlYy4KICAgICBib29sIElzU3RyaW5nID0gVG9rLmdldEtpbmQoKSA9PSB0b2s6OnN0cmluZ19saXRlcmFsID8gdHJ1ZSA6IGZhbHNlOwpAQCAtNTcxLDE3ICs1NTksMTkgQEAKICAgICAgIEF0dHJOYW1lTG9jID0gQ29uc3VtZVRva2VuKCk7CiAgICAgfQogCi0gICAgaWYgKElzU3RyaW5nIHx8IElzU2ltcGxlTWljcm9zb2Z0RGVjbFNwZWMoQXR0ck5hbWUpKQotICAgICAgLy8gSWYgd2UgaGF2ZSBhIGdlbmVyaWMgc3RyaW5nLCB3ZSB3aWxsIGFsbG93IGl0IGJlY2F1c2UgdGhlcmUgaXMgbm8KLSAgICAgIC8vIGRvY3VtZW50ZWQgbGlzdCBvZiBhbGxvd2FibGUgc3RyaW5nIGRlY2xzcGVjcywgYnV0IHdlIGtub3cgdGhleSBleGlzdAotICAgICAgLy8gKGZvciBpbnN0YW5jZSwgU0FMIGRlY2xzcGVjcyBpbiBvbGRlciB2ZXJzaW9ucyBvZiBNU1ZDKS4KLSAgICAgIC8vCi0gICAgICAvLyBBbHRlcm5hdGl2ZWx5LCBpZiB0aGUgaWRlbnRpZmllciBpcyBhIHNpbXBsZSBvbmUsIHRoZW4gaXQgcmVxdWlyZXMgbm8KLSAgICAgIC8vIGFyZ3VtZW50cyBhbmQgY2FuIGJlIHR1cm5lZCBpbnRvIGFuIGF0dHJpYnV0ZSBkaXJlY3RseS4KKyAgICBib29sIEF0dHJIYW5kbGVkID0gZmFsc2U7CisKKyAgICAvLyBQYXJzZSBhdHRyaWJ1dGUgYXJndW1lbnRzLgorICAgIGlmIChUb2suaXModG9rOjpsX3BhcmVuKSkKKyAgICAgIEF0dHJIYW5kbGVkID0gUGFyc2VNaWNyb3NvZnREZWNsU3BlY0FyZ3MoQXR0ck5hbWUsIEF0dHJOYW1lTG9jLCBBdHRycyk7CisgICAgZWxzZSBpZiAoQXR0ck5hbWUtPmdldE5hbWUoKSA9PSAicHJvcGVydHkiKQorICAgICAgLy8gVGhlIHByb3BlcnR5IGF0dHJpYnV0ZSBtdXN0IGhhdmUgYW4gYXJndW1lbnQgbGlzdC4KKyAgICAgIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZF9scGFyZW5fYWZ0ZXIpCisgICAgICAgICAgPDwgQXR0ck5hbWUtPmdldE5hbWUoKTsKKworICAgIGlmICghQXR0ckhhbmRsZWQpCiAgICAgICBBdHRycy5hZGROZXcoQXR0ck5hbWUsIEF0dHJOYW1lTG9jLCAwLCBBdHRyTmFtZUxvYywgMCwgMCwKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpBU19EZWNsc3BlYyk7Ci0gICAgZWxzZQotICAgICAgUGFyc2VDb21wbGV4TWljcm9zb2Z0RGVjbFNwZWMoQXR0ck5hbWUsIEF0dHJOYW1lTG9jLCBBdHRycyk7CiAgIH0KICAgVC5jb25zdW1lQ2xvc2UoKTsKIH0KQEAgLTYyMCw1NiArNjEwLDExIEBACiAgIH0KIH0KIAotdm9pZCBQYXJzZXI6OlBhcnNlT3BlbkNMUXVhbGlmaWVycyhEZWNsU3BlYyAmRFMpIHsKLSAgLy8gRklYTUU6IFRoZSBtYXBwaW5nIGZyb20gYXR0cmlidXRlIHNwZWxsaW5nIHRvIHNlbWFudGljcyBzaG91bGQgYmUKLSAgLy8gICAgICAgIHBlcmZvcm1lZCBpbiBTZW1hLCBub3QgaGVyZS4KLSAgU291cmNlTG9jYXRpb24gTG9jID0gVG9rLmdldExvY2F0aW9uKCk7Ci0gIHN3aXRjaChUb2suZ2V0S2luZCgpKSB7Ci0gICAgLy8gT3BlbkNMIHF1YWxpZmllcnM6Ci0gICAgY2FzZSB0b2s6Omt3X19fcHJpdmF0ZToKLSAgICBjYXNlIHRvazo6a3dfcHJpdmF0ZToKLSAgICAgIERTLmdldEF0dHJpYnV0ZXMoKS5hZGROZXdJbnRlZ2VyKAotICAgICAgICAgIEFjdGlvbnMuZ2V0QVNUQ29udGV4dCgpLAotICAgICAgICAgIFBQLmdldElkZW50aWZpZXJJbmZvKCJhZGRyZXNzX3NwYWNlIiksIExvYywgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdG9rOjprd19fX2dsb2JhbDoKLSAgICAgIERTLmdldEF0dHJpYnV0ZXMoKS5hZGROZXdJbnRlZ2VyKAotICAgICAgICAgIEFjdGlvbnMuZ2V0QVNUQ29udGV4dCgpLAotICAgICAgICAgIFBQLmdldElkZW50aWZpZXJJbmZvKCJhZGRyZXNzX3NwYWNlIiksIExvYywgTGFuZ0FTOjpvcGVuY2xfZ2xvYmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0b2s6Omt3X19fbG9jYWw6Ci0gICAgICBEUy5nZXRBdHRyaWJ1dGVzKCkuYWRkTmV3SW50ZWdlcigKLSAgICAgICAgICBBY3Rpb25zLmdldEFTVENvbnRleHQoKSwKLSAgICAgICAgICBQUC5nZXRJZGVudGlmaWVySW5mbygiYWRkcmVzc19zcGFjZSIpLCBMb2MsIExhbmdBUzo6b3BlbmNsX2xvY2FsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0b2s6Omt3X19fY29uc3RhbnQ6Ci0gICAgICBEUy5nZXRBdHRyaWJ1dGVzKCkuYWRkTmV3SW50ZWdlcigKLSAgICAgICAgICBBY3Rpb25zLmdldEFTVENvbnRleHQoKSwKLSAgICAgICAgICBQUC5nZXRJZGVudGlmaWVySW5mbygiYWRkcmVzc19zcGFjZSIpLCBMb2MsIExhbmdBUzo6b3BlbmNsX2NvbnN0YW50KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0b2s6Omt3X19fcmVhZF9vbmx5OgotICAgICAgRFMuZ2V0QXR0cmlidXRlcygpLmFkZE5ld0ludGVnZXIoCi0gICAgICAgICAgQWN0aW9ucy5nZXRBU1RDb250ZXh0KCksCi0gICAgICAgICAgUFAuZ2V0SWRlbnRpZmllckluZm8oIm9wZW5jbF9pbWFnZV9hY2Nlc3MiKSwgTG9jLCBDTElBX3JlYWRfb25seSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdG9rOjprd19fX3dyaXRlX29ubHk6Ci0gICAgICBEUy5nZXRBdHRyaWJ1dGVzKCkuYWRkTmV3SW50ZWdlcigKLSAgICAgICAgICBBY3Rpb25zLmdldEFTVENvbnRleHQoKSwKLSAgICAgICAgICBQUC5nZXRJZGVudGlmaWVySW5mbygib3BlbmNsX2ltYWdlX2FjY2VzcyIpLCBMb2MsIENMSUFfd3JpdGVfb25seSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdG9rOjprd19fX3JlYWRfd3JpdGU6Ci0gICAgICBEUy5nZXRBdHRyaWJ1dGVzKCkuYWRkTmV3SW50ZWdlcigKLSAgICAgICAgICBBY3Rpb25zLmdldEFTVENvbnRleHQoKSwKLSAgICAgICAgICBQUC5nZXRJZGVudGlmaWVySW5mbygib3BlbmNsX2ltYWdlX2FjY2VzcyIpLCBMb2MsIENMSUFfcmVhZF93cml0ZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OiBicmVhazsKLSAgfQordm9pZCBQYXJzZXI6OlBhcnNlT3BlbkNMUXVhbGlmaWVycyhQYXJzZWRBdHRyaWJ1dGVzICZBdHRycykgeworICBJZGVudGlmaWVySW5mbyAqQXR0ck5hbWUgPSBUb2suZ2V0SWRlbnRpZmllckluZm8oKTsKKyAgU291cmNlTG9jYXRpb24gQXR0ck5hbWVMb2MgPSBUb2suZ2V0TG9jYXRpb24oKTsKKyAgQXR0cnMuYWRkTmV3KEF0dHJOYW1lLCBBdHRyTmFtZUxvYywgMCwgQXR0ck5hbWVMb2MsIDAsIDAsCisgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpBU19LZXl3b3JkKTsKIH0KIAogLy8vIFxicmllZiBQYXJzZSBhIHZlcnNpb24gbnVtYmVyLgpAQCAtODEyLDcgKzc1Nyw3IEBACiAgIC8vIE9wZW5pbmcgJygnLgogICBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIgVCgqdGhpcywgdG9rOjpsX3BhcmVuKTsKICAgaWYgKFQuY29uc3VtZU9wZW4oKSkgewotICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfbHBhcmVuKTsKKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfcGFyZW47CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTgyNSw4ICs3NzAsMTAgQEAKICAgSWRlbnRpZmllckxvYyAqUGxhdGZvcm0gPSBQYXJzZUlkZW50aWZpZXJMb2MoKTsKIAogICAvLyBQYXJzZSB0aGUgJywnIGZvbGxvd2luZyB0aGUgcGxhdGZvcm0gbmFtZS4KLSAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbW1hLCAiIiwgdG9rOjpyX3BhcmVuKSkKKyAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSkpIHsKKyAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICByZXR1cm47CisgIH0KIAogICAvLyBJZiB3ZSBoYXZlbid0IGdyYWJiZWQgdGhlIHBvaW50ZXJzIGZvciB0aGUgaWRlbnRpZmllcnMKICAgLy8gImludHJvZHVjZWQiLCAiZGVwcmVjYXRlZCIsIGFuZCAib2Jzb2xldGVkIiwgZG8gc28gbm93LgpAQCAtODU1LDE3ICs4MDIsMTEgQEAKICAgICAgICAgICA8PCBLZXl3b3JkIDw8IFNvdXJjZVJhbmdlKFVuYXZhaWxhYmxlTG9jKTsKICAgICAgIH0KICAgICAgIFVuYXZhaWxhYmxlTG9jID0gS2V5d29yZExvYzsKLQotICAgICAgaWYgKFRvay5pc05vdCh0b2s6OmNvbW1hKSkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIENvbnN1bWVUb2tlbigpOwogICAgICAgY29udGludWU7CiAgICAgfQogCiAgICAgaWYgKFRvay5pc05vdCh0b2s6OmVxdWFsKSkgewotICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9lcXVhbF9hZnRlcikKLSAgICAgICAgPDwgS2V5d29yZDsKKyAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfYWZ0ZXIpIDw8IEtleXdvcmQgPDwgdG9rOjplcXVhbDsKICAgICAgIFNraXBVbnRpbCh0b2s6OnJfcGFyZW4sIFN0b3BBdFNlbWkpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTkxNSwxMSArODU2LDcgQEAKICAgICAgICAgPDwgS2V5d29yZCA8PCBWZXJzaW9uUmFuZ2U7CiAgICAgfQogCi0gICAgaWYgKFRvay5pc05vdCh0b2s6OmNvbW1hKSkKLSAgICAgIGJyZWFrOwotCi0gICAgQ29uc3VtZVRva2VuKCk7Ci0gIH0gd2hpbGUgKHRydWUpOworICB9IHdoaWxlIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpOwogCiAgIC8vIENsb3NpbmcgJyknLgogICBpZiAoVC5jb25zdW1lQ2xvc2UoKSkKQEAgLTk1OSw2ICs4OTYsODYgQEAKICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OkFTX0dOVSk7CiB9CiAKKy8vLyBcYnJpZWYgUGFyc2UgdGhlIGNvbnRlbnRzIG9mIHRoZSAib2JqY19icmlkZ2VfcmVsYXRlZCIgYXR0cmlidXRlLgorLy8vIG9iamNfYnJpZGdlX3JlbGF0ZWQgJygnIHJlbGF0ZWRfY2xhc3MgJywnIG9wdC1jbGFzc19tZXRob2QgJywnIG9wdC1pbnN0YW5jZV9tZXRob2QgJyknCisvLy8gcmVsYXRlZF9jbGFzczoKKy8vLyAgICAgSWRlbnRpZmllcgorLy8vCisvLy8gb3B0LWNsYXNzX21ldGhvZDoKKy8vLyAgICAgSWRlbnRpZmllcjogfCA8ZW1wdHk+CisvLy8KKy8vLyBvcHQtaW5zdGFuY2VfbWV0aG9kOgorLy8vICAgICBJZGVudGlmaWVyIHwgPGVtcHR5PgorLy8vCit2b2lkIFBhcnNlcjo6UGFyc2VPYmpDQnJpZGdlUmVsYXRlZEF0dHJpYnV0ZShJZGVudGlmaWVySW5mbyAmT2JqQ0JyaWRnZVJlbGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE9iakNCcmlkZ2VSZWxhdGVkTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gKmVuZExvYykgeworICAvLyBPcGVuaW5nICcoJy4KKyAgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyIFQoKnRoaXMsIHRvazo6bF9wYXJlbik7CisgIGlmIChULmNvbnN1bWVPcGVuKCkpIHsKKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfcGFyZW47CisgICAgcmV0dXJuOworICB9CisgIAorICAvLyBQYXJzZSB0aGUgcmVsYXRlZCBjbGFzcyBuYW1lLgorICBpZiAoVG9rLmlzTm90KHRvazo6aWRlbnRpZmllcikpIHsKKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX29iamNicmlkZ2VfcmVsYXRlZF9leHBlY3RlZF9yZWxhdGVkX2NsYXNzKTsKKyAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKKyAgICByZXR1cm47CisgIH0KKyAgSWRlbnRpZmllckxvYyAqUmVsYXRlZENsYXNzID0gUGFyc2VJZGVudGlmaWVyTG9jKCk7CisgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29tbWEpKSB7CisgICAgU2tpcFVudGlsKHRvazo6cl9wYXJlbiwgU3RvcEF0U2VtaSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gUGFyc2Ugb3B0aW9uYWwgY2xhc3MgbWV0aG9kIG5hbWUuCisgIElkZW50aWZpZXJMb2MgKkNsYXNzTWV0aG9kID0gMDsKKyAgaWYgKFRvay5pcyh0b2s6OmlkZW50aWZpZXIpKSB7CisgICAgQ2xhc3NNZXRob2QgPSBQYXJzZUlkZW50aWZpZXJMb2MoKTsKKyAgICBpZiAoIVRyeUNvbnN1bWVUb2tlbih0b2s6OmNvbG9uKSkgeworICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9vYmpjYnJpZGdlX3JlbGF0ZWRfc2VsZWN0b3JfbmFtZSk7CisgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYgKCFUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpIHsKKyAgICBpZiAoVG9rLmlzKHRvazo6Y29sb24pKQorICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9vYmpjYnJpZGdlX3JlbGF0ZWRfc2VsZWN0b3JfbmFtZSk7CisgICAgZWxzZQorICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjpjb21tYTsKKyAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIFBhcnNlIG9wdGlvbmFsIGluc3RhbmNlIG1ldGhvZCBuYW1lLgorICBJZGVudGlmaWVyTG9jICpJbnN0YW5jZU1ldGhvZCA9IDA7CisgIGlmIChUb2suaXModG9rOjppZGVudGlmaWVyKSkKKyAgICBJbnN0YW5jZU1ldGhvZCA9IFBhcnNlSWRlbnRpZmllckxvYygpOworICBlbHNlIGlmIChUb2suaXNOb3QodG9rOjpyX3BhcmVuKSkgeworICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6cl9wYXJlbjsKKyAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKKyAgICByZXR1cm47CisgIH0KKyAgCisgIC8vIENsb3NpbmcgJyknLgorICBpZiAoVC5jb25zdW1lQ2xvc2UoKSkKKyAgICByZXR1cm47CisgIAorICBpZiAoZW5kTG9jKQorICAgICplbmRMb2MgPSBULmdldENsb3NlTG9jYXRpb24oKTsKKyAgCisgIC8vIFJlY29yZCB0aGlzIGF0dHJpYnV0ZQorICBhdHRycy5hZGROZXcoJk9iakNCcmlkZ2VSZWxhdGVkLAorICAgICAgICAgICAgICAgU291cmNlUmFuZ2UoT2JqQ0JyaWRnZVJlbGF0ZWRMb2MsIFQuZ2V0Q2xvc2VMb2NhdGlvbigpKSwKKyAgICAgICAgICAgICAgIDAsIE9iakNCcmlkZ2VSZWxhdGVkTG9jLAorICAgICAgICAgICAgICAgUmVsYXRlZENsYXNzLAorICAgICAgICAgICAgICAgQ2xhc3NNZXRob2QsCisgICAgICAgICAgICAgICBJbnN0YW5jZU1ldGhvZCwKKyAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OkFTX0dOVSk7CisgIAorfQogCiAvLyBMYXRlIFBhcnNlZCBBdHRyaWJ1dGVzOgogLy8gU2VlIG90aGVyIGV4YW1wbGVzIG9mIGxhdGUgcGFyc2luZyBpbiBsaWIvUGFyc2UvUGFyc2VDWFhJbmxpbmVNZXRob2RzCkBAIC0xMDM4LDEzICsxMDU1LDYgQEAKICAgLy8gQ29uc3VtZSB0aGUgcHJldmlvdXNseSBwdXNoZWQgdG9rZW4uCiAgIENvbnN1bWVBbnlUb2tlbigvKkNvbnN1bWVDb2RlQ29tcGxldGlvblRvaz0qL3RydWUpOwogCi0gIGlmIChPbkRlZmluaXRpb24gJiYgIUlzVGhyZWFkU2FmZXR5QXR0cmlidXRlKExBLkF0dHJOYW1lLmdldE5hbWUoKSkpIHsKLSAgICAvLyBGSVhNRTogRG8gbm90IHdhcm4gb24gQysrMTEgYXR0cmlidXRlcywgb25jZSB3ZSBzdGFydCBzdXBwb3J0aW5nCi0gICAgLy8gdGhlbSBoZXJlLgotICAgIERpYWcoVG9rLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9vbl9mdW5jdGlvbl9kZWZpbml0aW9uKQotICAgICAgPDwgTEEuQXR0ck5hbWUuZ2V0TmFtZSgpOwotICB9Ci0KICAgUGFyc2VkQXR0cmlidXRlcyBBdHRycyhBdHRyRmFjdG9yeSk7CiAgIFNvdXJjZUxvY2F0aW9uIGVuZExvYzsKIApAQCAtMTA3MSw3ICsxMDgxLDcgQEAKICAgICAgICAgQWN0aW9ucy5BY3RPblJlZW50ZXJGdW5jdGlvbkNvbnRleHQoQWN0aW9ucy5DdXJTY29wZSwgRCk7CiAKICAgICAgIFBhcnNlR05VQXR0cmlidXRlQXJncygmTEEuQXR0ck5hbWUsIExBLkF0dHJOYW1lTG9jLCBBdHRycywgJmVuZExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTb3VyY2VMb2NhdGlvbigpLCBBdHRyaWJ1dGVMaXN0OjpBU19HTlUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFNvdXJjZUxvY2F0aW9uKCksIEF0dHJpYnV0ZUxpc3Q6OkFTX0dOVSwgMCk7CiAKICAgICAgIGlmIChIYXNGdW5TY29wZSkgewogICAgICAgICBBY3Rpb25zLkFjdE9uRXhpdEZ1bmN0aW9uQ29udGV4dCgpOwpAQCAtMTA4NCwxNSArMTA5NCwyMCBAQAogICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGRlY2xzLCB0aGVuIHRoZSBkZWNsIGNhbm5vdCBiZSB3aXRoaW4gdGhlCiAgICAgICAvLyBmdW5jdGlvbiBzY29wZS4KICAgICAgIFBhcnNlR05VQXR0cmlidXRlQXJncygmTEEuQXR0ck5hbWUsIExBLkF0dHJOYW1lTG9jLCBBdHRycywgJmVuZExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTb3VyY2VMb2NhdGlvbigpLCBBdHRyaWJ1dGVMaXN0OjpBU19HTlUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFNvdXJjZUxvY2F0aW9uKCksIEF0dHJpYnV0ZUxpc3Q6OkFTX0dOVSwgMCk7CiAgICAgfQogICB9IGVsc2UgewogICAgIERpYWcoVG9rLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9ub19kZWNsKSA8PCBMQS5BdHRyTmFtZS5nZXROYW1lKCk7CiAgIH0KIAotICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBuaSA9IExBLkRlY2xzLnNpemUoKTsgaSA8IG5pOyArK2kpIHsKKyAgY29uc3QgQXR0cmlidXRlTGlzdCAqQUwgPSBBdHRycy5nZXRMaXN0KCk7CisgIGlmIChPbkRlZmluaXRpb24gJiYgQUwgJiYgIUFMLT5pc0NYWDExQXR0cmlidXRlKCkgJiYKKyAgICAgIEFMLT5pc0tub3duVG9HQ0MoKSkKKyAgICBEaWFnKFRvaywgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfb25fZnVuY3Rpb25fZGVmaW5pdGlvbikKKyAgICAgIDw8ICZMQS5BdHRyTmFtZTsKKworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBuaSA9IExBLkRlY2xzLnNpemUoKTsgaSA8IG5pOyArK2kpCiAgICAgQWN0aW9ucy5BY3RPbkZpbmlzaERlbGF5ZWRBdHRyaWJ1dGUoZ2V0Q3VyU2NvcGUoKSwgTEEuRGVjbHNbaV0sIEF0dHJzKTsKLSAgfQogCiAgIGlmIChUb2suZ2V0TG9jYXRpb24oKSAhPSBPcmlnTG9jKSB7CiAgICAgLy8gRHVlIHRvIGEgcGFyc2luZyBlcnJvciwgd2UgZWl0aGVyIHdlbnQgb3ZlciB0aGUgY2FjaGVkIHRva2VucyBvcgpAQCAtMTEwNiw3OSArMTEyMSw2IEBACiAgIH0KIH0KIAotLy8vIFxicmllZiBXcmFwcGVyIGFyb3VuZCBhIGNhc2Ugc3RhdGVtZW50IGNoZWNraW5nIGlmIEF0dHJOYW1lIGlzCi0vLy8gb25lIG9mIHRoZSB0aHJlYWQgc2FmZXR5IGF0dHJpYnV0ZXMKLWJvb2wgUGFyc2VyOjpJc1RocmVhZFNhZmV0eUF0dHJpYnV0ZShTdHJpbmdSZWYgQXR0ck5hbWUpIHsKLSAgcmV0dXJuIGxsdm06OlN0cmluZ1N3aXRjaDxib29sPihBdHRyTmFtZSkKLSAgICAgIC5DYXNlKCJndWFyZGVkX2J5IiwgdHJ1ZSkKLSAgICAgIC5DYXNlKCJndWFyZGVkX3ZhciIsIHRydWUpCi0gICAgICAuQ2FzZSgicHRfZ3VhcmRlZF9ieSIsIHRydWUpCi0gICAgICAuQ2FzZSgicHRfZ3VhcmRlZF92YXIiLCB0cnVlKQotICAgICAgLkNhc2UoImxvY2thYmxlIiwgdHJ1ZSkKLSAgICAgIC5DYXNlKCJzY29wZWRfbG9ja2FibGUiLCB0cnVlKQotICAgICAgLkNhc2UoIm5vX3RocmVhZF9zYWZldHlfYW5hbHlzaXMiLCB0cnVlKQotICAgICAgLkNhc2UoImFjcXVpcmVkX2FmdGVyIiwgdHJ1ZSkKLSAgICAgIC5DYXNlKCJhY3F1aXJlZF9iZWZvcmUiLCB0cnVlKQotICAgICAgLkNhc2UoImV4Y2x1c2l2ZV9sb2NrX2Z1bmN0aW9uIiwgdHJ1ZSkKLSAgICAgIC5DYXNlKCJzaGFyZWRfbG9ja19mdW5jdGlvbiIsIHRydWUpCi0gICAgICAuQ2FzZSgiZXhjbHVzaXZlX3RyeWxvY2tfZnVuY3Rpb24iLCB0cnVlKQotICAgICAgLkNhc2UoInNoYXJlZF90cnlsb2NrX2Z1bmN0aW9uIiwgdHJ1ZSkKLSAgICAgIC5DYXNlKCJ1bmxvY2tfZnVuY3Rpb24iLCB0cnVlKQotICAgICAgLkNhc2UoImxvY2tfcmV0dXJuZWQiLCB0cnVlKQotICAgICAgLkNhc2UoImxvY2tzX2V4Y2x1ZGVkIiwgdHJ1ZSkKLSAgICAgIC5DYXNlKCJleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQiLCB0cnVlKQotICAgICAgLkNhc2UoInNoYXJlZF9sb2Nrc19yZXF1aXJlZCIsIHRydWUpCi0gICAgICAuRGVmYXVsdChmYWxzZSk7Ci19Ci0KLS8vLyBcYnJpZWYgUGFyc2UgdGhlIGNvbnRlbnRzIG9mIHRocmVhZCBzYWZldHkgYXR0cmlidXRlcy4gVGhlc2UKLS8vLyBzaG91bGQgYWx3YXlzIGJlIHBhcnNlZCBhcyBhbiBleHByZXNzaW9uIGxpc3QuCi0vLy8KLS8vLyBXZSBuZWVkIHRvIHNwZWNpYWwgY2FzZSB0aGUgcGFyc2luZyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBpZiB0aGUgZmlyc3QgdG9rZW4KLS8vLyBvZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gaWRlbnRpZmllciwgdGhlIG1haW4gcGFyc2UgbG9vcCB3aWxsIHN0b3JlCi0vLy8gdGhhdCB0b2tlbiBhcyBhICJwYXJhbWV0ZXIiIGFuZCB0aGUgcmVzdCBvZgotLy8vIHRoZSBhcmd1bWVudHMgd2lsbCBiZSBhZGRlZCB0byBhIGxpc3Qgb2YgImFyZ3VtZW50cyIuIEhvd2V2ZXIsCi0vLy8gc3Vic2VxdWVudCB0b2tlbnMgaW4gdGhlIGZpcnN0IGFyZ3VtZW50IGFyZSBsb3N0LiBXZSBpbnN0ZWFkIHBhcnNlIGVhY2gKLS8vLyBhcmd1bWVudCBhcyBhbiBleHByZXNzaW9uIGFuZCBhZGQgYWxsIGFyZ3VtZW50cyB0byB0aGUgbGlzdCBvZiAiYXJndW1lbnRzIi4KLS8vLyBJbiBmdXR1cmUsIHdlIHdpbGwgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWxzbwotLy8vIGRlYWwgd2l0aCBzb21lIGFyZ3VtZW50IHNjb3BpbmcgaXNzdWVzIGhlcmUgKGZvciBleGFtcGxlLCByZWZlcnJpbmcgdG8gYQotLy8vIGZ1bmN0aW9uIHBhcmFtZXRlciBpbiB0aGUgYXR0cmlidXRlIG9uIHRoYXQgZnVuY3Rpb24pLgotdm9pZCBQYXJzZXI6OlBhcnNlVGhyZWFkU2FmZXR5QXR0cmlidXRlKElkZW50aWZpZXJJbmZvICZBdHRyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyTmFtZUxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqRW5kTG9jKSB7Ci0gIGFzc2VydChUb2suaXModG9rOjpsX3BhcmVuKSAmJiAiQXR0cmlidXRlIGFyZyBsaXN0IG5vdCBzdGFydGluZyB3aXRoICcoJyIpOwotCi0gIEJhbGFuY2VkRGVsaW1pdGVyVHJhY2tlciBUKCp0aGlzLCB0b2s6OmxfcGFyZW4pOwotICBULmNvbnN1bWVPcGVuKCk7Ci0KLSAgQXJnc1ZlY3RvciBBcmdFeHByczsKLSAgYm9vbCBBcmdFeHByc09rID0gdHJ1ZTsKLQotICAvLyBub3cgcGFyc2UgdGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMKLSAgd2hpbGUgKFRvay5pc05vdCh0b2s6OnJfcGFyZW4pKSB7Ci0gICAgRW50ZXJFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgVW5ldmFsdWF0ZWQoQWN0aW9ucywgU2VtYTo6VW5ldmFsdWF0ZWQpOwotICAgIEV4cHJSZXN1bHQgQXJnRXhwcihQYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCkpOwotICAgIGlmIChBcmdFeHByLmlzSW52YWxpZCgpKSB7Ci0gICAgICBBcmdFeHByc09rID0gZmFsc2U7Ci0gICAgICBULmNvbnN1bWVDbG9zZSgpOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFyZ0V4cHJzLnB1c2hfYmFjayhBcmdFeHByLnJlbGVhc2UoKSk7Ci0gICAgfQotICAgIGlmIChUb2suaXNOb3QodG9rOjpjb21tYSkpCi0gICAgICBicmVhazsKLSAgICBDb25zdW1lVG9rZW4oKTsgLy8gRWF0IHRoZSBjb21tYSwgbW92ZSB0byB0aGUgbmV4dCBhcmd1bWVudAotICB9Ci0gIC8vIE1hdGNoIHRoZSAnKScuCi0gIGlmIChBcmdFeHByc09rICYmICFULmNvbnN1bWVDbG9zZSgpKSB7Ci0gICAgQXR0cnMuYWRkTmV3KCZBdHRyTmFtZSwgQXR0ck5hbWVMb2MsIDAsIEF0dHJOYW1lTG9jLCBBcmdFeHBycy5kYXRhKCksCi0gICAgICAgICAgICAgICAgIEFyZ0V4cHJzLnNpemUoKSwgQXR0cmlidXRlTGlzdDo6QVNfR05VKTsKLSAgfQotICBpZiAoRW5kTG9jKQotICAgICpFbmRMb2MgPSBULmdldENsb3NlTG9jYXRpb24oKTsKLX0KLQogdm9pZCBQYXJzZXI6OlBhcnNlVHlwZVRhZ0ZvckRhdGF0eXBlQXR0cmlidXRlKElkZW50aWZpZXJJbmZvICZBdHRyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyTmFtZUxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzICZBdHRycywKQEAgLTExODksMTggKzExMzEsMTYgQEAKICAgVC5jb25zdW1lT3BlbigpOwogCiAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkgewotICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOworICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6aWRlbnRpZmllcjsKICAgICBULnNraXBUb0VuZCgpOwogICAgIHJldHVybjsKICAgfQogICBJZGVudGlmaWVyTG9jICpBcmd1bWVudEtpbmQgPSBQYXJzZUlkZW50aWZpZXJMb2MoKTsKIAotICBpZiAoVG9rLmlzTm90KHRvazo6Y29tbWEpKSB7Ci0gICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9jb21tYSk7CisgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29tbWEpKSB7CiAgICAgVC5za2lwVG9FbmQoKTsKICAgICByZXR1cm47CiAgIH0KLSAgQ29uc3VtZVRva2VuKCk7CiAKICAgU291cmNlUmFuZ2UgTWF0Y2hpbmdDVHlwZVJhbmdlOwogICBUeXBlUmVzdWx0IE1hdGNoaW5nQ1R5cGUgPSBQYXJzZVR5cGVOYW1lKCZNYXRjaGluZ0NUeXBlUmFuZ2UpOwpAQCAtMTIxMSwxMCArMTE1MSw5IEBACiAKICAgYm9vbCBMYXlvdXRDb21wYXRpYmxlID0gZmFsc2U7CiAgIGJvb2wgTXVzdEJlTnVsbCA9IGZhbHNlOwotICB3aGlsZSAoVG9rLmlzKHRvazo6Y29tbWEpKSB7Ci0gICAgQ29uc3VtZVRva2VuKCk7CisgIHdoaWxlIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpIHsKICAgICBpZiAoVG9rLmlzTm90KHRvazo6aWRlbnRpZmllcikpIHsKLSAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOworICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjppZGVudGlmaWVyOwogICAgICAgVC5za2lwVG9FbmQoKTsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xNTA4LDggKzE0NDcsNyBAQAogICAgICAgICAvLyBUaGlzIGRlY2xhcmF0aW9uIGlzbid0IG92ZXIgeWV0LiBLZWVwIHNraXBwaW5nLgogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KLSAgICAgIGlmIChUb2suaXModG9rOjpzZW1pKSkKLSAgICAgICAgQ29uc3VtZVRva2VuKCk7CisgICAgICBUcnlDb25zdW1lVG9rZW4odG9rOjpzZW1pKTsKICAgICAgIHJldHVybjsKIAogICAgIGNhc2UgdG9rOjpsX3NxdWFyZToKQEAgLTE1NjIsNiArMTUwMCw5IEBACiAgICAgICBicmVhazsKIAogICAgIGNhc2UgdG9rOjplb2Y6CisgICAgY2FzZSB0b2s6OmFubm90X21vZHVsZV9iZWdpbjoKKyAgICBjYXNlIHRvazo6YW5ub3RfbW9kdWxlX2VuZDoKKyAgICBjYXNlIHRvazo6YW5ub3RfbW9kdWxlX2luY2x1ZGU6CiAgICAgICByZXR1cm47CiAKICAgICBkZWZhdWx0OgpAQCAtMTYzMiw3ICsxNTczLDggQEAKICAgICB9IGVsc2UgewogICAgICAgaWYgKFRvay5pcyh0b2s6OmxfYnJhY2UpKSB7CiAgICAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZnVuY3Rpb25fZGVmaW5pdGlvbl9ub3RfYWxsb3dlZCk7Ci0gICAgICAgIFNraXBVbnRpbCh0b2s6OnJfYnJhY2UsIFN0b3BBdFNlbWkgfCBTdG9wQmVmb3JlTWF0Y2gpOworICAgICAgICBTa2lwTWFsZm9ybWVkRGVjbCgpOworICAgICAgICByZXR1cm4gRGVjbEdyb3VwUHRyVHkoKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE2NDgsOSArMTU5MCw4IEBACiAgIC8vIGRvbid0IG5lZWQgdG8gcGFyc2UgdGhlIGNvbnRhaW5lciBpbiBhZHZhbmNlLgogICBpZiAoRlJJICYmIChUb2suaXModG9rOjpjb2xvbikgfHwgaXNUb2tJZGVudGlmaWVyX2luKCkpKSB7CiAgICAgYm9vbCBJc0ZvclJhbmdlTG9vcCA9IGZhbHNlOwotICAgIGlmIChUb2suaXModG9rOjpjb2xvbikpIHsKKyAgICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29sb24sIEZSSS0+Q29sb25Mb2MpKSB7CiAgICAgICBJc0ZvclJhbmdlTG9vcCA9IHRydWU7Ci0gICAgICBGUkktPkNvbG9uTG9jID0gQ29uc3VtZVRva2VuKCk7CiAgICAgICBpZiAoVG9rLmlzKHRvazo6bF9icmFjZSkpCiAgICAgICAgIEZSSS0+UmFuZ2VFeHByID0gUGFyc2VCcmFjZUluaXRpYWxpemVyKCk7CiAgICAgICBlbHNlCkBAIC0xNjc3LDkgKzE2MTgsOCBAQAogICAKICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNvbW1hLCBpdCBpcyBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgbGlzdCAoYSAnOycpIG9yIGFuCiAgIC8vIGVycm9yLCBiYWlsIG91dC4KLSAgd2hpbGUgKFRvay5pcyh0b2s6OmNvbW1hKSkgewotICAgIFNvdXJjZUxvY2F0aW9uIENvbW1hTG9jID0gQ29uc3VtZVRva2VuKCk7Ci0KKyAgU291cmNlTG9jYXRpb24gQ29tbWFMb2M7CisgIHdoaWxlIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSwgQ29tbWFMb2MpKSB7CiAgICAgaWYgKFRvay5pc0F0U3RhcnRPZkxpbmUoKSAmJiBFeHBlY3RTZW1pICYmICFNaWdodEJlRGVjbGFyYXRvcihDb250ZXh0KSkgewogICAgICAgLy8gVGhpcyBjb21tYSB3YXMgZm9sbG93ZWQgYnkgYSBsaW5lLWJyZWFrIGFuZCBzb21ldGhpbmcgd2hpY2ggY2FuJ3QgYmUKICAgICAgIC8vIHRoZSBzdGFydCBvZiBhIGRlY2xhcmF0b3IuIFRoZSBjb21tYSB3YXMgcHJvYmFibHkgYSB0eXBvIGZvciBhCkBAIC0xNzI0LDggKzE2NjQsNyBAQAogICAgIC8vIE90aGVyd2lzZSB0aGluZ3MgYXJlIHZlcnkgY29uZnVzZWQgYW5kIHdlIHNraXAgdG8gcmVjb3Zlci4KICAgICBpZiAoIWlzRGVjbGFyYXRpb25TcGVjaWZpZXIoKSkgewogICAgICAgU2tpcFVudGlsKHRvazo6cl9icmFjZSwgU3RvcEF0U2VtaSB8IFN0b3BCZWZvcmVNYXRjaCk7Ci0gICAgICBpZiAoVG9rLmlzKHRvazo6c2VtaSkpCi0gICAgICAgIENvbnN1bWVUb2tlbigpOworICAgICAgVHJ5Q29uc3VtZVRva2VuKHRvazo6c2VtaSk7CiAgICAgfQogICB9CiAKQEAgLTE5NzUsOCArMTkxNCw3IEBACiAKICAgLy8gVmFsaWRhdGUgZGVjbHNwZWMgZm9yIHR5cGUtbmFtZS4KICAgdW5zaWduZWQgU3BlY3MgPSBEUy5nZXRQYXJzZWRTcGVjaWZpZXJzKCk7Ci0gIGlmICgoRFNDID09IERTQ190eXBlX3NwZWNpZmllciB8fCBEU0MgPT0gRFNDX3RyYWlsaW5nKSAmJgotICAgICAgIURTLmhhc1R5cGVTcGVjaWZpZXIoKSkgeworICBpZiAoaXNUeXBlU3BlY2lmaWVyKERTQykgJiYgIURTLmhhc1R5cGVTcGVjaWZpZXIoKSkgewogICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfdHlwZSk7CiAgICAgRFMuU2V0VHlwZVNwZWNFcnJvcigpOwogICB9IGVsc2UgaWYgKFNwZWNzID09IERlY2xTcGVjOjpQUV9Ob25lICYmICFEUy5nZXROdW1Qcm90b2NvbFF1YWxpZmllcnMoKSAmJgpAQCAtMjA3NCw4ICsyMDEyLDcgQEAKICAgLy8gd2l0aGluIGEgdHlwZSBzcGVjaWZpZXIuIE91dHNpZGUgb2YgQysrLCB3ZSBhbGxvdyB0aGlzIGV2ZW4gaWYgdGhlCiAgIC8vIGxhbmd1YWdlIGRvZXNuJ3QgIm9mZmljaWFsbHkiIHN1cHBvcnQgaW1wbGljaXQgaW50IC0tIHdlIHN1cHBvcnQKICAgLy8gaW1wbGljaXQgaW50IGFzIGFuIGV4dGVuc2lvbiBpbiBDOTkgYW5kIEMxMS4KLSAgaWYgKERTQyAhPSBEU0NfdHlwZV9zcGVjaWZpZXIgJiYgRFNDICE9IERTQ190cmFpbGluZyAmJgotICAgICAgIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmCisgIGlmICghaXNUeXBlU3BlY2lmaWVyKERTQykgJiYgIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmCiAgICAgICBpc1ZhbGlkQWZ0ZXJJZGVudGlmaWVySW5EZWNsYXJhdG9yKE5leHRUb2tlbigpKSkgewogICAgIC8vIElmIHRoaXMgdG9rZW4gaXMgdmFsaWQgZm9yIGltcGxpY2l0IGludCwgZS5nLiAic3RhdGljIHggPSA0IiwgdGhlbgogICAgIC8vIHdlIGp1c3QgYXZvaWQgZWF0aW5nIHRoZSBpZGVudGlmaWVyLCBzbyBpdCB3aWxsIGJlIHBhcnNlZCBhcyB0aGUKQEAgLTIxNDUsNyArMjA4Miw3IEBACiAKICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpZGVudGlmaWVyIGNvdWxkIHBsYXVzaWJseSBiZSB0aGUgbmFtZSBvZiBzb21ldGhpbmcKICAgLy8gYmVpbmcgZGVjbGFyZWQgKHdpdGggYSBtaXNzaW5nIHR5cGUpLgotICBpZiAoRFNDICE9IERTQ190eXBlX3NwZWNpZmllciAmJiBEU0MgIT0gRFNDX3RyYWlsaW5nICYmCisgIGlmICghaXNUeXBlU3BlY2lmaWVyKERTQykgJiYKICAgICAgICghU1MgfHwgRFNDID09IERTQ190b3BfbGV2ZWwgfHwgRFNDID09IERTQ19jbGFzcykpIHsKICAgICAvLyBMb29rIGFoZWFkIHRvIHRoZSBuZXh0IHRva2VuIHRvIHRyeSB0byBmaWd1cmUgb3V0IHdoYXQgdGhpcyBkZWNsYXJhdGlvbgogICAgIC8vIHdhcyBzdXBwb3NlZCB0byBiZS4KQEAgLTIyMDYsNyArMjE0Myw5IEBACiAgIC8vIGRpYWdub3N0aWMgYW5kIGF0dGVtcHQgdG8gcmVjb3Zlci4KICAgUGFyc2VkVHlwZSBUOwogICBJZGVudGlmaWVySW5mbyAqSUkgPSBUb2suZ2V0SWRlbnRpZmllckluZm8oKTsKLSAgaWYgKEFjdGlvbnMuRGlhZ25vc2VVbmtub3duVHlwZU5hbWUoSUksIExvYywgZ2V0Q3VyU2NvcGUoKSwgU1MsIFQpKSB7CisgIGlmIChBY3Rpb25zLkRpYWdub3NlVW5rbm93blR5cGVOYW1lKElJLCBMb2MsIGdldEN1clNjb3BlKCksIFNTLCBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dFRva2VuKCkuaXModG9rOjpsZXNzKSkpIHsKICAgICAvLyBUaGUgYWN0aW9uIGVtaXR0ZWQgYSBkaWFnbm9zdGljLCBzbyB3ZSBkb24ndCBoYXZlIHRvLgogICAgIGlmIChUKSB7CiAgICAgICAvLyBUaGUgYWN0aW9uIGhhcyBzdWdnZXN0ZWQgdGhhdCB0aGUgdHlwZSBUIGNvdWxkIGJlIHVzZWQuIFNldCB0aGF0IGFzCkBAIC0yMjE0LDcgKzIxNTMsOCBAQAogICAgICAgLy8gbmFtZSB0b2tlbiwgYW5kIHdlJ3JlIGRvbmUuCiAgICAgICBjb25zdCBjaGFyICpQcmV2U3BlYzsKICAgICAgIHVuc2lnbmVkIERpYWdJRDsKLSAgICAgIERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX3R5cGVuYW1lLCBMb2MsIFByZXZTcGVjLCBEaWFnSUQsIFQpOworICAgICAgRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfdHlwZW5hbWUsIExvYywgUHJldlNwZWMsIERpYWdJRCwgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25zLmdldEFTVENvbnRleHQoKS5nZXRQcmludGluZ1BvbGljeSgpKTsKICAgICAgIERTLlNldFJhbmdlRW5kKFRvay5nZXRMb2NhdGlvbigpKTsKICAgICAgIENvbnN1bWVUb2tlbigpOwogICAgICAgLy8gVGhlcmUgbWF5IGJlIG90aGVyIGRlY2xhcmF0aW9uIHNwZWNpZmllcnMgYWZ0ZXIgdGhpcy4KQEAgLTIyNTgsNiArMjE5OCw5IEBACiAgICAgcmV0dXJuIERTQ190b3BfbGV2ZWw7CiAgIGlmIChDb250ZXh0ID09IERlY2xhcmF0b3I6OlRyYWlsaW5nUmV0dXJuQ29udGV4dCkKICAgICByZXR1cm4gRFNDX3RyYWlsaW5nOworICBpZiAoQ29udGV4dCA9PSBEZWNsYXJhdG9yOjpBbGlhc0RlY2xDb250ZXh0IHx8CisgICAgICBDb250ZXh0ID09IERlY2xhcmF0b3I6OkFsaWFzVGVtcGxhdGVDb250ZXh0KQorICAgIHJldHVybiBEU0NfYWxpYXNfZGVjbGFyYXRpb247CiAgIHJldHVybiBEU0Nfbm9ybWFsOwogfQogCkBAIC0yMjgyLDggKzIyMjUsOCBAQAogICB9IGVsc2UKICAgICBFUiA9IFBhcnNlQ29uc3RhbnRFeHByZXNzaW9uKCk7CiAKLSAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEgJiYgVG9rLmlzKHRvazo6ZWxsaXBzaXMpKQotICAgIEVsbGlwc2lzTG9jID0gQ29uc3VtZVRva2VuKCk7CisgIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1czExKQorICAgIFRyeUNvbnN1bWVUb2tlbih0b2s6OmVsbGlwc2lzLCBFbGxpcHNpc0xvYyk7CiAKICAgcmV0dXJuIEVSOwogfQpAQCAtMjMwNSw3ICsyMjQ4LDcgQEAKICAgU291cmNlTG9jYXRpb24gS1dMb2MgPSBDb25zdW1lVG9rZW4oKTsKIAogICBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIgVCgqdGhpcywgdG9rOjpsX3BhcmVuKTsKLSAgaWYgKFQuZXhwZWN0QW5kQ29uc3VtZShkaWFnOjplcnJfZXhwZWN0ZWRfbHBhcmVuKSkKKyAgaWYgKFQuZXhwZWN0QW5kQ29uc3VtZSgpKQogICAgIHJldHVybjsKIAogICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYzsKQEAgLTIzMzksNyArMjI4Miw2IEBACiAgIGFzc2VydChEUy5oYXNUYWdEZWZpbml0aW9uKCkgJiYgInNob3VsZG4ndCBjYWxsIHRoaXMiKTsKIAogICBib29sIEVudGVyaW5nQ29udGV4dCA9IChEU0NvbnRleHQgPT0gRFNDX2NsYXNzIHx8IERTQ29udGV4dCA9PSBEU0NfdG9wX2xldmVsKTsKLSAgYm9vbCBIYXNNaXNzaW5nU2VtaSA9IGZhbHNlOwogCiAgIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyAmJgogICAgICAgKFRvay5pcyh0b2s6OmlkZW50aWZpZXIpIHx8IFRvay5pcyh0b2s6OmNvbG9uY29sb24pIHx8CkBAIC0yMzQ5LDYzICsyMjkxLDc3IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAorICBib29sIEhhc1Njb3BlID0gVG9rLmlzKHRvazo6YW5ub3RfY3h4c2NvcGUpOworICAvLyBNYWtlIGEgY29weSBpbiBjYXNlIEdldExvb2tBaGVhZFRva2VuIGludmFsaWRhdGVzIHRoZSByZXN1bHQgb2YgTmV4dFRva2VuLgorICBUb2tlbiBBZnRlclNjb3BlID0gSGFzU2NvcGUgPyBOZXh0VG9rZW4oKSA6IFRvazsKKwogICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZm9sbG93aW5nIHRva2VucyBjb3VsZCBwb3NzaWJseSBiZSBhCiAgIC8vIGRlY2xhcmF0b3IuCi0gIGlmIChUb2suaXModG9rOjppZGVudGlmaWVyKSB8fCBUb2suaXModG9rOjphbm5vdF90ZW1wbGF0ZV9pZCkpIHsKLSAgICBjb25zdCBUb2tlbiAmTmV4dCA9IE5leHRUb2tlbigpOworICBib29sIE1pZ2h0QmVEZWNsYXJhdG9yID0gdHJ1ZTsKKyAgaWYgKFRvay5pcyh0b2s6Omt3X3R5cGVuYW1lKSB8fCBUb2suaXModG9rOjphbm5vdF90eXBlbmFtZSkpIHsKKyAgICAvLyBBIGRlY2xhcmF0b3ItaWQgY2FuJ3Qgc3RhcnQgd2l0aCAndHlwZW5hbWUnLgorICAgIE1pZ2h0QmVEZWNsYXJhdG9yID0gZmFsc2U7CisgIH0gZWxzZSBpZiAoQWZ0ZXJTY29wZS5pcyh0b2s6OmFubm90X3RlbXBsYXRlX2lkKSkgeworICAgIC8vIElmIHdlIGhhdmUgYSB0eXBlIGV4cHJlc3NlZCBhcyBhIHRlbXBsYXRlLWlkLCB0aGlzIGNhbm5vdCBiZSBhCisgICAgLy8gZGVjbGFyYXRvci1pZCAoc3VjaCBhIHR5cGUgY2Fubm90IGJlIHJlZGVjbGFyZWQgaW4gYSBzaW1wbGUtZGVjbGFyYXRpb24pLgorICAgIFRlbXBsYXRlSWRBbm5vdGF0aW9uICpBbm5vdCA9CisgICAgICAgIHN0YXRpY19jYXN0PFRlbXBsYXRlSWRBbm5vdGF0aW9uICo+KEFmdGVyU2NvcGUuZ2V0QW5ub3RhdGlvblZhbHVlKCkpOworICAgIGlmIChBbm5vdC0+S2luZCA9PSBUTktfVHlwZV90ZW1wbGF0ZSkKKyAgICAgIE1pZ2h0QmVEZWNsYXJhdG9yID0gZmFsc2U7CisgIH0gZWxzZSBpZiAoQWZ0ZXJTY29wZS5pcyh0b2s6OmlkZW50aWZpZXIpKSB7CisgICAgY29uc3QgVG9rZW4gJk5leHQgPSBIYXNTY29wZSA/IEdldExvb2tBaGVhZFRva2VuKDIpIDogTmV4dFRva2VuKCk7CisKICAgICAvLyBUaGVzZSB0b2tlbnMgY2Fubm90IGNvbWUgYWZ0ZXIgdGhlIGRlY2xhcmF0b3ItaWQgaW4gYQogICAgIC8vIHNpbXBsZS1kZWNsYXJhdGlvbiwgYW5kIGFyZSBsaWtlbHkgdG8gY29tZSBhZnRlciBhIHR5cGUtc3BlY2lmaWVyLgotICAgIEhhc01pc3NpbmdTZW1pID0gTmV4dC5pcyh0b2s6OnN0YXIpIHx8IE5leHQuaXModG9rOjphbXApIHx8Ci0gICAgICAgICAgICAgICAgICAgICBOZXh0LmlzKHRvazo6YW1wYW1wKSB8fCBOZXh0LmlzKHRvazo6aWRlbnRpZmllcikgfHwKLSAgICAgICAgICAgICAgICAgICAgIE5leHQuaXModG9rOjphbm5vdF9jeHhzY29wZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIE5leHQuaXModG9rOjpjb2xvbmNvbG9uKTsKLSAgfSBlbHNlIGlmIChUb2suaXModG9rOjphbm5vdF9jeHhzY29wZSkgJiYKLSAgICAgICAgICAgICBOZXh0VG9rZW4oKS5pcyh0b2s6OmlkZW50aWZpZXIpICYmCi0gICAgICAgICAgICAgRFMuZ2V0U3RvcmFnZUNsYXNzU3BlYygpICE9IERlY2xTcGVjOjpTQ1NfdHlwZWRlZikgewotICAgIC8vIFdlIGFsbW9zdCBjZXJ0YWlubHkgaGF2ZSBhIG1pc3Npbmcgc2VtaWNvbG9uLiBMb29rIHVwIHRoZSBuYW1lIGFuZAotICAgIC8vIGNoZWNrOyBpZiBpdCBuYW1lcyBhIHR5cGUsIHdlJ3JlIG1pc3NpbmcgYSBzZW1pY29sb24uCi0gICAgQ1hYU2NvcGVTcGVjIFNTOwotICAgIEFjdGlvbnMuUmVzdG9yZU5lc3RlZE5hbWVTcGVjaWZpZXJBbm5vdGF0aW9uKFRvay5nZXRBbm5vdGF0aW9uVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2suZ2V0QW5ub3RhdGlvblJhbmdlKCksIFNTKTsKLSAgICBjb25zdCBUb2tlbiAmTmV4dCA9IE5leHRUb2tlbigpOwotICAgIElkZW50aWZpZXJJbmZvICpOYW1lID0gTmV4dC5nZXRJZGVudGlmaWVySW5mbygpOwotICAgIFNlbWE6Ok5hbWVDbGFzc2lmaWNhdGlvbiBDbGFzc2lmaWNhdGlvbiA9Ci0gICAgICAgIEFjdGlvbnMuQ2xhc3NpZnlOYW1lKGdldEN1clNjb3BlKCksIFNTLCBOYW1lLCBOZXh0LmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpLCAvKklzQWRkcmVzc09mT3BlcmFuZCovZmFsc2UpOwotICAgIHN3aXRjaCAoQ2xhc3NpZmljYXRpb24uZ2V0S2luZCgpKSB7Ci0gICAgY2FzZSBTZW1hOjpOQ19FcnJvcjoKLSAgICAgIFNraXBNYWxmb3JtZWREZWNsKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoTmV4dC5pcyh0b2s6OnN0YXIpIHx8IE5leHQuaXModG9rOjphbXApIHx8IE5leHQuaXModG9rOjphbXBhbXApIHx8CisgICAgICAgIE5leHQuaXModG9rOjppZGVudGlmaWVyKSB8fCBOZXh0LmlzKHRvazo6YW5ub3RfY3h4c2NvcGUpIHx8CisgICAgICAgIE5leHQuaXModG9rOjpjb2xvbmNvbG9uKSkgeworICAgICAgLy8gTWlzc2luZyBhIHNlbWljb2xvbi4KKyAgICAgIE1pZ2h0QmVEZWNsYXJhdG9yID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChIYXNTY29wZSkgeworICAgICAgLy8gSWYgdGhlIGRlY2xhcmF0b3ItaWQgaGFzIGEgc2NvcGUgc3BlY2lmaWVyLCBpdCBtdXN0IHJlZGVjbGFyZSBhCisgICAgICAvLyBwcmV2aW91c2x5LWRlY2xhcmVkIGVudGl0eS4gSWYgdGhhdCdzIGEgdHlwZSAoYW5kIHRoaXMgaXMgbm90IGEKKyAgICAgIC8vIHR5cGVkZWYpLCB0aGF0J3MgYW4gZXJyb3IuCisgICAgICBDWFhTY29wZVNwZWMgU1M7CisgICAgICBBY3Rpb25zLlJlc3RvcmVOZXN0ZWROYW1lU3BlY2lmaWVyQW5ub3RhdGlvbigKKyAgICAgICAgICBUb2suZ2V0QW5ub3RhdGlvblZhbHVlKCksIFRvay5nZXRBbm5vdGF0aW9uUmFuZ2UoKSwgU1MpOworICAgICAgSWRlbnRpZmllckluZm8gKk5hbWUgPSBBZnRlclNjb3BlLmdldElkZW50aWZpZXJJbmZvKCk7CisgICAgICBTZW1hOjpOYW1lQ2xhc3NpZmljYXRpb24gQ2xhc3NpZmljYXRpb24gPSBBY3Rpb25zLkNsYXNzaWZ5TmFtZSgKKyAgICAgICAgICBnZXRDdXJTY29wZSgpLCBTUywgTmFtZSwgQWZ0ZXJTY29wZS5nZXRMb2NhdGlvbigpLCBOZXh0LAorICAgICAgICAgIC8qSXNBZGRyZXNzT2ZPcGVyYW5kKi9mYWxzZSk7CisgICAgICBzd2l0Y2ggKENsYXNzaWZpY2F0aW9uLmdldEtpbmQoKSkgeworICAgICAgY2FzZSBTZW1hOjpOQ19FcnJvcjoKKyAgICAgICAgU2tpcE1hbGZvcm1lZERlY2woKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICBjYXNlIFNlbWE6Ok5DX0tleXdvcmQ6Ci0gICAgY2FzZSBTZW1hOjpOQ19OZXN0ZWROYW1lU3BlY2lmaWVyOgotICAgICAgbGx2bV91bnJlYWNoYWJsZSgidHlwbyBjb3JyZWN0aW9uIGFuZCBuZXN0ZWQgbmFtZSBzcGVjaWZpZXJzIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJwb3NzaWJsZSBoZXJlIik7CisgICAgICBjYXNlIFNlbWE6Ok5DX0tleXdvcmQ6CisgICAgICBjYXNlIFNlbWE6Ok5DX05lc3RlZE5hbWVTcGVjaWZpZXI6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoInR5cG8gY29ycmVjdGlvbiBhbmQgbmVzdGVkIG5hbWUgc3BlY2lmaWVycyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NzaWJsZSBoZXJlIik7CiAKLSAgICBjYXNlIFNlbWE6Ok5DX1R5cGU6Ci0gICAgY2FzZSBTZW1hOjpOQ19UeXBlVGVtcGxhdGU6Ci0gICAgICAvLyBOb3QgYSBwcmV2aW91c2x5LWRlY2xhcmVkIG5vbi10eXBlIGVudGl0eS4KLSAgICAgIEhhc01pc3NpbmdTZW1pID0gdHJ1ZTsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBTZW1hOjpOQ19UeXBlOgorICAgICAgY2FzZSBTZW1hOjpOQ19UeXBlVGVtcGxhdGU6CisgICAgICAgIC8vIE5vdCBhIHByZXZpb3VzbHktZGVjbGFyZWQgbm9uLXR5cGUgZW50aXR5LgorICAgICAgICBNaWdodEJlRGVjbGFyYXRvciA9IGZhbHNlOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgU2VtYTo6TkNfVW5rbm93bjoKLSAgICBjYXNlIFNlbWE6Ok5DX0V4cHJlc3Npb246Ci0gICAgY2FzZSBTZW1hOjpOQ19WYXJUZW1wbGF0ZToKLSAgICBjYXNlIFNlbWE6Ok5DX0Z1bmN0aW9uVGVtcGxhdGU6Ci0gICAgICAvLyBNaWdodCBiZSBhIHJlZGVjbGFyYXRpb24gb2YgYSBwcmlvciBlbnRpdHkuCi0gICAgICBIYXNNaXNzaW5nU2VtaSA9IGZhbHNlOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNlbWE6Ok5DX1Vua25vd246CisgICAgICBjYXNlIFNlbWE6Ok5DX0V4cHJlc3Npb246CisgICAgICBjYXNlIFNlbWE6Ok5DX1ZhclRlbXBsYXRlOgorICAgICAgY2FzZSBTZW1hOjpOQ19GdW5jdGlvblRlbXBsYXRlOgorICAgICAgICAvLyBNaWdodCBiZSBhIHJlZGVjbGFyYXRpb24gb2YgYSBwcmlvciBlbnRpdHkuCisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgfSBlbHNlIGlmIChUb2suaXModG9rOjprd190eXBlbmFtZSkgfHwgVG9rLmlzKHRvazo6YW5ub3RfdHlwZW5hbWUpKSB7Ci0gICAgSGFzTWlzc2luZ1NlbWkgPSB0cnVlOwogICB9CiAKLSAgaWYgKCFIYXNNaXNzaW5nU2VtaSkKKyAgaWYgKE1pZ2h0QmVEZWNsYXJhdG9yKQogICAgIHJldHVybiBmYWxzZTsKIAorICBjb25zdCBQcmludGluZ1BvbGljeSAmUFBvbCA9IEFjdGlvbnMuZ2V0QVNUQ29udGV4dCgpLmdldFByaW50aW5nUG9saWN5KCk7CiAgIERpYWcoUFAuZ2V0TG9jRm9yRW5kT2ZUb2tlbihEUy5nZXRSZXBBc0RlY2woKS0+Z2V0TG9jRW5kKCkpLAotICAgICAgIGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2FmdGVyX3RhZ2RlY2wpCi0gICAgPDwgRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoRFMuZ2V0VHlwZVNwZWNUeXBlKCkpOworICAgICAgIGRpYWc6OmVycl9leHBlY3RlZF9hZnRlcikKKyAgICAgIDw8IERlY2xTcGVjOjpnZXRTcGVjaWZpZXJOYW1lKERTLmdldFR5cGVTcGVjVHlwZSgpLCBQUG9sKSA8PCB0b2s6OnNlbWk7CiAKICAgLy8gVHJ5IHRvIHJlY292ZXIgZnJvbSB0aGUgdHlwbywgYnkgZHJvcHBpbmcgdGhlIHRhZyBkZWZpbml0aW9uIGFuZCBwYXJzaW5nCiAgIC8vIHRoZSBwcm9ibGVtYXRpYyB0b2tlbnMgYXMgYSB0eXBlLgpAQCAtMjQ2MSw2ICsyNDE3LDcgQEAKICAgYm9vbCBFbnRlcmluZ0NvbnRleHQgPSAoRFNDb250ZXh0ID09IERTQ19jbGFzcyB8fCBEU0NvbnRleHQgPT0gRFNDX3RvcF9sZXZlbCk7CiAgIGJvb2wgQXR0cnNMYXN0VGltZSA9IGZhbHNlOwogICBQYXJzZWRBdHRyaWJ1dGVzV2l0aFJhbmdlIGF0dHJzKEF0dHJGYWN0b3J5KTsKKyAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSA9IEFjdGlvbnMuZ2V0QVNUQ29udGV4dCgpLmdldFByaW50aW5nUG9saWN5KCk7CiAgIHdoaWxlICgxKSB7CiAgICAgYm9vbCBpc0ludmFsaWQgPSBmYWxzZTsKICAgICBjb25zdCBjaGFyICpQcmV2U3BlYyA9IDA7CkBAIC0yNDg0LDcgKzI0NDEsNyBAQAogCiAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIGRlY2xhcmF0aW9uIHNwZWNpZmllciB0b2tlbiwgd2UncmUgZG9uZSByZWFkaW5nIGRlY2wKICAgICAgIC8vIHNwZWNpZmllcnMuICBGaXJzdCB2ZXJpZnkgdGhhdCBEZWNsU3BlYydzIGFyZSBjb25zaXN0ZW50LgotICAgICAgRFMuRmluaXNoKERpYWdzLCBQUCk7CisgICAgICBEUy5GaW5pc2goRGlhZ3MsIFBQLCBQb2xpY3kpOwogICAgICAgcmV0dXJuOwogCiAgICAgY2FzZSB0b2s6Omxfc3F1YXJlOgpAQCAtMjU4Niw3ICsyNTQzLDcgQEAKICAgICAgICAgaWYgKChEU0NvbnRleHQgPT0gRFNDX3RvcF9sZXZlbCB8fCBEU0NvbnRleHQgPT0gRFNDX2NsYXNzKSAmJgogICAgICAgICAgICAgVGVtcGxhdGVJZC0+TmFtZSAmJgogICAgICAgICAgICAgQWN0aW9ucy5pc0N1cnJlbnRDbGFzc05hbWUoKlRlbXBsYXRlSWQtPk5hbWUsIGdldEN1clNjb3BlKCksICZTUykpIHsKLSAgICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvckRlY2xhcmF0b3IoKSkgeworICAgICAgICAgIGlmIChpc0NvbnN0cnVjdG9yRGVjbGFyYXRvcigvKlVucXVhbGlmaWVkKi9mYWxzZSkpIHsKICAgICAgICAgICAgIC8vIFRoZSB1c2VyIG1lYW50IHRoaXMgdG8gYmUgYW4gb3V0LW9mLWxpbmUgY29uc3RydWN0b3IKICAgICAgICAgICAgIC8vIGRlZmluaXRpb24sIGJ1dCB0ZW1wbGF0ZSBhcmd1bWVudHMgYXJlIG5vdCBhbGxvd2VkCiAgICAgICAgICAgICAvLyB0aGVyZS4gIEp1c3QgYWxsb3cgdGhpcyBhcyBhIGNvbnN0cnVjdG9yOyB3ZSdsbApAQCAtMjYxOCw3ICsyNTc1LDcgQEAKICAgICAgICAgICBQYXJzZWRUeXBlIFQgPSBnZXRUeXBlQW5ub3RhdGlvbihUb2spOwogICAgICAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX3R5cGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2suZ2V0QW5ub3RhdGlvbkVuZExvYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lELCBUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCwgVCwgUG9saWN5KTsKICAgICAgICAgICBpZiAoaXNJbnZhbGlkKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI2MzYsNyArMjU5Myw3IEBACiAgICAgICBpZiAoKERTQ29udGV4dCA9PSBEU0NfdG9wX2xldmVsIHx8IERTQ29udGV4dCA9PSBEU0NfY2xhc3MpICYmCiAgICAgICAgICAgQWN0aW9ucy5pc0N1cnJlbnRDbGFzc05hbWUoKk5leHQuZ2V0SWRlbnRpZmllckluZm8oKSwgZ2V0Q3VyU2NvcGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU1MpKSB7Ci0gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yRGVjbGFyYXRvcigpKQorICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvckRlY2xhcmF0b3IoLypVbnF1YWxpZmllZCovZmFsc2UpKQogICAgICAgICAgIGdvdG8gRG9uZVdpdGhEZWNsU3BlYzsKIAogICAgICAgICAvLyBBcyBub3RlZCBpbiBDKysgW2NsYXNzLnF1YWxdcDIgKGNpdGVkIGFib3ZlKSwgd2hlbiB0aGUgbmFtZQpAQCAtMjY3Nyw3ICsyNjM0LDcgQEAKICAgICAgIENvbnN1bWVUb2tlbigpOyAvLyBUaGUgQysrIHNjb3BlLgogCiAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF90eXBlbmFtZSwgTG9jLCBQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFR5cGVSZXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCwgVHlwZVJlcCwgUG9saWN5KTsKICAgICAgIGlmIChpc0ludmFsaWQpCiAgICAgICAgIGJyZWFrOwogCkBAIC0yNjk2LDcgKzI2NTMsNyBAQAogICAgICAgaWYgKFRvay5nZXRBbm5vdGF0aW9uVmFsdWUoKSkgewogICAgICAgICBQYXJzZWRUeXBlIFQgPSBnZXRUeXBlQW5ub3RhdGlvbihUb2spOwogICAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF90eXBlbmFtZSwgTG9jLCBQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCwgVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFQsIFBvbGljeSk7CiAgICAgICB9IGVsc2UKICAgICAgICAgRFMuU2V0VHlwZVNwZWNFcnJvcigpOwogCkBAIC0yNzgzLDExICsyNzQwLDExIEBACiAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoaXMgaXMgYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbi4KICAgICAgIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyAmJiBEU0NvbnRleHQgPT0gRFNDX2NsYXNzICYmCiAgICAgICAgICAgQWN0aW9ucy5pc0N1cnJlbnRDbGFzc05hbWUoKlRvay5nZXRJZGVudGlmaWVySW5mbygpLCBnZXRDdXJTY29wZSgpKSAmJgotICAgICAgICAgIGlzQ29uc3RydWN0b3JEZWNsYXJhdG9yKCkpCisgICAgICAgICAgaXNDb25zdHJ1Y3RvckRlY2xhcmF0b3IoLypVbnF1YWxpZmllZCovdHJ1ZSkpCiAgICAgICAgIGdvdG8gRG9uZVdpdGhEZWNsU3BlYzsKIAogICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfdHlwZW5hbWUsIExvYywgUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBUeXBlUmVwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFR5cGVSZXAsIFBvbGljeSk7CiAgICAgICBpZiAoaXNJbnZhbGlkKQogICAgICAgICBicmVhazsKIApAQCAtMjgxOSw3ICsyNzc2LDcgQEAKICAgICAgIC8vIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uLgogICAgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmIERTQ29udGV4dCA9PSBEU0NfY2xhc3MgJiYKICAgICAgICAgICBBY3Rpb25zLmlzQ3VycmVudENsYXNzTmFtZSgqVGVtcGxhdGVJZC0+TmFtZSwgZ2V0Q3VyU2NvcGUoKSkgJiYKLSAgICAgICAgICBpc0NvbnN0cnVjdG9yRGVjbGFyYXRvcigpKQorICAgICAgICAgIGlzQ29uc3RydWN0b3JEZWNsYXJhdG9yKFRlbXBsYXRlSWQtPlNTLmlzRW1wdHkoKSkpCiAgICAgICAgIGdvdG8gRG9uZVdpdGhEZWNsU3BlYzsKIAogICAgICAgLy8gVHVybiB0aGUgdGVtcGxhdGUtaWQgYW5ub3RhdGlvbiB0b2tlbiBpbnRvIGEgdHlwZSBhbm5vdGF0aW9uCkBAIC0yODQzLDEwICsyODAwLDggQEAKICAgICAgIGlzSW52YWxpZCA9IERTLnNldEZ1bmN0aW9uU3BlY0ZvcmNlSW5saW5lKExvYywgUHJldlNwZWMsIERpYWdJRCk7CiAgICAgICBJZGVudGlmaWVySW5mbyAqQXR0ck5hbWUgPSBUb2suZ2V0SWRlbnRpZmllckluZm8oKTsKICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0dHJOYW1lTG9jID0gVG9rLmdldExvY2F0aW9uKCk7Ci0gICAgICAvLyBGSVhNRTogVGhpcyBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBpZiBpdCBpcyBzZXQgdG8gYmUgYSBkZWNsc3BlYwotICAgICAgLy8gICAgICAgIGF0dHJpYnV0ZSwgYW5kIGEgR05VIGF0dHJpYnV0ZSBpcyBzaW1wbHkgaW5jb3JyZWN0LgogICAgICAgRFMuZ2V0QXR0cmlidXRlcygpLmFkZE5ldyhBdHRyTmFtZSwgQXR0ck5hbWVMb2MsIDAsIEF0dHJOYW1lTG9jLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpBU19HTlUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpBU19LZXl3b3JkKTsKICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjg3Niw0NiArMjgzMSw0NiBAQAogICAgIC8vIHN0b3JhZ2UtY2xhc3Mtc3BlY2lmaWVyCiAgICAgY2FzZSB0b2s6Omt3X3R5cGVkZWY6CiAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRTdG9yYWdlQ2xhc3NTcGVjKEFjdGlvbnMsIERlY2xTcGVjOjpTQ1NfdHlwZWRlZiwgTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19leHRlcm46CiAgICAgICBpZiAoRFMuZ2V0VGhyZWFkU3RvcmFnZUNsYXNzU3BlYygpID09IERlY2xTcGVjOjpUU0NTX19fdGhyZWFkKQogICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXh0X3RocmVhZF9iZWZvcmUpIDw8ICJleHRlcm4iOwogICAgICAgaXNJbnZhbGlkID0gRFMuU2V0U3RvcmFnZUNsYXNzU3BlYyhBY3Rpb25zLCBEZWNsU3BlYzo6U0NTX2V4dGVybiwgTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19fX3ByaXZhdGVfZXh0ZXJuX186CiAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRTdG9yYWdlQ2xhc3NTcGVjKEFjdGlvbnMsIERlY2xTcGVjOjpTQ1NfcHJpdmF0ZV9leHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYywgUHJldlNwZWMsIERpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19zdGF0aWM6CiAgICAgICBpZiAoRFMuZ2V0VGhyZWFkU3RvcmFnZUNsYXNzU3BlYygpID09IERlY2xTcGVjOjpUU0NTX19fdGhyZWFkKQogICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXh0X3RocmVhZF9iZWZvcmUpIDw8ICJzdGF0aWMiOwogICAgICAgaXNJbnZhbGlkID0gRFMuU2V0U3RvcmFnZUNsYXNzU3BlYyhBY3Rpb25zLCBEZWNsU3BlYzo6U0NTX3N0YXRpYywgTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19hdXRvOgogICAgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEpIHsKICAgICAgICAgaWYgKGlzS25vd25Ub0JlVHlwZVNwZWNpZmllcihHZXRMb29rQWhlYWRUb2tlbigxKSkpIHsKICAgICAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRTdG9yYWdlQ2xhc3NTcGVjKEFjdGlvbnMsIERlY2xTcGVjOjpTQ1NfYXV0bywgTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lELCBQb2xpY3kpOwogICAgICAgICAgIGlmICghaXNJbnZhbGlkKQogICAgICAgICAgICAgRGlhZyhUb2ssIGRpYWc6OmV4dF9hdXRvX3N0b3JhZ2VfY2xhc3MpCiAgICAgICAgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlUmVtb3ZhbChEUy5nZXRTdG9yYWdlQ2xhc3NTcGVjTG9jKCkpOwogICAgICAgICB9IGVsc2UKICAgICAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9hdXRvLCBMb2MsIFByZXZTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFBvbGljeSk7CiAgICAgICB9IGVsc2UKICAgICAgICAgaXNJbnZhbGlkID0gRFMuU2V0U3RvcmFnZUNsYXNzU3BlYyhBY3Rpb25zLCBEZWNsU3BlYzo6U0NTX2F1dG8sIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lELCBQb2xpY3kpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSB0b2s6Omt3X3JlZ2lzdGVyOgogICAgICAgaXNJbnZhbGlkID0gRFMuU2V0U3RvcmFnZUNsYXNzU3BlYyhBY3Rpb25zLCBEZWNsU3BlYzo6U0NTX3JlZ2lzdGVyLCBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZTcGVjLCBEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lELCBQb2xpY3kpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSB0b2s6Omt3X211dGFibGU6CiAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRTdG9yYWdlQ2xhc3NTcGVjKEFjdGlvbnMsIERlY2xTcGVjOjpTQ1NfbXV0YWJsZSwgTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19fX3RocmVhZDoKICAgICAgIGlzSW52YWxpZCA9IERTLlNldFN0b3JhZ2VDbGFzc1NwZWNUaHJlYWQoRGVjbFNwZWM6OlRTQ1NfX190aHJlYWQsIExvYywKQEAgLTI5NzcsMTkgKzI5MzIsMTkgQEAKICAgICAvLyB0eXBlLXNwZWNpZmllcgogICAgIGNhc2UgdG9rOjprd19zaG9ydDoKICAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjV2lkdGgoRGVjbFNwZWM6OlRTV19zaG9ydCwgTG9jLCBQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBQb2xpY3kpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSB0b2s6Omt3X2xvbmc6CiAgICAgICBpZiAoRFMuZ2V0VHlwZVNwZWNXaWR0aCgpICE9IERlY2xTcGVjOjpUU1dfbG9uZykKICAgICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZVNwZWNXaWR0aChEZWNsU3BlYzo6VFNXX2xvbmcsIExvYywgUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFBvbGljeSk7CiAgICAgICBlbHNlCiAgICAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjV2lkdGgoRGVjbFNwZWM6OlRTV19sb25nbG9uZywgTG9jLCBQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19fX2ludDY0OgogICAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1dpZHRoKERlY2xTcGVjOjpUU1dfbG9uZ2xvbmcsIExvYywgUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFBvbGljeSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIHRvazo6a3dfc2lnbmVkOgogICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZVNwZWNTaWduKERlY2xTcGVjOjpUU1Nfc2lnbmVkLCBMb2MsIFByZXZTcGVjLApAQCAtMzAwOSw0MyArMjk2NCw0MyBAQAogICAgICAgYnJlYWs7CiAgICAgY2FzZSB0b2s6Omt3X3ZvaWQ6CiAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF92b2lkLCBMb2MsIFByZXZTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBQb2xpY3kpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSB0b2s6Omt3X2NoYXI6CiAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9jaGFyLCBMb2MsIFByZXZTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBQb2xpY3kpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSB0b2s6Omt3X2ludDoKICAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2ludCwgTG9jLCBQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19fX2ludDEyODoKICAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2ludDEyOCwgTG9jLCBQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19oYWxmOgogICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfaGFsZiwgTG9jLCBQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19mbG9hdDoKICAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2Zsb2F0LCBMb2MsIFByZXZTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBQb2xpY3kpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSB0b2s6Omt3X2RvdWJsZToKICAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2RvdWJsZSwgTG9jLCBQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd193Y2hhcl90OgogICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1Rfd2NoYXIsIExvYywgUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFBvbGljeSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIHRvazo6a3dfY2hhcjE2X3Q6CiAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9jaGFyMTYsIExvYywgUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFBvbGljeSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIHRvazo6a3dfY2hhcjMyX3Q6CiAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9jaGFyMzIsIExvYywgUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFBvbGljeSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIHRvazo6a3dfYm9vbDoKICAgICBjYXNlIHRvazo6a3dfX0Jvb2w6CkBAIC0zMDU5LDYyICszMDE0LDMwIEBACiAgICAgICAgIGlzSW52YWxpZCA9IHRydWU7CiAgICAgICB9IGVsc2UgewogICAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9ib29sLCBMb2MsIFByZXZTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCwgUG9saWN5KTsKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19fRGVjaW1hbDMyOgogICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfZGVjaW1hbDMyLCBMb2MsIFByZXZTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBQb2xpY3kpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSB0b2s6Omt3X19EZWNpbWFsNjQ6CiAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9kZWNpbWFsNjQsIExvYywgUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFBvbGljeSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIHRvazo6a3dfX0RlY2ltYWwxMjg6CiAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9kZWNpbWFsMTI4LCBMb2MsIFByZXZTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBQb2xpY3kpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSB0b2s6Omt3X19fdmVjdG9yOgotICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZUFsdGlWZWNWZWN0b3IodHJ1ZSwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVBbHRpVmVjVmVjdG9yKHRydWUsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19fX3BpeGVsOgotICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZUFsdGlWZWNQaXhlbCh0cnVlLCBMb2MsIFByZXZTcGVjLCBEaWFnSUQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0b2s6Omt3X2ltYWdlMWRfdDoKLSAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9pbWFnZTFkX3QsIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRvazo6a3dfaW1hZ2UxZF9hcnJheV90OgotICAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2ltYWdlMWRfYXJyYXlfdCwgTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lEKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdG9rOjprd19pbWFnZTFkX2J1ZmZlcl90OgotICAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2ltYWdlMWRfYnVmZmVyX3QsIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRvazo6a3dfaW1hZ2UyZF90OgotICAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2ltYWdlMmRfdCwgTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lEKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdG9rOjprd19pbWFnZTJkX2FycmF5X3Q6Ci0gICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfaW1hZ2UyZF9hcnJheV90LCBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZTcGVjLCBEaWFnSUQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0b2s6Omt3X2ltYWdlM2RfdDoKLSAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2ltYWdlM2RfdCwgTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZTcGVjLCBEaWFnSUQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0b2s6Omt3X3NhbXBsZXJfdDoKLSAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX3NhbXBsZXJfdCwgTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZTcGVjLCBEaWFnSUQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0b2s6Omt3X2V2ZW50X3Q6Ci0gICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9ldmVudF90LCBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCk7CisgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlQWx0aVZlY1BpeGVsKHRydWUsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdG9rOjprd19fX3Vua25vd25fYW55dHlwZToKICAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVTcGVjVHlwZShUU1RfdW5rbm93bl9hbnl0eXBlLCBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICAgIGJyZWFrOwogCiAgICAgLy8gY2xhc3Mtc3BlY2lmaWVyOgpAQCAtMzE5OCw5ICszMTIxLDYgQEAKICAgICAgIGJyZWFrOwogCiAgICAgLy8gT3BlbkNMIHF1YWxpZmllcnM6Ci0gICAgY2FzZSB0b2s6Omt3X3ByaXZhdGU6Ci0gICAgICBpZiAoIWdldExhbmdPcHRzKCkuT3BlbkNMKQotICAgICAgICBnb3RvIERvbmVXaXRoRGVjbFNwZWM7CiAgICAgY2FzZSB0b2s6Omt3X19fcHJpdmF0ZToKICAgICBjYXNlIHRvazo6a3dfX19nbG9iYWw6CiAgICAgY2FzZSB0b2s6Omt3X19fbG9jYWw6CkBAIC0zMjA4LDcgKzMxMjgsNyBAQAogICAgIGNhc2UgdG9rOjprd19fX3JlYWRfb25seToKICAgICBjYXNlIHRvazo6a3dfX193cml0ZV9vbmx5OgogICAgIGNhc2UgdG9rOjprd19fX3JlYWRfd3JpdGU6Ci0gICAgICBQYXJzZU9wZW5DTFF1YWxpZmllcnMoRFMpOworICAgICAgUGFyc2VPcGVuQ0xRdWFsaWZpZXJzKERTLmdldEF0dHJpYnV0ZXMoKSk7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgdG9rOjpsZXNzOgpAQCAtMzMwNSw4ICszMjI1LDcgQEAKICAgICAgIFBhcnNlRGVjbGFyYXRvcihEZWNsYXJhdG9ySW5mby5EKTsKICAgICB9CiAKLSAgICBpZiAoVG9rLmlzKHRvazo6Y29sb24pKSB7Ci0gICAgICBDb25zdW1lVG9rZW4oKTsKKyAgICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29sb24pKSB7CiAgICAgICBFeHByUmVzdWx0IFJlcyhQYXJzZUNvbnN0YW50RXhwcmVzc2lvbigpKTsKICAgICAgIGlmIChSZXMuaXNJbnZhbGlkKCkpCiAgICAgICAgIFNraXBVbnRpbCh0b2s6OnNlbWksIFN0b3BCZWZvcmVNYXRjaCk7CkBAIC0zMzIyLDEyICszMjQxLDkgQEAKIAogICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBjb21tYSwgaXQgaXMgZWl0aGVyIHRoZSBlbmQgb2YgdGhlIGxpc3QgKGEgJzsnKQogICAgIC8vIG9yIGFuIGVycm9yLCBiYWlsIG91dC4KLSAgICBpZiAoVG9rLmlzTm90KHRvazo6Y29tbWEpKQorICAgIGlmICghVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29tbWEsIENvbW1hTG9jKSkKICAgICAgIHJldHVybjsKIAotICAgIC8vIENvbnN1bWUgdGhlIGNvbW1hLgotICAgIENvbW1hTG9jID0gQ29uc3VtZVRva2VuKCk7Ci0KICAgICBGaXJzdERlY2xhcmF0b3IgPSBmYWxzZTsKICAgfQogfQpAQCAtMzM1OCw3ICszMjc0LDcgQEAKICAgU21hbGxWZWN0b3I8RGVjbCAqLCAzMj4gRmllbGREZWNsczsKIAogICAvLyBXaGlsZSB3ZSBzdGlsbCBoYXZlIHNvbWV0aGluZyB0byByZWFkLCByZWFkIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIHN0cnVjdC4KLSAgd2hpbGUgKFRvay5pc05vdCh0b2s6OnJfYnJhY2UpICYmIFRvay5pc05vdCh0b2s6OmVvZikpIHsKKyAgd2hpbGUgKFRvay5pc05vdCh0b2s6OnJfYnJhY2UpICYmICFpc0VvZk9yRW9tKCkpIHsKICAgICAvLyBFYWNoIGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3AgcmVhZHMgb25lIHN0cnVjdC1kZWNsYXJhdGlvbi4KIAogICAgIC8vIENoZWNrIGZvciBleHRyYW5lb3VzIHRvcC1sZXZlbCBzZW1pY29sb24uCkBAIC0zMzk0LDcgKzMzMTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8RGVjbCAqPiAmRmllbGREZWNscykgOgogICAgICAgICAgIFAoUCksIFRhZ0RlY2woVGFnRGVjbCksIEZpZWxkRGVjbHMoRmllbGREZWNscykge30KIAotICAgICAgICB2b2lkIGludm9rZShQYXJzaW5nRmllbGREZWNsYXJhdG9yICZGRCkgeworICAgICAgICB2b2lkIGludm9rZShQYXJzaW5nRmllbGREZWNsYXJhdG9yICZGRCkgb3ZlcnJpZGUgewogICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGRlY2xhcmF0b3IgaW50byB0aGUgY3VycmVudCBUYWdEZWNsLgogICAgICAgICAgIERlY2wgKkZpZWxkID0gUC5BY3Rpb25zLkFjdE9uRmllbGQoUC5nZXRDdXJTY29wZSgpLCBUYWdEZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkQuRC5nZXREZWNsU3BlYygpLmdldFNvdXJjZVJhbmdlKCkuZ2V0QmVnaW4oKSwKQEAgLTM0MTUsOSArMzMzMSw5IEBACiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogICAgICAgQ29uc3VtZVRva2VuKCk7Ci0gICAgICBFeHBlY3RBbmRDb25zdW1lKHRvazo6bF9wYXJlbiwgZGlhZzo6ZXJyX2V4cGVjdGVkX2xwYXJlbik7CisgICAgICBFeHBlY3RBbmRDb25zdW1lKHRvazo6bF9wYXJlbik7CiAgICAgICBpZiAoIVRvay5pcyh0b2s6OmlkZW50aWZpZXIpKSB7Ci0gICAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOworICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmlkZW50aWZpZXI7CiAgICAgICAgIFNraXBVbnRpbCh0b2s6OnNlbWkpOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KQEAgLTM0MjYsMjEgKzMzNDIsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFRvay5nZXRJZGVudGlmaWVySW5mbygpLCBGaWVsZHMpOwogICAgICAgRmllbGREZWNscy5pbnNlcnQoRmllbGREZWNscy5lbmQoKSwgRmllbGRzLmJlZ2luKCksIEZpZWxkcy5lbmQoKSk7CiAgICAgICBDb25zdW1lVG9rZW4oKTsKLSAgICAgIEV4cGVjdEFuZENvbnN1bWUodG9rOjpyX3BhcmVuLCBkaWFnOjplcnJfZXhwZWN0ZWRfcnBhcmVuKTsKKyAgICAgIEV4cGVjdEFuZENvbnN1bWUodG9rOjpyX3BhcmVuKTsKICAgICB9CiAKLSAgICBpZiAoVG9rLmlzKHRvazo6c2VtaSkpIHsKLSAgICAgIENvbnN1bWVUb2tlbigpOwotICAgIH0gZWxzZSBpZiAoVG9rLmlzKHRvazo6cl9icmFjZSkpIHsKKyAgICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6c2VtaSkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChUb2suaXModG9rOjpyX2JyYWNlKSkgewogICAgICAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmV4dF9leHBlY3RlZF9zZW1pX2RlY2xfbGlzdCk7CiAgICAgICBicmVhazsKLSAgICB9IGVsc2UgewotICAgICAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2RlY2xfbGlzdCk7Ci0gICAgICAvLyBTa2lwIHRvIGVuZCBvZiBibG9jayBvciBzdGF0ZW1lbnQgdG8gYXZvaWQgZXh0LXdhcm5pbmcgb24gZXh0cmEgJzsnLgotICAgICAgU2tpcFVudGlsKHRvazo6cl9icmFjZSwgU3RvcEF0U2VtaSB8IFN0b3BCZWZvcmVNYXRjaCk7Ci0gICAgICAvLyBJZiB3ZSBzdG9wcGVkIGF0IGEgJzsnLCBlYXQgaXQuCi0gICAgICBpZiAoVG9rLmlzKHRvazo6c2VtaSkpIENvbnN1bWVUb2tlbigpOwogICAgIH0KKworICAgIEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLCBkaWFnOjplcnJfZXhwZWN0ZWRfc2VtaV9kZWNsX2xpc3QpOworICAgIC8vIFNraXAgdG8gZW5kIG9mIGJsb2NrIG9yIHN0YXRlbWVudCB0byBhdm9pZCBleHQtd2FybmluZyBvbiBleHRyYSAnOycuCisgICAgU2tpcFVudGlsKHRvazo6cl9icmFjZSwgU3RvcEF0U2VtaSB8IFN0b3BCZWZvcmVNYXRjaCk7CisgICAgLy8gSWYgd2Ugc3RvcHBlZCBhdCBhICc7JywgZWF0IGl0LgorICAgIFRyeUNvbnN1bWVUb2tlbih0b2s6OnNlbWkpOwogICB9CiAKICAgVC5jb25zdW1lQ2xvc2UoKTsKQEAgLTM1NTcsNyArMzQ3NCw3IEBACiAgICAgICByZXR1cm47CiAKICAgICBpZiAoU1MuaXNTZXQoKSAmJiBUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkgewotICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCk7CisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmlkZW50aWZpZXI7CiAgICAgICBpZiAoVG9rLmlzTm90KHRvazo6bF9icmFjZSkpIHsKICAgICAgICAgLy8gSGFzIG5vIG5hbWUgYW5kIGlzIG5vdCBhIGRlZmluaXRpb24uCiAgICAgICAgIC8vIFNraXAgdGhlIHJlc3Qgb2YgdGhpcyBkZWNsYXJhdG9yLCB1cCB1bnRpbCB0aGUgY29tbWEgb3Igc2VtaWNvbG9uLgpAQCAtMzU3MCw3ICszNDg3LDcgQEAKICAgLy8gTXVzdCBoYXZlIGVpdGhlciAnZW51bSBuYW1lJyBvciAnZW51bSB7Li4ufScuCiAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSAmJiBUb2suaXNOb3QodG9rOjpsX2JyYWNlKSAmJgogICAgICAgIShBbGxvd0ZpeGVkVW5kZXJseWluZ1R5cGUgJiYgVG9rLmlzKHRvazo6Y29sb24pKSkgewotICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnRfbGJyYWNlKTsKKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2VpdGhlcikgPDwgdG9rOjppZGVudGlmaWVyIDw8IHRvazo6bF9icmFjZTsKIAogICAgIC8vIFNraXAgdGhlIHJlc3Qgb2YgdGhpcyBkZWNsYXJhdG9yLCB1cCB1bnRpbCB0aGUgY29tbWEgb3Igc2VtaWNvbG9uLgogICAgIFNraXBVbnRpbCh0b2s6OmNvbW1hLCBTdG9wQXRTZW1pKTsKQEAgLTM2OTYsMTUgKzM2MTMsMTQgQEAKICAgICB9IGVsc2UgewogICAgICAgVFVLID0gU2VtYTo6VFVLX0RlZmluaXRpb247CiAgICAgfQotICB9IGVsc2UgaWYgKERTQyAhPSBEU0NfdHlwZV9zcGVjaWZpZXIgJiYKKyAgfSBlbHNlIGlmICghaXNUeXBlU3BlY2lmaWVyKERTQykgJiYKICAgICAgICAgICAgICAoVG9rLmlzKHRvazo6c2VtaSkgfHwKICAgICAgICAgICAgICAgKFRvay5pc0F0U3RhcnRPZkxpbmUoKSAmJgogICAgICAgICAgICAgICAgIWlzVmFsaWRBZnRlclR5cGVTcGVjaWZpZXIoQ2FuQmVCaXRmaWVsZCkpKSkgewogICAgIFRVSyA9IERTLmlzRnJpZW5kU3BlY2lmaWVkKCkgPyBTZW1hOjpUVUtfRnJpZW5kIDogU2VtYTo6VFVLX0RlY2xhcmF0aW9uOwogICAgIGlmIChUb2suaXNOb3QodG9rOjpzZW1pKSkgewogICAgICAgLy8gQSBzZW1pY29sb24gd2FzIG1pc3NpbmcgYWZ0ZXIgdGhpcyBkZWNsYXJhdGlvbi4gRGlhZ25vc2UgYW5kIHJlY292ZXIuCi0gICAgICBFeHBlY3RBbmRDb25zdW1lKHRvazo6c2VtaSwgZGlhZzo6ZXJyX2V4cGVjdGVkX3NlbWlfYWZ0ZXJfdGFnZGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgImVudW0iKTsKKyAgICAgIEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLCBkaWFnOjplcnJfZXhwZWN0ZWRfYWZ0ZXIsICJlbnVtIik7CiAgICAgICBQUC5FbnRlclRva2VuKFRvayk7CiAgICAgICBUb2suc2V0S2luZCh0b2s6OnNlbWkpOwogICAgIH0KQEAgLTM3NTksNyArMzY3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBTUywgTmFtZSwgTmFtZUxvYywgYXR0cnMuZ2V0TGlzdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUywgRFMuZ2V0TW9kdWxlUHJpdmF0ZVNwZWNMb2MoKSwgVFBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZWQsIElzRGVwZW5kZW50LCBTY29wZWRFbnVtS1dMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzU2NvcGVkVXNpbmdDbGFzc1RhZywgQmFzZVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc1Njb3BlZFVzaW5nQ2xhc3NUYWcsIEJhc2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0MgPT0gRFNDX3R5cGVfc3BlY2lmaWVyKTsKIAogICBpZiAoSXNEZXBlbmRlbnQpIHsKICAgICAvLyBUaGlzIGVudW0gaGFzIGEgZGVwZW5kZW50IG5lc3RlZC1uYW1lLXNwZWNpZmllci4gSGFuZGxlIGl0IGFzIGEKQEAgLTM3ODAsNyArMzY5Nyw4IEBACiAKICAgICBpZiAoRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfdHlwZW5hbWUsIFN0YXJ0TG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUxvYy5pc1ZhbGlkKCkgPyBOYW1lTG9jIDogU3RhcnRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lELCBUeXBlLmdldCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZTcGVjLCBEaWFnSUQsIFR5cGUuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25zLmdldEFTVENvbnRleHQoKS5nZXRQcmludGluZ1BvbGljeSgpKSkKICAgICAgIERpYWcoU3RhcnRMb2MsIERpYWdJRCkgPDwgUHJldlNwZWM7CiAKICAgICByZXR1cm47CkBAIC0zODAzLDcgKzM3MjEsOCBAQAogCiAgIGlmIChEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9lbnVtLCBTdGFydExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lTG9jLmlzVmFsaWQoKSA/IE5hbWVMb2MgOiBTdGFydExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lELCBUYWdEZWNsLCBPd25lZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCwgVGFnRGVjbCwgT3duZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9ucy5nZXRBU1RDb250ZXh0KCkuZ2V0UHJpbnRpbmdQb2xpY3koKSkpCiAgICAgRGlhZyhTdGFydExvYywgRGlhZ0lEKSA8PCBQcmV2U3BlYzsKIH0KIApAQCAtMzgzNCw3ICszNzUzLDE2IEBACiAgIERlY2wgKkxhc3RFbnVtQ29uc3REZWNsID0gMDsKIAogICAvLyBQYXJzZSB0aGUgZW51bWVyYXRvci1saXN0LgotICB3aGlsZSAoVG9rLmlzKHRvazo6aWRlbnRpZmllcikpIHsKKyAgd2hpbGUgKFRvay5pc05vdCh0b2s6OnJfYnJhY2UpKSB7CisgICAgLy8gUGFyc2UgZW51bWVyYXRvci4gSWYgZmFpbGVkLCB0cnkgc2tpcHBpbmcgdGlsbCB0aGUgc3RhcnQgb2YgdGhlIG5leHQKKyAgICAvLyBlbnVtZXJhdG9yIGRlZmluaXRpb24uCisgICAgaWYgKFRvay5pc05vdCh0b2s6OmlkZW50aWZpZXIpKSB7CisgICAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6aWRlbnRpZmllcjsKKyAgICAgIGlmIChTa2lwVW50aWwodG9rOjpjb21tYSwgdG9rOjpyX2JyYWNlLCBTdG9wQmVmb3JlTWF0Y2gpICYmCisgICAgICAgICAgVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29tbWEpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICBJZGVudGlmaWVySW5mbyAqSWRlbnQgPSBUb2suZ2V0SWRlbnRpZmllckluZm8oKTsKICAgICBTb3VyY2VMb2NhdGlvbiBJZGVudExvYyA9IENvbnN1bWVUb2tlbigpOwogCkBAIC0zODQ4LDExICszNzc2LDEwIEBACiAgICAgRXhwclJlc3VsdCBBc3NpZ25lZFZhbDsKICAgICBQYXJzaW5nRGVjbFJBSUlPYmplY3QgUEQoKnRoaXMsIFBhcnNpbmdEZWNsUkFJSU9iamVjdDo6Tm9QYXJlbnQpOwogCi0gICAgaWYgKFRvay5pcyh0b2s6OmVxdWFsKSkgewotICAgICAgRXF1YWxMb2MgPSBDb25zdW1lVG9rZW4oKTsKKyAgICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6ZXF1YWwsIEVxdWFsTG9jKSkgewogICAgICAgQXNzaWduZWRWYWwgPSBQYXJzZUNvbnN0YW50RXhwcmVzc2lvbigpOwogICAgICAgaWYgKEFzc2lnbmVkVmFsLmlzSW52YWxpZCgpKQotICAgICAgICBTa2lwVW50aWwodG9rOjpjb21tYSwgdG9rOjpyX2JyYWNlLCBTdG9wQXRTZW1pIHwgU3RvcEJlZm9yZU1hdGNoKTsKKyAgICAgICAgU2tpcFVudGlsKHRvazo6Y29tbWEsIHRvazo6cl9icmFjZSwgU3RvcEJlZm9yZU1hdGNoKTsKICAgICB9CiAKICAgICAvLyBJbnN0YWxsIHRoZSBlbnVtZXJhdG9yIGNvbnN0YW50IGludG8gRW51bURlY2wuCkBAIC0zODc0LDExICszODAxLDI1IEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAKLSAgICBpZiAoVG9rLmlzTm90KHRvazo6Y29tbWEpKQotICAgICAgYnJlYWs7Ci0gICAgU291cmNlTG9jYXRpb24gQ29tbWFMb2MgPSBDb25zdW1lVG9rZW4oKTsKKyAgICAvLyBFbXVtZXJhdG9yIGRlZmluaXRpb24gbXVzdCBiZSBmaW5pc2hlZCwgb25seSBjb21tYSBvciByX2JyYWNlIGFyZQorICAgIC8vIGFsbG93ZWQgaGVyZS4KKyAgICBTb3VyY2VMb2NhdGlvbiBDb21tYUxvYzsKKyAgICBpZiAoVG9rLmlzTm90KHRvazo6cl9icmFjZSkgJiYgIVRyeUNvbnN1bWVUb2tlbih0b2s6OmNvbW1hLCBDb21tYUxvYykpIHsKKyAgICAgIGlmIChFcXVhbExvYy5pc1ZhbGlkKCkpCisgICAgICAgIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZF9laXRoZXIpIDw8IHRvazo6cl9icmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0b2s6OmNvbW1hOworICAgICAgZWxzZQorICAgICAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWRfZW5kX29mX2VudW1lcmF0b3IpOworICAgICAgaWYgKFNraXBVbnRpbCh0b2s6OmNvbW1hLCB0b2s6OnJfYnJhY2UsIFN0b3BCZWZvcmVNYXRjaCkpIHsKKyAgICAgICAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OmNvbW1hLCBDb21tYUxvYykpCisgICAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CiAKLSAgICBpZiAoVG9rLmlzTm90KHRvazo6aWRlbnRpZmllcikpIHsKKyAgICAvLyBJZiBjb21tYSBpcyBmb2xsb3dlZCBieSByX2JyYWNlLCBlbWl0IGFwcHJvcHJpYXRlIHdhcm5pbmcuCisgICAgaWYgKFRvay5pcyh0b2s6OnJfYnJhY2UpICYmIENvbW1hTG9jLmlzVmFsaWQoKSkgewogICAgICAgaWYgKCFnZXRMYW5nT3B0cygpLkM5OSAmJiAhZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMSkKICAgICAgICAgRGlhZyhDb21tYUxvYywgZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMgPwogICAgICAgICAgICAgICAgZGlhZzo6ZXh0X2VudW1lcmF0b3JfbGlzdF9jb21tYV9jeHggOgpAQCAtMzg4Nyw2ICszODI4LDcgQEAKICAgICAgIGVsc2UgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEpCiAgICAgICAgIERpYWcoQ29tbWFMb2MsIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2VudW1lcmF0b3JfbGlzdF9jb21tYSkKICAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlbW92YWwoQ29tbWFMb2MpOworICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAKQEAgLTM5MTAsNyArMzg1Miw3IEBACiAgIC8vIHdhcyBwcm9iYWJseSBmb3Jnb3R0ZW4uCiAgIGJvb2wgQ2FuQmVCaXRmaWVsZCA9IGdldEN1clNjb3BlKCktPmdldEZsYWdzKCkgJiBTY29wZTo6Q2xhc3NTY29wZTsKICAgaWYgKCFpc1ZhbGlkQWZ0ZXJUeXBlU3BlY2lmaWVyKENhbkJlQml0ZmllbGQpKSB7Ci0gICAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2FmdGVyX3RhZ2RlY2wsICJlbnVtIik7CisgICAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9hZnRlciwgImVudW0iKTsKICAgICAvLyBQdXNoIHRoaXMgdG9rZW4gYmFjayBpbnRvIHRoZSBwcmVwcm9jZXNzb3IgYW5kIGNoYW5nZSBvdXIgY3VycmVudCB0b2tlbgogICAgIC8vIHRvICc7JyBzbyB0aGF0IHRoZSByZXN0IG9mIHRoZSBjb2RlIHJlY292ZXJzIGFzIHRob3VnaCB0aGVyZSB3ZXJlIGFuCiAgICAgLy8gJzsnIGFmdGVyIHRoZSBkZWZpbml0aW9uLgpAQCAtMzkyNCwxMiArMzg2Niw3IEBACiBib29sIFBhcnNlcjo6aXNUeXBlUXVhbGlmaWVyKCkgY29uc3QgewogICBzd2l0Y2ggKFRvay5nZXRLaW5kKCkpIHsKICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gdHlwZS1xdWFsaWZpZXIgb25seSBpbiBPcGVuQ0wKLSAgY2FzZSB0b2s6Omt3X3ByaXZhdGU6Ci0gICAgcmV0dXJuIGdldExhbmdPcHRzKCkuT3BlbkNMOwotCi0gICAgLy8gdHlwZS1xdWFsaWZpZXIKKyAgLy8gdHlwZS1xdWFsaWZpZXIKICAgY2FzZSB0b2s6Omt3X2NvbnN0OgogICBjYXNlIHRvazo6a3dfdm9sYXRpbGU6CiAgIGNhc2UgdG9rOjprd19yZXN0cmljdDoKQEAgLTM5NzUsMTYgKzM5MTIsNiBAQAogICBjYXNlIHRvazo6a3dfX0RlY2ltYWwxMjg6CiAgIGNhc2UgdG9rOjprd19fX3ZlY3RvcjoKIAotICAgIC8vIE9wZW5DTCBzcGVjaWZpYyB0eXBlczoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlMWRfdDoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlMWRfYXJyYXlfdDoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlMWRfYnVmZmVyX3Q6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTJkX3Q6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTJkX2FycmF5X3Q6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTNkX3Q6Ci0gIGNhc2UgdG9rOjprd19zYW1wbGVyX3Q6Ci0gIGNhc2UgdG9rOjprd19ldmVudF90OgotCiAgICAgLy8gc3RydWN0LW9yLXVuaW9uLXNwZWNpZmllciAoQzk5KSBvciBjbGFzcy1zcGVjaWZpZXIgKEMrKykKICAgY2FzZSB0b2s6Omt3X2NsYXNzOgogICBjYXNlIHRvazo6a3dfc3RydWN0OgpAQCAtNDA1NywxNiArMzk4NCw2IEBACiAgIGNhc2UgdG9rOjprd19fRGVjaW1hbDEyODoKICAgY2FzZSB0b2s6Omt3X19fdmVjdG9yOgogCi0gICAgLy8gT3BlbkNMIHNwZWNpZmljIHR5cGVzOgotICBjYXNlIHRvazo6a3dfaW1hZ2UxZF90OgotICBjYXNlIHRvazo6a3dfaW1hZ2UxZF9hcnJheV90OgotICBjYXNlIHRvazo6a3dfaW1hZ2UxZF9idWZmZXJfdDoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlMmRfdDoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlMmRfYXJyYXlfdDoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlM2RfdDoKLSAgY2FzZSB0b2s6Omt3X3NhbXBsZXJfdDoKLSAgY2FzZSB0b2s6Omt3X2V2ZW50X3Q6Ci0KICAgICAvLyBzdHJ1Y3Qtb3ItdW5pb24tc3BlY2lmaWVyIChDOTkpIG9yIGNsYXNzLXNwZWNpZmllciAoQysrKQogICBjYXNlIHRvazo6a3dfY2xhc3M6CiAgIGNhc2UgdG9rOjprd19zdHJ1Y3Q6CkBAIC00MTExLDkgKzQwMjgsNiBAQAogCiAgICAgcmV0dXJuIHRydWU7CiAKLSAgY2FzZSB0b2s6Omt3X3ByaXZhdGU6Ci0gICAgcmV0dXJuIGdldExhbmdPcHRzKCkuT3BlbkNMOwotCiAgIC8vIEMxMSBfQXRvbWljCiAgIGNhc2UgdG9rOjprd19fQXRvbWljOgogICAgIHJldHVybiB0cnVlOwpAQCAtNDEyOSw5ICs0MDQzLDYgQEAKICAgc3dpdGNoIChUb2suZ2V0S2luZCgpKSB7CiAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKIAotICBjYXNlIHRvazo6a3dfcHJpdmF0ZToKLSAgICByZXR1cm4gZ2V0TGFuZ09wdHMoKS5PcGVuQ0w7Ci0KICAgY2FzZSB0b2s6OmlkZW50aWZpZXI6ICAgLy8gZm9vOjpiYXIKICAgICAvLyBVbmZvcnR1bmF0ZSBoYWNrIHRvIHN1cHBvcnQgIkNsYXNzLmZhY3RvcnlNZXRob2QiIG5vdGF0aW9uLgogICAgIGlmIChnZXRMYW5nT3B0cygpLk9iakMxICYmIE5leHRUb2tlbigpLmlzKHRvazo6cGVyaW9kKSkKQEAgLTQyMTMsMTYgKzQxMjQsNiBAQAogICBjYXNlIHRvazo6a3dfX0RlY2ltYWwxMjg6CiAgIGNhc2UgdG9rOjprd19fX3ZlY3RvcjoKIAotICAgIC8vIE9wZW5DTCBzcGVjaWZpYyB0eXBlczoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlMWRfdDoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlMWRfYXJyYXlfdDoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlMWRfYnVmZmVyX3Q6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTJkX3Q6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTJkX2FycmF5X3Q6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTNkX3Q6Ci0gIGNhc2UgdG9rOjprd19zYW1wbGVyX3Q6Ci0gIGNhc2UgdG9rOjprd19ldmVudF90OgotCiAgICAgLy8gc3RydWN0LW9yLXVuaW9uLXNwZWNpZmllciAoQzk5KSBvciBjbGFzcy1zcGVjaWZpZXIgKEMrKykKICAgY2FzZSB0b2s6Omt3X2NsYXNzOgogICBjYXNlIHRvazo6a3dfc3RydWN0OgpAQCAtNDMwMCw3ICs0MjAxLDcgQEAKICAgfQogfQogCi1ib29sIFBhcnNlcjo6aXNDb25zdHJ1Y3RvckRlY2xhcmF0b3IoKSB7Citib29sIFBhcnNlcjo6aXNDb25zdHJ1Y3RvckRlY2xhcmF0b3IoYm9vbCBJc1VucXVhbGlmaWVkKSB7CiAgIFRlbnRhdGl2ZVBhcnNpbmdBY3Rpb24gVFBBKCp0aGlzKTsKIAogICAvLyBQYXJzZSB0aGUgQysrIHNjb3BlIHNwZWNpZmllci4KQEAgLTQzODIsMTIgKzQyODMsMzUgQEAKICAgICBjYXNlIHRvazo6Y29sb25jb2xvbjoKICAgICAgIC8vIEMoWCAgIDo6ICAgWSk7CiAgICAgICAvLyBDKFggICA6OiAgICpwKTsKLSAgICBjYXNlIHRvazo6cl9wYXJlbjoKLSAgICAgIC8vIEMoWCAgICkKICAgICAgIC8vIEFzc3VtZSB0aGlzIGlzbid0IGEgY29uc3RydWN0b3IsIHJhdGhlciB0aGFuIGFzc3VtaW5nIGl0J3MgYQogICAgICAgLy8gY29uc3RydWN0b3Igd2l0aCBhbiB1bm5hbWVkIHBhcmFtZXRlciBvZiBhbiBpbGwtZm9ybWVkIHR5cGUuCiAgICAgICBicmVhazsKIAorICAgIGNhc2UgdG9rOjpyX3BhcmVuOgorICAgICAgLy8gQyhYICAgKQorICAgICAgaWYgKE5leHRUb2tlbigpLmlzKHRvazo6Y29sb24pIHx8IE5leHRUb2tlbigpLmlzKHRvazo6a3dfdHJ5KSkgeworICAgICAgICAvLyBBc3N1bWUgdGhlc2Ugd2VyZSBtZWFudCB0byBiZSBjb25zdHJ1Y3RvcnM6CisgICAgICAgIC8vICAgQyhYKSAgIDogICAgKHRoZSBuYW1lIG9mIGEgYml0LWZpZWxkIGNhbm5vdCBiZSBwYXJlbnRoZXNpemVkKS4KKyAgICAgICAgLy8gICBDKFgpICAgdHJ5ICAodGhpcyBpcyBvdGhlcndpc2UgaWxsLWZvcm1lZCkuCisgICAgICAgIElzQ29uc3RydWN0b3IgPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKE5leHRUb2tlbigpLmlzKHRvazo6c2VtaSkgfHwgTmV4dFRva2VuKCkuaXModG9rOjpsX2JyYWNlKSkgeworICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgY29uc3RydWN0b3IgbmFtZSB3aXRoaW4gdGhlIGNsYXNzIGRlZmluaXRpb24sCisgICAgICAgIC8vIGFzc3VtZSB0aGVzZSB3ZXJlIG1lYW50IHRvIGJlIGNvbnN0cnVjdG9yczoKKyAgICAgICAgLy8gICBDKFgpICAgeworICAgICAgICAvLyAgIEMoWCkgICA7CisgICAgICAgIC8vIC4uLiBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b3VsZCBiZSBkZWNsYXJpbmcgYSBub24tc3RhdGljIGRhdGEKKyAgICAgICAgLy8gbWVtYmVyIHRoYXQgaXMgaWxsLWZvcm1lZCBiZWNhdXNlIGl0J3Mgb2YgdGhlIHNhbWUgdHlwZSBhcyBpdHMKKyAgICAgICAgLy8gc3Vycm91bmRpbmcgY2xhc3MuCisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FOiBXZSBjYW4gYWN0dWFsbHkgZG8gdGhpcyB3aGV0aGVyIG9yIG5vdCB0aGUgbmFtZSBpcyBxdWFsaWZpZWQsCisgICAgICAgIC8vIGJlY2F1c2UgaWYgaXQgaXMgcXVhbGlmaWVkIGluIHRoaXMgY29udGV4dCBpdCBtdXN0IGJlIGJlaW5nIHVzZWQgYXMKKyAgICAgICAgLy8gYSBjb25zdHJ1Y3RvciBuYW1lLiBIb3dldmVyLCB3ZSBkbyBub3QgaW1wbGVtZW50IHRoYXQgcnVsZSBjb3JyZWN0bHkKKyAgICAgICAgLy8gY3VycmVudGx5LCBzbyB3ZSdyZSBzb21ld2hhdCBjb25zZXJ2YXRpdmUgaGVyZS4KKyAgICAgICAgSXNDb25zdHJ1Y3RvciA9IElzVW5xdWFsaWZpZWQ7CisgICAgICB9CisgICAgICBicmVhazsKKwogICAgIGRlZmF1bHQ6CiAgICAgICBJc0NvbnN0cnVjdG9yID0gdHJ1ZTsKICAgICAgIGJyZWFrOwpAQCAtNDQ1NSw5ICs0Mzc5LDYgQEAKICAgICAgIGJyZWFrOwogCiAgICAgLy8gT3BlbkNMIHF1YWxpZmllcnM6Ci0gICAgY2FzZSB0b2s6Omt3X3ByaXZhdGU6Ci0gICAgICBpZiAoIWdldExhbmdPcHRzKCkuT3BlbkNMKQotICAgICAgICBnb3RvIERvbmVXaXRoVHlwZVF1YWxzOwogICAgIGNhc2UgdG9rOjprd19fX3ByaXZhdGU6CiAgICAgY2FzZSB0b2s6Omt3X19fZ2xvYmFsOgogICAgIGNhc2UgdG9rOjprd19fX2xvY2FsOgpAQCAtNDQ2NSw3ICs0Mzg2LDcgQEAKICAgICBjYXNlIHRvazo6a3dfX19yZWFkX29ubHk6CiAgICAgY2FzZSB0b2s6Omt3X19fd3JpdGVfb25seToKICAgICBjYXNlIHRvazo6a3dfX19yZWFkX3dyaXRlOgotICAgICAgUGFyc2VPcGVuQ0xRdWFsaWZpZXJzKERTKTsKKyAgICAgIFBhcnNlT3BlbkNMUXVhbGlmaWVycyhEUy5nZXRBdHRyaWJ1dGVzKCkpOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIHRvazo6a3dfX191cHRyOgpAQCAtNDUwNiw3ICs0NDI3LDcgQEAKICAgICAgIERvbmVXaXRoVHlwZVF1YWxzOgogICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSB0eXBlLXF1YWxpZmllciB0b2tlbiwgd2UncmUgZG9uZSByZWFkaW5nIHR5cGUKICAgICAgIC8vIHF1YWxpZmllcnMuICBGaXJzdCB2ZXJpZnkgdGhhdCBEZWNsU3BlYydzIGFyZSBjb25zaXN0ZW50LgotICAgICAgRFMuRmluaXNoKERpYWdzLCBQUCk7CisgICAgICBEUy5GaW5pc2goRGlhZ3MsIFBQLCBBY3Rpb25zLmdldEFTVENvbnRleHQoKS5nZXRQcmludGluZ1BvbGljeSgpKTsKICAgICAgIGlmIChFbmRMb2MuaXNWYWxpZCgpKQogICAgICAgICBEUy5TZXRSYW5nZUVuZChFbmRMb2MpOwogICAgICAgcmV0dXJuOwpAQCAtNDkxNCw3ICs0ODM1LDcgQEAKICAgICAgICAgICAgICAgPDwgZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXM7CiAgICAgICB9CiAgICAgfSBlbHNlCi0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50X2xwYXJlbik7CisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2VpdGhlcikgPDwgdG9rOjppZGVudGlmaWVyIDw8IHRvazo6bF9wYXJlbjsKICAgICBELlNldElkZW50aWZpZXIoMCwgVG9rLmdldExvY2F0aW9uKCkpOwogICAgIEQuc2V0SW52YWxpZFR5cGUodHJ1ZSk7CiAgIH0KQEAgLTUxMjIsNyArNTA0Myw2IEBACiAgIFBhcnNlZEF0dHJpYnV0ZXMgRm5BdHRycyhBdHRyRmFjdG9yeSk7CiAgIFR5cGVSZXN1bHQgVHJhaWxpbmdSZXR1cm5UeXBlOwogCi0gIEFjdGlvbnMuQWN0T25TdGFydEZ1bmN0aW9uRGVjbGFyYXRvcigpOwogICAvKiBMb2NhbEVuZExvYyBpcyB0aGUgZW5kIGxvY2F0aW9uIGZvciB0aGUgbG9jYWwgRnVuY3Rpb25UeXBlTG9jLgogICAgICBFbmRMb2MgaXMgdGhlIGVuZCBsb2NhdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0b3IuCiAgICAgIFRoZXkgZGlmZmVyIGZvciB0cmFpbGluZyByZXR1cm4gdHlwZXMuICovCkBAIC01MTkxLDYgKzUxMTEsNyBAQAogICAgICAgLy8gRklYTUU6IGN1cnJlbnRseSwgInN0YXRpYyIgY2FzZSBpc24ndCBoYW5kbGVkIGNvcnJlY3RseS4KICAgICAgIGJvb2wgSXNDWFgxMU1lbWJlckZ1bmN0aW9uID0KICAgICAgICAgZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMSAmJgorICAgICAgICBELmdldERlY2xTcGVjKCkuZ2V0U3RvcmFnZUNsYXNzU3BlYygpICE9IERlY2xTcGVjOjpTQ1NfdHlwZWRlZiAmJgogICAgICAgICAoRC5nZXRDb250ZXh0KCkgPT0gRGVjbGFyYXRvcjo6TWVtYmVyQ29udGV4dAogICAgICAgICAgPyAhRC5nZXREZWNsU3BlYygpLmlzRnJpZW5kU3BlY2lmaWVkKCkKICAgICAgICAgIDogRC5nZXRDb250ZXh0KCkgPT0gRGVjbGFyYXRvcjo6RmlsZUNvbnRleHQgJiYKQEAgLTUyNTAsOCArNTE3MSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydExvYywgTG9jYWxFbmRMb2MsIEQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpbGluZ1JldHVyblR5cGUpLAogICAgICAgICAgICAgICAgIEZuQXR0cnMsIEVuZExvYyk7Ci0KLSAgQWN0aW9ucy5BY3RPbkVuZEZ1bmN0aW9uRGVjbGFyYXRvcigpOwogfQogCiAvLy8gaXNGdW5jdGlvbkRlY2xhcmF0b3JJZGVudGlmaWVyTGlzdCAtIFRoaXMgcGFyYW1ldGVyIGxpc3QgbWF5IGhhdmUgYW4KQEAgLTUzMDMsMTAgKzUyMjIsMTAgQEAKICAgLy8gTWFpbnRhaW4gYW4gZWZmaWNpZW50IGxvb2t1cCBvZiBwYXJhbXMgd2UgaGF2ZSBzZWVuIHNvIGZhci4KICAgbGx2bTo6U21hbGxTZXQ8Y29uc3QgSWRlbnRpZmllckluZm8qLCAxNj4gUGFyYW1zU29GYXI7CiAKLSAgd2hpbGUgKDEpIHsKKyAgZG8gewogICAgIC8vIElmIHRoaXMgaXNuJ3QgYW4gaWRlbnRpZmllciwgcmVwb3J0IHRoZSBlcnJvciBhbmQgc2tpcCB1bnRpbCAnKScuCiAgICAgaWYgKFRvay5pc05vdCh0b2s6OmlkZW50aWZpZXIpKSB7Ci0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KTsKKyAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6aWRlbnRpZmllcjsKICAgICAgIFNraXBVbnRpbCh0b2s6OnJfcGFyZW4sIFN0b3BBdFNlbWkgfCBTdG9wQmVmb3JlTWF0Y2gpOwogICAgICAgLy8gRm9yZ2V0IHdlIHBhcnNlZCBhbnl0aGluZy4KICAgICAgIFBhcmFtSW5mby5jbGVhcigpOwpAQCAtNTMzMSwxMiArNTI1MCw4IEBACiAKICAgICAvLyBFYXQgdGhlIGlkZW50aWZpZXIuCiAgICAgQ29uc3VtZVRva2VuKCk7Ci0KICAgICAvLyBUaGUgbGlzdCBjb250aW51ZXMgaWYgd2Ugc2VlIGEgY29tbWEuCi0gICAgaWYgKFRvay5pc05vdCh0b2s6OmNvbW1hKSkKLSAgICAgIGJyZWFrOwotICAgIENvbnN1bWVUb2tlbigpOwotICB9CisgIH0gd2hpbGUgKFRyeUNvbnN1bWVUb2tlbih0b2s6OmNvbW1hKSk7CiB9CiAKIC8vLyBQYXJzZVBhcmFtZXRlckRlY2xhcmF0aW9uQ2xhdXNlIC0gUGFyc2UgYSAocG9zc2libHkgZW1wdHkpIHBhcmFtZXRlci1saXN0CkBAIC01Mzc1LDEzICs1MjkwLDExIEBACiAgICAgICAgUGFyc2VkQXR0cmlidXRlcyAmRmlyc3RBcmdBdHRycywKICAgICAgICBTbWFsbFZlY3RvckltcGw8RGVjbGFyYXRvckNodW5rOjpQYXJhbUluZm8+ICZQYXJhbUluZm8sCiAgICAgICAgU291cmNlTG9jYXRpb24gJkVsbGlwc2lzTG9jKSB7Ci0gIHdoaWxlICgxKSB7Ci0gICAgaWYgKFRvay5pcyh0b2s6OmVsbGlwc2lzKSkgewotICAgICAgLy8gRklYTUU6IElzc3VlIGEgZGlhZ25vc3RpYyBpZiB3ZSBwYXJzZWQgYW4gYXR0cmlidXRlLXNwZWNpZmllci1zZXEKLSAgICAgIC8vIGJlZm9yZSBkZWNpZGluZyB0aGlzIHdhcyBhIHBhcmFtZXRlci1kZWNsYXJhdGlvbi1jbGF1c2UuCi0gICAgICBFbGxpcHNpc0xvYyA9IENvbnN1bWVUb2tlbigpOyAgICAgLy8gQ29uc3VtZSB0aGUgZWxsaXBzaXMuCisgIGRvIHsKKyAgICAvLyBGSVhNRTogSXNzdWUgYSBkaWFnbm9zdGljIGlmIHdlIHBhcnNlZCBhbiBhdHRyaWJ1dGUtc3BlY2lmaWVyLXNlcQorICAgIC8vIGJlZm9yZSBkZWNpZGluZyB0aGlzIHdhcyBhIHBhcmFtZXRlci1kZWNsYXJhdGlvbi1jbGF1c2UuCisgICAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OmVsbGlwc2lzLCBFbGxpcHNpc0xvYykpCiAgICAgICBicmVhazsKLSAgICB9CiAKICAgICAvLyBQYXJzZSB0aGUgZGVjbGFyYXRpb24tc3BlY2lmaWVycy4KICAgICAvLyBKdXN0IHVzZSB0aGUgUGFyc2luZ0RlY2xhcmF0aW9uICJzY29wZSIgb2YgdGhlIGRlY2xhcmF0b3IuCkBAIC01NTAwLDI2ICs1NDEzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbSwgRGVmQXJnVG9rcykpOwogICAgIH0KIAotICAgIC8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgY29tbWEsIGNvbnN1bWUgaXQgYW5kIGtlZXAgcmVhZGluZyBhcmd1bWVudHMuCi0gICAgaWYgKFRvay5pc05vdCh0b2s6OmNvbW1hKSkgewotICAgICAgaWYgKFRvay5pcyh0b2s6OmVsbGlwc2lzKSkgewotICAgICAgICBFbGxpcHNpc0xvYyA9IENvbnN1bWVUb2tlbigpOyAgICAgLy8gQ29uc3VtZSB0aGUgZWxsaXBzaXMuCi0KLSAgICAgICAgaWYgKCFnZXRMYW5nT3B0cygpLkNQbHVzUGx1cykgewotICAgICAgICAgIC8vIFdlIGhhdmUgZWxsaXBzaXMgd2l0aG91dCBhIHByZWNlZGluZyAnLCcsIHdoaWNoIGlzIGlsbC1mb3JtZWQKLSAgICAgICAgICAvLyBpbiBDLiBDb21wbGFpbiBhbmQgcHJvdmlkZSB0aGUgZml4LgotICAgICAgICAgIERpYWcoRWxsaXBzaXNMb2MsIGRpYWc6OmVycl9taXNzaW5nX2NvbW1hX2JlZm9yZV9lbGxpcHNpcykKLSAgICAgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKEVsbGlwc2lzTG9jLCAiLCAiKTsKLSAgICAgICAgfQotICAgICAgfQotCisgICAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OmVsbGlwc2lzLCBFbGxpcHNpc0xvYykgJiYKKyAgICAgICAgIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKSB7CisgICAgICAvLyBXZSBoYXZlIGVsbGlwc2lzIHdpdGhvdXQgYSBwcmVjZWRpbmcgJywnLCB3aGljaCBpcyBpbGwtZm9ybWVkCisgICAgICAvLyBpbiBDLiBDb21wbGFpbiBhbmQgcHJvdmlkZSB0aGUgZml4LgorICAgICAgRGlhZyhFbGxpcHNpc0xvYywgZGlhZzo6ZXJyX21pc3NpbmdfY29tbWFfYmVmb3JlX2VsbGlwc2lzKQorICAgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKEVsbGlwc2lzTG9jLCAiLCAiKTsKICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8vIENvbnN1bWUgdGhlIGNvbW1hLgotICAgIENvbnN1bWVUb2tlbigpOwotICB9Ci0KKyAgICAvLyBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGNvbW1hLCBjb25zdW1lIGl0IGFuZCBrZWVwIHJlYWRpbmcgYXJndW1lbnRzLgorICB9IHdoaWxlIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpOwogfQogCiAvLy8gW0M5MF0gICBkaXJlY3QtZGVjbGFyYXRvciAnWycgY29uc3RhbnQtZXhwcmVzc2lvbltvcHRdICddJwpAQCAtNTU0NCw3ICs1NDQ4LDYgQEAKICAgICBNYXliZVBhcnNlQ1hYMTFBdHRyaWJ1dGVzKGF0dHJzKTsKIAogICAgIC8vIFJlbWVtYmVyIHRoYXQgd2UgcGFyc2VkIHRoZSBlbXB0eSBhcnJheSB0eXBlLgotICAgIEV4cHJSZXN1bHQgTnVtRWxlbWVudHM7CiAgICAgRC5BZGRUeXBlSW5mbyhEZWNsYXJhdG9yQ2h1bms6OmdldEFycmF5KDAsIGZhbHNlLCBmYWxzZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5nZXRPcGVuTG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5nZXRDbG9zZUxvY2F0aW9uKCkpLApAQCAtNTU3MSw4ICs1NDc0LDcgQEAKIAogICAvLyBJZiB2YWxpZCwgdGhpcyBsb2NhdGlvbiBpcyB0aGUgcG9zaXRpb24gd2hlcmUgd2UgcmVhZCB0aGUgJ3N0YXRpYycga2V5d29yZC4KICAgU291cmNlTG9jYXRpb24gU3RhdGljTG9jOwotICBpZiAoVG9rLmlzKHRvazo6a3dfc3RhdGljKSkKLSAgICBTdGF0aWNMb2MgPSBDb25zdW1lVG9rZW4oKTsKKyAgVHJ5Q29uc3VtZVRva2VuKHRvazo6a3dfc3RhdGljLCBTdGF0aWNMb2MpOwogCiAgIC8vIElmIHRoZXJlIGlzIGEgdHlwZS1xdWFsaWZpZXItbGlzdCwgcmVhZCBpdCBub3cuCiAgIC8vIFR5cGUgcXVhbGlmaWVycyBpbiBhbiBhcnJheSBzdWJzY3JpcHQgYXJlIGEgQzk5IGZlYXR1cmUuCkBAIC01NTgxLDggKzU0ODMsOCBAQAogCiAgIC8vIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSByZWFkICdzdGF0aWMnLCBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgb25lIGFmdGVyIHRoZQogICAvLyB0eXBlLXF1YWxpZmllci1saXN0LgotICBpZiAoIVN0YXRpY0xvYy5pc1ZhbGlkKCkgJiYgVG9rLmlzKHRvazo6a3dfc3RhdGljKSkKLSAgICBTdGF0aWNMb2MgPSBDb25zdW1lVG9rZW4oKTsKKyAgaWYgKCFTdGF0aWNMb2MuaXNWYWxpZCgpKQorICAgIFRyeUNvbnN1bWVUb2tlbih0b2s6Omt3X3N0YXRpYywgU3RhdGljTG9jKTsKIAogICAvLyBIYW5kbGUgImRpcmVjdC1kZWNsYXJhdG9yIFsgdHlwZS1xdWFsLWxpc3Rbb3B0XSAqIF0iLgogICBib29sIGlzU3RhciA9IGZhbHNlOwpAQCAtNTY3OCw3ICs1NTgwLDggQEAKICAgICB1bnNpZ25lZCBEaWFnSUQ7CiAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSB0eXBlIHNwZWNpZmllcnMgKGUuZy4gImludCB0eXBlb2YoaW50KSIpLgogICAgIGlmIChEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF90eXBlb2ZUeXBlLCBTdGFydExvYywgUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIENhc3RUeSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIENhc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbnMuZ2V0QVNUQ29udGV4dCgpLmdldFByaW50aW5nUG9saWN5KCkpKQogICAgICAgRGlhZyhTdGFydExvYywgRGlhZ0lEKSA8PCBQcmV2U3BlYzsKICAgICByZXR1cm47CiAgIH0KQEAgLTU3MDAsNyArNTYwMyw4IEBACiAgIHVuc2lnbmVkIERpYWdJRDsKICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSB0eXBlIHNwZWNpZmllcnMgKGUuZy4gImludCB0eXBlb2YoaW50KSIpLgogICBpZiAoRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfdHlwZW9mRXhwciwgU3RhcnRMb2MsIFByZXZTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCwgT3BlcmFuZC5nZXQoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBPcGVyYW5kLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbnMuZ2V0QVNUQ29udGV4dCgpLmdldFByaW50aW5nUG9saWN5KCkpKQogICAgIERpYWcoU3RhcnRMb2MsIERpYWdJRCkgPDwgUHJldlNwZWM7CiB9CiAKQEAgLTU3MzQsNyArNTYzOCw4IEBACiAgIGNvbnN0IGNoYXIgKlByZXZTcGVjID0gMDsKICAgdW5zaWduZWQgRGlhZ0lEOwogICBpZiAoRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfYXRvbWljLCBTdGFydExvYywgUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBSZXN1bHQucmVsZWFzZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFJlc3VsdC5yZWxlYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9ucy5nZXRBU1RDb250ZXh0KCkuZ2V0UHJpbnRpbmdQb2xpY3koKSkpCiAgICAgRGlhZyhTdGFydExvYywgRGlhZ0lEKSA8PCBQcmV2U3BlYzsKIH0KIApAQCAtNTc3NCw2ICs1Njc5LDcgQEAKIGJvb2wgUGFyc2VyOjpUcnlBbHRpVmVjVG9rZW5PdXRPZkxpbmUoRGVjbFNwZWMgJkRTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywgdW5zaWduZWQgJkRpYWdJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNJbnZhbGlkKSB7CisgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kgPSBBY3Rpb25zLmdldEFTVENvbnRleHQoKS5nZXRQcmludGluZ1BvbGljeSgpOwogICBpZiAoVG9rLmdldElkZW50aWZpZXJJbmZvKCkgPT0gSWRlbnRfdmVjdG9yKSB7CiAgICAgVG9rZW4gTmV4dCA9IE5leHRUb2tlbigpOwogICAgIHN3aXRjaCAoTmV4dC5nZXRLaW5kKCkpIHsKQEAgLTU3ODgsMTUgKzU2OTQsMTUgQEAKICAgICBjYXNlIHRvazo6a3dfZG91YmxlOgogICAgIGNhc2UgdG9rOjprd19ib29sOgogICAgIGNhc2UgdG9rOjprd19fX3BpeGVsOgotICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZUFsdGlWZWNWZWN0b3IodHJ1ZSwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICAgIGlzSW52YWxpZCA9IERTLlNldFR5cGVBbHRpVmVjVmVjdG9yKHRydWUsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIGNhc2UgdG9rOjppZGVudGlmaWVyOgogICAgICAgaWYgKE5leHQuZ2V0SWRlbnRpZmllckluZm8oKSA9PSBJZGVudF9waXhlbCkgewotICAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlQWx0aVZlY1ZlY3Rvcih0cnVlLCBMb2MsIFByZXZTcGVjLCBEaWFnSUQpOworICAgICAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlQWx0aVZlY1ZlY3Rvcih0cnVlLCBMb2MsIFByZXZTcGVjLCBEaWFnSUQsUG9saWN5KTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAgICAgICBpZiAoTmV4dC5nZXRJZGVudGlmaWVySW5mbygpID09IElkZW50X2Jvb2wpIHsKLSAgICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZUFsdGlWZWNWZWN0b3IodHJ1ZSwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICAgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZUFsdGlWZWNWZWN0b3IodHJ1ZSwgTG9jLCBQcmV2U3BlYywgRGlhZ0lELFBvbGljeSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQogICAgICAgYnJlYWs7CkBAIC01ODA1LDExICs1NzExLDExIEBACiAgICAgfQogICB9IGVsc2UgaWYgKChUb2suZ2V0SWRlbnRpZmllckluZm8oKSA9PSBJZGVudF9waXhlbCkgJiYKICAgICAgICAgICAgICBEUy5pc1R5cGVBbHRpVmVjVmVjdG9yKCkpIHsKLSAgICBpc0ludmFsaWQgPSBEUy5TZXRUeXBlQWx0aVZlY1BpeGVsKHRydWUsIExvYywgUHJldlNwZWMsIERpYWdJRCk7CisgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZUFsdGlWZWNQaXhlbCh0cnVlLCBMb2MsIFByZXZTcGVjLCBEaWFnSUQsIFBvbGljeSk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0gZWxzZSBpZiAoKFRvay5nZXRJZGVudGlmaWVySW5mbygpID09IElkZW50X2Jvb2wpICYmCiAgICAgICAgICAgICAgRFMuaXNUeXBlQWx0aVZlY1ZlY3RvcigpKSB7Ci0gICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZUFsdGlWZWNCb29sKHRydWUsIExvYywgUHJldlNwZWMsIERpYWdJRCk7CisgICAgaXNJbnZhbGlkID0gRFMuU2V0VHlwZUFsdGlWZWNCb29sKHRydWUsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9saWIvUGFyc2UvUGFyc2VEZWNsQ1hYLmNwcCBiL2xpYi9QYXJzZS9QYXJzZURlY2xDWFguY3BwCmluZGV4IGRkMjlmOTkuLmNlZjc0OGYgMTAwNjQ0Ci0tLSBhL2xpYi9QYXJzZS9QYXJzZURlY2xDWFguY3BwCisrKyBiL2xpYi9QYXJzZS9QYXJzZURlY2xDWFguY3BwCkBAIC0xMyw5ICsxMywxMiBAQAogCiAjaW5jbHVkZSAiY2xhbmcvUGFyc2UvUGFyc2VyLmgiCiAjaW5jbHVkZSAiUkFJSU9iamVjdHNGb3JQYXJzZXIuaCIKLSNpbmNsdWRlICJjbGFuZy9CYXNpYy9DaGFySW5mby5oIgotI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZXJhdG9yS2luZHMuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsVGVtcGxhdGUuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvQ2hhckluZm8uaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3BlcmF0b3JLaW5kcy5oIgogI2luY2x1ZGUgImNsYW5nL1BhcnNlL1BhcnNlRGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvRGVjbFNwZWMuaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL1BhcnNlZFRlbXBsYXRlLmgiCkBAIC05MSw3ICs5NCw3IEBACiAKICAgaWYgKFRvay5pcyh0b2s6OmVxdWFsKSkgewogICAgIGlmIChJZGVudCA9PSAwKSB7Ci0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KTsKKyAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6aWRlbnRpZmllcjsKICAgICAgIC8vIFNraXAgdG8gZW5kIG9mIHRoZSBkZWZpbml0aW9uIGFuZCBlYXQgdGhlICc7Jy4KICAgICAgIFNraXBVbnRpbCh0b2s6OnNlbWkpOwogICAgICAgcmV0dXJuIDA7CkBAIC0xMTEsOCArMTE0LDEyIEBACiAgICAgICBEaWFnKEV4dHJhTmFtZXNwYWNlTG9jWzBdLCBkaWFnOjplcnJfbmVzdGVkX25hbWVzcGFjZXNfd2l0aF9kb3VibGVfY29sb24pCiAgICAgICAgICAgPDwgU291cmNlUmFuZ2UoRXh0cmFOYW1lc3BhY2VMb2MuZnJvbnQoKSwgRXh0cmFJZGVudExvYy5iYWNrKCkpOwogICAgIH0KLSAgICBEaWFnKFRvaywgSWRlbnQgPyBkaWFnOjplcnJfZXhwZWN0ZWRfbGJyYWNlIDoKLSAgICAgICAgIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudF9sYnJhY2UpOworCisgICAgaWYgKElkZW50KQorICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjpsX2JyYWNlOworICAgIGVsc2UKKyAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfZWl0aGVyKSA8PCB0b2s6OmlkZW50aWZpZXIgPDwgdG9rOjpsX2JyYWNlOworCiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTk1LDcgKzIwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRBdHRyaWJ1dGVzJiBhdHRycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbGFuY2VkRGVsaW1pdGVyVHJhY2tlciAmVHJhY2tlcikgewogICBpZiAoaW5kZXggPT0gSWRlbnQuc2l6ZSgpKSB7Ci0gICAgd2hpbGUgKFRvay5pc05vdCh0b2s6OnJfYnJhY2UpICYmIFRvay5pc05vdCh0b2s6OmVvZikpIHsKKyAgICB3aGlsZSAoVG9rLmlzTm90KHRvazo6cl9icmFjZSkgJiYgIWlzRW9mT3JFb20oKSkgewogICAgICAgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSBhdHRycyhBdHRyRmFjdG9yeSk7CiAgICAgICBNYXliZVBhcnNlQ1hYMTFBdHRyaWJ1dGVzKGF0dHJzKTsKICAgICAgIE1heWJlUGFyc2VNaWNyb3NvZnRBdHRyaWJ1dGVzKGF0dHJzKTsKQEAgLTI1OSw4ICsyNjYsOCBAQAogCiAgIC8vIEVhdCB0aGUgJzsnLgogICBEZWNsRW5kID0gVG9rLmdldExvY2F0aW9uKCk7Ci0gIEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLCBkaWFnOjplcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9uYW1lc3BhY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAiIiwgdG9rOjpzZW1pKTsKKyAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLCBkaWFnOjplcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9uYW1lc3BhY2VfbmFtZSkpCisgICAgU2tpcFVudGlsKHRvazo6c2VtaSk7CiAKICAgcmV0dXJuIEFjdGlvbnMuQWN0T25OYW1lc3BhY2VBbGlhc0RlZihnZXRDdXJTY29wZSgpLCBOYW1lc3BhY2VMb2MsIEFsaWFzTG9jLCBBbGlhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUywgSWRlbnRMb2MsIElkZW50KTsKQEAgLTI3NCwyNyArMjgxLDE2IEBACiAvLy8gICAgICAgICAnZXh0ZXJuJyBzdHJpbmctbGl0ZXJhbCBkZWNsYXJhdGlvbgogLy8vCiBEZWNsICpQYXJzZXI6OlBhcnNlTGlua2FnZShQYXJzaW5nRGVjbFNwZWMgJkRTLCB1bnNpZ25lZCBDb250ZXh0KSB7Ci0gIGFzc2VydChUb2suaXModG9rOjpzdHJpbmdfbGl0ZXJhbCkgJiYgIk5vdCBhIHN0cmluZyBsaXRlcmFsISIpOwotICBTbWFsbFN0cmluZzw4PiBMYW5nQnVmZmVyOwotICBib29sIEludmFsaWQgPSBmYWxzZTsKLSAgU3RyaW5nUmVmIExhbmcgPSBQUC5nZXRTcGVsbGluZyhUb2ssIExhbmdCdWZmZXIsICZJbnZhbGlkKTsKLSAgaWYgKEludmFsaWQpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLy8gRklYTUU6IFRoaXMgaXMgaW5jb3JyZWN0OiBsaW5rYWdlLXNwZWNpZmllcnMgYXJlIHBhcnNlZCBpbiB0cmFuc2xhdGlvbgotICAvLyBwaGFzZSA3LCBzbyBzdHJpbmctbGl0ZXJhbCBjb25jYXRlbmF0aW9uIGlzIHN1cHBvc2VkIHRvIG9jY3VyLgotICAvLyAgIGV4dGVybiAiIiAiQyIgIiIgIisiICIrIiB7IH0gaXMgbGVnYWwuCi0gIGlmIChUb2suaGFzVURTdWZmaXgoKSkKLSAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2ludmFsaWRfc3RyaW5nX3VkbCk7Ci0gIFNvdXJjZUxvY2F0aW9uIExvYyA9IENvbnN1bWVTdHJpbmdUb2tlbigpOworICBhc3NlcnQoaXNUb2tlblN0cmluZ0xpdGVyYWwoKSAmJiAiTm90IGEgc3RyaW5nIGxpdGVyYWwhIik7CisgIEV4cHJSZXN1bHQgTGFuZyA9IFBhcnNlU3RyaW5nTGl0ZXJhbEV4cHJlc3Npb24oZmFsc2UpOwogCiAgIFBhcnNlU2NvcGUgTGlua2FnZVNjb3BlKHRoaXMsIFNjb3BlOjpEZWNsU2NvcGUpOwotICBEZWNsICpMaW5rYWdlU3BlYwotICAgID0gQWN0aW9ucy5BY3RPblN0YXJ0TGlua2FnZVNwZWNpZmljYXRpb24oZ2V0Q3VyU2NvcGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTLmdldFNvdXJjZVJhbmdlKCkuZ2V0QmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYywgTGFuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rLmlzKHRvazo6bF9icmFjZSkgPyBUb2suZ2V0TG9jYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNvdXJjZUxvY2F0aW9uKCkpOworICBEZWNsICpMaW5rYWdlU3BlYyA9CisgICAgICBMYW5nLmlzSW52YWxpZCgpCisgICAgICAgICAgPyAwCisgICAgICAgICAgOiBBY3Rpb25zLkFjdE9uU3RhcnRMaW5rYWdlU3BlY2lmaWNhdGlvbigKKyAgICAgICAgICAgICAgICBnZXRDdXJTY29wZSgpLCBEUy5nZXRTb3VyY2VSYW5nZSgpLmdldEJlZ2luKCksIExhbmcudGFrZSgpLAorICAgICAgICAgICAgICAgIFRvay5pcyh0b2s6OmxfYnJhY2UpID8gVG9rLmdldExvY2F0aW9uKCkgOiBTb3VyY2VMb2NhdGlvbigpKTsKIAogICBQYXJzZWRBdHRyaWJ1dGVzV2l0aFJhbmdlIGF0dHJzKEF0dHJGYWN0b3J5KTsKICAgTWF5YmVQYXJzZUNYWDExQXR0cmlidXRlcyhhdHRycyk7CkBAIC0zMDgsOCArMzA0LDkgQEAKICAgICAvLyAuLi4gYnV0IGFueXdheSByZW1lbWJlciB0aGF0IHN1Y2ggYW4gImV4dGVybiIgd2FzIHNlZW4uCiAgICAgRFMuc2V0RXh0ZXJuSW5MaW5rYWdlU3BlYyh0cnVlKTsKICAgICBQYXJzZUV4dGVybmFsRGVjbGFyYXRpb24oYXR0cnMsICZEUyk7Ci0gICAgcmV0dXJuIEFjdGlvbnMuQWN0T25GaW5pc2hMaW5rYWdlU3BlY2lmaWNhdGlvbihnZXRDdXJTY29wZSgpLCBMaW5rYWdlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCkpOworICAgIHJldHVybiBMaW5rYWdlU3BlYyA/IEFjdGlvbnMuQWN0T25GaW5pc2hMaW5rYWdlU3BlY2lmaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q3VyU2NvcGUoKSwgTGlua2FnZVNwZWMsIFNvdXJjZUxvY2F0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgIDogMDsKICAgfQogCiAgIERTLmFib3J0KCk7CkBAIC0zMTgsMTYgKzMxNSw0OCBAQAogCiAgIEJhbGFuY2VkRGVsaW1pdGVyVHJhY2tlciBUKCp0aGlzLCB0b2s6OmxfYnJhY2UpOwogICBULmNvbnN1bWVPcGVuKCk7Ci0gIHdoaWxlIChUb2suaXNOb3QodG9rOjpyX2JyYWNlKSAmJiBUb2suaXNOb3QodG9rOjplb2YpKSB7Ci0gICAgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSBhdHRycyhBdHRyRmFjdG9yeSk7Ci0gICAgTWF5YmVQYXJzZUNYWDExQXR0cmlidXRlcyhhdHRycyk7Ci0gICAgTWF5YmVQYXJzZU1pY3Jvc29mdEF0dHJpYnV0ZXMoYXR0cnMpOwotICAgIFBhcnNlRXh0ZXJuYWxEZWNsYXJhdGlvbihhdHRycyk7CisKKyAgdW5zaWduZWQgTmVzdGVkTW9kdWxlcyA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgc3dpdGNoIChUb2suZ2V0S2luZCgpKSB7CisgICAgY2FzZSB0b2s6OmFubm90X21vZHVsZV9iZWdpbjoKKyAgICAgICsrTmVzdGVkTW9kdWxlczsKKyAgICAgIFBhcnNlVG9wTGV2ZWxEZWNsKCk7CisgICAgICBjb250aW51ZTsKKworICAgIGNhc2UgdG9rOjphbm5vdF9tb2R1bGVfZW5kOgorICAgICAgaWYgKCFOZXN0ZWRNb2R1bGVzKQorICAgICAgICBicmVhazsKKyAgICAgIC0tTmVzdGVkTW9kdWxlczsKKyAgICAgIFBhcnNlVG9wTGV2ZWxEZWNsKCk7CisgICAgICBjb250aW51ZTsKKworICAgIGNhc2UgdG9rOjphbm5vdF9tb2R1bGVfaW5jbHVkZToKKyAgICAgIFBhcnNlVG9wTGV2ZWxEZWNsKCk7CisgICAgICBjb250aW51ZTsKKworICAgIGNhc2UgdG9rOjplb2Y6CisgICAgICBicmVhazsKKworICAgIGNhc2UgdG9rOjpyX2JyYWNlOgorICAgICAgaWYgKCFOZXN0ZWRNb2R1bGVzKQorICAgICAgICBicmVhazsKKyAgICAgIC8vIEZhbGwgdGhyb3VnaC4KKyAgICBkZWZhdWx0OgorICAgICAgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSBhdHRycyhBdHRyRmFjdG9yeSk7CisgICAgICBNYXliZVBhcnNlQ1hYMTFBdHRyaWJ1dGVzKGF0dHJzKTsKKyAgICAgIE1heWJlUGFyc2VNaWNyb3NvZnRBdHRyaWJ1dGVzKGF0dHJzKTsKKyAgICAgIFBhcnNlRXh0ZXJuYWxEZWNsYXJhdGlvbihhdHRycyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBicmVhazsKICAgfQogCiAgIFQuY29uc3VtZUNsb3NlKCk7Ci0gIHJldHVybiBBY3Rpb25zLkFjdE9uRmluaXNoTGlua2FnZVNwZWNpZmljYXRpb24oZ2V0Q3VyU2NvcGUoKSwgTGlua2FnZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5nZXRDbG9zZUxvY2F0aW9uKCkpOworICByZXR1cm4gTGlua2FnZVNwZWMgPyBBY3Rpb25zLkFjdE9uRmluaXNoTGlua2FnZVNwZWNpZmljYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDdXJTY29wZSgpLCBMaW5rYWdlU3BlYywgVC5nZXRDbG9zZUxvY2F0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICA6IDA7CiB9CiAKIC8vLyBQYXJzZVVzaW5nRGlyZWN0aXZlT3JEZWNsYXJhdGlvbiAtIFBhcnNlIEMrKyB1c2luZyB1c2luZy1kZWNsYXJhdGlvbiBvcgpAQCAtNDI0LDEwICs0NTMsMTAgQEAKIAogICAvLyBFYXQgJzsnLgogICBEZWNsRW5kID0gVG9rLmdldExvY2F0aW9uKCk7Ci0gIEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLAotICAgICAgICAgICAgICAgICAgIEdOVUF0dHIgPyBkaWFnOjplcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9hdHRyaWJ1dGVfbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjplcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9uYW1lc3BhY2VfbmFtZSwgCi0gICAgICAgICAgICAgICAgICAgIiIsIHRvazo6c2VtaSk7CisgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6c2VtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgR05VQXR0ciA/IGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2FmdGVyX2F0dHJpYnV0ZV9saXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjplcnJfZXhwZWN0ZWRfc2VtaV9hZnRlcl9uYW1lc3BhY2VfbmFtZSkpCisgICAgU2tpcFVudGlsKHRvazo6c2VtaSk7CiAKICAgcmV0dXJuIEFjdGlvbnMuQWN0T25Vc2luZ0RpcmVjdGl2ZShnZXRDdXJTY29wZSgpLCBVc2luZ0xvYywgTmFtZXNwY0xvYywgU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRMb2MsIE5hbWVzcGNOYW1lLCBhdHRycy5nZXRMaXN0KCkpOwpAQCAtNDYxLDEwICs0OTAsOCBAQAogCiAgIC8vIElnbm9yZSBvcHRpb25hbCAndHlwZW5hbWUnLgogICAvLyBGSVhNRTogVGhpcyBpcyB3cm9uZzsgd2Ugc2hvdWxkIHBhcnNlIHRoaXMgYXMgYSB0eXBlbmFtZS1zcGVjaWZpZXIuCi0gIGlmIChUb2suaXModG9rOjprd190eXBlbmFtZSkpIHsKLSAgICBUeXBlbmFtZUxvYyA9IENvbnN1bWVUb2tlbigpOworICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6a3dfdHlwZW5hbWUsIFR5cGVuYW1lTG9jKSkKICAgICBIYXNUeXBlbmFtZUtleXdvcmQgPSB0cnVlOwotICB9CiAKICAgLy8gUGFyc2UgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgogICBJZGVudGlmaWVySW5mbyAqTGFzdElJID0gMDsKQEAgLTU4NCwxMCArNjExLDExIEBACiAKICAgLy8gRWF0ICc7Jy4KICAgRGVjbEVuZCA9IFRvay5nZXRMb2NhdGlvbigpOwotICBFeHBlY3RBbmRDb25zdW1lKHRvazo6c2VtaSwgZGlhZzo6ZXJyX2V4cGVjdGVkX3NlbWlfYWZ0ZXIsCi0gICAgICAgICAgICAgICAgICAgIUF0dHJzLmVtcHR5KCkgPyAiYXR0cmlidXRlcyBsaXN0IiA6Ci0gICAgICAgICAgICAgICAgICAgSXNBbGlhc0RlY2wgPyAiYWxpYXMgZGVjbGFyYXRpb24iIDogInVzaW5nIGRlY2xhcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICB0b2s6OnNlbWkpOworICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIUF0dHJzLmVtcHR5KCkgPyAiYXR0cmlidXRlcyBsaXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IElzQWxpYXNEZWNsID8gImFsaWFzIGRlY2xhcmF0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInVzaW5nIGRlY2xhcmF0aW9uIikpCisgICAgU2tpcFVudGlsKHRvazo6c2VtaSk7CiAKICAgLy8gRGlhZ25vc2UgYW4gYXR0ZW1wdCB0byBkZWNsYXJlIGEgdGVtcGxhdGVkIHVzaW5nLWRlY2xhcmF0aW9uLgogICAvLyBJbiBDKysxMSwgYWxpYXMtZGVjbGFyYXRpb25zIGNhbiBiZSB0ZW1wbGF0ZXM6CkBAIC02NDksNyArNjc3LDcgQEAKIAogICBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIgVCgqdGhpcywgdG9rOjpsX3BhcmVuKTsKICAgaWYgKFQuY29uc3VtZU9wZW4oKSkgewotICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfbHBhcmVuKTsKKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfcGFyZW47CiAgICAgU2tpcE1hbGZvcm1lZERlY2woKTsKICAgICByZXR1cm4gMDsKICAgfQpAQCAtNjYwLDggKzY4OCwxMCBAQAogICAgIHJldHVybiAwOwogICB9CiAKLSAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbW1hLCAiIiwgdG9rOjpzZW1pKSkKKyAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSkpIHsKKyAgICBTa2lwVW50aWwodG9rOjpzZW1pKTsKICAgICByZXR1cm4gMDsKKyAgfQogCiAgIGlmICghaXNUb2tlblN0cmluZ0xpdGVyYWwoKSkgewogICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfc3RyaW5nX2xpdGVyYWwpCkBAIC03ODEsMTIgKzgxMSwxMyBAQAogCiAgIGNvbnN0IGNoYXIgKlByZXZTcGVjID0gMDsKICAgdW5zaWduZWQgRGlhZ0lEOworICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5ID0gQWN0aW9ucy5nZXRBU1RDb250ZXh0KCkuZ2V0UHJpbnRpbmdQb2xpY3koKTsKICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSB0eXBlIHNwZWNpZmllcnMgKGUuZy4gImludCBkZWNsdHlwZShhKSIpLgogICBpZiAoUmVzdWx0LmdldCgpCiAgICAgICAgID8gRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfZGVjbHR5cGUsIFN0YXJ0TG9jLCBQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBSZXN1bHQucmVsZWFzZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFJlc3VsdC5yZWxlYXNlKCksIFBvbGljeSkKICAgICAgICAgOiBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9kZWNsdHlwZV9hdXRvLCBTdGFydExvYywgUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBQb2xpY3kpKSB7CiAgICAgRGlhZyhTdGFydExvYywgRGlhZ0lEKSA8PCBQcmV2U3BlYzsKICAgICBEUy5TZXRUeXBlU3BlY0Vycm9yKCk7CiAgIH0KQEAgLTgzNyw3ICs4NjgsOCBAQAogICBjb25zdCBjaGFyICpQcmV2U3BlYyA9IDA7CiAgIHVuc2lnbmVkIERpYWdJRDsKICAgaWYgKERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX3VuZGVybHlpbmdUeXBlLCBTdGFydExvYywgUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ0lELCBSZXN1bHQucmVsZWFzZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnSUQsIFJlc3VsdC5yZWxlYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9ucy5nZXRBU1RDb250ZXh0KCkuZ2V0UHJpbnRpbmdQb2xpY3koKSkpCiAgICAgRGlhZyhTdGFydExvYywgRGlhZ0lEKSA8PCBQcmV2U3BlYzsKICAgRFMuc2V0VHlwZW9mUGFyZW5zUmFuZ2UoVC5nZXRSYW5nZSgpKTsKIH0KQEAgLTk4NSw3ICsxMDE3LDggQEAKIAogICBjb25zdCBjaGFyICpQcmV2U3BlYyA9IDA7CiAgIHVuc2lnbmVkIERpYWdJRDsKLSAgRFMuU2V0VHlwZVNwZWNUeXBlKFRTVF90eXBlbmFtZSwgSWRMb2MsIFByZXZTcGVjLCBEaWFnSUQsIFR5cGUpOworICBEUy5TZXRUeXBlU3BlY1R5cGUoVFNUX3R5cGVuYW1lLCBJZExvYywgUHJldlNwZWMsIERpYWdJRCwgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIEFjdGlvbnMuZ2V0QVNUQ29udGV4dCgpLmdldFByaW50aW5nUG9saWN5KCkpOwogCiAgIERlY2xhcmF0b3IgRGVjbGFyYXRvckluZm8oRFMsIERlY2xhcmF0b3I6OlR5cGVOYW1lQ29udGV4dCk7CiAgIHJldHVybiBBY3Rpb25zLkFjdE9uVHlwZU5hbWUoZ2V0Q3VyU2NvcGUoKSwgRGVjbGFyYXRvckluZm8pOwpAQCAtOTk4LDcgKzEwMzEsNyBAQAogICAgIElkZW50aWZpZXJJbmZvICpBdHRyTmFtZSA9IFRvay5nZXRJZGVudGlmaWVySW5mbygpOwogICAgIFNvdXJjZUxvY2F0aW9uIEF0dHJOYW1lTG9jID0gQ29uc3VtZVRva2VuKCk7CiAgICAgYXR0cnMuYWRkTmV3KEF0dHJOYW1lLCBBdHRyTmFtZUxvYywgMCwgQXR0ck5hbWVMb2MsIDAsIDAsCi0gICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OkFTX0dOVSk7CisgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OkFTX0tleXdvcmQpOwogICB9CiB9CiAKQEAgLTEwMjEsNiArMTA1NCw3IEBACiAgIGNhc2UgdG9rOjpsX3BhcmVuOiAgICAgICAgICAgIC8vIHN0cnVjdCBmb28gey4uLn0gKCAgICAgICAgIHgpOwogICBjYXNlIHRvazo6Y29tbWE6ICAgICAgICAgICAgICAvLyBfX2J1aWx0aW5fb2Zmc2V0b2Yoc3RydWN0IGZvb3suLi59ICwKICAgY2FzZSB0b2s6Omt3X29wZXJhdG9yOiAgICAgICAgLy8gc3RydWN0IGZvbyAgICAgICBvcGVyYXRvciAgKysoKSB7Li4ufQorICBjYXNlIHRvazo6a3dfX19kZWNsc3BlYzogICAgICAvLyBzdHJ1Y3QgZm9vIHsuLi59IF9fZGVjbHNwZWMoLi4uKQogICAgIHJldHVybiB0cnVlOwogICBjYXNlIHRvazo6Y29sb246CiAgICAgcmV0dXJuIENvdWxkQmVCaXRmaWVsZDsgICAgIC8vIGVudW0gRSB7IC4uLiB9ICAgOiAgICAgICAgIDI7CkBAIC0xMTc5LDMxICsxMjEzLDE3IEBACiAgIC8vIEMrKzExIGF0dHJpYnV0ZXMKICAgU291cmNlTG9jYXRpb24gQXR0ckZpeGl0TG9jID0gVG9rLmdldExvY2F0aW9uKCk7CiAKLSAgaWYgKFRhZ1R5cGUgPT0gRGVjbFNwZWM6OlRTVF9zdHJ1Y3QgJiYKLSAgICAgICFUb2suaXModG9rOjppZGVudGlmaWVyKSAmJgotICAgICAgVG9rLmdldElkZW50aWZpZXJJbmZvKCkgJiYKLSAgICAgIChUb2suaXModG9rOjprd19fX2lzX2FyaXRobWV0aWMpIHx8Ci0gICAgICAgVG9rLmlzKHRvazo6a3dfX19pc19jb252ZXJ0aWJsZSkgfHwKLSAgICAgICBUb2suaXModG9rOjprd19fX2lzX2VtcHR5KSB8fAotICAgICAgIFRvay5pcyh0b2s6Omt3X19faXNfZmxvYXRpbmdfcG9pbnQpIHx8Ci0gICAgICAgVG9rLmlzKHRvazo6a3dfX19pc19mdW5jdGlvbikgfHwKLSAgICAgICBUb2suaXModG9rOjprd19fX2lzX2Z1bmRhbWVudGFsKSB8fAotICAgICAgIFRvay5pcyh0b2s6Omt3X19faXNfaW50ZWdyYWwpIHx8Ci0gICAgICAgVG9rLmlzKHRvazo6a3dfX19pc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcikgfHwKLSAgICAgICBUb2suaXModG9rOjprd19fX2lzX21lbWJlcl9wb2ludGVyKSB8fAotICAgICAgIFRvay5pcyh0b2s6Omt3X19faXNfcG9kKSB8fAotICAgICAgIFRvay5pcyh0b2s6Omt3X19faXNfcG9pbnRlcikgfHwKLSAgICAgICBUb2suaXModG9rOjprd19fX2lzX3NhbWUpIHx8Ci0gICAgICAgVG9rLmlzKHRvazo6a3dfX19pc19zY2FsYXIpIHx8Ci0gICAgICAgVG9rLmlzKHRvazo6a3dfX19pc19zaWduZWQpIHx8Ci0gICAgICAgVG9rLmlzKHRvazo6a3dfX19pc191bnNpZ25lZCkgfHwKLSAgICAgICBUb2suaXModG9rOjprd19fX2lzX3ZvaWQpKSkKLSAgICAvLyBHTlUgbGlic3RkYysrIDQuMiBhbmQgbGliYysrIHVzZSBjZXJ0YWluIGludHJpbnNpYyBuYW1lcyBhcyB0aGUKLSAgICAvLyBuYW1lIG9mIHN0cnVjdCB0ZW1wbGF0ZXMsIGJ1dCBzb21lIGFyZSBrZXl3b3JkcyBpbiBHQ0MgPj0gNC4zCi0gICAgLy8gYW5kIENsYW5nLiBUaGVyZWZvcmUsIHdoZW4gd2Ugc2VlIHRoZSB0b2tlbiBzZXF1ZW5jZSAic3RydWN0Ci0gICAgLy8gWCIsIG1ha2UgWCBpbnRvIGEgbm9ybWFsIGlkZW50aWZpZXIgcmF0aGVyIHRoYW4gYSBrZXl3b3JkLCB0bwotICAgIC8vIGFsbG93IGxpYnN0ZGMrKyA0LjIgYW5kIGxpYmMrKyB0byB3b3JrIHByb3Blcmx5LgotICAgIFRyeUtleXdvcmRJZGVudEZhbGxiYWNrKHRydWUpOworICAvLyBHTlUgbGlic3RkYysrIGFuZCBsaWJjKysgdXNlIGNlcnRhaW4gaW50cmluc2ljIG5hbWVzIGFzIHRoZQorICAvLyBuYW1lIG9mIHN0cnVjdCB0ZW1wbGF0ZXMsIGJ1dCBzb21lIGFyZSBrZXl3b3JkcyBpbiBHQ0MgPj0gNC4zCisgIC8vIE1TVkMgYW5kIENsYW5nLiBGb3IgY29tcGF0aWJpbGl0eSwgY29udmVydCB0aGUgdG9rZW4gdG8gYW4gaWRlbnRpZmllcgorICAvLyBhbmQgaXNzdWUgYSB3YXJuaW5nIGRpYWdub3N0aWMuCisgIGlmIChUYWdUeXBlID09IERlY2xTcGVjOjpUU1Rfc3RydWN0ICYmICFUb2suaXModG9rOjppZGVudGlmaWVyKSAmJgorICAgICAgIVRvay5pc0Fubm90YXRpb24oKSkgeworICAgIGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSA9IFRvay5nZXRJZGVudGlmaWVySW5mbygpOworICAgIC8vIFdlIHJhcmVseSBlbmQgdXAgaGVyZSBzbyB0aGUgZm9sbG93aW5nIGNoZWNrIGlzIGVmZmljaWVudC4KKyAgICBpZiAoSUkgJiYgSUktPmdldE5hbWUoKS5zdGFydHN3aXRoKCJfX2lzXyIpKQorICAgICAgVHJ5S2V5d29yZElkZW50RmFsbGJhY2sodHJ1ZSk7CisgIH0KIAogICAvLyBQYXJzZSB0aGUgKG9wdGlvbmFsKSBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCiAgIENYWFNjb3BlU3BlYyAmU1MgPSBEUy5nZXRUeXBlU3BlY1Njb3BlKCk7CkBAIC0xMjE1LDcgKzEyMzUsNyBAQAogICAgICAgRFMuU2V0VHlwZVNwZWNFcnJvcigpOwogICAgIGlmIChTUy5pc1NldCgpKQogICAgICAgaWYgKFRvay5pc05vdCh0b2s6OmlkZW50aWZpZXIpICYmIFRvay5pc05vdCh0b2s6OmFubm90X3RlbXBsYXRlX2lkKSkKLSAgICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCk7CisgICAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6aWRlbnRpZmllcjsKICAgfQogCiAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdHMgKlRlbXBsYXRlUGFyYW1zID0gVGVtcGxhdGVJbmZvLlRlbXBsYXRlUGFyYW1zOwpAQCAtMTI0MywxMyArMTI2Myw4IEBACiAgICAgICB9CiAKICAgICAgIERpYWcoTmFtZUxvYywgZGlhZzo6ZXJyX2V4cGxpY2l0X3NwZWNfbm9uX3RlbXBsYXRlKQotICAgICAgICA8PCAoVGVtcGxhdGVJbmZvLktpbmQgPT0gUGFyc2VkVGVtcGxhdGVJbmZvOjpFeHBsaWNpdEluc3RhbnRpYXRpb24pCi0gICAgICAgIDw8IChUYWdUeXBlID09IERlY2xTcGVjOjpUU1RfY2xhc3M/IDAKLSAgICAgICAgICAgIDogVGFnVHlwZSA9PSBEZWNsU3BlYzo6VFNUX3N0cnVjdD8gMQotICAgICAgICAgICAgOiBUYWdUeXBlID09IERlY2xTcGVjOjpUU1RfdW5pb24/IDIKLSAgICAgICAgICAgIDogMykKLSAgICAgICAgPDwgTmFtZQotICAgICAgICA8PCBTb3VyY2VSYW5nZShMQW5nbGVMb2MsIFJBbmdsZUxvYyk7CisgICAgICAgICAgPDwgKFRlbXBsYXRlSW5mby5LaW5kID09IFBhcnNlZFRlbXBsYXRlSW5mbzo6RXhwbGljaXRJbnN0YW50aWF0aW9uKQorICAgICAgICAgIDw8IFRhZ1Rva0tpbmQgPDwgTmFtZSA8PCBTb3VyY2VSYW5nZShMQW5nbGVMb2MsIFJBbmdsZUxvYyk7CiAKICAgICAgIC8vIFN0cmlwIG9mZiB0aGUgbGFzdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCBpZiBpdCB3YXMgZW1wdHksIHNpbmNlCiAgICAgICAvLyB3ZSd2ZSByZW1vdmVkIGl0cyB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0LgpAQCAtMTI4Niw2ICsxMzAxLDcgQEAKICAgICAgIGlmIChTUy5pc05vdEVtcHR5KCkpCiAgICAgICAgIFJhbmdlLnNldEJlZ2luKFNTLmdldEJlZ2luTG9jKCkpOwogCisgICAgICAvLyBGSVhNRTogTmFtZSBtYXkgYmUgbnVsbCBoZXJlLgogICAgICAgRGlhZyhUZW1wbGF0ZUlkLT5MQW5nbGVMb2MsIGRpYWc6OmVycl90ZW1wbGF0ZV9zcGVjX3N5bnRheF9ub25fdGVtcGxhdGUpCiAgICAgICAgIDw8IFRlbXBsYXRlSWQtPk5hbWUgPDwgc3RhdGljX2Nhc3Q8aW50PihUZW1wbGF0ZUlkLT5LaW5kKSA8PCBSYW5nZTsKIApAQCAtMTMxOCwxMSArMTMzNCwxMiBAQAogICAvLyAgIG5ldyBzdHJ1Y3QgczsKICAgLy8gb3IKICAgLy8gICAmVDo6b3BlcmF0b3Igc3RydWN0IHM7Ci0gIC8vIEZvciB0aGVzZSwgRFNDIGlzIERTQ190eXBlX3NwZWNpZmllci4KKyAgLy8gRm9yIHRoZXNlLCBEU0MgaXMgRFNDX3R5cGVfc3BlY2lmaWVyIG9yIERTQ19hbGlhc19kZWNsYXJhdGlvbi4KIAogICAvLyBJZiB0aGVyZSBhcmUgYXR0cmlidXRlcyBhZnRlciBjbGFzcyBuYW1lLCBwYXJzZSB0aGVtLgogICBNYXliZVBhcnNlQ1hYMTFBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMpOwogCisgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kgPSBBY3Rpb25zLmdldEFTVENvbnRleHQoKS5nZXRQcmludGluZ1BvbGljeSgpOwogICBTZW1hOjpUYWdVc2VLaW5kIFRVSzsKICAgaWYgKERTQyA9PSBEU0NfdHJhaWxpbmcpCiAgICAgVFVLID0gU2VtYTo6VFVLX1JlZmVyZW5jZTsKQEAgLTEzNzUsMTQgKzEzOTIsMTUgQEAKICAgICAgIFRVSyA9IFNlbWE6OlRVS19SZWZlcmVuY2U7CiAKICAgICBQQS5SZXZlcnQoKTsKLSAgfSBlbHNlIGlmIChEU0MgIT0gRFNDX3R5cGVfc3BlY2lmaWVyICYmCisgIH0gZWxzZSBpZiAoIWlzVHlwZVNwZWNpZmllcihEU0MpICYmCiAgICAgICAgICAgICAgKFRvay5pcyh0b2s6OnNlbWkpIHx8CiAgICAgICAgICAgICAgIChUb2suaXNBdFN0YXJ0T2ZMaW5lKCkgJiYgIWlzVmFsaWRBZnRlclR5cGVTcGVjaWZpZXIoZmFsc2UpKSkpIHsKICAgICBUVUsgPSBEUy5pc0ZyaWVuZFNwZWNpZmllZCgpID8gU2VtYTo6VFVLX0ZyaWVuZCA6IFNlbWE6OlRVS19EZWNsYXJhdGlvbjsKICAgICBpZiAoVG9rLmlzTm90KHRvazo6c2VtaSkpIHsKKyAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQUG9sID0gQWN0aW9ucy5nZXRBU1RDb250ZXh0KCkuZ2V0UHJpbnRpbmdQb2xpY3koKTsKICAgICAgIC8vIEEgc2VtaWNvbG9uIHdhcyBtaXNzaW5nIGFmdGVyIHRoaXMgZGVjbGFyYXRpb24uIERpYWdub3NlIGFuZCByZWNvdmVyLgotICAgICAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2FmdGVyX3RhZ2RlY2wsCi0gICAgICAgIERlY2xTcGVjOjpnZXRTcGVjaWZpZXJOYW1lKFRhZ1R5cGUpKTsKKyAgICAgIEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLCBkaWFnOjplcnJfZXhwZWN0ZWRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIERlY2xTcGVjOjpnZXRTcGVjaWZpZXJOYW1lKFRhZ1R5cGUsIFBQb2wpKTsKICAgICAgIFBQLkVudGVyVG9rZW4oVG9rKTsKICAgICAgIFRvay5zZXRLaW5kKHRvazo6c2VtaSk7CiAgICAgfQpAQCAtMTQyNCw3ICsxNDQyLDcgQEAKICAgICBpZiAoRFMuZ2V0VHlwZVNwZWNUeXBlKCkgIT0gRGVjbFNwZWM6OlRTVF9lcnJvcikgewogICAgICAgLy8gV2UgaGF2ZSBhIGRlY2xhcmF0aW9uIG9yIHJlZmVyZW5jZSB0byBhbiBhbm9ueW1vdXMgY2xhc3MuCiAgICAgICBEaWFnKFN0YXJ0TG9jLCBkaWFnOjplcnJfYW5vbl90eXBlX2RlZmluaXRpb24pCi0gICAgICAgIDw8IERlY2xTcGVjOjpnZXRTcGVjaWZpZXJOYW1lKFRhZ1R5cGUpOworICAgICAgICA8PCBEZWNsU3BlYzo6Z2V0U3BlY2lmaWVyTmFtZShUYWdUeXBlLCBQb2xpY3kpOwogICAgIH0KIAogICAgIC8vIElmIHdlIGFyZSBwYXJzaW5nIGEgZGVmaW5pdGlvbiBhbmQgc3RvcCBhdCBhIGJhc2UtY2xhdXNlLCBjb250aW51ZSBvbgpAQCAtMTU5MSw3ICsxNjA5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTLmdldE1vZHVsZVByaXZhdGVTcGVjTG9jKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUGFyYW1zLCBPd25lZCwgSXNEZXBlbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nOjpUeXBlUmVzdWx0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhbmc6OlR5cGVSZXN1bHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTQyA9PSBEU0NfdHlwZV9zcGVjaWZpZXIpOwogCiAgICAgLy8gSWYgQWN0T25UYWcgc2FpZCB0aGUgdHlwZSB3YXMgZGVwZW5kZW50LCB0cnkgYWdhaW4gd2l0aCB0aGUKICAgICAvLyBsZXNzIGNvbW1vbiBjYWxsLgpAQCAtMTYyMCwxMSArMTYzOSwxMiBAQAogICBpZiAoIVR5cGVSZXN1bHQuaXNJbnZhbGlkKCkpIHsKICAgICBSZXN1bHQgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF90eXBlbmFtZSwgU3RhcnRMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVMb2MuaXNWYWxpZCgpID8gTmFtZUxvYyA6IFN0YXJ0TG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lELCBUeXBlUmVzdWx0LmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCwgVHlwZVJlc3VsdC5nZXQoKSwgUG9saWN5KTsKICAgfSBlbHNlIGlmICghVGFnT3JUZW1wUmVzdWx0LmlzSW52YWxpZCgpKSB7CiAgICAgUmVzdWx0ID0gRFMuU2V0VHlwZVNwZWNUeXBlKFRhZ1R5cGUsIFN0YXJ0TG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lTG9jLmlzVmFsaWQoKSA/IE5hbWVMb2MgOiBTdGFydExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCwgVGFnT3JUZW1wUmVzdWx0LmdldCgpLCBPd25lZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZTcGVjLCBEaWFnSUQsIFRhZ09yVGVtcFJlc3VsdC5nZXQoKSwgT3duZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeSk7CiAgIH0gZWxzZSB7CiAgICAgRFMuU2V0VHlwZVNwZWNFcnJvcigpOwogICAgIHJldHVybjsKQEAgLTE2NDUsOCArMTY2NSw5IEBACiAgIGlmIChUVUsgPT0gU2VtYTo6VFVLX0RlZmluaXRpb24gJiYKICAgICAgIChUZW1wbGF0ZUluZm8uS2luZCB8fCAhaXNWYWxpZEFmdGVyVHlwZVNwZWNpZmllcihmYWxzZSkpKSB7CiAgICAgaWYgKFRvay5pc05vdCh0b2s6OnNlbWkpKSB7Ci0gICAgICBFeHBlY3RBbmRDb25zdW1lKHRvazo6c2VtaSwgZGlhZzo6ZXJyX2V4cGVjdGVkX3NlbWlfYWZ0ZXJfdGFnZGVjbCwKLSAgICAgICAgRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoVGFnVHlwZSkpOworICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBQb2wgPSBBY3Rpb25zLmdldEFTVENvbnRleHQoKS5nZXRQcmludGluZ1BvbGljeSgpOworICAgICAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoVGFnVHlwZSwgUFBvbCkpOwogICAgICAgLy8gUHVzaCB0aGlzIHRva2VuIGJhY2sgaW50byB0aGUgcHJlcHJvY2Vzc29yIGFuZCBjaGFuZ2Ugb3VyIGN1cnJlbnQgdG9rZW4KICAgICAgIC8vIHRvICc7JyBzbyB0aGF0IHRoZSByZXN0IG9mIHRoZSBjb2RlIHJlY292ZXJzIGFzIHRob3VnaCB0aGVyZSB3ZXJlIGFuCiAgICAgICAvLyAnOycgYWZ0ZXIgdGhlIGRlZmluaXRpb24uCkBAIC0xNjg0LDEwICsxNzA1LDggQEAKIAogICAgIC8vIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgY29tbWEsIGNvbnN1bWUgaXQgYW5kIGtlZXAgcmVhZGluZwogICAgIC8vIGJhc2Utc3BlY2lmaWVycy4KLSAgICBpZiAoVG9rLmlzTm90KHRvazo6Y29tbWEpKSBicmVhazsKLQotICAgIC8vIENvbnN1bWUgdGhlIGNvbW1hLgotICAgIENvbnN1bWVUb2tlbigpOworICAgIGlmICghVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29tbWEpKQorICAgICAgYnJlYWs7CiAgIH0KIAogICAvLyBBdHRhY2ggdGhlIGJhc2Ugc3BlY2lmaWVycwpAQCAtMTcxMywxMCArMTczMiw4IEBACiAgIE1heWJlUGFyc2VDWFgxMUF0dHJpYnV0ZXMoQXR0cmlidXRlcyk7CiAKICAgLy8gUGFyc2UgdGhlICd2aXJ0dWFsJyBrZXl3b3JkLgotICBpZiAoVG9rLmlzKHRvazo6a3dfdmlydHVhbCkpICB7Ci0gICAgQ29uc3VtZVRva2VuKCk7CisgIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjprd192aXJ0dWFsKSkKICAgICBJc1ZpcnR1YWwgPSB0cnVlOwotICB9CiAKICAgQ2hlY2tNaXNwbGFjZWRDWFgxMUF0dHJpYnV0ZShBdHRyaWJ1dGVzLCBTdGFydExvYyk7CiAKQEAgLTE3NTMsOSArMTc3MCw4IEBACiAgIC8vIGFjdHVhbGx5IHBhcnQgb2YgdGhlIGJhc2Utc3BlY2lmaWVyLWxpc3QgZ3JhbW1hciBwcm9kdWN0aW9ucywgYnV0IHdlCiAgIC8vIHBhcnNlIGl0IGhlcmUgZm9yIGNvbnZlbmllbmNlLgogICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYzsKLSAgaWYgKFRvay5pcyh0b2s6OmVsbGlwc2lzKSkKLSAgICBFbGxpcHNpc0xvYyA9IENvbnN1bWVUb2tlbigpOwotICAKKyAgVHJ5Q29uc3VtZVRva2VuKHRvazo6ZWxsaXBzaXMsIEVsbGlwc2lzTG9jKTsKKwogICAvLyBGaW5kIHRoZSBjb21wbGV0ZSBzb3VyY2UgcmFuZ2UgZm9yIHRoZSBiYXNlLXNwZWNpZmllci4KICAgU291cmNlUmFuZ2UgUmFuZ2UoU3RhcnRMb2MsIEVuZExvY2F0aW9uKTsKIApAQCAtMTc5Myw4ICsxODA5LDggQEAKICAgRGVjbGFyYXRvckNodW5rOjpGdW5jdGlvblR5cGVJbmZvICZGVEkKICAgICA9IERlY2xhcmF0b3JJbmZvLmdldEZ1bmN0aW9uVHlwZUluZm8oKTsKIAotICBmb3IgKHVuc2lnbmVkIFBhcmFtSWR4ID0gMDsgUGFyYW1JZHggPCBGVEkuTnVtQXJnczsgKytQYXJhbUlkeCkgewotICAgIGlmIChMYXRlTWV0aG9kIHx8IEZUSS5BcmdJbmZvW1BhcmFtSWR4XS5EZWZhdWx0QXJnVG9rZW5zKSB7CisgIGZvciAodW5zaWduZWQgUGFyYW1JZHggPSAwOyBQYXJhbUlkeCA8IEZUSS5OdW1QYXJhbXM7ICsrUGFyYW1JZHgpIHsKKyAgICBpZiAoTGF0ZU1ldGhvZCB8fCBGVEkuUGFyYW1zW1BhcmFtSWR4XS5EZWZhdWx0QXJnVG9rZW5zKSB7CiAgICAgICBpZiAoIUxhdGVNZXRob2QpIHsKICAgICAgICAgLy8gUHVzaCB0aGlzIG1ldGhvZCBvbnRvIHRoZSBzdGFjayBvZiBsYXRlLXBhcnNlZCBtZXRob2QKICAgICAgICAgLy8gZGVjbGFyYXRpb25zLgpAQCAtMTgwNCwxNyArMTgyMCwxNiBAQAogCiAgICAgICAgIC8vIEFkZCBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgcHJpb3IgdG8gdGhpcyBvbmUgKHRoZXkgZG9uJ3QKICAgICAgICAgLy8gaGF2ZSBkZWZhdWx0IGFyZ3VtZW50cykuCi0gICAgICAgIExhdGVNZXRob2QtPkRlZmF1bHRBcmdzLnJlc2VydmUoRlRJLk51bUFyZ3MpOworICAgICAgICBMYXRlTWV0aG9kLT5EZWZhdWx0QXJncy5yZXNlcnZlKEZUSS5OdW1QYXJhbXMpOwogICAgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgUGFyYW1JZHg7ICsrSSkKICAgICAgICAgICBMYXRlTWV0aG9kLT5EZWZhdWx0QXJncy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdGVQYXJzZWREZWZhdWx0QXJndW1lbnQoRlRJLkFyZ0luZm9bSV0uUGFyYW0pKTsKKyAgICAgICAgICAgICAgTGF0ZVBhcnNlZERlZmF1bHRBcmd1bWVudChGVEkuUGFyYW1zW0ldLlBhcmFtKSk7CiAgICAgICB9CiAKICAgICAgIC8vIEFkZCB0aGlzIHBhcmFtZXRlciB0byB0aGUgbGlzdCBvZiBwYXJhbWV0ZXJzIChpdCBtYXkgb3IgbWF5CiAgICAgICAvLyBub3QgaGF2ZSBhIGRlZmF1bHQgYXJndW1lbnQpLgotICAgICAgTGF0ZU1ldGhvZC0+RGVmYXVsdEFyZ3MucHVzaF9iYWNrKAotICAgICAgICBMYXRlUGFyc2VkRGVmYXVsdEFyZ3VtZW50KEZUSS5BcmdJbmZvW1BhcmFtSWR4XS5QYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVEkuQXJnSW5mb1tQYXJhbUlkeF0uRGVmYXVsdEFyZ1Rva2VucykpOworICAgICAgTGF0ZU1ldGhvZC0+RGVmYXVsdEFyZ3MucHVzaF9iYWNrKExhdGVQYXJzZWREZWZhdWx0QXJndW1lbnQoCisgICAgICAgICAgRlRJLlBhcmFtc1tQYXJhbUlkeF0uUGFyYW0sIEZUSS5QYXJhbXNbUGFyYW1JZHhdLkRlZmF1bHRBcmdUb2tlbnMpKTsKICAgICB9CiAgIH0KIH0KQEAgLTE4MjYsMzAgKzE4NDEsMjggQEAKIC8vLyAgICAgICAgIG92ZXJyaWRlCiAvLy8gICAgICAgICBmaW5hbAogVmlydFNwZWNpZmllcnM6OlNwZWNpZmllciBQYXJzZXI6OmlzQ1hYMTFWaXJ0U3BlY2lmaWVyKGNvbnN0IFRva2VuICZUb2spIGNvbnN0IHsKLSAgaWYgKCFnZXRMYW5nT3B0cygpLkNQbHVzUGx1cykKKyAgaWYgKCFnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyB8fCBUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkKICAgICByZXR1cm4gVmlydFNwZWNpZmllcnM6OlZTX05vbmU7CiAKLSAgaWYgKFRvay5pcyh0b2s6OmlkZW50aWZpZXIpKSB7Ci0gICAgSWRlbnRpZmllckluZm8gKklJID0gVG9rLmdldElkZW50aWZpZXJJbmZvKCk7CisgIElkZW50aWZpZXJJbmZvICpJSSA9IFRvay5nZXRJZGVudGlmaWVySW5mbygpOwogCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udGV4dHVhbCBrZXl3b3Jkcy4KLSAgICBpZiAoIUlkZW50X2ZpbmFsKSB7Ci0gICAgICBJZGVudF9maW5hbCA9ICZQUC5nZXRJZGVudGlmaWVyVGFibGUoKS5nZXQoImZpbmFsIik7Ci0gICAgICBpZiAoZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRFeHQpCi0gICAgICAgIElkZW50X3NlYWxlZCA9ICZQUC5nZXRJZGVudGlmaWVyVGFibGUoKS5nZXQoInNlYWxlZCIpOwotICAgICAgSWRlbnRfb3ZlcnJpZGUgPSAmUFAuZ2V0SWRlbnRpZmllclRhYmxlKCkuZ2V0KCJvdmVycmlkZSIpOwotICAgIH0KLQotICAgIGlmIChJSSA9PSBJZGVudF9vdmVycmlkZSkKLSAgICAgIHJldHVybiBWaXJ0U3BlY2lmaWVyczo6VlNfT3ZlcnJpZGU7Ci0KLSAgICBpZiAoSUkgPT0gSWRlbnRfc2VhbGVkKQotICAgICAgcmV0dXJuIFZpcnRTcGVjaWZpZXJzOjpWU19TZWFsZWQ7Ci0KLSAgICBpZiAoSUkgPT0gSWRlbnRfZmluYWwpCi0gICAgICByZXR1cm4gVmlydFNwZWNpZmllcnM6OlZTX0ZpbmFsOworICAvLyBJbml0aWFsaXplIHRoZSBjb250ZXh0dWFsIGtleXdvcmRzLgorICBpZiAoIUlkZW50X2ZpbmFsKSB7CisgICAgSWRlbnRfZmluYWwgPSAmUFAuZ2V0SWRlbnRpZmllclRhYmxlKCkuZ2V0KCJmaW5hbCIpOworICAgIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdEV4dCkKKyAgICAgIElkZW50X3NlYWxlZCA9ICZQUC5nZXRJZGVudGlmaWVyVGFibGUoKS5nZXQoInNlYWxlZCIpOworICAgIElkZW50X292ZXJyaWRlID0gJlBQLmdldElkZW50aWZpZXJUYWJsZSgpLmdldCgib3ZlcnJpZGUiKTsKICAgfQogCisgIGlmIChJSSA9PSBJZGVudF9vdmVycmlkZSkKKyAgICByZXR1cm4gVmlydFNwZWNpZmllcnM6OlZTX092ZXJyaWRlOworCisgIGlmIChJSSA9PSBJZGVudF9zZWFsZWQpCisgICAgcmV0dXJuIFZpcnRTcGVjaWZpZXJzOjpWU19TZWFsZWQ7CisKKyAgaWYgKElJID09IElkZW50X2ZpbmFsKQorICAgIHJldHVybiBWaXJ0U3BlY2lmaWVyczo6VlNfRmluYWw7CisKICAgcmV0dXJuIFZpcnRTcGVjaWZpZXJzOjpWU19Ob25lOwogfQogCkBAIC0xODkxLDI0ICsxOTA0LDU4IEBACiB9CiAKIC8vLyBpc0NYWDExRmluYWxLZXl3b3JkIC0gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4gaXMgYSBDKysxMQotLy8vIGNvbnRleHR1YWwgJ2ZpbmFsJyBrZXl3b3JkLgorLy8vICdmaW5hbCcgb3IgTWljcm9zb2Z0ICdzZWFsZWQnIGNvbnRleHR1YWwga2V5d29yZC4KIGJvb2wgUGFyc2VyOjppc0NYWDExRmluYWxLZXl3b3JkKCkgY29uc3QgewotICBpZiAoIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKQotICAgIHJldHVybiBmYWxzZTsKKyAgVmlydFNwZWNpZmllcnM6OlNwZWNpZmllciBTcGVjaWZpZXIgPSBpc0NYWDExVmlydFNwZWNpZmllcigpOworICByZXR1cm4gU3BlY2lmaWVyID09IFZpcnRTcGVjaWZpZXJzOjpWU19GaW5hbCB8fAorICAgICAgICAgU3BlY2lmaWVyID09IFZpcnRTcGVjaWZpZXJzOjpWU19TZWFsZWQ7Cit9CiAKLSAgaWYgKCFUb2suaXModG9rOjppZGVudGlmaWVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGUgY29udGV4dHVhbCBrZXl3b3Jkcy4KLSAgaWYgKCFJZGVudF9maW5hbCkgewotICAgIElkZW50X2ZpbmFsID0gJlBQLmdldElkZW50aWZpZXJUYWJsZSgpLmdldCgiZmluYWwiKTsKLSAgICBpZiAoZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRFeHQpCi0gICAgICBJZGVudF9zZWFsZWQgPSAmUFAuZ2V0SWRlbnRpZmllclRhYmxlKCkuZ2V0KCJzZWFsZWQiKTsKLSAgICBJZGVudF9vdmVycmlkZSA9ICZQUC5nZXRJZGVudGlmaWVyVGFibGUoKS5nZXQoIm92ZXJyaWRlIik7CisvLy8gXGJyaWVmIFBhcnNlIGEgQysrIG1lbWJlci1kZWNsYXJhdG9yIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgdGhlIG9wdGlvbmFsCisvLy8gYnJhY2Utb3ItZXF1YWwtaW5pdGlhbGl6ZXIgb3IgcHVyZS1zcGVjaWZpZXIuCit2b2lkIFBhcnNlcjo6UGFyc2VDWFhNZW1iZXJEZWNsYXJhdG9yQmVmb3JlSW5pdGlhbGl6ZXIoCisgICAgRGVjbGFyYXRvciAmRGVjbGFyYXRvckluZm8sIFZpcnRTcGVjaWZpZXJzICZWUywgRXhwclJlc3VsdCAmQml0ZmllbGRTaXplLAorICAgIExhdGVQYXJzZWRBdHRyTGlzdCAmTGF0ZVBhcnNlZEF0dHJzKSB7CisgIC8vIG1lbWJlci1kZWNsYXJhdG9yOgorICAvLyAgIGRlY2xhcmF0b3IgcHVyZS1zcGVjaWZpZXJbb3B0XQorICAvLyAgIGRlY2xhcmF0b3IgYnJhY2Utb3ItZXF1YWwtaW5pdGlhbGl6ZXJbb3B0XQorICAvLyAgIGlkZW50aWZpZXJbb3B0XSAnOicgY29uc3RhbnQtZXhwcmVzc2lvbgorICBpZiAoVG9rLmlzTm90KHRvazo6Y29sb24pKSB7CisgICAgLy8gRG9uJ3QgcGFyc2UgRk9POkJBUiBhcyBpZiBpdCB3ZXJlIGEgdHlwbyBmb3IgRk9POjpCQVIsIGluIHRoaXMgY29udGV4dCBpdAorICAgIC8vIGlzIGEgYml0ZmllbGQuCisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIG9ubHkgYXBwbHkgd2hlbiBwYXJzaW5nIHRoZSBpZC1leHByZXNzaW9uIChzZWUKKyAgICAvLyBQUjE4NTg3KS4KKyAgICBDb2xvblByb3RlY3Rpb25SQUlJT2JqZWN0IFgoKnRoaXMpOworICAgIFBhcnNlRGVjbGFyYXRvcihEZWNsYXJhdG9ySW5mbyk7CiAgIH0KIAotICByZXR1cm4gVG9rLmdldElkZW50aWZpZXJJbmZvKCkgPT0gSWRlbnRfZmluYWwgfHwKLSAgICAgICAgIFRvay5nZXRJZGVudGlmaWVySW5mbygpID09IElkZW50X3NlYWxlZDsKKyAgaWYgKCFEZWNsYXJhdG9ySW5mby5pc0Z1bmN0aW9uRGVjbGFyYXRvcigpICYmIFRyeUNvbnN1bWVUb2tlbih0b2s6OmNvbG9uKSkgeworICAgIEJpdGZpZWxkU2l6ZSA9IFBhcnNlQ29uc3RhbnRFeHByZXNzaW9uKCk7CisgICAgaWYgKEJpdGZpZWxkU2l6ZS5pc0ludmFsaWQoKSkKKyAgICAgIFNraXBVbnRpbCh0b2s6OmNvbW1hLCBTdG9wQXRTZW1pIHwgU3RvcEJlZm9yZU1hdGNoKTsKKyAgfSBlbHNlCisgICAgUGFyc2VPcHRpb25hbENYWDExVmlydFNwZWNpZmllclNlcShWUywgZ2V0Q3VycmVudENsYXNzKCkuSXNJbnRlcmZhY2UpOworCisgIC8vIElmIGEgc2ltcGxlLWFzbS1leHByIGlzIHByZXNlbnQsIHBhcnNlIGl0LgorICBpZiAoVG9rLmlzKHRvazo6a3dfYXNtKSkgeworICAgIFNvdXJjZUxvY2F0aW9uIExvYzsKKyAgICBFeHByUmVzdWx0IEFzbUxhYmVsKFBhcnNlU2ltcGxlQXNtKCZMb2MpKTsKKyAgICBpZiAoQXNtTGFiZWwuaXNJbnZhbGlkKCkpCisgICAgICBTa2lwVW50aWwodG9rOjpjb21tYSwgU3RvcEF0U2VtaSB8IFN0b3BCZWZvcmVNYXRjaCk7CisKKyAgICBEZWNsYXJhdG9ySW5mby5zZXRBc21MYWJlbChBc21MYWJlbC5yZWxlYXNlKCkpOworICAgIERlY2xhcmF0b3JJbmZvLlNldFJhbmdlRW5kKExvYyk7CisgIH0KKworICAvLyBJZiBhdHRyaWJ1dGVzIGV4aXN0IGFmdGVyIHRoZSBkZWNsYXJhdG9yLCBidXQgYmVmb3JlIGFuICd7JywgcGFyc2UgdGhlbS4KKyAgTWF5YmVQYXJzZUdOVUF0dHJpYnV0ZXMoRGVjbGFyYXRvckluZm8sICZMYXRlUGFyc2VkQXR0cnMpOworCisgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggY29kZSB3cml0dGVuIHRvIG9sZGVyIENsYW5nLCBhbHNvIGFjY2VwdCBhCisgIC8vIHZpcnQtc3BlY2lmaWVyICphZnRlciogdGhlIEdOVSBhdHRyaWJ1dGVzLgorICAvLyBGSVhNRTogSWYgd2Ugc2F3IGFueSBhdHRyaWJ1dGVzIHRoYXQgYXJlIGtub3duIHRvIEdDQyBmb2xsb3dlZCBieSBhCisgIC8vIHZpcnQtc3BlY2lmaWVyLCBpc3N1ZSBhIEdDQy1jb21wYXQgd2FybmluZy4KKyAgaWYgKEJpdGZpZWxkU2l6ZS5pc1Vuc2V0KCkgJiYgVlMuaXNVbnNldCgpKQorICAgIFBhcnNlT3B0aW9uYWxDWFgxMVZpcnRTcGVjaWZpZXJTZXEoVlMsIGdldEN1cnJlbnRDbGFzcygpLklzSW50ZXJmYWNlKTsKIH0KIAogLy8vIFBhcnNlQ1hYQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiAtIFBhcnNlIGEgQysrIGNsYXNzIG1lbWJlciBkZWNsYXJhdGlvbi4KQEAgLTE5OTMsMTEgKzIwNDAsMTEgQEAKICAgICAgIH0KIAogICAgICAgLy8gVE9ETzogcmVjb3ZlciBmcm9tIG1pc3Rha2VubHktcXVhbGlmaWVkIG9wZXJhdG9yIGRlY2xhcmF0aW9ucy4KLSAgICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6c2VtaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2FmdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VzcyBkZWNsYXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OnNlbWkpKQorICAgICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLCBkaWFnOjplcnJfZXhwZWN0ZWRfYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzIGRlY2xhcmF0aW9uIikpIHsKKyAgICAgICAgU2tpcFVudGlsKHRvazo6c2VtaSk7CiAgICAgICAgIHJldHVybjsKKyAgICAgIH0KIAogICAgICAgQWN0aW9ucy5BY3RPblVzaW5nRGVjbGFyYXRpb24oZ2V0Q3VyU2NvcGUoKSwgQVMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXNVc2luZ0tleXdvcmQgKi8gZmFsc2UsCkBAIC0yMDM2LDEwICsyMDgzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSW5mbywgVGVtcGxhdGVEaWFncyk7CiAgIH0KIAotICAvLyBEb24ndCBwYXJzZSBGT086QkFSIGFzIGlmIGl0IHdlcmUgYSB0eXBvIGZvciBGT086OkJBUiwgaW4gdGhpcyBjb250ZXh0IGl0Ci0gIC8vIGlzIGEgYml0ZmllbGQuCi0gIENvbG9uUHJvdGVjdGlvblJBSUlPYmplY3QgWCgqdGhpcyk7Ci0KICAgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSBhdHRycyhBdHRyRmFjdG9yeSk7CiAgIFBhcnNlZEF0dHJpYnV0ZXNXaXRoUmFuZ2UgRm5BdHRycyhBdHRyRmFjdG9yeSk7CiAgIC8vIE9wdGlvbmFsIEMrKzExIGF0dHJpYnV0ZS1zcGVjaWZpZXIKQEAgLTIwNzgsOCArMjEyMSwxNCBAQAogICBEUy50YWtlQXR0cmlidXRlc0Zyb20oYXR0cnMpOwogICBpZiAoTWFsZm9ybWVkVHlwZVNwZWMpCiAgICAgRFMuU2V0VHlwZVNwZWNFcnJvcigpOwotICBQYXJzZURlY2xhcmF0aW9uU3BlY2lmaWVycyhEUywgVGVtcGxhdGVJbmZvLCBBUywgRFNDX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29tbW9uTGF0ZVBhcnNlZEF0dHJzKTsKKworICB7CisgICAgLy8gRG9uJ3QgcGFyc2UgRk9POkJBUiBhcyBpZiBpdCB3ZXJlIGEgdHlwbyBmb3IgRk9POjpCQVIsIGluIHRoaXMgY29udGV4dCBpdAorICAgIC8vIGlzIGEgYml0ZmllbGQuCisgICAgQ29sb25Qcm90ZWN0aW9uUkFJSU9iamVjdCBYKCp0aGlzKTsKKyAgICBQYXJzZURlY2xhcmF0aW9uU3BlY2lmaWVycyhEUywgVGVtcGxhdGVJbmZvLCBBUywgRFNDX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb21tb25MYXRlUGFyc2VkQXR0cnMpOworICB9CiAKICAgLy8gSWYgd2UgaGFkIGEgZnJlZS1zdGFuZGluZyB0eXBlIGRlZmluaXRpb24gd2l0aCBhIG1pc3Npbmcgc2VtaWNvbG9uLCB3ZQogICAvLyBtYXkgZ2V0IHRoaXMgZmFyIGJlZm9yZSB0aGUgcHJvYmxlbSBiZWNvbWVzIG9idmlvdXMuCkBAIC0yMDkzLDkgKzIxNDIsNyBAQAogICAgICAgVGVtcGxhdGVJbmZvLlRlbXBsYXRlUGFyYW1zPyBUZW1wbGF0ZUluZm8uVGVtcGxhdGVQYXJhbXMtPmRhdGEoKSA6IDAsCiAgICAgICBUZW1wbGF0ZUluZm8uVGVtcGxhdGVQYXJhbXM/IFRlbXBsYXRlSW5mby5UZW1wbGF0ZVBhcmFtcy0+c2l6ZSgpIDogMCk7CiAKLSAgaWYgKFRvay5pcyh0b2s6OnNlbWkpKSB7Ci0gICAgQ29uc3VtZVRva2VuKCk7Ci0KKyAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OnNlbWkpKSB7CiAgICAgaWYgKERTLmlzRnJpZW5kU3BlY2lmaWVkKCkpCiAgICAgICBQcm9oaWJpdEF0dHJpYnV0ZXMoRm5BdHRycyk7CiAKQEAgLTIxMTQsMzAgKzIxNjEsMzAgQEAKICAgU291cmNlTG9jYXRpb24gRXF1YWxMb2M7CiAgIGJvb2wgSGFzSW5pdGlhbGl6ZXIgPSBmYWxzZTsKICAgRXhwclJlc3VsdCBJbml0OwotICBpZiAoVG9rLmlzTm90KHRvazo6Y29sb24pKSB7Ci0gICAgLy8gRG9uJ3QgcGFyc2UgRk9POkJBUiBhcyBpZiBpdCB3ZXJlIGEgdHlwbyBmb3IgRk9POjpCQVIuCi0gICAgQ29sb25Qcm90ZWN0aW9uUkFJSU9iamVjdCBYKCp0aGlzKTsKIAotICAgIC8vIFBhcnNlIHRoZSBmaXJzdCBkZWNsYXJhdG9yLgotICAgIFBhcnNlRGVjbGFyYXRvcihEZWNsYXJhdG9ySW5mbyk7Ci0gICAgLy8gRXJyb3IgcGFyc2luZyB0aGUgZGVjbGFyYXRvcj8KLSAgICBpZiAoIURlY2xhcmF0b3JJbmZvLmhhc05hbWUoKSkgewotICAgICAgLy8gSWYgc28sIHNraXAgdW50aWwgdGhlIHNlbWktY29sb24gb3IgYSB9LgotICAgICAgU2tpcFVudGlsKHRvazo6cl9icmFjZSwgU3RvcEF0U2VtaSB8IFN0b3BCZWZvcmVNYXRjaCk7Ci0gICAgICBpZiAoVG9rLmlzKHRvazo6c2VtaSkpCi0gICAgICAgIENvbnN1bWVUb2tlbigpOwotICAgICAgcmV0dXJuOwotICAgIH0KKyAgU21hbGxWZWN0b3I8RGVjbCAqLCA4PiBEZWNsc0luR3JvdXA7CisgIEV4cHJSZXN1bHQgQml0ZmllbGRTaXplOworICBib29sIEV4cGVjdFNlbWkgPSB0cnVlOwogCi0gICAgUGFyc2VPcHRpb25hbENYWDExVmlydFNwZWNpZmllclNlcShWUywgZ2V0Q3VycmVudENsYXNzKCkuSXNJbnRlcmZhY2UpOworICAvLyBQYXJzZSB0aGUgZmlyc3QgZGVjbGFyYXRvci4KKyAgUGFyc2VDWFhNZW1iZXJEZWNsYXJhdG9yQmVmb3JlSW5pdGlhbGl6ZXIoRGVjbGFyYXRvckluZm8sIFZTLCBCaXRmaWVsZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdGVQYXJzZWRBdHRycyk7CiAKLSAgICAvLyBJZiBhdHRyaWJ1dGVzIGV4aXN0IGFmdGVyIHRoZSBkZWNsYXJhdG9yLCBidXQgYmVmb3JlIGFuICd7JywgcGFyc2UgdGhlbS4KLSAgICBNYXliZVBhcnNlR05VQXR0cmlidXRlcyhEZWNsYXJhdG9ySW5mbywgJkxhdGVQYXJzZWRBdHRycyk7CisgIC8vIElmIHRoaXMgaGFzIG5laXRoZXIgYSBuYW1lIG5vciBhIGJpdCB3aWR0aCwgc29tZXRoaW5nIGhhcyBnb25lIHNlcmlvdXNseQorICAvLyB3cm9uZy4gU2tpcCB1bnRpbCB0aGUgc2VtaS1jb2xvbiBvciB9LgorICBpZiAoIURlY2xhcmF0b3JJbmZvLmhhc05hbWUoKSAmJiBCaXRmaWVsZFNpemUuaXNVbnNldCgpKSB7CisgICAgLy8gSWYgc28sIHNraXAgdW50aWwgdGhlIHNlbWktY29sb24gb3IgYSB9LgorICAgIFNraXBVbnRpbCh0b2s6OnJfYnJhY2UsIFN0b3BBdFNlbWkgfCBTdG9wQmVmb3JlTWF0Y2gpOworICAgIFRyeUNvbnN1bWVUb2tlbih0b2s6OnNlbWkpOworICAgIHJldHVybjsKKyAgfQogCi0gICAgLy8gTVNWQyBwZXJtaXRzIHB1cmUgc3BlY2lmaWVyIG9uIGlubGluZSBmdW5jdGlvbnMgZGVjbGFyZWQgYXQgY2xhc3Mgc2NvcGUuCisgIC8vIENoZWNrIGZvciBhIG1lbWJlciBmdW5jdGlvbiBkZWZpbml0aW9uLgorICBpZiAoQml0ZmllbGRTaXplLmlzVW5zZXQoKSkgeworICAgIC8vIE1TVkMgcGVybWl0cyBwdXJlIHNwZWNpZmllciBvbiBpbmxpbmUgZnVuY3Rpb25zIGRlZmluZWQgYXQgY2xhc3Mgc2NvcGUuCiAgICAgLy8gSGVuY2UgY2hlY2sgZm9yID0wIGJlZm9yZSBjaGVja2luZyBmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbi4KICAgICBpZiAoZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRFeHQgJiYgVG9rLmlzKHRvazo6ZXF1YWwpICYmCi0gICAgICAgIERlY2xhcmF0b3JJbmZvLmlzRnVuY3Rpb25EZWNsYXJhdG9yKCkgJiYgCisgICAgICAgIERlY2xhcmF0b3JJbmZvLmlzRnVuY3Rpb25EZWNsYXJhdG9yKCkgJiYKICAgICAgICAgTmV4dFRva2VuKCkuaXModG9rOjpudW1lcmljX2NvbnN0YW50KSkgewogICAgICAgRXF1YWxMb2MgPSBDb25zdW1lVG9rZW4oKTsKICAgICAgIEluaXQgPSBQYXJzZUluaXRpYWxpemVyKCk7CkBAIC0yMTgzLDggKzIyMzAsOCBAQAogICAgICAgICBTa2lwVW50aWwodG9rOjpyX2JyYWNlKTsKIAogICAgICAgICAvLyBDb25zdW1lIHRoZSBvcHRpb25hbCAnOycKLSAgICAgICAgaWYgKFRvay5pcyh0b2s6OnNlbWkpKQotICAgICAgICAgIENvbnN1bWVUb2tlbigpOworICAgICAgICBUcnlDb25zdW1lVG9rZW4odG9rOjpzZW1pKTsKKwogICAgICAgICByZXR1cm47CiAgICAgICB9CiAKQEAgLTIyMjIsNDAgKzIyNjksNyBAQAogICAvLyAgIG1lbWJlci1kZWNsYXJhdG9yCiAgIC8vICAgbWVtYmVyLWRlY2xhcmF0b3ItbGlzdCAnLCcgbWVtYmVyLWRlY2xhcmF0b3IKIAotICBTbWFsbFZlY3RvcjxEZWNsICosIDg+IERlY2xzSW5Hcm91cDsKLSAgRXhwclJlc3VsdCBCaXRmaWVsZFNpemU7Ci0gIGJvb2wgRXhwZWN0U2VtaSA9IHRydWU7Ci0KICAgd2hpbGUgKDEpIHsKLSAgICAvLyBtZW1iZXItZGVjbGFyYXRvcjoKLSAgICAvLyAgIGRlY2xhcmF0b3IgcHVyZS1zcGVjaWZpZXJbb3B0XQotICAgIC8vICAgZGVjbGFyYXRvciBicmFjZS1vci1lcXVhbC1pbml0aWFsaXplcltvcHRdCi0gICAgLy8gICBpZGVudGlmaWVyW29wdF0gJzonIGNvbnN0YW50LWV4cHJlc3Npb24KLSAgICBpZiAoVG9rLmlzKHRvazo6Y29sb24pKSB7Ci0gICAgICBDb25zdW1lVG9rZW4oKTsKLSAgICAgIEJpdGZpZWxkU2l6ZSA9IFBhcnNlQ29uc3RhbnRFeHByZXNzaW9uKCk7Ci0gICAgICBpZiAoQml0ZmllbGRTaXplLmlzSW52YWxpZCgpKQotICAgICAgICBTa2lwVW50aWwodG9rOjpjb21tYSwgU3RvcEF0U2VtaSB8IFN0b3BCZWZvcmVNYXRjaCk7Ci0gICAgfQotCi0gICAgLy8gSWYgYSBzaW1wbGUtYXNtLWV4cHIgaXMgcHJlc2VudCwgcGFyc2UgaXQuCi0gICAgaWYgKFRvay5pcyh0b2s6Omt3X2FzbSkpIHsKLSAgICAgIFNvdXJjZUxvY2F0aW9uIExvYzsKLSAgICAgIEV4cHJSZXN1bHQgQXNtTGFiZWwoUGFyc2VTaW1wbGVBc20oJkxvYykpOwotICAgICAgaWYgKEFzbUxhYmVsLmlzSW52YWxpZCgpKQotICAgICAgICBTa2lwVW50aWwodG9rOjpjb21tYSwgU3RvcEF0U2VtaSB8IFN0b3BCZWZvcmVNYXRjaCk7Ci0gCi0gICAgICBEZWNsYXJhdG9ySW5mby5zZXRBc21MYWJlbChBc21MYWJlbC5yZWxlYXNlKCkpOwotICAgICAgRGVjbGFyYXRvckluZm8uU2V0UmFuZ2VFbmQoTG9jKTsKLSAgICB9Ci0KLSAgICAvLyBJZiBhdHRyaWJ1dGVzIGV4aXN0IGFmdGVyIHRoZSBkZWNsYXJhdG9yLCBwYXJzZSB0aGVtLgotICAgIE1heWJlUGFyc2VHTlVBdHRyaWJ1dGVzKERlY2xhcmF0b3JJbmZvLCAmTGF0ZVBhcnNlZEF0dHJzKTsKLQotICAgIC8vIEZJWE1FOiBXaGVuIGcrKyBhZGRzIHN1cHBvcnQgZm9yIHRoaXMsIHdlJ2xsIG5lZWQgdG8gY2hlY2sgd2hldGhlciBpdAotICAgIC8vIGdvZXMgYmVmb3JlIG9yIGFmdGVyIHRoZSBHTlUgYXR0cmlidXRlcyBhbmQgX19hc21fXy4KLSAgICBQYXJzZU9wdGlvbmFsQ1hYMTFWaXJ0U3BlY2lmaWVyU2VxKFZTLCBnZXRDdXJyZW50Q2xhc3MoKS5Jc0ludGVyZmFjZSk7Ci0KICAgICBJbkNsYXNzSW5pdFN0eWxlIEhhc0luQ2xhc3NJbml0ID0gSUNJU19Ob0luaXQ7CiAgICAgaWYgKChUb2suaXModG9rOjplcXVhbCkgfHwgVG9rLmlzKHRvazo6bF9icmFjZSkpICYmICFIYXNJbml0aWFsaXplcikgewogICAgICAgaWYgKEJpdGZpZWxkU2l6ZS5nZXQoKSkgewpAQCAtMjI3NiwyMiArMjI5MCwxOCBAQAogCiAgICAgTmFtZWREZWNsICpUaGlzRGVjbCA9IDA7CiAgICAgaWYgKERTLmlzRnJpZW5kU3BlY2lmaWVkKCkpIHsKLSAgICAgIC8vIEMrKzExIFtkY2wuYXR0ci5ncmFtbWFyXSBwNDogSWYgYW4gYXR0cmlidXRlLXNwZWNpZmllci1zZXEgYXBwZXJ0YWlucyAKKyAgICAgIC8vIEMrKzExIFtkY2wuYXR0ci5ncmFtbWFyXSBwNDogSWYgYW4gYXR0cmlidXRlLXNwZWNpZmllci1zZXEgYXBwZXJ0YWlucwogICAgICAgLy8gdG8gYSBmcmllbmQgZGVjbGFyYXRpb24sIHRoYXQgZGVjbGFyYXRpb24gc2hhbGwgYmUgYSBkZWZpbml0aW9uLgogICAgICAgLy8KLSAgICAgIC8vIERpYWdub3NlIGF0dHJpYnV0ZXMgYXBwZWFyIGFmdGVyIGZyaWVuZCBtZW1iZXIgZnVuY3Rpb24gZGVjbGFyYXRvcjoKLSAgICAgIC8vIGZvbyBbW11dICgpOworICAgICAgLy8gRGlhZ25vc2UgYXR0cmlidXRlcyB0aGF0IGFwcGVhciBpbiBhIGZyaWVuZCBtZW1iZXIgZnVuY3Rpb24gZGVjbGFyYXRvcjoKKyAgICAgIC8vICAgZnJpZW5kIGludCBmb28gW1tdXSAoKTsKICAgICAgIFNtYWxsVmVjdG9yPFNvdXJjZVJhbmdlLCA0PiBSYW5nZXM7CiAgICAgICBEZWNsYXJhdG9ySW5mby5nZXRDWFgxMUF0dHJpYnV0ZVJhbmdlcyhSYW5nZXMpOwotICAgICAgaWYgKCFSYW5nZXMuZW1wdHkoKSkgewotICAgICAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxTb3VyY2VSYW5nZT46Oml0ZXJhdG9yIEkgPSBSYW5nZXMuYmVnaW4oKSwKLSAgICAgICAgICAgICBFID0gUmFuZ2VzLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgICAgIERpYWcoKCpJKS5nZXRCZWdpbigpLCBkaWFnOjplcnJfYXR0cmlidXRlc19ub3RfYWxsb3dlZCkgCi0gICAgICAgICAgICA8PCAqSTsKLSAgICAgICAgfQotICAgICAgfQorICAgICAgZm9yIChTbWFsbFZlY3RvckltcGw8U291cmNlUmFuZ2U+OjppdGVyYXRvciBJID0gUmFuZ2VzLmJlZ2luKCksCisgICAgICAgICAgIEUgPSBSYW5nZXMuZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICAgICBEaWFnKCgqSSkuZ2V0QmVnaW4oKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZXNfbm90X2FsbG93ZWQpIDw8ICpJOwogCi0gICAgICAvLyBUT0RPOiBoYW5kbGUgaW5pdGlhbGl6ZXJzLCBiaXRmaWVsZHMsICdkZWxldGUnCisgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5pdGlhbGl6ZXJzLCBWUywgYml0ZmllbGRzLCAnZGVsZXRlJwogICAgICAgVGhpc0RlY2wgPSBBY3Rpb25zLkFjdE9uRnJpZW5kRnVuY3Rpb25EZWNsKGdldEN1clNjb3BlKCksIERlY2xhcmF0b3JJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1zKTsKICAgICB9IGVsc2UgewpAQCAtMjM3MiwxMiArMjM4MiwxMCBAQAogCiAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNvbW1hLCBpdCBpcyBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgbGlzdCAoYSAnOycpCiAgICAgLy8gb3IgYW4gZXJyb3IsIGJhaWwgb3V0LgotICAgIGlmIChUb2suaXNOb3QodG9rOjpjb21tYSkpCisgICAgU291cmNlTG9jYXRpb24gQ29tbWFMb2M7CisgICAgaWYgKCFUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSwgQ29tbWFMb2MpKQogICAgICAgYnJlYWs7CiAKLSAgICAvLyBDb25zdW1lIHRoZSBjb21tYS4KLSAgICBTb3VyY2VMb2NhdGlvbiBDb21tYUxvYyA9IENvbnN1bWVUb2tlbigpOwotCiAgICAgaWYgKFRvay5pc0F0U3RhcnRPZkxpbmUoKSAmJgogICAgICAgICAhTWlnaHRCZURlY2xhcmF0b3IoRGVjbGFyYXRvcjo6TWVtYmVyQ29udGV4dCkpIHsKICAgICAgIC8vIFRoaXMgY29tbWEgd2FzIGZvbGxvd2VkIGJ5IGEgbGluZS1icmVhayBhbmQgc29tZXRoaW5nIHdoaWNoIGNhbid0IGJlCkBAIC0yMzk3LDExICsyNDA1LDExIEBACiAgICAgSGFzSW5pdGlhbGl6ZXIgPSBmYWxzZTsKICAgICBEZWNsYXJhdG9ySW5mby5zZXRDb21tYUxvYyhDb21tYUxvYyk7CiAKLSAgICAvLyBBdHRyaWJ1dGVzIGFyZSBvbmx5IGFsbG93ZWQgb24gdGhlIHNlY29uZCBkZWNsYXJhdG9yLgorICAgIC8vIEdOVSBhdHRyaWJ1dGVzIGFyZSBhbGxvd2VkIGJlZm9yZSB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGRlY2xhcmF0b3IuCiAgICAgTWF5YmVQYXJzZUdOVUF0dHJpYnV0ZXMoRGVjbGFyYXRvckluZm8pOwogCi0gICAgaWYgKFRvay5pc05vdCh0b2s6OmNvbG9uKSkKLSAgICAgIFBhcnNlRGVjbGFyYXRvcihEZWNsYXJhdG9ySW5mbyk7CisgICAgUGFyc2VDWFhNZW1iZXJEZWNsYXJhdG9yQmVmb3JlSW5pdGlhbGl6ZXIoRGVjbGFyYXRvckluZm8sIFZTLCBCaXRmaWVsZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZVBhcnNlZEF0dHJzKTsKICAgfQogCiAgIGlmIChFeHBlY3RTZW1pICYmCkBAIC0yNDA5LDcgKzI0MTcsNyBAQAogICAgIC8vIFNraXAgdG8gZW5kIG9mIGJsb2NrIG9yIHN0YXRlbWVudC4KICAgICBTa2lwVW50aWwodG9rOjpyX2JyYWNlLCBTdG9wQXRTZW1pIHwgU3RvcEJlZm9yZU1hdGNoKTsKICAgICAvLyBJZiB3ZSBzdG9wcGVkIGF0IGEgJzsnLCBlYXQgaXQuCi0gICAgaWYgKFRvay5pcyh0b2s6OnNlbWkpKSBDb25zdW1lVG9rZW4oKTsKKyAgICBUcnlDb25zdW1lVG9rZW4odG9rOjpzZW1pKTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtMjQ0Niw4ICsyNDU0LDcgQEAKICAgRW50ZXJFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgQ29udGV4dChBY3Rpb25zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hOjpQb3RlbnRpYWxseUV2YWx1YXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEKTsKLSAgaWYgKFRvay5pcyh0b2s6OmVxdWFsKSkgewotICAgIEVxdWFsTG9jID0gQ29uc3VtZVRva2VuKCk7CisgIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjplcXVhbCwgRXF1YWxMb2MpKSB7CiAgICAgaWYgKFRvay5pcyh0b2s6Omt3X2RlbGV0ZSkpIHsKICAgICAgIC8vIEluIHByaW5jaXBsZSwgYW4gaW5pdGlhbGl6ZXIgb2YgJz0gZGVsZXRlIHA7JyBpcyBsZWdhbCwgYnV0IGl0IHdpbGwKICAgICAgIC8vIG5ldmVyIHR5cGUtY2hlY2suIEl0J3MgYmV0dGVyIHRvIGRpYWdub3NlIGl0IGFzIGFuIGlsbC1mb3JtZWQgZXhwcmVzc2lvbgpAQCAtMjQ1Niw3ICsyNDYzLDcgQEAKICAgICAgIC8vIGEgdG9wLWxldmVsIGNvbW1hIGFsd2F5cyBlbmRzIHRoZSBpbml0aWFsaXplciBleHByZXNzaW9uLgogICAgICAgY29uc3QgVG9rZW4gJk5leHQgPSBOZXh0VG9rZW4oKTsKICAgICAgIGlmIChJc0Z1bmN0aW9uIHx8IE5leHQuaXModG9rOjpzZW1pKSB8fCBOZXh0LmlzKHRvazo6Y29tbWEpIHx8Ci0gICAgICAgICAgIE5leHQuaXModG9rOjplb2YpKSB7CisgICAgICAgICAgTmV4dC5pcyh0b2s6OmVvZikpIHsKICAgICAgICAgaWYgKElzRnVuY3Rpb24pCiAgICAgICAgICAgRGlhZyhDb25zdW1lVG9rZW4oKSwgZGlhZzo6ZXJyX2RlZmF1bHRfZGVsZXRlX2luX211bHRpcGxlX2RlY2xhcmF0aW9uKQogICAgICAgICAgICAgPDwgMSAvKiBkZWxldGUgKi87CkBAIC0yNTEwLDcgKzI1MTcsNyBAQAogICAgICAgICAgICAgPDwgLypFcnJvclR5cGU9Ki82CiAgICAgICAgICAgICA8PCAoaXNhPE5hbWVkRGVjbD4oVGFnRGVjbCkKICAgICAgICAgICAgICAgICAgID8gY2FzdDxOYW1lZERlY2w+KFRhZ0RlY2wpLT5nZXRRdWFsaWZpZWROYW1lQXNTdHJpbmcoKQotICAgICAgICAgICAgICAgICAgOiAiPGFub255bW91cz4iKTsKKyAgICAgICAgICAgICAgICAgIDogIihhbm9ueW1vdXMpIik7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0yNjAxLDcgKzI2MDgsNyBAQAogCiAgIGlmIChUYWdEZWNsKSB7CiAgICAgLy8gV2hpbGUgd2Ugc3RpbGwgaGF2ZSBzb21ldGhpbmcgdG8gcmVhZCwgcmVhZCB0aGUgbWVtYmVyLWRlY2xhcmF0aW9ucy4KLSAgICB3aGlsZSAoVG9rLmlzTm90KHRvazo6cl9icmFjZSkgJiYgVG9rLmlzTm90KHRvazo6ZW9mKSkgeworICAgIHdoaWxlIChUb2suaXNOb3QodG9rOjpyX2JyYWNlKSAmJiAhaXNFb2ZPckVvbSgpKSB7CiAgICAgICAvLyBFYWNoIGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3AgcmVhZHMgb25lIG1lbWJlci1kZWNsYXJhdGlvbi4KIAogICAgICAgaWYgKGdldExhbmdPcHRzKCkuTWljcm9zb2Z0RXh0ICYmIChUb2suaXModG9rOjprd19fX2lmX2V4aXN0cykgfHwKQEAgLTI2MzYsNiArMjY0MywxMSBAQAogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KIAorICAgICAgaWYgKFRvay5pcyh0b2s6OmFubm90X3ByYWdtYV9tc19wb2ludGVyc190b19tZW1iZXJzKSkgeworICAgICAgICBIYW5kbGVQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzKCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCiAgICAgICAvLyBJZiB3ZSBzZWUgYSBuYW1lc3BhY2UgaGVyZSwgYSBjbG9zZSBicmFjZSB3YXMgbWlzc2luZyBzb21ld2hlcmUuCiAgICAgICBpZiAoVG9rLmlzKHRvazo6a3dfbmFtZXNwYWNlKSkgewogICAgICAgICBEaWFnbm9zZVVuZXhwZWN0ZWROYW1lc3BhY2UoY2FzdDxOYW1lZERlY2w+KFRhZ0RlY2wpKTsKQEAgLTI2NTMsMTggKzI2NjUsMTQgQEAKICAgICAgICAgTWF5YmVQYXJzZUdOVUF0dHJpYnV0ZXMoQWNjZXNzQXR0cnMpOwogCiAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYzsKLSAgICAgICAgaWYgKFRvay5pcyh0b2s6OmNvbG9uKSkgewotICAgICAgICAgIEVuZExvYyA9IFRvay5nZXRMb2NhdGlvbigpOwotICAgICAgICAgIENvbnN1bWVUb2tlbigpOwotICAgICAgICB9IGVsc2UgaWYgKFRvay5pcyh0b2s6OnNlbWkpKSB7Ci0gICAgICAgICAgRW5kTG9jID0gVG9rLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgQ29uc3VtZVRva2VuKCk7Ci0gICAgICAgICAgRGlhZyhFbmRMb2MsIGRpYWc6OmVycl9leHBlY3RlZF9jb2xvbikgCi0gICAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlcGxhY2VtZW50KEVuZExvYywgIjoiKTsKKyAgICAgICAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OmNvbG9uLCBFbmRMb2MpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6c2VtaSwgRW5kTG9jKSkgeworICAgICAgICAgIERpYWcoRW5kTG9jLCBkaWFnOjplcnJfZXhwZWN0ZWQpCisgICAgICAgICAgICAgIDw8IHRvazo6Y29sb24gPDwgRml4SXRIaW50OjpDcmVhdGVSZXBsYWNlbWVudChFbmRMb2MsICI6Iik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgRW5kTG9jID0gQVNMb2MuZ2V0TG9jV2l0aE9mZnNldChUb2tMZW5ndGgpOwotICAgICAgICAgIERpYWcoRW5kTG9jLCBkaWFnOjplcnJfZXhwZWN0ZWRfY29sb24pIAotICAgICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oRW5kTG9jLCAiOiIpOworICAgICAgICAgIERpYWcoRW5kTG9jLCBkaWFnOjplcnJfZXhwZWN0ZWQpCisgICAgICAgICAgICAgIDw8IHRvazo6Y29sb24gPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oRW5kTG9jLCAiOiIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gVGhlIE1pY3Jvc29mdCBleHRlbnNpb24gX19pbnRlcmZhY2UgZG9lcyBub3QgcGVybWl0IG5vbi1wdWJsaWMKQEAgLTI4MTAsNyArMjgxOCw4IEBACiAgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKExvYywgIiwgIik7CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIFNraXAgb3ZlciBnYXJiYWdlLCB1bnRpbCB3ZSBnZXQgdG8gJ3snLiAgRG9uJ3QgZWF0IHRoZSAneycuCi0gICAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWRfbGJyYWNlX29yX2NvbW1hKTsKKyAgICAgIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZF9laXRoZXIpIDw8IHRvazo6bF9icmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdG9rOjpjb21tYTsKICAgICAgIFNraXBVbnRpbCh0b2s6OmxfYnJhY2UsIFN0b3BBdFNlbWkgfCBTdG9wQmVmb3JlTWF0Y2gpOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMjg3OCw4ICsyODg3LDcgQEAKICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgU291cmNlTG9jYXRpb24gRWxsaXBzaXNMb2M7Ci0gICAgaWYgKFRvay5pcyh0b2s6OmVsbGlwc2lzKSkKLSAgICAgIEVsbGlwc2lzTG9jID0gQ29uc3VtZVRva2VuKCk7CisgICAgVHJ5Q29uc3VtZVRva2VuKHRvazo6ZWxsaXBzaXMsIEVsbGlwc2lzTG9jKTsKIAogICAgIHJldHVybiBBY3Rpb25zLkFjdE9uTWVtSW5pdGlhbGl6ZXIoQ29uc3RydWN0b3JEZWNsLCBnZXRDdXJTY29wZSgpLCBTUywgSUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVR5cGVUeSwgRFMsIElkTG9jLCAKQEAgLTI4OTksOCArMjkwNyw3IEBACiAgICAgVC5jb25zdW1lQ2xvc2UoKTsKIAogICAgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOwotICAgIGlmIChUb2suaXModG9rOjplbGxpcHNpcykpCi0gICAgICBFbGxpcHNpc0xvYyA9IENvbnN1bWVUb2tlbigpOworICAgIFRyeUNvbnN1bWVUb2tlbih0b2s6OmVsbGlwc2lzLCBFbGxpcHNpc0xvYyk7CiAKICAgICByZXR1cm4gQWN0aW9ucy5BY3RPbk1lbUluaXRpYWxpemVyKENvbnN0cnVjdG9yRGVjbCwgZ2V0Q3VyU2NvcGUoKSwgU1MsIElJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVUeXBlVHksIERTLCBJZExvYywKQEAgLTI5MDgsOSArMjkxNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5nZXRDbG9zZUxvY2F0aW9uKCksIEVsbGlwc2lzTG9jKTsKICAgfQogCi0gIERpYWcoVG9rLCBnZXRMYW5nT3B0cygpLkNQbHVzUGx1czExID8gZGlhZzo6ZXJyX2V4cGVjdGVkX2xwYXJlbl9vcl9sYnJhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6OmVycl9leHBlY3RlZF9scGFyZW4pOwotICByZXR1cm4gdHJ1ZTsKKyAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEpCisgICAgcmV0dXJuIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfZWl0aGVyKSA8PCB0b2s6OmxfcGFyZW4gPDwgdG9rOjpsX2JyYWNlOworICBlbHNlCisgICAgcmV0dXJuIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6bF9wYXJlbjsKIH0KIAogLy8vIFxicmllZiBQYXJzZSBhIEMrKyBleGNlcHRpb24tc3BlY2lmaWNhdGlvbiBpZiBwcmVzZW50IChDKysweCBbZXhjZXB0LnNwZWNdKS4KQEAgLTMwNTQsMTAgKzMwNjIsOCBAQAogICAgICAgRXhjZXB0aW9ucy5wdXNoX2JhY2soUmVzLmdldCgpKTsKICAgICAgIFJhbmdlcy5wdXNoX2JhY2soUmFuZ2UpOwogICAgIH0KLSAgICAKLSAgICBpZiAoVG9rLmlzKHRvazo6Y29tbWEpKQotICAgICAgQ29uc3VtZVRva2VuKCk7Ci0gICAgZWxzZQorCisgICAgaWYgKCFUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpCiAgICAgICBicmVhazsKICAgfQogCkBAIC0zMTkzLDggKzMxOTksNTAgQEAKICAgfQogfQogCi0vLy8gUGFyc2VDWFgxMUF0dHJpYnV0ZVNwZWNpZmllciAtIFBhcnNlIGEgQysrMTEgYXR0cmlidXRlLXNwZWNpZmllci4gQ3VycmVudGx5Ci0vLy8gb25seSBwYXJzZXMgc3RhbmRhcmQgYXR0cmlidXRlcy4KKy8vLyBQYXJzZUNYWDExQXR0cmlidXRlQXJncyAtLSBQYXJzZSBhIEMrKzExIGF0dHJpYnV0ZS1hcmd1bWVudC1jbGF1c2UuCisvLy8KKy8vLyBbQysrMTFdIGF0dHJpYnV0ZS1hcmd1bWVudC1jbGF1c2U6CisvLy8gICAgICAgICAnKCcgYmFsYW5jZWQtdG9rZW4tc2VxICcpJworLy8vCisvLy8gW0MrKzExXSBiYWxhbmNlZC10b2tlbi1zZXE6CisvLy8gICAgICAgICBiYWxhbmNlZC10b2tlbgorLy8vICAgICAgICAgYmFsYW5jZWQtdG9rZW4tc2VxIGJhbGFuY2VkLXRva2VuCisvLy8KKy8vLyBbQysrMTFdIGJhbGFuY2VkLXRva2VuOgorLy8vICAgICAgICAgJygnIGJhbGFuY2VkLXRva2VuLXNlcSAnKScKKy8vLyAgICAgICAgICdbJyBiYWxhbmNlZC10b2tlbi1zZXEgJ10nCisvLy8gICAgICAgICAneycgYmFsYW5jZWQtdG9rZW4tc2VxICd9JworLy8vICAgICAgICAgYW55IHRva2VuIGJ1dCAnKCcsICcpJywgJ1snLCAnXScsICd7Jywgb3IgJ30nCitib29sIFBhcnNlcjo6UGFyc2VDWFgxMUF0dHJpYnV0ZUFyZ3MoSWRlbnRpZmllckluZm8gKkF0dHJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0dHJOYW1lTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZEF0dHJpYnV0ZXMgJkF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uICpFbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlNjb3BlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTY29wZUxvYykgeworICBhc3NlcnQoVG9rLmlzKHRvazo6bF9wYXJlbikgJiYgIk5vdCBhIEMrKzExIGF0dHJpYnV0ZSBhcmd1bWVudCBsaXN0Iik7CisKKyAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpc24ndCBrbm93biwgd2Ugd2lsbCBub3QgYXR0ZW1wdCB0byBwYXJzZSBhbnkKKyAgLy8gYXJndW1lbnRzLgorICBpZiAoIWhhc0F0dHJpYnV0ZShBdHRyU3ludGF4OjpDWFgsIFNjb3BlTmFtZSwgQXR0ck5hbWUsCisgICAgICAgICAgICAgICAgICAgIGdldFRhcmdldEluZm8oKS5nZXRUcmlwbGUoKSwgZ2V0TGFuZ09wdHMoKSkpIHsKKyAgICAvLyBFYXQgdGhlIGxlZnQgcGFyZW4sIHRoZW4gc2tpcCB0byB0aGUgZW5kaW5nIHJpZ2h0IHBhcmVuLgorICAgIENvbnN1bWVQYXJlbigpOworICAgIFNraXBVbnRpbCh0b2s6OnJfcGFyZW4pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChTY29wZU5hbWUgJiYgU2NvcGVOYW1lLT5nZXROYW1lKCkgPT0gImdudSIpCisgICAgLy8gR05VLXNjb3BlZCBhdHRyaWJ1dGVzIGhhdmUgc29tZSBzcGVjaWFsIGNhc2VzIHRvIGhhbmRsZSBHTlUtc3BlY2lmaWMKKyAgICAvLyBiZWhhdmlvcnMuCisgICAgUGFyc2VHTlVBdHRyaWJ1dGVBcmdzKEF0dHJOYW1lLCBBdHRyTmFtZUxvYywgQXR0cnMsIEVuZExvYywgU2NvcGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTY29wZUxvYywgQXR0cmlidXRlTGlzdDo6QVNfQ1hYMTEsIDApOworICBlbHNlCisgICAgUGFyc2VBdHRyaWJ1dGVBcmdzQ29tbW9uKEF0dHJOYW1lLCBBdHRyTmFtZUxvYywgQXR0cnMsIEVuZExvYywgU2NvcGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY29wZUxvYywgQXR0cmlidXRlTGlzdDo6QVNfQ1hYMTEpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFBhcnNlQ1hYMTFBdHRyaWJ1dGVTcGVjaWZpZXIgLSBQYXJzZSBhIEMrKzExIGF0dHJpYnV0ZS1zcGVjaWZpZXIuCiAvLy8KIC8vLyBbQysrMTFdIGF0dHJpYnV0ZS1zcGVjaWZpZXI6CiAvLy8gICAgICAgICAnWycgJ1snIGF0dHJpYnV0ZS1saXN0ICddJyAnXScKQEAgLTMyMTgsMTkgKzMyNjYsNiBAQAogLy8vCiAvLy8gW0MrKzExXSBhdHRyaWJ1dGUtbmFtZXNwYWNlOgogLy8vICAgICAgICAgaWRlbnRpZmllcgotLy8vCi0vLy8gW0MrKzExXSBhdHRyaWJ1dGUtYXJndW1lbnQtY2xhdXNlOgotLy8vICAgICAgICAgJygnIGJhbGFuY2VkLXRva2VuLXNlcSAnKScKLS8vLwotLy8vIFtDKysxMV0gYmFsYW5jZWQtdG9rZW4tc2VxOgotLy8vICAgICAgICAgYmFsYW5jZWQtdG9rZW4KLS8vLyAgICAgICAgIGJhbGFuY2VkLXRva2VuLXNlcSBiYWxhbmNlZC10b2tlbgotLy8vCi0vLy8gW0MrKzExXSBiYWxhbmNlZC10b2tlbjoKLS8vLyAgICAgICAgICcoJyBiYWxhbmNlZC10b2tlbi1zZXEgJyknCi0vLy8gICAgICAgICAnWycgYmFsYW5jZWQtdG9rZW4tc2VxICddJwotLy8vICAgICAgICAgJ3snIGJhbGFuY2VkLXRva2VuLXNlcSAnfScKLS8vLyAgICAgICAgIGFueSB0b2tlbiBidXQgJygnLCAnKScsICdbJywgJ10nLCAneycsIG9yICd9Jwogdm9pZCBQYXJzZXI6OlBhcnNlQ1hYMTFBdHRyaWJ1dGVTcGVjaWZpZXIoUGFyc2VkQXR0cmlidXRlcyAmYXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAqZW5kTG9jKSB7CiAgIGlmIChUb2suaXModG9rOjprd19hbGlnbmFzKSkgewpAQCAtMzI1MSwxMCArMzI4Niw4IEBACiAKICAgd2hpbGUgKFRvay5pc05vdCh0b2s6OnJfc3F1YXJlKSkgewogICAgIC8vIGF0dHJpYnV0ZSBub3QgcHJlc2VudAotICAgIGlmIChUb2suaXModG9rOjpjb21tYSkpIHsKLSAgICAgIENvbnN1bWVUb2tlbigpOworICAgIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpCiAgICAgICBjb250aW51ZTsKLSAgICB9CiAKICAgICBTb3VyY2VMb2NhdGlvbiBTY29wZUxvYywgQXR0ckxvYzsKICAgICBJZGVudGlmaWVySW5mbyAqU2NvcGVOYW1lID0gMCwgKkF0dHJOYW1lID0gMDsKQEAgLTMyNjUsNDMgKzMyOTgsMzQgQEAKICAgICAgIGJyZWFrOwogCiAgICAgLy8gc2NvcGVkIGF0dHJpYnV0ZQotICAgIGlmIChUb2suaXModG9rOjpjb2xvbmNvbG9uKSkgewotICAgICAgQ29uc3VtZVRva2VuKCk7Ci0KKyAgICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29sb25jb2xvbikpIHsKICAgICAgIFNjb3BlTmFtZSA9IEF0dHJOYW1lOwogICAgICAgU2NvcGVMb2MgPSBBdHRyTG9jOwogCiAgICAgICBBdHRyTmFtZSA9IFRyeVBhcnNlQ1hYMTFBdHRyaWJ1dGVJZGVudGlmaWVyKEF0dHJMb2MpOwogICAgICAgaWYgKCFBdHRyTmFtZSkgewotICAgICAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOworICAgICAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6aWRlbnRpZmllcjsKICAgICAgICAgU2tpcFVudGlsKHRvazo6cl9zcXVhcmUsIHRvazo6Y29tbWEsIFN0b3BBdFNlbWkgfCBTdG9wQmVmb3JlTWF0Y2gpOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KICAgICB9CiAKLSAgICBib29sIFN0YW5kYXJkQXR0ciA9IElzQnVpbHRJbk9yU3RhbmRhcmRDWFgxMUF0dHJpYnV0ZShBdHRyTmFtZSxTY29wZU5hbWUpOworICAgIGJvb2wgU3RhbmRhcmRBdHRyID0gSXNCdWlsdEluT3JTdGFuZGFyZENYWDExQXR0cmlidXRlKEF0dHJOYW1lLCBTY29wZU5hbWUpOwogICAgIGJvb2wgQXR0clBhcnNlZCA9IGZhbHNlOwogCiAgICAgaWYgKFN0YW5kYXJkQXR0ciAmJgogICAgICAgICAhU2VlbkF0dHJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihBdHRyTmFtZSwgQXR0ckxvYykpLnNlY29uZCkKICAgICAgIERpYWcoQXR0ckxvYywgZGlhZzo6ZXJyX2N4eDExX2F0dHJpYnV0ZV9yZXBlYXRlZCkKLSAgICAgICAgPDwgQXR0ck5hbWUgPDwgU291cmNlUmFuZ2UoU2VlbkF0dHJzW0F0dHJOYW1lXSk7CisgICAgICAgICAgPDwgQXR0ck5hbWUgPDwgU291cmNlUmFuZ2UoU2VlbkF0dHJzW0F0dHJOYW1lXSk7CiAKICAgICAvLyBQYXJzZSBhdHRyaWJ1dGUgYXJndW1lbnRzCiAgICAgaWYgKFRvay5pcyh0b2s6OmxfcGFyZW4pKSB7Ci0gICAgICBpZiAoU2NvcGVOYW1lICYmIFNjb3BlTmFtZS0+Z2V0TmFtZSgpID09ICJnbnUiKSB7Ci0gICAgICAgIFBhcnNlR05VQXR0cmlidXRlQXJncyhBdHRyTmFtZSwgQXR0ckxvYywgYXR0cnMsIGVuZExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlTmFtZSwgU2NvcGVMb2MsIEF0dHJpYnV0ZUxpc3Q6OkFTX0NYWDExKTsKLSAgICAgICAgQXR0clBhcnNlZCA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoU3RhbmRhcmRBdHRyKQotICAgICAgICAgIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9jeHgxMV9hdHRyaWJ1dGVfZm9yYmlkc19hcmd1bWVudHMpCisgICAgICBpZiAoU3RhbmRhcmRBdHRyKQorICAgICAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfY3h4MTFfYXR0cmlidXRlX2ZvcmJpZHNfYXJndW1lbnRzKQogICAgICAgICAgICAgPDwgQXR0ck5hbWUtPmdldE5hbWUoKTsKIAotICAgICAgICAvLyBGSVhNRTogaGFuZGxlIG90aGVyIGZvcm1hdHMgb2YgYysrMTEgYXR0cmlidXRlIGFyZ3VtZW50cwotICAgICAgICBDb25zdW1lUGFyZW4oKTsKLSAgICAgICAgU2tpcFVudGlsKHRvazo6cl9wYXJlbik7Ci0gICAgICB9CisgICAgICBBdHRyUGFyc2VkID0gUGFyc2VDWFgxMUF0dHJpYnV0ZUFyZ3MoQXR0ck5hbWUsIEF0dHJMb2MsIGF0dHJzLCBlbmRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGVOYW1lLCBTY29wZUxvYyk7CiAgICAgfQogCiAgICAgaWYgKCFBdHRyUGFyc2VkKQpAQCAtMzMxMCwxOSArMzMzNCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJMb2MpLAogICAgICAgICAgICAgICAgICAgIFNjb3BlTmFtZSwgU2NvcGVMb2MsIDAsIDAsIEF0dHJpYnV0ZUxpc3Q6OkFTX0NYWDExKTsKIAotICAgIGlmIChUb2suaXModG9rOjplbGxpcHNpcykpIHsKLSAgICAgIENvbnN1bWVUb2tlbigpOwotCisgICAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OmVsbGlwc2lzKSkKICAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfY3h4MTFfYXR0cmlidXRlX2ZvcmJpZHNfZWxsaXBzaXMpCiAgICAgICAgIDw8IEF0dHJOYW1lLT5nZXROYW1lKCk7Ci0gICAgfQogICB9CiAKLSAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpyX3NxdWFyZSwgZGlhZzo6ZXJyX2V4cGVjdGVkX3JzcXVhcmUpKQorICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnJfc3F1YXJlKSkKICAgICBTa2lwVW50aWwodG9rOjpyX3NxdWFyZSk7CiAgIGlmIChlbmRMb2MpCiAgICAgKmVuZExvYyA9IFRvay5nZXRMb2NhdGlvbigpOwotICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnJfc3F1YXJlLCBkaWFnOjplcnJfZXhwZWN0ZWRfcnNxdWFyZSkpCisgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6cl9zcXVhcmUpKQogICAgIFNraXBVbnRpbCh0b2s6OnJfc3F1YXJlKTsKIH0KIApAQCAtMzM5Myw3ICszNDE0LDcgQEAKICAgICBDb25zdW1lQnJhY2tldCgpOwogICAgIFNraXBVbnRpbCh0b2s6OnJfc3F1YXJlLCBTdG9wQXRTZW1pIHwgU3RvcEJlZm9yZU1hdGNoKTsKICAgICBpZiAoZW5kTG9jKSAqZW5kTG9jID0gVG9rLmdldExvY2F0aW9uKCk7Ci0gICAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnJfc3F1YXJlLCBkaWFnOjplcnJfZXhwZWN0ZWRfcnNxdWFyZSk7CisgICAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnJfc3F1YXJlKTsKICAgfQogfQogCkBAIC0zNDA1LDcgKzM0MjYsNyBAQAogICAKICAgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyIEJyYWNlcygqdGhpcywgdG9rOjpsX2JyYWNlKTsKICAgaWYgKEJyYWNlcy5jb25zdW1lT3BlbigpKSB7Ci0gICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9sYnJhY2UpOworICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6bF9icmFjZTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtMzQyNCw3ICszNDQ1LDcgQEAKICAgICByZXR1cm47CiAgIH0KIAotICB3aGlsZSAoVG9rLmlzTm90KHRvazo6cl9icmFjZSkgJiYgVG9rLmlzTm90KHRvazo6ZW9mKSkgeworICB3aGlsZSAoVG9rLmlzTm90KHRvazo6cl9icmFjZSkgJiYgIWlzRW9mT3JFb20oKSkgewogICAgIC8vIF9faWZfZXhpc3RzLCBfX2lmX25vdF9leGlzdHMgY2FuIG5lc3QuCiAgICAgaWYgKChUb2suaXModG9rOjprd19fX2lmX2V4aXN0cykgfHwgVG9rLmlzKHRvazo6a3dfX19pZl9ub3RfZXhpc3RzKSkpIHsKICAgICAgIFBhcnNlTWljcm9zb2Z0SWZFeGlzdHNDbGFzc0RlY2xhcmF0aW9uKChEZWNsU3BlYzo6VFNUKVRhZ1R5cGUsIEN1ckFTKTsKQEAgLTM0NDYsNyArMzQ2Nyw3IEBACiAgICAgICBpZiAoVG9rLmlzKHRvazo6Y29sb24pKQogICAgICAgICBBY3Rpb25zLkFjdE9uQWNjZXNzU3BlY2lmaWVyKEFTLCBBU0xvYywgVG9rLmdldExvY2F0aW9uKCkpOwogICAgICAgZWxzZQotICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbG9uKTsKKyAgICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjpjb2xvbjsKICAgICAgIENvbnN1bWVUb2tlbigpOwogICAgICAgY29udGludWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL1BhcnNlL1BhcnNlRXhwci5jcHAgYi9saWIvUGFyc2UvUGFyc2VFeHByLmNwcAppbmRleCA0NWYxYjFkLi5lZDlkNzJkIDEwMDY0NAotLS0gYS9saWIvUGFyc2UvUGFyc2VFeHByLmNwcAorKysgYi9saWIvUGFyc2UvUGFyc2VFeHByLmNwcApAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSAiY2xhbmcvUGFyc2UvUGFyc2VyLmgiCiAjaW5jbHVkZSAiUkFJSU9iamVjdHNGb3JQYXJzZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ByZXR0eVN0YWNrVHJhY2UuaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL0RlY2xTcGVjLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9QYXJzZWRUZW1wbGF0ZS5oIgpAQCAtMjY5LDEwICsyNzAsNyBAQAogICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXh0X2dudV9jb25kaXRpb25hbF9leHByKTsKICAgICAgIH0KIAotICAgICAgaWYgKFRvay5pcyh0b2s6OmNvbG9uKSkgewotICAgICAgICAvLyBFYXQgdGhlIGNvbG9uLgotICAgICAgICBDb2xvbkxvYyA9IENvbnN1bWVUb2tlbigpOwotICAgICAgfSBlbHNlIHsKKyAgICAgIGlmICghVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29sb24sIENvbG9uTG9jKSkgewogICAgICAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIG1pc3NpbmcgYSAnOicuICBBc3N1bWUgdGhhdCB0aGlzIHdhcyBhIHR5cG8gdGhhdAogICAgICAgICAvLyB0aGUgdXNlciBmb3Jnb3QuIElmIHdlJ3JlIG5vdCBpbiBhIG1hY3JvIGV4cGFuc2lvbiwgd2UgY2FuIHN1Z2dlc3QKICAgICAgICAgLy8gYSBmaXhpdCBoaW50LiBJZiB0aGVyZSB3ZXJlIHR3byBzcGFjZXMgYmVmb3JlIHRoZSBjdXJyZW50IHRva2VuLApAQCAtMjk0LDEwICsyOTIsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfY29sb24pCi0gICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oRklMb2MsIEZJVGV4dCk7Ci0gICAgICAgIERpYWcoT3BUb2tlbiwgZGlhZzo6bm90ZV9tYXRjaGluZykgPDwgIj8iOworCisgICAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpCisgICAgICAgICAgICA8PCB0b2s6OmNvbG9uIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKEZJTG9jLCBGSVRleHQpOworICAgICAgICBEaWFnKE9wVG9rZW4sIGRpYWc6Om5vdGVfbWF0Y2hpbmcpIDw8IHRvazo6cXVlc3Rpb247CiAgICAgICAgIENvbG9uTG9jID0gVG9rLmdldExvY2F0aW9uKCk7CiAgICAgICB9CiAgICAgfQpAQCAtNDMwLDcgKzQyOCw3IEBACiAgICAgV2FudFR5cGVTcGVjaWZpZXJzID0gQWxsb3dUeXBlczsKICAgfQogCi0gIHZpcnR1YWwgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSB7CisgIGJvb2wgVmFsaWRhdGVDYW5kaWRhdGUoY29uc3QgVHlwb0NvcnJlY3Rpb24gJmNhbmRpZGF0ZSkgb3ZlcnJpZGUgewogICAgIE5hbWVkRGVjbCAqTkQgPSBjYW5kaWRhdGUuZ2V0Q29ycmVjdGlvbkRlY2woKTsKICAgICBpZiAoIU5EKQogICAgICAgcmV0dXJuIGNhbmRpZGF0ZS5pc0tleXdvcmQoKTsKQEAgLTcxNSw0OCArNzEzLDExIEBACiAgICAgICAvLyBJZiB0aGlzIGlkZW50aWZpZXIgd2FzIHJldmVydGVkIGZyb20gYSB0b2tlbiBJRCwgYW5kIHRoZSBuZXh0IHRva2VuCiAgICAgICAvLyBpcyBhIHBhcmVudGhlc2lzLCB0aGlzIGlzIGxpa2VseSB0byBiZSBhIHVzZSBvZiBhIHR5cGUgdHJhaXQuIENoZWNrCiAgICAgICAvLyB0aG9zZSB0b2tlbnMuCi0gICAgICBpZiAoTmV4dC5pcyh0b2s6OmxfcGFyZW4pICYmCi0gICAgICAgICAgVG9rLmlzKHRvazo6aWRlbnRpZmllcikgJiYKLSAgICAgICAgICBUb2suZ2V0SWRlbnRpZmllckluZm8oKS0+aGFzUmV2ZXJ0ZWRUb2tlbklEVG9JZGVudGlmaWVyKCkpIHsKLSAgICAgICAgSWRlbnRpZmllckluZm8gKklJID0gVG9rLmdldElkZW50aWZpZXJJbmZvKCk7Ci0gICAgICAgIC8vIEJ1aWxkIHVwIHRoZSBtYXBwaW5nIG9mIHJldmVydGFibGUgdHlwZSB0cmFpdHMsIGZvciBmdXR1cmUgdXNlLgotICAgICAgICBpZiAoUmV2ZXJ0YWJsZVR5cGVUcmFpdHMuZW1wdHkoKSkgewotI2RlZmluZSBSVFRfSk9JTihYLFkpIFgjI1kKLSNkZWZpbmUgUkVWRVJUQUJMRV9UWVBFX1RSQUlUKE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBSZXZlcnRhYmxlVHlwZVRyYWl0c1tQUC5nZXRJZGVudGlmaWVySW5mbygjTmFtZSldIFwKLSAgICAgICAgICAgID0gUlRUX0pPSU4odG9rOjprd18sTmFtZSkKLQotICAgICAgICAgIFJFVkVSVEFCTEVfVFlQRV9UUkFJVChfX2lzX2FyaXRobWV0aWMpOwotICAgICAgICAgIFJFVkVSVEFCTEVfVFlQRV9UUkFJVChfX2lzX2NvbnZlcnRpYmxlKTsKLSAgICAgICAgICBSRVZFUlRBQkxFX1RZUEVfVFJBSVQoX19pc19lbXB0eSk7Ci0gICAgICAgICAgUkVWRVJUQUJMRV9UWVBFX1RSQUlUKF9faXNfZmxvYXRpbmdfcG9pbnQpOwotICAgICAgICAgIFJFVkVSVEFCTEVfVFlQRV9UUkFJVChfX2lzX2Z1bmN0aW9uKTsKLSAgICAgICAgICBSRVZFUlRBQkxFX1RZUEVfVFJBSVQoX19pc19mdW5kYW1lbnRhbCk7Ci0gICAgICAgICAgUkVWRVJUQUJMRV9UWVBFX1RSQUlUKF9faXNfaW50ZWdyYWwpOwotICAgICAgICAgIFJFVkVSVEFCTEVfVFlQRV9UUkFJVChfX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyKTsKLSAgICAgICAgICBSRVZFUlRBQkxFX1RZUEVfVFJBSVQoX19pc19tZW1iZXJfcG9pbnRlcik7Ci0gICAgICAgICAgUkVWRVJUQUJMRV9UWVBFX1RSQUlUKF9faXNfcG9kKTsKLSAgICAgICAgICBSRVZFUlRBQkxFX1RZUEVfVFJBSVQoX19pc19wb2ludGVyKTsKLSAgICAgICAgICBSRVZFUlRBQkxFX1RZUEVfVFJBSVQoX19pc19zYW1lKTsKLSAgICAgICAgICBSRVZFUlRBQkxFX1RZUEVfVFJBSVQoX19pc19zY2FsYXIpOwotICAgICAgICAgIFJFVkVSVEFCTEVfVFlQRV9UUkFJVChfX2lzX3NpZ25lZCk7Ci0gICAgICAgICAgUkVWRVJUQUJMRV9UWVBFX1RSQUlUKF9faXNfdW5zaWduZWQpOwotICAgICAgICAgIFJFVkVSVEFCTEVfVFlQRV9UUkFJVChfX2lzX3ZvaWQpOwotI3VuZGVmIFJFVkVSVEFCTEVfVFlQRV9UUkFJVAotI3VuZGVmIFJUVF9KT0lOCi0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSBmaW5kIHRoYXQgdGhpcyBpcyBpbiBmYWN0IHRoZSBuYW1lIG9mIGEgdHlwZSB0cmFpdCwKLSAgICAgICAgLy8gdXBkYXRlIHRoZSB0b2tlbiBraW5kIGluIHBsYWNlIGFuZCBwYXJzZSBhZ2FpbiB0byB0cmVhdCBpdCBhcwotICAgICAgICAvLyB0aGUgYXBwcm9wcmlhdGUga2luZCBvZiB0eXBlIHRyYWl0LgotICAgICAgICBsbHZtOjpTbWFsbERlbnNlTWFwPElkZW50aWZpZXJJbmZvICosIHRvazo6VG9rZW5LaW5kPjo6aXRlcmF0b3IgS25vd24KLSAgICAgICAgICA9IFJldmVydGFibGVUeXBlVHJhaXRzLmZpbmQoSUkpOwotICAgICAgICBpZiAoS25vd24gIT0gUmV2ZXJ0YWJsZVR5cGVUcmFpdHMuZW5kKCkpIHsKLSAgICAgICAgICBUb2suc2V0S2luZChLbm93bi0+c2Vjb25kKTsKLSAgICAgICAgICByZXR1cm4gUGFyc2VDYXN0RXhwcmVzc2lvbihpc1VuYXJ5RXhwcmVzc2lvbiwgaXNBZGRyZXNzT2ZPcGVyYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdENhc3RFeHByLCBpc1R5cGVDYXN0KTsKLSAgICAgICAgfQotICAgICAgfQorICAgICAgaWYgKE5leHQuaXModG9rOjpsX3BhcmVuKSAmJiBUb2suaXModG9rOjppZGVudGlmaWVyKSAmJgorICAgICAgICAgIFRvay5nZXRJZGVudGlmaWVySW5mbygpLT5oYXNSZXZlcnRlZFRva2VuSURUb0lkZW50aWZpZXIoKSAmJgorICAgICAgICAgIFRyeUlkZW50S2V5d29yZFVwZ3JhZGUoKSkKKyAgICAgICAgcmV0dXJuIFBhcnNlQ2FzdEV4cHJlc3Npb24oaXNVbmFyeUV4cHJlc3Npb24sIGlzQWRkcmVzc09mT3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90Q2FzdEV4cHIsIGlzVHlwZUNhc3QpOwogCiAgICAgICBpZiAoTmV4dC5pcyh0b2s6OmNvbG9uY29sb24pIHx8CiAgICAgICAgICAgKCFDb2xvbklzU2FjcmVkICYmIE5leHQuaXModG9rOjpjb2xvbikpIHx8CkBAIC04MzAsNyArNzkxLDggQEAKICAgICAgICAgICAgIERTLlNldFJhbmdlRW5kKElMb2MpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqUHJldlNwZWMgPSAwOwogICAgICAgICAgICAgdW5zaWduZWQgRGlhZ0lEOwotICAgICAgICAgICAgRFMuU2V0VHlwZVNwZWNUeXBlKFRTVF90eXBlbmFtZSwgSUxvYywgUHJldlNwZWMsIERpYWdJRCwgVHlwKTsKKyAgICAgICAgICAgIERTLlNldFR5cGVTcGVjVHlwZShUU1RfdHlwZW5hbWUsIElMb2MsIFByZXZTcGVjLCBEaWFnSUQsIFR5cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25zLmdldEFTVENvbnRleHQoKS5nZXRQcmludGluZ1BvbGljeSgpKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgRGVjbGFyYXRvciBEZWNsYXJhdG9ySW5mbyhEUywgRGVjbGFyYXRvcjo6VHlwZU5hbWVDb250ZXh0KTsKICAgICAgICAgICAgIFR5cGVSZXN1bHQgVHkgPSBBY3Rpb25zLkFjdE9uVHlwZU5hbWUoZ2V0Q3VyU2NvcGUoKSwgCkBAIC05NTUsNyArOTE3LDcgQEAKICAgY2FzZSB0b2s6OmFtcGFtcDogeyAgICAgIC8vIHVuYXJ5LWV4cHJlc3Npb246ICcmJicgaWRlbnRpZmllcgogICAgIFNvdXJjZUxvY2F0aW9uIEFtcEFtcExvYyA9IENvbnN1bWVUb2tlbigpOwogICAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkKLSAgICAgIHJldHVybiBFeHByRXJyb3IoRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCkpOworICAgICAgcmV0dXJuIEV4cHJFcnJvcihEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmlkZW50aWZpZXIpOwogCiAgICAgaWYgKGdldEN1clNjb3BlKCktPmdldEZuUGFyZW50KCkgPT0gMCkKICAgICAgIHJldHVybiBFeHByRXJyb3IoRGlhZyhUb2ssIGRpYWc6OmVycl9hZGRyZXNzX29mX2xhYmVsX291dHNpZGVfZm4pKTsKQEAgLTk5NSw3ICs5NTcsOCBAQAogICAgICAgY29uc3QgY2hhciAqUHJldlNwZWMgPSAwOwogICAgICAgdW5zaWduZWQgRGlhZ0lEOwogICAgICAgRFMuU2V0VHlwZVNwZWNUeXBlKFRTVF90eXBlbmFtZSwgVG9rLmdldEFubm90YXRpb25FbmRMb2MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lELCBUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lELCBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbnMuZ2V0QVNUQ29udGV4dCgpLmdldFByaW50aW5nUG9saWN5KCkpOwogCiAgICAgICBEZWNsYXJhdG9yIERlY2xhcmF0b3JJbmZvKERTLCBEZWNsYXJhdG9yOjpUeXBlTmFtZUNvbnRleHQpOwogICAgICAgVHlwZVJlc3VsdCBUeSA9IEFjdGlvbnMuQWN0T25UeXBlTmFtZShnZXRDdXJTY29wZSgpLCBEZWNsYXJhdG9ySW5mbyk7CkBAIC0xMDI4LDE1ICs5OTEsNyBAQAogICBjYXNlIHRvazo6a3dfdm9pZDoKICAgY2FzZSB0b2s6Omt3X3R5cGVuYW1lOgogICBjYXNlIHRvazo6a3dfdHlwZW9mOgotICBjYXNlIHRvazo6a3dfX192ZWN0b3I6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTFkX3Q6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTFkX2FycmF5X3Q6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTFkX2J1ZmZlcl90OgotICBjYXNlIHRvazo6a3dfaW1hZ2UyZF90OgotICBjYXNlIHRvazo6a3dfaW1hZ2UyZF9hcnJheV90OgotICBjYXNlIHRvazo6a3dfaW1hZ2UzZF90OgotICBjYXNlIHRvazo6a3dfc2FtcGxlcl90OgotICBjYXNlIHRvazo6a3dfZXZlbnRfdDogeworICBjYXNlIHRvazo6a3dfX192ZWN0b3I6IHsKICAgICBpZiAoIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKSB7CiAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2V4cHJlc3Npb24pOwogICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwpAQCAtMTE2OCw2NSArMTEyMyw5IEBACiAgICAgcmV0dXJuIFJlc3VsdDsKICAgfQogCi0gIGNhc2UgdG9rOjprd19fX2lzX2Fic3RyYWN0OiAvLyBbR05VXSB1bmFyeS10eXBlLXRyYWl0Ci0gIGNhc2UgdG9rOjprd19fX2lzX2NsYXNzOgotICBjYXNlIHRvazo6a3dfX19pc19lbXB0eToKLSAgY2FzZSB0b2s6Omt3X19faXNfZW51bToKLSAgY2FzZSB0b2s6Omt3X19faXNfaW50ZXJmYWNlX2NsYXNzOgotICBjYXNlIHRvazo6a3dfX19pc19saXRlcmFsOgotICBjYXNlIHRvazo6a3dfX19pc19hcml0aG1ldGljOgotICBjYXNlIHRvazo6a3dfX19pc19pbnRlZ3JhbDoKLSAgY2FzZSB0b2s6Omt3X19faXNfZmxvYXRpbmdfcG9pbnQ6Ci0gIGNhc2UgdG9rOjprd19fX2lzX2NvbXBsZXRlX3R5cGU6Ci0gIGNhc2UgdG9rOjprd19fX2lzX3ZvaWQ6Ci0gIGNhc2UgdG9rOjprd19fX2lzX2FycmF5OgotICBjYXNlIHRvazo6a3dfX19pc19mdW5jdGlvbjoKLSAgY2FzZSB0b2s6Omt3X19faXNfcmVmZXJlbmNlOgotICBjYXNlIHRvazo6a3dfX19pc19sdmFsdWVfcmVmZXJlbmNlOgotICBjYXNlIHRvazo6a3dfX19pc19ydmFsdWVfcmVmZXJlbmNlOgotICBjYXNlIHRvazo6a3dfX19pc19mdW5kYW1lbnRhbDoKLSAgY2FzZSB0b2s6Omt3X19faXNfb2JqZWN0OgotICBjYXNlIHRvazo6a3dfX19pc19zY2FsYXI6Ci0gIGNhc2UgdG9rOjprd19fX2lzX2NvbXBvdW5kOgotICBjYXNlIHRvazo6a3dfX19pc19wb2ludGVyOgotICBjYXNlIHRvazo6a3dfX19pc19tZW1iZXJfb2JqZWN0X3BvaW50ZXI6Ci0gIGNhc2UgdG9rOjprd19fX2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyOgotICBjYXNlIHRvazo6a3dfX19pc19tZW1iZXJfcG9pbnRlcjoKLSAgY2FzZSB0b2s6Omt3X19faXNfY29uc3Q6Ci0gIGNhc2UgdG9rOjprd19fX2lzX3ZvbGF0aWxlOgotICBjYXNlIHRvazo6a3dfX19pc19zdGFuZGFyZF9sYXlvdXQ6Ci0gIGNhc2UgdG9rOjprd19fX2lzX3NpZ25lZDoKLSAgY2FzZSB0b2s6Omt3X19faXNfdW5zaWduZWQ6Ci0gIGNhc2UgdG9rOjprd19fX2lzX2xpdGVyYWxfdHlwZToKLSAgY2FzZSB0b2s6Omt3X19faXNfcG9kOgotICBjYXNlIHRvazo6a3dfX19pc19wb2x5bW9ycGhpYzoKLSAgY2FzZSB0b2s6Omt3X19faXNfdHJpdmlhbDoKLSAgY2FzZSB0b2s6Omt3X19faXNfdHJpdmlhbGx5X2NvcHlhYmxlOgotICBjYXNlIHRvazo6a3dfX19pc191bmlvbjoKLSAgY2FzZSB0b2s6Omt3X19faXNfZmluYWw6Ci0gIGNhc2UgdG9rOjprd19fX2lzX3NlYWxlZDoKLSAgY2FzZSB0b2s6Omt3X19faGFzX3RyaXZpYWxfY29uc3RydWN0b3I6Ci0gIGNhc2UgdG9rOjprd19fX2hhc190cml2aWFsX21vdmVfY29uc3RydWN0b3I6Ci0gIGNhc2UgdG9rOjprd19fX2hhc190cml2aWFsX2NvcHk6Ci0gIGNhc2UgdG9rOjprd19fX2hhc190cml2aWFsX2Fzc2lnbjoKLSAgY2FzZSB0b2s6Omt3X19faGFzX3RyaXZpYWxfbW92ZV9hc3NpZ246Ci0gIGNhc2UgdG9rOjprd19fX2hhc190cml2aWFsX2Rlc3RydWN0b3I6Ci0gIGNhc2UgdG9rOjprd19fX2hhc19ub3Rocm93X2Fzc2lnbjoKLSAgY2FzZSB0b2s6Omt3X19faGFzX25vdGhyb3dfbW92ZV9hc3NpZ246Ci0gIGNhc2UgdG9rOjprd19fX2hhc19ub3Rocm93X2NvcHk6Ci0gIGNhc2UgdG9rOjprd19fX2hhc19ub3Rocm93X2NvbnN0cnVjdG9yOgotICBjYXNlIHRvazo6a3dfX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yOgotICAgIHJldHVybiBQYXJzZVVuYXJ5VHlwZVRyYWl0KCk7Ci0KLSAgY2FzZSB0b2s6Omt3X19fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3A6Ci0gIGNhc2UgdG9rOjprd19fX2lzX2Jhc2Vfb2Y6Ci0gIGNhc2UgdG9rOjprd19fX2lzX3NhbWU6Ci0gIGNhc2UgdG9rOjprd19fX2lzX2NvbnZlcnRpYmxlOgotICBjYXNlIHRvazo6a3dfX19pc19jb252ZXJ0aWJsZV90bzoKLSAgY2FzZSB0b2s6Omt3X19faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGU6Ci0gICAgcmV0dXJuIFBhcnNlQmluYXJ5VHlwZVRyYWl0KCk7Ci0KLSAgY2FzZSB0b2s6Omt3X19faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU6CisjZGVmaW5lIFRZUEVfVFJBSVQoTixTcGVsbGluZyxLKSBcCisgIGNhc2UgdG9rOjprd18jI1NwZWxsaW5nOgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Rva2VuS2luZHMuZGVmIgogICAgIHJldHVybiBQYXJzZVR5cGVUcmFpdCgpOwogICAgICAgCiAgIGNhc2UgdG9rOjprd19fX2FycmF5X3Jhbms6CkBAIC0xMzg3LDIxICsxMjg2LDIwIEBACiAgICAgICAgICAgTEhTID0gRXhwckVycm9yKCk7CiAgICAgICAgIH0KIAotICAgICAgICBTb3VyY2VMb2NhdGlvbiBDbG9zZUxvYyA9IFRvay5nZXRMb2NhdGlvbigpOwotICAgICAgICBpZiAoVG9rLmlzKHRvazo6Z3JlYXRlcmdyZWF0ZXJncmVhdGVyKSkgewotICAgICAgICAgIENvbnN1bWVUb2tlbigpOworICAgICAgICBTb3VyY2VMb2NhdGlvbiBDbG9zZUxvYzsKKyAgICAgICAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OmdyZWF0ZXJncmVhdGVyZ3JlYXRlciwgQ2xvc2VMb2MpKSB7CiAgICAgICAgIH0gZWxzZSBpZiAoTEhTLmlzSW52YWxpZCgpKSB7CiAgICAgICAgICAgU2tpcFVudGlsKHRvazo6Z3JlYXRlcmdyZWF0ZXJncmVhdGVyLCBTdG9wQXRTZW1pKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgY2xvc2luZyB0aGUgYnJhY2tldHMKLSAgICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2dnZyk7Ci0gICAgICAgICAgRGlhZyhPcGVuTG9jLCBkaWFnOjpub3RlX21hdGNoaW5nKSA8PCAiPDw8IjsKKyAgICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmdyZWF0ZXJncmVhdGVyZ3JlYXRlcjsKKyAgICAgICAgICBEaWFnKE9wZW5Mb2MsIGRpYWc6Om5vdGVfbWF0Y2hpbmcpIDw8IHRvazo6bGVzc2xlc3NsZXNzOwogICAgICAgICAgIFNraXBVbnRpbCh0b2s6OmdyZWF0ZXJncmVhdGVyZ3JlYXRlciwgU3RvcEF0U2VtaSk7CiAgICAgICAgICAgTEhTID0gRXhwckVycm9yKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIUxIUy5pc0ludmFsaWQoKSkgewotICAgICAgICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6bF9wYXJlbiwgZGlhZzo6ZXJyX2V4cGVjdGVkX2xwYXJlbiwgIiIpKQorICAgICAgICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6bF9wYXJlbikpCiAgICAgICAgICAgICBMSFMgPSBFeHByRXJyb3IoKTsKICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICBMb2MgPSBQcmV2VG9rTG9jYXRpb247CkBAIC0xNDc1LDggKzEzNzMsOCBAQAogICAgICAgICAgICAgKEJhc2VUeXBlLT5pc0Z1bmN0aW9uVHlwZSgpIHx8CiAgICAgICAgICAgICAgQmFzZVR5cGUtPmlzU3BlY2lmaWNQbGFjZWhvbGRlclR5cGUoQnVpbHRpblR5cGU6OkJvdW5kTWVtYmVyKSkpIHsKICAgICAgICAgICBEaWFnKE9wTG9jLCBkaWFnOjplcnJfZnVuY3Rpb25faXNfbm90X3JlY29yZCkKLSAgICAgICAgICAgIDw8IChPcEtpbmQgPT0gdG9rOjphcnJvdykgPDwgQmFzZS0+Z2V0U291cmNlUmFuZ2UoKQotICAgICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVSZW1vdmFsKE9wTG9jKTsKKyAgICAgICAgICAgICAgPDwgT3BLaW5kIDw8IEJhc2UtPmdldFNvdXJjZVJhbmdlKCkKKyAgICAgICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVSZW1vdmFsKE9wTG9jKTsKICAgICAgICAgICByZXR1cm4gUGFyc2VQb3N0Zml4RXhwcmVzc2lvblN1ZmZpeChCYXNlKTsKICAgICAgICAgfQogCkBAIC0xNTk3LDggKzE0OTUsNyBAQAogICAgIC8vIHBhdGhlbnRoZXNpcyBhcm91bmQgdHlwZSBuYW1lLgogICAgIGlmIChPcFRvay5pcyh0b2s6Omt3X3NpemVvZikgIHx8IE9wVG9rLmlzKHRvazo6a3dfX19hbGlnbm9mKSB8fAogICAgICAgICBPcFRvay5pcyh0b2s6Omt3X2FsaWdub2YpIHx8IE9wVG9rLmlzKHRvazo6a3dfX0FsaWdub2YpKSB7Ci0gICAgICBib29sIGlzQW1iaWd1b3VzVHlwZUlkOwotICAgICAgaWYgKGlzVHlwZUlkSW5QYXJlbnMoaXNBbWJpZ3VvdXNUeXBlSWQpKSB7CisgICAgICBpZiAoaXNUeXBlSWRVbmFtYmlndW91c2x5KCkpIHsKICAgICAgICAgRGVjbFNwZWMgRFMoQXR0ckZhY3RvcnkpOwogICAgICAgICBQYXJzZVNwZWNpZmllclF1YWxpZmllckxpc3QoRFMpOwogICAgICAgICBEZWNsYXJhdG9yIERlY2xhcmF0b3JJbmZvKERTLCBEZWNsYXJhdG9yOjpUeXBlTmFtZUNvbnRleHQpOwpAQCAtMTYxNyw3ICsxNTE0LDggQEAKIAogICAgIGlzQ2FzdEV4cHIgPSBmYWxzZTsKICAgICBpZiAoT3BUb2suaXModG9rOjprd190eXBlb2YpICYmICFnZXRMYW5nT3B0cygpLkNQbHVzUGx1cykgewotICAgICAgRGlhZyhUb2ssZGlhZzo6ZXJyX2V4cGVjdGVkX2xwYXJlbl9hZnRlcl9pZCkgPDwgT3BUb2suZ2V0SWRlbnRpZmllckluZm8oKTsKKyAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfYWZ0ZXIpIDw8IE9wVG9rLmdldElkZW50aWZpZXJJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRvazo6bF9wYXJlbjsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICB9CiAKQEAgLTE3ODksOCArMTY4Nyw4IEBACiAKICAgLy8gQWxsIG9mIHRoZXNlIHN0YXJ0IHdpdGggYW4gb3BlbiBwYXJlbi4KICAgaWYgKFRvay5pc05vdCh0b2s6OmxfcGFyZW4pKQotICAgIHJldHVybiBFeHByRXJyb3IoRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9scGFyZW5fYWZ0ZXJfaWQpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IEJ1aWx0aW5JSSk7CisgICAgcmV0dXJuIEV4cHJFcnJvcihEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2FmdGVyKSA8PCBCdWlsdGluSUkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRvazo6bF9wYXJlbik7CiAKICAgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyIFBUKCp0aGlzLCB0b2s6OmxfcGFyZW4pOwogICBQVC5jb25zdW1lT3BlbigpOwpAQCAtMTgwMiwxMyArMTcwMCwxNSBAQAogICBjYXNlIHRvazo6a3dfX19idWlsdGluX3ZhX2FyZzogewogICAgIEV4cHJSZXN1bHQgRXhwcihQYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCkpOwogCi0gICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbW1hLCAiIix0b2s6OnJfcGFyZW4pKQorICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29tbWEpKSB7CisgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIEV4cHIgPSBFeHByRXJyb3IoKTsKKyAgICB9CiAKICAgICBUeXBlUmVzdWx0IFR5ID0gUGFyc2VUeXBlTmFtZSgpOwogCiAgICAgaWYgKFRvay5pc05vdCh0b2s6OnJfcGFyZW4pKSB7Ci0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX3JwYXJlbik7CisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OnJfcGFyZW47CiAgICAgICBFeHByID0gRXhwckVycm9yKCk7CiAgICAgfQogCkBAIC0xODI2LDEyICsxNzI2LDE0IEBACiAgICAgICByZXR1cm4gRXhwckVycm9yKCk7CiAgICAgfQogCi0gICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbW1hLCAiIix0b2s6OnJfcGFyZW4pKQorICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29tbWEpKSB7CisgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKKyAgICB9CiAKICAgICAvLyBXZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGlkZW50aWZpZXIgaGVyZS4KICAgICBpZiAoVG9rLmlzTm90KHRvazo6aWRlbnRpZmllcikpIHsKLSAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOworICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjppZGVudGlmaWVyOwogICAgICAgU2tpcFVudGlsKHRvazo6cl9wYXJlbiwgU3RvcEF0U2VtaSk7CiAgICAgICByZXR1cm4gRXhwckVycm9yKCk7CiAgICAgfQpAQCAtMTg1Myw3ICsxNzU1LDcgQEAKICAgICAgICAgQ29tcHMuYmFjaygpLkxvY1N0YXJ0ID0gQ29uc3VtZVRva2VuKCk7CiAKICAgICAgICAgaWYgKFRvay5pc05vdCh0b2s6OmlkZW50aWZpZXIpKSB7Ci0gICAgICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCk7CisgICAgICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjppZGVudGlmaWVyOwogICAgICAgICAgIFNraXBVbnRpbCh0b2s6OnJfcGFyZW4sIFN0b3BBdFNlbWkpOwogICAgICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICAgICAgfQpAQCAtMTkwMiwxNiArMTgwNCwyMCBAQAogICAgICAgU2tpcFVudGlsKHRvazo6cl9wYXJlbiwgU3RvcEF0U2VtaSk7CiAgICAgICByZXR1cm4gQ29uZDsKICAgICB9Ci0gICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbW1hLCAiIix0b2s6OnJfcGFyZW4pKQorICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29tbWEpKSB7CisgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKKyAgICB9CiAKICAgICBFeHByUmVzdWx0IEV4cHIxKFBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKSk7CiAgICAgaWYgKEV4cHIxLmlzSW52YWxpZCgpKSB7CiAgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByMTsKICAgICB9Ci0gICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbW1hLCAiIix0b2s6OnJfcGFyZW4pKQorICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29tbWEpKSB7CisgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKKyAgICB9CiAKICAgICBFeHByUmVzdWx0IEV4cHIyKFBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKSk7CiAgICAgaWYgKEV4cHIyLmlzSW52YWxpZCgpKSB7CkBAIC0xOTE5LDcgKzE4MjUsNyBAQAogICAgICAgcmV0dXJuIEV4cHIyOwogICAgIH0KICAgICBpZiAoVG9rLmlzTm90KHRvazo6cl9wYXJlbikpIHsKLSAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfcnBhcmVuKTsKKyAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6cl9wYXJlbjsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICB9CiAgICAgUmVzID0gQWN0aW9ucy5BY3RPbkNob29zZUV4cHIoU3RhcnRMb2MsIENvbmQudGFrZSgpLCBFeHByMS50YWtlKCksCkBAIC0xOTMzLDExICsxODM5LDEyIEBACiAgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICB9Ci0gICAgCi0gICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbW1hLCAiIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgdG9rOjpyX3BhcmVuKSkKKworICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29tbWEpKSB7CisgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKLSAgICAKKyAgICB9CisKICAgICAvLyBTZWNvbmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgdG8gYml0Y2FzdCB0by4KICAgICBUeXBlUmVzdWx0IERlc3RUeSA9IFBhcnNlVHlwZU5hbWUoKTsKICAgICBpZiAoRGVzdFR5LmlzSW52YWxpZCgpKQpAQCAtMTk0NSw3ICsxODUyLDcgQEAKICAgICAKICAgICAvLyBBdHRlbXB0IHRvIGNvbnN1bWUgdGhlIHItcGFyZW4uCiAgICAgaWYgKFRvay5pc05vdCh0b2s6OnJfcGFyZW4pKSB7Ci0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX3JwYXJlbik7CisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OnJfcGFyZW47CiAgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICB9CkBAIC0xOTYxLDExICsxODY4LDEyIEBACiAgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICB9Ci0gICAgCi0gICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbW1hLCAiIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgdG9rOjpyX3BhcmVuKSkKKworICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29tbWEpKSB7CisgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKLSAgICAKKyAgICB9CisKICAgICAvLyBTZWNvbmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgdG8gYml0Y2FzdCB0by4KICAgICBUeXBlUmVzdWx0IERlc3RUeSA9IFBhcnNlVHlwZU5hbWUoKTsKICAgICBpZiAoRGVzdFR5LmlzSW52YWxpZCgpKQpAQCAtMTk3Myw3ICsxODgxLDcgQEAKICAgICAKICAgICAvLyBBdHRlbXB0IHRvIGNvbnN1bWUgdGhlIHItcGFyZW4uCiAgICAgaWYgKFRvay5pc05vdCh0b2s6OnJfcGFyZW4pKSB7Ci0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX3JwYXJlbik7CisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OnJfcGFyZW47CiAgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICB9CkBAIC0yMDQyLDcgKzE5NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIFRvay5pcyh0b2s6Omt3X19fYnJpZGdlX3JldGFpbmVkKSB8fAogICAgICAgICAgICAgICAgICAgICAgIFRvay5pcyh0b2s6Omt3X19fYnJpZGdlX3JldGFpbikpKTsKICAgaWYgKEJyaWRnZUNhc3QgJiYgIWdldExhbmdPcHRzKCkuT2JqQ0F1dG9SZWZDb3VudCkgewotICAgIGlmIChUb2suaXNOb3QodG9rOjprd19fX2JyaWRnZSkpIHsKKyAgICBpZiAoIVRyeUNvbnN1bWVUb2tlbih0b2s6Omt3X19fYnJpZGdlKSkgewogICAgICAgU3RyaW5nUmVmIEJyaWRnZUNhc3ROYW1lID0gVG9rLmdldE5hbWUoKTsKICAgICAgIFNvdXJjZUxvY2F0aW9uIEJyaWRnZUtleXdvcmRMb2MgPSBDb25zdW1lVG9rZW4oKTsKICAgICAgIGlmICghUFAuZ2V0U291cmNlTWFuYWdlcigpLmlzSW5TeXN0ZW1IZWFkZXIoQnJpZGdlS2V5d29yZExvYykpCkBAIC0yMDUwLDggKzE5NTgsNiBAQAogICAgICAgICAgIDw8IEJyaWRnZUNhc3ROYW1lCiAgICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVSZXBsYWNlbWVudChCcmlkZ2VLZXl3b3JkTG9jLCAiIik7CiAgICAgfQotICAgIGVsc2UKLSAgICAgIENvbnN1bWVUb2tlbigpOyAvLyBjb25zdW1lIF9fYnJpZGdlCiAgICAgQnJpZGdlQ2FzdCA9IGZhbHNlOwogICB9CiAgIApAQCAtMjI5OSw3ICsyMjA1LDcgQEAKICAgICBEaWFnKEtleUxvYywgZGlhZzo6ZXh0X2MxMV9nZW5lcmljX3NlbGVjdGlvbik7CiAKICAgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyIFQoKnRoaXMsIHRvazo6bF9wYXJlbik7Ci0gIGlmIChULmV4cGVjdEFuZENvbnN1bWUoZGlhZzo6ZXJyX2V4cGVjdGVkX2xwYXJlbikpCisgIGlmIChULmV4cGVjdEFuZENvbnN1bWUoKSkKICAgICByZXR1cm4gRXhwckVycm9yKCk7CiAKICAgRXhwclJlc3VsdCBDb250cm9sbGluZ0V4cHI7CkBAIC0yMzE0LDcgKzIyMjAsNyBAQAogICAgIH0KICAgfQogCi0gIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29tbWEsIGRpYWc6OmVycl9leHBlY3RlZF9jb21tYSwgIiIpKSB7CisgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29tbWEpKSB7CiAgICAgU2tpcFVudGlsKHRvazo6cl9wYXJlbiwgU3RvcEF0U2VtaSk7CiAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogICB9CkBAIC0yMzIyLDcgKzIyMjgsNyBAQAogICBTb3VyY2VMb2NhdGlvbiBEZWZhdWx0TG9jOwogICBUeXBlVmVjdG9yIFR5cGVzOwogICBFeHByVmVjdG9yIEV4cHJzOwotICB3aGlsZSAoMSkgeworICBkbyB7CiAgICAgUGFyc2VkVHlwZSBUeTsKICAgICBpZiAoVG9rLmlzKHRvazo6a3dfZGVmYXVsdCkpIHsKICAgICAgIC8vIEMxMSA2LjUuMS4xcDIgIkEgZ2VuZXJpYyBzZWxlY3Rpb24gc2hhbGwgaGF2ZSBubyBtb3JlIHRoYW4gb25lIGRlZmF1bHQKQEAgLTIzNDYsNyArMjI1Miw3IEBACiAgICAgfQogICAgIFR5cGVzLnB1c2hfYmFjayhUeSk7CiAKLSAgICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OmNvbG9uLCBkaWFnOjplcnJfZXhwZWN0ZWRfY29sb24sICIiKSkgeworICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29sb24pKSB7CiAgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICB9CkBAIC0yMzU5LDExICsyMjY1LDcgQEAKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICB9CiAgICAgRXhwcnMucHVzaF9iYWNrKEVSLnJlbGVhc2UoKSk7Ci0KLSAgICBpZiAoVG9rLmlzTm90KHRvazo6Y29tbWEpKQotICAgICAgYnJlYWs7Ci0gICAgQ29uc3VtZVRva2VuKCk7Ci0gIH0KKyAgfSB3aGlsZSAoVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29tbWEpKTsKIAogICBULmNvbnN1bWVDbG9zZSgpOwogICBpZiAoVC5nZXRDbG9zZUxvY2F0aW9uKCkuaXNJbnZhbGlkKCkpCmRpZmYgLS1naXQgYS9saWIvUGFyc2UvUGFyc2VFeHByQ1hYLmNwcCBiL2xpYi9QYXJzZS9QYXJzZUV4cHJDWFguY3BwCmluZGV4IDVmZTQ3ZmMuLmYxMGNhNmEgMTAwNjQ0Ci0tLSBhL2xpYi9QYXJzZS9QYXJzZUV4cHJDWFguY3BwCisrKyBiL2xpYi9QYXJzZS9QYXJzZUV4cHJDWFguY3BwCkBAIC0xMCwxMiArMTAsMTMgQEAKIC8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBFeHByZXNzaW9uIHBhcnNpbmcgaW1wbGVtZW50YXRpb24gZm9yIEMrKy4KIC8vCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsVGVtcGxhdGUuaCIKLSNpbmNsdWRlICJjbGFuZy9QYXJzZS9QYXJzZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgogI2luY2x1ZGUgIlJBSUlPYmplY3RzRm9yUGFyc2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ByZXR0eVN0YWNrVHJhY2UuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvTGl0ZXJhbFN1cHBvcnQuaCIKICNpbmNsdWRlICJjbGFuZy9QYXJzZS9QYXJzZURpYWdub3N0aWMuaCIKKyNpbmNsdWRlICJjbGFuZy9QYXJzZS9QYXJzZXIuaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL0RlY2xTcGVjLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9QYXJzZWRUZW1wbGF0ZS5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2NvcGUuaCIKQEAgLTI2LDcgKzI3LDkgQEAKIAogc3RhdGljIGludCBTZWxlY3REaWdyYXBoRXJyb3JNZXNzYWdlKHRvazo6VG9rZW5LaW5kIEtpbmQpIHsKICAgc3dpdGNoIChLaW5kKSB7Ci0gICAgY2FzZSB0b2s6Omt3X3RlbXBsYXRlOiAgICAgICAgIHJldHVybiAwOworICAgIC8vIHRlbXBsYXRlIG5hbWUKKyAgICBjYXNlIHRvazo6dW5rbm93bjogICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gY2FzdHMKICAgICBjYXNlIHRvazo6a3dfY29uc3RfY2FzdDogICAgICAgcmV0dXJuIDE7CiAgICAgY2FzZSB0b2s6Omt3X2R5bmFtaWNfY2FzdDogICAgIHJldHVybiAyOwogICAgIGNhc2UgdG9rOjprd19yZWludGVycHJldF9jYXN0OiByZXR1cm4gMzsKQEAgLTkzLDcgKzk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlLCBNZW1iZXJPZlVua25vd25TcGVjaWFsaXphdGlvbikpCiAgICAgcmV0dXJuOwogCi0gIEZpeERpZ3JhcGgoKnRoaXMsIFBQLCBOZXh0LCBTZWNvbmRUb2tlbiwgdG9rOjprd190ZW1wbGF0ZSwKKyAgRml4RGlncmFwaCgqdGhpcywgUFAsIE5leHQsIFNlY29uZFRva2VuLCB0b2s6OnVua25vd24sCiAgICAgICAgICAgICAgLypBdERpZ3JhcGgqL2ZhbHNlKTsKIH0KIApAQCAtMjMzLDEyICsyMzYsMTMgQEAKICAgICBEZWNsU3BlYyBEUyhBdHRyRmFjdG9yeSk7CiAgICAgU291cmNlTG9jYXRpb24gRGVjbExvYyA9IFRvay5nZXRMb2NhdGlvbigpOwogICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyAgPSBQYXJzZURlY2x0eXBlU3BlY2lmaWVyKERTKTsKLSAgICBpZiAoVG9rLmlzTm90KHRvazo6Y29sb25jb2xvbikpIHsKKworICAgIFNvdXJjZUxvY2F0aW9uIENDTG9jOworICAgIGlmICghVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29sb25jb2xvbiwgQ0NMb2MpKSB7CiAgICAgICBBbm5vdGF0ZUV4aXN0aW5nRGVjbHR5cGVTcGVjaWZpZXIoRFMsIERlY2xMb2MsIEVuZExvYyk7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAotICAgIFNvdXJjZUxvY2F0aW9uIENDTG9jID0gQ29uc3VtZVRva2VuKCk7CisKICAgICBpZiAoQWN0aW9ucy5BY3RPbkNYWE5lc3RlZE5hbWVTcGVjaWZpZXJEZWNsdHlwZShTUywgRFMsIENDTG9jKSkKICAgICAgIFNTLlNldEludmFsaWQoU291cmNlUmFuZ2UoRGVjbExvYywgQ0NMb2MpKTsKIApAQCAtMjg3LDE5ICsyOTEsMjMgQEAKIAogICAgICAgVGVudGF0aXZlUGFyc2luZ0FjdGlvbiBUUEEoKnRoaXMpOwogICAgICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYyA9IENvbnN1bWVUb2tlbigpOwotICAgICAgCisKICAgICAgIFVucXVhbGlmaWVkSWQgVGVtcGxhdGVOYW1lOwogICAgICAgaWYgKFRvay5pcyh0b2s6OmlkZW50aWZpZXIpKSB7CiAgICAgICAgIC8vIENvbnN1bWUgdGhlIGlkZW50aWZpZXIuCiAgICAgICAgIFRlbXBsYXRlTmFtZS5zZXRJZGVudGlmaWVyKFRvay5nZXRJZGVudGlmaWVySW5mbygpLCBUb2suZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIENvbnN1bWVUb2tlbigpOwogICAgICAgfSBlbHNlIGlmIChUb2suaXModG9rOjprd19vcGVyYXRvcikpIHsKLSAgICAgICAgaWYgKFBhcnNlVW5xdWFsaWZpZWRJZE9wZXJhdG9yKFNTLCBFbnRlcmluZ0NvbnRleHQsIE9iamVjdFR5cGUsIAorICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGFjdHVhbGx5IHBhcnNlIHRoZSB1bnF1YWxpZmllZC1pZCBpbiB0aGlzIGNhc2UsCisgICAgICAgIC8vIGJlY2F1c2UgYSBzaW1wbGUtdGVtcGxhdGUtaWQgY2Fubm90IHN0YXJ0IHdpdGggJ29wZXJhdG9yJywgYnV0CisgICAgICAgIC8vIGdvIGFoZWFkIGFuZCBwYXJzZSBpdCBhbnl3YXkgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIGNhc2Ugd2hlcmUKKyAgICAgICAgLy8gd2UgYWxyZWFkeSBhbm5vdGF0ZWQgdGhlIHRlbXBsYXRlLWlkLgorICAgICAgICBpZiAoUGFyc2VVbnF1YWxpZmllZElkT3BlcmF0b3IoU1MsIEVudGVyaW5nQ29udGV4dCwgT2JqZWN0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlTmFtZSkpIHsKICAgICAgICAgICBUUEEuQ29tbWl0KCk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgaWYgKFRlbXBsYXRlTmFtZS5nZXRLaW5kKCkgIT0gVW5xdWFsaWZpZWRJZDo6SUtfT3BlcmF0b3JGdW5jdGlvbklkICYmCiAgICAgICAgICAgICBUZW1wbGF0ZU5hbWUuZ2V0S2luZCgpICE9IFVucXVhbGlmaWVkSWQ6OklLX0xpdGVyYWxPcGVyYXRvcklkKSB7CiAgICAgICAgICAgRGlhZyhUZW1wbGF0ZU5hbWUuZ2V0U291cmNlUmFuZ2UoKS5nZXRCZWdpbigpLApAQCAtMzQxLDEwICszNDksMTAgQEAKICAgICBpZiAoVG9rLmlzKHRvazo6YW5ub3RfdGVtcGxhdGVfaWQpICYmIE5leHRUb2tlbigpLmlzKHRvazo6Y29sb25jb2xvbikpIHsKICAgICAgIC8vIFdlIGhhdmUKICAgICAgIC8vCi0gICAgICAvLyAgIHNpbXBsZS10ZW1wbGF0ZS1pZCAnOjonCisgICAgICAvLyAgIHRlbXBsYXRlLWlkICc6OicKICAgICAgIC8vCi0gICAgICAvLyBTbyB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHNpbXBsZS10ZW1wbGF0ZS1pZCBpcyBvZiB0aGUKLSAgICAgIC8vIHJpZ2h0IGtpbmQgKGl0IHNob3VsZCBuYW1lIGEgdHlwZSBvciBiZSBkZXBlbmRlbnQpLCBhbmQgdGhlbgorICAgICAgLy8gU28gd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoZSB0ZW1wbGF0ZS1pZCBpcyBhIHNpbXBsZS10ZW1wbGF0ZS1pZCBvZgorICAgICAgLy8gdGhlIHJpZ2h0IGtpbmQgKGl0IHNob3VsZCBuYW1lIGEgdHlwZSBvciBiZSBkZXBlbmRlbnQpLCBhbmQgdGhlbgogICAgICAgLy8gY29udmVydCBpdCBpbnRvIGEgdHlwZSB3aXRoaW4gdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KICAgICAgIFRlbXBsYXRlSWRBbm5vdGF0aW9uICpUZW1wbGF0ZUlkID0gdGFrZVRlbXBsYXRlSWRBbm5vdGF0aW9uKFRvayk7CiAgICAgICBpZiAoQ2hlY2tGb3JEZXN0cnVjdG9yICYmIEdldExvb2tBaGVhZFRva2VuKDIpLmlzKHRvazo6dGlsZGUpKSB7CkBAIC04MTQsOCArODIyLDcgQEAKICAgICAgICAgLy8gdG8gc2F2ZSB0aGUgbmVjZXNzYXJ5IHN0YXRlLCBhbmQgcmVzdG9yZSBpdCBsYXRlci4KICAgICAgICAgRW50ZXJFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgRUMoQWN0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYTo6UG90ZW50aWFsbHlFdmFsdWF0ZWQpOwotICAgICAgICBpZiAoVG9rLmlzKHRvazo6ZXF1YWwpKQotICAgICAgICAgIENvbnN1bWVUb2tlbigpOworICAgICAgICBUcnlDb25zdW1lVG9rZW4odG9rOjplcXVhbCk7CiAKICAgICAgICAgaWYgKCFTa2lwcGVkSW5pdHMpCiAgICAgICAgICAgSW5pdCA9IFBhcnNlSW5pdGlhbGl6ZXIoKTsKQEAgLTg2NCw4ICs4NzEsOCBAQAogICAgICAgICAgICAgQ29uc3VtZVRva2VuKCk7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKFRvay5pcyh0b2s6OmVsbGlwc2lzKSkKLSAgICAgICAgRWxsaXBzaXNMb2MgPSBDb25zdW1lVG9rZW4oKTsKKyAgICAgIH0gZWxzZQorICAgICAgICBUcnlDb25zdW1lVG9rZW4odG9rOjplbGxpcHNpcywgRWxsaXBzaXNMb2MpOwogICAgIH0KICAgICAvLyBJZiB0aGlzIGlzIGFuIGluaXQgY2FwdHVyZSwgcHJvY2VzcyB0aGUgaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbgogICAgIC8vIHJpZ2h0IGF3YXkuICBGb3IgbGFtYmRhIGluaXQtY2FwdHVyZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nOgpAQCAtOTg4LDcgKzk5NSw2IEBACiAgICAgUGFyc2VkQXR0cmlidXRlcyBBdHRyKEF0dHJGYWN0b3J5KTsKICAgICBTbWFsbFZlY3RvcjxEZWNsYXJhdG9yQ2h1bms6OlBhcmFtSW5mbywgMTY+IFBhcmFtSW5mbzsKICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYzsKLQogICAgIAogICAgIGlmIChUb2suaXNOb3QodG9rOjpyX3BhcmVuKSkgewogICAgICAgQWN0aW9ucy5SZWNvcmRQYXJzaW5nVGVtcGxhdGVQYXJhbWV0ZXJEZXB0aChUZW1wbGF0ZVBhcmFtZXRlckRlcHRoKTsKQEAgLTEwMDIsMTIgKzEwMDgsMTQgQEAKICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MgPSBULmdldENsb3NlTG9jYXRpb24oKTsKICAgICBEZWNsRW5kTG9jID0gUlBhcmVuTG9jOwogCisgICAgLy8gR05VLXN0eWxlIGF0dHJpYnV0ZXMgbXVzdCBiZSBwYXJzZWQgYmVmb3JlIHRoZSBtdXRhYmxlIHNwZWNpZmllciB0byBiZQorICAgIC8vIGNvbXBhdGlibGUgd2l0aCBHQ0MuCisgICAgTWF5YmVQYXJzZUdOVUF0dHJpYnV0ZXMoQXR0ciwgJkRlY2xFbmRMb2MpOworCiAgICAgLy8gUGFyc2UgJ211dGFibGUnW29wdF0uCiAgICAgU291cmNlTG9jYXRpb24gTXV0YWJsZUxvYzsKLSAgICBpZiAoVG9rLmlzKHRvazo6a3dfbXV0YWJsZSkpIHsKLSAgICAgIE11dGFibGVMb2MgPSBDb25zdW1lVG9rZW4oKTsKKyAgICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6a3dfbXV0YWJsZSwgTXV0YWJsZUxvYykpCiAgICAgICBEZWNsRW5kTG9jID0gTXV0YWJsZUxvYzsKLSAgICB9CiAKICAgICAvLyBQYXJzZSBleGNlcHRpb24tc3BlY2lmaWNhdGlvbltvcHRdLgogICAgIEV4Y2VwdGlvblNwZWNpZmljYXRpb25UeXBlIEVTcGVjVHlwZSA9IEVTVF9Ob25lOwpAQCAtMTA2MSwyMiArMTA2OSw0MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQYXJlbkxvYywgRnVuTG9jYWxSYW5nZUVuZCwgRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpbGluZ1JldHVyblR5cGUpLAogICAgICAgICAgICAgICAgICAgQXR0ciwgRGVjbEVuZExvYyk7Ci0gIH0gZWxzZSBpZiAoVG9rLmlzKHRvazo6a3dfbXV0YWJsZSkgfHwgVG9rLmlzKHRvazo6YXJyb3cpKSB7Ci0gICAgLy8gSXQncyBjb21tb24gdG8gZm9yZ2V0IHRoYXQgb25lIG5lZWRzICcoKScgYmVmb3JlICdtdXRhYmxlJyBvciB0aGUgCi0gICAgLy8gcmVzdWx0IHR5cGUuIERlYWwgd2l0aCB0aGlzLgorICB9IGVsc2UgaWYgKFRvay5pcyh0b2s6Omt3X211dGFibGUpIHx8IFRvay5pcyh0b2s6OmFycm93KSB8fAorICAgICAgICAgICAgIFRvay5pcyh0b2s6Omt3X19fYXR0cmlidXRlKSB8fAorICAgICAgICAgICAgIChUb2suaXModG9rOjpsX3NxdWFyZSkgJiYgTmV4dFRva2VuKCkuaXModG9rOjpsX3NxdWFyZSkpKSB7CisgICAgLy8gSXQncyBjb21tb24gdG8gZm9yZ2V0IHRoYXQgb25lIG5lZWRzICcoKScgYmVmb3JlICdtdXRhYmxlJywgYW4gYXR0cmlidXRlCisgICAgLy8gc3BlY2lmaWVyLCBvciB0aGUgcmVzdWx0IHR5cGUuIERlYWwgd2l0aCB0aGlzLgorICAgIHVuc2lnbmVkIFRva0tpbmQgPSAwOworICAgIHN3aXRjaCAoVG9rLmdldEtpbmQoKSkgeworICAgIGNhc2UgdG9rOjprd19tdXRhYmxlOiBUb2tLaW5kID0gMDsgYnJlYWs7CisgICAgY2FzZSB0b2s6OmFycm93OiBUb2tLaW5kID0gMTsgYnJlYWs7CisgICAgY2FzZSB0b2s6Omt3X19fYXR0cmlidXRlOgorICAgIGNhc2UgdG9rOjpsX3NxdWFyZTogVG9rS2luZCA9IDI7IGJyZWFrOworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gdG9rZW4ga2luZCIpOworICAgIH0KKwogICAgIERpYWcoVG9rLCBkaWFnOjplcnJfbGFtYmRhX21pc3NpbmdfcGFyZW5zKQotICAgICAgPDwgVG9rLmlzKHRvazo6YXJyb3cpCisgICAgICA8PCBUb2tLaW5kCiAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihUb2suZ2V0TG9jYXRpb24oKSwgIigpICIpOwogICAgIFNvdXJjZUxvY2F0aW9uIERlY2xMb2MgPSBUb2suZ2V0TG9jYXRpb24oKTsKICAgICBTb3VyY2VMb2NhdGlvbiBEZWNsRW5kTG9jID0gRGVjbExvYzsKLSAgICAKKworICAgIC8vIEdOVS1zdHlsZSBhdHRyaWJ1dGVzIG11c3QgYmUgcGFyc2VkIGJlZm9yZSB0aGUgbXV0YWJsZSBzcGVjaWZpZXIgdG8gYmUKKyAgICAvLyBjb21wYXRpYmxlIHdpdGggR0NDLgorICAgIFBhcnNlZEF0dHJpYnV0ZXMgQXR0cihBdHRyRmFjdG9yeSk7CisgICAgTWF5YmVQYXJzZUdOVUF0dHJpYnV0ZXMoQXR0ciwgJkRlY2xFbmRMb2MpOworCiAgICAgLy8gUGFyc2UgJ211dGFibGUnLCBpZiBpdCdzIHRoZXJlLgogICAgIFNvdXJjZUxvY2F0aW9uIE11dGFibGVMb2M7CiAgICAgaWYgKFRvay5pcyh0b2s6Omt3X211dGFibGUpKSB7CiAgICAgICBNdXRhYmxlTG9jID0gQ29uc3VtZVRva2VuKCk7CiAgICAgICBEZWNsRW5kTG9jID0gTXV0YWJsZUxvYzsKICAgICB9Ci0gICAgCisKKyAgICAvLyBQYXJzZSBhdHRyaWJ1dGUtc3BlY2lmaWVyW29wdF0uCisgICAgTWF5YmVQYXJzZUNYWDExQXR0cmlidXRlcyhBdHRyLCAmRGVjbEVuZExvYyk7CisKICAgICAvLyBQYXJzZSB0aGUgcmV0dXJuIHR5cGUsIGlmIHRoZXJlIGlzIG9uZS4KICAgICBUeXBlUmVzdWx0IFRyYWlsaW5nUmV0dXJuVHlwZTsKICAgICBpZiAoVG9rLmlzKHRvazo6YXJyb3cpKSB7CkBAIC0xMDg2LDcgKzExMTMsNiBAQAogICAgICAgICBEZWNsRW5kTG9jID0gUmFuZ2UuZ2V0RW5kKCk7ICAgICAgCiAgICAgfQogCi0gICAgUGFyc2VkQXR0cmlidXRlcyBBdHRyKEF0dHJGYWN0b3J5KTsKICAgICBTb3VyY2VMb2NhdGlvbiBOb0xvYzsKICAgICBELkFkZFR5cGVJbmZvKERlY2xhcmF0b3JDaHVuazo6Z2V0RnVuY3Rpb24oLypoYXNQcm90bz0qL3RydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNBbWJpZ3VvdXM9Ki9mYWxzZSwKQEAgLTExODIsOCArMTIwOCw4IEBACiAKICAgU291cmNlTG9jYXRpb24gUkFuZ2xlQnJhY2tldExvYyA9IFRvay5nZXRMb2NhdGlvbigpOwogCi0gIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Z3JlYXRlciwgZGlhZzo6ZXJyX2V4cGVjdGVkX2dyZWF0ZXIpKQotICAgIHJldHVybiBFeHByRXJyb3IoRGlhZyhMQW5nbGVCcmFja2V0TG9jLCBkaWFnOjpub3RlX21hdGNoaW5nKSA8PCAiPCIpOworICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OmdyZWF0ZXIpKQorICAgIHJldHVybiBFeHByRXJyb3IoRGlhZyhMQW5nbGVCcmFja2V0TG9jLCBkaWFnOjpub3RlX21hdGNoaW5nKSA8PCB0b2s6Omxlc3MpOwogCiAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywgUlBhcmVuTG9jOwogICBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIgVCgqdGhpcywgdG9rOjpsX3BhcmVuKTsKQEAgLTE2NjcsNiArMTY5Myw4IEBACiAgIGNvbnN0IGNoYXIgKlByZXZTcGVjOwogICB1bnNpZ25lZCBEaWFnSUQ7CiAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IFRvay5nZXRMb2NhdGlvbigpOworICBjb25zdCBjbGFuZzo6UHJpbnRpbmdQb2xpY3kgJlBvbGljeSA9CisgICAgICBBY3Rpb25zLmdldEFTVENvbnRleHQoKS5nZXRQcmludGluZ1BvbGljeSgpOwogCiAgIHN3aXRjaCAoVG9rLmdldEtpbmQoKSkgewogICBjYXNlIHRvazo6aWRlbnRpZmllcjogICAvLyBmb286OmJhcgpAQCAtMTY3OSw3ICsxNzA3LDcgQEAKICAgY2FzZSB0b2s6OmFubm90X3R5cGVuYW1lOiB7CiAgICAgaWYgKGdldFR5cGVBbm5vdGF0aW9uKFRvaykpCiAgICAgICBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF90eXBlbmFtZSwgTG9jLCBQcmV2U3BlYywgRGlhZ0lELAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGVBbm5vdGF0aW9uKFRvaykpOworICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGVBbm5vdGF0aW9uKFRvayksIFBvbGljeSk7CiAgICAgZWxzZQogICAgICAgRFMuU2V0VHlwZVNwZWNFcnJvcigpOwogICAgIApAQCAtMTY5MywxOSArMTcyMSwxOSBAQAogICAgIGlmIChUb2suaXModG9rOjpsZXNzKSAmJiBnZXRMYW5nT3B0cygpLk9iakMxKQogICAgICAgUGFyc2VPYmpDUHJvdG9jb2xRdWFsaWZpZXJzKERTKTsKICAgICAKLSAgICBEUy5GaW5pc2goRGlhZ3MsIFBQKTsKKyAgICBEUy5GaW5pc2goRGlhZ3MsIFBQLCBQb2xpY3kpOwogICAgIHJldHVybjsKICAgfQogCiAgIC8vIGJ1aWx0aW4gdHlwZXMKICAgY2FzZSB0b2s6Omt3X3Nob3J0OgotICAgIERTLlNldFR5cGVTcGVjV2lkdGgoRGVjbFNwZWM6OlRTV19zaG9ydCwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICBEUy5TZXRUeXBlU3BlY1dpZHRoKERlY2xTcGVjOjpUU1dfc2hvcnQsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICBicmVhazsKICAgY2FzZSB0b2s6Omt3X2xvbmc6Ci0gICAgRFMuU2V0VHlwZVNwZWNXaWR0aChEZWNsU3BlYzo6VFNXX2xvbmcsIExvYywgUHJldlNwZWMsIERpYWdJRCk7CisgICAgRFMuU2V0VHlwZVNwZWNXaWR0aChEZWNsU3BlYzo6VFNXX2xvbmcsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICBicmVhazsKICAgY2FzZSB0b2s6Omt3X19faW50NjQ6Ci0gICAgRFMuU2V0VHlwZVNwZWNXaWR0aChEZWNsU3BlYzo6VFNXX2xvbmdsb25nLCBMb2MsIFByZXZTcGVjLCBEaWFnSUQpOworICAgIERTLlNldFR5cGVTcGVjV2lkdGgoRGVjbFNwZWM6OlRTV19sb25nbG9uZywgTG9jLCBQcmV2U3BlYywgRGlhZ0lELCBQb2xpY3kpOwogICAgIGJyZWFrOwogICBjYXNlIHRvazo6a3dfc2lnbmVkOgogICAgIERTLlNldFR5cGVTcGVjU2lnbihEZWNsU3BlYzo6VFNTX3NpZ25lZCwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKQEAgLTE3MTQsNDcgKzE3NDIsNDcgQEAKICAgICBEUy5TZXRUeXBlU3BlY1NpZ24oRGVjbFNwZWM6OlRTU191bnNpZ25lZCwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKICAgICBicmVhazsKICAgY2FzZSB0b2s6Omt3X3ZvaWQ6Ci0gICAgRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1Rfdm9pZCwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF92b2lkLCBMb2MsIFByZXZTcGVjLCBEaWFnSUQsIFBvbGljeSk7CiAgICAgYnJlYWs7CiAgIGNhc2UgdG9rOjprd19jaGFyOgotICAgIERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2NoYXIsIExvYywgUHJldlNwZWMsIERpYWdJRCk7CisgICAgRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfY2hhciwgTG9jLCBQcmV2U3BlYywgRGlhZ0lELCBQb2xpY3kpOwogICAgIGJyZWFrOwogICBjYXNlIHRvazo6a3dfaW50OgotICAgIERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2ludCwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9pbnQsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICBicmVhazsKICAgY2FzZSB0b2s6Omt3X19faW50MTI4OgotICAgIERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2ludDEyOCwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9pbnQxMjgsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICBicmVhazsKICAgY2FzZSB0b2s6Omt3X2hhbGY6Ci0gICAgRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfaGFsZiwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9oYWxmLCBMb2MsIFByZXZTcGVjLCBEaWFnSUQsIFBvbGljeSk7CiAgICAgYnJlYWs7CiAgIGNhc2UgdG9rOjprd19mbG9hdDoKLSAgICBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9mbG9hdCwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9mbG9hdCwgTG9jLCBQcmV2U3BlYywgRGlhZ0lELCBQb2xpY3kpOwogICAgIGJyZWFrOwogICBjYXNlIHRvazo6a3dfZG91YmxlOgotICAgIERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2RvdWJsZSwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9kb3VibGUsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICBicmVhazsKICAgY2FzZSB0b2s6Omt3X3djaGFyX3Q6Ci0gICAgRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1Rfd2NoYXIsIExvYywgUHJldlNwZWMsIERpYWdJRCk7CisgICAgRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1Rfd2NoYXIsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICBicmVhazsKICAgY2FzZSB0b2s6Omt3X2NoYXIxNl90OgotICAgIERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2NoYXIxNiwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9jaGFyMTYsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICBicmVhazsKICAgY2FzZSB0b2s6Omt3X2NoYXIzMl90OgotICAgIERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2NoYXIzMiwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9jaGFyMzIsIExvYywgUHJldlNwZWMsIERpYWdJRCwgUG9saWN5KTsKICAgICBicmVhazsKICAgY2FzZSB0b2s6Omt3X2Jvb2w6Ci0gICAgRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfYm9vbCwgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9ib29sLCBMb2MsIFByZXZTcGVjLCBEaWFnSUQsIFBvbGljeSk7CiAgICAgYnJlYWs7CiAgIGNhc2UgdG9rOjphbm5vdF9kZWNsdHlwZToKICAgY2FzZSB0b2s6Omt3X2RlY2x0eXBlOgogICAgIERTLlNldFJhbmdlRW5kKFBhcnNlRGVjbHR5cGVTcGVjaWZpZXIoRFMpKTsKLSAgICByZXR1cm4gRFMuRmluaXNoKERpYWdzLCBQUCk7CisgICAgcmV0dXJuIERTLkZpbmlzaChEaWFncywgUFAsIFBvbGljeSk7CiAKICAgLy8gR05VIHR5cGVvZiBzdXBwb3J0LgogICBjYXNlIHRvazo6a3dfdHlwZW9mOgogICAgIFBhcnNlVHlwZW9mU3BlY2lmaWVyKERTKTsKLSAgICBEUy5GaW5pc2goRGlhZ3MsIFBQKTsKKyAgICBEUy5GaW5pc2goRGlhZ3MsIFBQLCBQb2xpY3kpOwogICAgIHJldHVybjsKICAgfQogICBpZiAoVG9rLmlzKHRvazo6YW5ub3RfdHlwZW5hbWUpKQpAQCAtMTc2Miw3ICsxNzkwLDcgQEAKICAgZWxzZQogICAgIERTLlNldFJhbmdlRW5kKFRvay5nZXRMb2NhdGlvbigpKTsKICAgQ29uc3VtZVRva2VuKCk7Ci0gIERTLkZpbmlzaChEaWFncywgUFApOworICBEUy5GaW5pc2goRGlhZ3MsIFBQLCBQb2xpY3kpOwogfQogCiAvLy8gUGFyc2VDWFhUeXBlU3BlY2lmaWVyU2VxIC0gUGFyc2UgYSBDKysgdHlwZS1zcGVjaWZpZXItc2VxIChDKysKQEAgLTE3NzgsNyArMTgwNiw3IEBACiAvLy8KIGJvb2wgUGFyc2VyOjpQYXJzZUNYWFR5cGVTcGVjaWZpZXJTZXEoRGVjbFNwZWMgJkRTKSB7CiAgIFBhcnNlU3BlY2lmaWVyUXVhbGlmaWVyTGlzdChEUywgQVNfbm9uZSwgRFNDX3R5cGVfc3BlY2lmaWVyKTsKLSAgRFMuRmluaXNoKERpYWdzLCBQUCk7CisgIERTLkZpbmlzaChEaWFncywgUFAsIEFjdGlvbnMuZ2V0QVNUQ29udGV4dCgpLmdldFByaW50aW5nUG9saWN5KCkpOwogICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTE5MzUsNiArMTk2Myw3IEBACiAgICAgVGVtcGxhdGVJZEFubm90YXRpb24gKlRlbXBsYXRlSWQKICAgICAgID0gVGVtcGxhdGVJZEFubm90YXRpb246OkFsbG9jYXRlKFRlbXBsYXRlQXJncy5zaXplKCksIFRlbXBsYXRlSWRzKTsKIAorICAgIC8vIEZJWE1FOiBTdG9yZSBuYW1lIGZvciBsaXRlcmFsIG9wZXJhdG9yIHRvby4KICAgICBpZiAoSWQuZ2V0S2luZCgpID09IFVucXVhbGlmaWVkSWQ6OklLX0lkZW50aWZpZXIpIHsKICAgICAgIFRlbXBsYXRlSWQtPk5hbWUgPSBJZC5JZGVudGlmaWVyOwogICAgICAgVGVtcGxhdGVJZC0+T3BlcmF0b3IgPSBPT19Ob25lOwpAQCAtMjE1OCw3ICsyMTg3LDcgQEAKICAgICAgIFN1ZmZpeExvYyA9IENvbnN1bWVUb2tlbigpOwogICAgICAgVG9rTG9jcy5wdXNoX2JhY2soU3VmZml4TG9jKTsKICAgICB9IGVsc2UgewotICAgICAgRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KTsKKyAgICAgIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjppZGVudGlmaWVyOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC0yMTgzLDkgKzIyMTIsMTAgQEAKICAgICB9CiAKICAgICBSZXN1bHQuc2V0TGl0ZXJhbE9wZXJhdG9ySWQoSUksIEtleXdvcmRMb2MsIFN1ZmZpeExvYyk7Ci0gICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIEFjdGlvbnMuY2hlY2tMaXRlcmFsT3BlcmF0b3JJZChTUywgUmVzdWx0KTsKICAgfQotICAKKwogICAvLyBQYXJzZSBhIGNvbnZlcnNpb24tZnVuY3Rpb24taWQuCiAgIC8vCiAgIC8vICAgY29udmVyc2lvbi1mdW5jdGlvbi1pZDogW0MrKyAxMi4zLjJdCkBAIC0yNjc4LDc5ICsyNzA4LDE3IEBACiAgIHJldHVybiBBY3Rpb25zLkFjdE9uQ1hYRGVsZXRlKFN0YXJ0LCBVc2VHbG9iYWwsIEFycmF5RGVsZXRlLCBPcGVyYW5kLnRha2UoKSk7CiB9CiAKLXN0YXRpYyBVbmFyeVR5cGVUcmFpdCBVbmFyeVR5cGVUcmFpdEZyb21Ub2tLaW5kKHRvazo6VG9rZW5LaW5kIGtpbmQpIHsKLSAgc3dpdGNoKGtpbmQpIHsKLSAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiTm90IGEga25vd24gdW5hcnkgdHlwZSB0cmFpdC4iKTsKLSAgY2FzZSB0b2s6Omt3X19faGFzX25vdGhyb3dfYXNzaWduOiAgICAgIHJldHVybiBVVFRfSGFzTm90aHJvd0Fzc2lnbjsKLSAgY2FzZSB0b2s6Omt3X19faGFzX25vdGhyb3dfbW92ZV9hc3NpZ246IHJldHVybiBVVFRfSGFzTm90aHJvd01vdmVBc3NpZ247Ci0gIGNhc2UgdG9rOjprd19fX2hhc19ub3Rocm93X2NvbnN0cnVjdG9yOiByZXR1cm4gVVRUX0hhc05vdGhyb3dDb25zdHJ1Y3RvcjsKLSAgY2FzZSB0b2s6Omt3X19faGFzX25vdGhyb3dfY29weTogICAgICAgICAgIHJldHVybiBVVFRfSGFzTm90aHJvd0NvcHk7Ci0gIGNhc2UgdG9rOjprd19fX2hhc190cml2aWFsX2Fzc2lnbjogICAgICByZXR1cm4gVVRUX0hhc1RyaXZpYWxBc3NpZ247Ci0gIGNhc2UgdG9rOjprd19fX2hhc190cml2aWFsX21vdmVfYXNzaWduOiByZXR1cm4gVVRUX0hhc1RyaXZpYWxNb3ZlQXNzaWduOwotICBjYXNlIHRvazo6a3dfX19oYXNfdHJpdmlhbF9jb25zdHJ1Y3RvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVVFRfSGFzVHJpdmlhbERlZmF1bHRDb25zdHJ1Y3RvcjsKLSAgY2FzZSB0b2s6Omt3X19faGFzX3RyaXZpYWxfbW92ZV9jb25zdHJ1Y3RvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVVFRfSGFzVHJpdmlhbE1vdmVDb25zdHJ1Y3RvcjsKLSAgY2FzZSB0b2s6Omt3X19faGFzX3RyaXZpYWxfY29weTogICAgICAgICAgIHJldHVybiBVVFRfSGFzVHJpdmlhbENvcHk7Ci0gIGNhc2UgdG9rOjprd19fX2hhc190cml2aWFsX2Rlc3RydWN0b3I6ICByZXR1cm4gVVRUX0hhc1RyaXZpYWxEZXN0cnVjdG9yOwotICBjYXNlIHRvazo6a3dfX19oYXNfdmlydHVhbF9kZXN0cnVjdG9yOiAgcmV0dXJuIFVUVF9IYXNWaXJ0dWFsRGVzdHJ1Y3RvcjsKLSAgY2FzZSB0b2s6Omt3X19faXNfYWJzdHJhY3Q6ICAgICAgICAgICAgIHJldHVybiBVVFRfSXNBYnN0cmFjdDsKLSAgY2FzZSB0b2s6Omt3X19faXNfYXJpdGhtZXRpYzogICAgICAgICAgICAgIHJldHVybiBVVFRfSXNBcml0aG1ldGljOwotICBjYXNlIHRvazo6a3dfX19pc19hcnJheTogICAgICAgICAgICAgICAgICAgcmV0dXJuIFVUVF9Jc0FycmF5OwotICBjYXNlIHRvazo6a3dfX19pc19jbGFzczogICAgICAgICAgICAgICAgcmV0dXJuIFVUVF9Jc0NsYXNzOwotICBjYXNlIHRvazo6a3dfX19pc19jb21wbGV0ZV90eXBlOiAgICAgICAgICAgcmV0dXJuIFVUVF9Jc0NvbXBsZXRlVHlwZTsKLSAgY2FzZSB0b2s6Omt3X19faXNfY29tcG91bmQ6ICAgICAgICAgICAgICAgIHJldHVybiBVVFRfSXNDb21wb3VuZDsKLSAgY2FzZSB0b2s6Omt3X19faXNfY29uc3Q6ICAgICAgICAgICAgICAgICAgIHJldHVybiBVVFRfSXNDb25zdDsKLSAgY2FzZSB0b2s6Omt3X19faXNfZW1wdHk6ICAgICAgICAgICAgICAgIHJldHVybiBVVFRfSXNFbXB0eTsKLSAgY2FzZSB0b2s6Omt3X19faXNfZW51bTogICAgICAgICAgICAgICAgIHJldHVybiBVVFRfSXNFbnVtOwotICBjYXNlIHRvazo6a3dfX19pc19maW5hbDogICAgICAgICAgICAgICAgIHJldHVybiBVVFRfSXNGaW5hbDsKLSAgY2FzZSB0b2s6Omt3X19faXNfZmxvYXRpbmdfcG9pbnQ6ICAgICAgICAgIHJldHVybiBVVFRfSXNGbG9hdGluZ1BvaW50OwotICBjYXNlIHRvazo6a3dfX19pc19mdW5jdGlvbjogICAgICAgICAgICAgICAgcmV0dXJuIFVUVF9Jc0Z1bmN0aW9uOwotICBjYXNlIHRvazo6a3dfX19pc19mdW5kYW1lbnRhbDogICAgICAgICAgICAgcmV0dXJuIFVUVF9Jc0Z1bmRhbWVudGFsOwotICBjYXNlIHRvazo6a3dfX19pc19pbnRlZ3JhbDogICAgICAgICAgICAgICAgcmV0dXJuIFVUVF9Jc0ludGVncmFsOwotICBjYXNlIHRvazo6a3dfX19pc19pbnRlcmZhY2VfY2xhc3M6ICAgICAgICAgcmV0dXJuIFVUVF9Jc0ludGVyZmFjZUNsYXNzOwotICBjYXNlIHRvazo6a3dfX19pc19sdmFsdWVfcmVmZXJlbmNlOiAgICAgICAgcmV0dXJuIFVUVF9Jc0x2YWx1ZVJlZmVyZW5jZTsKLSAgY2FzZSB0b2s6Omt3X19faXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXI6IHJldHVybiBVVFRfSXNNZW1iZXJGdW5jdGlvblBvaW50ZXI7Ci0gIGNhc2UgdG9rOjprd19fX2lzX21lbWJlcl9vYmplY3RfcG9pbnRlcjogICByZXR1cm4gVVRUX0lzTWVtYmVyT2JqZWN0UG9pbnRlcjsKLSAgY2FzZSB0b2s6Omt3X19faXNfbWVtYmVyX3BvaW50ZXI6ICAgICAgICAgIHJldHVybiBVVFRfSXNNZW1iZXJQb2ludGVyOwotICBjYXNlIHRvazo6a3dfX19pc19vYmplY3Q6ICAgICAgICAgICAgICAgICAgcmV0dXJuIFVUVF9Jc09iamVjdDsKLSAgY2FzZSB0b2s6Omt3X19faXNfbGl0ZXJhbDogICAgICAgICAgICAgIHJldHVybiBVVFRfSXNMaXRlcmFsOwotICBjYXNlIHRvazo6a3dfX19pc19saXRlcmFsX3R5cGU6ICAgICAgICAgcmV0dXJuIFVUVF9Jc0xpdGVyYWw7Ci0gIGNhc2UgdG9rOjprd19fX2lzX3BvZDogICAgICAgICAgICAgICAgICByZXR1cm4gVVRUX0lzUE9EOwotICBjYXNlIHRvazo6a3dfX19pc19wb2ludGVyOiAgICAgICAgICAgICAgICAgcmV0dXJuIFVUVF9Jc1BvaW50ZXI7Ci0gIGNhc2UgdG9rOjprd19fX2lzX3BvbHltb3JwaGljOiAgICAgICAgICByZXR1cm4gVVRUX0lzUG9seW1vcnBoaWM7Ci0gIGNhc2UgdG9rOjprd19fX2lzX3JlZmVyZW5jZTogICAgICAgICAgICAgICByZXR1cm4gVVRUX0lzUmVmZXJlbmNlOwotICBjYXNlIHRvazo6a3dfX19pc19ydmFsdWVfcmVmZXJlbmNlOiAgICAgICAgcmV0dXJuIFVUVF9Jc1J2YWx1ZVJlZmVyZW5jZTsKLSAgY2FzZSB0b2s6Omt3X19faXNfc2NhbGFyOiAgICAgICAgICAgICAgICAgIHJldHVybiBVVFRfSXNTY2FsYXI7Ci0gIGNhc2UgdG9rOjprd19fX2lzX3NlYWxlZDogICAgICAgICAgICAgICAgICByZXR1cm4gVVRUX0lzU2VhbGVkOwotICBjYXNlIHRvazo6a3dfX19pc19zaWduZWQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIFVUVF9Jc1NpZ25lZDsKLSAgY2FzZSB0b2s6Omt3X19faXNfc3RhbmRhcmRfbGF5b3V0OiAgICAgICAgIHJldHVybiBVVFRfSXNTdGFuZGFyZExheW91dDsKLSAgY2FzZSB0b2s6Omt3X19faXNfdHJpdmlhbDogICAgICAgICAgICAgICAgIHJldHVybiBVVFRfSXNUcml2aWFsOwotICBjYXNlIHRvazo6a3dfX19pc190cml2aWFsbHlfY29weWFibGU6ICAgICAgcmV0dXJuIFVUVF9Jc1RyaXZpYWxseUNvcHlhYmxlOwotICBjYXNlIHRvazo6a3dfX19pc191bmlvbjogICAgICAgICAgICAgICAgcmV0dXJuIFVUVF9Jc1VuaW9uOwotICBjYXNlIHRvazo6a3dfX19pc191bnNpZ25lZDogICAgICAgICAgICAgICAgcmV0dXJuIFVUVF9Jc1Vuc2lnbmVkOwotICBjYXNlIHRvazo6a3dfX19pc192b2lkOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVUVF9Jc1ZvaWQ7Ci0gIGNhc2UgdG9rOjprd19fX2lzX3ZvbGF0aWxlOiAgICAgICAgICAgICAgICByZXR1cm4gVVRUX0lzVm9sYXRpbGU7Ci0gIH0KLX0KLQotc3RhdGljIEJpbmFyeVR5cGVUcmFpdCBCaW5hcnlUeXBlVHJhaXRGcm9tVG9rS2luZCh0b2s6OlRva2VuS2luZCBraW5kKSB7Ci0gIHN3aXRjaChraW5kKSB7Ci0gIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIk5vdCBhIGtub3duIGJpbmFyeSB0eXBlIHRyYWl0Iik7Ci0gIGNhc2UgdG9rOjprd19fX2lzX2Jhc2Vfb2Y6ICAgICAgICAgICAgICAgICByZXR1cm4gQlRUX0lzQmFzZU9mOwotICBjYXNlIHRvazo6a3dfX19pc19jb252ZXJ0aWJsZTogICAgICAgICAgICAgcmV0dXJuIEJUVF9Jc0NvbnZlcnRpYmxlOwotICBjYXNlIHRvazo6a3dfX19pc19zYW1lOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJUVF9Jc1NhbWU7Ci0gIGNhc2UgdG9rOjprd19fX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wOiByZXR1cm4gQlRUX1R5cGVDb21wYXRpYmxlOwotICBjYXNlIHRvazo6a3dfX19pc19jb252ZXJ0aWJsZV90bzogICAgICAgICAgcmV0dXJuIEJUVF9Jc0NvbnZlcnRpYmxlVG87Ci0gIGNhc2UgdG9rOjprd19fX2lzX3RyaXZpYWxseV9hc3NpZ25hYmxlOiAgICByZXR1cm4gQlRUX0lzVHJpdmlhbGx5QXNzaWduYWJsZTsKLSAgfQotfQotCiBzdGF0aWMgVHlwZVRyYWl0IFR5cGVUcmFpdEZyb21Ub2tLaW5kKHRvazo6VG9rZW5LaW5kIGtpbmQpIHsKICAgc3dpdGNoIChraW5kKSB7CiAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIk5vdCBhIGtub3duIHR5cGUgdHJhaXQiKTsKLSAgY2FzZSB0b2s6Omt3X19faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGU6IAotICAgIHJldHVybiBUVF9Jc1RyaXZpYWxseUNvbnN0cnVjdGlibGU7CisjZGVmaW5lIFRZUEVfVFJBSVRfMShTcGVsbGluZywgTmFtZSwgS2V5KSBcCitjYXNlIHRvazo6a3dfICMjIFNwZWxsaW5nOiByZXR1cm4gVVRUXyAjIyBOYW1lOworI2RlZmluZSBUWVBFX1RSQUlUXzIoU3BlbGxpbmcsIE5hbWUsIEtleSkgXAorY2FzZSB0b2s6Omt3XyAjIyBTcGVsbGluZzogcmV0dXJuIEJUVF8gIyMgTmFtZTsKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9Ub2tlbktpbmRzLmRlZiIKKyNkZWZpbmUgVFlQRV9UUkFJVF9OKFNwZWxsaW5nLCBOYW1lLCBLZXkpIFwKKyAgY2FzZSB0b2s6Omt3XyAjIyBTcGVsbGluZzogcmV0dXJuIFRUXyAjIyBOYW1lOworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Rva2VuS2luZHMuZGVmIgogICB9CiB9CiAKQEAgLTI3NzAsODcgKzI3MzgsMzMgQEAKICAgfQogfQogCi0vLy8gUGFyc2VVbmFyeVR5cGVUcmFpdCAtIFBhcnNlIHRoZSBidWlsdC1pbiB1bmFyeSB0eXBlLXRyYWl0Ci0vLy8gcHNldWRvLWZ1bmN0aW9ucyB0aGF0IGFsbG93IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUUjEvQysrMHggdHlwZSB0cmFpdHMKLS8vLyB0ZW1wbGF0ZXMuCi0vLy8KLS8vLyAgICAgICBwcmltYXJ5LWV4cHJlc3Npb246Ci0vLy8gW0dOVV0gICAgICAgICAgICAgdW5hcnktdHlwZS10cmFpdCAnKCcgdHlwZS1pZCAnKScKLS8vLwotRXhwclJlc3VsdCBQYXJzZXI6OlBhcnNlVW5hcnlUeXBlVHJhaXQoKSB7Ci0gIFVuYXJ5VHlwZVRyYWl0IFVUVCA9IFVuYXJ5VHlwZVRyYWl0RnJvbVRva0tpbmQoVG9rLmdldEtpbmQoKSk7Ci0gIFNvdXJjZUxvY2F0aW9uIExvYyA9IENvbnN1bWVUb2tlbigpOwotCi0gIEJhbGFuY2VkRGVsaW1pdGVyVHJhY2tlciBUKCp0aGlzLCB0b2s6OmxfcGFyZW4pOwotICBpZiAoVC5leHBlY3RBbmRDb25zdW1lKGRpYWc6OmVycl9leHBlY3RlZF9scGFyZW4pKQotICAgIHJldHVybiBFeHByRXJyb3IoKTsKLQotICAvLyBGSVhNRTogRXJyb3IgcmVwb3J0aW5nIGFic29sdXRlbHkgc3Vja3MhIElmIHRoZSB0aGlzIGZhaWxzIHRvIHBhcnNlIGEgdHlwZQotICAvLyB0aGVyZSB3aWxsIGJlIGNyeXB0aWMgZXJyb3JzIGFib3V0IG1pc21hdGNoZWQgcGFyZW50aGVzZXMgYW5kIG1pc3NpbmcKLSAgLy8gc3BlY2lmaWVycy4KLSAgVHlwZVJlc3VsdCBUeSA9IFBhcnNlVHlwZU5hbWUoKTsKLQotICBULmNvbnN1bWVDbG9zZSgpOwotCi0gIGlmIChUeS5pc0ludmFsaWQoKSkKLSAgICByZXR1cm4gRXhwckVycm9yKCk7Ci0KLSAgcmV0dXJuIEFjdGlvbnMuQWN0T25VbmFyeVR5cGVUcmFpdChVVFQsIExvYywgVHkuZ2V0KCksIFQuZ2V0Q2xvc2VMb2NhdGlvbigpKTsKLX0KLQotLy8vIFBhcnNlQmluYXJ5VHlwZVRyYWl0IC0gUGFyc2UgdGhlIGJ1aWx0LWluIGJpbmFyeSB0eXBlLXRyYWl0Ci0vLy8gcHNldWRvLWZ1bmN0aW9ucyB0aGF0IGFsbG93IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUUjEvQysrMHggdHlwZSB0cmFpdHMKLS8vLyB0ZW1wbGF0ZXMuCi0vLy8KLS8vLyAgICAgICBwcmltYXJ5LWV4cHJlc3Npb246Ci0vLy8gW0dOVV0gICAgICAgICAgICAgYmluYXJ5LXR5cGUtdHJhaXQgJygnIHR5cGUtaWQgJywnIHR5cGUtaWQgJyknCi0vLy8KLUV4cHJSZXN1bHQgUGFyc2VyOjpQYXJzZUJpbmFyeVR5cGVUcmFpdCgpIHsKLSAgQmluYXJ5VHlwZVRyYWl0IEJUVCA9IEJpbmFyeVR5cGVUcmFpdEZyb21Ub2tLaW5kKFRvay5nZXRLaW5kKCkpOwotICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBDb25zdW1lVG9rZW4oKTsKLQotICBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIgVCgqdGhpcywgdG9rOjpsX3BhcmVuKTsKLSAgaWYgKFQuZXhwZWN0QW5kQ29uc3VtZShkaWFnOjplcnJfZXhwZWN0ZWRfbHBhcmVuKSkKLSAgICByZXR1cm4gRXhwckVycm9yKCk7Ci0KLSAgVHlwZVJlc3VsdCBMaHNUeSA9IFBhcnNlVHlwZU5hbWUoKTsKLSAgaWYgKExoc1R5LmlzSW52YWxpZCgpKSB7Ci0gICAgU2tpcFVudGlsKHRvazo6cl9wYXJlbiwgU3RvcEF0U2VtaSk7Ci0gICAgcmV0dXJuIEV4cHJFcnJvcigpOworc3RhdGljIHVuc2lnbmVkIFR5cGVUcmFpdEFyaXR5KHRvazo6VG9rZW5LaW5kIGtpbmQpIHsKKyAgc3dpdGNoIChraW5kKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiTm90IGEga25vd24gdHlwZSB0cmFpdCIpOworI2RlZmluZSBUWVBFX1RSQUlUKE4sU3BlbGxpbmcsSykgY2FzZSB0b2s6Omt3XyMjU3BlbGxpbmc6IHJldHVybiBOOworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Rva2VuS2luZHMuZGVmIgogICB9Ci0KLSAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbW1hKSkgewotICAgIFNraXBVbnRpbCh0b2s6OnJfcGFyZW4sIFN0b3BBdFNlbWkpOwotICAgIHJldHVybiBFeHByRXJyb3IoKTsKLSAgfQotCi0gIFR5cGVSZXN1bHQgUmhzVHkgPSBQYXJzZVR5cGVOYW1lKCk7Ci0gIGlmIChSaHNUeS5pc0ludmFsaWQoKSkgewotICAgIFNraXBVbnRpbCh0b2s6OnJfcGFyZW4sIFN0b3BBdFNlbWkpOwotICAgIHJldHVybiBFeHByRXJyb3IoKTsKLSAgfQotCi0gIFQuY29uc3VtZUNsb3NlKCk7Ci0KLSAgcmV0dXJuIEFjdGlvbnMuQWN0T25CaW5hcnlUeXBlVHJhaXQoQlRULCBMb2MsIExoc1R5LmdldCgpLCBSaHNUeS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5nZXRDbG9zZUxvY2F0aW9uKCkpOwogfQogCiAvLy8gXGJyaWVmIFBhcnNlIHRoZSBidWlsdC1pbiB0eXBlLXRyYWl0IHBzZXVkby1mdW5jdGlvbnMgdGhhdCBhbGxvdyAKIC8vLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFIxL0MrKzExIHR5cGUgdHJhaXRzIHRlbXBsYXRlcy4KIC8vLwogLy8vICAgICAgIHByaW1hcnktZXhwcmVzc2lvbjoKKy8vLyAgICAgICAgICB1bmFyeS10eXBlLXRyYWl0ICcoJyB0eXBlLWlkICcpJworLy8vICAgICAgICAgIGJpbmFyeS10eXBlLXRyYWl0ICcoJyB0eXBlLWlkICcsJyB0eXBlLWlkICcpJwogLy8vICAgICAgICAgIHR5cGUtdHJhaXQgJygnIHR5cGUtaWQtc2VxICcpJwogLy8vCiAvLy8gICAgICAgdHlwZS1pZC1zZXE6CiAvLy8gICAgICAgICAgdHlwZS1pZCAuLi5bb3B0XSB0eXBlLWlkLXNlcVtvcHRdCiAvLy8KIEV4cHJSZXN1bHQgUGFyc2VyOjpQYXJzZVR5cGVUcmFpdCgpIHsKLSAgVHlwZVRyYWl0IEtpbmQgPSBUeXBlVHJhaXRGcm9tVG9rS2luZChUb2suZ2V0S2luZCgpKTsKKyAgdG9rOjpUb2tlbktpbmQgS2luZCA9IFRvay5nZXRLaW5kKCk7CisgIHVuc2lnbmVkIEFyaXR5ID0gVHlwZVRyYWl0QXJpdHkoS2luZCk7CisKICAgU291cmNlTG9jYXRpb24gTG9jID0gQ29uc3VtZVRva2VuKCk7CiAgIAogICBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIgUGFyZW5zKCp0aGlzLCB0b2s6OmxfcGFyZW4pOwotICBpZiAoUGFyZW5zLmV4cGVjdEFuZENvbnN1bWUoZGlhZzo6ZXJyX2V4cGVjdGVkX2xwYXJlbikpCisgIGlmIChQYXJlbnMuZXhwZWN0QW5kQ29uc3VtZSgpKQogICAgIHJldHVybiBFeHByRXJyb3IoKTsKIAogICBTbWFsbFZlY3RvcjxQYXJzZWRUeXBlLCAyPiBBcmdzOwpAQCAtMjg3MywxOSArMjc4NywyNiBAQAogICAgIAogICAgIC8vIEFkZCB0aGlzIHR5cGUgdG8gdGhlIGxpc3Qgb2YgYXJndW1lbnRzLgogICAgIEFyZ3MucHVzaF9iYWNrKFR5LmdldCgpKTsKLSAgICAKLSAgICBpZiAoVG9rLmlzKHRvazo6Y29tbWEpKSB7Ci0gICAgICBDb25zdW1lVG9rZW4oKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAKLSAgICBicmVhazsKLSAgfSB3aGlsZSAodHJ1ZSk7Ci0gIAorICB9IHdoaWxlIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpOworCiAgIGlmIChQYXJlbnMuY29uc3VtZUNsb3NlKCkpCiAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwotICAKLSAgcmV0dXJuIEFjdGlvbnMuQWN0T25UeXBlVHJhaXQoS2luZCwgTG9jLCBBcmdzLCBQYXJlbnMuZ2V0Q2xvc2VMb2NhdGlvbigpKTsKKworICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MgPSBQYXJlbnMuZ2V0Q2xvc2VMb2NhdGlvbigpOworCisgIGlmIChBcml0eSAmJiBBcmdzLnNpemUoKSAhPSBBcml0eSkgeworICAgIERpYWcoRW5kTG9jLCBkaWFnOjplcnJfdHlwZV90cmFpdF9hcml0eSkKKyAgICAgIDw8IEFyaXR5IDw8IDAgPDwgKEFyaXR5ID4gMSkgPDwgKGludClBcmdzLnNpemUoKSA8PCBTb3VyY2VSYW5nZShMb2MpOworICAgIHJldHVybiBFeHByRXJyb3IoKTsKKyAgfQorCisgIGlmICghQXJpdHkgJiYgQXJncy5lbXB0eSgpKSB7CisgICAgRGlhZyhFbmRMb2MsIGRpYWc6OmVycl90eXBlX3RyYWl0X2FyaXR5KQorICAgICAgPDwgMSA8PCAxIDw8IDEgPDwgKGludClBcmdzLnNpemUoKSA8PCBTb3VyY2VSYW5nZShMb2MpOworICAgIHJldHVybiBFeHByRXJyb3IoKTsKKyAgfQorCisgIHJldHVybiBBY3Rpb25zLkFjdE9uVHlwZVRyYWl0KFR5cGVUcmFpdEZyb21Ub2tLaW5kKEtpbmQpLCBMb2MsIEFyZ3MsIEVuZExvYyk7CiB9CiAKIC8vLyBQYXJzZUFycmF5VHlwZVRyYWl0IC0gUGFyc2UgdGhlIGJ1aWx0LWluIGFycmF5IHR5cGUtdHJhaXQKQEAgLTI5MDAsNyArMjgyMSw3IEBACiAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IENvbnN1bWVUb2tlbigpOwogCiAgIEJhbGFuY2VkRGVsaW1pdGVyVHJhY2tlciBUKCp0aGlzLCB0b2s6OmxfcGFyZW4pOwotICBpZiAoVC5leHBlY3RBbmRDb25zdW1lKGRpYWc6OmVycl9leHBlY3RlZF9scGFyZW4pKQorICBpZiAoVC5leHBlY3RBbmRDb25zdW1lKCkpCiAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogCiAgIFR5cGVSZXN1bHQgVHkgPSBQYXJzZVR5cGVOYW1lKCk7CkBAIC0yOTE3LDcgKzI4MzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5nZXRDbG9zZUxvY2F0aW9uKCkpOwogICB9CiAgIGNhc2UgQVRUX0FycmF5RXh0ZW50OiB7Ci0gICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb21tYSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbW1hKSkgeworICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29tbWEpKSB7CiAgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICB9CkBAIC0yOTQzLDcgKzI4NjQsNyBAQAogICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBDb25zdW1lVG9rZW4oKTsKIAogICBCYWxhbmNlZERlbGltaXRlclRyYWNrZXIgVCgqdGhpcywgdG9rOjpsX3BhcmVuKTsKLSAgaWYgKFQuZXhwZWN0QW5kQ29uc3VtZShkaWFnOjplcnJfZXhwZWN0ZWRfbHBhcmVuKSkKKyAgaWYgKFQuZXhwZWN0QW5kQ29uc3VtZSgpKQogICAgIHJldHVybiBFeHByRXJyb3IoKTsKIAogICBFeHByUmVzdWx0IEV4cHIgPSBQYXJzZUV4cHJlc3Npb24oKTsKZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZUluaXQuY3BwIGIvbGliL1BhcnNlL1BhcnNlSW5pdC5jcHAKaW5kZXggMzdmNzRiYi4uNDQwNTNmMSAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL1BhcnNlSW5pdC5jcHAKKysrIGIvbGliL1BhcnNlL1BhcnNlSW5pdC5jcHAKQEAgLTEwNSw4ICsxMDUsNiBAQAogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICB9Ci0gIAotICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgQ2hlY2tBcnJheURlc2lnbmF0b3JTeW50YXgoUGFyc2VyICZQLCBTb3VyY2VMb2NhdGlvbiBMb2MsCkBAIC00OTMsNyArNDkxLDcgQEAKICAgCiAgIEJhbGFuY2VkRGVsaW1pdGVyVHJhY2tlciBCcmFjZXMoKnRoaXMsIHRvazo6bF9icmFjZSk7CiAgIGlmIChCcmFjZXMuY29uc3VtZU9wZW4oKSkgewotICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfbGJyYWNlKTsKKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfYnJhY2U7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKQEAgLTUxMiw3ICs1MTAsNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIHdoaWxlIChUb2suaXNOb3QodG9rOjplb2YpKSB7CisgIHdoaWxlICghaXNFb2ZPckVvbSgpKSB7CiAgICAgdHJhaWxpbmdDb21tYSA9IGZhbHNlOwogICAgIC8vIElmIHdlIGtub3cgdGhhdCB0aGlzIGNhbm5vdCBiZSBhIGRlc2lnbmF0aW9uLCBqdXN0IHBhcnNlIHRoZSBuZXN0ZWQKICAgICAvLyBpbml0aWFsaXplciBkaXJlY3RseS4KZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZU9iamMuY3BwIGIvbGliL1BhcnNlL1BhcnNlT2JqYy5jcHAKaW5kZXggODZmMzhjZi4uNzc2ZGJkNiAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL1BhcnNlT2JqYy5jcHAKKysrIGIvbGliL1BhcnNlL1BhcnNlT2JqYy5jcHAKQEAgLTgxLDkgKzgxLDkgQEAKICAgY2FzZSB0b2s6Om9iamNfaW1wb3J0OgogICAgIGlmIChnZXRMYW5nT3B0cygpLk1vZHVsZXMpCiAgICAgICByZXR1cm4gUGFyc2VNb2R1bGVJbXBvcnQoQXRMb2MpOwotICAgICAgCi0gICAgLy8gRmFsbCB0aHJvdWdoCi0gICAgICAKKyAgICBEaWFnKEF0TG9jLCBkaWFnOjplcnJfYXRpbXBvcnQpOworICAgIFNraXBVbnRpbCh0b2s6OnNlbWkpOworICAgIHJldHVybiBBY3Rpb25zLkNvbnZlcnREZWNsVG9EZWNsR3JvdXAoMCk7CiAgIGRlZmF1bHQ6CiAgICAgRGlhZyhBdExvYywgZGlhZzo6ZXJyX3VuZXhwZWN0ZWRfYXQpOwogICAgIFNraXBVbnRpbCh0b2s6OnNlbWkpOwpAQCAtMTA3LDcgKzEwNyw3IEBACiAgIHdoaWxlICgxKSB7CiAgICAgTWF5YmVTa2lwQXR0cmlidXRlcyh0b2s6Om9iamNfY2xhc3MpOwogICAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkgewotICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCk7CisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmlkZW50aWZpZXI7CiAgICAgICBTa2lwVW50aWwodG9rOjpzZW1pKTsKICAgICAgIHJldHVybiBBY3Rpb25zLkNvbnZlcnREZWNsVG9EZWNsR3JvdXAoMCk7CiAgICAgfQpAQCAtMTE1LDE0ICsxMTUsMTIgQEAKICAgICBDbGFzc0xvY3MucHVzaF9iYWNrKFRvay5nZXRMb2NhdGlvbigpKTsKICAgICBDb25zdW1lVG9rZW4oKTsKIAotICAgIGlmIChUb2suaXNOb3QodG9rOjpjb21tYSkpCisgICAgaWYgKCFUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpCiAgICAgICBicmVhazsKLQotICAgIENvbnN1bWVUb2tlbigpOwogICB9CiAKICAgLy8gQ29uc3VtZSB0aGUgJzsnLgotICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2FmdGVyLCAiQGNsYXNzIikpCisgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6c2VtaSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2FmdGVyLCAiQGNsYXNzIikpCiAgICAgcmV0dXJuIEFjdGlvbnMuQ29udmVydERlY2xUb0RlY2xHcm91cCgwKTsKIAogICByZXR1cm4gQWN0aW9ucy5BY3RPbkZvcndhcmRDbGFzc0RlY2xhcmF0aW9uKGF0TG9jLCBDbGFzc05hbWVzLmRhdGEoKSwKQEAgLTE5NSw3ICsxOTMsOCBAQAogICBNYXliZVNraXBBdHRyaWJ1dGVzKHRvazo6b2JqY19pbnRlcmZhY2UpOwogCiAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkgewotICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOyAvLyBtaXNzaW5nIGNsYXNzIG9yIGNhdGVnb3J5IG5hbWUuCisgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkKKyAgICAgICAgPDwgdG9rOjppZGVudGlmaWVyOyAvLyBtaXNzaW5nIGNsYXNzIG9yIGNhdGVnb3J5IG5hbWUuCiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjIyLDcgKzIyMSw4IEBACiAgICAgICBjYXRlZ29yeUxvYyA9IENvbnN1bWVUb2tlbigpOwogICAgIH0KICAgICBlbHNlIGlmICghZ2V0TGFuZ09wdHMoKS5PYmpDMikgewotICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCk7IC8vIG1pc3NpbmcgY2F0ZWdvcnkgbmFtZS4KKyAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpCisgICAgICAgICAgPDwgdG9rOjppZGVudGlmaWVyOyAvLyBtaXNzaW5nIGNhdGVnb3J5IG5hbWUuCiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAKQEAgLTI3NCw3ICsyNzQsOCBAQAogICAgIH0KIAogICAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkgewotICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCk7IC8vIG1pc3Npbmcgc3VwZXIgY2xhc3MgbmFtZS4KKyAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpCisgICAgICAgICAgPDwgdG9rOjppZGVudGlmaWVyOyAvLyBtaXNzaW5nIHN1cGVyIGNsYXNzIG5hbWUuCiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgc3VwZXJDbGFzc0lkID0gVG9rLmdldElkZW50aWZpZXJJbmZvKCk7CkBAIC0zMjgsNyArMzI5LDcgQEAKICAgICBNZXRob2RJbXBsS2luZChNZXRob2RJbXBsS2luZCkgewogICB9CiAKLSAgdm9pZCBpbnZva2UoUGFyc2luZ0ZpZWxkRGVjbGFyYXRvciAmRkQpIHsKKyAgdm9pZCBpbnZva2UoUGFyc2luZ0ZpZWxkRGVjbGFyYXRvciAmRkQpIG92ZXJyaWRlIHsKICAgICBpZiAoRkQuRC5nZXRJZGVudGlmaWVyKCkgPT0gMCkgewogICAgICAgUC5EaWFnKEF0TG9jLCBkaWFnOjplcnJfb2JqY19wcm9wZXJ0eV9yZXF1aXJlc19maWVsZF9uYW1lKQogICAgICAgICA8PCBGRC5ELmdldFNvdXJjZVJhbmdlKCk7CkBAIC00MjMsNyArNDI0LDcgQEAKICAgICB9CiAKICAgICAvLyBJZiB3ZSBnb3QgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgZXhpdCB0aGUgbG9vcC4KLSAgICBpZiAoVG9rLmlzKHRvazo6ZW9mKSkKKyAgICBpZiAoaXNFb2ZPckVvbSgpKQogICAgICAgYnJlYWs7CiAKICAgICAvLyBDb2RlIGNvbXBsZXRpb24gd2l0aGluIGFuIE9iamVjdGl2ZS1DIGludGVyZmFjZS4KQEAgLTYxMCw4ICs2MTEsMTAgQEAKICAgICAgIHVuc2lnbmVkIERpYWdJRCA9IElzU2V0dGVyID8gZGlhZzo6ZXJyX29iamNfZXhwZWN0ZWRfZXF1YWxfZm9yX3NldHRlciA6CiAgICAgICAgIGRpYWc6OmVycl9vYmpjX2V4cGVjdGVkX2VxdWFsX2Zvcl9nZXR0ZXI7CiAKLSAgICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6ZXF1YWwsIERpYWdJRCwgIiIsIHRvazo6cl9wYXJlbikpCisgICAgICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OmVxdWFsLCBEaWFnSUQpKSB7CisgICAgICAgIFNraXBVbnRpbCh0b2s6OnJfcGFyZW4sIFN0b3BBdFNlbWkpOwogICAgICAgICByZXR1cm47CisgICAgICB9CiAKICAgICAgIGlmIChUb2suaXModG9rOjpjb2RlX2NvbXBsZXRpb24pKSB7CiAgICAgICAgIGlmIChJc1NldHRlcikKQEAgLTYzNiwxMCArNjM5LDExIEBACiAgICAgICAgIERTLnNldFByb3BlcnR5QXR0cmlidXRlcyhPYmpDRGVjbFNwZWM6OkRRX1BSX3NldHRlcik7CiAgICAgICAgIERTLnNldFNldHRlck5hbWUoU2VsSWRlbnQpOwogCi0gICAgICAgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6Y29sb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfZXhwZWN0ZWRfY29sb25fYWZ0ZXJfc2V0dGVyX25hbWUsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OnJfcGFyZW4pKQorICAgICAgICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OmNvbG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfZXhwZWN0ZWRfY29sb25fYWZ0ZXJfc2V0dGVyX25hbWUpKSB7CisgICAgICAgICAgU2tpcFVudGlsKHRvazo6cl9wYXJlbiwgU3RvcEF0U2VtaSk7CiAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICB9IGVsc2UgewogICAgICAgICBEUy5zZXRQcm9wZXJ0eUF0dHJpYnV0ZXMoT2JqQ0RlY2xTcGVjOjpEUV9QUl9nZXR0ZXIpOwogICAgICAgICBEUy5zZXRHZXR0ZXJOYW1lKFNlbElkZW50KTsKQEAgLTEwNTQsMTEgKzEwNTgsOCBAQAogICAgIFNlbWE6Ok9iakNBcmdJbmZvIEFyZ0luZm87CiAKICAgICAvLyBFYWNoIGl0ZXJhdGlvbiBwYXJzZXMgYSBzaW5nbGUga2V5d29yZCBhcmd1bWVudC4KLSAgICBpZiAoVG9rLmlzTm90KHRvazo6Y29sb24pKSB7Ci0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbG9uKTsKKyAgICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OmNvbG9uKSkKICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBDb25zdW1lVG9rZW4oKTsgLy8gRWF0IHRoZSAnOicuCiAKICAgICBBcmdJbmZvLlR5cGUgPSBQYXJzZWRUeXBlKCk7CiAgICAgaWYgKFRvay5pcyh0b2s6OmxfcGFyZW4pKSAvLyBQYXJzZSB0aGUgYXJndW1lbnQgdHlwZSBpZiBwcmVzZW50LgpAQCAtMTA4Niw3ICsxMDg3LDggQEAKICAgICB9CiAgICAgCiAgICAgaWYgKFRvay5pc05vdCh0b2s6OmlkZW50aWZpZXIpKSB7Ci0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KTsgLy8gbWlzc2luZyBhcmd1bWVudCBuYW1lLgorICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkKKyAgICAgICAgICA8PCB0b2s6OmlkZW50aWZpZXI7IC8vIG1pc3NpbmcgYXJndW1lbnQgbmFtZS4KICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMTE5OCw3ICsxMjAwLDcgQEAKICAgICB9CiAKICAgICBpZiAoVG9rLmlzTm90KHRvazo6aWRlbnRpZmllcikpIHsKLSAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOworICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjppZGVudGlmaWVyOwogICAgICAgU2tpcFVudGlsKHRvazo6Z3JlYXRlciwgU3RvcEF0U2VtaSk7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xMjA3LDkgKzEyMDksOCBAQAogICAgIFByb3RvY29sTG9jcy5wdXNoX2JhY2soVG9rLmdldExvY2F0aW9uKCkpOwogICAgIENvbnN1bWVUb2tlbigpOwogCi0gICAgaWYgKFRvay5pc05vdCh0b2s6OmNvbW1hKSkKKyAgICBpZiAoIVRyeUNvbnN1bWVUb2tlbih0b2s6OmNvbW1hKSkKICAgICAgIGJyZWFrOwotICAgIENvbnN1bWVUb2tlbigpOwogICB9CiAKICAgLy8gQ29uc3VtZSB0aGUgJz4nLgpAQCAtMTI4OSw3ICsxMjkwLDcgQEAKICAgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyIFQoKnRoaXMsIHRvazo6bF9icmFjZSk7CiAgIFQuY29uc3VtZU9wZW4oKTsKICAgLy8gV2hpbGUgd2Ugc3RpbGwgaGF2ZSBzb21ldGhpbmcgdG8gcmVhZCwgcmVhZCB0aGUgaW5zdGFuY2UgdmFyaWFibGVzLgotICB3aGlsZSAoVG9rLmlzTm90KHRvazo6cl9icmFjZSkgJiYgVG9rLmlzTm90KHRvazo6ZW9mKSkgeworICB3aGlsZSAoVG9rLmlzTm90KHRvazo6cl9icmFjZSkgJiYgIWlzRW9mT3JFb20oKSkgewogICAgIC8vIEVhY2ggaXRlcmF0aW9uIG9mIHRoaXMgbG9vcCByZWFkcyBvbmUgb2JqYy1pbnN0YW5jZS12YXJpYWJsZS1kZWNsLgogCiAgICAgLy8gQ2hlY2sgZm9yIGV4dHJhbmVvdXMgdG9wLWxldmVsIHNlbWljb2xvbi4KQEAgLTEyOTksOSArMTMwMCw3IEBACiAgICAgfQogCiAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHZpc2liaWxpdHkgdG8gcHJpdmF0ZS4KLSAgICBpZiAoVG9rLmlzKHRvazo6YXQpKSB7IC8vIHBhcnNlIG9iamMtdmlzaWJpbGl0eS1zcGVjCi0gICAgICBDb25zdW1lVG9rZW4oKTsgLy8gZWF0IHRoZSBAIHNpZ24KLSAgICAgIAorICAgIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjphdCkpIHsgLy8gcGFyc2Ugb2JqYy12aXNpYmlsaXR5LXNwZWMKICAgICAgIGlmIChUb2suaXModG9rOjpjb2RlX2NvbXBsZXRpb24pKSB7CiAgICAgICAgIEFjdGlvbnMuQ29kZUNvbXBsZXRlT2JqQ0F0VmlzaWJpbGl0eShnZXRDdXJTY29wZSgpKTsKICAgICAgICAgcmV0dXJuIGN1dE9mZlBhcnNpbmcoKTsKQEAgLTEzNDksNyArMTM0OCw3IEBACiAgICAgICAgIFAoUCksIElEZWNsKElEZWNsKSwgdmlzaWJpbGl0eShWKSwgQWxsSXZhckRlY2xzKEFsbEl2YXJEZWNscykgewogICAgICAgfQogCi0gICAgICB2b2lkIGludm9rZShQYXJzaW5nRmllbGREZWNsYXJhdG9yICZGRCkgeworICAgICAgdm9pZCBpbnZva2UoUGFyc2luZ0ZpZWxkRGVjbGFyYXRvciAmRkQpIG92ZXJyaWRlIHsKICAgICAgICAgUC5BY3Rpb25zLkFjdE9uT2JqQ0NvbnRhaW5lclN0YXJ0RGVmaW5pdGlvbihJRGVjbCk7CiAgICAgICAgIC8vIEluc3RhbGwgdGhlIGRlY2xhcmF0b3IgaW50byB0aGUgaW50ZXJmYWNlIGRlY2wuCiAgICAgICAgIERlY2wgKkZpZWxkCkBAIC0xNDEyLDE2ICsxNDExLDE1IEBACiAgIE1heWJlU2tpcEF0dHJpYnV0ZXModG9rOjpvYmpjX3Byb3RvY29sKTsKIAogICBpZiAoVG9rLmlzTm90KHRvazo6aWRlbnRpZmllcikpIHsKLSAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KTsgLy8gbWlzc2luZyBwcm90b2NvbCBuYW1lLgorICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6aWRlbnRpZmllcjsgLy8gbWlzc2luZyBwcm90b2NvbCBuYW1lLgogICAgIHJldHVybiBEZWNsR3JvdXBQdHJUeSgpOwogICB9CiAgIC8vIFNhdmUgdGhlIHByb3RvY29sIG5hbWUsIHRoZW4gY29uc3VtZSBpdC4KICAgSWRlbnRpZmllckluZm8gKnByb3RvY29sTmFtZSA9IFRvay5nZXRJZGVudGlmaWVySW5mbygpOwogICBTb3VyY2VMb2NhdGlvbiBuYW1lTG9jID0gQ29uc3VtZVRva2VuKCk7CiAKLSAgaWYgKFRvay5pcyh0b2s6OnNlbWkpKSB7IC8vIGZvcndhcmQgZGVjbGFyYXRpb24gb2Ygb25lIHByb3RvY29sLgorICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6c2VtaSkpIHsgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBvbmUgcHJvdG9jb2wuCiAgICAgSWRlbnRpZmllckxvY1BhaXIgUHJvdG9JbmZvKHByb3RvY29sTmFtZSwgbmFtZUxvYyk7Ci0gICAgQ29uc3VtZVRva2VuKCk7CiAgICAgcmV0dXJuIEFjdGlvbnMuQWN0T25Gb3J3YXJkUHJvdG9jb2xEZWNsYXJhdGlvbihBdExvYywgJlByb3RvSW5mbywgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldExpc3QoKSk7CiAgIH0KQEAgLTE0MzYsNyArMTQzNCw3IEBACiAgICAgd2hpbGUgKDEpIHsKICAgICAgIENvbnN1bWVUb2tlbigpOyAvLyB0aGUgJywnCiAgICAgICBpZiAoVG9rLmlzTm90KHRvazo6aWRlbnRpZmllcikpIHsKLSAgICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCk7CisgICAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6aWRlbnRpZmllcjsKICAgICAgICAgU2tpcFVudGlsKHRvazo6c2VtaSk7CiAgICAgICAgIHJldHVybiBEZWNsR3JvdXBQdHJUeSgpOwogICAgICAgfQpAQCAtMTQ0OCw3ICsxNDQ2LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIC8vIENvbnN1bWUgdGhlICc7Jy4KLSAgICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2FmdGVyLCAiQHByb3RvY29sIikpCisgICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLCBkaWFnOjplcnJfZXhwZWN0ZWRfYWZ0ZXIsICJAcHJvdG9jb2wiKSkKICAgICAgIHJldHVybiBEZWNsR3JvdXBQdHJUeSgpOwogCiAgICAgcmV0dXJuIEFjdGlvbnMuQWN0T25Gb3J3YXJkUHJvdG9jb2xEZWNsYXJhdGlvbihBdExvYywKQEAgLTE1MDUsNyArMTUwMyw4IEBACiAgIE1heWJlU2tpcEF0dHJpYnV0ZXModG9rOjpvYmpjX2ltcGxlbWVudGF0aW9uKTsKIAogICBpZiAoVG9rLmlzTm90KHRvazo6aWRlbnRpZmllcikpIHsKLSAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KTsgLy8gbWlzc2luZyBjbGFzcyBvciBjYXRlZ29yeSBuYW1lLgorICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpCisgICAgICAgIDw8IHRvazo6aWRlbnRpZmllcjsgLy8gbWlzc2luZyBjbGFzcyBvciBjYXRlZ29yeSBuYW1lLgogICAgIHJldHVybiBEZWNsR3JvdXBQdHJUeSgpOwogICB9CiAgIC8vIFdlIGhhdmUgYSBjbGFzcyBvciBjYXRlZ29yeSBuYW1lIC0gY29uc3VtZSBpdC4KQEAgLTE1MjksMTEgKzE1MjgsMTIgQEAKICAgICAgIGNhdGVnb3J5SWQgPSBUb2suZ2V0SWRlbnRpZmllckluZm8oKTsKICAgICAgIGNhdGVnb3J5TG9jID0gQ29uc3VtZVRva2VuKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOyAvLyBtaXNzaW5nIGNhdGVnb3J5IG5hbWUuCisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKQorICAgICAgICAgIDw8IHRvazo6aWRlbnRpZmllcjsgLy8gbWlzc2luZyBjYXRlZ29yeSBuYW1lLgogICAgICAgcmV0dXJuIERlY2xHcm91cFB0clR5KCk7CiAgICAgfQogICAgIGlmIChUb2suaXNOb3QodG9rOjpyX3BhcmVuKSkgewotICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9ycGFyZW4pOworICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjpyX3BhcmVuOwogICAgICAgU2tpcFVudGlsKHRvazo6cl9wYXJlbik7IC8vIGRvbid0IHN0b3AgYXQgJzsnCiAgICAgICByZXR1cm4gRGVjbEdyb3VwUHRyVHkoKTsKICAgICB9CkBAIC0xNTUyLDExICsxNTUyLDExIEBACiAgICAgLy8gV2UgaGF2ZSBhIGNsYXNzIGltcGxlbWVudGF0aW9uCiAgICAgU291cmNlTG9jYXRpb24gc3VwZXJDbGFzc0xvYzsKICAgICBJZGVudGlmaWVySW5mbyAqc3VwZXJDbGFzc0lkID0gMDsKLSAgICBpZiAoVG9rLmlzKHRvazo6Y29sb24pKSB7CisgICAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OmNvbG9uKSkgewogICAgICAgLy8gV2UgaGF2ZSBhIHN1cGVyIGNsYXNzCi0gICAgICBDb25zdW1lVG9rZW4oKTsKICAgICAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkgewotICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KTsgLy8gbWlzc2luZyBzdXBlciBjbGFzcyBuYW1lLgorICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKQorICAgICAgICAgICAgPDwgdG9rOjppZGVudGlmaWVyOyAvLyBtaXNzaW5nIHN1cGVyIGNsYXNzIG5hbWUuCiAgICAgICAgIHJldHVybiBEZWNsR3JvdXBQdHJUeSgpOwogICAgICAgfQogICAgICAgc3VwZXJDbGFzc0lkID0gVG9rLmdldElkZW50aWZpZXJJbmZvKCk7CkBAIC0xNTgyLDcgKzE1ODIsNyBAQAogCiAgIHsKICAgICBPYmpDSW1wbFBhcnNpbmdEYXRhUkFJSSBPYmpDSW1wbFBhcnNpbmcoKnRoaXMsIE9iakNJbXBEZWNsKTsKLSAgICB3aGlsZSAoIU9iakNJbXBsUGFyc2luZy5pc0ZpbmlzaGVkKCkgJiYgVG9rLmlzTm90KHRvazo6ZW9mKSkgeworICAgIHdoaWxlICghT2JqQ0ltcGxQYXJzaW5nLmlzRmluaXNoZWQoKSAmJiAhaXNFb2ZPckVvbSgpKSB7CiAgICAgICBQYXJzZWRBdHRyaWJ1dGVzV2l0aFJhbmdlIGF0dHJzKEF0dHJGYWN0b3J5KTsKICAgICAgIE1heWJlUGFyc2VDWFgxMUF0dHJpYnV0ZXMoYXR0cnMpOwogICAgICAgTWF5YmVQYXJzZU1pY3Jvc29mdEF0dHJpYnV0ZXMoYXR0cnMpOwpAQCAtMTYxMiw3ICsxNjEyLDcgQEAKIFBhcnNlcjo6T2JqQ0ltcGxQYXJzaW5nRGF0YVJBSUk6On5PYmpDSW1wbFBhcnNpbmdEYXRhUkFJSSgpIHsKICAgaWYgKCFGaW5pc2hlZCkgewogICAgIGZpbmlzaChQLlRvay5nZXRMb2NhdGlvbigpKTsKLSAgICBpZiAoUC5Ub2suaXModG9rOjplb2YpKSB7CisgICAgaWYgKFAuaXNFb2ZPckVvbSgpKSB7CiAgICAgICBQLkRpYWcoUC5Ub2ssIGRpYWc6OmVycl9vYmpjX21pc3NpbmdfZW5kKQogICAgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKFAuVG9rLmdldExvY2F0aW9uKCksICJcbkBlbmRcbiIpOwogICAgICAgUC5EaWFnKERjbC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6bm90ZV9vYmpjX2NvbnRhaW5lcl9zdGFydCkKQEAgLTE2NTUsMTkgKzE2NTUsMTggQEAKICAgICAgICAgICJQYXJzZU9iakNBdEFsaWFzRGVjbGFyYXRpb24oKTogRXhwZWN0ZWQgQGNvbXBhdGliaWxpdHlfYWxpYXMiKTsKICAgQ29uc3VtZVRva2VuKCk7IC8vIGNvbnN1bWUgY29tcGF0aWJpbGl0eV9hbGlhcwogICBpZiAoVG9rLmlzTm90KHRvazo6aWRlbnRpZmllcikpIHsKLSAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KTsKKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmlkZW50aWZpZXI7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgSWRlbnRpZmllckluZm8gKmFsaWFzSWQgPSBUb2suZ2V0SWRlbnRpZmllckluZm8oKTsKICAgU291cmNlTG9jYXRpb24gYWxpYXNMb2MgPSBDb25zdW1lVG9rZW4oKTsgLy8gY29uc3VtZSBhbGlhcy1uYW1lCiAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkgewotICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOworICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6aWRlbnRpZmllcjsKICAgICByZXR1cm4gMDsKICAgfQogICBJZGVudGlmaWVySW5mbyAqY2xhc3NJZCA9IFRvay5nZXRJZGVudGlmaWVySW5mbygpOwogICBTb3VyY2VMb2NhdGlvbiBjbGFzc0xvYyA9IENvbnN1bWVUb2tlbigpOyAvLyBjb25zdW1lIGNsYXNzLW5hbWU7Ci0gIEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLCBkaWFnOjplcnJfZXhwZWN0ZWRfc2VtaV9hZnRlciwgCi0gICAgICAgICAgICAgICAgICAgIkBjb21wYXRpYmlsaXR5X2FsaWFzIik7CisgIEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLCBkaWFnOjplcnJfZXhwZWN0ZWRfYWZ0ZXIsICJAY29tcGF0aWJpbGl0eV9hbGlhcyIpOwogICByZXR1cm4gQWN0aW9ucy5BY3RPbkNvbXBhdGliaWxpdHlBbGlhcyhhdExvYywgYWxpYXNJZCwgYWxpYXNMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzSWQsIGNsYXNzTG9jKTsKIH0KQEAgLTE3MDUsMTAgKzE3MDQsOCBAQAogICAgIElkZW50aWZpZXJJbmZvICpwcm9wZXJ0eUlkID0gVG9rLmdldElkZW50aWZpZXJJbmZvKCk7CiAgICAgU291cmNlTG9jYXRpb24gcHJvcGVydHlMb2MgPSBDb25zdW1lVG9rZW4oKTsgLy8gY29uc3VtZSBwcm9wZXJ0eSBuYW1lCiAgICAgU291cmNlTG9jYXRpb24gcHJvcGVydHlJdmFyTG9jOwotICAgIGlmIChUb2suaXModG9rOjplcXVhbCkpIHsKKyAgICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6ZXF1YWwpKSB7CiAgICAgICAvLyBwcm9wZXJ0eSAnPScgaXZhci1uYW1lCi0gICAgICBDb25zdW1lVG9rZW4oKTsgLy8gY29uc3VtZSAnPScKLSAgICAgIAogICAgICAgaWYgKFRvay5pcyh0b2s6OmNvZGVfY29tcGxldGlvbikpIHsKICAgICAgICAgQWN0aW9ucy5Db2RlQ29tcGxldGVPYmpDUHJvcGVydHlTeW50aGVzaXplSXZhcihnZXRDdXJTY29wZSgpLCBwcm9wZXJ0eUlkKTsKICAgICAgICAgY3V0T2ZmUGFyc2luZygpOwpAQCAtMTcxNiw3ICsxNzEzLDcgQEAKICAgICAgIH0KICAgICAgIAogICAgICAgaWYgKFRvay5pc05vdCh0b2s6OmlkZW50aWZpZXIpKSB7Ci0gICAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOworICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmlkZW50aWZpZXI7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgcHJvcGVydHlJdmFyID0gVG9rLmdldElkZW50aWZpZXJJbmZvKCk7CkBAIC0xNzI4LDcgKzE3MjUsNyBAQAogICAgICAgYnJlYWs7CiAgICAgQ29uc3VtZVRva2VuKCk7IC8vIGNvbnN1bWUgJywnCiAgIH0KLSAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2FmdGVyLCAiQHN5bnRoZXNpemUiKTsKKyAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9hZnRlciwgIkBzeW50aGVzaXplIik7CiAgIHJldHVybiAwOwogfQogCkBAIC0xNzUxLDcgKzE3NDgsNyBAQAogICAgIH0KICAgICAKICAgICBpZiAoVG9rLmlzTm90KHRvazo6aWRlbnRpZmllcikpIHsKLSAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOworICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjppZGVudGlmaWVyOwogICAgICAgU2tpcFVudGlsKHRvazo6c2VtaSk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xNzY1LDcgKzE3NjIsNyBAQAogICAgICAgYnJlYWs7CiAgICAgQ29uc3VtZVRva2VuKCk7IC8vIGNvbnN1bWUgJywnCiAgIH0KLSAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2FmdGVyLCAiQGR5bmFtaWMiKTsKKyAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9hZnRlciwgIkBkeW5hbWljIik7CiAgIHJldHVybiAwOwogfQogCkBAIC0xNzgzLDcgKzE3ODAsNyBAQAogICAgIH0KICAgfQogICAvLyBjb25zdW1lICc7JwotICBFeHBlY3RBbmRDb25zdW1lKHRvazo6c2VtaSwgZGlhZzo6ZXJyX2V4cGVjdGVkX3NlbWlfYWZ0ZXIsICJAdGhyb3ciKTsKKyAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9hZnRlciwgIkB0aHJvdyIpOwogICByZXR1cm4gQWN0aW9ucy5BY3RPbk9iakNBdFRocm93U3RtdChhdExvYywgUmVzLnRha2UoKSwgZ2V0Q3VyU2NvcGUoKSk7CiB9CiAKQEAgLTE4MDYsNyArMTgwMyw3IEBACiAgICAgQ29uc3VtZVBhcmVuKCk7ICAvLyAnKScKICAgfSBlbHNlIHsKICAgICBpZiAoIW9wZXJhbmQuaXNJbnZhbGlkKCkpCi0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX3JwYXJlbik7CisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OnJfcGFyZW47CiAKICAgICAvLyBTa2lwIGZvcndhcmQgdW50aWwgd2Ugc2VlIGEgbGVmdCBicmFjZSwgYnV0IGRvbid0IGNvbnN1bWUgaXQuCiAgICAgU2tpcFVudGlsKHRvazo6bF9icmFjZSwgU3RvcEF0U2VtaSB8IFN0b3BCZWZvcmVNYXRjaCk7CkBAIC0xODE1LDcgKzE4MTIsNyBAQAogICAvLyBSZXF1aXJlIGEgY29tcG91bmQgc3RhdGVtZW50LgogICBpZiAoVG9rLmlzTm90KHRvazo6bF9icmFjZSkpIHsKICAgICBpZiAoIW9wZXJhbmQuaXNJbnZhbGlkKCkpCi0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2xicmFjZSk7CisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfYnJhY2U7CiAgICAgcmV0dXJuIFN0bXRFcnJvcigpOwogICB9CiAKQEAgLTE4NTUsNyArMTg1Miw3IEBACiAKICAgQ29uc3VtZVRva2VuKCk7IC8vIGNvbnN1bWUgdHJ5CiAgIGlmIChUb2suaXNOb3QodG9rOjpsX2JyYWNlKSkgewotICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfbGJyYWNlKTsKKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfYnJhY2U7CiAgICAgcmV0dXJuIFN0bXRFcnJvcigpOwogICB9CiAgIFN0bXRWZWN0b3IgQ2F0Y2hTdG10czsKQEAgLTE5MDUsNyArMTkwMiw3IEBACiAgICAgICAgIGlmIChUb2suaXModG9rOjpsX2JyYWNlKSkKICAgICAgICAgICBDYXRjaEJvZHkgPSBQYXJzZUNvbXBvdW5kU3RhdGVtZW50Qm9keSgpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9sYnJhY2UpOworICAgICAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6bF9icmFjZTsKICAgICAgICAgaWYgKENhdGNoQm9keS5pc0ludmFsaWQoKSkKICAgICAgICAgICBDYXRjaEJvZHkgPSBBY3Rpb25zLkFjdE9uTnVsbFN0bXQoVG9rLmdldExvY2F0aW9uKCkpOwogICAgICAgICAKQEAgLTE5MzEsNyArMTkyOCw3IEBACiAgICAgICBpZiAoVG9rLmlzKHRvazo6bF9icmFjZSkpCiAgICAgICAgIEZpbmFsbHlCb2R5ID0gUGFyc2VDb21wb3VuZFN0YXRlbWVudEJvZHkoKTsKICAgICAgIGVsc2UKLSAgICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9sYnJhY2UpOworICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfYnJhY2U7CiAgICAgICBpZiAoRmluYWxseUJvZHkuaXNJbnZhbGlkKCkpCiAgICAgICAgIEZpbmFsbHlCb2R5ID0gQWN0aW9ucy5BY3RPbk51bGxTdG10KFRvay5nZXRMb2NhdGlvbigpKTsKICAgICAgIEZpbmFsbHlTdG10ID0gQWN0aW9ucy5BY3RPbk9iakNBdEZpbmFsbHlTdG10KEF0Q2F0Y2hGaW5hbGx5TG9jLApAQCAtMTk1Nyw3ICsxOTU0LDcgQEAKIFBhcnNlcjo6UGFyc2VPYmpDQXV0b3JlbGVhc2VQb29sU3RtdChTb3VyY2VMb2NhdGlvbiBhdExvYykgewogICBDb25zdW1lVG9rZW4oKTsgLy8gY29uc3VtZSBhdXRvcmVsZWFzZXBvb2wKICAgaWYgKFRvay5pc05vdCh0b2s6OmxfYnJhY2UpKSB7Ci0gICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9sYnJhY2UpOworICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6bF9icmFjZTsKICAgICByZXR1cm4gU3RtdEVycm9yKCk7CiAgIH0KICAgLy8gRW50ZXIgYSBzY29wZSB0byBob2xkIGV2ZXJ5dGhpbmcgd2l0aGluIHRoZSBjb21wb3VuZCBzdG10LiAgQ29tcG91bmQKQEAgLTI0NzgsOCArMjQ3NSw3IEBACiAgICAgICBLZXlJZGVudHMucHVzaF9iYWNrKHNlbElkZW50KTsKICAgICAgIEtleUxvY3MucHVzaF9iYWNrKExvYyk7CiAKLSAgICAgIGlmIChUb2suaXNOb3QodG9rOjpjb2xvbikpIHsKLSAgICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9jb2xvbik7CisgICAgICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OmNvbG9uKSkgewogICAgICAgICAvLyBXZSBtdXN0IG1hbnVhbGx5IHNraXAgdG8gYSAnXScsIG90aGVyd2lzZSB0aGUgZXhwcmVzc2lvbiBza2lwcGVyIHdpbGwKICAgICAgICAgLy8gc3RvcCBhdCB0aGUgJ10nIHdoZW4gaXQgc2tpcHMgdG8gdGhlICc7Jy4gIFdlIHdhbnQgaXQgdG8gc2tpcCBiZXlvbmQKICAgICAgICAgLy8gdGhlIGVuY2xvc2luZyBleHByZXNzaW9uLgpAQCAtMjQ4Nyw3ICsyNDgzLDYgQEAKICAgICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogICAgICAgfQogCi0gICAgICBDb25zdW1lVG9rZW4oKTsgLy8gRWF0IHRoZSAnOicuCiAgICAgICAvLy8gIFBhcnNlIHRoZSBleHByZXNzaW9uIGFmdGVyICc6JwogICAgICAgCiAgICAgICBpZiAoVG9rLmlzKHRvazo6Y29kZV9jb21wbGV0aW9uKSkgewpAQCAtMjU3Miw3ICsyNTY3LDcgQEAKICAgICAgIEtleUV4cHJzLnB1c2hfYmFjayhSZXMucmVsZWFzZSgpKTsKICAgICB9CiAgIH0gZWxzZSBpZiAoIXNlbElkZW50KSB7Ci0gICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCk7IC8vIG1pc3Npbmcgc2VsZWN0b3IgbmFtZS4KKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmlkZW50aWZpZXI7IC8vIG1pc3Npbmcgc2VsZWN0b3IgbmFtZS4KIAogICAgIC8vIFdlIG11c3QgbWFudWFsbHkgc2tpcCB0byBhICddJywgb3RoZXJ3aXNlIHRoZSBleHByZXNzaW9uIHNraXBwZXIgd2lsbAogICAgIC8vIHN0b3AgYXQgdGhlICddJyB3aGVuIGl0IHNraXBzIHRvIHRoZSAnOycuICBXZSB3YW50IGl0IHRvIHNraXAgYmV5b25kCkBAIC0yNTgyLDEwICsyNTc3LDggQEAKICAgfQogICAgIAogICBpZiAoVG9rLmlzTm90KHRvazo6cl9zcXVhcmUpKSB7Ci0gICAgaWYgKFRvay5pcyh0b2s6OmlkZW50aWZpZXIpKQotICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9jb2xvbik7Ci0gICAgZWxzZQotICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9yc3F1YXJlKTsKKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKQorICAgICAgICA8PCAoVG9rLmlzKHRvazo6aWRlbnRpZmllcikgPyB0b2s6OmNvbG9uIDogdG9rOjpyX3NxdWFyZSk7CiAgICAgLy8gV2UgbXVzdCBtYW51YWxseSBza2lwIHRvIGEgJ10nLCBvdGhlcndpc2UgdGhlIGV4cHJlc3Npb24gc2tpcHBlciB3aWxsCiAgICAgLy8gc3RvcCBhdCB0aGUgJ10nIHdoZW4gaXQgc2tpcHMgdG8gdGhlICc7Jy4gIFdlIHdhbnQgaXQgdG8gc2tpcCBiZXlvbmQKICAgICAvLyB0aGUgZW5jbG9zaW5nIGV4cHJlc3Npb24uCkBAIC0yNzMwLDcgKzI3MjMsOCBAQAogICAgIGlmIChUb2suaXModG9rOjpjb21tYSkpCiAgICAgICBDb25zdW1lVG9rZW4oKTsgLy8gRWF0IHRoZSAnLCcuCiAgICAgZWxzZSBpZiAoVG9rLmlzTm90KHRvazo6cl9zcXVhcmUpKQotICAgICByZXR1cm4gRXhwckVycm9yKERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfcnNxdWFyZV9vcl9jb21tYSkpOworICAgICAgcmV0dXJuIEV4cHJFcnJvcihEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2VpdGhlcikgPDwgdG9rOjpyX3NxdWFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdG9rOjpjb21tYSk7CiAgIH0KICAgU291cmNlTG9jYXRpb24gRW5kTG9jID0gQ29uc3VtZUJyYWNrZXQoKTsgLy8gbG9jYXRpb24gb2YgJ10nCiAgIE11bHRpRXhwckFyZyBBcmdzKEVsZW1lbnRFeHBycyk7CkBAIC0yNzU1LDEwICsyNzQ5LDcgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoVG9rLmlzKHRvazo6Y29sb24pKSB7Ci0gICAgICBDb25zdW1lVG9rZW4oKTsKLSAgICB9IGVsc2UgewotICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9jb2xvbik7CisgICAgaWYgKEV4cGVjdEFuZENvbnN1bWUodG9rOjpjb2xvbikpIHsKICAgICAgIFNraXBVbnRpbCh0b2s6OnJfYnJhY2UsIFN0b3BBdFNlbWkpOwogICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogICAgIH0KQEAgLTI3NzQsMjAgKzI3NjUsMTkgQEAKICAgICAKICAgICAvLyBQYXJzZSB0aGUgZWxsaXBzaXMgdGhhdCBkZXNpZ25hdGVzIHRoaXMgYXMgYSBwYWNrIGV4cGFuc2lvbi4KICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYzsKLSAgICBpZiAoVG9rLmlzKHRvazo6ZWxsaXBzaXMpICYmIGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKQotICAgICAgRWxsaXBzaXNMb2MgPSBDb25zdW1lVG9rZW4oKTsKLSAgICAKKyAgICBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMpCisgICAgICBUcnlDb25zdW1lVG9rZW4odG9rOjplbGxpcHNpcywgRWxsaXBzaXNMb2MpOworCiAgICAgLy8gV2UgaGF2ZSBhIHZhbGlkIGV4cHJlc3Npb24uIENvbGxlY3QgaXQgaW4gYSB2ZWN0b3Igc28gd2UgY2FuCiAgICAgLy8gYnVpbGQgdGhlIGFyZ3VtZW50IGxpc3QuCiAgICAgT2JqQ0RpY3Rpb25hcnlFbGVtZW50IEVsZW1lbnQgPSB7IAogICAgICAgS2V5RXhwci5nZXQoKSwgVmFsdWVFeHByLmdldCgpLCBFbGxpcHNpc0xvYywgTm9uZSAKICAgICB9OwogICAgIEVsZW1lbnRzLnB1c2hfYmFjayhFbGVtZW50KTsKLSAgICAKLSAgICBpZiAoVG9rLmlzKHRvazo6Y29tbWEpKQotICAgICAgQ29uc3VtZVRva2VuKCk7IC8vIEVhdCB0aGUgJywnLgotICAgIGVsc2UgaWYgKFRvay5pc05vdCh0b2s6OnJfYnJhY2UpKQotICAgICAgcmV0dXJuIEV4cHJFcnJvcihEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX3JicmFjZV9vcl9jb21tYSkpOworCisgICAgaWYgKCFUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkgJiYgVG9rLmlzTm90KHRvazo6cl9icmFjZSkpCisgICAgICByZXR1cm4gRXhwckVycm9yKERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfZWl0aGVyKSA8PCB0b2s6OnJfYnJhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRvazo6Y29tbWEpOwogICB9CiAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyA9IENvbnN1bWVCcmFjZSgpOwogICAKQEAgLTI4MzQsNyArMjgyNCw3IEBACiAgIFQuY29uc3VtZU9wZW4oKTsKIAogICBpZiAoVG9rLmlzTm90KHRvazo6aWRlbnRpZmllcikpCi0gICAgcmV0dXJuIEV4cHJFcnJvcihEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KSk7CisgICAgcmV0dXJuIEV4cHJFcnJvcihEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmlkZW50aWZpZXIpOwogCiAgIElkZW50aWZpZXJJbmZvICpwcm90b2NvbElkID0gVG9rLmdldElkZW50aWZpZXJJbmZvKCk7CiAgIFNvdXJjZUxvY2F0aW9uIFByb3RvSWRMb2MgPSBDb25zdW1lVG9rZW4oKTsKQEAgLTI4NjksMjAgKzI4NTksMTkgQEAKICAgSWRlbnRpZmllckluZm8gKlNlbElkZW50ID0gUGFyc2VPYmpDU2VsZWN0b3JQaWVjZShzTG9jKTsKICAgaWYgKCFTZWxJZGVudCAmJiAgLy8gbWlzc2luZyBzZWxlY3RvciBuYW1lLgogICAgICAgVG9rLmlzTm90KHRvazo6Y29sb24pICYmIFRvay5pc05vdCh0b2s6OmNvbG9uY29sb24pKQotICAgIHJldHVybiBFeHByRXJyb3IoRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCkpOworICAgIHJldHVybiBFeHByRXJyb3IoRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjppZGVudGlmaWVyKTsKIAogICBLZXlJZGVudHMucHVzaF9iYWNrKFNlbElkZW50KTsKICAgdW5zaWduZWQgbkNvbG9ucyA9IDA7CiAgIGlmIChUb2suaXNOb3QodG9rOjpyX3BhcmVuKSkgewogICAgIHdoaWxlICgxKSB7Ci0gICAgICBpZiAoVG9rLmlzKHRvazo6Y29sb25jb2xvbikpIHsgLy8gSGFuZGxlIDo6IGluIEMrKy4KKyAgICAgIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb2xvbmNvbG9uKSkgeyAvLyBIYW5kbGUgOjogaW4gQysrLgogICAgICAgICArK25Db2xvbnM7CiAgICAgICAgIEtleUlkZW50cy5wdXNoX2JhY2soMCk7Ci0gICAgICB9IGVsc2UgaWYgKFRvay5pc05vdCh0b2s6OmNvbG9uKSkKLSAgICAgICAgcmV0dXJuIEV4cHJFcnJvcihEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbG9uKSk7Ci0KKyAgICAgIH0gZWxzZSBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OmNvbG9uKSkgLy8gT3RoZXJ3aXNlIGV4cGVjdCAnOicuCisgICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICAgICsrbkNvbG9uczsKLSAgICAgIENvbnN1bWVUb2tlbigpOyAvLyBFYXQgdGhlICc6JyBvciAnOjonLgorCiAgICAgICBpZiAoVG9rLmlzKHRvazo6cl9wYXJlbikpCiAgICAgICAgIGJyZWFrOwogICAgICAgCkBAIC0yOTMxLDcgKzI5MjAsNyBAQAogICBhc3NlcnQoKFRvay5pcyh0b2s6OmxfYnJhY2UpIHx8IFRvay5pcyh0b2s6Omt3X3RyeSkgfHwKICAgICAgICAgICBUb2suaXModG9rOjpjb2xvbikpICYmIAogICAgICAgICAgICJJbmxpbmUgb2JqZWN0aXZlLWMgbWV0aG9kIG5vdCBzdGFydGluZyB3aXRoICd7JyBvciAndHJ5JyBvciAnOiciKTsKLSAgLy8gRW50ZXIgYSBzY29wZSBmb3IgdGhlIG1ldGhvZCBvciBjLWZ1Y250aW9uIGJvZHkuCisgIC8vIEVudGVyIGEgc2NvcGUgZm9yIHRoZSBtZXRob2Qgb3IgYy1mdW5jdGlvbiBib2R5LgogICBQYXJzZVNjb3BlIEJvZHlTY29wZSh0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZU1ldGhvZAogICAgICAgICAgICAgICAgICAgICAgICA/IFNjb3BlOjpPYmpDTWV0aG9kU2NvcGV8U2NvcGU6OkZuU2NvcGV8U2NvcGU6OkRlY2xTY29wZQpAQCAtMjk0NCwxMSArMjkzMywxMSBAQAogICBlbHNlCiAgICAgQWN0aW9ucy5BY3RPblN0YXJ0T2ZGdW5jdGlvbkRlZihnZXRDdXJTY29wZSgpLCBNQ0RlY2wpOwogICBpZiAoVG9rLmlzKHRvazo6a3dfdHJ5KSkKLSAgICBNQ0RlY2wgPSBQYXJzZUZ1bmN0aW9uVHJ5QmxvY2soTUNEZWNsLCBCb2R5U2NvcGUpOworICAgIFBhcnNlRnVuY3Rpb25UcnlCbG9jayhNQ0RlY2wsIEJvZHlTY29wZSk7CiAgIGVsc2UgewogICAgIGlmIChUb2suaXModG9rOjpjb2xvbikpCiAgICAgICBQYXJzZUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXIoTUNEZWNsKTsKLSAgICBNQ0RlY2wgPSBQYXJzZUZ1bmN0aW9uU3RhdGVtZW50Qm9keShNQ0RlY2wsIEJvZHlTY29wZSk7CisgICAgUGFyc2VGdW5jdGlvblN0YXRlbWVudEJvZHkoTUNEZWNsLCBCb2R5U2NvcGUpOwogICB9CiAgIAogICBpZiAoVG9rLmdldExvY2F0aW9uKCkgIT0gT3JpZ0xvYykgewpkaWZmIC0tZ2l0IGEvbGliL1BhcnNlL1BhcnNlT3Blbk1QLmNwcCBiL2xpYi9QYXJzZS9QYXJzZU9wZW5NUC5jcHAKaW5kZXggODllNDE0Ny4uZjFiNjEwNyAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL1BhcnNlT3Blbk1QLmNwcAorKysgYi9saWIvUGFyc2UvUGFyc2VPcGVuTVAuY3BwCkBAIC0xMiwxMiArMTIsMTIgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29uc3VtZXIuaCIKKyNpbmNsdWRlICJSQUlJT2JqZWN0c0ZvclBhcnNlci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10T3Blbk1QLmgiCiAjaW5jbHVkZSAiY2xhbmcvUGFyc2UvUGFyc2VEaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvUGFyc2UvUGFyc2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9TY29wZS5oIgogI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCi0jaW5jbHVkZSAiUkFJSU9iamVjdHNGb3JQYXJzZXIuaCIKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTYwLDYgKzYwLDcgQEAKICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX29tcF91bmtub3duX2RpcmVjdGl2ZSk7CiAgICAgYnJlYWs7CiAgIGNhc2UgT01QRF9wYXJhbGxlbDoKKyAgY2FzZSBPTVBEX3NpbWQ6CiAgIGNhc2UgT01QRF90YXNrOgogICBjYXNlIE5VTV9PUEVOTVBfRElSRUNUSVZFUzoKICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX29tcF91bmV4cGVjdGVkX2RpcmVjdGl2ZSkKQEAgLTExNCw3ICsxMTUsOCBAQAogICAgIH0KICAgICBTa2lwVW50aWwodG9rOjphbm5vdF9wcmFnbWFfb3Blbm1wX2VuZCk7CiAgICAgYnJlYWs7Ci0gIGNhc2UgT01QRF9wYXJhbGxlbDogeworICBjYXNlIE9NUERfcGFyYWxsZWw6CisgIGNhc2UgT01QRF9zaW1kOiB7CiAgICAgQ29uc3VtZVRva2VuKCk7CiAKICAgICBBY3Rpb25zLlN0YXJ0T3Blbk1QRFNBQmxvY2soREtpbmQsIERpck5hbWUsIEFjdGlvbnMuZ2V0Q3VyU2NvcGUoKSk7CkBAIC0yMjUsOCArMjI3LDkgQEAKICAgICAgIElzQ29ycmVjdCA9IGZhbHNlOwogICAgICAgU2tpcFVudGlsKHRvazo6Y29tbWEsIHRvazo6cl9wYXJlbiwgdG9rOjphbm5vdF9wcmFnbWFfb3Blbm1wX2VuZCwKICAgICAgICAgICAgICAgICBTdG9wQmVmb3JlTWF0Y2gpOwotICAgICAgRGlhZyhQcmV2VG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCkKLSAgICAgICAgPDwgU291cmNlUmFuZ2UoUHJldlRvay5nZXRMb2NhdGlvbigpLCBQcmV2VG9rTG9jYXRpb24pOworICAgICAgRGlhZyhQcmV2VG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZCkKKyAgICAgICAgICA8PCB0b2s6OmlkZW50aWZpZXIKKyAgICAgICAgICA8PCBTb3VyY2VSYW5nZShQcmV2VG9rLmdldExvY2F0aW9uKCksIFByZXZUb2tMb2NhdGlvbik7CiAgICAgfSBlbHNlIHsKICAgICAgIERlY2xhcmF0aW9uTmFtZUluZm8gTmFtZUluZm8gPSBBY3Rpb25zLkdldE5hbWVGcm9tVW5xdWFsaWZpZWRJZChOYW1lKTsKICAgICAgIEV4cHJSZXN1bHQgUmVzID0gQWN0aW9ucy5BY3RPbk9wZW5NUElkRXhwcmVzc2lvbihnZXRDdXJTY29wZSgpLCBTUywKQEAgLTI0MSw3ICsyNDQsNyBAQAogICB9CiAKICAgaWYgKE5vSWRlbnRJc0ZvdW5kKSB7Ci0gICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCk7CisgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjppZGVudGlmaWVyOwogICAgIElzQ29ycmVjdCA9IGZhbHNlOwogICB9CiAKQEAgLTI1NCw3ICsyNTcsOCBAQAogLy8vIFxicmllZiBQYXJzaW5nIG9mIE9wZW5NUCBjbGF1c2VzLgogLy8vCiAvLy8gICAgY2xhdXNlOgotLy8vICAgICAgIGRlZmF1bHQtY2xhdXNlfHByaXZhdGUtY2xhdXNlfGZpcnN0cHJpdmF0ZS1jbGF1c2V8c2hhcmVkLWNsYXVzZQorLy8vICAgICAgIGlmLWNsYXVzZSB8IG51bV90aHJlYWRzLWNsYXVzZSB8IHNhZmVsZW4tY2xhdXNlIHwgZGVmYXVsdC1jbGF1c2UgfAorLy8vICAgICAgIHByaXZhdGUtY2xhdXNlIHwgZmlyc3Rwcml2YXRlLWNsYXVzZSB8IHNoYXJlZC1jbGF1c2UKIC8vLwogT01QQ2xhdXNlICpQYXJzZXI6OlBhcnNlT3Blbk1QQ2xhdXNlKE9wZW5NUERpcmVjdGl2ZUtpbmQgREtpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3Blbk1QQ2xhdXNlS2luZCBDS2luZCwgYm9vbCBGaXJzdENsYXVzZSkgewpAQCAtMjY4LDEwICsyNzIsMjUgQEAKICAgfQogCiAgIHN3aXRjaCAoQ0tpbmQpIHsKKyAgY2FzZSBPTVBDX2lmOgorICBjYXNlIE9NUENfbnVtX3RocmVhZHM6CisgIGNhc2UgT01QQ19zYWZlbGVuOgorICAgIC8vIE9wZW5NUCBbMi41LCBSZXN0cmljdGlvbnNdCisgICAgLy8gIEF0IG1vc3Qgb25lIGlmIGNsYXVzZSBjYW4gYXBwZWFyIG9uIHRoZSBkaXJlY3RpdmUuCisgICAgLy8gIEF0IG1vc3Qgb25lIG51bV90aHJlYWRzIGNsYXVzZSBjYW4gYXBwZWFyIG9uIHRoZSBkaXJlY3RpdmUuCisgICAgLy8gT3Blbk1QIFsyLjguMSwgc2ltZCBjb25zdHJ1Y3QsIFJlc3RyaWN0aW9uc10KKyAgICAvLyAgT25seSBvbmUgc2FmZWxlbiBjbGF1c2UgY2FuIGFwcGVhciBvbiBhIHNpbWQgZGlyZWN0aXZlLgorICAgIGlmICghRmlyc3RDbGF1c2UpIHsKKyAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfb21wX21vcmVfb25lX2NsYXVzZSkKKyAgICAgICAgICAgPDwgZ2V0T3Blbk1QRGlyZWN0aXZlTmFtZShES2luZCkgPDwgZ2V0T3Blbk1QQ2xhdXNlTmFtZShDS2luZCk7CisgICAgfQorCisgICAgQ2xhdXNlID0gUGFyc2VPcGVuTVBTaW5nbGVFeHByQ2xhdXNlKENLaW5kKTsKKyAgICBicmVhazsKICAgY2FzZSBPTVBDX2RlZmF1bHQ6Ci0gICAgLy8gT3Blbk1QIFsyLjkuMy4xLCBSZXN0cmljdGlvbnNdCi0gICAgLy8gIE9ubHkgYSBzaW5nbGUgZGVmYXVsdCBjbGF1c2UgbWF5IGJlIHNwZWNpZmllZCBvbiBhIHBhcmFsbGVsIG9yIHRhc2sKLSAgICAvLyAgZGlyZWN0aXZlLgorICAgIC8vIE9wZW5NUCBbMi4xNC4zLjEsIFJlc3RyaWN0aW9uc10KKyAgICAvLyAgT25seSBhIHNpbmdsZSBkZWZhdWx0IGNsYXVzZSBtYXkgYmUgc3BlY2lmaWVkIG9uIGEgcGFyYWxsZWwsIHRhc2sgb3IKKyAgICAvLyAgdGVhbXMgZGlyZWN0aXZlLgogICAgIGlmICghRmlyc3RDbGF1c2UpIHsKICAgICAgIERpYWcoVG9rLCBkaWFnOjplcnJfb21wX21vcmVfb25lX2NsYXVzZSkKICAgICAgICAgICAgPDwgZ2V0T3Blbk1QRGlyZWN0aXZlTmFtZShES2luZCkgPDwgZ2V0T3Blbk1QQ2xhdXNlTmFtZShDS2luZCk7CkBAIC0yODIsNiArMzAxLDcgQEAKICAgY2FzZSBPTVBDX3ByaXZhdGU6CiAgIGNhc2UgT01QQ19maXJzdHByaXZhdGU6CiAgIGNhc2UgT01QQ19zaGFyZWQ6CisgIGNhc2UgT01QQ19jb3B5aW46CiAgICAgQ2xhdXNlID0gUGFyc2VPcGVuTVBWYXJMaXN0Q2xhdXNlKENLaW5kKTsKICAgICBicmVhazsKICAgY2FzZSBPTVBDX3Vua25vd246CkBAIC0yOTksNiArMzE5LDQxIEBACiAgIHJldHVybiBFcnJvckZvdW5kID8gMCA6IENsYXVzZTsKIH0KIAorLy8vIFxicmllZiBQYXJzaW5nIG9mIE9wZW5NUCBjbGF1c2VzIHdpdGggc2luZ2xlIGV4cHJlc3Npb25zIGxpa2UgJ2lmJywKKy8vLyAnY29sbGFwc2UnLCAnc2FmZWxlbicsICdudW1fdGhyZWFkcycsICdzaW1kbGVuJywgJ251bV90ZWFtcycgb3IKKy8vLyAndGhyZWFkX2xpbWl0Jy4KKy8vLworLy8vICAgIGlmLWNsYXVzZToKKy8vLyAgICAgICdpZicgJygnIGV4cHJlc3Npb24gJyknCisvLy8KKy8vLyAgICBudW1fdGhyZWFkcy1jbGF1c2U6CisvLy8gICAgICAnbnVtX3RocmVhZHMnICcoJyBleHByZXNzaW9uICcpJworLy8vCisvLy8gICAgc2FmZWxlbi1jbGF1c2U6CisvLy8gICAgICAnc2FmZWxlbicgJygnIGV4cHJlc3Npb24gJyknCisvLy8KK09NUENsYXVzZSAqUGFyc2VyOjpQYXJzZU9wZW5NUFNpbmdsZUV4cHJDbGF1c2UoT3Blbk1QQ2xhdXNlS2luZCBLaW5kKSB7CisgIFNvdXJjZUxvY2F0aW9uIExvYyA9IENvbnN1bWVUb2tlbigpOworCisgIEJhbGFuY2VkRGVsaW1pdGVyVHJhY2tlciBUKCp0aGlzLCB0b2s6OmxfcGFyZW4sIHRvazo6YW5ub3RfcHJhZ21hX29wZW5tcF9lbmQpOworICBpZiAoVC5leHBlY3RBbmRDb25zdW1lKGRpYWc6OmVycl9leHBlY3RlZF9scGFyZW5fYWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3Blbk1QQ2xhdXNlTmFtZShLaW5kKSkpCisgICAgcmV0dXJuIDA7CisKKyAgRXhwclJlc3VsdCBMSFMoUGFyc2VDYXN0RXhwcmVzc2lvbihmYWxzZSwgZmFsc2UsIE5vdFR5cGVDYXN0KSk7CisgIEV4cHJSZXN1bHQgVmFsKFBhcnNlUkhTT2ZCaW5hcnlFeHByZXNzaW9uKExIUywgcHJlYzo6Q29uZGl0aW9uYWwpKTsKKworICAvLyBQYXJzZSAnKScuCisgIFQuY29uc3VtZUNsb3NlKCk7CisKKyAgaWYgKFZhbC5pc0ludmFsaWQoKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gQWN0aW9ucy5BY3RPbk9wZW5NUFNpbmdsZUV4cHJDbGF1c2UoS2luZCwgVmFsLnRha2UoKSwgTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5nZXRPcGVuTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQuZ2V0Q2xvc2VMb2NhdGlvbigpKTsKK30KKwogLy8vIFxicmllZiBQYXJzaW5nIG9mIHNpbXBsZSBPcGVuTVAgY2xhdXNlcyBsaWtlICdkZWZhdWx0Jy4KIC8vLwogLy8vICAgIGRlZmF1bHQtY2xhdXNlOgpAQCAtMzY2LDcgKzQyMSw3IEBACiAgICAgfSBlbHNlIGlmIChUb2suaXNOb3QodG9rOjpyX3BhcmVuKSAmJgogICAgICAgICAgICAgICAgVG9rLmlzTm90KHRvazo6YW5ub3RfcHJhZ21hX29wZW5tcF9lbmQpKSB7CiAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX29tcF9leHBlY3RlZF9wdW5jKQotICAgICAgICA8PCAxIDw8IGdldE9wZW5NUENsYXVzZU5hbWUoS2luZCk7CisgICAgICAgIDw8IGdldE9wZW5NUENsYXVzZU5hbWUoS2luZCk7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZVByYWdtYS5jcHAgYi9saWIvUGFyc2UvUGFyc2VQcmFnbWEuY3BwCmluZGV4IDhhMzc0ZTAuLjI5ZTE3NzEgMTAwNjQ0Ci0tLSBhL2xpYi9QYXJzZS9QYXJzZVByYWdtYS5jcHAKKysrIGIvbGliL1BhcnNlL1BhcnNlUHJhZ21hLmNwcApAQCAtMTEsNyArMTEsNiBAQAogLy8KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKLSNpbmNsdWRlICJQYXJzZVByYWdtYS5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKICNpbmNsdWRlICJjbGFuZy9QYXJzZS9QYXJzZURpYWdub3N0aWMuaCIKICNpbmNsdWRlICJjbGFuZy9QYXJzZS9QYXJzZXIuaCIKQEAgLTE5LDYgKzE4LDIwOCBAQAogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1N3aXRjaC5oIgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogCituYW1lc3BhY2UgeworCitzdHJ1Y3QgUHJhZ21hQWxpZ25IYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgeworICBleHBsaWNpdCBQcmFnbWFBbGlnbkhhbmRsZXIoKSA6IFByYWdtYUhhbmRsZXIoImFsaWduIikge30KKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pIG92ZXJyaWRlOworfTsKKworc3RydWN0IFByYWdtYUdDQ1Zpc2liaWxpdHlIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgeworICBleHBsaWNpdCBQcmFnbWFHQ0NWaXNpYmlsaXR5SGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigidmlzaWJpbGl0eSIpIHt9CisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKSBvdmVycmlkZTsKK307CisKK3N0cnVjdCBQcmFnbWFPcHRpb25zSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKKyAgZXhwbGljaXQgUHJhZ21hT3B0aW9uc0hhbmRsZXIoKSA6IFByYWdtYUhhbmRsZXIoIm9wdGlvbnMiKSB7fQorICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRmlyc3RUb2tlbikgb3ZlcnJpZGU7Cit9OworCitzdHJ1Y3QgUHJhZ21hUGFja0hhbmRsZXIgOiBwdWJsaWMgUHJhZ21hSGFuZGxlciB7CisgIGV4cGxpY2l0IFByYWdtYVBhY2tIYW5kbGVyKCkgOiBQcmFnbWFIYW5kbGVyKCJwYWNrIikge30KKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pIG92ZXJyaWRlOworfTsKKworc3RydWN0IFByYWdtYU1TU3RydWN0SGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKKyAgZXhwbGljaXQgUHJhZ21hTVNTdHJ1Y3RIYW5kbGVyKCkgOiBQcmFnbWFIYW5kbGVyKCJtc19zdHJ1Y3QiKSB7fQorICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRmlyc3RUb2tlbikgb3ZlcnJpZGU7Cit9OworCitzdHJ1Y3QgUHJhZ21hVW51c2VkSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKKyAgUHJhZ21hVW51c2VkSGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigidW51c2VkIikge30KKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pIG92ZXJyaWRlOworfTsKKworc3RydWN0IFByYWdtYVdlYWtIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgeworICBleHBsaWNpdCBQcmFnbWFXZWFrSGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigid2VhayIpIHt9CisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKSBvdmVycmlkZTsKK307CisKK3N0cnVjdCBQcmFnbWFSZWRlZmluZUV4dG5hbWVIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgeworICBleHBsaWNpdCBQcmFnbWFSZWRlZmluZUV4dG5hbWVIYW5kbGVyKCkgOiBQcmFnbWFIYW5kbGVyKCJyZWRlZmluZV9leHRuYW1lIikge30KKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pIG92ZXJyaWRlOworfTsKKworc3RydWN0IFByYWdtYU9wZW5DTEV4dGVuc2lvbkhhbmRsZXIgOiBwdWJsaWMgUHJhZ21hSGFuZGxlciB7CisgIFByYWdtYU9wZW5DTEV4dGVuc2lvbkhhbmRsZXIoKSA6IFByYWdtYUhhbmRsZXIoIkVYVEVOU0lPTiIpIHt9CisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKSBvdmVycmlkZTsKK307CisKKworc3RydWN0IFByYWdtYUZQQ29udHJhY3RIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgeworICBQcmFnbWFGUENvbnRyYWN0SGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigiRlBfQ09OVFJBQ1QiKSB7fQorICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRmlyc3RUb2tlbikgb3ZlcnJpZGU7Cit9OworCitzdHJ1Y3QgUHJhZ21hTm9PcGVuTVBIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgeworICBQcmFnbWFOb09wZW5NUEhhbmRsZXIoKSA6IFByYWdtYUhhbmRsZXIoIm9tcCIpIHsgfQorICB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRmlyc3RUb2tlbikgb3ZlcnJpZGU7Cit9OworCitzdHJ1Y3QgUHJhZ21hT3Blbk1QSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKKyAgUHJhZ21hT3Blbk1QSGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigib21wIikgeyB9CisgIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKSBvdmVycmlkZTsKK307CisKKy8vLyBQcmFnbWFDb21tZW50SGFuZGxlciAtICJcI3ByYWdtYSBjb21tZW50IC4uLiIuCitzdHJ1Y3QgUHJhZ21hQ29tbWVudEhhbmRsZXIgOiBwdWJsaWMgUHJhZ21hSGFuZGxlciB7CisgIFByYWdtYUNvbW1lbnRIYW5kbGVyKFNlbWEgJkFjdGlvbnMpCisgICAgOiBQcmFnbWFIYW5kbGVyKCJjb21tZW50IiksIEFjdGlvbnMoQWN0aW9ucykge30KKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgU2VtYSAmQWN0aW9uczsKK307CisKK3N0cnVjdCBQcmFnbWFEZXRlY3RNaXNtYXRjaEhhbmRsZXIgOiBwdWJsaWMgUHJhZ21hSGFuZGxlciB7CisgIFByYWdtYURldGVjdE1pc21hdGNoSGFuZGxlcihTZW1hICZBY3Rpb25zKQorICAgIDogUHJhZ21hSGFuZGxlcigiZGV0ZWN0X21pc21hdGNoIiksIEFjdGlvbnMoQWN0aW9ucykge30KKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgU2VtYSAmQWN0aW9uczsKK307CisKK3N0cnVjdCBQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzIDogcHVibGljIFByYWdtYUhhbmRsZXIgeworICBleHBsaWNpdCBQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzKCkgOiBQcmFnbWFIYW5kbGVyKCJwb2ludGVyc190b19tZW1iZXJzIikge30KKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pIG92ZXJyaWRlOworfTsKKworc3RydWN0IFByYWdtYU1TVnRvckRpc3AgOiBwdWJsaWMgUHJhZ21hSGFuZGxlciB7CisgIGV4cGxpY2l0IFByYWdtYU1TVnRvckRpc3AoKSA6IFByYWdtYUhhbmRsZXIoInZ0b3JkaXNwIikge30KKyAgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pIG92ZXJyaWRlOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZQorCit2b2lkIFBhcnNlcjo6aW5pdGlhbGl6ZVByYWdtYUhhbmRsZXJzKCkgeworICBBbGlnbkhhbmRsZXIucmVzZXQobmV3IFByYWdtYUFsaWduSGFuZGxlcigpKTsKKyAgUFAuQWRkUHJhZ21hSGFuZGxlcihBbGlnbkhhbmRsZXIuZ2V0KCkpOworCisgIEdDQ1Zpc2liaWxpdHlIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFHQ0NWaXNpYmlsaXR5SGFuZGxlcigpKTsKKyAgUFAuQWRkUHJhZ21hSGFuZGxlcigiR0NDIiwgR0NDVmlzaWJpbGl0eUhhbmRsZXIuZ2V0KCkpOworCisgIE9wdGlvbnNIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFPcHRpb25zSGFuZGxlcigpKTsKKyAgUFAuQWRkUHJhZ21hSGFuZGxlcihPcHRpb25zSGFuZGxlci5nZXQoKSk7CisKKyAgUGFja0hhbmRsZXIucmVzZXQobmV3IFByYWdtYVBhY2tIYW5kbGVyKCkpOworICBQUC5BZGRQcmFnbWFIYW5kbGVyKFBhY2tIYW5kbGVyLmdldCgpKTsKKworICBNU1N0cnVjdEhhbmRsZXIucmVzZXQobmV3IFByYWdtYU1TU3RydWN0SGFuZGxlcigpKTsKKyAgUFAuQWRkUHJhZ21hSGFuZGxlcihNU1N0cnVjdEhhbmRsZXIuZ2V0KCkpOworCisgIFVudXNlZEhhbmRsZXIucmVzZXQobmV3IFByYWdtYVVudXNlZEhhbmRsZXIoKSk7CisgIFBQLkFkZFByYWdtYUhhbmRsZXIoVW51c2VkSGFuZGxlci5nZXQoKSk7CisKKyAgV2Vha0hhbmRsZXIucmVzZXQobmV3IFByYWdtYVdlYWtIYW5kbGVyKCkpOworICBQUC5BZGRQcmFnbWFIYW5kbGVyKFdlYWtIYW5kbGVyLmdldCgpKTsKKworICBSZWRlZmluZUV4dG5hbWVIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFSZWRlZmluZUV4dG5hbWVIYW5kbGVyKCkpOworICBQUC5BZGRQcmFnbWFIYW5kbGVyKFJlZGVmaW5lRXh0bmFtZUhhbmRsZXIuZ2V0KCkpOworCisgIEZQQ29udHJhY3RIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFGUENvbnRyYWN0SGFuZGxlcigpKTsKKyAgUFAuQWRkUHJhZ21hSGFuZGxlcigiU1REQyIsIEZQQ29udHJhY3RIYW5kbGVyLmdldCgpKTsKKworICBpZiAoZ2V0TGFuZ09wdHMoKS5PcGVuQ0wpIHsKKyAgICBPcGVuQ0xFeHRlbnNpb25IYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFPcGVuQ0xFeHRlbnNpb25IYW5kbGVyKCkpOworICAgIFBQLkFkZFByYWdtYUhhbmRsZXIoIk9QRU5DTCIsIE9wZW5DTEV4dGVuc2lvbkhhbmRsZXIuZ2V0KCkpOworCisgICAgUFAuQWRkUHJhZ21hSGFuZGxlcigiT1BFTkNMIiwgRlBDb250cmFjdEhhbmRsZXIuZ2V0KCkpOworICB9CisgIGlmIChnZXRMYW5nT3B0cygpLk9wZW5NUCkKKyAgICBPcGVuTVBIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFPcGVuTVBIYW5kbGVyKCkpOworICBlbHNlCisgICAgT3Blbk1QSGFuZGxlci5yZXNldChuZXcgUHJhZ21hTm9PcGVuTVBIYW5kbGVyKCkpOworICBQUC5BZGRQcmFnbWFIYW5kbGVyKE9wZW5NUEhhbmRsZXIuZ2V0KCkpOworCisgIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdEV4dCkgeworICAgIE1TQ29tbWVudEhhbmRsZXIucmVzZXQobmV3IFByYWdtYUNvbW1lbnRIYW5kbGVyKEFjdGlvbnMpKTsKKyAgICBQUC5BZGRQcmFnbWFIYW5kbGVyKE1TQ29tbWVudEhhbmRsZXIuZ2V0KCkpOworICAgIE1TRGV0ZWN0TWlzbWF0Y2hIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFEZXRlY3RNaXNtYXRjaEhhbmRsZXIoQWN0aW9ucykpOworICAgIFBQLkFkZFByYWdtYUhhbmRsZXIoTVNEZXRlY3RNaXNtYXRjaEhhbmRsZXIuZ2V0KCkpOworICAgIE1TUG9pbnRlcnNUb01lbWJlcnMucmVzZXQobmV3IFByYWdtYU1TUG9pbnRlcnNUb01lbWJlcnMoKSk7CisgICAgUFAuQWRkUHJhZ21hSGFuZGxlcihNU1BvaW50ZXJzVG9NZW1iZXJzLmdldCgpKTsKKyAgICBNU1Z0b3JEaXNwLnJlc2V0KG5ldyBQcmFnbWFNU1Z0b3JEaXNwKCkpOworICAgIFBQLkFkZFByYWdtYUhhbmRsZXIoTVNWdG9yRGlzcC5nZXQoKSk7CisgIH0KK30KKwordm9pZCBQYXJzZXI6OnJlc2V0UHJhZ21hSGFuZGxlcnMoKSB7CisgIC8vIFJlbW92ZSB0aGUgcHJhZ21hIGhhbmRsZXJzIHdlIGluc3RhbGxlZC4KKyAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcihBbGlnbkhhbmRsZXIuZ2V0KCkpOworICBBbGlnbkhhbmRsZXIucmVzZXQoKTsKKyAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcigiR0NDIiwgR0NDVmlzaWJpbGl0eUhhbmRsZXIuZ2V0KCkpOworICBHQ0NWaXNpYmlsaXR5SGFuZGxlci5yZXNldCgpOworICBQUC5SZW1vdmVQcmFnbWFIYW5kbGVyKE9wdGlvbnNIYW5kbGVyLmdldCgpKTsKKyAgT3B0aW9uc0hhbmRsZXIucmVzZXQoKTsKKyAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcihQYWNrSGFuZGxlci5nZXQoKSk7CisgIFBhY2tIYW5kbGVyLnJlc2V0KCk7CisgIFBQLlJlbW92ZVByYWdtYUhhbmRsZXIoTVNTdHJ1Y3RIYW5kbGVyLmdldCgpKTsKKyAgTVNTdHJ1Y3RIYW5kbGVyLnJlc2V0KCk7CisgIFBQLlJlbW92ZVByYWdtYUhhbmRsZXIoVW51c2VkSGFuZGxlci5nZXQoKSk7CisgIFVudXNlZEhhbmRsZXIucmVzZXQoKTsKKyAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcihXZWFrSGFuZGxlci5nZXQoKSk7CisgIFdlYWtIYW5kbGVyLnJlc2V0KCk7CisgIFBQLlJlbW92ZVByYWdtYUhhbmRsZXIoUmVkZWZpbmVFeHRuYW1lSGFuZGxlci5nZXQoKSk7CisgIFJlZGVmaW5lRXh0bmFtZUhhbmRsZXIucmVzZXQoKTsKKworICBpZiAoZ2V0TGFuZ09wdHMoKS5PcGVuQ0wpIHsKKyAgICBQUC5SZW1vdmVQcmFnbWFIYW5kbGVyKCJPUEVOQ0wiLCBPcGVuQ0xFeHRlbnNpb25IYW5kbGVyLmdldCgpKTsKKyAgICBPcGVuQ0xFeHRlbnNpb25IYW5kbGVyLnJlc2V0KCk7CisgICAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcigiT1BFTkNMIiwgRlBDb250cmFjdEhhbmRsZXIuZ2V0KCkpOworICB9CisgIFBQLlJlbW92ZVByYWdtYUhhbmRsZXIoT3Blbk1QSGFuZGxlci5nZXQoKSk7CisgIE9wZW5NUEhhbmRsZXIucmVzZXQoKTsKKworICBpZiAoZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRFeHQpIHsKKyAgICBQUC5SZW1vdmVQcmFnbWFIYW5kbGVyKE1TQ29tbWVudEhhbmRsZXIuZ2V0KCkpOworICAgIE1TQ29tbWVudEhhbmRsZXIucmVzZXQoKTsKKyAgICBQUC5SZW1vdmVQcmFnbWFIYW5kbGVyKE1TRGV0ZWN0TWlzbWF0Y2hIYW5kbGVyLmdldCgpKTsKKyAgICBNU0RldGVjdE1pc21hdGNoSGFuZGxlci5yZXNldCgpOworICAgIFBQLlJlbW92ZVByYWdtYUhhbmRsZXIoTVNQb2ludGVyc1RvTWVtYmVycy5nZXQoKSk7CisgICAgTVNQb2ludGVyc1RvTWVtYmVycy5yZXNldCgpOworICAgIFBQLlJlbW92ZVByYWdtYUhhbmRsZXIoTVNWdG9yRGlzcC5nZXQoKSk7CisgICAgTVNWdG9yRGlzcC5yZXNldCgpOworICB9CisKKyAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcigiU1REQyIsIEZQQ29udHJhY3RIYW5kbGVyLmdldCgpKTsKKyAgRlBDb250cmFjdEhhbmRsZXIucmVzZXQoKTsKK30KKwogLy8vIFxicmllZiBIYW5kbGUgdGhlIGFubm90YXRpb24gdG9rZW4gcHJvZHVjZWQgZm9yICNwcmFnbWEgdW51c2VkKC4uLikKIC8vLwogLy8vIEVhY2ggYW5ub3RfcHJhZ21hX3VudXNlZCBpcyBmb2xsb3dlZCBieSB0aGUgYXJndW1lbnQgdG9rZW4gc28gZS5nLgpAQCAtMTMwLDcgKzMzMSw3IEBACiAgIENvbnN1bWVUb2tlbigpOwogCiAgIGlmIChUb2suaXNOb3QodG9rOjpsX2JyYWNlKSkgewotICAgIFBQLkRpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfbGJyYWNlKTsKKyAgICBQUC5EaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfYnJhY2U7CiAgICAgcmV0dXJuIFN0bXRFcnJvcigpOwogICB9CiAKQEAgLTE4MCw3ICszODEsMjQgQEAKICAgfQogfQogCit2b2lkIFBhcnNlcjo6SGFuZGxlUHJhZ21hTVNQb2ludGVyc1RvTWVtYmVycygpIHsKKyAgYXNzZXJ0KFRvay5pcyh0b2s6OmFubm90X3ByYWdtYV9tc19wb2ludGVyc190b19tZW1iZXJzKSk7CisgIExhbmdPcHRpb25zOjpQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzS2luZCBSZXByZXNlbnRhdGlvbk1ldGhvZCA9CisgICAgICBzdGF0aWNfY2FzdDxMYW5nT3B0aW9uczo6UHJhZ21hTVNQb2ludGVyc1RvTWVtYmVyc0tpbmQ+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihUb2suZ2V0QW5ub3RhdGlvblZhbHVlKCkpKTsKKyAgU291cmNlTG9jYXRpb24gUHJhZ21hTG9jID0gQ29uc3VtZVRva2VuKCk7IC8vIFRoZSBhbm5vdGF0aW9uIHRva2VuLgorICBBY3Rpb25zLkFjdE9uUHJhZ21hTVNQb2ludGVyc1RvTWVtYmVycyhSZXByZXNlbnRhdGlvbk1ldGhvZCwgUHJhZ21hTG9jKTsKK30KIAordm9pZCBQYXJzZXI6OkhhbmRsZVByYWdtYU1TVnRvckRpc3AoKSB7CisgIGFzc2VydChUb2suaXModG9rOjphbm5vdF9wcmFnbWFfbXNfdnRvcmRpc3ApKTsKKyAgdWludHB0cl90IFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFRvay5nZXRBbm5vdGF0aW9uVmFsdWUoKSk7CisgIFNlbWE6OlByYWdtYVZ0b3JEaXNwS2luZCBLaW5kID0KKyAgICAgIHN0YXRpY19jYXN0PFNlbWE6OlByYWdtYVZ0b3JEaXNwS2luZD4oKFZhbHVlID4+IDE2KSAmIDB4RkZGRik7CisgIE1TVnRvckRpc3BBdHRyOjpNb2RlIE1vZGUgPSBNU1Z0b3JEaXNwQXR0cjo6TW9kZShWYWx1ZSAmIDB4RkZGRik7CisgIFNvdXJjZUxvY2F0aW9uIFByYWdtYUxvYyA9IENvbnN1bWVUb2tlbigpOyAvLyBUaGUgYW5ub3RhdGlvbiB0b2tlbi4KKyAgQWN0aW9ucy5BY3RPblByYWdtYU1TVnRvckRpc3AoS2luZCwgUHJhZ21hTG9jLCBNb2RlKTsKK30KIAogLy8gI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBjb21lcyBpbiB0d28gdmFyaWFudHM6CiAvLyAgICdwdXNoJyAnKCcgW3Zpc2liaWxpdHldICcpJwpAQCAtMjgzLDcgKzUwMSw3IEBACiAgICAgICB9IGVsc2UgaWYgKElJLT5pc1N0cigicG9wIikpIHsKICAgICAgICAgS2luZCA9IFNlbWE6OlBQS19Qb3A7CiAgICAgICB9IGVsc2UgewotICAgICAgICBQUC5EaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX3ByYWdtYV9wYWNrX2ludmFsaWRfYWN0aW9uKTsKKyAgICAgICAgUFAuRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6d2Fybl9wcmFnbWFfaW52YWxpZF9hY3Rpb24pIDw8ICJwYWNrIjsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgICAgUFAuTGV4KFRvayk7CkBAIC01MzAsNyArNzQ4LDcgQEAKICAgICB9CiAKICAgICAvLyBJbGxlZ2FsIHRva2VuIQotICAgIFBQLkRpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5fcHJhZ21hX3VudXNlZF9leHBlY3RlZF9wdW5jKTsKKyAgICBQUC5EaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX3ByYWdtYV9leHBlY3RlZF9wdW5jKSA8PCAidW51c2VkIjsKICAgICByZXR1cm47CiAgIH0KIApAQCAtNzk5LDYgKzEwMTcsMTkzIEBACiAgICAgICAgICAgICAgICAgICAgICAgLypEaXNhYmxlTWFjcm9FeHBhbnNpb249Ki90cnVlLCAvKk93bnNUb2tlbnM9Ki90cnVlKTsKIH0KIAorLy8vIFxicmllZiBIYW5kbGUgJyNwcmFnbWEgcG9pbnRlcnNfdG9fbWVtYmVycycKKy8vIFRoZSBncmFtbWFyIGZvciB0aGlzIHByYWdtYSBpcyBhcyBmb2xsb3dzOgorLy8KKy8vIDxpbmhlcml0YW5jZSBtb2RlbD4gOjo9ICgnc2luZ2xlJyB8ICdtdWx0aXBsZScgfCAndmlydHVhbCcpICdfaW5oZXJpdGFuY2UnCisvLworLy8gI3ByYWdtYSBwb2ludGVyc190b19tZW1iZXJzICcoJyAnYmVzdF9jYXNlJyAnKScKKy8vICNwcmFnbWEgcG9pbnRlcnNfdG9fbWVtYmVycyAnKCcgJ2Z1bGxfZ2VuZXJhbGl0eScgWycsJyBpbmhlcml0YW5jZS1tb2RlbF0gJyknCisvLyAjcHJhZ21hIHBvaW50ZXJzX3RvX21lbWJlcnMgJygnIGluaGVyaXRhbmNlLW1vZGVsICcpJwordm9pZCBQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzOjpIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmVG9rKSB7CisgIFNvdXJjZUxvY2F0aW9uIFBvaW50ZXJzVG9NZW1iZXJzTG9jID0gVG9rLmdldExvY2F0aW9uKCk7CisgIFBQLkxleChUb2spOworICBpZiAoVG9rLmlzTm90KHRvazo6bF9wYXJlbikpIHsKKyAgICBQUC5EaWFnKFBvaW50ZXJzVG9NZW1iZXJzTG9jLCBkaWFnOjp3YXJuX3ByYWdtYV9leHBlY3RlZF9scGFyZW4pCisgICAgICA8PCAicG9pbnRlcnNfdG9fbWVtYmVycyI7CisgICAgcmV0dXJuOworICB9CisgIFBQLkxleChUb2spOworICBjb25zdCBJZGVudGlmaWVySW5mbyAqQXJnID0gVG9rLmdldElkZW50aWZpZXJJbmZvKCk7CisgIGlmICghQXJnKSB7CisgICAgUFAuRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6d2Fybl9wcmFnbWFfZXhwZWN0ZWRfaWRlbnRpZmllcikKKyAgICAgIDw8ICJwb2ludGVyc190b19tZW1iZXJzIjsKKyAgICByZXR1cm47CisgIH0KKyAgUFAuTGV4KFRvayk7CisKKyAgTGFuZ09wdGlvbnM6OlByYWdtYU1TUG9pbnRlcnNUb01lbWJlcnNLaW5kIFJlcHJlc2VudGF0aW9uTWV0aG9kOworICBpZiAoQXJnLT5pc1N0cigiYmVzdF9jYXNlIikpIHsKKyAgICBSZXByZXNlbnRhdGlvbk1ldGhvZCA9IExhbmdPcHRpb25zOjpQUFRNS19CZXN0Q2FzZTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoQXJnLT5pc1N0cigiZnVsbF9nZW5lcmFsaXR5IikpIHsKKyAgICAgIGlmIChUb2suaXModG9rOjpjb21tYSkpIHsKKyAgICAgICAgUFAuTGV4KFRvayk7CisKKyAgICAgICAgQXJnID0gVG9rLmdldElkZW50aWZpZXJJbmZvKCk7CisgICAgICAgIGlmICghQXJnKSB7CisgICAgICAgICAgUFAuRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgIGRpYWc6OmVycl9wcmFnbWFfcG9pbnRlcnNfdG9fbWVtYmVyc191bmtub3duX2tpbmQpCisgICAgICAgICAgICAgIDw8IFRvay5nZXRLaW5kKCkgPDwgLypPbmx5SW5oZXJpdGFuY2VNb2RlbHMqLyAwOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBQUC5MZXgoVG9rKTsKKyAgICAgIH0gZWxzZSBpZiAoVG9rLmlzKHRvazo6cl9wYXJlbikpIHsKKyAgICAgICAgLy8gI3ByYWdtYSBwb2ludGVyc190b19tZW1iZXJzKGZ1bGxfZ2VuZXJhbGl0eSkgaW1wbGljaXRseSBzcGVjaWZpZXMKKyAgICAgICAgLy8gdmlydHVhbF9pbmhlcml0YW5jZS4KKyAgICAgICAgQXJnID0gMDsKKyAgICAgICAgUmVwcmVzZW50YXRpb25NZXRob2QgPSBMYW5nT3B0aW9uczo6UFBUTUtfRnVsbEdlbmVyYWxpdHlWaXJ0dWFsSW5oZXJpdGFuY2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBQUC5EaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWRfcHVuYykKKyAgICAgICAgICAgIDw8ICJmdWxsX2dlbmVyYWxpdHkiOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorCisgICAgaWYgKEFyZykgeworICAgICAgaWYgKEFyZy0+aXNTdHIoInNpbmdsZV9pbmhlcml0YW5jZSIpKSB7CisgICAgICAgIFJlcHJlc2VudGF0aW9uTWV0aG9kID0KKyAgICAgICAgICAgIExhbmdPcHRpb25zOjpQUFRNS19GdWxsR2VuZXJhbGl0eVNpbmdsZUluaGVyaXRhbmNlOworICAgICAgfSBlbHNlIGlmIChBcmctPmlzU3RyKCJtdWx0aXBsZV9pbmhlcml0YW5jZSIpKSB7CisgICAgICAgIFJlcHJlc2VudGF0aW9uTWV0aG9kID0KKyAgICAgICAgICAgIExhbmdPcHRpb25zOjpQUFRNS19GdWxsR2VuZXJhbGl0eU11bHRpcGxlSW5oZXJpdGFuY2U7CisgICAgICB9IGVsc2UgaWYgKEFyZy0+aXNTdHIoInZpcnR1YWxfaW5oZXJpdGFuY2UiKSkgeworICAgICAgICBSZXByZXNlbnRhdGlvbk1ldGhvZCA9CisgICAgICAgICAgICBMYW5nT3B0aW9uczo6UFBUTUtfRnVsbEdlbmVyYWxpdHlWaXJ0dWFsSW5oZXJpdGFuY2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBQUC5EaWFnKFRvay5nZXRMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgIGRpYWc6OmVycl9wcmFnbWFfcG9pbnRlcnNfdG9fbWVtYmVyc191bmtub3duX2tpbmQpCisgICAgICAgICAgICA8PCBBcmcgPDwgLypIYXNQb2ludGVyRGVjbGFyYXRpb24qLyAxOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKFRvay5pc05vdCh0b2s6OnJfcGFyZW4pKSB7CisgICAgUFAuRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2V4cGVjdGVkX3JwYXJlbl9hZnRlcikKKyAgICAgICAgPDwgKEFyZyA/IEFyZy0+Z2V0TmFtZSgpIDogImZ1bGxfZ2VuZXJhbGl0eSIpOworICAgIHJldHVybjsKKyAgfQorCisgIFBQLkxleChUb2spOworICBpZiAoVG9rLmlzTm90KHRvazo6ZW9kKSkgeworICAgIFBQLkRpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5fcHJhZ21hX2V4dHJhX3Rva2Vuc19hdF9lb2wpCisgICAgICA8PCAicG9pbnRlcnNfdG9fbWVtYmVycyI7CisgICAgcmV0dXJuOworICB9CisKKyAgVG9rZW4gQW5ub3RUb2s7CisgIEFubm90VG9rLnN0YXJ0VG9rZW4oKTsKKyAgQW5ub3RUb2suc2V0S2luZCh0b2s6OmFubm90X3ByYWdtYV9tc19wb2ludGVyc190b19tZW1iZXJzKTsKKyAgQW5ub3RUb2suc2V0TG9jYXRpb24oUG9pbnRlcnNUb01lbWJlcnNMb2MpOworICBBbm5vdFRvay5zZXRBbm5vdGF0aW9uVmFsdWUoCisgICAgICByZWludGVycHJldF9jYXN0PHZvaWQgKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihSZXByZXNlbnRhdGlvbk1ldGhvZCkpKTsKKyAgUFAuRW50ZXJUb2tlbihBbm5vdFRvayk7Cit9CisKKy8vLyBcYnJpZWYgSGFuZGxlICcjcHJhZ21hIHZ0b3JkaXNwJworLy8gVGhlIGdyYW1tYXIgZm9yIHRoaXMgcHJhZ21hIGlzIGFzIGZvbGxvd3M6CisvLworLy8gPHZ0b3JkaXNwLW1vZGU+IDo6PSAoJ29mZicgfCAnb24nIHwgJzAnIHwgJzEnIHwgJzInICkKKy8vCisvLyAjcHJhZ21hIHZ0b3JkaXNwICcoJyBbJ3B1c2gnICcsJ10gdnRvcmRpc3AtbW9kZSAnKScKKy8vICNwcmFnbWEgdnRvcmRpc3AgJygnICdwb3AnICcpJworLy8gI3ByYWdtYSB2dG9yZGlzcCAnKCcgJyknCit2b2lkIFByYWdtYU1TVnRvckRpc3A6OkhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZUb2spIHsKKyAgU291cmNlTG9jYXRpb24gVnRvckRpc3BMb2MgPSBUb2suZ2V0TG9jYXRpb24oKTsKKyAgUFAuTGV4KFRvayk7CisgIGlmIChUb2suaXNOb3QodG9rOjpsX3BhcmVuKSkgeworICAgIFBQLkRpYWcoVnRvckRpc3BMb2MsIGRpYWc6Ondhcm5fcHJhZ21hX2V4cGVjdGVkX2xwYXJlbikgPDwgInZ0b3JkaXNwIjsKKyAgICByZXR1cm47CisgIH0KKyAgUFAuTGV4KFRvayk7CisKKyAgU2VtYTo6UHJhZ21hVnRvckRpc3BLaW5kIEtpbmQgPSBTZW1hOjpQVkRLX1NldDsKKyAgY29uc3QgSWRlbnRpZmllckluZm8gKklJID0gVG9rLmdldElkZW50aWZpZXJJbmZvKCk7CisgIGlmIChJSSkgeworICAgIGlmIChJSS0+aXNTdHIoInB1c2giKSkgeworICAgICAgLy8gI3ByYWdtYSB2dG9yZGlzcChwdXNoLCBtb2RlKQorICAgICAgUFAuTGV4KFRvayk7CisgICAgICBpZiAoVG9rLmlzTm90KHRvazo6Y29tbWEpKSB7CisgICAgICAgIFBQLkRpYWcoVnRvckRpc3BMb2MsIGRpYWc6Ondhcm5fcHJhZ21hX2V4cGVjdGVkX3B1bmMpIDw8ICJ2dG9yZGlzcCI7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIFBQLkxleChUb2spOworICAgICAgS2luZCA9IFNlbWE6OlBWREtfUHVzaDsKKyAgICAgIC8vIG5vdCBwdXNoLCBjb3VsZCBiZSBvbi9vZmYKKyAgICB9IGVsc2UgaWYgKElJLT5pc1N0cigicG9wIikpIHsKKyAgICAgIC8vICNwcmFnbWEgdnRvcmRpc3AocG9wKQorICAgICAgUFAuTGV4KFRvayk7CisgICAgICBLaW5kID0gU2VtYTo6UFZES19Qb3A7CisgICAgfQorICAgIC8vIG5vdCBwdXNoIG9yIHBvcCwgY291bGQgYmUgb24vb2ZmCisgIH0gZWxzZSB7CisgICAgaWYgKFRvay5pcyh0b2s6OnJfcGFyZW4pKSB7CisgICAgICAvLyAjcHJhZ21hIHZ0b3JkaXNwKCkKKyAgICAgIEtpbmQgPSBTZW1hOjpQVkRLX1Jlc2V0OworICAgIH0KKyAgfQorCisKKyAgdWludDY0X3QgVmFsdWUgPSAwOworICBpZiAoS2luZCA9PSBTZW1hOjpQVkRLX1B1c2ggfHwgS2luZCA9PSBTZW1hOjpQVkRLX1NldCkgeworICAgIGNvbnN0IElkZW50aWZpZXJJbmZvICpJSSA9IFRvay5nZXRJZGVudGlmaWVySW5mbygpOworICAgIGlmIChJSSAmJiBJSS0+aXNTdHIoIm9mZiIpKSB7CisgICAgICBQUC5MZXgoVG9rKTsKKyAgICAgIFZhbHVlID0gMDsKKyAgICB9IGVsc2UgaWYgKElJICYmIElJLT5pc1N0cigib24iKSkgeworICAgICAgUFAuTGV4KFRvayk7CisgICAgICBWYWx1ZSA9IDE7CisgICAgfSBlbHNlIGlmIChUb2suaXModG9rOjpudW1lcmljX2NvbnN0YW50KSAmJgorICAgICAgICAgICAgICAgUFAucGFyc2VTaW1wbGVJbnRlZ2VyTGl0ZXJhbChUb2ssIFZhbHVlKSkgeworICAgICAgaWYgKFZhbHVlID4gMikgeworICAgICAgICBQUC5EaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX3ByYWdtYV9leHBlY3RlZF9pbnRlZ2VyKQorICAgICAgICAgICAgPDwgMCA8PCAyIDw8ICJ2dG9yZGlzcCI7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgUFAuRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6d2Fybl9wcmFnbWFfaW52YWxpZF9hY3Rpb24pCisgICAgICAgICAgPDwgInZ0b3JkaXNwIjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyBGaW5pc2ggdGhlIHByYWdtYTogJyknICQKKyAgaWYgKFRvay5pc05vdCh0b2s6OnJfcGFyZW4pKSB7CisgICAgUFAuRGlhZyhWdG9yRGlzcExvYywgZGlhZzo6d2Fybl9wcmFnbWFfZXhwZWN0ZWRfcnBhcmVuKSA8PCAidnRvcmRpc3AiOworICAgIHJldHVybjsKKyAgfQorICBQUC5MZXgoVG9rKTsKKyAgaWYgKFRvay5pc05vdCh0b2s6OmVvZCkpIHsKKyAgICBQUC5EaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX3ByYWdtYV9leHRyYV90b2tlbnNfYXRfZW9sKQorICAgICAgICA8PCAidnRvcmRpc3AiOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEVudGVyIHRoZSBhbm5vdGF0aW9uLgorICBUb2tlbiBBbm5vdFRvazsKKyAgQW5ub3RUb2suc3RhcnRUb2tlbigpOworICBBbm5vdFRvay5zZXRLaW5kKHRvazo6YW5ub3RfcHJhZ21hX21zX3Z0b3JkaXNwKTsKKyAgQW5ub3RUb2suc2V0TG9jYXRpb24oVnRvckRpc3BMb2MpOworICBBbm5vdFRvay5zZXRBbm5vdGF0aW9uVmFsdWUocmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KAorICAgICAgc3RhdGljX2Nhc3Q8dWludHB0cl90PigoS2luZCA8PCAxNikgfCAoVmFsdWUgJiAweEZGRkYpKSkpOworICBQUC5FbnRlclRva2VuKEFubm90VG9rKTsKK30KKwogLy8vIFxicmllZiBIYW5kbGUgdGhlIE1pY3Jvc29mdCBcI3ByYWdtYSBkZXRlY3RfbWlzbWF0Y2ggZXh0ZW5zaW9uLgogLy8vCiAvLy8gVGhlIHN5bnRheCBpczoKQEAgLTgxNSw3ICsxMjIwLDcgQEAKICAgU291cmNlTG9jYXRpb24gQ29tbWVudExvYyA9IFRvay5nZXRMb2NhdGlvbigpOwogICBQUC5MZXgoVG9rKTsKICAgaWYgKFRvay5pc05vdCh0b2s6OmxfcGFyZW4pKSB7Ci0gICAgUFAuRGlhZyhDb21tZW50TG9jLCBkaWFnOjplcnJfZXhwZWN0ZWRfbHBhcmVuKTsKKyAgICBQUC5EaWFnKENvbW1lbnRMb2MsIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjpsX3BhcmVuOwogICAgIHJldHVybjsKICAgfQogCkBAIC04MzgsNyArMTI0Myw3IEBACiAgICAgcmV0dXJuOwogCiAgIGlmIChUb2suaXNOb3QodG9rOjpyX3BhcmVuKSkgewotICAgIFBQLkRpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZF9ycGFyZW4pOworICAgIFBQLkRpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjpyX3BhcmVuOwogICAgIHJldHVybjsKICAgfQogICBQUC5MZXgoVG9rKTsgIC8vIEVhdCB0aGUgcl9wYXJlbi4KZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZVByYWdtYS5oIGIvbGliL1BhcnNlL1BhcnNlUHJhZ21hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTQ1MGYuLjAwMDAwMDAKLS0tIGEvbGliL1BhcnNlL1BhcnNlUHJhZ21hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy89PT0tLS0tIFBhcnNlclByYWdtYXMuaCAtIExhbmd1YWdlIHNwZWNpZmljIHByYWdtYXMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyAjcHJhZ21hIGhhbmRsZXJzIGZvciBsYW5ndWFnZSBzcGVjaWZpYyBwcmFnbWFzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9DTEFOR19QQVJTRV9QQVJTRVBSQUdNQV9ICi0jZGVmaW5lIExMVk1fQ0xBTkdfUEFSU0VfUEFSU0VQUkFHTUFfSAotCi0jaW5jbHVkZSAiY2xhbmcvTGV4L1ByYWdtYS5oIgotCi1uYW1lc3BhY2UgY2xhbmcgewotICBjbGFzcyBTZW1hOwotICBjbGFzcyBQYXJzZXI7Ci0KLWNsYXNzIFByYWdtYUFsaWduSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKLXB1YmxpYzoKLSAgZXhwbGljaXQgUHJhZ21hQWxpZ25IYW5kbGVyKCkgOiBQcmFnbWFIYW5kbGVyKCJhbGlnbiIpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKTsKLX07Ci0KLWNsYXNzIFByYWdtYUdDQ1Zpc2liaWxpdHlIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewotcHVibGljOgotICBleHBsaWNpdCBQcmFnbWFHQ0NWaXNpYmlsaXR5SGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigidmlzaWJpbGl0eSIpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKTsKLX07Ci0KLWNsYXNzIFByYWdtYU9wdGlvbnNIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewotcHVibGljOgotICBleHBsaWNpdCBQcmFnbWFPcHRpb25zSGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigib3B0aW9ucyIpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKTsKLX07Ci0KLWNsYXNzIFByYWdtYVBhY2tIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewotcHVibGljOgotICBleHBsaWNpdCBQcmFnbWFQYWNrSGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigicGFjayIpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKTsKLX07Ci0gIAotY2xhc3MgUHJhZ21hTVNTdHJ1Y3RIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewotcHVibGljOgotICBleHBsaWNpdCBQcmFnbWFNU1N0cnVjdEhhbmRsZXIoKSA6IFByYWdtYUhhbmRsZXIoIm1zX3N0cnVjdCIpIHt9Ci0gICAgCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRmlyc3RUb2tlbik7Ci19OwotCi1jbGFzcyBQcmFnbWFVbnVzZWRIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewotcHVibGljOgotICBQcmFnbWFVbnVzZWRIYW5kbGVyKCkgOiBQcmFnbWFIYW5kbGVyKCJ1bnVzZWQiKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRmlyc3RUb2tlbik7Ci19OwotCi1jbGFzcyBQcmFnbWFXZWFrSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKLXB1YmxpYzoKLSAgZXhwbGljaXQgUHJhZ21hV2Vha0hhbmRsZXIoKSA6IFByYWdtYUhhbmRsZXIoIndlYWsiKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRmlyc3RUb2tlbik7Ci19OwotCi1jbGFzcyBQcmFnbWFSZWRlZmluZUV4dG5hbWVIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewotcHVibGljOgotICBleHBsaWNpdCBQcmFnbWFSZWRlZmluZUV4dG5hbWVIYW5kbGVyKCkgOiBQcmFnbWFIYW5kbGVyKCJyZWRlZmluZV9leHRuYW1lIikge30KLQotICB2aXJ0dWFsIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pOwotfTsKLQotY2xhc3MgUHJhZ21hT3BlbkNMRXh0ZW5zaW9uSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKLXB1YmxpYzoKLSAgUHJhZ21hT3BlbkNMRXh0ZW5zaW9uSGFuZGxlcigpIDogUHJhZ21hSGFuZGxlcigiRVhURU5TSU9OIikge30KLSAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKTsKLX07Ci0gIAotCi1jbGFzcyBQcmFnbWFGUENvbnRyYWN0SGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKLXB1YmxpYzoKLSAgUHJhZ21hRlBDb250cmFjdEhhbmRsZXIoKSA6IFByYWdtYUhhbmRsZXIoIkZQX0NPTlRSQUNUIikge30KLSAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKTsKLX07Ci0KLWNsYXNzIFByYWdtYU5vT3Blbk1QSGFuZGxlciA6IHB1YmxpYyBQcmFnbWFIYW5kbGVyIHsKLXB1YmxpYzoKLSAgUHJhZ21hTm9PcGVuTVBIYW5kbGVyKCkgOiBQcmFnbWFIYW5kbGVyKCJvbXAiKSB7IH0KLSAgdmlydHVhbCB2b2lkIEhhbmRsZVByYWdtYShQcmVwcm9jZXNzb3IgJlBQLCBQcmFnbWFJbnRyb2R1Y2VyS2luZCBJbnRyb2R1Y2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuICZGaXJzdFRva2VuKTsKLX07Ci0KLWNsYXNzIFByYWdtYU9wZW5NUEhhbmRsZXIgOiBwdWJsaWMgUHJhZ21hSGFuZGxlciB7Ci1wdWJsaWM6Ci0gIFByYWdtYU9wZW5NUEhhbmRsZXIoKSA6IFByYWdtYUhhbmRsZXIoIm9tcCIpIHsgfQotICB2aXJ0dWFsIHZvaWQgSGFuZGxlUHJhZ21hKFByZXByb2Nlc3NvciAmUFAsIFByYWdtYUludHJvZHVjZXJLaW5kIEludHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gJkZpcnN0VG9rZW4pOwotfTsKLQotLy8vIFByYWdtYUNvbW1lbnRIYW5kbGVyIC0gIlwjcHJhZ21hIGNvbW1lbnQgLi4uIi4KLWNsYXNzIFByYWdtYUNvbW1lbnRIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewotcHVibGljOgotICBQcmFnbWFDb21tZW50SGFuZGxlcihTZW1hICZBY3Rpb25zKQotICAgIDogUHJhZ21hSGFuZGxlcigiY29tbWVudCIpLCBBY3Rpb25zKEFjdGlvbnMpIHt9Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRmlyc3RUb2tlbik7Ci1wcml2YXRlOgotICBTZW1hICZBY3Rpb25zOwotfTsKLQotY2xhc3MgUHJhZ21hRGV0ZWN0TWlzbWF0Y2hIYW5kbGVyIDogcHVibGljIFByYWdtYUhhbmRsZXIgewotcHVibGljOgotICBQcmFnbWFEZXRlY3RNaXNtYXRjaEhhbmRsZXIoU2VtYSAmQWN0aW9ucykKLSAgICA6IFByYWdtYUhhbmRsZXIoImRldGVjdF9taXNtYXRjaCIpLCBBY3Rpb25zKEFjdGlvbnMpIHt9Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVQcmFnbWEoUHJlcHJvY2Vzc29yICZQUCwgUHJhZ21hSW50cm9kdWNlcktpbmQgSW50cm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiAmRmlyc3RUb2tlbik7Ci1wcml2YXRlOgotICBTZW1hICZBY3Rpb25zOwotfTsKLQotfSAgLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZVN0bXQuY3BwIGIvbGliL1BhcnNlL1BhcnNlU3RtdC5jcHAKaW5kZXggZDFmMjEzOC4uNzI1NGViMyAxMDA2NDQKLS0tIGEvbGliL1BhcnNlL1BhcnNlU3RtdC5jcHAKKysrIGIvbGliL1BhcnNlL1BhcnNlU3RtdC5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJjbGFuZy9TZW1hL1ByZXR0eURlY2xTdGFja1RyYWNlLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9TY29wZS5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvVHlwb0NvcnJlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgogI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCiAjaW5jbHVkZSAibGx2bS9NQy9NQ0NvbnRleHQuaCIKICNpbmNsdWRlICJsbHZtL01DL01DT2JqZWN0RmlsZUluZm8uaCIKQEAgLTM0LDcgKzM1LDYgQEAKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU291cmNlTWdyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RhcmdldFJlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RhcmdldFNlbGVjdC5oIgotI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCkBAIC0xNDIsNyArMTQyLDcgQEAKICAgICBXYW50Q1hYTmFtZWRDYXN0cyA9IGZhbHNlOwogICB9CiAKLSAgdmlydHVhbCBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIHsKKyAgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSBvdmVycmlkZSB7CiAgICAgaWYgKEZpZWxkRGVjbCAqRkQgPSBjYW5kaWRhdGUuZ2V0Q29ycmVjdGlvbkRlY2xBczxGaWVsZERlY2w+KCkpCiAgICAgICByZXR1cm4gIWNhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uU3BlY2lmaWVyKCkgfHwgaXNhPE9iakNJdmFyRGVjbD4oRkQpOwogICAgIGlmIChOZXh0VG9rZW4uaXModG9rOjplcXVhbCkpCkBAIC0zNDUsMTIgKzM0NSwxNSBAQAogICAgIFByb2hpYml0QXR0cmlidXRlcyhBdHRycyk7CiAgICAgcmV0dXJuIFBhcnNlT3Blbk1QRGVjbGFyYXRpdmVPckV4ZWN1dGFibGVEaXJlY3RpdmUoKTsKIAorICBjYXNlIHRvazo6YW5ub3RfcHJhZ21hX21zX3BvaW50ZXJzX3RvX21lbWJlcnM6CisgICAgUHJvaGliaXRBdHRyaWJ1dGVzKEF0dHJzKTsKKyAgICBIYW5kbGVQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzKCk7CisgICAgcmV0dXJuIFN0bXRFbXB0eSgpOworCiAgIH0KIAogICAvLyBJZiB3ZSByZWFjaGVkIHRoaXMgY29kZSwgdGhlIHN0YXRlbWVudCBtdXN0IGVuZCBpbiBhIHNlbWljb2xvbi4KLSAgaWYgKFRvay5pcyh0b2s6OnNlbWkpKSB7Ci0gICAgQ29uc3VtZVRva2VuKCk7Ci0gIH0gZWxzZSBpZiAoIVJlcy5pc0ludmFsaWQoKSkgeworICBpZiAoIVRyeUNvbnN1bWVUb2tlbih0b2s6OnNlbWkpICYmICFSZXMuaXNJbnZhbGlkKCkpIHsKICAgICAvLyBJZiB0aGUgcmVzdWx0IHdhcyB2YWxpZCwgdGhlbiB3ZSBkbyB3YW50IHRvIGRpYWdub3NlIHRoaXMuICBVc2UKICAgICAvLyBFeHBlY3RBbmRDb25zdW1lIHRvIGVtaXQgdGhlIGRpYWdub3N0aWMsIGV2ZW4gdGhvdWdoIHdlIGtub3cgaXQgd29uJ3QKICAgICAvLyBzdWNjZWVkLgpAQCAtNDEyLDcgKzQxNSw3IEBACiAvLy8KIFN0bXRSZXN1bHQgUGFyc2VyOjpQYXJzZVNFSFRyeUJsb2NrQ29tbW9uKFNvdXJjZUxvY2F0aW9uIFRyeUxvYykgewogICBpZihUb2suaXNOb3QodG9rOjpsX2JyYWNlKSkKLSAgICByZXR1cm4gU3RtdEVycm9yKERpYWcoVG9rLGRpYWc6OmVycl9leHBlY3RlZF9sYnJhY2UpKTsKKyAgICByZXR1cm4gU3RtdEVycm9yKERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6bF9icmFjZSk7CiAKICAgU3RtdFJlc3VsdCBUcnlCbG9jayhQYXJzZUNvbXBvdW5kU3RhdGVtZW50KCkpOwogICBpZihUcnlCbG9jay5pc0ludmFsaWQoKSkKQEAgLTQ0OSw3ICs0NTIsNyBAQAogICAgIHJhaWkyKElkZW50X19fZXhjZXB0aW9uX2NvZGUsIGZhbHNlKSwKICAgICByYWlpMyhJZGVudF9HZXRFeGNlcHRpb25Db2RlLCBmYWxzZSk7CiAKLSAgaWYoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OmxfcGFyZW4sZGlhZzo6ZXJyX2V4cGVjdGVkX2xwYXJlbikpCisgIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6bF9wYXJlbikpCiAgICAgcmV0dXJuIFN0bXRFcnJvcigpOwogCiAgIFBhcnNlU2NvcGUgRXhwZWN0U2NvcGUodGhpcywgU2NvcGU6OkRlY2xTY29wZSB8IFNjb3BlOjpDb250cm9sU2NvcGUpOwpAQCAtNDcwLDcgKzQ3Myw3IEBACiAgIGlmKEZpbHRlckV4cHIuaXNJbnZhbGlkKCkpCiAgICAgcmV0dXJuIFN0bXRFcnJvcigpOwogCi0gIGlmKEV4cGVjdEFuZENvbnN1bWUodG9rOjpyX3BhcmVuLGRpYWc6OmVycl9leHBlY3RlZF9ycGFyZW4pKQorICBpZiAoRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnJfcGFyZW4pKQogICAgIHJldHVybiBTdG10RXJyb3IoKTsKIAogICBTdG10UmVzdWx0IEJsb2NrKFBhcnNlQ29tcG91bmRTdGF0ZW1lbnQoKSk7CkBAIC01NDMsNyArNTQ2LDcgQEAKICAgICAgICAgU3ViU3RtdCA9IEFjdGlvbnMuUHJvY2Vzc1N0bXRBdHRyaWJ1dGVzKAogICAgICAgICAgICAgU3ViU3RtdC5nZXQoKSwgVGVtcEF0dHJzLmdldExpc3QoKSwgVGVtcEF0dHJzLlJhbmdlKTsKICAgICB9IGVsc2UgewotICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2FmdGVyKSA8PCAiX19hdHRyaWJ1dGVfXyI7CisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2FmdGVyKSA8PCAiX19hdHRyaWJ1dGVfXyIgPDwgdG9rOjpzZW1pOwogICAgIH0KICAgfQogCkBAIC02MjQsMTAgKzYyNyw4IEBACiAgICAgLy8gR05VIGNhc2UgcmFuZ2UgZXh0ZW5zaW9uLgogICAgIFNvdXJjZUxvY2F0aW9uIERvdERvdERvdExvYzsKICAgICBFeHByUmVzdWx0IFJIUzsKLSAgICBpZiAoVG9rLmlzKHRvazo6ZWxsaXBzaXMpKSB7Ci0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXh0X2dudV9jYXNlX3JhbmdlKTsKLSAgICAgIERvdERvdERvdExvYyA9IENvbnN1bWVUb2tlbigpOwotCisgICAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OmVsbGlwc2lzLCBEb3REb3REb3RMb2MpKSB7CisgICAgICBEaWFnKERvdERvdERvdExvYywgZGlhZzo6ZXh0X2dudV9jYXNlX3JhbmdlKTsKICAgICAgIFJIUyA9IFBhcnNlQ29uc3RhbnRFeHByZXNzaW9uKCk7CiAgICAgICBpZiAoUkhTLmlzSW52YWxpZCgpKSB7CiAgICAgICAgIFNraXBVbnRpbCh0b2s6OmNvbG9uLCBTdG9wQXRTZW1pKTsKQEAgLTYzNywxOCArNjM4LDE3IEBACiAKICAgICBDb2xvblByb3RlY3Rpb24ucmVzdG9yZSgpOwogCi0gICAgaWYgKFRvay5pcyh0b2s6OmNvbG9uKSkgewotICAgICAgQ29sb25Mb2MgPSBDb25zdW1lVG9rZW4oKTsKLQotICAgIC8vIFRyZWF0ICJjYXNlIGJsYWg7IiBhcyBhIHR5cG8gZm9yICJjYXNlIGJsYWg6Ii4KLSAgICB9IGVsc2UgaWYgKFRvay5pcyh0b2s6OnNlbWkpKSB7Ci0gICAgICBDb2xvbkxvYyA9IENvbnN1bWVUb2tlbigpOwotICAgICAgRGlhZyhDb2xvbkxvYywgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbG9uX2FmdGVyKSA8PCAiJ2Nhc2UnIgotICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlcGxhY2VtZW50KENvbG9uTG9jLCAiOiIpOworICAgIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb2xvbiwgQ29sb25Mb2MpKSB7CisgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjpzZW1pLCBDb2xvbkxvYykpIHsKKyAgICAgIC8vIFRyZWF0ICJjYXNlIGJsYWg7IiBhcyBhIHR5cG8gZm9yICJjYXNlIGJsYWg6Ii4KKyAgICAgIERpYWcoQ29sb25Mb2MsIGRpYWc6OmVycl9leHBlY3RlZF9hZnRlcikKKyAgICAgICAgICA8PCAiJ2Nhc2UnIiA8PCB0b2s6OmNvbG9uCisgICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVSZXBsYWNlbWVudChDb2xvbkxvYywgIjoiKTsKICAgICB9IGVsc2UgewogICAgICAgU291cmNlTG9jYXRpb24gRXhwZWN0ZWRMb2MgPSBQUC5nZXRMb2NGb3JFbmRPZlRva2VuKFByZXZUb2tMb2NhdGlvbik7Ci0gICAgICBEaWFnKEV4cGVjdGVkTG9jLCBkaWFnOjplcnJfZXhwZWN0ZWRfY29sb25fYWZ0ZXIpIDw8ICInY2FzZSciCi0gICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKEV4cGVjdGVkTG9jLCAiOiIpOworICAgICAgRGlhZyhFeHBlY3RlZExvYywgZGlhZzo6ZXJyX2V4cGVjdGVkX2FmdGVyKQorICAgICAgICAgIDw8ICInY2FzZSciIDw8IHRvazo6Y29sb24KKyAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihFeHBlY3RlZExvYywgIjoiKTsKICAgICAgIENvbG9uTG9jID0gRXhwZWN0ZWRMb2M7CiAgICAgfQogCkBAIC03MTMsMTggKzcxMywxNyBAQAogICBTb3VyY2VMb2NhdGlvbiBEZWZhdWx0TG9jID0gQ29uc3VtZVRva2VuKCk7ICAvLyBlYXQgdGhlICdkZWZhdWx0Jy4KIAogICBTb3VyY2VMb2NhdGlvbiBDb2xvbkxvYzsKLSAgaWYgKFRvay5pcyh0b2s6OmNvbG9uKSkgewotICAgIENvbG9uTG9jID0gQ29uc3VtZVRva2VuKCk7Ci0KLSAgLy8gVHJlYXQgImRlZmF1bHQ7IiBhcyBhIHR5cG8gZm9yICJkZWZhdWx0OiIuCi0gIH0gZWxzZSBpZiAoVG9rLmlzKHRvazo6c2VtaSkpIHsKLSAgICBDb2xvbkxvYyA9IENvbnN1bWVUb2tlbigpOwotICAgIERpYWcoQ29sb25Mb2MsIGRpYWc6OmVycl9leHBlY3RlZF9jb2xvbl9hZnRlcikgPDwgIidkZWZhdWx0JyIKLSAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlUmVwbGFjZW1lbnQoQ29sb25Mb2MsICI6Iik7CisgIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb2xvbiwgQ29sb25Mb2MpKSB7CisgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6c2VtaSwgQ29sb25Mb2MpKSB7CisgICAgLy8gVHJlYXQgImRlZmF1bHQ7IiBhcyBhIHR5cG8gZm9yICJkZWZhdWx0OiIuCisgICAgRGlhZyhDb2xvbkxvYywgZGlhZzo6ZXJyX2V4cGVjdGVkX2FmdGVyKQorICAgICAgICA8PCAiJ2RlZmF1bHQnIiA8PCB0b2s6OmNvbG9uCisgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlUmVwbGFjZW1lbnQoQ29sb25Mb2MsICI6Iik7CiAgIH0gZWxzZSB7CiAgICAgU291cmNlTG9jYXRpb24gRXhwZWN0ZWRMb2MgPSBQUC5nZXRMb2NGb3JFbmRPZlRva2VuKFByZXZUb2tMb2NhdGlvbik7Ci0gICAgRGlhZyhFeHBlY3RlZExvYywgZGlhZzo6ZXJyX2V4cGVjdGVkX2NvbG9uX2FmdGVyKSA8PCAiJ2RlZmF1bHQnIgotICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oRXhwZWN0ZWRMb2MsICI6Iik7CisgICAgRGlhZyhFeHBlY3RlZExvYywgZGlhZzo6ZXJyX2V4cGVjdGVkX2FmdGVyKQorICAgICAgICA8PCAiJ2RlZmF1bHQnIiA8PCB0b2s6OmNvbG9uCisgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKEV4cGVjdGVkTG9jLCAiOiIpOwogICAgIENvbG9uTG9jID0gRXhwZWN0ZWRMb2M7CiAgIH0KIApAQCAtODI2LDYgKzgyNSw5IEBACiAgICAgY2FzZSB0b2s6OmFubm90X3ByYWdtYV9mcF9jb250cmFjdDoKICAgICAgIEhhbmRsZVByYWdtYUZQQ29udHJhY3QoKTsKICAgICAgIGJyZWFrOworICAgIGNhc2UgdG9rOjphbm5vdF9wcmFnbWFfbXNfcG9pbnRlcnNfdG9fbWVtYmVyczoKKyAgICAgIEhhbmRsZVByYWdtYU1TUG9pbnRlcnNUb01lbWJlcnMoKTsKKyAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBjaGVja0ZvclByYWdtYXMgPSBmYWxzZTsKICAgICAgIGJyZWFrOwpAQCAtODY3LDcgKzg2OSw3IEBACiAgICAgU21hbGxWZWN0b3I8RGVjbCAqLCA4PiBEZWNsc0luR3JvdXA7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkgewotICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KTsKKyAgICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjppZGVudGlmaWVyOwogICAgICAgICBicmVhazsKICAgICAgIH0KIApAQCAtODc1LDkgKzg3Nyw4IEBACiAgICAgICBTb3VyY2VMb2NhdGlvbiBJZExvYyA9IENvbnN1bWVUb2tlbigpOwogICAgICAgRGVjbHNJbkdyb3VwLnB1c2hfYmFjayhBY3Rpb25zLkxvb2t1cE9yQ3JlYXRlTGFiZWwoSUksIElkTG9jLCBMYWJlbExvYykpOwogCi0gICAgICBpZiAoIVRvay5pcyh0b2s6OmNvbW1hKSkKKyAgICAgIGlmICghVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29tbWEpKQogICAgICAgICBicmVhazsKLSAgICAgIENvbnN1bWVUb2tlbigpOwogICAgIH0KIAogICAgIERlY2xTcGVjIERTKEF0dHJGYWN0b3J5KTsKQEAgLTg5MCw3ICs4OTEsNyBAQAogICAgICAgU3RtdHMucHVzaF9iYWNrKFIucmVsZWFzZSgpKTsKICAgfQogCi0gIHdoaWxlIChUb2suaXNOb3QodG9rOjpyX2JyYWNlKSAmJiBUb2suaXNOb3QodG9rOjplb2YpKSB7CisgIHdoaWxlIChUb2suaXNOb3QodG9rOjpyX2JyYWNlKSAmJiAhaXNFb2ZPckVvbSgpKSB7CiAgICAgaWYgKFRvay5pcyh0b2s6OmFubm90X3ByYWdtYV91bnVzZWQpKSB7CiAgICAgICBIYW5kbGVQcmFnbWFVbnVzZWQoKTsKICAgICAgIGNvbnRpbnVlOwpAQCAtMTA3Nyw4ICsxMDc4LDcgQEAKICAgLy8gICAgd291bGQgaGF2ZSB0byBub3RpZnkgUGFyc2VTdGF0ZW1lbnQgbm90IHRvIGNyZWF0ZSBhIG5ldyBzY29wZS4gSXQncwogICAvLyAgICBzaW1wbGVyIHRvIGxldCBpdCBjcmVhdGUgYSBuZXcgc2NvcGUuCiAgIC8vCi0gIFBhcnNlU2NvcGUgSW5uZXJTY29wZSh0aGlzLCBTY29wZTo6RGVjbFNjb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgQzk5b3JDWFggJiYgVG9rLmlzTm90KHRvazo6bF9icmFjZSkpOworICBQYXJzZVNjb3BlIElubmVyU2NvcGUodGhpcywgU2NvcGU6OkRlY2xTY29wZSwgQzk5b3JDWFgsIFRvay5pcyh0b2s6OmxfYnJhY2UpKTsKIAogICAvLyBSZWFkIHRoZSAndGhlbicgc3RtdC4KICAgU291cmNlTG9jYXRpb24gVGhlblN0bXRMb2MgPSBUb2suZ2V0TG9jYXRpb24oKTsKQEAgLTExMTAsOCArMTExMCw3IEBACiAgICAgLy8gVGhlIHN1YnN0YXRlbWVudCBpbiBhIHNlbGVjdGlvbi1zdGF0ZW1lbnQgKGVhY2ggc3Vic3RhdGVtZW50LCBpbiB0aGUgZWxzZQogICAgIC8vIGZvcm0gb2YgdGhlIGlmIHN0YXRlbWVudCkgaW1wbGljaXRseSBkZWZpbmVzIGEgbG9jYWwgc2NvcGUuCiAgICAgLy8KLSAgICBQYXJzZVNjb3BlIElubmVyU2NvcGUodGhpcywgU2NvcGU6OkRlY2xTY29wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQzk5b3JDWFggJiYgVG9rLmlzTm90KHRvazo6bF9icmFjZSkpOworICAgIFBhcnNlU2NvcGUgSW5uZXJTY29wZSh0aGlzLCBTY29wZTo6RGVjbFNjb3BlLCBDOTlvckNYWCwgVG9rLmlzKHRvazo6bF9icmFjZSkpOwogCiAgICAgRWxzZVN0bXQgPSBQYXJzZVN0YXRlbWVudCgpOwogCkBAIC0xMTc1LDcgKzExNzQsNyBAQAogICAvLyB3aGlsZSwgZm9yLCBhbmQgc3dpdGNoIHN0YXRlbWVudHMgYXJlIGxvY2FsIHRvIHRoZSBpZiwgd2hpbGUsIGZvciwgb3IKICAgLy8gc3dpdGNoIHN0YXRlbWVudCAoaW5jbHVkaW5nIHRoZSBjb250cm9sbGVkIHN0YXRlbWVudCkuCiAgIC8vCi0gIHVuc2lnbmVkIFNjb3BlRmxhZ3MgPSBTY29wZTo6QnJlYWtTY29wZSB8IFNjb3BlOjpTd2l0Y2hTY29wZTsKKyAgdW5zaWduZWQgU2NvcGVGbGFncyA9IFNjb3BlOjpTd2l0Y2hTY29wZTsKICAgaWYgKEM5OW9yQ1hYKQogICAgIFNjb3BlRmxhZ3MgfD0gU2NvcGU6OkRlY2xTY29wZSB8IFNjb3BlOjpDb250cm9sU2NvcGU7CiAgIFBhcnNlU2NvcGUgU3dpdGNoU2NvcGUodGhpcywgU2NvcGVGbGFncyk7CkBAIC0xMjEzLDggKzEyMTIsOCBAQAogICAvLyBTZWUgY29tbWVudHMgaW4gUGFyc2VJZlN0YXRlbWVudCBmb3Igd2h5IHdlIGNyZWF0ZSBhIHNjb3BlIGZvciB0aGUKICAgLy8gY29uZGl0aW9uIGFuZCBhIG5ldyBzY29wZSBmb3Igc3Vic3RhdGVtZW50IGluIEMrKy4KICAgLy8KLSAgUGFyc2VTY29wZSBJbm5lclNjb3BlKHRoaXMsIFNjb3BlOjpEZWNsU2NvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDOTlvckNYWCAmJiBUb2suaXNOb3QodG9rOjpsX2JyYWNlKSk7CisgIGdldEN1clNjb3BlKCktPkFkZEZsYWdzKFNjb3BlOjpCcmVha1Njb3BlKTsKKyAgUGFyc2VTY29wZSBJbm5lclNjb3BlKHRoaXMsIFNjb3BlOjpEZWNsU2NvcGUsIEM5OW9yQ1hYLCBUb2suaXModG9rOjpsX2JyYWNlKSk7CiAKICAgLy8gUmVhZCB0aGUgYm9keSBzdGF0ZW1lbnQuCiAgIFN0bXRSZXN1bHQgQm9keShQYXJzZVN0YXRlbWVudChUcmFpbGluZ0Vsc2VMb2MpKTsKQEAgLTEyODAsNyArMTI3OSw3IEBACiAKICAgRnVsbEV4cHJBcmcgRnVsbENvbmQoQWN0aW9ucy5NYWtlRnVsbEV4cHIoQ29uZC5nZXQoKSwgV2hpbGVMb2MpKTsKIAotICAvLyBDOTkgNi44LjVwNSAtIEluIEM5OSwgdGhlIGJvZHkgb2YgdGhlIGlmIHN0YXRlbWVudCBpcyBhIHNjb3BlLCBldmVuIGlmCisgIC8vIEM5OSA2LjguNXA1IC0gSW4gQzk5LCB0aGUgYm9keSBvZiB0aGUgd2hpbGUgc3RhdGVtZW50IGlzIGEgc2NvcGUsIGV2ZW4gaWYKICAgLy8gdGhlcmUgaXMgbm8gY29tcG91bmQgc3RtdC4gIEM5MCBkb2VzIG5vdCBoYXZlIHRoaXMgY2xhdXNlLiAgV2Ugb25seSBkbyB0aGlzCiAgIC8vIGlmIHRoZSBib2R5IGlzbid0IGEgY29tcG91bmQgc3RhdGVtZW50IHRvIGF2b2lkIHB1c2gvcG9wIGluIGNvbW1vbiBjYXNlcy4KICAgLy8KQEAgLTEyOTEsOCArMTI5MCw3IEBACiAgIC8vIFNlZSBjb21tZW50cyBpbiBQYXJzZUlmU3RhdGVtZW50IGZvciB3aHkgd2UgY3JlYXRlIGEgc2NvcGUgZm9yIHRoZQogICAvLyBjb25kaXRpb24gYW5kIGEgbmV3IHNjb3BlIGZvciBzdWJzdGF0ZW1lbnQgaW4gQysrLgogICAvLwotICBQYXJzZVNjb3BlIElubmVyU2NvcGUodGhpcywgU2NvcGU6OkRlY2xTY29wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEM5OW9yQ1hYICYmIFRvay5pc05vdCh0b2s6OmxfYnJhY2UpKTsKKyAgUGFyc2VTY29wZSBJbm5lclNjb3BlKHRoaXMsIFNjb3BlOjpEZWNsU2NvcGUsIEM5OW9yQ1hYLCBUb2suaXModG9rOjpsX2JyYWNlKSk7CiAKICAgLy8gUmVhZCB0aGUgYm9keSBzdGF0ZW1lbnQuCiAgIFN0bXRSZXN1bHQgQm9keShQYXJzZVN0YXRlbWVudChUcmFpbGluZ0Vsc2VMb2MpKTsKQEAgLTEzMjUsNyArMTMyMyw3IEBACiAKICAgUGFyc2VTY29wZSBEb1Njb3BlKHRoaXMsIFNjb3BlRmxhZ3MpOwogCi0gIC8vIEM5OSA2LjguNXA1IC0gSW4gQzk5LCB0aGUgYm9keSBvZiB0aGUgaWYgc3RhdGVtZW50IGlzIGEgc2NvcGUsIGV2ZW4gaWYKKyAgLy8gQzk5IDYuOC41cDUgLSBJbiBDOTksIHRoZSBib2R5IG9mIHRoZSBkbyBzdGF0ZW1lbnQgaXMgYSBzY29wZSwgZXZlbiBpZgogICAvLyB0aGVyZSBpcyBubyBjb21wb3VuZCBzdG10LiAgQzkwIGRvZXMgbm90IGhhdmUgdGhpcyBjbGF1c2UuIFdlIG9ubHkgZG8gdGhpcwogICAvLyBpZiB0aGUgYm9keSBpc24ndCBhIGNvbXBvdW5kIHN0YXRlbWVudCB0byBhdm9pZCBwdXNoL3BvcCBpbiBjb21tb24gY2FzZXMuCiAgIC8vCkBAIC0xMzMzLDkgKzEzMzEsOCBAQAogICAvLyBUaGUgc3Vic3RhdGVtZW50IGluIGFuIGl0ZXJhdGlvbi1zdGF0ZW1lbnQgaW1wbGljaXRseSBkZWZpbmVzIGEgbG9jYWwgc2NvcGUKICAgLy8gd2hpY2ggaXMgZW50ZXJlZCBhbmQgZXhpdGVkIGVhY2ggdGltZSB0aHJvdWdoIHRoZSBsb29wLgogICAvLwotICBQYXJzZVNjb3BlIElubmVyU2NvcGUodGhpcywgU2NvcGU6OkRlY2xTY29wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChnZXRMYW5nT3B0cygpLkM5OSB8fCBnZXRMYW5nT3B0cygpLkNQbHVzUGx1cykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvay5pc05vdCh0b2s6OmxfYnJhY2UpKTsKKyAgYm9vbCBDOTlvckNYWCA9IGdldExhbmdPcHRzKCkuQzk5IHx8IGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzOworICBQYXJzZVNjb3BlIElubmVyU2NvcGUodGhpcywgU2NvcGU6OkRlY2xTY29wZSwgQzk5b3JDWFgsIFRvay5pcyh0b2s6OmxfYnJhY2UpKTsKIAogICAvLyBSZWFkIHRoZSBib2R5IHN0YXRlbWVudC4KICAgU3RtdFJlc3VsdCBCb2R5KFBhcnNlU3RhdGVtZW50KCkpOwpAQCAtMTM0Niw3ICsxMzQzLDcgQEAKICAgaWYgKFRvay5pc05vdCh0b2s6Omt3X3doaWxlKSkgewogICAgIGlmICghQm9keS5pc0ludmFsaWQoKSkgewogICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF93aGlsZSk7Ci0gICAgICBEaWFnKERvTG9jLCBkaWFnOjpub3RlX21hdGNoaW5nKSA8PCAiZG8iOworICAgICAgRGlhZyhEb0xvYywgZGlhZzo6bm90ZV9tYXRjaGluZykgPDwgIidkbyciOwogICAgICAgU2tpcFVudGlsKHRvazo6c2VtaSwgU3RvcEJlZm9yZU1hdGNoKTsKICAgICB9CiAgICAgcmV0dXJuIFN0bXRFcnJvcigpOwpAQCAtMTQyNCwxMiArMTQyMSw5IEBACiAgIC8vIE5hbWVzIGRlY2xhcmVkIGluIHRoZSBmb3ItaW5pdC1zdGF0ZW1lbnQgYXJlIGluIHRoZSBzYW1lIGRlY2xhcmF0aXZlLXJlZ2lvbgogICAvLyBhcyB0aG9zZSBkZWNsYXJlZCBpbiB0aGUgY29uZGl0aW9uLgogICAvLwotICB1bnNpZ25lZCBTY29wZUZsYWdzOworICB1bnNpZ25lZCBTY29wZUZsYWdzID0gMDsKICAgaWYgKEM5OW9yQ1hYb3JPYmpDKQotICAgIFNjb3BlRmxhZ3MgPSBTY29wZTo6QnJlYWtTY29wZSB8IFNjb3BlOjpDb250aW51ZVNjb3BlIHwKLSAgICAgICAgICAgICAgICAgU2NvcGU6OkRlY2xTY29wZSAgfCBTY29wZTo6Q29udHJvbFNjb3BlOwotICBlbHNlCi0gICAgU2NvcGVGbGFncyA9IFNjb3BlOjpCcmVha1Njb3BlIHwgU2NvcGU6OkNvbnRpbnVlU2NvcGU7CisgICAgU2NvcGVGbGFncyA9IFNjb3BlOjpEZWNsU2NvcGUgfCBTY29wZTo6Q29udHJvbFNjb3BlOwogCiAgIFBhcnNlU2NvcGUgRm9yU2NvcGUodGhpcywgU2NvcGVGbGFncyk7CiAKQEAgLTE1NDQsNiArMTUzOCw5IEBACiAgICAgICB9CiAgICAgfQogICB9CisKKyAgLy8gUGFyc2UgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBmb3Igc3BlY2lmaWVyLgorICBnZXRDdXJTY29wZSgpLT5BZGRGbGFncyhTY29wZTo6QnJlYWtTY29wZSB8IFNjb3BlOjpDb250aW51ZVNjb3BlKTsKICAgaWYgKCFGb3JFYWNoICYmICFGb3JSYW5nZSkgewogICAgIGFzc2VydCghU2Vjb25kUGFydC5nZXQoKSAmJiAiU2hvdWxkbid0IGhhdmUgYSBzZWNvbmQgZXhwcmVzc2lvbiB5ZXQuIik7CiAgICAgLy8gUGFyc2UgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBmb3Igc3BlY2lmaWVyLgpAQCAtMTYxMSw3ICsxNjA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5nZXRDbG9zZUxvY2F0aW9uKCkpOwogICB9CiAKLSAgLy8gQzk5IDYuOC41cDUgLSBJbiBDOTksIHRoZSBib2R5IG9mIHRoZSBpZiBzdGF0ZW1lbnQgaXMgYSBzY29wZSwgZXZlbiBpZgorICAvLyBDOTkgNi44LjVwNSAtIEluIEM5OSwgdGhlIGJvZHkgb2YgdGhlIGZvciBzdGF0ZW1lbnQgaXMgYSBzY29wZSwgZXZlbiBpZgogICAvLyB0aGVyZSBpcyBubyBjb21wb3VuZCBzdG10LiAgQzkwIGRvZXMgbm90IGhhdmUgdGhpcyBjbGF1c2UuICBXZSBvbmx5IGRvIHRoaXMKICAgLy8gaWYgdGhlIGJvZHkgaXNuJ3QgYSBjb21wb3VuZCBzdGF0ZW1lbnQgdG8gYXZvaWQgcHVzaC9wb3AgaW4gY29tbW9uIGNhc2VzLgogICAvLwpAQCAtMTYyMiw4ICsxNjE5LDE1IEBACiAgIC8vIFNlZSBjb21tZW50cyBpbiBQYXJzZUlmU3RhdGVtZW50IGZvciB3aHkgd2UgY3JlYXRlIGEgc2NvcGUgZm9yCiAgIC8vIGZvci1pbml0LXN0YXRlbWVudC9jb25kaXRpb24gYW5kIGEgbmV3IHNjb3BlIGZvciBzdWJzdGF0ZW1lbnQgaW4gQysrLgogICAvLwotICBQYXJzZVNjb3BlIElubmVyU2NvcGUodGhpcywgU2NvcGU6OkRlY2xTY29wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEM5OW9yQ1hYb3JPYmpDICYmIFRvay5pc05vdCh0b2s6OmxfYnJhY2UpKTsKKyAgUGFyc2VTY29wZSBJbm5lclNjb3BlKHRoaXMsIFNjb3BlOjpEZWNsU2NvcGUsIEM5OW9yQ1hYb3JPYmpDLAorICAgICAgICAgICAgICAgICAgICAgICAgVG9rLmlzKHRvazo6bF9icmFjZSkpOworCisgIC8vIFRoZSBib2R5IG9mIHRoZSBmb3IgbG9vcCBoYXMgdGhlIHNhbWUgbG9jYWwgbWFuZ2xpbmcgbnVtYmVyIGFzIHRoZQorICAvLyBmb3ItaW5pdC1zdGF0ZW1lbnQuCisgIC8vIEl0IHdpbGwgb25seSBiZSBpbmNyZW1lbnRlZCBpZiB0aGUgYm9keSBjb250YWlucyBvdGhlciB0aGluZ3MgdGhhdCB3b3VsZAorICAvLyBub3JtYWxseSBpbmNyZW1lbnQgdGhlIG1hbmdsaW5nIG51bWJlciAobGlrZSBhIGNvbXBvdW5kIHN0YXRlbWVudCkuCisgIGlmIChDOTlvckNYWG9yT2JqQykKKyAgICBnZXRDdXJTY29wZSgpLT5kZWNyZW1lbnRNU0xvY2FsTWFuZ2xpbmdOdW1iZXIoKTsKIAogICAvLyBSZWFkIHRoZSBib2R5IHN0YXRlbWVudC4KICAgU3RtdFJlc3VsdCBCb2R5KFBhcnNlU3RhdGVtZW50KFRyYWlsaW5nRWxzZUxvYykpOwpAQCAtMTY3Nyw3ICsxNjgxLDcgQEAKICAgICB9CiAgICAgUmVzID0gQWN0aW9ucy5BY3RPbkluZGlyZWN0R290b1N0bXQoR290b0xvYywgU3RhckxvYywgUi50YWtlKCkpOwogICB9IGVsc2UgewotICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfaWRlbnQpOworICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6aWRlbnRpZmllcjsKICAgICByZXR1cm4gU3RtdEVycm9yKCk7CiAgIH0KIApAQCAtMTczMCw4ICsxNzM0LDggQEAKICAgICAgICAgICA8PCBSLmdldCgpLT5nZXRTb3VyY2VSYW5nZSgpOwogICAgIH0gZWxzZQogICAgICAgICBSID0gUGFyc2VFeHByZXNzaW9uKCk7Ci0gICAgaWYgKFIuaXNJbnZhbGlkKCkpIHsgIC8vIFNraXAgdG8gdGhlIHNlbWljb2xvbiwgYnV0IGRvbid0IGNvbnN1bWUgaXQuCi0gICAgICBTa2lwVW50aWwodG9rOjpzZW1pLCBTdG9wQmVmb3JlTWF0Y2gpOworICAgIGlmIChSLmlzSW52YWxpZCgpKSB7CisgICAgICBTa2lwVW50aWwodG9rOjpyX2JyYWNlLCBTdG9wQXRTZW1pIHwgU3RvcEJlZm9yZU1hdGNoKTsKICAgICAgIHJldHVybiBTdG10RXJyb3IoKTsKICAgICB9CiAgIH0KQEAgLTE3NjIsNyArMTc2Niw3IEBACiAKICAgICB2b2lkICpMb29rdXBJbmxpbmVBc21JZGVudGlmaWVyKFN0cmluZ1JlZiAmTGluZUJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElubGluZUFzbUlkZW50aWZpZXJJbmZvICZJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1VuZXZhbHVhdGVkQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1VuZXZhbHVhdGVkQ29udGV4dCkgb3ZlcnJpZGUgewogICAgICAgLy8gQ29sbGVjdCB0aGUgZGVzaXJlZCB0b2tlbnMuCiAgICAgICBTbWFsbFZlY3RvcjxUb2tlbiwgMTY+IExpbmVUb2tzOwogICAgICAgY29uc3QgVG9rZW4gKkZpcnN0T3JpZ1Rva2VuID0gMDsKQEAgLTE4MDIsNyArMTgwNiw3IEBACiAgICAgfQogCiAgICAgYm9vbCBMb29rdXBJbmxpbmVBc21GaWVsZChTdHJpbmdSZWYgQmFzZSwgU3RyaW5nUmVmIE1lbWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZPZmZzZXQpIG92ZXJyaWRlIHsKICAgICAgIHJldHVybiBUaGVQYXJzZXIuZ2V0QWN0aW9ucygpLkxvb2t1cElubGluZUFzbUZpZWxkKEJhc2UsIE1lbWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCwgQXNtTG9jKTsKICAgICB9CkBAIC0xOTIwLDMwICsxOTI0LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUtXTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQpOwogCi0gIC8vIElmIHdlJ3ZlIHJ1biBpbnRvIHRoZSBwb2lzb24gdG9rZW4gd2UgaW5zZXJ0ZWQgYmVmb3JlLCBvciB0aGVyZQotICAvLyB3YXMgYSBwYXJzaW5nIGVycm9yLCB0aGVuIGNsYWltIHRoZSBlbnRpcmUgbGluZS4KLSAgaWYgKEludmFsaWQgfHwgVG9rLmlzKEVuZE9mU3RyZWFtKSkgewotICAgIE51bUxpbmVUb2tzQ29uc3VtZWQgPSBMaW5lVG9rcy5zaXplKCkgLSAyOwotCi0gICAgLy8gT3RoZXJ3aXNlLCBjbGFpbSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgdG9rZW4uCisgIC8vIEZpZ3VyZSBvdXQgaG93IG1hbnkgdG9rZW5zIHdlIGFyZSBpbnRvIExpbmVUb2tzLgorICB1bnNpZ25lZCBMaW5lSW5kZXggPSAwOworICBpZiAoVG9rLmlzKEVuZE9mU3RyZWFtKSkgeworICAgIExpbmVJbmRleCA9IExpbmVUb2tzLnNpemUoKSAtIDI7CiAgIH0gZWxzZSB7Ci0gICAgLy8gRmlndXJlIG91dCBob3cgbWFueSB0b2tlbnMgd2UgYXJlIGludG8gTGluZVRva3MuCi0gICAgdW5zaWduZWQgTGluZUluZGV4ID0gMDsKICAgICB3aGlsZSAoTGluZVRva3NbTGluZUluZGV4XS5nZXRMb2NhdGlvbigpICE9IFRvay5nZXRMb2NhdGlvbigpKSB7CiAgICAgICBMaW5lSW5kZXgrKzsKICAgICAgIGFzc2VydChMaW5lSW5kZXggPCBMaW5lVG9rcy5zaXplKCkgLSAyKTsgLy8gd2UgYWRkZWQgdHdvIGV4dHJhIHRva2VucwogICAgIH0KKyAgfQogCisgIC8vIElmIHdlJ3ZlIHJ1biBpbnRvIHRoZSBwb2lzb24gdG9rZW4gd2UgaW5zZXJ0ZWQgYmVmb3JlLCBvciB0aGVyZQorICAvLyB3YXMgYSBwYXJzaW5nIGVycm9yLCB0aGVuIGNsYWltIHRoZSBlbnRpcmUgbGluZS4KKyAgaWYgKEludmFsaWQgfHwgVG9rLmlzKEVuZE9mU3RyZWFtKSkgeworICAgIE51bUxpbmVUb2tzQ29uc3VtZWQgPSBMaW5lVG9rcy5zaXplKCkgLSAyOworICB9IGVsc2UgeworICAgIC8vIE90aGVyd2lzZSwgY2xhaW0gdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHRva2VuLgogICAgIE51bUxpbmVUb2tzQ29uc3VtZWQgPSBMaW5lSW5kZXg7CiAgIH0KLSAgICAgIAotICAvLyBGaW5hbGx5LCByZXN0b3JlIHRoZSBvbGQgcGFyc2luZyBzdGF0ZSBieSBjb25zdW1pbmcgYWxsIHRoZQotICAvLyB0b2tlbnMgd2Ugc3RhZ2VkIGJlZm9yZSwgaW1wbGljaXRseSBraWxsaW5nIG9mZiB0aGUKLSAgLy8gdG9rZW4tbGV4ZXIgd2UgcHVzaGVkLgotICBmb3IgKHVuc2lnbmVkIG4gPSBMaW5lVG9rcy5zaXplKCkgLSAyIC0gTnVtTGluZVRva3NDb25zdW1lZDsgbiAhPSAwOyAtLW4pIHsKKworICAvLyBGaW5hbGx5LCByZXN0b3JlIHRoZSBvbGQgcGFyc2luZyBzdGF0ZSBieSBjb25zdW1pbmcgYWxsIHRoZSB0b2tlbnMgd2UKKyAgLy8gc3RhZ2VkIGJlZm9yZSwgaW1wbGljaXRseSBraWxsaW5nIG9mZiB0aGUgdG9rZW4tbGV4ZXIgd2UgcHVzaGVkLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTGluZVRva3Muc2l6ZSgpIC0gTGluZUluZGV4IC0gMjsgaSAhPSBlOyArK2kpIHsKICAgICBDb25zdW1lQW55VG9rZW4oKTsKICAgfQotICBDb25zdW1lVG9rZW4oRW5kT2ZTdHJlYW0pOworICBhc3NlcnQoVG9rLmlzKEVuZE9mU3RyZWFtKSk7CisgIENvbnN1bWVUb2tlbigpOwogCiAgIC8vIExlYXZlIExpbmVUb2tzIGluIGl0cyBvcmlnaW5hbCBzdGF0ZS4KICAgTGluZVRva3MucG9wX2JhY2soKTsKQEAgLTIwNTgsNyArMjA2NSw3IEBACiAgIFNvdXJjZUxvY2F0aW9uIFRva0xvYyA9IFRvay5nZXRMb2NhdGlvbigpOwogICBkbyB7CiAgICAgLy8gSWYgd2UgaGl0IEVPRiwgd2UncmUgZG9uZSwgcGVyaW9kLgotICAgIGlmIChUb2suaXModG9rOjplb2YpKQorICAgIGlmIChpc0VvZk9yRW9tKCkpCiAgICAgICBicmVhazsKIAogICAgIGlmICghSW5Bc21Db21tZW50ICYmIFRvay5pcyh0b2s6OnNlbWkpKSB7CkBAIC0yMTEyLDEyICsyMTE5LDEyIEBACiAKICAgaWYgKEluQnJhY2VzICYmIEJyYWNlQ291bnQgIT0gc2F2ZWRCcmFjZUNvdW50KSB7CiAgICAgLy8gX19hc20gd2l0aG91dCBjbG9zaW5nIGJyYWNlICh0aGlzIGNhbiBoYXBwZW4gYXQgRU9GKS4KLSAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX3JicmFjZSk7Ci0gICAgRGlhZyhMQnJhY2VMb2MsIGRpYWc6Om5vdGVfbWF0Y2hpbmcpIDw8ICJ7IjsKKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OnJfYnJhY2U7CisgICAgRGlhZyhMQnJhY2VMb2MsIGRpYWc6Om5vdGVfbWF0Y2hpbmcpIDw8IHRvazo6bF9icmFjZTsKICAgICByZXR1cm4gU3RtdEVycm9yKCk7CiAgIH0gZWxzZSBpZiAoTnVtVG9rZW5zUmVhZCA9PSAwKSB7CiAgICAgLy8gRW1wdHkgX19hc20uCi0gICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9sYnJhY2UpOworICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6bF9icmFjZTsKICAgICByZXR1cm4gU3RtdEVycm9yKCk7CiAgIH0KIApAQCAtMjEyNyw3ICsyMTM0LDcgQEAKICAgU21hbGxWZWN0b3I8U3RyaW5nUmVmLCA0PiBDbG9iYmVyUmVmczsKIAogICAvLyBXZSBuZWVkIGFuIGFjdHVhbCBzdXBwb3J0ZWQgdGFyZ2V0LgotICBsbHZtOjpUcmlwbGUgVGhlVHJpcGxlID0gQWN0aW9ucy5Db250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRUcmlwbGUoKTsKKyAgY29uc3QgbGx2bTo6VHJpcGxlICZUaGVUcmlwbGUgPSBBY3Rpb25zLkNvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldFRyaXBsZSgpOwogICBsbHZtOjpUcmlwbGU6OkFyY2hUeXBlIEFyY2hUeSA9IFRoZVRyaXBsZS5nZXRBcmNoKCk7CiAgIGNvbnN0IHN0ZDo6c3RyaW5nICZUVCA9IFRoZVRyaXBsZS5nZXRUcmlwbGUoKTsKICAgY29uc3QgbGx2bTo6VGFyZ2V0ICpUaGVUYXJnZXQgPSAwOwpAQCAtMjE1NiwxMyArMjE2MywxMyBAQAogICBpZiAoYnVpbGRNU0FzbVN0cmluZyhQUCwgQXNtTG9jLCBBc21Ub2tzLCBUb2tPZmZzZXRzLCBBc21TdHJpbmcpKQogICAgIHJldHVybiBTdG10RXJyb3IoKTsKIAotICBPd25pbmdQdHI8bGx2bTo6TUNSZWdpc3RlckluZm8+IE1SSShUaGVUYXJnZXQtPmNyZWF0ZU1DUmVnSW5mbyhUVCkpOwotICBPd25pbmdQdHI8bGx2bTo6TUNBc21JbmZvPiBNQUkoVGhlVGFyZ2V0LT5jcmVhdGVNQ0FzbUluZm8oKk1SSSwgVFQpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1DUmVnaXN0ZXJJbmZvPiBNUkkoVGhlVGFyZ2V0LT5jcmVhdGVNQ1JlZ0luZm8oVFQpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1DQXNtSW5mbz4gTUFJKFRoZVRhcmdldC0+Y3JlYXRlTUNBc21JbmZvKCpNUkksIFRUKSk7CiAgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24gZGVzY3JpcHRvci4KLSAgY29uc3QgbGx2bTo6TUNJbnN0ckluZm8gKk1JSSA9IFRoZVRhcmdldC0+Y3JlYXRlTUNJbnN0ckluZm8oKTsgCi0gIE93bmluZ1B0cjxsbHZtOjpNQ09iamVjdEZpbGVJbmZvPiBNT0ZJKG5ldyBsbHZtOjpNQ09iamVjdEZpbGVJbmZvKCkpOwotICBPd25pbmdQdHI8bGx2bTo6TUNTdWJ0YXJnZXRJbmZvPgotICAgIFNUSShUaGVUYXJnZXQtPmNyZWF0ZU1DU3VidGFyZ2V0SW5mbyhUVCwgIiIsICIiKSk7CisgIGNvbnN0IGxsdm06Ok1DSW5zdHJJbmZvICpNSUkgPSBUaGVUYXJnZXQtPmNyZWF0ZU1DSW5zdHJJbmZvKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNQ09iamVjdEZpbGVJbmZvPiBNT0ZJKG5ldyBsbHZtOjpNQ09iamVjdEZpbGVJbmZvKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TUNTdWJ0YXJnZXRJbmZvPiBTVEkoCisgICAgICBUaGVUYXJnZXQtPmNyZWF0ZU1DU3VidGFyZ2V0SW5mbyhUVCwgIiIsICIiKSk7CiAKICAgbGx2bTo6U291cmNlTWdyIFRlbXBTcmNNZ3I7CiAgIGxsdm06Ok1DQ29udGV4dCBDdHgoTUFJLmdldCgpLCBNUkkuZ2V0KCksIE1PRkkuZ2V0KCksICZUZW1wU3JjTWdyKTsKQEAgLTIxNzIsMTEgKzIxNzksMTEgQEAKICAgLy8gVGVsbCBTcmNNZ3IgYWJvdXQgdGhpcyBidWZmZXIsIHdoaWNoIGlzIHdoYXQgdGhlIHBhcnNlciB3aWxsIHBpY2sgdXAuCiAgIFRlbXBTcmNNZ3IuQWRkTmV3U291cmNlQnVmZmVyKEJ1ZmZlciwgbGx2bTo6U01Mb2MoKSk7CiAKLSAgT3duaW5nUHRyPGxsdm06Ok1DU3RyZWFtZXI+IFN0cihjcmVhdGVOdWxsU3RyZWFtZXIoQ3R4KSk7Ci0gIE93bmluZ1B0cjxsbHZtOjpNQ0FzbVBhcnNlcj4KLSAgICBQYXJzZXIoY3JlYXRlTUNBc21QYXJzZXIoVGVtcFNyY01nciwgQ3R4LCAqU3RyLmdldCgpLCAqTUFJKSk7Ci0gIE93bmluZ1B0cjxsbHZtOjpNQ1RhcmdldEFzbVBhcnNlcj4KLSAgICBUYXJnZXRQYXJzZXIoVGhlVGFyZ2V0LT5jcmVhdGVNQ0FzbVBhcnNlcigqU1RJLCAqUGFyc2VyLCAqTUlJKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpNQ1N0cmVhbWVyPiBTdHIoY3JlYXRlTnVsbFN0cmVhbWVyKEN0eCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TUNBc21QYXJzZXI+IFBhcnNlcigKKyAgICAgIGNyZWF0ZU1DQXNtUGFyc2VyKFRlbXBTcmNNZ3IsIEN0eCwgKlN0ci5nZXQoKSwgKk1BSSkpOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TUNUYXJnZXRBc21QYXJzZXI+IFRhcmdldFBhcnNlcigKKyAgICAgIFRoZVRhcmdldC0+Y3JlYXRlTUNBc21QYXJzZXIoKlNUSSwgKlBhcnNlciwgKk1JSSkpOwogCiAgIGxsdm06Ok1DSW5zdFByaW50ZXIgKklQID0KICAgICBUaGVUYXJnZXQtPmNyZWF0ZU1DSW5zdFByaW50ZXIoMSwgKk1BSSwgKk1JSSwgKk1SSSwgKlNUSSk7CkBAIC0yMjA0LDYgKzIyMTEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9iYmVycywgTUlJLCBJUCwgQ2FsbGJhY2spKQogICAgIHJldHVybiBTdG10RXJyb3IoKTsKIAorICAvLyBGaWx0ZXIgb3V0ICJmcHN3Ii4gIENsYW5nIGRvZXNuJ3QgYWNjZXB0IGl0LCBhbmQgaXQgYWx3YXlzIGxpc3RzIGZsYWdzIGFuZAorICAvLyBmcHNyIGFzIGNsb2JiZXJzLgorICBhdXRvIEVuZCA9IHN0ZDo6cmVtb3ZlKENsb2JiZXJzLmJlZ2luKCksIENsb2JiZXJzLmVuZCgpLCAiZnBzdyIpOworICBDbG9iYmVycy5lcmFzZShFbmQsIENsb2JiZXJzLmVuZCgpKTsKKwogICAvLyBCdWlsZCB0aGUgdmVjdG9yIG9mIGNsb2JiZXIgU3RyaW5nUmVmcy4KICAgdW5zaWduZWQgTnVtQ2xvYmJlcnMgPSBDbG9iYmVycy5zaXplKCk7CiAgIENsb2JiZXJSZWZzLnJlc2l6ZShOdW1DbG9iYmVycyk7CkBAIC0yMzU3LDggKzIzNjksOCBAQAogCiAgICAgICAgIENsb2JiZXJzLnB1c2hfYmFjayhDbG9iYmVyLnJlbGVhc2UoKSk7CiAKLSAgICAgICAgaWYgKFRvay5pc05vdCh0b2s6OmNvbW1hKSkgYnJlYWs7Ci0gICAgICAgIENvbnN1bWVUb2tlbigpOworICAgICAgICBpZiAoIVRyeUNvbnN1bWVUb2tlbih0b2s6OmNvbW1hKSkKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTIzOTcsNyArMjQwOSw3IEBACiAgICAgICBULmNvbnN1bWVPcGVuKCk7CiAKICAgICAgIGlmIChUb2suaXNOb3QodG9rOjppZGVudGlmaWVyKSkgewotICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KTsKKyAgICAgICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjppZGVudGlmaWVyOwogICAgICAgICBTa2lwVW50aWwodG9rOjpyX3BhcmVuLCBTdG9wQXRTZW1pKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CkBAIC0yNDM0LDggKzI0NDYsOCBAQAogICAgIH0KICAgICBFeHBycy5wdXNoX2JhY2soUmVzLnJlbGVhc2UoKSk7CiAgICAgLy8gRWF0IHRoZSBjb21tYSBhbmQgY29udGludWUgcGFyc2luZyBpZiBpdCBleGlzdHMuCi0gICAgaWYgKFRvay5pc05vdCh0b2s6OmNvbW1hKSkgcmV0dXJuIGZhbHNlOwotICAgIENvbnN1bWVUb2tlbigpOworICAgIGlmICghVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29tbWEpKQorICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiB9CiAKQEAgLTI1NTQsMTEgKzI1NjYsMTEgQEAKIC8vLwogLy8vICAgICAgIFtCb3JsYW5kXSB0cnktYmxvY2s6CiAvLy8gICAgICAgICAndHJ5JyBjb21wb3VuZC1zdGF0ZW1lbnQgc2VoLWV4Y2VwdC1ibG9jawotLy8vICAgICAgICAgJ3RyeScgY29tcG91bmQtc3RhdG1lbnQgIHNlaC1maW5hbGx5LWJsb2NrCisvLy8gICAgICAgICAndHJ5JyBjb21wb3VuZC1zdGF0ZW1lbnQgc2VoLWZpbmFsbHktYmxvY2sKIC8vLwogU3RtdFJlc3VsdCBQYXJzZXI6OlBhcnNlQ1hYVHJ5QmxvY2tDb21tb24oU291cmNlTG9jYXRpb24gVHJ5TG9jLCBib29sIEZuVHJ5KSB7CiAgIGlmIChUb2suaXNOb3QodG9rOjpsX2JyYWNlKSkKLSAgICByZXR1cm4gU3RtdEVycm9yKERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfbGJyYWNlKSk7CisgICAgcmV0dXJuIFN0bXRFcnJvcihEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfYnJhY2UpOwogICAvLyBGSVhNRTogUG9zc2libGUgZHJhZnQgc3RhbmRhcmQgYnVnOiBhdHRyaWJ1dGUtc3BlY2lmaWVyIHNob3VsZCBiZSBhbGxvd2VkPwogCiAgIFN0bXRSZXN1bHQgVHJ5QmxvY2soUGFyc2VDb21wb3VuZFN0YXRlbWVudCgvKmlzU3RtdEV4cHI9Ki9mYWxzZSwKQEAgLTI2MjksNyArMjY0MSw3IEBACiAgIFNvdXJjZUxvY2F0aW9uIENhdGNoTG9jID0gQ29uc3VtZVRva2VuKCk7CiAKICAgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyIFQoKnRoaXMsIHRvazo6bF9wYXJlbik7Ci0gIGlmIChULmV4cGVjdEFuZENvbnN1bWUoZGlhZzo6ZXJyX2V4cGVjdGVkX2xwYXJlbikpCisgIGlmIChULmV4cGVjdEFuZENvbnN1bWUoKSkKICAgICByZXR1cm4gU3RtdEVycm9yKCk7CiAKICAgLy8gQysrIDMuMy4ycDM6CkBAIC0yNjYyLDcgKzI2NzQsNyBAQAogICAgIHJldHVybiBTdG10RXJyb3IoKTsKIAogICBpZiAoVG9rLmlzTm90KHRvazo6bF9icmFjZSkpCi0gICAgcmV0dXJuIFN0bXRFcnJvcihEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2xicmFjZSkpOworICAgIHJldHVybiBTdG10RXJyb3IoRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjpsX2JyYWNlKTsKIAogICAvLyBGSVhNRTogUG9zc2libGUgZHJhZnQgc3RhbmRhcmQgYnVnOiBhdHRyaWJ1dGUtc3BlY2lmaWVyIHNob3VsZCBiZSBhbGxvd2VkPwogICBTdG10UmVzdWx0IEJsb2NrKFBhcnNlQ29tcG91bmRTdGF0ZW1lbnQoKSk7CkBAIC0yNjgzLDcgKzI2OTUsNyBAQAogICAvLyBpbnNpZGUgdGhlc2UgYnJhY2VzIGVzY2FwaW5nIHRvIHRoZSBzdXJyb3VuZGluZyBjb2RlLgogICBpZiAoUmVzdWx0LkJlaGF2aW9yID09IElFQl9EZXBlbmRlbnQpIHsKICAgICBpZiAoIVRvay5pcyh0b2s6OmxfYnJhY2UpKSB7Ci0gICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkX2xicmFjZSk7CisgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfYnJhY2U7CiAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yNzAzLDcgKzI3MTUsNyBAQAogCiAgIEJhbGFuY2VkRGVsaW1pdGVyVHJhY2tlciBCcmFjZXMoKnRoaXMsIHRvazo6bF9icmFjZSk7CiAgIGlmIChCcmFjZXMuY29uc3VtZU9wZW4oKSkgewotICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWRfbGJyYWNlKTsKKyAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmxfYnJhY2U7CiAgICAgcmV0dXJuOwogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZVRlbXBsYXRlLmNwcCBiL2xpYi9QYXJzZS9QYXJzZVRlbXBsYXRlLmNwcAppbmRleCAwNzZlZGI5Li43NzdmZDAxIDEwMDY0NAotLS0gYS9saWIvUGFyc2UvUGFyc2VUZW1wbGF0ZS5jcHAKKysrIGIvbGliL1BhcnNlL1BhcnNlVGVtcGxhdGUuY3BwCkBAIC0xMDEsMTUgKzEwMSwxMSBAQAogICBkbyB7CiAgICAgLy8gQ29uc3VtZSB0aGUgJ2V4cG9ydCcsIGlmIGFueS4KICAgICBTb3VyY2VMb2NhdGlvbiBFeHBvcnRMb2M7Ci0gICAgaWYgKFRvay5pcyh0b2s6Omt3X2V4cG9ydCkpIHsKLSAgICAgIEV4cG9ydExvYyA9IENvbnN1bWVUb2tlbigpOwotICAgIH0KKyAgICBUcnlDb25zdW1lVG9rZW4odG9rOjprd19leHBvcnQsIEV4cG9ydExvYyk7CiAKICAgICAvLyBDb25zdW1lIHRoZSAndGVtcGxhdGUnLCB3aGljaCBzaG91bGQgYmUgaGVyZS4KICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUxvYzsKLSAgICBpZiAoVG9rLmlzKHRvazo6a3dfdGVtcGxhdGUpKSB7Ci0gICAgICBUZW1wbGF0ZUxvYyA9IENvbnN1bWVUb2tlbigpOwotICAgIH0gZWxzZSB7CisgICAgaWYgKCFUcnlDb25zdW1lVG9rZW4odG9rOjprd190ZW1wbGF0ZSwgVGVtcGxhdGVMb2MpKSB7CiAgICAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWRfdGVtcGxhdGUpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTIxLDggKzExNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1zLCBMQW5nbGVMb2MsIFJBbmdsZUxvYykpIHsKICAgICAgIC8vIFNraXAgdW50aWwgdGhlIHNlbWktY29sb24gb3IgYSB9LgogICAgICAgU2tpcFVudGlsKHRvazo6cl9icmFjZSwgU3RvcEF0U2VtaSB8IFN0b3BCZWZvcmVNYXRjaCk7Ci0gICAgICBpZiAoVG9rLmlzKHRvazo6c2VtaSkpCi0gICAgICAgIENvbnN1bWVUb2tlbigpOworICAgICAgVHJ5Q29uc3VtZVRva2VuKHRvazo6c2VtaSk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTMwMiwxMSArMjk3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gJkxBbmdsZUxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiAmUkFuZ2xlTG9jKSB7CiAgIC8vIEdldCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3QuCi0gIGlmICghVG9rLmlzKHRvazo6bGVzcykpIHsKKyAgaWYgKCFUcnlDb25zdW1lVG9rZW4odG9rOjpsZXNzLCBMQW5nbGVMb2MpKSB7CiAgICAgRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2xlc3NfYWZ0ZXIpIDw8ICJ0ZW1wbGF0ZSI7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KLSAgTEFuZ2xlTG9jID0gQ29uc3VtZVRva2VuKCk7CiAKICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdC4KICAgYm9vbCBGYWlsZWQgPSBmYWxzZTsKQEAgLTMyMiwxMCArMzE2LDggQEAKICAgICBUb2suc2V0S2luZCh0b2s6OmdyZWF0ZXIpOwogICAgIFJBbmdsZUxvYyA9IFRvay5nZXRMb2NhdGlvbigpOwogICAgIFRvay5zZXRMb2NhdGlvbihUb2suZ2V0TG9jYXRpb24oKS5nZXRMb2NXaXRoT2Zmc2V0KDEpKTsKLSAgfSBlbHNlIGlmIChUb2suaXModG9rOjpncmVhdGVyKSkKLSAgICBSQW5nbGVMb2MgPSBDb25zdW1lVG9rZW4oKTsKLSAgZWxzZSBpZiAoRmFpbGVkKSB7Ci0gICAgRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2dyZWF0ZXIpOworICB9IGVsc2UgaWYgKCFUcnlDb25zdW1lVG9rZW4odG9rOjpncmVhdGVyLCBSQW5nbGVMb2MpICYmIEZhaWxlZCkgeworICAgIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZCkgPDwgdG9rOjpncmVhdGVyOwogICAgIHJldHVybiB0cnVlOwogICB9CiAgIHJldHVybiBmYWxzZTsKQEAgLTQ4MywxMCArNDc1LDggQEAKICAgLy8gR3JhYiB0aGUgZWxsaXBzaXMgKGlmIGdpdmVuKS4KICAgYm9vbCBFbGxpcHNpcyA9IGZhbHNlOwogICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYzsKLSAgaWYgKFRvay5pcyh0b2s6OmVsbGlwc2lzKSkgeworICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6ZWxsaXBzaXMsIEVsbGlwc2lzTG9jKSkgewogICAgIEVsbGlwc2lzID0gdHJ1ZTsKLSAgICBFbGxpcHNpc0xvYyA9IENvbnN1bWVUb2tlbigpOwotCiAgICAgRGlhZyhFbGxpcHNpc0xvYywKICAgICAgICAgIGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEKICAgICAgICAgICAgPyBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF92YXJpYWRpY190ZW1wbGF0ZXMKQEAgLTUwNCw3ICs0OTQsNyBAQAogICAgIC8vIFVubmFtZWQgdGVtcGxhdGUgcGFyYW1ldGVyLiBEb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmUsIGp1c3QKICAgICAvLyBkb24ndCBjb25zdW1lIHRoaXMgdG9rZW4uCiAgIH0gZWxzZSB7Ci0gICAgRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2lkZW50KTsKKyAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6aWRlbnRpZmllcjsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC01MTMsMTEgKzUwMyw5IEBACiAgIC8vIHdlIGludHJvZHVjZSB0aGUgdHlwZSBwYXJhbWV0ZXIgaW50byB0aGUgbG9jYWwgc2NvcGUuCiAgIFNvdXJjZUxvY2F0aW9uIEVxdWFsTG9jOwogICBQYXJzZWRUeXBlIERlZmF1bHRBcmc7Ci0gIGlmIChUb2suaXModG9rOjplcXVhbCkpIHsKLSAgICBFcXVhbExvYyA9IENvbnN1bWVUb2tlbigpOworICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6ZXF1YWwsIEVxdWFsTG9jKSkKICAgICBEZWZhdWx0QXJnID0gUGFyc2VUeXBlTmFtZSgvKlJhbmdlPSovMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdG9yOjpUZW1wbGF0ZVR5cGVBcmdDb250ZXh0KS5nZXQoKTsKLSAgfQogCiAgIHJldHVybiBBY3Rpb25zLkFjdE9uVHlwZVBhcmFtZXRlcihnZXRDdXJTY29wZSgpLCBUeXBlbmFtZUtleXdvcmQsIEVsbGlwc2lzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsbGlwc2lzTG9jLCBLZXlMb2MsIFBhcmFtTmFtZSwgTmFtZUxvYywKQEAgLTU1Miw3ICs1NDAsNyBAQAogICAvLyBpZGVudGlmaWVyLCBjb21tYSwgb3IgZ3JlYXRlci4gUHJvdmlkZSBhIGZpeGl0IGlmIHRoZSBpZGVudGlmaWVyLCBjb21tYSwKICAgLy8gb3IgZ3JlYXRlciBhcHBlYXIgaW1tZWRpYXRlbHkgb3IgYWZ0ZXIgJ3R5cGVuYW1lJyBvciAnc3RydWN0Jy4gSW4gdGhlCiAgIC8vIGxhdHRlciBjYXNlLCByZXBsYWNlIHRoZSBrZXl3b3JkIHdpdGggJ2NsYXNzJy4KLSAgaWYgKCFUb2suaXModG9rOjprd19jbGFzcykpIHsKKyAgaWYgKCFUcnlDb25zdW1lVG9rZW4odG9rOjprd19jbGFzcykpIHsKICAgICBib29sIFJlcGxhY2UgPSBUb2suaXModG9rOjprd190eXBlbmFtZSkgfHwgVG9rLmlzKHRvazo6a3dfc3RydWN0KTsKICAgICBjb25zdCBUb2tlbiYgTmV4dCA9IFJlcGxhY2UgPyBOZXh0VG9rZW4oKSA6IFRvazsKICAgICBpZiAoTmV4dC5pcyh0b2s6OmlkZW50aWZpZXIpIHx8IE5leHQuaXModG9rOjpjb21tYSkgfHwKQEAgLTU2NiwxOSArNTU0LDE1IEBACiAKICAgICBpZiAoUmVwbGFjZSkKICAgICAgIENvbnN1bWVUb2tlbigpOwotICB9IGVsc2UKLSAgICBDb25zdW1lVG9rZW4oKTsKKyAgfQogCiAgIC8vIFBhcnNlIHRoZSBlbGxpcHNpcywgaWYgZ2l2ZW4uCiAgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOwotICBpZiAoVG9rLmlzKHRvazo6ZWxsaXBzaXMpKSB7Ci0gICAgRWxsaXBzaXNMb2MgPSBDb25zdW1lVG9rZW4oKTsKLSAgICAKKyAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OmVsbGlwc2lzLCBFbGxpcHNpc0xvYykpCiAgICAgRGlhZyhFbGxpcHNpc0xvYywKICAgICAgICAgIGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEKICAgICAgICAgICAgPyBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF92YXJpYWRpY190ZW1wbGF0ZXMKICAgICAgICAgICAgOiBkaWFnOjpleHRfdmFyaWFkaWNfdGVtcGxhdGVzKTsKLSAgfQogICAgICAgCiAgIC8vIEdldCB0aGUgaWRlbnRpZmllciwgaWYgZ2l2ZW4uCiAgIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2M7CkBAIC01OTEsNyArNTc1LDcgQEAKICAgICAvLyBVbm5hbWVkIHRlbXBsYXRlIHBhcmFtZXRlci4gRG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBoZXJlLCBqdXN0CiAgICAgLy8gZG9uJ3QgY29uc3VtZSB0aGlzIHRva2VuLgogICB9IGVsc2UgewotICAgIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudCk7CisgICAgRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCB0b2s6OmlkZW50aWZpZXI7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNjA3LDggKzU5MSw3IEBACiAgIC8vIHdlIGludHJvZHVjZSB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGludG8gdGhlIGxvY2FsIHNjb3BlLgogICBTb3VyY2VMb2NhdGlvbiBFcXVhbExvYzsKICAgUGFyc2VkVGVtcGxhdGVBcmd1bWVudCBEZWZhdWx0QXJnOwotICBpZiAoVG9rLmlzKHRvazo6ZXF1YWwpKSB7Ci0gICAgRXF1YWxMb2MgPSBDb25zdW1lVG9rZW4oKTsKKyAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OmVxdWFsLCBFcXVhbExvYykpIHsKICAgICBEZWZhdWx0QXJnID0gUGFyc2VUZW1wbGF0ZVRlbXBsYXRlQXJndW1lbnQoKTsKICAgICBpZiAoRGVmYXVsdEFyZy5pc0ludmFsaWQoKSkgewogICAgICAgRGlhZyhUb2suZ2V0TG9jYXRpb24oKSwgCkBAIC02NTEsOSArNjM0LDcgQEAKICAgLy8gd2UgaW50cm9kdWNlIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaW50byB0aGUgbG9jYWwgc2NvcGUuCiAgIFNvdXJjZUxvY2F0aW9uIEVxdWFsTG9jOwogICBFeHByUmVzdWx0IERlZmF1bHRBcmc7Ci0gIGlmIChUb2suaXModG9rOjplcXVhbCkpIHsKLSAgICBFcXVhbExvYyA9IENvbnN1bWVUb2tlbigpOwotCisgIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjplcXVhbCwgRXF1YWxMb2MpKSB7CiAgICAgLy8gQysrIFt0ZW1wLnBhcmFtXXAxNToKICAgICAvLyAgIFdoZW4gcGFyc2luZyBhIGRlZmF1bHQgdGVtcGxhdGUtYXJndW1lbnQgZm9yIGEgbm9uLXR5cGUKICAgICAvLyAgIHRlbXBsYXRlLXBhcmFtZXRlciwgdGhlIGZpcnN0IG5vbi1uZXN0ZWQgPiBpcyB0YWtlbiBhcyB0aGUKQEAgLTY5Miw3ICs2NzMsNyBAQAogCiAgIHN3aXRjaCAoVG9rLmdldEtpbmQoKSkgewogICBkZWZhdWx0OgotICAgIERpYWcoVG9rLmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9leHBlY3RlZF9ncmVhdGVyKTsKKyAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6Z3JlYXRlcjsKICAgICByZXR1cm4gdHJ1ZTsKIAogICBjYXNlIHRvazo6Z3JlYXRlcjoKQEAgLTkwMCw4ICs4ODEsNyBAQAogICBpZiAoSW52YWxpZCkgewogICAgIC8vIElmIHdlIGZhaWxlZCB0byBwYXJzZSB0aGUgdGVtcGxhdGUgSUQgYnV0IHNraXBwZWQgYWhlYWQgdG8gYSA+LCB3ZSdyZSBub3QKICAgICAvLyBnb2luZyB0byBiZSBhYmxlIHRvIGZvcm0gYSB0b2tlbiBhbm5vdGF0aW9uLiAgRWF0IHRoZSAnPicgaWYgcHJlc2VudC4KLSAgICBpZiAoVG9rLmlzKHRvazo6Z3JlYXRlcikpCi0gICAgICBDb25zdW1lVG9rZW4oKTsKKyAgICBUcnlDb25zdW1lVG9rZW4odG9rOjpncmVhdGVyKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCkBAIC05MTYsOCArODk2LDcgQEAKICAgICBpZiAoVHlwZS5pc0ludmFsaWQoKSkgewogICAgICAgLy8gSWYgd2UgZmFpbGVkIHRvIHBhcnNlIHRoZSB0ZW1wbGF0ZSBJRCBidXQgc2tpcHBlZCBhaGVhZCB0byBhID4sIHdlJ3JlIG5vdAogICAgICAgLy8gZ29pbmcgdG8gYmUgYWJsZSB0byBmb3JtIGEgdG9rZW4gYW5ub3RhdGlvbi4gIEVhdCB0aGUgJz4nIGlmIHByZXNlbnQuCi0gICAgICBpZiAoVG9rLmlzKHRvazo6Z3JlYXRlcikpCi0gICAgICAgIENvbnN1bWVUb2tlbigpOworICAgICAgVHJ5Q29uc3VtZVRva2VuKHRvazo6Z3JlYXRlcik7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTEwNDQsMTEgKzEwMjMsOSBAQAogICAgICAgVW5xdWFsaWZpZWRJZCBOYW1lOwogICAgICAgTmFtZS5zZXRJZGVudGlmaWVyKFRvay5nZXRJZGVudGlmaWVySW5mbygpLCBUb2suZ2V0TG9jYXRpb24oKSk7CiAgICAgICBDb25zdW1lVG9rZW4oKTsgLy8gdGhlIGlkZW50aWZpZXIKLSAgICAgIAotICAgICAgLy8gUGFyc2UgdGhlIGVsbGlwc2lzLgotICAgICAgaWYgKFRvay5pcyh0b2s6OmVsbGlwc2lzKSkKLSAgICAgICAgRWxsaXBzaXNMb2MgPSBDb25zdW1lVG9rZW4oKTsKLSAgICAgIAorCisgICAgICBUcnlDb25zdW1lVG9rZW4odG9rOjplbGxpcHNpcywgRWxsaXBzaXNMb2MpOworCiAgICAgICAvLyBJZiB0aGUgbmV4dCB0b2tlbiBzaWduYWxzIHRoZSBlbmQgb2YgYSB0ZW1wbGF0ZSBhcmd1bWVudCwKICAgICAgIC8vIHRoZW4gd2UgaGF2ZSBhIGRlcGVuZGVudCB0ZW1wbGF0ZSBuYW1lIHRoYXQgY291bGQgYmUgYSB0ZW1wbGF0ZQogICAgICAgLy8gdGVtcGxhdGUgYXJndW1lbnQuCkBAIC0xMDY3LDEwICsxMDQ0LDggQEAKICAgICBVbnF1YWxpZmllZElkIE5hbWU7CiAgICAgTmFtZS5zZXRJZGVudGlmaWVyKFRvay5nZXRJZGVudGlmaWVySW5mbygpLCBUb2suZ2V0TG9jYXRpb24oKSk7CiAgICAgQ29uc3VtZVRva2VuKCk7IC8vIHRoZSBpZGVudGlmaWVyCi0gICAgCi0gICAgLy8gUGFyc2UgdGhlIGVsbGlwc2lzLgotICAgIGlmIChUb2suaXModG9rOjplbGxpcHNpcykpCi0gICAgICBFbGxpcHNpc0xvYyA9IENvbnN1bWVUb2tlbigpOworCisgICAgVHJ5Q29uc3VtZVRva2VuKHRvazo6ZWxsaXBzaXMsIEVsbGlwc2lzTG9jKTsKIAogICAgIGlmIChpc0VuZE9mVGVtcGxhdGVBcmd1bWVudChUb2spKSB7CiAgICAgICBib29sIE1lbWJlck9mVW5rbm93blNwZWNpYWxpemF0aW9uOwpAQCAtMTE2MSw5ICsxMTM2LDggQEAKICAgfQogICAKICAgLy8gJzwnCi0gIGlmICghVG9rLmlzKHRvazo6bGVzcykpCisgIGlmICghVHJ5Q29uc3VtZVRva2VuKHRvazo6bGVzcykpCiAgICAgcmV0dXJuIGZhbHNlOwotICBDb25zdW1lVG9rZW4oKTsKIAogICAvLyBBbiBlbXB0eSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0LgogICBpZiAoVG9rLmlzKHRvazo6Z3JlYXRlcikpCkBAIC0xMTg4LDEyICsxMTYyLDExIEBACiAgIC8vIFRlbXBsYXRlIGFyZ3VtZW50IGxpc3RzIGFyZSBjb25zdGFudC1ldmFsdWF0aW9uIGNvbnRleHRzLgogICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCBFdmFsQ29udGV4dChBY3Rpb25zLFNlbWE6OkNvbnN0YW50RXZhbHVhdGVkKTsKIAotICB3aGlsZSAodHJ1ZSkgeworICBkbyB7CiAgICAgUGFyc2VkVGVtcGxhdGVBcmd1bWVudCBBcmcgPSBQYXJzZVRlbXBsYXRlQXJndW1lbnQoKTsKLSAgICBpZiAoVG9rLmlzKHRvazo6ZWxsaXBzaXMpKSB7Ci0gICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYyAgPSBDb25zdW1lVG9rZW4oKTsKKyAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYzsKKyAgICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6ZWxsaXBzaXMsIEVsbGlwc2lzTG9jKSkKICAgICAgIEFyZyA9IEFjdGlvbnMuQWN0T25QYWNrRXhwYW5zaW9uKEFyZywgRWxsaXBzaXNMb2MpOwotICAgIH0KIAogICAgIGlmIChBcmcuaXNJbnZhbGlkKCkpIHsKICAgICAgIFNraXBVbnRpbCh0b2s6OmNvbW1hLCB0b2s6OmdyZWF0ZXIsIFN0b3BBdFNlbWkgfCBTdG9wQmVmb3JlTWF0Y2gpOwpAQCAtMTIwNSwxMSArMTE3OCw3IEBACiAgICAgICAKICAgICAvLyBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGNvbW1hLCBjb25zdW1lIGl0IGFuZCBrZWVwIHJlYWRpbmcKICAgICAvLyBhcmd1bWVudHMuCi0gICAgaWYgKFRvay5pc05vdCh0b2s6OmNvbW1hKSkgYnJlYWs7Ci0KLSAgICAvLyBDb25zdW1lIHRoZSBjb21tYS4KLSAgICBDb25zdW1lVG9rZW4oKTsKLSAgfQorICB9IHdoaWxlIChUcnlDb25zdW1lVG9rZW4odG9rOjpjb21tYSkpOwogCiAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTEyNTgsOSArMTIyNyw3IEBACiAgICAgIHJldHVybjsKIAogICAvLyBHZXQgdGhlIEZ1bmN0aW9uRGVjbC4KLSAgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkZ1blRtcGxEID0gZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KExQVC5EKTsKLSAgRnVuY3Rpb25EZWNsICpGdW5EID0KLSAgICAgIEZ1blRtcGxEID8gRnVuVG1wbEQtPmdldFRlbXBsYXRlZERlY2woKSA6IGNhc3Q8RnVuY3Rpb25EZWNsPihMUFQuRCk7CisgIEZ1bmN0aW9uRGVjbCAqRnVuRCA9IExQVC5ELT5nZXRBc0Z1bmN0aW9uKCk7CiAgIC8vIFRyYWNrIHRlbXBsYXRlIHBhcmFtZXRlciBkZXB0aC4KICAgVGVtcGxhdGVQYXJhbWV0ZXJEZXB0aFJBSUkgQ3VyVGVtcGxhdGVEZXB0aFRyYWNrZXIoVGVtcGxhdGVQYXJhbWV0ZXJEZXB0aCk7CiAKQEAgLTEzMDQsOSArMTI3MSwxMSBAQAogICAgICAgbmV3IFBhcnNlU2NvcGUodGhpcywgU2NvcGU6OlRlbXBsYXRlUGFyYW1TY29wZSkpOwogCiAgIERlY2xhcmF0b3JEZWNsICpEZWNsYXJhdG9yID0gZHluX2Nhc3Q8RGVjbGFyYXRvckRlY2w+KEZ1bkQpOwotICBpZiAoRGVjbGFyYXRvciAmJiBEZWNsYXJhdG9yLT5nZXROdW1UZW1wbGF0ZVBhcmFtZXRlckxpc3RzKCkgIT0gMCkgeworICBjb25zdCB1bnNpZ25lZCBEZWNsYXJhdG9yTnVtVGVtcGxhdGVQYXJhbWV0ZXJMaXN0cyA9IAorICAgICAgKERlY2xhcmF0b3IgPyBEZWNsYXJhdG9yLT5nZXROdW1UZW1wbGF0ZVBhcmFtZXRlckxpc3RzKCkgOiAwKTsKKyAgaWYgKERlY2xhcmF0b3IgJiYgRGVjbGFyYXRvck51bVRlbXBsYXRlUGFyYW1ldGVyTGlzdHMgIT0gMCkgewogICAgIEFjdGlvbnMuQWN0T25SZWVudGVyRGVjbGFyYXRvclRlbXBsYXRlU2NvcGUoZ2V0Q3VyU2NvcGUoKSwgRGVjbGFyYXRvcik7Ci0gICAgKytDdXJUZW1wbGF0ZURlcHRoVHJhY2tlcjsKKyAgICBDdXJUZW1wbGF0ZURlcHRoVHJhY2tlci5hZGREZXB0aChEZWNsYXJhdG9yTnVtVGVtcGxhdGVQYXJhbWV0ZXJMaXN0cyk7CiAgIH0KICAgQWN0aW9ucy5BY3RPblJlZW50ZXJUZW1wbGF0ZVNjb3BlKGdldEN1clNjb3BlKCksIExQVC5EKTsKICAgKytDdXJUZW1wbGF0ZURlcHRoVHJhY2tlcjsKQEAgLTEzNDEsOCArMTMxMCwxMCBAQAogICAgICAgQWN0aW9ucy5BY3RPbkRlZmF1bHRDdG9ySW5pdGlhbGl6ZXJzKExQVC5EKTsKIAogICAgIGlmIChUb2suaXModG9rOjpsX2JyYWNlKSkgewotICAgICAgYXNzZXJ0KCghRnVuVG1wbEQgfHwgRnVuVG1wbEQtPmdldFRlbXBsYXRlUGFyYW1ldGVycygpLT5nZXREZXB0aCgpIDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtZXRlckRlcHRoKSAmJgorICAgICAgYXNzZXJ0KCghaXNhPEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihMUFQuRCkgfHwKKyAgICAgICAgICAgICAgY2FzdDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oTFBULkQpCisgICAgICAgICAgICAgICAgICAgICAgLT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKQorICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0RGVwdGgoKSA8IFRlbXBsYXRlUGFyYW1ldGVyRGVwdGgpICYmCiAgICAgICAgICAgICAgIlRlbXBsYXRlUGFyYW1ldGVyRGVwdGggc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB0aGUgZGVwdGggb2YgIgogICAgICAgICAgICAgICJjdXJyZW50IHRlbXBsYXRlIGJlaW5nIGluc3RhbnRpYXRlZCEiKTsKICAgICAgIFBhcnNlRnVuY3Rpb25TdGF0ZW1lbnRCb2R5KExQVC5ELCBGblNjb3BlKTsKZGlmZiAtLWdpdCBhL2xpYi9QYXJzZS9QYXJzZVRlbnRhdGl2ZS5jcHAgYi9saWIvUGFyc2UvUGFyc2VUZW50YXRpdmUuY3BwCmluZGV4IGExZDZiMTMuLjMzMGU1NDEgMTAwNjQ0Ci0tLSBhL2xpYi9QYXJzZS9QYXJzZVRlbnRhdGl2ZS5jcHAKKysrIGIvbGliL1BhcnNlL1BhcnNlVGVudGF0aXZlLmNwcApAQCAtMzIwLDkgKzMyMCw4IEBACiAgICAgICByZXR1cm4gVFBSZXN1bHQ6OlRydWUoKTsKICAgICB9CiAKLSAgICBpZiAoVG9rLmlzTm90KHRvazo6Y29tbWEpKQorICAgIGlmICghVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29tbWEpKQogICAgICAgYnJlYWs7Ci0gICAgQ29uc3VtZVRva2VuKCk7IC8vIHRoZSBjb21tYS4KICAgfQogCiAgIHJldHVybiBUUFJlc3VsdDo6QW1iaWd1b3VzKCk7CkBAIC01OTUsMTMgKzU5NCwxMCBAQAogICAgICAgfQogICAgIH0KIAotICAgIGlmIChUb2suaXModG9rOjplbGxpcHNpcykpCi0gICAgICBDb25zdW1lVG9rZW4oKTsKKyAgICBUcnlDb25zdW1lVG9rZW4odG9rOjplbGxpcHNpcyk7CiAKLSAgICBpZiAoVG9rLmlzTm90KHRvazo6Y29tbWEpKQorICAgIGlmICghVHJ5Q29uc3VtZVRva2VuKHRvazo6Y29tbWEpKQogICAgICAgYnJlYWs7Ci0KLSAgICBDb25zdW1lVG9rZW4oKTsKICAgfQogCiAgIC8vIEFuIGF0dHJpYnV0ZSBtdXN0IGVuZCAnXV0nLgpAQCAtOTM1LDcgKzkzMSw2IEBACiAgIGNhc2UgdG9rOjprd19fX2FsaWdub2Y6CiAgIGNhc2UgdG9rOjprd19fX2J1aWx0aW5fY2hvb3NlX2V4cHI6CiAgIGNhc2UgdG9rOjprd19fX2J1aWx0aW5fb2Zmc2V0b2Y6Ci0gIGNhc2UgdG9rOjprd19fX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wOgogICBjYXNlIHRvazo6a3dfX19idWlsdGluX3ZhX2FyZzoKICAgY2FzZSB0b2s6Omt3X19faW1hZzoKICAgY2FzZSB0b2s6Omt3X19fcmVhbDoKQEAgLTk0MywzMyArOTM4LDEwIEBACiAgIGNhc2UgdG9rOjprd19fX0ZVTkNETkFNRV9fOgogICBjYXNlIHRvazo6a3dfTF9fRlVOQ1RJT05fXzoKICAgY2FzZSB0b2s6Omt3X19fUFJFVFRZX0ZVTkNUSU9OX186Ci0gIGNhc2UgdG9rOjprd19fX2hhc19ub3Rocm93X2Fzc2lnbjoKLSAgY2FzZSB0b2s6Omt3X19faGFzX25vdGhyb3dfY29weToKLSAgY2FzZSB0b2s6Omt3X19faGFzX25vdGhyb3dfY29uc3RydWN0b3I6Ci0gIGNhc2UgdG9rOjprd19fX2hhc190cml2aWFsX2Fzc2lnbjoKLSAgY2FzZSB0b2s6Omt3X19faGFzX3RyaXZpYWxfY29weToKLSAgY2FzZSB0b2s6Omt3X19faGFzX3RyaXZpYWxfY29uc3RydWN0b3I6Ci0gIGNhc2UgdG9rOjprd19fX2hhc190cml2aWFsX2Rlc3RydWN0b3I6Ci0gIGNhc2UgdG9rOjprd19fX2hhc192aXJ0dWFsX2Rlc3RydWN0b3I6Ci0gIGNhc2UgdG9rOjprd19fX2lzX2Fic3RyYWN0OgotICBjYXNlIHRvazo6a3dfX19pc19iYXNlX29mOgotICBjYXNlIHRvazo6a3dfX19pc19jbGFzczoKLSAgY2FzZSB0b2s6Omt3X19faXNfY29udmVydGlibGVfdG86Ci0gIGNhc2UgdG9rOjprd19fX2lzX2VtcHR5OgotICBjYXNlIHRvazo6a3dfX19pc19lbnVtOgotICBjYXNlIHRvazo6a3dfX19pc19pbnRlcmZhY2VfY2xhc3M6Ci0gIGNhc2UgdG9rOjprd19fX2lzX2ZpbmFsOgotICBjYXNlIHRvazo6a3dfX19pc19saXRlcmFsOgotICBjYXNlIHRvazo6a3dfX19pc19saXRlcmFsX3R5cGU6Ci0gIGNhc2UgdG9rOjprd19fX2lzX3BvZDoKLSAgY2FzZSB0b2s6Omt3X19faXNfcG9seW1vcnBoaWM6Ci0gIGNhc2UgdG9rOjprd19fX2lzX3NlYWxlZDoKLSAgY2FzZSB0b2s6Omt3X19faXNfdHJpdmlhbDoKLSAgY2FzZSB0b2s6Omt3X19faXNfdHJpdmlhbGx5X2Fzc2lnbmFibGU6Ci0gIGNhc2UgdG9rOjprd19fX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlOgotICBjYXNlIHRvazo6a3dfX19pc190cml2aWFsbHlfY29weWFibGU6Ci0gIGNhc2UgdG9rOjprd19fX2lzX3VuaW9uOgogICBjYXNlIHRvazo6a3dfX191dWlkb2Y6CisjZGVmaW5lIFRZUEVfVFJBSVQoTixTcGVsbGluZyxLKSBcCisgIGNhc2UgdG9rOjprd18jI1NwZWxsaW5nOgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1Rva2VuS2luZHMuZGVmIgogICAgIHJldHVybiBUUFJlc3VsdDo6VHJ1ZSgpOwogICAgICAgCiAgIC8vIE9idmlvdXNseSBzdGFydHMgYSB0eXBlLXNwZWNpZmllci1zZXE6CkBAIC0xMDE1LDE0ICs5ODcsNiBAQAogICBjYXNlIHRvazo6a3dfX192ZWN0b3I6CiAgIGNhc2UgdG9rOjprd19fX3BpeGVsOgogICBjYXNlIHRvazo6a3dfX0F0b21pYzoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlMWRfdDoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlMWRfYXJyYXlfdDoKLSAgY2FzZSB0b2s6Omt3X2ltYWdlMWRfYnVmZmVyX3Q6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTJkX3Q6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTJkX2FycmF5X3Q6Ci0gIGNhc2UgdG9rOjprd19pbWFnZTNkX3Q6Ci0gIGNhc2UgdG9rOjprd19zYW1wbGVyX3Q6Ci0gIGNhc2UgdG9rOjprd19ldmVudF90OgogICBjYXNlIHRvazo6a3dfX191bmtub3duX2FueXR5cGU6CiAgICAgcmV0dXJuIFRQUmVzdWx0OjpGYWxzZSgpOwogCkBAIC0xNzU2LDkgKzE3MjAsOCBAQAogICAgICAgICByZXR1cm4gVFBSZXN1bHQ6OkZhbHNlKCk7CiAgICAgfQogCi0gICAgaWYgKFRvay5pc05vdCh0b2s6OmNvbW1hKSkKKyAgICBpZiAoIVRyeUNvbnN1bWVUb2tlbih0b2s6OmNvbW1hKSkKICAgICAgIGJyZWFrOwotICAgIENvbnN1bWVUb2tlbigpOyAvLyB0aGUgY29tbWEuCiAgIH0KIAogICByZXR1cm4gVFBSZXN1bHQ6OkFtYmlndW91cygpOwpkaWZmIC0tZ2l0IGEvbGliL1BhcnNlL1BhcnNlci5jcHAgYi9saWIvUGFyc2UvUGFyc2VyLmNwcAppbmRleCA0NTdkZDM2Li45OTM2YTVhIDEwMDY0NAotLS0gYS9saWIvUGFyc2UvUGFyc2VyLmNwcAorKysgYi9saWIvUGFyc2UvUGFyc2VyLmNwcApAQCAtMTIsOSArMTIsOSBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgImNsYW5nL1BhcnNlL1BhcnNlci5oIgotI2luY2x1ZGUgIlBhcnNlUHJhZ21hLmgiCiAjaW5jbHVkZSAiUkFJSU9iamVjdHNGb3JQYXJzZXIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29uc3VtZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsVGVtcGxhdGUuaCIKICNpbmNsdWRlICJjbGFuZy9QYXJzZS9QYXJzZURpYWdub3N0aWMuaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL0RlY2xTcGVjLmgiCkBAIC0zMyw3ICszMyw3IEBACiBwdWJsaWM6CiAgIGV4cGxpY2l0IEFjdGlvbkNvbW1lbnRIYW5kbGVyKFNlbWEgJlMpIDogUyhTKSB7IH0KIAotICB2aXJ0dWFsIGJvb2wgSGFuZGxlQ29tbWVudChQcmVwcm9jZXNzb3IgJlBQLCBTb3VyY2VSYW5nZSBDb21tZW50KSB7CisgIGJvb2wgSGFuZGxlQ29tbWVudChQcmVwcm9jZXNzb3IgJlBQLCBTb3VyY2VSYW5nZSBDb21tZW50KSBvdmVycmlkZSB7CiAgICAgUy5BY3RPbkNvbW1lbnQoQ29tbWVudCk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CkBAIC02Myw1MSArNjMsNyBAQAogCiAgIC8vIEFkZCAjcHJhZ21hIGhhbmRsZXJzLiBUaGVzZSBhcmUgcmVtb3ZlZCBhbmQgZGVzdHJveWVkIGluIHRoZQogICAvLyBkZXN0cnVjdG9yLgotICBBbGlnbkhhbmRsZXIucmVzZXQobmV3IFByYWdtYUFsaWduSGFuZGxlcigpKTsKLSAgUFAuQWRkUHJhZ21hSGFuZGxlcihBbGlnbkhhbmRsZXIuZ2V0KCkpOwotCi0gIEdDQ1Zpc2liaWxpdHlIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFHQ0NWaXNpYmlsaXR5SGFuZGxlcigpKTsKLSAgUFAuQWRkUHJhZ21hSGFuZGxlcigiR0NDIiwgR0NDVmlzaWJpbGl0eUhhbmRsZXIuZ2V0KCkpOwotCi0gIE9wdGlvbnNIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFPcHRpb25zSGFuZGxlcigpKTsKLSAgUFAuQWRkUHJhZ21hSGFuZGxlcihPcHRpb25zSGFuZGxlci5nZXQoKSk7Ci0KLSAgUGFja0hhbmRsZXIucmVzZXQobmV3IFByYWdtYVBhY2tIYW5kbGVyKCkpOwotICBQUC5BZGRQcmFnbWFIYW5kbGVyKFBhY2tIYW5kbGVyLmdldCgpKTsKLSAgICAKLSAgTVNTdHJ1Y3RIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFNU1N0cnVjdEhhbmRsZXIoKSk7Ci0gIFBQLkFkZFByYWdtYUhhbmRsZXIoTVNTdHJ1Y3RIYW5kbGVyLmdldCgpKTsKLQotICBVbnVzZWRIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFVbnVzZWRIYW5kbGVyKCkpOwotICBQUC5BZGRQcmFnbWFIYW5kbGVyKFVudXNlZEhhbmRsZXIuZ2V0KCkpOwotCi0gIFdlYWtIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFXZWFrSGFuZGxlcigpKTsKLSAgUFAuQWRkUHJhZ21hSGFuZGxlcihXZWFrSGFuZGxlci5nZXQoKSk7Ci0KLSAgUmVkZWZpbmVFeHRuYW1lSGFuZGxlci5yZXNldChuZXcgUHJhZ21hUmVkZWZpbmVFeHRuYW1lSGFuZGxlcigpKTsKLSAgUFAuQWRkUHJhZ21hSGFuZGxlcihSZWRlZmluZUV4dG5hbWVIYW5kbGVyLmdldCgpKTsKLQotICBGUENvbnRyYWN0SGFuZGxlci5yZXNldChuZXcgUHJhZ21hRlBDb250cmFjdEhhbmRsZXIoKSk7Ci0gIFBQLkFkZFByYWdtYUhhbmRsZXIoIlNUREMiLCBGUENvbnRyYWN0SGFuZGxlci5nZXQoKSk7Ci0KLSAgaWYgKGdldExhbmdPcHRzKCkuT3BlbkNMKSB7Ci0gICAgT3BlbkNMRXh0ZW5zaW9uSGFuZGxlci5yZXNldChuZXcgUHJhZ21hT3BlbkNMRXh0ZW5zaW9uSGFuZGxlcigpKTsKLSAgICBQUC5BZGRQcmFnbWFIYW5kbGVyKCJPUEVOQ0wiLCBPcGVuQ0xFeHRlbnNpb25IYW5kbGVyLmdldCgpKTsKLQotICAgIFBQLkFkZFByYWdtYUhhbmRsZXIoIk9QRU5DTCIsIEZQQ29udHJhY3RIYW5kbGVyLmdldCgpKTsKLSAgfQotICBpZiAoZ2V0TGFuZ09wdHMoKS5PcGVuTVApCi0gICAgT3Blbk1QSGFuZGxlci5yZXNldChuZXcgUHJhZ21hT3Blbk1QSGFuZGxlcigpKTsKLSAgZWxzZQotICAgIE9wZW5NUEhhbmRsZXIucmVzZXQobmV3IFByYWdtYU5vT3Blbk1QSGFuZGxlcigpKTsKLSAgUFAuQWRkUHJhZ21hSGFuZGxlcihPcGVuTVBIYW5kbGVyLmdldCgpKTsKLQotICBpZiAoZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRFeHQpIHsKLSAgICBNU0NvbW1lbnRIYW5kbGVyLnJlc2V0KG5ldyBQcmFnbWFDb21tZW50SGFuZGxlcihhY3Rpb25zKSk7Ci0gICAgUFAuQWRkUHJhZ21hSGFuZGxlcihNU0NvbW1lbnRIYW5kbGVyLmdldCgpKTsKLSAgICBNU0RldGVjdE1pc21hdGNoSGFuZGxlci5yZXNldChuZXcgUHJhZ21hRGV0ZWN0TWlzbWF0Y2hIYW5kbGVyKGFjdGlvbnMpKTsKLSAgICBQUC5BZGRQcmFnbWFIYW5kbGVyKE1TRGV0ZWN0TWlzbWF0Y2hIYW5kbGVyLmdldCgpKTsKLSAgfQorICBpbml0aWFsaXplUHJhZ21hSGFuZGxlcnMoKTsKIAogICBDb21tZW50U2VtYUhhbmRsZXIucmVzZXQobmV3IEFjdGlvbkNvbW1lbnRIYW5kbGVyKGFjdGlvbnMpKTsKICAgUFAuYWRkQ29tbWVudEhhbmRsZXIoQ29tbWVudFNlbWFIYW5kbGVyLmdldCgpKTsKQEAgLTE1MiwxNCArMTA4LDggQEAKICAgfQogfQogCi0vLy8gRXhwZWN0QW5kQ29uc3VtZSAtIFRoZSBwYXJzZXIgZXhwZWN0cyB0aGF0ICdFeHBlY3RlZFRvaycgaXMgbmV4dCBpbiB0aGUKLS8vLyBpbnB1dC4gIElmIHNvLCBpdCBpcyBjb25zdW1lZCBhbmQgZmFsc2UgaXMgcmV0dXJuZWQuCi0vLy8KLS8vLyBJZiB0aGUgaW5wdXQgaXMgbWFsZm9ybWVkLCB0aGlzIGVtaXRzIHRoZSBzcGVjaWZpZWQgZGlhZ25vc3RpYy4gIE5leHQsIGlmCi0vLy8gU2tpcFRvVG9rIGlzIHNwZWNpZmllZCwgaXQgY2FsbHMgU2tpcFVudGlsKFNraXBUb1RvaykuICBGaW5hbGx5LCB0cnVlIGlzCi0vLy8gcmV0dXJuZWQuCiBib29sIFBhcnNlcjo6RXhwZWN0QW5kQ29uc3VtZSh0b2s6OlRva2VuS2luZCBFeHBlY3RlZFRvaywgdW5zaWduZWQgRGlhZ0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTXNnLCB0b2s6OlRva2VuS2luZCBTa2lwVG9Ub2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1zZykgewogICBpZiAoVG9rLmlzKEV4cGVjdGVkVG9rKSB8fCBUb2suaXModG9rOjpjb2RlX2NvbXBsZXRpb24pKSB7CiAgICAgQ29uc3VtZUFueVRva2VuKCk7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTY4LDM1ICsxMTgsNDggQEAKICAgLy8gRGV0ZWN0IGNvbW1vbiBzaW5nbGUtY2hhcmFjdGVyIHR5cG9zIGFuZCByZXN1bWUuCiAgIGlmIChJc0NvbW1vblR5cG8oRXhwZWN0ZWRUb2ssIFRvaykpIHsKICAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBUb2suZ2V0TG9jYXRpb24oKTsKLSAgICBEaWFnKExvYywgRGlhZ0lEKQotICAgICAgPDwgTXNnCi0gICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlcGxhY2VtZW50KFNvdXJjZVJhbmdlKExvYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRva2VuU2ltcGxlU3BlbGxpbmcoRXhwZWN0ZWRUb2spKTsKLSAgICBDb25zdW1lQW55VG9rZW4oKTsKKyAgICB7CisgICAgICBEaWFnbm9zdGljQnVpbGRlciBEQiA9IERpYWcoTG9jLCBEaWFnSUQpOworICAgICAgREIgPDwgRml4SXRIaW50OjpDcmVhdGVSZXBsYWNlbWVudCgKKyAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZShMb2MpLCB0b2s6OmdldFB1bmN0dWF0b3JTcGVsbGluZyhFeHBlY3RlZFRvaykpOworICAgICAgaWYgKERpYWdJRCA9PSBkaWFnOjplcnJfZXhwZWN0ZWQpCisgICAgICAgIERCIDw8IEV4cGVjdGVkVG9rOworICAgICAgZWxzZSBpZiAoRGlhZ0lEID09IGRpYWc6OmVycl9leHBlY3RlZF9hZnRlcikKKyAgICAgICAgREIgPDwgTXNnIDw8IEV4cGVjdGVkVG9rOworICAgICAgZWxzZQorICAgICAgICBEQiA8PCBNc2c7CisgICAgfQogCiAgICAgLy8gUHJldGVuZCB0aGVyZSB3YXNuJ3QgYSBwcm9ibGVtLgorICAgIENvbnN1bWVBbnlUb2tlbigpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGNvbnN0IGNoYXIgKlNwZWxsaW5nID0gMDsKICAgU291cmNlTG9jYXRpb24gRW5kTG9jID0gUFAuZ2V0TG9jRm9yRW5kT2ZUb2tlbihQcmV2VG9rTG9jYXRpb24pOwotICBpZiAoRW5kTG9jLmlzVmFsaWQoKSAmJgotICAgICAgKFNwZWxsaW5nID0gdG9rOjpnZXRUb2tlblNpbXBsZVNwZWxsaW5nKEV4cGVjdGVkVG9rKSkpIHsKLSAgICAvLyBTaG93IHdoYXQgY29kZSB0byBpbnNlcnQgdG8gZml4IHRoaXMgcHJvYmxlbS4KLSAgICBEaWFnKEVuZExvYywgRGlhZ0lEKQotICAgICAgPDwgTXNnCi0gICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihFbmRMb2MsIFNwZWxsaW5nKTsKLSAgfSBlbHNlCi0gICAgRGlhZyhUb2ssIERpYWdJRCkgPDwgTXNnOworICBjb25zdCBjaGFyICpTcGVsbGluZyA9IDA7CisgIGlmIChFbmRMb2MuaXNWYWxpZCgpKQorICAgIFNwZWxsaW5nID0gdG9rOjpnZXRQdW5jdHVhdG9yU3BlbGxpbmcoRXhwZWN0ZWRUb2spOwogCi0gIGlmIChTa2lwVG9Ub2sgIT0gdG9rOjp1bmtub3duKQotICAgIFNraXBVbnRpbChTa2lwVG9Ub2ssIFN0b3BBdFNlbWkpOworICBEaWFnbm9zdGljQnVpbGRlciBEQiA9CisgICAgICBTcGVsbGluZworICAgICAgICAgID8gRGlhZyhFbmRMb2MsIERpYWdJRCkgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oRW5kTG9jLCBTcGVsbGluZykKKyAgICAgICAgICA6IERpYWcoVG9rLCBEaWFnSUQpOworICBpZiAoRGlhZ0lEID09IGRpYWc6OmVycl9leHBlY3RlZCkKKyAgICBEQiA8PCBFeHBlY3RlZFRvazsKKyAgZWxzZSBpZiAoRGlhZ0lEID09IGRpYWc6OmVycl9leHBlY3RlZF9hZnRlcikKKyAgICBEQiA8PCBNc2cgPDwgRXhwZWN0ZWRUb2s7CisgIGVsc2UKKyAgICBEQiA8PCBNc2c7CisKICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgUGFyc2VyOjpFeHBlY3RBbmRDb25zdW1lU2VtaSh1bnNpZ25lZCBEaWFnSUQpIHsKLSAgaWYgKFRvay5pcyh0b2s6OnNlbWkpIHx8IFRvay5pcyh0b2s6OmNvZGVfY29tcGxldGlvbikpIHsKLSAgICBDb25zdW1lVG9rZW4oKTsKKyAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6OnNlbWkpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoVG9rLmlzKHRvazo6Y29kZV9jb21wbGV0aW9uKSkgeworICAgIGhhbmRsZVVuZXhwZWN0ZWRDb2RlQ29tcGxldGlvblRva2VuKCk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIApAQCAtMjQxLDcgKzIwNCw4IEBACiAKICAgaWYgKEtpbmQgIT0gQWZ0ZXJNZW1iZXJGdW5jdGlvbkRlZmluaXRpb24gfHwgSGFkTXVsdGlwbGVTZW1pcykKICAgICBEaWFnKFN0YXJ0TG9jLCBkaWFnOjpleHRfZXh0cmFfc2VtaSkKLSAgICAgICAgPDwgS2luZCA8PCBEZWNsU3BlYzo6Z2V0U3BlY2lmaWVyTmFtZSgoRGVjbFNwZWM6OlRTVClUU1QpCisgICAgICAgIDw8IEtpbmQgPDwgRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoKERlY2xTcGVjOjpUU1QpVFNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9ucy5nZXRBU1RDb250ZXh0KCkuZ2V0UHJpbnRpbmdQb2xpY3koKSkKICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVSZW1vdmFsKFNvdXJjZVJhbmdlKFN0YXJ0TG9jLCBFbmRMb2MpKTsKICAgZWxzZQogICAgIC8vIEEgc2luZ2xlIHNlbWljb2xvbiBpcyB2YWxpZCBhZnRlciBhIG1lbWJlciBmdW5jdGlvbiBkZWZpbml0aW9uLgpAQCAtMjg4LDcgKzI1Miw3IEBACiAgICAgaWYgKFRva3Muc2l6ZSgpID09IDEgJiYgVG9rc1swXSA9PSB0b2s6OmVvZiAmJgogICAgICAgICAhSGFzRmxhZ3NTZXQoRmxhZ3MsIFN0b3BBdFNlbWkpICYmCiAgICAgICAgICFIYXNGbGFnc1NldChGbGFncywgU3RvcEF0Q29kZUNvbXBsZXRpb24pKSB7Ci0gICAgICB3aGlsZSAoVG9rLmdldEtpbmQoKSAhPSB0b2s6OmVvZikKKyAgICAgIHdoaWxlIChUb2suaXNOb3QodG9rOjplb2YpKQogICAgICAgICBDb25zdW1lQW55VG9rZW4oKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTI5NywxMCArMjYxLDIwIEBACiAgICAgY2FzZSB0b2s6OmVvZjoKICAgICAgIC8vIFJhbiBvdXQgb2YgdG9rZW5zLgogICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKKworICAgIGNhc2UgdG9rOjphbm5vdF9wcmFnbWFfb3Blbm1wX2VuZDoKKyAgICAgIC8vIFN0b3AgYmVmb3JlIGFuIE9wZW5NUCBwcmFnbWEgYm91bmRhcnkuCisgICAgY2FzZSB0b2s6OmFubm90X21vZHVsZV9iZWdpbjoKKyAgICBjYXNlIHRvazo6YW5ub3RfbW9kdWxlX2VuZDoKKyAgICBjYXNlIHRvazo6YW5ub3RfbW9kdWxlX2luY2x1ZGU6CisgICAgICAvLyBTdG9wIGJlZm9yZSB3ZSBjaGFuZ2Ugc3VibW9kdWxlcy4gVGhleSBnZW5lcmFsbHkgaW5kaWNhdGUgYSAiZ29vZCIKKyAgICAgIC8vIHBsYWNlIHRvIHBpY2sgdXAgcGFyc2luZyBhZ2FpbiAoZXhjZXB0IGluIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUKKyAgICAgIC8vIHdlJ3JlIHRyeWluZyB0byBza2lwIHRvIEVPRikuCisgICAgICByZXR1cm4gZmFsc2U7CisKICAgICBjYXNlIHRvazo6Y29kZV9jb21wbGV0aW9uOgogICAgICAgaWYgKCFIYXNGbGFnc1NldChGbGFncywgU3RvcEF0Q29kZUNvbXBsZXRpb24pKQotICAgICAgICBDb25zdW1lVG9rZW4oKTsKKyAgICAgICAgaGFuZGxlVW5leHBlY3RlZENvZGVDb21wbGV0aW9uVG9rZW4oKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgCiAgICAgY2FzZSB0b2s6OmxfcGFyZW46CkBAIC00MzUsNDEgKzQwOSw3IEBACiAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOdW1DYWNoZWRTY29wZXM7IGkgIT0gZTsgKytpKQogICAgIGRlbGV0ZSBTY29wZUNhY2hlW2ldOwogCi0gIC8vIFJlbW92ZSB0aGUgcHJhZ21hIGhhbmRsZXJzIHdlIGluc3RhbGxlZC4KLSAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcihBbGlnbkhhbmRsZXIuZ2V0KCkpOwotICBBbGlnbkhhbmRsZXIucmVzZXQoKTsKLSAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcigiR0NDIiwgR0NDVmlzaWJpbGl0eUhhbmRsZXIuZ2V0KCkpOwotICBHQ0NWaXNpYmlsaXR5SGFuZGxlci5yZXNldCgpOwotICBQUC5SZW1vdmVQcmFnbWFIYW5kbGVyKE9wdGlvbnNIYW5kbGVyLmdldCgpKTsKLSAgT3B0aW9uc0hhbmRsZXIucmVzZXQoKTsKLSAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcihQYWNrSGFuZGxlci5nZXQoKSk7Ci0gIFBhY2tIYW5kbGVyLnJlc2V0KCk7Ci0gIFBQLlJlbW92ZVByYWdtYUhhbmRsZXIoTVNTdHJ1Y3RIYW5kbGVyLmdldCgpKTsKLSAgTVNTdHJ1Y3RIYW5kbGVyLnJlc2V0KCk7Ci0gIFBQLlJlbW92ZVByYWdtYUhhbmRsZXIoVW51c2VkSGFuZGxlci5nZXQoKSk7Ci0gIFVudXNlZEhhbmRsZXIucmVzZXQoKTsKLSAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcihXZWFrSGFuZGxlci5nZXQoKSk7Ci0gIFdlYWtIYW5kbGVyLnJlc2V0KCk7Ci0gIFBQLlJlbW92ZVByYWdtYUhhbmRsZXIoUmVkZWZpbmVFeHRuYW1lSGFuZGxlci5nZXQoKSk7Ci0gIFJlZGVmaW5lRXh0bmFtZUhhbmRsZXIucmVzZXQoKTsKLQotICBpZiAoZ2V0TGFuZ09wdHMoKS5PcGVuQ0wpIHsKLSAgICBQUC5SZW1vdmVQcmFnbWFIYW5kbGVyKCJPUEVOQ0wiLCBPcGVuQ0xFeHRlbnNpb25IYW5kbGVyLmdldCgpKTsKLSAgICBPcGVuQ0xFeHRlbnNpb25IYW5kbGVyLnJlc2V0KCk7Ci0gICAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcigiT1BFTkNMIiwgRlBDb250cmFjdEhhbmRsZXIuZ2V0KCkpOwotICB9Ci0gIFBQLlJlbW92ZVByYWdtYUhhbmRsZXIoT3Blbk1QSGFuZGxlci5nZXQoKSk7Ci0gIE9wZW5NUEhhbmRsZXIucmVzZXQoKTsKLQotICBpZiAoZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRFeHQpIHsKLSAgICBQUC5SZW1vdmVQcmFnbWFIYW5kbGVyKE1TQ29tbWVudEhhbmRsZXIuZ2V0KCkpOwotICAgIE1TQ29tbWVudEhhbmRsZXIucmVzZXQoKTsKLSAgICBQUC5SZW1vdmVQcmFnbWFIYW5kbGVyKE1TRGV0ZWN0TWlzbWF0Y2hIYW5kbGVyLmdldCgpKTsKLSAgICBNU0RldGVjdE1pc21hdGNoSGFuZGxlci5yZXNldCgpOwotICB9Ci0KLSAgUFAuUmVtb3ZlUHJhZ21hSGFuZGxlcigiU1REQyIsIEZQQ29udHJhY3RIYW5kbGVyLmdldCgpKTsKLSAgRlBDb250cmFjdEhhbmRsZXIucmVzZXQoKTsKKyAgcmVzZXRQcmFnbWFIYW5kbGVycygpOwogCiAgIFBQLnJlbW92ZUNvbW1lbnRIYW5kbGVyKENvbW1lbnRTZW1hSGFuZGxlci5nZXQoKSk7CiAKQEAgLTU3NCw3ICs1MTQsNyBAQAogYm9vbCBQYXJzZXI6OlBhcnNlVG9wTGV2ZWxEZWNsKERlY2xHcm91cFB0clR5ICZSZXN1bHQpIHsKICAgRGVzdHJveVRlbXBsYXRlSWRBbm5vdGF0aW9uc1JBSUlPYmogQ2xlYW51cFJBSUkoVGVtcGxhdGVJZHMpOwogCi0gIC8vIFNraXAgb3ZlciB0aGUgRU9GIHRva2VuLCBmbGFnZ2luZyBlbmQgb2YgcHJldmlvdXMgaW5wdXQgZm9yIGluY3JlbWVudGFsIAorICAvLyBTa2lwIG92ZXIgdGhlIEVPRiB0b2tlbiwgZmxhZ2dpbmcgZW5kIG9mIHByZXZpb3VzIGlucHV0IGZvciBpbmNyZW1lbnRhbAogICAvLyBwcm9jZXNzaW5nCiAgIGlmIChQUC5pc0luY3JlbWVudGFsUHJvY2Vzc2luZ0VuYWJsZWQoKSAmJiBUb2suaXModG9rOjplb2YpKQogICAgIENvbnN1bWVUb2tlbigpOwpAQCAtNTkyLDYgKzUzMiwxMiBAQAogICAgIENvbnN1bWVUb2tlbigpOwogICAgIHJldHVybiBmYWxzZTsKIAorICBjYXNlIHRvazo6YW5ub3RfbW9kdWxlX2JlZ2luOgorICBjYXNlIHRvazo6YW5ub3RfbW9kdWxlX2VuZDoKKyAgICAvLyBGSVhNRTogVXBkYXRlIHZpc2liaWxpdHkgYmFzZWQgb24gdGhlIHN1Ym1vZHVsZSB3ZSdyZSBpbi4KKyAgICBDb25zdW1lVG9rZW4oKTsKKyAgICByZXR1cm4gZmFsc2U7CisKICAgY2FzZSB0b2s6OmVvZjoKICAgICAvLyBMYXRlIHRlbXBsYXRlIHBhcnNpbmcgY2FuIGJlZ2luLgogICAgIGlmIChnZXRMYW5nT3B0cygpLkRlbGF5ZWRUZW1wbGF0ZVBhcnNpbmcpCkBAIC02NzksNiArNjI1LDEyIEBACiAgIGNhc2UgdG9rOjphbm5vdF9wcmFnbWFfb3Blbm1wOgogICAgIFBhcnNlT3Blbk1QRGVjbGFyYXRpdmVEaXJlY3RpdmUoKTsKICAgICByZXR1cm4gRGVjbEdyb3VwUHRyVHkoKTsKKyAgY2FzZSB0b2s6OmFubm90X3ByYWdtYV9tc19wb2ludGVyc190b19tZW1iZXJzOgorICAgIEhhbmRsZVByYWdtYU1TUG9pbnRlcnNUb01lbWJlcnMoKTsKKyAgICByZXR1cm4gRGVjbEdyb3VwUHRyVHkoKTsKKyAgY2FzZSB0b2s6OmFubm90X3ByYWdtYV9tc192dG9yZGlzcDoKKyAgICBIYW5kbGVQcmFnbWFNU1Z0b3JEaXNwKCk7CisgICAgcmV0dXJuIERlY2xHcm91cFB0clR5KCk7CiAgIGNhc2UgdG9rOjpzZW1pOgogICAgIC8vIEVpdGhlciBhIEMrKzExIGVtcHR5LWRlY2xhcmF0aW9uIG9yIGF0dHJpYnV0ZS1kZWNsYXJhdGlvbi4KICAgICBTaW5nbGVEZWNsID0gQWN0aW9ucy5BY3RPbkVtcHR5RGVjbGFyYXRpb24oZ2V0Q3VyU2NvcGUoKSwKQEAgLTcwNiw3ICs2NTgsNyBAQAogICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYzsKICAgICBFeHByUmVzdWx0IFJlc3VsdChQYXJzZVNpbXBsZUFzbSgmRW5kTG9jKSk7CiAKLSAgICBFeHBlY3RBbmRDb25zdW1lKHRvazo6c2VtaSwgZGlhZzo6ZXJyX2V4cGVjdGVkX3NlbWlfYWZ0ZXIsCisgICAgRXhwZWN0QW5kQ29uc3VtZSh0b2s6OnNlbWksIGRpYWc6OmVycl9leHBlY3RlZF9hZnRlciwKICAgICAgICAgICAgICAgICAgICAgICJ0b3AtbGV2ZWwgYXNtIGJsb2NrIik7CiAKICAgICBpZiAoUmVzdWx0LmlzSW52YWxpZCgpKQpAQCAtNzkzLDcgKzc0NSw2IEBACiAgICAgICAgICAgICAgICAgICBQYXJzZUV4cGxpY2l0SW5zdGFudGlhdGlvbihEZWNsYXJhdG9yOjpGaWxlQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVybkxvYywgVGVtcGxhdGVMb2MsIERlY2xFbmQpKTsKICAgICB9Ci0gICAgLy8gRklYTUU6IERldGVjdCBDKysgbGlua2FnZSBzcGVjaWZpY2F0aW9ucyBoZXJlPwogICAgIGdvdG8gZG9udF9rbm93OwogCiAgIGNhc2UgdG9rOjprd19fX2lmX2V4aXN0czoKQEAgLTkwOSw3ICs4NjAsOCBAQAogCiAgICAgY29uc3QgY2hhciAqUHJldlNwZWMgPSAwOwogICAgIHVuc2lnbmVkIERpYWdJRDsKLSAgICBpZiAoRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfdW5zcGVjaWZpZWQsIEF0TG9jLCBQcmV2U3BlYywgRGlhZ0lEKSkKKyAgICBpZiAoRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfdW5zcGVjaWZpZWQsIEF0TG9jLCBQcmV2U3BlYywgRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9ucy5nZXRBU1RDb250ZXh0KCkuZ2V0UHJpbnRpbmdQb2xpY3koKSkpCiAgICAgICBEaWFnKEF0TG9jLCBEaWFnSUQpIDw8IFByZXZTcGVjOwogCiAgICAgaWYgKFRvay5pc09iakNBdEtleXdvcmQodG9rOjpvYmpjX3Byb3RvY29sKSkKQEAgLTkyMiw3ICs4NzQsNyBAQAogICAvLyBJZiB0aGUgZGVjbHNwZWMgY29uc2lzdGVkIG9ubHkgb2YgJ2V4dGVybicgYW5kIHdlIGhhdmUgYSBzdHJpbmcKICAgLy8gbGl0ZXJhbCBmb2xsb3dpbmcgaXQsIHRoaXMgbXVzdCBiZSBhIEMrKyBsaW5rYWdlIHNwZWNpZmllciBsaWtlCiAgIC8vICdleHRlcm4gIkMiJy4KLSAgaWYgKFRvay5pcyh0b2s6OnN0cmluZ19saXRlcmFsKSAmJiBnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyAmJgorICBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMgJiYgaXNUb2tlblN0cmluZ0xpdGVyYWwoKSAmJgogICAgICAgRFMuZ2V0U3RvcmFnZUNsYXNzU3BlYygpID09IERlY2xTcGVjOjpTQ1NfZXh0ZXJuICYmCiAgICAgICBEUy5nZXRQYXJzZWRTcGVjaWZpZXJzKCkgPT0gRGVjbFNwZWM6OlBRX1N0b3JhZ2VDbGFzc1NwZWNpZmllcikgewogICAgIERlY2wgKlRoZURlY2wgPSBQYXJzZUxpbmthZ2UoRFMsIERlY2xhcmF0b3I6OkZpbGVDb250ZXh0KTsKQEAgLTk0OSwyNiArOTAxLDYgQEAKICAgfQogfQogCi0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0Z1bmN0aW9uRGVjbGFyYXRvclJlcXVpcmluZ1JldHVyblR5cGVEZWR1Y3Rpb24oCi0gICAgY29uc3QgRGVjbGFyYXRvciAmRCkgewotICBpZiAoIUQuaXNGdW5jdGlvbkRlY2xhcmF0b3IoKSB8fCAhRC5nZXREZWNsU3BlYygpLmNvbnRhaW5zUGxhY2Vob2xkZXJUeXBlKCkpIAotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IEQuZ2V0TnVtVHlwZU9iamVjdHMoKTsgSSAhPSBFOyArK0kpIHsKLSAgICB1bnNpZ25lZCBjaHVua0luZGV4ID0gRSAtIEkgLSAxOwotICAgIGNvbnN0IERlY2xhcmF0b3JDaHVuayAmRGVjbFR5cGUgPSBELmdldFR5cGVPYmplY3QoY2h1bmtJbmRleCk7Ci0gICAgaWYgKERlY2xUeXBlLktpbmQgPT0gRGVjbGFyYXRvckNodW5rOjpGdW5jdGlvbikgewotICAgICAgY29uc3QgRGVjbGFyYXRvckNodW5rOjpGdW5jdGlvblR5cGVJbmZvICZGVEkgPSBEZWNsVHlwZS5GdW47Ci0gICAgICBpZiAoIUZUSS5oYXNUcmFpbGluZ1JldHVyblR5cGUoKSkgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgUXVhbFR5cGUgVHJhaWxpbmdSZXRUeXBlID0gRlRJLmdldFRyYWlsaW5nUmV0dXJuVHlwZSgpLmdldCgpOwotICAgICAgcmV0dXJuIFRyYWlsaW5nUmV0VHlwZS0+Z2V0Q2Fub25pY2FsVHlwZUludGVybmFsKCkKLSAgICAgICAgLT5nZXRDb250YWluZWRBdXRvVHlwZSgpOwotICAgIH0KLSAgfSAKLSAgcmV0dXJuIGZhbHNlOwotfQotCiAvLy8gUGFyc2VGdW5jdGlvbkRlZmluaXRpb24gLSBXZSBwYXJzZWQgYW5kIHZlcmlmaWVkIHRoYXQgdGhlIHNwZWNpZmllZAogLy8vIERlY2xhcmF0b3IgaXMgd2VsbCBmb3JtZWQuICBJZiB0aGlzIGlzIGEgSyZSLXN0eWxlIGZ1bmN0aW9uLCByZWFkIHRoZQogLy8vIHBhcmFtZXRlcnMgZGVjbGFyYXRpb24tbGlzdCwgdGhlbiBzdGFydCB0aGUgY29tcG91bmQtc3RhdGVtZW50LgpAQCAtOTk2LDkgKzkyOCwxMSBAQAogICBpZiAoZ2V0TGFuZ09wdHMoKS5JbXBsaWNpdEludCAmJiBELmdldERlY2xTcGVjKCkuaXNFbXB0eSgpKSB7CiAgICAgY29uc3QgY2hhciAqUHJldlNwZWM7CiAgICAgdW5zaWduZWQgRGlhZ0lEOworICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kgPSBBY3Rpb25zLmdldEFTVENvbnRleHQoKS5nZXRQcmludGluZ1BvbGljeSgpOwogICAgIEQuZ2V0TXV0YWJsZURlY2xTcGVjKCkuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQuZ2V0SWRlbnRpZmllckxvYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZTcGVjLCBEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZTcGVjLCBEaWFnSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9saWN5KTsKICAgICBELlNldFJhbmdlQmVnaW4oRC5nZXREZWNsU3BlYygpLmdldFNvdXJjZVJhbmdlKCkuZ2V0QmVnaW4oKSk7CiAgIH0KIApAQCAtMTAyOSwxMCArOTYzLDEwIEBACiAgIGlmIChUb2suaXNOb3QodG9rOjplcXVhbCkpIHsKICAgICBBdHRyaWJ1dGVMaXN0ICpEdG9yQXR0cnMgPSBELmdldEF0dHJpYnV0ZXMoKTsKICAgICB3aGlsZSAoRHRvckF0dHJzKSB7Ci0gICAgICBpZiAoIUlzVGhyZWFkU2FmZXR5QXR0cmlidXRlKER0b3JBdHRycy0+Z2V0TmFtZSgpLT5nZXROYW1lKCkpICYmCisgICAgICBpZiAoRHRvckF0dHJzLT5pc0tub3duVG9HQ0MoKSAmJgogICAgICAgICAgICFEdG9yQXR0cnMtPmlzQ1hYMTFBdHRyaWJ1dGUoKSkgewogICAgICAgICBEaWFnKER0b3JBdHRycy0+Z2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX29uX2Z1bmN0aW9uX2RlZmluaXRpb24pCi0gICAgICAgICAgPDwgRHRvckF0dHJzLT5nZXROYW1lKCktPmdldE5hbWUoKTsKKyAgICAgICAgICA8PCBEdG9yQXR0cnMtPmdldE5hbWUoKTsKICAgICAgIH0KICAgICAgIER0b3JBdHRycyA9IER0b3JBdHRycy0+Z2V0TmV4dCgpOwogICAgIH0KQEAgLTEwNDIsOCArOTc2LDcgQEAKICAgLy8gdG9rZW5zIGFuZCBzdG9yZSB0aGVtIGZvciBsYXRlIHBhcnNpbmcgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNsYXRpb24gdW5pdC4KICAgaWYgKGdldExhbmdPcHRzKCkuRGVsYXllZFRlbXBsYXRlUGFyc2luZyAmJiBUb2suaXNOb3QodG9rOjplcXVhbCkgJiYKICAgICAgIFRlbXBsYXRlSW5mby5LaW5kID09IFBhcnNlZFRlbXBsYXRlSW5mbzo6VGVtcGxhdGUgJiYKLSAgICAgICFELmdldERlY2xTcGVjKCkuaXNDb25zdGV4cHJTcGVjaWZpZWQoKSAmJiAKLSAgICAgICFpc0Z1bmN0aW9uRGVjbGFyYXRvclJlcXVpcmluZ1JldHVyblR5cGVEZWR1Y3Rpb24oRCkpIHsKKyAgICAgIEFjdGlvbnMuY2FuRGVsYXlGdW5jdGlvbkJvZHkoRCkpIHsKICAgICBNdWx0aVRlbXBsYXRlUGFyYW1zQXJnIFRlbXBsYXRlUGFyYW1ldGVyTGlzdHMoKlRlbXBsYXRlSW5mby5UZW1wbGF0ZVBhcmFtcyk7CiAgICAgCiAgICAgUGFyc2VTY29wZSBCb2R5U2NvcGUodGhpcywgU2NvcGU6OkZuU2NvcGV8U2NvcGU6OkRlY2xTY29wZSk7CkBAIC0xMDU5LDEyICs5OTIsNyBAQAogICAgIExleFRlbXBsYXRlRnVuY3Rpb25Gb3JMYXRlUGFyc2luZyhUb2tzKTsKIAogICAgIGlmIChEUCkgewotICAgICAgRnVuY3Rpb25EZWNsICpGbkQgPSAwOwotICAgICAgaWYgKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGdW5UbXBsID0gZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KERQKSkKLSAgICAgICAgRm5EID0gRnVuVG1wbC0+Z2V0VGVtcGxhdGVkRGVjbCgpOwotICAgICAgZWxzZQotICAgICAgICBGbkQgPSBjYXN0PEZ1bmN0aW9uRGVjbD4oRFApOwotCisgICAgICBGdW5jdGlvbkRlY2wgKkZuRCA9IERQLT5nZXRBc0Z1bmN0aW9uKCk7CiAgICAgICBBY3Rpb25zLkNoZWNrRm9yRnVuY3Rpb25SZWRlZmluaXRpb24oRm5EKTsKICAgICAgIEFjdGlvbnMuTWFya0FzTGF0ZVBhcnNlZFRlbXBsYXRlKEZuRCwgRFAsIFRva3MpOwogICAgIH0KQEAgLTEwNzcsNyArMTAwNSw3IEBACiAgICAgICBBY3Rpb25zLkN1ckNvbnRleHQtPmlzVHJhbnNsYXRpb25Vbml0KCkpIHsKICAgICBQYXJzZVNjb3BlIEJvZHlTY29wZSh0aGlzLCBTY29wZTo6Rm5TY29wZXxTY29wZTo6RGVjbFNjb3BlKTsKICAgICBTY29wZSAqUGFyZW50U2NvcGUgPSBnZXRDdXJTY29wZSgpLT5nZXRQYXJlbnQoKTsKLSAgICAKKwogICAgIEQuc2V0RnVuY3Rpb25EZWZpbml0aW9uS2luZChGREtfRGVmaW5pdGlvbik7CiAgICAgRGVjbCAqRnVuY0RlY2wgPSBBY3Rpb25zLkhhbmRsZURlY2xhcmF0b3IoUGFyZW50U2NvcGUsIEQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlUZW1wbGF0ZVBhcmFtc0FyZygpKTsKQEAgLTEwODksOCArMTAxNyw5IEBACiAgICAgICBDdXJQYXJzZWRPYmpDSW1wbC0+SGFzQ0Z1bmN0aW9uID0gdHJ1ZTsKICAgICAgIHJldHVybiBGdW5jRGVjbDsKICAgICB9CisgICAgLy8gRklYTUU6IFNob3VsZCB3ZSByZWFsbHkgZmFsbCB0aHJvdWdoIGhlcmU/CiAgIH0KLSAgICAgIAorCiAgIC8vIEVudGVyIGEgc2NvcGUgZm9yIHRoZSBmdW5jdGlvbiBib2R5LgogICBQYXJzZVNjb3BlIEJvZHlTY29wZSh0aGlzLCBTY29wZTo6Rm5TY29wZXxTY29wZTo6RGVjbFNjb3BlKTsKIApAQCAtMTEwOCwyOCArMTAzNywyMiBAQAogICAvLyBzYWZlIGJlY2F1c2Ugd2UncmUgYWx3YXlzIHRoZSBzb2xlIG93bmVyLgogICBELmdldE11dGFibGVEZWNsU3BlYygpLmFib3J0KCk7CiAKLSAgaWYgKFRvay5pcyh0b2s6OmVxdWFsKSkgeworICBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6ZXF1YWwpKSB7CiAgICAgYXNzZXJ0KGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmICJPbmx5IEMrKyBmdW5jdGlvbiBkZWZpbml0aW9ucyBoYXZlICc9JyIpOwotICAgIENvbnN1bWVUb2tlbigpOwotCiAgICAgQWN0aW9ucy5BY3RPbkZpbmlzaEZ1bmN0aW9uQm9keShSZXMsIDAsIGZhbHNlKTsKICAKICAgICBib29sIERlbGV0ZSA9IGZhbHNlOwogICAgIFNvdXJjZUxvY2F0aW9uIEtXTG9jOwotICAgIGlmIChUb2suaXModG9rOjprd19kZWxldGUpKSB7Ci0gICAgICBEaWFnKFRvaywgZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMSA/Ci0gICAgICAgICAgIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2RlbGV0ZWRfZnVuY3Rpb24gOgotICAgICAgICAgICBkaWFnOjpleHRfZGVsZXRlZF9mdW5jdGlvbik7Ci0KLSAgICAgIEtXTG9jID0gQ29uc3VtZVRva2VuKCk7CisgICAgaWYgKFRyeUNvbnN1bWVUb2tlbih0b2s6Omt3X2RlbGV0ZSwgS1dMb2MpKSB7CisgICAgICBEaWFnKEtXTG9jLCBnZXRMYW5nT3B0cygpLkNQbHVzUGx1czExCisgICAgICAgICAgICAgICAgICAgICAgPyBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9kZWxldGVkX2Z1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjpleHRfZGVsZXRlZF9mdW5jdGlvbik7CiAgICAgICBBY3Rpb25zLlNldERlY2xEZWxldGVkKFJlcywgS1dMb2MpOwogICAgICAgRGVsZXRlID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKFRvay5pcyh0b2s6Omt3X2RlZmF1bHQpKSB7Ci0gICAgICBEaWFnKFRvaywgZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMSA/Ci0gICAgICAgICAgIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2RlZmF1bHRlZF9mdW5jdGlvbiA6Ci0gICAgICAgICAgIGRpYWc6OmV4dF9kZWZhdWx0ZWRfZnVuY3Rpb24pOwotCi0gICAgICBLV0xvYyA9IENvbnN1bWVUb2tlbigpOworICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZVRva2VuKHRvazo6a3dfZGVmYXVsdCwgS1dMb2MpKSB7CisgICAgICBEaWFnKEtXTG9jLCBnZXRMYW5nT3B0cygpLkNQbHVzUGx1czExCisgICAgICAgICAgICAgICAgICAgICAgPyBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9kZWZhdWx0ZWRfZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6OmV4dF9kZWZhdWx0ZWRfZnVuY3Rpb24pOwogICAgICAgQWN0aW9ucy5TZXREZWNsRGVmYXVsdGVkKFJlcywgS1dMb2MpOwogICAgIH0gZWxzZSB7CiAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJmdW5jdGlvbiBkZWZpbml0aW9uIGFmdGVyID0gbm90ICdkZWxldGUnIG9yICdkZWZhdWx0JyIpOwpAQCAtMTEzOSw5ICsxMDYyLDkgQEAKICAgICAgIERpYWcoS1dMb2MsIGRpYWc6OmVycl9kZWZhdWx0X2RlbGV0ZV9pbl9tdWx0aXBsZV9kZWNsYXJhdGlvbikKICAgICAgICAgPDwgRGVsZXRlOwogICAgICAgU2tpcFVudGlsKHRvazo6c2VtaSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEV4cGVjdEFuZENvbnN1bWUodG9rOjpzZW1pLCBkaWFnOjplcnJfZXhwZWN0ZWRfc2VtaV9hZnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlID8gImRlbGV0ZSIgOiAiZGVmYXVsdCIsIHRvazo6c2VtaSk7CisgICAgfSBlbHNlIGlmIChFeHBlY3RBbmRDb25zdW1lKHRvazo6c2VtaSwgZGlhZzo6ZXJyX2V4cGVjdGVkX2FmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGUgPyAiZGVsZXRlIiA6ICJkZWZhdWx0IikpIHsKKyAgICAgIFNraXBVbnRpbCh0b2s6OnNlbWkpOwogICAgIH0KIAogICAgIHJldHVybiBSZXM7CkBAIC0xMTk1LDkgKzExMTgsOCBAQAogICAgIC8vIE5PVEU6IEdDQyBqdXN0IG1ha2VzIHRoaXMgYW4gZXh0LXdhcm4uICBJdCdzIG5vdCBjbGVhciB3aGF0IGl0IGRvZXMgd2l0aAogICAgIC8vIHRoZSBkZWNsYXJhdGlvbnMgdGhvdWdoLiAgSXQncyB0cml2aWFsIHRvIGlnbm9yZSB0aGVtLCByZWFsbHkgaGFyZCB0byBkbwogICAgIC8vIGFueXRoaW5nIGVsc2Ugd2l0aCB0aGVtLgotICAgIGlmIChUb2suaXModG9rOjpzZW1pKSkgeworICAgIGlmIChUcnlDb25zdW1lVG9rZW4odG9rOjpzZW1pKSkgewogICAgICAgRGlhZyhEU1N0YXJ0LCBkaWFnOjplcnJfZGVjbGFyYXRpb25fZG9lc19ub3RfZGVjbGFyZV9wYXJhbSk7Ci0gICAgICBDb25zdW1lVG9rZW4oKTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIApAQCAtMTIzNywyMCArMTE1OSwyMCBAQAogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyA7ICsraSkgewogICAgICAgICAgIC8vIEM5OSA2LjkuMXA2OiB0aG9zZSBkZWNsYXJhdG9ycyBzaGFsbCBkZWNsYXJlIG9ubHkgaWRlbnRpZmllcnMgZnJvbQogICAgICAgICAgIC8vIHRoZSBpZGVudGlmaWVyIGxpc3QuCi0gICAgICAgICAgaWYgKGkgPT0gRlRJLk51bUFyZ3MpIHsKKyAgICAgICAgICBpZiAoaSA9PSBGVEkuTnVtUGFyYW1zKSB7CiAgICAgICAgICAgICBEaWFnKFBhcm1EZWNsYXJhdG9yLmdldElkZW50aWZpZXJMb2MoKSwgZGlhZzo6ZXJyX25vX21hdGNoaW5nX3BhcmFtKQogICAgICAgICAgICAgICA8PCBQYXJtRGVjbGFyYXRvci5nZXRJZGVudGlmaWVyKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAKLSAgICAgICAgICBpZiAoRlRJLkFyZ0luZm9baV0uSWRlbnQgPT0gUGFybURlY2xhcmF0b3IuZ2V0SWRlbnRpZmllcigpKSB7CisgICAgICAgICAgaWYgKEZUSS5QYXJhbXNbaV0uSWRlbnQgPT0gUGFybURlY2xhcmF0b3IuZ2V0SWRlbnRpZmllcigpKSB7CiAgICAgICAgICAgICAvLyBSZWplY3QgcmVkZWZpbml0aW9ucyBvZiBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgaWYgKEZUSS5BcmdJbmZvW2ldLlBhcmFtKSB7CisgICAgICAgICAgICBpZiAoRlRJLlBhcmFtc1tpXS5QYXJhbSkgewogICAgICAgICAgICAgICBEaWFnKFBhcm1EZWNsYXJhdG9yLmdldElkZW50aWZpZXJMb2MoKSwKICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfcGFyYW1fcmVkZWZpbml0aW9uKQogICAgICAgICAgICAgICAgICA8PCBQYXJtRGVjbGFyYXRvci5nZXRJZGVudGlmaWVyKCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBGVEkuQXJnSW5mb1tpXS5QYXJhbSA9IFBhcmFtOworICAgICAgICAgICAgICBGVEkuUGFyYW1zW2ldLlBhcmFtID0gUGFyYW07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CkBAIC0xMjcxLDEyICsxMTkzLDE0IEBACiAgICAgICBQYXJzZURlY2xhcmF0b3IoUGFybURlY2xhcmF0b3IpOwogICAgIH0KIAotICAgIGlmIChFeHBlY3RBbmRDb25zdW1lU2VtaShkaWFnOjplcnJfZXhwZWN0ZWRfc2VtaV9kZWNsYXJhdGlvbikpIHsKLSAgICAgIC8vIFNraXAgdG8gZW5kIG9mIGJsb2NrIG9yIHN0YXRlbWVudAotICAgICAgU2tpcFVudGlsKHRvazo6c2VtaSk7Ci0gICAgICBpZiAoVG9rLmlzKHRvazo6c2VtaSkpCi0gICAgICAgIENvbnN1bWVUb2tlbigpOwotICAgIH0KKyAgICAvLyBDb25zdW1lICc7JyBhbmQgY29udGludWUgcGFyc2luZy4KKyAgICBpZiAoIUV4cGVjdEFuZENvbnN1bWVTZW1pKGRpYWc6OmVycl9leHBlY3RlZF9zZW1pX2RlY2xhcmF0aW9uKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gT3RoZXJ3aXNlIHJlY292ZXIgYnkgc2tpcHBpbmcgdG8gbmV4dCBzZW1pIG9yIG1hbmRhdG9yeSBmdW5jdGlvbiBib2R5LgorICAgIGlmIChTa2lwVW50aWwodG9rOjpsX2JyYWNlLCBTdG9wQXRTZW1pIHwgU3RvcEJlZm9yZU1hdGNoKSkKKyAgICAgIGJyZWFrOworICAgIFRyeUNvbnN1bWVUb2tlbih0b2s6OnNlbWkpOwogICB9CiAKICAgLy8gVGhlIGFjdGlvbnMgbW9kdWxlIG11c3QgdmVyaWZ5IHRoYXQgYWxsIGFyZ3VtZW50cyB3ZXJlIGRlY2xhcmVkLgpAQCAtMTM0MCwxNiArMTI2NCwxNSBAQAogCiAgIEV4cHJSZXN1bHQgUmVzdWx0KFBhcnNlQXNtU3RyaW5nTGl0ZXJhbCgpKTsKIAotICBpZiAoUmVzdWx0LmlzSW52YWxpZCgpKSB7Ci0gICAgU2tpcFVudGlsKHRvazo6cl9wYXJlbiwgU3RvcEF0U2VtaSB8IFN0b3BCZWZvcmVNYXRjaCk7Ci0gICAgaWYgKEVuZExvYykKLSAgICAgICpFbmRMb2MgPSBUb2suZ2V0TG9jYXRpb24oKTsKLSAgICBDb25zdW1lQW55VG9rZW4oKTsKLSAgfSBlbHNlIHsKKyAgaWYgKCFSZXN1bHQuaXNJbnZhbGlkKCkpIHsKICAgICAvLyBDbG9zZSB0aGUgcGFyZW4gYW5kIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGVuZCBicmFja2V0CiAgICAgVC5jb25zdW1lQ2xvc2UoKTsKICAgICBpZiAoRW5kTG9jKQogICAgICAgKkVuZExvYyA9IFQuZ2V0Q2xvc2VMb2NhdGlvbigpOworICB9IGVsc2UgaWYgKFNraXBVbnRpbCh0b2s6OnJfcGFyZW4sIFN0b3BBdFNlbWkgfCBTdG9wQmVmb3JlTWF0Y2gpKSB7CisgICAgaWYgKEVuZExvYykKKyAgICAgICpFbmRMb2MgPSBUb2suZ2V0TG9jYXRpb24oKTsKKyAgICBDb25zdW1lUGFyZW4oKTsKICAgfQogCiAgIHJldHVybiBSZXN1bHQ7CkBAIC0xNDMwLDggKzEzNTMsOCBAQAogCiAgIC8vIExvb2sgdXAgYW5kIGNsYXNzaWZ5IHRoZSBpZGVudGlmaWVyLiBXZSBkb24ndCBwZXJmb3JtIGFueSB0eXBvLWNvcnJlY3Rpb24KICAgLy8gYWZ0ZXIgYSBzY29wZSBzcGVjaWZpZXIsIGJlY2F1c2UgaW4gZ2VuZXJhbCB3ZSBjYW4ndCByZWNvdmVyIGZyb20gdHlwb3MKLSAgLy8gdGhlcmUgKGVnLCBhZnRlciBjb3JyZWN0aW5nICdBOjp0ZW1wYWx0ZSBCPFg+OjpDJywgd2Ugd291bGQgbmVlZCB0byBqdW1wCi0gIC8vIGJhY2sgaW50byBzY29wZSBzcGVjaWZpZXIgcGFyc2luZykuCisgIC8vIHRoZXJlIChlZywgYWZ0ZXIgY29ycmVjdGluZyAnQTo6dGVtcGFsdGUgQjxYPjo6QycgW3NpY10sIHdlIHdvdWxkIG5lZWQgdG8KKyAgLy8ganVtcCBiYWNrIGludG8gc2NvcGUgc3BlY2lmaWVyIHBhcnNpbmcpLgogICBTZW1hOjpOYW1lQ2xhc3NpZmljYXRpb24gQ2xhc3NpZmljYXRpb24KICAgICA9IEFjdGlvbnMuQ2xhc3NpZnlOYW1lKGdldEN1clNjb3BlKCksIFNTLCBOYW1lLCBOYW1lTG9jLCBOZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNBZGRyZXNzT2ZPcGVyYW5kLCBTUy5pc0VtcHR5KCkgPyBDQ0MgOiAwKTsKQEAgLTE1MDQsMTYgKzE0MjcsMzQgQEAKIH0KIAogYm9vbCBQYXJzZXI6OlRyeUtleXdvcmRJZGVudEZhbGxiYWNrKGJvb2wgRGlzYWJsZUtleXdvcmQpIHsKLSAgYXNzZXJ0KFRvay5pc05vdCh0b2s6OmlkZW50aWZpZXIpKTsKKyAgYXNzZXJ0KCFUb2suaXModG9rOjppZGVudGlmaWVyKSAmJiAhVG9rLmlzQW5ub3RhdGlvbigpKTsKICAgRGlhZyhUb2ssIGRpYWc6OmV4dF9rZXl3b3JkX2FzX2lkZW50KQogICAgIDw8IFBQLmdldFNwZWxsaW5nKFRvaykKICAgICA8PCBEaXNhYmxlS2V5d29yZDsKLSAgaWYgKERpc2FibGVLZXl3b3JkKQotICAgIFRvay5nZXRJZGVudGlmaWVySW5mbygpLT5SZXZlcnRUb2tlbklEVG9JZGVudGlmaWVyKCk7CisgIGlmIChEaXNhYmxlS2V5d29yZCkgeworICAgIElkZW50aWZpZXJJbmZvICpJSSA9IFRvay5nZXRJZGVudGlmaWVySW5mbygpOworICAgIENvbnRleHR1YWxLZXl3b3Jkc1tJSV0gPSBUb2suZ2V0S2luZCgpOworICAgIElJLT5SZXZlcnRUb2tlbklEVG9JZGVudGlmaWVyKCk7CisgIH0KICAgVG9rLnNldEtpbmQodG9rOjppZGVudGlmaWVyKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgUGFyc2VyOjpUcnlJZGVudEtleXdvcmRVcGdyYWRlKCkgeworICBhc3NlcnQoVG9rLmlzKHRvazo6aWRlbnRpZmllcikpOworICBjb25zdCBJZGVudGlmaWVySW5mbyAqSUkgPSBUb2suZ2V0SWRlbnRpZmllckluZm8oKTsKKyAgYXNzZXJ0KElJLT5oYXNSZXZlcnRlZFRva2VuSURUb0lkZW50aWZpZXIoKSk7CisgIC8vIElmIHdlIGZpbmQgdGhhdCB0aGlzIGlzIGluIGZhY3QgdGhlIG5hbWUgb2YgYSB0eXBlIHRyYWl0LAorICAvLyB1cGRhdGUgdGhlIHRva2VuIGtpbmQgaW4gcGxhY2UgYW5kIHBhcnNlIGFnYWluIHRvIHRyZWF0IGl0IGFzCisgIC8vIHRoZSBhcHByb3ByaWF0ZSBraW5kIG9mIHR5cGUgdHJhaXQuCisgIGxsdm06OlNtYWxsRGVuc2VNYXA8Y29uc3QgSWRlbnRpZmllckluZm8gKiwgdG9rOjpUb2tlbktpbmQ+OjppdGVyYXRvciBLbm93biA9CisgICAgICBDb250ZXh0dWFsS2V5d29yZHMuZmluZChJSSk7CisgIGlmIChLbm93biA9PSBDb250ZXh0dWFsS2V5d29yZHMuZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBUb2suc2V0S2luZChLbm93bi0+c2Vjb25kKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKIC8vLyBUcnlBbm5vdGF0ZVR5cGVPclNjb3BlVG9rZW4gLSBJZiB0aGUgY3VycmVudCB0b2tlbiBwb3NpdGlvbiBpcyBvbiBhCiAvLy8gdHlwZW5hbWUgKHBvc3NpYmx5IHF1YWxpZmllZCBpbiBDKyspIG9yIGEgQysrIHNjb3BlIHNwZWNpZmllciBub3QgZm9sbG93ZWQKIC8vLyBieSBhIHR5cGVuYW1lLCBUcnlBbm5vdGF0ZVR5cGVPclNjb3BlVG9rZW4gd2lsbCByZXBsYWNlIG9uZSBvciBtb3JlIHRva2VucwpAQCAtMTU0OSw3ICsxNDkwLDcgQEAKICAgICAvLyBXZSB3aWxsIGNvbnN1bWUgdGhlIHR5cGVkZWYgdG9rZW4gaGVyZSBhbmQgcHV0IGl0IGJhY2sgYWZ0ZXIgd2UgaGF2ZQogICAgIC8vIHBhcnNlZCB0aGUgZmlyc3QgaWRlbnRpZmllciwgdHJhbnNmb3JtaW5nIGl0IGludG8gc29tZXRoaW5nIG1vcmUgbGlrZToKICAgICAvLyAgIHR5cGVuYW1lIFRfOjpEIHR5cGVkZWYgRDsKLSAgICBpZiAoZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRNb2RlICYmIE5leHRUb2tlbigpLmlzKHRvazo6a3dfdHlwZWRlZikpIHsKKyAgICBpZiAoZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0ICYmIE5leHRUb2tlbigpLmlzKHRvazo6a3dfdHlwZWRlZikpIHsKICAgICAgIFRva2VuIFR5cGVkZWZUb2tlbjsKICAgICAgIFBQLkxleChUeXBlZGVmVG9rZW4pOwogICAgICAgYm9vbCBSZXN1bHQgPSBUcnlBbm5vdGF0ZVR5cGVPclNjb3BlVG9rZW4oRW50ZXJpbmdDb250ZXh0LCBOZWVkVHlwZSk7CkBAIC0xNjAxLDcgKzE1NDIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvay5nZXRMb2NhdGlvbigpKTsKICAgICB9IGVsc2UgaWYgKFRvay5pcyh0b2s6OmFubm90X3RlbXBsYXRlX2lkKSkgewogICAgICAgVGVtcGxhdGVJZEFubm90YXRpb24gKlRlbXBsYXRlSWQgPSB0YWtlVGVtcGxhdGVJZEFubm90YXRpb24oVG9rKTsKLSAgICAgIGlmIChUZW1wbGF0ZUlkLT5LaW5kID09IFROS19GdW5jdGlvbl90ZW1wbGF0ZSkgeworICAgICAgaWYgKFRlbXBsYXRlSWQtPktpbmQgIT0gVE5LX1R5cGVfdGVtcGxhdGUgJiYKKyAgICAgICAgICBUZW1wbGF0ZUlkLT5LaW5kICE9IFROS19EZXBlbmRlbnRfdGVtcGxhdGVfbmFtZSkgewogICAgICAgICBEaWFnKFRvaywgZGlhZzo6ZXJyX3R5cGVuYW1lX3JlZmVyc190b19ub25fdHlwZV90ZW1wbGF0ZSkKICAgICAgICAgICA8PCBUb2suZ2V0QW5ub3RhdGlvblJhbmdlKCk7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMTcyNSw4ICsxNjY3LDcgQEAKICAgICAgIC8vIGFubm90YXRpb24gdG9rZW4gdG8gYSB0eXBlIGFubm90YXRpb24gdG9rZW4gbm93LgogICAgICAgQW5ub3RhdGVUZW1wbGF0ZUlkVG9rZW5Bc1R5cGUoKTsKICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKFRlbXBsYXRlSWQtPktpbmQgPT0gVE5LX1Zhcl90ZW1wbGF0ZSkKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgIH0KIAogICBpZiAoU1MuaXNFbXB0eSgpKQpAQCAtMTc4MCw4ICsxNzIxLDggQEAKICAgY2FzZSB0b2s6OnBpcGVlcXVhbDogICAgICAgICAgIC8vIHw9CiAgIGNhc2UgdG9rOjplcXVhbGVxdWFsOiAgICAgICAgICAvLyA9PQogICAgIERpYWcoVG9rLCBkaWFnOjplcnJfaW52YWxpZF90b2tlbl9hZnRlcl9kZWNsYXJhdG9yX3N1Z2dlc3RfZXF1YWwpCi0gICAgICA8PCBnZXRUb2tlblNpbXBsZVNwZWxsaW5nKEtpbmQpCi0gICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlcGxhY2VtZW50KFNvdXJjZVJhbmdlKFRvay5nZXRMb2NhdGlvbigpKSwgIj0iKTsKKyAgICAgICAgPDwgS2luZAorICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlcGxhY2VtZW50KFNvdXJjZVJhbmdlKFRvay5nZXRMb2NhdGlvbigpKSwgIj0iKTsKICAgY2FzZSB0b2s6OmVxdWFsOgogICAgIHJldHVybiB0cnVlOwogICB9CkBAIC0xOTEwLDcgKzE4NTEsNyBAQAogICAKICAgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyIEJyYWNlcygqdGhpcywgdG9rOjpsX2JyYWNlKTsKICAgaWYgKEJyYWNlcy5jb25zdW1lT3BlbigpKSB7Ci0gICAgRGlhZyhUb2ssIGRpYWc6OmVycl9leHBlY3RlZF9sYnJhY2UpOworICAgIERpYWcoVG9rLCBkaWFnOjplcnJfZXhwZWN0ZWQpIDw8IHRvazo6bF9icmFjZTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtMTkyOCwxNCArMTg2OSwxNSBAQAogICB9CiAKICAgLy8gUGFyc2UgdGhlIGRlY2xhcmF0aW9ucy4KLSAgd2hpbGUgKFRvay5pc05vdCh0b2s6OnJfYnJhY2UpICYmIFRvay5pc05vdCh0b2s6OmVvZikpIHsKKyAgLy8gRklYTUU6IFN1cHBvcnQgbW9kdWxlIGltcG9ydCB3aXRoaW4gX19pZl9leGlzdHM/CisgIHdoaWxlIChUb2suaXNOb3QodG9rOjpyX2JyYWNlKSAmJiAhaXNFb2ZPckVvbSgpKSB7CiAgICAgUGFyc2VkQXR0cmlidXRlc1dpdGhSYW5nZSBhdHRycyhBdHRyRmFjdG9yeSk7CiAgICAgTWF5YmVQYXJzZUNYWDExQXR0cmlidXRlcyhhdHRycyk7CiAgICAgTWF5YmVQYXJzZU1pY3Jvc29mdEF0dHJpYnV0ZXMoYXR0cnMpOwogICAgIERlY2xHcm91cFB0clR5IFJlc3VsdCA9IFBhcnNlRXh0ZXJuYWxEZWNsYXJhdGlvbihhdHRycyk7CiAgICAgaWYgKFJlc3VsdCAmJiAhZ2V0Q3VyU2NvcGUoKS0+Z2V0UGFyZW50KCkpCiAgICAgICBBY3Rpb25zLmdldEFTVENvbnN1bWVyKCkuSGFuZGxlVG9wTGV2ZWxEZWNsKFJlc3VsdC5nZXQoKSk7Ci0gIH0gICAgIAorICB9CiAgIEJyYWNlcy5jb25zdW1lQ2xvc2UoKTsKIH0KIApAQCAtMTk5MSwxNyArMTkzMywyMCBAQAogICBQLkRpYWcoUC5Ub2ssIGRpYWc6OmVycl9icmFja2V0X2RlcHRoX2V4Y2VlZGVkKQogICAgIDw8IFAuZ2V0TGFuZ09wdHMoKS5CcmFja2V0RGVwdGg7CiAgIFAuRGlhZyhQLlRvaywgZGlhZzo6bm90ZV9icmFja2V0X2RlcHRoKTsKLSAgUC5Ta2lwVW50aWwodG9rOjplb2YpOwotICByZXR1cm4gdHJ1ZTsgIAorICBQLmN1dE9mZlBhcnNpbmcoKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyOjpleHBlY3RBbmRDb25zdW1lKHVuc2lnbmVkIERpYWdJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBTa2lwVG9Ub2MgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBTa2lwVG9Ub2spIHsKICAgTE9wZW4gPSBQLlRvay5nZXRMb2NhdGlvbigpOwotICBpZiAoUC5FeHBlY3RBbmRDb25zdW1lKEtpbmQsIERpYWdJRCwgTXNnLCBTa2lwVG9Ub2MpKQorICBpZiAoUC5FeHBlY3RBbmRDb25zdW1lKEtpbmQsIERpYWdJRCwgTXNnKSkgeworICAgIGlmIChTa2lwVG9Ub2sgIT0gdG9rOjp1bmtub3duKQorICAgICAgUC5Ta2lwVW50aWwoU2tpcFRvVG9rLCBQYXJzZXI6OlN0b3BBdFNlbWkpOwogICAgIHJldHVybiB0cnVlOwotICAKKyAgfQorCiAgIGlmIChnZXREZXB0aCgpIDwgTWF4RGVwdGgpCiAgICAgcmV0dXJuIGZhbHNlOwogICAgIApAQCAtMjAxMCwxNyArMTk1NSw5IEBACiAKIGJvb2wgQmFsYW5jZWREZWxpbWl0ZXJUcmFja2VyOjpkaWFnbm9zZU1pc3NpbmdDbG9zZSgpIHsKICAgYXNzZXJ0KCFQLlRvay5pcyhDbG9zZSkgJiYgIlNob3VsZCBoYXZlIGNvbnN1bWVkIGNsb3NpbmcgZGVsaW1pdGVyIik7Ci0gIAotICBjb25zdCBjaGFyICpMSFNOYW1lID0gInVua25vd24iOwotICBkaWFnOjpraW5kIERJRDsKLSAgc3dpdGNoIChDbG9zZSkgewotICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGJhbGFuY2VkIHRva2VuIik7Ci0gIGNhc2UgdG9rOjpyX3BhcmVuIDogTEhTTmFtZSA9ICIoIjsgRElEID0gZGlhZzo6ZXJyX2V4cGVjdGVkX3JwYXJlbjsgYnJlYWs7Ci0gIGNhc2UgdG9rOjpyX2JyYWNlIDogTEhTTmFtZSA9ICJ7IjsgRElEID0gZGlhZzo6ZXJyX2V4cGVjdGVkX3JicmFjZTsgYnJlYWs7Ci0gIGNhc2UgdG9rOjpyX3NxdWFyZTogTEhTTmFtZSA9ICJbIjsgRElEID0gZGlhZzo6ZXJyX2V4cGVjdGVkX3JzcXVhcmU7IGJyZWFrOwotICB9Ci0gIFAuRGlhZyhQLlRvaywgRElEKTsKLSAgUC5EaWFnKExPcGVuLCBkaWFnOjpub3RlX21hdGNoaW5nKSA8PCBMSFNOYW1lOworCisgIFAuRGlhZyhQLlRvaywgZGlhZzo6ZXJyX2V4cGVjdGVkKSA8PCBDbG9zZTsKKyAgUC5EaWFnKExPcGVuLCBkaWFnOjpub3RlX21hdGNoaW5nKSA8PCBLaW5kOwogCiAgIC8vIElmIHdlJ3JlIG5vdCBhbHJlYWR5IGF0IHNvbWUga2luZCBvZiBjbG9zaW5nIGJyYWNrZXQsIHNraXAgdG8gb3VyIGNsb3NpbmcKICAgLy8gdG9rZW4uCmRpZmYgLS1naXQgYS9saWIvUGFyc2UvUkFJSU9iamVjdHNGb3JQYXJzZXIuaCBiL2xpYi9QYXJzZS9SQUlJT2JqZWN0c0ZvclBhcnNlci5oCmluZGV4IGY2OGEyZTAuLjcxMWRjMmEgMTAwNjQ0Ci0tLSBhL2xpYi9QYXJzZS9SQUlJT2JqZWN0c0ZvclBhcnNlci5oCisrKyBiL2xpYi9QYXJzZS9SQUlJT2JqZWN0c0ZvclBhcnNlci5oCkBAIC00MTUsOCArNDE1LDggQEAKICAgICAgIAogICAgICAgcmV0dXJuIGRpYWdub3NlT3ZlcmZsb3coKTsKICAgICB9Ci0gICAgCi0gICAgYm9vbCBleHBlY3RBbmRDb25zdW1lKHVuc2lnbmVkIERpYWdJRCwKKworICAgIGJvb2wgZXhwZWN0QW5kQ29uc3VtZSh1bnNpZ25lZCBEaWFnSUQgPSBkaWFnOjplcnJfZXhwZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk1zZyA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0b2s6OlRva2VuS2luZCBTa2lwVG9Ub2sgPSB0b2s6OnVua25vd24pOwogICAgIGJvb2wgY29uc3VtZUNsb3NlKCkgewpkaWZmIC0tZ2l0IGEvbGliL1Jld3JpdGUvQ29yZS9DTWFrZUxpc3RzLnR4dCBiL2xpYi9SZXdyaXRlL0NvcmUvQ01ha2VMaXN0cy50eHQKaW5kZXggMDc5NzgxOC4uODk2MzgyYyAxMDA2NDQKLS0tIGEvbGliL1Jld3JpdGUvQ29yZS9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvUmV3cml0ZS9Db3JlL0NNYWtlTGlzdHMudHh0CkBAIC0xLDI0ICsxLDE2IEBACitzZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMKKyAgU3VwcG9ydAorICApCisKIGFkZF9jbGFuZ19saWJyYXJ5KGNsYW5nUmV3cml0ZUNvcmUKICAgRGVsdGFUcmVlLmNwcAogICBIVE1MUmV3cml0ZS5jcHAKICAgUmV3cml0ZVJvcGUuY3BwCiAgIFJld3JpdGVyLmNwcAogICBUb2tlblJld3JpdGVyLmNwcAotICApCiAKLWFkZF9kZXBlbmRlbmNpZXMoY2xhbmdSZXdyaXRlQ29yZQotICBDbGFuZ0F0dHJDbGFzc2VzCi0gIENsYW5nQXR0ckxpc3QKLSAgQ2xhbmdBdHRyUGFyc2VkQXR0ckxpc3QKLSAgQ2xhbmdDb21tZW50Tm9kZXMKLSAgQ2xhbmdEZWNsTm9kZXMKLSAgQ2xhbmdEaWFnbm9zdGljQ29tbW9uCi0gIENsYW5nRGlhZ25vc3RpY0Zyb250ZW5kCi0gIENsYW5nU3RtdE5vZGVzCi0gICkKLQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNsYW5nUmV3cml0ZUNvcmUKLSAgY2xhbmdCYXNpYworICBMSU5LX0xJQlMKICAgY2xhbmdBU1QKLSAgY2xhbmdQYXJzZQorICBjbGFuZ0Jhc2ljCisgIGNsYW5nTGV4CiAgICkKZGlmZiAtLWdpdCBhL2xpYi9SZXdyaXRlL0NvcmUvSFRNTFJld3JpdGUuY3BwIGIvbGliL1Jld3JpdGUvQ29yZS9IVE1MUmV3cml0ZS5jcHAKaW5kZXggNGRhMDBhOC4uMjc1ZmJkMCAxMDA2NDQKLS0tIGEvbGliL1Jld3JpdGUvQ29yZS9IVE1MUmV3cml0ZS5jcHAKKysrIGIvbGliL1Jld3JpdGUvQ29yZS9IVE1MUmV3cml0ZS5jcHAKQEAgLTcsNyArNyw3IEBACiAvLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIC8vCi0vLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIEhUTUxSZXdyaXRlciBjbGFzLCB3aGljaCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUKKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgSFRNTFJld3JpdGVyIGNsYXNzLCB3aGljaCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUKIC8vICB0ZXh0IG9mIGEgc291cmNlIGZpbGUgaW50byBwcmV0dGlmaWVkIEhUTUwuCiAvLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTE3LDExICsxNywxMSBAQAogI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvVG9rZW5Db25jYXRlbmF0aW9uLmgiCiAjaW5jbHVkZSAiY2xhbmcvUmV3cml0ZS9Db3JlL1Jld3JpdGVyLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiAKIApkaWZmIC0tZ2l0IGEvbGliL1Jld3JpdGUvQ29yZS9SZXdyaXRlci5jcHAgYi9saWIvUmV3cml0ZS9Db3JlL1Jld3JpdGVyLmNwcAppbmRleCBhZmIxMDgwLi4wODM1MmEyIDEwMDY0NAotLS0gYS9saWIvUmV3cml0ZS9Db3JlL1Jld3JpdGVyLmNwcAorKysgYi9saWIvUmV3cml0ZS9Db3JlL1Jld3JpdGVyLmNwcApAQCAtMjEsMTMgKzIxLDE3IEBACiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9MZXhlci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvY29uZmlnLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIAogcmF3X29zdHJlYW0gJlJld3JpdGVCdWZmZXI6OndyaXRlKHJhd19vc3RyZWFtICZvcykgY29uc3QgewotICAvLyBGSVhNRTogZWxpbWluYXRlIHRoZSBjb3B5IGJ5IHdyaXRpbmcgb3V0IGVhY2ggY2h1bmsgYXQgYSB0aW1lCi0gIG9zIDw8IHN0ZDo6c3RyaW5nKGJlZ2luKCksIGVuZCgpKTsKKyAgLy8gV2FsayBSZXdyaXRlUm9wZSBjaHVua3MgZWZmaWNpZW50bHkgdXNpbmcgTW92ZVRvTmV4dFBpZWNlKCkgaW5zdGVhZCBvZiB0aGUKKyAgLy8gY2hhcmFjdGVyIGl0ZXJhdG9yLgorICBmb3IgKFJvcGVQaWVjZUJUcmVlSXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOworICAgICAgIEkuTW92ZVRvTmV4dFBpZWNlKCkpCisgICAgb3MgPDwgSS5waWVjZSgpOwogICByZXR1cm4gb3M7CiB9CiAKQEAgLTQ0Niw3ICs0NTAsNyBAQAogICAgIGlmICghb2soKSkgcmV0dXJuOwogCiAgICAgRmlsZVN0cmVhbS0+Zmx1c2goKTsKLSNpZmRlZiBfV0lOMzIKKyNpZmRlZiBMTFZNX09OX1dJTjMyCiAgICAgLy8gV2luMzIgZG9lcyBub3QgYWxsb3cgcmVuYW1lL3JlbW92aW5nIG9wZW5lZCBmaWxlcy4KICAgICBGaWxlU3RyZWFtLnJlc2V0KCk7CiAjZW5kaWYKQEAgLTQ1NSwyMSArNDU5LDIwIEBACiAgICAgICBBbGxXcml0dGVuID0gZmFsc2U7CiAgICAgICBEaWFnbm9zdGljcy5SZXBvcnQoY2xhbmc6OmRpYWc6OmVycl91bmFibGVfdG9fcmVuYW1lX3RlbXApCiAgICAgICAgIDw8IFRlbXBGaWxlbmFtZSA8PCBGaWxlbmFtZSA8PCBlYy5tZXNzYWdlKCk7Ci0gICAgICBib29sIGV4aXN0ZWQ7CiAgICAgICAvLyBJZiB0aGUgcmVtb3ZlIGZhaWxzLCB0aGVyZSdzIG5vdCBhIGxvdCB3ZSBjYW4gZG8gLSB0aGlzIGlzIGFscmVhZHkgYW4KICAgICAgIC8vIGVycm9yLgotICAgICAgbGx2bTo6c3lzOjpmczo6cmVtb3ZlKFRlbXBGaWxlbmFtZS5zdHIoKSwgZXhpc3RlZCk7CisgICAgICBsbHZtOjpzeXM6OmZzOjpyZW1vdmUoVGVtcEZpbGVuYW1lLnN0cigpKTsKICAgICB9CiAgIH0KIAotICBib29sIG9rKCkgeyByZXR1cm4gRmlsZVN0cmVhbS5pc1ZhbGlkKCk7IH0KKyAgYm9vbCBvaygpIHsgcmV0dXJuIChib29sKUZpbGVTdHJlYW07IH0KICAgcmF3X29zdHJlYW0gJmdldFN0cmVhbSgpIHsgcmV0dXJuICpGaWxlU3RyZWFtOyB9CiAKIHByaXZhdGU6CiAgIERpYWdub3N0aWNzRW5naW5lICZEaWFnbm9zdGljczsKICAgU3RyaW5nUmVmIEZpbGVuYW1lOwogICBTbWFsbFN0cmluZzwxMjg+IFRlbXBGaWxlbmFtZTsKLSAgT3duaW5nUHRyPGxsdm06OnJhd19mZF9vc3RyZWFtPiBGaWxlU3RyZWFtOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6cmF3X2ZkX29zdHJlYW0+IEZpbGVTdHJlYW07CiAgIGJvb2wgJkFsbFdyaXR0ZW47CiB9OwogfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvbGliL1Jld3JpdGUvRnJvbnRlbmQvQ01ha2VMaXN0cy50eHQgYi9saWIvUmV3cml0ZS9Gcm9udGVuZC9DTWFrZUxpc3RzLnR4dAppbmRleCA5MDNhM2VmLi44NWFmOTdkIDEwMDY0NAotLS0gYS9saWIvUmV3cml0ZS9Gcm9udGVuZC9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvUmV3cml0ZS9Gcm9udGVuZC9DTWFrZUxpc3RzLnR4dApAQCAtMSwzICsxLDcgQEAKK3NldChMTFZNX0xJTktfQ09NUE9ORU5UUworICBTdXBwb3J0CisgICkKKwogYWRkX2NsYW5nX2xpYnJhcnkoY2xhbmdSZXdyaXRlRnJvbnRlbmQKICAgRml4SXRSZXdyaXRlci5jcHAKICAgRnJvbnRlbmRBY3Rpb25zLmNwcApAQCAtNywyMyArMTEsMTIgQEAKICAgUmV3cml0ZU1vZGVybk9iakMuY3BwCiAgIFJld3JpdGVPYmpDLmNwcAogICBSZXdyaXRlVGVzdC5jcHAKLSAgKQogCi1hZGRfZGVwZW5kZW5jaWVzKGNsYW5nUmV3cml0ZUZyb250ZW5kCi0gIENsYW5nQXR0ckNsYXNzZXMKLSAgQ2xhbmdBdHRyTGlzdAotICBDbGFuZ0F0dHJQYXJzZWRBdHRyTGlzdAotICBDbGFuZ0NvbW1lbnROb2RlcwotICBDbGFuZ0RlY2xOb2RlcwotICBDbGFuZ0RpYWdub3N0aWNDb21tb24KLSAgQ2xhbmdEaWFnbm9zdGljRnJvbnRlbmQKLSAgQ2xhbmdTdG10Tm9kZXMKLSAgKQotCi10YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmdSZXdyaXRlRnJvbnRlbmQKLSAgY2xhbmdCYXNpYworICBMSU5LX0xJQlMKICAgY2xhbmdBU1QKLSAgY2xhbmdQYXJzZQorICBjbGFuZ0Jhc2ljCisgIGNsYW5nRWRpdAogICBjbGFuZ0Zyb250ZW5kCisgIGNsYW5nTGV4CiAgIGNsYW5nUmV3cml0ZUNvcmUKICAgKQpkaWZmIC0tZ2l0IGEvbGliL1Jld3JpdGUvRnJvbnRlbmQvRml4SXRSZXdyaXRlci5jcHAgYi9saWIvUmV3cml0ZS9Gcm9udGVuZC9GaXhJdFJld3JpdGVyLmNwcAppbmRleCA4OTMwYzM1Li44YjdhZjcxIDEwMDY0NAotLS0gYS9saWIvUmV3cml0ZS9Gcm9udGVuZC9GaXhJdFJld3JpdGVyLmNwcAorKysgYi9saWIvUmV3cml0ZS9Gcm9udGVuZC9GaXhJdFJld3JpdGVyLmNwcApAQCAtMjAsMTAgKzIwLDEwIEBACiAjaW5jbHVkZSAiY2xhbmcvRWRpdC9Db21taXQuaCIKICNpbmNsdWRlICJjbGFuZy9FZGl0L0VkaXRzUmVjZWl2ZXIuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZERpYWdub3N0aWMuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgogI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIApAQCAtNjIsMTAgKzYyLDEwIEBACiBwdWJsaWM6CiAgIFJld3JpdGVzUmVjZWl2ZXIoUmV3cml0ZXIgJlJld3JpdGUpIDogUmV3cml0ZShSZXdyaXRlKSB7IH0KIAotICB2aXJ0dWFsIHZvaWQgaW5zZXJ0KFNvdXJjZUxvY2F0aW9uIGxvYywgU3RyaW5nUmVmIHRleHQpIHsKKyAgdm9pZCBpbnNlcnQoU291cmNlTG9jYXRpb24gbG9jLCBTdHJpbmdSZWYgdGV4dCkgb3ZlcnJpZGUgewogICAgIFJld3JpdGUuSW5zZXJ0VGV4dChsb2MsIHRleHQpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCByZXBsYWNlKENoYXJTb3VyY2VSYW5nZSByYW5nZSwgU3RyaW5nUmVmIHRleHQpIHsKKyAgdm9pZCByZXBsYWNlKENoYXJTb3VyY2VSYW5nZSByYW5nZSwgU3RyaW5nUmVmIHRleHQpIG92ZXJyaWRlIHsKICAgICBSZXdyaXRlLlJlcGxhY2VUZXh0KHJhbmdlLmdldEJlZ2luKCksIFJld3JpdGUuZ2V0UmFuZ2VTaXplKHJhbmdlKSwgdGV4dCk7CiAgIH0KIH07CkBAIC04NywxMiArODcsMTIgQEAKICAgICBpbnQgZmQ7CiAgICAgc3RkOjpzdHJpbmcgRmlsZW5hbWUgPSBGaXhJdE9wdHMtPlJld3JpdGVGaWxlbmFtZShFbnRyeS0+Z2V0TmFtZSgpLCBmZCk7CiAgICAgc3RkOjpzdHJpbmcgRXJyOwotICAgIE93bmluZ1B0cjxsbHZtOjpyYXdfZmRfb3N0cmVhbT4gT1M7CisgICAgc3RkOjp1bmlxdWVfcHRyPGxsdm06OnJhd19mZF9vc3RyZWFtPiBPUzsKICAgICBpZiAoZmQgIT0gLTEpIHsKICAgICAgIE9TLnJlc2V0KG5ldyBsbHZtOjpyYXdfZmRfb3N0cmVhbShmZCwgLypzaG91bGRDbG9zZT0qL3RydWUpKTsKICAgICB9IGVsc2UgewogICAgICAgT1MucmVzZXQobmV3IGxsdm06OnJhd19mZF9vc3RyZWFtKEZpbGVuYW1lLmNfc3RyKCksIEVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpzeXM6OmZzOjpGX0JpbmFyeSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6OkZfTm9uZSkpOwogICAgIH0KICAgICBpZiAoIUVyci5lbXB0eSgpKSB7CiAgICAgICBEaWFncy5SZXBvcnQoY2xhbmc6OmRpYWc6OmVycl9mZV91bmFibGVfdG9fb3Blbl9vdXRwdXQpCmRpZmYgLS1naXQgYS9saWIvUmV3cml0ZS9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuY3BwIGIvbGliL1Jld3JpdGUvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmNwcAppbmRleCBlOWVjMzg4Li5iZjI3ZWZlIDEwMDY0NAotLS0gYS9saWIvUmV3cml0ZS9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuY3BwCisrKyBiL2xpYi9SZXdyaXRlL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5jcHAKQEAgLTE5LDEwICsxOSwxMCBAQAogI2luY2x1ZGUgImNsYW5nL1Jld3JpdGUvRnJvbnRlbmQvQVNUQ29uc3VtZXJzLmgiCiAjaW5jbHVkZSAiY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9GaXhJdFJld3JpdGVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9SZXdyaXRlcnMuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiAKQEAgLTQ4LDcgKzQ4LDcgQEAKIG5hbWVzcGFjZSB7CiBjbGFzcyBGaXhJdFJld3JpdGVJblBsYWNlIDogcHVibGljIEZpeEl0T3B0aW9ucyB7CiBwdWJsaWM6Ci0gIHN0ZDo6c3RyaW5nIFJld3JpdGVGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmRmlsZW5hbWUsIGludCAmZmQpIHsKKyAgc3RkOjpzdHJpbmcgUmV3cml0ZUZpbGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZGaWxlbmFtZSwgaW50ICZmZCkgb3ZlcnJpZGUgewogICAgIGZkID0gLTE7CiAgICAgcmV0dXJuIEZpbGVuYW1lOwogICB9CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICB0aGlzLT5GaXhXaGF0WW91Q2FuID0gRml4V2hhdFlvdUNhbjsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIFJld3JpdGVGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmRmlsZW5hbWUsIGludCAmZmQpIHsKKyAgc3RkOjpzdHJpbmcgUmV3cml0ZUZpbGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZGaWxlbmFtZSwgaW50ICZmZCkgb3ZlcnJpZGUgewogICAgIGZkID0gLTE7CiAgICAgU21hbGxTdHJpbmc8MTI4PiBQYXRoKEZpbGVuYW1lKTsKICAgICBsbHZtOjpzeXM6OnBhdGg6OnJlcGxhY2VfZXh0ZW5zaW9uKFBhdGgsCkBAIC03NCw3ICs3NCw3IEBACiAKIGNsYXNzIEZpeEl0UmV3cml0ZVRvVGVtcCA6IHB1YmxpYyBGaXhJdE9wdGlvbnMgewogcHVibGljOgotICBzdGQ6OnN0cmluZyBSZXdyaXRlRmlsZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJkZpbGVuYW1lLCBpbnQgJmZkKSB7CisgIHN0ZDo6c3RyaW5nIFJld3JpdGVGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmRmlsZW5hbWUsIGludCAmZmQpIG92ZXJyaWRlIHsKICAgICBTbWFsbFN0cmluZzwxMjg+IFBhdGg7CiAgICAgbGx2bTo6c3lzOjpmczo6Y3JlYXRlVGVtcG9yYXJ5RmlsZShsbHZtOjpzeXM6OnBhdGg6OmZpbGVuYW1lKEZpbGVuYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6cGF0aDo6ZXh0ZW5zaW9uKEZpbGVuYW1lKSwgZmQsCkBAIC0xMTAsOSArMTEwLDkgQEAKICAgYm9vbCBlcnIgPSBmYWxzZTsKICAgewogICAgIGNvbnN0IEZyb250ZW5kT3B0aW9ucyAmRkVPcHRzID0gQ0kuZ2V0RnJvbnRlbmRPcHRzKCk7Ci0gICAgT3duaW5nUHRyPEZyb250ZW5kQWN0aW9uPiBGaXhBY3Rpb24obmV3IFN5bnRheE9ubHlBY3Rpb24oKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZyb250ZW5kQWN0aW9uPiBGaXhBY3Rpb24obmV3IFN5bnRheE9ubHlBY3Rpb24oKSk7CiAgICAgaWYgKEZpeEFjdGlvbi0+QmVnaW5Tb3VyY2VGaWxlKENJLCBGRU9wdHMuSW5wdXRzWzBdKSkgewotICAgICAgT3duaW5nUHRyPEZpeEl0T3B0aW9ucz4gRml4SXRPcHRzOworICAgICAgc3RkOjp1bmlxdWVfcHRyPEZpeEl0T3B0aW9ucz4gRml4SXRPcHRzOwogICAgICAgaWYgKEZFT3B0cy5GaXhUb1RlbXBvcmFyaWVzKQogICAgICAgICBGaXhJdE9wdHMucmVzZXQobmV3IEZpeEl0UmV3cml0ZVRvVGVtcCgpKTsKICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL2xpYi9SZXdyaXRlL0Zyb250ZW5kL0hUTUxQcmludC5jcHAgYi9saWIvUmV3cml0ZS9Gcm9udGVuZC9IVE1MUHJpbnQuY3BwCmluZGV4IDc5ZTQ0NDcuLjY0ZGEwNWYgMTAwNjQ0Ci0tLSBhL2xpYi9SZXdyaXRlL0Zyb250ZW5kL0hUTUxQcmludC5jcHAKKysrIGIvbGliL1Jld3JpdGUvRnJvbnRlbmQvSFRNTFByaW50LmNwcApAQCAtNDIsOCArNDIsOCBAQAogICAgICAgOiBPdXQoT1MpLCBQUChwcCksIFN5bnRheEhpZ2hsaWdodChfU3ludGF4SGlnaGxpZ2h0KSwKICAgICAgICAgSGlnaGxpZ2h0TWFjcm9zKF9IaWdobGlnaHRNYWNyb3MpIHt9CiAKLSAgICB2b2lkIEluaXRpYWxpemUoQVNUQ29udGV4dCAmY29udGV4dCk7Ci0gICAgdm9pZCBIYW5kbGVUcmFuc2xhdGlvblVuaXQoQVNUQ29udGV4dCAmQ3R4KTsKKyAgICB2b2lkIEluaXRpYWxpemUoQVNUQ29udGV4dCAmY29udGV4dCkgb3ZlcnJpZGU7CisgICAgdm9pZCBIYW5kbGVUcmFuc2xhdGlvblVuaXQoQVNUQ29udGV4dCAmQ3R4KSBvdmVycmlkZTsKICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL1Jld3JpdGUvRnJvbnRlbmQvSW5jbHVzaW9uUmV3cml0ZXIuY3BwIGIvbGliL1Jld3JpdGUvRnJvbnRlbmQvSW5jbHVzaW9uUmV3cml0ZXIuY3BwCmluZGV4IDcxY2ViNWYuLjA1ODk2MGQgMTAwNjQ0Ci0tLSBhL2xpYi9SZXdyaXRlL0Zyb250ZW5kL0luY2x1c2lvblJld3JpdGVyLmNwcAorKysgYi9saWIvUmV3cml0ZS9Gcm9udGVuZC9JbmNsdXNpb25SZXdyaXRlci5jcHAKQEAgLTU1LDIxICs1NSwxNiBAQAogICAgIFByZWRlZmluZXNCdWZmZXIgPSBCdWY7CiAgIH0KIHByaXZhdGU6Ci0gIHZpcnR1YWwgdm9pZCBGaWxlQ2hhbmdlZChTb3VyY2VMb2NhdGlvbiBMb2MsIEZpbGVDaGFuZ2VSZWFzb24gUmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjTWdyOjpDaGFyYWN0ZXJpc3RpY0tpbmQgRmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSUQgUHJldkZJRCk7Ci0gIHZpcnR1YWwgdm9pZCBGaWxlU2tpcHBlZChjb25zdCBGaWxlRW50cnkgJlBhcmVudEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUb2tlbiAmRmlsZW5hbWVUb2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBGaWxlVHlwZSk7Ci0gIHZpcnR1YWwgdm9pZCBJbmNsdXNpb25EaXJlY3RpdmUoU291cmNlTG9jYXRpb24gSGFzaExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUb2tlbiAmSW5jbHVkZVRvaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0FuZ2xlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU291cmNlUmFuZ2UgRmlsZW5hbWVSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRW50cnkgKkZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNlYXJjaFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlbGF0aXZlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkltcG9ydGVkKTsKKyAgdm9pZCBGaWxlQ2hhbmdlZChTb3VyY2VMb2NhdGlvbiBMb2MsIEZpbGVDaGFuZ2VSZWFzb24gUmVhc29uLAorICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgIEZpbGVJRCBQcmV2RklEKSBvdmVycmlkZTsKKyAgdm9pZCBGaWxlU2tpcHBlZChjb25zdCBGaWxlRW50cnkgJlBhcmVudEZpbGUsIGNvbnN0IFRva2VuICZGaWxlbmFtZVRvaywKKyAgICAgICAgICAgICAgICAgICBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBGaWxlVHlwZSkgb3ZlcnJpZGU7CisgIHZvaWQgSW5jbHVzaW9uRGlyZWN0aXZlKFNvdXJjZUxvY2F0aW9uIEhhc2hMb2MsIGNvbnN0IFRva2VuICZJbmNsdWRlVG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUsIGJvb2wgSXNBbmdsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTb3VyY2VSYW5nZSBGaWxlbmFtZVJhbmdlLCBjb25zdCBGaWxlRW50cnkgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZWFyY2hQYXRoLCBTdHJpbmdSZWYgUmVsYXRpdmVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGUgKkltcG9ydGVkKSBvdmVycmlkZTsKICAgdm9pZCBXcml0ZUxpbmVJbmZvKGNvbnN0IGNoYXIgKkZpbGVuYW1lLCBpbnQgTGluZSwKICAgICAgICAgICAgICAgICAgICAgIFNyY01ncjo6Q2hhcmFjdGVyaXN0aWNLaW5kIEZpbGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEVPTCwgU3RyaW5nUmVmIEV4dHJhID0gU3RyaW5nUmVmKCkpOwpAQCAtNzcsNyArNzIsNyBAQAogICB2b2lkIE91dHB1dENvbnRlbnRVcFRvKGNvbnN0IE1lbW9yeUJ1ZmZlciAmRnJvbUZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJldyaXRlRnJvbSwgdW5zaWduZWQgV3JpdGVUbywKICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRU9MLCBpbnQgJmxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW5zdXJlTmV3bGluZSA9IGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVuc3VyZU5ld2xpbmUpOwogICB2b2lkIENvbW1lbnRPdXREaXJlY3RpdmUoTGV4ZXIgJkRpcmVjdGl2ZXNMZXgsIGNvbnN0IFRva2VuICZTdGFydFRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5QnVmZmVyICZGcm9tRmlsZSwgU3RyaW5nUmVmIEVPTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZOZXh0VG9Xcml0ZSwgaW50ICZMaW5lcyk7CkBAIC0yNTAsNyArMjQ1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEVPTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk5leHRUb1dyaXRlLCBpbnQgJkxpbmUpIHsKICAgT3V0cHV0Q29udGVudFVwVG8oRnJvbUZpbGUsIE5leHRUb1dyaXRlLAotICAgIFNNLmdldEZpbGVPZmZzZXQoU3RhcnRUb2tlbi5nZXRMb2NhdGlvbigpKSwgRU9MLCBMaW5lKTsKKyAgICBTTS5nZXRGaWxlT2Zmc2V0KFN0YXJ0VG9rZW4uZ2V0TG9jYXRpb24oKSksIEVPTCwgTGluZSwgZmFsc2UpOwogICBUb2tlbiBEaXJlY3RpdmVUb2tlbjsKICAgZG8gewogICAgIERpcmVjdGl2ZUxleC5MZXhGcm9tUmF3TGV4ZXIoRGlyZWN0aXZlVG9rZW4pOwpAQCAtMjU4LDcgKzI1Myw3IEBACiAgIE9TIDw8ICIjaWYgMCAvKiBleHBhbmRlZCBieSAtZnJld3JpdGUtaW5jbHVkZXMgKi8iIDw8IEVPTDsKICAgT3V0cHV0Q29udGVudFVwVG8oRnJvbUZpbGUsIE5leHRUb1dyaXRlLAogICAgIFNNLmdldEZpbGVPZmZzZXQoRGlyZWN0aXZlVG9rZW4uZ2V0TG9jYXRpb24oKSkgKyBEaXJlY3RpdmVUb2tlbi5nZXRMZW5ndGgoKSwKLSAgICBFT0wsIExpbmUpOworICAgIEVPTCwgTGluZSwgdHJ1ZSk7CiAgIE9TIDw8ICIjZW5kaWYgLyogZXhwYW5kZWQgYnkgLWZyZXdyaXRlLWluY2x1ZGVzICovIiA8PCBFT0w7CiB9CiAKQEAgLTMzNSw3ICszMzAsNyBAQAogICBib29sIGlzQW5nbGVkID0gUFAuR2V0SW5jbHVkZUZpbGVuYW1lU3BlbGxpbmcoVG9rLmdldExvY2F0aW9uKCksIEZpbGVuYW1lKTsKICAgY29uc3QgRGlyZWN0b3J5TG9va3VwICpDdXJEaXI7CiAgIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSA9IFBQLmdldEhlYWRlclNlYXJjaEluZm8oKS5Mb29rdXBGaWxlKAotICAgICAgRmlsZW5hbWUsIGlzQW5nbGVkLCAwLCBDdXJEaXIsCisgICAgICBGaWxlbmFtZSwgU291cmNlTG9jYXRpb24oKSwgaXNBbmdsZWQsIDAsIEN1ckRpciwKICAgICAgIFBQLmdldFNvdXJjZU1hbmFnZXIoKS5nZXRGaWxlRW50cnlGb3JJRChGaWxlSWQpLCAwLCAwLCAwLCBmYWxzZSk7CiAKICAgRmlsZUV4aXN0cyA9IEZpbGUgIT0gMDsKQEAgLTM2MywxNSArMzU4LDEyIEBACiAgIGlmIChTTS5nZXRGaWxlSURTaXplKEZpbGVJZCkgPT0gMCkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgLy8gVGhlIG5leHQgYnl0ZSB0byBiZSBjb3BpZWQgZnJvbSB0aGUgc291cmNlIGZpbGUKLSAgdW5zaWduZWQgTmV4dFRvV3JpdGUgPSAwOworICAvLyBUaGUgbmV4dCBieXRlIHRvIGJlIGNvcGllZCBmcm9tIHRoZSBzb3VyY2UgZmlsZSwgd2hpY2ggbWF5IGJlIG5vbi16ZXJvIGlmCisgIC8vIHRoZSBsZXhlciBoYW5kbGVkIGEgQk9NLgorICB1bnNpZ25lZCBOZXh0VG9Xcml0ZSA9IFNNLmdldEZpbGVPZmZzZXQoUmF3TGV4LmdldFNvdXJjZUxvY2F0aW9uKCkpOworICBhc3NlcnQoU00uZ2V0TGluZU51bWJlcihGaWxlSWQsIE5leHRUb1dyaXRlKSA9PSAxKTsKICAgaW50IExpbmUgPSAxOyAvLyBUaGUgY3VycmVudCBpbnB1dCBmaWxlIGxpbmUgbnVtYmVyLgogCi0gIC8vIElnbm9yZSBVVEYtOCBCT00sIG90aGVyd2lzZSBpdCdkIGVuZCB1cCBzb21ld2hlcmUgZWxzZSB0aGFuIHRoZSBzdGFydAotICAvLyBvZiB0aGUgcmVzdWx0aW5nIGZpbGUuCi0gIGlmIChGcm9tRmlsZS5nZXRCdWZmZXIoKS5zdGFydHN3aXRoKCJceEVGXHhCQlx4QkYiKSkKLSAgICBOZXh0VG9Xcml0ZSA9IDM7Ci0KICAgVG9rZW4gUmF3VG9rZW47CiAgIFJhd0xleC5MZXhGcm9tUmF3TGV4ZXIoUmF3VG9rZW4pOwogCkBAIC00NjUsMTIgKzQ1NywxMiBAQAogICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIG1hY3JvIHdpdGggKDApIG9yICgxKSwgZm9sbG93ZWQgYnkgdGhlIGNvbW1lbnRlZAogICAgICAgICAgICAgICAgIC8vIG91dCBtYWNybyBmb3IgcmVmZXJlbmNlLgogICAgICAgICAgICAgICAgIE91dHB1dENvbnRlbnRVcFRvKEZyb21GaWxlLCBOZXh0VG9Xcml0ZSwgU00uZ2V0RmlsZU9mZnNldChMb2MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVPTCwgTGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU9MLCBMaW5lLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgT1MgPDwgJygnIDw8IChpbnQpIEhhc0ZpbGUgPDwgIikvKiI7CiAgICAgICAgICAgICAgICAgT3V0cHV0Q29udGVudFVwVG8oRnJvbUZpbGUsIE5leHRUb1dyaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNLmdldEZpbGVPZmZzZXQoUmF3VG9rZW4uZ2V0TG9jYXRpb24oKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1Rva2VuLmdldExlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVPTCwgTGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU9MLCBMaW5lLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgT1MgPDwgIiovIjsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAoUmF3VG9rZW4uaXNOb3QodG9rOjplb2QpKTsKZGlmZiAtLWdpdCBhL2xpYi9SZXdyaXRlL0Zyb250ZW5kL1Jld3JpdGVNYWNyb3MuY3BwIGIvbGliL1Jld3JpdGUvRnJvbnRlbmQvUmV3cml0ZU1hY3Jvcy5jcHAKaW5kZXggNGY2YTkzZi4uMGQwYTk5MSAxMDA2NDQKLS0tIGEvbGliL1Jld3JpdGUvRnJvbnRlbmQvUmV3cml0ZU1hY3Jvcy5jcHAKKysrIGIvbGliL1Jld3JpdGUvRnJvbnRlbmQvUmV3cml0ZU1hY3Jvcy5jcHAKQEAgLTE2LDEwICsxNiwxMCBAQAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvUHJlcHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAiY2xhbmcvUmV3cml0ZS9Db3JlL1Jld3JpdGVyLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdGguaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKICNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8bWVtb3J5PgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiAKZGlmZiAtLWdpdCBhL2xpYi9SZXdyaXRlL0Zyb250ZW5kL1Jld3JpdGVNb2Rlcm5PYmpDLmNwcCBiL2xpYi9SZXdyaXRlL0Zyb250ZW5kL1Jld3JpdGVNb2Rlcm5PYmpDLmNwcAppbmRleCBhZTMzYWM4Li45MDY2YTVmIDEwMDY0NAotLS0gYS9saWIvUmV3cml0ZS9Gcm9udGVuZC9SZXdyaXRlTW9kZXJuT2JqQy5jcHAKKysrIGIvbGliL1Jld3JpdGUvRnJvbnRlbmQvUmV3cml0ZU1vZGVybk9iakMuY3BwCkBAIC0yNCwxMSArMjQsMTEgQEAKICNpbmNsdWRlICJjbGFuZy9MZXgvTGV4ZXIuaCIKICNpbmNsdWRlICJjbGFuZy9SZXdyaXRlL0NvcmUvUmV3cml0ZXIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KIAogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbGx2bTo6dXRvc3RyOwpAQCAtMTg1LDcgKzE4NSw3IEBACiAgIHB1YmxpYzoKICAgICBsbHZtOjpEZW5zZU1hcDxPYmpDTWV0aG9kRGVjbCosIHN0ZDo6c3RyaW5nPiBNZXRob2RJbnRlcm5hbE5hbWVzOwogICAgIC8vIFRvcCBMZXZlbCBEcml2ZXIgY29kZS4KLSAgICB2aXJ0dWFsIGJvb2wgSGFuZGxlVG9wTGV2ZWxEZWNsKERlY2xHcm91cFJlZiBEKSB7CisgICAgYm9vbCBIYW5kbGVUb3BMZXZlbERlY2woRGVjbEdyb3VwUmVmIEQpIG92ZXJyaWRlIHsKICAgICAgIGZvciAoRGVjbEdyb3VwUmVmOjppdGVyYXRvciBJID0gRC5iZWdpbigpLCBFID0gRC5lbmQoKTsgSSAhPSBFOyArK0kpIHsKICAgICAgICAgaWYgKE9iakNJbnRlcmZhY2VEZWNsICpDbGFzcyA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPigqSSkpIHsKICAgICAgICAgICBpZiAoIUNsYXNzLT5pc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCkpIHsKQEAgLTIyMSw4ICsyMjEsOCBAQAogICAgICAgfQogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBIYW5kbGVUb3BMZXZlbERlY2xJbk9iakNDb250YWluZXIoRGVjbEdyb3VwUmVmIEQpIHsKKworICAgIHZvaWQgSGFuZGxlVG9wTGV2ZWxEZWNsSW5PYmpDQ29udGFpbmVyKERlY2xHcm91cFJlZiBEKSBvdmVycmlkZSB7CiAgICAgICBmb3IgKERlY2xHcm91cFJlZjo6aXRlcmF0b3IgSSA9IEQuYmVnaW4oKSwgRSA9IEQuZW5kKCk7IEkgIT0gRTsgKytJKSB7CiAgICAgICAgIGlmIChUeXBlZGVmTmFtZURlY2wgKlREID0gZHluX2Nhc3Q8VHlwZWRlZk5hbWVEZWNsPigqSSkpIHsKICAgICAgICAgICBpZiAoaXNUb3BMZXZlbEJsb2NrUG9pbnRlclR5cGUoVEQtPmdldFVuZGVybHlpbmdUeXBlKCkpKQpAQCAtMjQzLDggKzI0Myw4IEBACiAgICAgICAgICAgICAgICAgYm9vbCBzaWxlbmNlTWFjcm9XYXJuLCBib29sIExpbmVJbmZvKTsKICAgICAKICAgICB+UmV3cml0ZU1vZGVybk9iakMoKSB7fQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBIYW5kbGVUcmFuc2xhdGlvblVuaXQoQVNUQ29udGV4dCAmQyk7CisKKyAgICB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDKSBvdmVycmlkZTsKIAogICAgIHZvaWQgUmVwbGFjZVN0bXQoU3RtdCAqT2xkLCBTdG10ICpOZXcpIHsKICAgICAgIFN0bXQgKlJlcGxhY2luZ1N0bXQgPSBSZXBsYWNlZE5vZGVzW09sZF07CkBAIC00MTQsOSArNDE0LDkgQEAKICAgICAKICAgICB2b2lkIFJld3JpdGVJdmFyT2Zmc2V0U3ltYm9scyhPYmpDSW50ZXJmYWNlRGVjbCAqQ0RlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlJlc3VsdCk7Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoQVNUQ29udGV4dCAmY29udGV4dCk7Ci0gICAgCisKKyAgICB2b2lkIEluaXRpYWxpemUoQVNUQ29udGV4dCAmY29udGV4dCkgb3ZlcnJpZGU7CisKICAgICAvLyBNaXNjLiBBU1QgdHJhbnNmb3JtYXRpb24gcm91dGluZXMuIFNvbWV0aW1lcyB0aGV5IGVuZCB1cCBjYWxsaW5nCiAgICAgLy8gcmV3cml0aW5nIHJvdXRpbmVzIG9uIHRoZSBuZXcgQVNUcy4KICAgICBDYWxsRXhwciAqU3ludGhlc2l6ZUNhbGxUb0Z1bmN0aW9uRGVjbChGdW5jdGlvbkRlY2wgKkZELApAQCAtNjA3LDYgKzYwNywxNCBAQAogICAgICAgU2VsZWN0b3IgTG9hZFNlbCA9IENvbnRleHQtPlNlbGVjdG9ycy5nZXRTZWxlY3RvcigwLCAmSUkpOwogICAgICAgcmV0dXJuIE9ELT5nZXRDbGFzc01ldGhvZChMb2FkU2VsKSAhPSAwOwogICAgIH0KKworICAgIFN0cmluZ0xpdGVyYWwgKmdldFN0cmluZ0xpdGVyYWwoU3RyaW5nUmVmIFN0cikgeworICAgICAgUXVhbFR5cGUgU3RyVHlwZSA9IENvbnRleHQtPmdldENvbnN0YW50QXJyYXlUeXBlKAorICAgICAgICAgIENvbnRleHQtPkNoYXJUeSwgbGx2bTo6QVBJbnQoMzIsIFN0ci5zaXplKCkgKyAxKSwgQXJyYXlUeXBlOjpOb3JtYWwsCisgICAgICAgICAgMCk7CisgICAgICByZXR1cm4gU3RyaW5nTGl0ZXJhbDo6Q3JlYXRlKCpDb250ZXh0LCBTdHIsIFN0cmluZ0xpdGVyYWw6OkFzY2lpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlBhc2NhbD0qL2ZhbHNlLCBTdHJUeXBlLCBTb3VyY2VMb2NhdGlvbigpKTsKKyAgICB9CiAgIH07CiAgIAogfQpAQCAtNjE1LDkgKzYyMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkQpIHsKICAgaWYgKGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpmcHJvdG8KICAgICAgID0gZHluX2Nhc3Q8RnVuY3Rpb25Qcm90b1R5cGU+KGZ1bmNUeXBlLklnbm9yZVBhcmVucygpKSkgewotICAgIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yIEkgPSBmcHJvdG8tPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgICBFID0gZnByb3RvLT5hcmdfdHlwZV9lbmQoKTsgSSAmJiAoSSAhPSBFKTsgKytJKQotICAgICAgaWYgKGlzVG9wTGV2ZWxCbG9ja1BvaW50ZXJUeXBlKCpJKSkgeworICAgIGZvciAoY29uc3QgYXV0byAmSSA6IGZwcm90by0+cGFyYW1fdHlwZXMoKSkKKyAgICAgIGlmIChpc1RvcExldmVsQmxvY2tQb2ludGVyVHlwZShJKSkgewogICAgICAgICAvLyBBbGwgdGhlIGFyZ3MgYXJlIGNoZWNrZWQvcmV3cml0dGVuLiBEb24ndCBjYWxsIHR3aWNlIQogICAgICAgICBSZXdyaXRlQmxvY2tQb2ludGVyRGVjbChEKTsKICAgICAgICAgYnJlYWs7CkBAIC05NzUsNyArOTgyLDcgQEAKICAgICAgIC8vIHJldHVybiBvYmpjX2dldFByb3BlcnR5KHNlbGYsIF9jbWQsIG9mZnNldG9mKENsYXNzRGVjbCwgT0lEKSwgMSkKICAgICAgIEdldHIgKz0gInR5cGVkZWYgIjsKICAgICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlBSZXRUeXBlID0gMDsKLSAgICAgIFJld3JpdGVUeXBlSW50b1N0cmluZyhQRC0+Z2V0R2V0dGVyTWV0aG9kRGVjbCgpLT5nZXRSZXN1bHRUeXBlKCksIEdldHIsIAorICAgICAgUmV3cml0ZVR5cGVJbnRvU3RyaW5nKFBELT5nZXRHZXR0ZXJNZXRob2REZWNsKCktPmdldFJldHVyblR5cGUoKSwgR2V0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFJldFR5cGUpOwogICAgICAgR2V0ciArPSAiIF9UWVBFIjsKICAgICAgIGlmIChGUFJldFR5cGUpIHsKQEAgLTk4NCwxNCArOTkxLDE1IEBACiAgICAgICAgIC8vIE5vdywgZW1pdCB0aGUgYXJndW1lbnQgdHlwZXMgKGlmIGFueSkuCiAgICAgICAgIGlmIChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlQgPSBkeW5fY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oRlBSZXRUeXBlKSl7CiAgICAgICAgICAgR2V0ciArPSAiKCI7Ci0gICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZULT5nZXROdW1BcmdzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZULT5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyArK2kpIHsKICAgICAgICAgICAgIGlmIChpKSBHZXRyICs9ICIsICI7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBQYXJhbVN0ciA9IEZULT5nZXRBcmdUeXBlKGkpLmdldEFzU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFByaW50aW5nUG9saWN5KCkpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgUGFyYW1TdHIgPQorICAgICAgICAgICAgICAgIEZULT5nZXRQYXJhbVR5cGUoaSkuZ2V0QXNTdHJpbmcoQ29udGV4dC0+Z2V0UHJpbnRpbmdQb2xpY3koKSk7CiAgICAgICAgICAgICBHZXRyICs9IFBhcmFtU3RyOwogICAgICAgICAgIH0KICAgICAgICAgICBpZiAoRlQtPmlzVmFyaWFkaWMoKSkgewotICAgICAgICAgICAgaWYgKEZULT5nZXROdW1BcmdzKCkpIEdldHIgKz0gIiwgIjsKKyAgICAgICAgICAgIGlmIChGVC0+Z2V0TnVtUGFyYW1zKCkpCisgICAgICAgICAgICAgIEdldHIgKz0gIiwgIjsKICAgICAgICAgICAgIEdldHIgKz0gIi4uLiI7CiAgICAgICAgICAgfQogICAgICAgICAgIEdldHIgKz0gIikiOwpAQCAtMTE1MCwxOCArMTE1OCwxMyBAQAogICAgIFJlcGxhY2VUZXh0KExvY1N0YXJ0LCAwLCAiLy8gIik7CiAgIH0KICAgCi0gIGZvciAoT2JqQ0NhdGVnb3J5RGVjbDo6cHJvcF9pdGVyYXRvciBJID0gQ2F0RGVjbC0+cHJvcF9iZWdpbigpLAotICAgICAgIEUgPSBDYXREZWNsLT5wcm9wX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBSZXdyaXRlUHJvcGVydHkoKkkpOworICBmb3IgKGF1dG8gKkkgOiBDYXREZWNsLT5wcm9wZXJ0aWVzKCkpCisgICAgUmV3cml0ZVByb3BlcnR5KEkpOwogICAKLSAgZm9yIChPYmpDQ2F0ZWdvcnlEZWNsOjppbnN0bWV0aF9pdGVyYXRvcgotICAgICAgICAgSSA9IENhdERlY2wtPmluc3RtZXRoX2JlZ2luKCksIEUgPSBDYXREZWNsLT5pbnN0bWV0aF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkKLSAgICBSZXdyaXRlTWV0aG9kRGVjbGFyYXRpb24oKkkpOwotICBmb3IgKE9iakNDYXRlZ29yeURlY2w6OmNsYXNzbWV0aF9pdGVyYXRvcgotICAgICAgICAgSSA9IENhdERlY2wtPmNsYXNzbWV0aF9iZWdpbigpLCBFID0gQ2F0RGVjbC0+Y2xhc3NtZXRoX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKQotICAgIFJld3JpdGVNZXRob2REZWNsYXJhdGlvbigqSSk7CisgIGZvciAoYXV0byAqSSA6IENhdERlY2wtPmluc3RhbmNlX21ldGhvZHMoKSkKKyAgICBSZXdyaXRlTWV0aG9kRGVjbGFyYXRpb24oSSk7CisgIGZvciAoYXV0byAqSSA6IENhdERlY2wtPmNsYXNzX21ldGhvZHMoKSkKKyAgICBSZXdyaXRlTWV0aG9kRGVjbGFyYXRpb24oSSk7CiAKICAgLy8gTGFzdGx5LCBjb21tZW50IG91dCB0aGUgQGVuZC4KICAgUmVwbGFjZVRleHQoQ2F0RGVjbC0+Z2V0QXRFbmRSYW5nZSgpLmdldEJlZ2luKCksIApAQCAtMTE3NSwxOCArMTE3OCwxMiBAQAogICAvLyBGSVhNRTogaGFuZGxlIHByb3RvY29sIGhlYWRlcnMgdGhhdCBhcmUgZGVjbGFyZWQgYWNyb3NzIG11bHRpcGxlIGxpbmVzLgogICBSZXBsYWNlVGV4dChMb2NTdGFydCwgMCwgIi8vICIpOwogCi0gIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6aW5zdG1ldGhfaXRlcmF0b3IKLSAgICAgICAgIEkgPSBQRGVjbC0+aW5zdG1ldGhfYmVnaW4oKSwgRSA9IFBEZWNsLT5pbnN0bWV0aF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkKLSAgICBSZXdyaXRlTWV0aG9kRGVjbGFyYXRpb24oKkkpOwotICBmb3IgKE9iakNQcm90b2NvbERlY2w6OmNsYXNzbWV0aF9pdGVyYXRvcgotICAgICAgICAgSSA9IFBEZWNsLT5jbGFzc21ldGhfYmVnaW4oKSwgRSA9IFBEZWNsLT5jbGFzc21ldGhfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpCi0gICAgUmV3cml0ZU1ldGhvZERlY2xhcmF0aW9uKCpJKTsKLQotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjpwcm9wX2l0ZXJhdG9yIEkgPSBQRGVjbC0+cHJvcF9iZWdpbigpLAotICAgICAgIEUgPSBQRGVjbC0+cHJvcF9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgUmV3cml0ZVByb3BlcnR5KCpJKTsKKyAgZm9yIChhdXRvICpJIDogUERlY2wtPmluc3RhbmNlX21ldGhvZHMoKSkKKyAgICBSZXdyaXRlTWV0aG9kRGVjbGFyYXRpb24oSSk7CisgIGZvciAoYXV0byAqSSA6IFBEZWNsLT5jbGFzc19tZXRob2RzKCkpCisgICAgUmV3cml0ZU1ldGhvZERlY2xhcmF0aW9uKEkpOworICBmb3IgKGF1dG8gKkkgOiBQRGVjbC0+cHJvcGVydGllcygpKQorICAgIFJld3JpdGVQcm9wZXJ0eShJKTsKICAgCiAgIC8vIExhc3RseSwgY29tbWVudCBvdXQgdGhlIEBlbmQuCiAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZCA9IFBEZWNsLT5nZXRBdEVuZFJhbmdlKCkuZ2V0QmVnaW4oKTsKQEAgLTEyNTcsOCArMTI1NCw4IEBACiAgICAgZWxzZSBpZiAoY29uc3QgQmxvY2tQb2ludGVyVHlwZSAqQlBUID0gcmV0VHlwZS0+Z2V0QXM8QmxvY2tQb2ludGVyVHlwZT4oKSkKICAgICAgIFBvaW50ZWVUeSA9IEJQVC0+Z2V0UG9pbnRlZVR5cGUoKTsKICAgICBpZiAoKEZQUmV0VHlwZSA9IFBvaW50ZWVUeS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpKSkgewotICAgICAgUmVzdWx0U3RyICs9IEZQUmV0VHlwZS0+Z2V0UmVzdWx0VHlwZSgpLmdldEFzU3RyaW5nKAotICAgICAgICBDb250ZXh0LT5nZXRQcmludGluZ1BvbGljeSgpKTsKKyAgICAgIFJlc3VsdFN0ciArPQorICAgICAgICAgIEZQUmV0VHlwZS0+Z2V0UmV0dXJuVHlwZSgpLmdldEFzU3RyaW5nKENvbnRleHQtPmdldFByaW50aW5nUG9saWN5KCkpOwogICAgICAgUmVzdWx0U3RyICs9ICIoKiI7CiAgICAgfQogICB9IGVsc2UKQEAgLTEyNzEsNyArMTI2OCw3IEBACiAgIC8vZnByaW50ZihzdGRlcnIsIkluIFJld3JpdGVPYmpDTWV0aG9kRGVjbFxuIik7CiAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlBSZXRUeXBlID0gMDsKICAgUmVzdWx0U3RyICs9ICJcbnN0YXRpYyAiOwotICBSZXdyaXRlVHlwZUludG9TdHJpbmcoT01ELT5nZXRSZXN1bHRUeXBlKCksIFJlc3VsdFN0ciwgRlBSZXRUeXBlKTsKKyAgUmV3cml0ZVR5cGVJbnRvU3RyaW5nKE9NRC0+Z2V0UmV0dXJuVHlwZSgpLCBSZXN1bHRTdHIsIEZQUmV0VHlwZSk7CiAgIFJlc3VsdFN0ciArPSAiICI7CiAKICAgLy8gVW5pcXVlIG1ldGhvZCBuYW1lCkBAIC0xMzI3LDkgKzEzMjQsNyBAQAogICBSZXN1bHRTdHIgKz0gIiBfY21kIjsKIAogICAvLyBNZXRob2QgYXJndW1lbnRzLgotICBmb3IgKE9iakNNZXRob2REZWNsOjpwYXJhbV9pdGVyYXRvciBQSSA9IE9NRC0+cGFyYW1fYmVnaW4oKSwKLSAgICAgICBFID0gT01ELT5wYXJhbV9lbmQoKTsgUEkgIT0gRTsgKytQSSkgewotICAgIFBhcm1WYXJEZWNsICpQRGVjbCA9ICpQSTsKKyAgZm9yIChjb25zdCBhdXRvICpQRGVjbCA6IE9NRC0+cGFyYW1zKCkpIHsKICAgICBSZXN1bHRTdHIgKz0gIiwgIjsKICAgICBpZiAoUERlY2wtPmdldFR5cGUoKS0+aXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkpIHsKICAgICAgIFJlc3VsdFN0ciArPSAiaWQgIjsKQEAgLTEzNTMsMTQgKzEzNDgsMTUgQEAKICAgICAvLyBOb3csIGVtaXQgdGhlIGFyZ3VtZW50IHR5cGVzIChpZiBhbnkpLgogICAgIGlmIChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlQgPSBkeW5fY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oRlBSZXRUeXBlKSkgewogICAgICAgUmVzdWx0U3RyICs9ICIoIjsKLSAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVC0+Z2V0TnVtQXJncygpOyBpICE9IGU7ICsraSkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZULT5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyArK2kpIHsKICAgICAgICAgaWYgKGkpIFJlc3VsdFN0ciArPSAiLCAiOwotICAgICAgICBzdGQ6OnN0cmluZyBQYXJhbVN0ciA9IEZULT5nZXRBcmdUeXBlKGkpLmdldEFzU3RyaW5nKAotICAgICAgICAgIENvbnRleHQtPmdldFByaW50aW5nUG9saWN5KCkpOworICAgICAgICBzdGQ6OnN0cmluZyBQYXJhbVN0ciA9CisgICAgICAgICAgICBGVC0+Z2V0UGFyYW1UeXBlKGkpLmdldEFzU3RyaW5nKENvbnRleHQtPmdldFByaW50aW5nUG9saWN5KCkpOwogICAgICAgICBSZXN1bHRTdHIgKz0gUGFyYW1TdHI7CiAgICAgICB9CiAgICAgICBpZiAoRlQtPmlzVmFyaWFkaWMoKSkgewotICAgICAgICBpZiAoRlQtPmdldE51bUFyZ3MoKSkgUmVzdWx0U3RyICs9ICIsICI7CisgICAgICAgIGlmIChGVC0+Z2V0TnVtUGFyYW1zKCkpCisgICAgICAgICAgUmVzdWx0U3RyICs9ICIsICI7CiAgICAgICAgIFJlc3VsdFN0ciArPSAiLi4uIjsKICAgICAgIH0KICAgICAgIFJlc3VsdFN0ciArPSAiKSI7CkBAIC0xMzg1LDEyICsxMzgxLDggQEAKICAgZWxzZQogICAgIEluc2VydFRleHQoQ0lELT5nZXRMb2NTdGFydCgpLCAiLy8gIik7CiAKLSAgZm9yIChPYmpDQ2F0ZWdvcnlJbXBsRGVjbDo6aW5zdG1ldGhfaXRlcmF0b3IKLSAgICAgICBJID0gSU1EID8gSU1ELT5pbnN0bWV0aF9iZWdpbigpIDogQ0lELT5pbnN0bWV0aF9iZWdpbigpLAotICAgICAgIEUgPSBJTUQgPyBJTUQtPmluc3RtZXRoX2VuZCgpIDogQ0lELT5pbnN0bWV0aF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgeworICBmb3IgKGF1dG8gKk9NRCA6IElNRCA/IElNRC0+aW5zdGFuY2VfbWV0aG9kcygpIDogQ0lELT5pbnN0YW5jZV9tZXRob2RzKCkpIHsKICAgICBzdGQ6OnN0cmluZyBSZXN1bHRTdHI7Ci0gICAgT2JqQ01ldGhvZERlY2wgKk9NRCA9ICpJOwogICAgIFJld3JpdGVPYmpDTWV0aG9kRGVjbChPTUQtPmdldENsYXNzSW50ZXJmYWNlKCksIE9NRCwgUmVzdWx0U3RyKTsKICAgICBTb3VyY2VMb2NhdGlvbiBMb2NTdGFydCA9IE9NRC0+Z2V0TG9jU3RhcnQoKTsKICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQgPSBPTUQtPmdldENvbXBvdW5kQm9keSgpLT5nZXRMb2NTdGFydCgpOwpAQCAtMTQwMCwxMiArMTM5Miw4IEBACiAgICAgUmVwbGFjZVRleHQoTG9jU3RhcnQsIGVuZEJ1Zi1zdGFydEJ1ZiwgUmVzdWx0U3RyKTsKICAgfQogCi0gIGZvciAoT2JqQ0NhdGVnb3J5SW1wbERlY2w6OmNsYXNzbWV0aF9pdGVyYXRvcgotICAgICAgIEkgPSBJTUQgPyBJTUQtPmNsYXNzbWV0aF9iZWdpbigpIDogQ0lELT5jbGFzc21ldGhfYmVnaW4oKSwKLSAgICAgICBFID0gSU1EID8gSU1ELT5jbGFzc21ldGhfZW5kKCkgOiBDSUQtPmNsYXNzbWV0aF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgeworICBmb3IgKGF1dG8gKk9NRCA6IElNRCA/IElNRC0+Y2xhc3NfbWV0aG9kcygpIDogQ0lELT5jbGFzc19tZXRob2RzKCkpIHsKICAgICBzdGQ6OnN0cmluZyBSZXN1bHRTdHI7Ci0gICAgT2JqQ01ldGhvZERlY2wgKk9NRCA9ICpJOwogICAgIFJld3JpdGVPYmpDTWV0aG9kRGVjbChPTUQtPmdldENsYXNzSW50ZXJmYWNlKCksIE9NRCwgUmVzdWx0U3RyKTsKICAgICBTb3VyY2VMb2NhdGlvbiBMb2NTdGFydCA9IE9NRC0+Z2V0TG9jU3RhcnQoKTsKICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQgPSBPTUQtPmdldENvbXBvdW5kQm9keSgpLT5nZXRMb2NTdGFydCgpOwpAQCAtMTQxNCwxMiArMTQwMiw4IEBACiAgICAgY29uc3QgY2hhciAqZW5kQnVmID0gU00tPmdldENoYXJhY3RlckRhdGEoTG9jRW5kKTsKICAgICBSZXBsYWNlVGV4dChMb2NTdGFydCwgZW5kQnVmLXN0YXJ0QnVmLCBSZXN1bHRTdHIpOwogICB9Ci0gIGZvciAoT2JqQ0NhdGVnb3J5SW1wbERlY2w6OnByb3BpbXBsX2l0ZXJhdG9yCi0gICAgICAgSSA9IElNRCA/IElNRC0+cHJvcGltcGxfYmVnaW4oKSA6IENJRC0+cHJvcGltcGxfYmVnaW4oKSwKLSAgICAgICBFID0gSU1EID8gSU1ELT5wcm9waW1wbF9lbmQoKSA6IENJRC0+cHJvcGltcGxfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBSZXdyaXRlUHJvcGVydHlJbXBsRGVjbCgqSSwgSU1ELCBDSUQpOwotICB9CisgIGZvciAoYXV0byAqSSA6IElNRCA/IElNRC0+cHJvcGVydHlfaW1wbHMoKSA6IENJRC0+cHJvcGVydHlfaW1wbHMoKSkKKyAgICBSZXdyaXRlUHJvcGVydHlJbXBsRGVjbChJLCBJTUQsIENJRCk7CiAKICAgSW5zZXJ0VGV4dChJTUQgPyBJTUQtPmdldExvY0VuZCgpIDogQ0lELT5nZXRMb2NFbmQoKSwgIi8vICIpOwogfQpAQCAtMTQ0NCwxNyArMTQyOCwxMiBAQAogICAgIC8vIE1hcmsgdGhpcyB0eXBlZGVmIGFzIGhhdmluZyBiZWVuIHdyaXR0ZW4gaW50byBpdHMgYysrIGVxdWl2YWxlbnQuCiAgICAgT2JqQ1dyaXR0ZW5JbnRlcmZhY2VzLmluc2VydChDbGFzc0RlY2wtPmdldENhbm9uaWNhbERlY2woKSk7CiAgIAotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnByb3BfaXRlcmF0b3IgSSA9IENsYXNzRGVjbC0+cHJvcF9iZWdpbigpLAotICAgICAgICAgRSA9IENsYXNzRGVjbC0+cHJvcF9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgICBSZXdyaXRlUHJvcGVydHkoKkkpOwotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6Omluc3RtZXRoX2l0ZXJhdG9yCi0gICAgICAgICBJID0gQ2xhc3NEZWNsLT5pbnN0bWV0aF9iZWdpbigpLCBFID0gQ2xhc3NEZWNsLT5pbnN0bWV0aF9lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKQotICAgICAgUmV3cml0ZU1ldGhvZERlY2xhcmF0aW9uKCpJKTsKLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjpjbGFzc21ldGhfaXRlcmF0b3IKLSAgICAgICAgIEkgPSBDbGFzc0RlY2wtPmNsYXNzbWV0aF9iZWdpbigpLCBFID0gQ2xhc3NEZWNsLT5jbGFzc21ldGhfZW5kKCk7Ci0gICAgICAgICBJICE9IEU7ICsrSSkKLSAgICAgIFJld3JpdGVNZXRob2REZWNsYXJhdGlvbigqSSk7CisgICAgZm9yIChhdXRvICpJIDogQ2xhc3NEZWNsLT5wcm9wZXJ0aWVzKCkpCisgICAgICBSZXdyaXRlUHJvcGVydHkoSSk7CisgICAgZm9yIChhdXRvICpJIDogQ2xhc3NEZWNsLT5pbnN0YW5jZV9tZXRob2RzKCkpCisgICAgICBSZXdyaXRlTWV0aG9kRGVjbGFyYXRpb24oSSk7CisgICAgZm9yIChhdXRvICpJIDogQ2xhc3NEZWNsLT5jbGFzc19tZXRob2RzKCkpCisgICAgICBSZXdyaXRlTWV0aG9kRGVjbGFyYXRpb24oSSk7CiAKICAgICAvLyBMYXN0bHksIGNvbW1lbnQgb3V0IHRoZSBAZW5kLgogICAgIFJlcGxhY2VUZXh0KENsYXNzRGVjbC0+Z2V0QXRFbmRSYW5nZSgpLmdldEJlZ2luKCksIHN0cmxlbigiQGVuZCIpLCAKQEAgLTIxMTksMTIgKzIwOTgsOSBAQAogCiBTdG10ICpSZXdyaXRlTW9kZXJuT2JqQzo6UmV3cml0ZUF0RW5jb2RlKE9iakNFbmNvZGVFeHByICpFeHApIHsKICAgLy8gQ3JlYXRlIGEgbmV3IHN0cmluZyBleHByZXNzaW9uLgotICBRdWFsVHlwZSBTdHJUeXBlID0gQ29udGV4dC0+Z2V0UG9pbnRlclR5cGUoQ29udGV4dC0+Q2hhclR5KTsKICAgc3RkOjpzdHJpbmcgU3RyRW5jb2Rpbmc7CiAgIENvbnRleHQtPmdldE9iakNFbmNvZGluZ0ZvclR5cGUoRXhwLT5nZXRFbmNvZGVkVHlwZSgpLCBTdHJFbmNvZGluZyk7Ci0gIEV4cHIgKlJlcGxhY2VtZW50ID0gU3RyaW5nTGl0ZXJhbDo6Q3JlYXRlKCpDb250ZXh0LCBTdHJFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbDo6QXNjaWksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJUeXBlLCBTb3VyY2VMb2NhdGlvbigpKTsKKyAgRXhwciAqUmVwbGFjZW1lbnQgPSBnZXRTdHJpbmdMaXRlcmFsKFN0ckVuY29kaW5nKTsKICAgUmVwbGFjZVN0bXQoRXhwLCBSZXBsYWNlbWVudCk7CiAKICAgLy8gUmVwbGFjZSB0aGlzIHN1YmV4cHIgaW4gdGhlIHBhcmVudC4KQEAgLTIxMzgsMTEgKzIxMTQsNyBAQAogICBhc3NlcnQoU2VsR2V0VWlkRnVuY3Rpb25EZWNsICYmICJDYW4ndCBmaW5kIHNlbF9yZWdpc3Rlck5hbWUoKSBkZWNsIik7CiAgIC8vIENyZWF0ZSBhIGNhbGwgdG8gc2VsX3JlZ2lzdGVyTmFtZSgic2VsTmFtZSIpLgogICBTbWFsbFZlY3RvcjxFeHByKiwgOD4gU2VsRXhwcnM7Ci0gIFF1YWxUeXBlIGFyZ1R5cGUgPSBDb250ZXh0LT5nZXRQb2ludGVyVHlwZShDb250ZXh0LT5DaGFyVHkpOwotICBTZWxFeHBycy5wdXNoX2JhY2soU3RyaW5nTGl0ZXJhbDo6Q3JlYXRlKCpDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cC0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWw6OkFzY2lpLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdUeXBlLCBTb3VyY2VMb2NhdGlvbigpKSk7CisgIFNlbEV4cHJzLnB1c2hfYmFjayhnZXRTdHJpbmdMaXRlcmFsKEV4cC0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpKSk7CiAgIENhbGxFeHByICpTZWxFeHAgPSBTeW50aGVzaXplQ2FsbFRvRnVuY3Rpb25EZWNsKFNlbEdldFVpZEZ1bmN0aW9uRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2VsRXhwcnNbMF0sIFNlbEV4cHJzLnNpemUoKSk7CiAgIFJlcGxhY2VTdG10KEV4cCwgU2VsRXhwKTsKQEAgLTIyNjksNyArMjI0MSw3IEBACiAgICAgcHJvdG8gPSBkeW5fY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oZnVuY1R5cGUpOwogICAgIGlmICghcHJvdG8pCiAgICAgICByZXR1cm47Ci0gICAgVHlwZSA9IHByb3RvLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgVHlwZSA9IHByb3RvLT5nZXRSZXR1cm5UeXBlKCk7CiAgIH0KICAgZWxzZSBpZiAoRmllbGREZWNsICpGRCA9IGR5bl9jYXN0PEZpZWxkRGVjbD4oRGNsKSkgewogICAgIExvYyA9IEZELT5nZXRMb2NhdGlvbigpOwpAQCAtMjMwNCw4ICsyMjc2LDggQEAKICAgLy8gTm93IGNoZWNrIGFyZ3VtZW50cy4KICAgY29uc3QgY2hhciAqc3RhcnRCdWYgPSBTTS0+Z2V0Q2hhcmFjdGVyRGF0YShMb2MpOwogICBjb25zdCBjaGFyICpzdGFydEZ1bmNCdWYgPSBzdGFydEJ1ZjsKLSAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb3RvLT5nZXROdW1BcmdzKCk7IGkrKykgewotICAgIGlmIChuZWVkVG9TY2FuRm9yUXVhbGlmaWVycyhwcm90by0+Z2V0QXJnVHlwZShpKSkpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb3RvLT5nZXROdW1QYXJhbXMoKTsgaSsrKSB7CisgICAgaWYgKG5lZWRUb1NjYW5Gb3JRdWFsaWZpZXJzKHByb3RvLT5nZXRQYXJhbVR5cGUoaSkpKSB7CiAgICAgICAvLyBTaW5jZSB0eXBlcyBhcmUgdW5pcXVlLCB3ZSBuZWVkIHRvIHNjYW4gdGhlIGJ1ZmZlci4KIAogICAgICAgY29uc3QgY2hhciAqZW5kQnVmID0gc3RhcnRCdWY7CkBAIC0yNDQzLDE0ICsyNDE1LDE0IEBACiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpwcm90byA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihmdW5jVHlwZSk7CiAgIGlmICghcHJvdG8pCiAgICAgcmV0dXJuOwotICBRdWFsVHlwZSBUeXBlID0gcHJvdG8tPmdldFJlc3VsdFR5cGUoKTsKKyAgUXVhbFR5cGUgVHlwZSA9IHByb3RvLT5nZXRSZXR1cm5UeXBlKCk7CiAgIHN0ZDo6c3RyaW5nIEZkU3RyID0gVHlwZS5nZXRBc1N0cmluZyhDb250ZXh0LT5nZXRQcmludGluZ1BvbGljeSgpKTsKICAgRmRTdHIgKz0gIiAiOwogICBGZFN0ciArPSBGRC0+Z2V0TmFtZSgpOwogICBGZFN0ciArPSAgIigiOwotICB1bnNpZ25lZCBudW1BcmdzID0gcHJvdG8tPmdldE51bUFyZ3MoKTsKKyAgdW5zaWduZWQgbnVtQXJncyA9IHByb3RvLT5nZXROdW1QYXJhbXMoKTsKICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICBRdWFsVHlwZSBBcmdUeXBlID0gcHJvdG8tPmdldEFyZ1R5cGUoaSk7CisgICAgUXVhbFR5cGUgQXJnVHlwZSA9IHByb3RvLT5nZXRQYXJhbVR5cGUoaSk7CiAgIFJld3JpdGVCbG9ja1BvaW50ZXJUeXBlKEZkU3RyLCBBcmdUeXBlKTsKICAgaWYgKGkrMSA8IG51bUFyZ3MpCiAgICAgRmRTdHIgKz0gIiwgIjsKQEAgLTI2MjMsNyArMjU5NSw3IEBACiAgIHVuc2lnbmVkIGk7CiAgIGZvciAoaT0wOyBpIDwgdG1wTmFtZS5sZW5ndGgoKTsgaSsrKSB7CiAgICAgY2hhciBjID0gdG1wTmFtZS5hdChpKTsKLSAgICAvLyByZXBsYWNlIGFueSBub24gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgd2l0aCAnXycuCisgICAgLy8gcmVwbGFjZSBhbnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHdpdGggJ18nLgogICAgIGlmICghaXNBbHBoYW51bWVyaWMoYykpCiAgICAgICB0bXBOYW1lW2ldID0gJ18nOwogICB9CkBAIC0yNjkxLDE3ICsyNjYzLDEzIEBACiAgIC8vIFN5bnRoZXNpemUgYSBjYWxsIHRvIG9iamNfbXNnU2VuZCgpLgogICBTbWFsbFZlY3RvcjxFeHByKiwgND4gTXNnRXhwcnM7CiAgIFNtYWxsVmVjdG9yPEV4cHIqLCA0PiBDbHNFeHByczsKLSAgUXVhbFR5cGUgYXJnVHlwZSA9IENvbnRleHQtPmdldFBvaW50ZXJUeXBlKENvbnRleHQtPkNoYXJUeSk7CiAgIAogICAvLyBDcmVhdGUgYSBjYWxsIHRvIG9iamNfZ2V0Q2xhc3MoIjxCb3hpbmdDbGFzcz4iKS4gSXQgd2lsbCBiZSB0aGUgMXN0IGFyZ3VtZW50LgogICBPYmpDTWV0aG9kRGVjbCAqQm94aW5nTWV0aG9kID0gRXhwLT5nZXRCb3hpbmdNZXRob2QoKTsKICAgT2JqQ0ludGVyZmFjZURlY2wgKkJveGluZ0NsYXNzID0gQm94aW5nTWV0aG9kLT5nZXRDbGFzc0ludGVyZmFjZSgpOwogICAKICAgSWRlbnRpZmllckluZm8gKmNsc05hbWUgPSBCb3hpbmdDbGFzcy0+Z2V0SWRlbnRpZmllcigpOwotICBDbHNFeHBycy5wdXNoX2JhY2soU3RyaW5nTGl0ZXJhbDo6Q3JlYXRlKCpDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc05hbWUtPmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsOjpBc2NpaSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnVHlwZSwgU291cmNlTG9jYXRpb24oKSkpOworICBDbHNFeHBycy5wdXNoX2JhY2soZ2V0U3RyaW5nTGl0ZXJhbChjbHNOYW1lLT5nZXROYW1lKCkpKTsKICAgQ2FsbEV4cHIgKkNscyA9IFN5bnRoZXNpemVDYWxsVG9GdW5jdGlvbkRlY2woR2V0Q2xhc3NGdW5jdGlvbkRlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbHNFeHByc1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xzRXhwcnMuc2l6ZSgpLCAKQEAgLTI3MTEsMTAgKzI2NzksOCBAQAogICAvLyBDcmVhdGUgYSBjYWxsIHRvIHNlbF9yZWdpc3Rlck5hbWUoIjxCb3hpbmdNZXRob2Q+OiIpLCBldGMuCiAgIC8vIGl0IHdpbGwgYmUgdGhlIDJuZCBhcmd1bWVudC4KICAgU21hbGxWZWN0b3I8RXhwciosIDQ+IFNlbEV4cHJzOwotICBTZWxFeHBycy5wdXNoX2JhY2soU3RyaW5nTGl0ZXJhbDo6Q3JlYXRlKCpDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJveGluZ01ldGhvZC0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWw6OkFzY2lpLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdUeXBlLCBTb3VyY2VMb2NhdGlvbigpKSk7CisgIFNlbEV4cHJzLnB1c2hfYmFjaygKKyAgICAgIGdldFN0cmluZ0xpdGVyYWwoQm94aW5nTWV0aG9kLT5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCkpKTsKICAgQ2FsbEV4cHIgKlNlbEV4cCA9IFN5bnRoZXNpemVDYWxsVG9GdW5jdGlvbkRlY2woU2VsR2V0VWlkRnVuY3Rpb25EZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2VsRXhwcnNbMF0sIFNlbEV4cHJzLnNpemUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYyk7CkBAIC0yNzM1LDkgKzI3MDEsOCBAQAogICBTbWFsbFZlY3RvcjxRdWFsVHlwZSwgND4gQXJnVHlwZXM7CiAgIEFyZ1R5cGVzLnB1c2hfYmFjayhDb250ZXh0LT5nZXRPYmpDSWRUeXBlKCkpOwogICBBcmdUeXBlcy5wdXNoX2JhY2soQ29udGV4dC0+Z2V0T2JqQ1NlbFR5cGUoKSk7Ci0gIGZvciAoT2JqQ01ldGhvZERlY2w6OnBhcmFtX2l0ZXJhdG9yIFBJID0gQm94aW5nTWV0aG9kLT5wYXJhbV9iZWdpbigpLAotICAgICAgIEUgPSBCb3hpbmdNZXRob2QtPnBhcmFtX2VuZCgpOyBQSSAhPSBFOyArK1BJKQotICAgIEFyZ1R5cGVzLnB1c2hfYmFjaygoKlBJKS0+Z2V0VHlwZSgpKTsKKyAgZm9yIChjb25zdCBhdXRvIFBJIDogQm94aW5nTWV0aG9kLT5wYXJhbWV0ZXJzKCkpCisgICAgQXJnVHlwZXMucHVzaF9iYWNrKFBJLT5nZXRUeXBlKCkpOwogICAKICAgUXVhbFR5cGUgcmV0dXJuVHlwZSA9IEV4cC0+Z2V0VHlwZSgpOwogICAvLyBHZXQgdGhlIHR5cGUsIHdlIHdpbGwgbmVlZCB0byByZWZlcmVuY2UgaXQgaW4gYSBjb3VwbGUgc3BvdHMuCkBAIC0yNzYyLDkgKzI3MjcsOCBAQAogICBQYXJlbkV4cHIgKlBFID0gbmV3IChDb250ZXh0KSBQYXJlbkV4cHIoU3RhcnRMb2MsIEVuZExvYywgY2FzdCk7CiAgIAogICBjb25zdCBGdW5jdGlvblR5cGUgKkZUID0gbXNnU2VuZFR5cGUtPmdldEFzPEZ1bmN0aW9uVHlwZT4oKTsKLSAgQ2FsbEV4cHIgKkNFID0gbmV3IChDb250ZXh0KSBDYWxsRXhwcigqQ29udGV4dCwgUEUsIE1zZ0V4cHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZULT5nZXRSZXN1bHRUeXBlKCksIFZLX1JWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MpOworICBDYWxsRXhwciAqQ0UgPSBuZXcgKENvbnRleHQpCisgICAgICBDYWxsRXhwcigqQ29udGV4dCwgUEUsIE1zZ0V4cHJzLCBGVC0+Z2V0UmV0dXJuVHlwZSgpLCBWS19SVmFsdWUsIEVuZExvYyk7CiAgIFJlcGxhY2VTdG10KEV4cCwgQ0UpOwogICByZXR1cm4gQ0U7CiB9CkBAIC0yODI4LDcgKzI3OTIsNiBAQAogICAvLyBTeW50aGVzaXplIGEgY2FsbCB0byBvYmpjX21zZ1NlbmQoKS4KICAgU21hbGxWZWN0b3I8RXhwciosIDMyPiBNc2dFeHByczsKICAgU21hbGxWZWN0b3I8RXhwciosIDQ+IENsc0V4cHJzOwotICBRdWFsVHlwZSBhcmdUeXBlID0gQ29udGV4dC0+Z2V0UG9pbnRlclR5cGUoQ29udGV4dC0+Q2hhclR5KTsKICAgUXVhbFR5cGUgZXhwVHlwZSA9IEV4cC0+Z2V0VHlwZSgpOwogICAKICAgLy8gQ3JlYXRlIGEgY2FsbCB0byBvYmpjX2dldENsYXNzKCJOU0FycmF5IikuIEl0IHdpbGwgYmUgdGggMXN0IGFyZ3VtZW50LgpAQCAtMjgzNiwxMCArMjc5OSw3IEBACiAgICAgZXhwVHlwZS0+Z2V0UG9pbnRlZVR5cGUoKS0+Z2V0QXM8T2JqQ09iamVjdFR5cGU+KCktPmdldEludGVyZmFjZSgpOwogICAKICAgSWRlbnRpZmllckluZm8gKmNsc05hbWUgPSBDbGFzcy0+Z2V0SWRlbnRpZmllcigpOwotICBDbHNFeHBycy5wdXNoX2JhY2soU3RyaW5nTGl0ZXJhbDo6Q3JlYXRlKCpDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc05hbWUtPmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsOjpBc2NpaSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnVHlwZSwgU291cmNlTG9jYXRpb24oKSkpOworICBDbHNFeHBycy5wdXNoX2JhY2soZ2V0U3RyaW5nTGl0ZXJhbChjbHNOYW1lLT5nZXROYW1lKCkpKTsKICAgQ2FsbEV4cHIgKkNscyA9IFN5bnRoZXNpemVDYWxsVG9GdW5jdGlvbkRlY2woR2V0Q2xhc3NGdW5jdGlvbkRlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbHNFeHByc1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xzRXhwcnMuc2l6ZSgpLCAKQEAgLTI4NTAsMTAgKzI4MTAsOCBAQAogICAvLyBpdCB3aWxsIGJlIHRoZSAybmQgYXJndW1lbnQuCiAgIFNtYWxsVmVjdG9yPEV4cHIqLCA0PiBTZWxFeHByczsKICAgT2JqQ01ldGhvZERlY2wgKkFycmF5TWV0aG9kID0gRXhwLT5nZXRBcnJheVdpdGhPYmplY3RzTWV0aG9kKCk7Ci0gIFNlbEV4cHJzLnB1c2hfYmFjayhTdHJpbmdMaXRlcmFsOjpDcmVhdGUoKkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlNZXRob2QtPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsOjpBc2NpaSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnVHlwZSwgU291cmNlTG9jYXRpb24oKSkpOworICBTZWxFeHBycy5wdXNoX2JhY2soCisgICAgICBnZXRTdHJpbmdMaXRlcmFsKEFycmF5TWV0aG9kLT5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCkpKTsKICAgQ2FsbEV4cHIgKlNlbEV4cCA9IFN5bnRoZXNpemVDYWxsVG9GdW5jdGlvbkRlY2woU2VsR2V0VWlkRnVuY3Rpb25EZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2VsRXhwcnNbMF0sIFNlbEV4cHJzLnNpemUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYyk7CkBAIC0yODcyLDkgKzI4MzAsOCBAQAogICBTbWFsbFZlY3RvcjxRdWFsVHlwZSwgND4gQXJnVHlwZXM7CiAgIEFyZ1R5cGVzLnB1c2hfYmFjayhDb250ZXh0LT5nZXRPYmpDSWRUeXBlKCkpOwogICBBcmdUeXBlcy5wdXNoX2JhY2soQ29udGV4dC0+Z2V0T2JqQ1NlbFR5cGUoKSk7Ci0gIGZvciAoT2JqQ01ldGhvZERlY2w6OnBhcmFtX2l0ZXJhdG9yIFBJID0gQXJyYXlNZXRob2QtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgRSA9IEFycmF5TWV0aG9kLT5wYXJhbV9lbmQoKTsgUEkgIT0gRTsgKytQSSkKLSAgICBBcmdUeXBlcy5wdXNoX2JhY2soKCpQSSktPmdldFR5cGUoKSk7CisgIGZvciAoY29uc3QgYXV0byAqUEkgOiBBcnJheU1ldGhvZC0+cGFyYW1zKCkpCisgICAgQXJnVHlwZXMucHVzaF9iYWNrKFBJLT5nZXRUeXBlKCkpOwogICAKICAgUXVhbFR5cGUgcmV0dXJuVHlwZSA9IEV4cC0+Z2V0VHlwZSgpOwogICAvLyBHZXQgdGhlIHR5cGUsIHdlIHdpbGwgbmVlZCB0byByZWZlcmVuY2UgaXQgaW4gYSBjb3VwbGUgc3BvdHMuCkBAIC0yODk5LDkgKzI4NTYsOCBAQAogICBQYXJlbkV4cHIgKlBFID0gbmV3IChDb250ZXh0KSBQYXJlbkV4cHIoU3RhcnRMb2MsIEVuZExvYywgY2FzdCk7CiAgIAogICBjb25zdCBGdW5jdGlvblR5cGUgKkZUID0gbXNnU2VuZFR5cGUtPmdldEFzPEZ1bmN0aW9uVHlwZT4oKTsKLSAgQ2FsbEV4cHIgKkNFID0gbmV3IChDb250ZXh0KSBDYWxsRXhwcigqQ29udGV4dCwgUEUsIE1zZ0V4cHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZULT5nZXRSZXN1bHRUeXBlKCksIFZLX1JWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MpOworICBDYWxsRXhwciAqQ0UgPSBuZXcgKENvbnRleHQpCisgICAgICBDYWxsRXhwcigqQ29udGV4dCwgUEUsIE1zZ0V4cHJzLCBGVC0+Z2V0UmV0dXJuVHlwZSgpLCBWS19SVmFsdWUsIEVuZExvYyk7CiAgIFJlcGxhY2VTdG10KEV4cCwgQ0UpOwogICByZXR1cm4gQ0U7CiB9CkBAIC0yOTkxLDcgKzI5NDcsNiBAQAogICAvLyBTeW50aGVzaXplIGEgY2FsbCB0byBvYmpjX21zZ1NlbmQoKS4KICAgU21hbGxWZWN0b3I8RXhwciosIDMyPiBNc2dFeHByczsKICAgU21hbGxWZWN0b3I8RXhwciosIDQ+IENsc0V4cHJzOwotICBRdWFsVHlwZSBhcmdUeXBlID0gQ29udGV4dC0+Z2V0UG9pbnRlclR5cGUoQ29udGV4dC0+Q2hhclR5KTsKICAgUXVhbFR5cGUgZXhwVHlwZSA9IEV4cC0+Z2V0VHlwZSgpOwogICAKICAgLy8gQ3JlYXRlIGEgY2FsbCB0byBvYmpjX2dldENsYXNzKCJOU0FycmF5IikuIEl0IHdpbGwgYmUgdGggMXN0IGFyZ3VtZW50LgpAQCAtMjk5OSwxMCArMjk1NCw3IEBACiAgIGV4cFR5cGUtPmdldFBvaW50ZWVUeXBlKCktPmdldEFzPE9iakNPYmplY3RUeXBlPigpLT5nZXRJbnRlcmZhY2UoKTsKICAgCiAgIElkZW50aWZpZXJJbmZvICpjbHNOYW1lID0gQ2xhc3MtPmdldElkZW50aWZpZXIoKTsKLSAgQ2xzRXhwcnMucHVzaF9iYWNrKFN0cmluZ0xpdGVyYWw6OkNyZWF0ZSgqQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNOYW1lLT5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbDo6QXNjaWksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1R5cGUsIFNvdXJjZUxvY2F0aW9uKCkpKTsKKyAgQ2xzRXhwcnMucHVzaF9iYWNrKGdldFN0cmluZ0xpdGVyYWwoY2xzTmFtZS0+Z2V0TmFtZSgpKSk7CiAgIENhbGxFeHByICpDbHMgPSBTeW50aGVzaXplQ2FsbFRvRnVuY3Rpb25EZWNsKEdldENsYXNzRnVuY3Rpb25EZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2xzRXhwcnNbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsc0V4cHJzLnNpemUoKSwgCkBAIC0zMDEzLDEwICsyOTY1LDcgQEAKICAgLy8gaXQgd2lsbCBiZSB0aGUgMm5kIGFyZ3VtZW50LgogICBTbWFsbFZlY3RvcjxFeHByKiwgND4gU2VsRXhwcnM7CiAgIE9iakNNZXRob2REZWNsICpEaWN0TWV0aG9kID0gRXhwLT5nZXREaWN0V2l0aE9iamVjdHNNZXRob2QoKTsKLSAgU2VsRXhwcnMucHVzaF9iYWNrKFN0cmluZ0xpdGVyYWw6OkNyZWF0ZSgqQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWN0TWV0aG9kLT5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbDo6QXNjaWksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1R5cGUsIFNvdXJjZUxvY2F0aW9uKCkpKTsKKyAgU2VsRXhwcnMucHVzaF9iYWNrKGdldFN0cmluZ0xpdGVyYWwoRGljdE1ldGhvZC0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpKSk7CiAgIENhbGxFeHByICpTZWxFeHAgPSBTeW50aGVzaXplQ2FsbFRvRnVuY3Rpb25EZWNsKFNlbEdldFVpZEZ1bmN0aW9uRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNlbEV4cHJzWzBdLCBTZWxFeHBycy5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBFbmRMb2MpOwpAQCAtMzAzOCw5ICsyOTg3LDggQEAKICAgU21hbGxWZWN0b3I8UXVhbFR5cGUsIDg+IEFyZ1R5cGVzOwogICBBcmdUeXBlcy5wdXNoX2JhY2soQ29udGV4dC0+Z2V0T2JqQ0lkVHlwZSgpKTsKICAgQXJnVHlwZXMucHVzaF9iYWNrKENvbnRleHQtPmdldE9iakNTZWxUeXBlKCkpOwotICBmb3IgKE9iakNNZXRob2REZWNsOjpwYXJhbV9pdGVyYXRvciBQSSA9IERpY3RNZXRob2QtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgRSA9IERpY3RNZXRob2QtPnBhcmFtX2VuZCgpOyBQSSAhPSBFOyArK1BJKSB7Ci0gICAgUXVhbFR5cGUgVCA9ICgqUEkpLT5nZXRUeXBlKCk7CisgIGZvciAoY29uc3QgYXV0byAqUEkgOiBEaWN0TWV0aG9kLT5wYXJhbXMoKSkgeworICAgIFF1YWxUeXBlIFQgPSBQSS0+Z2V0VHlwZSgpOwogICAgIGlmIChjb25zdCBQb2ludGVyVHlwZSogUFQgPSBULT5nZXRBczxQb2ludGVyVHlwZT4oKSkgewogICAgICAgUXVhbFR5cGUgUG9pbnRlZVR5ID0gUFQtPmdldFBvaW50ZWVUeXBlKCk7CiAgICAgICBjb252ZXJ0VG9VbnF1YWxpZmllZE9iakNUeXBlKFBvaW50ZWVUeSk7CkBAIC0zMDcyLDkgKzMwMjAsOCBAQAogICBQYXJlbkV4cHIgKlBFID0gbmV3IChDb250ZXh0KSBQYXJlbkV4cHIoU3RhcnRMb2MsIEVuZExvYywgY2FzdCk7CiAgIAogICBjb25zdCBGdW5jdGlvblR5cGUgKkZUID0gbXNnU2VuZFR5cGUtPmdldEFzPEZ1bmN0aW9uVHlwZT4oKTsKLSAgQ2FsbEV4cHIgKkNFID0gbmV3IChDb250ZXh0KSBDYWxsRXhwcigqQ29udGV4dCwgUEUsIE1zZ0V4cHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZULT5nZXRSZXN1bHRUeXBlKCksIFZLX1JWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MpOworICBDYWxsRXhwciAqQ0UgPSBuZXcgKENvbnRleHQpCisgICAgICBDYWxsRXhwcigqQ29udGV4dCwgUEUsIE1zZ0V4cHJzLCBGVC0+Z2V0UmV0dXJuVHlwZSgpLCBWS19SVmFsdWUsIEVuZExvYyk7CiAgIFJlcGxhY2VTdG10KEV4cCwgQ0UpOwogICByZXR1cm4gQ0U7CiB9CkBAIC0zMzMxLDcgKzMyNzgsNyBAQAogICAvLyBNYXkgbmVlZCB0byB1c2Ugb2JqY19tc2dTZW5kX3N0cmV0KCkgYXMgd2VsbC4KICAgRnVuY3Rpb25EZWNsICpNc2dTZW5kU3RyZXRGbGF2b3IgPSAwOwogICBpZiAoT2JqQ01ldGhvZERlY2wgKm1EZWNsID0gRXhwLT5nZXRNZXRob2REZWNsKCkpIHsKLSAgICBRdWFsVHlwZSByZXN1bHRUeXBlID0gbURlY2wtPmdldFJlc3VsdFR5cGUoKTsKKyAgICBRdWFsVHlwZSByZXN1bHRUeXBlID0gbURlY2wtPmdldFJldHVyblR5cGUoKTsKICAgICBpZiAocmVzdWx0VHlwZS0+aXNSZWNvcmRUeXBlKCkpCiAgICAgICBNc2dTZW5kU3RyZXRGbGF2b3IgPSBNc2dTZW5kU3RyZXRGdW5jdGlvbkRlY2w7CiAgICAgZWxzZSBpZiAocmVzdWx0VHlwZS0+aXNSZWFsRmxvYXRpbmdUeXBlKCkpCkBAIC0zMzY0LDExICszMzExLDcgQEAKIAogICAgIC8vIChpZCljbGFzc19nZXRTdXBlcmNsYXNzKChDbGFzcylvYmpjX2dldENsYXNzKCJDdXJyZW50Q2xhc3MiKSkKICAgICBTbWFsbFZlY3RvcjxFeHByKiwgOD4gQ2xzRXhwcnM7Ci0gICAgUXVhbFR5cGUgYXJnVHlwZSA9IENvbnRleHQtPmdldFBvaW50ZXJUeXBlKENvbnRleHQtPkNoYXJUeSk7Ci0gICAgQ2xzRXhwcnMucHVzaF9iYWNrKFN0cmluZ0xpdGVyYWw6OkNyZWF0ZSgqQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NEZWNsLT5nZXRJZGVudGlmaWVyKCktPmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbDo6QXNjaWksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdUeXBlLCBTb3VyY2VMb2NhdGlvbigpKSk7CisgICAgQ2xzRXhwcnMucHVzaF9iYWNrKGdldFN0cmluZ0xpdGVyYWwoQ2xhc3NEZWNsLT5nZXRJZGVudGlmaWVyKCktPmdldE5hbWUoKSkpOwogICAgIC8vIChDbGFzcylvYmpjX2dldENsYXNzKCJDdXJyZW50Q2xhc3MiKQogICAgIENhbGxFeHByICpDbHMgPSBTeW50aGVzaXplQ2FsbFRvRnVuY3Rpb25EZWNsKEdldE1ldGFDbGFzc0Z1bmN0aW9uRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2xzRXhwcnNbMF0sCkBAIC0zNDM1LDE0ICszMzc4LDEwIEBACiAKICAgY2FzZSBPYmpDTWVzc2FnZUV4cHI6OkNsYXNzOiB7CiAgICAgU21hbGxWZWN0b3I8RXhwciosIDg+IENsc0V4cHJzOwotICAgIFF1YWxUeXBlIGFyZ1R5cGUgPSBDb250ZXh0LT5nZXRQb2ludGVyVHlwZShDb250ZXh0LT5DaGFyVHkpOwogICAgIE9iakNJbnRlcmZhY2VEZWNsICpDbGFzcwogICAgICAgPSBFeHAtPmdldENsYXNzUmVjZWl2ZXIoKS0+Z2V0QXM8T2JqQ09iamVjdFR5cGU+KCktPmdldEludGVyZmFjZSgpOwogICAgIElkZW50aWZpZXJJbmZvICpjbHNOYW1lID0gQ2xhc3MtPmdldElkZW50aWZpZXIoKTsKLSAgICBDbHNFeHBycy5wdXNoX2JhY2soU3RyaW5nTGl0ZXJhbDo6Q3JlYXRlKCpDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzTmFtZS0+Z2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbDo6QXNjaWksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnVHlwZSwgU291cmNlTG9jYXRpb24oKSkpOworICAgIENsc0V4cHJzLnB1c2hfYmFjayhnZXRTdHJpbmdMaXRlcmFsKGNsc05hbWUtPmdldE5hbWUoKSkpOwogICAgIENhbGxFeHByICpDbHMgPSBTeW50aGVzaXplQ2FsbFRvRnVuY3Rpb25EZWNsKEdldENsYXNzRnVuY3Rpb25EZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbHNFeHByc1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHNFeHBycy5zaXplKCksIApAQCAtMzQ3MywxMSArMzQxMiw3IEBACiAgICAgCiAgICAgLy8gKGlkKWNsYXNzX2dldFN1cGVyY2xhc3MoKENsYXNzKW9iamNfZ2V0Q2xhc3MoIkN1cnJlbnRDbGFzcyIpKQogICAgIFNtYWxsVmVjdG9yPEV4cHIqLCA4PiBDbHNFeHByczsKLSAgICBRdWFsVHlwZSBhcmdUeXBlID0gQ29udGV4dC0+Z2V0UG9pbnRlclR5cGUoQ29udGV4dC0+Q2hhclR5KTsKLSAgICBDbHNFeHBycy5wdXNoX2JhY2soU3RyaW5nTGl0ZXJhbDo6Q3JlYXRlKCpDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2wtPmdldElkZW50aWZpZXIoKS0+Z2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsOjpBc2NpaSwgZmFsc2UsIGFyZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCkpKTsKKyAgICBDbHNFeHBycy5wdXNoX2JhY2soZ2V0U3RyaW5nTGl0ZXJhbChDbGFzc0RlY2wtPmdldElkZW50aWZpZXIoKS0+Z2V0TmFtZSgpKSk7CiAgICAgLy8gKENsYXNzKW9iamNfZ2V0Q2xhc3MoIkN1cnJlbnRDbGFzcyIpCiAgICAgQ2FsbEV4cHIgKkNscyA9IFN5bnRoZXNpemVDYWxsVG9GdW5jdGlvbkRlY2woR2V0Q2xhc3NGdW5jdGlvbkRlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsc0V4cHJzWzBdLApAQCAtMzU1NSwxMSArMzQ5MCw3IEBACiAKICAgLy8gQ3JlYXRlIGEgY2FsbCB0byBzZWxfcmVnaXN0ZXJOYW1lKCJzZWxOYW1lIiksIGl0IHdpbGwgYmUgdGhlIDJuZCBhcmd1bWVudC4KICAgU21hbGxWZWN0b3I8RXhwciosIDg+IFNlbEV4cHJzOwotICBRdWFsVHlwZSBhcmdUeXBlID0gQ29udGV4dC0+Z2V0UG9pbnRlclR5cGUoQ29udGV4dC0+Q2hhclR5KTsKLSAgU2VsRXhwcnMucHVzaF9iYWNrKFN0cmluZ0xpdGVyYWw6OkNyZWF0ZSgqQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cC0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbDo6QXNjaWksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnVHlwZSwgU291cmNlTG9jYXRpb24oKSkpOworICBTZWxFeHBycy5wdXNoX2JhY2soZ2V0U3RyaW5nTGl0ZXJhbChFeHAtPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKSkpOwogICBDYWxsRXhwciAqU2VsRXhwID0gU3ludGhlc2l6ZUNhbGxUb0Z1bmN0aW9uRGVjbChTZWxHZXRVaWRGdW5jdGlvbkRlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNlbEV4cHJzWzBdLCBTZWxFeHBycy5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLApAQCAtMzYzNCwxMSArMzU2NSwxMCBAQAogICBBcmdUeXBlcy5wdXNoX2JhY2soQ29udGV4dC0+Z2V0T2JqQ1NlbFR5cGUoKSk7CiAgIGlmIChPYmpDTWV0aG9kRGVjbCAqT01EID0gRXhwLT5nZXRNZXRob2REZWNsKCkpIHsKICAgICAvLyBQdXNoIGFueSB1c2VyIGFyZ3VtZW50IHR5cGVzLgotICAgIGZvciAoT2JqQ01ldGhvZERlY2w6OnBhcmFtX2l0ZXJhdG9yIFBJID0gT01ELT5wYXJhbV9iZWdpbigpLAotICAgICAgICAgRSA9IE9NRC0+cGFyYW1fZW5kKCk7IFBJICE9IEU7ICsrUEkpIHsKLSAgICAgIFF1YWxUeXBlIHQgPSAoKlBJKS0+Z2V0VHlwZSgpLT5pc09iakNRdWFsaWZpZWRJZFR5cGUoKQorICAgIGZvciAoY29uc3QgYXV0byAqUEkgOiBPTUQtPnBhcmFtcygpKSB7CisgICAgICBRdWFsVHlwZSB0ID0gUEktPmdldFR5cGUoKS0+aXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgID8gQ29udGV4dC0+Z2V0T2JqQ0lkVHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICA6ICgqUEkpLT5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICA6IFBJLT5nZXRUeXBlKCk7CiAgICAgICAvLyBNYWtlIHN1cmUgd2UgY29udmVydCAidCAoXikoLi4uKSIgdG8gInQgKCopKC4uLikiLgogICAgICAgKHZvaWQpY29udmVydEJsb2NrUG9pbnRlclRvRnVuY3Rpb25Qb2ludGVyKHQpOwogICAgICAgQXJnVHlwZXMucHVzaF9iYWNrKHQpOwpAQCAtMzY3Nyw4ICszNjA3LDggQEAKICAgUGFyZW5FeHByICpQRSA9IG5ldyAoQ29udGV4dCkgUGFyZW5FeHByKFN0YXJ0TG9jLCBFbmRMb2MsIGNhc3QpOwogCiAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQgPSBtc2dTZW5kVHlwZS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpOwotICBDYWxsRXhwciAqQ0UgPSBuZXcgKENvbnRleHQpIENhbGxFeHByKCpDb250ZXh0LCBQRSwgTXNnRXhwcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlQtPmdldFJlc3VsdFR5cGUoKSwgVktfUlZhbHVlLCBFbmRMb2MpOworICBDYWxsRXhwciAqQ0UgPSBuZXcgKENvbnRleHQpCisgICAgICBDYWxsRXhwcigqQ29udGV4dCwgUEUsIE1zZ0V4cHJzLCBGVC0+Z2V0UmV0dXJuVHlwZSgpLCBWS19SVmFsdWUsIEVuZExvYyk7CiAgIFN0bXQgKlJlcGxhY2luZ1N0bXQgPSBDRTsKICAgaWYgKE1zZ1NlbmRTdHJldEZsYXZvcikgewogICAgIC8vIFdlIGhhdmUgdGhlIG1ldGhvZCB3aGljaCByZXR1cm5zIGEgc3RydWN0L3VuaW9uLiBNdXN0IGFsc28gZ2VuZXJhdGUKQEAgLTM3MzMsMTIgKzM2NjMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ19FeHRlcm4pOwogICBEZWNsUmVmRXhwciAqRFJFID0gbmV3IChDb250ZXh0KSBEZWNsUmVmRXhwcihWRCwgZmFsc2UsIGdldFByb3RvY29sVHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19MVmFsdWUsIFNvdXJjZUxvY2F0aW9uKCkpOwotICBFeHByICpEZXJlZkV4cHIgPSBuZXcgKENvbnRleHQpIFVuYXJ5T3BlcmF0b3IoRFJFLCBVT19BZGRyT2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQtPmdldFBvaW50ZXJUeXBlKERSRS0+Z2V0VHlwZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUlZhbHVlLCBPS19PcmRpbmFyeSwgU291cmNlTG9jYXRpb24oKSk7Ci0gIENhc3RFeHByICpjYXN0RXhwciA9IE5vVHlwZUluZm9DU3R5bGVDYXN0RXhwcihDb250ZXh0LCBEZXJlZkV4cHItPmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENLX0JpdENhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJlZkV4cHIpOworICBDYXN0RXhwciAqY2FzdEV4cHIgPQorICAgIE5vVHlwZUluZm9DU3R5bGVDYXN0RXhwcigKKyAgICAgIENvbnRleHQsIENvbnRleHQtPmdldFBvaW50ZXJUeXBlKERSRS0+Z2V0VHlwZSgpKSwgQ0tfQml0Q2FzdCwgRFJFKTsKICAgUmVwbGFjZVN0bXQoRXhwLCBjYXN0RXhwcik7CiAgIFByb3RvY29sRXhwckRlY2xzLmluc2VydChFeHAtPmdldFByb3RvY29sKCktPmdldENhbm9uaWNhbERlY2woKSk7CiAgIC8vIGRlbGV0ZSBFeHA7IGxlYWsgZm9yIG5vdywgc2VlIFJld3JpdGVQcm9wZXJ0eU9ySW1wbGljaXRTZXR0ZXIoKSB1c2FnZSBmb3IgbW9yZSBpbmZvLgpAQCAtMzgzMSwxMSArMzc1OCw4IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQogICAgICAgUmVzdWx0ICs9ICIge1xuIjsKLSAgICAgIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgaSA9IFJELT5maWVsZF9iZWdpbigpLCAKLSAgICAgICAgICAgZSA9IFJELT5maWVsZF9lbmQoKTsgaSAhPSBlOyArK2kpIHsKLSAgICAgICAgRmllbGREZWNsICpGRCA9ICppOworICAgICAgZm9yIChhdXRvICpGRCA6IFJELT5maWVsZHMoKSkKICAgICAgICAgUmV3cml0ZU9iakNGaWVsZERlY2woRkQsIFJlc3VsdCk7Ci0gICAgICB9CiAgICAgICBSZXN1bHQgKz0gIlx0fSAiOyAKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTM4NTIsOCArMzc3Niw3IEBACiAgICAgICB9CiAgICAgICAKICAgICAgIFJlc3VsdCArPSAiIHtcbiI7Ci0gICAgICBmb3IgKEVudW1EZWNsOjplbnVtZXJhdG9yX2l0ZXJhdG9yIEVDID0gRUQtPmVudW1lcmF0b3JfYmVnaW4oKSwKLSAgICAgICAgICAgRUNFbmQgPSBFRC0+ZW51bWVyYXRvcl9lbmQoKTsgRUMgIT0gRUNFbmQ7ICsrRUMpIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byAqRUMgOiBFRC0+ZW51bWVyYXRvcnMoKSkgewogICAgICAgICBSZXN1bHQgKz0gIlx0IjsgUmVzdWx0ICs9IEVDLT5nZXROYW1lKCk7IFJlc3VsdCArPSAiID0gIjsKICAgICAgICAgbGx2bTo6QVBTSW50IFZhbCA9IEVDLT5nZXRJbml0VmFsKCk7CiAgICAgICAgIFJlc3VsdCArPSBWYWwudG9TdHJpbmcoMTApOwpAQCAtNDIyNiw3ICs0MTQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBmdW5jTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIFRhZykgewogICBjb25zdCBGdW5jdGlvblR5cGUgKkFGVCA9IENFLT5nZXRGdW5jdGlvblR5cGUoKTsKLSAgUXVhbFR5cGUgUlQgPSBBRlQtPmdldFJlc3VsdFR5cGUoKTsKKyAgUXVhbFR5cGUgUlQgPSBBRlQtPmdldFJldHVyblR5cGUoKTsKICAgc3RkOjpzdHJpbmcgU3RydWN0UmVmID0gInN0cnVjdCAiICsgVGFnOwogICBTb3VyY2VMb2NhdGlvbiBCbG9ja0xvYyA9IENFLT5nZXRFeHByTG9jKCk7CiAgIHN0ZDo6c3RyaW5nIFM7CkBAIC00NzMxLDEzICs0NjU0LDEyIEBACiAgIC8vIEZUUCB3aWxsIGJlIG51bGwgZm9yIGNsb3N1cmVzIHRoYXQgZG9uJ3QgdGFrZSBhcmd1bWVudHMuCiAgIC8vIEdlbmVyYXRlIGEgZnVua3kgY2FzdC4KICAgU21hbGxWZWN0b3I8UXVhbFR5cGUsIDg+IEFyZ1R5cGVzOwotICBRdWFsVHlwZSBSZXMgPSBGVC0+Z2V0UmVzdWx0VHlwZSgpOworICBRdWFsVHlwZSBSZXMgPSBGVC0+Z2V0UmV0dXJuVHlwZSgpOwogICBib29sIG1vZGlmaWVkID0gY29udmVydE9iakNUeXBlVG9DU3R5bGVUeXBlKFJlcyk7CiAgIAogICBpZiAoRlRQKSB7Ci0gICAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6YXJnX3R5cGVfaXRlcmF0b3IgSSA9IEZUUC0+YXJnX3R5cGVfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBGVFAtPmFyZ190eXBlX2VuZCgpOyBJICYmIChJICE9IEUpOyArK0kpIHsKLSAgICAgIFF1YWxUeXBlIHQgPSAqSTsKKyAgICBmb3IgKGF1dG8gJkkgOiBGVFAtPnBhcmFtX3R5cGVzKCkpIHsKKyAgICAgIFF1YWxUeXBlIHQgPSBJOwogICAgICAgLy8gTWFrZSBzdXJlIHdlIGNvbnZlcnQgInQgKF4pKC4uLikiIHRvICJ0ICgqKSguLi4pIi4KICAgICAgIGlmIChjb252ZXJ0T2JqQ1R5cGVUb0NTdHlsZVR5cGUodCkpCiAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKQEAgLTQ4MDMsOSArNDcyNSw4IEBACiAgIC8vIFB1c2ggdGhlIGJsb2NrIGFyZ3VtZW50IHR5cGUuCiAgIEFyZ1R5cGVzLnB1c2hfYmFjayhQdHJCbG9jayk7CiAgIGlmIChGVFApIHsKLSAgICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjphcmdfdHlwZV9pdGVyYXRvciBJID0gRlRQLT5hcmdfdHlwZV9iZWdpbigpLAotICAgICAgICAgRSA9IEZUUC0+YXJnX3R5cGVfZW5kKCk7IEkgJiYgKEkgIT0gRSk7ICsrSSkgewotICAgICAgUXVhbFR5cGUgdCA9ICpJOworICAgIGZvciAoYXV0byAmSSA6IEZUUC0+cGFyYW1fdHlwZXMoKSkgeworICAgICAgUXVhbFR5cGUgdCA9IEk7CiAgICAgICAvLyBNYWtlIHN1cmUgd2UgY29udmVydCAidCAoXikoLi4uKSIgdG8gInQgKCopKC4uLikiLgogICAgICAgaWYgKCFjb252ZXJ0QmxvY2tQb2ludGVyVG9GdW5jdGlvblBvaW50ZXIodCkpCiAgICAgICAgIGNvbnZlcnRUb1VucXVhbGlmaWVkT2JqQ1R5cGUodCk7CkBAIC01MDIzLDkgKzQ5NDQsOCBAQAogICAgIEZUUCA9IEJQVC0+Z2V0UG9pbnRlZVR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CiAgIH0KICAgaWYgKEZUUCkgewotICAgIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yIEkgPSBGVFAtPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgICBFID0gRlRQLT5hcmdfdHlwZV9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgICBpZiAoaXNUb3BMZXZlbEJsb2NrUG9pbnRlclR5cGUoKkkpKQorICAgIGZvciAoY29uc3QgYXV0byAmSSA6IEZUUC0+cGFyYW1fdHlwZXMoKSkKKyAgICAgIGlmIChpc1RvcExldmVsQmxvY2tQb2ludGVyVHlwZShJKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAgIH0KICAgcmV0dXJuIGZhbHNlOwpAQCAtNTA0MiwxMiArNDk2MiwxMSBAQAogICAgIEZUUCA9IEJQVC0+Z2V0UG9pbnRlZVR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CiAgIH0KICAgaWYgKEZUUCkgewotICAgIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yIEkgPSBGVFAtPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgICBFID0gRlRQLT5hcmdfdHlwZV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIGlmICgoKkkpLT5pc09iakNRdWFsaWZpZWRJZFR5cGUoKSkKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBGVFAtPnBhcmFtX3R5cGVzKCkpIHsKKyAgICAgIGlmIChJLT5pc09iakNRdWFsaWZpZWRJZFR5cGUoKSkKICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBpZiAoKCpJKS0+aXNPYmpDT2JqZWN0UG9pbnRlclR5cGUoKSAmJgotICAgICAgICAgICgqSSktPmdldFBvaW50ZWVUeXBlKCktPmlzT2JqQ1F1YWxpZmllZEludGVyZmFjZVR5cGUoKSkKKyAgICAgIGlmIChJLT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpICYmCisgICAgICAgICAgSS0+Z2V0UG9pbnRlZVR5cGUoKS0+aXNPYmpDUXVhbGlmaWVkSW50ZXJmYWNlVHlwZSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgICAgIApAQCAtNTU4MCwxMSArNTQ5OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpKTsKICAgICAgIGJvb2wgaXNOZXN0ZWRDYXB0dXJlZFZhciA9IGZhbHNlOwogICAgICAgaWYgKGJsb2NrKQotICAgICAgICBmb3IgKEJsb2NrRGVjbDo6Y2FwdHVyZV9jb25zdF9pdGVyYXRvciBjaSA9IGJsb2NrLT5jYXB0dXJlX2JlZ2luKCksCi0gICAgICAgICAgICAgY2UgPSBibG9jay0+Y2FwdHVyZV9lbmQoKTsgY2kgIT0gY2U7ICsrY2kpIHsKLSAgICAgICAgICBjb25zdCBWYXJEZWNsICp2YXJpYWJsZSA9IGNpLT5nZXRWYXJpYWJsZSgpOwotICAgICAgICAgIGlmICh2YXJpYWJsZSA9PSBORCAmJiBjaS0+aXNOZXN0ZWQoKSkgewotICAgICAgICAgICAgYXNzZXJ0IChjaS0+aXNCeVJlZigpICYmIAorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJkNJIDogYmxvY2stPmNhcHR1cmVzKCkpIHsKKyAgICAgICAgICBjb25zdCBWYXJEZWNsICp2YXJpYWJsZSA9IENJLmdldFZhcmlhYmxlKCk7CisgICAgICAgICAgaWYgKHZhcmlhYmxlID09IE5EICYmIENJLmlzTmVzdGVkKCkpIHsKKyAgICAgICAgICAgIGFzc2VydCAoQ0kuaXNCeVJlZigpICYmIAogICAgICAgICAgICAgICAgICAgICAiU3ludGhCbG9ja0luaXRFeHByIC0gY2FwdHVyZWQgYmxvY2sgdmFyaWFibGUgaXMgbm90IGJ5cmVmIik7CiAgICAgICAgICAgICBpc05lc3RlZENhcHR1cmVkVmFyID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTg4Nyw5ICs1ODA1LDcgQEAKIH0KIAogdm9pZCBSZXdyaXRlTW9kZXJuT2JqQzo6UmV3cml0ZVJlY29yZEJvZHkoUmVjb3JkRGVjbCAqUkQpIHsKLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBpID0gUkQtPmZpZWxkX2JlZ2luKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBSRC0+ZmllbGRfZW5kKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgRmllbGREZWNsICpGRCA9ICppOworICBmb3IgKGF1dG8gKkZEIDogUkQtPmZpZWxkcygpKSB7CiAgICAgaWYgKGlzVG9wTGV2ZWxCbG9ja1BvaW50ZXJUeXBlKEZELT5nZXRUeXBlKCkpKQogICAgICAgUmV3cml0ZUJsb2NrUG9pbnRlckRlY2woRkQpOwogICAgIGlmIChGRC0+Z2V0VHlwZSgpLT5pc09iakNRdWFsaWZpZWRJZFR5cGUoKSB8fApAQCAtNjA0OSw5ICs1OTY1LDkgQEAKICAgUmV3cml0ZUluY2x1ZGUoKTsKIAogICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRnVuY3Rpb25EZWZpbml0aW9uc1NlZW4uc2l6ZSgpOyBpIDwgZTsgaSsrKSB7Ci0gICAgLy8gdHJhbnNsYXRpb24gb2YgZnVuY3Rpb24gYm9kaWVzIHdlcmUgcG9zdHBvbmVkIHVudGlsbCBhbGwgY2xhc3MgYW5kCisgICAgLy8gdHJhbnNsYXRpb24gb2YgZnVuY3Rpb24gYm9kaWVzIHdlcmUgcG9zdHBvbmVkIHVudGlsIGFsbCBjbGFzcyBhbmQKICAgICAvLyB0aGVpciBleHRlbnNpb25zIGFuZCBpbXBsZW1lbnRhdGlvbnMgYXJlIHNlZW4uIFRoaXMgaXMgYmVjYXVzZSwgd2UKLSAgICAvLyBjYW5ub3QgYnVpbGQgZ3JvdXBpbmcgc3RydWN0cyBmb3IgYml0ZmllbGRzIHVudGlsbCB0aGV5IGFyZSBhbGwgc2Vlbi4KKyAgICAvLyBjYW5ub3QgYnVpbGQgZ3JvdXBpbmcgc3RydWN0cyBmb3IgYml0ZmllbGRzIHVudGlsIHRoZXkgYXJlIGFsbCBzZWVuLgogICAgIEZ1bmN0aW9uRGVjbCAqRkRlY2wgPSBGdW5jdGlvbkRlZmluaXRpb25zU2VlbltpXTsKICAgICBIYW5kbGVUb3BMZXZlbFNpbmdsZURlY2woRkRlY2wpOwogICB9CkBAIC02MTkyLDcgKzYxMDgsMTEgQEAKICAgUHJlYW1ibGUgKz0gIiAgaW50ICppc2E7XG4iOwogICBQcmVhbWJsZSArPSAiICBpbnQgZmxhZ3M7XG4iOwogICBQcmVhbWJsZSArPSAiICBjaGFyICpzdHI7XG4iOworICBQcmVhbWJsZSArPSAiI2lmIF9fTExQNjRfX1xuIjsKKyAgUHJlYW1ibGUgKz0gIiAgbG9uZyBsb25nIGxlbmd0aDtcbiI7CisgIFByZWFtYmxlICs9ICIjZWxzZVxuIjsKICAgUHJlYW1ibGUgKz0gIiAgbG9uZyBsZW5ndGg7XG4iOworICBQcmVhbWJsZSArPSAiI2VuZGlmXG4iOwogICBQcmVhbWJsZSArPSAifTtcbiI7CiAgIFByZWFtYmxlICs9ICIjaWZkZWYgQ0ZfRVhQT1JUX0NPTlNUQU5UX1NUUklOR1xuIjsKICAgUHJlYW1ibGUgKz0gImV4dGVybiBcIkNcIiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgaW50IF9fQ0ZDb25zdGFudFN0cmluZ0NsYXNzUmVmZXJlbmNlW107XG4iOwpAQCAtNzA2NSwxNyArNjk4NSwxMyBAQAogICAgIFBEZWNsID0gRGVmOwogICAvLyBNdXN0IHdyaXRlIG91dCBhbGwgcHJvdG9jb2wgZGVmaW5pdGlvbnMgaW4gY3VycmVudCBxdWFsaWZpZXIgbGlzdCwKICAgLy8gYW5kIGluIHRoZWlyIG5lc3RlZCBxdWFsaWZpZXJzIGJlZm9yZSB3cml0aW5nIG91dCBjdXJyZW50IGRlZmluaXRpb24uCi0gIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgSSA9IFBEZWNsLT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgIEUgPSBQRGVjbC0+cHJvdG9jb2xfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgIFJld3JpdGVPYmpDUHJvdG9jb2xNZXRhRGF0YSgqSSwgUmVzdWx0KTsKKyAgZm9yIChhdXRvICpJIDogUERlY2wtPnByb3RvY29scygpKQorICAgIFJld3JpdGVPYmpDUHJvdG9jb2xNZXRhRGF0YShJLCBSZXN1bHQpOwogICAKICAgLy8gQ29uc3RydWN0IG1ldGhvZCBsaXN0cy4KICAgc3RkOjp2ZWN0b3I8T2JqQ01ldGhvZERlY2wgKj4gSW5zdGFuY2VNZXRob2RzLCBDbGFzc01ldGhvZHM7CiAgIHN0ZDo6dmVjdG9yPE9iakNNZXRob2REZWNsICo+IE9wdEluc3RhbmNlTWV0aG9kcywgT3B0Q2xhc3NNZXRob2RzOwotICBmb3IgKE9iakNQcm90b2NvbERlY2w6Omluc3RtZXRoX2l0ZXJhdG9yCi0gICAgICAgSSA9IFBEZWNsLT5pbnN0bWV0aF9iZWdpbigpLCBFID0gUERlY2wtPmluc3RtZXRoX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgT2JqQ01ldGhvZERlY2wgKk1EID0gKkk7CisgIGZvciAoYXV0byAqTUQgOiBQRGVjbC0+aW5zdGFuY2VfbWV0aG9kcygpKSB7CiAgICAgaWYgKE1ELT5nZXRJbXBsZW1lbnRhdGlvbkNvbnRyb2woKSA9PSBPYmpDTWV0aG9kRGVjbDo6T3B0aW9uYWwpIHsKICAgICAgIE9wdEluc3RhbmNlTWV0aG9kcy5wdXNoX2JhY2soTUQpOwogICAgIH0gZWxzZSB7CkBAIC03MDgzLDEwICs2OTk5LDcgQEAKICAgICB9CiAgIH0KICAgCi0gIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6Y2xhc3NtZXRoX2l0ZXJhdG9yCi0gICAgICAgSSA9IFBEZWNsLT5jbGFzc21ldGhfYmVnaW4oKSwgRSA9IFBEZWNsLT5jbGFzc21ldGhfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBPYmpDTWV0aG9kRGVjbCAqTUQgPSAqSTsKKyAgZm9yIChhdXRvICpNRCA6IFBEZWNsLT5jbGFzc19tZXRob2RzKCkpIHsKICAgICBpZiAoTUQtPmdldEltcGxlbWVudGF0aW9uQ29udHJvbCgpID09IE9iakNNZXRob2REZWNsOjpPcHRpb25hbCkgewogICAgICAgT3B0Q2xhc3NNZXRob2RzLnB1c2hfYmFjayhNRCk7CiAgICAgfSBlbHNlIHsKQEAgLTcxMDgsMTEgKzcwMjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX09CSkNfUFJPVE9DT0xfTUVUSE9EX1RZUEVTXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEZWNsLT5nZXROYW1lQXNTdHJpbmcoKSk7CiAgIC8vIFByb3RvY29sJ3Mgc3VwZXIgcHJvdG9jb2wgbGlzdAotICBzdGQ6OnZlY3RvcjxPYmpDUHJvdG9jb2xEZWNsICo+IFN1cGVyUHJvdG9jb2xzOwotICBmb3IgKE9iakNQcm90b2NvbERlY2w6OnByb3RvY29sX2l0ZXJhdG9yIEkgPSBQRGVjbC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICBFID0gUERlY2wtPnByb3RvY29sX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBTdXBlclByb3RvY29scy5wdXNoX2JhY2soKkkpOwotICAKKyAgU21hbGxWZWN0b3I8T2JqQ1Byb3RvY29sRGVjbCAqLCA4PiBTdXBlclByb3RvY29scyhQRGVjbC0+cHJvdG9jb2xzKCkpOyAgCiAgIFdyaXRlX3Byb3RvY29sX2xpc3RfaW5pdGlhbGl6ZXIoQ29udGV4dCwgUmVzdWx0LCBTdXBlclByb3RvY29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX09CSkNfUFJPVE9DT0xfUkVGU18iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEZWNsLT5nZXROYW1lQXNTdHJpbmcoKSk7CkBAIC03MTM0LDExICs3MDQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRGVjbC0+Z2V0TmFtZUFzU3RyaW5nKCksIGZhbHNlKTsKICAgCiAgIC8vIFByb3RvY29sJ3MgcHJvcGVydHkgbWV0YWRhdGEuCi0gIHN0ZDo6dmVjdG9yPE9iakNQcm9wZXJ0eURlY2wgKj4gUHJvdG9jb2xQcm9wZXJ0aWVzOwotICBmb3IgKE9iakNDb250YWluZXJEZWNsOjpwcm9wX2l0ZXJhdG9yIEkgPSBQRGVjbC0+cHJvcF9iZWdpbigpLAotICAgICAgIEUgPSBQRGVjbC0+cHJvcF9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgUHJvdG9jb2xQcm9wZXJ0aWVzLnB1c2hfYmFjaygqSSk7Ci0gIAorICBTbWFsbFZlY3RvcjxPYmpDUHJvcGVydHlEZWNsICosIDg+IFByb3RvY29sUHJvcGVydGllcyhQRGVjbC0+cHJvcGVydGllcygpKTsKICAgV3JpdGVfcHJvcF9saXN0X3RfaW5pdGlhbGl6ZXIoKnRoaXMsIENvbnRleHQsIFJlc3VsdCwgUHJvdG9jb2xQcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udGFpbmVyICovMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfT0JKQ19QUk9UT0NPTF9QUk9QRVJUSUVTXyIsCkBAIC03MzAwLDE0ICs3MjA1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGVjbCk7CiAgIAogICAvLyBCdWlsZCBfb2JqY19tZXRob2RfbGlzdCBmb3IgY2xhc3MncyBpbnN0YW5jZSBtZXRob2RzIGlmIG5lZWRlZAotICBTbWFsbFZlY3RvcjxPYmpDTWV0aG9kRGVjbCAqLCAzMj4KLSAgICBJbnN0YW5jZU1ldGhvZHMoSURlY2wtPmluc3RtZXRoX2JlZ2luKCksIElEZWNsLT5pbnN0bWV0aF9lbmQoKSk7CisgIFNtYWxsVmVjdG9yPE9iakNNZXRob2REZWNsICosIDMyPiBJbnN0YW5jZU1ldGhvZHMoSURlY2wtPmluc3RhbmNlX21ldGhvZHMoKSk7CiAgIAogICAvLyBJZiBhbnkgb2Ygb3VyIHByb3BlcnR5IGltcGxlbWVudGF0aW9ucyBoYXZlIGFzc29jaWF0ZWQgZ2V0dGVycyBvcgogICAvLyBzZXR0ZXJzLCBwcm9kdWNlIG1ldGFkYXRhIGZvciB0aGVtIGFzIHdlbGwuCi0gIGZvciAoT2JqQ0ltcGxEZWNsOjpwcm9waW1wbF9pdGVyYXRvciBQcm9wID0gSURlY2wtPnByb3BpbXBsX2JlZ2luKCksCi0gICAgICAgUHJvcEVuZCA9IElEZWNsLT5wcm9waW1wbF9lbmQoKTsKLSAgICAgICBQcm9wICE9IFByb3BFbmQ7ICsrUHJvcCkgeworICBmb3IgKGNvbnN0IGF1dG8gKlByb3AgOiBJRGVjbC0+cHJvcGVydHlfaW1wbHMoKSkgewogICAgIGlmIChQcm9wLT5nZXRQcm9wZXJ0eUltcGxlbWVudGF0aW9uKCkgPT0gT2JqQ1Byb3BlcnR5SW1wbERlY2w6OkR5bmFtaWMpCiAgICAgICBjb250aW51ZTsKICAgICBpZiAoIVByb3AtPmdldFByb3BlcnR5SXZhckRlY2woKSkKQEAgLTczMjksOCArNzIzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9PQkpDXyRfSU5TVEFOQ0VfTUVUSE9EU18iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEZWNsLT5nZXROYW1lQXNTdHJpbmcoKSwgdHJ1ZSk7CiAgIAotICBTbWFsbFZlY3RvcjxPYmpDTWV0aG9kRGVjbCAqLCAzMj4KLSAgICBDbGFzc01ldGhvZHMoSURlY2wtPmNsYXNzbWV0aF9iZWdpbigpLCBJRGVjbC0+Y2xhc3NtZXRoX2VuZCgpKTsKKyAgU21hbGxWZWN0b3I8T2JqQ01ldGhvZERlY2wgKiwgMzI+IENsYXNzTWV0aG9kcyhJRGVjbC0+Y2xhc3NfbWV0aG9kcygpKTsKICAgCiAgIFdyaXRlX21ldGhvZF9saXN0X3RfaW5pdGlhbGl6ZXIoKnRoaXMsIENvbnRleHQsIFJlc3VsdCwgQ2xhc3NNZXRob2RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfT0JKQ18kX0NMQVNTX01FVEhPRFNfIiwKQEAgLTczNTUsMTEgKzcyNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEZWNsLT5nZXROYW1lQXNTdHJpbmcoKSk7CiAgIAogICAvLyBQcm90b2NvbCdzIHByb3BlcnR5IG1ldGFkYXRhLgotICBzdGQ6OnZlY3RvcjxPYmpDUHJvcGVydHlEZWNsICo+IENsYXNzUHJvcGVydGllczsKLSAgZm9yIChPYmpDQ29udGFpbmVyRGVjbDo6cHJvcF9pdGVyYXRvciBJID0gQ0RlY2wtPnByb3BfYmVnaW4oKSwKLSAgICAgICBFID0gQ0RlY2wtPnByb3BfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgIENsYXNzUHJvcGVydGllcy5wdXNoX2JhY2soKkkpOwotICAKKyAgU21hbGxWZWN0b3I8T2JqQ1Byb3BlcnR5RGVjbCAqLCA4PiBDbGFzc1Byb3BlcnRpZXMoQ0RlY2wtPnByb3BlcnRpZXMoKSk7CiAgIFdyaXRlX3Byb3BfbGlzdF90X2luaXRpYWxpemVyKCp0aGlzLCBDb250ZXh0LCBSZXN1bHQsIENsYXNzUHJvcGVydGllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRhaW5lciAqL0lEZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9PQkpDXyRfUFJPUF9MSVNUXyIsCkBAIC03NTYxLDE0ICs3NDU4LDExIEBACiAgIEZ1bGxDYXRlZ29yeU5hbWUgKz0gQ0RlY2wtPmdldE5hbWVBc1N0cmluZygpOwogICAKICAgLy8gQnVpbGQgX29iamNfbWV0aG9kX2xpc3QgZm9yIGNsYXNzJ3MgaW5zdGFuY2UgbWV0aG9kcyBpZiBuZWVkZWQKLSAgU21hbGxWZWN0b3I8T2JqQ01ldGhvZERlY2wgKiwgMzI+Ci0gIEluc3RhbmNlTWV0aG9kcyhJRGVjbC0+aW5zdG1ldGhfYmVnaW4oKSwgSURlY2wtPmluc3RtZXRoX2VuZCgpKTsKKyAgU21hbGxWZWN0b3I8T2JqQ01ldGhvZERlY2wgKiwgMzI+IEluc3RhbmNlTWV0aG9kcyhJRGVjbC0+aW5zdGFuY2VfbWV0aG9kcygpKTsKICAgCiAgIC8vIElmIGFueSBvZiBvdXIgcHJvcGVydHkgaW1wbGVtZW50YXRpb25zIGhhdmUgYXNzb2NpYXRlZCBnZXR0ZXJzIG9yCiAgIC8vIHNldHRlcnMsIHByb2R1Y2UgbWV0YWRhdGEgZm9yIHRoZW0gYXMgd2VsbC4KLSAgZm9yIChPYmpDSW1wbERlY2w6OnByb3BpbXBsX2l0ZXJhdG9yIFByb3AgPSBJRGVjbC0+cHJvcGltcGxfYmVnaW4oKSwKLSAgICAgICBQcm9wRW5kID0gSURlY2wtPnByb3BpbXBsX2VuZCgpOwotICAgICAgIFByb3AgIT0gUHJvcEVuZDsgKytQcm9wKSB7CisgIGZvciAoY29uc3QgYXV0byAqUHJvcCA6IElEZWNsLT5wcm9wZXJ0eV9pbXBscygpKSB7CiAgICAgaWYgKFByb3AtPmdldFByb3BlcnR5SW1wbGVtZW50YXRpb24oKSA9PSBPYmpDUHJvcGVydHlJbXBsRGVjbDo6RHluYW1pYykKICAgICAgIGNvbnRpbnVlOwogICAgIGlmICghUHJvcC0+Z2V0UHJvcGVydHlJdmFyRGVjbCgpKQpAQCAtNzU4OCw4ICs3NDgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX09CSkNfJF9DQVRFR09SWV9JTlNUQU5DRV9NRVRIT0RTXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVsbENhdGVnb3J5TmFtZSwgdHJ1ZSk7CiAgIAotICBTbWFsbFZlY3RvcjxPYmpDTWV0aG9kRGVjbCAqLCAzMj4KLSAgICBDbGFzc01ldGhvZHMoSURlY2wtPmNsYXNzbWV0aF9iZWdpbigpLCBJRGVjbC0+Y2xhc3NtZXRoX2VuZCgpKTsKKyAgU21hbGxWZWN0b3I8T2JqQ01ldGhvZERlY2wgKiwgMzI+IENsYXNzTWV0aG9kcyhJRGVjbC0+Y2xhc3NfbWV0aG9kcygpKTsKICAgCiAgIFdyaXRlX21ldGhvZF9saXN0X3RfaW5pdGlhbGl6ZXIoKnRoaXMsIENvbnRleHQsIFJlc3VsdCwgQ2xhc3NNZXRob2RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfT0JKQ18kX0NBVEVHT1JZX0NMQVNTX01FVEhPRFNfIiwKQEAgLTc1OTcsMTYgKzc0OTAsMTEgQEAKICAgCiAgIC8vIFByb3RvY29scyByZWZlcmVuY2VkIGluIGNsYXNzIGRlY2xhcmF0aW9uPwogICAvLyBQcm90b2NvbCdzIHN1cGVyIHByb3RvY29sIGxpc3QKLSAgc3RkOjp2ZWN0b3I8T2JqQ1Byb3RvY29sRGVjbCAqPiBSZWZlZFByb3RvY29sczsKLSAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgSSA9IENEZWNsLT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gQ0RlY2wtPnByb3RvY29sX2VuZCgpOwotCi0gICAgICAgICBJICE9IEU7ICsrSSkgewotICAgIFJlZmVkUHJvdG9jb2xzLnB1c2hfYmFjaygqSSk7CisgIFNtYWxsVmVjdG9yPE9iakNQcm90b2NvbERlY2wgKiwgOD4gUmVmZWRQcm90b2NvbHMoQ0RlY2wtPnByb3RvY29scygpKTsKKyAgZm9yIChhdXRvICpJIDogQ0RlY2wtPnByb3RvY29scygpKQogICAgIC8vIE11c3Qgd3JpdGUgb3V0IGFsbCBwcm90b2NvbCBkZWZpbml0aW9ucyBpbiBjdXJyZW50IHF1YWxpZmllciBsaXN0LAogICAgIC8vIGFuZCBpbiB0aGVpciBuZXN0ZWQgcXVhbGlmaWVycyBiZWZvcmUgd3JpdGluZyBvdXQgY3VycmVudCBkZWZpbml0aW9uLgotICAgIFJld3JpdGVPYmpDUHJvdG9jb2xNZXRhRGF0YSgqSSwgUmVzdWx0KTsKLSAgfQorICAgIFJld3JpdGVPYmpDUHJvdG9jb2xNZXRhRGF0YShJLCBSZXN1bHQpOwogICAKICAgV3JpdGVfcHJvdG9jb2xfbGlzdF9pbml0aWFsaXplcihDb250ZXh0LCBSZXN1bHQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVkUHJvdG9jb2xzLApAQCAtNzYxNCwxMSArNzUwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVsbENhdGVnb3J5TmFtZSk7CiAgIAogICAvLyBQcm90b2NvbCdzIHByb3BlcnR5IG1ldGFkYXRhLgotICBzdGQ6OnZlY3RvcjxPYmpDUHJvcGVydHlEZWNsICo+IENsYXNzUHJvcGVydGllczsKLSAgZm9yIChPYmpDQ29udGFpbmVyRGVjbDo6cHJvcF9pdGVyYXRvciBJID0gQ0RlY2wtPnByb3BfYmVnaW4oKSwKLSAgICAgICBFID0gQ0RlY2wtPnByb3BfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgIENsYXNzUHJvcGVydGllcy5wdXNoX2JhY2soKkkpOwotICAKKyAgU21hbGxWZWN0b3I8T2JqQ1Byb3BlcnR5RGVjbCAqLCA4PiBDbGFzc1Byb3BlcnRpZXMoQ0RlY2wtPnByb3BlcnRpZXMoKSk7CiAgIFdyaXRlX3Byb3BfbGlzdF90X2luaXRpYWxpemVyKCp0aGlzLCBDb250ZXh0LCBSZXN1bHQsIENsYXNzUHJvcGVydGllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udGFpbmVyICovSURlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfT0JKQ18kX1BST1BfTElTVF8iLApkaWZmIC0tZ2l0IGEvbGliL1Jld3JpdGUvRnJvbnRlbmQvUmV3cml0ZU9iakMuY3BwIGIvbGliL1Jld3JpdGUvRnJvbnRlbmQvUmV3cml0ZU9iakMuY3BwCmluZGV4IDNkZGEyYzUuLjgwZDZjYzYgMTAwNjQ0Ci0tLSBhL2xpYi9SZXdyaXRlL0Zyb250ZW5kL1Jld3JpdGVPYmpDLmNwcAorKysgYi9saWIvUmV3cml0ZS9Gcm9udGVuZC9SZXdyaXRlT2JqQy5jcHAKQEAgLTIzLDExICsyMywxMSBAQAogI2luY2x1ZGUgImNsYW5nL0xleC9MZXhlci5oIgogI2luY2x1ZGUgImNsYW5nL1Jld3JpdGUvQ29yZS9SZXdyaXRlci5oIgogI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiB1c2luZyBsbHZtOjp1dG9zdHI7CkBAIC0xNjUsNyArMTY1LDcgQEAKICAgcHVibGljOgogCiAgICAgLy8gVG9wIExldmVsIERyaXZlciBjb2RlLgotICAgIHZpcnR1YWwgYm9vbCBIYW5kbGVUb3BMZXZlbERlY2woRGVjbEdyb3VwUmVmIEQpIHsKKyAgICBib29sIEhhbmRsZVRvcExldmVsRGVjbChEZWNsR3JvdXBSZWYgRCkgb3ZlcnJpZGUgewogICAgICAgZm9yIChEZWNsR3JvdXBSZWY6Oml0ZXJhdG9yIEkgPSBELmJlZ2luKCksIEUgPSBELmVuZCgpOyBJICE9IEU7ICsrSSkgewogICAgICAgICBpZiAoT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzID0gZHluX2Nhc3Q8T2JqQ0ludGVyZmFjZURlY2w+KCpJKSkgewogICAgICAgICAgIGlmICghQ2xhc3MtPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkgewpAQCAtMTkzLDcgKzE5Myw3IEBACiAKICAgICB+UmV3cml0ZU9iakMoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDKTsKKyAgICB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDKSBvdmVycmlkZTsKIAogICAgIHZvaWQgUmVwbGFjZVN0bXQoU3RtdCAqT2xkLCBTdG10ICpOZXcpIHsKICAgICAgIFN0bXQgKlJlcGxhY2luZ1N0bXQgPSBSZXBsYWNlZE5vZGVzW09sZF07CkBAIC0zMjgsOSArMzI4LDkgQEAKICAgICAKICAgICB2b2lkIFJld3JpdGVPYmpDSW50ZXJuYWxTdHJ1Y3QoT2JqQ0ludGVyZmFjZURlY2wgKkNEZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmUmVzdWx0KTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZjb250ZXh0KSA9IDA7Ci0gICAgCisKKyAgICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZjb250ZXh0KSBvdmVycmlkZSA9IDA7CisKICAgICAvLyBNZXRhZGF0YSBSZXdyaXRpbmcuCiAgICAgdmlydHVhbCB2b2lkIFJld3JpdGVNZXRhRGF0YUludG9CdWZmZXIoc3RkOjpzdHJpbmcgJlJlc3VsdCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBSZXdyaXRlT2JqQ1Byb3RvY29sTGlzdE1ldGFEYXRhKGNvbnN0IE9iakNMaXN0PE9iakNQcm90b2NvbERlY2w+ICZQcm90cywKQEAgLTUwMSw2ICs1MDEsMTQgQEAKICAgICAgIHJldHVybiBDU3R5bGVDYXN0RXhwcjo6Q3JlYXRlKCpDdHgsIFR5LCBWS19SVmFsdWUsIEtpbmQsIEUsIDAsIFRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSk7CiAgICAgfQorCisgICAgU3RyaW5nTGl0ZXJhbCAqZ2V0U3RyaW5nTGl0ZXJhbChTdHJpbmdSZWYgU3RyKSB7CisgICAgICBRdWFsVHlwZSBTdHJUeXBlID0gQ29udGV4dC0+Z2V0Q29uc3RhbnRBcnJheVR5cGUoCisgICAgICAgICAgQ29udGV4dC0+Q2hhclR5LCBsbHZtOjpBUEludCgzMiwgU3RyLnNpemUoKSArIDEpLCBBcnJheVR5cGU6Ok5vcm1hbCwKKyAgICAgICAgICAwKTsKKyAgICAgIHJldHVybiBTdHJpbmdMaXRlcmFsOjpDcmVhdGUoKkNvbnRleHQsIFN0ciwgU3RyaW5nTGl0ZXJhbDo6QXNjaWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qUGFzY2FsPSovZmFsc2UsIFN0clR5cGUsIFNvdXJjZUxvY2F0aW9uKCkpOworICAgIH0KICAgfTsKICAgCiAgIGNsYXNzIFJld3JpdGVPYmpDRnJhZ2lsZUFCSSA6IHB1YmxpYyBSZXdyaXRlT2JqQyB7CkBAIC01MTMsOCArNTIxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW5jZU1hY3JvV2Fybikge30KICAgICAKICAgICB+UmV3cml0ZU9iakNGcmFnaWxlQUJJKCkge30KLSAgICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZjb250ZXh0KTsKLSAgICAKKyAgICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZjb250ZXh0KSBvdmVycmlkZTsKKwogICAgIC8vIFJld3JpdGluZyBtZXRhZGF0YQogICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1ldGhvZEl0ZXJhdG9yPgogICAgIHZvaWQgUmV3cml0ZU9iakNNZXRob2RzTWV0YURhdGEoTWV0aG9kSXRlcmF0b3IgTWV0aG9kQmVnaW4sCkBAIC01MjMsMjMgKzUzMSwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmUmVzdWx0KTsKLSAgICB2aXJ0dWFsIHZvaWQgUmV3cml0ZU9iakNQcm90b2NvbE1ldGFEYXRhKE9iakNQcm90b2NvbERlY2wgKlByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmUmVzdWx0KTsKLSAgICB2aXJ0dWFsIHZvaWQgUmV3cml0ZU9iakNQcm90b2NvbExpc3RNZXRhRGF0YSgKLSAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNMaXN0PE9iakNQcm90b2NvbERlY2w+ICZQcm90cywKLSAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBwcmVmaXgsIFN0cmluZ1JlZiBDbGFzc05hbWUsIHN0ZDo6c3RyaW5nICZSZXN1bHQpOwotICAgIHZpcnR1YWwgdm9pZCBSZXdyaXRlT2JqQ0NsYXNzTWV0YURhdGEoT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSURlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmUmVzdWx0KTsKLSAgICB2aXJ0dWFsIHZvaWQgUmV3cml0ZU1ldGFEYXRhSW50b0J1ZmZlcihzdGQ6OnN0cmluZyAmUmVzdWx0KTsKLSAgICB2aXJ0dWFsIHZvaWQgUmV3cml0ZU9iakNDYXRlZ29yeUltcGxEZWNsKE9iakNDYXRlZ29yeUltcGxEZWNsICpDRGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZSZXN1bHQpOwotICAgIAorICAgIHZvaWQgUmV3cml0ZU9iakNQcm90b2NvbE1ldGFEYXRhKE9iakNQcm90b2NvbERlY2wgKlByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBwcmVmaXgsIFN0cmluZ1JlZiBDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlJlc3VsdCkgb3ZlcnJpZGU7CisgICAgdm9pZCBSZXdyaXRlT2JqQ1Byb3RvY29sTGlzdE1ldGFEYXRhKAorICAgICAgICAgIGNvbnN0IE9iakNMaXN0PE9iakNQcm90b2NvbERlY2w+ICZQcm90cywKKyAgICAgICAgICBTdHJpbmdSZWYgcHJlZml4LCBTdHJpbmdSZWYgQ2xhc3NOYW1lLCBzdGQ6OnN0cmluZyAmUmVzdWx0KSBvdmVycmlkZTsKKyAgICB2b2lkIFJld3JpdGVPYmpDQ2xhc3NNZXRhRGF0YShPYmpDSW1wbGVtZW50YXRpb25EZWNsICpJRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmUmVzdWx0KSBvdmVycmlkZTsKKyAgICB2b2lkIFJld3JpdGVNZXRhRGF0YUludG9CdWZmZXIoc3RkOjpzdHJpbmcgJlJlc3VsdCkgb3ZlcnJpZGU7CisgICAgdm9pZCBSZXdyaXRlT2JqQ0NhdGVnb3J5SW1wbERlY2woT2JqQ0NhdGVnb3J5SW1wbERlY2wgKkNEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZSZXN1bHQpIG92ZXJyaWRlOworCiAgICAgLy8gUmV3cml0aW5nIGl2YXIKLSAgICB2aXJ0dWFsIHZvaWQgUmV3cml0ZUl2YXJPZmZzZXRDb21wdXRhdGlvbihPYmpDSXZhckRlY2wgKml2YXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlJlc3VsdCk7Ci0gICAgdmlydHVhbCBTdG10ICpSZXdyaXRlT2JqQ0l2YXJSZWZFeHByKE9iakNJdmFyUmVmRXhwciAqSVYpOworICAgIHZvaWQgUmV3cml0ZUl2YXJPZmZzZXRDb21wdXRhdGlvbihPYmpDSXZhckRlY2wgKml2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZSZXN1bHQpIG92ZXJyaWRlOworICAgIFN0bXQgKlJld3JpdGVPYmpDSXZhclJlZkV4cHIoT2JqQ0l2YXJSZWZFeHByICpJVikgb3ZlcnJpZGU7CiAgIH07CiB9CiAKQEAgLTU0Nyw5ICs1NTQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpEKSB7CiAgIGlmIChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqZnByb3RvCiAgICAgICA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihmdW5jVHlwZS5JZ25vcmVQYXJlbnMoKSkpIHsKLSAgICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjphcmdfdHlwZV9pdGVyYXRvciBJID0gZnByb3RvLT5hcmdfdHlwZV9iZWdpbigpLAotICAgICAgICAgRSA9IGZwcm90by0+YXJnX3R5cGVfZW5kKCk7IEkgJiYgKEkgIT0gRSk7ICsrSSkKLSAgICAgIGlmIChpc1RvcExldmVsQmxvY2tQb2ludGVyVHlwZSgqSSkpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBmcHJvdG8tPnBhcmFtX3R5cGVzKCkpCisgICAgICBpZiAoaXNUb3BMZXZlbEJsb2NrUG9pbnRlclR5cGUoSSkpIHsKICAgICAgICAgLy8gQWxsIHRoZSBhcmdzIGFyZSBjaGVja2VkL3Jld3JpdHRlbi4gRG9uJ3QgY2FsbCB0d2ljZSEKICAgICAgICAgUmV3cml0ZUJsb2NrUG9pbnRlckRlY2woRCk7CiAgICAgICAgIGJyZWFrOwpAQCAtODA5LDcgKzgxNSw3IEBACiAgICAgICAvLyByZXR1cm4gb2JqY19nZXRQcm9wZXJ0eShzZWxmLCBfY21kLCBvZmZzZXRvZihDbGFzc0RlY2wsIE9JRCksIDEpCiAgICAgICBHZXRyICs9ICJ0eXBlZGVmICI7CiAgICAgICBjb25zdCBGdW5jdGlvblR5cGUgKkZQUmV0VHlwZSA9IDA7Ci0gICAgICBSZXdyaXRlVHlwZUludG9TdHJpbmcoUEQtPmdldEdldHRlck1ldGhvZERlY2woKS0+Z2V0UmVzdWx0VHlwZSgpLCBHZXRyLCAKKyAgICAgIFJld3JpdGVUeXBlSW50b1N0cmluZyhQRC0+Z2V0R2V0dGVyTWV0aG9kRGVjbCgpLT5nZXRSZXR1cm5UeXBlKCksIEdldHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBSZXRUeXBlKTsKICAgICAgIEdldHIgKz0gIiBfVFlQRSI7CiAgICAgICBpZiAoRlBSZXRUeXBlKSB7CkBAIC04MTgsMTQgKzgyNCwxNSBAQAogICAgICAgICAvLyBOb3csIGVtaXQgdGhlIGFyZ3VtZW50IHR5cGVzIChpZiBhbnkpLgogICAgICAgICBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZUID0gZHluX2Nhc3Q8RnVuY3Rpb25Qcm90b1R5cGU+KEZQUmV0VHlwZSkpewogICAgICAgICAgIEdldHIgKz0gIigiOwotICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVC0+Z2V0TnVtQXJncygpOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVC0+Z2V0TnVtUGFyYW1zKCk7IGkgIT0gZTsgKytpKSB7CiAgICAgICAgICAgICBpZiAoaSkgR2V0ciArPSAiLCAiOwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgUGFyYW1TdHIgPSBGVC0+Z2V0QXJnVHlwZShpKS5nZXRBc1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LT5nZXRQcmludGluZ1BvbGljeSgpKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIFBhcmFtU3RyID0KKyAgICAgICAgICAgICAgICBGVC0+Z2V0UGFyYW1UeXBlKGkpLmdldEFzU3RyaW5nKENvbnRleHQtPmdldFByaW50aW5nUG9saWN5KCkpOwogICAgICAgICAgICAgR2V0ciArPSBQYXJhbVN0cjsKICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKEZULT5pc1ZhcmlhZGljKCkpIHsKLSAgICAgICAgICAgIGlmIChGVC0+Z2V0TnVtQXJncygpKSBHZXRyICs9ICIsICI7CisgICAgICAgICAgICBpZiAoRlQtPmdldE51bVBhcmFtcygpKQorICAgICAgICAgICAgICBHZXRyICs9ICIsICI7CiAgICAgICAgICAgICBHZXRyICs9ICIuLi4iOwogICAgICAgICAgIH0KICAgICAgICAgICBHZXRyICs9ICIpIjsKQEAgLTk3MCwxOCArOTc3LDEyIEBACiAgIC8vIEZJWE1FOiBoYW5kbGUgY2F0ZWdvcnkgaGVhZGVycyB0aGF0IGFyZSBkZWNsYXJlZCBhY3Jvc3MgbXVsdGlwbGUgbGluZXMuCiAgIFJlcGxhY2VUZXh0KExvY1N0YXJ0LCAwLCAiLy8gIik7CiAKLSAgZm9yIChPYmpDQ2F0ZWdvcnlEZWNsOjpwcm9wX2l0ZXJhdG9yIEkgPSBDYXREZWNsLT5wcm9wX2JlZ2luKCksCi0gICAgICAgRSA9IENhdERlY2wtPnByb3BfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgIFJld3JpdGVQcm9wZXJ0eSgqSSk7Ci0gIAotICBmb3IgKE9iakNDYXRlZ29yeURlY2w6Omluc3RtZXRoX2l0ZXJhdG9yCi0gICAgICAgICBJID0gQ2F0RGVjbC0+aW5zdG1ldGhfYmVnaW4oKSwgRSA9IENhdERlY2wtPmluc3RtZXRoX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKQotICAgIFJld3JpdGVNZXRob2REZWNsYXJhdGlvbigqSSk7Ci0gIGZvciAoT2JqQ0NhdGVnb3J5RGVjbDo6Y2xhc3NtZXRoX2l0ZXJhdG9yCi0gICAgICAgICBJID0gQ2F0RGVjbC0+Y2xhc3NtZXRoX2JlZ2luKCksIEUgPSBDYXREZWNsLT5jbGFzc21ldGhfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpCi0gICAgUmV3cml0ZU1ldGhvZERlY2xhcmF0aW9uKCpJKTsKKyAgZm9yIChhdXRvICpJIDogQ2F0RGVjbC0+cHJvcGVydGllcygpKQorICAgIFJld3JpdGVQcm9wZXJ0eShJKTsgIAorICBmb3IgKGF1dG8gKkkgOiBDYXREZWNsLT5pbnN0YW5jZV9tZXRob2RzKCkpCisgICAgUmV3cml0ZU1ldGhvZERlY2xhcmF0aW9uKEkpOworICBmb3IgKGF1dG8gKkkgOiBDYXREZWNsLT5jbGFzc19tZXRob2RzKCkpCisgICAgUmV3cml0ZU1ldGhvZERlY2xhcmF0aW9uKEkpOwogCiAgIC8vIExhc3RseSwgY29tbWVudCBvdXQgdGhlIEBlbmQuCiAgIFJlcGxhY2VUZXh0KENhdERlY2wtPmdldEF0RW5kUmFuZ2UoKS5nZXRCZWdpbigpLCAKQEAgLTk5NSwxOCArOTk2LDEyIEBACiAgIC8vIEZJWE1FOiBoYW5kbGUgcHJvdG9jb2wgaGVhZGVycyB0aGF0IGFyZSBkZWNsYXJlZCBhY3Jvc3MgbXVsdGlwbGUgbGluZXMuCiAgIFJlcGxhY2VUZXh0KExvY1N0YXJ0LCAwLCAiLy8gIik7CiAKLSAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjppbnN0bWV0aF9pdGVyYXRvcgotICAgICAgICAgSSA9IFBEZWNsLT5pbnN0bWV0aF9iZWdpbigpLCBFID0gUERlY2wtPmluc3RtZXRoX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKQotICAgIFJld3JpdGVNZXRob2REZWNsYXJhdGlvbigqSSk7Ci0gIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6Y2xhc3NtZXRoX2l0ZXJhdG9yCi0gICAgICAgICBJID0gUERlY2wtPmNsYXNzbWV0aF9iZWdpbigpLCBFID0gUERlY2wtPmNsYXNzbWV0aF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkKLSAgICBSZXdyaXRlTWV0aG9kRGVjbGFyYXRpb24oKkkpOwotCi0gIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnByb3BfaXRlcmF0b3IgSSA9IFBEZWNsLT5wcm9wX2JlZ2luKCksCi0gICAgICAgRSA9IFBEZWNsLT5wcm9wX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBSZXdyaXRlUHJvcGVydHkoKkkpOworICBmb3IgKGF1dG8gKkkgOiBQRGVjbC0+aW5zdGFuY2VfbWV0aG9kcygpKQorICAgIFJld3JpdGVNZXRob2REZWNsYXJhdGlvbihJKTsKKyAgZm9yIChhdXRvICpJIDogUERlY2wtPmNsYXNzX21ldGhvZHMoKSkKKyAgICBSZXdyaXRlTWV0aG9kRGVjbGFyYXRpb24oSSk7CisgIGZvciAoYXV0byAqSSA6IFBEZWNsLT5wcm9wZXJ0aWVzKCkpCisgICAgUmV3cml0ZVByb3BlcnR5KEkpOwogICAKICAgLy8gTGFzdGx5LCBjb21tZW50IG91dCB0aGUgQGVuZC4KICAgU291cmNlTG9jYXRpb24gTG9jRW5kID0gUERlY2wtPmdldEF0RW5kUmFuZ2UoKS5nZXRCZWdpbigpOwpAQCAtMTA2MSw4ICsxMDU2LDggQEAKICAgICBlbHNlIGlmIChjb25zdCBCbG9ja1BvaW50ZXJUeXBlICpCUFQgPSByZXRUeXBlLT5nZXRBczxCbG9ja1BvaW50ZXJUeXBlPigpKQogICAgICAgUG9pbnRlZVR5ID0gQlBULT5nZXRQb2ludGVlVHlwZSgpOwogICAgIGlmICgoRlBSZXRUeXBlID0gUG9pbnRlZVR5LT5nZXRBczxGdW5jdGlvblR5cGU+KCkpKSB7Ci0gICAgICBSZXN1bHRTdHIgKz0gRlBSZXRUeXBlLT5nZXRSZXN1bHRUeXBlKCkuZ2V0QXNTdHJpbmcoCi0gICAgICAgIENvbnRleHQtPmdldFByaW50aW5nUG9saWN5KCkpOworICAgICAgUmVzdWx0U3RyICs9CisgICAgICAgICAgRlBSZXRUeXBlLT5nZXRSZXR1cm5UeXBlKCkuZ2V0QXNTdHJpbmcoQ29udGV4dC0+Z2V0UHJpbnRpbmdQb2xpY3koKSk7CiAgICAgICBSZXN1bHRTdHIgKz0gIigqIjsKICAgICB9CiAgIH0gZWxzZQpAQCAtMTA3NSw3ICsxMDcwLDcgQEAKICAgLy9mcHJpbnRmKHN0ZGVyciwiSW4gUmV3cml0ZU9iakNNZXRob2REZWNsXG4iKTsKICAgY29uc3QgRnVuY3Rpb25UeXBlICpGUFJldFR5cGUgPSAwOwogICBSZXN1bHRTdHIgKz0gIlxuc3RhdGljICI7Ci0gIFJld3JpdGVUeXBlSW50b1N0cmluZyhPTUQtPmdldFJlc3VsdFR5cGUoKSwgUmVzdWx0U3RyLCBGUFJldFR5cGUpOworICBSZXdyaXRlVHlwZUludG9TdHJpbmcoT01ELT5nZXRSZXR1cm5UeXBlKCksIFJlc3VsdFN0ciwgRlBSZXRUeXBlKTsKICAgUmVzdWx0U3RyICs9ICIgIjsKIAogICAvLyBVbmlxdWUgbWV0aG9kIG5hbWUKQEAgLTExMzEsOSArMTEyNiw3IEBACiAgIFJlc3VsdFN0ciArPSAiIF9jbWQiOwogCiAgIC8vIE1ldGhvZCBhcmd1bWVudHMuCi0gIGZvciAoT2JqQ01ldGhvZERlY2w6OnBhcmFtX2l0ZXJhdG9yIFBJID0gT01ELT5wYXJhbV9iZWdpbigpLAotICAgICAgIEUgPSBPTUQtPnBhcmFtX2VuZCgpOyBQSSAhPSBFOyArK1BJKSB7Ci0gICAgUGFybVZhckRlY2wgKlBEZWNsID0gKlBJOworICBmb3IgKGNvbnN0IGF1dG8gKlBEZWNsIDogT01ELT5wYXJhbXMoKSkgewogICAgIFJlc3VsdFN0ciArPSAiLCAiOwogICAgIGlmIChQRGVjbC0+Z2V0VHlwZSgpLT5pc09iakNRdWFsaWZpZWRJZFR5cGUoKSkgewogICAgICAgUmVzdWx0U3RyICs9ICJpZCAiOwpAQCAtMTE1NywxNCArMTE1MCwxNSBAQAogICAgIC8vIE5vdywgZW1pdCB0aGUgYXJndW1lbnQgdHlwZXMgKGlmIGFueSkuCiAgICAgaWYgKGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpGVCA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGUFJldFR5cGUpKSB7CiAgICAgICBSZXN1bHRTdHIgKz0gIigiOwotICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZULT5nZXROdW1BcmdzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRlQtPmdldE51bVBhcmFtcygpOyBpICE9IGU7ICsraSkgewogICAgICAgICBpZiAoaSkgUmVzdWx0U3RyICs9ICIsICI7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIFBhcmFtU3RyID0gRlQtPmdldEFyZ1R5cGUoaSkuZ2V0QXNTdHJpbmcoCi0gICAgICAgICAgQ29udGV4dC0+Z2V0UHJpbnRpbmdQb2xpY3koKSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIFBhcmFtU3RyID0KKyAgICAgICAgICAgIEZULT5nZXRQYXJhbVR5cGUoaSkuZ2V0QXNTdHJpbmcoQ29udGV4dC0+Z2V0UHJpbnRpbmdQb2xpY3koKSk7CiAgICAgICAgIFJlc3VsdFN0ciArPSBQYXJhbVN0cjsKICAgICAgIH0KICAgICAgIGlmIChGVC0+aXNWYXJpYWRpYygpKSB7Ci0gICAgICAgIGlmIChGVC0+Z2V0TnVtQXJncygpKSBSZXN1bHRTdHIgKz0gIiwgIjsKKyAgICAgICAgaWYgKEZULT5nZXROdW1QYXJhbXMoKSkKKyAgICAgICAgICBSZXN1bHRTdHIgKz0gIiwgIjsKICAgICAgICAgUmVzdWx0U3RyICs9ICIuLi4iOwogICAgICAgfQogICAgICAgUmVzdWx0U3RyICs9ICIpIjsKQEAgLTExNzksMTIgKzExNzMsOCBAQAogCiAgIEluc2VydFRleHQoSU1EID8gSU1ELT5nZXRMb2NTdGFydCgpIDogQ0lELT5nZXRMb2NTdGFydCgpLCAiLy8gIik7CiAKLSAgZm9yIChPYmpDQ2F0ZWdvcnlJbXBsRGVjbDo6aW5zdG1ldGhfaXRlcmF0b3IKLSAgICAgICBJID0gSU1EID8gSU1ELT5pbnN0bWV0aF9iZWdpbigpIDogQ0lELT5pbnN0bWV0aF9iZWdpbigpLAotICAgICAgIEUgPSBJTUQgPyBJTUQtPmluc3RtZXRoX2VuZCgpIDogQ0lELT5pbnN0bWV0aF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgeworICBmb3IgKGF1dG8gKk9NRCA6IElNRCA/IElNRC0+aW5zdGFuY2VfbWV0aG9kcygpIDogQ0lELT5pbnN0YW5jZV9tZXRob2RzKCkpIHsKICAgICBzdGQ6OnN0cmluZyBSZXN1bHRTdHI7Ci0gICAgT2JqQ01ldGhvZERlY2wgKk9NRCA9ICpJOwogICAgIFJld3JpdGVPYmpDTWV0aG9kRGVjbChPTUQtPmdldENsYXNzSW50ZXJmYWNlKCksIE9NRCwgUmVzdWx0U3RyKTsKICAgICBTb3VyY2VMb2NhdGlvbiBMb2NTdGFydCA9IE9NRC0+Z2V0TG9jU3RhcnQoKTsKICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQgPSBPTUQtPmdldENvbXBvdW5kQm9keSgpLT5nZXRMb2NTdGFydCgpOwpAQCAtMTE5NCwxMiArMTE4NCw4IEBACiAgICAgUmVwbGFjZVRleHQoTG9jU3RhcnQsIGVuZEJ1Zi1zdGFydEJ1ZiwgUmVzdWx0U3RyKTsKICAgfQogCi0gIGZvciAoT2JqQ0NhdGVnb3J5SW1wbERlY2w6OmNsYXNzbWV0aF9pdGVyYXRvcgotICAgICAgIEkgPSBJTUQgPyBJTUQtPmNsYXNzbWV0aF9iZWdpbigpIDogQ0lELT5jbGFzc21ldGhfYmVnaW4oKSwKLSAgICAgICBFID0gSU1EID8gSU1ELT5jbGFzc21ldGhfZW5kKCkgOiBDSUQtPmNsYXNzbWV0aF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgeworICBmb3IgKGF1dG8gKk9NRCA6IElNRCA/IElNRC0+Y2xhc3NfbWV0aG9kcygpIDogQ0lELT5jbGFzc19tZXRob2RzKCkpIHsKICAgICBzdGQ6OnN0cmluZyBSZXN1bHRTdHI7Ci0gICAgT2JqQ01ldGhvZERlY2wgKk9NRCA9ICpJOwogICAgIFJld3JpdGVPYmpDTWV0aG9kRGVjbChPTUQtPmdldENsYXNzSW50ZXJmYWNlKCksIE9NRCwgUmVzdWx0U3RyKTsKICAgICBTb3VyY2VMb2NhdGlvbiBMb2NTdGFydCA9IE9NRC0+Z2V0TG9jU3RhcnQoKTsKICAgICBTb3VyY2VMb2NhdGlvbiBMb2NFbmQgPSBPTUQtPmdldENvbXBvdW5kQm9keSgpLT5nZXRMb2NTdGFydCgpOwpAQCAtMTIwOCwxMiArMTE5NCw4IEBACiAgICAgY29uc3QgY2hhciAqZW5kQnVmID0gU00tPmdldENoYXJhY3RlckRhdGEoTG9jRW5kKTsKICAgICBSZXBsYWNlVGV4dChMb2NTdGFydCwgZW5kQnVmLXN0YXJ0QnVmLCBSZXN1bHRTdHIpOwogICB9Ci0gIGZvciAoT2JqQ0NhdGVnb3J5SW1wbERlY2w6OnByb3BpbXBsX2l0ZXJhdG9yCi0gICAgICAgSSA9IElNRCA/IElNRC0+cHJvcGltcGxfYmVnaW4oKSA6IENJRC0+cHJvcGltcGxfYmVnaW4oKSwKLSAgICAgICBFID0gSU1EID8gSU1ELT5wcm9waW1wbF9lbmQoKSA6IENJRC0+cHJvcGltcGxfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBSZXdyaXRlUHJvcGVydHlJbXBsRGVjbCgqSSwgSU1ELCBDSUQpOwotICB9CisgIGZvciAoYXV0byAqSSA6IElNRCA/IElNRC0+cHJvcGVydHlfaW1wbHMoKSA6IENJRC0+cHJvcGVydHlfaW1wbHMoKSkKKyAgICBSZXdyaXRlUHJvcGVydHlJbXBsRGVjbChJLCBJTUQsIENJRCk7CiAKICAgSW5zZXJ0VGV4dChJTUQgPyBJTUQtPmdldExvY0VuZCgpIDogQ0lELT5nZXRMb2NFbmQoKSwgIi8vICIpOwogfQpAQCAtMTIzNiwxNyArMTIxOCwxMiBAQAogICB9CiAgIFJld3JpdGVPYmpDSW50ZXJuYWxTdHJ1Y3QoQ2xhc3NEZWNsLCBSZXN1bHRTdHIpOwogCi0gIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnByb3BfaXRlcmF0b3IgSSA9IENsYXNzRGVjbC0+cHJvcF9iZWdpbigpLAotICAgICAgICAgRSA9IENsYXNzRGVjbC0+cHJvcF9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgUmV3cml0ZVByb3BlcnR5KCpJKTsKLSAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6aW5zdG1ldGhfaXRlcmF0b3IKLSAgICAgICAgIEkgPSBDbGFzc0RlY2wtPmluc3RtZXRoX2JlZ2luKCksIEUgPSBDbGFzc0RlY2wtPmluc3RtZXRoX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKQotICAgIFJld3JpdGVNZXRob2REZWNsYXJhdGlvbigqSSk7Ci0gIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OmNsYXNzbWV0aF9pdGVyYXRvcgotICAgICAgICAgSSA9IENsYXNzRGVjbC0+Y2xhc3NtZXRoX2JlZ2luKCksIEUgPSBDbGFzc0RlY2wtPmNsYXNzbWV0aF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkKLSAgICBSZXdyaXRlTWV0aG9kRGVjbGFyYXRpb24oKkkpOworICBmb3IgKGF1dG8gKkkgOiBDbGFzc0RlY2wtPnByb3BlcnRpZXMoKSkKKyAgICBSZXdyaXRlUHJvcGVydHkoSSk7CisgIGZvciAoYXV0byAqSSA6IENsYXNzRGVjbC0+aW5zdGFuY2VfbWV0aG9kcygpKQorICAgIFJld3JpdGVNZXRob2REZWNsYXJhdGlvbihJKTsKKyAgZm9yIChhdXRvICpJIDogQ2xhc3NEZWNsLT5jbGFzc19tZXRob2RzKCkpCisgICAgUmV3cml0ZU1ldGhvZERlY2xhcmF0aW9uKEkpOwogCiAgIC8vIExhc3RseSwgY29tbWVudCBvdXQgdGhlIEBlbmQuCiAgIFJlcGxhY2VUZXh0KENsYXNzRGVjbC0+Z2V0QXRFbmRSYW5nZSgpLmdldEJlZ2luKCksIHN0cmxlbigiQGVuZCIpLCAKQEAgLTIwMDksMTIgKzE5ODYsOSBAQAogCiBTdG10ICpSZXdyaXRlT2JqQzo6UmV3cml0ZUF0RW5jb2RlKE9iakNFbmNvZGVFeHByICpFeHApIHsKICAgLy8gQ3JlYXRlIGEgbmV3IHN0cmluZyBleHByZXNzaW9uLgotICBRdWFsVHlwZSBTdHJUeXBlID0gQ29udGV4dC0+Z2V0UG9pbnRlclR5cGUoQ29udGV4dC0+Q2hhclR5KTsKICAgc3RkOjpzdHJpbmcgU3RyRW5jb2Rpbmc7CiAgIENvbnRleHQtPmdldE9iakNFbmNvZGluZ0ZvclR5cGUoRXhwLT5nZXRFbmNvZGVkVHlwZSgpLCBTdHJFbmNvZGluZyk7Ci0gIEV4cHIgKlJlcGxhY2VtZW50ID0gU3RyaW5nTGl0ZXJhbDo6Q3JlYXRlKCpDb250ZXh0LCBTdHJFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbDo6QXNjaWksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJUeXBlLCBTb3VyY2VMb2NhdGlvbigpKTsKKyAgRXhwciAqUmVwbGFjZW1lbnQgPSBnZXRTdHJpbmdMaXRlcmFsKFN0ckVuY29kaW5nKTsKICAgUmVwbGFjZVN0bXQoRXhwLCBSZXBsYWNlbWVudCk7CiAKICAgLy8gUmVwbGFjZSB0aGlzIHN1YmV4cHIgaW4gdGhlIHBhcmVudC4KQEAgLTIwMjgsMTEgKzIwMDIsNyBAQAogICBhc3NlcnQoU2VsR2V0VWlkRnVuY3Rpb25EZWNsICYmICJDYW4ndCBmaW5kIHNlbF9yZWdpc3Rlck5hbWUoKSBkZWNsIik7CiAgIC8vIENyZWF0ZSBhIGNhbGwgdG8gc2VsX3JlZ2lzdGVyTmFtZSgic2VsTmFtZSIpLgogICBTbWFsbFZlY3RvcjxFeHByKiwgOD4gU2VsRXhwcnM7Ci0gIFF1YWxUeXBlIGFyZ1R5cGUgPSBDb250ZXh0LT5nZXRQb2ludGVyVHlwZShDb250ZXh0LT5DaGFyVHkpOwotICBTZWxFeHBycy5wdXNoX2JhY2soU3RyaW5nTGl0ZXJhbDo6Q3JlYXRlKCpDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cC0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWw6OkFzY2lpLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdUeXBlLCBTb3VyY2VMb2NhdGlvbigpKSk7CisgIFNlbEV4cHJzLnB1c2hfYmFjayhnZXRTdHJpbmdMaXRlcmFsKEV4cC0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpKSk7CiAgIENhbGxFeHByICpTZWxFeHAgPSBTeW50aGVzaXplQ2FsbFRvRnVuY3Rpb25EZWNsKFNlbEdldFVpZEZ1bmN0aW9uRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2VsRXhwcnNbMF0sIFNlbEV4cHJzLnNpemUoKSk7CiAgIFJlcGxhY2VTdG10KEV4cCwgU2VsRXhwKTsKQEAgLTIxNTksNyArMjEyOSw3IEBACiAgICAgcHJvdG8gPSBkeW5fY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oZnVuY1R5cGUpOwogICAgIGlmICghcHJvdG8pCiAgICAgICByZXR1cm47Ci0gICAgVHlwZSA9IHByb3RvLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgVHlwZSA9IHByb3RvLT5nZXRSZXR1cm5UeXBlKCk7CiAgIH0KICAgZWxzZSBpZiAoRmllbGREZWNsICpGRCA9IGR5bl9jYXN0PEZpZWxkRGVjbD4oRGNsKSkgewogICAgIExvYyA9IEZELT5nZXRMb2NhdGlvbigpOwpAQCAtMjE5MCw4ICsyMTYwLDggQEAKICAgLy8gTm93IGNoZWNrIGFyZ3VtZW50cy4KICAgY29uc3QgY2hhciAqc3RhcnRCdWYgPSBTTS0+Z2V0Q2hhcmFjdGVyRGF0YShMb2MpOwogICBjb25zdCBjaGFyICpzdGFydEZ1bmNCdWYgPSBzdGFydEJ1ZjsKLSAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb3RvLT5nZXROdW1BcmdzKCk7IGkrKykgewotICAgIGlmIChuZWVkVG9TY2FuRm9yUXVhbGlmaWVycyhwcm90by0+Z2V0QXJnVHlwZShpKSkpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHByb3RvLT5nZXROdW1QYXJhbXMoKTsgaSsrKSB7CisgICAgaWYgKG5lZWRUb1NjYW5Gb3JRdWFsaWZpZXJzKHByb3RvLT5nZXRQYXJhbVR5cGUoaSkpKSB7CiAgICAgICAvLyBTaW5jZSB0eXBlcyBhcmUgdW5pcXVlLCB3ZSBuZWVkIHRvIHNjYW4gdGhlIGJ1ZmZlci4KIAogICAgICAgY29uc3QgY2hhciAqZW5kQnVmID0gc3RhcnRCdWY7CkBAIC0yMzMwLDE0ICsyMzAwLDE0IEBACiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpwcm90byA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihmdW5jVHlwZSk7CiAgIGlmICghcHJvdG8pCiAgICAgcmV0dXJuOwotICBRdWFsVHlwZSBUeXBlID0gcHJvdG8tPmdldFJlc3VsdFR5cGUoKTsKKyAgUXVhbFR5cGUgVHlwZSA9IHByb3RvLT5nZXRSZXR1cm5UeXBlKCk7CiAgIHN0ZDo6c3RyaW5nIEZkU3RyID0gVHlwZS5nZXRBc1N0cmluZyhDb250ZXh0LT5nZXRQcmludGluZ1BvbGljeSgpKTsKICAgRmRTdHIgKz0gIiAiOwogICBGZFN0ciArPSBGRC0+Z2V0TmFtZSgpOwogICBGZFN0ciArPSAgIigiOwotICB1bnNpZ25lZCBudW1BcmdzID0gcHJvdG8tPmdldE51bUFyZ3MoKTsKKyAgdW5zaWduZWQgbnVtQXJncyA9IHByb3RvLT5nZXROdW1QYXJhbXMoKTsKICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgIFF1YWxUeXBlIEFyZ1R5cGUgPSBwcm90by0+Z2V0QXJnVHlwZShpKTsKKyAgICBRdWFsVHlwZSBBcmdUeXBlID0gcHJvdG8tPmdldFBhcmFtVHlwZShpKTsKICAgICBSZXdyaXRlQmxvY2tQb2ludGVyVHlwZShGZFN0ciwgQXJnVHlwZSk7CiAgICAgaWYgKGkrMSA8IG51bUFyZ3MpCiAgICAgICBGZFN0ciArPSAiLCAiOwpAQCAtMjUyMyw3ICsyNDkzLDcgQEAKICAgdW5zaWduZWQgaTsKICAgZm9yIChpPTA7IGkgPCB0bXBOYW1lLmxlbmd0aCgpOyBpKyspIHsKICAgICBjaGFyIGMgPSB0bXBOYW1lLmF0KGkpOwotICAgIC8vIHJlcGxhY2UgYW55IG5vbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB3aXRoICdfJy4KKyAgICAvLyByZXBsYWNlIGFueSBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgd2l0aCAnXycuCiAgICAgaWYgKCFpc0FscGhhbnVtZXJpYyhjKSkKICAgICAgIHRtcE5hbWVbaV0gPSAnXyc7CiAgIH0KQEAgLTI2NDcsOSArMjYxNyw4IEBACiAgIFBhcmVuRXhwciAqUEUgPSBuZXcgKENvbnRleHQpIFBhcmVuRXhwcihTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBjYXN0KTsKICAgCiAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQgPSBtc2dTZW5kVHlwZS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpOwotICBDYWxsRXhwciAqU1RDRSA9IG5ldyAoQ29udGV4dCkgQ2FsbEV4cHIoKkNvbnRleHQsIFBFLCBNc2dFeHBycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZULT5nZXRSZXN1bHRUeXBlKCksIFZLX1JWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCkpOworICBDYWxsRXhwciAqU1RDRSA9IG5ldyAoQ29udGV4dCkgQ2FsbEV4cHIoCisgICAgICAqQ29udGV4dCwgUEUsIE1zZ0V4cHJzLCBGVC0+Z2V0UmV0dXJuVHlwZSgpLCBWS19SVmFsdWUsIFNvdXJjZUxvY2F0aW9uKCkpOwogICByZXR1cm4gU1RDRTsKICAgCiB9CkBAIC0yNjgyLDcgKzI2NTEsNyBAQAogICAvLyBNYXkgbmVlZCB0byB1c2Ugb2JqY19tc2dTZW5kX3N0cmV0KCkgYXMgd2VsbC4KICAgRnVuY3Rpb25EZWNsICpNc2dTZW5kU3RyZXRGbGF2b3IgPSAwOwogICBpZiAoT2JqQ01ldGhvZERlY2wgKm1EZWNsID0gRXhwLT5nZXRNZXRob2REZWNsKCkpIHsKLSAgICBRdWFsVHlwZSByZXN1bHRUeXBlID0gbURlY2wtPmdldFJlc3VsdFR5cGUoKTsKKyAgICBRdWFsVHlwZSByZXN1bHRUeXBlID0gbURlY2wtPmdldFJldHVyblR5cGUoKTsKICAgICBpZiAocmVzdWx0VHlwZS0+aXNSZWNvcmRUeXBlKCkpCiAgICAgICBNc2dTZW5kU3RyZXRGbGF2b3IgPSBNc2dTZW5kU3RyZXRGdW5jdGlvbkRlY2w7CiAgICAgZWxzZSBpZiAocmVzdWx0VHlwZS0+aXNSZWFsRmxvYXRpbmdUeXBlKCkpCkBAIC0yNzE1LDExICsyNjg0LDcgQEAKIAogICAgIC8vIChpZCljbGFzc19nZXRTdXBlcmNsYXNzKChDbGFzcylvYmpjX2dldENsYXNzKCJDdXJyZW50Q2xhc3MiKSkKICAgICBTbWFsbFZlY3RvcjxFeHByKiwgOD4gQ2xzRXhwcnM7Ci0gICAgUXVhbFR5cGUgYXJnVHlwZSA9IENvbnRleHQtPmdldFBvaW50ZXJUeXBlKENvbnRleHQtPkNoYXJUeSk7Ci0gICAgQ2xzRXhwcnMucHVzaF9iYWNrKFN0cmluZ0xpdGVyYWw6OkNyZWF0ZSgqQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NEZWNsLT5nZXRJZGVudGlmaWVyKCktPmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbDo6QXNjaWksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdUeXBlLCBTb3VyY2VMb2NhdGlvbigpKSk7CisgICAgQ2xzRXhwcnMucHVzaF9iYWNrKGdldFN0cmluZ0xpdGVyYWwoQ2xhc3NEZWNsLT5nZXRJZGVudGlmaWVyKCktPmdldE5hbWUoKSkpOwogICAgIENhbGxFeHByICpDbHMgPSBTeW50aGVzaXplQ2FsbFRvRnVuY3Rpb25EZWNsKEdldE1ldGFDbGFzc0Z1bmN0aW9uRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2xzRXhwcnNbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xzRXhwcnMuc2l6ZSgpLApAQCAtMjc4OSwxNCArMjc1NCwxMCBAQAogCiAgIGNhc2UgT2JqQ01lc3NhZ2VFeHByOjpDbGFzczogewogICAgIFNtYWxsVmVjdG9yPEV4cHIqLCA4PiBDbHNFeHByczsKLSAgICBRdWFsVHlwZSBhcmdUeXBlID0gQ29udGV4dC0+Z2V0UG9pbnRlclR5cGUoQ29udGV4dC0+Q2hhclR5KTsKICAgICBPYmpDSW50ZXJmYWNlRGVjbCAqQ2xhc3MKICAgICAgID0gRXhwLT5nZXRDbGFzc1JlY2VpdmVyKCktPmdldEFzPE9iakNPYmplY3RUeXBlPigpLT5nZXRJbnRlcmZhY2UoKTsKICAgICBJZGVudGlmaWVySW5mbyAqY2xzTmFtZSA9IENsYXNzLT5nZXRJZGVudGlmaWVyKCk7Ci0gICAgQ2xzRXhwcnMucHVzaF9iYWNrKFN0cmluZ0xpdGVyYWw6OkNyZWF0ZSgqQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc05hbWUtPmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWw6OkFzY2lpLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1R5cGUsIFNvdXJjZUxvY2F0aW9uKCkpKTsKKyAgICBDbHNFeHBycy5wdXNoX2JhY2soZ2V0U3RyaW5nTGl0ZXJhbChjbHNOYW1lLT5nZXROYW1lKCkpKTsKICAgICBDYWxsRXhwciAqQ2xzID0gU3ludGhlc2l6ZUNhbGxUb0Z1bmN0aW9uRGVjbChHZXRDbGFzc0Z1bmN0aW9uRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2xzRXhwcnNbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xzRXhwcnMuc2l6ZSgpLCAKQEAgLTI4MjQsMTEgKzI3ODUsNyBAQAogICAgIAogICAgIC8vIChpZCljbGFzc19nZXRTdXBlcmNsYXNzKChDbGFzcylvYmpjX2dldENsYXNzKCJDdXJyZW50Q2xhc3MiKSkKICAgICBTbWFsbFZlY3RvcjxFeHByKiwgOD4gQ2xzRXhwcnM7Ci0gICAgUXVhbFR5cGUgYXJnVHlwZSA9IENvbnRleHQtPmdldFBvaW50ZXJUeXBlKENvbnRleHQtPkNoYXJUeSk7Ci0gICAgQ2xzRXhwcnMucHVzaF9iYWNrKFN0cmluZ0xpdGVyYWw6OkNyZWF0ZSgqQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NEZWNsLT5nZXRJZGVudGlmaWVyKCktPmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbDo6QXNjaWksIGZhbHNlLCBhcmdUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpKSk7CisgICAgQ2xzRXhwcnMucHVzaF9iYWNrKGdldFN0cmluZ0xpdGVyYWwoQ2xhc3NEZWNsLT5nZXRJZGVudGlmaWVyKCktPmdldE5hbWUoKSkpOwogICAgIENhbGxFeHByICpDbHMgPSBTeW50aGVzaXplQ2FsbFRvRnVuY3Rpb25EZWNsKEdldENsYXNzRnVuY3Rpb25EZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbHNFeHByc1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHNFeHBycy5zaXplKCksIApAQCAtMjkwOSwxMSArMjg2Niw3IEBACiAKICAgLy8gQ3JlYXRlIGEgY2FsbCB0byBzZWxfcmVnaXN0ZXJOYW1lKCJzZWxOYW1lIiksIGl0IHdpbGwgYmUgdGhlIDJuZCBhcmd1bWVudC4KICAgU21hbGxWZWN0b3I8RXhwciosIDg+IFNlbEV4cHJzOwotICBRdWFsVHlwZSBhcmdUeXBlID0gQ29udGV4dC0+Z2V0UG9pbnRlclR5cGUoQ29udGV4dC0+Q2hhclR5KTsKLSAgU2VsRXhwcnMucHVzaF9iYWNrKFN0cmluZ0xpdGVyYWw6OkNyZWF0ZSgqQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cC0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbDo6QXNjaWksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnVHlwZSwgU291cmNlTG9jYXRpb24oKSkpOworICBTZWxFeHBycy5wdXNoX2JhY2soZ2V0U3RyaW5nTGl0ZXJhbChFeHAtPmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKSkpOwogICBDYWxsRXhwciAqU2VsRXhwID0gU3ludGhlc2l6ZUNhbGxUb0Z1bmN0aW9uRGVjbChTZWxHZXRVaWRGdW5jdGlvbkRlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNlbEV4cHJzWzBdLCBTZWxFeHBycy5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLApAQCAtMjk4OCwxMSArMjk0MSwxMCBAQAogICBBcmdUeXBlcy5wdXNoX2JhY2soQ29udGV4dC0+Z2V0T2JqQ1NlbFR5cGUoKSk7CiAgIGlmIChPYmpDTWV0aG9kRGVjbCAqT01EID0gRXhwLT5nZXRNZXRob2REZWNsKCkpIHsKICAgICAvLyBQdXNoIGFueSB1c2VyIGFyZ3VtZW50IHR5cGVzLgotICAgIGZvciAoT2JqQ01ldGhvZERlY2w6OnBhcmFtX2l0ZXJhdG9yIFBJID0gT01ELT5wYXJhbV9iZWdpbigpLAotICAgICAgICAgRSA9IE9NRC0+cGFyYW1fZW5kKCk7IFBJICE9IEU7ICsrUEkpIHsKLSAgICAgIFF1YWxUeXBlIHQgPSAoKlBJKS0+Z2V0VHlwZSgpLT5pc09iakNRdWFsaWZpZWRJZFR5cGUoKQorICAgIGZvciAoY29uc3QgYXV0byAqUEkgOiBPTUQtPnBhcmFtcygpKSB7CisgICAgICBRdWFsVHlwZSB0ID0gUEktPmdldFR5cGUoKS0+aXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgID8gQ29udGV4dC0+Z2V0T2JqQ0lkVHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICA6ICgqUEkpLT5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICA6IFBJLT5nZXRUeXBlKCk7CiAgICAgICAvLyBNYWtlIHN1cmUgd2UgY29udmVydCAidCAoXikoLi4uKSIgdG8gInQgKCopKC4uLikiLgogICAgICAgKHZvaWQpY29udmVydEJsb2NrUG9pbnRlclRvRnVuY3Rpb25Qb2ludGVyKHQpOwogICAgICAgQXJnVHlwZXMucHVzaF9iYWNrKHQpOwpAQCAtMzAzMSw5ICsyOTgzLDggQEAKICAgUGFyZW5FeHByICpQRSA9IG5ldyAoQ29udGV4dCkgUGFyZW5FeHByKFN0YXJ0TG9jLCBFbmRMb2MsIGNhc3QpOwogCiAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQgPSBtc2dTZW5kVHlwZS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpOwotICBDYWxsRXhwciAqQ0UgPSBuZXcgKENvbnRleHQpIENhbGxFeHByKCpDb250ZXh0LCBQRSwgTXNnRXhwcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlQtPmdldFJlc3VsdFR5cGUoKSwgVktfUlZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZExvYyk7CisgIENhbGxFeHByICpDRSA9IG5ldyAoQ29udGV4dCkKKyAgICAgIENhbGxFeHByKCpDb250ZXh0LCBQRSwgTXNnRXhwcnMsIEZULT5nZXRSZXR1cm5UeXBlKCksIFZLX1JWYWx1ZSwgRW5kTG9jKTsKICAgU3RtdCAqUmVwbGFjaW5nU3RtdCA9IENFOwogICBpZiAoTXNnU2VuZFN0cmV0Rmxhdm9yKSB7CiAgICAgLy8gV2UgaGF2ZSB0aGUgbWV0aG9kIHdoaWNoIHJldHVybnMgYSBzdHJ1Y3QvdW5pb24uIE11c3QgYWxzbyBnZW5lcmF0ZQpAQCAtMzMyNyw3ICszMjc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBmdW5jTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIFRhZykgewogICBjb25zdCBGdW5jdGlvblR5cGUgKkFGVCA9IENFLT5nZXRGdW5jdGlvblR5cGUoKTsKLSAgUXVhbFR5cGUgUlQgPSBBRlQtPmdldFJlc3VsdFR5cGUoKTsKKyAgUXVhbFR5cGUgUlQgPSBBRlQtPmdldFJldHVyblR5cGUoKTsKICAgc3RkOjpzdHJpbmcgU3RydWN0UmVmID0gInN0cnVjdCAiICsgVGFnOwogICBzdGQ6OnN0cmluZyBTID0gInN0YXRpYyAiICsgUlQuZ2V0QXNTdHJpbmcoQ29udGV4dC0+Z2V0UHJpbnRpbmdQb2xpY3koKSkgKyAiIF9fIiArCiAgICAgICAgICAgICAgICAgICBmdW5jTmFtZS5zdHIoKSArICJfIiArICJibG9ja19mdW5jXyIgKyB1dG9zdHIoaSk7CkBAIC0zNzg0LDEzICszNzM1LDEyIEBACiAgIC8vIEZUUCB3aWxsIGJlIG51bGwgZm9yIGNsb3N1cmVzIHRoYXQgZG9uJ3QgdGFrZSBhcmd1bWVudHMuCiAgIC8vIEdlbmVyYXRlIGEgZnVua3kgY2FzdC4KICAgU21hbGxWZWN0b3I8UXVhbFR5cGUsIDg+IEFyZ1R5cGVzOwotICBRdWFsVHlwZSBSZXMgPSBGVC0+Z2V0UmVzdWx0VHlwZSgpOworICBRdWFsVHlwZSBSZXMgPSBGVC0+Z2V0UmV0dXJuVHlwZSgpOwogICBib29sIEhhc0Jsb2NrVHlwZSA9IGNvbnZlcnRCbG9ja1BvaW50ZXJUb0Z1bmN0aW9uUG9pbnRlcihSZXMpOwogICAKICAgaWYgKEZUUCkgewotICAgIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yIEkgPSBGVFAtPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgICBFID0gRlRQLT5hcmdfdHlwZV9lbmQoKTsgSSAmJiAoSSAhPSBFKTsgKytJKSB7Ci0gICAgICBRdWFsVHlwZSB0ID0gKkk7CisgICAgZm9yIChhdXRvICZJIDogRlRQLT5wYXJhbV90eXBlcygpKSB7CisgICAgICBRdWFsVHlwZSB0ID0gSTsKICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjb252ZXJ0ICJ0ICheKSguLi4pIiB0byAidCAoKikoLi4uKSIuCiAgICAgICBpZiAoY29udmVydEJsb2NrUG9pbnRlclRvRnVuY3Rpb25Qb2ludGVyKHQpKQogICAgICAgICBIYXNCbG9ja1R5cGUgPSB0cnVlOwpAQCAtMzg1OCw5ICszODA4LDggQEAKICAgLy8gUHVzaCB0aGUgYmxvY2sgYXJndW1lbnQgdHlwZS4KICAgQXJnVHlwZXMucHVzaF9iYWNrKFB0ckJsb2NrKTsKICAgaWYgKEZUUCkgewotICAgIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yIEkgPSBGVFAtPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgICBFID0gRlRQLT5hcmdfdHlwZV9lbmQoKTsgSSAmJiAoSSAhPSBFKTsgKytJKSB7Ci0gICAgICBRdWFsVHlwZSB0ID0gKkk7CisgICAgZm9yIChhdXRvICZJIDogRlRQLT5wYXJhbV90eXBlcygpKSB7CisgICAgICBRdWFsVHlwZSB0ID0gSTsKICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjb252ZXJ0ICJ0ICheKSguLi4pIiB0byAidCAoKikoLi4uKSIuCiAgICAgICBpZiAoIWNvbnZlcnRCbG9ja1BvaW50ZXJUb0Z1bmN0aW9uUG9pbnRlcih0KSkKICAgICAgICAgY29udmVydFRvVW5xdWFsaWZpZWRPYmpDVHlwZSh0KTsKQEAgLTQwNjEsOSArNDAxMCw4IEBACiAgICAgRlRQID0gQlBULT5nZXRQb2ludGVlVHlwZSgpLT5nZXRBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKICAgfQogICBpZiAoRlRQKSB7Ci0gICAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6YXJnX3R5cGVfaXRlcmF0b3IgSSA9IEZUUC0+YXJnX3R5cGVfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBGVFAtPmFyZ190eXBlX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICAgIGlmIChpc1RvcExldmVsQmxvY2tQb2ludGVyVHlwZSgqSSkpCisgICAgZm9yIChjb25zdCBhdXRvICZJIDogRlRQLT5wYXJhbV90eXBlcygpKQorICAgICAgaWYgKGlzVG9wTGV2ZWxCbG9ja1BvaW50ZXJUeXBlKEkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgfQogICByZXR1cm4gZmFsc2U7CkBAIC00MDgwLDEyICs0MDI4LDExIEBACiAgICAgRlRQID0gQlBULT5nZXRQb2ludGVlVHlwZSgpLT5nZXRBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKICAgfQogICBpZiAoRlRQKSB7Ci0gICAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6YXJnX3R5cGVfaXRlcmF0b3IgSSA9IEZUUC0+YXJnX3R5cGVfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBGVFAtPmFyZ190eXBlX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgaWYgKCgqSSktPmlzT2JqQ1F1YWxpZmllZElkVHlwZSgpKQorICAgIGZvciAoY29uc3QgYXV0byAmSSA6IEZUUC0+cGFyYW1fdHlwZXMoKSkgeworICAgICAgaWYgKEktPmlzT2JqQ1F1YWxpZmllZElkVHlwZSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGlmICgoKkkpLT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpICYmCi0gICAgICAgICAgKCpJKS0+Z2V0UG9pbnRlZVR5cGUoKS0+aXNPYmpDUXVhbGlmaWVkSW50ZXJmYWNlVHlwZSgpKQorICAgICAgaWYgKEktPmlzT2JqQ09iamVjdFBvaW50ZXJUeXBlKCkgJiYKKyAgICAgICAgICBJLT5nZXRQb2ludGVlVHlwZSgpLT5pc09iakNRdWFsaWZpZWRJbnRlcmZhY2VUeXBlKCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAgICAgCkBAIC00NjAxLDExICs0NTQ4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCkpOwogICAgICAgYm9vbCBpc05lc3RlZENhcHR1cmVkVmFyID0gZmFsc2U7CiAgICAgICBpZiAoYmxvY2spCi0gICAgICAgIGZvciAoQmxvY2tEZWNsOjpjYXB0dXJlX2NvbnN0X2l0ZXJhdG9yIGNpID0gYmxvY2stPmNhcHR1cmVfYmVnaW4oKSwKLSAgICAgICAgICAgICBjZSA9IGJsb2NrLT5jYXB0dXJlX2VuZCgpOyBjaSAhPSBjZTsgKytjaSkgewotICAgICAgICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gY2ktPmdldFZhcmlhYmxlKCk7Ci0gICAgICAgICAgaWYgKHZhcmlhYmxlID09IE5EICYmIGNpLT5pc05lc3RlZCgpKSB7Ci0gICAgICAgICAgICBhc3NlcnQgKGNpLT5pc0J5UmVmKCkgJiYgCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmQ0kgOiBibG9jay0+Y2FwdHVyZXMoKSkgeworICAgICAgICAgIGNvbnN0IFZhckRlY2wgKnZhcmlhYmxlID0gQ0kuZ2V0VmFyaWFibGUoKTsKKyAgICAgICAgICBpZiAodmFyaWFibGUgPT0gTkQgJiYgQ0kuaXNOZXN0ZWQoKSkgeworICAgICAgICAgICAgYXNzZXJ0IChDSS5pc0J5UmVmKCkgJiYgCiAgICAgICAgICAgICAgICAgICAgICJTeW50aEJsb2NrSW5pdEV4cHIgLSBjYXB0dXJlZCBibG9jayB2YXJpYWJsZSBpcyBub3QgYnlyZWYiKTsKICAgICAgICAgICAgIGlzTmVzdGVkQ2FwdHVyZWRWYXIgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CkBAIC00Nzk1LDkgKzQ3NDEsNyBAQAogICAgICAgUmV3cml0ZU9iakNRdWFsaWZpZWRJbnRlcmZhY2VUeXBlcygqRFMtPmRlY2xfYmVnaW4oKSk7CiAKICAgICAvLyBCbG9ja3MgcmV3cml0ZSBydWxlcy4KLSAgICBmb3IgKERlY2xTdG10OjpkZWNsX2l0ZXJhdG9yIERJID0gRFMtPmRlY2xfYmVnaW4oKSwgREUgPSBEUy0+ZGVjbF9lbmQoKTsKLSAgICAgICAgIERJICE9IERFOyArK0RJKSB7Ci0gICAgICBEZWNsICpTRCA9ICpESTsKKyAgICBmb3IgKGF1dG8gKlNEIDogRFMtPmRlY2xzKCkpIHsKICAgICAgIGlmIChWYWx1ZURlY2wgKk5EID0gZHluX2Nhc3Q8VmFsdWVEZWNsPihTRCkpIHsKICAgICAgICAgaWYgKGlzVG9wTGV2ZWxCbG9ja1BvaW50ZXJUeXBlKE5ELT5nZXRUeXBlKCkpKQogICAgICAgICAgIFJld3JpdGVCbG9ja1BvaW50ZXJEZWNsKE5EKTsKQEAgLTQ4NzYsOSArNDgyMCw3IEBACiB9CiAKIHZvaWQgUmV3cml0ZU9iakM6OlJld3JpdGVSZWNvcmRCb2R5KFJlY29yZERlY2wgKlJEKSB7Ci0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgaSA9IFJELT5maWVsZF9iZWdpbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gUkQtPmZpZWxkX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgIEZpZWxkRGVjbCAqRkQgPSAqaTsKKyAgZm9yIChhdXRvICpGRCA6IFJELT5maWVsZHMoKSkgewogICAgIGlmIChpc1RvcExldmVsQmxvY2tQb2ludGVyVHlwZShGRC0+Z2V0VHlwZSgpKSkKICAgICAgIFJld3JpdGVCbG9ja1BvaW50ZXJEZWNsKEZEKTsKICAgICBpZiAoRkQtPmdldFR5cGUoKS0+aXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkgfHwKQEAgLTU0MjgsMTAgKzUzNzAsOCBAQAogICAgIE9iakNJbnRlcmZhY2VEZWNsOjppdmFyX2l0ZXJhdG9yIElWSSwgSVZFOwogICAgIFNtYWxsVmVjdG9yPE9iakNJdmFyRGVjbCAqLCA4PiBJVmFyczsKICAgICBpZiAoIUlEZWNsLT5pdmFyX2VtcHR5KCkpIHsKLSAgICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6Oml2YXJfaXRlcmF0b3IKLSAgICAgICAgICAgSVYgPSBJRGVjbC0+aXZhcl9iZWdpbigpLCBJVkVuZCA9IElEZWNsLT5pdmFyX2VuZCgpOwotICAgICAgICAgICBJViAhPSBJVkVuZDsgKytJVikKLSAgICAgICAgSVZhcnMucHVzaF9iYWNrKCpJVik7CisgICAgICBmb3IgKGF1dG8gKklWIDogSURlY2wtPml2YXJzKCkpCisgICAgICAgIElWYXJzLnB1c2hfYmFjayhJVik7CiAgICAgICBJVkkgPSBJRGVjbC0+aXZhcl9iZWdpbigpOwogICAgICAgSVZFID0gSURlY2wtPml2YXJfZW5kKCk7CiAgICAgfSBlbHNlIHsKQEAgLTU0NjUsMTQgKzU0MDUsMTEgQEAKICAgfQogICAKICAgLy8gQnVpbGQgX29iamNfbWV0aG9kX2xpc3QgZm9yIGNsYXNzJ3MgaW5zdGFuY2UgbWV0aG9kcyBpZiBuZWVkZWQKLSAgU21hbGxWZWN0b3I8T2JqQ01ldGhvZERlY2wgKiwgMzI+Ci0gIEluc3RhbmNlTWV0aG9kcyhJRGVjbC0+aW5zdG1ldGhfYmVnaW4oKSwgSURlY2wtPmluc3RtZXRoX2VuZCgpKTsKKyAgU21hbGxWZWN0b3I8T2JqQ01ldGhvZERlY2wgKiwgMzI+IEluc3RhbmNlTWV0aG9kcyhJRGVjbC0+aW5zdGFuY2VfbWV0aG9kcygpKTsKICAgCiAgIC8vIElmIGFueSBvZiBvdXIgcHJvcGVydHkgaW1wbGVtZW50YXRpb25zIGhhdmUgYXNzb2NpYXRlZCBnZXR0ZXJzIG9yCiAgIC8vIHNldHRlcnMsIHByb2R1Y2UgbWV0YWRhdGEgZm9yIHRoZW0gYXMgd2VsbC4KLSAgZm9yIChPYmpDSW1wbERlY2w6OnByb3BpbXBsX2l0ZXJhdG9yIFByb3AgPSBJRGVjbC0+cHJvcGltcGxfYmVnaW4oKSwKLSAgICAgICBQcm9wRW5kID0gSURlY2wtPnByb3BpbXBsX2VuZCgpOwotICAgICAgIFByb3AgIT0gUHJvcEVuZDsgKytQcm9wKSB7CisgIGZvciAoY29uc3QgYXV0byAqUHJvcCA6IElEZWNsLT5wcm9wZXJ0eV9pbXBscygpKSB7CiAgICAgaWYgKFByb3AtPmdldFByb3BlcnR5SW1wbGVtZW50YXRpb24oKSA9PSBPYmpDUHJvcGVydHlJbXBsRGVjbDo6RHluYW1pYykKICAgICAgIGNvbnRpbnVlOwogICAgIGlmICghUHJvcC0+Z2V0UHJvcGVydHlJdmFyRGVjbCgpKQpAQCAtNTc0NywxNCArNTY4NCwxMSBAQAogICBGdWxsQ2F0ZWdvcnlOYW1lICs9IElEZWNsLT5nZXROYW1lQXNTdHJpbmcoKTsKICAgCiAgIC8vIEJ1aWxkIF9vYmpjX21ldGhvZF9saXN0IGZvciBjbGFzcydzIGluc3RhbmNlIG1ldGhvZHMgaWYgbmVlZGVkCi0gIFNtYWxsVmVjdG9yPE9iakNNZXRob2REZWNsICosIDMyPgotICBJbnN0YW5jZU1ldGhvZHMoSURlY2wtPmluc3RtZXRoX2JlZ2luKCksIElEZWNsLT5pbnN0bWV0aF9lbmQoKSk7CisgIFNtYWxsVmVjdG9yPE9iakNNZXRob2REZWNsICosIDMyPiBJbnN0YW5jZU1ldGhvZHMoSURlY2wtPmluc3RhbmNlX21ldGhvZHMoKSk7CiAgIAogICAvLyBJZiBhbnkgb2Ygb3VyIHByb3BlcnR5IGltcGxlbWVudGF0aW9ucyBoYXZlIGFzc29jaWF0ZWQgZ2V0dGVycyBvcgogICAvLyBzZXR0ZXJzLCBwcm9kdWNlIG1ldGFkYXRhIGZvciB0aGVtIGFzIHdlbGwuCi0gIGZvciAoT2JqQ0ltcGxEZWNsOjpwcm9waW1wbF9pdGVyYXRvciBQcm9wID0gSURlY2wtPnByb3BpbXBsX2JlZ2luKCksCi0gICAgICAgUHJvcEVuZCA9IElEZWNsLT5wcm9waW1wbF9lbmQoKTsKLSAgICAgICBQcm9wICE9IFByb3BFbmQ7ICsrUHJvcCkgeworICBmb3IgKGNvbnN0IGF1dG8gKlByb3AgOiBJRGVjbC0+cHJvcGVydHlfaW1wbHMoKSkgewogICAgIGlmIChQcm9wLT5nZXRQcm9wZXJ0eUltcGxlbWVudGF0aW9uKCkgPT0gT2JqQ1Byb3BlcnR5SW1wbERlY2w6OkR5bmFtaWMpCiAgICAgICBjb250aW51ZTsKICAgICBpZiAoIVByb3AtPmdldFByb3BlcnR5SXZhckRlY2woKSkKZGlmZiAtLWdpdCBhL2xpYi9TZW1hL0FuYWx5c2lzQmFzZWRXYXJuaW5ncy5jcHAgYi9saWIvU2VtYS9BbmFseXNpc0Jhc2VkV2FybmluZ3MuY3BwCmluZGV4IDkzZTNlY2YuLjNlNDA0ODUgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL0FuYWx5c2lzQmFzZWRXYXJuaW5ncy5jcHAKKysrIGIvbGliL1NlbWEvQW5hbHlzaXNCYXNlZFdhcm5pbmdzLmNwcApAQCAtNjUsMTYgKzY1LDE1NyBAQAogICBwdWJsaWM6CiAgICAgVW5yZWFjaGFibGVDb2RlSGFuZGxlcihTZW1hICZzKSA6IFMocykge30KIAotICAgIHZvaWQgSGFuZGxlVW5yZWFjaGFibGUoU291cmNlTG9jYXRpb24gTCwgU291cmNlUmFuZ2UgUjEsIFNvdXJjZVJhbmdlIFIyKSB7Ci0gICAgICBTLkRpYWcoTCwgZGlhZzo6d2Fybl91bnJlYWNoYWJsZSkgPDwgUjEgPDwgUjI7CisgICAgdm9pZCBIYW5kbGVVbnJlYWNoYWJsZShyZWFjaGFibGVfY29kZTo6VW5yZWFjaGFibGVLaW5kIFVLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFNpbGVuY2VhYmxlQ29uZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgUjIpIG92ZXJyaWRlIHsKKyAgICAgIHVuc2lnbmVkIGRpYWcgPSBkaWFnOjp3YXJuX3VucmVhY2hhYmxlOworICAgICAgc3dpdGNoIChVSykgeworICAgICAgICBjYXNlIHJlYWNoYWJsZV9jb2RlOjpVS19CcmVhazoKKyAgICAgICAgICBkaWFnID0gZGlhZzo6d2Fybl91bnJlYWNoYWJsZV9icmVhazsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSByZWFjaGFibGVfY29kZTo6VUtfUmV0dXJuOgorICAgICAgICAgIGRpYWcgPSBkaWFnOjp3YXJuX3VucmVhY2hhYmxlX3JldHVybjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSByZWFjaGFibGVfY29kZTo6VUtfTG9vcF9JbmNyZW1lbnQ6CisgICAgICAgICAgZGlhZyA9IGRpYWc6Ondhcm5fdW5yZWFjaGFibGVfbG9vcF9pbmNyZW1lbnQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgcmVhY2hhYmxlX2NvZGU6OlVLX090aGVyOgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBTLkRpYWcoTCwgZGlhZykgPDwgUjEgPDwgUjI7CisgICAgICAKKyAgICAgIFNvdXJjZUxvY2F0aW9uIE9wZW4gPSBTaWxlbmNlYWJsZUNvbmRWYWwuZ2V0QmVnaW4oKTsKKyAgICAgIGlmIChPcGVuLmlzVmFsaWQoKSkgeworICAgICAgICBTb3VyY2VMb2NhdGlvbiBDbG9zZSA9IFNpbGVuY2VhYmxlQ29uZFZhbC5nZXRFbmQoKTsgICAgICAgIAorICAgICAgICBDbG9zZSA9IFMuUFAuZ2V0TG9jRm9yRW5kT2ZUb2tlbihDbG9zZSk7CisgICAgICAgIGlmIChDbG9zZS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICBTLkRpYWcoT3BlbiwgZGlhZzo6bm90ZV91bnJlYWNoYWJsZV9zaWxlbmNlKQorICAgICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oT3BlbiwgIi8qIERJU0FCTEVTIENPREUgKi8gKCIpCisgICAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihDbG9zZSwgIikiKTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KICAgfTsKIH0KIAogLy8vIENoZWNrVW5yZWFjaGFibGUgLSBDaGVjayBmb3IgdW5yZWFjaGFibGUgY29kZS4KIHN0YXRpYyB2b2lkIENoZWNrVW5yZWFjaGFibGUoU2VtYSAmUywgQW5hbHlzaXNEZWNsQ29udGV4dCAmQUMpIHsKKyAgLy8gQXMgYSBoZXVyaXN0aWMgcHJ1bmUgYWxsIGRpYWdub3N0aWNzIG5vdCBpbiB0aGUgbWFpbiBmaWxlLiAgQ3VycmVudGx5CisgIC8vIHRoZSBtYWpvcml0eSBvZiB3YXJuaW5ncyBpbiBoZWFkZXJzIGFyZSBmYWxzZSBwb3NpdGl2ZXMuICBUaGVzZQorICAvLyBhcmUgbGFyZ2VseSBjYXVzZWQgYnkgY29uZmlndXJhdGlvbiBzdGF0ZSwgZS5nLiBwcmVwcm9jZXNzb3IKKyAgLy8gZGVmaW5lZCBjb2RlLCBldGMuCisgIC8vCisgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIGFsc28gYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uICBBbmFseXppbmcKKyAgLy8gaGVhZGVycyBtYW55IHRpbWVzIGNhbiBiZSBleHBlbnNpdmUuCisgIGlmICghUy5nZXRTb3VyY2VNYW5hZ2VyKCkuaXNJbk1haW5GaWxlKEFDLmdldERlY2woKS0+Z2V0TG9jU3RhcnQoKSkpCisgICAgcmV0dXJuOworCiAgIFVucmVhY2hhYmxlQ29kZUhhbmRsZXIgVUMoUyk7Ci0gIHJlYWNoYWJsZV9jb2RlOjpGaW5kVW5yZWFjaGFibGVDb2RlKEFDLCBVQyk7CisgIHJlYWNoYWJsZV9jb2RlOjpGaW5kVW5yZWFjaGFibGVDb2RlKEFDLCBTLmdldFByZXByb2Nlc3NvcigpLCBVQyk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDaGVjayBmb3IgaW5maW5pdGUgc2VsZi1yZWN1cnNpb24gaW4gZnVuY3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBBbGwgYmxvY2tzIGFyZSBpbiBvbmUgb2YgdGhyZWUgc3RhdGVzLiAgU3RhdGVzIGFyZSBvcmRlcmVkIHNvIHRoYXQgYmxvY2tzCisvLyBjYW4gb25seSBtb3ZlIHRvIGhpZ2hlciBzdGF0ZXMuCitlbnVtIFJlY3Vyc2l2ZVN0YXRlIHsKKyAgRm91bmROb1BhdGgsCisgIEZvdW5kUGF0aCwKKyAgRm91bmRQYXRoV2l0aE5vUmVjdXJzaXZlQ2FsbAorfTsKKworc3RhdGljIHZvaWQgY2hlY2tGb3JGdW5jdGlvbkNhbGwoU2VtYSAmUywgY29uc3QgRnVuY3Rpb25EZWNsICpGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGR0Jsb2NrICZCbG9jaywgdW5zaWduZWQgRXhpdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPFJlY3Vyc2l2ZVN0YXRlPiAmU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdXJzaXZlU3RhdGUgU3RhdGUpIHsKKyAgdW5zaWduZWQgSUQgPSBCbG9jay5nZXRCbG9ja0lEKCk7CisKKyAgLy8gQSBibG9jaydzIHN0YXRlIGNhbiBvbmx5IG1vdmUgdG8gYSBoaWdoZXIgc3RhdGUuCisgIGlmIChTdGF0ZXNbSURdID49IFN0YXRlKQorICAgIHJldHVybjsKKworICBTdGF0ZXNbSURdID0gU3RhdGU7CisKKyAgLy8gRm91bmQgYSBwYXRoIHRvIHRoZSBleGl0IG5vZGUgd2l0aG91dCBhIHJlY3Vyc2l2ZSBjYWxsLgorICBpZiAoSUQgPT0gRXhpdElEICYmIFN0YXRlID09IEZvdW5kUGF0aFdpdGhOb1JlY3Vyc2l2ZUNhbGwpCisgICAgcmV0dXJuOworCisgIGlmIChTdGF0ZSA9PSBGb3VuZFBhdGhXaXRoTm9SZWN1cnNpdmVDYWxsKSB7CisgICAgLy8gSWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgRm91bmRQYXRoV2l0aE5vUmVjdXJzaXZlQ2FsbCwgdGhlIHN1Y2Nlc3NvcnMKKyAgICAvLyB3aWxsIGJlIGVpdGhlciBGb3VuZFBhdGhXaXRoTm9SZWN1cnNpdmVDYWxsIG9yIEZvdW5kUGF0aC4gIFRvIGRldGVybWluZQorICAgIC8vIHdoaWNoLCBwcm9jZXNzIGFsbCB0aGUgU3RtdCdzIGluIHRoaXMgYmxvY2sgdG8gZmluZCBhbnkgcmVjdXJzaXZlIGNhbGxzLgorICAgIGZvciAoQ0ZHQmxvY2s6Oml0ZXJhdG9yIEkgPSBCbG9jay5iZWdpbigpLCBFID0gQmxvY2suZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoSS0+Z2V0S2luZCgpICE9IENGR0VsZW1lbnQ6OlN0YXRlbWVudCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGNvbnN0IENhbGxFeHByICpDRSA9IGR5bl9jYXN0PENhbGxFeHByPihJLT5nZXRBczxDRkdTdG10PigpLT5nZXRTdG10KCkpOworICAgICAgaWYgKENFICYmIENFLT5nZXRDYWxsZWVEZWNsKCkgJiYKKyAgICAgICAgICBDRS0+Z2V0Q2FsbGVlRGVjbCgpLT5nZXRDYW5vbmljYWxEZWNsKCkgPT0gRkQpIHsKKworICAgICAgICAvLyBTa2lwIGZ1bmN0aW9uIGNhbGxzIHdoaWNoIGFyZSBxdWFsaWZpZWQgd2l0aCBhIHRlbXBsYXRlZCBjbGFzcy4KKyAgICAgICAgaWYgKGNvbnN0IERlY2xSZWZFeHByICpEUkUgPSBkeW5fY2FzdDxEZWNsUmVmRXhwcj4oCisgICAgICAgICAgICAgICAgQ0UtPmdldENhbGxlZSgpLT5JZ25vcmVQYXJlbkltcENhc3RzKCkpKSB7CisgICAgICAgICAgaWYgKE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUyA9IERSRS0+Z2V0UXVhbGlmaWVyKCkpIHsKKyAgICAgICAgICAgIGlmIChOTlMtPmdldEtpbmQoKSA9PSBOZXN0ZWROYW1lU3BlY2lmaWVyOjpUeXBlU3BlYyAmJgorICAgICAgICAgICAgICAgIGlzYTxUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZT4oTk5TLT5nZXRBc1R5cGUoKSkpIHsKKyAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25zdCBDWFhNZW1iZXJDYWxsRXhwciAqTUNFID0gZHluX2Nhc3Q8Q1hYTWVtYmVyQ2FsbEV4cHI+KENFKSkgeworICAgICAgICAgIGlmIChpc2E8Q1hYVGhpc0V4cHI+KE1DRS0+Z2V0SW1wbGljaXRPYmplY3RBcmd1bWVudCgpKSB8fAorICAgICAgICAgICAgICAhTUNFLT5nZXRNZXRob2REZWNsKCktPmlzVmlydHVhbCgpKSB7CisgICAgICAgICAgICBTdGF0ZSA9IEZvdW5kUGF0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTdGF0ZSA9IEZvdW5kUGF0aDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoQ0ZHQmxvY2s6OnN1Y2NfaXRlcmF0b3IgSSA9IEJsb2NrLnN1Y2NfYmVnaW4oKSwgRSA9IEJsb2NrLnN1Y2NfZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgaWYgKCpJKQorICAgICAgY2hlY2tGb3JGdW5jdGlvbkNhbGwoUywgRkQsICoqSSwgRXhpdElELCBTdGF0ZXMsIFN0YXRlKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tSZWN1cnNpdmVGdW5jdGlvbihTZW1hICZTLCBjb25zdCBGdW5jdGlvbkRlY2wgKkZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFseXNpc0RlY2xDb250ZXh0ICZBQykgeworICBGRCA9IEZELT5nZXRDYW5vbmljYWxEZWNsKCk7CisKKyAgLy8gT25seSBydW4gb24gbm9uLXRlbXBsYXRlZCBmdW5jdGlvbnMgYW5kIG5vbi10ZW1wbGF0ZWQgbWVtYmVycyBvZgorICAvLyB0ZW1wbGF0ZWQgY2xhc3Nlcy4KKyAgaWYgKEZELT5nZXRUZW1wbGF0ZWRLaW5kKCkgIT0gRnVuY3Rpb25EZWNsOjpUS19Ob25UZW1wbGF0ZSAmJgorICAgICAgRkQtPmdldFRlbXBsYXRlZEtpbmQoKSAhPSBGdW5jdGlvbkRlY2w6OlRLX01lbWJlclNwZWNpYWxpemF0aW9uKQorICAgIHJldHVybjsKKworICBDRkcgKmNmZyA9IEFDLmdldENGRygpOworICBpZiAoY2ZnID09IDApIHJldHVybjsKKworICAvLyBJZiB0aGUgZXhpdCBibG9jayBpcyB1bnJlYWNoYWJsZSwgc2tpcCBwcm9jZXNzaW5nIHRoZSBmdW5jdGlvbi4KKyAgaWYgKGNmZy0+Z2V0RXhpdCgpLnByZWRfZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgLy8gTWFyayBhbGwgbm9kZXMgYXMgRm91bmROb1BhdGgsIHRoZW4gYmVnaW4gcHJvY2Vzc2luZyB0aGUgZW50cnkgYmxvY2suCisgIGxsdm06OlNtYWxsVmVjdG9yPFJlY3Vyc2l2ZVN0YXRlLCAxNj4gc3RhdGVzKGNmZy0+Z2V0TnVtQmxvY2tJRHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm91bmROb1BhdGgpOworICBjaGVja0ZvckZ1bmN0aW9uQ2FsbChTLCBGRCwgY2ZnLT5nZXRFbnRyeSgpLCBjZmctPmdldEV4aXQoKS5nZXRCbG9ja0lEKCksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcywgRm91bmRQYXRoV2l0aE5vUmVjdXJzaXZlQ2FsbCk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgZXhpdCBibG9jayBpcyByZWFjaGFibGUuICBUaGlzIHByZXZlbnRzIHRyaWdnZXJpbmcgdGhlCisgIC8vIHdhcm5pbmcgb24gZnVuY3Rpb25zIHRoYXQgZG8gbm90IHRlcm1pbmF0ZS4KKyAgaWYgKHN0YXRlc1tjZmctPmdldEV4aXQoKS5nZXRCbG9ja0lEKCldID09IEZvdW5kUGF0aCkKKyAgICBTLkRpYWcoQm9keS0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6d2Fybl9pbmZpbml0ZV9yZWN1cnNpdmVfZnVuY3Rpb24pOwogfQogCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtMzMwLDE4ICs0NzEsMTggQEAKICAgYm9vbCBIYXNOb1JldHVybiA9IGZhbHNlOwogCiAgIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihEKSkgewotICAgIFJldHVybnNWb2lkID0gRkQtPmdldFJlc3VsdFR5cGUoKS0+aXNWb2lkVHlwZSgpOworICAgIFJldHVybnNWb2lkID0gRkQtPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHlwZSgpOwogICAgIEhhc05vUmV0dXJuID0gRkQtPmlzTm9SZXR1cm4oKTsKICAgfQogICBlbHNlIGlmIChjb25zdCBPYmpDTWV0aG9kRGVjbCAqTUQgPSBkeW5fY2FzdDxPYmpDTWV0aG9kRGVjbD4oRCkpIHsKLSAgICBSZXR1cm5zVm9pZCA9IE1ELT5nZXRSZXN1bHRUeXBlKCktPmlzVm9pZFR5cGUoKTsKKyAgICBSZXR1cm5zVm9pZCA9IE1ELT5nZXRSZXR1cm5UeXBlKCktPmlzVm9pZFR5cGUoKTsKICAgICBIYXNOb1JldHVybiA9IE1ELT5oYXNBdHRyPE5vUmV0dXJuQXR0cj4oKTsKICAgfQogICBlbHNlIGlmIChpc2E8QmxvY2tEZWNsPihEKSkgewogICAgIFF1YWxUeXBlIEJsb2NrVHkgPSBibGtFeHByLT5nZXRUeXBlKCk7CiAgICAgaWYgKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQgPQogICAgICAgICAgIEJsb2NrVHktPmdldFBvaW50ZWVUeXBlKCktPmdldEFzPEZ1bmN0aW9uVHlwZT4oKSkgewotICAgICAgaWYgKEZULT5nZXRSZXN1bHRUeXBlKCktPmlzVm9pZFR5cGUoKSkKKyAgICAgIGlmIChGVC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWRUeXBlKCkpCiAgICAgICAgIFJldHVybnNWb2lkID0gdHJ1ZTsKICAgICAgIGlmIChGVC0+Z2V0Tm9SZXR1cm5BdHRyKCkpCiAgICAgICAgIEhhc05vUmV0dXJuID0gdHJ1ZTsKQEAgLTc3Niw2ICs5MTcsNyBAQAogICAgICAgd2hpbGUgKCFCbG9ja1F1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgY29uc3QgQ0ZHQmxvY2sgKlAgPSBCbG9ja1F1ZXVlLmZyb250KCk7CiAgICAgICAgIEJsb2NrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIGlmICghUCkgY29udGludWU7CiAKICAgICAgICAgY29uc3QgU3RtdCAqVGVybSA9IFAtPmdldFRlcm1pbmF0b3IoKTsKICAgICAgICAgaWYgKFRlcm0gJiYgaXNhPFN3aXRjaFN0bXQ+KFRlcm0pKQpAQCAtOTc3LDI0ICsxMTE5LDYgQEAKIAogfQogCi1uYW1lc3BhY2UgewotdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgU3RtdCAqLAotICAgICAgICAgICAgICAgICAgc2VtYTo6RnVuY3Rpb25TY29wZUluZm86OldlYWtPYmplY3RVc2VNYXA6OmNvbnN0X2l0ZXJhdG9yPgotICAgICAgICBTdG10VXNlc1BhaXI7Ci0KLWNsYXNzIFN0bXRVc2VTb3J0ZXIgewotICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTTsKLQotcHVibGljOgotICBleHBsaWNpdCBTdG10VXNlU29ydGVyKGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKSA6IFNNKFNNKSB7IH0KLQotICBib29sIG9wZXJhdG9yKCkoY29uc3QgU3RtdFVzZXNQYWlyICZMSFMsIGNvbnN0IFN0bXRVc2VzUGFpciAmUkhTKSB7Ci0gICAgcmV0dXJuIFNNLmlzQmVmb3JlSW5UcmFuc2xhdGlvblVuaXQoTEhTLmZpcnN0LT5nZXRMb2NTdGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIUy5maXJzdC0+Z2V0TG9jU3RhcnQoKSk7Ci0gIH0KLX07Ci19Ci0KIHN0YXRpYyBib29sIGlzSW5Mb29wKGNvbnN0IEFTVENvbnRleHQgJkN0eCwgY29uc3QgUGFyZW50TWFwICZQTSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0bXQgKlMpIHsKICAgYXNzZXJ0KFMpOwpAQCAtMTAyOSw2ICsxMTUzLDggQEAKICAgdHlwZWRlZiBzZW1hOjpGdW5jdGlvblNjb3BlSW5mbzo6V2Vha09iamVjdFByb2ZpbGVUeSBXZWFrT2JqZWN0UHJvZmlsZVR5OwogICB0eXBlZGVmIHNlbWE6OkZ1bmN0aW9uU2NvcGVJbmZvOjpXZWFrT2JqZWN0VXNlTWFwIFdlYWtPYmplY3RVc2VNYXA7CiAgIHR5cGVkZWYgc2VtYTo6RnVuY3Rpb25TY29wZUluZm86OldlYWtVc2VWZWN0b3IgV2Vha1VzZVZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgU3RtdCAqLCBXZWFrT2JqZWN0VXNlTWFwOjpjb25zdF9pdGVyYXRvcj4KKyAgU3RtdFVzZXNQYWlyOwogCiAgIEFTVENvbnRleHQgJkN0eCA9IFMuZ2V0QVNUQ29udGV4dCgpOwogCkBAIC0xMDg3LDggKzEyMTMsMTIgQEAKICAgICByZXR1cm47CiAKICAgLy8gU29ydCBieSBmaXJzdCB1c2Ugc28gdGhhdCB3ZSBlbWl0IHRoZSB3YXJuaW5ncyBpbiBhIGRldGVybWluaXN0aWMgb3JkZXIuCisgIFNvdXJjZU1hbmFnZXIgJlNNID0gUy5nZXRTb3VyY2VNYW5hZ2VyKCk7CiAgIHN0ZDo6c29ydChVc2VzQnlTdG10LmJlZ2luKCksIFVzZXNCeVN0bXQuZW5kKCksCi0gICAgICAgICAgICBTdG10VXNlU29ydGVyKFMuZ2V0U291cmNlTWFuYWdlcigpKSk7CisgICAgICAgICAgICBbJlNNXShjb25zdCBTdG10VXNlc1BhaXIgJkxIUywgY29uc3QgU3RtdFVzZXNQYWlyICZSSFMpIHsKKyAgICByZXR1cm4gU00uaXNCZWZvcmVJblRyYW5zbGF0aW9uVW5pdChMSFMuZmlyc3QtPmdldExvY1N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTLmZpcnN0LT5nZXRMb2NTdGFydCgpKTsKKyAgfSk7CiAKICAgLy8gQ2xhc3NpZnkgdGhlIGN1cnJlbnQgY29kZSBib2R5IGZvciBiZXR0ZXIgd2FybmluZyB0ZXh0LgogICAvLyBUaGlzIGVudW0gc2hvdWxkIHN0YXkgaW4gc3luYyB3aXRoIHRoZSBjYXNlcyBpbgpAQCAtMTE2OSwxOSArMTI5OSw3IEBACiAgIH0KIH0KIAotCiBuYW1lc3BhY2Ugewotc3RydWN0IFNMb2NTb3J0IHsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFVuaW5pdFVzZSAmYSwgY29uc3QgVW5pbml0VXNlICZiKSB7Ci0gICAgLy8gUHJlZmVyIGEgbW9yZSBjb25maWRlbnQgcmVwb3J0IG92ZXIgYSBsZXNzIGNvbmZpZGVudCBvbmUuCi0gICAgaWYgKGEuZ2V0S2luZCgpICE9IGIuZ2V0S2luZCgpKQotICAgICAgcmV0dXJuIGEuZ2V0S2luZCgpID4gYi5nZXRLaW5kKCk7Ci0gICAgU291cmNlTG9jYXRpb24gYUxvYyA9IGEuZ2V0VXNlcigpLT5nZXRMb2NTdGFydCgpOwotICAgIFNvdXJjZUxvY2F0aW9uIGJMb2MgPSBiLmdldFVzZXIoKS0+Z2V0TG9jU3RhcnQoKTsKLSAgICByZXR1cm4gYUxvYy5nZXRSYXdFbmNvZGluZygpIDwgYkxvYy5nZXRSYXdFbmNvZGluZygpOwotICB9Ci19OwotCiBjbGFzcyBVbmluaXRWYWxzRGlhZ1JlcG9ydGVyIDogcHVibGljIFVuaW5pdFZhcmlhYmxlc0hhbmRsZXIgewogICBTZW1hICZTOwogICB0eXBlZGVmIFNtYWxsVmVjdG9yPFVuaW5pdFVzZSwgMj4gVXNlc1ZlYzsKQEAgLTEyMDgsMTIgKzEzMjYsMTMgQEAKICAgICAKICAgICByZXR1cm4gVjsKICAgfQotICAKLSAgdm9pZCBoYW5kbGVVc2VPZlVuaW5pdFZhcmlhYmxlKGNvbnN0IFZhckRlY2wgKnZkLCBjb25zdCBVbmluaXRVc2UgJnVzZSkgeworCisgIHZvaWQgaGFuZGxlVXNlT2ZVbmluaXRWYXJpYWJsZShjb25zdCBWYXJEZWNsICp2ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaW5pdFVzZSAmdXNlKSBvdmVycmlkZSB7CiAgICAgZ2V0VXNlcyh2ZCkuZ2V0UG9pbnRlcigpLT5wdXNoX2JhY2sodXNlKTsKICAgfQogICAKLSAgdm9pZCBoYW5kbGVTZWxmSW5pdChjb25zdCBWYXJEZWNsICp2ZCkgeworICB2b2lkIGhhbmRsZVNlbGZJbml0KGNvbnN0IFZhckRlY2wgKnZkKSBvdmVycmlkZSB7CiAgICAgZ2V0VXNlcyh2ZCkuc2V0SW50KHRydWUpOwogICB9CiAgIApAQCAtMTI0MCw4ICsxMzU5LDE0IEBACiAgICAgICAgIC8vIFNvcnQgdGhlIHVzZXMgYnkgdGhlaXIgU291cmNlTG9jYXRpb25zLiAgV2hpbGUgbm90IHN0cmljdGx5CiAgICAgICAgIC8vIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSB0aGVtIGluIGxpbmUvY29sdW1uIG9yZGVyLCB0aGlzIHdpbGwgcHJvdmlkZQogICAgICAgICAvLyBhIHN0YWJsZSBvcmRlcmluZy4KLSAgICAgICAgc3RkOjpzb3J0KHZlYy0+YmVnaW4oKSwgdmVjLT5lbmQoKSwgU0xvY1NvcnQoKSk7Ci0gICAgICAgIAorICAgICAgICBzdGQ6OnNvcnQodmVjLT5iZWdpbigpLCB2ZWMtPmVuZCgpLAorICAgICAgICAgICAgICAgICAgW10oY29uc3QgVW5pbml0VXNlICZhLCBjb25zdCBVbmluaXRVc2UgJmIpIHsKKyAgICAgICAgICAvLyBQcmVmZXIgYSBtb3JlIGNvbmZpZGVudCByZXBvcnQgb3ZlciBhIGxlc3MgY29uZmlkZW50IG9uZS4KKyAgICAgICAgICBpZiAoYS5nZXRLaW5kKCkgIT0gYi5nZXRLaW5kKCkpCisgICAgICAgICAgICByZXR1cm4gYS5nZXRLaW5kKCkgPiBiLmdldEtpbmQoKTsKKyAgICAgICAgICByZXR1cm4gYS5nZXRVc2VyKCktPmdldExvY1N0YXJ0KCkgPCBiLmdldFVzZXIoKS0+Z2V0TG9jU3RhcnQoKTsKKyAgICAgICAgfSk7CisKICAgICAgICAgZm9yIChVc2VzVmVjOjppdGVyYXRvciB2aSA9IHZlYy0+YmVnaW4oKSwgdmUgPSB2ZWMtPmVuZCgpOyB2aSAhPSB2ZTsKICAgICAgICAgICAgICArK3ZpKSB7CiAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBzZWxmLWluaXQsIGRvd25ncmFkZSBhbGwgdXNlcyB0byAnbWF5IGJlIHVuaW5pdGlhbGl6ZWQnLgpAQCAtMTMwNCwxMiArMTQyOSwxMyBAQAogICBTb3VyY2VMb2NhdGlvbiBGdW5Mb2NhdGlvbiwgRnVuRW5kTG9jYXRpb247CiAKICAgLy8gSGVscGVyIGZ1bmN0aW9ucwotICB2b2lkIHdhcm5Mb2NrTWlzbWF0Y2godW5zaWduZWQgRGlhZ0lELCBOYW1lIExvY2tOYW1lLCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKKyAgdm9pZCB3YXJuTG9ja01pc21hdGNoKHVuc2lnbmVkIERpYWdJRCwgU3RyaW5nUmVmIEtpbmQsIE5hbWUgTG9ja05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKICAgICAvLyBHcmFjZWZ1bGx5IGhhbmRsZSByYXJlIGNhc2VzIHdoZW4gdGhlIGFuYWx5c2lzIGNhbid0IGdldCBhIG1vcmUKICAgICAvLyBwcmVjaXNlIHNvdXJjZSBsb2NhdGlvbi4KICAgICBpZiAoIUxvYy5pc1ZhbGlkKCkpCiAgICAgICBMb2MgPSBGdW5Mb2NhdGlvbjsKLSAgICBQYXJ0aWFsRGlhZ25vc3RpY0F0IFdhcm5pbmcoTG9jLCBTLlBEaWFnKERpYWdJRCkgPDwgTG9ja05hbWUpOworICAgIFBhcnRpYWxEaWFnbm9zdGljQXQgV2FybmluZyhMb2MsIFMuUERpYWcoRGlhZ0lEKSA8PCBLaW5kIDw8IExvY2tOYW1lKTsKICAgICBXYXJuaW5ncy5wdXNoX2JhY2soRGVsYXllZERpYWcoV2FybmluZywgT3B0aW9uYWxOb3RlcygpKSk7CiAgIH0KIApAQCAtMTMzMiwyMiArMTQ1OCwzMyBAQAogICAgIH0KICAgfQogCi0gIHZvaWQgaGFuZGxlSW52YWxpZExvY2tFeHAoU291cmNlTG9jYXRpb24gTG9jKSB7Ci0gICAgUGFydGlhbERpYWdub3N0aWNBdCBXYXJuaW5nKExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5QRGlhZyhkaWFnOjp3YXJuX2Nhbm5vdF9yZXNvbHZlX2xvY2spIDw8IExvYyk7CisgIHZvaWQgaGFuZGxlSW52YWxpZExvY2tFeHAoU3RyaW5nUmVmIEtpbmQsIFNvdXJjZUxvY2F0aW9uIExvYykgb3ZlcnJpZGUgeworICAgIFBhcnRpYWxEaWFnbm9zdGljQXQgV2FybmluZyhMb2MsIFMuUERpYWcoZGlhZzo6d2Fybl9jYW5ub3RfcmVzb2x2ZV9sb2NrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBMb2MpOwogICAgIFdhcm5pbmdzLnB1c2hfYmFjayhEZWxheWVkRGlhZyhXYXJuaW5nLCBPcHRpb25hbE5vdGVzKCkpKTsKICAgfQotICB2b2lkIGhhbmRsZVVubWF0Y2hlZFVubG9jayhOYW1lIExvY2tOYW1lLCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKLSAgICB3YXJuTG9ja01pc21hdGNoKGRpYWc6Ondhcm5fdW5sb2NrX2J1dF9ub19sb2NrLCBMb2NrTmFtZSwgTG9jKTsKKyAgdm9pZCBoYW5kbGVVbm1hdGNoZWRVbmxvY2soU3RyaW5nUmVmIEtpbmQsIE5hbWUgTG9ja05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykgb3ZlcnJpZGUgeworICAgIHdhcm5Mb2NrTWlzbWF0Y2goZGlhZzo6d2Fybl91bmxvY2tfYnV0X25vX2xvY2ssIEtpbmQsIExvY2tOYW1lLCBMb2MpOworICB9CisgIHZvaWQgaGFuZGxlSW5jb3JyZWN0VW5sb2NrS2luZChTdHJpbmdSZWYgS2luZCwgTmFtZSBMb2NrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2tLaW5kIEV4cGVjdGVkLCBMb2NrS2luZCBSZWNlaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykgb3ZlcnJpZGUgeworICAgIGlmIChMb2MuaXNJbnZhbGlkKCkpCisgICAgICBMb2MgPSBGdW5Mb2NhdGlvbjsKKyAgICBQYXJ0aWFsRGlhZ25vc3RpY0F0IFdhcm5pbmcoTG9jLCBTLlBEaWFnKGRpYWc6Ondhcm5fdW5sb2NrX2tpbmRfbWlzbWF0Y2gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEtpbmQgPDwgTG9ja05hbWUgPDwgUmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRXhwZWN0ZWQpOworICAgIFdhcm5pbmdzLnB1c2hfYmFjayhEZWxheWVkRGlhZyhXYXJuaW5nLCBPcHRpb25hbE5vdGVzKCkpKTsKKyAgfQorICB2b2lkIGhhbmRsZURvdWJsZUxvY2soU3RyaW5nUmVmIEtpbmQsIE5hbWUgTG9ja05hbWUsIFNvdXJjZUxvY2F0aW9uIExvYykgb3ZlcnJpZGUgeworICAgIHdhcm5Mb2NrTWlzbWF0Y2goZGlhZzo6d2Fybl9kb3VibGVfbG9jaywgS2luZCwgTG9ja05hbWUsIExvYyk7CiAgIH0KIAotICB2b2lkIGhhbmRsZURvdWJsZUxvY2soTmFtZSBMb2NrTmFtZSwgU291cmNlTG9jYXRpb24gTG9jKSB7Ci0gICAgd2FybkxvY2tNaXNtYXRjaChkaWFnOjp3YXJuX2RvdWJsZV9sb2NrLCBMb2NrTmFtZSwgTG9jKTsKLSAgfQotCi0gIHZvaWQgaGFuZGxlTXV0ZXhIZWxkRW5kT2ZTY29wZShOYW1lIExvY2tOYW1lLCBTb3VyY2VMb2NhdGlvbiBMb2NMb2NrZWQsCisgIHZvaWQgaGFuZGxlTXV0ZXhIZWxkRW5kT2ZTY29wZShTdHJpbmdSZWYgS2luZCwgTmFtZSBMb2NrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0xvY2tlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvY0VuZE9mU2NvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NrRXJyb3JLaW5kIExFSyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NrRXJyb3JLaW5kIExFSykgb3ZlcnJpZGUgewogICAgIHVuc2lnbmVkIERpYWdJRCA9IDA7CiAgICAgc3dpdGNoIChMRUspIHsKICAgICAgIGNhc2UgTEVLX0xvY2tlZFNvbWVQcmVkZWNlc3NvcnM6CkBAIC0xMzY2LDI5ICsxNTAzLDMzIEBACiAgICAgaWYgKExvY0VuZE9mU2NvcGUuaXNJbnZhbGlkKCkpCiAgICAgICBMb2NFbmRPZlNjb3BlID0gRnVuRW5kTG9jYXRpb247CiAKLSAgICBQYXJ0aWFsRGlhZ25vc3RpY0F0IFdhcm5pbmcoTG9jRW5kT2ZTY29wZSwgUy5QRGlhZyhEaWFnSUQpIDw8IExvY2tOYW1lKTsKKyAgICBQYXJ0aWFsRGlhZ25vc3RpY0F0IFdhcm5pbmcoTG9jRW5kT2ZTY29wZSwgUy5QRGlhZyhEaWFnSUQpIDw8IEtpbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IExvY2tOYW1lKTsKICAgICBpZiAoTG9jTG9ja2VkLmlzVmFsaWQoKSkgewotICAgICAgUGFydGlhbERpYWdub3N0aWNBdCBOb3RlKExvY0xvY2tlZCwgUy5QRGlhZyhkaWFnOjpub3RlX2xvY2tlZF9oZXJlKSk7CisgICAgICBQYXJ0aWFsRGlhZ25vc3RpY0F0IE5vdGUoTG9jTG9ja2VkLCBTLlBEaWFnKGRpYWc6Om5vdGVfbG9ja2VkX2hlcmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgS2luZCk7CiAgICAgICBXYXJuaW5ncy5wdXNoX2JhY2soRGVsYXllZERpYWcoV2FybmluZywgT3B0aW9uYWxOb3RlcygxLCBOb3RlKSkpOwogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBXYXJuaW5ncy5wdXNoX2JhY2soRGVsYXllZERpYWcoV2FybmluZywgT3B0aW9uYWxOb3RlcygpKSk7CiAgIH0KIAotCi0gIHZvaWQgaGFuZGxlRXhjbHVzaXZlQW5kU2hhcmVkKE5hbWUgTG9ja05hbWUsIFNvdXJjZUxvY2F0aW9uIExvYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYzIpIHsKLSAgICBQYXJ0aWFsRGlhZ25vc3RpY0F0IFdhcm5pbmcoCi0gICAgICBMb2MxLCBTLlBEaWFnKGRpYWc6Ondhcm5fbG9ja19leGNsdXNpdmVfYW5kX3NoYXJlZCkgPDwgTG9ja05hbWUpOwotICAgIFBhcnRpYWxEaWFnbm9zdGljQXQgTm90ZSgKLSAgICAgIExvYzIsIFMuUERpYWcoZGlhZzo6bm90ZV9sb2NrX2V4Y2x1c2l2ZV9hbmRfc2hhcmVkKSA8PCBMb2NrTmFtZSk7CisgIHZvaWQgaGFuZGxlRXhjbHVzaXZlQW5kU2hhcmVkKFN0cmluZ1JlZiBLaW5kLCBOYW1lIExvY2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MyKSBvdmVycmlkZSB7CisgICAgUGFydGlhbERpYWdub3N0aWNBdCBXYXJuaW5nKExvYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuUERpYWcoZGlhZzo6d2Fybl9sb2NrX2V4Y2x1c2l2ZV9hbmRfc2hhcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgS2luZCA8PCBMb2NrTmFtZSk7CisgICAgUGFydGlhbERpYWdub3N0aWNBdCBOb3RlKExvYzIsIFMuUERpYWcoZGlhZzo6bm90ZV9sb2NrX2V4Y2x1c2l2ZV9hbmRfc2hhcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgS2luZCA8PCBMb2NrTmFtZSk7CiAgICAgV2FybmluZ3MucHVzaF9iYWNrKERlbGF5ZWREaWFnKFdhcm5pbmcsIE9wdGlvbmFsTm90ZXMoMSwgTm90ZSkpKTsKICAgfQogCi0gIHZvaWQgaGFuZGxlTm9NdXRleEhlbGQoY29uc3QgTmFtZWREZWNsICpELCBQcm90ZWN0ZWRPcGVyYXRpb25LaW5kIFBPSywKLSAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NLaW5kIEFLLCBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKLSAgICBhc3NlcnQoKFBPSyA9PSBQT0tfVmFyQWNjZXNzIHx8IFBPSyA9PSBQT0tfVmFyRGVyZWZlcmVuY2UpCi0gICAgICAgICAgICAgJiYgIk9ubHkgd29ya3MgZm9yIHZhcmlhYmxlcyIpOworICB2b2lkIGhhbmRsZU5vTXV0ZXhIZWxkKFN0cmluZ1JlZiBLaW5kLCBjb25zdCBOYW1lZERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdGVjdGVkT3BlcmF0aW9uS2luZCBQT0ssIEFjY2Vzc0tpbmQgQUssCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKSBvdmVycmlkZSB7CisgICAgYXNzZXJ0KChQT0sgPT0gUE9LX1ZhckFjY2VzcyB8fCBQT0sgPT0gUE9LX1ZhckRlcmVmZXJlbmNlKSAmJgorICAgICAgICAgICAiT25seSB3b3JrcyBmb3IgdmFyaWFibGVzIik7CiAgICAgdW5zaWduZWQgRGlhZ0lEID0gUE9LID09IFBPS19WYXJBY2Nlc3M/CiAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjp3YXJuX3ZhcmlhYmxlX3JlcXVpcmVzX2FueV9sb2NrOgogICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6d2Fybl92YXJfZGVyZWZfcmVxdWlyZXNfYW55X2xvY2s7CkBAIC0xMzk3LDkgKzE1MzgsMTAgQEAKICAgICBXYXJuaW5ncy5wdXNoX2JhY2soRGVsYXllZERpYWcoV2FybmluZywgT3B0aW9uYWxOb3RlcygpKSk7CiAgIH0KIAotICB2b2lkIGhhbmRsZU11dGV4Tm90SGVsZChjb25zdCBOYW1lZERlY2wgKkQsIFByb3RlY3RlZE9wZXJhdGlvbktpbmQgUE9LLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIExvY2tOYW1lLCBMb2NrS2luZCBMSywgU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICpQb3NzaWJsZU1hdGNoKSB7CisgIHZvaWQgaGFuZGxlTXV0ZXhOb3RIZWxkKFN0cmluZ1JlZiBLaW5kLCBjb25zdCBOYW1lZERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RlY3RlZE9wZXJhdGlvbktpbmQgUE9LLCBOYW1lIExvY2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NrS2luZCBMSywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICpQb3NzaWJsZU1hdGNoKSBvdmVycmlkZSB7CiAgICAgdW5zaWduZWQgRGlhZ0lEID0gMDsKICAgICBpZiAoUG9zc2libGVNYXRjaCkgewogICAgICAgc3dpdGNoIChQT0spIHsKQEAgLTE0MTMsMTAgKzE1NTUsMTEgQEAKICAgICAgICAgICBEaWFnSUQgPSBkaWFnOjp3YXJuX2Z1bl9yZXF1aXJlc19sb2NrX3ByZWNpc2U7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBQYXJ0aWFsRGlhZ25vc3RpY0F0IFdhcm5pbmcoTG9jLCBTLlBEaWFnKERpYWdJRCkKLSAgICAgICAgPDwgRC0+Z2V0TmFtZUFzU3RyaW5nKCkgPDwgTG9ja05hbWUgPDwgTEspOworICAgICAgUGFydGlhbERpYWdub3N0aWNBdCBXYXJuaW5nKExvYywgUy5QRGlhZyhEaWFnSUQpIDw8IEtpbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBELT5nZXROYW1lQXNTdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IExvY2tOYW1lIDw8IExLKTsKICAgICAgIFBhcnRpYWxEaWFnbm9zdGljQXQgTm90ZShMb2MsIFMuUERpYWcoZGlhZzo6bm90ZV9mb3VuZF9tdXRleF9uZWFyX21hdGNoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICpQb3NzaWJsZU1hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAqUG9zc2libGVNYXRjaCk7CiAgICAgICBXYXJuaW5ncy5wdXNoX2JhY2soRGVsYXllZERpYWcoV2FybmluZywgT3B0aW9uYWxOb3RlcygxLCBOb3RlKSkpOwogICAgIH0gZWxzZSB7CiAgICAgICBzd2l0Y2ggKFBPSykgewpAQCAtMTQzMCwxNSArMTU3MywxNyBAQAogICAgICAgICAgIERpYWdJRCA9IGRpYWc6Ondhcm5fZnVuX3JlcXVpcmVzX2xvY2s7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBQYXJ0aWFsRGlhZ25vc3RpY0F0IFdhcm5pbmcoTG9jLCBTLlBEaWFnKERpYWdJRCkKLSAgICAgICAgPDwgRC0+Z2V0TmFtZUFzU3RyaW5nKCkgPDwgTG9ja05hbWUgPDwgTEspOworICAgICAgUGFydGlhbERpYWdub3N0aWNBdCBXYXJuaW5nKExvYywgUy5QRGlhZyhEaWFnSUQpIDw8IEtpbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBELT5nZXROYW1lQXNTdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IExvY2tOYW1lIDw8IExLKTsKICAgICAgIFdhcm5pbmdzLnB1c2hfYmFjayhEZWxheWVkRGlhZyhXYXJuaW5nLCBPcHRpb25hbE5vdGVzKCkpKTsKICAgICB9CiAgIH0KIAotICB2b2lkIGhhbmRsZUZ1bkV4Y2x1ZGVzTG9jayhOYW1lIEZ1bk5hbWUsIE5hbWUgTG9ja05hbWUsIFNvdXJjZUxvY2F0aW9uIExvYykgewotICAgIFBhcnRpYWxEaWFnbm9zdGljQXQgV2FybmluZyhMb2MsCi0gICAgICBTLlBEaWFnKGRpYWc6Ondhcm5fZnVuX2V4Y2x1ZGVzX211dGV4KSA8PCBGdW5OYW1lIDw8IExvY2tOYW1lKTsKKyAgdm9pZCBoYW5kbGVGdW5FeGNsdWRlc0xvY2soU3RyaW5nUmVmIEtpbmQsIE5hbWUgRnVuTmFtZSwgTmFtZSBMb2NrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jKSBvdmVycmlkZSB7CisgICAgUGFydGlhbERpYWdub3N0aWNBdCBXYXJuaW5nKExvYywgUy5QRGlhZyhkaWFnOjp3YXJuX2Z1bl9leGNsdWRlc19tdXRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgS2luZCA8PCBGdW5OYW1lIDw8IExvY2tOYW1lKTsKICAgICBXYXJuaW5ncy5wdXNoX2JhY2soRGVsYXllZERpYWcoV2FybmluZywgT3B0aW9uYWxOb3RlcygpKSk7CiAgIH0KIH07CkBAIC0xNDYxLDggKzE2MDYsOCBAQAogcHVibGljOgogICAKICAgQ29uc3VtZWRXYXJuaW5nc0hhbmRsZXIoU2VtYSAmUykgOiBTKFMpIHt9Ci0gIAotICB2b2lkIGVtaXREaWFnbm9zdGljcygpIHsKKworICB2b2lkIGVtaXREaWFnbm9zdGljcygpIG92ZXJyaWRlIHsKICAgICBXYXJuaW5ncy5zb3J0KFNvcnREaWFnQnlTb3VyY2VMb2NhdGlvbihTLmdldFNvdXJjZU1hbmFnZXIoKSkpOwogICAgIAogICAgIGZvciAoRGlhZ0xpc3Q6Oml0ZXJhdG9yIEkgPSBXYXJuaW5ncy5iZWdpbigpLCBFID0gV2FybmluZ3MuZW5kKCk7CkBAIC0xNDc2LDggKzE2MjEsOSBAQAogICAgICAgfQogICAgIH0KICAgfQotICAKLSAgdm9pZCB3YXJuTG9vcFN0YXRlTWlzbWF0Y2goU291cmNlTG9jYXRpb24gTG9jLCBTdHJpbmdSZWYgVmFyaWFibGVOYW1lKSB7CisKKyAgdm9pZCB3YXJuTG9vcFN0YXRlTWlzbWF0Y2goU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFyaWFibGVOYW1lKSBvdmVycmlkZSB7CiAgICAgUGFydGlhbERpYWdub3N0aWNBdCBXYXJuaW5nKExvYywgUy5QRGlhZyhkaWFnOjp3YXJuX2xvb3Bfc3RhdGVfbWlzbWF0Y2gpIDw8CiAgICAgICBWYXJpYWJsZU5hbWUpOwogICAgIApAQCAtMTQ4Nyw3ICsxNjMzLDcgQEAKICAgdm9pZCB3YXJuUGFyYW1SZXR1cm5UeXBlc3RhdGVNaXNtYXRjaChTb3VyY2VMb2NhdGlvbiBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhcmlhYmxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRXhwZWN0ZWRTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgT2JzZXJ2ZWRTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBPYnNlcnZlZFN0YXRlKSBvdmVycmlkZSB7CiAgICAgCiAgICAgUGFydGlhbERpYWdub3N0aWNBdCBXYXJuaW5nKExvYywgUy5QRGlhZygKICAgICAgIGRpYWc6Ondhcm5fcGFyYW1fcmV0dXJuX3R5cGVzdGF0ZV9taXNtYXRjaCkgPDwgVmFyaWFibGVOYW1lIDw8CkBAIC0xNDk3LDcgKzE2NDMsNyBAQAogICB9CiAgIAogICB2b2lkIHdhcm5QYXJhbVR5cGVzdGF0ZU1pc21hdGNoKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIEV4cGVjdGVkU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE9ic2VydmVkU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgT2JzZXJ2ZWRTdGF0ZSkgb3ZlcnJpZGUgewogICAgIAogICAgIFBhcnRpYWxEaWFnbm9zdGljQXQgV2FybmluZyhMb2MsIFMuUERpYWcoCiAgICAgICBkaWFnOjp3YXJuX3BhcmFtX3R5cGVzdGF0ZV9taXNtYXRjaCkgPDwgRXhwZWN0ZWRTdGF0ZSA8PCBPYnNlcnZlZFN0YXRlKTsKQEAgLTE1MDYsNyArMTY1Miw3IEBACiAgIH0KICAgCiAgIHZvaWQgd2FyblJldHVyblR5cGVzdGF0ZUZvclVuY29uc3VtYWJsZVR5cGUoU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBUeXBlTmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBUeXBlTmFtZSkgb3ZlcnJpZGUgewogICAgIFBhcnRpYWxEaWFnbm9zdGljQXQgV2FybmluZyhMb2MsIFMuUERpYWcoCiAgICAgICBkaWFnOjp3YXJuX3JldHVybl90eXBlc3RhdGVfZm9yX3VuY29uc3VtYWJsZV90eXBlKSA8PCBUeXBlTmFtZSk7CiAgICAgCkBAIC0xNTE0LDcgKzE2NjAsNyBAQAogICB9CiAgIAogICB2b2lkIHdhcm5SZXR1cm5UeXBlc3RhdGVNaXNtYXRjaChTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBFeHBlY3RlZFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgT2JzZXJ2ZWRTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgT2JzZXJ2ZWRTdGF0ZSkgb3ZlcnJpZGUgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgUGFydGlhbERpYWdub3N0aWNBdCBXYXJuaW5nKExvYywgUy5QRGlhZygKICAgICAgIGRpYWc6Ondhcm5fcmV0dXJuX3R5cGVzdGF0ZV9taXNtYXRjaCkgPDwgRXhwZWN0ZWRTdGF0ZSA8PCBPYnNlcnZlZFN0YXRlKTsKQEAgLTE1MjMsNyArMTY2OSw3IEBACiAgIH0KICAgCiAgIHZvaWQgd2FyblVzZU9mVGVtcEluSW52YWxpZFN0YXRlKFN0cmluZ1JlZiBNZXRob2ROYW1lLCBTdHJpbmdSZWYgU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpIG92ZXJyaWRlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICBQYXJ0aWFsRGlhZ25vc3RpY0F0IFdhcm5pbmcoTG9jLCBTLlBEaWFnKAogICAgICAgZGlhZzo6d2Fybl91c2Vfb2ZfdGVtcF9pbl9pbnZhbGlkX3N0YXRlKSA8PCBNZXRob2ROYW1lIDw8IFN0YXRlKTsKQEAgLTE1MzIsNyArMTY3OCw3IEBACiAgIH0KICAgCiAgIHZvaWQgd2FyblVzZUluSW52YWxpZFN0YXRlKFN0cmluZ1JlZiBNZXRob2ROYW1lLCBTdHJpbmdSZWYgVmFyaWFibGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdGF0ZSwgU291cmNlTG9jYXRpb24gTG9jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdGF0ZSwgU291cmNlTG9jYXRpb24gTG9jKSBvdmVycmlkZSB7CiAgIAogICAgIFBhcnRpYWxEaWFnbm9zdGljQXQgV2FybmluZyhMb2MsIFMuUERpYWcoZGlhZzo6d2Fybl91c2VfaW5faW52YWxpZF9zdGF0ZSkgPDwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTmFtZSA8PCBWYXJpYWJsZU5hbWUgPDwgU3RhdGUpOwpAQCAtMTU1NCw2ICsxNzAwLDExIEBACiAgIGVuYWJsZUNvbnN1bWVkQW5hbHlzaXMgPSAwOwogfQogCitzdGF0aWMgdW5zaWduZWQgaXNFbmFibGVkKERpYWdub3N0aWNzRW5naW5lICZELCB1bnNpZ25lZCBkaWFnKSB7CisgIHJldHVybiAodW5zaWduZWQpIEQuZ2V0RGlhZ25vc3RpY0xldmVsKGRpYWcsIFNvdXJjZUxvY2F0aW9uKCkpICE9CisgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpJZ25vcmVkOworfQorCiBjbGFuZzo6c2VtYTo6QW5hbHlzaXNCYXNlZFdhcm5pbmdzOjpBbmFseXNpc0Jhc2VkV2FybmluZ3MoU2VtYSAmcykKICAgOiBTKHMpLAogICAgIE51bUZ1bmN0aW9uc0FuYWx5emVkKDApLApAQCAtMTU2NSwxNiArMTcxNiwyMSBAQAogICAgIE1heFVuaW5pdEFuYWx5c2lzVmFyaWFibGVzUGVyRnVuY3Rpb24oMCksCiAgICAgTnVtVW5pbml0QW5hbHlzaXNCbG9ja1Zpc2l0cygwKSwKICAgICBNYXhVbmluaXRBbmFseXNpc0Jsb2NrVmlzaXRzUGVyRnVuY3Rpb24oMCkgeworCisgIHVzaW5nIG5hbWVzcGFjZSBkaWFnOwogICBEaWFnbm9zdGljc0VuZ2luZSAmRCA9IFMuZ2V0RGlhZ25vc3RpY3MoKTsKLSAgRGVmYXVsdFBvbGljeS5lbmFibGVDaGVja1VucmVhY2hhYmxlID0gKHVuc2lnbmVkKQotICAgIChELmdldERpYWdub3N0aWNMZXZlbChkaWFnOjp3YXJuX3VucmVhY2hhYmxlLCBTb3VyY2VMb2NhdGlvbigpKSAhPQotICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6SWdub3JlZCk7Ci0gIERlZmF1bHRQb2xpY3kuZW5hYmxlVGhyZWFkU2FmZXR5QW5hbHlzaXMgPSAodW5zaWduZWQpCi0gICAgKEQuZ2V0RGlhZ25vc3RpY0xldmVsKGRpYWc6Ondhcm5fZG91YmxlX2xvY2ssIFNvdXJjZUxvY2F0aW9uKCkpICE9Ci0gICAgIERpYWdub3N0aWNzRW5naW5lOjpJZ25vcmVkKTsKLSAgRGVmYXVsdFBvbGljeS5lbmFibGVDb25zdW1lZEFuYWx5c2lzID0gKHVuc2lnbmVkKQotICAgIChELmdldERpYWdub3N0aWNMZXZlbChkaWFnOjp3YXJuX3VzZV9pbl9pbnZhbGlkX3N0YXRlLCBTb3VyY2VMb2NhdGlvbigpKSAhPQotICAgICBEaWFnbm9zdGljc0VuZ2luZTo6SWdub3JlZCk7CisKKyAgRGVmYXVsdFBvbGljeS5lbmFibGVDaGVja1VucmVhY2hhYmxlID0KKyAgICBpc0VuYWJsZWQoRCwgd2Fybl91bnJlYWNoYWJsZSkgfHwKKyAgICBpc0VuYWJsZWQoRCwgd2Fybl91bnJlYWNoYWJsZV9icmVhaykgfHwKKyAgICBpc0VuYWJsZWQoRCwgd2Fybl91bnJlYWNoYWJsZV9yZXR1cm4pIHx8CisgICAgaXNFbmFibGVkKEQsIHdhcm5fdW5yZWFjaGFibGVfbG9vcF9pbmNyZW1lbnQpOworCisgIERlZmF1bHRQb2xpY3kuZW5hYmxlVGhyZWFkU2FmZXR5QW5hbHlzaXMgPQorICAgIGlzRW5hYmxlZChELCB3YXJuX2RvdWJsZV9sb2NrKTsKKworICBEZWZhdWx0UG9saWN5LmVuYWJsZUNvbnN1bWVkQW5hbHlzaXMgPQorICAgIGlzRW5hYmxlZChELCB3YXJuX3VzZV9pbl9pbnZhbGlkX3N0YXRlKTsKIH0KIAogc3RhdGljIHZvaWQgZmx1c2hEaWFnbm9zdGljcyhTZW1hICZTLCBzZW1hOjpGdW5jdGlvblNjb3BlSW5mbyAqZnNjb3BlKSB7CkBAIC0xNjI5LDYgKzE3ODUsNyBAQAogICBBQy5nZXRDRkdCdWlsZE9wdGlvbnMoKS5BZGRJbml0aWFsaXplcnMgPSB0cnVlOwogICBBQy5nZXRDRkdCdWlsZE9wdGlvbnMoKS5BZGRJbXBsaWNpdER0b3JzID0gdHJ1ZTsKICAgQUMuZ2V0Q0ZHQnVpbGRPcHRpb25zKCkuQWRkVGVtcG9yYXJ5RHRvcnMgPSB0cnVlOworICBBQy5nZXRDRkdCdWlsZE9wdGlvbnMoKS5BZGRDWFhOZXdBbGxvY2F0b3IgPSBmYWxzZTsKIAogICAvLyBGb3JjZSB0aGF0IGNlcnRhaW4gZXhwcmVzc2lvbnMgYXBwZWFyIGFzIENGR0VsZW1lbnRzIGluIHRoZSBDRkcuICBUaGlzCiAgIC8vIGlzIHVzZWQgdG8gc3BlZWQgdXAgdmFyaW91cyBhbmFseXNlcy4KQEAgLTE3ODksNiArMTk0NiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQtPmdldExvY1N0YXJ0KCkpICE9IERpYWdub3N0aWNzRW5naW5lOjpJZ25vcmVkKQogICAgIGRpYWdub3NlUmVwZWF0ZWRVc2VPZldlYWsoUywgZnNjb3BlLCBELCBBQy5nZXRQYXJlbnRNYXAoKSk7CiAKKworICAvLyBDaGVjayBmb3IgaW5maW5pdGUgc2VsZi1yZWN1cnNpb24gaW4gZnVuY3Rpb25zCisgIGlmIChEaWFncy5nZXREaWFnbm9zdGljTGV2ZWwoZGlhZzo6d2Fybl9pbmZpbml0ZV9yZWN1cnNpdmVfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC0+Z2V0TG9jU3RhcnQoKSkKKyAgICAgICE9IERpYWdub3N0aWNzRW5naW5lOjpJZ25vcmVkKSB7CisgICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgICBjaGVja1JlY3Vyc2l2ZUZ1bmN0aW9uKFMsIEZELCBCb2R5LCBBQyk7CisgICAgfQorICB9CisKICAgLy8gQ29sbGVjdCBzdGF0aXN0aWNzIGFib3V0IHRoZSBDRkcgaWYgaXQgd2FzIGJ1aWx0LgogICBpZiAoUy5Db2xsZWN0U3RhdHMgJiYgQUMuaXNDRkdCdWlsdCgpKSB7CiAgICAgKytOdW1GdW5jdGlvbnNBbmFseXplZDsKZGlmZiAtLWdpdCBhL2xpYi9TZW1hL0FuZHJvaWQubWsgYi9saWIvU2VtYS9BbmRyb2lkLm1rCmluZGV4IGI5YjQ5NmEuLjc3YTJlOTMgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL0FuZHJvaWQubWsKKysrIGIvbGliL1NlbWEvQW5kcm9pZC5tawpAQCAtMTMsNiArMTMsNyBAQAogCUF0dHJQYXJzZWRBdHRyTGlzdC5pbmMgICAgXAogCUF0dHJTcGVsbGluZ0xpc3RJbmRleC5pbmMgXAogCUF0dHJUZW1wbGF0ZUluc3RhbnRpYXRlLmluYwlcCisgICAgICAgIEF0dHJWaXNpdG9yLmluYyBcCiAJQ29tbWVudENvbW1hbmRMaXN0LmluYyBcCiAJQ29tbWVudE5vZGVzLmluYyBcCiAJRGVjbE5vZGVzLmluYwlcCkBAIC02OSw3ICs3MCw2IEBACiAJU2VtYVRlbXBsYXRlSW5zdGFudGlhdGVEZWNsLmNwcAlcCiAJU2VtYVRlbXBsYXRlVmFyaWFkaWMuY3BwCVwKIAlTZW1hVHlwZS5jcHAJXAotCVRhcmdldEF0dHJpYnV0ZXNTZW1hLmNwcAlcCiAJVHlwZUxvY0J1aWxkZXIuY3BwCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSAkKGNsYW5nX3NlbWFfU1JDX0ZJTEVTKQpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvQXR0cmlidXRlTGlzdC5jcHAgYi9saWIvU2VtYS9BdHRyaWJ1dGVMaXN0LmNwcAppbmRleCBjOTgwNzcyLi40NzZhMjJiIDEwMDY0NAotLS0gYS9saWIvU2VtYS9BdHRyaWJ1dGVMaXN0LmNwcAorKysgYi9saWIvU2VtYS9BdHRyaWJ1dGVMaXN0LmNwcApAQCAtMTMsOCArMTMsMTEgQEAKIAogI2luY2x1ZGUgImNsYW5nL1NlbWEvQXR0cmlidXRlTGlzdC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9JZGVudGlmaWVyVGFibGUuaCIKKyNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWFJbnRlcm5hbC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgiCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CkBAIC0xMDMsMTQgKzEwNiw2IEBACiAgIH0gd2hpbGUgKHBvb2wpOwogfQogCi1BdHRyaWJ1dGVMaXN0ICoKLUF0dHJpYnV0ZVBvb2w6OmNyZWF0ZUludGVnZXJBdHRyaWJ1dGUoQVNUQ29udGV4dCAmQywgSWRlbnRpZmllckluZm8gKk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRva0xvYywgaW50IEFyZykgewotICBBcmdzVW5pb24gSUFyZyA9IEludGVnZXJMaXRlcmFsOjpDcmVhdGUoQywgbGx2bTo6QVBJbnQoMzIsICh1aW50NjRfdCkgQXJnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQy5JbnRUeSwgVG9rTG9jKTsKLSAgcmV0dXJuIGNyZWF0ZShOYW1lLCBUb2tMb2MsIDAsIFRva0xvYywgJklBcmcsIDEsIEF0dHJpYnV0ZUxpc3Q6OkFTX0dOVSk7Ci19Ci0KICNpbmNsdWRlICJjbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRyS2luZHMuaW5jIgogCiBBdHRyaWJ1dGVMaXN0OjpLaW5kIEF0dHJpYnV0ZUxpc3Q6OmdldEtpbmQoY29uc3QgSWRlbnRpZmllckluZm8gKk5hbWUsCkBAIC0xMTgsMjEgKzExMywyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheCBTeW50YXhVc2VkKSB7CiAgIFN0cmluZ1JlZiBBdHRyTmFtZSA9IE5hbWUtPmdldE5hbWUoKTsKIAotICAvLyBOb3JtYWxpemUgdGhlIGF0dHJpYnV0ZSBuYW1lLCBfX2Zvb19fIGJlY29tZXMgZm9vLgotICBpZiAoQXR0ck5hbWUuc3RhcnRzd2l0aCgiX18iKSAmJiBBdHRyTmFtZS5lbmRzd2l0aCgiX18iKSAmJgotICAgICAgQXR0ck5hbWUuc2l6ZSgpID49IDQpCi0gICAgQXR0ck5hbWUgPSBBdHRyTmFtZS5zdWJzdHIoMiwgQXR0ck5hbWUuc2l6ZSgpIC0gNCk7Ci0KLSAgU21hbGxTdHJpbmc8NjQ+IEJ1ZjsKKyAgU21hbGxTdHJpbmc8NjQ+IEZ1bGxOYW1lOwogICBpZiAoU2NvcGVOYW1lKQotICAgIEJ1ZiArPSBTY29wZU5hbWUtPmdldE5hbWUoKTsKKyAgICBGdWxsTmFtZSArPSBTY29wZU5hbWUtPmdldE5hbWUoKTsKKworICAvLyBOb3JtYWxpemUgdGhlIGF0dHJpYnV0ZSBuYW1lLCBfX2Zvb19fIGJlY29tZXMgZm9vLiBUaGlzIGlzIG9ubHkgYWxsb3dhYmxlCisgIC8vIGZvciBHTlUgYXR0cmlidXRlcy4KKyAgYm9vbCBJc0dOVSA9IFN5bnRheFVzZWQgPT0gQVNfR05VIHx8IChTeW50YXhVc2VkID09IEFTX0NYWDExICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVsbE5hbWUgPT0gImdudSIpOworICBpZiAoSXNHTlUgJiYgQXR0ck5hbWUuc2l6ZSgpID49IDQgJiYgQXR0ck5hbWUuc3RhcnRzd2l0aCgiX18iKSAmJgorICAgICAgQXR0ck5hbWUuZW5kc3dpdGgoIl9fIikpCisgICAgQXR0ck5hbWUgPSBBdHRyTmFtZS5zbGljZSgyLCBBdHRyTmFtZS5zaXplKCkgLSAyKTsKKwogICAvLyBFbnN1cmUgdGhhdCBpbiB0aGUgY2FzZSBvZiBDKysxMSBhdHRyaWJ1dGVzLCB3ZSBsb29rIGZvciAnOjpmb28nIGlmIGl0IGlzCiAgIC8vIHVuc2NvcGVkLgogICBpZiAoU2NvcGVOYW1lIHx8IFN5bnRheFVzZWQgPT0gQVNfQ1hYMTEpCi0gICAgQnVmICs9ICI6OiI7Ci0gIEJ1ZiArPSBBdHRyTmFtZTsKKyAgICBGdWxsTmFtZSArPSAiOjoiOworICBGdWxsTmFtZSArPSBBdHRyTmFtZTsKIAotICByZXR1cm4gOjpnZXRBdHRyS2luZChCdWYpOworICByZXR1cm4gOjpnZXRBdHRyS2luZChGdWxsTmFtZSwgU3ludGF4VXNlZCk7CiB9CiAKIHVuc2lnbmVkIEF0dHJpYnV0ZUxpc3Q6OmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkgY29uc3QgewpAQCAtMTQ5LDYgKzE0OCwxNSBAQAogICB1bnNpZ25lZCBOdW1BcmdzIDogNDsKICAgdW5zaWduZWQgT3B0QXJncyA6IDQ7CiAgIHVuc2lnbmVkIEhhc0N1c3RvbVBhcnNpbmcgOiAxOworICB1bnNpZ25lZCBJc1RhcmdldFNwZWNpZmljIDogMTsKKyAgdW5zaWduZWQgSXNUeXBlIDogMTsKKyAgdW5zaWduZWQgSXNLbm93blRvR0NDIDogMTsKKworICBib29sICgqRGlhZ0FwcGVydGFpbnNUb0RlY2wpKFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjbCAqKTsKKyAgYm9vbCAoKkRpYWdMYW5nT3B0cykoU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cik7CisgIGJvb2wgKCpFeGlzdHNJblRhcmdldCkoY29uc3QgbGx2bTo6VHJpcGxlICZUKTsKKyAgdW5zaWduZWQgKCpTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nKShjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKTsKIH07CiAKIG5hbWVzcGFjZSB7CkBAIC0xNzAsMyArMTc4LDMxIEBACiBib29sIEF0dHJpYnV0ZUxpc3Q6Omhhc0N1c3RvbVBhcnNpbmcoKSBjb25zdCB7CiAgIHJldHVybiBnZXRJbmZvKCp0aGlzKS5IYXNDdXN0b21QYXJzaW5nOwogfQorCitib29sIEF0dHJpYnV0ZUxpc3Q6OmRpYWdub3NlQXBwZXJ0YWluc1RvKFNlbWEgJlMsIGNvbnN0IERlY2wgKkQpIGNvbnN0IHsKKyAgcmV0dXJuIGdldEluZm8oKnRoaXMpLkRpYWdBcHBlcnRhaW5zVG9EZWNsKFMsICp0aGlzLCBEKTsKK30KKworYm9vbCBBdHRyaWJ1dGVMaXN0OjpkaWFnbm9zZUxhbmdPcHRzKFNlbWEgJlMpIGNvbnN0IHsKKyAgcmV0dXJuIGdldEluZm8oKnRoaXMpLkRpYWdMYW5nT3B0cyhTLCAqdGhpcyk7Cit9CisKK2Jvb2wgQXR0cmlidXRlTGlzdDo6aXNUYXJnZXRTcGVjaWZpY0F0dHIoKSBjb25zdCB7CisgIHJldHVybiBnZXRJbmZvKCp0aGlzKS5Jc1RhcmdldFNwZWNpZmljOworfQorCitib29sIEF0dHJpYnV0ZUxpc3Q6OmlzVHlwZUF0dHIoKSBjb25zdCB7CisgIHJldHVybiBnZXRJbmZvKCp0aGlzKS5Jc1R5cGU7Cit9CisKK2Jvb2wgQXR0cmlidXRlTGlzdDo6ZXhpc3RzSW5UYXJnZXQoY29uc3QgbGx2bTo6VHJpcGxlICZUKSBjb25zdCB7CisgIHJldHVybiBnZXRJbmZvKCp0aGlzKS5FeGlzdHNJblRhcmdldChUKTsKK30KKworYm9vbCBBdHRyaWJ1dGVMaXN0Ojppc0tub3duVG9HQ0MoKSBjb25zdCB7CisgIHJldHVybiBnZXRJbmZvKCp0aGlzKS5Jc0tub3duVG9HQ0M7Cit9CisKK3Vuc2lnbmVkIEF0dHJpYnV0ZUxpc3Q6OmdldFNlbWFudGljU3BlbGxpbmcoKSBjb25zdCB7CisgIHJldHVybiBnZXRJbmZvKCp0aGlzKS5TcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nKCp0aGlzKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9TZW1hL0NNYWtlTGlzdHMudHh0IGIvbGliL1NlbWEvQ01ha2VMaXN0cy50eHQKaW5kZXggNWUwOTE0MC4uNzg0N2QyYyAxMDA2NDQKLS0tIGEvbGliL1NlbWEvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL1NlbWEvQ01ha2VMaXN0cy50eHQKQEAgLTEsOCArMSw1IEBACiBzZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMKLSAgJHtMTFZNX1RBUkdFVFNfVE9fQlVJTER9Ci0gIGFzbXBhcnNlcgotICBzdXBwb3J0Ci0gIG1jCisgIFN1cHBvcnQKICAgKQogCiBhZGRfY2xhbmdfbGlicmFyeShjbGFuZ1NlbWEKQEAgLTUwLDMwICs0Nyw5IEBACiAgIFNlbWFUZW1wbGF0ZUluc3RhbnRpYXRlRGVjbC5jcHAKICAgU2VtYVRlbXBsYXRlVmFyaWFkaWMuY3BwCiAgIFNlbWFUeXBlLmNwcAotICBUYXJnZXRBdHRyaWJ1dGVzU2VtYS5jcHAKICAgVHlwZUxvY0J1aWxkZXIuY3BwCi0gICkKIAotYWRkX2RlcGVuZGVuY2llcyhjbGFuZ1NlbWEKLSAgQ2xhbmdBUk1OZW9uCi0gIENsYW5nQXR0ckNsYXNzZXMKLSAgQ2xhbmdBdHRyTGlzdAotICBDbGFuZ0F0dHJQYXJzZWRBdHRyTGlzdAotICBDbGFuZ0F0dHJQYXJzZWRBdHRyS2luZHMKLSAgQ2xhbmdBdHRyUGFyc2VkQXR0ckltcGwKLSAgQ2xhbmdBdHRyU3BlbGxpbmdMaXN0SW5kZXgKLSAgQ2xhbmdBdHRyVGVtcGxhdGVJbnN0YW50aWF0ZQotICBDbGFuZ0NvbW1lbnROb2RlcwotICBDbGFuZ0RlY2xOb2RlcwotICBDbGFuZ0RpYWdub3N0aWNBU1QKLSAgQ2xhbmdEaWFnbm9zdGljQ29tbWVudAotICBDbGFuZ0RpYWdub3N0aWNDb21tb24KLSAgQ2xhbmdEaWFnbm9zdGljUGFyc2UKLSAgQ2xhbmdEaWFnbm9zdGljU2VtYQotICBDbGFuZ1N0bXROb2RlcwotICApCi0KLXRhcmdldF9saW5rX2xpYnJhcmllcyhjbGFuZ1NlbWEKKyAgTElOS19MSUJTCiAgIGNsYW5nQVNUCiAgIGNsYW5nQW5hbHlzaXMKICAgY2xhbmdCYXNpYwpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvRGVjbFNwZWMuY3BwIGIvbGliL1NlbWEvRGVjbFNwZWMuY3BwCmluZGV4IGMyZjE2MTUuLjVjMjAwNmYgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL0RlY2xTcGVjLmNwcAorKysgYi9saWIvU2VtYS9EZWNsU3BlYy5jcHAKQEAgLTE0OSw4ICsxNDksOCBAQAogRGVjbGFyYXRvckNodW5rIERlY2xhcmF0b3JDaHVuazo6Z2V0RnVuY3Rpb24oYm9vbCBoYXNQcm90bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNBbWJpZ3VvdXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbUluZm8gKkFyZ0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1BcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1JbmZvICpQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1QYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbGxpcHNpc0xvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFR5cGVRdWFscywKQEAgLTE4NSwxMCArMTg1LDEwIEBACiAgIEkuRnVuLkxQYXJlbkxvYyAgICAgICAgICAgICAgID0gTFBhcmVuTG9jLmdldFJhd0VuY29kaW5nKCk7CiAgIEkuRnVuLkVsbGlwc2lzTG9jICAgICAgICAgICAgID0gRWxsaXBzaXNMb2MuZ2V0UmF3RW5jb2RpbmcoKTsKICAgSS5GdW4uUlBhcmVuTG9jICAgICAgICAgICAgICAgPSBSUGFyZW5Mb2MuZ2V0UmF3RW5jb2RpbmcoKTsKLSAgSS5GdW4uRGVsZXRlQXJnSW5mbyAgICAgICAgICAgPSBmYWxzZTsKKyAgSS5GdW4uRGVsZXRlUGFyYW1zICAgICAgICAgICAgPSBmYWxzZTsKICAgSS5GdW4uVHlwZVF1YWxzICAgICAgICAgICAgICAgPSBUeXBlUXVhbHM7Ci0gIEkuRnVuLk51bUFyZ3MgICAgICAgICAgICAgICAgID0gTnVtQXJnczsKLSAgSS5GdW4uQXJnSW5mbyAgICAgICAgICAgICAgICAgPSAwOworICBJLkZ1bi5OdW1QYXJhbXMgICAgICAgICAgICAgICA9IE51bVBhcmFtczsKKyAgSS5GdW4uUGFyYW1zICAgICAgICAgICAgICAgICAgPSAwOwogICBJLkZ1bi5SZWZRdWFsaWZpZXJJc0xWYWx1ZVJlZiA9IFJlZlF1YWxpZmllcklzTHZhbHVlUmVmOwogICBJLkZ1bi5SZWZRdWFsaWZpZXJMb2MgICAgICAgICA9IFJlZlF1YWxpZmllckxvYy5nZXRSYXdFbmNvZGluZygpOwogICBJLkZ1bi5Db25zdFF1YWxpZmllckxvYyAgICAgICA9IENvbnN0UXVhbGlmaWVyTG9jLmdldFJhd0VuY29kaW5nKCk7CkBAIC0yMDMsMjIgKzIwMywyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWlsaW5nUmV0dXJuVHlwZS5pc0ludmFsaWQoKTsKICAgSS5GdW4uVHJhaWxpbmdSZXR1cm5UeXBlICAgICAgPSBUcmFpbGluZ1JldHVyblR5cGUuZ2V0KCk7CiAKLSAgLy8gbmV3W10gYW4gYXJndW1lbnQgYXJyYXkgaWYgbmVlZGVkLgotICBpZiAoTnVtQXJncykgeworICAvLyBuZXdbXSBhIHBhcmFtZXRlciBhcnJheSBpZiBuZWVkZWQuCisgIGlmIChOdW1QYXJhbXMpIHsKICAgICAvLyBJZiB0aGUgJ0lubGluZVBhcmFtcycgaW4gRGVjbGFyYXRvciBpcyB1bnVzZWQgYW5kIGJpZyBlbm91Z2gsIHB1dCBvdXIKICAgICAvLyBwYXJhbWV0ZXIgbGlzdCB0aGVyZSAoaW4gYW4gZWZmb3J0IHRvIGF2b2lkIG5ldy9kZWxldGUgdHJhZmZpYykuICBJZiBpdAogICAgIC8vIGlzIGFscmVhZHkgdXNlZCAoY29uc2lkZXIgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBmdW5jdGlvbiBwb2ludGVyKSBvciB0b28KLSAgICAvLyBzbWFsbCAoZnVuY3Rpb24gdGFraW5nIHRvbyBtYW55IGFyZ3VtZW50cyksIGdvIHRvIHRoZSBoZWFwLgorICAgIC8vIHNtYWxsIChmdW5jdGlvbiB3aXRoIHRvbyBtYW55IHBhcmFtZXRlcnMpLCBnbyB0byB0aGUgaGVhcC4KICAgICBpZiAoIVRoZURlY2xhcmF0b3IuSW5saW5lUGFyYW1zVXNlZCAmJgotICAgICAgICBOdW1BcmdzIDw9IGxsdm06OmFycmF5X2xlbmd0aG9mKFRoZURlY2xhcmF0b3IuSW5saW5lUGFyYW1zKSkgewotICAgICAgSS5GdW4uQXJnSW5mbyA9IFRoZURlY2xhcmF0b3IuSW5saW5lUGFyYW1zOwotICAgICAgSS5GdW4uRGVsZXRlQXJnSW5mbyA9IGZhbHNlOworICAgICAgICBOdW1QYXJhbXMgPD0gbGx2bTo6YXJyYXlfbGVuZ3Rob2YoVGhlRGVjbGFyYXRvci5JbmxpbmVQYXJhbXMpKSB7CisgICAgICBJLkZ1bi5QYXJhbXMgPSBUaGVEZWNsYXJhdG9yLklubGluZVBhcmFtczsKKyAgICAgIEkuRnVuLkRlbGV0ZVBhcmFtcyA9IGZhbHNlOwogICAgICAgVGhlRGVjbGFyYXRvci5JbmxpbmVQYXJhbXNVc2VkID0gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgSS5GdW4uQXJnSW5mbyA9IG5ldyBEZWNsYXJhdG9yQ2h1bms6OlBhcmFtSW5mb1tOdW1BcmdzXTsKLSAgICAgIEkuRnVuLkRlbGV0ZUFyZ0luZm8gPSB0cnVlOworICAgICAgSS5GdW4uUGFyYW1zID0gbmV3IERlY2xhcmF0b3JDaHVuazo6UGFyYW1JbmZvW051bVBhcmFtc107CisgICAgICBJLkZ1bi5EZWxldGVQYXJhbXMgPSB0cnVlOwogICAgIH0KLSAgICBtZW1jcHkoSS5GdW4uQXJnSW5mbywgQXJnSW5mbywgc2l6ZW9mKEFyZ0luZm9bMF0pKk51bUFyZ3MpOworICAgIG1lbWNweShJLkZ1bi5QYXJhbXMsIFBhcmFtcywgc2l6ZW9mKFBhcmFtc1swXSkgKiBOdW1QYXJhbXMpOwogICB9CiAKICAgLy8gQ2hlY2sgd2hhdCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpbmZvcm1hdGlvbiB3ZSBzaG91bGQgYWN0dWFsbHkgc3RvcmUuCkBAIC0yODUsMTQgKzI4NSw2IEBACiAgICAgY2FzZSBUU1RfdW5zcGVjaWZpZWQ6CiAgICAgY2FzZSBUU1Rfdm9pZDoKICAgICBjYXNlIFRTVF93Y2hhcjoKLSAgICBjYXNlIFRTVF9pbWFnZTFkX3Q6Ci0gICAgY2FzZSBUU1RfaW1hZ2UxZF9hcnJheV90OgotICAgIGNhc2UgVFNUX2ltYWdlMWRfYnVmZmVyX3Q6Ci0gICAgY2FzZSBUU1RfaW1hZ2UyZF90OgotICAgIGNhc2UgVFNUX2ltYWdlMmRfYXJyYXlfdDoKLSAgICBjYXNlIFRTVF9pbWFnZTNkX3Q6Ci0gICAgY2FzZSBUU1Rfc2FtcGxlcl90OgotICAgIGNhc2UgVFNUX2V2ZW50X3Q6CiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBjYXNlIFRTVF9kZWNsdHlwZV9hdXRvOgpAQCAtNDI2LDEyICs0MTgsMTMgQEAKICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB0eXBlc3BlYyEiKTsKIH0KIAotY29uc3QgY2hhciAqRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoRGVjbFNwZWM6OlRTVCBUKSB7Citjb25zdCBjaGFyICpEZWNsU3BlYzo6Z2V0U3BlY2lmaWVyTmFtZShEZWNsU3BlYzo6VFNUIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSB7CiAgIHN3aXRjaCAoVCkgewogICBjYXNlIERlY2xTcGVjOjpUU1RfdW5zcGVjaWZpZWQ6IHJldHVybiAidW5zcGVjaWZpZWQiOwogICBjYXNlIERlY2xTcGVjOjpUU1Rfdm9pZDogICAgICAgIHJldHVybiAidm9pZCI7CiAgIGNhc2UgRGVjbFNwZWM6OlRTVF9jaGFyOiAgICAgICAgcmV0dXJuICJjaGFyIjsKLSAgY2FzZSBEZWNsU3BlYzo6VFNUX3djaGFyOiAgICAgICByZXR1cm4gIndjaGFyX3QiOworICBjYXNlIERlY2xTcGVjOjpUU1Rfd2NoYXI6ICAgICAgIHJldHVybiBQb2xpY3kuTVNXQ2hhciA/ICJfX3djaGFyX3QiIDogIndjaGFyX3QiOwogICBjYXNlIERlY2xTcGVjOjpUU1RfY2hhcjE2OiAgICAgIHJldHVybiAiY2hhcjE2X3QiOwogICBjYXNlIERlY2xTcGVjOjpUU1RfY2hhcjMyOiAgICAgIHJldHVybiAiY2hhcjMyX3QiOwogICBjYXNlIERlY2xTcGVjOjpUU1RfaW50OiAgICAgICAgIHJldHVybiAiaW50IjsKQEAgLTQzOSw3ICs0MzIsNyBAQAogICBjYXNlIERlY2xTcGVjOjpUU1RfaGFsZjogICAgICAgIHJldHVybiAiaGFsZiI7CiAgIGNhc2UgRGVjbFNwZWM6OlRTVF9mbG9hdDogICAgICAgcmV0dXJuICJmbG9hdCI7CiAgIGNhc2UgRGVjbFNwZWM6OlRTVF9kb3VibGU6ICAgICAgcmV0dXJuICJkb3VibGUiOwotICBjYXNlIERlY2xTcGVjOjpUU1RfYm9vbDogICAgICAgIHJldHVybiAiX0Jvb2wiOworICBjYXNlIERlY2xTcGVjOjpUU1RfYm9vbDogICAgICAgIHJldHVybiBQb2xpY3kuQm9vbCA/ICJib29sIiA6ICJfQm9vbCI7CiAgIGNhc2UgRGVjbFNwZWM6OlRTVF9kZWNpbWFsMzI6ICAgcmV0dXJuICJfRGVjaW1hbDMyIjsKICAgY2FzZSBEZWNsU3BlYzo6VFNUX2RlY2ltYWw2NDogICByZXR1cm4gIl9EZWNpbWFsNjQiOwogICBjYXNlIERlY2xTcGVjOjpUU1RfZGVjaW1hbDEyODogIHJldHVybiAiX0RlY2ltYWwxMjgiOwpAQCAtNDU3LDE0ICs0NTAsNiBAQAogICBjYXNlIERlY2xTcGVjOjpUU1RfdW5kZXJseWluZ1R5cGU6IHJldHVybiAiX191bmRlcmx5aW5nX3R5cGUiOwogICBjYXNlIERlY2xTcGVjOjpUU1RfdW5rbm93bl9hbnl0eXBlOiByZXR1cm4gIl9fdW5rbm93bl9hbnl0eXBlIjsKICAgY2FzZSBEZWNsU3BlYzo6VFNUX2F0b21pYzogcmV0dXJuICJfQXRvbWljIjsKLSAgY2FzZSBEZWNsU3BlYzo6VFNUX2ltYWdlMWRfdDogICByZXR1cm4gImltYWdlMWRfdCI7Ci0gIGNhc2UgRGVjbFNwZWM6OlRTVF9pbWFnZTFkX2FycmF5X3Q6IHJldHVybiAiaW1hZ2UxZF9hcnJheV90IjsKLSAgY2FzZSBEZWNsU3BlYzo6VFNUX2ltYWdlMWRfYnVmZmVyX3Q6IHJldHVybiAiaW1hZ2UxZF9idWZmZXJfdCI7Ci0gIGNhc2UgRGVjbFNwZWM6OlRTVF9pbWFnZTJkX3Q6ICAgcmV0dXJuICJpbWFnZTJkX3QiOwotICBjYXNlIERlY2xTcGVjOjpUU1RfaW1hZ2UyZF9hcnJheV90OiByZXR1cm4gImltYWdlMmRfYXJyYXlfdCI7Ci0gIGNhc2UgRGVjbFNwZWM6OlRTVF9pbWFnZTNkX3Q6ICAgcmV0dXJuICJpbWFnZTNkX3QiOwotICBjYXNlIERlY2xTcGVjOjpUU1Rfc2FtcGxlcl90OiAgIHJldHVybiAic2FtcGxlcl90IjsKLSAgY2FzZSBEZWNsU3BlYzo6VFNUX2V2ZW50X3Q6ICAgICByZXR1cm4gImV2ZW50X3QiOwogICBjYXNlIERlY2xTcGVjOjpUU1RfZXJyb3I6ICAgICAgIHJldHVybiAiKGVycm9yKSI7CiAgIH0KICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB0eXBlc3BlYyEiKTsKQEAgLTQ4Myw3ICs0NjgsOCBAQAogCiBib29sIERlY2xTcGVjOjpTZXRTdG9yYWdlQ2xhc3NTcGVjKFNlbWEgJlMsIFNDUyBTQywgU291cmNlTG9jYXRpb24gTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIComUHJldlNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgewogICAvLyBPcGVuQ0wgdjEuMSBzNi44ZzogIlRoZSBleHRlcm4sIHN0YXRpYywgYXV0byBhbmQgcmVnaXN0ZXIgc3RvcmFnZS1jbGFzcwogICAvLyBzcGVjaWZpZXJzIGFyZSBub3Qgc3VwcG9ydGVkLgogICAvLyBJdCBzZWVtcyBzZW5zaWJsZSB0byBwcm9oaWJpdCBwcml2YXRlX2V4dGVybiB0b28KQEAgLTUxOCwxMCArNTA0LDEwIEBACiAgICAgYm9vbCBpc0ludmFsaWQgPSB0cnVlOwogICAgIGlmIChUeXBlU3BlY1R5cGUgPT0gVFNUX3Vuc3BlY2lmaWVkICYmIFMuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMpIHsKICAgICAgIGlmIChTQyA9PSBTQ1NfYXV0bykKLSAgICAgICAgcmV0dXJuIFNldFR5cGVTcGVjVHlwZShUU1RfYXV0bywgTG9jLCBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICAgICAgcmV0dXJuIFNldFR5cGVTcGVjVHlwZShUU1RfYXV0bywgTG9jLCBQcmV2U3BlYywgRGlhZ0lELCBQb2xpY3kpOwogICAgICAgaWYgKFN0b3JhZ2VDbGFzc1NwZWMgPT0gU0NTX2F1dG8pIHsKICAgICAgICAgaXNJbnZhbGlkID0gU2V0VHlwZVNwZWNUeXBlKFRTVF9hdXRvLCBTdG9yYWdlQ2xhc3NTcGVjTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lELCBQb2xpY3kpOwogICAgICAgICBhc3NlcnQoIWlzSW52YWxpZCAmJiAiYXV0byBTQ1MgLT4gVFNUIHJlY292ZXJ5IGZhaWxlZCIpOwogICAgICAgfQogICAgIH0KQEAgLTU1Nyw3ICs1NDMsOCBAQAogLy8vIHNwZWNpZmllZCkuCiBib29sIERlY2xTcGVjOjpTZXRUeXBlU3BlY1dpZHRoKFRTVyBXLCBTb3VyY2VMb2NhdGlvbiBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSB7CiAgIC8vIE92ZXJ3cml0ZSBUU1dMb2Mgb25seSBpZiBUeXBlU3BlY1dpZHRoIHdhcyB1bnNwZWNpZmllZCwgc28gdGhhdAogICAvLyBmb3IgJ2xvbmcgbG9uZycgd2Ugd2lsbCBrZWVwIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGZpcnN0ICdsb25nJy4KICAgaWYgKFR5cGVTcGVjV2lkdGggPT0gVFNXX3Vuc3BlY2lmaWVkKQpAQCAtNTY4LDcgKzU1NSw3IEBACiAgIFR5cGVTcGVjV2lkdGggPSBXOwogICBpZiAoVHlwZUFsdGlWZWNWZWN0b3IgJiYgIVR5cGVBbHRpVmVjQm9vbCAmJgogICAgICAgKChUeXBlU3BlY1dpZHRoID09IFRTV19sb25nKSB8fCAoVHlwZVNwZWNXaWR0aCA9PSBUU1dfbG9uZ2xvbmcpKSkgewotICAgIFByZXZTcGVjID0gRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoKFRTVCkgVHlwZVNwZWNUeXBlKTsKKyAgICBQcmV2U3BlYyA9IERlY2xTcGVjOjpnZXRTcGVjaWZpZXJOYW1lKChUU1QpIFR5cGVTcGVjVHlwZSwgUG9saWN5KTsKICAgICBEaWFnSUQgPSBkaWFnOjp3YXJuX3ZlY3Rvcl9sb25nX2RlY2xfc3BlY19jb21iaW5hdGlvbjsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtNTk4LDE5ICs1ODUsMjEgQEAKIGJvb2wgRGVjbFNwZWM6OlNldFR5cGVTcGVjVHlwZShUU1QgVCwgU291cmNlTG9jYXRpb24gTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRGlhZ0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgUmVwKSB7Ci0gIHJldHVybiBTZXRUeXBlU3BlY1R5cGUoVCwgTG9jLCBMb2MsIFByZXZTcGVjLCBEaWFnSUQsIFJlcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBSZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgeworICByZXR1cm4gU2V0VHlwZVNwZWNUeXBlKFQsIExvYywgTG9jLCBQcmV2U3BlYywgRGlhZ0lELCBSZXAsIFBvbGljeSk7CiB9CiAKIGJvb2wgRGVjbFNwZWM6OlNldFR5cGVTcGVjVHlwZShUU1QgVCwgU291cmNlTG9jYXRpb24gVGFnS3dMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gVGFnTmFtZUxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIComUHJldlNwZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlIFJlcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgUmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIHsKICAgYXNzZXJ0KGlzVHlwZVJlcChUKSAmJiAiVCBkb2VzIG5vdCBzdG9yZSBhIHR5cGUiKTsKICAgYXNzZXJ0KFJlcCAmJiAibm8gdHlwZSBwcm92aWRlZCEiKTsKICAgaWYgKFR5cGVTcGVjVHlwZSAhPSBUU1RfdW5zcGVjaWZpZWQpIHsKLSAgICBQcmV2U3BlYyA9IERlY2xTcGVjOjpnZXRTcGVjaWZpZXJOYW1lKChUU1QpIFR5cGVTcGVjVHlwZSk7CisgICAgUHJldlNwZWMgPSBEZWNsU3BlYzo6Z2V0U3BlY2lmaWVyTmFtZSgoVFNUKSBUeXBlU3BlY1R5cGUsIFBvbGljeSk7CiAgICAgRGlhZ0lEID0gZGlhZzo6ZXJyX2ludmFsaWRfZGVjbF9zcGVjX2NvbWJpbmF0aW9uOwogICAgIHJldHVybiB0cnVlOwogICB9CkBAIC02MjUsMTEgKzYxNCwxMiBAQAogYm9vbCBEZWNsU3BlYzo6U2V0VHlwZVNwZWNUeXBlKFRTVCBULCBTb3VyY2VMb2NhdGlvbiBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqUmVwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqUmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIHsKICAgYXNzZXJ0KGlzRXhwclJlcChUKSAmJiAiVCBkb2VzIG5vdCBzdG9yZSBhbiBleHByIik7CiAgIGFzc2VydChSZXAgJiYgIm5vIGV4cHJlc3Npb24gcHJvdmlkZWQhIik7CiAgIGlmIChUeXBlU3BlY1R5cGUgIT0gVFNUX3Vuc3BlY2lmaWVkKSB7Ci0gICAgUHJldlNwZWMgPSBEZWNsU3BlYzo6Z2V0U3BlY2lmaWVyTmFtZSgoVFNUKSBUeXBlU3BlY1R5cGUpOworICAgIFByZXZTcGVjID0gRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoKFRTVCkgVHlwZVNwZWNUeXBlLCBQb2xpY3kpOwogICAgIERpYWdJRCA9IGRpYWc6OmVycl9pbnZhbGlkX2RlY2xfc3BlY19jb21iaW5hdGlvbjsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtNjQ0LDIwICs2MzQsMjIgQEAKIGJvb2wgRGVjbFNwZWM6OlNldFR5cGVTcGVjVHlwZShUU1QgVCwgU291cmNlTG9jYXRpb24gTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRGlhZ0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKlJlcCwgYm9vbCBPd25lZCkgewotICByZXR1cm4gU2V0VHlwZVNwZWNUeXBlKFQsIExvYywgTG9jLCBQcmV2U3BlYywgRGlhZ0lELCBSZXAsIE93bmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsICpSZXAsIGJvb2wgT3duZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgeworICByZXR1cm4gU2V0VHlwZVNwZWNUeXBlKFQsIExvYywgTG9jLCBQcmV2U3BlYywgRGlhZ0lELCBSZXAsIE93bmVkLCBQb2xpY3kpOwogfQogCiBib29sIERlY2xTcGVjOjpTZXRUeXBlU3BlY1R5cGUoVFNUIFQsIFNvdXJjZUxvY2F0aW9uIFRhZ0t3TG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRhZ05hbWVMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEaWFnSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbCAqUmVwLCBib29sIE93bmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbCAqUmVwLCBib29sIE93bmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIHsKICAgYXNzZXJ0KGlzRGVjbFJlcChUKSAmJiAiVCBkb2VzIG5vdCBzdG9yZSBhIGRlY2wiKTsKICAgLy8gVW5saWtlIHRoZSBvdGhlciBjYXNlcywgd2UgZG9uJ3QgYXNzZXJ0IHRoYXQgd2UgYWN0dWFsbHkgZ2V0IGEgZGVjbC4KIAogICBpZiAoVHlwZVNwZWNUeXBlICE9IFRTVF91bnNwZWNpZmllZCkgewotICAgIFByZXZTcGVjID0gRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoKFRTVCkgVHlwZVNwZWNUeXBlKTsKKyAgICBQcmV2U3BlYyA9IERlY2xTcGVjOjpnZXRTcGVjaWZpZXJOYW1lKChUU1QpIFR5cGVTcGVjVHlwZSwgUG9saWN5KTsKICAgICBEaWFnSUQgPSBkaWFnOjplcnJfaW52YWxpZF9kZWNsX3NwZWNfY29tYmluYXRpb247CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTY3MSwxMSArNjYzLDEyIEBACiAKIGJvb2wgRGVjbFNwZWM6OlNldFR5cGVTcGVjVHlwZShUU1QgVCwgU291cmNlTG9jYXRpb24gTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRGlhZ0lEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSB7CiAgIGFzc2VydCghaXNEZWNsUmVwKFQpICYmICFpc1R5cGVSZXAoVCkgJiYgIWlzRXhwclJlcChUKSAmJgogICAgICAgICAgInJlcCByZXF1aXJlZCBmb3IgdGhlc2UgdHlwZS1zcGVjIGtpbmRzISIpOwogICBpZiAoVHlwZVNwZWNUeXBlICE9IFRTVF91bnNwZWNpZmllZCkgewotICAgIFByZXZTcGVjID0gRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoKFRTVCkgVHlwZVNwZWNUeXBlKTsKKyAgICBQcmV2U3BlYyA9IERlY2xTcGVjOjpnZXRTcGVjaWZpZXJOYW1lKChUU1QpIFR5cGVTcGVjVHlwZSwgUG9saWN5KTsKICAgICBEaWFnSUQgPSBkaWFnOjplcnJfaW52YWxpZF9kZWNsX3NwZWNfY29tYmluYXRpb247CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTY4OCw3ICs2ODEsNyBAQAogICBUeXBlU3BlY1R5cGUgPSBUOwogICBUeXBlU3BlY093bmVkID0gZmFsc2U7CiAgIGlmIChUeXBlQWx0aVZlY1ZlY3RvciAmJiAhVHlwZUFsdGlWZWNCb29sICYmIChUeXBlU3BlY1R5cGUgPT0gVFNUX2RvdWJsZSkpIHsKLSAgICBQcmV2U3BlYyA9IERlY2xTcGVjOjpnZXRTcGVjaWZpZXJOYW1lKChUU1QpIFR5cGVTcGVjVHlwZSk7CisgICAgUHJldlNwZWMgPSBEZWNsU3BlYzo6Z2V0U3BlY2lmaWVyTmFtZSgoVFNUKSBUeXBlU3BlY1R5cGUsIFBvbGljeSk7CiAgICAgRGlhZ0lEID0gZGlhZzo6ZXJyX2ludmFsaWRfdmVjdG9yX2RlY2xfc3BlYzsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtNjk2LDkgKzY4OSwxMCBAQAogfQogCiBib29sIERlY2xTcGVjOjpTZXRUeXBlQWx0aVZlY1ZlY3Rvcihib29sIGlzQWx0aVZlY1ZlY3RvciwgU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIComUHJldlNwZWMsIHVuc2lnbmVkICZEaWFnSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLCB1bnNpZ25lZCAmRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSB7CiAgIGlmIChUeXBlU3BlY1R5cGUgIT0gVFNUX3Vuc3BlY2lmaWVkKSB7Ci0gICAgUHJldlNwZWMgPSBEZWNsU3BlYzo6Z2V0U3BlY2lmaWVyTmFtZSgoVFNUKSBUeXBlU3BlY1R5cGUpOworICAgIFByZXZTcGVjID0gRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoKFRTVCkgVHlwZVNwZWNUeXBlLCBQb2xpY3kpOwogICAgIERpYWdJRCA9IGRpYWc6OmVycl9pbnZhbGlkX3ZlY3Rvcl9kZWNsX3NwZWNfY29tYmluYXRpb247CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTcwOCwxMCArNzAyLDExIEBACiB9CiAKIGJvb2wgRGVjbFNwZWM6OlNldFR5cGVBbHRpVmVjUGl4ZWwoYm9vbCBpc0FsdGlWZWNQaXhlbCwgU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIComUHJldlNwZWMsIHVuc2lnbmVkICZEaWFnSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqJlByZXZTcGVjLCB1bnNpZ25lZCAmRGlhZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSB7CiAgIGlmICghVHlwZUFsdGlWZWNWZWN0b3IgfHwgVHlwZUFsdGlWZWNQaXhlbCB8fAogICAgICAgKFR5cGVTcGVjVHlwZSAhPSBUU1RfdW5zcGVjaWZpZWQpKSB7Ci0gICAgUHJldlNwZWMgPSBEZWNsU3BlYzo6Z2V0U3BlY2lmaWVyTmFtZSgoVFNUKSBUeXBlU3BlY1R5cGUpOworICAgIFByZXZTcGVjID0gRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoKFRTVCkgVHlwZVNwZWNUeXBlLCBQb2xpY3kpOwogICAgIERpYWdJRCA9IGRpYWc6OmVycl9pbnZhbGlkX3BpeGVsX2RlY2xfc3BlY19jb21iaW5hdGlvbjsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtNzIyLDEwICs3MTcsMTEgQEAKIH0KIAogYm9vbCBEZWNsU3BlYzo6U2V0VHlwZUFsdGlWZWNCb29sKGJvb2wgaXNBbHRpVmVjQm9vbCwgU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIComUHJldlNwZWMsIHVuc2lnbmVkICZEaWFnSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIComUHJldlNwZWMsIHVuc2lnbmVkICZEaWFnSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJpbnRpbmdQb2xpY3kgJlBvbGljeSkgewogICBpZiAoIVR5cGVBbHRpVmVjVmVjdG9yIHx8IFR5cGVBbHRpVmVjQm9vbCB8fAogICAgICAgKFR5cGVTcGVjVHlwZSAhPSBUU1RfdW5zcGVjaWZpZWQpKSB7Ci0gICAgUHJldlNwZWMgPSBEZWNsU3BlYzo6Z2V0U3BlY2lmaWVyTmFtZSgoVFNUKSBUeXBlU3BlY1R5cGUpOworICAgIFByZXZTcGVjID0gRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoKFRTVCkgVHlwZVNwZWNUeXBlLCBQb2xpY3kpOwogICAgIERpYWdJRCA9IGRpYWc6OmVycl9pbnZhbGlkX3ZlY3Rvcl9ib29sX2RlY2xfc3BlYzsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtODQzLDcgKzgzOSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRGlhZ0lEKSB7CiAgIGlmIChGcmllbmRfc3BlY2lmaWVkKSB7CiAgICAgUHJldlNwZWMgPSAiZnJpZW5kIjsKLSAgICBEaWFnSUQgPSBkaWFnOjpleHRfZHVwbGljYXRlX2RlY2xzcGVjOworICAgIC8vIEtlZXAgdGhlIGxhdGVyIGxvY2F0aW9uLCBzbyB0aGF0IHdlIGNhbiBsYXRlciBkaWFnbm9zZSBpbGwtZm9ybWVkCisgICAgLy8gZGVjbGFyYXRpb25zIGxpa2UgJ2ZyaWVuZCBjbGFzcyBYIGZyaWVuZDsnLiBQZXIgW2NsYXNzLmZyaWVuZF1wMywKKyAgICAvLyAnZnJpZW5kJyBtdXN0IGJlIHRoZSBmaXJzdCB0b2tlbiBpbiBhIGZyaWVuZCBkZWNsYXJhdGlvbiB0aGF0IGlzCisgICAgLy8gbm90IGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisgICAgRnJpZW5kTG9jID0gTG9jOworICAgIERpYWdJRCA9IGRpYWc6Ondhcm5fZHVwbGljYXRlX2RlY2xzcGVjOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTg2Niw3ICs4NjcsMTMgQEAKIAogYm9vbCBEZWNsU3BlYzo6U2V0Q29uc3RleHByU3BlYyhTb3VyY2VMb2NhdGlvbiBMb2MsIGNvbnN0IGNoYXIgKiZQcmV2U3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkRpYWdJRCkgewotICAvLyAnY29uc3RleHByIGNvbnN0ZXhwcicgaXMgb2suCisgIC8vICdjb25zdGV4cHIgY29uc3RleHByJyBpcyBvaywgYnV0IHdhcm4gYXMgdGhpcyBpcyBsaWtlbHkgbm90IHdoYXQgdGhlIHVzZXIKKyAgLy8gaW50ZW5kZWQuCisgIGlmIChDb25zdGV4cHJfc3BlY2lmaWVkKSB7CisgICAgRGlhZ0lEID0gZGlhZzo6d2Fybl9kdXBsaWNhdGVfZGVjbHNwZWM7CisgICAgUHJldlNwZWMgPSAiY29uc3RleHByIjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQogICBDb25zdGV4cHJfc3BlY2lmaWVkID0gdHJ1ZTsKICAgQ29uc3RleHByTG9jID0gTG9jOwogICByZXR1cm4gZmFsc2U7CkBAIC05MDYsNyArOTEzLDcgQEAKIC8vLyAiX0ltYWdpbmFyeSIgKGxhY2tpbmcgYW4gRlAgdHlwZSkuICBUaGlzIHJldHVybnMgYSBkaWFnbm9zdGljIHRvIGlzc3VlIG9yCiAvLy8gZGlhZzo6TlVNX0RJQUdOT1NUSUNTIGlmIHRoZXJlIGlzIG5vIGVycm9yLiAgQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwKIC8vLyBEZWNsU3BlYyBpcyBndWFyYW50ZWVkIHNlbGYtY29uc2lzdGVudCwgZXZlbiBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLXZvaWQgRGVjbFNwZWM6OkZpbmlzaChEaWFnbm9zdGljc0VuZ2luZSAmRCwgUHJlcHJvY2Vzc29yICZQUCkgewordm9pZCBEZWNsU3BlYzo6RmluaXNoKERpYWdub3N0aWNzRW5naW5lICZELCBQcmVwcm9jZXNzb3IgJlBQLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSB7CiAgIC8vIEJlZm9yZSBwb3NzaWJseSBjaGFuZ2luZyB0aGVpciB2YWx1ZXMsIHNhdmUgc3BlY3MgYXMgd3JpdHRlbi4KICAgU2F2ZVdyaXR0ZW5CdWlsdGluU3BlY3MoKTsKIApAQCAtOTU5LDcgKzk2Niw3IEBACiAgICAgICAgICAgIChUeXBlU3BlY1R5cGUgIT0gVFNUX2ludCkpIHx8IFR5cGVBbHRpVmVjUGl4ZWwpIHsKICAgICAgICAgRGlhZyhELCBUU1RMb2MsIGRpYWc6OmVycl9pbnZhbGlkX3ZlY3Rvcl9ib29sX2RlY2xfc3BlYykKICAgICAgICAgICA8PCAoVHlwZUFsdGlWZWNQaXhlbCA/ICJfX3BpeGVsIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTcGVjaWZpZXJOYW1lKChUU1QpVHlwZVNwZWNUeXBlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTcGVjaWZpZXJOYW1lKChUU1QpVHlwZVNwZWNUeXBlLCBQb2xpY3kpKTsKICAgICAgIH0KIAogICAgICAgLy8gT25seSAnc2hvcnQnIGlzIHZhbGlkIHdpdGggdmVjdG9yIGJvb2wuIChQSU0gMi4xKQpAQCAtOTg5LDcgKzk5Niw3IEBACiAgICAgZWxzZSBpZiAoVHlwZVNwZWNUeXBlICE9IFRTVF9pbnQgICYmIFR5cGVTcGVjVHlwZSAhPSBUU1RfaW50MTI4ICYmCiAgICAgICAgICAgICAgVHlwZVNwZWNUeXBlICE9IFRTVF9jaGFyICYmIFR5cGVTcGVjVHlwZSAhPSBUU1Rfd2NoYXIpIHsKICAgICAgIERpYWcoRCwgVFNTTG9jLCBkaWFnOjplcnJfaW52YWxpZF9zaWduX3NwZWMpCi0gICAgICAgIDw8IGdldFNwZWNpZmllck5hbWUoKFRTVClUeXBlU3BlY1R5cGUpOworICAgICAgICA8PCBnZXRTcGVjaWZpZXJOYW1lKChUU1QpVHlwZVNwZWNUeXBlLCBQb2xpY3kpOwogICAgICAgLy8gc2lnbmVkIGRvdWJsZSAtPiBkb3VibGUuCiAgICAgICBUeXBlU3BlY1NpZ24gPSBUU1NfdW5zcGVjaWZpZWQ7CiAgICAgfQpAQCAtMTAwNiw3ICsxMDEzLDcgQEAKICAgICAgIERpYWcoRCwgVFNXTG9jLAogICAgICAgICAgICBUeXBlU3BlY1dpZHRoID09IFRTV19zaG9ydCA/IGRpYWc6OmVycl9pbnZhbGlkX3Nob3J0X3NwZWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjplcnJfaW52YWxpZF9sb25nbG9uZ19zcGVjKQotICAgICAgICA8PCAgZ2V0U3BlY2lmaWVyTmFtZSgoVFNUKVR5cGVTcGVjVHlwZSk7CisgICAgICAgIDw8ICBnZXRTcGVjaWZpZXJOYW1lKChUU1QpVHlwZVNwZWNUeXBlLCBQb2xpY3kpOwogICAgICAgVHlwZVNwZWNUeXBlID0gVFNUX2ludDsKICAgICAgIFR5cGVTcGVjT3duZWQgPSBmYWxzZTsKICAgICB9CkBAIC0xMDE2LDcgKzEwMjMsNyBAQAogICAgICAgVHlwZVNwZWNUeXBlID0gVFNUX2ludDsgIC8vIGxvbmcgLT4gbG9uZyBpbnQuCiAgICAgZWxzZSBpZiAoVHlwZVNwZWNUeXBlICE9IFRTVF9pbnQgJiYgVHlwZVNwZWNUeXBlICE9IFRTVF9kb3VibGUpIHsKICAgICAgIERpYWcoRCwgVFNXTG9jLCBkaWFnOjplcnJfaW52YWxpZF9sb25nX3NwZWMpCi0gICAgICAgIDw8IGdldFNwZWNpZmllck5hbWUoKFRTVClUeXBlU3BlY1R5cGUpOworICAgICAgICA8PCBnZXRTcGVjaWZpZXJOYW1lKChUU1QpVHlwZVNwZWNUeXBlLCBQb2xpY3kpOwogICAgICAgVHlwZVNwZWNUeXBlID0gVFNUX2ludDsKICAgICAgIFR5cGVTcGVjT3duZWQgPSBmYWxzZTsKICAgICB9CkBAIC0xMDM4LDcgKzEwNDUsNyBAQAogICAgICAgICBEaWFnKEQsIFRTVExvYywgZGlhZzo6ZXh0X2ludGVnZXJfY29tcGxleCk7CiAgICAgfSBlbHNlIGlmIChUeXBlU3BlY1R5cGUgIT0gVFNUX2Zsb2F0ICYmIFR5cGVTcGVjVHlwZSAhPSBUU1RfZG91YmxlKSB7CiAgICAgICBEaWFnKEQsIFRTQ0xvYywgZGlhZzo6ZXJyX2ludmFsaWRfY29tcGxleF9zcGVjKQotICAgICAgICA8PCBnZXRTcGVjaWZpZXJOYW1lKChUU1QpVHlwZVNwZWNUeXBlKTsKKyAgICAgICAgPDwgZ2V0U3BlY2lmaWVyTmFtZSgoVFNUKVR5cGVTcGVjVHlwZSwgUG9saWN5KTsKICAgICAgIFR5cGVTcGVjQ29tcGxleCA9IFRTQ191bnNwZWNpZmllZDsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9TZW1hL0RlbGF5ZWREaWFnbm9zdGljLmNwcCBiL2xpYi9TZW1hL0RlbGF5ZWREaWFnbm9zdGljLmNwcAppbmRleCAzMTAwNDMyLi41MzNiN2VmIDEwMDY0NAotLS0gYS9saWIvU2VtYS9EZWxheWVkRGlhZ25vc3RpYy5jcHAKKysrIGIvbGliL1NlbWEvRGVsYXllZERpYWdub3N0aWMuY3BwCkBAIC0xOSwxMyArMTksMjIgQEAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIHVzaW5nIG5hbWVzcGFjZSBzZW1hOwogCi1EZWxheWVkRGlhZ25vc3RpYyBEZWxheWVkRGlhZ25vc3RpYzo6bWFrZURlcHJlY2F0aW9uKFNvdXJjZUxvY2F0aW9uIExvYywKK0RlbGF5ZWREaWFnbm9zdGljCitEZWxheWVkRGlhZ25vc3RpYzo6bWFrZUF2YWlsYWJpbGl0eShTZW1hOjpBdmFpbGFiaWxpdHlEaWFnbm9zdGljIEFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZWREZWNsICpELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKlVua25vd25PYmpDQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICAqT2JqQ1Byb3BlcnR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1zZykgewogICBEZWxheWVkRGlhZ25vc3RpYyBERDsKLSAgREQuS2luZCA9IERlcHJlY2F0aW9uOworICBzd2l0Y2ggKEFEKSB7CisgICAgY2FzZSBTZW1hOjpBRF9EZXByZWNhdGlvbjoKKyAgICAgIERELktpbmQgPSBEZXByZWNhdGlvbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU2VtYTo6QURfVW5hdmFpbGFibGU6CisgICAgICBERC5LaW5kID0gVW5hdmFpbGFibGU7CisgICAgICBicmVhazsKKyAgfQogICBERC5UcmlnZ2VyZWQgPSBmYWxzZTsKICAgREQuTG9jID0gTG9jOwogICBERC5EZXByZWNhdGlvbkRhdGEuRGVjbCA9IEQ7CmRpZmYgLS1naXQgYS9saWIvU2VtYS9JZGVudGlmaWVyUmVzb2x2ZXIuY3BwIGIvbGliL1NlbWEvSWRlbnRpZmllclJlc29sdmVyLmNwcAppbmRleCA2ZTM1NGI5Li43MDVmYjA3IDEwMDY0NAotLS0gYS9saWIvU2VtYS9JZGVudGlmaWVyUmVzb2x2ZXIuY3BwCisrKyBiL2xpYi9TZW1hL0lkZW50aWZpZXJSZXNvbHZlci5jcHAKQEAgLTk1LDcgKzk1LDcgQEAKIC8vLyBpZiAnRCcgaXMgaW4gU2NvcGUgJ1MnLCBvdGhlcndpc2UgJ1MnIGlzIGlnbm9yZWQgYW5kIGlzRGVjbEluU2NvcGUgcmV0dXJucwogLy8vIHRydWUgaWYgJ0QnIGJlbG9uZ3MgdG8gdGhlIGdpdmVuIGRlY2xhcmF0aW9uIGNvbnRleHQuCiBib29sIElkZW50aWZpZXJSZXNvbHZlcjo6aXNEZWNsSW5TY29wZShEZWNsICpELCBEZWNsQ29udGV4dCAqQ3R4LCBTY29wZSAqUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBsaWNpdEluc3RhbnRpYXRpb25PclNwZWNpYWxpemF0aW9uKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93SW5saW5lTmFtZXNwYWNlKSBjb25zdCB7CiAgIEN0eCA9IEN0eC0+Z2V0UmVkZWNsQ29udGV4dCgpOwogCiAgIGlmIChDdHgtPmlzRnVuY3Rpb25Pck1ldGhvZCgpIHx8IFMtPmlzRnVuY3Rpb25Qcm90b3R5cGVTY29wZSgpKSB7CkBAIC0xMzEsOSArMTMxLDggQEAKICAgfQogCiAgIERlY2xDb250ZXh0ICpEQ3R4ID0gRC0+Z2V0RGVjbENvbnRleHQoKS0+Z2V0UmVkZWNsQ29udGV4dCgpOwotICByZXR1cm4gRXhwbGljaXRJbnN0YW50aWF0aW9uT3JTcGVjaWFsaXphdGlvbgotICAgICAgICAgICA/IEN0eC0+SW5FbmNsb3NpbmdOYW1lc3BhY2VTZXRPZihEQ3R4KQotICAgICAgICAgICA6IEN0eC0+RXF1YWxzKERDdHgpOworICByZXR1cm4gQWxsb3dJbmxpbmVOYW1lc3BhY2UgPyBDdHgtPkluRW5jbG9zaW5nTmFtZXNwYWNlU2V0T2YoREN0eCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ3R4LT5FcXVhbHMoREN0eCk7CiB9CiAKIC8vLyBBZGREZWNsIC0gTGluayB0aGUgZGVjbCB0byBpdHMgc2hhZG93ZWQgZGVjbCBjaGFpbi4KQEAgLTI3NCwxMCArMjczLDggQEAKIAogICAgIC8vIElmIHRoZSBleGlzdGluZyBkZWNsYXJhdGlvbiBpcyBzb21ld2hlcmUgaW4gdGhlIHByZXZpb3VzIGRlY2xhcmF0aW9uCiAgICAgLy8gY2hhaW4gb2YgdGhlIG5ldyBkZWNsYXJhdGlvbiwgdGhlbiBwcmVmZXIgdGhlIG5ldyBkZWNsYXJhdGlvbi4KLSAgICBmb3IgKERlY2w6OnJlZGVjbF9pdGVyYXRvciBSRCA9IE5ldy0+cmVkZWNsc19iZWdpbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSREVuZCA9IE5ldy0+cmVkZWNsc19lbmQoKTsKLSAgICAgICAgIFJEICE9IFJERW5kOyArK1JEKSB7Ci0gICAgICBpZiAoKlJEID09IEV4aXN0aW5nKQorICAgIGZvciAoYXV0byBSRCA6IE5ldy0+cmVkZWNscygpKSB7CisgICAgICBpZiAoUkQgPT0gRXhpc3RpbmcpCiAgICAgICAgIHJldHVybiBETUtfUmVwbGFjZTsKICAgICAgICAgCiAgICAgICBpZiAoUkQtPmlzQ2Fub25pY2FsRGVjbCgpKQpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvSnVtcERpYWdub3N0aWNzLmNwcCBiL2xpYi9TZW1hL0p1bXBEaWFnbm9zdGljcy5jcHAKaW5kZXggZDNkZTE3My4uMWY1ZDY4MiAxMDA2NDQKLS0tIGEvbGliL1NlbWEvSnVtcERpYWdub3N0aWNzLmNwcAorKysgYi9saWIvU2VtYS9KdW1wRGlhZ25vc3RpY3MuY3BwCkBAIC0xMjEsOSArMTIxLDExIEBACiAKIC8vLyBHZXREaWFnRm9yR290b1Njb3BlRGVjbCAtIElmIHRoaXMgZGVjbCBpbmR1Y2VzIGEgbmV3IGdvdG8gc2NvcGUsIHJldHVybiBhCiAvLy8gZGlhZ25vc3RpYyB0aGF0IHNob3VsZCBiZSBlbWl0dGVkIGlmIGNvbnRyb2wgZ29lcyBvdmVyIGl0LiBJZiBub3QsIHJldHVybiAwLgotc3RhdGljIFNjb3BlUGFpciBHZXREaWFnRm9yR290b1Njb3BlRGVjbChBU1RDb250ZXh0ICZDb250ZXh0LCBjb25zdCBEZWNsICpEKSB7CitzdGF0aWMgU2NvcGVQYWlyIEdldERpYWdGb3JHb3RvU2NvcGVEZWNsKFNlbWEgJlMsIGNvbnN0IERlY2wgKkQpIHsKICAgaWYgKGNvbnN0IFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oRCkpIHsKICAgICB1bnNpZ25lZCBJbkRpYWcgPSAwOworICAgIHVuc2lnbmVkIE91dERpYWcgPSAwOworCiAgICAgaWYgKFZELT5nZXRUeXBlKCktPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSkKICAgICAgIEluRGlhZyA9IGRpYWc6Om5vdGVfcHJvdGVjdGVkX2J5X3ZsYTsKIApAQCAtMTM1LDIxICsxMzcsMjQgQEAKICAgICAgIHJldHVybiBTY29wZVBhaXIoZGlhZzo6bm90ZV9wcm90ZWN0ZWRfYnlfY2xlYW51cCwKICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6bm90ZV9leGl0c19jbGVhbnVwKTsKIAotICAgIGlmIChDb250ZXh0LmdldExhbmdPcHRzKCkuT2JqQ0F1dG9SZWZDb3VudCAmJiBWRC0+aGFzTG9jYWxTdG9yYWdlKCkpIHsKLSAgICAgIHN3aXRjaCAoVkQtPmdldFR5cGUoKS5nZXRPYmpDTGlmZXRpbWUoKSkgewotICAgICAgY2FzZSBRdWFsaWZpZXJzOjpPQ0xfTm9uZToKLSAgICAgIGNhc2UgUXVhbGlmaWVyczo6T0NMX0V4cGxpY2l0Tm9uZToKLSAgICAgIGNhc2UgUXVhbGlmaWVyczo6T0NMX0F1dG9yZWxlYXNpbmc6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFF1YWxpZmllcnM6Ok9DTF9TdHJvbmc6Ci0gICAgICBjYXNlIFF1YWxpZmllcnM6Ok9DTF9XZWFrOgorICAgIGlmIChWRC0+aGFzTG9jYWxTdG9yYWdlKCkpIHsKKyAgICAgIHN3aXRjaCAoVkQtPmdldFR5cGUoKS5pc0Rlc3RydWN0ZWRUeXBlKCkpIHsKKyAgICAgIGNhc2UgUXVhbFR5cGU6OkRLX29iamNfc3Ryb25nX2xpZmV0aW1lOgorICAgICAgY2FzZSBRdWFsVHlwZTo6REtfb2JqY193ZWFrX2xpZmV0aW1lOgogICAgICAgICByZXR1cm4gU2NvcGVQYWlyKGRpYWc6Om5vdGVfcHJvdGVjdGVkX2J5X29iamNfb3duZXJzaGlwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6Om5vdGVfZXhpdHNfb2JqY19vd25lcnNoaXApOworCisgICAgICBjYXNlIFF1YWxUeXBlOjpES19jeHhfZGVzdHJ1Y3RvcjoKKyAgICAgICAgT3V0RGlhZyA9IGRpYWc6Om5vdGVfZXhpdHNfZHRvcjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUXVhbFR5cGU6OkRLX25vbmU6CisgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KIAotICAgIGlmIChDb250ZXh0LmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmIFZELT5oYXNMb2NhbFN0b3JhZ2UoKSkgeworICAgIGNvbnN0IEV4cHIgKkluaXQgPSBWRC0+Z2V0SW5pdCgpOworICAgIGlmIChTLkNvbnRleHQuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMgJiYgVkQtPmhhc0xvY2FsU3RvcmFnZSgpICYmIEluaXQpIHsKICAgICAgIC8vIEMrKzExIFtzdG10LmRjbF1wMzoKICAgICAgIC8vICAgQSBwcm9ncmFtIHRoYXQganVtcHMgZnJvbSBhIHBvaW50IHdoZXJlIGEgdmFyaWFibGUgd2l0aCBhdXRvbWF0aWMKICAgICAgIC8vICAgc3RvcmFnZSBkdXJhdGlvbiBpcyBub3QgaW4gc2NvcGUgdG8gYSBwb2ludCB3aGVyZSBpdCBpcyBpbiBzY29wZQpAQCAtMTY0LDY4ICsxNjksMzQgQEAKICAgICAgIC8vICAgd2hlcmUgaXQgaXMgaW4gc2NvcGUgaXMgaWxsLWZvcm1lZCB1bmxlc3MgdGhlIHZhcmlhYmxlIGhhcwogICAgICAgLy8gICBQT0QgdHlwZSBhbmQgaXMgZGVjbGFyZWQgd2l0aG91dCBhbiBpbml0aWFsaXplci4KIAotICAgICAgY29uc3QgRXhwciAqSW5pdCA9IFZELT5nZXRJbml0KCk7Ci0gICAgICBpZiAoIUluaXQpCi0gICAgICAgIHJldHVybiBTY29wZVBhaXIoSW5EaWFnLCAwKTsKKyAgICAgIEluRGlhZyA9IGRpYWc6Om5vdGVfcHJvdGVjdGVkX2J5X3ZhcmlhYmxlX2luaXQ7CiAKLSAgICAgIGNvbnN0IEV4cHJXaXRoQ2xlYW51cHMgKkVXQyA9IGR5bl9jYXN0PEV4cHJXaXRoQ2xlYW51cHM+KEluaXQpOwotICAgICAgaWYgKEVXQykKLSAgICAgICAgSW5pdCA9IEVXQy0+Z2V0U3ViRXhwcigpOwotCi0gICAgICBjb25zdCBNYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHIgKk0gPSBOVUxMOwotICAgICAgSW5pdCA9IEluaXQtPmZpbmRNYXRlcmlhbGl6ZWRUZW1wb3JhcnkoTSk7Ci0KLSAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IEV4cHIgKiwgMj4gQ29tbWFMSFNzOwotICAgICAgU21hbGxWZWN0b3I8U3Vib2JqZWN0QWRqdXN0bWVudCwgMj4gQWRqdXN0bWVudHM7Ci0gICAgICBJbml0ID0gSW5pdC0+c2tpcFJWYWx1ZVN1Ym9iamVjdEFkanVzdG1lbnRzKENvbW1hTEhTcywgQWRqdXN0bWVudHMpOwotCi0gICAgICBRdWFsVHlwZSBRVCA9IEluaXQtPmdldFR5cGUoKTsKLSAgICAgIGlmIChRVC5pc051bGwoKSkKLSAgICAgICAgcmV0dXJuIFNjb3BlUGFpcihkaWFnOjpub3RlX3Byb3RlY3RlZF9ieV92YXJpYWJsZV9pbml0LCAwKTsKLQotICAgICAgY29uc3QgVHlwZSAqVCA9IFFULmdldFR5cGVQdHIoKTsKLSAgICAgIGlmIChULT5pc0FycmF5VHlwZSgpKQotICAgICAgICBUID0gVC0+Z2V0QmFzZUVsZW1lbnRUeXBlVW5zYWZlKCk7Ci0KLSAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJlY29yZCA9IFQtPmdldEFzQ1hYUmVjb3JkRGVjbCgpOwotICAgICAgaWYgKCFSZWNvcmQpCi0gICAgICAgIHJldHVybiBTY29wZVBhaXIoZGlhZzo6bm90ZV9wcm90ZWN0ZWRfYnlfdmFyaWFibGVfaW5pdCwgMCk7Ci0KLSAgICAgIC8vIElmIHdlIG5lZWQgdG8gY2FsbCBhIG5vbiB0cml2aWFsIGRlc3RydWN0b3IgZm9yIHRoaXMgdmFyaWFibGUsCi0gICAgICAvLyByZWNvcmQgYW4gb3V0IGRpYWdub3N0aWMuCi0gICAgICB1bnNpZ25lZCBPdXREaWFnID0gMDsKLSAgICAgIGlmICghSW5pdC0+aXNHTFZhbHVlKCkgJiYgIVJlY29yZC0+aGFzVHJpdmlhbERlc3RydWN0b3IoKSkKLSAgICAgICAgT3V0RGlhZyA9IGRpYWc6Om5vdGVfZXhpdHNfZHRvcjsKLQotICAgICAgaWYgKGNvbnN0IENYWENvbnN0cnVjdEV4cHIgKmNjZSA9IGR5bl9jYXN0PENYWENvbnN0cnVjdEV4cHI+KEluaXQpKSB7Ci0gICAgICAgIGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqY3RvciA9IGNjZS0+Z2V0Q29uc3RydWN0b3IoKTsKLSAgICAgICAgLy8gRm9yIGEgdmFyaWFibGUgZGVjbGFyZWQgd2l0aG91dCBhbiBpbml0aWFsaXplciwgd2Ugd2lsbCBoYXZlCi0gICAgICAgIC8vIGNhbGwtc3R5bGUgaW5pdGlhbGl6YXRpb24gYW5kIHRoZSBpbml0aWFsaXplciB3aWxsIGJlIHRoZQotICAgICAgICAvLyBDWFhDb25zdHJ1Y3RFeHByIHdpdGggbm8gaW50ZXJ2ZW5pbmcgbm9kZXMuCi0gICAgICAgIGlmIChjdG9yLT5pc1RyaXZpYWwoKSAmJiBjdG9yLT5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpICYmCi0gICAgICAgICAgICBWRC0+Z2V0SW5pdCgpID09IEluaXQgJiYgVkQtPmdldEluaXRTdHlsZSgpID09IFZhckRlY2w6OkNhbGxJbml0KSB7CisgICAgICAvLyBGb3IgYSB2YXJpYWJsZSBvZiAoYXJyYXkgb2YpIGNsYXNzIHR5cGUgZGVjbGFyZWQgd2l0aG91dCBhbgorICAgICAgLy8gaW5pdGlhbGl6ZXIsIHdlIHdpbGwgaGF2ZSBjYWxsLXN0eWxlIGluaXRpYWxpemF0aW9uIGFuZCB0aGUgaW5pdGlhbGl6ZXIKKyAgICAgIC8vIHdpbGwgYmUgdGhlIENYWENvbnN0cnVjdEV4cHIgd2l0aCBubyBpbnRlcnZlbmluZyBub2Rlcy4KKyAgICAgIGlmIChjb25zdCBDWFhDb25zdHJ1Y3RFeHByICpDQ0UgPSBkeW5fY2FzdDxDWFhDb25zdHJ1Y3RFeHByPihJbml0KSkgeworICAgICAgICBjb25zdCBDWFhDb25zdHJ1Y3RvckRlY2wgKkN0b3IgPSBDQ0UtPmdldENvbnN0cnVjdG9yKCk7CisgICAgICAgIGlmIChDdG9yLT5pc1RyaXZpYWwoKSAmJiBDdG9yLT5pc0RlZmF1bHRDb25zdHJ1Y3RvcigpICYmCisgICAgICAgICAgICBWRC0+Z2V0SW5pdFN0eWxlKCkgPT0gVmFyRGVjbDo6Q2FsbEluaXQpIHsKICAgICAgICAgICBpZiAoT3V0RGlhZykKICAgICAgICAgICAgIEluRGlhZyA9IGRpYWc6Om5vdGVfcHJvdGVjdGVkX2J5X3ZhcmlhYmxlX25vbnRyaXZfZGVzdHJ1Y3RvcjsKLSAgICAgICAgICBlbHNlIGlmICghUmVjb3JkLT5pc1BPRCgpKQorICAgICAgICAgIGVsc2UgaWYgKCFDdG9yLT5nZXRQYXJlbnQoKS0+aXNQT0QoKSkKICAgICAgICAgICAgIEluRGlhZyA9IGRpYWc6Om5vdGVfcHJvdGVjdGVkX2J5X3ZhcmlhYmxlX25vbl9wb2Q7Ci0gICAgICAgICAgcmV0dXJuIFNjb3BlUGFpcihJbkRpYWcsIE91dERpYWcpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEluRGlhZyA9IDA7CiAgICAgICAgIH0KICAgICAgIH0KLQotICAgICAgcmV0dXJuIFNjb3BlUGFpcihkaWFnOjpub3RlX3Byb3RlY3RlZF9ieV92YXJpYWJsZV9pbml0LCBPdXREaWFnKTsKICAgICB9CiAKLSAgICByZXR1cm4gU2NvcGVQYWlyKEluRGlhZywgMCk7CisgICAgcmV0dXJuIFNjb3BlUGFpcihJbkRpYWcsIE91dERpYWcpOwogICB9CiAKLSAgaWYgKGNvbnN0IFR5cGVkZWZEZWNsICpURCA9IGR5bl9jYXN0PFR5cGVkZWZEZWNsPihEKSkgeworICBpZiAoY29uc3QgVHlwZWRlZk5hbWVEZWNsICpURCA9IGR5bl9jYXN0PFR5cGVkZWZOYW1lRGVjbD4oRCkpIHsKICAgICBpZiAoVEQtPmdldFVuZGVybHlpbmdUeXBlKCktPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSkKLSAgICAgIHJldHVybiBTY29wZVBhaXIoZGlhZzo6bm90ZV9wcm90ZWN0ZWRfYnlfdmxhX3R5cGVkZWYsIDApOwotICB9Ci0KLSAgaWYgKGNvbnN0IFR5cGVBbGlhc0RlY2wgKlREID0gZHluX2Nhc3Q8VHlwZUFsaWFzRGVjbD4oRCkpIHsKLSAgICBpZiAoVEQtPmdldFVuZGVybHlpbmdUeXBlKCktPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSkKLSAgICAgIHJldHVybiBTY29wZVBhaXIoZGlhZzo6bm90ZV9wcm90ZWN0ZWRfYnlfdmxhX3R5cGVfYWxpYXMsIDApOworICAgICAgcmV0dXJuIFNjb3BlUGFpcihpc2E8VHlwZWRlZkRlY2w+KFREKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkaWFnOjpub3RlX3Byb3RlY3RlZF9ieV92bGFfdHlwZWRlZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjpub3RlX3Byb3RlY3RlZF9ieV92bGFfdHlwZV9hbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAgIH0KIAogICByZXR1cm4gU2NvcGVQYWlyKDBVLCAwVSk7CkBAIC0yMzQsNyArMjA1LDcgQEAKIC8vLyBcYnJpZWYgQnVpbGQgc2NvcGUgaW5mb3JtYXRpb24gZm9yIGEgZGVjbGFyYXRpb24gdGhhdCBpcyBwYXJ0IG9mIGEgRGVjbFN0bXQuCiB2b2lkIEp1bXBTY29wZUNoZWNrZXI6OkJ1aWxkU2NvcGVJbmZvcm1hdGlvbihEZWNsICpELCB1bnNpZ25lZCAmUGFyZW50U2NvcGUpIHsKICAgLy8gSWYgdGhpcyBkZWNsIGNhdXNlcyBhIG5ldyBzY29wZSwgcHVzaCBhbmQgc3dpdGNoIHRvIGl0LgotICBzdGQ6OnBhaXI8dW5zaWduZWQsdW5zaWduZWQ+IERpYWdzID0gR2V0RGlhZ0ZvckdvdG9TY29wZURlY2woUy5Db250ZXh0LCBEKTsKKyAgc3RkOjpwYWlyPHVuc2lnbmVkLHVuc2lnbmVkPiBEaWFncyA9IEdldERpYWdGb3JHb3RvU2NvcGVEZWNsKFMsIEQpOwogICBpZiAoRGlhZ3MuZmlyc3QgfHwgRGlhZ3Muc2Vjb25kKSB7CiAgICAgU2NvcGVzLnB1c2hfYmFjayhHb3RvU2NvcGUoUGFyZW50U2NvcGUsIERpYWdzLmZpcnN0LCBEaWFncy5zZWNvbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC0+Z2V0TG9jYXRpb24oKSkpOwpAQCAtMzk2LDkgKzM2Nyw4IEBACiAgICAgaWYgKERlY2xTdG10ICpEUyA9IGR5bl9jYXN0PERlY2xTdG10PihTdWJTdG10KSkgewogICAgICAgLy8gVGhlIGRlY2wgc3RhdGVtZW50IGNyZWF0ZXMgYSBzY29wZSBpZiBhbnkgb2YgdGhlIGRlY2xzIGluIGl0IGFyZSBWTEFzCiAgICAgICAvLyBvciBoYXZlIHRoZSBjbGVhbnVwIGF0dHJpYnV0ZS4KLSAgICAgIGZvciAoRGVjbFN0bXQ6OmRlY2xfaXRlcmF0b3IgSSA9IERTLT5kZWNsX2JlZ2luKCksIEUgPSBEUy0+ZGVjbF9lbmQoKTsKLSAgICAgICAgICAgSSAhPSBFOyArK0kpCi0gICAgICAgIEJ1aWxkU2NvcGVJbmZvcm1hdGlvbigqSSwgUGFyZW50U2NvcGUpOworICAgICAgZm9yIChhdXRvICpJIDogRFMtPmRlY2xzKCkpCisgICAgICAgIEJ1aWxkU2NvcGVJbmZvcm1hdGlvbihJLCBQYXJlbnRTY29wZSk7CiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgLy8gRGlzYWxsb3cganVtcHMgaW50byBhbnkgcGFydCBvZiBhbiBAdHJ5IHN0YXRlbWVudCBieSBwdXNoaW5nIGEgc2NvcGUgYW5kCkBAIC00NzQsMTQgKzQ0NCwzMiBAQAogICAgIGlmIChFeHByV2l0aENsZWFudXBzICpFV0MgPSBkeW5fY2FzdDxFeHByV2l0aENsZWFudXBzPihTdWJTdG10KSkgewogICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEVXQy0+Z2V0TnVtT2JqZWN0cygpOyBpICE9IGU7ICsraSkgewogICAgICAgICBjb25zdCBCbG9ja0RlY2wgKkJEZWNsID0gRVdDLT5nZXRPYmplY3QoaSk7Ci0gICAgICAgIGZvciAoQmxvY2tEZWNsOjpjYXB0dXJlX2NvbnN0X2l0ZXJhdG9yIGNpID0gQkRlY2wtPmNhcHR1cmVfYmVnaW4oKSwKLSAgICAgICAgICAgICBjZSA9IEJEZWNsLT5jYXB0dXJlX2VuZCgpOyBjaSAhPSBjZTsgKytjaSkgewotICAgICAgICAgIFZhckRlY2wgKnZhcmlhYmxlID0gY2ktPmdldFZhcmlhYmxlKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmQ0kgOiBCRGVjbC0+Y2FwdHVyZXMoKSkgeworICAgICAgICAgIFZhckRlY2wgKnZhcmlhYmxlID0gQ0kuZ2V0VmFyaWFibGUoKTsKICAgICAgICAgICBCdWlsZFNjb3BlSW5mb3JtYXRpb24odmFyaWFibGUsIEJEZWNsLCBQYXJlbnRTY29wZSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgCisKKyAgICAvLyBEaXNhbGxvdyBqdW1wcyBvdXQgb2Ygc2NvcGVzIGNvbnRhaW5pbmcgdGVtcG9yYXJpZXMgbGlmZXRpbWUtZXh0ZW5kZWQgdG8KKyAgICAvLyBhdXRvbWF0aWMgc3RvcmFnZSBkdXJhdGlvbi4KKyAgICBpZiAoTWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByICpNVEUgPQorICAgICAgICAgICAgZHluX2Nhc3Q8TWF0ZXJpYWxpemVUZW1wb3JhcnlFeHByPihTdWJTdG10KSkgeworICAgICAgaWYgKE1URS0+Z2V0U3RvcmFnZUR1cmF0aW9uKCkgPT0gU0RfQXV0b21hdGljKSB7CisgICAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IEV4cHIgKiwgND4gQ29tbWFMSFM7CisgICAgICAgIFNtYWxsVmVjdG9yPFN1Ym9iamVjdEFkanVzdG1lbnQsIDQ+IEFkanVzdG1lbnRzOworICAgICAgICBjb25zdCBFeHByICpFeHRlbmRlZE9iamVjdCA9CisgICAgICAgICAgICBNVEUtPkdldFRlbXBvcmFyeUV4cHIoKS0+c2tpcFJWYWx1ZVN1Ym9iamVjdEFkanVzdG1lbnRzKAorICAgICAgICAgICAgICAgIENvbW1hTEhTLCBBZGp1c3RtZW50cyk7CisgICAgICAgIGlmIChFeHRlbmRlZE9iamVjdC0+Z2V0VHlwZSgpLmlzRGVzdHJ1Y3RlZFR5cGUoKSkgeworICAgICAgICAgIFNjb3Blcy5wdXNoX2JhY2soR290b1Njb3BlKFBhcmVudFNjb3BlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6Om5vdGVfZXhpdHNfdGVtcG9yYXJ5X2R0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRPYmplY3QtPmdldEV4cHJMb2MoKSkpOworICAgICAgICAgIFBhcmVudFNjb3BlID0gU2NvcGVzLnNpemUoKS0xOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCiAgICAgLy8gUmVjdXJzaXZlbHkgd2FsayB0aGUgQVNULgogICAgIEJ1aWxkU2NvcGVJbmZvcm1hdGlvbihTdWJTdG10LCBQYXJlbnRTY29wZSk7CiAgIH0KQEAgLTc2Miw3ICs3NTAsNyBAQAogICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMTA+IFRvU2NvcGVzRXJyb3I7CiAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAxMD4gVG9TY29wZXNXYXJuaW5nOwogICBmb3IgKHVuc2lnbmVkIEkgPSBUb1Njb3BlOyBJICE9IENvbW1vblNjb3BlOyBJID0gU2NvcGVzW0ldLlBhcmVudFNjb3BlKSB7Ci0gICAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRNb2RlICYmIEp1bXBEaWFnV2FybmluZyAhPSAwICYmCisgICAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0ICYmIEp1bXBEaWFnV2FybmluZyAhPSAwICYmCiAgICAgICAgIElzTWljcm9zb2Z0SnVtcFdhcm5pbmcoSnVtcERpYWdFcnJvciwgU2NvcGVzW0ldLkluRGlhZykpCiAgICAgICBUb1Njb3Blc1dhcm5pbmcucHVzaF9iYWNrKEkpOwogICAgIGVsc2UgaWYgKElzQ1hYOThDb21wYXRXYXJuaW5nKFMsIFNjb3Blc1tJXS5JbkRpYWcpKQpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvU2NvcGUuY3BwIGIvbGliL1NlbWEvU2NvcGUuY3BwCmluZGV4IDEwZjEyY2UuLjQ5NDc2OGQgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL1Njb3BlLmNwcAorKysgYi9saWIvU2VtYS9TY29wZS5jcHAKQEAgLTEzLDYgKzEzLDcgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJjbGFuZy9TZW1hL1Njb3BlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIApAQCAtMzYsMTYgKzM3LDI0IEBACiAgICAgRm5QYXJlbnQgICAgICAgPSBwYXJlbnQtPkZuUGFyZW50OwogICAgIEJsb2NrUGFyZW50ICAgID0gcGFyZW50LT5CbG9ja1BhcmVudDsKICAgICBUZW1wbGF0ZVBhcmFtUGFyZW50ID0gcGFyZW50LT5UZW1wbGF0ZVBhcmFtUGFyZW50OworICAgIE1TTG9jYWxNYW5nbGluZ1BhcmVudCA9IHBhcmVudC0+TVNMb2NhbE1hbmdsaW5nUGFyZW50OwogICB9IGVsc2UgewogICAgIERlcHRoID0gMDsKICAgICBQcm90b3R5cGVEZXB0aCA9IDA7CiAgICAgUHJvdG90eXBlSW5kZXggPSAwOwotICAgIEZuUGFyZW50ID0gQmxvY2tQYXJlbnQgPSAwOworICAgIE1TTG9jYWxNYW5nbGluZ1BhcmVudCA9IEZuUGFyZW50ID0gQmxvY2tQYXJlbnQgPSAwOwogICAgIFRlbXBsYXRlUGFyYW1QYXJlbnQgPSAwOworICAgIE1TTG9jYWxNYW5nbGluZ051bWJlciA9IDE7CiAgIH0KIAogICAvLyBJZiB0aGlzIHNjb3BlIGlzIGEgZnVuY3Rpb24gb3IgY29udGFpbnMgYnJlYWtzL2NvbnRpbnVlcywgcmVtZW1iZXIgaXQuCiAgIGlmIChmbGFncyAmIEZuU2NvcGUpICAgICAgICAgICAgRm5QYXJlbnQgPSB0aGlzOworICAvLyBUaGUgTVMgbWFuZ2xlciB1c2VzIHRoZSBudW1iZXIgb2Ygc2NvcGVzIHRoYXQgY2FuIGhvbGQgZGVjbGFyYXRpb25zIGFzCisgIC8vIHBhcnQgb2YgYW4gZXh0ZXJuYWwgbmFtZS4KKyAgaWYgKEZsYWdzICYgKENsYXNzU2NvcGUgfCBGblNjb3BlKSkgeworICAgIE1TTG9jYWxNYW5nbGluZ051bWJlciA9IGdldE1TTG9jYWxNYW5nbGluZ051bWJlcigpOworICAgIE1TTG9jYWxNYW5nbGluZ1BhcmVudCA9IHRoaXM7CisgIH0KICAgaWYgKGZsYWdzICYgQnJlYWtTY29wZSkgICAgICAgICBCcmVha1BhcmVudCA9IHRoaXM7CiAgIGlmIChmbGFncyAmIENvbnRpbnVlU2NvcGUpICAgICAgQ29udGludWVQYXJlbnQgPSB0aGlzOwogICBpZiAoZmxhZ3MgJiBCbG9ja1Njb3BlKSAgICAgICAgIEJsb2NrUGFyZW50ID0gdGhpczsKQEAgLTUzLDYgKzYyLDE2IEBACiAKICAgLy8gSWYgdGhpcyBpcyBhIHByb3RvdHlwZSBzY29wZSwgcmVjb3JkIHRoYXQuCiAgIGlmIChmbGFncyAmIEZ1bmN0aW9uUHJvdG90eXBlU2NvcGUpIFByb3RvdHlwZURlcHRoKys7CisgIGlmIChmbGFncyAmIERlY2xTY29wZSkgeworICAgIGlmIChmbGFncyAmIEZ1bmN0aW9uUHJvdG90eXBlU2NvcGUpCisgICAgICA7IC8vIFByb3RvdHlwZSBzY29wZXMgYXJlIHVuaW50ZXJlc3RpbmcuCisgICAgZWxzZSBpZiAoKGZsYWdzICYgQ2xhc3NTY29wZSkgJiYgZ2V0UGFyZW50KCktPmlzQ2xhc3NTY29wZSgpKQorICAgICAgOyAvLyBOZXN0ZWQgY2xhc3Mgc2NvcGVzIGFyZW4ndCBhbWJpZ3VvdXMuCisgICAgZWxzZSBpZiAoKGZsYWdzICYgQ2xhc3NTY29wZSkgJiYgZ2V0UGFyZW50KCktPmdldEZsYWdzKCkgPT0gRGVjbFNjb3BlKQorICAgICAgOyAvLyBDbGFzc2VzIGluc2lkZSBvZiBuYW1lc3BhY2VzIGFyZW4ndCBhbWJpZ3VvdXMuCisgICAgZWxzZQorICAgICAgaW5jcmVtZW50TVNMb2NhbE1hbmdsaW5nTnVtYmVyKCk7CisgIH0KIAogICBEZWNsc0luU2NvcGUuY2xlYXIoKTsKICAgVXNpbmdEaXJlY3RpdmVzLmNsZWFyKCk7CkBAIC02OSwzICs4OCw5MiBAQAogICB9CiAgIHJldHVybiBmYWxzZTsKIH0KKwordm9pZCBTY29wZTo6QWRkRmxhZ3ModW5zaWduZWQgRmxhZ3NUb1NldCkgeworICBhc3NlcnQoKEZsYWdzVG9TZXQgJiB+KEJyZWFrU2NvcGUgfCBDb250aW51ZVNjb3BlKSkgPT0gMCAmJgorICAgICAgICAgIlVuc3VwcG9ydGVkIHNjb3BlIGZsYWdzIik7CisgIGlmIChGbGFnc1RvU2V0ICYgQnJlYWtTY29wZSkgeworICAgIGFzc2VydCgoRmxhZ3MgJiBCcmVha1Njb3BlKSA9PSAwICYmICJBbHJlYWR5IHNldCIpOworICAgIEJyZWFrUGFyZW50ID0gdGhpczsKKyAgfQorICBpZiAoRmxhZ3NUb1NldCAmIENvbnRpbnVlU2NvcGUpIHsKKyAgICBhc3NlcnQoKEZsYWdzICYgQ29udGludWVTY29wZSkgPT0gMCAmJiAiQWxyZWFkeSBzZXQiKTsKKyAgICBDb250aW51ZVBhcmVudCA9IHRoaXM7CisgIH0KKyAgRmxhZ3MgfD0gRmxhZ3NUb1NldDsKK30KKwordm9pZCBTY29wZTo6ZHVtcCgpIGNvbnN0IHsgZHVtcEltcGwobGx2bTo6ZXJycygpKTsgfQorCit2b2lkIFNjb3BlOjpkdW1wSW1wbChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgdW5zaWduZWQgRmxhZ3MgPSBnZXRGbGFncygpOworICBib29sIEhhc0ZsYWdzID0gRmxhZ3MgIT0gMDsKKworICBpZiAoSGFzRmxhZ3MpCisgICAgT1MgPDwgIkZsYWdzOiAiOworCisgIHdoaWxlIChGbGFncykgeworICAgIGlmIChGbGFncyAmIEZuU2NvcGUpIHsKKyAgICAgIE9TIDw8ICJGblNjb3BlIjsKKyAgICAgIEZsYWdzICY9IH5GblNjb3BlOworICAgIH0gZWxzZSBpZiAoRmxhZ3MgJiBCcmVha1Njb3BlKSB7CisgICAgICBPUyA8PCAiQnJlYWtTY29wZSI7CisgICAgICBGbGFncyAmPSB+QnJlYWtTY29wZTsKKyAgICB9IGVsc2UgaWYgKEZsYWdzICYgQ29udGludWVTY29wZSkgeworICAgICAgT1MgPDwgIkNvbnRpbnVlU2NvcGUiOworICAgICAgRmxhZ3MgJj0gfkNvbnRpbnVlU2NvcGU7CisgICAgfSBlbHNlIGlmIChGbGFncyAmIERlY2xTY29wZSkgeworICAgICAgT1MgPDwgIkRlY2xTY29wZSI7CisgICAgICBGbGFncyAmPSB+RGVjbFNjb3BlOworICAgIH0gZWxzZSBpZiAoRmxhZ3MgJiBDb250cm9sU2NvcGUpIHsKKyAgICAgIE9TIDw8ICJDb250cm9sU2NvcGUiOworICAgICAgRmxhZ3MgJj0gfkNvbnRyb2xTY29wZTsKKyAgICB9IGVsc2UgaWYgKEZsYWdzICYgQ2xhc3NTY29wZSkgeworICAgICAgT1MgPDwgIkNsYXNzU2NvcGUiOworICAgICAgRmxhZ3MgJj0gfkNsYXNzU2NvcGU7CisgICAgfSBlbHNlIGlmIChGbGFncyAmIEJsb2NrU2NvcGUpIHsKKyAgICAgIE9TIDw8ICJCbG9ja1Njb3BlIjsKKyAgICAgIEZsYWdzICY9IH5CbG9ja1Njb3BlOworICAgIH0gZWxzZSBpZiAoRmxhZ3MgJiBUZW1wbGF0ZVBhcmFtU2NvcGUpIHsKKyAgICAgIE9TIDw8ICJUZW1wbGF0ZVBhcmFtU2NvcGUiOworICAgICAgRmxhZ3MgJj0gflRlbXBsYXRlUGFyYW1TY29wZTsKKyAgICB9IGVsc2UgaWYgKEZsYWdzICYgRnVuY3Rpb25Qcm90b3R5cGVTY29wZSkgeworICAgICAgT1MgPDwgIkZ1bmN0aW9uUHJvdG90eXBlU2NvcGUiOworICAgICAgRmxhZ3MgJj0gfkZ1bmN0aW9uUHJvdG90eXBlU2NvcGU7CisgICAgfSBlbHNlIGlmIChGbGFncyAmIEZ1bmN0aW9uRGVjbGFyYXRpb25TY29wZSkgeworICAgICAgT1MgPDwgIkZ1bmN0aW9uRGVjbGFyYXRpb25TY29wZSI7CisgICAgICBGbGFncyAmPSB+RnVuY3Rpb25EZWNsYXJhdGlvblNjb3BlOworICAgIH0gZWxzZSBpZiAoRmxhZ3MgJiBBdENhdGNoU2NvcGUpIHsKKyAgICAgIE9TIDw8ICJBdENhdGNoU2NvcGUiOworICAgICAgRmxhZ3MgJj0gfkF0Q2F0Y2hTY29wZTsKKyAgICB9IGVsc2UgaWYgKEZsYWdzICYgT2JqQ01ldGhvZFNjb3BlKSB7CisgICAgICBPUyA8PCAiT2JqQ01ldGhvZFNjb3BlIjsKKyAgICAgIEZsYWdzICY9IH5PYmpDTWV0aG9kU2NvcGU7CisgICAgfSBlbHNlIGlmIChGbGFncyAmIFN3aXRjaFNjb3BlKSB7CisgICAgICBPUyA8PCAiU3dpdGNoU2NvcGUiOworICAgICAgRmxhZ3MgJj0gflN3aXRjaFNjb3BlOworICAgIH0gZWxzZSBpZiAoRmxhZ3MgJiBUcnlTY29wZSkgeworICAgICAgT1MgPDwgIlRyeVNjb3BlIjsKKyAgICAgIEZsYWdzICY9IH5UcnlTY29wZTsKKyAgICB9IGVsc2UgaWYgKEZsYWdzICYgRm5UcnlDYXRjaFNjb3BlKSB7CisgICAgICBPUyA8PCAiRm5UcnlDYXRjaFNjb3BlIjsKKyAgICAgIEZsYWdzICY9IH5GblRyeUNhdGNoU2NvcGU7CisgICAgfSBlbHNlIGlmIChGbGFncyAmIE9wZW5NUERpcmVjdGl2ZVNjb3BlKSB7CisgICAgICBPUyA8PCAiT3Blbk1QRGlyZWN0aXZlU2NvcGUiOworICAgICAgRmxhZ3MgJj0gfk9wZW5NUERpcmVjdGl2ZVNjb3BlOworICAgIH0KKworICAgIGlmIChGbGFncykKKyAgICAgIE9TIDw8ICIgfCAiOworICB9CisgIGlmIChIYXNGbGFncykKKyAgICBPUyA8PCAnXG4nOworCisgIGlmIChjb25zdCBTY29wZSAqUGFyZW50ID0gZ2V0UGFyZW50KCkpCisgICAgT1MgPDwgIlBhcmVudDogKGNsYW5nOjpTY29wZSopIiA8PCBQYXJlbnQgPDwgJ1xuJzsKKworICBPUyA8PCAiRGVwdGg6ICIgPDwgRGVwdGggPDwgJ1xuJzsKKyAgT1MgPDwgIk1TTG9jYWxNYW5nbGluZ051bWJlcjogIiA8PCBnZXRNU0xvY2FsTWFuZ2xpbmdOdW1iZXIoKSA8PCAnXG4nOworICBpZiAoY29uc3QgRGVjbENvbnRleHQgKkRDID0gZ2V0RW50aXR5KCkpCisgICAgT1MgPDwgIkVudGl0eSA6IChjbGFuZzo6RGVjbENvbnRleHQqKSIgPDwgREMgPDwgJ1xuJzsKK30KZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1Njb3BlSW5mby5jcHAgYi9saWIvU2VtYS9TY29wZUluZm8uY3BwCmluZGV4IDhiMzQ5M2UuLjFlNTRjNWEgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL1Njb3BlSW5mby5jcHAKKysrIGIvbGliL1NlbWEvU2NvcGVJbmZvLmNwcApAQCAtMjYsNiArMjYsMTIgQEAKICAgSGFzQnJhbmNoUHJvdGVjdGVkU2NvcGUgPSBmYWxzZTsKICAgSGFzQnJhbmNoSW50b1Njb3BlID0gZmFsc2U7CiAgIEhhc0luZGlyZWN0R290byA9IGZhbHNlOworICBIYXNEcm9wcGVkU3RtdCA9IGZhbHNlOworICBPYmpDU2hvdWxkQ2FsbFN1cGVyID0gZmFsc2U7CisgIE9iakNJc0Rlc2lnbmF0ZWRJbml0ID0gZmFsc2U7CisgIE9iakNXYXJuRm9yTm9EZXNpZ25hdGVkSW5pdENoYWluID0gZmFsc2U7CisgIE9iakNJc1NlY29uZGFyeUluaXQgPSBmYWxzZTsKKyAgT2JqQ1dhcm5Gb3JOb0luaXREZWxlZ2F0aW9uID0gZmFsc2U7CiAKICAgU3dpdGNoU3RhY2suY2xlYXIoKTsKICAgUmV0dXJucy5jbGVhcigpOwpAQCAtMTg0LDEwICsxOTAsMTEgQEAKICAgVGhpc1VzZS0+bWFya1NhZmUoKTsKIH0KIAotdm9pZCBMYW1iZGFTY29wZUluZm86OmdldFBvdGVudGlhbFZhcmlhYmxlQ2FwdHVyZSh1bnNpZ25lZCBJZHgsIFZhckRlY2wgKiZWRCwgRXhwciAqJkUpIHsKK3ZvaWQgTGFtYmRhU2NvcGVJbmZvOjpnZXRQb3RlbnRpYWxWYXJpYWJsZUNhcHR1cmUodW5zaWduZWQgSWR4LCBWYXJEZWNsIComVkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKiZFKSBjb25zdCB7CiAgIGFzc2VydChJZHggPCBnZXROdW1Qb3RlbnRpYWxWYXJpYWJsZUNhcHR1cmVzKCkgJiYKLSAgICAiSW5kZXggb2YgcG90ZW50aWFsIGNhcHR1cmUgbXVzdCBiZSB3aXRoaW4gMCB0byBsZXNzIHRoYW4gdGhlICIKLSAgICAibnVtYmVyIG9mIGNhcHR1cmVzISIpOworICAgICAgICAgIkluZGV4IG9mIHBvdGVudGlhbCBjYXB0dXJlIG11c3QgYmUgd2l0aGluIDAgdG8gbGVzcyB0aGFuIHRoZSAiCisgICAgICAgICAibnVtYmVyIG9mIGNhcHR1cmVzISIpOwogICBFID0gUG90ZW50aWFsbHlDYXB0dXJpbmdFeHByc1tJZHhdOwogICBpZiAoRGVjbFJlZkV4cHIgKkRSRSA9IGR5bl9jYXN0PERlY2xSZWZFeHByPihFKSkKICAgICBWRCA9IGR5bl9jYXN0PFZhckRlY2w+KERSRS0+Z2V0Rm91bmREZWNsKCkpOwpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvU2VtYS5jcHAgYi9saWIvU2VtYS9TZW1hLmNwcAppbmRleCA0ZDAxZmIwLi4zNjEyYmI5IDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hLmNwcAorKysgYi9saWIvU2VtYS9TZW1hLmNwcApAQCAtMTMsNyArMTMsNiBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2VtYUludGVybmFsLmgiCi0jaW5jbHVkZSAiVGFyZ2V0QXR0cmlidXRlc1NlbWEuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1REaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKQEAgLTcwLDEzICs2OSwxNyBAQAogU2VtYTo6U2VtYShQcmVwcm9jZXNzb3IgJnBwLCBBU1RDb250ZXh0ICZjdHh0LCBBU1RDb25zdW1lciAmY29uc3VtZXIsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uVW5pdEtpbmQgVFVLaW5kLAogICAgICAgICAgICBDb2RlQ29tcGxldGVDb25zdW1lciAqQ29kZUNvbXBsZXRlcikKLSAgOiBUaGVUYXJnZXRBdHRyaWJ1dGVzU2VtYSgwKSwgRXh0ZXJuYWxTb3VyY2UoMCksCisgIDogRXh0ZXJuYWxTb3VyY2UoMCksCiAgICAgaXNNdWx0aXBsZXhFeHRlcm5hbFNvdXJjZShmYWxzZSksIEZQRmVhdHVyZXMocHAuZ2V0TGFuZ09wdHMoKSksCiAgICAgTGFuZ09wdHMocHAuZ2V0TGFuZ09wdHMoKSksIFBQKHBwKSwgQ29udGV4dChjdHh0KSwgQ29uc3VtZXIoY29uc3VtZXIpLAogICAgIERpYWdzKFBQLmdldERpYWdub3N0aWNzKCkpLCBTb3VyY2VNZ3IoUFAuZ2V0U291cmNlTWFuYWdlcigpKSwKICAgICBDb2xsZWN0U3RhdHMoZmFsc2UpLCBDb2RlQ29tcGxldGVyKENvZGVDb21wbGV0ZXIpLAogICAgIEN1ckNvbnRleHQoMCksIE9yaWdpbmFsTGV4aWNhbENvbnRleHQoMCksCi0gICAgUGFja0NvbnRleHQoMCksIE1TU3RydWN0UHJhZ21hT24oZmFsc2UpLCBWaXNDb250ZXh0KDApLAorICAgIFBhY2tDb250ZXh0KDApLCBNU1N0cnVjdFByYWdtYU9uKGZhbHNlKSwKKyAgICBNU1BvaW50ZXJUb01lbWJlclJlcHJlc2VudGF0aW9uTWV0aG9kKAorICAgICAgICBMYW5nT3B0cy5nZXRNU1BvaW50ZXJUb01lbWJlclJlcHJlc2VudGF0aW9uTWV0aG9kKCkpLAorICAgIFZ0b3JEaXNwTW9kZVN0YWNrKDEsIE1TVnRvckRpc3BBdHRyOjpNb2RlKExhbmdPcHRzLlZ0b3JEaXNwTW9kZSkpLAorICAgIFZpc0NvbnRleHQoMCksCiAgICAgSXNCdWlsZGluZ1JlY292ZXJ5Q2FsbEV4cHIoZmFsc2UpLAogICAgIEV4cHJOZWVkc0NsZWFudXBzKGZhbHNlKSwgTGF0ZVRlbXBsYXRlUGFyc2VyKDApLCBPcGFxdWVQYXJzZXIoMCksCiAgICAgSWRSZXNvbHZlcihwcCksIFN0ZEluaXRpYWxpemVyTGlzdCgwKSwgQ1hYVHlwZUluZm9EZWNsKDApLCBNU1ZDR3VpZERlY2woMCksCkBAIC04Niw3ICs4OSw3IEBACiAgICAgTlNEaWN0aW9uYXJ5RGVjbCgwKSwgRGljdGlvbmFyeVdpdGhPYmplY3RzTWV0aG9kKDApLAogICAgIEdsb2JhbE5ld0RlbGV0ZURlY2xhcmVkKGZhbHNlKSwKICAgICBUVUtpbmQoVFVLaW5kKSwKLSAgICBOdW1TRklOQUVFcnJvcnMoMCksIEluRnVuY3Rpb25EZWNsYXJhdG9yKDApLAorICAgIE51bVNGSU5BRUVycm9ycygwKSwKICAgICBBY2Nlc3NDaGVja2luZ1NGSU5BRShmYWxzZSksIEluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQoZmFsc2UpLAogICAgIE5vbkluc3RhbnRpYXRpb25FbnRyaWVzKDApLCBBcmd1bWVudFBhY2tTdWJzdGl0dXRpb25JbmRleCgtMSksCiAgICAgQ3VycmVudEluc3RhbnRpYXRpb25TY29wZSgwKSwgRGlzYWJsZVR5cG9Db3JyZWN0aW9uKGZhbHNlKSwKQEAgLTEyMCw2ICsxMjMsMTIgQEAKICAgSW5pdERhdGFTaGFyaW5nQXR0cmlidXRlc1N0YWNrKCk7CiB9CiAKK3ZvaWQgU2VtYTo6YWRkSW1wbGljaXRUeXBlZGVmKFN0cmluZ1JlZiBOYW1lLCBRdWFsVHlwZSBUKSB7CisgIERlY2xhcmF0aW9uTmFtZSBETiA9ICZDb250ZXh0LklkZW50cy5nZXQoTmFtZSk7CisgIGlmIChJZFJlc29sdmVyLmJlZ2luKEROKSA9PSBJZFJlc29sdmVyLmVuZCgpKQorICAgIFB1c2hPblNjb3BlQ2hhaW5zKENvbnRleHQuYnVpbGRJbXBsaWNpdFR5cGVkZWYoVCwgTmFtZSksIFRVU2NvcGUpOworfQorCiB2b2lkIFNlbWE6OkluaXRpYWxpemUoKSB7CiAgIC8vIFRlbGwgdGhlIEFTVCBjb25zdW1lciBhYm91dCB0aGlzIFNlbWEgb2JqZWN0LgogICBDb25zdW1lci5Jbml0aWFsaXplKENvbnRleHQpOwpAQCAtMTcyLDIwICsxODEsMzYgQEAKICAgICAgIFB1c2hPblNjb3BlQ2hhaW5zKENvbnRleHQuZ2V0T2JqQ1Byb3RvY29sRGVjbCgpLCBUVVNjb3BlKTsKICAgfQogCisgIC8vIEluaXRpYWxpemUgTWljcm9zb2Z0ICJwcmVkZWZpbmVkIEMrKyB0eXBlcyIuCisgIGlmIChQUC5nZXRMYW5nT3B0cygpLk1TVkNDb21wYXQgJiYgUFAuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMpIHsKKyAgICBpZiAoSWRSZXNvbHZlci5iZWdpbigmQ29udGV4dC5JZGVudHMuZ2V0KCJ0eXBlX2luZm8iKSkgPT0gSWRSZXNvbHZlci5lbmQoKSkKKyAgICAgIFB1c2hPblNjb3BlQ2hhaW5zKENvbnRleHQuYnVpbGRJbXBsaWNpdFJlY29yZCgidHlwZV9pbmZvIiwgVFRLX0NsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRVU2NvcGUpOworCisgICAgYWRkSW1wbGljaXRUeXBlZGVmKCJzaXplX3QiLCBDb250ZXh0LmdldFNpemVUeXBlKCkpOworICB9CisKKyAgLy8gSW5pdGlhbGl6ZSBwcmVkZWZpbmVkIE9wZW5DTCB0eXBlcy4KKyAgaWYgKFBQLmdldExhbmdPcHRzKCkuT3BlbkNMKSB7CisgICAgYWRkSW1wbGljaXRUeXBlZGVmKCJpbWFnZTFkX3QiLCBDb250ZXh0Lk9DTEltYWdlMWRUeSk7CisgICAgYWRkSW1wbGljaXRUeXBlZGVmKCJpbWFnZTFkX2FycmF5X3QiLCBDb250ZXh0Lk9DTEltYWdlMWRBcnJheVR5KTsKKyAgICBhZGRJbXBsaWNpdFR5cGVkZWYoImltYWdlMWRfYnVmZmVyX3QiLCBDb250ZXh0Lk9DTEltYWdlMWRCdWZmZXJUeSk7CisgICAgYWRkSW1wbGljaXRUeXBlZGVmKCJpbWFnZTJkX3QiLCBDb250ZXh0Lk9DTEltYWdlMmRUeSk7CisgICAgYWRkSW1wbGljaXRUeXBlZGVmKCJpbWFnZTJkX2FycmF5X3QiLCBDb250ZXh0Lk9DTEltYWdlMmRBcnJheVR5KTsKKyAgICBhZGRJbXBsaWNpdFR5cGVkZWYoImltYWdlM2RfdCIsIENvbnRleHQuT0NMSW1hZ2UzZFR5KTsKKyAgICBhZGRJbXBsaWNpdFR5cGVkZWYoInNhbXBsZXJfdCIsIENvbnRleHQuT0NMU2FtcGxlclR5KTsKKyAgICBhZGRJbXBsaWNpdFR5cGVkZWYoImV2ZW50X3QiLCBDb250ZXh0Lk9DTEV2ZW50VHkpOworICB9CisKICAgRGVjbGFyYXRpb25OYW1lIEJ1aWx0aW5WYUxpc3QgPSAmQ29udGV4dC5JZGVudHMuZ2V0KCJfX2J1aWx0aW5fdmFfbGlzdCIpOwogICBpZiAoSWRSZXNvbHZlci5iZWdpbihCdWlsdGluVmFMaXN0KSA9PSBJZFJlc29sdmVyLmVuZCgpKQogICAgIFB1c2hPblNjb3BlQ2hhaW5zKENvbnRleHQuZ2V0QnVpbHRpblZhTGlzdERlY2woKSwgVFVTY29wZSk7CiB9CiAKIFNlbWE6On5TZW1hKCkgewotICBmb3IgKExhdGVQYXJzZWRUZW1wbGF0ZU1hcFQ6Oml0ZXJhdG9yIEkgPSBMYXRlUGFyc2VkVGVtcGxhdGVNYXAuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gTGF0ZVBhcnNlZFRlbXBsYXRlTWFwLmVuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKQotICAgIGRlbGV0ZSBJLT5zZWNvbmQ7CisgIGxsdm06OkRlbGV0ZUNvbnRhaW5lclNlY29uZHMoTGF0ZVBhcnNlZFRlbXBsYXRlTWFwKTsKICAgaWYgKFBhY2tDb250ZXh0KSBGcmVlUGFja2VkQ29udGV4dCgpOwogICBpZiAoVmlzQ29udGV4dCkgRnJlZVZpc0NvbnRleHQoKTsKLSAgZGVsZXRlIFRoZVRhcmdldEF0dHJpYnV0ZXNTZW1hOwotICBNU1N0cnVjdFByYWdtYU9uID0gZmFsc2U7CiAgIC8vIEtpbGwgYWxsIHRoZSBhY3RpdmUgc2NvcGVzLgogICBmb3IgKHVuc2lnbmVkIEkgPSAxLCBFID0gRnVuY3Rpb25TY29wZXMuc2l6ZSgpOyBJICE9IEU7ICsrSSkKICAgICBkZWxldGUgRnVuY3Rpb25TY29wZXNbSV07CkBAIC0yMzAsNyArMjU1LDcgQEAKICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGlzIGFscmVhZHkgdW5hdmFpbGFibGUsIGl0J3Mgbm90IGFuIGVycm9yLgogICBpZiAoZm4tPmhhc0F0dHI8VW5hdmFpbGFibGVBdHRyPigpKSByZXR1cm4gdHJ1ZTsKIAotICBmbi0+YWRkQXR0cihuZXcgKENvbnRleHQpIFVuYXZhaWxhYmxlQXR0cihsb2MsIENvbnRleHQsIG1zZykpOworICBmbi0+YWRkQXR0cihVbmF2YWlsYWJsZUF0dHI6OkNyZWF0ZUltcGxpY2l0KENvbnRleHQsIG1zZywgbG9jKSk7CiAgIHJldHVybiB0cnVlOwogfQogCkBAIC0zODQsMjUgKzQwOSw2IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotbmFtZXNwYWNlIHsKLSAgc3RydWN0IFNvcnRVbmRlZmluZWRCdXRVc2VkIHsKLSAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTTsKLSAgICBleHBsaWNpdCBTb3J0VW5kZWZpbmVkQnV0VXNlZChTb3VyY2VNYW5hZ2VyICZTTSkgOiBTTShTTSkge30KLQotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnBhaXI8TmFtZWREZWNsICosIFNvdXJjZUxvY2F0aW9uPiAmbCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPE5hbWVkRGVjbCAqLCBTb3VyY2VMb2NhdGlvbj4gJnIpIGNvbnN0IHsKLSAgICAgIGlmIChsLnNlY29uZC5pc1ZhbGlkKCkgJiYgIXIuc2Vjb25kLmlzVmFsaWQoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBpZiAoIWwuc2Vjb25kLmlzVmFsaWQoKSAmJiByLnNlY29uZC5pc1ZhbGlkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChsLnNlY29uZCAhPSByLnNlY29uZCkKLSAgICAgICAgcmV0dXJuIFNNLmlzQmVmb3JlSW5UcmFuc2xhdGlvblVuaXQobC5zZWNvbmQsIHIuc2Vjb25kKTsKLSAgICAgIHJldHVybiBTTS5pc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0KGwuZmlyc3QtPmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmZpcnN0LT5nZXRMb2NhdGlvbigpKTsKLSAgICB9Ci0gIH07Ci19Ci0KIC8vLyBPYnRhaW5zIGEgc29ydGVkIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgYXJlIHVuZGVmaW5lZCBidXQgT0RSLXVzZWQuCiB2b2lkIFNlbWE6OmdldFVuZGVmaW5lZEJ1dFVzZWQoCiAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxOYW1lZERlY2wgKiwgU291cmNlTG9jYXRpb24+ID4gJlVuZGVmaW5lZCkgewpAQCAtNDM1LDggKzQ0MSwxOSBAQAogCiAgIC8vIFNvcnQgKGluIG9yZGVyIG9mIHVzZSBzaXRlKSBzbyB0aGF0IHdlJ3JlIG5vdCBkZXBlbmRlbnQgb24gdGhlIGl0ZXJhdGlvbgogICAvLyBvcmRlciB0aHJvdWdoIGFuIGxsdm06OkRlbnNlTWFwLgorICBTb3VyY2VNYW5hZ2VyICZTTSA9IENvbnRleHQuZ2V0U291cmNlTWFuYWdlcigpOwogICBzdGQ6OnNvcnQoVW5kZWZpbmVkLmJlZ2luKCksIFVuZGVmaW5lZC5lbmQoKSwKLSAgICAgICAgICAgIFNvcnRVbmRlZmluZWRCdXRVc2VkKENvbnRleHQuZ2V0U291cmNlTWFuYWdlcigpKSk7CisgICAgICAgICAgICBbJlNNXShjb25zdCBzdGQ6OnBhaXI8TmFtZWREZWNsICosIFNvdXJjZUxvY2F0aW9uPiAmbCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6cGFpcjxOYW1lZERlY2wgKiwgU291cmNlTG9jYXRpb24+ICZyKSB7CisgICAgaWYgKGwuc2Vjb25kLmlzVmFsaWQoKSAmJiAhci5zZWNvbmQuaXNWYWxpZCgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKCFsLnNlY29uZC5pc1ZhbGlkKCkgJiYgci5zZWNvbmQuaXNWYWxpZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChsLnNlY29uZCAhPSByLnNlY29uZCkKKyAgICAgIHJldHVybiBTTS5pc0JlZm9yZUluVHJhbnNsYXRpb25Vbml0KGwuc2Vjb25kLCByLnNlY29uZCk7CisgICAgcmV0dXJuIFNNLmlzQmVmb3JlSW5UcmFuc2xhdGlvblVuaXQobC5maXJzdC0+Z2V0TG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmZpcnN0LT5nZXRMb2NhdGlvbigpKTsKKyAgfSk7CiB9CiAKIC8vLyBjaGVja1VuZGVmaW5lZEJ1dFVzZWQgLSBDaGVjayBmb3IgdW5kZWZpbmVkIG9iamVjdHMgd2l0aCBpbnRlcm5hbCBsaW5rYWdlCkBAIC02MDMsNyArNjIwLDE1IEBACiAgICAgLy8gc28gaXQgd2lsbCBmaW5kIHNvbWUgbmFtZXMgdGhhdCBhcmUgbm90IHJlcXVpcmVkIHRvIGJlIGZvdW5kLiBUaGlzIGlzCiAgICAgLy8gdmFsaWQsIGJ1dCB3ZSBjb3VsZCBkbyBiZXR0ZXIgYnkgZGlhZ25vc2luZyBpZiBhbiBpbnN0YW50aWF0aW9uIHVzZXMgYQogICAgIC8vIG5hbWUgdGhhdCB3YXMgbm90IHZpc2libGUgYXQgaXRzIGZpcnN0IHBvaW50IG9mIGluc3RhbnRpYXRpb24uCisgICAgaWYgKEV4dGVybmFsU291cmNlKSB7CisgICAgICAvLyBMb2FkIHBlbmRpbmcgaW5zdGFudGlhdGlvbnMgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlLgorICAgICAgU21hbGxWZWN0b3I8UGVuZGluZ0ltcGxpY2l0SW5zdGFudGlhdGlvbiwgND4gUGVuZGluZzsKKyAgICAgIEV4dGVybmFsU291cmNlLT5SZWFkUGVuZGluZ0luc3RhbnRpYXRpb25zKFBlbmRpbmcpOworICAgICAgUGVuZGluZ0luc3RhbnRpYXRpb25zLmluc2VydChQZW5kaW5nSW5zdGFudGlhdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZy5iZWdpbigpLCBQZW5kaW5nLmVuZCgpKTsKKyAgICB9CiAgICAgUGVyZm9ybVBlbmRpbmdJbnN0YW50aWF0aW9ucygpOworCiAgICAgQ2hlY2tEZWxheWVkTWVtYmVyRXhjZXB0aW9uU3BlY3MoKTsKICAgfQogCkBAIC0xMjE1LDcgKzEyNDAsNyBAQAogICAgICAgICAgICAgWmVyb0FyZ0NhbGxSZXR1cm5UeSA9IFF1YWxUeXBlKCk7CiAgICAgICAgICAgICBBbWJpZ3VvdXMgPSB0cnVlOwogICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgWmVyb0FyZ0NhbGxSZXR1cm5UeSA9IE92ZXJsb2FkRGVjbC0+Z2V0UmVzdWx0VHlwZSgpOworICAgICAgICAgICAgWmVyb0FyZ0NhbGxSZXR1cm5UeSA9IE92ZXJsb2FkRGVjbC0+Z2V0UmV0dXJuVHlwZSgpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMTI0NCw3ICsxMjY5LDcgQEAKICAgaWYgKGNvbnN0IERlY2xSZWZFeHByICpEZWNsUmVmID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KEUuSWdub3JlUGFyZW5zKCkpKSB7CiAgICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRnVuID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihEZWNsUmVmLT5nZXREZWNsKCkpKSB7CiAgICAgICBpZiAoRnVuLT5nZXRNaW5SZXF1aXJlZEFyZ3VtZW50cygpID09IDApCi0gICAgICAgIFplcm9BcmdDYWxsUmV0dXJuVHkgPSBGdW4tPmdldFJlc3VsdFR5cGUoKTsKKyAgICAgICAgWmVyb0FyZ0NhbGxSZXR1cm5UeSA9IEZ1bi0+Z2V0UmV0dXJuVHlwZSgpOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICB9CkBAIC0xMjYxLDggKzEyODYsOCBAQAogCiAgIGlmIChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0KICAgICAgIGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb25Qcm90b1R5cGU+KEZ1blR5KSkgewotICAgIGlmIChGUFQtPmdldE51bUFyZ3MoKSA9PSAwKQotICAgICAgWmVyb0FyZ0NhbGxSZXR1cm5UeSA9IEZ1blR5LT5nZXRSZXN1bHRUeXBlKCk7CisgICAgaWYgKEZQVC0+Z2V0TnVtUGFyYW1zKCkgPT0gMCkKKyAgICAgIFplcm9BcmdDYWxsUmV0dXJuVHkgPSBGdW5UeS0+Z2V0UmV0dXJuVHlwZSgpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAgIHJldHVybiBmYWxzZTsKQEAgLTEzMTMsNyArMTMzOCw3IEBACiAgIGZvciAoT3ZlcmxvYWRFeHByOjpkZWNsc19pdGVyYXRvciBJdCA9IE92ZXJsb2Fkcy5iZWdpbigpLAogICAgICAgICAgRGVjbHNFbmQgPSBPdmVybG9hZHMuZW5kKCk7IEl0ICE9IERlY2xzRW5kOyArK0l0KSB7CiAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpPdmVybG9hZERlY2wgPSBjYXN0PEZ1bmN0aW9uRGVjbD4oKkl0KTsKLSAgICBRdWFsVHlwZSBPdmVybG9hZFJlc3VsdFR5ID0gT3ZlcmxvYWREZWNsLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgUXVhbFR5cGUgT3ZlcmxvYWRSZXN1bHRUeSA9IE92ZXJsb2FkRGVjbC0+Z2V0UmV0dXJuVHlwZSgpOwogICAgIGlmIChJc1BsYXVzaWJsZVJlc3VsdChPdmVybG9hZFJlc3VsdFR5KSkKICAgICAgIFBsYXVzaWJsZU92ZXJsb2Fkcy5hZGREZWNsKEl0LmdldERlY2woKSk7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1NlbWFBY2Nlc3MuY3BwIGIvbGliL1NlbWEvU2VtYUFjY2Vzcy5jcHAKaW5kZXggNjFkYzE1Ny4uZjc4MDZkMiAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYUFjY2Vzcy5jcHAKKysrIGIvbGliL1NlbWEvU2VtYUFjY2Vzcy5jcHAKQEAgLTI4OCwxMiArMjg4LDEwIEBACiAgICAgaWYgKERlcml2ZWQtPmlzRGVwZW5kZW50Q29udGV4dCgpICYmICFEZXJpdmVkLT5oYXNEZWZpbml0aW9uKCkpCiAgICAgICByZXR1cm4gQVJfZGVwZW5kZW50OwogICAgIAotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvcgotICAgICAgICAgICBJID0gRGVyaXZlZC0+YmFzZXNfYmVnaW4oKSwgRSA9IERlcml2ZWQtPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotCisgICAgZm9yIChjb25zdCBhdXRvICZJIDogRGVyaXZlZC0+YmFzZXMoKSkgewogICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQ7CiAKLSAgICAgIFF1YWxUeXBlIFQgPSBJLT5nZXRUeXBlKCk7CisgICAgICBRdWFsVHlwZSBUID0gSS5nZXRUeXBlKCk7CiAgICAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBULT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CiAgICAgICAgIFJEID0gY2FzdDxDWFhSZWNvcmREZWNsPihSVC0+Z2V0RGVjbCgpKTsKICAgICAgIH0gZWxzZSBpZiAoY29uc3QgSW5qZWN0ZWRDbGFzc05hbWVUeXBlICpJVApAQCAtMzc2LDE4ICszNzQsMTYgQEAKICAgaWYgKEZyaWVuZFR5LmdldFF1YWxpZmllcnMoKSAhPSBDb250ZXh0VHkuZ2V0UXVhbGlmaWVycygpKQogICAgIHJldHVybiBmYWxzZTsKIAotICBpZiAoRnJpZW5kVHktPmdldE51bUFyZ3MoKSAhPSBDb250ZXh0VHktPmdldE51bUFyZ3MoKSkKKyAgaWYgKEZyaWVuZFR5LT5nZXROdW1QYXJhbXMoKSAhPSBDb250ZXh0VHktPmdldE51bVBhcmFtcygpKQogICAgIHJldHVybiBmYWxzZTsKIAotICBpZiAoIU1pZ2h0SW5zdGFudGlhdGVUbyhTLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0VHktPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRnJpZW5kVHktPmdldFJlc3VsdFR5cGUoKSkpCisgIGlmICghTWlnaHRJbnN0YW50aWF0ZVRvKFMsIENvbnRleHRUeS0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGcmllbmRUeS0+Z2V0UmV0dXJuVHlwZSgpKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IEZyaWVuZFR5LT5nZXROdW1BcmdzKCk7IEkgIT0gRTsgKytJKQotICAgIGlmICghTWlnaHRJbnN0YW50aWF0ZVRvKFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dFR5LT5nZXRBcmdUeXBlKEkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyaWVuZFR5LT5nZXRBcmdUeXBlKEkpKSkKKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IEZyaWVuZFR5LT5nZXROdW1QYXJhbXMoKTsgSSAhPSBFOyArK0kpCisgICAgaWYgKCFNaWdodEluc3RhbnRpYXRlVG8oUywgQ29udGV4dFR5LT5nZXRQYXJhbVR5cGUoSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJpZW5kVHktPmdldFBhcmFtVHlwZShJKSkpCiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgcmV0dXJuIHRydWU7CkBAIC01NzUsMTAgKzU3MSw3IEBACiAgIEFjY2Vzc1Jlc3VsdCBPbkZhaWx1cmUgPSBBUl9pbmFjY2Vzc2libGU7CiAKICAgLy8gT2theSwgY2hlY2sgZnJpZW5kcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpmcmllbmRfaXRlcmF0b3IgSSA9IENsYXNzLT5mcmllbmRfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBDbGFzcy0+ZnJpZW5kX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIEZyaWVuZERlY2wgKkZyaWVuZCA9ICpJOwotCisgIGZvciAoYXV0byAqRnJpZW5kIDogQ2xhc3MtPmZyaWVuZHMoKSkgewogICAgIHN3aXRjaCAoTWF0Y2hlc0ZyaWVuZChTLCBFQywgRnJpZW5kKSkgewogICAgIGNhc2UgQVJfYWNjZXNzaWJsZToKICAgICAgIHJldHVybiBBUl9hY2Nlc3NpYmxlOwpAQCAtNjQ4LDE4ICs2NDEsMTYgQEAKICAgICAgIEV2ZXJEZXBlbmRlbnQgPSB0cnVlOwogCiAgICAgLy8gUmVjdXJzZSBpbnRvIHRoZSBiYXNlIGNsYXNzZXMuCi0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yCi0gICAgICAgICAgIEkgPSBDdXItPmJhc2VzX2JlZ2luKCksIEUgPSBDdXItPmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotCisgICAgZm9yIChjb25zdCBhdXRvICZJIDogQ3VyLT5iYXNlcygpKSB7CiAgICAgICAvLyBJZiB0aGlzIGlzIHByaXZhdGUgaW5oZXJpdGFuY2UsIHRoZW4gYSBwdWJsaWMgbWVtYmVyIG9mIHRoZQogICAgICAgLy8gYmFzZSB3aWxsIG5vdCBoYXZlIGFueSBhY2Nlc3MgaW4gY2xhc3NlcyBkZXJpdmVkIGZyb20gQ3VyLgogICAgICAgdW5zaWduZWQgQmFzZVByaXZhdGVEZXB0aCA9IFByaXZhdGVEZXB0aDsKLSAgICAgIGlmIChJLT5nZXRBY2Nlc3NTcGVjaWZpZXIoKSA9PSBBU19wcml2YXRlKQorICAgICAgaWYgKEkuZ2V0QWNjZXNzU3BlY2lmaWVyKCkgPT0gQVNfcHJpdmF0ZSkKICAgICAgICAgQmFzZVByaXZhdGVEZXB0aCA9IEN1clBhdGguc2l6ZSgpIC0gMTsKIAogICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQ7CiAKLSAgICAgIFF1YWxUeXBlIFQgPSBJLT5nZXRUeXBlKCk7CisgICAgICBRdWFsVHlwZSBUID0gSS5nZXRUeXBlKCk7CiAgICAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBULT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CiAgICAgICAgIFJEID0gY2FzdDxDWFhSZWNvcmREZWNsPihSVC0+Z2V0RGVjbCgpKTsKICAgICAgIH0gZWxzZSBpZiAoY29uc3QgSW5qZWN0ZWRDbGFzc05hbWVUeXBlICpJVApAQCAtNzk3LDcgKzc4OCw3IEBACiAgICAgICAgIC8vIEVtdWxhdGUgYSBNU1ZDIGJ1ZyB3aGVyZSB0aGUgY3JlYXRpb24gb2YgcG9pbnRlci10by1tZW1iZXIKICAgICAgICAgLy8gdG8gcHJvdGVjdGVkIG1lbWJlciBvZiBiYXNlIGNsYXNzIGlzIGFsbG93ZWQgYnV0IG9ubHkgZnJvbQogICAgICAgICAvLyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucy4KLSAgICAgICAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRNb2RlICYmICFFQy5GdW5jdGlvbnMuZW1wdHkoKSkKKyAgICAgICAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0ICYmICFFQy5GdW5jdGlvbnMuZW1wdHkoKSkKICAgICAgICAgICBpZiAoQ1hYTWV0aG9kRGVjbCogTUQgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPihFQy5GdW5jdGlvbnMuZnJvbnQoKSkpCiAgICAgICAgICAgICBpZiAoTUQtPmlzU3RhdGljKCkpIHJldHVybiBBUl9hY2Nlc3NpYmxlOwogCkBAIC0xMDgyLDE1ICsxMDczLDE1IEBACiAgICAgICAgIChpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpICYmCiAgICAgICAgICBpc2E8Q1hYQ29uc3RydWN0b3JEZWNsPigKICAgICAgICAgICAgICAgICBjYXN0PEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihEKS0+Z2V0VGVtcGxhdGVkRGVjbCgpKSkpIHsKLSAgICAgIFMuRGlhZyhELT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX2FjY2Vzc19wcm90ZWN0ZWRfcmVzdHJpY3RlZF9jdG9yZHRvcikKLSAgICAgICAgPDwgaXNhPENYWERlc3RydWN0b3JEZWNsPihEKTsKLSAgICAgIHJldHVybiB0cnVlOworICAgICAgcmV0dXJuIFMuRGlhZyhELT5nZXRMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICBkaWFnOjpub3RlX2FjY2Vzc19wcm90ZWN0ZWRfcmVzdHJpY3RlZF9jdG9yZHRvcikKKyAgICAgICAgICAgICA8PCBpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KEQtPmdldEFzRnVuY3Rpb24oKSk7CiAgICAgfQogCiAgICAgLy8gT3RoZXJ3aXNlLCB1c2UgdGhlIGdlbmVyaWMgZGlhZ25vc3RpYy4KLSAgICBTLkRpYWcoRC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9hY2Nlc3NfcHJvdGVjdGVkX3Jlc3RyaWN0ZWRfb2JqZWN0KQotICAgICAgPDwgUy5Db250ZXh0LmdldFR5cGVEZWNsVHlwZShFQ1JlY29yZCk7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFMuRGlhZyhELT5nZXRMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgZGlhZzo6bm90ZV9hY2Nlc3NfcHJvdGVjdGVkX3Jlc3RyaWN0ZWRfb2JqZWN0KQorICAgICAgICAgICA8PCBTLkNvbnRleHQuZ2V0VHlwZURlY2xUeXBlKEVDUmVjb3JkKTsKICAgfQogCiAgIHJldHVybiBmYWxzZTsKQEAgLTExNDAsMTEgKzExMzEsOSBAQAogICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlJ3MgYW4gQWNjZXNzU3BlY0RlY2wgcHJlY2VkaW5nIHRoaXMgaW4gdGhlCiAgIC8vIGNoYWluIG9mIHRoZSBEZWNsQ29udGV4dC4KICAgYm9vbCBpc0ltcGxpY2l0ID0gdHJ1ZTsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpkZWNsX2l0ZXJhdG9yCi0gICAgICAgICBJID0gRGVjbGFyaW5nQ2xhc3MtPmRlY2xzX2JlZ2luKCksIEUgPSBEZWNsYXJpbmdDbGFzcy0+ZGVjbHNfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoKkkgPT0gSW1tZWRpYXRlQ2hpbGQpIGJyZWFrOwotICAgIGlmIChpc2E8QWNjZXNzU3BlY0RlY2w+KCpJKSkgeworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBEZWNsYXJpbmdDbGFzcy0+ZGVjbHMoKSkgeworICAgIGlmIChJID09IEltbWVkaWF0ZUNoaWxkKSBicmVhazsKKyAgICBpZiAoaXNhPEFjY2Vzc1NwZWNEZWNsPihJKSkgewogICAgICAgaXNJbXBsaWNpdCA9IGZhbHNlOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMTQyMiwxNiArMTQxMSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NUYXJnZXQgJkVudGl0eSkgewogICBhc3NlcnQoRW50aXR5LmdldEFjY2VzcygpICE9IEFTX3B1YmxpYyAmJiAiY2FsbGVkIGZvciBwdWJsaWMgYWNjZXNzISIpOwogCi0gIGlmIChTLmdldExhbmdPcHRzKCkuTWljcm9zb2Z0TW9kZSAmJgotICAgICAgSXNNaWNyb3NvZnRVc2luZ0RlY2xhcmF0aW9uQWNjZXNzQnVnKFMsIExvYywgRW50aXR5KSkKLSAgICByZXR1cm4gQVJfYWNjZXNzaWJsZTsKLQogICBzd2l0Y2ggKElzQWNjZXNzaWJsZShTLCBFQywgRW50aXR5KSkgewogICBjYXNlIEFSX2RlcGVuZGVudDoKICAgICBEZWxheURlcGVuZGVudEFjY2VzcyhTLCBFQywgTG9jLCBFbnRpdHkpOwogICAgIHJldHVybiBBUl9kZXBlbmRlbnQ7CiAKICAgY2FzZSBBUl9pbmFjY2Vzc2libGU6CisgICAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0ICYmCisgICAgICAgIElzTWljcm9zb2Z0VXNpbmdEZWNsYXJhdGlvbkFjY2Vzc0J1ZyhTLCBMb2MsIEVudGl0eSkpCisgICAgICByZXR1cm4gQVJfYWNjZXNzaWJsZTsKICAgICBpZiAoIUVudGl0eS5pc1F1aWV0KCkpCiAgICAgICBEaWFnbm9zZUJhZEFjY2VzcyhTLCBMb2MsIEVDLCBFbnRpdHkpOwogICAgIHJldHVybiBBUl9pbmFjY2Vzc2libGU7CkBAIC0xNDgyLDExICsxNDcwLDEwIEBACiAgIC8vIEhvd2V2ZXIsIHRoaXMgZG9lcyBub3QgYXBwbHkgdG8gbG9jYWwgZXh0ZXJuIGRlY2xhcmF0aW9ucy4KIAogICBEZWNsQ29udGV4dCAqREMgPSBELT5nZXREZWNsQ29udGV4dCgpOwotICBpZiAoRnVuY3Rpb25EZWNsICpGTiA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICBpZiAoRC0+Z2V0TGV4aWNhbERlY2xDb250ZXh0KCktPmlzRnVuY3Rpb25Pck1ldGhvZCgpKQotICAgICAgREMgPSBELT5nZXRMZXhpY2FsRGVjbENvbnRleHQoKTsKLSAgICBlbHNlCi0gICAgICBEQyA9IEZOOworICBpZiAoRC0+aXNMb2NhbEV4dGVybkRlY2woKSkgeworICAgIERDID0gRC0+Z2V0TGV4aWNhbERlY2xDb250ZXh0KCk7CisgIH0gZWxzZSBpZiAoRnVuY3Rpb25EZWNsICpGTiA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oRCkpIHsKKyAgICBEQyA9IEZOOwogICB9IGVsc2UgaWYgKFRlbXBsYXRlRGVjbCAqVEQgPSBkeW5fY2FzdDxUZW1wbGF0ZURlY2w+KEQpKSB7CiAgICAgREMgPSBjYXN0PERlY2xDb250ZXh0PihURC0+Z2V0VGVtcGxhdGVkRGVjbCgpKTsKICAgfQpAQCAtMTc1MCwxMCArMTczNyw3IEBACiAKIC8vLyBDaGVja3MgYWNjZXNzIHRvIHRoZSB0YXJnZXQgb2YgYSBmcmllbmQgZGVjbGFyYXRpb24uCiBTZW1hOjpBY2Nlc3NSZXN1bHQgU2VtYTo6Q2hlY2tGcmllbmRBY2Nlc3MoTmFtZWREZWNsICp0YXJnZXQpIHsKLSAgYXNzZXJ0KGlzYTxDWFhNZXRob2REZWNsPih0YXJnZXQpIHx8Ci0gICAgICAgICAoaXNhPEZ1bmN0aW9uVGVtcGxhdGVEZWNsPih0YXJnZXQpICYmCi0gICAgICAgICAgaXNhPENYWE1ldGhvZERlY2w+KGNhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KHRhcmdldCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmdldFRlbXBsYXRlZERlY2woKSkpKTsKKyAgYXNzZXJ0KGlzYTxDWFhNZXRob2REZWNsPih0YXJnZXQtPmdldEFzRnVuY3Rpb24oKSkpOwogCiAgIC8vIEZyaWVuZHNoaXAgbG9va3VwIGlzIGEgcmVkZWNsYXJhdGlvbiBsb29rdXAsIHNvIHRoZXJlJ3MgbmV2ZXIgYW4KICAgLy8gaW5oZXJpdGFuY2UgcGF0aCBtb2RpZnlpbmcgYWNjZXNzLgpAQCAtMTc2MiwxMCArMTc0Niw3IEBACiAgIGlmICghZ2V0TGFuZ09wdHMoKS5BY2Nlc3NDb250cm9sIHx8IGFjY2VzcyA9PSBBU19wdWJsaWMpCiAgICAgcmV0dXJuIEFSX2FjY2Vzc2libGU7CiAKLSAgQ1hYTWV0aG9kRGVjbCAqbWV0aG9kID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4odGFyZ2V0KTsKLSAgaWYgKCFtZXRob2QpCi0gICAgbWV0aG9kID0gY2FzdDxDWFhNZXRob2REZWNsPigKLSAgICAgICAgICAgICAgICAgICAgIGNhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KHRhcmdldCktPmdldFRlbXBsYXRlZERlY2woKSk7CisgIENYWE1ldGhvZERlY2wgKm1ldGhvZCA9IGNhc3Q8Q1hYTWV0aG9kRGVjbD4odGFyZ2V0LT5nZXRBc0Z1bmN0aW9uKCkpOwogICBhc3NlcnQobWV0aG9kLT5nZXRRdWFsaWZpZXIoKSk7CiAKICAgQWNjZXNzVGFyZ2V0IGVudGl0eShDb250ZXh0LCBBY2Nlc3NUYXJnZXQ6Ok1lbWJlciwKZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1NlbWFBdHRyLmNwcCBiL2xpYi9TZW1hL1NlbWFBdHRyLmNwcAppbmRleCA4ZjlhYjMyLi4yZTM0NGZmIDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hQXR0ci5jcHAKKysrIGIvbGliL1NlbWEvU2VtYUF0dHIuY3BwCkBAIC0xMjIsMTggKzEyMiwyMyBAQAogICAvLyBPdGhlcndpc2UsIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIGEgbWF4IGZpZWxkIGFsaWdubWVudCBhdHRyaWJ1dGUuCiAgIGlmICh1bnNpZ25lZCBBbGlnbm1lbnQgPSBTdGFjay0+Z2V0QWxpZ25tZW50KCkpIHsKICAgICBpZiAoQWxpZ25tZW50ID09IFBhY2tTdGFja0VudHJ5OjprTWFjNjhrQWxpZ25tZW50U2VudGluZWwpCi0gICAgICBSRC0+YWRkQXR0cig6Om5ldyAoQ29udGV4dCkgQWxpZ25NYWM2OGtBdHRyKFNvdXJjZUxvY2F0aW9uKCksIENvbnRleHQpKTsKKyAgICAgIFJELT5hZGRBdHRyKEFsaWduTWFjNjhrQXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCkpOwogICAgIGVsc2UKLSAgICAgIFJELT5hZGRBdHRyKDo6bmV3IChDb250ZXh0KSBNYXhGaWVsZEFsaWdubWVudEF0dHIoU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCwKKyAgICAgIFJELT5hZGRBdHRyKE1heEZpZWxkQWxpZ25tZW50QXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50ICogOCkpOwogICB9CiB9CiAKIHZvaWQgU2VtYTo6QWRkTXNTdHJ1Y3RMYXlvdXRGb3JSZWNvcmQoUmVjb3JkRGVjbCAqUkQpIHsKLSAgaWYgKCFNU1N0cnVjdFByYWdtYU9uKQotICAgIHJldHVybjsKLSAgUkQtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIE1zU3RydWN0QXR0cihTb3VyY2VMb2NhdGlvbigpLCBDb250ZXh0KSk7CisgIGlmIChNU1N0cnVjdFByYWdtYU9uKQorICAgIFJELT5hZGRBdHRyKE1zU3RydWN0QXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCkpOworCisgIC8vIEZJWE1FOiBXZSBzaG91bGQgbWVyZ2UgQWRkQWxpZ25tZW50QXR0cmlidXRlc0ZvclJlY29yZCB3aXRoCisgIC8vIEFkZE1zU3RydWN0TGF5b3V0Rm9yUmVjb3JkIGludG8gQWRkUHJhZ21hQXR0cmlidXRlc0ZvclJlY29yZCwgd2hpY2ggdGFrZXMKKyAgLy8gYWxsIGFjdGl2ZSBwcmFnbWFzIGFuZCBhcHBsaWVzIHRoZW0gYXMgYXR0cmlidXRlcyB0byBjbGFzcyBkZWZpbml0aW9ucy4KKyAgaWYgKFZ0b3JEaXNwTW9kZVN0YWNrLmJhY2soKSAhPSBnZXRMYW5nT3B0cygpLlZ0b3JEaXNwTW9kZSkKKyAgICBSRC0+YWRkQXR0cigKKyAgICAgICAgTVNWdG9yRGlzcEF0dHI6OkNyZWF0ZUltcGxpY2l0KENvbnRleHQsIFZ0b3JEaXNwTW9kZVN0YWNrLmJhY2soKSkpOwogfQogCiB2b2lkIFNlbWE6OkFjdE9uUHJhZ21hT3B0aW9uc0FsaWduKFByYWdtYU9wdGlvbnNBbGlnbktpbmQgS2luZCwKQEAgLTI0Nyw4ICsyNTIsOCBAQAogICAgICAgLy8gSWYgYSBuYW1lIHdhcyBzcGVjaWZpZWQgdGhlbiBmYWlsdXJlIGluZGljYXRlcyB0aGUgbmFtZQogICAgICAgLy8gd2Fzbid0IGZvdW5kLiBPdGhlcndpc2UgZmFpbHVyZSBpbmRpY2F0ZXMgdGhlIHN0YWNrIHdhcwogICAgICAgLy8gZW1wdHkuCi0gICAgICBEaWFnKFByYWdtYUxvYywgZGlhZzo6d2Fybl9wcmFnbWFfcGFja19wb3BfZmFpbGVkKQotICAgICAgICA8PCAoTmFtZSA/ICJubyByZWNvcmQgbWF0Y2hpbmcgbmFtZSIgOiAic3RhY2sgZW1wdHkiKTsKKyAgICAgIERpYWcoUHJhZ21hTG9jLCBkaWFnOjp3YXJuX3ByYWdtYV9wb3BfZmFpbGVkKQorICAgICAgICAgIDw8ICJwYWNrIiA8PCAoTmFtZSA/ICJubyByZWNvcmQgbWF0Y2hpbmcgbmFtZSIgOiAic3RhY2sgZW1wdHkiKTsKIAogICAgICAgLy8gRklYTUU6IFdhcm4gYWJvdXQgcG9wcGluZyBuYW1lZCByZWNvcmRzIGFzIE1TVkMgZG9lcy4KICAgICB9IGVsc2UgewpAQCAtMjg4LDYgKzI5MywzOCBAQAogICBDb25zdW1lci5IYW5kbGVEZXRlY3RNaXNtYXRjaChOYW1lLCBWYWx1ZSk7CiB9CiAKK3ZvaWQgU2VtYTo6QWN0T25QcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzKAorICAgIExhbmdPcHRpb25zOjpQcmFnbWFNU1BvaW50ZXJzVG9NZW1iZXJzS2luZCBSZXByZXNlbnRhdGlvbk1ldGhvZCwKKyAgICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2MpIHsKKyAgTVNQb2ludGVyVG9NZW1iZXJSZXByZXNlbnRhdGlvbk1ldGhvZCA9IFJlcHJlc2VudGF0aW9uTWV0aG9kOworICBJbXBsaWNpdE1TSW5oZXJpdGFuY2VBdHRyTG9jID0gUHJhZ21hTG9jOworfQorCit2b2lkIFNlbWE6OkFjdE9uUHJhZ21hTVNWdG9yRGlzcChQcmFnbWFWdG9yRGlzcEtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFByYWdtYUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TVnRvckRpc3BBdHRyOjpNb2RlIE1vZGUpIHsKKyAgc3dpdGNoIChLaW5kKSB7CisgIGNhc2UgUFZES19TZXQ6CisgICAgVnRvckRpc3BNb2RlU3RhY2suYmFjaygpID0gTW9kZTsKKyAgICBicmVhazsKKyAgY2FzZSBQVkRLX1B1c2g6CisgICAgVnRvckRpc3BNb2RlU3RhY2sucHVzaF9iYWNrKE1vZGUpOworICAgIGJyZWFrOworICBjYXNlIFBWREtfUmVzZXQ6CisgICAgVnRvckRpc3BNb2RlU3RhY2suY2xlYXIoKTsKKyAgICBWdG9yRGlzcE1vZGVTdGFjay5wdXNoX2JhY2soTVNWdG9yRGlzcEF0dHI6Ok1vZGUoTGFuZ09wdHMuVnRvckRpc3BNb2RlKSk7CisgICAgYnJlYWs7CisgIGNhc2UgUFZES19Qb3A6CisgICAgVnRvckRpc3BNb2RlU3RhY2sucG9wX2JhY2soKTsKKyAgICBpZiAoVnRvckRpc3BNb2RlU3RhY2suZW1wdHkoKSkgeworICAgICAgRGlhZyhQcmFnbWFMb2MsIGRpYWc6Ondhcm5fcHJhZ21hX3BvcF9mYWlsZWQpIDw8ICJ2dG9yZGlzcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhY2sgZW1wdHkiOworICAgICAgVnRvckRpc3BNb2RlU3RhY2sucHVzaF9iYWNrKE1TVnRvckRpc3BBdHRyOjpNb2RlKExhbmdPcHRzLlZ0b3JEaXNwTW9kZSkpOworICAgIH0KKyAgICBicmVhazsKKyAgfQorfQorCiB2b2lkIFNlbWE6OkFjdE9uUHJhZ21hVW51c2VkKGNvbnN0IFRva2VuICZJZFRvaywgU2NvcGUgKmN1clNjb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBQcmFnbWFMb2MpIHsKIApAQCAtMzEyLDcgKzM0OSw3IEBACiAgIGlmIChWRC0+aXNVc2VkKCkpCiAgICAgRGlhZyhQcmFnbWFMb2MsIGRpYWc6Ondhcm5fdXNlZF9idXRfbWFya2VkX3VudXNlZCkgPDwgTmFtZTsKIAotICBWRC0+YWRkQXR0cig6Om5ldyAoQ29udGV4dCkgVW51c2VkQXR0cihJZFRvay5nZXRMb2NhdGlvbigpLCBDb250ZXh0KSk7CisgIFZELT5hZGRBdHRyKFVudXNlZEF0dHI6OkNyZWF0ZUltcGxpY2l0KENvbnRleHQsIElkVG9rLmdldExvY2F0aW9uKCkpKTsKIH0KIAogdm9pZCBTZW1hOjpBZGRDRkF1ZGl0ZWRBdHRyaWJ1dGUoRGVjbCAqRCkgewpAQCAtMzI0LDExICszNjEsMTEgQEAKICAgICAgIEQtPmhhc0F0dHI8Q0ZVbmtub3duVHJhbnNmZXJBdHRyPigpKQogICAgIHJldHVybjsKIAotICBELT5hZGRBdHRyKDo6bmV3IChDb250ZXh0KSBDRkF1ZGl0ZWRUcmFuc2ZlckF0dHIoTG9jLCBDb250ZXh0KSk7CisgIEQtPmFkZEF0dHIoQ0ZBdWRpdGVkVHJhbnNmZXJBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LCBMb2MpKTsKIH0KIAogdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIFNvdXJjZUxvY2F0aW9uPiA+IFZpc1N0YWNrOwotZW51bSB7IE5vVmlzaWJpbGl0eSA9ICh1bnNpZ25lZCkgLTEgfTsKK2VudW0gOiB1bnNpZ25lZCB7IE5vVmlzaWJpbGl0eSA9IH4wVSB9OwogCiB2b2lkIFNlbWE6OkFkZFB1c2hlZFZpc2liaWxpdHlBdHRyaWJ1dGUoRGVjbCAqRCkgewogICBpZiAoIVZpc0NvbnRleHQpCkBAIC0zNDYsNyArMzgzLDcgQEAKICAgICA9IChWaXNpYmlsaXR5QXR0cjo6VmlzaWJpbGl0eVR5cGUpIHJhd1R5cGU7CiAgIFNvdXJjZUxvY2F0aW9uIGxvYyA9IFN0YWNrLT5iYWNrKCkuc2Vjb25kOwogCi0gIEQtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIFZpc2liaWxpdHlBdHRyKGxvYywgQ29udGV4dCwgdHlwZSkpOworICBELT5hZGRBdHRyKFZpc2liaWxpdHlBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LCB0eXBlLCBsb2MpKTsKIH0KIAogLy8vIEZyZWVWaXNDb250ZXh0IC0gRGVhbGxvY2F0ZSBhbmQgbnVsbCBvdXQgVmlzQ29udGV4dC4KZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1NlbWFDWFhTY29wZVNwZWMuY3BwIGIvbGliL1NlbWEvU2VtYUNYWFNjb3BlU3BlYy5jcHAKaW5kZXggNTU0YTExNC4uY2U0N2NmZiAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYUNYWFNjb3BlU3BlYy5jcHAKKysrIGIvbGliL1NlbWEvU2VtYUNYWFNjb3BlU3BlYy5jcHAKQEAgLTM2Myw3ICszNjMsNyBAQAogICBleHBsaWNpdCBOZXN0ZWROYW1lU3BlY2lmaWVyVmFsaWRhdG9yQ0NDKFNlbWEgJlNSZWYpCiAgICAgICA6IFNSZWYoU1JlZikge30KIAotICB2aXJ0dWFsIGJvb2wgVmFsaWRhdGVDYW5kaWRhdGUoY29uc3QgVHlwb0NvcnJlY3Rpb24gJmNhbmRpZGF0ZSkgeworICBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gU1JlZi5pc0FjY2VwdGFibGVOZXN0ZWROYW1lU3BlY2lmaWVyKGNhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uRGVjbCgpKTsKICAgfQogCkBAIC00ODQsNyArNDg0LDcgQEAKICAgCiAgIC8vIEZJWE1FOiBEZWFsIHdpdGggYW1iaWd1aXRpZXMgY2xlYW5seS4KIAotICBpZiAoRm91bmQuZW1wdHkoKSAmJiAhRXJyb3JSZWNvdmVyeUxvb2t1cCAmJiAhZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRNb2RlKSB7CisgIGlmIChGb3VuZC5lbXB0eSgpICYmICFFcnJvclJlY292ZXJ5TG9va3VwICYmICFnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQpIHsKICAgICAvLyBXZSBoYXZlbid0IGZvdW5kIGFueXRoaW5nLCBhbmQgd2UncmUgbm90IHJlY292ZXJpbmcgZnJvbSBhCiAgICAgLy8gZGlmZmVyZW50IGtpbmQgb2YgZXJyb3IsIHNvIGxvb2sgZm9yIHR5cG9zLgogICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lID0gRm91bmQuZ2V0TG9va3VwTmFtZSgpOwpAQCAtNjQ2LDcgKzY0Niw3IEBACiAgIC8vIHB1YmxpYzoKICAgLy8gICB2b2lkIGZvbygpIHsgRDo6Zm9vMigpOyB9CiAgIC8vIH07Ci0gIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUpIHsKKyAgaWYgKGdldExhbmdPcHRzKCkuTVNWQ0NvbXBhdCkgewogICAgIERlY2xDb250ZXh0ICpEQyA9IExvb2t1cEN0eCA/IExvb2t1cEN0eCA6IEN1ckNvbnRleHQ7CiAgICAgaWYgKERDLT5pc0RlcGVuZGVudENvbnRleHQoKSAmJiBEQy0+aXNGdW5jdGlvbk9yTWV0aG9kKCkpIHsKICAgICAgIFNTLkV4dGVuZChDb250ZXh0LCAmSWRlbnRpZmllciwgSWRlbnRpZmllckxvYywgQ0NMb2MpOwpAQCAtNjU0LDIwICs2NTQsMjMgQEAKICAgICB9CiAgIH0KIAotICB1bnNpZ25lZCBEaWFnSUQ7Ci0gIGlmICghRm91bmQuZW1wdHkoKSkKLSAgICBEaWFnSUQgPSBkaWFnOjplcnJfZXhwZWN0ZWRfY2xhc3Nfb3JfbmFtZXNwYWNlOwotICBlbHNlIGlmIChTUy5pc1NldCgpKSB7Ci0gICAgRGlhZyhJZGVudGlmaWVyTG9jLCBkaWFnOjplcnJfbm9fbWVtYmVyKSAKLSAgICAgIDw8ICZJZGVudGlmaWVyIDw8IExvb2t1cEN0eCA8PCBTUy5nZXRSYW5nZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UKLSAgICBEaWFnSUQgPSBkaWFnOjplcnJfdW5kZWNsYXJlZF92YXJfdXNlOwotCi0gIGlmIChTUy5pc1NldCgpKQotICAgIERpYWcoSWRlbnRpZmllckxvYywgRGlhZ0lEKSA8PCAmSWRlbnRpZmllciA8PCBTUy5nZXRSYW5nZSgpOworICBpZiAoIUZvdW5kLmVtcHR5KCkpIHsKKyAgICBpZiAoVHlwZURlY2wgKlREID0gRm91bmQuZ2V0QXNTaW5nbGU8VHlwZURlY2w+KCkpCisgICAgICBEaWFnKElkZW50aWZpZXJMb2MsIGRpYWc6OmVycl9leHBlY3RlZF9jbGFzc19vcl9uYW1lc3BhY2UpCisgICAgICAgICAgPDwgUXVhbFR5cGUoVEQtPmdldFR5cGVGb3JEZWNsKCksIDApIDw8IGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzOworICAgIGVsc2UgeworICAgICAgRGlhZyhJZGVudGlmaWVyTG9jLCBkaWFnOjplcnJfZXhwZWN0ZWRfY2xhc3Nfb3JfbmFtZXNwYWNlKQorICAgICAgICAgIDw8ICZJZGVudGlmaWVyIDw8IGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzOworICAgICAgaWYgKE5hbWVkRGVjbCAqTkQgPSBGb3VuZC5nZXRBc1NpbmdsZTxOYW1lZERlY2w+KCkpCisgICAgICAgIERpYWcoTkQtPmdldExvY2F0aW9uKCksCisgICAgICAgICAgICAgZGlhZzo6bm90ZV9leHBlY3RlZF9jbGFzc19vcl9uYW1lc3BhY2VfZGVjbGFyZWRfaGVyZSkKKyAgICAgICAgICA8PCAmSWRlbnRpZmllcjsKKyAgICB9CisgIH0gZWxzZSBpZiAoU1MuaXNTZXQoKSkKKyAgICBEaWFnKElkZW50aWZpZXJMb2MsIGRpYWc6OmVycl9ub19tZW1iZXIpIDw8ICZJZGVudGlmaWVyIDw8IExvb2t1cEN0eAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgU1MuZ2V0UmFuZ2UoKTsKICAgZWxzZQotICAgIERpYWcoSWRlbnRpZmllckxvYywgRGlhZ0lEKSA8PCAmSWRlbnRpZmllcjsKKyAgICBEaWFnKElkZW50aWZpZXJMb2MsIGRpYWc6OmVycl91bmRlY2xhcmVkX3Zhcl91c2UpIDw8ICZJZGVudGlmaWVyOwogCiAgIHJldHVybiB0cnVlOwogfQpAQCAtNjk4LDcgKzcwMSw3IEBACiAKICAgUXVhbFR5cGUgVCA9IEJ1aWxkRGVjbHR5cGVUeXBlKERTLmdldFJlcEFzRXhwcigpLCBEUy5nZXRUeXBlU3BlY1R5cGVMb2MoKSk7CiAgIGlmICghVC0+aXNEZXBlbmRlbnRUeXBlKCkgJiYgIVQtPmdldEFzPFRhZ1R5cGU+KCkpIHsKLSAgICBEaWFnKERTLmdldFR5cGVTcGVjVHlwZUxvYygpLCBkaWFnOjplcnJfZXhwZWN0ZWRfY2xhc3MpIAorICAgIERpYWcoRFMuZ2V0VHlwZVNwZWNUeXBlTG9jKCksIGRpYWc6OmVycl9leHBlY3RlZF9jbGFzc19vcl9uYW1lc3BhY2UpIAogICAgICAgPDwgVCA8PCBnZXRMYW5nT3B0cygpLkNQbHVzUGx1czsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtNzQ5LDcgKzc1Miw4IEBACiAgIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyBUZW1wbGF0ZUFyZ3MoTEFuZ2xlTG9jLCBSQW5nbGVMb2MpOwogICB0cmFuc2xhdGVUZW1wbGF0ZUFyZ3VtZW50cyhUZW1wbGF0ZUFyZ3NJbiwgVGVtcGxhdGVBcmdzKTsKIAotICBpZiAoRGVwZW5kZW50VGVtcGxhdGVOYW1lICpEVE4gPSBUZW1wbGF0ZS5nZXQoKS5nZXRBc0RlcGVuZGVudFRlbXBsYXRlTmFtZSgpKXsKKyAgRGVwZW5kZW50VGVtcGxhdGVOYW1lICpEVE4gPSBUZW1wbGF0ZS5nZXQoKS5nZXRBc0RlcGVuZGVudFRlbXBsYXRlTmFtZSgpOworICBpZiAoRFROICYmIERUTi0+aXNJZGVudGlmaWVyKCkpIHsKICAgICAvLyBIYW5kbGUgYSBkZXBlbmRlbnQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZm9yIHdoaWNoIHdlIGNhbm5vdCByZXNvbHZlCiAgICAgLy8gdGhlIHRlbXBsYXRlIG5hbWUuCiAgICAgYXNzZXJ0KERUTi0+Z2V0UXVhbGlmaWVyKCkgPT0gU1MuZ2V0U2NvcGVSZXAoKSk7CkBAIC03NzUsMjAgKzc3OSwyMCBAQAogICAgICAgICAgICAgICBDQ0xvYyk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIAotICAKLSAgaWYgKFRlbXBsYXRlLmdldCgpLmdldEFzT3ZlcmxvYWRlZFRlbXBsYXRlKCkgfHwKLSAgICAgIGlzYTxGdW5jdGlvblRlbXBsYXRlRGVjbD4oVGVtcGxhdGUuZ2V0KCkuZ2V0QXNUZW1wbGF0ZURlY2woKSkpIHsKKworICBUZW1wbGF0ZURlY2wgKlREID0gVGVtcGxhdGUuZ2V0KCkuZ2V0QXNUZW1wbGF0ZURlY2woKTsKKyAgaWYgKFRlbXBsYXRlLmdldCgpLmdldEFzT3ZlcmxvYWRlZFRlbXBsYXRlKCkgfHwgRFROIHx8CisgICAgICBpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KFREKSB8fCBpc2E8VmFyVGVtcGxhdGVEZWNsPihURCkpIHsKICAgICBTb3VyY2VSYW5nZSBSKFRlbXBsYXRlTmFtZUxvYywgUkFuZ2xlTG9jKTsKICAgICBpZiAoU1MuZ2V0UmFuZ2UoKS5pc1ZhbGlkKCkpCiAgICAgICBSLnNldEJlZ2luKFNTLmdldFJhbmdlKCkuZ2V0QmVnaW4oKSk7Ci0gICAgICAKKwogICAgIERpYWcoQ0NMb2MsIGRpYWc6OmVycl9ub25fdHlwZV90ZW1wbGF0ZV9pbl9uZXN0ZWRfbmFtZV9zcGVjaWZpZXIpCi0gICAgICA8PCBUZW1wbGF0ZS5nZXQoKSA8PCBSOworICAgICAgPDwgKFREICYmIGlzYTxWYXJUZW1wbGF0ZURlY2w+KFREKSkgPDwgVGVtcGxhdGUuZ2V0KCkgPDwgUjsKICAgICBOb3RlQWxsRm91bmRUZW1wbGF0ZXMoVGVtcGxhdGUuZ2V0KCkpOwogICAgIHJldHVybiB0cnVlOwogICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAgIC8vIFdlIHdlcmUgYWJsZSB0byByZXNvbHZlIHRoZSB0ZW1wbGF0ZSBuYW1lIHRvIGFuIGFjdHVhbCB0ZW1wbGF0ZS4gCiAgIC8vIEJ1aWxkIGFuIGFwcHJvcHJpYXRlIG5lc3RlZC1uYW1lLXNwZWNpZmllci4KICAgUXVhbFR5cGUgVCA9IENoZWNrVGVtcGxhdGVJZFR5cGUoVGVtcGxhdGUuZ2V0KCksIFRlbXBsYXRlTmFtZUxvYywgCmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hQ2FzdC5jcHAgYi9saWIvU2VtYS9TZW1hQ2FzdC5jcHAKaW5kZXggYmEwMGI3MS4uNWQ0OTIyNSAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYUNhc3QuY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFDYXN0LmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByT2JqQy5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9SZWNvcmRMYXlvdXQuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9QYXJ0aWFsRGlhZ25vc3RpYy5oIgorI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1RhcmdldEluZm8uaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL0luaXRpYWxpemF0aW9uLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKICNpbmNsdWRlIDxzZXQ+CkBAIC0xMzQ2LDcgKzEzNDcsOCBAQAogICBRdWFsVHlwZSBEZXN0Q2xhc3MoRGVzdE1lbVB0ci0+Z2V0Q2xhc3MoKSwgMCk7CiAgIENYWEJhc2VQYXRocyBQYXRocygvKkZpbmRBbWJpZ3VpdGllcz0qL3RydWUsIC8qUmVjb3JkUGF0aHM9Ki90cnVlLAogICAgICAgICAgICAgICAgICAgLypEZXRlY3RWaXJ0dWFsPSovdHJ1ZSk7Ci0gIGlmICghU2VsZi5Jc0Rlcml2ZWRGcm9tKFNyY0NsYXNzLCBEZXN0Q2xhc3MsIFBhdGhzKSkgeworICBpZiAoU2VsZi5SZXF1aXJlQ29tcGxldGVUeXBlKE9wUmFuZ2UuZ2V0QmVnaW4oKSwgU3JjQ2xhc3MsIDApIHx8CisgICAgICAhU2VsZi5Jc0Rlcml2ZWRGcm9tKFNyY0NsYXNzLCBEZXN0Q2xhc3MsIFBhdGhzKSkgewogICAgIHJldHVybiBUQ19Ob3RBcHBsaWNhYmxlOwogICB9CiAKQEAgLTE0MzEsNiArMTQzMywxMCBAQAogICAgICAgbXNnID0gMDsKICAgICAgIHJldHVybiBUQ19GYWlsZWQ7CiAgICAgfQorICB9IGVsc2UgaWYgKERlc3RUeXBlLT5pc01lbWJlclBvaW50ZXJUeXBlKCkpIHsKKyAgICBpZiAoU2VsZi5Db250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRDWFhBQkkoKS5pc01pY3Jvc29mdCgpKSB7CisgICAgICBTZWxmLlJlcXVpcmVDb21wbGV0ZVR5cGUoT3BSYW5nZS5nZXRCZWdpbigpLCBEZXN0VHlwZSwgMCk7CisgICAgfQogICB9CiAKICAgSW5pdGlhbGl6ZWRFbnRpdHkgRW50aXR5ID0gSW5pdGlhbGl6ZWRFbnRpdHk6OkluaXRpYWxpemVUZW1wb3JhcnkoRGVzdFR5cGUpOwpAQCAtMTc3OCw2ICsxNzg0LDEzIEBACiAgICAgICByZXR1cm4gVENfRmFpbGVkOwogICAgIH0KIAorICAgIGlmIChTZWxmLkNvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldENYWEFCSSgpLmlzTWljcm9zb2Z0KCkpIHsKKyAgICAgIC8vIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbmhlcml0YW5jZSBtb2RlbCB0aGF0IHRoZSBjbGFzcyB3aWxsIHVzZSBpZgorICAgICAgLy8gaGF2ZW4ndCB5ZXQuCisgICAgICBTZWxmLlJlcXVpcmVDb21wbGV0ZVR5cGUoT3BSYW5nZS5nZXRCZWdpbigpLCBTcmNUeXBlLCAwKTsKKyAgICAgIFNlbGYuUmVxdWlyZUNvbXBsZXRlVHlwZShPcFJhbmdlLmdldEJlZ2luKCksIERlc3RUeXBlLCAwKTsKKyAgICB9CisKICAgICAvLyBEb24ndCBhbGxvdyBjYXN0aW5nIGJldHdlZW4gbWVtYmVyIHBvaW50ZXJzIG9mIGRpZmZlcmVudCBzaXplcy4KICAgICBpZiAoU2VsZi5Db250ZXh0LmdldFR5cGVTaXplKERlc3RNZW1QdHIpICE9CiAgICAgICAgIFNlbGYuQ29udGV4dC5nZXRUeXBlU2l6ZShTcmNNZW1QdHIpKSB7CkBAIC0yMDc0LDYgKzIwODcsOCBAQAogCiAgIGlmIChTZWxmLmdldExhbmdPcHRzKCkuT2JqQ0F1dG9SZWZDb3VudCAmJiB0Y3IgPT0gVENfU3VjY2VzcykKICAgICBjaGVja09iakNBUkNDb252ZXJzaW9uKENDSyk7CisgIGVsc2UgaWYgKFNlbGYuZ2V0TGFuZ09wdHMoKS5PYmpDMSAmJiB0Y3IgPT0gVENfU3VjY2VzcykKKyAgICBTZWxmLkNoZWNrVG9sbEZyZWVCcmlkZ2VDYXN0KERlc3RUeXBlLCBTcmNFeHByLmdldCgpKTsKIAogICBpZiAodGNyICE9IFRDX1N1Y2Nlc3MgJiYgbXNnICE9IDApIHsKICAgICBpZiAoU3JjRXhwci5nZXQoKS0+Z2V0VHlwZSgpID09IFNlbGYuQ29udGV4dC5PdmVybG9hZFR5KSB7CkBAIC0yMTY4LDYgKzIxODMsMjEgQEAKIAogICBhc3NlcnQoIVNyY1R5cGUtPmlzUGxhY2Vob2xkZXJUeXBlKCkpOwogCisgIC8vIE9wZW5DTCB2MSBzNi41OiBDYXN0aW5nIGEgcG9pbnRlciB0byBhZGRyZXNzIHNwYWNlIEEgdG8gYSBwb2ludGVyIHRvCisgIC8vIGFkZHJlc3Mgc3BhY2UgQiBpcyBpbGxlZ2FsLgorICBpZiAoU2VsZi5nZXRMYW5nT3B0cygpLk9wZW5DTCAmJiBEZXN0VHlwZS0+aXNQb2ludGVyVHlwZSgpICYmCisgICAgICBTcmNUeXBlLT5pc1BvaW50ZXJUeXBlKCkpIHsKKyAgICBpZiAoRGVzdFR5cGUtPmdldFBvaW50ZWVUeXBlKCkuZ2V0QWRkcmVzc1NwYWNlKCkgIT0KKyAgICAgICAgU3JjVHlwZS0+Z2V0UG9pbnRlZVR5cGUoKS5nZXRBZGRyZXNzU3BhY2UoKSkgeworICAgICAgU2VsZi5EaWFnKE9wUmFuZ2UuZ2V0QmVnaW4oKSwKKyAgICAgICAgICAgICAgICBkaWFnOjplcnJfdHlwZWNoZWNrX2luY29tcGF0aWJsZV9hZGRyZXNzX3NwYWNlKQorICAgICAgICAgIDw8IFNyY1R5cGUgPDwgRGVzdFR5cGUgPDwgU2VtYTo6QUFfQ2FzdGluZworICAgICAgICAgIDw8IFNyY0V4cHIuZ2V0KCktPmdldFNvdXJjZVJhbmdlKCk7CisgICAgICBTcmNFeHByID0gRXhwckVycm9yKCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKICAgaWYgKFNlbGYuUmVxdWlyZUNvbXBsZXRlVHlwZShPcFJhbmdlLmdldEJlZ2luKCksIERlc3RUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6OmVycl90eXBlY2hlY2tfY2FzdF90b19pbmNvbXBsZXRlKSkgewogICAgIFNyY0V4cHIgPSBFeHByRXJyb3IoKTsKQEAgLTIzMTksNiArMjM0OSw5IEBACiAgICAgICByZXR1cm47CiAgICAgfQogICB9CisgIGVsc2UgaWYgKFNlbGYuZ2V0TGFuZ09wdHMoKS5PYmpDMSkKKyAgICBTZWxmLkNoZWNrVG9sbEZyZWVCcmlkZ2VDYXN0KERlc3RUeXBlLCBTcmNFeHByLmdldCgpKTsKKyAgCiAgIERpYWdub3NlQ2FzdE9mT2JqQ1NFTChTZWxmLCBTcmNFeHByLCBEZXN0VHlwZSk7CiAgIERpYWdub3NlQmFkRnVuY3Rpb25DYXN0KFNlbGYsIFNyY0V4cHIsIERlc3RUeXBlKTsKICAgS2luZCA9IFNlbGYuUHJlcGFyZVNjYWxhckNhc3QoU3JjRXhwciwgRGVzdFR5cGUpOwpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvU2VtYUNoZWNraW5nLmNwcCBiL2xpYi9TZW1hL1NlbWFDaGVja2luZy5jcHAKaW5kZXggMGI5NWM0OC4uMjdjYzhhMyAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYUNoZWNraW5nLmNwcAorKysgYi9saWIvU2VtYS9TZW1hQ2hlY2tpbmcuY3BwCkBAIC0zMiw5ICszMiw5IEBACiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9Mb29rdXAuaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL1Njb3BlSW5mby5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2VtYS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsQml0VmVjdG9yLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29udmVydFVURi5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgogI2luY2x1ZGUgPGxpbWl0cz4KQEAgLTE0Miw2ICsxNDIsNyBAQAogICAgIGJyZWFrOwogICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX3N0ZGFyZ19zdGFydDoKICAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl92YV9zdGFydDoKKyAgY2FzZSBCdWlsdGluOjpCSV9fdmFfc3RhcnQ6CiAgICAgaWYgKFNlbWFCdWlsdGluVkFTdGFydChUaGVDYWxsKSkKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICBicmVhazsKQEAgLTMwMiwxMSArMzAzLDE4IEBACiAgIGlmIChCdWlsdGluSUQgPj0gQnVpbHRpbjo6Rmlyc3RUU0J1aWx0aW4pIHsKICAgICBzd2l0Y2ggKENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldFRyaXBsZSgpLmdldEFyY2goKSkgewogICAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OmFybToKKyAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm1lYjoKICAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjp0aHVtYjoKKyAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjp0aHVtYmViOgogICAgICAgICBpZiAoQ2hlY2tBUk1CdWlsdGluRnVuY3Rpb25DYWxsKEJ1aWx0aW5JRCwgVGhlQ2FsbCkpCiAgICAgICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjphcm02NDoKKyAgICAgICAgaWYgKENoZWNrQVJNNjRCdWlsdGluRnVuY3Rpb25DYWxsKEJ1aWx0aW5JRCwgVGhlQ2FsbCkpCisgICAgICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOworICAgICAgICBicmVhazsKICAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjphYXJjaDY0OgorICAgICAgY2FzZSBsbHZtOjpUcmlwbGU6OmFhcmNoNjRfYmU6CiAgICAgICAgIGlmIChDaGVja0FBcmNoNjRCdWlsdGluRnVuY3Rpb25DYWxsKEJ1aWx0aW5JRCwgVGhlQ2FsbCkpCiAgICAgICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogICAgICAgICBicmVhazsKQEAgLTMxNyw2ICszMjUsMTEgQEAKICAgICAgICAgaWYgKENoZWNrTWlwc0J1aWx0aW5GdW5jdGlvbkNhbGwoQnVpbHRpbklELCBUaGVDYWxsKSkKICAgICAgICAgICByZXR1cm4gRXhwckVycm9yKCk7CiAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBsbHZtOjpUcmlwbGU6Ong4NjoKKyAgICAgIGNhc2UgbGx2bTo6VHJpcGxlOjp4ODZfNjQ6CisgICAgICAgIGlmIChDaGVja1g4NkJ1aWx0aW5GdW5jdGlvbkNhbGwoQnVpbHRpbklELCBUaGVDYWxsKSkKKyAgICAgICAgICByZXR1cm4gRXhwckVycm9yKCk7CisgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMzI2LDkgKzMzOSw5IEBACiB9CiAKIC8vIEdldCB0aGUgdmFsaWQgaW1tZWRpYXRlIHJhbmdlIGZvciB0aGUgc3BlY2lmaWVkIE5FT04gdHlwZSBjb2RlLgotc3RhdGljIHVuc2lnbmVkIFJGVCh1bnNpZ25lZCB0LCBib29sIHNoaWZ0ID0gZmFsc2UpIHsKK3N0YXRpYyB1bnNpZ25lZCBSRlQodW5zaWduZWQgdCwgYm9vbCBzaGlmdCA9IGZhbHNlLCBib29sIEZvcmNlUXVhZCA9IGZhbHNlKSB7CiAgIE5lb25UeXBlRmxhZ3MgVHlwZSh0KTsKLSAgaW50IElzUXVhZCA9IFR5cGUuaXNRdWFkKCk7CisgIGludCBJc1F1YWQgPSBGb3JjZVF1YWQgPyB0cnVlIDogVHlwZS5pc1F1YWQoKTsKICAgc3dpdGNoIChUeXBlLmdldEVsdFR5cGUoKSkgewogICBjYXNlIE5lb25UeXBlRmxhZ3M6OkludDg6CiAgIGNhc2UgTmVvblR5cGVGbGFnczo6UG9seTg6CkBAIC0zNDEsNiArMzU0LDggQEAKICAgY2FzZSBOZW9uVHlwZUZsYWdzOjpJbnQ2NDoKICAgY2FzZSBOZW9uVHlwZUZsYWdzOjpQb2x5NjQ6CiAgICAgcmV0dXJuIHNoaWZ0ID8gNjMgOiAoMSA8PCBJc1F1YWQpIC0gMTsKKyAgY2FzZSBOZW9uVHlwZUZsYWdzOjpQb2x5MTI4OgorICAgIHJldHVybiBzaGlmdCA/IDEyNyA6ICgxIDw8IElzUXVhZCkgLSAxOwogICBjYXNlIE5lb25UeXBlRmxhZ3M6OkZsb2F0MTY6CiAgICAgYXNzZXJ0KCFzaGlmdCAmJiAiY2Fubm90IHNoaWZ0IGZsb2F0IHR5cGVzISIpOwogICAgIHJldHVybiAoNCA8PCBJc1F1YWQpIC0gMTsKQEAgLTM1OCw3ICszNzMsNyBAQAogLy8vIHRoZSB2ZWN0b3IgdHlwZSBzcGVjaWZpZWQgYnkgdGhlIE5lb25UeXBlRmxhZ3MuICBUaGlzIGlzIHVzZWQgdG8gY2hlY2sKIC8vLyB0aGUgcG9pbnRlciBhcmd1bWVudHMgZm9yIE5lb24gbG9hZC9zdG9yZSBpbnRyaW5zaWNzLgogc3RhdGljIFF1YWxUeXBlIGdldE5lb25FbHRUeXBlKE5lb25UeXBlRmxhZ3MgRmxhZ3MsIEFTVENvbnRleHQgJkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0FBcmNoNjQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzUG9seVVuc2lnbmVkLCBib29sIElzSW50NjRMb25nKSB7CiAgIHN3aXRjaCAoRmxhZ3MuZ2V0RWx0VHlwZSgpKSB7CiAgIGNhc2UgTmVvblR5cGVGbGFnczo6SW50ODoKICAgICByZXR1cm4gRmxhZ3MuaXNVbnNpZ25lZCgpID8gQ29udGV4dC5VbnNpZ25lZENoYXJUeSA6IENvbnRleHQuU2lnbmVkQ2hhclR5OwpAQCAtMzY3LDEzICszODIsMTkgQEAKICAgY2FzZSBOZW9uVHlwZUZsYWdzOjpJbnQzMjoKICAgICByZXR1cm4gRmxhZ3MuaXNVbnNpZ25lZCgpID8gQ29udGV4dC5VbnNpZ25lZEludFR5IDogQ29udGV4dC5JbnRUeTsKICAgY2FzZSBOZW9uVHlwZUZsYWdzOjpJbnQ2NDoKLSAgICByZXR1cm4gRmxhZ3MuaXNVbnNpZ25lZCgpID8gQ29udGV4dC5VbnNpZ25lZExvbmdMb25nVHkgOiBDb250ZXh0LkxvbmdMb25nVHk7CisgICAgaWYgKElzSW50NjRMb25nKQorICAgICAgcmV0dXJuIEZsYWdzLmlzVW5zaWduZWQoKSA/IENvbnRleHQuVW5zaWduZWRMb25nVHkgOiBDb250ZXh0LkxvbmdUeTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gRmxhZ3MuaXNVbnNpZ25lZCgpID8gQ29udGV4dC5VbnNpZ25lZExvbmdMb25nVHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDb250ZXh0LkxvbmdMb25nVHk7CiAgIGNhc2UgTmVvblR5cGVGbGFnczo6UG9seTg6Ci0gICAgcmV0dXJuIElzQUFyY2g2NCA/IENvbnRleHQuVW5zaWduZWRDaGFyVHkgOiBDb250ZXh0LlNpZ25lZENoYXJUeTsKKyAgICByZXR1cm4gSXNQb2x5VW5zaWduZWQgPyBDb250ZXh0LlVuc2lnbmVkQ2hhclR5IDogQ29udGV4dC5TaWduZWRDaGFyVHk7CiAgIGNhc2UgTmVvblR5cGVGbGFnczo6UG9seTE2OgotICAgIHJldHVybiBJc0FBcmNoNjQgPyBDb250ZXh0LlVuc2lnbmVkU2hvcnRUeSA6IENvbnRleHQuU2hvcnRUeTsKKyAgICByZXR1cm4gSXNQb2x5VW5zaWduZWQgPyBDb250ZXh0LlVuc2lnbmVkU2hvcnRUeSA6IENvbnRleHQuU2hvcnRUeTsKICAgY2FzZSBOZW9uVHlwZUZsYWdzOjpQb2x5NjQ6Ci0gICAgcmV0dXJuIENvbnRleHQuVW5zaWduZWRMb25nTG9uZ1R5OworICAgIHJldHVybiBDb250ZXh0LlVuc2lnbmVkTG9uZ1R5OworICBjYXNlIE5lb25UeXBlRmxhZ3M6OlBvbHkxMjg6CisgICAgYnJlYWs7CiAgIGNhc2UgTmVvblR5cGVGbGFnczo6RmxvYXQxNjoKICAgICByZXR1cm4gQ29udGV4dC5IYWxmVHk7CiAgIGNhc2UgTmVvblR5cGVGbGFnczo6RmxvYXQzMjoKQEAgLTM4NCwyNCArNDA1LDIxIEBACiAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgTmVvblR5cGVGbGFnISIpOwogfQogCi1ib29sIFNlbWE6OkNoZWNrQUFyY2g2NEJ1aWx0aW5GdW5jdGlvbkNhbGwodW5zaWduZWQgQnVpbHRpbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxFeHByICpUaGVDYWxsKSB7Ci0KK2Jvb2wgU2VtYTo6Q2hlY2tOZW9uQnVpbHRpbkZ1bmN0aW9uQ2FsbCh1bnNpZ25lZCBCdWlsdGluSUQsIENhbGxFeHByICpUaGVDYWxsKSB7CiAgIGxsdm06OkFQU0ludCBSZXN1bHQ7Ci0KICAgdWludDY0X3QgbWFzayA9IDA7CiAgIHVuc2lnbmVkIFRWID0gMDsKICAgaW50IFB0ckFyZ051bSA9IC0xOwogICBib29sIEhhc0NvbnN0UHRyID0gZmFsc2U7CiAgIHN3aXRjaCAoQnVpbHRpbklEKSB7Ci0jZGVmaW5lIEdFVF9ORU9OX0FBUkNINjRfT1ZFUkxPQURfQ0hFQ0sKKyNkZWZpbmUgR0VUX05FT05fT1ZFUkxPQURfQ0hFQ0sKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9hcm1fbmVvbi5pbmMiCi0jdW5kZWYgR0VUX05FT05fQUFSQ0g2NF9PVkVSTE9BRF9DSEVDSworI3VuZGVmIEdFVF9ORU9OX09WRVJMT0FEX0NIRUNLCiAgIH0KIAogICAvLyBGb3IgTkVPTiBpbnRyaW5zaWNzIHdoaWNoIGFyZSBvdmVybG9hZGVkIG9uIHZlY3RvciBlbGVtZW50IHR5cGUsIHZhbGlkYXRlCiAgIC8vIHRoZSBpbW1lZGlhdGUgd2hpY2ggc3BlY2lmaWVzIHdoaWNoIHZhcmlhbnQgdG8gZW1pdC4KLSAgdW5zaWduZWQgSW1tQXJnID0gVGhlQ2FsbC0+Z2V0TnVtQXJncygpIC0gMTsKKyAgdW5zaWduZWQgSW1tQXJnID0gVGhlQ2FsbC0+Z2V0TnVtQXJncygpLTE7CiAgIGlmIChtYXNrKSB7CiAgICAgaWYgKFNlbWFCdWlsdGluQ29uc3RhbnRBcmcoVGhlQ2FsbCwgSW1tQXJnLCBSZXN1bHQpKQogICAgICAgcmV0dXJuIHRydWU7CkBAIC00MDksNyArNDI3LDcgQEAKICAgICBUViA9IFJlc3VsdC5nZXRMaW1pdGVkVmFsdWUoNjQpOwogICAgIGlmICgoVFYgPiA2MykgfHwgKG1hc2sgJiAoMVVMTCA8PCBUVikpID09IDApCiAgICAgICByZXR1cm4gRGlhZyhUaGVDYWxsLT5nZXRMb2NTdGFydCgpLCBkaWFnOjplcnJfaW52YWxpZF9uZW9uX3R5cGVfY29kZSkKLSAgICAgICAgICAgICA8PCBUaGVDYWxsLT5nZXRBcmcoSW1tQXJnKS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgICAgPDwgVGhlQ2FsbC0+Z2V0QXJnKEltbUFyZyktPmdldFNvdXJjZVJhbmdlKCk7CiAgIH0KIAogICBpZiAoUHRyQXJnTnVtID49IDApIHsKQEAgLTQxOSw3ICs0MzcsMTQgQEAKICAgICAgIEFyZyA9IElDRS0+Z2V0U3ViRXhwcigpOwogICAgIEV4cHJSZXN1bHQgUkhTID0gRGVmYXVsdEZ1bmN0aW9uQXJyYXlMdmFsdWVDb252ZXJzaW9uKEFyZyk7CiAgICAgUXVhbFR5cGUgUkhTVHkgPSBSSFMuZ2V0KCktPmdldFR5cGUoKTsKLSAgICBRdWFsVHlwZSBFbHRUeSA9IGdldE5lb25FbHRUeXBlKE5lb25UeXBlRmxhZ3MoVFYpLCBDb250ZXh0LCB0cnVlKTsKKworICAgIGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgQXJjaCA9IENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldFRyaXBsZSgpLmdldEFyY2goKTsKKyAgICBib29sIElzUG9seVVuc2lnbmVkID0KKyAgICAgICAgQXJjaCA9PSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQgfHwgQXJjaCA9PSBsbHZtOjpUcmlwbGU6OmFybTY0OworICAgIGJvb2wgSXNJbnQ2NExvbmcgPQorICAgICAgICBDb250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRJbnQ2NFR5cGUoKSA9PSBUYXJnZXRJbmZvOjpTaWduZWRMb25nOworICAgIFF1YWxUeXBlIEVsdFR5ID0KKyAgICAgICAgZ2V0TmVvbkVsdFR5cGUoTmVvblR5cGVGbGFncyhUViksIENvbnRleHQsIElzUG9seVVuc2lnbmVkLCBJc0ludDY0TG9uZyk7CiAgICAgaWYgKEhhc0NvbnN0UHRyKQogICAgICAgRWx0VHkgPSBFbHRUeS53aXRoQ29uc3QoKTsKICAgICBRdWFsVHlwZSBMSFNUeSA9IENvbnRleHQuZ2V0UG9pbnRlclR5cGUoRWx0VHkpOwpAQCAtNDM4LDkgKzQ2Myw5IEBACiAgIHN3aXRjaCAoQnVpbHRpbklEKSB7CiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIGZhbHNlOwotI2RlZmluZSBHRVRfTkVPTl9BQVJDSDY0X0lNTUVESUFURV9DSEVDSworI2RlZmluZSBHRVRfTkVPTl9JTU1FRElBVEVfQ0hFQ0sKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9hcm1fbmVvbi5pbmMiCi0jdW5kZWYgR0VUX05FT05fQUFSQ0g2NF9JTU1FRElBVEVfQ0hFQ0sKKyN1bmRlZiBHRVRfTkVPTl9JTU1FRElBVEVfQ0hFQ0sKICAgfQogICA7CiAKQEAgLTQ2MiwxMSArNDg3LDIzIEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBTZW1hOjpDaGVja0FSTUJ1aWx0aW5FeGNsdXNpdmVDYWxsKHVuc2lnbmVkIEJ1aWx0aW5JRCwgQ2FsbEV4cHIgKlRoZUNhbGwpIHsKK2Jvb2wgU2VtYTo6Q2hlY2tBQXJjaDY0QnVpbHRpbkZ1bmN0aW9uQ2FsbCh1bnNpZ25lZCBCdWlsdGluSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEV4cHIgKlRoZUNhbGwpIHsKKyAgaWYgKENoZWNrTmVvbkJ1aWx0aW5GdW5jdGlvbkNhbGwoQnVpbHRpbklELCBUaGVDYWxsKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU2VtYTo6Q2hlY2tBUk1CdWlsdGluRXhjbHVzaXZlQ2FsbCh1bnNpZ25lZCBCdWlsdGluSUQsIENhbGxFeHByICpUaGVDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heFdpZHRoKSB7CiAgIGFzc2VydCgoQnVpbHRpbklEID09IEFSTTo6QklfX2J1aWx0aW5fYXJtX2xkcmV4IHx8Ci0gICAgICAgICAgQnVpbHRpbklEID09IEFSTTo6QklfX2J1aWx0aW5fYXJtX3N0cmV4KSAmJgorICAgICAgICAgIEJ1aWx0aW5JRCA9PSBBUk06OkJJX19idWlsdGluX2FybV9zdHJleCB8fAorICAgICAgICAgIEJ1aWx0aW5JRCA9PSBBUk02NDo6QklfX2J1aWx0aW5fYXJtX2xkcmV4IHx8CisgICAgICAgICAgQnVpbHRpbklEID09IEFSTTY0OjpCSV9fYnVpbHRpbl9hcm1fc3RyZXgpICYmCiAgICAgICAgICAidW5leHBlY3RlZCBBUk0gYnVpbHRpbiIpOwotICBib29sIElzTGRyZXggPSBCdWlsdGluSUQgPT0gQVJNOjpCSV9fYnVpbHRpbl9hcm1fbGRyZXg7CisgIGJvb2wgSXNMZHJleCA9IEJ1aWx0aW5JRCA9PSBBUk06OkJJX19idWlsdGluX2FybV9sZHJleCB8fAorICAgICAgICAgICAgICAgICBCdWlsdGluSUQgPT0gQVJNNjQ6OkJJX19idWlsdGluX2FybV9sZHJleDsKIAogICBEZWNsUmVmRXhwciAqRFJFID1jYXN0PERlY2xSZWZFeHByPihUaGVDYWxsLT5nZXRDYWxsZWUoKS0+SWdub3JlUGFyZW5DYXN0cygpKTsKIApAQCAtNTI3LDcgKzU2NCw4IEBACiAgIH0KIAogICAvLyBCdXQgQVJNIGRvZXNuJ3QgaGF2ZSBpbnN0cnVjdGlvbnMgdG8gZGVhbCB3aXRoIDEyOC1iaXQgdmVyc2lvbnMuCi0gIGlmIChDb250ZXh0LmdldFR5cGVTaXplKFZhbFR5cGUpID4gNjQpIHsKKyAgaWYgKENvbnRleHQuZ2V0VHlwZVNpemUoVmFsVHlwZSkgPiBNYXhXaWR0aCkgeworICAgIGFzc2VydChNYXhXaWR0aCA9PSA2NCAmJiAiRGlhZ25vc3RpYyB1bmV4cGVjdGVkbHkgaW5hY2N1cmF0ZSIpOwogICAgIERpYWcoRFJFLT5nZXRMb2NTdGFydCgpLCBkaWFnOjplcnJfYXRvbWljX2V4Y2x1c2l2ZV9idWlsdGluX3BvaW50ZXJfc2l6ZSkKICAgICAgIDw8IFBvaW50ZXJBcmctPmdldFR5cGUoKSA8PCBQb2ludGVyQXJnLT5nZXRTb3VyY2VSYW5nZSgpOwogICAgIHJldHVybiB0cnVlOwpAQCAtNTczLDUzICs2MTEsMTMgQEAKIAogICBpZiAoQnVpbHRpbklEID09IEFSTTo6QklfX2J1aWx0aW5fYXJtX2xkcmV4IHx8CiAgICAgICBCdWlsdGluSUQgPT0gQVJNOjpCSV9fYnVpbHRpbl9hcm1fc3RyZXgpIHsKLSAgICByZXR1cm4gQ2hlY2tBUk1CdWlsdGluRXhjbHVzaXZlQ2FsbChCdWlsdGluSUQsIFRoZUNhbGwpOworICAgIHJldHVybiBDaGVja0FSTUJ1aWx0aW5FeGNsdXNpdmVDYWxsKEJ1aWx0aW5JRCwgVGhlQ2FsbCwgNjQpOwogICB9CiAKLSAgdWludDY0X3QgbWFzayA9IDA7Ci0gIHVuc2lnbmVkIFRWID0gMDsKLSAgaW50IFB0ckFyZ051bSA9IC0xOwotICBib29sIEhhc0NvbnN0UHRyID0gZmFsc2U7Ci0gIHN3aXRjaCAoQnVpbHRpbklEKSB7Ci0jZGVmaW5lIEdFVF9ORU9OX09WRVJMT0FEX0NIRUNLCi0jaW5jbHVkZSAiY2xhbmcvQmFzaWMvYXJtX25lb24uaW5jIgotI3VuZGVmIEdFVF9ORU9OX09WRVJMT0FEX0NIRUNLCi0gIH0KLSAgCi0gIC8vIEZvciBORU9OIGludHJpbnNpY3Mgd2hpY2ggYXJlIG92ZXJsb2FkZWQgb24gdmVjdG9yIGVsZW1lbnQgdHlwZSwgdmFsaWRhdGUKLSAgLy8gdGhlIGltbWVkaWF0ZSB3aGljaCBzcGVjaWZpZXMgd2hpY2ggdmFyaWFudCB0byBlbWl0LgotICB1bnNpZ25lZCBJbW1BcmcgPSBUaGVDYWxsLT5nZXROdW1BcmdzKCktMTsKLSAgaWYgKG1hc2spIHsKLSAgICBpZiAoU2VtYUJ1aWx0aW5Db25zdGFudEFyZyhUaGVDYWxsLCBJbW1BcmcsIFJlc3VsdCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgICBUViA9IFJlc3VsdC5nZXRMaW1pdGVkVmFsdWUoNjQpOwotICAgIGlmICgoVFYgPiA2MykgfHwgKG1hc2sgJiAoMVVMTCA8PCBUVikpID09IDApCi0gICAgICByZXR1cm4gRGlhZyhUaGVDYWxsLT5nZXRMb2NTdGFydCgpLCBkaWFnOjplcnJfaW52YWxpZF9uZW9uX3R5cGVfY29kZSkKLSAgICAgICAgPDwgVGhlQ2FsbC0+Z2V0QXJnKEltbUFyZyktPmdldFNvdXJjZVJhbmdlKCk7Ci0gIH0KKyAgaWYgKENoZWNrTmVvbkJ1aWx0aW5GdW5jdGlvbkNhbGwoQnVpbHRpbklELCBUaGVDYWxsKSkKKyAgICByZXR1cm4gdHJ1ZTsKIAotICBpZiAoUHRyQXJnTnVtID49IDApIHsKLSAgICAvLyBDaGVjayB0aGF0IHBvaW50ZXIgYXJndW1lbnRzIGhhdmUgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgIEV4cHIgKkFyZyA9IFRoZUNhbGwtPmdldEFyZyhQdHJBcmdOdW0pOwotICAgIGlmIChJbXBsaWNpdENhc3RFeHByICpJQ0UgPSBkeW5fY2FzdDxJbXBsaWNpdENhc3RFeHByPihBcmcpKQotICAgICAgQXJnID0gSUNFLT5nZXRTdWJFeHByKCk7Ci0gICAgRXhwclJlc3VsdCBSSFMgPSBEZWZhdWx0RnVuY3Rpb25BcnJheUx2YWx1ZUNvbnZlcnNpb24oQXJnKTsKLSAgICBRdWFsVHlwZSBSSFNUeSA9IFJIUy5nZXQoKS0+Z2V0VHlwZSgpOwotICAgIFF1YWxUeXBlIEVsdFR5ID0gZ2V0TmVvbkVsdFR5cGUoTmVvblR5cGVGbGFncyhUViksIENvbnRleHQsIGZhbHNlKTsKLSAgICBpZiAoSGFzQ29uc3RQdHIpCi0gICAgICBFbHRUeSA9IEVsdFR5LndpdGhDb25zdCgpOwotICAgIFF1YWxUeXBlIExIU1R5ID0gQ29udGV4dC5nZXRQb2ludGVyVHlwZShFbHRUeSk7Ci0gICAgQXNzaWduQ29udmVydFR5cGUgQ29udlR5OwotICAgIENvbnZUeSA9IENoZWNrU2luZ2xlQXNzaWdubWVudENvbnN0cmFpbnRzKExIU1R5LCBSSFMpOwotICAgIGlmIChSSFMuaXNJbnZhbGlkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoRGlhZ25vc2VBc3NpZ25tZW50UmVzdWx0KENvbnZUeSwgQXJnLT5nZXRMb2NTdGFydCgpLCBMSFNUeSwgUkhTVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMuZ2V0KCksIEFBX0Fzc2lnbmluZykpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLy8gRm9yIE5FT04gaW50cmluc2ljcyB3aGljaCB0YWtlIGFuIGltbWVkaWF0ZSB2YWx1ZSBhcyBwYXJ0IG9mIHRoZSAKKyAgLy8gRm9yIE5FT04gaW50cmluc2ljcyB3aGljaCB0YWtlIGFuIGltbWVkaWF0ZSB2YWx1ZSBhcyBwYXJ0IG9mIHRoZQogICAvLyBpbnN0cnVjdGlvbiwgcmFuZ2UgY2hlY2sgdGhlbSBoZXJlLgogICB1bnNpZ25lZCBpID0gMCwgbCA9IDAsIHUgPSAwOwogICBzd2l0Y2ggKEJ1aWx0aW5JRCkgewpAQCAtNjMwLDkgKzYyOCw2IEBACiAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9hcm1fdmN2dHJfZDogaSA9IDE7IHUgPSAxOyBicmVhazsKICAgY2FzZSBBUk06OkJJX19idWlsdGluX2FybV9kbWI6CiAgIGNhc2UgQVJNOjpCSV9fYnVpbHRpbl9hcm1fZHNiOiBsID0gMDsgdSA9IDE1OyBicmVhazsKLSNkZWZpbmUgR0VUX05FT05fSU1NRURJQVRFX0NIRUNLCi0jaW5jbHVkZSAiY2xhbmcvQmFzaWMvYXJtX25lb24uaW5jIgotI3VuZGVmIEdFVF9ORU9OX0lNTUVESUFURV9DSEVDSwogICB9OwogCiAgIC8vIFdlIGNhbid0IGNoZWNrIHRoZSB2YWx1ZSBvZiBhIGRlcGVuZGVudCBhcmd1bWVudC4KQEAgLTY1NCw2ICs2NDksMjEgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFNlbWE6OkNoZWNrQVJNNjRCdWlsdGluRnVuY3Rpb25DYWxsKHVuc2lnbmVkIEJ1aWx0aW5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEV4cHIgKlRoZUNhbGwpIHsKKyAgbGx2bTo6QVBTSW50IFJlc3VsdDsKKworICBpZiAoQnVpbHRpbklEID09IEFSTTY0OjpCSV9fYnVpbHRpbl9hcm1fbGRyZXggfHwKKyAgICAgIEJ1aWx0aW5JRCA9PSBBUk02NDo6QklfX2J1aWx0aW5fYXJtX3N0cmV4KSB7CisgICAgcmV0dXJuIENoZWNrQVJNQnVpbHRpbkV4Y2x1c2l2ZUNhbGwoQnVpbHRpbklELCBUaGVDYWxsLCAxMjgpOworICB9CisKKyAgaWYgKENoZWNrTmVvbkJ1aWx0aW5GdW5jdGlvbkNhbGwoQnVpbHRpbklELCBUaGVDYWxsKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKIGJvb2wgU2VtYTo6Q2hlY2tNaXBzQnVpbHRpbkZ1bmN0aW9uQ2FsbCh1bnNpZ25lZCBCdWlsdGluSUQsIENhbGxFeHByICpUaGVDYWxsKSB7CiAgIHVuc2lnbmVkIGkgPSAwLCBsID0gMCwgdSA9IDA7CiAgIHN3aXRjaCAoQnVpbHRpbklEKSB7CkBAIC02ODYsNiArNjk2LDE0IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBTZW1hOjpDaGVja1g4NkJ1aWx0aW5GdW5jdGlvbkNhbGwodW5zaWduZWQgQnVpbHRpbklELCBDYWxsRXhwciAqVGhlQ2FsbCkgeworICBzd2l0Y2ggKEJ1aWx0aW5JRCkgeworICBjYXNlIFg4Njo6QklfbW1fcHJlZmV0Y2g6CisgICAgcmV0dXJuIFNlbWFCdWlsdGluTU1QcmVmZXRjaChUaGVDYWxsKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKIC8vLyBHaXZlbiBhIEZ1bmN0aW9uRGVjbCdzIEZvcm1hdEF0dHIsIGF0dGVtcHRzIHRvIHBvcHVsYXRlIHRoZSBGb21hdFN0cmluZ0luZm8KIC8vLyBwYXJhbWV0ZXIgd2l0aCB0aGUgRm9ybWF0QXR0cidzIGNvcnJlY3QgZm9ybWF0X2lkeCBhbmQgZmlyc3REYXRhQXJnLgogLy8vIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBmb3JtYXQgZml0cyB0aGUgZnVuY3Rpb24gYW5kIHRoZSBGb3JtYXRTdHJpbmdJbmZvIGhhcwpAQCAtNzA5LDE0ICs3MjcsNjkgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vLyBDaGVja3MgaWYgYSB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gbnVsbC4KKy8vLworLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGV2YWx1YXRlcyB0byBudWxsLgorc3RhdGljIGJvb2wgQ2hlY2tOb25OdWxsRXhwcihTZW1hICZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpFeHByKSB7CisgIC8vIEFzIGEgc3BlY2lhbCBjYXNlLCB0cmFuc3BhcmVudCB1bmlvbnMgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvIGFyZQorICAvLyBjb25zaWRlcmVkIG51bGwgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgbm9ubnVsbCBhdHRyaWJ1dGUuCisgIGlmIChjb25zdCBSZWNvcmRUeXBlICpVVCA9IEV4cHItPmdldFR5cGUoKS0+Z2V0QXNVbmlvblR5cGUoKSkgeworICAgIGlmIChVVC0+Z2V0RGVjbCgpLT5oYXNBdHRyPFRyYW5zcGFyZW50VW5pb25BdHRyPigpKQorICAgICAgaWYgKGNvbnN0IENvbXBvdW5kTGl0ZXJhbEV4cHIgKkNMRSA9CisgICAgICAgICAgZHluX2Nhc3Q8Q29tcG91bmRMaXRlcmFsRXhwcj4oRXhwcikpCisgICAgICAgIGlmIChjb25zdCBJbml0TGlzdEV4cHIgKklMRSA9CisgICAgICAgICAgICBkeW5fY2FzdDxJbml0TGlzdEV4cHI+KENMRS0+Z2V0SW5pdGlhbGl6ZXIoKSkpCisgICAgICAgICAgRXhwciA9IElMRS0+Z2V0SW5pdCgwKTsKKyAgfQorCisgIGJvb2wgUmVzdWx0OworICByZXR1cm4gKCFFeHByLT5pc1ZhbHVlRGVwZW5kZW50KCkgJiYKKyAgICAgICAgICBFeHByLT5FdmFsdWF0ZUFzQm9vbGVhbkNvbmRpdGlvbihSZXN1bHQsIFMuQ29udGV4dCkgJiYKKyAgICAgICAgICAhUmVzdWx0KTsKK30KKworc3RhdGljIHZvaWQgQ2hlY2tOb25OdWxsQXJndW1lbnQoU2VtYSAmUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKkFyZ0V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDYWxsU2l0ZUxvYykgeworICBpZiAoQ2hlY2tOb25OdWxsRXhwcihTLCBBcmdFeHByKSkKKyAgICBTLkRpYWcoQ2FsbFNpdGVMb2MsIGRpYWc6Ondhcm5fbnVsbF9hcmcpIDw8IEFyZ0V4cHItPmdldFNvdXJjZVJhbmdlKCk7Cit9CisKK3N0YXRpYyB2b2lkIENoZWNrTm9uTnVsbEFyZ3VtZW50cyhTZW1hICZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVkRGVjbCAqRkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqIGNvbnN0ICpFeHByQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDYWxsU2l0ZUxvYykgeworICAvLyBDaGVjayB0aGUgYXR0cmlidXRlcyBhdHRhY2hlZCB0byB0aGUgbWV0aG9kL2Z1bmN0aW9uIGl0c2VsZi4KKyAgZm9yIChjb25zdCBhdXRvICpOb25OdWxsIDogRkRlY2wtPnNwZWNpZmljX2F0dHJzPE5vbk51bGxBdHRyPigpKSB7CisgICAgZm9yIChOb25OdWxsQXR0cjo6YXJnc19pdGVyYXRvciBpID0gTm9uTnVsbC0+YXJnc19iZWdpbigpLAorICAgICAgICAgZSA9IE5vbk51bGwtPmFyZ3NfZW5kKCk7CisgICAgICAgICBpICE9IGU7ICsraSkgeworICAgICAgQ2hlY2tOb25OdWxsQXJndW1lbnQoUywgRXhwckFyZ3NbKmldLCBDYWxsU2l0ZUxvYyk7CisgICAgfQorICB9CisKKyAgLy8gQ2hlY2sgdGhlIGF0dHJpYnV0ZXMgb24gdGhlIHBhcmFtZXRlcnMuCisgIEFycmF5UmVmPFBhcm1WYXJEZWNsKj4gcGFybXM7CisgIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihGRGVjbCkpCisgICAgcGFybXMgPSBGRC0+cGFyYW1ldGVycygpOworICBlbHNlIGlmIChjb25zdCBPYmpDTWV0aG9kRGVjbCAqTUQgPSBkeW5fY2FzdDxPYmpDTWV0aG9kRGVjbD4oRkRlY2wpKQorICAgIHBhcm1zID0gTUQtPnBhcmFtZXRlcnMoKTsKKworICB1bnNpZ25lZCBhcmdJbmRleCA9IDA7CisgIGZvciAoQXJyYXlSZWY8UGFybVZhckRlY2wqPjo6aXRlcmF0b3IgSSA9IHBhcm1zLmJlZ2luKCksIEUgPSBwYXJtcy5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSwgKythcmdJbmRleCkgeworICAgIGNvbnN0IFBhcm1WYXJEZWNsICpQVkQgPSAqSTsKKyAgICBpZiAoUFZELT5oYXNBdHRyPE5vbk51bGxBdHRyPigpKQorICAgICAgQ2hlY2tOb25OdWxsQXJndW1lbnQoUywgRXhwckFyZ3NbYXJnSW5kZXhdLCBDYWxsU2l0ZUxvYyk7CisgIH0KK30KKwogLy8vIEhhbmRsZXMgdGhlIGNoZWNrcyBmb3IgZm9ybWF0IHN0cmluZ3MsIG5vbi1QT0QgYXJndW1lbnRzIHRvIHZhcmFyZwogLy8vIGZ1bmN0aW9ucywgYW5kIE5VTEwgYXJndW1lbnRzIHBhc3NlZCB0byBub24tTlVMTCBwYXJhbWV0ZXJzLgotdm9pZCBTZW1hOjpjaGVja0NhbGwoTmFtZWREZWNsICpGRGVjbCwKLSAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IEV4cHIgKj4gQXJncywKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVByb3RvQXJncywKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNNZW1iZXJGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKLSAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlLAordm9pZCBTZW1hOjpjaGVja0NhbGwoTmFtZWREZWNsICpGRGVjbCwgQXJyYXlSZWY8Y29uc3QgRXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUGFyYW1zLCBib29sIElzTWVtYmVyRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIFJhbmdlLAogICAgICAgICAgICAgICAgICAgICAgVmFyaWFkaWNDYWxsVHlwZSBDYWxsVHlwZSkgewogICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIGFzIG11Y2ggYXMgd2UgY2FuIGluIHRoZSB0ZW1wbGF0ZSBkZWZpbml0aW9uLgogICBpZiAoQ3VyQ29udGV4dC0+aXNEZXBlbmRlbnRDb250ZXh0KCkpCkBAIC03MjUsMTQgKzc5OCwxMSBAQAogICAvLyBQcmludGYgYW5kIHNjYW5mIGNoZWNraW5nLgogICBsbHZtOjpTbWFsbEJpdFZlY3RvciBDaGVja2VkVmFyQXJnczsKICAgaWYgKEZEZWNsKSB7Ci0gICAgZm9yIChzcGVjaWZpY19hdHRyX2l0ZXJhdG9yPEZvcm1hdEF0dHI+Ci0gICAgICAgICAgICAgSSA9IEZEZWNsLT5zcGVjaWZpY19hdHRyX2JlZ2luPEZvcm1hdEF0dHI+KCksCi0gICAgICAgICAgICAgRSA9IEZEZWNsLT5zcGVjaWZpY19hdHRyX2VuZDxGb3JtYXRBdHRyPigpOwotICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBGRGVjbC0+c3BlY2lmaWNfYXR0cnM8Rm9ybWF0QXR0cj4oKSkgewogICAgICAgLy8gT25seSBjcmVhdGUgdmVjdG9yIGlmIHRoZXJlIGFyZSBmb3JtYXQgYXR0cmlidXRlcy4KICAgICAgIENoZWNrZWRWYXJBcmdzLnJlc2l6ZShBcmdzLnNpemUoKSk7CiAKLSAgICAgIENoZWNrRm9ybWF0QXJndW1lbnRzKCpJLCBBcmdzLCBJc01lbWJlckZ1bmN0aW9uLCBDYWxsVHlwZSwgTG9jLCBSYW5nZSwKKyAgICAgIENoZWNrRm9ybWF0QXJndW1lbnRzKEksIEFyZ3MsIElzTWVtYmVyRnVuY3Rpb24sIENhbGxUeXBlLCBMb2MsIFJhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlZFZhckFyZ3MpOwogICAgIH0KICAgfQpAQCAtNzQwLDcgKzgxMCw3IEBACiAgIC8vIFJlZnVzZSBQT0QgYXJndW1lbnRzIHRoYXQgd2VyZW4ndCBjYXVnaHQgYnkgdGhlIGZvcm1hdCBzdHJpbmcKICAgLy8gY2hlY2tzIGFib3ZlLgogICBpZiAoQ2FsbFR5cGUgIT0gVmFyaWFkaWNEb2VzTm90QXBwbHkpIHsKLSAgICBmb3IgKHVuc2lnbmVkIEFyZ0lkeCA9IE51bVByb3RvQXJnczsgQXJnSWR4IDwgQXJncy5zaXplKCk7ICsrQXJnSWR4KSB7CisgICAgZm9yICh1bnNpZ25lZCBBcmdJZHggPSBOdW1QYXJhbXM7IEFyZ0lkeCA8IEFyZ3Muc2l6ZSgpOyArK0FyZ0lkeCkgewogICAgICAgLy8gQXJnc1tBcmdJZHhdIGNhbiBiZSBudWxsIGluIG1hbGZvcm1lZCBjb2RlLgogICAgICAgaWYgKGNvbnN0IEV4cHIgKkFyZyA9IEFyZ3NbQXJnSWR4XSkgewogICAgICAgICBpZiAoQ2hlY2tlZFZhckFyZ3MuZW1wdHkoKSB8fCAhQ2hlY2tlZFZhckFyZ3NbQXJnSWR4XSkKQEAgLTc1MCwxOCArODIwLDExIEBACiAgIH0KIAogICBpZiAoRkRlY2wpIHsKLSAgICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8Tm9uTnVsbEF0dHI+Ci0gICAgICAgICAgIEkgPSBGRGVjbC0+c3BlY2lmaWNfYXR0cl9iZWdpbjxOb25OdWxsQXR0cj4oKSwKLSAgICAgICAgICAgRSA9IEZEZWNsLT5zcGVjaWZpY19hdHRyX2VuZDxOb25OdWxsQXR0cj4oKTsgSSAhPSBFOyArK0kpCi0gICAgICBDaGVja05vbk51bGxBcmd1bWVudHMoKkksIEFyZ3MuZGF0YSgpLCBMb2MpOworICAgIENoZWNrTm9uTnVsbEFyZ3VtZW50cygqdGhpcywgRkRlY2wsIEFyZ3MuZGF0YSgpLCBMb2MpOwogCiAgICAgLy8gVHlwZSBzYWZldHkgY2hlY2tpbmcuCi0gICAgZm9yIChzcGVjaWZpY19hdHRyX2l0ZXJhdG9yPEFyZ3VtZW50V2l0aFR5cGVUYWdBdHRyPgotICAgICAgICAgICBpID0gRkRlY2wtPnNwZWNpZmljX2F0dHJfYmVnaW48QXJndW1lbnRXaXRoVHlwZVRhZ0F0dHI+KCksCi0gICAgICAgICAgIGUgPSBGRGVjbC0+c3BlY2lmaWNfYXR0cl9lbmQ8QXJndW1lbnRXaXRoVHlwZVRhZ0F0dHI+KCk7Ci0gICAgICAgICBpICE9IGU7ICsraSkgewotICAgICAgQ2hlY2tBcmd1bWVudFdpdGhUeXBlVGFnKCppLCBBcmdzLmRhdGEoKSk7Ci0gICAgfQorICAgIGZvciAoY29uc3QgYXV0byAqSSA6IEZEZWNsLT5zcGVjaWZpY19hdHRyczxBcmd1bWVudFdpdGhUeXBlVGFnQXR0cj4oKSkKKyAgICAgIENoZWNrQXJndW1lbnRXaXRoVHlwZVRhZyhJLCBBcmdzLmRhdGEoKSk7CiAgIH0KIH0KIApAQCAtNzczLDcgKzgzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykgewogICBWYXJpYWRpY0NhbGxUeXBlIENhbGxUeXBlID0KICAgICBQcm90by0+aXNWYXJpYWRpYygpID8gVmFyaWFkaWNDb25zdHJ1Y3RvciA6IFZhcmlhZGljRG9lc05vdEFwcGx5OwotICBjaGVja0NhbGwoRkRlY2wsIEFyZ3MsIFByb3RvLT5nZXROdW1BcmdzKCksCisgIGNoZWNrQ2FsbChGRGVjbCwgQXJncywgUHJvdG8tPmdldE51bVBhcmFtcygpLAogICAgICAgICAgICAgLypJc01lbWJlckZ1bmN0aW9uPSovdHJ1ZSwgTG9jLCBTb3VyY2VSYW5nZSgpLCBDYWxsVHlwZSk7CiB9CiAKQEAgLTc4Nyw3ICs4NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBJc01lbWJlck9wZXJhdG9yQ2FsbDsKICAgVmFyaWFkaWNDYWxsVHlwZSBDYWxsVHlwZSA9IGdldFZhcmlhZGljQ2FsbFR5cGUoRkRlY2wsIFByb3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVDYWxsLT5nZXRDYWxsZWUoKSk7Ci0gIHVuc2lnbmVkIE51bVByb3RvQXJncyA9IFByb3RvID8gUHJvdG8tPmdldE51bUFyZ3MoKSA6IDA7CisgIHVuc2lnbmVkIE51bVBhcmFtcyA9IFByb3RvID8gUHJvdG8tPmdldE51bVBhcmFtcygpIDogMDsKICAgRXhwcioqIEFyZ3MgPSBUaGVDYWxsLT5nZXRBcmdzKCk7CiAgIHVuc2lnbmVkIE51bUFyZ3MgPSBUaGVDYWxsLT5nZXROdW1BcmdzKCk7CiAgIGlmIChJc01lbWJlck9wZXJhdG9yQ2FsbCkgewpAQCAtNzk3LDggKzg2MCw3IEBACiAgICAgKytBcmdzOwogICAgIC0tTnVtQXJnczsKICAgfQotICBjaGVja0NhbGwoRkRlY2wsIGxsdm06Om1ha2VBcnJheVJlZjxjb25zdCBFeHByICo+KEFyZ3MsIE51bUFyZ3MpLAotICAgICAgICAgICAgTnVtUHJvdG9BcmdzLAorICBjaGVja0NhbGwoRkRlY2wsIGxsdm06Om1ha2VBcnJheVJlZjxjb25zdCBFeHByICo+KEFyZ3MsIE51bUFyZ3MpLCBOdW1QYXJhbXMsCiAgICAgICAgICAgICBJc01lbWJlckZ1bmN0aW9uLCBUaGVDYWxsLT5nZXRSUGFyZW5Mb2MoKSwKICAgICAgICAgICAgIFRoZUNhbGwtPmdldENhbGxlZSgpLT5nZXRTb3VyY2VSYW5nZSgpLCBDYWxsVHlwZSk7CiAKQEAgLTgwOCw2ICs4NzAsOCBAQAogICBpZiAoIUZuSW5mbykKICAgICByZXR1cm4gZmFsc2U7CiAKKyAgQ2hlY2tBYnNvbHV0ZVZhbHVlRnVuY3Rpb24oVGhlQ2FsbCwgRkRlY2wsIEZuSW5mbyk7CisKICAgdW5zaWduZWQgQ01JZCA9IEZEZWNsLT5nZXRNZW1vcnlGdW5jdGlvbktpbmQoKTsKICAgaWYgKENNSWQgPT0gMCkKICAgICByZXR1cm4gZmFsc2U7CkBAIC04NTMsMTUgKzkxNywxMyBAQAogICB9IGVsc2UgeyAvLyBUeS0+aXNGdW5jdGlvblBvaW50ZXJUeXBlKCkKICAgICBDYWxsVHlwZSA9IFZhcmlhZGljRnVuY3Rpb247CiAgIH0KLSAgdW5zaWduZWQgTnVtUHJvdG9BcmdzID0gUHJvdG8gPyBQcm90by0+Z2V0TnVtQXJncygpIDogMDsKKyAgdW5zaWduZWQgTnVtUGFyYW1zID0gUHJvdG8gPyBQcm90by0+Z2V0TnVtUGFyYW1zKCkgOiAwOwogCi0gIGNoZWNrQ2FsbChORGVjbCwKLSAgICAgICAgICAgIGxsdm06Om1ha2VBcnJheVJlZjxjb25zdCBFeHByICo+KFRoZUNhbGwtPmdldEFyZ3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZUNhbGwtPmdldE51bUFyZ3MoKSksCi0gICAgICAgICAgICBOdW1Qcm90b0FyZ3MsIC8qSXNNZW1iZXJGdW5jdGlvbj0qL2ZhbHNlLAotICAgICAgICAgICAgVGhlQ2FsbC0+Z2V0UlBhcmVuTG9jKCksCisgIGNoZWNrQ2FsbChORGVjbCwgbGx2bTo6bWFrZUFycmF5UmVmPGNvbnN0IEV4cHIgKj4oVGhlQ2FsbC0+Z2V0QXJncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZUNhbGwtPmdldE51bUFyZ3MoKSksCisgICAgICAgICAgICBOdW1QYXJhbXMsIC8qSXNNZW1iZXJGdW5jdGlvbj0qL2ZhbHNlLCBUaGVDYWxsLT5nZXRSUGFyZW5Mb2MoKSwKICAgICAgICAgICAgIFRoZUNhbGwtPmdldENhbGxlZSgpLT5nZXRTb3VyY2VSYW5nZSgpLCBDYWxsVHlwZSk7Ci0gIAorCiAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtODcwLDE4ICs5MzIsNDMgQEAKIGJvb2wgU2VtYTo6Q2hlY2tPdGhlckNhbGwoQ2FsbEV4cHIgKlRoZUNhbGwsIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpQcm90bykgewogICBWYXJpYWRpY0NhbGxUeXBlIENhbGxUeXBlID0gZ2V0VmFyaWFkaWNDYWxsVHlwZSgvKkZEZWNsPSovMCwgUHJvdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZUNhbGwtPmdldENhbGxlZSgpKTsKLSAgdW5zaWduZWQgTnVtUHJvdG9BcmdzID0gUHJvdG8gPyBQcm90by0+Z2V0TnVtQXJncygpIDogMDsKKyAgdW5zaWduZWQgTnVtUGFyYW1zID0gUHJvdG8gPyBQcm90by0+Z2V0TnVtUGFyYW1zKCkgOiAwOwogCi0gIGNoZWNrQ2FsbCgvKkZEZWNsPSovMCwKLSAgICAgICAgICAgIGxsdm06Om1ha2VBcnJheVJlZjxjb25zdCBFeHByICo+KFRoZUNhbGwtPmdldEFyZ3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZUNhbGwtPmdldE51bUFyZ3MoKSksCi0gICAgICAgICAgICBOdW1Qcm90b0FyZ3MsIC8qSXNNZW1iZXJGdW5jdGlvbj0qL2ZhbHNlLAotICAgICAgICAgICAgVGhlQ2FsbC0+Z2V0UlBhcmVuTG9jKCksCisgIGNoZWNrQ2FsbCgvKkZEZWNsPSovMCwgbGx2bTo6bWFrZUFycmF5UmVmPGNvbnN0IEV4cHIgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZUNhbGwtPmdldEFyZ3MoKSwgVGhlQ2FsbC0+Z2V0TnVtQXJncygpKSwKKyAgICAgICAgICAgIE51bVBhcmFtcywgLypJc01lbWJlckZ1bmN0aW9uPSovZmFsc2UsIFRoZUNhbGwtPmdldFJQYXJlbkxvYygpLAogICAgICAgICAgICAgVGhlQ2FsbC0+Z2V0Q2FsbGVlKCktPmdldFNvdXJjZVJhbmdlKCksIENhbGxUeXBlKTsKIAogICByZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyBib29sIGlzVmFsaWRPcmRlcmluZ0Zvck9wKGludDY0X3QgT3JkZXJpbmcsIEF0b21pY0V4cHI6OkF0b21pY09wIE9wKSB7CisgIGlmIChPcmRlcmluZyA8IEF0b21pY0V4cHI6OkFPX0FCSV9tZW1vcnlfb3JkZXJfcmVsYXhlZCB8fAorICAgICAgT3JkZXJpbmcgPiBBdG9taWNFeHByOjpBT19BQklfbWVtb3J5X29yZGVyX3NlcV9jc3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN3aXRjaCAoT3ApIHsKKyAgY2FzZSBBdG9taWNFeHByOjpBT19fYzExX2F0b21pY19pbml0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIlRoZXJlIGlzIG5vIG9yZGVyaW5nIGFyZ3VtZW50IGZvciBhbiBpbml0Iik7CisKKyAgY2FzZSBBdG9taWNFeHByOjpBT19fYzExX2F0b21pY19sb2FkOgorICBjYXNlIEF0b21pY0V4cHI6OkFPX19hdG9taWNfbG9hZF9uOgorICBjYXNlIEF0b21pY0V4cHI6OkFPX19hdG9taWNfbG9hZDoKKyAgICByZXR1cm4gT3JkZXJpbmcgIT0gQXRvbWljRXhwcjo6QU9fQUJJX21lbW9yeV9vcmRlcl9yZWxlYXNlICYmCisgICAgICAgICAgIE9yZGVyaW5nICE9IEF0b21pY0V4cHI6OkFPX0FCSV9tZW1vcnlfb3JkZXJfYWNxX3JlbDsKKworICBjYXNlIEF0b21pY0V4cHI6OkFPX19jMTFfYXRvbWljX3N0b3JlOgorICBjYXNlIEF0b21pY0V4cHI6OkFPX19hdG9taWNfc3RvcmU6CisgIGNhc2UgQXRvbWljRXhwcjo6QU9fX2F0b21pY19zdG9yZV9uOgorICAgIHJldHVybiBPcmRlcmluZyAhPSBBdG9taWNFeHByOjpBT19BQklfbWVtb3J5X29yZGVyX2NvbnN1bWUgJiYKKyAgICAgICAgICAgT3JkZXJpbmcgIT0gQXRvbWljRXhwcjo6QU9fQUJJX21lbW9yeV9vcmRlcl9hY3F1aXJlICYmCisgICAgICAgICAgIE9yZGVyaW5nICE9IEF0b21pY0V4cHI6OkFPX0FCSV9tZW1vcnlfb3JkZXJfYWNxX3JlbDsKKworICBkZWZhdWx0OgorICAgIHJldHVybiB0cnVlOworICB9Cit9CisKIEV4cHJSZXN1bHQgU2VtYTo6U2VtYUF0b21pY09wc092ZXJsb2FkZWQoRXhwclJlc3VsdCBUaGVDYWxsUmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNFeHByOjpBdG9taWNPcCBPcCkgewogICBDYWxsRXhwciAqVGhlQ2FsbCA9IGNhc3Q8Q2FsbEV4cHI+KFRoZUNhbGxSZXN1bHQuZ2V0KCkpOwpAQCAtMTE3MCw3ICsxMjU3LDE2IEBACiAgICAgU3ViRXhwcnMucHVzaF9iYWNrKFRoZUNhbGwtPmdldEFyZygzKSk7IC8vIFdlYWsKICAgICBicmVhazsKICAgfQotICAKKworICBpZiAoU3ViRXhwcnMuc2l6ZSgpID49IDIgJiYgRm9ybSAhPSBJbml0KSB7CisgICAgbGx2bTo6QVBTSW50IFJlc3VsdCgzMik7CisgICAgaWYgKFN1YkV4cHJzWzFdLT5pc0ludGVnZXJDb25zdGFudEV4cHIoUmVzdWx0LCBDb250ZXh0KSAmJgorICAgICAgICAhaXNWYWxpZE9yZGVyaW5nRm9yT3AoUmVzdWx0LmdldFNFeHRWYWx1ZSgpLCBPcCkpCisgICAgICBEaWFnKFN1YkV4cHJzWzFdLT5nZXRMb2NTdGFydCgpLAorICAgICAgICAgICBkaWFnOjp3YXJuX2F0b21pY19vcF9oYXNfaW52YWxpZF9tZW1vcnlfb3JkZXIpCisgICAgICAgICAgPDwgU3ViRXhwcnNbMV0tPmdldFNvdXJjZVJhbmdlKCk7CisgIH0KKwogICBBdG9taWNFeHByICpBRSA9IG5ldyAoQ29udGV4dCkgQXRvbWljRXhwcihUaGVDYWxsLT5nZXRDYWxsZWUoKS0+Z2V0TG9jU3RhcnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViRXhwcnMsIFJlc3VsdFR5cGUsIE9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVDYWxsLT5nZXRSUGFyZW5Mb2MoKSk7CkBAIC0xOTAxLDYgKzE5OTcsMjYgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCisvLy8gU2VtYUJ1aWx0aW5NTVByZWZldGNoIC0gSGFuZGxlIF9tbV9wcmVmZXRjaC4KKy8vIFRoaXMgaXMgZGVjbGFyZWQgdG8gdGFrZSAoY29uc3QgY2hhciosIGludCkKK2Jvb2wgU2VtYTo6U2VtYUJ1aWx0aW5NTVByZWZldGNoKENhbGxFeHByICpUaGVDYWxsKSB7CisgIEV4cHIgKkFyZyA9IFRoZUNhbGwtPmdldEFyZygxKTsKKworICAvLyBXZSBjYW4ndCBjaGVjayB0aGUgdmFsdWUgb2YgYSBkZXBlbmRlbnQgYXJndW1lbnQuCisgIGlmIChBcmctPmlzVHlwZURlcGVuZGVudCgpIHx8IEFyZy0+aXNWYWx1ZURlcGVuZGVudCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBsbHZtOjpBUFNJbnQgUmVzdWx0OworICBpZiAoU2VtYUJ1aWx0aW5Db25zdGFudEFyZyhUaGVDYWxsLCAxLCBSZXN1bHQpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChSZXN1bHQuZ2V0TGltaXRlZFZhbHVlKCkgPiAzKQorICAgIHJldHVybiBEaWFnKFRoZUNhbGwtPmdldExvY1N0YXJ0KCksIGRpYWc6OmVycl9hcmd1bWVudF9pbnZhbGlkX3JhbmdlKQorICAgICAgICA8PCAiMCIgPDwgIjMiIDw8IEFyZy0+Z2V0U291cmNlUmFuZ2UoKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKIC8vLyBTZW1hQnVpbHRpbkNvbnN0YW50QXJnIC0gSGFuZGxlIGEgY2hlY2sgaWYgYXJndW1lbnQgQXJnTnVtIG9mIENhbGxFeHByCiAvLy8gVGhlQ2FsbCBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24uCiBib29sIFNlbWE6OlNlbWFCdWlsdGluQ29uc3RhbnRBcmcoQ2FsbEV4cHIgKlRoZUNhbGwsIGludCBBcmdOdW0sCkBAIC0yMDgxLDEwICsyMTk3LDcgQEAKICAgICAgICAgaWYgKGNvbnN0IFBhcm1WYXJEZWNsICpQViA9IGR5bl9jYXN0PFBhcm1WYXJEZWNsPihWRCkpIHsKICAgICAgICAgICBpZiAoY29uc3QgTmFtZWREZWNsICpORCA9IGR5bl9jYXN0PE5hbWVkRGVjbD4oUFYtPmdldERlY2xDb250ZXh0KCkpKSB7CiAgICAgICAgICAgICBpbnQgUFZJbmRleCA9IFBWLT5nZXRGdW5jdGlvblNjb3BlSW5kZXgoKSArIDE7Ci0gICAgICAgICAgICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8Rm9ybWF0QXR0cj4KLSAgICAgICAgICAgICAgICAgaSA9IE5ELT5zcGVjaWZpY19hdHRyX2JlZ2luPEZvcm1hdEF0dHI+KCksCi0gICAgICAgICAgICAgICAgIGUgPSBORC0+c3BlY2lmaWNfYXR0cl9lbmQ8Rm9ybWF0QXR0cj4oKTsgaSAhPSBlIDsgKytpKSB7Ci0gICAgICAgICAgICAgIEZvcm1hdEF0dHIgKlBWRm9ybWF0ID0gKmk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gKlBWRm9ybWF0IDogTkQtPnNwZWNpZmljX2F0dHJzPEZvcm1hdEF0dHI+KCkpIHsKICAgICAgICAgICAgICAgLy8gYWRqdXN0IGZvciBpbXBsaWNpdCBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgaWYgKGNvbnN0IENYWE1ldGhvZERlY2wgKk1EID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4oTkQpKQogICAgICAgICAgICAgICAgIGlmIChNRC0+aXNJbnN0YW5jZSgpKQpAQCAtMjEzMywyNyArMjI0Niw2IEBACiAKICAgICByZXR1cm4gU0xDVF9Ob3RBTGl0ZXJhbDsKICAgfQotICAgICAgCi0gIGNhc2UgU3RtdDo6T2JqQ01lc3NhZ2VFeHByQ2xhc3M6IHsKLSAgICBjb25zdCBPYmpDTWVzc2FnZUV4cHIgKk1FID0gY2FzdDxPYmpDTWVzc2FnZUV4cHI+KEUpOwotICAgIGlmIChjb25zdCBPYmpDTWV0aG9kRGVjbCAqTURlY2wgPSBNRS0+Z2V0TWV0aG9kRGVjbCgpKSB7Ci0gICAgICBpZiAoY29uc3QgTmFtZWREZWNsICpORCA9IGR5bl9jYXN0PE5hbWVkRGVjbD4oTURlY2wpKSB7Ci0gICAgICAgIGlmIChjb25zdCBGb3JtYXRBcmdBdHRyICpGQSA9IE5ELT5nZXRBdHRyPEZvcm1hdEFyZ0F0dHI+KCkpIHsKLSAgICAgICAgICB1bnNpZ25lZCBBcmdJbmRleCA9IEZBLT5nZXRGb3JtYXRJZHgoKTsKLSAgICAgICAgICBpZiAoQXJnSW5kZXggPD0gTUUtPmdldE51bUFyZ3MoKSkgewotICAgICAgICAgICAgY29uc3QgRXhwciAqQXJnID0gTUUtPmdldEFyZyhBcmdJbmRleC0xKTsKLSAgICAgICAgICAgIHJldHVybiBjaGVja0Zvcm1hdFN0cmluZ0V4cHIoUywgQXJnLCBBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNWQUxpc3RBcmcsIGZvcm1hdF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGF0YUFyZywgVHlwZSwgQ2FsbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluRnVuY3Rpb25DYWxsLCBDaGVja2VkVmFyQXJncyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFNMQ1RfTm90QUxpdGVyYWw7Ci0gIH0KLSAgICAgIAogICBjYXNlIFN0bXQ6Ok9iakNTdHJpbmdMaXRlcmFsQ2xhc3M6CiAgIGNhc2UgU3RtdDo6U3RyaW5nTGl0ZXJhbENsYXNzOiB7CiAgICAgY29uc3QgU3RyaW5nTGl0ZXJhbCAqU3RyRSA9IE5VTEw7CkBAIC0yMTc3LDMyICsyMjY5LDYgQEAKICAgfQogfQogCi12b2lkCi1TZW1hOjpDaGVja05vbk51bGxBcmd1bWVudHMoY29uc3QgTm9uTnVsbEF0dHIgKk5vbk51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqIGNvbnN0ICpFeHByQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBDYWxsU2l0ZUxvYykgewotICBmb3IgKE5vbk51bGxBdHRyOjphcmdzX2l0ZXJhdG9yIGkgPSBOb25OdWxsLT5hcmdzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IE5vbk51bGwtPmFyZ3NfZW5kKCk7Ci0gICAgICAgaSAhPSBlOyArK2kpIHsKLSAgICBjb25zdCBFeHByICpBcmdFeHByID0gRXhwckFyZ3NbKmldOwotCi0gICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsIHRyYW5zcGFyZW50IHVuaW9ucyBpbml0aWFsaXplZCB3aXRoIHplcm8gYXJlCi0gICAgLy8gY29uc2lkZXJlZCBudWxsIGZvciB0aGUgcHVycG9zZXMgb2YgdGhlIG5vbm51bGwgYXR0cmlidXRlLgotICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpVVCA9IEFyZ0V4cHItPmdldFR5cGUoKS0+Z2V0QXNVbmlvblR5cGUoKSkgewotICAgICAgaWYgKFVULT5nZXREZWNsKCktPmhhc0F0dHI8VHJhbnNwYXJlbnRVbmlvbkF0dHI+KCkpCi0gICAgICAgIGlmIChjb25zdCBDb21wb3VuZExpdGVyYWxFeHByICpDTEUgPQotICAgICAgICAgICAgZHluX2Nhc3Q8Q29tcG91bmRMaXRlcmFsRXhwcj4oQXJnRXhwcikpCi0gICAgICAgICAgaWYgKGNvbnN0IEluaXRMaXN0RXhwciAqSUxFID0KLSAgICAgICAgICAgICAgZHluX2Nhc3Q8SW5pdExpc3RFeHByPihDTEUtPmdldEluaXRpYWxpemVyKCkpKQotICAgICAgICAgICAgQXJnRXhwciA9IElMRS0+Z2V0SW5pdCgwKTsKLSAgICB9Ci0KLSAgICBib29sIFJlc3VsdDsKLSAgICBpZiAoQXJnRXhwci0+RXZhbHVhdGVBc0Jvb2xlYW5Db25kaXRpb24oUmVzdWx0LCBDb250ZXh0KSAmJiAhUmVzdWx0KQotICAgICAgRGlhZyhDYWxsU2l0ZUxvYywgZGlhZzo6d2Fybl9udWxsX2FyZykgPDwgQXJnRXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKLSAgfQotfQotCiBTZW1hOjpGb3JtYXRTdHJpbmdUeXBlIFNlbWE6OkdldEZvcm1hdFN0cmluZ1R5cGUoY29uc3QgRm9ybWF0QXR0ciAqRm9ybWF0KSB7CiAgIHJldHVybiBsbHZtOjpTdHJpbmdTd2l0Y2g8Rm9ybWF0U3RyaW5nVHlwZT4oRm9ybWF0LT5nZXRUeXBlKCktPmdldE5hbWUoKSkKICAgLkNhc2UoInNjYW5mIiwgRlNUX1NjYW5mKQpAQCAtMjMzMSwzMCArMjM5NywzMSBAQAogICB2b2lkIERvbmVQcm9jZXNzaW5nKCk7CiAKICAgdm9pZCBIYW5kbGVJbmNvbXBsZXRlU3BlY2lmaWVyKGNvbnN0IGNoYXIgKnN0YXJ0U3BlY2lmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3BlY2lmaWVyTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNwZWNpZmllckxlbikgb3ZlcnJpZGU7CiAKICAgdm9pZCBIYW5kbGVJbnZhbGlkTGVuZ3RoTW9kaWZpZXIoCi0gICAgICBjb25zdCBhbmFseXplX2Zvcm1hdF9zdHJpbmc6OkZvcm1hdFNwZWNpZmllciAmRlMsCi0gICAgICBjb25zdCBhbmFseXplX2Zvcm1hdF9zdHJpbmc6OkNvbnZlcnNpb25TcGVjaWZpZXIgJkNTLAotICAgICAgY29uc3QgY2hhciAqc3RhcnRTcGVjaWZpZXIsIHVuc2lnbmVkIHNwZWNpZmllckxlbiwgdW5zaWduZWQgRGlhZ0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuYWx5emVfZm9ybWF0X3N0cmluZzo6Rm9ybWF0U3BlY2lmaWVyICZGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuYWx5emVfZm9ybWF0X3N0cmluZzo6Q29udmVyc2lvblNwZWNpZmllciAmQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydFNwZWNpZmllciwgdW5zaWduZWQgc3BlY2lmaWVyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGlhZ0lEKTsKIAogICB2b2lkIEhhbmRsZU5vblN0YW5kYXJkTGVuZ3RoTW9kaWZpZXIoCi0gICAgICBjb25zdCBhbmFseXplX2Zvcm1hdF9zdHJpbmc6OkZvcm1hdFNwZWNpZmllciAmRlMsCi0gICAgICBjb25zdCBjaGFyICpzdGFydFNwZWNpZmllciwgdW5zaWduZWQgc3BlY2lmaWVyTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5hbHl6ZV9mb3JtYXRfc3RyaW5nOjpGb3JtYXRTcGVjaWZpZXIgJkZTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydFNwZWNpZmllciwgdW5zaWduZWQgc3BlY2lmaWVyTGVuKTsKIAogICB2b2lkIEhhbmRsZU5vblN0YW5kYXJkQ29udmVyc2lvblNwZWNpZmllcigKLSAgICAgIGNvbnN0IGFuYWx5emVfZm9ybWF0X3N0cmluZzo6Q29udmVyc2lvblNwZWNpZmllciAmQ1MsCi0gICAgICBjb25zdCBjaGFyICpzdGFydFNwZWNpZmllciwgdW5zaWduZWQgc3BlY2lmaWVyTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5hbHl6ZV9mb3JtYXRfc3RyaW5nOjpDb252ZXJzaW9uU3BlY2lmaWVyICZDUywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnRTcGVjaWZpZXIsIHVuc2lnbmVkIHNwZWNpZmllckxlbik7CiAKLSAgdmlydHVhbCB2b2lkIEhhbmRsZVBvc2l0aW9uKGNvbnN0IGNoYXIgKnN0YXJ0UG9zLCB1bnNpZ25lZCBwb3NMZW4pOworICB2b2lkIEhhbmRsZVBvc2l0aW9uKGNvbnN0IGNoYXIgKnN0YXJ0UG9zLCB1bnNpZ25lZCBwb3NMZW4pIG92ZXJyaWRlOwogCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVJbnZhbGlkUG9zaXRpb24oY29uc3QgY2hhciAqc3RhcnRTcGVjaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3BlY2lmaWVyTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5emVfZm9ybWF0X3N0cmluZzo6UG9zaXRpb25Db250ZXh0IHApOworICB2b2lkIEhhbmRsZUludmFsaWRQb3NpdGlvbihjb25zdCBjaGFyICpzdGFydFNwZWNpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3BlY2lmaWVyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXplX2Zvcm1hdF9zdHJpbmc6OlBvc2l0aW9uQ29udGV4dCBwKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgSGFuZGxlWmVyb1Bvc2l0aW9uKGNvbnN0IGNoYXIgKnN0YXJ0UG9zLCB1bnNpZ25lZCBwb3NMZW4pOworICB2b2lkIEhhbmRsZVplcm9Qb3NpdGlvbihjb25zdCBjaGFyICpzdGFydFBvcywgdW5zaWduZWQgcG9zTGVuKSBvdmVycmlkZTsKIAotICB2b2lkIEhhbmRsZU51bGxDaGFyKGNvbnN0IGNoYXIgKm51bGxDaGFyYWN0ZXIpOworICB2b2lkIEhhbmRsZU51bGxDaGFyKGNvbnN0IGNoYXIgKm51bGxDaGFyYWN0ZXIpIG92ZXJyaWRlOwogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZT4KICAgc3RhdGljIHZvaWQgRW1pdEZvcm1hdERpYWdub3N0aWMoU2VtYSAmUywgYm9vbCBpbkZ1bmN0aW9uQ2FsbCwKQEAgLTIzOTAsOSArMjQ1Nyw2IEBACiAgIHZvaWQgRW1pdEZvcm1hdERpYWdub3N0aWMoUGFydGlhbERpYWdub3N0aWMgUERpYWcsIFNvdXJjZUxvY2F0aW9uIFN0cmluZ0xvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU3RyaW5nTG9jYXRpb24sIFJhbmdlIFN0cmluZ1JhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEZpeEl0SGludD4gRml4aXQgPSBOb25lKTsKLQotICB2b2lkIENoZWNrUG9zaXRpb25hbEFuZE5vbnBvc2l0aW9uYWxBcmdzKAotICAgICAgY29uc3QgYW5hbHl6ZV9mb3JtYXRfc3RyaW5nOjpGb3JtYXRTcGVjaWZpZXIgKkZTKTsKIH07CiB9CiAKQEAgLTI3MjMsMTUgKzI3ODcsMTUgQEAKICAgICAgIE9iakNDb250ZXh0KGlzT2JqQykKICAge30KIAotICAKKwogICBib29sIEhhbmRsZUludmFsaWRQcmludGZDb252ZXJzaW9uU3BlY2lmaWVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmFseXplX3ByaW50Zjo6UHJpbnRmU3BlY2lmaWVyICZGUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnRTcGVjaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNwZWNpZmllckxlbik7Ci0gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzcGVjaWZpZXJMZW4pIG92ZXJyaWRlOworCiAgIGJvb2wgSGFuZGxlUHJpbnRmU3BlY2lmaWVyKGNvbnN0IGFuYWx5emVfcHJpbnRmOjpQcmludGZTcGVjaWZpZXIgJkZTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdGFydFNwZWNpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3BlY2lmaWVyTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3BlY2lmaWVyTGVuKSBvdmVycmlkZTsKICAgYm9vbCBjaGVja0Zvcm1hdEV4cHIoY29uc3QgYW5hbHl6ZV9wcmludGY6OlByaW50ZlNwZWNpZmllciAmRlMsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlN0YXJ0U3BlY2lmaWVyLAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcGVjaWZpZXJMZW4sCkBAIC0yNzUxLDcgKzI4MTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuYWx5emVfcHJpbnRmOjpPcHRpb25hbEZsYWcgJmZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnRTcGVjaWZpZXIsIHVuc2lnbmVkIHNwZWNpZmllckxlbik7CiAgIGJvb2wgY2hlY2tGb3JDU3RyTWVtYmVycyhjb25zdCBhbmFseXplX3ByaW50Zjo6QXJnVHlwZSAmQVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpFLCBjb25zdCBDaGFyU291cmNlUmFuZ2UgJkNTUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpFKTsKIAogfTsgIAogfQpAQCAtMjg4NSwxMSArMjk0OSwxMiBAQAogICBpZiAoIVJUKQogICAgIHJldHVybiBSZXN1bHRzOwogICBjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IGR5bl9jYXN0PENYWFJlY29yZERlY2w+KFJULT5nZXREZWNsKCkpOwotICBpZiAoIVJEKQorICBpZiAoIVJEIHx8ICFSRC0+Z2V0RGVmaW5pdGlvbigpKQogICAgIHJldHVybiBSZXN1bHRzOwogCiAgIExvb2t1cFJlc3VsdCBSKFMsICZTLlBQLmdldElkZW50aWZpZXJUYWJsZSgpLmdldChOYW1lKSwgU291cmNlTG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgU2VtYTo6TG9va3VwTWVtYmVyTmFtZSk7CisgIFIuc3VwcHJlc3NEaWFnbm9zdGljcygpOwogCiAgIC8vIFdlIGp1c3QgbmVlZCB0byBpbmNsdWRlIGFsbCBtZW1iZXJzIG9mIHRoZSByaWdodCBraW5kIHR1cm5lZCB1cCBieSB0aGUKICAgLy8gZmlsdGVyLCBhdCB0aGlzIHBvaW50LgpAQCAtMjkwMiwxMiArMjk2NywyNiBAQAogICByZXR1cm4gUmVzdWx0czsKIH0KIAorLy8vIENoZWNrIGlmIHdlIGNvdWxkIGNhbGwgJy5jX3N0cigpJyBvbiBhbiBvYmplY3QuCisvLy8KKy8vLyBGSVhNRTogVGhpcyByZXR1cm5zIHRoZSB3cm9uZyByZXN1bHRzIGluIHNvbWUgY2FzZXMgKGlmIGN2LXF1YWxpZmllcnMgZG9uJ3QKKy8vLyBhbGxvdyB0aGUgY2FsbCwgb3IgaWYgaXQgd291bGQgYmUgYW1iaWd1b3VzKS4KK2Jvb2wgU2VtYTo6aGFzQ1N0ck1ldGhvZChjb25zdCBFeHByICpFKSB7CisgIHR5cGVkZWYgbGx2bTo6U21hbGxQdHJTZXQ8Q1hYTWV0aG9kRGVjbCosIDE+IE1ldGhvZFNldDsKKyAgTWV0aG9kU2V0IFJlc3VsdHMgPQorICAgICAgQ1hYUmVjb3JkTWVtYmVyc05hbWVkPENYWE1ldGhvZERlY2w+KCJjX3N0ciIsICp0aGlzLCBFLT5nZXRUeXBlKCkpOworICBmb3IgKE1ldGhvZFNldDo6aXRlcmF0b3IgTUkgPSBSZXN1bHRzLmJlZ2luKCksIE1FID0gUmVzdWx0cy5lbmQoKTsKKyAgICAgICBNSSAhPSBNRTsgKytNSSkKKyAgICBpZiAoKCpNSSktPmdldE1pblJlcXVpcmVkQXJndW1lbnRzKCkgPT0gMCkKKyAgICAgIHJldHVybiB0cnVlOworICByZXR1cm4gZmFsc2U7Cit9CisKIC8vIENoZWNrIGlmIGEgKHcpc3RyaW5nIHdhcyBwYXNzZWQgd2hlbiBhICh3KWNoYXIqIHdhcyBuZWVkZWQsIGFuZCBvZmZlciBhCiAvLyBiZXR0ZXIgZGlhZ25vc3RpYyBpZiBzby4gQVQgaXMgYXNzdW1lZCB0byBiZSB2YWxpZC4KIC8vIFJldHVybnMgdHJ1ZSB3aGVuIGEgY19zdHIoKSBjb252ZXJzaW9uIG1ldGhvZCBpcyBmb3VuZC4KIGJvb2wgQ2hlY2tQcmludGZIYW5kbGVyOjpjaGVja0ZvckNTdHJNZW1iZXJzKAotICAgIGNvbnN0IGFuYWx5emVfcHJpbnRmOjpBcmdUeXBlICZBVCwgY29uc3QgRXhwciAqRSwKLSAgICBjb25zdCBDaGFyU291cmNlUmFuZ2UgJkNTUikgeworICAgIGNvbnN0IGFuYWx5emVfcHJpbnRmOjpBcmdUeXBlICZBVCwgY29uc3QgRXhwciAqRSkgewogICB0eXBlZGVmIGxsdm06OlNtYWxsUHRyU2V0PENYWE1ldGhvZERlY2wqLCAxPiBNZXRob2RTZXQ7CiAKICAgTWV0aG9kU2V0IFJlc3VsdHMgPQpAQCAtMjkxNiw4ICsyOTk1LDggQEAKICAgZm9yIChNZXRob2RTZXQ6Oml0ZXJhdG9yIE1JID0gUmVzdWx0cy5iZWdpbigpLCBNRSA9IFJlc3VsdHMuZW5kKCk7CiAgICAgICAgTUkgIT0gTUU7ICsrTUkpIHsKICAgICBjb25zdCBDWFhNZXRob2REZWNsICpNZXRob2QgPSAqTUk7Ci0gICAgaWYgKE1ldGhvZC0+Z2V0TnVtUGFyYW1zKCkgPT0gMCAmJgotICAgICAgICAgIEFULm1hdGNoZXNUeXBlKFMuQ29udGV4dCwgTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCkpKSB7CisgICAgaWYgKE1ldGhvZC0+Z2V0TWluUmVxdWlyZWRBcmd1bWVudHMoKSA9PSAwICYmCisgICAgICAgIEFULm1hdGNoZXNUeXBlKFMuQ29udGV4dCwgTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCkpKSB7CiAgICAgICAvLyBGSVhNRTogU3VnZ2VzdCBwYXJlbnMgaWYgdGhlIGV4cHJlc3Npb24gbmVlZHMgdGhlbS4KICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYyA9CiAgICAgICAgICAgUy5nZXRQcmVwcm9jZXNzb3IoKS5nZXRMb2NGb3JFbmRPZlRva2VuKEUtPmdldExvY0VuZCgpKTsKQEAgLTMzMDMsNyArMzM4Miw3IEBACiAgICAgICAgICAgPDwgQ1NSCiAgICAgICAgICAgPDwgRS0+Z2V0U291cmNlUmFuZ2UoKSwKICAgICAgICAgRS0+Z2V0TG9jU3RhcnQoKSwgLypJc1N0cmluZ0xvY2F0aW9uKi9mYWxzZSwgQ1NSKTsKLSAgICAgIGNoZWNrRm9yQ1N0ck1lbWJlcnMoQVQsIEUsIENTUik7CisgICAgICBjaGVja0ZvckNTdHJNZW1iZXJzKEFULCBFKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBTZW1hOjpWQUtfSW52YWxpZDoKQEAgLTMzNTUsMTQgKzM0MzQsMTQgQEAKICAgCiAgIGJvb2wgSGFuZGxlU2NhbmZTcGVjaWZpZXIoY29uc3QgYW5hbHl6ZV9zY2FuZjo6U2NhbmZTcGVjaWZpZXIgJkZTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0U3BlY2lmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNwZWNpZmllckxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3BlY2lmaWVyTGVuKSBvdmVycmlkZTsKICAgCiAgIGJvb2wgSGFuZGxlSW52YWxpZFNjYW5mQ29udmVyc2lvblNwZWNpZmllcigKICAgICAgICAgICBjb25zdCBhbmFseXplX3NjYW5mOjpTY2FuZlNwZWNpZmllciAmRlMsCiAgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnRTcGVjaWZpZXIsCi0gICAgICAgICAgdW5zaWduZWQgc3BlY2lmaWVyTGVuKTsKKyAgICAgICAgICB1bnNpZ25lZCBzcGVjaWZpZXJMZW4pIG92ZXJyaWRlOwogCi0gIHZvaWQgSGFuZGxlSW5jb21wbGV0ZVNjYW5MaXN0KGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQpOworICB2b2lkIEhhbmRsZUluY29tcGxldGVTY2FuTGlzdChjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kKSBvdmVycmlkZTsKIH07CiB9CiAKQEAgLTM0NjcsOCArMzU0Niw5IEBACiAgIGNvbnN0IGFuYWx5emVfZm9ybWF0X3N0cmluZzo6QXJnVHlwZSAmQVQgPSBGUy5nZXRBcmdUeXBlKFMuQ29udGV4dCk7CiAgIGlmIChBVC5pc1ZhbGlkKCkgJiYgIUFULm1hdGNoZXNUeXBlKFMuQ29udGV4dCwgRXgtPmdldFR5cGUoKSkpIHsKICAgICBTY2FuZlNwZWNpZmllciBmaXhlZEZTID0gRlM7Ci0gICAgYm9vbCBzdWNjZXNzID0gZml4ZWRGUy5maXhUeXBlKEV4LT5nZXRUeXBlKCksIFMuZ2V0TGFuZ09wdHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5Db250ZXh0KTsKKyAgICBib29sIHN1Y2Nlc3MgPSBmaXhlZEZTLmZpeFR5cGUoRXgtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXgtPklnbm9yZUltcENhc3RzKCktPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5nZXRMYW5nT3B0cygpLCBTLkNvbnRleHQpOwogCiAgICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgIC8vIEdldCB0aGUgZml4IHN0cmluZyBmcm9tIHRoZSBmaXhlZCBmb3JtYXQgc3BlY2lmaWVyLgpAQCAtMzUyMCw5ICszNjAwLDI1IEBACiAgIC8vIFN0ciAtIFRoZSBmb3JtYXQgc3RyaW5nLiAgTk9URTogdGhpcyBpcyBOT1QgbnVsbC10ZXJtaW5hdGVkIQogICBTdHJpbmdSZWYgU3RyUmVmID0gRkV4cHItPmdldFN0cmluZygpOwogICBjb25zdCBjaGFyICpTdHIgPSBTdHJSZWYuZGF0YSgpOwotICB1bnNpZ25lZCBTdHJMZW4gPSBTdHJSZWYuc2l6ZSgpOworICAvLyBBY2NvdW50IGZvciBjYXNlcyB3aGVyZSB0aGUgc3RyaW5nIGxpdGVyYWwgaXMgdHJ1bmNhdGVkIGluIGEgZGVjbGFyYXRpb24uCisgIGNvbnN0IENvbnN0YW50QXJyYXlUeXBlICpUID0gQ29udGV4dC5nZXRBc0NvbnN0YW50QXJyYXlUeXBlKEZFeHByLT5nZXRUeXBlKCkpOworICBhc3NlcnQoVCAmJiAiU3RyaW5nIGxpdGVyYWwgbm90IG9mIGNvbnN0YW50IGFycmF5IHR5cGUhIik7CisgIHNpemVfdCBUeXBlU2l6ZSA9IFQtPmdldFNpemUoKS5nZXRaRXh0VmFsdWUoKTsKKyAgc2l6ZV90IFN0ckxlbiA9IHN0ZDo6bWluKHN0ZDo6bWF4KFR5cGVTaXplLCBzaXplX3QoMSkpIC0gMSwgU3RyUmVmLnNpemUoKSk7CiAgIGNvbnN0IHVuc2lnbmVkIG51bURhdGFBcmdzID0gQXJncy5zaXplKCkgLSBmaXJzdERhdGFBcmc7Ci0gIAorCisgIC8vIEVtaXQgYSB3YXJuaW5nIGlmIHRoZSBzdHJpbmcgbGl0ZXJhbCBpcyB0cnVuY2F0ZWQgYW5kIGRvZXMgbm90IGNvbnRhaW4gYW4KKyAgLy8gZW1iZWRkZWQgbnVsbCBjaGFyYWN0ZXIuCisgIGlmIChUeXBlU2l6ZSA8PSBTdHJSZWYuc2l6ZSgpICYmCisgICAgICBTdHJSZWYuc3Vic3RyKDAsIFR5cGVTaXplKS5maW5kKCdcMCcpID09IFN0cmluZ1JlZjo6bnBvcykgeworICAgIENoZWNrRm9ybWF0SGFuZGxlcjo6RW1pdEZvcm1hdERpYWdub3N0aWMoCisgICAgICAgICp0aGlzLCBpbkZ1bmN0aW9uQ2FsbCwgQXJnc1tmb3JtYXRfaWR4XSwKKyAgICAgICAgUERpYWcoZGlhZzo6d2Fybl9wcmludGZfZm9ybWF0X3N0cmluZ19ub3RfbnVsbF90ZXJtaW5hdGVkKSwKKyAgICAgICAgRkV4cHItPmdldExvY1N0YXJ0KCksCisgICAgICAgIC8qSXNTdHJpbmdMb2NhdGlvbj0qL3RydWUsIE9yaWdGb3JtYXRFeHByLT5nZXRTb3VyY2VSYW5nZSgpKTsKKyAgICByZXR1cm47CisgIH0KKwogICAvLyBDSEVDSzogZW1wdHkgZm9ybWF0IHN0cmluZz8KICAgaWYgKFN0ckxlbiA9PSAwICYmIG51bURhdGFBcmdzID4gMCkgewogICAgIENoZWNrRm9ybWF0SGFuZGxlcjo6RW1pdEZvcm1hdERpYWdub3N0aWMoCkBAIC0zNTU0LDggKzM2NTAsMzY1IEBACiAgIH0gLy8gVE9ETzogaGFuZGxlIG90aGVyIGZvcm1hdHMKIH0KIAorLy89PT0tLS0gQ0hFQ0s6IFdhcm4gb24gdXNlIG9mIHdyb25nIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uLiAtLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gUmV0dXJucyB0aGUgcmVsYXRlZCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiB0aGF0IGlzIGxhcmdlciwgb2YgMCBpZiBvbmUKKy8vIGRvZXMgbm90IGV4aXN0Lgorc3RhdGljIHVuc2lnbmVkIGdldExhcmdlckFic29sdXRlVmFsdWVGdW5jdGlvbih1bnNpZ25lZCBBYnNGdW5jdGlvbikgeworICBzd2l0Y2ggKEFic0Z1bmN0aW9uKSB7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDA7CisKKyAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9hYnM6CisgICAgcmV0dXJuIEJ1aWx0aW46OkJJX19idWlsdGluX2xhYnM7CisgIGNhc2UgQnVpbHRpbjo6QklfX2J1aWx0aW5fbGFiczoKKyAgICByZXR1cm4gQnVpbHRpbjo6QklfX2J1aWx0aW5fbGxhYnM7CisgIGNhc2UgQnVpbHRpbjo6QklfX2J1aWx0aW5fbGxhYnM6CisgICAgcmV0dXJuIDA7CisKKyAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9mYWJzZjoKKyAgICByZXR1cm4gQnVpbHRpbjo6QklfX2J1aWx0aW5fZmFiczsKKyAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9mYWJzOgorICAgIHJldHVybiBCdWlsdGluOjpCSV9fYnVpbHRpbl9mYWJzbDsKKyAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9mYWJzbDoKKyAgICByZXR1cm4gMDsKKworICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2NhYnNmOgorICAgIHJldHVybiBCdWlsdGluOjpCSV9fYnVpbHRpbl9jYWJzOworICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2NhYnM6CisgICAgcmV0dXJuIEJ1aWx0aW46OkJJX19idWlsdGluX2NhYnNsOworICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2NhYnNsOgorICAgIHJldHVybiAwOworCisgIGNhc2UgQnVpbHRpbjo6QklhYnM6CisgICAgcmV0dXJuIEJ1aWx0aW46OkJJbGFiczsKKyAgY2FzZSBCdWlsdGluOjpCSWxhYnM6CisgICAgcmV0dXJuIEJ1aWx0aW46OkJJbGxhYnM7CisgIGNhc2UgQnVpbHRpbjo6QklsbGFiczoKKyAgICByZXR1cm4gMDsKKworICBjYXNlIEJ1aWx0aW46OkJJZmFic2Y6CisgICAgcmV0dXJuIEJ1aWx0aW46OkJJZmFiczsKKyAgY2FzZSBCdWlsdGluOjpCSWZhYnM6CisgICAgcmV0dXJuIEJ1aWx0aW46OkJJZmFic2w7CisgIGNhc2UgQnVpbHRpbjo6QklmYWJzbDoKKyAgICByZXR1cm4gMDsKKworICBjYXNlIEJ1aWx0aW46OkJJY2Fic2Y6CisgICByZXR1cm4gQnVpbHRpbjo6QkljYWJzOworICBjYXNlIEJ1aWx0aW46OkJJY2FiczoKKyAgICByZXR1cm4gQnVpbHRpbjo6QkljYWJzbDsKKyAgY2FzZSBCdWlsdGluOjpCSWNhYnNsOgorICAgIHJldHVybiAwOworICB9Cit9CisKKy8vIFJldHVybnMgdGhlIGFyZ3VtZW50IHR5cGUgb2YgdGhlIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uLgorc3RhdGljIFF1YWxUeXBlIGdldEFic29sdXRlVmFsdWVBcmd1bWVudFR5cGUoQVNUQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFic1R5cGUpIHsKKyAgaWYgKEFic1R5cGUgPT0gMCkKKyAgICByZXR1cm4gUXVhbFR5cGUoKTsKKworICBBU1RDb250ZXh0OjpHZXRCdWlsdGluVHlwZUVycm9yIEVycm9yID0gQVNUQ29udGV4dDo6R0VfTm9uZTsKKyAgUXVhbFR5cGUgQnVpbHRpblR5cGUgPSBDb250ZXh0LkdldEJ1aWx0aW5UeXBlKEFic1R5cGUsIEVycm9yKTsKKyAgaWYgKEVycm9yICE9IEFTVENvbnRleHQ6OkdFX05vbmUpCisgICAgcmV0dXJuIFF1YWxUeXBlKCk7CisKKyAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZUID0gQnVpbHRpblR5cGUtPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOworICBpZiAoIUZUKQorICAgIHJldHVybiBRdWFsVHlwZSgpOworCisgIGlmIChGVC0+Z2V0TnVtUGFyYW1zKCkgIT0gMSkKKyAgICByZXR1cm4gUXVhbFR5cGUoKTsKKworICByZXR1cm4gRlQtPmdldFBhcmFtVHlwZSgwKTsKK30KKworLy8gUmV0dXJucyB0aGUgYmVzdCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiwgb3IgemVybywgYmFzZWQgb24gdHlwZSBhbmQKKy8vIGN1cnJlbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24uCitzdGF0aWMgdW5zaWduZWQgZ2V0QmVzdEFic0Z1bmN0aW9uKEFTVENvbnRleHQgJkNvbnRleHQsIFF1YWxUeXBlIEFyZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFic0Z1bmN0aW9uS2luZCkgeworICB1bnNpZ25lZCBCZXN0S2luZCA9IDA7CisgIHVpbnQ2NF90IEFyZ1NpemUgPSBDb250ZXh0LmdldFR5cGVTaXplKEFyZ1R5cGUpOworICBmb3IgKHVuc2lnbmVkIEtpbmQgPSBBYnNGdW5jdGlvbktpbmQ7IEtpbmQgIT0gMDsKKyAgICAgICBLaW5kID0gZ2V0TGFyZ2VyQWJzb2x1dGVWYWx1ZUZ1bmN0aW9uKEtpbmQpKSB7CisgICAgUXVhbFR5cGUgUGFyYW1UeXBlID0gZ2V0QWJzb2x1dGVWYWx1ZUFyZ3VtZW50VHlwZShDb250ZXh0LCBLaW5kKTsKKyAgICBpZiAoQ29udGV4dC5nZXRUeXBlU2l6ZShQYXJhbVR5cGUpID49IEFyZ1NpemUpIHsKKyAgICAgIGlmIChCZXN0S2luZCA9PSAwKQorICAgICAgICBCZXN0S2luZCA9IEtpbmQ7CisgICAgICBlbHNlIGlmIChDb250ZXh0Lmhhc1NhbWVUeXBlKFBhcmFtVHlwZSwgQXJnVHlwZSkpIHsKKyAgICAgICAgQmVzdEtpbmQgPSBLaW5kOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEJlc3RLaW5kOworfQorCitlbnVtIEFic29sdXRlVmFsdWVLaW5kIHsKKyAgQVZLX0ludGVnZXIsCisgIEFWS19GbG9hdGluZywKKyAgQVZLX0NvbXBsZXgKK307CisKK3N0YXRpYyBBYnNvbHV0ZVZhbHVlS2luZCBnZXRBYnNvbHV0ZVZhbHVlS2luZChRdWFsVHlwZSBUKSB7CisgIGlmIChULT5pc0ludGVncmFsT3JFbnVtZXJhdGlvblR5cGUoKSkKKyAgICByZXR1cm4gQVZLX0ludGVnZXI7CisgIGlmIChULT5pc1JlYWxGbG9hdGluZ1R5cGUoKSkKKyAgICByZXR1cm4gQVZLX0Zsb2F0aW5nOworICBpZiAoVC0+aXNBbnlDb21wbGV4VHlwZSgpKQorICAgIHJldHVybiBBVktfQ29tcGxleDsKKworICBsbHZtX3VucmVhY2hhYmxlKCJUeXBlIG5vdCBpbnRlZ2VyLCBmbG9hdGluZywgb3IgY29tcGxleCIpOworfQorCisvLyBDaGFuZ2VzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiB0byBhIGRpZmZlcmVudCB0eXBlLiAgUHJlc2VydmVzIHdoZXRoZXIKKy8vIHRoZSBmdW5jdGlvbiBpcyBhIGJ1aWx0aW4uCitzdGF0aWMgdW5zaWduZWQgY2hhbmdlQWJzRnVuY3Rpb24odW5zaWduZWQgQWJzS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnNvbHV0ZVZhbHVlS2luZCBWYWx1ZUtpbmQpIHsKKyAgc3dpdGNoIChWYWx1ZUtpbmQpIHsKKyAgY2FzZSBBVktfSW50ZWdlcjoKKyAgICBzd2l0Y2ggKEFic0tpbmQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9mYWJzZjoKKyAgICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2ZhYnM6CisgICAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9mYWJzbDoKKyAgICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2NhYnNmOgorICAgIGNhc2UgQnVpbHRpbjo6QklfX2J1aWx0aW5fY2FiczoKKyAgICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2NhYnNsOgorICAgICAgcmV0dXJuIEJ1aWx0aW46OkJJX19idWlsdGluX2FiczsKKyAgICBjYXNlIEJ1aWx0aW46OkJJZmFic2Y6CisgICAgY2FzZSBCdWlsdGluOjpCSWZhYnM6CisgICAgY2FzZSBCdWlsdGluOjpCSWZhYnNsOgorICAgIGNhc2UgQnVpbHRpbjo6QkljYWJzZjoKKyAgICBjYXNlIEJ1aWx0aW46OkJJY2FiczoKKyAgICBjYXNlIEJ1aWx0aW46OkJJY2Fic2w6CisgICAgICByZXR1cm4gQnVpbHRpbjo6QklhYnM7CisgICAgfQorICBjYXNlIEFWS19GbG9hdGluZzoKKyAgICBzd2l0Y2ggKEFic0tpbmQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9hYnM6CisgICAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9sYWJzOgorICAgIGNhc2UgQnVpbHRpbjo6QklfX2J1aWx0aW5fbGxhYnM6CisgICAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9jYWJzZjoKKyAgICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2NhYnM6CisgICAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9jYWJzbDoKKyAgICAgIHJldHVybiBCdWlsdGluOjpCSV9fYnVpbHRpbl9mYWJzZjsKKyAgICBjYXNlIEJ1aWx0aW46OkJJYWJzOgorICAgIGNhc2UgQnVpbHRpbjo6QklsYWJzOgorICAgIGNhc2UgQnVpbHRpbjo6QklsbGFiczoKKyAgICBjYXNlIEJ1aWx0aW46OkJJY2Fic2Y6CisgICAgY2FzZSBCdWlsdGluOjpCSWNhYnM6CisgICAgY2FzZSBCdWlsdGluOjpCSWNhYnNsOgorICAgICAgcmV0dXJuIEJ1aWx0aW46OkJJZmFic2Y7CisgICAgfQorICBjYXNlIEFWS19Db21wbGV4OgorICAgIHN3aXRjaCAoQWJzS2luZCkgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2FiczoKKyAgICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2xhYnM6CisgICAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9sbGFiczoKKyAgICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2ZhYnNmOgorICAgIGNhc2UgQnVpbHRpbjo6QklfX2J1aWx0aW5fZmFiczoKKyAgICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2ZhYnNsOgorICAgICAgcmV0dXJuIEJ1aWx0aW46OkJJX19idWlsdGluX2NhYnNmOworICAgIGNhc2UgQnVpbHRpbjo6QklhYnM6CisgICAgY2FzZSBCdWlsdGluOjpCSWxhYnM6CisgICAgY2FzZSBCdWlsdGluOjpCSWxsYWJzOgorICAgIGNhc2UgQnVpbHRpbjo6QklmYWJzZjoKKyAgICBjYXNlIEJ1aWx0aW46OkJJZmFiczoKKyAgICBjYXNlIEJ1aWx0aW46OkJJZmFic2w6CisgICAgICByZXR1cm4gQnVpbHRpbjo6QkljYWJzZjsKKyAgICB9CisgIH0KKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5hYmxlIHRvIGNvbnZlcnQgZnVuY3Rpb24iKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGdldEFic29sdXRlVmFsdWVGdW5jdGlvbktpbmQoY29uc3QgRnVuY3Rpb25EZWNsICpGRGVjbCkgeworICBjb25zdCBJZGVudGlmaWVySW5mbyAqRm5JbmZvID0gRkRlY2wtPmdldElkZW50aWZpZXIoKTsKKyAgaWYgKCFGbkluZm8pCisgICAgcmV0dXJuIDA7CisKKyAgc3dpdGNoIChGRGVjbC0+Z2V0QnVpbHRpbklEKCkpIHsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsKKyAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9hYnM6CisgIGNhc2UgQnVpbHRpbjo6QklfX2J1aWx0aW5fZmFiczoKKyAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9mYWJzZjoKKyAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9mYWJzbDoKKyAgY2FzZSBCdWlsdGluOjpCSV9fYnVpbHRpbl9sYWJzOgorICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2xsYWJzOgorICBjYXNlIEJ1aWx0aW46OkJJX19idWlsdGluX2NhYnM6CisgIGNhc2UgQnVpbHRpbjo6QklfX2J1aWx0aW5fY2Fic2Y6CisgIGNhc2UgQnVpbHRpbjo6QklfX2J1aWx0aW5fY2Fic2w6CisgIGNhc2UgQnVpbHRpbjo6QklhYnM6CisgIGNhc2UgQnVpbHRpbjo6QklsYWJzOgorICBjYXNlIEJ1aWx0aW46OkJJbGxhYnM6CisgIGNhc2UgQnVpbHRpbjo6QklmYWJzOgorICBjYXNlIEJ1aWx0aW46OkJJZmFic2Y6CisgIGNhc2UgQnVpbHRpbjo6QklmYWJzbDoKKyAgY2FzZSBCdWlsdGluOjpCSWNhYnM6CisgIGNhc2UgQnVpbHRpbjo6QkljYWJzZjoKKyAgY2FzZSBCdWlsdGluOjpCSWNhYnNsOgorICAgIHJldHVybiBGRGVjbC0+Z2V0QnVpbHRpbklEKCk7CisgIH0KKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBCdWlsdGluIHR5cGUiKTsKK30KKworLy8gSWYgdGhlIHJlcGxhY2VtZW50IGlzIHZhbGlkLCBlbWl0IGEgbm90ZSB3aXRoIHJlcGxhY2VtZW50IGZ1bmN0aW9uLgorLy8gQWRkaXRpb25hbGx5LCBzdWdnZXN0IGluY2x1ZGluZyB0aGUgcHJvcGVyIGhlYWRlciBpZiBub3QgYWxyZWFkeSBpbmNsdWRlZC4KK3N0YXRpYyB2b2lkIGVtaXRSZXBsYWNlbWVudChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFic0tpbmQpIHsKKyAgc3RkOjpzdHJpbmcgQWJzTmFtZSA9IFMuQ29udGV4dC5CdWlsdGluSW5mby5HZXROYW1lKEFic0tpbmQpOworCisgIC8vIExvb2sgdXAgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gaW4gVFUgc2NvcGUuCisgIERlY2xhcmF0aW9uTmFtZSBETigmUy5Db250ZXh0LklkZW50cy5nZXQoQWJzTmFtZSkpOworICBMb29rdXBSZXN1bHQgUihTLCBETiwgTG9jLCBTZW1hOjpMb29rdXBBbnlOYW1lKTsKKyAgUi5zdXBwcmVzc0RpYWdub3N0aWNzKCk7CisgIFMuTG9va3VwTmFtZShSLCBTLlRVU2NvcGUpOworCisgIC8vIFNraXAgbm90ZXMgaWYgbXVsdGlwbGUgcmVzdWx0cyBmb3VuZCBpbiBsb29rdXAuCisgIGlmICghUi5lbXB0eSgpICYmICFSLmlzU2luZ2xlUmVzdWx0KCkpCisgICAgcmV0dXJuOworCisgIEZ1bmN0aW9uRGVjbCAqRkQgPSAwOworICBib29sIEZvdW5kRnVuY3Rpb24gPSBSLmlzU2luZ2xlUmVzdWx0KCk7CisgIC8vIFdoZW4gb25lIHJlc3VsdCBpcyBmb3VuZCwgc2VlIGlmIGl0IGlzIHRoZSBjb3JyZWN0IGZ1bmN0aW9uLgorICBpZiAoUi5pc1NpbmdsZVJlc3VsdCgpKSB7CisgICAgRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KFIuZ2V0Rm91bmREZWNsKCkpOworICAgIGlmICghRkQgfHwgRkQtPmdldEJ1aWx0aW5JRCgpICE9IEFic0tpbmQpCisgICAgICByZXR1cm47CisgIH0KKworICAvLyBMb29rIGZvciBsb2NhbCBuYW1lIGNvbmZsaWN0LCBwcmVwZW5kICI6OiIgYXMgbmVjZXNzYXJ5LgorICBSLmNsZWFyKCk7CisgIFMuTG9va3VwTmFtZShSLCBTLmdldEN1clNjb3BlKCkpOworCisgIGlmICghRm91bmRGdW5jdGlvbikgeworICAgIGlmICghUi5lbXB0eSgpKSB7CisgICAgICBBYnNOYW1lID0gIjo6IiArIEFic05hbWU7CisgICAgfQorICB9IGVsc2UgeyAvLyBGb3VuZEZ1bmN0aW9uCisgICAgaWYgKFIuaXNTaW5nbGVSZXN1bHQoKSkgeworICAgICAgaWYgKFIuZ2V0Rm91bmREZWNsKCkgIT0gRkQpIHsKKyAgICAgICAgQWJzTmFtZSA9ICI6OiIgKyBBYnNOYW1lOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIVIuZW1wdHkoKSkgeworICAgICAgQWJzTmFtZSA9ICI6OiIgKyBBYnNOYW1lOworICAgIH0KKyAgfQorCisgIFMuRGlhZyhMb2MsIGRpYWc6Om5vdGVfcmVwbGFjZV9hYnNfZnVuY3Rpb24pCisgICAgICA8PCBBYnNOYW1lIDw8IEZpeEl0SGludDo6Q3JlYXRlUmVwbGFjZW1lbnQoUmFuZ2UsIEFic05hbWUpOworCisgIGlmICghRm91bmRGdW5jdGlvbikgeworICAgIFMuRGlhZyhMb2MsIGRpYWc6Om5vdGVfcGxlYXNlX2luY2x1ZGVfaGVhZGVyKQorICAgICAgICA8PCBTLkNvbnRleHQuQnVpbHRpbkluZm8uZ2V0SGVhZGVyTmFtZShBYnNLaW5kKQorICAgICAgICA8PCBTLkNvbnRleHQuQnVpbHRpbkluZm8uR2V0TmFtZShBYnNLaW5kKTsKKyAgfQorfQorCisvLyBXYXJuIHdoZW4gdXNpbmcgdGhlIHdyb25nIGFicygpIGZ1bmN0aW9uLgordm9pZCBTZW1hOjpDaGVja0Fic29sdXRlVmFsdWVGdW5jdGlvbihjb25zdCBDYWxsRXhwciAqQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKkZuSW5mbykgeworICBpZiAoQ2FsbC0+Z2V0TnVtQXJncygpICE9IDEpCisgICAgcmV0dXJuOworCisgIHVuc2lnbmVkIEFic0tpbmQgPSBnZXRBYnNvbHV0ZVZhbHVlRnVuY3Rpb25LaW5kKEZEZWNsKTsKKyAgaWYgKEFic0tpbmQgPT0gMCkKKyAgICByZXR1cm47CisKKyAgUXVhbFR5cGUgQXJnVHlwZSA9IENhbGwtPmdldEFyZygwKS0+SWdub3JlUGFyZW5JbXBDYXN0cygpLT5nZXRUeXBlKCk7CisgIFF1YWxUeXBlIFBhcmFtVHlwZSA9IENhbGwtPmdldEFyZygwKS0+Z2V0VHlwZSgpOworCisgIC8vIFVuc2lnbmVkIHR5cGVzIGNhbiBub3QgYmUgbmVnYXRpdmUuICBTdWdnZXN0IHRvIGRyb3AgdGhlIGFic29sdXRlIHZhbHVlCisgIC8vIGZ1bmN0aW9uLgorICBpZiAoQXJnVHlwZS0+aXNVbnNpZ25lZEludGVnZXJUeXBlKCkpIHsKKyAgICBEaWFnKENhbGwtPmdldEV4cHJMb2MoKSwgZGlhZzo6d2Fybl91bnNpZ25lZF9hYnMpIDw8IEFyZ1R5cGUgPDwgUGFyYW1UeXBlOworICAgIERpYWcoQ2FsbC0+Z2V0RXhwckxvYygpLCBkaWFnOjpub3RlX3JlbW92ZV9hYnMpCisgICAgICAgIDw8IEZEZWNsCisgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlUmVtb3ZhbChDYWxsLT5nZXRDYWxsZWUoKS0+Z2V0U291cmNlUmFuZ2UoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgQWJzb2x1dGVWYWx1ZUtpbmQgQXJnVmFsdWVLaW5kID0gZ2V0QWJzb2x1dGVWYWx1ZUtpbmQoQXJnVHlwZSk7CisgIEFic29sdXRlVmFsdWVLaW5kIFBhcmFtVmFsdWVLaW5kID0gZ2V0QWJzb2x1dGVWYWx1ZUtpbmQoUGFyYW1UeXBlKTsKKworICAvLyBUaGUgYXJndW1lbnQgYW5kIHBhcmFtZXRlciBhcmUgdGhlIHNhbWUga2luZC4gIENoZWNrIGlmIHRoZXkgYXJlIHRoZSByaWdodAorICAvLyBzaXplLgorICBpZiAoQXJnVmFsdWVLaW5kID09IFBhcmFtVmFsdWVLaW5kKSB7CisgICAgaWYgKENvbnRleHQuZ2V0VHlwZVNpemUoQXJnVHlwZSkgPD0gQ29udGV4dC5nZXRUeXBlU2l6ZShQYXJhbVR5cGUpKQorICAgICAgcmV0dXJuOworCisgICAgdW5zaWduZWQgTmV3QWJzS2luZCA9IGdldEJlc3RBYnNGdW5jdGlvbihDb250ZXh0LCBBcmdUeXBlLCBBYnNLaW5kKTsKKyAgICBEaWFnKENhbGwtPmdldEV4cHJMb2MoKSwgZGlhZzo6d2Fybl9hYnNfdG9vX3NtYWxsKQorICAgICAgICA8PCBGRGVjbCA8PCBBcmdUeXBlIDw8IFBhcmFtVHlwZTsKKworICAgIGlmIChOZXdBYnNLaW5kID09IDApCisgICAgICByZXR1cm47CisKKyAgICBlbWl0UmVwbGFjZW1lbnQoKnRoaXMsIENhbGwtPmdldEV4cHJMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgQ2FsbC0+Z2V0Q2FsbGVlKCktPmdldFNvdXJjZVJhbmdlKCksIE5ld0Fic0tpbmQpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEFyZ1ZhbHVlS2luZCAhPSBQYXJhbVZhbHVlS2luZAorICAvLyBUaGUgd3JvbmcgdHlwZSBvZiBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiB3YXMgdXNlZC4gIEF0dGVtcHQgdG8gZmluZCB0aGUKKyAgLy8gcHJvcGVyIG9uZS4KKyAgdW5zaWduZWQgTmV3QWJzS2luZCA9IGNoYW5nZUFic0Z1bmN0aW9uKEFic0tpbmQsIEFyZ1ZhbHVlS2luZCk7CisgIE5ld0Fic0tpbmQgPSBnZXRCZXN0QWJzRnVuY3Rpb24oQ29udGV4dCwgQXJnVHlwZSwgTmV3QWJzS2luZCk7CisgIGlmIChOZXdBYnNLaW5kID09IDApCisgICAgcmV0dXJuOworCisgIERpYWcoQ2FsbC0+Z2V0RXhwckxvYygpLCBkaWFnOjp3YXJuX3dyb25nX2Fic29sdXRlX3ZhbHVlX3R5cGUpCisgICAgICA8PCBGRGVjbCA8PCBQYXJhbVZhbHVlS2luZCA8PCBBcmdWYWx1ZUtpbmQ7CisKKyAgZW1pdFJlcGxhY2VtZW50KCp0aGlzLCBDYWxsLT5nZXRFeHByTG9jKCksCisgICAgICAgICAgICAgICAgICBDYWxsLT5nZXRDYWxsZWUoKS0+Z2V0U291cmNlUmFuZ2UoKSwgTmV3QWJzS2luZCk7CisgIHJldHVybjsKK30KKwogLy89PT0tLS0gQ0hFQ0s6IFN0YW5kYXJkIG1lbW9yeSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAorLy8vIFxicmllZiBUYWtlcyB0aGUgZXhwcmVzc2lvbiBwYXNzZWQgdG8gdGhlIHNpemVfdCBwYXJhbWV0ZXIgb2YgZnVuY3Rpb25zCisvLy8gc3VjaCBhcyBtZW1jbXAsIHN0cm5jYXQsIGV0YyBhbmQgd2FybnMgaWYgaXQncyBhIGNvbXBhcmlzb24uCisvLy8KKy8vLyBUaGlzIGlzIHRvIGNhdGNoIHR5cG9zIGxpa2UgYGlmIChtZW1jbXAoJmEsICZiLCBzaXplb2YoYSkgPiAwKSlgLgorc3RhdGljIGJvb2wgQ2hlY2tNZW1vcnlTaXplb2ZGb3JDb21wYXJpc29uKFNlbWEgJlMsIGNvbnN0IEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKkZuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBGbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpIHsKKyAgY29uc3QgQmluYXJ5T3BlcmF0b3IgKlNpemUgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oRSk7CisgIGlmICghU2l6ZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gaWYgRSBpcyBiaW5vcCBhbmQgb3AgaXMgPiwgPCwgPj0sIDw9LCA9PSwgJiYsIHx8OgorICBpZiAoIVNpemUtPmlzQ29tcGFyaXNvbk9wKCkgJiYgIVNpemUtPmlzRXF1YWxpdHlPcCgpICYmICFTaXplLT5pc0xvZ2ljYWxPcCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBQcmVwcm9jZXNzb3IgJlBQID0gUy5nZXRQcmVwcm9jZXNzb3IoKTsKKyAgU291cmNlUmFuZ2UgU2l6ZVJhbmdlID0gU2l6ZS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgUy5EaWFnKFNpemUtPmdldE9wZXJhdG9yTG9jKCksIGRpYWc6Ondhcm5fbWVtc2l6ZV9jb21wYXJpc29uKQorICAgICAgPDwgU2l6ZVJhbmdlIDw8IEZuTmFtZTsKKyAgUy5EaWFnKEZuTG9jLCBkaWFnOjp3YXJuX21lbXNpemVfY29tcGFyaXNvbl9wYXJlbl9ub3RlKQorICAgICAgPDwgRm5OYW1lCisgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbigKKyAgICAgICAgICAgICBQUC5nZXRMb2NGb3JFbmRPZlRva2VuKFNpemUtPmdldExIUygpLT5nZXRMb2NFbmQoKSksCisgICAgICAgICAgICAgIikiKQorICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVSZW1vdmFsKFJQYXJlbkxvYyk7CisgIFMuRGlhZyhTaXplUmFuZ2UuZ2V0QmVnaW4oKSwgZGlhZzo6d2Fybl9tZW1zaXplX2NvbXBhcmlzb25fY2FzdF9ub3RlKQorICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oU2l6ZVJhbmdlLmdldEJlZ2luKCksICIoc2l6ZV90KSgiKQorICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oCisgICAgICAgICAgICAgUFAuZ2V0TG9jRm9yRW5kT2ZUb2tlbihTaXplUmFuZ2UuZ2V0RW5kKCkpLCAiKSIpOworCisgIHJldHVybiB0cnVlOworfQorCiAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlIGlzIGEgZHluYW1pYyBjbGFzcyB0eXBlIChlLmcuLAogLy8vIHdoZXRoZXIgaXQgaGFzIGEgdnRhYmxlKS4KIHN0YXRpYyBib29sIGlzRHluYW1pY0NsYXNzVHlwZShRdWFsVHlwZSBUKSB7CkBAIC0zNjExLDYgKzQwNjQsMTAgQEAKICAgdW5zaWduZWQgTGVuQXJnID0gKEJJZCA9PSBCdWlsdGluOjpCSXN0cm5kdXAgPyAxIDogMik7CiAgIGNvbnN0IEV4cHIgKkxlbkV4cHIgPSBDYWxsLT5nZXRBcmcoTGVuQXJnKS0+SWdub3JlUGFyZW5JbXBDYXN0cygpOwogCisgIGlmIChDaGVja01lbW9yeVNpemVvZkZvckNvbXBhcmlzb24oKnRoaXMsIExlbkV4cHIsIEZuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsLT5nZXRMb2NTdGFydCgpLCBDYWxsLT5nZXRSUGFyZW5Mb2MoKSkpCisgICAgcmV0dXJuOworCiAgIC8vIFdlIGhhdmUgc3BlY2lhbCBjaGVja2luZyB3aGVuIHRoZSBsZW5ndGggaXMgYSBzaXplb2YgZXhwcmVzc2lvbi4KICAgUXVhbFR5cGUgU2l6ZU9mQXJnVHkgPSBnZXRTaXplT2ZBcmdUeXBlKExlbkV4cHIpOwogICBjb25zdCBFeHByICpTaXplT2ZBcmcgPSBnZXRTaXplT2ZFeHByQXJnKExlbkV4cHIpOwpAQCAtMzc5NCw2ICs0MjUxLDEwIEBACiAgIGNvbnN0IEV4cHIgKlNyY0FyZyA9IGlnbm9yZUxpdGVyYWxBZGRpdGlvbnMoQ2FsbC0+Z2V0QXJnKDEpLCBDb250ZXh0KTsKICAgY29uc3QgRXhwciAqU2l6ZUFyZyA9IGlnbm9yZUxpdGVyYWxBZGRpdGlvbnMoQ2FsbC0+Z2V0QXJnKDIpLCBDb250ZXh0KTsKICAgY29uc3QgRXhwciAqQ29tcGFyZVdpdGhTcmMgPSBOVUxMOworCisgIGlmIChDaGVja01lbW9yeVNpemVvZkZvckNvbXBhcmlzb24oKnRoaXMsIFNpemVBcmcsIEZuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsLT5nZXRMb2NTdGFydCgpLCBDYWxsLT5nZXRSUGFyZW5Mb2MoKSkpCisgICAgcmV0dXJuOwogICAKICAgLy8gTG9vayBmb3IgJ3N0cmxjcHkoZHN0LCB4LCBzaXplb2YoeCkpJwogICBpZiAoY29uc3QgRXhwciAqRXggPSBnZXRTaXplT2ZFeHByQXJnKFNpemVBcmcpKQpAQCAtMzgwMSw4ICs0MjYyLDggQEAKICAgZWxzZSB7CiAgICAgLy8gTG9vayBmb3IgJ3N0cmxjcHkoZHN0LCB4LCBzdHJsZW4oeCkpJwogICAgIGlmIChjb25zdCBDYWxsRXhwciAqU2l6ZUNhbGwgPSBkeW5fY2FzdDxDYWxsRXhwcj4oU2l6ZUFyZykpIHsKLSAgICAgIGlmIChTaXplQ2FsbC0+aXNCdWlsdGluQ2FsbCgpID09IEJ1aWx0aW46OkJJc3RybGVuCi0gICAgICAgICAgJiYgU2l6ZUNhbGwtPmdldE51bUFyZ3MoKSA9PSAxKQorICAgICAgaWYgKFNpemVDYWxsLT5nZXRCdWlsdGluQ2FsbGVlKCkgPT0gQnVpbHRpbjo6QklzdHJsZW4gJiYKKyAgICAgICAgICBTaXplQ2FsbC0+Z2V0TnVtQXJncygpID09IDEpCiAgICAgICAgIENvbXBhcmVXaXRoU3JjID0gaWdub3JlTGl0ZXJhbEFkZGl0aW9ucyhTaXplQ2FsbC0+Z2V0QXJnKDApLCBDb250ZXh0KTsKICAgICB9CiAgIH0KQEAgLTM4NzYsNiArNDMzNywxMCBAQAogICBjb25zdCBFeHByICpTcmNBcmcgPSBDRS0+Z2V0QXJnKDEpLT5JZ25vcmVQYXJlbkNhc3RzKCk7CiAgIGNvbnN0IEV4cHIgKkxlbkFyZyA9IENFLT5nZXRBcmcoMiktPklnbm9yZVBhcmVuQ2FzdHMoKTsKIAorICBpZiAoQ2hlY2tNZW1vcnlTaXplb2ZGb3JDb21wYXJpc29uKCp0aGlzLCBMZW5BcmcsIEZuTmFtZSwgQ0UtPmdldExvY1N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0UtPmdldFJQYXJlbkxvYygpKSkKKyAgICByZXR1cm47CisKICAgLy8gSWRlbnRpZnkgY29tbW9uIGV4cHJlc3Npb25zLCB3aGljaCBhcmUgd3JvbmdseSB1c2VkIGFzIHRoZSBzaXplIGFyZ3VtZW50CiAgIC8vIHRvIHN0cm5jYXQgYW5kIG1heSBsZWFkIHRvIGJ1ZmZlciBvdmVyZmxvd3MuCiAgIHVuc2lnbmVkIFBhdHRlcm5UeXBlID0gMDsKQEAgLTM5NTQsOSArNDQxOSw5IEBACiAKIC8vLyBDaGVja1JldHVyblN0YWNrQWRkciAtIENoZWNrIGlmIGEgcmV0dXJuIHN0YXRlbWVudCByZXR1cm5zIHRoZSBhZGRyZXNzCiAvLy8gICBvZiBhIHN0YWNrIHZhcmlhYmxlLgotdm9pZAotU2VtYTo6Q2hlY2tSZXR1cm5TdGFja0FkZHIoRXhwciAqUmV0VmFsRXhwLCBRdWFsVHlwZSBsaHNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUmV0dXJuTG9jKSB7CitzdGF0aWMgdm9pZAorQ2hlY2tSZXR1cm5TdGFja0FkZHIoU2VtYSAmUywgRXhwciAqUmV0VmFsRXhwLCBRdWFsVHlwZSBsaHNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUmV0dXJuTG9jKSB7CiAKICAgRXhwciAqc3RhY2tFID0gMDsKICAgU21hbGxWZWN0b3I8RGVjbFJlZkV4cHIgKiwgOD4gcmVmVmFyczsKQEAgLTM5NjQsNyArNDQyOSw3IEBACiAgIC8vIFBlcmZvcm0gY2hlY2tpbmcgZm9yIHJldHVybmVkIHN0YWNrIGFkZHJlc3NlcywgbG9jYWwgYmxvY2tzLAogICAvLyBsYWJlbCBhZGRyZXNzZXMgb3IgcmVmZXJlbmNlcyB0byB0ZW1wb3Jhcmllcy4KICAgaWYgKGxoc1R5cGUtPmlzUG9pbnRlclR5cGUoKSB8fAotICAgICAgKCFnZXRMYW5nT3B0cygpLk9iakNBdXRvUmVmQ291bnQgJiYgbGhzVHlwZS0+aXNCbG9ja1BvaW50ZXJUeXBlKCkpKSB7CisgICAgICAoIVMuZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50ICYmIGxoc1R5cGUtPmlzQmxvY2tQb2ludGVyVHlwZSgpKSkgewogICAgIHN0YWNrRSA9IEV2YWxBZGRyKFJldFZhbEV4cCwgcmVmVmFycywgLypQYXJlbnREZWNsPSovMCk7CiAgIH0gZWxzZSBpZiAobGhzVHlwZS0+aXNSZWZlcmVuY2VUeXBlKCkpIHsKICAgICBzdGFja0UgPSBFdmFsVmFsKFJldFZhbEV4cCwgcmVmVmFycywgLypQYXJlbnREZWNsPSovMCk7CkBAIC0zOTg4LDE2ICs0NDUzLDE2IEBACiAgIH0KIAogICBpZiAoRGVjbFJlZkV4cHIgKkRSID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KHN0YWNrRSkpIHsgLy9hZGRyZXNzIG9mIGxvY2FsIHZhci4KLSAgICBEaWFnKGRpYWdMb2MsIGxoc1R5cGUtPmlzUmVmZXJlbmNlVHlwZSgpID8gZGlhZzo6d2Fybl9yZXRfc3RhY2tfcmVmCisgICAgUy5EaWFnKGRpYWdMb2MsIGxoc1R5cGUtPmlzUmVmZXJlbmNlVHlwZSgpID8gZGlhZzo6d2Fybl9yZXRfc3RhY2tfcmVmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6Ondhcm5fcmV0X3N0YWNrX2FkZHIpCiAgICAgIDw8IERSLT5nZXREZWNsKCktPmdldERlY2xOYW1lKCkgPDwgZGlhZ1JhbmdlOwogICB9IGVsc2UgaWYgKGlzYTxCbG9ja0V4cHI+KHN0YWNrRSkpIHsgLy8gbG9jYWwgYmxvY2suCi0gICAgRGlhZyhkaWFnTG9jLCBkaWFnOjplcnJfcmV0X2xvY2FsX2Jsb2NrKSA8PCBkaWFnUmFuZ2U7CisgICAgUy5EaWFnKGRpYWdMb2MsIGRpYWc6OmVycl9yZXRfbG9jYWxfYmxvY2spIDw8IGRpYWdSYW5nZTsKICAgfSBlbHNlIGlmIChpc2E8QWRkckxhYmVsRXhwcj4oc3RhY2tFKSkgeyAvLyBhZGRyZXNzIG9mIGxhYmVsLgotICAgIERpYWcoZGlhZ0xvYywgZGlhZzo6d2Fybl9yZXRfYWRkcl9sYWJlbCkgPDwgZGlhZ1JhbmdlOworICAgIFMuRGlhZyhkaWFnTG9jLCBkaWFnOjp3YXJuX3JldF9hZGRyX2xhYmVsKSA8PCBkaWFnUmFuZ2U7CiAgIH0gZWxzZSB7IC8vIGxvY2FsIHRlbXBvcmFyeS4KLSAgICBEaWFnKGRpYWdMb2MsIGxoc1R5cGUtPmlzUmVmZXJlbmNlVHlwZSgpID8gZGlhZzo6d2Fybl9yZXRfbG9jYWxfdGVtcF9yZWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGlhZzo6d2Fybl9yZXRfbG9jYWxfdGVtcF9hZGRyKQorICAgIFMuRGlhZyhkaWFnTG9jLCBsaHNUeXBlLT5pc1JlZmVyZW5jZVR5cGUoKSA/IGRpYWc6Ondhcm5fcmV0X2xvY2FsX3RlbXBfcmVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGlhZzo6d2Fybl9yZXRfbG9jYWxfdGVtcF9hZGRyKQogICAgICA8PCBkaWFnUmFuZ2U7CiAgIH0KIApAQCAtNDAxMCw4ICs0NDc1LDggQEAKICAgICAvLyBzaG93IHRoZSByYW5nZSBvZiB0aGUgZXhwcmVzc2lvbi4KICAgICBTb3VyY2VSYW5nZSByYW5nZSA9IChpIDwgZS0xKSA/IHJlZlZhcnNbaSsxXS0+Z2V0U291cmNlUmFuZ2UoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RhY2tFLT5nZXRTb3VyY2VSYW5nZSgpOwotICAgIERpYWcoVkQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcmVmX3Zhcl9sb2NhbF9iaW5kKQotICAgICAgPDwgVkQtPmdldERlY2xOYW1lKCkgPDwgcmFuZ2U7CisgICAgUy5EaWFnKFZELT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3JlZl92YXJfbG9jYWxfYmluZCkKKyAgICAgICAgPDwgVkQtPmdldERlY2xOYW1lKCkgPDwgcmFuZ2U7CiAgIH0KIH0KIApAQCAtNDA2MSw2ICs0NTI2LDEwIEBACiAgIGNhc2UgU3RtdDo6RGVjbFJlZkV4cHJDbGFzczogewogICAgIERlY2xSZWZFeHByICpEUiA9IGNhc3Q8RGVjbFJlZkV4cHI+KEUpOwogCisgICAgLy8gSWYgd2UgbGVhdmUgdGhlIGltbWVkaWF0ZSBmdW5jdGlvbiwgdGhlIGxpZmV0aW1lIGlzbid0IGFib3V0IHRvIGVuZC4KKyAgICBpZiAoRFItPnJlZmVyc1RvRW5jbG9zaW5nTG9jYWwoKSkKKyAgICAgIHJldHVybiAwOworCiAgICAgaWYgKFZhckRlY2wgKlYgPSBkeW5fY2FzdDxWYXJEZWNsPihEUi0+Z2V0RGVjbCgpKSkKICAgICAgIC8vIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdmFyaWFibGUsIGZvbGxvdyB0aHJvdWdoIHRvIHRoZSBleHByZXNzaW9uIHRoYXQKICAgICAgIC8vIGl0IHBvaW50cyB0by4KQEAgLTQxMTAsMjAgKzQ1NzksMjEgQEAKICAgICBDb25kaXRpb25hbE9wZXJhdG9yICpDID0gY2FzdDxDb25kaXRpb25hbE9wZXJhdG9yPihFKTsKIAogICAgIC8vIEhhbmRsZSB0aGUgR05VIGV4dGVuc2lvbiBmb3IgbWlzc2luZyBMSFMuCi0gICAgaWYgKEV4cHIgKmxoc0V4cHIgPSBDLT5nZXRMSFMoKSkgewotICAgIC8vIEluIEMrKywgd2UgY2FuIGhhdmUgYSB0aHJvdy1leHByZXNzaW9uLCB3aGljaCBoYXMgJ3ZvaWQnIHR5cGUuCi0gICAgICBpZiAoIWxoc0V4cHItPmdldFR5cGUoKS0+aXNWb2lkVHlwZSgpKQotICAgICAgICBpZiAoRXhwciogTEhTID0gRXZhbEFkZHIobGhzRXhwciwgcmVmVmFycywgUGFyZW50RGVjbCkpCisgICAgLy8gRklYTUU6IFRoYXQgaXNuJ3QgYSBDb25kaXRpb25hbE9wZXJhdG9yLCBzbyBkb2Vzbid0IGdldCBoZXJlLgorICAgIGlmIChFeHByICpMSFNFeHByID0gQy0+Z2V0TEhTKCkpIHsKKyAgICAgIC8vIEluIEMrKywgd2UgY2FuIGhhdmUgYSB0aHJvdy1leHByZXNzaW9uLCB3aGljaCBoYXMgJ3ZvaWQnIHR5cGUuCisgICAgICBpZiAoIUxIU0V4cHItPmdldFR5cGUoKS0+aXNWb2lkVHlwZSgpKQorICAgICAgICBpZiAoRXhwciAqTEhTID0gRXZhbEFkZHIoTEhTRXhwciwgcmVmVmFycywgUGFyZW50RGVjbCkpCiAgICAgICAgICAgcmV0dXJuIExIUzsKICAgICB9CiAKICAgICAvLyBJbiBDKyssIHdlIGNhbiBoYXZlIGEgdGhyb3ctZXhwcmVzc2lvbiwgd2hpY2ggaGFzICd2b2lkJyB0eXBlLgogICAgIGlmIChDLT5nZXRSSFMoKS0+Z2V0VHlwZSgpLT5pc1ZvaWRUeXBlKCkpCi0gICAgICByZXR1cm4gTlVMTDsKKyAgICAgIHJldHVybiAwOwogCiAgICAgcmV0dXJuIEV2YWxBZGRyKEMtPmdldFJIUygpLCByZWZWYXJzLCBQYXJlbnREZWNsKTsKICAgfQotICAKKwogICBjYXNlIFN0bXQ6OkJsb2NrRXhwckNsYXNzOgogICAgIGlmIChjYXN0PEJsb2NrRXhwcj4oRSktPmdldEJsb2NrRGVjbCgpLT5oYXNDYXB0dXJlcygpKQogICAgICAgcmV0dXJuIEU7IC8vIGxvY2FsIGJsb2NrLgpAQCAtNDIxNiw2ICs0Njg2LDEwIEBACiAgICAgLy8gbG9jYWwgc3RvcmFnZSB3aXRoaW4gdGhlIGZ1bmN0aW9uLCBhbmQgaWYgc28sIHJldHVybiB0aGUgZXhwcmVzc2lvbi4KICAgICBEZWNsUmVmRXhwciAqRFIgPSBjYXN0PERlY2xSZWZFeHByPihFKTsKIAorICAgIC8vIElmIHdlIGxlYXZlIHRoZSBpbW1lZGlhdGUgZnVuY3Rpb24sIHRoZSBsaWZldGltZSBpc24ndCBhYm91dCB0byBlbmQuCisgICAgaWYgKERSLT5yZWZlcnNUb0VuY2xvc2luZ0xvY2FsKCkpCisgICAgICByZXR1cm4gMDsKKwogICAgIGlmIChWYXJEZWNsICpWID0gZHluX2Nhc3Q8VmFyRGVjbD4oRFItPmdldERlY2woKSkpIHsKICAgICAgIC8vIENoZWNrIGlmIGl0IHJlZmVycyB0byBpdHNlbGYsIGUuZy4gImludCYgaSA9IGk7Ii4KICAgICAgIGlmIChWID09IFBhcmVudERlY2wpCkBAIC00MjYzLDkgKzQ3MzcsMTYgQEAKICAgICBDb25kaXRpb25hbE9wZXJhdG9yICpDID0gY2FzdDxDb25kaXRpb25hbE9wZXJhdG9yPihFKTsKIAogICAgIC8vIEhhbmRsZSB0aGUgR05VIGV4dGVuc2lvbiBmb3IgbWlzc2luZyBMSFMuCi0gICAgaWYgKEV4cHIgKmxoc0V4cHIgPSBDLT5nZXRMSFMoKSkKLSAgICAgIGlmIChFeHByICpMSFMgPSBFdmFsVmFsKGxoc0V4cHIsIHJlZlZhcnMsIFBhcmVudERlY2wpKQotICAgICAgICByZXR1cm4gTEhTOworICAgIGlmIChFeHByICpMSFNFeHByID0gQy0+Z2V0TEhTKCkpIHsKKyAgICAgIC8vIEluIEMrKywgd2UgY2FuIGhhdmUgYSB0aHJvdy1leHByZXNzaW9uLCB3aGljaCBoYXMgJ3ZvaWQnIHR5cGUuCisgICAgICBpZiAoIUxIU0V4cHItPmdldFR5cGUoKS0+aXNWb2lkVHlwZSgpKQorICAgICAgICBpZiAoRXhwciAqTEhTID0gRXZhbFZhbChMSFNFeHByLCByZWZWYXJzLCBQYXJlbnREZWNsKSkKKyAgICAgICAgICByZXR1cm4gTEhTOworICAgIH0KKworICAgIC8vIEluIEMrKywgd2UgY2FuIGhhdmUgYSB0aHJvdy1leHByZXNzaW9uLCB3aGljaCBoYXMgJ3ZvaWQnIHR5cGUuCisgICAgaWYgKEMtPmdldFJIUygpLT5nZXRUeXBlKCktPmlzVm9pZFR5cGUoKSkKKyAgICAgIHJldHVybiAwOwogCiAgICAgcmV0dXJuIEV2YWxWYWwoQy0+Z2V0UkhTKCksIHJlZlZhcnMsIFBhcmVudERlY2wpOwogICB9CkBAIC00MzA2LDYgKzQ3ODcsMzggQEAKIH0gd2hpbGUgKHRydWUpOwogfQogCit2b2lkCitTZW1hOjpDaGVja1JldHVyblZhbEV4cHIoRXhwciAqUmV0VmFsRXhwLCBRdWFsVHlwZSBsaHNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJldHVybkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT2JqQ01ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyVmVjICpBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkRlY2wgKkZEKSB7CisgIENoZWNrUmV0dXJuU3RhY2tBZGRyKCp0aGlzLCBSZXRWYWxFeHAsIGxoc1R5cGUsIFJldHVybkxvYyk7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBudWxsIGJ1dCBzaG91bGQgbm90IGJlLgorICBpZiAoQXR0cnMgJiYgaGFzU3BlY2lmaWNBdHRyPFJldHVybnNOb25OdWxsQXR0cj4oKkF0dHJzKSAmJgorICAgICAgQ2hlY2tOb25OdWxsRXhwcigqdGhpcywgUmV0VmFsRXhwKSkKKyAgICBEaWFnKFJldHVybkxvYywgZGlhZzo6d2Fybl9udWxsX3JldCkKKyAgICAgIDw8IChpc09iakNNZXRob2QgPyAxIDogMCkgPDwgUmV0VmFsRXhwLT5nZXRTb3VyY2VSYW5nZSgpOworCisgIC8vIEMrKzExIFtiYXNpYy5zdGMuZHluYW1pYy5hbGxvY2F0aW9uXXA0OgorICAvLyAgIElmIGFuIGFsbG9jYXRpb24gZnVuY3Rpb24gZGVjbGFyZWQgd2l0aCBhIG5vbi10aHJvd2luZworICAvLyAgIGV4Y2VwdGlvbi1zcGVjaWZpY2F0aW9uIGZhaWxzIHRvIGFsbG9jYXRlIHN0b3JhZ2UsIGl0IHNoYWxsIHJldHVybgorICAvLyAgIGEgbnVsbCBwb2ludGVyLiBBbnkgb3RoZXIgYWxsb2NhdGlvbiBmdW5jdGlvbiB0aGF0IGZhaWxzIHRvIGFsbG9jYXRlCisgIC8vICAgc3RvcmFnZSBzaGFsbCBpbmRpY2F0ZSBmYWlsdXJlIG9ubHkgYnkgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIFsuLi5dCisgIGlmIChGRCkgeworICAgIE92ZXJsb2FkZWRPcGVyYXRvcktpbmQgT3AgPSBGRC0+Z2V0T3ZlcmxvYWRlZE9wZXJhdG9yKCk7CisgICAgaWYgKE9wID09IE9PX05ldyB8fCBPcCA9PSBPT19BcnJheV9OZXcpIHsKKyAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpQcm90bworICAgICAgICA9IEZELT5nZXRUeXBlKCktPmNhc3RBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKKyAgICAgIGlmICghUHJvdG8tPmlzTm90aHJvdyhDb250ZXh0LCAvKlJlc3VsdElmRGVwZW5kZW50Ki90cnVlKSAmJgorICAgICAgICAgIENoZWNrTm9uTnVsbEV4cHIoKnRoaXMsIFJldFZhbEV4cCkpCisgICAgICAgIERpYWcoUmV0dXJuTG9jLCBkaWFnOjp3YXJuX29wZXJhdG9yX25ld19yZXR1cm5zX251bGwpCisgICAgICAgICAgPDwgRkQgPDwgZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMTsKKyAgICB9CisgIH0KK30KKwogLy89PT0tLS0gQ0hFQ0s6IEZsb2F0aW5nLVBvaW50IGNvbXBhcmlzb25zICgtV2Zsb2F0LWVxdWFsKSAtLS0tLS0tLS0tLS0tLS09PT0vLwogCiAvLy8gQ2hlY2sgZm9yIGNvbXBhcmlzb25zIG9mIGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzIHVzaW5nICE9IGFuZCA9PS4KQEAgLTQzMzgsMTEgKzQ4NTEsMTEgQEAKIAogICAvLyBDaGVjayBmb3IgY29tcGFyaXNvbnMgd2l0aCBidWlsdGluIHR5cGVzLgogICBpZiAoQ2FsbEV4cHIqIENMID0gZHluX2Nhc3Q8Q2FsbEV4cHI+KExlZnRFeHByU2Fuc1BhcmVuKSkKLSAgICBpZiAoQ0wtPmlzQnVpbHRpbkNhbGwoKSkKKyAgICBpZiAoQ0wtPmdldEJ1aWx0aW5DYWxsZWUoKSkKICAgICAgIHJldHVybjsKIAogICBpZiAoQ2FsbEV4cHIqIENSID0gZHluX2Nhc3Q8Q2FsbEV4cHI+KFJpZ2h0RXhwclNhbnNQYXJlbikpCi0gICAgaWYgKENSLT5pc0J1aWx0aW5DYWxsKCkpCisgICAgaWYgKENSLT5nZXRCdWlsdGluQ2FsbGVlKCkpCiAgICAgICByZXR1cm47CiAKICAgLy8gRW1pdCB0aGUgZGlhZ25vc3RpYy4KQEAgLTQ5MjAsOSArNTQzMywxMSBAQAogICBlbHNlCiAgICAgT1MgPDwgVmFsdWU7CiAKLSAgUy5EaWFnKEUtPmdldE9wZXJhdG9yTG9jKCksIGRpYWc6Ondhcm5fb3V0X29mX3JhbmdlX2NvbXBhcmUpCi0gICAgICA8PCBPUy5zdHIoKSA8PCBPdGhlclQgPDwgSXNUcnVlCi0gICAgICA8PCBFLT5nZXRMSFMoKS0+Z2V0U291cmNlUmFuZ2UoKSA8PCBFLT5nZXRSSFMoKS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgUy5EaWFnUnVudGltZUJlaGF2aW9yKEUtPmdldE9wZXJhdG9yTG9jKCksIEUsCisgICAgICAgICAgICAgICAgICAgICAgICBTLlBEaWFnKGRpYWc6Ondhcm5fb3V0X29mX3JhbmdlX2NvbXBhcmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE9TLnN0cigpIDw8IE90aGVyVCA8PCBJc1RydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRS0+Z2V0TEhTKCktPmdldFNvdXJjZVJhbmdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRS0+Z2V0UkhTKCktPmdldFNvdXJjZVJhbmdlKCkpOwogfQogCiAvLy8gQW5hbHl6ZSB0aGUgb3BlcmFuZHMgb2YgdGhlIGdpdmVuIGNvbXBhcmlzb24uICBJbXBsZW1lbnRzIHRoZQpAQCAtNTIzMSwzOSArNTc0NiwyMSBAQAogICBpZiAoVGFyZ2V0LT5pc1NwZWNpZmljQnVpbHRpblR5cGUoQnVpbHRpblR5cGU6OkJvb2wpKSB7CiAgICAgaWYgKGlzYTxTdHJpbmdMaXRlcmFsPihFKSkKICAgICAgIC8vIFdhcm4gb24gc3RyaW5nIGxpdGVyYWwgdG8gYm9vbC4gIENoZWNrcyBmb3Igc3RyaW5nIGxpdGVyYWxzIGluIGxvZ2ljYWwKLSAgICAgIC8vIGV4cHJlc3Npb25zLCBmb3IgaW5zdGFuY2VzLCBhc3NlcnQoMCAmJiAiZXJyb3IgaGVyZSIpLCBpcyBwcmV2ZW50ZWQKLSAgICAgIC8vIGJ5IGEgY2hlY2sgaW4gQW5hbHl6ZUltcGxpY2l0Q29udmVyc2lvbnMoKS4KKyAgICAgIC8vIGFuZCBleHByZXNzaW9ucywgZm9yIGluc3RhbmNlLCBhc3NlcnQoMCAmJiAiZXJyb3IgaGVyZSIpLCBhcmUKKyAgICAgIC8vIHByZXZlbnRlZCBieSBhIGNoZWNrIGluIEFuYWx5emVJbXBsaWNpdENvbnZlcnNpb25zKCkuCiAgICAgICByZXR1cm4gRGlhZ25vc2VJbXBDYXN0KFMsIEUsIFQsIENDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjp3YXJuX2ltcGNhc3Rfc3RyaW5nX2xpdGVyYWxfdG9fYm9vbCk7Ci0gICAgaWYgKFNvdXJjZS0+aXNGdW5jdGlvblR5cGUoKSkgewotICAgICAgLy8gV2FybiBvbiBmdW5jdGlvbiB0byBib29sLiBDaGVja3MgZnJlZSBmdW5jdGlvbnMgYW5kIHN0YXRpYyBtZW1iZXIKLSAgICAgIC8vIGZ1bmN0aW9ucy4gV2Vha2x5IGltcG9ydGVkIGZ1bmN0aW9ucyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgY2hlY2ssCi0gICAgICAvLyBzaW5jZSBpdCdzIGNvbW1vbiB0byB0ZXN0IHRoZWlyIHZhbHVlIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGxpbmtlcgotICAgICAgLy8gZm91bmQgYSBkZWZpbml0aW9uIGZvciB0aGVtLgotICAgICAgVmFsdWVEZWNsICpEID0gMDsKLSAgICAgIGlmIChEZWNsUmVmRXhwciogUiA9IGR5bl9jYXN0PERlY2xSZWZFeHByPihFKSkgewotICAgICAgICBEID0gUi0+Z2V0RGVjbCgpOwotICAgICAgfSBlbHNlIGlmIChNZW1iZXJFeHByICpNID0gZHluX2Nhc3Q8TWVtYmVyRXhwcj4oRSkpIHsKLSAgICAgICAgRCA9IE0tPmdldE1lbWJlckRlY2woKTsKLSAgICAgIH0KLQotICAgICAgaWYgKEQgJiYgIUQtPmlzV2VhaygpKSB7Ci0gICAgICAgIGlmIChGdW5jdGlvbkRlY2wqIEYgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEQpKSB7Ci0gICAgICAgICAgUy5EaWFnKEUtPmdldEV4cHJMb2MoKSwgZGlhZzo6d2Fybl9pbXBjYXN0X2Z1bmN0aW9uX3RvX2Jvb2wpCi0gICAgICAgICAgICA8PCBGIDw8IEUtPmdldFNvdXJjZVJhbmdlKCkgPDwgU291cmNlUmFuZ2UoQ0MpOwotICAgICAgICAgIFMuRGlhZyhFLT5nZXRFeHByTG9jKCksIGRpYWc6Om5vdGVfZnVuY3Rpb25fdG9fYm9vbF9zaWxlbmNlKQotICAgICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oRS0+Z2V0RXhwckxvYygpLCAiJiIpOwotICAgICAgICAgIFF1YWxUeXBlIFJldHVyblR5cGU7Ci0gICAgICAgICAgVW5yZXNvbHZlZFNldDw0PiBOb25UZW1wbGF0ZU92ZXJsb2FkczsKLSAgICAgICAgICBTLnRyeUV4cHJBc0NhbGwoKkUsIFJldHVyblR5cGUsIE5vblRlbXBsYXRlT3ZlcmxvYWRzKTsKLSAgICAgICAgICBpZiAoIVJldHVyblR5cGUuaXNOdWxsKCkgCi0gICAgICAgICAgICAgICYmIFJldHVyblR5cGUtPmlzU3BlY2lmaWNCdWlsdGluVHlwZShCdWlsdGluVHlwZTo6Qm9vbCkpCi0gICAgICAgICAgICBTLkRpYWcoRS0+Z2V0RXhwckxvYygpLCBkaWFnOjpub3RlX2Z1bmN0aW9uX3RvX2Jvb2xfY2FsbCkKLSAgICAgICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oCi0gICAgICAgICAgICAgICAgIFMuZ2V0UHJlcHJvY2Vzc29yKCkuZ2V0TG9jRm9yRW5kT2ZUb2tlbihFLT5nZXRMb2NFbmQoKSksICIoKSIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQorICAgIGlmIChpc2E8T2JqQ1N0cmluZ0xpdGVyYWw+KEUpIHx8IGlzYTxPYmpDQXJyYXlMaXRlcmFsPihFKSB8fAorICAgICAgICBpc2E8T2JqQ0RpY3Rpb25hcnlMaXRlcmFsPihFKSB8fCBpc2E8T2JqQ0JveGVkRXhwcj4oRSkpIHsKKyAgICAgIC8vIFRoaXMgY292ZXJzIHRoZSBsaXRlcmFsIGV4cHJlc3Npb25zIHRoYXQgZXZhbHVhdGUgdG8gT2JqZWN0aXZlLUMKKyAgICAgIC8vIG9iamVjdHMuCisgICAgICByZXR1cm4gRGlhZ25vc2VJbXBDYXN0KFMsIEUsIFQsIENDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjp3YXJuX2ltcGNhc3Rfb2JqZWN0aXZlX2NfbGl0ZXJhbF90b19ib29sKTsKKyAgICB9CisgICAgaWYgKFNvdXJjZS0+aXNQb2ludGVyVHlwZSgpIHx8IFNvdXJjZS0+Y2FuRGVjYXlUb1BvaW50ZXJUeXBlKCkpIHsKKyAgICAgIC8vIFdhcm4gb24gcG9pbnRlciB0byBib29sIGNvbnZlcnNpb24gdGhhdCBpcyBhbHdheXMgdHJ1ZS4KKyAgICAgIFMuRGlhZ25vc2VBbHdheXNOb25OdWxsUG9pbnRlcihFLCBFeHByOjpOUENLX05vdE51bGwsIC8qSXNFcXVhbCovIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlKENDKSk7CiAgICAgfQogICB9CiAKQEAgLTUyODMsNiArNTc4MCw4IEBACiAgICAgU291cmNlID0gY2FzdDxWZWN0b3JUeXBlPihTb3VyY2UpLT5nZXRFbGVtZW50VHlwZSgpLmdldFR5cGVQdHIoKTsKICAgICBUYXJnZXQgPSBjYXN0PFZlY3RvclR5cGU+KFRhcmdldCktPmdldEVsZW1lbnRUeXBlKCkuZ2V0VHlwZVB0cigpOwogICB9CisgIGlmIChhdXRvIFZlY1R5ID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oVGFyZ2V0KSkKKyAgICBUYXJnZXQgPSBWZWNUeS0+Z2V0RWxlbWVudFR5cGUoKS5nZXRUeXBlUHRyKCk7CiAKICAgLy8gU3RyaXAgY29tcGxleCB0eXBlcy4KICAgaWYgKGlzYTxDb21wbGV4VHlwZT4oU291cmNlKSkgewpAQCAtNTU4MywxNSArNjA4MiwxNiBAQAogICAvLyBOb3cganVzdCByZWN1cnNlIG92ZXIgdGhlIGV4cHJlc3Npb24ncyBjaGlsZHJlbi4KICAgQ0MgPSBFLT5nZXRFeHByTG9jKCk7CiAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihFKTsKLSAgYm9vbCBJc0xvZ2ljYWxPcGVyYXRvciA9IEJPICYmIEJPLT5pc0xvZ2ljYWxPcCgpOworICBib29sIElzTG9naWNhbEFuZE9wZXJhdG9yID0gQk8gJiYgQk8tPmdldE9wY29kZSgpID09IEJPX0xBbmQ7CiAgIGZvciAoU3RtdDo6Y2hpbGRfcmFuZ2UgSSA9IEUtPmNoaWxkcmVuKCk7IEk7ICsrSSkgewogICAgIEV4cHIgKkNoaWxkRXhwciA9IGR5bl9jYXN0X29yX251bGw8RXhwcj4oKkkpOwogICAgIGlmICghQ2hpbGRFeHByKQogICAgICAgY29udGludWU7CiAKLSAgICBpZiAoSXNMb2dpY2FsT3BlcmF0b3IgJiYKKyAgICBpZiAoSXNMb2dpY2FsQW5kT3BlcmF0b3IgJiYKICAgICAgICAgaXNhPFN0cmluZ0xpdGVyYWw+KENoaWxkRXhwci0+SWdub3JlUGFyZW5JbXBDYXN0cygpKSkKLSAgICAgIC8vIElnbm9yZSBjaGVja2luZyBzdHJpbmcgbGl0ZXJhbHMgdGhhdCBhcmUgaW4gbG9naWNhbCBvcGVyYXRvcnMuCisgICAgICAvLyBJZ25vcmUgY2hlY2tpbmcgc3RyaW5nIGxpdGVyYWxzIHRoYXQgYXJlIGluIGxvZ2ljYWwgYW5kIG9wZXJhdG9ycy4KKyAgICAgIC8vIFRoaXMgaXMgYSBjb21tb24gcGF0dGVybiBmb3IgYXNzZXJ0cy4KICAgICAgIGNvbnRpbnVlOwogICAgIEFuYWx5emVJbXBsaWNpdENvbnZlcnNpb25zKFMsIENoaWxkRXhwciwgQ0MpOwogICB9CkBAIC01NTk5LDYgKzYwOTksMTI1IEBACiAKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIAorZW51bSB7CisgIEFkZHJlc3NPZiwKKyAgRnVuY3Rpb25Qb2ludGVyLAorICBBcnJheVBvaW50ZXIKK307CisKKy8vLyBcYnJpZWYgRGlhZ25vc2UgcG9pbnRlcnMgdGhhdCBhcmUgYWx3YXlzIG5vbi1udWxsLgorLy8vIFxwYXJhbSBFIHRoZSBleHByZXNzaW9uIGNvbnRhaW5pbmcgdGhlIHBvaW50ZXIKKy8vLyBccGFyYW0gTnVsbEtpbmQgTlBDS19Ob3ROdWxsIGlmIEUgaXMgYSBjYXN0IHRvIGJvb2wsIG90aGVyd2lzZSwgRSBpcworLy8vIGNvbXBhcmVkIHRvIGEgbnVsbCBwb2ludGVyCisvLy8gXHBhcmFtIElzRXF1YWwgVHJ1ZSB3aGVuIHRoZSBjb21wYXJpc29uIGlzIGVxdWFsIHRvIGEgbnVsbCBwb2ludGVyCisvLy8gXHBhcmFtIFJhbmdlIEV4dHJhIFNvdXJjZVJhbmdlIHRvIGhpZ2hsaWdodCBpbiB0aGUgZGlhZ25vc3RpYwordm9pZCBTZW1hOjpEaWFnbm9zZUFsd2F5c05vbk51bGxQb2ludGVyKEV4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcjo6TnVsbFBvaW50ZXJDb25zdGFudEtpbmQgTnVsbEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0VxdWFsLCBTb3VyY2VSYW5nZSBSYW5nZSkgeworCisgIC8vIERvbid0IHdhcm4gaW5zaWRlIG1hY3Jvcy4KKyAgaWYgKEUtPmdldEV4cHJMb2MoKS5pc01hY3JvSUQoKSkKKyAgICAgIHJldHVybjsKKyAgRSA9IEUtPklnbm9yZUltcENhc3RzKCk7CisKKyAgY29uc3QgYm9vbCBJc0NvbXBhcmUgPSBOdWxsS2luZCAhPSBFeHByOjpOUENLX05vdE51bGw7CisKKyAgYm9vbCBJc0FkZHJlc3NPZiA9IGZhbHNlOworCisgIGlmIChVbmFyeU9wZXJhdG9yICpVTyA9IGR5bl9jYXN0PFVuYXJ5T3BlcmF0b3I+KEUpKSB7CisgICAgaWYgKFVPLT5nZXRPcGNvZGUoKSAhPSBVT19BZGRyT2YpCisgICAgICByZXR1cm47CisgICAgSXNBZGRyZXNzT2YgPSB0cnVlOworICAgIEUgPSBVTy0+Z2V0U3ViRXhwcigpOworICB9CisKKyAgLy8gRXhwZWN0IHRvIGZpbmQgYSBzaW5nbGUgRGVjbC4gIFNraXAgYW55dGhpbmcgbW9yZSBjb21wbGljYXRlZC4KKyAgVmFsdWVEZWNsICpEID0gMDsKKyAgaWYgKERlY2xSZWZFeHByICpSID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KEUpKSB7CisgICAgRCA9IFItPmdldERlY2woKTsKKyAgfSBlbHNlIGlmIChNZW1iZXJFeHByICpNID0gZHluX2Nhc3Q8TWVtYmVyRXhwcj4oRSkpIHsKKyAgICBEID0gTS0+Z2V0TWVtYmVyRGVjbCgpOworICB9CisKKyAgLy8gV2VhayBEZWNscyBjYW4gYmUgbnVsbC4KKyAgaWYgKCFEIHx8IEQtPmlzV2VhaygpKQorICAgIHJldHVybjsKKworICBRdWFsVHlwZSBUID0gRC0+Z2V0VHlwZSgpOworICBjb25zdCBib29sIElzQXJyYXkgPSBULT5pc0FycmF5VHlwZSgpOworICBjb25zdCBib29sIElzRnVuY3Rpb24gPSBULT5pc0Z1bmN0aW9uVHlwZSgpOworCisgIGlmIChJc0FkZHJlc3NPZikgeworICAgIC8vIEFkZHJlc3Mgb2YgZnVuY3Rpb24gaXMgdXNlZCB0byBzaWxlbmNlIHRoZSBmdW5jdGlvbiB3YXJuaW5nLgorICAgIGlmIChJc0Z1bmN0aW9uKQorICAgICAgcmV0dXJuOworICAgIC8vIEFkZHJlc3Mgb2YgcmVmZXJlbmNlIGNhbiBiZSBudWxsLgorICAgIGlmIChULT5pc1JlZmVyZW5jZVR5cGUoKSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIC8vIEZvdW5kIG5vdGhpbmcuCisgIGlmICghSXNBZGRyZXNzT2YgJiYgIUlzRnVuY3Rpb24gJiYgIUlzQXJyYXkpCisgICAgcmV0dXJuOworCisgIC8vIFByZXR0eSBwcmludCB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIGRpYWdub3N0aWMuCisgIHN0ZDo6c3RyaW5nIFN0cjsKKyAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIFMoU3RyKTsKKyAgRS0+cHJpbnRQcmV0dHkoUywgMCwgZ2V0UHJpbnRpbmdQb2xpY3koKSk7CisKKyAgdW5zaWduZWQgRGlhZ0lEID0gSXNDb21wYXJlID8gZGlhZzo6d2Fybl9udWxsX3BvaW50ZXJfY29tcGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjp3YXJuX2ltcGNhc3RfcG9pbnRlcl90b19ib29sOworICB1bnNpZ25lZCBEaWFnVHlwZTsKKyAgaWYgKElzQWRkcmVzc09mKQorICAgIERpYWdUeXBlID0gQWRkcmVzc09mOworICBlbHNlIGlmIChJc0Z1bmN0aW9uKQorICAgIERpYWdUeXBlID0gRnVuY3Rpb25Qb2ludGVyOworICBlbHNlIGlmIChJc0FycmF5KQorICAgIERpYWdUeXBlID0gQXJyYXlQb2ludGVyOworICBlbHNlCisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ291bGQgbm90IGRldGVybWluZSBkaWFnbm9zdGljLiIpOworICBEaWFnKEUtPmdldEV4cHJMb2MoKSwgRGlhZ0lEKSA8PCBEaWFnVHlwZSA8PCBTLnN0cigpIDw8IEUtPmdldFNvdXJjZVJhbmdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgUmFuZ2UgPDwgSXNFcXVhbDsKKworICBpZiAoIUlzRnVuY3Rpb24pCisgICAgcmV0dXJuOworCisgIC8vIFN1Z2dlc3QgJyYnIHRvIHNpbGVuY2UgdGhlIGZ1bmN0aW9uIHdhcm5pbmcuCisgIERpYWcoRS0+Z2V0RXhwckxvYygpLCBkaWFnOjpub3RlX2Z1bmN0aW9uX3dhcm5pbmdfc2lsZW5jZSkKKyAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKEUtPmdldExvY1N0YXJ0KCksICImIik7CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmICcoKScgZml4aXQgc2hvdWxkIGJlIGVtaXR0ZWQuCisgIFF1YWxUeXBlIFJldHVyblR5cGU7CisgIFVucmVzb2x2ZWRTZXQ8ND4gTm9uVGVtcGxhdGVPdmVybG9hZHM7CisgIHRyeUV4cHJBc0NhbGwoKkUsIFJldHVyblR5cGUsIE5vblRlbXBsYXRlT3ZlcmxvYWRzKTsKKyAgaWYgKFJldHVyblR5cGUuaXNOdWxsKCkpCisgICAgcmV0dXJuOworCisgIGlmIChJc0NvbXBhcmUpIHsKKyAgICAvLyBUaGVyZSBhcmUgdHdvIGNhc2VzIGhlcmUuICBJZiB0aGVyZSBpcyBudWxsIGNvbnN0YW50LCB0aGUgb25seSBzdWdnZXN0CisgICAgLy8gZm9yIGEgcG9pbnRlciByZXR1cm4gdHlwZS4gIElmIHRoZSBudWxsIGlzIDAsIHRoZW4gc3VnZ2VzdCBpZiB0aGUgcmV0dXJuCisgICAgLy8gdHlwZSBpcyBhIHBvaW50ZXIgb3IgYW4gaW50ZWdlciB0eXBlLgorICAgIGlmICghUmV0dXJuVHlwZS0+aXNQb2ludGVyVHlwZSgpKSB7CisgICAgICBpZiAoTnVsbEtpbmQgPT0gRXhwcjo6TlBDS19aZXJvRXhwcmVzc2lvbiB8fAorICAgICAgICAgIE51bGxLaW5kID09IEV4cHI6Ok5QQ0tfWmVyb0xpdGVyYWwpIHsKKyAgICAgICAgaWYgKCFSZXR1cm5UeXBlLT5pc0ludGVnZXJUeXBlKCkpCisgICAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsgLy8gIUlzQ29tcGFyZQorICAgIC8vIEZvciBmdW5jdGlvbiB0byBib29sLCBvbmx5IHN1Z2dlc3QgaWYgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaGFzIGJvb2wKKyAgICAvLyByZXR1cm4gdHlwZS4KKyAgICBpZiAoIVJldHVyblR5cGUtPmlzU3BlY2lmaWNCdWlsdGluVHlwZShCdWlsdGluVHlwZTo6Qm9vbCkpCisgICAgICByZXR1cm47CisgIH0KKyAgRGlhZyhFLT5nZXRFeHByTG9jKCksIGRpYWc6Om5vdGVfZnVuY3Rpb25fdG9fZnVuY3Rpb25fY2FsbCkKKyAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKAorICAgICAgICAgICAgIGdldFByZXByb2Nlc3NvcigpLmdldExvY0ZvckVuZE9mVG9rZW4oRS0+Z2V0TG9jRW5kKCkpLCAiKCkiKTsKK30KKworCiAvLy8gRGlhZ25vc2VzICJkYW5nZXJvdXMiIGltcGxpY2l0IGNvbnZlcnNpb25zIHdpdGhpbiB0aGUgZ2l2ZW4KIC8vLyBleHByZXNzaW9uICh3aGljaCBpcyBhIGZ1bGwgZXhwcmVzc2lvbikuICBJbXBsZW1lbnRzIC1XY29udmVyc2lvbgogLy8vIGFuZCAtV3NpZ24tY29tcGFyZS4KQEAgLTYxODksMTEgKzY4MDgsMjMgQEAKIAogICAgIC8vIE1TVkMgZGVzdHJveXMgb2JqZWN0cyBwYXNzZWQgYnkgdmFsdWUgaW4gdGhlIGNhbGxlZS4gIFRoZXJlZm9yZSBhCiAgICAgLy8gZnVuY3Rpb24gZGVmaW5pdGlvbiB3aGljaCB0YWtlcyBzdWNoIGEgcGFyYW1ldGVyIG11c3QgYmUgYWJsZSB0byBjYWxsIHRoZQotICAgIC8vIG9iamVjdCdzIGRlc3RydWN0b3IuCi0gICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmCi0gICAgICAgIENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldENYWEFCSSgpLmlzQXJndW1lbnREZXN0cm95ZWRCeUNhbGxlZSgpKSB7Ci0gICAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBQYXJhbS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpKQotICAgICAgICBGaW5hbGl6ZVZhcldpdGhEZXN0cnVjdG9yKFBhcmFtLCBSVCk7CisgICAgLy8gb2JqZWN0J3MgZGVzdHJ1Y3Rvci4gIEhvd2V2ZXIsIHdlIGRvbid0IHBlcmZvcm0gYW55IGRpcmVjdCBhY2Nlc3MgY2hlY2sKKyAgICAvLyBvbiB0aGUgZHRvci4KKyAgICBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMgJiYgQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDWFhBQkkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFyZUFyZ3NEZXN0cm95ZWRMZWZ0VG9SaWdodEluQ2FsbGVlKCkpIHsKKyAgICAgIGlmICghUGFyYW0tPmlzSW52YWxpZERlY2woKSkgeworICAgICAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBQYXJhbS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CisgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqQ2xhc3NEZWNsID0gY2FzdDxDWFhSZWNvcmREZWNsPihSVC0+Z2V0RGVjbCgpKTsKKyAgICAgICAgICBpZiAoIUNsYXNzRGVjbC0+aXNJbnZhbGlkRGVjbCgpICYmCisgICAgICAgICAgICAgICFDbGFzc0RlY2wtPmhhc0lycmVsZXZhbnREZXN0cnVjdG9yKCkgJiYKKyAgICAgICAgICAgICAgIUNsYXNzRGVjbC0+aXNEZXBlbmRlbnRDb250ZXh0KCkpIHsKKyAgICAgICAgICAgIENYWERlc3RydWN0b3JEZWNsICpEZXN0cnVjdG9yID0gTG9va3VwRGVzdHJ1Y3RvcihDbGFzc0RlY2wpOworICAgICAgICAgICAgTWFya0Z1bmN0aW9uUmVmZXJlbmNlZChQYXJhbS0+Z2V0TG9jYXRpb24oKSwgRGVzdHJ1Y3Rvcik7CisgICAgICAgICAgICBEaWFnbm9zZVVzZU9mRGVjbChEZXN0cnVjdG9yLCBQYXJhbS0+Z2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CiAgICAgfQogICB9CiAKQEAgLTY3ODQsNyArNzQxNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpMSFMsIEV4cHIgKlJIUykgewogICBRdWFsVHlwZSBMSFNUeXBlOwogICAvLyBQcm9wZXJ0eVJlZiBvbiBMSFMgdHlwZSBuZWVkIGJlIGRpcmVjdGx5IG9idGFpbmVkIGZyb20KLSAgLy8gaXRzIGRlY2xhcmF0aW9uIGFzIGl0IGhhcyBhIFBzdWVkb1R5cGUuCisgIC8vIGl0cyBkZWNsYXJhdGlvbiBhcyBpdCBoYXMgYSBQc2V1ZG9UeXBlLgogICBPYmpDUHJvcGVydHlSZWZFeHByICpQUkUKICAgICA9IGR5bl9jYXN0PE9iakNQcm9wZXJ0eVJlZkV4cHI+KExIUy0+SWdub3JlUGFyZW5zKCkpOwogICBpZiAoUFJFICYmICFQUkUtPmlzSW1wbGljaXRQcm9wZXJ0eSgpKSB7CkBAIC03MDU3LDIxICs3Njg4LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZERlY2wgKlJEMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkRGVjbCAqUkQyKSB7CiAgIGxsdm06OlNtYWxsUHRyU2V0PEZpZWxkRGVjbCAqLCA4PiBVbm1hdGNoZWRGaWVsZHM7Ci0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRmllbGQyID0gUkQyLT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkMkVuZCA9IFJEMi0+ZmllbGRfZW5kKCk7Ci0gICAgICAgRmllbGQyICE9IEZpZWxkMkVuZDsgKytGaWVsZDIpIHsKLSAgICBVbm1hdGNoZWRGaWVsZHMuaW5zZXJ0KCpGaWVsZDIpOwotICB9CisgIGZvciAoYXV0byAqRmllbGQyIDogUkQyLT5maWVsZHMoKSkKKyAgICBVbm1hdGNoZWRGaWVsZHMuaW5zZXJ0KEZpZWxkMik7CiAKLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGaWVsZDEgPSBSRDEtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQxRW5kID0gUkQxLT5maWVsZF9lbmQoKTsKLSAgICAgICBGaWVsZDEgIT0gRmllbGQxRW5kOyArK0ZpZWxkMSkgeworICBmb3IgKGF1dG8gKkZpZWxkMSA6IFJEMS0+ZmllbGRzKCkpIHsKICAgICBsbHZtOjpTbWFsbFB0clNldDxGaWVsZERlY2wgKiwgOD46Oml0ZXJhdG9yCiAgICAgICAgIEkgPSBVbm1hdGNoZWRGaWVsZHMuYmVnaW4oKSwKICAgICAgICAgRSA9IFVubWF0Y2hlZEZpZWxkcy5lbmQoKTsKIAogICAgIGZvciAoIDsgSSAhPSBFOyArK0kpIHsKLSAgICAgIGlmIChpc0xheW91dENvbXBhdGlibGUoQywgKkZpZWxkMSwgKkkpKSB7CisgICAgICBpZiAoaXNMYXlvdXRDb21wYXRpYmxlKEMsIEZpZWxkMSwgKkkpKSB7CiAgICAgICAgIGJvb2wgUmVzdWx0ID0gVW5tYXRjaGVkRmllbGRzLmVyYXNlKCpJKTsKICAgICAgICAgKHZvaWQpIFJlc3VsdDsKICAgICAgICAgYXNzZXJ0KFJlc3VsdCk7CkBAIC03MjM2LDEwICs3ODYyLDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiAKICAgaWYgKFZEKSB7Ci0gICAgZm9yIChzcGVjaWZpY19hdHRyX2l0ZXJhdG9yPFR5cGVUYWdGb3JEYXRhdHlwZUF0dHI+Ci0gICAgICAgICAgICAgSSA9IFZELT5zcGVjaWZpY19hdHRyX2JlZ2luPFR5cGVUYWdGb3JEYXRhdHlwZUF0dHI+KCksCi0gICAgICAgICAgICAgRSA9IFZELT5zcGVjaWZpY19hdHRyX2VuZDxUeXBlVGFnRm9yRGF0YXR5cGVBdHRyPigpOwotICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoVHlwZVRhZ0ZvckRhdGF0eXBlQXR0ciAqSSA9IFZELT5nZXRBdHRyPFR5cGVUYWdGb3JEYXRhdHlwZUF0dHI+KCkpIHsKICAgICAgIGlmIChJLT5nZXRBcmd1bWVudEtpbmQoKSAhPSBBcmd1bWVudEtpbmQpIHsKICAgICAgICAgRm91bmRXcm9uZ0tpbmQgPSB0cnVlOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC03MzcyLDggKzc5OTUsOSBAQAogCiAgIGlmIChtaXNtYXRjaCkKICAgICBEaWFnKEFyZ3VtZW50RXhwci0+Z2V0RXhwckxvYygpLCBkaWFnOjp3YXJuX3R5cGVfc2FmZXR5X3R5cGVfbWlzbWF0Y2gpCi0gICAgICAgIDw8IEFyZ3VtZW50VHlwZSA8PCBBcmd1bWVudEtpbmQtPmdldE5hbWUoKQorICAgICAgICA8PCBBcmd1bWVudFR5cGUgPDwgQXJndW1lbnRLaW5kCiAgICAgICAgIDw8IFR5cGVJbmZvLkxheW91dENvbXBhdGlibGUgPDwgUmVxdWlyZWRUeXBlCiAgICAgICAgIDw8IEFyZ3VtZW50RXhwci0+Z2V0U291cmNlUmFuZ2UoKQogICAgICAgICA8PCBUeXBlVGFnRXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKIH0KKwpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvU2VtYUNvZGVDb21wbGV0ZS5jcHAgYi9saWIvU2VtYS9TZW1hQ29kZUNvbXBsZXRlLmNwcAppbmRleCA3YTFiMzZiLi5kNDRjMDRiIDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hQ29kZUNvbXBsZXRlLmNwcAorKysgYi9saWIvU2VtYS9TZW1hQ29kZUNvbXBsZXRlLmNwcApAQCAtNjYwLDEzICs2NjAsMTAgQEAKICAgICByZXR1cm4gQy5nZXRPYmpDSW50ZXJmYWNlVHlwZShJZmFjZSk7CiAgIAogICBRdWFsVHlwZSBUOwotICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGdW5jdGlvbiA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oTkQpKQorICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGdW5jdGlvbiA9IE5ELT5nZXRBc0Z1bmN0aW9uKCkpCiAgICAgVCA9IEZ1bmN0aW9uLT5nZXRDYWxsUmVzdWx0VHlwZSgpOwogICBlbHNlIGlmIChjb25zdCBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kID0gZHluX2Nhc3Q8T2JqQ01ldGhvZERlY2w+KE5EKSkKICAgICBUID0gTWV0aG9kLT5nZXRTZW5kUmVzdWx0VHlwZSgpOwotICBlbHNlIGlmIChjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRnVuVG1wbCA9Ci0gICAgICAgICAgICAgICBkeW5fY2FzdDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oTkQpKQotICAgIFQgPSBGdW5UbXBsLT5nZXRUZW1wbGF0ZWREZWNsKCktPmdldENhbGxSZXN1bHRUeXBlKCk7CiAgIGVsc2UgaWYgKGNvbnN0IEVudW1Db25zdGFudERlY2wgKkVudW1lcmF0b3IgPSBkeW5fY2FzdDxFbnVtQ29uc3RhbnREZWNsPihORCkpCiAgICAgVCA9IEMuZ2V0VHlwZURlY2xUeXBlKGNhc3Q8RW51bURlY2w+KEVudW1lcmF0b3ItPmdldERlY2xDb250ZXh0KCkpKTsKICAgZWxzZSBpZiAoY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqUHJvcGVydHkgPSBkeW5fY2FzdDxPYmpDUHJvcGVydHlEZWNsPihORCkpCkBAIC03MDAsNyArNjk3LDcgQEAKICAgICB9CiAKICAgICBpZiAoY29uc3QgRnVuY3Rpb25UeXBlICpGdW5jdGlvbiA9IFQtPmdldEFzPEZ1bmN0aW9uVHlwZT4oKSkgewotICAgICAgVCA9IEZ1bmN0aW9uLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgICBUID0gRnVuY3Rpb24tPmdldFJldHVyblR5cGUoKTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIApAQCAtMTI1Niw5ICsxMjUzLDkgQEAKICAgcHVibGljOgogICAgIENvZGVDb21wbGV0aW9uRGVjbENvbnN1bWVyKFJlc3VsdEJ1aWxkZXIgJlJlc3VsdHMsIERlY2xDb250ZXh0ICpDdXJDb250ZXh0KQogICAgICAgOiBSZXN1bHRzKFJlc3VsdHMpLCBDdXJDb250ZXh0KEN1ckNvbnRleHQpIHsgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBGb3VuZERlY2woTmFtZWREZWNsICpORCwgTmFtZWREZWNsICpIaWRpbmcsIERlY2xDb250ZXh0ICpDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluQmFzZUNsYXNzKSB7CisKKyAgICB2b2lkIEZvdW5kRGVjbChOYW1lZERlY2wgKk5ELCBOYW1lZERlY2wgKkhpZGluZywgRGVjbENvbnRleHQgKkN0eCwKKyAgICAgICAgICAgICAgICAgICBib29sIEluQmFzZUNsYXNzKSBvdmVycmlkZSB7CiAgICAgICBib29sIEFjY2Vzc2libGUgPSB0cnVlOwogICAgICAgaWYgKEN0eCkKICAgICAgICAgQWNjZXNzaWJsZSA9IFJlc3VsdHMuZ2V0U2VtYSgpLklzU2ltcGx5QWNjZXNzaWJsZShORCwgQ3R4KTsKQEAgLTE3ODQsMTAgKzE3ODEsMTAgQEAKICAgICAvLyBrbm93IHRoZSBmdW5jdGlvbiBpcyB2b2lkIG9yIG5vdC4KICAgICBib29sIGlzVm9pZCA9IGZhbHNlOwogICAgIGlmIChGdW5jdGlvbkRlY2wgKkZ1bmN0aW9uID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihTZW1hUmVmLkN1ckNvbnRleHQpKQotICAgICAgaXNWb2lkID0gRnVuY3Rpb24tPmdldFJlc3VsdFR5cGUoKS0+aXNWb2lkVHlwZSgpOworICAgICAgaXNWb2lkID0gRnVuY3Rpb24tPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHlwZSgpOwogICAgIGVsc2UgaWYgKE9iakNNZXRob2REZWNsICpNZXRob2QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZHluX2Nhc3Q8T2JqQ01ldGhvZERlY2w+KFNlbWFSZWYuQ3VyQ29udGV4dCkpCi0gICAgICBpc1ZvaWQgPSBNZXRob2QtPmdldFJlc3VsdFR5cGUoKS0+aXNWb2lkVHlwZSgpOworICAgICAgaXNWb2lkID0gTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCktPmlzVm9pZFR5cGUoKTsKICAgICBlbHNlIGlmIChTZW1hUmVmLmdldEN1ckJsb2NrKCkgJiYgCiAgICAgICAgICAgICAgIVNlbWFSZWYuZ2V0Q3VyQmxvY2soKS0+UmV0dXJuVHlwZS5pc051bGwoKSkKICAgICAgIGlzVm9pZCA9IFNlbWFSZWYuZ2V0Q3VyQmxvY2soKS0+UmV0dXJuVHlwZS0+aXNWb2lkVHlwZSgpOwpAQCAtMjA2NiwxNCArMjA2MywxMSBAQAogICAgIHJldHVybjsKIAogICAvLyBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIGRlY2xhcmF0aW9uIChpZiBpdCBoYXMgYSB0eXBlKS4KLSAgUXVhbFR5cGUgVDsgIAotICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGdW5jdGlvbiA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oTkQpKQotICAgIFQgPSBGdW5jdGlvbi0+Z2V0UmVzdWx0VHlwZSgpOworICBRdWFsVHlwZSBUOworICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGdW5jdGlvbiA9IE5ELT5nZXRBc0Z1bmN0aW9uKCkpCisgICAgVCA9IEZ1bmN0aW9uLT5nZXRSZXR1cm5UeXBlKCk7CiAgIGVsc2UgaWYgKGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2QgPSBkeW5fY2FzdDxPYmpDTWV0aG9kRGVjbD4oTkQpKQotICAgIFQgPSBNZXRob2QtPmdldFJlc3VsdFR5cGUoKTsKLSAgZWxzZSBpZiAoY29uc3QgRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkZ1blRtcGwgPQotICAgICAgICAgICAgICAgZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KE5EKSkKLSAgICBUID0gRnVuVG1wbC0+Z2V0VGVtcGxhdGVkRGVjbCgpLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgVCA9IE1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpOwogICBlbHNlIGlmIChjb25zdCBFbnVtQ29uc3RhbnREZWNsICpFbnVtZXJhdG9yID0gZHluX2Nhc3Q8RW51bUNvbnN0YW50RGVjbD4oTkQpKQogICAgIFQgPSBDb250ZXh0LmdldFR5cGVEZWNsVHlwZShjYXN0PFR5cGVEZWNsPihFbnVtZXJhdG9yLT5nZXREZWNsQ29udGV4dCgpKSk7CiAgIGVsc2UgaWYgKGlzYTxVbnJlc29sdmVkVXNpbmdWYWx1ZURlY2w+KE5EKSkgewpAQCAtMjIwNiwyNiArMjIwMCwyNiBAQAogICAvLyBXZSBoYXZlIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgYmVoaW5kIHRoZSBibG9jayBwb2ludGVyIHR5cGUsIGFzIGl0IHdhcwogICAvLyB3cml0dGVuIGluIHRoZSBzb3VyY2UuCiAgIHN0ZDo6c3RyaW5nIFJlc3VsdDsKLSAgUXVhbFR5cGUgUmVzdWx0VHlwZSA9IEJsb2NrLmdldFR5cGVQdHIoKS0+Z2V0UmVzdWx0VHlwZSgpOworICBRdWFsVHlwZSBSZXN1bHRUeXBlID0gQmxvY2suZ2V0VHlwZVB0cigpLT5nZXRSZXR1cm5UeXBlKCk7CiAgIGlmICghUmVzdWx0VHlwZS0+aXNWb2lkVHlwZSgpIHx8IFN1cHByZXNzQmxvY2spCiAgICAgUmVzdWx0VHlwZS5nZXRBc1N0cmluZ0ludGVybmFsKFJlc3VsdCwgUG9saWN5KTsKIAogICAvLyBGb3JtYXQgdGhlIHBhcmFtZXRlciBsaXN0LgogICBzdGQ6OnN0cmluZyBQYXJhbXM7Ci0gIGlmICghQmxvY2tQcm90byB8fCBCbG9jay5nZXROdW1BcmdzKCkgPT0gMCkgeworICBpZiAoIUJsb2NrUHJvdG8gfHwgQmxvY2suZ2V0TnVtUGFyYW1zKCkgPT0gMCkgewogICAgIGlmIChCbG9ja1Byb3RvICYmIEJsb2NrUHJvdG8uZ2V0VHlwZVB0cigpLT5pc1ZhcmlhZGljKCkpCiAgICAgICBQYXJhbXMgPSAiKC4uLikiOwogICAgIGVsc2UKICAgICAgIFBhcmFtcyA9ICIodm9pZCkiOwogICB9IGVsc2UgewogICAgIFBhcmFtcyArPSAiKCI7Ci0gICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IEJsb2NrLmdldE51bUFyZ3MoKTsgSSAhPSBOOyArK0kpIHsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gQmxvY2suZ2V0TnVtUGFyYW1zKCk7IEkgIT0gTjsgKytJKSB7CiAgICAgICBpZiAoSSkKICAgICAgICAgUGFyYW1zICs9ICIsICI7Ci0gICAgICBQYXJhbXMgKz0gRm9ybWF0RnVuY3Rpb25QYXJhbWV0ZXIoQ29udGV4dCwgUG9saWN5LCBCbG9jay5nZXRBcmcoSSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypTdXBwcmVzc05hbWU9Ki9mYWxzZSwgCisgICAgICBQYXJhbXMgKz0gRm9ybWF0RnVuY3Rpb25QYXJhbWV0ZXIoQ29udGV4dCwgUG9saWN5LCBCbG9jay5nZXRQYXJhbShJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlN1cHByZXNzTmFtZT0qL2ZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qU3VwcHJlc3NCbG9jaz0qL3RydWUpOwotICAgICAgCisKICAgICAgIGlmIChJID09IE4gLSAxICYmIEJsb2NrUHJvdG8uZ2V0VHlwZVB0cigpLT5pc1ZhcmlhZGljKCkpCiAgICAgICAgIFBhcmFtcyArPSAiLCAuLi4iOwogICAgIH0KQEAgLTIyOTcsNyArMjI5MSw3IEBACiAgIGlmIChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqUHJvdG8gCiAgICAgICAgID0gRnVuY3Rpb24tPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCkpCiAgICAgaWYgKFByb3RvLT5pc1ZhcmlhZGljKCkpIHsKLSAgICAgIGlmIChQcm90by0+Z2V0TnVtQXJncygpID09IDApCisgICAgICBpZiAoUHJvdG8tPmdldE51bVBhcmFtcygpID09IDApCiAgICAgICAgIFJlc3VsdC5BZGRQbGFjZWhvbGRlckNodW5rKCIuLi4iKTsKIAogICAgICAgTWF5YmVBZGRTZW50aW5lbChDb250ZXh0LCBGdW5jdGlvbiwgUmVzdWx0KTsKQEAgLTI2NDQsMTIgKzI2MzgsOSBAQAogICAgIHJldHVybiBSZXN1bHQuVGFrZVN0cmluZygpOwogICB9CiAKLSAgZm9yIChEZWNsOjphdHRyX2l0ZXJhdG9yIGkgPSBORC0+YXR0cl9iZWdpbigpOyBpICE9IE5ELT5hdHRyX2VuZCgpOyArK2kpIHsKLSAgICBpZiAoQW5ub3RhdGVBdHRyICpBdHRyID0gZHluX2Nhc3Rfb3JfbnVsbDxBbm5vdGF0ZUF0dHI+KCppKSkgewotICAgICAgUmVzdWx0LkFkZEFubm90YXRpb24oUmVzdWx0LmdldEFsbG9jYXRvcigpLkNvcHlTdHJpbmcoQXR0ci0+Z2V0QW5ub3RhdGlvbigpKSk7Ci0gICAgfQotICB9Ci0gIAorICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBORC0+c3BlY2lmaWNfYXR0cnM8QW5ub3RhdGVBdHRyPigpKQorICAgIFJlc3VsdC5BZGRBbm5vdGF0aW9uKFJlc3VsdC5nZXRBbGxvY2F0b3IoKS5Db3B5U3RyaW5nKEktPmdldEFubm90YXRpb24oKSkpOworCiAgIEFkZFJlc3VsdFR5cGVDaHVuayhDdHgsIFBvbGljeSwgTkQsIFJlc3VsdCk7CiAgIAogICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGdW5jdGlvbiA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oTkQpKSB7CkBAIC0yODM2LDkgKzI4MjcsOCBAQAogICAgIC8vIEZ1bmN0aW9uIHdpdGhvdXQgYSBwcm90b3R5cGUuIEp1c3QgZ2l2ZSB0aGUgcmV0dXJuIHR5cGUgYW5kIGEgCiAgICAgLy8gaGlnaGxpZ2h0ZWQgZWxsaXBzaXMuCiAgICAgY29uc3QgRnVuY3Rpb25UeXBlICpGVCA9IGdldEZ1bmN0aW9uVHlwZSgpOwotICAgIFJlc3VsdC5BZGRUZXh0Q2h1bmsoR2V0Q29tcGxldGlvblR5cGVTdHJpbmcoRlQtPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuQ29udGV4dCwgUG9saWN5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdC5nZXRBbGxvY2F0b3IoKSkpOworICAgIFJlc3VsdC5BZGRUZXh0Q2h1bmsoR2V0Q29tcGxldGlvblR5cGVTdHJpbmcoRlQtPmdldFJldHVyblR5cGUoKSwgUy5Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9saWN5LCBSZXN1bHQuZ2V0QWxsb2NhdG9yKCkpKTsKICAgICBSZXN1bHQuQWRkQ2h1bmsoQ29kZUNvbXBsZXRpb25TdHJpbmc6OkNLX0xlZnRQYXJlbik7CiAgICAgUmVzdWx0LkFkZENodW5rKENvZGVDb21wbGV0aW9uU3RyaW5nOjpDS19DdXJyZW50UGFyYW1ldGVyLCAiLi4uIik7CiAgICAgUmVzdWx0LkFkZENodW5rKENvZGVDb21wbGV0aW9uU3RyaW5nOjpDS19SaWdodFBhcmVuKTsKQEAgLTI4NDksMTIgKzI4MzksMTEgQEAKICAgICBSZXN1bHQuQWRkVGV4dENodW5rKAogICAgICAgICAgICAgICAgICAgICBSZXN1bHQuZ2V0QWxsb2NhdG9yKCkuQ29weVN0cmluZyhGRGVjbC0+Z2V0TmFtZUFzU3RyaW5nKCkpKTsKICAgZWxzZQotICAgIFJlc3VsdC5BZGRUZXh0Q2h1bmsoCi0gICAgICAgICBSZXN1bHQuZ2V0QWxsb2NhdG9yKCkuQ29weVN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90by0+Z2V0UmVzdWx0VHlwZSgpLmdldEFzU3RyaW5nKFBvbGljeSkpKTsKLSAgCisgICAgUmVzdWx0LkFkZFRleHRDaHVuayhSZXN1bHQuZ2V0QWxsb2NhdG9yKCkuQ29weVN0cmluZygKKyAgICAgICAgUHJvdG8tPmdldFJldHVyblR5cGUoKS5nZXRBc1N0cmluZyhQb2xpY3kpKSk7CisKICAgUmVzdWx0LkFkZENodW5rKENvZGVDb21wbGV0aW9uU3RyaW5nOjpDS19MZWZ0UGFyZW4pOwotICB1bnNpZ25lZCBOdW1QYXJhbXMgPSBGRGVjbD8gRkRlY2wtPmdldE51bVBhcmFtcygpIDogUHJvdG8tPmdldE51bUFyZ3MoKTsKKyAgdW5zaWduZWQgTnVtUGFyYW1zID0gRkRlY2wgPyBGRGVjbC0+Z2V0TnVtUGFyYW1zKCkgOiBQcm90by0+Z2V0TnVtUGFyYW1zKCk7CiAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gTnVtUGFyYW1zOyArK0kpIHsKICAgICBpZiAoSSkKICAgICAgIFJlc3VsdC5BZGRDaHVuayhDb2RlQ29tcGxldGlvblN0cmluZzo6Q0tfQ29tbWEpOwpAQCAtMjg2Niw3ICsyODU1LDcgQEAKICAgICAgIEFyZ1N0cmluZyA9IEZEZWNsLT5nZXRQYXJhbURlY2woSSktPmdldE5hbWVBc1N0cmluZygpOwogICAgICAgQXJnVHlwZSA9IEZEZWNsLT5nZXRQYXJhbURlY2woSSktPmdldE9yaWdpbmFsVHlwZSgpOwogICAgIH0gZWxzZSB7Ci0gICAgICBBcmdUeXBlID0gUHJvdG8tPmdldEFyZ1R5cGUoSSk7CisgICAgICBBcmdUeXBlID0gUHJvdG8tPmdldFBhcmFtVHlwZShJKTsKICAgICB9CiAgICAgCiAgICAgQXJnVHlwZS5nZXRBc1N0cmluZ0ludGVybmFsKEFyZ1N0cmluZywgUG9saWN5KTsKQEAgLTMxMDksMTMgKzMwOTgsOSBAQAogICAKICAgLy8gV2UgbmVlZCB0byBoYXZlIG5hbWVzIGZvciBhbGwgb2YgdGhlIHBhcmFtZXRlcnMsIGlmIHdlJ3JlIGdvaW5nIHRvIAogICAvLyBnZW5lcmF0ZSBhIGZvcndhcmRpbmcgY2FsbC4KLSAgZm9yIChDWFhNZXRob2REZWNsOjpwYXJhbV9pdGVyYXRvciBQID0gTWV0aG9kLT5wYXJhbV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFbmQgPSBNZXRob2QtPnBhcmFtX2VuZCgpOwotICAgICAgIFAgIT0gUEVuZDsKLSAgICAgICArK1ApIHsKLSAgICBpZiAoISgqUCktPmdldERlY2xOYW1lKCkpCisgIGZvciAoYXV0byBQIDogTWV0aG9kLT5wYXJhbXMoKSkKKyAgICBpZiAoIVAtPmdldERlY2xOYW1lKCkpCiAgICAgICByZXR1cm47Ci0gIH0KIAogICBQcmludGluZ1BvbGljeSBQb2xpY3kgPSBnZXRDb21wbGV0aW9uUHJpbnRpbmdQb2xpY3koUyk7CiAgIGZvciAoQ1hYTWV0aG9kRGVjbDo6bWV0aG9kX2l0ZXJhdG9yIE0gPSBNZXRob2QtPmJlZ2luX292ZXJyaWRkZW5fbWV0aG9kcygpLApAQCAtMzE0NSwxNiArMzEzMCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVycmlkZGVuLT5nZXROYW1lQXNTdHJpbmcoKSkpOwogICAgIEJ1aWxkZXIuQWRkQ2h1bmsoQ29kZUNvbXBsZXRpb25TdHJpbmc6OkNLX0xlZnRQYXJlbik7CiAgICAgYm9vbCBGaXJzdFBhcmFtID0gdHJ1ZTsKLSAgICBmb3IgKENYWE1ldGhvZERlY2w6OnBhcmFtX2l0ZXJhdG9yIFAgPSBNZXRob2QtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRW5kID0gTWV0aG9kLT5wYXJhbV9lbmQoKTsKLSAgICAgICAgIFAgIT0gUEVuZDsgKytQKSB7CisgICAgZm9yIChhdXRvIFAgOiBNZXRob2QtPnBhcmFtcygpKSB7CiAgICAgICBpZiAoRmlyc3RQYXJhbSkKICAgICAgICAgRmlyc3RQYXJhbSA9IGZhbHNlOwogICAgICAgZWxzZQogICAgICAgICBCdWlsZGVyLkFkZENodW5rKENvZGVDb21wbGV0aW9uU3RyaW5nOjpDS19Db21tYSk7CiAKLSAgICAgIEJ1aWxkZXIuQWRkUGxhY2Vob2xkZXJDaHVuayhSZXN1bHRzLmdldEFsbG9jYXRvcigpLkNvcHlTdHJpbmcoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqUCktPmdldElkZW50aWZpZXIoKS0+Z2V0TmFtZSgpKSk7CisgICAgICBCdWlsZGVyLkFkZFBsYWNlaG9sZGVyQ2h1bmsoCisgICAgICAgICAgUmVzdWx0cy5nZXRBbGxvY2F0b3IoKS5Db3B5U3RyaW5nKFAtPmdldElkZW50aWZpZXIoKS0+Z2V0TmFtZSgpKSk7CiAgICAgfQogICAgIEJ1aWxkZXIuQWRkQ2h1bmsoQ29kZUNvbXBsZXRpb25TdHJpbmc6OkNLX1JpZ2h0UGFyZW4pOwogICAgIFJlc3VsdHMuQWRkUmVzdWx0KENvZGVDb21wbGV0aW9uUmVzdWx0KEJ1aWxkZXIuVGFrZVN0cmluZygpLApAQCAtMzQ3NSwzMiArMzQ1OCwyNiBAQAogICBDb250YWluZXIgPSBnZXRDb250YWluZXJEZWYoQ29udGFpbmVyKTsKICAgCiAgIC8vIEFkZCBwcm9wZXJ0aWVzIGluIHRoaXMgY29udGFpbmVyLgotICBmb3IgKE9iakNDb250YWluZXJEZWNsOjpwcm9wX2l0ZXJhdG9yIFAgPSBDb250YWluZXItPnByb3BfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRW5kID0gQ29udGFpbmVyLT5wcm9wX2VuZCgpOwotICAgICAgIFAgIT0gUEVuZDsKLSAgICAgICArK1ApIHsKKyAgZm9yIChjb25zdCBhdXRvICpQIDogQ29udGFpbmVyLT5wcm9wZXJ0aWVzKCkpCiAgICAgaWYgKEFkZGVkUHJvcGVydGllcy5pbnNlcnQoUC0+Z2V0SWRlbnRpZmllcigpKSkKLSAgICAgIFJlc3VsdHMuTWF5YmVBZGRSZXN1bHQoUmVzdWx0KCpQLCBSZXN1bHRzLmdldEJhc2VQcmlvcml0eSgqUCksIDApLAorICAgICAgUmVzdWx0cy5NYXliZUFkZFJlc3VsdChSZXN1bHQoUCwgUmVzdWx0cy5nZXRCYXNlUHJpb3JpdHkoUCksIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJDb250ZXh0KTsKLSAgfQogICAKICAgLy8gQWRkIG51bGxhcnkgbWV0aG9kcwogICBpZiAoQWxsb3dOdWxsYXJ5TWV0aG9kcykgewogICAgIEFTVENvbnRleHQgJkNvbnRleHQgPSBDb250YWluZXItPmdldEFTVENvbnRleHQoKTsKICAgICBQcmludGluZ1BvbGljeSBQb2xpY3kgPSBnZXRDb21wbGV0aW9uUHJpbnRpbmdQb2xpY3koUmVzdWx0cy5nZXRTZW1hKCkpOwotICAgIGZvciAoT2JqQ0NvbnRhaW5lckRlY2w6Om1ldGhvZF9pdGVyYXRvciBNID0gQ29udGFpbmVyLT5tZXRoX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FbmQgPSBDb250YWluZXItPm1ldGhfZW5kKCk7Ci0gICAgICAgICBNICE9IE1FbmQ7ICsrTSkgeworICAgIGZvciAoYXV0byAqTSA6IENvbnRhaW5lci0+bWV0aG9kcygpKSB7CiAgICAgICBpZiAoTS0+Z2V0U2VsZWN0b3IoKS5pc1VuYXJ5U2VsZWN0b3IoKSkKICAgICAgICAgaWYgKElkZW50aWZpZXJJbmZvICpOYW1lID0gTS0+Z2V0U2VsZWN0b3IoKS5nZXRJZGVudGlmaWVySW5mb0ZvclNsb3QoMCkpCiAgICAgICAgICAgaWYgKEFkZGVkUHJvcGVydGllcy5pbnNlcnQoTmFtZSkpIHsKICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uQnVpbGRlciBCdWlsZGVyKFJlc3VsdHMuZ2V0QWxsb2NhdG9yKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRzLmdldENvZGVDb21wbGV0aW9uVFVJbmZvKCkpOwotICAgICAgICAgICAgQWRkUmVzdWx0VHlwZUNodW5rKENvbnRleHQsIFBvbGljeSwgKk0sIEJ1aWxkZXIpOworICAgICAgICAgICAgQWRkUmVzdWx0VHlwZUNodW5rKENvbnRleHQsIFBvbGljeSwgTSwgQnVpbGRlcik7CiAgICAgICAgICAgICBCdWlsZGVyLkFkZFR5cGVkVGV4dENodW5rKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdHMuZ2V0QWxsb2NhdG9yKCkuQ29weVN0cmluZyhOYW1lLT5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgUmVzdWx0cy5NYXliZUFkZFJlc3VsdChSZXN1bHQoQnVpbGRlci5UYWtlU3RyaW5nKCksICpNLAorICAgICAgICAgICAgUmVzdWx0cy5NYXliZUFkZFJlc3VsdChSZXN1bHQoQnVpbGRlci5UYWtlU3RyaW5nKCksIE0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NQX01lbWJlckRlY2xhcmF0aW9uICsgQ0NEX01ldGhvZEFzUHJvcGVydHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyQ29udGV4dCk7CiAgICAgICAgICAgfQpAQCAtMzUxMCwyNyArMzQ4NywyMCBAQAogICAKICAgLy8gQWRkIHByb3BlcnRpZXMgaW4gcmVmZXJlbmNlZCBwcm90b2NvbHMuCiAgIGlmIChPYmpDUHJvdG9jb2xEZWNsICpQcm90b2NvbCA9IGR5bl9jYXN0PE9iakNQcm90b2NvbERlY2w+KENvbnRhaW5lcikpIHsKLSAgICBmb3IgKE9iakNQcm90b2NvbERlY2w6OnByb3RvY29sX2l0ZXJhdG9yIFAgPSBQcm90b2NvbC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFbmQgPSBQcm90b2NvbC0+cHJvdG9jb2xfZW5kKCk7Ci0gICAgICAgICBQICE9IFBFbmQ7ICsrUCkKLSAgICAgIEFkZE9iakNQcm9wZXJ0aWVzKCpQLCBBbGxvd0NhdGVnb3JpZXMsIEFsbG93TnVsbGFyeU1ldGhvZHMsIEN1ckNvbnRleHQsIAorICAgIGZvciAoYXV0byAqUCA6IFByb3RvY29sLT5wcm90b2NvbHMoKSkKKyAgICAgIEFkZE9iakNQcm9wZXJ0aWVzKFAsIEFsbG93Q2F0ZWdvcmllcywgQWxsb3dOdWxsYXJ5TWV0aG9kcywgQ3VyQ29udGV4dCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBBZGRlZFByb3BlcnRpZXMsIFJlc3VsdHMpOwogICB9IGVsc2UgaWYgKE9iakNJbnRlcmZhY2VEZWNsICpJRmFjZSA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPihDb250YWluZXIpKXsKICAgICBpZiAoQWxsb3dDYXRlZ29yaWVzKSB7CiAgICAgICAvLyBMb29rIHRocm91Z2ggY2F0ZWdvcmllcy4KLSAgICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6Omtub3duX2NhdGVnb3JpZXNfaXRlcmF0b3IKLSAgICAgICAgICAgICBDYXQgPSBJRmFjZS0+a25vd25fY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgICAgIENhdEVuZCA9IElGYWNlLT5rbm93bl9jYXRlZ29yaWVzX2VuZCgpOwotICAgICAgICAgICBDYXQgIT0gQ2F0RW5kOyArK0NhdCkKLSAgICAgICAgQWRkT2JqQ1Byb3BlcnRpZXMoKkNhdCwgQWxsb3dDYXRlZ29yaWVzLCBBbGxvd051bGxhcnlNZXRob2RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJDb250ZXh0LCBBZGRlZFByb3BlcnRpZXMsIFJlc3VsdHMpOworICAgICAgZm9yIChhdXRvICpDYXQgOiBJRmFjZS0+a25vd25fY2F0ZWdvcmllcygpKQorICAgICAgICBBZGRPYmpDUHJvcGVydGllcyhDYXQsIEFsbG93Q2F0ZWdvcmllcywgQWxsb3dOdWxsYXJ5TWV0aG9kcywgQ3VyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkZWRQcm9wZXJ0aWVzLCBSZXN1bHRzKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBMb29rIHRocm91Z2ggcHJvdG9jb2xzLgotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OmFsbF9wcm90b2NvbF9pdGVyYXRvcgotICAgICAgICAgSSA9IElGYWNlLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgRSA9IElGYWNlLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgICBBZGRPYmpDUHJvcGVydGllcygqSSwgQWxsb3dDYXRlZ29yaWVzLCBBbGxvd051bGxhcnlNZXRob2RzLCBDdXJDb250ZXh0LAorICAgIGZvciAoYXV0byAqSSA6IElGYWNlLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbHMoKSkKKyAgICAgIEFkZE9iakNQcm9wZXJ0aWVzKEksIEFsbG93Q2F0ZWdvcmllcywgQWxsb3dOdWxsYXJ5TWV0aG9kcywgQ3VyQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkUHJvcGVydGllcywgUmVzdWx0cyk7CiAgICAgCiAgICAgLy8gTG9vayBpbiB0aGUgc3VwZXJjbGFzcy4KQEAgLTM1NDEsMTAgKzM1MTEsOCBAQAogICB9IGVsc2UgaWYgKGNvbnN0IE9iakNDYXRlZ29yeURlY2wgKkNhdGVnb3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGR5bl9jYXN0PE9iakNDYXRlZ29yeURlY2w+KENvbnRhaW5lcikpIHsKICAgICAvLyBMb29rIHRocm91Z2ggcHJvdG9jb2xzLgotICAgIGZvciAoT2JqQ0NhdGVnb3J5RGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUCA9IENhdGVnb3J5LT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVuZCA9IENhdGVnb3J5LT5wcm90b2NvbF9lbmQoKTsgCi0gICAgICAgICBQICE9IFBFbmQ7ICsrUCkKLSAgICAgIEFkZE9iakNQcm9wZXJ0aWVzKCpQLCBBbGxvd0NhdGVnb3JpZXMsIEFsbG93TnVsbGFyeU1ldGhvZHMsIEN1ckNvbnRleHQsCisgICAgZm9yIChhdXRvICpQIDogQ2F0ZWdvcnktPnByb3RvY29scygpKQorICAgICAgQWRkT2JqQ1Byb3BlcnRpZXMoUCwgQWxsb3dDYXRlZ29yaWVzLCBBbGxvd051bGxhcnlNZXRob2RzLCBDdXJDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgQWRkZWRQcm9wZXJ0aWVzLCBSZXN1bHRzKTsKICAgfQogfQpAQCAtMzYzNiwxMCArMzYwNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgQWRkZWRQcm9wZXJ0aWVzLCBSZXN1bHRzKTsKICAgICAKICAgICAvLyBBZGQgcHJvcGVydGllcyBmcm9tIHRoZSBwcm90b2NvbHMgaW4gYSBxdWFsaWZpZWQgaW50ZXJmYWNlLgotICAgIGZvciAoT2JqQ09iamVjdFBvaW50ZXJUeXBlOjpxdWFsX2l0ZXJhdG9yIEkgPSBPYmpDUHRyLT5xdWFsX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IE9iakNQdHItPnF1YWxfZW5kKCk7Ci0gICAgICAgICBJICE9IEU7ICsrSSkKLSAgICAgIEFkZE9iakNQcm9wZXJ0aWVzKCpJLCB0cnVlLCAvKkFsbG93TnVsbGFyeU1ldGhvZHM9Ki90cnVlLCBDdXJDb250ZXh0LCAKKyAgICBmb3IgKGF1dG8gKkkgOiBPYmpDUHRyLT5xdWFscygpKQorICAgICAgQWRkT2JqQ1Byb3BlcnRpZXMoSSwgdHJ1ZSwgLypBbGxvd051bGxhcnlNZXRob2RzPSovdHJ1ZSwgQ3VyQ29udGV4dCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBBZGRlZFByb3BlcnRpZXMsIFJlc3VsdHMpOwogICB9IGVsc2UgaWYgKChJc0Fycm93ICYmIEJhc2VUeXBlLT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpKSB8fAogICAgICAgICAgICAgICghSXNBcnJvdyAmJiBCYXNlVHlwZS0+aXNPYmpDT2JqZWN0VHlwZSgpKSkgewpAQCAtMzgwOSwxMyArMzc3NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUNvbXBsZXRlci0+Z2V0Q29kZUNvbXBsZXRpb25UVUluZm8oKSwKICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uQ29udGV4dDo6Q0NDX0V4cHJlc3Npb24pOwogICBSZXN1bHRzLkVudGVyTmV3U2NvcGUoKTsKLSAgZm9yIChFbnVtRGVjbDo6ZW51bWVyYXRvcl9pdGVyYXRvciBFID0gRW51bS0+ZW51bWVyYXRvcl9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFbmQgPSBFbnVtLT5lbnVtZXJhdG9yX2VuZCgpOwotICAgICAgIEUgIT0gRUVuZDsgKytFKSB7Ci0gICAgaWYgKEVudW1lcmF0b3JzU2Vlbi5jb3VudCgqRSkpCisgIGZvciAoYXV0byAqRSA6IEVudW0tPmVudW1lcmF0b3JzKCkpIHsKKyAgICBpZiAoRW51bWVyYXRvcnNTZWVuLmNvdW50KEUpKQogICAgICAgY29udGludWU7CiAgICAgCi0gICAgQ29kZUNvbXBsZXRpb25SZXN1bHQgUigqRSwgQ0NQX0VudW1JbkNhc2UsIFF1YWxpZmllcik7CisgICAgQ29kZUNvbXBsZXRpb25SZXN1bHQgUihFLCBDQ1BfRW51bUluQ2FzZSwgUXVhbGlmaWVyKTsKICAgICBSZXN1bHRzLkFkZFJlc3VsdChSLCBDdXJDb250ZXh0LCAwLCBmYWxzZSk7CiAgIH0KICAgUmVzdWx0cy5FeGl0U2NvcGUoKTsKQEAgLTM4MzMsMjIgKzM3OTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdHMuZGF0YSgpLFJlc3VsdHMuc2l6ZSgpKTsKIH0KIAotbmFtZXNwYWNlIHsKLSAgc3RydWN0IElzQmV0dGVyT3ZlcmxvYWRDYW5kaWRhdGUgewotICAgIFNlbWEgJlM7Ci0gICAgU291cmNlTG9jYXRpb24gTG9jOwotICAgIAotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSXNCZXR0ZXJPdmVybG9hZENhbmRpZGF0ZShTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MpCi0gICAgICA6IFMoUyksIExvYyhMb2MpIHsgfQotICAgIAotICAgIGJvb2wgCi0gICAgb3BlcmF0b3IoKShjb25zdCBPdmVybG9hZENhbmRpZGF0ZSAmWCwgY29uc3QgT3ZlcmxvYWRDYW5kaWRhdGUgJlkpIGNvbnN0IHsKLSAgICAgIHJldHVybiBpc0JldHRlck92ZXJsb2FkQ2FuZGlkYXRlKFMsIFgsIFksIExvYyk7Ci0gICAgfQotICB9OwotfQotCiBzdGF0aWMgYm9vbCBhbnlOdWxsQXJndW1lbnRzKEFycmF5UmVmPEV4cHIgKj4gQXJncykgewogICBpZiAoQXJncy5zaXplKCkgJiYgIUFyZ3MuZGF0YSgpKQogICAgIHJldHVybiB0cnVlOwpAQCAtMzkxMCw5ICszODU4LDEyIEBACiAgIAogICBpZiAoIUNhbmRpZGF0ZVNldC5lbXB0eSgpKSB7CiAgICAgLy8gU29ydCB0aGUgb3ZlcmxvYWQgY2FuZGlkYXRlIHNldCBieSBwbGFjaW5nIHRoZSBiZXN0IG92ZXJsb2FkcyBmaXJzdC4KLSAgICBzdGQ6OnN0YWJsZV9zb3J0KENhbmRpZGF0ZVNldC5iZWdpbigpLCBDYW5kaWRhdGVTZXQuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICBJc0JldHRlck92ZXJsb2FkQ2FuZGlkYXRlKCp0aGlzLCBMb2MpKTsKLSAgCisgICAgc3RkOjpzdGFibGVfc29ydCgKKyAgICAgICAgQ2FuZGlkYXRlU2V0LmJlZ2luKCksIENhbmRpZGF0ZVNldC5lbmQoKSwKKyAgICAgICAgWyZdKGNvbnN0IE92ZXJsb2FkQ2FuZGlkYXRlICZYLCBjb25zdCBPdmVybG9hZENhbmRpZGF0ZSAmWSkgeworICAgICAgICAgIHJldHVybiBpc0JldHRlck92ZXJsb2FkQ2FuZGlkYXRlKCp0aGlzLCBYLCBZLCBMb2MpOworICAgICAgICB9KTsKKwogICAgIC8vIEFkZCB0aGUgcmVtYWluaW5nIHZpYWJsZSBvdmVybG9hZCBjYW5kaWRhdGVzIGFzIGNvZGUtY29tcGxldGlvbiByZXNsdWx0cy4KICAgICBmb3IgKE92ZXJsb2FkQ2FuZGlkYXRlU2V0OjppdGVyYXRvciBDYW5kID0gQ2FuZGlkYXRlU2V0LmJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuZEVuZCA9IENhbmRpZGF0ZVNldC5lbmQoKTsKQEAgLTM5MjUsMTIgKzM4NzYsMTMgQEAKICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gUmVzdWx0cy5zaXplKCk7IEkgIT0gTjsgKytJKSB7CiAgICAgICBpZiAoY29uc3QgRnVuY3Rpb25UeXBlICpGVHlwZSA9IFJlc3VsdHNbSV0uZ2V0RnVuY3Rpb25UeXBlKCkpCiAgICAgICAgIGlmIChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqUHJvdG8gPSBkeW5fY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oRlR5cGUpKQotICAgICAgICAgIGlmIChBcmdzLnNpemUoKSA8IFByb3RvLT5nZXROdW1BcmdzKCkpIHsKKyAgICAgICAgICBpZiAoQXJncy5zaXplKCkgPCBQcm90by0+Z2V0TnVtUGFyYW1zKCkpIHsKICAgICAgICAgICAgIGlmIChQYXJhbVR5cGUuaXNOdWxsKCkpCi0gICAgICAgICAgICAgIFBhcmFtVHlwZSA9IFByb3RvLT5nZXRBcmdUeXBlKEFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgICAgUGFyYW1UeXBlID0gUHJvdG8tPmdldFBhcmFtVHlwZShBcmdzLnNpemUoKSk7CiAgICAgICAgICAgICBlbHNlIGlmICghQ29udGV4dC5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbVR5cGUuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICBQcm90by0+Z2V0QXJnVHlwZShBcmdzLnNpemUoKSkuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbVR5cGUuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90by0+Z2V0UGFyYW1UeXBlKEFyZ3Muc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5vblJlZmVyZW5jZVR5cGUoKSkpIHsKICAgICAgICAgICAgICAgUGFyYW1UeXBlID0gUXVhbFR5cGUoKTsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0zOTUxLDggKzM5MDMsOCBAQAogICAgIAogICAgIGlmIChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqUHJvdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEZ1bmN0aW9uVHlwZS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCkpIHsKLSAgICAgIGlmIChBcmdzLnNpemUoKSA8IFByb3RvLT5nZXROdW1BcmdzKCkpCi0gICAgICAgIFBhcmFtVHlwZSA9IFByb3RvLT5nZXRBcmdUeXBlKEFyZ3Muc2l6ZSgpKTsKKyAgICAgIGlmIChBcmdzLnNpemUoKSA8IFByb3RvLT5nZXROdW1QYXJhbXMoKSkKKyAgICAgICAgUGFyYW1UeXBlID0gUHJvdG8tPmdldFBhcmFtVHlwZShBcmdzLnNpemUoKSk7CiAgICAgfQogICB9CiAKQEAgLTM5ODIsMTAgKzM5MzQsMTAgQEAKICAgICBpZiAoQmxvY2tTY29wZUluZm8gKkJTSSA9IGdldEN1ckJsb2NrKCkpCiAgICAgICBSZXN1bHRUeXBlID0gQlNJLT5SZXR1cm5UeXBlOwogICB9IGVsc2UgaWYgKEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24gPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEN1ckNvbnRleHQpKQotICAgIFJlc3VsdFR5cGUgPSBGdW5jdGlvbi0+Z2V0UmVzdWx0VHlwZSgpOworICAgIFJlc3VsdFR5cGUgPSBGdW5jdGlvbi0+Z2V0UmV0dXJuVHlwZSgpOwogICBlbHNlIGlmIChPYmpDTWV0aG9kRGVjbCAqTWV0aG9kID0gZHluX2Nhc3Q8T2JqQ01ldGhvZERlY2w+KEN1ckNvbnRleHQpKQotICAgIFJlc3VsdFR5cGUgPSBNZXRob2QtPmdldFJlc3VsdFR5cGUoKTsKLSAgCisgICAgUmVzdWx0VHlwZSA9IE1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpOworCiAgIGlmIChSZXN1bHRUeXBlLmlzTnVsbCgpKQogICAgIENvZGVDb21wbGV0ZU9yZGluYXJ5TmFtZShTLCBQQ0NfRXhwcmVzc2lvbik7CiAgIGVsc2UKQEAgLTQwODAsNyArNDAzMiw3IEBACiAgIAogICAvLyBUaGUgInRlbXBsYXRlIiBrZXl3b3JkIGNhbiBmb2xsb3cgIjo6IiBpbiB0aGUgZ3JhbW1hciwgYnV0IG9ubHkKICAgLy8gcHV0IGl0IGludG8gdGhlIGdyYW1tYXIgaWYgdGhlIG5lc3RlZC1uYW1lLXNwZWNpZmllciBpcyBkZXBlbmRlbnQuCi0gIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUyA9IChOZXN0ZWROYW1lU3BlY2lmaWVyICopU1MuZ2V0U2NvcGVSZXAoKTsKKyAgTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TID0gU1MuZ2V0U2NvcGVSZXAoKTsKICAgaWYgKCFSZXN1bHRzLmVtcHR5KCkgJiYgTk5TLT5pc0RlcGVuZGVudCgpKQogICAgIFJlc3VsdHMuQWRkUmVzdWx0KCJ0ZW1wbGF0ZSIpOwogCkBAIC00Mjc0LDIxICs0MjI2LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdHMuZ2V0Q29kZUNvbXBsZXRpb25UVUluZm8oKSk7CiAgIGJvb2wgU2F3TGFzdEluaXRpYWxpemVyID0gSW5pdGlhbGl6ZXJzLmVtcHR5KCk7CiAgIENYWFJlY29yZERlY2wgKkNsYXNzRGVjbCA9IENvbnN0cnVjdG9yLT5nZXRQYXJlbnQoKTsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yIEJhc2UgPSBDbGFzc0RlY2wtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlRW5kID0gQ2xhc3NEZWNsLT5iYXNlc19lbmQoKTsKLSAgICAgICBCYXNlICE9IEJhc2VFbmQ7ICsrQmFzZSkgewotICAgIGlmICghSW5pdGlhbGl6ZWRCYXNlcy5pbnNlcnQoQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKEJhc2UtPmdldFR5cGUoKSkpKSB7CisgIGZvciAoY29uc3QgYXV0byAmQmFzZSA6IENsYXNzRGVjbC0+YmFzZXMoKSkgeworICAgIGlmICghSW5pdGlhbGl6ZWRCYXNlcy5pbnNlcnQoQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKEJhc2UuZ2V0VHlwZSgpKSkpIHsKICAgICAgIFNhd0xhc3RJbml0aWFsaXplcgogICAgICAgICA9ICFJbml0aWFsaXplcnMuZW1wdHkoKSAmJiAKICAgICAgICAgICBJbml0aWFsaXplcnMuYmFjaygpLT5pc0Jhc2VJbml0aWFsaXplcigpICYmCi0gICAgICAgICAgQ29udGV4dC5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKEJhc2UtPmdldFR5cGUoKSwKKyAgICAgICAgICBDb250ZXh0Lmhhc1NhbWVVbnF1YWxpZmllZFR5cGUoQmFzZS5nZXRUeXBlKCksCiAgICAgICAgICAgICAgICBRdWFsVHlwZShJbml0aWFsaXplcnMuYmFjaygpLT5nZXRCYXNlQ2xhc3MoKSwgMCkpOwogICAgICAgY29udGludWU7CiAgICAgfQogICAgIAogICAgIEJ1aWxkZXIuQWRkVHlwZWRUZXh0Q2h1bmsoCiAgICAgICAgICAgICAgICBSZXN1bHRzLmdldEFsbG9jYXRvcigpLkNvcHlTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UtPmdldFR5cGUoKS5nZXRBc1N0cmluZyhQb2xpY3kpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UuZ2V0VHlwZSgpLmdldEFzU3RyaW5nKFBvbGljeSkpKTsKICAgICBCdWlsZGVyLkFkZENodW5rKENvZGVDb21wbGV0aW9uU3RyaW5nOjpDS19MZWZ0UGFyZW4pOwogICAgIEJ1aWxkZXIuQWRkUGxhY2Vob2xkZXJDaHVuaygiYXJncyIpOwogICAgIEJ1aWxkZXIuQWRkQ2h1bmsoQ29kZUNvbXBsZXRpb25TdHJpbmc6OkNLX1JpZ2h0UGFyZW4pOwpAQCAtNDI5OSwyMSArNDI0OSwxOSBAQAogICB9CiAgIAogICAvLyBBZGQgY29tcGxldGlvbnMgZm9yIHZpcnR1YWwgYmFzZSBjbGFzc2VzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQmFzZSA9IENsYXNzRGVjbC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlRW5kID0gQ2xhc3NEZWNsLT52YmFzZXNfZW5kKCk7Ci0gICAgICAgQmFzZSAhPSBCYXNlRW5kOyArK0Jhc2UpIHsKLSAgICBpZiAoIUluaXRpYWxpemVkQmFzZXMuaW5zZXJ0KENvbnRleHQuZ2V0Q2Fub25pY2FsVHlwZShCYXNlLT5nZXRUeXBlKCkpKSkgeworICBmb3IgKGNvbnN0IGF1dG8gJkJhc2UgOiBDbGFzc0RlY2wtPnZiYXNlcygpKSB7CisgICAgaWYgKCFJbml0aWFsaXplZEJhc2VzLmluc2VydChDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoQmFzZS5nZXRUeXBlKCkpKSkgewogICAgICAgU2F3TGFzdEluaXRpYWxpemVyCiAgICAgICAgID0gIUluaXRpYWxpemVycy5lbXB0eSgpICYmIAogICAgICAgICAgIEluaXRpYWxpemVycy5iYWNrKCktPmlzQmFzZUluaXRpYWxpemVyKCkgJiYKLSAgICAgICAgICBDb250ZXh0Lmhhc1NhbWVVbnF1YWxpZmllZFR5cGUoQmFzZS0+Z2V0VHlwZSgpLAorICAgICAgICAgIENvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShCYXNlLmdldFR5cGUoKSwKICAgICAgICAgICAgICAgIFF1YWxUeXBlKEluaXRpYWxpemVycy5iYWNrKCktPmdldEJhc2VDbGFzcygpLCAwKSk7CiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgCiAgICAgQnVpbGRlci5BZGRUeXBlZFRleHRDaHVuaygKICAgICAgICAgICAgICAgIEJ1aWxkZXIuZ2V0QWxsb2NhdG9yKCkuQ29weVN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZS0+Z2V0VHlwZSgpLmdldEFzU3RyaW5nKFBvbGljeSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZS5nZXRUeXBlKCkuZ2V0QXNTdHJpbmcoUG9saWN5KSkpOwogICAgIEJ1aWxkZXIuQWRkQ2h1bmsoQ29kZUNvbXBsZXRpb25TdHJpbmc6OkNLX0xlZnRQYXJlbik7CiAgICAgQnVpbGRlci5BZGRQbGFjZWhvbGRlckNodW5rKCJhcmdzIik7CiAgICAgQnVpbGRlci5BZGRDaHVuayhDb2RlQ29tcGxldGlvblN0cmluZzo6Q0tfUmlnaHRQYXJlbik7CkBAIC00MzI0LDE0ICs0MjcyLDEyIEBACiAgIH0KICAgCiAgIC8vIEFkZCBjb21wbGV0aW9ucyBmb3IgbWVtYmVycy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGaWVsZCA9IENsYXNzRGVjbC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEVuZCA9IENsYXNzRGVjbC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgRmllbGQgIT0gRmllbGRFbmQ7ICsrRmllbGQpIHsKKyAgZm9yIChhdXRvICpGaWVsZCA6IENsYXNzRGVjbC0+ZmllbGRzKCkpIHsKICAgICBpZiAoIUluaXRpYWxpemVkRmllbGRzLmluc2VydChjYXN0PEZpZWxkRGVjbD4oRmllbGQtPmdldENhbm9uaWNhbERlY2woKSkpKSB7CiAgICAgICBTYXdMYXN0SW5pdGlhbGl6ZXIKICAgICAgICAgPSAhSW5pdGlhbGl6ZXJzLmVtcHR5KCkgJiYgCiAgICAgICAgICAgSW5pdGlhbGl6ZXJzLmJhY2soKS0+aXNBbnlNZW1iZXJJbml0aWFsaXplcigpICYmCi0gICAgICAgICAgSW5pdGlhbGl6ZXJzLmJhY2soKS0+Z2V0QW55TWVtYmVyKCkgPT0gKkZpZWxkOworICAgICAgICAgIEluaXRpYWxpemVycy5iYWNrKCktPmdldEFueU1lbWJlcigpID09IEZpZWxkOwogICAgICAgY29udGludWU7CiAgICAgfQogICAgIApAQCAtNDM0OCw3ICs0Mjk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDQ1BfTWVtYmVyRGVjbGFyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hDdXJzb3JfTWVtYmVyUmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYQXZhaWxhYmlsaXR5X0F2YWlsYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRmllbGQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCkpOwogICAgIFNhd0xhc3RJbml0aWFsaXplciA9IGZhbHNlOwogICB9CiAgIFJlc3VsdHMuRXhpdFNjb3BlKCk7CkBAIC00Mzg5LDkgKzQzMzUsOCBAQAogICAKICAgLy8gTG9vayBmb3Igb3RoZXIgY2FwdHVyYWJsZSB2YXJpYWJsZXMuCiAgIGZvciAoOyBTICYmICFpc05hbWVzcGFjZVNjb3BlKFMpOyBTID0gUy0+Z2V0UGFyZW50KCkpIHsKLSAgICBmb3IgKFNjb3BlOjpkZWNsX2l0ZXJhdG9yIEQgPSBTLT5kZWNsX2JlZ2luKCksIERFbmQgPSBTLT5kZWNsX2VuZCgpOwotICAgICAgICAgRCAhPSBERW5kOyArK0QpIHsKLSAgICAgIFZhckRlY2wgKlZhciA9IGR5bl9jYXN0PFZhckRlY2w+KCpEKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkQgOiBTLT5kZWNscygpKSB7CisgICAgICBjb25zdCBhdXRvICpWYXIgPSBkeW5fY2FzdDxWYXJEZWNsPihEKTsKICAgICAgIGlmICghVmFyIHx8CiAgICAgICAgICAgIVZhci0+aGFzTG9jYWxTdG9yYWdlKCkgfHwKICAgICAgICAgICBWYXItPmhhc0F0dHI8QmxvY2tzQXR0cj4oKSkKQEAgLTQ3NTksNyArNDcwNCw3IEBACiAgICAgQ29kZUNvbXBsZXRpb25CdWlsZGVyIFNldHRlcihSZXN1bHRzLmdldEFsbG9jYXRvcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0cy5nZXRDb2RlQ29tcGxldGlvblRVSW5mbygpKTsKICAgICBTZXR0ZXIuQWRkVHlwZWRUZXh0Q2h1bmsoInNldHRlciIpOwotICAgIFNldHRlci5BZGRUZXh0Q2h1bmsoIiA9ICIpOworICAgIFNldHRlci5BZGRUZXh0Q2h1bmsoIj0iKTsKICAgICBTZXR0ZXIuQWRkUGxhY2Vob2xkZXJDaHVuaygibWV0aG9kIik7CiAgICAgUmVzdWx0cy5BZGRSZXN1bHQoQ29kZUNvbXBsZXRpb25SZXN1bHQoU2V0dGVyLlRha2VTdHJpbmcoKSkpOwogICB9CkBAIC00NzY3LDcgKzQ3MTIsNyBAQAogICAgIENvZGVDb21wbGV0aW9uQnVpbGRlciBHZXR0ZXIoUmVzdWx0cy5nZXRBbGxvY2F0b3IoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdHMuZ2V0Q29kZUNvbXBsZXRpb25UVUluZm8oKSk7CiAgICAgR2V0dGVyLkFkZFR5cGVkVGV4dENodW5rKCJnZXR0ZXIiKTsKLSAgICBHZXR0ZXIuQWRkVGV4dENodW5rKCIgPSAiKTsKKyAgICBHZXR0ZXIuQWRkVGV4dENodW5rKCI9Iik7CiAgICAgR2V0dGVyLkFkZFBsYWNlaG9sZGVyQ2h1bmsoIm1ldGhvZCIpOwogICAgIFJlc3VsdHMuQWRkUmVzdWx0KENvZGVDb21wbGV0aW9uUmVzdWx0KEdldHRlci5UYWtlU3RyaW5nKCkpKTsKICAgfQpAQCAtNDg1NiwyMiArNDgwMSwyMCBAQAogICBDb250YWluZXIgPSBnZXRDb250YWluZXJEZWYoQ29udGFpbmVyKTsKICAgT2JqQ0ludGVyZmFjZURlY2wgKklGYWNlID0gZHluX2Nhc3Q8T2JqQ0ludGVyZmFjZURlY2w+KENvbnRhaW5lcik7CiAgIGJvb2wgaXNSb290Q2xhc3MgPSBJRmFjZSAmJiAhSUZhY2UtPmdldFN1cGVyQ2xhc3MoKTsKLSAgZm9yIChPYmpDQ29udGFpbmVyRGVjbDo6bWV0aG9kX2l0ZXJhdG9yIE0gPSBDb250YWluZXItPm1ldGhfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FbmQgPSBDb250YWluZXItPm1ldGhfZW5kKCk7Ci0gICAgICAgTSAhPSBNRW5kOyArK00pIHsKKyAgZm9yIChhdXRvICpNIDogQ29udGFpbmVyLT5tZXRob2RzKCkpIHsKICAgICAvLyBUaGUgaW5zdGFuY2UgbWV0aG9kcyBvbiB0aGUgcm9vdCBjbGFzcyBjYW4gYmUgbWVzc2FnZWQgdmlhIHRoZQogICAgIC8vIG1ldGFjbGFzcy4KICAgICBpZiAoTS0+aXNJbnN0YW5jZU1ldGhvZCgpID09IFdhbnRJbnN0YW5jZU1ldGhvZHMgfHwKICAgICAgICAgKGlzUm9vdENsYXNzICYmICFXYW50SW5zdGFuY2VNZXRob2RzKSkgewogICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2VsZWN0b3IgaWRlbnRpZmllcnMgd2UndmUgYmVlbiBnaXZlbiBhcmUgYSAKICAgICAgIC8vIHN1YnNldCBvZiB0aGUgaWRlbnRpZmllcnMgZm9yIHRoaXMgcGFydGljdWxhciBtZXRob2QuCi0gICAgICBpZiAoIWlzQWNjZXB0YWJsZU9iakNNZXRob2QoKk0sIFdhbnRLaW5kLCBTZWxJZGVudHMsIEFsbG93U2FtZUxlbmd0aCkpCisgICAgICBpZiAoIWlzQWNjZXB0YWJsZU9iakNNZXRob2QoTSwgV2FudEtpbmQsIFNlbElkZW50cywgQWxsb3dTYW1lTGVuZ3RoKSkKICAgICAgICAgY29udGludWU7CiAKICAgICAgIGlmICghU2VsZWN0b3JzLmluc2VydChNLT5nZXRTZWxlY3RvcigpKSkKICAgICAgICAgY29udGludWU7CiAgICAgICAKLSAgICAgIFJlc3VsdCBSID0gUmVzdWx0KCpNLCBSZXN1bHRzLmdldEJhc2VQcmlvcml0eSgqTSksIDApOworICAgICAgUmVzdWx0IFIgPSBSZXN1bHQoTSwgUmVzdWx0cy5nZXRCYXNlUHJpb3JpdHkoTSksIDApOwogICAgICAgUi5TdGFydFBhcmFtZXRlciA9IFNlbElkZW50cy5zaXplKCk7CiAgICAgICBSLkFsbFBhcmFtZXRlcnNBcmVJbmZvcm1hdGl2ZSA9IChXYW50S2luZCAhPSBNS19BbnkpOwogICAgICAgaWYgKCFJbk9yaWdpbmFsQ2xhc3MpCkBAIC00ODk3LDE5ICs0ODQwLDEyIEBACiAgICAgcmV0dXJuOwogICAKICAgLy8gQWRkIG1ldGhvZHMgaW4gcHJvdG9jb2xzLgotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBJID0gSUZhY2UtPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBJRmFjZS0+cHJvdG9jb2xfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpCi0gICAgQWRkT2JqQ01ldGhvZHMoKkksIFdhbnRJbnN0YW5jZU1ldGhvZHMsIFdhbnRLaW5kLCBTZWxJZGVudHMsCisgIGZvciAoYXV0byAqSSA6IElGYWNlLT5wcm90b2NvbHMoKSkKKyAgICBBZGRPYmpDTWV0aG9kcyhJLCBXYW50SW5zdGFuY2VNZXRob2RzLCBXYW50S2luZCwgU2VsSWRlbnRzLAogICAgICAgICAgICAgICAgICAgIEN1ckNvbnRleHQsIFNlbGVjdG9ycywgQWxsb3dTYW1lTGVuZ3RoLCBSZXN1bHRzLCBmYWxzZSk7CiAgIAogICAvLyBBZGQgbWV0aG9kcyBpbiBjYXRlZ29yaWVzLgotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjprbm93bl9jYXRlZ29yaWVzX2l0ZXJhdG9yCi0gICAgICAgICBDYXQgPSBJRmFjZS0+a25vd25fY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgQ2F0RW5kID0gSUZhY2UtPmtub3duX2NhdGVnb3JpZXNfZW5kKCk7Ci0gICAgICAgQ2F0ICE9IENhdEVuZDsgKytDYXQpIHsKLSAgICBPYmpDQ2F0ZWdvcnlEZWNsICpDYXREZWNsID0gKkNhdDsKLSAgICAKKyAgZm9yIChhdXRvICpDYXREZWNsIDogSUZhY2UtPmtub3duX2NhdGVnb3JpZXMoKSkgewogICAgIEFkZE9iakNNZXRob2RzKENhdERlY2wsIFdhbnRJbnN0YW5jZU1ldGhvZHMsIFdhbnRLaW5kLCBTZWxJZGVudHMsCiAgICAgICAgICAgICAgICAgICAgQ3VyQ29udGV4dCwgU2VsZWN0b3JzLCBBbGxvd1NhbWVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgUmVzdWx0cywgSW5PcmlnaW5hbENsYXNzKTsKQEAgLTUxODEsMTAgKzUxMTcsNyBAQAogCiAgICAgLy8gQ2hlY2sgaW4gY2F0ZWdvcmllcyBvciBjbGFzcyBleHRlbnNpb25zLgogICAgIGlmICghU3VwZXJNZXRob2QpIHsKLSAgICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6Omtub3duX2NhdGVnb3JpZXNfaXRlcmF0b3IKLSAgICAgICAgICAgICBDYXQgPSBDbGFzcy0+a25vd25fY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgICAgIENhdEVuZCA9IENsYXNzLT5rbm93bl9jYXRlZ29yaWVzX2VuZCgpOwotICAgICAgICAgICBDYXQgIT0gQ2F0RW5kOyArK0NhdCkgeworICAgICAgZm9yIChjb25zdCBhdXRvICpDYXQgOiBDbGFzcy0+a25vd25fY2F0ZWdvcmllcygpKSB7CiAgICAgICAgIGlmICgoU3VwZXJNZXRob2QgPSBDYXQtPmdldE1ldGhvZChDdXJNZXRob2QtPmdldFNlbGVjdG9yKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ck1ldGhvZC0+aXNJbnN0YW5jZU1ldGhvZCgpKSkpCiAgICAgICAgICAgYnJlYWs7CkBAIC01NTM2LDcgKzU0NjksNyBAQAogICAvLyBJZiB3ZSdyZSBtZXNzYWdpbmcgYW4gZXhwcmVzc2lvbiB3aXRoIHR5cGUgImlkIiBvciAiQ2xhc3MiLCBjaGVjawogICAvLyB3aGV0aGVyIHdlIGtub3cgc29tZXRoaW5nIHNwZWNpYWwgYWJvdXQgdGhlIHJlY2VpdmVyIHRoYXQgYWxsb3dzCiAgIC8vIHVzIHRvIGFzc3VtZSBhIG1vcmUtc3BlY2lmaWMgcmVjZWl2ZXIgdHlwZS4KLSAgaWYgKFJlY2VpdmVyVHlwZS0+aXNPYmpDSWRUeXBlKCkgfHwgUmVjZWl2ZXJUeXBlLT5pc09iakNDbGFzc1R5cGUoKSkKKyAgaWYgKFJlY2VpdmVyVHlwZS0+aXNPYmpDSWRUeXBlKCkgfHwgUmVjZWl2ZXJUeXBlLT5pc09iakNDbGFzc1R5cGUoKSkgewogICAgIGlmIChPYmpDSW50ZXJmYWNlRGVjbCAqSUZhY2UgPSBHZXRBc3N1bWVkTWVzc2FnZVNlbmRFeHByVHlwZShSZWNFeHByKSkgewogICAgICAgaWYgKFJlY2VpdmVyVHlwZS0+aXNPYmpDQ2xhc3NUeXBlKCkpCiAgICAgICAgIHJldHVybiBDb2RlQ29tcGxldGVPYmpDQ2xhc3NNZXNzYWdlKFMsIApAQCAtNTU0Nyw2ICs1NDgwLDEzIEBACiAgICAgICBSZWNlaXZlclR5cGUgPSBDb250ZXh0LmdldE9iakNPYmplY3RQb2ludGVyVHlwZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuZ2V0T2JqQ0ludGVyZmFjZVR5cGUoSUZhY2UpKTsKICAgICB9CisgIH0gZWxzZSBpZiAoUmVjRXhwciAmJiBnZXRMYW5nT3B0cygpLkNQbHVzUGx1cykgeworICAgIEV4cHJSZXN1bHQgQ29udiA9IFBlcmZvcm1Db250ZXh0dWFsbHlDb252ZXJ0VG9PYmpDUG9pbnRlcihSZWNFeHByKTsKKyAgICBpZiAoQ29udi5pc1VzYWJsZSgpKSB7CisgICAgICBSZWNFeHByID0gQ29udi50YWtlKCk7CisgICAgICBSZWNlaXZlclR5cGUgPSBSZWNFeHByLT5nZXRUeXBlKCk7CisgICAgfQorICB9CiAKICAgLy8gQnVpbGQgdGhlIHNldCBvZiBtZXRob2RzIHdlIGNhbiBzZWUuCiAgIFJlc3VsdEJ1aWxkZXIgUmVzdWx0cygqdGhpcywgQ29kZUNvbXBsZXRlci0+Z2V0QWxsb2NhdG9yKCksCkBAIC01NTg3LDEwICs1NTI3LDggQEAKICAgZWxzZSBpZiAoY29uc3QgT2JqQ09iamVjdFBvaW50ZXJUeXBlICpRdWFsSUQKICAgICAgICAgICAgICA9IFJlY2VpdmVyVHlwZS0+Z2V0QXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkpIHsKICAgICAvLyBTZWFyY2ggcHJvdG9jb2xzIGZvciBpbnN0YW5jZSBtZXRob2RzLgotICAgIGZvciAoT2JqQ09iamVjdFBvaW50ZXJUeXBlOjpxdWFsX2l0ZXJhdG9yIEkgPSBRdWFsSUQtPnF1YWxfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gUXVhbElELT5xdWFsX2VuZCgpOyAKLSAgICAgICAgIEkgIT0gRTsgKytJKQotICAgICAgQWRkT2JqQ01ldGhvZHMoKkksIHRydWUsIE1LX0FueSwgU2VsSWRlbnRzLCBDdXJDb250ZXh0LAorICAgIGZvciAoYXV0byAqSSA6IFF1YWxJRC0+cXVhbHMoKSkKKyAgICAgIEFkZE9iakNNZXRob2RzKEksIHRydWUsIE1LX0FueSwgU2VsSWRlbnRzLCBDdXJDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3JzLCBBdEFyZ3VtZW50RXhwcmVzc2lvbiwgUmVzdWx0cyk7CiAgIH0KICAgLy8gSGFuZGxlIG1lc3NhZ2VzIHRvIGEgcG9pbnRlciB0byBpbnRlcmZhY2UgdHlwZS4KQEAgLTU2MDIsMTAgKzU1NDAsOCBAQAogICAgICAgICAgICAgICAgICAgIFJlc3VsdHMpOwogICAgIAogICAgIC8vIFNlYXJjaCBwcm90b2NvbHMgZm9yIGluc3RhbmNlIG1ldGhvZHMuCi0gICAgZm9yIChPYmpDT2JqZWN0UG9pbnRlclR5cGU6OnF1YWxfaXRlcmF0b3IgSSA9IElGYWNlUHRyLT5xdWFsX2JlZ2luKCksCi0gICAgICAgICBFID0gSUZhY2VQdHItPnF1YWxfZW5kKCk7IAotICAgICAgICAgSSAhPSBFOyArK0kpCi0gICAgICBBZGRPYmpDTWV0aG9kcygqSSwgdHJ1ZSwgTUtfQW55LCBTZWxJZGVudHMsIEN1ckNvbnRleHQsCisgICAgZm9yIChhdXRvICpJIDogSUZhY2VQdHItPnF1YWxzKCkpCisgICAgICBBZGRPYmpDTWV0aG9kcyhJLCB0cnVlLCBNS19BbnksIFNlbElkZW50cywgQ3VyQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9ycywgQXRBcmd1bWVudEV4cHJlc3Npb24sIFJlc3VsdHMpOwogICB9CiAgIC8vIEhhbmRsZSBtZXNzYWdlcyB0byAiaWQiLgpAQCAtNTc1MCwxMSArNTY4Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0QnVpbGRlciAmUmVzdWx0cykgewogICB0eXBlZGVmIENvZGVDb21wbGV0aW9uUmVzdWx0IFJlc3VsdDsKICAgCi0gIGZvciAoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgRCA9IEN0eC0+ZGVjbHNfYmVnaW4oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVuZCA9IEN0eC0+ZGVjbHNfZW5kKCk7Ci0gICAgICAgRCAhPSBERW5kOyArK0QpIHsKKyAgZm9yIChjb25zdCBhdXRvICpEIDogQ3R4LT5kZWNscygpKSB7CiAgICAgLy8gUmVjb3JkIGFueSBwcm90b2NvbHMgd2UgZmluZC4KLSAgICBpZiAoT2JqQ1Byb3RvY29sRGVjbCAqUHJvdG8gPSBkeW5fY2FzdDxPYmpDUHJvdG9jb2xEZWNsPigqRCkpCisgICAgaWYgKGNvbnN0IGF1dG8gKlByb3RvID0gZHluX2Nhc3Q8T2JqQ1Byb3RvY29sRGVjbD4oRCkpCiAgICAgICBpZiAoIU9ubHlGb3J3YXJkRGVjbGFyYXRpb25zIHx8ICFQcm90by0+aGFzRGVmaW5pdGlvbigpKQogICAgICAgICBSZXN1bHRzLkFkZFJlc3VsdChSZXN1bHQoUHJvdG8sIFJlc3VsdHMuZ2V0QmFzZVByaW9yaXR5KFByb3RvKSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckNvbnRleHQsIDAsIGZhbHNlKTsKQEAgLTU4MTgsMTEgKzU3NTIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRCdWlsZGVyICZSZXN1bHRzKSB7CiAgIHR5cGVkZWYgQ29kZUNvbXBsZXRpb25SZXN1bHQgUmVzdWx0OwogICAKLSAgZm9yIChEZWNsQ29udGV4dDo6ZGVjbF9pdGVyYXRvciBEID0gQ3R4LT5kZWNsc19iZWdpbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERW5kID0gQ3R4LT5kZWNsc19lbmQoKTsKLSAgICAgICBEICE9IERFbmQ7ICsrRCkgeworICBmb3IgKGNvbnN0IGF1dG8gKkQgOiBDdHgtPmRlY2xzKCkpIHsKICAgICAvLyBSZWNvcmQgYW55IGludGVyZmFjZXMgd2UgZmluZC4KLSAgICBpZiAoT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzID0gZHluX2Nhc3Q8T2JqQ0ludGVyZmFjZURlY2w+KCpEKSkKKyAgICBpZiAoY29uc3QgYXV0byAqQ2xhc3MgPSBkeW5fY2FzdDxPYmpDSW50ZXJmYWNlRGVjbD4oRCkpCiAgICAgICBpZiAoKCFPbmx5Rm9yd2FyZERlY2xhcmF0aW9ucyB8fCAhQ2xhc3MtPmhhc0RlZmluaXRpb24oKSkgJiYKICAgICAgICAgICAoIU9ubHlVbmltcGxlbWVudGVkIHx8ICFDbGFzcy0+Z2V0SW1wbGVtZW50YXRpb24oKSkpCiAgICAgICAgIFJlc3VsdHMuQWRkUmVzdWx0KFJlc3VsdChDbGFzcywgUmVzdWx0cy5nZXRCYXNlUHJpb3JpdHkoQ2xhc3MpLCAwKSwKQEAgLTU5MDksMjEgKzU4NDEsMTUgQEAKICAgTmFtZWREZWNsICpDdXJDbGFzcwogICAgID0gTG9va3VwU2luZ2xlTmFtZShUVVNjb3BlLCBDbGFzc05hbWUsIENsYXNzTmFtZUxvYywgTG9va3VwT3JkaW5hcnlOYW1lKTsKICAgaWYgKE9iakNJbnRlcmZhY2VEZWNsICpDbGFzcyA9IGR5bl9jYXN0X29yX251bGw8T2JqQ0ludGVyZmFjZURlY2w+KEN1ckNsYXNzKSl7Ci0gICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6dmlzaWJsZV9jYXRlZ29yaWVzX2l0ZXJhdG9yCi0gICAgICAgICAgIENhdCA9IENsYXNzLT52aXNpYmxlX2NhdGVnb3JpZXNfYmVnaW4oKSwKLSAgICAgICAgICAgQ2F0RW5kID0gQ2xhc3MtPnZpc2libGVfY2F0ZWdvcmllc19lbmQoKTsKLSAgICAgICAgIENhdCAhPSBDYXRFbmQ7ICsrQ2F0KSB7CisgICAgZm9yIChjb25zdCBhdXRvICpDYXQgOiBDbGFzcy0+dmlzaWJsZV9jYXRlZ29yaWVzKCkpCiAgICAgICBDYXRlZ29yeU5hbWVzLmluc2VydChDYXQtPmdldElkZW50aWZpZXIoKSk7Ci0gICAgfQogICB9CiAKICAgLy8gQWRkIGFsbCBvZiB0aGUgY2F0ZWdvcmllcyB3ZSBrbm93IGFib3V0LgogICBSZXN1bHRzLkVudGVyTmV3U2NvcGUoKTsKICAgVHJhbnNsYXRpb25Vbml0RGVjbCAqVFUgPSBDb250ZXh0LmdldFRyYW5zbGF0aW9uVW5pdERlY2woKTsKLSAgZm9yIChEZWNsQ29udGV4dDo6ZGVjbF9pdGVyYXRvciBEID0gVFUtPmRlY2xzX2JlZ2luKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFbmQgPSBUVS0+ZGVjbHNfZW5kKCk7Ci0gICAgICAgRCAhPSBERW5kOyArK0QpIAotICAgIGlmIChPYmpDQ2F0ZWdvcnlEZWNsICpDYXRlZ29yeSA9IGR5bl9jYXN0PE9iakNDYXRlZ29yeURlY2w+KCpEKSkKKyAgZm9yIChjb25zdCBhdXRvICpEIDogVFUtPmRlY2xzKCkpIAorICAgIGlmIChjb25zdCBhdXRvICpDYXRlZ29yeSA9IGR5bl9jYXN0PE9iakNDYXRlZ29yeURlY2w+KEQpKQogICAgICAgaWYgKENhdGVnb3J5TmFtZXMuaW5zZXJ0KENhdGVnb3J5LT5nZXRJZGVudGlmaWVyKCkpKQogICAgICAgICBSZXN1bHRzLkFkZFJlc3VsdChSZXN1bHQoQ2F0ZWdvcnksIFJlc3VsdHMuZ2V0QmFzZVByaW9yaXR5KENhdGVnb3J5KSwwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyQ29udGV4dCwgMCwgZmFsc2UpOwpAQCAtNTk1OSwxMyArNTg4NSwxMCBAQAogICBSZXN1bHRzLkVudGVyTmV3U2NvcGUoKTsKICAgYm9vbCBJZ25vcmVJbXBsZW1lbnRlZCA9IHRydWU7CiAgIHdoaWxlIChDbGFzcykgewotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnZpc2libGVfY2F0ZWdvcmllc19pdGVyYXRvcgotICAgICAgICAgICBDYXQgPSBDbGFzcy0+dmlzaWJsZV9jYXRlZ29yaWVzX2JlZ2luKCksCi0gICAgICAgICAgIENhdEVuZCA9IENsYXNzLT52aXNpYmxlX2NhdGVnb3JpZXNfZW5kKCk7Ci0gICAgICAgICBDYXQgIT0gQ2F0RW5kOyArK0NhdCkgeworICAgIGZvciAoY29uc3QgYXV0byAqQ2F0IDogQ2xhc3MtPnZpc2libGVfY2F0ZWdvcmllcygpKSB7CiAgICAgICBpZiAoKCFJZ25vcmVJbXBsZW1lbnRlZCB8fCAhQ2F0LT5nZXRJbXBsZW1lbnRhdGlvbigpKSAmJgogICAgICAgICAgIENhdGVnb3J5TmFtZXMuaW5zZXJ0KENhdC0+Z2V0SWRlbnRpZmllcigpKSkKLSAgICAgICAgUmVzdWx0cy5BZGRSZXN1bHQoUmVzdWx0KCpDYXQsIFJlc3VsdHMuZ2V0QmFzZVByaW9yaXR5KCpDYXQpLCAwKSwKKyAgICAgICAgUmVzdWx0cy5BZGRSZXN1bHQoUmVzdWx0KENhdCwgUmVzdWx0cy5nZXRCYXNlUHJpb3JpdHkoQ2F0KSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1ckNvbnRleHQsIDAsIGZhbHNlKTsKICAgICB9CiAgICAgCkBAIC01OTk0LDEwICs1OTE3LDggQEAKIAogICAvLyBJZ25vcmUgYW55IHByb3BlcnRpZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBpbXBsZW1lbnRlZC4KICAgQ29udGFpbmVyID0gZ2V0Q29udGFpbmVyRGVmKENvbnRhaW5lcik7Ci0gIGZvciAoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgRCA9IENvbnRhaW5lci0+ZGVjbHNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERW5kID0gQ29udGFpbmVyLT5kZWNsc19lbmQoKTsKLSAgICAgICBEICE9IERFbmQ7ICsrRCkKLSAgICBpZiAoT2JqQ1Byb3BlcnR5SW1wbERlY2wgKlByb3BlcnR5SW1wbCA9IGR5bl9jYXN0PE9iakNQcm9wZXJ0eUltcGxEZWNsPigqRCkpCisgIGZvciAoY29uc3QgYXV0byAqRCA6IENvbnRhaW5lci0+ZGVjbHMoKSkKKyAgICBpZiAoY29uc3QgYXV0byAqUHJvcGVydHlJbXBsID0gZHluX2Nhc3Q8T2JqQ1Byb3BlcnR5SW1wbERlY2w+KEQpKQogICAgICAgUmVzdWx0cy5JZ25vcmUoUHJvcGVydHlJbXBsLT5nZXRQcm9wZXJ0eURlY2woKSk7CiAgIAogICAvLyBBZGQgYW55IHByb3BlcnRpZXMgdGhhdCB3ZSBmaW5kLgpAQCAtNjE0NCwxMSArNjA2NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25NZXRob2RzLCBJbk9yaWdpbmFsQ2xhc3MpOwogCiAgICAgLy8gQWRkIG1ldGhvZHMgZnJvbSBhbnkgY2xhc3MgZXh0ZW5zaW9ucyBhbmQgY2F0ZWdvcmllcy4KLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjp2aXNpYmxlX2NhdGVnb3JpZXNfaXRlcmF0b3IKLSAgICAgICAgICAgQ2F0ID0gSUZhY2UtPnZpc2libGVfY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgICBDYXRFbmQgPSBJRmFjZS0+dmlzaWJsZV9jYXRlZ29yaWVzX2VuZCgpOwotICAgICAgICAgQ2F0ICE9IENhdEVuZDsgKytDYXQpIHsKLSAgICAgIEZpbmRJbXBsZW1lbnRhYmxlTWV0aG9kcyhDb250ZXh0LCAqQ2F0LCBXYW50SW5zdGFuY2VNZXRob2RzLCBSZXR1cm5UeXBlLAorICAgIGZvciAoYXV0byAqQ2F0IDogSUZhY2UtPnZpc2libGVfY2F0ZWdvcmllcygpKSB7CisgICAgICBGaW5kSW1wbGVtZW50YWJsZU1ldGhvZHMoQ29udGV4dCwgQ2F0LCBXYW50SW5zdGFuY2VNZXRob2RzLCBSZXR1cm5UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duTWV0aG9kcywgZmFsc2UpOyAgICAgIAogICAgIH0KIApAQCAtNjE5NiwxNiArNjExNCwxNCBAQAogICAvLyBBZGQgbWV0aG9kcyBpbiB0aGlzIGNvbnRhaW5lci4gVGhpcyBvcGVyYXRpb24gb2NjdXJzIGxhc3QgYmVjYXVzZQogICAvLyB3ZSB3YW50IHRoZSBtZXRob2RzIGZyb20gdGhpcyBjb250YWluZXIgdG8gb3ZlcnJpZGUgYW55IG1ldGhvZHMKICAgLy8gd2UndmUgcHJldmlvdXNseSBzZWVuIHdpdGggdGhlIHNhbWUgc2VsZWN0b3IuCi0gIGZvciAoT2JqQ0NvbnRhaW5lckRlY2w6Om1ldGhvZF9pdGVyYXRvciBNID0gQ29udGFpbmVyLT5tZXRoX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRW5kID0gQ29udGFpbmVyLT5tZXRoX2VuZCgpOwotICAgICAgIE0gIT0gTUVuZDsgKytNKSB7CisgIGZvciAoYXV0byAqTSA6IENvbnRhaW5lci0+bWV0aG9kcygpKSB7CiAgICAgaWYgKE0tPmlzSW5zdGFuY2VNZXRob2QoKSA9PSBXYW50SW5zdGFuY2VNZXRob2RzKSB7CiAgICAgICBpZiAoIVJldHVyblR5cGUuaXNOdWxsKCkgJiYKLSAgICAgICAgICAhQ29udGV4dC5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKFJldHVyblR5cGUsIE0tPmdldFJlc3VsdFR5cGUoKSkpCisgICAgICAgICAgIUNvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShSZXR1cm5UeXBlLCBNLT5nZXRSZXR1cm5UeXBlKCkpKQogICAgICAgICBjb250aW51ZTsKIAogICAgICAgS25vd25NZXRob2RzW00tPmdldFNlbGVjdG9yKCldID0KLSAgICAgICAgICBLbm93bk1ldGhvZHNNYXA6Om1hcHBlZF90eXBlKCpNLCBJbk9yaWdpbmFsQ2xhc3MpOworICAgICAgICAgIEtub3duTWV0aG9kc01hcDo6bWFwcGVkX3R5cGUoTSwgSW5PcmlnaW5hbENsYXNzKTsKICAgICB9CiAgIH0KIH0KQEAgLTY5MjYsMTAgKzY4NDIsOSBAQAogICAgIC8vIElmIHRoZSByZXN1bHQgdHlwZSB3YXMgbm90IGFscmVhZHkgcHJvdmlkZWQsIGFkZCBpdCB0byB0aGUKICAgICAvLyBwYXR0ZXJuIGFzICh0eXBlKS4KICAgICBpZiAoUmV0dXJuVHlwZS5pc051bGwoKSkKLSAgICAgIEFkZE9iakNQYXNzaW5nVHlwZUNodW5rKE1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kLT5nZXRPYmpDRGVjbFF1YWxpZmllcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCwgUG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlcik7IAorICAgICAgQWRkT2JqQ1Bhc3NpbmdUeXBlQ2h1bmsoTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QtPmdldE9iakNEZWNsUXVhbGlmaWVyKCksIENvbnRleHQsIFBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXIpOwogCiAgICAgU2VsZWN0b3IgU2VsID0gTWV0aG9kLT5nZXRTZWxlY3RvcigpOwogCkBAIC02OTczLDcgKzY4ODgsNyBAQAogICAgICAgQnVpbGRlci5BZGRDaHVuayhDb2RlQ29tcGxldGlvblN0cmluZzo6Q0tfSG9yaXpvbnRhbFNwYWNlKTsKICAgICAgIEJ1aWxkZXIuQWRkQ2h1bmsoQ29kZUNvbXBsZXRpb25TdHJpbmc6OkNLX0xlZnRCcmFjZSk7CiAgICAgICBCdWlsZGVyLkFkZENodW5rKENvZGVDb21wbGV0aW9uU3RyaW5nOjpDS19WZXJ0aWNhbFNwYWNlKTsKLSAgICAgIGlmICghTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCktPmlzVm9pZFR5cGUoKSkgeworICAgICAgaWYgKCFNZXRob2QtPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHlwZSgpKSB7CiAgICAgICAgIC8vIElmIHRoZSByZXN1bHQgdHlwZSBpcyBub3Qgdm9pZCwgYWRkIGEgcmV0dXJuIGNsYXVzZS4KICAgICAgICAgQnVpbGRlci5BZGRUZXh0Q2h1bmsoInJldHVybiIpOwogICAgICAgICBCdWlsZGVyLkFkZENodW5rKENvZGVDb21wbGV0aW9uU3RyaW5nOjpDS19Ib3Jpem9udGFsU3BhY2UpOwpAQCAtNzAxMSwyMyArNjkyNiwxNCBAQAogICAgICAgaWYgKE9iakNDYXRlZ29yeURlY2wgKkNhdGVnb3J5ID0gZHluX2Nhc3Q8T2JqQ0NhdGVnb3J5RGVjbD4oU2VhcmNoRGVjbCkpCiAgICAgICAgIElGYWNlID0gQ2F0ZWdvcnktPmdldENsYXNzSW50ZXJmYWNlKCk7CiAgICAgCi0gICAgaWYgKElGYWNlKSB7Ci0gICAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjp2aXNpYmxlX2NhdGVnb3JpZXNfaXRlcmF0b3IKLSAgICAgICAgICAgICBDYXQgPSBJRmFjZS0+dmlzaWJsZV9jYXRlZ29yaWVzX2JlZ2luKCksCi0gICAgICAgICAgICAgQ2F0RW5kID0gSUZhY2UtPnZpc2libGVfY2F0ZWdvcmllc19lbmQoKTsKLSAgICAgICAgICAgQ2F0ICE9IENhdEVuZDsgKytDYXQpIHsKLSAgICAgICAgQ29udGFpbmVycy5wdXNoX2JhY2soKkNhdCk7Ci0gICAgICB9Ci0gICAgfQorICAgIGlmIChJRmFjZSkKKyAgICAgIGZvciAoYXV0byAqQ2F0IDogSUZhY2UtPnZpc2libGVfY2F0ZWdvcmllcygpKQorICAgICAgICBDb250YWluZXJzLnB1c2hfYmFjayhDYXQpOwogICAgIAotICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBDb250YWluZXJzLnNpemUoKTsgSSAhPSBOOyArK0kpIHsKLSAgICAgIGZvciAoT2JqQ0NvbnRhaW5lckRlY2w6OnByb3BfaXRlcmF0b3IgUCA9IENvbnRhaW5lcnNbSV0tPnByb3BfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVuZCA9IENvbnRhaW5lcnNbSV0tPnByb3BfZW5kKCk7IAotICAgICAgICAgICBQICE9IFBFbmQ7ICsrUCkgewotICAgICAgICBBZGRPYmpDS2V5VmFsdWVDb21wbGV0aW9ucygqUCwgSXNJbnN0YW5jZU1ldGhvZCwgUmV0dXJuVHlwZSwgQ29udGV4dCwgCisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IENvbnRhaW5lcnMuc2l6ZSgpOyBJICE9IE47ICsrSSkKKyAgICAgIGZvciAoYXV0byAqUCA6IENvbnRhaW5lcnNbSV0tPnByb3BlcnRpZXMoKSkKKyAgICAgICAgQWRkT2JqQ0tleVZhbHVlQ29tcGxldGlvbnMoUCwgSXNJbnN0YW5jZU1ldGhvZCwgUmV0dXJuVHlwZSwgQ29udGV4dCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duU2VsZWN0b3JzLCBSZXN1bHRzKTsKLSAgICAgIH0KLSAgICB9CiAgIH0KICAgCiAgIFJlc3VsdHMuRXhpdFNjb3BlKCk7CmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hRGVjbC5jcHAgYi9saWIvU2VtYS9TZW1hRGVjbC5jcHAKaW5kZXggMzI4Y2U3MC4uNDNkODU1YyAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYURlY2wuY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFEZWNsLmNwcApAQCAtNjIsMjQgKzYyLDI5IEBACiAKIGNsYXNzIFR5cGVOYW1lVmFsaWRhdG9yQ0NDIDogcHVibGljIENvcnJlY3Rpb25DYW5kaWRhdGVDYWxsYmFjayB7CiAgcHVibGljOgotICBUeXBlTmFtZVZhbGlkYXRvckNDQyhib29sIEFsbG93SW52YWxpZCwgYm9vbCBXYW50Q2xhc3M9ZmFsc2UpCi0gICAgICA6IEFsbG93SW52YWxpZERlY2woQWxsb3dJbnZhbGlkKSwgV2FudENsYXNzTmFtZShXYW50Q2xhc3MpIHsKKyAgVHlwZU5hbWVWYWxpZGF0b3JDQ0MoYm9vbCBBbGxvd0ludmFsaWQsIGJvb2wgV2FudENsYXNzPWZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93VGVtcGxhdGVzPWZhbHNlKQorICAgICAgOiBBbGxvd0ludmFsaWREZWNsKEFsbG93SW52YWxpZCksIFdhbnRDbGFzc05hbWUoV2FudENsYXNzKSwKKyAgICAgICAgQWxsb3dDbGFzc1RlbXBsYXRlcyhBbGxvd1RlbXBsYXRlcykgewogICAgIFdhbnRFeHByZXNzaW9uS2V5d29yZHMgPSBmYWxzZTsKICAgICBXYW50Q1hYTmFtZWRDYXN0cyA9IGZhbHNlOwogICAgIFdhbnRSZW1haW5pbmdLZXl3b3JkcyA9IGZhbHNlOwogICB9CiAKLSAgdmlydHVhbCBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIHsKLSAgICBpZiAoTmFtZWREZWNsICpORCA9IGNhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uRGVjbCgpKQotICAgICAgcmV0dXJuIChpc2E8VHlwZURlY2w+KE5EKSB8fCBpc2E8T2JqQ0ludGVyZmFjZURlY2w+KE5EKSkgJiYKLSAgICAgICAgICAoQWxsb3dJbnZhbGlkRGVjbCB8fCAhTkQtPmlzSW52YWxpZERlY2woKSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuICFXYW50Q2xhc3NOYW1lICYmIGNhbmRpZGF0ZS5pc0tleXdvcmQoKTsKKyAgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSBvdmVycmlkZSB7CisgICAgaWYgKE5hbWVkRGVjbCAqTkQgPSBjYW5kaWRhdGUuZ2V0Q29ycmVjdGlvbkRlY2woKSkgeworICAgICAgYm9vbCBJc1R5cGUgPSBpc2E8VHlwZURlY2w+KE5EKSB8fCBpc2E8T2JqQ0ludGVyZmFjZURlY2w+KE5EKTsKKyAgICAgIGJvb2wgQWxsb3dlZFRlbXBsYXRlID0gQWxsb3dDbGFzc1RlbXBsYXRlcyAmJiBpc2E8Q2xhc3NUZW1wbGF0ZURlY2w+KE5EKTsKKyAgICAgIHJldHVybiAoSXNUeXBlIHx8IEFsbG93ZWRUZW1wbGF0ZSkgJiYKKyAgICAgICAgICAgICAoQWxsb3dJbnZhbGlkRGVjbCB8fCAhTkQtPmlzSW52YWxpZERlY2woKSk7CisgICAgfQorICAgIHJldHVybiAhV2FudENsYXNzTmFtZSAmJiBjYW5kaWRhdGUuaXNLZXl3b3JkKCk7CiAgIH0KIAogIHByaXZhdGU6CiAgIGJvb2wgQWxsb3dJbnZhbGlkRGVjbDsKICAgYm9vbCBXYW50Q2xhc3NOYW1lOworICBib29sIEFsbG93Q2xhc3NUZW1wbGF0ZXM7CiB9OwogCiB9CkBAIC0zODEsOSArMzg2LDggQEAKICAgICBjb25zdCBUeXBlICpUeSA9IFNTLT5nZXRTY29wZVJlcCgpLT5nZXRBc1R5cGUoKTsKIAogICAgIENYWFJlY29yZERlY2wgKlJEID0gY2FzdDxDWFhSZWNvcmREZWNsPihDdXJDb250ZXh0KTsKLSAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgQmFzZSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgIEJhc2VFbmQgPSBSRC0+YmFzZXNfZW5kKCk7IEJhc2UgIT0gQmFzZUVuZDsgKytCYXNlKQotICAgICAgaWYgKENvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShRdWFsVHlwZShUeSwgMSksIEJhc2UtPmdldFR5cGUoKSkpCisgICAgZm9yIChjb25zdCBhdXRvICZCYXNlIDogUkQtPmJhc2VzKCkpCisgICAgICBpZiAoQ29udGV4dC5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKFF1YWxUeXBlKFR5LCAxKSwgQmFzZS5nZXRUeXBlKCkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICByZXR1cm4gUy0+aXNGdW5jdGlvblByb3RvdHlwZVNjb3BlKCk7CiAgIH0gCkBAIC0zOTQsMTMgKzM5OCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJSUxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGUgKlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAqU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZFR5cGUgJlN1Z2dlc3RlZFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSAmU3VnZ2VzdGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0NsYXNzVGVtcGxhdGVzKSB7CiAgIC8vIFdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gc3VnZ2VzdCAoeWV0KS4KICAgU3VnZ2VzdGVkVHlwZSA9IFBhcnNlZFR5cGUoKTsKICAgCiAgIC8vIFRoZXJlIG1heSBoYXZlIGJlZW4gYSB0eXBvIGluIHRoZSBuYW1lIG9mIHRoZSB0eXBlLiBMb29rIHVwIHR5cG8KICAgLy8gcmVzdWx0cywgaW4gY2FzZSB3ZSBoYXZlIHNvbWV0aGluZyB0aGF0IHdlIGNhbiBzdWdnZXN0LgotICBUeXBlTmFtZVZhbGlkYXRvckNDQyBWYWxpZGF0b3IoZmFsc2UpOworICBUeXBlTmFtZVZhbGlkYXRvckNDQyBWYWxpZGF0b3IoZmFsc2UsIGZhbHNlLCBBbGxvd0NsYXNzVGVtcGxhdGVzKTsKICAgaWYgKFR5cG9Db3JyZWN0aW9uIENvcnJlY3RlZCA9IENvcnJlY3RUeXBvKERlY2xhcmF0aW9uTmFtZUluZm8oSUksIElJTG9jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb2t1cE9yZGluYXJ5TmFtZSwgUywgU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3IpKSB7CkBAIC00NjcsMTEgKzQ3MiwxMSBAQAogICAgICAgPDwgSUkgPDwgREMgPDwgU1MtPmdldFJhbmdlKCk7CiAgIGVsc2UgaWYgKGlzRGVwZW5kZW50U2NvcGVTcGVjaWZpZXIoKlNTKSkgewogICAgIHVuc2lnbmVkIERpYWdJRCA9IGRpYWc6OmVycl90eXBlbmFtZV9taXNzaW5nOwotICAgIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUgJiYgaXNNaWNyb3NvZnRNaXNzaW5nVHlwZW5hbWUoU1MsIFMpKQorICAgIGlmIChnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQgJiYgaXNNaWNyb3NvZnRNaXNzaW5nVHlwZW5hbWUoU1MsIFMpKQogICAgICAgRGlhZ0lEID0gZGlhZzo6d2Fybl90eXBlbmFtZV9taXNzaW5nOwogCiAgICAgRGlhZyhTUy0+Z2V0UmFuZ2UoKS5nZXRCZWdpbigpLCBEaWFnSUQpCi0gICAgICA8PCAoTmVzdGVkTmFtZVNwZWNpZmllciAqKVNTLT5nZXRTY29wZVJlcCgpIDw8IElJLT5nZXROYW1lKCkKKyAgICAgIDw8IFNTLT5nZXRTY29wZVJlcCgpIDw8IElJLT5nZXROYW1lKCkKICAgICAgIDw8IFNvdXJjZVJhbmdlKFNTLT5nZXRSYW5nZSgpLmdldEJlZ2luKCksIElJTG9jKQogICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oU1MtPmdldFJhbmdlKCkuZ2V0QmVnaW4oKSwgInR5cGVuYW1lICIpOwogICAgIFN1Z2dlc3RlZFR5cGUgPSBBY3RPblR5cGVuYW1lVHlwZShTLCBTb3VyY2VMb2NhdGlvbigpLApAQCAtODQ1LDcgKzg1MCw4IEBACiAgIC8vIHNlZW1zIGxpa2VseSBhIHR5cGUgaXMgd2FudGVkIGluc3RlYWQgb2YgdGhlIG5vbi10eXBlIHRoYXQgd2FzIGZvdW5kLgogICBib29sIE5leHRJc09wID0gTmV4dFRva2VuLmlzKHRvazo6YW1wKSB8fCBOZXh0VG9rZW4uaXModG9rOjpzdGFyKTsKICAgaWYgKChOZXh0VG9rZW4uaXModG9rOjppZGVudGlmaWVyKSB8fAotICAgICAgIChOZXh0SXNPcCAmJiBGaXJzdERlY2wtPmlzRnVuY3Rpb25PckZ1bmN0aW9uVGVtcGxhdGUoKSkpICYmCisgICAgICAgKE5leHRJc09wICYmCisgICAgICAgIEZpcnN0RGVjbC0+Z2V0VW5kZXJseWluZ0RlY2woKS0+aXNGdW5jdGlvbk9yRnVuY3Rpb25UZW1wbGF0ZSgpKSkgJiYKICAgICAgIGlzVGFnVHlwZVdpdGhNaXNzaW5nVGFnKCp0aGlzLCBSZXN1bHQsIFMsIFNTLCBOYW1lLCBOYW1lTG9jKSkgewogICAgIFR5cGVEZWNsICpUeXBlID0gUmVzdWx0LmdldEFzU2luZ2xlPFR5cGVEZWNsPigpOwogICAgIERpYWdub3NlVXNlT2ZEZWNsKFR5cGUsIE5hbWVMb2MpOwpAQCAtOTYyLDEyICs5NjgsOSBAQAogCiAKIHZvaWQgU2VtYTo6QWN0T25SZWVudGVyRnVuY3Rpb25Db250ZXh0KFNjb3BlKiBTLCBEZWNsICpEKSB7Ci0gIEZ1bmN0aW9uRGVjbCAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEQpOwotICBpZiAoRnVuY3Rpb25UZW1wbGF0ZURlY2wgKlRGRCA9IGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpKSB7Ci0gICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjYWxsZWQKLSAgICAvLyBBY3RPblJlZW50ZXJUZW1wbGF0ZVNjb3BlCi0gICAgRkQgPSBURkQtPmdldFRlbXBsYXRlZERlY2woKTsKLSAgfQorICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNhbGxlZAorICAvLyBBY3RPblJlZW50ZXJUZW1wbGF0ZVNjb3BlIHNvIGdldFRlbXBsYXRlZERlY2woKSB3b3Jrcy4KKyAgRnVuY3Rpb25EZWNsICpGRCA9IEQtPmdldEFzRnVuY3Rpb24oKTsKICAgaWYgKCFGRCkKICAgICByZXR1cm47CiAKQEAgLTEwODYsOSArMTA4OSw4IEBACiB9CiAKIGJvb2wgU2VtYTo6aXNEZWNsSW5TY29wZShOYW1lZERlY2wgKkQsIERlY2xDb250ZXh0ICpDdHgsIFNjb3BlICpTLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwbGljaXRJbnN0YW50aWF0aW9uT3JTcGVjaWFsaXphdGlvbikgewotICByZXR1cm4gSWRSZXNvbHZlci5pc0RlY2xJblNjb3BlKEQsIEN0eCwgUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsaWNpdEluc3RhbnRpYXRpb25PclNwZWNpYWxpemF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93SW5saW5lTmFtZXNwYWNlKSB7CisgIHJldHVybiBJZFJlc29sdmVyLmlzRGVjbEluU2NvcGUoRCwgQ3R4LCBTLCBBbGxvd0lubGluZU5hbWVzcGFjZSk7CiB9CiAKIFNjb3BlICpTZW1hOjpnZXRTY29wZUZvckRlY2xDb250ZXh0KFNjb3BlICpTLCBEZWNsQ29udGV4dCAqREMpIHsKQEAgLTExMDgsMjEgKzExMTAsMTkgQEAKIAogLy8vIEZpbHRlcnMgb3V0IGxvb2t1cCByZXN1bHRzIHRoYXQgZG9uJ3QgZmFsbCB3aXRoaW4gdGhlIGdpdmVuIHNjb3BlCiAvLy8gYXMgZGV0ZXJtaW5lZCBieSBpc0RlY2xJblNjb3BlLgotdm9pZCBTZW1hOjpGaWx0ZXJMb29rdXBGb3JTY29wZShMb29rdXBSZXN1bHQgJlIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpDdHgsIFNjb3BlICpTLAordm9pZCBTZW1hOjpGaWx0ZXJMb29rdXBGb3JTY29wZShMb29rdXBSZXN1bHQgJlIsIERlY2xDb250ZXh0ICpDdHgsIFNjb3BlICpTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbnNpZGVyTGlua2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBsaWNpdEluc3RhbnRpYXRpb25PclNwZWNpYWxpemF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dJbmxpbmVOYW1lc3BhY2UpIHsKICAgTG9va3VwUmVzdWx0OjpGaWx0ZXIgRiA9IFIubWFrZUZpbHRlcigpOwogICB3aGlsZSAoRi5oYXNOZXh0KCkpIHsKICAgICBOYW1lZERlY2wgKkQgPSBGLm5leHQoKTsKIAotICAgIGlmIChpc0RlY2xJblNjb3BlKEQsIEN0eCwgUywgRXhwbGljaXRJbnN0YW50aWF0aW9uT3JTcGVjaWFsaXphdGlvbikpCisgICAgaWYgKGlzRGVjbEluU2NvcGUoRCwgQ3R4LCBTLCBBbGxvd0lubGluZU5hbWVzcGFjZSkpCiAgICAgICBjb250aW51ZTsKIAotICAgIGlmIChDb25zaWRlckxpbmthZ2UgJiYKLSAgICAgICAgaXNPdXRPZlNjb3BlUHJldmlvdXNEZWNsYXJhdGlvbihELCBDdHgsIENvbnRleHQpKQorICAgIGlmIChDb25zaWRlckxpbmthZ2UgJiYgaXNPdXRPZlNjb3BlUHJldmlvdXNEZWNsYXJhdGlvbihELCBDdHgsIENvbnRleHQpKQogICAgICAgY29udGludWU7Ci0gICAgCisKICAgICBGLmVyYXNlKCk7CiAgIH0KIApAQCAtMTE3Myw4ICsxMTczLDggQEAKIC8vCiAvLyBXaGVuIHdlIHNlZSBmb28gd2UgZG9uJ3Qga25vdyBpZiBhZnRlciB0aGUgdHlwZWRlZiB3ZSB3aWxsIGdldCAnQScgb3IgJypBJwogLy8gZm9yIGV4YW1wbGUuIElmICdBJywgZm9vIHdpbGwgaGF2ZSBleHRlcm5hbCBsaW5rYWdlLiBJZiB3ZSBoYXZlICcqQScsCi0vLyBmb28gd2lsbCBoYXZlIG5vIGxpbmthZ2UuIFNpbmNlIHdlIGNhbid0IGtub3cgdW50aWxsIHdlIGdldCB0byB0aGUgZW5kCi0vLyBvZiB0aGUgdHlwZWRlZiwgdGhpcyBmdW5jdGlvbiBmaW5kcyBvdXQgaWYgRCBtaWdodCBoYXZlIG5vbiBleHRlcm5hbCBsaW5rYWdlLgorLy8gZm9vIHdpbGwgaGF2ZSBubyBsaW5rYWdlLiBTaW5jZSB3ZSBjYW4ndCBrbm93IHVudGlsIHdlIGdldCB0byB0aGUgZW5kCisvLyBvZiB0aGUgdHlwZWRlZiwgdGhpcyBmdW5jdGlvbiBmaW5kcyBvdXQgaWYgRCBtaWdodCBoYXZlIG5vbi1leHRlcm5hbCBsaW5rYWdlLgogLy8gQ2FsbGVycyBzaG91bGQgdmVyaWZ5IGF0IHRoZSBlbmQgb2YgdGhlIFRVIGlmIGl0IEQgaGFzIGV4dGVybmFsIGxpbmthZ2Ugb3IKIC8vIG5vdC4KIGJvb2wgU2VtYTo6bWlnaHRIYXZlTm9uRXh0ZXJuYWxMaW5rYWdlKGNvbnN0IERlY2xhcmF0b3JEZWNsICpEKSB7CkBAIC0xMjA0LDcgKzEyMDQsOCBAQAogICBpZiAoRC0+aXNJbnZhbGlkRGVjbCgpIHx8IEQtPmlzVXNlZCgpIHx8IEQtPmhhc0F0dHI8VW51c2VkQXR0cj4oKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgLy8gSWdub3JlIGNsYXNzIHRlbXBsYXRlcy4KKyAgLy8gSWdub3JlIGFsbCBlbnRpdGllcyBkZWNsYXJlZCB3aXRoaW4gdGVtcGxhdGVzLCBhbmQgb3V0LW9mLWxpbmUgZGVmaW5pdGlvbnMKKyAgLy8gb2YgbWVtYmVycyBvZiBjbGFzcyB0ZW1wbGF0ZXMuCiAgIGlmIChELT5nZXREZWNsQ29udGV4dCgpLT5pc0RlcGVuZGVudENvbnRleHQoKSB8fAogICAgICAgRC0+Z2V0TGV4aWNhbERlY2xDb250ZXh0KCktPmlzRGVwZW5kZW50Q29udGV4dCgpKQogICAgIHJldHVybiBmYWxzZTsKQEAgLTEyNzEsNyArMTI3Miw4IEBACiAgIGlmIChELT5pc0ludmFsaWREZWNsKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGlmIChELT5pc1JlZmVyZW5jZWQoKSB8fCBELT5pc1VzZWQoKSB8fCBELT5oYXNBdHRyPFVudXNlZEF0dHI+KCkpCisgIGlmIChELT5pc1JlZmVyZW5jZWQoKSB8fCBELT5pc1VzZWQoKSB8fCBELT5oYXNBdHRyPFVudXNlZEF0dHI+KCkgfHwKKyAgICAgIEQtPmhhc0F0dHI8T2JqQ1ByZWNpc2VMaWZldGltZUF0dHI+KCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIGlmIChpc2E8TGFiZWxEZWNsPihEKSkKQEAgLTEzNzQsOSArMTM3Niw3IEBACiAgIGFzc2VydCgoUy0+Z2V0RmxhZ3MoKSAmIChTY29wZTo6RGVjbFNjb3BlIHwgU2NvcGU6OlRlbXBsYXRlUGFyYW1TY29wZSkpICYmCiAgICAgICAgICAiU2NvcGUgc2hvdWxkbid0IGNvbnRhaW4gZGVjbHMhIik7CiAKLSAgZm9yIChTY29wZTo6ZGVjbF9pdGVyYXRvciBJID0gUy0+ZGVjbF9iZWdpbigpLCBFID0gUy0+ZGVjbF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIERlY2wgKlRtcEQgPSAoKkkpOworICBmb3IgKGF1dG8gKlRtcEQgOiBTLT5kZWNscygpKSB7CiAgICAgYXNzZXJ0KFRtcEQgJiYgIlRoaXMgZGVjbCBkaWRuJ3QgZ2V0IHB1c2hlZD8/Iik7CiAKICAgICBhc3NlcnQoaXNhPE5hbWVkRGVjbD4oVG1wRCkgJiYgIkRlY2wgaXNuJ3QgTmFtZWREZWNsPyIpOwpAQCAtMTM5NSwxNiArMTM5NSw2IEBACiAgICAgLy8gUmVtb3ZlIHRoaXMgbmFtZSBmcm9tIG91ciBsZXhpY2FsIHNjb3BlLgogICAgIElkUmVzb2x2ZXIuUmVtb3ZlRGVjbChEKTsKICAgfQotICBEaWFnbm9zZVVudXNlZEJhY2tpbmdJdmFySW5BY2Nlc3NvcihTKTsKLX0KLQotdm9pZCBTZW1hOjpBY3RPblN0YXJ0RnVuY3Rpb25EZWNsYXJhdG9yKCkgewotICArK0luRnVuY3Rpb25EZWNsYXJhdG9yOwotfQotCi12b2lkIFNlbWE6OkFjdE9uRW5kRnVuY3Rpb25EZWNsYXJhdG9yKCkgewotICBhc3NlcnQoSW5GdW5jdGlvbkRlY2xhcmF0b3IpOwotICAtLUluRnVuY3Rpb25EZWNsYXJhdG9yOwogfQogCiAvLy8gXGJyaWVmIExvb2sgZm9yIGFuIE9iamVjdGl2ZS1DIGNsYXNzIGluIHRoZSB0cmFuc2xhdGlvbiB1bml0LgpAQCAtMTU0OSw2ICsxNTM5LDcgQEAKICAgICBMaW5rYWdlU3BlY0RlY2wgKkNMaW5rYWdlRGVjbCA9CiAgICAgICAgIExpbmthZ2VTcGVjRGVjbDo6Q3JlYXRlKENvbnRleHQsIFBhcmVudCwgTG9jLCBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmthZ2VTcGVjRGVjbDo6bGFuZ19jLCBmYWxzZSk7CisgICAgQ0xpbmthZ2VEZWNsLT5zZXRJbXBsaWNpdCgpOwogICAgIFBhcmVudC0+YWRkRGVjbChDTGlua2FnZURlY2wpOwogICAgIFBhcmVudCA9IENMaW5rYWdlRGVjbDsKICAgfQpAQCAtMTU2NSwxMiArMTU1NiwxMCBAQAogICAvLyBGdW5jdGlvbkRlY2wuCiAgIGlmIChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlQgPSBkeW5fY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oUikpIHsKICAgICBTbWFsbFZlY3RvcjxQYXJtVmFyRGVjbCosIDE2PiBQYXJhbXM7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZULT5nZXROdW1BcmdzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEZULT5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyArK2kpIHsKICAgICAgIFBhcm1WYXJEZWNsICpwYXJtID0KLSAgICAgICAgUGFybVZhckRlY2w6OkNyZWF0ZShDb250ZXh0LCBOZXcsIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVC0+Z2V0QXJnVHlwZShpKSwgLypUSW5mbz0qLzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NfTm9uZSwgMCk7CisgICAgICAgICAgUGFybVZhckRlY2w6OkNyZWF0ZShDb250ZXh0LCBOZXcsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGVC0+Z2V0UGFyYW1UeXBlKGkpLCAvKlRJbmZvPSovMCwgU0NfTm9uZSwgMCk7CiAgICAgICBwYXJtLT5zZXRTY29wZUluZm8oMCwgaSk7CiAgICAgICBQYXJhbXMucHVzaF9iYWNrKHBhcm0pOwogICAgIH0KQEAgLTE3OTcsNDYgKzE3ODYsMTkgQEAKIAogLy8vIERlY2xoYXNBdHRyIC0gcmV0dXJucyB0cnVlIGlmIGRlY2wgRGVjbGFyYXRpb24gYWxyZWFkeSBoYXMgdGhlIHRhcmdldAogLy8vIGF0dHJpYnV0ZS4KLXN0YXRpYyBib29sCi1EZWNsSGFzQXR0cihjb25zdCBEZWNsICpELCBjb25zdCBBdHRyICpBKSB7Ci0gIC8vIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBBdmFpbGFiaWxpdHlBdHRyIGluIGEgRGVjbC4gTWFrZSBzdXJlIHdlIGNvcHkKLSAgLy8gYWxsIG9mIHRoZW0uIEl0IGlzIG1lcmdlQXZhaWxhYmlsaXR5QXR0ciBpbiBTZW1hRGVjbEF0dHIuY3BwIHRoYXQgaXMKLSAgLy8gcmVzcG9uc2libGUgZm9yIG1ha2luZyBzdXJlIHRoZXkgYXJlIGNvbnNpc3RlbnQuCi0gIGNvbnN0IEF2YWlsYWJpbGl0eUF0dHIgKkFBID0gZHluX2Nhc3Q8QXZhaWxhYmlsaXR5QXR0cj4oQSk7Ci0gIGlmIChBQSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyB0aHJlYWQgc2FmZXR5IGF0dHJpYnV0ZXMgY2FuIGFsc28gYmUgZHVwbGljYXRlZC4KLSAgc3dpdGNoIChBLT5nZXRLaW5kKCkpIHsKLSAgICBjYXNlIGF0dHI6OkV4Y2x1c2l2ZUxvY2tzUmVxdWlyZWQ6Ci0gICAgY2FzZSBhdHRyOjpTaGFyZWRMb2Nrc1JlcXVpcmVkOgotICAgIGNhc2UgYXR0cjo6TG9ja3NFeGNsdWRlZDoKLSAgICBjYXNlIGF0dHI6OkV4Y2x1c2l2ZUxvY2tGdW5jdGlvbjoKLSAgICBjYXNlIGF0dHI6OlNoYXJlZExvY2tGdW5jdGlvbjoKLSAgICBjYXNlIGF0dHI6OlVubG9ja0Z1bmN0aW9uOgotICAgIGNhc2UgYXR0cjo6RXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uOgotICAgIGNhc2UgYXR0cjo6U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uOgotICAgIGNhc2UgYXR0cjo6R3VhcmRlZEJ5OgotICAgIGNhc2UgYXR0cjo6UHRHdWFyZGVkQnk6Ci0gICAgY2FzZSBhdHRyOjpBY3F1aXJlZEJlZm9yZToKLSAgICBjYXNlIGF0dHI6OkFjcXVpcmVkQWZ0ZXI6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZGVmYXVsdDoKLSAgICAgIDsKLSAgfQotCitzdGF0aWMgYm9vbCBEZWNsSGFzQXR0cihjb25zdCBEZWNsICpELCBjb25zdCBBdHRyICpBKSB7CiAgIGNvbnN0IE93bmVyc2hpcEF0dHIgKk9BID0gZHluX2Nhc3Q8T3duZXJzaGlwQXR0cj4oQSk7CiAgIGNvbnN0IEFubm90YXRlQXR0ciAqQW5uID0gZHluX2Nhc3Q8QW5ub3RhdGVBdHRyPihBKTsKLSAgZm9yIChEZWNsOjphdHRyX2l0ZXJhdG9yIGkgPSBELT5hdHRyX2JlZ2luKCksIGUgPSBELT5hdHRyX2VuZCgpOyBpICE9IGU7ICsraSkKLSAgICBpZiAoKCppKS0+Z2V0S2luZCgpID09IEEtPmdldEtpbmQoKSkgeworICBmb3IgKGNvbnN0IGF1dG8gKmkgOiBELT5hdHRycygpKQorICAgIGlmIChpLT5nZXRLaW5kKCkgPT0gQS0+Z2V0S2luZCgpKSB7CiAgICAgICBpZiAoQW5uKSB7Ci0gICAgICAgIGlmIChBbm4tPmdldEFubm90YXRpb24oKSA9PSBjYXN0PEFubm90YXRlQXR0cj4oKmkpLT5nZXRBbm5vdGF0aW9uKCkpCisgICAgICAgIGlmIChBbm4tPmdldEFubm90YXRpb24oKSA9PSBjYXN0PEFubm90YXRlQXR0cj4oaSktPmdldEFubm90YXRpb24oKSkKICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAgICAgICAvLyBGSVhNRTogRG9uJ3QgaGFyZGNvZGUgdGhpcyBjaGVjawotICAgICAgaWYgKE9BICYmIGlzYTxPd25lcnNoaXBBdHRyPigqaSkpCi0gICAgICAgIHJldHVybiBPQS0+Z2V0T3duS2luZCgpID09IGNhc3Q8T3duZXJzaGlwQXR0cj4oKmkpLT5nZXRPd25LaW5kKCk7CisgICAgICBpZiAoT0EgJiYgaXNhPE93bmVyc2hpcEF0dHI+KGkpKQorICAgICAgICByZXR1cm4gT0EtPmdldE93bktpbmQoKSA9PSBjYXN0PE93bmVyc2hpcEF0dHI+KGkpLT5nZXRPd25LaW5kKCk7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTE4NjEsOSArMTgyMyw3IEBACiAgIEFsaWduZWRBdHRyICpPbGRBbGlnbmFzQXR0ciA9IDA7CiAgIEFsaWduZWRBdHRyICpPbGRTdHJpY3Rlc3RBbGlnbkF0dHIgPSAwOwogICB1bnNpZ25lZCBPbGRBbGlnbiA9IDA7Ci0gIGZvciAoc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxBbGlnbmVkQXR0cj4KLSAgICAgICAgIEkgPSBPbGQtPnNwZWNpZmljX2F0dHJfYmVnaW48QWxpZ25lZEF0dHI+KCksCi0gICAgICAgICBFID0gT2xkLT5zcGVjaWZpY19hdHRyX2VuZDxBbGlnbmVkQXR0cj4oKTsgSSAhPSBFOyArK0kpIHsKKyAgZm9yIChhdXRvICpJIDogT2xkLT5zcGVjaWZpY19hdHRyczxBbGlnbmVkQXR0cj4oKSkgewogICAgIC8vIEZJWE1FOiBXZSBoYXZlIG5vIHdheSBvZiByZXByZXNlbnRpbmcgaW5oZXJpdGVkIGRlcGVuZGVudCBhbGlnbm1lbnRzCiAgICAgLy8gaW4gYSBjYXNlIGxpa2U6CiAgICAgLy8gICB0ZW1wbGF0ZTxpbnQgQSwgaW50IEI+IHN0cnVjdCBhbGlnbmFzKEEpIFg7CkBAIC0xODc0LDI2ICsxODM0LDI0IEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAoSS0+aXNBbGlnbmFzKCkpCi0gICAgICBPbGRBbGlnbmFzQXR0ciA9ICpJOworICAgICAgT2xkQWxpZ25hc0F0dHIgPSBJOwogCiAgICAgdW5zaWduZWQgQWxpZ24gPSBJLT5nZXRBbGlnbm1lbnQoUy5Db250ZXh0KTsKICAgICBpZiAoQWxpZ24gPiBPbGRBbGlnbikgewogICAgICAgT2xkQWxpZ24gPSBBbGlnbjsKLSAgICAgIE9sZFN0cmljdGVzdEFsaWduQXR0ciA9ICpJOworICAgICAgT2xkU3RyaWN0ZXN0QWxpZ25BdHRyID0gSTsKICAgICB9CiAgIH0KIAogICAvLyBMb29rIGZvciBhbGlnbmFzIGF0dHJpYnV0ZXMgb24gTmV3LgogICBBbGlnbmVkQXR0ciAqTmV3QWxpZ25hc0F0dHIgPSAwOwogICB1bnNpZ25lZCBOZXdBbGlnbiA9IDA7Ci0gIGZvciAoc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxBbGlnbmVkQXR0cj4KLSAgICAgICAgIEkgPSBOZXctPnNwZWNpZmljX2F0dHJfYmVnaW48QWxpZ25lZEF0dHI+KCksCi0gICAgICAgICBFID0gTmV3LT5zcGVjaWZpY19hdHRyX2VuZDxBbGlnbmVkQXR0cj4oKTsgSSAhPSBFOyArK0kpIHsKKyAgZm9yIChhdXRvICpJIDogTmV3LT5zcGVjaWZpY19hdHRyczxBbGlnbmVkQXR0cj4oKSkgewogICAgIGlmIChJLT5pc0FsaWdubWVudERlcGVuZGVudCgpKQogICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKEktPmlzQWxpZ25hcygpKQotICAgICAgTmV3QWxpZ25hc0F0dHIgPSAqSTsKKyAgICAgIE5ld0FsaWduYXNBdHRyID0gSTsKIAogICAgIHVuc2lnbmVkIEFsaWduID0gSS0+Z2V0QWxpZ25tZW50KFMuQ29udGV4dCk7CiAgICAgaWYgKEFsaWduID4gTmV3QWxpZ24pCkBAIC0xOTM5LDkgKzE4OTcsOSBAQAogICAgIC8vICAgc3BlY2lmaWVyLCBhbnkgb3RoZXIgZGVjbGFyYXRpb24gb2YgdGhhdCBvYmplY3Qgc2hhbGwgYWxzbwogICAgIC8vICAgaGF2ZSBubyBhbGlnbm1lbnQgc3BlY2lmaWVyLgogICAgIFMuRGlhZyhOZXctPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9hbGlnbmFzX21pc3Npbmdfb25fZGVmaW5pdGlvbikKLSAgICAgIDw8IE9sZEFsaWduYXNBdHRyLT5pc0MxMSgpOworICAgICAgPDwgT2xkQWxpZ25hc0F0dHI7CiAgICAgUy5EaWFnKE9sZEFsaWduYXNBdHRyLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX2FsaWduYXNfb25fZGVjbGFyYXRpb24pCi0gICAgICA8PCBPbGRBbGlnbmFzQXR0ci0+aXNDMTEoKTsKKyAgICAgIDw8IE9sZEFsaWduYXNBdHRyOwogICB9CiAKICAgYm9vbCBBbnlBZGRlZCA9IGZhbHNlOwpAQCAtMTk5NSwxMSArMTk1MywxNSBAQAogICBlbHNlIGlmIChTZWN0aW9uQXR0ciAqU0EgPSBkeW5fY2FzdDxTZWN0aW9uQXR0cj4oQXR0cikpCiAgICAgTmV3QXR0ciA9IFMubWVyZ2VTZWN0aW9uQXR0cihELCBTQS0+Z2V0UmFuZ2UoKSwgU0EtPmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJTcGVsbGluZ0xpc3RJbmRleCk7CisgIGVsc2UgaWYgKE1TSW5oZXJpdGFuY2VBdHRyICpJQSA9IGR5bl9jYXN0PE1TSW5oZXJpdGFuY2VBdHRyPihBdHRyKSkKKyAgICBOZXdBdHRyID0gUy5tZXJnZU1TSW5oZXJpdGFuY2VBdHRyKEQsIElBLT5nZXRSYW5nZSgpLCBJQS0+Z2V0QmVzdENhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJTcGVsbGluZ0xpc3RJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBLT5nZXRTZW1hbnRpY1NwZWxsaW5nKCkpOwogICBlbHNlIGlmIChpc2E8QWxpZ25lZEF0dHI+KEF0dHIpKQogICAgIC8vIEFsaWduZWRBdHRycyBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5LCBiZWNhdXNlIHdlIG5lZWQgdG8gaGFuZGxlIGFsbAogICAgIC8vIHN1Y2ggYXR0cmlidXRlcyBvbiBhIGRlY2xhcmF0aW9uIGF0IHRoZSBzYW1lIHRpbWUuCiAgICAgTmV3QXR0ciA9IDA7Ci0gIGVsc2UgaWYgKCFEZWNsSGFzQXR0cihELCBBdHRyKSkKKyAgZWxzZSBpZiAoQXR0ci0+ZHVwbGljYXRlc0FsbG93ZWQoKSB8fCAhRGVjbEhhc0F0dHIoRCwgQXR0cikpCiAgICAgTmV3QXR0ciA9IGNhc3Q8SW5oZXJpdGFibGVBdHRyPihBdHRyLT5jbG9uZShTLkNvbnRleHQpKTsKIAogICBpZiAoTmV3QXR0cikgewpAQCAtMjAyOSwxMiArMTk5MSw5IEBACiB9CiAKIHN0YXRpYyBib29sIGhhc0F0dHJpYnV0ZShjb25zdCBEZWNsICpELCBhdHRyOjpLaW5kIEtpbmQpIHsKLSAgZm9yIChEZWNsOjphdHRyX2l0ZXJhdG9yIEkgPSBELT5hdHRyX2JlZ2luKCksIEUgPSBELT5hdHRyX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgQXR0ciAqQXR0cmlidXRlID0gKkk7CisgIGZvciAoY29uc3QgYXV0byAqQXR0cmlidXRlIDogRC0+YXR0cnMoKSkKICAgICBpZiAoQXR0cmlidXRlLT5nZXRLaW5kKCkgPT0gS2luZCkKICAgICAgIHJldHVybiB0cnVlOwotICB9CiAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtMjA5Nyw5ICsyMDU2LDkgQEAKICAgICAgICAgLy8gICBzcGVjaWZpZXIsIGFueSBvdGhlciBkZWNsYXJhdGlvbiBvZiB0aGF0IG9iamVjdCBzaGFsbCBhbHNvCiAgICAgICAgIC8vICAgaGF2ZSBubyBhbGlnbm1lbnQgc3BlY2lmaWVyLgogICAgICAgICBTLkRpYWcoRGVmLT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfYWxpZ25hc19taXNzaW5nX29uX2RlZmluaXRpb24pCi0gICAgICAgICAgPDwgQUEtPmlzQzExKCk7CisgICAgICAgICAgPDwgQUE7CiAgICAgICAgIFMuRGlhZyhOZXdBdHRyaWJ1dGUtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfYWxpZ25hc19vbl9kZWNsYXJhdGlvbikKLSAgICAgICAgICA8PCBBQS0+aXNDMTEoKTsKKyAgICAgICAgICA8PCBBQTsKICAgICAgICAgTmV3QXR0cmlidXRlcy5lcmFzZShOZXdBdHRyaWJ1dGVzLmJlZ2luKCkgKyBJKTsKICAgICAgICAgLS1FOwogICAgICAgICBjb250aW51ZTsKQEAgLTIxMzgsMTUgKzIwOTcsMTIgQEAKICAgLy8gd2UgcHJvY2VzcyB0aGVtLgogICBpZiAoIWZvdW5kQW55KSBOZXctPnNldEF0dHJzKEF0dHJWZWMoKSk7CiAKLSAgZm9yIChzcGVjaWZpY19hdHRyX2l0ZXJhdG9yPEluaGVyaXRhYmxlQXR0cj4KLSAgICAgICAgIGkgPSBPbGQtPnNwZWNpZmljX2F0dHJfYmVnaW48SW5oZXJpdGFibGVBdHRyPigpLAotICAgICAgICAgZSA9IE9sZC0+c3BlY2lmaWNfYXR0cl9lbmQ8SW5oZXJpdGFibGVBdHRyPigpOyAKLSAgICAgICBpICE9IGU7ICsraSkgeworICBmb3IgKGF1dG8gKkkgOiBPbGQtPnNwZWNpZmljX2F0dHJzPEluaGVyaXRhYmxlQXR0cj4oKSkgewogICAgIGJvb2wgT3ZlcnJpZGUgPSBmYWxzZTsKICAgICAvLyBJZ25vcmUgZGVwcmVjYXRlZC91bmF2YWlsYWJsZS9hdmFpbGFiaWxpdHkgYXR0cmlidXRlcyBpZiByZXF1ZXN0ZWQuCi0gICAgaWYgKGlzYTxEZXByZWNhdGVkQXR0cj4oKmkpIHx8Ci0gICAgICAgIGlzYTxVbmF2YWlsYWJsZUF0dHI+KCppKSB8fAotICAgICAgICBpc2E8QXZhaWxhYmlsaXR5QXR0cj4oKmkpKSB7CisgICAgaWYgKGlzYTxEZXByZWNhdGVkQXR0cj4oSSkgfHwKKyAgICAgICAgaXNhPFVuYXZhaWxhYmxlQXR0cj4oSSkgfHwKKyAgICAgICAgaXNhPEF2YWlsYWJpbGl0eUF0dHI+KEkpKSB7CiAgICAgICBzd2l0Y2ggKEFNSykgewogICAgICAgY2FzZSBBTUtfTm9uZToKICAgICAgICAgY29udGludWU7CkBAIC0yMTYxLDEwICsyMTE3LDEwIEBACiAgICAgfQogCiAgICAgLy8gQWxyZWFkeSBoYW5kbGVkLgotICAgIGlmIChpc2E8VXNlZEF0dHI+KCppKSkKKyAgICBpZiAoaXNhPFVzZWRBdHRyPihJKSkKICAgICAgIGNvbnRpbnVlOwogCi0gICAgaWYgKG1lcmdlRGVjbEF0dHJpYnV0ZSgqdGhpcywgTmV3LCAqaSwgT3ZlcnJpZGUpKQorICAgIGlmIChtZXJnZURlY2xBdHRyaWJ1dGUoKnRoaXMsIE5ldywgSSwgT3ZlcnJpZGUpKQogICAgICAgZm91bmRBbnkgPSB0cnVlOwogICB9CiAKQEAgLTIxODMsOSArMjEzOSw5IEBACiAgIC8vICAgVGhlIGZpcnN0IGRlY2xhcmF0aW9uIG9mIGEgZnVuY3Rpb24gc2hhbGwgc3BlY2lmeSB0aGUKICAgLy8gICBjYXJyaWVzX2RlcGVuZGVuY3kgYXR0cmlidXRlIGZvciBpdHMgZGVjbGFyYXRvci1pZCBpZiBhbnkgZGVjbGFyYXRpb24KICAgLy8gICBvZiB0aGUgZnVuY3Rpb24gc3BlY2lmaWVzIHRoZSBjYXJyaWVzX2RlcGVuZGVuY3kgYXR0cmlidXRlLgotICBpZiAobmV3RGVjbC0+aGFzQXR0cjxDYXJyaWVzRGVwZW5kZW5jeUF0dHI+KCkgJiYKLSAgICAgICFvbGREZWNsLT5oYXNBdHRyPENhcnJpZXNEZXBlbmRlbmN5QXR0cj4oKSkgewotICAgIFMuRGlhZyhuZXdEZWNsLT5nZXRBdHRyPENhcnJpZXNEZXBlbmRlbmN5QXR0cj4oKS0+Z2V0TG9jYXRpb24oKSwKKyAgY29uc3QgQ2Fycmllc0RlcGVuZGVuY3lBdHRyICpDREEgPSBuZXdEZWNsLT5nZXRBdHRyPENhcnJpZXNEZXBlbmRlbmN5QXR0cj4oKTsKKyAgaWYgKENEQSAmJiAhb2xkRGVjbC0+aGFzQXR0cjxDYXJyaWVzRGVwZW5kZW5jeUF0dHI+KCkpIHsKKyAgICBTLkRpYWcoQ0RBLT5nZXRMb2NhdGlvbigpLAogICAgICAgICAgICBkaWFnOjplcnJfY2Fycmllc19kZXBlbmRlbmN5X21pc3Npbmdfb25fZmlyc3RfZGVjbCkgPDwgMS8qUGFyYW0qLzsKICAgICAvLyBGaW5kIHRoZSBmaXJzdCBkZWNsYXJhdGlvbiBvZiB0aGUgcGFyYW1ldGVyLgogICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgYnVpbGQgcmVkZWNsYXJhdGlvbiBjaGFpbnMgZm9yIGZ1bmN0aW9uIHBhcmFtZXRlcnM/CkBAIC0yMjA2LDEyICsyMTYyLDEwIEBACiAgIC8vIGRvbmUgYmVmb3JlIHdlIHByb2Nlc3MgdGhlbS4KICAgaWYgKCFmb3VuZEFueSkgbmV3RGVjbC0+c2V0QXR0cnMoQXR0clZlYygpKTsKIAotICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8SW5oZXJpdGFibGVQYXJhbUF0dHI+Ci0gICAgICAgaSA9IG9sZERlY2wtPnNwZWNpZmljX2F0dHJfYmVnaW48SW5oZXJpdGFibGVQYXJhbUF0dHI+KCksCi0gICAgICAgZSA9IG9sZERlY2wtPnNwZWNpZmljX2F0dHJfZW5kPEluaGVyaXRhYmxlUGFyYW1BdHRyPigpOyBpICE9IGU7ICsraSkgewotICAgIGlmICghRGVjbEhhc0F0dHIobmV3RGVjbCwgKmkpKSB7CisgIGZvciAoY29uc3QgYXV0byAqSSA6IG9sZERlY2wtPnNwZWNpZmljX2F0dHJzPEluaGVyaXRhYmxlUGFyYW1BdHRyPigpKSB7CisgICAgaWYgKCFEZWNsSGFzQXR0cihuZXdEZWNsLCBJKSkgewogICAgICAgSW5oZXJpdGFibGVBdHRyICpuZXdBdHRyID0KLSAgICAgICAgY2FzdDxJbmhlcml0YWJsZVBhcmFtQXR0cj4oKCppKS0+Y2xvbmUoUy5Db250ZXh0KSk7CisgICAgICAgIGNhc3Q8SW5oZXJpdGFibGVQYXJhbUF0dHI+KEktPmNsb25lKFMuQ29udGV4dCkpOwogICAgICAgbmV3QXR0ci0+c2V0SW5oZXJpdGVkKHRydWUpOwogICAgICAgbmV3RGVjbC0+YWRkQXR0cihuZXdBdHRyKTsKICAgICAgIGZvdW5kQW55ID0gdHJ1ZTsKQEAgLTIyOTgsMTUgKzIyNTIsMTAgQEAKIC8vLyBtZXJnZWQgd2l0aC4KIC8vLwogLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IsIGZhbHNlIG90aGVyd2lzZS4KLWJvb2wgU2VtYTo6TWVyZ2VGdW5jdGlvbkRlY2woRnVuY3Rpb25EZWNsICpOZXcsIERlY2wgKk9sZEQsIFNjb3BlICpTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1lcmdlVHlwZVdpdGhPbGQpIHsKK2Jvb2wgU2VtYTo6TWVyZ2VGdW5jdGlvbkRlY2woRnVuY3Rpb25EZWNsICpOZXcsIE5hbWVkRGVjbCAqJk9sZEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjb3BlICpTLCBib29sIE1lcmdlVHlwZVdpdGhPbGQpIHsKICAgLy8gVmVyaWZ5IHRoZSBvbGQgZGVjbCB3YXMgYWxzbyBhIGZ1bmN0aW9uLgotICBGdW5jdGlvbkRlY2wgKk9sZCA9IDA7Ci0gIGlmIChGdW5jdGlvblRlbXBsYXRlRGVjbCAqT2xkRnVuY3Rpb25UZW1wbGF0ZQotICAgICAgICA9IGR5bl9jYXN0PEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihPbGREKSkKLSAgICBPbGQgPSBPbGRGdW5jdGlvblRlbXBsYXRlLT5nZXRUZW1wbGF0ZWREZWNsKCk7Ci0gIGVsc2UKLSAgICBPbGQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KE9sZEQpOworICBGdW5jdGlvbkRlY2wgKk9sZCA9IE9sZEQtPmdldEFzRnVuY3Rpb24oKTsKICAgaWYgKCFPbGQpIHsKICAgICBpZiAoVXNpbmdTaGFkb3dEZWNsICpTaGFkb3cgPSBkeW5fY2FzdDxVc2luZ1NoYWRvd0RlY2w+KE9sZEQpKSB7CiAgICAgICBpZiAoTmV3LT5nZXRGcmllbmRPYmplY3RLaW5kKCkpIHsKQEAgLTIzMTgsMTggKzIyNjcsMzQgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAKLSAgICAgIERpYWcoTmV3LT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfdXNpbmdfZGVjbF9jb25mbGljdF9yZXZlcnNlKTsKLSAgICAgIERpYWcoU2hhZG93LT5nZXRUYXJnZXREZWNsKCktPmdldExvY2F0aW9uKCksCi0gICAgICAgICAgIGRpYWc6Om5vdGVfdXNpbmdfZGVjbF90YXJnZXQpOwotICAgICAgRGlhZyhTaGFkb3ctPmdldFVzaW5nRGVjbCgpLT5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICBkaWFnOjpub3RlX3VzaW5nX2RlY2wpIDw8IDA7CisgICAgICAvLyBDKysxMSBbbmFtZXNwYWNlLnVkZWNsXXAxNDoKKyAgICAgIC8vICAgSWYgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbiBuYW1lc3BhY2Ugc2NvcGUgb3IgYmxvY2sgc2NvcGUgaGFzIHRoZQorICAgICAgLy8gICBzYW1lIG5hbWUgYW5kIHRoZSBzYW1lIHBhcmFtZXRlci10eXBlLWxpc3QgYXMgYSBmdW5jdGlvbiBpbnRyb2R1Y2VkCisgICAgICAvLyAgIGJ5IGEgdXNpbmctZGVjbGFyYXRpb24sIGFuZCB0aGUgZGVjbGFyYXRpb25zIGRvIG5vdCBkZWNsYXJlIHRoZSBzYW1lCisgICAgICAvLyAgIGZ1bmN0aW9uLCB0aGUgcHJvZ3JhbSBpcyBpbGwtZm9ybWVkLgorCisgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSB0d28gZGVjbGFyYXRpb25zIG1pZ2h0IGRlY2xhcmUgdGhlIHNhbWUgZnVuY3Rpb24uCisgICAgICBPbGQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KFNoYWRvdy0+Z2V0VGFyZ2V0RGVjbCgpKTsKKyAgICAgIGlmIChPbGQgJiYKKyAgICAgICAgICAhT2xkLT5nZXREZWNsQ29udGV4dCgpLT5nZXRSZWRlY2xDb250ZXh0KCktPkVxdWFscygKKyAgICAgICAgICAgICAgTmV3LT5nZXREZWNsQ29udGV4dCgpLT5nZXRSZWRlY2xDb250ZXh0KCkpICYmCisgICAgICAgICAgIShPbGQtPmlzRXh0ZXJuQygpICYmIE5ldy0+aXNFeHRlcm5DKCkpKQorICAgICAgICBPbGQgPSAwOworCisgICAgICBpZiAoIU9sZCkgeworICAgICAgICBEaWFnKE5ldy0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX3VzaW5nX2RlY2xfY29uZmxpY3RfcmV2ZXJzZSk7CisgICAgICAgIERpYWcoU2hhZG93LT5nZXRUYXJnZXREZWNsKCktPmdldExvY2F0aW9uKCksCisgICAgICAgICAgICAgZGlhZzo6bm90ZV91c2luZ19kZWNsX3RhcmdldCk7CisgICAgICAgIERpYWcoU2hhZG93LT5nZXRVc2luZ0RlY2woKS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV91c2luZ19kZWNsKSA8PCAwOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIE9sZEQgPSBPbGQ7CisgICAgfSBlbHNlIHsKKyAgICAgIERpYWcoTmV3LT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfcmVkZWZpbml0aW9uX2RpZmZlcmVudF9raW5kKQorICAgICAgICA8PCBOZXctPmdldERlY2xOYW1lKCk7CisgICAgICBEaWFnKE9sZEQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJldmlvdXNfZGVmaW5pdGlvbik7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0KLSAgICBEaWFnKE5ldy0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX3JlZGVmaW5pdGlvbl9kaWZmZXJlbnRfa2luZCkKLSAgICAgIDw8IE5ldy0+Z2V0RGVjbE5hbWUoKTsKLSAgICBEaWFnKE9sZEQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJldmlvdXNfZGVmaW5pdGlvbik7Ci0gICAgcmV0dXJuIHRydWU7CiAgIH0KIAogICAvLyBJZiB0aGUgb2xkIGRlY2xhcmF0aW9uIGlzIGludmFsaWQsIGp1c3QgZ2l2ZSB1cCBoZXJlLgpAQCAtMjMzOSwxMSArMjMwNCwxNCBAQAogICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24gd2FzIGEgZGVmaW5pdGlvbiwKICAgLy8gaW1wbGljaXQgZGVjbGFyYXRpb24sIG9yIGEgZGVjbGFyYXRpb24uCiAgIGRpYWc6OmtpbmQgUHJldkRpYWc7CisgIFNvdXJjZUxvY2F0aW9uIE9sZExvY2F0aW9uID0gT2xkLT5nZXRMb2NhdGlvbigpOwogICBpZiAoT2xkLT5pc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCkpCiAgICAgUHJldkRpYWcgPSBkaWFnOjpub3RlX3ByZXZpb3VzX2RlZmluaXRpb247Ci0gIGVsc2UgaWYgKE9sZC0+aXNJbXBsaWNpdCgpKQorICBlbHNlIGlmIChPbGQtPmlzSW1wbGljaXQoKSkgewogICAgIFByZXZEaWFnID0gZGlhZzo6bm90ZV9wcmV2aW91c19pbXBsaWNpdF9kZWNsYXJhdGlvbjsKLSAgZWxzZQorICAgIGlmIChPbGRMb2NhdGlvbi5pc0ludmFsaWQoKSkKKyAgICAgIE9sZExvY2F0aW9uID0gTmV3LT5nZXRMb2NhdGlvbigpOworICB9IGVsc2UKICAgICBQcmV2RGlhZyA9IGRpYWc6Om5vdGVfcHJldmlvdXNfZGVjbGFyYXRpb247CiAKICAgLy8gRG9uJ3QgY29tcGxhaW4gYWJvdXQgdGhpcyBpZiB3ZSdyZSBpbiBHTlU4OSBtb2RlIGFuZCB0aGUgb2xkIGZ1bmN0aW9uCkBAIC0yMzU3LDEwICsyMzI1LDEwIEBACiAgICAgICAhY2FuUmVkZWZpbmVGdW5jdGlvbihPbGQsIGdldExhbmdPcHRzKCkpKSB7CiAgICAgaWYgKGdldExhbmdPcHRzKCkuTWljcm9zb2Z0RXh0KSB7CiAgICAgICBEaWFnKE5ldy0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6d2Fybl9zdGF0aWNfbm9uX3N0YXRpYykgPDwgTmV3OwotICAgICAgRGlhZyhPbGQtPmdldExvY2F0aW9uKCksIFByZXZEaWFnKTsKKyAgICAgIERpYWcoT2xkTG9jYXRpb24sIFByZXZEaWFnKTsKICAgICB9IGVsc2UgewogICAgICAgRGlhZyhOZXctPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9zdGF0aWNfbm9uX3N0YXRpYykgPDwgTmV3OwotICAgICAgRGlhZyhPbGQtPmdldExvY2F0aW9uKCksIFByZXZEaWFnKTsKKyAgICAgIERpYWcoT2xkTG9jYXRpb24sIFByZXZEaWFnKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgfQpAQCAtMjQyNiw3ICsyMzk0LDcgQEAKICAgICAgIERpYWcoTmV3LT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfcmVncGFybV9taXNtYXRjaCkKICAgICAgICAgPDwgTmV3VHlwZS0+Z2V0UmVnUGFybVR5cGUoKQogICAgICAgICA8PCBPbGRUeXBlLT5nZXRSZWdQYXJtVHlwZSgpOwotICAgICAgRGlhZyhPbGQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJldmlvdXNfZGVjbGFyYXRpb24pOyAgICAgIAorICAgICAgRGlhZyhPbGRMb2NhdGlvbiwgZGlhZzo6bm90ZV9wcmV2aW91c19kZWNsYXJhdGlvbik7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTI0MzgsNyArMjQwNiw3IEBACiAgIGlmIChPbGRUeXBlSW5mby5nZXRQcm9kdWNlc1Jlc3VsdCgpICE9IE5ld1R5cGVJbmZvLmdldFByb2R1Y2VzUmVzdWx0KCkpIHsKICAgICBpZiAoTmV3VHlwZUluZm8uZ2V0UHJvZHVjZXNSZXN1bHQoKSkgewogICAgICAgRGlhZyhOZXctPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9yZXR1cm5zX3JldGFpbmVkX21pc21hdGNoKTsKLSAgICAgIERpYWcoT2xkLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3ByZXZpb3VzX2RlY2xhcmF0aW9uKTsgICAgICAKKyAgICAgIERpYWcoT2xkTG9jYXRpb24sIGRpYWc6Om5vdGVfcHJldmlvdXNfZGVjbGFyYXRpb24pOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIApAQCAtMjQ4MiwxMiArMjQ1MCwxNCBAQAogICAgIC8vICAgUmVkZWNsYXJhdGlvbnMgb3Igc3BlY2lhbGl6YXRpb25zIG9mIGEgZnVuY3Rpb24gb3IgZnVuY3Rpb24gdGVtcGxhdGUKICAgICAvLyAgIHdpdGggYSBkZWNsYXJlZCByZXR1cm4gdHlwZSB0aGF0IHVzZXMgYSBwbGFjZWhvbGRlciB0eXBlIHNoYWxsIGFsc28KICAgICAvLyAgIHVzZSB0aGF0IHBsYWNlaG9sZGVyLCBub3QgYSBkZWR1Y2VkIHR5cGUuCi0gICAgUXVhbFR5cGUgT2xkRGVjbGFyZWRSZXR1cm5UeXBlID0gKE9sZC0+Z2V0VHlwZVNvdXJjZUluZm8oKQotICAgICAgPyBPbGQtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uVHlwZT4oKQotICAgICAgOiBPbGRUeXBlKS0+Z2V0UmVzdWx0VHlwZSgpOwotICAgIFF1YWxUeXBlIE5ld0RlY2xhcmVkUmV0dXJuVHlwZSA9IChOZXctPmdldFR5cGVTb3VyY2VJbmZvKCkKLSAgICAgID8gTmV3LT5nZXRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlKCktPmNhc3RBczxGdW5jdGlvblR5cGU+KCkKLSAgICAgIDogTmV3VHlwZSktPmdldFJlc3VsdFR5cGUoKTsKKyAgICBRdWFsVHlwZSBPbGREZWNsYXJlZFJldHVyblR5cGUgPQorICAgICAgICAoT2xkLT5nZXRUeXBlU291cmNlSW5mbygpCisgICAgICAgICAgICAgPyBPbGQtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uVHlwZT4oKQorICAgICAgICAgICAgIDogT2xkVHlwZSktPmdldFJldHVyblR5cGUoKTsKKyAgICBRdWFsVHlwZSBOZXdEZWNsYXJlZFJldHVyblR5cGUgPQorICAgICAgICAoTmV3LT5nZXRUeXBlU291cmNlSW5mbygpCisgICAgICAgICAgICAgPyBOZXctPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uVHlwZT4oKQorICAgICAgICAgICAgIDogTmV3VHlwZSktPmdldFJldHVyblR5cGUoKTsKICAgICBRdWFsVHlwZSBSZXNRVDsKICAgICBpZiAoIUNvbnRleHQuaGFzU2FtZVR5cGUoT2xkRGVjbGFyZWRSZXR1cm5UeXBlLCBOZXdEZWNsYXJlZFJldHVyblR5cGUpICYmCiAgICAgICAgICEoKE5ld1FUeXBlLT5pc0RlcGVuZGVudFR5cGUoKSB8fCBPbGRRVHlwZS0+aXNEZXBlbmRlbnRUeXBlKCkpICYmCkBAIC0yNTAxLDE5ICsyNDcxLDE5IEBACiAgICAgICAgICAgICAgICBkaWFnOjplcnJfbWVtYmVyX2RlZl9kb2VzX25vdF9tYXRjaF9yZXRfdHlwZSkgPDwgTmV3OwogICAgICAgICBlbHNlCiAgICAgICAgICAgRGlhZyhOZXctPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9vdmxfZGlmZl9yZXR1cm5fdHlwZSk7Ci0gICAgICAgIERpYWcoT2xkLT5nZXRMb2NhdGlvbigpLCBQcmV2RGlhZykgPDwgT2xkIDw8IE9sZC0+Z2V0VHlwZSgpOworICAgICAgICBEaWFnKE9sZExvY2F0aW9uLCBQcmV2RGlhZykgPDwgT2xkIDw8IE9sZC0+Z2V0VHlwZSgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgICAgTmV3UVR5cGUgPSBSZXNRVDsKICAgICB9CiAKLSAgICBRdWFsVHlwZSBPbGRSZXR1cm5UeXBlID0gT2xkVHlwZS0+Z2V0UmVzdWx0VHlwZSgpOwotICAgIFF1YWxUeXBlIE5ld1JldHVyblR5cGUgPSBjYXN0PEZ1bmN0aW9uVHlwZT4oTmV3UVR5cGUpLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgUXVhbFR5cGUgT2xkUmV0dXJuVHlwZSA9IE9sZFR5cGUtPmdldFJldHVyblR5cGUoKTsKKyAgICBRdWFsVHlwZSBOZXdSZXR1cm5UeXBlID0gY2FzdDxGdW5jdGlvblR5cGU+KE5ld1FUeXBlKS0+Z2V0UmV0dXJuVHlwZSgpOwogICAgIGlmIChPbGRSZXR1cm5UeXBlICE9IE5ld1JldHVyblR5cGUpIHsKICAgICAgIC8vIElmIHRoaXMgZnVuY3Rpb24gaGFzIGEgZGVkdWNlZCByZXR1cm4gdHlwZSBhbmQgaGFzIGFscmVhZHkgYmVlbgogICAgICAgLy8gZGVmaW5lZCwgY29weSB0aGUgZGVkdWNlZCB2YWx1ZSBmcm9tIHRoZSBvbGQgZGVjbGFyYXRpb24uCi0gICAgICBBdXRvVHlwZSAqT2xkQVQgPSBPbGQtPmdldFJlc3VsdFR5cGUoKS0+Z2V0Q29udGFpbmVkQXV0b1R5cGUoKTsKKyAgICAgIEF1dG9UeXBlICpPbGRBVCA9IE9sZC0+Z2V0UmV0dXJuVHlwZSgpLT5nZXRDb250YWluZWRBdXRvVHlwZSgpOwogICAgICAgaWYgKE9sZEFUICYmIE9sZEFULT5pc0RlZHVjZWQoKSkgewogICAgICAgICBOZXctPnNldFR5cGUoCiAgICAgICAgICAgICBTdWJzdEF1dG9UeXBlKE5ldy0+Z2V0VHlwZSgpLApAQCAtMjUzMyw4ICsyNTAzLDggQEAKICAgICAgIE5ld01ldGhvZC0+c2V0VHJpdmlhbChPbGRNZXRob2QtPmlzVHJpdmlhbCgpKTsKIAogICAgICAgLy8gTVNWQyBhbGxvd3MgZXhwbGljaXQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gYXQgY2xhc3Mgc2NvcGU6Ci0gICAgICAvLyAyIENYTWV0aG9kRGVjbHMgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIGZ1bmN0aW9uIHdpbGwgYmUgaW5qZWN0ZWQuCi0gICAgICAvLyBXZSBkb24ndCB3YW50IGEgcmVkZWNsYXJ0aW9uIGVycm9yLgorICAgICAgLy8gMiBDWFhNZXRob2REZWNscyByZWZlcnJpbmcgdG8gdGhlIHNhbWUgZnVuY3Rpb24gd2lsbCBiZSBpbmplY3RlZC4KKyAgICAgIC8vIFdlIGRvbid0IHdhbnQgYSByZWRlY2xhcmF0aW9uIGVycm9yLgogICAgICAgYm9vbCBJc0NsYXNzU2NvcGVFeHBsaWNpdFNwZWNpYWxpemF0aW9uID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9sZE1ldGhvZC0+aXNGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb24oKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3TWV0aG9kLT5pc0Z1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbigpOwpAQCAtMjU0Nyw3ICsyNTE3LDcgQEAKICAgICAgICAgLy8gICAgICAgaXMgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgogICAgICAgICBpZiAoT2xkTWV0aG9kLT5pc1N0YXRpYygpICE9IE5ld01ldGhvZC0+aXNTdGF0aWMoKSkgewogICAgICAgICAgIERpYWcoTmV3LT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfb3ZsX3N0YXRpY19ub25zdGF0aWNfbWVtYmVyKTsKLSAgICAgICAgICBEaWFnKE9sZC0+Z2V0TG9jYXRpb24oKSwgUHJldkRpYWcpIDw8IE9sZCA8PCBPbGQtPmdldFR5cGUoKTsKKyAgICAgICAgICBEaWFnKE9sZExvY2F0aW9uLCBQcmV2RGlhZykgPDwgT2xkIDw8IE9sZC0+Z2V0VHlwZSgpOwogICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKQEAgLTI1NzEsNyArMjU0MSw3IEBACiAgICAgICAgICAgRGlhZyhOZXctPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9tZW1iZXJfcmVkZWNsYXJlZF9pbl9pbnN0YW50aWF0aW9uKQogICAgICAgICAgICAgPDwgTmV3IDw8IE5ldy0+Z2V0VHlwZSgpOwogICAgICAgICB9Ci0gICAgICAgIERpYWcoT2xkLT5nZXRMb2NhdGlvbigpLCBQcmV2RGlhZykgPDwgT2xkIDw8IE9sZC0+Z2V0VHlwZSgpOworICAgICAgICBEaWFnKE9sZExvY2F0aW9uLCBQcmV2RGlhZykgPDwgT2xkIDw8IE9sZC0+Z2V0VHlwZSgpOwogCiAgICAgICAvLyBDb21wbGFpbiBpZiB0aGlzIGlzIGFuIGV4cGxpY2l0IGRlY2xhcmF0aW9uIG9mIGEgc3BlY2lhbAogICAgICAgLy8gbWVtYmVyIHRoYXQgd2FzIGluaXRpYWxseSBkZWNsYXJlZCBpbXBsaWNpdGx5LgpAQCAtMjU5OSwxMCArMjU2OSw5IEBACiAgICAgLy8gICBUaGUgZmlyc3QgZGVjbGFyYXRpb24gb2YgYSBmdW5jdGlvbiBzaGFsbCBzcGVjaWZ5IHRoZSBub3JldHVybgogICAgIC8vICAgYXR0cmlidXRlIGlmIGFueSBkZWNsYXJhdGlvbiBvZiB0aGF0IGZ1bmN0aW9uIHNwZWNpZmllcyB0aGUgbm9yZXR1cm4KICAgICAvLyAgIGF0dHJpYnV0ZS4KLSAgICBpZiAoTmV3LT5oYXNBdHRyPENYWDExTm9SZXR1cm5BdHRyPigpICYmCi0gICAgICAgICFPbGQtPmhhc0F0dHI8Q1hYMTFOb1JldHVybkF0dHI+KCkpIHsKLSAgICAgIERpYWcoTmV3LT5nZXRBdHRyPENYWDExTm9SZXR1cm5BdHRyPigpLT5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICBkaWFnOjplcnJfbm9yZXR1cm5fbWlzc2luZ19vbl9maXJzdF9kZWNsKTsKKyAgICBjb25zdCBDWFgxMU5vUmV0dXJuQXR0ciAqTlJBID0gTmV3LT5nZXRBdHRyPENYWDExTm9SZXR1cm5BdHRyPigpOworICAgIGlmIChOUkEgJiYgIU9sZC0+aGFzQXR0cjxDWFgxMU5vUmV0dXJuQXR0cj4oKSkgeworICAgICAgRGlhZyhOUkEtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9ub3JldHVybl9taXNzaW5nX29uX2ZpcnN0X2RlY2wpOwogICAgICAgRGlhZyhPbGQtPmdldEZpcnN0RGVjbCgpLT5nZXRMb2NhdGlvbigpLAogICAgICAgICAgICBkaWFnOjpub3RlX25vcmV0dXJuX21pc3NpbmdfZmlyc3RfZGVjbCk7CiAgICAgfQpAQCAtMjYxMSw5ICsyNTgwLDkgQEAKICAgICAvLyAgIFRoZSBmaXJzdCBkZWNsYXJhdGlvbiBvZiBhIGZ1bmN0aW9uIHNoYWxsIHNwZWNpZnkgdGhlCiAgICAgLy8gICBjYXJyaWVzX2RlcGVuZGVuY3kgYXR0cmlidXRlIGZvciBpdHMgZGVjbGFyYXRvci1pZCBpZiBhbnkgZGVjbGFyYXRpb24KICAgICAvLyAgIG9mIHRoZSBmdW5jdGlvbiBzcGVjaWZpZXMgdGhlIGNhcnJpZXNfZGVwZW5kZW5jeSBhdHRyaWJ1dGUuCi0gICAgaWYgKE5ldy0+aGFzQXR0cjxDYXJyaWVzRGVwZW5kZW5jeUF0dHI+KCkgJiYKLSAgICAgICAgIU9sZC0+aGFzQXR0cjxDYXJyaWVzRGVwZW5kZW5jeUF0dHI+KCkpIHsKLSAgICAgIERpYWcoTmV3LT5nZXRBdHRyPENhcnJpZXNEZXBlbmRlbmN5QXR0cj4oKS0+Z2V0TG9jYXRpb24oKSwKKyAgICBjb25zdCBDYXJyaWVzRGVwZW5kZW5jeUF0dHIgKkNEQSA9IE5ldy0+Z2V0QXR0cjxDYXJyaWVzRGVwZW5kZW5jeUF0dHI+KCk7CisgICAgaWYgKENEQSAmJiAhT2xkLT5oYXNBdHRyPENhcnJpZXNEZXBlbmRlbmN5QXR0cj4oKSkgeworICAgICAgRGlhZyhDREEtPmdldExvY2F0aW9uKCksCiAgICAgICAgICAgIGRpYWc6OmVycl9jYXJyaWVzX2RlcGVuZGVuY3lfbWlzc2luZ19vbl9maXJzdF9kZWNsKSA8PCAwLypGdW5jdGlvbiovOwogICAgICAgRGlhZyhPbGQtPmdldEZpcnN0RGVjbCgpLT5nZXRMb2NhdGlvbigpLAogICAgICAgICAgICBkaWFnOjpub3RlX2NhcnJpZXNfZGVwZW5kZW5jeV9taXNzaW5nX2ZpcnN0X2RlY2wpIDw8IDAvKkZ1bmN0aW9uKi87CkBAIC0yNjQ1LDEwICsyNjE0LDEwIEBACiAgICAgICAvLyBDaGVjayBjYXV0aW91c2x5IGFzIHRoZSBmcmllbmQgb2JqZWN0IGtpbmQgaXNuJ3QgeWV0IGNvbXBsZXRlLgogICAgICAgaWYgKE5ldy0+Z2V0RnJpZW5kT2JqZWN0S2luZCgpICE9IERlY2w6OkZPS19Ob25lKSB7CiAgICAgICAgIERpYWcoTmV3LT5nZXRMb2NhdGlvbigpLCBkaWFnOjpleHRfcmV0YWluZWRfbGFuZ3VhZ2VfbGlua2FnZSkgPDwgTmV3OwotICAgICAgICBEaWFnKE9sZC0+Z2V0TG9jYXRpb24oKSwgUHJldkRpYWcpOworICAgICAgICBEaWFnKE9sZExvY2F0aW9uLCBQcmV2RGlhZyk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBEaWFnKE5ldy0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2RpZmZlcmVudF9sYW5ndWFnZV9saW5rYWdlKSA8PCBOZXc7Ci0gICAgICAgIERpYWcoT2xkLT5nZXRMb2NhdGlvbigpLCBQcmV2RGlhZyk7CisgICAgICAgIERpYWcoT2xkTG9jYXRpb24sIFByZXZEaWFnKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAgICAgfQpAQCAtMjY3OSwyNiArMjY0OCwxOSBAQAogICAgICAgLy8gVGhlIG9sZCBkZWNsYXJhdGlvbiBwcm92aWRlZCBhIGZ1bmN0aW9uIHByb3RvdHlwZSwgYnV0IHRoZQogICAgICAgLy8gbmV3IGRlY2xhcmF0aW9uIGRvZXMgbm90LiBNZXJnZSBpbiB0aGUgcHJvdG90eXBlLgogICAgICAgYXNzZXJ0KCFPbGRQcm90by0+aGFzRXhjZXB0aW9uU3BlYygpICYmICJFeGNlcHRpb24gc3BlYyBpbiBDIik7Ci0gICAgICBTbWFsbFZlY3RvcjxRdWFsVHlwZSwgMTY+IFBhcmFtVHlwZXMoT2xkUHJvdG8tPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkUHJvdG8tPmFyZ190eXBlX2VuZCgpKTsKLSAgICAgIE5ld1FUeXBlID0gQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoTmV3RnVuY1R5cGUtPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1UeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkUHJvdG8tPmdldEV4dFByb3RvSW5mbygpKTsKKyAgICAgIFNtYWxsVmVjdG9yPFF1YWxUeXBlLCAxNj4gUGFyYW1UeXBlcyhPbGRQcm90by0+cGFyYW1fdHlwZXMoKSk7CisgICAgICBOZXdRVHlwZSA9CisgICAgICAgICAgQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoTmV3RnVuY1R5cGUtPmdldFJldHVyblR5cGUoKSwgUGFyYW1UeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGRQcm90by0+Z2V0RXh0UHJvdG9JbmZvKCkpOwogICAgICAgTmV3LT5zZXRUeXBlKE5ld1FUeXBlKTsKICAgICAgIE5ldy0+c2V0SGFzSW5oZXJpdGVkUHJvdG90eXBlKCk7CiAKICAgICAgIC8vIFN5bnRoZXNpemUgYSBwYXJhbWV0ZXIgZm9yIGVhY2ggYXJndW1lbnQgdHlwZS4KICAgICAgIFNtYWxsVmVjdG9yPFBhcm1WYXJEZWNsKiwgMTY+IFBhcmFtczsKLSAgICAgIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yCi0gICAgICAgICAgICAgUGFyYW1UeXBlID0gT2xkUHJvdG8tPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgICAgICAgUGFyYW1FbmQgPSBPbGRQcm90by0+YXJnX3R5cGVfZW5kKCk7Ci0gICAgICAgICAgIFBhcmFtVHlwZSAhPSBQYXJhbUVuZDsgKytQYXJhbVR5cGUpIHsKLSAgICAgICAgUGFybVZhckRlY2wgKlBhcmFtID0gUGFybVZhckRlY2w6OkNyZWF0ZShDb250ZXh0LCBOZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQYXJhbVR5cGUsIC8qVEluZm89Ki8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDX05vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICBmb3IgKGNvbnN0IGF1dG8gJlBhcmFtVHlwZSA6IE9sZFByb3RvLT5wYXJhbV90eXBlcygpKSB7CisgICAgICAgIFBhcm1WYXJEZWNsICpQYXJhbSA9IFBhcm1WYXJEZWNsOjpDcmVhdGUoQ29udGV4dCwgTmV3LCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIDAsIFBhcmFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRJbmZvPSovMCwgU0NfTm9uZSwgMCk7CiAgICAgICAgIFBhcmFtLT5zZXRTY29wZUluZm8oMCwgUGFyYW1zLnNpemUoKSk7CiAgICAgICAgIFBhcmFtLT5zZXRJbXBsaWNpdCgpOwogICAgICAgICBQYXJhbXMucHVzaF9iYWNrKFBhcmFtKTsKQEAgLTI3MzMsMjEgKzI2OTUsMjEgQEAKICAgICAgID0gTmV3LT5nZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwogCiAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyB0aGUgR05VIEMgZXh0ZW5zaW9uLgotICAgIFF1YWxUeXBlIE1lcmdlZFJldHVybiA9IENvbnRleHQubWVyZ2VUeXBlcyhPbGRQcm90by0+Z2V0UmVzdWx0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdQcm90by0+Z2V0UmVzdWx0VHlwZSgpKTsKKyAgICBRdWFsVHlwZSBNZXJnZWRSZXR1cm4gPSBDb250ZXh0Lm1lcmdlVHlwZXMoT2xkUHJvdG8tPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3UHJvdG8tPmdldFJldHVyblR5cGUoKSk7CiAgICAgYm9vbCBMb29zZUNvbXBhdGlibGUgPSAhTWVyZ2VkUmV0dXJuLmlzTnVsbCgpOwogICAgIGZvciAodW5zaWduZWQgSWR4ID0gMCwgRW5kID0gT2xkLT5nZXROdW1QYXJhbXMoKTsKICAgICAgICAgIExvb3NlQ29tcGF0aWJsZSAmJiBJZHggIT0gRW5kOyArK0lkeCkgewogICAgICAgUGFybVZhckRlY2wgKk9sZFBhcm0gPSBPbGQtPmdldFBhcmFtRGVjbChJZHgpOwogICAgICAgUGFybVZhckRlY2wgKk5ld1Bhcm0gPSBOZXctPmdldFBhcmFtRGVjbChJZHgpOwogICAgICAgaWYgKENvbnRleHQudHlwZXNBcmVDb21wYXRpYmxlKE9sZFBhcm0tPmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdQcm90by0+Z2V0QXJnVHlwZShJZHgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1Byb3RvLT5nZXRQYXJhbVR5cGUoSWR4KSkpIHsKICAgICAgICAgQXJnVHlwZXMucHVzaF9iYWNrKE5ld1Bhcm0tPmdldFR5cGUoKSk7CiAgICAgICB9IGVsc2UgaWYgKENvbnRleHQudHlwZXNBcmVDb21wYXRpYmxlKE9sZFBhcm0tPmdldFR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3UGFybS0+Z2V0VHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkNvbXBhcmVVbnF1YWxpZmllZD0qL3RydWUpKSB7Ci0gICAgICAgIEdOVUNvbXBhdGlibGVQYXJhbVdhcm5pbmcgV2FybgotICAgICAgICAgID0geyBPbGRQYXJtLCBOZXdQYXJtLCBOZXdQcm90by0+Z2V0QXJnVHlwZShJZHgpIH07CisgICAgICAgIEdOVUNvbXBhdGlibGVQYXJhbVdhcm5pbmcgV2FybiA9IHsgT2xkUGFybSwgTmV3UGFybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdQcm90by0+Z2V0UGFyYW1UeXBlKElkeCkgfTsKICAgICAgICAgV2FybmluZ3MucHVzaF9iYWNrKFdhcm4pOwogICAgICAgICBBcmdUeXBlcy5wdXNoX2JhY2soTmV3UGFybS0+Z2V0VHlwZSgpKTsKICAgICAgIH0gZWxzZQpAQCAtMjc4NSw3ICsyNzQ3LDcgQEAKICAgICAvLyBvciAncHJpbnRmJywganVzdCB3YXJuIGFib3V0IHRoZSBpbmNvbXBhdGlibGUgcmVkZWNsYXJhdGlvbi4KICAgICBpZiAoQ29udGV4dC5CdWlsdGluSW5mby5pc1ByZWRlZmluZWRMaWJGdW5jdGlvbihCdWlsdGluSUQpKSB7CiAgICAgICBEaWFnKE5ldy0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6d2Fybl9yZWRlY2xfbGlicmFyeV9idWlsdGluKSA8PCBOZXc7Ci0gICAgICBEaWFnKE9sZC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcmV2aW91c19idWlsdGluX2RlY2xhcmF0aW9uKQorICAgICAgRGlhZyhPbGRMb2NhdGlvbiwgZGlhZzo6bm90ZV9wcmV2aW91c19idWlsdGluX2RlY2xhcmF0aW9uKQogICAgICAgICA8PCBPbGQgPDwgT2xkLT5nZXRUeXBlKCk7CiAKICAgICAgIC8vIElmIHRoaXMgaXMgYSBnbG9iYWwgcmVkZWNsYXJhdGlvbiwganVzdCBmb3JnZXQgaGVyZWFmdGVyCkBAIC0yODA2LDcgKzI3NjgsNyBAQAogICB9CiAKICAgRGlhZyhOZXctPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9jb25mbGljdGluZ190eXBlcykgPDwgTmV3LT5nZXREZWNsTmFtZSgpOwotICBEaWFnKE9sZC0+Z2V0TG9jYXRpb24oKSwgUHJldkRpYWcpIDw8IE9sZCA8PCBPbGQtPmdldFR5cGUoKTsKKyAgRGlhZyhPbGRMb2NhdGlvbiwgUHJldkRpYWcpIDw8IE9sZCA8PCBPbGQtPmdldFR5cGUoKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTMwMDMsMTQgKzI5NjUsMTcgQEAKICAgaWYgKE5ldy0+aXNJbnZhbGlkRGVjbCgpKQogICAgIHJldHVybjsKIAorICBWYXJUZW1wbGF0ZURlY2wgKk5ld1RlbXBsYXRlID0gTmV3LT5nZXREZXNjcmliZWRWYXJUZW1wbGF0ZSgpOworCiAgIC8vIFZlcmlmeSB0aGUgb2xkIGRlY2wgd2FzIGFsc28gYSB2YXJpYWJsZSBvciB2YXJpYWJsZSB0ZW1wbGF0ZS4KICAgVmFyRGVjbCAqT2xkID0gMDsKLSAgaWYgKFByZXZpb3VzLmlzU2luZ2xlUmVzdWx0KCkgJiYKLSAgICAgIChPbGQgPSBkeW5fY2FzdDxWYXJEZWNsPihQcmV2aW91cy5nZXRGb3VuZERlY2woKSkpKSB7Ci0gICAgaWYgKE5ldy0+Z2V0RGVzY3JpYmVkVmFyVGVtcGxhdGUoKSkKLSAgICAgIE9sZCA9IE9sZC0+Z2V0RGVzY3JpYmVkVmFyVGVtcGxhdGUoKSA/IE9sZCA6IDA7Ci0gICAgZWxzZQotICAgICAgT2xkID0gT2xkLT5nZXREZXNjcmliZWRWYXJUZW1wbGF0ZSgpID8gMCA6IE9sZDsKKyAgVmFyVGVtcGxhdGVEZWNsICpPbGRUZW1wbGF0ZSA9IDA7CisgIGlmIChQcmV2aW91cy5pc1NpbmdsZVJlc3VsdCgpKSB7CisgICAgaWYgKE5ld1RlbXBsYXRlKSB7CisgICAgICBPbGRUZW1wbGF0ZSA9IGR5bl9jYXN0PFZhclRlbXBsYXRlRGVjbD4oUHJldmlvdXMuZ2V0Rm91bmREZWNsKCkpOworICAgICAgT2xkID0gT2xkVGVtcGxhdGUgPyBPbGRUZW1wbGF0ZS0+Z2V0VGVtcGxhdGVkRGVjbCgpIDogMDsKKyAgICB9IGVsc2UKKyAgICAgIE9sZCA9IGR5bl9jYXN0PFZhckRlY2w+KFByZXZpb3VzLmdldEZvdW5kRGVjbCgpKTsKICAgfQogICBpZiAoIU9sZCkgewogICAgIERpYWcoTmV3LT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfcmVkZWZpbml0aW9uX2RpZmZlcmVudF9raW5kKQpAQCAtMzAyMyw2ICsyOTg4LDEzIEBACiAgIGlmICghc2hvdWxkTGlua1Bvc3NpYmx5SGlkZGVuRGVjbChPbGQsIE5ldykpCiAgICAgcmV0dXJuOwogCisgIC8vIEVuc3VyZSB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgY29tcGF0aWJsZS4KKyAgaWYgKE5ld1RlbXBsYXRlICYmCisgICAgICAhVGVtcGxhdGVQYXJhbWV0ZXJMaXN0c0FyZUVxdWFsKE5ld1RlbXBsYXRlLT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkVGVtcGxhdGUtPmdldFRlbXBsYXRlUGFyYW1ldGVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkNvbXBsYWluPSovdHJ1ZSwgVFBMX1RlbXBsYXRlTWF0Y2gpKQorICAgIHJldHVybjsKKwogICAvLyBDKysgW2NsYXNzLm1lbV1wMToKICAgLy8gICBBIG1lbWJlciBzaGFsbCBub3QgYmUgZGVjbGFyZWQgdHdpY2UgaW4gdGhlIG1lbWJlci1zcGVjaWZpY2F0aW9uIFsuLi5dCiAgIC8vIApAQCAtMzAzNyw5ICszMDA5LDkgQEAKICAgbWVyZ2VEZWNsQXR0cmlidXRlcyhOZXcsIE9sZCk7CiAgIC8vIFdhcm4gaWYgYW4gYWxyZWFkeS1kZWNsYXJlZCB2YXJpYWJsZSBpcyBtYWRlIGEgd2Vha19pbXBvcnQgaW4gYSBzdWJzZXF1ZW50IAogICAvLyBkZWNsYXJhdGlvbgotICBpZiAoTmV3LT5nZXRBdHRyPFdlYWtJbXBvcnRBdHRyPigpICYmCisgIGlmIChOZXctPmhhc0F0dHI8V2Vha0ltcG9ydEF0dHI+KCkgJiYKICAgICAgIE9sZC0+Z2V0U3RvcmFnZUNsYXNzKCkgPT0gU0NfTm9uZSAmJgotICAgICAgIU9sZC0+Z2V0QXR0cjxXZWFrSW1wb3J0QXR0cj4oKSkgeworICAgICAgIU9sZC0+aGFzQXR0cjxXZWFrSW1wb3J0QXR0cj4oKSkgewogICAgIERpYWcoTmV3LT5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX3dlYWtfaW1wb3J0KSA8PCBOZXctPmdldERlY2xOYW1lKCk7CiAgICAgRGlhZyhPbGQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJldmlvdXNfZGVmaW5pdGlvbik7CiAgICAgLy8gUmVtb3ZlIHdlYWtfaW1wb3J0IGF0dHJpYnV0ZSBvbiBuZXcgZGVjbGFyYXRpb24uCkBAIC0zMTQ4LDE0ICszMTIwLDEzIEBACiAKICAgLy8gS2VlcCBhIGNoYWluIG9mIHByZXZpb3VzIGRlY2xhcmF0aW9ucy4KICAgTmV3LT5zZXRQcmV2aW91c0RlY2woT2xkKTsKKyAgaWYgKE5ld1RlbXBsYXRlKQorICAgIE5ld1RlbXBsYXRlLT5zZXRQcmV2aW91c0RlY2woT2xkVGVtcGxhdGUpOwogCiAgIC8vIEluaGVyaXQgYWNjZXNzIGFwcHJvcHJpYXRlbHkuCiAgIE5ldy0+c2V0QWNjZXNzKE9sZC0+Z2V0QWNjZXNzKCkpOwotCi0gIGlmIChWYXJUZW1wbGF0ZURlY2wgKlZURCA9IE5ldy0+Z2V0RGVzY3JpYmVkVmFyVGVtcGxhdGUoKSkgewotICAgIGlmIChOZXctPmlzU3RhdGljRGF0YU1lbWJlcigpICYmIE5ldy0+aXNPdXRPZkxpbmUoKSkKLSAgICAgIFZURC0+c2V0QWNjZXNzKE5ldy0+Z2V0QWNjZXNzKCkpOwotICB9CisgIGlmIChOZXdUZW1wbGF0ZSkKKyAgICBOZXdUZW1wbGF0ZS0+c2V0QWNjZXNzKE5ldy0+Z2V0QWNjZXNzKCkpOwogfQogCiAvLy8gUGFyc2VkRnJlZVN0YW5kaW5nRGVjbFNwZWMgLSBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gYSBkZWNsc3BlYyB3aXRoCkBAIC0zMTY1LDcgKzMxMzYsNyBAQAogICByZXR1cm4gUGFyc2VkRnJlZVN0YW5kaW5nRGVjbFNwZWMoUywgQVMsIERTLCBNdWx0aVRlbXBsYXRlUGFyYW1zQXJnKCkpOwogfQogCi1zdGF0aWMgdm9pZCBIYW5kbGVUYWdOdW1iZXJpbmcoU2VtYSAmUywgY29uc3QgVGFnRGVjbCAqVGFnKSB7CitzdGF0aWMgdm9pZCBIYW5kbGVUYWdOdW1iZXJpbmcoU2VtYSAmUywgY29uc3QgVGFnRGVjbCAqVGFnLCBTY29wZSAqVGFnU2NvcGUpIHsKICAgaWYgKCFTLkNvbnRleHQuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMpCiAgICAgcmV0dXJuOwogCkBAIC0zMTc2LDcgKzMxNDcsOCBAQAogICAgICAgcmV0dXJuOwogICAgIE1hbmdsZU51bWJlcmluZ0NvbnRleHQgJk1DdHggPQogICAgICAgICBTLkNvbnRleHQuZ2V0TWFuZ2xpbmdOdW1iZXJDb250ZXh0KFRhZy0+Z2V0UGFyZW50KCkpOwotICAgIFMuQ29udGV4dC5zZXRNYW5nbGluZ051bWJlcihUYWcsIE1DdHguZ2V0TWFuZ2xpbmdOdW1iZXIoVGFnKSk7CisgICAgUy5Db250ZXh0LnNldE1hbmdsaW5nTnVtYmVyKAorICAgICAgICBUYWcsIE1DdHguZ2V0TWFuZ2xpbmdOdW1iZXIoVGFnLCBUYWdTY29wZS0+Z2V0TVNMb2NhbE1hbmdsaW5nTnVtYmVyKCkpKTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtMzE4NSw3ICszMTU3LDkgQEAKICAgaWYgKE1hbmdsZU51bWJlcmluZ0NvbnRleHQgKk1DdHggPQogICAgICAgICAgIFMuZ2V0Q3VycmVudE1hbmdsZU51bWJlckNvbnRleHQoVGFnLT5nZXREZWNsQ29udGV4dCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFuZ2xpbmdDb250ZXh0RGVjbCkpIHsKLSAgICBTLkNvbnRleHQuc2V0TWFuZ2xpbmdOdW1iZXIoVGFnLCBNQ3R4LT5nZXRNYW5nbGluZ051bWJlcihUYWcpKTsKKyAgICBTLkNvbnRleHQuc2V0TWFuZ2xpbmdOdW1iZXIoCisgICAgICAgIFRhZywKKyAgICAgICAgTUN0eC0+Z2V0TWFuZ2xpbmdOdW1iZXIoVGFnLCBUYWdTY29wZS0+Z2V0TVNMb2NhbE1hbmdsaW5nTnVtYmVyKCkpKTsKICAgfQogfQogCkBAIC0zMjE4LDcgKzMxOTIsNyBAQAogICB9CiAKICAgaWYgKFRhZykgewotICAgIEhhbmRsZVRhZ051bWJlcmluZygqdGhpcywgVGFnKTsKKyAgICBIYW5kbGVUYWdOdW1iZXJpbmcoKnRoaXMsIFRhZywgUyk7CiAgICAgVGFnLT5zZXRGcmVlU3RhbmRpbmcoKTsKICAgICBpZiAoVGFnLT5pc0ludmFsaWREZWNsKCkpCiAgICAgICByZXR1cm4gVGFnOwpAQCAtMzI4NSw3ICszMjU5LDcgQEAKICAgICAgICAgRFMuZ2V0U3RvcmFnZUNsYXNzU3BlYygpICE9IERlY2xTcGVjOjpTQ1NfdHlwZWRlZikgewogICAgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzIHx8CiAgICAgICAgICAgUmVjb3JkLT5nZXREZWNsQ29udGV4dCgpLT5pc1JlY29yZCgpKQotICAgICAgICByZXR1cm4gQnVpbGRBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKFMsIERTLCBBUywgUmVjb3JkKTsKKyAgICAgICAgcmV0dXJuIEJ1aWxkQW5vbnltb3VzU3RydWN0T3JVbmlvbihTLCBEUywgQVMsIFJlY29yZCwgQ29udGV4dC5nZXRQcmludGluZ1BvbGljeSgpKTsKIAogICAgICAgRGVjbGFyZXNBbnl0aGluZyA9IGZhbHNlOwogICAgIH0KQEAgLTM0NzEsMTIgKzM0NDUsMTAgQEAKICAgYm9vbCBJbnZhbGlkID0gZmFsc2U7CiAKICAgLy8gTG9vayBldmVyeSBGaWVsZERlY2wgYW5kIEluZGlyZWN0RmllbGREZWNsIHdpdGggYSBuYW1lLgotICBmb3IgKFJlY29yZERlY2w6OmRlY2xfaXRlcmF0b3IgRCA9IEFub25SZWNvcmQtPmRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVuZCA9IEFub25SZWNvcmQtPmRlY2xzX2VuZCgpOwotICAgICAgIEQgIT0gREVuZDsgKytEKSB7Ci0gICAgaWYgKChpc2E8RmllbGREZWNsPigqRCkgfHwgaXNhPEluZGlyZWN0RmllbGREZWNsPigqRCkpICYmCi0gICAgICAgIGNhc3Q8TmFtZWREZWNsPigqRCktPmdldERlY2xOYW1lKCkpIHsKLSAgICAgIFZhbHVlRGVjbCAqVkQgPSBjYXN0PFZhbHVlRGVjbD4oKkQpOworICBmb3IgKGF1dG8gKkQgOiBBbm9uUmVjb3JkLT5kZWNscygpKSB7CisgICAgaWYgKChpc2E8RmllbGREZWNsPihEKSB8fCBpc2E8SW5kaXJlY3RGaWVsZERlY2w+KEQpKSAmJgorICAgICAgICBjYXN0PE5hbWVkRGVjbD4oRCktPmdldERlY2xOYW1lKCkpIHsKKyAgICAgIFZhbHVlRGVjbCAqVkQgPSBjYXN0PFZhbHVlRGVjbD4oRCk7CiAgICAgICBpZiAoQ2hlY2tBbm9uTWVtYmVyUmVkZWNsYXJhdGlvbihTZW1hUmVmLCBTLCBPd25lciwgVkQtPmdldERlY2xOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRC0+Z2V0TG9jYXRpb24oKSwgZGlhZ0tpbmQpKSB7CiAgICAgICAgIC8vIEMrKyBbY2xhc3MudW5pb25dcDI6CkBAIC0zNDkyLDkgKzM0NjQsOCBAQAogICAgICAgICAvLyAgIGFub255bW91cyB1bmlvbiBpcyBkZWNsYXJlZC4KICAgICAgICAgdW5zaWduZWQgT2xkQ2hhaW5pbmdTaXplID0gQ2hhaW5pbmcuc2l6ZSgpOwogICAgICAgICBpZiAoSW5kaXJlY3RGaWVsZERlY2wgKklGID0gZHluX2Nhc3Q8SW5kaXJlY3RGaWVsZERlY2w+KFZEKSkKLSAgICAgICAgICBmb3IgKEluZGlyZWN0RmllbGREZWNsOjpjaGFpbl9pdGVyYXRvciBQSSA9IElGLT5jaGFpbl9iZWdpbigpLAotICAgICAgICAgICAgICAgUEUgPSBJRi0+Y2hhaW5fZW5kKCk7IFBJICE9IFBFOyArK1BJKQotICAgICAgICAgICAgQ2hhaW5pbmcucHVzaF9iYWNrKCpQSSk7CisgICAgICAgICAgZm9yIChhdXRvICpQSSA6IElGLT5jaGFpbigpKQorICAgICAgICAgICAgQ2hhaW5pbmcucHVzaF9iYWNrKFBJKTsKICAgICAgICAgZWxzZQogICAgICAgICAgIENoYWluaW5nLnB1c2hfYmFjayhWRCk7CiAKQEAgLTM1NDksMTMgKzM1MjAsNDUgQEAKICAgbGx2bV91bnJlYWNoYWJsZSgidW5rbm93biBzdG9yYWdlIGNsYXNzIHNwZWNpZmllciIpOwogfQogCitzdGF0aWMgU291cmNlTG9jYXRpb24gZmluZERlZmF1bHRJbml0aWFsaXplcihjb25zdCBDWFhSZWNvcmREZWNsICpSZWNvcmQpIHsKKyAgYXNzZXJ0KFJlY29yZC0+aGFzSW5DbGFzc0luaXRpYWxpemVyKCkpOworCisgIGZvciAoY29uc3QgYXV0byAqSSA6IFJlY29yZC0+ZGVjbHMoKSkgeworICAgIGNvbnN0IGF1dG8gKkZEID0gZHluX2Nhc3Q8RmllbGREZWNsPihJKTsKKyAgICBpZiAoY29uc3QgYXV0byAqSUZEID0gZHluX2Nhc3Q8SW5kaXJlY3RGaWVsZERlY2w+KEkpKQorICAgICAgRkQgPSBJRkQtPmdldEFub25GaWVsZCgpOworICAgIGlmIChGRCAmJiBGRC0+aGFzSW5DbGFzc0luaXRpYWxpemVyKCkpCisgICAgICByZXR1cm4gRkQtPmdldExvY2F0aW9uKCk7CisgIH0KKworICBsbHZtX3VucmVhY2hhYmxlKCJjb3VsZG4ndCBmaW5kIGluLWNsYXNzIGluaXRpYWxpemVyIik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrRHVwbGljYXRlRGVmYXVsdEluaXQoU2VtYSAmUywgQ1hYUmVjb3JkRGVjbCAqUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBEZWZhdWx0SW5pdExvYykgeworICBpZiAoIVBhcmVudC0+aXNVbmlvbigpIHx8ICFQYXJlbnQtPmhhc0luQ2xhc3NJbml0aWFsaXplcigpKQorICAgIHJldHVybjsKKworICBTLkRpYWcoRGVmYXVsdEluaXRMb2MsIGRpYWc6OmVycl9tdWx0aXBsZV9tZW1fdW5pb25faW5pdGlhbGl6YXRpb24pOworICBTLkRpYWcoZmluZERlZmF1bHRJbml0aWFsaXplcihQYXJlbnQpLCBkaWFnOjpub3RlX3ByZXZpb3VzX2luaXRpYWxpemVyKSA8PCAwOworfQorCitzdGF0aWMgdm9pZCBjaGVja0R1cGxpY2F0ZURlZmF1bHRJbml0KFNlbWEgJlMsIENYWFJlY29yZERlY2wgKlBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqQW5vblVuaW9uKSB7CisgIGlmICghUGFyZW50LT5pc1VuaW9uKCkgfHwgIVBhcmVudC0+aGFzSW5DbGFzc0luaXRpYWxpemVyKCkpCisgICAgcmV0dXJuOworCisgIGNoZWNrRHVwbGljYXRlRGVmYXVsdEluaXQoUywgUGFyZW50LCBmaW5kRGVmYXVsdEluaXRpYWxpemVyKEFub25VbmlvbikpOworfQorCiAvLy8gQnVpbGRBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uIC0gSGFuZGxlIHRoZSBkZWNsYXJhdGlvbiBvZiBhbgogLy8vIGFub255bW91cyBzdHJ1Y3R1cmUgb3IgdW5pb24uIEFub255bW91cyB1bmlvbnMgYXJlIGEgQysrIGZlYXR1cmUKIC8vLyAoQysrIFtjbGFzcy51bmlvbl0pIGFuZCBhIEMxMSBmZWF0dXJlOyBhbm9ueW1vdXMgc3RydWN0dXJlcwogLy8vIGFyZSBhIEMxMSBmZWF0dXJlIGFuZCBHTlUgQysrIGV4dGVuc2lvbi4KIERlY2wgKlNlbWE6OkJ1aWxkQW5vbnltb3VzU3RydWN0T3JVbmlvbihTY29wZSAqUywgRGVjbFNwZWMgJkRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzU3BlY2lmaWVyIEFTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkRGVjbCAqUmVjb3JkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzU3BlY2lmaWVyIEFTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZERlY2wgKlJlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSB7CiAgIERlY2xDb250ZXh0ICpPd25lciA9IFJlY29yZC0+Z2V0RGVjbENvbnRleHQoKTsKIAogICAvLyBEaWFnbm9zZSB3aGV0aGVyIHRoaXMgYW5vbnltb3VzIHN0cnVjdC91bmlvbiBpcyBhbiBleHRlbnNpb24uCkBAIC0zNTg1LDcgKzM1ODgsNyBAQAogICAKICAgICAgICAgLy8gUmVjb3ZlciBieSBhZGRpbmcgJ3N0YXRpYycuCiAgICAgICAgIERTLlNldFN0b3JhZ2VDbGFzc1NwZWMoKnRoaXMsIERlY2xTcGVjOjpTQ1Nfc3RhdGljLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZTcGVjLCBEaWFnSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZTcGVjLCBEaWFnSUQsIFBvbGljeSk7CiAgICAgICB9CiAgICAgICAvLyBDKysgW2NsYXNzLnVuaW9uXXA2OgogICAgICAgLy8gICBBIHN0b3JhZ2UgY2xhc3MgaXMgbm90IGFsbG93ZWQgaW4gYSBkZWNsYXJhdGlvbiBvZiBhbgpAQCAtMzU5OSw3ICszNjAyLDcgQEAKICAgICAgICAgLy8gUmVjb3ZlciBieSByZW1vdmluZyB0aGUgc3RvcmFnZSBzcGVjaWZpZXIuCiAgICAgICAgIERTLlNldFN0b3JhZ2VDbGFzc1NwZWMoKnRoaXMsIERlY2xTcGVjOjpTQ1NfdW5zcGVjaWZpZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJldlNwZWMsIERpYWdJRCwgQ29udGV4dC5nZXRQcmludGluZ1BvbGljeSgpKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTM2MzIsMTAgKzM2MzUsOCBAQAogICAgIC8vICAgVGhlIG1lbWJlci1zcGVjaWZpY2F0aW9uIG9mIGFuIGFub255bW91cyB1bmlvbiBzaGFsbCBvbmx5CiAgICAgLy8gICBkZWZpbmUgbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnMuIFtOb3RlOiBuZXN0ZWQgdHlwZXMgYW5kCiAgICAgLy8gICBmdW5jdGlvbnMgY2Fubm90IGJlIGRlY2xhcmVkIHdpdGhpbiBhbiBhbm9ueW1vdXMgdW5pb24uIF0KLSAgICBmb3IgKERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIE1lbSA9IFJlY29yZC0+ZGVjbHNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbUVuZCA9IFJlY29yZC0+ZGVjbHNfZW5kKCk7Ci0gICAgICAgICBNZW0gIT0gTWVtRW5kOyArK01lbSkgewotICAgICAgaWYgKEZpZWxkRGVjbCAqRkQgPSBkeW5fY2FzdDxGaWVsZERlY2w+KCpNZW0pKSB7CisgICAgZm9yIChhdXRvICpNZW0gOiBSZWNvcmQtPmRlY2xzKCkpIHsKKyAgICAgIGlmIChhdXRvICpGRCA9IGR5bl9jYXN0PEZpZWxkRGVjbD4oTWVtKSkgewogICAgICAgICAvLyBDKysgW2NsYXNzLnVuaW9uXXAzOgogICAgICAgICAvLyAgIEFuIGFub255bW91cyB1bmlvbiBzaGFsbCBub3QgaGF2ZSBwcml2YXRlIG9yIHByb3RlY3RlZAogICAgICAgICAvLyAgIG1lbWJlcnMgKGNsYXVzZSAxMSkuCkBAIC0zNjUzLDE0ICszNjU0LDE0IEBACiAgICAgICAgIC8vICAgYXJyYXkgb2Ygc3VjaCBvYmplY3RzLgogICAgICAgICBpZiAoQ2hlY2tOb250cml2aWFsRmllbGQoRkQpKQogICAgICAgICAgIEludmFsaWQgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmICgoKk1lbSktPmlzSW1wbGljaXQoKSkgeworICAgICAgfSBlbHNlIGlmIChNZW0tPmlzSW1wbGljaXQoKSkgewogICAgICAgICAvLyBBbnkgaW1wbGljaXQgbWVtYmVycyBhcmUgZmluZS4KLSAgICAgIH0gZWxzZSBpZiAoaXNhPFRhZ0RlY2w+KCpNZW0pICYmICgqTWVtKS0+Z2V0RGVjbENvbnRleHQoKSAhPSBSZWNvcmQpIHsKKyAgICAgIH0gZWxzZSBpZiAoaXNhPFRhZ0RlY2w+KE1lbSkgJiYgTWVtLT5nZXREZWNsQ29udGV4dCgpICE9IFJlY29yZCkgewogICAgICAgICAvLyBUaGlzIGlzIGEgdHlwZSB0aGF0IHNob3dlZCB1cCBpbiBhbgogICAgICAgICAvLyBlbGFib3JhdGVkLXR5cGUtc3BlY2lmaWVyIGluc2lkZSB0aGUgYW5vbnltb3VzIHN0cnVjdCBvcgogICAgICAgICAvLyB1bmlvbiwgYnV0IHdoaWNoIGFjdHVhbGx5IGRlY2xhcmVzIGEgdHlwZSBvdXRzaWRlIG9mIHRoZQogICAgICAgICAvLyBhbm9ueW1vdXMgc3RydWN0IG9yIHVuaW9uLiBJdCdzIG9rYXkuCi0gICAgICB9IGVsc2UgaWYgKFJlY29yZERlY2wgKk1lbVJlY29yZCA9IGR5bl9jYXN0PFJlY29yZERlY2w+KCpNZW0pKSB7CisgICAgICB9IGVsc2UgaWYgKGF1dG8gKk1lbVJlY29yZCA9IGR5bl9jYXN0PFJlY29yZERlY2w+KE1lbSkpIHsKICAgICAgICAgaWYgKCFNZW1SZWNvcmQtPmlzQW5vbnltb3VzU3RydWN0T3JVbmlvbigpICYmCiAgICAgICAgICAgICBNZW1SZWNvcmQtPmdldERlY2xOYW1lKCkpIHsKICAgICAgICAgICAvLyBWaXN1YWwgQysrIGFsbG93cyB0eXBlIGRlZmluaXRpb24gaW4gYW5vbnltb3VzIHN0cnVjdCBvciB1bmlvbi4KQEAgLTM2ODEsMzEgKzM2ODIsMzkgQEAKICAgICAgICAgICAgICAgIGRpYWc6OmV4dF9hbm9ueW1vdXNfcmVjb3JkX3dpdGhfYW5vbnltb3VzX3R5cGUpCiAgICAgICAgICAgICA8PCAoaW50KVJlY29yZC0+aXNVbmlvbigpOwogICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGlzYTxBY2Nlc3NTcGVjRGVjbD4oKk1lbSkpIHsKKyAgICAgIH0gZWxzZSBpZiAoaXNhPEFjY2Vzc1NwZWNEZWNsPihNZW0pKSB7CiAgICAgICAgIC8vIEFueSBhY2Nlc3Mgc3BlY2lmaWVyIGlzIGZpbmUuCiAgICAgICB9IGVsc2UgewogICAgICAgICAvLyBXZSBoYXZlIHNvbWV0aGluZyB0aGF0IGlzbid0IGEgbm9uLXN0YXRpYyBkYXRhCiAgICAgICAgIC8vIG1lbWJlci4gQ29tcGxhaW4gYWJvdXQgaXQuCiAgICAgICAgIHVuc2lnbmVkIERLID0gZGlhZzo6ZXJyX2Fub255bW91c19yZWNvcmRfYmFkX21lbWJlcjsKLSAgICAgICAgaWYgKGlzYTxUeXBlRGVjbD4oKk1lbSkpCisgICAgICAgIGlmIChpc2E8VHlwZURlY2w+KE1lbSkpCiAgICAgICAgICAgREsgPSBkaWFnOjplcnJfYW5vbnltb3VzX3JlY29yZF93aXRoX3R5cGU7Ci0gICAgICAgIGVsc2UgaWYgKGlzYTxGdW5jdGlvbkRlY2w+KCpNZW0pKQorICAgICAgICBlbHNlIGlmIChpc2E8RnVuY3Rpb25EZWNsPihNZW0pKQogICAgICAgICAgIERLID0gZGlhZzo6ZXJyX2Fub255bW91c19yZWNvcmRfd2l0aF9mdW5jdGlvbjsKLSAgICAgICAgZWxzZSBpZiAoaXNhPFZhckRlY2w+KCpNZW0pKQorICAgICAgICBlbHNlIGlmIChpc2E8VmFyRGVjbD4oTWVtKSkKICAgICAgICAgICBESyA9IGRpYWc6OmVycl9hbm9ueW1vdXNfcmVjb3JkX3dpdGhfc3RhdGljOwogICAgICAgICAKICAgICAgICAgLy8gVmlzdWFsIEMrKyBhbGxvd3MgdHlwZSBkZWZpbml0aW9uIGluIGFub255bW91cyBzdHJ1Y3Qgb3IgdW5pb24uCiAgICAgICAgIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdEV4dCAmJgogICAgICAgICAgICAgREsgPT0gZGlhZzo6ZXJyX2Fub255bW91c19yZWNvcmRfd2l0aF90eXBlKQotICAgICAgICAgIERpYWcoKCpNZW0pLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpleHRfYW5vbnltb3VzX3JlY29yZF93aXRoX3R5cGUpCisgICAgICAgICAgRGlhZyhNZW0tPmdldExvY2F0aW9uKCksIGRpYWc6OmV4dF9hbm9ueW1vdXNfcmVjb3JkX3dpdGhfdHlwZSkKICAgICAgICAgICAgIDw8IChpbnQpUmVjb3JkLT5pc1VuaW9uKCk7CiAgICAgICAgIGVsc2UgewotICAgICAgICAgIERpYWcoKCpNZW0pLT5nZXRMb2NhdGlvbigpLCBESykKKyAgICAgICAgICBEaWFnKE1lbS0+Z2V0TG9jYXRpb24oKSwgREspCiAgICAgICAgICAgICAgIDw8IChpbnQpUmVjb3JkLT5pc1VuaW9uKCk7CiAgICAgICAgICAgSW52YWxpZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CisKKyAgICAvLyBDKysxMSBbY2xhc3MudW5pb25dcDggKERSMTQ2MCk6CisgICAgLy8gICBBdCBtb3N0IG9uZSB2YXJpYW50IG1lbWJlciBvZiBhIHVuaW9uIG1heSBoYXZlIGEKKyAgICAvLyAgIGJyYWNlLW9yLWVxdWFsLWluaXRpYWxpemVyLgorICAgIGlmIChjYXN0PENYWFJlY29yZERlY2w+KFJlY29yZCktPmhhc0luQ2xhc3NJbml0aWFsaXplcigpICYmCisgICAgICAgIE93bmVyLT5pc1JlY29yZCgpKQorICAgICAgY2hlY2tEdXBsaWNhdGVEZWZhdWx0SW5pdCgqdGhpcywgY2FzdDxDWFhSZWNvcmREZWNsPihPd25lciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oUmVjb3JkKSk7CiAgIH0KIAogICBpZiAoIVJlY29yZC0+aXNVbmlvbigpICYmICFPd25lci0+aXNSZWNvcmQoKSkgewpAQCAtMzc1OCwxMSArMzc2NywxNCBAQAogICB9CiAgIEFub24tPnNldEltcGxpY2l0KCk7CiAKKyAgLy8gTWFyayB0aGlzIGFzIGFuIGFub255bW91cyBzdHJ1Y3QvdW5pb24gdHlwZS4KKyAgUmVjb3JkLT5zZXRBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKHRydWUpOworCiAgIC8vIEFkZCB0aGUgYW5vbnltb3VzIHN0cnVjdC91bmlvbiBvYmplY3QgdG8gdGhlIGN1cnJlbnQKICAgLy8gY29udGV4dC4gV2UnbGwgYmUgcmVmZXJlbmNpbmcgdGhpcyBvYmplY3Qgd2hlbiB3ZSByZWZlciB0byBvbmUgb2YKICAgLy8gaXRzIG1lbWJlcnMuCiAgIE93bmVyLT5hZGREZWNsKEFub24pOwotICAKKwogICAvLyBJbmplY3QgdGhlIG1lbWJlcnMgb2YgdGhlIGFub255bW91cyBzdHJ1Y3QvdW5pb24gaW50byB0aGUgb3duaW5nCiAgIC8vIGNvbnRleHQgYW5kIGludG8gdGhlIGlkZW50aWZpZXIgcmVzb2x2ZXIgY2hhaW4gZm9yIG5hbWUgbG9va3VwCiAgIC8vIHB1cnBvc2VzLgpAQCAtMzc3MywxMyArMzc4NSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhaW4sIGZhbHNlKSkKICAgICBJbnZhbGlkID0gdHJ1ZTsKIAotICAvLyBNYXJrIHRoaXMgYXMgYW4gYW5vbnltb3VzIHN0cnVjdC91bmlvbiB0eXBlLiBOb3RlIHRoYXQgd2UgZG8gbm90Ci0gIC8vIGRvIHRoaXMgdW50aWwgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgYW5kIGluamVjdGVkIHRoZQotICAvLyBtZW1iZXJzIG9mIHRoaXMgYW5vbnltb3VzIHN0cnVjdC91bmlvbiB0eXBlLCBiZWNhdXNlIG90aGVyd2lzZQotICAvLyB0aGUgbWVtYmVycyBjb3VsZCBiZSBpbmplY3RlZCB0d2ljZTogb25jZSBieSBEZWNsQ29udGV4dCB3aGVuIGl0Ci0gIC8vIGJ1aWxkcyBpdHMgbG9va3VwIHRhYmxlLCBhbmQgb25jZSBieQotICAvLyBJbmplY3RBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uTWVtYmVycy4KLSAgUmVjb3JkLT5zZXRBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKHRydWUpOworICBpZiAoVmFyRGVjbCAqTmV3VkQgPSBkeW5fY2FzdDxWYXJEZWNsPihBbm9uKSkgeworICAgIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyAmJiBOZXdWRC0+aXNTdGF0aWNMb2NhbCgpKSB7CisgICAgICBEZWNsICpNYW5nbGluZ0NvbnRleHREZWNsOworICAgICAgaWYgKE1hbmdsZU51bWJlcmluZ0NvbnRleHQgKk1DdHggPQorICAgICAgICAgICAgICBnZXRDdXJyZW50TWFuZ2xlTnVtYmVyQ29udGV4dChOZXdWRC0+Z2V0RGVjbENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFuZ2xpbmdDb250ZXh0RGVjbCkpIHsKKyAgICAgICAgQ29udGV4dC5zZXRNYW5nbGluZ051bWJlcihOZXdWRCwgTUN0eC0+Z2V0TWFuZ2xpbmdOdW1iZXIoTmV3VkQsIFMtPmdldE1TTG9jYWxNYW5nbGluZ051bWJlcigpKSk7CisgICAgICAgIENvbnRleHQuc2V0U3RhdGljTG9jYWxOdW1iZXIoTmV3VkQsIE1DdHgtPmdldFN0YXRpY0xvY2FsTnVtYmVyKE5ld1ZEKSk7CisgICAgICB9CisgICAgfQorICB9CiAKICAgaWYgKEludmFsaWQpCiAgICAgQW5vbi0+c2V0SW52YWxpZERlY2woKTsKQEAgLTQxMTcsMzMgKzQxMzMsMzEgQEAKIC8vLyBccmV0dXJucyB0cnVlIGlmIHdlIGNhbm5vdCBzYWZlbHkgcmVjb3ZlciBmcm9tIHRoaXMgZXJyb3IsIGZhbHNlIG90aGVyd2lzZS4KIGJvb2wgU2VtYTo6ZGlhZ25vc2VRdWFsaWZpZWREZWNsYXJhdGlvbihDWFhTY29wZVNwZWMgJlNTLCBEZWNsQ29udGV4dCAqREMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lIE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYykgewogICBEZWNsQ29udGV4dCAqQ3VyID0gQ3VyQ29udGV4dDsKICAgd2hpbGUgKGlzYTxMaW5rYWdlU3BlY0RlY2w+KEN1cikgfHwgaXNhPENhcHR1cmVkRGVjbD4oQ3VyKSkKICAgICBDdXIgPSBDdXItPmdldFBhcmVudCgpOwotICAKLSAgLy8gQysrIFtkY2wubWVhbmluZ11wMToKLSAgLy8gICBBIGRlY2xhcmF0b3ItaWQgc2hhbGwgbm90IGJlIHF1YWxpZmllZCBleGNlcHQgZm9yIHRoZSBkZWZpbml0aW9uCi0gIC8vICAgb2YgYSBtZW1iZXIgZnVuY3Rpb24gKDkuMykgb3Igc3RhdGljIGRhdGEgbWVtYmVyICg5LjQpIG91dHNpZGUgb2YKLSAgLy8gICBpdHMgY2xhc3MsIHRoZSBkZWZpbml0aW9uIG9yIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgYSBmdW5jdGlvbiAKLSAgLy8gICBvciB2YXJpYWJsZSBtZW1iZXIgb2YgYSBuYW1lc3BhY2Ugb3V0c2lkZSBvZiBpdHMgbmFtZXNwYWNlLCBvciB0aGUKLSAgLy8gICBkZWZpbml0aW9uIG9mIGFuIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG91dHNpZGUgb2YgaXRzIG5hbWVzcGFjZSwKLSAgLy8gICBvciB0aGUgZGVjbGFyYXRpb24gb2YgYSBmcmllbmQgZnVuY3Rpb24gdGhhdCBpcyBhIG1lbWJlciBvZiAKLSAgLy8gICBhbm90aGVyIGNsYXNzIG9yIG5hbWVzcGFjZSAoMTEuMykuIFsuLi5dCi0gICAgCi0gIC8vIFRoZSB1c2VyIHByb3ZpZGVkIGEgc3VwZXJmbHVvdXMgc2NvcGUgc3BlY2lmaWVyIHRoYXQgcmVmZXJzIGJhY2sgdG8gdGhlCi0gIC8vIGNsYXNzIG9yIG5hbWVzcGFjZXMgaW4gd2hpY2ggdGhlIGVudGl0eSBpcyBhbHJlYWR5IGRlY2xhcmVkLgorCisgIC8vIElmIHRoZSB1c2VyIHByb3ZpZGVkIGEgc3VwZXJmbHVvdXMgc2NvcGUgc3BlY2lmaWVyIHRoYXQgcmVmZXJzIGJhY2sgdG8gdGhlCisgIC8vIGNsYXNzIGluIHdoaWNoIHRoZSBlbnRpdHkgaXMgYWxyZWFkeSBkZWNsYXJlZCwgZGlhZ25vc2UgYW5kIGlnbm9yZSBpdC4KICAgLy8KICAgLy8gY2xhc3MgWCB7CiAgIC8vICAgdm9pZCBYOjpmKCk7CiAgIC8vIH07CisgIC8vCisgIC8vIE5vdGUsIGl0IHdhcyBvbmNlIGlsbC1mb3JtZWQgdG8gZ2l2ZSByZWR1bmRhbnQgcXVhbGlmaWNhdGlvbiBpbiBhbGwKKyAgLy8gY29udGV4dHMsIGJ1dCB0aGF0IHJ1bGUgd2FzIHJlbW92ZWQgYnkgRFI0ODIuCiAgIGlmIChDdXItPkVxdWFscyhEQykpIHsKLSAgICBEaWFnKExvYywgTGFuZ09wdHMuTWljcm9zb2Z0RXh0PyBkaWFnOjp3YXJuX21lbWJlcl9leHRyYV9xdWFsaWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGlhZzo6ZXJyX21lbWJlcl9leHRyYV9xdWFsaWZpY2F0aW9uKQotICAgICAgPDwgTmFtZSA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlbW92YWwoU1MuZ2V0UmFuZ2UoKSk7Ci0gICAgU1MuY2xlYXIoKTsKKyAgICBpZiAoQ3VyLT5pc1JlY29yZCgpKSB7CisgICAgICBEaWFnKExvYywgTGFuZ09wdHMuTWljcm9zb2Z0RXh0ID8gZGlhZzo6d2Fybl9tZW1iZXJfZXh0cmFfcXVhbGlmaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6OmVycl9tZW1iZXJfZXh0cmFfcXVhbGlmaWNhdGlvbikKKyAgICAgICAgPDwgTmFtZSA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlbW92YWwoU1MuZ2V0UmFuZ2UoKSk7CisgICAgICBTUy5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICBEaWFnKExvYywgZGlhZzo6d2Fybl9uYW1lc3BhY2VfbWVtYmVyX2V4dHJhX3F1YWxpZmljYXRpb24pIDw8IE5hbWU7CisgICAgfQogICAgIHJldHVybiBmYWxzZTsKLSAgfSAKKyAgfQogCiAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHF1YWxpZnlpbmcgc2NvcGUgZW5jbG9zZXMgdGhlIHNjb3BlIG9mIHRoZSBvcmlnaW5hbAogICAvLyBkZWNsYXJhdGlvbi4KQEAgLTQyMzksNyArNDI1Myw3IEBACiAgICAgICAvLyBhbmQgcmV0dXJuIGVhcmx5LCB0byBhdm9pZCB0aGUgY29taW5nIHNlbWFudGljIGRpc2FzdGVyLgogICAgICAgRGlhZyhELmdldElkZW50aWZpZXJMb2MoKSwKICAgICAgICAgICAgZGlhZzo6ZXJyX3RlbXBsYXRlX3F1YWxpZmllZF9kZWNsYXJhdG9yX25vX21hdGNoKQotICAgICAgICA8PCAoTmVzdGVkTmFtZVNwZWNpZmllciopRC5nZXRDWFhTY29wZVNwZWMoKS5nZXRTY29wZVJlcCgpCisgICAgICAgIDw8IEQuZ2V0Q1hYU2NvcGVTcGVjKCkuZ2V0U2NvcGVSZXAoKQogICAgICAgICA8PCBELmdldENYWFNjb3BlU3BlYygpLmdldFJhbmdlKCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC00NjcwLDggKzQ2ODQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9va3VwUmVzdWx0ICZQcmV2aW91cywgYm9vbCAmUmVkZWNsYXJhdGlvbikgewogICAvLyBNZXJnZSB0aGUgZGVjbCB3aXRoIHRoZSBleGlzdGluZyBvbmUgaWYgYXBwcm9wcmlhdGUuIElmIHRoZSBkZWNsIGlzCiAgIC8vIGluIGFuIG91dGVyIHNjb3BlLCBpdCBpc24ndCB0aGUgc2FtZSB0aGluZy4KLSAgRmlsdGVyTG9va3VwRm9yU2NvcGUoUHJldmlvdXMsIERDLCBTLCAvKkNvbnNpZGVyTGlua2FnZSovIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAvKkV4cGxpY2l0SW5zdGFudGlhdGlvbk9yU3BlY2lhbGl6YXRpb249Ki9mYWxzZSk7CisgIEZpbHRlckxvb2t1cEZvclNjb3BlKFByZXZpb3VzLCBEQywgUywgLypDb25zaWRlckxpbmthZ2UqL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAvKkFsbG93SW5saW5lTmFtZXNwYWNlKi9mYWxzZSk7CiAgIGZpbHRlck5vbkNvbmZsaWN0aW5nUHJldmlvdXNEZWNscyhDb250ZXh0LCBOZXdURCwgUHJldmlvdXMpOwogICBpZiAoIVByZXZpb3VzLmVtcHR5KCkpIHsKICAgICBSZWRlY2xhcmF0aW9uID0gdHJ1ZTsKQEAgLTQ4MDQsNiArNDgxOCwxMCBAQAogfQogCiBzdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXNBZnRlck1lcmdpbmcoU2VtYSAmUywgTmFtZWREZWNsICZORCkgeworICAvLyBFbnN1cmUgdGhhdCBhbiBhdXRvIGRlY2wgaXMgZGVkdWNlZCBvdGhlcndpc2UgdGhlIGNoZWNrcyBiZWxvdyBtaWdodCBjYWNoZQorICAvLyB0aGUgd3JvbmcgbGlua2FnZS4KKyAgYXNzZXJ0KFMuUGFyc2luZ0luaXRGb3JBdXRvVmFycy5jb3VudCgmTkQpID09IDApOworCiAgIC8vICd3ZWFrJyBvbmx5IGFwcGxpZXMgdG8gZGVjbGFyYXRpb25zIHdpdGggZXh0ZXJuYWwgbGlua2FnZS4KICAgaWYgKFdlYWtBdHRyICpBdHRyID0gTkQuZ2V0QXR0cjxXZWFrQXR0cj4oKSkgewogICAgIGlmICghTkQuaXNFeHRlcm5hbGx5VmlzaWJsZSgpKSB7CkBAIC00ODI2LDYgKzQ4NDQsNzIgQEAKICAgICAgIE5ELmRyb3BBdHRyPFNlbGVjdEFueUF0dHI+KCk7CiAgICAgfQogICB9CisKKyAgLy8gZGxsIGF0dHJpYnV0ZXMgcmVxdWlyZSBleHRlcm5hbCBsaW5rYWdlLgorICBpZiAoY29uc3QgRExMSW1wb3J0QXR0ciAqQXR0ciA9IE5ELmdldEF0dHI8RExMSW1wb3J0QXR0cj4oKSkgeworICAgIGlmICghTkQuaXNFeHRlcm5hbGx5VmlzaWJsZSgpKSB7CisgICAgICBTLkRpYWcoTkQuZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9kbGxfbm90X2V4dGVybikKKyAgICAgICAgPDwgJk5EIDw8IEF0dHI7CisgICAgICBORC5zZXRJbnZhbGlkRGVjbCgpOworICAgIH0KKyAgfQorICBpZiAoY29uc3QgRExMRXhwb3J0QXR0ciAqQXR0ciA9IE5ELmdldEF0dHI8RExMRXhwb3J0QXR0cj4oKSkgeworICAgIGlmICghTkQuaXNFeHRlcm5hbGx5VmlzaWJsZSgpKSB7CisgICAgICBTLkRpYWcoTkQuZ2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9kbGxfbm90X2V4dGVybikKKyAgICAgICAgPDwgJk5EIDw8IEF0dHI7CisgICAgICBORC5zZXRJbnZhbGlkRGVjbCgpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja0RMTEF0dHJpYnV0ZVJlZGVjbGFyYXRpb24oU2VtYSAmUywgTmFtZWREZWNsICpPbGREZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqTmV3RGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU3BlY2lhbGl6YXRpb24pIHsKKyAgaWYgKFRlbXBsYXRlRGVjbCAqT2xkVEQgPSBkeW5fY2FzdDxUZW1wbGF0ZURlY2w+KE9sZERlY2wpKQorICAgIE9sZERlY2wgPSBPbGRURC0+Z2V0VGVtcGxhdGVkRGVjbCgpOworICBpZiAoVGVtcGxhdGVEZWNsICpOZXdURCA9IGR5bl9jYXN0PFRlbXBsYXRlRGVjbD4oTmV3RGVjbCkpCisgICAgTmV3RGVjbCA9IE5ld1RELT5nZXRUZW1wbGF0ZWREZWNsKCk7CisKKyAgaWYgKCFPbGREZWNsIHx8ICFOZXdEZWNsKQorICAgICAgcmV0dXJuOworCisgIGNvbnN0IERMTEltcG9ydEF0dHIgKk9sZEltcG9ydEF0dHIgPSBPbGREZWNsLT5nZXRBdHRyPERMTEltcG9ydEF0dHI+KCk7CisgIGNvbnN0IERMTEV4cG9ydEF0dHIgKk9sZEV4cG9ydEF0dHIgPSBPbGREZWNsLT5nZXRBdHRyPERMTEV4cG9ydEF0dHI+KCk7CisgIGNvbnN0IERMTEltcG9ydEF0dHIgKk5ld0ltcG9ydEF0dHIgPSBOZXdEZWNsLT5nZXRBdHRyPERMTEltcG9ydEF0dHI+KCk7CisgIGNvbnN0IERMTEV4cG9ydEF0dHIgKk5ld0V4cG9ydEF0dHIgPSBOZXdEZWNsLT5nZXRBdHRyPERMTEV4cG9ydEF0dHI+KCk7CisKKyAgLy8gZGxsaW1wb3J0IGFuZCBkbGxleHBvcnQgYXJlIGluaGVyaXRhYmxlIGF0dHJpYnV0ZXMgc28gd2UgaGF2ZSB0byBleGNsdWRlCisgIC8vIGluaGVyaXRlZCBhdHRyaWJ1dGUgaW5zdGFuY2VzLgorICBib29sIEhhc05ld0F0dHIgPSAoTmV3SW1wb3J0QXR0ciAmJiAhTmV3SW1wb3J0QXR0ci0+aXNJbmhlcml0ZWQoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKE5ld0V4cG9ydEF0dHIgJiYgIU5ld0V4cG9ydEF0dHItPmlzSW5oZXJpdGVkKCkpOworCisgIC8vIEEgcmVkZWNsYXJhdGlvbiBpcyBub3QgYWxsb3dlZCB0byBhZGQgYSBkbGxpbXBvcnQgb3IgZGxsZXhwb3J0IGF0dHJpYnV0ZSwKKyAgLy8gdGhlIG9ubHkgZXhjZXB0aW9uIGJlaW5nIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9ucy4KKyAgLy8gSW1wbGljaXRseSBnZW5lcmF0ZWQgZGVjbGFyYXRpb25zIGFyZSBhbHNvIGV4Y2x1ZGVkIGZvciBub3cgYmVjYXVzZSB0aGVyZQorICAvLyBpcyBubyBvdGhlciB3YXkgdG8gc3dpdGNoIHRoZXNlIHRvIHVzZSBkbGxpbXBvcnQgb3IgZGxsZXhwb3J0LgorICBib29sIEFkZHNBdHRyID0gIShPbGRJbXBvcnRBdHRyIHx8IE9sZEV4cG9ydEF0dHIpICYmIEhhc05ld0F0dHI7CisgIGlmIChBZGRzQXR0ciAmJiAhSXNTcGVjaWFsaXphdGlvbiAmJiAhT2xkRGVjbC0+aXNJbXBsaWNpdCgpKSB7CisgICAgUy5EaWFnKE5ld0RlY2wtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfZGxsX3JlZGVjbGFyYXRpb24pCisgICAgICA8PCBOZXdEZWNsCisgICAgICA8PCAoTmV3SW1wb3J0QXR0ciA/IChjb25zdCBBdHRyICopTmV3SW1wb3J0QXR0ciA6IE5ld0V4cG9ydEF0dHIpOworICAgIFMuRGlhZyhPbGREZWNsLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3ByZXZpb3VzX2RlY2xhcmF0aW9uKTsKKyAgICBOZXdEZWNsLT5zZXRJbnZhbGlkRGVjbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEEgcmVkZWNsYXJhdGlvbiBpcyBub3QgYWxsb3dlZCB0byBkcm9wIGEgZGxsaW1wb3J0IGF0dHJpYnV0ZSwgdGhlIG9ubHkKKyAgLy8gZXhjZXB0aW9uIGJlaW5nIGlubGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAgLy8gRklYTUU6IEhhbmRsZSBpbmxpbmUgZnVuY3Rpb25zLgorICAvLyBOQjogTVNWQyBjb252ZXJ0cyBzdWNoIGEgZGVjbGFyYXRpb24gdG8gZGxsZXhwb3J0LgorICBpZiAoT2xkSW1wb3J0QXR0ciAmJiAhSGFzTmV3QXR0cikgeworICAgIFMuRGlhZyhOZXdEZWNsLT5nZXRMb2NhdGlvbigpLAorICAgICAgICAgICBkaWFnOjp3YXJuX3JlZGVjbGFyYXRpb25fd2l0aG91dF9hdHRyaWJ1dGVfcHJldl9hdHRyaWJ1dGVfaWdub3JlZCkKKyAgICAgIDw8IE5ld0RlY2wgPDwgT2xkSW1wb3J0QXR0cjsKKyAgICBTLkRpYWcoT2xkRGVjbC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcmV2aW91c19kZWNsYXJhdGlvbik7CisgICAgUy5EaWFnKE9sZEltcG9ydEF0dHItPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJldmlvdXNfYXR0cmlidXRlKTsKKyAgICBPbGREZWNsLT5kcm9wQXR0cjxETExJbXBvcnRBdHRyPigpOworICAgIE5ld0RlY2wtPmRyb3BBdHRyPERMTEltcG9ydEF0dHI+KCk7CisgIH0KIH0KIAogLy8vIEdpdmVuIHRoYXQgd2UgYXJlIHdpdGhpbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24sCkBAIC00OTA2LDYgKzQ5OTAsMzEgQEAKICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBjb250ZXh0Iik7CiB9CiAKK3N0YXRpYyBib29sIGhhc1BhcnNlZEF0dHIoU2NvcGUgKlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgKkF0dHJMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0OjpLaW5kIEtpbmQpIHsKKyAgZm9yIChjb25zdCBBdHRyaWJ1dGVMaXN0ICpMID0gQXR0ckxpc3Q7IEw7IEwgPSBMLT5nZXROZXh0KCkpCisgICAgaWYgKEwtPmdldEtpbmQoKSA9PSBLaW5kKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgaGFzUGFyc2VkQXR0cihTY29wZSAqUywgY29uc3QgRGVjbGFyYXRvciAmUEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3Q6OktpbmQgS2luZCkgeworICAvLyBDaGVjayBkZWNsIGF0dHJpYnV0ZXMgb24gdGhlIERlY2xTcGVjLgorICBpZiAoaGFzUGFyc2VkQXR0cihTLCBQRC5nZXREZWNsU3BlYygpLmdldEF0dHJpYnV0ZXMoKS5nZXRMaXN0KCksIEtpbmQpKQorICAgIHJldHVybiB0cnVlOworCisgIC8vIFdhbGsgdGhlIGRlY2xhcmF0b3Igc3RydWN0dXJlLCBjaGVja2luZyBkZWNsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGluIGEgdHlwZQorICAvLyBwb3NpdGlvbiB0byB0aGUgZGVjbCBpdHNlbGYuCisgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBQRC5nZXROdW1UeXBlT2JqZWN0cygpOyBJICE9IEU7ICsrSSkgeworICAgIGlmIChoYXNQYXJzZWRBdHRyKFMsIFBELmdldFR5cGVPYmplY3QoSSkuZ2V0QXR0cnMoKSwgS2luZCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEZpbmFsbHksIGNoZWNrIGF0dHJpYnV0ZXMgb24gdGhlIGRlY2wgaXRzZWxmLgorICByZXR1cm4gaGFzUGFyc2VkQXR0cihTLCBQRC5nZXRBdHRyaWJ1dGVzKCksIEtpbmQpOworfQorCiAvLy8gQWRqdXN0IHRoZSBcYyBEZWNsQ29udGV4dCBmb3IgYSBmdW5jdGlvbiBvciB2YXJpYWJsZSB0aGF0IG1pZ2h0IGJlIGEKIC8vLyBmdW5jdGlvbi1sb2NhbCBleHRlcm5hbCBkZWNsYXJhdGlvbi4KIGJvb2wgU2VtYTo6YWRqdXN0Q29udGV4dEZvckxvY2FsRXh0ZXJuRGVjbChEZWNsQ29udGV4dCAqJkRDKSB7CkBAIC00OTQyLDE2ICs1MDUxLDM1IEBACiAgIFZhckRlY2w6OlN0b3JhZ2VDbGFzcyBTQyA9CiAgICAgU3RvcmFnZUNsYXNzU3BlY1RvVmFyRGVjbFN0b3JhZ2VDbGFzcyhELmdldERlY2xTcGVjKCkpOwogCisgIC8vIGRsbGltcG9ydCBnbG9iYWxzIHdpdGhvdXQgZXhwbGljaXQgc3RvcmFnZSBjbGFzcyBhcmUgdHJlYXRlZCBhcyBleHRlcm4uIFdlCisgIC8vIGhhdmUgdG8gY2hhbmdlIHRoZSBzdG9yYWdlIGNsYXNzIHRoaXMgZWFybHkgdG8gZ2V0IHRoZSByaWdodCBEZWNsQ29udGV4dC4KKyAgaWYgKFNDID09IFNDX05vbmUgJiYgIURDLT5pc1JlY29yZCgpICYmCisgICAgICBoYXNQYXJzZWRBdHRyKFMsIEQsIEF0dHJpYnV0ZUxpc3Q6OkFUX0RMTEltcG9ydCkpCisgICAgU0MgPSBTQ19FeHRlcm47CisKICAgRGVjbENvbnRleHQgKk9yaWdpbmFsREMgPSBEQzsKICAgYm9vbCBJc0xvY2FsRXh0ZXJuRGVjbCA9IFNDID09IFNDX0V4dGVybiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0Q29udGV4dEZvckxvY2FsRXh0ZXJuRGVjbChEQyk7CiAKLSAgaWYgKGdldExhbmdPcHRzKCkuT3BlbkNMICYmICFnZXRPcGVuQ0xPcHRpb25zKCkuY2xfa2hyX2ZwMTYpIHsKLSAgICAvLyBPcGVuQ0wgdjEuMiBzNi4xLjEuMTogcmVqZWN0IGRlY2xhcmluZyB2YXJpYWJsZXMgb2YgdGhlIGhhbGYgYW5kCi0gICAgLy8gaGFsZiBhcnJheSB0eXBlICh1bmxlc3MgdGhlIGNsX2tocl9mcDE2IGV4dGVuc2lvbiBpcyBlbmFibGVkKS4KLSAgICBpZiAoQ29udGV4dC5nZXRCYXNlRWxlbWVudFR5cGUoUiktPmlzSGFsZlR5cGUoKSkgewotICAgICAgRGlhZyhELmdldElkZW50aWZpZXJMb2MoKSwgZGlhZzo6ZXJyX29wZW5jbF9oYWxmX2RlY2xhcmF0aW9uKSA8PCBSOwotICAgICAgRC5zZXRJbnZhbGlkVHlwZSgpOworICBpZiAoZ2V0TGFuZ09wdHMoKS5PcGVuQ0wpIHsKKyAgICAvLyBPcGVuQ0wgdjEuMCBzNi44LmEuMzogUG9pbnRlcnMgdG8gZnVuY3Rpb25zIGFyZSBub3QgYWxsb3dlZC4KKyAgICBRdWFsVHlwZSBOUiA9IFI7CisgICAgd2hpbGUgKE5SLT5pc1BvaW50ZXJUeXBlKCkpIHsKKyAgICAgIGlmIChOUi0+aXNGdW5jdGlvblBvaW50ZXJUeXBlKCkpIHsKKyAgICAgICAgRGlhZyhELmdldElkZW50aWZpZXJMb2MoKSwgZGlhZzo6ZXJyX29wZW5jbF9mdW5jdGlvbl9wb2ludGVyX3ZhcmlhYmxlKTsKKyAgICAgICAgRC5zZXRJbnZhbGlkVHlwZSgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIE5SID0gTlItPmdldFBvaW50ZWVUeXBlKCk7CisgICAgfQorCisgICAgaWYgKCFnZXRPcGVuQ0xPcHRpb25zKCkuY2xfa2hyX2ZwMTYpIHsKKyAgICAgIC8vIE9wZW5DTCB2MS4yIHM2LjEuMS4xOiByZWplY3QgZGVjbGFyaW5nIHZhcmlhYmxlcyBvZiB0aGUgaGFsZiBhbmQKKyAgICAgIC8vIGhhbGYgYXJyYXkgdHlwZSAodW5sZXNzIHRoZSBjbF9raHJfZnAxNiBleHRlbnNpb24gaXMgZW5hYmxlZCkuCisgICAgICBpZiAoQ29udGV4dC5nZXRCYXNlRWxlbWVudFR5cGUoUiktPmlzSGFsZlR5cGUoKSkgeworICAgICAgICBEaWFnKEQuZ2V0SWRlbnRpZmllckxvYygpLCBkaWFnOjplcnJfb3BlbmNsX2hhbGZfZGVjbGFyYXRpb24pIDw8IFI7CisgICAgICAgIEQuc2V0SW52YWxpZFR5cGUoKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIApAQCAtNTAzMyw5ICs1MTYxLDkgQEAKICAgYm9vbCBJc1ZhcmlhYmxlVGVtcGxhdGVTcGVjaWFsaXphdGlvbiA9IGZhbHNlOwogICBib29sIElzUGFydGlhbFNwZWNpYWxpemF0aW9uID0gZmFsc2U7CiAgIGJvb2wgSXNWYXJpYWJsZVRlbXBsYXRlID0gZmFsc2U7Ci0gIFZhclRlbXBsYXRlRGVjbCAqUHJldlZhclRlbXBsYXRlID0gMDsKICAgVmFyRGVjbCAqTmV3VkQgPSAwOwogICBWYXJUZW1wbGF0ZURlY2wgKk5ld1RlbXBsYXRlID0gMDsKKyAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUZW1wbGF0ZVBhcmFtcyA9IDA7CiAgIGlmICghZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMpIHsKICAgICBOZXdWRCA9IFZhckRlY2w6OkNyZWF0ZShDb250ZXh0LCBEQywgRC5nZXRMb2NTdGFydCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQuZ2V0SWRlbnRpZmllckxvYygpLCBJSSwKQEAgLTUwOTcsMTA0ICs1MjI1LDE1IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgTmFtZWREZWNsICpQcmV2RGVjbCA9IDA7Ci0gICAgaWYgKFByZXZpb3VzLmJlZ2luKCkgIT0gUHJldmlvdXMuZW5kKCkpCi0gICAgICBQcmV2RGVjbCA9ICgqUHJldmlvdXMuYmVnaW4oKSktPmdldFVuZGVybHlpbmdEZWNsKCk7Ci0gICAgUHJldlZhclRlbXBsYXRlID0gZHluX2Nhc3Rfb3JfbnVsbDxWYXJUZW1wbGF0ZURlY2w+KFByZXZEZWNsKTsKLQogICAgIC8vIE1hdGNoIHVwIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdHMgd2l0aCB0aGUgc2NvcGUgc3BlY2lmaWVyLCB0aGVuCiAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBhIHRlbXBsYXRlIG9yIGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCi0gICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUZW1wbGF0ZVBhcmFtcyA9Ci0gICAgICAgIE1hdGNoVGVtcGxhdGVQYXJhbWV0ZXJzVG9TY29wZVNwZWNpZmllcigKLSAgICAgICAgICAgIEQuZ2V0RGVjbFNwZWMoKS5nZXRMb2NTdGFydCgpLCBELmdldElkZW50aWZpZXJMb2MoKSwKLSAgICAgICAgICAgIEQuZ2V0Q1hYU2NvcGVTcGVjKCksIFRlbXBsYXRlUGFyYW1MaXN0cywKLSAgICAgICAgICAgIC8qbmV2ZXIgYSBmcmllbmQqLyBmYWxzZSwgSXNFeHBsaWNpdFNwZWNpYWxpemF0aW9uLCBJbnZhbGlkKTsKLSAgICBpZiAoVGVtcGxhdGVQYXJhbXMpIHsKLSAgICAgIGlmICghVGVtcGxhdGVQYXJhbXMtPnNpemUoKSAmJgotICAgICAgICAgIEQuZ2V0TmFtZSgpLmdldEtpbmQoKSAhPSBVbnF1YWxpZmllZElkOjpJS19UZW1wbGF0ZUlkKSB7Ci0gICAgICAgIC8vIFRoZXJlIGlzIGFuIGV4dHJhbmVvdXMgJ3RlbXBsYXRlPD4nIGZvciB0aGlzIHZhcmlhYmxlLiBDb21wbGFpbgotICAgICAgICAvLyBhYm91dCBpdCwgYnV0IGFsbG93IHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgdmFyaWFibGUuCi0gICAgICAgIERpYWcoVGVtcGxhdGVQYXJhbXMtPmdldFRlbXBsYXRlTG9jKCksCi0gICAgICAgICAgICAgZGlhZzo6ZXJyX3RlbXBsYXRlX3ZhcmlhYmxlX25vcGFyYW1zKQotICAgICAgICAgIDw8IElJCi0gICAgICAgICAgPDwgU291cmNlUmFuZ2UoVGVtcGxhdGVQYXJhbXMtPmdldFRlbXBsYXRlTG9jKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbXMtPmdldFJBbmdsZUxvYygpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE9ubHkgQysrMXkgc3VwcG9ydHMgdmFyaWFibGUgdGVtcGxhdGVzIChOMzY1MSkuCi0gICAgICAgIERpYWcoRC5nZXRJZGVudGlmaWVyTG9jKCksCi0gICAgICAgICAgICAgZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxeQotICAgICAgICAgICAgICAgICA/IGRpYWc6Ondhcm5fY3h4MTFfY29tcGF0X3ZhcmlhYmxlX3RlbXBsYXRlCi0gICAgICAgICAgICAgICAgIDogZGlhZzo6ZXh0X3ZhcmlhYmxlX3RlbXBsYXRlKTsKKyAgICBUZW1wbGF0ZVBhcmFtcyA9IE1hdGNoVGVtcGxhdGVQYXJhbWV0ZXJzVG9TY29wZVNwZWNpZmllcigKKyAgICAgICAgRC5nZXREZWNsU3BlYygpLmdldExvY1N0YXJ0KCksIEQuZ2V0SWRlbnRpZmllckxvYygpLAorICAgICAgICBELmdldENYWFNjb3BlU3BlYygpLCBUZW1wbGF0ZVBhcmFtTGlzdHMsCisgICAgICAgIC8qbmV2ZXIgYSBmcmllbmQqLyBmYWxzZSwgSXNFeHBsaWNpdFNwZWNpYWxpemF0aW9uLCBJbnZhbGlkKTsKIAotICAgICAgICBpZiAoRC5nZXROYW1lKCkuZ2V0S2luZCgpID09IFVucXVhbGlmaWVkSWQ6OklLX1RlbXBsYXRlSWQpIHsKLSAgICAgICAgICAvLyBUaGlzIGlzIGFuIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9yIGEgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4KLSAgICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGNhbiBkZWNsYXJlIGEgc3BlY2lhbGl6YXRpb24gaGVyZQotCi0gICAgICAgICAgSXNWYXJpYWJsZVRlbXBsYXRlU3BlY2lhbGl6YXRpb24gPSB0cnVlOwotICAgICAgICAgIElzUGFydGlhbFNwZWNpYWxpemF0aW9uID0gVGVtcGxhdGVQYXJhbXMtPnNpemUoKSA+IDA7Ci0KLSAgICAgICAgfSBlbHNlIHsgLy8gaWYgKFRlbXBsYXRlUGFyYW1zLT5zaXplKCkgPiAwKQotICAgICAgICAgIC8vIFRoaXMgaXMgYSB0ZW1wbGF0ZSBkZWNsYXJhdGlvbi4KLSAgICAgICAgICBJc1ZhcmlhYmxlVGVtcGxhdGUgPSB0cnVlOwotCi0gICAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gZGVjbGFyZSBhIHRlbXBsYXRlIGhlcmUuCi0gICAgICAgICAgaWYgKENoZWNrVGVtcGxhdGVEZWNsU2NvcGUoUywgVGVtcGxhdGVQYXJhbXMpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIGRlY2xhcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSwgY2hlY2sKLSAgICAgICAgICAvLyB3aGV0aGVyIHRoaXMgaXMgYSB2YWxpZCByZWRlY2xhcmF0aW9uLgotICAgICAgICAgIGlmIChQcmV2RGVjbCAmJiAhaXNEZWNsSW5TY29wZShQcmV2RGVjbCwgREMsIFMpKQotICAgICAgICAgICAgUHJldkRlY2wgPSBQcmV2VmFyVGVtcGxhdGUgPSAwOwotCi0gICAgICAgICAgaWYgKFByZXZWYXJUZW1wbGF0ZSkgewotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0cyBhcmUgY29tcGF0aWJsZS4KLSAgICAgICAgICAgIGlmICghVGVtcGxhdGVQYXJhbWV0ZXJMaXN0c0FyZUVxdWFsKAotICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtcywgUHJldlZhclRlbXBsYXRlLT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgLypDb21wbGFpbj0qL3RydWUsIFRQTF9UZW1wbGF0ZU1hdGNoKSkKLSAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgfSBlbHNlIGlmIChQcmV2RGVjbCAmJiBQcmV2RGVjbC0+aXNUZW1wbGF0ZVBhcmFtZXRlcigpKSB7Ci0gICAgICAgICAgICAvLyBNYXliZSB3ZSB3aWxsIGNvbXBsYWluIGFib3V0IHRoZSBzaGFkb3dlZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCi0gICAgICAgICAgICBEaWFnbm9zZVRlbXBsYXRlUGFyYW1ldGVyU2hhZG93KEQuZ2V0SWRlbnRpZmllckxvYygpLCBQcmV2RGVjbCk7Ci0KLSAgICAgICAgICAgIC8vIEp1c3QgcHJldGVuZCB0aGF0IHdlIGRpZG4ndCBzZWUgdGhlIHByZXZpb3VzIGRlY2xhcmF0aW9uLgotICAgICAgICAgICAgUHJldkRlY2wgPSAwOwotICAgICAgICAgIH0gZWxzZSBpZiAoUHJldkRlY2wpIHsKLSAgICAgICAgICAgIC8vIEMrKyBbdGVtcF1wNToKLSAgICAgICAgICAgIC8vIC4uLiBhIHRlbXBsYXRlIG5hbWUgZGVjbGFyZWQgaW4gbmFtZXNwYWNlIHNjb3BlIG9yIGluIGNsYXNzCi0gICAgICAgICAgICAvLyBzY29wZSBzaGFsbCBiZSB1bmlxdWUgaW4gdGhhdCBzY29wZS4KLSAgICAgICAgICAgIERpYWcoRC5nZXRJZGVudGlmaWVyTG9jKCksIGRpYWc6OmVycl9yZWRlZmluaXRpb25fZGlmZmVyZW50X2tpbmQpCi0gICAgICAgICAgICAgICAgPDwgTmFtZTsKLSAgICAgICAgICAgIERpYWcoUHJldkRlY2wtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJldmlvdXNfZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBDaGVjayB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3Qgb2YgdGhpcyBkZWNsYXJhdGlvbiwgcG9zc2libHkKLSAgICAgICAgICAvLyBtZXJnaW5nIGluIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCBmcm9tIHRoZSBwcmV2aW91cyB2YXJpYWJsZQotICAgICAgICAgIC8vIHRlbXBsYXRlIGRlY2xhcmF0aW9uLgotICAgICAgICAgIGlmIChDaGVja1RlbXBsYXRlUGFyYW1ldGVyTGlzdCgKLSAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1zLAotICAgICAgICAgICAgICAgICAgUHJldlZhclRlbXBsYXRlID8gUHJldlZhclRlbXBsYXRlLT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCwKLSAgICAgICAgICAgICAgICAgIChELmdldENYWFNjb3BlU3BlYygpLmlzU2V0KCkgJiYgREMgJiYgREMtPmlzUmVjb3JkKCkgJiYKLSAgICAgICAgICAgICAgICAgICBEQy0+aXNEZXBlbmRlbnRDb250ZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgPyBUUENfQ2xhc3NUZW1wbGF0ZU1lbWJlcgotICAgICAgICAgICAgICAgICAgICAgIDogVFBDX1ZhclRlbXBsYXRlKSkKLSAgICAgICAgICAgIEludmFsaWQgPSB0cnVlOwotCi0gICAgICAgICAgaWYgKEQuZ2V0Q1hYU2NvcGVTcGVjKCkuaXNTZXQoKSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHdhcyBxdWFsaWZpZWQsIHdlIG11c3QgYmUgZGVmaW5pbmcKLSAgICAgICAgICAgIC8vIHRoZSB0ZW1wbGF0ZSBvdXQtb2YtbGluZS4KLSAgICAgICAgICAgIGlmICghRC5nZXRDWFhTY29wZVNwZWMoKS5pc0ludmFsaWQoKSAmJiAhSW52YWxpZCAmJgotICAgICAgICAgICAgICAgICFQcmV2VmFyVGVtcGxhdGUpIHsKLSAgICAgICAgICAgICAgRGlhZyhELmdldElkZW50aWZpZXJMb2MoKSwgZGlhZzo6ZXJyX21lbWJlcl9kZWNsX2RvZXNfbm90X21hdGNoKQotICAgICAgICAgICAgICAgICAgPDwgTmFtZSA8PCBEQyA8PCAvKklzRGVmaW5pdGlvbiovdHJ1ZQotICAgICAgICAgICAgICAgICAgPDwgRC5nZXRDWFhTY29wZVNwZWMoKS5nZXRSYW5nZSgpOwotICAgICAgICAgICAgICBJbnZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKEQuZ2V0TmFtZSgpLmdldEtpbmQoKSA9PSBVbnF1YWxpZmllZElkOjpJS19UZW1wbGF0ZUlkKSB7CisgICAgaWYgKEQuZ2V0TmFtZSgpLmdldEtpbmQoKSA9PSBVbnF1YWxpZmllZElkOjpJS19UZW1wbGF0ZUlkICYmCisgICAgICAgICFUZW1wbGF0ZVBhcmFtcykgewogICAgICAgVGVtcGxhdGVJZEFubm90YXRpb24gKlRlbXBsYXRlSWQgPSBELmdldE5hbWUoKS5UZW1wbGF0ZUlkOwogCiAgICAgICAvLyBXZSBoYXZlIGVuY291bnRlcmVkIHNvbWV0aGluZyB0aGF0IHRoZSB1c2VyIG1lYW50IHRvIGJlIGEKQEAgLTUyMDcsMjIgKzUyNDYsNTMgQEAKICAgICAgICAgICA8PCBTb3VyY2VSYW5nZShUZW1wbGF0ZUlkLT5MQW5nbGVMb2MsIFRlbXBsYXRlSWQtPlJBbmdsZUxvYykKICAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihELmdldERlY2xTcGVjKCkuZ2V0TG9jU3RhcnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVtcGxhdGU8PiAiKTsKLSAgICAgIElzVmFyaWFibGVUZW1wbGF0ZVNwZWNpYWxpemF0aW9uID0gdHJ1ZTsKKyAgICAgIElzRXhwbGljaXRTcGVjaWFsaXphdGlvbiA9IHRydWU7CisgICAgICBUZW1wbGF0ZVBhcmFtcyA9IFRlbXBsYXRlUGFyYW1ldGVyTGlzdDo6Q3JlYXRlKENvbnRleHQsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCkpOworICAgIH0KKworICAgIGlmIChUZW1wbGF0ZVBhcmFtcykgeworICAgICAgaWYgKCFUZW1wbGF0ZVBhcmFtcy0+c2l6ZSgpICYmCisgICAgICAgICAgRC5nZXROYW1lKCkuZ2V0S2luZCgpICE9IFVucXVhbGlmaWVkSWQ6OklLX1RlbXBsYXRlSWQpIHsKKyAgICAgICAgLy8gVGhlcmUgaXMgYW4gZXh0cmFuZW91cyAndGVtcGxhdGU8PicgZm9yIHRoaXMgdmFyaWFibGUuIENvbXBsYWluCisgICAgICAgIC8vIGFib3V0IGl0LCBidXQgYWxsb3cgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSB2YXJpYWJsZS4KKyAgICAgICAgRGlhZyhUZW1wbGF0ZVBhcmFtcy0+Z2V0VGVtcGxhdGVMb2MoKSwKKyAgICAgICAgICAgICBkaWFnOjplcnJfdGVtcGxhdGVfdmFyaWFibGVfbm9wYXJhbXMpCisgICAgICAgICAgPDwgSUkKKyAgICAgICAgICA8PCBTb3VyY2VSYW5nZShUZW1wbGF0ZVBhcmFtcy0+Z2V0VGVtcGxhdGVMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtcy0+Z2V0UkFuZ2xlTG9jKCkpOworICAgICAgICBUZW1wbGF0ZVBhcmFtcyA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBPbmx5IEMrKzF5IHN1cHBvcnRzIHZhcmlhYmxlIHRlbXBsYXRlcyAoTjM2NTEpLgorICAgICAgICBEaWFnKEQuZ2V0SWRlbnRpZmllckxvYygpLAorICAgICAgICAgICAgIGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMXkKKyAgICAgICAgICAgICAgICAgPyBkaWFnOjp3YXJuX2N4eDExX2NvbXBhdF92YXJpYWJsZV90ZW1wbGF0ZQorICAgICAgICAgICAgICAgICA6IGRpYWc6OmV4dF92YXJpYWJsZV90ZW1wbGF0ZSk7CisKKyAgICAgICAgaWYgKEQuZ2V0TmFtZSgpLmdldEtpbmQoKSA9PSBVbnF1YWxpZmllZElkOjpJS19UZW1wbGF0ZUlkKSB7CisgICAgICAgICAgLy8gVGhpcyBpcyBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvciBhIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCisgICAgICAgICAgLy8gRklYTUU6IENoZWNrIHRoYXQgd2UgY2FuIGRlY2xhcmUgYSBzcGVjaWFsaXphdGlvbiBoZXJlLgorICAgICAgICAgIElzVmFyaWFibGVUZW1wbGF0ZVNwZWNpYWxpemF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICBJc1BhcnRpYWxTcGVjaWFsaXphdGlvbiA9IFRlbXBsYXRlUGFyYW1zLT5zaXplKCkgPiAwOworICAgICAgICB9IGVsc2UgeyAvLyBpZiAoVGVtcGxhdGVQYXJhbXMtPnNpemUoKSA+IDApCisgICAgICAgICAgLy8gVGhpcyBpcyBhIHRlbXBsYXRlIGRlY2xhcmF0aW9uLgorICAgICAgICAgIElzVmFyaWFibGVUZW1wbGF0ZSA9IHRydWU7CisKKyAgICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGNhbiBkZWNsYXJlIGEgdGVtcGxhdGUgaGVyZS4KKyAgICAgICAgICBpZiAoQ2hlY2tUZW1wbGF0ZURlY2xTY29wZShTLCBUZW1wbGF0ZVBhcmFtcykpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KIAogICAgIGlmIChJc1ZhcmlhYmxlVGVtcGxhdGVTcGVjaWFsaXphdGlvbikgewotICAgICAgaWYgKCFQcmV2VmFyVGVtcGxhdGUpIHsKLSAgICAgICAgRGlhZyhELmdldElkZW50aWZpZXJMb2MoKSwgZGlhZzo6ZXJyX3Zhcl9zcGVjX25vX3RlbXBsYXRlKQotICAgICAgICAgICAgPDwgSXNQYXJ0aWFsU3BlY2lhbGl6YXRpb247Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotCiAgICAgICBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jID0KICAgICAgICAgICBUZW1wbGF0ZVBhcmFtTGlzdHMuc2l6ZSgpID4gMAogICAgICAgICAgICAgICA/IFRlbXBsYXRlUGFyYW1MaXN0c1swXS0+Z2V0VGVtcGxhdGVMb2MoKQogICAgICAgICAgICAgICA6IFNvdXJjZUxvY2F0aW9uKCk7CiAgICAgICBEZWNsUmVzdWx0IFJlcyA9IEFjdE9uVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbigKLSAgICAgICAgICBTLCBQcmV2VmFyVGVtcGxhdGUsIEQsIFRJbmZvLCBUZW1wbGF0ZUtXTG9jLCBUZW1wbGF0ZVBhcmFtcywgU0MsCisgICAgICAgICAgUywgRCwgVEluZm8sIFRlbXBsYXRlS1dMb2MsIFRlbXBsYXRlUGFyYW1zLCBTQywKICAgICAgICAgICBJc1BhcnRpYWxTcGVjaWFsaXphdGlvbik7CiAgICAgICBpZiAoUmVzLmlzSW52YWxpZCgpKQogICAgICAgICByZXR1cm4gMDsKQEAgLTUyMzYsNyArNTMwNiw3IEBACiAgICAgaWYgKElzVmFyaWFibGVUZW1wbGF0ZSkgewogICAgICAgTmV3VGVtcGxhdGUgPQogICAgICAgICAgIFZhclRlbXBsYXRlRGVjbDo6Q3JlYXRlKENvbnRleHQsIERDLCBELmdldElkZW50aWZpZXJMb2MoKSwgTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtcywgTmV3VkQsIFByZXZWYXJUZW1wbGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbXMsIE5ld1ZEKTsKICAgICAgIE5ld1ZELT5zZXREZXNjcmliZWRWYXJUZW1wbGF0ZShOZXdUZW1wbGF0ZSk7CiAgICAgfQogCkBAIC01MjUzLDE4ICs1MzIzLDEzIEBACiAKICAgICBTZXROZXN0ZWROYW1lU3BlY2lmaWVyKE5ld1ZELCBEKTsKIAotICAgIC8vIEZJWE1FOiBEbyB3ZSBuZWVkIEQuZ2V0Q1hYU2NvcGVTcGVjKCkuaXNTZXQoKT8KLSAgICBpZiAoVGVtcGxhdGVQYXJhbXMgJiYgVGVtcGxhdGVQYXJhbUxpc3RzLnNpemUoKSA+IDEgJiYKLSAgICAgICAgKCFJc1ZhcmlhYmxlVGVtcGxhdGVTcGVjaWFsaXphdGlvbiB8fCBELmdldENYWFNjb3BlU3BlYygpLmlzU2V0KCkpKSB7CisgICAgLy8gSWYgd2UgaGF2ZSBhbnkgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3RzIHRoYXQgZG9uJ3QgZGlyZWN0bHkgYmVsb25nIHRvCisgICAgLy8gdGhlIHZhcmlhYmxlIChtYXRjaGluZyB0aGUgc2NvcGUgc3BlY2lmaWVyKSwgc3RvcmUgdGhlbS4KKyAgICB1bnNpZ25lZCBWRFRlbXBsYXRlUGFyYW1MaXN0cyA9IFRlbXBsYXRlUGFyYW1zID8gMSA6IDA7CisgICAgaWYgKFRlbXBsYXRlUGFyYW1MaXN0cy5zaXplKCkgPiBWRFRlbXBsYXRlUGFyYW1MaXN0cykKICAgICAgIE5ld1ZELT5zZXRUZW1wbGF0ZVBhcmFtZXRlckxpc3RzSW5mbygKLSAgICAgICAgICBDb250ZXh0LCBUZW1wbGF0ZVBhcmFtTGlzdHMuc2l6ZSgpIC0gMSwgVGVtcGxhdGVQYXJhbUxpc3RzLmRhdGEoKSk7Ci0gICAgfSBlbHNlIGlmIChJc1ZhcmlhYmxlVGVtcGxhdGVTcGVjaWFsaXphdGlvbiB8fAotICAgICAgICAgICAgICAgKCFUZW1wbGF0ZVBhcmFtcyAmJiBUZW1wbGF0ZVBhcmFtTGlzdHMuc2l6ZSgpID4gMCAmJgotICAgICAgICAgICAgICAgIChELmdldENYWFNjb3BlU3BlYygpLmlzU2V0KCkpKSkgewotICAgICAgTmV3VkQtPnNldFRlbXBsYXRlUGFyYW1ldGVyTGlzdHNJbmZvKENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbUxpc3RzLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtTGlzdHMuZGF0YSgpKTsKLSAgICB9CisgICAgICAgICAgQ29udGV4dCwgVGVtcGxhdGVQYXJhbUxpc3RzLnNpemUoKSAtIFZEVGVtcGxhdGVQYXJhbUxpc3RzLAorICAgICAgICAgIFRlbXBsYXRlUGFyYW1MaXN0cy5kYXRhKCkpOwogCiAgICAgaWYgKEQuZ2V0RGVjbFNwZWMoKS5pc0NvbnN0ZXhwclNwZWNpZmllZCgpKQogICAgICAgTmV3VkQtPnNldENvbnN0ZXhwcih0cnVlKTsKQEAgLTUzNDYsOSArNTQxMSw2IEBACiAgIC8vIEhhbmRsZSBhdHRyaWJ1dGVzIHByaW9yIHRvIGNoZWNraW5nIGZvciBkdXBsaWNhdGVzIGluIE1lcmdlVmFyRGVjbAogICBQcm9jZXNzRGVjbEF0dHJpYnV0ZXMoUywgTmV3VkQsIEQpOwogCi0gIGlmIChOZXdWRC0+aGFzQXR0cnMoKSkKLSAgICBDaGVja0FsaWduYXNVbmRlcmFsaWdubWVudChOZXdWRCk7Ci0KICAgaWYgKGdldExhbmdPcHRzKCkuQ1VEQSkgewogICAgIC8vIENVREEgQi4yLjU6ICJfX3NoYXJlZF9fIGFuZCBfX2NvbnN0YW50X18gdmFyaWFibGVzIGhhdmUgaW1wbGllZCBzdGF0aWMKICAgICAvLyBzdG9yYWdlIFtkdXJhdGlvbl0uIgpAQCAtNTM1OSw2ICs1NDIxLDEzIEBACiAgICAgfQogICB9CiAKKyAgLy8gRW5zdXJlIHRoYXQgZGxsaW1wb3J0IGdsb2JhbHMgd2l0aG91dCBleHBsaWNpdCBzdG9yYWdlIGNsYXNzIGFyZSB0cmVhdGVkIGFzCisgIC8vIGV4dGVybi4gVGhlIHN0b3JhZ2UgY2xhc3MgaXMgc2V0IGFib3ZlIHVzaW5nIHBhcnNlZCBhdHRyaWJ1dGVzLiBOb3cgd2UgY2FuCisgIC8vIGNoZWNrIHRoZSBWYXJEZWNsIGl0c2VsZi4KKyAgYXNzZXJ0KCFOZXdWRC0+aGFzQXR0cjxETExJbXBvcnRBdHRyPigpIHx8CisgICAgICAgICBOZXdWRC0+Z2V0QXR0cjxETExJbXBvcnRBdHRyPigpLT5pc0luaGVyaXRlZCgpIHx8CisgICAgICAgICBOZXdWRC0+aXNTdGF0aWNEYXRhTWVtYmVyKCkgfHwgTmV3VkQtPmdldFN0b3JhZ2VDbGFzcygpICE9IFNDX05vbmUpOworCiAgIC8vIEluIGF1dG8tcmV0YWluL3JlbGVhc2UsIGluZmVyIHN0cm9uZyByZXRlbnNpb24gZm9yIHZhcmlhYmxlcyBvZgogICAvLyByZXRhaW5hYmxlIHR5cGUuCiAgIGlmIChnZXRMYW5nT3B0cygpLk9iakNBdXRvUmVmQ291bnQgJiYgaW5mZXJPYmpDQVJDTGlmZXRpbWUoTmV3VkQpKQpAQCAtNTM4OCw3ICs1NDU3LDcgQEAKICAgICB9CiAKICAgICBOZXdWRC0+YWRkQXR0cig6Om5ldyAoQ29udGV4dCkgQXNtTGFiZWxBdHRyKFNFLT5nZXRTdHJUb2tlbkxvYygwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQsIExhYmVsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LCBMYWJlbCwgMCkpOwogICB9IGVsc2UgaWYgKCFFeHRuYW1lVW5kZWNsYXJlZElkZW50aWZpZXJzLmVtcHR5KCkpIHsKICAgICBsbHZtOjpEZW5zZU1hcDxJZGVudGlmaWVySW5mbyosQXNtTGFiZWxBdHRyKj46Oml0ZXJhdG9yIEkgPQogICAgICAgRXh0bmFtZVVuZGVjbGFyZWRJZGVudGlmaWVycy5maW5kKE5ld1ZELT5nZXRJZGVudGlmaWVyKCkpOwpAQCAtNTM5OSwxNSArNTQ2OCwxNiBAQAogICB9CiAKICAgLy8gRGlhZ25vc2Ugc2hhZG93ZWQgdmFyaWFibGVzIGJlZm9yZSBmaWx0ZXJpbmcgZm9yIHNjb3BlLgotICBpZiAoIUQuZ2V0Q1hYU2NvcGVTcGVjKCkuaXNTZXQoKSkKKyAgaWYgKEQuZ2V0Q1hYU2NvcGVTcGVjKCkuaXNFbXB0eSgpKQogICAgIENoZWNrU2hhZG93KFMsIE5ld1ZELCBQcmV2aW91cyk7CiAKICAgLy8gRG9uJ3QgY29uc2lkZXIgZXhpc3RpbmcgZGVjbGFyYXRpb25zIHRoYXQgYXJlIGluIGEgZGlmZmVyZW50CiAgIC8vIHNjb3BlIGFuZCBhcmUgb3V0LW9mLXNlbWFudGljLWNvbnRleHQgZGVjbGFyYXRpb25zIChpZiB0aGUgbmV3CiAgIC8vIGRlY2xhcmF0aW9uIGhhcyBsaW5rYWdlKS4KLSAgRmlsdGVyTG9va3VwRm9yU2NvcGUoCi0gICAgICBQcmV2aW91cywgT3JpZ2luYWxEQywgUywgc2hvdWxkQ29uc2lkZXJMaW5rYWdlKE5ld1ZEKSwKLSAgICAgIElzRXhwbGljaXRTcGVjaWFsaXphdGlvbiB8fCBJc1ZhcmlhYmxlVGVtcGxhdGVTcGVjaWFsaXphdGlvbik7CisgIEZpbHRlckxvb2t1cEZvclNjb3BlKFByZXZpb3VzLCBPcmlnaW5hbERDLCBTLCBzaG91bGRDb25zaWRlckxpbmthZ2UoTmV3VkQpLAorICAgICAgICAgICAgICAgICAgICAgICBELmdldENYWFNjb3BlU3BlYygpLmlzTm90RW1wdHkoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICBJc0V4cGxpY2l0U3BlY2lhbGl6YXRpb24gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgSXNWYXJpYWJsZVRlbXBsYXRlU3BlY2lhbGl6YXRpb24pOwogCiAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGluIHRoZSBzYW1lIGJsb2NrIHNjb3BlLiBUaGlzCiAgIC8vIGFmZmVjdHMgd2hldGhlciB3ZSBtZXJnZSB0eXBlcyB3aXRoIGl0LCBwZXIgQysrMTEgW2RjbC5hcnJheV1wMy4KQEAgLTU0MjAsNiArNTQ5MCwxMSBAQAogICBpZiAoIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKSB7CiAgICAgRC5zZXRSZWRlY2xhcmF0aW9uKENoZWNrVmFyaWFibGVEZWNsYXJhdGlvbihOZXdWRCwgUHJldmlvdXMpKTsKICAgfSBlbHNlIHsKKyAgICAvLyBJZiB0aGlzIGlzIGFuIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mIGEgc3RhdGljIGRhdGEgbWVtYmVyLCBjaGVjayBpdC4KKyAgICBpZiAoSXNFeHBsaWNpdFNwZWNpYWxpemF0aW9uICYmICFOZXdWRC0+aXNJbnZhbGlkRGVjbCgpICYmCisgICAgICAgIENoZWNrTWVtYmVyU3BlY2lhbGl6YXRpb24oTmV3VkQsIFByZXZpb3VzKSkKKyAgICAgIE5ld1ZELT5zZXRJbnZhbGlkRGVjbCgpOworCiAgICAgLy8gTWVyZ2UgdGhlIGRlY2wgd2l0aCB0aGUgZXhpc3Rpbmcgb25lIGlmIGFwcHJvcHJpYXRlLgogICAgIGlmICghUHJldmlvdXMuZW1wdHkoKSkgewogICAgICAgaWYgKFByZXZpb3VzLmlzU2luZ2xlUmVzdWx0KCkgJiYKQEAgLTU0NDAsMjQgKzU1MTUsMzcgQEAKICAgICAgIE5ld1ZELT5zZXRJbnZhbGlkRGVjbCgpOwogICAgIH0KIAotICAgIGlmICghSXNWYXJpYWJsZVRlbXBsYXRlU3BlY2lhbGl6YXRpb24pIHsKLSAgICAgIGlmIChQcmV2VmFyVGVtcGxhdGUpIHsKLSAgICAgICAgTG9va3VwUmVzdWx0IFByZXZEZWNsKCp0aGlzLCBHZXROYW1lRm9yRGVjbGFyYXRvcihEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb2t1cE9yZGluYXJ5TmFtZSwgRm9yUmVkZWNsYXJhdGlvbik7Ci0gICAgICAgIFByZXZEZWNsLmFkZERlY2woUHJldlZhclRlbXBsYXRlLT5nZXRUZW1wbGF0ZWREZWNsKCkpOwotICAgICAgICBELnNldFJlZGVjbGFyYXRpb24oQ2hlY2tWYXJpYWJsZURlY2xhcmF0aW9uKE5ld1ZELCBQcmV2RGVjbCkpOwotICAgICAgfSBlbHNlCi0gICAgICAgIEQuc2V0UmVkZWNsYXJhdGlvbihDaGVja1ZhcmlhYmxlRGVjbGFyYXRpb24oTmV3VkQsIFByZXZpb3VzKSk7Ci0gICAgfQorICAgIGlmICghSXNWYXJpYWJsZVRlbXBsYXRlU3BlY2lhbGl6YXRpb24pCisgICAgICBELnNldFJlZGVjbGFyYXRpb24oQ2hlY2tWYXJpYWJsZURlY2xhcmF0aW9uKE5ld1ZELCBQcmV2aW91cykpOwogCi0gICAgLy8gVGhpcyBpcyBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiBhIHN0YXRpYyBkYXRhIG1lbWJlci4gQ2hlY2sgaXQuCi0gICAgaWYgKElzRXhwbGljaXRTcGVjaWFsaXphdGlvbiAmJiAhTmV3VkQtPmlzSW52YWxpZERlY2woKSAmJgotICAgICAgICBDaGVja01lbWJlclNwZWNpYWxpemF0aW9uKE5ld1ZELCBQcmV2aW91cykpCi0gICAgICBOZXdWRC0+c2V0SW52YWxpZERlY2woKTsKKyAgICBpZiAoTmV3VGVtcGxhdGUpIHsKKyAgICAgIFZhclRlbXBsYXRlRGVjbCAqUHJldlZhclRlbXBsYXRlID0KKyAgICAgICAgICBOZXdWRC0+Z2V0UHJldmlvdXNEZWNsKCkKKyAgICAgICAgICAgICAgPyBOZXdWRC0+Z2V0UHJldmlvdXNEZWNsKCktPmdldERlc2NyaWJlZFZhclRlbXBsYXRlKCkKKyAgICAgICAgICAgICAgOiAwOworCisgICAgICAvLyBDaGVjayB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGxpc3Qgb2YgdGhpcyBkZWNsYXJhdGlvbiwgcG9zc2libHkKKyAgICAgIC8vIG1lcmdpbmcgaW4gdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0IGZyb20gdGhlIHByZXZpb3VzIHZhcmlhYmxlCisgICAgICAvLyB0ZW1wbGF0ZSBkZWNsYXJhdGlvbi4KKyAgICAgIGlmIChDaGVja1RlbXBsYXRlUGFyYW1ldGVyTGlzdCgKKyAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbXMsCisgICAgICAgICAgICAgIFByZXZWYXJUZW1wbGF0ZSA/IFByZXZWYXJUZW1wbGF0ZS0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCwKKyAgICAgICAgICAgICAgKEQuZ2V0Q1hYU2NvcGVTcGVjKCkuaXNTZXQoKSAmJiBEQyAmJiBEQy0+aXNSZWNvcmQoKSAmJgorICAgICAgICAgICAgICAgREMtPmlzRGVwZW5kZW50Q29udGV4dCgpKQorICAgICAgICAgICAgICAgICAgPyBUUENfQ2xhc3NUZW1wbGF0ZU1lbWJlcgorICAgICAgICAgICAgICAgICAgOiBUUENfVmFyVGVtcGxhdGUpKQorICAgICAgICBOZXdWRC0+c2V0SW52YWxpZERlY2woKTsKKworICAgICAgLy8gSWYgd2UgYXJlIHByb3ZpZGluZyBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiBhIHN0YXRpYyB2YXJpYWJsZQorICAgICAgLy8gdGVtcGxhdGUsIG1ha2UgYSBub3RlIG9mIHRoYXQuCisgICAgICBpZiAoUHJldlZhclRlbXBsYXRlICYmCisgICAgICAgICAgUHJldlZhclRlbXBsYXRlLT5nZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyVGVtcGxhdGUoKSkKKyAgICAgICAgUHJldlZhclRlbXBsYXRlLT5zZXRNZW1iZXJTcGVjaWFsaXphdGlvbigpOworICAgIH0KICAgfQogCiAgIFByb2Nlc3NQcmFnbWFXZWFrKFMsIE5ld1ZEKTsKLSAgY2hlY2tBdHRyaWJ1dGVzQWZ0ZXJNZXJnaW5nKCp0aGlzLCAqTmV3VkQpOwogCiAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGRlY2xhcmF0aW9uIG9mIGFuIGV4dGVybiBDIHZhcmlhYmxlLCB1cGRhdGUKICAgLy8gdGhlIG1hcCBvZiBzdWNoIHZhcmlhYmxlcy4KQEAgLTU0NzAsMTYgKzU1NTgsMjEgQEAKICAgICBpZiAoTWFuZ2xlTnVtYmVyaW5nQ29udGV4dCAqTUN0eCA9CiAgICAgICAgICAgICBnZXRDdXJyZW50TWFuZ2xlTnVtYmVyQ29udGV4dChOZXdWRC0+Z2V0RGVjbENvbnRleHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmdsaW5nQ29udGV4dERlY2wpKSB7Ci0gICAgICBDb250ZXh0LnNldE1hbmdsaW5nTnVtYmVyKE5ld1ZELCBNQ3R4LT5nZXRNYW5nbGluZ051bWJlcihOZXdWRCkpOworICAgICAgQ29udGV4dC5zZXRNYW5nbGluZ051bWJlcigKKyAgICAgICAgICBOZXdWRCwgTUN0eC0+Z2V0TWFuZ2xpbmdOdW1iZXIoTmV3VkQsIFMtPmdldE1TTG9jYWxNYW5nbGluZ051bWJlcigpKSk7CisgICAgICBDb250ZXh0LnNldFN0YXRpY0xvY2FsTnVtYmVyKE5ld1ZELCBNQ3R4LT5nZXRTdGF0aWNMb2NhbE51bWJlcihOZXdWRCkpOwogICAgIH0KICAgfQogCi0gIC8vIElmIHdlIGFyZSBwcm92aWRpbmcgYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gb2YgYSBzdGF0aWMgdmFyaWFibGUKLSAgLy8gdGVtcGxhdGUsIG1ha2UgYSBub3RlIG9mIHRoYXQuCi0gIGlmIChQcmV2VmFyVGVtcGxhdGUgJiYgUHJldlZhclRlbXBsYXRlLT5nZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyVGVtcGxhdGUoKSkKLSAgICBQcmV2VmFyVGVtcGxhdGUtPnNldE1lbWJlclNwZWNpYWxpemF0aW9uKCk7CisgIGlmIChELmlzUmVkZWNsYXJhdGlvbigpICYmICFQcmV2aW91cy5lbXB0eSgpKSB7CisgICAgY2hlY2tETExBdHRyaWJ1dGVSZWRlY2xhcmF0aW9uKAorICAgICAgICAqdGhpcywgZHluX2Nhc3Q8TmFtZWREZWNsPihQcmV2aW91cy5nZXRSZXByZXNlbnRhdGl2ZURlY2woKSksIE5ld1ZELAorICAgICAgICBJc0V4cGxpY2l0U3BlY2lhbGl6YXRpb24pOworICB9CiAKICAgaWYgKE5ld1RlbXBsYXRlKSB7CisgICAgaWYgKE5ld1ZELT5pc0ludmFsaWREZWNsKCkpCisgICAgICBOZXdUZW1wbGF0ZS0+c2V0SW52YWxpZERlY2woKTsKICAgICBBY3RPbkRvY3VtZW50YWJsZURlY2woTmV3VGVtcGxhdGUpOwogICAgIHJldHVybiBOZXdUZW1wbGF0ZTsKICAgfQpAQCAtNTUyNiwxMSArNTYxOSw5IEBACiAgICAgaWYgKHNoYWRvd2VkVmFyLT5pc0V4dGVybkMoKSkgewogICAgICAgLy8gRm9yIHNoYWRvd2luZyBleHRlcm5hbCB2YXJzLCBtYWtlIHN1cmUgdGhhdCB3ZSBwb2ludCB0byB0aGUgZ2xvYmFsCiAgICAgICAvLyBkZWNsYXJhdGlvbiwgbm90IGEgbG9jYWxseSBzY29wZWQgZXh0ZXJuIGRlY2xhcmF0aW9uLgotICAgICAgZm9yIChWYXJEZWNsOjpyZWRlY2xfaXRlcmF0b3IKLSAgICAgICAgICAgICBJID0gc2hhZG93ZWRWYXItPnJlZGVjbHNfYmVnaW4oKSwgRSA9IHNoYWRvd2VkVmFyLT5yZWRlY2xzX2VuZCgpOwotICAgICAgICAgICBJICE9IEU7ICsrSSkKKyAgICAgIGZvciAoYXV0byBJIDogc2hhZG93ZWRWYXItPnJlZGVjbHMoKSkKICAgICAgICAgaWYgKEktPmlzRmlsZVZhckRlY2woKSkgewotICAgICAgICAgIFNoYWRvd2VkRGVjbCA9ICpJOworICAgICAgICAgIFNoYWRvd2VkRGVjbCA9IEk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC01NTY2LDYgKzU2NTcsOCBAQAogICBEZWNsYXJhdGlvbk5hbWUgTmFtZSA9IFIuZ2V0TG9va3VwTmFtZSgpOwogCiAgIC8vIEVtaXQgd2FybmluZyBhbmQgbm90ZS4KKyAgaWYgKGdldFNvdXJjZU1hbmFnZXIoKS5pc0luU3lzdGVtTWFjcm8oUi5nZXROYW1lTG9jKCkpKQorICAgIHJldHVybjsKICAgRGlhZyhSLmdldE5hbWVMb2MoKSwgZGlhZzo6d2Fybl9kZWNsX3NoYWRvdykgPDwgTmFtZSA8PCBLaW5kIDw8IE9sZERDOwogICBEaWFnKFNoYWRvd2VkRGVjbC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcmV2aW91c19kZWNsYXJhdGlvbik7CiB9CkBAIC01NzExLDYgKzU4MDQsOSBAQAogICBpZiAoVC0+aXNVbmRlZHVjZWRUeXBlKCkpCiAgICAgcmV0dXJuOwogCisgIGlmIChOZXdWRC0+aGFzQXR0cnMoKSkKKyAgICBDaGVja0FsaWduYXNVbmRlcmFsaWdubWVudChOZXdWRCk7CisKICAgaWYgKFQtPmlzT2JqQ09iamVjdFR5cGUoKSkgewogICAgIERpYWcoTmV3VkQtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9zdGF0aWNhbGx5X2FsbG9jYXRlZF9vYmplY3QpCiAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihOZXdWRC0+Z2V0TG9jYXRpb24oKSwgIioiKTsKQEAgLTU4MjgsNyArNTkyNCw2IEBACiAgIGlmIChOZXdWRC0+aXNDb25zdGV4cHIoKSAmJiAhVC0+aXNEZXBlbmRlbnRUeXBlKCkgJiYKICAgICAgIFJlcXVpcmVMaXRlcmFsVHlwZShOZXdWRC0+Z2V0TG9jYXRpb24oKSwgVCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfY29uc3RleHByX3Zhcl9ub25fbGl0ZXJhbCkpIHsKLSAgICAvLyBDYW4ndCBwZXJmb3JtIHRoaXMgY2hlY2sgdW50aWwgdGhlIHR5cGUgaXMgZGVkdWNlZC4KICAgICBOZXdWRC0+c2V0SW52YWxpZERlY2woKTsKICAgICByZXR1cm47CiAgIH0KQEAgLTU5NDcsOSArNjA0Miw4IEBACiAgIGJvb2wgaGFzTm9uRGVsZXRlZE92ZXJyaWRlbk1ldGhvZHMgPSBmYWxzZTsKICAgYm9vbCBBZGRlZEFueSA9IGZhbHNlOwogICBpZiAoREMtPmxvb2t1cEluQmFzZXMoJkZpbmRPdmVycmlkZGVuTWV0aG9kLCAmRGF0YSwgUGF0aHMpKSB7Ci0gICAgZm9yIChDWFhCYXNlUGF0aHM6OmRlY2xfaXRlcmF0b3IgSSA9IFBhdGhzLmZvdW5kX2RlY2xzX2JlZ2luKCksCi0gICAgICAgICBFID0gUGF0aHMuZm91bmRfZGVjbHNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBpZiAoQ1hYTWV0aG9kRGVjbCAqT2xkTUQgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPigqSSkpIHsKKyAgICBmb3IgKGF1dG8gKkkgOiBQYXRocy5mb3VuZF9kZWNscygpKSB7CisgICAgICBpZiAoQ1hYTWV0aG9kRGVjbCAqT2xkTUQgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPihJKSkgewogICAgICAgICBNRC0+YWRkT3ZlcnJpZGRlbk1ldGhvZChPbGRNRC0+Z2V0Q2Fub25pY2FsRGVjbCgpKTsKICAgICAgICAgaWYgKCFDaGVja092ZXJyaWRpbmdGdW5jdGlvblJldHVyblR5cGUoTUQsIE9sZE1EKSAmJgogICAgICAgICAgICAgIUNoZWNrT3ZlcnJpZGluZ0Z1bmN0aW9uQXR0cmlidXRlcyhNRCwgT2xkTUQpICYmCkBAIC01OTk1LDcgKzYwODksNyBAQAogICAgICAgOiBDb250ZXh0KENvbnRleHQpLCBPcmlnaW5hbEZEKFR5cG9GRCksCiAgICAgICAgIEV4cGVjdGVkUGFyZW50KFBhcmVudCA/IFBhcmVudC0+Z2V0Q2Fub25pY2FsRGVjbCgpIDogMCkge30KIAotICB2aXJ0dWFsIGJvb2wgVmFsaWRhdGVDYW5kaWRhdGUoY29uc3QgVHlwb0NvcnJlY3Rpb24gJmNhbmRpZGF0ZSkgeworICBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIG92ZXJyaWRlIHsKICAgICBpZiAoY2FuZGlkYXRlLmdldEVkaXREaXN0YW5jZSgpID09IDApCiAgICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTYyNTQsMTAgKzYzNDgsOSBAQAogICAvLyBGb3IgcmVjb3JkIHR5cGVzLCB0aGlzIGlzIGRvbmUgYnkgdGhlIEFic3RyYWN0Q2xhc3NVc2FnZURpYWdub3NlciBvbmNlCiAgIC8vIHRoZSBjbGFzcyBoYXMgYmVlbiBjb21wbGV0ZWx5IHBhcnNlZC4KICAgaWYgKCFEQy0+aXNSZWNvcmQoKSAmJgotICAgICAgU2VtYVJlZi5SZXF1aXJlTm9uQWJzdHJhY3RUeXBlKEQuZ2V0SWRlbnRpZmllckxvYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFItPmdldEFzPEZ1bmN0aW9uVHlwZT4oKS0+Z2V0UmVzdWx0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6OmVycl9hYnN0cmFjdF90eXBlX2luX2RlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYVJlZi5BYnN0cmFjdFJldHVyblR5cGUpKQorICAgICAgU2VtYVJlZi5SZXF1aXJlTm9uQWJzdHJhY3RUeXBlKAorICAgICAgICAgIEQuZ2V0SWRlbnRpZmllckxvYygpLCBSLT5nZXRBczxGdW5jdGlvblR5cGU+KCktPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICBkaWFnOjplcnJfYWJzdHJhY3RfdHlwZV9pbl9kZWNsLCBTZW1hUmVmLkFic3RyYWN0UmV0dXJuVHlwZSkpCiAgICAgRC5zZXRJbnZhbGlkVHlwZSgpOwogCiAgIGlmIChOYW1lLmdldE5hbWVLaW5kKCkgPT0gRGVjbGFyYXRpb25OYW1lOjpDWFhDb25zdHJ1Y3Rvck5hbWUpIHsKQEAgLTYyOTIsMTUgKzYzODUsNiBAQAogICAgICAgICBTZW1hUmVmLkFkanVzdERlc3RydWN0b3JFeGNlcHRpb25TcGVjKFJlY29yZCwgTmV3REQpOwogICAgICAgfQogCi0gICAgICAvLyBUaGUgTWljcm9zb2Z0IEFCSSByZXF1aXJlcyB0aGF0IHdlIHBlcmZvcm0gdGhlIGRlc3RydWN0b3IgYm9keQotICAgICAgLy8gY2hlY2tzIChpLmUuIG9wZXJhdG9yIGRlbGV0ZSgpIGxvb2t1cCkgYXQgZXZlcnkgZGVjbGFyYXRpb24sIGFzCi0gICAgICAvLyBhbnkgdHJhbnNsYXRpb24gdW5pdCBtYXkgbmVlZCB0byBlbWl0IGEgZGVsZXRpbmcgZGVzdHJ1Y3Rvci4KLSAgICAgIGlmIChTZW1hUmVmLkNvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldENYWEFCSSgpLmlzTWljcm9zb2Z0KCkgJiYKLSAgICAgICAgICAhUmVjb3JkLT5pc0RlcGVuZGVudFR5cGUoKSAmJiBSZWNvcmQtPmdldERlZmluaXRpb24oKSAmJgotICAgICAgICAgICFSZWNvcmQtPmlzQmVpbmdEZWZpbmVkKCkpIHsKLSAgICAgICAgU2VtYVJlZi5DaGVja0Rlc3RydWN0b3IoTmV3REQpOwotICAgICAgfQotCiAgICAgICBJc1ZpcnR1YWxPa2F5ID0gdHJ1ZTsKICAgICAgIHJldHVybiBOZXdERDsKIApAQCAtNjM2MywyNiArNjQ0NywxMSBAQAogICB9CiB9CiAKLXZvaWQgU2VtYTo6Y2hlY2tWb2lkUGFyYW1EZWNsKFBhcm1WYXJEZWNsICpQYXJhbSkgewotICAvLyBJbiBDKyssIHRoZSBlbXB0eSBwYXJhbWV0ZXItdHlwZS1saXN0IG11c3QgYmUgc3BlbGxlZCAidm9pZCI7IGEKLSAgLy8gdHlwZWRlZiBvZiB2b2lkIGlzIG5vdCBwZXJtaXR0ZWQuCi0gIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyAmJgotICAgICAgUGFyYW0tPmdldFR5cGUoKS5nZXRVbnF1YWxpZmllZFR5cGUoKSAhPSBDb250ZXh0LlZvaWRUeSkgewotICAgIGJvb2wgSXNUeXBlQWxpYXMgPSBmYWxzZTsKLSAgICBpZiAoY29uc3QgVHlwZWRlZlR5cGUgKlRUID0gUGFyYW0tPmdldFR5cGUoKS0+Z2V0QXM8VHlwZWRlZlR5cGU+KCkpCi0gICAgICBJc1R5cGVBbGlhcyA9IGlzYTxUeXBlQWxpYXNEZWNsPihUVC0+Z2V0RGVjbCgpKTsKLSAgICBlbHNlIGlmIChjb25zdCBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZSAqVFNUID0KLSAgICAgICAgICAgICAgIFBhcmFtLT5nZXRUeXBlKCktPmdldEFzPFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlPigpKQotICAgICAgSXNUeXBlQWxpYXMgPSBUU1QtPmlzVHlwZUFsaWFzKCk7Ci0gICAgRGlhZyhQYXJhbS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX3BhcmFtX3R5cGVkZWZfb2Zfdm9pZCkKLSAgICAgIDw8IElzVHlwZUFsaWFzOwotICB9Ci19Ci0KIGVudW0gT3BlbkNMUGFyYW1UeXBlIHsKICAgVmFsaWRLZXJuZWxQYXJhbSwKICAgUHRyUHRyS2VybmVsUGFyYW0sCiAgIFB0cktlcm5lbFBhcmFtLAorICBQcml2YXRlUHRyS2VybmVsUGFyYW0sCiAgIEludmFsaWRLZXJuZWxQYXJhbSwKICAgUmVjb3JkS2VybmVsUGFyYW0KIH07CkBAIC02MzkwLDcgKzY0NTksMTAgQEAKIHN0YXRpYyBPcGVuQ0xQYXJhbVR5cGUgZ2V0T3BlbkNMS2VybmVsUGFyYW1ldGVyVHlwZShRdWFsVHlwZSBQVCkgewogICBpZiAoUFQtPmlzUG9pbnRlclR5cGUoKSkgewogICAgIFF1YWxUeXBlIFBvaW50ZWVUeXBlID0gUFQtPmdldFBvaW50ZWVUeXBlKCk7Ci0gICAgcmV0dXJuIFBvaW50ZWVUeXBlLT5pc1BvaW50ZXJUeXBlKCkgPyBQdHJQdHJLZXJuZWxQYXJhbSA6IFB0cktlcm5lbFBhcmFtOworICAgIGlmIChQb2ludGVlVHlwZS0+aXNQb2ludGVyVHlwZSgpKQorICAgICAgcmV0dXJuIFB0clB0cktlcm5lbFBhcmFtOworICAgIHJldHVybiBQb2ludGVlVHlwZS5nZXRBZGRyZXNzU3BhY2UoKSA9PSAwID8gUHJpdmF0ZVB0cktlcm5lbFBhcmFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQdHJLZXJuZWxQYXJhbTsKICAgfQogCiAgIC8vIFRPRE86IEZvcmJpZCB0aGUgb3RoZXIgaW50ZWdlciB0eXBlcyAoc2l6ZV90LCBwdHJkaWZmX3QuLi4pIHdoZW4gdGhleSBjYW4KQEAgLTY0MzUsNiArNjUwNywxNCBAQAogICAgIEQuc2V0SW52YWxpZFR5cGUoKTsKICAgICByZXR1cm47CiAKKyAgY2FzZSBQcml2YXRlUHRyS2VybmVsUGFyYW06CisgICAgLy8gT3BlbkNMIHYxLjIgczYuOS5hOgorICAgIC8vIEEga2VybmVsIGZ1bmN0aW9uIGFyZ3VtZW50IGNhbm5vdCBiZSBkZWNsYXJlZCBhcyBhCisgICAgLy8gcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBhZGRyZXNzIHNwYWNlLgorICAgIFMuRGlhZyhQYXJhbS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX29wZW5jbF9wcml2YXRlX3B0cl9rZXJuZWxfcGFyYW0pOworICAgIEQuc2V0SW52YWxpZFR5cGUoKTsKKyAgICByZXR1cm47CisKICAgICAvLyBPcGVuQ0wgdjEuMiBzNi45Lms6CiAgICAgLy8gQXJndW1lbnRzIHRvIGtlcm5lbCBmdW5jdGlvbnMgaW4gYSBwcm9ncmFtIGNhbm5vdCBiZSBkZWNsYXJlZCB3aXRoIHRoZQogICAgIC8vIGJ1aWx0LWluIHNjYWxhciB0eXBlcyBib29sLCBoYWxmLCBzaXplX3QsIHB0cmRpZmZfdCwgaW50cHRyX3QsIGFuZApAQCAtNjQ5NSw5ICs2NTc1LDcgQEAKICAgICAvLyBBZGQgYSBudWxsIG1hcmtlciBzbyB3ZSBrbm93IHdoZW4gd2UndmUgZ29uZSBiYWNrIHVwIGEgbGV2ZWwKICAgICBWaXNpdFN0YWNrLnB1c2hfYmFjaygoY29uc3QgRGVjbCAqKSAwKTsKIAotICAgIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgSSA9IFJELT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICBFID0gUkQtPmZpZWxkX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgY29uc3QgRmllbGREZWNsICpGRCA9ICpJOworICAgIGZvciAoY29uc3QgYXV0byAqRkQgOiBSRC0+ZmllbGRzKCkpIHsKICAgICAgIFF1YWxUeXBlIFFUID0gRkQtPmdldFR5cGUoKTsKIAogICAgICAgaWYgKFZhbGlkVHlwZXMuY291bnQoUVQuZ2V0VHlwZVB0cigpKSkKQEAgLTY1MTYsNyArNjU5NCw4IEBACiAgICAgICAvLyBBcmd1bWVudHMgdG8ga2VybmVsIGZ1bmN0aW9ucyB0aGF0IGFyZSBkZWNsYXJlZCB0byBiZSBhIHN0cnVjdCBvciB1bmlvbgogICAgICAgLy8gZG8gbm90IGFsbG93IE9wZW5DTCBvYmplY3RzIHRvIGJlIHBhc3NlZCBhcyBlbGVtZW50cyBvZiB0aGUgc3RydWN0IG9yCiAgICAgICAvLyB1bmlvbi4KLSAgICAgIGlmIChQYXJhbVR5cGUgPT0gUHRyS2VybmVsUGFyYW0gfHwgUGFyYW1UeXBlID09IFB0clB0cktlcm5lbFBhcmFtKSB7CisgICAgICBpZiAoUGFyYW1UeXBlID09IFB0cktlcm5lbFBhcmFtIHx8IFBhcmFtVHlwZSA9PSBQdHJQdHJLZXJuZWxQYXJhbSB8fAorICAgICAgICAgIFBhcmFtVHlwZSA9PSBQcml2YXRlUHRyS2VybmVsUGFyYW0pIHsKICAgICAgICAgUy5EaWFnKFBhcmFtLT5nZXRMb2NhdGlvbigpLAogICAgICAgICAgICAgICAgZGlhZzo6ZXJyX3JlY29yZF93aXRoX3BvaW50ZXJzX2tlcm5lbF9wYXJhbSkKICAgICAgICAgICA8PCBQVC0+aXNVbmlvblR5cGUoKQpAQCAtNjc0MiwxNCArNjgyMSwxNCBAQAogICAgICAgfQogCiAgICAgICBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxeSAmJgotICAgICAgICAgIE5ld0ZELT5nZXRSZXN1bHRUeXBlKCktPmlzVW5kZWR1Y2VkVHlwZSgpKQorICAgICAgICAgIE5ld0ZELT5nZXRSZXR1cm5UeXBlKCktPmlzVW5kZWR1Y2VkVHlwZSgpKQogICAgICAgICBEaWFnKEQuZ2V0RGVjbFNwZWMoKS5nZXRWaXJ0dWFsU3BlY0xvYygpLCBkaWFnOjplcnJfYXV0b19mbl92aXJ0dWFsKTsKICAgICB9CiAKICAgICBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxeSAmJgogICAgICAgICAoTmV3RkQtPmlzRGVwZW5kZW50Q29udGV4dCgpIHx8CiAgICAgICAgICAoaXNGcmllbmQgJiYgQ3VyQ29udGV4dC0+aXNEZXBlbmRlbnRDb250ZXh0KCkpKSAmJgotICAgICAgICBOZXdGRC0+Z2V0UmVzdWx0VHlwZSgpLT5pc1VuZGVkdWNlZFR5cGUoKSkgeworICAgICAgICBOZXdGRC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1VuZGVkdWNlZFR5cGUoKSkgewogICAgICAgLy8gSWYgdGhlIGZ1bmN0aW9uIHRlbXBsYXRlIGlzIHJlZmVyZW5jZWQgZGlyZWN0bHkgKGZvciBpbnN0YW5jZSwgYXMgYQogICAgICAgLy8gbWVtYmVyIG9mIHRoZSBjdXJyZW50IGluc3RhbnRpYXRpb24pLCBwcmV0ZW5kIGl0IGhhcyBhIGRlcGVuZGVudCB0eXBlLgogICAgICAgLy8gVGhpcyBpcyBub3QgcmVhbGx5IGp1c3RpZmllZCBieSB0aGUgc3RhbmRhcmQsIGJ1dCBpcyB0aGUgb25seSBzYW5lCkBAIC02NzU4LDkgKzY4MzcsOSBAQAogICAgICAgLy8gYSBmcmllbmQgeWV0LCBzbyAnaXNEZXBlbmRlbnRDb250ZXh0JyBvbiB0aGUgRkQgZG9lc24ndCB3b3JrLgogICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9CiAgICAgICAgICAgTmV3RkQtPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwotICAgICAgUXVhbFR5cGUgUmVzdWx0ID0gU3Vic3RBdXRvVHlwZShGUFQtPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuRGVwZW5kZW50VHkpOwotICAgICAgTmV3RkQtPnNldFR5cGUoQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoUmVzdWx0LCBGUFQtPmdldEFyZ1R5cGVzKCksCisgICAgICBRdWFsVHlwZSBSZXN1bHQgPQorICAgICAgICAgIFN1YnN0QXV0b1R5cGUoRlBULT5nZXRSZXR1cm5UeXBlKCksIENvbnRleHQuRGVwZW5kZW50VHkpOworICAgICAgTmV3RkQtPnNldFR5cGUoQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoUmVzdWx0LCBGUFQtPmdldFBhcmFtVHlwZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQVC0+Z2V0RXh0UHJvdG9JbmZvKCkpKTsKICAgICB9CiAKQEAgLTY4MzMsNiArNjkxMiw4IEBACiAgICAgfQogCiAgICAgLy8gSWYgYSBmdW5jdGlvbiBpcyBkZWZpbmVkIGFzIGRlZmF1bHRlZCBvciBkZWxldGVkLCBtYXJrIGl0IGFzIHN1Y2ggbm93LgorICAgIC8vIEZJWE1FOiBEb2VzIHRoaXMgZXZlciBoYXBwZW4/IEFjdE9uU3RhcnRPZkZ1bmN0aW9uRGVmIGZvcmNlcyB0aGUgZnVuY3Rpb24KKyAgICAvLyBkZWZpbml0aW9uIGtpbmQgdG8gRkRLX0RlZmluaXRpb24uCiAgICAgc3dpdGNoIChELmdldEZ1bmN0aW9uRGVmaW5pdGlvbktpbmQoKSkgewogICAgICAgY2FzZSBGREtfRGVjbGFyYXRpb246CiAgICAgICBjYXNlIEZES19EZWZpbml0aW9uOgpAQCAtNjg3OCwxMyArNjk1OSwxNCBAQAogICAgICAgICBnZXRMYW5nT3B0cygpLkNQbHVzUGx1czExICYmIEZQVCAmJiAhRlBULT5oYXNFeGNlcHRpb25TcGVjKCkpIHsKICAgICAgIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gRVBJID0gRlBULT5nZXRFeHRQcm90b0luZm8oKTsKICAgICAgIEVQSS5FeGNlcHRpb25TcGVjVHlwZSA9IEVTVF9CYXNpY05vZXhjZXB0OwotICAgICAgTmV3RkQtPnNldFR5cGUoQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoRlBULT5nZXRSZXN1bHRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFQtPmdldEFyZ1R5cGVzKCksIEVQSSkpOworICAgICAgTmV3RkQtPnNldFR5cGUoQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoRlBULT5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFQtPmdldFBhcmFtVHlwZXMoKSwgRVBJKSk7CiAgICAgfQogICB9CiAKICAgLy8gRmlsdGVyIG91dCBwcmV2aW91cyBkZWNsYXJhdGlvbnMgdGhhdCBkb24ndCBtYXRjaCB0aGUgc2NvcGUuCiAgIEZpbHRlckxvb2t1cEZvclNjb3BlKFByZXZpb3VzLCBPcmlnaW5hbERDLCBTLCBzaG91bGRDb25zaWRlckxpbmthZ2UoTmV3RkQpLAorICAgICAgICAgICAgICAgICAgICAgICBELmdldENYWFNjb3BlU3BlYygpLmlzTm90RW1wdHkoKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBpc0V4cGxpY2l0U3BlY2lhbGl6YXRpb24gfHwKICAgICAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvblRlbXBsYXRlU3BlY2lhbGl6YXRpb24pOwogCkBAIC02ODkzLDcgKzY5NzUsNyBAQAogICAgIC8vIFRoZSBwYXJzZXIgZ3VhcmFudGVlcyB0aGlzIGlzIGEgc3RyaW5nLgogICAgIFN0cmluZ0xpdGVyYWwgKlNFID0gY2FzdDxTdHJpbmdMaXRlcmFsPihFKTsKICAgICBOZXdGRC0+YWRkQXR0cig6Om5ldyAoQ29udGV4dCkgQXNtTGFiZWxBdHRyKFNFLT5nZXRTdHJUb2tlbkxvYygwKSwgQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFLT5nZXRTdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0UtPmdldFN0cmluZygpLCAwKSk7CiAgIH0gZWxzZSBpZiAoIUV4dG5hbWVVbmRlY2xhcmVkSWRlbnRpZmllcnMuZW1wdHkoKSkgewogICAgIGxsdm06OkRlbnNlTWFwPElkZW50aWZpZXJJbmZvKixBc21MYWJlbEF0dHIqPjo6aXRlcmF0b3IgSSA9CiAgICAgICBFeHRuYW1lVW5kZWNsYXJlZElkZW50aWZpZXJzLmZpbmQoTmV3RkQtPmdldElkZW50aWZpZXIoKSk7CkBAIC02OTE0LDE0ICs2OTk2LDEzIEBACiAgICAgLy8gc2luZ2xlIHZvaWQgYXJndW1lbnQuCiAgICAgLy8gV2UgbGV0IHRocm91Z2ggImNvbnN0IHZvaWQiIGhlcmUgYmVjYXVzZSBTZW1hOjpHZXRUeXBlRm9yRGVjbGFyYXRvcgogICAgIC8vIGFscmVhZHkgY2hlY2tzIGZvciB0aGF0IGNhc2UuCi0gICAgaWYgKEZUSS5OdW1BcmdzID09IDEgJiYgIUZUSS5pc1ZhcmlhZGljICYmIEZUSS5BcmdJbmZvWzBdLklkZW50ID09IDAgJiYKLSAgICAgICAgRlRJLkFyZ0luZm9bMF0uUGFyYW0gJiYKLSAgICAgICAgY2FzdDxQYXJtVmFyRGVjbD4oRlRJLkFyZ0luZm9bMF0uUGFyYW0pLT5nZXRUeXBlKCktPmlzVm9pZFR5cGUoKSkgeworICAgIGlmIChGVEkuTnVtUGFyYW1zID09IDEgJiYgIUZUSS5pc1ZhcmlhZGljICYmIEZUSS5QYXJhbXNbMF0uSWRlbnQgPT0gMCAmJgorICAgICAgICBGVEkuUGFyYW1zWzBdLlBhcmFtICYmCisgICAgICAgIGNhc3Q8UGFybVZhckRlY2w+KEZUSS5QYXJhbXNbMF0uUGFyYW0pLT5nZXRUeXBlKCktPmlzVm9pZFR5cGUoKSkgewogICAgICAgLy8gRW1wdHkgYXJnIGxpc3QsIGRvbid0IHB1c2ggYW55IHBhcmFtcy4KLSAgICAgIGNoZWNrVm9pZFBhcmFtRGVjbChjYXN0PFBhcm1WYXJEZWNsPihGVEkuQXJnSW5mb1swXS5QYXJhbSkpOwotICAgIH0gZWxzZSBpZiAoRlRJLk51bUFyZ3MgPiAwICYmIEZUSS5BcmdJbmZvWzBdLlBhcmFtICE9IDApIHsKLSAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVEkuTnVtQXJnczsgaSAhPSBlOyArK2kpIHsKLSAgICAgICAgUGFybVZhckRlY2wgKlBhcmFtID0gY2FzdDxQYXJtVmFyRGVjbD4oRlRJLkFyZ0luZm9baV0uUGFyYW0pOworICAgIH0gZWxzZSBpZiAoRlRJLk51bVBhcmFtcyA+IDAgJiYgRlRJLlBhcmFtc1swXS5QYXJhbSAhPSAwKSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRlRJLk51bVBhcmFtczsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgUGFybVZhckRlY2wgKlBhcmFtID0gY2FzdDxQYXJtVmFyRGVjbD4oRlRJLlBhcmFtc1tpXS5QYXJhbSk7CiAgICAgICAgIGFzc2VydChQYXJhbS0+Z2V0RGVjbENvbnRleHQoKSAhPSBOZXdGRCAmJiAiV2FzIHNldCBiZWZvcmUgPyIpOwogICAgICAgICBQYXJhbS0+c2V0RGVjbENvbnRleHQoTmV3RkQpOwogICAgICAgICBQYXJhbXMucHVzaF9iYWNrKFBhcmFtKTsKQEAgLTY5NDIsMTAgKzcwMjMsOSBAQAogICAgIC8vIEBlbmRjb2RlCiAKICAgICAvLyBTeW50aGVzaXplIGEgcGFyYW1ldGVyIGZvciBlYWNoIGFyZ3VtZW50IHR5cGUuCi0gICAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6YXJnX3R5cGVfaXRlcmF0b3IgQUkgPSBGVC0+YXJnX3R5cGVfYmVnaW4oKSwKLSAgICAgICAgIEFFID0gRlQtPmFyZ190eXBlX2VuZCgpOyBBSSAhPSBBRTsgKytBSSkgeworICAgIGZvciAoY29uc3QgYXV0byAmQUkgOiBGVC0+cGFyYW1fdHlwZXMoKSkgewogICAgICAgUGFybVZhckRlY2wgKlBhcmFtID0KLSAgICAgICAgQnVpbGRQYXJtVmFyRGVjbEZvclR5cGVkZWYoTmV3RkQsIEQuZ2V0SWRlbnRpZmllckxvYygpLCAqQUkpOworICAgICAgICAgIEJ1aWxkUGFybVZhckRlY2xGb3JUeXBlZGVmKE5ld0ZELCBELmdldElkZW50aWZpZXJMb2MoKSwgQUkpOwogICAgICAgUGFyYW0tPnNldFNjb3BlSW5mbygwLCBQYXJhbXMuc2l6ZSgpKTsKICAgICAgIFBhcmFtcy5wdXNoX2JhY2soUGFyYW0pOwogICAgIH0KQEAgLTY5NjksMTIgKzcwNDksMTIgQEAKICAgaWYgKEQuZ2V0RGVjbFNwZWMoKS5pc05vcmV0dXJuU3BlY2lmaWVkKCkpCiAgICAgTmV3RkQtPmFkZEF0dHIoCiAgICAgICAgIDo6bmV3KENvbnRleHQpIEMxMU5vUmV0dXJuQXR0cihELmdldERlY2xTcGVjKCkuZ2V0Tm9yZXR1cm5TcGVjTG9jKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LCAwKSk7CiAKICAgLy8gRnVuY3Rpb25zIHJldHVybmluZyBhIHZhcmlhYmx5IG1vZGlmaWVkIHR5cGUgdmlvbGF0ZSBDOTkgNi43LjUuMnAyCiAgIC8vIGJlY2F1c2UgYWxsIGZ1bmN0aW9ucyBoYXZlIGxpbmthZ2UuCiAgIGlmICghTmV3RkQtPmlzSW52YWxpZERlY2woKSAmJgotICAgICAgTmV3RkQtPmdldFJlc3VsdFR5cGUoKS0+aXNWYXJpYWJseU1vZGlmaWVkVHlwZSgpKSB7CisgICAgICBOZXdGRC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZhcmlhYmx5TW9kaWZpZWRUeXBlKCkpIHsKICAgICBEaWFnKE5ld0ZELT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfdm1fZnVuY19kZWNsKTsKICAgICBOZXdGRC0+c2V0SW52YWxpZERlY2woKTsKICAgfQpAQCAtNjk4MiwxNyArNzA2MiwyOSBAQAogICAvLyBIYW5kbGUgYXR0cmlidXRlcy4KICAgUHJvY2Vzc0RlY2xBdHRyaWJ1dGVzKFMsIE5ld0ZELCBEKTsKIAotICBRdWFsVHlwZSBSZXRUeXBlID0gTmV3RkQtPmdldFJlc3VsdFR5cGUoKTsKKyAgUXVhbFR5cGUgUmV0VHlwZSA9IE5ld0ZELT5nZXRSZXR1cm5UeXBlKCk7CiAgIGNvbnN0IENYWFJlY29yZERlY2wgKlJldCA9IFJldFR5cGUtPmlzUmVjb3JkVHlwZSgpID8KICAgICAgIFJldFR5cGUtPmdldEFzQ1hYUmVjb3JkRGVjbCgpIDogUmV0VHlwZS0+Z2V0UG9pbnRlZUNYWFJlY29yZERlY2woKTsKICAgaWYgKCFOZXdGRC0+aXNJbnZhbGlkRGVjbCgpICYmICFOZXdGRC0+aGFzQXR0cjxXYXJuVW51c2VkUmVzdWx0QXR0cj4oKSAmJgogICAgICAgUmV0ICYmIFJldC0+aGFzQXR0cjxXYXJuVW51c2VkUmVzdWx0QXR0cj4oKSkgewogICAgIGNvbnN0IENYWE1ldGhvZERlY2wgKk1EID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4oTmV3RkQpOwotICAgIC8vIEF0dGFjaCB0aGUgYXR0cmlidXRlIHRvIHRoZSBuZXcgZGVjbC4gRG9uJ3QgYXBwbHkgdGhlIGF0dHJpYnV0ZSBpZiBpdAotICAgIC8vIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIChlLmcuIGFzc2lnbm1lbnQgb3BlcmF0b3JzKS4KLSAgICBpZiAoIU1EIHx8IE1ELT5nZXRQYXJlbnQoKSAhPSBSZXQpIHsKLSAgICAgIE5ld0ZELT5hZGRBdHRyKG5ldyAoQ29udGV4dCkgV2FyblVudXNlZFJlc3VsdEF0dHIoU291cmNlUmFuZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCkpOworICAgIC8vIEF0dGFjaCBXYXJuVW51c2VkUmVzdWx0IHRvIGZ1bmN0aW9ucyByZXR1cm5pbmcgdHlwZXMgd2l0aCB0aGF0IGF0dHJpYnV0ZS4KKyAgICAvLyBEb24ndCBhcHBseSB0aGUgYXR0cmlidXRlIHRvIHRoYXQgdHlwZSdzIG93biBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbnMKKyAgICAvLyAodG8gYXZvaWQgd2FybmluZyBvbiB0aGluZ3MgbGlrZSBhc3NpZ25tZW50IG9wZXJhdG9ycykKKyAgICBpZiAoIU1EIHx8IE1ELT5nZXRQYXJlbnQoKSAhPSBSZXQpCisgICAgICBOZXdGRC0+YWRkQXR0cihXYXJuVW51c2VkUmVzdWx0QXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCkpOworICB9CisKKyAgaWYgKGdldExhbmdPcHRzKCkuT3BlbkNMKSB7CisgICAgLy8gT3BlbkNMIHYxLjEgczYuNTogVXNpbmcgYW4gYWRkcmVzcyBzcGFjZSBxdWFsaWZpZXIgaW4gYSBmdW5jdGlvbiByZXR1cm4KKyAgICAvLyB0eXBlIGRlY2xhcmF0aW9uIHdpbGwgZ2VuZXJhdGUgYSBjb21waWxhdGlvbiBlcnJvci4KKyAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UgPSBSZXRUeXBlLmdldEFkZHJlc3NTcGFjZSgpOworICAgIGlmIChBZGRyZXNzU3BhY2UgPT0gTGFuZ0FTOjpvcGVuY2xfbG9jYWwgfHwKKyAgICAgICAgQWRkcmVzc1NwYWNlID09IExhbmdBUzo6b3BlbmNsX2dsb2JhbCB8fAorICAgICAgICBBZGRyZXNzU3BhY2UgPT0gTGFuZ0FTOjpvcGVuY2xfY29uc3RhbnQpIHsKKyAgICAgIERpYWcoTmV3RkQtPmdldExvY2F0aW9uKCksCisgICAgICAgICAgIGRpYWc6OmVycl9vcGVuY2xfcmV0dXJuX3ZhbHVlX3dpdGhfYWRkcmVzc19zcGFjZSk7CisgICAgICBOZXdGRC0+c2V0SW52YWxpZERlY2woKTsKICAgICB9CiAgIH0KIApAQCAtNzE0MSwxMiArNzIzMyw3IEBACiAgICAgICBpZiAoIU5ld0ZELT5pc0ludmFsaWREZWNsKCkgJiYgTmV3RkQtPmlzTVNWQ1JURW50cnlQb2ludCgpKQogICAgICAgICBDaGVja01TVkNSVEVudHJ5UG9pbnQoTmV3RkQpOwogCi0gICAgICBpZiAoTmV3RkQtPmlzSW52YWxpZERlY2woKSkgewotICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY2xhc3MgbWVtYmVyLCBtYXJrIHRoZSBjbGFzcyBpbnZhbGlkIGltbWVkaWF0ZWx5LgotICAgICAgICAvLyBUaGlzIGF2b2lkcyBzb21lIGNvbnNpc3RlbmN5IGVycm9ycyBsYXRlci4KLSAgICAgICAgaWYgKENYWE1ldGhvZERlY2wqIG1ldGhvZERlY2wgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPihOZXdGRCkpCi0gICAgICAgICAgbWV0aG9kRGVjbC0+Z2V0UGFyZW50KCktPnNldEludmFsaWREZWNsKCk7Ci0gICAgICB9IGVsc2UKKyAgICAgIGlmICghTmV3RkQtPmlzSW52YWxpZERlY2woKSkKICAgICAgICAgRC5zZXRSZWRlY2xhcmF0aW9uKENoZWNrRnVuY3Rpb25EZWNsYXJhdGlvbihTLCBOZXdGRCwgUHJldmlvdXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHBsaWNpdFNwZWNpYWxpemF0aW9uKSk7CiAgICAgfQpAQCAtNzI0OCwxMSArNzMzNSwxMiBAQAogICAgICAgICB9CiAgICAgICB9CiAKLSAgICB9IGVsc2UgaWYgKCFELmlzRnVuY3Rpb25EZWZpbml0aW9uKCkgJiYgRC5nZXRDWFhTY29wZVNwZWMoKS5pc1NldCgpICYmCisgICAgfSBlbHNlIGlmICghRC5pc0Z1bmN0aW9uRGVmaW5pdGlvbigpICYmCisgICAgICAgICAgICAgICBpc2E8Q1hYTWV0aG9kRGVjbD4oTmV3RkQpICYmIE5ld0ZELT5pc091dE9mTGluZSgpICYmCiAgICAgICAgICAgICAgICAhaXNGcmllbmQgJiYgIWlzRnVuY3Rpb25UZW1wbGF0ZVNwZWNpYWxpemF0aW9uICYmCiAgICAgICAgICAgICAgICAhaXNFeHBsaWNpdFNwZWNpYWxpemF0aW9uKSB7CiAgICAgICAvLyBBbiBvdXQtb2YtbGluZSBtZW1iZXIgZnVuY3Rpb24gZGVjbGFyYXRpb24gbXVzdCBhbHNvIGJlIGEKLSAgICAgIC8vIGRlZmluaXRpb24gKEMrKyBbZGNsLm1lYW5pbmddcDEpLgorICAgICAgLy8gZGVmaW5pdGlvbiAoQysrIFtjbGFzcy5tZmN0XXAyKS4KICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgY2FzZSBmb3IgZXhwbGljaXQgc3BlY2lhbGl6YXRpb25zIG9mCiAgICAgICAvLyBmdW5jdGlvbiB0ZW1wbGF0ZXMgb3IgbWVtYmVyIGZ1bmN0aW9ucyBvZiBjbGFzcyB0ZW1wbGF0ZXMsIHBlcgogICAgICAgLy8gQysrIFt0ZW1wLmV4cGwuc3BlY11wMi4gV2UgYWxzbyBhbGxvdyB0aGVzZSBkZWNsYXJhdGlvbnMgYXMgYW4gCkBAIC03MjgxLDcgKzczNjksNyBAQAogICAgIEVQSS5WYXJpYWRpYyA9IHRydWU7CiAgICAgRVBJLkV4dEluZm8gPSBGVC0+Z2V0RXh0SW5mbygpOwogCi0gICAgUXVhbFR5cGUgUiA9IENvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKEZULT5nZXRSZXN1bHRUeXBlKCksIE5vbmUsIEVQSSk7CisgICAgUXVhbFR5cGUgUiA9IENvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKEZULT5nZXRSZXR1cm5UeXBlKCksIE5vbmUsIEVQSSk7CiAgICAgTmV3RkQtPnNldFR5cGUoUik7CiAgIH0KIApAQCAtNzMwMyw2ICs3MzkxLDEyIEBACiAgIC8vIFNldCB0aGlzIEZ1bmN0aW9uRGVjbCdzIHJhbmdlIHVwIHRvIHRoZSByaWdodCBwYXJlbi4KICAgTmV3RkQtPnNldFJhbmdlRW5kKEQuZ2V0U291cmNlUmFuZ2UoKS5nZXRFbmQoKSk7CiAKKyAgaWYgKEQuaXNSZWRlY2xhcmF0aW9uKCkgJiYgIVByZXZpb3VzLmVtcHR5KCkpIHsKKyAgICBjaGVja0RMTEF0dHJpYnV0ZVJlZGVjbGFyYXRpb24oCisgICAgICAgICp0aGlzLCBkeW5fY2FzdDxOYW1lZERlY2w+KFByZXZpb3VzLmdldFJlcHJlc2VudGF0aXZlRGVjbCgpKSwgTmV3RkQsCisgICAgICAgIGlzRXhwbGljaXRTcGVjaWFsaXphdGlvbiB8fCBpc0Z1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbik7CisgIH0KKwogICBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMpIHsKICAgICBpZiAoRnVuY3Rpb25UZW1wbGF0ZSkgewogICAgICAgaWYgKE5ld0ZELT5pc0ludmFsaWREZWNsKCkpCkBAIC03MzIwLDE4ICs3NDE0LDE1IEBACiAgICAgfQogICAgIAogICAgIC8vIE9wZW5DTCB2MS4yLCBzNi45IC0tIEtlcm5lbHMgY2FuIG9ubHkgaGF2ZSByZXR1cm4gdHlwZSB2b2lkLgotICAgIGlmICghTmV3RkQtPmdldFJlc3VsdFR5cGUoKS0+aXNWb2lkVHlwZSgpKSB7CisgICAgaWYgKCFOZXdGRC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWRUeXBlKCkpIHsKICAgICAgIERpYWcoRC5nZXRJZGVudGlmaWVyTG9jKCksCiAgICAgICAgICAgIGRpYWc6OmVycl9leHBlY3RlZF9rZXJuZWxfdm9pZF9yZXR1cm5fdHlwZSk7CiAgICAgICBELnNldEludmFsaWRUeXBlKCk7CiAgICAgfQogCiAgICAgbGx2bTo6U21hbGxQdHJTZXQ8Y29uc3QgVHlwZSAqLCAxNj4gVmFsaWRUeXBlczsKLSAgICBmb3IgKEZ1bmN0aW9uRGVjbDo6cGFyYW1faXRlcmF0b3IgUEkgPSBOZXdGRC0+cGFyYW1fYmVnaW4oKSwKLSAgICAgICAgIFBFID0gTmV3RkQtPnBhcmFtX2VuZCgpOyBQSSAhPSBQRTsgKytQSSkgewotICAgICAgUGFybVZhckRlY2wgKlBhcmFtID0gKlBJOworICAgIGZvciAoYXV0byBQYXJhbSA6IE5ld0ZELT5wYXJhbXMoKSkKICAgICAgIGNoZWNrSXNWYWxpZE9wZW5DTEtlcm5lbFBhcmFtZXRlcigqdGhpcywgRCwgUGFyYW0sIFZhbGlkVHlwZXMpOwotICAgIH0KICAgfQogCiAgIE1hcmtVbnVzZWRGaWxlU2NvcGVkRGVjbChOZXdGRCk7CkBAIC03MzQxLDcgKzc0MzIsNyBAQAogICAgICAgaWYgKCFOZXdGRC0+aXNJbnZhbGlkRGVjbCgpICYmCiAgICAgICAgICAgTmV3RkQtPmdldERlY2xDb250ZXh0KCktPmdldFJlZGVjbENvbnRleHQoKS0+aXNUcmFuc2xhdGlvblVuaXQoKSkgewogICAgICAgICBpZiAoSUktPmlzU3RyKCJjdWRhQ29uZmlndXJlQ2FsbCIpKSB7Ci0gICAgICAgICAgaWYgKCFSLT5nZXRBczxGdW5jdGlvblR5cGU+KCktPmdldFJlc3VsdFR5cGUoKS0+aXNTY2FsYXJUeXBlKCkpCisgICAgICAgICAgaWYgKCFSLT5nZXRBczxGdW5jdGlvblR5cGU+KCktPmdldFJldHVyblR5cGUoKS0+aXNTY2FsYXJUeXBlKCkpCiAgICAgICAgICAgICBEaWFnKE5ld0ZELT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfY29uZmlnX3NjYWxhcl9yZXR1cm4pOwogCiAgICAgICAgICAgQ29udGV4dC5zZXRjdWRhQ29uZmlndXJlQ2FsbERlY2woTmV3RkQpOwpAQCAtNzM4Myw4ICs3NDc0LDggQEAKIGJvb2wgU2VtYTo6Q2hlY2tGdW5jdGlvbkRlY2xhcmF0aW9uKFNjb3BlICpTLCBGdW5jdGlvbkRlY2wgKk5ld0ZELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9va3VwUmVzdWx0ICZQcmV2aW91cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNFeHBsaWNpdFNwZWNpYWxpemF0aW9uKSB7Ci0gIGFzc2VydCghTmV3RkQtPmdldFJlc3VsdFR5cGUoKS0+aXNWYXJpYWJseU1vZGlmaWVkVHlwZSgpIAotICAgICAgICAgJiYgIlZhcmlhYmx5IG1vZGlmaWVkIHJldHVybiB0eXBlcyBhcmUgbm90IGhhbmRsZWQgaGVyZSIpOworICBhc3NlcnQoIU5ld0ZELT5nZXRSZXR1cm5UeXBlKCktPmlzVmFyaWFibHlNb2RpZmllZFR5cGUoKSAmJgorICAgICAgICAgIlZhcmlhYmx5IG1vZGlmaWVkIHJldHVybiB0eXBlcyBhcmUgbm90IGhhbmRsZWQgaGVyZSIpOwogCiAgIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSB0eXBlIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG1lcmdlZCB3aXRoCiAgIC8vIGEgcHJldmlvdXMgdmlzaWJsZSBkZWNsYXJhdGlvbi4gVGhpcyBuZXZlciBoYXBwZW5zIGZvciBmdW5jdGlvbnMgaW4gQysrLApAQCAtNzQ0MCw4ICs3NTMxLDcgQEAKICAgICAgICAgaWYgKE92ZXJsb2FkZWREZWNsKQogICAgICAgICAgIERpYWcoT3ZlcmxvYWRlZERlY2wtPmdldExvY2F0aW9uKCksCiAgICAgICAgICAgICAgICBkaWFnOjpub3RlX2F0dHJpYnV0ZV9vdmVybG9hZGFibGVfcHJldl9vdmVybG9hZCk7Ci0gICAgICAgIE5ld0ZELT5hZGRBdHRyKDo6bmV3IChDb250ZXh0KSBPdmVybG9hZGFibGVBdHRyKFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQpKTsKKyAgICAgICAgTmV3RkQtPmFkZEF0dHIoT3ZlcmxvYWRhYmxlQXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCkpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNzQ2NCw4ICs3NTU0LDcgQEAKICAgICAgICAgICAgIDw8IFJlZGVjbGFyYXRpb24gPDwgTmV3RkQ7CiAgICAgICAgICAgRGlhZyhQcmV2aW91cy5nZXRGb3VuZERlY2woKS0+Z2V0TG9jYXRpb24oKSwKICAgICAgICAgICAgICAgIGRpYWc6Om5vdGVfYXR0cmlidXRlX292ZXJsb2FkYWJsZV9wcmV2X292ZXJsb2FkKTsKLSAgICAgICAgICBOZXdGRC0+YWRkQXR0cig6Om5ldyAoQ29udGV4dCkgT3ZlcmxvYWRhYmxlQXR0cihTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQpKTsKKyAgICAgICAgICBOZXdGRC0+YWRkQXR0cihPdmVybG9hZGFibGVBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0KSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKElzT3ZlcmxvYWQoTmV3RkQsIGNhc3Q8RnVuY3Rpb25EZWNsPihPbGREZWNsKSwgZmFsc2UpKSB7CiAgICAgICAgICAgUmVkZWNsYXJhdGlvbiA9IGZhbHNlOwpAQCAtNzQ4OCwxNyArNzU3NywxNiBAQAogICBpZiAoIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMXkgJiYgTUQgJiYgTUQtPmlzQ29uc3RleHByKCkgJiYKICAgICAgICFNRC0+aXNTdGF0aWMoKSAmJiAhaXNhPENYWENvbnN0cnVjdG9yRGVjbD4oTUQpICYmCiAgICAgICAoTUQtPmdldFR5cGVRdWFsaWZpZXJzKCkgJiBRdWFsaWZpZXJzOjpDb25zdCkgPT0gMCkgewotICAgIENYWE1ldGhvZERlY2wgKk9sZE1EID0gZHluX2Nhc3Rfb3JfbnVsbDxDWFhNZXRob2REZWNsPihPbGREZWNsKTsKLSAgICBpZiAoRnVuY3Rpb25UZW1wbGF0ZURlY2wgKk9sZFREID0KLSAgICAgICAgICBkeW5fY2FzdF9vcl9udWxsPEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihPbGREZWNsKSkKLSAgICAgIE9sZE1EID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4oT2xkVEQtPmdldFRlbXBsYXRlZERlY2woKSk7CisgICAgQ1hYTWV0aG9kRGVjbCAqT2xkTUQgPSAwOworICAgIGlmIChPbGREZWNsKQorICAgICAgT2xkTUQgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPihPbGREZWNsLT5nZXRBc0Z1bmN0aW9uKCkpOwogICAgIGlmICghT2xkTUQgfHwgIU9sZE1ELT5pc1N0YXRpYygpKSB7CiAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0KICAgICAgICAgTUQtPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwogICAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBFUEkgPSBGUFQtPmdldEV4dFByb3RvSW5mbygpOwogICAgICAgRVBJLlR5cGVRdWFscyB8PSBRdWFsaWZpZXJzOjpDb25zdDsKLSAgICAgIE1ELT5zZXRUeXBlKENvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKEZQVC0+Z2V0UmVzdWx0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBULT5nZXRBcmdUeXBlcygpLCBFUEkpKTsKKyAgICAgIE1ELT5zZXRUeXBlKENvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKEZQVC0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBULT5nZXRQYXJhbVR5cGVzKCksIEVQSSkpOwogCiAgICAgICAvLyBXYXJuIHRoYXQgd2UgZGlkIHRoaXMsIGlmIHdlJ3JlIG5vdCBwZXJmb3JtaW5nIHRlbXBsYXRlIGluc3RhbnRpYXRpb24uCiAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlJ2xsIGhhdmUgd2FybmVkIGFscmVhZHkgd2hlbiB0aGUgdGVtcGxhdGUgd2FzIGRlZmluZWQuCkBAIC03NjU2LDcgKzc3NDQsNyBAQAogICAgIC8vIGNvbXBhdGlibGUsIGFuZCBpZiBpdCBkb2VzLCB3YXJuIHRoZSB1c2VyLgogICAgIC8vIEJ1dCwgaXNzdWUgYW55IGRpYWdub3N0aWMgb24gdGhlIGZpcnN0IGRlY2xhcmF0aW9uIG9ubHkuCiAgICAgaWYgKE5ld0ZELT5pc0V4dGVybkMoKSAmJiBQcmV2aW91cy5lbXB0eSgpKSB7Ci0gICAgICBRdWFsVHlwZSBSID0gTmV3RkQtPmdldFJlc3VsdFR5cGUoKTsKKyAgICAgIFF1YWxUeXBlIFIgPSBOZXdGRC0+Z2V0UmV0dXJuVHlwZSgpOwogICAgICAgaWYgKFItPmlzSW5jb21wbGV0ZVR5cGUoKSAmJiAhUi0+aXNWb2lkVHlwZSgpKQogICAgICAgICBEaWFnKE5ld0ZELT5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX3JldHVybl92YWx1ZV91ZHRfaW5jb21wbGV0ZSkKICAgICAgICAgICAgIDw8IE5ld0ZEIDw8IFI7CkBAIC03Njc4LDcgKzc3NjYsNyBAQAogICBpZiAoIUZ1bmN0aW9uVEwpCiAgICAgcmV0dXJuIFNvdXJjZVJhbmdlKCk7CiAKLSAgVHlwZUxvYyBSZXN1bHRUTCA9IEZ1bmN0aW9uVEwuZ2V0UmVzdWx0TG9jKCk7CisgIFR5cGVMb2MgUmVzdWx0VEwgPSBGdW5jdGlvblRMLmdldFJldHVybkxvYygpOwogICBpZiAoUmVzdWx0VEwuZ2V0VW5xdWFsaWZpZWRMb2MoKS5nZXRBczxCdWlsdGluVHlwZUxvYz4oKSkKICAgICByZXR1cm4gUmVzdWx0VEwuZ2V0U291cmNlUmFuZ2UoKTsKIApAQCAtNzY4Niw4ICs3Nzc0LDkgQEAKIH0KIAogdm9pZCBTZW1hOjpDaGVja01haW4oRnVuY3Rpb25EZWNsKiBGRCwgY29uc3QgRGVjbFNwZWMmIERTKSB7Ci0gIC8vIEMrKzExIFtiYXNpYy5zdGFydC5tYWluXXAzOiAgQSBwcm9ncmFtIHRoYXQgZGVjbGFyZXMgbWFpbiB0byBiZSBpbmxpbmUsCi0gIC8vICAgc3RhdGljIG9yIGNvbnN0ZXhwciBpcyBpbGwtZm9ybWVkLgorICAvLyBDKysxMSBbYmFzaWMuc3RhcnQubWFpbl1wMzoKKyAgLy8gICBBIHByb2dyYW0gdGhhdCBbLi4uXSBkZWNsYXJlcyBtYWluIHRvIGJlIGlubGluZSwgc3RhdGljIG9yCisgIC8vICAgY29uc3RleHByIGlzIGlsbC1mb3JtZWQuCiAgIC8vIEMxMSA2LjcuNHA0OiAgSW4gYSBob3N0ZWQgZW52aXJvbm1lbnQsIG5vIGZ1bmN0aW9uIHNwZWNpZmllcihzKSBzaGFsbAogICAvLyAgIGFwcGVhciBpbiBhIGRlY2xhcmF0aW9uIG9mIG1haW4uCiAgIC8vIHN0YXRpYyBtYWluIGlzIG5vdCBhbiBlcnJvciB1bmRlciBDOTksIGJ1dCB3ZSBzaG91bGQgd2FybiBhYm91dCBpdC4KQEAgLTc3MjUsNyArNzgxNCw3IEBACiAgIGNvbnN0IEZ1bmN0aW9uVHlwZSogRlQgPSBULT5jYXN0QXM8RnVuY3Rpb25UeXBlPigpOwogCiAgIC8vIEFsbCB0aGUgc3RhbmRhcmRzIHNheSB0aGF0IG1haW4oKSBzaG91bGQgc2hvdWxkIHJldHVybiAnaW50Jy4KLSAgaWYgKENvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShGVC0+Z2V0UmVzdWx0VHlwZSgpLCBDb250ZXh0LkludFR5KSkgeworICBpZiAoQ29udGV4dC5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKEZULT5nZXRSZXR1cm5UeXBlKCksIENvbnRleHQuSW50VHkpKSB7CiAgICAgLy8gSW4gQyBhbmQgQysrLCBtYWluIG1hZ2ljYWxseSByZXR1cm5zIDAgaWYgeW91IGZhbGwgb2ZmIHRoZSBlbmQ7CiAgICAgLy8gc2V0IHRoZSBmbGFnIHdoaWNoIHRlbGxzIHVzIHRoYXQuCiAgICAgLy8gVGhpcyBpcyBDKysgW2Jhc2ljLnN0YXJ0Lm1haW5dcDUgYW5kIEM5OSA1LjEuMi4yLjMuCkBAIC03NzU4LDcgKzc4NDcsNyBAQAogICBpZiAoaXNhPEZ1bmN0aW9uTm9Qcm90b1R5cGU+KEZUKSkgcmV0dXJuOwogCiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlKiBGVFAgPSBjYXN0PGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlPihGVCk7Ci0gIHVuc2lnbmVkIG5wYXJhbXMgPSBGVFAtPmdldE51bUFyZ3MoKTsKKyAgdW5zaWduZWQgbnBhcmFtcyA9IEZUUC0+Z2V0TnVtUGFyYW1zKCk7CiAgIGFzc2VydChGRC0+Z2V0TnVtUGFyYW1zKCkgPT0gbnBhcmFtcyk7CiAKICAgYm9vbCBIYXNFeHRyYVBhcmFtZXRlcnMgPSAobnBhcmFtcyA+IDMpOwpAQCAtNzc4Myw3ICs3ODcyLDcgQEAKICAgUXVhbFR5cGUgRXhwZWN0ZWRbXSA9IHsgQ29udGV4dC5JbnRUeSwgQ2hhclBQLCBDaGFyUFAsIENoYXJQUCB9OwogCiAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBucGFyYW1zOyArK2kpIHsKLSAgICBRdWFsVHlwZSBBVCA9IEZUUC0+Z2V0QXJnVHlwZShpKTsKKyAgICBRdWFsVHlwZSBBVCA9IEZUUC0+Z2V0UGFyYW1UeXBlKGkpOwogCiAgICAgYm9vbCBtaXNtYXRjaCA9IHRydWU7CiAKQEAgLTc4MTgsNyArNzkwNyw3IEBACiAgIH0KICAgCiAgIGlmICghRkQtPmlzSW52YWxpZERlY2woKSAmJiBGRC0+Z2V0RGVzY3JpYmVkRnVuY3Rpb25UZW1wbGF0ZSgpKSB7Ci0gICAgRGlhZyhGRC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX21haW5saWtlX3RlbXBsYXRlX2RlY2wpIDw8IEZELT5nZXROYW1lKCk7CisgICAgRGlhZyhGRC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX21haW5saWtlX3RlbXBsYXRlX2RlY2wpIDw8IEZEOwogICAgIEZELT5zZXRJbnZhbGlkRGVjbCgpOwogICB9CiB9CkBAIC03ODMwLDE1ICs3OTE5LDE1IEBACiAKICAgLy8gU2V0IGFuIGltcGxpY2l0IHJldHVybiBvZiAnemVybycgaWYgdGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gc29tZSBpbnRlZ3JhbCwKICAgLy8gZW51bWVyYXRpb24sIHBvaW50ZXIgb3IgbnVsbHB0ciB0eXBlLgotICBpZiAoRlQtPmdldFJlc3VsdFR5cGUoKS0+aXNJbnRlZ3JhbE9yRW51bWVyYXRpb25UeXBlKCkgfHwKLSAgICAgIEZULT5nZXRSZXN1bHRUeXBlKCktPmlzQW55UG9pbnRlclR5cGUoKSB8fAotICAgICAgRlQtPmdldFJlc3VsdFR5cGUoKS0+aXNOdWxsUHRyVHlwZSgpKQorICBpZiAoRlQtPmdldFJldHVyblR5cGUoKS0+aXNJbnRlZ3JhbE9yRW51bWVyYXRpb25UeXBlKCkgfHwKKyAgICAgIEZULT5nZXRSZXR1cm5UeXBlKCktPmlzQW55UG9pbnRlclR5cGUoKSB8fAorICAgICAgRlQtPmdldFJldHVyblR5cGUoKS0+aXNOdWxsUHRyVHlwZSgpKQogICAgIC8vIERsbE1haW4gaXMgZXhlbXB0IGJlY2F1c2UgYSByZXR1cm4gdmFsdWUgb2YgemVybyBtZWFucyBpdCBmYWlsZWQuCiAgICAgaWYgKEZELT5nZXROYW1lKCkgIT0gIkRsbE1haW4iKQogICAgICAgRkQtPnNldEhhc0ltcGxpY2l0UmV0dXJuWmVybyh0cnVlKTsKIAogICBpZiAoIUZELT5pc0ludmFsaWREZWNsKCkgJiYgRkQtPmdldERlc2NyaWJlZEZ1bmN0aW9uVGVtcGxhdGUoKSkgewotICAgIERpYWcoRkQtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9tYWlubGlrZV90ZW1wbGF0ZV9kZWNsKSA8PCBGRC0+Z2V0TmFtZSgpOworICAgIERpYWcoRkQtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9tYWlubGlrZV90ZW1wbGF0ZV9kZWNsKSA8PCBGRDsKICAgICBGRC0+c2V0SW52YWxpZERlY2woKTsKICAgfQogfQpAQCAtODA4NCw2ICs4MTczLDExIEBACiAgICAgICAgIHJldHVybjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIERlZHVjZUluaXQgPSBDWFhEaXJlY3RJbml0LT5nZXRFeHByKDApOworICAgICAgICBpZiAoaXNhPEluaXRMaXN0RXhwcj4oRGVkdWNlSW5pdCkpCisgICAgICAgICAgRGlhZyhDWFhEaXJlY3RJbml0LT5nZXRMb2NTdGFydCgpLAorICAgICAgICAgICAgICAgZGlhZzo6ZXJyX2F1dG9fdmFyX2luaXRfcGFyZW5fYnJhY2VzKQorICAgICAgICAgICAgPDwgVkRlY2wtPmdldERlY2xOYW1lKCkgPDwgVkRlY2wtPmdldFR5cGUoKQorICAgICAgICAgICAgPDwgVkRlY2wtPmdldFNvdXJjZVJhbmdlKCk7CiAgICAgICB9CiAgICAgfQogCkBAIC04MTQxLDYgKzgyMzUsMTMgQEAKICAgICAgIHJldHVybjsKICAgfQogCisgIC8vIGRsbGltcG9ydCBjYW5ub3QgYmUgdXNlZCBvbiB2YXJpYWJsZSBkZWZpbml0aW9ucy4KKyAgaWYgKFZEZWNsLT5oYXNBdHRyPERMTEltcG9ydEF0dHI+KCkgJiYgIVZEZWNsLT5pc1N0YXRpY0RhdGFNZW1iZXIoKSkgeworICAgIERpYWcoVkRlY2wtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfZGxsaW1wb3J0X2RhdGFfZGVmaW5pdGlvbik7CisgICAgVkRlY2wtPnNldEludmFsaWREZWNsKCk7CisgICAgcmV0dXJuOworICB9CisKICAgaWYgKFZEZWNsLT5pc0xvY2FsVmFyRGVjbCgpICYmIFZEZWNsLT5oYXNFeHRlcm5hbFN0b3JhZ2UoKSkgewogICAgIC8vIEM5OSA2LjcuOHA1LiBDKysgaGFzIG5vIHN1Y2ggcmVzdHJpY3Rpb24sIGJ1dCB0aGF0IGlzIGEgZGVmZWN0LgogICAgIERpYWcoVkRlY2wtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9ibG9ja19leHRlcm5fY2FudF9pbml0KTsKQEAgLTgxOTIsOSArODI5Myw5IEBACiAgICAgLy8gZGF0YSBtZW1iZXJzIHdlIGFsc28gbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoZXJlIHdhcyBhbiBpbi1jbGFzcwogICAgIC8vIGRlY2xhcmF0aW9uIHdpdGggYW4gaW5pdGlhbGl6ZXIuCiAgICAgaWYgKFZEZWNsLT5pc1N0YXRpY0RhdGFNZW1iZXIoKSAmJiBWRGVjbC0+Z2V0QW55SW5pdGlhbGl6ZXIoUHJldkluaXQpKSB7Ci0gICAgICBEaWFnKFZEZWNsLT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfcmVkZWZpbml0aW9uKSAKLSAgICAgICAgPDwgVkRlY2wtPmdldERlY2xOYW1lKCk7Ci0gICAgICBEaWFnKFByZXZJbml0LT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3ByZXZpb3VzX2RlZmluaXRpb24pOworICAgICAgRGlhZyhJbml0LT5nZXRFeHByTG9jKCksIGRpYWc6OmVycl9zdGF0aWNfZGF0YV9tZW1iZXJfcmVpbml0aWFsaXphdGlvbikKKyAgICAgICAgICA8PCBWRGVjbC0+Z2V0RGVjbE5hbWUoKTsKKyAgICAgIERpYWcoUHJldkluaXQtPmdldEluaXQoKS0+Z2V0RXhwckxvYygpLCBkaWFnOjpub3RlX3ByZXZpb3VzX2luaXRpYWxpemVyKSA8PCAwOwogICAgICAgcmV0dXJuOwogICAgIH0gIAogCkBAIC04NTU4LDYgKzg2NTksMTYgQEAKICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICAvLyBPcGVuQ0wgdjEuMSBzNi41LjM6IHZhcmlhYmxlcyBkZWNsYXJlZCBpbiB0aGUgY29uc3RhbnQgYWRkcmVzcyBzcGFjZSBtdXN0CisgICAgLy8gYmUgaW5pdGlhbGl6ZWQuCisgICAgaWYgKCFWYXItPmlzSW52YWxpZERlY2woKSAmJgorICAgICAgICBWYXItPmdldFR5cGUoKS5nZXRBZGRyZXNzU3BhY2UoKSA9PSBMYW5nQVM6Om9wZW5jbF9jb25zdGFudCAmJgorICAgICAgICBWYXItPmdldFN0b3JhZ2VDbGFzcygpICE9IFNDX0V4dGVybiAmJiAhVmFyLT5nZXRJbml0KCkpIHsKKyAgICAgIERpYWcoVmFyLT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfb3BlbmNsX2NvbnN0YW50X25vX2luaXQpOworICAgICAgVmFyLT5zZXRJbnZhbGlkRGVjbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIHN3aXRjaCAoVmFyLT5pc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCkpIHsKICAgICBjYXNlIFZhckRlY2w6OkRlZmluaXRpb246CiAgICAgICBpZiAoIVZhci0+aXNTdGF0aWNEYXRhTWVtYmVyKCkgfHwgIVZhci0+Z2V0QW55SW5pdGlhbGl6ZXIoKSkKQEAgLTg3ODgsNyArODg5OSwxMyBAQAogICAgIH0KICAgfQogCisgIC8vIFdhcm4gYWJvdXQgZXh0ZXJuYWxseS12aXNpYmxlIHZhcmlhYmxlcyBiZWluZyBkZWZpbmVkIHdpdGhvdXQgYQorICAvLyBwcmlvciBkZWNsYXJhdGlvbi4gIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIGZvciBnbG9iYWwKKyAgLy8gZGVjbGFyYXRpb25zLCBidXQgd2UgYWxzbyBzcGVjaWZpY2FsbHkgbmVlZCB0byBhdm9pZCBkb2luZyBpdCBmb3IKKyAgLy8gY2xhc3MgbWVtYmVycyBiZWNhdXNlIHRoZSBsaW5rYWdlIG9mIGFuIGFub255bW91cyBjbGFzcyBjYW4KKyAgLy8gY2hhbmdlIGlmIGl0J3MgbGF0ZXIgZ2l2ZW4gYSB0eXBlZGVmIG5hbWUuCiAgIGlmICh2YXItPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSAmJgorICAgICAgdmFyLT5nZXREZWNsQ29udGV4dCgpLT5nZXRSZWRlY2xDb250ZXh0KCktPmlzRmlsZUNvbnRleHQoKSAmJgogICAgICAgdmFyLT5pc0V4dGVybmFsbHlWaXNpYmxlKCkgJiYgdmFyLT5oYXNMaW5rYWdlKCkgJiYKICAgICAgIGdldERpYWdub3N0aWNzKCkuZ2V0RGlhZ25vc3RpY0xldmVsKAogICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjp3YXJuX21pc3NpbmdfdmFyaWFibGVfZGVjbGFyYXRpb25zLApAQCAtODkwMSw5ICs5MDE4LDExIEBACiAgIGlmICghVkQpCiAgICAgcmV0dXJuOwogCisgIGNoZWNrQXR0cmlidXRlc0FmdGVyTWVyZ2luZygqdGhpcywgKlZEKTsKKwogICBpZiAoVXNlZEF0dHIgKkF0dHIgPSBWRC0+Z2V0QXR0cjxVc2VkQXR0cj4oKSkgewogICAgIGlmICghQXR0ci0+aXNJbmhlcml0ZWQoKSAmJiAhVkQtPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkgewotICAgICAgRGlhZyhBdHRyLT5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCAidXNlZCI7CisgICAgICBEaWFnKEF0dHItPmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX2lnbm9yZWQpIDw8IEF0dHI7CiAgICAgICBWRC0+ZHJvcEF0dHI8VXNlZEF0dHI+KCk7CiAgICAgfQogICB9CkBAIC04OTIzLDEwICs5MDQyLDExIEBACiAgIGNvbnN0IERlY2xDb250ZXh0ICpEQyA9IFZELT5nZXREZWNsQ29udGV4dCgpOwogICAvLyBJZiB0aGVyZSdzIGEgI3ByYWdtYSBHQ0MgdmlzaWJpbGl0eSBpbiBzY29wZSwgYW5kIHRoaXMgaXNuJ3QgYSBjbGFzcwogICAvLyBtZW1iZXIsIHNldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGlzIHZhcmlhYmxlLgotICBpZiAoIURDLT5pc1JlY29yZCgpICYmIFZELT5pc0V4dGVybmFsbHlWaXNpYmxlKCkpCisgIGlmIChEQy0+Z2V0UmVkZWNsQ29udGV4dCgpLT5pc0ZpbGVDb250ZXh0KCkgJiYgVkQtPmlzRXh0ZXJuYWxseVZpc2libGUoKSkKICAgICBBZGRQdXNoZWRWaXNpYmlsaXR5QXR0cmlidXRlKFZEKTsKIAotICBpZiAoVkQtPmlzRmlsZVZhckRlY2woKSkKKyAgLy8gRklYTUU6IFdhcm4gb24gdW51c2VkIHRlbXBsYXRlcy4KKyAgaWYgKFZELT5pc0ZpbGVWYXJEZWNsKCkgJiYgIVZELT5nZXREZXNjcmliZWRWYXJUZW1wbGF0ZSgpKQogICAgIE1hcmtVbnVzZWRGaWxlU2NvcGVkRGVjbChWRCk7CiAKICAgLy8gTm93IHdlIGhhdmUgcGFyc2VkIHRoZSBpbml0aWFsaXplciBhbmQgY2FuIHVwZGF0ZSB0aGUgdGFibGUgb2YgbWFnaWMKQEAgLTg5MzUsMTAgKzkwNTUsNyBAQAogICAgICAgIVZELT5nZXRUeXBlKCktPmlzSW50ZWdyYWxPckVudW1lcmF0aW9uVHlwZSgpKQogICAgIHJldHVybjsKIAotICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8VHlwZVRhZ0ZvckRhdGF0eXBlQXR0cj4KLSAgICAgICAgIEkgPSBUaGlzRGVjbC0+c3BlY2lmaWNfYXR0cl9iZWdpbjxUeXBlVGFnRm9yRGF0YXR5cGVBdHRyPigpLAotICAgICAgICAgRSA9IFRoaXNEZWNsLT5zcGVjaWZpY19hdHRyX2VuZDxUeXBlVGFnRm9yRGF0YXR5cGVBdHRyPigpOwotICAgICAgIEkgIT0gRTsgKytJKSB7CisgIGZvciAoY29uc3QgYXV0byAqSSA6IFRoaXNEZWNsLT5zcGVjaWZpY19hdHRyczxUeXBlVGFnRm9yRGF0YXR5cGVBdHRyPigpKSB7CiAgICAgY29uc3QgRXhwciAqTWFnaWNWYWx1ZUV4cHIgPSBWRC0+Z2V0SW5pdCgpOwogICAgIGlmICghTWFnaWNWYWx1ZUV4cHIpIHsKICAgICAgIGNvbnRpbnVlOwpAQCAtODk4Myw3ICs5MTAwLDcgQEAKIAogICBpZiAoRGVjbFNwZWM6OmlzRGVjbFJlcChEUy5nZXRUeXBlU3BlY1R5cGUoKSkpIHsKICAgICBpZiAoVGFnRGVjbCAqVGFnID0gZHluX2Nhc3Rfb3JfbnVsbDxUYWdEZWNsPihEUy5nZXRSZXBBc0RlY2woKSkpIHsKLSAgICAgIEhhbmRsZVRhZ051bWJlcmluZygqdGhpcywgVGFnKTsKKyAgICAgIEhhbmRsZVRhZ051bWJlcmluZygqdGhpcywgVGFnLCBTKTsKICAgICAgIGlmICghVGFnLT5oYXNOYW1lRm9yTGlua2FnZSgpICYmICFUYWctPmhhc0RlY2xhcmF0b3JGb3JBbm9uRGVjbCgpKQogICAgICAgICBUYWctPnNldERlY2xhcmF0b3JGb3JBbm9uRGVjbChGaXJzdERlY2xhcmF0b3JJbkdyb3VwKTsKICAgICB9CkBAIC05MTM4LDcgKzkyNTUsNyBAQAogICAgIElJID0gRC5nZXRJZGVudGlmaWVyKCk7CiAgICAgaWYgKCFJSSkgewogICAgICAgRGlhZyhELmdldElkZW50aWZpZXJMb2MoKSwgZGlhZzo6ZXJyX2JhZF9wYXJhbWV0ZXJfbmFtZSkKLSAgICAgICAgPDwgR2V0TmFtZUZvckRlY2xhcmF0b3IoRCkuZ2V0TmFtZSgpLmdldEFzU3RyaW5nKCk7CisgICAgICAgIDw8IEdldE5hbWVGb3JEZWNsYXJhdG9yKEQpLmdldE5hbWUoKTsKICAgICAgIEQuc2V0SW52YWxpZFR5cGUodHJ1ZSk7CiAgICAgfQogICB9CkBAIC05MzMzLDE2ICs5NDUwLDE1IEBACiAgIC8vIFZlcmlmeSA2LjkuMXA2OiAnZXZlcnkgaWRlbnRpZmllciBpbiB0aGUgaWRlbnRpZmllciBsaXN0IHNoYWxsIGJlIGRlY2xhcmVkJwogICAvLyBmb3IgYSBLJlIgZnVuY3Rpb24uCiAgIGlmICghRlRJLmhhc1Byb3RvdHlwZSkgewotICAgIGZvciAoaW50IGkgPSBGVEkuTnVtQXJnczsgaSAhPSAwOyAvKiBkZWNyZW1lbnQgaW4gbG9vcCAqLykgeworICAgIGZvciAoaW50IGkgPSBGVEkuTnVtUGFyYW1zOyBpICE9IDA7IC8qIGRlY3JlbWVudCBpbiBsb29wICovKSB7CiAgICAgICAtLWk7Ci0gICAgICBpZiAoRlRJLkFyZ0luZm9baV0uUGFyYW0gPT0gMCkgeworICAgICAgaWYgKEZUSS5QYXJhbXNbaV0uUGFyYW0gPT0gMCkgewogICAgICAgICBTbWFsbFN0cmluZzwyNTY+IENvZGU7Ci0gICAgICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0oQ29kZSkgPDwgIiAgaW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBGVEkuQXJnSW5mb1tpXS5JZGVudC0+Z2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjtcbiI7Ci0gICAgICAgIERpYWcoRlRJLkFyZ0luZm9baV0uSWRlbnRMb2MsIGRpYWc6OmV4dF9wYXJhbV9ub3RfZGVjbGFyZWQpCi0gICAgICAgICAgPDwgRlRJLkFyZ0luZm9baV0uSWRlbnQKLSAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihMb2NBZnRlckRlY2xzLCBDb2RlLnN0cigpKTsKKyAgICAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbShDb2RlKQorICAgICAgICAgICAgPDwgIiAgaW50ICIgPDwgRlRJLlBhcmFtc1tpXS5JZGVudC0+Z2V0TmFtZSgpIDw8ICI7XG4iOworICAgICAgICBEaWFnKEZUSS5QYXJhbXNbaV0uSWRlbnRMb2MsIGRpYWc6OmV4dF9wYXJhbV9ub3RfZGVjbGFyZWQpCisgICAgICAgICAgICA8PCBGVEkuUGFyYW1zW2ldLklkZW50CisgICAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihMb2NBZnRlckRlY2xzLCBDb2RlLnN0cigpKTsKIAogICAgICAgICAvLyBJbXBsaWNpdGx5IGRlY2xhcmUgdGhlIGFyZ3VtZW50IGFzIHR5cGUgJ2ludCcgZm9yIGxhY2sgb2YgYSBiZXR0ZXIKICAgICAgICAgLy8gdHlwZS4KQEAgLTkzNTAsMTQgKzk0NjYsMTQgQEAKICAgICAgICAgRGVjbFNwZWMgRFMoYXR0cnMpOwogICAgICAgICBjb25zdCBjaGFyKiBQcmV2U3BlYzsgLy8gdW51c2VkCiAgICAgICAgIHVuc2lnbmVkIERpYWdJRDsgLy8gdW51c2VkCi0gICAgICAgIERTLlNldFR5cGVTcGVjVHlwZShEZWNsU3BlYzo6VFNUX2ludCwgRlRJLkFyZ0luZm9baV0uSWRlbnRMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQcmV2U3BlYywgRGlhZ0lEKTsKKyAgICAgICAgRFMuU2V0VHlwZVNwZWNUeXBlKERlY2xTcGVjOjpUU1RfaW50LCBGVEkuUGFyYW1zW2ldLklkZW50TG9jLCBQcmV2U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdJRCwgQ29udGV4dC5nZXRQcmludGluZ1BvbGljeSgpKTsKICAgICAgICAgLy8gVXNlIHRoZSBpZGVudGlmaWVyIGxvY2F0aW9uIGZvciB0aGUgdHlwZSBzb3VyY2UgcmFuZ2UuCi0gICAgICAgIERTLlNldFJhbmdlU3RhcnQoRlRJLkFyZ0luZm9baV0uSWRlbnRMb2MpOwotICAgICAgICBEUy5TZXRSYW5nZUVuZChGVEkuQXJnSW5mb1tpXS5JZGVudExvYyk7CisgICAgICAgIERTLlNldFJhbmdlU3RhcnQoRlRJLlBhcmFtc1tpXS5JZGVudExvYyk7CisgICAgICAgIERTLlNldFJhbmdlRW5kKEZUSS5QYXJhbXNbaV0uSWRlbnRMb2MpOwogICAgICAgICBEZWNsYXJhdG9yIFBhcmFtRChEUywgRGVjbGFyYXRvcjo6S05SVHlwZUxpc3RDb250ZXh0KTsKLSAgICAgICAgUGFyYW1ELlNldElkZW50aWZpZXIoRlRJLkFyZ0luZm9baV0uSWRlbnQsIEZUSS5BcmdJbmZvW2ldLklkZW50TG9jKTsKLSAgICAgICAgRlRJLkFyZ0luZm9baV0uUGFyYW0gPSBBY3RPblBhcmFtRGVjbGFyYXRvcihTLCBQYXJhbUQpOworICAgICAgICBQYXJhbUQuU2V0SWRlbnRpZmllcihGVEkuUGFyYW1zW2ldLklkZW50LCBGVEkuUGFyYW1zW2ldLklkZW50TG9jKTsKKyAgICAgICAgRlRJLlBhcmFtc1tpXS5QYXJhbSA9IEFjdE9uUGFyYW1EZWNsYXJhdG9yKFMsIFBhcmFtRCk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC05NDU2LDcgKzk1NzIsNyBAQAogICBMYW1iZGFTY29wZUluZm8gKkxTSSA9IFMuUHVzaExhbWJkYVNjb3BlKCk7CiAgIExTSS0+Q2FsbE9wZXJhdG9yID0gQ2FsbE9wZXJhdG9yOwogICBMU0ktPkxhbWJkYSA9IExhbWJkYUNsYXNzOwotICBMU0ktPlJldHVyblR5cGUgPSBDYWxsT3BlcmF0b3ItPmdldFJlc3VsdFR5cGUoKTsKKyAgTFNJLT5SZXR1cm5UeXBlID0gQ2FsbE9wZXJhdG9yLT5nZXRSZXR1cm5UeXBlKCk7CiAgIGNvbnN0IExhbWJkYUNhcHR1cmVEZWZhdWx0IExDRCA9IExhbWJkYUNsYXNzLT5nZXRMYW1iZGFDYXB0dXJlRGVmYXVsdCgpOwogCiAgIGlmIChMQ0QgPT0gTENEX05vbmUpCkBAIC05NDcyLDIyICs5NTg4LDIxIEBACiAKICAgLy8gQWRkIHRoZSBjYXB0dXJlcyB0byB0aGUgTFNJIHNvIHRoZXkgY2FuIGJlIG5vdGVkIGFzIGFscmVhZHkKICAgLy8gY2FwdHVyZWQgd2l0aGluIHRyeUNhcHR1cmVWYXIuIAotICBmb3IgKExhbWJkYUV4cHI6OmNhcHR1cmVfaXRlcmF0b3IgQyA9IExhbWJkYUNsYXNzLT5jYXB0dXJlc19iZWdpbigpLAotICAgICAgQ0VuZCA9IExhbWJkYUNsYXNzLT5jYXB0dXJlc19lbmQoKTsgQyAhPSBDRW5kOyArK0MpIHsKLSAgICBpZiAoQy0+Y2FwdHVyZXNWYXJpYWJsZSgpKSB7Ci0gICAgICBWYXJEZWNsICpWRCA9IEMtPmdldENhcHR1cmVkVmFyKCk7CisgIGZvciAoY29uc3QgYXV0byAmQyA6IExhbWJkYUNsYXNzLT5jYXB0dXJlcygpKSB7CisgICAgaWYgKEMuY2FwdHVyZXNWYXJpYWJsZSgpKSB7CisgICAgICBWYXJEZWNsICpWRCA9IEMuZ2V0Q2FwdHVyZWRWYXIoKTsKICAgICAgIGlmIChWRC0+aXNJbml0Q2FwdHVyZSgpKQogICAgICAgICBTLkN1cnJlbnRJbnN0YW50aWF0aW9uU2NvcGUtPkluc3RhbnRpYXRlZExvY2FsKFZELCBWRCk7CiAgICAgICBRdWFsVHlwZSBDYXB0dXJlVHlwZSA9IFZELT5nZXRUeXBlKCk7Ci0gICAgICBjb25zdCBib29sIEJ5UmVmID0gQy0+Z2V0Q2FwdHVyZUtpbmQoKSA9PSBMQ0tfQnlSZWY7CisgICAgICBjb25zdCBib29sIEJ5UmVmID0gQy5nZXRDYXB0dXJlS2luZCgpID09IExDS19CeVJlZjsKICAgICAgIExTSS0+YWRkQ2FwdHVyZShWRCwgLypJc0Jsb2NrKi9mYWxzZSwgQnlSZWYsIAotICAgICAgICAgIC8qUmVmZXJzVG9FbmNsb3NpbmdMb2NhbCovdHJ1ZSwgQy0+Z2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAvKkVsbGlwc2lzTG9jKi9DLT5pc1BhY2tFeHBhbnNpb24oKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IEMtPmdldEVsbGlwc2lzTG9jKCkgOiBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgIC8qUmVmZXJzVG9FbmNsb3NpbmdMb2NhbCovdHJ1ZSwgQy5nZXRMb2NhdGlvbigpLAorICAgICAgICAgIC8qRWxsaXBzaXNMb2MqL0MuaXNQYWNrRXhwYW5zaW9uKCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBDLmdldEVsbGlwc2lzTG9jKCkgOiBTb3VyY2VMb2NhdGlvbigpLAogICAgICAgICAgIENhcHR1cmVUeXBlLCAvKkV4cHIqLyAwKTsKICAgICAgIAotICAgIH0gZWxzZSBpZiAoQy0+Y2FwdHVyZXNUaGlzKCkpIHsKLSAgICAgIExTSS0+YWRkVGhpc0NhcHR1cmUoLypOZXN0ZWQqLyBmYWxzZSwgQy0+Z2V0TG9jYXRpb24oKSwgCisgICAgfSBlbHNlIGlmIChDLmNhcHR1cmVzVGhpcygpKSB7CisgICAgICBMU0ktPmFkZFRoaXNDYXB0dXJlKC8qTmVzdGVkKi8gZmFsc2UsIEMuZ2V0TG9jYXRpb24oKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLmdldEN1cnJlbnRUaGlzVHlwZSgpLCAvKkV4cHIqLyAwKTsKICAgICB9CiAgIH0KQEAgLTk1MzksNyArOTY1NCw3IEBACiAKICAgLy8gVGhlIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBtdXN0IGJlIGNvbXBsZXRlCiAgIC8vIChDOTkgNi45LjFwMywgQysrIFtkY2wuZmN0XXA2KS4KLSAgUXVhbFR5cGUgUmVzdWx0VHlwZSA9IEZELT5nZXRSZXN1bHRUeXBlKCk7CisgIFF1YWxUeXBlIFJlc3VsdFR5cGUgPSBGRC0+Z2V0UmV0dXJuVHlwZSgpOwogICBpZiAoIVJlc3VsdFR5cGUtPmlzRGVwZW5kZW50VHlwZSgpICYmICFSZXN1bHRUeXBlLT5pc1ZvaWRUeXBlKCkgJiYKICAgICAgICFGRC0+aXNJbnZhbGlkRGVjbCgpICYmCiAgICAgICBSZXF1aXJlQ29tcGxldGVUeXBlKEZELT5nZXRMb2NhdGlvbigpLCBSZXN1bHRUeXBlLApAQCAtOTU3OCw4ICs5NjkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2tQYXJhbWV0ZXJOYW1lcz0qL3RydWUpOwogCiAgIC8vIEludHJvZHVjZSBvdXIgcGFyYW1ldGVycyBpbnRvIHRoZSBmdW5jdGlvbiBzY29wZQotICBmb3IgKHVuc2lnbmVkIHAgPSAwLCBOdW1QYXJhbXMgPSBGRC0+Z2V0TnVtUGFyYW1zKCk7IHAgPCBOdW1QYXJhbXM7ICsrcCkgewotICAgIFBhcm1WYXJEZWNsICpQYXJhbSA9IEZELT5nZXRQYXJhbURlY2wocCk7CisgIGZvciAoYXV0byBQYXJhbSA6IEZELT5wYXJhbXMoKSkgewogICAgIFBhcmFtLT5zZXRPd25pbmdGdW5jdGlvbihGRCk7CiAKICAgICAvLyBJZiB0aGlzIGhhcyBhbiBpZGVudGlmaWVyLCBhZGQgaXQgdG8gdGhlIHNjb3BlIHN0YWNrLgpAQCAtOTYwNCw5ICs5NzE4LDggQEAKICAgICAgIC8vIGFuZCByZWF0dGFjaCB0byB0aGUgY3VycmVudCBjb250ZXh0LgogICAgICAgaWYgKEQtPmdldExleGljYWxEZWNsQ29udGV4dCgpID09IENvbnRleHQuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpKSB7CiAgICAgICAgIC8vIElzIHRoZSBkZWNsIGFjdHVhbGx5IGluIHRoZSBjb250ZXh0PwotICAgICAgICBmb3IgKERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIERJID0gQ29udGV4dC5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCktPmRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICBERSA9IENvbnRleHQuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpLT5kZWNsc19lbmQoKTsgREkgIT0gREU7ICsrREkpIHsKLSAgICAgICAgICBpZiAoKkRJID09IEQpIHsgIAorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gKkRJIDogQ29udGV4dC5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCktPmRlY2xzKCkpIHsKKyAgICAgICAgICBpZiAoREkgPT0gRCkgeyAgCiAgICAgICAgICAgICBDb250ZXh0LmdldFRyYW5zbGF0aW9uVW5pdERlY2woKS0+cmVtb3ZlRGVjbChEKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KQEAgLTk2MjEsMTAgKzk3MzQsOSBAQAogCiAgICAgICAvLyBTaW1pbGFybHksIGRpdmUgaW50byBlbnVtcyBhbmQgZmlzaCB0aGVpciBjb25zdGFudHMgb3V0LCBtYWtpbmcgdGhlbQogICAgICAgLy8gYWNjZXNzaWJsZSBpbiB0aGlzIHNjb3BlLgotICAgICAgaWYgKEVudW1EZWNsICpFRCA9IGR5bl9jYXN0PEVudW1EZWNsPihEKSkgewotICAgICAgICBmb3IgKEVudW1EZWNsOjplbnVtZXJhdG9yX2l0ZXJhdG9yIEVJID0gRUQtPmVudW1lcmF0b3JfYmVnaW4oKSwKLSAgICAgICAgICAgICAgIEVFID0gRUQtPmVudW1lcmF0b3JfZW5kKCk7IEVJICE9IEVFOyArK0VJKQotICAgICAgICAgIFB1c2hPblNjb3BlQ2hhaW5zKCpFSSwgRm5Cb2R5U2NvcGUsIC8qQWRkVG9Db250ZXh0PSovZmFsc2UpOworICAgICAgaWYgKGF1dG8gKkVEID0gZHluX2Nhc3Q8RW51bURlY2w+KEQpKSB7CisgICAgICAgIGZvciAoYXV0byAqRUkgOiBFRC0+ZW51bWVyYXRvcnMoKSkKKyAgICAgICAgICBQdXNoT25TY29wZUNoYWlucyhFSSwgRm5Cb2R5U2NvcGUsIC8qQWRkVG9Db250ZXh0PSovZmFsc2UpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtOTYzNiwyOCArOTc0OCwxNyBAQAogICAvLyBDaGVja2luZyBhdHRyaWJ1dGVzIG9mIGN1cnJlbnQgZnVuY3Rpb24gZGVmaW5pdGlvbgogICAvLyBkbGxpbXBvcnQgYXR0cmlidXRlLgogICBETExJbXBvcnRBdHRyICpEQSA9IEZELT5nZXRBdHRyPERMTEltcG9ydEF0dHI+KCk7Ci0gIGlmIChEQSAmJiAoIUZELT5nZXRBdHRyPERMTEV4cG9ydEF0dHI+KCkpKSB7CisgIGlmIChEQSAmJiAoIUZELT5oYXNBdHRyPERMTEV4cG9ydEF0dHI+KCkpKSB7CiAgICAgLy8gZGxsaW1wb3J0IGF0dHJpYnV0ZSBjYW5ub3QgYmUgZGlyZWN0bHkgYXBwbGllZCB0byBkZWZpbml0aW9uLgogICAgIC8vIE1pY3Jvc29mdCBhY2NlcHRzIGRsbGltcG9ydCBmb3IgZnVuY3Rpb25zIGRlZmluZWQgd2l0aGluIGNsYXNzIHNjb3BlLiAKICAgICBpZiAoIURBLT5pc0luaGVyaXRlZCgpICYmCiAgICAgICAgICEoTGFuZ09wdHMuTWljcm9zb2Z0RXh0ICYmIEZELT5nZXRMZXhpY2FsRGVjbENvbnRleHQoKS0+aXNSZWNvcmQoKSkpIHsKICAgICAgIERpYWcoRkQtPmdldExvY2F0aW9uKCksCiAgICAgICAgICAgIGRpYWc6OmVycl9hdHRyaWJ1dGVfY2FuX2JlX2FwcGxpZWRfb25seV90b19zeW1ib2xfZGVjbGFyYXRpb24pCi0gICAgICAgIDw8ICJkbGxpbXBvcnQiOworICAgICAgICA8PCBEQTsKICAgICAgIEZELT5zZXRJbnZhbGlkRGVjbCgpOwogICAgICAgcmV0dXJuIEQ7CiAgICAgfQotCi0gICAgLy8gVmlzdWFsIEMrKyBhcHBlYXJzIHRvIG5vdCB0aGluayB0aGlzIGlzIGFuIGlzc3VlLCBzbyBvbmx5IGlzc3VlCi0gICAgLy8gYSB3YXJuaW5nIHdoZW4gTWljcm9zb2Z0IGV4dGVuc2lvbnMgYXJlIGRpc2FibGVkLgotICAgIGlmICghTGFuZ09wdHMuTWljcm9zb2Z0RXh0KSB7Ci0gICAgICAvLyBJZiBhIHN5bWJvbCBwcmV2aW91c2x5IGRlY2xhcmVkIGRsbGltcG9ydCBpcyBsYXRlciBkZWZpbmVkLCB0aGUKLSAgICAgIC8vIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGluIHN1YnNlcXVlbnQgcmVmZXJlbmNlcywgYW5kIGEgd2FybmluZyBpcwotICAgICAgLy8gZW1pdHRlZC4KLSAgICAgIERpYWcoRkQtPmdldExvY2F0aW9uKCksCi0gICAgICAgICAgIGRpYWc6Ondhcm5fcmVkZWNsYXJhdGlvbl93aXRob3V0X2F0dHJpYnV0ZV9wcmV2X2F0dHJpYnV0ZV9pZ25vcmVkKQotICAgICAgICA8PCBGRC0+Z2V0TmFtZSgpIDw8ICJkbGxpbXBvcnQiOwotICAgIH0KICAgfQogICAvLyBXZSB3YW50IHRvIGF0dGFjaCBkb2N1bWVudGF0aW9uIHRvIG9yaWdpbmFsIERlY2wgKHdoaWNoIG1pZ2h0IGJlCiAgIC8vIGEgZnVuY3Rpb24gdGVtcGxhdGUpLgpAQCAtOTY5OSwyNSArOTgwMCw0MCBAQAogICAgIGNvbnN0X2Nhc3Q8VmFyRGVjbCo+KE5SVk9DYW5kaWRhdGUpLT5zZXROUlZPVmFyaWFibGUodHJ1ZSk7CiB9CiAKLWJvb2wgU2VtYTo6Y2FuU2tpcEZ1bmN0aW9uQm9keShEZWNsICpEKSB7Ci0gIGlmICghQ29uc3VtZXIuc2hvdWxkU2tpcEZ1bmN0aW9uQm9keShEKSkKK2Jvb2wgU2VtYTo6Y2FuRGVsYXlGdW5jdGlvbkJvZHkoY29uc3QgRGVjbGFyYXRvciAmRCkgeworICAvLyBXZSBjYW4ndCBkZWxheSBwYXJzaW5nIHRoZSBib2R5IG9mIGEgY29uc3RleHByIGZ1bmN0aW9uIHRlbXBsYXRlICh5ZXQpLgorICBpZiAoRC5nZXREZWNsU3BlYygpLmlzQ29uc3RleHByU3BlY2lmaWVkKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGlmIChpc2E8T2JqQ01ldGhvZERlY2w+KEQpKQotICAgIHJldHVybiB0cnVlOworICAvLyBXZSBjYW4ndCBkZWxheSBwYXJzaW5nIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gdGVtcGxhdGUgd2l0aCBhIGRlZHVjZWQKKyAgLy8gcmV0dXJuIHR5cGUgKHlldCkuCisgIGlmIChELmdldERlY2xTcGVjKCkuY29udGFpbnNQbGFjZWhvbGRlclR5cGUoKSkgeworICAgIC8vIElmIHRoZSBwbGFjZWhvbGRlciBpbnRyb2R1Y2VzIGEgbm9uLWRlZHVjZWQgdHJhaWxpbmcgcmV0dXJuIHR5cGUsCisgICAgLy8gd2UgY2FuIHN0aWxsIGRlbGF5IHBhcnNpbmcgaXQuCisgICAgaWYgKEQuZ2V0TnVtVHlwZU9iamVjdHMoKSkgeworICAgICAgY29uc3QgYXV0byAmT3V0ZXIgPSBELmdldFR5cGVPYmplY3QoRC5nZXROdW1UeXBlT2JqZWN0cygpIC0gMSk7CisgICAgICBpZiAoT3V0ZXIuS2luZCA9PSBEZWNsYXJhdG9yQ2h1bms6OkZ1bmN0aW9uICYmCisgICAgICAgICAgT3V0ZXIuRnVuLmhhc1RyYWlsaW5nUmV0dXJuVHlwZSgpKSB7CisgICAgICAgIFF1YWxUeXBlIFR5ID0gR2V0VHlwZUZyb21QYXJzZXIoT3V0ZXIuRnVuLmdldFRyYWlsaW5nUmV0dXJuVHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIFR5LmlzTnVsbCgpIHx8ICFUeS0+aXNVbmRlZHVjZWRUeXBlKCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQogCi0gIEZ1bmN0aW9uRGVjbCAqRkQgPSAwOwotICBpZiAoRnVuY3Rpb25UZW1wbGF0ZURlY2wgKkZURCA9IGR5bl9jYXN0PEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihEKSkKLSAgICBGRCA9IEZURC0+Z2V0VGVtcGxhdGVkRGVjbCgpOwotICBlbHNlCi0gICAgRkQgPSBjYXN0PEZ1bmN0aW9uRGVjbD4oRCk7CisgIHJldHVybiB0cnVlOworfQogCitib29sIFNlbWE6OmNhblNraXBGdW5jdGlvbkJvZHkoRGVjbCAqRCkgewogICAvLyBXZSBjYW5ub3Qgc2tpcCB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIChvciBmdW5jdGlvbiB0ZW1wbGF0ZSkgd2hpY2ggaXMKICAgLy8gY29uc3RleHByLCBzaW5jZSB3ZSBtYXkgbmVlZCB0byBldmFsdWF0ZSBpdHMgYm9keSBpbiBvcmRlciB0byBwYXJzZSB0aGUKICAgLy8gcmVzdCBvZiB0aGUgZmlsZS4KICAgLy8gV2UgY2Fubm90IHNraXAgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiB3aXRoIGFuIHVuZGVkdWNlZCByZXR1cm4gdHlwZSwKICAgLy8gYmVjYXVzZSBhbnkgY2FsbGVycyBvZiB0aGF0IGZ1bmN0aW9uIG5lZWQgdG8ga25vdyB0aGUgdHlwZS4KLSAgcmV0dXJuICFGRC0+aXNDb25zdGV4cHIoKSAmJiAhRkQtPmdldFJlc3VsdFR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCk7CisgIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKkZEID0gRC0+Z2V0QXNGdW5jdGlvbigpKQorICAgIGlmIChGRC0+aXNDb25zdGV4cHIoKSB8fCBGRC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1VuZGVkdWNlZFR5cGUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIENvbnN1bWVyLnNob3VsZFNraXBGdW5jdGlvbkJvZHkoRCk7CiB9CiAKIERlY2wgKlNlbWE6OkFjdE9uU2tpcHBlZEZ1bmN0aW9uQm9keShEZWNsICpEZWNsKSB7CkBAIC05NzM0LDEyICs5ODUwLDcgQEAKIAogRGVjbCAqU2VtYTo6QWN0T25GaW5pc2hGdW5jdGlvbkJvZHkoRGVjbCAqZGNsLCBTdG10ICpCb2R5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0luc3RhbnRpYXRpb24pIHsKLSAgRnVuY3Rpb25EZWNsICpGRCA9IDA7Ci0gIEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGdW5UbXBsID0gZHluX2Nhc3Rfb3JfbnVsbDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oZGNsKTsKLSAgaWYgKEZ1blRtcGwpCi0gICAgRkQgPSBGdW5UbXBsLT5nZXRUZW1wbGF0ZWREZWNsKCk7Ci0gIGVsc2UKLSAgICBGRCA9IGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb25EZWNsPihkY2wpOworICBGdW5jdGlvbkRlY2wgKkZEID0gZGNsID8gZGNsLT5nZXRBc0Z1bmN0aW9uKCkgOiAwOwogCiAgIHNlbWE6OkFuYWx5c2lzQmFzZWRXYXJuaW5nczo6UG9saWN5IFdQID0gQW5hbHlzaXNXYXJuaW5ncy5nZXREZWZhdWx0UG9saWN5KCk7CiAgIHNlbWE6OkFuYWx5c2lzQmFzZWRXYXJuaW5nczo6UG9saWN5ICpBY3RpdmVQb2xpY3kgPSAwOwpAQCAtOTc0OCwxOCArOTg1OSwxOCBAQAogICAgIEZELT5zZXRCb2R5KEJvZHkpOwogCiAgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMXkgJiYgIUZELT5pc0ludmFsaWREZWNsKCkgJiYgQm9keSAmJgotICAgICAgICAhRkQtPmlzRGVwZW5kZW50Q29udGV4dCgpICYmIEZELT5nZXRSZXN1bHRUeXBlKCktPmlzVW5kZWR1Y2VkVHlwZSgpKSB7CisgICAgICAgICFGRC0+aXNEZXBlbmRlbnRDb250ZXh0KCkgJiYgRkQtPmdldFJldHVyblR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCkpIHsKICAgICAgIC8vIElmIHRoZSBmdW5jdGlvbiBoYXMgYSBkZWR1Y2VkIHJlc3VsdCB0eXBlIGJ1dCBjb250YWlucyBubyAncmV0dXJuJwogICAgICAgLy8gc3RhdGVtZW50cywgdGhlIHJlc3VsdCB0eXBlIGFzIHdyaXR0ZW4gbXVzdCBiZSBleGFjdGx5ICdhdXRvJywgYW5kCiAgICAgICAvLyB0aGUgZGVkdWNlZCByZXN1bHQgdHlwZSBpcyAndm9pZCcuCi0gICAgICBpZiAoIUZELT5nZXRSZXN1bHRUeXBlKCktPmdldEFzPEF1dG9UeXBlPigpKSB7CisgICAgICBpZiAoIUZELT5nZXRSZXR1cm5UeXBlKCktPmdldEFzPEF1dG9UeXBlPigpKSB7CiAgICAgICAgIERpYWcoZGNsLT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfYXV0b19mbl9ub19yZXR1cm5fYnV0X25vdF9hdXRvKQotICAgICAgICAgIDw8IEZELT5nZXRSZXN1bHRUeXBlKCk7CisgICAgICAgICAgICA8PCBGRC0+Z2V0UmV0dXJuVHlwZSgpOwogICAgICAgICBGRC0+c2V0SW52YWxpZERlY2woKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFN1YnN0aXR1dGUgJ3ZvaWQnIGZvciB0aGUgJ2F1dG8nIGluIHRoZSB0eXBlLgogICAgICAgICBUeXBlTG9jIFJlc3VsdFR5cGUgPSBGRC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpLgotICAgICAgICAgICAgSWdub3JlUGFyZW5zKCkuY2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlTG9jPigpLmdldFJlc3VsdExvYygpOworICAgICAgICAgICAgSWdub3JlUGFyZW5zKCkuY2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlTG9jPigpLmdldFJldHVybkxvYygpOwogICAgICAgICBDb250ZXh0LmFkanVzdERlZHVjZWRGdW5jdGlvblJlc3VsdFR5cGUoCiAgICAgICAgICAgICBGRCwgU3Vic3RBdXRvVHlwZShSZXN1bHRUeXBlLmdldFR5cGUoKSwgQ29udGV4dC5Wb2lkVHkpKTsKICAgICAgIH0KQEAgLTk3ODMsMTUgKzk4OTQsMTUgQEAKICAgICAgIFdQLmRpc2FibGVDaGVja0ZhbGxUaHJvdWdoKCk7CiAKICAgICAvLyBNU1ZDIHBlcm1pdHMgdGhlIHVzZSBvZiBwdXJlIHNwZWNpZmllciAoPTApIG9uIGZ1bmN0aW9uIGRlZmluaXRpb24sCi0gICAgLy8gZGVmaW5lZCBhdCBjbGFzcyBzY29wZSwgd2FybiBhYm91dCB0aGlzIG5vbiBzdGFuZGFyZCBjb25zdHJ1Y3QuCisgICAgLy8gZGVmaW5lZCBhdCBjbGFzcyBzY29wZSwgd2FybiBhYm91dCB0aGlzIG5vbi1zdGFuZGFyZCBjb25zdHJ1Y3QuCiAgICAgaWYgKGdldExhbmdPcHRzKCkuTWljcm9zb2Z0RXh0ICYmIEZELT5pc1B1cmUoKSAmJiBGRC0+aXNDYW5vbmljYWxEZWNsKCkpCiAgICAgICBEaWFnKEZELT5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX3B1cmVfZnVuY3Rpb25fZGVmaW5pdGlvbik7CiAKICAgICBpZiAoIUZELT5pc0ludmFsaWREZWNsKCkpIHsKICAgICAgIERpYWdub3NlVW51c2VkUGFyYW1ldGVycyhGRC0+cGFyYW1fYmVnaW4oKSwgRkQtPnBhcmFtX2VuZCgpKTsKICAgICAgIERpYWdub3NlU2l6ZU9mUGFyYW1ldGVyc0FuZFJldHVyblZhbHVlKEZELT5wYXJhbV9iZWdpbigpLCBGRC0+cGFyYW1fZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRC0+Z2V0UmVzdWx0VHlwZSgpLCBGRCk7Ci0gICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZELT5nZXRSZXR1cm5UeXBlKCksIEZEKTsKKwogICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbnN0cnVjdG9yLCB3ZSBuZWVkIGEgdnRhYmxlLgogICAgICAgaWYgKENYWENvbnN0cnVjdG9yRGVjbCAqQ29uc3RydWN0b3IgPSBkeW5fY2FzdDxDWFhDb25zdHJ1Y3RvckRlY2w+KEZEKSkKICAgICAgICAgTWFya1ZUYWJsZVVzZWQoRkQtPmdldExvY2F0aW9uKCksIENvbnN0cnVjdG9yLT5nZXRQYXJlbnQoKSk7CkBAIC05Nzk5LDcgKzk5MTAsNyBAQAogICAgICAgLy8gVHJ5IHRvIGFwcGx5IHRoZSBuYW1lZCByZXR1cm4gdmFsdWUgb3B0aW1pemF0aW9uLiBXZSBoYXZlIHRvIGNoZWNrCiAgICAgICAvLyBpZiB3ZSBjYW4gZG8gdGhpcyBoZXJlIGJlY2F1c2UgbGFtYmRhcyBrZWVwIHJldHVybiBzdGF0ZW1lbnRzIGFyb3VuZAogICAgICAgLy8gdG8gZGVkdWNlIGFuIGltcGxpY2l0IHJldHVybiB0eXBlLgotICAgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmIEZELT5nZXRSZXN1bHRUeXBlKCktPmlzUmVjb3JkVHlwZSgpICYmCisgICAgICBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMgJiYgRkQtPmdldFJldHVyblR5cGUoKS0+aXNSZWNvcmRUeXBlKCkgJiYKICAgICAgICAgICAhRkQtPmlzRGVwZW5kZW50Q29udGV4dCgpKQogICAgICAgICBjb21wdXRlTlJWTyhCb2R5LCBnZXRDdXJGdW5jdGlvbigpKTsKICAgICB9CkBAIC05ODEyLDggKzk5MjMsOCBAQAogICAgIGlmICghTUQtPmlzSW52YWxpZERlY2woKSkgewogICAgICAgRGlhZ25vc2VVbnVzZWRQYXJhbWV0ZXJzKE1ELT5wYXJhbV9iZWdpbigpLCBNRC0+cGFyYW1fZW5kKCkpOwogICAgICAgRGlhZ25vc2VTaXplT2ZQYXJhbWV0ZXJzQW5kUmV0dXJuVmFsdWUoTUQtPnBhcmFtX2JlZ2luKCksIE1ELT5wYXJhbV9lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ELT5nZXRSZXN1bHRUeXBlKCksIE1EKTsKLSAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUQtPmdldFJldHVyblR5cGUoKSwgTUQpOworCiAgICAgICBpZiAoQm9keSkKICAgICAgICAgY29tcHV0ZU5SVk8oQm9keSwgZ2V0Q3VyRnVuY3Rpb24oKSk7CiAgICAgfQpAQCAtOTgyMiw2ICs5OTMzLDI3IEBACiAgICAgICAgIDw8IE1ELT5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCk7CiAgICAgICBnZXRDdXJGdW5jdGlvbigpLT5PYmpDU2hvdWxkQ2FsbFN1cGVyID0gZmFsc2U7CiAgICAgfQorICAgIGlmIChnZXRDdXJGdW5jdGlvbigpLT5PYmpDV2FybkZvck5vRGVzaWduYXRlZEluaXRDaGFpbikgeworICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKkluaXRNZXRob2QgPSAwOworICAgICAgYm9vbCBpc0Rlc2lnbmF0ZWQgPQorICAgICAgICAgIE1ELT5pc0Rlc2lnbmF0ZWRJbml0aWFsaXplckZvclRoZUludGVyZmFjZSgmSW5pdE1ldGhvZCk7CisgICAgICBhc3NlcnQoaXNEZXNpZ25hdGVkICYmIEluaXRNZXRob2QpOworICAgICAgKHZvaWQpaXNEZXNpZ25hdGVkOworICAgICAgLy8gRG9uJ3QgaXNzdWUgdGhpcyB3YXJuaW5nIGZvciB1bmF2YWlhbGFibGUgaW5pdHMuCisgICAgICBpZiAoIU1ELT5pc1VuYXZhaWxhYmxlKCkpIHsKKyAgICAgICAgRGlhZyhNRC0+Z2V0TG9jYXRpb24oKSwKKyAgICAgICAgICAgICBkaWFnOjp3YXJuX29iamNfZGVzaWduYXRlZF9pbml0X21pc3Npbmdfc3VwZXJfY2FsbCk7CisgICAgICAgIERpYWcoSW5pdE1ldGhvZC0+Z2V0TG9jYXRpb24oKSwKKyAgICAgICAgICAgICBkaWFnOjpub3RlX29iamNfZGVzaWduYXRlZF9pbml0X21hcmtlZF9oZXJlKTsKKyAgICAgIH0KKyAgICAgIGdldEN1ckZ1bmN0aW9uKCktPk9iakNXYXJuRm9yTm9EZXNpZ25hdGVkSW5pdENoYWluID0gZmFsc2U7CisgICAgfQorICAgIGlmIChnZXRDdXJGdW5jdGlvbigpLT5PYmpDV2FybkZvck5vSW5pdERlbGVnYXRpb24pIHsKKyAgICAgIC8vIERvbid0IGlzc3VlIHRoaXMgd2FybmluZyBmb3IgdW5hdmFpYWxhYmxlIGluaXRzLgorICAgICAgaWYgKCFNRC0+aXNVbmF2YWlsYWJsZSgpKQorICAgICAgICBEaWFnKE1ELT5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX29iamNfc2Vjb25kYXJ5X2luaXRfbWlzc2luZ19pbml0X2NhbGwpOworICAgICAgZ2V0Q3VyRnVuY3Rpb24oKS0+T2JqQ1dhcm5Gb3JOb0luaXREZWxlZ2F0aW9uID0gZmFsc2U7CisgICAgfQogICB9IGVsc2UgewogICAgIHJldHVybiAwOwogICB9CkBAIC05OTQ4LDcgKzEwMDgwLDggQEAKICAgQXR0cmlidXRlRmFjdG9yeSBhdHRyRmFjdG9yeTsKICAgRGVjbFNwZWMgRFMoYXR0ckZhY3RvcnkpOwogICB1bnNpZ25lZCBEaWFnSUQ7Ci0gIGJvb2wgRXJyb3IgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9pbnQsIExvYywgRHVtbXksIERpYWdJRCk7CisgIGJvb2wgRXJyb3IgPSBEUy5TZXRUeXBlU3BlY1R5cGUoRGVjbFNwZWM6OlRTVF9pbnQsIExvYywgRHVtbXksIERpYWdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LmdldFByaW50aW5nUG9saWN5KCkpOwogICAodm9pZClFcnJvcjsgLy8gU2lsZW5jZSB3YXJuaW5nLgogICBhc3NlcnQoIUVycm9yICYmICJFcnJvciBzZXR0aW5nIHVwIGltcGxpY2l0IGRlY2whIik7CiAgIFNvdXJjZUxvY2F0aW9uIE5vTG9jOwpAQCAtMTAwMTIsMjUgKzEwMTQ1LDI3IEBACiAgICAgdW5zaWduZWQgRm9ybWF0SWR4OwogICAgIGJvb2wgSGFzVkFMaXN0QXJnOwogICAgIGlmIChDb250ZXh0LkJ1aWx0aW5JbmZvLmlzUHJpbnRmTGlrZShCdWlsdGluSUQsIEZvcm1hdElkeCwgSGFzVkFMaXN0QXJnKSkgewotICAgICAgaWYgKCFGRC0+Z2V0QXR0cjxGb3JtYXRBdHRyPigpKSB7CisgICAgICBpZiAoIUZELT5oYXNBdHRyPEZvcm1hdEF0dHI+KCkpIHsKICAgICAgICAgY29uc3QgY2hhciAqZm10ID0gInByaW50ZiI7CiAgICAgICAgIHVuc2lnbmVkIGludCBOdW1QYXJhbXMgPSBGRC0+Z2V0TnVtUGFyYW1zKCk7CiAgICAgICAgIGlmIChGb3JtYXRJZHggPCBOdW1QYXJhbXMgJiYgLy8gTnVtUGFyYW1zIG1heSBiZSAwIChlLmcuIHZmcHJpbnRmKQogICAgICAgICAgICAgRkQtPmdldFBhcmFtRGVjbChGb3JtYXRJZHgpLT5nZXRUeXBlKCktPmlzT2JqQ09iamVjdFBvaW50ZXJUeXBlKCkpCiAgICAgICAgICAgZm10ID0gIk5TU3RyaW5nIjsKLSAgICAgICAgRkQtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIEZvcm1hdEF0dHIoRkQtPmdldExvY2F0aW9uKCksIENvbnRleHQsCisgICAgICAgIEZELT5hZGRBdHRyKEZvcm1hdEF0dHI6OkNyZWF0ZUltcGxpY2l0KENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb250ZXh0LklkZW50cy5nZXQoZm10KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0SWR4KzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc1ZBTGlzdEFyZyA/IDAgOiBGb3JtYXRJZHgrMikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNWQUxpc3RBcmcgPyAwIDogRm9ybWF0SWR4KzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZELT5nZXRMb2NhdGlvbigpKSk7CiAgICAgICB9CiAgICAgfQogICAgIGlmIChDb250ZXh0LkJ1aWx0aW5JbmZvLmlzU2NhbmZMaWtlKEJ1aWx0aW5JRCwgRm9ybWF0SWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVkFMaXN0QXJnKSkgewotICAgICBpZiAoIUZELT5nZXRBdHRyPEZvcm1hdEF0dHI+KCkpCi0gICAgICAgRkQtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIEZvcm1hdEF0dHIoRkQtPmdldExvY2F0aW9uKCksIENvbnRleHQsCisgICAgIGlmICghRkQtPmhhc0F0dHI8Rm9ybWF0QXR0cj4oKSkKKyAgICAgICBGRC0+YWRkQXR0cihGb3JtYXRBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb250ZXh0LklkZW50cy5nZXQoInNjYW5mIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0SWR4KzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVkFMaXN0QXJnID8gMCA6IEZvcm1hdElkeCsyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzVkFMaXN0QXJnID8gMCA6IEZvcm1hdElkeCsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZELT5nZXRMb2NhdGlvbigpKSk7CiAgICAgfQogCiAgICAgLy8gTWFyayBjb25zdCBpZiB3ZSBkb24ndCBjYXJlIGFib3V0IGVycm5vIGFuZCB0aGF0IGlzIHRoZSBvbmx5CkBAIC0xMDAzOCwxNyArMTAxNzMsMTggQEAKICAgICAvLyBJUmdlbiB0byB1c2UgTExWTSBpbnRyaW5zaWNzIGZvciBzdWNoIGZ1bmN0aW9ucy4KICAgICBpZiAoIWdldExhbmdPcHRzKCkuTWF0aEVycm5vICYmCiAgICAgICAgIENvbnRleHQuQnVpbHRpbkluZm8uaXNDb25zdFdpdGhvdXRFcnJubyhCdWlsdGluSUQpKSB7Ci0gICAgICBpZiAoIUZELT5nZXRBdHRyPENvbnN0QXR0cj4oKSkKLSAgICAgICAgRkQtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIENvbnN0QXR0cihGRC0+Z2V0TG9jYXRpb24oKSwgQ29udGV4dCkpOworICAgICAgaWYgKCFGRC0+aGFzQXR0cjxDb25zdEF0dHI+KCkpCisgICAgICAgIEZELT5hZGRBdHRyKENvbnN0QXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCwgRkQtPmdldExvY2F0aW9uKCkpKTsKICAgICB9CiAKICAgICBpZiAoQ29udGV4dC5CdWlsdGluSW5mby5pc1JldHVybnNUd2ljZShCdWlsdGluSUQpICYmCi0gICAgICAgICFGRC0+Z2V0QXR0cjxSZXR1cm5zVHdpY2VBdHRyPigpKQotICAgICAgRkQtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIFJldHVybnNUd2ljZUF0dHIoRkQtPmdldExvY2F0aW9uKCksIENvbnRleHQpKTsKLSAgICBpZiAoQ29udGV4dC5CdWlsdGluSW5mby5pc05vVGhyb3coQnVpbHRpbklEKSAmJiAhRkQtPmdldEF0dHI8Tm9UaHJvd0F0dHI+KCkpCi0gICAgICBGRC0+YWRkQXR0cig6Om5ldyAoQ29udGV4dCkgTm9UaHJvd0F0dHIoRkQtPmdldExvY2F0aW9uKCksIENvbnRleHQpKTsKLSAgICBpZiAoQ29udGV4dC5CdWlsdGluSW5mby5pc0NvbnN0KEJ1aWx0aW5JRCkgJiYgIUZELT5nZXRBdHRyPENvbnN0QXR0cj4oKSkKLSAgICAgIEZELT5hZGRBdHRyKDo6bmV3IChDb250ZXh0KSBDb25zdEF0dHIoRkQtPmdldExvY2F0aW9uKCksIENvbnRleHQpKTsKKyAgICAgICAgIUZELT5oYXNBdHRyPFJldHVybnNUd2ljZUF0dHI+KCkpCisgICAgICBGRC0+YWRkQXR0cihSZXR1cm5zVHdpY2VBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRC0+Z2V0TG9jYXRpb24oKSkpOworICAgIGlmIChDb250ZXh0LkJ1aWx0aW5JbmZvLmlzTm9UaHJvdyhCdWlsdGluSUQpICYmICFGRC0+aGFzQXR0cjxOb1Rocm93QXR0cj4oKSkKKyAgICAgIEZELT5hZGRBdHRyKE5vVGhyb3dBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LCBGRC0+Z2V0TG9jYXRpb24oKSkpOworICAgIGlmIChDb250ZXh0LkJ1aWx0aW5JbmZvLmlzQ29uc3QoQnVpbHRpbklEKSAmJiAhRkQtPmhhc0F0dHI8Q29uc3RBdHRyPigpKQorICAgICAgRkQtPmFkZEF0dHIoQ29uc3RBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LCBGRC0+Z2V0TG9jYXRpb24oKSkpOwogICB9CiAKICAgSWRlbnRpZmllckluZm8gKk5hbWUgPSBGRC0+Z2V0SWRlbnRpZmllcigpOwpAQCAtMTAwNjcsMTcgKzEwMjAzLDE5IEBACiAgIGlmIChOYW1lLT5pc1N0cigiYXNwcmludGYiKSB8fCBOYW1lLT5pc1N0cigidmFzcHJpbnRmIikpIHsKICAgICAvLyBGSVhNRTogYXNwcmludGYgYW5kIHZhc3ByaW50ZiBhcmVuJ3QgQzk5IGZ1bmN0aW9ucy4gU2hvdWxkIHRoZXkgYmUKICAgICAvLyB0YXJnZXQtc3BlY2lmaWMgYnVpbHRpbnMsIHBlcmhhcHM/Ci0gICAgaWYgKCFGRC0+Z2V0QXR0cjxGb3JtYXRBdHRyPigpKQotICAgICAgRkQtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIEZvcm1hdEF0dHIoRkQtPmdldExvY2F0aW9uKCksIENvbnRleHQsCisgICAgaWYgKCFGRC0+aGFzQXR0cjxGb3JtYXRBdHRyPigpKQorICAgICAgRkQtPmFkZEF0dHIoRm9ybWF0QXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb250ZXh0LklkZW50cy5nZXQoInByaW50ZiIpLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS0+aXNTdHIoInZhc3ByaW50ZiIpID8gMCA6IDMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUtPmlzU3RyKCJ2YXNwcmludGYiKSA/IDAgOiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkQtPmdldExvY2F0aW9uKCkpKTsKICAgfQogCiAgIGlmIChOYW1lLT5pc1N0cigiX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZyIpKSB7CiAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGEgX19idWlsdGluX19fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcsCiAgICAgLy8gYnV0IGJ1aWxkcyB0aGF0IHVzZSAtZm5vLWNvbnN0YW50LWNmc3RyaW5ncyBkb24ndCBnbyB0aHJvdWdoIHRoYXQuCi0gICAgaWYgKCFGRC0+Z2V0QXR0cjxGb3JtYXRBcmdBdHRyPigpKQotICAgICAgRkQtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIEZvcm1hdEFyZ0F0dHIoRkQtPmdldExvY2F0aW9uKCksIENvbnRleHQsIDEpKTsKKyAgICBpZiAoIUZELT5oYXNBdHRyPEZvcm1hdEFyZ0F0dHI+KCkpCisgICAgICBGRC0+YWRkQXR0cihGb3JtYXRBcmdBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkQtPmdldExvY2F0aW9uKCkpKTsKICAgfQogfQogCkBAIC0xMDE0MCw2ICsxMDI3OCwyNyBAQAogICAgIGlmICghQ29udGV4dC5oYXNTYW1lVHlwZShULCBDb250ZXh0LmdldFRhZ0RlY2xUeXBlKHRhZ0Zyb21EZWNsU3BlYykpKQogICAgICAgYnJlYWs7CiAKKyAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGNvbXB1dGVkIGxpbmthZ2UgZm9yIHRoZSBhbm9ueW1vdXMgdGFnLCB0aGVuCisgICAgLy8gYWRkaW5nIGEgdHlwZWRlZiBuYW1lIGZvciB0aGUgYW5vbnltb3VzIGRlY2wgY2FuIGNoYW5nZSB0aGF0CisgICAgLy8gbGlua2FnZSwgd2hpY2ggbWlnaHQgYmUgYSBzZXJpb3VzIHByb2JsZW0uICBEaWFnbm9zZSB0aGlzIGFzCisgICAgLy8gdW5zdXBwb3J0ZWQgYW5kIGlnbm9yZSB0aGUgdHlwZWRlZiBuYW1lLiAgVE9ETzogd2Ugc2hvdWxkCisgICAgLy8gcHVyc3VlIHRoaXMgYXMgYSBsYW5ndWFnZSBkZWZlY3QgYW5kIGVzdGFibGlzaCBhIGZvcm1hbCBydWxlCisgICAgLy8gZm9yIGhvdyB0byBoYW5kbGUgaXQuCisgICAgaWYgKHRhZ0Zyb21EZWNsU3BlYy0+aGFzTGlua2FnZUJlZW5Db21wdXRlZCgpKSB7CisgICAgICBEaWFnKEQuZ2V0SWRlbnRpZmllckxvYygpLCBkaWFnOjplcnJfdHlwZWRlZl9jaGFuZ2VzX2xpbmthZ2UpOworCisgICAgICBTb3VyY2VMb2NhdGlvbiB0YWdMb2MgPSBELmdldERlY2xTcGVjKCkuZ2V0VHlwZVNwZWNUeXBlTG9jKCk7CisgICAgICB0YWdMb2MgPSBMZXhlcjo6Z2V0TG9jRm9yRW5kT2ZUb2tlbih0YWdMb2MsIDAsIGdldFNvdXJjZU1hbmFnZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExhbmdPcHRzKCkpOworCisgICAgICBsbHZtOjpTbWFsbFN0cmluZzw0MD4gdGV4dFRvSW5zZXJ0OworICAgICAgdGV4dFRvSW5zZXJ0ICs9ICcgJzsKKyAgICAgIHRleHRUb0luc2VydCArPSBELmdldElkZW50aWZpZXIoKS0+Z2V0TmFtZSgpOworICAgICAgRGlhZyh0YWdMb2MsIGRpYWc6Om5vdGVfdHlwZWRlZl9jaGFuZ2VzX2xpbmthZ2UpCisgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKHRhZ0xvYywgdGV4dFRvSW5zZXJ0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKwogICAgIC8vIE90aGVyd2lzZSwgc2V0IHRoaXMgaXMgdGhlIGFub24tZGVjbCB0eXBlZGVmIGZvciB0aGUgdGFnLgogICAgIHRhZ0Zyb21EZWNsU3BlYy0+c2V0VHlwZWRlZk5hbWVGb3JBbm9uRGVjbChOZXdURCk7CiAgICAgYnJlYWs7CkBAIC0xMDE3OSw3ICsxMDMzOCw3IEBACiAgIGlmIChJc1Njb3BlZCAhPSBQcmV2LT5pc1Njb3BlZCgpKSB7CiAgICAgRGlhZyhFbnVtTG9jLCBkaWFnOjplcnJfZW51bV9yZWRlY2xhcmVfc2NvcGVkX21pc21hdGNoKQogICAgICAgPDwgUHJldi0+aXNTY29wZWQoKTsKLSAgICBEaWFnKFByZXYtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJldmlvdXNfdXNlKTsKKyAgICBEaWFnKFByZXYtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJldmlvdXNfZGVjbGFyYXRpb24pOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTEwMTg4LDE1ICsxMDM0NywxNyBAQAogICAgICAgICAhUHJldi0+Z2V0SW50ZWdlclR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCkgJiYKICAgICAgICAgIUNvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShFbnVtVW5kZXJseWluZ1R5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXYtPmdldEludGVnZXJUeXBlKCkpKSB7CisgICAgICAvLyBUT0RPOiBIaWdobGlnaHQgdGhlIHVuZGVybHlpbmcgdHlwZSBvZiB0aGUgcmVkZWNsYXJhdGlvbi4KICAgICAgIERpYWcoRW51bUxvYywgZGlhZzo6ZXJyX2VudW1fcmVkZWNsYXJlX3R5cGVfbWlzbWF0Y2gpCiAgICAgICAgIDw8IEVudW1VbmRlcmx5aW5nVHkgPDwgUHJldi0+Z2V0SW50ZWdlclR5cGUoKTsKLSAgICAgIERpYWcoUHJldi0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcmV2aW91c191c2UpOworICAgICAgRGlhZyhQcmV2LT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3ByZXZpb3VzX2RlY2xhcmF0aW9uKQorICAgICAgICAgIDw8IFByZXYtPmdldEludGVnZXJUeXBlUmFuZ2UoKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgfSBlbHNlIGlmIChJc0ZpeGVkICE9IFByZXYtPmlzRml4ZWQoKSkgewogICAgIERpYWcoRW51bUxvYywgZGlhZzo6ZXJyX2VudW1fcmVkZWNsYXJlX2ZpeGVkX21pc21hdGNoKQogICAgICAgPDwgUHJldi0+aXNGaXhlZCgpOwotICAgIERpYWcoUHJldi0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcmV2aW91c191c2UpOworICAgIERpYWcoUHJldi0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcmV2aW91c19kZWNsYXJhdGlvbik7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIApAQCAtMTAyNzYsOCArMTA0MzcsNyBAQAogICAgICAgfQogCiAgICAgICBib29sIHByZXZpb3VzTWlzbWF0Y2ggPSBmYWxzZTsKLSAgICAgIGZvciAoVGFnRGVjbDo6cmVkZWNsX2l0ZXJhdG9yIEkoUHJldmlvdXMtPnJlZGVjbHNfYmVnaW4oKSksCi0gICAgICAgICAgIEUoUHJldmlvdXMtPnJlZGVjbHNfZW5kKCkpOyBJICE9IEU7ICsrSSkgeworICAgICAgZm9yIChhdXRvIEkgOiBQcmV2aW91cy0+cmVkZWNscygpKSB7CiAgICAgICAgIGlmIChJLT5nZXRUYWdLaW5kKCkgIT0gTmV3VGFnKSB7CiAgICAgICAgICAgaWYgKCFwcmV2aW91c01pc21hdGNoKSB7CiAgICAgICAgICAgICBwcmV2aW91c01pc21hdGNoID0gdHJ1ZTsKQEAgLTEwMzA4LDcgKzEwNDY4LDcgQEAKICAgICAgIDw8IGdldFJlZGVjbERpYWdGcm9tVGFnS2luZChPbGRUYWcpOwogICAgIERpYWcoUmVkZWNsLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3ByZXZpb3VzX3VzZSk7CiAKLSAgICAvLyBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIGRlZmludGlvbiwgc3VnZ2VzdCBhIGZpeC1pdC4KKyAgICAvLyBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIGRlZmluaXRpb24sIHN1Z2dlc3QgYSBmaXgtaXQuCiAgICAgaWYgKFByZXZpb3VzLT5nZXREZWZpbml0aW9uKCkpIHsKICAgICAgICAgRGlhZyhOZXdUYWdMb2MsIGRpYWc6Om5vdGVfc3RydWN0X2NsYXNzX3N1Z2dlc3Rpb24pCiAgICAgICAgICAgPDwgZ2V0UmVkZWNsRGlhZ0Zyb21UYWdLaW5kKFJlZGVjbC0+Z2V0VGFnS2luZCgpKQpAQCAtMTAzMjUsNiArMTA0ODUsOSBAQAogLy8vIGZvcm1lciBjYXNlLCBOYW1lIHdpbGwgYmUgbm9uLW51bGwuICBJbiB0aGUgbGF0ZXIgY2FzZSwgTmFtZSB3aWxsIGJlIG51bGwuCiAvLy8gVGFnU3BlYyBpbmRpY2F0ZXMgd2hhdCBraW5kIG9mIHRhZyB0aGlzIGlzLiBUVUsgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhCiAvLy8gcmVmZXJlbmNlL2RlY2xhcmF0aW9uL2RlZmluaXRpb24gb2YgYSB0YWcuCisvLy8KKy8vLyBJc1R5cGVTcGVjaWZpZXIgaXMgdHJ1ZSBpZiB0aGlzIGlzIGEgdHlwZS1zcGVjaWZpZXIgKG9yCisvLy8gdHJhaWxpbmctdHlwZS1zcGVjaWZpZXIpIG90aGVyIHRoYW4gb25lIGluIGFuIGFsaWFzLWRlY2xhcmF0aW9uLgogRGVjbCAqU2VtYTo6QWN0T25UYWcoU2NvcGUgKlMsIHVuc2lnbmVkIFRhZ1NwZWMsIFRhZ1VzZUtpbmQgVFVLLAogICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gS1dMb2MsIENYWFNjb3BlU3BlYyAmU1MsCiAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVySW5mbyAqTmFtZSwgU291cmNlTG9jYXRpb24gTmFtZUxvYywKQEAgLTEwMzM0LDcgKzEwNDk3LDggQEAKICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJk93bmVkRGVjbCwgYm9vbCAmSXNEZXBlbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTY29wZWRFbnVtS1dMb2MsCiAgICAgICAgICAgICAgICAgICAgICBib29sIFNjb3BlZEVudW1Vc2VzQ2xhc3NUYWcsCi0gICAgICAgICAgICAgICAgICAgICBUeXBlUmVzdWx0IFVuZGVybHlpbmdUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICBUeXBlUmVzdWx0IFVuZGVybHlpbmdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1R5cGVTcGVjaWZpZXIpIHsKICAgLy8gSWYgdGhpcyBpcyBub3QgYSBkZWZpbml0aW9uLCBpdCBtdXN0IGhhdmUgYSBuYW1lLgogICBJZGVudGlmaWVySW5mbyAqT3JpZ05hbWUgPSBOYW1lOwogICBhc3NlcnQoKE5hbWUgIT0gMCB8fCBUVUsgPT0gVFVLX0RlZmluaXRpb24pICYmCkBAIC0xMDQxMiw3ICsxMDU3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUFBDX0ZpeGVkVW5kZXJseWluZ1R5cGUpKQogICAgICAgICBFbnVtVW5kZXJseWluZyA9IENvbnRleHQuSW50VHkuZ2V0VHlwZVB0cigpOwogCi0gICAgfSBlbHNlIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUpCisgICAgfSBlbHNlIGlmIChnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQpCiAgICAgICAvLyBNaWNyb3NvZnQgZW51bXMgYXJlIGFsd2F5cyBvZiBpbnQgdHlwZS4KICAgICAgIEVudW1VbmRlcmx5aW5nID0gQ29udGV4dC5JbnRUeS5nZXRUeXBlUHRyKCk7CiAgIH0KQEAgLTEwNjM0LDcgKzEwNzk4LDkgQEAKICAgfQogCiAgIGlmICghUHJldmlvdXMuZW1wdHkoKSkgewotICAgIE5hbWVkRGVjbCAqUHJldkRlY2wgPSAoKlByZXZpb3VzLmJlZ2luKCkpLT5nZXRVbmRlcmx5aW5nRGVjbCgpOworICAgIE5hbWVkRGVjbCAqUHJldkRlY2wgPSBQcmV2aW91cy5nZXRGb3VuZERlY2woKTsKKyAgICBOYW1lZERlY2wgKkRpcmVjdFByZXZEZWNsID0KKyAgICAgICAgZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0ID8gKlByZXZpb3VzLmJlZ2luKCkgOiBQcmV2RGVjbDsKIAogICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgdGFnIGRlY2wgaW4gdGhlIHNhbWUgc2NvcGUgYXMgYSB0eXBlZGVmCiAgICAgLy8gd2hpY2ggaGlkZXMgYSB0YWcgZGVjbCBpbiB0aGUgc2FtZSBzY29wZS4gIEZpbmRpbmcgdGhpcwpAQCAtMTA2NjYsNyArMTA4MzIsOCBAQAogICAgICAgLy8gaW4gdGhlIHNhbWUgc2NvcGUgKHNvIHRoYXQgdGhlIGRlZmluaXRpb24vZGVjbGFyYXRpb24gY29tcGxldGVzIG9yCiAgICAgICAvLyByZW1lbnRpb25zIHRoZSB0YWcpLCByZXVzZSB0aGUgZGVjbC4KICAgICAgIGlmIChUVUsgPT0gVFVLX1JlZmVyZW5jZSB8fCBUVUsgPT0gVFVLX0ZyaWVuZCB8fAotICAgICAgICAgIGlzRGVjbEluU2NvcGUoUHJldkRlY2wsIFNlYXJjaERDLCBTLCBpc0V4cGxpY2l0U3BlY2lhbGl6YXRpb24pKSB7CisgICAgICAgICAgaXNEZWNsSW5TY29wZShEaXJlY3RQcmV2RGVjbCwgU2VhcmNoREMsIFMsCisgICAgICAgICAgICAgICAgICAgICAgICBTUy5pc05vdEVtcHR5KCkgfHwgaXNFeHBsaWNpdFNwZWNpYWxpemF0aW9uKSkgewogICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGlzIHdhc24ndCBkZWNsYXJlZCBhcyBhbiBlbnVtIGFuZCBub3cgdXNlZCBhcyBhCiAgICAgICAgIC8vIHN0cnVjdCBvciBzb21ldGhpbmcgc2ltaWxhci4KICAgICAgICAgaWYgKCFpc0FjY2VwdGFibGVUYWdSZWRlY2xhcmF0aW9uKFByZXZUYWdEZWNsLCBLaW5kLApAQCAtMTA3MDksNyArMTA4NzYsNyBAQAogCiAgICAgICAgICAgUXVhbFR5cGUgRW51bVVuZGVybHlpbmdUeTsKICAgICAgICAgICBpZiAoVHlwZVNvdXJjZUluZm8gKlRJID0gRW51bVVuZGVybHlpbmcuZHluX2Nhc3Q8VHlwZVNvdXJjZUluZm8qPigpKQotICAgICAgICAgICAgRW51bVVuZGVybHlpbmdUeSA9IFRJLT5nZXRUeXBlKCk7CisgICAgICAgICAgICBFbnVtVW5kZXJseWluZ1R5ID0gVEktPmdldFR5cGUoKS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKICAgICAgICAgICBlbHNlIGlmIChjb25zdCBUeXBlICpUID0gRW51bVVuZGVybHlpbmcuZHluX2Nhc3Q8Y29uc3QgVHlwZSo+KCkpCiAgICAgICAgICAgICBFbnVtVW5kZXJseWluZ1R5ID0gUXVhbFR5cGUoVCwgMCk7CiAKQEAgLTEwODI3LDggKzEwOTk0LDggQEAKICAgICAgICAgSW52YWxpZCA9IHRydWU7CiAKICAgICAgIC8vIE90aGVyd2lzZSwgb25seSBkaWFnbm9zZSBpZiB0aGUgZGVjbGFyYXRpb24gaXMgaW4gc2NvcGUuCi0gICAgICB9IGVsc2UgaWYgKCFpc0RlY2xJblNjb3BlKFByZXZEZWNsLCBTZWFyY2hEQywgUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXhwbGljaXRTcGVjaWFsaXphdGlvbikpIHsKKyAgICAgIH0gZWxzZSBpZiAoIWlzRGVjbEluU2NvcGUoUHJldkRlY2wsIFNlYXJjaERDLCBTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUy5pc05vdEVtcHR5KCkgfHwgaXNFeHBsaWNpdFNwZWNpYWxpemF0aW9uKSkgewogICAgICAgICAvLyBkbyBub3RoaW5nCiAKICAgICAgIC8vIERpYWdub3NlIGltcGxpY2l0IGRlY2xhcmF0aW9ucyBpbnRyb2R1Y2VkIGJ5IGVsYWJvcmF0ZWQgdHlwZXMuCkBAIC0xMDkwNCw3ICsxMTA3MSw3IEBACiAgICAgICAgIERpYWcoRGVmLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3ByZXZpb3VzX2RlZmluaXRpb24pOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgdW5zaWduZWQgRGlhZ0lEID0gZGlhZzo6ZXh0X2ZvcndhcmRfcmVmX2VudW07Ci0gICAgICAgIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUpCisgICAgICAgIGlmIChnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQpCiAgICAgICAgICAgRGlhZ0lEID0gZGlhZzo6ZXh0X21zX2ZvcndhcmRfcmVmX2VudW07CiAgICAgICAgIGVsc2UgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKQogICAgICAgICAgIERpYWdJRCA9IGRpYWc6OmVycl9mb3J3YXJkX3JlZl9lbnVtOwpAQCAtMTA5NDQsNiArMTExMTEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X29yX251bGw8UmVjb3JkRGVjbD4oUHJldkRlY2wpKTsKICAgfQogCisgIC8vIEMrKzExIFtkY2wudHlwZV1wMzoKKyAgLy8gICBBIHR5cGUtc3BlY2lmaWVyLXNlcSBzaGFsbCBub3QgZGVmaW5lIGEgY2xhc3Mgb3IgZW51bWVyYXRpb24gWy4uLl0uCisgIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyAmJiBJc1R5cGVTcGVjaWZpZXIgJiYgVFVLID09IFRVS19EZWZpbml0aW9uKSB7CisgICAgRGlhZyhOZXctPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl90eXBlX2RlZmluZWRfaW5fdHlwZV9zcGVjaWZpZXIpCisgICAgICA8PCBDb250ZXh0LmdldFRhZ0RlY2xUeXBlKE5ldyk7CisgICAgSW52YWxpZCA9IHRydWU7CisgIH0KKwogICAvLyBNYXliZSBhZGQgcXVhbGlmaWVyIGluZm8uCiAgIGlmIChTUy5pc05vdEVtcHR5KCkpIHsKICAgICBpZiAoU1MuaXNTZXQoKSkgewpAQCAtMTEwMDcsMTAgKzExMTgyLDE0IEBACiAgIGlmIChBdHRyKQogICAgIFByb2Nlc3NEZWNsQXR0cmlidXRlTGlzdChTLCBOZXcsIEF0dHIpOwogCi0gIC8vIElmIHdlJ3JlIGRlY2xhcmluZyBvciBkZWZpbmluZyBhIHRhZyBpbiBmdW5jdGlvbiBwcm90b3R5cGUgc2NvcGUKLSAgLy8gaW4gQywgbm90ZSB0aGF0IHRoaXMgdHlwZSBjYW4gb25seSBiZSB1c2VkIHdpdGhpbiB0aGUgZnVuY3Rpb24uCi0gIGlmIChOYW1lICYmIFMtPmlzRnVuY3Rpb25Qcm90b3R5cGVTY29wZSgpICYmICFnZXRMYW5nT3B0cygpLkNQbHVzUGx1cykKKyAgLy8gSWYgd2UncmUgZGVjbGFyaW5nIG9yIGRlZmluaW5nIGEgdGFnIGluIGZ1bmN0aW9uIHByb3RvdHlwZSBzY29wZSBpbiBDLAorICAvLyBub3RlIHRoYXQgdGhpcyB0eXBlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIHRoZSBmdW5jdGlvbiBhbmQgYWRkIGl0IHRvCisgIC8vIHRoZSBsaXN0IG9mIGRlY2xzIHRvIGluamVjdCBpbnRvIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIHNjb3BlLgorICBpZiAoIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzICYmIChOYW1lIHx8IEtpbmQgPT0gVFRLX0VudW0pICYmCisgICAgICBnZXROb25GaWVsZERlY2xTY29wZShTKS0+aXNGdW5jdGlvblByb3RvdHlwZVNjb3BlKCkpIHsKICAgICBEaWFnKExvYywgZGlhZzo6d2Fybl9kZWNsX2luX3BhcmFtX2xpc3QpIDw8IENvbnRleHQuZ2V0VGFnRGVjbFR5cGUoTmV3KTsKKyAgICBEZWNsc0luUHJvdG90eXBlU2NvcGUucHVzaF9iYWNrKE5ldyk7CisgIH0KIAogICAvLyBTZXQgdGhlIGxleGljYWwgY29udGV4dC4gSWYgdGhlIHRhZyBoYXMgYSBDKysgc2NvcGUgc3BlY2lmaWVyLCB0aGUKICAgLy8gbGV4aWNhbCBjb250ZXh0IHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIHNlbWFudGljIGNvbnRleHQuCkBAIC0xMTA2MCwxMiArMTEyMzksNiBAQAogICAgICAgICBJSS0+aXNTdHIoIkZJTEUiKSkKICAgICAgIENvbnRleHQuc2V0RklMRURlY2woTmV3KTsKIAotICAvLyBJZiB3ZSB3ZXJlIGluIGZ1bmN0aW9uIHByb3RvdHlwZSBzY29wZSAoYW5kIG5vdCBpbiBDKysgbW9kZSksIGFkZCB0aGlzCi0gIC8vIHRhZyB0byB0aGUgbGlzdCBvZiBkZWNscyB0byBpbmplY3QgaW50byB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBzY29wZS4KLSAgaWYgKFMtPmlzRnVuY3Rpb25Qcm90b3R5cGVTY29wZSgpICYmICFnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyAmJgotICAgICAgSW5GdW5jdGlvbkRlY2xhcmF0b3IgJiYgTmFtZSkKLSAgICBEZWNsc0luUHJvdG90eXBlU2NvcGUucHVzaF9iYWNrKE5ldyk7Ci0KICAgaWYgKFByZXZEZWNsKQogICAgIG1lcmdlRGVjbEF0dHJpYnV0ZXMoTmV3LCBQcmV2RGVjbCk7CiAKQEAgLTExMjU1LDcgKzExNDI4LDggQEAKICAgaWYgKCFGaWVsZFR5LT5pc0RlcGVuZGVudFR5cGUoKSkgewogICAgIHVpbnQ2NF90IFR5cGVTaXplID0gQ29udGV4dC5nZXRUeXBlU2l6ZShGaWVsZFR5KTsKICAgICBpZiAoVmFsdWUuZ2V0WkV4dFZhbHVlKCkgPiBUeXBlU2l6ZSkgewotICAgICAgaWYgKCFnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyB8fCBJc01zU3RydWN0KSB7CisgICAgICBpZiAoIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzIHx8IElzTXNTdHJ1Y3QgfHwKKyAgICAgICAgICBDb250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRDWFhBQkkoKS5pc01pY3Jvc29mdCgpKSB7CiAgICAgICAgIGlmIChGaWVsZE5hbWUpIAogICAgICAgICAgIHJldHVybiBEaWFnKEZpZWxkTG9jLCBkaWFnOjplcnJfYml0ZmllbGRfd2lkdGhfZXhjZWVkc190eXBlX3NpemUpCiAgICAgICAgICAgICA8PCBGaWVsZE5hbWUgPDwgKHVuc2lnbmVkKVZhbHVlLmdldFpFeHRWYWx1ZSgpIApAQCAtMTE1MDAsNiArMTE2NzQsMTIgQEAKICAgICB9CiAgIH0KIAorICAvLyBDKysxMSBbY2xhc3MudW5pb25dcDggKERSMTQ2MCk6CisgIC8vICAgQXQgbW9zdCBvbmUgdmFyaWFudCBtZW1iZXIgb2YgYSB1bmlvbiBtYXkgaGF2ZSBhCisgIC8vICAgYnJhY2Utb3ItZXF1YWwtaW5pdGlhbGl6ZXIuCisgIGlmIChJbml0U3R5bGUgIT0gSUNJU19Ob0luaXQpCisgICAgY2hlY2tEdXBsaWNhdGVEZWZhdWx0SW5pdCgqdGhpcywgY2FzdDxDWFhSZWNvcmREZWNsPihSZWNvcmQpLCBMb2MpOworCiAgIEZpZWxkRGVjbCAqTmV3RkQgPSBGaWVsZERlY2w6OkNyZWF0ZShDb250ZXh0LCBSZWNvcmQsIFRTU0wsIExvYywgSUksIFQsIFRJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0V2lkdGgsIE11dGFibGUsIEluaXRTdHlsZSk7CiAgIGlmIChJbnZhbGlkRGVjbCkKQEAgLTExNjAzLDggKzExNzgzLDkgQEAKICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBGRC0+Z2V0TG9jYXRpb24oKTsKICAgICAgICAgICBpZiAoZ2V0U291cmNlTWFuYWdlcigpLmlzSW5TeXN0ZW1IZWFkZXIoTG9jKSkgewogICAgICAgICAgICAgaWYgKCFGRC0+aGFzQXR0cjxVbmF2YWlsYWJsZUF0dHI+KCkpCi0gICAgICAgICAgICAgIEZELT5hZGRBdHRyKG5ldyAoQ29udGV4dCkgVW5hdmFpbGFibGVBdHRyKExvYywgQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBzeXN0ZW0gZmllbGQgaGFzIHJldGFpbmluZyBvd25lcnNoaXAiKSk7CisgICAgICAgICAgICAgIEZELT5hZGRBdHRyKFVuYXZhaWxhYmxlQXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBzeXN0ZW0gZmllbGQgaGFzIHJldGFpbmluZyBvd25lcnNoaXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYykpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTE4MTMsOSArMTE5OTQsOCBAQAogICAvLyBtZW1iZXJzIG9mIGFub255bW91cyBzdHJ1Y3RzIGFuZCB1bmlvbnMgaW4gdGhlIHRvdGFsLgogICB1bnNpZ25lZCBOdW1OYW1lZE1lbWJlcnMgPSAwOwogICBpZiAoUmVjb3JkKSB7Ci0gICAgZm9yIChSZWNvcmREZWNsOjpkZWNsX2l0ZXJhdG9yIGkgPSBSZWNvcmQtPmRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBSZWNvcmQtPmRlY2xzX2VuZCgpOyBpICE9IGU7IGkrKykgewotICAgICAgaWYgKEluZGlyZWN0RmllbGREZWNsICpJRkQgPSBkeW5fY2FzdDxJbmRpcmVjdEZpZWxkRGVjbD4oKmkpKQorICAgIGZvciAoY29uc3QgYXV0byAqSSA6IFJlY29yZC0+ZGVjbHMoKSkgeworICAgICAgaWYgKGNvbnN0IGF1dG8gKklGRCA9IGR5bl9jYXN0PEluZGlyZWN0RmllbGREZWNsPihJKSkKICAgICAgICAgaWYgKElGRC0+Z2V0RGVjbE5hbWUoKSkKICAgICAgICAgICArK051bU5hbWVkTWVtYmVyczsKICAgICB9CkBAIC0xMTkwMiw5ICsxMjA4MiwxNCBAQAogICAgICAgICBEaWFnKEZELT5nZXRMb2NhdGlvbigpLCBkaWFnOjpleHRfYzk5X2ZsZXhpYmxlX2FycmF5X21lbWJlcikKICAgICAgICAgICA8PCBGRC0+Z2V0RGVjbE5hbWUoKSA8PCBSZWNvcmQtPmdldFRhZ0tpbmQoKTsKIAotICAgICAgaWYgKCFGRC0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSAmJgotICAgICAgICAgICFDb250ZXh0LmdldEJhc2VFbGVtZW50VHlwZShGRC0+Z2V0VHlwZSgpKS5pc1BPRFR5cGUoQ29udGV4dCkpIHsKLSAgICAgICAgRGlhZyhGRC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2ZsZXhpYmxlX2FycmF5X2hhc19ub25wb2RfdHlwZSkKKyAgICAgIC8vIElmIHRoZSBlbGVtZW50IHR5cGUgaGFzIGEgbm9uLXRyaXZpYWwgZGVzdHJ1Y3Rvciwgd2Ugd291bGQgbm90CisgICAgICAvLyBpbXBsaWNpdGx5IGRlc3Ryb3kgdGhlIGVsZW1lbnRzLCBzbyBkaXNhbGxvdyBpdCBmb3Igbm93LgorICAgICAgLy8KKyAgICAgIC8vIEZJWE1FOiBHQ0MgYWxsb3dzIHRoaXMuIFdlIHNob3VsZCBwcm9iYWJseSBlaXRoZXIgaW1wbGljaXRseSBkZWxldGUKKyAgICAgIC8vIHRoZSBkZXN0cnVjdG9yIG9mIHRoZSBjb250YWluaW5nIGNsYXNzLCBvciBqdXN0IGFsbG93IHRoaXMuCisgICAgICBRdWFsVHlwZSBCYXNlRWxlbSA9IENvbnRleHQuZ2V0QmFzZUVsZW1lbnRUeXBlKEZELT5nZXRUeXBlKCkpOworICAgICAgaWYgKCFCYXNlRWxlbS0+aXNEZXBlbmRlbnRUeXBlKCkgJiYgQmFzZUVsZW0uaXNEZXN0cnVjdGVkVHlwZSgpKSB7CisgICAgICAgIERpYWcoRkQtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9mbGV4aWJsZV9hcnJheV9oYXNfbm9udHJpdmlhbF9kdG9yKQogICAgICAgICAgIDw8IEZELT5nZXREZWNsTmFtZSgpIDw8IEZELT5nZXRUeXBlKCk7CiAgICAgICAgIEZELT5zZXRJbnZhbGlkRGVjbCgpOwogICAgICAgICBFbmNsb3NpbmdEZWNsLT5zZXRJbnZhbGlkRGVjbCgpOwpAQCAtMTE5NzIsOCArMTIxNTcsOSBAQAogICAgICAgICBTb3VyY2VMb2NhdGlvbiBsb2MgPSBGRC0+Z2V0TG9jYXRpb24oKTsKICAgICAgICAgaWYgKGdldFNvdXJjZU1hbmFnZXIoKS5pc0luU3lzdGVtSGVhZGVyKGxvYykpIHsKICAgICAgICAgICBpZiAoIUZELT5oYXNBdHRyPFVuYXZhaWxhYmxlQXR0cj4oKSkgewotICAgICAgICAgICAgRkQtPmFkZEF0dHIobmV3IChDb250ZXh0KSBVbmF2YWlsYWJsZUF0dHIobG9jLCBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgc3lzdGVtIGZpZWxkIGhhcyByZXRhaW5pbmcgb3duZXJzaGlwIikpOworICAgICAgICAgICAgRkQtPmFkZEF0dHIoVW5hdmFpbGFibGVBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgc3lzdGVtIGZpZWxkIGhhcyByZXRhaW5pbmcgb3duZXJzaGlwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYykpOwogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBEaWFnKEZELT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfYXJjX29iamNfb2JqZWN0X2luX3RhZykgCkBAIC0xMjAyMSwxMiArMTIyMDcsNiBAQAogICAgICAgICAgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEpCiAgICAgICAgICAgICAgIEFkanVzdERlc3RydWN0b3JFeGNlcHRpb25TcGVjKENYWFJlY29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkLT5nZXREZXN0cnVjdG9yKCkpOwotCi0gICAgICAgICAgICAvLyBUaGUgTWljcm9zb2Z0IEFCSSByZXF1aXJlcyB0aGF0IHdlIHBlcmZvcm0gdGhlIGRlc3RydWN0b3IgYm9keQotICAgICAgICAgICAgLy8gY2hlY2tzIChpLmUuIG9wZXJhdG9yIGRlbGV0ZSgpIGxvb2t1cCkgYXQgZXZlcnkgZGVjbGFyYXRpb24sIGFzCi0gICAgICAgICAgICAvLyBhbnkgdHJhbnNsYXRpb24gdW5pdCBtYXkgbmVlZCB0byBlbWl0IGEgZGVsZXRpbmcgZGVzdHJ1Y3Rvci4KLSAgICAgICAgICAgIGlmIChDb250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRDWFhBQkkoKS5pc01pY3Jvc29mdCgpKQotICAgICAgICAgICAgICBDaGVja0Rlc3RydWN0b3IoQ1hYUmVjb3JkLT5nZXREZXN0cnVjdG9yKCkpOwogICAgICAgICAgIH0KIAogICAgICAgICAgIC8vIEFkZCBhbnkgaW1wbGljaXRseS1kZWNsYXJlZCBtZW1iZXJzIHRvIHRoaXMgY2xhc3MuCkBAIC0xMjA3OCw5ICsxMjI1OCwxNSBAQAogICAgIGlmICghQ29tcGxldGVkKQogICAgICAgUmVjb3JkLT5jb21wbGV0ZURlZmluaXRpb24oKTsKIAotICAgIGlmIChSZWNvcmQtPmhhc0F0dHJzKCkpCisgICAgaWYgKFJlY29yZC0+aGFzQXR0cnMoKSkgewogICAgICAgQ2hlY2tBbGlnbmFzVW5kZXJhbGlnbm1lbnQoUmVjb3JkKTsKIAorICAgICAgaWYgKGNvbnN0IE1TSW5oZXJpdGFuY2VBdHRyICpJQSA9IFJlY29yZC0+Z2V0QXR0cjxNU0luaGVyaXRhbmNlQXR0cj4oKSkKKyAgICAgICAgY2hlY2tNU0luaGVyaXRhbmNlQXR0ck9uRGVmaW5pdGlvbihjYXN0PENYWFJlY29yZERlY2w+KFJlY29yZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUEtPmdldFJhbmdlKCksIElBLT5nZXRCZXN0Q2FzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBLT5nZXRTZW1hbnRpY1NwZWxsaW5nKCkpOworICAgIH0KKwogICAgIC8vIENoZWNrIGlmIHRoZSBzdHJ1Y3R1cmUvdW5pb24gZGVjbGFyYXRpb24gaXMgYSB0eXBlIHRoYXQgY2FuIGhhdmUgemVybwogICAgIC8vIHNpemUgaW4gQy4gRm9yIEMgdGhpcyBpcyBhIGxhbmd1YWdlIGV4dGVuc2lvbiwgZm9yIEMrKyBpdCBtYXkgY2F1c2UKICAgICAvLyBjb21wYXRpYmlsaXR5IHByb2JsZW1zLgpAQCAtMTIxNzUsMTAgKzEyMzYxLDcgQEAKICAgICAgICAgICAgIERpYWcoQ2xzSXZhci0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcmV2aW91c19kZWZpbml0aW9uKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIH0KLSAgICAgICAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjprbm93bl9leHRlbnNpb25zX2l0ZXJhdG9yCi0gICAgICAgICAgICAgICAgIEV4dCA9IElEZWNsLT5rbm93bl9leHRlbnNpb25zX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgIEV4dEVuZCA9IElEZWNsLT5rbm93bl9leHRlbnNpb25zX2VuZCgpOwotICAgICAgICAgICAgICAgRXh0ICE9IEV4dEVuZDsgKytFeHQpIHsKKyAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gKkV4dCA6IElEZWNsLT5rbm93bl9leHRlbnNpb25zKCkpIHsKICAgICAgICAgICAgIGlmIChjb25zdCBPYmpDSXZhckRlY2wgKkNsc0V4dEl2YXIKICAgICAgICAgICAgICAgICAgID0gRXh0LT5nZXRJdmFyRGVjbChDbHNGaWVsZHNbaV0tPmdldElkZW50aWZpZXIoKSkpIHsKICAgICAgICAgICAgICAgRGlhZyhDbHNGaWVsZHNbaV0tPmdldExvY2F0aW9uKCksIApAQCAtMTIyNjIsNyArMTI0NDUsNyBAQAogICAgIGVsc2UgewogICAgICAgU291cmNlTG9jYXRpb24gRXhwTG9jOwogICAgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEgJiYgRW51bS0+aXNGaXhlZCgpICYmCi0gICAgICAgICAgIWdldExhbmdPcHRzKCkuTWljcm9zb2Z0TW9kZSkgeworICAgICAgICAgICFnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQpIHsKICAgICAgICAgLy8gQysrMTEgW2RjbC5lbnVtXXA1OiBJZiB0aGUgdW5kZXJseWluZyB0eXBlIGlzIGZpeGVkLCBbLi4uXSB0aGUKICAgICAgICAgLy8gY29uc3RhbnQtZXhwcmVzc2lvbiBpbiB0aGUgZW51bWVyYXRvci1kZWZpbml0aW9uIHNoYWxsIGJlIGEgY29udmVydGVkCiAgICAgICAgIC8vIGNvbnN0YW50IGV4cHJlc3Npb24gb2YgdGhlIHVuZGVybHlpbmcgdHlwZS4KQEAgLTEyMjg3LDcgKzEyNDcwLDcgQEAKICAgICAgICAgICAvLyB3ZSBwZXJmb3JtIGEgbm9uLW5hcnJvd2luZyBjb252ZXJzaW9uIGFzIHBhcnQgb2YgY29udmVydGVkIGNvbnN0YW50CiAgICAgICAgICAgLy8gZXhwcmVzc2lvbiBjaGVja2luZy4KICAgICAgICAgICBpZiAoIWlzUmVwcmVzZW50YWJsZUludGVnZXJWYWx1ZShDb250ZXh0LCBFbnVtVmFsLCBFbHRUeSkpIHsKLSAgICAgICAgICAgIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUpIHsKKyAgICAgICAgICAgIGlmIChnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQpIHsKICAgICAgICAgICAgICAgRGlhZyhJZExvYywgZGlhZzo6ZXh0X2VudW1lcmF0b3JfdG9vX2xhcmdlKSA8PCBFbHRUeTsKICAgICAgICAgICAgICAgVmFsID0gSW1wQ2FzdEV4cHJUb1R5cGUoVmFsLCBFbHRUeSwgQ0tfSW50ZWdyYWxDYXN0KS50YWtlKCk7CiAgICAgICAgICAgICB9IGVsc2UKQEAgLTEyMzcxLDcgKzEyNTU0LDcgQEAKICAgICAgICAgICAgICAgPDwgRW51bVZhbC50b1N0cmluZygxMCkKICAgICAgICAgICAgICAgPDwgRWx0VHk7CiAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgRGlhZyhJZExvYywgZGlhZzo6d2Fybl9lbnVtZXJhdG9yX3Rvb19sYXJnZSkKKyAgICAgICAgICAgIERpYWcoSWRMb2MsIGRpYWc6OmV4dF9lbnVtZXJhdG9yX2luY3JlbWVudF90b29fbGFyZ2UpCiAgICAgICAgICAgICAgIDw8IEVudW1WYWwudG9TdHJpbmcoMTApOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIEVsdFR5ID0gVDsKQEAgLTEyNzI5LDcgKzEyOTEyLDcgQEAKICAgLy8gVGhlIEM5OSBydWxlIGlzIG1vZGlmaWVkIGJ5IGEgZ2NjIGV4dGVuc2lvbiAKICAgUXVhbFR5cGUgQmVzdFByb21vdGlvblR5cGU7CiAKLSAgYm9vbCBQYWNrZWQgPSBFbnVtLT5nZXRBdHRyPFBhY2tlZEF0dHI+KCkgPyB0cnVlIDogZmFsc2U7CisgIGJvb2wgUGFja2VkID0gRW51bS0+aGFzQXR0cjxQYWNrZWRBdHRyPigpOwogICAvLyAtZnNob3J0LWVudW1zIGlzIHRoZSBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgdGhlIHBhY2tlZCBhdHRyaWJ1dGUgb24gYWxsCiAgIC8vIGVudW0gZGVmaW5pdGlvbnMuCiAgIGlmIChMYW5nT3B0cy5TaG9ydEVudW1zKQpAQCAtMTI3NjksNyArMTI5NTIsNyBAQAogICAgICAgICBCZXN0V2lkdGggPSBDb250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRMb25nTG9uZ1dpZHRoKCk7CiAKICAgICAgICAgaWYgKE51bU5lZ2F0aXZlQml0cyA+IEJlc3RXaWR0aCB8fCBOdW1Qb3NpdGl2ZUJpdHMgPj0gQmVzdFdpZHRoKQotICAgICAgICAgIERpYWcoRW51bS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6d2Fybl9lbnVtX3Rvb19sYXJnZSk7CisgICAgICAgICAgRGlhZyhFbnVtLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpleHRfZW51bV90b29fbGFyZ2UpOwogICAgICAgICBCZXN0VHlwZSA9IENvbnRleHQuTG9uZ0xvbmdUeTsKICAgICAgIH0KICAgICB9CkBAIC0xMjg3NCwxMSArMTMwNTcsNiBAQAogICBFbnVtLT5jb21wbGV0ZURlZmluaXRpb24oQmVzdFR5cGUsIEJlc3RQcm9tb3Rpb25UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtUG9zaXRpdmVCaXRzLCBOdW1OZWdhdGl2ZUJpdHMpOwogCi0gIC8vIElmIHdlJ3JlIGRlY2xhcmluZyBhIGZ1bmN0aW9uLCBlbnN1cmUgdGhpcyBkZWNsIGlzbid0IGZvcmdvdHRlbiBhYm91dCAtCi0gIC8vIGl0IG5lZWRzIHRvIGdvIGludG8gdGhlIGZ1bmN0aW9uIHNjb3BlLgotICBpZiAoSW5GdW5jdGlvbkRlY2xhcmF0b3IpCi0gICAgRGVjbHNJblByb3RvdHlwZVNjb3BlLnB1c2hfYmFjayhFbnVtKTsKLQogICBDaGVja0ZvckR1cGxpY2F0ZUVudW1WYWx1ZXMoKnRoaXMsIEVsZW1lbnRzLCBFbnVtLCBFbnVtVHlwZSk7CiAKICAgLy8gTm93IHRoYXQgdGhlIGVudW0gdHlwZSBpcyBkZWZpbmVkLCBlbnN1cmUgaXQncyBub3QgYmVlbiB1bmRlcmFsaWduZWQuCkBAIC0xMjg5OCw2ICsxMzA3NiwzNiBAQAogICByZXR1cm4gTmV3OwogfQogCitzdGF0aWMgdm9pZCBjaGVja01vZHVsZUltcG9ydENvbnRleHQoU2VtYSAmUywgTW9kdWxlICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dCAqREMpIHsKKyAgaWYgKGF1dG8gKkxTRCA9IGR5bl9jYXN0PExpbmthZ2VTcGVjRGVjbD4oREMpKSB7CisgICAgc3dpdGNoIChMU0QtPmdldExhbmd1YWdlKCkpIHsKKyAgICBjYXNlIExpbmthZ2VTcGVjRGVjbDo6bGFuZ19jOgorICAgICAgaWYgKCFNLT5Jc0V4dGVybkMpIHsKKyAgICAgICAgUy5EaWFnKEltcG9ydExvYywgZGlhZzo6ZXJyX21vZHVsZV9pbXBvcnRfaW5fZXh0ZXJuX2MpCisgICAgICAgICAgPDwgTS0+Z2V0RnVsbE1vZHVsZU5hbWUoKTsKKyAgICAgICAgUy5EaWFnKExTRC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6bm90ZV9tb2R1bGVfaW1wb3J0X2luX2V4dGVybl9jKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBMaW5rYWdlU3BlY0RlY2w6OmxhbmdfY3h4OgorICAgICAgYnJlYWs7CisgICAgfQorICAgIERDID0gTFNELT5nZXRQYXJlbnQoKTsKKyAgfQorCisgIHdoaWxlIChpc2E8TGlua2FnZVNwZWNEZWNsPihEQykpCisgICAgREMgPSBEQy0+Z2V0UGFyZW50KCk7CisgIGlmICghaXNhPFRyYW5zbGF0aW9uVW5pdERlY2w+KERDKSkgeworICAgIFMuRGlhZyhJbXBvcnRMb2MsIGRpYWc6OmVycl9tb2R1bGVfaW1wb3J0X25vdF9hdF90b3BfbGV2ZWwpCisgICAgICA8PCBNLT5nZXRGdWxsTW9kdWxlTmFtZSgpIDw8IERDOworICAgIFMuRGlhZyhjYXN0PERlY2w+KERDKS0+Z2V0TG9jU3RhcnQoKSwKKyAgICAgICAgICAgZGlhZzo6bm90ZV9tb2R1bGVfaW1wb3J0X25vdF9hdF90b3BfbGV2ZWwpCisgICAgICA8PCBEQzsKKyAgfQorfQorCiBEZWNsUmVzdWx0IFNlbWE6OkFjdE9uTW9kdWxlSW1wb3J0KFNvdXJjZUxvY2F0aW9uIEF0TG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW1wb3J0TG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlSWRQYXRoIFBhdGgpIHsKQEAgLTEyOTA2LDcgKzEzMTE0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSXNJbmNsdWRlRGlyZWN0aXZlPSovZmFsc2UpOwogICBpZiAoIU1vZCkKICAgICByZXR1cm4gdHJ1ZTsKLSAgCisKKyAgY2hlY2tNb2R1bGVJbXBvcnRDb250ZXh0KCp0aGlzLCBNb2QsIEltcG9ydExvYywgQ3VyQ29udGV4dCk7CisKICAgU21hbGxWZWN0b3I8U291cmNlTG9jYXRpb24sIDI+IElkZW50aWZpZXJMb2NzOwogICBNb2R1bGUgKk1vZENoZWNrID0gTW9kOwogICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gUGF0aC5zaXplKCk7IEkgIT0gTjsgKytJKSB7CkBAIC0xMjkyOCw2ICsxMzEzOCw4IEBACiB9CiAKIHZvaWQgU2VtYTo6QWN0T25Nb2R1bGVJbmNsdWRlKFNvdXJjZUxvY2F0aW9uIERpcmVjdGl2ZUxvYywgTW9kdWxlICpNb2QpIHsKKyAgY2hlY2tNb2R1bGVJbXBvcnRDb250ZXh0KCp0aGlzLCBNb2QsIERpcmVjdGl2ZUxvYywgQ3VyQ29udGV4dCk7CisKICAgLy8gRklYTUU6IFNob3VsZCB3ZSBzeW50aGVzaXplIGFuIEltcG9ydERlY2wgaGVyZT8KICAgUFAuZ2V0TW9kdWxlTG9hZGVyKCkubWFrZU1vZHVsZVZpc2libGUoTW9kLCBNb2R1bGU6OkFsbFZpc2libGUsIERpcmVjdGl2ZUxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDb21wbGFpbj0qL3RydWUpOwpAQCAtMTI5NTMsOCArMTMxNjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBbGlhc05hbWVMb2MpIHsKICAgRGVjbCAqUHJldkRlY2wgPSBMb29rdXBTaW5nbGVOYW1lKFRVU2NvcGUsIE5hbWUsIE5hbWVMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29rdXBPcmRpbmFyeU5hbWUpOwotICBBc21MYWJlbEF0dHIgKkF0dHIgPQotICAgICA6Om5ldyAoQ29udGV4dCkgQXNtTGFiZWxBdHRyKEFsaWFzTmFtZUxvYywgQ29udGV4dCwgQWxpYXNOYW1lLT5nZXROYW1lKCkpOworICBBc21MYWJlbEF0dHIgKkF0dHIgPSA6Om5ldyAoQ29udGV4dCkgQXNtTGFiZWxBdHRyKEFsaWFzTmFtZUxvYywgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc05hbWUtPmdldE5hbWUoKSwgMCk7CiAKICAgaWYgKFByZXZEZWNsKSAKICAgICBQcmV2RGVjbC0+YWRkQXR0cihBdHRyKTsKQEAgLTEyOTY5LDcgKzEzMTgxLDcgQEAKICAgRGVjbCAqUHJldkRlY2wgPSBMb29rdXBTaW5nbGVOYW1lKFRVU2NvcGUsIE5hbWUsIE5hbWVMb2MsIExvb2t1cE9yZGluYXJ5TmFtZSk7CiAKICAgaWYgKFByZXZEZWNsKSB7Ci0gICAgUHJldkRlY2wtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIFdlYWtBdHRyKFByYWdtYUxvYywgQ29udGV4dCkpOworICAgIFByZXZEZWNsLT5hZGRBdHRyKFdlYWtBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LCBQcmFnbWFMb2MpKTsKICAgfSBlbHNlIHsKICAgICAodm9pZClXZWFrVW5kZWNsYXJlZElkZW50aWZpZXJzLmluc2VydCgKICAgICAgIHN0ZDo6cGFpcjxJZGVudGlmaWVySW5mbyosV2Vha0luZm8+CkBAIC0xMzAwMiw1ICsxMzIxNCwyMiBAQAogCiBBdmFpbGFiaWxpdHlSZXN1bHQgU2VtYTo6Z2V0Q3VyQ29udGV4dEF2YWlsYWJpbGl0eSgpIGNvbnN0IHsKICAgY29uc3QgRGVjbCAqRCA9IGNhc3Q8RGVjbD4oZ2V0Q3VyT2JqQ0xleGljYWxDb250ZXh0KCkpOworICAvLyBJZiB3ZSBhcmUgd2l0aGluIGFuIE9iamVjdGl2ZS1DIG1ldGhvZCwgd2Ugc2hvdWxkIGNvbnN1bHQKKyAgLy8gYm90aCB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBtZXRob2QgYXMgd2VsbCBhcyB0aGUKKyAgLy8gZW5jbG9zaW5nIGNsYXNzLiAgSWYgdGhlIGNsYXNzIGlzIChzYXkpIGRlcHJlY2F0ZWQsCisgIC8vIHRoZSBlbnRpcmUgbWV0aG9kIGlzIGNvbnNpZGVyZWQgZGVwcmVjYXRlZCBmcm9tIHRoZQorICAvLyBwdXJwb3NlIG9mIGNoZWNraW5nIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgZGVwcmVjYXRlZC4KKyAgaWYgKGNvbnN0IE9iakNNZXRob2REZWNsICpNRCA9IGR5bl9jYXN0PE9iakNNZXRob2REZWNsPihEKSkgeworICAgIEF2YWlsYWJpbGl0eVJlc3VsdCBSID0gTUQtPmdldEF2YWlsYWJpbGl0eSgpOworICAgIGlmIChSICE9IEFSX0F2YWlsYWJsZSkKKyAgICAgIHJldHVybiBSOworICAgIEQgPSBNRC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKTsKKyAgfQorICAvLyBJZiB3ZSBhcmUgd2l0aGluIGFuIE9iamVjdGl2ZS1jIEBpbXBsZW1lbnRhdGlvbiwgaXQKKyAgLy8gZ2V0cyB0aGUgc2FtZSBhdmFpbGFiaWxpdHkgY29udGV4dCBhcyB0aGUgQGludGVyZmFjZS4KKyAgZWxzZSBpZiAoY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSUQgPQorICAgICAgICAgICAgZHluX2Nhc3Q8T2JqQ0ltcGxlbWVudGF0aW9uRGVjbD4oRCkpIHsKKyAgICBEID0gSUQtPmdldENsYXNzSW50ZXJmYWNlKCk7CisgIH0KICAgcmV0dXJuIEQtPmdldEF2YWlsYWJpbGl0eSgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvU2VtYURlY2xBdHRyLmNwcCBiL2xpYi9TZW1hL1NlbWFEZWNsQXR0ci5jcHAKaW5kZXggMzE4NTc1YS4uMzhiM2M0NSAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYURlY2xBdHRyLmNwcAorKysgYi9saWIvU2VtYS9TZW1hRGVjbEF0dHIuY3BwCkBAIC0xMiw3ICsxMiw2IEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hSW50ZXJuYWwuaCIKLSNpbmNsdWRlICJUYXJnZXRBdHRyaWJ1dGVzU2VtYS5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0NYWEluaGVyaXRhbmNlLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKQEAgLTMyLDg2ICszMSwyMyBAQAogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIHNlbWE7CiAKLS8vLyBUaGVzZSBjb25zdGFudHMgbWF0Y2ggdGhlIGVudW1lcmF0ZWQgY2hvaWNlcyBvZgotLy8vIHdhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSBhbmQgZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUuCi1lbnVtIEF0dHJpYnV0ZURlY2xLaW5kIHsKLSAgRXhwZWN0ZWRGdW5jdGlvbiwKLSAgRXhwZWN0ZWRVbmlvbiwKLSAgRXhwZWN0ZWRWYXJpYWJsZU9yRnVuY3Rpb24sCi0gIEV4cGVjdGVkRnVuY3Rpb25Pck1ldGhvZCwKLSAgRXhwZWN0ZWRQYXJhbWV0ZXIsCi0gIEV4cGVjdGVkRnVuY3Rpb25NZXRob2RPckJsb2NrLAotICBFeHBlY3RlZEZ1bmN0aW9uTWV0aG9kT3JDbGFzcywKLSAgRXhwZWN0ZWRGdW5jdGlvbk1ldGhvZE9yUGFyYW1ldGVyLAotICBFeHBlY3RlZENsYXNzLAotICBFeHBlY3RlZFZhcmlhYmxlLAotICBFeHBlY3RlZE1ldGhvZCwKLSAgRXhwZWN0ZWRWYXJpYWJsZUZ1bmN0aW9uT3JMYWJlbCwKLSAgRXhwZWN0ZWRGaWVsZE9yR2xvYmFsVmFyLAotICBFeHBlY3RlZFN0cnVjdCwKLSAgRXhwZWN0ZWRWYXJpYWJsZUZ1bmN0aW9uT3JUYWcsCi0gIEV4cGVjdGVkVExTVmFyLAotICBFeHBlY3RlZFZhcmlhYmxlT3JGaWVsZCwKLSAgRXhwZWN0ZWRWYXJpYWJsZUZpZWxkT3JUYWcsCi0gIEV4cGVjdGVkVHlwZU9yTmFtZXNwYWNlLAotICBFeHBlY3RlZE9iamVjdGl2ZUNJbnRlcmZhY2UsCi0gIEV4cGVjdGVkTWV0aG9kT3JQcm9wZXJ0eSwKLSAgRXhwZWN0ZWRTdHJ1Y3RPclVuaW9uLAotICBFeHBlY3RlZFN0cnVjdE9yVW5pb25PckNsYXNzCi19OworbmFtZXNwYWNlIEF0dHJpYnV0ZUxhbmdTdXBwb3J0IHsKKyAgZW51bSBMQU5HIHsKKyAgICBDLAorICAgIENwcCwKKyAgICBPYmpDCisgIH07Cit9CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAvLyAgSGVscGVyIGZ1bmN0aW9ucwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAotc3RhdGljIGNvbnN0IEZ1bmN0aW9uVHlwZSAqZ2V0RnVuY3Rpb25UeXBlKGNvbnN0IERlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBibG9ja3NUb28gPSB0cnVlKSB7Ci0gIFF1YWxUeXBlIFR5OwotICBpZiAoY29uc3QgVmFsdWVEZWNsICpkZWNsID0gZHluX2Nhc3Q8VmFsdWVEZWNsPihEKSkKLSAgICBUeSA9IGRlY2wtPmdldFR5cGUoKTsKLSAgZWxzZSBpZiAoY29uc3QgRmllbGREZWNsICpkZWNsID0gZHluX2Nhc3Q8RmllbGREZWNsPihEKSkKLSAgICBUeSA9IGRlY2wtPmdldFR5cGUoKTsKLSAgZWxzZSBpZiAoY29uc3QgVHlwZWRlZk5hbWVEZWNsKiBkZWNsID0gZHluX2Nhc3Q8VHlwZWRlZk5hbWVEZWNsPihEKSkKLSAgICBUeSA9IGRlY2wtPmdldFVuZGVybHlpbmdUeXBlKCk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLQotICBpZiAoVHktPmlzRnVuY3Rpb25Qb2ludGVyVHlwZSgpKQotICAgIFR5ID0gVHktPmdldEFzPFBvaW50ZXJUeXBlPigpLT5nZXRQb2ludGVlVHlwZSgpOwotICBlbHNlIGlmIChibG9ja3NUb28gJiYgVHktPmlzQmxvY2tQb2ludGVyVHlwZSgpKQotICAgIFR5ID0gVHktPmdldEFzPEJsb2NrUG9pbnRlclR5cGU+KCktPmdldFBvaW50ZWVUeXBlKCk7Ci0KLSAgcmV0dXJuIFR5LT5nZXRBczxGdW5jdGlvblR5cGU+KCk7Ci19Ci0KLS8vIEZJWE1FOiBXZSBzaG91bGQgcHJvdmlkZSBhbiBhYnN0cmFjdGlvbiBhcm91bmQgYSBtZXRob2Qgb3IgZnVuY3Rpb24KLS8vIHRvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBiaXRzIG9mIGluZm9ybWF0aW9uLgotCi0vLy8gaXNGdW5jdGlvbiAtIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBkZWNsIGhhcyBmdW5jdGlvbgotLy8vIHR5cGUgKGZ1bmN0aW9uIG9yIGZ1bmN0aW9uLXR5cGVkIHZhcmlhYmxlKS4KLXN0YXRpYyBib29sIGlzRnVuY3Rpb24oY29uc3QgRGVjbCAqRCkgewotICByZXR1cm4gZ2V0RnVuY3Rpb25UeXBlKEQsIGZhbHNlKSAhPSBOVUxMOwotfQotCiAvLy8gaXNGdW5jdGlvbk9yTWV0aG9kIC0gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGRlY2wgaGFzIGZ1bmN0aW9uCiAvLy8gdHlwZSAoZnVuY3Rpb24gb3IgZnVuY3Rpb24tdHlwZWQgdmFyaWFibGUpIG9yIGFuIE9iamVjdGl2ZS1DCiAvLy8gbWV0aG9kLgogc3RhdGljIGJvb2wgaXNGdW5jdGlvbk9yTWV0aG9kKGNvbnN0IERlY2wgKkQpIHsKLSAgcmV0dXJuIGlzRnVuY3Rpb24oRCkgfHwgaXNhPE9iakNNZXRob2REZWNsPihEKTsKLX0KLQotLy8vIGlzRnVuY3Rpb25Pck1ldGhvZE9yQmxvY2sgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGVjbCBoYXMgZnVuY3Rpb24KLS8vLyB0eXBlIChmdW5jdGlvbiBvciBmdW5jdGlvbi10eXBlZCB2YXJpYWJsZSkgb3IgYW4gT2JqZWN0aXZlLUMKLS8vLyBtZXRob2Qgb3IgYSBibG9jay4KLXN0YXRpYyBib29sIGlzRnVuY3Rpb25Pck1ldGhvZE9yQmxvY2soY29uc3QgRGVjbCAqRCkgewotICBpZiAoaXNGdW5jdGlvbk9yTWV0aG9kKEQpKQotICAgIHJldHVybiB0cnVlOwotICAvLyBjaGVjayBmb3IgYmxvY2sgaXMgbW9yZSBpbnZvbHZlZC4KLSAgaWYgKGNvbnN0IFZhckRlY2wgKlYgPSBkeW5fY2FzdDxWYXJEZWNsPihEKSkgewotICAgIFF1YWxUeXBlIFR5ID0gVi0+Z2V0VHlwZSgpOwotICAgIHJldHVybiBUeS0+aXNCbG9ja1BvaW50ZXJUeXBlKCk7Ci0gIH0KLSAgcmV0dXJuIGlzYTxCbG9ja0RlY2w+KEQpOworICByZXR1cm4gKEQtPmdldEZ1bmN0aW9uVHlwZSgpICE9IE5VTEwpIHx8IGlzYTxPYmpDTWV0aG9kRGVjbD4oRCk7CiB9CiAKIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gZGVjbCBoYXMgYSBkZWNsYXJhdG9yIHRoYXQgc2hvdWxkIGhhdmUKQEAgLTEyNiwyOCArNjIsMjUgQEAKIC8vLyBpbmZvcm1hdGlvbi4gVGhpcyBkZWNsIHNob3VsZCBoYXZlIGFscmVhZHkgcGFzc2VkCiAvLy8gaXNGdW5jdGlvbk9yTWV0aG9kIG9yIGlzRnVuY3Rpb25Pck1ldGhvZE9yQmxvY2suCiBzdGF0aWMgYm9vbCBoYXNGdW5jdGlvblByb3RvKGNvbnN0IERlY2wgKkQpIHsKLSAgaWYgKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRm5UeSA9IGdldEZ1bmN0aW9uVHlwZShEKSkKKyAgaWYgKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRm5UeSA9IEQtPmdldEZ1bmN0aW9uVHlwZSgpKQogICAgIHJldHVybiBpc2E8RnVuY3Rpb25Qcm90b1R5cGU+KEZuVHkpOwotICBlbHNlIHsKLSAgICBhc3NlcnQoaXNhPE9iakNNZXRob2REZWNsPihEKSB8fCBpc2E8QmxvY2tEZWNsPihEKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KKyAgcmV0dXJuIGlzYTxPYmpDTWV0aG9kRGVjbD4oRCkgfHwgaXNhPEJsb2NrRGVjbD4oRCk7CiB9CiAKLS8vLyBnZXRGdW5jdGlvbk9yTWV0aG9kTnVtQXJncyAtIFJldHVybiBudW1iZXIgb2YgZnVuY3Rpb24gb3IgbWV0aG9kCi0vLy8gYXJndW1lbnRzLiBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgb24gYSBLJlIgZnVuY3Rpb24gKHVzZQorLy8vIGdldEZ1bmN0aW9uT3JNZXRob2ROdW1QYXJhbXMgLSBSZXR1cm4gbnVtYmVyIG9mIGZ1bmN0aW9uIG9yIG1ldGhvZAorLy8vIHBhcmFtZXRlcnMuIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBvbiBhIEsmUiBmdW5jdGlvbiAodXNlCiAvLy8gaGFzRnVuY3Rpb25Qcm90byBmaXJzdCkuCi1zdGF0aWMgdW5zaWduZWQgZ2V0RnVuY3Rpb25Pck1ldGhvZE51bUFyZ3MoY29uc3QgRGVjbCAqRCkgewotICBpZiAoY29uc3QgRnVuY3Rpb25UeXBlICpGblR5ID0gZ2V0RnVuY3Rpb25UeXBlKEQpKQotICAgIHJldHVybiBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGblR5KS0+Z2V0TnVtQXJncygpOworc3RhdGljIHVuc2lnbmVkIGdldEZ1bmN0aW9uT3JNZXRob2ROdW1QYXJhbXMoY29uc3QgRGVjbCAqRCkgeworICBpZiAoY29uc3QgRnVuY3Rpb25UeXBlICpGblR5ID0gRC0+Z2V0RnVuY3Rpb25UeXBlKCkpCisgICAgcmV0dXJuIGNhc3Q8RnVuY3Rpb25Qcm90b1R5cGU+KEZuVHkpLT5nZXROdW1QYXJhbXMoKTsKICAgaWYgKGNvbnN0IEJsb2NrRGVjbCAqQkQgPSBkeW5fY2FzdDxCbG9ja0RlY2w+KEQpKQogICAgIHJldHVybiBCRC0+Z2V0TnVtUGFyYW1zKCk7CiAgIHJldHVybiBjYXN0PE9iakNNZXRob2REZWNsPihEKS0+cGFyYW1fc2l6ZSgpOwogfQogCi1zdGF0aWMgUXVhbFR5cGUgZ2V0RnVuY3Rpb25Pck1ldGhvZEFyZ1R5cGUoY29uc3QgRGVjbCAqRCwgdW5zaWduZWQgSWR4KSB7Ci0gIGlmIChjb25zdCBGdW5jdGlvblR5cGUgKkZuVHkgPSBnZXRGdW5jdGlvblR5cGUoRCkpCi0gICAgcmV0dXJuIGNhc3Q8RnVuY3Rpb25Qcm90b1R5cGU+KEZuVHkpLT5nZXRBcmdUeXBlKElkeCk7CitzdGF0aWMgUXVhbFR5cGUgZ2V0RnVuY3Rpb25Pck1ldGhvZFBhcmFtVHlwZShjb25zdCBEZWNsICpELCB1bnNpZ25lZCBJZHgpIHsKKyAgaWYgKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRm5UeSA9IEQtPmdldEZ1bmN0aW9uVHlwZSgpKQorICAgIHJldHVybiBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGblR5KS0+Z2V0UGFyYW1UeXBlKElkeCk7CiAgIGlmIChjb25zdCBCbG9ja0RlY2wgKkJEID0gZHluX2Nhc3Q8QmxvY2tEZWNsPihEKSkKICAgICByZXR1cm4gQkQtPmdldFBhcmFtRGVjbChJZHgpLT5nZXRUeXBlKCk7CiAKQEAgLTE1NSwxMyArODgsMTMgQEAKIH0KIAogc3RhdGljIFF1YWxUeXBlIGdldEZ1bmN0aW9uT3JNZXRob2RSZXN1bHRUeXBlKGNvbnN0IERlY2wgKkQpIHsKLSAgaWYgKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRm5UeSA9IGdldEZ1bmN0aW9uVHlwZShEKSkKLSAgICByZXR1cm4gY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oRm5UeSktPmdldFJlc3VsdFR5cGUoKTsKLSAgcmV0dXJuIGNhc3Q8T2JqQ01ldGhvZERlY2w+KEQpLT5nZXRSZXN1bHRUeXBlKCk7CisgIGlmIChjb25zdCBGdW5jdGlvblR5cGUgKkZuVHkgPSBELT5nZXRGdW5jdGlvblR5cGUoKSkKKyAgICByZXR1cm4gY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oRm5UeSktPmdldFJldHVyblR5cGUoKTsKKyAgcmV0dXJuIGNhc3Q8T2JqQ01ldGhvZERlY2w+KEQpLT5nZXRSZXR1cm5UeXBlKCk7CiB9CiAKIHN0YXRpYyBib29sIGlzRnVuY3Rpb25Pck1ldGhvZFZhcmlhZGljKGNvbnN0IERlY2wgKkQpIHsKLSAgaWYgKGNvbnN0IEZ1bmN0aW9uVHlwZSAqRm5UeSA9IGdldEZ1bmN0aW9uVHlwZShEKSkgeworICBpZiAoY29uc3QgRnVuY3Rpb25UeXBlICpGblR5ID0gRC0+Z2V0RnVuY3Rpb25UeXBlKCkpIHsKICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqcHJvdG8gPSBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGblR5KTsKICAgICByZXR1cm4gcHJvdG8tPmlzVmFyaWFkaWMoKTsKICAgfSBlbHNlIGlmIChjb25zdCBCbG9ja0RlY2wgKkJEID0gZHluX2Nhc3Q8QmxvY2tEZWNsPihEKSkKQEAgLTIyNywzMCArMTYwLDYzIEBACiAgIHJldHVybiB0cnVlOwogfQogCi0KIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBoYXMgYXQgbGVhc3QgYXMgbWFueSBhcmdzIGFzIE51bS4gTWF5CiAvLy8gb3V0cHV0IGFuIGVycm9yLgogc3RhdGljIGJvb2wgY2hlY2tBdHRyaWJ1dGVBdExlYXN0TnVtQXJncyhTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW0pIHsKICAgaWYgKGdldE51bUF0dHJpYnV0ZUFyZ3MoQXR0cikgPCBOdW0pIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV90b29fZmV3X2FyZ3VtZW50cykgPDwgTnVtOworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3Rvb19mZXdfYXJndW1lbnRzKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgTnVtOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIHJldHVybiB0cnVlOwogfQogCi0vLy8gXGJyaWVmIENoZWNrIGlmIElkeEV4cHIgaXMgYSB2YWxpZCBhcmd1bWVudCBpbmRleCBmb3IgYSBmdW5jdGlvbiBvcgorLy8vIFxicmllZiBJZiBFeHByIGlzIGEgdmFsaWQgaW50ZWdlciBjb25zdGFudCwgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgaW50ZWdlcgorLy8vIGV4cHJlc3Npb24gYW5kIHJldHVybiBzdWNjZXNzIG9yIGZhaWx1cmUuIE1heSBvdXRwdXQgYW4gZXJyb3IuCitzdGF0aWMgYm9vbCBjaGVja1VJbnQzMkFyZ3VtZW50KFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKkV4cHIsIHVpbnQzMl90ICZWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElkeCA9IFVJTlRfTUFYKSB7CisgIGxsdm06OkFQU0ludCBJKDMyKTsKKyAgaWYgKEV4cHItPmlzVHlwZURlcGVuZGVudCgpIHx8IEV4cHItPmlzVmFsdWVEZXBlbmRlbnQoKSB8fAorICAgICAgIUV4cHItPmlzSW50ZWdlckNvbnN0YW50RXhwcihJLCBTLkNvbnRleHQpKSB7CisgICAgaWYgKElkeCAhPSBVSU5UX01BWCkKKyAgICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX2FyZ3VtZW50X25fdHlwZSkKKyAgICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgSWR4IDw8IEFBTlRfQXJndW1lbnRJbnRlZ2VyQ29uc3RhbnQKKyAgICAgICAgPDwgRXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICBlbHNlCisgICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF90eXBlKQorICAgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBBQU5UX0FyZ3VtZW50SW50ZWdlckNvbnN0YW50CisgICAgICAgIDw8IEV4cHItPmdldFNvdXJjZVJhbmdlKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFZhbCA9ICh1aW50MzJfdClJLmdldFpFeHRWYWx1ZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8vIFxicmllZiBEaWFnbm9zZSBtdXR1YWxseSBleGNsdXNpdmUgYXR0cmlidXRlcyB3aGVuIHByZXNlbnQgb24gYSBnaXZlbgorLy8vIGRlY2xhcmF0aW9uLiBSZXR1cm5zIHRydWUgaWYgZGlhZ25vc2VkLgordGVtcGxhdGUgPHR5cGVuYW1lIEF0dHJUeT4KK3N0YXRpYyBib29sIGNoZWNrQXR0ck11dHVhbEV4Y2x1c2lvbihTZW1hICZTLCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgaWYgKEF0dHJUeSAqQSA9IEQtPmdldEF0dHI8QXR0clR5PigpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVzX2FyZV9ub3RfY29tcGF0aWJsZSkKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gXGJyaWVmIENoZWNrIGlmIElkeEV4cHIgaXMgYSB2YWxpZCBwYXJhbWV0ZXIgaW5kZXggZm9yIGEgZnVuY3Rpb24gb3IKIC8vLyBpbnN0YW5jZSBtZXRob2QgRC4gIE1heSBvdXRwdXQgYW4gZXJyb3IuCiAvLy8KIC8vLyBccmV0dXJucyB0cnVlIGlmIElkeEV4cHIgaXMgYSB2YWxpZCBpbmRleC4KLXN0YXRpYyBib29sIGNoZWNrRnVuY3Rpb25Pck1ldGhvZEFyZ3VtZW50SW5kZXgoU2VtYSAmUywgY29uc3QgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEF0dHJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBBdHRyTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyQXJnTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpJZHhFeHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAmSWR4KQoteworc3RhdGljIGJvb2wgY2hlY2tGdW5jdGlvbk9yTWV0aG9kUGFyYW1ldGVySW5kZXgoU2VtYSAmUywgY29uc3QgRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyQXJnTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqSWR4RXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICZJZHgpIHsKICAgYXNzZXJ0KGlzRnVuY3Rpb25Pck1ldGhvZChEKSk7CiAKICAgLy8gSW4gQysrIHRoZSBpbXBsaWNpdCAndGhpcycgZnVuY3Rpb24gcGFyYW1ldGVyIGFsc28gY291bnRzLgpAQCAtMjU4LDMwICsyMjQsMzAgQEAKICAgYm9vbCBIUCA9IGhhc0Z1bmN0aW9uUHJvdG8oRCk7CiAgIGJvb2wgSGFzSW1wbGljaXRUaGlzUGFyYW0gPSBpc0luc3RhbmNlTWV0aG9kKEQpOwogICBib29sIElWID0gSFAgJiYgaXNGdW5jdGlvbk9yTWV0aG9kVmFyaWFkaWMoRCk7Ci0gIHVuc2lnbmVkIE51bUFyZ3MgPSAoSFAgPyBnZXRGdW5jdGlvbk9yTWV0aG9kTnVtQXJncyhEKSA6IDApICsKLSAgICAgICAgICAgICAgICAgICAgIEhhc0ltcGxpY2l0VGhpc1BhcmFtOworICB1bnNpZ25lZCBOdW1QYXJhbXMgPQorICAgICAgKEhQID8gZ2V0RnVuY3Rpb25Pck1ldGhvZE51bVBhcmFtcyhEKSA6IDApICsgSGFzSW1wbGljaXRUaGlzUGFyYW07CiAKICAgbGx2bTo6QVBTSW50IElkeEludDsKICAgaWYgKElkeEV4cHItPmlzVHlwZURlcGVuZGVudCgpIHx8IElkeEV4cHItPmlzVmFsdWVEZXBlbmRlbnQoKSB8fAogICAgICAgIUlkeEV4cHItPmlzSW50ZWdlckNvbnN0YW50RXhwcihJZHhJbnQsIFMuQ29udGV4dCkpIHsKLSAgICBzdGQ6OnN0cmluZyBOYW1lID0gc3RkOjpzdHJpbmcoIiciKSArIEF0dHJOYW1lLnN0cigpICsgc3RkOjpzdHJpbmcoIiciKTsKLSAgICBTLkRpYWcoQXR0ckxvYywgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF9uX3R5cGUpIDw8IE5hbWUuY19zdHIoKQotICAgICAgPDwgQXR0ckFyZ051bSA8PCBBQU5UX0FyZ3VtZW50SW50ZWdlckNvbnN0YW50IDw8IElkeEV4cHItPmdldFNvdXJjZVJhbmdlKCk7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfbl90eXBlKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgQXR0ckFyZ051bSA8PCBBQU5UX0FyZ3VtZW50SW50ZWdlckNvbnN0YW50CisgICAgICA8PCBJZHhFeHByLT5nZXRTb3VyY2VSYW5nZSgpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIElkeCA9IElkeEludC5nZXRMaW1pdGVkVmFsdWUoKTsKLSAgaWYgKElkeCA8IDEgfHwgKCFJViAmJiBJZHggPiBOdW1BcmdzKSkgewotICAgIFMuRGlhZyhBdHRyTG9jLCBkaWFnOjplcnJfYXR0cmlidXRlX2FyZ3VtZW50X291dF9vZl9ib3VuZHMpCi0gICAgICA8PCBBdHRyTmFtZSA8PCBBdHRyQXJnTnVtIDw8IElkeEV4cHItPmdldFNvdXJjZVJhbmdlKCk7CisgIGlmIChJZHggPCAxIHx8ICghSVYgJiYgSWR4ID4gTnVtUGFyYW1zKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX2FyZ3VtZW50X291dF9vZl9ib3VuZHMpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBBdHRyQXJnTnVtIDw8IElkeEV4cHItPmdldFNvdXJjZVJhbmdlKCk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIElkeC0tOyAvLyBDb252ZXJ0IHRvIHplcm8tYmFzZWQuCiAgIGlmIChIYXNJbXBsaWNpdFRoaXNQYXJhbSkgewogICAgIGlmIChJZHggPT0gMCkgewotICAgICAgUy5EaWFnKEF0dHJMb2MsCisgICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwKICAgICAgICAgICAgICBkaWFnOjplcnJfYXR0cmlidXRlX2ludmFsaWRfaW1wbGljaXRfdGhpc19hcmd1bWVudCkKLSAgICAgICAgPDwgQXR0ck5hbWUgPDwgSWR4RXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgSWR4RXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgLS1JZHg7CkBAIC0zMjYsMTcgKzI5MiwxMyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotLy8vCi0vLy8gXGJyaWVmIENoZWNrIGlmIHBhc3NlZCBpbiBEZWNsIGlzIGEgZmllbGQgb3IgcG90ZW50aWFsbHkgc2hhcmVkIGdsb2JhbCB2YXIKLS8vLyBccmV0dXJuIHRydWUgaWYgdGhlIERlY2wgaXMgYSBmaWVsZCBvciBwb3RlbnRpYWxseSBzaGFyZWQgZ2xvYmFsIHZhcmlhYmxlCi0vLy8KLXN0YXRpYyBib29sIG1heUJlU2hhcmVkVmFyaWFibGUoY29uc3QgRGVjbCAqRCkgewotICBpZiAoaXNhPEZpZWxkRGVjbD4oRCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChjb25zdCBWYXJEZWNsICp2ZCA9IGR5bl9jYXN0PFZhckRlY2w+KEQpKQotICAgIHJldHVybiB2ZC0+aGFzR2xvYmFsU3RvcmFnZSgpICYmICF2ZC0+Z2V0VExTS2luZCgpOwotCi0gIHJldHVybiBmYWxzZTsKKy8vLyBcYnJpZWYgQXBwbGllcyB0aGUgZ2l2ZW4gYXR0cmlidXRlIHRvIHRoZSBEZWNsIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkKKy8vLyBhZGRpdGlvbmFsIHNlbWFudGljIGNoZWNraW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIEF0dHJUeXBlPgorc3RhdGljIHZvaWQgaGFuZGxlU2ltcGxlQXR0cmlidXRlKFNlbWEgJlMsIERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpIEF0dHJUeXBlKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCiAvLy8gXGJyaWVmIENoZWNrIGlmIHRoZSBwYXNzZWQtaW4gZXhwcmVzc2lvbiBpcyBvZiB0eXBlIGludCBvciBib29sLgpAQCAtMzY3LDI4ICszMjksMjQgQEAKIC8vLyBccmV0dXJuIHRydWUgaWYgdGhlIERlY2wgaXMgYSBwb2ludGVyIHR5cGU7IGZhbHNlIG90aGVyd2lzZQogc3RhdGljIGJvb2wgdGhyZWFkU2FmZXR5Q2hlY2tJc1BvaW50ZXIoU2VtYSAmUywgY29uc3QgRGVjbCAqRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKGNvbnN0IFZhbHVlRGVjbCAqdmQgPSBkeW5fY2FzdDxWYWx1ZURlY2w+KEQpKSB7Ci0gICAgUXVhbFR5cGUgUVQgPSB2ZC0+Z2V0VHlwZSgpOwotICAgIGlmIChRVC0+aXNBbnlQb2ludGVyVHlwZSgpKQorICBjb25zdCBWYWx1ZURlY2wgKnZkID0gY2FzdDxWYWx1ZURlY2w+KEQpOworICBRdWFsVHlwZSBRVCA9IHZkLT5nZXRUeXBlKCk7CisgIGlmIChRVC0+aXNBbnlQb2ludGVyVHlwZSgpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChjb25zdCBSZWNvcmRUeXBlICpSVCA9IFFULT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CisgICAgLy8gSWYgaXQncyBhbiBpbmNvbXBsZXRlIHR5cGUsIGl0IGNvdWxkIGJlIGEgc21hcnQgcG9pbnRlcjsgc2tpcCBpdC4KKyAgICAvLyAoV2UgZG9uJ3Qgd2FudCB0byBmb3JjZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGlmIHdlIGNhbiBhdm9pZCBpdCwKKyAgICAvLyBzaW5jZSB0aGF0IHdvdWxkIGFsdGVyIHRoZSBvcmRlciBpbiB3aGljaCB0ZW1wbGF0ZXMgYXJlIGluc3RhbnRpYXRlZC4pCisgICAgaWYgKFJULT5pc0luY29tcGxldGVUeXBlKCkpCiAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpSVCA9IFFULT5nZXRBczxSZWNvcmRUeXBlPigpKSB7Ci0gICAgICAvLyBJZiBpdCdzIGFuIGluY29tcGxldGUgdHlwZSwgaXQgY291bGQgYmUgYSBzbWFydCBwb2ludGVyOyBza2lwIGl0LgotICAgICAgLy8gKFdlIGRvbid0IHdhbnQgdG8gZm9yY2UgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBpZiB3ZSBjYW4gYXZvaWQgaXQsCi0gICAgICAvLyBzaW5jZSB0aGF0IHdvdWxkIGFsdGVyIHRoZSBvcmRlciBpbiB3aGljaCB0ZW1wbGF0ZXMgYXJlIGluc3RhbnRpYXRlZC4pCi0gICAgICBpZiAoUlQtPmlzSW5jb21wbGV0ZVR5cGUoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgIGlmICh0aHJlYWRTYWZldHlDaGVja0lzU21hcnRQb2ludGVyKFMsIFJUKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fdGhyZWFkX2F0dHJpYnV0ZV9kZWNsX25vdF9wb2ludGVyKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCktPmdldE5hbWUoKSA8PCBRVDsKLSAgfSBlbHNlIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9jYW5fYmVfYXBwbGllZF9vbmx5X3RvX3ZhbHVlX2RlY2wpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKTsKKyAgICBpZiAodGhyZWFkU2FmZXR5Q2hlY2tJc1NtYXJ0UG9pbnRlcihTLCBSVCkpCisgICAgICByZXR1cm4gdHJ1ZTsKICAgfQorCisgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfZGVjbF9ub3RfcG9pbnRlcikKKyAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBRVDsKICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC00MDUsNjUgKzM2Myw3OCBAQAogICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGJvb2wgY2hlY2tSZWNvcmRUeXBlRm9yQ2FwYWJpbGl0eShTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUeSkgeworICBjb25zdCBSZWNvcmRUeXBlICpSVCA9IGdldFJlY29yZFR5cGUoVHkpOwogCi1zdGF0aWMgYm9vbCBjaGVja0Jhc2VDbGFzc0lzTG9ja2FibGVDYWxsYmFjayhjb25zdCBDWFhCYXNlU3BlY2lmaWVyICpTcGVjaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhCYXNlUGF0aCAmUGF0aCwgdm9pZCAqVW51c2VkKSB7Ci0gIGNvbnN0IFJlY29yZFR5cGUgKlJUID0gU3BlY2lmaWVyLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCk7Ci0gIGlmIChSVC0+Z2V0RGVjbCgpLT5nZXRBdHRyPExvY2thYmxlQXR0cj4oKSkKKyAgaWYgKCFSVCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRG9uJ3QgY2hlY2sgZm9yIHRoZSBjYXBhYmlsaXR5IGlmIHRoZSBjbGFzcyBoYXNuJ3QgYmVlbiBkZWZpbmVkIHlldC4KKyAgaWYgKFJULT5pc0luY29tcGxldGVUeXBlKCkpCiAgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gQWxsb3cgc21hcnQgcG9pbnRlcnMgdG8gYmUgdXNlZCBhcyBjYXBhYmlsaXR5IG9iamVjdHMuCisgIC8vIEZJWE1FIC0tIENoZWNrIHRoZSB0eXBlIHRoYXQgdGhlIHNtYXJ0IHBvaW50ZXIgcG9pbnRzIHRvLgorICBpZiAodGhyZWFkU2FmZXR5Q2hlY2tJc1NtYXJ0UG9pbnRlcihTLCBSVCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIHJlY29yZCBpdHNlbGYgaGFzIGEgY2FwYWJpbGl0eS4KKyAgUmVjb3JkRGVjbCAqUkQgPSBSVC0+Z2V0RGVjbCgpOworICBpZiAoUkQtPmhhc0F0dHI8Q2FwYWJpbGl0eUF0dHI+KCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gRWxzZSBjaGVjayBpZiBhbnkgYmFzZSBjbGFzc2VzIGhhdmUgYSBjYXBhYmlsaXR5LgorICBpZiAoQ1hYUmVjb3JkRGVjbCAqQ1JEID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4oUkQpKSB7CisgICAgQ1hYQmFzZVBhdGhzIEJQYXRocyhmYWxzZSwgZmFsc2UpOworICAgIGlmIChDUkQtPmxvb2t1cEluQmFzZXMoW10oY29uc3QgQ1hYQmFzZVNwZWNpZmllciAqQlMsIENYWEJhc2VQYXRoICZQLAorICAgICAgdm9pZCAqKSB7CisgICAgICByZXR1cm4gQlMtPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKQorICAgICAgICAtPmdldERlY2woKS0+aGFzQXR0cjxDYXBhYmlsaXR5QXR0cj4oKTsKKyAgICB9LCAwLCBCUGF0aHMpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KICAgcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgYm9vbCBjaGVja1R5cGVkZWZUeXBlRm9yQ2FwYWJpbGl0eShTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVHkpIHsKKyAgY29uc3QgYXV0byAqVEQgPSBUeS0+Z2V0QXM8VHlwZWRlZlR5cGU+KCk7CisgIGlmICghVEQpCisgICAgcmV0dXJuIGZhbHNlOwogCi0vLy8gXGJyaWVmIFRocmVhZCBTYWZldHkgQW5hbHlzaXM6IENoZWNrcyB0aGF0IHRoZSBwYXNzZWQgaW4gUmVjb3JkVHlwZQotLy8vIHJlc29sdmVzIHRvIGEgbG9ja2FibGUgb2JqZWN0Lgotc3RhdGljIHZvaWQgY2hlY2tGb3JMb2NrYWJsZVJlY29yZChTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUeSkgewotICBjb25zdCBSZWNvcmRUeXBlICpSVCA9IGdldFJlY29yZFR5cGUoVHkpOworICBUeXBlZGVmTmFtZURlY2wgKlROID0gVEQtPmdldERlY2woKTsKKyAgaWYgKCFUTikKKyAgICByZXR1cm4gZmFsc2U7CiAKLSAgLy8gV2FybiBpZiBjb3VsZCBub3QgZ2V0IHJlY29yZCB0eXBlIGZvciB0aGlzIGFyZ3VtZW50LgotICBpZiAoIVJUKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fdGhyZWFkX2F0dHJpYnV0ZV9hcmd1bWVudF9ub3RfY2xhc3MpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBUeS5nZXRBc1N0cmluZygpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIERvbid0IGNoZWNrIGZvciBsb2NrYWJsZSBpZiB0aGUgY2xhc3MgaGFzbid0IGJlZW4gZGVmaW5lZCB5ZXQuCi0gIGlmIChSVC0+aXNJbmNvbXBsZXRlVHlwZSgpKQotICAgIHJldHVybjsKLQotICAvLyBBbGxvdyBzbWFydCBwb2ludGVycyB0byBiZSB1c2VkIGFzIGxvY2thYmxlIG9iamVjdHMuCi0gIC8vIEZJWE1FIC0tIENoZWNrIHRoZSB0eXBlIHRoYXQgdGhlIHNtYXJ0IHBvaW50ZXIgcG9pbnRzIHRvLgotICBpZiAodGhyZWFkU2FmZXR5Q2hlY2tJc1NtYXJ0UG9pbnRlcihTLCBSVCkpCi0gICAgcmV0dXJuOwotCi0gIC8vIENoZWNrIGlmIHRoZSB0eXBlIGlzIGxvY2thYmxlLgotICBSZWNvcmREZWNsICpSRCA9IFJULT5nZXREZWNsKCk7Ci0gIGlmIChSRC0+Z2V0QXR0cjxMb2NrYWJsZUF0dHI+KCkpCi0gICAgcmV0dXJuOwotCi0gIC8vIEVsc2UgY2hlY2sgaWYgYW55IGJhc2UgY2xhc3NlcyBhcmUgbG9ja2FibGUuCi0gIGlmIChDWFhSZWNvcmREZWNsICpDUkQgPSBkeW5fY2FzdDxDWFhSZWNvcmREZWNsPihSRCkpIHsKLSAgICBDWFhCYXNlUGF0aHMgQlBhdGhzKGZhbHNlLCBmYWxzZSk7Ci0gICAgaWYgKENSRC0+bG9va3VwSW5CYXNlcyhjaGVja0Jhc2VDbGFzc0lzTG9ja2FibGVDYWxsYmFjaywgMCwgQlBhdGhzKSkKLSAgICAgIHJldHVybjsKLSAgfQotCi0gIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfYXJndW1lbnRfbm90X2xvY2thYmxlKQotICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IFR5LmdldEFzU3RyaW5nKCk7CisgIHJldHVybiBUTi0+aGFzQXR0cjxDYXBhYmlsaXR5QXR0cj4oKTsKIH0KIAotLy8vIFxicmllZiBUaHJlYWQgU2FmZXR5IEFuYWx5c2lzOiBDaGVja3MgdGhhdCBhbGwgYXR0cmlidXRlIGFyZ3VtZW50cywgc3RhcnRpbmcKLS8vLyBmcm9tIFNpZHgsIHJlc29sdmUgdG8gYSBsb2NrYWJsZSBvYmplY3QuCisvLy8gXGJyaWVmIENoZWNrcyB0aGF0IHRoZSBwYXNzZWQgaW4gdHlwZSBpcyBxdWFsaWZpZWQgYXMgYSBjYXBhYmlsaXR5LiBUaGlzCisvLy8gdHlwZSBjYW4gZWl0aGVyIGJlIGEgc3RydWN0LCBvciBhIHR5cGVkZWYgdG8gYSBidWlsdC1pbiB0eXBlIChzdWNoIGFzIGludCkuCitzdGF0aWMgdm9pZCBjaGVja0ZvckNhcGFiaWxpdHkoU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUeSkgeworICBpZiAoY2hlY2tUeXBlZGVmVHlwZUZvckNhcGFiaWxpdHkoUywgQXR0ciwgVHkpKQorICAgIHJldHVybjsKKworICBpZiAoY2hlY2tSZWNvcmRUeXBlRm9yQ2FwYWJpbGl0eShTLCBBdHRyLCBUeSkpCisgICAgcmV0dXJuOworCisgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfYXJndW1lbnRfbm90X2xvY2thYmxlKQorICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IFR5OworfQorCisvLy8gXGJyaWVmIENoZWNrcyB0aGF0IGFsbCBhdHRyaWJ1dGUgYXJndW1lbnRzLCBzdGFydGluZyBmcm9tIFNpZHgsIHJlc29sdmUgdG8KKy8vLyBhIGNhcGFiaWxpdHkgb2JqZWN0LgogLy8vIFxwYXJhbSBTaWR4IFRoZSBhdHRyaWJ1dGUgYXJndW1lbnQgaW5kZXggdG8gc3RhcnQgY2hlY2tpbmcgd2l0aC4KIC8vLyBccGFyYW0gUGFyYW1JZHhPayBXaGV0aGVyIGFuIGFyZ3VtZW50IGNhbiBiZSBpbmRleGluZyBpbnRvIGEgZnVuY3Rpb24KIC8vLyBwYXJhbWV0ZXIgbGlzdC4KLXN0YXRpYyB2b2lkIGNoZWNrQXR0ckFyZ3NBcmVMb2NrYWJsZU9ianMoU2VtYSAmUywgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEV4cHIqPiAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFNpZHggPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBhcmFtSWR4T2sgPSBmYWxzZSkgewotICBmb3IodW5zaWduZWQgSWR4ID0gU2lkeDsgSWR4IDwgQXR0ci5nZXROdW1BcmdzKCk7ICsrSWR4KSB7CitzdGF0aWMgdm9pZCBjaGVja0F0dHJBcmdzQXJlQ2FwYWJpbGl0eU9ianMoU2VtYSAmUywgRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxFeHByICo+ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTaWR4ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBhcmFtSWR4T2sgPSBmYWxzZSkgeworICBmb3IgKHVuc2lnbmVkIElkeCA9IFNpZHg7IElkeCA8IEF0dHIuZ2V0TnVtQXJncygpOyArK0lkeCkgewogICAgIEV4cHIgKkFyZ0V4cCA9IEF0dHIuZ2V0QXJnQXNFeHByKElkeCk7CiAKICAgICBpZiAoQXJnRXhwLT5pc1R5cGVEZXBlbmRlbnQoKSkgewpAQCAtNDk5LDcgKzQ3MCw3IEBACiAgICAgICAgICAgaWYgKERSRS0+Z2V0RGVjbCgpLT5pc0NYWEluc3RhbmNlTWVtYmVyKCkpCiAgICAgICAgICAgICBBcmdUeSA9IERSRS0+Z2V0RGVjbCgpLT5nZXRUeXBlKCk7CiAKLSAgICAvLyBGaXJzdCBzZWUgaWYgd2UgY2FuIGp1c3QgY2FzdCB0byByZWNvcmQgdHlwZSwgb3IgcG9pbnQgdG8gcmVjb3JkIHR5cGUuCisgICAgLy8gRmlyc3Qgc2VlIGlmIHdlIGNhbiBqdXN0IGNhc3QgdG8gcmVjb3JkIHR5cGUsIG9yIHBvaW50ZXIgdG8gcmVjb3JkIHR5cGUuCiAgICAgY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBnZXRSZWNvcmRUeXBlKEFyZ1R5KTsKIAogICAgIC8vIE5vdyBjaGVjayBpZiB3ZSBpbmRleCBpbnRvIGEgcmVjb3JkIHR5cGUgZnVuY3Rpb24gcGFyYW0uCkBAIC01MjAsNyArNDkxLDcgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBjaGVja0ZvckxvY2thYmxlUmVjb3JkKFMsIEQsIEF0dHIsIEFyZ1R5KTsKKyAgICBjaGVja0ZvckNhcGFiaWxpdHkoUywgQXR0ciwgQXJnVHkpOwogCiAgICAgQXJncy5wdXNoX2JhY2soQXJnRXhwKTsKICAgfQpAQCAtNTM0LDM4ICs1MDUsOCBAQAogLy8gbGVhc3QgYWRkIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyB0byBjaGVjayBtb3N0IGFyZ3VtZW50IHBhdHRlcm5zICgjCiAvLyBhbmQgdHlwZXMgb2YgYXJncykuCiAKLWVudW0gVGhyZWFkQXR0cmlidXRlRGVjbEtpbmQgewotICBUaHJlYWRFeHBlY3RlZEZpZWxkT3JHbG9iYWxWYXIsCi0gIFRocmVhZEV4cGVjdGVkRnVuY3Rpb25Pck1ldGhvZCwKLSAgVGhyZWFkRXhwZWN0ZWRDbGFzc09yU3RydWN0Ci19OwotCi1zdGF0aWMgYm9vbCBjaGVja0d1YXJkZWRWYXJBdHRyQ29tbW9uKFNlbWEgJlMsIERlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgLy8gRCBtdXN0IGJlIGVpdGhlciBhIG1lbWJlciBmaWVsZCBvciBnbG9iYWwgKHBvdGVudGlhbGx5IHNoYXJlZCkgdmFyaWFibGUuCi0gIGlmICghbWF5QmVTaGFyZWRWYXJpYWJsZShEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgVGhyZWFkRXhwZWN0ZWRGaWVsZE9yR2xvYmFsVmFyOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVHdWFyZGVkVmFyQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghY2hlY2tHdWFyZGVkVmFyQXR0ckNvbW1vbihTLCBELCBBdHRyKSkKLSAgICByZXR1cm47Ci0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgIEd1YXJkZWRWYXJBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotfQotCiBzdGF0aWMgdm9pZCBoYW5kbGVQdEd1YXJkZWRWYXJBdHRyKFNlbWEgJlMsIERlY2wgKkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKCFjaGVja0d1YXJkZWRWYXJBdHRyQ29tbW9uKFMsIEQsIEF0dHIpKQotICAgIHJldHVybjsKLQogICBpZiAoIXRocmVhZFNhZmV0eUNoZWNrSXNQb2ludGVyKFMsIEQsIEF0dHIpKQogICAgIHJldHVybjsKIApAQCAtNTc3LDE2ICs1MTgsOSBAQAogc3RhdGljIGJvb2wgY2hlY2tHdWFyZGVkQnlBdHRyQ29tbW9uKFNlbWEgJlMsIERlY2wgKkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByKiAmQXJnKSB7Ci0gIC8vIEQgbXVzdCBiZSBlaXRoZXIgYSBtZW1iZXIgZmllbGQgb3IgZ2xvYmFsIChwb3RlbnRpYWxseSBzaGFyZWQpIHZhcmlhYmxlLgotICBpZiAoIW1heUJlU2hhcmVkVmFyaWFibGUoRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl90aHJlYWRfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IFRocmVhZEV4cGVjdGVkRmllbGRPckdsb2JhbFZhcjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQogICBTbWFsbFZlY3RvcjxFeHByKiwgMT4gQXJnczsKICAgLy8gY2hlY2sgdGhhdCBhbGwgYXJndW1lbnRzIGFyZSBsb2NrYWJsZSBvYmplY3RzCi0gIGNoZWNrQXR0ckFyZ3NBcmVMb2NrYWJsZU9ianMoUywgRCwgQXR0ciwgQXJncyk7CisgIGNoZWNrQXR0ckFyZ3NBcmVDYXBhYmlsaXR5T2JqcyhTLCBELCBBdHRyLCBBcmdzKTsKICAgdW5zaWduZWQgU2l6ZSA9IEFyZ3Muc2l6ZSgpOwogICBpZiAoU2l6ZSAhPSAxKQogICAgIHJldHVybiBmYWxzZTsKQEAgLTYwMSw3ICs1MzUsOCBAQAogICBpZiAoIWNoZWNrR3VhcmRlZEJ5QXR0ckNvbW1vbihTLCBELCBBdHRyLCBBcmcpKQogICAgIHJldHVybjsKIAotICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpIEd1YXJkZWRCeUF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsIEFyZykpOworICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpIEd1YXJkZWRCeUF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsIEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKIH0KIAogc3RhdGljIHZvaWQgaGFuZGxlUHRHdWFyZGVkQnlBdHRyKFNlbWEgJlMsIERlY2wgKkQsCkBAIC02MTQsODUgKzU0OSw4IEBACiAgICAgcmV0dXJuOwogCiAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkgUHRHdWFyZGVkQnlBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5Db250ZXh0LCBBcmcpKTsKLX0KLQotc3RhdGljIGJvb2wgY2hlY2tMb2NrYWJsZUF0dHJDb21tb24oU2VtYSAmUywgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgLy8gRklYTUU6IExvY2thYmxlIHN0cnVjdHMgZm9yIEMgY29kZS4KLSAgaWYgKCFpc2E8UmVjb3JkRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl90aHJlYWRfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IFRocmVhZEV4cGVjdGVkQ2xhc3NPclN0cnVjdDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlTG9ja2FibGVBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKCFjaGVja0xvY2thYmxlQXR0ckNvbW1vbihTLCBELCBBdHRyKSkKLSAgICByZXR1cm47Ci0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KSBMb2NrYWJsZUF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQpKTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlU2NvcGVkTG9ja2FibGVBdHRyKFNlbWEgJlMsIERlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKCFjaGVja0xvY2thYmxlQXR0ckNvbW1vbihTLCBELCBBdHRyKSkKLSAgICByZXR1cm47Ci0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgIFNjb3BlZExvY2thYmxlQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZU5vVGhyZWFkU2FmZXR5QW5hbHlzaXMoU2VtYSAmUywgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fdGhyZWFkX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBUaHJlYWRFeHBlY3RlZEZ1bmN0aW9uT3JNZXRob2Q7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KSBOb1RocmVhZFNhZmV0eUFuYWx5c2lzQXR0cihBdHRyLmdldFJhbmdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5Db250ZXh0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZU5vU2FuaXRpemVBZGRyZXNzQXR0cihTZW1hICZTLCBEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkgJiYgIWlzYTxGdW5jdGlvblRlbXBsYXRlRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZEZ1bmN0aW9uT3JNZXRob2Q7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgIE5vU2FuaXRpemVBZGRyZXNzQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZU5vU2FuaXRpemVNZW1vcnkoU2VtYSAmUywgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbk9yTWV0aG9kOwotICAgIHJldHVybjsKLSAgfQotCi0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkgTm9TYW5pdGl6ZU1lbW9yeUF0dHIoQXR0ci5nZXRSYW5nZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5Db250ZXh0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZU5vU2FuaXRpemVUaHJlYWQoU2VtYSAmUywgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbk9yTWV0aG9kOwotICAgIHJldHVybjsKLSAgfQotCi0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkgTm9TYW5pdGl6ZVRocmVhZEF0dHIoQXR0ci5nZXRSYW5nZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuQ29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLkNvbnRleHQsIEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKIH0KIAogc3RhdGljIGJvb2wgY2hlY2tBY3F1aXJlT3JkZXJBdHRyQ29tbW9uKFNlbWEgJlMsIERlY2wgKkQsCkBAIC03MDEsMTkgKzU1OSwxMSBAQAogICBpZiAoIWNoZWNrQXR0cmlidXRlQXRMZWFzdE51bUFyZ3MoUywgQXR0ciwgMSkpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIC8vIEQgbXVzdCBiZSBlaXRoZXIgYSBtZW1iZXIgZmllbGQgb3IgZ2xvYmFsIChwb3RlbnRpYWxseSBzaGFyZWQpIHZhcmlhYmxlLgotICBWYWx1ZURlY2wgKlZEID0gZHluX2Nhc3Q8VmFsdWVEZWNsPihEKTsKLSAgaWYgKCFWRCB8fCAhbWF5QmVTaGFyZWRWYXJpYWJsZShEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgVGhyZWFkRXhwZWN0ZWRGaWVsZE9yR2xvYmFsVmFyOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCiAgIC8vIENoZWNrIHRoYXQgdGhpcyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGxvY2thYmxlIHR5cGVzLgotICBRdWFsVHlwZSBRVCA9IFZELT5nZXRUeXBlKCk7CisgIFF1YWxUeXBlIFFUID0gY2FzdDxWYWx1ZURlY2w+KEQpLT5nZXRUeXBlKCk7CiAgIGlmICghUVQtPmlzRGVwZW5kZW50VHlwZSgpKSB7CiAgICAgY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBnZXRSZWNvcmRUeXBlKFFUKTsKLSAgICBpZiAoIVJUIHx8ICFSVC0+Z2V0RGVjbCgpLT5nZXRBdHRyPExvY2thYmxlQXR0cj4oKSkgeworICAgIGlmICghUlQgfHwgIVJULT5nZXREZWNsKCktPmhhc0F0dHI8Q2FwYWJpbGl0eUF0dHI+KCkpIHsKICAgICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfZGVjbF9ub3RfbG9ja2FibGUpCiAgICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpOwogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzIxLDcgKzU3MSw3IEBACiAgIH0KIAogICAvLyBDaGVjayB0aGF0IGFsbCBhcmd1bWVudHMgYXJlIGxvY2thYmxlIG9iamVjdHMuCi0gIGNoZWNrQXR0ckFyZ3NBcmVMb2NrYWJsZU9ianMoUywgRCwgQXR0ciwgQXJncyk7CisgIGNoZWNrQXR0ckFyZ3NBcmVDYXBhYmlsaXR5T2JqcyhTLCBELCBBdHRyLCBBcmdzKTsKICAgaWYgKEFyZ3MuZW1wdHkoKSkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTc1OCw0NyArNjA4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxFeHByICo+ICZBcmdzKSB7CiAgIC8vIHplcm8gb3IgbW9yZSBhcmd1bWVudHMgb2sKLQotICAvLyBjaGVjayB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgYXBwbGllZCB0byBhIGZ1bmN0aW9uCi0gIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkgJiYgIWlzYTxGdW5jdGlvblRlbXBsYXRlRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl90aHJlYWRfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IFRocmVhZEV4cGVjdGVkRnVuY3Rpb25Pck1ldGhvZDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQogICAvLyBjaGVjayB0aGF0IGFsbCBhcmd1bWVudHMgYXJlIGxvY2thYmxlIG9iamVjdHMKLSAgY2hlY2tBdHRyQXJnc0FyZUxvY2thYmxlT2JqcyhTLCBELCBBdHRyLCBBcmdzLCAwLCAvKlBhcmFtSWR4T2s9Ki90cnVlKTsKKyAgY2hlY2tBdHRyQXJnc0FyZUNhcGFiaWxpdHlPYmpzKFMsIEQsIEF0dHIsIEFyZ3MsIDAsIC8qUGFyYW1JZHhPaz0qL3RydWUpOwogCiAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVTaGFyZWRMb2NrRnVuY3Rpb25BdHRyKFNlbWEgJlMsIERlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgU21hbGxWZWN0b3I8RXhwciosIDE+IEFyZ3M7Ci0gIGlmICghY2hlY2tMb2NrRnVuQXR0ckNvbW1vbihTLCBELCBBdHRyLCBBcmdzKSkKLSAgICByZXR1cm47Ci0KLSAgdW5zaWduZWQgU2l6ZSA9IEFyZ3Muc2l6ZSgpOwotICBFeHByICoqU3RhcnRBcmcgPSBTaXplID09IDAgPyAwIDogJkFyZ3NbMF07Ci0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBTaGFyZWRMb2NrRnVuY3Rpb25BdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LCBTdGFydEFyZywgU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVFeGNsdXNpdmVMb2NrRnVuY3Rpb25BdHRyKFNlbWEgJlMsIERlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgU21hbGxWZWN0b3I8RXhwciosIDE+IEFyZ3M7Ci0gIGlmICghY2hlY2tMb2NrRnVuQXR0ckNvbW1vbihTLCBELCBBdHRyLCBBcmdzKSkKLSAgICByZXR1cm47Ci0KLSAgdW5zaWduZWQgU2l6ZSA9IEFyZ3Muc2l6ZSgpOwotICBFeHByICoqU3RhcnRBcmcgPSBTaXplID09IDAgPyAwIDogJkFyZ3NbMF07Ci0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBFeGNsdXNpdmVMb2NrRnVuY3Rpb25BdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRBcmcsIFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLX0KLQogc3RhdGljIHZvaWQgaGFuZGxlQXNzZXJ0U2hhcmVkTG9ja0F0dHIoU2VtYSAmUywgRGVjbCAqRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKICAgU21hbGxWZWN0b3I8RXhwciosIDE+IEFyZ3M7CkBAIC04MzMsMTIgKzY0OCw2IEBACiAgIGlmICghY2hlY2tBdHRyaWJ1dGVBdExlYXN0TnVtQXJncyhTLCBBdHRyLCAxKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSAmJiAhaXNhPEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgVGhyZWFkRXhwZWN0ZWRGdW5jdGlvbk9yTWV0aG9kOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCiAgIGlmICghaXNJbnRPckJvb2woQXR0ci5nZXRBcmdBc0V4cHIoMCkpKSB7CiAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfbl90eXBlKQogICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMSA8PCBBQU5UX0FyZ3VtZW50SW50T3JCb29sOwpAQCAtODQ2LDcgKzY1NSw3IEBACiAgIH0KIAogICAvLyBjaGVjayB0aGF0IGFsbCBhcmd1bWVudHMgYXJlIGxvY2thYmxlIG9iamVjdHMKLSAgY2hlY2tBdHRyQXJnc0FyZUxvY2thYmxlT2JqcyhTLCBELCBBdHRyLCBBcmdzLCAxKTsKKyAgY2hlY2tBdHRyQXJnc0FyZUNhcGFiaWxpdHlPYmpzKFMsIEQsIEF0dHIsIEFyZ3MsIDEpOwogCiAgIHJldHVybiB0cnVlOwogfQpAQCAtODc3LDg0ICs2ODYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCi1zdGF0aWMgYm9vbCBjaGVja0xvY2tzUmVxdWlyZWRDb21tb24oU2VtYSAmUywgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxFeHByICo+ICZBcmdzKSB7Ci0gIGlmICghY2hlY2tBdHRyaWJ1dGVBdExlYXN0TnVtQXJncyhTLCBBdHRyLCAxKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSAmJiAhaXNhPEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgVGhyZWFkRXhwZWN0ZWRGdW5jdGlvbk9yTWV0aG9kOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIGNoZWNrIHRoYXQgYWxsIGFyZ3VtZW50cyBhcmUgbG9ja2FibGUgb2JqZWN0cwotICBjaGVja0F0dHJBcmdzQXJlTG9ja2FibGVPYmpzKFMsIEQsIEF0dHIsIEFyZ3MpOwotICBpZiAoQXJncy5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlRXhjbHVzaXZlTG9ja3NSZXF1aXJlZEF0dHIoU2VtYSAmUywgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgU21hbGxWZWN0b3I8RXhwciosIDE+IEFyZ3M7Ci0gIGlmICghY2hlY2tMb2Nrc1JlcXVpcmVkQ29tbW9uKFMsIEQsIEF0dHIsIEFyZ3MpKQotICAgIHJldHVybjsKLQotICBFeHByICoqU3RhcnRBcmcgPSAmQXJnc1swXTsKLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgIEV4Y2x1c2l2ZUxvY2tzUmVxdWlyZWRBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QXJnLCBBcmdzLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlU2hhcmVkTG9ja3NSZXF1aXJlZEF0dHIoU2VtYSAmUywgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgU21hbGxWZWN0b3I8RXhwciosIDE+IEFyZ3M7Ci0gIGlmICghY2hlY2tMb2Nrc1JlcXVpcmVkQ29tbW9uKFMsIEQsIEF0dHIsIEFyZ3MpKQotICAgIHJldHVybjsKLQotICBFeHByICoqU3RhcnRBcmcgPSAmQXJnc1swXTsKLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgIFNoYXJlZExvY2tzUmVxdWlyZWRBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0QXJnLCBBcmdzLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlVW5sb2NrRnVuQXR0cihTZW1hICZTLCBEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIC8vIHplcm8gb3IgbW9yZSBhcmd1bWVudHMgb2sKLQotICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fdGhyZWFkX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBUaHJlYWRFeHBlY3RlZEZ1bmN0aW9uT3JNZXRob2Q7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gY2hlY2sgdGhhdCBhbGwgYXJndW1lbnRzIGFyZSBsb2NrYWJsZSBvYmplY3RzCi0gIFNtYWxsVmVjdG9yPEV4cHIqLCAxPiBBcmdzOwotICBjaGVja0F0dHJBcmdzQXJlTG9ja2FibGVPYmpzKFMsIEQsIEF0dHIsIEFyZ3MsIDAsIC8qUGFyYW1JZHhPaz0qL3RydWUpOwotICB1bnNpZ25lZCBTaXplID0gQXJncy5zaXplKCk7Ci0gIEV4cHIgKipTdGFydEFyZyA9IFNpemUgPT0gMCA/IDAgOiAmQXJnc1swXTsKLQotICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgVW5sb2NrRnVuY3Rpb25BdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LCBTdGFydEFyZywgU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGhhbmRsZUxvY2tSZXR1cm5lZEF0dHIoU2VtYSAmUywgRGVjbCAqRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fdGhyZWFkX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBUaHJlYWRFeHBlY3RlZEZ1bmN0aW9uT3JNZXRob2Q7Ci0gICAgcmV0dXJuOwotICB9Ci0KICAgLy8gY2hlY2sgdGhhdCB0aGUgYXJndW1lbnQgaXMgbG9ja2FibGUgb2JqZWN0CiAgIFNtYWxsVmVjdG9yPEV4cHIqLCAxPiBBcmdzOwotICBjaGVja0F0dHJBcmdzQXJlTG9ja2FibGVPYmpzKFMsIEQsIEF0dHIsIEFyZ3MpOworICBjaGVja0F0dHJBcmdzQXJlQ2FwYWJpbGl0eU9ianMoUywgRCwgQXR0ciwgQXJncyk7CiAgIHVuc2lnbmVkIFNpemUgPSBBcmdzLnNpemUoKTsKICAgaWYgKFNpemUgPT0gMCkKICAgICByZXR1cm47CkBAIC05NjksMTUgKzcwNSw5IEBACiAgIGlmICghY2hlY2tBdHRyaWJ1dGVBdExlYXN0TnVtQXJncyhTLCBBdHRyLCAxKSkKICAgICByZXR1cm47CiAKLSAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSAmJiAhaXNhPEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX3RocmVhZF9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgVGhyZWFkRXhwZWN0ZWRGdW5jdGlvbk9yTWV0aG9kOwotICAgIHJldHVybjsKLSAgfQotCiAgIC8vIGNoZWNrIHRoYXQgYWxsIGFyZ3VtZW50cyBhcmUgbG9ja2FibGUgb2JqZWN0cwogICBTbWFsbFZlY3RvcjxFeHByKiwgMT4gQXJnczsKLSAgY2hlY2tBdHRyQXJnc0FyZUxvY2thYmxlT2JqcyhTLCBELCBBdHRyLCBBcmdzKTsKKyAgY2hlY2tBdHRyQXJnc0FyZUNhcGFiaWxpdHlPYmpzKFMsIEQsIEF0dHIsIEFyZ3MpOwogICB1bnNpZ25lZCBTaXplID0gQXJncy5zaXplKCk7CiAgIGlmIChTaXplID09IDApCiAgICAgcmV0dXJuOwpAQCAtOTg4LDYgKzcxOCwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCitzdGF0aWMgdm9pZCBoYW5kbGVFbmFibGVJZkF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBFeHByICpDb25kID0gQXR0ci5nZXRBcmdBc0V4cHIoMCk7CisgIGlmICghQ29uZC0+aXNUeXBlRGVwZW5kZW50KCkpIHsKKyAgICBFeHByUmVzdWx0IENvbnZlcnRlZCA9IFMuUGVyZm9ybUNvbnRleHR1YWxseUNvbnZlcnRUb0Jvb2woQ29uZCk7CisgICAgaWYgKENvbnZlcnRlZC5pc0ludmFsaWQoKSkKKyAgICAgIHJldHVybjsKKyAgICBDb25kID0gQ29udmVydGVkLnRha2UoKTsKKyAgfQorCisgIFN0cmluZ1JlZiBNc2c7CisgIGlmICghUy5jaGVja1N0cmluZ0xpdGVyYWxBcmd1bWVudEF0dHIoQXR0ciwgMSwgTXNnKSkKKyAgICByZXR1cm47CisKKyAgU21hbGxWZWN0b3I8UGFydGlhbERpYWdub3N0aWNBdCwgOD4gRGlhZ3M7CisgIGlmICghQ29uZC0+aXNWYWx1ZURlcGVuZGVudCgpICYmCisgICAgICAhRXhwcjo6aXNQb3RlbnRpYWxDb25zdGFudEV4cHJVbmV2YWx1YXRlZChDb25kLCBjYXN0PEZ1bmN0aW9uRGVjbD4oRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFncykpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2VuYWJsZV9pZl9uZXZlcl9jb25zdGFudF9leHByKTsKKyAgICBmb3IgKGludCBJID0gMCwgTiA9IERpYWdzLnNpemUoKTsgSSAhPSBOOyArK0kpCisgICAgICBTLkRpYWcoRGlhZ3NbSV0uZmlyc3QsIERpYWdzW0ldLnNlY29uZCk7CisgICAgcmV0dXJuOworICB9CisKKyAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQorICAgICAgICAgICAgIEVuYWJsZUlmQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwgQ29uZCwgTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKK30KKwogc3RhdGljIHZvaWQgaGFuZGxlQ29uc3VtYWJsZUF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewogICBDb25zdW1hYmxlQXR0cjo6Q29uc3VtZWRTdGF0ZSBEZWZhdWx0U3RhdGU7CiAKQEAgLTEwMDQsMTggKzc2MiwxMyBAQAogICAgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBBQU5UX0FyZ3VtZW50SWRlbnRpZmllcjsKICAgICByZXR1cm47CiAgIH0KLQotICBpZiAoIWlzYTxDWFhSZWNvcmREZWNsPihEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpIDw8Ci0gICAgICBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZENsYXNzOwotICAgIHJldHVybjsKLSAgfQogICAKICAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQogICAgICAgICAgICAgIENvbnN1bWFibGVBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LCBEZWZhdWx0U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CiB9CiAKKwogc3RhdGljIGJvb2wgY2hlY2tGb3JDb25zdW1hYmxlQ2xhc3MoU2VtYSAmUywgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewogICBBU1RDb250ZXh0ICZDdXJyQ29udGV4dCA9IFMuZ2V0QVNUQ29udGV4dCgpOwpAQCAtMTAzOCwxMiArNzkxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewogICBpZiAoIWNoZWNrQXR0cmlidXRlQXRMZWFzdE51bUFyZ3MoUywgQXR0ciwgMSkpCiAgICAgcmV0dXJuOwotCi0gIGlmICghaXNhPENYWE1ldGhvZERlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkgPDwKLSAgICAgIEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkTWV0aG9kOwotICAgIHJldHVybjsKLSAgfQogICAKICAgaWYgKCFjaGVja0ZvckNvbnN1bWFibGVDbGFzcyhTLCBjYXN0PENYWE1ldGhvZERlY2w+KEQpLCBBdHRyKSkKICAgICByZXR1cm47CkBAIC0xMDc2LDEzICs4MjMsNyBAQAogc3RhdGljIHZvaWQgaGFuZGxlUGFyYW1UeXBlc3RhdGVBdHRyKFNlbWEgJlMsIERlY2wgKkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CiAgIGlmICghY2hlY2tBdHRyaWJ1dGVOdW1BcmdzKFMsIEF0dHIsIDEpKSByZXR1cm47Ci0gIAotICBpZiAoIWlzYTxQYXJtVmFyRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKSA8PAotICAgICAgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRQYXJhbWV0ZXI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIAorICAgIAogICBQYXJhbVR5cGVzdGF0ZUF0dHI6OkNvbnN1bWVkU3RhdGUgUGFyYW1TdGF0ZTsKICAgCiAgIGlmIChBdHRyLmlzQXJnSWRlbnQoMCkpIHsKQEAgLTExMjMsMTIgKzg2NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKICAgaWYgKCFjaGVja0F0dHJpYnV0ZU51bUFyZ3MoUywgQXR0ciwgMSkpIHJldHVybjsKICAgCi0gIGlmICghKGlzYTxGdW5jdGlvbkRlY2w+KEQpIHx8IGlzYTxQYXJtVmFyRGVjbD4oRCkpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkgPDwKLSAgICAgIEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkRnVuY3Rpb25NZXRob2RPclBhcmFtZXRlcjsKLSAgICByZXR1cm47Ci0gIH0KLQogICBSZXR1cm5UeXBlc3RhdGVBdHRyOjpDb25zdW1lZFN0YXRlIFJldHVyblN0YXRlOwogICAKICAgaWYgKEF0dHIuaXNBcmdJZGVudCgwKSkgewpAQCAtMTE3OSwxMiArOTE0LDYgQEAKIHN0YXRpYyB2b2lkIGhhbmRsZVNldFR5cGVzdGF0ZUF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewogICBpZiAoIWNoZWNrQXR0cmlidXRlTnVtQXJncyhTLCBBdHRyLCAxKSkKICAgICByZXR1cm47Ci0KLSAgaWYgKCFpc2E8Q1hYTWV0aG9kRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKSA8PAotICAgICAgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRNZXRob2Q7Ci0gICAgcmV0dXJuOwotICB9CiAgIAogICBpZiAoIWNoZWNrRm9yQ29uc3VtYWJsZUNsYXNzKFMsIGNhc3Q8Q1hYTWV0aG9kRGVjbD4oRCksIEF0dHIpKQogICAgIHJldHVybjsKQEAgLTEyMTQsMTIgKzk0Myw2IEBACiAgIGlmICghY2hlY2tBdHRyaWJ1dGVOdW1BcmdzKFMsIEF0dHIsIDEpKQogICAgIHJldHVybjsKICAgCi0gIGlmICghaXNhPENYWE1ldGhvZERlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkgPDwKLSAgICAgIEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkTWV0aG9kOwotICAgIHJldHVybjsKLSAgfQotICAKICAgaWYgKCFjaGVja0ZvckNvbnN1bWFibGVDbGFzcyhTLCBjYXN0PENYWE1ldGhvZERlY2w+KEQpLCBBdHRyKSkKICAgICByZXR1cm47CiAgIApAQCAtMTI0NSwyMSArOTY4LDE0IEBACiAKIHN0YXRpYyB2b2lkIGhhbmRsZUV4dFZlY3RvclR5cGVBdHRyKFNlbWEgJlMsIFNjb3BlICpzY29wZSwgRGVjbCAqRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgVHlwZWRlZk5hbWVEZWNsICpURCA9IGR5bl9jYXN0PFR5cGVkZWZOYW1lRGVjbD4oRCk7Ci0gIGlmIChURCA9PSAwKSB7Ci0gICAgLy8gX19hdHRyaWJ1dGVfXygoZXh0X3ZlY3Rvcl90eXBlKE4pKSkgY2FuIG9ubHkgYmUgYXBwbGllZCB0byB0eXBlZGVmcwotICAgIC8vIGFuZCB0eXBlLWlkcy4KLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX3R5cGVjaGVja19leHRfdmVjdG9yX25vdF90eXBlZGVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQogICAvLyBSZW1lbWJlciB0aGlzIHR5cGVkZWYgZGVjbCwgd2Ugd2lsbCBuZWVkIGl0IGxhdGVyIGZvciBkaWFnbm9zdGljcy4KLSAgUy5FeHRWZWN0b3JEZWNscy5wdXNoX2JhY2soVEQpOworICBTLkV4dFZlY3RvckRlY2xzLnB1c2hfYmFjayhjYXN0PFR5cGVkZWZOYW1lRGVjbD4oRCkpOwogfQogCiBzdGF0aWMgdm9pZCBoYW5kbGVQYWNrZWRBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKICAgaWYgKFRhZ0RlY2wgKlREID0gZHluX2Nhc3Q8VGFnRGVjbD4oRCkpCi0gICAgVEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkgUGFja2VkQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCkpOworICAgIFRELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpIFBhY2tlZEF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CiAgIGVsc2UgaWYgKEZpZWxkRGVjbCAqRkQgPSBkeW5fY2FzdDxGaWVsZERlY2w+KEQpKSB7CiAgICAgLy8gSWYgdGhlIGFsaWdubWVudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gOCBiaXRzLCB0aGUgcGFja2VkIGF0dHJpYnV0ZQogICAgIC8vIGhhcyBubyBlZmZlY3QuCkBAIC0xMjc2LDI4ICs5OTIsNiBAQAogICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCBBdHRyLmdldE5hbWUoKTsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlTXNTdHJ1Y3RBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKFJlY29yZERlY2wgKlJEID0gZHluX2Nhc3Q8UmVjb3JkRGVjbD4oRCkpCi0gICAgUkQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICAgICBNc1N0cnVjdEF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotICBlbHNlCi0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX2lnbm9yZWQpIDw8IEF0dHIuZ2V0TmFtZSgpOwotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVJQkFjdGlvbihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIC8vIFRoZSBJQkFjdGlvbiBhdHRyaWJ1dGVzIG9ubHkgYXBwbHkgdG8gaW5zdGFuY2UgbWV0aG9kcy4KLSAgaWYgKE9iakNNZXRob2REZWNsICpNRCA9IGR5bl9jYXN0PE9iakNNZXRob2REZWNsPihEKSkKLSAgICBpZiAoTUQtPmlzSW5zdGFuY2VNZXRob2QoKSkgewotICAgICAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgICAgICBJQkFjdGlvbkF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX2liYWN0aW9uKSA8PCBBdHRyLmdldE5hbWUoKTsKLX0KLQogc3RhdGljIGJvb2wgY2hlY2tJQk91dGxldENvbW1vbihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CiAgIC8vIFRoZSBJQk91dGxldC9JQk91dGxldENvbGxlY3Rpb24gYXR0cmlidXRlcyBvbmx5IGFwcGx5IHRvIGluc3RhbmNlCiAgIC8vIHZhcmlhYmxlcyBvciBwcm9wZXJ0aWVzIG9mIE9iamVjdGl2ZS1DIGNsYXNzZXMuICBUaGUgb3V0bGV0IG11c3QgYWxzbwpAQCAtMTM4NCw5ICsxMDc4LDggQEAKICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKlVUID0gVC0+Z2V0QXNVbmlvblR5cGUoKSkKICAgICBpZiAoVVQgJiYgVVQtPmdldERlY2woKS0+aGFzQXR0cjxUcmFuc3BhcmVudFVuaW9uQXR0cj4oKSkgewogICAgICAgUmVjb3JkRGVjbCAqVUQgPSBVVC0+Z2V0RGVjbCgpOwotICAgICAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBpdCA9IFVELT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICBpdGVuZCA9IFVELT5maWVsZF9lbmQoKTsgaXQgIT0gaXRlbmQ7ICsraXQpIHsKLSAgICAgICAgUXVhbFR5cGUgUVQgPSBpdC0+Z2V0VHlwZSgpOworICAgICAgZm9yIChjb25zdCBhdXRvICpJIDogVUQtPmZpZWxkcygpKSB7CisgICAgICAgIFF1YWxUeXBlIFFUID0gSS0+Z2V0VHlwZSgpOwogICAgICAgICBpZiAoUVQtPmlzQW55UG9pbnRlclR5cGUoKSB8fCBRVC0+aXNCbG9ja1BvaW50ZXJUeXBlKCkpIHsKICAgICAgICAgICBUID0gUVQ7CiAgICAgICAgICAgcmV0dXJuOwpAQCAtMTM5NSw3NCArMTA4OCwzNCBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlQWxsb2NTaXplQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNGdW5jdGlvbk9yTWV0aG9kKEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZEZ1bmN0aW9uT3JNZXRob2Q7Ci0gICAgcmV0dXJuOworc3RhdGljIGJvb2wgYXR0ck5vbk51bGxBcmdDaGVjayhTZW1hICZTLCBRdWFsVHlwZSBULCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSLCBib29sIGlzUmV0dXJuVmFsdWUgPSBmYWxzZSkgeworICBUID0gVC5nZXROb25SZWZlcmVuY2VUeXBlKCk7CisgIHBvc3NpYmxlVHJhbnNwYXJlbnRVbmlvblBvaW50ZXJUeXBlKFQpOworCisgIGlmICghVC0+aXNBbnlQb2ludGVyVHlwZSgpICYmICFULT5pc0Jsb2NrUG9pbnRlclR5cGUoKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLAorICAgICAgICAgICBpc1JldHVyblZhbHVlID8gZGlhZzo6d2Fybl9hdHRyaWJ1dGVfcmV0dXJuX3BvaW50ZXJzX29ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6Ondhcm5fYXR0cmlidXRlX3BvaW50ZXJzX29ubHkpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBSOworICAgIHJldHVybiBmYWxzZTsKICAgfQotCi0gIGlmICghY2hlY2tBdHRyaWJ1dGVBdExlYXN0TnVtQXJncyhTLCBBdHRyLCAxKSkKLSAgICByZXR1cm47Ci0KLSAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDg+IFNpemVBcmdzOwotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQXR0ci5nZXROdW1BcmdzKCk7ICsraSkgewotICAgIEV4cHIgKkV4ID0gQXR0ci5nZXRBcmdBc0V4cHIoaSk7Ci0gICAgdWludDY0X3QgSWR4OwotICAgIGlmICghY2hlY2tGdW5jdGlvbk9yTWV0aG9kQXJndW1lbnRJbmRleChTLCBELCBBdHRyLmdldE5hbWUoKS0+Z2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldExvYygpLCBpICsgMSwgRXgsIElkeCkpCi0gICAgICByZXR1cm47Ci0KLSAgICAvLyBjaGVjayBpZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgaXMgb2YgYW4gaW50ZWdlciB0eXBlCi0gICAgUXVhbFR5cGUgVCA9IGdldEZ1bmN0aW9uT3JNZXRob2RBcmdUeXBlKEQsIElkeCkuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpOwotICAgIGlmICghVC0+aXNJbnRlZ2VyVHlwZSgpKSB7Ci0gICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF90eXBlKQotICAgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBBQU5UX0FyZ3VtZW50SW50ZWdlckNvbnN0YW50Ci0gICAgICAgIDw8IEV4LT5nZXRTb3VyY2VSYW5nZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBTaXplQXJncy5wdXNoX2JhY2soSWR4KTsKLSAgfQotCi0gIC8vIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlcgotICBpZiAoIWdldEZ1bmN0aW9uVHlwZShEKS0+Z2V0UmVzdWx0VHlwZSgpLT5pc0FueVBvaW50ZXJUeXBlKCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9uc19hdHRyaWJ1dGVfd3JvbmdfcmV0dXJuX3R5cGUpCi0gICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMCAvKmZ1bmN0aW9uKi88PCAxIC8qcG9pbnRlciovIDw8IEQtPmdldFNvdXJjZVJhbmdlKCk7Ci0gIH0KLQotICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgQWxsb2NTaXplQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemVBcmdzLmRhdGEoKSwgU2l6ZUFyZ3Muc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CisgIHJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgdm9pZCBoYW5kbGVOb25OdWxsQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIC8vIEdDQyBpZ25vcmVzIHRoZSBub25udWxsIGF0dHJpYnV0ZSBvbiBLJlIgc3R5bGUgZnVuY3Rpb24gcHJvdG90eXBlcywgc28gd2UKLSAgLy8gaWdub3JlIGl0IGFzIHdlbGwKLSAgaWYgKCFpc0Z1bmN0aW9uT3JNZXRob2QoRCkgfHwgIWhhc0Z1bmN0aW9uUHJvdG8oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbjsKLSAgICByZXR1cm47Ci0gIH0KLQogICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgOD4gTm9uTnVsbEFyZ3M7CiAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBBdHRyLmdldE51bUFyZ3MoKTsgKytpKSB7CiAgICAgRXhwciAqRXggPSBBdHRyLmdldEFyZ0FzRXhwcihpKTsKICAgICB1aW50NjRfdCBJZHg7Ci0gICAgaWYgKCFjaGVja0Z1bmN0aW9uT3JNZXRob2RBcmd1bWVudEluZGV4KFMsIEQsIEF0dHIuZ2V0TmFtZSgpLT5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0TG9jKCksIGkgKyAxLCBFeCwgSWR4KSkKKyAgICBpZiAoIWNoZWNrRnVuY3Rpb25Pck1ldGhvZFBhcmFtZXRlckluZGV4KFMsIEQsIEF0dHIsIGkgKyAxLCBFeCwgSWR4KSkKICAgICAgIHJldHVybjsKIAogICAgIC8vIElzIHRoZSBmdW5jdGlvbiBhcmd1bWVudCBhIHBvaW50ZXIgdHlwZT8KLSAgICBRdWFsVHlwZSBUID0gZ2V0RnVuY3Rpb25Pck1ldGhvZEFyZ1R5cGUoRCwgSWR4KS5nZXROb25SZWZlcmVuY2VUeXBlKCk7Ci0gICAgcG9zc2libGVUcmFuc3BhcmVudFVuaW9uUG9pbnRlclR5cGUoVCk7Ci0gICAgCi0gICAgaWYgKCFULT5pc0FueVBvaW50ZXJUeXBlKCkgJiYgIVQtPmlzQmxvY2tQb2ludGVyVHlwZSgpKSB7Ci0gICAgICAvLyBGSVhNRTogU2hvdWxkIGFsc28gaGlnaGxpZ2h0IGFyZ3VtZW50IGluIGRlY2wuCi0gICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9ub25udWxsX3BvaW50ZXJzX29ubHkpCi0gICAgICAgIDw8ICJub25udWxsIiA8PCBFeC0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAvLyBGSVhNRTogU2hvdWxkIGFsc28gaGlnaGxpZ2h0IGFyZ3VtZW50IGluIGRlY2wgaW4gdGhlIGRpYWdub3N0aWMuCisgICAgaWYgKCFhdHRyTm9uTnVsbEFyZ0NoZWNrKFMsIGdldEZ1bmN0aW9uT3JNZXRob2RQYXJhbVR5cGUoRCwgSWR4KSwgQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXgtPmdldFNvdXJjZVJhbmdlKCkpKQogICAgICAgY29udGludWU7Ci0gICAgfQogCiAgICAgTm9uTnVsbEFyZ3MucHVzaF9iYWNrKElkeCk7CiAgIH0KQEAgLTE0NzAsOCArMTEyMyw4IEBACiAgIC8vIElmIG5vIGFyZ3VtZW50cyB3ZXJlIHNwZWNpZmllZCB0byBfX2F0dHJpYnV0ZV9fKChub25udWxsKSkgdGhlbiBhbGwgcG9pbnRlcgogICAvLyBhcmd1bWVudHMgaGF2ZSBhIG5vbm51bGwgYXR0cmlidXRlLgogICBpZiAoTm9uTnVsbEFyZ3MuZW1wdHkoKSkgewotICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXRGdW5jdGlvbk9yTWV0aG9kTnVtQXJncyhEKTsgaSAhPSBlOyArK2kpIHsKLSAgICAgIFF1YWxUeXBlIFQgPSBnZXRGdW5jdGlvbk9yTWV0aG9kQXJnVHlwZShELCBpKS5nZXROb25SZWZlcmVuY2VUeXBlKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldEZ1bmN0aW9uT3JNZXRob2ROdW1QYXJhbXMoRCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBRdWFsVHlwZSBUID0gZ2V0RnVuY3Rpb25Pck1ldGhvZFBhcmFtVHlwZShELCBpKS5nZXROb25SZWZlcmVuY2VUeXBlKCk7CiAgICAgICBwb3NzaWJsZVRyYW5zcGFyZW50VW5pb25Qb2ludGVyVHlwZShUKTsKICAgICAgIGlmIChULT5pc0FueVBvaW50ZXJUeXBlKCkgfHwgVC0+aXNCbG9ja1BvaW50ZXJUeXBlKCkpCiAgICAgICAgIE5vbk51bGxBcmdzLnB1c2hfYmFjayhpKTsKQEAgLTE0OTUsMTMgKzExNDgsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKm93bmVyc2hpcEtpbmRUb0RpYWdOYW1lKE93bmVyc2hpcEF0dHI6Ok93bmVyc2hpcEtpbmQgSykgewotICBzd2l0Y2ggKEspIHsKLSAgICBjYXNlIE93bmVyc2hpcEF0dHI6OkhvbGRzOiAgICByZXR1cm4gIidvd25lcnNoaXBfaG9sZHMnIjsKLSAgICBjYXNlIE93bmVyc2hpcEF0dHI6OlRha2VzOiAgICByZXR1cm4gIidvd25lcnNoaXBfdGFrZXMnIjsKLSAgICBjYXNlIE93bmVyc2hpcEF0dHI6OlJldHVybnM6ICByZXR1cm4gIidvd25lcnNoaXBfcmV0dXJucyciOworc3RhdGljIHZvaWQgaGFuZGxlTm9uTnVsbEF0dHJQYXJhbWV0ZXIoU2VtYSAmUywgUGFybVZhckRlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIGlmIChBdHRyLmdldE51bUFyZ3MoKSA+IDApIHsKKyAgICBpZiAoRC0+Z2V0RnVuY3Rpb25UeXBlKCkpIHsKKyAgICAgIGhhbmRsZU5vbk51bGxBdHRyKFMsIEQsIEF0dHIpOworICAgIH0gZWxzZSB7CisgICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfbm9ubnVsbF9wYXJtX25vX2FyZ3MpCisgICAgICAgIDw8IEQtPmdldFNvdXJjZVJhbmdlKCk7CisgICAgfQorICAgIHJldHVybjsKICAgfQotICBsbHZtX3VucmVhY2hhYmxlKCJ1bmtub3duIG93bmVyc2hpcCIpOworCisgIC8vIElzIHRoZSBhcmd1bWVudCBhIHBvaW50ZXIgdHlwZT8KKyAgaWYgKCFhdHRyTm9uTnVsbEFyZ0NoZWNrKFMsIEQtPmdldFR5cGUoKSwgQXR0ciwgRC0+Z2V0U291cmNlUmFuZ2UoKSkpCisgICAgcmV0dXJuOworCisgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKKyAgICAgICAgICAgICBOb25OdWxsQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlUmV0dXJuc05vbk51bGxBdHRyKFNlbWEgJlMsIERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBRdWFsVHlwZSBSZXN1bHRUeXBlID0gZ2V0RnVuY3Rpb25Pck1ldGhvZFJlc3VsdFR5cGUoRCk7CisgIGlmICghYXR0ck5vbk51bGxBcmdDaGVjayhTLCBSZXN1bHRUeXBlLCBBdHRyLCBBdHRyLmdldFJhbmdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpc1JldHVyblZhbHVlICovIHRydWUpKQorICAgIHJldHVybjsKKworICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCisgICAgICAgICAgICBSZXR1cm5zTm9uTnVsbEF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZU93bmVyc2hpcEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQUwpIHsKQEAgLTE1MTksNTggKzExOTYsNDkgQEAKICAgICByZXR1cm47CiAgIH0KIAotICAvLyBGaWd1cmUgb3V0IG91ciBLaW5kLCBhbmQgY2hlY2sgYXJndW1lbnRzIHdoaWxlIHdlJ3JlIGF0IGl0LgotICBPd25lcnNoaXBBdHRyOjpPd25lcnNoaXBLaW5kIEs7Ci0gIHN3aXRjaCAoQUwuZ2V0S2luZCgpKSB7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfb3duZXJzaGlwX3Rha2VzOgotICAgIEsgPSBPd25lcnNoaXBBdHRyOjpUYWtlczsKLSAgICBpZiAoQUwuZ2V0TnVtQXJncygpIDwgMikgewotICAgICAgUy5EaWFnKEFMLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3Rvb19mZXdfYXJndW1lbnRzKSA8PCAyOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9vd25lcnNoaXBfaG9sZHM6Ci0gICAgSyA9IE93bmVyc2hpcEF0dHI6OkhvbGRzOwotICAgIGlmIChBTC5nZXROdW1BcmdzKCkgPCAyKSB7Ci0gICAgICBTLkRpYWcoQUwuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfdG9vX2Zld19hcmd1bWVudHMpIDw8IDI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX293bmVyc2hpcF9yZXR1cm5zOgotICAgIEsgPSBPd25lcnNoaXBBdHRyOjpSZXR1cm5zOworICAvLyBGaWd1cmUgb3V0IG91ciBLaW5kLgorICBPd25lcnNoaXBBdHRyOjpPd25lcnNoaXBLaW5kIEsgPQorICAgICAgT3duZXJzaGlwQXR0cihBTC5nZXRMb2MoKSwgUy5Db250ZXh0LCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICBBTC5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKS5nZXRPd25LaW5kKCk7CiAKKyAgLy8gQ2hlY2sgYXJndW1lbnRzLgorICBzd2l0Y2ggKEspIHsKKyAgY2FzZSBPd25lcnNoaXBBdHRyOjpUYWtlczoKKyAgY2FzZSBPd25lcnNoaXBBdHRyOjpIb2xkczoKKyAgICBpZiAoQUwuZ2V0TnVtQXJncygpIDwgMikgeworICAgICAgUy5EaWFnKEFMLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3Rvb19mZXdfYXJndW1lbnRzKQorICAgICAgICA8PCBBTC5nZXROYW1lKCkgPDwgMjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgT3duZXJzaGlwQXR0cjo6UmV0dXJuczoKICAgICBpZiAoQUwuZ2V0TnVtQXJncygpID4gMikgewotICAgICAgUy5EaWFnKEFMLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3Rvb19tYW55X2FyZ3VtZW50cykgPDwgMTsKKyAgICAgIFMuRGlhZyhBTC5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV90b29fbWFueV9hcmd1bWVudHMpCisgICAgICAgIDw8IEFMLmdldE5hbWUoKSA8PCAxOwogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gZ2l2ZW4gaG93IHdlIGFyZSBjYWxsZWQuCi0gICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBvd25lcnNoaXAgYXR0cmlidXRlIik7CiAgIH0KIAotICBpZiAoIWlzRnVuY3Rpb24oRCkgfHwgIWhhc0Z1bmN0aW9uUHJvdG8oRCkpIHsKLSAgICBTLkRpYWcoQUwuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEFMLmdldE5hbWUoKSA8PCBFeHBlY3RlZEZ1bmN0aW9uOwotICAgIHJldHVybjsKLSAgfQotCi0gIFN0cmluZ1JlZiBNb2R1bGUgPSBBTC5nZXRBcmdBc0lkZW50KDApLT5JZGVudC0+Z2V0TmFtZSgpOworICBJZGVudGlmaWVySW5mbyAqTW9kdWxlID0gQUwuZ2V0QXJnQXNJZGVudCgwKS0+SWRlbnQ7CiAKICAgLy8gTm9ybWFsaXplIHRoZSBhcmd1bWVudCwgX19mb29fXyBiZWNvbWVzIGZvby4KLSAgaWYgKE1vZHVsZS5zdGFydHN3aXRoKCJfXyIpICYmIE1vZHVsZS5lbmRzd2l0aCgiX18iKSkKLSAgICBNb2R1bGUgPSBNb2R1bGUuc3Vic3RyKDIsIE1vZHVsZS5zaXplKCkgLSA0KTsKKyAgU3RyaW5nUmVmIE1vZHVsZU5hbWUgPSBNb2R1bGUtPmdldE5hbWUoKTsKKyAgaWYgKE1vZHVsZU5hbWUuc3RhcnRzd2l0aCgiX18iKSAmJiBNb2R1bGVOYW1lLmVuZHN3aXRoKCJfXyIpICYmCisgICAgICBNb2R1bGVOYW1lLnNpemUoKSA+IDQpIHsKKyAgICBNb2R1bGVOYW1lID0gTW9kdWxlTmFtZS5kcm9wX2Zyb250KDIpLmRyb3BfYmFjaygyKTsKKyAgICBNb2R1bGUgPSAmUy5QUC5nZXRJZGVudGlmaWVyVGFibGUoKS5nZXQoTW9kdWxlTmFtZSk7CisgIH0KIAogICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgOD4gT3duZXJzaGlwQXJnczsKICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IEFMLmdldE51bUFyZ3MoKTsgKytpKSB7CiAgICAgRXhwciAqRXggPSBBTC5nZXRBcmdBc0V4cHIoaSk7CiAgICAgdWludDY0X3QgSWR4OwotICAgIGlmICghY2hlY2tGdW5jdGlvbk9yTWV0aG9kQXJndW1lbnRJbmRleChTLCBELCBBTC5nZXROYW1lKCktPmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUwuZ2V0TG9jKCksIGksIEV4LCBJZHgpKQorICAgIGlmICghY2hlY2tGdW5jdGlvbk9yTWV0aG9kUGFyYW1ldGVySW5kZXgoUywgRCwgQUwsIGksIEV4LCBJZHgpKQogICAgICAgcmV0dXJuOwogCiAgICAgLy8gSXMgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IGEgcG9pbnRlciB0eXBlPwotICAgIFF1YWxUeXBlIFQgPSBnZXRGdW5jdGlvbk9yTWV0aG9kQXJnVHlwZShELCBJZHgpOworICAgIFF1YWxUeXBlIFQgPSBnZXRGdW5jdGlvbk9yTWV0aG9kUGFyYW1UeXBlKEQsIElkeCk7CiAgICAgaW50IEVyciA9IC0xOyAgLy8gTm8gZXJyb3IKICAgICBzd2l0Y2ggKEspIHsKICAgICAgIGNhc2UgT3duZXJzaGlwQXR0cjo6VGFrZXM6CkBAIC0xNTkwLDEzICsxMjU4LDEzIEBACiAgICAgfQogCiAgICAgLy8gQ2hlY2sgd2UgZG9uJ3QgaGF2ZSBhIGNvbmZsaWN0IHdpdGggYW5vdGhlciBvd25lcnNoaXAgYXR0cmlidXRlLgotICAgIGZvciAoc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxPd25lcnNoaXBBdHRyPgotICAgICAgICAgaSA9IEQtPnNwZWNpZmljX2F0dHJfYmVnaW48T3duZXJzaGlwQXR0cj4oKSwKLSAgICAgICAgIGUgPSBELT5zcGVjaWZpY19hdHRyX2VuZDxPd25lcnNoaXBBdHRyPigpOyBpICE9IGU7ICsraSkgewotICAgICAgaWYgKCgqaSktPmdldE93bktpbmQoKSAhPSBLICYmICgqaSktPmFyZ3NfZW5kKCkgIT0KLSAgICAgICAgICBzdGQ6OmZpbmQoKCppKS0+YXJnc19iZWdpbigpLCAoKmkpLT5hcmdzX2VuZCgpLCBJZHgpKSB7CisgICAgZm9yIChjb25zdCBhdXRvICpJIDogRC0+c3BlY2lmaWNfYXR0cnM8T3duZXJzaGlwQXR0cj4oKSkgeworICAgICAgLy8gRklYTUU6IEEgcmV0dXJucyBhdHRyaWJ1dGUgc2hvdWxkIGNvbmZsaWN0IHdpdGggYW55IHJldHVybnMgYXR0cmlidXRlCisgICAgICAvLyB3aXRoIGEgZGlmZmVyZW50IGluZGV4IHRvby4KKyAgICAgIGlmIChJLT5nZXRPd25LaW5kKCkgIT0gSyAmJiBJLT5hcmdzX2VuZCgpICE9CisgICAgICAgICAgc3RkOjpmaW5kKEktPmFyZ3NfYmVnaW4oKSwgSS0+YXJnc19lbmQoKSwgSWR4KSkgewogICAgICAgICBTLkRpYWcoQUwuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVzX2FyZV9ub3RfY29tcGF0aWJsZSkKLSAgICAgICAgICA8PCBBTC5nZXROYW1lKCkgPDwgb3duZXJzaGlwS2luZFRvRGlhZ05hbWUoKCppKS0+Z2V0T3duS2luZCgpKTsKKyAgICAgICAgICA8PCBBTC5nZXROYW1lKCkgPDwgSTsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgIH0KQEAgLTE2MDgsNyArMTI3Niw3IEBACiAgIGxsdm06OmFycmF5X3BvZF9zb3J0KHN0YXJ0LCBzdGFydCArIHNpemUpOwogCiAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBPd25lcnNoaXBBdHRyKEFMLmdldExvYygpLCBTLkNvbnRleHQsIEssIE1vZHVsZSwgc3RhcnQsIHNpemUsCisgICAgICAgICAgICAgT3duZXJzaGlwQXR0cihBTC5nZXRMb2MoKSwgUy5Db250ZXh0LCBNb2R1bGUsIHN0YXJ0LCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQUwuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCkBAIC0xNjIwLDEyICsxMjg4LDYgQEAKICAgICByZXR1cm47CiAgIH0KIAotICBpZiAoIWlzYTxWYXJEZWNsPihEKSAmJiAhaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZFZhcmlhYmxlT3JGdW5jdGlvbjsKLSAgICByZXR1cm47Ci0gIH0KLQogICBOYW1lZERlY2wgKm5kID0gY2FzdDxOYW1lZERlY2w+KEQpOwogCiAgIC8vIGdjYyByZWplY3RzCkBAIC0xNjQwLDggKzEzMDIsOCBAQAogICAvLyB3ZSByZWplY3QgdGhlbQogICBjb25zdCBEZWNsQ29udGV4dCAqQ3R4ID0gRC0+Z2V0RGVjbENvbnRleHQoKS0+Z2V0UmVkZWNsQ29udGV4dCgpOwogICBpZiAoIUN0eC0+aXNGaWxlQ29udGV4dCgpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd2Vha3JlZl9ub3RfZ2xvYmFsX2NvbnRleHQpIDw8Ci0gICAgICAgIG5kLT5nZXROYW1lQXNTdHJpbmcoKTsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93ZWFrcmVmX25vdF9nbG9iYWxfY29udGV4dCkKKyAgICAgIDw8IG5kOwogICAgIHJldHVybjsKICAgfQogCkBAIC0xNjk4LDc3ICsxMzYwLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVNaW5TaXplQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkgJiYgIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZEZ1bmN0aW9uT3JNZXRob2Q7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgIE1pblNpemVBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotfQotCiBzdGF0aWMgdm9pZCBoYW5kbGVDb2xkQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbjsKKyAgaWYgKGNoZWNrQXR0ck11dHVhbEV4Y2x1c2lvbjxIb3RBdHRyPihTLCBELCBBdHRyKSkKICAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoRC0+aGFzQXR0cjxIb3RBdHRyPigpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVzX2FyZV9ub3RfY29tcGF0aWJsZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJob3QiOwotICAgIHJldHVybjsKLSAgfQogCiAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkgQ29sZEF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZUhvdEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkRnVuY3Rpb247CisgIGlmIChjaGVja0F0dHJNdXR1YWxFeGNsdXNpb248Q29sZEF0dHI+KFMsIEQsIEF0dHIpKQogICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChELT5oYXNBdHRyPENvbGRBdHRyPigpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVzX2FyZV9ub3RfY29tcGF0aWJsZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8ICJjb2xkIjsKLSAgICByZXR1cm47Ci0gIH0KIAogICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpIEhvdEF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlTmFrZWRBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZEZ1bmN0aW9uOwotICAgIHJldHVybjsKLSAgfQotCi0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBOYWtlZEF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVBbHdheXNJbmxpbmVBdHRyKFNlbWEgJlMsIERlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZEZ1bmN0aW9uOwotICAgIHJldHVybjsKLSAgfQotCi0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBBbHdheXNJbmxpbmVBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGhhbmRsZVRMU01vZGVsQXR0cihTZW1hICZTLCBEZWNsICpELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKICAgU3RyaW5nUmVmIE1vZGVsOwpAQCAtMTc3NywxMiArMTM4NCw2IEBACiAgIGlmICghUy5jaGVja1N0cmluZ0xpdGVyYWxBcmd1bWVudEF0dHIoQXR0ciwgMCwgTW9kZWwsICZMaXRlcmFsTG9jKSkKICAgICByZXR1cm47CiAKLSAgaWYgKCFpc2E8VmFyRGVjbD4oRCkgfHwgIWNhc3Q8VmFyRGVjbD4oRCktPmdldFRMU0tpbmQoKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkVExTVmFyOwotICAgIHJldHVybjsKLSAgfQotCiAgIC8vIENoZWNrIHRoYXQgdGhlIHZhbHVlLgogICBpZiAoTW9kZWwgIT0gImdsb2JhbC1keW5hbWljIiAmJiBNb2RlbCAhPSAibG9jYWwtZHluYW1pYyIKICAgICAgICYmIE1vZGVsICE9ICJpbml0aWFsLWV4ZWMiICYmIE1vZGVsICE9ICJsb2NhbC1leGVjIikgewpAQCAtMTc5NSw5ICsxMzk2LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCitzdGF0aWMgdm9pZCBoYW5kbGVLZXJuZWxBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgaWYgKFMuTGFuZ09wdHMuUmVuZGVyc2NyaXB0KSB7CisgICAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KSAKKyAgICAgICAgICAgICAgIEtlcm5lbEF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOworICB9IGVsc2UgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCAia2VybmVsIjsKKyAgfQorfQorCiBzdGF0aWMgdm9pZCBoYW5kbGVNYWxsb2NBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEQpKSB7Ci0gICAgUXVhbFR5cGUgUmV0VHkgPSBGRC0+Z2V0UmVzdWx0VHlwZSgpOworICAgIFF1YWxUeXBlIFJldFR5ID0gRkQtPmdldFJldHVyblR5cGUoKTsKICAgICBpZiAoUmV0VHktPmlzQW55UG9pbnRlclR5cGUoKSB8fCBSZXRUeS0+aXNCbG9ja1BvaW50ZXJUeXBlKCkpIHsKICAgICAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKICAgICAgICAgICAgICAgICAgTWFsbG9jQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKQEAgLTE4MDksMzUgKzE0MjAsMTUgQEAKICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX21hbGxvY19wb2ludGVyX29ubHkpOwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVNYXlBbGlhc0F0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgTWF5QWxpYXNBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlTm9Db21tb25BdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKGlzYTxWYXJEZWNsPihEKSkKLSAgICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgICBOb0NvbW1vbkF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci0gIGVsc2UKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRWYXJpYWJsZTsKLX0KLQogc3RhdGljIHZvaWQgaGFuZGxlQ29tbW9uQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CiAgIGlmIChTLkxhbmdPcHRzLkNQbHVzUGx1cykgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfY29tbW9uX25vdF9zdXBwb3J0ZWRfY3BsdXNwbHVzKTsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9ub3Rfc3VwcG9ydGVkX2luX2xhbmcpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBBdHRyaWJ1dGVMYW5nU3VwcG9ydDo6Q3BwOwogICAgIHJldHVybjsKICAgfQogCi0gIGlmIChpc2E8VmFyRGVjbD4oRCkpCi0gICAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgICAgQ29tbW9uQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci0gIGVsc2UKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRWYXJpYWJsZTsKKyAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KSBDb21tb25BdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCiBzdGF0aWMgdm9pZCBoYW5kbGVOb1JldHVybkF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmYXR0cikgewpAQCAtMTg4NywyMyArMTQ3OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGhhbmRsZUNYWDExTm9SZXR1cm5BdHRyKFNlbWEgJlMsIERlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIC8vIEMrKzExIFtkY2wuYXR0ci5ub3JldHVybl1wMToKLSAgLy8gICBUaGUgYXR0cmlidXRlIG1heSBiZSBhcHBsaWVkIHRvIHRoZSBkZWNsYXJhdG9yLWlkIGluIGEgZnVuY3Rpb24KLSAgLy8gICBkZWNsYXJhdGlvbi4KLSAgRnVuY3Rpb25EZWNsICpGRCA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oRCk7Ci0gIGlmICghRkQpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZEZ1bmN0aW9uT3JNZXRob2Q7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgIENYWDExTm9SZXR1cm5BdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotfQotCiAvLyBQUzMgUFBVLXNwZWNpZmljLgogc3RhdGljIHZvaWQgaGFuZGxlVmVjUmV0dXJuQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CiAvKgpAQCAtMTkyOSwxNCArMTUwMyw4IEBACiAgICAgcmV0dXJuIHJlc3VsdDsgLy8gVGhpcyB3aWxsIGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIKICAgfQogKi8KLSAgaWYgKCFpc2E8UmVjb3JkRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZENsYXNzOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChELT5nZXRBdHRyPFZlY1JldHVybkF0dHI+KCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX3JlcGVhdF9hdHRyaWJ1dGUpIDw8ICJ2ZWNyZXR1cm4iOworICBpZiAoVmVjUmV0dXJuQXR0ciAqQSA9IEQtPmdldEF0dHI8VmVjUmV0dXJuQXR0cj4oKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfcmVwZWF0X2F0dHJpYnV0ZSkgPDwgQTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtMTk1Myw5ICsxNTIxLDggQEAKICAgICByZXR1cm47CiAgIH0KIAotICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIGl0ZXIgPSByZWNvcmQtPmZpZWxkX2JlZ2luKCk7Ci0gICAgICAgaXRlciAhPSByZWNvcmQtPmZpZWxkX2VuZCgpOyBpdGVyKyspIHsKLSAgICBpZiAoKGNvdW50ID09IDEpIHx8ICFpdGVyLT5nZXRUeXBlKCktPmlzVmVjdG9yVHlwZSgpKSB7CisgIGZvciAoY29uc3QgYXV0byAqSSA6IHJlY29yZC0+ZmllbGRzKCkpIHsKKyAgICBpZiAoKGNvdW50ID09IDEpIHx8ICFJLT5nZXRUeXBlKCktPmlzVmVjdG9yVHlwZSgpKSB7CiAgICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV92ZWNyZXR1cm5fb25seV92ZWN0b3JfbWVtYmVyKTsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xOTc3LDEwICsxNTQ0LDYgQEAKICAgICAgICAgICAgICBkaWFnOjplcnJfY2Fycmllc19kZXBlbmRlbmN5X3BhcmFtX25vdF9mdW5jdGlvbl9kZWNsKTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gIH0gZWxzZSBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbk1ldGhvZE9yUGFyYW1ldGVyOwotICAgIHJldHVybjsKICAgfQogCiAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkgQ2Fycmllc0RlcGVuZGVuY3lBdHRyKApAQCAtMTk4OCwzNiArMTU1MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlVW51c2VkQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNhPFZhckRlY2w+KEQpICYmICFpc2E8T2JqQ0l2YXJEZWNsPihEKSAmJiAhaXNGdW5jdGlvbk9yTWV0aG9kKEQpICYmCi0gICAgICAhaXNhPFR5cGVEZWNsPihEKSAmJiAhaXNhPExhYmVsRGVjbD4oRCkgJiYgIWlzYTxGaWVsZERlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkVmFyaWFibGVGdW5jdGlvbk9yTGFiZWw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgIFVudXNlZEF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlUmV0dXJuc1R3aWNlQXR0cihTZW1hICZTLCBEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgUmV0dXJuc1R3aWNlQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotfQotCiBzdGF0aWMgdm9pZCBoYW5kbGVVc2VkQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CiAgIGlmIChjb25zdCBWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KEQpKSB7CiAgICAgaWYgKFZELT5oYXNMb2NhbFN0b3JhZ2UoKSkgewotICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX2lnbm9yZWQpIDw8ICJ1c2VkIjsKKyAgICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCBBdHRyLmdldE5hbWUoKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgIH0gZWxzZSBpZiAoIWlzRnVuY3Rpb25Pck1ldGhvZChEKSkgewpAQCAtMjAzNCwyOSArMTU3MSwxNSBAQAogc3RhdGljIHZvaWQgaGFuZGxlQ29uc3RydWN0b3JBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKICAgLy8gY2hlY2sgdGhlIGF0dHJpYnV0ZSBhcmd1bWVudHMuCiAgIGlmIChBdHRyLmdldE51bUFyZ3MoKSA+IDEpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV90b29fbWFueV9hcmd1bWVudHMpIDw8IDE7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfdG9vX21hbnlfYXJndW1lbnRzKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMTsKICAgICByZXR1cm47CiAgIH0KIAotICBpbnQgcHJpb3JpdHkgPSA2NTUzNTsgLy8gRklYTUU6IERvIG5vdCBoYXJkY29kZSBzdWNoIGNvbnN0YW50cy4KLSAgaWYgKEF0dHIuZ2V0TnVtQXJncygpID4gMCkgewotICAgIEV4cHIgKkUgPSBBdHRyLmdldEFyZ0FzRXhwcigwKTsKLSAgICBsbHZtOjpBUFNJbnQgSWR4KDMyKTsKLSAgICBpZiAoRS0+aXNUeXBlRGVwZW5kZW50KCkgfHwgRS0+aXNWYWx1ZURlcGVuZGVudCgpIHx8Ci0gICAgICAgICFFLT5pc0ludGVnZXJDb25zdGFudEV4cHIoSWR4LCBTLkNvbnRleHQpKSB7Ci0gICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF9uX3R5cGUpCi0gICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDEgPDwgQUFOVF9Bcmd1bWVudEludGVnZXJDb25zdGFudAotICAgICAgICA8PCBFLT5nZXRTb3VyY2VSYW5nZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwcmlvcml0eSA9IElkeC5nZXRaRXh0VmFsdWUoKTsKLSAgfQotCi0gIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbjsKKyAgdWludDMyX3QgcHJpb3JpdHkgPSBDb25zdHJ1Y3RvckF0dHI6OkRlZmF1bHRQcmlvcml0eTsKKyAgaWYgKEF0dHIuZ2V0TnVtQXJncygpID4gMCAmJgorICAgICAgIWNoZWNrVUludDMyQXJndW1lbnQoUywgQXR0ciwgQXR0ci5nZXRBcmdBc0V4cHIoMCksIHByaW9yaXR5KSkKICAgICByZXR1cm47Ci0gIH0KIAogICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCiAgICAgICAgICAgICAgQ29uc3RydWN0b3JBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LCBwcmlvcml0eSwKQEAgLTIwNjYsMjkgKzE1ODksMTUgQEAKIHN0YXRpYyB2b2lkIGhhbmRsZURlc3RydWN0b3JBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKICAgLy8gY2hlY2sgdGhlIGF0dHJpYnV0ZSBhcmd1bWVudHMuCiAgIGlmIChBdHRyLmdldE51bUFyZ3MoKSA+IDEpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV90b29fbWFueV9hcmd1bWVudHMpIDw8IDE7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfdG9vX21hbnlfYXJndW1lbnRzKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMTsKICAgICByZXR1cm47CiAgIH0KIAotICBpbnQgcHJpb3JpdHkgPSA2NTUzNTsgLy8gRklYTUU6IERvIG5vdCBoYXJkY29kZSBzdWNoIGNvbnN0YW50cy4KLSAgaWYgKEF0dHIuZ2V0TnVtQXJncygpID4gMCkgewotICAgIEV4cHIgKkUgPSBBdHRyLmdldEFyZ0FzRXhwcigwKTsKLSAgICBsbHZtOjpBUFNJbnQgSWR4KDMyKTsKLSAgICBpZiAoRS0+aXNUeXBlRGVwZW5kZW50KCkgfHwgRS0+aXNWYWx1ZURlcGVuZGVudCgpIHx8Ci0gICAgICAgICFFLT5pc0ludGVnZXJDb25zdGFudEV4cHIoSWR4LCBTLkNvbnRleHQpKSB7Ci0gICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF9uX3R5cGUpCi0gICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDEgPDwgQUFOVF9Bcmd1bWVudEludGVnZXJDb25zdGFudAotICAgICAgICA8PCBFLT5nZXRTb3VyY2VSYW5nZSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwcmlvcml0eSA9IElkeC5nZXRaRXh0VmFsdWUoKTsKLSAgfQotCi0gIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbjsKKyAgdWludDMyX3QgcHJpb3JpdHkgPSBEZXN0cnVjdG9yQXR0cjo6RGVmYXVsdFByaW9yaXR5OworICBpZiAoQXR0ci5nZXROdW1BcmdzKCkgPiAwICYmCisgICAgICAhY2hlY2tVSW50MzJBcmd1bWVudChTLCBBdHRyLCBBdHRyLmdldEFyZ0FzRXhwcigwKSwgcHJpb3JpdHkpKQogICAgIHJldHVybjsKLSAgfQogCiAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKICAgICAgICAgICAgICBEZXN0cnVjdG9yQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwgcHJpb3JpdHksCkBAIC0yMTAwLDcgKzE2MDksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKICAgdW5zaWduZWQgTnVtQXJncyA9IEF0dHIuZ2V0TnVtQXJncygpOwogICBpZiAoTnVtQXJncyA+IDEpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV90b29fbWFueV9hcmd1bWVudHMpIDw8IDE7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfdG9vX21hbnlfYXJndW1lbnRzKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtMjExMywzOCArMTYyMywxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlQXJjV2Vha3JlZlVuYXZhaWxhYmxlQXR0cihTZW1hICZTLCBEZWNsICpELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworc3RhdGljIHZvaWQgaGFuZGxlT2JqQ1N1cHByZXNQcm90b2NvbEF0dHIoU2VtYSAmUywgRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgaWYgKCFjYXN0PE9iakNQcm90b2NvbERlY2w+KEQpLT5pc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX29iamNfYXR0cl9wcm90b2NvbF9yZXF1aXJlc19kZWZpbml0aW9uKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgQXR0ci5nZXRSYW5nZSgpOworICAgIHJldHVybjsKKyAgfQorCiAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBBcmNXZWFrcmVmVW5hdmFpbGFibGVBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAorICAgICAgICAgIE9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlT2JqQ1Jvb3RDbGFzc0F0dHIoU2VtYSAmUywgRGVjbCAqRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNhPE9iakNJbnRlcmZhY2VEZWNsPihEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkT2JqZWN0aXZlQ0ludGVyZmFjZTsKLSAgICByZXR1cm47Ci0gIH0KLSAgCi0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBPYmpDUm9vdENsYXNzQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzQXR0cihTZW1hICZTLCBEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNhPE9iakNJbnRlcmZhY2VEZWNsPihEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfc3VwcHJlc3NfYXV0b3N5bnRoZXNpcyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIAotICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotfQotCiBzdGF0aWMgYm9vbCBjaGVja0F2YWlsYWJpbGl0eUF0dHIoU2VtYSAmUywgU291cmNlUmFuZ2UgUmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWRlbnRpZmllckluZm8gKlBsYXRmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25UdXBsZSBJbnRyb2R1Y2VkLApAQCAtMjQ1MCwxMyArMTk0MSw3IEBACiAKIHN0YXRpYyB2b2lkIGhhbmRsZU9iakNNZXRob2RGYW1pbHlBdHRyKFNlbWEgJlMsIERlY2wgKmRlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIE9iakNNZXRob2REZWNsICptZXRob2QgPSBkeW5fY2FzdDxPYmpDTWV0aG9kRGVjbD4oZGVjbCk7Ci0gIGlmICghbWV0aG9kKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgRXhwZWN0ZWRNZXRob2Q7Ci0gICAgcmV0dXJuOwotICB9Ci0KKyAgT2JqQ01ldGhvZERlY2wgKm1ldGhvZCA9IGNhc3Q8T2JqQ01ldGhvZERlY2w+KGRlY2wpOwogICBpZiAoIUF0dHIuaXNBcmdJZGVudCgwKSkgewogICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX2FyZ3VtZW50X25fdHlwZSkKICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDEgPDwgQUFOVF9Bcmd1bWVudElkZW50aWZpZXI7CkBAIC0yNDcxLDMwICsxOTU2LDE3IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgaWYgKEYgPT0gT2JqQ01ldGhvZEZhbWlseUF0dHI6Ok9NRl9pbml0ICYmIAotICAgICAgIW1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpLT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpKSB7CisgIGlmIChGID09IE9iakNNZXRob2RGYW1pbHlBdHRyOjpPTUZfaW5pdCAmJgorICAgICAgIW1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpLT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpKSB7CiAgICAgUy5EaWFnKG1ldGhvZC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2luaXRfbWV0aG9kX2JhZF9yZXR1cm5fdHlwZSkKLSAgICAgIDw8IG1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpOworICAgICAgICA8PCBtZXRob2QtPmdldFJldHVyblR5cGUoKTsKICAgICAvLyBJZ25vcmUgdGhlIGF0dHJpYnV0ZS4KICAgICByZXR1cm47CiAgIH0KIAogICBtZXRob2QtPmFkZEF0dHIobmV3IChTLkNvbnRleHQpIE9iakNNZXRob2RGYW1pbHlBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLkNvbnRleHQsIEYpKTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlT2JqQ0V4Y2VwdGlvbkF0dHIoU2VtYSAmUywgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgT2JqQ0ludGVyZmFjZURlY2wgKk9DSSA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPihEKTsKLSAgaWYgKE9DSSA9PSAwKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRPYmplY3RpdmVDSW50ZXJmYWNlOwotICAgIHJldHVybjsKLSAgfQotCi0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBPYmpDRXhjZXB0aW9uQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLkNvbnRleHQsIEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZU9iakNOU09iamVjdChTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CkBAIC0yNTI2LDE4ICsxOTk4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCi1zdGF0aWMgdm9pZAotaGFuZGxlT3ZlcmxvYWRhYmxlQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9vdmVybG9hZGFibGVfbm90X2Z1bmN0aW9uKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgT3ZlcmxvYWRhYmxlQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotfQotCiBzdGF0aWMgdm9pZCBoYW5kbGVCbG9ja3NBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKICAgaWYgKCFBdHRyLmlzQXJnSWRlbnQoMCkpIHsKICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF9uX3R5cGUpCkBAIC0yNTYxLDExICsyMDIxLDEyIEBACiBzdGF0aWMgdm9pZCBoYW5kbGVTZW50aW5lbEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewogICAvLyBjaGVjayB0aGUgYXR0cmlidXRlIGFyZ3VtZW50cy4KICAgaWYgKEF0dHIuZ2V0TnVtQXJncygpID4gMikgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3Rvb19tYW55X2FyZ3VtZW50cykgPDwgMjsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV90b29fbWFueV9hcmd1bWVudHMpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAyOwogICAgIHJldHVybjsKICAgfQogCi0gIHVuc2lnbmVkIHNlbnRpbmVsID0gMDsKKyAgdW5zaWduZWQgc2VudGluZWwgPSAodW5zaWduZWQpU2VudGluZWxBdHRyOjpEZWZhdWx0U2VudGluZWw7CiAgIGlmIChBdHRyLmdldE51bUFyZ3MoKSA+IDApIHsKICAgICBFeHByICpFID0gQXR0ci5nZXRBcmdBc0V4cHIoMCk7CiAgICAgbGx2bTo6QVBTSW50IElkeCgzMik7CkBAIC0yNTg2LDcgKzIwNDcsNyBAQAogICAgIHNlbnRpbmVsID0gSWR4LmdldFpFeHRWYWx1ZSgpOwogICB9CiAKLSAgdW5zaWduZWQgbnVsbFBvcyA9IDA7CisgIHVuc2lnbmVkIG51bGxQb3MgPSAodW5zaWduZWQpU2VudGluZWxBdHRyOjpEZWZhdWx0TnVsbFBvczsKICAgaWYgKEF0dHIuZ2V0TnVtQXJncygpID4gMSkgewogICAgIEV4cHIgKkUgPSBBdHRyLmdldEFyZ0FzRXhwcigxKTsKICAgICBsbHZtOjpBUFNJbnQgSWR4KDMyKTsKQEAgLTI2MzIsNyArMjA5Myw4IEBACiAgIH0gZWxzZSBpZiAoY29uc3QgVmFyRGVjbCAqViA9IGR5bl9jYXN0PFZhckRlY2w+KEQpKSB7CiAgICAgUXVhbFR5cGUgVHkgPSBWLT5nZXRUeXBlKCk7CiAgICAgaWYgKFR5LT5pc0Jsb2NrUG9pbnRlclR5cGUoKSB8fCBUeS0+aXNGdW5jdGlvblBvaW50ZXJUeXBlKCkpIHsKLSAgICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQgPSBUeS0+aXNGdW5jdGlvblBvaW50ZXJUeXBlKCkgPyBnZXRGdW5jdGlvblR5cGUoRCkKKyAgICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQgPSBUeS0+aXNGdW5jdGlvblBvaW50ZXJUeXBlKCkKKyAgICAgICA/IEQtPmdldEZ1bmN0aW9uVHlwZSgpCiAgICAgICAgOiBUeS0+Z2V0QXM8QmxvY2tQb2ludGVyVHlwZT4oKS0+Z2V0UG9pbnRlZVR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpOwogICAgICAgaWYgKCFjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGVCktPmlzVmFyaWFkaWMoKSkgewogICAgICAgICBpbnQgbSA9IFR5LT5pc0Z1bmN0aW9uUG9pbnRlclR5cGUoKSA/IDAgOiAxOwpAQCAtMjY1NCwyNyArMjExNiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlV2FyblVudXNlZEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoUmVjb3JkRGVjbCAqUkQgPSBkeW5fY2FzdDxSZWNvcmREZWNsPihEKSkKLSAgICBSRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KSBXYXJuVW51c2VkQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCkpOwotICBlbHNlCi0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX2lnbm9yZWQpIDw8IEF0dHIuZ2V0TmFtZSgpOwotfQotCiBzdGF0aWMgdm9pZCBoYW5kbGVXYXJuVW51c2VkUmVzdWx0KFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKCFpc0Z1bmN0aW9uKEQpICYmICFpc2E8T2JqQ01ldGhvZERlY2w+KEQpICYmICFpc2E8Q1hYUmVjb3JkRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbk1ldGhvZE9yQ2xhc3M7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGlzRnVuY3Rpb24oRCkgJiYgZ2V0RnVuY3Rpb25UeXBlKEQpLT5nZXRSZXN1bHRUeXBlKCktPmlzVm9pZFR5cGUoKSkgeworICBpZiAoRC0+Z2V0RnVuY3Rpb25UeXBlKCkgJiYKKyAgICAgIEQtPmdldEZ1bmN0aW9uVHlwZSgpLT5nZXRSZXR1cm5UeXBlKCktPmlzVm9pZFR5cGUoKSkgewogICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV92b2lkX2Z1bmN0aW9uX21ldGhvZCkKICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDA7CiAgICAgcmV0dXJuOwogICB9CiAgIGlmIChjb25zdCBPYmpDTWV0aG9kRGVjbCAqTUQgPSBkeW5fY2FzdDxPYmpDTWV0aG9kRGVjbD4oRCkpCi0gICAgaWYgKE1ELT5nZXRSZXN1bHRUeXBlKCktPmlzVm9pZFR5cGUoKSkgeworICAgIGlmIChNRC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWRUeXBlKCkpIHsKICAgICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV92b2lkX2Z1bmN0aW9uX21ldGhvZCkKICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDE7CiAgICAgICByZXR1cm47CkBAIC0yNjg1LDI0ICsyMTM1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlV2Vha0F0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoIWlzYTxWYXJEZWNsPihEKSAmJiAhaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICBpZiAoaXNhPENYWFJlY29yZERlY2w+KEQpKSB7Ci0gICAgICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpIFdlYWtBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0KSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZFZhcmlhYmxlT3JGdW5jdGlvbjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBOYW1lZERlY2wgKm5kID0gY2FzdDxOYW1lZERlY2w+KEQpOwotCi0gIG5kLT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgIFdlYWtBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLX0KLQogc3RhdGljIHZvaWQgaGFuZGxlV2Vha0ltcG9ydEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewogICAvLyB3ZWFrX2ltcG9ydCBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGUgJiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCiAgIGJvb2wgaXNEZWYgPSBmYWxzZTsKQEAgLTI3MjcsNTkgKzIxNTksMjYgQEAKIH0KIAogLy8gSGFuZGxlcyByZXFkX3dvcmtfZ3JvdXBfc2l6ZSBhbmQgd29ya19ncm91cF9zaXplX2hpbnQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgV29ya0dyb3VwQXR0cj4KIHN0YXRpYyB2b2lkIGhhbmRsZVdvcmtHcm91cFNpemUoU2VtYSAmUywgRGVjbCAqRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICB1bnNpZ25lZCBXR1NpemVbM107Ci0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBFeHByICpFID0gQXR0ci5nZXRBcmdBc0V4cHIoaSk7Ci0gICAgbGx2bTo6QVBTSW50IEFyZ051bSgzMik7Ci0gICAgaWYgKEUtPmlzVHlwZURlcGVuZGVudCgpIHx8IEUtPmlzVmFsdWVEZXBlbmRlbnQoKSB8fAotICAgICAgICAhRS0+aXNJbnRlZ2VyQ29uc3RhbnRFeHByKEFyZ051bSwgUy5Db250ZXh0KSkgewotICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfdHlwZSkKLSAgICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgQUFOVF9Bcmd1bWVudEludGVnZXJDb25zdGFudAotICAgICAgICA8PCBFLT5nZXRTb3VyY2VSYW5nZSgpOworICB1aW50MzJfdCBXR1NpemVbM107CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAzOyArK2kpCisgICAgaWYgKCFjaGVja1VJbnQzMkFyZ3VtZW50KFMsIEF0dHIsIEF0dHIuZ2V0QXJnQXNFeHByKGkpLCBXR1NpemVbaV0sIGkpKQogICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBXR1NpemVbaV0gPSAodW5zaWduZWQpIEFyZ051bS5nZXRaRXh0VmFsdWUoKTsKLSAgfQogCi0gIGlmIChBdHRyLmdldEtpbmQoKSA9PSBBdHRyaWJ1dGVMaXN0OjpBVF9SZXFkV29ya0dyb3VwU2l6ZQotICAgICYmIEQtPmhhc0F0dHI8UmVxZFdvcmtHcm91cFNpemVBdHRyPigpKSB7Ci0gICAgICBSZXFkV29ya0dyb3VwU2l6ZUF0dHIgKkEgPSBELT5nZXRBdHRyPFJlcWRXb3JrR3JvdXBTaXplQXR0cj4oKTsKLSAgICAgIGlmICghKEEtPmdldFhEaW0oKSA9PSBXR1NpemVbMF0gJiYKLSAgICAgICAgICAgIEEtPmdldFlEaW0oKSA9PSBXR1NpemVbMV0gJiYKLSAgICAgICAgICAgIEEtPmdldFpEaW0oKSA9PSBXR1NpemVbMl0pKSB7Ci0gICAgICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2R1cGxpY2F0ZV9hdHRyaWJ1dGUpIDw8Ci0gICAgICAgICAgQXR0ci5nZXROYW1lKCk7Ci0gICAgICB9Ci0gIH0KKyAgV29ya0dyb3VwQXR0ciAqRXhpc3RpbmcgPSBELT5nZXRBdHRyPFdvcmtHcm91cEF0dHI+KCk7CisgIGlmIChFeGlzdGluZyAmJiAhKEV4aXN0aW5nLT5nZXRYRGltKCkgPT0gV0dTaXplWzBdICYmCisgICAgICAgICAgICAgICAgICAgIEV4aXN0aW5nLT5nZXRZRGltKCkgPT0gV0dTaXplWzFdICYmCisgICAgICAgICAgICAgICAgICAgIEV4aXN0aW5nLT5nZXRaRGltKCkgPT0gV0dTaXplWzJdKSkKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9kdXBsaWNhdGVfYXR0cmlidXRlKSA8PCBBdHRyLmdldE5hbWUoKTsKIAotICBpZiAoQXR0ci5nZXRLaW5kKCkgPT0gQXR0cmlidXRlTGlzdDo6QVRfV29ya0dyb3VwU2l6ZUhpbnQKLSAgICAmJiBELT5oYXNBdHRyPFdvcmtHcm91cFNpemVIaW50QXR0cj4oKSkgewotICAgICAgV29ya0dyb3VwU2l6ZUhpbnRBdHRyICpBID0gRC0+Z2V0QXR0cjxXb3JrR3JvdXBTaXplSGludEF0dHI+KCk7Ci0gICAgICBpZiAoIShBLT5nZXRYRGltKCkgPT0gV0dTaXplWzBdICYmCi0gICAgICAgICAgICBBLT5nZXRZRGltKCkgPT0gV0dTaXplWzFdICYmCi0gICAgICAgICAgICBBLT5nZXRaRGltKCkgPT0gV0dTaXplWzJdKSkgewotICAgICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9kdXBsaWNhdGVfYXR0cmlidXRlKSA8PAotICAgICAgICAgIEF0dHIuZ2V0TmFtZSgpOwotICAgICAgfQotICB9Ci0KLSAgaWYgKEF0dHIuZ2V0S2luZCgpID09IEF0dHJpYnV0ZUxpc3Q6OkFUX1JlcWRXb3JrR3JvdXBTaXplKQotICAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICAgICAgUmVxZFdvcmtHcm91cFNpemVBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0dTaXplWzBdLCBXR1NpemVbMV0sIFdHU2l6ZVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotICBlbHNlCi0gICAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgICAgICBXb3JrR3JvdXBTaXplSGludEF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXR1NpemVbMF0sIFdHU2l6ZVsxXSwgV0dTaXplWzJdLAorICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpIFdvcmtHcm91cEF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXR1NpemVbMF0sIFdHU2l6ZVsxXSwgV0dTaXplWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZVZlY1R5cGVIaW50KFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgYXNzZXJ0KEF0dHIuZ2V0S2luZCgpID09IEF0dHJpYnV0ZUxpc3Q6OkFUX1ZlY1R5cGVIaW50KTsKLQogICBpZiAoIUF0dHIuaGFzUGFyc2VkVHlwZSgpKSB7CiAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfbnVtYmVyX2FyZ3VtZW50cykKICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDE7CkBAIC0yNzk4LDkgKzIxOTcsNyBAQAogICAgIHJldHVybjsKICAgfQogCi0gIGlmIChBdHRyLmdldEtpbmQoKSA9PSBBdHRyaWJ1dGVMaXN0OjpBVF9WZWNUeXBlSGludCAmJgotICAgICAgRC0+aGFzQXR0cjxWZWNUeXBlSGludEF0dHI+KCkpIHsKLSAgICBWZWNUeXBlSGludEF0dHIgKkEgPSBELT5nZXRBdHRyPFZlY1R5cGVIaW50QXR0cj4oKTsKKyAgaWYgKFZlY1R5cGVIaW50QXR0ciAqQSA9IEQtPmdldEF0dHI8VmVjVHlwZUhpbnRBdHRyPigpKSB7CiAgICAgaWYgKCFTLkNvbnRleHQuaGFzU2FtZVR5cGUoQS0+Z2V0VHlwZUhpbnQoKSwgUGFybVR5cGUpKSB7CiAgICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9kdXBsaWNhdGVfYXR0cmlidXRlKSA8PCBBdHRyLmdldE5hbWUoKTsKICAgICAgIHJldHVybjsKQEAgLTI4MDgsNyArMjIwNSw4IEBACiAgIH0KIAogICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpIFZlY1R5cGVIaW50QXR0cihBdHRyLmdldExvYygpLCBTLkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcm1UU0kpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFybVRTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKIH0KIAogU2VjdGlvbkF0dHIgKlNlbWE6Om1lcmdlU2VjdGlvbkF0dHIoRGVjbCAqRCwgU291cmNlUmFuZ2UgUmFuZ2UsCkBAIC0yODQxLDEyICsyMjM5LDYgQEAKICAgICByZXR1cm47CiAgIH0KIAotICAvLyBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgYXBwbGllZCB0byBsb2NhbCB2YXJpYWJsZXMuCi0gIGlmIChpc2E8VmFyRGVjbD4oRCkgJiYgY2FzdDxWYXJEZWNsPihEKS0+aGFzTG9jYWxTdG9yYWdlKCkpIHsKLSAgICBTLkRpYWcoTGl0ZXJhbExvYywgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9zZWN0aW9uX2xvY2FsX3ZhcmlhYmxlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgCiAgIHVuc2lnbmVkIEluZGV4ID0gQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpOwogICBTZWN0aW9uQXR0ciAqTmV3QXR0ciA9IFMubWVyZ2VTZWN0aW9uQXR0cihELCBBdHRyLmdldFJhbmdlKCksIFN0ciwgSW5kZXgpOwogICBpZiAoTmV3QXR0cikKQEAgLTI4NTQsMzcgKzIyNDYsOSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGhhbmRsZU5vdGhyb3dBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKE5vVGhyb3dBdHRyICpFeGlzdGluZyA9IEQtPmdldEF0dHI8Tm9UaHJvd0F0dHI+KCkpIHsKLSAgICBpZiAoRXhpc3RpbmctPmdldExvY2F0aW9uKCkuaXNJbnZhbGlkKCkpCi0gICAgICBFeGlzdGluZy0+c2V0UmFuZ2UoQXR0ci5nZXRSYW5nZSgpKTsKLSAgfSBlbHNlIHsKLSAgICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgICBOb1Rocm93QXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZUNvbnN0QXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmIChDb25zdEF0dHIgKkV4aXN0aW5nID0gRC0+Z2V0QXR0cjxDb25zdEF0dHI+KCkpIHsKLSAgIGlmIChFeGlzdGluZy0+Z2V0TG9jYXRpb24oKS5pc0ludmFsaWQoKSkKLSAgICAgRXhpc3RpbmctPnNldFJhbmdlKEF0dHIuZ2V0UmFuZ2UoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgICAgQ29uc3RBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSApKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVQdXJlQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBQdXJlQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLX0KLQogc3RhdGljIHZvaWQgaGFuZGxlQ2xlYW51cEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KEQpOwotICBpZiAoIVZEIHx8ICFWRC0+aGFzTG9jYWxTdG9yYWdlKCkpIHsKKyAgVmFyRGVjbCAqVkQgPSBjYXN0PFZhckRlY2w+KEQpOworICBpZiAoIVZELT5oYXNMb2NhbFN0b3JhZ2UoKSkgewogICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCBBdHRyLmdldE5hbWUoKTsKICAgICByZXR1cm47CiAgIH0KQEAgLTI5NDgsMjAgKzIzMTIsMTMgQEAKIC8vLyBIYW5kbGUgX19hdHRyaWJ1dGVfXygoZm9ybWF0X2FyZygoaWR4KSkpKSBhdHRyaWJ1dGUgYmFzZWQgb24KIC8vLyBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvRnVuY3Rpb24tQXR0cmlidXRlcy5odG1sCiBzdGF0aWMgdm9pZCBoYW5kbGVGb3JtYXRBcmdBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKCFpc0Z1bmN0aW9uT3JNZXRob2QoRCkgfHwgIWhhc0Z1bmN0aW9uUHJvdG8oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbjsKLSAgICByZXR1cm47Ci0gIH0KLQogICBFeHByICpJZHhFeHByID0gQXR0ci5nZXRBcmdBc0V4cHIoMCk7Ci0gIHVpbnQ2NF90IEFyZ0lkeDsKLSAgaWYgKCFjaGVja0Z1bmN0aW9uT3JNZXRob2RBcmd1bWVudEluZGV4KFMsIEQsIEF0dHIuZ2V0TmFtZSgpLT5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldExvYygpLCAxLCBJZHhFeHByLCBBcmdJZHgpKQorICB1aW50NjRfdCBJZHg7CisgIGlmICghY2hlY2tGdW5jdGlvbk9yTWV0aG9kUGFyYW1ldGVySW5kZXgoUywgRCwgQXR0ciwgMSwgSWR4RXhwciwgSWR4KSkKICAgICByZXR1cm47CiAKICAgLy8gbWFrZSBzdXJlIHRoZSBmb3JtYXQgc3RyaW5nIGlzIHJlYWxseSBhIHN0cmluZwotICBRdWFsVHlwZSBUeSA9IGdldEZ1bmN0aW9uT3JNZXRob2RBcmdUeXBlKEQsIEFyZ0lkeCk7CisgIFF1YWxUeXBlIFR5ID0gZ2V0RnVuY3Rpb25Pck1ldGhvZFBhcmFtVHlwZShELCBJZHgpOwogCiAgIGJvb2wgbm90X25zc3RyaW5nX3R5cGUgPSAhaXNOU1N0cmluZ1R5cGUoVHksIFMuQ29udGV4dCk7CiAgIGlmIChub3RfbnNzdHJpbmdfdHlwZSAmJgpAQCAtMjk4Niw3ICsyMzQzLDcgQEAKICAgICByZXR1cm47CiAgIH0KIAotICAvLyBXZSBjYW5ub3QgdXNlIHRoZSBBcmdJZHggcmV0dXJuZWQgZnJvbSBjaGVja0Z1bmN0aW9uT3JNZXRob2RBcmd1bWVudEluZGV4CisgIC8vIFdlIGNhbm5vdCB1c2UgdGhlIElkeCByZXR1cm5lZCBmcm9tIGNoZWNrRnVuY3Rpb25Pck1ldGhvZFBhcmFtZXRlckluZGV4CiAgIC8vIGJlY2F1c2UgdGhhdCBoYXMgY29ycmVjdGVkIGZvciB0aGUgaW1wbGljaXQgdGhpcyBwYXJhbWV0ZXIsIGFuZCBpcyB6ZXJvLQogICAvLyBiYXNlZC4gIFRoZSBhdHRyaWJ1dGUgZXhwZWN0cyB3aGF0IHRoZSB1c2VyIHdyb3RlIGV4cGxpY2l0bHkuCiAgIGxsdm06OkFQU0ludCBWYWw7CkBAIC0zMDMzLDEyICsyMzkwLDEyIEBACiAgICAgcmV0dXJuOwogICB9CiAgIAotICBpZiAoIWlzYTxWYXJEZWNsPihEKSB8fCBTLmdldEN1ckZ1bmN0aW9uT3JNZXRob2REZWNsKCkpIHsKKyAgaWYgKFMuZ2V0Q3VyRnVuY3Rpb25Pck1ldGhvZERlY2woKSkgewogICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfaW5pdF9wcmlvcml0eV9vYmplY3RfYXR0cik7CiAgICAgQXR0ci5zZXRJbnZhbGlkKCk7CiAgICAgcmV0dXJuOwogICB9Ci0gIFF1YWxUeXBlIFQgPSBkeW5fY2FzdDxWYXJEZWNsPihEKS0+Z2V0VHlwZSgpOworICBRdWFsVHlwZSBUID0gY2FzdDxWYXJEZWNsPihEKS0+Z2V0VHlwZSgpOwogICBpZiAoUy5Db250ZXh0LmdldEFzQXJyYXlUeXBlKFQpKQogICAgIFQgPSBTLkNvbnRleHQuZ2V0QmFzZUVsZW1lbnRUeXBlKFQpOwogICBpZiAoIVQtPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKQEAgLTMwNDYsMjIgKzI0MDMsMTcgQEAKICAgICBBdHRyLnNldEludmFsaWQoKTsKICAgICByZXR1cm47CiAgIH0KLSAgCi0gIEV4cHIgKnByaW9yaXR5RXhwciA9IEF0dHIuZ2V0QXJnQXNFeHByKDApOwotICAKLSAgbGx2bTo6QVBTSW50IHByaW9yaXR5KDMyKTsKLSAgaWYgKHByaW9yaXR5RXhwci0+aXNUeXBlRGVwZW5kZW50KCkgfHwgcHJpb3JpdHlFeHByLT5pc1ZhbHVlRGVwZW5kZW50KCkgfHwKLSAgICAgICFwcmlvcml0eUV4cHItPmlzSW50ZWdlckNvbnN0YW50RXhwcihwcmlvcml0eSwgUy5Db250ZXh0KSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX2FyZ3VtZW50X3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBBQU5UX0FyZ3VtZW50SW50ZWdlckNvbnN0YW50Ci0gICAgICA8PCBwcmlvcml0eUV4cHItPmdldFNvdXJjZVJhbmdlKCk7CisKKyAgRXhwciAqRSA9IEF0dHIuZ2V0QXJnQXNFeHByKDApOworICB1aW50MzJfdCBwcmlvcml0eW51bTsKKyAgaWYgKCFjaGVja1VJbnQzMkFyZ3VtZW50KFMsIEF0dHIsIEUsIHByaW9yaXR5bnVtKSkgewogICAgIEF0dHIuc2V0SW52YWxpZCgpOwogICAgIHJldHVybjsKICAgfQotICB1bnNpZ25lZCBwcmlvcml0eW51bSA9IHByaW9yaXR5LmdldFpFeHRWYWx1ZSgpOworCiAgIGlmIChwcmlvcml0eW51bSA8IDEwMSB8fCBwcmlvcml0eW51bSA+IDY1NTM1KSB7CiAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfb3V0b2ZfcmFuZ2UpCi0gICAgPDwgIHByaW9yaXR5RXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgIDw8IEUtPmdldFNvdXJjZVJhbmdlKCk7CiAgICAgQXR0ci5zZXRJbnZhbGlkKCk7CiAgICAgcmV0dXJuOwogICB9CkBAIC0zMDc1LDE4ICsyNDI3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEZpcnN0QXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJTcGVsbGluZ0xpc3RJbmRleCkgewogICAvLyBDaGVjayB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSBhbiBlcXVpdmFsZW50IGZvcm1hdCBhdHRyaWJ1dGUuCi0gIGZvciAoc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxGb3JtYXRBdHRyPgotICAgICAgICAgaSA9IEQtPnNwZWNpZmljX2F0dHJfYmVnaW48Rm9ybWF0QXR0cj4oKSwKLSAgICAgICAgIGUgPSBELT5zcGVjaWZpY19hdHRyX2VuZDxGb3JtYXRBdHRyPigpOwotICAgICAgIGkgIT0gZSA7ICsraSkgewotICAgIEZvcm1hdEF0dHIgKmYgPSAqaTsKLSAgICBpZiAoZi0+Z2V0VHlwZSgpID09IEZvcm1hdCAmJgotICAgICAgICBmLT5nZXRGb3JtYXRJZHgoKSA9PSBGb3JtYXRJZHggJiYKLSAgICAgICAgZi0+Z2V0Rmlyc3RBcmcoKSA9PSBGaXJzdEFyZykgeworICBmb3IgKGF1dG8gKkYgOiBELT5zcGVjaWZpY19hdHRyczxGb3JtYXRBdHRyPigpKSB7CisgICAgaWYgKEYtPmdldFR5cGUoKSA9PSBGb3JtYXQgJiYKKyAgICAgICAgRi0+Z2V0Rm9ybWF0SWR4KCkgPT0gRm9ybWF0SWR4ICYmCisgICAgICAgIEYtPmdldEZpcnN0QXJnKCkgPT0gRmlyc3RBcmcpIHsKICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBsb2NhdGlvbiBmb3IgdGhpcyBhdHRyaWJ1dGUsIGFkb3B0IHRoZQogICAgICAgLy8gbG9jYXRpb24uCi0gICAgICBpZiAoZi0+Z2V0TG9jYXRpb24oKS5pc0ludmFsaWQoKSkKLSAgICAgICAgZi0+c2V0UmFuZ2UoUmFuZ2UpOworICAgICAgaWYgKEYtPmdldExvY2F0aW9uKCkuaXNJbnZhbGlkKCkpCisgICAgICAgIEYtPnNldFJhbmdlKFJhbmdlKTsKICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgfQpAQCAtMzEwNCwxNyArMjQ1MiwxMCBAQAogICAgIHJldHVybjsKICAgfQogCi0gIGlmICghaXNGdW5jdGlvbk9yTWV0aG9kT3JCbG9jayhEKSB8fCAhaGFzRnVuY3Rpb25Qcm90byhEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZEZ1bmN0aW9uOwotICAgIHJldHVybjsKLSAgfQotCiAgIC8vIEluIEMrKyB0aGUgaW1wbGljaXQgJ3RoaXMnIGZ1bmN0aW9uIHBhcmFtZXRlciBhbHNvIGNvdW50cywgYW5kIHRoZXkgYXJlCiAgIC8vIGNvdW50ZWQgZnJvbSBvbmUuCiAgIGJvb2wgSGFzSW1wbGljaXRUaGlzUGFyYW0gPSBpc0luc3RhbmNlTWV0aG9kKEQpOwotICB1bnNpZ25lZCBOdW1BcmdzICA9IGdldEZ1bmN0aW9uT3JNZXRob2ROdW1BcmdzKEQpICsgSGFzSW1wbGljaXRUaGlzUGFyYW07Ci0gIHVuc2lnbmVkIEZpcnN0SWR4ID0gMTsKKyAgdW5zaWduZWQgTnVtQXJncyA9IGdldEZ1bmN0aW9uT3JNZXRob2ROdW1QYXJhbXMoRCkgKyBIYXNJbXBsaWNpdFRoaXNQYXJhbTsKIAogICBJZGVudGlmaWVySW5mbyAqSUkgPSBBdHRyLmdldEFyZ0FzSWRlbnQoMCktPklkZW50OwogICBTdHJpbmdSZWYgRm9ybWF0ID0gSUktPmdldE5hbWUoKTsKQEAgLTMxMzQsMjkgKzI0NzUsMjQgQEAKICAgCiAgIGlmIChLaW5kID09IEludmFsaWRGb3JtYXQpIHsKICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfdHlwZV9ub3Rfc3VwcG9ydGVkKQotICAgICAgPDwgImZvcm1hdCIgPDwgSUktPmdldE5hbWUoKTsKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IElJLT5nZXROYW1lKCk7CiAgICAgcmV0dXJuOwogICB9CiAKICAgLy8gY2hlY2tzIGZvciB0aGUgMm5kIGFyZ3VtZW50CiAgIEV4cHIgKklkeEV4cHIgPSBBdHRyLmdldEFyZ0FzRXhwcigxKTsKLSAgbGx2bTo6QVBTSW50IElkeCgzMik7Ci0gIGlmIChJZHhFeHByLT5pc1R5cGVEZXBlbmRlbnQoKSB8fCBJZHhFeHByLT5pc1ZhbHVlRGVwZW5kZW50KCkgfHwKLSAgICAgICFJZHhFeHByLT5pc0ludGVnZXJDb25zdGFudEV4cHIoSWR4LCBTLkNvbnRleHQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfbl90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMiA8PCBBQU5UX0FyZ3VtZW50SW50ZWdlckNvbnN0YW50Ci0gICAgICA8PCBJZHhFeHByLT5nZXRTb3VyY2VSYW5nZSgpOworICB1aW50MzJfdCBJZHg7CisgIGlmICghY2hlY2tVSW50MzJBcmd1bWVudChTLCBBdHRyLCBJZHhFeHByLCBJZHgsIDIpKQogICAgIHJldHVybjsKLSAgfQogCi0gIGlmIChJZHguZ2V0WkV4dFZhbHVlKCkgPCBGaXJzdElkeCB8fCBJZHguZ2V0WkV4dFZhbHVlKCkgPiBOdW1BcmdzKSB7CisgIGlmIChJZHggPCAxIHx8IElkeCA+IE51bUFyZ3MpIHsKICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF9vdXRfb2ZfYm91bmRzKQotICAgICAgPDwgImZvcm1hdCIgPDwgMiA8PCBJZHhFeHByLT5nZXRTb3VyY2VSYW5nZSgpOworICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMiA8PCBJZHhFeHByLT5nZXRTb3VyY2VSYW5nZSgpOwogICAgIHJldHVybjsKICAgfQogCiAgIC8vIEZJWE1FOiBEbyB3ZSBuZWVkIHRvIGJvdW5kcyBjaGVjaz8KLSAgdW5zaWduZWQgQXJnSWR4ID0gSWR4LmdldFpFeHRWYWx1ZSgpIC0gMTsKKyAgdW5zaWduZWQgQXJnSWR4ID0gSWR4IC0gMTsKIAogICBpZiAoSGFzSW1wbGljaXRUaGlzUGFyYW0pIHsKICAgICBpZiAoQXJnSWR4ID09IDApIHsKQEAgLTMxNjksNyArMjUwNSw3IEBACiAgIH0KIAogICAvLyBtYWtlIHN1cmUgdGhlIGZvcm1hdCBzdHJpbmcgaXMgcmVhbGx5IGEgc3RyaW5nCi0gIFF1YWxUeXBlIFR5ID0gZ2V0RnVuY3Rpb25Pck1ldGhvZEFyZ1R5cGUoRCwgQXJnSWR4KTsKKyAgUXVhbFR5cGUgVHkgPSBnZXRGdW5jdGlvbk9yTWV0aG9kUGFyYW1UeXBlKEQsIEFyZ0lkeCk7CiAKICAgaWYgKEtpbmQgPT0gQ0ZTdHJpbmdGb3JtYXQpIHsKICAgICBpZiAoIWlzQ0ZTdHJpbmdUeXBlKFR5LCBTLkNvbnRleHQpKSB7CkBAIC0zMTk2LDE0ICsyNTMyLDkgQEAKIAogICAvLyBjaGVjayB0aGUgM3JkIGFyZ3VtZW50CiAgIEV4cHIgKkZpcnN0QXJnRXhwciA9IEF0dHIuZ2V0QXJnQXNFeHByKDIpOwotICBsbHZtOjpBUFNJbnQgRmlyc3RBcmcoMzIpOwotICBpZiAoRmlyc3RBcmdFeHByLT5pc1R5cGVEZXBlbmRlbnQoKSB8fCBGaXJzdEFyZ0V4cHItPmlzVmFsdWVEZXBlbmRlbnQoKSB8fAotICAgICAgIUZpcnN0QXJnRXhwci0+aXNJbnRlZ2VyQ29uc3RhbnRFeHByKEZpcnN0QXJnLCBTLkNvbnRleHQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfbl90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMyA8PCBBQU5UX0FyZ3VtZW50SW50ZWdlckNvbnN0YW50Ci0gICAgICA8PCBGaXJzdEFyZ0V4cHItPmdldFNvdXJjZVJhbmdlKCk7CisgIHVpbnQzMl90IEZpcnN0QXJnOworICBpZiAoIWNoZWNrVUludDMyQXJndW1lbnQoUywgQXR0ciwgRmlyc3RBcmdFeHByLCBGaXJzdEFyZywgMykpCiAgICAgcmV0dXJuOwotICB9CiAKICAgLy8gY2hlY2sgaWYgdGhlIGZ1bmN0aW9uIGlzIHZhcmlhZGljIGlmIHRoZSAzcmQgYXJndW1lbnQgbm9uLXplcm8KICAgaWYgKEZpcnN0QXJnICE9IDApIHsKQEAgLTMyMjYsMTMgKzI1NTcsMTIgQEAKICAgLy8gaWYgMCBpdCBkaXNhYmxlcyBwYXJhbWV0ZXIgY2hlY2tpbmcgKHRvIHVzZSB3aXRoIGUuZy4gdmFfbGlzdCkKICAgfSBlbHNlIGlmIChGaXJzdEFyZyAhPSAwICYmIEZpcnN0QXJnICE9IE51bUFyZ3MpIHsKICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF9vdXRfb2ZfYm91bmRzKQotICAgICAgPDwgImZvcm1hdCIgPDwgMyA8PCBGaXJzdEFyZ0V4cHItPmdldFNvdXJjZVJhbmdlKCk7CisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAzIDw8IEZpcnN0QXJnRXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKICAgICByZXR1cm47CiAgIH0KIAogICBGb3JtYXRBdHRyICpOZXdBdHRyID0gUy5tZXJnZUZvcm1hdEF0dHIoRCwgQXR0ci5nZXRSYW5nZSgpLCBJSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkeC5nZXRaRXh0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0QXJnLmdldFpFeHRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWR4LCBGaXJzdEFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSk7CiAgIGlmIChOZXdBdHRyKQogICAgIEQtPmFkZEF0dHIoTmV3QXR0cik7CkBAIC0zMjgwLDggKzI2MTAsMTMgQEAKICAgdWludDY0X3QgRmlyc3RBbGlnbiA9IFMuQ29udGV4dC5nZXRUeXBlQWxpZ24oRmlyc3RUeXBlKTsKICAgZm9yICg7IEZpZWxkICE9IEZpZWxkRW5kOyArK0ZpZWxkKSB7CiAgICAgUXVhbFR5cGUgRmllbGRUeXBlID0gRmllbGQtPmdldFR5cGUoKTsKKyAgICAvLyBGSVhNRTogdGhpcyBpc24ndCBmdWxseSBjb3JyZWN0OyB3ZSBhbHNvIG5lZWQgdG8gdGVzdCB3aGV0aGVyIHRoZQorICAgIC8vIG1lbWJlcnMgb2YgdGhlIHVuaW9uIHdvdWxkIGFsbCBoYXZlIHRoZSBzYW1lIGNhbGxpbmcgY29udmVudGlvbiBhcyB0aGUKKyAgICAvLyBmaXJzdCBtZW1iZXIgb2YgdGhlIHVuaW9uLiBDaGVja2luZyBqdXN0IHRoZSBzaXplIGFuZCBhbGlnbm1lbnQgaXNuJ3QKKyAgICAvLyBzdWZmaWNpZW50IChjb25zaWRlciBzdHJ1Y3RzIHBhc3NlZCBvbiB0aGUgc3RhY2sgaW5zdGVhZCBvZiBpbiByZWdpc3RlcnMKKyAgICAvLyBhcyBhbiBleGFtcGxlKS4KICAgICBpZiAoUy5Db250ZXh0LmdldFR5cGVTaXplKEZpZWxkVHlwZSkgIT0gRmlyc3RTaXplIHx8Ci0gICAgICAgIFMuQ29udGV4dC5nZXRUeXBlQWxpZ24oRmllbGRUeXBlKSAhPSBGaXJzdEFsaWduKSB7CisgICAgICAgIFMuQ29udGV4dC5nZXRUeXBlQWxpZ24oRmllbGRUeXBlKSA+IEZpcnN0QWxpZ24pIHsKICAgICAgIC8vIFdhcm4gaWYgd2UgZHJvcCB0aGUgYXR0cmlidXRlLgogICAgICAgYm9vbCBpc1NpemUgPSBTLkNvbnRleHQuZ2V0VHlwZVNpemUoRmllbGRUeXBlKSAhPSBGaXJzdFNpemU7CiAgICAgICB1bnNpZ25lZCBGaWVsZEJpdHMgPSBpc1NpemU/IFMuQ29udGV4dC5nZXRUeXBlU2l6ZShGaWVsZFR5cGUpCkBAIC0zMzEwLDEwICsyNjQ1LDggQEAKICAgICByZXR1cm47CiAKICAgLy8gRG9uJ3QgZHVwbGljYXRlIGFubm90YXRpb25zIHRoYXQgYXJlIGFscmVhZHkgc2V0LgotICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8QW5ub3RhdGVBdHRyPgotICAgICAgIGkgPSBELT5zcGVjaWZpY19hdHRyX2JlZ2luPEFubm90YXRlQXR0cj4oKSwKLSAgICAgICBlID0gRC0+c3BlY2lmaWNfYXR0cl9lbmQ8QW5ub3RhdGVBdHRyPigpOyBpICE9IGU7ICsraSkgewotICAgIGlmICgoKmkpLT5nZXRBbm5vdGF0aW9uKCkgPT0gU3RyKQorICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBELT5zcGVjaWZpY19hdHRyczxBbm5vdGF0ZUF0dHI+KCkpIHsKKyAgICBpZiAoSS0+Z2V0QW5ub3RhdGlvbigpID09IFN0cikKICAgICAgIHJldHVybjsKICAgfQogICAKQEAgLTMzODAsMTUgKzI3MTMsMTQgQEAKICAgICAgIGlmIChGRC0+aXNCaXRGaWVsZCgpKQogICAgICAgICBEaWFnS2luZCA9IDM7CiAgICAgfSBlbHNlIGlmICghaXNhPFRhZ0RlY2w+KEQpKSB7Ci0gICAgICBEaWFnKEF0dHJMb2MsIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgICA8PCAoVG1wQXR0ci5pc0MxMSgpID8gIidfQWxpZ25hcyciIDogIidhbGlnbmFzJyIpCisgICAgICBEaWFnKEF0dHJMb2MsIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKSA8PCAmVG1wQXR0cgogICAgICAgICA8PCAoVG1wQXR0ci5pc0MxMSgpID8gRXhwZWN0ZWRWYXJpYWJsZU9yRmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEV4cGVjdGVkVmFyaWFibGVGaWVsZE9yVGFnKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaWYgKERpYWdLaW5kICE9IC0xKSB7CiAgICAgICBEaWFnKEF0dHJMb2MsIGRpYWc6OmVycl9hbGlnbmFzX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICAgIDw8IFRtcEF0dHIuaXNDMTEoKSA8PCBEaWFnS2luZDsKKyAgICAgICAgPDwgJlRtcEF0dHIgPDwgRGlhZ0tpbmQ7CiAgICAgICByZXR1cm47CiAgICAgfQogICB9CkBAIC0zNDIyLDE0ICsyNzU0LDEyIEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgaWYgKFRtcEF0dHIuaXNEZWNsc3BlYygpKSB7Ci0gICAgLy8gV2UndmUgYWxyZWFkeSB2ZXJpZmllZCBpdCdzIGEgcG93ZXIgb2YgMiwgbm93IGxldCdzIG1ha2Ugc3VyZSBpdCdzCi0gICAgLy8gODE5MiBvciBsZXNzLgotICAgIGlmIChBbGlnbm1lbnQuZ2V0WkV4dFZhbHVlKCkgPiA4MTkyKSB7Ci0gICAgICBEaWFnKEF0dHJMb2MsIGRpYWc6OmVycl9hdHRyaWJ1dGVfYWxpZ25lZF9ncmVhdGVyX3RoYW5fODE5MikKLSAgICAgICAgPDwgRS0+Z2V0U291cmNlUmFuZ2UoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CisgIC8vIEFsaWdubWVudCBjYWxjdWxhdGlvbnMgY2FuIHdyYXAgYXJvdW5kIGlmIGl0J3MgZ3JlYXRlciB0aGFuIDIqKjI4LgorICB1bnNpZ25lZCBNYXhWYWxpZEFsaWdubWVudCA9IFRtcEF0dHIuaXNEZWNsc3BlYygpID8gODE5MiA6IDI2ODQzNTQ1NjsKKyAgaWYgKEFsaWdubWVudC5nZXRaRXh0VmFsdWUoKSA+IE1heFZhbGlkQWxpZ25tZW50KSB7CisgICAgRGlhZyhBdHRyTG9jLCBkaWFnOjplcnJfYXR0cmlidXRlX2FsaWduZWRfdG9vX2dyZWF0KSA8PCBNYXhWYWxpZEFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICByZXR1cm47CiAgIH0KIAogICBBbGlnbmVkQXR0ciAqQUEgPSA6Om5ldyAoQ29udGV4dCkgQWxpZ25lZEF0dHIoQXR0clJhbmdlLCBDb250ZXh0LCB0cnVlLApAQCAtMzQ2NSwxMyArMjc5NSwxMSBAQAogICAvLyAgIHdvdWxkIG90aGVyd2lzZSBiZSByZXF1aXJlZCBmb3IgdGhlIGVudGl0eSBiZWluZyBkZWNsYXJlZC4KICAgQWxpZ25lZEF0dHIgKkFsaWduYXNBdHRyID0gMDsKICAgdW5zaWduZWQgQWxpZ24gPSAwOwotICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8QWxpZ25lZEF0dHI+Ci0gICAgICAgICBJID0gRC0+c3BlY2lmaWNfYXR0cl9iZWdpbjxBbGlnbmVkQXR0cj4oKSwKLSAgICAgICAgIEUgPSBELT5zcGVjaWZpY19hdHRyX2VuZDxBbGlnbmVkQXR0cj4oKTsgSSAhPSBFOyArK0kpIHsKKyAgZm9yIChhdXRvICpJIDogRC0+c3BlY2lmaWNfYXR0cnM8QWxpZ25lZEF0dHI+KCkpIHsKICAgICBpZiAoSS0+aXNBbGlnbm1lbnREZXBlbmRlbnQoKSkKICAgICAgIHJldHVybjsKICAgICBpZiAoSS0+aXNBbGlnbmFzKCkpCi0gICAgICBBbGlnbmFzQXR0ciA9ICpJOworICAgICAgQWxpZ25hc0F0dHIgPSBJOwogICAgIEFsaWduID0gc3RkOjptYXgoQWxpZ24sIEktPmdldEFsaWdubWVudChDb250ZXh0KSk7CiAgIH0KIApAQCAtMzQ4NCw2ICsyODEyLDM1IEBACiAgIH0KIH0KIAorYm9vbCBTZW1hOjpjaGVja01TSW5oZXJpdGFuY2VBdHRyT25EZWZpbml0aW9uKAorICAgIENYWFJlY29yZERlY2wgKlJELCBTb3VyY2VSYW5nZSBSYW5nZSwgYm9vbCBCZXN0Q2FzZSwKKyAgICBNU0luaGVyaXRhbmNlQXR0cjo6U3BlbGxpbmcgU2VtYW50aWNTcGVsbGluZykgeworICBhc3NlcnQoUkQtPmhhc0RlZmluaXRpb24oKSAmJiAiUkQgaGFzIG5vIGRlZmluaXRpb24hIik7CisKKyAgLy8gV2UgbWF5IG5vdCBoYXZlIHNlZW4gYmFzZSBzcGVjaWZpZXJzIG9yIGFueSB2aXJ0dWFsIG1ldGhvZHMgeWV0LiAgV2Ugd2lsbAorICAvLyBoYXZlIHRvIHdhaXQgdW50aWwgdGhlIHJlY29yZCBpcyBkZWZpbmVkIHRvIGNhdGNoIGFueSBtaXNtYXRjaGVzLgorICBpZiAoIVJELT5nZXREZWZpbml0aW9uKCktPmlzQ29tcGxldGVEZWZpbml0aW9uKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFRoZSB1bnNwZWNpZmllZCBtb2RlbCBuZXZlciBtYXRjaGVzIHdoYXQgYSBkZWZpbml0aW9uIGNvdWxkIG5lZWQuCisgIGlmIChTZW1hbnRpY1NwZWxsaW5nID09IE1TSW5oZXJpdGFuY2VBdHRyOjpLZXl3b3JkX3Vuc3BlY2lmaWVkX2luaGVyaXRhbmNlKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoQmVzdENhc2UpIHsKKyAgICBpZiAoUkQtPmNhbGN1bGF0ZUluaGVyaXRhbmNlTW9kZWwoKSA9PSBTZW1hbnRpY1NwZWxsaW5nKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIGlmIChSRC0+Y2FsY3VsYXRlSW5oZXJpdGFuY2VNb2RlbCgpIDw9IFNlbWFudGljU3BlbGxpbmcpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEaWFnKFJhbmdlLmdldEJlZ2luKCksIGRpYWc6OmVycl9taXNtYXRjaGVkX21zX2luaGVyaXRhbmNlKQorICAgICAgPDwgMCAvKmRlZmluaXRpb24qLzsKKyAgRGlhZyhSRC0+Z2V0RGVmaW5pdGlvbigpLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX2RlZmluZWRfaGVyZSkKKyAgICAgIDw8IFJELT5nZXROYW1lQXNTdHJpbmcoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKIC8vLyBoYW5kbGVNb2RlQXR0ciAtIFRoaXMgYXR0cmlidXRlIG1vZGlmaWVzIHRoZSB3aWR0aCBvZiBhIGRlY2wgd2l0aCBwcmltaXRpdmUKIC8vLyB0eXBlLgogLy8vCkBAIC0zNTUzLDcgKzI5MTAsNyBAQAogICAgIE9sZFR5ID0gVkQtPmdldFR5cGUoKTsKICAgZWxzZSB7CiAgICAgUy5EaWFnKEQtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9hdHRyX3dyb25nX2RlY2wpCi0gICAgICA8PCAibW9kZSIgPDwgQXR0ci5nZXRSYW5nZSgpOworICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgQXR0ci5nZXRSYW5nZSgpOwogICAgIHJldHVybjsKICAgfQogCkBAIC0zNTc1LDcgKzI5MzIsNyBAQAogICAvLyBGSVhNRTogTWFrZSBzdXJlIGZsb2F0aW5nLXBvaW50IG1hcHBpbmdzIGFyZSBhY2N1cmF0ZQogICAvLyBGSVhNRTogU3VwcG9ydCBYRiBhbmQgVEYgdHlwZXMKICAgaWYgKCFEZXN0V2lkdGgpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX3Vua25vd25fbWFjaGluZV9tb2RlKSA8PCBOYW1lOworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfbWFjaGluZV9tb2RlKSA8PCAwIC8qVW5rbm93biovIDw8IE5hbWU7CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTM1ODgsNyArMjk0NSw3IEBACiAgICAgTmV3VHkgPSBTLkNvbnRleHQuZ2V0UmVhbFR5cGVGb3JCaXR3aWR0aChEZXN0V2lkdGgpOwogCiAgIGlmIChOZXdUeS5pc051bGwoKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfdW5zdXBwb3J0ZWRfbWFjaGluZV9tb2RlKSA8PCBOYW1lOworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfbWFjaGluZV9tb2RlKSA8PCAxIC8qVW5zdXBwb3J0ZWQqLyA8PCBOYW1lOwogICAgIHJldHVybjsKICAgfQogCkBAIC0zNjI1LDE0OSArMjk4Miw0OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVOb0lubGluZUF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkRnVuY3Rpb247CitzdGF0aWMgdm9pZCBoYW5kbGVBbHdheXNJbmxpbmVBdHRyKFNlbWEgJlMsIERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgaWYgKGNoZWNrQXR0ck11dHVhbEV4Y2x1c2lvbjxPcHRpbWl6ZU5vbmVBdHRyPihTLCBELCBBdHRyKSkKICAgICByZXR1cm47Ci0gIH0KIAogICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgTm9JbmxpbmVBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVOb0luc3RydW1lbnRGdW5jdGlvbkF0dHIoU2VtYSAmUywgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgTm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlS2VybmVsQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmIChTLkxhbmdPcHRzLlJlbmRlcnNjcmlwdCkgewotICAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkgS2VybmVsQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCkpOwotICB9IGVsc2UgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCAia2VybmVsIjsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVDb25zdGFudEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoUy5MYW5nT3B0cy5DVURBKSB7Ci0gICAgaWYgKCFpc2E8VmFyRGVjbD4oRCkpIHsKLSAgICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkVmFyaWFibGU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgICAgQ1VEQUNvbnN0YW50QXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX2lnbm9yZWQpIDw8ICJjb25zdGFudCI7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlRGV2aWNlQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmIChTLkxhbmdPcHRzLkNVREEpIHsKLSAgICAvLyBjaGVjayB0aGUgYXR0cmlidXRlIGFyZ3VtZW50cy4KLSAgICBpZiAoQXR0ci5nZXROdW1BcmdzKCkgIT0gMCkgewotICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfbnVtYmVyX2FyZ3VtZW50cykKLSAgICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpICYmICFpc2E8VmFyRGVjbD4oRCkpIHsKLSAgICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkVmFyaWFibGVPckZ1bmN0aW9uOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICAgIENVREFEZXZpY2VBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAorICAgICAgICAgICAgIEFsd2F5c0lubGluZUF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLSAgfSBlbHNlIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCkgPDwgImRldmljZSI7Ci0gIH0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlT3B0aW1pemVOb25lQXR0cihTZW1hICZTLCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIGlmIChjaGVja0F0dHJNdXR1YWxFeGNsdXNpb248QWx3YXlzSW5saW5lQXR0cj4oUywgRCwgQXR0cikpCisgICAgcmV0dXJuOworCisgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKKyAgICAgICAgICAgICBPcHRpbWl6ZU5vbmVBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZUdsb2JhbEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoUy5MYW5nT3B0cy5DVURBKSB7Ci0gICAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgewotICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbjsKLSAgICAgIHJldHVybjsKKyAgRnVuY3Rpb25EZWNsICpGRCA9IGNhc3Q8RnVuY3Rpb25EZWNsPihEKTsKKyAgaWYgKCFGRC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWRUeXBlKCkpIHsKKyAgICBUeXBlTG9jIFRMID0gRkQtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKS5JZ25vcmVQYXJlbnMoKTsKKyAgICBpZiAoRnVuY3Rpb25UeXBlTG9jIEZUTCA9IFRMLmdldEFzPEZ1bmN0aW9uVHlwZUxvYz4oKSkgeworICAgICAgUy5EaWFnKEZELT5nZXRUeXBlU3BlY1N0YXJ0TG9jKCksIGRpYWc6OmVycl9rZXJuX3R5cGVfbm90X3ZvaWRfcmV0dXJuKQorICAgICAgICA8PCBGRC0+Z2V0VHlwZSgpCisgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlUmVwbGFjZW1lbnQoRlRMLmdldFJldHVybkxvYygpLmdldFNvdXJjZVJhbmdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZvaWQiKTsKKyAgICB9IGVsc2UgeworICAgICAgUy5EaWFnKEZELT5nZXRUeXBlU3BlY1N0YXJ0TG9jKCksIGRpYWc6OmVycl9rZXJuX3R5cGVfbm90X3ZvaWRfcmV0dXJuKQorICAgICAgICA8PCBGRC0+Z2V0VHlwZSgpOwogICAgIH0KLQotICAgIEZ1bmN0aW9uRGVjbCAqRkQgPSBjYXN0PEZ1bmN0aW9uRGVjbD4oRCk7Ci0gICAgaWYgKCFGRC0+Z2V0UmVzdWx0VHlwZSgpLT5pc1ZvaWRUeXBlKCkpIHsKLSAgICAgIFR5cGVMb2MgVEwgPSBGRC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpLklnbm9yZVBhcmVucygpOwotICAgICAgaWYgKEZ1bmN0aW9uVHlwZUxvYyBGVEwgPSBUTC5nZXRBczxGdW5jdGlvblR5cGVMb2M+KCkpIHsKLSAgICAgICAgUy5EaWFnKEZELT5nZXRUeXBlU3BlY1N0YXJ0TG9jKCksIGRpYWc6OmVycl9rZXJuX3R5cGVfbm90X3ZvaWRfcmV0dXJuKQotICAgICAgICAgIDw8IEZELT5nZXRUeXBlKCkKLSAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlcGxhY2VtZW50KEZUTC5nZXRSZXN1bHRMb2MoKS5nZXRTb3VyY2VSYW5nZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZvaWQiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFMuRGlhZyhGRC0+Z2V0VHlwZVNwZWNTdGFydExvYygpLCBkaWFnOjplcnJfa2Vybl90eXBlX25vdF92b2lkX3JldHVybikKLSAgICAgICAgICA8PCBGRC0+Z2V0VHlwZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICAgIENVREFHbG9iYWxBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX2lnbm9yZWQpIDw8ICJnbG9iYWwiOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZUhvc3RBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKFMuTGFuZ09wdHMuQ1VEQSkgewotICAgIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkRnVuY3Rpb247Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgICAgQ1VEQUhvc3RBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotICB9IGVsc2UgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCAiaG9zdCI7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlU2hhcmVkQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmIChTLkxhbmdPcHRzLkNVREEpIHsKLSAgICBpZiAoIWlzYTxWYXJEZWNsPihEKSkgewotICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRWYXJpYWJsZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgICBDVURBU2hhcmVkQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotICB9IGVsc2UgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCAic2hhcmVkIjsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVHTlVJbmxpbmVBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgRnVuY3Rpb25EZWNsICpGbiA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oRCk7Ci0gIGlmIChGbiA9PSAwKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkRnVuY3Rpb247CiAgICAgcmV0dXJuOwogICB9CiAKKyAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQorICAgICAgICAgICAgICBDVURBR2xvYmFsQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlR05VSW5saW5lQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIEZ1bmN0aW9uRGVjbCAqRm4gPSBjYXN0PEZ1bmN0aW9uRGVjbD4oRCk7CiAgIGlmICghRm4tPmlzSW5saW5lU3BlY2lmaWVkKCkpIHsKICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9nbnVfaW5saW5lX2F0dHJpYnV0ZV9yZXF1aXJlc19pbmxpbmUpOwogICAgIHJldHVybjsKQEAgLTM4NjQsMjUgKzMxMjEsNiBAQAogICB9CiB9CiAKLXN0YXRpYyB2b2lkIGhhbmRsZU9wZW5DTEtlcm5lbEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cil7Ci0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkgT3BlbkNMS2VybmVsQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCkpOwotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVPcGVuQ0xJbWFnZUFjY2Vzc0F0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cil7Ci0gIEV4cHIgKkUgPSBBdHRyLmdldEFyZ0FzRXhwcigwKTsKLSAgbGx2bTo6QVBTSW50IEFyZ051bSgzMik7Ci0gIGlmIChFLT5pc1R5cGVEZXBlbmRlbnQoKSB8fCBFLT5pc1ZhbHVlRGVwZW5kZW50KCkgfHwKLSAgICAgICFFLT5pc0ludGVnZXJDb25zdGFudEV4cHIoQXJnTnVtLCBTLkNvbnRleHQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEFBTlRfQXJndW1lbnRJbnRlZ2VyQ29uc3RhbnQKLSAgICAgIDw8IEUtPmdldFNvdXJjZVJhbmdlKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KSBPcGVuQ0xJbWFnZUFjY2Vzc0F0dHIoCi0gICAgQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsIEFyZ051bS5nZXRaRXh0VmFsdWUoKSkpOwotfQotCiBib29sIFNlbWE6OkNoZWNrQ2FsbGluZ0NvbnZBdHRyKGNvbnN0IEF0dHJpYnV0ZUxpc3QgJmF0dHIsIENhbGxpbmdDb252ICZDQywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQpIHsKICAgaWYgKGF0dHIuaXNJbnZhbGlkKCkpCkBAIC0zODk0LDggKzMxMzIsNyBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLy8gVE9ETzogZGlhZ25vc2UgdXNlcyBvZiB0aGVzZSBjb252ZW50aW9ucyBvbiB0aGUgd3JvbmcgdGFyZ2V0LiBPciwgYmV0dGVyCi0gIC8vIG1vdmUgdG8gVGFyZ2V0QXR0cmlidXRlc1NlbWEgb25lIGRheS4KKyAgLy8gVE9ETzogZGlhZ25vc2UgdXNlcyBvZiB0aGVzZSBjb252ZW50aW9ucyBvbiB0aGUgd3JvbmcgdGFyZ2V0LgogICBzd2l0Y2ggKGF0dHIuZ2V0S2luZCgpKSB7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ0RlY2w6IENDID0gQ0NfQzsgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfRmFzdENhbGw6IENDID0gQ0NfWDg2RmFzdENhbGw7IGJyZWFrOwpAQCAtMzk0OCwyNCArMzE4NSw2IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlUmVncGFybUF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoaGFzRGVjbGFyYXRvcihEKSkgcmV0dXJuOwotCi0gIHVuc2lnbmVkIG51bVBhcmFtczsKLSAgaWYgKFMuQ2hlY2tSZWdwYXJtQXR0cihBdHRyLCBudW1QYXJhbXMpKQotICAgIHJldHVybjsKLQotICBpZiAoIWlzYTxPYmpDTWV0aG9kRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbk9yTWV0aG9kOwotICAgIHJldHVybjsKLSAgfQotCi0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBSZWdwYXJtQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwgbnVtUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotfQotCiAvLy8gQ2hlY2tzIGEgcmVncGFybSBhdHRyaWJ1dGUsIHJldHVybmluZyB0cnVlIGlmIGl0IGlzIGlsbC1mb3JtZWQgYW5kCiAvLy8gb3RoZXJ3aXNlIHNldHRpbmcgbnVtUGFyYW1zIHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZS4KIGJvb2wgU2VtYTo6Q2hlY2tSZWdwYXJtQXR0cihjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCB1bnNpZ25lZCAmbnVtUGFyYW1zKSB7CkBAIC0zOTc3LDEzICszMTk2LDkgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCisgIHVpbnQzMl90IE5QOwogICBFeHByICpOdW1QYXJhbXNFeHByID0gQXR0ci5nZXRBcmdBc0V4cHIoMCk7Ci0gIGxsdm06OkFQU0ludCBOdW1QYXJhbXMoMzIpOwotICBpZiAoTnVtUGFyYW1zRXhwci0+aXNUeXBlRGVwZW5kZW50KCkgfHwgTnVtUGFyYW1zRXhwci0+aXNWYWx1ZURlcGVuZGVudCgpIHx8Ci0gICAgICAhTnVtUGFyYW1zRXhwci0+aXNJbnRlZ2VyQ29uc3RhbnRFeHByKE51bVBhcmFtcywgQ29udGV4dCkpIHsKLSAgICBEaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEFBTlRfQXJndW1lbnRJbnRlZ2VyQ29uc3RhbnQKLSAgICAgIDw8IE51bVBhcmFtc0V4cHItPmdldFNvdXJjZVJhbmdlKCk7CisgIGlmICghY2hlY2tVSW50MzJBcmd1bWVudCgqdGhpcywgQXR0ciwgTnVtUGFyYW1zRXhwciwgTlApKSB7CiAgICAgQXR0ci5zZXRJbnZhbGlkKCk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTM5OTUsNyArMzIxMCw3IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICBudW1QYXJhbXMgPSBOdW1QYXJhbXMuZ2V0WkV4dFZhbHVlKCk7CisgIG51bVBhcmFtcyA9IE5QOwogICBpZiAobnVtUGFyYW1zID4gQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkuZ2V0UmVnUGFybU1heCgpKSB7CiAgICAgRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3JlZ3Bhcm1faW52YWxpZF9udW1iZXIpCiAgICAgICA8PCBDb250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRSZWdQYXJtTWF4KCkgPDwgTnVtUGFyYW1zRXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKQEAgLTQwMDYsNTMgKzMyMjEsMjggQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVMYXVuY2hCb3VuZHNBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpewotICBpZiAoUy5MYW5nT3B0cy5DVURBKSB7Ci0gICAgLy8gY2hlY2sgdGhlIGF0dHJpYnV0ZSBhcmd1bWVudHMuCi0gICAgaWYgKEF0dHIuZ2V0TnVtQXJncygpICE9IDEgJiYgQXR0ci5nZXROdW1BcmdzKCkgIT0gMikgewotICAgICAgLy8gRklYTUU6IDAgaXMgbm90IG9rYXkuCi0gICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV90b29fbWFueV9hcmd1bWVudHMpIDw8IDI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFpc0Z1bmN0aW9uT3JNZXRob2QoRCkpIHsKLSAgICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEV4cGVjdGVkRnVuY3Rpb25Pck1ldGhvZDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBFeHByICpNYXhUaHJlYWRzRXhwciA9IEF0dHIuZ2V0QXJnQXNFeHByKDApOwotICAgIGxsdm06OkFQU0ludCBNYXhUaHJlYWRzKDMyKTsKLSAgICBpZiAoTWF4VGhyZWFkc0V4cHItPmlzVHlwZURlcGVuZGVudCgpIHx8Ci0gICAgICAgIE1heFRocmVhZHNFeHByLT5pc1ZhbHVlRGVwZW5kZW50KCkgfHwKLSAgICAgICAgIU1heFRocmVhZHNFeHByLT5pc0ludGVnZXJDb25zdGFudEV4cHIoTWF4VGhyZWFkcywgUy5Db250ZXh0KSkgewotICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfbl90eXBlKQotICAgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAxIDw8IEFBTlRfQXJndW1lbnRJbnRlZ2VyQ29uc3RhbnQKLSAgICAgICAgPDwgTWF4VGhyZWFkc0V4cHItPmdldFNvdXJjZVJhbmdlKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbGx2bTo6QVBTSW50IE1pbkJsb2NrcygzMik7Ci0gICAgaWYgKEF0dHIuZ2V0TnVtQXJncygpID4gMSkgewotICAgICAgRXhwciAqTWluQmxvY2tzRXhwciA9IEF0dHIuZ2V0QXJnQXNFeHByKDEpOwotICAgICAgaWYgKE1pbkJsb2Nrc0V4cHItPmlzVHlwZURlcGVuZGVudCgpIHx8Ci0gICAgICAgICAgTWluQmxvY2tzRXhwci0+aXNWYWx1ZURlcGVuZGVudCgpIHx8Ci0gICAgICAgICAgIU1pbkJsb2Nrc0V4cHItPmlzSW50ZWdlckNvbnN0YW50RXhwcihNaW5CbG9ja3MsIFMuQ29udGV4dCkpIHsKLSAgICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfbl90eXBlKQotICAgICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDIgPDwgQUFOVF9Bcmd1bWVudEludGVnZXJDb25zdGFudAotICAgICAgICAgIDw8IE1pbkJsb2Nrc0V4cHItPmdldFNvdXJjZVJhbmdlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgICBDVURBTGF1bmNoQm91bmRzQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heFRocmVhZHMuZ2V0WkV4dFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5CbG9ja3MuZ2V0WkV4dFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKLSAgfSBlbHNlIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCkgPDwgImxhdW5jaF9ib3VuZHMiOworc3RhdGljIHZvaWQgaGFuZGxlTGF1bmNoQm91bmRzQXR0cihTZW1hICZTLCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIC8vIGNoZWNrIHRoZSBhdHRyaWJ1dGUgYXJndW1lbnRzLgorICBpZiAoQXR0ci5nZXROdW1BcmdzKCkgIT0gMSAmJiBBdHRyLmdldE51bUFyZ3MoKSAhPSAyKSB7CisgICAgLy8gRklYTUU6IDAgaXMgbm90IG9rYXkuCisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfdG9vX21hbnlfYXJndW1lbnRzKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMjsKKyAgICByZXR1cm47CiAgIH0KKworICB1aW50MzJfdCBNYXhUaHJlYWRzLCBNaW5CbG9ja3MgPSAwOworICBpZiAoIWNoZWNrVUludDMyQXJndW1lbnQoUywgQXR0ciwgQXR0ci5nZXRBcmdBc0V4cHIoMCksIE1heFRocmVhZHMsIDEpKQorICAgIHJldHVybjsKKyAgaWYgKEF0dHIuZ2V0TnVtQXJncygpID4gMSAmJiAhY2hlY2tVSW50MzJBcmd1bWVudChTLCBBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXJnQXNFeHByKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbkJsb2NrcywgMikpCisgICAgcmV0dXJuOworCisgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKKyAgICAgICAgICAgICAgQ1VEQUxhdW5jaEJvdW5kc0F0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4VGhyZWFkcywgTWluQmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCiBzdGF0aWMgdm9pZCBoYW5kbGVBcmd1bWVudFdpdGhUeXBlVGFnQXR0cihTZW1hICZTLCBEZWNsICpELApAQCAtNDA2Niw3ICszMjU2LDYgQEAKICAgaWYgKCFjaGVja0F0dHJpYnV0ZU51bUFyZ3MoUywgQXR0ciwgMykpCiAgICAgcmV0dXJuOwogCi0gIFN0cmluZ1JlZiBBdHRyTmFtZSA9IEF0dHIuZ2V0TmFtZSgpLT5nZXROYW1lKCk7CiAgIElkZW50aWZpZXJJbmZvICpBcmd1bWVudEtpbmQgPSBBdHRyLmdldEFyZ0FzSWRlbnQoMCktPklkZW50OwogCiAgIGlmICghaXNGdW5jdGlvbk9yTWV0aG9kKEQpIHx8ICFoYXNGdW5jdGlvblByb3RvKEQpKSB7CkBAIC00MDc2LDIxICszMjY1LDE5IEBACiAgIH0KIAogICB1aW50NjRfdCBBcmd1bWVudElkeDsKLSAgaWYgKCFjaGVja0Z1bmN0aW9uT3JNZXRob2RBcmd1bWVudEluZGV4KFMsIEQsIEF0dHJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRMb2MoKSwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXJnQXNFeHByKDEpLCBBcmd1bWVudElkeCkpCisgIGlmICghY2hlY2tGdW5jdGlvbk9yTWV0aG9kUGFyYW1ldGVySW5kZXgoUywgRCwgQXR0ciwgMiwgQXR0ci5nZXRBcmdBc0V4cHIoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJndW1lbnRJZHgpKQogICAgIHJldHVybjsKIAogICB1aW50NjRfdCBUeXBlVGFnSWR4OwotICBpZiAoIWNoZWNrRnVuY3Rpb25Pck1ldGhvZEFyZ3VtZW50SW5kZXgoUywgRCwgQXR0ck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldExvYygpLCAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBcmdBc0V4cHIoMiksIFR5cGVUYWdJZHgpKQorICBpZiAoIWNoZWNrRnVuY3Rpb25Pck1ldGhvZFBhcmFtZXRlckluZGV4KFMsIEQsIEF0dHIsIDMsIEF0dHIuZ2V0QXJnQXNFeHByKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVUYWdJZHgpKQogICAgIHJldHVybjsKIAotICBib29sIElzUG9pbnRlciA9IChBdHRyTmFtZSA9PSAicG9pbnRlcl93aXRoX3R5cGVfdGFnIik7CisgIGJvb2wgSXNQb2ludGVyID0gKEF0dHIuZ2V0TmFtZSgpLT5nZXROYW1lKCkgPT0gInBvaW50ZXJfd2l0aF90eXBlX3RhZyIpOwogICBpZiAoSXNQb2ludGVyKSB7CiAgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGhhcyBhIHBvaW50ZXIgdHlwZS4KLSAgICBRdWFsVHlwZSBCdWZmZXJUeSA9IGdldEZ1bmN0aW9uT3JNZXRob2RBcmdUeXBlKEQsIEFyZ3VtZW50SWR4KTsKKyAgICBRdWFsVHlwZSBCdWZmZXJUeSA9IGdldEZ1bmN0aW9uT3JNZXRob2RQYXJhbVR5cGUoRCwgQXJndW1lbnRJZHgpOwogICAgIGlmICghQnVmZmVyVHktPmlzUG9pbnRlclR5cGUoKSkgewogICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfcG9pbnRlcnNfb25seSkKICAgICAgICAgPDwgQXR0ci5nZXROYW1lKCk7CkBAIC00MTE0LDYgKzMzMDEsMTIgQEAKICAgaWYgKCFjaGVja0F0dHJpYnV0ZU51bUFyZ3MoUywgQXR0ciwgMSkpCiAgICAgcmV0dXJuOwogCisgIGlmICghaXNhPFZhckRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRWYXJpYWJsZTsKKyAgICByZXR1cm47CisgIH0KKwogICBJZGVudGlmaWVySW5mbyAqUG9pbnRlcktpbmQgPSBBdHRyLmdldEFyZ0FzSWRlbnQoMCktPklkZW50OwogICBUeXBlU291cmNlSW5mbyAqTWF0Y2hpbmdDVHlwZUxvYyA9IDA7CiAgIFMuR2V0VHlwZUZyb21QYXJzZXIoQXR0ci5nZXRNYXRjaGluZ0NUeXBlKCksICZNYXRjaGluZ0NUeXBlTG9jKTsKQEAgLTQxNDMsMTQgKzMzMzYsOSBAQAogfQogCiBzdGF0aWMgdm9pZCBoYW5kbGVOU0NvbnN1bWVkQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIFBhcm1WYXJEZWNsICpwYXJhbSA9IGR5bl9jYXN0PFBhcm1WYXJEZWNsPihEKTsKLSAgaWYgKCFwYXJhbSkgewotICAgIFMuRGlhZyhELT5nZXRMb2NTdGFydCgpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldFJhbmdlKCkgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRQYXJhbWV0ZXI7Ci0gICAgcmV0dXJuOwotICB9Ci0KKyAgUGFybVZhckRlY2wgKnBhcmFtID0gY2FzdDxQYXJtVmFyRGVjbD4oRCk7CiAgIGJvb2wgdHlwZU9LLCBjZjsKKwogICBpZiAoQXR0ci5nZXRLaW5kKCkgPT0gQXR0cmlidXRlTGlzdDo6QVRfTlNDb25zdW1lZCkgewogICAgIHR5cGVPSyA9IGlzVmFsaWRTdWJqZWN0T2ZOU0F0dHJpYnV0ZShTLCBwYXJhbS0+Z2V0VHlwZSgpKTsKICAgICBjZiA9IGZhbHNlOwpAQCAtNDE3NSwzMyArMzM2MywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVOU0NvbnN1bWVzU2VsZkF0dHIoU2VtYSAmUywgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNhPE9iakNNZXRob2REZWNsPihEKSkgewotICAgIFMuRGlhZyhELT5nZXRMb2NTdGFydCgpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldFJhbmdlKCkgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRNZXRob2Q7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgIE5TQ29uc3VtZXNTZWxmQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGhhbmRsZU5TUmV0dXJuc1JldGFpbmVkQXR0cihTZW1hICZTLCBEZWNsICpELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKIAogICBRdWFsVHlwZSByZXR1cm5UeXBlOwogCiAgIGlmIChPYmpDTWV0aG9kRGVjbCAqTUQgPSBkeW5fY2FzdDxPYmpDTWV0aG9kRGVjbD4oRCkpCi0gICAgcmV0dXJuVHlwZSA9IE1ELT5nZXRSZXN1bHRUeXBlKCk7CisgICAgcmV0dXJuVHlwZSA9IE1ELT5nZXRSZXR1cm5UeXBlKCk7CiAgIGVsc2UgaWYgKFMuZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50ICYmIGhhc0RlY2xhcmF0b3IoRCkgJiYKICAgICAgICAgICAgKEF0dHIuZ2V0S2luZCgpID09IEF0dHJpYnV0ZUxpc3Q6OkFUX05TUmV0dXJuc1JldGFpbmVkKSkKICAgICByZXR1cm47IC8vIGlnbm9yZTogd2FzIGhhbmRsZWQgYXMgYSB0eXBlIGF0dHJpYnV0ZQogICBlbHNlIGlmIChPYmpDUHJvcGVydHlEZWNsICpQRCA9IGR5bl9jYXN0PE9iakNQcm9wZXJ0eURlY2w+KEQpKQogICAgIHJldHVyblR5cGUgPSBQRC0+Z2V0VHlwZSgpOwogICBlbHNlIGlmIChGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihEKSkKLSAgICByZXR1cm5UeXBlID0gRkQtPmdldFJlc3VsdFR5cGUoKTsKKyAgICByZXR1cm5UeXBlID0gRkQtPmdldFJldHVyblR5cGUoKTsKICAgZWxzZSB7CiAgICAgUy5EaWFnKEQtPmdldExvY1N0YXJ0KCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKICAgICAgICAgPDwgQXR0ci5nZXRSYW5nZSgpIDw8IEF0dHIuZ2V0TmFtZSgpCkBAIC00MjcxLDI3ICszNDQ2LDE3IEBACiAgIAogICBTb3VyY2VMb2NhdGlvbiBsb2MgPSBhdHRyLmdldExvYygpOwogICBRdWFsVHlwZSByZXN1bHRUeXBlOwotICAKLSAgT2JqQ01ldGhvZERlY2wgKm1ldGhvZCA9IGR5bl9jYXN0PE9iakNNZXRob2REZWNsPihEKTsKLQotICBpZiAoIW1ldGhvZCkgewotICAgIE9iakNQcm9wZXJ0eURlY2wgKnByb3BlcnR5ID0gZHluX2Nhc3Q8T2JqQ1Byb3BlcnR5RGVjbD4oRCk7Ci0gICAgaWYgKCFwcm9wZXJ0eSkgewotICAgICAgUy5EaWFnKEQtPmdldExvY1N0YXJ0KCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgICA8PCBTb3VyY2VSYW5nZShsb2MsIGxvYykgPDwgYXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRNZXRob2RPclByb3BlcnR5OwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXN1bHRUeXBlID0gcHJvcGVydHktPmdldFR5cGUoKTsKLSAgfQorICBpZiAoaXNhPE9iakNNZXRob2REZWNsPihEKSkKKyAgICByZXN1bHRUeXBlID0gY2FzdDxPYmpDTWV0aG9kRGVjbD4oRCktPmdldFJldHVyblR5cGUoKTsKICAgZWxzZQotICAgIC8vIENoZWNrIHRoYXQgdGhlIG1ldGhvZCByZXR1cm5zIGEgbm9ybWFsIHBvaW50ZXIuCi0gICAgcmVzdWx0VHlwZSA9IG1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpOworICAgIHJlc3VsdFR5cGUgPSBjYXN0PE9iakNQcm9wZXJ0eURlY2w+KEQpLT5nZXRUeXBlKCk7CiAKICAgaWYgKCFyZXN1bHRUeXBlLT5pc1JlZmVyZW5jZVR5cGUoKSAmJgogICAgICAgKCFyZXN1bHRUeXBlLT5pc1BvaW50ZXJUeXBlKCkgfHwgcmVzdWx0VHlwZS0+aXNPYmpDUmV0YWluYWJsZVR5cGUoKSkpIHsKICAgICBTLkRpYWcoRC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6d2Fybl9uc19hdHRyaWJ1dGVfd3JvbmdfcmV0dXJuX3R5cGUpCiAgICAgICA8PCBTb3VyY2VSYW5nZShsb2MpCi0gICAgPDwgYXR0ci5nZXROYW1lKCkgPDwgKG1ldGhvZCA/IEVQX09iakNNZXRob2QgOiBFUF9PYmpDUHJvcGVydHkpCisgICAgPDwgYXR0ci5nZXROYW1lKCkKKyAgICA8PCAoaXNhPE9iakNNZXRob2REZWNsPihEKSA/IEVQX09iakNNZXRob2QgOiBFUF9PYmpDUHJvcGVydHkpCiAgICAgPDwgLypub24tcmV0YWluYWJsZSBwb2ludGVyKi8gMjsKIAogICAgIC8vIERyb3AgdGhlIGF0dHJpYnV0ZS4KQEAgLTQzMDUsMTQgKzM0NzAsOCBAQAogCiBzdGF0aWMgdm9pZCBoYW5kbGVPYmpDUmVxdWlyZXNTdXBlckF0dHIoU2VtYSAmUywgRGVjbCAqRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZhdHRyKSB7Ci0gIFNvdXJjZUxvY2F0aW9uIGxvYyA9IGF0dHIuZ2V0TG9jKCk7Ci0gIE9iakNNZXRob2REZWNsICptZXRob2QgPSBkeW5fY2FzdDxPYmpDTWV0aG9kRGVjbD4oRCk7CisgIE9iakNNZXRob2REZWNsICptZXRob2QgPSBjYXN0PE9iakNNZXRob2REZWNsPihEKTsKICAgCi0gIGlmICghbWV0aG9kKSB7Ci0gICBTLkRpYWcoRC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICA8PCBTb3VyY2VSYW5nZShsb2MsIGxvYykgPDwgYXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRNZXRob2Q7Ci0gICAgcmV0dXJuOwotICB9CiAgIERlY2xDb250ZXh0ICpEQyA9IG1ldGhvZC0+Z2V0RGVjbENvbnRleHQoKTsKICAgaWYgKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlBEZWNsID0gZHluX2Nhc3Rfb3JfbnVsbDxPYmpDUHJvdG9jb2xEZWNsPihEQykpIHsKICAgICBTLkRpYWcoRC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6d2Fybl9vYmpjX3JlcXVpcmVzX3N1cGVyX3Byb3RvY29sKQpAQCAtNDMzMSw5OSArMzQ5MCw4NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCi0vLy8gSGFuZGxlIGNmX2F1ZGl0ZWRfdHJhbnNmZXIgYW5kIGNmX3Vua25vd25fdHJhbnNmZXIuCi1zdGF0aWMgdm9pZCBoYW5kbGVDRlRyYW5zZmVyQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBKSB7Ci0gIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoRC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBLmdldFJhbmdlKCkgPDwgQS5nZXROYW1lKCkgPDwgRXhwZWN0ZWRGdW5jdGlvbjsKK3N0YXRpYyB2b2lkIGhhbmRsZUNGQXVkaXRlZFRyYW5zZmVyQXR0cihTZW1hICZTLCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgaWYgKGNoZWNrQXR0ck11dHVhbEV4Y2x1c2lvbjxDRlVua25vd25UcmFuc2ZlckF0dHI+KFMsIEQsIEF0dHIpKQogICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgSXNBdWRpdGVkID0gKEEuZ2V0S2luZCgpID09IEF0dHJpYnV0ZUxpc3Q6OkFUX0NGQXVkaXRlZFRyYW5zZmVyKTsKLQotICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlJ3MgYSBjb25mbGljdGluZyBhdHRyaWJ1dGUgYWxyZWFkeSBwcmVzZW50LgotICBBdHRyICpFeGlzdGluZzsKLSAgaWYgKElzQXVkaXRlZCkgewotICAgIEV4aXN0aW5nID0gRC0+Z2V0QXR0cjxDRlVua25vd25UcmFuc2ZlckF0dHI+KCk7Ci0gIH0gZWxzZSB7Ci0gICAgRXhpc3RpbmcgPSBELT5nZXRBdHRyPENGQXVkaXRlZFRyYW5zZmVyQXR0cj4oKTsKLSAgfQotICBpZiAoRXhpc3RpbmcpIHsKLSAgICBTLkRpYWcoRC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZXNfYXJlX25vdF9jb21wYXRpYmxlKQotICAgICAgPDwgQS5nZXROYW1lKCkKLSAgICAgIDw8IChJc0F1ZGl0ZWQgPyAiY2ZfdW5rbm93bl90cmFuc2ZlciIgOiAiY2ZfYXVkaXRlZF90cmFuc2ZlciIpCi0gICAgICA8PCBBLmdldFJhbmdlKCkgPDwgRXhpc3RpbmctPmdldFJhbmdlKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQWxsIGNsZWFyOyAgYWRkIHRoZSBhdHRyaWJ1dGUuCi0gIGlmIChJc0F1ZGl0ZWQpIHsKLSAgICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgICBDRkF1ZGl0ZWRUcmFuc2ZlckF0dHIoQS5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQS5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgICAgQ0ZVbmtub3duVHJhbnNmZXJBdHRyKEEuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZU5TQnJpZGdlZEF0dHIoU2VtYSAmUywgU2NvcGUgKlNjLCBEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIFJlY29yZERlY2wgKlJEID0gZHluX2Nhc3Q8UmVjb3JkRGVjbD4oRCk7Ci0gIGlmICghUkQgfHwgUkQtPmlzVW5pb24oKSkgewotICAgIFMuRGlhZyhELT5nZXRMb2NTdGFydCgpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0UmFuZ2UoKSA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZFN0cnVjdDsKLSAgfQotCi0gIElkZW50aWZpZXJMb2MgKlBhcm0gPSBBdHRyLmlzQXJnSWRlbnQoMCkgPyBBdHRyLmdldEFyZ0FzSWRlbnQoMCkgOiAwOwotCi0gIC8vIEluIE9iamVjdGl2ZS1DLCB2ZXJpZnkgdGhhdCB0aGUgdHlwZSBuYW1lcyBhbiBPYmplY3RpdmUtQyB0eXBlLgotICAvLyBXZSBkb24ndCB3YW50IHRvIGNoZWNrIHRoaXMgb3V0c2lkZSBvZiBPYmpDIGJlY2F1c2UgcGVvcGxlIHNvbWV0aW1lcwotICAvLyBkbyBjcmF6eSBDIGRlY2xhcmF0aW9ucyBvZiBPYmplY3RpdmUtQyB0eXBlcy4KLSAgaWYgKFBhcm0gJiYgUy5nZXRMYW5nT3B0cygpLk9iakMxKSB7Ci0gICAgLy8gQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIHR5cGUgd2l0aCB0aGlzIG5hbWUuCi0gICAgTG9va3VwUmVzdWx0IFIoUywgRGVjbGFyYXRpb25OYW1lKFBhcm0tPklkZW50KSwgUGFybS0+TG9jLAotICAgICAgICAgICAgICAgICAgIFNlbWE6Okxvb2t1cE9yZGluYXJ5TmFtZSk7Ci0gICAgaWYgKFMuTG9va3VwTmFtZShSLCBTYykpIHsKLSAgICAgIE5hbWVkRGVjbCAqVGFyZ2V0ID0gUi5nZXRGb3VuZERlY2woKTsKLSAgICAgIGlmIChUYXJnZXQgJiYgIWlzYTxPYmpDSW50ZXJmYWNlRGVjbD4oVGFyZ2V0KSkgewotICAgICAgICBTLkRpYWcoRC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6ZXJyX25zX2JyaWRnZWRfbm90X2ludGVyZmFjZSk7Ci0gICAgICAgIFMuRGlhZyhUYXJnZXQtPmdldExvY1N0YXJ0KCksIGRpYWc6Om5vdGVfZGVjbGFyZWRfYXQpOwotICAgICAgfQotICAgIH0KLSAgfQogCiAgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBOU0JyaWRnZWRBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LCBQYXJtID8gUGFybS0+SWRlbnQgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CisgICAgICAgICAgICAgQ0ZBdWRpdGVkVHJhbnNmZXJBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlQ0ZVbmtub3duVHJhbnNmZXJBdHRyKFNlbWEgJlMsIERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBpZiAoY2hlY2tBdHRyTXV0dWFsRXhjbHVzaW9uPENGQXVkaXRlZFRyYW5zZmVyQXR0cj4oUywgRCwgQXR0cikpCisgICAgcmV0dXJuOworCisgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKKyAgICAgICAgICAgICBDRlVua25vd25UcmFuc2ZlckF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCisgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZU9iakNCcmlkZ2VBdHRyKFNlbWEgJlMsIFNjb3BlICpTYywgRGVjbCAqRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoIWlzYTxSZWNvcmREZWNsPihEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICA8PCBBdHRyLmdldE5hbWUoKQotICAgIDw8IChTLmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzID8gRXhwZWN0ZWRTdHJ1Y3RPclVuaW9uT3JDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRXhwZWN0ZWRTdHJ1Y3RPclVuaW9uKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgCi0gIGlmIChBdHRyLmdldE51bUFyZ3MoKSAhPSAxKSB7Ci0gICAgUy5EaWFnKEQtPmdldExvY1N0YXJ0KCksIGRpYWc6OmVycl9vYmpjX2JyaWRnZV9ub3RfaWQpOwotICAgIHJldHVybjsKLSAgfQotICBJZGVudGlmaWVyTG9jICpQYXJtID0gQXR0ci5pc0FyZ0lkZW50KDApID8gQXR0ci5nZXRBcmdBc0lkZW50KDApIDogMDsKKyAgSWRlbnRpZmllckxvYyAqIFBhcm0gPSBBdHRyLmlzQXJnSWRlbnQoMCkgPyBBdHRyLmdldEFyZ0FzSWRlbnQoMCkgOiAwOworCiAgIGlmICghUGFybSkgewotICAgIFMuRGlhZyhELT5nZXRMb2NTdGFydCgpLCBkaWFnOjplcnJfb2JqY19icmlkZ2Vfbm90X2lkKTsKKyAgICBTLkRpYWcoRC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6ZXJyX29iamNfYXR0cl9ub3RfaWQpIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDA7CiAgICAgcmV0dXJuOwogICB9CiAgIAogICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgT2JqQ0JyaWRnZUF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsIFBhcm0gPyBQYXJtLT5JZGVudCA6IDAsCisgICAgICAgICAgICAgT2JqQ0JyaWRnZUF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsIFBhcm0tPklkZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CiB9CiAKK3N0YXRpYyB2b2lkIGhhbmRsZU9iakNCcmlkZ2VNdXRhYmxlQXR0cihTZW1hICZTLCBTY29wZSAqU2MsIERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBJZGVudGlmaWVyTG9jICogUGFybSA9IEF0dHIuaXNBcmdJZGVudCgwKSA/IEF0dHIuZ2V0QXJnQXNJZGVudCgwKSA6IDA7CisgIAorICBpZiAoIVBhcm0pIHsKKyAgICBTLkRpYWcoRC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6ZXJyX29iamNfYXR0cl9ub3RfaWQpIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDA7CisgICAgcmV0dXJuOworICB9CisgIAorICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCisgICAgICAgICAgICAgT2JqQ0JyaWRnZU11dGFibGVBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LCBQYXJtLT5JZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyKFNlbWEgJlMsIFNjb3BlICpTYywgRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgSWRlbnRpZmllckluZm8gKlJlbGF0ZWRDbGFzcyA9CisgICAgQXR0ci5pc0FyZ0lkZW50KDApID8gQXR0ci5nZXRBcmdBc0lkZW50KDApLT5JZGVudCA6IDA7CisgIGlmICghUmVsYXRlZENsYXNzKSB7CisgICAgUy5EaWFnKEQtPmdldExvY1N0YXJ0KCksIGRpYWc6OmVycl9vYmpjX2F0dHJfbm90X2lkKSA8PCBBdHRyLmdldE5hbWUoKSA8PCAwOworICAgIHJldHVybjsKKyAgfQorICBJZGVudGlmaWVySW5mbyAqQ2xhc3NNZXRob2QgPQorICAgIEF0dHIuZ2V0QXJnQXNJZGVudCgxKSA/IEF0dHIuZ2V0QXJnQXNJZGVudCgxKS0+SWRlbnQgOiAwOworICBJZGVudGlmaWVySW5mbyAqSW5zdGFuY2VNZXRob2QgPQorICAgIEF0dHIuZ2V0QXJnQXNJZGVudCgyKSA/IEF0dHIuZ2V0QXJnQXNJZGVudCgyKS0+SWRlbnQgOiAwOworICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCisgICAgICAgICAgICAgT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LCBSZWxhdGVkQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTWV0aG9kLCBJbnN0YW5jZU1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZU9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXIoU2VtYSAmUywgRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBPYmpDSW50ZXJmYWNlRGVjbCAqSUZhY2U7CisgIGlmIChPYmpDQ2F0ZWdvcnlEZWNsICpDYXREZWNsID0gZHluX2Nhc3Q8T2JqQ0NhdGVnb3J5RGVjbD4oRC0+Z2V0RGVjbENvbnRleHQoKSkpCisgICAgSUZhY2UgPSBDYXREZWNsLT5nZXRDbGFzc0ludGVyZmFjZSgpOworICBlbHNlCisgICAgSUZhY2UgPSBjYXN0PE9iakNJbnRlcmZhY2VEZWNsPihELT5nZXREZWNsQ29udGV4dCgpKTsKKyAgSUZhY2UtPnNldEhhc0Rlc2lnbmF0ZWRJbml0aWFsaXplcnMoKTsKKyAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQorICAgICAgICAgICAgICAgICAgT2JqQ0Rlc2lnbmF0ZWRJbml0aWFsaXplckF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOworfQorCiBzdGF0aWMgdm9pZCBoYW5kbGVPYmpDT3duZXJzaGlwQXR0cihTZW1hICZTLCBEZWNsICpELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewogICBpZiAoaGFzRGVjbGFyYXRvcihEKSkgcmV0dXJuOwpAQCAtNDQzNCwxMiArMzU3OSw2IEBACiAKIHN0YXRpYyB2b2lkIGhhbmRsZU9iakNQcmVjaXNlTGlmZXRpbWVBdHRyKFNlbWEgJlMsIERlY2wgKkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghaXNhPFZhckRlY2w+KEQpICYmICFpc2E8RmllbGREZWNsPihEKSkgewotICAgIFMuRGlhZyhELT5nZXRMb2NTdGFydCgpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0UmFuZ2UoKSA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZFZhcmlhYmxlOwotICAgIHJldHVybjsKLSAgfQotCiAgIFZhbHVlRGVjbCAqdmQgPSBjYXN0PFZhbHVlRGVjbD4oRCk7CiAgIFF1YWxUeXBlIHR5cGUgPSB2ZC0+Z2V0VHlwZSgpOwogCkBAIC00NDgzLDE5ICszNjIyLDE4IEBACiAvLyBNaWNyb3NvZnQgc3BlY2lmaWMgYXR0cmlidXRlIGhhbmRsZXJzLgogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAotLy8gQ2hlY2sgaWYgTVMgZXh0ZW5zaW9ucyBvciBzb21lIG90aGVyIGxhbmd1YWdlIGV4dGVuc2lvbnMgYXJlIGVuYWJsZWQuICBJZgotLy8gbm90LCBpc3N1ZSBhIGRpYWdub3N0aWMgdGhhdCB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlzIHVudXNlZC4KLXN0YXRpYyBib29sIGNoZWNrTWljcm9zb2Z0RXh0KFNlbWEgJlMsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE90aGVyRXh0ZW5zaW9uID0gZmFsc2UpIHsKLSAgaWYgKFMuTGFuZ09wdHMuTWljcm9zb2Z0RXh0IHx8IE90aGVyRXh0ZW5zaW9uKQotICAgIHJldHVybiB0cnVlOwotICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCkgPDwgQXR0ci5nZXROYW1lKCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQogc3RhdGljIHZvaWQgaGFuZGxlVXVpZEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoIWNoZWNrTWljcm9zb2Z0RXh0KFMsIEF0dHIsIFMuTGFuZ09wdHMuQm9ybGFuZCkpCisgIGlmICghUy5MYW5nT3B0cy5DUGx1c1BsdXMpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9ub3Rfc3VwcG9ydGVkX2luX2xhbmcpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBBdHRyaWJ1dGVMYW5nU3VwcG9ydDo6QzsKICAgICByZXR1cm47CisgIH0KKworICBpZiAoIWlzYTxDWFhSZWNvcmREZWNsPihEKSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBFeHBlY3RlZENsYXNzOworICAgIHJldHVybjsKKyAgfQogCiAgIFN0cmluZ1JlZiBTdHJSZWY7CiAgIFNvdXJjZUxvY2F0aW9uIExpdGVyYWxMb2M7CkBAIC00NTI5LDU1ICszNjY3LDMwNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVJbmhlcml0YW5jZUF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoIWNoZWNrTWljcm9zb2Z0RXh0KFMsIEF0dHIpKQorc3RhdGljIHZvaWQgaGFuZGxlTVNJbmhlcml0YW5jZUF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBpZiAoIVMuTGFuZ09wdHMuQ1BsdXNQbHVzKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfbm90X3N1cHBvcnRlZF9pbl9sYW5nKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgQXR0cmlidXRlTGFuZ1N1cHBvcnQ6OkM7CiAgICAgcmV0dXJuOwotCi0gIEF0dHJpYnV0ZUxpc3Q6OktpbmQgS2luZCA9IEF0dHIuZ2V0S2luZCgpOwotICBpZiAoS2luZCA9PSBBdHRyaWJ1dGVMaXN0OjpBVF9TaW5nbGVJbmhlcml0YW5jZSkKLSAgICBELT5hZGRBdHRyKAotICAgICAgICA6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgICAgU2luZ2xlSW5oZXJpdGFuY2VBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotICBlbHNlIGlmIChLaW5kID09IEF0dHJpYnV0ZUxpc3Q6OkFUX011bHRpcGxlSW5oZXJpdGFuY2UpCi0gICAgRC0+YWRkQXR0cigKLSAgICAgICAgOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICAgIE11bHRpcGxlSW5oZXJpdGFuY2VBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci0gIGVsc2UgaWYgKEtpbmQgPT0gQXR0cmlidXRlTGlzdDo6QVRfVmlydHVhbEluaGVyaXRhbmNlKQotICAgIEQtPmFkZEF0dHIoCi0gICAgICAgIDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgICBWaXJ0dWFsSW5oZXJpdGFuY2VBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKKyAgfQorICBNU0luaGVyaXRhbmNlQXR0ciAqSUEgPSBTLm1lcmdlTVNJbmhlcml0YW5jZUF0dHIoCisgICAgICBELCBBdHRyLmdldFJhbmdlKCksIC8qQmVzdENhc2U9Ki90cnVlLAorICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpLAorICAgICAgKE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZylBdHRyLmdldFNlbWFudGljU3BlbGxpbmcoKSk7CisgIGlmIChJQSkKKyAgICBELT5hZGRBdHRyKElBKTsKIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlUG9ydGFiaWxpdHlBdHRyKFNlbWEgJlMsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKLSAgaWYgKCFjaGVja01pY3Jvc29mdEV4dChTLCBBdHRyKSkKK3N0YXRpYyB2b2lkIGhhbmRsZUFSTUludGVycnVwdEF0dHIoU2VtYSAmUywgRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICAvLyBDaGVjayB0aGUgYXR0cmlidXRlIGFyZ3VtZW50cy4KKyAgaWYgKEF0dHIuZ2V0TnVtQXJncygpID4gMSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3Rvb19tYW55X2FyZ3VtZW50cykKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDE7CisgICAgcmV0dXJuOworICB9CisKKyAgU3RyaW5nUmVmIFN0cjsKKyAgU291cmNlTG9jYXRpb24gQXJnTG9jOworCisgIGlmIChBdHRyLmdldE51bUFyZ3MoKSA9PSAwKQorICAgIFN0ciA9ICIiOworICBlbHNlIGlmICghUy5jaGVja1N0cmluZ0xpdGVyYWxBcmd1bWVudEF0dHIoQXR0ciwgMCwgU3RyLCAmQXJnTG9jKSkKICAgICByZXR1cm47CiAKLSAgQXR0cmlidXRlTGlzdDo6S2luZCBLaW5kID0gQXR0ci5nZXRLaW5kKCk7Ci0gICAgaWYgKEtpbmQgPT0gQXR0cmlidXRlTGlzdDo6QVRfV2luNjQpCi0gICAgRC0+YWRkQXR0cigKLSAgICAgICAgOjpuZXcgKFMuQ29udGV4dCkgV2luNjRBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhhbmRsZUZvcmNlSW5saW5lQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7Ci0gIGlmICghY2hlY2tNaWNyb3NvZnRFeHQoUywgQXR0cikpCisgIEFSTUludGVycnVwdEF0dHI6OkludGVycnVwdFR5cGUgS2luZDsKKyAgaWYgKCFBUk1JbnRlcnJ1cHRBdHRyOjpDb252ZXJ0U3RyVG9JbnRlcnJ1cHRUeXBlKFN0ciwgS2luZCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfdHlwZV9ub3Rfc3VwcG9ydGVkKQorICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgU3RyIDw8IEFyZ0xvYzsKICAgICByZXR1cm47CisgIH0KKworICB1bnNpZ25lZCBJbmRleCA9IEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKTsKICAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgIEZvcmNlSW5saW5lQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CisgICAgICAgICAgICAgQVJNSW50ZXJydXB0QXR0cihBdHRyLmdldExvYygpLCBTLkNvbnRleHQsIEtpbmQsIEluZGV4KSk7CiB9CiAKLXN0YXRpYyB2b2lkIGhhbmRsZVNlbGVjdEFueUF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgewotICBpZiAoIWNoZWNrTWljcm9zb2Z0RXh0KFMsIEF0dHIpKQorc3RhdGljIHZvaWQgaGFuZGxlTVNQNDMwSW50ZXJydXB0QXR0cihTZW1hICZTLCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIGlmICghY2hlY2tBdHRyaWJ1dGVOdW1BcmdzKFMsIEF0dHIsIDEpKQogICAgIHJldHVybjsKLSAgLy8gQ2hlY2sgbGlua2FnZSBhZnRlciBwb3NzaWJseSBtZXJnaW5nIGRlY2xhcmF0aW5vcy4gIFNlZQotICAvLyBjaGVja0F0dHJpYnV0ZXNBZnRlck1lcmdpbmcoKS4KKworICBpZiAoIUF0dHIuaXNBcmdFeHByKDApKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfdHlwZSkgPDwgQXR0ci5nZXROYW1lKCkKKyAgICAgIDw8IEFBTlRfQXJndW1lbnRJbnRlZ2VyQ29uc3RhbnQ7CisgICAgcmV0dXJuOyAgICAKKyAgfQorCisgIC8vIEZJWE1FOiBDaGVjayBmb3IgZGVjbCAtIGl0IHNob3VsZCBiZSB2b2lkICgpKHZvaWQpLgorCisgIEV4cHIgKk51bVBhcmFtc0V4cHIgPSBzdGF0aWNfY2FzdDxFeHByICo+KEF0dHIuZ2V0QXJnQXNFeHByKDApKTsKKyAgbGx2bTo6QVBTSW50IE51bVBhcmFtcygzMik7CisgIGlmICghTnVtUGFyYW1zRXhwci0+aXNJbnRlZ2VyQ29uc3RhbnRFeHByKE51bVBhcmFtcywgUy5Db250ZXh0KSkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX2FyZ3VtZW50X3R5cGUpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCBBQU5UX0FyZ3VtZW50SW50ZWdlckNvbnN0YW50CisgICAgICA8PCBOdW1QYXJhbXNFeHByLT5nZXRTb3VyY2VSYW5nZSgpOworICAgIHJldHVybjsKKyAgfQorCisgIHVuc2lnbmVkIE51bSA9IE51bVBhcmFtcy5nZXRMaW1pdGVkVmFsdWUoMjU1KTsKKyAgaWYgKChOdW0gJiAxKSB8fCBOdW0gPiAzMCkgeworICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX2FyZ3VtZW50X291dF9vZl9ib3VuZHMpCisgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAoaW50KU51bVBhcmFtcy5nZXRTRXh0VmFsdWUoKQorICAgICAgPDwgTnVtUGFyYW1zRXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICByZXR1cm47CisgIH0KKwogICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCi0gICAgICAgICAgICAgU2VsZWN0QW55QXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOworICAgICAgICAgICAgICBNU1A0MzBJbnRlcnJ1cHRBdHRyKEF0dHIuZ2V0TG9jKCksIFMuQ29udGV4dCwgTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOworICBELT5hZGRBdHRyKFVzZWRBdHRyOjpDcmVhdGVJbXBsaWNpdChTLkNvbnRleHQpKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlSW50ZXJydXB0QXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIC8vIERpc3BhdGNoIHRoZSBpbnRlcnJ1cHQgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRhcmdldC4KKyAgaWYgKFMuQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkuZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6bXNwNDMwKQorICAgIGhhbmRsZU1TUDQzMEludGVycnVwdEF0dHIoUywgRCwgQXR0cik7CisgIGVsc2UKKyAgICBoYW5kbGVBUk1JbnRlcnJ1cHRBdHRyKFMsIEQsIEF0dHIpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVYODZGb3JjZUFsaWduQXJnUG9pbnRlckF0dHIoU2VtYSAmUywgRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0JiBBdHRyKSB7CisgIC8vIElmIHdlIHRyeSB0byBhcHBseSBpdCB0byBhIGZ1bmN0aW9uIHBvaW50ZXIsIGRvbid0IHdhcm4sIGJ1dCBkb24ndAorICAvLyBkbyBhbnl0aGluZywgZWl0aGVyLiBJdCBkb2Vzbid0IG1hdHRlciBhbnl3YXksIGJlY2F1c2UgdGhlcmUncyBub3RoaW5nCisgIC8vIHNwZWNpYWwgYWJvdXQgY2FsbGluZyBhIGZvcmNlX2FsaWduX2FyZ19wb2ludGVyIGZ1bmN0aW9uLgorICBWYWx1ZURlY2wgKlZEID0gZHluX2Nhc3Q8VmFsdWVEZWNsPihEKTsKKyAgaWYgKFZEICYmIFZELT5nZXRUeXBlKCktPmlzRnVuY3Rpb25Qb2ludGVyVHlwZSgpKQorICAgIHJldHVybjsKKyAgLy8gQWxzbyBkb24ndCB3YXJuIG9uIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZWRlZnMuCisgIFR5cGVkZWZOYW1lRGVjbCAqVEQgPSBkeW5fY2FzdDxUeXBlZGVmTmFtZURlY2w+KEQpOworICBpZiAoVEQgJiYgKFRELT5nZXRVbmRlcmx5aW5nVHlwZSgpLT5pc0Z1bmN0aW9uUG9pbnRlclR5cGUoKSB8fAorICAgIFRELT5nZXRVbmRlcmx5aW5nVHlwZSgpLT5pc0Z1bmN0aW9uVHlwZSgpKSkKKyAgICByZXR1cm47CisgIC8vIEF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGZ1bmN0aW9uIHR5cGVzLgorICBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKKyAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IC8qIGZ1bmN0aW9uICovMDsKKyAgICByZXR1cm47CisgIH0KKworICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpCisgICAgICAgICAgICAgIFg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0cihBdHRyLmdldFJhbmdlKCksIFMuQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKK30KKworRExMSW1wb3J0QXR0ciAqU2VtYTo6bWVyZ2VETExJbXBvcnRBdHRyKERlY2wgKkQsIFNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJTcGVsbGluZ0xpc3RJbmRleCkgeworICBpZiAoRC0+aGFzQXR0cjxETExFeHBvcnRBdHRyPigpKSB7CisgICAgRGlhZyhSYW5nZS5nZXRCZWdpbigpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCAiJ2RsbGltcG9ydCciOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKEQtPmhhc0F0dHI8RExMSW1wb3J0QXR0cj4oKSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gOjpuZXcgKENvbnRleHQpIERMTEltcG9ydEF0dHIoUmFuZ2UsIENvbnRleHQsIEF0dHJTcGVsbGluZ0xpc3RJbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZURMTEltcG9ydEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICAvLyBBdHRyaWJ1dGUgY2FuIGJlIGFwcGxpZWQgb25seSB0byBmdW5jdGlvbnMgb3IgdmFyaWFibGVzLgorICBGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihEKTsKKyAgaWYgKCFGRCAmJiAhaXNhPFZhckRlY2w+KEQpKSB7CisgICAgLy8gQXBwYXJlbnRseSBWaXN1YWwgQysrIHRoaW5rcyBpdCBpcyBva2F5IHRvIG5vdCBlbWl0IGEgd2FybmluZworICAgIC8vIGluIHRoaXMgY2FzZSwgc28gb25seSBlbWl0IGEgd2FybmluZyB3aGVuIC1mbXMtZXh0ZW5zaW9ucyBpcyBub3QKKyAgICAvLyBzcGVjaWZpZWQuCisgICAgaWYgKCFTLmdldExhbmdPcHRzKCkuTWljcm9zb2Z0RXh0KQorICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKKyAgICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgRXhwZWN0ZWRWYXJpYWJsZU9yRnVuY3Rpb247CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQ3VycmVudGx5LCB0aGUgZGxsaW1wb3J0IGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGZvciBpbmxpbmVkIGZ1bmN0aW9ucy4KKyAgLy8gV2FybmluZyBpcyBlbWl0dGVkLgorICBpZiAoRkQgJiYgRkQtPmlzSW5saW5lU3BlY2lmaWVkKCkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCkgPDwgQXR0ci5nZXROYW1lKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgdW5zaWduZWQgSW5kZXggPSBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCk7CisgIERMTEltcG9ydEF0dHIgKk5ld0F0dHIgPSBTLm1lcmdlRExMSW1wb3J0QXR0cihELCBBdHRyLmdldFJhbmdlKCksIEluZGV4KTsKKyAgaWYgKE5ld0F0dHIpCisgICAgRC0+YWRkQXR0cihOZXdBdHRyKTsKK30KKworRExMRXhwb3J0QXR0ciAqU2VtYTo6bWVyZ2VETExFeHBvcnRBdHRyKERlY2wgKkQsIFNvdXJjZVJhbmdlIFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJTcGVsbGluZ0xpc3RJbmRleCkgeworICBpZiAoRExMSW1wb3J0QXR0ciAqSW1wb3J0ID0gRC0+Z2V0QXR0cjxETExJbXBvcnRBdHRyPigpKSB7CisgICAgRGlhZyhJbXBvcnQtPmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX2lnbm9yZWQpIDw8IEltcG9ydDsKKyAgICBELT5kcm9wQXR0cjxETExJbXBvcnRBdHRyPigpOworICB9CisKKyAgaWYgKEQtPmhhc0F0dHI8RExMRXhwb3J0QXR0cj4oKSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gOjpuZXcgKENvbnRleHQpIERMTEV4cG9ydEF0dHIoUmFuZ2UsIENvbnRleHQsIEF0dHJTcGVsbGluZ0xpc3RJbmRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZURMTEV4cG9ydEF0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICAvLyBDdXJyZW50bHksIHRoZSBkbGxleHBvcnQgYXR0cmlidXRlIGlzIGlnbm9yZWQgZm9yIGlubGluZWQgZnVuY3Rpb25zLCB1bmxlc3MKKyAgLy8gdGhlIC1ma2VlcC1pbmxpbmUtZnVuY3Rpb25zIGZsYWcgaGFzIGJlZW4gdXNlZC4gV2FybmluZyBpcyBlbWl0dGVkLgorICBpZiAoaXNhPEZ1bmN0aW9uRGVjbD4oRCkgJiYgY2FzdDxGdW5jdGlvbkRlY2w+KEQpLT5pc0lubGluZVNwZWNpZmllZCgpKSB7CisgICAgLy8gRklYTUU6IC4uLiB1bmxlc3MgdGhlIC1ma2VlcC1pbmxpbmUtZnVuY3Rpb25zIGZsYWcgaGFzIGJlZW4gdXNlZC4KKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCkgPDwgQXR0ci5nZXROYW1lKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgdW5zaWduZWQgSW5kZXggPSBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCk7CisgIERMTEV4cG9ydEF0dHIgKk5ld0F0dHIgPSBTLm1lcmdlRExMRXhwb3J0QXR0cihELCBBdHRyLmdldFJhbmdlKCksIEluZGV4KTsKKyAgaWYgKE5ld0F0dHIpCisgICAgRC0+YWRkQXR0cihOZXdBdHRyKTsKK30KKworTVNJbmhlcml0YW5jZUF0dHIgKgorU2VtYTo6bWVyZ2VNU0luaGVyaXRhbmNlQXR0cihEZWNsICpELCBTb3VyY2VSYW5nZSBSYW5nZSwgYm9vbCBCZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXR0clNwZWxsaW5nTGlzdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0luaGVyaXRhbmNlQXR0cjo6U3BlbGxpbmcgU2VtYW50aWNTcGVsbGluZykgeworICBpZiAoTVNJbmhlcml0YW5jZUF0dHIgKklBID0gRC0+Z2V0QXR0cjxNU0luaGVyaXRhbmNlQXR0cj4oKSkgeworICAgIGlmIChJQS0+Z2V0U2VtYW50aWNTcGVsbGluZygpID09IFNlbWFudGljU3BlbGxpbmcpCisgICAgICByZXR1cm4gMDsKKyAgICBEaWFnKElBLT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfbWlzbWF0Y2hlZF9tc19pbmhlcml0YW5jZSkKKyAgICAgICAgPDwgMSAvKnByZXZpb3VzIGRlY2xhcmF0aW9uKi87CisgICAgRGlhZyhSYW5nZS5nZXRCZWdpbigpLCBkaWFnOjpub3RlX3ByZXZpb3VzX21zX2luaGVyaXRhbmNlKTsKKyAgICBELT5kcm9wQXR0cjxNU0luaGVyaXRhbmNlQXR0cj4oKTsKKyAgfQorCisgIENYWFJlY29yZERlY2wgKlJEID0gY2FzdDxDWFhSZWNvcmREZWNsPihEKTsKKyAgaWYgKFJELT5oYXNEZWZpbml0aW9uKCkpIHsKKyAgICBpZiAoY2hlY2tNU0luaGVyaXRhbmNlQXR0ck9uRGVmaW5pdGlvbihSRCwgUmFuZ2UsIEJlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFudGljU3BlbGxpbmcpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGlzYTxDbGFzc1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbD4oUkQpKSB7CisgICAgICBEaWFnKFJhbmdlLmdldEJlZ2luKCksIGRpYWc6Ondhcm5faWdub3JlZF9tc19pbmhlcml0YW5jZSkKKyAgICAgICAgICA8PCAxIC8qcGFydGlhbCBzcGVjaWFsaXphdGlvbiovOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChSRC0+Z2V0RGVzY3JpYmVkQ2xhc3NUZW1wbGF0ZSgpKSB7CisgICAgICBEaWFnKFJhbmdlLmdldEJlZ2luKCksIGRpYWc6Ondhcm5faWdub3JlZF9tc19pbmhlcml0YW5jZSkKKyAgICAgICAgICA8PCAwIC8qcHJpbWFyeSB0ZW1wbGF0ZSovOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDo6bmV3IChDb250ZXh0KQorICAgICAgTVNJbmhlcml0YW5jZUF0dHIoUmFuZ2UsIENvbnRleHQsIEJlc3RDYXNlLCBBdHRyU3BlbGxpbmdMaXN0SW5kZXgpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVDYXBhYmlsaXR5QXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIC8vIFRoZSBjYXBhYmlsaXR5IGF0dHJpYnV0ZXMgdGFrZSBhIHNpbmdsZSBzdHJpbmcgcGFyYW1ldGVyIGZvciB0aGUgbmFtZSBvZgorICAvLyB0aGUgY2FwYWJpbGl0eSB0aGV5IHJlcHJlc2VudC4gVGhlIGxvY2thYmxlIGF0dHJpYnV0ZSBkb2VzIG5vdCB0YWtlIGFueQorICAvLyBwYXJhbWV0ZXJzLiBIb3dldmVyLCBzZW1hbnRpY2FsbHksIGJvdGggYXR0cmlidXRlcyByZXByZXNlbnQgdGhlIHNhbWUKKyAgLy8gY29uY2VwdCwgYW5kIHNvIHRoZXkgdXNlIHRoZSBzYW1lIHNlbWFudGljIGF0dHJpYnV0ZS4gRXZlbnR1YWxseSwgdGhlCisgIC8vIGxvY2thYmxlIGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQuCisgIC8vCisgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYW55IGNhcGFiaWxpdHkgd2hpY2ggaGFzIG5vIHNwZWNpZmllZCBzdHJpbmcKKyAgLy8gbGl0ZXJhbCB3aWxsIGJlIGNvbnNpZGVyZWQgYSAibXV0ZXguIgorICBTdHJpbmdSZWYgTigibXV0ZXgiKTsKKyAgU291cmNlTG9jYXRpb24gTGl0ZXJhbExvYzsKKyAgaWYgKEF0dHIuZ2V0S2luZCgpID09IEF0dHJpYnV0ZUxpc3Q6OkFUX0NhcGFiaWxpdHkgJiYKKyAgICAgICFTLmNoZWNrU3RyaW5nTGl0ZXJhbEFyZ3VtZW50QXR0cihBdHRyLCAwLCBOLCAmTGl0ZXJhbExvYykpCisgICAgcmV0dXJuOworCisgIC8vIEN1cnJlbnRseSwgdGhlcmUgYXJlIG9ubHkgdHdvIG5hbWVzIGFsbG93ZWQgZm9yIGEgY2FwYWJpbGl0eTogcm9sZSBhbmQKKyAgLy8gbXV0ZXggKGNhc2UgaW5zZW5zaXRpdmUpLiBEaWFnbm9zZSBvdGhlciBjYXBhYmlsaXR5IG5hbWVzLgorICBpZiAoIU4uZXF1YWxzX2xvd2VyKCJtdXRleCIpICYmICFOLmVxdWFsc19sb3dlcigicm9sZSIpKQorICAgIFMuRGlhZyhMaXRlcmFsTG9jLCBkaWFnOjp3YXJuX2ludmFsaWRfY2FwYWJpbGl0eV9uYW1lKSA8PCBOOworCisgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkgQ2FwYWJpbGl0eUF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsIE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZUFzc2VydENhcGFiaWxpdHlBdHRyKFNlbWEgJlMsIERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkgQXNzZXJ0Q2FwYWJpbGl0eUF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBcmdBc0V4cHIoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZUFjcXVpcmVDYXBhYmlsaXR5QXR0cihTZW1hICZTLCBEZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgU21hbGxWZWN0b3I8RXhwciosIDE+IEFyZ3M7CisgIGlmICghY2hlY2tMb2NrRnVuQXR0ckNvbW1vbihTLCBELCBBdHRyLCBBcmdzKSkKKyAgICByZXR1cm47CisKKyAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KSBBY3F1aXJlQ2FwYWJpbGl0eUF0dHIoQXR0ci5nZXRSYW5nZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MuZGF0YSgpLCBBcmdzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlVHJ5QWNxdWlyZUNhcGFiaWxpdHlBdHRyKFNlbWEgJlMsIERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICBTbWFsbFZlY3RvcjxFeHByKiwgMj4gQXJnczsKKyAgaWYgKCFjaGVja1RyeUxvY2tGdW5BdHRyQ29tbW9uKFMsIEQsIEF0dHIsIEFyZ3MpKQorICAgIHJldHVybjsKKworICBELT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpIFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cihBdHRyLmdldFJhbmdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBcmdBc0V4cHIoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlUmVsZWFzZUNhcGFiaWxpdHlBdHRyKFNlbWEgJlMsIERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICAvLyBDaGVjayB0aGF0IGFsbCBhcmd1bWVudHMgYXJlIGxvY2thYmxlIG9iamVjdHMuCisgIFNtYWxsVmVjdG9yPEV4cHIgKiwgMT4gQXJnczsKKyAgY2hlY2tBdHRyQXJnc0FyZUNhcGFiaWxpdHlPYmpzKFMsIEQsIEF0dHIsIEFyZ3MsIDAsIHRydWUpOworCisgIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkgUmVsZWFzZUNhcGFiaWxpdHlBdHRyKAorICAgICAgQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsIEFyZ3MuZGF0YSgpLCBBcmdzLnNpemUoKSwKKyAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVSZXF1aXJlc0NhcGFiaWxpdHlBdHRyKFNlbWEgJlMsIERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIpIHsKKyAgaWYgKCFjaGVja0F0dHJpYnV0ZUF0TGVhc3ROdW1BcmdzKFMsIEF0dHIsIDEpKQorICAgIHJldHVybjsKKworICAvLyBjaGVjayB0aGF0IGFsbCBhcmd1bWVudHMgYXJlIGxvY2thYmxlIG9iamVjdHMKKyAgU21hbGxWZWN0b3I8RXhwciosIDE+IEFyZ3M7CisgIGNoZWNrQXR0ckFyZ3NBcmVDYXBhYmlsaXR5T2JqcyhTLCBELCBBdHRyLCBBcmdzKTsKKyAgaWYgKEFyZ3MuZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgUmVxdWlyZXNDYXBhYmlsaXR5QXR0ciAqUkNBID0gOjpuZXcgKFMuQ29udGV4dCkKKyAgICBSZXF1aXJlc0NhcGFiaWxpdHlBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LCBBcmdzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3Muc2l6ZSgpLCBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpOworCisgIEQtPmFkZEF0dHIoUkNBKTsKIH0KIAogLy8vIEhhbmRsZXMgc2VtYW50aWMgY2hlY2tpbmcgZm9yIGZlYXR1cmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgYXR0cmlidXRlcywKQEAgLTQ1OTEsMTUgKzM5NzksMjQgQEAKICAgLy8gV2UgYWxzbyBiYWlsIG9uIHVua25vd24gYW5kIGlnbm9yZWQgYXR0cmlidXRlcyBiZWNhdXNlIHRob3NlIGFyZSBoYW5kbGVkCiAgIC8vIGFzIHBhcnQgb2YgdGhlIHRhcmdldC1zcGVjaWZpYyBoYW5kbGluZyBsb2dpYy4KICAgaWYgKEF0dHIuaGFzQ3VzdG9tUGFyc2luZygpIHx8Ci0gICAgICBBdHRyLmdldEtpbmQoKSA9PSBBdHRyaWJ1dGVMaXN0OjpVbmtub3duQXR0cmlidXRlIHx8Ci0gICAgICBBdHRyLmdldEtpbmQoKSA9PSBBdHRyaWJ1dGVMaXN0OjpJZ25vcmVkQXR0cmlidXRlKQorICAgICAgQXR0ci5nZXRLaW5kKCkgPT0gQXR0cmlidXRlTGlzdDo6VW5rbm93bkF0dHJpYnV0ZSkKICAgICByZXR1cm4gZmFsc2U7CiAKKyAgLy8gQ2hlY2sgd2hldGhlciB0aGUgYXR0cmlidXRlIHJlcXVpcmVzIHNwZWNpZmljIGxhbmd1YWdlIGV4dGVuc2lvbnMgdG8gYmUKKyAgLy8gZW5hYmxlZC4KKyAgaWYgKCFBdHRyLmRpYWdub3NlTGFuZ09wdHMoUykpCisgICAgcmV0dXJuIHRydWU7CisKICAgLy8gSWYgdGhlcmUgYXJlIG5vIG9wdGlvbmFsIGFyZ3VtZW50cywgdGhlbiBjaGVja2luZyBmb3IgdGhlIGFyZ3VtZW50IGNvdW50CiAgIC8vIGlzIHRyaXZpYWwuCiAgIGlmIChBdHRyLmdldE1pbkFyZ3MoKSA9PSBBdHRyLmdldE1heEFyZ3MoKSAmJgogICAgICAgIWNoZWNrQXR0cmlidXRlTnVtQXJncyhTLCBBdHRyLCBBdHRyLmdldE1pbkFyZ3MoKSkpCiAgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gQ2hlY2sgd2hldGhlciB0aGUgYXR0cmlidXRlIGFwcGVydGFpbnMgdG8gdGhlIGdpdmVuIHN1YmplY3QuCisgIGlmICghQXR0ci5kaWFnbm9zZUFwcGVydGFpbnNUbyhTLCBEKSkKKyAgICByZXR1cm4gdHJ1ZTsKKwogICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTQ2MTMsNyArNDAxMCw3IEBACiBzdGF0aWMgdm9pZCBQcm9jZXNzRGVjbEF0dHJpYnV0ZShTZW1hICZTLCBTY29wZSAqc2NvcGUsIERlY2wgKkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlQ1hYMTFBdHRyaWJ1dGVzKSB7Ci0gIGlmIChBdHRyLmlzSW52YWxpZCgpKQorICBpZiAoQXR0ci5pc0ludmFsaWQoKSB8fCBBdHRyLmdldEtpbmQoKSA9PSBBdHRyaWJ1dGVMaXN0OjpJZ25vcmVkQXR0cmlidXRlKQogICAgIHJldHVybjsKIAogICAvLyBJZ25vcmUgQysrMTEgYXR0cmlidXRlcyBvbiBkZWNsYXJhdG9yIGNodW5rczogdGhleSBhcHBlcnRhaW4gdG8gdGhlIHR5cGUKQEAgLTQ2MjEsMTQ2ICs0MDE4LDI3NyBAQAogICBpZiAoQXR0ci5pc0NYWDExQXR0cmlidXRlKCkgJiYgIUluY2x1ZGVDWFgxMUF0dHJpYnV0ZXMpCiAgICAgcmV0dXJuOwogCisgIC8vIFVua25vd24gYXR0cmlidXRlcyBhcmUgYXV0b21hdGljYWxseSB3YXJuZWQgb24uIFRhcmdldC1zcGVjaWZpYyBhdHRyaWJ1dGVzCisgIC8vIHdoaWNoIGRvIG5vdCBhcHBseSB0byB0aGUgY3VycmVudCB0YXJnZXQgYXJjaGl0ZWN0dXJlIGFyZSB0cmVhdGVkIGFzCisgIC8vIHRob3VnaCB0aGV5IHdlcmUgdW5rbm93biBhdHRyaWJ1dGVzLgorICBpZiAoQXR0ci5nZXRLaW5kKCkgPT0gQXR0cmlidXRlTGlzdDo6VW5rbm93bkF0dHJpYnV0ZSB8fAorICAgICAgIUF0dHIuZXhpc3RzSW5UYXJnZXQoUy5Db250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRUcmlwbGUoKSkpIHsKKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgQXR0ci5pc0RlY2xzcGVjQXR0cmlidXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGlhZzo6d2Fybl91bmhhbmRsZWRfbXNfYXR0cmlidXRlX2lnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGlhZzo6d2Fybl91bmtub3duX2F0dHJpYnV0ZV9pZ25vcmVkKQorICAgICAgICA8PCBBdHRyLmdldE5hbWUoKTsKKyAgICByZXR1cm47CisgIH0KKwogICBpZiAoaGFuZGxlQ29tbW9uQXR0cmlidXRlRmVhdHVyZXMoUywgc2NvcGUsIEQsIEF0dHIpKQogICAgIHJldHVybjsKIAogICBzd2l0Y2ggKEF0dHIuZ2V0S2luZCgpKSB7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfSUJBY3Rpb246ICAgIGhhbmRsZUlCQWN0aW9uKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9JQk91dGxldDogICAgaGFuZGxlSUJPdXRsZXQoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0lCT3V0bGV0Q29sbGVjdGlvbjoKLSAgICBoYW5kbGVJQk91dGxldENvbGxlY3Rpb24oUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0FkZHJlc3NTcGFjZToKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDR0M6Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfVmVjdG9yU2l6ZToKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9OZW9uVmVjdG9yVHlwZToKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9OZW9uUG9seVZlY3RvclR5cGU6Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfUHRyMzI6Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfUHRyNjQ6Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfU1B0cjoKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9VUHRyOgotICAgIC8vIElnbm9yZSB0aGVzZSwgdGhlc2UgYXJlIHR5cGUgYXR0cmlidXRlcywgaGFuZGxlZCBieQotICAgIC8vIFByb2Nlc3NUeXBlQXR0cmlidXRlcy4KKyAgZGVmYXVsdDoKKyAgICAvLyBUeXBlIGF0dHJpYnV0ZXMgYXJlIGhhbmRsZWQgZWxzZXdoZXJlOyBzaWxlbnRseSBtb3ZlIG9uLgorICAgIGFzc2VydChBdHRyLmlzVHlwZUF0dHIoKSAmJiAiTm9uLXR5cGUgYXR0cmlidXRlIG5vdCBoYW5kbGVkIik7CiAgICAgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQWxpYXM6ICAgICAgIGhhbmRsZUFsaWFzQXR0ciAgICAgICAoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0FsaWduZWQ6ICAgICBoYW5kbGVBbGlnbmVkQXR0ciAgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9BbGxvY1NpemU6ICAgaGFuZGxlQWxsb2NTaXplQXR0ciAgIChTLCBELCBBdHRyKTsgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfSW50ZXJydXB0OgorICAgIGhhbmRsZUludGVycnVwdEF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfWDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXI6CisgICAgaGFuZGxlWDg2Rm9yY2VBbGlnbkFyZ1BvaW50ZXJBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0RMTEV4cG9ydDoKKyAgICBoYW5kbGVETExFeHBvcnRBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0RMTEltcG9ydDoKKyAgICBoYW5kbGVETExJbXBvcnRBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX01pcHMxNjoKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8TWlwczE2QXR0cj4oUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTm9NaXBzMTY6CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPE5vTWlwczE2QXR0cj4oUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfSUJBY3Rpb246CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPElCQWN0aW9uQXR0cj4oUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfSUJPdXRsZXQ6CisgICAgaGFuZGxlSUJPdXRsZXQoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfSUJPdXRsZXRDb2xsZWN0aW9uOgorICAgIGhhbmRsZUlCT3V0bGV0Q29sbGVjdGlvbihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9BbGlhczoKKyAgICBoYW5kbGVBbGlhc0F0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQWxpZ25lZDoKKyAgICBoYW5kbGVBbGlnbmVkQXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9BbHdheXNJbmxpbmU6Ci0gICAgaGFuZGxlQWx3YXlzSW5saW5lQXR0ciAgKFMsIEQsIEF0dHIpOyBicmVhazsKKyAgICBoYW5kbGVBbHdheXNJbmxpbmVBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOwogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0FuYWx5emVyTm9SZXR1cm46Ci0gICAgaGFuZGxlQW5hbHl6ZXJOb1JldHVybkF0dHIgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfVExTTW9kZWw6ICAgIGhhbmRsZVRMU01vZGVsQXR0ciAgICAoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0Fubm90YXRlOiAgICBoYW5kbGVBbm5vdGF0ZUF0dHIgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9BdmFpbGFiaWxpdHk6aGFuZGxlQXZhaWxhYmlsaXR5QXR0cihTLCBELCBBdHRyKTsgYnJlYWs7CisgICAgaGFuZGxlQW5hbHl6ZXJOb1JldHVybkF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfVExTTW9kZWw6CisgICAgaGFuZGxlVExTTW9kZWxBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0Fubm90YXRlOgorICAgIGhhbmRsZUFubm90YXRlQXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9BdmFpbGFiaWxpdHk6CisgICAgaGFuZGxlQXZhaWxhYmlsaXR5QXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9DYXJyaWVzRGVwZW5kZW5jeToKICAgICBoYW5kbGVEZXBlbmRlbmN5QXR0cihTLCBzY29wZSwgRCwgQXR0cik7CiAgICAgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ29tbW9uOiAgICAgIGhhbmRsZUNvbW1vbkF0dHIgICAgICAoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0NVREFDb25zdGFudDpoYW5kbGVDb25zdGFudEF0dHIgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Db25zdHJ1Y3RvcjogaGFuZGxlQ29uc3RydWN0b3JBdHRyIChTLCBELCBBdHRyKTsgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ29tbW9uOgorICAgIGhhbmRsZUNvbW1vbkF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ1VEQUNvbnN0YW50OgorICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxDVURBQ29uc3RhbnRBdHRyPihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Db25zdHJ1Y3RvcjoKKyAgICBoYW5kbGVDb25zdHJ1Y3RvckF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ1hYMTFOb1JldHVybjoKLSAgICBoYW5kbGVDWFgxMU5vUmV0dXJuQXR0cihTLCBELCBBdHRyKTsKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8Q1hYMTFOb1JldHVybkF0dHI+KFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOwogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0RlcHJlY2F0ZWQ6CiAgICAgaGFuZGxlQXR0cldpdGhNZXNzYWdlPERlcHJlY2F0ZWRBdHRyPihTLCBELCBBdHRyKTsKICAgICBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9EZXN0cnVjdG9yOiAgaGFuZGxlRGVzdHJ1Y3RvckF0dHIgIChTLCBELCBBdHRyKTsgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfRGVzdHJ1Y3RvcjoKKyAgICBoYW5kbGVEZXN0cnVjdG9yQXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9FbmFibGVJZjoKKyAgICBoYW5kbGVFbmFibGVJZkF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfRXh0VmVjdG9yVHlwZToKICAgICBoYW5kbGVFeHRWZWN0b3JUeXBlQXR0cihTLCBzY29wZSwgRCwgQXR0cik7CiAgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTWluU2l6ZToKLSAgICBoYW5kbGVNaW5TaXplQXR0cihTLCBELCBBdHRyKTsKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8TWluU2l6ZUF0dHI+KFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0Zvcm1hdDogICAgICBoYW5kbGVGb3JtYXRBdHRyICAgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Gb3JtYXRBcmc6ICAgaGFuZGxlRm9ybWF0QXJnQXR0ciAgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ1VEQUdsb2JhbDogIGhhbmRsZUdsb2JhbEF0dHIgICAgICAoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0NVREFEZXZpY2U6ICBoYW5kbGVEZXZpY2VBdHRyICAgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9DVURBSG9zdDogICAgaGFuZGxlSG9zdEF0dHIgICAgICAgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfR05VSW5saW5lOiAgIGhhbmRsZUdOVUlubGluZUF0dHIgICAoUywgRCwgQXR0cik7IGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX09wdGltaXplTm9uZToKKyAgICBoYW5kbGVPcHRpbWl6ZU5vbmVBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0Zvcm1hdDoKKyAgICBoYW5kbGVGb3JtYXRBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0Zvcm1hdEFyZzoKKyAgICBoYW5kbGVGb3JtYXRBcmdBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0NVREFHbG9iYWw6CisgICAgaGFuZGxlR2xvYmFsQXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9DVURBRGV2aWNlOgorICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxDVURBRGV2aWNlQXR0cj4oUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ1VEQUhvc3Q6CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPENVREFIb3N0QXR0cj4oUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfR05VSW5saW5lOgorICAgIGhhbmRsZUdOVUlubGluZUF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ1VEQUxhdW5jaEJvdW5kczoKICAgICBoYW5kbGVMYXVuY2hCb3VuZHNBdHRyKFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0tlcm5lbDogICAgICBoYW5kbGVLZXJuZWxBdHRyICAgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9NYWxsb2M6ICAgICAgaGFuZGxlTWFsbG9jQXR0ciAgICAgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTWF5QWxpYXM6ICAgIGhhbmRsZU1heUFsaWFzQXR0ciAgICAoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX01vZGU6ICAgICAgICBoYW5kbGVNb2RlQXR0ciAgICAgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Ob0NvbW1vbjogICAgaGFuZGxlTm9Db21tb25BdHRyICAgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTm9uTnVsbDogICAgIGhhbmRsZU5vbk51bGxBdHRyICAgICAoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX092ZXJsb2FkYWJsZTpoYW5kbGVPdmVybG9hZGFibGVBdHRyKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9vd25lcnNoaXBfcmV0dXJuczoKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9vd25lcnNoaXBfdGFrZXM6Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfb3duZXJzaGlwX2hvbGRzOgotICAgICAgaGFuZGxlT3duZXJzaGlwQXR0ciAgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Db2xkOiAgICAgICAgaGFuZGxlQ29sZEF0dHIgICAgICAgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfSG90OiAgICAgICAgIGhhbmRsZUhvdEF0dHIgICAgICAgICAoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX05ha2VkOiAgICAgICBoYW5kbGVOYWtlZEF0dHIgICAgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Ob1JldHVybjogICAgaGFuZGxlTm9SZXR1cm5BdHRyICAgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTm9UaHJvdzogICAgIGhhbmRsZU5vdGhyb3dBdHRyICAgICAoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0NVREFTaGFyZWQ6ICBoYW5kbGVTaGFyZWRBdHRyICAgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9WZWNSZXR1cm46ICAgaGFuZGxlVmVjUmV0dXJuQXR0ciAgIChTLCBELCBBdHRyKTsgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfS2VybmVsOgorICAgIGhhbmRsZUtlcm5lbEF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTWFsbG9jOgorICAgIGhhbmRsZU1hbGxvY0F0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTWF5QWxpYXM6CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPE1heUFsaWFzQXR0cj4oUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTW9kZToKKyAgICBoYW5kbGVNb2RlQXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Ob0NvbW1vbjoKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8Tm9Db21tb25BdHRyPihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Ob25OdWxsOgorICAgIGlmIChQYXJtVmFyRGVjbCAqUFZEID0gZHluX2Nhc3Q8UGFybVZhckRlY2w+KEQpKQorICAgICAgaGFuZGxlTm9uTnVsbEF0dHJQYXJhbWV0ZXIoUywgUFZELCBBdHRyKTsKKyAgICBlbHNlCisgICAgICBoYW5kbGVOb25OdWxsQXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9SZXR1cm5zTm9uTnVsbDoKKyAgICBoYW5kbGVSZXR1cm5zTm9uTnVsbEF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfT3ZlcmxvYWRhYmxlOgorICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxPdmVybG9hZGFibGVBdHRyPihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Pd25lcnNoaXA6CisgICAgaGFuZGxlT3duZXJzaGlwQXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Db2xkOgorICAgIGhhbmRsZUNvbGRBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0hvdDoKKyAgICBoYW5kbGVIb3RBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX05ha2VkOgorICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxOYWtlZEF0dHI+KFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX05vUmV0dXJuOgorICAgIGhhbmRsZU5vUmV0dXJuQXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Ob1Rocm93OgorICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxOb1Rocm93QXR0cj4oUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ1VEQVNoYXJlZDoKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8Q1VEQVNoYXJlZEF0dHI+KFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1ZlY1JldHVybjoKKyAgICBoYW5kbGVWZWNSZXR1cm5BdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOwogCiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfT2JqQ093bmVyc2hpcDoKLSAgICBoYW5kbGVPYmpDT3duZXJzaGlwQXR0cihTLCBELCBBdHRyKTsgYnJlYWs7CisgICAgaGFuZGxlT2JqQ093bmVyc2hpcEF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfT2JqQ1ByZWNpc2VMaWZldGltZToKLSAgICBoYW5kbGVPYmpDUHJlY2lzZUxpZmV0aW1lQXR0cihTLCBELCBBdHRyKTsgYnJlYWs7CisgICAgaGFuZGxlT2JqQ1ByZWNpc2VMaWZldGltZUF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CiAKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDUmV0dXJuc0lubmVyUG9pbnRlcjoKLSAgICBoYW5kbGVPYmpDUmV0dXJuc0lubmVyUG9pbnRlckF0dHIoUywgRCwgQXR0cik7IGJyZWFrOworICAgIGhhbmRsZU9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKIAogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNSZXF1aXJlc1N1cGVyOgotICAgICAgaGFuZGxlT2JqQ1JlcXVpcmVzU3VwZXJBdHRyKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgICAgIAotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX05TQnJpZGdlZDoKLSAgICBoYW5kbGVOU0JyaWRnZWRBdHRyKFMsIHNjb3BlLCBELCBBdHRyKTsgYnJlYWs7Ci0gICAgICAKKyAgICBoYW5kbGVPYmpDUmVxdWlyZXNTdXBlckF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDQnJpZGdlOgotICAgIGhhbmRsZU9iakNCcmlkZ2VBdHRyKFMsIHNjb3BlLCBELCBBdHRyKTsgYnJlYWs7CisgICAgaGFuZGxlT2JqQ0JyaWRnZUF0dHIoUywgc2NvcGUsIEQsIEF0dHIpOworICAgIGJyZWFrOworCisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfT2JqQ0JyaWRnZU11dGFibGU6CisgICAgaGFuZGxlT2JqQ0JyaWRnZU11dGFibGVBdHRyKFMsIHNjb3BlLCBELCBBdHRyKTsKKyAgICBicmVhazsKKworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNCcmlkZ2VSZWxhdGVkOgorICAgIGhhbmRsZU9iakNCcmlkZ2VSZWxhdGVkQXR0cihTLCBzY29wZSwgRCwgQXR0cik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDRGVzaWduYXRlZEluaXRpYWxpemVyOgorICAgIGhhbmRsZU9iakNEZXNpZ25hdGVkSW5pdGlhbGl6ZXIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CiAKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9DRkF1ZGl0ZWRUcmFuc2ZlcjoKKyAgICBoYW5kbGVDRkF1ZGl0ZWRUcmFuc2ZlckF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ0ZVbmtub3duVHJhbnNmZXI6Ci0gICAgaGFuZGxlQ0ZUcmFuc2ZlckF0dHIoUywgRCwgQXR0cik7IGJyZWFrOworICAgIGhhbmRsZUNGVW5rbm93blRyYW5zZmVyQXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKIAotICAvLyBDaGVja2VyLXNwZWNpZmljLgogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0NGQ29uc3VtZWQ6Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTlNDb25zdW1lZDogIGhhbmRsZU5TQ29uc3VtZWRBdHRyICAoUywgRCwgQXR0cik7IGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX05TQ29uc3VtZWQ6CisgICAgaGFuZGxlTlNDb25zdW1lZEF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTlNDb25zdW1lc1NlbGY6Ci0gICAgaGFuZGxlTlNDb25zdW1lc1NlbGZBdHRyKFMsIEQsIEF0dHIpOyBicmVhazsKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8TlNDb25zdW1lc1NlbGZBdHRyPihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKIAogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX05TUmV0dXJuc0F1dG9yZWxlYXNlZDoKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9OU1JldHVybnNOb3RSZXRhaW5lZDoKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9DRlJldHVybnNOb3RSZXRhaW5lZDoKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9OU1JldHVybnNSZXRhaW5lZDoKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9DRlJldHVybnNSZXRhaW5lZDoKLSAgICBoYW5kbGVOU1JldHVybnNSZXRhaW5lZEF0dHIoUywgRCwgQXR0cik7IGJyZWFrOwotCisgICAgaGFuZGxlTlNSZXR1cm5zUmV0YWluZWRBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOwogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1dvcmtHcm91cFNpemVIaW50OgorICAgIGhhbmRsZVdvcmtHcm91cFNpemU8V29ya0dyb3VwU2l6ZUhpbnRBdHRyPihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9SZXFkV29ya0dyb3VwU2l6ZToKLSAgICBoYW5kbGVXb3JrR3JvdXBTaXplKFMsIEQsIEF0dHIpOyBicmVhazsKLQorICAgIGhhbmRsZVdvcmtHcm91cFNpemU8UmVxZFdvcmtHcm91cFNpemVBdHRyPihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9WZWNUeXBlSGludDoKLSAgICBoYW5kbGVWZWNUeXBlSGludChTLCBELCBBdHRyKTsgYnJlYWs7CisgICAgaGFuZGxlVmVjVHlwZUhpbnQoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CiAKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Jbml0UHJpb3JpdHk6IAotICAgICAgaGFuZGxlSW5pdFByaW9yaXR5QXR0cihTLCBELCBBdHRyKTsgYnJlYWs7Ci0gICAgICAKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9QYWNrZWQ6ICAgICAgaGFuZGxlUGFja2VkQXR0ciAgICAgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfU2VjdGlvbjogICAgIGhhbmRsZVNlY3Rpb25BdHRyICAgICAoUywgRCwgQXR0cik7IGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0luaXRQcmlvcml0eToKKyAgICBoYW5kbGVJbml0UHJpb3JpdHlBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworCisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfUGFja2VkOgorICAgIGhhbmRsZVBhY2tlZEF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfU2VjdGlvbjoKKyAgICBoYW5kbGVTZWN0aW9uQXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9VbmF2YWlsYWJsZToKICAgICBoYW5kbGVBdHRyV2l0aE1lc3NhZ2U8VW5hdmFpbGFibGVBdHRyPihTLCBELCBBdHRyKTsKICAgICBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9BcmNXZWFrcmVmVW5hdmFpbGFibGU6IAotICAgIGhhbmRsZUFyY1dlYWtyZWZVbmF2YWlsYWJsZUF0dHIgKFMsIEQsIEF0dHIpOyAKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9BcmNXZWFrcmVmVW5hdmFpbGFibGU6CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPEFyY1dlYWtyZWZVbmF2YWlsYWJsZUF0dHI+KFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOwogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNSb290Q2xhc3M6Ci0gICAgaGFuZGxlT2JqQ1Jvb3RDbGFzc0F0dHIoUywgRCwgQXR0cik7CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPE9iakNSb290Q2xhc3NBdHRyPihTLCBELCBBdHRyKTsKICAgICBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnM6IAotICAgIGhhbmRsZU9iakNSZXF1aXJlc1Byb3BlcnR5RGVmc0F0dHIgKFMsIEQsIEF0dHIpOyAKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDRXhwbGljaXRQcm90b2NvbEltcGw6CisgICAgaGFuZGxlT2JqQ1N1cHByZXNQcm90b2NvbEF0dHIoUywgRCwgQXR0cik7CiAgICAgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfVW51c2VkOiAgICAgIGhhbmRsZVVudXNlZEF0dHIgICAgICAoUywgRCwgQXR0cik7IGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX09iakNSZXF1aXJlc1Byb3BlcnR5RGVmczoKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8T2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzQXR0cj4oUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfVW51c2VkOgorICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxVbnVzZWRBdHRyPihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9SZXR1cm5zVHdpY2U6Ci0gICAgaGFuZGxlUmV0dXJuc1R3aWNlQXR0cihTLCBELCBBdHRyKTsKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8UmV0dXJuc1R3aWNlQXR0cj4oUywgRCwgQXR0cik7CiAgICAgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfVXNlZDogICAgICAgIGhhbmRsZVVzZWRBdHRyICAgICAgICAoUywgRCwgQXR0cik7IGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1VzZWQ6CisgICAgaGFuZGxlVXNlZEF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfVmlzaWJpbGl0eToKICAgICBoYW5kbGVWaXNpYmlsaXR5QXR0cihTLCBELCBBdHRyLCBmYWxzZSk7CiAgICAgYnJlYWs7CkBAIC00NzY4LDM2ICs0Mjk2LDU4IEBACiAgICAgaGFuZGxlVmlzaWJpbGl0eUF0dHIoUywgRCwgQXR0ciwgdHJ1ZSk7CiAgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfV2FyblVudXNlZDoKLSAgICBoYW5kbGVXYXJuVW51c2VkQXR0cihTLCBELCBBdHRyKTsKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8V2FyblVudXNlZEF0dHI+KFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1dhcm5VbnVzZWRSZXN1bHQ6IGhhbmRsZVdhcm5VbnVzZWRSZXN1bHQoUywgRCwgQXR0cik7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfV2FyblVudXNlZFJlc3VsdDoKKyAgICBoYW5kbGVXYXJuVW51c2VkUmVzdWx0KFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1dlYWs6ICAgICAgICBoYW5kbGVXZWFrQXR0ciAgICAgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9XZWFrUmVmOiAgICAgaGFuZGxlV2Vha1JlZkF0dHIgICAgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfV2Vha0ltcG9ydDogIGhhbmRsZVdlYWtJbXBvcnRBdHRyICAoUywgRCwgQXR0cik7IGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1dlYWs6CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPFdlYWtBdHRyPihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9XZWFrUmVmOgorICAgIGhhbmRsZVdlYWtSZWZBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1dlYWtJbXBvcnQ6CisgICAgaGFuZGxlV2Vha0ltcG9ydEF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfVHJhbnNwYXJlbnRVbmlvbjoKICAgICBoYW5kbGVUcmFuc3BhcmVudFVuaW9uQXR0cihTLCBELCBBdHRyKTsKICAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDRXhjZXB0aW9uOgotICAgIGhhbmRsZU9iakNFeGNlcHRpb25BdHRyKFMsIEQsIEF0dHIpOworICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxPYmpDRXhjZXB0aW9uQXR0cj4oUywgRCwgQXR0cik7CiAgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfT2JqQ01ldGhvZEZhbWlseToKICAgICBoYW5kbGVPYmpDTWV0aG9kRmFtaWx5QXR0cihTLCBELCBBdHRyKTsKICAgICBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PYmpDTlNPYmplY3Q6aGFuZGxlT2JqQ05TT2JqZWN0ICAgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQmxvY2tzOiAgICAgIGhhbmRsZUJsb2Nrc0F0dHIgICAgICAoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1NlbnRpbmVsOiAgICBoYW5kbGVTZW50aW5lbEF0dHIgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Db25zdDogICAgICAgaGFuZGxlQ29uc3RBdHRyICAgICAgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfUHVyZTogICAgICAgIGhhbmRsZVB1cmVBdHRyICAgICAgICAoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0NsZWFudXA6ICAgICBoYW5kbGVDbGVhbnVwQXR0ciAgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Ob0RlYnVnOiAgICAgaGFuZGxlTm9EZWJ1Z0F0dHIgICAgIChTLCBELCBBdHRyKTsgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTm9JbmxpbmU6ICAgIGhhbmRsZU5vSW5saW5lQXR0ciAgICAoUywgRCwgQXR0cik7IGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlZ3Bhcm06ICAgICBoYW5kbGVSZWdwYXJtQXR0ciAgICAgKFMsIEQsIEF0dHIpOyBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpJZ25vcmVkQXR0cmlidXRlOgotICAgIC8vIEp1c3QgaWdub3JlCisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfT2JqQ05TT2JqZWN0OgorICAgIGhhbmRsZU9iakNOU09iamVjdChTLCBELCBBdHRyKTsKICAgICBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Ob0luc3RydW1lbnRGdW5jdGlvbjogIC8vIEludGVyYWN0cyB3aXRoIC1wZy4KLSAgICBoYW5kbGVOb0luc3RydW1lbnRGdW5jdGlvbkF0dHIoUywgRCwgQXR0cik7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQmxvY2tzOgorICAgIGhhbmRsZUJsb2Nrc0F0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfU2VudGluZWw6CisgICAgaGFuZGxlU2VudGluZWxBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0NvbnN0OgorICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxDb25zdEF0dHI+KFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1B1cmU6CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPFB1cmVBdHRyPihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9DbGVhbnVwOgorICAgIGhhbmRsZUNsZWFudXBBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX05vRGVidWc6CisgICAgaGFuZGxlTm9EZWJ1Z0F0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTm9EdXBsaWNhdGU6CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPE5vRHVwbGljYXRlQXR0cj4oUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTm9JbmxpbmU6CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPE5vSW5saW5lQXR0cj4oUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTm9JbnN0cnVtZW50RnVuY3Rpb246IC8vIEludGVyYWN0cyB3aXRoIC1wZy4KKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8Tm9JbnN0cnVtZW50RnVuY3Rpb25BdHRyPihTLCBELCBBdHRyKTsKICAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9TdGRDYWxsOgogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0NEZWNsOgpAQCAtNDgxMiwzMiArNDM2MiwyNCBAQAogICAgIGhhbmRsZUNhbGxDb252QXR0cihTLCBELCBBdHRyKTsKICAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xLZXJuZWw6Ci0gICAgaGFuZGxlT3BlbkNMS2VybmVsQXR0cihTLCBELCBBdHRyKTsKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8T3BlbkNMS2VybmVsQXR0cj4oUywgRCwgQXR0cik7CiAgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMSW1hZ2VBY2Nlc3M6Ci0gICAgaGFuZGxlT3BlbkNMSW1hZ2VBY2Nlc3NBdHRyKFMsIEQsIEF0dHIpOworICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxPcGVuQ0xJbWFnZUFjY2Vzc0F0dHI+KFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOwogCiAgIC8vIE1pY3Jvc29mdCBhdHRyaWJ1dGVzOgogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX01zU3RydWN0OgotICAgIGhhbmRsZU1zU3RydWN0QXR0cihTLCBELCBBdHRyKTsKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8TXNTdHJ1Y3RBdHRyPihTLCBELCBBdHRyKTsKICAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9VdWlkOgogICAgIGhhbmRsZVV1aWRBdHRyKFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOwotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1NpbmdsZUluaGVyaXRhbmNlOgotICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX011bHRpcGxlSW5oZXJpdGFuY2U6Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfVmlydHVhbEluaGVyaXRhbmNlOgotICAgIGhhbmRsZUluaGVyaXRhbmNlQXR0cihTLCBELCBBdHRyKTsKLSAgICBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9XaW42NDoKLSAgICBoYW5kbGVQb3J0YWJpbGl0eUF0dHIoUywgRCwgQXR0cik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfRm9yY2VJbmxpbmU6Ci0gICAgaGFuZGxlRm9yY2VJbmxpbmVBdHRyKFMsIEQsIEF0dHIpOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX01TSW5oZXJpdGFuY2U6CisgICAgaGFuZGxlTVNJbmhlcml0YW5jZUF0dHIoUywgRCwgQXR0cik7CiAgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfU2VsZWN0QW55OgotICAgIGhhbmRsZVNlbGVjdEFueUF0dHIoUywgRCwgQXR0cik7CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPFNlbGVjdEFueUF0dHI+KFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOwogCiAgIC8vIFRocmVhZCBzYWZldHkgYXR0cmlidXRlczoKQEAgLTQ4NDgsMjggKzQzOTAsMjUgQEAKICAgICBoYW5kbGVBc3NlcnRTaGFyZWRMb2NrQXR0cihTLCBELCBBdHRyKTsKICAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9HdWFyZGVkVmFyOgotICAgIGhhbmRsZUd1YXJkZWRWYXJBdHRyKFMsIEQsIEF0dHIpOworICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxHdWFyZGVkVmFyQXR0cj4oUywgRCwgQXR0cik7CiAgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfUHRHdWFyZGVkVmFyOgogICAgIGhhbmRsZVB0R3VhcmRlZFZhckF0dHIoUywgRCwgQXR0cik7CiAgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfU2NvcGVkTG9ja2FibGU6Ci0gICAgaGFuZGxlU2NvcGVkTG9ja2FibGVBdHRyKFMsIEQsIEF0dHIpOworICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxTY29wZWRMb2NrYWJsZUF0dHI+KFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOwogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX05vU2FuaXRpemVBZGRyZXNzOgotICAgIGhhbmRsZU5vU2FuaXRpemVBZGRyZXNzQXR0cihTLCBELCBBdHRyKTsKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8Tm9TYW5pdGl6ZUFkZHJlc3NBdHRyPihTLCBELCBBdHRyKTsKICAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Ob1RocmVhZFNhZmV0eUFuYWx5c2lzOgotICAgIGhhbmRsZU5vVGhyZWFkU2FmZXR5QW5hbHlzaXMoUywgRCwgQXR0cik7CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPE5vVGhyZWFkU2FmZXR5QW5hbHlzaXNBdHRyPihTLCBELCBBdHRyKTsKICAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Ob1Nhbml0aXplVGhyZWFkOgotICAgIGhhbmRsZU5vU2FuaXRpemVUaHJlYWQoUywgRCwgQXR0cik7CisgICAgaGFuZGxlU2ltcGxlQXR0cmlidXRlPE5vU2FuaXRpemVUaHJlYWRBdHRyPihTLCBELCBBdHRyKTsKICAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Ob1Nhbml0aXplTWVtb3J5OgotICAgIGhhbmRsZU5vU2FuaXRpemVNZW1vcnkoUywgRCwgQXR0cik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfTG9ja2FibGU6Ci0gICAgaGFuZGxlTG9ja2FibGVBdHRyKFMsIEQsIEF0dHIpOworICAgIGhhbmRsZVNpbXBsZUF0dHJpYnV0ZTxOb1Nhbml0aXplTWVtb3J5QXR0cj4oUywgRCwgQXR0cik7CiAgICAgYnJlYWs7CiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfR3VhcmRlZEJ5OgogICAgIGhhbmRsZUd1YXJkZWRCeUF0dHIoUywgRCwgQXR0cik7CkBAIC00ODc3LDEyICs0NDE2LDYgQEAKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9QdEd1YXJkZWRCeToKICAgICBoYW5kbGVQdEd1YXJkZWRCeUF0dHIoUywgRCwgQXR0cik7CiAgICAgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfRXhjbHVzaXZlTG9ja0Z1bmN0aW9uOgotICAgIGhhbmRsZUV4Y2x1c2l2ZUxvY2tGdW5jdGlvbkF0dHIoUywgRCwgQXR0cik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfRXhjbHVzaXZlTG9ja3NSZXF1aXJlZDoKLSAgICBoYW5kbGVFeGNsdXNpdmVMb2Nrc1JlcXVpcmVkQXR0cihTLCBELCBBdHRyKTsKLSAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9FeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb246CiAgICAgaGFuZGxlRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0cihTLCBELCBBdHRyKTsKICAgICBicmVhazsKQEAgLTQ4OTIsMTggKzQ0MjUsOSBAQAogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0xvY2tzRXhjbHVkZWQ6CiAgICAgaGFuZGxlTG9ja3NFeGNsdWRlZEF0dHIoUywgRCwgQXR0cik7CiAgICAgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfU2hhcmVkTG9ja0Z1bmN0aW9uOgotICAgIGhhbmRsZVNoYXJlZExvY2tGdW5jdGlvbkF0dHIoUywgRCwgQXR0cik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfU2hhcmVkTG9ja3NSZXF1aXJlZDoKLSAgICBoYW5kbGVTaGFyZWRMb2Nrc1JlcXVpcmVkQXR0cihTLCBELCBBdHRyKTsKLSAgICBicmVhazsKICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9TaGFyZWRUcnlsb2NrRnVuY3Rpb246CiAgICAgaGFuZGxlU2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0cihTLCBELCBBdHRyKTsKICAgICBicmVhazsKLSAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9VbmxvY2tGdW5jdGlvbjoKLSAgICBoYW5kbGVVbmxvY2tGdW5BdHRyKFMsIEQsIEF0dHIpOwotICAgIGJyZWFrOwogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0FjcXVpcmVkQmVmb3JlOgogICAgIGhhbmRsZUFjcXVpcmVkQmVmb3JlQXR0cihTLCBELCBBdHRyKTsKICAgICBicmVhazsKQEAgLTQ5MTEsMTAgKzQ0MzUsMzggQEAKICAgICBoYW5kbGVBY3F1aXJlZEFmdGVyQXR0cihTLCBELCBBdHRyKTsKICAgICBicmVhazsKIAorICAvLyBDYXBhYmlsaXR5IGFuYWx5c2lzIGF0dHJpYnV0ZXMuCisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ2FwYWJpbGl0eToKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Mb2NrYWJsZToKKyAgICBoYW5kbGVDYXBhYmlsaXR5QXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9SZXF1aXJlc0NhcGFiaWxpdHk6CisgICAgaGFuZGxlUmVxdWlyZXNDYXBhYmlsaXR5QXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0Fzc2VydENhcGFiaWxpdHk6CisgICAgaGFuZGxlQXNzZXJ0Q2FwYWJpbGl0eUF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQWNxdWlyZUNhcGFiaWxpdHk6CisgICAgaGFuZGxlQWNxdWlyZUNhcGFiaWxpdHlBdHRyKFMsIEQsIEF0dHIpOworICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1JlbGVhc2VDYXBhYmlsaXR5OgorICAgIGhhbmRsZVJlbGVhc2VDYXBhYmlsaXR5QXR0cihTLCBELCBBdHRyKTsKKyAgICBicmVhazsKKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9UcnlBY3F1aXJlQ2FwYWJpbGl0eToKKyAgICBoYW5kbGVUcnlBY3F1aXJlQ2FwYWJpbGl0eUF0dHIoUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisKICAgLy8gQ29uc3VtZWQgYW5hbHlzaXMgYXR0cmlidXRlcy4KICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9Db25zdW1hYmxlOgogICAgIGhhbmRsZUNvbnN1bWFibGVBdHRyKFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOworICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0NvbnN1bWFibGVBdXRvQ2FzdDoKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8Q29uc3VtYWJsZUF1dG9DYXN0QXR0cj4oUywgRCwgQXR0cik7CisgICAgYnJlYWs7CisgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQ29uc3VtYWJsZVNldE9uUmVhZDoKKyAgICBoYW5kbGVTaW1wbGVBdHRyaWJ1dGU8Q29uc3VtYWJsZVNldE9uUmVhZEF0dHI+KFMsIEQsIEF0dHIpOworICAgIGJyZWFrOwogICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0NhbGxhYmxlV2hlbjoKICAgICBoYW5kbGVDYWxsYWJsZVdoZW5BdHRyKFMsIEQsIEF0dHIpOwogICAgIGJyZWFrOwpAQCAtNDkzOCwxNSArNDQ5MCw2IEBACiAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfVHlwZVRhZ0ZvckRhdGF0eXBlOgogICAgIGhhbmRsZVR5cGVUYWdGb3JEYXRhdHlwZUF0dHIoUywgRCwgQXR0cik7CiAgICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICAvLyBBc2sgdGFyZ2V0IGFib3V0IHRoZSBhdHRyaWJ1dGUuCi0gICAgY29uc3QgVGFyZ2V0QXR0cmlidXRlc1NlbWEgJlRhcmdldEF0dHJzID0gUy5nZXRUYXJnZXRBdHRyaWJ1dGVzU2VtYSgpOwotICAgIGlmICghVGFyZ2V0QXR0cnMuUHJvY2Vzc0RlY2xBdHRyaWJ1dGUoc2NvcGUsIEQsIEF0dHIsIFMpKQotICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIEF0dHIuaXNEZWNsc3BlY0F0dHJpYnV0ZSgpID8gCi0gICAgICAgICAgICAgZGlhZzo6d2Fybl91bmhhbmRsZWRfbXNfYXR0cmlidXRlX2lnbm9yZWQgOiAKLSAgICAgICAgICAgICBkaWFnOjp3YXJuX3Vua25vd25fYXR0cmlidXRlX2lnbm9yZWQpIDw8IEF0dHIuZ2V0TmFtZSgpOwotICAgIGJyZWFrOwogICB9CiB9CiAKQEAgLTQ5NTgsMTUgKzQ1MDEsMzIgQEAKICAgZm9yIChjb25zdCBBdHRyaWJ1dGVMaXN0KiBsID0gQXR0ckxpc3Q7IGw7IGwgPSBsLT5nZXROZXh0KCkpCiAgICAgUHJvY2Vzc0RlY2xBdHRyaWJ1dGUoKnRoaXMsIFMsIEQsICpsLCBJbmNsdWRlQ1hYMTFBdHRyaWJ1dGVzKTsKIAorICAvLyBGSVhNRTogV2Ugc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIHRoZXNlIGNhc2VzIGluIFRhYmxlR2VuLgogICAvLyBHQ0MgYWNjZXB0cwogICAvLyBzdGF0aWMgaW50IGE5IF9fYXR0cmlidXRlX18oKHdlYWtyZWYpKTsKICAgLy8gYnV0IHRoYXQgbG9va3MgcmVhbGx5IHBvaW50bGVzcy4gV2UgcmVqZWN0IGl0LgogICBpZiAoRC0+aGFzQXR0cjxXZWFrUmVmQXR0cj4oKSAmJiAhRC0+aGFzQXR0cjxBbGlhc0F0dHI+KCkpIHsKLSAgICBEaWFnKEF0dHJMaXN0LT5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93ZWFrcmVmX3dpdGhvdXRfYWxpYXMpIDw8Ci0gICAgY2FzdDxOYW1lZERlY2w+KEQpLT5nZXROYW1lQXNTdHJpbmcoKTsKKyAgICBEaWFnKEF0dHJMaXN0LT5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93ZWFrcmVmX3dpdGhvdXRfYWxpYXMpCisgICAgICA8PCBjYXN0PE5hbWVkRGVjbD4oRCk7CiAgICAgRC0+ZHJvcEF0dHI8V2Vha1JlZkF0dHI+KCk7CiAgICAgcmV0dXJuOwogICB9CisKKyAgaWYgKCFELT5oYXNBdHRyPE9wZW5DTEtlcm5lbEF0dHI+KCkpIHsKKyAgICAvLyBUaGVzZSBhdHRyaWJ1dGVzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGEgbm9uLWtlcm5lbCBmdW5jdGlvbi4KKyAgICBpZiAoQXR0ciAqQSA9IEQtPmdldEF0dHI8UmVxZFdvcmtHcm91cFNpemVBdHRyPigpKSB7CisgICAgICBEaWFnKEQtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9vcGVuY2xfa2VybmVsX2F0dHIpIDw8IEE7CisgICAgICBELT5zZXRJbnZhbGlkRGVjbCgpOworICAgIH0KKyAgICBpZiAoQXR0ciAqQSA9IEQtPmdldEF0dHI8V29ya0dyb3VwU2l6ZUhpbnRBdHRyPigpKSB7CisgICAgICBEaWFnKEQtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9vcGVuY2xfa2VybmVsX2F0dHIpIDw8IEE7CisgICAgICBELT5zZXRJbnZhbGlkRGVjbCgpOworICAgIH0KKyAgICBpZiAoQXR0ciAqQSA9IEQtPmdldEF0dHI8VmVjVHlwZUhpbnRBdHRyPigpKSB7CisgICAgICBEaWFnKEQtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9vcGVuY2xfa2VybmVsX2F0dHIpIDw8IEE7CisgICAgICBELT5zZXRJbnZhbGlkRGVjbCgpOworICAgIH0KKyAgfQogfQogCiAvLyBBbm5vdGF0aW9uIGF0dHJpYnV0ZXMgYXJlIHRoZSBvbmx5IGF0dHJpYnV0ZXMgYWxsb3dlZCBhZnRlciBhbiBhY2Nlc3MKQEAgLTUwNDEsOSArNDYwMSw4IEBACiAgICAgUXVhbFR5cGUgRkRUeSA9IEZELT5nZXRUeXBlKCk7CiAgICAgaWYgKGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpGVCA9IEZEVHktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpKSB7CiAgICAgICBTbWFsbFZlY3RvcjxQYXJtVmFyRGVjbCosIDE2PiBQYXJhbXM7Ci0gICAgICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjphcmdfdHlwZV9pdGVyYXRvciBBSSA9IEZULT5hcmdfdHlwZV9iZWdpbigpLAotICAgICAgICAgICBBRSA9IEZULT5hcmdfdHlwZV9lbmQoKTsgQUkgIT0gQUU7ICsrQUkpIHsKLSAgICAgICAgUGFybVZhckRlY2wgKlBhcmFtID0gQnVpbGRQYXJtVmFyRGVjbEZvclR5cGVkZWYoTmV3RkQsIExvYywgKkFJKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmQUkgOiBGVC0+cGFyYW1fdHlwZXMoKSkgeworICAgICAgICBQYXJtVmFyRGVjbCAqUGFyYW0gPSBCdWlsZFBhcm1WYXJEZWNsRm9yVHlwZWRlZihOZXdGRCwgTG9jLCBBSSk7CiAgICAgICAgIFBhcmFtLT5zZXRTY29wZUluZm8oMCwgUGFyYW1zLnNpemUoKSk7CiAgICAgICAgIFBhcmFtcy5wdXNoX2JhY2soUGFyYW0pOwogICAgICAgfQpAQCAtNTA3MCwxOCArNDYyOSwyMCBAQAogICBpZiAoVy5nZXRBbGlhcygpKSB7IC8vIGNsb25lIGRlY2wsIGltcGVyc29uYXRlIF9fYXR0cmlidXRlKHdlYWssYWxpYXMoLi4uKSkKICAgICBJZGVudGlmaWVySW5mbyAqTkRJZCA9IE5ELT5nZXRJZGVudGlmaWVyKCk7CiAgICAgTmFtZWREZWNsICpOZXdEID0gRGVjbENsb25lUHJhZ21hV2VhayhORCwgVy5nZXRBbGlhcygpLCBXLmdldExvY2F0aW9uKCkpOwotICAgIE5ld0QtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIEFsaWFzQXR0cihXLmdldExvY2F0aW9uKCksIENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ESWQtPmdldE5hbWUoKSkpOwotICAgIE5ld0QtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIFdlYWtBdHRyKFcuZ2V0TG9jYXRpb24oKSwgQ29udGV4dCkpOworICAgIE5ld0QtPmFkZEF0dHIoQWxpYXNBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LCBORElkLT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcuZ2V0TG9jYXRpb24oKSkpOworICAgIE5ld0QtPmFkZEF0dHIoV2Vha0F0dHI6OkNyZWF0ZUltcGxpY2l0KENvbnRleHQsIFcuZ2V0TG9jYXRpb24oKSkpOwogICAgIFdlYWtUb3BMZXZlbERlY2wucHVzaF9iYWNrKE5ld0QpOwogICAgIC8vIEZJWE1FOiAiaGlkZW91cyIgY29kZSBmcm9tIFNlbWE6OkxhemlseUNyZWF0ZUJ1aWx0aW4KICAgICAvLyB0byBpbnNlcnQgRGVjbCBhdCBUVSBzY29wZSwgc29ycnkuCiAgICAgRGVjbENvbnRleHQgKlNhdmVkQ29udGV4dCA9IEN1ckNvbnRleHQ7CiAgICAgQ3VyQ29udGV4dCA9IENvbnRleHQuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpOworICAgIE5ld0QtPnNldERlY2xDb250ZXh0KEN1ckNvbnRleHQpOworICAgIE5ld0QtPnNldExleGljYWxEZWNsQ29udGV4dChDdXJDb250ZXh0KTsKICAgICBQdXNoT25TY29wZUNoYWlucyhOZXdELCBTKTsKICAgICBDdXJDb250ZXh0ID0gU2F2ZWRDb250ZXh0OwogICB9IGVsc2UgeyAvLyBqdXN0IGFkZCB3ZWFrIHRvIGV4aXN0aW5nCi0gICAgTkQtPmFkZEF0dHIoOjpuZXcgKENvbnRleHQpIFdlYWtBdHRyKFcuZ2V0TG9jYXRpb24oKSwgQ29udGV4dCkpOworICAgIE5ELT5hZGRBdHRyKFdlYWtBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LCBXLmdldExvY2F0aW9uKCkpKTsKICAgfQogfQogCkBAIC01MTUwLDggKzQ3MTEsOSBAQAogc3RhdGljIHZvaWQgaGFuZGxlRGVsYXllZEZvcmJpZGRlblR5cGUoU2VtYSAmUywgRGVsYXllZERpYWdub3N0aWMgJmRpYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsICpkZWNsKSB7CiAgIGlmIChkZWNsICYmIGlzRm9yYmlkZGVuVHlwZUFsbG93ZWQoUywgZGVjbCkpIHsKLSAgICBkZWNsLT5hZGRBdHRyKG5ldyAoUy5Db250ZXh0KSBVbmF2YWlsYWJsZUF0dHIoZGlhZy5Mb2MsIFMuQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHN5c3RlbSBkZWNsYXJhdGlvbiB1c2VzIGFuIHVuc3VwcG9ydGVkIHR5cGUiKSk7CisgICAgZGVjbC0+YWRkQXR0cihVbmF2YWlsYWJsZUF0dHI6OkNyZWF0ZUltcGxpY2l0KFMuQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHN5c3RlbSBkZWNsYXJhdGlvbiB1c2VzIGFuIHVuc3VwcG9ydGVkIHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlhZy5Mb2MpKTsKICAgICByZXR1cm47CiAgIH0KICAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50KQpAQCAtNTE5OSw5ICs0NzYxLDExIEBACiAKICAgICAgIHN3aXRjaCAoZGlhZy5LaW5kKSB7CiAgICAgICBjYXNlIERlbGF5ZWREaWFnbm9zdGljOjpEZXByZWNhdGlvbjoKLSAgICAgICAgLy8gRG9uJ3QgYm90aGVyIGdpdmluZyBkZXByZWNhdGlvbiBkaWFnbm9zdGljcyBpZiB0aGUgZGVjbCBpcyBpbnZhbGlkLgorICAgICAgY2FzZSBEZWxheWVkRGlhZ25vc3RpYzo6VW5hdmFpbGFibGU6CisgICAgICAgIC8vIERvbid0IGJvdGhlciBnaXZpbmcgZGVwcmVjYXRpb24vdW5hdmFpbGFibGUgZGlhZ25vc3RpY3MgaWYKKyAgICAgICAgLy8gdGhlIGRlY2wgaXMgaW52YWxpZC4KICAgICAgICAgaWYgKCFkZWNsLT5pc0ludmFsaWREZWNsKCkpCi0gICAgICAgICAgSGFuZGxlRGVsYXllZERlcHJlY2F0aW9uQ2hlY2soZGlhZywgZGVjbCk7CisgICAgICAgICAgSGFuZGxlRGVsYXllZEF2YWlsYWJpbGl0eUNoZWNrKGRpYWcsIGRlY2wpOwogICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSBEZWxheWVkRGlhZ25vc3RpYzo6QWNjZXNzOgpAQCAtNTIzNiw2MSArNDgwMCwxMjAgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgYm9vbCBpc0RlY2xVbmF2YWlsYWJsZShEZWNsICpEKSB7CisgIGRvIHsKKyAgICBpZiAoRC0+aXNVbmF2YWlsYWJsZSgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gQSBjYXRlZ29yeSBpbXBsaWNpdGx5IGhhcyB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBpbnRlcmZhY2UuCisgICAgaWYgKGNvbnN0IE9iakNDYXRlZ29yeURlY2wgKkNhdEQgPSBkeW5fY2FzdDxPYmpDQ2F0ZWdvcnlEZWNsPihEKSkKKyAgICAgIHJldHVybiBDYXRELT5nZXRDbGFzc0ludGVyZmFjZSgpLT5pc1VuYXZhaWxhYmxlKCk7CisgIH0gd2hpbGUgKChEID0gY2FzdF9vcl9udWxsPERlY2w+KEQtPmdldERlY2xDb250ZXh0KCkpKSk7CisgIHJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIHZvaWQKLURvRW1pdERlcHJlY2F0aW9uV2FybmluZyhTZW1hICZTLCBjb25zdCBOYW1lZERlY2wgKkQsIFN0cmluZ1JlZiBNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqVW5rbm93bk9iakNDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICpPYmpDUHJvcGVyeSkgeworRG9FbWl0QXZhaWxhYmlsaXR5V2FybmluZyhTZW1hICZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxheWVkRGlhZ25vc3RpYzo6RERLaW5kIEssCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmFtZWREZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqVW5rbm93bk9iakNDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqT2JqQ1Byb3BlcnR5KSB7CisKKyAgLy8gRGlhZ25vc3RpY3MgZm9yIGRlcHJlY2F0ZWQgb3IgdW5hdmFpbGFibGUuCisgIHVuc2lnbmVkIGRpYWcsIGRpYWdfbWVzc2FnZSwgZGlhZ19md2RjbGFzc19tZXNzYWdlOworCisgIC8vIE1hdGNoZXMgJ2RpYWc6Om5vdGVfcHJvcGVydHlfYXR0cmlidXRlJyBvcHRpb25zLgorICB1bnNpZ25lZCBwcm9wZXJ0eV9ub3RlX3NlbGVjdDsKKworICAvLyBNYXRjaGVzIGRpYWc6Om5vdGVfYXZhaWxhYmlsaXR5X3NwZWNpZmllZF9oZXJlLgorICB1bnNpZ25lZCBhdmFpbGFibGVfaGVyZV9zZWxlY3Rfa2luZDsKKworICAvLyBEb24ndCB3YXJuIGlmIG91ciBjdXJyZW50IGNvbnRleHQgaXMgZGVwcmVjYXRlZCBvciB1bmF2YWlsYWJsZS4KKyAgc3dpdGNoIChLKSB7CisgICAgY2FzZSBEZWxheWVkRGlhZ25vc3RpYzo6RGVwcmVjYXRpb246CisgICAgICBpZiAoaXNEZWNsRGVwcmVjYXRlZChDdHgpKQorICAgICAgICByZXR1cm47CisgICAgICBkaWFnID0gZGlhZzo6d2Fybl9kZXByZWNhdGVkOworICAgICAgZGlhZ19tZXNzYWdlID0gZGlhZzo6d2Fybl9kZXByZWNhdGVkX21lc3NhZ2U7CisgICAgICBkaWFnX2Z3ZGNsYXNzX21lc3NhZ2UgPSBkaWFnOjp3YXJuX2RlcHJlY2F0ZWRfZndkY2xhc3NfbWVzc2FnZTsKKyAgICAgIHByb3BlcnR5X25vdGVfc2VsZWN0ID0gLyogZGVwcmVjYXRlZCAqLyAwOworICAgICAgYXZhaWxhYmxlX2hlcmVfc2VsZWN0X2tpbmQgPSAvKiBkZXByZWNhdGVkICovIDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRGVsYXllZERpYWdub3N0aWM6OlVuYXZhaWxhYmxlOgorICAgICAgaWYgKGlzRGVjbFVuYXZhaWxhYmxlKEN0eCkpCisgICAgICAgIHJldHVybjsKKyAgICAgIGRpYWcgPSBkaWFnOjplcnJfdW5hdmFpbGFibGU7CisgICAgICBkaWFnX21lc3NhZ2UgPSBkaWFnOjplcnJfdW5hdmFpbGFibGVfbWVzc2FnZTsKKyAgICAgIGRpYWdfZndkY2xhc3NfbWVzc2FnZSA9IGRpYWc6Ondhcm5fdW5hdmFpbGFibGVfZndkY2xhc3NfbWVzc2FnZTsKKyAgICAgIHByb3BlcnR5X25vdGVfc2VsZWN0ID0gLyogdW5hdmFpbGFibGUgKi8gMTsKKyAgICAgIGF2YWlsYWJsZV9oZXJlX3NlbGVjdF9raW5kID0gLyogdW5hdmFpbGFibGUgKi8gMDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIk5laXRoZXIgYSBkZXByZWNhdGlvbiBvciB1bmF2YWlsYWJsZSBraW5kIik7CisgIH0KKwogICBEZWNsYXJhdGlvbk5hbWUgTmFtZSA9IEQtPmdldERlY2xOYW1lKCk7CiAgIGlmICghTWVzc2FnZS5lbXB0eSgpKSB7Ci0gICAgUy5EaWFnKExvYywgZGlhZzo6d2Fybl9kZXByZWNhdGVkX21lc3NhZ2UpIDw8IE5hbWUgPDwgTWVzc2FnZTsKLSAgICBTLkRpYWcoRC0+Z2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgaXNhPE9iakNNZXRob2REZWNsPihEKSA/IGRpYWc6Om5vdGVfbWV0aG9kX2RlY2xhcmVkX2F0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjpub3RlX3ByZXZpb3VzX2RlY2wpIDw8IE5hbWU7Ci0gICAgaWYgKE9iakNQcm9wZXJ5KQotICAgICAgUy5EaWFnKE9iakNQcm9wZXJ5LT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3Byb3BlcnR5X2F0dHJpYnV0ZSkKLSAgICAgICAgPDwgT2JqQ1Byb3BlcnktPmdldERlY2xOYW1lKCkgPDwgMDsKKyAgICBTLkRpYWcoTG9jLCBkaWFnX21lc3NhZ2UpIDw8IE5hbWUgPDwgTWVzc2FnZTsKKyAgICBpZiAoT2JqQ1Byb3BlcnR5KQorICAgICAgUy5EaWFnKE9iakNQcm9wZXJ0eS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcm9wZXJ0eV9hdHRyaWJ1dGUpCisgICAgICAgIDw8IE9iakNQcm9wZXJ0eS0+Z2V0RGVjbE5hbWUoKSA8PCBwcm9wZXJ0eV9ub3RlX3NlbGVjdDsKICAgfSBlbHNlIGlmICghVW5rbm93bk9iakNDbGFzcykgewotICAgIFMuRGlhZyhMb2MsIGRpYWc6Ondhcm5fZGVwcmVjYXRlZCkgPDwgRC0+Z2V0RGVjbE5hbWUoKTsKLSAgICBTLkRpYWcoRC0+Z2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgaXNhPE9iakNNZXRob2REZWNsPihEKSA/IGRpYWc6Om5vdGVfbWV0aG9kX2RlY2xhcmVkX2F0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjpub3RlX3ByZXZpb3VzX2RlY2wpIDw8IE5hbWU7Ci0gICAgaWYgKE9iakNQcm9wZXJ5KQotICAgICAgUy5EaWFnKE9iakNQcm9wZXJ5LT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3Byb3BlcnR5X2F0dHJpYnV0ZSkKLSAgICAgICAgPDwgT2JqQ1Byb3BlcnktPmdldERlY2xOYW1lKCkgPDwgMDsKKyAgICBTLkRpYWcoTG9jLCBkaWFnKSA8PCBOYW1lOworICAgIGlmIChPYmpDUHJvcGVydHkpCisgICAgICBTLkRpYWcoT2JqQ1Byb3BlcnR5LT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3Byb3BlcnR5X2F0dHJpYnV0ZSkKKyAgICAgICAgPDwgT2JqQ1Byb3BlcnR5LT5nZXREZWNsTmFtZSgpIDw8IHByb3BlcnR5X25vdGVfc2VsZWN0OwogICB9IGVsc2UgewotICAgIFMuRGlhZyhMb2MsIGRpYWc6Ondhcm5fZGVwcmVjYXRlZF9md2RjbGFzc19tZXNzYWdlKSA8PCBOYW1lOworICAgIFMuRGlhZyhMb2MsIGRpYWdfZndkY2xhc3NfbWVzc2FnZSkgPDwgTmFtZTsKICAgICBTLkRpYWcoVW5rbm93bk9iakNDbGFzcy0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9mb3J3YXJkX2NsYXNzKTsKICAgfQorCisgIFMuRGlhZyhELT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX2F2YWlsYWJpbGl0eV9zcGVjaWZpZWRfaGVyZSkKKyAgICA8PCBEIDw8IGF2YWlsYWJsZV9oZXJlX3NlbGVjdF9raW5kOwogfQogCi12b2lkIFNlbWE6OkhhbmRsZURlbGF5ZWREZXByZWNhdGlvbkNoZWNrKERlbGF5ZWREaWFnbm9zdGljICZERCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbCAqQ3R4KSB7Ci0gIGlmIChpc0RlY2xEZXByZWNhdGVkKEN0eCkpCi0gICAgcmV0dXJuOwotCit2b2lkIFNlbWE6OkhhbmRsZURlbGF5ZWRBdmFpbGFiaWxpdHlDaGVjayhEZWxheWVkRGlhZ25vc3RpYyAmREQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsICpDdHgpIHsKICAgREQuVHJpZ2dlcmVkID0gdHJ1ZTsKLSAgRG9FbWl0RGVwcmVjYXRpb25XYXJuaW5nKCp0aGlzLCBERC5nZXREZXByZWNhdGlvbkRlY2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERELmdldERlcHJlY2F0aW9uTWVzc2FnZSgpLCBERC5Mb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBERC5nZXRVbmtub3duT2JqQ0NsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBERC5nZXRPYmpDUHJvcGVydHkoKSk7CisgIERvRW1pdEF2YWlsYWJpbGl0eVdhcm5pbmcoKnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERlbGF5ZWREaWFnbm9zdGljOjpEREtpbmQpIERELktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERELmdldERlcHJlY2F0aW9uRGVjbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERELmdldERlcHJlY2F0aW9uTWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERELkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBERC5nZXRVbmtub3duT2JqQ0NsYXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREQuZ2V0T2JqQ1Byb3BlcnR5KCkpOwogfQogCi12b2lkIFNlbWE6OkVtaXREZXByZWNhdGlvbldhcm5pbmcoTmFtZWREZWNsICpELCBTdHJpbmdSZWYgTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKlVua25vd25PYmpDQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAgKk9iakNQcm9wZXJ0eSkgewordm9pZCBTZW1hOjpFbWl0QXZhaWxhYmlsaXR5V2FybmluZyhBdmFpbGFiaWxpdHlEaWFnbm9zdGljIEFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkQsIFN0cmluZ1JlZiBNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpVbmtub3duT2JqQ0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICAqT2JqQ1Byb3BlcnR5KSB7CiAgIC8vIERlbGF5IGlmIHdlJ3JlIGN1cnJlbnRseSBwYXJzaW5nIGEgZGVjbGFyYXRpb24uCiAgIGlmIChEZWxheWVkRGlhZ25vc3RpY3Muc2hvdWxkRGVsYXlEaWFnbm9zdGljcygpKSB7Ci0gICAgRGVsYXllZERpYWdub3N0aWNzLmFkZChEZWxheWVkRGlhZ25vc3RpYzo6bWFrZURlcHJlY2F0aW9uKExvYywgRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25PYmpDQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSkpOworICAgIERlbGF5ZWREaWFnbm9zdGljcy5hZGQoRGVsYXllZERpYWdub3N0aWM6Om1ha2VBdmFpbGFiaWxpdHkoQUQsIExvYywgRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25PYmpDQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKSk7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgLy8gT3RoZXJ3aXNlLCBkb24ndCB3YXJuIGlmIG91ciBjdXJyZW50IGNvbnRleHQgaXMgZGVwcmVjYXRlZC4KLSAgaWYgKGlzRGVjbERlcHJlY2F0ZWQoY2FzdDxEZWNsPihnZXRDdXJMZXhpY2FsQ29udGV4dCgpKSkpCi0gICAgcmV0dXJuOwotICBEb0VtaXREZXByZWNhdGlvbldhcm5pbmcoKnRoaXMsIEQsIE1lc3NhZ2UsIExvYywgVW5rbm93bk9iakNDbGFzcywgT2JqQ1Byb3BlcnR5KTsKKyAgRGVjbCAqQ3R4ID0gY2FzdDxEZWNsPihnZXRDdXJMZXhpY2FsQ29udGV4dCgpKTsKKyAgRGVsYXllZERpYWdub3N0aWM6OkRES2luZCBLOworICBzd2l0Y2ggKEFEKSB7CisgICAgY2FzZSBBRF9EZXByZWNhdGlvbjoKKyAgICAgIEsgPSBEZWxheWVkRGlhZ25vc3RpYzo6RGVwcmVjYXRpb247CisgICAgICBicmVhazsKKyAgICBjYXNlIEFEX1VuYXZhaWxhYmxlOgorICAgICAgSyA9IERlbGF5ZWREaWFnbm9zdGljOjpVbmF2YWlsYWJsZTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgRG9FbWl0QXZhaWxhYmlsaXR5V2FybmluZygqdGhpcywgSywgQ3R4LCBELCBNZXNzYWdlLCBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bk9iakNDbGFzcywgT2JqQ1Byb3BlcnR5KTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1NlbWFEZWNsQ1hYLmNwcCBiL2xpYi9TZW1hL1NlbWFEZWNsQ1hYLmNwcAppbmRleCA2YjM0MDBhLi44NTBkYjI2IDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hRGVjbENYWC5jcHAKKysrIGIvbGliL1NlbWEvU2VtYURlY2xDWFguY3BwCkBAIC0yMTIsMTEgKzIxMiw5IEBACiAgICAgICAgICAiU2hvdWxkbid0IGNvbGxlY3QgZXhjZXB0aW9ucyB3aGVuIHRocm93LWFsbCBpcyBndWFyYW50ZWVkLiIpOwogICBDb21wdXRlZEVTVCA9IEVTVF9EeW5hbWljOwogICAvLyBSZWNvcmQgdGhlIGV4Y2VwdGlvbnMgaW4gdGhpcyBmdW5jdGlvbidzIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgotICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjpleGNlcHRpb25faXRlcmF0b3IgRSA9IFByb3RvLT5leGNlcHRpb25fYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFbmQgPSBQcm90by0+ZXhjZXB0aW9uX2VuZCgpOwotICAgICAgIEUgIT0gRUVuZDsgKytFKQotICAgIGlmIChFeGNlcHRpb25zU2Vlbi5pbnNlcnQoU2VsZi0+Q29udGV4dC5nZXRDYW5vbmljYWxUeXBlKCpFKSkpCi0gICAgICBFeGNlcHRpb25zLnB1c2hfYmFjaygqRSk7CisgIGZvciAoY29uc3QgYXV0byAmRSA6IFByb3RvLT5leGNlcHRpb25zKCkpCisgICAgaWYgKEV4Y2VwdGlvbnNTZWVuLmluc2VydChTZWxmLT5Db250ZXh0LmdldENhbm9uaWNhbFR5cGUoRSkpKQorICAgICAgRXhjZXB0aW9ucy5wdXNoX2JhY2soRSk7CiB9CiAKIHZvaWQgU2VtYTo6SW1wbGljaXRFeGNlcHRpb25TcGVjaWZpY2F0aW9uOjpDYWxsZWRFeHByKEV4cHIgKkUpIHsKQEAgLTM4MCwxNiArMzc4LDE2IEBACiAgICAgICAgIE1pZ2h0QmVGdW5jdGlvbiA9IGZhbHNlOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KLSAgICAgIGZvciAodW5zaWduZWQgYXJnSWR4ID0gMCwgZSA9IGNodW5rLkZ1bi5OdW1BcmdzOyBhcmdJZHggIT0gZTsgKythcmdJZHgpIHsKLSAgICAgICAgUGFybVZhckRlY2wgKlBhcmFtID0KLSAgICAgICAgICBjYXN0PFBhcm1WYXJEZWNsPihjaHVuay5GdW4uQXJnSW5mb1thcmdJZHhdLlBhcmFtKTsKKyAgICAgIGZvciAodW5zaWduZWQgYXJnSWR4ID0gMCwgZSA9IGNodW5rLkZ1bi5OdW1QYXJhbXM7IGFyZ0lkeCAhPSBlOworICAgICAgICAgICArK2FyZ0lkeCkgeworICAgICAgICBQYXJtVmFyRGVjbCAqUGFyYW0gPSBjYXN0PFBhcm1WYXJEZWNsPihjaHVuay5GdW4uUGFyYW1zW2FyZ0lkeF0uUGFyYW0pOwogICAgICAgICBpZiAoUGFyYW0tPmhhc1VucGFyc2VkRGVmYXVsdEFyZygpKSB7Ci0gICAgICAgICAgQ2FjaGVkVG9rZW5zICpUb2tzID0gY2h1bmsuRnVuLkFyZ0luZm9bYXJnSWR4XS5EZWZhdWx0QXJnVG9rZW5zOworICAgICAgICAgIENhY2hlZFRva2VucyAqVG9rcyA9IGNodW5rLkZ1bi5QYXJhbXNbYXJnSWR4XS5EZWZhdWx0QXJnVG9rZW5zOwogICAgICAgICAgIERpYWcoUGFyYW0tPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50X25vbmZ1bmMpCiAgICAgICAgICAgICA8PCBTb3VyY2VSYW5nZSgoKlRva3MpWzFdLmdldExvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tzLT5iYWNrKCkuZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgZGVsZXRlIFRva3M7Ci0gICAgICAgICAgY2h1bmsuRnVuLkFyZ0luZm9bYXJnSWR4XS5EZWZhdWx0QXJnVG9rZW5zID0gMDsKKyAgICAgICAgICBjaHVuay5GdW4uUGFyYW1zW2FyZ0lkeF0uRGVmYXVsdEFyZ1Rva2VucyA9IDA7CiAgICAgICAgIH0gZWxzZSBpZiAoUGFyYW0tPmdldERlZmF1bHRBcmcoKSkgewogICAgICAgICAgIERpYWcoUGFyYW0tPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9wYXJhbV9kZWZhdWx0X2FyZ3VtZW50X25vbmZ1bmMpCiAgICAgICAgICAgICA8PCBQYXJhbS0+Z2V0RGVmYXVsdEFyZygpLT5nZXRTb3VyY2VSYW5nZSgpOwpAQCAtNTg2LDYgKzU4NCw3IEBACiAgICAgfQogICB9CiAKKyAgY29uc3QgRnVuY3Rpb25EZWNsICpEZWY7CiAgIC8vIEMrKzExIFtkY2wuY29uc3RleHByXXAxOiBJZiBhbnkgZGVjbGFyYXRpb24gb2YgYSBmdW5jdGlvbiBvciBmdW5jdGlvbgogICAvLyB0ZW1wbGF0ZSBoYXMgYSBjb25zdGV4cHIgc3BlY2lmaWVyIHRoZW4gYWxsIGl0cyBkZWNsYXJhdGlvbnMgc2hhbGwKICAgLy8gY29udGFpbiB0aGUgY29uc3RleHByIHNwZWNpZmllci4KQEAgLTU5NCw2ICs1OTMsMTMgQEAKICAgICAgIDw8IE5ldyA8PCBOZXctPmlzQ29uc3RleHByKCk7CiAgICAgRGlhZyhPbGQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJldmlvdXNfZGVjbGFyYXRpb24pOwogICAgIEludmFsaWQgPSB0cnVlOworICB9IGVsc2UgaWYgKCFPbGQtPmlzSW5saW5lZCgpICYmIE5ldy0+aXNJbmxpbmVkKCkgJiYgT2xkLT5pc0RlZmluZWQoRGVmKSkgeworICAgIC8vIEMrKzExIFtkY2wuZmNuLnNwZWNdcDQ6CisgICAgLy8gICBJZiB0aGUgZGVmaW5pdGlvbiBvZiBhIGZ1bmN0aW9uIGFwcGVhcnMgaW4gYSB0cmFuc2xhdGlvbiB1bml0IGJlZm9yZSBpdHMKKyAgICAvLyAgIGZpcnN0IGRlY2xhcmF0aW9uIGFzIGlubGluZSwgdGhlIHByb2dyYW0gaXMgaWxsLWZvcm1lZC4KKyAgICBEaWFnKE5ldy0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2lubGluZV9kZWNsX2ZvbGxvd3NfZGVmKSA8PCBOZXc7CisgICAgRGlhZyhEZWYtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJldmlvdXNfZGVmaW5pdGlvbik7CisgICAgSW52YWxpZCA9IHRydWU7CiAgIH0KIAogICAvLyBDKysxMSBbZGNsLmZjdC5kZWZhdWx0XXA0OiBJZiBhIGZyaWVuZCBkZWNsYXJhdGlvbiBzcGVjaWZpZXMgYSBkZWZhdWx0CkBAIC03MTQsOCArNzIwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCkgewogICB1bnNpZ25lZCBBcmdJbmRleCA9IDA7CiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpGVCA9IEZELT5nZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwotICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjphcmdfdHlwZV9pdGVyYXRvciBpID0gRlQtPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgZSA9IEZULT5hcmdfdHlwZV9lbmQoKTsgaSAhPSBlOyArK2ksICsrQXJnSW5kZXgpIHsKKyAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6cGFyYW1fdHlwZV9pdGVyYXRvciBpID0gRlQtPnBhcmFtX3R5cGVfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gRlQtPnBhcmFtX3R5cGVfZW5kKCk7CisgICAgICAgaSAhPSBlOyArK2ksICsrQXJnSW5kZXgpIHsKICAgICBjb25zdCBQYXJtVmFyRGVjbCAqUEQgPSBGRC0+Z2V0UGFyYW1EZWNsKEFyZ0luZGV4KTsKICAgICBTb3VyY2VMb2NhdGlvbiBQYXJhbUxvYyA9IFBELT5nZXRMb2NhdGlvbigpOwogICAgIGlmICghKCppKS0+aXNEZXBlbmRlbnRUeXBlKCkgJiYKQEAgLTc2MCwxMCArNzY3LDkgQEAKICAgICAgIERpYWcoTmV3RkQtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9jb25zdGV4cHJfdmlydHVhbF9iYXNlKQogICAgICAgICA8PCBpc2E8Q1hYQ29uc3RydWN0b3JEZWNsPihOZXdGRCkKICAgICAgICAgPDwgZ2V0UmVjb3JkRGlhZ0Zyb21UYWdLaW5kKFJELT5nZXRUYWdLaW5kKCkpIDw8IFJELT5nZXROdW1WQmFzZXMoKTsKLSAgICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBJID0gUkQtPnZiYXNlc19iZWdpbigpLAotICAgICAgICAgICAgIEUgPSBSRC0+dmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICAgICAgRGlhZyhJLT5nZXRMb2NTdGFydCgpLAotICAgICAgICAgICAgIGRpYWc6Om5vdGVfY29uc3RleHByX3ZpcnR1YWxfYmFzZV9oZXJlKSA8PCBJLT5nZXRTb3VyY2VSYW5nZSgpOworICAgICAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPnZiYXNlcygpKQorICAgICAgICBEaWFnKEkuZ2V0TG9jU3RhcnQoKSwKKyAgICAgICAgICAgICBkaWFnOjpub3RlX2NvbnN0ZXhwcl92aXJ0dWFsX2Jhc2VfaGVyZSkgPDwgSS5nZXRTb3VyY2VSYW5nZSgpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfQpAQCAtNzg5LDcgKzc5NSw3IEBACiAgICAgfQogCiAgICAgLy8gLSBpdHMgcmV0dXJuIHR5cGUgc2hhbGwgYmUgYSBsaXRlcmFsIHR5cGU7Ci0gICAgUXVhbFR5cGUgUlQgPSBOZXdGRC0+Z2V0UmVzdWx0VHlwZSgpOworICAgIFF1YWxUeXBlIFJUID0gTmV3RkQtPmdldFJldHVyblR5cGUoKTsKICAgICBpZiAoIVJULT5pc0RlcGVuZGVudFR5cGUoKSAmJgogICAgICAgICBSZXF1aXJlTGl0ZXJhbFR5cGUoTmV3RkQtPmdldExvY2F0aW9uKCksIFJULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX2NvbnN0ZXhwcl9ub25fbGl0ZXJhbF9yZXR1cm4pKQpAQCAtODEzLDkgKzgxOSw4IEBACiAgIC8vIEMrKzExIFtkY2wuY29uc3RleHByXXAzIGFuZCBwNDoKICAgLy8gIFRoZSBkZWZpbml0aW9uIG9mIGEgY29uc3RleHByIGZ1bmN0aW9uKHAzKSBvciBjb25zdHJ1Y3RvcihwNCkgWy4uLl0gc2hhbGwKICAgLy8gIGNvbnRhaW4gb25seQotICBmb3IgKERlY2xTdG10OjpkZWNsX2l0ZXJhdG9yIERjbEl0ID0gRFMtPmRlY2xfYmVnaW4oKSwKLSAgICAgICAgIERjbEVuZCA9IERTLT5kZWNsX2VuZCgpOyBEY2xJdCAhPSBEY2xFbmQ7ICsrRGNsSXQpIHsKLSAgICBzd2l0Y2ggKCgqRGNsSXQpLT5nZXRLaW5kKCkpIHsKKyAgZm9yIChjb25zdCBhdXRvICpEY2xJdCA6IERTLT5kZWNscygpKSB7CisgICAgc3dpdGNoIChEY2xJdC0+Z2V0S2luZCgpKSB7CiAgICAgY2FzZSBEZWNsOjpTdGF0aWNBc3NlcnQ6CiAgICAgY2FzZSBEZWNsOjpVc2luZzoKICAgICBjYXNlIERlY2w6OlVzaW5nU2hhZG93OgpAQCAtODMxLDcgKzgzNiw3IEBACiAgICAgY2FzZSBEZWNsOjpUeXBlQWxpYXM6IHsKICAgICAgIC8vICAgLSB0eXBlZGVmIGRlY2xhcmF0aW9ucyBhbmQgYWxpYXMtZGVjbGFyYXRpb25zIHRoYXQgZG8gbm90IGRlZmluZQogICAgICAgLy8gICAgIGNsYXNzZXMgb3IgZW51bWVyYXRpb25zLAotICAgICAgVHlwZWRlZk5hbWVEZWNsICpUTiA9IGNhc3Q8VHlwZWRlZk5hbWVEZWNsPigqRGNsSXQpOworICAgICAgY29uc3QgYXV0byAqVE4gPSBjYXN0PFR5cGVkZWZOYW1lRGVjbD4oRGNsSXQpOwogICAgICAgaWYgKFROLT5nZXRVbmRlcmx5aW5nVHlwZSgpLT5pc1ZhcmlhYmx5TW9kaWZpZWRUeXBlKCkpIHsKICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgdmFyaWFibHktbW9kaWZpZWQgdHlwZXMgaW4gY29uc3RleHByIGZ1bmN0aW9ucy4KICAgICAgICAgVHlwZUxvYyBUTCA9IFROLT5nZXRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCk7CkBAIC04NDYsNyArODUxLDcgQEAKICAgICBjYXNlIERlY2w6OkVudW06CiAgICAgY2FzZSBEZWNsOjpDWFhSZWNvcmQ6CiAgICAgICAvLyBDKysxeSBhbGxvd3MgdHlwZXMgdG8gYmUgZGVmaW5lZCwgbm90IGp1c3QgZGVjbGFyZWQuCi0gICAgICBpZiAoY2FzdDxUYWdEZWNsPigqRGNsSXQpLT5pc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCkpCisgICAgICBpZiAoY2FzdDxUYWdEZWNsPihEY2xJdCktPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkKICAgICAgICAgU2VtYVJlZi5EaWFnKERTLT5nZXRMb2NTdGFydCgpLAogICAgICAgICAgICAgICAgICAgICAgU2VtYVJlZi5nZXRMYW5nT3B0cygpLkNQbHVzUGx1czF5CiAgICAgICAgICAgICAgICAgICAgICAgID8gZGlhZzo6d2Fybl9jeHgxMV9jb21wYXRfY29uc3RleHByX3R5cGVfZGVmaW5pdGlvbgpAQCAtODY1LDcgKzg3MCw3IEBACiAgICAgICAvLyBDKysxeSBbZGNsLmNvbnN0ZXhwcl1wMyBhbGxvd3MgYW55dGhpbmcgZXhjZXB0OgogICAgICAgLy8gICBhIGRlZmluaXRpb24gb2YgYSB2YXJpYWJsZSBvZiBub24tbGl0ZXJhbCB0eXBlIG9yIG9mIHN0YXRpYyBvcgogICAgICAgLy8gICB0aHJlYWQgc3RvcmFnZSBkdXJhdGlvbiBvciBmb3Igd2hpY2ggbm8gaW5pdGlhbGl6YXRpb24gaXMgcGVyZm9ybWVkLgotICAgICAgVmFyRGVjbCAqVkQgPSBjYXN0PFZhckRlY2w+KCpEY2xJdCk7CisgICAgICBjb25zdCBhdXRvICpWRCA9IGNhc3Q8VmFyRGVjbD4oRGNsSXQpOwogICAgICAgaWYgKFZELT5pc1RoaXNEZWNsYXJhdGlvbkFEZWZpbml0aW9uKCkpIHsKICAgICAgICAgaWYgKFZELT5pc1N0YXRpY0xvY2FsKCkpIHsKICAgICAgICAgICBTZW1hUmVmLkRpYWcoVkQtPmdldExvY2F0aW9uKCksCkBAIC04ODAsNyArODg1LDggQEAKICAgICAgICAgICAgICAgZGlhZzo6ZXJyX2NvbnN0ZXhwcl9sb2NhbF92YXJfbm9uX2xpdGVyYWxfdHlwZSwKICAgICAgICAgICAgICAgaXNhPENYWENvbnN0cnVjdG9yRGVjbD4oRGNsKSkpCiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIVZELT5oYXNJbml0KCkgJiYgIVZELT5pc0NYWEZvclJhbmdlRGVjbCgpKSB7CisgICAgICAgIGlmICghVkQtPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCkgJiYKKyAgICAgICAgICAgICFWRC0+aGFzSW5pdCgpICYmICFWRC0+aXNDWFhGb3JSYW5nZURlY2woKSkgewogICAgICAgICAgIFNlbWFSZWYuRGlhZyhWRC0+Z2V0TG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX2NvbnN0ZXhwcl9sb2NhbF92YXJfbm9faW5pdCkKICAgICAgICAgICAgIDw8IGlzYTxDWFhDb25zdHJ1Y3RvckRlY2w+KERjbCk7CkBAIC05MzIsOCArOTM4LDEzIEBACiAgIGlmIChGaWVsZC0+aXNVbm5hbWVkQml0ZmllbGQoKSkKICAgICByZXR1cm47CiAKKyAgLy8gQW5vbnltb3VzIHVuaW9ucyB3aXRoIG5vIHZhcmlhbnQgbWVtYmVycyBhbmQgZW1wdHkgYW5vbnltb3VzIHN0cnVjdHMgZG8gbm90CisgIC8vIG5lZWQgdG8gYmUgZXhwbGljaXRseSBpbml0aWFsaXplZC4gRklYTUU6IEFub255bW91cyBzdHJ1Y3RzIHRoYXQgY29udGFpbiBubworICAvLyBpbmRpcmVjdCBmaWVsZHMgZG9uJ3QgbmVlZCBpbml0aWFsaXppbmcuCiAgIGlmIChGaWVsZC0+aXNBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKCkgJiYKLSAgICAgIEZpZWxkLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpLT5pc0VtcHR5KCkpCisgICAgICAoRmllbGQtPmdldFR5cGUoKS0+aXNVbmlvblR5cGUoKQorICAgICAgICAgICA/ICFGaWVsZC0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKS0+aGFzVmFyaWFudE1lbWJlcnMoKQorICAgICAgICAgICA6IEZpZWxkLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpLT5pc0VtcHR5KCkpKQogICAgIHJldHVybjsKIAogICBpZiAoIUluaXRzLmNvdW50KEZpZWxkKSkgewpAQCAtOTQ0LDEyICs5NTUsMTEgQEAKICAgICBTZW1hUmVmLkRpYWcoRmllbGQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfY29uc3RleHByX2N0b3JfbWlzc2luZ19pbml0KTsKICAgfSBlbHNlIGlmIChGaWVsZC0+aXNBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKCkpIHsKICAgICBjb25zdCBSZWNvcmREZWNsICpSRCA9IEZpZWxkLT5nZXRUeXBlKCktPmNhc3RBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCk7Ci0gICAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBJID0gUkQtPmZpZWxkX2JlZ2luKCksIEUgPSBSRC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgICBJICE9IEU7ICsrSSkKKyAgICBmb3IgKGF1dG8gKkkgOiBSRC0+ZmllbGRzKCkpCiAgICAgICAvLyBJZiBhbiBhbm9ueW1vdXMgdW5pb24gY29udGFpbnMgYW4gYW5vbnltb3VzIHN0cnVjdCBvZiB3aGljaCBhbnkgbWVtYmVyCiAgICAgICAvLyBpcyBpbml0aWFsaXplZCwgYWxsIG1lbWJlcnMgbXVzdCBiZSBpbml0aWFsaXplZC4KLSAgICAgIGlmICghUkQtPmlzVW5pb24oKSB8fCBJbml0cy5jb3VudCgqSSkpCi0gICAgICAgIENoZWNrQ29uc3RleHByQ3RvckluaXRpYWxpemVyKFNlbWFSZWYsIERjbCwgKkksIEluaXRzLCBEaWFnbm9zZWQpOworICAgICAgaWYgKCFSRC0+aXNVbmlvbigpIHx8IEluaXRzLmNvdW50KEkpKQorICAgICAgICBDaGVja0NvbnN0ZXhwckN0b3JJbml0aWFsaXplcihTZW1hUmVmLCBEY2wsIEksIEluaXRzLCBEaWFnbm9zZWQpOwogICB9CiB9CiAKQEAgLTk5Myw5ICsxMDAzLDggQEAKICAgICAgIEN4eDF5TG9jID0gUy0+Z2V0TG9jU3RhcnQoKTsKIAogICAgIENvbXBvdW5kU3RtdCAqQ29tcFN0bXQgPSBjYXN0PENvbXBvdW5kU3RtdD4oUyk7Ci0gICAgZm9yIChDb21wb3VuZFN0bXQ6OmJvZHlfaXRlcmF0b3IgQm9keUl0ID0gQ29tcFN0bXQtPmJvZHlfYmVnaW4oKSwKLSAgICAgICAgICAgQm9keUVuZCA9IENvbXBTdG10LT5ib2R5X2VuZCgpOyBCb2R5SXQgIT0gQm9keUVuZDsgKytCb2R5SXQpIHsKLSAgICAgIGlmICghQ2hlY2tDb25zdGV4cHJGdW5jdGlvblN0bXQoU2VtYVJlZiwgRGNsLCAqQm9keUl0LCBSZXR1cm5TdG10cywKKyAgICBmb3IgKGF1dG8gKkJvZHlJdCA6IENvbXBTdG10LT5ib2R5KCkpIHsKKyAgICAgIGlmICghQ2hlY2tDb25zdGV4cHJGdW5jdGlvblN0bXQoU2VtYVJlZiwgRGNsLCBCb2R5SXQsIFJldHVyblN0bXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDeHgxeUxvYykpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0xMDk3LDkgKzExMDYsOCBAQAogICAvLyAgIFsuLi4gbGlzdCBvZiBjYXNlcyAuLi5dCiAgIENvbXBvdW5kU3RtdCAqQ29tcEJvZHkgPSBjYXN0PENvbXBvdW5kU3RtdD4oQm9keSk7CiAgIFNvdXJjZUxvY2F0aW9uIEN4eDF5TG9jOwotICBmb3IgKENvbXBvdW5kU3RtdDo6Ym9keV9pdGVyYXRvciBCb2R5SXQgPSBDb21wQm9keS0+Ym9keV9iZWdpbigpLAotICAgICAgICAgQm9keUVuZCA9IENvbXBCb2R5LT5ib2R5X2VuZCgpOyBCb2R5SXQgIT0gQm9keUVuZDsgKytCb2R5SXQpIHsKLSAgICBpZiAoIUNoZWNrQ29uc3RleHByRnVuY3Rpb25TdG10KCp0aGlzLCBEY2wsICpCb2R5SXQsIFJldHVyblN0bXRzLCBDeHgxeUxvYykpCisgIGZvciAoYXV0byAqQm9keUl0IDogQ29tcEJvZHktPmJvZHkoKSkgeworICAgIGlmICghQ2hlY2tDb25zdGV4cHJGdW5jdGlvblN0bXQoKnRoaXMsIERjbCwgQm9keUl0LCBSZXR1cm5TdG10cywgQ3h4MXlMb2MpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKQEAgLTExMTYsMTEgKzExMjQsMTIgQEAKICAgICAvLyBEUjEzNTk6CiAgICAgLy8gLSBldmVyeSBub24tdmFyaWFudCBub24tc3RhdGljIGRhdGEgbWVtYmVyIGFuZCBiYXNlIGNsYXNzIHN1Yi1vYmplY3QKICAgICAvLyAgIHNoYWxsIGJlIGluaXRpYWxpemVkOwotICAgIC8vIC0gaWYgdGhlIGNsYXNzIGlzIGEgbm9uLWVtcHR5IHVuaW9uLCBvciBmb3IgZWFjaCBub24tZW1wdHkgYW5vbnltb3VzCi0gICAgLy8gICB1bmlvbiBtZW1iZXIgb2YgYSBub24tdW5pb24gY2xhc3MsIGV4YWN0bHkgb25lIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIKKyAgICAvLyBEUjE0NjA6CisgICAgLy8gLSBpZiB0aGUgY2xhc3MgaXMgYSB1bmlvbiBoYXZpbmcgdmFyaWFudCBtZW1iZXJzLCBleGFjdGx5IG9uZSBvZiB0aGVtCiAgICAgLy8gICBzaGFsbCBiZSBpbml0aWFsaXplZDsKICAgICBpZiAoUkQtPmlzVW5pb24oKSkgewotICAgICAgaWYgKENvbnN0cnVjdG9yLT5nZXROdW1DdG9ySW5pdGlhbGl6ZXJzKCkgPT0gMCAmJiAhUkQtPmlzRW1wdHkoKSkgeworICAgICAgaWYgKENvbnN0cnVjdG9yLT5nZXROdW1DdG9ySW5pdGlhbGl6ZXJzKCkgPT0gMCAmJgorICAgICAgICAgIFJELT5oYXNWYXJpYW50TWVtYmVycygpKSB7CiAgICAgICAgIERpYWcoRGNsLT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfY29uc3RleHByX3VuaW9uX2N0b3Jfbm9faW5pdCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KQEAgLTExMzksMjUgKzExNDgsMjYgQEAKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQorICAgICAgLy8gRFIxNDYwOgorICAgICAgLy8gLSBpZiB0aGUgY2xhc3MgaXMgYSB1bmlvbi1saWtlIGNsYXNzLCBidXQgaXMgbm90IGEgdW5pb24sIGZvciBlYWNoIG9mCisgICAgICAvLyAgIGl0cyBhbm9ueW1vdXMgdW5pb24gbWVtYmVycyBoYXZpbmcgdmFyaWFudCBtZW1iZXJzLCBleGFjdGx5IG9uZSBvZgorICAgICAgLy8gICB0aGVtIHNoYWxsIGJlIGluaXRpYWxpemVkOwogICAgICAgaWYgKEFueUFub25TdHJ1Y3RVbmlvbk1lbWJlcnMgfHwKICAgICAgICAgICBDb25zdHJ1Y3Rvci0+Z2V0TnVtQ3RvckluaXRpYWxpemVycygpICE9IFJELT5nZXROdW1CYXNlcygpICsgRmllbGRzKSB7CiAgICAgICAgIC8vIENoZWNrIGluaXRpYWxpemF0aW9uIG9mIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzLiBCYXNlIGNsYXNzZXMgYXJlCiAgICAgICAgIC8vIGFsd2F5cyBpbml0aWFsaXplZCBzbyBkbyBub3QgbmVlZCB0byBiZSBjaGVja2VkLiBEZXBlbmRlbnQgYmFzZXMKICAgICAgICAgLy8gbWlnaHQgbm90IGhhdmUgaW5pdGlhbGl6ZXJzIGluIHRoZSBtZW1iZXIgaW5pdGlhbGl6ZXIgbGlzdC4KICAgICAgICAgbGx2bTo6U21hbGxTZXQ8RGVjbCosIDE2PiBJbml0czsKLSAgICAgICAgZm9yIChDWFhDb25zdHJ1Y3RvckRlY2w6OmluaXRfY29uc3RfaXRlcmF0b3IKLSAgICAgICAgICAgICAgIEkgPSBDb25zdHJ1Y3Rvci0+aW5pdF9iZWdpbigpLCBFID0gQ29uc3RydWN0b3ItPmluaXRfZW5kKCk7Ci0gICAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICAgICAgICBpZiAoRmllbGREZWNsICpGRCA9ICgqSSktPmdldE1lbWJlcigpKQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gKkk6IENvbnN0cnVjdG9yLT5pbml0cygpKSB7CisgICAgICAgICAgaWYgKEZpZWxkRGVjbCAqRkQgPSBJLT5nZXRNZW1iZXIoKSkKICAgICAgICAgICAgIEluaXRzLmluc2VydChGRCk7Ci0gICAgICAgICAgZWxzZSBpZiAoSW5kaXJlY3RGaWVsZERlY2wgKklEID0gKCpJKS0+Z2V0SW5kaXJlY3RNZW1iZXIoKSkKKyAgICAgICAgICBlbHNlIGlmIChJbmRpcmVjdEZpZWxkRGVjbCAqSUQgPSBJLT5nZXRJbmRpcmVjdE1lbWJlcigpKQogICAgICAgICAgICAgSW5pdHMuaW5zZXJ0KElELT5jaGFpbl9iZWdpbigpLCBJRC0+Y2hhaW5fZW5kKCkpOwogICAgICAgICB9CiAKICAgICAgICAgYm9vbCBEaWFnbm9zZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChDWFhSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBJID0gUkQtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICAgICAgRSA9IFJELT5maWVsZF9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgICAgICAgQ2hlY2tDb25zdGV4cHJDdG9ySW5pdGlhbGl6ZXIoKnRoaXMsIERjbCwgKkksIEluaXRzLCBEaWFnbm9zZWQpOworICAgICAgICBmb3IgKGF1dG8gKkkgOiBSRC0+ZmllbGRzKCkpCisgICAgICAgICAgQ2hlY2tDb25zdGV4cHJDdG9ySW5pdGlhbGl6ZXIoKnRoaXMsIERjbCwgSSwgSW5pdHMsIERpYWdub3NlZCk7CiAgICAgICAgIGlmIChEaWFnbm9zZWQpCiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQpAQCAtMTE2OCw3ICsxMTc4LDcgQEAKICAgICAgIC8vIHN0YXRlbWVudC4gV2Ugc3RpbGwgZG8sIHVubGVzcyB0aGUgcmV0dXJuIHR5cGUgaXMgdm9pZCwgYmVjYXVzZQogICAgICAgLy8gb3RoZXJ3aXNlIGlmIHRoZXJlJ3Mgbm8gcmV0dXJuIHN0YXRlbWVudCwgdGhlIGZ1bmN0aW9uIGNhbm5vdAogICAgICAgLy8gYmUgdXNlZCBpbiBhIGNvcmUgY29uc3RhbnQgZXhwcmVzc2lvbi4KLSAgICAgIGJvb2wgT0sgPSBnZXRMYW5nT3B0cygpLkNQbHVzUGx1czF5ICYmIERjbC0+Z2V0UmVzdWx0VHlwZSgpLT5pc1ZvaWRUeXBlKCk7CisgICAgICBib29sIE9LID0gZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxeSAmJiBEY2wtPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHlwZSgpOwogICAgICAgRGlhZyhEY2wtPmdldExvY2F0aW9uKCksCiAgICAgICAgICAgIE9LID8gZGlhZzo6d2Fybl9jeHgxMV9jb21wYXRfY29uc3RleHByX2JvZHlfbm9fcmV0dXJuCiAgICAgICAgICAgICAgIDogZGlhZzo6ZXJyX2NvbnN0ZXhwcl9ib2R5X25vX3JldHVybik7CkBAIC0xMjYxLDEwICsxMjcxLDggQEAKIAogICBDbGFzcyA9IENsYXNzLT5nZXRDYW5vbmljYWxEZWNsKCk7CiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBDdXJyZW50LT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gQ3VycmVudC0+YmFzZXNfZW5kKCk7Ci0gICAgICAgICBJICE9IEU7ICsrSSkgewotICAgICAgQ1hYUmVjb3JkRGVjbCAqQmFzZSA9IEktPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogQ3VycmVudC0+YmFzZXMoKSkgeworICAgICAgQ1hYUmVjb3JkRGVjbCAqQmFzZSA9IEkuZ2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKTsKICAgICAgIGlmICghQmFzZSkKICAgICAgICAgY29udGludWU7CiAKQEAgLTE1MDksNyArMTUxNyw3IEBACiAgICAgICAgICAgSW52YWxpZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKFJELT5oYXNBdHRyPFdlYWtBdHRyPigpKQotICAgICAgICAgIENsYXNzLT5hZGRBdHRyKDo6bmV3IChDb250ZXh0KSBXZWFrQXR0cihTb3VyY2VSYW5nZSgpLCBDb250ZXh0KSk7CisgICAgICAgICAgQ2xhc3MtPmFkZEF0dHIoV2Vha0F0dHI6OkNyZWF0ZUltcGxpY2l0KENvbnRleHQpKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE5NjUsNyArMTk3Myw4IEBACiAgICAgICBjb25zdCBjaGFyICpQcmV2U3BlYzsKICAgICAgIHVuc2lnbmVkIERpYWdJRDsKICAgICAgIGlmIChELmdldE11dGFibGVEZWNsU3BlYygpLlNldFN0b3JhZ2VDbGFzc1NwZWMoCi0gICAgICAgICAgKnRoaXMsIERlY2xTcGVjOjpTQ1Nfc3RhdGljLCBDb25zdGV4cHJMb2MsIFByZXZTcGVjLCBEaWFnSUQpKSB7CisgICAgICAgICAgKnRoaXMsIERlY2xTcGVjOjpTQ1Nfc3RhdGljLCBDb25zdGV4cHJMb2MsIFByZXZTcGVjLCBEaWFnSUQsCisgICAgICAgICAgQ29udGV4dC5nZXRQcmludGluZ1BvbGljeSgpKSkgewogICAgICAgICBhc3NlcnQoRFMuZ2V0U3RvcmFnZUNsYXNzU3BlYygpID09IERlY2xTcGVjOjpTQ1NfbXV0YWJsZSAmJgogICAgICAgICAgICAgICAgIlRoaXMgaXMgdGhlIG9ubHkgRGVjbFNwZWMgdGhhdCBzaG91bGQgZmFpbCB0byBiZSBhcHBsaWVkIik7CiAgICAgICAgIEIgPDwgMTsKQEAgLTIwODIsNyArMjA5MSw3IEBACiAgIH0KIAogICBpZiAoVlMuaXNPdmVycmlkZVNwZWNpZmllZCgpKQotICAgIE1lbWJlci0+YWRkQXR0cihuZXcgKENvbnRleHQpIE92ZXJyaWRlQXR0cihWUy5nZXRPdmVycmlkZUxvYygpLCBDb250ZXh0KSk7CisgICAgTWVtYmVyLT5hZGRBdHRyKG5ldyAoQ29udGV4dCkgT3ZlcnJpZGVBdHRyKFZTLmdldE92ZXJyaWRlTG9jKCksIENvbnRleHQsIDApKTsKICAgaWYgKFZTLmlzRmluYWxTcGVjaWZpZWQoKSkKICAgICBNZW1iZXItPmFkZEF0dHIobmV3IChDb250ZXh0KSBGaW5hbEF0dHIoVlMuZ2V0RmluYWxMb2MoKSwgQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlMuaXNGaW5hbFNwZWxsZWRTZWFsZWQoKSkpOwpAQCAtMjMwNiwzOCArMjMxNSw0NCBAQAogICAgIGxsdm06OlNtYWxsUHRyU2V0PFZhbHVlRGVjbCosIDQ+IFVuaW5pdGlhbGl6ZWRGaWVsZHM7CiAKICAgICAvLyBBdCB0aGUgYmVnaW5uaW5nLCBhbGwgZmllbGRzIGFyZSB1bmluaXRpYWxpemVkLgotICAgIGZvciAoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgSSA9IFJELT5kZWNsc19iZWdpbigpLCBFID0gUkQtPmRlY2xzX2VuZCgpOwotICAgICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICAgIGlmIChGaWVsZERlY2wgKkZEID0gZHluX2Nhc3Q8RmllbGREZWNsPigqSSkpIHsKKyAgICBmb3IgKGF1dG8gKkkgOiBSRC0+ZGVjbHMoKSkgeworICAgICAgaWYgKGF1dG8gKkZEID0gZHluX2Nhc3Q8RmllbGREZWNsPihJKSkgewogICAgICAgICBVbmluaXRpYWxpemVkRmllbGRzLmluc2VydChGRCk7Ci0gICAgICB9IGVsc2UgaWYgKEluZGlyZWN0RmllbGREZWNsICpJRkQgPSBkeW5fY2FzdDxJbmRpcmVjdEZpZWxkRGVjbD4oKkkpKSB7CisgICAgICB9IGVsc2UgaWYgKGF1dG8gKklGRCA9IGR5bl9jYXN0PEluZGlyZWN0RmllbGREZWNsPihJKSkgewogICAgICAgICBVbmluaXRpYWxpemVkRmllbGRzLmluc2VydChJRkQtPmdldEFub25GaWVsZCgpKTsKICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKENYWENvbnN0cnVjdG9yRGVjbDo6aW5pdF9jb25zdF9pdGVyYXRvciBGaWVsZEluaXQgPQotICAgICAgICAgICAgIENvbnN0cnVjdG9yLT5pbml0X2JlZ2luKCksCi0gICAgICAgICAgICAgRmllbGRJbml0RW5kID0gQ29uc3RydWN0b3ItPmluaXRfZW5kKCk7Ci0gICAgICAgICBGaWVsZEluaXQgIT0gRmllbGRJbml0RW5kOyArK0ZpZWxkSW5pdCkgewotCi0gICAgICBFeHByICpJbml0RXhwciA9ICgqRmllbGRJbml0KS0+Z2V0SW5pdCgpOworICAgIGZvciAoY29uc3QgYXV0byAqRmllbGRJbml0IDogQ29uc3RydWN0b3ItPmluaXRzKCkpIHsKKyAgICAgIEV4cHIgKkluaXRFeHByID0gRmllbGRJbml0LT5nZXRJbml0KCk7CiAKICAgICAgIENoZWNrSW5pdEV4cHJDb250YWluc1VuaW5pdGlhbGl6ZWRGaWVsZHMoCiAgICAgICAgICAgU2VtYVJlZiwgSW5pdEV4cHIsIFVuaW5pdGlhbGl6ZWRGaWVsZHMsIENvbnN0cnVjdG9yKTsKIAotICAgICAgaWYgKEZpZWxkRGVjbCAqRmllbGQgPSAoKkZpZWxkSW5pdCktPmdldEFueU1lbWJlcigpKQorICAgICAgaWYgKEZpZWxkRGVjbCAqRmllbGQgPSBGaWVsZEluaXQtPmdldEFueU1lbWJlcigpKQogICAgICAgICBVbmluaXRpYWxpemVkRmllbGRzLmVyYXNlKEZpZWxkKTsKICAgICB9CiAgIH0KIH0gLy8gbmFtZXNwYWNlCiAKLS8vLyBBY3RPbkNYWEluQ2xhc3NNZW1iZXJJbml0aWFsaXplciAtIFRoaXMgaXMgaW52b2tlZCBhZnRlciBwYXJzaW5nIGFuCi0vLy8gaW4tY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIGEgbm9uLXN0YXRpYyBDKysgY2xhc3MgbWVtYmVyLCBhbmQgYWZ0ZXIKLS8vLyBpbnN0YW50aWF0aW5nIGFuIGluLWNsYXNzIGluaXRpYWxpemVyIGluIGEgY2xhc3MgdGVtcGxhdGUuIFN1Y2ggYWN0aW9ucwotLy8vIGFyZSBkZWZlcnJlZCB1bnRpbCB0aGUgY2xhc3MgaXMgY29tcGxldGUuCi12b2lkCi1TZW1hOjpBY3RPbkNYWEluQ2xhc3NNZW1iZXJJbml0aWFsaXplcihEZWNsICpELCBTb3VyY2VMb2NhdGlvbiBJbml0TG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqSW5pdEV4cHIpIHsKKy8vLyBcYnJpZWYgRW50ZXIgYSBuZXcgQysrIGRlZmF1bHQgaW5pdGlhbGl6ZXIgc2NvcGUuIEFmdGVyIGNhbGxpbmcgdGhpcywgdGhlCisvLy8gY2FsbGVyIG11c3QgY2FsbCBccmVmIEFjdE9uRmluaXNoQ1hYSW5DbGFzc01lbWJlckluaXRpYWxpemVyLCBldmVuIGlmCisvLy8gcGFyc2luZyBvciBpbnN0YW50aWF0aW5nIHRoZSBpbml0aWFsaXplciBmYWlsZWQuCit2b2lkIFNlbWE6OkFjdE9uU3RhcnRDWFhJbkNsYXNzTWVtYmVySW5pdGlhbGl6ZXIoKSB7CisgIC8vIENyZWF0ZSBhIHN5bnRoZXRpYyBmdW5jdGlvbiBzY29wZSB0byByZXByZXNlbnQgdGhlIGNhbGwgdG8gdGhlIGNvbnN0cnVjdG9yCisgIC8vIHRoYXQgbm90aW9uYWxseSBzdXJyb3VuZHMgYSB1c2Ugb2YgdGhpcyBpbml0aWFsaXplci4KKyAgUHVzaEZ1bmN0aW9uU2NvcGUoKTsKK30KKworLy8vIFxicmllZiBUaGlzIGlzIGludm9rZWQgYWZ0ZXIgcGFyc2luZyBhbiBpbi1jbGFzcyBpbml0aWFsaXplciBmb3IgYQorLy8vIG5vbi1zdGF0aWMgQysrIGNsYXNzIG1lbWJlciwgYW5kIGFmdGVyIGluc3RhbnRpYXRpbmcgYW4gaW4tY2xhc3MgaW5pdGlhbGl6ZXIKKy8vLyBpbiBhIGNsYXNzIHRlbXBsYXRlLiBTdWNoIGFjdGlvbnMgYXJlIGRlZmVycmVkIHVudGlsIHRoZSBjbGFzcyBpcyBjb21wbGV0ZS4KK3ZvaWQgU2VtYTo6QWN0T25GaW5pc2hDWFhJbkNsYXNzTWVtYmVySW5pdGlhbGl6ZXIoRGVjbCAqRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW5pdExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqSW5pdEV4cHIpIHsKKyAgLy8gUG9wIHRoZSBub3Rpb25hbCBjb25zdHJ1Y3RvciBzY29wZSB3ZSBjcmVhdGVkIGVhcmxpZXIuCisgIFBvcEZ1bmN0aW9uU2NvcGVJbmZvKDAsIEQpOworCiAgIEZpZWxkRGVjbCAqRkQgPSBjYXN0PEZpZWxkRGVjbD4oRCk7CiAgIGFzc2VydChGRC0+Z2V0SW5DbGFzc0luaXRTdHlsZSgpICE9IElDSVNfTm9Jbml0ICYmCiAgICAgICAgICAibXVzdCBzZXQgaW5pdCBzdHlsZSB3aGVuIGZpZWxkIGlzIGNyZWF0ZWQiKTsKQEAgLTIzOTIsMTMgKzI0MDcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYQmFzZVNwZWNpZmllciAqJlZpcnR1YWxCYXNlU3BlYykgewogICAvLyBGaXJzdCwgY2hlY2sgZm9yIGEgZGlyZWN0IGJhc2UgY2xhc3MuCiAgIERpcmVjdEJhc2VTcGVjID0gMDsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEJhc2UKLSAgICAgICAgID0gQ2xhc3NEZWNsLT5iYXNlc19iZWdpbigpOyAKLSAgICAgICBCYXNlICE9IENsYXNzRGVjbC0+YmFzZXNfZW5kKCk7ICsrQmFzZSkgewotICAgIGlmIChTZW1hUmVmLkNvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShCYXNlVHlwZSwgQmFzZS0+Z2V0VHlwZSgpKSkgeworICBmb3IgKGNvbnN0IGF1dG8gJkJhc2UgOiBDbGFzc0RlY2wtPmJhc2VzKCkpIHsKKyAgICBpZiAoU2VtYVJlZi5Db250ZXh0Lmhhc1NhbWVVbnF1YWxpZmllZFR5cGUoQmFzZVR5cGUsIEJhc2UuZ2V0VHlwZSgpKSkgewogICAgICAgLy8gV2UgZm91bmQgYSBkaXJlY3QgYmFzZSBvZiB0aGlzIHR5cGUuIFRoYXQncyB3aGF0IHdlJ3JlCiAgICAgICAvLyBpbml0aWFsaXppbmcuCi0gICAgICBEaXJlY3RCYXNlU3BlYyA9ICYqQmFzZTsKKyAgICAgIERpcmVjdEJhc2VTcGVjID0gJkJhc2U7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KQEAgLTI0NzEsNyArMjQ4NCw3IEBACiAgIGV4cGxpY2l0IE1lbUluaXRpYWxpemVyVmFsaWRhdG9yQ0NDKENYWFJlY29yZERlY2wgKkNsYXNzRGVjbCkKICAgICAgIDogQ2xhc3NEZWNsKENsYXNzRGVjbCkge30KIAotICBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIExMVk1fT1ZFUlJJREUgeworICBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIG92ZXJyaWRlIHsKICAgICBpZiAoTmFtZWREZWNsICpORCA9IGNhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uRGVjbCgpKSB7CiAgICAgICBpZiAoRmllbGREZWNsICpNZW1iZXIgPSBkeW5fY2FzdDxGaWVsZERlY2w+KE5EKSkKICAgICAgICAgcmV0dXJuIE1lbWJlci0+Z2V0RGVjbENvbnRleHQoKS0+Z2V0UmVkZWNsQ29udGV4dCgpLT5FcXVhbHMoQ2xhc3NEZWNsKTsKQEAgLTI2MjksMTMgKzI2NDIsMTAgQEAKIAogICAgIGlmIChCYXNlVHlwZS5pc051bGwoKSkgewogICAgICAgQmFzZVR5cGUgPSBDb250ZXh0LmdldFR5cGVEZWNsVHlwZShUeUQpOwotICAgICAgaWYgKFNTLmlzU2V0KCkpIHsKLSAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllciAqUXVhbGlmaWVyID0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxOZXN0ZWROYW1lU3BlY2lmaWVyKj4oU1MuZ2V0U2NvcGVSZXAoKSk7Ci0KKyAgICAgIGlmIChTUy5pc1NldCgpKQogICAgICAgICAvLyBGSVhNRTogcHJlc2VydmUgc291cmNlIHJhbmdlIGluZm9ybWF0aW9uCi0gICAgICAgIEJhc2VUeXBlID0gQ29udGV4dC5nZXRFbGFib3JhdGVkVHlwZShFVEtfTm9uZSwgUXVhbGlmaWVyLCBCYXNlVHlwZSk7Ci0gICAgICB9CisgICAgICAgIEJhc2VUeXBlID0gQ29udGV4dC5nZXRFbGFib3JhdGVkVHlwZShFVEtfTm9uZSwgU1MuZ2V0U2NvcGVSZXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VUeXBlKTsKICAgICB9CiAgIH0KIApAQCAtMzMyMCw2ICszMzMwLDcgQEAKICAgSW1wbGljaXRJbml0aWFsaXplcktpbmQgSUlLOwogICBsbHZtOjpEZW5zZU1hcDxjb25zdCB2b2lkICosIENYWEN0b3JJbml0aWFsaXplcio+IEFsbEJhc2VGaWVsZHM7CiAgIFNtYWxsVmVjdG9yPENYWEN0b3JJbml0aWFsaXplciosIDg+IEFsbFRvSW5pdDsKKyAgbGx2bTo6RGVuc2VNYXA8VGFnRGVjbCosIEZpZWxkRGVjbCo+IEFjdGl2ZVVuaW9uTWVtYmVyOwogCiAgIEJhc2VBbmRGaWVsZEluZm8oU2VtYSAmUywgQ1hYQ29uc3RydWN0b3JEZWNsICpDdG9yLCBib29sIEVycm9yc0luSW5pdHMpCiAgICAgOiBTKFMpLCBDdG9yKEN0b3IpLCBBbnlFcnJvcnNJbkluaXRzKEVycm9yc0luSW5pdHMpIHsKQEAgLTMzNTcsMjAgKzMzNjgsNDggQEAKIAogICAgIHJldHVybiBmYWxzZTsKICAgfQotfTsKLX0KIAotLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gaW5kaXJlY3QgZmllbGQgZGVjbGFyYXRpb24gaXMgc29tZXdoZXJlCi0vLy8gd2l0aGluIGFuIGFub255bW91cyB1bmlvbi4KLXN0YXRpYyBib29sIGlzV2l0aGluQW5vbnltb3VzVW5pb24oSW5kaXJlY3RGaWVsZERlY2wgKkYpIHsKLSAgZm9yIChJbmRpcmVjdEZpZWxkRGVjbDo6Y2hhaW5faXRlcmF0b3IgQyA9IEYtPmNoYWluX2JlZ2luKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRW5kID0gRi0+Y2hhaW5fZW5kKCk7Ci0gICAgICAgQyAhPSBDRW5kOyArK0MpCi0gICAgaWYgKENYWFJlY29yZERlY2wgKlJlY29yZCA9IGR5bl9jYXN0PENYWFJlY29yZERlY2w+KCgqQyktPmdldERlY2xDb250ZXh0KCkpKQotICAgICAgaWYgKFJlY29yZC0+aXNVbmlvbigpKQorICBib29sIGlzSW5hY3RpdmVVbmlvbk1lbWJlcihGaWVsZERlY2wgKkZpZWxkKSB7CisgICAgUmVjb3JkRGVjbCAqUmVjb3JkID0gRmllbGQtPmdldFBhcmVudCgpOworICAgIGlmICghUmVjb3JkLT5pc1VuaW9uKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoRmllbGREZWNsICpBY3RpdmUgPQorICAgICAgICAgICAgQWN0aXZlVW5pb25NZW1iZXIubG9va3VwKFJlY29yZC0+Z2V0Q2Fub25pY2FsRGVjbCgpKSkKKyAgICAgIHJldHVybiBBY3RpdmUgIT0gRmllbGQtPmdldENhbm9uaWNhbERlY2woKTsKKworICAgIC8vIEluIGFuIGltcGxpY2l0IGNvcHkgb3IgbW92ZSBjb25zdHJ1Y3RvciwgaWdub3JlIGFueSBpbi1jbGFzcyBpbml0aWFsaXplci4KKyAgICBpZiAoaXNJbXBsaWNpdENvcHlPck1vdmUoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gSWYgdGhlcmUncyBubyBleHBsaWNpdCBpbml0aWFsaXphdGlvbiwgdGhlIGZpZWxkIGlzIGFjdGl2ZSBvbmx5IGlmIGl0CisgICAgLy8gaGFzIGFuIGluLWNsYXNzIGluaXRpYWxpemVyLi4uCisgICAgaWYgKEZpZWxkLT5oYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyAuLi4gb3IgaXQncyBhbiBhbm9ueW1vdXMgc3RydWN0IG9yIHVuaW9uIHdob3NlIGNsYXNzIGhhcyBhbiBpbi1jbGFzcworICAgIC8vIGluaXRpYWxpemVyLgorICAgIGlmICghRmllbGQtPmlzQW5vbnltb3VzU3RydWN0T3JVbmlvbigpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgQ1hYUmVjb3JkRGVjbCAqRmllbGRSRCA9IEZpZWxkLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpOworICAgIHJldHVybiAhRmllbGRSRC0+aGFzSW5DbGFzc0luaXRpYWxpemVyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBmaWVsZCBpcywgb3IgaXMgd2l0aGluLCBhIHVuaW9uIG1lbWJlcgorICAvLy8gdGhhdCBpcyBpbmFjdGl2ZSAoYmVjYXVzZSB0aGVyZSB3YXMgYW4gaW5pdGlhbGl6ZXIgZ2l2ZW4gZm9yIGEgZGlmZmVyZW50CisgIC8vLyBtZW1iZXIgb2YgdGhlIHVuaW9uLCBvciBiZWNhdXNlIHRoZSB1bmlvbiB3YXMgbm90IGluaXRpYWxpemVkIGF0IGFsbCkuCisgIGJvb2wgaXNXaXRoaW5JbmFjdGl2ZVVuaW9uTWVtYmVyKEZpZWxkRGVjbCAqRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGlyZWN0RmllbGREZWNsICpJbmRpcmVjdCkgeworICAgIGlmICghSW5kaXJlY3QpCisgICAgICByZXR1cm4gaXNJbmFjdGl2ZVVuaW9uTWVtYmVyKEZpZWxkKTsKKworICAgIGZvciAoYXV0byAqQyA6IEluZGlyZWN0LT5jaGFpbigpKSB7CisgICAgICBGaWVsZERlY2wgKkZpZWxkID0gZHluX2Nhc3Q8RmllbGREZWNsPihDKTsKKyAgICAgIGlmIChGaWVsZCAmJiBpc0luYWN0aXZlVW5pb25NZW1iZXIoRmllbGQpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgCi0gIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OwogfQogCiAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiB0eXBlIGlzIGFuIGluY29tcGxldGUgb3IgemVyby1sZW5mZ3RoCkBAIC0zMzk5LDkgKzM0MzgsMjEgQEAKICAgaWYgKENYWEN0b3JJbml0aWFsaXplciAqSW5pdCA9IEluZm8uQWxsQmFzZUZpZWxkcy5sb29rdXAoRmllbGQpKQogICAgIHJldHVybiBJbmZvLmFkZEZpZWxkSW5pdGlhbGl6ZXIoSW5pdCk7CiAKLSAgLy8gQysrMTEgW2NsYXNzLmJhc2UuaW5pdF1wODogaWYgdGhlIGVudGl0eSBpcyBhIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIgdGhhdAotICAvLyBoYXMgYSBicmFjZS1vci1lcXVhbC1pbml0aWFsaXplciwgdGhlIGVudGl0eSBpcyBpbml0aWFsaXplZCBhcyBzcGVjaWZpZWQKLSAgLy8gaW4gW2RjbC5pbml0XS4KKyAgLy8gQysrMTEgW2NsYXNzLmJhc2UuaW5pdF1wODoKKyAgLy8gICBpZiB0aGUgZW50aXR5IGlzIGEgbm9uLXN0YXRpYyBkYXRhIG1lbWJlciB0aGF0IGhhcyBhCisgIC8vICAgYnJhY2Utb3ItZXF1YWwtaW5pdGlhbGl6ZXIgYW5kIGVpdGhlcgorICAvLyAgIC0tIHRoZSBjb25zdHJ1Y3RvcidzIGNsYXNzIGlzIGEgdW5pb24gYW5kIG5vIG90aGVyIHZhcmlhbnQgbWVtYmVyIG9mIHRoYXQKKyAgLy8gICAgICB1bmlvbiBpcyBkZXNpZ25hdGVkIGJ5IGEgbWVtLWluaXRpYWxpemVyLWlkIG9yCisgIC8vICAgLS0gdGhlIGNvbnN0cnVjdG9yJ3MgY2xhc3MgaXMgbm90IGEgdW5pb24sIGFuZCwgaWYgdGhlIGVudGl0eSBpcyBhIG1lbWJlcgorICAvLyAgICAgIG9mIGFuIGFub255bW91cyB1bmlvbiwgbm8gb3RoZXIgbWVtYmVyIG9mIHRoYXQgdW5pb24gaXMgZGVzaWduYXRlZCBieQorICAvLyAgICAgIGEgbWVtLWluaXRpYWxpemVyLWlkLAorICAvLyAgIHRoZSBlbnRpdHkgaXMgaW5pdGlhbGl6ZWQgYXMgc3BlY2lmaWVkIGluIFtkY2wuaW5pdF0uCisgIC8vCisgIC8vIFdlIGFsc28gYXBwbHkgdGhlIHNhbWUgcnVsZXMgdG8gaGFuZGxlIGFub255bW91cyBzdHJ1Y3RzIHdpdGhpbiBhbm9ueW1vdXMKKyAgLy8gdW5pb25zLgorICBpZiAoSW5mby5pc1dpdGhpbkluYWN0aXZlVW5pb25NZW1iZXIoRmllbGQsIEluZGlyZWN0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKICAgaWYgKEZpZWxkLT5oYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSAmJiAhSW5mby5pc0ltcGxpY2l0Q29weU9yTW92ZSgpKSB7CiAgICAgRXhwciAqRElFID0gQ1hYRGVmYXVsdEluaXRFeHByOjpDcmVhdGUoU2VtYVJlZi5Db250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8uQ3Rvci0+Z2V0TG9jYXRpb24oKSwgRmllbGQpOwpAQCAtMzQxOSwxMiArMzQ3MCw2IEBACiAgICAgcmV0dXJuIEluZm8uYWRkRmllbGRJbml0aWFsaXplcihJbml0KTsKICAgfQogCi0gIC8vIERvbid0IGJ1aWxkIGFuIGltcGxpY2l0IGluaXRpYWxpemVyIGZvciB1bmlvbiBtZW1iZXJzIGlmIG5vbmUgd2FzCi0gIC8vIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgotICBpZiAoRmllbGQtPmdldFBhcmVudCgpLT5pc1VuaW9uKCkgfHwKLSAgICAgIChJbmRpcmVjdCAmJiBpc1dpdGhpbkFub255bW91c1VuaW9uKEluZGlyZWN0KSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCiAgIC8vIERvbid0IGluaXRpYWxpemUgaW5jb21wbGV0ZSBvciB6ZXJvLWxlbmd0aCBhcnJheXMuCiAgIGlmIChpc0luY29tcGxldGVPclplcm9MZW5ndGhBcnJheVR5cGUoU2VtYVJlZi5Db250ZXh0LCBGaWVsZC0+Z2V0VHlwZSgpKSkKICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNTAyLDI0ICszNTQ3LDM1IEBACiAKICAgICBpZiAoTWVtYmVyLT5pc0Jhc2VJbml0aWFsaXplcigpKQogICAgICAgSW5mby5BbGxCYXNlRmllbGRzW01lbWJlci0+Z2V0QmFzZUNsYXNzKCktPmdldEFzPFJlY29yZFR5cGU+KCldID0gTWVtYmVyOwotICAgIGVsc2UKKyAgICBlbHNlIHsKICAgICAgIEluZm8uQWxsQmFzZUZpZWxkc1tNZW1iZXItPmdldEFueU1lbWJlcigpXSA9IE1lbWJlcjsKKworICAgICAgaWYgKEluZGlyZWN0RmllbGREZWNsICpGID0gTWVtYmVyLT5nZXRJbmRpcmVjdE1lbWJlcigpKSB7CisgICAgICAgIGZvciAoYXV0byAqQyA6IEYtPmNoYWluKCkpIHsKKyAgICAgICAgICBGaWVsZERlY2wgKkZEID0gZHluX2Nhc3Q8RmllbGREZWNsPihDKTsKKyAgICAgICAgICBpZiAoRkQgJiYgRkQtPmdldFBhcmVudCgpLT5pc1VuaW9uKCkpCisgICAgICAgICAgICBJbmZvLkFjdGl2ZVVuaW9uTWVtYmVyLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBGRC0+Z2V0UGFyZW50KCktPmdldENhbm9uaWNhbERlY2woKSwgRkQtPmdldENhbm9uaWNhbERlY2woKSkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKEZpZWxkRGVjbCAqRkQgPSBNZW1iZXItPmdldE1lbWJlcigpKSB7CisgICAgICAgIGlmIChGRC0+Z2V0UGFyZW50KCktPmlzVW5pb24oKSkKKyAgICAgICAgICBJbmZvLkFjdGl2ZVVuaW9uTWVtYmVyLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgRkQtPmdldFBhcmVudCgpLT5nZXRDYW5vbmljYWxEZWNsKCksIEZELT5nZXRDYW5vbmljYWxEZWNsKCkpKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KIAogICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBkaXJlY3QgdmlydHVhbCBiYXNlcy4KICAgbGx2bTo6U21hbGxQdHJTZXQ8Q1hYQmFzZVNwZWNpZmllciAqLCAxNj4gRGlyZWN0VkJhc2VzOwotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgSSA9IENsYXNzRGVjbC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICBFID0gQ2xhc3NEZWNsLT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoSS0+aXNWaXJ0dWFsKCkpCi0gICAgICBEaXJlY3RWQmFzZXMuaW5zZXJ0KEkpOworICBmb3IgKGF1dG8gJkkgOiBDbGFzc0RlY2wtPmJhc2VzKCkpIHsKKyAgICBpZiAoSS5pc1ZpcnR1YWwoKSkKKyAgICAgIERpcmVjdFZCYXNlcy5pbnNlcnQoJkkpOwogICB9CiAKICAgLy8gUHVzaCB2aXJ0dWFsIGJhc2VzIGJlZm9yZSBvdGhlcnMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBWQmFzZSA9IENsYXNzRGVjbC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IENsYXNzRGVjbC0+dmJhc2VzX2VuZCgpOyBWQmFzZSAhPSBFOyArK1ZCYXNlKSB7Ci0KKyAgZm9yIChhdXRvICZWQmFzZSA6IENsYXNzRGVjbC0+dmJhc2VzKCkpIHsKICAgICBpZiAoQ1hYQ3RvckluaXRpYWxpemVyICpWYWx1ZQotICAgICAgICA9IEluZm8uQWxsQmFzZUZpZWxkcy5sb29rdXAoVkJhc2UtPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkpIHsKKyAgICAgICAgPSBJbmZvLkFsbEJhc2VGaWVsZHMubG9va3VwKFZCYXNlLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkpIHsKICAgICAgIC8vIFtjbGFzcy5iYXNlLmluaXRdcDcsIHBlciBEUjI1NzoKICAgICAgIC8vICAgQSBtZW0taW5pdGlhbGl6ZXIgd2hlcmUgdGhlIG1lbS1pbml0aWFsaXplci1pZCBuYW1lcyBhIHZpcnR1YWwgYmFzZQogICAgICAgLy8gICBjbGFzcyBpcyBpZ25vcmVkIGR1cmluZyBleGVjdXRpb24gb2YgYSBjb25zdHJ1Y3RvciBvZiBhbnkgY2xhc3MgdGhhdApAQCAtMzUyOCw3ICszNTg0LDcgQEAKICAgICAgICAgLy8gRklYTUU6IFByb3ZpZGUgYSBmaXhpdCB0byByZW1vdmUgdGhlIGJhc2Ugc3BlY2lmaWVyLiBUaGlzIHJlcXVpcmVzCiAgICAgICAgIC8vIHRyYWNraW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBjb21tYSBmb3IgYSBiYXNlIHNwZWNpZmllci4KICAgICAgICAgRGlhZyhWYWx1ZS0+Z2V0U291cmNlTG9jYXRpb24oKSwgZGlhZzo6d2Fybl9hYnN0cmFjdF92YmFzZV9pbml0X2lnbm9yZWQpCi0gICAgICAgICAgPDwgVkJhc2UtPmdldFR5cGUoKSA8PCBDbGFzc0RlY2w7CisgICAgICAgICAgPDwgVkJhc2UuZ2V0VHlwZSgpIDw8IENsYXNzRGVjbDsKICAgICAgICAgRGlhZ25vc2VBYnN0cmFjdFR5cGUoQ2xhc3NEZWNsKTsKICAgICAgIH0KIApAQCAtMzUzOCwxMCArMzU5NCwxMCBAQAogICAgICAgLy8gICBJZiBhIGdpdmVuIFsuLi5dIGJhc2UgY2xhc3MgaXMgbm90IG5hbWVkIGJ5IGEgbWVtLWluaXRpYWxpemVyLWlkCiAgICAgICAvLyAgIFsuLi5dIGFuZCB0aGUgZW50aXR5IGlzIG5vdCBhIHZpcnR1YWwgYmFzZSBjbGFzcyBvZiBhbiBhYnN0cmFjdAogICAgICAgLy8gICBjbGFzcywgdGhlbiBbLi4uXSB0aGUgZW50aXR5IGlzIGRlZmF1bHQtaW5pdGlhbGl6ZWQuCi0gICAgICBib29sIElzSW5oZXJpdGVkVmlydHVhbEJhc2UgPSAhRGlyZWN0VkJhc2VzLmNvdW50KFZCYXNlKTsKKyAgICAgIGJvb2wgSXNJbmhlcml0ZWRWaXJ0dWFsQmFzZSA9ICFEaXJlY3RWQmFzZXMuY291bnQoJlZCYXNlKTsKICAgICAgIENYWEN0b3JJbml0aWFsaXplciAqQ1hYQmFzZUluaXQ7CiAgICAgICBpZiAoQnVpbGRJbXBsaWNpdEJhc2VJbml0aWFsaXplcigqdGhpcywgQ29uc3RydWN0b3IsIEluZm8uSUlLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkJhc2UsIElzSW5oZXJpdGVkVmlydHVhbEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVkJhc2UsIElzSW5oZXJpdGVkVmlydHVhbEJhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhCYXNlSW5pdCkpIHsKICAgICAgICAgSGFkRXJyb3IgPSB0cnVlOwogICAgICAgICBjb250aW51ZTsKQEAgLTM1NTIsMTkgKzM2MDgsMTggQEAKICAgfQogCiAgIC8vIE5vbi12aXJ0dWFsIGJhc2VzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQmFzZSA9IENsYXNzRGVjbC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICBFID0gQ2xhc3NEZWNsLT5iYXNlc19lbmQoKTsgQmFzZSAhPSBFOyArK0Jhc2UpIHsKKyAgZm9yIChhdXRvICZCYXNlIDogQ2xhc3NEZWNsLT5iYXNlcygpKSB7CiAgICAgLy8gVmlydHVhbHMgYXJlIGluIHRoZSB2aXJ0dWFsIGJhc2UgbGlzdCBhbmQgYWxyZWFkeSBjb25zdHJ1Y3RlZC4KLSAgICBpZiAoQmFzZS0+aXNWaXJ0dWFsKCkpCisgICAgaWYgKEJhc2UuaXNWaXJ0dWFsKCkpCiAgICAgICBjb250aW51ZTsKIAogICAgIGlmIChDWFhDdG9ySW5pdGlhbGl6ZXIgKlZhbHVlCi0gICAgICAgICAgPSBJbmZvLkFsbEJhc2VGaWVsZHMubG9va3VwKEJhc2UtPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkpIHsKKyAgICAgICAgICA9IEluZm8uQWxsQmFzZUZpZWxkcy5sb29rdXAoQmFzZS5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCkpKSB7CiAgICAgICBJbmZvLkFsbFRvSW5pdC5wdXNoX2JhY2soVmFsdWUpOwogICAgIH0gZWxzZSBpZiAoIUFueUVycm9ycykgewogICAgICAgQ1hYQ3RvckluaXRpYWxpemVyICpDWFhCYXNlSW5pdDsKICAgICAgIGlmIChCdWlsZEltcGxpY2l0QmFzZUluaXRpYWxpemVyKCp0aGlzLCBDb25zdHJ1Y3RvciwgSW5mby5JSUssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlLCAvKklzSW5oZXJpdGVkVmlydHVhbEJhc2U9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCYXNlLCAvKklzSW5oZXJpdGVkVmlydHVhbEJhc2U9Ki9mYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWEJhc2VJbml0KSkgewogICAgICAgICBIYWRFcnJvciA9IHRydWU7CiAgICAgICAgIGNvbnRpbnVlOwpAQCAtMzU3NSwxMCArMzYzMCw4IEBACiAgIH0KIAogICAvLyBGaWVsZHMuCi0gIGZvciAoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgTWVtID0gQ2xhc3NEZWNsLT5kZWNsc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbUVuZCA9IENsYXNzRGVjbC0+ZGVjbHNfZW5kKCk7Ci0gICAgICAgTWVtICE9IE1lbUVuZDsgKytNZW0pIHsKLSAgICBpZiAoRmllbGREZWNsICpGID0gZHluX2Nhc3Q8RmllbGREZWNsPigqTWVtKSkgeworICBmb3IgKGF1dG8gKk1lbSA6IENsYXNzRGVjbC0+ZGVjbHMoKSkgeworICAgIGlmIChhdXRvICpGID0gZHluX2Nhc3Q8RmllbGREZWNsPihNZW0pKSB7CiAgICAgICAvLyBDKysgW2NsYXNzLmJpdF1wMjoKICAgICAgIC8vICAgQSBkZWNsYXJhdGlvbiBmb3IgYSBiaXQtZmllbGQgdGhhdCBvbWl0cyB0aGUgaWRlbnRpZmllciBkZWNsYXJlcyBhbgogICAgICAgLy8gICB1bm5hbWVkIGJpdC1maWVsZC4gVW5uYW1lZCBiaXQtZmllbGRzIGFyZSBub3QgbWVtYmVycyBhbmQgY2Fubm90IGJlCkBAIC0zNjAxLDcgKzM2NTQsNyBAQAogICAgIGlmIChJbmZvLmlzSW1wbGljaXRDb3B5T3JNb3ZlKCkpCiAgICAgICBjb250aW51ZTsKICAgICAKLSAgICBpZiAoSW5kaXJlY3RGaWVsZERlY2wgKkYgPSBkeW5fY2FzdDxJbmRpcmVjdEZpZWxkRGVjbD4oKk1lbSkpIHsKKyAgICBpZiAoYXV0byAqRiA9IGR5bl9jYXN0PEluZGlyZWN0RmllbGREZWNsPihNZW0pKSB7CiAgICAgICBpZiAoRi0+Z2V0VHlwZSgpLT5pc0luY29tcGxldGVBcnJheVR5cGUoKSkgewogICAgICAgICBhc3NlcnQoQ2xhc3NEZWNsLT5oYXNGbGV4aWJsZUFycmF5TWVtYmVyKCkgJiYKICAgICAgICAgICAgICAgICJJbmNvbXBsZXRlIGFycmF5IHR5cGUgaXMgbm90IHZhbGlkIik7CkBAIC0zNjM4LDkgKzM2OTEsOCBAQAogICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBGaWVsZC0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CiAgICAgY29uc3QgUmVjb3JkRGVjbCAqUkQgPSBSVC0+Z2V0RGVjbCgpOwogICAgIGlmIChSRC0+aXNBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKCkpIHsKLSAgICAgIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRmllbGQgPSBSRC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICBFID0gUkQtPmZpZWxkX2VuZCgpOyBGaWVsZCAhPSBFOyArK0ZpZWxkKQotICAgICAgICBQb3B1bGF0ZUtleXNGb3JGaWVsZHMoKkZpZWxkLCBJZGVhbEluaXRzKTsKKyAgICAgIGZvciAoYXV0byAqRmllbGQgOiBSRC0+ZmllbGRzKCkpCisgICAgICAgIFBvcHVsYXRlS2V5c0ZvckZpZWxkcyhGaWVsZCwgSWRlYWxJbml0cyk7CiAgICAgICByZXR1cm47CiAgICAgfQogICB9CkBAIC0zNjg4LDI2ICszNzQwLDIyIEBACiAgIGNvbnN0IENYWFJlY29yZERlY2wgKkNsYXNzRGVjbCA9IENvbnN0cnVjdG9yLT5nZXRQYXJlbnQoKTsKIAogICAvLyAxLiBWaXJ0dWFsIGJhc2VzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgVkJhc2UgPQotICAgICAgIENsYXNzRGVjbC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IENsYXNzRGVjbC0+dmJhc2VzX2VuZCgpOyBWQmFzZSAhPSBFOyArK1ZCYXNlKQotICAgIElkZWFsSW5pdEtleXMucHVzaF9iYWNrKEdldEtleUZvckJhc2UoU2VtYVJlZi5Db250ZXh0LCBWQmFzZS0+Z2V0VHlwZSgpKSk7CisgIGZvciAoY29uc3QgYXV0byAmVkJhc2UgOiBDbGFzc0RlY2wtPnZiYXNlcygpKQorICAgIElkZWFsSW5pdEtleXMucHVzaF9iYWNrKEdldEtleUZvckJhc2UoU2VtYVJlZi5Db250ZXh0LCBWQmFzZS5nZXRUeXBlKCkpKTsKIAogICAvLyAyLiBOb24tdmlydHVhbCBiYXNlcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEJhc2UgPSBDbGFzc0RlY2wtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IENsYXNzRGVjbC0+YmFzZXNfZW5kKCk7IEJhc2UgIT0gRTsgKytCYXNlKSB7Ci0gICAgaWYgKEJhc2UtPmlzVmlydHVhbCgpKQorICBmb3IgKGNvbnN0IGF1dG8gJkJhc2UgOiBDbGFzc0RlY2wtPmJhc2VzKCkpIHsKKyAgICBpZiAoQmFzZS5pc1ZpcnR1YWwoKSkKICAgICAgIGNvbnRpbnVlOwotICAgIElkZWFsSW5pdEtleXMucHVzaF9iYWNrKEdldEtleUZvckJhc2UoU2VtYVJlZi5Db250ZXh0LCBCYXNlLT5nZXRUeXBlKCkpKTsKKyAgICBJZGVhbEluaXRLZXlzLnB1c2hfYmFjayhHZXRLZXlGb3JCYXNlKFNlbWFSZWYuQ29udGV4dCwgQmFzZS5nZXRUeXBlKCkpKTsKICAgfQogCiAgIC8vIDMuIERpcmVjdCBmaWVsZHMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRmllbGQgPSBDbGFzc0RlY2wtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgRSA9IENsYXNzRGVjbC0+ZmllbGRfZW5kKCk7IEZpZWxkICE9IEU7ICsrRmllbGQpIHsKKyAgZm9yIChhdXRvICpGaWVsZCA6IENsYXNzRGVjbC0+ZmllbGRzKCkpIHsKICAgICBpZiAoRmllbGQtPmlzVW5uYW1lZEJpdGZpZWxkKCkpCiAgICAgICBjb250aW51ZTsKICAgICAKLSAgICBQb3B1bGF0ZUtleXNGb3JGaWVsZHMoKkZpZWxkLCBJZGVhbEluaXRLZXlzKTsKKyAgICBQb3B1bGF0ZUtleXNGb3JGaWVsZHMoRmllbGQsIElkZWFsSW5pdEtleXMpOwogICB9CiAgIAogICB1bnNpZ25lZCBOdW1JZGVhbEluaXRzID0gSWRlYWxJbml0S2V5cy5zaXplKCk7CkBAIC0zOTAzLDkgKzM5NTEsNyBAQAogICAvLyBlbWl0dGVkLCBhbmQgd2UgY3VycmVudGx5IGRvbid0IHNheS4KICAgCiAgIC8vIE5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEkgPSBDbGFzc0RlY2wtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgRSA9IENsYXNzRGVjbC0+ZmllbGRfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgRmllbGREZWNsICpGaWVsZCA9ICpJOworICBmb3IgKGF1dG8gKkZpZWxkIDogQ2xhc3NEZWNsLT5maWVsZHMoKSkgewogICAgIGlmIChGaWVsZC0+aXNJbnZhbGlkRGVjbCgpKQogICAgICAgY29udGludWU7CiAgICAgCkBAIC0zOTQyLDEzICszOTg4LDEyIEBACiAgIGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IFJlY29yZFR5cGUgKiwgOD4gRGlyZWN0VmlydHVhbEJhc2VzOwogCiAgIC8vIEJhc2VzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQmFzZSA9IENsYXNzRGVjbC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICBFID0gQ2xhc3NEZWNsLT5iYXNlc19lbmQoKTsgQmFzZSAhPSBFOyArK0Jhc2UpIHsKKyAgZm9yIChjb25zdCBhdXRvICZCYXNlIDogQ2xhc3NEZWNsLT5iYXNlcygpKSB7CiAgICAgLy8gQmFzZXMgYXJlIGFsd2F5cyByZWNvcmRzIGluIGEgd2VsbC1mb3JtZWQgbm9uLWRlcGVuZGVudCBjbGFzcy4KLSAgICBjb25zdCBSZWNvcmRUeXBlICpSVCA9IEJhc2UtPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKTsKKyAgICBjb25zdCBSZWNvcmRUeXBlICpSVCA9IEJhc2UuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpOwogCiAgICAgLy8gUmVtZW1iZXIgZGlyZWN0IHZpcnR1YWwgYmFzZXMuCi0gICAgaWYgKEJhc2UtPmlzVmlydHVhbCgpKQorICAgIGlmIChCYXNlLmlzVmlydHVhbCgpKQogICAgICAgRGlyZWN0VmlydHVhbEJhc2VzLmluc2VydChSVCk7CiAKICAgICBDWFhSZWNvcmREZWNsICpCYXNlQ2xhc3NEZWNsID0gY2FzdDxDWFhSZWNvcmREZWNsPihSVC0+Z2V0RGVjbCgpKTsKQEAgLTM5NjIsMTAgKzQwMDcsMTAgQEAKICAgICBhc3NlcnQoRHRvciAmJiAiTm8gZHRvciBmb3VuZCBmb3IgQmFzZUNsYXNzRGVjbCEiKTsKIAogICAgIC8vIEZJWE1FOiBjYXJldCBzaG91bGQgYmUgb24gdGhlIHN0YXJ0IG9mIHRoZSBjbGFzcyBuYW1lCi0gICAgQ2hlY2tEZXN0cnVjdG9yQWNjZXNzKEJhc2UtPmdldExvY1N0YXJ0KCksIER0b3IsCisgICAgQ2hlY2tEZXN0cnVjdG9yQWNjZXNzKEJhc2UuZ2V0TG9jU3RhcnQoKSwgRHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUERpYWcoZGlhZzo6ZXJyX2FjY2Vzc19kdG9yX2Jhc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQmFzZS0+Z2V0VHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQmFzZS0+Z2V0U291cmNlUmFuZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBCYXNlLmdldFR5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEJhc2UuZ2V0U291cmNlUmFuZ2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5nZXRUeXBlRGVjbFR5cGUoQ2xhc3NEZWNsKSk7CiAgICAgCiAgICAgTWFya0Z1bmN0aW9uUmVmZXJlbmNlZChMb2NhdGlvbiwgRHRvcik7CkBAIC0zOTczLDExICs0MDE4LDkgQEAKICAgfQogICAKICAgLy8gVmlydHVhbCBiYXNlcy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yIFZCYXNlID0gQ2xhc3NEZWNsLT52YmFzZXNfYmVnaW4oKSwKLSAgICAgICBFID0gQ2xhc3NEZWNsLT52YmFzZXNfZW5kKCk7IFZCYXNlICE9IEU7ICsrVkJhc2UpIHsKLQorICBmb3IgKGNvbnN0IGF1dG8gJlZCYXNlIDogQ2xhc3NEZWNsLT52YmFzZXMoKSkgewogICAgIC8vIEJhc2VzIGFyZSBhbHdheXMgcmVjb3JkcyBpbiBhIHdlbGwtZm9ybWVkIG5vbi1kZXBlbmRlbnQgY2xhc3MuCi0gICAgY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBWQmFzZS0+Z2V0VHlwZSgpLT5jYXN0QXM8UmVjb3JkVHlwZT4oKTsKKyAgICBjb25zdCBSZWNvcmRUeXBlICpSVCA9IFZCYXNlLmdldFR5cGUoKS0+Y2FzdEFzPFJlY29yZFR5cGU+KCk7CiAKICAgICAvLyBJZ25vcmUgZGlyZWN0IHZpcnR1YWwgYmFzZXMuCiAgICAgaWYgKERpcmVjdFZpcnR1YWxCYXNlcy5jb3VudChSVCkpCkBAIC0zOTk1LDExICs0MDM4LDExIEBACiAgICAgaWYgKENoZWNrRGVzdHJ1Y3RvckFjY2VzcygKICAgICAgICAgICAgIENsYXNzRGVjbC0+Z2V0TG9jYXRpb24oKSwgRHRvciwKICAgICAgICAgICAgIFBEaWFnKGRpYWc6OmVycl9hY2Nlc3NfZHRvcl92YmFzZSkKLSAgICAgICAgICAgICAgICA8PCBDb250ZXh0LmdldFR5cGVEZWNsVHlwZShDbGFzc0RlY2wpIDw8IFZCYXNlLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgPDwgQ29udGV4dC5nZXRUeXBlRGVjbFR5cGUoQ2xhc3NEZWNsKSA8PCBWQmFzZS5nZXRUeXBlKCksCiAgICAgICAgICAgICBDb250ZXh0LmdldFR5cGVEZWNsVHlwZShDbGFzc0RlY2wpKSA9PQogICAgICAgICBBUl9hY2Nlc3NpYmxlKSB7CiAgICAgICBDaGVja0Rlcml2ZWRUb0Jhc2VDb252ZXJzaW9uKAotICAgICAgICAgIENvbnRleHQuZ2V0VHlwZURlY2xUeXBlKENsYXNzRGVjbCksIFZCYXNlLT5nZXRUeXBlKCksCisgICAgICAgICAgQ29udGV4dC5nZXRUeXBlRGVjbFR5cGUoQ2xhc3NEZWNsKSwgVkJhc2UuZ2V0VHlwZSgpLAogICAgICAgICAgIGRpYWc6OmVycl9hY2Nlc3NfZHRvcl92YmFzZSwgMCwgQ2xhc3NEZWNsLT5nZXRMb2NhdGlvbigpLAogICAgICAgICAgIFNvdXJjZVJhbmdlKCksIERlY2xhcmF0aW9uTmFtZSgpLCAwKTsKICAgICB9CkBAIC00MDMwLDcgKzQwNzMsNyBAQAogICAgIE5vbkFic3RyYWN0VHlwZURpYWdub3Nlcih1bnNpZ25lZCBEaWFnSUQsIEFic3RyYWN0RGlhZ1NlbElEIFNlbElEKQogICAgICAgOiBUeXBlRGlhZ25vc2VyKERpYWdJRCA9PSAwKSwgRGlhZ0lEKERpYWdJRCksIFNlbElEKFNlbElEKSB7IH0KIAotICAgIHZvaWQgZGlhZ25vc2UoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKSBMTFZNX09WRVJSSURFIHsKKyAgICB2b2lkIGRpYWdub3NlKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgb3ZlcnJpZGUgewogICAgICAgaWYgKFN1cHByZXNzZWQpIHJldHVybjsKICAgICAgIGlmIChTZWxJRCA9PSAtMSkKICAgICAgICAgUy5EaWFnKExvYywgRGlhZ0lEKSA8PCBUOwpAQCAtNDE3MiwxMiArNDIxNSwxMiBAQAogICB9CiAKICAgdm9pZCBDaGVjayhGdW5jdGlvblByb3RvVHlwZUxvYyBUTCwgU2VtYTo6QWJzdHJhY3REaWFnU2VsSUQgU2VsKSB7Ci0gICAgVmlzaXQoVEwuZ2V0UmVzdWx0TG9jKCksIFNlbWE6OkFic3RyYWN0UmV0dXJuVHlwZSk7Ci0gICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFRMLmdldE51bUFyZ3MoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIGlmICghVEwuZ2V0QXJnKEkpKQorICAgIFZpc2l0KFRMLmdldFJldHVybkxvYygpLCBTZW1hOjpBYnN0cmFjdFJldHVyblR5cGUpOworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBUTC5nZXROdW1QYXJhbXMoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmICghVEwuZ2V0UGFyYW0oSSkpCiAgICAgICAgIGNvbnRpbnVlOwotICAgICAgCi0gICAgICBUeXBlU291cmNlSW5mbyAqVFNJID0gVEwuZ2V0QXJnKEkpLT5nZXRUeXBlU291cmNlSW5mbygpOworCisgICAgICBUeXBlU291cmNlSW5mbyAqVFNJID0gVEwuZ2V0UGFyYW0oSSktPmdldFR5cGVTb3VyY2VJbmZvKCk7CiAgICAgICBpZiAoVFNJKSBWaXNpdChUU0ktPmdldFR5cGVMb2MoKSwgU2VtYTo6QWJzdHJhY3RQYXJhbVR5cGUpOwogICAgIH0KICAgfQpAQCAtNDI2Nyw5ICs0MzEwLDcgQEAKIC8vLyBDaGVjayBmb3IgaW52YWxpZCB1c2VzIG9mIGFuIGFic3RyYWN0IHR5cGUgd2l0aGluIGEgY2xhc3MgZGVmaW5pdGlvbi4KIHN0YXRpYyB2b2lkIENoZWNrQWJzdHJhY3RDbGFzc1VzYWdlKEFic3RyYWN0VXNhZ2VJbmZvICZJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpkZWNsX2l0ZXJhdG9yCi0gICAgICAgICBJID0gUkQtPmRlY2xzX2JlZ2luKCksIEUgPSBSRC0+ZGVjbHNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgRGVjbCAqRCA9ICpJOworICBmb3IgKGF1dG8gKkQgOiBSRC0+ZGVjbHMoKSkgewogICAgIGlmIChELT5pc0ltcGxpY2l0KCkpIGNvbnRpbnVlOwogCiAgICAgLy8gTWV0aG9kcyBhbmQgbWV0aG9kIHRlbXBsYXRlcy4KQEAgLTQzMTgsOSArNDM1OSw3IEBACiAgICAgICAhUmVjb3JkLT5pc0FnZ3JlZ2F0ZSgpICYmICFSZWNvcmQtPmhhc1VzZXJEZWNsYXJlZENvbnN0cnVjdG9yKCkgJiYKICAgICAgICFSZWNvcmQtPmlzTGFtYmRhKCkpIHsKICAgICBib29sIENvbXBsYWluZWQgPSBmYWxzZTsKLSAgICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEYgPSBSZWNvcmQtPmZpZWxkX2JlZ2luKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVuZCA9IFJlY29yZC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgICBGICE9IEZFbmQ7ICsrRikgeworICAgIGZvciAoY29uc3QgYXV0byAqRiA6IFJlY29yZC0+ZmllbGRzKCkpIHsKICAgICAgIGlmIChGLT5oYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSB8fCBGLT5pc1VubmFtZWRCaXRmaWVsZCgpKQogICAgICAgICBjb250aW51ZTsKIApAQCAtNDM4MSwyNyArNDQyMCwyNSBAQAogICB9CiAKICAgaWYgKCFSZWNvcmQtPmlzRGVwZW5kZW50VHlwZSgpKSB7Ci0gICAgZm9yIChDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IgTSA9IFJlY29yZC0+bWV0aG9kX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVuZCA9IFJlY29yZC0+bWV0aG9kX2VuZCgpOwotICAgICAgICAgTSAhPSBNRW5kOyArK00pIHsKKyAgICBmb3IgKGF1dG8gKk0gOiBSZWNvcmQtPm1ldGhvZHMoKSkgewogICAgICAgLy8gU2VlIGlmIGEgbWV0aG9kIG92ZXJsb2FkcyB2aXJ0dWFsIG1ldGhvZHMgaW4gYSBiYXNlCiAgICAgICAvLyBjbGFzcyB3aXRob3V0IG92ZXJyaWRpbmcgYW55LgogICAgICAgaWYgKCFNLT5pc1N0YXRpYygpKQotICAgICAgICBEaWFnbm9zZUhpZGRlblZpcnR1YWxNZXRob2RzKCpNKTsKKyAgICAgICAgRGlhZ25vc2VIaWRkZW5WaXJ0dWFsTWV0aG9kcyhNKTsKIAogICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZXhwbGljaXRseS1kZWZhdWx0ZWQgc3BlY2lhbCBtZW1iZXJzIGFyZSB2YWxpZC4KICAgICAgIGlmICghTS0+aXNJbnZhbGlkRGVjbCgpICYmIE0tPmlzRXhwbGljaXRseURlZmF1bHRlZCgpKQotICAgICAgICBDaGVja0V4cGxpY2l0bHlEZWZhdWx0ZWRTcGVjaWFsTWVtYmVyKCpNKTsKKyAgICAgICAgQ2hlY2tFeHBsaWNpdGx5RGVmYXVsdGVkU3BlY2lhbE1lbWJlcihNKTsKIAogICAgICAgLy8gRm9yIGFuIGV4cGxpY2l0bHkgZGVmYXVsdGVkIG9yIGRlbGV0ZWQgc3BlY2lhbCBtZW1iZXIsIHdlIGRlZmVyCiAgICAgICAvLyBkZXRlcm1pbmluZyB0cml2aWFsaXR5IHVudGlsIHRoZSBjbGFzcyBpcyBjb21wbGV0ZS4gVGhhdCB0aW1lIGlzIG5vdyEKICAgICAgIGlmICghTS0+aXNJbXBsaWNpdCgpICYmICFNLT5pc1VzZXJQcm92aWRlZCgpKSB7Ci0gICAgICAgIENYWFNwZWNpYWxNZW1iZXIgQ1NNID0gZ2V0U3BlY2lhbE1lbWJlcigqTSk7CisgICAgICAgIENYWFNwZWNpYWxNZW1iZXIgQ1NNID0gZ2V0U3BlY2lhbE1lbWJlcihNKTsKICAgICAgICAgaWYgKENTTSAhPSBDWFhJbnZhbGlkKSB7Ci0gICAgICAgICAgTS0+c2V0VHJpdmlhbChTcGVjaWFsTWVtYmVySXNUcml2aWFsKCpNLCBDU00pKTsKKyAgICAgICAgICBNLT5zZXRUcml2aWFsKFNwZWNpYWxNZW1iZXJJc1RyaXZpYWwoTSwgQ1NNKSk7CiAKICAgICAgICAgICAvLyBJbmZvcm0gdGhlIGNsYXNzIHRoYXQgd2UndmUgZmluaXNoZWQgZGVjbGFyaW5nIHRoaXMgbWVtYmVyLgotICAgICAgICAgIFJlY29yZC0+ZmluaXNoZWREZWZhdWx0ZWRPckRlbGV0ZWRNZW1iZXIoKk0pOworICAgICAgICAgIFJlY29yZC0+ZmluaXNoZWREZWZhdWx0ZWRPckRlbGV0ZWRNZW1iZXIoTSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC00NDIwLDEwICs0NDU3LDggQEAKICAgLy8gZGVzdHJ1Y3RvciBmb3IgdGhlIGNsYXNzIGlzIHRyaXZpYWwuCiAgIGlmIChMYW5nT3B0cy5DUGx1c1BsdXMxMSAmJiAhUmVjb3JkLT5pc0RlcGVuZGVudFR5cGUoKSAmJgogICAgICAgIVJlY29yZC0+aXNMaXRlcmFsKCkgJiYgIVJlY29yZC0+Z2V0TnVtVkJhc2VzKCkpIHsKLSAgICBmb3IgKENYWFJlY29yZERlY2w6Om1ldGhvZF9pdGVyYXRvciBNID0gUmVjb3JkLT5tZXRob2RfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRW5kID0gUmVjb3JkLT5tZXRob2RfZW5kKCk7Ci0gICAgICAgICBNICE9IE1FbmQ7ICsrTSkgewotICAgICAgaWYgKE0tPmlzQ29uc3RleHByKCkgJiYgTS0+aXNJbnN0YW5jZSgpICYmICFpc2E8Q1hYQ29uc3RydWN0b3JEZWNsPigqTSkpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKk0gOiBSZWNvcmQtPm1ldGhvZHMoKSkgeworICAgICAgaWYgKE0tPmlzQ29uc3RleHByKCkgJiYgTS0+aXNJbnN0YW5jZSgpICYmICFpc2E8Q1hYQ29uc3RydWN0b3JEZWNsPihNKSkgewogICAgICAgICBzd2l0Y2ggKFJlY29yZC0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSkgewogICAgICAgICBjYXNlIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb246CiAgICAgICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uOgpAQCAtNDQ0NiwxMSArNDQ4MSwxOCBAQAogICAgIH0KICAgfQogCi0gIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSB0cnlpbmcgdG8gbGF5IG91dCBhIHN0cnVjdCB1c2luZyB0aGUgbXNfc3RydWN0Ci0gIC8vIGF0dHJpYnV0ZSB0aGF0IGlzIGR5bmFtaWMuCi0gIGlmIChSZWNvcmQtPmlzTXNTdHJ1Y3QoQ29udGV4dCkgJiYgUmVjb3JkLT5pc0R5bmFtaWNDbGFzcygpKSB7Ci0gICAgRGlhZyhSZWNvcmQtPmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5fcHJhZ21hX21zX3N0cnVjdF9mYWlsZWQpOwotICAgIFJlY29yZC0+ZHJvcEF0dHI8TXNTdHJ1Y3RBdHRyPigpOworICAvLyBtc19zdHJ1Y3QgaXMgYSByZXF1ZXN0IHRvIHVzZSB0aGUgc2FtZSBBQkkgcnVsZXMgYXMgTVNWQy4gIENoZWNrCisgIC8vIHdoZXRoZXIgdGhpcyBjbGFzcyB1c2VzIGFueSBDKysgZmVhdHVyZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQKKyAgLy8gY29tcGxldGVseSBkaWZmZXJlbnRseSBpbiBNU1ZDLCBhbmQgaWYgc28sIGVtaXQgYSBkaWFnbm9zdGljLgorICAvLyBUaGF0IGRpYWdub3N0aWMgZGVmYXVsdHMgdG8gYW4gZXJyb3IsIGJ1dCB3ZSBhbGxvdyBwcm9qZWN0cyB0bworICAvLyBtYXAgaXQgZG93biB0byBhIHdhcm5pbmcgKG9yIGlnbm9yZSBpdCkuICBJdCdzIGEgZmFpcmx5IGNvbW1vbgorICAvLyBwcmFjdGljZSBhbW9uZyB1c2VycyBvZiB0aGUgbXNfc3RydWN0IHByYWdtYSB0byBtYXNzLWFubm90YXRlCisgIC8vIGhlYWRlcnMsIHN3ZWVwaW5nIHVwIGEgYnVuY2ggb2YgdHlwZXMgdGhhdCB0aGUgcHJvamVjdCBkb2Vzbid0CisgIC8vIHJlYWxseSByZWx5IG9uIE1TVkMtY29tcGF0aWJsZSBsYXlvdXQgZm9yLiAgV2UgbXVzdCB0aGVyZWZvcmUKKyAgLy8gc3VwcG9ydCAibXNfc3RydWN0IGV4Y2VwdCBmb3IgQysrIHN0dWZmIiBhcyBhIHNlY29uZGFyeSBBQkkuCisgIGlmIChSZWNvcmQtPmlzTXNTdHJ1Y3QoQ29udGV4dCkgJiYKKyAgICAgIChSZWNvcmQtPmlzUG9seW1vcnBoaWMoKSB8fCBSZWNvcmQtPmdldE51bUJhc2VzKCkpKSB7CisgICAgRGlhZyhSZWNvcmQtPmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5fY3h4X21zX3N0cnVjdCk7CiAgIH0KIAogICAvLyBEZWNsYXJlIGluaGVyaXRpbmcgY29uc3RydWN0b3JzLiBXZSBkbyB0aGlzIGVhZ2VybHkgaGVyZSBiZWNhdXNlOgpAQCAtNDQ2MywxNCArNDUwNSw0MyBAQAogICBEZWNsYXJlSW5oZXJpdGluZ0NvbnN0cnVjdG9ycyhSZWNvcmQpOwogfQogCisvLy8gTG9vayB1cCB0aGUgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb24gdGhhdCB3b3VsZCBiZSBjYWxsZWQgYnkgYSBzcGVjaWFsCisvLy8gbWVtYmVyIGZ1bmN0aW9uIGZvciBhIHN1Ym9iamVjdCBvZiBjbGFzcyB0eXBlLgorLy8vCisvLy8gXHBhcmFtIENsYXNzIFRoZSBjbGFzcyB0eXBlIG9mIHRoZSBzdWJvYmplY3QuCisvLy8gXHBhcmFtIENTTSBUaGUga2luZCBvZiBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbi4KKy8vLyBccGFyYW0gRmllbGRRdWFscyBJZiB0aGUgc3Vib2JqZWN0IGlzIGEgZmllbGQsIGl0cyBjdi1xdWFsaWZpZXJzLgorLy8vIFxwYXJhbSBDb25zdFJIUyBUcnVlIGlmIHRoaXMgaXMgYSBjb3B5IG9wZXJhdGlvbiB3aXRoIGEgY29uc3Qgb2JqZWN0CisvLy8gICAgICAgIG9uIGl0cyBSSFMsIHRoYXQgaXMsIGlmIHRoZSBhcmd1bWVudCB0byB0aGUgb3V0ZXIgc3BlY2lhbCBtZW1iZXIKKy8vLyAgICAgICAgZnVuY3Rpb24gaXMgJ2NvbnN0JyBhbmQgdGhpcyBpcyBub3QgYSBmaWVsZCBtYXJrZWQgJ211dGFibGUnLgorc3RhdGljIFNlbWE6OlNwZWNpYWxNZW1iZXJPdmVybG9hZFJlc3VsdCAqbG9va3VwQ2FsbEZyb21TcGVjaWFsTWVtYmVyKAorICAgIFNlbWEgJlMsIENYWFJlY29yZERlY2wgKkNsYXNzLCBTZW1hOjpDWFhTcGVjaWFsTWVtYmVyIENTTSwKKyAgICB1bnNpZ25lZCBGaWVsZFF1YWxzLCBib29sIENvbnN0UkhTKSB7CisgIHVuc2lnbmVkIExIU1F1YWxzID0gMDsKKyAgaWYgKENTTSA9PSBTZW1hOjpDWFhDb3B5QXNzaWdubWVudCB8fCBDU00gPT0gU2VtYTo6Q1hYTW92ZUFzc2lnbm1lbnQpCisgICAgTEhTUXVhbHMgPSBGaWVsZFF1YWxzOworCisgIHVuc2lnbmVkIFJIU1F1YWxzID0gRmllbGRRdWFsczsKKyAgaWYgKENTTSA9PSBTZW1hOjpDWFhEZWZhdWx0Q29uc3RydWN0b3IgfHwgQ1NNID09IFNlbWE6OkNYWERlc3RydWN0b3IpCisgICAgUkhTUXVhbHMgPSAwOworICBlbHNlIGlmIChDb25zdFJIUykKKyAgICBSSFNRdWFscyB8PSBRdWFsaWZpZXJzOjpDb25zdDsKKworICByZXR1cm4gUy5Mb29rdXBTcGVjaWFsTWVtYmVyKENsYXNzLCBDU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTUXVhbHMgJiBRdWFsaWZpZXJzOjpDb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFNRdWFscyAmIFF1YWxpZmllcnM6OlZvbGF0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExIU1F1YWxzICYgUXVhbGlmaWVyczo6Q29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTUXVhbHMgJiBRdWFsaWZpZXJzOjpWb2xhdGlsZSk7Cit9CisKIC8vLyBJcyB0aGUgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb24gd2hpY2ggd291bGQgYmUgc2VsZWN0ZWQgdG8gcGVyZm9ybSB0aGUKIC8vLyBzcGVjaWZpZWQgb3BlcmF0aW9uIG9uIHRoZSBzcGVjaWZpZWQgY2xhc3MgdHlwZSBhIGNvbnN0ZXhwciBjb25zdHJ1Y3Rvcj8KIHN0YXRpYyBib29sIHNwZWNpYWxNZW1iZXJJc0NvbnN0ZXhwcihTZW1hICZTLCBDWFhSZWNvcmREZWNsICpDbGFzc0RlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYTo6Q1hYU3BlY2lhbE1lbWJlciBDU00sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb25zdEFyZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFF1YWxzLCBib29sIENvbnN0UkhTKSB7CiAgIFNlbWE6OlNwZWNpYWxNZW1iZXJPdmVybG9hZFJlc3VsdCAqU01PUiA9Ci0gICAgICBTLkxvb2t1cFNwZWNpYWxNZW1iZXIoQ2xhc3NEZWNsLCBDU00sIENvbnN0QXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgIGxvb2t1cENhbGxGcm9tU3BlY2lhbE1lbWJlcihTLCBDbGFzc0RlY2wsIENTTSwgUXVhbHMsIENvbnN0UkhTKTsKICAgaWYgKCFTTU9SIHx8ICFTTU9SLT5nZXRNZXRob2QoKSkKICAgICAvLyBBIGNvbnN0cnVjdG9yIHdlIHdvdWxkbid0IHNlbGVjdCBjYW4ndCBiZSAiaW52b2x2ZWQgaW4gaW5pdGlhbGl6aW5nIgogICAgIC8vIGFueXRoaW5nLgpAQCAtNDU0MCwxNCArNDYxMSwxMiBAQAogICAvLyAgICAgIHN1Yi1vYmplY3RzIHNoYWxsIGJlIGEgY29uc3RleHByIGNvbnN0cnVjdG9yOwogICAvLyAgIC0tIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yIHNlbGVjdGVkIHRvIGNvcHkvbW92ZSBlYWNoIGRpcmVjdCBiYXNlCiAgIC8vICAgICAgY2xhc3MgaXMgYSBjb25zdGV4cHIgZnVuY3Rpb24sIGFuZAotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQiA9IENsYXNzRGVjbC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFbmQgPSBDbGFzc0RlY2wtPmJhc2VzX2VuZCgpOwotICAgICAgIEIgIT0gQkVuZDsgKytCKSB7Ci0gICAgY29uc3QgUmVjb3JkVHlwZSAqQmFzZVR5cGUgPSBCLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCk7CisgIGZvciAoY29uc3QgYXV0byAmQiA6IENsYXNzRGVjbC0+YmFzZXMoKSkgeworICAgIGNvbnN0IFJlY29yZFR5cGUgKkJhc2VUeXBlID0gQi5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCk7CiAgICAgaWYgKCFCYXNlVHlwZSkgY29udGludWU7CiAKICAgICBDWFhSZWNvcmREZWNsICpCYXNlQ2xhc3NEZWNsID0gY2FzdDxDWFhSZWNvcmREZWNsPihCYXNlVHlwZS0+Z2V0RGVjbCgpKTsKLSAgICBpZiAoIXNwZWNpYWxNZW1iZXJJc0NvbnN0ZXhwcihTLCBCYXNlQ2xhc3NEZWNsLCBDU00sIENvbnN0QXJnKSkKKyAgICBpZiAoIXNwZWNpYWxNZW1iZXJJc0NvbnN0ZXhwcihTLCBCYXNlQ2xhc3NEZWNsLCBDU00sIDAsIENvbnN0QXJnKSkKICAgICAgIHJldHVybiBmYWxzZTsKICAgfQogCkBAIC00NTU1LDE4ICs0NjI0LDE4IEBACiAgIC8vICAgICAgWy4uLl0gc2hhbGwgYmUgYSBjb25zdGV4cHIgY29uc3RydWN0b3I7CiAgIC8vICAgLS0gZXZlcnkgbm9uLXN0YXRpYyBkYXRhIG1lbWJlciBhbmQgYmFzZSBjbGFzcyBzdWItb2JqZWN0IHNoYWxsIGJlCiAgIC8vICAgICAgaW5pdGlhbGl6ZWQKLSAgLy8gICAtLSBmb3IgZWFjaCBub24tc3Rhc3RpYyBkYXRhIG1lbWJlciBvZiBYIHRoYXQgaXMgb2YgY2xhc3MgdHlwZSAob3IgYXJyYXkKKyAgLy8gICAtLSBmb3IgZWFjaCBub24tc3RhdGljIGRhdGEgbWVtYmVyIG9mIFggdGhhdCBpcyBvZiBjbGFzcyB0eXBlIChvciBhcnJheQogICAvLyAgICAgIHRoZXJlb2YpLCB0aGUgYXNzaWdubWVudCBvcGVyYXRvciBzZWxlY3RlZCB0byBjb3B5L21vdmUgdGhhdCBtZW1iZXIgaXMKICAgLy8gICAgICBhIGNvbnN0ZXhwciBmdW5jdGlvbgotICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEYgPSBDbGFzc0RlY2wtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVuZCA9IENsYXNzRGVjbC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgRiAhPSBGRW5kOyArK0YpIHsKKyAgZm9yIChjb25zdCBhdXRvICpGIDogQ2xhc3NEZWNsLT5maWVsZHMoKSkgewogICAgIGlmIChGLT5pc0ludmFsaWREZWNsKCkpCiAgICAgICBjb250aW51ZTsKLSAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUmVjb3JkVHkgPQotICAgICAgICAgICAgUy5Db250ZXh0LmdldEJhc2VFbGVtZW50VHlwZShGLT5nZXRUeXBlKCkpLT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CisgICAgUXVhbFR5cGUgQmFzZVR5cGUgPSBTLkNvbnRleHQuZ2V0QmFzZUVsZW1lbnRUeXBlKEYtPmdldFR5cGUoKSk7CisgICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKlJlY29yZFR5ID0gQmFzZVR5cGUtPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKICAgICAgIENYWFJlY29yZERlY2wgKkZpZWxkUmVjRGVjbCA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oUmVjb3JkVHktPmdldERlY2woKSk7Ci0gICAgICBpZiAoIXNwZWNpYWxNZW1iZXJJc0NvbnN0ZXhwcihTLCBGaWVsZFJlY0RlY2wsIENTTSwgQ29uc3RBcmcpKQorICAgICAgaWYgKCFzcGVjaWFsTWVtYmVySXNDb25zdGV4cHIoUywgRmllbGRSZWNEZWNsLCBDU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVHlwZS5nZXRDVlJRdWFsaWZpZXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdEFyZyAmJiAhRi0+aXNNdXRhYmxlKCkpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICB9CkBAIC00NTk4LDE1ICs0NjY3LDYgQEAKICAgcmV0dXJuIFMuQ29tcHV0ZUluaGVyaXRpbmdDdG9yRXhjZXB0aW9uU3BlYyhjYXN0PENYWENvbnN0cnVjdG9yRGVjbD4oTUQpKTsKIH0KIAotc3RhdGljIHZvaWQKLXVwZGF0ZUV4Y2VwdGlvblNwZWMoU2VtYSAmUywgRnVuY3Rpb25EZWNsICpGRCwgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VtYTo6SW1wbGljaXRFeGNlcHRpb25TcGVjaWZpY2F0aW9uICZFeGNlcHRTcGVjKSB7Ci0gIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gRVBJID0gRlBULT5nZXRFeHRQcm90b0luZm8oKTsKLSAgRXhjZXB0U3BlYy5nZXRFUEkoRVBJKTsKLSAgRkQtPnNldFR5cGUoUy5Db250ZXh0LmdldEZ1bmN0aW9uVHlwZShGUFQtPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFQtPmdldEFyZ1R5cGVzKCksIEVQSSkpOwotfQotCiBzdGF0aWMgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBnZXRJbXBsaWNpdE1ldGhvZEVQSShTZW1hICZTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYTWV0aG9kRGVjbCAqTUQpIHsKICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBFUEk7CkBAIC00NjMxLDggKzQ2OTEsMTEgQEAKICAgSW1wbGljaXRFeGNlcHRpb25TcGVjaWZpY2F0aW9uIEV4Y2VwdFNwZWMgPQogICAgICAgY29tcHV0ZUltcGxpY2l0RXhjZXB0aW9uU3BlYygqdGhpcywgTG9jLCBNRCk7CiAKKyAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBFUEk7CisgIEV4Y2VwdFNwZWMuZ2V0RVBJKEVQSSk7CisKICAgLy8gVXBkYXRlIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWFsIG1lbWJlciB0byB1c2UgaXQuCi0gIHVwZGF0ZUV4Y2VwdGlvblNwZWMoKnRoaXMsIE1ELCBGUFQsIEV4Y2VwdFNwZWMpOworICBVcGRhdGVFeGNlcHRpb25TcGVjKE1ELCBFUEkpOwogCiAgIC8vIEEgdXNlci1wcm92aWRlZCBkZXN0cnVjdG9yIGNhbiBiZSBkZWZpbmVkIG91dHNpZGUgdGhlIGNsYXNzLiBXaGVuIHRoYXQKICAgLy8gaGFwcGVucywgYmUgc3VyZSB0byB1cGRhdGUgdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIG9uIGJvdGgKQEAgLTQ2NDAsOCArNDcwMyw3IEBACiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpDYW5vbmljYWxGUFQgPQogICAgIE1ELT5nZXRDYW5vbmljYWxEZWNsKCktPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwogICBpZiAoQ2Fub25pY2FsRlBULT5nZXRFeGNlcHRpb25TcGVjVHlwZSgpID09IEVTVF9VbmV2YWx1YXRlZCkKLSAgICB1cGRhdGVFeGNlcHRpb25TcGVjKCp0aGlzLCBNRC0+Z2V0Q2Fub25pY2FsRGVjbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQ2Fub25pY2FsRlBULCBFeGNlcHRTcGVjKTsKKyAgICBVcGRhdGVFeGNlcHRpb25TcGVjKE1ELT5nZXRDYW5vbmljYWxEZWNsKCksIEVQSSk7CiB9CiAKIHZvaWQgU2VtYTo6Q2hlY2tFeHBsaWNpdGx5RGVmYXVsdGVkU3BlY2lhbE1lbWJlcihDWFhNZXRob2REZWNsICpNRCkgewpAQCAtNDY5MSw3ICs0NzUzLDcgQEAKICAgUXVhbFR5cGUgUmV0dXJuVHlwZSA9IENvbnRleHQuVm9pZFR5OwogICBpZiAoQ1NNID09IENYWENvcHlBc3NpZ25tZW50IHx8IENTTSA9PSBDWFhNb3ZlQXNzaWdubWVudCkgewogICAgIC8vIENoZWNrIGZvciByZXR1cm4gdHlwZSBtYXRjaGluZy4KLSAgICBSZXR1cm5UeXBlID0gVHlwZS0+Z2V0UmVzdWx0VHlwZSgpOworICAgIFJldHVyblR5cGUgPSBUeXBlLT5nZXRSZXR1cm5UeXBlKCk7CiAgICAgUXVhbFR5cGUgRXhwZWN0ZWRSZXR1cm5UeXBlID0KICAgICAgICAgQ29udGV4dC5nZXRMVmFsdWVSZWZlcmVuY2VUeXBlKENvbnRleHQuZ2V0VHlwZURlY2xUeXBlKFJEKSk7CiAgICAgaWYgKCFDb250ZXh0Lmhhc1NhbWVUeXBlKFJldHVyblR5cGUsIEV4cGVjdGVkUmV0dXJuVHlwZSkpIHsKQEAgLTQ3MDksNyArNDc3MSw3IEBACiAgIH0KIAogICAvLyBDaGVjayBmb3IgcGFyYW1ldGVyIHR5cGUgbWF0Y2hpbmcuCi0gIFF1YWxUeXBlIEFyZ1R5cGUgPSBFeHBlY3RlZFBhcmFtcyA/IFR5cGUtPmdldEFyZ1R5cGUoMCkgOiBRdWFsVHlwZSgpOworICBRdWFsVHlwZSBBcmdUeXBlID0gRXhwZWN0ZWRQYXJhbXMgPyBUeXBlLT5nZXRQYXJhbVR5cGUoMCkgOiBRdWFsVHlwZSgpOwogICBib29sIEhhc0NvbnN0UGFyYW0gPSBmYWxzZTsKICAgaWYgKEV4cGVjdGVkUGFyYW1zICYmIEFyZ1R5cGUtPmlzUmVmZXJlbmNlVHlwZSgpKSB7CiAgICAgLy8gQXJndW1lbnQgbXVzdCBiZSByZWZlcmVuY2UgdG8gcG9zc2libHktY29uc3QgVC4KQEAgLTQ4MDMsNiArNDg2NSw3IEBACiAgICAgICAvLyAgIFtGb3IgYV0gdXNlci1wcm92aWRlZCBleHBsaWNpdGx5LWRlZmF1bHRlZCBmdW5jdGlvbiBbLi4uXSBpZiBzdWNoIGEKICAgICAgIC8vICAgZnVuY3Rpb24gaXMgaW1wbGljaXRseSBkZWZpbmVkIGFzIGRlbGV0ZWQsIHRoZSBwcm9ncmFtIGlzIGlsbC1mb3JtZWQuCiAgICAgICBEaWFnKE1ELT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfb3V0X29mX2xpbmVfZGVmYXVsdF9kZWxldGVzKSA8PCBDU007CisgICAgICBTaG91bGREZWxldGVTcGVjaWFsTWVtYmVyKE1ELCBDU00sIC8qRGlhZ25vc2UqL3RydWUpOwogICAgICAgSGFkRXJyb3IgPSB0cnVlOwogICAgIH0KICAgfQpAQCAtNDg2NSw3ICs0OTI4LDcgQEAKICAgYm9vbCBEaWFnbm9zZTsKIAogICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBzcGVjaWFsIG1lbWJlciwgY29tcHV0ZWQgZm9yIGNvbnZlbmllbmNlLgotICBib29sIElzQ29uc3RydWN0b3IsIElzQXNzaWdubWVudCwgSXNNb3ZlLCBDb25zdEFyZywgVm9sYXRpbGVBcmc7CisgIGJvb2wgSXNDb25zdHJ1Y3RvciwgSXNBc3NpZ25tZW50LCBJc01vdmUsIENvbnN0QXJnOwogICBTb3VyY2VMb2NhdGlvbiBMb2M7CiAKICAgYm9vbCBBbGxGaWVsZHNBcmVDb25zdDsKQEAgLTQ4NzQsNyArNDkzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYTo6Q1hYU3BlY2lhbE1lbWJlciBDU00sIGJvb2wgRGlhZ25vc2UpCiAgICAgOiBTKFMpLCBNRChNRCksIENTTShDU00pLCBEaWFnbm9zZShEaWFnbm9zZSksCiAgICAgICBJc0NvbnN0cnVjdG9yKGZhbHNlKSwgSXNBc3NpZ25tZW50KGZhbHNlKSwgSXNNb3ZlKGZhbHNlKSwKLSAgICAgIENvbnN0QXJnKGZhbHNlKSwgVm9sYXRpbGVBcmcoZmFsc2UpLCBMb2MoTUQtPmdldExvY2F0aW9uKCkpLAorICAgICAgQ29uc3RBcmcoZmFsc2UpLCBMb2MoTUQtPmdldExvY2F0aW9uKCkpLAogICAgICAgQWxsRmllbGRzQXJlQ29uc3QodHJ1ZSkgewogICAgIHN3aXRjaCAoQ1NNKSB7CiAgICAgICBjYXNlIFNlbWE6OkNYWERlZmF1bHRDb25zdHJ1Y3RvcjoKQEAgLTQ4OTksOCArNDk2Miw5IEBACiAgICAgfQogCiAgICAgaWYgKE1ELT5nZXROdW1QYXJhbXMoKSkgewotICAgICAgQ29uc3RBcmcgPSBNRC0+Z2V0UGFyYW1EZWNsKDApLT5nZXRUeXBlKCkuaXNDb25zdFF1YWxpZmllZCgpOwotICAgICAgVm9sYXRpbGVBcmcgPSBNRC0+Z2V0UGFyYW1EZWNsKDApLT5nZXRUeXBlKCkuaXNWb2xhdGlsZVF1YWxpZmllZCgpOworICAgICAgaWYgKGNvbnN0IFJlZmVyZW5jZVR5cGUgKlJUID0KKyAgICAgICAgICAgICAgTUQtPmdldFBhcmFtRGVjbCgwKS0+Z2V0VHlwZSgpLT5nZXRBczxSZWZlcmVuY2VUeXBlPigpKQorICAgICAgICBDb25zdEFyZyA9IFJULT5nZXRQb2ludGVlVHlwZSgpLmlzQ29uc3RRdWFsaWZpZWQoKTsKICAgICB9CiAgIH0KIApAQCAtNDkwOCwyMSArNDk3Miw5IEBACiAKICAgLy8vIExvb2sgdXAgdGhlIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBtZW1iZXIgaW4gdGhlIGdpdmVuIGNsYXNzLgogICBTZW1hOjpTcGVjaWFsTWVtYmVyT3ZlcmxvYWRSZXN1bHQgKmxvb2t1cEluKENYWFJlY29yZERlY2wgKkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFF1YWxzKSB7Ci0gICAgdW5zaWduZWQgVFEgPSBNRC0+Z2V0VHlwZVF1YWxpZmllcnMoKTsKLSAgICAvLyBjdi1xdWFsaWZpZXJzIG9uIGNsYXNzIG1lbWJlcnMgZG9uJ3QgYWZmZWN0IGRlZmF1bHQgY3RvciAvIGR0b3IgY2FsbHMuCi0gICAgaWYgKENTTSA9PSBTZW1hOjpDWFhEZWZhdWx0Q29uc3RydWN0b3IgfHwgQ1NNID09IFNlbWE6OkNYWERlc3RydWN0b3IpCi0gICAgICBRdWFscyA9IDA7Ci0gICAgLy8gY3YtcXVhbGlmaWVycyBvbiBjbGFzcyBtZW1iZXJzIGFmZmVjdCB0aGUgdHlwZSBvZiBib3RoICcqdGhpcycgYW5kIHRoZQotICAgIC8vIGFyZ3VtZW50IGZvciBhbiBhc3NpZ25tZW50LgotICAgIGlmIChJc0Fzc2lnbm1lbnQpCi0gICAgICBUUSB8PSBRdWFsczsKLSAgICByZXR1cm4gUy5Mb29rdXBTcGVjaWFsTWVtYmVyKENsYXNzLCBDU00sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdEFyZyB8fCAoUXVhbHMgJiBRdWFsaWZpZXJzOjpDb25zdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2xhdGlsZUFyZyB8fCAoUXVhbHMgJiBRdWFsaWZpZXJzOjpWb2xhdGlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRC0+Z2V0UmVmUXVhbGlmaWVyKCkgPT0gUlFfUlZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFEgJiBRdWFsaWZpZXJzOjpDb25zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRRICYgUXVhbGlmaWVyczo6Vm9sYXRpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFF1YWxzLCBib29sIElzTXV0YWJsZSkgeworICAgIHJldHVybiBsb29rdXBDYWxsRnJvbVNwZWNpYWxNZW1iZXIoUywgQ2xhc3MsIENTTSwgUXVhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdEFyZyAmJiAhSXNNdXRhYmxlKTsKICAgfQogCiAgIHR5cGVkZWYgbGx2bTo6UG9pbnRlclVuaW9uPENYWEJhc2VTcGVjaWZpZXIqLCBGaWVsZERlY2wqPiBTdWJvYmplY3Q7CkBAIC01MDE3LDYgKzUwNjksNyBAQAogYm9vbCBTcGVjaWFsTWVtYmVyRGVsZXRpb25JbmZvOjpzaG91bGREZWxldGVGb3JDbGFzc1N1Ym9iamVjdCgKICAgICBDWFhSZWNvcmREZWNsICpDbGFzcywgU3Vib2JqZWN0IFN1Ym9iaiwgdW5zaWduZWQgUXVhbHMpIHsKICAgRmllbGREZWNsICpGaWVsZCA9IFN1Ym9iai5keW5fY2FzdDxGaWVsZERlY2wqPigpOworICBib29sIElzTXV0YWJsZSA9IEZpZWxkICYmIEZpZWxkLT5pc011dGFibGUoKTsKIAogICAvLyBDKysxMSBbY2xhc3MuY3Rvcl1wNToKICAgLy8gLS0gYW55IGRpcmVjdCBvciB2aXJ0dWFsIGJhc2UgY2xhc3MsIG9yIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIgd2l0aCBubwpAQCAtNTAzNCw3ICs1MDg3LDggQEAKICAgLy8gICAgdGhhdCBpcyBkZWxldGVkIG9yIGluYWNjZXNzaWJsZQogICBpZiAoIShDU00gPT0gU2VtYTo6Q1hYRGVmYXVsdENvbnN0cnVjdG9yICYmCiAgICAgICAgIEZpZWxkICYmIEZpZWxkLT5oYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSkgJiYKLSAgICAgIHNob3VsZERlbGV0ZUZvclN1Ym9iamVjdENhbGwoU3Vib2JqLCBsb29rdXBJbihDbGFzcywgUXVhbHMpLCBmYWxzZSkpCisgICAgICBzaG91bGREZWxldGVGb3JTdWJvYmplY3RDYWxsKFN1Ym9iaiwgbG9va3VwSW4oQ2xhc3MsIFF1YWxzLCBJc011dGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpCiAgICAgcmV0dXJuIHRydWU7CiAKICAgLy8gQysrMTEgW2NsYXNzLmN0b3JdcDUsIEMrKzExIFtjbGFzcy5jb3B5XXAxMToKQEAgLTUxMjIsOSArNTE3Niw3IEBACiAgICAgICBib29sIEFsbFZhcmlhbnRGaWVsZHNBcmVDb25zdCA9IHRydWU7CiAKICAgICAgIC8vIEZJWE1FOiBIYW5kbGUgYW5vbnltb3VzIHVuaW9ucyBkZWNsYXJlZCB3aXRoaW4gYW5vbnltb3VzIHVuaW9ucy4KLSAgICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgVUkgPSBGaWVsZFJlY29yZC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUUgPSBGaWVsZFJlY29yZC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgICAgIFVJICE9IFVFOyArK1VJKSB7CisgICAgICBmb3IgKGF1dG8gKlVJIDogRmllbGRSZWNvcmQtPmZpZWxkcygpKSB7CiAgICAgICAgIFF1YWxUeXBlIFVuaW9uRmllbGRUeXBlID0gUy5Db250ZXh0LmdldEJhc2VFbGVtZW50VHlwZShVSS0+Z2V0VHlwZSgpKTsKIAogICAgICAgICBpZiAoIVVuaW9uRmllbGRUeXBlLmlzQ29uc3RRdWFsaWZpZWQoKSkKQEAgLTUxMzIsMTQgKzUxODQsMTQgQEAKIAogICAgICAgICBDWFhSZWNvcmREZWNsICpVbmlvbkZpZWxkUmVjb3JkID0gVW5pb25GaWVsZFR5cGUtPmdldEFzQ1hYUmVjb3JkRGVjbCgpOwogICAgICAgICBpZiAoVW5pb25GaWVsZFJlY29yZCAmJgotICAgICAgICAgICAgc2hvdWxkRGVsZXRlRm9yQ2xhc3NTdWJvYmplY3QoVW5pb25GaWVsZFJlY29yZCwgKlVJLAorICAgICAgICAgICAgc2hvdWxkRGVsZXRlRm9yQ2xhc3NTdWJvYmplY3QoVW5pb25GaWVsZFJlY29yZCwgVUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlvbkZpZWxkVHlwZS5nZXRDVlJRdWFsaWZpZXJzKCkpKQogICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQogCiAgICAgICAvLyBBdCBsZWFzdCBvbmUgbWVtYmVyIGluIGVhY2ggYW5vbnltb3VzIHVuaW9uIG11c3QgYmUgbm9uLWNvbnN0CiAgICAgICBpZiAoQ1NNID09IFNlbWE6OkNYWERlZmF1bHRDb25zdHJ1Y3RvciAmJiBBbGxWYXJpYW50RmllbGRzQXJlQ29uc3QgJiYKLSAgICAgICAgICBGaWVsZFJlY29yZC0+ZmllbGRfYmVnaW4oKSAhPSBGaWVsZFJlY29yZC0+ZmllbGRfZW5kKCkpIHsKKyAgICAgICAgICAhRmllbGRSZWNvcmQtPmZpZWxkX2VtcHR5KCkpIHsKICAgICAgICAgaWYgKERpYWdub3NlKQogICAgICAgICAgIFMuRGlhZyhGaWVsZFJlY29yZC0+Z2V0TG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgZGlhZzo6bm90ZV9kZWxldGVkX2RlZmF1bHRfY3Rvcl9hbGxfY29uc3QpCkBAIC01MTY3LDcgKzUyMTksNyBAQAogICAvLyBUaGlzIGlzIGEgc2lsbHkgZGVmaW5pdGlvbiwgYmVjYXVzZSBpdCBnaXZlcyBhbiBlbXB0eSB1bmlvbiBhIGRlbGV0ZWQKICAgLy8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4gRG9uJ3QgZG8gdGhhdC4KICAgaWYgKENTTSA9PSBTZW1hOjpDWFhEZWZhdWx0Q29uc3RydWN0b3IgJiYgaW5VbmlvbigpICYmIEFsbEZpZWxkc0FyZUNvbnN0ICYmCi0gICAgICAoTUQtPmdldFBhcmVudCgpLT5maWVsZF9iZWdpbigpICE9IE1ELT5nZXRQYXJlbnQoKS0+ZmllbGRfZW5kKCkpKSB7CisgICAgICAhTUQtPmdldFBhcmVudCgpLT5maWVsZF9lbXB0eSgpKSB7CiAgICAgaWYgKERpYWdub3NlKQogICAgICAgUy5EaWFnKE1ELT5nZXRQYXJlbnQoKS0+Z2V0TG9jYXRpb24oKSwKICAgICAgICAgICAgICBkaWFnOjpub3RlX2RlbGV0ZWRfZGVmYXVsdF9jdG9yX2FsbF9jb25zdCkKQEAgLTUyMTgsMjcgKzUyNzAsMjUgQEAKICAgICAvLyBJbiBNaWNyb3NvZnQgbW9kZSwgYSB1c2VyLWRlY2xhcmVkIG1vdmUgb25seSBjYXVzZXMgdGhlIGRlbGV0aW9uIG9mIHRoZQogICAgIC8vIGNvcnJlc3BvbmRpbmcgY29weSBvcGVyYXRpb24sIG5vdCBib3RoIGNvcHkgb3BlcmF0aW9ucy4KICAgICBpZiAoUkQtPmhhc1VzZXJEZWNsYXJlZE1vdmVDb25zdHJ1Y3RvcigpICYmCi0gICAgICAgICghZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRNb2RlIHx8IENTTSA9PSBDWFhDb3B5Q29uc3RydWN0b3IpKSB7CisgICAgICAgICghZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0IHx8IENTTSA9PSBDWFhDb3B5Q29uc3RydWN0b3IpKSB7CiAgICAgICBpZiAoIURpYWdub3NlKSByZXR1cm4gdHJ1ZTsKIAogICAgICAgLy8gRmluZCBhbnkgdXNlci1kZWNsYXJlZCBtb3ZlIGNvbnN0cnVjdG9yLgotICAgICAgZm9yIChDWFhSZWNvcmREZWNsOjpjdG9yX2l0ZXJhdG9yIEkgPSBSRC0+Y3Rvcl9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBSRC0+Y3Rvcl9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGZvciAoYXV0byAqSSA6IFJELT5jdG9ycygpKSB7CiAgICAgICAgIGlmIChJLT5pc01vdmVDb25zdHJ1Y3RvcigpKSB7Ci0gICAgICAgICAgVXNlckRlY2xhcmVkTW92ZSA9ICpJOworICAgICAgICAgIFVzZXJEZWNsYXJlZE1vdmUgPSBJOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBhc3NlcnQoVXNlckRlY2xhcmVkTW92ZSk7CiAgICAgfSBlbHNlIGlmIChSRC0+aGFzVXNlckRlY2xhcmVkTW92ZUFzc2lnbm1lbnQoKSAmJgotICAgICAgICAgICAgICAgKCFnZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUgfHwgQ1NNID09IENYWENvcHlBc3NpZ25tZW50KSkgeworICAgICAgICAgICAgICAgKCFnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQgfHwgQ1NNID09IENYWENvcHlBc3NpZ25tZW50KSkgewogICAgICAgaWYgKCFEaWFnbm9zZSkgcmV0dXJuIHRydWU7CiAKICAgICAgIC8vIEZpbmQgYW55IHVzZXItZGVjbGFyZWQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgotICAgICAgZm9yIChDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IgSSA9IFJELT5tZXRob2RfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBSRC0+bWV0aG9kX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgZm9yIChhdXRvICpJIDogUkQtPm1ldGhvZHMoKSkgewogICAgICAgICBpZiAoSS0+aXNNb3ZlQXNzaWdubWVudE9wZXJhdG9yKCkpIHsKLSAgICAgICAgICBVc2VyRGVjbGFyZWRNb3ZlID0gKkk7CisgICAgICAgICAgVXNlckRlY2xhcmVkTW92ZSA9IEk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTUyNzQsMjYgKzUzMjQsMjIgQEAKIAogICBTcGVjaWFsTWVtYmVyRGVsZXRpb25JbmZvIFNNSSgqdGhpcywgTUQsIENTTSwgRGlhZ25vc2UpOwogCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBCSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkUgPSBSRC0+YmFzZXNfZW5kKCk7IEJJICE9IEJFOyArK0JJKQotICAgIGlmICghQkktPmlzVmlydHVhbCgpICYmCi0gICAgICAgIFNNSS5zaG91bGREZWxldGVGb3JCYXNlKEJJKSkKKyAgZm9yIChhdXRvICZCSSA6IFJELT5iYXNlcygpKQorICAgIGlmICghQkkuaXNWaXJ0dWFsKCkgJiYKKyAgICAgICAgU01JLnNob3VsZERlbGV0ZUZvckJhc2UoJkJJKSkKICAgICAgIHJldHVybiB0cnVlOwogCiAgIC8vIFBlciBEUjE2MTEsIGRvIG5vdCBjb25zaWRlciB2aXJ0dWFsIGJhc2VzIG9mIGNvbnN0cnVjdG9ycyBvZiBhYnN0cmFjdAogICAvLyBjbGFzc2VzLCBzaW5jZSB3ZSBhcmUgbm90IGdvaW5nIHRvIGNvbnN0cnVjdCB0aGVtLgogICBpZiAoIVJELT5pc0Fic3RyYWN0KCkgfHwgIVNNSS5Jc0NvbnN0cnVjdG9yKSB7Ci0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yIEJJID0gUkQtPnZiYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRSA9IFJELT52YmFzZXNfZW5kKCk7Ci0gICAgICAgICBCSSAhPSBCRTsgKytCSSkKLSAgICAgIGlmIChTTUkuc2hvdWxkRGVsZXRlRm9yQmFzZShCSSkpCisgICAgZm9yIChhdXRvICZCSSA6IFJELT52YmFzZXMoKSkKKyAgICAgIGlmIChTTUkuc2hvdWxkRGVsZXRlRm9yQmFzZSgmQkkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRkkgPSBSRC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRSA9IFJELT5maWVsZF9lbmQoKTsgRkkgIT0gRkU7ICsrRkkpCisgIGZvciAoYXV0byAqRkkgOiBSRC0+ZmllbGRzKCkpCiAgICAgaWYgKCFGSS0+aXNJbnZhbGlkRGVjbCgpICYmICFGSS0+aXNVbm5hbWVkQml0ZmllbGQoKSAmJgotICAgICAgICBTTUkuc2hvdWxkRGVsZXRlRm9yRmllbGQoKkZJKSkKKyAgICAgICAgU01JLnNob3VsZERlbGV0ZUZvckZpZWxkKEZJKSkKICAgICAgIHJldHVybiB0cnVlOwogCiAgIGlmIChTTUkuc2hvdWxkRGVsZXRlRm9yQWxsQ29uc3RNZW1iZXJzKCkpCkBAIC01MzEyLDcgKzUzNTgsNyBAQAogLy8vIG1lbWJlciB0aGF0IHdhcyBtb3N0IGxpa2VseSB0byBiZSBpbnRlbmRlZCB0byBiZSB0cml2aWFsLCBpZiBhbnkuCiBzdGF0aWMgYm9vbCBmaW5kVHJpdmlhbFNwZWNpYWxNZW1iZXIoU2VtYSAmUywgQ1hYUmVjb3JkRGVjbCAqUkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYTo6Q1hYU3BlY2lhbE1lbWJlciBDU00sIHVuc2lnbmVkIFF1YWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWE1ldGhvZERlY2wgKipTZWxlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29uc3RSSFMsIENYWE1ldGhvZERlY2wgKipTZWxlY3RlZCkgewogICBpZiAoU2VsZWN0ZWQpCiAgICAgKlNlbGVjdGVkID0gMDsKIApAQCAtNTMzNiwxMSArNTM4MiwxMCBAQAogICAgICAgQ1hYQ29uc3RydWN0b3JEZWNsICpEZWZDdG9yID0gMDsKICAgICAgIGlmIChSRC0+bmVlZHNJbXBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvcigpKQogICAgICAgICBTLkRlY2xhcmVJbXBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvcihSRCk7Ci0gICAgICBmb3IgKENYWFJlY29yZERlY2w6OmN0b3JfaXRlcmF0b3IgQ0kgPSBSRC0+Y3Rvcl9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFID0gUkQtPmN0b3JfZW5kKCk7IENJICE9IENFOyArK0NJKSB7CisgICAgICBmb3IgKGF1dG8gKkNJIDogUkQtPmN0b3JzKCkpIHsKICAgICAgICAgaWYgKCFDSS0+aXNEZWZhdWx0Q29uc3RydWN0b3IoKSkKICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgRGVmQ3RvciA9ICpDSTsKKyAgICAgICAgRGVmQ3RvciA9IENJOwogICAgICAgICBpZiAoIURlZkN0b3ItPmlzVXNlclByb3ZpZGVkKCkpCiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC01NDAzLDExICs1NDQ4LDcgQEAKICAgY2FzZSBTZW1hOjpDWFhNb3ZlQXNzaWdubWVudDoKICAgTmVlZE92ZXJsb2FkUmVzb2x1dGlvbjoKICAgICBTZW1hOjpTcGVjaWFsTWVtYmVyT3ZlcmxvYWRSZXN1bHQgKlNNT1IgPQotICAgICAgUy5Mb29rdXBTcGVjaWFsTWVtYmVyKFJELCBDU00sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbHMgJiBRdWFsaWZpZXJzOjpDb25zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFscyAmIFF1YWxpZmllcnM6OlZvbGF0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qUlZhbHVlVGhpcyovZmFsc2UsIC8qQ29uc3RUaGlzKi9mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlZvbGF0aWxlVGhpcyovZmFsc2UpOworICAgICAgICBsb29rdXBDYWxsRnJvbVNwZWNpYWxNZW1iZXIoUywgUkQsIENTTSwgUXVhbHMsIENvbnN0UkhTKTsKIAogICAgIC8vIFRoZSBzdGFuZGFyZCBkb2Vzbid0IGRlc2NyaWJlIGhvdyB0byBiZWhhdmUgaWYgdGhlIGxvb2t1cCBpcyBhbWJpZ3VvdXMuCiAgICAgLy8gV2UgdHJlYXQgaXQgYXMgbm90IG1ha2luZyB0aGUgbWVtYmVyIG5vbi10cml2aWFsLCBqdXN0IGxpa2UgdGhlIHN0YW5kYXJkCkBAIC01NDMzLDEwICs1NDc0LDkgQEAKIH0KIAogc3RhdGljIENYWENvbnN0cnVjdG9yRGVjbCAqZmluZFVzZXJEZWNsYXJlZEN0b3IoQ1hYUmVjb3JkRGVjbCAqUkQpIHsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpjdG9yX2l0ZXJhdG9yIENJID0gUkQtPmN0b3JfYmVnaW4oKSwgQ0UgPSBSRC0+Y3Rvcl9lbmQoKTsKLSAgICAgICBDSSAhPSBDRTsgKytDSSkKKyAgZm9yIChhdXRvICpDSSA6IFJELT5jdG9ycygpKQogICAgIGlmICghQ0ktPmlzSW1wbGljaXQoKSkKLSAgICAgIHJldHVybiAqQ0k7CisgICAgICByZXR1cm4gQ0k7CiAKICAgLy8gTG9vayBmb3IgY29uc3RydWN0b3IgdGVtcGxhdGVzLgogICB0eXBlZGVmIENYWFJlY29yZERlY2w6OnNwZWNpZmljX2RlY2xfaXRlcmF0b3I8RnVuY3Rpb25UZW1wbGF0ZURlY2w+IHRtcGxfaXRlcjsKQEAgLTU0NjIsNyArNTUwMiw3IEBACiAKIC8vLyBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWFsIG1lbWJlciBzZWxlY3RlZCBmb3IgYSBnaXZlbiB0eXBlIHdvdWxkIGJlIHRyaXZpYWwuCiBzdGF0aWMgYm9vbCBjaGVja1RyaXZpYWxTdWJvYmplY3RDYWxsKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIFN1Ym9iakxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgU3ViVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgU3ViVHlwZSwgYm9vbCBDb25zdFJIUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYTo6Q1hYU3BlY2lhbE1lbWJlciBDU00sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaXZpYWxTdWJvYmplY3RLaW5kIEtpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlhZ25vc2UpIHsKQEAgLTU0NzIsMTAgKzU1MTIsMTMgQEAKIAogICBDWFhNZXRob2REZWNsICpTZWxlY3RlZDsKICAgaWYgKGZpbmRUcml2aWFsU3BlY2lhbE1lbWJlcihTLCBTdWJSRCwgQ1NNLCBTdWJUeXBlLmdldENWUlF1YWxpZmllcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zZSA/ICZTZWxlY3RlZCA6IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0UkhTLCBEaWFnbm9zZSA/ICZTZWxlY3RlZCA6IDApKQogICAgIHJldHVybiB0cnVlOwogCiAgIGlmIChEaWFnbm9zZSkgeworICAgIGlmIChDb25zdFJIUykKKyAgICAgIFN1YlR5cGUuYWRkQ29uc3QoKTsKKwogICAgIGlmICghU2VsZWN0ZWQgJiYgQ1NNID09IFNlbWE6OkNYWERlZmF1bHRDb25zdHJ1Y3RvcikgewogICAgICAgUy5EaWFnKFN1Ym9iakxvYywgZGlhZzo6bm90ZV9ub250cml2aWFsX25vX2RlZl9jdG9yKQogICAgICAgICA8PCBLaW5kIDw8IFN1YlR5cGUuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CkBAIC01NTExLDggKzU1NTQsNyBAQAogc3RhdGljIGJvb2wgY2hlY2tUcml2aWFsQ2xhc3NNZW1iZXJzKFNlbWEgJlMsIENYWFJlY29yZERlY2wgKlJELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWE6OkNYWFNwZWNpYWxNZW1iZXIgQ1NNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29uc3RBcmcsIGJvb2wgRGlhZ25vc2UpIHsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGSSA9IFJELT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZFID0gUkQtPmZpZWxkX2VuZCgpOyBGSSAhPSBGRTsgKytGSSkgeworICBmb3IgKGNvbnN0IGF1dG8gKkZJIDogUkQtPmZpZWxkcygpKSB7CiAgICAgaWYgKEZJLT5pc0ludmFsaWREZWNsKCkgfHwgRkktPmlzVW5uYW1lZEJpdGZpZWxkKCkpCiAgICAgICBjb250aW51ZTsKIApAQCAtNTUzMiw3ICs1NTc0LDcgQEAKICAgICAvLyAgICAgICBicmFjZS1vci1lcXVhbC1pbml0aWFsaXplcgogICAgIGlmIChDU00gPT0gU2VtYTo6Q1hYRGVmYXVsdENvbnN0cnVjdG9yICYmIEZJLT5oYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSkgewogICAgICAgaWYgKERpYWdub3NlKQotICAgICAgICBTLkRpYWcoRkktPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfbm9udHJpdmlhbF9pbl9jbGFzc19pbml0KSA8PCAqRkk7CisgICAgICAgIFMuRGlhZyhGSS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9ub250cml2aWFsX2luX2NsYXNzX2luaXQpIDw8IEZJOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtNTU0OCwxMCArNTU5MCw5IEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKENvbnN0QXJnICYmICFGSS0+aXNNdXRhYmxlKCkpCi0gICAgICBGaWVsZFR5cGUuYWRkQ29uc3QoKTsKLSAgICBpZiAoIWNoZWNrVHJpdmlhbFN1Ym9iamVjdENhbGwoUywgRkktPmdldExvY2F0aW9uKCksIEZpZWxkVHlwZSwgQ1NNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU0tfRmllbGQsIERpYWdub3NlKSkKKyAgICBib29sIENvbnN0UkhTID0gQ29uc3RBcmcgJiYgIUZJLT5pc011dGFibGUoKTsKKyAgICBpZiAoIWNoZWNrVHJpdmlhbFN1Ym9iamVjdENhbGwoUywgRkktPmdldExvY2F0aW9uKCksIEZpZWxkVHlwZSwgQ29uc3RSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTTSwgVFNLX0ZpZWxkLCBEaWFnbm9zZSkpCiAgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIApAQCAtNTU2MiwxMCArNTYwMyw5IEBACiAvLy8gdGhlIGdpdmVuIGtpbmQuCiB2b2lkIFNlbWE6OkRpYWdub3NlTm9udHJpdmlhbChjb25zdCBDWFhSZWNvcmREZWNsICpSRCwgQ1hYU3BlY2lhbE1lbWJlciBDU00pIHsKICAgUXVhbFR5cGUgVHkgPSBDb250ZXh0LmdldFJlY29yZFR5cGUoUkQpOwotICBpZiAoQ1NNID09IENYWENvcHlDb25zdHJ1Y3RvciB8fCBDU00gPT0gQ1hYQ29weUFzc2lnbm1lbnQpCi0gICAgVHkuYWRkQ29uc3QoKTsKIAotICBjaGVja1RyaXZpYWxTdWJvYmplY3RDYWxsKCp0aGlzLCBSRC0+Z2V0TG9jYXRpb24oKSwgVHksIENTTSwKKyAgYm9vbCBDb25zdEFyZyA9IChDU00gPT0gQ1hYQ29weUNvbnN0cnVjdG9yIHx8IENTTSA9PSBDWFhDb3B5QXNzaWdubWVudCk7CisgIGNoZWNrVHJpdmlhbFN1Ym9iamVjdENhbGwoKnRoaXMsIFJELT5nZXRMb2NhdGlvbigpLCBUeSwgQ29uc3RBcmcsIENTTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU0tfQ29tcGxldGVPYmplY3QsIC8qRGlhZ25vc2UqL3RydWUpOwogfQogCkBAIC01NjQ4LDEyICs1Njg4LDkgQEAKICAgLy8gICBBIFtkZWZhdWx0IGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3JdIGlzIHRyaXZpYWwgaWYKICAgLy8gICAgLS0gYWxsIHRoZSBkaXJlY3QgYmFzZSBjbGFzc2VzIGhhdmUgdHJpdmlhbCBbZGVmYXVsdCBjb25zdHJ1Y3RvcnMgb3IKICAgLy8gICAgICAgZGVzdHJ1Y3RvcnNdCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBCSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkUgPSBSRC0+YmFzZXNfZW5kKCk7IEJJICE9IEJFOyArK0JJKQotICAgIGlmICghY2hlY2tUcml2aWFsU3Vib2JqZWN0Q2FsbCgqdGhpcywgQkktPmdldExvY1N0YXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0QXJnID8gQkktPmdldFR5cGUoKS53aXRoQ29uc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEJJLT5nZXRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTTSwgVFNLX0Jhc2VDbGFzcywgRGlhZ25vc2UpKQorICBmb3IgKGNvbnN0IGF1dG8gJkJJIDogUkQtPmJhc2VzKCkpCisgICAgaWYgKCFjaGVja1RyaXZpYWxTdWJvYmplY3RDYWxsKCp0aGlzLCBCSS5nZXRMb2NTdGFydCgpLCBCSS5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0QXJnLCBDU00sIFRTS19CYXNlQ2xhc3MsIERpYWdub3NlKSkKICAgICAgIHJldHVybiBmYWxzZTsKIAogICAvLyBDKysxMSBbY2xhc3MuY3Rvcl1wNSwgQysrMTEgW2NsYXNzLmR0b3JdcDU6CkBAIC01Njk3LDggKzU3MzQsNyBAQAogICAgIH0KIAogICAgIC8vIE11c3QgaGF2ZSBhIHZpcnR1YWwgbWV0aG9kLgotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6bWV0aG9kX2l0ZXJhdG9yIE1JID0gUkQtPm1ldGhvZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FID0gUkQtPm1ldGhvZF9lbmQoKTsgTUkgIT0gTUU7ICsrTUkpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKk1JIDogUkQtPm1ldGhvZHMoKSkgewogICAgICAgaWYgKE1JLT5pc1ZpcnR1YWwoKSkgewogICAgICAgICBTb3VyY2VMb2NhdGlvbiBNTG9jID0gTUktPmdldExvY1N0YXJ0KCk7CiAgICAgICAgIERpYWcoTUxvYywgZGlhZzo6bm90ZV9ub250cml2aWFsX2hhc192aXJ0dWFsKSA8PCBSRCA8PCAwOwpAQCAtNTk5Miw2ICs2MDI4LDE4IEBACiAgIFBvcERlY2xDb250ZXh0KCk7CiB9CiAKKy8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBjb25zdGFudCBleHByZXNzaW9uIGV2YWx1YXRpb24gcGFydCBvZiB0aGUKKy8vLyBhdHRyaWJ1dGUgZW5hYmxlX2lmIGV4dGVuc2lvbi4gVGhlcmUgaXMgbm90aGluZyBpbiBzdGFuZGFyZCBDKysgd2hpY2ggd291bGQKKy8vLyByZXF1aXJlIHJlZW50ZXJpbmcgcGFyYW1ldGVycy4KK3ZvaWQgU2VtYTo6QWN0T25SZWVudGVyQ1hYTWV0aG9kUGFyYW1ldGVyKFNjb3BlICpTLCBQYXJtVmFyRGVjbCAqUGFyYW0pIHsKKyAgaWYgKCFQYXJhbSkKKyAgICByZXR1cm47CisKKyAgUy0+QWRkRGVjbChQYXJhbSk7CisgIGlmIChQYXJhbS0+Z2V0RGVjbE5hbWUoKSkKKyAgICBJZFJlc29sdmVyLkFkZERlY2woUGFyYW0pOworfQorCiAvLy8gQWN0T25TdGFydERlbGF5ZWRDWFhNZXRob2REZWNsYXJhdGlvbiAtIFdlIGhhdmUgY29tcGxldGVkCiAvLy8gcGFyc2luZyBhIHRvcC1sZXZlbCAobm9uLW5lc3RlZCkgQysrIGNsYXNzLCBhbmQgd2UgYXJlIG5vdwogLy8vIHBhcnNpbmcgdGhvc2UgcGFydHMgb2YgdGhlIGdpdmVuIE1ldGhvZCBkZWNsYXJhdGlvbiB0aGF0IGNvdWxkCkBAIC02MTA4LDE0ICs2MTU2LDE0IEBACiAgIC8vIGNhc2UgYW55IG9mIHRoZSBlcnJvcnMgYWJvdmUgZmlyZWQpIGFuZCB3aXRoICJ2b2lkIiBhcyB0aGUKICAgLy8gcmV0dXJuIHR5cGUsIHNpbmNlIGNvbnN0cnVjdG9ycyBkb24ndCBoYXZlIHJldHVybiB0eXBlcy4KICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlByb3RvID0gUi0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7Ci0gIGlmIChQcm90by0+Z2V0UmVzdWx0VHlwZSgpID09IENvbnRleHQuVm9pZFR5ICYmICFELmlzSW52YWxpZFR5cGUoKSkKKyAgaWYgKFByb3RvLT5nZXRSZXR1cm5UeXBlKCkgPT0gQ29udGV4dC5Wb2lkVHkgJiYgIUQuaXNJbnZhbGlkVHlwZSgpKQogICAgIHJldHVybiBSOwogCiAgIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gRVBJID0gUHJvdG8tPmdldEV4dFByb3RvSW5mbygpOwogICBFUEkuVHlwZVF1YWxzID0gMDsKICAgRVBJLlJlZlF1YWxpZmllciA9IFJRX05vbmU7Ci0gIAotICByZXR1cm4gQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoQ29udGV4dC5Wb2lkVHksIFByb3RvLT5nZXRBcmdUeXBlcygpLCBFUEkpOworCisgIHJldHVybiBDb250ZXh0LmdldEZ1bmN0aW9uVHlwZShDb250ZXh0LlZvaWRUeSwgUHJvdG8tPmdldFBhcmFtVHlwZXMoKSwgRVBJKTsKIH0KIAogLy8vIENoZWNrQ29uc3RydWN0b3IgLSBDaGVja3MgYSBmdWxseS1mb3JtZWQgY29uc3RydWN0b3IgZm9yCkBAIC02MTkwLDkgKzYyMzgsOSBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wKIEZUSUhhc1NpbmdsZVZvaWRBcmd1bWVudChEZWNsYXJhdG9yQ2h1bms6OkZ1bmN0aW9uVHlwZUluZm8gJkZUSSkgewotICByZXR1cm4gKEZUSS5OdW1BcmdzID09IDEgJiYgIUZUSS5pc1ZhcmlhZGljICYmIEZUSS5BcmdJbmZvWzBdLklkZW50ID09IDAgJiYKLSAgICAgICAgICBGVEkuQXJnSW5mb1swXS5QYXJhbSAmJgotICAgICAgICAgIGNhc3Q8UGFybVZhckRlY2w+KEZUSS5BcmdJbmZvWzBdLlBhcmFtKS0+Z2V0VHlwZSgpLT5pc1ZvaWRUeXBlKCkpOworICByZXR1cm4gKEZUSS5OdW1QYXJhbXMgPT0gMSAmJiAhRlRJLmlzVmFyaWFkaWMgJiYgRlRJLlBhcmFtc1swXS5JZGVudCA9PSAwICYmCisgICAgICAgICAgRlRJLlBhcmFtc1swXS5QYXJhbSAmJgorICAgICAgICAgIGNhc3Q8UGFybVZhckRlY2w+KEZUSS5QYXJhbXNbMF0uUGFyYW0pLT5nZXRUeXBlKCktPmlzVm9pZFR5cGUoKSk7CiB9CiAKIC8vLyBDaGVja0Rlc3RydWN0b3JEZWNsYXJhdG9yIC0gQ2FsbGVkIGJ5IEFjdE9uRGVjbGFyYXRvciB0byBjaGVjawpAQCAtNjI3MywxMSArNjMyMSwxMSBAQAogICB9CiAgIAogICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBhbnkgcGFyYW1ldGVycy4KLSAgaWYgKEZUSS5OdW1BcmdzID4gMCAmJiAhRlRJSGFzU2luZ2xlVm9pZEFyZ3VtZW50KEZUSSkpIHsKKyAgaWYgKEZUSS5OdW1QYXJhbXMgPiAwICYmICFGVElIYXNTaW5nbGVWb2lkQXJndW1lbnQoRlRJKSkgewogICAgIERpYWcoRC5nZXRJZGVudGlmaWVyTG9jKCksIGRpYWc6OmVycl9kZXN0cnVjdG9yX3dpdGhfcGFyYW1zKTsKIAogICAgIC8vIERlbGV0ZSB0aGUgcGFyYW1ldGVycy4KLSAgICBGVEkuZnJlZUFyZ3MoKTsKKyAgICBGVEkuZnJlZVBhcmFtcygpOwogICAgIEQuc2V0SW52YWxpZFR5cGUoKTsKICAgfQogCkBAIC02MzQzLDExICs2MzkxLDExIEBACiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpQcm90byA9IFItPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwogCiAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGFueSBwYXJhbWV0ZXJzLgotICBpZiAoUHJvdG8tPmdldE51bUFyZ3MoKSA+IDApIHsKKyAgaWYgKFByb3RvLT5nZXROdW1QYXJhbXMoKSA+IDApIHsKICAgICBEaWFnKEQuZ2V0SWRlbnRpZmllckxvYygpLCBkaWFnOjplcnJfY29udl9mdW5jdGlvbl93aXRoX3BhcmFtcyk7CiAKICAgICAvLyBEZWxldGUgdGhlIHBhcmFtZXRlcnMuCi0gICAgRC5nZXRGdW5jdGlvblR5cGVJbmZvKCkuZnJlZUFyZ3MoKTsKKyAgICBELmdldEZ1bmN0aW9uVHlwZUluZm8oKS5mcmVlUGFyYW1zKCk7CiAgICAgRC5zZXRJbnZhbGlkVHlwZSgpOwogICB9IGVsc2UgaWYgKFByb3RvLT5pc1ZhcmlhZGljKCkpIHsKICAgICBEaWFnKEQuZ2V0SWRlbnRpZmllckxvYygpLCBkaWFnOjplcnJfY29udl9mdW5jdGlvbl92YXJpYWRpYyk7CkBAIC02MzU2LDExICs2NDA0LDExIEBACiAKICAgLy8gRGlhZ25vc2UgIiZvcGVyYXRvciBib29sKCkiIGFuZCBvdGhlciBzdWNoIG5vbnNlbnNlLiAgVGhpcwogICAvLyBpcyBhY3R1YWxseSBhIGdjYyBleHRlbnNpb24gd2hpY2ggd2UgZG9uJ3Qgc3VwcG9ydC4KLSAgaWYgKFByb3RvLT5nZXRSZXN1bHRUeXBlKCkgIT0gQ29udlR5cGUpIHsKKyAgaWYgKFByb3RvLT5nZXRSZXR1cm5UeXBlKCkgIT0gQ29udlR5cGUpIHsKICAgICBEaWFnKEQuZ2V0SWRlbnRpZmllckxvYygpLCBkaWFnOjplcnJfY29udl9mdW5jdGlvbl93aXRoX2NvbXBsZXhfZGVjbCkKLSAgICAgIDw8IFByb3RvLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgICAgIDw8IFByb3RvLT5nZXRSZXR1cm5UeXBlKCk7CiAgICAgRC5zZXRJbnZhbGlkVHlwZSgpOwotICAgIENvbnZUeXBlID0gUHJvdG8tPmdldFJlc3VsdFR5cGUoKTsKKyAgICBDb252VHlwZSA9IFByb3RvLT5nZXRSZXR1cm5UeXBlKCk7CiAgIH0KIAogICAvLyBDKysgW2NsYXNzLmNvbnYuZmN0XXA0OgpAQCAtNjQ2NCw5ICs2NTEyLDggQEAKICAgICAgIE5TLT5zZXRJbmxpbmUoKklzSW5saW5lKTsKICAgICAvLyBQYXRjaCB1cCB0aGUgbG9va3VwIHRhYmxlIGZvciB0aGUgY29udGFpbmluZyBuYW1lc3BhY2UuIFRoaXMgaXNuJ3QgcmVhbGx5CiAgICAgLy8gY29ycmVjdCwgYnV0IGl0J3MgZ29vZCBlbm91Z2ggZm9yIHRoaXMgcGFydGljdWxhciBjYXNlLgotICAgIGZvciAoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgSSA9IFByZXZOUy0+ZGVjbHNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBQcmV2TlMtPmRlY2xzX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICAgIGlmIChOYW1lZERlY2wgKk5EID0gZHluX2Nhc3Q8TmFtZWREZWNsPigqSSkpCisgICAgZm9yIChhdXRvICpJIDogUHJldk5TLT5kZWNscygpKQorICAgICAgaWYgKGF1dG8gKk5EID0gZHluX2Nhc3Q8TmFtZWREZWNsPihJKSkKICAgICAgICAgUHJldk5TLT5nZXRQYXJlbnQoKS0+bWFrZURlY2xWaXNpYmxlSW5Db250ZXh0KE5EKTsKICAgICByZXR1cm47CiAgIH0KQEAgLTY0NzcsOCArNjUyNCw3IEBACiAgICAgUy5EaWFnKExvYywgZGlhZzo6d2Fybl9pbmxpbmVfbmFtZXNwYWNlX3Jlb3BlbmVkX25vbmlubGluZSkKICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKEtleXdvcmRMb2MsICJpbmxpbmUgIik7CiAgIGVsc2UKLSAgICBTLkRpYWcoTG9jLCBkaWFnOjplcnJfaW5saW5lX25hbWVzcGFjZV9taXNtYXRjaCkKLSAgICAgIDw8IElzSW5saW5lOworICAgIFMuRGlhZyhMb2MsIGRpYWc6OmVycl9pbmxpbmVfbmFtZXNwYWNlX21pc21hdGNoKSA8PCAqSXNJbmxpbmU7CiAKICAgUy5EaWFnKFByZXZOUy0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcmV2aW91c19kZWZpbml0aW9uKTsKICAgKklzSW5saW5lID0gUHJldk5TLT5pc0lubGluZSgpOwpAQCAtNjgzMCw3ICs2ODc2LDcgQEAKIC8vIENhbGxiYWNrIHRvIG9ubHkgYWNjZXB0IHR5cG8gY29ycmVjdGlvbnMgdGhhdCBhcmUgbmFtZXNwYWNlcy4KIGNsYXNzIE5hbWVzcGFjZVZhbGlkYXRvckNDQyA6IHB1YmxpYyBDb3JyZWN0aW9uQ2FuZGlkYXRlQ2FsbGJhY2sgewogcHVibGljOgotICBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIExMVk1fT1ZFUlJJREUgeworICBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIG92ZXJyaWRlIHsKICAgICBpZiAoTmFtZWREZWNsICpORCA9IGNhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uRGVjbCgpKQogICAgICAgcmV0dXJuIGlzYTxOYW1lc3BhY2VEZWNsPihORCkgfHwgaXNhPE5hbWVzcGFjZUFsaWFzRGVjbD4oTkQpOwogICAgIHJldHVybiBmYWxzZTsKQEAgLTY4ODYsNyArNjkzMiw3IEBACiAgIFVzaW5nRGlyZWN0aXZlRGVjbCAqVURpciA9IDA7CiAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKlF1YWxpZmllciA9IDA7CiAgIGlmIChTUy5pc1NldCgpKQotICAgIFF1YWxpZmllciA9IHN0YXRpY19jYXN0PE5lc3RlZE5hbWVTcGVjaWZpZXIgKj4oU1MuZ2V0U2NvcGVSZXAoKSk7CisgICAgUXVhbGlmaWVyID0gU1MuZ2V0U2NvcGVSZXAoKTsKICAgCiAgIC8vIExvb2t1cCBuYW1lc3BhY2UgbmFtZS4KICAgTG9va3VwUmVzdWx0IFIoKnRoaXMsIE5hbWVzcGNOYW1lLCBJZGVudExvYywgTG9va3VwTmFtZXNwYWNlTmFtZSk7CkBAIC03MTMwLDEzICs3MTc2LDcgQEAKICAgaWYgKEZvdW5kRXF1aXZhbGVudERlY2wpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGlmIChUYXJnZXQtPmlzRnVuY3Rpb25PckZ1bmN0aW9uVGVtcGxhdGUoKSkgewotICAgIEZ1bmN0aW9uRGVjbCAqRkQ7Ci0gICAgaWYgKGlzYTxGdW5jdGlvblRlbXBsYXRlRGVjbD4oVGFyZ2V0KSkKLSAgICAgIEZEID0gY2FzdDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oVGFyZ2V0KS0+Z2V0VGVtcGxhdGVkRGVjbCgpOwotICAgIGVsc2UKLSAgICAgIEZEID0gY2FzdDxGdW5jdGlvbkRlY2w+KFRhcmdldCk7Ci0KKyAgaWYgKEZ1bmN0aW9uRGVjbCAqRkQgPSBUYXJnZXQtPmdldEFzRnVuY3Rpb24oKSkgewogICAgIE5hbWVkRGVjbCAqT2xkRGVjbCA9IDA7CiAgICAgc3dpdGNoIChDaGVja092ZXJsb2FkKDAsIEZELCBQcmV2aW91cywgT2xkRGVjbCwgLypJc0ZvclVzaW5nRGVjbCovIHRydWUpKSB7CiAgICAgY2FzZSBPdmxfT3ZlcmxvYWQ6CkBAIC03MTQ1LDcgKzcxODUsNyBAQAogICAgIGNhc2UgT3ZsX05vbkZ1bmN0aW9uOgogICAgICAgRGlhZyhVc2luZy0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX3VzaW5nX2RlY2xfY29uZmxpY3QpOwogICAgICAgYnJlYWs7Ci0gICAgICAKKwogICAgIC8vIFdlIGZvdW5kIGEgZGVjbCB3aXRoIHRoZSBleGFjdCBzaWduYXR1cmUuCiAgICAgY2FzZSBPdmxfTWF0Y2g6CiAgICAgICAvLyBJZiB3ZSdyZSBpbiBhIHJlY29yZCwgd2Ugd2FudCB0byBoaWRlIHRoZSB0YXJnZXQsIHNvIHdlCkBAIC03Mjc0LDcgKzczMTQsNyBAQAogICAgICAgOiBIYXNUeXBlbmFtZUtleXdvcmQoSGFzVHlwZW5hbWVLZXl3b3JkKSwKICAgICAgICAgSXNJbnN0YW50aWF0aW9uKElzSW5zdGFudGlhdGlvbiksIFJlcXVpcmVNZW1iZXIoUmVxdWlyZU1lbWJlcikge30KIAotICBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZDYW5kaWRhdGUpIExMVk1fT1ZFUlJJREUgeworICBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZDYW5kaWRhdGUpIG92ZXJyaWRlIHsKICAgICBOYW1lZERlY2wgKk5EID0gQ2FuZGlkYXRlLmdldENvcnJlY3Rpb25EZWNsKCk7CiAKICAgICAvLyBLZXl3b3JkcyBhcmUgbm90IHZhbGlkIGhlcmUuCkBAIC03MzUzLDcgKzczOTMsNyBAQAogICAgIHJldHVybiAwOwogCiAgIC8vIENoZWNrIGZvciBiYWQgcXVhbGlmaWVycy4KLSAgaWYgKENoZWNrVXNpbmdEZWNsUXVhbGlmaWVyKFVzaW5nTG9jLCBTUywgSWRlbnRMb2MpKQorICBpZiAoQ2hlY2tVc2luZ0RlY2xRdWFsaWZpZXIoVXNpbmdMb2MsIFNTLCBOYW1lSW5mbywgSWRlbnRMb2MpKQogICAgIHJldHVybiAwOwogCiAgIERlY2xDb250ZXh0ICpMb29rdXBDb250ZXh0ID0gY29tcHV0ZURlY2xDb250ZXh0KFNTKTsKQEAgLTc1MzQsOCArNzU3NCw3IEBACiAgIGlmICghQ3VyQ29udGV4dC0+Z2V0UmVkZWNsQ29udGV4dCgpLT5pc1JlY29yZCgpKQogICAgIHJldHVybiBmYWxzZTsKIAotICBOZXN0ZWROYW1lU3BlY2lmaWVyICpRdWFsCi0gICAgPSBzdGF0aWNfY2FzdDxOZXN0ZWROYW1lU3BlY2lmaWVyKj4oU1MuZ2V0U2NvcGVSZXAoKSk7CisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKlF1YWwgPSBTUy5nZXRTY29wZVJlcCgpOwogCiAgIGZvciAoTG9va3VwUmVzdWx0OjppdGVyYXRvciBJID0gUHJldi5iZWdpbigpLCBFID0gUHJldi5lbmQoKTsgSSAhPSBFOyArK0kpIHsKICAgICBOYW1lZERlY2wgKkQgPSAqSTsKQEAgLTc1ODAsNiArNzYxOSw3IEBACiAvLy8gc2NvcGUuICBJZiBhbiBlcnJvciBpcyBmb3VuZCwgZGlhZ25vc2VzIGl0IGFuZCByZXR1cm5zIHRydWUuCiBib29sIFNlbWE6OkNoZWNrVXNpbmdEZWNsUXVhbGlmaWVyKFNvdXJjZUxvY2F0aW9uIFVzaW5nTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhTY29wZVNwZWMgJlNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk5hbWVJbmZvICZOYW1lSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTmFtZUxvYykgewogICBEZWNsQ29udGV4dCAqTmFtZWRDb250ZXh0ID0gY29tcHV0ZURlY2xDb250ZXh0KFNTKTsKIApAQCAtNzU5MSw4ICs3NjMxLDU2IEBACiAgICAgLy8gSWYgd2Ugd2VyZW4ndCBhYmxlIHRvIGNvbXB1dGUgYSB2YWxpZCBzY29wZSwgaXQgbXVzdCBiZSBhCiAgICAgLy8gZGVwZW5kZW50IGNsYXNzIHNjb3BlLgogICAgIGlmICghTmFtZWRDb250ZXh0IHx8IE5hbWVkQ29udGV4dC0+aXNSZWNvcmQoKSkgeworICAgICAgYXV0byAqUkQgPSBkeW5fY2FzdDxDWFhSZWNvcmREZWNsPihOYW1lZENvbnRleHQpOworICAgICAgaWYgKFJEICYmIFJlcXVpcmVDb21wbGV0ZURlY2xDb250ZXh0KGNvbnN0X2Nhc3Q8Q1hYU2NvcGVTcGVjJj4oU1MpLCBSRCkpCisgICAgICAgIFJEID0gMDsKKwogICAgICAgRGlhZyhOYW1lTG9jLCBkaWFnOjplcnJfdXNpbmdfZGVjbF9jYW5fbm90X3JlZmVyX3RvX2NsYXNzX21lbWJlcikKICAgICAgICAgPDwgU1MuZ2V0UmFuZ2UoKTsKKworICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNvbXBsZXRlLCBub24tZGVwZW5kZW50IHNvdXJjZSB0eXBlLCB0cnkgdG8gc3VnZ2VzdCBhCisgICAgICAvLyB3YXkgdG8gZ2V0IHRoZSBzYW1lIGVmZmVjdC4KKyAgICAgIGlmICghUkQpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAvLyBGaW5kIHdoYXQgdGhpcyB1c2luZy1kZWNsYXJhdGlvbiB3YXMgcmVmZXJyaW5nIHRvLgorICAgICAgTG9va3VwUmVzdWx0IFIoKnRoaXMsIE5hbWVJbmZvLCBMb29rdXBPcmRpbmFyeU5hbWUpOworICAgICAgUi5zZXRIaWRlVGFncyhmYWxzZSk7CisgICAgICBSLnN1cHByZXNzRGlhZ25vc3RpY3MoKTsKKyAgICAgIExvb2t1cFF1YWxpZmllZE5hbWUoUiwgUkQpOworCisgICAgICBpZiAoUi5nZXRBc1NpbmdsZTxUeXBlRGVjbD4oKSkgeworICAgICAgICBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMSkgeworICAgICAgICAgIC8vIENvbnZlcnQgJ3VzaW5nIFg6Olk7JyB0byAndXNpbmcgWSA9IFg6Olk7Jy4KKyAgICAgICAgICBEaWFnKFNTLmdldEJlZ2luTG9jKCksIGRpYWc6Om5vdGVfdXNpbmdfZGVjbF9jbGFzc19tZW1iZXJfd29ya2Fyb3VuZCkKKyAgICAgICAgICAgIDw8IDAgLy8gYWxpYXMgZGVjbGFyYXRpb24KKyAgICAgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKFNTLmdldEJlZ2luTG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lSW5mby5nZXROYW1lKCkuZ2V0QXNTdHJpbmcoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9ICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIENvbnZlcnQgJ3VzaW5nIFg6Olk7JyB0byAndHlwZWRlZiBYOjpZIFk7Jy4KKyAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbnNlcnRMb2MgPQorICAgICAgICAgICAgICBQUC5nZXRMb2NGb3JFbmRPZlRva2VuKE5hbWVJbmZvLmdldExvY0VuZCgpKTsKKyAgICAgICAgICBEaWFnKEluc2VydExvYywgZGlhZzo6bm90ZV91c2luZ19kZWNsX2NsYXNzX21lbWJlcl93b3JrYXJvdW5kKQorICAgICAgICAgICAgPDwgMSAvLyB0eXBlZGVmIGRlY2xhcmF0aW9uCisgICAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlcGxhY2VtZW50KFVzaW5nTG9jLCAidHlwZWRlZiIpCisgICAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbigKKyAgICAgICAgICAgICAgICAgICBJbnNlcnRMb2MsICIgIiArIE5hbWVJbmZvLmdldE5hbWUoKS5nZXRBc1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChSLmdldEFzU2luZ2xlPFZhckRlY2w+KCkpIHsKKyAgICAgICAgLy8gRG9uJ3QgcHJvdmlkZSBhIGZpeGl0IG91dHNpZGUgQysrMTEgbW9kZTsgd2UgZG9uJ3Qgd2FudCB0byBzdWdnZXN0CisgICAgICAgIC8vIHJlcGVhdGluZyB0aGUgdHlwZSBvZiB0aGUgc3RhdGljIGRhdGEgbWVtYmVyIGhlcmUuCisgICAgICAgIEZpeEl0SGludCBGaXhJdDsKKyAgICAgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEpIHsKKyAgICAgICAgICAvLyBDb252ZXJ0ICd1c2luZyBYOjpZOycgdG8gJ2F1dG8gJlkgPSBYOjpZOycuCisgICAgICAgICAgRml4SXQgPSBGaXhJdEhpbnQ6OkNyZWF0ZVJlcGxhY2VtZW50KAorICAgICAgICAgICAgICBVc2luZ0xvYywgImF1dG8gJiIgKyBOYW1lSW5mby5nZXROYW1lKCkuZ2V0QXNTdHJpbmcoKSArICIgPSAiKTsKKyAgICAgICAgfQorCisgICAgICAgIERpYWcoVXNpbmdMb2MsIGRpYWc6Om5vdGVfdXNpbmdfZGVjbF9jbGFzc19tZW1iZXJfd29ya2Fyb3VuZCkKKyAgICAgICAgICA8PCAyIC8vIHJlZmVyZW5jZSBkZWNsYXJhdGlvbgorICAgICAgICAgIDw8IEZpeEl0OworICAgICAgfQogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC03NjE4LDcgKzc3MDYsNyBAQAogICAgIC8vIGJ1dCB3ZSBkb24ndCBoYXZlIHRoYXQgbGV2ZWwgb2Ygc291cmNlIGluZm8uCiAgICAgRGlhZyhTUy5nZXRSYW5nZSgpLmdldEJlZ2luKCksCiAgICAgICAgICBkaWFnOjplcnJfdXNpbmdfZGVjbF9uZXN0ZWRfbmFtZV9zcGVjaWZpZXJfaXNfbm90X2NsYXNzKQotICAgICAgPDwgKE5lc3RlZE5hbWVTcGVjaWZpZXIqKSBTUy5nZXRTY29wZVJlcCgpIDw8IFNTLmdldFJhbmdlKCk7CisgICAgICA8PCBTUy5nZXRTY29wZVJlcCgpIDw8IFNTLmdldFJhbmdlKCk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIApAQCAtNzY0Myw3ICs3NzMxLDcgQEAKIAogICAgICAgRGlhZyhTUy5nZXRSYW5nZSgpLmdldEJlZ2luKCksCiAgICAgICAgICAgIGRpYWc6OmVycl91c2luZ19kZWNsX25lc3RlZF9uYW1lX3NwZWNpZmllcl9pc19ub3RfYmFzZV9jbGFzcykKLSAgICAgICAgPDwgKE5lc3RlZE5hbWVTcGVjaWZpZXIqKSBTUy5nZXRTY29wZVJlcCgpCisgICAgICAgIDw8IFNTLmdldFNjb3BlUmVwKCkKICAgICAgICAgPDwgY2FzdDxDWFhSZWNvcmREZWNsPihDdXJDb250ZXh0KQogICAgICAgICA8PCBTUy5nZXRSYW5nZSgpOwogICAgICAgcmV0dXJuIHRydWU7CkBAIC03NzAzLDcgKzc3OTEsNyBAQAogCiAgIERpYWcoU1MuZ2V0UmFuZ2UoKS5nZXRCZWdpbigpLAogICAgICAgIGRpYWc6OmVycl91c2luZ19kZWNsX25lc3RlZF9uYW1lX3NwZWNpZmllcl9pc19ub3RfYmFzZV9jbGFzcykKLSAgICA8PCAoTmVzdGVkTmFtZVNwZWNpZmllciopIFNTLmdldFNjb3BlUmVwKCkKKyAgICA8PCBTUy5nZXRTY29wZVJlcCgpCiAgICAgPDwgY2FzdDxDWFhSZWNvcmREZWNsPihDdXJDb250ZXh0KQogICAgIDw8IFNTLmdldFJhbmdlKCk7CiAKQEAgLTc5MjMsNDAgKzgwMTEsMzQgQEAKICAgICByZXR1cm4gRXhjZXB0U3BlYzsKIAogICAvLyBEaXJlY3QgYmFzZS1jbGFzcyBjb25zdHJ1Y3RvcnMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBCID0gQ2xhc3NEZWNsLT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVuZCA9IENsYXNzRGVjbC0+YmFzZXNfZW5kKCk7Ci0gICAgICAgQiAhPSBCRW5kOyArK0IpIHsKLSAgICBpZiAoQi0+aXNWaXJ0dWFsKCkpIC8vIEhhbmRsZWQgYmVsb3cuCisgIGZvciAoY29uc3QgYXV0byAmQiA6IENsYXNzRGVjbC0+YmFzZXMoKSkgeworICAgIGlmIChCLmlzVmlydHVhbCgpKSAvLyBIYW5kbGVkIGJlbG93LgogICAgICAgY29udGludWU7CiAgICAgCi0gICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKkJhc2VUeXBlID0gQi0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CisgICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKkJhc2VUeXBlID0gQi5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKICAgICAgIENYWFJlY29yZERlY2wgKkJhc2VDbGFzc0RlY2wgPSBjYXN0PENYWFJlY29yZERlY2w+KEJhc2VUeXBlLT5nZXREZWNsKCkpOwogICAgICAgQ1hYQ29uc3RydWN0b3JEZWNsICpDb25zdHJ1Y3RvciA9IExvb2t1cERlZmF1bHRDb25zdHJ1Y3RvcihCYXNlQ2xhc3NEZWNsKTsKICAgICAgIC8vIElmIHRoaXMgaXMgYSBkZWxldGVkIGZ1bmN0aW9uLCBhZGQgaXQgYW55d2F5LiBUaGlzIG1pZ2h0IGJlIGNvbmZvcm1hbnQKICAgICAgIC8vIHdpdGggdGhlIHN0YW5kYXJkLiBUaGlzIG1pZ2h0IG5vdC4gSSdtIG5vdCBzdXJlLiBJdCBtaWdodCBub3QgbWF0dGVyLgogICAgICAgaWYgKENvbnN0cnVjdG9yKQotICAgICAgICBFeGNlcHRTcGVjLkNhbGxlZERlY2woQi0+Z2V0TG9jU3RhcnQoKSwgQ29uc3RydWN0b3IpOworICAgICAgICBFeGNlcHRTcGVjLkNhbGxlZERlY2woQi5nZXRMb2NTdGFydCgpLCBDb25zdHJ1Y3Rvcik7CiAgICAgfQogICB9CiAKICAgLy8gVmlydHVhbCBiYXNlLWNsYXNzIGNvbnN0cnVjdG9ycy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yIEIgPSBDbGFzc0RlY2wtPnZiYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVuZCA9IENsYXNzRGVjbC0+dmJhc2VzX2VuZCgpOwotICAgICAgIEIgIT0gQkVuZDsgKytCKSB7Ci0gICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKkJhc2VUeXBlID0gQi0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CisgIGZvciAoY29uc3QgYXV0byAmQiA6IENsYXNzRGVjbC0+dmJhc2VzKCkpIHsKKyAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqQmFzZVR5cGUgPSBCLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkgewogICAgICAgQ1hYUmVjb3JkRGVjbCAqQmFzZUNsYXNzRGVjbCA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oQmFzZVR5cGUtPmdldERlY2woKSk7CiAgICAgICBDWFhDb25zdHJ1Y3RvckRlY2wgKkNvbnN0cnVjdG9yID0gTG9va3VwRGVmYXVsdENvbnN0cnVjdG9yKEJhc2VDbGFzc0RlY2wpOwogICAgICAgLy8gSWYgdGhpcyBpcyBhIGRlbGV0ZWQgZnVuY3Rpb24sIGFkZCBpdCBhbnl3YXkuIFRoaXMgbWlnaHQgYmUgY29uZm9ybWFudAogICAgICAgLy8gd2l0aCB0aGUgc3RhbmRhcmQuIFRoaXMgbWlnaHQgbm90LiBJJ20gbm90IHN1cmUuIEl0IG1pZ2h0IG5vdCBtYXR0ZXIuCiAgICAgICBpZiAoQ29uc3RydWN0b3IpCi0gICAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCLT5nZXRMb2NTdGFydCgpLCBDb25zdHJ1Y3Rvcik7CisgICAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCLmdldExvY1N0YXJ0KCksIENvbnN0cnVjdG9yKTsKICAgICB9CiAgIH0KIAogICAvLyBGaWVsZCBjb25zdHJ1Y3RvcnMuCi0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRiA9IENsYXNzRGVjbC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRW5kID0gQ2xhc3NEZWNsLT5maWVsZF9lbmQoKTsKLSAgICAgICBGICE9IEZFbmQ7ICsrRikgeworICBmb3IgKGNvbnN0IGF1dG8gKkYgOiBDbGFzc0RlY2wtPmZpZWxkcygpKSB7CiAgICAgaWYgKEYtPmhhc0luQ2xhc3NJbml0aWFsaXplcigpKSB7CiAgICAgICBpZiAoRXhwciAqRSA9IEYtPmdldEluQ2xhc3NJbml0aWFsaXplcigpKQogICAgICAgICBFeGNlcHRTcGVjLkNhbGxlZEV4cHIoRSk7CkBAIC04MDEyLDQwICs4MDk0LDM0IEBACiAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChDRC0+Z2V0TG9jU3RhcnQoKSwgSW5oZXJpdGVkQ0QpOwogCiAgIC8vIERpcmVjdCBiYXNlLWNsYXNzIGNvbnN0cnVjdG9ycy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yIEIgPSBDbGFzc0RlY2wtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRW5kID0gQ2xhc3NEZWNsLT5iYXNlc19lbmQoKTsKLSAgICAgICBCICE9IEJFbmQ7ICsrQikgewotICAgIGlmIChCLT5pc1ZpcnR1YWwoKSkgLy8gSGFuZGxlZCBiZWxvdy4KKyAgZm9yIChjb25zdCBhdXRvICZCIDogQ2xhc3NEZWNsLT5iYXNlcygpKSB7CisgICAgaWYgKEIuaXNWaXJ0dWFsKCkpIC8vIEhhbmRsZWQgYmVsb3cuCiAgICAgICBjb250aW51ZTsKIAotICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpCYXNlVHlwZSA9IEItPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkgeworICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpCYXNlVHlwZSA9IEIuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CiAgICAgICBDWFhSZWNvcmREZWNsICpCYXNlQ2xhc3NEZWNsID0gY2FzdDxDWFhSZWNvcmREZWNsPihCYXNlVHlwZS0+Z2V0RGVjbCgpKTsKICAgICAgIGlmIChCYXNlQ2xhc3NEZWNsID09IEluaGVyaXRlZERlY2wpCiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgQ1hYQ29uc3RydWN0b3JEZWNsICpDb25zdHJ1Y3RvciA9IExvb2t1cERlZmF1bHRDb25zdHJ1Y3RvcihCYXNlQ2xhc3NEZWNsKTsKICAgICAgIGlmIChDb25zdHJ1Y3RvcikKLSAgICAgICAgRXhjZXB0U3BlYy5DYWxsZWREZWNsKEItPmdldExvY1N0YXJ0KCksIENvbnN0cnVjdG9yKTsKKyAgICAgICAgRXhjZXB0U3BlYy5DYWxsZWREZWNsKEIuZ2V0TG9jU3RhcnQoKSwgQ29uc3RydWN0b3IpOwogICAgIH0KICAgfQogCiAgIC8vIFZpcnR1YWwgYmFzZS1jbGFzcyBjb25zdHJ1Y3RvcnMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBCID0gQ2xhc3NEZWNsLT52YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFbmQgPSBDbGFzc0RlY2wtPnZiYXNlc19lbmQoKTsKLSAgICAgICBCICE9IEJFbmQ7ICsrQikgewotICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpCYXNlVHlwZSA9IEItPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkgeworICBmb3IgKGNvbnN0IGF1dG8gJkIgOiBDbGFzc0RlY2wtPnZiYXNlcygpKSB7CisgICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKkJhc2VUeXBlID0gQi5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKICAgICAgIENYWFJlY29yZERlY2wgKkJhc2VDbGFzc0RlY2wgPSBjYXN0PENYWFJlY29yZERlY2w+KEJhc2VUeXBlLT5nZXREZWNsKCkpOwogICAgICAgaWYgKEJhc2VDbGFzc0RlY2wgPT0gSW5oZXJpdGVkRGVjbCkKICAgICAgICAgY29udGludWU7CiAgICAgICBDWFhDb25zdHJ1Y3RvckRlY2wgKkNvbnN0cnVjdG9yID0gTG9va3VwRGVmYXVsdENvbnN0cnVjdG9yKEJhc2VDbGFzc0RlY2wpOwogICAgICAgaWYgKENvbnN0cnVjdG9yKQotICAgICAgICBFeGNlcHRTcGVjLkNhbGxlZERlY2woQi0+Z2V0TG9jU3RhcnQoKSwgQ29uc3RydWN0b3IpOworICAgICAgICBFeGNlcHRTcGVjLkNhbGxlZERlY2woQi5nZXRMb2NTdGFydCgpLCBDb25zdHJ1Y3Rvcik7CiAgICAgfQogICB9CiAKICAgLy8gRmllbGQgY29uc3RydWN0b3JzLgotICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEYgPSBDbGFzc0RlY2wtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVuZCA9IENsYXNzRGVjbC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgRiAhPSBGRW5kOyArK0YpIHsKKyAgZm9yIChjb25zdCBhdXRvICpGIDogQ2xhc3NEZWNsLT5maWVsZHMoKSkgewogICAgIGlmIChGLT5oYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSkgewogICAgICAgaWYgKEV4cHIgKkUgPSBGLT5nZXRJbkNsYXNzSW5pdGlhbGl6ZXIoKSkKICAgICAgICAgRXhjZXB0U3BlYy5DYWxsZWRFeHByKEUpOwpAQCAtODI1NiwxMCArODMzMiw4IEBACiAKICAgLy8vIFByb2Nlc3MgYWxsIGNvbnN0cnVjdG9ycyBmb3IgYSBjbGFzcy4KICAgdm9pZCB2aXNpdEFsbChjb25zdCBDWFhSZWNvcmREZWNsICpSRCwgVmlzaXRGbiBDYWxsYmFjaykgewotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6Y3Rvcl9pdGVyYXRvciBDdG9ySXQgPSBSRC0+Y3Rvcl9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdG9yRSA9IFJELT5jdG9yX2VuZCgpOwotICAgICAgICAgQ3Rvckl0ICE9IEN0b3JFOyArK0N0b3JJdCkKLSAgICAgICh0aGlzLT4qQ2FsbGJhY2spKCpDdG9ySXQpOworICAgIGZvciAoY29uc3QgYXV0byAqQ3RvciA6IFJELT5jdG9ycygpKQorICAgICAgKHRoaXMtPipDYWxsYmFjaykoQ3Rvcik7CiAgICAgZm9yIChDWFhSZWNvcmREZWNsOjpzcGVjaWZpY19kZWNsX2l0ZXJhdG9yPEZ1bmN0aW9uVGVtcGxhdGVEZWNsPgogICAgICAgICAgICAgIEkoUkQtPmRlY2xzX2JlZ2luKCkpLCBFKFJELT5kZWNsc19lbmQoKSk7CiAgICAgICAgICBJICE9IEU7ICsrSSkgewpAQCAtODI3OCw3ICs4MzUyLDcgQEAKICAgdm9pZCBpbmhlcml0KGNvbnN0IENYWENvbnN0cnVjdG9yRGVjbCAqQ3RvcikgewogICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpDdG9yVHlwZSA9CiAgICAgICAgIEN0b3ItPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwotICAgIEFycmF5UmVmPFF1YWxUeXBlPiBBcmdUeXBlcyhDdG9yVHlwZS0+Z2V0QXJnVHlwZXMoKSk7CisgICAgQXJyYXlSZWY8UXVhbFR5cGU+IEFyZ1R5cGVzKEN0b3JUeXBlLT5nZXRQYXJhbVR5cGVzKCkpOwogICAgIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gRVBJID0gQ3RvclR5cGUtPmdldEV4dFByb3RvSW5mbygpOwogCiAgICAgU291cmNlTG9jYXRpb24gVXNpbmdMb2MgPSBnZXRVc2luZ0xvYyhDdG9yLT5nZXRQYXJlbnQoKSk7CkBAIC04MzA2LDcgKzgzODAsNyBAQAogICAgICAgZG8KICAgICAgICAgZGVjbGFyZUN0b3IoVXNpbmdMb2MsIEN0b3IsCiAgICAgICAgICAgICAgICAgICAgIFNlbWFSZWYuQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBDdG9yLT5nZXRSZXN1bHRUeXBlKCksIEFyZ1R5cGVzLnNsaWNlKDAsIFBhcmFtcyksIEVQSSkpOworICAgICAgICAgICAgICAgICAgICAgICAgQ3Rvci0+Z2V0UmV0dXJuVHlwZSgpLCBBcmdUeXBlcy5zbGljZSgwLCBQYXJhbXMpLCBFUEkpKTsKICAgICAgIHdoaWxlIChQYXJhbXMgPiBNaW5QYXJhbXMgJiYKICAgICAgICAgICAgICBDdG9yLT5nZXRQYXJhbURlY2woLS1QYXJhbXMpLT5oYXNEZWZhdWx0QXJnKCkpOwogICAgIH0KQEAgLTg0MjAsMjEgKzg0OTQsMjEgQEAKICAgICBGdW5jdGlvblByb3RvVHlwZTo6RXh0UHJvdG9JbmZvIEVQSSA9IEZQVC0+Z2V0RXh0UHJvdG9JbmZvKCk7CiAgICAgRVBJLkV4Y2VwdGlvblNwZWNUeXBlID0gRVNUX1VuZXZhbHVhdGVkOwogICAgIEVQSS5FeGNlcHRpb25TcGVjRGVjbCA9IERlcml2ZWRDdG9yOwotICAgIERlcml2ZWRDdG9yLT5zZXRUeXBlKENvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKEZQVC0+Z2V0UmVzdWx0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQVC0+Z2V0QXJnVHlwZXMoKSwgRVBJKSk7CisgICAgRGVyaXZlZEN0b3ItPnNldFR5cGUoQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoRlBULT5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBULT5nZXRQYXJhbVR5cGVzKCksIEVQSSkpOwogCiAgICAgLy8gQnVpbGQgdGhlIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCiAgICAgU21hbGxWZWN0b3I8UGFybVZhckRlY2wgKiwgMTY+IFBhcmFtRGVjbHM7Ci0gICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IEZQVC0+Z2V0TnVtQXJncygpOyBJICE9IE47ICsrSSkgeworICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBGUFQtPmdldE51bVBhcmFtcygpOyBJICE9IE47ICsrSSkgewogICAgICAgVHlwZVNvdXJjZUluZm8gKlRJbmZvID0KLSAgICAgICAgICBDb250ZXh0LmdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhGUFQtPmdldEFyZ1R5cGUoSSksIFVzaW5nTG9jKTsKKyAgICAgICAgICBDb250ZXh0LmdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhGUFQtPmdldFBhcmFtVHlwZShJKSwgVXNpbmdMb2MpOwogICAgICAgUGFybVZhckRlY2wgKlBEID0gUGFybVZhckRlY2w6OkNyZWF0ZSgKICAgICAgICAgICBDb250ZXh0LCBEZXJpdmVkQ3RvciwgVXNpbmdMb2MsIFVzaW5nTG9jLCAvKklkZW50aWZpZXJJbmZvPSovMCwKLSAgICAgICAgICBGUFQtPmdldEFyZ1R5cGUoSSksIFRJbmZvLCBTQ19Ob25lLCAvKkRlZmF1bHRBcmc9Ki8wKTsKKyAgICAgICAgICBGUFQtPmdldFBhcmFtVHlwZShJKSwgVEluZm8sIFNDX05vbmUsIC8qRGVmYXVsdEFyZz0qLzApOwogICAgICAgUEQtPnNldFNjb3BlSW5mbygwLCBJKTsKICAgICAgIFBELT5zZXRJbXBsaWNpdCgpOwogICAgICAgUGFyYW1EZWNscy5wdXNoX2JhY2soUEQpOwotICAgICAgUHJvdG9Mb2Muc2V0QXJnKEksIFBEKTsKKyAgICAgIFByb3RvTG9jLnNldFBhcmFtKEksIFBEKTsKICAgICB9CiAKICAgICAvLyBTZXQgdXAgdGhlIG5ldyBjb25zdHJ1Y3Rvci4KQEAgLTg0NzUsMTEgKzg1NDksOSBAQAogCiAgIC8vIEZpbmQgYmFzZSBjbGFzc2VzIGZyb20gd2hpY2ggd2UgbWlnaHQgaW5oZXJpdCBjb25zdHJ1Y3RvcnMuCiAgIFNtYWxsVmVjdG9yPENYWFJlY29yZERlY2wqLCA0PiBJbmhlcml0ZWRCYXNlczsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yIEJhc2VJdCA9IENsYXNzRGVjbC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VFID0gQ2xhc3NEZWNsLT5iYXNlc19lbmQoKTsKLSAgICAgICBCYXNlSXQgIT0gQmFzZUU7ICsrQmFzZUl0KQotICAgIGlmIChCYXNlSXQtPmdldEluaGVyaXRDb25zdHJ1Y3RvcnMoKSkKLSAgICAgIEluaGVyaXRlZEJhc2VzLnB1c2hfYmFjayhCYXNlSXQtPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCkpOworICBmb3IgKGNvbnN0IGF1dG8gJkJhc2VJdCA6IENsYXNzRGVjbC0+YmFzZXMoKSkKKyAgICBpZiAoQmFzZUl0LmdldEluaGVyaXRDb25zdHJ1Y3RvcnMoKSkKKyAgICAgIEluaGVyaXRlZEJhc2VzLnB1c2hfYmFjayhCYXNlSXQuZ2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKSk7CiAKICAgLy8gR28gbm8gZnVydGhlciBpZiB3ZSdyZSBub3QgaW5oZXJpdGluZyBhbnkgY29uc3RydWN0b3JzLgogICBpZiAoSW5oZXJpdGVkQmFzZXMuZW1wdHkoKSkKQEAgLTg1MzIsMzAgKzg2MDQsMjQgQEAKICAgICByZXR1cm4gRXhjZXB0U3BlYzsKIAogICAvLyBEaXJlY3QgYmFzZS1jbGFzcyBkZXN0cnVjdG9ycy4KLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yIEIgPSBDbGFzc0RlY2wtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRW5kID0gQ2xhc3NEZWNsLT5iYXNlc19lbmQoKTsKLSAgICAgICBCICE9IEJFbmQ7ICsrQikgewotICAgIGlmIChCLT5pc1ZpcnR1YWwoKSkgLy8gSGFuZGxlZCBiZWxvdy4KKyAgZm9yIChjb25zdCBhdXRvICZCIDogQ2xhc3NEZWNsLT5iYXNlcygpKSB7CisgICAgaWYgKEIuaXNWaXJ0dWFsKCkpIC8vIEhhbmRsZWQgYmVsb3cuCiAgICAgICBjb250aW51ZTsKICAgICAKLSAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqQmFzZVR5cGUgPSBCLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCkpCi0gICAgICBFeGNlcHRTcGVjLkNhbGxlZERlY2woQi0+Z2V0TG9jU3RhcnQoKSwKKyAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqQmFzZVR5cGUgPSBCLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkKKyAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCLmdldExvY1N0YXJ0KCksCiAgICAgICAgICAgICAgICAgICAgTG9va3VwRGVzdHJ1Y3RvcihjYXN0PENYWFJlY29yZERlY2w+KEJhc2VUeXBlLT5nZXREZWNsKCkpKSk7CiAgIH0KIAogICAvLyBWaXJ0dWFsIGJhc2UtY2xhc3MgZGVzdHJ1Y3RvcnMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBCID0gQ2xhc3NEZWNsLT52YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFbmQgPSBDbGFzc0RlY2wtPnZiYXNlc19lbmQoKTsKLSAgICAgICBCICE9IEJFbmQ7ICsrQikgewotICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpCYXNlVHlwZSA9IEItPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkKLSAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCLT5nZXRMb2NTdGFydCgpLAorICBmb3IgKGNvbnN0IGF1dG8gJkIgOiBDbGFzc0RlY2wtPnZiYXNlcygpKSB7CisgICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKkJhc2VUeXBlID0gQi5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCkpCisgICAgICBFeGNlcHRTcGVjLkNhbGxlZERlY2woQi5nZXRMb2NTdGFydCgpLAogICAgICAgICAgICAgICAgICAgTG9va3VwRGVzdHJ1Y3RvcihjYXN0PENYWFJlY29yZERlY2w+KEJhc2VUeXBlLT5nZXREZWNsKCkpKSk7CiAgIH0KIAogICAvLyBGaWVsZCBkZXN0cnVjdG9ycy4KLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGID0gQ2xhc3NEZWNsLT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZFbmQgPSBDbGFzc0RlY2wtPmZpZWxkX2VuZCgpOwotICAgICAgIEYgIT0gRkVuZDsgKytGKSB7CisgIGZvciAoY29uc3QgYXV0byAqRiA6IENsYXNzRGVjbC0+ZmllbGRzKCkpIHsKICAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUmVjb3JkVHkKICAgICAgICAgPSBDb250ZXh0LmdldEJhc2VFbGVtZW50VHlwZShGLT5nZXRUeXBlKCkpLT5nZXRBczxSZWNvcmRUeXBlPigpKQogICAgICAgRXhjZXB0U3BlYy5DYWxsZWREZWNsKEYtPmdldExvY2F0aW9uKCksCkBAIC04NzE5LDcgKzg3ODUsNyBAQAogICBRdWFsVHlwZSBWYXJUeXBlOwogCiBwdWJsaWM6Ci0gIHZpcnR1YWwgRXhwciAqYnVpbGQoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jKSBjb25zdCBMTFZNX09WRVJSSURFIHsKKyAgdmlydHVhbCBFeHByICpidWlsZChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gYXNzZXJ0Tm90TnVsbChTLkJ1aWxkRGVjbFJlZkV4cHIoVmFyLCBWYXJUeXBlLCBWS19MVmFsdWUsIExvYykudGFrZSgpKTsKICAgfQogCkBAIC04NzI5LDcgKzg3OTUsNyBAQAogCiBjbGFzcyBUaGlzQnVpbGRlcjogcHVibGljIEV4cHJCdWlsZGVyIHsKIHB1YmxpYzoKLSAgdmlydHVhbCBFeHByICpidWlsZChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IExMVk1fT1ZFUlJJREUgeworICB2aXJ0dWFsIEV4cHIgKmJ1aWxkKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBhc3NlcnROb3ROdWxsKFMuQWN0T25DWFhUaGlzKExvYykudGFrZUFzPEV4cHI+KCkpOwogICB9CiB9OwpAQCAtODc0MSw3ICs4ODA3LDcgQEAKICAgY29uc3QgQ1hYQ2FzdFBhdGggJlBhdGg7CiAKIHB1YmxpYzoKLSAgdmlydHVhbCBFeHByICpidWlsZChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IExMVk1fT1ZFUlJJREUgeworICB2aXJ0dWFsIEV4cHIgKmJ1aWxkKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBhc3NlcnROb3ROdWxsKFMuSW1wQ2FzdEV4cHJUb1R5cGUoQnVpbGRlci5idWlsZChTLCBMb2MpLCBUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0tfVW5jaGVja2VkRGVyaXZlZFRvQmFzZSwgS2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQYXRoKS50YWtlKCkpOwpAQCAtODc1Niw3ICs4ODIyLDcgQEAKICAgY29uc3QgRXhwckJ1aWxkZXIgJkJ1aWxkZXI7CiAKIHB1YmxpYzoKLSAgdmlydHVhbCBFeHByICpidWlsZChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IExMVk1fT1ZFUlJJREUgeworICB2aXJ0dWFsIEV4cHIgKmJ1aWxkKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBhc3NlcnROb3ROdWxsKAogICAgICAgICBTLkNyZWF0ZUJ1aWx0aW5VbmFyeU9wKExvYywgVU9fRGVyZWYsIEJ1aWxkZXIuYnVpbGQoUywgTG9jKSkudGFrZSgpKTsKICAgfQpAQCAtODc3Miw3ICs4ODM4LDcgQEAKICAgTG9va3VwUmVzdWx0ICZNZW1iZXJMb29rdXA7CiAKIHB1YmxpYzoKLSAgdmlydHVhbCBFeHByICpidWlsZChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IExMVk1fT1ZFUlJJREUgeworICB2aXJ0dWFsIEV4cHIgKmJ1aWxkKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBhc3NlcnROb3ROdWxsKFMuQnVpbGRNZW1iZXJSZWZlcmVuY2VFeHByKAogICAgICAgICBCdWlsZGVyLmJ1aWxkKFMsIExvYyksIFR5cGUsIExvYywgSXNBcnJvdywgU1MsIFNvdXJjZUxvY2F0aW9uKCksIDAsCiAgICAgICAgIE1lbWJlckxvb2t1cCwgMCkudGFrZSgpKTsKQEAgLTg3ODgsNyArODg1NCw3IEBACiAgIGNvbnN0IEV4cHJCdWlsZGVyICZCdWlsZGVyOwogCiBwdWJsaWM6Ci0gIHZpcnR1YWwgRXhwciAqYnVpbGQoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jKSBjb25zdCBMTFZNX09WRVJSSURFIHsKKyAgdmlydHVhbCBFeHByICpidWlsZChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gYXNzZXJ0Tm90TnVsbChDYXN0Rm9yTW92aW5nKFMsIEJ1aWxkZXIuYnVpbGQoUywgTG9jKSkpOwogICB9CiAKQEAgLTg3OTksNyArODg2NSw3IEBACiAgIGNvbnN0IEV4cHJCdWlsZGVyICZCdWlsZGVyOwogCiBwdWJsaWM6Ci0gIHZpcnR1YWwgRXhwciAqYnVpbGQoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jKSBjb25zdCBMTFZNX09WRVJSSURFIHsKKyAgdmlydHVhbCBFeHByICpidWlsZChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gYXNzZXJ0Tm90TnVsbCgKICAgICAgICAgUy5EZWZhdWx0THZhbHVlQ29udmVyc2lvbihCdWlsZGVyLmJ1aWxkKFMsIExvYykpLnRha2UoKSk7CiAgIH0KQEAgLTg4MTIsOCArODg3OCw3IEBACiAgIGNvbnN0IEV4cHJCdWlsZGVyICZJbmRleDsKIAogcHVibGljOgotICB2aXJ0dWFsIEV4cHIgKmJ1aWxkKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3QKLSAgICAgIExMVk1fT1ZFUlJJREUgeworICB2aXJ0dWFsIEV4cHIgKmJ1aWxkKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYykgY29uc3Qgb3ZlcnJpZGUgewogICAgIHJldHVybiBhc3NlcnROb3ROdWxsKFMuQ3JlYXRlQnVpbHRpbkFycmF5U3Vic2NyaXB0RXhwcigKICAgICAgICAgQmFzZS5idWlsZChTLCBMb2MpLCBMb2MsIEluZGV4LmJ1aWxkKFMsIExvYyksIExvYykudGFrZSgpKTsKICAgfQpAQCAtOTEyNyw4ICs5MTkyLDkgQEAKICAgICByZXR1cm4gRXhjZXB0U3BlYzsKIAogICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqVCA9IE1ELT5nZXRUeXBlKCktPmNhc3RBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKLSAgYXNzZXJ0KFQtPmdldE51bUFyZ3MoKSA9PSAxICYmICJub3QgYSBjb3B5IGFzc2lnbm1lbnQgb3AiKTsKLSAgdW5zaWduZWQgQXJnUXVhbHMgPSBULT5nZXRBcmdUeXBlKDApLmdldE5vblJlZmVyZW5jZVR5cGUoKS5nZXRDVlJRdWFsaWZpZXJzKCk7CisgIGFzc2VydChULT5nZXROdW1QYXJhbXMoKSA9PSAxICYmICJub3QgYSBjb3B5IGFzc2lnbm1lbnQgb3AiKTsKKyAgdW5zaWduZWQgQXJnUXVhbHMgPQorICAgICAgVC0+Z2V0UGFyYW1UeXBlKDApLmdldE5vblJlZmVyZW5jZVR5cGUoKS5nZXRDVlJRdWFsaWZpZXJzKCk7CiAKICAgLy8gQysrIFtleGNlcHQuc3BlY11wMTQ6CiAgIC8vICAgQW4gaW1wbGljaXRseSBkZWNsYXJlZCBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbiAoQ2xhdXNlIDEyKSBzaGFsbCBoYXZlIGFuCkBAIC05MTQwLDMzICs5MjA2LDI2IEBACiAgIC8vIEJhc2VkIG9uIGEgc2ltaWxhciBkZWNpc2lvbiBtYWRlIGZvciBjb25zdG5lc3MgaW4gQysrMHgsIHdlJ3JlIGVycmluZyBvbgogICAvLyB0aGUgc2lkZSBvZiBhc3N1bWluZyBzdWNoIGNhbGxzIHRvIGJlIG1hZGUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkKICAgLy8gYWN0dWFsbHkgaGFwcGVuLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQmFzZSA9IENsYXNzRGVjbC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VFbmQgPSBDbGFzc0RlY2wtPmJhc2VzX2VuZCgpOwotICAgICAgIEJhc2UgIT0gQmFzZUVuZDsgKytCYXNlKSB7Ci0gICAgaWYgKEJhc2UtPmlzVmlydHVhbCgpKQorICBmb3IgKGNvbnN0IGF1dG8gJkJhc2UgOiBDbGFzc0RlY2wtPmJhc2VzKCkpIHsKKyAgICBpZiAoQmFzZS5pc1ZpcnR1YWwoKSkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgQ1hYUmVjb3JkRGVjbCAqQmFzZUNsYXNzRGVjbAotICAgICAgPSBjYXN0PENYWFJlY29yZERlY2w+KEJhc2UtPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKKyAgICAgID0gY2FzdDxDWFhSZWNvcmREZWNsPihCYXNlLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKICAgICBpZiAoQ1hYTWV0aG9kRGVjbCAqQ29weUFzc2lnbiA9IExvb2t1cENvcHlpbmdBc3NpZ25tZW50KEJhc2VDbGFzc0RlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdRdWFscywgZmFsc2UsIDApKQotICAgICAgRXhjZXB0U3BlYy5DYWxsZWREZWNsKEJhc2UtPmdldExvY1N0YXJ0KCksIENvcHlBc3NpZ24pOworICAgICAgRXhjZXB0U3BlYy5DYWxsZWREZWNsKEJhc2UuZ2V0TG9jU3RhcnQoKSwgQ29weUFzc2lnbik7CiAgIH0KIAotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQmFzZSA9IENsYXNzRGVjbC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlRW5kID0gQ2xhc3NEZWNsLT52YmFzZXNfZW5kKCk7Ci0gICAgICAgQmFzZSAhPSBCYXNlRW5kOyArK0Jhc2UpIHsKKyAgZm9yIChjb25zdCBhdXRvICZCYXNlIDogQ2xhc3NEZWNsLT52YmFzZXMoKSkgewogICAgIENYWFJlY29yZERlY2wgKkJhc2VDbGFzc0RlY2wKLSAgICAgID0gY2FzdDxDWFhSZWNvcmREZWNsPihCYXNlLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oQmFzZS5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CiAgICAgaWYgKENYWE1ldGhvZERlY2wgKkNvcHlBc3NpZ24gPSBMb29rdXBDb3B5aW5nQXNzaWdubWVudChCYXNlQ2xhc3NEZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnUXVhbHMsIGZhbHNlLCAwKSkKLSAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCYXNlLT5nZXRMb2NTdGFydCgpLCBDb3B5QXNzaWduKTsKKyAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCYXNlLmdldExvY1N0YXJ0KCksIENvcHlBc3NpZ24pOwogICB9CiAKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGaWVsZCA9IENsYXNzRGVjbC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEVuZCA9IENsYXNzRGVjbC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgRmllbGQgIT0gRmllbGRFbmQ7Ci0gICAgICAgKytGaWVsZCkgeworICBmb3IgKGNvbnN0IGF1dG8gKkZpZWxkIDogQ2xhc3NEZWNsLT5maWVsZHMoKSkgewogICAgIFF1YWxUeXBlIEZpZWxkVHlwZSA9IENvbnRleHQuZ2V0QmFzZUVsZW1lbnRUeXBlKEZpZWxkLT5nZXRUeXBlKCkpOwogICAgIGlmIChDWFhSZWNvcmREZWNsICpGaWVsZENsYXNzRGVjbCA9IEZpZWxkVHlwZS0+Z2V0QXNDWFhSZWNvcmREZWNsKCkpIHsKICAgICAgIGlmIChDWFhNZXRob2REZWNsICpDb3B5QXNzaWduID0KQEAgLTkyNjMsMjQgKzkzMjIsMjIgQEAKICAgICBVc2VyRGVjbGFyZWRPcGVyYXRpb24gPSBSRC0+Z2V0RGVzdHJ1Y3RvcigpOwogICB9IGVsc2UgaWYgKCFpc2E8Q1hYQ29uc3RydWN0b3JEZWNsPihDb3B5T3ApICYmCiAgICAgICAgICAgICAgUkQtPmhhc1VzZXJEZWNsYXJlZENvcHlDb25zdHJ1Y3RvcigpICYmCi0gICAgICAgICAgICAgIVMuZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRNb2RlKSB7CisgICAgICAgICAgICAgIVMuZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0KSB7CiAgICAgLy8gRmluZCBhbnkgdXNlci1kZWNsYXJlZCBjb3B5IGNvbnN0cnVjdG9yLgotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6Y3Rvcl9pdGVyYXRvciBJID0gUkQtPmN0b3JfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IFJELT5jdG9yX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGZvciAoYXV0byAqSSA6IFJELT5jdG9ycygpKSB7CiAgICAgICBpZiAoSS0+aXNDb3B5Q29uc3RydWN0b3IoKSkgewotICAgICAgICBVc2VyRGVjbGFyZWRPcGVyYXRpb24gPSAqSTsKKyAgICAgICAgVXNlckRlY2xhcmVkT3BlcmF0aW9uID0gSTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICAgIGFzc2VydChVc2VyRGVjbGFyZWRPcGVyYXRpb24pOwogICB9IGVsc2UgaWYgKGlzYTxDWFhDb25zdHJ1Y3RvckRlY2w+KENvcHlPcCkgJiYKICAgICAgICAgICAgICBSRC0+aGFzVXNlckRlY2xhcmVkQ29weUFzc2lnbm1lbnQoKSAmJgotICAgICAgICAgICAgICFTLmdldExhbmdPcHRzKCkuTWljcm9zb2Z0TW9kZSkgeworICAgICAgICAgICAgICFTLmdldExhbmdPcHRzKCkuTVNWQ0NvbXBhdCkgewogICAgIC8vIEZpbmQgYW55IHVzZXItZGVjbGFyZWQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6bWV0aG9kX2l0ZXJhdG9yIEkgPSBSRC0+bWV0aG9kX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IFJELT5tZXRob2RfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgZm9yIChhdXRvICpJIDogUkQtPm1ldGhvZHMoKSkgewogICAgICAgaWYgKEktPmlzQ29weUFzc2lnbm1lbnRPcGVyYXRvcigpKSB7Ci0gICAgICAgIFVzZXJEZWNsYXJlZE9wZXJhdGlvbiA9ICpJOworICAgICAgICBVc2VyRGVjbGFyZWRPcGVyYXRpb24gPSBJOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CkBAIC05MzU5LDE4ICs5NDE2LDE3IEBACiAgIAogICAvLyBBc3NpZ24gYmFzZSBjbGFzc2VzLgogICBib29sIEludmFsaWQgPSBmYWxzZTsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yIEJhc2UgPSBDbGFzc0RlY2wtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgRSA9IENsYXNzRGVjbC0+YmFzZXNfZW5kKCk7IEJhc2UgIT0gRTsgKytCYXNlKSB7CisgIGZvciAoYXV0byAmQmFzZSA6IENsYXNzRGVjbC0+YmFzZXMoKSkgewogICAgIC8vIEZvcm0gdGhlIGFzc2lnbm1lbnQ6CiAgICAgLy8gICBzdGF0aWNfY2FzdDxCYXNlKj4odGhpcyktPkJhc2U6Om9wZXJhdG9yPShzdGF0aWNfY2FzdDxCYXNlJj4ob3RoZXIpKTsKLSAgICBRdWFsVHlwZSBCYXNlVHlwZSA9IEJhc2UtPmdldFR5cGUoKS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKKyAgICBRdWFsVHlwZSBCYXNlVHlwZSA9IEJhc2UuZ2V0VHlwZSgpLmdldFVucXVhbGlmaWVkVHlwZSgpOwogICAgIGlmICghQmFzZVR5cGUtPmlzUmVjb3JkVHlwZSgpKSB7CiAgICAgICBJbnZhbGlkID0gdHJ1ZTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIAogICAgIENYWENhc3RQYXRoIEJhc2VQYXRoOwotICAgIEJhc2VQYXRoLnB1c2hfYmFjayhCYXNlKTsKKyAgICBCYXNlUGF0aC5wdXNoX2JhY2soJkJhc2UpOwogCiAgICAgLy8gQ29uc3RydWN0IHRoZSAiZnJvbSIgZXhwcmVzc2lvbiwgd2hpY2ggaXMgYW4gaW1wbGljaXQgY2FzdCB0byB0aGUKICAgICAvLyBhcHByb3ByaWF0ZWx5LXF1YWxpZmllZCBiYXNlIHR5cGUuCkBAIC05NDAxLDkgKzk0NTcsNyBAQAogICB9CiAgIAogICAvLyBBc3NpZ24gbm9uLXN0YXRpYyBtZW1iZXJzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEZpZWxkID0gQ2xhc3NEZWNsLT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRW5kID0gQ2xhc3NEZWNsLT5maWVsZF9lbmQoKTsgCi0gICAgICAgRmllbGQgIT0gRmllbGRFbmQ7ICsrRmllbGQpIHsKKyAgZm9yIChhdXRvICpGaWVsZCA6IENsYXNzRGVjbC0+ZmllbGRzKCkpIHsKICAgICBpZiAoRmllbGQtPmlzVW5uYW1lZEJpdGZpZWxkKCkpCiAgICAgICBjb250aW51ZTsKIApAQCAtOTQ1MCw3ICs5NTA0LDcgQEAKICAgICBDWFhTY29wZVNwZWMgU1M7IC8vIEludGVudGlvbmFsbHkgZW1wdHkKICAgICBMb29rdXBSZXN1bHQgTWVtYmVyTG9va3VwKCp0aGlzLCBGaWVsZC0+Z2V0RGVjbE5hbWUoKSwgTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9va3VwTWVtYmVyTmFtZSk7Ci0gICAgTWVtYmVyTG9va3VwLmFkZERlY2woKkZpZWxkKTsKKyAgICBNZW1iZXJMb29rdXAuYWRkRGVjbChGaWVsZCk7CiAgICAgTWVtYmVyTG9va3VwLnJlc29sdmVLaW5kKCk7CiAKICAgICBNZW1iZXJCdWlsZGVyIEZyb20oT3RoZXJSZWYsIE90aGVyUmVmVHlwZSwgLypJc0Fycm93PSovZmFsc2UsIE1lbWJlckxvb2t1cCk7CkBAIC05NTMwLDMzICs5NTg0LDI2IEBACiAgIC8vIGFjdHVhbGx5IGhhcHBlbi4KICAgLy8gTm90ZSB0aGF0IGEgbW92ZSBjb25zdHJ1Y3RvciBpcyBub3QgaW1wbGljaXRseSBkZWNsYXJlZCB3aGVuIHRoZXJlIGFyZQogICAvLyB2aXJ0dWFsIGJhc2VzLCBidXQgaXQgY2FuIHN0aWxsIGJlIHVzZXItZGVjbGFyZWQgYW5kIGV4cGxpY2l0bHkgZGVmYXVsdGVkLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQmFzZSA9IENsYXNzRGVjbC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VFbmQgPSBDbGFzc0RlY2wtPmJhc2VzX2VuZCgpOwotICAgICAgIEJhc2UgIT0gQmFzZUVuZDsgKytCYXNlKSB7Ci0gICAgaWYgKEJhc2UtPmlzVmlydHVhbCgpKQorICBmb3IgKGNvbnN0IGF1dG8gJkJhc2UgOiBDbGFzc0RlY2wtPmJhc2VzKCkpIHsKKyAgICBpZiAoQmFzZS5pc1ZpcnR1YWwoKSkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgQ1hYUmVjb3JkRGVjbCAqQmFzZUNsYXNzRGVjbAotICAgICAgPSBjYXN0PENYWFJlY29yZERlY2w+KEJhc2UtPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKKyAgICAgID0gY2FzdDxDWFhSZWNvcmREZWNsPihCYXNlLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKS0+Z2V0RGVjbCgpKTsKICAgICBpZiAoQ1hYTWV0aG9kRGVjbCAqTW92ZUFzc2lnbiA9IExvb2t1cE1vdmluZ0Fzc2lnbm1lbnQoQmFzZUNsYXNzRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZmFsc2UsIDApKQotICAgICAgRXhjZXB0U3BlYy5DYWxsZWREZWNsKEJhc2UtPmdldExvY1N0YXJ0KCksIE1vdmVBc3NpZ24pOworICAgICAgRXhjZXB0U3BlYy5DYWxsZWREZWNsKEJhc2UuZ2V0TG9jU3RhcnQoKSwgTW92ZUFzc2lnbik7CiAgIH0KIAotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQmFzZSA9IENsYXNzRGVjbC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlRW5kID0gQ2xhc3NEZWNsLT52YmFzZXNfZW5kKCk7Ci0gICAgICAgQmFzZSAhPSBCYXNlRW5kOyArK0Jhc2UpIHsKKyAgZm9yIChjb25zdCBhdXRvICZCYXNlIDogQ2xhc3NEZWNsLT52YmFzZXMoKSkgewogICAgIENYWFJlY29yZERlY2wgKkJhc2VDbGFzc0RlY2wKLSAgICAgID0gY2FzdDxDWFhSZWNvcmREZWNsPihCYXNlLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oQmFzZS5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CiAgICAgaWYgKENYWE1ldGhvZERlY2wgKk1vdmVBc3NpZ24gPSBMb29rdXBNb3ZpbmdBc3NpZ25tZW50KEJhc2VDbGFzc0RlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGZhbHNlLCAwKSkKLSAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCYXNlLT5nZXRMb2NTdGFydCgpLCBNb3ZlQXNzaWduKTsKKyAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCYXNlLmdldExvY1N0YXJ0KCksIE1vdmVBc3NpZ24pOwogICB9CiAKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGaWVsZCA9IENsYXNzRGVjbC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEVuZCA9IENsYXNzRGVjbC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgRmllbGQgIT0gRmllbGRFbmQ7Ci0gICAgICAgKytGaWVsZCkgeworICBmb3IgKGNvbnN0IGF1dG8gKkZpZWxkIDogQ2xhc3NEZWNsLT5maWVsZHMoKSkgewogICAgIFF1YWxUeXBlIEZpZWxkVHlwZSA9IENvbnRleHQuZ2V0QmFzZUVsZW1lbnRUeXBlKEZpZWxkLT5nZXRUeXBlKCkpOwogICAgIGlmIChDWFhSZWNvcmREZWNsICpGaWVsZENsYXNzRGVjbCA9IEZpZWxkVHlwZS0+Z2V0QXNDWFhSZWNvcmREZWNsKCkpIHsKICAgICAgIGlmIChDWFhNZXRob2REZWNsICpNb3ZlQXNzaWduID0KQEAgLTk2NTQsMTAgKzk3MDEsOCBAQAogICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPENYWFJlY29yZERlY2wqLCBDWFhCYXNlU3BlY2lmaWVyKj4gVkJhc2VNYXA7CiAgIFZCYXNlTWFwIFZCYXNlczsKIAotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQkkgPSBDbGFzcy0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFID0gQ2xhc3MtPmJhc2VzX2VuZCgpOwotICAgICAgIEJJICE9IEJFOyArK0JJKSB7Ci0gICAgV29ya2xpc3QucHVzaF9iYWNrKCYqQkkpOworICBmb3IgKGF1dG8gJkJJIDogQ2xhc3MtPmJhc2VzKCkpIHsKKyAgICBXb3JrbGlzdC5wdXNoX2JhY2soJkJJKTsKICAgICB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpIHsKICAgICAgIENYWEJhc2VTcGVjaWZpZXIgKkJhc2VTcGVjID0gV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CiAgICAgICBDWFhSZWNvcmREZWNsICpCYXNlID0gQmFzZVNwZWMtPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCk7CkBAIC05Njg5LDE5ICs5NzM0LDE5IEBACiAgICAgICAgIC8vIG9ubHkgaGFwcGVucyBpbiBvbmUgYmFzZSwgd2UnbGwgZGlhZ25vc2UgaXQgd2hlbiBzeW50aGVzaXppbmcKICAgICAgICAgLy8gdGhhdCBiYXNlIGNsYXNzJ3MgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLikKICAgICAgICAgQ1hYQmFzZVNwZWNpZmllciAqJkV4aXN0aW5nID0KLSAgICAgICAgICAgIFZCYXNlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoQmFzZS0+Z2V0Q2Fub25pY2FsRGVjbCgpLCBCSSkpCisgICAgICAgICAgICBWQmFzZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEJhc2UtPmdldENhbm9uaWNhbERlY2woKSwgJkJJKSkKICAgICAgICAgICAgICAgICAuZmlyc3QtPnNlY29uZDsKLSAgICAgICAgaWYgKEV4aXN0aW5nICYmIEV4aXN0aW5nICE9IEJJKSB7CisgICAgICAgIGlmIChFeGlzdGluZyAmJiBFeGlzdGluZyAhPSAmQkkpIHsKICAgICAgICAgICBTLkRpYWcoQ3VycmVudExvY2F0aW9uLCBkaWFnOjp3YXJuX3ZiYXNlX21vdmVkX211bHRpcGxlX3RpbWVzKQogICAgICAgICAgICAgPDwgQ2xhc3MgPDwgQmFzZTsKICAgICAgICAgICBTLkRpYWcoRXhpc3RpbmctPmdldExvY1N0YXJ0KCksIGRpYWc6Om5vdGVfdmJhc2VfbW92ZWRfaGVyZSkKICAgICAgICAgICAgIDw8IChCYXNlLT5nZXRDYW5vbmljYWxEZWNsKCkgPT0KICAgICAgICAgICAgICAgICBFeGlzdGluZy0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKS0+Z2V0Q2Fub25pY2FsRGVjbCgpKQogICAgICAgICAgICAgPDwgQmFzZSA8PCBFeGlzdGluZy0+Z2V0VHlwZSgpIDw8IEV4aXN0aW5nLT5nZXRTb3VyY2VSYW5nZSgpOwotICAgICAgICAgIFMuRGlhZyhCSS0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6bm90ZV92YmFzZV9tb3ZlZF9oZXJlKQorICAgICAgICAgIFMuRGlhZyhCSS5nZXRMb2NTdGFydCgpLCBkaWFnOjpub3RlX3ZiYXNlX21vdmVkX2hlcmUpCiAgICAgICAgICAgICA8PCAoQmFzZS0+Z2V0Q2Fub25pY2FsRGVjbCgpID09Ci0gICAgICAgICAgICAgICAgQkktPmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCktPmdldENhbm9uaWNhbERlY2woKSkKLSAgICAgICAgICAgIDw8IEJhc2UgPDwgQkktPmdldFR5cGUoKSA8PCBCYXNlU3BlYy0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgICAgICAgICAgICBCSS5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpLT5nZXRDYW5vbmljYWxEZWNsKCkpCisgICAgICAgICAgICA8PCBCYXNlIDw8IEJJLmdldFR5cGUoKSA8PCBCYXNlU3BlYy0+Z2V0U291cmNlUmFuZ2UoKTsKIAogICAgICAgICAgIC8vIE9ubHkgZGlhZ25vc2UgZWFjaCB2YmFzZSBvbmNlLgogICAgICAgICAgIEV4aXN0aW5nID0gMDsKQEAgLTk3MTQsMTAgKzk3NTksOCBAQAogICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIG1vdmUgdGhlIGJhc2UgY2xhc3NlcyBvZiBCYXNlLiBBZGQgdGhlbSB0byB0aGUgbGlzdC4KLSAgICAgICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2l0ZXJhdG9yIEJJID0gQmFzZS0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFID0gQmFzZS0+YmFzZXNfZW5kKCk7Ci0gICAgICAgICAgICAgQkkgIT0gQkU7ICsrQkkpCi0gICAgICAgICAgV29ya2xpc3QucHVzaF9iYWNrKCYqQkkpOworICAgICAgICBmb3IgKGF1dG8gJkJJIDogQmFzZS0+YmFzZXMoKSkKKyAgICAgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soJkJJKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTk3NzksOCArOTgyMiw3IEBACiAKICAgLy8gQXNzaWduIGJhc2UgY2xhc3Nlcy4KICAgYm9vbCBJbnZhbGlkID0gZmFsc2U7Ci0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBCYXNlID0gQ2xhc3NEZWNsLT5iYXNlc19iZWdpbigpLAotICAgICAgIEUgPSBDbGFzc0RlY2wtPmJhc2VzX2VuZCgpOyBCYXNlICE9IEU7ICsrQmFzZSkgeworICBmb3IgKGF1dG8gJkJhc2UgOiBDbGFzc0RlY2wtPmJhc2VzKCkpIHsKICAgICAvLyBDKysxMSBbY2xhc3MuY29weV1wMjg6CiAgICAgLy8gICBJdCBpcyB1bnNwZWNpZmllZCB3aGV0aGVyIHN1Ym9iamVjdHMgcmVwcmVzZW50aW5nIHZpcnR1YWwgYmFzZSBjbGFzc2VzCiAgICAgLy8gICBhcmUgYXNzaWduZWQgbW9yZSB0aGFuIG9uY2UgYnkgdGhlIGltcGxpY2l0bHktZGVmaW5lZCBjb3B5IGFzc2lnbm1lbnQKQEAgLTk3OTEsMTQgKzk4MzMsMTQgQEAKIAogICAgIC8vIEZvcm0gdGhlIGFzc2lnbm1lbnQ6CiAgICAgLy8gICBzdGF0aWNfY2FzdDxCYXNlKj4odGhpcyktPkJhc2U6Om9wZXJhdG9yPShzdGF0aWNfY2FzdDxCYXNlJiY+KG90aGVyKSk7Ci0gICAgUXVhbFR5cGUgQmFzZVR5cGUgPSBCYXNlLT5nZXRUeXBlKCkuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CisgICAgUXVhbFR5cGUgQmFzZVR5cGUgPSBCYXNlLmdldFR5cGUoKS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKICAgICBpZiAoIUJhc2VUeXBlLT5pc1JlY29yZFR5cGUoKSkgewogICAgICAgSW52YWxpZCA9IHRydWU7CiAgICAgICBjb250aW51ZTsKICAgICB9CiAKICAgICBDWFhDYXN0UGF0aCBCYXNlUGF0aDsKLSAgICBCYXNlUGF0aC5wdXNoX2JhY2soQmFzZSk7CisgICAgQmFzZVBhdGgucHVzaF9iYWNrKCZCYXNlKTsKIAogICAgIC8vIENvbnN0cnVjdCB0aGUgImZyb20iIGV4cHJlc3Npb24sIHdoaWNoIGlzIGFuIGltcGxpY2l0IGNhc3QgdG8gdGhlCiAgICAgLy8gYXBwcm9wcmlhdGVseS1xdWFsaWZpZWQgYmFzZSB0eXBlLgpAQCAtOTgzMCw5ICs5ODcyLDcgQEAKICAgfQogCiAgIC8vIEFzc2lnbiBub24tc3RhdGljIG1lbWJlcnMuCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRmllbGQgPSBDbGFzc0RlY2wtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRFbmQgPSBDbGFzc0RlY2wtPmZpZWxkX2VuZCgpOyAKLSAgICAgICBGaWVsZCAhPSBGaWVsZEVuZDsgKytGaWVsZCkgeworICBmb3IgKGF1dG8gKkZpZWxkIDogQ2xhc3NEZWNsLT5maWVsZHMoKSkgewogICAgIGlmIChGaWVsZC0+aXNVbm5hbWVkQml0ZmllbGQoKSkKICAgICAgIGNvbnRpbnVlOwogCkBAIC05ODc4LDcgKzk5MTgsNyBAQAogICAgIC8vIEJ1aWxkIHJlZmVyZW5jZXMgdG8gdGhlIGZpZWxkIGluIHRoZSBvYmplY3Qgd2UncmUgY29weWluZyBmcm9tIGFuZCB0by4KICAgICBMb29rdXBSZXN1bHQgTWVtYmVyTG9va3VwKCp0aGlzLCBGaWVsZC0+Z2V0RGVjbE5hbWUoKSwgTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9va3VwTWVtYmVyTmFtZSk7Ci0gICAgTWVtYmVyTG9va3VwLmFkZERlY2woKkZpZWxkKTsKKyAgICBNZW1iZXJMb29rdXAuYWRkRGVjbChGaWVsZCk7CiAgICAgTWVtYmVyTG9va3VwLnJlc29sdmVLaW5kKCk7CiAgICAgTWVtYmVyQnVpbGRlciBGcm9tKE1vdmVPdGhlciwgT3RoZXJSZWZUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAvKklzQXJyb3c9Ki9mYWxzZSwgTWVtYmVyTG9va3VwKTsKQEAgLTk5NTEsNDAgKzk5OTEsMzEgQEAKICAgICByZXR1cm4gRXhjZXB0U3BlYzsKIAogICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqVCA9IE1ELT5nZXRUeXBlKCktPmNhc3RBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKLSAgYXNzZXJ0KFQtPmdldE51bUFyZ3MoKSA+PSAxICYmICJub3QgYSBjb3B5IGN0b3IiKTsKLSAgdW5zaWduZWQgUXVhbHMgPSBULT5nZXRBcmdUeXBlKDApLmdldE5vblJlZmVyZW5jZVR5cGUoKS5nZXRDVlJRdWFsaWZpZXJzKCk7CisgIGFzc2VydChULT5nZXROdW1QYXJhbXMoKSA+PSAxICYmICJub3QgYSBjb3B5IGN0b3IiKTsKKyAgdW5zaWduZWQgUXVhbHMgPSBULT5nZXRQYXJhbVR5cGUoMCkuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpLmdldENWUlF1YWxpZmllcnMoKTsKIAogICAvLyBDKysgW2V4Y2VwdC5zcGVjXXAxNDoKICAgLy8gICBBbiBpbXBsaWNpdGx5IGRlY2xhcmVkIHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9uIChDbGF1c2UgMTIpIHNoYWxsIGhhdmUgYW4gCiAgIC8vICAgZXhjZXB0aW9uLXNwZWNpZmljYXRpb24uIFsuLi5dCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBCYXNlID0gQ2xhc3NEZWNsLT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUVuZCA9IENsYXNzRGVjbC0+YmFzZXNfZW5kKCk7Ci0gICAgICAgQmFzZSAhPSBCYXNlRW5kOyAKLSAgICAgICArK0Jhc2UpIHsKKyAgZm9yIChjb25zdCBhdXRvICZCYXNlIDogQ2xhc3NEZWNsLT5iYXNlcygpKSB7CiAgICAgLy8gVmlydHVhbCBiYXNlcyBhcmUgaGFuZGxlZCBiZWxvdy4KLSAgICBpZiAoQmFzZS0+aXNWaXJ0dWFsKCkpCisgICAgaWYgKEJhc2UuaXNWaXJ0dWFsKCkpCiAgICAgICBjb250aW51ZTsKICAgICAKICAgICBDWFhSZWNvcmREZWNsICpCYXNlQ2xhc3NEZWNsCi0gICAgICA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oQmFzZS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgPSBjYXN0PENYWFJlY29yZERlY2w+KEJhc2UuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogICAgIGlmIChDWFhDb25zdHJ1Y3RvckRlY2wgKkNvcHlDb25zdHJ1Y3RvciA9CiAgICAgICAgICAgTG9va3VwQ29weWluZ0NvbnN0cnVjdG9yKEJhc2VDbGFzc0RlY2wsIFF1YWxzKSkKLSAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCYXNlLT5nZXRMb2NTdGFydCgpLCBDb3B5Q29uc3RydWN0b3IpOworICAgICAgRXhjZXB0U3BlYy5DYWxsZWREZWNsKEJhc2UuZ2V0TG9jU3RhcnQoKSwgQ29weUNvbnN0cnVjdG9yKTsKICAgfQotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQmFzZSA9IENsYXNzRGVjbC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlRW5kID0gQ2xhc3NEZWNsLT52YmFzZXNfZW5kKCk7Ci0gICAgICAgQmFzZSAhPSBCYXNlRW5kOyAKLSAgICAgICArK0Jhc2UpIHsKKyAgZm9yIChjb25zdCBhdXRvICZCYXNlIDogQ2xhc3NEZWNsLT52YmFzZXMoKSkgewogICAgIENYWFJlY29yZERlY2wgKkJhc2VDbGFzc0RlY2wKLSAgICAgID0gY2FzdDxDWFhSZWNvcmREZWNsPihCYXNlLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CisgICAgICA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oQmFzZS5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKSk7CiAgICAgaWYgKENYWENvbnN0cnVjdG9yRGVjbCAqQ29weUNvbnN0cnVjdG9yID0KICAgICAgICAgICBMb29rdXBDb3B5aW5nQ29uc3RydWN0b3IoQmFzZUNsYXNzRGVjbCwgUXVhbHMpKQotICAgICAgRXhjZXB0U3BlYy5DYWxsZWREZWNsKEJhc2UtPmdldExvY1N0YXJ0KCksIENvcHlDb25zdHJ1Y3Rvcik7CisgICAgICBFeGNlcHRTcGVjLkNhbGxlZERlY2woQmFzZS5nZXRMb2NTdGFydCgpLCBDb3B5Q29uc3RydWN0b3IpOwogICB9Ci0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRmllbGQgPSBDbGFzc0RlY2wtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRFbmQgPSBDbGFzc0RlY2wtPmZpZWxkX2VuZCgpOwotICAgICAgIEZpZWxkICE9IEZpZWxkRW5kOwotICAgICAgICsrRmllbGQpIHsKKyAgZm9yIChjb25zdCBhdXRvICpGaWVsZCA6IENsYXNzRGVjbC0+ZmllbGRzKCkpIHsKICAgICBRdWFsVHlwZSBGaWVsZFR5cGUgPSBDb250ZXh0LmdldEJhc2VFbGVtZW50VHlwZShGaWVsZC0+Z2V0VHlwZSgpKTsKICAgICBpZiAoQ1hYUmVjb3JkRGVjbCAqRmllbGRDbGFzc0RlY2wgPSBGaWVsZFR5cGUtPmdldEFzQ1hYUmVjb3JkRGVjbCgpKSB7CiAgICAgICBpZiAoQ1hYQ29uc3RydWN0b3JEZWNsICpDb3B5Q29uc3RydWN0b3IgPQpAQCAtMTAxMTcsNDIgKzEwMTQ4LDM2IEBACiAgICAgcmV0dXJuIEV4Y2VwdFNwZWM7CiAKICAgLy8gRGlyZWN0IGJhc2UtY2xhc3MgY29uc3RydWN0b3JzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQiA9IENsYXNzRGVjbC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFbmQgPSBDbGFzc0RlY2wtPmJhc2VzX2VuZCgpOwotICAgICAgIEIgIT0gQkVuZDsgKytCKSB7Ci0gICAgaWYgKEItPmlzVmlydHVhbCgpKSAvLyBIYW5kbGVkIGJlbG93LgorICBmb3IgKGNvbnN0IGF1dG8gJkIgOiBDbGFzc0RlY2wtPmJhc2VzKCkpIHsKKyAgICBpZiAoQi5pc1ZpcnR1YWwoKSkgLy8gSGFuZGxlZCBiZWxvdy4KICAgICAgIGNvbnRpbnVlOwogICAgIAotICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpCYXNlVHlwZSA9IEItPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkgeworICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpCYXNlVHlwZSA9IEIuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CiAgICAgICBDWFhSZWNvcmREZWNsICpCYXNlQ2xhc3NEZWNsID0gY2FzdDxDWFhSZWNvcmREZWNsPihCYXNlVHlwZS0+Z2V0RGVjbCgpKTsKICAgICAgIENYWENvbnN0cnVjdG9yRGVjbCAqQ29uc3RydWN0b3IgPQogICAgICAgICAgIExvb2t1cE1vdmluZ0NvbnN0cnVjdG9yKEJhc2VDbGFzc0RlY2wsIDApOwogICAgICAgLy8gSWYgdGhpcyBpcyBhIGRlbGV0ZWQgZnVuY3Rpb24sIGFkZCBpdCBhbnl3YXkuIFRoaXMgbWlnaHQgYmUgY29uZm9ybWFudAogICAgICAgLy8gd2l0aCB0aGUgc3RhbmRhcmQuIFRoaXMgbWlnaHQgbm90LiBJJ20gbm90IHN1cmUuIEl0IG1pZ2h0IG5vdCBtYXR0ZXIuCiAgICAgICBpZiAoQ29uc3RydWN0b3IpCi0gICAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCLT5nZXRMb2NTdGFydCgpLCBDb25zdHJ1Y3Rvcik7CisgICAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCLmdldExvY1N0YXJ0KCksIENvbnN0cnVjdG9yKTsKICAgICB9CiAgIH0KIAogICAvLyBWaXJ0dWFsIGJhc2UtY2xhc3MgY29uc3RydWN0b3JzLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQiA9IENsYXNzRGVjbC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRW5kID0gQ2xhc3NEZWNsLT52YmFzZXNfZW5kKCk7Ci0gICAgICAgQiAhPSBCRW5kOyArK0IpIHsKLSAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqQmFzZVR5cGUgPSBCLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKKyAgZm9yIChjb25zdCBhdXRvICZCIDogQ2xhc3NEZWNsLT52YmFzZXMoKSkgeworICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpCYXNlVHlwZSA9IEIuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CiAgICAgICBDWFhSZWNvcmREZWNsICpCYXNlQ2xhc3NEZWNsID0gY2FzdDxDWFhSZWNvcmREZWNsPihCYXNlVHlwZS0+Z2V0RGVjbCgpKTsKICAgICAgIENYWENvbnN0cnVjdG9yRGVjbCAqQ29uc3RydWN0b3IgPQogICAgICAgICAgIExvb2t1cE1vdmluZ0NvbnN0cnVjdG9yKEJhc2VDbGFzc0RlY2wsIDApOwogICAgICAgLy8gSWYgdGhpcyBpcyBhIGRlbGV0ZWQgZnVuY3Rpb24sIGFkZCBpdCBhbnl3YXkuIFRoaXMgbWlnaHQgYmUgY29uZm9ybWFudAogICAgICAgLy8gd2l0aCB0aGUgc3RhbmRhcmQuIFRoaXMgbWlnaHQgbm90LiBJJ20gbm90IHN1cmUuIEl0IG1pZ2h0IG5vdCBtYXR0ZXIuCiAgICAgICBpZiAoQ29uc3RydWN0b3IpCi0gICAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCLT5nZXRMb2NTdGFydCgpLCBDb25zdHJ1Y3Rvcik7CisgICAgICAgIEV4Y2VwdFNwZWMuQ2FsbGVkRGVjbChCLmdldExvY1N0YXJ0KCksIENvbnN0cnVjdG9yKTsKICAgICB9CiAgIH0KIAogICAvLyBGaWVsZCBjb25zdHJ1Y3RvcnMuCi0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRiA9IENsYXNzRGVjbC0+ZmllbGRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRW5kID0gQ2xhc3NEZWNsLT5maWVsZF9lbmQoKTsKLSAgICAgICBGICE9IEZFbmQ7ICsrRikgeworICBmb3IgKGNvbnN0IGF1dG8gKkYgOiBDbGFzc0RlY2wtPmZpZWxkcygpKSB7CiAgICAgUXVhbFR5cGUgRmllbGRUeXBlID0gQ29udGV4dC5nZXRCYXNlRWxlbWVudFR5cGUoRi0+Z2V0VHlwZSgpKTsKICAgICBpZiAoQ1hYUmVjb3JkRGVjbCAqRmllbGRSZWNEZWNsID0gRmllbGRUeXBlLT5nZXRBc0NYWFJlY29yZERlY2woKSkgewogICAgICAgQ1hYQ29uc3RydWN0b3JEZWNsICpDb25zdHJ1Y3RvciA9CkBAIC0xMDMwOSw3ICsxMDMzNCw3IEBACiAgIFN5bnRoZXNpemVkRnVuY3Rpb25TY29wZSBTY29wZSgqdGhpcywgQ29udik7CiAgIERpYWdub3N0aWNFcnJvclRyYXAgVHJhcChEaWFncyk7CiAgICAKLSAgLy8gUmV0cmVpdmUgdGhlIHN0YXRpYyBpbnZva2VyLi4uCisgIC8vIFJldHJpZXZlIHRoZSBzdGF0aWMgaW52b2tlci4uLgogICBDWFhNZXRob2REZWNsICpJbnZva2VyID0gTGFtYmRhLT5nZXRMYW1iZGFTdGF0aWNJbnZva2VyKCk7CiAgIC8vIC4uLiBhbmQgZ2V0IHRoZSBjb3JyZXNwb25kaW5nIHNwZWNpYWxpemF0aW9uIGZvciBhIGdlbmVyaWMgbGFtYmRhLgogICBpZiAoTGFtYmRhLT5pc0dlbmVyaWNMYW1iZGEoKSkgewpAQCAtMTA0OTUsNiArMTA1MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgPDwgVkQtPmdldFR5cGUoKSk7CiAgIERpYWdub3NlVXNlT2ZEZWNsKERlc3RydWN0b3IsIFZELT5nZXRMb2NhdGlvbigpKTsKIAorICBpZiAoRGVzdHJ1Y3Rvci0+aXNUcml2aWFsKCkpIHJldHVybjsKICAgaWYgKCFWRC0+aGFzR2xvYmFsU3RvcmFnZSgpKSByZXR1cm47CiAKICAgLy8gRW1pdCB3YXJuaW5nIGZvciBub24tdHJpdmlhbCBkdG9yIGluIGdsb2JhbCBzY29wZSAoYSByZWFsIGdsb2JhbCwKQEAgLTEwNTI1LDExICsxMDU1MSwxMSBAQAogICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqUHJvdG8gCiAgICAgPSBDb25zdHJ1Y3Rvci0+Z2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKICAgYXNzZXJ0KFByb3RvICYmICJDb25zdHJ1Y3RvciB3aXRob3V0IGEgcHJvdG90eXBlPyIpOwotICB1bnNpZ25lZCBOdW1BcmdzSW5Qcm90byA9IFByb3RvLT5nZXROdW1BcmdzKCk7Ci0gIAorICB1bnNpZ25lZCBOdW1QYXJhbXMgPSBQcm90by0+Z2V0TnVtUGFyYW1zKCk7CisKICAgLy8gSWYgdG9vIGZldyBhcmd1bWVudHMgYXJlIGF2YWlsYWJsZSwgd2UnbGwgZmlsbCBpbiB0aGUgcmVzdCB3aXRoIGRlZmF1bHRzLgotICBpZiAoTnVtQXJncyA8IE51bUFyZ3NJblByb3RvKQotICAgIENvbnZlcnRlZEFyZ3MucmVzZXJ2ZShOdW1BcmdzSW5Qcm90byk7CisgIGlmIChOdW1BcmdzIDwgTnVtUGFyYW1zKQorICAgIENvbnZlcnRlZEFyZ3MucmVzZXJ2ZShOdW1QYXJhbXMpOwogICBlbHNlCiAgICAgQ29udmVydGVkQXJncy5yZXNlcnZlKE51bUFyZ3MpOwogCkBAIC0xMDU4MCw4ICsxMDYwNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuUXVhbFR5cGUgRXhwZWN0ZWRGaXJzdFBhcmFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXBlbmRlbnRQYXJhbVR5cGVEaWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEludmFsaWRQYXJhbVR5cGVEaWFnKSB7Ci0gIFF1YWxUeXBlIFJlc3VsdFR5cGUgPSAKLSAgICBGbkRlY2wtPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpLT5nZXRSZXN1bHRUeXBlKCk7CisgIFF1YWxUeXBlIFJlc3VsdFR5cGUgPQorICAgICAgRm5EZWNsLT5nZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uVHlwZT4oKS0+Z2V0UmV0dXJuVHlwZSgpOwogCiAgIC8vIENoZWNrIHRoYXQgdGhlIHJlc3VsdCB0eXBlIGlzIG5vdCBkZXBlbmRlbnQuCiAgIGlmIChSZXN1bHRUeXBlLT5pc0RlcGVuZGVudFR5cGUoKSkKQEAgLTEwNzA2LDEwICsxMDczMiw4IEBACiAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfb3BlcmF0b3Jfb3ZlcmxvYWRfc3RhdGljKSA8PCBGbkRlY2wtPmdldERlY2xOYW1lKCk7CiAgIH0gZWxzZSB7CiAgICAgYm9vbCBDbGFzc09yRW51bVBhcmFtID0gZmFsc2U7Ci0gICAgZm9yIChGdW5jdGlvbkRlY2w6OnBhcmFtX2l0ZXJhdG9yIFBhcmFtID0gRm5EZWNsLT5wYXJhbV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbUVuZCA9IEZuRGVjbC0+cGFyYW1fZW5kKCk7Ci0gICAgICAgICBQYXJhbSAhPSBQYXJhbUVuZDsgKytQYXJhbSkgewotICAgICAgUXVhbFR5cGUgUGFyYW1UeXBlID0gKCpQYXJhbSktPmdldFR5cGUoKS5nZXROb25SZWZlcmVuY2VUeXBlKCk7CisgICAgZm9yIChhdXRvIFBhcmFtIDogRm5EZWNsLT5wYXJhbXMoKSkgeworICAgICAgUXVhbFR5cGUgUGFyYW1UeXBlID0gUGFyYW0tPmdldFR5cGUoKS5nZXROb25SZWZlcmVuY2VUeXBlKCk7CiAgICAgICBpZiAoUGFyYW1UeXBlLT5pc0RlcGVuZGVudFR5cGUoKSB8fCBQYXJhbVR5cGUtPmlzUmVjb3JkVHlwZSgpIHx8CiAgICAgICAgICAgUGFyYW1UeXBlLT5pc0VudW1lcmFsVHlwZSgpKSB7CiAgICAgICAgIENsYXNzT3JFbnVtUGFyYW0gPSB0cnVlOwpAQCAtMTA3MzAsMTIgKzEwNzU0LDExIEBACiAgIC8vIE9ubHkgdGhlIGZ1bmN0aW9uLWNhbGwgb3BlcmF0b3IgYWxsb3dzIGRlZmF1bHQgYXJndW1lbnRzCiAgIC8vIChDKysgW292ZXIuY2FsbF1wMSkuCiAgIGlmIChPcCAhPSBPT19DYWxsKSB7Ci0gICAgZm9yIChGdW5jdGlvbkRlY2w6OnBhcmFtX2l0ZXJhdG9yIFBhcmFtID0gRm5EZWNsLT5wYXJhbV9iZWdpbigpOwotICAgICAgICAgUGFyYW0gIT0gRm5EZWNsLT5wYXJhbV9lbmQoKTsgKytQYXJhbSkgewotICAgICAgaWYgKCgqUGFyYW0pLT5oYXNEZWZhdWx0QXJnKCkpCi0gICAgICAgIHJldHVybiBEaWFnKCgqUGFyYW0pLT5nZXRMb2NhdGlvbigpLAorICAgIGZvciAoYXV0byBQYXJhbSA6IEZuRGVjbC0+cGFyYW1zKCkpIHsKKyAgICAgIGlmIChQYXJhbS0+aGFzRGVmYXVsdEFyZygpKQorICAgICAgICByZXR1cm4gRGlhZyhQYXJhbS0+Z2V0TG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX29wZXJhdG9yX292ZXJsb2FkX2RlZmF1bHRfYXJnKQotICAgICAgICAgIDw8IEZuRGVjbC0+Z2V0RGVjbE5hbWUoKSA8PCAoKlBhcmFtKS0+Z2V0RGVmYXVsdEFyZ1JhbmdlKCk7CisgICAgICAgICAgPDwgRm5EZWNsLT5nZXREZWNsTmFtZSgpIDw8IFBhcmFtLT5nZXREZWZhdWx0QXJnUmFuZ2UoKTsKICAgICB9CiAgIH0KIApAQCAtMTA4MDIsMTEgKzEwODI1LDEwIEBACiAgIC8vICAgaW5jcmVtZW50IG9wZXJhdG9yICsrIGZvciBvYmplY3RzIG9mIHRoYXQgdHlwZS4KICAgaWYgKChPcCA9PSBPT19QbHVzUGx1cyB8fCBPcCA9PSBPT19NaW51c01pbnVzKSAmJiBOdW1QYXJhbXMgPT0gMikgewogICAgIFBhcm1WYXJEZWNsICpMYXN0UGFyYW0gPSBGbkRlY2wtPmdldFBhcmFtRGVjbChGbkRlY2wtPmdldE51bVBhcmFtcygpIC0gMSk7Ci0gICAgYm9vbCBQYXJhbUlzSW50ID0gZmFsc2U7Ci0gICAgaWYgKGNvbnN0IEJ1aWx0aW5UeXBlICpCVCA9IExhc3RQYXJhbS0+Z2V0VHlwZSgpLT5nZXRBczxCdWlsdGluVHlwZT4oKSkKLSAgICAgIFBhcmFtSXNJbnQgPSBCVC0+Z2V0S2luZCgpID09IEJ1aWx0aW5UeXBlOjpJbnQ7CisgICAgUXVhbFR5cGUgUGFyYW1UeXBlID0gTGFzdFBhcmFtLT5nZXRUeXBlKCk7CiAKLSAgICBpZiAoIVBhcmFtSXNJbnQpCisgICAgaWYgKCFQYXJhbVR5cGUtPmlzU3BlY2lmaWNCdWlsdGluVHlwZShCdWlsdGluVHlwZTo6SW50KSAmJgorICAgICAgICAhUGFyYW1UeXBlLT5pc0RlcGVuZGVudFR5cGUoKSkKICAgICAgIHJldHVybiBEaWFnKExhc3RQYXJhbS0+Z2V0TG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgIGRpYWc6OmVycl9vcGVyYXRvcl9vdmVybG9hZF9wb3N0X2luY2RlY19tdXN0X2JlX2ludCkKICAgICAgICAgPDwgTGFzdFBhcmFtLT5nZXRUeXBlKCkgPDwgKE9wID09IE9PX01pbnVzTWludXMpOwpAQCAtMTA5MzksMTMgKzEwOTYxLDExIEBACiAKICAgLy8gQSBwYXJhbWV0ZXItZGVjbGFyYXRpb24tY2xhdXNlIGNvbnRhaW5pbmcgYSBkZWZhdWx0IGFyZ3VtZW50IGlzIG5vdAogICAvLyBlcXVpdmFsZW50IHRvIGFueSBvZiB0aGUgcGVybWl0dGVkIGZvcm1zLgotICBmb3IgKEZ1bmN0aW9uRGVjbDo6cGFyYW1faXRlcmF0b3IgUGFyYW0gPSBGbkRlY2wtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbUVuZCA9IEZuRGVjbC0+cGFyYW1fZW5kKCk7Ci0gICAgICAgUGFyYW0gIT0gUGFyYW1FbmQ7ICsrUGFyYW0pIHsKLSAgICBpZiAoKCpQYXJhbSktPmhhc0RlZmF1bHRBcmcoKSkgewotICAgICAgRGlhZygoKlBhcmFtKS0+Z2V0RGVmYXVsdEFyZ1JhbmdlKCkuZ2V0QmVnaW4oKSwKKyAgZm9yIChhdXRvIFBhcmFtIDogRm5EZWNsLT5wYXJhbXMoKSkgeworICAgIGlmIChQYXJhbS0+aGFzRGVmYXVsdEFyZygpKSB7CisgICAgICBEaWFnKFBhcmFtLT5nZXREZWZhdWx0QXJnUmFuZ2UoKS5nZXRCZWdpbigpLAogICAgICAgICAgICBkaWFnOjplcnJfbGl0ZXJhbF9vcGVyYXRvcl9kZWZhdWx0X2FyZ3VtZW50KQotICAgICAgICA8PCAoKlBhcmFtKS0+Z2V0RGVmYXVsdEFyZ1JhbmdlKCk7CisgICAgICAgIDw8IFBhcmFtLT5nZXREZWZhdWx0QXJnUmFuZ2UoKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgfQpAQCAtMTA5NjUsMjkgKzEwOTg1LDM2IEBACiAKIC8vLyBBY3RPblN0YXJ0TGlua2FnZVNwZWNpZmljYXRpb24gLSBQYXJzZWQgdGhlIGJlZ2lubmluZyBvZiBhIEMrKwogLy8vIGxpbmthZ2Ugc3BlY2lmaWNhdGlvbiwgaW5jbHVkaW5nIHRoZSBsYW5ndWFnZSBhbmQgKGlmIHByZXNlbnQpCi0vLy8gdGhlICd7Jy4gRXh0ZXJuTG9jIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ2V4dGVybicsIExhbmdMb2MgaXMKLS8vLyB0aGUgbG9jYXRpb24gb2YgdGhlIGxhbmd1YWdlIHN0cmluZyBsaXRlcmFsLCB3aGljaCBpcyBwcm92aWRlZAotLy8vIGJ5IExhbmcvU3RyU2l6ZS4gTEJyYWNlTG9jLCBpZiB2YWxpZCwgcHJvdmlkZXMgdGhlIGxvY2F0aW9uIG9mCisvLy8gdGhlICd7Jy4gRXh0ZXJuTG9jIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgJ2V4dGVybicsIExhbmcgaXMgdGhlCisvLy8gbGFuZ3VhZ2Ugc3RyaW5nIGxpdGVyYWwuIExCcmFjZUxvYywgaWYgdmFsaWQsIHByb3ZpZGVzIHRoZSBsb2NhdGlvbiBvZgogLy8vIHRoZSAneycgYnJhY2UuIE90aGVyd2lzZSwgdGhpcyBsaW5rYWdlIHNwZWNpZmljYXRpb24gZG9lcyBub3QKIC8vLyBoYXZlIGFueSBicmFjZXMuCiBEZWNsICpTZW1hOjpBY3RPblN0YXJ0TGlua2FnZVNwZWNpZmljYXRpb24oU2NvcGUgKlMsIFNvdXJjZUxvY2F0aW9uIEV4dGVybkxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMYW5nTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBMYW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHIgKkxhbmdTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTEJyYWNlTG9jKSB7CisgIFN0cmluZ0xpdGVyYWwgKkxpdCA9IGNhc3Q8U3RyaW5nTGl0ZXJhbD4oTGFuZ1N0cik7CisgIGlmICghTGl0LT5pc0FzY2lpKCkpIHsKKyAgICBEaWFnKExhbmdTdHItPmdldEV4cHJMb2MoKSwgZGlhZzo6ZXJyX2xhbmd1YWdlX2xpbmthZ2Vfc3BlY19ub3RfYXNjaWkpCisgICAgICA8PCBMYW5nU3RyLT5nZXRTb3VyY2VSYW5nZSgpOworICAgIHJldHVybiAwOworICB9CisKKyAgU3RyaW5nUmVmIExhbmcgPSBMaXQtPmdldFN0cmluZygpOwogICBMaW5rYWdlU3BlY0RlY2w6Okxhbmd1YWdlSURzIExhbmd1YWdlOwotICBpZiAoTGFuZyA9PSAiXCJDXCIiKQorICBpZiAoTGFuZyA9PSAiQyIpCiAgICAgTGFuZ3VhZ2UgPSBMaW5rYWdlU3BlY0RlY2w6OmxhbmdfYzsKLSAgZWxzZSBpZiAoTGFuZyA9PSAiXCJDKytcIiIpCisgIGVsc2UgaWYgKExhbmcgPT0gIkMrKyIpCiAgICAgTGFuZ3VhZ2UgPSBMaW5rYWdlU3BlY0RlY2w6OmxhbmdfY3h4OwogICBlbHNlIHsKLSAgICBEaWFnKExhbmdMb2MsIGRpYWc6OmVycl9iYWRfbGFuZ3VhZ2UpOworICAgIERpYWcoTGFuZ1N0ci0+Z2V0RXhwckxvYygpLCBkaWFnOjplcnJfbGFuZ3VhZ2VfbGlua2FnZV9zcGVjX3Vua25vd24pCisgICAgICA8PCBMYW5nU3RyLT5nZXRTb3VyY2VSYW5nZSgpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgLy8gRklYTUU6IEFkZCBhbGwgdGhlIHZhcmlvdXMgc2VtYW50aWNzIG9mIGxpbmthZ2Ugc3BlY2lmaWNhdGlvbnMKIAotICBMaW5rYWdlU3BlY0RlY2wgKkQgPSBMaW5rYWdlU3BlY0RlY2w6OkNyZWF0ZShDb250ZXh0LCBDdXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5Mb2MsIExhbmdMb2MsIExhbmd1YWdlLAorICBMaW5rYWdlU3BlY0RlY2wgKkQgPSBMaW5rYWdlU3BlY0RlY2w6OkNyZWF0ZShDb250ZXh0LCBDdXJDb250ZXh0LCBFeHRlcm5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhbmdTdHItPmdldEV4cHJMb2MoKSwgTGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExCcmFjZUxvYy5pc1ZhbGlkKCkpOwogICBDdXJDb250ZXh0LT5hZGREZWNsKEQpOwogICBQdXNoRGVjbENvbnRleHQoUywgRCk7CkBAIC0xMTAwMSwxMyArMTEwMjgsMTEgQEAKIERlY2wgKlNlbWE6OkFjdE9uRmluaXNoTGlua2FnZVNwZWNpZmljYXRpb24oU2NvcGUgKlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2wgKkxpbmthZ2VTcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSQnJhY2VMb2MpIHsKLSAgaWYgKExpbmthZ2VTcGVjKSB7Ci0gICAgaWYgKFJCcmFjZUxvYy5pc1ZhbGlkKCkpIHsKLSAgICAgIExpbmthZ2VTcGVjRGVjbCogTFNEZWNsID0gY2FzdDxMaW5rYWdlU3BlY0RlY2w+KExpbmthZ2VTcGVjKTsKLSAgICAgIExTRGVjbC0+c2V0UkJyYWNlTG9jKFJCcmFjZUxvYyk7Ci0gICAgfQotICAgIFBvcERlY2xDb250ZXh0KCk7CisgIGlmIChSQnJhY2VMb2MuaXNWYWxpZCgpKSB7CisgICAgTGlua2FnZVNwZWNEZWNsKiBMU0RlY2wgPSBjYXN0PExpbmthZ2VTcGVjRGVjbD4oTGlua2FnZVNwZWMpOworICAgIExTRGVjbC0+c2V0UkJyYWNlTG9jKFJCcmFjZUxvYyk7CiAgIH0KKyAgUG9wRGVjbENvbnRleHQoKTsKICAgcmV0dXJuIExpbmthZ2VTcGVjOwogfQogCkBAIC0xMTM3NCwxNCArMTEzOTksMTUgQEAKICAgICAgIGJvb2wgT3duZWQgPSBmYWxzZTsKICAgICAgIGJvb2wgSXNEZXBlbmRlbnQgPSBmYWxzZTsKICAgICAgIHJldHVybiBBY3RPblRhZyhTLCBUYWdTcGVjLCBUVUtfRnJpZW5kLCBUYWdMb2MsIFNTLCBOYW1lLCBOYW1lTG9jLAotICAgICAgICAgICAgICAgICAgICAgIEF0dHIsIEFTX3B1YmxpYywgCisgICAgICAgICAgICAgICAgICAgICAgQXR0ciwgQVNfcHVibGljLAogICAgICAgICAgICAgICAgICAgICAgIC8qTW9kdWxlUHJpdmF0ZUxvYz0qL1NvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgTXVsdGlUZW1wbGF0ZVBhcmFtc0FyZygpLCBPd25lZCwgSXNEZXBlbmRlbnQsIAorICAgICAgICAgICAgICAgICAgICAgIE11bHRpVGVtcGxhdGVQYXJhbXNBcmcoKSwgT3duZWQsIElzRGVwZW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgIC8qU2NvcGVkRW51bUtXTG9jPSovU291cmNlTG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAvKlNjb3BlZEVudW1Vc2VzQ2xhc3NUYWc9Ki9mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAvKlVuZGVybHlpbmdUeXBlPSovVHlwZVJlc3VsdCgpKTsgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgLypVbmRlcmx5aW5nVHlwZT0qL1R5cGVSZXN1bHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAvKklzVHlwZVNwZWNpZmllcj0qL2ZhbHNlKTsKICAgICB9Ci0gICAgCisKICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFF1YWxpZmllckxvYyA9IFNTLmdldFdpdGhMb2NJbkNvbnRleHQoQ29udGV4dCk7CiAgICAgRWxhYm9yYXRlZFR5cGVLZXl3b3JkIEtleXdvcmQKICAgICAgID0gVHlwZVdpdGhLZXl3b3JkOjpnZXRLZXl3b3JkRm9yVGFnVHlwZUtpbmQoS2luZCk7CkBAIC0xMTg0MSwxMCArMTE4NjcsMTMgQEAKICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqUHJldiA9IEZuLT5nZXRQcmV2aW91c0RlY2woKSkgewogICAgIC8vIERvbid0IGNvbnNpZGVyIHRoZSBpbXBsaWNpdCBkZWNsYXJhdGlvbiB3ZSBnZW5lcmF0ZSBmb3IgZXhwbGljaXQKICAgICAvLyBzcGVjaWFsaXphdGlvbnMuIEZJWE1FOiBEbyBub3QgZ2VuZXJhdGUgdGhlc2UgaW1wbGljaXQgZGVjbGFyYXRpb25zLgotICAgIGlmICgoUHJldi0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSAhPSBUU0tfRXhwbGljaXRTcGVjaWFsaXphdGlvbgotICAgICAgICB8fCBQcmV2LT5nZXRQcmV2aW91c0RlY2woKSkgJiYgIVByZXYtPmlzRGVmaW5lZCgpKSB7CisgICAgaWYgKChQcmV2LT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpICE9IFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uIHx8CisgICAgICAgICBQcmV2LT5nZXRQcmV2aW91c0RlY2woKSkgJiYKKyAgICAgICAgIVByZXYtPmlzRGVmaW5lZCgpKSB7CiAgICAgICBEaWFnKERlbExvYywgZGlhZzo6ZXJyX2RlbGV0ZWRfZGVjbF9ub3RfZmlyc3QpOwotICAgICAgRGlhZyhQcmV2LT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3ByZXZpb3VzX2RlY2xhcmF0aW9uKTsKKyAgICAgIERpYWcoUHJldi0+Z2V0TG9jYXRpb24oKS5pc0ludmFsaWQoKSA/IERlbExvYyA6IFByZXYtPmdldExvY2F0aW9uKCksCisgICAgICAgICAgIFByZXYtPmlzSW1wbGljaXQoKSA/IGRpYWc6Om5vdGVfcHJldmlvdXNfaW1wbGljaXRfZGVjbGFyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGlhZzo6bm90ZV9wcmV2aW91c19kZWNsYXJhdGlvbik7CiAgICAgfQogICAgIC8vIElmIHRoZSBkZWNsYXJhdGlvbiB3YXNuJ3QgdGhlIGZpcnN0LCB3ZSBkZWxldGUgdGhlIGZ1bmN0aW9uIGFueXdheSBmb3IKICAgICAvLyByZWNvdmVyeS4KQEAgLTExODcxLDYgKzExOTAwLDExIEBACiAgICAgfQogICB9CiAKKyAgLy8gQysrMTEgW2Jhc2ljLnN0YXJ0Lm1haW5dcDM6CisgIC8vICAgQSBwcm9ncmFtIHRoYXQgZGVmaW5lcyBtYWluIGFzIGRlbGV0ZWQgWy4uLl0gaXMgaWxsLWZvcm1lZC4KKyAgaWYgKEZuLT5pc01haW4oKSkKKyAgICBEaWFnKERlbExvYywgZGlhZzo6ZXJyX2RlbGV0ZWRfbWFpbik7CisKICAgRm4tPnNldERlbGV0ZWRBc1dyaXR0ZW4oKTsKIH0KIApAQCAtMTE5NzcsNiArMTIwMTEsMTMgQEAKICAgaWYgKE5ld0NDID09IE9sZENDKQogICAgIHJldHVybiBmYWxzZTsKIAorICAvLyBJZiB0aGUgY2FsbGluZyBjb252ZW50aW9ucyBtaXNtYXRjaCBiZWNhdXNlIHRoZSBuZXcgZnVuY3Rpb24gaXMgc3RhdGljLAorICAvLyBzdXBwcmVzcyB0aGUgY2FsbGluZyBjb252ZW50aW9uIG1pc21hdGNoIGVycm9yOyB0aGUgZXJyb3IgYWJvdXQgc3RhdGljCisgIC8vIGZ1bmN0aW9uIG92ZXJyaWRlIChlcnJfc3RhdGljX292ZXJyaWRlc192aXJ0dWFsIGZyb20KKyAgLy8gU2VtYTo6Q2hlY2tGdW5jdGlvbkRlY2xhcmF0aW9uKSBpcyBtb3JlIGNsZWFyLgorICBpZiAoTmV3LT5nZXRTdG9yYWdlQ2xhc3MoKSA9PSBTQ19TdGF0aWMpCisgICAgcmV0dXJuIGZhbHNlOworCiAgIERpYWcoTmV3LT5nZXRMb2NhdGlvbigpLAogICAgICAgIGRpYWc6OmVycl9jb25mbGljdGluZ19vdmVycmlkaW5nX2NjX2F0dHJpYnV0ZXMpCiAgICAgPDwgTmV3LT5nZXREZWNsTmFtZSgpIDw8IE5ldy0+Z2V0VHlwZSgpIDw8IE9sZC0+Z2V0VHlwZSgpOwpAQCAtMTE5ODYsOCArMTIwMjcsOCBAQAogCiBib29sIFNlbWE6OkNoZWNrT3ZlcnJpZGluZ0Z1bmN0aW9uUmV0dXJuVHlwZShjb25zdCBDWFhNZXRob2REZWNsICpOZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWFhNZXRob2REZWNsICpPbGQpIHsKLSAgUXVhbFR5cGUgTmV3VHkgPSBOZXctPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpLT5nZXRSZXN1bHRUeXBlKCk7Ci0gIFF1YWxUeXBlIE9sZFR5ID0gT2xkLT5nZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uVHlwZT4oKS0+Z2V0UmVzdWx0VHlwZSgpOworICBRdWFsVHlwZSBOZXdUeSA9IE5ldy0+Z2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblR5cGU+KCktPmdldFJldHVyblR5cGUoKTsKKyAgUXVhbFR5cGUgT2xkVHkgPSBPbGQtPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpLT5nZXRSZXR1cm5UeXBlKCk7CiAKICAgaWYgKENvbnRleHQuaGFzU2FtZVR5cGUoTmV3VHksIE9sZFR5KSB8fAogICAgICAgTmV3VHktPmlzRGVwZW5kZW50VHlwZSgpIHx8IE9sZFR5LT5pc0RlcGVuZGVudFR5cGUoKSkKQEAgLTEyMTIwLDExICsxMjE2MSwxMyBAQAogICAvLyBJZiB0aGVyZSBpcyBubyBkZWNsYXJhdGlvbiwgdGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcgaXQuCiAgIGlmIChEID09IDAgfHwgRC0+aXNJbnZhbGlkRGVjbCgpKSByZXR1cm47CiAKLSAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGNhbGxlZCBmb3IgZGVjbGFyYXRpb25zIHdpdGggc2NvcGUgc3BlY2lmaWVycywgbGlrZToKLSAgLy8gICBpbnQgZm9vOjpiYXI7Ci0gIGFzc2VydChELT5pc091dE9mTGluZSgpKTsKLSAgRW50ZXJEZWNsYXJhdG9yQ29udGV4dChTLCBELT5nZXREZWNsQ29udGV4dCgpKTsKLSAgCisgIC8vIFdlIHdpbGwgYWx3YXlzIGhhdmUgYSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgaGVyZSwgYnV0IHRoaXMgZGVjbGFyYXRpb24KKyAgLy8gbWlnaHQgbm90IGJlIG91dCBvZiBsaW5lIGlmIHRoZSBzcGVjaWZpZXIgbmFtZXMgdGhlIGN1cnJlbnQgbmFtZXNwYWNlOgorICAvLyAgIGV4dGVybiBpbnQgbjsKKyAgLy8gICBpbnQgOjpuID0gMDsKKyAgaWYgKEQtPmlzT3V0T2ZMaW5lKCkpCisgICAgRW50ZXJEZWNsYXJhdG9yQ29udGV4dChTLCBELT5nZXREZWNsQ29udGV4dCgpKTsKKwogICAvLyBJZiB3ZSBhcmUgcGFyc2luZyB0aGUgaW5pdGlhbGl6ZXIgZm9yIGEgc3RhdGljIGRhdGEgbWVtYmVyLCBwdXNoIGEKICAgLy8gbmV3IGV4cHJlc3Npb24gZXZhbHVhdGlvbiBjb250ZXh0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RhdGljCiAgIC8vIGRhdGEgbWVtYmVyLgpAQCAtMTIxMzksMTAgKzEyMTgyLDEwIEBACiAgIGlmIChEID09IDAgfHwgRC0+aXNJbnZhbGlkRGVjbCgpKSByZXR1cm47CiAKICAgaWYgKGlzU3RhdGljRGF0YU1lbWJlcihEKSkKLSAgICBQb3BFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQoKTsgIAorICAgIFBvcEV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCgpOwogCi0gIGFzc2VydChELT5pc091dE9mTGluZSgpKTsKLSAgRXhpdERlY2xhcmF0b3JDb250ZXh0KFMpOworICBpZiAoRC0+aXNPdXRPZkxpbmUoKSkKKyAgICBFeGl0RGVjbGFyYXRvckNvbnRleHQoUyk7CiB9CiAKIC8vLyBBY3RPbkNYWENvbmRpdGlvbkRlY2xhcmF0aW9uRXhwciAtIFBhcnNlZCBhIGNvbmRpdGlvbiBkZWNsYXJhdGlvbiBvZiBhCkBAIC0xMjIxNiw2ICsxMjI1OSwxOCBAQAogICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBjYW4gZWFybHkgZXhpdC4KICAgICAgIHJldHVybjsKICAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gVGhlIE1pY3Jvc29mdCBBQkkgcmVxdWlyZXMgdGhhdCB3ZSBwZXJmb3JtIHRoZSBkZXN0cnVjdG9yIGJvZHkKKyAgICAvLyBjaGVja3MgKGkuZS4gb3BlcmF0b3IgZGVsZXRlKCkgbG9va3VwKSB3aGVuIHRoZSB2dGFibGUgaXMgbWFya2VkIHVzZWQsIGFzCisgICAgLy8gdGhlIGRlbGV0aW5nIGRlc3RydWN0b3IgaXMgZW1pdHRlZCB3aXRoIHRoZSB2dGFibGUsIG5vdCB3aXRoIHRoZQorICAgIC8vIGRlc3RydWN0b3IgZGVmaW5pdGlvbiBhcyBpbiB0aGUgSXRhbml1bSBBQkkuCisgICAgLy8gSWYgaXQgaGFzIGEgZGVmaW5pdGlvbiwgd2UgZG8gdGhlIGNoZWNrIGF0IHRoYXQgcG9pbnQgaW5zdGVhZC4KKyAgICBpZiAoQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkuZ2V0Q1hYQUJJKCkuaXNNaWNyb3NvZnQoKSAmJgorICAgICAgICBDbGFzcy0+aGFzVXNlckRlY2xhcmVkRGVzdHJ1Y3RvcigpICYmCisgICAgICAgICFDbGFzcy0+Z2V0RGVzdHJ1Y3RvcigpLT5pc0RlZmluZWQoKSAmJgorICAgICAgICAhQ2xhc3MtPmdldERlc3RydWN0b3IoKS0+aXNEZWxldGVkKCkpIHsKKyAgICAgIENoZWNrRGVzdHJ1Y3RvcihDbGFzcy0+Z2V0RGVzdHJ1Y3RvcigpKTsKKyAgICB9CiAgIH0KIAogICAvLyBMb2NhbCBjbGFzc2VzIG5lZWQgdG8gaGF2ZSB0aGVpciB2aXJ0dWFsIG1lbWJlcnMgbWFya2VkCkBAIC0xMjI2NywxMSArMTIzMjIsOSBAQAogICAgICAgYm9vbCBJc0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uCiAgICAgICAgID0gQ2xhc3MtPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uOwotICAgICAgZm9yIChUYWdEZWNsOjpyZWRlY2xfaXRlcmF0b3IgUiA9IENsYXNzLT5yZWRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRW5kID0gQ2xhc3MtPnJlZGVjbHNfZW5kKCk7Ci0gICAgICAgICAgIFIgIT0gUkVuZDsgKytSKSB7CisgICAgICBmb3IgKGF1dG8gUiA6IENsYXNzLT5yZWRlY2xzKCkpIHsKICAgICAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQgVFNLCi0gICAgICAgICAgPSBjYXN0PENYWFJlY29yZERlY2w+KCpSKS0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKTsKKyAgICAgICAgICA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oUiktPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCk7CiAgICAgICAgIGlmIChUU0sgPT0gVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uKQogICAgICAgICAgIElzRXhwbGljaXRJbnN0YW50aWF0aW9uRGVjbGFyYXRpb24gPSB0cnVlOwogICAgICAgICBlbHNlIGlmIChUU0sgPT0gVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlZmluaXRpb24pIHsKQEAgLTEyMzIwLDEwICsxMjM3Myw5IEBACiAKIHZvaWQgU2VtYTo6TWFya1ZpcnR1YWxNZW1iZXJFeGNlcHRpb25TcGVjc05lZWRlZChTb3VyY2VMb2NhdGlvbiBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUkQpIHsKLSAgZm9yIChDWFhSZWNvcmREZWNsOjptZXRob2RfaXRlcmF0b3IgSSA9IFJELT5tZXRob2RfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IFJELT5tZXRob2RfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgIGlmICgoKkkpLT5pc1ZpcnR1YWwoKSAmJiAhKCpJKS0+aXNQdXJlKCkpCi0gICAgICBSZXNvbHZlRXhjZXB0aW9uU3BlYyhMb2MsICgqSSktPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogUkQtPm1ldGhvZHMoKSkKKyAgICBpZiAoSS0+aXNWaXJ0dWFsKCkgJiYgIUktPmlzUHVyZSgpKQorICAgICAgUmVzb2x2ZUV4Y2VwdGlvblNwZWMoTG9jLCBJLT5nZXRUeXBlKCktPmNhc3RBczxGdW5jdGlvblByb3RvVHlwZT4oKSk7CiB9CiAKIHZvaWQgU2VtYTo6TWFya1ZpcnR1YWxNZW1iZXJzUmVmZXJlbmNlZChTb3VyY2VMb2NhdGlvbiBMb2MsCkBAIC0xMjM1MSwxMCArMTI0MDMsOSBAQAogICBpZiAoUkQtPmdldE51bVZCYXNlcygpID09IDApCiAgICAgcmV0dXJuOwogCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19jb25zdF9pdGVyYXRvciBpID0gUkQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgIGUgPSBSRC0+YmFzZXNfZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IFJELT5iYXNlcygpKSB7CiAgICAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqQmFzZSA9Ci0gICAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oaS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOworICAgICAgICBjYXN0PENYWFJlY29yZERlY2w+KEkuZ2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpLT5nZXREZWNsKCkpOwogICAgIGlmIChCYXNlLT5nZXROdW1WQmFzZXMoKSA9PSAwKQogICAgICAgY29udGludWU7CiAgICAgTWFya1ZpcnR1YWxNZW1iZXJzUmVmZXJlbmNlZChMb2MsIEJhc2UpOwpAQCAtMTI1MzQsNyArMTI1ODUsNyBAQAogICAKICAgLy8gSWYgdGhlIHJldHVybiB0eXBlIGNhbWUgYWZ0ZXIgdGhlIGN2LXF1YWxpZmllci1zZXEsIGNoZWNrIGl0IG5vdy4KICAgaWYgKFByb3RvLT5oYXNUcmFpbGluZ1JldHVybigpICYmCi0gICAgICAhRmluZGVyLlRyYXZlcnNlVHlwZUxvYyhQcm90b1RMLmdldFJlc3VsdExvYygpKSkKKyAgICAgICFGaW5kZXIuVHJhdmVyc2VUeXBlTG9jKFByb3RvVEwuZ2V0UmV0dXJuTG9jKCkpKQogICAgIHJldHVybiB0cnVlOwogCiAgIC8vIENoZWNrIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4KQEAgLTEyNTcxLDEwICsxMjYyMiw4IEBACiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAKICAgY2FzZSBFU1RfRHluYW1pYzoKLSAgICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjpleGNlcHRpb25faXRlcmF0b3IgRSA9IFByb3RvLT5leGNlcHRpb25fYmVnaW4oKSwKLSAgICAgICAgIEVFbmQgPSBQcm90by0+ZXhjZXB0aW9uX2VuZCgpOwotICAgICAgICAgRSAhPSBFRW5kOyArK0UpIHsKLSAgICAgIGlmICghRmluZGVyLlRyYXZlcnNlVHlwZSgqRSkpCisgICAgZm9yIChjb25zdCBhdXRvICZFIDogUHJvdG8tPmV4Y2VwdGlvbnMoKSkgeworICAgICAgaWYgKCFGaW5kZXIuVHJhdmVyc2VUeXBlKEUpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgYnJlYWs7CkBAIC0xMjU4Nyw0NSArMTI2MzYsMzYgQEAKICAgRmluZENYWFRoaXNFeHByIEZpbmRlcigqdGhpcyk7CiAKICAgLy8gQ2hlY2sgYXR0cmlidXRlcy4KLSAgZm9yIChEZWNsOjphdHRyX2l0ZXJhdG9yIEEgPSBNZXRob2QtPmF0dHJfYmVnaW4oKSwgQUVuZCA9IE1ldGhvZC0+YXR0cl9lbmQoKTsKLSAgICAgICBBICE9IEFFbmQ7ICsrQSkgeworICBmb3IgKGNvbnN0IGF1dG8gKkEgOiBNZXRob2QtPmF0dHJzKCkpIHsKICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZW1pdHRlZCBieSB0YmxnZW4uCiAgICAgRXhwciAqQXJnID0gMDsKICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3M7Ci0gICAgaWYgKEd1YXJkZWRCeUF0dHIgKkcgPSBkeW5fY2FzdDxHdWFyZGVkQnlBdHRyPigqQSkpCisgICAgaWYgKGNvbnN0IGF1dG8gKkcgPSBkeW5fY2FzdDxHdWFyZGVkQnlBdHRyPihBKSkKICAgICAgIEFyZyA9IEctPmdldEFyZygpOwotICAgIGVsc2UgaWYgKFB0R3VhcmRlZEJ5QXR0ciAqRyA9IGR5bl9jYXN0PFB0R3VhcmRlZEJ5QXR0cj4oKkEpKQorICAgIGVsc2UgaWYgKGNvbnN0IGF1dG8gKkcgPSBkeW5fY2FzdDxQdEd1YXJkZWRCeUF0dHI+KEEpKQogICAgICAgQXJnID0gRy0+Z2V0QXJnKCk7Ci0gICAgZWxzZSBpZiAoQWNxdWlyZWRBZnRlckF0dHIgKkFBID0gZHluX2Nhc3Q8QWNxdWlyZWRBZnRlckF0dHI+KCpBKSkKKyAgICBlbHNlIGlmIChjb25zdCBhdXRvICpBQSA9IGR5bl9jYXN0PEFjcXVpcmVkQWZ0ZXJBdHRyPihBKSkKICAgICAgIEFyZ3MgPSBBcnJheVJlZjxFeHByICo+KEFBLT5hcmdzX2JlZ2luKCksIEFBLT5hcmdzX3NpemUoKSk7Ci0gICAgZWxzZSBpZiAoQWNxdWlyZWRCZWZvcmVBdHRyICpBQiA9IGR5bl9jYXN0PEFjcXVpcmVkQmVmb3JlQXR0cj4oKkEpKQorICAgIGVsc2UgaWYgKGNvbnN0IGF1dG8gKkFCID0gZHluX2Nhc3Q8QWNxdWlyZWRCZWZvcmVBdHRyPihBKSkKICAgICAgIEFyZ3MgPSBBcnJheVJlZjxFeHByICo+KEFCLT5hcmdzX2JlZ2luKCksIEFCLT5hcmdzX3NpemUoKSk7Ci0gICAgZWxzZSBpZiAoRXhjbHVzaXZlTG9ja0Z1bmN0aW9uQXR0ciAqRUxGIAotICAgICAgICAgICAgICAgPSBkeW5fY2FzdDxFeGNsdXNpdmVMb2NrRnVuY3Rpb25BdHRyPigqQSkpCi0gICAgICBBcmdzID0gQXJyYXlSZWY8RXhwciAqPihFTEYtPmFyZ3NfYmVnaW4oKSwgRUxGLT5hcmdzX3NpemUoKSk7Ci0gICAgZWxzZSBpZiAoU2hhcmVkTG9ja0Z1bmN0aW9uQXR0ciAqU0xGIAotICAgICAgICAgICAgICAgPSBkeW5fY2FzdDxTaGFyZWRMb2NrRnVuY3Rpb25BdHRyPigqQSkpCi0gICAgICBBcmdzID0gQXJyYXlSZWY8RXhwciAqPihTTEYtPmFyZ3NfYmVnaW4oKSwgU0xGLT5hcmdzX3NpemUoKSk7Ci0gICAgZWxzZSBpZiAoRXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0ciAqRVRMRgotICAgICAgICAgICAgICAgPSBkeW5fY2FzdDxFeGNsdXNpdmVUcnlsb2NrRnVuY3Rpb25BdHRyPigqQSkpIHsKKyAgICBlbHNlIGlmIChjb25zdCBhdXRvICpFVExGID0gZHluX2Nhc3Q8RXhjbHVzaXZlVHJ5bG9ja0Z1bmN0aW9uQXR0cj4oQSkpIHsKICAgICAgIEFyZyA9IEVUTEYtPmdldFN1Y2Nlc3NWYWx1ZSgpOwogICAgICAgQXJncyA9IEFycmF5UmVmPEV4cHIgKj4oRVRMRi0+YXJnc19iZWdpbigpLCBFVExGLT5hcmdzX3NpemUoKSk7Ci0gICAgfSBlbHNlIGlmIChTaGFyZWRUcnlsb2NrRnVuY3Rpb25BdHRyICpTVExGCi0gICAgICAgICAgICAgICAgID0gZHluX2Nhc3Q8U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0cj4oKkEpKSB7CisgICAgfSBlbHNlIGlmIChjb25zdCBhdXRvICpTVExGID0gZHluX2Nhc3Q8U2hhcmVkVHJ5bG9ja0Z1bmN0aW9uQXR0cj4oQSkpIHsKICAgICAgIEFyZyA9IFNUTEYtPmdldFN1Y2Nlc3NWYWx1ZSgpOwogICAgICAgQXJncyA9IEFycmF5UmVmPEV4cHIgKj4oU1RMRi0+YXJnc19iZWdpbigpLCBTVExGLT5hcmdzX3NpemUoKSk7Ci0gICAgfSBlbHNlIGlmIChVbmxvY2tGdW5jdGlvbkF0dHIgKlVGID0gZHluX2Nhc3Q8VW5sb2NrRnVuY3Rpb25BdHRyPigqQSkpCi0gICAgICBBcmdzID0gQXJyYXlSZWY8RXhwciAqPihVRi0+YXJnc19iZWdpbigpLCBVRi0+YXJnc19zaXplKCkpOwotICAgIGVsc2UgaWYgKExvY2tSZXR1cm5lZEF0dHIgKkxSID0gZHluX2Nhc3Q8TG9ja1JldHVybmVkQXR0cj4oKkEpKQorICAgIH0gZWxzZSBpZiAoY29uc3QgYXV0byAqTFIgPSBkeW5fY2FzdDxMb2NrUmV0dXJuZWRBdHRyPihBKSkKICAgICAgIEFyZyA9IExSLT5nZXRBcmcoKTsKLSAgICBlbHNlIGlmIChMb2Nrc0V4Y2x1ZGVkQXR0ciAqTEUgPSBkeW5fY2FzdDxMb2Nrc0V4Y2x1ZGVkQXR0cj4oKkEpKQorICAgIGVsc2UgaWYgKGNvbnN0IGF1dG8gKkxFID0gZHluX2Nhc3Q8TG9ja3NFeGNsdWRlZEF0dHI+KEEpKQogICAgICAgQXJncyA9IEFycmF5UmVmPEV4cHIgKj4oTEUtPmFyZ3NfYmVnaW4oKSwgTEUtPmFyZ3Nfc2l6ZSgpKTsKLSAgICBlbHNlIGlmIChFeGNsdXNpdmVMb2Nrc1JlcXVpcmVkQXR0ciAqRUxSIAotICAgICAgICAgICAgICAgPSBkeW5fY2FzdDxFeGNsdXNpdmVMb2Nrc1JlcXVpcmVkQXR0cj4oKkEpKQotICAgICAgQXJncyA9IEFycmF5UmVmPEV4cHIgKj4oRUxSLT5hcmdzX2JlZ2luKCksIEVMUi0+YXJnc19zaXplKCkpOwotICAgIGVsc2UgaWYgKFNoYXJlZExvY2tzUmVxdWlyZWRBdHRyICpTTFIgCi0gICAgICAgICAgICAgICA9IGR5bl9jYXN0PFNoYXJlZExvY2tzUmVxdWlyZWRBdHRyPigqQSkpCi0gICAgICBBcmdzID0gQXJyYXlSZWY8RXhwciAqPihTTFItPmFyZ3NfYmVnaW4oKSwgU0xSLT5hcmdzX3NpemUoKSk7CisgICAgZWxzZSBpZiAoY29uc3QgYXV0byAqUkMgPSBkeW5fY2FzdDxSZXF1aXJlc0NhcGFiaWxpdHlBdHRyPihBKSkKKyAgICAgIEFyZ3MgPSBBcnJheVJlZjxFeHByICo+KFJDLT5hcmdzX2JlZ2luKCksIFJDLT5hcmdzX3NpemUoKSk7CisgICAgZWxzZSBpZiAoY29uc3QgYXV0byAqQUMgPSBkeW5fY2FzdDxBY3F1aXJlQ2FwYWJpbGl0eUF0dHI+KEEpKQorICAgICAgQXJncyA9IEFycmF5UmVmPEV4cHIgKj4oQUMtPmFyZ3NfYmVnaW4oKSwgQUMtPmFyZ3Nfc2l6ZSgpKTsKKyAgICBlbHNlIGlmIChjb25zdCBhdXRvICpBQyA9IGR5bl9jYXN0PFRyeUFjcXVpcmVDYXBhYmlsaXR5QXR0cj4oQSkpCisgICAgICBBcmdzID0gQXJyYXlSZWY8RXhwciAqPihBQy0+YXJnc19iZWdpbigpLCBBQy0+YXJnc19zaXplKCkpOworICAgIGVsc2UgaWYgKGNvbnN0IGF1dG8gKlJDID0gZHluX2Nhc3Q8UmVsZWFzZUNhcGFiaWxpdHlBdHRyPihBKSkKKyAgICAgIEFyZ3MgPSBBcnJheVJlZjxFeHByICo+KFJDLT5hcmdzX2JlZ2luKCksIFJDLT5hcmdzX3NpemUoKSk7CiAKICAgICBpZiAoQXJnICYmICFGaW5kZXIuVHJhdmVyc2VTdG10KEFyZykpCiAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEyODAxLDExICsxMjg0MSw5IEBACiAgICAgUHJldkRlY2wgPSAwOwogCiAgIFNvdXJjZUxvY2F0aW9uIFRTU0wgPSBELmdldExvY1N0YXJ0KCk7Ci0gIE1TUHJvcGVydHlEZWNsICpOZXdQRDsKICAgY29uc3QgQXR0cmlidXRlTGlzdDo6UHJvcGVydHlEYXRhICZEYXRhID0gTVNQcm9wZXJ0eUF0dHItPmdldFByb3BlcnR5RGF0YSgpOwotICBOZXdQRCA9IG5ldyAoQ29udGV4dCkgTVNQcm9wZXJ0eURlY2woUmVjb3JkLCBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSSwgVCwgVEluZm8sIFRTU0wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkdldHRlcklkLCBEYXRhLlNldHRlcklkKTsKKyAgTVNQcm9wZXJ0eURlY2wgKk5ld1BEID0gTVNQcm9wZXJ0eURlY2w6OkNyZWF0ZSgKKyAgICAgIENvbnRleHQsIFJlY29yZCwgTG9jLCBJSSwgVCwgVEluZm8sIFRTU0wsIERhdGEuR2V0dGVySWQsIERhdGEuU2V0dGVySWQpOwogICBQcm9jZXNzRGVjbEF0dHJpYnV0ZXMoVFVTY29wZSwgTmV3UEQsIEQpOwogICBOZXdQRC0+c2V0QWNjZXNzKEFTKTsKIApkaWZmIC0tZ2l0IGEvbGliL1NlbWEvU2VtYURlY2xPYmpDLmNwcCBiL2xpYi9TZW1hL1NlbWFEZWNsT2JqQy5jcHAKaW5kZXggZjQ0ZmIzMi4uZDU5ZGQ4YiAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYURlY2xPYmpDLmNwcAorKysgYi9saWIvU2VtYS9TZW1hRGVjbE9iakMuY3BwCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnN1bWVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnRleHQuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUTXV0YXRpb25MaXN0ZW5lci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9EYXRhUmVjdXJzaXZlQVNUVmlzaXRvci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsT2JqQy5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJPYmpDLmgiCkBAIC00OCw4ICs0OSw4IEBACiAKICAgLy8gV2UgaWdub3JlIHByb3RvY29scyBoZXJlLiAgU2hvdWxkIHdlPyAgV2hhdCBhYm91dCBDbGFzcz8KIAotICBjb25zdCBPYmpDT2JqZWN0VHlwZSAqcmVzdWx0ID0gbWV0aG9kLT5nZXRSZXN1bHRUeXBlKCkKLSAgICAtPmNhc3RBczxPYmpDT2JqZWN0UG9pbnRlclR5cGU+KCktPmdldE9iamVjdFR5cGUoKTsKKyAgY29uc3QgT2JqQ09iamVjdFR5cGUgKnJlc3VsdCA9CisgICAgICBtZXRob2QtPmdldFJldHVyblR5cGUoKS0+Y2FzdEFzPE9iakNPYmplY3RQb2ludGVyVHlwZT4oKS0+Z2V0T2JqZWN0VHlwZSgpOwogCiAgIGlmIChyZXN1bHQtPmlzT2JqQ0lkKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CkBAIC05Nyw4ICs5OCw5IEBACiAgIC8vIElmIHdlJ3JlIGluIGEgc3lzdGVtIGhlYWRlciwgYW5kIHRoaXMgaXMgbm90IGEgY2FsbCwganVzdCBtYWtlCiAgIC8vIHRoZSBtZXRob2QgdW51c2FibGUuCiAgIGlmIChyZWNlaXZlclR5cGVJZkNhbGwuaXNOdWxsKCkgJiYgZ2V0U291cmNlTWFuYWdlcigpLmlzSW5TeXN0ZW1IZWFkZXIobG9jKSkgewotICAgIG1ldGhvZC0+YWRkQXR0cihuZXcgKENvbnRleHQpIFVuYXZhaWxhYmxlQXR0cihsb2MsIENvbnRleHQsCi0gICAgICAgICAgICAgICAgImluaXQgbWV0aG9kIHJldHVybnMgYSB0eXBlIHVucmVsYXRlZCB0byBpdHMgcmVjZWl2ZXIgdHlwZSIpKTsKKyAgICBtZXRob2QtPmFkZEF0dHIoVW5hdmFpbGFibGVBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LAorICAgICAgICAgICAgICAgICJpbml0IG1ldGhvZCByZXR1cm5zIGEgdHlwZSB1bnJlbGF0ZWQgdG8gaXRzIHJlY2VpdmVyIHR5cGUiLAorICAgICAgICAgICAgICAgIGxvYykpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTExNiwxMCArMTE4LDEwIEBACiAgICAgLy8gaW1wbGllcyBhIHJlbGF0ZWQgcmVzdWx0IHR5cGUsIGFuZCB0aGUgb3JpZ2luYWwgKG92ZXJyaWRkZW4pIG1ldGhvZCBoYXMKICAgICAvLyBhIHN1aXRhYmxlIHJldHVybiB0eXBlLCBidXQgdGhlIG5ldyAob3ZlcnJpZGluZykgbWV0aG9kIGRvZXMgbm90IGhhdmUKICAgICAvLyBhIHN1aXRhYmxlIHJldHVybiB0eXBlLgotICAgIFF1YWxUeXBlIFJlc3VsdFR5cGUgPSBOZXdNZXRob2QtPmdldFJlc3VsdFR5cGUoKTsKKyAgICBRdWFsVHlwZSBSZXN1bHRUeXBlID0gTmV3TWV0aG9kLT5nZXRSZXR1cm5UeXBlKCk7CiAgICAgU291cmNlUmFuZ2UgUmVzdWx0VHlwZVJhbmdlOwotICAgIGlmIChjb25zdCBUeXBlU291cmNlSW5mbyAqUmVzdWx0VHlwZUluZm8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBOZXdNZXRob2QtPmdldFJlc3VsdFR5cGVTb3VyY2VJbmZvKCkpCisgICAgaWYgKGNvbnN0IFR5cGVTb3VyY2VJbmZvICpSZXN1bHRUeXBlSW5mbyA9CisgICAgICAgICAgICBOZXdNZXRob2QtPmdldFJldHVyblR5cGVTb3VyY2VJbmZvKCkpCiAgICAgICBSZXN1bHRUeXBlUmFuZ2UgPSBSZXN1bHRUeXBlSW5mby0+Z2V0VHlwZUxvYygpLmdldFNvdXJjZVJhbmdlKCk7CiAgICAgCiAgICAgLy8gRmlndXJlIG91dCB3aGljaCBjbGFzcyB0aGlzIG1ldGhvZCBpcyBwYXJ0IG9mLCBpZiBhbnkuCkBAIC0yMDcsMTkgKzIwOSwxOSBAQAogICAgIHJldHVybiBmYWxzZTsKIAogICBjYXNlIE9NRl9kZWFsbG9jOgotICAgIGlmICghQ29udGV4dC5oYXNTYW1lVHlwZShtZXRob2QtPmdldFJlc3VsdFR5cGUoKSwgQ29udGV4dC5Wb2lkVHkpKSB7CisgICAgaWYgKCFDb250ZXh0Lmhhc1NhbWVUeXBlKG1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpLCBDb250ZXh0LlZvaWRUeSkpIHsKICAgICAgIFNvdXJjZVJhbmdlIFJlc3VsdFR5cGVSYW5nZTsKLSAgICAgIGlmIChjb25zdCBUeXBlU291cmNlSW5mbyAqUmVzdWx0VHlwZUluZm8KLSAgICAgICAgICA9IG1ldGhvZC0+Z2V0UmVzdWx0VHlwZVNvdXJjZUluZm8oKSkKKyAgICAgIGlmIChjb25zdCBUeXBlU291cmNlSW5mbyAqUmVzdWx0VHlwZUluZm8gPQorICAgICAgICAgICAgICBtZXRob2QtPmdldFJldHVyblR5cGVTb3VyY2VJbmZvKCkpCiAgICAgICAgIFJlc3VsdFR5cGVSYW5nZSA9IFJlc3VsdFR5cGVJbmZvLT5nZXRUeXBlTG9jKCkuZ2V0U291cmNlUmFuZ2UoKTsKICAgICAgIGlmIChSZXN1bHRUeXBlUmFuZ2UuaXNJbnZhbGlkKCkpCi0gICAgICAgIERpYWcobWV0aG9kLT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJvcl9kZWFsbG9jX2JhZF9yZXN1bHRfdHlwZSkgCi0gICAgICAgICAgPDwgbWV0aG9kLT5nZXRSZXN1bHRUeXBlKCkgCi0gICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24obWV0aG9kLT5nZXRTZWxlY3RvckxvYygwKSwgIih2b2lkKSIpOworICAgICAgICBEaWFnKG1ldGhvZC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyb3JfZGVhbGxvY19iYWRfcmVzdWx0X3R5cGUpCisgICAgICAgICAgICA8PCBtZXRob2QtPmdldFJldHVyblR5cGUoKQorICAgICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24obWV0aG9kLT5nZXRTZWxlY3RvckxvYygwKSwgIih2b2lkKSIpOwogICAgICAgZWxzZQotICAgICAgICBEaWFnKG1ldGhvZC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyb3JfZGVhbGxvY19iYWRfcmVzdWx0X3R5cGUpIAotICAgICAgICAgIDw8IG1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpIAotICAgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlUmVwbGFjZW1lbnQoUmVzdWx0VHlwZVJhbmdlLCAidm9pZCIpOworICAgICAgICBEaWFnKG1ldGhvZC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyb3JfZGVhbGxvY19iYWRfcmVzdWx0X3R5cGUpCisgICAgICAgICAgICA8PCBtZXRob2QtPmdldFJldHVyblR5cGUoKQorICAgICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVSZXBsYWNlbWVudChSZXN1bHRUeXBlUmFuZ2UsICJ2b2lkIik7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjI5LDggKzIzMSw3IEBACiAgICAgaWYgKGNoZWNrSW5pdE1ldGhvZChtZXRob2QsIFF1YWxUeXBlKCkpKQogICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICBtZXRob2QtPmFkZEF0dHIobmV3IChDb250ZXh0KSBOU0NvbnN1bWVzU2VsZkF0dHIoU291cmNlTG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCkpOworICAgIG1ldGhvZC0+YWRkQXR0cihOU0NvbnN1bWVzU2VsZkF0dHI6OkNyZWF0ZUltcGxpY2l0KENvbnRleHQpKTsKIAogICAgIC8vIERvbid0IGFkZCBhIHNlY29uZCBjb3B5IG9mIHRoaXMgYXR0cmlidXRlLCBidXQgb3RoZXJ3aXNlIGRvbid0CiAgICAgLy8gbGV0IGl0IGJlIHN1cHByZXNzZWQuCkBAIC0yNDksOCArMjUwLDcgQEAKICAgICBicmVhazsKICAgfQogCi0gIG1ldGhvZC0+YWRkQXR0cihuZXcgKENvbnRleHQpIE5TUmV0dXJuc1JldGFpbmVkQXR0cihTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCkpOworICBtZXRob2QtPmFkZEF0dHIoTlNSZXR1cm5zUmV0YWluZWRBdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0KSk7CiAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtMzI5LDE3ICszMjksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2tQYXJhbWV0ZXJOYW1lcz0qL2ZhbHNlKTsKIAogICAvLyBJbnRyb2R1Y2UgYWxsIG9mIHRoZSBvdGhlciBwYXJhbWV0ZXJzIGludG8gdGhpcyBzY29wZS4KLSAgZm9yIChPYmpDTWV0aG9kRGVjbDo6cGFyYW1faXRlcmF0b3IgUEkgPSBNRGVjbC0+cGFyYW1fYmVnaW4oKSwKLSAgICAgICBFID0gTURlY2wtPnBhcmFtX2VuZCgpOyBQSSAhPSBFOyArK1BJKSB7Ci0gICAgUGFybVZhckRlY2wgKlBhcmFtID0gKCpQSSk7CisgIGZvciAoYXV0byAqUGFyYW0gOiBNRGVjbC0+cGFyYW1zKCkpIHsKICAgICBpZiAoIVBhcmFtLT5pc0ludmFsaWREZWNsKCkgJiYKICAgICAgICAgZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50ICYmCiAgICAgICAgICFIYXNFeHBsaWNpdE93bmVyc2hpcEF0dHIoKnRoaXMsIFBhcmFtKSkKICAgICAgIERpYWcoUGFyYW0tPmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5fYXJjX3N0cm9uZ19wb2ludGVyX29iamNfcG9pbnRlcikgPDwKICAgICAgICAgICAgIFBhcmFtLT5nZXRUeXBlKCk7CiAgICAgCi0gICAgaWYgKCgqUEkpLT5nZXRJZGVudGlmaWVyKCkpCi0gICAgICBQdXNoT25TY29wZUNoYWlucygqUEksIEZuQm9keVNjb3BlKTsKKyAgICBpZiAoUGFyYW0tPmdldElkZW50aWZpZXIoKSkKKyAgICAgIFB1c2hPblNjb3BlQ2hhaW5zKFBhcmFtLCBGbkJvZHlTY29wZSk7CiAgIH0KIAogICAvLyBJbiBBUkMsIGRpc2FsbG93IGRlZmluaXRpb24gb2YgcmV0YWluL3JlbGVhc2UvYXV0b3JlbGVhc2UvcmV0YWluQ291bnQKQEAgLTM4MSw4ICszNzksMTMgQEAKICAgICAgIE9iakNJbXBsRGVjbCAqSW1wbERlY2xPZk1ldGhvZERlY2wgPSAwOwogICAgICAgaWYgKE9iakNJbnRlcmZhY2VEZWNsICpPSUQgPSBkeW5fY2FzdDxPYmpDSW50ZXJmYWNlRGVjbD4oQ29udERlY2xPZk1ldGhvZERlY2wpKQogICAgICAgICBJbXBsRGVjbE9mTWV0aG9kRGVjbCA9IE9JRC0+Z2V0SW1wbGVtZW50YXRpb24oKTsKLSAgICAgIGVsc2UgaWYgKE9iakNDYXRlZ29yeURlY2wgKkNEID0gZHluX2Nhc3Q8T2JqQ0NhdGVnb3J5RGVjbD4oQ29udERlY2xPZk1ldGhvZERlY2wpKQotICAgICAgICBJbXBsRGVjbE9mTWV0aG9kRGVjbCA9IENELT5nZXRJbXBsZW1lbnRhdGlvbigpOworICAgICAgZWxzZSBpZiAoT2JqQ0NhdGVnb3J5RGVjbCAqQ0QgPSBkeW5fY2FzdDxPYmpDQ2F0ZWdvcnlEZWNsPihDb250RGVjbE9mTWV0aG9kRGVjbCkpIHsKKyAgICAgICAgaWYgKENELT5Jc0NsYXNzRXh0ZW5zaW9uKCkpIHsKKyAgICAgICAgICBpZiAoT2JqQ0ludGVyZmFjZURlY2wgKk9JRCA9IENELT5nZXRDbGFzc0ludGVyZmFjZSgpKQorICAgICAgICAgICAgSW1wbERlY2xPZk1ldGhvZERlY2wgPSBPSUQtPmdldEltcGxlbWVudGF0aW9uKCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgSW1wbERlY2xPZk1ldGhvZERlY2wgPSBDRC0+Z2V0SW1wbGVtZW50YXRpb24oKTsKKyAgICAgIH0KICAgICAgIC8vIE5vIG5lZWQgdG8gaXNzdWUgZGVwcmVjYXRlZCB3YXJuaW5nIGlmIGRlcHJlY2F0ZWQgbWVob2QgaW4gY2xhc3MvY2F0ZWdvcnkKICAgICAgIC8vIGlzIGJlaW5nIGltcGxlbWVudGVkIGluIGl0cyBvd24gaW1wbGVtZW50YXRpb24gKG5vIG92ZXJyaWRpbmcgaXMgaW52b2x2ZWQpLgogICAgICAgaWYgKCFJbXBsRGVjbE9mTWV0aG9kRGVjbCB8fCBJbXBsRGVjbE9mTWV0aG9kRGVjbCAhPSBJbXBsRGVjbE9mTWV0aG9kRGVmKQpAQCAtMzkxLDYgKzM5NCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTURlY2wtPmdldExvY2F0aW9uKCksIDApOwogICAgIH0KIAorICAgIGlmIChNRGVjbC0+Z2V0TWV0aG9kRmFtaWx5KCkgPT0gT01GX2luaXQpIHsKKyAgICAgIGlmIChNRGVjbC0+aXNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJGb3JUaGVJbnRlcmZhY2UoKSkgeworICAgICAgICBnZXRDdXJGdW5jdGlvbigpLT5PYmpDSXNEZXNpZ25hdGVkSW5pdCA9IHRydWU7CisgICAgICAgIGdldEN1ckZ1bmN0aW9uKCktPk9iakNXYXJuRm9yTm9EZXNpZ25hdGVkSW5pdENoYWluID0KKyAgICAgICAgICAgIElDLT5nZXRTdXBlckNsYXNzKCkgIT0gMDsKKyAgICAgIH0gZWxzZSBpZiAoSUMtPmhhc0Rlc2lnbmF0ZWRJbml0aWFsaXplcnMoKSkgeworICAgICAgICBnZXRDdXJGdW5jdGlvbigpLT5PYmpDSXNTZWNvbmRhcnlJbml0ID0gdHJ1ZTsKKyAgICAgICAgZ2V0Q3VyRnVuY3Rpb24oKS0+T2JqQ1dhcm5Gb3JOb0luaXREZWxlZ2F0aW9uID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKICAgICAvLyBJZiB0aGlzIGlzICJkZWFsbG9jIiBvciAiZmluYWxpemUiLCBzZXQgc29tZSBiaXQgaGVyZS4KICAgICAvLyBUaGVuIGluIEFjdE9uU3VwZXJNZXNzYWdlKCkgKFNlbWFFeHByT2JqQyksIHNldCBpdCBiYWNrIHRvIGZhbHNlLgogICAgIC8vIEZpbmFsbHksIGluIEFjdE9uRmluaXNoRnVuY3Rpb25Cb2R5KCkgKFNlbWFEZWNsKSwgd2FybiBpZiBmbGFnIGlzIHNldC4KQEAgLTQyOCw3ICs0NDIsNyBAQAogICBleHBsaWNpdCBPYmpDSW50ZXJmYWNlVmFsaWRhdG9yQ0NDKE9iakNJbnRlcmZhY2VEZWNsICpJRGVjbCkKICAgICAgIDogQ3VycmVudElEZWNsKElEZWNsKSB7fQogCi0gIHZpcnR1YWwgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSB7CisgIGJvb2wgVmFsaWRhdGVDYW5kaWRhdGUoY29uc3QgVHlwb0NvcnJlY3Rpb24gJmNhbmRpZGF0ZSkgb3ZlcnJpZGUgewogICAgIE9iakNJbnRlcmZhY2VEZWNsICpJRCA9IGNhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uRGVjbEFzPE9iakNJbnRlcmZhY2VEZWNsPigpOwogICAgIHJldHVybiBJRCAmJiAhZGVjbGFyZXNTYW1lRW50aXR5KElELCBDdXJyZW50SURlY2wpOwogICB9CkBAIC02MDcsOSArNjIxLDggQEAKICAgICBRdWFsVHlwZSBUID0gVERlY2wtPmdldFVuZGVybHlpbmdUeXBlKCk7CiAgICAgaWYgKFQtPmlzT2JqQ09iamVjdFR5cGUoKSkKICAgICAgIGlmIChjb25zdCBPYmpDT2JqZWN0VHlwZSAqT1BUID0gVC0+Z2V0QXM8T2JqQ09iamVjdFR5cGU+KCkpCi0gICAgICAgIGZvciAoT2JqQ09iamVjdFR5cGU6OnF1YWxfaXRlcmF0b3IgSSA9IE9QVC0+cXVhbF9iZWdpbigpLAotICAgICAgICAgICAgIEUgPSBPUFQtPnF1YWxfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgICAgICAgIFByb3RvY29sUmVmcy5wdXNoX2JhY2soKkkpOworICAgICAgICBmb3IgKGF1dG8gKkkgOiBPUFQtPnF1YWxzKCkpCisgICAgICAgICAgUHJvdG9jb2xSZWZzLnB1c2hfYmFjayhJKTsKICAgfQogfQogCkBAIC03NTEsNiArNzY0LDIxIEBACiAgIHJldHVybiBBY3RPbk9iakNDb250YWluZXJTdGFydERlZmluaXRpb24oUERlY2wpOwogfQogCitzdGF0aWMgYm9vbCBOZXN0ZWRQcm90b2NvbEhhc05vRGVmaW5pdGlvbihPYmpDUHJvdG9jb2xEZWNsICpQRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNQcm90b2NvbERlY2wgKiZVbmRlZmluZWRQcm90b2NvbCkgeworICBpZiAoIVBEZWNsLT5oYXNEZWZpbml0aW9uKCkgfHwgUERlY2wtPmdldERlZmluaXRpb24oKS0+aXNIaWRkZW4oKSkgeworICAgIFVuZGVmaW5lZFByb3RvY29sID0gUERlY2w7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIGZvciAoYXV0byAqUEkgOiBQRGVjbC0+cHJvdG9jb2xzKCkpCisgICAgaWYgKE5lc3RlZFByb3RvY29sSGFzTm9EZWZpbml0aW9uKFBJLCBVbmRlZmluZWRQcm90b2NvbCkpIHsKKyAgICAgIFVuZGVmaW5lZFByb3RvY29sID0gUEk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIHJldHVybiBmYWxzZTsKK30KKwogLy8vIEZpbmRQcm90b2NvbERlY2xhcmF0aW9uIC0gVGhpcyByb3V0aW5lIGxvb2tzIHVwIHByb3RvY29scyBhbmQKIC8vLyBpc3N1ZXMgYW4gZXJyb3IgaWYgdGhleSBhcmUgbm90IGRlY2xhcmVkLiBJdCByZXR1cm5zIGxpc3Qgb2YKIC8vLyBwcm90b2NvbCBkZWNsYXJhdGlvbnMgaW4gaXRzICdQcm90b2NvbHMnIGFyZ3VtZW50LgpAQCAtNzg2LDEwICs4MTQsMTUgQEAKICAgICAvLyBJZiB0aGlzIGlzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBhbmQgd2UgYXJlIHN1cHBvc2VkIHRvIHdhcm4gaW4gdGhpcwogICAgIC8vIGNhc2UsIGRvIGl0LgogICAgIC8vIEZJWE1FOiBSZWNvdmVyIG5pY2VseSBpbiB0aGUgaGlkZGVuIGNhc2UuCisgICAgT2JqQ1Byb3RvY29sRGVjbCAqVW5kZWZpbmVkUHJvdG9jb2w7CisgICAgCiAgICAgaWYgKFdhcm5PbkRlY2xhcmF0aW9ucyAmJgotICAgICAgICAoIVBEZWNsLT5oYXNEZWZpbml0aW9uKCkgfHwgUERlY2wtPmdldERlZmluaXRpb24oKS0+aXNIaWRkZW4oKSkpCisgICAgICAgIE5lc3RlZFByb3RvY29sSGFzTm9EZWZpbml0aW9uKFBEZWNsLCBVbmRlZmluZWRQcm90b2NvbCkpIHsKICAgICAgIERpYWcoUHJvdG9jb2xJZFtpXS5zZWNvbmQsIGRpYWc6Ondhcm5fdW5kZWZfcHJvdG9jb2xyZWYpCiAgICAgICAgIDw8IFByb3RvY29sSWRbaV0uZmlyc3Q7CisgICAgICBEaWFnKFVuZGVmaW5lZFByb3RvY29sLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3Byb3RvY29sX2RlY2xfdW5kZWZpbmVkKQorICAgICAgICA8PCBVbmRlZmluZWRQcm90b2NvbDsKKyAgICB9CiAgICAgUHJvdG9jb2xzLnB1c2hfYmFjayhQRGVjbCk7CiAgIH0KIH0KQEAgLTgwMywxOSArODM2LDE2IEBACiAgICAgcmV0dXJuOyAgLy8gUG9zc2libHkgZHVlIHRvIHByZXZpb3VzIGVycm9yCiAKICAgbGx2bTo6RGVuc2VNYXA8U2VsZWN0b3IsIGNvbnN0IE9iakNNZXRob2REZWNsKj4gTWV0aG9kTWFwOwotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjptZXRob2RfaXRlcmF0b3IgaSA9IElELT5tZXRoX2JlZ2luKCksCi0gICAgICAgZSA9ICBJRC0+bWV0aF9lbmQoKTsgaSAhPSBlOyArK2kpIHsKLSAgICBPYmpDTWV0aG9kRGVjbCAqTUQgPSAqaTsKKyAgZm9yIChhdXRvICpNRCA6IElELT5tZXRob2RzKCkpCiAgICAgTWV0aG9kTWFwW01ELT5nZXRTZWxlY3RvcigpXSA9IE1EOwotICB9CiAKICAgaWYgKE1ldGhvZE1hcC5lbXB0eSgpKQogICAgIHJldHVybjsKLSAgZm9yIChPYmpDQ2F0ZWdvcnlEZWNsOjptZXRob2RfaXRlcmF0b3IgaSA9IENBVC0+bWV0aF9iZWdpbigpLAotICAgICAgIGUgPSAgQ0FULT5tZXRoX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgIE9iakNNZXRob2REZWNsICpNZXRob2QgPSAqaTsKKyAgZm9yIChjb25zdCBhdXRvICpNZXRob2QgOiBDQVQtPm1ldGhvZHMoKSkgewogICAgIGNvbnN0IE9iakNNZXRob2REZWNsIComUHJldk1ldGhvZCA9IE1ldGhvZE1hcFtNZXRob2QtPmdldFNlbGVjdG9yKCldOwotICAgIGlmIChQcmV2TWV0aG9kICYmICFNYXRjaFR3b01ldGhvZERlY2xhcmF0aW9ucyhNZXRob2QsIFByZXZNZXRob2QpKSB7CisgICAgaWYgKFByZXZNZXRob2QgJiYKKyAgICAgICAgKFByZXZNZXRob2QtPmlzSW5zdGFuY2VNZXRob2QoKSA9PSBNZXRob2QtPmlzSW5zdGFuY2VNZXRob2QoKSkgJiYKKyAgICAgICAgIU1hdGNoVHdvTWV0aG9kRGVjbGFyYXRpb25zKE1ldGhvZCwgUHJldk1ldGhvZCkpIHsKICAgICAgIERpYWcoTWV0aG9kLT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfZHVwbGljYXRlX21ldGhvZF9kZWNsKQogICAgICAgICAgICAgPDwgTWV0aG9kLT5nZXREZWNsTmFtZSgpOwogICAgICAgRGlhZyhQcmV2TWV0aG9kLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3ByZXZpb3VzX2RlY2xhcmF0aW9uKTsKQEAgLTExNTQsMTEgKzExODQsNyBAQAogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KICAgICAgIC8vIENoZWNrIGNsYXNzIGV4dGVuc2lvbnMgKHVubmFtZWQgY2F0ZWdvcmllcykgZm9yIGR1cGxpY2F0ZSBpdmFycy4KLSAgICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnZpc2libGVfZXh0ZW5zaW9uc19pdGVyYXRvcgotICAgICAgICAgICBFeHQgPSBJRGVjbC0+dmlzaWJsZV9leHRlbnNpb25zX2JlZ2luKCksCi0gICAgICAgICAgIEV4dEVuZCA9IElEZWNsLT52aXNpYmxlX2V4dGVuc2lvbnNfZW5kKCk7Ci0gICAgICAgICBFeHQgIT0gRXh0RW5kOyArK0V4dCkgewotICAgICAgICBPYmpDQ2F0ZWdvcnlEZWNsICpDRGVjbCA9ICpFeHQ7CisgICAgICBmb3IgKGNvbnN0IGF1dG8gKkNEZWNsIDogSURlY2wtPnZpc2libGVfZXh0ZW5zaW9ucygpKSB7CiAgICAgICAgIGlmIChjb25zdCBPYmpDSXZhckRlY2wgKkNsc0V4dEl2YXIgPSAKICAgICAgICAgICAgIENEZWNsLT5nZXRJdmFyRGVjbChJbXBsSXZhci0+Z2V0SWRlbnRpZmllcigpKSkgewogICAgICAgICAgIERpYWcoSW1wbEl2YXItPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9kdXBsaWNhdGVfaXZhcl9kZWNsYXJhdGlvbik7IApAQCAtMTIwOSwxMyArMTIzNSwxNiBAQAogICB9CiAKICAgaWYgKG51bUl2YXJzID4gMCkKLSAgICBEaWFnKGl2YXJzW2pdLT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfaW5jb25zaXN0YW50X2l2YXJfY291bnQpOworICAgIERpYWcoaXZhcnNbal0tPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9pbmNvbnNpc3RlbnRfaXZhcl9jb3VudCk7CiAgIGVsc2UgaWYgKElWSSAhPSBJVkUpCi0gICAgRGlhZyhJVkktPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9pbmNvbnNpc3RhbnRfaXZhcl9jb3VudCk7CisgICAgRGlhZyhJVkktPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9pbmNvbnNpc3RlbnRfaXZhcl9jb3VudCk7CiB9CiAKLXZvaWQgU2VtYTo6V2FyblVuZGVmaW5lZE1ldGhvZChTb3VyY2VMb2NhdGlvbiBJbXBMb2MsIE9iakNNZXRob2REZWNsICptZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSW5jb21wbGV0ZUltcGwsIHVuc2lnbmVkIERpYWdJRCkgeworc3RhdGljIHZvaWQgV2FyblVuZGVmaW5lZE1ldGhvZChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBJbXBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICptZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkluY29tcGxldGVJbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaWFnSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqTmVlZGVkRm9yID0gMCkgewogICAvLyBObyBwb2ludCB3YXJuaW5nIG5vIGRlZmluaXRpb24gb2YgbWV0aG9kIHdoaWNoIGlzICd1bmF2YWlsYWJsZScuCiAgIHN3aXRjaCAobWV0aG9kLT5nZXRBdmFpbGFiaWxpdHkoKSkgewogICBjYXNlIEFSX0F2YWlsYWJsZToKQEAgLTEyMzMsMTMgKzEyNjIsMTcgQEAKICAgLy8gd2FybmluZywgYnV0IHNvbWUgdXNlcnMgc3Ryb25nbHkgdm9pY2VkIHRoYXQgdGhleSB3b3VsZCBwcmVmZXIKICAgLy8gc2VwYXJhdGUgd2FybmluZ3MuICBXZSB3aWxsIGdpdmUgdGhhdCBhcHByb2FjaCBhIHRyeSwgYXMgdGhhdAogICAvLyBtYXRjaGVzIHdoYXQgd2UgZG8gd2l0aCBwcm90b2NvbHMuCi0gIAotICBEaWFnKEltcExvYywgRGlhZ0lEKSA8PCBtZXRob2QtPmdldERlY2xOYW1lKCk7CisgIHsKKyAgICBjb25zdCBTZW1hOjpTZW1hRGlhZ25vc3RpY0J1aWxkZXIgJkIgPSBTLkRpYWcoSW1wTG9jLCBEaWFnSUQpOworICAgIEIgPDwgbWV0aG9kOworICAgIGlmIChOZWVkZWRGb3IpCisgICAgICBCIDw8IE5lZWRlZEZvcjsKKyAgfQogCiAgIC8vIElzc3VlIGEgbm90ZSB0byB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24uCiAgIFNvdXJjZUxvY2F0aW9uIE1ldGhvZExvYyA9IG1ldGhvZC0+Z2V0TG9jU3RhcnQoKTsKICAgaWYgKE1ldGhvZExvYy5pc1ZhbGlkKCkpCi0gICAgRGlhZyhNZXRob2RMb2MsIGRpYWc6Om5vdGVfbWV0aG9kX2RlY2xhcmVkX2F0KSA8PCBtZXRob2Q7CisgICAgUy5EaWFnKE1ldGhvZExvYywgZGlhZzo6bm90ZV9tZXRob2RfZGVjbGFyZWRfYXQpIDw8IG1ldGhvZDsKIH0KIAogLy8vIERldGVybWluZXMgaWYgdHlwZSBCIGNhbiBiZSBzdWJzdGl0dXRlZCBmb3IgdHlwZSBBLiAgUmV0dXJucyB0cnVlIGlmIHdlIGNhbgpAQCAtMTMyMywyMSArMTM1NiwyMSBAQAogICAgICAgKE1ldGhvZERlY2wtPmdldE9iakNEZWNsUXVhbGlmaWVyKCkgIT0KICAgICAgICBNZXRob2RJbXBsLT5nZXRPYmpDRGVjbFF1YWxpZmllcigpKSkgewogICAgIGlmIChXYXJuKSB7Ci0gICAgICAgIFMuRGlhZyhNZXRob2RJbXBsLT5nZXRMb2NhdGlvbigpLCAKLSAgICAgICAgICAgICAgIChJc092ZXJyaWRpbmdNb2RlID8gCi0gICAgICAgICAgICAgICAgIGRpYWc6Ondhcm5fY29uZmxpY3Rpbmdfb3ZlcnJpZGluZ19yZXRfdHlwZV9tb2RpZmllcnMgCi0gICAgICAgICAgICAgICAgIDogZGlhZzo6d2Fybl9jb25mbGljdGluZ19yZXRfdHlwZV9tb2RpZmllcnMpKQorICAgICAgUy5EaWFnKE1ldGhvZEltcGwtPmdldExvY2F0aW9uKCksCisgICAgICAgICAgICAgKElzT3ZlcnJpZGluZ01vZGUKKyAgICAgICAgICAgICAgICAgID8gZGlhZzo6d2Fybl9jb25mbGljdGluZ19vdmVycmlkaW5nX3JldF90eXBlX21vZGlmaWVycworICAgICAgICAgICAgICAgICAgOiBkaWFnOjp3YXJuX2NvbmZsaWN0aW5nX3JldF90eXBlX21vZGlmaWVycykpCiAgICAgICAgICAgPDwgTWV0aG9kSW1wbC0+Z2V0RGVjbE5hbWUoKQotICAgICAgICAgIDw8IGdldFR5cGVSYW5nZShNZXRob2RJbXBsLT5nZXRSZXN1bHRUeXBlU291cmNlSW5mbygpKTsKLSAgICAgICAgUy5EaWFnKE1ldGhvZERlY2wtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJldmlvdXNfZGVjbGFyYXRpb24pCi0gICAgICAgICAgPDwgZ2V0VHlwZVJhbmdlKE1ldGhvZERlY2wtPmdldFJlc3VsdFR5cGVTb3VyY2VJbmZvKCkpOworICAgICAgICAgIDw8IGdldFR5cGVSYW5nZShNZXRob2RJbXBsLT5nZXRSZXR1cm5UeXBlU291cmNlSW5mbygpKTsKKyAgICAgIFMuRGlhZyhNZXRob2REZWNsLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3ByZXZpb3VzX2RlY2xhcmF0aW9uKQorICAgICAgICAgIDw8IGdldFR5cGVSYW5nZShNZXRob2REZWNsLT5nZXRSZXR1cm5UeXBlU291cmNlSW5mbygpKTsKICAgICB9CiAgICAgZWxzZQogICAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIAotICBpZiAoUy5Db250ZXh0Lmhhc1NhbWVVbnF1YWxpZmllZFR5cGUoTWV0aG9kSW1wbC0+Z2V0UmVzdWx0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbC0+Z2V0UmVzdWx0VHlwZSgpKSkKKworICBpZiAoUy5Db250ZXh0Lmhhc1NhbWVVbnF1YWxpZmllZFR5cGUoTWV0aG9kSW1wbC0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbC0+Z2V0UmV0dXJuVHlwZSgpKSkKICAgICByZXR1cm4gdHJ1ZTsKICAgaWYgKCFXYXJuKQogICAgIHJldHVybiBmYWxzZTsKQEAgLTEzNDksOSArMTM4Miw5IEBACiAgIC8vIE1pc21hdGNoZXMgYmV0d2VlbiBPYmpDIHBvaW50ZXJzIGdvIGludG8gYSBkaWZmZXJlbnQgd2FybmluZwogICAvLyBjYXRlZ29yeSwgYW5kIHNvbWV0aW1lcyB0aGV5J3JlIGV2ZW4gY29tcGxldGVseSB3aGl0ZWxpc3RlZC4KICAgaWYgKGNvbnN0IE9iakNPYmplY3RQb2ludGVyVHlwZSAqSW1wbFB0clR5ID0KLSAgICAgICAgTWV0aG9kSW1wbC0+Z2V0UmVzdWx0VHlwZSgpLT5nZXRBczxPYmpDT2JqZWN0UG9pbnRlclR5cGU+KCkpIHsKKyAgICAgICAgICBNZXRob2RJbXBsLT5nZXRSZXR1cm5UeXBlKCktPmdldEFzPE9iakNPYmplY3RQb2ludGVyVHlwZT4oKSkgewogICAgIGlmIChjb25zdCBPYmpDT2JqZWN0UG9pbnRlclR5cGUgKklmYWNlUHRyVHkgPQotICAgICAgICAgIE1ldGhvZERlY2wtPmdldFJlc3VsdFR5cGUoKS0+Z2V0QXM8T2JqQ09iamVjdFBvaW50ZXJUeXBlPigpKSB7CisgICAgICAgICAgICBNZXRob2REZWNsLT5nZXRSZXR1cm5UeXBlKCktPmdldEFzPE9iakNPYmplY3RQb2ludGVyVHlwZT4oKSkgewogICAgICAgLy8gQWxsb3cgbm9uLW1hdGNoaW5nIHJldHVybiB0eXBlcyBhcyBsb25nIGFzIHRoZXkgZG9uJ3QgdmlvbGF0ZQogICAgICAgLy8gdGhlIHByaW5jaXBsZSBvZiBzdWJzdGl0dXRhYmlsaXR5LiAgU3BlY2lmaWNhbGx5LCB3ZSBwZXJtaXQKICAgICAgIC8vIHJldHVybiB0eXBlcyB0aGF0IGFyZSBzdWJjbGFzc2VzIG9mIHRoZSBkZWNsYXJlZCByZXR1cm4gdHlwZSwKQEAgLTEzNjYsMTQgKzEzOTksMTMgQEAKICAgfQogCiAgIFMuRGlhZyhNZXRob2RJbXBsLT5nZXRMb2NhdGlvbigpLCBEaWFnSUQpCi0gICAgPDwgTWV0aG9kSW1wbC0+Z2V0RGVjbE5hbWUoKQotICAgIDw8IE1ldGhvZERlY2wtPmdldFJlc3VsdFR5cGUoKQotICAgIDw8IE1ldGhvZEltcGwtPmdldFJlc3VsdFR5cGUoKQotICAgIDw8IGdldFR5cGVSYW5nZShNZXRob2RJbXBsLT5nZXRSZXN1bHRUeXBlU291cmNlSW5mbygpKTsKLSAgUy5EaWFnKE1ldGhvZERlY2wtPmdldExvY2F0aW9uKCksIAotICAgICAgICAgSXNPdmVycmlkaW5nTW9kZSA/IGRpYWc6Om5vdGVfcHJldmlvdXNfZGVjbGFyYXRpb24gCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogZGlhZzo6bm90ZV9wcmV2aW91c19kZWZpbml0aW9uKQotICAgIDw8IGdldFR5cGVSYW5nZShNZXRob2REZWNsLT5nZXRSZXN1bHRUeXBlU291cmNlSW5mbygpKTsKKyAgICAgIDw8IE1ldGhvZEltcGwtPmdldERlY2xOYW1lKCkgPDwgTWV0aG9kRGVjbC0+Z2V0UmV0dXJuVHlwZSgpCisgICAgICA8PCBNZXRob2RJbXBsLT5nZXRSZXR1cm5UeXBlKCkKKyAgICAgIDw8IGdldFR5cGVSYW5nZShNZXRob2RJbXBsLT5nZXRSZXR1cm5UeXBlU291cmNlSW5mbygpKTsKKyAgUy5EaWFnKE1ldGhvZERlY2wtPmdldExvY2F0aW9uKCksIElzT3ZlcnJpZGluZ01vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRpYWc6Om5vdGVfcHJldmlvdXNfZGVjbGFyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6Om5vdGVfcHJldmlvdXNfZGVmaW5pdGlvbikKKyAgICAgIDw8IGdldFR5cGVSYW5nZShNZXRob2REZWNsLT5nZXRSZXR1cm5UeXBlU291cmNlSW5mbygpKTsKICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC0xNTA1LDcgKzE1MzcsNyBAQAogCiAgIC8vIFRoZSBvbmx5IHJlYXNvbiB0aGVzZSBtZXRob2RzIGRvbid0IGZhbGwgd2l0aGluIHRoZWlyIGZhbWlsaWVzIGlzCiAgIC8vIGR1ZSB0byB1bnVzdWFsIHJlc3VsdCB0eXBlcy4KLSAgaWYgKHVubWF0Y2hlZC0+Z2V0UmVzdWx0VHlwZSgpLT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpKSB7CisgIGlmICh1bm1hdGNoZWQtPmdldFJldHVyblR5cGUoKS0+aXNPYmpDT2JqZWN0UG9pbnRlclR5cGUoKSkgewogICAgIHJlYXNvblNlbGVjdG9yID0gUl9VbnJlbGF0ZWRSZXR1cm47CiAgIH0gZWxzZSB7CiAgICAgcmVhc29uU2VsZWN0b3IgPSBSX05vbk9iamVjdFJldHVybjsKQEAgLTE2MTUsMTQgKzE2NDcsNDEgQEAKIC8vLyB3ZSB1c2VkIGFuIGltbXV0YWJsZSBzZXQgdG8ga2VlcCB0aGUgdGFibGUgdGhlbiBpdCB3b3VsZG4ndCBhZGQgc2lnbmlmaWNhbnQKIC8vLyBtZW1vcnkgY29zdCBhbmQgaXQgd291bGQgYmUgaGFuZHkgZm9yIGxvb2t1cHMuCiAKK3R5cGVkZWYgbGx2bTo6RGVuc2VTZXQ8SWRlbnRpZmllckluZm8qPiBQcm90b2NvbE5hbWVTZXQ7Cit0eXBlZGVmIHN0ZDo6dW5pcXVlX3B0cjxQcm90b2NvbE5hbWVTZXQ+IExhenlQcm90b2NvbE5hbWVTZXQ7CisKK3N0YXRpYyB2b2lkIGZpbmRQcm90b2NvbHNXaXRoRXhwbGljaXRJbXBscyhjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbE5hbWVTZXQgJlBOUykgeworICBpZiAoUERlY2wtPmhhc0F0dHI8T2JqQ0V4cGxpY2l0UHJvdG9jb2xJbXBsQXR0cj4oKSkKKyAgICBQTlMuaW5zZXJ0KFBEZWNsLT5nZXRJZGVudGlmaWVyKCkpOworICBmb3IgKGNvbnN0IGF1dG8gKlBJIDogUERlY2wtPnByb3RvY29scygpKQorICAgIGZpbmRQcm90b2NvbHNXaXRoRXhwbGljaXRJbXBscyhQSSwgUE5TKTsKK30KKworLy8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlcyBhIHNldCB3aXRoIGFsbCBjb25mb3JtZWQgcHJvdG9jb2xzIGluIGEgY2xhc3MKKy8vLyBoaWVyYXJjaHkgdGhhdCBoYXZlIHRoZSAnb2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbicKKy8vLyBhdHRyaWJ1dGUuCitzdGF0aWMgdm9pZCBmaW5kUHJvdG9jb2xzV2l0aEV4cGxpY2l0SW1wbHMoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKlN1cGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sTmFtZVNldCAmUE5TKSB7CisgIGlmICghU3VwZXIpCisgICAgcmV0dXJuOworCisgIGZvciAoY29uc3QgYXV0byAqSSA6IFN1cGVyLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbHMoKSkKKyAgICBmaW5kUHJvdG9jb2xzV2l0aEV4cGxpY2l0SW1wbHMoSSwgUE5TKTsKKworICBmaW5kUHJvdG9jb2xzV2l0aEV4cGxpY2l0SW1wbHMoU3VwZXItPmdldFN1cGVyQ2xhc3MoKSwgUE5TKTsKK30KKwogLy8vIENoZWNrUHJvdG9jb2xNZXRob2REZWZzIC0gVGhpcyByb3V0aW5lIGNoZWNrcyB1bmltcGxlbWVudGVkIG1ldGhvZHMKIC8vLyBEZWNsYXJlZCBpbiBwcm90b2NvbCwgYW5kIHRob3NlIHJlZmVyZW5jZWQgYnkgaXQuCi12b2lkIFNlbWE6OkNoZWNrUHJvdG9jb2xNZXRob2REZWZzKFNvdXJjZUxvY2F0aW9uIEltcExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ1Byb3RvY29sRGVjbCAqUERlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIEluY29tcGxldGVJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3RvclNldCAmSW5zTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3RvclNldCAmQ2xzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDQ29udGFpbmVyRGVjbCAqQ0RlY2wpIHsKK3N0YXRpYyB2b2lkIENoZWNrUHJvdG9jb2xNZXRob2REZWZzKFNlbWEgJlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDUHJvdG9jb2xEZWNsICpQRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIEluY29tcGxldGVJbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VtYTo6U2VsZWN0b3JTZXQgJkluc01hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbWE6OlNlbGVjdG9yU2V0ICZDbHNNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDQ29udGFpbmVyRGVjbCAqQ0RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXp5UHJvdG9jb2xOYW1lU2V0ICZQcm90b2NvbHNFeHBsaWN0SW1wbCkgewogICBPYmpDQ2F0ZWdvcnlEZWNsICpDID0gZHluX2Nhc3Q8T2JqQ0NhdGVnb3J5RGVjbD4oQ0RlY2wpOwogICBPYmpDSW50ZXJmYWNlRGVjbCAqSURlY2wgPSBDID8gQy0+Z2V0Q2xhc3NJbnRlcmZhY2UoKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPihDRGVjbCk7CkBAIC0xNjMwLDcgKzE2ODksMzMgQEAKICAgCiAgIE9iakNJbnRlcmZhY2VEZWNsICpTdXBlciA9IElEZWNsLT5nZXRTdXBlckNsYXNzKCk7CiAgIE9iakNJbnRlcmZhY2VEZWNsICpOU0lEZWNsID0gMDsKLSAgaWYgKGdldExhbmdPcHRzKCkuT2JqQ1J1bnRpbWUuaXNOZVhURmFtaWx5KCkpIHsKKworICAvLyBJZiB0aGlzIHByb3RvY29sIGlzIG1hcmtlZCAnb2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbicKKyAgLy8gdGhlbiB3ZSBzaG91bGQgY2hlY2sgaWYgYW55IGNsYXNzIGluIHRoZSBzdXBlciBjbGFzcyBoaWVyYXJjaHkgYWxzbworICAvLyBjb25mb3JtcyB0byB0aGlzIHByb3RvY29sLCBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhIHByb3RvY29sIGluaGVyaXRhbmNlLgorICAvLyBJZiBzbywgd2UgY2FuIHNraXAgY2hlY2tpbmcgdGhpcyBwcm90b2NvbCBjb21wbGV0ZWx5IGJlY2F1c2Ugd2UKKyAgLy8ga25vdyB0aGF0IGEgcGFyZW50IGNsYXNzIGFscmVhZHkgc2F0aXNmaWVzIHRoaXMgcHJvdG9jb2wuCisgIC8vCisgIC8vIE5vdGU6IHdlIGNvdWxkIGdlbmVyYWxpemUgdGhpcyBsb2dpYyBmb3IgYWxsIHByb3RvY29scywgYW5kIG1lcmVseQorICAvLyBhZGQgdGhlIGxpbWl0IG9uIGxvb2tpbmcgYXQgdGhlIHN1cGVyIGNsYXNzIGNoYWluIGZvciBqdXN0CisgIC8vIHNwZWNpYWxseSBtYXJrZWQgcHJvdG9jb2xzLiAgVGhpcyBtYXkgYmUgYSBnb29kIG9wdGltaXphdGlvbi4gIFRoaXMKKyAgLy8gY2hhbmdlIGlzIHJlc3RyaWN0ZWQgdG8gJ29iamNfcHJvdG9jb2xfcmVxdWlyZXNfZXhwbGljaXRfaW1wbGVtZW50YXRpb24nCisgIC8vIHByb3RvY29scyBmb3Igbm93IGZvciBjb250cm9sbGVkIGV2YWx1YXRpb24uCisgIGlmIChQRGVjbC0+aGFzQXR0cjxPYmpDRXhwbGljaXRQcm90b2NvbEltcGxBdHRyPigpKSB7CisgICAgaWYgKCFQcm90b2NvbHNFeHBsaWN0SW1wbCkgeworICAgICAgUHJvdG9jb2xzRXhwbGljdEltcGwucmVzZXQobmV3IFByb3RvY29sTmFtZVNldCk7CisgICAgICBmaW5kUHJvdG9jb2xzV2l0aEV4cGxpY2l0SW1wbHMoU3VwZXIsICpQcm90b2NvbHNFeHBsaWN0SW1wbCk7CisgICAgfQorICAgIGlmIChQcm90b2NvbHNFeHBsaWN0SW1wbC0+ZmluZChQRGVjbC0+Z2V0SWRlbnRpZmllcigpKSAhPQorICAgICAgICBQcm90b2NvbHNFeHBsaWN0SW1wbC0+ZW5kKCkpCisgICAgICByZXR1cm47CisKKyAgICAvLyBJZiBubyBzdXBlciBjbGFzcyBjb25mb3JtcyB0byB0aGUgcHJvdG9jb2wsIHdlIHNob3VsZCBub3Qgc2VhcmNoCisgICAgLy8gZm9yIG1ldGhvZHMgaW4gdGhlIHN1cGVyIGNsYXNzIHRvIGltcGxpY2l0bHkgc2F0aXNmeSB0aGUgcHJvdG9jb2wuCisgICAgU3VwZXIgPSBOVUxMOworICB9CisKKyAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5PYmpDUnVudGltZS5pc05lWFRGYW1pbHkoKSkgewogICAgIC8vIGNoZWNrIHRvIHNlZSBpZiBjbGFzcyBpbXBsZW1lbnRzIGZvcndhcmRJbnZvY2F0aW9uIG1ldGhvZCBhbmQgb2JqZWN0cwogICAgIC8vIG9mIHRoaXMgY2xhc3MgYXJlIGRlcml2ZWQgZnJvbSAnTlNQcm94eScgc28gdGhhdCB0byBmb3J3YXJkIHJlcXVlc3RzCiAgICAgLy8gZnJvbSBvbmUgb2JqZWN0IHRvIGFub3RoZXIuCkBAIC0xNjM4LDEyICsxNzIzLDEyIEBACiAgICAgLy8gaW1wbGVtZW50ZWQgaW4gdGhlIGNsYXNzLCB3ZSBzaG91bGQgbm90IGlzc3VlICJNZXRob2QgZGVmaW5pdGlvbiBub3QKICAgICAvLyBmb3VuZCIgd2FybmluZ3MuCiAgICAgLy8gRklYTUU6IFVzZSBhIGdlbmVyYWwgR2V0VW5hcnlTZWxlY3RvciBtZXRob2QgZm9yIHRoaXMuCi0gICAgSWRlbnRpZmllckluZm8qIElJID0gJkNvbnRleHQuSWRlbnRzLmdldCgiZm9yd2FyZEludm9jYXRpb24iKTsKLSAgICBTZWxlY3RvciBmSVNlbGVjdG9yID0gQ29udGV4dC5TZWxlY3RvcnMuZ2V0U2VsZWN0b3IoMSwgJklJKTsKKyAgICBJZGVudGlmaWVySW5mbyogSUkgPSAmUy5Db250ZXh0LklkZW50cy5nZXQoImZvcndhcmRJbnZvY2F0aW9uIik7CisgICAgU2VsZWN0b3IgZklTZWxlY3RvciA9IFMuQ29udGV4dC5TZWxlY3RvcnMuZ2V0U2VsZWN0b3IoMSwgJklJKTsKICAgICBpZiAoSW5zTWFwLmNvdW50KGZJU2VsZWN0b3IpKQogICAgICAgLy8gSXMgSURlY2wgZGVyaXZlZCBmcm9tICdOU1Byb3h5Jz8gSWYgc28sIG5vIGluc3RhbmNlIG1ldGhvZHMKICAgICAgIC8vIG5lZWQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uLgotICAgICAgTlNJRGVjbCA9IElEZWNsLT5sb29rdXBJbmhlcml0ZWRDbGFzcygmQ29udGV4dC5JZGVudHMuZ2V0KCJOU1Byb3h5IikpOworICAgICAgTlNJRGVjbCA9IElEZWNsLT5sb29rdXBJbmhlcml0ZWRDbGFzcygmUy5Db250ZXh0LklkZW50cy5nZXQoIk5TUHJveHkiKSk7CiAgIH0KIAogICAvLyBJZiB0aGlzIGlzIGEgZm9yd2FyZCBwcm90b2NvbCBkZWNsYXJhdGlvbiwgZ2V0IGl0cyBkZWZpbml0aW9uLgpAQCAtMTY1OCwxMyArMTc0MywxNSBAQAogCiAgIC8vIGNoZWNrIHVuaW1wbGVtZW50ZWQgaW5zdGFuY2UgbWV0aG9kcy4KICAgaWYgKCFOU0lEZWNsKQotICAgIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6aW5zdG1ldGhfaXRlcmF0b3IgSSA9IFBEZWNsLT5pbnN0bWV0aF9iZWdpbigpLAotICAgICAgICAgRSA9IFBEZWNsLT5pbnN0bWV0aF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIE9iakNNZXRob2REZWNsICptZXRob2QgPSAqSTsKKyAgICBmb3IgKGF1dG8gKm1ldGhvZCA6IFBEZWNsLT5pbnN0YW5jZV9tZXRob2RzKCkpIHsKICAgICAgIGlmIChtZXRob2QtPmdldEltcGxlbWVudGF0aW9uQ29udHJvbCgpICE9IE9iakNNZXRob2REZWNsOjpPcHRpb25hbCAmJgogICAgICAgICAgICFtZXRob2QtPmlzUHJvcGVydHlBY2Nlc3NvcigpICYmCiAgICAgICAgICAgIUluc01hcC5jb3VudChtZXRob2QtPmdldFNlbGVjdG9yKCkpICYmCi0gICAgICAgICAgKCFTdXBlciB8fCAhU3VwZXItPmxvb2t1cEluc3RhbmNlTWV0aG9kKG1ldGhvZC0+Z2V0U2VsZWN0b3IoKSkpKSB7CisgICAgICAgICAgKCFTdXBlciB8fCAhU3VwZXItPmxvb2t1cE1ldGhvZChtZXRob2QtPmdldFNlbGVjdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGluc3RhbmNlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogc2hhbGxvd0NhdGVnb3J5ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBmb2xsb3dzU3VwZXIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGNhdGVnb3J5ICovKSkpIHsKICAgICAgICAgICAgIC8vIElmIGEgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY2F0ZWdvcnkgaW1wbGVtZW50YXRpb24gYnV0CiAgICAgICAgICAgICAvLyBoYXMgYmVlbiBkZWNsYXJlZCBpbiBpdHMgcHJpbWFyeSBjbGFzcywgc3VwZXJjbGFzcywKICAgICAgICAgICAgIC8vIG9yIGluIG9uZSBvZiB0aGVpciBwcm90b2NvbHMsIG5vIG5lZWQgdG8gaXNzdWUgdGhlIHdhcm5pbmcuIApAQCAtMTY3NSw0NCArMTc2Miw0NyBAQAogICAgICAgICAgICAgLy8gaGF2ZSBiZWVuIHN5bnRoZXNpemVkIGR1ZSB0byBhIHByb3BlcnR5IGRlY2xhcmVkIGluIHRoZSBjbGFzcyB3aGljaAogICAgICAgICAgICAgLy8gdXNlcyB0aGUgcHJvdG9jb2wuCiAgICAgICAgICAgICBpZiAoT2JqQ01ldGhvZERlY2wgKk1ldGhvZEluQ2xhc3MgPQotICAgICAgICAgICAgICAgICAgSURlY2wtPmxvb2t1cEluc3RhbmNlTWV0aG9kKG1ldGhvZC0+Z2V0U2VsZWN0b3IoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKnNoYWxsb3dDYXRlZ29yeUxvb2t1cCovKSkKKyAgICAgICAgICAgICAgICAgIElEZWNsLT5sb29rdXBNZXRob2QobWV0aG9kLT5nZXRTZWxlY3RvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGluc3RhbmNlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHNoYWxsb3dDYXRlZ29yeUxvb2t1cCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZm9sbG93U3VwZXIgKi8pKQogICAgICAgICAgICAgICBpZiAoQyB8fCBNZXRob2RJbkNsYXNzLT5pc1Byb3BlcnR5QWNjZXNzb3IoKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIHVuc2lnbmVkIERJQUcgPSBkaWFnOjp3YXJuX3VuaW1wbGVtZW50ZWRfcHJvdG9jb2xfbWV0aG9kOwotICAgICAgICAgICAgaWYgKERpYWdzLmdldERpYWdub3N0aWNMZXZlbChESUFHLCBJbXBMb2MpCisgICAgICAgICAgICBpZiAoUy5EaWFncy5nZXREaWFnbm9zdGljTGV2ZWwoRElBRywgSW1wTG9jKQogICAgICAgICAgICAgICAgICE9IERpYWdub3N0aWNzRW5naW5lOjpJZ25vcmVkKSB7Ci0gICAgICAgICAgICAgIFdhcm5VbmRlZmluZWRNZXRob2QoSW1wTG9jLCBtZXRob2QsIEluY29tcGxldGVJbXBsLCBESUFHKTsKLSAgICAgICAgICAgICAgRGlhZyhDRGVjbC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9yZXF1aXJlZF9mb3JfcHJvdG9jb2xfYXQpCi0gICAgICAgICAgICAgICAgPDwgUERlY2wtPmdldERlY2xOYW1lKCk7CisgICAgICAgICAgICAgIFdhcm5VbmRlZmluZWRNZXRob2QoUywgSW1wTG9jLCBtZXRob2QsIEluY29tcGxldGVJbXBsLCBESUFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEZWNsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgfQogICAvLyBjaGVjayB1bmltcGxlbWVudGVkIGNsYXNzIG1ldGhvZHMKLSAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjpjbGFzc21ldGhfaXRlcmF0b3IKLSAgICAgICAgIEkgPSBQRGVjbC0+Y2xhc3NtZXRoX2JlZ2luKCksIEUgPSBQRGVjbC0+Y2xhc3NtZXRoX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgT2JqQ01ldGhvZERlY2wgKm1ldGhvZCA9ICpJOworICBmb3IgKGF1dG8gKm1ldGhvZCA6IFBEZWNsLT5jbGFzc19tZXRob2RzKCkpIHsKICAgICBpZiAobWV0aG9kLT5nZXRJbXBsZW1lbnRhdGlvbkNvbnRyb2woKSAhPSBPYmpDTWV0aG9kRGVjbDo6T3B0aW9uYWwgJiYKICAgICAgICAgIUNsc01hcC5jb3VudChtZXRob2QtPmdldFNlbGVjdG9yKCkpICYmCi0gICAgICAgICghU3VwZXIgfHwgIVN1cGVyLT5sb29rdXBDbGFzc01ldGhvZChtZXRob2QtPmdldFNlbGVjdG9yKCkpKSkgeworICAgICAgICAoIVN1cGVyIHx8ICFTdXBlci0+bG9va3VwTWV0aG9kKG1ldGhvZC0+Z2V0U2VsZWN0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjbGFzcyBtZXRob2QgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogc2hhbGxvd0NhdGVnb3J5TG9va3VwICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC8qIGZvbGxvd1N1cGVyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogY2F0ZWdvcnkgKi8pKSkgewogICAgICAgLy8gU2VlIGFib3ZlIGNvbW1lbnQgZm9yIGluc3RhbmNlIG1ldGhvZCBsb29rdXBzLgotICAgICAgaWYgKEMgJiYgSURlY2wtPmxvb2t1cENsYXNzTWV0aG9kKG1ldGhvZC0+Z2V0U2VsZWN0b3IoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKnNoYWxsb3dDYXRlZ29yeUxvb2t1cCovKSkKKyAgICAgIGlmIChDICYmIElEZWNsLT5sb29rdXBNZXRob2QobWV0aG9kLT5nZXRTZWxlY3RvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjbGFzcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzaGFsbG93Q2F0ZWdvcnlMb29rdXAgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGZvbGxvd1N1cGVyICovKSkKICAgICAgICAgY29udGludWU7CisKICAgICAgIHVuc2lnbmVkIERJQUcgPSBkaWFnOjp3YXJuX3VuaW1wbGVtZW50ZWRfcHJvdG9jb2xfbWV0aG9kOwotICAgICAgaWYgKERpYWdzLmdldERpYWdub3N0aWNMZXZlbChESUFHLCBJbXBMb2MpICE9CisgICAgICBpZiAoUy5EaWFncy5nZXREaWFnbm9zdGljTGV2ZWwoRElBRywgSW1wTG9jKSAhPQogICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6Oklnbm9yZWQpIHsKLSAgICAgICAgV2FyblVuZGVmaW5lZE1ldGhvZChJbXBMb2MsIG1ldGhvZCwgSW5jb21wbGV0ZUltcGwsIERJQUcpOwotICAgICAgICBEaWFnKElEZWNsLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3JlcXVpcmVkX2Zvcl9wcm90b2NvbF9hdCkgPDwKLSAgICAgICAgICBQRGVjbC0+Z2V0RGVjbE5hbWUoKTsKKyAgICAgICAgV2FyblVuZGVmaW5lZE1ldGhvZChTLCBJbXBMb2MsIG1ldGhvZCwgSW5jb21wbGV0ZUltcGwsIERJQUcsIFBEZWNsKTsKICAgICAgIH0KICAgICB9CiAgIH0KICAgLy8gQ2hlY2sgb24gdGhpcyBwcm90b2NvbHMncyByZWZlcmVuY2VkIHByb3RvY29scywgcmVjdXJzaXZlbHkuCi0gIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUEkgPSBQRGVjbC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICBFID0gUERlY2wtPnByb3RvY29sX2VuZCgpOyBQSSAhPSBFOyArK1BJKQotICAgIENoZWNrUHJvdG9jb2xNZXRob2REZWZzKEltcExvYywgKlBJLCBJbmNvbXBsZXRlSW1wbCwgSW5zTWFwLCBDbHNNYXAsIENEZWNsKTsKKyAgZm9yIChhdXRvICpQSSA6IFBEZWNsLT5wcm90b2NvbHMoKSkKKyAgICBDaGVja1Byb3RvY29sTWV0aG9kRGVmcyhTLCBJbXBMb2MsIFBJLCBJbmNvbXBsZXRlSW1wbCwgSW5zTWFwLCBDbHNNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RlY2wsIFByb3RvY29sc0V4cGxpY3RJbXBsKTsKIH0KIAogLy8vIE1hdGNoQWxsTWV0aG9kRGVjbGFyYXRpb25zIC0gQ2hlY2sgbWV0aG9kcyBkZWNsYXJlZCBpbiBpbnRlcmZhY2UKQEAgLTE3MjksNTYgKzE4MTksNTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBXYXJuQ2F0ZWdvcnlNZXRob2RJbXBsKSB7CiAgIC8vIENoZWNrIGFuZCBzZWUgaWYgaW5zdGFuY2UgbWV0aG9kcyBpbiBjbGFzcyBpbnRlcmZhY2UgaGF2ZSBiZWVuCiAgIC8vIGltcGxlbWVudGVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gSWYgc28sIHRoZWlyIHR5cGVzIG1hdGNoLgotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjppbnN0bWV0aF9pdGVyYXRvciBJID0gQ0RlY2wtPmluc3RtZXRoX2JlZ2luKCksCi0gICAgICAgRSA9IENEZWNsLT5pbnN0bWV0aF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoIUluc01hcFNlZW4uaW5zZXJ0KCgqSSktPmdldFNlbGVjdG9yKCkpKQorICBmb3IgKGF1dG8gKkkgOiBDRGVjbC0+aW5zdGFuY2VfbWV0aG9kcygpKSB7CisgICAgaWYgKCFJbnNNYXBTZWVuLmluc2VydChJLT5nZXRTZWxlY3RvcigpKSkKICAgICAgIGNvbnRpbnVlOwotICAgIGlmICghKCpJKS0+aXNQcm9wZXJ0eUFjY2Vzc29yKCkgJiYKLSAgICAgICAgIUluc01hcC5jb3VudCgoKkkpLT5nZXRTZWxlY3RvcigpKSkgeworICAgIGlmICghSS0+aXNQcm9wZXJ0eUFjY2Vzc29yKCkgJiYKKyAgICAgICAgIUluc01hcC5jb3VudChJLT5nZXRTZWxlY3RvcigpKSkgewogICAgICAgaWYgKEltbWVkaWF0ZUNsYXNzKQotICAgICAgICBXYXJuVW5kZWZpbmVkTWV0aG9kKElNUERlY2wtPmdldExvY2F0aW9uKCksICpJLCBJbmNvbXBsZXRlSW1wbCwKKyAgICAgICAgV2FyblVuZGVmaW5lZE1ldGhvZCgqdGhpcywgSU1QRGVjbC0+Z2V0TG9jYXRpb24oKSwgSSwgSW5jb21wbGV0ZUltcGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6d2Fybl91bmRlZl9tZXRob2RfaW1wbCk7CiAgICAgICBjb250aW51ZTsKICAgICB9IGVsc2UgewogICAgICAgT2JqQ01ldGhvZERlY2wgKkltcE1ldGhvZERlY2wgPQotICAgICAgICBJTVBEZWNsLT5nZXRJbnN0YW5jZU1ldGhvZCgoKkkpLT5nZXRTZWxlY3RvcigpKTsKLSAgICAgIGFzc2VydChDRGVjbC0+Z2V0SW5zdGFuY2VNZXRob2QoKCpJKS0+Z2V0U2VsZWN0b3IoKSkgJiYKKyAgICAgICAgSU1QRGVjbC0+Z2V0SW5zdGFuY2VNZXRob2QoSS0+Z2V0U2VsZWN0b3IoKSk7CisgICAgICBhc3NlcnQoQ0RlY2wtPmdldEluc3RhbmNlTWV0aG9kKEktPmdldFNlbGVjdG9yKCkpICYmCiAgICAgICAgICAgICAgIkV4cGVjdGVkIHRvIGZpbmQgdGhlIG1ldGhvZCB0aHJvdWdoIGxvb2t1cCBhcyB3ZWxsIik7Ci0gICAgICBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kRGVjbCA9ICpJOwogICAgICAgLy8gSW1wTWV0aG9kRGVjbCBtYXkgYmUgbnVsbCBhcyBpbiBhIEBkeW5hbWljIHByb3BlcnR5LgogICAgICAgaWYgKEltcE1ldGhvZERlY2wpIHsKICAgICAgICAgaWYgKCFXYXJuQ2F0ZWdvcnlNZXRob2RJbXBsKQotICAgICAgICAgIFdhcm5Db25mbGljdGluZ1R5cGVkTWV0aG9kcyhJbXBNZXRob2REZWNsLCBNZXRob2REZWNsLAorICAgICAgICAgIFdhcm5Db25mbGljdGluZ1R5cGVkTWV0aG9kcyhJbXBNZXRob2REZWNsLCBJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2E8T2JqQ1Byb3RvY29sRGVjbD4oQ0RlY2wpKTsKLSAgICAgICAgZWxzZSBpZiAoIU1ldGhvZERlY2wtPmlzUHJvcGVydHlBY2Nlc3NvcigpKQotICAgICAgICAgIFdhcm5FeGFjdFR5cGVkTWV0aG9kcyhJbXBNZXRob2REZWNsLCBNZXRob2REZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2E8T2JqQ1Byb3RvY29sRGVjbD4oQ0RlY2wpKTsKKyAgICAgICAgZWxzZSBpZiAoIUktPmlzUHJvcGVydHlBY2Nlc3NvcigpKQorICAgICAgICAgIFdhcm5FeGFjdFR5cGVkTWV0aG9kcyhJbXBNZXRob2REZWNsLCBJLCBpc2E8T2JqQ1Byb3RvY29sRGVjbD4oQ0RlY2wpKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICAvLyBDaGVjayBhbmQgc2VlIGlmIGNsYXNzIG1ldGhvZHMgaW4gY2xhc3MgaW50ZXJmYWNlIGhhdmUgYmVlbgogICAvLyBpbXBsZW1lbnRlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuIElmIHNvLCB0aGVpciB0eXBlcyBtYXRjaC4KLSAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6Y2xhc3NtZXRoX2l0ZXJhdG9yIEkgPSBDRGVjbC0+Y2xhc3NtZXRoX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gQ0RlY2wtPmNsYXNzbWV0aF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIGlmICghQ2xzTWFwU2Vlbi5pbnNlcnQoKCpJKS0+Z2V0U2VsZWN0b3IoKSkpCisgIGZvciAoYXV0byAqSSA6IENEZWNsLT5jbGFzc19tZXRob2RzKCkpIHsKKyAgICBpZiAoIUNsc01hcFNlZW4uaW5zZXJ0KEktPmdldFNlbGVjdG9yKCkpKQogICAgICAgY29udGludWU7Ci0gICAgaWYgKCFDbHNNYXAuY291bnQoKCpJKS0+Z2V0U2VsZWN0b3IoKSkpIHsKKyAgICBpZiAoIUNsc01hcC5jb3VudChJLT5nZXRTZWxlY3RvcigpKSkgewogICAgICAgaWYgKEltbWVkaWF0ZUNsYXNzKQotICAgICAgICBXYXJuVW5kZWZpbmVkTWV0aG9kKElNUERlY2wtPmdldExvY2F0aW9uKCksICpJLCBJbmNvbXBsZXRlSW1wbCwKKyAgICAgICAgV2FyblVuZGVmaW5lZE1ldGhvZCgqdGhpcywgSU1QRGVjbC0+Z2V0TG9jYXRpb24oKSwgSSwgSW5jb21wbGV0ZUltcGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6d2Fybl91bmRlZl9tZXRob2RfaW1wbCk7CiAgICAgfSBlbHNlIHsKICAgICAgIE9iakNNZXRob2REZWNsICpJbXBNZXRob2REZWNsID0KLSAgICAgICAgSU1QRGVjbC0+Z2V0Q2xhc3NNZXRob2QoKCpJKS0+Z2V0U2VsZWN0b3IoKSk7Ci0gICAgICBhc3NlcnQoQ0RlY2wtPmdldENsYXNzTWV0aG9kKCgqSSktPmdldFNlbGVjdG9yKCkpICYmCisgICAgICAgIElNUERlY2wtPmdldENsYXNzTWV0aG9kKEktPmdldFNlbGVjdG9yKCkpOworICAgICAgYXNzZXJ0KENEZWNsLT5nZXRDbGFzc01ldGhvZChJLT5nZXRTZWxlY3RvcigpKSAmJgogICAgICAgICAgICAgICJFeHBlY3RlZCB0byBmaW5kIHRoZSBtZXRob2QgdGhyb3VnaCBsb29rdXAgYXMgd2VsbCIpOwotICAgICAgT2JqQ01ldGhvZERlY2wgKk1ldGhvZERlY2wgPSAqSTsKICAgICAgIGlmICghV2FybkNhdGVnb3J5TWV0aG9kSW1wbCkKLSAgICAgICAgV2FybkNvbmZsaWN0aW5nVHlwZWRNZXRob2RzKEltcE1ldGhvZERlY2wsIE1ldGhvZERlY2wsIAorICAgICAgICBXYXJuQ29uZmxpY3RpbmdUeXBlZE1ldGhvZHMoSW1wTWV0aG9kRGVjbCwgSSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2E8T2JqQ1Byb3RvY29sRGVjbD4oQ0RlY2wpKTsKICAgICAgIGVsc2UKLSAgICAgICAgV2FybkV4YWN0VHlwZWRNZXRob2RzKEltcE1ldGhvZERlY2wsIE1ldGhvZERlY2wsCisgICAgICAgIFdhcm5FeGFjdFR5cGVkTWV0aG9kcyhJbXBNZXRob2REZWNsLCBJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNhPE9iakNQcm90b2NvbERlY2w+KENEZWNsKSk7CiAgICAgfQogICB9CkBAIC0xNzg2LDEwICsxODcwLDkgQEAKICAgaWYgKE9iakNQcm90b2NvbERlY2wgKlBEID0gZHluX2Nhc3Q8T2JqQ1Byb3RvY29sRGVjbD4gKENEZWNsKSkgewogICAgIC8vIEFsc28sIGNoZWNrIGZvciBtZXRob2RzIGRlY2xhcmVkIGluIHByb3RvY29scyBpbmhlcml0ZWQgYnkKICAgICAvLyB0aGlzIHByb3RvY29sLgotICAgIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IKLSAgICAgICAgICBQSSA9IFBELT5wcm90b2NvbF9iZWdpbigpLCBFID0gUEQtPnByb3RvY29sX2VuZCgpOyBQSSAhPSBFOyArK1BJKQorICAgIGZvciAoYXV0byAqUEkgOiBQRC0+cHJvdG9jb2xzKCkpCiAgICAgICBNYXRjaEFsbE1ldGhvZERlY2xhcmF0aW9ucyhJbnNNYXAsIENsc01hcCwgSW5zTWFwU2VlbiwgQ2xzTWFwU2VlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUERlY2wsICgqUEkpLCBJbmNvbXBsZXRlSW1wbCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBEZWNsLCBQSSwgSW5jb21wbGV0ZUltcGwsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FybkNhdGVnb3J5TWV0aG9kSW1wbCk7CiAgIH0KICAgCkBAIC0xNzk4LDM1ICsxODgxLDI0IEBACiAgICAgLy8gaS5lLiB3aGVuIFdhcm5DYXRlZ29yeU1ldGhvZEltcGwgaXMgZmFsc2UsIGNoZWNrIGRlY2xhcmF0aW9ucyBpbiBjbGFzcwogICAgIC8vIGV4dGVuc2lvbjsgYXMgd2VsbCBhcyB0aG9zZSBpbiBjYXRlZ29yaWVzLgogICAgIGlmICghV2FybkNhdGVnb3J5TWV0aG9kSW1wbCkgewotICAgICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6dmlzaWJsZV9jYXRlZ29yaWVzX2l0ZXJhdG9yCi0gICAgICAgICAgICAgQ2F0ID0gSS0+dmlzaWJsZV9jYXRlZ29yaWVzX2JlZ2luKCksCi0gICAgICAgICAgIENhdEVuZCA9IEktPnZpc2libGVfY2F0ZWdvcmllc19lbmQoKTsKLSAgICAgICAgICAgQ2F0ICE9IENhdEVuZDsgKytDYXQpIHsKKyAgICAgIGZvciAoYXV0byAqQ2F0IDogSS0+dmlzaWJsZV9jYXRlZ29yaWVzKCkpCiAgICAgICAgIE1hdGNoQWxsTWV0aG9kRGVjbGFyYXRpb25zKEluc01hcCwgQ2xzTWFwLCBJbnNNYXBTZWVuLCBDbHNNYXBTZWVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBEZWNsLCAqQ2F0LCBJbmNvbXBsZXRlSW1wbCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUERlY2wsIENhdCwgSW5jb21wbGV0ZUltcGwsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXJuQ2F0ZWdvcnlNZXRob2RJbXBsKTsKLSAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgLy8gQWxzbyBtZXRob2RzIGluIGNsYXNzIGV4dGVuc2lvbnMgbmVlZCBiZSBsb29rZWQgYXQgbmV4dC4KLSAgICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnZpc2libGVfZXh0ZW5zaW9uc19pdGVyYXRvcgotICAgICAgICAgICAgIEV4dCA9IEktPnZpc2libGVfZXh0ZW5zaW9uc19iZWdpbigpLAotICAgICAgICAgICAgIEV4dEVuZCA9IEktPnZpc2libGVfZXh0ZW5zaW9uc19lbmQoKTsKLSAgICAgICAgICAgRXh0ICE9IEV4dEVuZDsgKytFeHQpIHsKKyAgICAgIGZvciAoYXV0byAqRXh0IDogSS0+dmlzaWJsZV9leHRlbnNpb25zKCkpCiAgICAgICAgIE1hdGNoQWxsTWV0aG9kRGVjbGFyYXRpb25zKEluc01hcCwgQ2xzTWFwLCBJbnNNYXBTZWVuLCBDbHNNYXBTZWVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBEZWNsLCAqRXh0LCBJbmNvbXBsZXRlSW1wbCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUERlY2wsIEV4dCwgSW5jb21wbGV0ZUltcGwsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXJuQ2F0ZWdvcnlNZXRob2RJbXBsKTsKLSAgICAgIH0KICAgICB9CiAKICAgICAvLyBDaGVjayBmb3IgYW55IGltcGxlbWVudGF0aW9uIG9mIGEgbWV0aG9kcyBkZWNsYXJlZCBpbiBwcm90b2NvbC4KLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjphbGxfcHJvdG9jb2xfaXRlcmF0b3IKLSAgICAgICAgICBQSSA9IEktPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2JlZ2luKCksCi0gICAgICAgICAgRSA9IEktPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2VuZCgpOyBQSSAhPSBFOyArK1BJKQorICAgIGZvciAoYXV0byAqUEkgOiBJLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbHMoKSkKICAgICAgIE1hdGNoQWxsTWV0aG9kRGVjbGFyYXRpb25zKEluc01hcCwgQ2xzTWFwLCBJbnNNYXBTZWVuLCBDbHNNYXBTZWVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QRGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqUEkpLCBJbmNvbXBsZXRlSW1wbCwgZmFsc2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QRGVjbCwgUEksIEluY29tcGxldGVJbXBsLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhcm5DYXRlZ29yeU1ldGhvZEltcGwpOwotICAgIAorCiAgICAgLy8gRklYTUUuIEZvciBub3csIHdlIGFyZSBub3QgY2hlY2tpbmcgZm9yIGV4dGFjdCBtYXRjaCBvZiBtZXRob2RzIAogICAgIC8vIGluIGNhdGVnb3J5IGltcGxlbWVudGF0aW9uIGFuZCBpdHMgcHJpbWFyeSBjbGFzcydzIHN1cGVyIGNsYXNzLiAKICAgICBpZiAoIVdhcm5DYXRlZ29yeU1ldGhvZEltcGwgJiYgSS0+Z2V0U3VwZXJDbGFzcygpKQpAQCAtMTg0MSwyMCArMTkxMyw2IEBACiAvLy8gd2FybnMgZWFjaCB0aW1lIGFuIGV4YWN0IG1hdGNoIGlzIGZvdW5kLiAKIHZvaWQgU2VtYTo6Q2hlY2tDYXRlZ29yeVZzQ2xhc3NNZXRob2RNYXRjaGVzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNDYXRlZ29yeUltcGxEZWNsICpDYXRJTVBEZWNsKSB7Ci0gIFNlbGVjdG9yU2V0IEluc01hcCwgQ2xzTWFwOwotICAKLSAgZm9yIChPYmpDSW1wbGVtZW50YXRpb25EZWNsOjppbnN0bWV0aF9pdGVyYXRvcgotICAgICAgIEkgPSBDYXRJTVBEZWNsLT5pbnN0bWV0aF9iZWdpbigpLCAKLSAgICAgICBFID0gQ2F0SU1QRGVjbC0+aW5zdG1ldGhfZW5kKCk7IEkhPUU7ICsrSSkKLSAgICBJbnNNYXAuaW5zZXJ0KCgqSSktPmdldFNlbGVjdG9yKCkpOwotICAKLSAgZm9yIChPYmpDSW1wbGVtZW50YXRpb25EZWNsOjpjbGFzc21ldGhfaXRlcmF0b3IKLSAgICAgICBJID0gQ2F0SU1QRGVjbC0+Y2xhc3NtZXRoX2JlZ2luKCksCi0gICAgICAgRSA9IENhdElNUERlY2wtPmNsYXNzbWV0aF9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgQ2xzTWFwLmluc2VydCgoKkkpLT5nZXRTZWxlY3RvcigpKTsKLSAgaWYgKEluc01hcC5lbXB0eSgpICYmIENsc01hcC5lbXB0eSgpKQotICAgIHJldHVybjsKLSAgCiAgIC8vIEdldCBjYXRlZ29yeSdzIHByaW1hcnkgY2xhc3MuCiAgIE9iakNDYXRlZ29yeURlY2wgKkNhdERlY2wgPSBDYXRJTVBEZWNsLT5nZXRDYXRlZ29yeURlY2woKTsKICAgaWYgKCFDYXREZWNsKQpAQCAtMTg2Miw2ICsxOTIwLDI4IEBACiAgIE9iakNJbnRlcmZhY2VEZWNsICpJRGVjbCA9IENhdERlY2wtPmdldENsYXNzSW50ZXJmYWNlKCk7CiAgIGlmICghSURlY2wpCiAgICAgcmV0dXJuOworICBPYmpDSW50ZXJmYWNlRGVjbCAqU3VwZXJJRGVjbCA9IElEZWNsLT5nZXRTdXBlckNsYXNzKCk7CisgIFNlbGVjdG9yU2V0IEluc01hcCwgQ2xzTWFwOworICAKKyAgZm9yIChjb25zdCBhdXRvICpJIDogQ2F0SU1QRGVjbC0+aW5zdGFuY2VfbWV0aG9kcygpKSB7CisgICAgU2VsZWN0b3IgU2VsID0gSS0+Z2V0U2VsZWN0b3IoKTsKKyAgICAvLyBXaGVuIGNoZWNraW5nIGZvciBtZXRob2RzIGltcGxlbWVudGVkIGluIHRoZSBjYXRlZ29yeSwgc2tpcCBvdmVyCisgICAgLy8gdGhvc2UgZGVjbGFyZWQgaW4gY2F0ZWdvcnkgY2xhc3MncyBzdXBlciBjbGFzcy4gVGhpcyBpcyBiZWNhdXNlCisgICAgLy8gdGhlIHN1cGVyIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBtZXRob2QuCisgICAgaWYgKFN1cGVySURlY2wgJiYgU3VwZXJJRGVjbC0+bG9va3VwTWV0aG9kKFNlbCwgdHJ1ZSkpCisgICAgICBjb250aW51ZTsKKyAgICBJbnNNYXAuaW5zZXJ0KFNlbCk7CisgIH0KKyAgCisgIGZvciAoY29uc3QgYXV0byAqSSA6IENhdElNUERlY2wtPmNsYXNzX21ldGhvZHMoKSkgeworICAgIFNlbGVjdG9yIFNlbCA9IEktPmdldFNlbGVjdG9yKCk7CisgICAgaWYgKFN1cGVySURlY2wgJiYgU3VwZXJJRGVjbC0+bG9va3VwTWV0aG9kKFNlbCwgZmFsc2UpKQorICAgICAgY29udGludWU7CisgICAgQ2xzTWFwLmluc2VydChTZWwpOworICB9CisgIGlmIChJbnNNYXAuZW1wdHkoKSAmJiBDbHNNYXAuZW1wdHkoKSkKKyAgICByZXR1cm47CisgIAogICBTZWxlY3RvclNldCBJbnNNYXBTZWVuLCBDbHNNYXBTZWVuOwogICBib29sIEluY29tcGxldGVJbXBsID0gZmFsc2U7CiAgIE1hdGNoQWxsTWV0aG9kRGVjbGFyYXRpb25zKEluc01hcCwgQ2xzTWFwLCBJbnNNYXBTZWVuLCBDbHNNYXBTZWVuLApAQCAtMTg3NiwyNCArMTk1NiwyMiBAQAogICBTZWxlY3RvclNldCBJbnNNYXA7CiAgIC8vIENoZWNrIGFuZCBzZWUgaWYgaW5zdGFuY2UgbWV0aG9kcyBpbiBjbGFzcyBpbnRlcmZhY2UgaGF2ZSBiZWVuCiAgIC8vIGltcGxlbWVudGVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgZm9yIChPYmpDSW1wbGVtZW50YXRpb25EZWNsOjppbnN0bWV0aF9pdGVyYXRvcgotICAgICAgICAgSSA9IElNUERlY2wtPmluc3RtZXRoX2JlZ2luKCksIEUgPSBJTVBEZWNsLT5pbnN0bWV0aF9lbmQoKTsgSSE9RTsgKytJKQotICAgIEluc01hcC5pbnNlcnQoKCpJKS0+Z2V0U2VsZWN0b3IoKSk7CisgIGZvciAoY29uc3QgYXV0byAqSSA6IElNUERlY2wtPmluc3RhbmNlX21ldGhvZHMoKSkKKyAgICBJbnNNYXAuaW5zZXJ0KEktPmdldFNlbGVjdG9yKCkpOwogCiAgIC8vIENoZWNrIGFuZCBzZWUgaWYgcHJvcGVydGllcyBkZWNsYXJlZCBpbiB0aGUgaW50ZXJmYWNlIGhhdmUgZWl0aGVyIDEpCiAgIC8vIGFuIGltcGxlbWVudGF0aW9uIG9yIDIpIHRoZXJlIGlzIGEgQHN5bnRoZXNpemUvQGR5bmFtaWMgaW1wbGVtZW50YXRpb24KICAgLy8gb2YgdGhlIHByb3BlcnR5IGluIHRoZSBAaW1wbGVtZW50YXRpb24uCi0gIGlmIChjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSURlY2wgPSBkeW5fY2FzdDxPYmpDSW50ZXJmYWNlRGVjbD4oQ0RlY2wpKQotICAgIGlmICAoIShMYW5nT3B0cy5PYmpDRGVmYXVsdFN5bnRoUHJvcGVydGllcyAmJgotICAgICAgICAgICBMYW5nT3B0cy5PYmpDUnVudGltZS5pc05vbkZyYWdpbGUoKSkgfHwKLSAgICAgICAgIElEZWNsLT5pc09iakNSZXF1aXJlc1Byb3BlcnR5RGVmcygpKQotICAgICAgRGlhZ25vc2VVbmltcGxlbWVudGVkUHJvcGVydGllcyhTLCBJTVBEZWNsLCBDRGVjbCk7Ci0gICAgICAKKyAgaWYgKGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRGVjbCA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPihDRGVjbCkpIHsKKyAgICBib29sIFN5bnRoZXNpemVQcm9wZXJ0aWVzID0gTGFuZ09wdHMuT2JqQ0RlZmF1bHRTeW50aFByb3BlcnRpZXMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFuZ09wdHMuT2JqQ1J1bnRpbWUuaXNOb25GcmFnaWxlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUlEZWNsLT5pc09iakNSZXF1aXJlc1Byb3BlcnR5RGVmcygpOworICAgIERpYWdub3NlVW5pbXBsZW1lbnRlZFByb3BlcnRpZXMoUywgSU1QRGVjbCwgQ0RlY2wsIFN5bnRoZXNpemVQcm9wZXJ0aWVzKTsKKyAgfQorCiAgIFNlbGVjdG9yU2V0IENsc01hcDsKLSAgZm9yIChPYmpDSW1wbGVtZW50YXRpb25EZWNsOjpjbGFzc21ldGhfaXRlcmF0b3IKLSAgICAgICBJID0gSU1QRGVjbC0+Y2xhc3NtZXRoX2JlZ2luKCksCi0gICAgICAgRSA9IElNUERlY2wtPmNsYXNzbWV0aF9lbmQoKTsgSSAhPSBFOyArK0kpCi0gICAgQ2xzTWFwLmluc2VydCgoKkkpLT5nZXRTZWxlY3RvcigpKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogSU1QRGVjbC0+Y2xhc3NfbWV0aG9kcygpKQorICAgIENsc01hcC5pbnNlcnQoSS0+Z2V0U2VsZWN0b3IoKSk7CiAKICAgLy8gQ2hlY2sgZm9yIHR5cGUgY29uZmxpY3Qgb2YgbWV0aG9kcyBkZWNsYXJlZCBpbiBhIGNsYXNzL3Byb3RvY29sIGFuZAogICAvLyBpdHMgaW1wbGVtZW50YXRpb247IGlmIGFueS4KQEAgLTE5MTMsMjggKzE5OTEsMjUgQEAKICAgLy8gQ2hlY2sgYW5kIHNlZSBpZiBjbGFzcyBtZXRob2RzIGluIGNsYXNzIGludGVyZmFjZSBoYXZlIGJlZW4KICAgLy8gaW1wbGVtZW50ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLgogCisgIExhenlQcm90b2NvbE5hbWVTZXQgRXhwbGljaXRJbXBsUHJvdG9jb2xzOworCiAgIGlmIChPYmpDSW50ZXJmYWNlRGVjbCAqSSA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPiAoQ0RlY2wpKSB7Ci0gICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6YWxsX3Byb3RvY29sX2l0ZXJhdG9yCi0gICAgICAgICAgUEkgPSBJLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgIEUgPSBJLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9lbmQoKTsgUEkgIT0gRTsgKytQSSkKLSAgICAgIENoZWNrUHJvdG9jb2xNZXRob2REZWZzKElNUERlY2wtPmdldExvY2F0aW9uKCksICpQSSwgSW5jb21wbGV0ZUltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNNYXAsIENsc01hcCwgSSk7CisgICAgZm9yIChhdXRvICpQSSA6IEktPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29scygpKQorICAgICAgQ2hlY2tQcm90b2NvbE1ldGhvZERlZnMoKnRoaXMsIElNUERlY2wtPmdldExvY2F0aW9uKCksIFBJLCBJbmNvbXBsZXRlSW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc01hcCwgQ2xzTWFwLCBJLCBFeHBsaWNpdEltcGxQcm90b2NvbHMpOwogICAgIC8vIENoZWNrIGNsYXNzIGV4dGVuc2lvbnMgKHVubmFtZWQgY2F0ZWdvcmllcykKLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjp2aXNpYmxlX2V4dGVuc2lvbnNfaXRlcmF0b3IKLSAgICAgICAgICAgRXh0ID0gSS0+dmlzaWJsZV9leHRlbnNpb25zX2JlZ2luKCksCi0gICAgICAgICAgIEV4dEVuZCA9IEktPnZpc2libGVfZXh0ZW5zaW9uc19lbmQoKTsKLSAgICAgICAgIEV4dCAhPSBFeHRFbmQ7ICsrRXh0KSB7Ci0gICAgICBJbXBsTWV0aG9kc1ZzQ2xhc3NNZXRob2RzKFMsIElNUERlY2wsICpFeHQsIEluY29tcGxldGVJbXBsKTsKLSAgICB9CisgICAgZm9yIChhdXRvICpFeHQgOiBJLT52aXNpYmxlX2V4dGVuc2lvbnMoKSkKKyAgICAgIEltcGxNZXRob2RzVnNDbGFzc01ldGhvZHMoUywgSU1QRGVjbCwgRXh0LCBJbmNvbXBsZXRlSW1wbCk7CiAgIH0gZWxzZSBpZiAoT2JqQ0NhdGVnb3J5RGVjbCAqQyA9IGR5bl9jYXN0PE9iakNDYXRlZ29yeURlY2w+KENEZWNsKSkgewogICAgIC8vIEZvciBleHRlbmRlZCBjbGFzcywgdW5pbXBsZW1lbnRlZCBtZXRob2RzIGluIGl0cyBwcm90b2NvbHMgd2lsbAogICAgIC8vIGJlIHJlcG9ydGVkIGluIHRoZSBwcmltYXJ5IGNsYXNzLgogICAgIGlmICghQy0+SXNDbGFzc0V4dGVuc2lvbigpKSB7Ci0gICAgICBmb3IgKE9iakNDYXRlZ29yeURlY2w6OnByb3RvY29sX2l0ZXJhdG9yIFBJID0gQy0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgICAgRSA9IEMtPnByb3RvY29sX2VuZCgpOyBQSSAhPSBFOyArK1BJKQotICAgICAgICBDaGVja1Byb3RvY29sTWV0aG9kRGVmcyhJTVBEZWNsLT5nZXRMb2NhdGlvbigpLCAqUEksIEluY29tcGxldGVJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnNNYXAsIENsc01hcCwgQ0RlY2wpOwotICAgICAgRGlhZ25vc2VVbmltcGxlbWVudGVkUHJvcGVydGllcyhTLCBJTVBEZWNsLCBDRGVjbCk7CisgICAgICBmb3IgKGF1dG8gKlAgOiBDLT5wcm90b2NvbHMoKSkKKyAgICAgICAgQ2hlY2tQcm90b2NvbE1ldGhvZERlZnMoKnRoaXMsIElNUERlY2wtPmdldExvY2F0aW9uKCksIFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY29tcGxldGVJbXBsLCBJbnNNYXAsIENsc01hcCwgQ0RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxpY2l0SW1wbFByb3RvY29scyk7CisgICAgICBEaWFnbm9zZVVuaW1wbGVtZW50ZWRQcm9wZXJ0aWVzKFMsIElNUERlY2wsIENEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTeW50aGVzaXplUHJvcGVydGllcyAqLyBmYWxzZSk7CiAgICAgfSAKICAgfSBlbHNlCiAgICAgbGx2bV91bnJlYWNoYWJsZSgiaW52YWxpZCBPYmpDQ29udGFpbmVyRGVjbCB0eXBlLiIpOwpAQCAtMjEwMyw4ICsyMTc4LDggQEAKIGJvb2wgU2VtYTo6TWF0Y2hUd29NZXRob2REZWNsYXJhdGlvbnMoY29uc3QgT2JqQ01ldGhvZERlY2wgKmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpyaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWF0Y2hTdHJhdGVneSBzdHJhdGVneSkgewotICBpZiAoIW1hdGNoVHlwZXMoQ29udGV4dCwgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICBsZWZ0LT5nZXRSZXN1bHRUeXBlKCksIHJpZ2h0LT5nZXRSZXN1bHRUeXBlKCkpKQorICBpZiAoIW1hdGNoVHlwZXMoQ29udGV4dCwgc3RyYXRlZ3ksIGxlZnQtPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICAgIHJpZ2h0LT5nZXRSZXR1cm5UeXBlKCkpKQogICAgIHJldHVybiBmYWxzZTsKIAogICAvLyBJZiBlaXRoZXIgaXMgaGlkZGVuLCBpdCBpcyBub3QgY29uc2lkZXJlZCB0byBtYXRjaC4KQEAgLTIyMzMsNyArMjMwOCw3IEBACiAKICAgLy8gRG9uJ3QgY29tcGxhaW4gYWJvdXQgbWlzbWF0Y2hlcyBmb3IgLWxlbmd0aCBpZiB0aGUgbWV0aG9kIHdlCiAgIC8vIGNob3NlIGhhcyBhbiBpbnRlZ3JhbCByZXN1bHQgdHlwZS4KLSAgcmV0dXJuIChjaG9zZW4tPmdldFJlc3VsdFR5cGUoKS0+aXNJbnRlZ2VyVHlwZSgpKTsKKyAgcmV0dXJuIChjaG9zZW4tPmdldFJldHVyblR5cGUoKS0+aXNJbnRlZ2VyVHlwZSgpKTsKIH0KIAogT2JqQ01ldGhvZERlY2wgKlNlbWE6Okxvb2t1cE1ldGhvZEluR2xvYmFsUG9vbChTZWxlY3RvciBTZWwsIFNvdXJjZVJhbmdlIFIsCkBAIC0yMzI3LDExICsyNDAyLDE1IEBACiAgICAgcmV0dXJuIDA7CiAKICAgR2xvYmFsTWV0aG9kcyAmTWV0aG9kcyA9IFBvcy0+c2Vjb25kOwotCi0gIGlmIChNZXRob2RzLmZpcnN0Lk1ldGhvZCAmJiBNZXRob2RzLmZpcnN0Lk1ldGhvZC0+aXNEZWZpbmVkKCkpCi0gICAgcmV0dXJuIE1ldGhvZHMuZmlyc3QuTWV0aG9kOwotICBpZiAoTWV0aG9kcy5zZWNvbmQuTWV0aG9kICYmIE1ldGhvZHMuc2Vjb25kLk1ldGhvZC0+aXNEZWZpbmVkKCkpCi0gICAgcmV0dXJuIE1ldGhvZHMuc2Vjb25kLk1ldGhvZDsKKyAgZm9yIChjb25zdCBPYmpDTWV0aG9kTGlzdCAqTWV0aG9kID0gJk1ldGhvZHMuZmlyc3Q7IE1ldGhvZDsKKyAgICAgICBNZXRob2QgPSBNZXRob2QtPmdldE5leHQoKSkKKyAgICBpZiAoTWV0aG9kLT5NZXRob2QgJiYgTWV0aG9kLT5NZXRob2QtPmlzRGVmaW5lZCgpKQorICAgICAgcmV0dXJuIE1ldGhvZC0+TWV0aG9kOworICAKKyAgZm9yIChjb25zdCBPYmpDTWV0aG9kTGlzdCAqTWV0aG9kID0gJk1ldGhvZHMuc2Vjb25kOyBNZXRob2Q7CisgICAgICAgTWV0aG9kID0gTWV0aG9kLT5nZXROZXh0KCkpCisgICAgaWYgKE1ldGhvZC0+TWV0aG9kICYmIE1ldGhvZC0+TWV0aG9kLT5pc0RlZmluZWQoKSkKKyAgICAgIHJldHVybiBNZXRob2QtPk1ldGhvZDsKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTI0MjMsNTEgKzI1MDIsNiBAQAogICByZXR1cm4gKFNlbGVjdGVkTWV0aG9kcy5zaXplKCkgPT0gMSkgPyBTZWxlY3RlZE1ldGhvZHNbMF0gOiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZAotSGVscGVyVG9EaWFnbm9zZU1pc21hdGNoZWRNZXRob2RzSW5HbG9iYWxQb29sKFNlbWEgJlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01ldGhvZExpc3QgJk1ldGhMaXN0KSB7Ci0gIE9iakNNZXRob2RMaXN0ICpNID0gJk1ldGhMaXN0OwotICBPYmpDTWV0aG9kRGVjbCAqVGFyZ2V0TWV0aG9kID0gTS0+TWV0aG9kOwotICB3aGlsZSAoVGFyZ2V0TWV0aG9kICYmCi0gICAgICAgICBpc2E8T2JqQ0ltcGxEZWNsPihUYXJnZXRNZXRob2QtPmdldERlY2xDb250ZXh0KCkpKSB7Ci0gICAgTSA9IE0tPmdldE5leHQoKTsKLSAgICBUYXJnZXRNZXRob2QgPSBNID8gTS0+TWV0aG9kIDogMDsKLSAgfQotICBpZiAoIVRhcmdldE1ldGhvZCkKLSAgICByZXR1cm47Ci0gIGJvb2wgRmlyc3RUaW1lID0gdHJ1ZTsKLSAgZm9yIChNID0gTS0+Z2V0TmV4dCgpOyBNOyBNPU0tPmdldE5leHQoKSkgewotICAgIE9iakNNZXRob2REZWNsICpNYXRjaGluZ01ldGhvZERlY2wgPSBNLT5NZXRob2Q7Ci0gICAgaWYgKGlzYTxPYmpDSW1wbERlY2w+KE1hdGNoaW5nTWV0aG9kRGVjbC0+Z2V0RGVjbENvbnRleHQoKSkpCi0gICAgICBjb250aW51ZTsKLSAgICBpZiAoIVMuTWF0Y2hUd29NZXRob2REZWNsYXJhdGlvbnMoVGFyZ2V0TWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGluZ01ldGhvZERlY2wsIFNlbWE6Ok1NU19sb29zZSkpIHsKLSAgICAgIGlmIChGaXJzdFRpbWUpIHsKLSAgICAgICAgRmlyc3RUaW1lID0gZmFsc2U7Ci0gICAgICAgIFMuRGlhZyhUYXJnZXRNZXRob2QtPmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5pbmdfbXVsdGlwbGVfc2VsZWN0b3JzKQotICAgICAgICA8PCBUYXJnZXRNZXRob2QtPmdldFNlbGVjdG9yKCk7Ci0gICAgICB9Ci0gICAgICBTLkRpYWcoTWF0Y2hpbmdNZXRob2REZWNsLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX2Fsc29fZm91bmQpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFNlbWE6OkRpYWdub3NlTWlzbWF0Y2hlZE1ldGhvZHNJbkdsb2JhbFBvb2woKSB7Ci0gIHVuc2lnbmVkIERJQUcgPSBkaWFnOjp3YXJuaW5nX211bHRpcGxlX3NlbGVjdG9yczsKLSAgaWYgKERpYWdzLmdldERpYWdub3N0aWNMZXZlbChESUFHLCBTb3VyY2VMb2NhdGlvbigpKQotICAgICAgPT0gRGlhZ25vc3RpY3NFbmdpbmU6Oklnbm9yZWQpCi0gICAgcmV0dXJuOwotICBmb3IgKEdsb2JhbE1ldGhvZFBvb2w6Oml0ZXJhdG9yIGIgPSBNZXRob2RQb29sLmJlZ2luKCksCi0gICAgICAgZSA9IE1ldGhvZFBvb2wuZW5kKCk7IGIgIT0gZTsgYisrKSB7Ci0gICAgLy8gZmlyc3QsIGluc3RhbmNlIG1ldGhvZHMKLSAgICBPYmpDTWV0aG9kTGlzdCAmSW5zdE1ldGhMaXN0ID0gYi0+c2Vjb25kLmZpcnN0OwotICAgIEhlbHBlclRvRGlhZ25vc2VNaXNtYXRjaGVkTWV0aG9kc0luR2xvYmFsUG9vbCgqdGhpcywgSW5zdE1ldGhMaXN0KTsKLSAgICAvLyBzZWNvbmQsIGNsYXNzIG1ldGhvZHMKLSAgICBPYmpDTWV0aG9kTGlzdCAmQ2xzTWV0aExpc3QgPSBiLT5zZWNvbmQuc2Vjb25kOwotICAgIEhlbHBlclRvRGlhZ25vc2VNaXNtYXRjaGVkTWV0aG9kc0luR2xvYmFsUG9vbCgqdGhpcywgQ2xzTWV0aExpc3QpOwotICB9Ci19Ci0KIC8vLyBEaWFnbm9zZUR1cGxpY2F0ZUl2YXJzIC0KIC8vLyBDaGVjayBmb3IgZHVwbGljYXRlIGl2YXJzIGluIHRoZSBlbnRpcmUgY2xhc3MgYXQgdGhlIHN0YXJ0IG9mIAogLy8vIFxAaW1wbGVtZW50YXRpb24uIFRoaXMgYmVjb21lcyBuZWNlc3NzYXJ5IGJlY2F1c2UgY2xhc3MgZXh0ZW5zaW9uIGNhbgpAQCAtMjQ3NSw5ICsyNTA5LDcgQEAKIC8vLyBjbGFzcydzIFxAaW1wbGVtZW50YXRpb24gaXMgc2Vlbi4KIHZvaWQgU2VtYTo6RGlhZ25vc2VEdXBsaWNhdGVJdmFycyhPYmpDSW50ZXJmYWNlRGVjbCAqSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VEZWNsICpTSUQpIHsKLSAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6aXZhcl9pdGVyYXRvciBJVkkgPSBJRC0+aXZhcl9iZWdpbigpLAotICAgICAgIElWRSA9IElELT5pdmFyX2VuZCgpOyBJVkkgIT0gSVZFOyArK0lWSSkgewotICAgIE9iakNJdmFyRGVjbCogSXZhciA9ICpJVkk7CisgIGZvciAoYXV0byAqSXZhciA6IElELT5pdmFycygpKSB7CiAgICAgaWYgKEl2YXItPmlzSW52YWxpZERlY2woKSkKICAgICAgIGNvbnRpbnVlOwogICAgIGlmIChJZGVudGlmaWVySW5mbyAqSUkgPSBJdmFyLT5nZXRJZGVudGlmaWVyKCkpIHsKQEAgLTI2MDMsMTAgKzI2MzUsOCBAQAogICAgICAgLy8gUHJvY2Vzc1Byb3BlcnR5RGVjbCBpcyByZXNwb25zaWJsZSBmb3IgZGlhZ25vc2luZyBjb25mbGljdHMgd2l0aCBhbnkKICAgICAgIC8vIHVzZXItZGVmaW5lZCBzZXR0ZXIvZ2V0dGVyLiBJdCBhbHNvIHN5bnRoZXNpemVzIHNldHRlci9nZXR0ZXIgbWV0aG9kcwogICAgICAgLy8gYW5kIGFkZHMgdGhlbSB0byB0aGUgRGVjbENvbnRleHQgYW5kIGdsb2JhbCBtZXRob2QgcG9vbHMuCi0gICAgICBmb3IgKE9iakNDb250YWluZXJEZWNsOjpwcm9wX2l0ZXJhdG9yIEkgPSBDRGVjbC0+cHJvcF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gQ0RlY2wtPnByb3BfZW5kKCk7Ci0gICAgICAgICAgIEkgIT0gRTsgKytJKQotICAgICAgICBQcm9jZXNzUHJvcGVydHlEZWNsKCpJLCBDRGVjbCk7CisgICAgICBmb3IgKGF1dG8gKkkgOiBDRGVjbC0+cHJvcGVydGllcygpKQorICAgICAgICBQcm9jZXNzUHJvcGVydHlEZWNsKEksIENEZWNsKTsKICAgICBDRGVjbC0+c2V0QXRFbmRSYW5nZShBdEVuZCk7CiAgIH0KICAgaWYgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKklDPWR5bl9jYXN0PE9iakNJbXBsZW1lbnRhdGlvbkRlY2w+KENsYXNzRGVjbCkpIHsKQEAgLTI2MTcsMTMgKzI2NDcsOCBAQAogICAgICAgLy8gb2YgdGhlIG90aGVyIGNsYXNzIGV4dGVuc2lvbnMuIE1hcmsgdGhlbSBhcyBzeW50aGVzaXplZCBhcwogICAgICAgLy8gcHJvcGVydHkgd2lsbCBiZSBzeW50aGVzaXplZCB3aGVuIHByb3BlcnR5IHdpdGggc2FtZSBuYW1lIGlzCiAgICAgICAvLyBzZWVuIGluIHRoZSBAaW1wbGVtZW50YXRpb24uCi0gICAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjp2aXNpYmxlX2V4dGVuc2lvbnNfaXRlcmF0b3IKLSAgICAgICAgICAgICBFeHQgPSBJRGVjbC0+dmlzaWJsZV9leHRlbnNpb25zX2JlZ2luKCksCi0gICAgICAgICAgICAgRXh0RW5kID0gSURlY2wtPnZpc2libGVfZXh0ZW5zaW9uc19lbmQoKTsKLSAgICAgICAgICAgRXh0ICE9IEV4dEVuZDsgKytFeHQpIHsKLSAgICAgICAgZm9yIChPYmpDQ29udGFpbmVyRGVjbDo6cHJvcF9pdGVyYXRvciBJID0gRXh0LT5wcm9wX2JlZ2luKCksCi0gICAgICAgICAgICAgRSA9IEV4dC0+cHJvcF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgICAgICBPYmpDUHJvcGVydHlEZWNsICpQcm9wZXJ0eSA9ICpJOworICAgICAgZm9yIChjb25zdCBhdXRvICpFeHQgOiBJRGVjbC0+dmlzaWJsZV9leHRlbnNpb25zKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICpQcm9wZXJ0eSA6IEV4dC0+cHJvcGVydGllcygpKSB7CiAgICAgICAgICAgLy8gU2tpcCBvdmVyIHByb3BlcnRpZXMgZGVjbGFyZWQgQGR5bmFtaWMKICAgICAgICAgICBpZiAoY29uc3QgT2JqQ1Byb3BlcnR5SW1wbERlY2wgKlBJRGVjbAogICAgICAgICAgICAgICA9IElDLT5GaW5kUHJvcGVydHlJbXBsRGVjbChQcm9wZXJ0eS0+Z2V0SWRlbnRpZmllcigpKSkKQEAgLTI2MzEsMTAgKzI2NTYsNyBAQAogICAgICAgICAgICAgICAgICAgPT0gT2JqQ1Byb3BlcnR5SW1wbERlY2w6OkR5bmFtaWMpCiAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6dmlzaWJsZV9leHRlbnNpb25zX2l0ZXJhdG9yCi0gICAgICAgICAgICAgICAgIEV4dCA9IElEZWNsLT52aXNpYmxlX2V4dGVuc2lvbnNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgRXh0RW5kID0gSURlY2wtPnZpc2libGVfZXh0ZW5zaW9uc19lbmQoKTsKLSAgICAgICAgICAgICAgIEV4dCAhPSBFeHRFbmQ7ICsrRXh0KSB7CisgICAgICAgICAgZm9yIChjb25zdCBhdXRvICpFeHQgOiBJRGVjbC0+dmlzaWJsZV9leHRlbnNpb25zKCkpIHsKICAgICAgICAgICAgIGlmIChPYmpDTWV0aG9kRGVjbCAqR2V0dGVyTWV0aG9kCiAgICAgICAgICAgICAgICAgICA9IEV4dC0+Z2V0SW5zdGFuY2VNZXRob2QoUHJvcGVydHktPmdldEdldHRlck5hbWUoKSkpCiAgICAgICAgICAgICAgIEdldHRlck1ldGhvZC0+c2V0UHJvcGVydHlBY2Nlc3Nvcih0cnVlKTsKQEAgLTI2NDgsNyArMjY3MCwxMCBAQAogICAgICAgSW1wbE1ldGhvZHNWc0NsYXNzTWV0aG9kcyhTLCBJQywgSURlY2wpOwogICAgICAgQXRvbWljUHJvcGVydHlTZXR0ZXJHZXR0ZXJSdWxlcyhJQywgSURlY2wpOwogICAgICAgRGlhZ25vc2VPd25pbmdQcm9wZXJ0eUdldHRlclN5bnRoZXNpcyhJQyk7Ci0gIAorICAgICAgRGlhZ25vc2VVbnVzZWRCYWNraW5nSXZhckluQWNjZXNzb3IoUywgSUMpOworICAgICAgaWYgKElEZWNsLT5oYXNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKCkpCisgICAgICAgIERpYWdub3NlTWlzc2luZ0Rlc2lnbmF0ZWRJbml0T3ZlcnJpZGVzKElDLCBJRGVjbCk7CisKICAgICAgIGJvb2wgSGFzUm9vdENsYXNzQXR0ciA9IElEZWNsLT5oYXNBdHRyPE9iakNSb290Q2xhc3NBdHRyPigpOwogICAgICAgaWYgKElEZWNsLT5nZXRTdXBlckNsYXNzKCkgPT0gTlVMTCkgewogICAgICAgICAvLyBUaGlzIGNsYXNzIGhhcyBubyBzdXBlcmNsYXNzLCBzbyBjaGVjayB0aGF0IGl0IGhhcyBiZWVuIG1hcmtlZCB3aXRoCkBAIC0yNzI5LDcyICsyNzU0LDE0IEBACiAgIHJldHVybiAoRGVjbDo6T2JqQ0RlY2xRdWFsaWZpZXIpICh1bnNpZ25lZCkgUFFUVmFsOwogfQogCi1zdGF0aWMgaW5saW5lCi11bnNpZ25lZCBjb3VudEFsaWduQXR0cihjb25zdCBBdHRyVmVjICZBKSB7Ci0gIHVuc2lnbmVkIGNvdW50PTA7Ci0gIGZvciAoQXR0clZlYzo6Y29uc3RfaXRlcmF0b3IgaSA9IEEuYmVnaW4oKSwgZSA9IEEuZW5kKCk7IGkgIT0gZTsgKytpKQotICAgIGlmICgoKmkpLT5nZXRLaW5kKCkgPT0gYXR0cjo6QWxpZ25lZCkKLSAgICAgICsrY291bnQ7Ci0gIHJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIGlubGluZQotYm9vbCBjb250YWluc0ludmFsaWRNZXRob2RJbXBsQXR0cmlidXRlKE9iakNNZXRob2REZWNsICpJTUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0clZlYyAmQSkgewotICAvLyBJZiBtZXRob2QgaXMgb25seSBkZWNsYXJlZCBpbiBpbXBsZW1lbnRhdGlvbiAocHJpdmF0ZSBtZXRob2QpLAotICAvLyBObyBuZWVkIHRvIGlzc3VlIGFueSBkaWFnbm9zdGljcyBvbiBtZXRob2QgZGVmaW5pdGlvbiB3aXRoIGF0dHJpYnV0ZXMuCi0gIGlmICghSU1EKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8vIG1ldGhvZCBkZWNsYXJlZCBpbiBpbnRlcmZhY2UgaGFzIG5vIGF0dHJpYnV0ZS4gCi0gIC8vIEJ1dCBpbXBsZW1lbnRhdGlvbiBoYXMgYXR0cmlidXRlcy4gVGhpcyBpcyBpbnZhbGlkLgotICAvLyBFeGNlcHQgd2hlbiBpbXBsZW1lbnRhdGlvbiBoYXMgJ0FsaWduJyBhdHRyaWJ1dGUgd2hpY2ggaXMKLSAgLy8gaW1tYXRlcmlhbCB0byBtZXRob2QgZGVjbGFyZWQgaW4gaW50ZXJmYWNlLgotICBpZiAoIUlNRC0+aGFzQXR0cnMoKSkKLSAgICByZXR1cm4gKEEuc2l6ZSgpID4gY291bnRBbGlnbkF0dHIoQSkpOwotCi0gIGNvbnN0IEF0dHJWZWMgJkQgPSBJTUQtPmdldEF0dHJzKCk7Ci0KLSAgdW5zaWduZWQgY291bnRBbGlnbk9uSW1wbCA9IGNvdW50QWxpZ25BdHRyKEEpOwotICBpZiAoIWNvdW50QWxpZ25PbkltcGwgJiYgKEEuc2l6ZSgpICE9IEQuc2l6ZSgpKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZWxzZSBpZiAoY291bnRBbGlnbk9uSW1wbCkgewotICAgIHVuc2lnbmVkIGNvdW50QWxpZ25PbkRlY2wgPSBjb3VudEFsaWduQXR0cihEKTsKLSAgICBpZiAoY291bnRBbGlnbk9uRGVjbCAmJiAoQS5zaXplKCkgIT0gRC5zaXplKCkpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAoIWNvdW50QWxpZ25PbkRlY2wgJiYgCi0gICAgICAgICAgICAgKChBLnNpemUoKS1jb3VudEFsaWduT25JbXBsKSAhPSBELnNpemUoKSkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLy8gYXR0cmlidXRlcyBvbiBtZXRob2QgZGVjbGFyYXRpb24gYW5kIGRlZmluaXRpb24gbXVzdCBtYXRjaCBleGFjdGx5LgotICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSBhdCBtb3N0IGEgY291cGxlIG9mIGF0dHJpYnV0ZXMgb24gbWV0aG9kcywgc28gdGhpcwotICAvLyBuKm4gc2VhcmNoIGlzIGdvb2QgZW5vdWdoLgotICBmb3IgKEF0dHJWZWM6OmNvbnN0X2l0ZXJhdG9yIGkgPSBBLmJlZ2luKCksIGUgPSBBLmVuZCgpOyBpICE9IGU7ICsraSkgewotICAgIGlmICgoKmkpLT5nZXRLaW5kKCkgPT0gYXR0cjo6QWxpZ25lZCkKLSAgICAgIGNvbnRpbnVlOwotICAgIGJvb2wgbWF0Y2ggPSBmYWxzZTsKLSAgICBmb3IgKEF0dHJWZWM6OmNvbnN0X2l0ZXJhdG9yIGkxID0gRC5iZWdpbigpLCBlMSA9IEQuZW5kKCk7IGkxICE9IGUxOyArK2kxKSB7Ci0gICAgICBpZiAoKCppKS0+Z2V0S2luZCgpID09ICgqaTEpLT5nZXRLaW5kKCkpIHsKLSAgICAgICAgbWF0Y2ggPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFtYXRjaCkKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICByZXR1cm4gZmFsc2U7Ci19Ci0KIC8vLyBcYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgZGVjbGFyZWQgcmVzdWx0IHR5cGUgb2YgdGhlIGdpdmVuIE9iamVjdGl2ZS1DCiAvLy8gbWV0aG9kIGRlY2xhcmF0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgbWV0aG9kJ3MgY2xhc3MuCiAvLy8KIHN0YXRpYyBTZW1hOjpSZXN1bHRUeXBlQ29tcGF0aWJpbGl0eUtpbmQgCiBDaGVja1JlbGF0ZWRSZXN1bHRUeXBlQ29tcGF0aWJpbGl0eShTZW1hICZTLCBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKkN1cnJlbnRDbGFzcykgewotICBRdWFsVHlwZSBSZXN1bHRUeXBlID0gTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCk7Ci0gIAorICBRdWFsVHlwZSBSZXN1bHRUeXBlID0gTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCk7CisKICAgLy8gSWYgYW4gT2JqZWN0aXZlLUMgbWV0aG9kIGluaGVyaXRzIGl0cyByZWxhdGVkIHJlc3VsdCB0eXBlLCB0aGVuIGl0cyAKICAgLy8gZGVjbGFyZWQgcmVzdWx0IHR5cGUgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggaXRzIG93biBjbGFzcyB0eXBlLiBUaGUKICAgLy8gZGVjbGFyZWQgcmVzdWx0IHR5cGUgaXMgY29tcGF0aWJsZSBpZjoKQEAgLTI5MjgsMTIgKzI4OTUsOCBAQAogICAgICAgcmV0dXJuOwogICAgIAogICAgIC8vICAgLSBjYXRlZ29yaWVzLAotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6Omtub3duX2NhdGVnb3JpZXNfaXRlcmF0b3IKLSAgICAgICAgICAgY2F0ID0gaWZhY2UtPmtub3duX2NhdGVnb3JpZXNfYmVnaW4oKSwKLSAgICAgICAgICAgY2F0RW5kID0gaWZhY2UtPmtub3duX2NhdGVnb3JpZXNfZW5kKCk7Ci0gICAgICAgICBjYXQgIT0gY2F0RW5kOyArK2NhdCkgewotICAgICAgc2VhcmNoKCpjYXQpOwotICAgIH0KKyAgICBmb3IgKGF1dG8gKkNhdCA6IGlmYWNlLT5rbm93bl9jYXRlZ29yaWVzKCkpCisgICAgICBzZWFyY2goQ2F0KTsKIAogICAgIC8vICAgLSB0aGUgc3VwZXIgY2xhc3MsIGFuZAogICAgIGlmIChPYmpDSW50ZXJmYWNlRGVjbCAqc3VwZXIgPSBpZmFjZS0+Z2V0U3VwZXJDbGFzcygpKQpAQCAtMzEwMiw5ICszMDY1LDkgQEAKICAgUXVhbFR5cGUgcmVzdWx0RGVjbFR5cGU7CiAKICAgYm9vbCBIYXNSZWxhdGVkUmVzdWx0VHlwZSA9IGZhbHNlOwotICBUeXBlU291cmNlSW5mbyAqUmVzdWx0VEluZm8gPSAwOworICBUeXBlU291cmNlSW5mbyAqUmV0dXJuVEluZm8gPSAwOwogICBpZiAoUmV0dXJuVHlwZSkgewotICAgIHJlc3VsdERlY2xUeXBlID0gR2V0VHlwZUZyb21QYXJzZXIoUmV0dXJuVHlwZSwgJlJlc3VsdFRJbmZvKTsKKyAgICByZXN1bHREZWNsVHlwZSA9IEdldFR5cGVGcm9tUGFyc2VyKFJldHVyblR5cGUsICZSZXR1cm5USW5mbyk7CiAKICAgICBpZiAoQ2hlY2tGdW5jdGlvblJldHVyblR5cGUocmVzdWx0RGVjbFR5cGUsIE1ldGhvZExvYykpCiAgICAgICByZXR1cm4gMDsKQEAgLTMxMTYsMTggKzMwNzksMTQgQEAKICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKFNlbGVjdG9yTG9jcy5mcm9udCgpLCAiKGlkKSIpOwogICB9CiAKLSAgT2JqQ01ldGhvZERlY2wqIE9iakNNZXRob2QgPQotICAgIE9iakNNZXRob2REZWNsOjpDcmVhdGUoQ29udGV4dCwgTWV0aG9kTG9jLCBFbmRMb2MsIFNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdERlY2xUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0VEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kVHlwZSA9PSB0b2s6Om1pbnVzLCBpc1ZhcmlhZGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc1Byb3BlcnR5QWNjZXNzb3I9Ki9mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNJbXBsaWNpdGx5RGVjbGFyZWQ9Ki9mYWxzZSwgLyppc0RlZmluZWQ9Ki9mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlY2xLaW5kID09IHRvazo6b2JqY19vcHRpb25hbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBPYmpDTWV0aG9kRGVjbDo6T3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBPYmpDTWV0aG9kRGVjbDo6UmVxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNSZWxhdGVkUmVzdWx0VHlwZSk7CisgIE9iakNNZXRob2REZWNsICpPYmpDTWV0aG9kID0gT2JqQ01ldGhvZERlY2w6OkNyZWF0ZSgKKyAgICAgIENvbnRleHQsIE1ldGhvZExvYywgRW5kTG9jLCBTZWwsIHJlc3VsdERlY2xUeXBlLCBSZXR1cm5USW5mbywgQ3VyQ29udGV4dCwKKyAgICAgIE1ldGhvZFR5cGUgPT0gdG9rOjptaW51cywgaXNWYXJpYWRpYywKKyAgICAgIC8qaXNQcm9wZXJ0eUFjY2Vzc29yPSovZmFsc2UsCisgICAgICAvKmlzSW1wbGljaXRseURlY2xhcmVkPSovZmFsc2UsIC8qaXNEZWZpbmVkPSovZmFsc2UsCisgICAgICBNZXRob2REZWNsS2luZCA9PSB0b2s6Om9iamNfb3B0aW9uYWwgPyBPYmpDTWV0aG9kRGVjbDo6T3B0aW9uYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE9iakNNZXRob2REZWNsOjpSZXF1aXJlZCwKKyAgICAgIEhhc1JlbGF0ZWRSZXN1bHRUeXBlKTsKIAogICBTbWFsbFZlY3RvcjxQYXJtVmFyRGVjbCosIDE2PiBQYXJhbXM7CiAKQEAgLTMyMjEsMTcgKzMxODAsMTUgQEAKICAgICBpZiAoSU1EICYmIElNRC0+aGFzQXR0cjxPYmpDUmVxdWlyZXNTdXBlckF0dHI+KCkgJiYKICAgICAgICAgIU9iakNNZXRob2QtPmhhc0F0dHI8T2JqQ1JlcXVpcmVzU3VwZXJBdHRyPigpKSB7CiAgICAgICAvLyBtZXJnZSB0aGUgYXR0cmlidXRlIGludG8gaW1wbGVtZW50YXRpb24uCi0gICAgICBPYmpDTWV0aG9kLT5hZGRBdHRyKAotICAgICAgICBuZXcgKENvbnRleHQpIE9iakNSZXF1aXJlc1N1cGVyQXR0cihPYmpDTWV0aG9kLT5nZXRMb2NhdGlvbigpLCBDb250ZXh0KSk7CisgICAgICBPYmpDTWV0aG9kLT5hZGRBdHRyKE9iakNSZXF1aXJlc1N1cGVyQXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2QtPmdldExvY2F0aW9uKCkpKTsKICAgICB9Ci0gICAgaWYgKE9iakNNZXRob2QtPmhhc0F0dHJzKCkgJiYKLSAgICAgICAgY29udGFpbnNJbnZhbGlkTWV0aG9kSW1wbEF0dHJpYnV0ZShJTUQsIE9iakNNZXRob2QtPmdldEF0dHJzKCkpKSB7Ci0gICAgICBTb3VyY2VMb2NhdGlvbiBNZXRob2RMb2MgPSBJTUQtPmdldExvY2F0aW9uKCk7Ci0gICAgICBpZiAoIWdldFNvdXJjZU1hbmFnZXIoKS5pc0luU3lzdGVtSGVhZGVyKE1ldGhvZExvYykpIHsKLSAgICAgICAgRGlhZyhFbmRMb2MsIGRpYWc6Ondhcm5fYXR0cmlidXRlX21ldGhvZF9kZWYpOwotICAgICAgICBEaWFnKE1ldGhvZExvYywgZGlhZzo6bm90ZV9tZXRob2RfZGVjbGFyZWRfYXQpCisgICAgaWYgKGlzYTxPYmpDQ2F0ZWdvcnlJbXBsRGVjbD4oSW1wRGVjbCkpIHsKKyAgICAgIE9iakNNZXRob2RGYW1pbHkgZmFtaWx5ID0gCisgICAgICAgIE9iakNNZXRob2QtPmdldFNlbGVjdG9yKCkuZ2V0TWV0aG9kRmFtaWx5KCk7CisgICAgICBpZiAoZmFtaWx5ID09IE9NRl9kZWFsbG9jICYmIElNRCAmJiBJTUQtPmlzT3ZlcnJpZGluZygpKSAKKyAgICAgICAgRGlhZyhPYmpDTWV0aG9kLT5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX2RlYWxsb2NfaW5fY2F0ZWdvcnkpCiAgICAgICAgICAgPDwgT2JqQ01ldGhvZC0+Z2V0RGVjbE5hbWUoKTsKLSAgICAgIH0KICAgICB9CiAgIH0gZWxzZSB7CiAgICAgY2FzdDxEZWNsQ29udGV4dD4oQ2xhc3NEZWNsKS0+YWRkRGVjbChPYmpDTWV0aG9kKTsKQEAgLTM0ODIsOCArMzQzOSw2IEBACiAgICAgICBSZWZlcmVuY2VkU2VsZWN0b3JzW1NlbHNbSV0uZmlyc3RdID0gU2Vsc1tJXS5zZWNvbmQ7CiAgIH0KICAgCi0gIERpYWdub3NlTWlzbWF0Y2hlZE1ldGhvZHNJbkdsb2JhbFBvb2woKTsKLSAgCiAgIC8vIFdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgb25seSB3aGVuIHNlbGVjdG9yIHRhYmxlIGlzCiAgIC8vIGdlbmVyYXRlZCAod2hpY2ggbWVhbnMgdGhlcmUgaXMgYXQgbGVhc2Ugb25lIGltcGxlbWVudGF0aW9uCiAgIC8vIGluIHRoZSBUVSkuIFRoaXMgaXMgdG8gbWF0Y2ggZ2NjJ3MgYmVoYXZpb3IuCkBAIC0zNTAzLDM5ICszNDU4LDkzIEBACiBPYmpDSXZhckRlY2wgKgogU2VtYTo6R2V0SXZhckJhY2tpbmdQcm9wZXJ0eUFjY2Vzc29yKGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqJlBEZWNsKSBjb25zdCB7Ci0gIAorICBpZiAoTWV0aG9kLT5pc0NsYXNzTWV0aG9kKCkpCisgICAgcmV0dXJuIDA7CiAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRGVjbCA9IE1ldGhvZC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKTsKICAgaWYgKCFJRGVjbCkKICAgICByZXR1cm4gMDsKLSAgTWV0aG9kID0gSURlY2wtPmxvb2t1cE1ldGhvZChNZXRob2QtPmdldFNlbGVjdG9yKCksIHRydWUpOworICBNZXRob2QgPSBJRGVjbC0+bG9va3VwTWV0aG9kKE1ldGhvZC0+Z2V0U2VsZWN0b3IoKSwgLyppc0luc3RhbmNlPSovdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnNoYWxsb3dDYXRlZ29yeUxvb2t1cD0qL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZm9sbG93U3VwZXI9Ki9mYWxzZSk7CiAgIGlmICghTWV0aG9kIHx8ICFNZXRob2QtPmlzUHJvcGVydHlBY2Nlc3NvcigpKQogICAgIHJldHVybiAwOwotICBpZiAoKFBEZWNsID0gTWV0aG9kLT5maW5kUHJvcGVydHlEZWNsKCkpKSB7Ci0gICAgaWYgKCFQRGVjbC0+Z2V0RGVjbENvbnRleHQoKSkKLSAgICAgIHJldHVybiAwOwotICAgIC8vIE1ha2Ugc3VyZSBwcm9wZXJ0eSBiZWxvbmdzIHRvIGFjY2Vzc29yJ3MgY2xhc3MgYW5kIG5vdCB0bwotICAgIC8vIG9uZSBvZiBpdHMgc3VwZXIgY2xhc3Nlcy4KLSAgICBpZiAoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKkNJRCA9Ci0gICAgICAgIGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPihQRGVjbC0+Z2V0RGVjbENvbnRleHQoKSkpCi0gICAgICBpZiAoQ0lEICE9IElEZWNsKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gUERlY2wtPmdldFByb3BlcnR5SXZhckRlY2woKTsKLSAgfQorICBpZiAoKFBEZWNsID0gTWV0aG9kLT5maW5kUHJvcGVydHlEZWNsKCkpKQorICAgIGlmIChPYmpDSXZhckRlY2wgKklWID0gUERlY2wtPmdldFByb3BlcnR5SXZhckRlY2woKSkgeworICAgICAgLy8gcHJvcGVydHkgYmFja2luZyBpdmFyIG11c3QgYmVsb25nIHRvIHByb3BlcnR5J3MgY2xhc3MKKyAgICAgIC8vIG9yIGJlIGEgcHJpdmF0ZSBpdmFyIGluIGNsYXNzJ3MgaW1wbGVtZW50YXRpb24uCisgICAgICAvLyBGSVhNRS4gZml4IHRoZSBjb25zdC1uZXNzIGlzc3VlLgorICAgICAgSVYgPSBjb25zdF9jYXN0PE9iakNJbnRlcmZhY2VEZWNsICo+KElEZWNsKS0+bG9va3VwSW5zdGFuY2VWYXJpYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVYtPmdldElkZW50aWZpZXIoKSk7CisgICAgICByZXR1cm4gSVY7CisgICAgfQogICByZXR1cm4gMDsKIH0KIAotdm9pZCBTZW1hOjpEaWFnbm9zZVVudXNlZEJhY2tpbmdJdmFySW5BY2Nlc3NvcihTY29wZSAqUykgewotICBpZiAoUy0+aGFzVW5yZWNvdmVyYWJsZUVycm9yT2NjdXJyZWQoKSB8fCAhUy0+aXNJbk9iamNNZXRob2RTY29wZSgpKQorbmFtZXNwYWNlIHsKKyAgLy8vIFVzZWQgYnkgU2VtYTo6RGlhZ25vc2VVbnVzZWRCYWNraW5nSXZhckluQWNjZXNzb3IgdG8gY2hlY2sgaWYgYSBwcm9wZXJ0eQorICAvLy8gYWNjZXNzb3IgcmVmZXJlbmNlcyB0aGUgYmFja2luZyBpdmFyLgorICBjbGFzcyBVbnVzZWRCYWNraW5nSXZhckNoZWNrZXIgOgorICAgICAgcHVibGljIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPFVudXNlZEJhY2tpbmdJdmFyQ2hlY2tlcj4geworICBwdWJsaWM6CisgICAgU2VtYSAmUzsKKyAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kOworICAgIGNvbnN0IE9iakNJdmFyRGVjbCAqSXZhckQ7CisgICAgYm9vbCBBY2Nlc3NlZEl2YXI7CisgICAgYm9vbCBJbnZva2VkU2VsZk1ldGhvZDsKKworICAgIFVudXNlZEJhY2tpbmdJdmFyQ2hlY2tlcihTZW1hICZTLCBjb25zdCBPYmpDTWV0aG9kRGVjbCAqTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSXZhckRlY2wgKkl2YXJEKQorICAgICAgOiBTKFMpLCBNZXRob2QoTWV0aG9kKSwgSXZhckQoSXZhckQpLAorICAgICAgICBBY2Nlc3NlZEl2YXIoZmFsc2UpLCBJbnZva2VkU2VsZk1ldGhvZChmYWxzZSkgeworICAgICAgYXNzZXJ0KEl2YXJEKTsKKyAgICB9CisKKyAgICBib29sIFZpc2l0T2JqQ0l2YXJSZWZFeHByKE9iakNJdmFyUmVmRXhwciAqRSkgeworICAgICAgaWYgKEUtPmdldERlY2woKSA9PSBJdmFyRCkgeworICAgICAgICBBY2Nlc3NlZEl2YXIgPSB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIFZpc2l0T2JqQ01lc3NhZ2VFeHByKE9iakNNZXNzYWdlRXhwciAqRSkgeworICAgICAgaWYgKEUtPmdldFJlY2VpdmVyS2luZCgpID09IE9iakNNZXNzYWdlRXhwcjo6SW5zdGFuY2UgJiYKKyAgICAgICAgICBTLmlzU2VsZkV4cHIoRS0+Z2V0SW5zdGFuY2VSZWNlaXZlcigpLCBNZXRob2QpKSB7CisgICAgICAgIEludm9rZWRTZWxmTWV0aG9kID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfTsKK30KKwordm9pZCBTZW1hOjpEaWFnbm9zZVVudXNlZEJhY2tpbmdJdmFySW5BY2Nlc3NvcihTY29wZSAqUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKkltcGxEKSB7CisgIGlmIChTLT5oYXNVbnJlY292ZXJhYmxlRXJyb3JPY2N1cnJlZCgpKQogICAgIHJldHVybjsKLSAgCi0gIGNvbnN0IE9iakNNZXRob2REZWNsICpDdXJNZXRob2QgPSBnZXRDdXJNZXRob2REZWNsKCk7Ci0gIGlmICghQ3VyTWV0aG9kKQotICAgIHJldHVybjsKLSAgY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqUERlY2w7Ci0gIGNvbnN0IE9iakNJdmFyRGVjbCAqSVYgPSBHZXRJdmFyQmFja2luZ1Byb3BlcnR5QWNjZXNzb3IoQ3VyTWV0aG9kLCBQRGVjbCk7Ci0gIGlmIChJViAmJiAhSVYtPmdldEJhY2tpbmdJdmFyUmVmZXJlbmNlZEluQWNjZXNzb3IoKSkgewotICAgIERpYWcoZ2V0Q3VyTWV0aG9kRGVjbCgpLT5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX3VudXNlZF9wcm9wZXJ0eV9iYWNraW5nX2l2YXIpCi0gICAgPDwgSVYtPmdldERlY2xOYW1lKCk7Ci0gICAgRGlhZyhQRGVjbC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcm9wZXJ0eV9kZWNsYXJlKTsKKworICBmb3IgKGNvbnN0IGF1dG8gKkN1ck1ldGhvZCA6IEltcGxELT5pbnN0YW5jZV9tZXRob2RzKCkpIHsKKyAgICB1bnNpZ25lZCBESUFHID0gZGlhZzo6d2Fybl91bnVzZWRfcHJvcGVydHlfYmFja2luZ19pdmFyOworICAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IEN1ck1ldGhvZC0+Z2V0TG9jYXRpb24oKTsKKyAgICBpZiAoRGlhZ3MuZ2V0RGlhZ25vc3RpY0xldmVsKERJQUcsIExvYykgPT0gRGlhZ25vc3RpY3NFbmdpbmU6Oklnbm9yZWQpCisgICAgICBjb250aW51ZTsKKworICAgIGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgKlBEZWNsOworICAgIGNvbnN0IE9iakNJdmFyRGVjbCAqSVYgPSBHZXRJdmFyQmFja2luZ1Byb3BlcnR5QWNjZXNzb3IoQ3VyTWV0aG9kLCBQRGVjbCk7CisgICAgaWYgKCFJVikKKyAgICAgIGNvbnRpbnVlOworCisgICAgVW51c2VkQmFja2luZ0l2YXJDaGVja2VyIENoZWNrZXIoKnRoaXMsIEN1ck1ldGhvZCwgSVYpOworICAgIENoZWNrZXIuVHJhdmVyc2VTdG10KEN1ck1ldGhvZC0+Z2V0Qm9keSgpKTsKKyAgICBpZiAoQ2hlY2tlci5BY2Nlc3NlZEl2YXIpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIERvIG5vdCBpc3N1ZSB0aGlzIHdhcm5pbmcgaWYgYmFja2luZyBpdmFyIGlzIHVzZWQgc29tZXdoZXJlIGFuZCBhY2Nlc3NvcgorICAgIC8vIGltcGxlbWVudGF0aW9uIG1ha2VzIGEgc2VsZiBjYWxsLiBUaGlzIGlzIHRvIHByZXZlbnQgZmFsc2UgcG9zaXRpdmUgaW4KKyAgICAvLyBjYXNlcyB3aGVyZSB0aGUgaXZhciBpcyBhY2Nlc3NlZCBieSBhbm90aGVyIG1ldGhvZCB0aGF0IHRoZSBhY2Nlc3NvcgorICAgIC8vIGRlbGVnYXRlcyB0by4KKyAgICBpZiAoIUlWLT5pc1JlZmVyZW5jZWQoKSB8fCAhQ2hlY2tlci5JbnZva2VkU2VsZk1ldGhvZCkgeworICAgICAgRGlhZyhMb2MsIERJQUcpIDw8IElWOworICAgICAgRGlhZyhQRGVjbC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcm9wZXJ0eV9kZWNsYXJlKTsKKyAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1NlbWFFeGNlcHRpb25TcGVjLmNwcCBiL2xpYi9TZW1hL1NlbWFFeGNlcHRpb25TcGVjLmNwcAppbmRleCAzZThmMzI0Li41OWZkODVlIDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hRXhjZXB0aW9uU3BlYy5jcHAKKysrIGIvbGliL1NlbWEvU2VtYUV4Y2VwdGlvblNwZWMuY3BwCkBAIC0xMiw2ICsxMiw3IEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUTXV0YXRpb25MaXN0ZW5lci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9DWFhJbmhlcml0YW5jZS5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJDWFguaCIKQEAgLTEzMiw2ICsxMzMsMjUgQEAKICAgcmV0dXJuIFNvdXJjZURlY2wtPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwogfQogCit2b2lkIFNlbWE6OlVwZGF0ZUV4Y2VwdGlvblNwZWMoRnVuY3Rpb25EZWNsICpGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZTo6RXh0UHJvdG9JbmZvICZFUEkpIHsKKyAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlByb3RvID0gRkQtPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOworCisgIC8vIE92ZXJ3cml0ZSB0aGUgZXhjZXB0aW9uIHNwZWMgYW5kIHJlYnVpbGQgdGhlIGZ1bmN0aW9uIHR5cGUuCisgIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gTmV3RVBJID0gUHJvdG8tPmdldEV4dFByb3RvSW5mbygpOworICBOZXdFUEkuRXhjZXB0aW9uU3BlY1R5cGUgPSBFUEkuRXhjZXB0aW9uU3BlY1R5cGU7CisgIE5ld0VQSS5OdW1FeGNlcHRpb25zID0gRVBJLk51bUV4Y2VwdGlvbnM7CisgIE5ld0VQSS5FeGNlcHRpb25zID0gRVBJLkV4Y2VwdGlvbnM7CisgIE5ld0VQSS5Ob2V4Y2VwdEV4cHIgPSBFUEkuTm9leGNlcHRFeHByOworICBGRC0+c2V0VHlwZShDb250ZXh0LmdldEZ1bmN0aW9uVHlwZShQcm90by0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90by0+Z2V0UGFyYW1UeXBlcygpLCBOZXdFUEkpKTsKKworICAvLyBJZiB3ZSd2ZSBmdWxseSByZXNvbHZlZCB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24sIG5vdGlmeSBsaXN0ZW5lcnMuCisgIGlmICghaXNVbnJlc29sdmVkRXhjZXB0aW9uU3BlYyhFUEkuRXhjZXB0aW9uU3BlY1R5cGUpKQorICAgIGlmIChhdXRvICpMaXN0ZW5lciA9IGdldEFTVE11dGF0aW9uTGlzdGVuZXIoKSkKKyAgICAgIExpc3RlbmVyLT5SZXNvbHZlZEV4Y2VwdGlvblNwZWMoRkQpOworfQorCiAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBmdW5jdGlvbiBoYXMgYW4gaW1wbGljaXRseS1nZW5lcmF0ZWQgZXhjZXB0aW9uCiAvLy8gc3BlY2lmaWNhdGlvbi4KIHN0YXRpYyBib29sIGhhc0ltcGxpY2l0RXhjZXB0aW9uU3BlYyhGdW5jdGlvbkRlY2wgKkRlY2wpIHsKQEAgLTE0MCwxMCArMTYwLDEzIEBACiAgICAgICBEZWNsLT5nZXREZWNsTmFtZSgpLmdldENYWE92ZXJsb2FkZWRPcGVyYXRvcigpICE9IE9PX0FycmF5X0RlbGV0ZSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgLy8gSWYgdGhlIHVzZXIgZGlkbid0IGRlY2xhcmUgdGhlIGZ1bmN0aW9uLCBpdHMgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gbXVzdAotICAvLyBiZSBpbXBsaWNpdC4KKyAgLy8gRm9yIGEgZnVuY3Rpb24gdGhhdCB0aGUgdXNlciBkaWRuJ3QgZGVjbGFyZToKKyAgLy8gIC0gaWYgdGhpcyBpcyBhIGRlc3RydWN0b3IsIGl0cyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpcyBpbXBsaWNpdC4KKyAgLy8gIC0gaWYgdGhpcyBpcyAnb3BlcmF0b3IgZGVsZXRlJyBvciAnb3BlcmF0b3IgZGVsZXRlW10nLCB0aGUgZXhjZXB0aW9uCisgIC8vICAgIHNwZWNpZmljYXRpb24gaXMgYXMtaWYgYW4gZXhwbGljaXQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gd2FzIGdpdmVuCisgIC8vICAgIChwZXIgW2Jhc2ljLnN0Yy5keW5hbWljXXAyKS4KICAgaWYgKCFEZWNsLT5nZXRUeXBlU291cmNlSW5mbygpKQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KERlY2wpOwogCiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpUeSA9CiAgICAgRGVjbC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKQEAgLTE1NSw5ICsxNzgsMTMgQEAKICAgYm9vbCBJc09wZXJhdG9yTmV3ID0gT08gPT0gT09fTmV3IHx8IE9PID09IE9PX0FycmF5X05ldzsKICAgYm9vbCBNaXNzaW5nRXhjZXB0aW9uU3BlY2lmaWNhdGlvbiA9IGZhbHNlOwogICBib29sIE1pc3NpbmdFbXB0eUV4Y2VwdGlvblNwZWNpZmljYXRpb24gPSBmYWxzZTsKKwogICB1bnNpZ25lZCBEaWFnSUQgPSBkaWFnOjplcnJfbWlzbWF0Y2hlZF9leGNlcHRpb25fc3BlYzsKLSAgaWYgKGdldExhbmdPcHRzKCkuTWljcm9zb2Z0RXh0KQorICBib29sIFJldHVyblZhbHVlT25FcnJvciA9IHRydWU7CisgIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdEV4dCkgewogICAgIERpYWdJRCA9IGRpYWc6Ondhcm5fbWlzbWF0Y2hlZF9leGNlcHRpb25fc3BlYzsgCisgICAgUmV0dXJuVmFsdWVPbkVycm9yID0gZmFsc2U7CisgIH0KIAogICAvLyBDaGVjayB0aGUgdHlwZXMgYXMgd3JpdHRlbjogdGhleSBtdXN0IG1hdGNoIGJlZm9yZSBhbnkgZXhjZXB0aW9uCiAgIC8vIHNwZWNpZmljYXRpb24gYWRqdXN0bWVudCBpcyBhcHBsaWVkLgpAQCAtMTgyLDkgKzIwOSw5IEBACiAgIH0KIAogICAvLyBUaGUgZmFpbHVyZSB3YXMgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gbWlzc2luZyBleGNlcHRpb24KLSAgLy8gc3BlY2lmaWNhdGlvbjsgcmV0dXJuIGFuIGVycm9yLgorICAvLyBzcGVjaWZpY2F0aW9uOyByZXR1cm4gYW4gZXJyb3IsIGV4Y2VwdCBpbiBNUyBtb2RlIHdoZXJlIHRoaXMgaXMgYSB3YXJuaW5nLgogICBpZiAoIU1pc3NpbmdFeGNlcHRpb25TcGVjaWZpY2F0aW9uKQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBSZXR1cm5WYWx1ZU9uRXJyb3I7CiAKICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKk5ld1Byb3RvID0KICAgICBOZXctPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwpAQCAtMjAzLDggKzIzMCw4IEBACiAgICAgICBPbGQtPmlzRXh0ZXJuQygpKSB7CiAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBFUEkgPSBOZXdQcm90by0+Z2V0RXh0UHJvdG9JbmZvKCk7CiAgICAgRVBJLkV4Y2VwdGlvblNwZWNUeXBlID0gRVNUX0R5bmFtaWNOb25lOwotICAgIFF1YWxUeXBlIE5ld1R5cGUgPSBDb250ZXh0LmdldEZ1bmN0aW9uVHlwZShOZXdQcm90by0+Z2V0UmVzdWx0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdQcm90by0+Z2V0QXJnVHlwZXMoKSwgRVBJKTsKKyAgICBRdWFsVHlwZSBOZXdUeXBlID0gQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoTmV3UHJvdG8tPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3UHJvdG8tPmdldFBhcmFtVHlwZXMoKSwgRVBJKTsKICAgICBOZXctPnNldFR5cGUoTmV3VHlwZSk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CkBAIC0yMjQsOCArMjUxLDggQEAKIAogICAvLyBVcGRhdGUgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbgogICAvLyBzcGVjaWZpY2F0aW9uLgotICBRdWFsVHlwZSBOZXdUeXBlID0gQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoTmV3UHJvdG8tPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1Byb3RvLT5nZXRBcmdUeXBlcygpLCBFUEkpOworICBRdWFsVHlwZSBOZXdUeXBlID0gQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoTmV3UHJvdG8tPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1Byb3RvLT5nZXRQYXJhbVR5cGVzKCksIEVQSSk7CiAgIE5ldy0+c2V0VHlwZShOZXdUeXBlKTsKIAogICAvLyBXYXJuIGFib3V0IHRoZSBsYWNrIG9mIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgpAQCAtMjM5LDE2ICsyNjYsMTMgQEAKICAgY2FzZSBFU1RfRHluYW1pYzogewogICAgIE9TIDw8ICJ0aHJvdygiOwogICAgIGJvb2wgT25GaXJzdEV4Y2VwdGlvbiA9IHRydWU7Ci0gICAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6ZXhjZXB0aW9uX2l0ZXJhdG9yIEUgPSBPbGRQcm90by0+ZXhjZXB0aW9uX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFbmQgPSBPbGRQcm90by0+ZXhjZXB0aW9uX2VuZCgpOwotICAgICAgICAgRSAhPSBFRW5kOwotICAgICAgICAgKytFKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZFIDogT2xkUHJvdG8tPmV4Y2VwdGlvbnMoKSkgewogICAgICAgaWYgKE9uRmlyc3RFeGNlcHRpb24pCiAgICAgICAgIE9uRmlyc3RFeGNlcHRpb24gPSBmYWxzZTsKICAgICAgIGVsc2UKICAgICAgICAgT1MgPDwgIiwgIjsKICAgICAgIAotICAgICAgT1MgPDwgRS0+Z2V0QXNTdHJpbmcoZ2V0UHJpbnRpbmdQb2xpY3koKSk7CisgICAgICBPUyA8PCBFLmdldEFzU3RyaW5nKGdldFByaW50aW5nUG9saWN5KCkpOwogICAgIH0KICAgICBPUyA8PCAiKSI7CiAgICAgYnJlYWs7CkBAIC0zMDIsMTAgKzMyNiwxNCBAQAogICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpOZXcsIFNvdXJjZUxvY2F0aW9uIE5ld0xvYykgewogICB1bnNpZ25lZCBEaWFnSUQgPSBkaWFnOjplcnJfbWlzbWF0Y2hlZF9leGNlcHRpb25fc3BlYzsKICAgaWYgKGdldExhbmdPcHRzKCkuTWljcm9zb2Z0RXh0KQotICAgIERpYWdJRCA9IGRpYWc6Ondhcm5fbWlzbWF0Y2hlZF9leGNlcHRpb25fc3BlYzsgCi0gIHJldHVybiBDaGVja0VxdWl2YWxlbnRFeGNlcHRpb25TcGVjKFBEaWFnKERpYWdJRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEaWFnKGRpYWc6Om5vdGVfcHJldmlvdXNfZGVjbGFyYXRpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGQsIE9sZExvYywgTmV3LCBOZXdMb2MpOworICAgIERpYWdJRCA9IGRpYWc6Ondhcm5fbWlzbWF0Y2hlZF9leGNlcHRpb25fc3BlYzsKKyAgYm9vbCBSZXN1bHQgPSBDaGVja0VxdWl2YWxlbnRFeGNlcHRpb25TcGVjKFBEaWFnKERpYWdJRCksCisgICAgICBQRGlhZyhkaWFnOjpub3RlX3ByZXZpb3VzX2RlY2xhcmF0aW9uKSwgT2xkLCBPbGRMb2MsIE5ldywgTmV3TG9jKTsKKworICAvLyBJbiBNaWNyb3NvZnQgbW9kZSwgbWlzbWF0Y2hpbmcgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGp1c3QgY2F1c2UgYSB3YXJuaW5nLgorICBpZiAoZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRFeHQpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gUmVzdWx0OwogfQogCiAvLy8gQ2hlY2tFcXVpdmFsZW50RXhjZXB0aW9uU3BlYyAtIENoZWNrIGlmIHRoZSB0d28gdHlwZXMgaGF2ZSBjb21wYXRpYmxlCkBAIC00ODgsMTMgKzUxNiwxMSBAQAogICAvLyBCb3RoIGhhdmUgYSBkeW5hbWljIGV4Y2VwdGlvbiBzcGVjLiBDb2xsZWN0IHRoZSBmaXJzdCBzZXQsIHRoZW4gY29tcGFyZQogICAvLyB0byB0aGUgc2Vjb25kLgogICBsbHZtOjpTbWFsbFB0clNldDxDYW5RdWFsVHlwZSwgOD4gT2xkVHlwZXMsIE5ld1R5cGVzOwotICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjpleGNlcHRpb25faXRlcmF0b3IgSSA9IE9sZC0+ZXhjZXB0aW9uX2JlZ2luKCksCi0gICAgICAgRSA9IE9sZC0+ZXhjZXB0aW9uX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBPbGRUeXBlcy5pbnNlcnQoQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKCpJKS5nZXRVbnF1YWxpZmllZFR5cGUoKSk7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IE9sZC0+ZXhjZXB0aW9ucygpKQorICAgIE9sZFR5cGVzLmluc2VydChDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoSSkuZ2V0VW5xdWFsaWZpZWRUeXBlKCkpOwogCi0gIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmV4Y2VwdGlvbl9pdGVyYXRvciBJID0gTmV3LT5leGNlcHRpb25fYmVnaW4oKSwKLSAgICAgICBFID0gTmV3LT5leGNlcHRpb25fZW5kKCk7IEkgIT0gRSAmJiBTdWNjZXNzOyArK0kpIHsKLSAgICBDYW5RdWFsVHlwZSBUeXBlUHRyID0gQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKCpJKS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKKyAgZm9yIChjb25zdCBhdXRvICZJIDogTmV3LT5leGNlcHRpb25zKCkpIHsKKyAgICBDYW5RdWFsVHlwZSBUeXBlUHRyID0gQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKEkpLmdldFVucXVhbGlmaWVkVHlwZSgpOwogICAgIGlmKE9sZFR5cGVzLmNvdW50KFR5cGVQdHIpKQogICAgICAgTmV3VHlwZXMuaW5zZXJ0KFR5cGVQdHIpOwogICAgIGVsc2UKQEAgLTYwMiwxMCArNjI4LDkgQEAKICAgICAgICAgICJFeGNlcHRpb24gc3BlYyBzdWJzZXQ6IG5vbi1keW5hbWljIGNhc2Ugc2xpcHBlZCB0aHJvdWdoLiIpOwogCiAgIC8vIE5laXRoZXIgY29udGFpbnMgZXZlcnl0aGluZyBvciBub3RoaW5nLiBEbyBhIHByb3BlciBjb21wYXJpc29uLgotICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjpleGNlcHRpb25faXRlcmF0b3IgU3ViSSA9IFN1YnNldC0+ZXhjZXB0aW9uX2JlZ2luKCksCi0gICAgICAgU3ViRSA9IFN1YnNldC0+ZXhjZXB0aW9uX2VuZCgpOyBTdWJJICE9IFN1YkU7ICsrU3ViSSkgeworICBmb3IgKGNvbnN0IGF1dG8gJlN1YkkgOiBTdWJzZXQtPmV4Y2VwdGlvbnMoKSkgewogICAgIC8vIFRha2Ugb25lIHR5cGUgZnJvbSB0aGUgc3Vic2V0LgotICAgIFF1YWxUeXBlIENhbm9uaWNhbFN1YlQgPSBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoKlN1YkkpOworICAgIFF1YWxUeXBlIENhbm9uaWNhbFN1YlQgPSBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoU3ViSSk7CiAgICAgLy8gVW53cmFwIHBvaW50ZXJzIGFuZCByZWZlcmVuY2VzIHNvIHRoYXQgd2UgY2FuIGRvIGNoZWNrcyB3aXRoaW4gYSBjbGFzcwogICAgIC8vIGhpZXJhcmNoeS4gRG9uJ3QgdW53cmFwIG1lbWJlciBwb2ludGVyczsgdGhleSBkb24ndCBoYXZlIGhpZXJhcmNoeQogICAgIC8vIGNvbnZlcnNpb25zIG9uIHRoZSBwb2ludGVlLgpAQCAtNjI0LDEwICs2NDksOCBAQAogCiAgICAgYm9vbCBDb250YWluZWQgPSBmYWxzZTsKICAgICAvLyBNYWtlIHN1cmUgaXQncyBpbiB0aGUgc3VwZXJzZXQuCi0gICAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6ZXhjZXB0aW9uX2l0ZXJhdG9yIFN1cGVySSA9Ci0gICAgICAgICAgIFN1cGVyc2V0LT5leGNlcHRpb25fYmVnaW4oKSwgU3VwZXJFID0gU3VwZXJzZXQtPmV4Y2VwdGlvbl9lbmQoKTsKLSAgICAgICAgIFN1cGVySSAhPSBTdXBlckU7ICsrU3VwZXJJKSB7Ci0gICAgICBRdWFsVHlwZSBDYW5vbmljYWxTdXBlclQgPSBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoKlN1cGVySSk7CisgICAgZm9yIChjb25zdCBhdXRvICZTdXBlckkgOiBTdXBlcnNldC0+ZXhjZXB0aW9ucygpKSB7CisgICAgICBRdWFsVHlwZSBDYW5vbmljYWxTdXBlclQgPSBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoU3VwZXJJKTsKICAgICAgIC8vIFN1YlQgbXVzdCBiZSBTdXBlclQgb3IgZGVyaXZlZCBmcm9tIGl0LCBvciBwb2ludGVyIG9yIHJlZmVyZW5jZSB0bwogICAgICAgLy8gc3VjaCB0eXBlcy4KICAgICAgIGlmIChjb25zdCBSZWZlcmVuY2VUeXBlICpSZWZUeSA9IENhbm9uaWNhbFN1cGVyVC0+Z2V0QXM8UmVmZXJlbmNlVHlwZT4oKSkKQEAgLTcxMSwyMyArNzM0LDIxIEBACiAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlRhcmdldCwgU291cmNlTG9jYXRpb24gVGFyZ2V0TG9jLAogICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpTb3VyY2UsIFNvdXJjZUxvY2F0aW9uIFNvdXJjZUxvYykKIHsKLSAgaWYgKENoZWNrU3BlY0ZvclR5cGVzRXF1aXZhbGVudCgqdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEaWFnKGRpYWc6OmVycl9kZWVwX2V4Y2VwdGlvbl9zcGVjc19kaWZmZXIpIDw8IDAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEaWFnKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0LT5nZXRSZXN1bHRUeXBlKCksIFRhcmdldExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UtPmdldFJlc3VsdFR5cGUoKSwgU291cmNlTG9jKSkKKyAgaWYgKENoZWNrU3BlY0ZvclR5cGVzRXF1aXZhbGVudCgKKyAgICAgICAgICAqdGhpcywgUERpYWcoZGlhZzo6ZXJyX2RlZXBfZXhjZXB0aW9uX3NwZWNzX2RpZmZlcikgPDwgMCwgUERpYWcoKSwKKyAgICAgICAgICBUYXJnZXQtPmdldFJldHVyblR5cGUoKSwgVGFyZ2V0TG9jLCBTb3VyY2UtPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICBTb3VyY2VMb2MpKQogICAgIHJldHVybiB0cnVlOwogCiAgIC8vIFdlIHNob3VsZG4ndCBldmVuIGJlIHRlc3RpbmcgdGhpcyB1bmxlc3MgdGhlIGFyZ3VtZW50cyBhcmUgb3RoZXJ3aXNlCiAgIC8vIGNvbXBhdGlibGUuCi0gIGFzc2VydChUYXJnZXQtPmdldE51bUFyZ3MoKSA9PSBTb3VyY2UtPmdldE51bUFyZ3MoKSAmJgorICBhc3NlcnQoVGFyZ2V0LT5nZXROdW1QYXJhbXMoKSA9PSBTb3VyY2UtPmdldE51bVBhcmFtcygpICYmCiAgICAgICAgICAiRnVuY3Rpb25zIGhhdmUgZGlmZmVyZW50IGFyZ3VtZW50IGNvdW50cy4iKTsKLSAgZm9yICh1bnNpZ25lZCBpID0gMCwgRSA9IFRhcmdldC0+Z2V0TnVtQXJncygpOyBpICE9IEU7ICsraSkgewotICAgIGlmIChDaGVja1NwZWNGb3JUeXBlc0VxdWl2YWxlbnQoKnRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQRGlhZyhkaWFnOjplcnJfZGVlcF9leGNlcHRpb25fc3BlY3NfZGlmZmVyKSA8PCAxLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEaWFnKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQtPmdldEFyZ1R5cGUoaSksIFRhcmdldExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZS0+Z2V0QXJnVHlwZShpKSwgU291cmNlTG9jKSkKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgRSA9IFRhcmdldC0+Z2V0TnVtUGFyYW1zKCk7IGkgIT0gRTsgKytpKSB7CisgICAgaWYgKENoZWNrU3BlY0ZvclR5cGVzRXF1aXZhbGVudCgKKyAgICAgICAgICAgICp0aGlzLCBQRGlhZyhkaWFnOjplcnJfZGVlcF9leGNlcHRpb25fc3BlY3NfZGlmZmVyKSA8PCAxLCBQRGlhZygpLAorICAgICAgICAgICAgVGFyZ2V0LT5nZXRQYXJhbVR5cGUoaSksIFRhcmdldExvYywgU291cmNlLT5nZXRQYXJhbVR5cGUoaSksCisgICAgICAgICAgICBTb3VyY2VMb2MpKQogICAgICAgcmV0dXJuIHRydWU7CiAgIH0KICAgcmV0dXJuIGZhbHNlOwpAQCAtMTA2Myw3ICsxMDg0LDYgQEAKICAgY2FzZSBFeHByOjpBZGRyTGFiZWxFeHByQ2xhc3M6CiAgIGNhc2UgRXhwcjo6QXJyYXlUeXBlVHJhaXRFeHByQ2xhc3M6CiAgIGNhc2UgRXhwcjo6QXRvbWljRXhwckNsYXNzOgotICBjYXNlIEV4cHI6OkJpbmFyeVR5cGVUcmFpdEV4cHJDbGFzczoKICAgY2FzZSBFeHByOjpUeXBlVHJhaXRFeHByQ2xhc3M6CiAgIGNhc2UgRXhwcjo6Q1hYQm9vbExpdGVyYWxFeHByQ2xhc3M6CiAgIGNhc2UgRXhwcjo6Q1hYTm9leGNlcHRFeHByQ2xhc3M6CkBAIC0xMDg2LDcgKzExMDYsNiBAQAogICBjYXNlIEV4cHI6OlByZWRlZmluZWRFeHByQ2xhc3M6CiAgIGNhc2UgRXhwcjo6U2l6ZU9mUGFja0V4cHJDbGFzczoKICAgY2FzZSBFeHByOjpTdHJpbmdMaXRlcmFsQ2xhc3M6Ci0gIGNhc2UgRXhwcjo6VW5hcnlUeXBlVHJhaXRFeHByQ2xhc3M6CiAgICAgLy8gVGhlc2UgZXhwcmVzc2lvbnMgY2FuIG5ldmVyIHRocm93LgogICAgIHJldHVybiBDVF9DYW5ub3Q7CiAKZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1NlbWFFeHByLmNwcCBiL2xpYi9TZW1hL1NlbWFFeHByLmNwcAppbmRleCBlMWY2NWY0Li43ODk0NjgyIDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hRXhwci5jcHAKKysrIGIvbGliL1NlbWEvU2VtYUV4cHIuY3BwCkBAIC01OSw4ICs1OSw4IEBACiAKICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gaGFzIGEgZGVkdWNlZCByZXR1cm4gdHlwZSwgYW5kIHdlIGNhbid0IGRlZHVjZSBpdCwKICAgICAvLyB0aGVuIHdlIGNhbid0IHVzZSBpdCBlaXRoZXIuCi0gICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMXkgJiYgRkQtPmdldFJlc3VsdFR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCkgJiYKLSAgICAgICAgRGVkdWNlUmV0dXJuVHlwZShGRCwgU291cmNlTG9jYXRpb24oKSwgLypEaWFnbm9zZSovZmFsc2UpKQorICAgIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1czF5ICYmIEZELT5nZXRSZXR1cm5UeXBlKCktPmlzVW5kZWR1Y2VkVHlwZSgpICYmCisgICAgICAgIERlZHVjZVJldHVyblR5cGUoRkQsIFNvdXJjZUxvY2F0aW9uKCksIC8qRGlhZ25vc2UqLyBmYWxzZSkpCiAgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIApAQCAtMTExLDMyICsxMTEsMTcgQEAKICAgICAgIGJyZWFrOwogICAgICAgICAgICAgCiAgICAgY2FzZSBBUl9EZXByZWNhdGVkOgotICAgICAgUy5FbWl0RGVwcmVjYXRpb25XYXJuaW5nKEQsIE1lc3NhZ2UsIExvYywgVW5rbm93bk9iakNDbGFzcywgT2JqQ1BEZWNsKTsKKyAgICAgIGlmIChTLmdldEN1ckNvbnRleHRBdmFpbGFiaWxpdHkoKSAhPSBBUl9EZXByZWNhdGVkKQorICAgICAgICBTLkVtaXRBdmFpbGFiaWxpdHlXYXJuaW5nKFNlbWE6OkFEX0RlcHJlY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQsIE1lc3NhZ2UsIExvYywgVW5rbm93bk9iakNDbGFzcywgT2JqQ1BEZWNsKTsKICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCisKICAgICBjYXNlIEFSX1VuYXZhaWxhYmxlOgotICAgICAgaWYgKFMuZ2V0Q3VyQ29udGV4dEF2YWlsYWJpbGl0eSgpICE9IEFSX1VuYXZhaWxhYmxlKSB7Ci0gICAgICAgIGlmIChNZXNzYWdlLmVtcHR5KCkpIHsKLSAgICAgICAgICBpZiAoIVVua25vd25PYmpDQ2xhc3MpIHsKLSAgICAgICAgICAgIFMuRGlhZyhMb2MsIGRpYWc6OmVycl91bmF2YWlsYWJsZSkgPDwgRC0+Z2V0RGVjbE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChPYmpDUERlY2wpCi0gICAgICAgICAgICAgIFMuRGlhZyhPYmpDUERlY2wtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJvcGVydHlfYXR0cmlidXRlKQotICAgICAgICAgICAgICAgIDw8IE9iakNQRGVjbC0+Z2V0RGVjbE5hbWUoKSA8PCAxOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBTLkRpYWcoTG9jLCBkaWFnOjp3YXJuX3VuYXZhaWxhYmxlX2Z3ZGNsYXNzX21lc3NhZ2UpIAotICAgICAgICAgICAgICA8PCBELT5nZXREZWNsTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBTLkRpYWcoTG9jLCBkaWFnOjplcnJfdW5hdmFpbGFibGVfbWVzc2FnZSkgCi0gICAgICAgICAgICA8PCBELT5nZXREZWNsTmFtZSgpIDw8IE1lc3NhZ2U7Ci0gICAgICAgIFMuRGlhZyhELT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3VuYXZhaWxhYmxlX2hlcmUpCi0gICAgICAgICAgICAgICAgICA8PCBpc2E8RnVuY3Rpb25EZWNsPihEKSA8PCBmYWxzZTsKLSAgICAgICAgaWYgKE9iakNQRGVjbCkKLSAgICAgICAgICBTLkRpYWcoT2JqQ1BEZWNsLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3Byb3BlcnR5X2F0dHJpYnV0ZSkKLSAgICAgICAgICA8PCBPYmpDUERlY2wtPmdldERlY2xOYW1lKCkgPDwgMTsKLSAgICAgIH0KKyAgICAgIGlmIChTLmdldEN1ckNvbnRleHRBdmFpbGFiaWxpdHkoKSAhPSBBUl9VbmF2YWlsYWJsZSkKKyAgICAgICAgUy5FbWl0QXZhaWxhYmlsaXR5V2FybmluZyhTZW1hOjpBRF9VbmF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBELCBNZXNzYWdlLCBMb2MsIFVua25vd25PYmpDQ2xhc3MsIE9iakNQRGVjbCk7CiAgICAgICBicmVhazsKKwogICAgIH0KICAgICByZXR1cm4gUmVzdWx0OwogfQpAQCAtMTc2LDE2ICsxNjEsMTQgQEAKICAgICB9CiAgIH0KIAotICBEaWFnKERlY2wtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfdW5hdmFpbGFibGVfaGVyZSkKLSAgICA8PCAxIDw8IHRydWU7CisgIERpYWcoRGVjbC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9hdmFpbGFiaWxpdHlfc3BlY2lmaWVkX2hlcmUpCisgICAgPDwgRGVjbCA8PCB0cnVlOwogfQogCiAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIGEgRnVuY3Rpb25EZWNsIHdhcyBldmVyIGRlY2xhcmVkIHdpdGggYW4KIC8vLyBleHBsaWNpdCBzdG9yYWdlIGNsYXNzLgogc3RhdGljIGJvb2wgaGFzQW55RXhwbGljaXRTdG9yYWdlQ2xhc3MoY29uc3QgRnVuY3Rpb25EZWNsICpEKSB7Ci0gIGZvciAoRnVuY3Rpb25EZWNsOjpyZWRlY2xfaXRlcmF0b3IgSSA9IEQtPnJlZGVjbHNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRC0+cmVkZWNsc19lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgeworICBmb3IgKGF1dG8gSSA6IEQtPnJlZGVjbHMoKSkgewogICAgIGlmIChJLT5nZXRTdG9yYWdlQ2xhc3MoKSAhPSBTQ19Ob25lKQogICAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTI3OSwxMyArMjYyLDE4IEBACiAgICAgICBTbWFsbFZlY3RvckltcGw8UGFydGlhbERpYWdub3N0aWNBdD4gJlN1cHByZXNzZWQgPSBQb3MtPnNlY29uZDsKICAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBTdXBwcmVzc2VkLnNpemUoKTsgSSAhPSBOOyArK0kpCiAgICAgICAgIERpYWcoU3VwcHJlc3NlZFtJXS5maXJzdCwgU3VwcHJlc3NlZFtJXS5zZWNvbmQpOwotICAgICAgCisKICAgICAgIC8vIENsZWFyIG91dCB0aGUgbGlzdCBvZiBzdXBwcmVzc2VkIGRpYWdub3N0aWNzLCBzbyB0aGF0IHdlIGRvbid0IGVtaXQKICAgICAgIC8vIHRoZW0gYWdhaW4gZm9yIHRoaXMgc3BlY2lhbGl6YXRpb24uIEhvd2V2ZXIsIHdlIGRvbid0IG9ic29sZXRlIHRoaXMKICAgICAgIC8vIGVudHJ5IGZyb20gdGhlIHRhYmxlLCBiZWNhdXNlIHdlIHdhbnQgdG8gYXZvaWQgZXZlciBlbWl0dGluZyB0aGVzZQogICAgICAgLy8gZGlhZ25vc3RpY3MgYWdhaW4uCiAgICAgICBTdXBwcmVzc2VkLmNsZWFyKCk7CiAgICAgfQorCisgICAgLy8gQysrIFtiYXNpYy5zdGFydC5tYWluXXAzOgorICAgIC8vICAgVGhlIGZ1bmN0aW9uICdtYWluJyBzaGFsbCBub3QgYmUgdXNlZCB3aXRoaW4gYSBwcm9ncmFtLgorICAgIGlmIChjYXN0PEZ1bmN0aW9uRGVjbD4oRCktPmlzTWFpbigpKQorICAgICAgRGlhZyhMb2MsIGRpYWc6OmV4dF9tYWluX3VzZWQpOwogICB9CiAKICAgLy8gU2VlIGlmIHRoaXMgaXMgYW4gYXV0by10eXBlZCB2YXJpYWJsZSB3aG9zZSBpbml0aWFsaXplciB3ZSBhcmUgcGFyc2luZy4KQEAgLTMwNSw3ICsyOTMsNyBAQAogCiAgICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGhhcyBhIGRlZHVjZWQgcmV0dXJuIHR5cGUsIGFuZCB3ZSBjYW4ndCBkZWR1Y2UgaXQsCiAgICAgLy8gdGhlbiB3ZSBjYW4ndCB1c2UgaXQgZWl0aGVyLgotICAgIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1czF5ICYmIEZELT5nZXRSZXN1bHRUeXBlKCktPmlzVW5kZWR1Y2VkVHlwZSgpICYmCisgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMXkgJiYgRkQtPmdldFJldHVyblR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCkgJiYKICAgICAgICAgRGVkdWNlUmV0dXJuVHlwZShGRCwgTG9jKSkKICAgICAgIHJldHVybiB0cnVlOwogICB9CkBAIC0zNjcsNyArMzU1LDcgQEAKICAgICB9CiAKICAgICBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKnByb3RvID0gZHluX2Nhc3Q8RnVuY3Rpb25Qcm90b1R5cGU+KGZuKSkgewotICAgICAgbnVtRm9ybWFsUGFyYW1zID0gcHJvdG8tPmdldE51bUFyZ3MoKTsKKyAgICAgIG51bUZvcm1hbFBhcmFtcyA9IHByb3RvLT5nZXROdW1QYXJhbXMoKTsKICAgICB9IGVsc2UgewogICAgICAgbnVtRm9ybWFsUGFyYW1zID0gMDsKICAgICB9CkBAIC00NDQsMTAgKzQzMiwxNiBAQAogICBRdWFsVHlwZSBUeSA9IEUtPmdldFR5cGUoKTsKICAgYXNzZXJ0KCFUeS5pc051bGwoKSAmJiAiRGVmYXVsdEZ1bmN0aW9uQXJyYXlDb252ZXJzaW9uIC0gbWlzc2luZyB0eXBlIik7CiAKLSAgaWYgKFR5LT5pc0Z1bmN0aW9uVHlwZSgpKQorICBpZiAoVHktPmlzRnVuY3Rpb25UeXBlKCkpIHsKKyAgICAvLyBJZiB3ZSBhcmUgaGVyZSwgd2UgYXJlIG5vdCBjYWxsaW5nIGEgZnVuY3Rpb24gYnV0IHRha2luZworICAgIC8vIGl0cyBhZGRyZXNzICh3aGljaCBpcyBub3QgYWxsb3dlZCBpbiBPcGVuQ0wgdjEuMCBzNi44LmEuMykuCisgICAgaWYgKGdldExhbmdPcHRzKCkuT3BlbkNMKSB7CisgICAgICBEaWFnKEUtPmdldEV4cHJMb2MoKSwgZGlhZzo6ZXJyX29wZW5jbF90YWtpbmdfZnVuY3Rpb25fYWRkcmVzcyk7CisgICAgICByZXR1cm4gRXhwckVycm9yKCk7CisgICAgfQogICAgIEUgPSBJbXBDYXN0RXhwclRvVHlwZShFLCBDb250ZXh0LmdldFBvaW50ZXJUeXBlKFR5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0tfRnVuY3Rpb25Ub1BvaW50ZXJEZWNheSkudGFrZSgpOwotICBlbHNlIGlmIChUeS0+aXNBcnJheVR5cGUoKSkgeworICB9IGVsc2UgaWYgKFR5LT5pc0FycmF5VHlwZSgpKSB7CiAgICAgLy8gSW4gQzkwIG1vZGUsIGFycmF5cyBvbmx5IHByb21vdGUgdG8gcG9pbnRlcnMgaWYgdGhlIGFycmF5IGV4cHJlc3Npb24gaXMKICAgICAvLyBhbiBsdmFsdWUuICBUaGUgcmVsZXZhbnQgbGVnYWxlc2UgaXMgQzkwIDYuMi4yLjFwMzogImFuIGx2YWx1ZSB0aGF0IGhhcwogICAgIC8vIHR5cGUgJ2FycmF5IG9mIHR5cGUnIGlzIGNvbnZlcnRlZCB0byBhbiBleHByZXNzaW9uIHRoYXQgaGFzIHR5cGUgJ3BvaW50ZXIKQEAgLTY0Myw2ICs2MzcsMjQgQEAKICAgcmV0dXJuIFJlczsKIH0KIAorLy8vIENhbGxFeHByVW5hcnlDb252ZXJzaW9ucyAtIGEgc3BlY2lhbCBjYXNlIG9mIGFuIHVuYXJ5IGNvbnZlcnNpb24KKy8vLyBwZXJmb3JtZWQgb24gYSBmdW5jdGlvbiBkZXNpZ25hdG9yIG9mIGEgY2FsbCBleHByZXNzaW9uLgorRXhwclJlc3VsdCBTZW1hOjpDYWxsRXhwclVuYXJ5Q29udmVyc2lvbnMoRXhwciAqRSkgeworICBRdWFsVHlwZSBUeSA9IEUtPmdldFR5cGUoKTsKKyAgRXhwclJlc3VsdCBSZXMgPSBFOworICAvLyBPbmx5IGRvIGltcGxpY2l0IGNhc3QgZm9yIGEgZnVuY3Rpb24gdHlwZSwgYnV0IG5vdCBmb3IgYSBwb2ludGVyCisgIC8vIHRvIGZ1bmN0aW9uIHR5cGUuCisgIGlmIChUeS0+aXNGdW5jdGlvblR5cGUoKSkgeworICAgIFJlcyA9IEltcENhc3RFeHByVG9UeXBlKEUsIENvbnRleHQuZ2V0UG9pbnRlclR5cGUoVHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENLX0Z1bmN0aW9uVG9Qb2ludGVyRGVjYXkpLnRha2UoKTsKKyAgICBpZiAoUmVzLmlzSW52YWxpZCgpKQorICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOworICB9CisgIFJlcyA9IERlZmF1bHRMdmFsdWVDb252ZXJzaW9uKFJlcy50YWtlKCkpOworICBpZiAoUmVzLmlzSW52YWxpZCgpKQorICAgIHJldHVybiBFeHByRXJyb3IoKTsKKyAgcmV0dXJuIE93bmVkKFJlcy50YWtlKCkpOworfQogCiAvLy8gVXN1YWxVbmFyeUNvbnZlcnNpb25zIC0gUGVyZm9ybXMgdmFyaW91cyBjb252ZXJzaW9ucyB0aGF0IGFyZSBjb21tb24gdG8gbW9zdAogLy8vIG9wZXJhdG9ycyAoQzk5IDYuMykuIFRoZSBjb252ZXJzaW9ucyBvZiBhcnJheSBhbmQgZnVuY3Rpb24gdHlwZXMgYXJlCkBAIC03OTIsMTQgKzgwNCwyMCBAQAogCiAgIC8vIENvbXBsYWluIGFib3V0IHBhc3Npbmcgbm9uLVBPRCB0eXBlcyB0aHJvdWdoIHZhcmFyZ3MuCiAgIHN3aXRjaCAoVkFLKSB7Ci0gIGNhc2UgVkFLX1ZhbGlkOgotICAgIGJyZWFrOwotCiAgIGNhc2UgVkFLX1ZhbGlkSW5DWFgxMToKICAgICBEaWFnUnVudGltZUJlaGF2aW9yKAogICAgICAgICBFLT5nZXRMb2NTdGFydCgpLCAwLAogICAgICAgICBQRGlhZyhkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9wYXNzX25vbl9wb2RfYXJnX3RvX3ZhcmFyZykKLSAgICAgICAgICA8PCBFLT5nZXRUeXBlKCkgPDwgQ1QpOworICAgICAgICAgIDw8IFR5IDw8IENUKTsKKyAgICAvLyBGYWxsIHRocm91Z2guCisgIGNhc2UgVkFLX1ZhbGlkOgorICAgIGlmIChUeS0+aXNSZWNvcmRUeXBlKCkpIHsKKyAgICAgIC8vIFRoaXMgaXMgdW5saWtlbHkgdG8gYmUgd2hhdCB0aGUgdXNlciBpbnRlbmRlZC4gSWYgdGhlIGNsYXNzIGhhcyBhCisgICAgICAvLyAnY19zdHInIG1lbWJlciBmdW5jdGlvbiwgdGhlIHVzZXIgcHJvYmFibHkgbWVhbnQgdG8gY2FsbCB0aGF0LgorICAgICAgRGlhZ1J1bnRpbWVCZWhhdmlvcihFLT5nZXRMb2NTdGFydCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQRGlhZyhkaWFnOjp3YXJuX3Bhc3NfY2xhc3NfYXJnX3RvX3ZhcmFyZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBUeSA8PCBDVCA8PCBoYXNDU3RyTWV0aG9kKEUpIDw8ICIuY19zdHIoKSIpOworICAgIH0KICAgICBicmVhazsKIAogICBjYXNlIFZBS19VbmRlZmluZWQ6CkBAIC0xNjQzLDcgKzE2NjEsNyBAQAogICAgICAgICBOYW1lSW5mby5nZXRMb2MoKSwgVHksIFZLLCBGb3VuZEQsIFRlbXBsYXRlQXJncyk7CiAgIH0gZWxzZSB7CiAgICAgYXNzZXJ0KCFUZW1wbGF0ZUFyZ3MgJiYgIk5vIHRlbXBsYXRlIGFyZ3VtZW50cyBmb3Igbm9uLXZhcmlhYmxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gcmVmZXJyZW5jZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHJlZmVyZW5jZXMiKTsKICAgICBFID0gRGVjbFJlZkV4cHI6OkNyZWF0ZSgKICAgICAgICAgQ29udGV4dCwKICAgICAgICAgU1MgPyBTUy0+Z2V0V2l0aExvY0luQ29udGV4dChDb250ZXh0KSA6IE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoKSwKQEAgLTE3NDgsNyArMTc2Niw3IEBACiAgICAgICAgIC8vIEdpdmUgYSBjb2RlIG1vZGlmaWNhdGlvbiBoaW50IHRvIGluc2VydCAndGhpcy0+Jy4KICAgICAgICAgLy8gVE9ETzogZml4aXQgZm9yIGluc2VydGluZyAnQmFzZTxUPjo6JyBpbiB0aGUgb3RoZXIgY2FzZXMuCiAgICAgICAgIC8vIEFjdHVhbGx5IHF1aXRlIGRpZmZpY3VsdCEKLSAgICAgICAgaWYgKGdldExhbmdPcHRzKCkuTWljcm9zb2Z0TW9kZSkKKyAgICAgICAgaWYgKGdldExhbmdPcHRzKCkuTVNWQ0NvbXBhdCkKICAgICAgICAgICBkaWFnbm9zdGljID0gZGlhZzo6d2Fybl9mb3VuZF92aWFfZGVwZW5kZW50X2Jhc2VzX2xvb2t1cDsKICAgICAgICAgaWYgKGlzSW5zdGFuY2UpIHsKICAgICAgICAgICBEaWFnKFIuZ2V0TmFtZUxvYygpLCBkaWFnbm9zdGljKSA8PCBOYW1lCkBAIC0xODE0LDcgKzE4MzIsNyBAQAogICAgIC8vIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVjbGFyZWQgYXQgY2xhc3Mgc2NvcGUgdGhlbiB3ZSBtdXN0IHNldAogICAgIC8vIERDIHRvIHRoZSBsZXhpY2FsIHBhcmVudCB0byBiZSBhYmxlIHRvIHNlYXJjaCBpbnRvIHRoZSBwYXJlbnQKICAgICAvLyBjbGFzcy4KLSAgICBpZiAoZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRNb2RlICYmIGlzYTxGdW5jdGlvbkRlY2w+KERDKSAmJgorICAgIGlmIChnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQgJiYgaXNhPEZ1bmN0aW9uRGVjbD4oREMpICYmCiAgICAgICAgIGNhc3Q8RnVuY3Rpb25EZWNsPihEQyktPmdldEZyaWVuZE9iamVjdEtpbmQoKSAmJgogICAgICAgICBEQy0+Z2V0TGV4aWNhbFBhcmVudCgpLT5pc1JlY29yZCgpKQogICAgICAgREMgPSBEQy0+Z2V0TGV4aWNhbFBhcmVudCgpOwpAQCAtMjAyNiwxNyArMjA0NCwxNyBAQAogICAgIGlmIChSLmVtcHR5KCkpIHsKICAgICAgIC8vIEluIE1pY3Jvc29mdCBtb2RlLCBpZiB3ZSBhcmUgaW5zaWRlIGEgdGVtcGxhdGUgY2xhc3MgbWVtYmVyIGZ1bmN0aW9uCiAgICAgICAvLyB3aG9zZSBwYXJlbnQgY2xhc3MgaGFzIGRlcGVuZGVudCBiYXNlIGNsYXNzZXMsIGFuZCB3ZSBjYW4ndCByZXNvbHZlCi0gICAgICAvLyBhbiBpZGVudGlmaWVyLCB0aGVuIGFzc3VtZSB0aGUgaWRlbnRpZmllciBpcyBhIG1lbWJlciBvZiBhIGRlcGVuZGVudAotICAgICAgLy8gYmFzZSBjbGFzcy4gIFRoZSBnb2FsIGlzIHRvIHBvc3Rwb25lIG5hbWUgbG9va3VwIHRvIGluc3RhbnRpYXRpb24gdGltZQotICAgICAgLy8gdG8gYmUgYWJsZSB0byBzZWFyY2ggaW50byB0aGUgdHlwZSBkZXBlbmRlbnQgYmFzZSBjbGFzc2VzLgorICAgICAgLy8gYW4gdW5xdWFsaWZpZWQgaWRlbnRpZmllciwgdGhlbiBhc3N1bWUgdGhlIGlkZW50aWZpZXIgaXMgYSBtZW1iZXIgb2YgYQorICAgICAgLy8gZGVwZW5kZW50IGJhc2UgY2xhc3MuICBUaGUgZ29hbCBpcyB0byBwb3N0cG9uZSBuYW1lIGxvb2t1cCB0bworICAgICAgLy8gaW5zdGFudGlhdGlvbiB0aW1lIHRvIGJlIGFibGUgdG8gc2VhcmNoIGludG8gdGhlIHR5cGUgZGVwZW5kZW50IGJhc2UKKyAgICAgIC8vIGNsYXNzZXMuCiAgICAgICAvLyBGSVhNRTogSWYgd2Ugd2FudCAxMDAlIGNvbXBhdGliaWxpdHkgd2l0aCBNU1ZDLCB3ZSB3aWxsIGhhdmUgZGVsYXkgYWxsCiAgICAgICAvLyB1bnF1YWxpZmllZCBuYW1lIGxvb2t1cC4gIEFueSBuYW1lIGxvb2t1cCBkdXJpbmcgdGVtcGxhdGUgcGFyc2luZyBtZWFucwogICAgICAgLy8gY2xhbmcgbWlnaHQgZmluZCBzb21ldGhpbmcgdGhhdCBNU1ZDIGRvZXNuJ3QuICBGb3Igbm93LCB3ZSBvbmx5IGhhbmRsZQogICAgICAgLy8gdGhlIGNvbW1vbiBjYXNlIG9mIG1lbWJlcnMgb2YgYSBkZXBlbmRlbnQgYmFzZSBjbGFzcy4KLSAgICAgIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUpIHsKKyAgICAgIGlmIChTUy5pc0VtcHR5KCkgJiYgZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0KSB7CiAgICAgICAgIENYWE1ldGhvZERlY2wgKk1EID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4oQ3VyQ29udGV4dCk7CiAgICAgICAgIGlmIChNRCAmJiBNRC0+aXNJbnN0YW5jZSgpICYmIE1ELT5nZXRQYXJlbnQoKS0+aGFzQW55RGVwZW5kZW50QmFzZXMoKSkgewotICAgICAgICAgIGFzc2VydChTUy5pc0VtcHR5KCkgJiYgInF1YWxpZmllcnMgc2hvdWxkIGJlIGFscmVhZHkgaGFuZGxlZCIpOwogICAgICAgICAgIFF1YWxUeXBlIFRoaXNUeXBlID0gTUQtPmdldFRoaXNUeXBlKENvbnRleHQpOwogICAgICAgICAgIC8vIFNpbmNlIHRoZSAndGhpcycgZXhwcmVzc2lvbiBpcyBzeW50aGVzaXplZCwgd2UgZG9uJ3QgbmVlZCB0bwogICAgICAgICAgIC8vIHBlcmZvcm0gdGhlIGRvdWJsZS1sb29rdXAgY2hlY2suCkBAIC0yMjYzLDE1ICsyMjgxLDcgQEAKICAgICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogCiAgICAgICBNYXJrQW55RGVjbFJlZmVyZW5jZWQoTG9jLCBJViwgdHJ1ZSk7Ci0gICAgICBpZiAoIUlWLT5nZXRCYWNraW5nSXZhclJlZmVyZW5jZWRJbkFjY2Vzc29yKCkpIHsKLSAgICAgICAgLy8gTWFyayB0aGlzIGl2YXIgJ3JlZmVyZW5jZWQnIGluIHRoaXMgbWV0aG9kLCBpZiBpdCBpcyBhIGJhY2tpbmcgaXZhcgotICAgICAgICAvLyBvZiBhIHByb3BlcnR5IGFuZCBjdXJyZW50IG1ldGhvZCBpcyBvbmUgb2YgaXRzIHByb3BlcnR5IGFjY2Vzc29yLgotICAgICAgICBjb25zdCBPYmpDUHJvcGVydHlEZWNsICpQRGVjbDsKLSAgICAgICAgY29uc3QgT2JqQ0l2YXJEZWNsICpCSVYgPSBHZXRJdmFyQmFja2luZ1Byb3BlcnR5QWNjZXNzb3IoQ3VyTWV0aG9kLCBQRGVjbCk7Ci0gICAgICAgIGlmIChCSVYgJiYgQklWID09IElWKQotICAgICAgICAgIElWLT5zZXRCYWNraW5nSXZhclJlZmVyZW5jZWRJbkFjY2Vzc29yKHRydWUpOwotICAgICAgfQotICAgICAgCisKICAgICAgIE9iakNNZXRob2RGYW1pbHkgTUYgPSBDdXJNZXRob2QtPmdldE1ldGhvZEZhbWlseSgpOwogICAgICAgaWYgKE1GICE9IE9NRl9pbml0ICYmIE1GICE9IE9NRl9kZWFsbG9jICYmIE1GICE9IE9NRl9maW5hbGl6ZSAmJgogICAgICAgICAgICFJdmFyQmFja3NDdXJyZW50TWV0aG9kQWNjZXNzb3IoSUZhY2UsIEN1ck1ldGhvZCwgSVYpKQpAQCAtMjc1NSw3ICsyNzY1LDcgQEAKIAogICAgICAgLy8gSWYgd2UncmUgcmVmZXJyaW5nIHRvIGEgZnVuY3Rpb24gd2l0aCBhbiBfX3Vua25vd25fYW55dHlwZQogICAgICAgLy8gcmVzdWx0IHR5cGUsIG1ha2UgdGhlIGVudGlyZSBleHByZXNzaW9uIF9fdW5rbm93bl9hbnl0eXBlLgotICAgICAgaWYgKGZ0eS0+Z2V0UmVzdWx0VHlwZSgpID09IENvbnRleHQuVW5rbm93bkFueVR5KSB7CisgICAgICBpZiAoZnR5LT5nZXRSZXR1cm5UeXBlKCkgPT0gQ29udGV4dC5Vbmtub3duQW55VHkpIHsKICAgICAgICAgdHlwZSA9IENvbnRleHQuVW5rbm93bkFueVR5OwogICAgICAgICB2YWx1ZUtpbmQgPSBWS19SVmFsdWU7CiAgICAgICAgIGJyZWFrOwpAQCAtMjc3NCw3ICsyNzg0LDcgQEAKICAgICAgIC8vIHR5cGUuCiAgICAgICBpZiAoIWNhc3Q8RnVuY3Rpb25EZWNsPihWRCktPmhhc1Byb3RvdHlwZSgpICYmCiAgICAgICAgICAgaXNhPEZ1bmN0aW9uUHJvdG9UeXBlPihmdHkpKQotICAgICAgICB0eXBlID0gQ29udGV4dC5nZXRGdW5jdGlvbk5vUHJvdG9UeXBlKGZ0eS0+Z2V0UmVzdWx0VHlwZSgpLAorICAgICAgICB0eXBlID0gQ29udGV4dC5nZXRGdW5jdGlvbk5vUHJvdG9UeXBlKGZ0eS0+Z2V0UmV0dXJuVHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0eS0+Z2V0RXh0SW5mbygpKTsKIAogICAgICAgLy8gRnVuY3Rpb25zIGFyZSByLXZhbHVlcyBpbiBDLgpAQCAtMjc5Miw3ICsyODAyLDcgQEAKICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgcG9zc2libGUgd2l0aCBhIHR5cGUgd3JpdHRlbiBkaXJlY3RseS4KICAgICAgIGlmIChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqcHJvdG8KICAgICAgICAgICAgID0gZHluX2Nhc3Q8RnVuY3Rpb25Qcm90b1R5cGU+KFZELT5nZXRUeXBlKCkpKQotICAgICAgICBpZiAocHJvdG8tPmdldFJlc3VsdFR5cGUoKSA9PSBDb250ZXh0LlVua25vd25BbnlUeSkgeworICAgICAgICBpZiAocHJvdG8tPmdldFJldHVyblR5cGUoKSA9PSBDb250ZXh0LlVua25vd25BbnlUeSkgewogICAgICAgICAgIHR5cGUgPSBDb250ZXh0LlVua25vd25BbnlUeTsKICAgICAgICAgICB2YWx1ZUtpbmQgPSBWS19SVmFsdWU7CiAgICAgICAgICAgYnJlYWs7CkBAIC0zMjAwLDcgKzMyMTAsNyBAQAogICAgICAgLy8gSWYgd2Ugc3RpbGwgY291bGRuJ3QgZGVjaWRlIGEgdHlwZSwgd2UgcHJvYmFibHkgaGF2ZSBzb21ldGhpbmcgdGhhdAogICAgICAgLy8gZG9lcyBub3QgZml0IGluIGEgc2lnbmVkIGxvbmcgbG9uZywgYnV0IGhhcyBubyBVIHN1ZmZpeC4KICAgICAgIGlmIChUeS5pc051bGwoKSkgewotICAgICAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX2ludGVnZXJfdG9vX2xhcmdlX2Zvcl9zaWduZWQpOworICAgICAgICBEaWFnKFRvay5nZXRMb2NhdGlvbigpLCBkaWFnOjpleHRfaW50ZWdlcl90b29fbGFyZ2VfZm9yX3NpZ25lZCk7CiAgICAgICAgIFR5ID0gQ29udGV4dC5VbnNpZ25lZExvbmdMb25nVHk7CiAgICAgICAgIFdpZHRoID0gQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkuZ2V0TG9uZ0xvbmdXaWR0aCgpOwogICAgICAgfQpAQCAtMzI1OSw5ICszMjY5LDEyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgLy8gQWxsb3cgc2l6ZW9mKHZvaWQpL2FsaWdub2Yodm9pZCkgYXMgYW4gZXh0ZW5zaW9uLgorICAvLyBBbGxvdyBzaXplb2Yodm9pZCkvYWxpZ25vZih2b2lkKSBhcyBhbiBleHRlbnNpb24sIHVubGVzcyBpbiBPcGVuQ0wgd2hlcmUKKyAgLy8gdGhpcyBpcyBhbiBlcnJvciAoT3BlbkNMIHYxLjEgczYuMy5rKQogICBpZiAoVC0+aXNWb2lkVHlwZSgpKSB7Ci0gICAgUy5EaWFnKExvYywgZGlhZzo6ZXh0X3NpemVvZl9hbGlnbm9mX3ZvaWRfdHlwZSkgPDwgVHJhaXRLaW5kIDw8IEFyZ1JhbmdlOworICAgIHVuc2lnbmVkIERpYWdJRCA9IFMuTGFuZ09wdHMuT3BlbkNMID8gZGlhZzo6ZXJyX29wZW5jbF9zaXplb2ZfYWxpZ25vZl90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjpleHRfc2l6ZW9mX2FsaWdub2Zfdm9pZF90eXBlOworICAgIFMuRGlhZyhMb2MsIERpYWdJRCkgPDwgVHJhaXRLaW5kIDw8IEFyZ1JhbmdlOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCkBAIC0zMzAyLDcgKzMzMTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSUNFLT5nZXRTdWJFeHByKCktPmdldFR5cGUoKTsKIH0KIAotLy8vIFxicmllZiBDaGVjayB0aGUgY29uc3RyYWlucyBvbiBleHByZXNzaW9uIG9wZXJhbmRzIHRvIHVuYXJ5IHR5cGUgZXhwcmVzc2lvbgorLy8vIFxicmllZiBDaGVjayB0aGUgY29uc3RyYWludHMgb24gZXhwcmVzc2lvbiBvcGVyYW5kcyB0byB1bmFyeSB0eXBlIGV4cHJlc3Npb24KIC8vLyBhbmQgdHlwZSB0cmFpdHMuCiAvLy8KIC8vLyBDb21wbGV0ZXMgYW55IHR5cGVzIG5lY2Vzc2FyeSBhbmQgdmFsaWRhdGVzIHRoZSBjb25zdHJhaW50cyBvbiB0aGUgb3BlcmFuZApAQCAtMzQ2MCw3ICszNDczLDcgQEAKICAgLy8gZGVsYXllZCBwYXJzaW5nIC0tLSBleGNlcHQgZm9yIHRyYWlsaW5nIHJldHVybiB0eXBlcyBpbiBDKysxMS4KICAgLy8gQW5kIGlmIGFuIGlkLWV4cHJlc3Npb24gcmVmZXJyaW5nIHRvIGEgZmllbGQgb2NjdXJzIGluIGEKICAgLy8gY29udGV4dCB0aGF0IGxhY2tzIGEgJ3RoaXMnIHZhbHVlLCBpdCdzIGlsbC1mb3JtZWQgLS0tIGV4Y2VwdCwKLSAgLy8gYWdpYW4sIGluIEMrKzExLCB3aGVyZSBzdWNoIHJlZmVyZW5jZXMgYXJlIGFsbG93ZWQgaW4gYW4KKyAgLy8gYWdhaW4sIGluIEMrKzExLCB3aGVyZSBzdWNoIHJlZmVyZW5jZXMgYXJlIGFsbG93ZWQgaW4gYW4KICAgLy8gdW5ldmFsdWF0ZWQgY29udGV4dC4gIFNvIEMrKzExIGludHJvZHVjZXMgc29tZSBuZXcgY29tcGxleGl0eS4KICAgLy8KICAgLy8gRm9yIHRoZSByZWNvcmQsIHNpbmNlIF9fYWxpZ25vZl9fIG9uIGV4cHJlc3Npb25zIGlzIGEgR0NDCkBAIC0zOTY1LDcgKzM5NzgsNyBAQAogICAgICAgOiBGdW5jdGlvbkNhbGxGaWx0ZXJDQ0MoU2VtYVJlZiwgTnVtQXJncywgSGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MpLAogICAgICAgICBGdW5jdGlvbk5hbWUoRnVuY05hbWUpIHt9CiAKLSAgdmlydHVhbCBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIHsKKyAgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSBvdmVycmlkZSB7CiAgICAgaWYgKCFjYW5kaWRhdGUuZ2V0Q29ycmVjdGlvblNwZWNpZmllcigpIHx8CiAgICAgICAgIGNhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uQXNJZGVudGlmaWVySW5mbygpICE9IEZ1bmN0aW9uTmFtZSkgewogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNDAzNyw5ICs0MDUwLDkgQEAKIAogICAvLyBDOTkgNi41LjIuMnA3IC0gdGhlIGFyZ3VtZW50cyBhcmUgaW1wbGljaXRseSBjb252ZXJ0ZWQsIGFzIGlmIGJ5CiAgIC8vIGFzc2lnbm1lbnQsIHRvIHRoZSB0eXBlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXIsIC4uLgotICB1bnNpZ25lZCBOdW1BcmdzSW5Qcm90byA9IFByb3RvLT5nZXROdW1BcmdzKCk7CisgIHVuc2lnbmVkIE51bVBhcmFtcyA9IFByb3RvLT5nZXROdW1QYXJhbXMoKTsKICAgYm9vbCBJbnZhbGlkID0gZmFsc2U7Ci0gIHVuc2lnbmVkIE1pbkFyZ3MgPSBGRGVjbCA/IEZEZWNsLT5nZXRNaW5SZXF1aXJlZEFyZ3VtZW50cygpIDogTnVtQXJnc0luUHJvdG87CisgIHVuc2lnbmVkIE1pbkFyZ3MgPSBGRGVjbCA/IEZEZWNsLT5nZXRNaW5SZXF1aXJlZEFyZ3VtZW50cygpIDogTnVtUGFyYW1zOwogICB1bnNpZ25lZCBGbktpbmQgPSBGbi0+Z2V0VHlwZSgpLT5pc0Jsb2NrUG9pbnRlclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICA/IDEgLyogYmxvY2sgKi8KICAgICAgICAgICAgICAgICAgICAgICAgOiAoSXNFeGVjQ29uZmlnID8gMyAvKiBrZXJuZWwgZnVuY3Rpb24gKGV4ZWMgY29uZmlnKSAqLwpAQCAtNDA0Nyw3ICs0MDYwLDcgQEAKIAogICAvLyBJZiB0b28gZmV3IGFyZ3VtZW50cyBhcmUgYXZhaWxhYmxlIChhbmQgd2UgZG9uJ3QgaGF2ZSBkZWZhdWx0CiAgIC8vIGFyZ3VtZW50cyBmb3IgdGhlIHJlbWFpbmluZyBwYXJhbWV0ZXJzKSwgZG9uJ3QgbWFrZSB0aGUgY2FsbC4KLSAgaWYgKEFyZ3Muc2l6ZSgpIDwgTnVtQXJnc0luUHJvdG8pIHsKKyAgaWYgKEFyZ3Muc2l6ZSgpIDwgTnVtUGFyYW1zKSB7CiAgICAgaWYgKEFyZ3Muc2l6ZSgpIDwgTWluQXJncykgewogICAgICAgTWVtYmVyRXhwciAqTUUgPSBkeW5fY2FzdDxNZW1iZXJFeHByPihGbik7CiAgICAgICBUeXBvQ29ycmVjdGlvbiBUQzsKQEAgLTQwNTcsMjUgKzQwNzAsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZuLT5nZXRMb2NTdGFydCgpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzKSkpIHsKICAgICAgICAgdW5zaWduZWQgZGlhZ19pZCA9Ci0gICAgICAgICAgICBNaW5BcmdzID09IE51bUFyZ3NJblByb3RvICYmICFQcm90by0+aXNWYXJpYWRpYygpCisgICAgICAgICAgICBNaW5BcmdzID09IE51bVBhcmFtcyAmJiAhUHJvdG8tPmlzVmFyaWFkaWMoKQogICAgICAgICAgICAgICAgID8gZGlhZzo6ZXJyX3R5cGVjaGVja19jYWxsX3Rvb19mZXdfYXJnc19zdWdnZXN0CiAgICAgICAgICAgICAgICAgOiBkaWFnOjplcnJfdHlwZWNoZWNrX2NhbGxfdG9vX2Zld19hcmdzX2F0X2xlYXN0X3N1Z2dlc3Q7CiAgICAgICAgIGRpYWdub3NlVHlwbyhUQywgUERpYWcoZGlhZ19pZCkgPDwgRm5LaW5kIDw8IE1pbkFyZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQXJncy5zaXplKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRm4tPmdldFNvdXJjZVJhbmdlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRDLmdldENvcnJlY3Rpb25SYW5nZSgpKTsKICAgICAgIH0gZWxzZSBpZiAoTWluQXJncyA9PSAxICYmIEZEZWNsICYmIEZEZWNsLT5nZXRQYXJhbURlY2woMCktPmdldERlY2xOYW1lKCkpCi0gICAgICAgIERpYWcoUlBhcmVuTG9jLCBNaW5BcmdzID09IE51bUFyZ3NJblByb3RvICYmICFQcm90by0+aXNWYXJpYWRpYygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gZGlhZzo6ZXJyX3R5cGVjaGVja19jYWxsX3Rvb19mZXdfYXJnc19vbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjplcnJfdHlwZWNoZWNrX2NhbGxfdG9vX2Zld19hcmdzX2F0X2xlYXN0X29uZSkKLSAgICAgICAgICA8PCBGbktpbmQKLSAgICAgICAgICA8PCBGRGVjbC0+Z2V0UGFyYW1EZWNsKDApIDw8IEZuLT5nZXRTb3VyY2VSYW5nZSgpOworICAgICAgICBEaWFnKFJQYXJlbkxvYywKKyAgICAgICAgICAgICBNaW5BcmdzID09IE51bVBhcmFtcyAmJiAhUHJvdG8tPmlzVmFyaWFkaWMoKQorICAgICAgICAgICAgICAgICA/IGRpYWc6OmVycl90eXBlY2hlY2tfY2FsbF90b29fZmV3X2FyZ3Nfb25lCisgICAgICAgICAgICAgICAgIDogZGlhZzo6ZXJyX3R5cGVjaGVja19jYWxsX3Rvb19mZXdfYXJnc19hdF9sZWFzdF9vbmUpCisgICAgICAgICAgICA8PCBGbktpbmQgPDwgRkRlY2wtPmdldFBhcmFtRGVjbCgwKSA8PCBGbi0+Z2V0U291cmNlUmFuZ2UoKTsKICAgICAgIGVsc2UKLSAgICAgICAgRGlhZyhSUGFyZW5Mb2MsIE1pbkFyZ3MgPT0gTnVtQXJnc0luUHJvdG8gJiYgIVByb3RvLT5pc1ZhcmlhZGljKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkaWFnOjplcnJfdHlwZWNoZWNrX2NhbGxfdG9vX2Zld19hcmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogZGlhZzo6ZXJyX3R5cGVjaGVja19jYWxsX3Rvb19mZXdfYXJnc19hdF9sZWFzdCkKLSAgICAgICAgICA8PCBGbktpbmQKLSAgICAgICAgICA8PCBNaW5BcmdzIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihBcmdzLnNpemUoKSkKLSAgICAgICAgICA8PCBGbi0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgICAgRGlhZyhSUGFyZW5Mb2MsIE1pbkFyZ3MgPT0gTnVtUGFyYW1zICYmICFQcm90by0+aXNWYXJpYWRpYygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkaWFnOjplcnJfdHlwZWNoZWNrX2NhbGxfdG9vX2Zld19hcmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjplcnJfdHlwZWNoZWNrX2NhbGxfdG9vX2Zld19hcmdzX2F0X2xlYXN0KQorICAgICAgICAgICAgPDwgRm5LaW5kIDw8IE1pbkFyZ3MgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEFyZ3Muc2l6ZSgpKQorICAgICAgICAgICAgPDwgRm4tPmdldFNvdXJjZVJhbmdlKCk7CiAKICAgICAgIC8vIEVtaXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBwcm90b3R5cGUuCiAgICAgICBpZiAoIVRDICYmIEZEZWNsICYmICFGRGVjbC0+Z2V0QnVpbHRpbklEKCkgJiYgIUlzRXhlY0NvbmZpZykKQEAgLTQwODQsNDYgKzQwOTYsNDYgQEAKIAogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIENhbGwtPnNldE51bUFyZ3MoQ29udGV4dCwgTnVtQXJnc0luUHJvdG8pOworICAgIENhbGwtPnNldE51bUFyZ3MoQ29udGV4dCwgTnVtUGFyYW1zKTsKICAgfQogCiAgIC8vIElmIHRvbyBtYW55IGFyZSBwYXNzZWQgYW5kIG5vdCB2YXJpYWRpYywgZXJyb3Igb24gdGhlIGV4dHJhcyBhbmQgZHJvcAogICAvLyB0aGVtLgotICBpZiAoQXJncy5zaXplKCkgPiBOdW1BcmdzSW5Qcm90bykgeworICBpZiAoQXJncy5zaXplKCkgPiBOdW1QYXJhbXMpIHsKICAgICBpZiAoIVByb3RvLT5pc1ZhcmlhZGljKCkpIHsKKyAgICAgIE1lbWJlckV4cHIgKk1FID0gZHluX2Nhc3Q8TWVtYmVyRXhwcj4oRm4pOwogICAgICAgVHlwb0NvcnJlY3Rpb24gVEM7CiAgICAgICBpZiAoRkRlY2wgJiYgKFRDID0gVHJ5VHlwb0NvcnJlY3Rpb25Gb3JDYWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgKnRoaXMsIERlY2xhcmF0aW9uTmFtZUluZm8oRkRlY2wtPmdldERlY2xOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbi0+Z2V0TG9jU3RhcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUUgPyBNRS0+Z2V0TWVtYmVyTG9jKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZuLT5nZXRMb2NTdGFydCgpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzKSkpIHsKICAgICAgICAgdW5zaWduZWQgZGlhZ19pZCA9Ci0gICAgICAgICAgICBNaW5BcmdzID09IE51bUFyZ3NJblByb3RvICYmICFQcm90by0+aXNWYXJpYWRpYygpCisgICAgICAgICAgICBNaW5BcmdzID09IE51bVBhcmFtcyAmJiAhUHJvdG8tPmlzVmFyaWFkaWMoKQogICAgICAgICAgICAgICAgID8gZGlhZzo6ZXJyX3R5cGVjaGVja19jYWxsX3Rvb19tYW55X2FyZ3Nfc3VnZ2VzdAogICAgICAgICAgICAgICAgIDogZGlhZzo6ZXJyX3R5cGVjaGVja19jYWxsX3Rvb19tYW55X2FyZ3NfYXRfbW9zdF9zdWdnZXN0OwotICAgICAgICBkaWFnbm9zZVR5cG8oVEMsIFBEaWFnKGRpYWdfaWQpIDw8IEZuS2luZCA8PCBOdW1BcmdzSW5Qcm90bworICAgICAgICBkaWFnbm9zZVR5cG8oVEMsIFBEaWFnKGRpYWdfaWQpIDw8IEZuS2luZCA8PCBOdW1QYXJhbXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQXJncy5zaXplKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgRm4tPmdldFNvdXJjZVJhbmdlKCkpOwotICAgICAgfSBlbHNlIGlmIChOdW1BcmdzSW5Qcm90byA9PSAxICYmIEZEZWNsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgVEMuZ2V0Q29ycmVjdGlvblJhbmdlKCkpOworICAgICAgfSBlbHNlIGlmIChOdW1QYXJhbXMgPT0gMSAmJiBGRGVjbCAmJgogICAgICAgICAgICAgICAgICBGRGVjbC0+Z2V0UGFyYW1EZWNsKDApLT5nZXREZWNsTmFtZSgpKQotICAgICAgICBEaWFnKEFyZ3NbTnVtQXJnc0luUHJvdG9dLT5nZXRMb2NTdGFydCgpLAotICAgICAgICAgICAgIE1pbkFyZ3MgPT0gTnVtQXJnc0luUHJvdG8KLSAgICAgICAgICAgICAgID8gZGlhZzo6ZXJyX3R5cGVjaGVja19jYWxsX3Rvb19tYW55X2FyZ3Nfb25lCi0gICAgICAgICAgICAgICA6IGRpYWc6OmVycl90eXBlY2hlY2tfY2FsbF90b29fbWFueV9hcmdzX2F0X21vc3Rfb25lKQotICAgICAgICAgIDw8IEZuS2luZAotICAgICAgICAgIDw8IEZEZWNsLT5nZXRQYXJhbURlY2woMCkgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEFyZ3Muc2l6ZSgpKQotICAgICAgICAgIDw8IEZuLT5nZXRTb3VyY2VSYW5nZSgpCi0gICAgICAgICAgPDwgU291cmNlUmFuZ2UoQXJnc1tOdW1BcmdzSW5Qcm90b10tPmdldExvY1N0YXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgQXJncy5iYWNrKCktPmdldExvY0VuZCgpKTsKKyAgICAgICAgRGlhZyhBcmdzW051bVBhcmFtc10tPmdldExvY1N0YXJ0KCksCisgICAgICAgICAgICAgTWluQXJncyA9PSBOdW1QYXJhbXMKKyAgICAgICAgICAgICAgICAgPyBkaWFnOjplcnJfdHlwZWNoZWNrX2NhbGxfdG9vX21hbnlfYXJnc19vbmUKKyAgICAgICAgICAgICAgICAgOiBkaWFnOjplcnJfdHlwZWNoZWNrX2NhbGxfdG9vX21hbnlfYXJnc19hdF9tb3N0X29uZSkKKyAgICAgICAgICAgIDw8IEZuS2luZCA8PCBGRGVjbC0+Z2V0UGFyYW1EZWNsKDApCisgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQXJncy5zaXplKCkpIDw8IEZuLT5nZXRTb3VyY2VSYW5nZSgpCisgICAgICAgICAgICA8PCBTb3VyY2VSYW5nZShBcmdzW051bVBhcmFtc10tPmdldExvY1N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzLmJhY2soKS0+Z2V0TG9jRW5kKCkpOwogICAgICAgZWxzZQotICAgICAgICBEaWFnKEFyZ3NbTnVtQXJnc0luUHJvdG9dLT5nZXRMb2NTdGFydCgpLAotICAgICAgICAgICAgIE1pbkFyZ3MgPT0gTnVtQXJnc0luUHJvdG8KLSAgICAgICAgICAgICAgID8gZGlhZzo6ZXJyX3R5cGVjaGVja19jYWxsX3Rvb19tYW55X2FyZ3MKLSAgICAgICAgICAgICAgIDogZGlhZzo6ZXJyX3R5cGVjaGVja19jYWxsX3Rvb19tYW55X2FyZ3NfYXRfbW9zdCkKLSAgICAgICAgICA8PCBGbktpbmQKLSAgICAgICAgICA8PCBOdW1BcmdzSW5Qcm90byA8PCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQXJncy5zaXplKCkpCi0gICAgICAgICAgPDwgRm4tPmdldFNvdXJjZVJhbmdlKCkKLSAgICAgICAgICA8PCBTb3VyY2VSYW5nZShBcmdzW051bUFyZ3NJblByb3RvXS0+Z2V0TG9jU3RhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzLmJhY2soKS0+Z2V0TG9jRW5kKCkpOworICAgICAgICBEaWFnKEFyZ3NbTnVtUGFyYW1zXS0+Z2V0TG9jU3RhcnQoKSwKKyAgICAgICAgICAgICBNaW5BcmdzID09IE51bVBhcmFtcworICAgICAgICAgICAgICAgICA/IGRpYWc6OmVycl90eXBlY2hlY2tfY2FsbF90b29fbWFueV9hcmdzCisgICAgICAgICAgICAgICAgIDogZGlhZzo6ZXJyX3R5cGVjaGVja19jYWxsX3Rvb19tYW55X2FyZ3NfYXRfbW9zdCkKKyAgICAgICAgICAgIDw8IEZuS2luZCA8PCBOdW1QYXJhbXMgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEFyZ3Muc2l6ZSgpKQorICAgICAgICAgICAgPDwgRm4tPmdldFNvdXJjZVJhbmdlKCkKKyAgICAgICAgICAgIDw8IFNvdXJjZVJhbmdlKEFyZ3NbTnVtUGFyYW1zXS0+Z2V0TG9jU3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MuYmFjaygpLT5nZXRMb2NFbmQoKSk7CiAKICAgICAgIC8vIEVtaXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBwcm90b3R5cGUuCiAgICAgICBpZiAoIVRDICYmIEZEZWNsICYmICFGRGVjbC0+Z2V0QnVpbHRpbklEKCkgJiYgIUlzRXhlY0NvbmZpZykKQEAgLTQxMzEsNyArNDE0Myw3IEBACiAgICAgICAgICAgPDwgRkRlY2w7CiAgICAgICAKICAgICAgIC8vIFRoaXMgZGVsZXRlcyB0aGUgZXh0cmEgYXJndW1lbnRzLgotICAgICAgQ2FsbC0+c2V0TnVtQXJncyhDb250ZXh0LCBOdW1BcmdzSW5Qcm90byk7CisgICAgICBDYWxsLT5zZXROdW1BcmdzKENvbnRleHQsIE51bVBhcmFtcyk7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgIH0KQEAgLTQxNDksMjUgKzQxNjEsMjIgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFNlbWE6OkdhdGhlckFyZ3VtZW50c0ZvckNhbGwoU291cmNlTG9jYXRpb24gQ2FsbExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkRlY2wgKkZEZWNsLAorYm9vbCBTZW1hOjpHYXRoZXJBcmd1bWVudHNGb3JDYWxsKFNvdXJjZUxvY2F0aW9uIENhbGxMb2MsIEZ1bmN0aW9uRGVjbCAqRkRlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZpcnN0UHJvdG9BcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZpcnN0UGFyYW0sIEFycmF5UmVmPEV4cHIgKj4gQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8RXhwciAqPiAmQWxsQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWRpY0NhbGxUeXBlIENhbGxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dFeHBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWRpY0NhbGxUeXBlIENhbGxUeXBlLCBib29sIEFsbG93RXhwbGljaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0xpc3RJbml0aWFsaXphdGlvbikgewotICB1bnNpZ25lZCBOdW1BcmdzSW5Qcm90byA9IFByb3RvLT5nZXROdW1BcmdzKCk7CisgIHVuc2lnbmVkIE51bVBhcmFtcyA9IFByb3RvLT5nZXROdW1QYXJhbXMoKTsKICAgdW5zaWduZWQgTnVtQXJnc1RvQ2hlY2sgPSBBcmdzLnNpemUoKTsKICAgYm9vbCBJbnZhbGlkID0gZmFsc2U7Ci0gIGlmIChBcmdzLnNpemUoKSAhPSBOdW1BcmdzSW5Qcm90bykKKyAgaWYgKEFyZ3Muc2l6ZSgpICE9IE51bVBhcmFtcykKICAgICAvLyBVc2UgZGVmYXVsdCBhcmd1bWVudHMgZm9yIG1pc3NpbmcgYXJndW1lbnRzCi0gICAgTnVtQXJnc1RvQ2hlY2sgPSBOdW1BcmdzSW5Qcm90bzsKKyAgICBOdW1BcmdzVG9DaGVjayA9IE51bVBhcmFtczsKICAgdW5zaWduZWQgQXJnSXggPSAwOwogICAvLyBDb250aW51ZSB0byBjaGVjayBhcmd1bWVudCB0eXBlcyAoZXZlbiBpZiB3ZSBoYXZlIHRvbyBmZXcvbWFueSBhcmdzKS4KLSAgZm9yICh1bnNpZ25lZCBpID0gRmlyc3RQcm90b0FyZzsgaSAhPSBOdW1BcmdzVG9DaGVjazsgaSsrKSB7Ci0gICAgUXVhbFR5cGUgUHJvdG9BcmdUeXBlID0gUHJvdG8tPmdldEFyZ1R5cGUoaSk7CisgIGZvciAodW5zaWduZWQgaSA9IEZpcnN0UGFyYW07IGkgIT0gTnVtQXJnc1RvQ2hlY2s7IGkrKykgeworICAgIFF1YWxUeXBlIFByb3RvQXJnVHlwZSA9IFByb3RvLT5nZXRQYXJhbVR5cGUoaSk7CiAKICAgICBFeHByICpBcmc7CiAgICAgUGFybVZhckRlY2wgKlBhcmFtOwpAQCAtNDE5NSwxMSArNDIwNCwxMiBAQAogICAgICAgICAgICAgICAgKCFQYXJhbSB8fCAhUGFyYW0tPmhhc0F0dHI8Q0ZDb25zdW1lZEF0dHI+KCkpKQogICAgICAgICBDRkF1ZGl0ZWQgPSB0cnVlOwogCi0gICAgICBJbml0aWFsaXplZEVudGl0eSBFbnRpdHkgPSBQYXJhbSA/Ci0gICAgICAgICAgSW5pdGlhbGl6ZWRFbnRpdHk6OkluaXRpYWxpemVQYXJhbWV0ZXIoQ29udGV4dCwgUGFyYW0sIFByb3RvQXJnVHlwZSkKLSAgICAgICAgOiBJbml0aWFsaXplZEVudGl0eTo6SW5pdGlhbGl6ZVBhcmFtZXRlcihDb250ZXh0LCBQcm90b0FyZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8tPmlzQXJnQ29uc3VtZWQoaSkpOwotICAgICAgCisgICAgICBJbml0aWFsaXplZEVudGl0eSBFbnRpdHkgPQorICAgICAgICAgIFBhcmFtID8gSW5pdGlhbGl6ZWRFbnRpdHk6OkluaXRpYWxpemVQYXJhbWV0ZXIoQ29udGV4dCwgUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b0FyZ1R5cGUpCisgICAgICAgICAgICAgICAgOiBJbml0aWFsaXplZEVudGl0eTo6SW5pdGlhbGl6ZVBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LCBQcm90b0FyZ1R5cGUsIFByb3RvLT5pc1BhcmFtQ29uc3VtZWQoaSkpOworCiAgICAgICAvLyBSZW1lbWJlciB0aGF0IHBhcmFtZXRlciBiZWxvbmdzIHRvIGEgQ0YgYXVkaXRlZCBBUEkuCiAgICAgICBpZiAoQ0ZBdWRpdGVkKQogICAgICAgICBFbnRpdHkuc2V0UGFyYW1ldGVyQ0ZBdWRpdGVkKCk7CkBAIC00MjQwLDggKzQyNTAsOCBAQAogICBpZiAoQ2FsbFR5cGUgIT0gVmFyaWFkaWNEb2VzTm90QXBwbHkpIHsKICAgICAvLyBBc3N1bWUgdGhhdCBleHRlcm4gIkMiIGZ1bmN0aW9ucyB3aXRoIHZhcmlhZGljIGFyZ3VtZW50cyB0aGF0CiAgICAgLy8gcmV0dXJuIF9fdW5rbm93bl9hbnl0eXBlIGFyZW4ndCAqcmVhbGx5KiB2YXJpYWRpYy4KLSAgICBpZiAoUHJvdG8tPmdldFJlc3VsdFR5cGUoKSA9PSBDb250ZXh0LlVua25vd25BbnlUeSAmJgotICAgICAgICBGRGVjbCAmJiBGRGVjbC0+aXNFeHRlcm5DKCkpIHsKKyAgICBpZiAoUHJvdG8tPmdldFJldHVyblR5cGUoKSA9PSBDb250ZXh0LlVua25vd25BbnlUeSAmJiBGRGVjbCAmJgorICAgICAgICBGRGVjbC0+aXNFeHRlcm5DKCkpIHsKICAgICAgIGZvciAodW5zaWduZWQgaSA9IEFyZ0l4LCBlID0gQXJncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CiAgICAgICAgIFF1YWxUeXBlIHBhcmFtVHlwZTsgLy8gaWdub3JlZAogICAgICAgICBFeHByUmVzdWx0IGFyZyA9IGNoZWNrVW5rbm93bkFueUFyZyhDYWxsTG9jLCBBcmdzW2ldLCBwYXJhbVR5cGUpOwpAQCAtNDQ5NCw2ICs0NTA0LDIxIEBACiAgIGVsc2UgaWYgKGlzYTxNZW1iZXJFeHByPihOYWtlZEZuKSkKICAgICBORGVjbCA9IGNhc3Q8TWVtYmVyRXhwcj4oTmFrZWRGbiktPmdldE1lbWJlckRlY2woKTsKIAorICBpZiAoRnVuY3Rpb25EZWNsICpGRCA9IGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb25EZWNsPihORGVjbCkpIHsKKyAgICBpZiAoRkQtPmhhc0F0dHI8RW5hYmxlSWZBdHRyPigpKSB7CisgICAgICBpZiAoY29uc3QgRW5hYmxlSWZBdHRyICpBdHRyID0gQ2hlY2tFbmFibGVJZihGRCwgQXJnRXhwcnMsIHRydWUpKSB7CisgICAgICAgIERpYWcoRm4tPmdldExvY1N0YXJ0KCksCisgICAgICAgICAgICAgaXNhPENYWE1ldGhvZERlY2w+KEZEKSA/CisgICAgICAgICAgICAgICAgIGRpYWc6OmVycl9vdmxfbm9fdmlhYmxlX21lbWJlcl9mdW5jdGlvbl9pbl9jYWxsIDoKKyAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX292bF9ub192aWFibGVfZnVuY3Rpb25faW5fY2FsbCkKKyAgICAgICAgICA8PCBGRCA8PCBGRC0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgICAgRGlhZyhGRC0+Z2V0TG9jYXRpb24oKSwKKyAgICAgICAgICAgICBkaWFnOjpub3RlX292bF9jYW5kaWRhdGVfZGlzYWJsZWRfYnlfZW5hYmxlX2lmX2F0dHIpCisgICAgICAgICAgICA8PCBBdHRyLT5nZXRDb25kKCktPmdldFNvdXJjZVJhbmdlKCkgPDwgQXR0ci0+Z2V0TWVzc2FnZSgpOworICAgICAgfQorICAgIH0KKyAgfQorCiAgIHJldHVybiBCdWlsZFJlc29sdmVkQ2FsbEV4cHIoRm4sIE5EZWNsLCBMUGFyZW5Mb2MsIEFyZ0V4cHJzLCBSUGFyZW5Mb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY0NvbmZpZywgSXNFeGVjQ29uZmlnKTsKIH0KQEAgLTQ1NzMsNyArNDU5OCw3IEBACiAgICAgUmVzdWx0ID0gSW1wQ2FzdEV4cHJUb1R5cGUoRm4sIENvbnRleHQuZ2V0UG9pbnRlclR5cGUoRkRlY2wtPmdldFR5cGUoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0tfQnVpbHRpbkZuVG9GblB0cikudGFrZSgpOwogICB9IGVsc2UgewotICAgIFJlc3VsdCA9IFVzdWFsVW5hcnlDb252ZXJzaW9ucyhGbik7CisgICAgUmVzdWx0ID0gQ2FsbEV4cHJVbmFyeUNvbnZlcnNpb25zKEZuKTsKICAgfQogICBpZiAoUmVzdWx0LmlzSW52YWxpZCgpKQogICAgIHJldHVybiBFeHByRXJyb3IoKTsKQEAgLTQ2MjksNyArNDY1NCw3IEBACiAgICAgICAgICAgICA8PCBGRGVjbC0+Z2V0TmFtZSgpIDw8IEZuLT5nZXRTb3VyY2VSYW5nZSgpKTsKIAogICAgICAgLy8gQ1VEQTogS2VybmVsIGZ1bmN0aW9uIG11c3QgaGF2ZSAndm9pZCcgcmV0dXJuIHR5cGUKLSAgICAgIGlmICghRnVuY1QtPmdldFJlc3VsdFR5cGUoKS0+aXNWb2lkVHlwZSgpKQorICAgICAgaWYgKCFGdW5jVC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWRUeXBlKCkpCiAgICAgICAgIHJldHVybiBFeHByRXJyb3IoRGlhZyhMUGFyZW5Mb2MsIGRpYWc6OmVycl9rZXJuX3R5cGVfbm90X3ZvaWRfcmV0dXJuKQogICAgICAgICAgICAgPDwgRm4tPmdldFR5cGUoKSA8PCBGbi0+Z2V0U291cmNlUmFuZ2UoKSk7CiAgICAgfSBlbHNlIHsKQEAgLTQ2NDEsMTQgKzQ2NjYsMTMgQEAKICAgfQogCiAgIC8vIENoZWNrIGZvciBhIHZhbGlkIHJldHVybiB0eXBlCi0gIGlmIChDaGVja0NhbGxSZXR1cm5UeXBlKEZ1bmNULT5nZXRSZXN1bHRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZuLT5nZXRMb2NTdGFydCgpLCBUaGVDYWxsLAorICBpZiAoQ2hlY2tDYWxsUmV0dXJuVHlwZShGdW5jVC0+Z2V0UmV0dXJuVHlwZSgpLCBGbi0+Z2V0TG9jU3RhcnQoKSwgVGhlQ2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRlY2wpKQogICAgIHJldHVybiBFeHByRXJyb3IoKTsKIAogICAvLyBXZSBrbm93IHRoZSByZXN1bHQgdHlwZSBvZiB0aGUgY2FsbCwgc2V0IGl0LgogICBUaGVDYWxsLT5zZXRUeXBlKEZ1bmNULT5nZXRDYWxsUmVzdWx0VHlwZShDb250ZXh0KSk7Ci0gIFRoZUNhbGwtPnNldFZhbHVlS2luZChFeHByOjpnZXRWYWx1ZUtpbmRGb3JUeXBlKEZ1bmNULT5nZXRSZXN1bHRUeXBlKCkpKTsKKyAgVGhlQ2FsbC0+c2V0VmFsdWVLaW5kKEV4cHI6OmdldFZhbHVlS2luZEZvclR5cGUoRnVuY1QtPmdldFJldHVyblR5cGUoKSkpOwogCiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpQcm90byA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGdW5jVCk7CiAgIGlmIChQcm90bykgewpAQCAtNDY3OSwxMSArNDcwMyw5IEBACiAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEFyZ3Muc2l6ZSgpOyBpICE9IGU7IGkrKykgewogICAgICAgRXhwciAqQXJnID0gQXJnc1tpXTsKIAotICAgICAgaWYgKFByb3RvICYmIGkgPCBQcm90by0+Z2V0TnVtQXJncygpKSB7Ci0gICAgICAgIEluaXRpYWxpemVkRW50aXR5IEVudGl0eQotICAgICAgICAgID0gSW5pdGlhbGl6ZWRFbnRpdHk6OkluaXRpYWxpemVQYXJhbWV0ZXIoQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90by0+Z2V0QXJnVHlwZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvLT5pc0FyZ0NvbnN1bWVkKGkpKTsKKyAgICAgIGlmIChQcm90byAmJiBpIDwgUHJvdG8tPmdldE51bVBhcmFtcygpKSB7CisgICAgICAgIEluaXRpYWxpemVkRW50aXR5IEVudGl0eSA9IEluaXRpYWxpemVkRW50aXR5OjpJbml0aWFsaXplUGFyYW1ldGVyKAorICAgICAgICAgICAgQ29udGV4dCwgUHJvdG8tPmdldFBhcmFtVHlwZShpKSwgUHJvdG8tPmlzUGFyYW1Db25zdW1lZChpKSk7CiAgICAgICAgIEV4cHJSZXN1bHQgQXJnRSA9IFBlcmZvcm1Db3B5SW5pdGlhbGl6YXRpb24oRW50aXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZWQoQXJnKSk7CkBAIC00ODc2LDggKzQ4OTgsMTMgQEAKICAgY2FzZSBUeXBlOjpTVEtfQmxvY2tQb2ludGVyOgogICBjYXNlIFR5cGU6OlNUS19PYmpDT2JqZWN0UG9pbnRlcjoKICAgICBzd2l0Y2ggKERlc3RUeS0+Z2V0U2NhbGFyVHlwZUtpbmQoKSkgewotICAgIGNhc2UgVHlwZTo6U1RLX0NQb2ludGVyOgorICAgIGNhc2UgVHlwZTo6U1RLX0NQb2ludGVyOiB7CisgICAgICB1bnNpZ25lZCBTcmNBUyA9IFNyY1R5LT5nZXRQb2ludGVlVHlwZSgpLmdldEFkZHJlc3NTcGFjZSgpOworICAgICAgdW5zaWduZWQgRGVzdEFTID0gRGVzdFR5LT5nZXRQb2ludGVlVHlwZSgpLmdldEFkZHJlc3NTcGFjZSgpOworICAgICAgaWYgKFNyY0FTICE9IERlc3RBUykKKyAgICAgICAgcmV0dXJuIENLX0FkZHJlc3NTcGFjZUNvbnZlcnNpb247CiAgICAgICByZXR1cm4gQ0tfQml0Q2FzdDsKKyAgICB9CiAgICAgY2FzZSBUeXBlOjpTVEtfQmxvY2tQb2ludGVyOgogICAgICAgcmV0dXJuIChTcmNLaW5kID09IFR5cGU6OlNUS19CbG9ja1BvaW50ZXIKICAgICAgICAgICAgICAgICA/IENLX0JpdENhc3QgOiBDS19BbnlQb2ludGVyVG9CbG9ja1BvaW50ZXJDYXN0KTsKQEAgLTUwMjAsMTIgKzUwNDcsNTUgQEAKICAgbGx2bV91bnJlYWNoYWJsZSgiVW5oYW5kbGVkIHNjYWxhciBjYXN0Iik7CiB9CiAKK3N0YXRpYyBib29sIGJyZWFrRG93blZlY3RvclR5cGUoUXVhbFR5cGUgdHlwZSwgdWludDY0X3QgJmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgJmVsdFR5cGUpIHsKKyAgLy8gVmVjdG9ycyBhcmUgc2ltcGxlLgorICBpZiAoY29uc3QgVmVjdG9yVHlwZSAqdmVjVHlwZSA9IHR5cGUtPmdldEFzPFZlY3RvclR5cGU+KCkpIHsKKyAgICBsZW4gPSB2ZWNUeXBlLT5nZXROdW1FbGVtZW50cygpOworICAgIGVsdFR5cGUgPSB2ZWNUeXBlLT5nZXRFbGVtZW50VHlwZSgpOworICAgIGFzc2VydChlbHRUeXBlLT5pc1NjYWxhclR5cGUoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIC8vIFdlIGFsbG93IGxheCBjb252ZXJzaW9uIHRvIGFuZCBmcm9tIG5vbi12ZWN0b3IgdHlwZXMsIGJ1dCBvbmx5IGlmCisgIC8vIHRoZXkncmUgcmVhbCB0eXBlcyAoaS5lLiBub24tY29tcGxleCwgbm9uLXBvaW50ZXIgc2NhbGFyIHR5cGVzKS4KKyAgaWYgKCF0eXBlLT5pc1JlYWxUeXBlKCkpIHJldHVybiBmYWxzZTsKKyAgCisgIGxlbiA9IDE7CisgIGVsdFR5cGUgPSB0eXBlOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgVmVjdG9yVHlwZXNNYXRjaChTZW1hICZTLCBRdWFsVHlwZSBzcmNUeSwgUXVhbFR5cGUgZGVzdFR5KSB7CisgIHVpbnQ2NF90IHNyY0xlbiwgZGVzdExlbjsKKyAgUXVhbFR5cGUgc3JjRWx0LCBkZXN0RWx0OworICBpZiAoIWJyZWFrRG93blZlY3RvclR5cGUoc3JjVHksIHNyY0xlbiwgc3JjRWx0KSkgcmV0dXJuIGZhbHNlOworICBpZiAoIWJyZWFrRG93blZlY3RvclR5cGUoZGVzdFR5LCBkZXN0TGVuLCBkZXN0RWx0KSkgcmV0dXJuIGZhbHNlOworICAKKyAgLy8gQVNUQ29udGV4dDo6Z2V0VHlwZVNpemUgd2lsbCByZXR1cm4gdGhlIHNpemUgcm91bmRlZCB1cCB0byBhCisgIC8vIHBvd2VyIG9mIDIsIHNvIGluc3RlYWQgb2YgdXNpbmcgdGhhdCwgd2UgbmVlZCB0byB1c2UgdGhlIHJhdworICAvLyBlbGVtZW50IHNpemUgbXVsdGlwbGllZCBieSB0aGUgZWxlbWVudCBjb3VudC4KKyAgdWludDY0X3Qgc3JjRWx0U2l6ZSA9IFMuQ29udGV4dC5nZXRUeXBlU2l6ZShzcmNFbHQpOworICB1aW50NjRfdCBkZXN0RWx0U2l6ZSA9IFMuQ29udGV4dC5nZXRUeXBlU2l6ZShkZXN0RWx0KTsKKyAgCisgIHJldHVybiAoc3JjTGVuICogc3JjRWx0U2l6ZSA9PSBkZXN0TGVuICogZGVzdEVsdFNpemUpOworfQorCisvLy8gSXMgdGhpcyBhIGxlZ2FsIGNvbnZlcnNpb24gYmV0d2VlbiB0d28ga25vd24gdmVjdG9yIHR5cGVzPworYm9vbCBTZW1hOjppc0xheFZlY3RvckNvbnZlcnNpb24oUXVhbFR5cGUgc3JjVHksIFF1YWxUeXBlIGRlc3RUeSkgeworICBhc3NlcnQoZGVzdFR5LT5pc1ZlY3RvclR5cGUoKSB8fCBzcmNUeS0+aXNWZWN0b3JUeXBlKCkpOworICAKKyAgaWYgKCFDb250ZXh0LmdldExhbmdPcHRzKCkuTGF4VmVjdG9yQ29udmVyc2lvbnMpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gVmVjdG9yVHlwZXNNYXRjaCgqdGhpcywgc3JjVHksIGRlc3RUeSk7Cit9CisKIGJvb2wgU2VtYTo6Q2hlY2tWZWN0b3JDYXN0KFNvdXJjZVJhbmdlIFIsIFF1YWxUeXBlIFZlY3RvclR5LCBRdWFsVHlwZSBUeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3RLaW5kICZLaW5kKSB7CiAgIGFzc2VydChWZWN0b3JUeS0+aXNWZWN0b3JUeXBlKCkgJiYgIk5vdCBhIHZlY3RvciB0eXBlISIpOwogCiAgIGlmIChUeS0+aXNWZWN0b3JUeXBlKCkgfHwgVHktPmlzSW50ZWdlclR5cGUoKSkgewotICAgIGlmIChDb250ZXh0LmdldFR5cGVTaXplKFZlY3RvclR5KSAhPSBDb250ZXh0LmdldFR5cGVTaXplKFR5KSkKKyAgICBpZiAoIVZlY3RvclR5cGVzTWF0Y2goKnRoaXMsIFR5LCBWZWN0b3JUeSkpCiAgICAgICByZXR1cm4gRGlhZyhSLmdldEJlZ2luKCksCiAgICAgICAgICAgICAgICAgICBUeS0+aXNWZWN0b3JUeXBlKCkgPwogICAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX2ludmFsaWRfY29udmVyc2lvbl9iZXR3ZWVuX3ZlY3RvcnMgOgpAQCAtNTA1MSw3ICs1MTIxLDcgQEAKICAgLy8gSW4gT3BlbkNMLCBjYXN0cyBiZXR3ZWVuIHZlY3RvcnMgb2YgZGlmZmVyZW50IHR5cGVzIGFyZSBub3QgYWxsb3dlZC4KICAgLy8gKFNlZSBPcGVuQ0wgNi4yKS4KICAgaWYgKFNyY1R5LT5pc1ZlY3RvclR5cGUoKSkgewotICAgIGlmIChDb250ZXh0LmdldFR5cGVTaXplKERlc3RUeSkgIT0gQ29udGV4dC5nZXRUeXBlU2l6ZShTcmNUeSkKKyAgICBpZiAoIVZlY3RvclR5cGVzTWF0Y2goKnRoaXMsIFNyY1R5LCBEZXN0VHkpCiAgICAgICAgIHx8IChnZXRMYW5nT3B0cygpLk9wZW5DTCAmJgogICAgICAgICAgICAgKERlc3RUeS5nZXRDYW5vbmljYWxUeXBlKCkgIT0gU3JjVHkuZ2V0Q2Fub25pY2FsVHlwZSgpKSkpIHsKICAgICAgIERpYWcoUi5nZXRCZWdpbigpLGRpYWc6OmVycl9pbnZhbGlkX2NvbnZlcnNpb25fYmV0d2Vlbl9leHRfdmVjdG9ycykKQEAgLTUxMzcsNiArNTIwNywxMCBAQAogICAgIENhc3RFeHByID0gUmVzdWx0LnRha2UoKTsKICAgfQogCisgIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyAmJiAhY2FzdFR5cGUtPmlzVm9pZFR5cGUoKSAmJgorICAgICAgIWdldFNvdXJjZU1hbmFnZXIoKS5pc0luU3lzdGVtTWFjcm8oTFBhcmVuTG9jKSkKKyAgICBEaWFnKExQYXJlbkxvYywgZGlhZzo6d2Fybl9vbGRfc3R5bGVfY2FzdCkgPDwgQ2FzdEV4cHItPmdldFNvdXJjZVJhbmdlKCk7CisKICAgcmV0dXJuIEJ1aWxkQ1N0eWxlQ2FzdEV4cHIoTFBhcmVuTG9jLCBjYXN0VEluZm8sIFJQYXJlbkxvYywgQ2FzdEV4cHIpOwogfQogCkBAIC01OTcxLDE1ICs2MDQ1LDE2IEBACiAgIC8vIGdldCB0aGUgInBvaW50ZWQgdG8iIHR5cGUgKGlnbm9yaW5nIHF1YWxpZmllcnMgYXQgdGhlIHRvcCBsZXZlbCkKICAgY29uc3QgVHlwZSAqbGhwdGVlLCAqcmhwdGVlOwogICBRdWFsaWZpZXJzIGxocSwgcmhxOwotICBsbHZtOjp0aWUobGhwdGVlLCBsaHEpID0gY2FzdDxQb2ludGVyVHlwZT4oTEhTVHlwZSktPmdldFBvaW50ZWVUeXBlKCkuc3BsaXQoKTsKLSAgbGx2bTo6dGllKHJocHRlZSwgcmhxKSA9IGNhc3Q8UG9pbnRlclR5cGU+KFJIU1R5cGUpLT5nZXRQb2ludGVlVHlwZSgpLnNwbGl0KCk7CisgIHN0ZDo6dGllKGxocHRlZSwgbGhxKSA9CisgICAgICBjYXN0PFBvaW50ZXJUeXBlPihMSFNUeXBlKS0+Z2V0UG9pbnRlZVR5cGUoKS5zcGxpdCgpLmFzUGFpcigpOworICBzdGQ6OnRpZShyaHB0ZWUsIHJocSkgPQorICAgICAgY2FzdDxQb2ludGVyVHlwZT4oUkhTVHlwZSktPmdldFBvaW50ZWVUeXBlKCkuc3BsaXQoKS5hc1BhaXIoKTsKIAogICBTZW1hOjpBc3NpZ25Db252ZXJ0VHlwZSBDb252VHkgPSBTZW1hOjpDb21wYXRpYmxlOwogCiAgIC8vIEM5OSA2LjUuMTYuMXAxOiBUaGlzIGZvbGxvd2luZyBjaXRhdGlvbiBpcyBjb21tb24gdG8gY29uc3RyYWludHMKICAgLy8gMyAmIDQgKGJlbG93KS4gLi4uYW5kIHRoZSB0eXBlICpwb2ludGVkIHRvKiBieSB0aGUgbGVmdCBoYXMgYWxsIHRoZQogICAvLyBxdWFsaWZpZXJzIG9mIHRoZSB0eXBlICpwb2ludGVkIHRvKiBieSB0aGUgcmlnaHQ7Ci0gIFF1YWxpZmllcnMgbHE7CiAKICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsICdub24tX193ZWFrIEEgKicgLT4gJ25vbi1fX3dlYWsgY29uc3QgKicgaXMgb2theS4KICAgaWYgKGxocS5nZXRPYmpDTGlmZXRpbWUoKSAhPSByaHEuZ2V0T2JqQ0xpZmV0aW1lKCkgJiYKQEAgLTYyNTcsOCArNjMzMiw3IEBACiAgICAgICAvLyBJZiB3ZSBhcmUgYWxsb3dpbmcgbGF4IHZlY3RvciBjb252ZXJzaW9ucywgYW5kIExIUyBhbmQgUkhTIGFyZSBib3RoCiAgICAgICAvLyB2ZWN0b3JzLCB0aGUgdG90YWwgc2l6ZSBvbmx5IG5lZWRzIHRvIGJlIHRoZSBzYW1lLiBUaGlzIGlzIGEgYml0Y2FzdDsKICAgICAgIC8vIG5vIGJpdHMgYXJlIGNoYW5nZWQgYnV0IHRoZSByZXN1bHQgdHlwZSBpcyBkaWZmZXJlbnQuCi0gICAgICBpZiAoZ2V0TGFuZ09wdHMoKS5MYXhWZWN0b3JDb252ZXJzaW9ucyAmJgotICAgICAgICAgIChDb250ZXh0LmdldFR5cGVTaXplKExIU1R5cGUpID09IENvbnRleHQuZ2V0VHlwZVNpemUoUkhTVHlwZSkpKSB7CisgICAgICBpZiAoaXNMYXhWZWN0b3JDb252ZXJzaW9uKFJIU1R5cGUsIExIU1R5cGUpKSB7CiAgICAgICAgIEtpbmQgPSBDS19CaXRDYXN0OwogICAgICAgICByZXR1cm4gSW5jb21wYXRpYmxlVmVjdG9yczsKICAgICAgIH0KQEAgLTY0ODAsOSArNjU1NCw3IEBACiAgIFJlY29yZERlY2wgKlVEID0gVVQtPmdldERlY2woKTsKICAgRmllbGREZWNsICpJbml0RmllbGQgPSAwOwogICAvLyBJdCdzIGNvbXBhdGlibGUgaWYgdGhlIGV4cHJlc3Npb24gbWF0Y2hlcyBhbnkgb2YgdGhlIGZpZWxkcy4KLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBpdCA9IFVELT5maWVsZF9iZWdpbigpLAotICAgICAgICAgaXRlbmQgPSBVRC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgaXQgIT0gaXRlbmQ7ICsraXQpIHsKKyAgZm9yIChhdXRvICppdCA6IFVELT5maWVsZHMoKSkgewogICAgIGlmIChpdC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeXBlKCkpIHsKICAgICAgIC8vIElmIHRoZSB0cmFuc3BhcmVudCB1bmlvbiBjb250YWlucyBhIHBvaW50ZXIgdHlwZSwgd2UgYWxsb3c6CiAgICAgICAvLyAxKSB2b2lkIHBvaW50ZXIKQEAgLTY0OTAsNyArNjU2Miw3IEBACiAgICAgICBpZiAoUkhTVHlwZS0+aXNQb2ludGVyVHlwZSgpKQogICAgICAgICBpZiAoUkhTVHlwZS0+Y2FzdEFzPFBvaW50ZXJUeXBlPigpLT5nZXRQb2ludGVlVHlwZSgpLT5pc1ZvaWRUeXBlKCkpIHsKICAgICAgICAgICBSSFMgPSBJbXBDYXN0RXhwclRvVHlwZShSSFMudGFrZSgpLCBpdC0+Z2V0VHlwZSgpLCBDS19CaXRDYXN0KTsKLSAgICAgICAgICBJbml0RmllbGQgPSAqaXQ7CisgICAgICAgICAgSW5pdEZpZWxkID0gaXQ7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNjQ5OCw3ICs2NTcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByOjpOUENfVmFsdWVEZXBlbmRlbnRJc051bGwpKSB7CiAgICAgICAgIFJIUyA9IEltcENhc3RFeHByVG9UeXBlKFJIUy50YWtlKCksIGl0LT5nZXRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENLX051bGxUb1BvaW50ZXIpOwotICAgICAgICBJbml0RmllbGQgPSAqaXQ7CisgICAgICAgIEluaXRGaWVsZCA9IGl0OwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CkBAIC02NTA3LDcgKzY1NzksNyBAQAogICAgIGlmIChDaGVja0Fzc2lnbm1lbnRDb25zdHJhaW50cyhpdC0+Z2V0VHlwZSgpLCBSSFMsIEtpbmQpCiAgICAgICAgICAgPT0gQ29tcGF0aWJsZSkgewogICAgICAgUkhTID0gSW1wQ2FzdEV4cHJUb1R5cGUoUkhTLnRha2UoKSwgaXQtPmdldFR5cGUoKSwgS2luZCk7Ci0gICAgICBJbml0RmllbGQgPSAqaXQ7CisgICAgICBJbml0RmllbGQgPSBpdDsKICAgICAgIGJyZWFrOwogICAgIH0KICAgfQpAQCAtNjYwMyw2ICs2Njc1LDE0IEBACiAgICAgaWYgKGdldExhbmdPcHRzKCkuT2JqQ0F1dG9SZWZDb3VudCkKICAgICAgIENoZWNrT2JqQ0FSQ0NvbnZlcnNpb24oU291cmNlUmFuZ2UoKSwgVHksIEUsIENDS19JbXBsaWNpdENvbnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3NlQ0ZBdWRpdGVkKTsKKyAgICBpZiAoZ2V0TGFuZ09wdHMoKS5PYmpDMSAmJgorICAgICAgICAoQ2hlY2tPYmpDQnJpZGdlUmVsYXRlZENvbnZlcnNpb25zKEUtPmdldExvY1N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFNUeXBlLCBFLT5nZXRUeXBlKCksIEUpIHx8CisgICAgICAgICBDb252ZXJzaW9uVG9PYmpDU3RyaW5nTGl0ZXJhbENoZWNrKExIU1R5cGUsIEUpKSkgeworICAgICAgUkhTID0gT3duZWQoRSk7CisgICAgICByZXR1cm4gQ29tcGF0aWJsZTsKKyAgICB9CisgICAgCiAgICAgUkhTID0gSW1wQ2FzdEV4cHJUb1R5cGUoRSwgVHksIEtpbmQpOwogICB9CiAgIHJldHVybiByZXN1bHQ7CkBAIC02NjE2LDYgKzY2OTYsNTMgQEAKICAgcmV0dXJuIFF1YWxUeXBlKCk7CiB9CiAKKy8vLyBUcnkgdG8gY29udmVydCBhIHZhbHVlIG9mIG5vbi12ZWN0b3IgdHlwZSB0byBhIHZlY3RvciB0eXBlIGJ5IGNvbnZlcnRpbmcKKy8vLyB0aGUgdHlwZSB0byB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSB2ZWN0b3IgYW5kIHRoZW4gcGVyZm9ybWluZyBhIHNwbGF0LgorLy8vIElmIHRoZSBsYW5ndWFnZSBpcyBPcGVuQ0wsIHdlIG9ubHkgdXNlIGNvbnZlcnNpb25zIHRoYXQgcHJvbW90ZSBzY2FsYXIKKy8vLyByYW5rOyBmb3IgQywgT2JqLUMsIGFuZCBDKysgd2UgYWxsb3cgYW55IHJlYWwgc2NhbGFyIGNvbnZlcnNpb24gZXhjZXB0CisvLy8gZm9yIGZsb2F0LT5pbnQuCisvLy8KKy8vLyBccGFyYW0gc2NhbGFyIC0gaWYgbm9uLW51bGwsIGFjdHVhbGx5IHBlcmZvcm0gdGhlIGNvbnZlcnNpb25zCisvLy8gXHJldHVybiB0cnVlIGlmIHRoZSBvcGVyYXRpb24gZmFpbHMgKGJ1dCB3aXRob3V0IGRpYWdub3NpbmcgdGhlIGZhaWx1cmUpCitzdGF0aWMgYm9vbCB0cnlWZWN0b3JDb252ZXJ0QW5kU3BsYXQoU2VtYSAmUywgRXhwclJlc3VsdCAqc2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIHNjYWxhclR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIHZlY3RvckVsdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIHZlY3RvclR5KSB7CisgIC8vIFRoZSBjb252ZXJzaW9uIHRvIGFwcGx5IHRvIHRoZSBzY2FsYXIgYmVmb3JlIHNwbGF0dGluZyBpdCwKKyAgLy8gaWYgbmVjZXNzYXJ5LgorICBDYXN0S2luZCBzY2FsYXJDYXN0ID0gQ0tfSW52YWxpZDsKKyAgCisgIGlmICh2ZWN0b3JFbHRUeS0+aXNJbnRlZ3JhbFR5cGUoUy5Db250ZXh0KSkgeworICAgIGlmICghc2NhbGFyVHktPmlzSW50ZWdyYWxUeXBlKFMuQ29udGV4dCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoUy5nZXRMYW5nT3B0cygpLk9wZW5DTCAmJgorICAgICAgICBTLkNvbnRleHQuZ2V0SW50ZWdlclR5cGVPcmRlcih2ZWN0b3JFbHRUeSwgc2NhbGFyVHkpIDwgMCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHNjYWxhckNhc3QgPSBDS19JbnRlZ3JhbENhc3Q7CisgIH0gZWxzZSBpZiAodmVjdG9yRWx0VHktPmlzUmVhbEZsb2F0aW5nVHlwZSgpKSB7CisgICAgaWYgKHNjYWxhclR5LT5pc1JlYWxGbG9hdGluZ1R5cGUoKSkgeworICAgICAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5PcGVuQ0wgJiYKKyAgICAgICAgICBTLkNvbnRleHQuZ2V0RmxvYXRpbmdUeXBlT3JkZXIodmVjdG9yRWx0VHksIHNjYWxhclR5KSA8IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgc2NhbGFyQ2FzdCA9IENLX0Zsb2F0aW5nQ2FzdDsKKyAgICB9CisgICAgZWxzZSBpZiAoc2NhbGFyVHktPmlzSW50ZWdyYWxUeXBlKFMuQ29udGV4dCkpCisgICAgICBzY2FsYXJDYXN0ID0gQ0tfSW50ZWdyYWxUb0Zsb2F0aW5nOworICAgIGVsc2UKKyAgICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQWRqdXN0IHNjYWxhciBpZiBkZXNpcmVkLgorICBpZiAoc2NhbGFyKSB7CisgICAgaWYgKHNjYWxhckNhc3QgIT0gQ0tfSW52YWxpZCkKKyAgICAgICpzY2FsYXIgPSBTLkltcENhc3RFeHByVG9UeXBlKHNjYWxhci0+dGFrZSgpLCB2ZWN0b3JFbHRUeSwgc2NhbGFyQ2FzdCk7CisgICAgKnNjYWxhciA9IFMuSW1wQ2FzdEV4cHJUb1R5cGUoc2NhbGFyLT50YWtlKCksIHZlY3RvclR5LCBDS19WZWN0b3JTcGxhdCk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCiBRdWFsVHlwZSBTZW1hOjpDaGVja1ZlY3Rvck9wZXJhbmRzKEV4cHJSZXN1bHQgJkxIUywgRXhwclJlc3VsdCAmUkhTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MsIGJvb2wgSXNDb21wQXNzaWduKSB7CiAgIGlmICghSXNDb21wQXNzaWduKSB7CkBAIC02NjI5LDE5ICs2NzU2LDIxIEBACiAKICAgLy8gRm9yIGNvbnZlcnNpb24gcHVycG9zZXMsIHdlIGlnbm9yZSBhbnkgcXVhbGlmaWVycy4KICAgLy8gRm9yIGV4YW1wbGUsICJjb25zdCBmbG9hdCIgYW5kICJmbG9hdCIgYXJlIGVxdWl2YWxlbnQuCi0gIFF1YWxUeXBlIExIU1R5cGUgPQotICAgIENvbnRleHQuZ2V0Q2Fub25pY2FsVHlwZShMSFMuZ2V0KCktPmdldFR5cGUoKSkuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7Ci0gIFF1YWxUeXBlIFJIU1R5cGUgPQotICAgIENvbnRleHQuZ2V0Q2Fub25pY2FsVHlwZShSSFMuZ2V0KCktPmdldFR5cGUoKSkuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CisgIFF1YWxUeXBlIExIU1R5cGUgPSBMSFMuZ2V0KCktPmdldFR5cGUoKS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKKyAgUXVhbFR5cGUgUkhTVHlwZSA9IFJIUy5nZXQoKS0+Z2V0VHlwZSgpLmdldFVucXVhbGlmaWVkVHlwZSgpOwogCiAgIC8vIElmIHRoZSB2ZWN0b3IgdHlwZXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuLgotICBpZiAoTEhTVHlwZSA9PSBSSFNUeXBlKQorICBpZiAoQ29udGV4dC5oYXNTYW1lVHlwZShMSFNUeXBlLCBSSFNUeXBlKSkKICAgICByZXR1cm4gTEhTVHlwZTsKIAotICAvLyBIYW5kbGUgdGhlIGNhc2Ugb2YgZXF1aXZhbGVudCBBbHRpVmVjIGFuZCBHQ0MgdmVjdG9yIHR5cGVzCi0gIGlmIChMSFNUeXBlLT5pc1ZlY3RvclR5cGUoKSAmJiBSSFNUeXBlLT5pc1ZlY3RvclR5cGUoKSAmJgorICBjb25zdCBWZWN0b3JUeXBlICpMSFNWZWNUeXBlID0gTEhTVHlwZS0+Z2V0QXM8VmVjdG9yVHlwZT4oKTsKKyAgY29uc3QgVmVjdG9yVHlwZSAqUkhTVmVjVHlwZSA9IFJIU1R5cGUtPmdldEFzPFZlY3RvclR5cGU+KCk7CisgIGFzc2VydChMSFNWZWNUeXBlIHx8IFJIU1ZlY1R5cGUpOworCisgIC8vIElmIHdlIGhhdmUgY29tcGF0aWJsZSBBbHRpVmVjIGFuZCBHQ0MgdmVjdG9yIHR5cGVzLCB1c2UgdGhlIEFsdGlWZWMgdHlwZS4KKyAgaWYgKExIU1ZlY1R5cGUgJiYgUkhTVmVjVHlwZSAmJgogICAgICAgQ29udGV4dC5hcmVDb21wYXRpYmxlVmVjdG9yVHlwZXMoTEhTVHlwZSwgUkhTVHlwZSkpIHsKLSAgICBpZiAoTEhTVHlwZS0+aXNFeHRWZWN0b3JUeXBlKCkpIHsKKyAgICBpZiAoaXNhPEV4dFZlY3RvclR5cGU+KExIU1ZlY1R5cGUpKSB7CiAgICAgICBSSFMgPSBJbXBDYXN0RXhwclRvVHlwZShSSFMudGFrZSgpLCBMSFNUeXBlLCBDS19CaXRDYXN0KTsKICAgICAgIHJldHVybiBMSFNUeXBlOwogICAgIH0KQEAgLTY2NTEsNjIgKzY3ODAsNDMgQEAKICAgICByZXR1cm4gUkhTVHlwZTsKICAgfQogCi0gIGlmIChnZXRMYW5nT3B0cygpLkxheFZlY3RvckNvbnZlcnNpb25zICYmCi0gICAgICBDb250ZXh0LmdldFR5cGVTaXplKExIU1R5cGUpID09IENvbnRleHQuZ2V0VHlwZVNpemUoUkhTVHlwZSkpIHsKLSAgICAvLyBJZiB3ZSBhcmUgYWxsb3dpbmcgbGF4IHZlY3RvciBjb252ZXJzaW9ucywgYW5kIExIUyBhbmQgUkhTIGFyZSBib3RoCi0gICAgLy8gdmVjdG9ycywgdGhlIHRvdGFsIHNpemUgb25seSBuZWVkcyB0byBiZSB0aGUgc2FtZS4gVGhpcyBpcyBhCi0gICAgLy8gYml0Y2FzdDsgbm8gYml0cyBhcmUgY2hhbmdlZCBidXQgdGhlIHJlc3VsdCB0eXBlIGlzIGRpZmZlcmVudC4KLSAgICAvLyBGSVhNRTogU2hvdWxkIHdlIHJlYWxseSBiZSBhbGxvd2luZyB0aGlzPwotICAgIFJIUyA9IEltcENhc3RFeHByVG9UeXBlKFJIUy50YWtlKCksIExIU1R5cGUsIENLX0JpdENhc3QpOwotICAgIHJldHVybiBMSFNUeXBlOworICAvLyBJZiB0aGVyZSdzIGFuIGV4dC12ZWN0b3IgdHlwZSBhbmQgYSBzY2FsYXIsIHRyeSB0byBjb252ZXJ0IHRoZSBzY2FsYXIgdG8KKyAgLy8gdGhlIHZlY3RvciBlbGVtZW50IHR5cGUgYW5kIHNwbGF0LgorICBpZiAoIVJIU1ZlY1R5cGUgJiYgaXNhPEV4dFZlY3RvclR5cGU+KExIU1ZlY1R5cGUpKSB7CisgICAgaWYgKCF0cnlWZWN0b3JDb252ZXJ0QW5kU3BsYXQoKnRoaXMsICZSSFMsIFJIU1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTVmVjVHlwZS0+Z2V0RWxlbWVudFR5cGUoKSwgTEhTVHlwZSkpCisgICAgICByZXR1cm4gTEhTVHlwZTsKKyAgfQorICBpZiAoIUxIU1ZlY1R5cGUgJiYgaXNhPEV4dFZlY3RvclR5cGU+KFJIU1ZlY1R5cGUpKSB7CisgICAgaWYgKCF0cnlWZWN0b3JDb252ZXJ0QW5kU3BsYXQoKnRoaXMsIChJc0NvbXBBc3NpZ24gPyAwIDogJkxIUyksIExIU1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTVmVjVHlwZS0+Z2V0RWxlbWVudFR5cGUoKSwgUkhTVHlwZSkpCisgICAgICByZXR1cm4gUkhTVHlwZTsKICAgfQogCi0gIC8vIENhbm9uaWNhbGl6ZSB0aGUgRXh0VmVjdG9yIHRvIHRoZSBMSFMsIHJlbWVtYmVyIGlmIHdlIHN3YXBwZWQgc28gd2UgY2FuCi0gIC8vIHN3YXAgYmFjayAoc28gdGhhdCB3ZSBkb24ndCByZXZlcnNlIHRoZSBpbnB1dHMgdG8gYSBzdWJ0cmFjdCwgZm9yIGluc3RhbmNlLgotICBib29sIHN3YXBwZWQgPSBmYWxzZTsKLSAgaWYgKFJIU1R5cGUtPmlzRXh0VmVjdG9yVHlwZSgpICYmICFJc0NvbXBBc3NpZ24pIHsKLSAgICBzd2FwcGVkID0gdHJ1ZTsKLSAgICBzdGQ6OnN3YXAoUkhTLCBMSFMpOwotICAgIHN0ZDo6c3dhcChSSFNUeXBlLCBMSFNUeXBlKTsKKyAgLy8gSWYgd2UncmUgYWxsb3dpbmcgbGF4IHZlY3RvciBjb252ZXJzaW9ucywgb25seSB0aGUgdG90YWwgKGRhdGEpIHNpemUKKyAgLy8gbmVlZHMgdG8gYmUgdGhlIHNhbWUuCisgIC8vIEZJWE1FOiBTaG91bGQgd2UgcmVhbGx5IGJlIGFsbG93aW5nIHRoaXM/CisgIC8vIEZJWE1FOiBXZSByZWFsbHkganVzdCBwaWNrIHRoZSBMSFMgdHlwZSBhcmJpdHJhcmlseT8KKyAgaWYgKGlzTGF4VmVjdG9yQ29udmVyc2lvbihSSFNUeXBlLCBMSFNUeXBlKSkgeworICAgIFF1YWxUeXBlIHJlc3VsdFR5cGUgPSBMSFNUeXBlOworICAgIFJIUyA9IEltcENhc3RFeHByVG9UeXBlKFJIUy50YWtlKCksIHJlc3VsdFR5cGUsIENLX0JpdENhc3QpOworICAgIHJldHVybiByZXN1bHRUeXBlOwogICB9CiAKLSAgLy8gSGFuZGxlIHRoZSBjYXNlIG9mIGFuIGV4dCB2ZWN0b3IgYW5kIHNjYWxhci4KLSAgaWYgKGNvbnN0IEV4dFZlY3RvclR5cGUgKkxWID0gTEhTVHlwZS0+Z2V0QXM8RXh0VmVjdG9yVHlwZT4oKSkgewotICAgIFF1YWxUeXBlIEVsdFR5ID0gTFYtPmdldEVsZW1lbnRUeXBlKCk7Ci0gICAgaWYgKEVsdFR5LT5pc0ludGVncmFsVHlwZShDb250ZXh0KSAmJiBSSFNUeXBlLT5pc0ludGVncmFsVHlwZShDb250ZXh0KSkgewotICAgICAgaW50IG9yZGVyID0gQ29udGV4dC5nZXRJbnRlZ2VyVHlwZU9yZGVyKEVsdFR5LCBSSFNUeXBlKTsKLSAgICAgIGlmIChvcmRlciA+IDApCi0gICAgICAgIFJIUyA9IEltcENhc3RFeHByVG9UeXBlKFJIUy50YWtlKCksIEVsdFR5LCBDS19JbnRlZ3JhbENhc3QpOwotICAgICAgaWYgKG9yZGVyID49IDApIHsKLSAgICAgICAgUkhTID0gSW1wQ2FzdEV4cHJUb1R5cGUoUkhTLnRha2UoKSwgTEhTVHlwZSwgQ0tfVmVjdG9yU3BsYXQpOwotICAgICAgICBpZiAoc3dhcHBlZCkgc3RkOjpzd2FwKFJIUywgTEhTKTsKLSAgICAgICAgcmV0dXJuIExIU1R5cGU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChFbHRUeS0+aXNSZWFsRmxvYXRpbmdUeXBlKCkgJiYgUkhTVHlwZS0+aXNTY2FsYXJUeXBlKCkpIHsKLSAgICAgIGlmIChSSFNUeXBlLT5pc1JlYWxGbG9hdGluZ1R5cGUoKSkgewotICAgICAgICBpbnQgb3JkZXIgPSBDb250ZXh0LmdldEZsb2F0aW5nVHlwZU9yZGVyKEVsdFR5LCBSSFNUeXBlKTsKLSAgICAgICAgaWYgKG9yZGVyID4gMCkKLSAgICAgICAgICBSSFMgPSBJbXBDYXN0RXhwclRvVHlwZShSSFMudGFrZSgpLCBFbHRUeSwgQ0tfRmxvYXRpbmdDYXN0KTsKLSAgICAgICAgaWYgKG9yZGVyID49IDApIHsKLSAgICAgICAgICBSSFMgPSBJbXBDYXN0RXhwclRvVHlwZShSSFMudGFrZSgpLCBMSFNUeXBlLCBDS19WZWN0b3JTcGxhdCk7Ci0gICAgICAgICAgaWYgKHN3YXBwZWQpIHN0ZDo6c3dhcChSSFMsIExIUyk7Ci0gICAgICAgICAgcmV0dXJuIExIU1R5cGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChSSFNUeXBlLT5pc0ludGVncmFsVHlwZShDb250ZXh0KSkgewotICAgICAgICBSSFMgPSBJbXBDYXN0RXhwclRvVHlwZShSSFMudGFrZSgpLCBFbHRUeSwgQ0tfSW50ZWdyYWxUb0Zsb2F0aW5nKTsKLSAgICAgICAgUkhTID0gSW1wQ2FzdEV4cHJUb1R5cGUoUkhTLnRha2UoKSwgTEhTVHlwZSwgQ0tfVmVjdG9yU3BsYXQpOwotICAgICAgICBpZiAoc3dhcHBlZCkgc3RkOjpzd2FwKFJIUywgTEhTKTsKLSAgICAgICAgcmV0dXJuIExIU1R5cGU7Ci0gICAgICB9Ci0gICAgfQorICAvLyBPa2F5LCB0aGUgZXhwcmVzc2lvbiBpcyBpbnZhbGlkLgorCisgIC8vIElmIHRoZXJlJ3MgYSBub24tdmVjdG9yLCBub24tcmVhbCBvcGVyYW5kLCBkaWFnbm9zZSB0aGF0LgorICBpZiAoKCFSSFNWZWNUeXBlICYmICFSSFNUeXBlLT5pc1JlYWxUeXBlKCkpIHx8CisgICAgICAoIUxIU1ZlY1R5cGUgJiYgIUxIU1R5cGUtPmlzUmVhbFR5cGUoKSkpIHsKKyAgICBEaWFnKExvYywgZGlhZzo6ZXJyX3R5cGVjaGVja192ZWN0b3Jfbm90X2NvbnZlcnRhYmxlX25vbl9zY2FsYXIpCisgICAgICA8PCBMSFNUeXBlIDw8IFJIU1R5cGUKKyAgICAgIDw8IExIUy5nZXQoKS0+Z2V0U291cmNlUmFuZ2UoKSA8PCBSSFMuZ2V0KCktPmdldFNvdXJjZVJhbmdlKCk7CisgICAgcmV0dXJuIFF1YWxUeXBlKCk7CiAgIH0KIAotICAvLyBWZWN0b3JzIG9mIGRpZmZlcmVudCBzaXplIG9yIHNjYWxhciBhbmQgbm9uLWV4dC12ZWN0b3IgYXJlIGVycm9ycy4KLSAgaWYgKHN3YXBwZWQpIHN0ZDo6c3dhcChSSFMsIExIUyk7CisgIC8vIE90aGVyd2lzZSwgdXNlIHRoZSBnZW5lcmljIGRpYWdub3N0aWMuCiAgIERpYWcoTG9jLCBkaWFnOjplcnJfdHlwZWNoZWNrX3ZlY3Rvcl9ub3RfY29udmVydGFibGUpCi0gICAgPDwgTEhTLmdldCgpLT5nZXRUeXBlKCkgPDwgUkhTLmdldCgpLT5nZXRUeXBlKCkKKyAgICA8PCBMSFNUeXBlIDw8IFJIU1R5cGUKICAgICA8PCBMSFMuZ2V0KCktPmdldFNvdXJjZVJhbmdlKCkgPDwgUkhTLmdldCgpLT5nZXRTb3VyY2VSYW5nZSgpOwogICByZXR1cm4gUXVhbFR5cGUoKTsKIH0KQEAgLTc0OTEsOCArNzYwMSw4IEBACiAgIFF1YWxUeXBlIFQgPSBNZXRob2QtPnBhcmFtX2JlZ2luKClbMF0tPmdldFR5cGUoKTsKICAgaWYgKCFULT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpKQogICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIFF1YWxUeXBlIFIgPSBNZXRob2QtPmdldFJlc3VsdFR5cGUoKTsKKworICBRdWFsVHlwZSBSID0gTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCk7CiAgIGlmICghUi0+aXNTY2FsYXJUeXBlKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC03NzY5LDEwICs3ODc5LDIyIEBACiAgICAgICByZXR1cm4gUmVzdWx0VHk7CiAgIH0KIAotICBib29sIExIU0lzTnVsbCA9IExIUy5nZXQoKS0+aXNOdWxsUG9pbnRlckNvbnN0YW50KENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcjo6TlBDX1ZhbHVlRGVwZW5kZW50SXNOdWxsKTsKLSAgYm9vbCBSSFNJc051bGwgPSBSSFMuZ2V0KCktPmlzTnVsbFBvaW50ZXJDb25zdGFudChDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHI6Ok5QQ19WYWx1ZURlcGVuZGVudElzTnVsbCk7CisgIGNvbnN0IEV4cHI6Ok51bGxQb2ludGVyQ29uc3RhbnRLaW5kIExIU051bGxLaW5kID0KKyAgICAgIExIUy5nZXQoKS0+aXNOdWxsUG9pbnRlckNvbnN0YW50KENvbnRleHQsIEV4cHI6Ok5QQ19WYWx1ZURlcGVuZGVudElzTnVsbCk7CisgIGNvbnN0IEV4cHI6Ok51bGxQb2ludGVyQ29uc3RhbnRLaW5kIFJIU051bGxLaW5kID0KKyAgICAgIFJIUy5nZXQoKS0+aXNOdWxsUG9pbnRlckNvbnN0YW50KENvbnRleHQsIEV4cHI6Ok5QQ19WYWx1ZURlcGVuZGVudElzTnVsbCk7CisgIGJvb2wgTEhTSXNOdWxsID0gTEhTTnVsbEtpbmQgIT0gRXhwcjo6TlBDS19Ob3ROdWxsOworICBib29sIFJIU0lzTnVsbCA9IFJIU051bGxLaW5kICE9IEV4cHI6Ok5QQ0tfTm90TnVsbDsKKworICBpZiAoIUlzUmVsYXRpb25hbCAmJiBMSFNJc051bGwgIT0gUkhTSXNOdWxsKSB7CisgICAgYm9vbCBJc0VxdWFsaXR5ID0gT3BjID09IEJPX0VROworICAgIGlmIChSSFNJc051bGwpCisgICAgICBEaWFnbm9zZUFsd2F5c05vbk51bGxQb2ludGVyKExIUy5nZXQoKSwgUkhTTnVsbEtpbmQsIElzRXF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIUy5nZXQoKS0+Z2V0U291cmNlUmFuZ2UoKSk7CisgICAgZWxzZQorICAgICAgRGlhZ25vc2VBbHdheXNOb25OdWxsUG9pbnRlcihSSFMuZ2V0KCksIExIU051bGxLaW5kLCBJc0VxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSFMuZ2V0KCktPmdldFNvdXJjZVJhbmdlKCkpOworICB9CiAKICAgLy8gQWxsIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlci1yZWxhdGVkIHdhcm5pbmdzIGFyZSBHQ0MgZXh0ZW5zaW9ucywgZXhjZXB0CiAgIC8vIHdoZW4gaGFuZGxpbmcgbnVsbCBwb2ludGVyIGNvbnN0YW50cy4gCkBAIC03ODMwLDEwICs3OTUyLDE0IEBACiAgICAgICBkaWFnbm9zZURpc3RpbmN0UG9pbnRlckNvbXBhcmlzb24oKnRoaXMsIExvYywgTEhTLCBSSFMsIC8qaXNFcnJvciovZmFsc2UpOwogICAgIH0KICAgICBpZiAoTENhblBvaW50ZWVUeSAhPSBSQ2FuUG9pbnRlZVR5KSB7CisgICAgICB1bnNpZ25lZCBBZGRyU3BhY2VMID0gTENhblBvaW50ZWVUeS5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZVIgPSBSQ2FuUG9pbnRlZVR5LmdldEFkZHJlc3NTcGFjZSgpOworICAgICAgQ2FzdEtpbmQgS2luZCA9IEFkZHJTcGFjZUwgIT0gQWRkclNwYWNlUiA/IENLX0FkZHJlc3NTcGFjZUNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDS19CaXRDYXN0OwogICAgICAgaWYgKExIU0lzTnVsbCAmJiAhUkhTSXNOdWxsKQotICAgICAgICBMSFMgPSBJbXBDYXN0RXhwclRvVHlwZShMSFMudGFrZSgpLCBSSFNUeXBlLCBDS19CaXRDYXN0KTsKKyAgICAgICAgTEhTID0gSW1wQ2FzdEV4cHJUb1R5cGUoTEhTLnRha2UoKSwgUkhTVHlwZSwgS2luZCk7CiAgICAgICBlbHNlCi0gICAgICAgIFJIUyA9IEltcENhc3RFeHByVG9UeXBlKFJIUy50YWtlKCksIExIU1R5cGUsIENLX0JpdENhc3QpOworICAgICAgICBSSFMgPSBJbXBDYXN0RXhwclRvVHlwZShSSFMudGFrZSgpLCBMSFNUeXBlLCBLaW5kKTsKICAgICB9CiAgICAgcmV0dXJuIFJlc3VsdFR5OwogICB9CkBAIC04NzMwLDYgKzg4NTYsMTIgQEAKICAgLy8gTWFrZSBzdXJlIHRvIGlnbm9yZSBwYXJlbnRoZXNlcyBpbiBzdWJzZXF1ZW50IGNoZWNrcwogICBFeHByICpvcCA9IE9yaWdPcC5nZXQoKS0+SWdub3JlUGFyZW5zKCk7CiAKKyAgLy8gT3BlbkNMIHYxLjAgczYuOC5hLjM6IFBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBhcmUgbm90IGFsbG93ZWQuCisgIGlmIChMYW5nT3B0cy5PcGVuQ0wgJiYgb3AtPmdldFR5cGUoKS0+aXNGdW5jdGlvblR5cGUoKSkgeworICAgIERpYWcob3AtPmdldEV4cHJMb2MoKSwgZGlhZzo6ZXJyX29wZW5jbF90YWtpbmdfZnVuY3Rpb25fYWRkcmVzcyk7CisgICAgcmV0dXJuIFF1YWxUeXBlKCk7CisgIH0KKwogICBpZiAoZ2V0TGFuZ09wdHMoKS5DOTkpIHsKICAgICAvLyBJbXBsZW1lbnQgQzk5LW9ubHkgcGFydHMgb2YgYWRkcmVzc29mIHJ1bGVzLgogICAgIGlmIChVbmFyeU9wZXJhdG9yKiB1T3AgPSBkeW5fY2FzdDxVbmFyeU9wZXJhdG9yPihvcCkpIHsKQEAgLTg3OTMsOCArODkyNSwxMSBAQAogICAgIGlmIChpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KE1EKSkKICAgICAgIERpYWcoT3BMb2MsIGRpYWc6OmVycl90eXBlY2hlY2tfYWRkcm9mX2R0b3IpIDw8IG9wLT5nZXRTb3VyY2VSYW5nZSgpOwogCi0gICAgcmV0dXJuIENvbnRleHQuZ2V0TWVtYmVyUG9pbnRlclR5cGUob3AtPmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgQ29udGV4dC5nZXRUeXBlRGVjbFR5cGUoTUQtPmdldFBhcmVudCgpKS5nZXRUeXBlUHRyKCkpOworICAgIFF1YWxUeXBlIE1QVHkgPSBDb250ZXh0LmdldE1lbWJlclBvaW50ZXJUeXBlKAorICAgICAgICBvcC0+Z2V0VHlwZSgpLCBDb250ZXh0LmdldFR5cGVEZWNsVHlwZShNRC0+Z2V0UGFyZW50KCkpLmdldFR5cGVQdHIoKSk7CisgICAgaWYgKENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldENYWEFCSSgpLmlzTWljcm9zb2Z0KCkpCisgICAgICBSZXF1aXJlQ29tcGxldGVUeXBlKE9wTG9jLCBNUFR5LCAwKTsKKyAgICByZXR1cm4gTVBUeTsKICAgfSBlbHNlIGlmIChsdmFsICE9IEV4cHI6OkxWX1ZhbGlkICYmIGx2YWwgIT0gRXhwcjo6TFZfSW5jb21wbGV0ZVZvaWRUeXBlKSB7CiAgICAgLy8gQzk5IDYuNS4zLjJwMQogICAgIC8vIFRoZSBvcGVyYW5kIG11c3QgYmUgZWl0aGVyIGFuIGwtdmFsdWUgb3IgYSBmdW5jdGlvbiBkZXNpZ25hdG9yCkBAIC04ODQyLDggKzg5NzcsMTMgQEAKIAogICAgICAgICAgIHdoaWxlIChjYXN0PFJlY29yZERlY2w+KEN0eCktPmlzQW5vbnltb3VzU3RydWN0T3JVbmlvbigpKQogICAgICAgICAgICAgQ3R4ID0gQ3R4LT5nZXRQYXJlbnQoKTsKLSAgICAgICAgICByZXR1cm4gQ29udGV4dC5nZXRNZW1iZXJQb2ludGVyVHlwZShvcC0+Z2V0VHlwZSgpLAotICAgICAgICAgICAgICAgIENvbnRleHQuZ2V0VHlwZURlY2xUeXBlKGNhc3Q8UmVjb3JkRGVjbD4oQ3R4KSkuZ2V0VHlwZVB0cigpKTsKKworICAgICAgICAgIFF1YWxUeXBlIE1QVHkgPSBDb250ZXh0LmdldE1lbWJlclBvaW50ZXJUeXBlKAorICAgICAgICAgICAgICBvcC0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICBDb250ZXh0LmdldFR5cGVEZWNsVHlwZShjYXN0PFJlY29yZERlY2w+KEN0eCkpLmdldFR5cGVQdHIoKSk7CisgICAgICAgICAgaWYgKENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldENYWEFCSSgpLmlzTWljcm9zb2Z0KCkpCisgICAgICAgICAgICBSZXF1aXJlQ29tcGxldGVUeXBlKE9wTG9jLCBNUFR5LCAwKTsKKyAgICAgICAgICByZXR1cm4gTVBUeTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0gZWxzZSBpZiAoIWlzYTxGdW5jdGlvbkRlY2w+KGRjbCkgJiYgIWlzYTxOb25UeXBlVGVtcGxhdGVQYXJtRGVjbD4oZGNsKSkKQEAgLTk2NDEsNyArOTc4MSw3IEBACiAKICAgICBpZiAocmVzdWx0VHlwZS0+aXNEZXBlbmRlbnRUeXBlKCkpCiAgICAgICBicmVhazsKLSAgICBpZiAocmVzdWx0VHlwZS0+aXNTY2FsYXJUeXBlKCkpIHsKKyAgICBpZiAocmVzdWx0VHlwZS0+aXNTY2FsYXJUeXBlKCkgJiYgIWlzU2NvcGVkRW51bWVyYXRpb25UeXBlKHJlc3VsdFR5cGUpKSB7CiAgICAgICAvLyBDOTkgNi41LjMuM3AxOiBvaywgZmFsbHRocm91Z2g7CiAgICAgICBpZiAoQ29udGV4dC5nZXRMYW5nT3B0cygpLkNQbHVzUGx1cykgewogICAgICAgICAvLyBDKyswMyBbZXhwci51bmFyeS5vcF1wOCwgQysrMHggW2V4cHIudW5hcnkub3BdcDk6CkBAIC05ODcyLDcgKzEwMDEyLDcgQEAKICAgLy8gZXhhbXBsZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGdvdG8gaW50byBhIHN0bXQgZXhwcmVzc2lvbiBhcHBhcmVudGx5LgogICAvLyBNb3JlIHNlbWFudGljIGFuYWx5c2lzIGlzIG5lZWRlZC4KIAotICAvLyBJZiB0aGVyZSBhcmUgc3ViIHN0bXRzIGluIHRoZSBjb21wb3VuZCBzdG10LCB0YWtlIHRoZSB0eXBlIG9mIHRoZSBsYXN0IG9uZQorICAvLyBJZiB0aGVyZSBhcmUgc3ViLXN0bXRzIGluIHRoZSBjb21wb3VuZCBzdG10LCB0YWtlIHRoZSB0eXBlIG9mIHRoZSBsYXN0IG9uZQogICAvLyBhcyB0aGUgdHlwZSBvZiB0aGUgc3RtdGV4cHIuCiAgIFF1YWxUeXBlIFR5ID0gQ29udGV4dC5Wb2lkVHk7CiAgIGJvb2wgU3RtdEV4cHJNYXlCaW5kVG9UZW1wID0gZmFsc2U7CkBAIC0xMDA5MiwxMiArMTAyMzIsMTAgQEAKICAgICB9CiAKICAgICBpZiAoSW5kaXJlY3RNZW1iZXJEZWNsKSB7Ci0gICAgICBmb3IgKEluZGlyZWN0RmllbGREZWNsOjpjaGFpbl9pdGVyYXRvciBGSSA9Ci0gICAgICAgICAgIEluZGlyZWN0TWVtYmVyRGVjbC0+Y2hhaW5fYmVnaW4oKSwKLSAgICAgICAgICAgRkVuZCA9IEluZGlyZWN0TWVtYmVyRGVjbC0+Y2hhaW5fZW5kKCk7IEZJICE9IEZFbmQ7IEZJKyspIHsKLSAgICAgICAgYXNzZXJ0KGlzYTxGaWVsZERlY2w+KCpGSSkpOworICAgICAgZm9yIChhdXRvICpGSSA6IEluZGlyZWN0TWVtYmVyRGVjbC0+Y2hhaW4oKSkgeworICAgICAgICBhc3NlcnQoaXNhPEZpZWxkRGVjbD4oRkkpKTsKICAgICAgICAgQ29tcHMucHVzaF9iYWNrKE9mZnNldE9mTm9kZShPQy5Mb2NTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PEZpZWxkRGVjbD4oKkZJKSwgT0MuTG9jRW5kKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxGaWVsZERlY2w+KEZJKSwgT0MuTG9jRW5kKSk7CiAgICAgICB9CiAgICAgfSBlbHNlCiAgICAgICBDb21wcy5wdXNoX2JhY2soT2Zmc2V0T2ZOb2RlKE9DLkxvY1N0YXJ0LCBNZW1iZXJEZWNsLCBPQy5Mb2NFbmQpKTsKQEAgLTEwMjQxLDcgKzEwMzc5LDcgQEAKICAgICAgICAgRXhwbGljaXRTaWduYXR1cmUuZ2V0TG9jYWxSYW5nZUVuZCgpKSB7CiAgICAgICAvLyBUaGlzIHdvdWxkIGJlIG11Y2ggY2hlYXBlciBpZiB3ZSBzdG9yZWQgVHlwZUxvY3MgaW5zdGVhZCBvZgogICAgICAgLy8gVHlwZVNvdXJjZUluZm9zLgotICAgICAgVHlwZUxvYyBSZXN1bHQgPSBFeHBsaWNpdFNpZ25hdHVyZS5nZXRSZXN1bHRMb2MoKTsKKyAgICAgIFR5cGVMb2MgUmVzdWx0ID0gRXhwbGljaXRTaWduYXR1cmUuZ2V0UmV0dXJuTG9jKCk7CiAgICAgICB1bnNpZ25lZCBTaXplID0gUmVzdWx0LmdldEZ1bGxEYXRhU2l6ZSgpOwogICAgICAgU2lnID0gQ29udGV4dC5DcmVhdGVUeXBlU291cmNlSW5mbyhSZXN1bHQuZ2V0VHlwZSgpLCBTaXplKTsKICAgICAgIFNpZy0+Z2V0VHlwZUxvYygpLmluaXRpYWxpemVGdWxsQ29weShSZXN1bHQsIFNpemUpOwpAQCAtMTAyNTQsNyArMTAzOTIsNyBAQAogICBDdXJCbG9jay0+RnVuY3Rpb25UeXBlID0gVDsKIAogICBjb25zdCBGdW5jdGlvblR5cGUgKkZuID0gVC0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpOwotICBRdWFsVHlwZSBSZXRUeSA9IEZuLT5nZXRSZXN1bHRUeXBlKCk7CisgIFF1YWxUeXBlIFJldFR5ID0gRm4tPmdldFJldHVyblR5cGUoKTsKICAgYm9vbCBpc1ZhcmlhZGljID0KICAgICAoaXNhPEZ1bmN0aW9uUHJvdG9UeXBlPihGbikgJiYgY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oRm4pLT5pc1ZhcmlhZGljKCkpOwogCkBAIC0xMDI3Myw4ICsxMDQxMSw4IEBACiAgIC8vIFB1c2ggYmxvY2sgcGFyYW1ldGVycyBmcm9tIHRoZSBkZWNsYXJhdG9yIGlmIHdlIGhhZCB0aGVtLgogICBTbWFsbFZlY3RvcjxQYXJtVmFyRGVjbCosIDg+IFBhcmFtczsKICAgaWYgKEV4cGxpY2l0U2lnbmF0dXJlKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IEV4cGxpY2l0U2lnbmF0dXJlLmdldE51bUFyZ3MoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIFBhcm1WYXJEZWNsICpQYXJhbSA9IEV4cGxpY2l0U2lnbmF0dXJlLmdldEFyZyhJKTsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gRXhwbGljaXRTaWduYXR1cmUuZ2V0TnVtUGFyYW1zKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBQYXJtVmFyRGVjbCAqUGFyYW0gPSBFeHBsaWNpdFNpZ25hdHVyZS5nZXRQYXJhbShJKTsKICAgICAgIGlmIChQYXJhbS0+Z2V0SWRlbnRpZmllcigpID09IDAgJiYKICAgICAgICAgICAhUGFyYW0tPmlzSW1wbGljaXQoKSAmJgogICAgICAgICAgICFQYXJhbS0+aXNJbnZhbGlkRGVjbCgpICYmCkBAIC0xMDI4NiwxMiArMTA0MjQsOSBAQAogICAvLyBGYWtlIHVwIHBhcmFtZXRlciB2YXJpYWJsZXMgaWYgd2UgaGF2ZSBhIHR5cGVkZWYsIGxpa2UKICAgLy8gICBeIGZudHlwZSB7IC4uLiB9CiAgIH0gZWxzZSBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZuID0gVC0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCkpIHsKLSAgICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjphcmdfdHlwZV9pdGVyYXRvcgotICAgICAgICAgICBJID0gRm4tPmFyZ190eXBlX2JlZ2luKCksIEUgPSBGbi0+YXJnX3R5cGVfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBQYXJtVmFyRGVjbCAqUGFyYW0gPQotICAgICAgICBCdWlsZFBhcm1WYXJEZWNsRm9yVHlwZWRlZihDdXJCbG9jay0+VGhlRGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1JbmZvLmdldExvY1N0YXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpJKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBGbi0+cGFyYW1fdHlwZXMoKSkgeworICAgICAgUGFybVZhckRlY2wgKlBhcmFtID0gQnVpbGRQYXJtVmFyRGVjbEZvclR5cGVkZWYoCisgICAgICAgICAgQ3VyQmxvY2stPlRoZURlY2wsIFBhcmFtSW5mby5nZXRMb2NTdGFydCgpLCBJKTsKICAgICAgIFBhcmFtcy5wdXNoX2JhY2soUGFyYW0pOwogICAgIH0KICAgfQpAQCAtMTAzMDgsMTUgKzEwNDQzLDE0IEBACiAgIFByb2Nlc3NEZWNsQXR0cmlidXRlcyhDdXJTY29wZSwgQ3VyQmxvY2stPlRoZURlY2wsIFBhcmFtSW5mbyk7CiAKICAgLy8gUHV0IHRoZSBwYXJhbWV0ZXIgdmFyaWFibGVzIGluIHNjb3BlLgotICBmb3IgKEJsb2NrRGVjbDo6cGFyYW1faXRlcmF0b3IgQUkgPSBDdXJCbG9jay0+VGhlRGVjbC0+cGFyYW1fYmVnaW4oKSwKLSAgICAgICAgIEUgPSBDdXJCbG9jay0+VGhlRGVjbC0+cGFyYW1fZW5kKCk7IEFJICE9IEU7ICsrQUkpIHsKLSAgICAoKkFJKS0+c2V0T3duaW5nRnVuY3Rpb24oQ3VyQmxvY2stPlRoZURlY2wpOworICBmb3IgKGF1dG8gQUkgOiBDdXJCbG9jay0+VGhlRGVjbC0+cGFyYW1zKCkpIHsKKyAgICBBSS0+c2V0T3duaW5nRnVuY3Rpb24oQ3VyQmxvY2stPlRoZURlY2wpOwogCiAgICAgLy8gSWYgdGhpcyBoYXMgYW4gaWRlbnRpZmllciwgYWRkIGl0IHRvIHRoZSBzY29wZSBzdGFjay4KLSAgICBpZiAoKCpBSSktPmdldElkZW50aWZpZXIoKSkgewotICAgICAgQ2hlY2tTaGFkb3coQ3VyQmxvY2stPlRoZVNjb3BlLCAqQUkpOworICAgIGlmIChBSS0+Z2V0SWRlbnRpZmllcigpKSB7CisgICAgICBDaGVja1NoYWRvdyhDdXJCbG9jay0+VGhlU2NvcGUsIEFJKTsKIAotICAgICAgUHVzaE9uU2NvcGVDaGFpbnMoKkFJLCBDdXJCbG9jay0+VGhlU2NvcGUpOworICAgICAgUHVzaE9uU2NvcGVDaGFpbnMoQUksIEN1ckJsb2NrLT5UaGVTY29wZSk7CiAgICAgfQogICB9CiB9CkBAIC0xMDM1OCw3ICsxMDQ5Miw3IEBACiAgIGlmICghQlNJLT5SZXR1cm5UeXBlLmlzTnVsbCgpKQogICAgIFJldFR5ID0gQlNJLT5SZXR1cm5UeXBlOwogCi0gIGJvb2wgTm9SZXR1cm4gPSBCU0ktPlRoZURlY2wtPmdldEF0dHI8Tm9SZXR1cm5BdHRyPigpOworICBib29sIE5vUmV0dXJuID0gQlNJLT5UaGVEZWNsLT5oYXNBdHRyPE5vUmV0dXJuQXR0cj4oKTsKICAgUXVhbFR5cGUgQmxvY2tUeTsKIAogICAvLyBTZXQgdGhlIGNhcHR1cmVkIHZhcmlhYmxlcyBvbiB0aGUgYmxvY2suCkBAIC0xMDM5MCw3ICsxMDUyNCw3IEBACiAKICAgICAvLyBPdGhlcndpc2UsIGlmIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIGFib3V0IHRoZSBmdW5jdGlvbiB0eXBlLAogICAgIC8vIHByZXNlcnZlIGl0cyBzdWdhciBzdHJ1Y3R1cmUuCi0gICAgfSBlbHNlIGlmIChGVHktPmdldFJlc3VsdFR5cGUoKSA9PSBSZXRUeSAmJgorICAgIH0gZWxzZSBpZiAoRlR5LT5nZXRSZXR1cm5UeXBlKCkgPT0gUmV0VHkgJiYKICAgICAgICAgICAgICAgICghTm9SZXR1cm4gfHwgRlR5LT5nZXROb1JldHVybkF0dHIoKSkpIHsKICAgICAgIEJsb2NrVHkgPSBCU0ktPkZ1bmN0aW9uVHlwZTsKIApAQCAtMTA0MDAsNyArMTA1MzQsNyBAQAogICAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBFUEkgPSBGUFQtPmdldEV4dFByb3RvSW5mbygpOwogICAgICAgRVBJLlR5cGVRdWFscyA9IDA7IC8vIEZJWE1FOiBzaWxlbnRseT8KICAgICAgIEVQSS5FeHRJbmZvID0gRXh0OwotICAgICAgQmxvY2tUeSA9IENvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKFJldFR5LCBGUFQtPmdldEFyZ1R5cGVzKCksIEVQSSk7CisgICAgICBCbG9ja1R5ID0gQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoUmV0VHksIEZQVC0+Z2V0UGFyYW1UeXBlcygpLCBFUEkpOwogICAgIH0KIAogICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgZnVuY3Rpb24gdHlwZSwganVzdCBidWlsZCBvbmUgZnJvbSBub3RoaW5nLgpAQCAtMTA0NDIsMTAgKzEwNTc2LDggQEAKIAogICAgIC8vIEl0IGFsc28gZ2V0cyBhIGJyYW5jaC1wcm90ZWN0ZWQgc2NvcGUgaWYgYW55IG9mIHRoZSBjYXB0dXJlZAogICAgIC8vIHZhcmlhYmxlcyBuZWVkcyBkZXN0cnVjdGlvbi4KLSAgICBmb3IgKEJsb2NrRGVjbDo6Y2FwdHVyZV9jb25zdF9pdGVyYXRvcgotICAgICAgICAgICBjaSA9IFJlc3VsdC0+Z2V0QmxvY2tEZWNsKCktPmNhcHR1cmVfYmVnaW4oKSwKLSAgICAgICAgICAgY2UgPSBSZXN1bHQtPmdldEJsb2NrRGVjbCgpLT5jYXB0dXJlX2VuZCgpOyBjaSAhPSBjZTsgKytjaSkgewotICAgICAgY29uc3QgVmFyRGVjbCAqdmFyID0gY2ktPmdldFZhcmlhYmxlKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZDSSA6IFJlc3VsdC0+Z2V0QmxvY2tEZWNsKCktPmNhcHR1cmVzKCkpIHsKKyAgICAgIGNvbnN0IFZhckRlY2wgKnZhciA9IENJLmdldFZhcmlhYmxlKCk7CiAgICAgICBpZiAodmFyLT5nZXRUeXBlKCkuaXNEZXN0cnVjdGVkVHlwZSgpICE9IFF1YWxUeXBlOjpES19ub25lKSB7CiAgICAgICAgIGdldEN1ckZ1bmN0aW9uKCktPnNldEhhc0JyYW5jaFByb3RlY3RlZFNjb3BlKCk7CiAgICAgICAgIGJyZWFrOwpAQCAtMTA1NjcsMzggKzEwNjk5LDM3IEBACiAgIHJldHVybiBPd25lZChuZXcgKENvbnRleHQpIEdOVU51bGxFeHByKFR5LCBUb2tlbkxvYykpOwogfQogCi1zdGF0aWMgdm9pZCBNYWtlT2JqQ1N0cmluZ0xpdGVyYWxGaXhJdEhpbnQoU2VtYSYgU2VtYVJlZiwgUXVhbFR5cGUgRHN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpTcmNFeHByLCBGaXhJdEhpbnQgJkhpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSXNOU1N0cmluZykgewotICBpZiAoIVNlbWFSZWYuZ2V0TGFuZ09wdHMoKS5PYmpDMSkKLSAgICByZXR1cm47Citib29sCitTZW1hOjpDb252ZXJzaW9uVG9PYmpDU3RyaW5nTGl0ZXJhbENoZWNrKFF1YWxUeXBlIERzdFR5cGUsIEV4cHIgKiZFeHApIHsKKyAgaWYgKCFnZXRMYW5nT3B0cygpLk9iakMxKQorICAgIHJldHVybiBmYWxzZTsKIAogICBjb25zdCBPYmpDT2JqZWN0UG9pbnRlclR5cGUgKlBUID0gRHN0VHlwZS0+Z2V0QXM8T2JqQ09iamVjdFBvaW50ZXJUeXBlPigpOwogICBpZiAoIVBUKQotICAgIHJldHVybjsKKyAgICByZXR1cm4gZmFsc2U7CiAKLSAgLy8gQ2hlY2sgaWYgdGhlIGRlc3RpbmF0aW9uIGlzIG9mIHR5cGUgJ2lkJy4KICAgaWYgKCFQVC0+aXNPYmpDSWRUeXBlKCkpIHsKICAgICAvLyBDaGVjayBpZiB0aGUgZGVzdGluYXRpb24gaXMgdGhlICdOU1N0cmluZycgaW50ZXJmYWNlLgogICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJRCA9IFBULT5nZXRJbnRlcmZhY2VEZWNsKCk7CiAgICAgaWYgKCFJRCB8fCAhSUQtPmdldElkZW50aWZpZXIoKS0+aXNTdHIoIk5TU3RyaW5nIikpCi0gICAgICByZXR1cm47Ci0gICAgSXNOU1N0cmluZyA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLQorICAKICAgLy8gSWdub3JlIGFueSBwYXJlbnMsIGltcGxpY2l0IGNhc3RzIChzaG91bGQgb25seSBiZQogICAvLyBhcnJheS10by1wb2ludGVyIGRlY2F5cyksIGFuZCBub3Qtc28tb3BhcXVlIHZhbHVlcy4gIFRoZSBsYXN0IGlzCiAgIC8vIGltcG9ydGFudCBmb3IgbWFraW5nIHRoaXMgdHJpZ2dlciBmb3IgcHJvcGVydHkgYXNzaWdubWVudHMuCi0gIFNyY0V4cHIgPSBTcmNFeHByLT5JZ25vcmVQYXJlbkltcENhc3RzKCk7CisgIEV4cHIgKlNyY0V4cHIgPSBFeHAtPklnbm9yZVBhcmVuSW1wQ2FzdHMoKTsKICAgaWYgKE9wYXF1ZVZhbHVlRXhwciAqT1YgPSBkeW5fY2FzdDxPcGFxdWVWYWx1ZUV4cHI+KFNyY0V4cHIpKQogICAgIGlmIChPVi0+Z2V0U291cmNlRXhwcigpKQogICAgICAgU3JjRXhwciA9IE9WLT5nZXRTb3VyY2VFeHByKCktPklnbm9yZVBhcmVuSW1wQ2FzdHMoKTsKIAogICBTdHJpbmdMaXRlcmFsICpTTCA9IGR5bl9jYXN0PFN0cmluZ0xpdGVyYWw+KFNyY0V4cHIpOwogICBpZiAoIVNMIHx8ICFTTC0+aXNBc2NpaSgpKQotICAgIHJldHVybjsKLQotICBIaW50ID0gRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oU0wtPmdldExvY1N0YXJ0KCksICJAIik7CisgICAgcmV0dXJuIGZhbHNlOworICBEaWFnKFNMLT5nZXRMb2NTdGFydCgpLCBkaWFnOjplcnJfbWlzc2luZ19hdHNpZ25fcHJlZml4KQorICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKFNMLT5nZXRMb2NTdGFydCgpLCAiQCIpOworICBFeHAgPSBCdWlsZE9iakNTdHJpbmdMaXRlcmFsKFNMLT5nZXRMb2NTdGFydCgpLCBTTCkudGFrZSgpOworICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBTZW1hOjpEaWFnbm9zZUFzc2lnbm1lbnRSZXN1bHQoQXNzaWduQ29udmVydFR5cGUgQ29udlR5LApAQCAtMTA2MTcsNyArMTA3NDgsNiBAQAogICBDb252ZXJzaW9uRml4SXRHZW5lcmF0b3IgQ29udkhpbnRzOwogICBib29sIE1heUhhdmVDb252Rml4aXQgPSBmYWxzZTsKICAgYm9vbCBNYXlIYXZlRnVuY3Rpb25EaWZmID0gZmFsc2U7Ci0gIGJvb2wgSXNOU1N0cmluZyA9IGZhbHNlOwogCiAgIHN3aXRjaCAoQ29udlR5KSB7CiAgIGNhc2UgQ29tcGF0aWJsZToKQEAgLTEwNjM1LDcgKzEwNzY1LDYgQEAKICAgICBNYXlIYXZlQ29udkZpeGl0ID0gdHJ1ZTsKICAgICBicmVhazsKICAgY2FzZSBJbmNvbXBhdGlibGVQb2ludGVyOgotICAgIE1ha2VPYmpDU3RyaW5nTGl0ZXJhbEZpeEl0SGludCgqdGhpcywgRHN0VHlwZSwgU3JjRXhwciwgSGludCwgSXNOU1N0cmluZyk7CiAgICAgICBEaWFnS2luZCA9CiAgICAgICAgIChBY3Rpb24gPT0gQUFfUGFzc2luZ19DRkF1ZGl0ZWQgPwogICAgICAgICAgIGRpYWc6OmVycl9hcmNfdHlwZWNoZWNrX2NvbnZlcnRfaW5jb21wYXRpYmxlX3BvaW50ZXIgOgpAQCAtMTA2NDksOCArMTA3NzgsNiBAQAogICAgICAgU3JjVHlwZSA9IFNyY1R5cGUuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CiAgICAgICBEc3RUeXBlID0gRHN0VHlwZS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKICAgICB9Ci0gICAgZWxzZSBpZiAoSXNOU1N0cmluZyAmJiAhSGludC5pc051bGwoKSkKLSAgICAgIERpYWdLaW5kID0gZGlhZzo6d2Fybl9taXNzaW5nX2F0c2lnbl9wcmVmaXg7CiAgICAgTWF5SGF2ZUNvbnZGaXhpdCA9IHRydWU7CiAgICAgYnJlYWs7CiAgIGNhc2UgSW5jb21wYXRpYmxlUG9pbnRlclNpZ246CkBAIC0xMDc4NCw3ICsxMDkxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QVBTSW50ICpSZXN1bHQpIHsKICAgY2xhc3MgU2ltcGxlSUNFRGlhZ25vc2VyIDogcHVibGljIFZlcmlmeUlDRURpYWdub3NlciB7CiAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgZGlhZ25vc2VOb3RJQ0UoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBTUikgeworICAgIHZvaWQgZGlhZ25vc2VOb3RJQ0UoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBTUikgb3ZlcnJpZGUgewogICAgICAgUy5EaWFnKExvYywgZGlhZzo6ZXJyX2V4cHJfbm90X2ljZSkgPDwgUy5MYW5nT3B0cy5DUGx1c1BsdXMgPDwgU1I7CiAgICAgfQogICB9IERpYWdub3NlcjsKQEAgLTEwODAzLDcgKzEwOTMwLDcgQEAKICAgICBJRERpYWdub3Nlcih1bnNpZ25lZCBEaWFnSUQpCiAgICAgICA6IFZlcmlmeUlDRURpYWdub3NlcihEaWFnSUQgPT0gMCksIERpYWdJRChEaWFnSUQpIHsgfQogICAgIAotICAgIHZpcnR1YWwgdm9pZCBkaWFnbm9zZU5vdElDRShTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIFNSKSB7CisgICAgdm9pZCBkaWFnbm9zZU5vdElDRShTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIFNSKSBvdmVycmlkZSB7CiAgICAgICBTLkRpYWcoTG9jLCBEaWFnSUQpIDw8IFNSOwogICAgIH0KICAgfSBEaWFnbm9zZXIoRGlhZ0lEKTsKQEAgLTEwODM1LDQwICsxMDk2Miw0MCBAQAogICAgICAgICAgIDogSUNFQ29udmVydERpYWdub3NlcigvKkFsbG93U2NvcGVkRW51bWVyYXRpb25zKi9mYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lsZW50LCB0cnVlKSB7fQogCi0gICAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZU5vdEludChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUKSB7CisgICAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VOb3RJbnQoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQpIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIFMuRGlhZyhMb2MsIGRpYWc6OmVycl9pY2Vfbm90X2ludGVncmFsKSA8PCBUOwogICAgICAgfQogCi0gICAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUluY29tcGxldGUoCi0gICAgICAgICAgU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKSB7CisgICAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VJbmNvbXBsZXRlKAorICAgICAgICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gUy5EaWFnKExvYywgZGlhZzo6ZXJyX2ljZV9pbmNvbXBsZXRlX3R5cGUpIDw8IFQ7CiAgICAgICB9CiAKLSAgICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlRXhwbGljaXRDb252KAotICAgICAgICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCwgUXVhbFR5cGUgQ29udlR5KSB7CisgICAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VFeHBsaWNpdENvbnYoCisgICAgICAgICAgU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBULCBRdWFsVHlwZSBDb252VHkpIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIFMuRGlhZyhMb2MsIGRpYWc6OmVycl9pY2VfZXhwbGljaXRfY29udmVyc2lvbikgPDwgVCA8PCBDb252VHk7CiAgICAgICB9CiAKLSAgICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyIG5vdGVFeHBsaWNpdENvbnYoCi0gICAgICAgICAgU2VtYSAmUywgQ1hYQ29udmVyc2lvbkRlY2wgKkNvbnYsIFF1YWxUeXBlIENvbnZUeSkgeworICAgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIG5vdGVFeHBsaWNpdENvbnYoCisgICAgICAgICAgU2VtYSAmUywgQ1hYQ29udmVyc2lvbkRlY2wgKkNvbnYsIFF1YWxUeXBlIENvbnZUeSkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gUy5EaWFnKENvbnYtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfaWNlX2NvbnZlcnNpb25faGVyZSkKICAgICAgICAgICAgICAgICAgPDwgQ29udlR5LT5pc0VudW1lcmFsVHlwZSgpIDw8IENvbnZUeTsKICAgICAgIH0KIAotICAgICAgdmlydHVhbCBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VBbWJpZ3VvdXMoCi0gICAgICAgICAgU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKSB7CisgICAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VBbWJpZ3VvdXMoCisgICAgICAgICAgU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBTLkRpYWcoTG9jLCBkaWFnOjplcnJfaWNlX2FtYmlndW91c19jb252ZXJzaW9uKSA8PCBUOwogICAgICAgfQogCi0gICAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlciBub3RlQW1iaWd1b3VzKAotICAgICAgICAgIFNlbWEgJlMsIENYWENvbnZlcnNpb25EZWNsICpDb252LCBRdWFsVHlwZSBDb252VHkpIHsKKyAgICAgIFNlbWFEaWFnbm9zdGljQnVpbGRlciBub3RlQW1iaWd1b3VzKAorICAgICAgICAgIFNlbWEgJlMsIENYWENvbnZlcnNpb25EZWNsICpDb252LCBRdWFsVHlwZSBDb252VHkpIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIFMuRGlhZyhDb252LT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX2ljZV9jb252ZXJzaW9uX2hlcmUpCiAgICAgICAgICAgICAgICAgIDw8IENvbnZUeS0+aXNFbnVtZXJhbFR5cGUoKSA8PCBDb252VHk7CiAgICAgICB9CiAKLSAgICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlQ29udmVyc2lvbigKLSAgICAgICAgICBTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQsIFF1YWxUeXBlIENvbnZUeSkgeworICAgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlQ29udmVyc2lvbigKKyAgICAgICAgICBTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQsIFF1YWxUeXBlIENvbnZUeSkgb3ZlcnJpZGUgewogICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgcGVybWl0dGVkIik7CiAgICAgICB9CiAgICAgfSBDb252ZXJ0RGlhZ25vc2VyKERpYWdub3Nlci5TdXBwcmVzcyk7CkBAIC0xMTE3NCwzNyArMTEzMDEsMzQgQEAKIAogICAvLyBOb3RlIHRoYXQgdGhpcyBkZWNsYXJhdGlvbiBoYXMgYmVlbiB1c2VkLgogICBpZiAoQ1hYQ29uc3RydWN0b3JEZWNsICpDb25zdHJ1Y3RvciA9IGR5bl9jYXN0PENYWENvbnN0cnVjdG9yRGVjbD4oRnVuYykpIHsKKyAgICBDb25zdHJ1Y3RvciA9IGNhc3Q8Q1hYQ29uc3RydWN0b3JEZWNsPihDb25zdHJ1Y3Rvci0+Z2V0Rmlyc3REZWNsKCkpOwogICAgIGlmIChDb25zdHJ1Y3Rvci0+aXNEZWZhdWx0ZWQoKSAmJiAhQ29uc3RydWN0b3ItPmlzRGVsZXRlZCgpKSB7CiAgICAgICBpZiAoQ29uc3RydWN0b3ItPmlzRGVmYXVsdENvbnN0cnVjdG9yKCkpIHsKICAgICAgICAgaWYgKENvbnN0cnVjdG9yLT5pc1RyaXZpYWwoKSkKICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmICghQ29uc3RydWN0b3ItPmlzVXNlZChmYWxzZSkpCi0gICAgICAgICAgRGVmaW5lSW1wbGljaXREZWZhdWx0Q29uc3RydWN0b3IoTG9jLCBDb25zdHJ1Y3Rvcik7CisgICAgICAgIERlZmluZUltcGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yKExvYywgQ29uc3RydWN0b3IpOwogICAgICAgfSBlbHNlIGlmIChDb25zdHJ1Y3Rvci0+aXNDb3B5Q29uc3RydWN0b3IoKSkgewotICAgICAgICBpZiAoIUNvbnN0cnVjdG9yLT5pc1VzZWQoZmFsc2UpKQotICAgICAgICAgIERlZmluZUltcGxpY2l0Q29weUNvbnN0cnVjdG9yKExvYywgQ29uc3RydWN0b3IpOworICAgICAgICBEZWZpbmVJbXBsaWNpdENvcHlDb25zdHJ1Y3RvcihMb2MsIENvbnN0cnVjdG9yKTsKICAgICAgIH0gZWxzZSBpZiAoQ29uc3RydWN0b3ItPmlzTW92ZUNvbnN0cnVjdG9yKCkpIHsKLSAgICAgICAgaWYgKCFDb25zdHJ1Y3Rvci0+aXNVc2VkKGZhbHNlKSkKLSAgICAgICAgICBEZWZpbmVJbXBsaWNpdE1vdmVDb25zdHJ1Y3RvcihMb2MsIENvbnN0cnVjdG9yKTsKKyAgICAgICAgRGVmaW5lSW1wbGljaXRNb3ZlQ29uc3RydWN0b3IoTG9jLCBDb25zdHJ1Y3Rvcik7CiAgICAgICB9CiAgICAgfSBlbHNlIGlmIChDb25zdHJ1Y3Rvci0+Z2V0SW5oZXJpdGVkQ29uc3RydWN0b3IoKSkgewotICAgICAgaWYgKCFDb25zdHJ1Y3Rvci0+aXNVc2VkKGZhbHNlKSkKLSAgICAgICAgRGVmaW5lSW5oZXJpdGluZ0NvbnN0cnVjdG9yKExvYywgQ29uc3RydWN0b3IpOworICAgICAgRGVmaW5lSW5oZXJpdGluZ0NvbnN0cnVjdG9yKExvYywgQ29uc3RydWN0b3IpOwogICAgIH0KIAogICAgIE1hcmtWVGFibGVVc2VkKExvYywgQ29uc3RydWN0b3ItPmdldFBhcmVudCgpKTsKICAgfSBlbHNlIGlmIChDWFhEZXN0cnVjdG9yRGVjbCAqRGVzdHJ1Y3RvciA9CiAgICAgICAgICAgICAgICAgIGR5bl9jYXN0PENYWERlc3RydWN0b3JEZWNsPihGdW5jKSkgewotICAgIGlmIChEZXN0cnVjdG9yLT5pc0RlZmF1bHRlZCgpICYmICFEZXN0cnVjdG9yLT5pc0RlbGV0ZWQoKSAmJgotICAgICAgICAhRGVzdHJ1Y3Rvci0+aXNVc2VkKGZhbHNlKSkKKyAgICBEZXN0cnVjdG9yID0gY2FzdDxDWFhEZXN0cnVjdG9yRGVjbD4oRGVzdHJ1Y3Rvci0+Z2V0Rmlyc3REZWNsKCkpOworICAgIGlmIChEZXN0cnVjdG9yLT5pc0RlZmF1bHRlZCgpICYmICFEZXN0cnVjdG9yLT5pc0RlbGV0ZWQoKSkKICAgICAgIERlZmluZUltcGxpY2l0RGVzdHJ1Y3RvcihMb2MsIERlc3RydWN0b3IpOwogICAgIGlmIChEZXN0cnVjdG9yLT5pc1ZpcnR1YWwoKSkKICAgICAgIE1hcmtWVGFibGVVc2VkKExvYywgRGVzdHJ1Y3Rvci0+Z2V0UGFyZW50KCkpOwogICB9IGVsc2UgaWYgKENYWE1ldGhvZERlY2wgKk1ldGhvZERlY2wgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPihGdW5jKSkgewotICAgIGlmIChNZXRob2REZWNsLT5pc0RlZmF1bHRlZCgpICYmICFNZXRob2REZWNsLT5pc0RlbGV0ZWQoKSAmJgotICAgICAgICBNZXRob2REZWNsLT5pc092ZXJsb2FkZWRPcGVyYXRvcigpICYmCisgICAgaWYgKE1ldGhvZERlY2wtPmlzT3ZlcmxvYWRlZE9wZXJhdG9yKCkgJiYKICAgICAgICAgTWV0aG9kRGVjbC0+Z2V0T3ZlcmxvYWRlZE9wZXJhdG9yKCkgPT0gT09fRXF1YWwpIHsKLSAgICAgIGlmICghTWV0aG9kRGVjbC0+aXNVc2VkKGZhbHNlKSkgeworICAgICAgTWV0aG9kRGVjbCA9IGNhc3Q8Q1hYTWV0aG9kRGVjbD4oTWV0aG9kRGVjbC0+Z2V0Rmlyc3REZWNsKCkpOworICAgICAgaWYgKE1ldGhvZERlY2wtPmlzRGVmYXVsdGVkKCkgJiYgIU1ldGhvZERlY2wtPmlzRGVsZXRlZCgpKSB7CiAgICAgICAgIGlmIChNZXRob2REZWNsLT5pc0NvcHlBc3NpZ25tZW50T3BlcmF0b3IoKSkKICAgICAgICAgICBEZWZpbmVJbXBsaWNpdENvcHlBc3NpZ25tZW50KExvYywgTWV0aG9kRGVjbCk7CiAgICAgICAgIGVsc2UKQEAgLTExMjEyLDcgKzExMzM2LDggQEAKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGlzYTxDWFhDb252ZXJzaW9uRGVjbD4oTWV0aG9kRGVjbCkgJiYKICAgICAgICAgICAgICAgIE1ldGhvZERlY2wtPmdldFBhcmVudCgpLT5pc0xhbWJkYSgpKSB7Ci0gICAgICBDWFhDb252ZXJzaW9uRGVjbCAqQ29udmVyc2lvbiA9IGNhc3Q8Q1hYQ29udmVyc2lvbkRlY2w+KE1ldGhvZERlY2wpOworICAgICAgQ1hYQ29udmVyc2lvbkRlY2wgKkNvbnZlcnNpb24gPQorICAgICAgICAgIGNhc3Q8Q1hYQ29udmVyc2lvbkRlY2w+KE1ldGhvZERlY2wtPmdldEZpcnN0RGVjbCgpKTsKICAgICAgIGlmIChDb252ZXJzaW9uLT5pc0xhbWJkYVRvQmxvY2tQb2ludGVyQ29udmVyc2lvbigpKQogICAgICAgICBEZWZpbmVJbXBsaWNpdExhbWJkYVRvQmxvY2tQb2ludGVyQ29udmVyc2lvbihMb2MsIENvbnZlcnNpb24pOwogICAgICAgZWxzZQpAQCAtMTEyNzYsMTAgKzExNDAxLDkgQEAKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgLy8gV2FsayByZWRlZmluaXRpb25zLCBhcyBzb21lIG9mIHRoZW0gbWF5IGJlIGluc3RhbnRpYWJsZS4KLSAgICBmb3IgKEZ1bmN0aW9uRGVjbDo6cmVkZWNsX2l0ZXJhdG9yIGkoRnVuYy0+cmVkZWNsc19iZWdpbigpKSwKLSAgICAgICAgIGUoRnVuYy0+cmVkZWNsc19lbmQoKSk7IGkgIT0gZTsgKytpKSB7CisgICAgZm9yIChhdXRvIGkgOiBGdW5jLT5yZWRlY2xzKCkpIHsKICAgICAgIGlmICghaS0+aXNVc2VkKGZhbHNlKSAmJiBpLT5pc0ltcGxpY2l0bHlJbnN0YW50aWFibGUoKSkKLSAgICAgICAgTWFya0Z1bmN0aW9uUmVmZXJlbmNlZChMb2MsICppKTsKKyAgICAgICAgTWFya0Z1bmN0aW9uUmVmZXJlbmNlZChMb2MsIGkpOwogICAgIH0KICAgfQogCkBAIC0xMTc3OCw5ICsxMTkwMiwxOCBAQAogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChTLlJlcXVpcmVOb25BYnN0cmFjdFR5cGUoTG9jLCBDYXB0dXJlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6OmVycl9jYXB0dXJlX29mX2Fic3RyYWN0X3R5cGUpKQotICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGJ5LWNvcHkgY2FwdHVyZXMgYXJlIG9mIGEgY29tcGxldGUgYW5kIG5vbi1hYnN0cmFjdCB0eXBlLgorICAgIGlmIChCdWlsZEFuZERpYWdub3NlKSB7CisgICAgICBpZiAoIUNhcHR1cmVUeXBlLT5pc0RlcGVuZGVudFR5cGUoKSAmJgorICAgICAgICAgIFMuUmVxdWlyZUNvbXBsZXRlVHlwZShMb2MsIENhcHR1cmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfY2FwdHVyZV9vZl9pbmNvbXBsZXRlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhci0+Z2V0RGVjbE5hbWUoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKFMuUmVxdWlyZU5vbkFic3RyYWN0VHlwZShMb2MsIENhcHR1cmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfY2FwdHVyZV9vZl9hYnN0cmFjdF90eXBlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgfQogCiAgIC8vIENhcHR1cmUgdGhpcyB2YXJpYWJsZSBpbiB0aGUgbGFtYmRhLgpAQCAtMTIwNjksNDIgKzEyMjAyLDM5IEBACiAgICAgICAgICAiSW52YWxpZCBFeHByIGFyZ3VtZW50IHRvIERvTWFya1ZhckRlY2xSZWZlcmVuY2VkIik7CiAgIFZhci0+c2V0UmVmZXJlbmNlZCgpOwogCi0gIC8vIElmIHRoZSBjb250ZXh0IGlzIG5vdCBQb3RlbnRpYWxseUV2YWx1YXRlZCBhbmQgbm90IFVuZXZhbHVhdGVkIAotICAvLyAoaS5lIFBvdGVudGlhbGx5RXZhbHVhdGVkSWZVc2VkKSBkbyBub3QgYm90aGVyIHRvIGNvbnNpZGVyIHZhcmlhYmxlcyAKLSAgLy8gaW4gdGhpcyBjb250ZXh0IGZvciBvZHItdXNlIHVubGVzcyB3ZSBhcmUgd2l0aGluIGEgbGFtYmRhLiAgCi0gIC8vIElmIHdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgY29udGV4dCBpcyBwb3RlbnRpYWxseSBldmFsdWF0ZWQgb3Igbm90IAotICAvLyAoZm9yIGUuZy4sIGlmIHdlJ3JlIGluIGEgZ2VuZXJpYyBsYW1iZGEpLCB3ZSB3YW50IHRvIGFkZCBhIHBvdGVudGlhbCAKLSAgLy8gY2FwdHVyZSBhbmQgZXZlbnR1YWxseSBhbmFseXplIGZvciBvZHItdXNlLgotICAvLyBXZSBzaG91bGQgYWxzbyBiZSBhYmxlIHRvIGFuYWx5emUgY2VydGFpbiBjb25zdHJ1Y3RzIGluIGEgbm9uLWdlbmVyaWMgCi0gIC8vIGxhbWJkYSBzZXR0aW5nIGZvciBwb3RlbnRpYWwgb2RyLXVzZSBhbmQgY2FwdHVyZSB2aW9sYXRpb246Ci0gIC8vIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgZm9vKFQgdCkgewotICAvLyAgICBhdXRvIEwgPSBbXShpbnQgaSkgeyByZXR1cm4gdDsgfTsKLSAgLy8gfQotICAvLyAKKyAgLy8gSWYgdGhlIGNvbnRleHQgaXMgbm90IHBvdGVudGlhbGx5IGV2YWx1YXRlZCwgdGhpcyBpcyBub3QgYW4gb2RyLXVzZSBhbmQKKyAgLy8gZG9lcyBub3QgdHJpZ2dlciBpbnN0YW50aWF0aW9uLgogICBpZiAoIUlzUG90ZW50aWFsbHlFdmFsdWF0ZWRDb250ZXh0KFNlbWFSZWYpKSB7CisgICAgaWYgKFNlbWFSZWYuaXNVbmV2YWx1YXRlZENvbnRleHQoKSkKKyAgICAgIHJldHVybjsKIAotICAgIGlmIChTZW1hUmVmLmlzVW5ldmFsdWF0ZWRDb250ZXh0KCkpIHJldHVybjsKKyAgICAvLyBJZiB3ZSBkb24ndCB5ZXQga25vdyB3aGV0aGVyIHRoaXMgY29udGV4dCBpcyBnb2luZyB0byBlbmQgdXAgYmVpbmcgYW4KKyAgICAvLyBldmFsdWF0ZWQgY29udGV4dCwgYW5kIHdlJ3JlIHJlZmVyZW5jaW5nIGEgdmFyaWFibGUgZnJvbSBhbiBlbmNsb3NpbmcKKyAgICAvLyBzY29wZSwgYWRkIGEgcG90ZW50aWFsIGNhcHR1cmUuCisgICAgLy8KKyAgICAvLyBGSVhNRTogSXMgdGhpcyBuZWNlc3Nhcnk/IFRoZXNlIGNvbnRleHRzIGFyZSBvbmx5IHVzZWQgZm9yIGRlZmF1bHQKKyAgICAvLyBhcmd1bWVudHMsIHdoZXJlIGxvY2FsIHZhcmlhYmxlcyBjYW4ndCBiZSB1c2VkLgorICAgIGNvbnN0IGJvb2wgUmVmZXJzVG9FbmNsb3NpbmdTY29wZSA9CisgICAgICAgIChTZW1hUmVmLkN1ckNvbnRleHQgIT0gVmFyLT5nZXREZWNsQ29udGV4dCgpICYmCisgICAgICAgICBWYXItPmdldERlY2xDb250ZXh0KCktPmlzRnVuY3Rpb25Pck1ldGhvZCgpICYmCisgICAgICAgICBWYXItPmhhc0xvY2FsU3RvcmFnZSgpKTsKKyAgICBpZiAoIVJlZmVyc1RvRW5jbG9zaW5nU2NvcGUpCisgICAgICByZXR1cm47CiAKLSAgICBjb25zdCBib29sIHJlZmVyc1RvRW5jbG9zaW5nU2NvcGUgPQotICAgICAgKFNlbWFSZWYuQ3VyQ29udGV4dCAhPSBWYXItPmdldERlY2xDb250ZXh0KCkgJiYKLSAgICAgICAgICAgVmFyLT5nZXREZWNsQ29udGV4dCgpLT5pc0Z1bmN0aW9uT3JNZXRob2QoKSk7Ci0gICAgaWYgKCFyZWZlcnNUb0VuY2xvc2luZ1Njb3BlKSByZXR1cm47Ci0gICAgCiAgICAgaWYgKExhbWJkYVNjb3BlSW5mbyAqY29uc3QgTFNJID0gU2VtYVJlZi5nZXRDdXJMYW1iZGEoKSkgewogICAgICAgLy8gSWYgYSB2YXJpYWJsZSBjb3VsZCBwb3RlbnRpYWxseSBiZSBvZHItdXNlZCwgZGVmZXIgbWFya2luZyBpdCBzbwotICAgICAgLy8gdW50aWwgd2UgZmluaXNoIGFuYWx5emluZyB0aGUgZnVsbCBleHByZXNzaW9uIGZvciBhbnkgbHZhbHVlLXRvLXJ2YWx1ZSAKKyAgICAgIC8vIHVudGlsIHdlIGZpbmlzaCBhbmFseXppbmcgdGhlIGZ1bGwgZXhwcmVzc2lvbiBmb3IgYW55IGx2YWx1ZS10by1ydmFsdWUKICAgICAgIC8vIG9yIGRpc2NhcmRlZCB2YWx1ZSBjb252ZXJzaW9ucyB0aGF0IHdvdWxkIG9idmlhdGUgb2RyLXVzZS4KICAgICAgIC8vIEFkZCBpdCB0byB0aGUgbGlzdCBvZiBwb3RlbnRpYWwgY2FwdHVyZXMgdGhhdCB3aWxsIGJlIGFuYWx5emVkCiAgICAgICAvLyBsYXRlciAoQWN0T25GaW5pc2hGdWxsRXhwcikgZm9yIGV2ZW50dWFsIGNhcHR1cmUgYW5kIG9kci11c2UgbWFya2luZwogICAgICAgLy8gdW5sZXNzIHRoZSB2YXJpYWJsZSBpcyBhIHJlZmVyZW5jZSB0aGF0IHdhcyBpbml0aWFsaXplZCBieSBhIGNvbnN0YW50CiAgICAgICAvLyBleHByZXNzaW9uICh0aGlzIHdpbGwgbmV2ZXIgbmVlZCB0byBiZSBjYXB0dXJlZCBvciBvZHItdXNlZCkuCi0gICAgICBjb25zdCBib29sIElzQ29uc3RhbnRFeHByID0gSXNWYXJpYWJsZU5vbkRlcGVuZGVudEFuZEFDb25zdGFudEV4cHJlc3Npb24oCi0gICAgICAgICAgVmFyLCBTZW1hUmVmLkNvbnRleHQpOwogICAgICAgYXNzZXJ0KEUgJiYgIkNhcHR1cmUgdmFyaWFibGUgc2hvdWxkIGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4iKTsKLSAgICAgIGlmICghSXNDb25zdGFudEV4cHIgfHwgIVZhci0+Z2V0VHlwZSgpLT5pc1JlZmVyZW5jZVR5cGUoKSkKLSAgICAgICAgTFNJLT5hZGRQb3RlbnRpYWxDYXB0dXJlKEUtPklnbm9yZVBhcmVucygpKTsgICAgICAKLSAgICB9IAotICAgIHJldHVybjsgIAorICAgICAgaWYgKCFWYXItPmdldFR5cGUoKS0+aXNSZWZlcmVuY2VUeXBlKCkgfHwKKyAgICAgICAgICAhSXNWYXJpYWJsZU5vbkRlcGVuZGVudEFuZEFDb25zdGFudEV4cHJlc3Npb24oVmFyLCBTZW1hUmVmLkNvbnRleHQpKQorICAgICAgICBMU0ktPmFkZFBvdGVudGlhbENhcHR1cmUoRS0+SWdub3JlUGFyZW5zKCkpOworICAgIH0KKyAgICByZXR1cm47CiAgIH0KIAogICBWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqVmFyU3BlYyA9CkBAIC0xMjExMiwxMCArMTIyNDIsMTAgQEAKICAgYXNzZXJ0KCFpc2E8VmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsPihWYXIpICYmCiAgICAgICAgICAiQ2FuJ3QgaW5zdGFudGlhdGUgYSBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLiIpOwogCi0gIC8vIEltcGxpY2l0IGluc3RhbnRpYXRpb24gb2Ygc3RhdGljIGRhdGEgbWVtYmVycywgc3RhdGljIGRhdGEgbWVtYmVyCi0gIC8vIHRlbXBsYXRlcyBvZiBjbGFzcyB0ZW1wbGF0ZXMsIGFuZCB2YXJpYWJsZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMuCi0gIC8vIERlbGF5IGluc3RhbnRpYXRpb25zIG9mIHZhcmlhYmxlIHRlbXBsYXRlcywgZXhjZXB0IGZvciB0aG9zZQotICAvLyB0aGF0IGNvdWxkIGJlIHVzZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uLgorICAvLyBQZXJmb3JtIGltcGxpY2l0IGluc3RhbnRpYXRpb24gb2Ygc3RhdGljIGRhdGEgbWVtYmVycywgc3RhdGljIGRhdGEgbWVtYmVyCisgIC8vIHRlbXBsYXRlcyBvZiBjbGFzcyB0ZW1wbGF0ZXMsIGFuZCB2YXJpYWJsZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMuIERlbGF5CisgIC8vIGluc3RhbnRpYXRpb25zIG9mIHZhcmlhYmxlIHRlbXBsYXRlcywgZXhjZXB0IGZvciB0aG9zZSB0aGF0IGNvdWxkIGJlIHVzZWQKKyAgLy8gaW4gYSBjb25zdGFudCBleHByZXNzaW9uLgogICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCBUU0sgPSBWYXItPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCk7CiAgIGlmIChpc1RlbXBsYXRlSW5zdGFudGlhdGlvbihUU0spKSB7CiAgICAgYm9vbCBUcnlJbnN0YW50aWF0aW5nID0gVFNLID09IFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb247CkBAIC0xMjE1NSw2ICsxMjI4NSw3IEBACiAgICAgICB9CiAgICAgfQogICB9CisKICAgLy8gUGVyIEMrKzExIFtiYXNpYy5kZWYub2RyXSwgYSB2YXJpYWJsZSBpcyBvZHItdXNlZCAidW5sZXNzIGl0IHNhdGlzZmllcwogICAvLyB0aGUgcmVxdWlyZW1lbnRzIGZvciBhcHBlYXJpbmcgaW4gYSBjb25zdGFudCBleHByZXNzaW9uICg1LjE5KSBhbmQsIGlmCiAgIC8vIGl0IGlzIGFuIG9iamVjdCwgdGhlIGx2YWx1ZS10by1ydmFsdWUgY29udmVyc2lvbiAoNC4xKQpAQCAtMTIxNjQsMTQgKzEyMjk1LDExIEBACiAgIC8vIEMrKzAzIGRlcGVuZHMgb24gd2hldGhlciB3ZSBnZXQgdGhlIEMrKzAzIHZlcnNpb24gY29ycmVjdC4gVGhlIHNlY29uZAogICAvLyBwYXJ0IGRvZXMgbm90IGFwcGx5IHRvIHJlZmVyZW5jZXMsIHNpbmNlIHRoZXkgYXJlIG5vdCBvYmplY3RzLgogICBpZiAoRSAmJiBJc1ZhcmlhYmxlQUNvbnN0YW50RXhwcmVzc2lvbihWYXIsIFNlbWFSZWYuQ29udGV4dCkpIHsKLSAgICAvLyBBIHJlZmVyZW5jZSBpbml0aWFsaXplZCBieSBhIGNvbnN0YW50IGV4cHJlc3Npb24gY2FuIG5ldmVyIGJlIAorICAgIC8vIEEgcmVmZXJlbmNlIGluaXRpYWxpemVkIGJ5IGEgY29uc3RhbnQgZXhwcmVzc2lvbiBjYW4gbmV2ZXIgYmUKICAgICAvLyBvZHItdXNlZCwgc28gc2ltcGx5IGlnbm9yZSBpdC4KLSAgICAvLyBCdXQgYSBub24tcmVmZXJlbmNlIG1pZ2h0IGdldCBvZHItdXNlZCBpZiBpdCBkb2Vzbid0IHVuZGVyZ28KLSAgICAvLyBhbiBsdmFsdWUtdG8tcnZhbHVlIG9yIGlzIGRpc2NhcmRlZCwgc28gdHJhY2sgaXQuCiAgICAgaWYgKCFWYXItPmdldFR5cGUoKS0+aXNSZWZlcmVuY2VUeXBlKCkpCiAgICAgICBTZW1hUmVmLk1heWJlT0RSVXNlRXhwcnMuaW5zZXJ0KEUpOwotICB9Ci0gIGVsc2UKKyAgfSBlbHNlCiAgICAgTWFya1ZhckRlY2xPRFJVc2VkKFZhciwgTG9jLCBTZW1hUmVmLCAvKk1heEZ1bmN0aW9uU2NvcGVJbmRleCBwdHIqLzApOwogfQogCkBAIC0xMjQ0Nyw4ICsxMjU3NSw4IEBACiAgIHB1YmxpYzoKICAgICBDYWxsUmV0dXJuSW5jb21wbGV0ZURpYWdub3NlcihGdW5jdGlvbkRlY2wgKkZELCBDYWxsRXhwciAqQ0UpCiAgICAgICA6IEZEKEZEKSwgQ0UoQ0UpIHsgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBkaWFnbm9zZShTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIHsKKworICAgIHZvaWQgZGlhZ25vc2UoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKSBvdmVycmlkZSB7CiAgICAgICBpZiAoIUZEKSB7CiAgICAgICAgIFMuRGlhZyhMb2MsIGRpYWc6OmVycl9jYWxsX2luY29tcGxldGVfcmV0dXJuKQogICAgICAgICAgIDw8IFQgPDwgQ0UtPmdldFNvdXJjZVJhbmdlKCk7CkBAIC0xMjgyNSw3ICsxMjk1Myw3IEBACiAgICAgLy8gVGhpcyBpcyBhIGhhY2ssIGJ1dCBpdCBpcyBmYXIgc3VwZXJpb3IgdG8gbW92aW5nIHRoZQogICAgIC8vIGNvcnJlc3BvbmRpbmcgdGFyZ2V0LXNwZWNpZmljIGNvZGUgZnJvbSBJUi1nZW4gdG8gU2VtYS9BU1QuCiAKLSAgICBBcnJheVJlZjxRdWFsVHlwZT4gUGFyYW1UeXBlcyA9IFByb3RvLT5nZXRBcmdUeXBlcygpOworICAgIEFycmF5UmVmPFF1YWxUeXBlPiBQYXJhbVR5cGVzID0gUHJvdG8tPmdldFBhcmFtVHlwZXMoKTsKICAgICBTbWFsbFZlY3RvcjxRdWFsVHlwZSwgOD4gQXJnVHlwZXM7CiAgICAgaWYgKFBhcmFtVHlwZXMuZW1wdHkoKSAmJiBQcm90by0+aXNWYXJpYWRpYygpKSB7IC8vIHRoZSBzcGVjaWFsIGNhc2UKICAgICAgIEFyZ1R5cGVzLnJlc2VydmUoRS0+Z2V0TnVtQXJncygpKTsKQEAgLTEyODgyLDggKzEzMDEwLDggQEAKIAogICAvLyBSZXdyaXRlIHRoZSBtZXRob2QgcmVzdWx0IHR5cGUgaWYgYXZhaWxhYmxlLgogICBpZiAoT2JqQ01ldGhvZERlY2wgKk1ldGhvZCA9IEUtPmdldE1ldGhvZERlY2woKSkgewotICAgIGFzc2VydChNZXRob2QtPmdldFJlc3VsdFR5cGUoKSA9PSBTLkNvbnRleHQuVW5rbm93bkFueVR5KTsKLSAgICBNZXRob2QtPnNldFJlc3VsdFR5cGUoRGVzdFR5cGUpOworICAgIGFzc2VydChNZXRob2QtPmdldFJldHVyblR5cGUoKSA9PSBTLkNvbnRleHQuVW5rbm93bkFueVR5KTsKKyAgICBNZXRob2QtPnNldFJldHVyblR5cGUoRGVzdFR5cGUpOwogICB9CiAKICAgLy8gQ2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLgpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvU2VtYUV4cHJDWFguY3BwIGIvbGliL1NlbWEvU2VtYUV4cHJDWFguY3BwCmluZGV4IDA3ZTQ2NTcuLjhiOWMwZTIgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL1NlbWFFeHByQ1hYLmNwcAorKysgYi9saWIvU2VtYS9TZW1hRXhwckNYWC5jcHAKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgIFNlYXJjaFR5cGUgPSBHZXRUeXBlRnJvbVBhcnNlcihPYmplY3RUeXBlUHRyKTsKIAogICBpZiAoU1MuaXNTZXQoKSkgewotICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUyA9IChOZXN0ZWROYW1lU3BlY2lmaWVyICopU1MuZ2V0U2NvcGVSZXAoKTsKKyAgICBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMgPSBTUy5nZXRTY29wZVJlcCgpOwogCiAgICAgYm9vbCBBbHJlYWR5U2VhcmNoZWQgPSBmYWxzZTsKICAgICBib29sIExvb2tBdFByZWZpeCA9IHRydWU7CkBAIC0yMDksNyArMjA5LDggQEAKICAgICAgICAgICBDb250ZXh0Lmhhc1NhbWVVbnF1YWxpZmllZFR5cGUoVCwgU2VhcmNoVHlwZSkpIHsKICAgICAgICAgLy8gV2UgZm91bmQgb3VyIHR5cGUhCiAKLSAgICAgICAgcmV0dXJuIFBhcnNlZFR5cGU6Om1ha2UoVCk7CisgICAgICAgIHJldHVybiBDcmVhdGVQYXJzZWRUeXBlKFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuZ2V0VHJpdmlhbFR5cGVTb3VyY2VJbmZvKFQsIE5hbWVMb2MpKTsKICAgICAgIH0KIAogICAgICAgaWYgKCFTZWFyY2hUeXBlLmlzTnVsbCgpKQpAQCAtMjQ1LDcgKzI0Niw5IEBACiAgICAgICAgICAgICAgID0gZHluX2Nhc3Q8Q2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbD4oUmVjb3JkLT5nZXREZWNsKCkpKSB7CiAgICAgICAgICAgaWYgKFNwZWMtPmdldFNwZWNpYWxpemVkVGVtcGxhdGUoKS0+Z2V0Q2Fub25pY2FsRGVjbCgpID09CiAgICAgICAgICAgICAgICAgVGVtcGxhdGUtPmdldENhbm9uaWNhbERlY2woKSkKLSAgICAgICAgICAgIHJldHVybiBQYXJzZWRUeXBlOjptYWtlKE1lbWJlck9mVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUGFyc2VkVHlwZSgKKyAgICAgICAgICAgICAgICBNZW1iZXJPZlR5cGUsCisgICAgICAgICAgICAgICAgQ29udGV4dC5nZXRUcml2aWFsVHlwZVNvdXJjZUluZm8oTWVtYmVyT2ZUeXBlLCBOYW1lTG9jKSk7CiAgICAgICAgIH0KIAogICAgICAgICBjb250aW51ZTsKQEAgLTI2NCw3ICsyNjcsOSBAQAogICAgICAgICAvLyBzcGVjaWFsaXplZC4KICAgICAgICAgaWYgKFRlbXBsYXRlRGVjbCAqU3BlY1RlbXBsYXRlID0gU3BlY05hbWUuZ2V0QXNUZW1wbGF0ZURlY2woKSkgewogICAgICAgICAgIGlmIChTcGVjVGVtcGxhdGUtPmdldENhbm9uaWNhbERlY2woKSA9PSBUZW1wbGF0ZS0+Z2V0Q2Fub25pY2FsRGVjbCgpKQotICAgICAgICAgICAgcmV0dXJuIFBhcnNlZFR5cGU6Om1ha2UoTWVtYmVyT2ZUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVQYXJzZWRUeXBlKAorICAgICAgICAgICAgICAgIE1lbWJlck9mVHlwZSwKKyAgICAgICAgICAgICAgICBDb250ZXh0LmdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhNZW1iZXJPZlR5cGUsIE5hbWVMb2MpKTsKIAogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC0yNzUsNyArMjgwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU3BlY05hbWUuZ2V0QXNEZXBlbmRlbnRUZW1wbGF0ZU5hbWUoKSkgewogICAgICAgICAgIGlmIChEZXBUZW1wbGF0ZS0+aXNJZGVudGlmaWVyKCkgJiYKICAgICAgICAgICAgICAgRGVwVGVtcGxhdGUtPmdldElkZW50aWZpZXIoKSA9PSBUZW1wbGF0ZS0+Z2V0SWRlbnRpZmllcigpKQotICAgICAgICAgICAgcmV0dXJuIFBhcnNlZFR5cGU6Om1ha2UoTWVtYmVyT2ZUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBDcmVhdGVQYXJzZWRUeXBlKAorICAgICAgICAgICAgICAgIE1lbWJlck9mVHlwZSwKKyAgICAgICAgICAgICAgICBDb250ZXh0LmdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhNZW1iZXJPZlR5cGUsIE5hbWVMb2MpKTsKIAogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC0zMzMsNiArMzQwLDM0IEBACiAgICAgcmV0dXJuIFBhcnNlZFR5cGUoKTsKIH0KIAorYm9vbCBTZW1hOjpjaGVja0xpdGVyYWxPcGVyYXRvcklkKGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5xdWFsaWZpZWRJZCAmTmFtZSkgeworICBhc3NlcnQoTmFtZS5nZXRLaW5kKCkgPT0gVW5xdWFsaWZpZWRJZDo6SUtfTGl0ZXJhbE9wZXJhdG9ySWQpOworCisgIGlmICghU1MuaXNWYWxpZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBzd2l0Y2ggKFNTLmdldFNjb3BlUmVwKCktPmdldEtpbmQoKSkgeworICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6OklkZW50aWZpZXI6CisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6VHlwZVNwZWM6CisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6VHlwZVNwZWNXaXRoVGVtcGxhdGU6CisgICAgLy8gUGVyIEMrKzExIFtvdmVyLmxpdGVyYWxdcDIsIGxpdGVyYWwgb3BlcmF0b3JzIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGF0CisgICAgLy8gbmFtZXNwYWNlIHNjb3BlLiBUaGVyZWZvcmUsIHRoaXMgdW5xdWFsaWZpZWQtaWQgY2Fubm90IG5hbWUgYW55dGhpbmcuCisgICAgLy8gUmVqZWN0IGl0IGVhcmx5LCBiZWNhdXNlIHdlIGhhdmUgbm8gQVNUIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIGluIHRoZQorICAgIC8vIGNhc2Ugd2hlcmUgdGhlIHNjb3BlIGlzIGRlcGVuZGVudC4KKyAgICBEaWFnKE5hbWUuZ2V0TG9jU3RhcnQoKSwgZGlhZzo6ZXJyX2xpdGVyYWxfb3BlcmF0b3JfaWRfb3V0c2lkZV9uYW1lc3BhY2UpCisgICAgICA8PCBTUy5nZXRTY29wZVJlcCgpOworICAgIHJldHVybiB0cnVlOworCisgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6R2xvYmFsOgorICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6Ok5hbWVzcGFjZToKKyAgY2FzZSBOZXN0ZWROYW1lU3BlY2lmaWVyOjpOYW1lc3BhY2VBbGlhczoKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBsbHZtX3VucmVhY2hhYmxlKCJ1bmtub3duIG5lc3RlZCBuYW1lIHNwZWNpZmllciBraW5kIik7Cit9CisKIC8vLyBcYnJpZWYgQnVpbGQgYSBDKysgdHlwZWlkIGV4cHJlc3Npb24gd2l0aCBhIHR5cGUgb3BlcmFuZC4KIEV4cHJSZXN1bHQgU2VtYTo6QnVpbGRDWFhUeXBlSWQoUXVhbFR5cGUgVHlwZUluZm9UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBUeXBlaWRMb2MsCkBAIC00MjYsNyArNDYxLDcgQEAKICAgICBDWFhUeXBlSW5mb0RlY2wgPSBSLmdldEFzU2luZ2xlPFJlY29yZERlY2w+KCk7CiAgICAgLy8gTWljcm9zb2Z0J3MgdHlwZWluZm8gZG9lc24ndCBoYXZlIHR5cGVfaW5mbyBpbiBzdGQgYnV0IGluIHRoZSBnbG9iYWwKICAgICAvLyBuYW1lc3BhY2UgaWYgX0hBU19FWENFUFRJT05TIGlzIGRlZmluZWQgdG8gMC4gU2VlIFBSMTMxNTMuCi0gICAgaWYgKCFDWFhUeXBlSW5mb0RlY2wgJiYgTGFuZ09wdHMuTWljcm9zb2Z0TW9kZSkgeworICAgIGlmICghQ1hYVHlwZUluZm9EZWNsICYmIExhbmdPcHRzLk1TVkNDb21wYXQpIHsKICAgICAgIExvb2t1cFF1YWxpZmllZE5hbWUoUiwgQ29udGV4dC5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCkpOwogICAgICAgQ1hYVHlwZUluZm9EZWNsID0gUi5nZXRBc1NpbmdsZTxSZWNvcmREZWNsPigpOwogICAgIH0KQEAgLTExNTMsMTQgKzExODgsMTUgQEAKICAgZWxzZSBpZiAoSW5pdGlhbGl6ZXIgJiYgaXNhPEltcGxpY2l0VmFsdWVJbml0RXhwcj4oSW5pdGlhbGl6ZXIpKQogICAgIEhhdmVDb21wbGV0ZUluaXQgPSB0cnVlOwogCi0gIC8vIEMrKzExIFtkZWNsLnNwZWMuYXV0b11wNi4gRGVkdWNlIHRoZSB0eXBlIHdoaWNoICdhdXRvJyBzdGFuZHMgaW4gZm9yLgorICAvLyBDKysxMSBbZGNsLnNwZWMuYXV0b11wNi4gRGVkdWNlIHRoZSB0eXBlIHdoaWNoICdhdXRvJyBzdGFuZHMgaW4gZm9yLgogICBpZiAoVHlwZU1heUNvbnRhaW5BdXRvICYmIEFsbG9jVHlwZS0+aXNVbmRlZHVjZWRUeXBlKCkpIHsKICAgICBpZiAoaW5pdFN0eWxlID09IENYWE5ld0V4cHI6Ok5vSW5pdCB8fCBOdW1Jbml0cyA9PSAwKQogICAgICAgcmV0dXJuIEV4cHJFcnJvcihEaWFnKFN0YXJ0TG9jLCBkaWFnOjplcnJfYXV0b19uZXdfcmVxdWlyZXNfY3Rvcl9hcmcpCiAgICAgICAgICAgICAgICAgICAgICAgIDw8IEFsbG9jVHlwZSA8PCBUeXBlUmFuZ2UpOwotICAgIGlmIChpbml0U3R5bGUgPT0gQ1hYTmV3RXhwcjo6TGlzdEluaXQpCisgICAgaWYgKGluaXRTdHlsZSA9PSBDWFhOZXdFeHByOjpMaXN0SW5pdCB8fAorICAgICAgICAoTnVtSW5pdHMgPT0gMSAmJiBpc2E8SW5pdExpc3RFeHByPihJbml0c1swXSkpKQogICAgICAgcmV0dXJuIEV4cHJFcnJvcihEaWFnKEluaXRzWzBdLT5nZXRMb2NTdGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6OmVycl9hdXRvX25ld19yZXF1aXJlc19wYXJlbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX2F1dG9fbmV3X2xpc3RfaW5pdCkKICAgICAgICAgICAgICAgICAgICAgICAgPDwgQWxsb2NUeXBlIDw8IFR5cGVSYW5nZSk7CiAgICAgaWYgKE51bUluaXRzID4gMSkgewogICAgICAgRXhwciAqRmlyc3RCYWQgPSBJbml0c1sxXTsKQEAgLTEyMjUsOSArMTI2MSw4IEBACiAgIGlmIChBcnJheVNpemUgJiYgIUFycmF5U2l6ZS0+aXNUeXBlRGVwZW5kZW50KCkpIHsKICAgICBFeHByUmVzdWx0IENvbnZlcnRlZFNpemU7CiAgICAgaWYgKGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMXkpIHsKLSAgICAgIHVuc2lnbmVkIEludFdpZHRoID0gQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkuZ2V0SW50V2lkdGgoKTsKLSAgICAgIGFzc2VydChJbnRXaWR0aCAmJiAiQnVpbHRpbiB0eXBlIG9mIHNpemUgMD8iKTsKLSAgICAgIGxsdm06OkFQU0ludCBWYWx1ZShJbnRXaWR0aCk7CisgICAgICBhc3NlcnQoQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkuZ2V0SW50V2lkdGgoKSAmJiAiQnVpbHRpbiB0eXBlIG9mIHNpemUgMD8iKTsKKwogICAgICAgQ29udmVydGVkU2l6ZSA9IFBlcmZvcm1JbXBsaWNpdENvbnZlcnNpb24oQXJyYXlTaXplLCBDb250ZXh0LmdldFNpemVUeXBlKCksCiAJCQkJCQlBQV9Db252ZXJ0aW5nKTsKIApAQCAtMTI0NSw0MyArMTI4MCw0MyBAQAogICAgICAgICBTaXplQ29udmVydERpYWdub3NlcihFeHByICpBcnJheVNpemUpCiAgICAgICAgICAgICA6IElDRUNvbnZlcnREaWFnbm9zZXIoLypBbGxvd1Njb3BlZEVudW1lcmF0aW9ucyovZmFsc2UsIGZhbHNlLCBmYWxzZSksCiAgICAgICAgICAgICAgIEFycmF5U2l6ZShBcnJheVNpemUpIHt9Ci0gIAotICAgICAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZU5vdEludChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQpIHsKKworICAgICAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VOb3RJbnQoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCkgb3ZlcnJpZGUgewogICAgICAgICAgIHJldHVybiBTLkRpYWcoTG9jLCBkaWFnOjplcnJfYXJyYXlfc2l6ZV9ub3RfaW50ZWdyYWwpCiAgICAgICAgICAgICAgICAgICAgPDwgUy5nZXRMYW5nT3B0cygpLkNQbHVzUGx1czExIDw8IFQ7CiAgICAgICAgIH0KLSAgCi0gICAgICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlSW5jb21wbGV0ZSgKLSAgICAgICAgICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgeworCisgICAgICAgIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUluY29tcGxldGUoCisgICAgICAgICAgICBTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIG92ZXJyaWRlIHsKICAgICAgICAgICByZXR1cm4gUy5EaWFnKExvYywgZGlhZzo6ZXJyX2FycmF5X3NpemVfaW5jb21wbGV0ZV90eXBlKQogICAgICAgICAgICAgICAgICAgIDw8IFQgPDwgQXJyYXlTaXplLT5nZXRTb3VyY2VSYW5nZSgpOwogICAgICAgICB9Ci0gIAotICAgICAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUV4cGxpY2l0Q29udigKLSAgICAgICAgICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCwgUXVhbFR5cGUgQ29udlR5KSB7CisKKyAgICAgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlRXhwbGljaXRDb252KAorICAgICAgICAgICAgU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBULCBRdWFsVHlwZSBDb252VHkpIG92ZXJyaWRlIHsKICAgICAgICAgICByZXR1cm4gUy5EaWFnKExvYywgZGlhZzo6ZXJyX2FycmF5X3NpemVfZXhwbGljaXRfY29udmVyc2lvbikgPDwgVCA8PCBDb252VHk7CiAgICAgICAgIH0KLSAgCi0gICAgICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyIG5vdGVFeHBsaWNpdENvbnYoCi0gICAgICAgICAgICBTZW1hICZTLCBDWFhDb252ZXJzaW9uRGVjbCAqQ29udiwgUXVhbFR5cGUgQ29udlR5KSB7CisKKyAgICAgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIG5vdGVFeHBsaWNpdENvbnYoCisgICAgICAgICAgICBTZW1hICZTLCBDWFhDb252ZXJzaW9uRGVjbCAqQ29udiwgUXVhbFR5cGUgQ29udlR5KSBvdmVycmlkZSB7CiAgICAgICAgICAgcmV0dXJuIFMuRGlhZyhDb252LT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX2FycmF5X3NpemVfY29udmVyc2lvbikKICAgICAgICAgICAgICAgICAgICA8PCBDb252VHktPmlzRW51bWVyYWxUeXBlKCkgPDwgQ29udlR5OwogICAgICAgICB9Ci0gIAotICAgICAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUFtYmlndW91cygKLSAgICAgICAgICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgeworCisgICAgICAgIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUFtYmlndW91cygKKyAgICAgICAgICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgb3ZlcnJpZGUgewogICAgICAgICAgIHJldHVybiBTLkRpYWcoTG9jLCBkaWFnOjplcnJfYXJyYXlfc2l6ZV9hbWJpZ3VvdXNfY29udmVyc2lvbikgPDwgVDsKICAgICAgICAgfQotICAKLSAgICAgICAgdmlydHVhbCBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgbm90ZUFtYmlndW91cygKLSAgICAgICAgICAgIFNlbWEgJlMsIENYWENvbnZlcnNpb25EZWNsICpDb252LCBRdWFsVHlwZSBDb252VHkpIHsKKworICAgICAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgbm90ZUFtYmlndW91cygKKyAgICAgICAgICAgIFNlbWEgJlMsIENYWENvbnZlcnNpb25EZWNsICpDb252LCBRdWFsVHlwZSBDb252VHkpIG92ZXJyaWRlIHsKICAgICAgICAgICByZXR1cm4gUy5EaWFnKENvbnYtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfYXJyYXlfc2l6ZV9jb252ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgIDw8IENvbnZUeS0+aXNFbnVtZXJhbFR5cGUoKSA8PCBDb252VHk7CiAgICAgICAgIH0KIAogICAgICAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUNvbnZlcnNpb24oCi0gICAgICAgICAgICBTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQsIFF1YWxUeXBlIENvbnZUeSkgeworICAgICAgICAgICAgU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBULCBRdWFsVHlwZSBDb252VHkpIG92ZXJyaWRlIHsKICAgICAgICAgICByZXR1cm4gUy5EaWFnKExvYywKICAgICAgICAgICAgICAgICAgICAgICAgIFMuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMQogICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2FycmF5X3NpemVfY29udmVyc2lvbgpAQCAtMTYyMyw3ICsxNjU4LDcgQEAKICAgICAvLyBEaWRuJ3QgZmluZCBhIG1lbWJlciBvdmVybG9hZC4gTG9vayBmb3IgYSBnbG9iYWwgb25lLgogICAgIERlY2xhcmVHbG9iYWxOZXdEZWxldGUoKTsKICAgICBEZWNsQ29udGV4dCAqVFVEZWNsID0gQ29udGV4dC5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCk7Ci0gICAgYm9vbCBGYWxsYmFja0VuYWJsZWQgPSBJc0FycmF5ICYmIENvbnRleHQuZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRNb2RlOworICAgIGJvb2wgRmFsbGJhY2tFbmFibGVkID0gSXNBcnJheSAmJiBDb250ZXh0LmdldExhbmdPcHRzKCkuTVNWQ0NvbXBhdDsKICAgICBpZiAoRmluZEFsbG9jYXRpb25PdmVybG9hZChTdGFydExvYywgUmFuZ2UsIE5ld05hbWUsIEFsbG9jQXJncywgVFVEZWNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQWxsb3dNaXNzaW5nPSovRmFsbGJhY2tFbmFibGVkLCBPcGVyYXRvck5ldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkRpYWdub3NlPSovIUZhbGxiYWNrRW5hYmxlZCkpIHsKQEAgLTE3MDgsOCArMTc0Myw4IEBACiAKICAgICAgIFNtYWxsVmVjdG9yPFF1YWxUeXBlLCA0PiBBcmdUeXBlczsKICAgICAgIEFyZ1R5cGVzLnB1c2hfYmFjayhDb250ZXh0LlZvaWRQdHJUeSk7Ci0gICAgICBmb3IgKHVuc2lnbmVkIEkgPSAxLCBOID0gUHJvdG8tPmdldE51bUFyZ3MoKTsgSSA8IE47ICsrSSkKLSAgICAgICAgQXJnVHlwZXMucHVzaF9iYWNrKFByb3RvLT5nZXRBcmdUeXBlKEkpKTsKKyAgICAgIGZvciAodW5zaWduZWQgSSA9IDEsIE4gPSBQcm90by0+Z2V0TnVtUGFyYW1zKCk7IEkgPCBOOyArK0kpCisgICAgICAgIEFyZ1R5cGVzLnB1c2hfYmFjayhQcm90by0+Z2V0UGFyYW1UeXBlKEkpKTsKIAogICAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBFUEk7CiAgICAgICBFUEkuVmFyaWFkaWMgPSBQcm90by0+aXNWYXJpYWRpYygpOwpAQCAtMTc2Myw3ICsxNzk4LDcgQEAKICAgICAgIGVsc2UKICAgICAgICAgTWF0Y2hlcy5lcmFzZShNYXRjaGVzLmJlZ2luKCkgKyAxKTsKICAgICAgIGFzc2VydChNYXRjaGVzWzBdLnNlY29uZC0+Z2V0TnVtUGFyYW1zKCkgPT0gMiAmJgotICAgICAgICAgICAgICJmb3VuZCBhbiB1bmV4cGVjdGVkIHV1c2FsIGRlYWxsb2NhdGlvbiBmdW5jdGlvbiIpOworICAgICAgICAgICAgICJmb3VuZCBhbiB1bmV4cGVjdGVkIHVzdWFsIGRlYWxsb2NhdGlvbiBmdW5jdGlvbiIpOwogICAgIH0KICAgfQogCkBAIC0yMDMxLDggKzIwNjYsNyBAQAogICAgICAgICBpZiAoSW5pdGlhbFBhcmFtMVR5cGUgPT0gUGFyYW0xICYmCiAgICAgICAgICAgICAoTnVtUGFyYW1zID09IDEgfHwgSW5pdGlhbFBhcmFtMlR5cGUgPT0gUGFyYW0yKSkgewogICAgICAgICAgIGlmIChBZGRNYWxsb2NBdHRyICYmICFGdW5jLT5oYXNBdHRyPE1hbGxvY0F0dHI+KCkpCi0gICAgICAgICAgICBGdW5jLT5hZGRBdHRyKDo6bmV3IChDb250ZXh0KSBNYWxsb2NBdHRyKFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQpKTsKKyAgICAgICAgICAgIEZ1bmMtPmFkZEF0dHIoTWFsbG9jQXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCkpOwogICAgICAgICAgIC8vIE1ha2UgdGhlIGZ1bmN0aW9uIHZpc2libGUgdG8gbmFtZSBsb29rdXAsIGV2ZW4gaWYgd2UgZm91bmQgaXQgaW4KICAgICAgICAgICAvLyBhbiB1bmltcG9ydGVkIG1vZHVsZS4gSXQgZWl0aGVyIGlzIGFuIGltcGxpY2l0bHktZGVjbGFyZWQgZ2xvYmFsCiAgICAgICAgICAgLy8gYWxsb2NhdGlvbiBmdW5jdGlvbiwgb3IgaXMgc3VwcHJlc3NpbmcgdGhhdCBmdW5jdGlvbi4KQEAgLTIwNDMsMTggKzIwNzcsMTYgQEAKICAgICB9CiAgIH0KIAorICBGdW5jdGlvblByb3RvVHlwZTo6RXh0UHJvdG9JbmZvIEVQSTsKKwogICBRdWFsVHlwZSBCYWRBbGxvY1R5cGU7CiAgIGJvb2wgSGFzQmFkQWxsb2NFeGNlcHRpb25TcGVjCiAgICAgPSAoTmFtZS5nZXRDWFhPdmVybG9hZGVkT3BlcmF0b3IoKSA9PSBPT19OZXcgfHwKICAgICAgICBOYW1lLmdldENYWE92ZXJsb2FkZWRPcGVyYXRvcigpID09IE9PX0FycmF5X05ldyk7Ci0gIGlmIChIYXNCYWRBbGxvY0V4Y2VwdGlvblNwZWMgJiYgIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEpIHsKLSAgICBhc3NlcnQoU3RkQmFkQWxsb2MgJiYgIk11c3QgaGF2ZSBzdGQ6OmJhZF9hbGxvYyBkZWNsYXJlZCIpOwotICAgIEJhZEFsbG9jVHlwZSA9IENvbnRleHQuZ2V0VHlwZURlY2xUeXBlKGdldFN0ZEJhZEFsbG9jKCkpOwotICB9Ci0KLSAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBFUEk7CiAgIGlmIChIYXNCYWRBbGxvY0V4Y2VwdGlvblNwZWMpIHsKICAgICBpZiAoIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEpIHsKKyAgICAgIEJhZEFsbG9jVHlwZSA9IENvbnRleHQuZ2V0VHlwZURlY2xUeXBlKGdldFN0ZEJhZEFsbG9jKCkpOworICAgICAgYXNzZXJ0KFN0ZEJhZEFsbG9jICYmICJNdXN0IGhhdmUgc3RkOjpiYWRfYWxsb2MgZGVjbGFyZWQiKTsKICAgICAgIEVQSS5FeGNlcHRpb25TcGVjVHlwZSA9IEVTVF9EeW5hbWljOwogICAgICAgRVBJLk51bUV4Y2VwdGlvbnMgPSAxOwogICAgICAgRVBJLkV4Y2VwdGlvbnMgPSAmQmFkQWxsb2NUeXBlOwpAQCAtMjA3NSwxNCArMjEwNywxNiBAQAogICBBbGxvYy0+c2V0SW1wbGljaXQoKTsKIAogICBpZiAoQWRkTWFsbG9jQXR0cikKLSAgICBBbGxvYy0+YWRkQXR0cig6Om5ldyAoQ29udGV4dCkgTWFsbG9jQXR0cihTb3VyY2VMb2NhdGlvbigpLCBDb250ZXh0KSk7CisgICAgQWxsb2MtPmFkZEF0dHIoTWFsbG9jQXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCkpOwogCiAgIFBhcm1WYXJEZWNsICpQYXJhbURlY2xzWzJdOwotICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bVBhcmFtczsgKytJKQorICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bVBhcmFtczsgKytJKSB7CiAgICAgUGFyYW1EZWNsc1tJXSA9IFBhcm1WYXJEZWNsOjpDcmVhdGUoQ29udGV4dCwgQWxsb2MsIFNvdXJjZUxvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXNbSV0sIC8qVEluZm89Ki8wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDX05vbmUsIDApOworICAgIFBhcmFtRGVjbHNbSV0tPnNldEltcGxpY2l0KCk7CisgIH0KICAgQWxsb2MtPnNldFBhcmFtcyhBcnJheVJlZjxQYXJtVmFyRGVjbCo+KFBhcmFtRGVjbHMsIE51bVBhcmFtcykpOwogCiAgIC8vIEZJWE1FOiBBbHNvIGFkZCB0aGlzIGRlY2xhcmF0aW9uIHRvIHRoZSBJZGVudGlmaWVyUmVzb2x2ZXIsIGJ1dApAQCAtMjEyNSw3ICsyMTU5LDcgQEAKICAgICBlbHNlCiAgICAgICBNYXRjaGVzLmVyYXNlKE1hdGNoZXMuYmVnaW4oKSArIDEpOwogICAgIGFzc2VydChNYXRjaGVzWzBdLT5nZXROdW1QYXJhbXMoKSA9PSBOdW1BcmdzICYmCi0gICAgICAgICAgICJmb3VuZCBhbiB1bmV4cGVjdGVkIHV1c2FsIGRlYWxsb2NhdGlvbiBmdW5jdGlvbiIpOworICAgICAgICAgICAiZm91bmQgYW4gdW5leHBlY3RlZCB1c3VhbCBkZWFsbG9jYXRpb24gZnVuY3Rpb24iKTsKICAgfQogCiAgIGFzc2VydChNYXRjaGVzLnNpemUoKSA9PSAxICYmCkBAIC0yMjQxLDcgKzIyNzUsNyBAQAogICAgIHB1YmxpYzoKICAgICAgIERlbGV0ZUNvbnZlcnRlcigpIDogQ29udGV4dHVhbEltcGxpY2l0Q29udmVydGVyKGZhbHNlLCB0cnVlKSB7fQogCi0gICAgICBib29sIG1hdGNoKFF1YWxUeXBlIENvbnZUeXBlKSB7CisgICAgICBib29sIG1hdGNoKFF1YWxUeXBlIENvbnZUeXBlKSBvdmVycmlkZSB7CiAgICAgICAgIC8vIEZJWE1FOiBJZiB3ZSBoYXZlIGFuIG9wZXJhdG9yIFQqIGFuZCBhbiBvcGVyYXRvciB2b2lkKiwgd2UgbXVzdCBwaWNrCiAgICAgICAgIC8vIHRoZSBvcGVyYXRvciBUKi4KICAgICAgICAgaWYgKGNvbnN0IFBvaW50ZXJUeXBlICpDb252UHRyVHlwZSA9IENvbnZUeXBlLT5nZXRBczxQb2ludGVyVHlwZT4oKSkKQEAgLTIyNTEsMzkgKzIyODUsNDEgQEAKICAgICAgIH0KIAogICAgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlTm9NYXRjaChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gUy5EaWFnKExvYywgZGlhZzo6ZXJyX2RlbGV0ZV9vcGVyYW5kKSA8PCBUOwogICAgICAgfQogCiAgICAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VJbmNvbXBsZXRlKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBTLkRpYWcoTG9jLCBkaWFnOjplcnJfZGVsZXRlX2luY29tcGxldGVfY2xhc3NfdHlwZSkgPDwgVDsKICAgICAgIH0KIAogICAgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlRXhwbGljaXRDb252KFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBRdWFsVHlwZSBDb252VHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIENvbnZUeSkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gUy5EaWFnKExvYywgZGlhZzo6ZXJyX2RlbGV0ZV9leHBsaWNpdF9jb252ZXJzaW9uKSA8PCBUIDw8IENvbnZUeTsKICAgICAgIH0KIAogICAgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIG5vdGVFeHBsaWNpdENvbnYoU2VtYSAmUywgQ1hYQ29udmVyc2lvbkRlY2wgKkNvbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBDb252VHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIENvbnZUeSkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gUy5EaWFnKENvbnYtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfZGVsZXRlX2NvbnZlcnNpb24pCiAgICAgICAgICAgPDwgQ29udlR5OwogICAgICAgfQogCiAgICAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VBbWJpZ3VvdXMoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBTLkRpYWcoTG9jLCBkaWFnOjplcnJfYW1iaWd1b3VzX2RlbGV0ZV9vcGVyYW5kKSA8PCBUOwogICAgICAgfQogCiAgICAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgbm90ZUFtYmlndW91cyhTZW1hICZTLCBDWFhDb252ZXJzaW9uRGVjbCAqQ29udiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIENvbnZUeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgQ29udlR5KSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBTLkRpYWcoQ29udi0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9kZWxldGVfY29udmVyc2lvbikKICAgICAgICAgICA8PCBDb252VHk7CiAgICAgICB9CiAKICAgICAgIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUNvbnZlcnNpb24oU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBULCBRdWFsVHlwZSBDb252VHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgQ29udlR5KSBvdmVycmlkZSB7CiAgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoImNvbnZlcnNpb24gZnVuY3Rpb25zIGFyZSBwZXJtaXR0ZWQiKTsKICAgICAgIH0KICAgICB9IENvbnZlcnRlcjsKQEAgLTMwMzIsOSArMzA2OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDS19Ob09wLCBWSywgLypCYXNlUGF0aD0qLzAsIENDSykudGFrZSgpOwogCiAgICAgaWYgKFNDUy5EZXByZWNhdGVkU3RyaW5nTGl0ZXJhbFRvQ2hhclB0ciAmJgotICAgICAgICAhZ2V0TGFuZ09wdHMoKS5Xcml0YWJsZVN0cmluZ3MpCi0gICAgICBEaWFnKEZyb20tPmdldExvY1N0YXJ0KCksIGRpYWc6Ondhcm5fZGVwcmVjYXRlZF9zdHJpbmdfbGl0ZXJhbF9jb252ZXJzaW9uKQorICAgICAgICAhZ2V0TGFuZ09wdHMoKS5Xcml0YWJsZVN0cmluZ3MpIHsKKyAgICAgIERpYWcoRnJvbS0+Z2V0TG9jU3RhcnQoKSwgZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMQorICAgICAgICAgICA/IGRpYWc6OmV4dF9kZXByZWNhdGVkX3N0cmluZ19saXRlcmFsX2NvbnZlcnNpb24KKyAgICAgICAgICAgOiBkaWFnOjp3YXJuX2RlcHJlY2F0ZWRfc3RyaW5nX2xpdGVyYWxfY29udmVyc2lvbikKICAgICAgICAgPDwgVG9UeXBlLmdldE5vblJlZmVyZW5jZVR5cGUoKTsKKyAgICB9CiAKICAgICBicmVhazsKICAgfQpAQCAtMzA1NSwyNiArMzA5NCwxMyBAQAogICByZXR1cm4gT3duZWQoRnJvbSk7CiB9CiAKLUV4cHJSZXN1bHQgU2VtYTo6QWN0T25VbmFyeVR5cGVUcmFpdChVbmFyeVR5cGVUcmFpdCBVVFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gS1dMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBUeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW4pIHsKLSAgVHlwZVNvdXJjZUluZm8gKlRTSW5mbzsKLSAgUXVhbFR5cGUgVCA9IEdldFR5cGVGcm9tUGFyc2VyKFR5LCAmVFNJbmZvKTsKLQotICBpZiAoIVRTSW5mbykKLSAgICBUU0luZm8gPSBDb250ZXh0LmdldFRyaXZpYWxUeXBlU291cmNlSW5mbyhUKTsKLSAgcmV0dXJuIEJ1aWxkVW5hcnlUeXBlVHJhaXQoVVRULCBLV0xvYywgVFNJbmZvLCBSUGFyZW4pOwotfQotCiAvLy8gXGJyaWVmIENoZWNrIHRoZSBjb21wbGV0ZW5lc3Mgb2YgYSB0eXBlIGluIGEgdW5hcnkgdHlwZSB0cmFpdC4KIC8vLwogLy8vIElmIHRoZSBwYXJ0aWN1bGFyIHR5cGUgdHJhaXQgcmVxdWlyZXMgYSBjb21wbGV0ZSB0eXBlLCB0cmllcyB0byBjb21wbGV0ZQogLy8vIGl0LiBJZiBjb21wbGV0aW5nIHRoZSB0eXBlIGZhaWxzLCBhIGRpYWdub3N0aWMgaXMgZW1pdHRlZCBhbmQgZmFsc2UKIC8vLyByZXR1cm5lZC4gSWYgY29tcGxldGluZyB0aGUgdHlwZSBzdWNjZWVkcyBvciBubyBjb21wbGV0aW9uIHdhcyByZXF1aXJlZCwKIC8vLyByZXR1cm5zIHRydWUuCi1zdGF0aWMgYm9vbCBDaGVja1VuYXJ5VHlwZVRyYWl0VHlwZUNvbXBsZXRlbmVzcyhTZW1hICZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlUeXBlVHJhaXQgVVRULAorc3RhdGljIGJvb2wgQ2hlY2tVbmFyeVR5cGVUcmFpdFR5cGVDb21wbGV0ZW5lc3MoU2VtYSAmUywgVHlwZVRyYWl0IFVUVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIEFyZ1R5KSB7CiAgIC8vIEMrKzB4IFttZXRhLnVuYXJ5LnByb3BdcDM6CkBAIC0zMDg3LDYgKzMxMTMsNyBAQAogICAvLyB0aGVzZSBjbGFzcyB0ZW1wbGF0ZXMuIFdlIGFsc28gdHJ5IHRvIGZvbGxvdyBhbnkgR0NDIGRvY3VtZW50ZWQgYmVoYXZpb3IKICAgLy8gaW4gdGhlc2UgZXhwcmVzc2lvbnMgdG8gZW5zdXJlIHBvcnRhYmlsaXR5IG9mIHN0YW5kYXJkIGxpYnJhcmllcy4KICAgc3dpdGNoIChVVFQpIHsKKyAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgibm90IGEgVVRUIik7CiAgICAgLy8gaXNfY29tcGxldGVfdHlwZSBzb21ld2hhdCBvYnZpb3VzbHkgY2Fubm90IHJlcXVpcmUgYSBjb21wbGV0ZSB0eXBlLgogICBjYXNlIFVUVF9Jc0NvbXBsZXRlVHlwZToKICAgICAvLyBGYWxsLXRocm91Z2gKQEAgLTMxMzksNiArMzE2Niw4IEBACiAgIGNhc2UgVVRUX0lzUG9seW1vcnBoaWM6CiAgIGNhc2UgVVRUX0lzQWJzdHJhY3Q6CiAgIGNhc2UgVVRUX0lzSW50ZXJmYWNlQ2xhc3M6CisgIGNhc2UgVVRUX0lzRGVzdHJ1Y3RpYmxlOgorICBjYXNlIFVUVF9Jc05vdGhyb3dEZXN0cnVjdGlibGU6CiAgICAgLy8gRmFsbC10aHJvdWdoCiAKICAgLy8gVGhlc2UgdHJhaXRzIHJlcXVpcmUgYSBjb21wbGV0ZSB0eXBlLgpAQCAtMzE3Myw3ICszMjAyLDYgQEAKICAgICByZXR1cm4gIVMuUmVxdWlyZUNvbXBsZXRlVHlwZSgKICAgICAgIExvYywgRWxUeSwgZGlhZzo6ZXJyX2luY29tcGxldGVfdHlwZV91c2VkX2luX3R5cGVfdHJhaXRfZXhwcik7CiAgIH0KLSAgbGx2bV91bnJlYWNoYWJsZSgiVHlwZSB0cmFpdCBub3QgaGFuZGxlZCBieSBzd2l0Y2giKTsKIH0KIAogc3RhdGljIGJvb2wgSGFzTm9UaHJvd09wZXJhdG9yKGNvbnN0IFJlY29yZFR5cGUgKlJULCBPdmVybG9hZGVkT3BlcmF0b3JLaW5kIE9wLApAQCAtMzIwMyw3ICszMjMxLDcgQEAKICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkNQVCA9CiAgICAgICAgICAgT3BlcmF0b3ItPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CiAgICAgICAgIENQVCA9IFNlbGYuUmVzb2x2ZUV4Y2VwdGlvblNwZWMoS2V5TG9jLCBDUFQpOwotICAgICAgICBpZiAoIUNQVCB8fCAhQ1BULT5pc05vdGhyb3coU2VsZi5Db250ZXh0KSkKKyAgICAgICAgaWYgKCFDUFQgfHwgIUNQVC0+aXNOb3Rocm93KEMpKQogICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KICAgICB9CkBAIC0zMjEyLDEyICszMjQwLDEzIEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGJvb2wgRXZhbHVhdGVVbmFyeVR5cGVUcmFpdChTZW1hICZTZWxmLCBVbmFyeVR5cGVUcmFpdCBVVFQsCitzdGF0aWMgYm9vbCBFdmFsdWF0ZVVuYXJ5VHlwZVRyYWl0KFNlbWEgJlNlbGYsIFR5cGVUcmFpdCBVVFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEtleUxvYywgUXVhbFR5cGUgVCkgewogICBhc3NlcnQoIVQtPmlzRGVwZW5kZW50VHlwZSgpICYmICJDYW5ub3QgZXZhbHVhdGUgdHJhaXRzIG9mIGRlcGVuZGVudCB0eXBlIik7CiAKICAgQVNUQ29udGV4dCAmQyA9IFNlbGYuQ29udGV4dDsKICAgc3dpdGNoKFVUVCkgeworICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJub3QgYSBVVFQiKTsKICAgICAvLyBUeXBlIHRyYWl0IGV4cHJlc3Npb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByaW1hcnkgdHlwZSBjYXRlZ29yeQogICAgIC8vIHByZWRpY2F0ZXMgaW4gQysrMHggW21ldGEudW5hcnkuY2F0XS4KICAgY2FzZSBVVFRfSXNWb2lkOgpAQCAtMzQwNCw4ICszNDMzLDEyIEBACiAgICAgICByZXR1cm4gUkQtPmhhc1RyaXZpYWxDb3B5QXNzaWdubWVudCgpICYmCiAgICAgICAgICAgICAgIVJELT5oYXNOb25Ucml2aWFsQ29weUFzc2lnbm1lbnQoKTsKICAgICByZXR1cm4gZmFsc2U7CisgIGNhc2UgVVRUX0lzRGVzdHJ1Y3RpYmxlOgorICBjYXNlIFVUVF9Jc05vdGhyb3dEZXN0cnVjdGlibGU6CisgICAgLy8gRklYTUU6IEltcGxlbWVudCBVVFRfSXNEZXN0cnVjdGlibGUgYW5kIFVUVF9Jc05vdGhyb3dEZXN0cnVjdGlibGUuCisgICAgLy8gRm9yIG5vdywgbGV0J3MgZmFsbCB0aHJvdWdoLgogICBjYXNlIFVUVF9IYXNUcml2aWFsRGVzdHJ1Y3RvcjoKLSAgICAvLyBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvVHlwZS1UcmFpdHMuaHRtbDoKKyAgICAvLyBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvVHlwZS1UcmFpdHMuaHRtbAogICAgIC8vICAgSWYgX19pc19wb2QgKHR5cGUpIGlzIHRydWUgb3IgdHlwZSBpcyBhIHJlZmVyZW5jZSB0eXBlCiAgICAgLy8gICB0aGVuIHRoZSB0cmFpdCBpcyB0cnVlLCBlbHNlIGlmIHR5cGUgaXMgYSBjdiBjbGFzcyBvciB1bmlvbgogICAgIC8vICAgdHlwZSAob3IgYXJyYXkgdGhlcmVvZikgd2l0aCBhIHRyaXZpYWwgZGVzdHJ1Y3RvcgpAQCAtMzQ4OCw5ICszNTIxLDkgQEAKICAgICAgICAgICBDUFQgPSBTZWxmLlJlc29sdmVFeGNlcHRpb25TcGVjKEtleUxvYywgQ1BUKTsKICAgICAgICAgICBpZiAoIUNQVCkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAvLyBGSVhNRTogY2hlY2sgd2hldGhlciBldmFsdWF0aW5nIGRlZmF1bHQgYXJndW1lbnRzIGNhbiB0aHJvdy4KKyAgICAgICAgICAvLyBUT0RPOiBjaGVjayB3aGV0aGVyIGV2YWx1YXRpbmcgZGVmYXVsdCBhcmd1bWVudHMgY2FuIHRocm93LgogICAgICAgICAgIC8vIEZvciBub3csIHdlJ2xsIGJlIGNvbnNlcnZhdGl2ZSBhbmQgYXNzdW1lIHRoYXQgdGhleSBjYW4gdGhyb3cuCi0gICAgICAgICAgaWYgKCFDUFQtPmlzTm90aHJvdyhTZWxmLkNvbnRleHQpIHx8IENQVC0+Z2V0TnVtQXJncygpID4gMSkKKyAgICAgICAgICBpZiAoIUNQVC0+aXNOb3Rocm93KFNlbGYuQ29udGV4dCkgfHwgQ1BULT5nZXROdW1QYXJhbXMoKSA+IDEpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTM0OTksNyArMzUzMiw3IEBACiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgY2FzZSBVVFRfSGFzTm90aHJvd0NvbnN0cnVjdG9yOgotICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy9UeXBlLVRyYWl0cy5odG1sOgorICAgIC8vIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy9UeXBlLVRyYWl0cy5odG1sCiAgICAgLy8gICBJZiBfX2hhc190cml2aWFsX2NvbnN0cnVjdG9yICh0eXBlKSBpcyB0cnVlIHRoZW4gdGhlIHRyYWl0IGlzCiAgICAgLy8gICB0cnVlLCBlbHNlIGlmIHR5cGUgaXMgYSBjdiBjbGFzcyBvciB1bmlvbiB0eXBlIChvciBhcnJheQogICAgIC8vICAgdGhlcmVvZikgd2l0aCBhIGRlZmF1bHQgY29uc3RydWN0b3IgdGhhdCBpcyBrbm93biBub3QgdG8KQEAgLTM1MTEsNiArMzU0NCw3IEBACiAgICAgICAgICAgIVJELT5oYXNOb25Ucml2aWFsRGVmYXVsdENvbnN0cnVjdG9yKCkpCiAgICAgICAgIHJldHVybiB0cnVlOwogCisgICAgICBib29sIEZvdW5kQ29uc3RydWN0b3IgPSBmYWxzZTsKICAgICAgIERlY2xDb250ZXh0Ojpsb29rdXBfY29uc3RfcmVzdWx0IFIgPSBTZWxmLkxvb2t1cENvbnN0cnVjdG9ycyhSRCk7CiAgICAgICBmb3IgKERlY2xDb250ZXh0Ojpsb29rdXBfY29uc3RfaXRlcmF0b3IgQ29uID0gUi5iZWdpbigpLAogICAgICAgICAgICBDb25FbmQgPSBSLmVuZCgpOyBDb24gIT0gQ29uRW5kOyArK0NvbikgewpAQCAtMzUxOSwxNiArMzU1MywxOSBAQAogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBDWFhDb25zdHJ1Y3RvckRlY2wgKkNvbnN0cnVjdG9yID0gY2FzdDxDWFhDb25zdHJ1Y3RvckRlY2w+KCpDb24pOwogICAgICAgICBpZiAoQ29uc3RydWN0b3ItPmlzRGVmYXVsdENvbnN0cnVjdG9yKCkpIHsKKyAgICAgICAgICBGb3VuZENvbnN0cnVjdG9yID0gdHJ1ZTsKICAgICAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqQ1BUCiAgICAgICAgICAgICAgID0gQ29uc3RydWN0b3ItPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CiAgICAgICAgICAgQ1BUID0gU2VsZi5SZXNvbHZlRXhjZXB0aW9uU3BlYyhLZXlMb2MsIENQVCk7CiAgICAgICAgICAgaWYgKCFDUFQpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgLy8gVE9ETzogY2hlY2sgd2hldGhlciBldmFsdWF0aW5nIGRlZmF1bHQgYXJndW1lbnRzIGNhbiB0aHJvdy4KKyAgICAgICAgICAvLyBGSVhNRTogY2hlY2sgd2hldGhlciBldmFsdWF0aW5nIGRlZmF1bHQgYXJndW1lbnRzIGNhbiB0aHJvdy4KICAgICAgICAgICAvLyBGb3Igbm93LCB3ZSdsbCBiZSBjb25zZXJ2YXRpdmUgYW5kIGFzc3VtZSB0aGF0IHRoZXkgY2FuIHRocm93LgotICAgICAgICAgIHJldHVybiBDUFQtPmlzTm90aHJvdyhTZWxmLkNvbnRleHQpICYmIENQVC0+Z2V0TnVtQXJncygpID09IDA7CisgICAgICAgICAgaWYgKCFDUFQtPmlzTm90aHJvdyhTZWxmLkNvbnRleHQpIHx8IENQVC0+Z2V0TnVtUGFyYW1zKCkgPiAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICB9CisgICAgICByZXR1cm4gRm91bmRDb25zdHJ1Y3RvcjsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogICBjYXNlIFVUVF9IYXNWaXJ0dWFsRGVzdHJ1Y3RvcjoKQEAgLTM1NDksNDEgKzM1ODYsNiBAQAogICAgIC8vICAgZnVuY3Rpb24gY2FsbC4KICAgICByZXR1cm4gIVQtPmlzSW5jb21wbGV0ZVR5cGUoKTsKICAgfQotICBsbHZtX3VucmVhY2hhYmxlKCJUeXBlIHRyYWl0IG5vdCBjb3ZlcmVkIGJ5IHN3aXRjaCIpOwotfQotCi1FeHByUmVzdWx0IFNlbWE6OkJ1aWxkVW5hcnlUeXBlVHJhaXQoVW5hcnlUeXBlVHJhaXQgVVRULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEtXTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpUU0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuKSB7Ci0gIFF1YWxUeXBlIFQgPSBUU0luZm8tPmdldFR5cGUoKTsKLSAgaWYgKCFDaGVja1VuYXJ5VHlwZVRyYWl0VHlwZUNvbXBsZXRlbmVzcygqdGhpcywgVVRULCBLV0xvYywgVCkpCi0gICAgcmV0dXJuIEV4cHJFcnJvcigpOwotCi0gIGJvb2wgVmFsdWUgPSBmYWxzZTsKLSAgaWYgKCFULT5pc0RlcGVuZGVudFR5cGUoKSkKLSAgICBWYWx1ZSA9IEV2YWx1YXRlVW5hcnlUeXBlVHJhaXQoKnRoaXMsIFVUVCwgS1dMb2MsIFQpOwotCi0gIHJldHVybiBPd25lZChuZXcgKENvbnRleHQpIFVuYXJ5VHlwZVRyYWl0RXhwcihLV0xvYywgVVRULCBUU0luZm8sIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBhcmVuLCBDb250ZXh0LkJvb2xUeSkpOwotfQotCi1FeHByUmVzdWx0IFNlbWE6OkFjdE9uQmluYXJ5VHlwZVRyYWl0KEJpbmFyeVR5cGVUcmFpdCBCVFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEtXTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlIExoc1R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRUeXBlIFJoc1R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW4pIHsKLSAgVHlwZVNvdXJjZUluZm8gKkxoc1RTSW5mbzsKLSAgUXVhbFR5cGUgTGhzVCA9IEdldFR5cGVGcm9tUGFyc2VyKExoc1R5LCAmTGhzVFNJbmZvKTsKLSAgaWYgKCFMaHNUU0luZm8pCi0gICAgTGhzVFNJbmZvID0gQ29udGV4dC5nZXRUcml2aWFsVHlwZVNvdXJjZUluZm8oTGhzVCk7Ci0KLSAgVHlwZVNvdXJjZUluZm8gKlJoc1RTSW5mbzsKLSAgUXVhbFR5cGUgUmhzVCA9IEdldFR5cGVGcm9tUGFyc2VyKFJoc1R5LCAmUmhzVFNJbmZvKTsKLSAgaWYgKCFSaHNUU0luZm8pCi0gICAgUmhzVFNJbmZvID0gQ29udGV4dC5nZXRUcml2aWFsVHlwZVNvdXJjZUluZm8oUmhzVCk7Ci0KLSAgcmV0dXJuIEJ1aWxkQmluYXJ5VHlwZVRyYWl0KEJUVCwgS1dMb2MsIExoc1RTSW5mbywgUmhzVFNJbmZvLCBSUGFyZW4pOwogfQogCiAvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIFQgaGFzIGEgbm9uLXRyaXZpYWwgT2JqZWN0aXZlLUMgbGlmZXRpbWUgaW4KQEAgLTM2MDUsMTAgKzM2MDcsMjIgQEAKICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBPYmpDIGxpZmV0aW1lIHF1YWxpZmllciIpOwogfQogCitzdGF0aWMgYm9vbCBFdmFsdWF0ZUJpbmFyeVR5cGVUcmFpdChTZW1hICZTZWxmLCBUeXBlVHJhaXQgQlRULCBRdWFsVHlwZSBMaHNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUmhzVCwgU291cmNlTG9jYXRpb24gS2V5TG9jKTsKKwogc3RhdGljIGJvb2wgZXZhbHVhdGVUeXBlVHJhaXQoU2VtYSAmUywgVHlwZVRyYWl0IEtpbmQsIFNvdXJjZUxvY2F0aW9uIEtXTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZVNvdXJjZUluZm8gKj4gQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYykgeworICBpZiAoS2luZCA8PSBVVFRfTGFzdCkKKyAgICByZXR1cm4gRXZhbHVhdGVVbmFyeVR5cGVUcmFpdChTLCBLaW5kLCBLV0xvYywgQXJnc1swXS0+Z2V0VHlwZSgpKTsKKworICBpZiAoS2luZCA8PSBCVFRfTGFzdCkKKyAgICByZXR1cm4gRXZhbHVhdGVCaW5hcnlUeXBlVHJhaXQoUywgS2luZCwgQXJnc1swXS0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzWzFdLT5nZXRUeXBlKCksIFJQYXJlbkxvYyk7CisKICAgc3dpdGNoIChLaW5kKSB7CisgIGNhc2UgY2xhbmc6OlRUX0lzQ29uc3RydWN0aWJsZToKKyAgY2FzZSBjbGFuZzo6VFRfSXNOb3Rocm93Q29uc3RydWN0aWJsZToKICAgY2FzZSBjbGFuZzo6VFRfSXNUcml2aWFsbHlDb25zdHJ1Y3RpYmxlOiB7CiAgICAgLy8gQysrMTEgW21ldGEudW5hcnkucHJvcF06CiAgICAgLy8gICBpc190cml2aWFsbHlfY29uc3RydWN0aWJsZSBpcyBkZWZpbmVkIGFzOgpAQCAtMzYyMywxMSArMzYzNyw3IEBACiAgICAgLy8gICB2YXJpYWJsZSB0OgogICAgIC8vCiAgICAgLy8gICAgIFQgdChjcmVhdGU8QXJncz4oKS4uLik7Ci0gICAgaWYgKEFyZ3MuZW1wdHkoKSkgewotICAgICAgUy5EaWFnKEtXTG9jLCBkaWFnOjplcnJfdHlwZV90cmFpdF9hcml0eSkKLSAgICAgICAgPDwgMSA8PCAxIDw8IDEgPDwgKGludClBcmdzLnNpemUoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgYXNzZXJ0KCFBcmdzLmVtcHR5KCkpOwogCiAgICAgLy8gUHJlY29uZGl0aW9uOiBUIGFuZCBhbGwgdHlwZXMgaW4gdGhlIHBhcmFtZXRlciBwYWNrIEFyZ3Mgc2hhbGwgYmUKICAgICAvLyBjb21wbGV0ZSB0eXBlcywgKHBvc3NpYmx5IGN2LXF1YWxpZmllZCkgdm9pZCwgb3IgYXJyYXlzIG9mCkBAIC0zNjcxLDIxICszNjgxLDMzIEBACiAgICAgSW5pdGlhbGl6YXRpb25TZXF1ZW5jZSBJbml0KFMsIFRvLCBJbml0S2luZCwgQXJnRXhwcnMpOwogICAgIGlmIChJbml0LkZhaWxlZCgpKQogICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAorCiAgICAgRXhwclJlc3VsdCBSZXN1bHQgPSBJbml0LlBlcmZvcm0oUywgVG8sIEluaXRLaW5kLCBBcmdFeHBycyk7CiAgICAgaWYgKFJlc3VsdC5pc0ludmFsaWQoKSB8fCBTRklOQUUuaGFzRXJyb3JPY2N1cnJlZCgpKQogICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgLy8gVW5kZXIgT2JqZWN0aXZlLUMgQVJDLCBpZiB0aGUgZGVzdGluYXRpb24gaGFzIG5vbi10cml2aWFsIE9iamVjdGl2ZS1DCi0gICAgLy8gbGlmZXRpbWUsIHRoaXMgaXMgYSBub24tdHJpdmlhbCBjb25zdHJ1Y3Rpb24uCi0gICAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50ICYmCi0gICAgICAgIGhhc05vbnRyaXZpYWxPYmpDTGlmZXRpbWUoQXJnc1swXS0+Z2V0VHlwZSgpLmdldE5vblJlZmVyZW5jZVR5cGUoKSkpCi0gICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKEtpbmQgPT0gY2xhbmc6OlRUX0lzQ29uc3RydWN0aWJsZSkKKyAgICAgIHJldHVybiB0cnVlOwogCi0gICAgLy8gVGhlIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZDsgbm93IG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbm9uLXRyaXZpYWwKLSAgICAvLyBjYWxscy4KLSAgICByZXR1cm4gIVJlc3VsdC5nZXQoKS0+aGFzTm9uVHJpdmlhbENhbGwoUy5Db250ZXh0KTsKKyAgICBpZiAoS2luZCA9PSBjbGFuZzo6VFRfSXNOb3Rocm93Q29uc3RydWN0aWJsZSkKKyAgICAgIHJldHVybiBTLmNhblRocm93KFJlc3VsdC5nZXQoKSkgPT0gQ1RfQ2Fubm90OworCisgICAgaWYgKEtpbmQgPT0gY2xhbmc6OlRUX0lzVHJpdmlhbGx5Q29uc3RydWN0aWJsZSkgeworICAgICAgLy8gVW5kZXIgT2JqZWN0aXZlLUMgQVJDLCBpZiB0aGUgZGVzdGluYXRpb24gaGFzIG5vbi10cml2aWFsIE9iamVjdGl2ZS1DCisgICAgICAvLyBsaWZldGltZSwgdGhpcyBpcyBhIG5vbi10cml2aWFsIGNvbnN0cnVjdGlvbi4KKyAgICAgIGlmIChTLmdldExhbmdPcHRzKCkuT2JqQ0F1dG9SZWZDb3VudCAmJgorICAgICAgICAgIGhhc05vbnRyaXZpYWxPYmpDTGlmZXRpbWUoQXJnc1swXS0+Z2V0VHlwZSgpLmdldE5vblJlZmVyZW5jZVR5cGUoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gVGhlIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZDsgbm93IG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbm9uLXRyaXZpYWwKKyAgICAgIC8vIGNhbGxzLgorICAgICAgcmV0dXJuICFSZXN1bHQuZ2V0KCktPmhhc05vblRyaXZpYWxDYWxsKFMuQ29udGV4dCk7CisgICAgfQorCisgICAgbGx2bV91bnJlYWNoYWJsZSgidW5oYW5kbGVkIHR5cGUgdHJhaXQiKTsKKyAgICByZXR1cm4gZmFsc2U7CiAgIH0KKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJub3QgYSBUVCIpOwogICB9CiAgIAogICByZXR1cm4gZmFsc2U7CkBAIC0zNjk0LDYgKzM3MTYsMTIgQEAKIEV4cHJSZXN1bHQgU2VtYTo6QnVpbGRUeXBlVHJhaXQoVHlwZVRyYWl0IEtpbmQsIFNvdXJjZUxvY2F0aW9uIEtXTG9jLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZVNvdXJjZUluZm8gKj4gQXJncywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFJQYXJlbkxvYykgeworICBRdWFsVHlwZSBSZXN1bHRUeXBlID0gQ29udGV4dC5nZXRMb2dpY2FsT3BlcmF0aW9uVHlwZSgpOworCisgIGlmIChLaW5kIDw9IFVUVF9MYXN0ICYmICFDaGVja1VuYXJ5VHlwZVRyYWl0VHlwZUNvbXBsZXRlbmVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGhpcywgS2luZCwgS1dMb2MsIEFyZ3NbMF0tPmdldFR5cGUoKSkpCisgICAgcmV0dXJuIEV4cHJFcnJvcigpOworCiAgIGJvb2wgRGVwZW5kZW50ID0gZmFsc2U7CiAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBBcmdzLnNpemUoKTsgSSAhPSBOOyArK0kpIHsKICAgICBpZiAoQXJnc1tJXS0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSkgewpAQCAtMzcwMSwxNyArMzcyOSwxNyBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICB9Ci0gIAotICBib29sIFZhbHVlID0gZmFsc2U7CisKKyAgYm9vbCBSZXN1bHQgPSBmYWxzZTsKICAgaWYgKCFEZXBlbmRlbnQpCi0gICAgVmFsdWUgPSBldmFsdWF0ZVR5cGVUcmFpdCgqdGhpcywgS2luZCwgS1dMb2MsIEFyZ3MsIFJQYXJlbkxvYyk7Ci0gIAotICByZXR1cm4gVHlwZVRyYWl0RXhwcjo6Q3JlYXRlKENvbnRleHQsIENvbnRleHQuQm9vbFR5LCBLV0xvYywgS2luZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzLCBSUGFyZW5Mb2MsIFZhbHVlKTsKKyAgICBSZXN1bHQgPSBldmFsdWF0ZVR5cGVUcmFpdCgqdGhpcywgS2luZCwgS1dMb2MsIEFyZ3MsIFJQYXJlbkxvYyk7CisKKyAgcmV0dXJuIFR5cGVUcmFpdEV4cHI6OkNyZWF0ZShDb250ZXh0LCBSZXN1bHRUeXBlLCBLV0xvYywgS2luZCwgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUGFyZW5Mb2MsIFJlc3VsdCk7CiB9CiAKLUV4cHJSZXN1bHQgU2VtYTo6QWN0T25UeXBlVHJhaXQoVHlwZVRyYWl0IEtpbmQsIFNvdXJjZUxvY2F0aW9uIEtXTG9jLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVHlwZT4gQXJncywgCitFeHByUmVzdWx0IFNlbWE6OkFjdE9uVHlwZVRyYWl0KFR5cGVUcmFpdCBLaW5kLCBTb3VyY2VMb2NhdGlvbiBLV0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFyc2VkVHlwZT4gQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKSB7CiAgIFNtYWxsVmVjdG9yPFR5cGVTb3VyY2VJbmZvICosIDQ+IENvbnZlcnRlZEFyZ3M7CiAgIENvbnZlcnRlZEFyZ3MucmVzZXJ2ZShBcmdzLnNpemUoKSk7CkBAIC0zNzI0LDEzICszNzUyLDEyIEBACiAgICAgCiAgICAgQ29udmVydGVkQXJncy5wdXNoX2JhY2soVEluZm8pOyAgICAKICAgfQotICAKKwogICByZXR1cm4gQnVpbGRUeXBlVHJhaXQoS2luZCwgS1dMb2MsIENvbnZlcnRlZEFyZ3MsIFJQYXJlbkxvYyk7CiB9CiAKLXN0YXRpYyBib29sIEV2YWx1YXRlQmluYXJ5VHlwZVRyYWl0KFNlbWEgJlNlbGYsIEJpbmFyeVR5cGVUcmFpdCBCVFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBMaHNULCBRdWFsVHlwZSBSaHNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gS2V5TG9jKSB7CitzdGF0aWMgYm9vbCBFdmFsdWF0ZUJpbmFyeVR5cGVUcmFpdChTZW1hICZTZWxmLCBUeXBlVHJhaXQgQlRULCBRdWFsVHlwZSBMaHNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgUmhzVCwgU291cmNlTG9jYXRpb24gS2V5TG9jKSB7CiAgIGFzc2VydCghTGhzVC0+aXNEZXBlbmRlbnRUeXBlKCkgJiYgIVJoc1QtPmlzRGVwZW5kZW50VHlwZSgpICYmCiAgICAgICAgICAiQ2Fubm90IGV2YWx1YXRlIHRyYWl0cyBvZiBkZXBlbmRlbnQgdHlwZXMiKTsKIApAQCAtMzgzMyw3ICszODYwLDggQEAKICAgICBFeHByUmVzdWx0IFJlc3VsdCA9IEluaXQuUGVyZm9ybShTZWxmLCBUbywgS2luZCwgRnJvbVB0cik7CiAgICAgcmV0dXJuICFSZXN1bHQuaXNJbnZhbGlkKCkgJiYgIVNGSU5BRS5oYXNFcnJvck9jY3VycmVkKCk7CiAgIH0KLSAgICAgIAorCisgIGNhc2UgQlRUX0lzTm90aHJvd0Fzc2lnbmFibGU6CiAgIGNhc2UgQlRUX0lzVHJpdmlhbGx5QXNzaWduYWJsZTogewogICAgIC8vIEMrKzExIFttZXRhLnVuYXJ5LnByb3BdcDM6CiAgICAgLy8gICBpc190cml2aWFsbHlfYXNzaWduYWJsZSBpcyBkZWZpbmVkIGFzOgpAQCAtMzg3OSw1NCArMzkwNywyNyBAQAogICAgIGlmIChSZXN1bHQuaXNJbnZhbGlkKCkgfHwgU0ZJTkFFLmhhc0Vycm9yT2NjdXJyZWQoKSkKICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIC8vIFVuZGVyIE9iamVjdGl2ZS1DIEFSQywgaWYgdGhlIGRlc3RpbmF0aW9uIGhhcyBub24tdHJpdmlhbCBPYmplY3RpdmUtQwotICAgIC8vIGxpZmV0aW1lLCB0aGlzIGlzIGEgbm9uLXRyaXZpYWwgYXNzaWdubWVudC4KLSAgICBpZiAoU2VsZi5nZXRMYW5nT3B0cygpLk9iakNBdXRvUmVmQ291bnQgJiYKLSAgICAgICAgaGFzTm9udHJpdmlhbE9iakNMaWZldGltZShMaHNULmdldE5vblJlZmVyZW5jZVR5cGUoKSkpCi0gICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKEJUVCA9PSBCVFRfSXNOb3Rocm93QXNzaWduYWJsZSkKKyAgICAgIHJldHVybiBTZWxmLmNhblRocm93KFJlc3VsdC5nZXQoKSkgPT0gQ1RfQ2Fubm90OwogCi0gICAgcmV0dXJuICFSZXN1bHQuZ2V0KCktPmhhc05vblRyaXZpYWxDYWxsKFNlbGYuQ29udGV4dCk7CisgICAgaWYgKEJUVCA9PSBCVFRfSXNUcml2aWFsbHlBc3NpZ25hYmxlKSB7CisgICAgICAvLyBVbmRlciBPYmplY3RpdmUtQyBBUkMsIGlmIHRoZSBkZXN0aW5hdGlvbiBoYXMgbm9uLXRyaXZpYWwgT2JqZWN0aXZlLUMKKyAgICAgIC8vIGxpZmV0aW1lLCB0aGlzIGlzIGEgbm9uLXRyaXZpYWwgYXNzaWdubWVudC4KKyAgICAgIGlmIChTZWxmLmdldExhbmdPcHRzKCkuT2JqQ0F1dG9SZWZDb3VudCAmJgorICAgICAgICAgIGhhc05vbnRyaXZpYWxPYmpDTGlmZXRpbWUoTGhzVC5nZXROb25SZWZlcmVuY2VUeXBlKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIHJldHVybiAhUmVzdWx0LmdldCgpLT5oYXNOb25Ucml2aWFsQ2FsbChTZWxmLkNvbnRleHQpOworICAgIH0KKworICAgIGxsdm1fdW5yZWFjaGFibGUoInVuaGFuZGxlZCB0eXBlIHRyYWl0Iik7CisgICAgcmV0dXJuIGZhbHNlOwogICB9CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgibm90IGEgQlRUIik7CiAgIH0KICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biB0eXBlIHRyYWl0IG9yIG5vdCBpbXBsZW1lbnRlZCIpOwogfQogCi1FeHByUmVzdWx0IFNlbWE6OkJ1aWxkQmluYXJ5VHlwZVRyYWl0KEJpbmFyeVR5cGVUcmFpdCBCVFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEtXTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqTGhzVFNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqUmhzVFNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW4pIHsKLSAgUXVhbFR5cGUgTGhzVCA9IExoc1RTSW5mby0+Z2V0VHlwZSgpOwotICBRdWFsVHlwZSBSaHNUID0gUmhzVFNJbmZvLT5nZXRUeXBlKCk7Ci0KLSAgaWYgKEJUVCA9PSBCVFRfVHlwZUNvbXBhdGlibGUpIHsKLSAgICBpZiAoZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMpIHsKLSAgICAgIERpYWcoS1dMb2MsIGRpYWc6OmVycl90eXBlc19jb21wYXRpYmxlX3BfaW5fY3BsdXNwbHVzKQotICAgICAgICA8PCBTb3VyY2VSYW5nZShLV0xvYywgUlBhcmVuKTsKLSAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKLSAgICB9Ci0gIH0KLQotICBib29sIFZhbHVlID0gZmFsc2U7Ci0gIGlmICghTGhzVC0+aXNEZXBlbmRlbnRUeXBlKCkgJiYgIVJoc1QtPmlzRGVwZW5kZW50VHlwZSgpKQotICAgIFZhbHVlID0gRXZhbHVhdGVCaW5hcnlUeXBlVHJhaXQoKnRoaXMsIEJUVCwgTGhzVCwgUmhzVCwgS1dMb2MpOwotCi0gIC8vIFNlbGVjdCB0cmFpdCByZXN1bHQgdHlwZS4KLSAgUXVhbFR5cGUgUmVzdWx0VHlwZTsKLSAgc3dpdGNoIChCVFQpIHsKLSAgY2FzZSBCVFRfSXNCYXNlT2Y6ICAgICAgIFJlc3VsdFR5cGUgPSBDb250ZXh0LkJvb2xUeTsgYnJlYWs7Ci0gIGNhc2UgQlRUX0lzQ29udmVydGlibGU6ICBSZXN1bHRUeXBlID0gQ29udGV4dC5Cb29sVHk7IGJyZWFrOwotICBjYXNlIEJUVF9Jc1NhbWU6ICAgICAgICAgUmVzdWx0VHlwZSA9IENvbnRleHQuQm9vbFR5OyBicmVhazsKLSAgY2FzZSBCVFRfVHlwZUNvbXBhdGlibGU6IFJlc3VsdFR5cGUgPSBDb250ZXh0LkludFR5OyBicmVhazsKLSAgY2FzZSBCVFRfSXNDb252ZXJ0aWJsZVRvOiBSZXN1bHRUeXBlID0gQ29udGV4dC5Cb29sVHk7IGJyZWFrOwotICBjYXNlIEJUVF9Jc1RyaXZpYWxseUFzc2lnbmFibGU6IFJlc3VsdFR5cGUgPSBDb250ZXh0LkJvb2xUeTsKLSAgfQotCi0gIHJldHVybiBPd25lZChuZXcgKENvbnRleHQpIEJpbmFyeVR5cGVUcmFpdEV4cHIoS1dMb2MsIEJUVCwgTGhzVFNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJoc1RTSW5mbywgVmFsdWUsIFJQYXJlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRUeXBlKSk7Ci19Ci0KIEV4cHJSZXN1bHQgU2VtYTo6QWN0T25BcnJheVR5cGVUcmFpdChBcnJheVR5cGVUcmFpdCBBVFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gS1dMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkVHlwZSBUeSwKQEAgLTQxMTcsMjIgKzQxMTgsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcFNwZWxsaW5nLCAoaW50KWlzSW5kaXJlY3QpKSB7CiAgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKICAgICB9Ci0gICAgQ1hYQmFzZVBhdGhzIFBhdGhzKC8qRmluZEFtYmlndWl0aWVzPSovdHJ1ZSwgLypSZWNvcmRQYXRocz0qL3RydWUsCi0gICAgICAgICAgICAgICAgICAgICAgIC8qRGV0ZWN0VmlydHVhbD0qL2ZhbHNlKTsKLSAgICAvLyBGSVhNRTogV291bGQgaXQgYmUgdXNlZnVsIHRvIHByaW50IGZ1bGwgYW1iaWd1aXR5IHBhdGhzLCBvciBpcyB0aGF0Ci0gICAgLy8gb3ZlcmtpbGw/Ci0gICAgaWYgKCFJc0Rlcml2ZWRGcm9tKExIU1R5cGUsIENsYXNzLCBQYXRocykgfHwKLSAgICAgICAgUGF0aHMuaXNBbWJpZ3VvdXMoQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKENsYXNzKSkpIHsKKworICAgIGlmICghSXNEZXJpdmVkRnJvbShMSFNUeXBlLCBDbGFzcykpIHsKICAgICAgIERpYWcoTG9jLCBkaWFnOjplcnJfYmFkX21lbXB0cl9saHMpIDw8IE9wU3BlbGxpbmcKICAgICAgICAgPDwgKGludClpc0luZGlyZWN0IDw8IExIUy5nZXQoKS0+Z2V0VHlwZSgpOwogICAgICAgcmV0dXJuIFF1YWxUeXBlKCk7CiAgICAgfQorCisgICAgQ1hYQ2FzdFBhdGggQmFzZVBhdGg7CisgICAgaWYgKENoZWNrRGVyaXZlZFRvQmFzZUNvbnZlcnNpb24oTEhTVHlwZSwgQ2xhc3MsIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZShMSFMuZ2V0KCktPmdldExvY1N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTLmdldCgpLT5nZXRMb2NFbmQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJhc2VQYXRoKSkKKyAgICAgIHJldHVybiBRdWFsVHlwZSgpOworCiAgICAgLy8gQ2FzdCBMSFMgdG8gdHlwZSBvZiB1c2UuCiAgICAgUXVhbFR5cGUgVXNlVHlwZSA9IGlzSW5kaXJlY3QgPyBDb250ZXh0LmdldFBvaW50ZXJUeXBlKENsYXNzKSA6IENsYXNzOwogICAgIEV4cHJWYWx1ZUtpbmQgVksgPSBpc0luZGlyZWN0ID8gVktfUlZhbHVlIDogTEhTLmdldCgpLT5nZXRWYWx1ZUtpbmQoKTsKLQotICAgIENYWENhc3RQYXRoIEJhc2VQYXRoOwotICAgIEJ1aWxkQmFzZVBhdGhBcnJheShQYXRocywgQmFzZVBhdGgpOwogICAgIExIUyA9IEltcENhc3RFeHByVG9UeXBlKExIUy50YWtlKCksIFVzZVR5cGUsIENLX0Rlcml2ZWRUb0Jhc2UsIFZLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCYXNlUGF0aCk7CiAgIH0KQEAgLTQ0MDAsNDIgKzQ0MDIsMjEgQEAKICAgYm9vbCBMVm9pZCA9IExUeS0+aXNWb2lkVHlwZSgpOwogICBib29sIFJWb2lkID0gUlR5LT5pc1ZvaWRUeXBlKCk7CiAgIGlmIChMVm9pZCB8fCBSVm9pZCkgewotICAgIC8vICAgLi4uIHRoZW4gdGhlIFtsMnJdIGNvbnZlcnNpb25zIGFyZSBwZXJmb3JtZWQgb24gdGhlIHNlY29uZCBhbmQgdGhpcmQKLSAgICAvLyAgIG9wZXJhbmRzIC4uLgotICAgIExIUyA9IERlZmF1bHRGdW5jdGlvbkFycmF5THZhbHVlQ29udmVyc2lvbihMSFMudGFrZSgpKTsKLSAgICBSSFMgPSBEZWZhdWx0RnVuY3Rpb25BcnJheUx2YWx1ZUNvbnZlcnNpb24oUkhTLnRha2UoKSk7Ci0gICAgaWYgKExIUy5pc0ludmFsaWQoKSB8fCBSSFMuaXNJbnZhbGlkKCkpCi0gICAgICByZXR1cm4gUXVhbFR5cGUoKTsKLQotICAgIC8vIEZpbmlzaCBvZmYgdGhlIGx2YWx1ZS10by1ydmFsdWUgY29udmVyc2lvbiBieSBjb3B5LWluaXRpYWxpemluZyBhCi0gICAgLy8gdGVtcG9yYXJ5IGlmIG5lY2Vzc2FyeS4gRGVmYXVsdEZ1bmN0aW9uQXJyYXlMdmFsdWVDb252ZXJzaW9uIGRvZXNuJ3QKLSAgICAvLyBkbyB0aGlzIHBhcnQgZm9yIHVzLgotICAgIEV4cHJSZXN1bHQgJk5vblZvaWQgPSBMVm9pZCA/IFJIUyA6IExIUzsKLSAgICBpZiAoTm9uVm9pZC5nZXQoKS0+Z2V0VHlwZSgpLT5pc1JlY29yZFR5cGUoKSAmJgotICAgICAgICBOb25Wb2lkLmdldCgpLT5pc0dMVmFsdWUoKSkgewotICAgICAgaWYgKFJlcXVpcmVOb25BYnN0cmFjdFR5cGUoUXVlc3Rpb25Mb2MsIE5vblZvaWQuZ2V0KCktPmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX2FsbG9jYXRpb25fb2ZfYWJzdHJhY3RfdHlwZSkpCi0gICAgICAgIHJldHVybiBRdWFsVHlwZSgpOwotICAgICAgSW5pdGlhbGl6ZWRFbnRpdHkgRW50aXR5ID0KLSAgICAgICAgICBJbml0aWFsaXplZEVudGl0eTo6SW5pdGlhbGl6ZVRlbXBvcmFyeShOb25Wb2lkLmdldCgpLT5nZXRUeXBlKCkpOwotICAgICAgTm9uVm9pZCA9IFBlcmZvcm1Db3B5SW5pdGlhbGl6YXRpb24oRW50aXR5LCBTb3VyY2VMb2NhdGlvbigpLCBOb25Wb2lkKTsKLSAgICAgIGlmIChOb25Wb2lkLmlzSW52YWxpZCgpKQotICAgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKKyAgICAvLyAgIC4uLiBvbmUgb2YgdGhlIGZvbGxvd2luZyBzaGFsbCBob2xkOgorICAgIC8vICAgLS0gVGhlIHNlY29uZCBvciB0aGUgdGhpcmQgb3BlcmFuZCAoYnV0IG5vdCBib3RoKSBpcyBhIChwb3NzaWJseQorICAgIC8vICAgICAgcGFyZW50aGVzaXplZCkgdGhyb3ctZXhwcmVzc2lvbjsgdGhlIHJlc3VsdCBpcyBvZiB0aGUgdHlwZQorICAgIC8vICAgICAgYW5kIHZhbHVlIGNhdGVnb3J5IG9mIHRoZSBvdGhlci4KKyAgICBib29sIExUaHJvdyA9IGlzYTxDWFhUaHJvd0V4cHI+KExIUy5nZXQoKS0+SWdub3JlUGFyZW5JbXBDYXN0cygpKTsKKyAgICBib29sIFJUaHJvdyA9IGlzYTxDWFhUaHJvd0V4cHI+KFJIUy5nZXQoKS0+SWdub3JlUGFyZW5JbXBDYXN0cygpKTsKKyAgICBpZiAoTFRocm93ICE9IFJUaHJvdykgeworICAgICAgRXhwciAqTm9uVGhyb3cgPSBMVGhyb3cgPyBSSFMuZ2V0KCkgOiBMSFMuZ2V0KCk7CisgICAgICBWSyA9IE5vblRocm93LT5nZXRWYWx1ZUtpbmQoKTsKKyAgICAgIC8vIERSIChubyBudW1iZXIgeWV0KTogdGhlIHJlc3VsdCBpcyBhIGJpdC1maWVsZCBpZiB0aGUKKyAgICAgIC8vIG5vbi10aHJvdy1leHByZXNzaW9uIG9wZXJhbmQgaXMgYSBiaXQtZmllbGQuCisgICAgICBPSyA9IE5vblRocm93LT5nZXRPYmplY3RLaW5kKCk7CisgICAgICByZXR1cm4gTm9uVGhyb3ctPmdldFR5cGUoKTsKICAgICB9CiAKLSAgICBMVHkgPSBMSFMuZ2V0KCktPmdldFR5cGUoKTsKLSAgICBSVHkgPSBSSFMuZ2V0KCktPmdldFR5cGUoKTsKLQotICAgIC8vICAgLi4uIGFuZCBvbmUgb2YgdGhlIGZvbGxvd2luZyBzaGFsbCBob2xkOgotICAgIC8vICAgLS0gVGhlIHNlY29uZCBvciB0aGUgdGhpcmQgb3BlcmFuZCAoYnV0IG5vdCBib3RoKSBpcyBhIHRocm93LQotICAgIC8vICAgICAgZXhwcmVzc2lvbjsgdGhlIHJlc3VsdCBpcyBvZiB0aGUgdHlwZSBvZiB0aGUgb3RoZXIgYW5kIGlzIGEgcHJ2YWx1ZS4KLSAgICBib29sIExUaHJvdyA9IGlzYTxDWFhUaHJvd0V4cHI+KExIUy5nZXQoKS0+SWdub3JlUGFyZW5DYXN0cygpKTsKLSAgICBib29sIFJUaHJvdyA9IGlzYTxDWFhUaHJvd0V4cHI+KFJIUy5nZXQoKS0+SWdub3JlUGFyZW5DYXN0cygpKTsKLSAgICBpZiAoTFRocm93ICYmICFSVGhyb3cpCi0gICAgICByZXR1cm4gUlR5OwotICAgIGlmIChSVGhyb3cgJiYgIUxUaHJvdykKLSAgICAgIHJldHVybiBMVHk7Ci0KICAgICAvLyAgIC0tIEJvdGggdGhlIHNlY29uZCBhbmQgdGhpcmQgb3BlcmFuZHMgaGF2ZSB0eXBlIHZvaWQ7IHRoZSByZXN1bHQgaXMgb2YKICAgICAvLyAgICAgIHR5cGUgdm9pZCBhbmQgaXMgYSBwcnZhbHVlLgogICAgIGlmIChMVm9pZCAmJiBSVm9pZCkKQEAgLTQ0NTYsNyArNDQzNyw2IEBACiAgIC8vICAgdGhvc2Ugb3BlcmFuZHMgdG8gdGhlIHR5cGUgb2YgdGhlIG90aGVyLgogICBpZiAoIUNvbnRleHQuaGFzU2FtZVR5cGUoTFR5LCBSVHkpICYmCiAgICAgICAoTFR5LT5pc1JlY29yZFR5cGUoKSB8fCBSVHktPmlzUmVjb3JkVHlwZSgpKSkgewotICAgIEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlIElDU0xlZnRUb1JpZ2h0LCBJQ1NSaWdodFRvTGVmdDsKICAgICAvLyBUaGVzZSByZXR1cm4gdHJ1ZSBpZiBhIHNpbmdsZSBkaXJlY3Rpb24gaXMgYWxyZWFkeSBhbWJpZ3VvdXMuCiAgICAgUXVhbFR5cGUgTDJSVHlwZSwgUjJMVHlwZTsKICAgICBib29sIEhhdmVMMlIsIEhhdmVSMkw7CkBAIC01MDIzLDcgKzUwMDMsNyBAQAogfQogCiBFeHByICpTZW1hOjpNYXliZUNyZWF0ZUV4cHJXaXRoQ2xlYW51cHMoRXhwciAqU3ViRXhwcikgewotICBhc3NlcnQoU3ViRXhwciAmJiAic3ViIGV4cHJlc3Npb24gY2FuJ3QgYmUgbnVsbCEiKTsKKyAgYXNzZXJ0KFN1YkV4cHIgJiYgInN1YmV4cHJlc3Npb24gY2FuJ3QgYmUgbnVsbCEiKTsKIAogICBDbGVhbnVwVmFyRGVjbE1hcmtpbmcoKTsKIApAQCAtNTA0NCw3ICs1MDI0LDcgQEAKIH0KIAogU3RtdCAqU2VtYTo6TWF5YmVDcmVhdGVTdG10V2l0aENsZWFudXBzKFN0bXQgKlN1YlN0bXQpIHsKLSAgYXNzZXJ0KFN1YlN0bXQgJiYgInN1YiBzdGF0ZW1lbnQgY2FuJ3QgYmUgbnVsbCEiKTsKKyAgYXNzZXJ0KFN1YlN0bXQgJiYgInN1Yi1zdGF0ZW1lbnQgY2FuJ3QgYmUgbnVsbCEiKTsKIAogICBDbGVhbnVwVmFyRGVjbE1hcmtpbmcoKTsKIApAQCAtNTEwNSwxOSArNTA4NSwyMSBAQAogICB9CiAKICAgQ1hYQmluZFRlbXBvcmFyeUV4cHIgKlRvcEJpbmQgPSBkeW5fY2FzdDxDWFhCaW5kVGVtcG9yYXJ5RXhwcj4oRSk7Ci0gIGlmIChUb3BCaW5kKQotICAgIEUgPSBUb3BCaW5kLT5nZXRTdWJFeHByKCk7CisgIENhbGxFeHByICpUb3BDYWxsID0gVG9wQmluZCA/IGR5bl9jYXN0PENhbGxFeHByPihUb3BCaW5kLT5nZXRTdWJFeHByKCkpIDogMDsKKyAgaWYgKFRvcENhbGwpCisgICAgRSA9IFRvcENhbGw7CisgIGVsc2UKKyAgICBUb3BCaW5kID0gMDsKIAogICAvLyBEaXNhYmxlIHRoZSBzcGVjaWFsIGRlY2x0eXBlIGhhbmRsaW5nIG5vdy4KICAgRXhwckV2YWxDb250ZXh0cy5iYWNrKCkuSXNEZWNsdHlwZSA9IGZhbHNlOwogCiAgIC8vIEluIE1TIG1vZGUsIGRvbid0IHBlcmZvcm0gYW55IGV4dHJhIGNoZWNraW5nIG9mIGNhbGwgcmV0dXJuIHR5cGVzIHdpdGhpbiBhCiAgIC8vIGRlY2x0eXBlIGV4cHJlc3Npb24uCi0gIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUpCisgIGlmIChnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQpCiAgICAgcmV0dXJuIE93bmVkKEUpOwogCiAgIC8vIFBlcmZvcm0gdGhlIHNlbWFudGljIGNoZWNrcyB3ZSBkZWxheWVkIHVudGlsIHRoaXMgcG9pbnQuCi0gIENhbGxFeHByICpUb3BDYWxsID0gZHluX2Nhc3Q8Q2FsbEV4cHI+KEUpOwogICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gRXhwckV2YWxDb250ZXh0cy5iYWNrKCkuRGVsYXllZERlY2x0eXBlQ2FsbHMuc2l6ZSgpOwogICAgICAgIEkgIT0gTjsgKytJKSB7CiAgICAgQ2FsbEV4cHIgKkNhbGwgPSBFeHByRXZhbENvbnRleHRzLmJhY2soKS5EZWxheWVkRGVjbHR5cGVDYWxsc1tJXTsKQEAgLTUzODgsNyArNTM3MCw3IEBACiAKICAgaWYgKCFPYmplY3RUeXBlLT5pc0RlcGVuZGVudFR5cGUoKSAmJiAhT2JqZWN0VHlwZS0+aXNTY2FsYXJUeXBlKCkgJiYKICAgICAgICFPYmplY3RUeXBlLT5pc1ZlY3RvclR5cGUoKSkgewotICAgIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUgJiYgT2JqZWN0VHlwZS0+aXNWb2lkVHlwZSgpKQorICAgIGlmIChnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQgJiYgT2JqZWN0VHlwZS0+aXNWb2lkVHlwZSgpKQogICAgICAgRGlhZyhPcExvYywgZGlhZzo6ZXh0X3BzZXVkb19kdG9yX29uX3ZvaWQpIDw8IEJhc2UtPmdldFNvdXJjZVJhbmdlKCk7CiAgICAgZWxzZQogICAgICAgRGlhZyhPcExvYywgZGlhZzo6ZXJyX3BzZXVkb19kdG9yX2Jhc2Vfbm90X3NjYWxhcikKQEAgLTU2NzcsNyArNTY1OSw3IEBACiAgICAgTUUtPnNldEhhZE11bHRpcGxlQ2FuZGlkYXRlcyh0cnVlKTsKICAgTWFya01lbWJlclJlZmVyZW5jZWQoTUUpOwogCi0gIFF1YWxUeXBlIFJlc3VsdFR5cGUgPSBNZXRob2QtPmdldFJlc3VsdFR5cGUoKTsKKyAgUXVhbFR5cGUgUmVzdWx0VHlwZSA9IE1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpOwogICBFeHByVmFsdWVLaW5kIFZLID0gRXhwcjo6Z2V0VmFsdWVLaW5kRm9yVHlwZShSZXN1bHRUeXBlKTsKICAgUmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuZ2V0Tm9uTFZhbHVlRXhwclR5cGUoQ29udGV4dCk7CiAKQEAgLTU4MzYsNTYgKzU4MTgsNzEgQEAKICAgYXNzZXJ0KERlZlZEKTsKICAgaWYgKERlZlZELT5pc1dlYWsoKSkgcmV0dXJuIGZhbHNlOwogICBFdmFsdWF0ZWRTdG10ICpFdmFsID0gRGVmVkQtPmVuc3VyZUV2YWx1YXRlZFN0bXQoKTsKLSAgCisKICAgRXhwciAqSW5pdCA9IGNhc3Q8RXhwcj4oRXZhbC0+VmFsdWUpOwogCiAgIGlmIChWYXItPmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCkgfHwgSW5pdC0+aXNWYWx1ZURlcGVuZGVudCgpKSB7Ci0gICAgaWYgKCFJbml0LT5pc1ZhbHVlRGVwZW5kZW50KCkpCi0gICAgICByZXR1cm4gIURlZlZELT5jaGVja0luaXRJc0lDRSgpOwotICAgIC8vIEZJWE1FOiBXZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIGRvIHNvbWUgYW5hbHlzaXMgb2YgSW5pdCBoZXJlCi0gICAgLy8gdG8gY29uY2x1ZGUgdGhhdCBldmVuIGluIGEgZGVwZW5kZW50IHNldHRpbmcsIEluaXQgY2FuIG5ldmVyCi0gICAgLy8gYmUgYSBjb25zdGV4cHIgLSBidXQgZm9yIG5vdyBhZG1pdCBhZ25vc3RpY2l0eS4KKyAgICAvLyBGSVhNRTogVGVhY2ggdGhlIGNvbnN0YW50IGV2YWx1YXRvciB0byBkZWFsIHdpdGggdGhlIG5vbi1kZXBlbmRlbnQgcGFydHMKKyAgICAvLyBvZiB2YWx1ZS1kZXBlbmRlbnQgZXhwcmVzc2lvbnMsIGFuZCB1c2UgaXQgaGVyZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKKyAgICAvLyBpbml0aWFsaXplciBpcyBhIHBvdGVudGlhbCBjb25zdGFudCBleHByZXNzaW9uLgogICAgIHJldHVybiBmYWxzZTsKLSAgfSAKKyAgfQorCiAgIHJldHVybiAhSXNWYXJpYWJsZUFDb25zdGFudEV4cHJlc3Npb24oVmFyLCBDb250ZXh0KTsgCiB9CiAKLS8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbGFtYmRhIHNjb3BlIGhhcyBhbnkgcG90ZW50aWFsIGNhcHR1cmVzLCBhbmQgCi0vLy8gIHdoZXRoZXIgdGhleSBjYW4gYmUgY2FwdHVyZWQgYnkgYW55IG9mIHRoZSBlbmNsb3NpbmcgbGFtYmRhcyB0aGF0IGFyZSAKLS8vLyAgcmVhZHkgdG8gY2FwdHVyZS4gSWYgdGhlcmUgaXMgYSBsYW1iZGEgdGhhdCBjYW4gY2FwdHVyZSBhIG5lc3RlZCAKLS8vLyAgcG90ZW50aWFsLWNhcHR1cmUsIGdvIGFoZWFkIGFuZCBkbyBzby4gIEFsc28sIGNoZWNrIHRvIHNlZSBpZiBhbnkgCi0vLy8gIHZhcmlhYmxlcyBhcmUgdW5jYXB0dXJlYWJsZSBvciBkbyBub3QgaW52b2x2ZSBhbiBvZHItdXNlIHNvIGRvIG5vdCAKLS8vLyAgbmVlZCB0byBiZSBjYXB0dXJlZC4KKy8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbGFtYmRhIGhhcyBhbnkgcG90ZW50aWFsIGNhcHR1cmVzIAorLy8vIHRoYXQgbXVzdCBiZSBjYXB0dXJlZCBieSBhbnkgb2YgaXRzIGVuY2xvc2luZyBsYW1iZGFzIHRoYXQgYXJlIHJlYWR5IHRvIAorLy8vIGNhcHR1cmUuIElmIHRoZXJlIGlzIGEgbGFtYmRhIHRoYXQgY2FuIGNhcHR1cmUgYSBuZXN0ZWQgCisvLy8gcG90ZW50aWFsLWNhcHR1cmUsIGdvIGFoZWFkIGFuZCBkbyBzby4gIEFsc28sIGNoZWNrIHRvIHNlZSBpZiBhbnkgCisvLy8gdmFyaWFibGVzIGFyZSB1bmNhcHR1cmVhYmxlIG9yIGRvIG5vdCBpbnZvbHZlIGFuIG9kci11c2Ugc28gZG8gbm90IAorLy8vIG5lZWQgdG8gYmUgY2FwdHVyZWQuCiAKLXN0YXRpYyB2b2lkIENoZWNrTGFtYmRhQ2FwdHVyZXMoRXhwciAqY29uc3QgRkUsIAotICAgIExhbWJkYVNjb3BlSW5mbyAqY29uc3QgQ3VycmVudExTSSwgU2VtYSAmUykgewotICAgIAorc3RhdGljIHZvaWQgQ2hlY2tJZkFueUVuY2xvc2luZ0xhbWJkYXNNdXN0Q2FwdHVyZUFueVBvdGVudGlhbENhcHR1cmVzKAorICAgIEV4cHIgKmNvbnN0IEZFLCBMYW1iZGFTY29wZUluZm8gKmNvbnN0IEN1cnJlbnRMU0ksIFNlbWEgJlMpIHsKKwogICBhc3NlcnQoIVMuaXNVbmV2YWx1YXRlZENvbnRleHQoKSk7ICAKICAgYXNzZXJ0KFMuQ3VyQ29udGV4dC0+aXNEZXBlbmRlbnRDb250ZXh0KCkpOyAKLSAgY29uc3QgYm9vbCBJc0Z1bGxFeHBySW5zdGFudGlhdGlvbkRlcGVuZGVudCA9IAotICAgICAgRkUtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpOwotICAvLyBBbGwgdGhlIHBvdGVudGlhbGx5IGNhcHR1cmVhYmxlIHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCBuZXN0ZWQgCisgIGFzc2VydChDdXJyZW50TFNJLT5DYWxsT3BlcmF0b3IgPT0gUy5DdXJDb250ZXh0ICYmIAorICAgICAgIlRoZSBjdXJyZW50IGNhbGwgb3BlcmF0b3IgbXVzdCBiZSBzeW5jaHJvbml6ZWQgd2l0aCBTZW1hJ3MgQ3VyQ29udGV4dCIpOworCisgIGNvbnN0IGJvb2wgSXNGdWxsRXhwckluc3RhbnRpYXRpb25EZXBlbmRlbnQgPSBGRS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCk7CisKKyAgQXJyYXlSZWY8Y29uc3QgRnVuY3Rpb25TY29wZUluZm8gKj4gRnVuY3Rpb25TY29wZXNBcnJheVJlZigKKyAgICAgIFMuRnVuY3Rpb25TY29wZXMuZGF0YSgpLCBTLkZ1bmN0aW9uU2NvcGVzLnNpemUoKSk7CisgIAorICAvLyBBbGwgdGhlIHBvdGVudGlhbGx5IGNhcHR1cmVhYmxlIHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCBuZXN0ZWQKICAgLy8gbGFtYmRhICh3aXRoaW4gYSBnZW5lcmljIG91dGVyIGxhbWJkYSksIG11c3QgYmUgY2FwdHVyZWQgYnkgYW4KICAgLy8gb3V0ZXIgbGFtYmRhIHRoYXQgaXMgZW5jbG9zZWQgd2l0aGluIGEgbm9uLWRlcGVuZGVudCBjb250ZXh0LgotICAgICAKLSAgZm9yIChzaXplX3QgSSA9IDAsIE4gPSBDdXJyZW50TFNJLT5nZXROdW1Qb3RlbnRpYWxWYXJpYWJsZUNhcHR1cmVzKCk7IAotICAgICAgSSAhPSBOOyArK0kpIHsKKyAgY29uc3QgdW5zaWduZWQgTnVtUG90ZW50aWFsQ2FwdHVyZXMgPQorICAgICAgQ3VycmVudExTSS0+Z2V0TnVtUG90ZW50aWFsVmFyaWFibGVDYXB0dXJlcygpOworICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bVBvdGVudGlhbENhcHR1cmVzOyArK0kpIHsKICAgICBFeHByICpWYXJFeHByID0gMDsKICAgICBWYXJEZWNsICpWYXIgPSAwOwogICAgIEN1cnJlbnRMU0ktPmdldFBvdGVudGlhbFZhcmlhYmxlQ2FwdHVyZShJLCBWYXIsIFZhckV4cHIpOwotICAgIC8vIAotICAgIGlmIChDdXJyZW50TFNJLT5pc1ZhcmlhYmxlRXhwck1hcmtlZEFzTm9uT0RSVXNlZChWYXJFeHByKSAmJiAKKyAgICAvLyBJZiB0aGUgdmFyaWFibGUgaXMgY2xlYXJseSBpZGVudGlmaWVkIGFzIG5vbi1vZHItdXNlZCBhbmQgdGhlIGZ1bGwKKyAgICAvLyBleHByZXNzaW9uIGlzIG5vdCBpbnN0YW50aWF0aW9uIGRlcGVuZGVudCwgb25seSB0aGVuIGRvIHdlIG5vdCAKKyAgICAvLyBuZWVkIHRvIGNoZWNrIGVuY2xvc2luZyBsYW1iZGEncyBmb3Igc3BlY3VsYXRpdmUgY2FwdHVyZXMuCisgICAgLy8gRm9yIGUuZy46CisgICAgLy8gRXZlbiB0aG91Z2ggJ3gnIGlzIG5vdCBvZHItdXNlZCwgaXQgc2hvdWxkIGJlIGNhcHR1cmVkLgorICAgIC8vIGludCB0ZXN0KCkgeworICAgIC8vICAgY29uc3QgaW50IHggPSAxMDsKKyAgICAvLyAgIGF1dG8gTCA9IFs9XShhdXRvIGEpIHsKKyAgICAvLyAgICAgKHZvaWQpICt4ICsgYTsKKyAgICAvLyAgIH07CisgICAgLy8gfQorICAgIGlmIChDdXJyZW50TFNJLT5pc1ZhcmlhYmxlRXhwck1hcmtlZEFzTm9uT0RSVXNlZChWYXJFeHByKSAmJgogICAgICAgICAhSXNGdWxsRXhwckluc3RhbnRpYXRpb25EZXBlbmRlbnQpCi0gICAgICBjb250aW51ZTsgCi0gICAgLy8gQ2xpbWIgdXAgdW50aWwgd2UgZmluZCBhIGxhbWJkYSB0aGF0IGNhbiBjYXB0dXJlOgotICAgIC8vICAgLSBhIGdlbmVyaWMtb3Itbm9uLWdlbmVyaWMgbGFtYmRhIGNhbGwgb3BlcmF0b3IgdGhhdCBpcyBlbmNsb3NlZAotICAgIC8vICAgICB3aXRoaW4gYSBub24tZGVwZW5kZW50IGNvbnRleHQuCi0gICAgdW5zaWduZWQgRnVuY3Rpb25TY29wZUluZGV4T2ZDYXB0dXJhYmxlTGFtYmRhID0gMDsKLSAgICBpZiAoR2V0SW5uZXJtb3N0RW5jbG9zaW5nQ2FwdHVyYWJsZUxhbWJkYSgKLSAgICAgICAgICAgIFMuRnVuY3Rpb25TY29wZXMsIEZ1bmN0aW9uU2NvcGVJbmRleE9mQ2FwdHVyYWJsZUxhbWJkYSwKLSAgICAgICAgICAgIFMuQ3VyQ29udGV4dCwgVmFyLCBTKSkgewotICAgICAgTWFya1ZhckRlY2xPRFJVc2VkKFZhciwgVmFyRXhwci0+Z2V0RXhwckxvYygpLCAKLSAgICAgICAgICBTLCAmRnVuY3Rpb25TY29wZUluZGV4T2ZDYXB0dXJhYmxlTGFtYmRhKTsKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gSWYgd2UgaGF2ZSBhIGNhcHR1cmUtY2FwYWJsZSBsYW1iZGEgZm9yIHRoZSB2YXJpYWJsZSwgZ28gYWhlYWQgYW5kCisgICAgLy8gY2FwdHVyZSB0aGUgdmFyaWFibGUgaW4gdGhhdCBsYW1iZGEgKGFuZCBhbGwgaXRzIGVuY2xvc2luZyBsYW1iZGFzKS4KKyAgICBpZiAoY29uc3QgT3B0aW9uYWw8dW5zaWduZWQ+IEluZGV4ID0KKyAgICAgICAgICAgIGdldFN0YWNrSW5kZXhPZk5lYXJlc3RFbmNsb3NpbmdDYXB0dXJlQ2FwYWJsZUxhbWJkYSgKKyAgICAgICAgICAgICAgICBGdW5jdGlvblNjb3Blc0FycmF5UmVmLCBWYXIsIFMpKSB7CisgICAgICBjb25zdCB1bnNpZ25lZCBGdW5jdGlvblNjb3BlSW5kZXhPZkNhcHR1cmFibGVMYW1iZGEgPSBJbmRleC5nZXRWYWx1ZSgpOworICAgICAgTWFya1ZhckRlY2xPRFJVc2VkKFZhciwgVmFyRXhwci0+Z2V0RXhwckxvYygpLCBTLAorICAgICAgICAgICAgICAgICAgICAgICAgICZGdW5jdGlvblNjb3BlSW5kZXhPZkNhcHR1cmFibGVMYW1iZGEpOwogICAgIH0gCiAgICAgY29uc3QgYm9vbCBJc1Zhck5ldmVyQUNvbnN0YW50RXhwcmVzc2lvbiA9IAogICAgICAgICBWYXJpYWJsZUNhbk5ldmVyQmVBQ29uc3RhbnRFeHByZXNzaW9uKFZhciwgUy5Db250ZXh0KTsKQEAgLTU5MTIsMTYgKzU5MDksMjEgQEAKICAgICB9CiAgIH0KIAorICAvLyBDaGVjayBpZiAndGhpcycgbmVlZHMgdG8gYmUgY2FwdHVyZWQuCiAgIGlmIChDdXJyZW50TFNJLT5oYXNQb3RlbnRpYWxUaGlzQ2FwdHVyZSgpKSB7Ci0gICAgdW5zaWduZWQgRnVuY3Rpb25TY29wZUluZGV4T2ZDYXB0dXJhYmxlTGFtYmRhID0gMDsKLSAgICBpZiAoR2V0SW5uZXJtb3N0RW5jbG9zaW5nQ2FwdHVyYWJsZUxhbWJkYSgKLSAgICAgICAgICAgIFMuRnVuY3Rpb25TY29wZXMsIEZ1bmN0aW9uU2NvcGVJbmRleE9mQ2FwdHVyYWJsZUxhbWJkYSwKLSAgICAgICAgICAgIFMuQ3VyQ29udGV4dCwgLyowIGlzICd0aGlzJyovIDAsIFMpKSB7Ci0gICAgICBTLkNoZWNrQ1hYVGhpc0NhcHR1cmUoQ3VycmVudExTSS0+UG90ZW50aWFsVGhpc0NhcHR1cmVMb2NhdGlvbiwgCi0gICAgICAgICAgLypFeHBsaWNpdCovZmFsc2UsIC8qQnVpbGRBbmREaWFnbm9zZSovdHJ1ZSwgIAotICAgICAgICAgICZGdW5jdGlvblNjb3BlSW5kZXhPZkNhcHR1cmFibGVMYW1iZGEpOworICAgIC8vIElmIHdlIGhhdmUgYSBjYXB0dXJlLWNhcGFibGUgbGFtYmRhIGZvciAndGhpcycsIGdvIGFoZWFkIGFuZCBjYXB0dXJlCisgICAgLy8gJ3RoaXMnIGluIHRoYXQgbGFtYmRhIChhbmQgYWxsIGl0cyBlbmNsb3NpbmcgbGFtYmRhcykuCisgICAgaWYgKGNvbnN0IE9wdGlvbmFsPHVuc2lnbmVkPiBJbmRleCA9CisgICAgICAgICAgICBnZXRTdGFja0luZGV4T2ZOZWFyZXN0RW5jbG9zaW5nQ2FwdHVyZUNhcGFibGVMYW1iZGEoCisgICAgICAgICAgICAgICAgRnVuY3Rpb25TY29wZXNBcnJheVJlZiwgLyowIGlzICd0aGlzJyovIDAsIFMpKSB7CisgICAgICBjb25zdCB1bnNpZ25lZCBGdW5jdGlvblNjb3BlSW5kZXhPZkNhcHR1cmFibGVMYW1iZGEgPSBJbmRleC5nZXRWYWx1ZSgpOworICAgICAgUy5DaGVja0NYWFRoaXNDYXB0dXJlKEN1cnJlbnRMU0ktPlBvdGVudGlhbFRoaXNDYXB0dXJlTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypFeHBsaWNpdCovIGZhbHNlLCAvKkJ1aWxkQW5kRGlhZ25vc2UqLyB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZGdW5jdGlvblNjb3BlSW5kZXhPZkNhcHR1cmFibGVMYW1iZGEpOwogICAgIH0KICAgfQorCisgIC8vIFJlc2V0IGFsbCB0aGUgcG90ZW50aWFsIGNhcHR1cmVzIGF0IHRoZSBlbmQgb2YgZWFjaCBmdWxsLWV4cHJlc3Npb24uCiAgIEN1cnJlbnRMU0ktPmNsZWFyUG90ZW50aWFsQ2FwdHVyZXMoKTsKIH0KIApAQCAtNjAxOCwxMSArNjAyMCwxMiBAQAogICAvLyAgICAgRnVuY3Rpb25TY29wZXMuc2l6ZSgpIGluIEluc3RhbnRpYXRpbmdUZW1wbGF0ZSdzIAogICAvLyAgICAgY29uc3RydWN0b3IvZGVzdHJ1Y3Rvci4KICAgLy8gIC0gVGVhY2ggdGhlIGhhbmRmdWwgb2YgcGxhY2VzIHRoYXQgaXRlcmF0ZSBvdmVyIEZ1bmN0aW9uU2NvcGVzIHRvIAotICAvLyAgICBzdG9wIGF0IHRoZSBvdXRlcm1vc3QgZW5jbG9zaW5nIGxleGljYWwgc2NvcGUuIiAKLSAgY29uc3QgYm9vbCBJc0luTGFtYmRhRGVjbENvbnRleHQgPSBpc0xhbWJkYUNhbGxPcGVyYXRvcihDdXJDb250ZXh0KTsgCi0gIGlmIChJc0luTGFtYmRhRGVjbENvbnRleHQgJiYgQ3VycmVudExTSSAmJiAKKyAgLy8gICAgc3RvcCBhdCB0aGUgb3V0ZXJtb3N0IGVuY2xvc2luZyBsZXhpY2FsIHNjb3BlLiIKKyAgY29uc3QgYm9vbCBJc0luTGFtYmRhRGVjbENvbnRleHQgPSBpc0xhbWJkYUNhbGxPcGVyYXRvcihDdXJDb250ZXh0KTsKKyAgaWYgKElzSW5MYW1iZGFEZWNsQ29udGV4dCAmJiBDdXJyZW50TFNJICYmCiAgICAgICBDdXJyZW50TFNJLT5oYXNQb3RlbnRpYWxDYXB0dXJlcygpICYmICFGdWxsRXhwci5pc0ludmFsaWQoKSkKLSAgICBDaGVja0xhbWJkYUNhcHR1cmVzKEZFLCBDdXJyZW50TFNJLCAqdGhpcyk7CisgICAgQ2hlY2tJZkFueUVuY2xvc2luZ0xhbWJkYXNNdXN0Q2FwdHVyZUFueVBvdGVudGlhbENhcHR1cmVzKEZFLCBDdXJyZW50TFNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGhpcyk7CiAgIHJldHVybiBNYXliZUNyZWF0ZUV4cHJXaXRoQ2xlYW51cHMoRnVsbEV4cHIpOwogfQogCmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hRXhwck1lbWJlci5jcHAgYi9saWIvU2VtYS9TZW1hRXhwck1lbWJlci5jcHAKaW5kZXggMDgwN2U4Zi4uYzRhMTc4MCAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYUV4cHJNZW1iZXIuY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFFeHByTWVtYmVyLmNwcApAQCAtMzIyLDggKzMyMiw2IEBACiAgICAgICAgICAgICAgKElkeCA9IHZlY1R5cGUtPmdldFBvaW50QWNjZXNzb3JJZHgoKmNvbXBTdHIpKSAhPSAtMSkgewogICAgIGJvb2wgSGFzUkdCQSA9IElzUkdCQSgqY29tcFN0cik7CiAgICAgZG8gewotICAgICAgLy8gSWYgd2UgbWl4L21hdGNoIHJnYmEgd2l0aCB4eXp3LCBicmVhayB0byBzaWduYWwgdGhhdCB3ZSBlbmNvdW50ZXJlZAotICAgICAgLy8gYW4gaWxsZWdhbCBuYW1lLgogICAgICAgaWYgKEhhc1JHQkEgIT0gSXNSR0JBKCpjb21wU3RyKSkKICAgICAgICAgYnJlYWs7CiAgICAgICBpZiAoSGFzSW5kZXhbSWR4XSkgSGFzUmVwZWF0ZWQgPSB0cnVlOwpAQCAtNDAzLDkgKzQwMSw4IEBACiAgIGlmIChPYmpDTWV0aG9kRGVjbCAqT01EID0gUERlY2wtPmdldEluc3RhbmNlTWV0aG9kKFNlbCkpCiAgICAgcmV0dXJuIE9NRDsKIAotICBmb3IgKE9iakNQcm90b2NvbERlY2w6OnByb3RvY29sX2l0ZXJhdG9yIEkgPSBQRGVjbC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICBFID0gUERlY2wtPnByb3RvY29sX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGlmIChEZWNsICpEID0gRmluZEdldHRlclNldHRlck5hbWVEZWNsRnJvbVByb3RvY29sTGlzdCgqSSwgTWVtYmVyLCBTZWwsCisgIGZvciAoY29uc3QgYXV0byAqSSA6IFBEZWNsLT5wcm90b2NvbHMoKSkgeworICAgIGlmIChEZWNsICpEID0gRmluZEdldHRlclNldHRlck5hbWVEZWNsRnJvbVByb3RvY29sTGlzdChJLCBNZW1iZXIsIFNlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCkpCiAgICAgICByZXR1cm4gRDsKICAgfQpAQCAtNDE4LDI1ICs0MTUsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUQ29udGV4dCAmQ29udGV4dCkgewogICAvLyBDaGVjayBwcm90b2NvbHMgb24gcXVhbGlmaWVkIGludGVyZmFjZXMuCiAgIERlY2wgKkdEZWNsID0gMDsKLSAgZm9yIChPYmpDT2JqZWN0UG9pbnRlclR5cGU6OnF1YWxfaXRlcmF0b3IgSSA9IFFJZFR5LT5xdWFsX2JlZ2luKCksCi0gICAgICAgRSA9IFFJZFR5LT5xdWFsX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBRSWRUeS0+cXVhbHMoKSkgewogICAgIGlmIChNZW1iZXIpCi0gICAgICBpZiAoT2JqQ1Byb3BlcnR5RGVjbCAqUEQgPSAoKkkpLT5GaW5kUHJvcGVydHlEZWNsYXJhdGlvbihNZW1iZXIpKSB7CisgICAgICBpZiAoT2JqQ1Byb3BlcnR5RGVjbCAqUEQgPSBJLT5GaW5kUHJvcGVydHlEZWNsYXJhdGlvbihNZW1iZXIpKSB7CiAgICAgICAgIEdEZWNsID0gUEQ7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIC8vIEFsc28gbXVzdCBsb29rIGZvciBhIGdldHRlciBvciBzZXR0ZXIgbmFtZSB3aGljaCB1c2VzIHByb3BlcnR5IHN5bnRheC4KLSAgICBpZiAoT2JqQ01ldGhvZERlY2wgKk9NRCA9ICgqSSktPmdldEluc3RhbmNlTWV0aG9kKFNlbCkpIHsKKyAgICBpZiAoT2JqQ01ldGhvZERlY2wgKk9NRCA9IEktPmdldEluc3RhbmNlTWV0aG9kKFNlbCkpIHsKICAgICAgIEdEZWNsID0gT01EOwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAgIGlmICghR0RlY2wpIHsKLSAgICBmb3IgKE9iakNPYmplY3RQb2ludGVyVHlwZTo6cXVhbF9pdGVyYXRvciBJID0gUUlkVHktPnF1YWxfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBRSWRUeS0+cXVhbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBRSWRUeS0+cXVhbHMoKSkgewogICAgICAgLy8gU2VhcmNoIGluIHRoZSBwcm90b2NvbC1xdWFsaWZpZXIgbGlzdCBvZiBjdXJyZW50IHByb3RvY29sLgotICAgICAgR0RlY2wgPSBGaW5kR2V0dGVyU2V0dGVyTmFtZURlY2xGcm9tUHJvdG9jb2xMaXN0KCpJLCBNZW1iZXIsIFNlbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCk7CisgICAgICBHRGVjbCA9IEZpbmRHZXR0ZXJTZXR0ZXJOYW1lRGVjbEZyb21Qcm90b2NvbExpc3QoSSwgTWVtYmVyLCBTZWwsIENvbnRleHQpOwogICAgICAgaWYgKEdEZWNsKQogICAgICAgICByZXR1cm4gR0RlY2w7CiAgICAgfQpAQCAtNTY1LDcgKzU1OSw3IEBACiAgIGV4cGxpY2l0IFJlY29yZE1lbWJlckV4cHJWYWxpZGF0b3JDQ0MoY29uc3QgUmVjb3JkVHlwZSAqUlR5KQogICAgICAgOiBSZWNvcmQoUlR5LT5nZXREZWNsKCkpIHt9CiAKLSAgdmlydHVhbCBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIHsKKyAgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSBvdmVycmlkZSB7CiAgICAgTmFtZWREZWNsICpORCA9IGNhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uRGVjbCgpOwogICAgIC8vIERvbid0IGFjY2VwdCBjYW5kaWRhdGVzIHRoYXQgY2Fubm90IGJlIG1lbWJlciBmdW5jdGlvbnMsIGNvbnN0YW50cywKICAgICAvLyB2YXJpYWJsZXMsIG9yIHRlbXBsYXRlcy4KQEAgLTU3OCwxMSArNTcyLDkgQEAKIAogICAgIGlmIChjb25zdCBDWFhSZWNvcmREZWNsICpSRCA9IGR5bl9jYXN0PENYWFJlY29yZERlY2w+KFJlY29yZCkpIHsKICAgICAgIC8vIEFjY2VwdCBjYW5kaWRhdGVzIHRoYXQgb2NjdXIgaW4gYW55IG9mIHRoZSBjdXJyZW50IGNsYXNzJyBiYXNlIGNsYXNzZXMuCi0gICAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgQlMgPSBSRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCU0VuZCA9IFJELT5iYXNlc19lbmQoKTsKLSAgICAgICAgICAgQlMgIT0gQlNFbmQ7ICsrQlMpIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmQlMgOiBSRC0+YmFzZXMoKSkgewogICAgICAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqQlNUeSA9IGR5bl9jYXN0X29yX251bGw8UmVjb3JkVHlwZT4oCi0gICAgICAgICAgICAgICAgQlMtPmdldFR5cGUoKS5nZXRUeXBlUHRyT3JOdWxsKCkpKSB7CisgICAgICAgICAgICAgICAgQlMuZ2V0VHlwZSgpLmdldFR5cGVQdHJPck51bGwoKSkpIHsKICAgICAgICAgICBpZiAoQlNUeS0+Z2V0RGVjbCgpLT5jb250YWluc0RlY2woTkQpKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTgzMCw4ICs4MjIsNiBAQAogICAgIGlmICghcmVzdWx0KQogICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogCi0gICAgYmFzZU9iamVjdElzUG9pbnRlciA9IGZhbHNlOwotICAgIAogICAgIC8vIEZJWE1FOiBjaGVjayBxdWFsaWZpZWQgbWVtYmVyIGFjY2VzcwogICB9CiAgIApAQCAtMTY0Nyw4ICsxNjM3LDcgQEAKICAgYm9vbCBJc0Fycm93ID0gKE9wS2luZCA9PSB0b2s6OmFycm93KTsKIAogICBOYW1lZERlY2wgKkZpcnN0UXVhbGlmaWVySW5TY29wZQotICAgID0gKCFTUy5pc1NldCgpID8gMCA6IEZpbmRGaXJzdFF1YWxpZmllckluU2NvcGUoUywKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TmVzdGVkTmFtZVNwZWNpZmllcio+KFNTLmdldFNjb3BlUmVwKCkpKSk7CisgICAgPSAoIVNTLmlzU2V0KCkgPyAwIDogRmluZEZpcnN0UXVhbGlmaWVySW5TY29wZShTLCBTUy5nZXRTY29wZVJlcCgpKSk7CiAKICAgLy8gVGhpcyBpcyBhIHBvc3RmaXggZXhwcmVzc2lvbiwgc28gZ2V0IHJpZCBvZiBQYXJlbkxpc3RFeHBycy4KICAgRXhwclJlc3VsdCBSZXN1bHQgPSBNYXliZUNvbnZlcnRQYXJlbkxpc3RFeHByVG9QYXJlbkV4cHIoUywgQmFzZSk7CkBAIC0xNzcyLDE0ICsxNzYxLDcgQEAKICAgYXNzZXJ0KCFSLmVtcHR5KCkgJiYgIVIuaXNBbWJpZ3VvdXMoKSk7CiAgIAogICBTb3VyY2VMb2NhdGlvbiBsb2MgPSBSLmdldE5hbWVMb2MoKTsKLSAgCi0gIC8vIFdlIG1heSBoYXZlIGZvdW5kIGEgZmllbGQgd2l0aGluIGFuIGFub255bW91cyB1bmlvbiBvciBzdHJ1Y3QKLSAgLy8gKEMrKyBbY2xhc3MudW5pb25dKS4KLSAgLy8gRklYTUU6IHRlbXBsYXRlLWlkcyBpbnNpZGUgYW5vbnltb3VzIHN0cnVjdHM/Ci0gIGlmIChJbmRpcmVjdEZpZWxkRGVjbCAqRkQgPSBSLmdldEFzU2luZ2xlPEluZGlyZWN0RmllbGREZWNsPigpKQotICAgIHJldHVybiBCdWlsZEFub255bW91c1N0cnVjdFVuaW9uTWVtYmVyUmVmZXJlbmNlKFNTLCBSLmdldE5hbWVMb2MoKSwgRkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5iZWdpbigpLmdldFBhaXIoKSk7Ci0gIAorCiAgIC8vIElmIHRoaXMgaXMga25vd24gdG8gYmUgYW4gaW5zdGFuY2UgYWNjZXNzLCBnbyBhaGVhZCBhbmQgYnVpbGQgYW4KICAgLy8gaW1wbGljaXQgJ3RoaXMnIGV4cHJlc3Npb24gbm93LgogICAvLyAndGhpcycgZXhwcmVzc2lvbiBub3cuCmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hRXhwck9iakMuY3BwIGIvbGliL1NlbWEvU2VtYUV4cHJPYmpDLmNwcAppbmRleCBjYzhlYWNlLi41YmZmZGQxIDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hRXhwck9iakMuY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFFeHByT2JqQy5jcHAKQEAgLTY3LDEwICs2NywxNCBAQAogCiAgICAgLy8gQ3JlYXRlIHRoZSBhZ2dyZWdhdGUgc3RyaW5nIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbnRlbnQgYW5kIGxvY2F0aW9uCiAgICAgLy8gaW5mb3JtYXRpb24uCi0gICAgUyA9IFN0cmluZ0xpdGVyYWw6OkNyZWF0ZShDb250ZXh0LCBTdHJCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsOjpBc2NpaSwgLypQYXNjYWw9Ki9mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuZ2V0UG9pbnRlclR5cGUoQ29udGV4dC5DaGFyVHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0ckxvY3NbMF0sIFN0ckxvY3Muc2l6ZSgpKTsKKyAgICBjb25zdCBDb25zdGFudEFycmF5VHlwZSAqQ0FUID0gQ29udGV4dC5nZXRBc0NvbnN0YW50QXJyYXlUeXBlKFMtPmdldFR5cGUoKSk7CisgICAgYXNzZXJ0KENBVCAmJiAiU3RyaW5nIGxpdGVyYWwgbm90IG9mIGNvbnN0YW50IGFycmF5IHR5cGUhIik7CisgICAgUXVhbFR5cGUgU3RyVHkgPSBDb250ZXh0LmdldENvbnN0YW50QXJyYXlUeXBlKAorICAgICAgICBDQVQtPmdldEVsZW1lbnRUeXBlKCksIGxsdm06OkFQSW50KDMyLCBTdHJCdWYuc2l6ZSgpICsgMSksCisgICAgICAgIENBVC0+Z2V0U2l6ZU1vZGlmaWVyKCksIENBVC0+Z2V0SW5kZXhUeXBlQ1ZSUXVhbGlmaWVycygpKTsKKyAgICBTID0gU3RyaW5nTGl0ZXJhbDo6Q3JlYXRlKENvbnRleHQsIFN0ckJ1ZiwgU3RyaW5nTGl0ZXJhbDo6QXNjaWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlBhc2NhbD0qL2ZhbHNlLCBTdHJUeSwgJlN0ckxvY3NbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJMb2NzLnNpemUoKSk7CiAgIH0KICAgCiAgIHJldHVybiBCdWlsZE9iakNTdHJpbmdMaXRlcmFsKEF0TG9jc1swXSwgUyk7CkBAIC0xNTIsNyArMTU2LDcgQEAKICAgfQogCiAgIC8vIE1ha2Ugc3VyZSB0aGUgcmV0dXJuIHR5cGUgaXMgcmVhc29uYWJsZS4KLSAgUXVhbFR5cGUgUmV0dXJuVHlwZSA9IE1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpOworICBRdWFsVHlwZSBSZXR1cm5UeXBlID0gTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCk7CiAgIGlmICghUmV0dXJuVHlwZS0+aXNPYmpDT2JqZWN0UG9pbnRlclR5cGUoKSkgewogICAgIFMuRGlhZyhMb2MsIGRpYWc6OmVycl9vYmpjX2xpdGVyYWxfbWV0aG9kX3NpZykKICAgICAgIDw8IFNlbDsKQEAgLTIyNCwxNiArMjI4LDE1IEBACiAgIE9iakNNZXRob2REZWNsICpNZXRob2QgPSBTLk5TTnVtYmVyRGVjbC0+bG9va3VwQ2xhc3NNZXRob2QoU2VsKTsKICAgaWYgKCFNZXRob2QgJiYgUy5nZXRMYW5nT3B0cygpLkRlYnVnZ2VyT2JqQ0xpdGVyYWwpIHsKICAgICAvLyBjcmVhdGUgYSBzdHViIGRlZmluaXRpb24gdGhpcyBOU051bWJlciBmYWN0b3J5IG1ldGhvZC4KLSAgICBUeXBlU291cmNlSW5mbyAqUmVzdWx0VEluZm8gPSAwOwotICAgIE1ldGhvZCA9IE9iakNNZXRob2REZWNsOjpDcmVhdGUoQ1gsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIFNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuTlNOdW1iZXJQb2ludGVyLCBSZXN1bHRUSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuTlNOdW1iZXJEZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc0luc3RhbmNlPSovZmFsc2UsIC8qaXNWYXJpYWRpYz0qL2ZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc1Byb3BlcnR5QWNjZXNzb3I9Ki9mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNJbXBsaWNpdGx5RGVjbGFyZWQ9Ki90cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc0RlZmluZWQ9Ki9mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsOjpSZXF1aXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSGFzUmVsYXRlZFJlc3VsdFR5cGU9Ki9mYWxzZSk7CisgICAgVHlwZVNvdXJjZUluZm8gKlJldHVyblRJbmZvID0gMDsKKyAgICBNZXRob2QgPQorICAgICAgICBPYmpDTWV0aG9kRGVjbDo6Q3JlYXRlKENYLCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5OU051bWJlclBvaW50ZXIsIFJldHVyblRJbmZvLCBTLk5TTnVtYmVyRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzSW5zdGFuY2U9Ki9mYWxzZSwgLyppc1ZhcmlhZGljPSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc1Byb3BlcnR5QWNjZXNzb3I9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzSW1wbGljaXRseURlY2xhcmVkPSovdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzRGVmaW5lZD0qL2ZhbHNlLCBPYmpDTWV0aG9kRGVjbDo6UmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypIYXNSZWxhdGVkUmVzdWx0VHlwZT0qL2ZhbHNlKTsKICAgICBQYXJtVmFyRGVjbCAqdmFsdWUgPSBQYXJtVmFyRGVjbDo6Q3JlYXRlKFMuQ29udGV4dCwgTWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDWC5JZGVudHMuZ2V0KCJ2YWx1ZSIpLApAQCAtNDkyLDE3ICs0OTUsMTUgQEAKICAgICAgICAgQm94aW5nTWV0aG9kID0gTlNTdHJpbmdEZWNsLT5sb29rdXBDbGFzc01ldGhvZChzdHJpbmdXaXRoVVRGOFN0cmluZyk7CiAgICAgICAgIGlmICghQm94aW5nTWV0aG9kICYmIGdldExhbmdPcHRzKCkuRGVidWdnZXJPYmpDTGl0ZXJhbCkgewogICAgICAgICAgIC8vIERlYnVnZ2VyIG5lZWRzIHRvIHdvcmsgZXZlbiBpZiBOU1N0cmluZyBoYXNuJ3QgYmVlbiBkZWZpbmVkLgotICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpSZXN1bHRUSW5mbyA9IDA7Ci0gICAgICAgICAgT2JqQ01ldGhvZERlY2wgKk0gPQotICAgICAgICAgICAgT2JqQ01ldGhvZERlY2w6OkNyZWF0ZShDb250ZXh0LCBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdXaXRoVVRGOFN0cmluZywgTlNTdHJpbmdQb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRUSW5mbywgTlNTdHJpbmdEZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzSW5zdGFuY2U9Ki9mYWxzZSwgLyppc1ZhcmlhZGljPSovZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNQcm9wZXJ0eUFjY2Vzc29yPSovZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNJbXBsaWNpdGx5RGVjbGFyZWQ9Ki90cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzRGVmaW5lZD0qL2ZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTWV0aG9kRGVjbDo6UmVxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSGFzUmVsYXRlZFJlc3VsdFR5cGU9Ki9mYWxzZSk7CisgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlJldHVyblRJbmZvID0gMDsKKyAgICAgICAgICBPYmpDTWV0aG9kRGVjbCAqTSA9IE9iakNNZXRob2REZWNsOjpDcmVhdGUoCisgICAgICAgICAgICAgIENvbnRleHQsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIHN0cmluZ1dpdGhVVEY4U3RyaW5nLAorICAgICAgICAgICAgICBOU1N0cmluZ1BvaW50ZXIsIFJldHVyblRJbmZvLCBOU1N0cmluZ0RlY2wsCisgICAgICAgICAgICAgIC8qaXNJbnN0YW5jZT0qL2ZhbHNlLCAvKmlzVmFyaWFkaWM9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgLyppc1Byb3BlcnR5QWNjZXNzb3I9Ki9mYWxzZSwKKyAgICAgICAgICAgICAgLyppc0ltcGxpY2l0bHlEZWNsYXJlZD0qL3RydWUsCisgICAgICAgICAgICAgIC8qaXNEZWZpbmVkPSovZmFsc2UsIE9iakNNZXRob2REZWNsOjpSZXF1aXJlZCwKKyAgICAgICAgICAgICAgLypIYXNSZWxhdGVkUmVzdWx0VHlwZT0qL2ZhbHNlKTsKICAgICAgICAgICBRdWFsVHlwZSBDb25zdENoYXJUeXBlID0gQ29udGV4dC5DaGFyVHkud2l0aENvbnN0KCk7CiAgICAgICAgICAgUGFybVZhckRlY2wgKnZhbHVlID0KICAgICAgICAgICAgIFBhcm1WYXJEZWNsOjpDcmVhdGUoQ29udGV4dCwgTSwKQEAgLTY2MCwxNyArNjYxLDE0IEBACiAgICAgICBTZWwgPSBOU0FQSU9iai0+Z2V0TlNBcnJheVNlbGVjdG9yKE5TQVBJOjpOU0Fycl9hcnJheVdpdGhPYmplY3RzQ291bnQpOwogICAgIE9iakNNZXRob2REZWNsICpNZXRob2QgPSBOU0FycmF5RGVjbC0+bG9va3VwQ2xhc3NNZXRob2QoU2VsKTsKICAgICBpZiAoIU1ldGhvZCAmJiBnZXRMYW5nT3B0cygpLkRlYnVnZ2VyT2JqQ0xpdGVyYWwpIHsKLSAgICAgIFR5cGVTb3VyY2VJbmZvICpSZXN1bHRUSW5mbyA9IDA7Ci0gICAgICBNZXRob2QgPSBPYmpDTWV0aG9kRGVjbDo6Q3JlYXRlKENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCBTZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJZFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRUSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypJbnN0YW5jZSovLCBmYWxzZS8qaXNWYXJpYWRpYyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc1Byb3BlcnR5QWNjZXNzb3I9Ki9mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNJbXBsaWNpdGx5RGVjbGFyZWQ9Ki90cnVlLCAvKmlzRGVmaW5lZD0qL2ZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ01ldGhvZERlY2w6OlJlcXVpcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgVHlwZVNvdXJjZUluZm8gKlJldHVyblRJbmZvID0gMDsKKyAgICAgIE1ldGhvZCA9IE9iakNNZXRob2REZWNsOjpDcmVhdGUoCisgICAgICAgICAgQ29udGV4dCwgU291cmNlTG9jYXRpb24oKSwgU291cmNlTG9jYXRpb24oKSwgU2VsLCBJZFQsIFJldHVyblRJbmZvLAorICAgICAgICAgIENvbnRleHQuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpLCBmYWxzZSAvKkluc3RhbmNlKi8sCisgICAgICAgICAgZmFsc2UgLyppc1ZhcmlhZGljKi8sCisgICAgICAgICAgLyppc1Byb3BlcnR5QWNjZXNzb3I9Ki9mYWxzZSwKKyAgICAgICAgICAvKmlzSW1wbGljaXRseURlY2xhcmVkPSovdHJ1ZSwgLyppc0RlZmluZWQ9Ki9mYWxzZSwKKyAgICAgICAgICBPYmpDTWV0aG9kRGVjbDo6UmVxdWlyZWQsIGZhbHNlKTsKICAgICAgIFNtYWxsVmVjdG9yPFBhcm1WYXJEZWNsICosIDI+IFBhcmFtczsKICAgICAgIFBhcm1WYXJEZWNsICpvYmplY3RzID0gUGFybVZhckRlY2w6OkNyZWF0ZShDb250ZXh0LCBNZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwKQEAgLTk3NSw2ICs5NzMsNTggQEAKICAgcmV0dXJuIEJ1aWxkT2JqQ0VuY29kZUV4cHJlc3Npb24oQXRMb2MsIFRJbmZvLCBSUGFyZW5Mb2MpOwogfQogCitzdGF0aWMgYm9vbCBIZWxwZXJUb0RpYWdub3NlTWlzbWF0Y2hlZE1ldGhvZHNJbkdsb2JhbFBvb2woU2VtYSAmUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gQXRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2RMaXN0ICZNZXRoTGlzdCkgeworICBPYmpDTWV0aG9kTGlzdCAqTSA9ICZNZXRoTGlzdDsKKyAgYm9vbCBXYXJuZWQgPSBmYWxzZTsKKyAgZm9yIChNID0gTS0+Z2V0TmV4dCgpOyBNOyBNPU0tPmdldE5leHQoKSkgeworICAgIE9iakNNZXRob2REZWNsICpNYXRjaGluZ01ldGhvZERlY2wgPSBNLT5NZXRob2Q7CisgICAgaWYgKE1hdGNoaW5nTWV0aG9kRGVjbCA9PSBNZXRob2QgfHwKKyAgICAgICAgaXNhPE9iakNJbXBsRGVjbD4oTWF0Y2hpbmdNZXRob2REZWNsLT5nZXREZWNsQ29udGV4dCgpKSB8fAorICAgICAgICBNYXRjaGluZ01ldGhvZERlY2wtPmdldFNlbGVjdG9yKCkgIT0gTWV0aG9kLT5nZXRTZWxlY3RvcigpKQorICAgICAgY29udGludWU7CisgICAgaWYgKCFTLk1hdGNoVHdvTWV0aG9kRGVjbGFyYXRpb25zKE1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0Y2hpbmdNZXRob2REZWNsLCBTZW1hOjpNTVNfbG9vc2UpKSB7CisgICAgICBpZiAoIVdhcm5lZCkgeworICAgICAgICBXYXJuZWQgPSB0cnVlOworICAgICAgICBTLkRpYWcoQXRMb2MsIGRpYWc6Ondhcm5pbmdfbXVsdGlwbGVfc2VsZWN0b3JzKQorICAgICAgICAgIDw8IE1ldGhvZC0+Z2V0U2VsZWN0b3IoKTsKKyAgICAgICAgUy5EaWFnKE1ldGhvZC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9tZXRob2RfZGVjbGFyZWRfYXQpCisgICAgICAgICAgPDwgTWV0aG9kLT5nZXREZWNsTmFtZSgpOworICAgICAgfQorICAgICAgUy5EaWFnKE1hdGNoaW5nTWV0aG9kRGVjbC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9tZXRob2RfZGVjbGFyZWRfYXQpCisgICAgICAgIDw8IE1hdGNoaW5nTWV0aG9kRGVjbC0+Z2V0RGVjbE5hbWUoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFdhcm5lZDsKK30KKworc3RhdGljIHZvaWQgRGlhZ25vc2VNaXNtYXRjaGVkU2VsZWN0b3JzKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIEF0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsICpNZXRob2QpIHsKKyAgaWYgKFMuRGlhZ3MuZ2V0RGlhZ25vc3RpY0xldmVsKGRpYWc6Ondhcm5pbmdfbXVsdGlwbGVfc2VsZWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSkKKyAgICAgICAgPT0gRGlhZ25vc3RpY3NFbmdpbmU6Oklnbm9yZWQpCisgICAgcmV0dXJuOworICBib29sIFdhcm5lZCA9IGZhbHNlOworICBmb3IgKFNlbWE6Okdsb2JhbE1ldGhvZFBvb2w6Oml0ZXJhdG9yIGIgPSBTLk1ldGhvZFBvb2wuYmVnaW4oKSwKKyAgICAgICBlID0gUy5NZXRob2RQb29sLmVuZCgpOyBiICE9IGU7IGIrKykgeworICAgIC8vIGZpcnN0LCBpbnN0YW5jZSBtZXRob2RzCisgICAgT2JqQ01ldGhvZExpc3QgJkluc3RNZXRoTGlzdCA9IGItPnNlY29uZC5maXJzdDsKKyAgICBpZiAoSGVscGVyVG9EaWFnbm9zZU1pc21hdGNoZWRNZXRob2RzSW5HbG9iYWxQb29sKFMsIEF0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kLCBJbnN0TWV0aExpc3QpKQorICAgICAgV2FybmVkID0gdHJ1ZTsKKyAgICAgICAgCisgICAgLy8gc2Vjb25kLCBjbGFzcyBtZXRob2RzCisgICAgT2JqQ01ldGhvZExpc3QgJkNsc01ldGhMaXN0ID0gYi0+c2Vjb25kLnNlY29uZDsKKyAgICBpZiAoSGVscGVyVG9EaWFnbm9zZU1pc21hdGNoZWRNZXRob2RzSW5HbG9iYWxQb29sKFMsIEF0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kLCBDbHNNZXRoTGlzdCkgfHwKKyAgICAgICAgV2FybmVkKQorICAgICAgcmV0dXJuOworICB9Cit9CisKIEV4cHJSZXN1bHQgU2VtYTo6UGFyc2VPYmpDU2VsZWN0b3JFeHByZXNzaW9uKFNlbGVjdG9yIFNlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0TG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU2VsTG9jLApAQCAtOTk2LDcgKzEwNDYsOCBAQAogICAgICAgCiAgICAgfSBlbHNlCiAgICAgICAgIERpYWcoU2VsTG9jLCBkaWFnOjp3YXJuX3VuZGVjbGFyZWRfc2VsZWN0b3IpIDw8IFNlbDsKLSAgfQorICB9IGVsc2UKKyAgICBEaWFnbm9zZU1pc21hdGNoZWRTZWxlY3RvcnMoKnRoaXMsIEF0TG9jLCBNZXRob2QpOwogICAKICAgaWYgKCFNZXRob2QgfHwKICAgICAgIE1ldGhvZC0+Z2V0SW1wbGVtZW50YXRpb25Db250cm9sKCkgIT0gT2JqQ01ldGhvZERlY2w6Ok9wdGlvbmFsKSB7CkBAIC0xMTIwLDcgKzExNzEsOCBAQAogc3RhdGljIGNvbnN0IE9iakNNZXRob2REZWNsICoKIGZpbmRFeHBsaWNpdEluc3RhbmNldHlwZURlY2xhcmVyKGNvbnN0IE9iakNNZXRob2REZWNsICpNRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIGluc3RhbmNldHlwZSkgewotICBpZiAoTUQtPmdldFJlc3VsdFR5cGUoKSA9PSBpbnN0YW5jZXR5cGUpIHJldHVybiBNRDsKKyAgaWYgKE1ELT5nZXRSZXR1cm5UeXBlKCkgPT0gaW5zdGFuY2V0eXBlKQorICAgIHJldHVybiBNRDsKIAogICAvLyBGb3IgdGhlc2UgcHVycG9zZXMsIGEgbWV0aG9kIGluIGFuIEBpbXBsZW1lbnRhdGlvbiBvdmVycmlkZXMgYQogICAvLyBkZWNsYXJhdGlvbiBpbiB0aGUgQGludGVyZmFjZS4KQEAgLTExNTUsNyArMTIwNyw3IEBACiAgIC8vIHR5cGUgZG9lc24ndCBtYXRjaCB0aGUgbWV0aG9kJ3MgZGVjbGFyZWQgcmV0dXJuIHR5cGUuCiAgIE9iakNNZXRob2REZWNsICpNRCA9IGR5bl9jYXN0PE9iakNNZXRob2REZWNsPihDdXJDb250ZXh0KTsKICAgaWYgKCFNRCB8fCAhTUQtPmhhc1JlbGF0ZWRSZXN1bHRUeXBlKCkgfHwKLSAgICAgIENvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShkZXN0VHlwZSwgTUQtPmdldFJlc3VsdFR5cGUoKSkpCisgICAgICBDb250ZXh0Lmhhc1NhbWVVbnF1YWxpZmllZFR5cGUoZGVzdFR5cGUsIE1ELT5nZXRSZXR1cm5UeXBlKCkpKQogICAgIHJldHVybjsKIAogICAvLyBMb29rIGZvciBhIG1ldGhvZCBvdmVycmlkZGVuIGJ5IHRoaXMgbWV0aG9kIHdoaWNoIGV4cGxpY2l0bHkgdXNlcwpAQCAtMTE2NCw3ICsxMjE2LDcgQEAKICAgICAgICAgZmluZEV4cGxpY2l0SW5zdGFuY2V0eXBlRGVjbGFyZXIoTUQsIENvbnRleHQuZ2V0T2JqQ0luc3RhbmNlVHlwZSgpKSkgewogICAgIFNvdXJjZUxvY2F0aW9uIGxvYzsKICAgICBTb3VyY2VSYW5nZSByYW5nZTsKLSAgICBpZiAoVHlwZVNvdXJjZUluZm8gKlRTSSA9IG92ZXJyaWRkZW4tPmdldFJlc3VsdFR5cGVTb3VyY2VJbmZvKCkpIHsKKyAgICBpZiAoVHlwZVNvdXJjZUluZm8gKlRTSSA9IG92ZXJyaWRkZW4tPmdldFJldHVyblR5cGVTb3VyY2VJbmZvKCkpIHsKICAgICAgIHJhbmdlID0gVFNJLT5nZXRUeXBlTG9jKCkuZ2V0U291cmNlUmFuZ2UoKTsKICAgICAgIGxvYyA9IHJhbmdlLmdldEJlZ2luKCk7CiAgICAgfQpAQCAtMTE5NSwxMyArMTI0NywxMiBAQAogICAKICAgaWYgKCFNZXRob2QtPmhhc1JlbGF0ZWRSZXN1bHRUeXBlKCkpCiAgICAgcmV0dXJuOwotICAKLSAgaWYgKENvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShNZXRob2QtPmdldFJlc3VsdFR5cGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1zZ1NlbmQtPmdldFR5cGUoKSkpCisKKyAgaWYgKENvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZSgKKyAgICAgICAgICBNZXRob2QtPmdldFJldHVyblR5cGUoKS5nZXROb25SZWZlcmVuY2VUeXBlKCksIE1zZ1NlbmQtPmdldFR5cGUoKSkpCiAgICAgcmV0dXJuOwotICAKLSAgaWYgKCFDb250ZXh0Lmhhc1NhbWVVbnF1YWxpZmllZFR5cGUoTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCksIAorCisgIGlmICghQ29udGV4dC5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKE1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LmdldE9iakNJbnN0YW5jZVR5cGUoKSkpCiAgICAgcmV0dXJuOwogICAKQEAgLTEyODcsNyArMTMzOCw3IEBACiAKICAgUmV0dXJuVHlwZSA9IGdldE1lc3NhZ2VTZW5kUmVzdWx0VHlwZShSZWNlaXZlclR5cGUsIE1ldGhvZCwgaXNDbGFzc01lc3NhZ2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3VwZXJNZXNzYWdlKTsKLSAgVksgPSBFeHByOjpnZXRWYWx1ZUtpbmRGb3JUeXBlKE1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpKTsKKyAgVksgPSBFeHByOjpnZXRWYWx1ZUtpbmRGb3JUeXBlKE1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpKTsKIAogICB1bnNpZ25lZCBOdW1OYW1lZEFyZ3MgPSBTZWwuZ2V0TnVtQXJncygpOwogICAvLyBNZXRob2QgbWlnaHQgaGF2ZSBtb3JlIGFyZ3VtZW50cyB0aGFuIHNlbGVjdG9yIGluZGljYXRlcy4gVGhpcyBpcyBkdWUKQEAgLTEzODAsMTAgKzE0MzEsMTQgQEAKICAgcmV0dXJuIElzRXJyb3I7CiB9CiAKLWJvb2wgU2VtYTo6aXNTZWxmRXhwcihFeHByICpyZWNlaXZlcikgeworYm9vbCBTZW1hOjppc1NlbGZFeHByKEV4cHIgKlJFeHByKSB7CiAgIC8vICdzZWxmJyBpcyBvYmpjICdzZWxmJyBpbiBhbiBvYmpjIG1ldGhvZCBvbmx5LgotICBPYmpDTWV0aG9kRGVjbCAqbWV0aG9kID0KLSAgICBkeW5fY2FzdF9vcl9udWxsPE9iakNNZXRob2REZWNsPihDdXJDb250ZXh0LT5nZXROb25DbG9zdXJlQW5jZXN0b3IoKSk7CisgIE9iakNNZXRob2REZWNsICpNZXRob2QgPQorICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxPYmpDTWV0aG9kRGVjbD4oQ3VyQ29udGV4dC0+Z2V0Tm9uQ2xvc3VyZUFuY2VzdG9yKCkpOworICByZXR1cm4gaXNTZWxmRXhwcihSRXhwciwgTWV0aG9kKTsKK30KKworYm9vbCBTZW1hOjppc1NlbGZFeHByKEV4cHIgKnJlY2VpdmVyLCBjb25zdCBPYmpDTWV0aG9kRGVjbCAqbWV0aG9kKSB7CiAgIGlmICghbWV0aG9kKSByZXR1cm4gZmFsc2U7CiAKICAgcmVjZWl2ZXIgPSByZWNlaXZlci0+SWdub3JlUGFyZW5MVmFsdWVDYXN0cygpOwpAQCAtMTQwOSw5ICsxNDY0LDggQEAKICAgfQogCiAgIC8vIENoZWNrIHF1YWxpZmllcnMuCi0gIGZvciAoT2JqQ09iamVjdFR5cGU6OnF1YWxfaXRlcmF0b3IKLSAgICAgICAgIGkgPSBvYmpUeXBlLT5xdWFsX2JlZ2luKCksIGUgPSBvYmpUeXBlLT5xdWFsX2VuZCgpOyBpICE9IGU7ICsraSkKLSAgICBpZiAoT2JqQ01ldGhvZERlY2wgKm1ldGhvZCA9ICgqaSktPmxvb2t1cE1ldGhvZChzZWwsIGlzSW5zdGFuY2UpKQorICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBvYmpUeXBlLT5xdWFscygpKQorICAgIGlmIChPYmpDTWV0aG9kRGVjbCAqbWV0aG9kID0gSS0+bG9va3VwTWV0aG9kKHNlbCwgaXNJbnN0YW5jZSkpCiAgICAgICByZXR1cm4gbWV0aG9kOwogCiAgIHJldHVybiAwOwpAQCAtMTQyNCw5ICsxNDc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluc3RhbmNlKQogewogICBPYmpDTWV0aG9kRGVjbCAqTUQgPSAwOwotICBmb3IgKE9iakNPYmplY3RQb2ludGVyVHlwZTo6cXVhbF9pdGVyYXRvciBJID0gT1BULT5xdWFsX2JlZ2luKCksCi0gICAgICAgRSA9IE9QVC0+cXVhbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBPYmpDUHJvdG9jb2xEZWNsICpQUk9UTyA9ICgqSSk7CisgIGZvciAoY29uc3QgYXV0byAqUFJPVE8gOiBPUFQtPnF1YWxzKCkpIHsKICAgICBpZiAoKE1EID0gUFJPVE8tPmxvb2t1cE1ldGhvZChTZWwsIEluc3RhbmNlKSkpIHsKICAgICAgIHJldHVybiBNRDsKICAgICB9CkBAIC0xNDUyLDcgKzE1MDQsNyBAQAogICAgICAgaWYgKFBSRS0+aXNJbXBsaWNpdFByb3BlcnR5KCkpIHsKICAgICAgICAgR0RlY2wgPSBQUkUtPmdldEltcGxpY2l0UHJvcGVydHlHZXR0ZXIoKTsKICAgICAgICAgaWYgKEdEZWNsKSB7Ci0gICAgICAgICAgVCA9IEdEZWNsLT5nZXRSZXN1bHRUeXBlKCk7CisgICAgICAgICAgVCA9IEdEZWNsLT5nZXRSZXR1cm5UeXBlKCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGVsc2UgewpAQCAtMTUzNSw5ICsxNTg3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyTG9jLCBCYXNlRXhwcikpOwogICB9CiAgIC8vIENoZWNrIHByb3RvY29scyBvbiBxdWFsaWZpZWQgaW50ZXJmYWNlcy4KLSAgZm9yIChPYmpDT2JqZWN0UG9pbnRlclR5cGU6OnF1YWxfaXRlcmF0b3IgSSA9IE9QVC0+cXVhbF9iZWdpbigpLAotICAgICAgIEUgPSBPUFQtPnF1YWxfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgIGlmIChPYmpDUHJvcGVydHlEZWNsICpQRCA9ICgqSSktPkZpbmRQcm9wZXJ0eURlY2xhcmF0aW9uKE1lbWJlcikpIHsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogT1BULT5xdWFscygpKQorICAgIGlmIChPYmpDUHJvcGVydHlEZWNsICpQRCA9IEktPkZpbmRQcm9wZXJ0eURlY2xhcmF0aW9uKE1lbWJlcikpIHsKICAgICAgIC8vIENoZWNrIHdoZXRoZXIgd2UgY2FuIHJlZmVyZW5jZSB0aGlzIHByb3BlcnR5LgogICAgICAgaWYgKERpYWdub3NlVXNlT2ZEZWNsKFBELCBNZW1iZXJMb2MpKQogICAgICAgICByZXR1cm4gRXhwckVycm9yKCk7CkBAIC0xNjk5LDcgKzE3NTAsOCBAQAogICAgIH0KICAgICAKICAgICBpZiAoSUZhY2UgPT0gMCkgewotICAgICAgRGlhZyhyZWNlaXZlck5hbWVMb2MsIGRpYWc6OmVycl9leHBlY3RlZF9pZGVudF9vcl9scGFyZW4pOworICAgICAgRGlhZyhyZWNlaXZlck5hbWVMb2MsIGRpYWc6OmVycl9leHBlY3RlZF9laXRoZXIpIDw8IHRvazo6aWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRvazo6bF9wYXJlbjsKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgICB9CiAgIH0KQEAgLTE3NzMsNyArMTgyNSw3IEBACiAgICAgICBXYW50T2JqQ1N1cGVyID0gTWV0aG9kLT5nZXRDbGFzc0ludGVyZmFjZSgpLT5nZXRTdXBlckNsYXNzKCk7CiAgIH0KIAotICB2aXJ0dWFsIGJvb2wgVmFsaWRhdGVDYW5kaWRhdGUoY29uc3QgVHlwb0NvcnJlY3Rpb24gJmNhbmRpZGF0ZSkgeworICBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIG92ZXJyaWRlIHsKICAgICByZXR1cm4gY2FuZGlkYXRlLmdldENvcnJlY3Rpb25EZWNsQXM8T2JqQ0ludGVyZmFjZURlY2w+KCkgfHwKICAgICAgICAgY2FuZGlkYXRlLmlzS2V5d29yZCgic3VwZXIiKTsKICAgfQpAQCAtMjExMCw4ICsyMTYyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSwgVkspKQogICAgIHJldHVybiBFeHByRXJyb3IoKTsKIAotICBpZiAoTWV0aG9kICYmICFNZXRob2QtPmdldFJlc3VsdFR5cGUoKS0+aXNWb2lkVHlwZSgpICYmCi0gICAgICBSZXF1aXJlQ29tcGxldGVUeXBlKExCcmFjTG9jLCBNZXRob2QtPmdldFJlc3VsdFR5cGUoKSwgCisgIGlmIChNZXRob2QgJiYgIU1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWRUeXBlKCkgJiYKKyAgICAgIFJlcXVpcmVDb21wbGV0ZVR5cGUoTEJyYWNMb2MsIE1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfaWxsZWdhbF9tZXNzYWdlX2V4cHJfaW5jb21wbGV0ZV90eXBlKSkKICAgICByZXR1cm4gRXhwckVycm9yKCk7CiAKQEAgLTI0NDcsNiArMjQ5OSw1MiBAQAogICAgIH0KICAgfQogCisgIEZ1bmN0aW9uU2NvcGVJbmZvICpESUZ1bmN0aW9uU2NvcGVJbmZvID0KKyAgICAoTWV0aG9kICYmIE1ldGhvZC0+Z2V0TWV0aG9kRmFtaWx5KCkgPT0gT01GX2luaXQpCisgICAgICA/IGdldEVuY2xvc2luZ0Z1bmN0aW9uKCkgOiAwOworICAKKyAgaWYgKERJRnVuY3Rpb25TY29wZUluZm8gJiYKKyAgICAgIERJRnVuY3Rpb25TY29wZUluZm8tPk9iakNJc0Rlc2lnbmF0ZWRJbml0ICYmCisgICAgICAoU3VwZXJMb2MuaXNWYWxpZCgpIHx8IGlzU2VsZkV4cHIoUmVjZWl2ZXIpKSkgeworICAgIGJvb2wgaXNEZXNpZ25hdGVkSW5pdENoYWluID0gZmFsc2U7CisgICAgaWYgKFN1cGVyTG9jLmlzVmFsaWQoKSkgeworICAgICAgaWYgKGNvbnN0IE9iakNPYmplY3RQb2ludGVyVHlwZSAqCisgICAgICAgICAgICBPQ0lUeXBlID0gUmVjZWl2ZXJUeXBlLT5nZXRBc09iakNJbnRlcmZhY2VQb2ludGVyVHlwZSgpKSB7CisgICAgICAgIGlmIChjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUQgPSBPQ0lUeXBlLT5nZXRJbnRlcmZhY2VEZWNsKCkpIHsKKyAgICAgICAgICAvLyBFaXRoZXIgd2Uga25vdyB0aGlzIGlzIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciBvciB3ZQorICAgICAgICAgIC8vIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSBpdCBiZWNhdXNlIHdlIGRvbid0IGtub3cgZm9yIHN1cmUuCisgICAgICAgICAgaWYgKCFJRC0+ZGVjbGFyZXNPckluaGVyaXRzRGVzaWduYXRlZEluaXRpYWxpemVycygpIHx8CisgICAgICAgICAgICAgIElELT5pc0Rlc2lnbmF0ZWRJbml0aWFsaXplcihTZWwpKSB7CisgICAgICAgICAgICBpc0Rlc2lnbmF0ZWRJbml0Q2hhaW4gPSB0cnVlOworICAgICAgICAgICAgRElGdW5jdGlvblNjb3BlSW5mby0+T2JqQ1dhcm5Gb3JOb0Rlc2lnbmF0ZWRJbml0Q2hhaW4gPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpc0Rlc2lnbmF0ZWRJbml0Q2hhaW4pIHsKKyAgICAgIGNvbnN0IE9iakNNZXRob2REZWNsICpJbml0TWV0aG9kID0gMDsKKyAgICAgIGJvb2wgaXNEZXNpZ25hdGVkID0KKyAgICAgICAgZ2V0Q3VyTWV0aG9kRGVjbCgpLT5pc0Rlc2lnbmF0ZWRJbml0aWFsaXplckZvclRoZUludGVyZmFjZSgmSW5pdE1ldGhvZCk7CisgICAgICBhc3NlcnQoaXNEZXNpZ25hdGVkICYmIEluaXRNZXRob2QpOworICAgICAgKHZvaWQpaXNEZXNpZ25hdGVkOworICAgICAgRGlhZyhTZWxMb2MsIFN1cGVyTG9jLmlzVmFsaWQoKSA/CisgICAgICAgICAgICAgZGlhZzo6d2Fybl9vYmpjX2Rlc2lnbmF0ZWRfaW5pdF9ub25fZGVzaWduYXRlZF9pbml0X2NhbGwgOgorICAgICAgICAgICAgIGRpYWc6Ondhcm5fb2JqY19kZXNpZ25hdGVkX2luaXRfbm9uX3N1cGVyX2Rlc2lnbmF0ZWRfaW5pdF9jYWxsKTsKKyAgICAgIERpYWcoSW5pdE1ldGhvZC0+Z2V0TG9jYXRpb24oKSwKKyAgICAgICAgICAgZGlhZzo6bm90ZV9vYmpjX2Rlc2lnbmF0ZWRfaW5pdF9tYXJrZWRfaGVyZSk7CisgICAgfQorICB9CisKKyAgaWYgKERJRnVuY3Rpb25TY29wZUluZm8gJiYKKyAgICAgIERJRnVuY3Rpb25TY29wZUluZm8tPk9iakNJc1NlY29uZGFyeUluaXQgJiYKKyAgICAgIChTdXBlckxvYy5pc1ZhbGlkKCkgfHwgaXNTZWxmRXhwcihSZWNlaXZlcikpKSB7CisgICAgaWYgKFN1cGVyTG9jLmlzVmFsaWQoKSkgeworICAgICAgRGlhZyhTZWxMb2MsIGRpYWc6Ondhcm5fb2JqY19zZWNvbmRhcnlfaW5pdF9zdXBlcl9pbml0X2NhbGwpOworICAgIH0gZWxzZSB7CisgICAgICBESUZ1bmN0aW9uU2NvcGVJbmZvLT5PYmpDV2FybkZvck5vSW5pdERlbGVnYXRpb24gPSBmYWxzZTsKKyAgICB9CisgIH0KKwogICAvLyBDaGVjayB0aGUgbWVzc2FnZSBhcmd1bWVudHMuCiAgIHVuc2lnbmVkIE51bUFyZ3MgPSBBcmdzSW4uc2l6ZSgpOwogICBFeHByICoqQXJncyA9IEFyZ3NJbi5kYXRhKCk7CkBAIC0yNDU5LDkgKzI1NTcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc01lc3NhZ2UsIFN1cGVyTG9jLmlzVmFsaWQoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExCcmFjTG9jLCBSQnJhY0xvYywgUmV0dXJuVHlwZSwgVkspKQogICAgIHJldHVybiBFeHByRXJyb3IoKTsKLSAgCi0gIGlmIChNZXRob2QgJiYgIU1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpLT5pc1ZvaWRUeXBlKCkgJiYKLSAgICAgIFJlcXVpcmVDb21wbGV0ZVR5cGUoTEJyYWNMb2MsIE1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpLCAKKworICBpZiAoTWV0aG9kICYmICFNZXRob2QtPmdldFJldHVyblR5cGUoKS0+aXNWb2lkVHlwZSgpICYmCisgICAgICBSZXF1aXJlQ29tcGxldGVUeXBlKExCcmFjTG9jLCBNZXRob2QtPmdldFJldHVyblR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX2lsbGVnYWxfbWVzc2FnZV9leHByX2luY29tcGxldGVfdHlwZSkpCiAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogCkBAIC0yNjAwLDcgKzI2OTgsNyBAQAogICAgICAgfQogICAgIH0KICAgfQotICAgICAgCisgIAogICByZXR1cm4gTWF5YmVCaW5kVG9UZW1wb3JhcnkoUmVzdWx0KTsKIH0KIApAQCAtMjg1OSw3ICsyOTU3LDcgQEAKIAogICAgIEFDQ1Jlc3VsdCBjaGVja0NhbGxUb0Z1bmN0aW9uKEZ1bmN0aW9uRGVjbCAqZm4pIHsKICAgICAgIC8vIFJlcXVpcmUgYSBDRipSZWYgcmV0dXJuIHR5cGUuCi0gICAgICBpZiAoIWlzQ0ZUeXBlKGZuLT5nZXRSZXN1bHRUeXBlKCkpKQorICAgICAgaWYgKCFpc0NGVHlwZShmbi0+Z2V0UmV0dXJuVHlwZSgpKSkKICAgICAgICAgcmV0dXJuIEFDQ19pbnZhbGlkOwogCiAgICAgICBpZiAoIWlzQW55UmV0YWluYWJsZShUYXJnZXRDbGFzcykpCkBAIC0yOTEyLDcgKzMwMTAsNyBAQAogICAgICAgLy8gQ2hlY2sgZm9yIG1lc3NhZ2Ugc2VuZHMgdG8gZnVuY3Rpb25zIHJldHVybmluZyBDRiB0eXBlcy4gIFdlCiAgICAgICAvLyBqdXN0IG9iZXkgdGhlIENvY29hIGNvbnZlbnRpb25zIHdpdGggdGhlc2UsIGV2ZW4gdGhvdWdoIHRoZQogICAgICAgLy8gcmV0dXJuIHR5cGUgaXMgQ0YuCi0gICAgICBpZiAoIWlzQW55UmV0YWluYWJsZShUYXJnZXRDbGFzcykgfHwgIWlzQ0ZUeXBlKG1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpKSkKKyAgICAgIGlmICghaXNBbnlSZXRhaW5hYmxlKFRhcmdldENsYXNzKSB8fCAhaXNDRlR5cGUobWV0aG9kLT5nZXRSZXR1cm5UeXBlKCkpKQogICAgICAgICByZXR1cm4gQUNDX2ludmFsaWQ7CiAgICAgICAKICAgICAgIC8vIElmIHRoZSBtZXRob2QgaXMgZXhwbGljaXRseSBtYXJrZWQgbm90LXJldGFpbmVkLCBpdCdzICswLgpAQCAtMzA0NSw2ICszMTQzLDMxIEBACiAgIH0KIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIFQgKmdldE9iakNCcmlkZ2VBdHRyKGNvbnN0IFR5cGVkZWZUeXBlICpURCkgeworICBUeXBlZGVmTmFtZURlY2wgKlRETkRlY2wgPSBURC0+Z2V0RGVjbCgpOworICBRdWFsVHlwZSBRVCA9IFRETkRlY2wtPmdldFVuZGVybHlpbmdUeXBlKCk7CisgIGlmIChRVC0+aXNQb2ludGVyVHlwZSgpKSB7CisgICAgUVQgPSBRVC0+Z2V0UG9pbnRlZVR5cGUoKTsKKyAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBRVC0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkKKyAgICAgIGlmIChSZWNvcmREZWNsICpSRCA9IFJULT5nZXREZWNsKCkpCisgICAgICAgIHJldHVybiBSRC0+Z2V0QXR0cjxUPigpOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyICpPYmpDQnJpZGdlUmVsYXRlZEF0dHJGcm9tVHlwZShRdWFsVHlwZSBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRlZk5hbWVEZWNsIComVERORGVjbCkgeworICB3aGlsZSAoY29uc3QgVHlwZWRlZlR5cGUgKlREID0gZHluX2Nhc3Q8VHlwZWRlZlR5cGU+KFQuZ2V0VHlwZVB0cigpKSkgeworICAgIFRETkRlY2wgPSBURC0+Z2V0RGVjbCgpOworICAgIGlmIChPYmpDQnJpZGdlUmVsYXRlZEF0dHIgKk9iakNCQXR0ciA9CisgICAgICAgIGdldE9iakNCcmlkZ2VBdHRyPE9iakNCcmlkZ2VSZWxhdGVkQXR0cj4oVEQpKQorICAgICAgcmV0dXJuIE9iakNCQXR0cjsKKyAgICBUID0gVERORGVjbC0+Z2V0VW5kZXJseWluZ1R5cGUoKTsKKyAgfQorICByZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQKIGRpYWdub3NlT2JqQ0FSQ0NvbnZlcnNpb24oU2VtYSAmUywgU291cmNlUmFuZ2UgY2FzdFJhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBjYXN0VHlwZSwgQVJDQ29udmVyc2lvblR5cGVDbGFzcyBjYXN0QUNUQywKQEAgLTMwNTksNiArMzE4MiwxMiBAQAogICAgIHJldHVybjsKIAogICBRdWFsVHlwZSBjYXN0RXhwclR5cGUgPSBjYXN0RXhwci0+Z2V0VHlwZSgpOworICBUeXBlZGVmTmFtZURlY2wgKlRETkRlY2wgPSAwOworICBpZiAoKGNhc3RBQ1RDID09IEFDVENfY29yZUZvdW5kYXRpb24gJiYgIGV4cHJBQ1RDID09IEFDVENfcmV0YWluYWJsZSAmJgorICAgICAgIE9iakNCcmlkZ2VSZWxhdGVkQXR0ckZyb21UeXBlKGNhc3RUeXBlLCBURE5EZWNsKSkgfHwKKyAgICAgIChleHByQUNUQyA9PSBBQ1RDX2NvcmVGb3VuZGF0aW9uICYmIGNhc3RBQ1RDID09IEFDVENfcmV0YWluYWJsZSAmJgorICAgICAgIE9iakNCcmlkZ2VSZWxhdGVkQXR0ckZyb21UeXBlKGNhc3RFeHByVHlwZSwgVERORGVjbCkpKQorICAgIHJldHVybjsKICAgCiAgIHVuc2lnbmVkIHNyY0tpbmQgPSAwOwogICBzd2l0Y2ggKGV4cHJBQ1RDKSB7CkBAIC0zMTY1LDI0ICszMjk0LDEyIEBACiAgICAgPDwgY2FzdFJhbmdlIDw8IGNhc3RFeHByLT5nZXRTb3VyY2VSYW5nZSgpOwogfQogCi1zdGF0aWMgaW5saW5lIE9iakNCcmlkZ2VBdHRyICpnZXRPYmpDQnJpZGdlQXR0cihjb25zdCBUeXBlZGVmVHlwZSAqVEQpIHsKLSAgVHlwZWRlZk5hbWVEZWNsICpURE5EZWNsID0gVEQtPmdldERlY2woKTsKLSAgUXVhbFR5cGUgUVQgPSBURE5EZWNsLT5nZXRVbmRlcmx5aW5nVHlwZSgpOwotICBpZiAoUVQtPmlzUG9pbnRlclR5cGUoKSkgewotICAgIFFUID0gUVQtPmdldFBvaW50ZWVUeXBlKCk7Ci0gICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKlJUID0gUVQtPmdldEFzPFJlY29yZFR5cGU+KCkpCi0gICAgICBpZiAoUmVjb3JkRGVjbCAqUkQgPSBSVC0+Z2V0RGVjbCgpKQotICAgICAgICBpZiAoUkQtPmhhc0F0dHI8T2JqQ0JyaWRnZUF0dHI+KCkpCi0gICAgICAgICAgcmV0dXJuIFJELT5nZXRBdHRyPE9iakNCcmlkZ2VBdHRyPigpOwotICB9Ci0gIHJldHVybiAwOwotfQotCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVEI+CiBzdGF0aWMgYm9vbCBDaGVja09iakNCcmlkZ2VOU0Nhc3QoU2VtYSAmUywgUXVhbFR5cGUgY2FzdFR5cGUsIEV4cHIgKmNhc3RFeHByKSB7CiAgIFF1YWxUeXBlIFQgPSBjYXN0RXhwci0+Z2V0VHlwZSgpOwogICB3aGlsZSAoY29uc3QgVHlwZWRlZlR5cGUgKlREID0gZHluX2Nhc3Q8VHlwZWRlZlR5cGU+KFQuZ2V0VHlwZVB0cigpKSkgewogICAgIFR5cGVkZWZOYW1lRGVjbCAqVERORGVjbCA9IFRELT5nZXREZWNsKCk7Ci0gICAgaWYgKE9iakNCcmlkZ2VBdHRyICpPYmpDQkF0dHIgPSBnZXRPYmpDQnJpZGdlQXR0cihURCkpIHsKKyAgICBpZiAoVEIgKk9iakNCQXR0ciA9IGdldE9iakNCcmlkZ2VBdHRyPFRCPihURCkpIHsKICAgICAgIGlmIChJZGVudGlmaWVySW5mbyAqUGFybSA9IE9iakNCQXR0ci0+Z2V0QnJpZGdlZFR5cGUoKSkgewogICAgICAgICBOYW1lZERlY2wgKlRhcmdldCA9IDA7CiAgICAgICAgIC8vIENoZWNrIGZvciBhbiBleGlzdGluZyB0eXBlIHdpdGggdGhpcyBuYW1lLgpAQCAtMzE5NiwyMCArMzMxMywzMCBAQAogICAgICAgICAgICAgICAgICAgY2FzdFR5cGUtPmdldEFzT2JqQ0ludGVyZmFjZVBvaW50ZXJUeXBlKCkpIHsKICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKkNhc3RDbGFzcwogICAgICAgICAgICAgICAgID0gSW50ZXJmYWNlUG9pbnRlclR5cGUtPmdldE9iamVjdFR5cGUoKS0+Z2V0SW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgIGlmICgoQ2FzdENsYXNzID09IEV4cHJDbGFzcykgfHwgKENhc3RDbGFzcyAmJiBFeHByQ2xhc3MtPmlzU3VwZXJDbGFzc09mKENhc3RDbGFzcykpKQorICAgICAgICAgICAgICBpZiAoKENhc3RDbGFzcyA9PSBFeHByQ2xhc3MpIHx8CisgICAgICAgICAgICAgICAgICAoQ2FzdENsYXNzICYmIEV4cHJDbGFzcy0+aXNTdXBlckNsYXNzT2YoQ2FzdENsYXNzKSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgIFMuRGlhZyhjYXN0RXhwci0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6d2Fybl9vYmpjX2ludmFsaWRfYnJpZGdlKQogICAgICAgICAgICAgICAgIDw8IFQgPDwgVGFyZ2V0LT5nZXROYW1lKCkgPDwgY2FzdFR5cGUtPmdldFBvaW50ZWVUeXBlKCk7CiAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FzdFR5cGUtPmlzT2JqQ0lkVHlwZSgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChTLkNvbnRleHQuT2JqQ09iamVjdEFkb3B0c1FUeXBlUHJvdG9jb2xzKAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0VHlwZSwgRXhwckNsYXNzKSkpCisgICAgICAgICAgICAgIC8vIG9rIHRvIGNhc3QgdG8gJ2lkJy4KKyAgICAgICAgICAgICAgLy8gY2FzdGluZyB0byBpZDxwLWxpc3Q+IGlzIG9rIGlmIGJyaWRnZSB0eXBlIGFkb3B0cyBhbGwgb2YKKyAgICAgICAgICAgICAgLy8gcC1saXN0IHByb3RvY29scy4KKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgUy5EaWFnKGNhc3RFeHByLT5nZXRMb2NTdGFydCgpLCBkaWFnOjp3YXJuX29iamNfaW52YWxpZF9icmlkZ2UpCiAgICAgICAgICAgICAgICAgPDwgVCA8PCBUYXJnZXQtPmdldE5hbWUoKSA8PCBjYXN0VHlwZTsKKyAgICAgICAgICAgICAgUy5EaWFnKFRETkRlY2wtPmdldExvY1N0YXJ0KCksIGRpYWc6Om5vdGVfZGVjbGFyZWRfYXQpOworICAgICAgICAgICAgICBTLkRpYWcoVGFyZ2V0LT5nZXRMb2NTdGFydCgpLCBkaWFnOjpub3RlX2RlY2xhcmVkX2F0KTsKICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgUy5EaWFnKGNhc3RFeHByLT5nZXRMb2NTdGFydCgpLCBkaWFnOjplcnJfb2JqY19jZl9icmlkZ2VkX25vdF9pbnRlcmZhY2UpCi0gICAgICAgIDw8IGNhc3RFeHByLT5nZXRUeXBlKCkgPDwgUGFybS0+Z2V0TmFtZSgpOworICAgICAgICAgIDw8IGNhc3RFeHByLT5nZXRUeXBlKCkgPDwgUGFybTsKICAgICAgICAgUy5EaWFnKFRETkRlY2wtPmdldExvY1N0YXJ0KCksIGRpYWc6Om5vdGVfZGVjbGFyZWRfYXQpOwogICAgICAgICBpZiAoVGFyZ2V0KQogICAgICAgICAgIFMuRGlhZyhUYXJnZXQtPmdldExvY1N0YXJ0KCksIGRpYWc6Om5vdGVfZGVjbGFyZWRfYXQpOwpAQCAtMzIyMSwxMiArMzM0OCwxMiBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLS8vIChDRkVycm9yUmVmKW5zCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVEI+CiBzdGF0aWMgYm9vbCBDaGVja09iakNCcmlkZ2VDRkNhc3QoU2VtYSAmUywgUXVhbFR5cGUgY2FzdFR5cGUsIEV4cHIgKmNhc3RFeHByKSB7CiAgIFF1YWxUeXBlIFQgPSBjYXN0VHlwZTsKICAgd2hpbGUgKGNvbnN0IFR5cGVkZWZUeXBlICpURCA9IGR5bl9jYXN0PFR5cGVkZWZUeXBlPihULmdldFR5cGVQdHIoKSkpIHsKICAgICBUeXBlZGVmTmFtZURlY2wgKlRETkRlY2wgPSBURC0+Z2V0RGVjbCgpOwotICAgIGlmIChPYmpDQnJpZGdlQXR0ciAqT2JqQ0JBdHRyID0gZ2V0T2JqQ0JyaWRnZUF0dHIoVEQpKSB7CisgICAgaWYgKFRCICpPYmpDQkF0dHIgPSBnZXRPYmpDQnJpZGdlQXR0cjxUQj4oVEQpKSB7CiAgICAgICBpZiAoSWRlbnRpZmllckluZm8gKlBhcm0gPSBPYmpDQkF0dHItPmdldEJyaWRnZWRUeXBlKCkpIHsKICAgICAgICAgTmFtZWREZWNsICpUYXJnZXQgPSAwOwogICAgICAgICAvLyBDaGVjayBmb3IgYW4gZXhpc3RpbmcgdHlwZSB3aXRoIHRoaXMgbmFtZS4KQEAgLTMyNDAsMTYgKzMzNjcsMjUgQEAKICAgICAgICAgICAgICAgICAgIGNhc3RFeHByLT5nZXRUeXBlKCktPmdldEFzT2JqQ0ludGVyZmFjZVBvaW50ZXJUeXBlKCkpIHsKICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKkV4cHJDbGFzcwogICAgICAgICAgICAgICAgID0gSW50ZXJmYWNlUG9pbnRlclR5cGUtPmdldE9iamVjdFR5cGUoKS0+Z2V0SW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgIGlmICgoQ2FzdENsYXNzID09IEV4cHJDbGFzcykgfHwgKEV4cHJDbGFzcyAmJiBDYXN0Q2xhc3MtPmlzU3VwZXJDbGFzc09mKEV4cHJDbGFzcykpKQorICAgICAgICAgICAgICBpZiAoKENhc3RDbGFzcyA9PSBFeHByQ2xhc3MpIHx8CisgICAgICAgICAgICAgICAgICAoRXhwckNsYXNzICYmIENhc3RDbGFzcy0+aXNTdXBlckNsYXNzT2YoRXhwckNsYXNzKSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgIFMuRGlhZyhjYXN0RXhwci0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6d2Fybl9vYmpjX2ludmFsaWRfYnJpZGdlX3RvX2NmKQogICAgICAgICAgICAgICAgIDw8IGNhc3RFeHByLT5nZXRUeXBlKCktPmdldFBvaW50ZWVUeXBlKCkgPDwgVDsKICAgICAgICAgICAgICAgUy5EaWFnKFRETkRlY2wtPmdldExvY1N0YXJ0KCksIGRpYWc6Om5vdGVfZGVjbGFyZWRfYXQpOwogICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNhc3RFeHByLT5nZXRUeXBlKCktPmlzT2JqQ0lkVHlwZSgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChTLkNvbnRleHQuUUlkUHJvdG9jb2xzQWRvcHRPYmpDT2JqZWN0UHJvdG9jb2xzKAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0RXhwci0+Z2V0VHlwZSgpLCBDYXN0Q2xhc3MpKSkKKyAgICAgICAgICAgICAgLy8gb2sgdG8gY2FzdCBhbiAnaWQnIGV4cHJlc3Npb24gdG8gYSBDRnR5cGUuCisgICAgICAgICAgICAgIC8vIG9rIHRvIGNhc3QgYW4gJ2lkPHBsaXN0PicgZXhwcmVzc2lvbiB0byBDRnR5cGUgcHJvdmlkZWQgcGxpc3QKKyAgICAgICAgICAgICAgLy8gYWRvcHRzIGFsbCBvZiBDRnR5cGUncyBPYmpldGl2ZUMncyBjbGFzcyBwbGlzdC4KKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgUy5EaWFnKGNhc3RFeHByLT5nZXRMb2NTdGFydCgpLCBkaWFnOjp3YXJuX29iamNfaW52YWxpZF9icmlkZ2VfdG9fY2YpCiAgICAgICAgICAgICAgICAgPDwgY2FzdEV4cHItPmdldFR5cGUoKSA8PCBjYXN0VHlwZTsKICAgICAgICAgICAgICAgUy5EaWFnKFRETkRlY2wtPmdldExvY1N0YXJ0KCksIGRpYWc6Om5vdGVfZGVjbGFyZWRfYXQpOworICAgICAgICAgICAgICBTLkRpYWcoVGFyZ2V0LT5nZXRMb2NTdGFydCgpLCBkaWFnOjpub3RlX2RlY2xhcmVkX2F0KTsKICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQpAQCAtMzI2Nyw2ICszNDAzLDE3MyBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgU2VtYTo6Q2hlY2tUb2xsRnJlZUJyaWRnZUNhc3QoUXVhbFR5cGUgY2FzdFR5cGUsIEV4cHIgKmNhc3RFeHByKSB7CisgIC8vIHdhcm4gaW4gcHJlc2VuY2Ugb2YgX19icmlkZ2UgY2FzdGluZyB0byBvciBmcm9tIGEgdG9sbCBmcmVlIGJyaWRnZSBjYXN0LgorICBBUkNDb252ZXJzaW9uVHlwZUNsYXNzIGV4cHJBQ1RDID0gY2xhc3NpZnlUeXBlRm9yQVJDQ29udmVyc2lvbihjYXN0RXhwci0+Z2V0VHlwZSgpKTsKKyAgQVJDQ29udmVyc2lvblR5cGVDbGFzcyBjYXN0QUNUQyA9IGNsYXNzaWZ5VHlwZUZvckFSQ0NvbnZlcnNpb24oY2FzdFR5cGUpOworICBpZiAoY2FzdEFDVEMgPT0gQUNUQ19yZXRhaW5hYmxlICYmIGV4cHJBQ1RDID09IEFDVENfY29yZUZvdW5kYXRpb24pIHsKKyAgICAodm9pZClDaGVja09iakNCcmlkZ2VOU0Nhc3Q8T2JqQ0JyaWRnZUF0dHI+KCp0aGlzLCBjYXN0VHlwZSwgY2FzdEV4cHIpOworICAgICh2b2lkKUNoZWNrT2JqQ0JyaWRnZU5TQ2FzdDxPYmpDQnJpZGdlTXV0YWJsZUF0dHI+KCp0aGlzLCBjYXN0VHlwZSwgY2FzdEV4cHIpOworICB9CisgIGVsc2UgaWYgKGNhc3RBQ1RDID09IEFDVENfY29yZUZvdW5kYXRpb24gJiYgZXhwckFDVEMgPT0gQUNUQ19yZXRhaW5hYmxlKSB7CisgICAgKHZvaWQpQ2hlY2tPYmpDQnJpZGdlQ0ZDYXN0PE9iakNCcmlkZ2VBdHRyPigqdGhpcywgY2FzdFR5cGUsIGNhc3RFeHByKTsKKyAgICAodm9pZClDaGVja09iakNCcmlkZ2VDRkNhc3Q8T2JqQ0JyaWRnZU11dGFibGVBdHRyPigqdGhpcywgY2FzdFR5cGUsIGNhc3RFeHByKTsKKyAgfQorfQorCisKK2Jvb2wgU2VtYTo6Y2hlY2tPYmpDQnJpZGdlUmVsYXRlZENvbXBvbmVudHMoU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBEZXN0VHlwZSwgUXVhbFR5cGUgU3JjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKiZSZWxhdGVkQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsIComQ2xhc3NNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNNZXRob2REZWNsIComSW5zdGFuY2VNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkZWZOYW1lRGVjbCAqJlRETkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2ZUb05zKSB7CisgIFF1YWxUeXBlIFQgPSBDZlRvTnMgPyBTcmNUeXBlIDogRGVzdFR5cGU7CisgIE9iakNCcmlkZ2VSZWxhdGVkQXR0ciAqT2JqQ0JBdHRyID0gT2JqQ0JyaWRnZVJlbGF0ZWRBdHRyRnJvbVR5cGUoVCwgVERORGVjbCk7CisgIGlmICghT2JqQ0JBdHRyKQorICAgIHJldHVybiBmYWxzZTsKKyAgCisgIElkZW50aWZpZXJJbmZvICpSQ0lkID0gT2JqQ0JBdHRyLT5nZXRSZWxhdGVkQ2xhc3MoKTsKKyAgSWRlbnRpZmllckluZm8gKkNNSWQgPSBPYmpDQkF0dHItPmdldENsYXNzTWV0aG9kKCk7CisgIElkZW50aWZpZXJJbmZvICpJTUlkID0gT2JqQ0JBdHRyLT5nZXRJbnN0YW5jZU1ldGhvZCgpOworICBpZiAoIVJDSWQpCisgICAgcmV0dXJuIGZhbHNlOworICBOYW1lZERlY2wgKlRhcmdldCA9IDA7CisgIC8vIENoZWNrIGZvciBhbiBleGlzdGluZyB0eXBlIHdpdGggdGhpcyBuYW1lLgorICBMb29rdXBSZXN1bHQgUigqdGhpcywgRGVjbGFyYXRpb25OYW1lKFJDSWQpLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICBTZW1hOjpMb29rdXBPcmRpbmFyeU5hbWUpOworICBpZiAoIUxvb2t1cE5hbWUoUiwgVFVTY29wZSkpIHsKKyAgICBEaWFnKExvYywgZGlhZzo6ZXJyX29iamNfYnJpZGdlZF9yZWxhdGVkX2ludmFsaWRfY2xhc3MpIDw8IFJDSWQKKyAgICAgICAgICA8PCBTcmNUeXBlIDw8IERlc3RUeXBlOworICAgIERpYWcoVERORGVjbC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6bm90ZV9kZWNsYXJlZF9hdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFRhcmdldCA9IFIuZ2V0Rm91bmREZWNsKCk7CisgIGlmIChUYXJnZXQgJiYgaXNhPE9iakNJbnRlcmZhY2VEZWNsPihUYXJnZXQpKQorICAgIFJlbGF0ZWRDbGFzcyA9IGNhc3Q8T2JqQ0ludGVyZmFjZURlY2w+KFRhcmdldCk7CisgIGVsc2UgeworICAgIERpYWcoTG9jLCBkaWFnOjplcnJfb2JqY19icmlkZ2VkX3JlbGF0ZWRfaW52YWxpZF9jbGFzc19uYW1lKSA8PCBSQ0lkCisgICAgICAgICAgPDwgU3JjVHlwZSA8PCBEZXN0VHlwZTsKKyAgICBEaWFnKFRETkRlY2wtPmdldExvY1N0YXJ0KCksIGRpYWc6Om5vdGVfZGVjbGFyZWRfYXQpOworICAgIGlmIChUYXJnZXQpCisgICAgICBEaWFnKFRhcmdldC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6bm90ZV9kZWNsYXJlZF9hdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgICAgICAKKyAgLy8gQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIGNsYXNzIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBzZWxlY3RvciBuYW1lLgorICBpZiAoQ2ZUb05zICYmIENNSWQpIHsKKyAgICBTZWxlY3RvciBTZWwgPSBDb250ZXh0LlNlbGVjdG9ycy5nZXRVbmFyeVNlbGVjdG9yKENNSWQpOworICAgIENsYXNzTWV0aG9kID0gUmVsYXRlZENsYXNzLT5sb29rdXBNZXRob2QoU2VsLCBmYWxzZSk7CisgICAgaWYgKCFDbGFzc01ldGhvZCkgeworICAgICAgRGlhZyhMb2MsIGRpYWc6OmVycl9vYmpjX2JyaWRnZWRfcmVsYXRlZF9rbm93bl9tZXRob2QpCisgICAgICAgICAgICA8PCBTcmNUeXBlIDw8IERlc3RUeXBlIDw8IFNlbCA8PCBmYWxzZTsKKyAgICAgIERpYWcoVERORGVjbC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6bm90ZV9kZWNsYXJlZF9hdCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgICAgICAKKyAgLy8gQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIGluc3RhbmNlIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBzZWxlY3RvciBuYW1lLgorICBpZiAoIUNmVG9OcyAmJiBJTUlkKSB7CisgICAgU2VsZWN0b3IgU2VsID0gQ29udGV4dC5TZWxlY3RvcnMuZ2V0TnVsbGFyeVNlbGVjdG9yKElNSWQpOworICAgIEluc3RhbmNlTWV0aG9kID0gUmVsYXRlZENsYXNzLT5sb29rdXBNZXRob2QoU2VsLCB0cnVlKTsKKyAgICBpZiAoIUluc3RhbmNlTWV0aG9kKSB7CisgICAgICBEaWFnKExvYywgZGlhZzo6ZXJyX29iamNfYnJpZGdlZF9yZWxhdGVkX2tub3duX21ldGhvZCkKKyAgICAgICAgICAgIDw8IFNyY1R5cGUgPDwgRGVzdFR5cGUgPDwgU2VsIDw8IHRydWU7CisgICAgICBEaWFnKFRETkRlY2wtPmdldExvY1N0YXJ0KCksIGRpYWc6Om5vdGVfZGVjbGFyZWRfYXQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbAorU2VtYTo6Q2hlY2tPYmpDQnJpZGdlUmVsYXRlZENvbnZlcnNpb25zKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBEZXN0VHlwZSwgUXVhbFR5cGUgU3JjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByIComU3JjRXhwcikgeworICBBUkNDb252ZXJzaW9uVHlwZUNsYXNzIHJoc0V4cHJBQ1RDID0gY2xhc3NpZnlUeXBlRm9yQVJDQ29udmVyc2lvbihTcmNUeXBlKTsKKyAgQVJDQ29udmVyc2lvblR5cGVDbGFzcyBsaHNFeHByQUNUQyA9IGNsYXNzaWZ5VHlwZUZvckFSQ0NvbnZlcnNpb24oRGVzdFR5cGUpOworICBib29sIENmVG9OcyA9IChyaHNFeHByQUNUQyA9PSBBQ1RDX2NvcmVGb3VuZGF0aW9uICYmIGxoc0V4cHJBQ1RDID09IEFDVENfcmV0YWluYWJsZSk7CisgIGJvb2wgTnNUb0NmID0gKHJoc0V4cHJBQ1RDID09IEFDVENfcmV0YWluYWJsZSAmJiBsaHNFeHByQUNUQyA9PSBBQ1RDX2NvcmVGb3VuZGF0aW9uKTsKKyAgaWYgKCFDZlRvTnMgJiYgIU5zVG9DZikKKyAgICByZXR1cm4gZmFsc2U7CisgIAorICBPYmpDSW50ZXJmYWNlRGVjbCAqUmVsYXRlZENsYXNzOworICBPYmpDTWV0aG9kRGVjbCAqQ2xhc3NNZXRob2QgPSAwOworICBPYmpDTWV0aG9kRGVjbCAqSW5zdGFuY2VNZXRob2QgPSAwOworICBUeXBlZGVmTmFtZURlY2wgKlRETkRlY2wgPSAwOworICBpZiAoIWNoZWNrT2JqQ0JyaWRnZVJlbGF0ZWRDb21wb25lbnRzKExvYywgRGVzdFR5cGUsIFNyY1R5cGUsIFJlbGF0ZWRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc01ldGhvZCwgSW5zdGFuY2VNZXRob2QsIFRETkRlY2wsIENmVG9OcykpCisgICAgcmV0dXJuIGZhbHNlOworICAKKyAgaWYgKENmVG9OcykgeworICAgIC8vIEltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBDRiB0byBPYmpDIG9iamVjdCBpcyBuZWVkZWQuCisgICAgaWYgKENsYXNzTWV0aG9kKSB7CisgICAgICBzdGQ6OnN0cmluZyBFeHByZXNzaW9uU3RyaW5nID0gIlsiOworICAgICAgRXhwcmVzc2lvblN0cmluZyArPSBSZWxhdGVkQ2xhc3MtPmdldE5hbWVBc1N0cmluZygpOworICAgICAgRXhwcmVzc2lvblN0cmluZyArPSAiICI7CisgICAgICBFeHByZXNzaW9uU3RyaW5nICs9IENsYXNzTWV0aG9kLT5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCk7CisgICAgICBTb3VyY2VMb2NhdGlvbiBTcmNFeHByRW5kTG9jID0gUFAuZ2V0TG9jRm9yRW5kT2ZUb2tlbihTcmNFeHByLT5nZXRMb2NFbmQoKSk7CisgICAgICAvLyBQcm92aWRlIGEgZml4aXQ6IFtSZWxhdGVkQ2xhc3MgQ2xhc3NNZXRob2QgU3JjRXhwcl0KKyAgICAgIERpYWcoTG9jLCBkaWFnOjplcnJfb2JqY19icmlkZ2VkX3JlbGF0ZWRfa25vd25fbWV0aG9kKQorICAgICAgICA8PCBTcmNUeXBlIDw8IERlc3RUeXBlIDw8IENsYXNzTWV0aG9kLT5nZXRTZWxlY3RvcigpIDw8IGZhbHNlCisgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKFNyY0V4cHItPmdldExvY1N0YXJ0KCksIEV4cHJlc3Npb25TdHJpbmcpCisgICAgICAgIDw8IEZpeEl0SGludDo6Q3JlYXRlSW5zZXJ0aW9uKFNyY0V4cHJFbmRMb2MsICJdIik7CisgICAgICBEaWFnKFJlbGF0ZWRDbGFzcy0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6bm90ZV9kZWNsYXJlZF9hdCk7CisgICAgICBEaWFnKFRETkRlY2wtPmdldExvY1N0YXJ0KCksIGRpYWc6Om5vdGVfZGVjbGFyZWRfYXQpOworICAgICAgCisgICAgICBRdWFsVHlwZSByZWNlaXZlclR5cGUgPQorICAgICAgICBDb250ZXh0LmdldE9iakNJbnRlcmZhY2VUeXBlKFJlbGF0ZWRDbGFzcyk7CisgICAgICAvLyBBcmd1bWVudC4KKyAgICAgIEV4cHIgKmFyZ3NbXSA9IHsgU3JjRXhwciB9OworICAgICAgRXhwclJlc3VsdCBtc2cgPSBCdWlsZENsYXNzTWVzc2FnZUltcGxpY2l0KHJlY2VpdmVyVHlwZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTWV0aG9kLT5nZXRMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc01ldGhvZC0+Z2V0U2VsZWN0b3IoKSwgQ2xhc3NNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpRXhwckFyZyhhcmdzLCAxKSk7CisgICAgICBTcmNFeHByID0gbXNnLnRha2UoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvLyBJbXBsaWNpdCBjb252ZXJzaW9uIGZyb20gT2JqQyB0eXBlIHRvIENGIG9iamVjdCBpcyBuZWVkZWQuCisgICAgaWYgKEluc3RhbmNlTWV0aG9kKSB7CisgICAgICBzdGQ6OnN0cmluZyBFeHByZXNzaW9uU3RyaW5nOworICAgICAgU291cmNlTG9jYXRpb24gU3JjRXhwckVuZExvYyA9IFBQLmdldExvY0ZvckVuZE9mVG9rZW4oU3JjRXhwci0+Z2V0TG9jRW5kKCkpOworICAgICAgaWYgKEluc3RhbmNlTWV0aG9kLT5pc1Byb3BlcnR5QWNjZXNzb3IoKSkKKyAgICAgICAgaWYgKGNvbnN0IE9iakNQcm9wZXJ0eURlY2wgKlBEZWNsID0gSW5zdGFuY2VNZXRob2QtPmZpbmRQcm9wZXJ0eURlY2woKSkgeworICAgICAgICAgIC8vIGZpeGl0OiBPYmplY3RFeHByLnByb3BlcnR5bmFtZSB3aGVuIGl0IGlzICBhcHJvcGVydHkgYWNjZXNzb3IuCisgICAgICAgICAgRXhwcmVzc2lvblN0cmluZyA9ICIuIjsKKyAgICAgICAgICBFeHByZXNzaW9uU3RyaW5nICs9IFBEZWNsLT5nZXROYW1lQXNTdHJpbmcoKTsKKyAgICAgICAgICBEaWFnKExvYywgZGlhZzo6ZXJyX29iamNfYnJpZGdlZF9yZWxhdGVkX2tub3duX21ldGhvZCkKKyAgICAgICAgICA8PCBTcmNUeXBlIDw8IERlc3RUeXBlIDw8IEluc3RhbmNlTWV0aG9kLT5nZXRTZWxlY3RvcigpIDw8IHRydWUKKyAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihTcmNFeHByRW5kTG9jLCBFeHByZXNzaW9uU3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgaWYgKEV4cHJlc3Npb25TdHJpbmcuZW1wdHkoKSkgeworICAgICAgICAvLyBQcm92aWRlIGEgZml4aXQ6IFtPYmplY3RFeHByIEluc3RhbmNlTWV0aG9kXQorICAgICAgICBFeHByZXNzaW9uU3RyaW5nID0gIiAiOworICAgICAgICBFeHByZXNzaW9uU3RyaW5nICs9IEluc3RhbmNlTWV0aG9kLT5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCk7CisgICAgICAgIEV4cHJlc3Npb25TdHJpbmcgKz0gIl0iOworICAgICAgCisgICAgICAgIERpYWcoTG9jLCBkaWFnOjplcnJfb2JqY19icmlkZ2VkX3JlbGF0ZWRfa25vd25fbWV0aG9kKQorICAgICAgICA8PCBTcmNUeXBlIDw8IERlc3RUeXBlIDw8IEluc3RhbmNlTWV0aG9kLT5nZXRTZWxlY3RvcigpIDw8IHRydWUKKyAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVJbnNlcnRpb24oU3JjRXhwci0+Z2V0TG9jU3RhcnQoKSwgIlsiKQorICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZUluc2VydGlvbihTcmNFeHByRW5kTG9jLCBFeHByZXNzaW9uU3RyaW5nKTsKKyAgICAgIH0KKyAgICAgIERpYWcoUmVsYXRlZENsYXNzLT5nZXRMb2NTdGFydCgpLCBkaWFnOjpub3RlX2RlY2xhcmVkX2F0KTsKKyAgICAgIERpYWcoVERORGVjbC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6bm90ZV9kZWNsYXJlZF9hdCk7CisgICAgICAKKyAgICAgIEV4cHJSZXN1bHQgbXNnID0KKyAgICAgICAgQnVpbGRJbnN0YW5jZU1lc3NhZ2VJbXBsaWNpdChTcmNFeHByLCBTcmNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbmNlTWV0aG9kLT5nZXRMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbmNlTWV0aG9kLT5nZXRTZWxlY3RvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbmNlTWV0aG9kLCBOb25lKTsKKyAgICAgIFNyY0V4cHIgPSBtc2cudGFrZSgpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwogU2VtYTo6QVJDQ29udmVyc2lvblJlc3VsdAogU2VtYTo6Q2hlY2tPYmpDQVJDQ29udmVyc2lvbihTb3VyY2VSYW5nZSBjYXN0UmFuZ2UsIFF1YWxUeXBlIGNhc3RUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByIComY2FzdEV4cHIsIENoZWNrZWRDb252ZXJzaW9uS2luZCBDQ0ssCkBAIC0zMzI3LDEyICszNjMwLDE0IEBACiAgIAogICBpZiAoY2FzdEFDVEMgPT0gQUNUQ19yZXRhaW5hYmxlICYmIGV4cHJBQ1RDID09IEFDVENfY29yZUZvdW5kYXRpb24gJiYKICAgICAgIChDQ0sgPT0gQ0NLX0NTdHlsZUNhc3QgfHwgQ0NLID09IENDS19GdW5jdGlvbmFsQ2FzdCkpCi0gICAgaWYgKENoZWNrT2JqQ0JyaWRnZU5TQ2FzdCgqdGhpcywgY2FzdFR5cGUsIGNhc3RFeHByKSkKKyAgICBpZiAoQ2hlY2tPYmpDQnJpZGdlTlNDYXN0PE9iakNCcmlkZ2VBdHRyPigqdGhpcywgY2FzdFR5cGUsIGNhc3RFeHByKSB8fAorICAgICAgICBDaGVja09iakNCcmlkZ2VOU0Nhc3Q8T2JqQ0JyaWRnZU11dGFibGVBdHRyPigqdGhpcywgY2FzdFR5cGUsIGNhc3RFeHByKSkKICAgICAgIHJldHVybiBBQ1Jfb2theTsKICAgICAKICAgaWYgKGNhc3RBQ1RDID09IEFDVENfY29yZUZvdW5kYXRpb24gJiYgZXhwckFDVEMgPT0gQUNUQ19yZXRhaW5hYmxlICYmCiAgICAgICAoQ0NLID09IENDS19DU3R5bGVDYXN0IHx8IENDSyA9PSBDQ0tfRnVuY3Rpb25hbENhc3QpKQotICAgIGlmIChDaGVja09iakNCcmlkZ2VDRkNhc3QoKnRoaXMsIGNhc3RUeXBlLCBjYXN0RXhwcikpCisgICAgaWYgKENoZWNrT2JqQ0JyaWRnZUNGQ2FzdDxPYmpDQnJpZGdlQXR0cj4oKnRoaXMsIGNhc3RUeXBlLCBjYXN0RXhwcikgfHwKKyAgICAgICAgQ2hlY2tPYmpDQnJpZGdlQ0ZDYXN0PE9iakNCcmlkZ2VNdXRhYmxlQXR0cj4oKnRoaXMsIGNhc3RUeXBlLCBjYXN0RXhwcikpCiAgICAgICByZXR1cm4gQUNSX29rYXk7CiAgICAgCiAKQEAgLTMzNjIsNiArMzY2NywxMyBAQAogICAgICAgQ0NLICE9IENDS19JbXBsaWNpdENvbnZlcnNpb24pCiAgICAgcmV0dXJuIEFDUl91bmJyaWRnZWQ7CiAKKyAgLy8gRG8gbm90IGlzc3VlIGJyaWRnZSBjYXN0IiBkaWFnbm9zdGljIHdoZW4gaW1wbGljaXQgY2FzdGluZyBhIGNzdHJpbmcKKyAgLy8gdG8gJ05TU3RyaW5nIConLiBMZXQgY2FsbGVyIGlzc3VlIGEgbm9ybWFsIG1pc21hdGNoZWQgZGlhZ25vc3RpYyB3aXRoCisgIC8vIHN1aXRhYmxlIGZpeC1pdC4KKyAgaWYgKGNhc3RBQ1RDID09IEFDVENfcmV0YWluYWJsZSAmJiBleHByQUNUQyA9PSBBQ1RDX25vbmUgJiYKKyAgICAgIENvbnZlcnNpb25Ub09iakNTdHJpbmdMaXRlcmFsQ2hlY2soY2FzdFR5cGUsIGNhc3RFeHByKSkKKyAgICByZXR1cm4gQUNSX29rYXk7CisgIAogICAvLyBEbyBub3QgaXNzdWUgImJyaWRnZSBjYXN0IiBkaWFnbm9zdGljIHdoZW4gaW1wbGljaXQgY2FzdGluZwogICAvLyBhIHJldGFpbmFibGUgb2JqZWN0IHRvIGEgQ0YgdHlwZSBwYXJhbWV0ZXIgYmVsb25naW5nIHRvIGFuIGF1ZGl0ZWQKICAgLy8gQ0YgQVBJIGZ1bmN0aW9uLiBMZXQgY2FsbGVyIGlzc3VlIGEgbm9ybWFsIHR5cGUgbWlzbWF0Y2hlZCBkaWFnbm9zdGljCkBAIC0zNTk5LDYgKzM5MTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpTdWJFeHByKSB7CiAgIFR5cGVTb3VyY2VJbmZvICpUU0luZm8gPSAwOwogICBRdWFsVHlwZSBUID0gR2V0VHlwZUZyb21QYXJzZXIoVHlwZSwgJlRTSW5mbyk7CisgIGlmIChLaW5kID09IE9CQ19CcmlkZ2UpCisgICAgQ2hlY2tUb2xsRnJlZUJyaWRnZUNhc3QoVCwgU3ViRXhwcik7CiAgIGlmICghVFNJbmZvKQogICAgIFRTSW5mbyA9IENvbnRleHQuZ2V0VHJpdmlhbFR5cGVTb3VyY2VJbmZvKFQsIExQYXJlbkxvYyk7CiAgIHJldHVybiBCdWlsZE9iakNCcmlkZ2VkQ2FzdChMUGFyZW5Mb2MsIEtpbmQsIEJyaWRnZUtleXdvcmRMb2MsIFRTSW5mbywgCmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hSW5pdC5jcHAgYi9saWIvU2VtYS9TZW1hSW5pdC5jcHAKaW5kZXggMDM0YzFiNi4uMzgyOTAxNiAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYUluaXQuY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFJbml0LmNwcApAQCAtNDQxLDI2ICs0NDEsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eSwgSUxFLCBSZXF1aXJlc1NlY29uZFBhc3MpOwogICAgIGVsc2UgaWYgKFJEZWNsLT5pc1VuaW9uKCkgJiYgaXNhPENYWFJlY29yZERlY2w+KFJEZWNsKSAmJgogICAgICAgICAgICAgIGNhc3Q8Q1hYUmVjb3JkRGVjbD4oUkRlY2wpLT5oYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSkgewotICAgICAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGaWVsZCA9IFJEZWNsLT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEVuZCA9IFJEZWNsLT5maWVsZF9lbmQoKTsKLSAgICAgICAgICAgRmllbGQgIT0gRmllbGRFbmQ7ICsrRmllbGQpIHsKKyAgICAgIGZvciAoYXV0byAqRmllbGQgOiBSRGVjbC0+ZmllbGRzKCkpIHsKICAgICAgICAgaWYgKEZpZWxkLT5oYXNJbkNsYXNzSW5pdGlhbGl6ZXIoKSkgewotICAgICAgICAgIEZpbGxJblZhbHVlSW5pdEZvckZpZWxkKDAsICpGaWVsZCwgRW50aXR5LCBJTEUsIFJlcXVpcmVzU2Vjb25kUGFzcyk7CisgICAgICAgICAgRmlsbEluVmFsdWVJbml0Rm9yRmllbGQoMCwgRmllbGQsIEVudGl0eSwgSUxFLCBSZXF1aXJlc1NlY29uZFBhc3MpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIHVuc2lnbmVkIEluaXQgPSAwOwotICAgICAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGaWVsZCA9IFJEZWNsLT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEVuZCA9IFJEZWNsLT5maWVsZF9lbmQoKTsKLSAgICAgICAgICAgRmllbGQgIT0gRmllbGRFbmQ7ICsrRmllbGQpIHsKKyAgICAgIGZvciAoYXV0byAqRmllbGQgOiBSRGVjbC0+ZmllbGRzKCkpIHsKICAgICAgICAgaWYgKEZpZWxkLT5pc1VubmFtZWRCaXRmaWVsZCgpKQogICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIGlmIChoYWRFcnJvcikKICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgRmlsbEluVmFsdWVJbml0Rm9yRmllbGQoSW5pdCwgKkZpZWxkLCBFbnRpdHksIElMRSwgUmVxdWlyZXNTZWNvbmRQYXNzKTsKKyAgICAgICAgRmlsbEluVmFsdWVJbml0Rm9yRmllbGQoSW5pdCwgRmllbGQsIEVudGl0eSwgSUxFLCBSZXF1aXJlc1NlY29uZFBhc3MpOwogICAgICAgICBpZiAoaGFkRXJyb3IpCiAgICAgICAgICAgcmV0dXJuOwogCkBAIC01ODcsMTMgKzU4MywxMCBAQAogaW50IEluaXRMaXN0Q2hlY2tlcjo6bnVtU3RydWN0VW5pb25FbGVtZW50cyhRdWFsVHlwZSBEZWNsVHlwZSkgewogICBSZWNvcmREZWNsICpzdHJ1Y3REZWNsID0gRGVjbFR5cGUtPmdldEFzPFJlY29yZFR5cGU+KCktPmdldERlY2woKTsKICAgaW50IEluaXRpYWxpemFibGVNZW1iZXJzID0gMDsKLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvcgotICAgICAgICAgRmllbGQgPSBzdHJ1Y3REZWNsLT5maWVsZF9iZWdpbigpLAotICAgICAgICAgRmllbGRFbmQgPSBzdHJ1Y3REZWNsLT5maWVsZF9lbmQoKTsKLSAgICAgICBGaWVsZCAhPSBGaWVsZEVuZDsgKytGaWVsZCkgeworICBmb3IgKGNvbnN0IGF1dG8gKkZpZWxkIDogc3RydWN0RGVjbC0+ZmllbGRzKCkpCiAgICAgaWYgKCFGaWVsZC0+aXNVbm5hbWVkQml0ZmllbGQoKSkKICAgICAgICsrSW5pdGlhbGl6YWJsZU1lbWJlcnM7Ci0gIH0KKwogICBpZiAoc3RydWN0RGVjbC0+aXNVbmlvbigpKQogICAgIHJldHVybiBzdGQ6Om1pbihJbml0aWFsaXphYmxlTWVtYmVycywgMSk7CiAgIHJldHVybiBJbml0aWFsaXphYmxlTWVtYmVycyAtIHN0cnVjdERlY2wtPmhhc0ZsZXhpYmxlQXJyYXlNZW1iZXIoKTsKQEAgLTEwMDUsOSArOTk4LDExIEBACiAKICAgRXhwciAqZXhwciA9IElMaXN0LT5nZXRJbml0KEluZGV4KTsKICAgaWYgKEluaXRMaXN0RXhwciAqU3ViSUxpc3QgPSBkeW5fY2FzdDxJbml0TGlzdEV4cHI+KGV4cHIpKSB7CisgICAgLy8gRklYTUU6IFRoaXMgaXMgaW52YWxpZCwgYW5kIGFjY2VwdGluZyBpdCBjYXVzZXMgb3ZlcmxvYWQgcmVzb2x1dGlvbgorICAgIC8vIHRvIHBpY2sgdGhlIHdyb25nIG92ZXJsb2FkIGluIHNvbWUgY29ybmVyIGNhc2VzLgogICAgIGlmICghVmVyaWZ5T25seSkKICAgICAgIFNlbWFSZWYuRGlhZyhTdWJJTGlzdC0+Z2V0TG9jU3RhcnQoKSwKLSAgICAgICAgICAgICAgICAgICBkaWFnOjp3YXJuX21hbnlfYnJhY2VzX2Fyb3VuZF9zY2FsYXJfaW5pdCkKKyAgICAgICAgICAgICAgICAgICBkaWFnOjpleHRfbWFueV9icmFjZXNfYXJvdW5kX3NjYWxhcl9pbml0KQogICAgICAgICA8PCBTdWJJTGlzdC0+Z2V0U291cmNlUmFuZ2UoKTsKIAogICAgIENoZWNrU2NhbGFyVHlwZShFbnRpdHksIFN1YklMaXN0LCBEZWNsVHlwZSwgSW5kZXgsIFN0cnVjdHVyZWRMaXN0LApAQCAtMTUzOCw3ICsxNTMzLDcgQEAKICAgICAgICAgIGl0ICE9IGVuZDsgKytpdCkgewogICAgICAgaWYgKCFpdC0+aXNVbm5hbWVkQml0ZmllbGQoKSAmJiAhaXQtPmhhc0luQ2xhc3NJbml0aWFsaXplcigpKSB7CiAgICAgICAgIFNlbWFSZWYuRGlhZyhJTGlzdC0+Z2V0U291cmNlUmFuZ2UoKS5nZXRFbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgIGRpYWc6Ondhcm5fbWlzc2luZ19maWVsZF9pbml0aWFsaXplcnMpIDw8IGl0LT5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICBkaWFnOjp3YXJuX21pc3NpbmdfZmllbGRfaW5pdGlhbGl6ZXJzKSA8PCAqaXQ7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KQEAgLTE2NDgsNyArMTY0Myw3IEBACiAgIGV4cGxpY2l0IEZpZWxkSW5pdGlhbGl6ZXJWYWxpZGF0b3JDQ0MoUmVjb3JkRGVjbCAqUkQpCiAgICAgICA6IFJlY29yZChSRCkge30KIAotICB2aXJ0dWFsIGJvb2wgVmFsaWRhdGVDYW5kaWRhdGUoY29uc3QgVHlwb0NvcnJlY3Rpb24gJmNhbmRpZGF0ZSkgeworICBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZjYW5kaWRhdGUpIG92ZXJyaWRlIHsKICAgICBGaWVsZERlY2wgKkZEID0gY2FuZGlkYXRlLmdldENvcnJlY3Rpb25EZWNsQXM8RmllbGREZWNsPigpOwogICAgIHJldHVybiBGRCAmJiBGRC0+Z2V0RGVjbENvbnRleHQoKS0+Z2V0UmVkZWNsQ29udGV4dCgpLT5FcXVhbHMoUmVjb3JkKTsKICAgfQpAQCAtMjI5MSw4ICsyMjg2LDcgQEAKICAgICBpZiAoUkRlY2wtPmlzVW5pb24oKSkKICAgICAgIE51bUVsZW1lbnRzID0gMTsKICAgICBlbHNlCi0gICAgICBOdW1FbGVtZW50cyA9IHN0ZDo6ZGlzdGFuY2UoUkRlY2wtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRlY2wtPmZpZWxkX2VuZCgpKTsKKyAgICAgIE51bUVsZW1lbnRzID0gc3RkOjpkaXN0YW5jZShSRGVjbC0+ZmllbGRfYmVnaW4oKSwgUkRlY2wtPmZpZWxkX2VuZCgpKTsKICAgfQogCiAgIFJlc3VsdC0+cmVzZXJ2ZUluaXRzKFNlbWFSZWYuQ29udGV4dCwgTnVtRWxlbWVudHMpOwpAQCAtMzUyMCwxMCArMzUxNCwxMyBAQAogICAgICAgICBpZiAoQ29udlRlbXBsYXRlKQogICAgICAgICAgIFMuQWRkVGVtcGxhdGVDb252ZXJzaW9uQ2FuZGlkYXRlKENvbnZUZW1wbGF0ZSwgSS5nZXRQYWlyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW5nREMsIEluaXRpYWxpemVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RUeXBlLCBDYW5kaWRhdGVTZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RUeXBlLCBDYW5kaWRhdGVTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypBbGxvd09iakNDb252ZXJzaW9uT25FeHBsaWNpdD0qLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgUy5BZGRDb252ZXJzaW9uQ2FuZGlkYXRlKENvbnYsIEkuZ2V0UGFpcigpLCBBY3RpbmdEQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZXIsIERlc3RUeXBlLCBDYW5kaWRhdGVTZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXplciwgRGVzdFR5cGUsIENhbmRpZGF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypBbGxvd09iakNDb252ZXJzaW9uT25FeHBsaWNpdD0qL2ZhbHNlKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTM1NDUsNyArMzU0Miw3IEBACiAKICAgLy8gQ29tcHV0ZSB0aGUgcmV0dXJuZWQgdHlwZSBvZiB0aGUgY29udmVyc2lvbi4KICAgaWYgKGlzYTxDWFhDb252ZXJzaW9uRGVjbD4oRnVuY3Rpb24pKQotICAgIFQyID0gRnVuY3Rpb24tPmdldFJlc3VsdFR5cGUoKTsKKyAgICBUMiA9IEZ1bmN0aW9uLT5nZXRSZXR1cm5UeXBlKCk7CiAgIGVsc2UKICAgICBUMiA9IGN2MVQxOwogCkBAIC00MTQzLDEwICs0MTQwLDExIEBACiAgICAgICAgICAgaWYgKENvbnZUZW1wbGF0ZSkKICAgICAgICAgICAgIFMuQWRkVGVtcGxhdGVDb252ZXJzaW9uQ2FuZGlkYXRlKENvbnZUZW1wbGF0ZSwgSS5nZXRQYWlyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3RpbmdEQywgSW5pdGlhbGl6ZXIsIERlc3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuZGlkYXRlU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmRpZGF0ZVNldCwgQWxsb3dFeHBsaWNpdCk7CiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgUy5BZGRDb252ZXJzaW9uQ2FuZGlkYXRlKENvbnYsIEkuZ2V0UGFpcigpLCBBY3RpbmdEQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXplciwgRGVzdFR5cGUsIENhbmRpZGF0ZVNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZXIsIERlc3RUeXBlLCBDYW5kaWRhdGVTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dFeHBsaWNpdCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC00NDYwLDYgKzQ0NTgsMTQgQEAKICAgRXhwciAqSW5pdGlhbGl6ZXIgPSAwOwogICBpZiAoQXJncy5zaXplKCkgPT0gMSkgewogICAgIEluaXRpYWxpemVyID0gQXJnc1swXTsKKyAgICBpZiAoUy5nZXRMYW5nT3B0cygpLk9iakMxKSB7CisgICAgICBpZiAoUy5DaGVja09iakNCcmlkZ2VSZWxhdGVkQ29udmVyc2lvbnMoSW5pdGlhbGl6ZXItPmdldExvY1N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdFR5cGUsIEluaXRpYWxpemVyLT5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZXIpIHx8CisgICAgICAgICAgUy5Db252ZXJzaW9uVG9PYmpDU3RyaW5nTGl0ZXJhbENoZWNrKERlc3RUeXBlLCBJbml0aWFsaXplcikpCisgICAgICAgIEFyZ3NbMF0gPSBJbml0aWFsaXplcjsKKyAgICAgICAgCisgICAgfQogICAgIGlmICghaXNhPEluaXRMaXN0RXhwcj4oSW5pdGlhbGl6ZXIpKQogICAgICAgU291cmNlVHlwZSA9IEluaXRpYWxpemVyLT5nZXRUeXBlKCk7CiAgIH0KQEAgLTUyMTgsMTAgKzUyMjQsMTMgQEAKICAgICAgIENvbnN0cnVjdEtpbmQgPSBDWFhDb25zdHJ1Y3RFeHByOjpDS19EZWxlZ2F0aW5nOwogICAgIH0KIAotICAgIC8vIE9ubHkgZ2V0IHRoZSBwYXJlbnRoZXNpcyByYW5nZSBpZiBpdCBpcyBhIGRpcmVjdCBjb25zdHJ1Y3Rpb24uCi0gICAgU291cmNlUmFuZ2UgcGFyZW5SYW5nZSA9Ci0gICAgICAgIEtpbmQuZ2V0S2luZCgpID09IEluaXRpYWxpemF0aW9uS2luZDo6SUtfRGlyZWN0ID8KLSAgICAgICAgS2luZC5nZXRQYXJlblJhbmdlKCkgOiBTb3VyY2VSYW5nZSgpOworICAgIC8vIE9ubHkgZ2V0IHRoZSBwYXJlbnRoZXNpcyBvciBicmFjZSByYW5nZSBpZiBpdCBpcyBhIGxpc3QgaW5pdGlhbGl6YXRpb24gb3IKKyAgICAvLyBkaXJlY3QgY29uc3RydWN0aW9uLgorICAgIFNvdXJjZVJhbmdlIFBhcmVuT3JCcmFjZVJhbmdlOworICAgIGlmIChJc0xpc3RJbml0aWFsaXphdGlvbikKKyAgICAgIFBhcmVuT3JCcmFjZVJhbmdlID0gU291cmNlUmFuZ2UoTEJyYWNlTG9jLCBSQnJhY2VMb2MpOworICAgIGVsc2UgaWYgKEtpbmQuZ2V0S2luZCgpID09IEluaXRpYWxpemF0aW9uS2luZDo6SUtfRGlyZWN0KQorICAgICAgUGFyZW5PckJyYWNlUmFuZ2UgPSBLaW5kLmdldFBhcmVuUmFuZ2UoKTsKIAogICAgIC8vIElmIHRoZSBlbnRpdHkgYWxsb3dzIE5SVk8sIG1hcmsgdGhlIGNvbnN0cnVjdGlvbiBhcyBlbGlkYWJsZQogICAgIC8vIHVuY29uZGl0aW9uYWxseS4KQEAgLTUyMzMsNyArNTI0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNMaXN0SW5pdGlhbGl6YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3JJbml0UmVxdWlyZXNaZXJvSW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJ1Y3RLaW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVuUmFuZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmVuT3JCcmFjZVJhbmdlKTsKICAgICBlbHNlCiAgICAgICBDdXJJbml0ID0gUy5CdWlsZENYWENvbnN0cnVjdEV4cHIoTG9jLCBFbnRpdHkuZ2V0VHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yLApAQCAtNTI0Miw3ICs1MjUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0xpc3RJbml0aWFsaXphdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvckluaXRSZXF1aXJlc1plcm9Jbml0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cnVjdEtpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW5SYW5nZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW5PckJyYWNlUmFuZ2UpOwogICB9CiAgIGlmIChDdXJJbml0LmlzSW52YWxpZCgpKQogICAgIHJldHVybiBFeHByRXJyb3IoKTsKQEAgLTU0NTEsOSArNTQ2MCw3IEBACiAgICAgICAgIHBlcmZvcm1SZWZlcmVuY2VFeHRlbnNpb24oSUxFLT5nZXRJbml0KDApLCBFeHRlbmRpbmdEKTsKICAgICAgIGVsc2UgewogICAgICAgICB1bnNpZ25lZCBJbmRleCA9IDA7Ci0gICAgICAgIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgSSA9IFJELT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBSRC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICpJIDogUkQtPmZpZWxkcygpKSB7CiAgICAgICAgICAgaWYgKEluZGV4ID49IElMRS0+Z2V0TnVtSW5pdHMoKSkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGlmIChJLT5pc1VubmFtZWRCaXRmaWVsZCgpKQpAQCAtNTg3NCw3ICs1ODgxLDcgQEAKIAogICAgICAgICBDYXN0S2luZCA9IENLX1VzZXJEZWZpbmVkQ29udmVyc2lvbjsKIAotICAgICAgICBDcmVhdGVkT2JqZWN0ID0gQ29udmVyc2lvbi0+Z2V0UmVzdWx0VHlwZSgpLT5pc1JlY29yZFR5cGUoKTsKKyAgICAgICAgQ3JlYXRlZE9iamVjdCA9IENvbnZlcnNpb24tPmdldFJldHVyblR5cGUoKS0+aXNSZWNvcmRUeXBlKCk7CiAgICAgICB9CiAKICAgICAgIGJvb2wgUmVxdWlyZXNDb3B5ID0gIUlzQ29weSAmJiAhaXNSZWZlcmVuY2VCaW5kaW5nKFN0ZXBzLmJhY2soKSk7CkBAIC02MTk2LDcgKzYyMDMsNyBAQAogCiAgICAgY2FzZSBTS19PQ0xTYW1wbGVySW5pdDogewogICAgICAgYXNzZXJ0KFN0ZXAtPlR5cGUtPmlzU2FtcGxlclQoKSAmJiAKLSAgICAgICAgICAgICAiU2FtcGxlciBpbml0aWFsaXphdGlvbiBvbiBub24gc2FtcGxlciB0eXBlLiIpOworICAgICAgICAgICAgICJTYW1wbGVyIGluaXRpYWxpemF0aW9uIG9uIG5vbi1zYW1wbGVyIHR5cGUuIik7CiAKICAgICAgIFF1YWxUeXBlIFNvdXJjZVR5cGUgPSBDdXJJbml0LmdldCgpLT5nZXRUeXBlKCk7CiAKQEAgLTYyMTIsNyArNjIxOSw3IEBACiAgICAgfQogICAgIGNhc2UgU0tfT0NMWmVyb0V2ZW50OiB7CiAgICAgICBhc3NlcnQoU3RlcC0+VHlwZS0+aXNFdmVudFQoKSAmJiAKLSAgICAgICAgICAgICAiRXZlbnQgaW5pdGlhbGl6YXRpb24gb24gbm9uIGV2ZW50IHR5cGUuIik7CisgICAgICAgICAgICAgIkV2ZW50IGluaXRpYWxpemF0aW9uIG9uIG5vbi1ldmVudCB0eXBlLiIpOwogCiAgICAgICBDdXJJbml0ID0gUy5JbXBDYXN0RXhwclRvVHlwZShDdXJJbml0LnRha2UoKSwgU3RlcC0+VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENLX1plcm9Ub09DTEV2ZW50LApAQCAtNjI0Niw4ICs2MjUzLDcgQEAKICAgaWYgKCFSRCB8fCAhUkQtPmhhc1VuaW5pdGlhbGl6ZWRSZWZlcmVuY2VNZW1iZXIoKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgZm9yIChDWFhSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBGSSA9IFJELT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZFID0gUkQtPmZpZWxkX2VuZCgpOyBGSSAhPSBGRTsgKytGSSkgeworICBmb3IgKGNvbnN0IGF1dG8gKkZJIDogUkQtPmZpZWxkcygpKSB7CiAgICAgaWYgKEZJLT5pc1VubmFtZWRCaXRmaWVsZCgpKQogICAgICAgY29udGludWU7CiAKQEAgLTYyNTcsMTAgKzYyNjMsOCBAQAogICAgIH0KICAgfQogCi0gIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBCSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkUgPSBSRC0+YmFzZXNfZW5kKCk7Ci0gICAgICAgQkkgIT0gQkU7ICsrQkkpIHsKLSAgICBpZiAoRGlhZ25vc2VVbmluaXRpYWxpemVkUmVmZXJlbmNlKFMsIEJJLT5nZXRMb2NTdGFydCgpLCBCSS0+Z2V0VHlwZSgpKSkgeworICBmb3IgKGNvbnN0IGF1dG8gJkJJIDogUkQtPmJhc2VzKCkpIHsKKyAgICBpZiAoRGlhZ25vc2VVbmluaXRpYWxpemVkUmVmZXJlbmNlKFMsIEJJLmdldExvY1N0YXJ0KCksIEJJLmdldFR5cGUoKSkpIHsKICAgICAgIFMuRGlhZyhMb2MsIGRpYWc6Om5vdGVfdmFsdWVfaW5pdGlhbGl6YXRpb25faGVyZSkgPDwgUkQ7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hTGFtYmRhLmNwcCBiL2xpYi9TZW1hL1NlbWFMYW1iZGEuY3BwCmluZGV4IGE3ZDViNjUuLjBkMjg3ZjcgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL1NlbWFMYW1iZGEuY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFMYW1iZGEuY3BwCkBAIC0xMSw2ICsxMSw3IEBACiAvLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KICNpbmNsdWRlICJjbGFuZy9TZW1hL0RlY2xTcGVjLmgiCisjaW5jbHVkZSAiVHlwZUxvY0J1aWxkZXIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUTGFtYmRhLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJDWFguaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgiCkBAIC0yMSwxMTUgKzIyLDIwNCBAQAogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2NvcGVJbmZvLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hSW50ZXJuYWwuaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWFMYW1iZGEuaCIKLSNpbmNsdWRlICJUeXBlTG9jQnVpbGRlci5oIgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIHNlbWE7CiAKLS8vIHJldHVybnMgLTEgaWYgbm9uZSBvZiB0aGUgbGFtYmRhcyBvbiB0aGUgc2NvcGUgc3RhY2sgY2FuIGNhcHR1cmUuCi0vLyBBIGxhbWJkYSAnTCcgaXMgY2FwdHVyZS1yZWFkeSBmb3IgYSBjZXJ0YWluIHZhcmlhYmxlICdWJyBpZiwKLS8vICAtIGl0cyBlbmNsb3NpbmcgY29udGV4dCBpcyBub24tZGVwZW5kZW50Ci0vLyAgLSBhbmQgaWYgdGhlIGNoYWluIG9mIGxhbWJkYXMgYmV0d2VlbiBMIGFuZCB0aGUgbGFtYmRhIGluIHdoaWNoIAotLy8gICAgViBpcyBwb3RlbnRpYWxseSB1c2VkLCBjYWxsIGFsbCBjYXB0dXJlIG9yIGhhdmUgY2FwdHVyZWQgVi4KLXN0YXRpYyBpbmxpbmUgaW50IEdldFNjb3BlSW5kZXhPZk5lYXJlc3RDYXB0dXJlUmVhZHlMYW1iZGEoCi0gICAgQXJyYXlSZWY8Y2xhbmc6OnNlbWE6OkZ1bmN0aW9uU2NvcGVJbmZvKj4gRnVuY3Rpb25TY29wZXMsCi0gICAgRGVjbENvbnRleHQgKmNvbnN0IEN1ckNvbnRleHQsIFZhckRlY2wgKlZEKSB7CisvLy8gXGJyaWVmIEV4YW1pbmVzIHRoZSBGdW5jdGlvblNjb3BlSW5mbyBzdGFjayB0byBkZXRlcm1pbmUgdGhlIG5lYXJlc3QKKy8vLyBlbmNsb3NpbmcgbGFtYmRhICh0byB0aGUgY3VycmVudCBsYW1iZGEpIHRoYXQgaXMgJ2NhcHR1cmUtcmVhZHknIGZvciAKKy8vLyB0aGUgdmFyaWFibGUgcmVmZXJlbmNlZCBpbiB0aGUgY3VycmVudCBsYW1iZGEgKGkuZS4gXHAgVmFyVG9DYXB0dXJlKS4KKy8vLyBJZiBzdWNjZXNzZnVsLCByZXR1cm5zIHRoZSBpbmRleCBpbnRvIFNlbWEncyBGdW5jdGlvblNjb3BlSW5mbyBzdGFjaworLy8vIG9mIHRoZSBjYXB0dXJlLXJlYWR5IGxhbWJkYSdzIExhbWJkYVNjb3BlSW5mby4KKy8vLyAgCisvLy8gQ2xpbWJzIGRvd24gdGhlIHN0YWNrIG9mIGxhbWJkYXMgKGRlZXBlc3QgbmVzdGVkIGxhbWJkYSAtIGkuZS4gY3VycmVudCAKKy8vLyBsYW1iZGEgLSBpcyBvbiB0b3ApIHRvIGRldGVybWluZSB0aGUgaW5kZXggb2YgdGhlIG5lYXJlc3QgZW5jbG9zaW5nL291dGVyCisvLy8gbGFtYmRhIHRoYXQgaXMgcmVhZHkgdG8gY2FwdHVyZSB0aGUgXHAgVmFyVG9DYXB0dXJlIGJlaW5nIHJlZmVyZW5jZWQgaW4gCisvLy8gdGhlIGN1cnJlbnQgbGFtYmRhLiAKKy8vLyBBcyB3ZSBjbGltYiBkb3duIHRoZSBzdGFjaywgd2Ugd2FudCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN1Y2ggbGFtYmRhIC0KKy8vLyB0aGF0IGlzIHRoZSBsYW1iZGEgd2l0aCB0aGUgaGlnaGVzdCBpbmRleCB0aGF0IGlzICdjYXB0dXJlLXJlYWR5Jy4gCisvLy8gCisvLy8gQSBsYW1iZGEgJ0wnIGlzIGNhcHR1cmUtcmVhZHkgZm9yICdWJyAodmFyIG9yIHRoaXMpIGlmOgorLy8vICAtIGl0cyBlbmNsb3NpbmcgY29udGV4dCBpcyBub24tZGVwZW5kZW50CisvLy8gIC0gYW5kIGlmIHRoZSBjaGFpbiBvZiBsYW1iZGFzIGJldHdlZW4gTCBhbmQgdGhlIGxhbWJkYSBpbiB3aGljaAorLy8vICAgIFYgaXMgcG90ZW50aWFsbHkgdXNlZCAoaS5lLiB0aGUgbGFtYmRhIGF0IHRoZSB0b3Agb2YgdGhlIHNjb3BlIGluZm8gCisvLy8gICAgc3RhY2spLCBjYW4gYWxsIGNhcHR1cmUgb3IgaGF2ZSBhbHJlYWR5IGNhcHR1cmVkIFYuCisvLy8gSWYgXHAgVmFyVG9DYXB0dXJlIGlzICdudWxsJyB0aGVuIHdlIGFyZSB0cnlpbmcgdG8gY2FwdHVyZSAndGhpcycuCisvLy8gCisvLy8gTm90ZSB0aGF0IGEgbGFtYmRhIHRoYXQgaXMgZGVlbWVkICdjYXB0dXJlLXJlYWR5JyBzdGlsbCBuZWVkcyB0byBiZSBjaGVja2VkCisvLy8gZm9yIHdoZXRoZXIgaXQgaXMgJ2NhcHR1cmUtY2FwYWJsZScgKHNlZQorLy8vIGdldFN0YWNrSW5kZXhPZk5lYXJlc3RFbmNsb3NpbmdDYXB0dXJlQ2FwYWJsZUxhbWJkYSksIGJlZm9yZSBpdCBjYW4gdHJ1bHkgCisvLy8gY2FwdHVyZS4KKy8vLworLy8vIFxwYXJhbSBGdW5jdGlvblNjb3BlcyAtIFNlbWEncyBzdGFjayBvZiBuZXN0ZWQgRnVuY3Rpb25TY29wZUluZm8ncyAod2hpY2ggYQorLy8vICBMYW1iZGFTY29wZUluZm8gaW5oZXJpdHMgZnJvbSkuICBUaGUgY3VycmVudC9kZWVwZXN0L2lubmVybW9zdCBsYW1iZGEKKy8vLyAgaXMgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIGhhcyB0aGUgaGlnaGVzdCBpbmRleC4KKy8vLyBccGFyYW0gVmFyVG9DYXB0dXJlIC0gdGhlIHZhcmlhYmxlIHRvIGNhcHR1cmUuICBJZiBOVUxMLCBjYXB0dXJlICd0aGlzJy4KKy8vLworLy8vIFxyZXR1cm5zIEFuIE9wdGlvbmFsPHVuc2lnbmVkPiBJbmRleCB0aGF0IGlmIGV2YWx1YXRlcyB0byAndHJ1ZScgY29udGFpbnMKKy8vLyB0aGUgaW5kZXggKGludG8gU2VtYSdzIEZ1bmN0aW9uU2NvcGVJbmZvIHN0YWNrKSBvZiB0aGUgaW5uZXJtb3N0IGxhbWJkYQorLy8vIHdoaWNoIGlzIGNhcHR1cmUtcmVhZHkuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGV2YWx1YXRlcyB0byAnZmFsc2UnIHRoZW4KKy8vLyBubyBsYW1iZGEgaXMgY2FwdHVyZS1yZWFkeSBmb3IgXHAgVmFyVG9DYXB0dXJlLgorCitzdGF0aWMgaW5saW5lIE9wdGlvbmFsPHVuc2lnbmVkPgorZ2V0U3RhY2tJbmRleE9mTmVhcmVzdEVuY2xvc2luZ0NhcHR1cmVSZWFkeUxhbWJkYSgKKyAgICBBcnJheVJlZjxjb25zdCBjbGFuZzo6c2VtYTo6RnVuY3Rpb25TY29wZUluZm8gKj4gRnVuY3Rpb25TY29wZXMsCisgICAgVmFyRGVjbCAqVmFyVG9DYXB0dXJlKSB7CisgIC8vIExhYmVsIGZhaWx1cmUgdG8gY2FwdHVyZS4KKyAgY29uc3QgT3B0aW9uYWw8dW5zaWduZWQ+IE5vTGFtYmRhSXNDYXB0dXJlUmVhZHk7CisKKyAgYXNzZXJ0KAorICAgICAgaXNhPGNsYW5nOjpzZW1hOjpMYW1iZGFTY29wZUluZm8+KAorICAgICAgICAgIEZ1bmN0aW9uU2NvcGVzW0Z1bmN0aW9uU2NvcGVzLnNpemUoKSAtIDFdKSAmJgorICAgICAgIlRoZSBmdW5jdGlvbiBvbiB0aGUgdG9wIG9mIHNlbWEncyBmdW5jdGlvbi1pbmZvIHN0YWNrIG11c3QgYmUgYSBsYW1iZGEiKTsKICAgCi0gIERlY2xDb250ZXh0ICpFbmNsb3NpbmdEQyA9IEN1ckNvbnRleHQ7Ci0gIC8vIElmIFZEIGlzIG51bGwsIHdlIGFyZSBhdHRlbXB0aW5nIHRvIGNhcHR1cmUgJ3RoaXMnCi0gIGNvbnN0IGJvb2wgSXNDYXB0dXJpbmdUaGlzID0gIVZEOworICAvLyBJZiBWYXJUb0NhcHR1cmUgaXMgbnVsbCwgd2UgYXJlIGF0dGVtcHRpbmcgdG8gY2FwdHVyZSAndGhpcycuCisgIGNvbnN0IGJvb2wgSXNDYXB0dXJpbmdUaGlzID0gIVZhclRvQ2FwdHVyZTsKICAgY29uc3QgYm9vbCBJc0NhcHR1cmluZ1ZhcmlhYmxlID0gIUlzQ2FwdHVyaW5nVGhpczsKLSAgaW50IFJldEluZGV4ID0gLTE7CisKKyAgLy8gU3RhcnQgd2l0aCB0aGUgY3VycmVudCBsYW1iZGEgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgKGhpZ2hlc3QgaW5kZXgpLgogICB1bnNpZ25lZCBDdXJTY29wZUluZGV4ID0gRnVuY3Rpb25TY29wZXMuc2l6ZSgpIC0gMTsKLSAgd2hpbGUgKCFFbmNsb3NpbmdEQy0+aXNUcmFuc2xhdGlvblVuaXQoKSAmJiAKLSAgICAgIEVuY2xvc2luZ0RDLT5pc0RlcGVuZGVudENvbnRleHQoKSAmJiBpc0xhbWJkYUNhbGxPcGVyYXRvcihFbmNsb3NpbmdEQykpIHsKLSAgICBSZXRJbmRleCA9IEN1clNjb3BlSW5kZXg7Ci0gICAgY2xhbmc6OnNlbWE6OkxhbWJkYVNjb3BlSW5mbyAqTFNJID0gCi0gICAgICAgICAgY2FzdDxzZW1hOjpMYW1iZGFTY29wZUluZm8+KEZ1bmN0aW9uU2NvcGVzW0N1clNjb3BlSW5kZXhdKTsKLSAgICAvLyBXZSBoYXZlIGNyYXdsZWQgdXAgdG8gYW4gaW50ZXJ2ZW5pbmcgbGFtYmRhIHRoYXQgY29udGFpbnMgdGhlIAotICAgIC8vIHZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gc28gbm90IG9ubHkgZG9lcyBpdCBub3QgbmVlZCB0byBjYXB0dXJlOwotICAgIC8vIG5vbmUgb2YgdGhlIGVuY2xvc2luZyBsYW1iZGFzIG5lZWQgdG8gY2FwdHVyZSBpdCwgYW5kIHNpbmNlIGFsbAotICAgIC8vIG90aGVyIG5lc3RlZCBsYW1iZGFzIGFyZSBkZXBlbmRlbnQgKG90aGVyd2lzZSB3ZSB3b3VsZG4ndCBoYXZlCi0gICAgLy8gYXJyaXZlZCBoZXJlKSAtIHdlIGRvbid0IHlldCBoYXZlIGEgbGFtYmRhIHRoYXQgY2FuIGNhcHR1cmUgdGhlCisgIERlY2xDb250ZXh0ICpFbmNsb3NpbmdEQyA9CisgICAgICBjYXN0PHNlbWE6OkxhbWJkYVNjb3BlSW5mbz4oRnVuY3Rpb25TY29wZXNbQ3VyU2NvcGVJbmRleF0pLT5DYWxsT3BlcmF0b3I7CisKKyAgZG8geworICAgIGNvbnN0IGNsYW5nOjpzZW1hOjpMYW1iZGFTY29wZUluZm8gKkxTSSA9CisgICAgICAgIGNhc3Q8c2VtYTo6TGFtYmRhU2NvcGVJbmZvPihGdW5jdGlvblNjb3Blc1tDdXJTY29wZUluZGV4XSk7CisgICAgLy8gSUYgd2UgaGF2ZSBjbGltYmVkIGRvd24gdG8gYW4gaW50ZXJ2ZW5pbmcgZW5jbG9zaW5nIGxhbWJkYSB0aGF0IGNvbnRhaW5zCisgICAgLy8gdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gaXQgb2J2aW91c2x5IGNhbi9tdXN0IG5vdCBjYXB0dXJlIHRoZQogICAgIC8vIHZhcmlhYmxlLgotICAgIGlmIChJc0NhcHR1cmluZ1ZhcmlhYmxlICYmIFZELT5nZXREZWNsQ29udGV4dCgpLT5FcXVhbHMoRW5jbG9zaW5nREMpKSAKLSAgICAgIHJldHVybiAtMTsKLSAgICAvLyBBbGwgaW50ZXJ2ZW5pbmcgbGFtYmRhIGNhbGwgb3BlcmF0b3JzIGhhdmUgdG8gYmUgYWJsZSB0byBjYXB0dXJlLgorICAgIC8vIFNpbmNlIGl0cyBlbmNsb3NpbmcgREMgaXMgZGVwZW5kZW50LCBhbGwgdGhlIGxhbWJkYXMgYmV0d2VlbiBpdCBhbmQgdGhlCisgICAgLy8gaW5uZXJtb3N0IG5lc3RlZCBsYW1iZGEgYXJlIGRlcGVuZGVudCAob3RoZXJ3aXNlIHdlIHdvdWxkbid0IGhhdmUKKyAgICAvLyBhcnJpdmVkIGhlcmUpIC0gc28gd2UgZG9uJ3QgeWV0IGhhdmUgYSBsYW1iZGEgdGhhdCBjYW4gY2FwdHVyZSB0aGUKKyAgICAvLyB2YXJpYWJsZS4KKyAgICBpZiAoSXNDYXB0dXJpbmdWYXJpYWJsZSAmJgorICAgICAgICBWYXJUb0NhcHR1cmUtPmdldERlY2xDb250ZXh0KCktPkVxdWFscyhFbmNsb3NpbmdEQykpCisgICAgICByZXR1cm4gTm9MYW1iZGFJc0NhcHR1cmVSZWFkeTsKKworICAgIC8vIEZvciBhbiBlbmNsb3NpbmcgbGFtYmRhIHRvIGJlIGNhcHR1cmUgcmVhZHkgZm9yIGFuIGVudGl0eSwgYWxsCisgICAgLy8gaW50ZXJ2ZW5pbmcgbGFtYmRhJ3MgaGF2ZSB0byBiZSBhYmxlIHRvIGNhcHR1cmUgdGhhdCBlbnRpdHkuIElmIGV2ZW4KKyAgICAvLyBvbmUgb2YgdGhlIGludGVydmVuaW5nIGxhbWJkYSdzIGlzIG5vdCBjYXBhYmxlIG9mIGNhcHR1cmluZyB0aGUgZW50aXR5CisgICAgLy8gdGhlbiBubyBlbmNsb3NpbmcgbGFtYmRhIGNhbiBldmVyIGNhcHR1cmUgdGhhdCBlbnRpdHkuCisgICAgLy8gRm9yIGUuZy4KKyAgICAvLyBjb25zdCBpbnQgeCA9IDEwOworICAgIC8vIFs9XShhdXRvIGEpIHsgICAgIzEKKyAgICAvLyAgIFtdKGF1dG8gYikgeyAgICMyIDwtLSBhbiBpbnRlcnZlbmluZyBsYW1iZGEgdGhhdCBjYW4gbmV2ZXIgY2FwdHVyZSAneCcKKyAgICAvLyAgICBbPV0oYXV0byBjKSB7ICMzCisgICAgLy8gICAgICAgZih4LCBjKTsgIDwtLSBjYW4gbm90IGxlYWQgdG8geCdzIHNwZWN1bGF0aXZlIGNhcHR1cmUgYnkgIzEgb3IgIzIKKyAgICAvLyAgICB9OyB9OyB9OwogICAgIC8vIElmIHRoZXkgZG8gbm90IGhhdmUgYSBkZWZhdWx0IGltcGxpY2l0IGNhcHR1cmUsIGNoZWNrIHRvIHNlZQogICAgIC8vIGlmIHRoZSBlbnRpdHkgaGFzIGFscmVhZHkgYmVlbiBleHBsaWNpdGx5IGNhcHR1cmVkLgotICAgIC8vIElmIGV2ZW4gYSBzaW5nbGUgZGVwZW5kZW50IGVuY2xvc2luZyBsYW1iZGEgbGFja3MgdGhlIGNhcGFiaWxpdHkgCi0gICAgLy8gdG8gZXZlciBjYXB0dXJlIHRoaXMgdmFyaWFibGUsIHRoZXJlIGlzIG5vIGZ1cnRoZXIgZW5jbG9zaW5nIAorICAgIC8vIElmIGV2ZW4gYSBzaW5nbGUgZGVwZW5kZW50IGVuY2xvc2luZyBsYW1iZGEgbGFja3MgdGhlIGNhcGFiaWxpdHkKKyAgICAvLyB0byBldmVyIGNhcHR1cmUgdGhpcyB2YXJpYWJsZSwgdGhlcmUgaXMgbm8gZnVydGhlciBlbmNsb3NpbmcKICAgICAvLyBub24tZGVwZW5kZW50IGxhbWJkYSB0aGF0IGNhbiBjYXB0dXJlIHRoaXMgdmFyaWFibGUuCiAgICAgaWYgKExTSS0+SW1wQ2FwdHVyZVN0eWxlID09IHNlbWE6OkxhbWJkYVNjb3BlSW5mbzo6SW1wQ2FwX05vbmUpIHsKLSAgICAgIGlmIChJc0NhcHR1cmluZ1ZhcmlhYmxlICYmICFMU0ktPmlzQ2FwdHVyZWQoVkQpKSAKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgaWYgKElzQ2FwdHVyaW5nVmFyaWFibGUgJiYgIUxTSS0+aXNDYXB0dXJlZChWYXJUb0NhcHR1cmUpKQorICAgICAgICByZXR1cm4gTm9MYW1iZGFJc0NhcHR1cmVSZWFkeTsKICAgICAgIGlmIChJc0NhcHR1cmluZ1RoaXMgJiYgIUxTSS0+aXNDWFhUaGlzQ2FwdHVyZWQoKSkKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gTm9MYW1iZGFJc0NhcHR1cmVSZWFkeTsKICAgICB9CiAgICAgRW5jbG9zaW5nREMgPSBnZXRMYW1iZGFBd2FyZVBhcmVudE9mRGVjbENvbnRleHQoRW5jbG9zaW5nREMpOworICAgIAorICAgIGFzc2VydChDdXJTY29wZUluZGV4KTsKICAgICAtLUN1clNjb3BlSW5kZXg7Ci0gIH0KLSAgLy8gSWYgdGhlIGVuY2xvc2luZ0RDIGlzIG5vdCBkZXBlbmRlbnQsIHRoZW4gdGhlIGltbWVkaWF0ZWx5IG5lc3RlZCBsYW1iZGEKLSAgLy8gaXMgY2FwdHVyZS1yZWFkeS4KLSAgaWYgKCFFbmNsb3NpbmdEQy0+aXNEZXBlbmRlbnRDb250ZXh0KCkpCi0gICAgcmV0dXJuIFJldEluZGV4OwotICByZXR1cm4gLTE7Ci19Ci0vLyBHaXZlbiBhIGxhbWJkYSdzIGNhbGwgb3BlcmF0b3IgYW5kIGEgdmFyaWFibGUgKG9yIG51bGwgZm9yICd0aGlzJyksIAotLy8gY29tcHV0ZSB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbGFtYmRhIHRoYXQgaXMgY2FwdHVyZS1yZWFkeSAoaS5lIAotLy8gdGhlIGVuY2xvc2luZyBjb250ZXh0IGlzIG5vdCBkZXBlbmRlbnQsIGFuZCBhbGwgaW50ZXJ2ZW5pbmcgbGFtYmRhcyBjYW4gCi0vLyBlaXRoZXIgaW1wbGljaXRseSBvciBleHBsaWNpdGx5IGNhcHR1cmUgVmFyKQotLy8gCi0vLyBUaGUgYXBwcm9hY2ggaXMgYXMgZm9sbG93cywgZm9yIHRoZSBlbnRpdHkgVkQgKCd0aGlzJyBpZiBudWxsKToKLS8vICAgLSBzdGFydCB3aXRoIHRoZSBjdXJyZW50IGxhbWJkYQotLy8gICAgIC0gaWYgaXQgaXMgbm9uLWRlcGVuZGVudCBhbmQgY2FuIGNhcHR1cmUgVkQsIHJldHVybiBpdC4gCi0vLyAgICAgLSBpZiBpdCBpcyBkZXBlbmRlbnQgYW5kIGhhcyBhbiBpbXBsaWNpdCBvciBleHBsaWNpdCBjYXB0dXJlLCBjaGVjayBpdHMgcGFyZW50IAotLy8gICAgICAgd2hldGhlciB0aGUgcGFyZW50IGlzIG5vbi1kZXBkZW5kZW50IGFuZCBhbGwgaXRzIGludGVydmVuaW5nIGxhbWJkYXMKLS8vICAgICAgIGNhbiBjYXB0dXJlLCBpZiBzbyByZXR1cm4gdGhlIGNoaWxkLgotLy8gICAgICAgW05vdGU6IFdoZW4gd2UgaGl0IGEgZ2VuZXJpYyBsYW1iZGEgc3BlY2lhbGl6YXRpb24sIGRvIG5vdCBjbGltYiB1cAotLy8gICAgICAgICB0aGUgc2NvcGUgc3RhY2sgYW55IGZ1cnRoZXIgc2luY2Ugbm90IG9ubHkgZG8gd2Ugbm90IG5lZWQgdG8sCi0vLyAgICAgICAgIHRoZSBzY29wZSBzdGFjayB3aWxsIG9mdGVuIG5vdCBiZSBzeW5jaHJvbml6ZWQgd2l0aCBhbnkgbGFtYmRhcyAKLS8vICAgICAgICAgZW5jbG9zaW5nIHRoZSBzcGVjaWFsaXplZCBnZW5lcmljIGxhbWJkYV0KLS8vICAgICAgIAotLy8gUmV0dXJuIHRoZSBDYWxsT3BlcmF0b3Igb2YgdGhlIGNhcHR1cmFibGUgbGFtYmRhIGFuZCBzZXQgZnVuY3Rpb24gc2NvcGUgCi0vLyBpbmRleCB0byB0aGUgY29ycmVjdCBpbmRleCB3aXRoaW4gdGhlIGZ1bmN0aW9uIHNjb3BlIHN0YWNrIHRvIGNvcnJlc3BvbmQgCi0vLyB0byB0aGUgY2FwdHVyYWJsZSBsYW1iZGEuCi0vLyBJZiBWYXJEZWNsICpWRCBpcyBudWxsLCB3ZSBjaGVjayBmb3IgJ3RoaXMnIGNhcHR1cmUuCi1DWFhNZXRob2REZWNsKiBjbGFuZzo6R2V0SW5uZXJtb3N0RW5jbG9zaW5nQ2FwdHVyYWJsZUxhbWJkYSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8c2VtYTo6RnVuY3Rpb25TY29wZUluZm8qPiBGdW5jdGlvblNjb3BlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkZ1bmN0aW9uU2NvcGVJbmRleCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpjb25zdCBDdXJDb250ZXh0LCBWYXJEZWNsICpWRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWEgJlMpIHsKKyAgfSB3aGlsZSAoIUVuY2xvc2luZ0RDLT5pc1RyYW5zbGF0aW9uVW5pdCgpICYmCisgICAgICAgICAgIEVuY2xvc2luZ0RDLT5pc0RlcGVuZGVudENvbnRleHQoKSAmJgorICAgICAgICAgICBpc0xhbWJkYUNhbGxPcGVyYXRvcihFbmNsb3NpbmdEQykpOwogCi0gIGNvbnN0IGludCBJbmRleE9mQ2FwdHVyZVJlYWR5TGFtYmRhID0gCi0gICAgICBHZXRTY29wZUluZGV4T2ZOZWFyZXN0Q2FwdHVyZVJlYWR5TGFtYmRhKEZ1bmN0aW9uU2NvcGVzLEN1ckNvbnRleHQsIFZEKTsKLSAgaWYgKEluZGV4T2ZDYXB0dXJlUmVhZHlMYW1iZGEgPT0gLTEpIHJldHVybiAwOwotICBhc3NlcnQoSW5kZXhPZkNhcHR1cmVSZWFkeUxhbWJkYSA+PSAwKTsKLSAgY29uc3QgdW5zaWduZWQgSW5kZXhPZkNhcHR1cmVSZWFkeUxhbWJkYVUgPSAKLSAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihJbmRleE9mQ2FwdHVyZVJlYWR5TGFtYmRhKTsKLSAgc2VtYTo6TGFtYmRhU2NvcGVJbmZvICpjb25zdCBDYXB0dXJlUmVhZHlMYW1iZGFMU0kgPSAKLSAgICAgIGNhc3Q8c2VtYTo6TGFtYmRhU2NvcGVJbmZvPihGdW5jdGlvblNjb3Blc1tJbmRleE9mQ2FwdHVyZVJlYWR5TGFtYmRhVV0pOwotICAvLyBJZiBWRCBpcyBudWxsLCB3ZSBhcmUgYXR0ZW1wdGluZyB0byBjYXB0dXJlICd0aGlzJwotICBjb25zdCBib29sIElzQ2FwdHVyaW5nVGhpcyA9ICFWRDsKKyAgYXNzZXJ0KEN1clNjb3BlSW5kZXggPCAoRnVuY3Rpb25TY29wZXMuc2l6ZSgpIC0gMSkpOworICAvLyBJZiB0aGUgZW5jbG9zaW5nREMgaXMgbm90IGRlcGVuZGVudCwgdGhlbiB0aGUgaW1tZWRpYXRlbHkgbmVzdGVkIGxhbWJkYQorICAvLyAob25lIGluZGV4IGFib3ZlKSBpcyBjYXB0dXJlLXJlYWR5LgorICBpZiAoIUVuY2xvc2luZ0RDLT5pc0RlcGVuZGVudENvbnRleHQoKSkKKyAgICByZXR1cm4gQ3VyU2NvcGVJbmRleCArIDE7CisgIHJldHVybiBOb0xhbWJkYUlzQ2FwdHVyZVJlYWR5OworfQorCisvLy8gXGJyaWVmIEV4YW1pbmVzIHRoZSBGdW5jdGlvblNjb3BlSW5mbyBzdGFjayB0byBkZXRlcm1pbmUgdGhlIG5lYXJlc3QKKy8vLyBlbmNsb3NpbmcgbGFtYmRhICh0byB0aGUgY3VycmVudCBsYW1iZGEpIHRoYXQgaXMgJ2NhcHR1cmUtY2FwYWJsZScgZm9yIAorLy8vIHRoZSB2YXJpYWJsZSByZWZlcmVuY2VkIGluIHRoZSBjdXJyZW50IGxhbWJkYSAoaS5lLiBccCBWYXJUb0NhcHR1cmUpLgorLy8vIElmIHN1Y2Nlc3NmdWwsIHJldHVybnMgdGhlIGluZGV4IGludG8gU2VtYSdzIEZ1bmN0aW9uU2NvcGVJbmZvIHN0YWNrCisvLy8gb2YgdGhlIGNhcHR1cmUtY2FwYWJsZSBsYW1iZGEncyBMYW1iZGFTY29wZUluZm8uCisvLy8KKy8vLyBHaXZlbiB0aGUgY3VycmVudCBzdGFjayBvZiBsYW1iZGFzIGJlaW5nIHByb2Nlc3NlZCBieSBTZW1hIGFuZAorLy8vIHRoZSB2YXJpYWJsZSBvZiBpbnRlcmVzdCwgdG8gaWRlbnRpZnkgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxhbWJkYSAodG8gdGhlIAorLy8vIGN1cnJlbnQgbGFtYmRhIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrKSB0aGF0IGNhbiB0cnVseSBjYXB0dXJlCisvLy8gYSB2YXJpYWJsZSwgaXQgaGFzIHRvIGhhdmUgdGhlIGZvbGxvd2luZyB0d28gcHJvcGVydGllczoKKy8vLyAgYSkgJ2NhcHR1cmUtcmVhZHknIC0gYmUgdGhlIGlubmVybW9zdCBsYW1iZGEgdGhhdCBpcyAnY2FwdHVyZS1yZWFkeSc6CisvLy8gICAgIC0gY2xpbWIgZG93biB0aGUgc3RhY2sgKGkuZS4gc3RhcnRpbmcgZnJvbSB0aGUgaW5uZXJtb3N0IGFuZCBleGFtaW5pbmcKKy8vLyAgICAgICBlYWNoIG91dGVyIGxhbWJkYSBzdGVwIGJ5IHN0ZXApIGNoZWNraW5nIGlmIGVhY2ggZW5jbG9zaW5nCisvLy8gICAgICAgbGFtYmRhIGNhbiBlaXRoZXIgaW1wbGljaXRseSBvciBleHBsaWNpdGx5IGNhcHR1cmUgdGhlIHZhcmlhYmxlLgorLy8vICAgICAgIFJlY29yZCB0aGUgZmlyc3Qgc3VjaCBsYW1iZGEgdGhhdCBpcyBlbmNsb3NlZCBpbiBhIG5vbi1kZXBlbmRlbnQKKy8vLyAgICAgICBjb250ZXh0LiBJZiBubyBzdWNoIGxhbWJkYSBjdXJyZW50bHkgZXhpc3RzIHJldHVybiBmYWlsdXJlLgorLy8vICBiKSAnY2FwdHVyZS1jYXBhYmxlJyAtIG1ha2Ugc3VyZSB0aGUgJ2NhcHR1cmUtcmVhZHknIGxhbWJkYSBjYW4gdHJ1bHkKKy8vLyAgY2FwdHVyZSB0aGUgdmFyaWFibGUgYnkgY2hlY2tpbmcgYWxsIGl0cyBlbmNsb3NpbmcgbGFtYmRhczoKKy8vLyAgICAgLSBjaGVjayBpZiBhbGwgb3V0ZXIgbGFtYmRhcyBlbmNsb3NpbmcgdGhlICdjYXB0dXJlLXJlYWR5JyBsYW1iZGEKKy8vLyAgICAgICBpZGVudGlmaWVkIGFib3ZlIGluICdhJyBjYW4gYWxzbyBjYXB0dXJlIHRoZSB2YXJpYWJsZSAodGhpcyBpcyBkb25lCisvLy8gICAgICAgdmlhIHRyeUNhcHR1cmVWYXJpYWJsZSBmb3IgdmFyaWFibGVzIGFuZCBDaGVja0NYWFRoaXNDYXB0dXJlIGZvcgorLy8vICAgICAgICd0aGlzJyBieSBwYXNzaW5nIGluIHRoZSBpbmRleCBvZiB0aGUgTGFtYmRhIGlkZW50aWZpZWQgaW4gc3RlcCAnYScpCisvLy8KKy8vLyBccGFyYW0gRnVuY3Rpb25TY29wZXMgLSBTZW1hJ3Mgc3RhY2sgb2YgbmVzdGVkIEZ1bmN0aW9uU2NvcGVJbmZvJ3MgKHdoaWNoIGEKKy8vLyBMYW1iZGFTY29wZUluZm8gaW5oZXJpdHMgZnJvbSkuICBUaGUgY3VycmVudC9kZWVwZXN0L2lubmVybW9zdCBsYW1iZGEKKy8vLyBpcyBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKy8vLworLy8vIFxwYXJhbSBWYXJUb0NhcHR1cmUgLSB0aGUgdmFyaWFibGUgdG8gY2FwdHVyZS4gIElmIE5VTEwsIGNhcHR1cmUgJ3RoaXMnLgorLy8vCisvLy8KKy8vLyBccmV0dXJucyBBbiBPcHRpb25hbDx1bnNpZ25lZD4gSW5kZXggdGhhdCBpZiBldmFsdWF0ZXMgdG8gJ3RydWUnIGNvbnRhaW5zCisvLy8gdGhlIGluZGV4IChpbnRvIFNlbWEncyBGdW5jdGlvblNjb3BlSW5mbyBzdGFjaykgb2YgdGhlIGlubmVybW9zdCBsYW1iZGEKKy8vLyB3aGljaCBpcyBjYXB0dXJlLWNhcGFibGUuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGV2YWx1YXRlcyB0byAnZmFsc2UnIHRoZW4KKy8vLyBubyBsYW1iZGEgaXMgY2FwdHVyZS1jYXBhYmxlIGZvciBccCBWYXJUb0NhcHR1cmUuCisKK09wdGlvbmFsPHVuc2lnbmVkPiBjbGFuZzo6Z2V0U3RhY2tJbmRleE9mTmVhcmVzdEVuY2xvc2luZ0NhcHR1cmVDYXBhYmxlTGFtYmRhKAorICAgIEFycmF5UmVmPGNvbnN0IHNlbWE6OkZ1bmN0aW9uU2NvcGVJbmZvICo+IEZ1bmN0aW9uU2NvcGVzLAorICAgIFZhckRlY2wgKlZhclRvQ2FwdHVyZSwgU2VtYSAmUykgeworCisgIGNvbnN0IE9wdGlvbmFsPHVuc2lnbmVkPiBOb0xhbWJkYUlzQ2FwdHVyZUNhcGFibGU7CisgIAorICBjb25zdCBPcHRpb25hbDx1bnNpZ25lZD4gT3B0aW9uYWxTdGFja0luZGV4ID0KKyAgICAgIGdldFN0YWNrSW5kZXhPZk5lYXJlc3RFbmNsb3NpbmdDYXB0dXJlUmVhZHlMYW1iZGEoRnVuY3Rpb25TY29wZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhclRvQ2FwdHVyZSk7CisgIGlmICghT3B0aW9uYWxTdGFja0luZGV4KQorICAgIHJldHVybiBOb0xhbWJkYUlzQ2FwdHVyZUNhcGFibGU7CisKKyAgY29uc3QgdW5zaWduZWQgSW5kZXhPZkNhcHR1cmVSZWFkeUxhbWJkYSA9IE9wdGlvbmFsU3RhY2tJbmRleC5nZXRWYWx1ZSgpOworICBhc3NlcnQoKChJbmRleE9mQ2FwdHVyZVJlYWR5TGFtYmRhICE9IChGdW5jdGlvblNjb3Blcy5zaXplKCkgLSAxKSkgfHwKKyAgICAgICAgICBTLmdldEN1ckdlbmVyaWNMYW1iZGEoKSkgJiYKKyAgICAgICAgICJUaGUgY2FwdHVyZSByZWFkeSBsYW1iZGEgZm9yIGEgcG90ZW50aWFsIGNhcHR1cmUgY2FuIG9ubHkgYmUgdGhlICIKKyAgICAgICAgICJjdXJyZW50IGxhbWJkYSBpZiBpdCBpcyBhIGdlbmVyaWMgbGFtYmRhIik7CisKKyAgY29uc3Qgc2VtYTo6TGFtYmRhU2NvcGVJbmZvICpjb25zdCBDYXB0dXJlUmVhZHlMYW1iZGFMU0kgPQorICAgICAgY2FzdDxzZW1hOjpMYW1iZGFTY29wZUluZm8+KEZ1bmN0aW9uU2NvcGVzW0luZGV4T2ZDYXB0dXJlUmVhZHlMYW1iZGFdKTsKKyAgCisgIC8vIElmIFZhclRvQ2FwdHVyZSBpcyBudWxsLCB3ZSBhcmUgYXR0ZW1wdGluZyB0byBjYXB0dXJlICd0aGlzJworICBjb25zdCBib29sIElzQ2FwdHVyaW5nVGhpcyA9ICFWYXJUb0NhcHR1cmU7CiAgIGNvbnN0IGJvb2wgSXNDYXB0dXJpbmdWYXJpYWJsZSA9ICFJc0NhcHR1cmluZ1RoaXM7CiAKICAgaWYgKElzQ2FwdHVyaW5nVmFyaWFibGUpIHsKLSAgICAvLyBOb3cgY2hlY2sgdG8gc2VlIGlmIHRoaXMgbGFtYmRhIGNhbiB0cnVseSBjYXB0dXJlLCBhbmQgYWxzbwotICAgIC8vIGlmIGFsbCBlbmNsb3NpbmcgbGFtYmRhcyBvZiB0aGlzIGxhbWJkYSBhbGxvdyB0aGlzIGNhcHR1cmUuCisgICAgLy8gQ2hlY2sgaWYgdGhlIGNhcHR1cmUtcmVhZHkgbGFtYmRhIGNhbiB0cnVseSBjYXB0dXJlIHRoZSB2YXJpYWJsZSwgYnkKKyAgICAvLyBjaGVja2luZyB3aGV0aGVyIGFsbCBlbmNsb3NpbmcgbGFtYmRhcyBvZiB0aGUgY2FwdHVyZS1yZWFkeSBsYW1iZGEgYWxsb3cKKyAgICAvLyB0aGUgY2FwdHVyZSAtIGkuZS4gbWFrZSBzdXJlIGl0IGlzIGNhcHR1cmUtY2FwYWJsZS4KICAgICBRdWFsVHlwZSBDYXB0dXJlVHlwZSwgRGVjbFJlZlR5cGU7Ci0gICAgY29uc3QgYm9vbCBDYW5DYXB0dXJlVmFyaWFibGUgPSAhUy50cnlDYXB0dXJlVmFyaWFibGUoVkQsIAotICAgICAgLypFeHByVmFySXNVc2VkSW5Mb2MqL1NvdXJjZUxvY2F0aW9uKCksIGNsYW5nOjpTZW1hOjpUcnlDYXB0dXJlX0ltcGxpY2l0LAotICAgICAgLypFbGxpcHNpc0xvYyovIFNvdXJjZUxvY2F0aW9uKCksIAotICAgICAgLypCdWlsZEFuZERpYWdub3NlKi9mYWxzZSwgQ2FwdHVyZVR5cGUsIERlY2xSZWZUeXBlLCAKLSAgICAgICZJbmRleE9mQ2FwdHVyZVJlYWR5TGFtYmRhVSk7Ci0gICAgaWYgKCFDYW5DYXB0dXJlVmFyaWFibGUpIHJldHVybiAwOwotICB9IGVsc2UgeyAKLSAgICBjb25zdCBib29sIENhbkNhcHR1cmVUaGlzID0gIVMuQ2hlY2tDWFhUaGlzQ2FwdHVyZSgKLSAgICAgICAgQ2FwdHVyZVJlYWR5TGFtYmRhTFNJLT5Qb3RlbnRpYWxUaGlzQ2FwdHVyZUxvY2F0aW9uLCBmYWxzZSwgZmFsc2UsIAotICAgICAgICAmSW5kZXhPZkNhcHR1cmVSZWFkeUxhbWJkYVUpOwotICAgIGlmICghQ2FuQ2FwdHVyZVRoaXMpIHJldHVybiAwOyAgICAgIAotICB9IC8vIGVuZCAndGhpcycgY2FwdHVyZSB0ZXN0Ci0gIEZ1bmN0aW9uU2NvcGVJbmRleCA9IEluZGV4T2ZDYXB0dXJlUmVhZHlMYW1iZGFVOwotICByZXR1cm4gQ2FwdHVyZVJlYWR5TGFtYmRhTFNJLT5DYWxsT3BlcmF0b3I7CisgICAgY29uc3QgYm9vbCBDYW5DYXB0dXJlVmFyaWFibGUgPQorICAgICAgICAhUy50cnlDYXB0dXJlVmFyaWFibGUoVmFyVG9DYXB0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypFeHByVmFySXNVc2VkSW5Mb2MqLyBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhbmc6OlNlbWE6OlRyeUNhcHR1cmVfSW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkVsbGlwc2lzTG9jKi8gU291cmNlTG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQnVpbGRBbmREaWFnbm9zZSovIGZhbHNlLCBDYXB0dXJlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xSZWZUeXBlLCAmSW5kZXhPZkNhcHR1cmVSZWFkeUxhbWJkYSk7CisgICAgaWYgKCFDYW5DYXB0dXJlVmFyaWFibGUpCisgICAgICByZXR1cm4gTm9MYW1iZGFJc0NhcHR1cmVDYXBhYmxlOworICB9IGVsc2UgeworICAgIC8vIENoZWNrIGlmIHRoZSBjYXB0dXJlLXJlYWR5IGxhbWJkYSBjYW4gdHJ1bHkgY2FwdHVyZSAndGhpcycgYnkgY2hlY2tpbmcKKyAgICAvLyB3aGV0aGVyIGFsbCBlbmNsb3NpbmcgbGFtYmRhcyBvZiB0aGUgY2FwdHVyZS1yZWFkeSBsYW1iZGEgY2FuIGNhcHR1cmUKKyAgICAvLyAndGhpcycuCisgICAgY29uc3QgYm9vbCBDYW5DYXB0dXJlVGhpcyA9CisgICAgICAgICFTLkNoZWNrQ1hYVGhpc0NhcHR1cmUoCisgICAgICAgICAgICAgQ2FwdHVyZVJlYWR5TGFtYmRhTFNJLT5Qb3RlbnRpYWxUaGlzQ2FwdHVyZUxvY2F0aW9uLAorICAgICAgICAgICAgIC8qRXhwbGljaXQqLyBmYWxzZSwgLypCdWlsZEFuZERpYWdub3NlKi8gZmFsc2UsCisgICAgICAgICAgICAgJkluZGV4T2ZDYXB0dXJlUmVhZHlMYW1iZGEpOworICAgIGlmICghQ2FuQ2FwdHVyZVRoaXMpCisgICAgICByZXR1cm4gTm9MYW1iZGFJc0NhcHR1cmVDYXBhYmxlOworICB9IAorICByZXR1cm4gSW5kZXhPZkNhcHR1cmVSZWFkeUxhbWJkYTsKIH0KIAogc3RhdGljIGlubGluZSBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKgpAQCAtMTQyLDE3ICsyMzIsMTQgQEAKICAgICBTb3VyY2VMb2NhdGlvbiBMQW5nbGVMb2MgPSBJbnRyb1JhbmdlLmdldEJlZ2luKCk7CiAgICAgU291cmNlTG9jYXRpb24gUkFuZ2xlTG9jID0gSW50cm9SYW5nZS5nZXRFbmQoKTsKICAgICBMU0ktPkdMVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ID0gVGVtcGxhdGVQYXJhbWV0ZXJMaXN0OjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFSZWYuQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGVtcGxhdGUga3cgbG9jKi9Tb3VyY2VMb2NhdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFuZ2xlTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTmFtZWREZWNsKiopTFNJLT5BdXRvVGVtcGxhdGVQYXJhbXMuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMU0ktPkF1dG9UZW1wbGF0ZVBhcmFtcy5zaXplKCksIFJBbmdsZUxvYyk7ICAKKyAgICAgICAgU2VtYVJlZi5Db250ZXh0LAorICAgICAgICAvKlRlbXBsYXRlIGt3IGxvYyovIFNvdXJjZUxvY2F0aW9uKCksIExBbmdsZUxvYywKKyAgICAgICAgKE5hbWVkRGVjbCAqKilMU0ktPkF1dG9UZW1wbGF0ZVBhcmFtcy5kYXRhKCksCisgICAgICAgIExTSS0+QXV0b1RlbXBsYXRlUGFyYW1zLnNpemUoKSwgUkFuZ2xlTG9jKTsKICAgfQogICByZXR1cm4gTFNJLT5HTFRlbXBsYXRlUGFyYW1ldGVyTGlzdDsKIH0KIAotCi0KIENYWFJlY29yZERlY2wgKlNlbWE6OmNyZWF0ZUxhbWJkYUNsb3N1cmVUeXBlKFNvdXJjZVJhbmdlIEludHJvZHVjZXJSYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLbm93bkRlcGVuZGVudCwgCkBAIC0xNjksNyArMjU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNHZW5lcmljTGFtYmRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZURlZmF1bHQpOwogICBEQy0+YWRkRGVjbChDbGFzcyk7Ci0gIAorCiAgIHJldHVybiBDbGFzczsKIH0KIApAQCAtMjc3LDEwICszNjQsMTAgQEAKICAgLy8gZGVwZW5kZW50IHR5cGUuCiAgIGlmIChDbGFzcy0+aXNEZXBlbmRlbnRDb250ZXh0KCkgfHwgVGVtcGxhdGVQYXJhbXMpIHsKICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqRlBUID0gTWV0aG9kVHlwZS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwotICAgIFF1YWxUeXBlIFJlc3VsdCA9IEZQVC0+Z2V0UmVzdWx0VHlwZSgpOworICAgIFF1YWxUeXBlIFJlc3VsdCA9IEZQVC0+Z2V0UmV0dXJuVHlwZSgpOwogICAgIGlmIChSZXN1bHQtPmlzVW5kZWR1Y2VkVHlwZSgpKSB7CiAgICAgICBSZXN1bHQgPSBTdWJzdEF1dG9UeXBlKFJlc3VsdCwgQ29udGV4dC5EZXBlbmRlbnRUeSk7Ci0gICAgICBNZXRob2RUeXBlID0gQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoUmVzdWx0LCBGUFQtPmdldEFyZ1R5cGVzKCksCisgICAgICBNZXRob2RUeXBlID0gQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoUmVzdWx0LCBGUFQtPmdldFBhcmFtVHlwZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFQtPmdldEV4dFByb3RvSW5mbygpKTsKICAgICB9CiAgIH0KQEAgLTMzMSwxMCArNDE4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxQYXJtVmFyRGVjbCAqKj4oUGFyYW1zLmVuZCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVja1BhcmFtZXRlck5hbWVzPSovZmFsc2UpOwogICAgIAotICAgIGZvciAoQ1hYTWV0aG9kRGVjbDo6cGFyYW1faXRlcmF0b3IgUCA9IE1ldGhvZC0+cGFyYW1fYmVnaW4oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRW5kID0gTWV0aG9kLT5wYXJhbV9lbmQoKTsKLSAgICAgICAgIFAgIT0gUEVuZDsgKytQKQotICAgICAgKCpQKS0+c2V0T3duaW5nRnVuY3Rpb24oTWV0aG9kKTsKKyAgICBmb3IgKGF1dG8gUCA6IE1ldGhvZC0+cGFyYW1zKCkpCisgICAgICBQLT5zZXRPd25pbmdGdW5jdGlvbihNZXRob2QpOwogICB9CiAKICAgRGVjbCAqTWFuZ2xpbmdDb250ZXh0RGVjbDsKQEAgLTM2OSw4ICs0NTQsOCBAQAogICBMU0ktPk11dGFibGUgPSBNdXRhYmxlOwogCiAgIGlmIChFeHBsaWNpdFJlc3VsdFR5cGUpIHsKLSAgICBMU0ktPlJldHVyblR5cGUgPSBDYWxsT3BlcmF0b3ItPmdldFJlc3VsdFR5cGUoKTsKLSAgICAKKyAgICBMU0ktPlJldHVyblR5cGUgPSBDYWxsT3BlcmF0b3ItPmdldFJldHVyblR5cGUoKTsKKwogICAgIGlmICghTFNJLT5SZXR1cm5UeXBlLT5pc0RlcGVuZGVudFR5cGUoKSAmJgogICAgICAgICAhTFNJLT5SZXR1cm5UeXBlLT5pc1ZvaWRUeXBlKCkpIHsKICAgICAgIGlmIChSZXF1aXJlQ29tcGxldGVUeXBlKENhbGxPcGVyYXRvci0+Z2V0TG9jU3RhcnQoKSwgTFNJLT5SZXR1cm5UeXBlLApAQCAtNjUxLDYgKzczNiw5IEBACiAgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKICAgICB9IGVsc2UgewogICAgICAgRGVkdWNlSW5pdCA9IENYWERpcmVjdEluaXQtPmdldEV4cHIoMCk7CisgICAgICBpZiAoaXNhPEluaXRMaXN0RXhwcj4oRGVkdWNlSW5pdCkpCisgICAgICAgIERpYWcoQ1hYRGlyZWN0SW5pdC0+Z2V0TG9jU3RhcnQoKSwgZGlhZzo6ZXJyX2luaXRfY2FwdHVyZV9wYXJlbl9icmFjZXMpCisgICAgICAgICAgPDwgRGVjbGFyYXRpb25OYW1lKElkKSA8PCBMb2M7CiAgICAgfQogICB9CiAKQEAgLTgxMSwxNCArODk5LDEzIEBACiAKICAgICBFeHBsaWNpdFJlc3VsdFR5cGUgPSBGVEkuaGFzVHJhaWxpbmdSZXR1cm5UeXBlKCk7CiAKLSAgICBpZiAoRlRJLk51bUFyZ3MgPT0gMSAmJiAhRlRJLmlzVmFyaWFkaWMgJiYgRlRJLkFyZ0luZm9bMF0uSWRlbnQgPT0gMCAmJgotICAgICAgICBjYXN0PFBhcm1WYXJEZWNsPihGVEkuQXJnSW5mb1swXS5QYXJhbSktPmdldFR5cGUoKS0+aXNWb2lkVHlwZSgpKSB7CisgICAgaWYgKEZUSS5OdW1QYXJhbXMgPT0gMSAmJiAhRlRJLmlzVmFyaWFkaWMgJiYgRlRJLlBhcmFtc1swXS5JZGVudCA9PSAwICYmCisgICAgICAgIGNhc3Q8UGFybVZhckRlY2w+KEZUSS5QYXJhbXNbMF0uUGFyYW0pLT5nZXRUeXBlKCktPmlzVm9pZFR5cGUoKSkgewogICAgICAgLy8gRW1wdHkgYXJnIGxpc3QsIGRvbid0IHB1c2ggYW55IHBhcmFtcy4KLSAgICAgIGNoZWNrVm9pZFBhcmFtRGVjbChjYXN0PFBhcm1WYXJEZWNsPihGVEkuQXJnSW5mb1swXS5QYXJhbSkpOwogICAgIH0gZWxzZSB7Ci0gICAgICBQYXJhbXMucmVzZXJ2ZShGVEkuTnVtQXJncyk7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gRlRJLk51bUFyZ3M7IGkgIT0gZTsgKytpKQotICAgICAgICBQYXJhbXMucHVzaF9iYWNrKGNhc3Q8UGFybVZhckRlY2w+KEZUSS5BcmdJbmZvW2ldLlBhcmFtKSk7CisgICAgICBQYXJhbXMucmVzZXJ2ZShGVEkuTnVtUGFyYW1zKTsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVEkuTnVtUGFyYW1zOyBpICE9IGU7ICsraSkKKyAgICAgICAgUGFyYW1zLnB1c2hfYmFjayhjYXN0PFBhcm1WYXJEZWNsPihGVEkuUGFyYW1zW2ldLlBhcmFtKSk7CiAgICAgfQogCiAgICAgLy8gQ2hlY2sgZm9yIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2tzIGluIHRoZSBtZXRob2QgdHlwZS4KQEAgLTg0OCw2ICs5MzUsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgRXhwbGljaXRSZXN1bHRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAhTWV0aG9kLT5pc0NvbnN0KCkpOwogCisgIC8vIEMrKzExIFtleHByLnByaW0ubGFtYmRhXXA5OgorICAvLyAgIEEgbGFtYmRhLWV4cHJlc3Npb24gd2hvc2Ugc21hbGxlc3QgZW5jbG9zaW5nIHNjb3BlIGlzIGEgYmxvY2sgc2NvcGUgaXMgYQorICAvLyAgIGxvY2FsIGxhbWJkYSBleHByZXNzaW9uOyBhbnkgb3RoZXIgbGFtYmRhIGV4cHJlc3Npb24gc2hhbGwgbm90IGhhdmUgYQorICAvLyAgIGNhcHR1cmUtZGVmYXVsdCBvciBzaW1wbGUtY2FwdHVyZSBpbiBpdHMgbGFtYmRhLWludHJvZHVjZXIuCisgIC8vCisgIC8vIEZvciBzaW1wbGUtY2FwdHVyZXMsIHRoaXMgaXMgY292ZXJlZCBieSB0aGUgY2hlY2sgYmVsb3cgdGhhdCBhbnkgbmFtZWQKKyAgLy8gZW50aXR5IGlzIGEgdmFyaWFibGUgdGhhdCBjYW4gYmUgY2FwdHVyZWQuCisgIC8vCisgIC8vIEZvciBEUjE2MzIsIHdlIGFsc28gYWxsb3cgYSBjYXB0dXJlLWRlZmF1bHQgaW4gYW55IGNvbnRleHQgd2hlcmUgd2UgY2FuCisgIC8vIG9kci11c2UgJ3RoaXMnIChpbiBwYXJ0aWN1bGFyLCBpbiBhIGRlZmF1bHQgaW5pdGlhbGl6ZXIgZm9yIGEgbm9uLXN0YXRpYworICAvLyBkYXRhIG1lbWJlcikuCisgIGlmIChJbnRyby5EZWZhdWx0ICE9IExDRF9Ob25lICYmICFDbGFzcy0+Z2V0UGFyZW50KCktPmlzRnVuY3Rpb25Pck1ldGhvZCgpICYmCisgICAgICAoZ2V0Q3VycmVudFRoaXNUeXBlKCkuaXNOdWxsKCkgfHwKKyAgICAgICBDaGVja0NYWFRoaXNDYXB0dXJlKFNvdXJjZUxvY2F0aW9uKCksIC8qRXhwbGljaXQqL3RydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkJ1aWxkQW5kRGlhZ25vc2UqL2ZhbHNlKSkpCisgICAgRGlhZyhJbnRyby5EZWZhdWx0TG9jLCBkaWFnOjplcnJfY2FwdHVyZV9kZWZhdWx0X25vbl9sb2NhbCk7CisKICAgLy8gRGlzdGluY3QgY2FwdHVyZSBuYW1lcywgZm9yIGRpYWdub3N0aWNzLgogICBsbHZtOjpTbWFsbFNldDxJZGVudGlmaWVySW5mbyosIDg+IENhcHR1cmVOYW1lczsKIApAQCAtOTU4LDYgKzEwNjIsOCBAQAogICAgICAgfQogCiAgICAgICBWYXIgPSBSLmdldEFzU2luZ2xlPFZhckRlY2w+KCk7CisgICAgICBpZiAoVmFyICYmIERpYWdub3NlVXNlT2ZEZWNsKFZhciwgQy0+TG9jKSkKKyAgICAgICAgY29udGludWU7CiAgICAgfQogCiAgICAgLy8gQysrMTEgW2V4cHIucHJpbS5sYW1iZGFdcDg6CkBAIC0xMDQ1LDEyICsxMTUxLDkgQEAKICAgTGFtYmRhU2NvcGVJbmZvICpMU0kgPSBnZXRDdXJMYW1iZGEoKTsKICAgQ1hYUmVjb3JkRGVjbCAqQ2xhc3MgPSBMU0ktPkxhbWJkYTsKICAgQ2xhc3MtPnNldEludmFsaWREZWNsKCk7Ci0gIFNtYWxsVmVjdG9yPERlY2wqLCA0PiBGaWVsZHM7Ci0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgaSA9IENsYXNzLT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBDbGFzcy0+ZmllbGRfZW5kKCk7IGkgIT0gZTsgKytpKQotICAgIEZpZWxkcy5wdXNoX2JhY2soKmkpOwotICBBY3RPbkZpZWxkcygwLCBDbGFzcy0+Z2V0TG9jYXRpb24oKSwgQ2xhc3MsIEZpZWxkcywgCi0gICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIDApOworICBTbWFsbFZlY3RvcjxEZWNsKiwgND4gRmllbGRzKENsYXNzLT5maWVsZHMoKSk7CisgIEFjdE9uRmllbGRzKDAsIENsYXNzLT5nZXRMb2NhdGlvbigpLCBDbGFzcywgRmllbGRzLCBTb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCAwKTsKICAgQ2hlY2tDb21wbGV0ZWRDWFhDbGFzcyhDbGFzcyk7CiAKICAgUG9wRnVuY3Rpb25TY29wZUluZm8oKTsKQEAgLTEwNzcsOCArMTE4MCw5IEBACiAgICAgSW52b2tlckV4dEluZm8uVHlwZVF1YWxzID0gMDsKICAgICBhc3NlcnQoSW52b2tlckV4dEluZm8uUmVmUXVhbGlmaWVyID09IFJRX05vbmUgJiYgCiAgICAgICAgICJMYW1iZGEncyBjYWxsIG9wZXJhdG9yIHNob3VsZCBub3QgaGF2ZSBhIHJlZmVyZW5jZSBxdWFsaWZpZXIiKTsKLSAgICBJbnZva2VyRnVuY3Rpb25UeSA9IFMuQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoQ2FsbE9wUHJvdG8tPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgQ2FsbE9wUHJvdG8tPmdldEFyZ1R5cGVzKCksIEludm9rZXJFeHRJbmZvKTsKKyAgICBJbnZva2VyRnVuY3Rpb25UeSA9CisgICAgICAgIFMuQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoQ2FsbE9wUHJvdG8tPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsT3BQcm90by0+Z2V0UGFyYW1UeXBlcygpLCBJbnZva2VyRXh0SW5mbyk7CiAgICAgUHRyVG9GdW5jdGlvblR5ID0gUy5Db250ZXh0LmdldFBvaW50ZXJUeXBlKEludm9rZXJGdW5jdGlvblR5KTsKICAgfQogCkBAIC0xMTIyLDcgKzEyMjYsNyBAQAogICAgICAgQ29udlRTSS0+Z2V0VHlwZUxvYygpLmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlTG9jPigpOwogICAvLyBHZXQgdGhlIHJlc3VsdCBvZiB0aGUgY29udmVyc2lvbiBmdW5jdGlvbiB3aGljaCBpcyBhIHBvaW50ZXItdG8tZnVuY3Rpb24uCiAgIFBvaW50ZXJUeXBlTG9jIFB0clRvRnVuY3Rpb25UTCA9IAotICAgICAgQ29udlRMLmdldFJlc3VsdExvYygpLmdldEFzPFBvaW50ZXJUeXBlTG9jPigpOworICAgICAgQ29udlRMLmdldFJldHVybkxvYygpLmdldEFzPFBvaW50ZXJUeXBlTG9jPigpOwogICAvLyBEbyB0aGUgc2FtZSBmb3IgdGhlIFR5cGVTb3VyY2VJbmZvIHRoYXQgaXMgdXNlZCB0byBuYW1lIHRoZSBjb252ZXJzaW9uCiAgIC8vIG9wZXJhdG9yLgogICBQb2ludGVyVHlwZUxvYyBDb252TmFtZVB0clRvRnVuY3Rpb25UTCA9IApAQCAtMTE1Nyw4ICsxMjYxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyb20tPmdldFR5cGVTb3VyY2VJbmZvKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9tLT5nZXRTdG9yYWdlQ2xhc3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRGVmYXVsdEFyZz0qLzApKTsKLSAgICBDYWxsT3BDb252VEwuc2V0QXJnKEksIEZyb20pOwotICAgIENhbGxPcENvbnZOYW1lVEwuc2V0QXJnKEksIEZyb20pOworICAgIENhbGxPcENvbnZUTC5zZXRQYXJhbShJLCBGcm9tKTsKKyAgICBDYWxsT3BDb252TmFtZVRMLnNldFBhcmFtKEksIEZyb20pOwogICB9CiAKICAgQ1hYQ29udmVyc2lvbkRlY2wgKkNvbnZlcnNpb24gCkBAIC0xMjQ0LDcgKzEzNDgsNyBAQAogICAgIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gRXh0SW5mbyA9IFByb3RvLT5nZXRFeHRQcm90b0luZm8oKTsKICAgICBFeHRJbmZvLlR5cGVRdWFscyA9IDA7CiAgICAgUXVhbFR5cGUgRnVuY3Rpb25UeSA9IFMuQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoCi0gICAgICAgIFByb3RvLT5nZXRSZXN1bHRUeXBlKCksIFByb3RvLT5nZXRBcmdUeXBlcygpLCBFeHRJbmZvKTsKKyAgICAgICAgUHJvdG8tPmdldFJldHVyblR5cGUoKSwgUHJvdG8tPmdldFBhcmFtVHlwZXMoKSwgRXh0SW5mbyk7CiAgICAgQmxvY2tQdHJUeSA9IFMuQ29udGV4dC5nZXRCbG9ja1BvaW50ZXJUeXBlKEZ1bmN0aW9uVHkpOwogICB9CiAKQEAgLTEzNjksNyArMTQ3Myw3IEBACiAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqUHJvdG8KICAgICAgICAgPSBDYWxsT3BlcmF0b3ItPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CiAgICAgICBRdWFsVHlwZSBGdW5jdGlvblR5ID0gQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoCi0gICAgICAgICAgTFNJLT5SZXR1cm5UeXBlLCBQcm90by0+Z2V0QXJnVHlwZXMoKSwgUHJvdG8tPmdldEV4dFByb3RvSW5mbygpKTsKKyAgICAgICAgICBMU0ktPlJldHVyblR5cGUsIFByb3RvLT5nZXRQYXJhbVR5cGVzKCksIFByb3RvLT5nZXRFeHRQcm90b0luZm8oKSk7CiAgICAgICBDYWxsT3BlcmF0b3ItPnNldFR5cGUoRnVuY3Rpb25UeSk7CiAgICAgfQogICAgIC8vIEMrKyBbZXhwci5wcmltLmxhbWJkYV1wNzoKQEAgLTE0MDcsMTIgKzE1MTEsOSBAQAogICAgICAgYWRkQmxvY2tQb2ludGVyQ29udmVyc2lvbigqdGhpcywgSW50cm9kdWNlclJhbmdlLCBDbGFzcywgQ2FsbE9wZXJhdG9yKTsKICAgICAKICAgICAvLyBGaW5hbGl6ZSB0aGUgbGFtYmRhIGNsYXNzLgotICAgIFNtYWxsVmVjdG9yPERlY2wqLCA0PiBGaWVsZHM7Ci0gICAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBpID0gQ2xhc3MtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gQ2xhc3MtPmZpZWxkX2VuZCgpOyBpICE9IGU7ICsraSkKLSAgICAgIEZpZWxkcy5wdXNoX2JhY2soKmkpOwotICAgIEFjdE9uRmllbGRzKDAsIENsYXNzLT5nZXRMb2NhdGlvbigpLCBDbGFzcywgRmllbGRzLCAKLSAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLCAwKTsKKyAgICBTbWFsbFZlY3RvcjxEZWNsKiwgND4gRmllbGRzKENsYXNzLT5maWVsZHMoKSk7CisgICAgQWN0T25GaWVsZHMoMCwgQ2xhc3MtPmdldExvY2F0aW9uKCksIENsYXNzLCBGaWVsZHMsIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgMCk7CiAgICAgQ2hlY2tDb21wbGV0ZWRDWFhDbGFzcyhDbGFzcyk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL1NlbWEvU2VtYUxvb2t1cC5jcHAgYi9saWIvU2VtYS9TZW1hTG9va3VwLmNwcAppbmRleCA5MTljNmFkLi5hYzZmYjI1IDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hTG9va3VwLmNwcAorKysgYi9saWIvU2VtYS9TZW1hTG9va3VwLmNwcApAQCAtMTEzLDEwICsxMTMsOCBAQAogICAgICAgICBpZiAoQ3R4ICYmIEN0eC0+aXNGaWxlQ29udGV4dCgpKSB7CiAgICAgICAgICAgdmlzaXQoQ3R4LCBDdHgpOwogICAgICAgICB9IGVsc2UgaWYgKCFDdHggfHwgQ3R4LT5pc0Z1bmN0aW9uT3JNZXRob2QoKSkgewotICAgICAgICAgIFNjb3BlOjp1ZGlyX2l0ZXJhdG9yIEkgPSBTLT51c2luZ19kaXJlY3RpdmVzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCA9IFMtPnVzaW5nX2RpcmVjdGl2ZXNfZW5kKCk7Ci0gICAgICAgICAgZm9yICg7IEkgIT0gRW5kOyArK0kpCi0gICAgICAgICAgICB2aXNpdCgqSSwgSW5uZXJtb3N0RmlsZURDKTsKKyAgICAgICAgICBmb3IgKGF1dG8gKkkgOiBTLT51c2luZ19kaXJlY3RpdmVzKCkpCisgICAgICAgICAgICB2aXNpdChJLCBJbm5lcm1vc3RGaWxlREMpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMTUzLDkgKzE1MSw3IEBACiAgICAgdm9pZCBhZGRVc2luZ0RpcmVjdGl2ZXMoRGVjbENvbnRleHQgKkRDLCBEZWNsQ29udGV4dCAqRWZmZWN0aXZlREMpIHsKICAgICAgIFNtYWxsVmVjdG9yPERlY2xDb250ZXh0Kiw0PiBxdWV1ZTsKICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIERlY2xDb250ZXh0Ojp1ZGlyX2l0ZXJhdG9yIEksIEVuZDsKLSAgICAgICAgZm9yIChsbHZtOjp0aWUoSSwgRW5kKSA9IERDLT5nZXRVc2luZ0RpcmVjdGl2ZXMoKTsgSSAhPSBFbmQ7ICsrSSkgewotICAgICAgICAgIFVzaW5nRGlyZWN0aXZlRGVjbCAqVUQgPSAqSTsKKyAgICAgICAgZm9yIChhdXRvIFVEIDogREMtPnVzaW5nX2RpcmVjdGl2ZXMoKSkgewogICAgICAgICAgIERlY2xDb250ZXh0ICpOUyA9IFVELT5nZXROb21pbmF0ZWROYW1lc3BhY2UoKTsKICAgICAgICAgICBpZiAodmlzaXRlZC5pbnNlcnQoTlMpKSB7CiAgICAgICAgICAgICBhZGRVc2luZ0RpcmVjdGl2ZShVRCwgRWZmZWN0aXZlREMpOwpAQCAtMjg4LDM2ICsyODQsMzMgQEAKICAgSUROUyA9IGdldElETlMoTG9va3VwS2luZCwgU2VtYVJlZi5nZXRMYW5nT3B0cygpLkNQbHVzUGx1cywKICAgICAgICAgICAgICAgICAgaXNGb3JSZWRlY2xhcmF0aW9uKCkpOwogCi0gIGlmICghaXNGb3JSZWRlY2xhcmF0aW9uKCkpIHsKLSAgICAvLyBJZiB3ZSdyZSBsb29raW5nIGZvciBvbmUgb2YgdGhlIGFsbG9jYXRpb24gb3IgZGVhbGxvY2F0aW9uCi0gICAgLy8gb3BlcmF0b3JzLCBtYWtlIHN1cmUgdGhhdCB0aGUgaW1wbGljaXRseS1kZWNsYXJlZCBuZXcgYW5kIGRlbGV0ZQotICAgIC8vIG9wZXJhdG9ycyBjYW4gYmUgZm91bmQuCi0gICAgc3dpdGNoIChOYW1lSW5mby5nZXROYW1lKCkuZ2V0Q1hYT3ZlcmxvYWRlZE9wZXJhdG9yKCkpIHsKLSAgICBjYXNlIE9PX05ldzoKLSAgICBjYXNlIE9PX0RlbGV0ZToKLSAgICBjYXNlIE9PX0FycmF5X05ldzoKLSAgICBjYXNlIE9PX0FycmF5X0RlbGV0ZToKLSAgICAgIFNlbWFSZWYuRGVjbGFyZUdsb2JhbE5ld0RlbGV0ZSgpOwotICAgICAgYnJlYWs7CisgIC8vIElmIHdlJ3JlIGxvb2tpbmcgZm9yIG9uZSBvZiB0aGUgYWxsb2NhdGlvbiBvciBkZWFsbG9jYXRpb24KKyAgLy8gb3BlcmF0b3JzLCBtYWtlIHN1cmUgdGhhdCB0aGUgaW1wbGljaXRseS1kZWNsYXJlZCBuZXcgYW5kIGRlbGV0ZQorICAvLyBvcGVyYXRvcnMgY2FuIGJlIGZvdW5kLgorICBzd2l0Y2ggKE5hbWVJbmZvLmdldE5hbWUoKS5nZXRDWFhPdmVybG9hZGVkT3BlcmF0b3IoKSkgeworICBjYXNlIE9PX05ldzoKKyAgY2FzZSBPT19EZWxldGU6CisgIGNhc2UgT09fQXJyYXlfTmV3OgorICBjYXNlIE9PX0FycmF5X0RlbGV0ZToKKyAgICBTZW1hUmVmLkRlY2xhcmVHbG9iYWxOZXdEZWxldGUoKTsKKyAgICBicmVhazsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KIAotICAgIC8vIENvbXBpbGVyIGJ1aWx0aW5zIGFyZSBhbHdheXMgdmlzaWJsZSwgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGV5IGVuZAotICAgIC8vIHVwIGJlaW5nIGRlY2xhcmVkLgotICAgIGlmIChJZGVudGlmaWVySW5mbyAqSWQgPSBOYW1lSW5mby5nZXROYW1lKCkuZ2V0QXNJZGVudGlmaWVySW5mbygpKSB7Ci0gICAgICBpZiAodW5zaWduZWQgQnVpbHRpbklEID0gSWQtPmdldEJ1aWx0aW5JRCgpKSB7Ci0gICAgICAgIGlmICghU2VtYVJlZi5Db250ZXh0LkJ1aWx0aW5JbmZvLmlzUHJlZGVmaW5lZExpYkZ1bmN0aW9uKEJ1aWx0aW5JRCkpCi0gICAgICAgICAgQWxsb3dIaWRkZW4gPSB0cnVlOwotICAgICAgfQorICAvLyBDb21waWxlciBidWlsdGlucyBhcmUgYWx3YXlzIHZpc2libGUsIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhleSBlbmQKKyAgLy8gdXAgYmVpbmcgZGVjbGFyZWQuCisgIGlmIChJZGVudGlmaWVySW5mbyAqSWQgPSBOYW1lSW5mby5nZXROYW1lKCkuZ2V0QXNJZGVudGlmaWVySW5mbygpKSB7CisgICAgaWYgKHVuc2lnbmVkIEJ1aWx0aW5JRCA9IElkLT5nZXRCdWlsdGluSUQoKSkgeworICAgICAgaWYgKCFTZW1hUmVmLkNvbnRleHQuQnVpbHRpbkluZm8uaXNQcmVkZWZpbmVkTGliRnVuY3Rpb24oQnVpbHRpbklEKSkKKyAgICAgICAgQWxsb3dIaWRkZW4gPSB0cnVlOwogICAgIH0KICAgfQogfQogCi12b2lkIExvb2t1cFJlc3VsdDo6c2FuaXR5SW1wbCgpIGNvbnN0IHsKLSAgLy8gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkIGJ5IE5ERUJVRyBidWlsZHMuIFNlZQotICAvLyBMb29rdXBSZXN1bHQ6OnNhbml0eSgpLgorYm9vbCBMb29rdXBSZXN1bHQ6OnNhbml0eSgpIGNvbnN0IHsKKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQgYnkgTkRFQlVHIGJ1aWxkcy4KICAgYXNzZXJ0KFJlc3VsdEtpbmQgIT0gTm90Rm91bmQgfHwgRGVjbHMuc2l6ZSgpID09IDApOwogICBhc3NlcnQoUmVzdWx0S2luZCAhPSBGb3VuZCB8fCBEZWNscy5zaXplKCkgPT0gMSk7CiAgIGFzc2VydChSZXN1bHRLaW5kICE9IEZvdW5kT3ZlcmxvYWRlZCB8fCBEZWNscy5zaXplKCkgPiAxIHx8CkBAIC0zMzAsNiArMzIzLDcgQEAKICAgYXNzZXJ0KChQYXRocyAhPSBOVUxMKSA9PSAoUmVzdWx0S2luZCA9PSBBbWJpZ3VvdXMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFtYmlndWl0eSA9PSBBbWJpZ3VvdXNCYXNlU3Vib2JqZWN0VHlwZXMgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFtYmlndWl0eSA9PSBBbWJpZ3VvdXNCYXNlU3Vib2JqZWN0cykpKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIC8vIE5lY2Vzc2FyeSBiZWNhdXNlIENYWEJhc2VQYXRocyBpcyBub3QgY29tcGxldGUgaW4gU2VtYS5oCkBAIC01NDQsMTQgKzUzOCw2IEBACiAgICAgICAgICAgUi5hZGREZWNsKEQpOwogICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFIuaXNGb3JSZWRlY2xhcmF0aW9uKCkpIHsKLSAgICAgICAgICAvLyBJZiB3ZSdyZSByZWRlY2xhcmluZyB0aGlzIGZ1bmN0aW9uIGFueXdheSwgZm9yZ2V0IHRoYXQKLSAgICAgICAgICAvLyB0aGlzIHdhcyBhIGJ1aWx0aW4gYXQgYWxsLgotICAgICAgICAgIFMuQ29udGV4dC5CdWlsdGluSW5mby5Gb3JnZXRCdWlsdGluKEJ1aWx0aW5JRCwgUy5Db250ZXh0LklkZW50cyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC03NzcsNyArNzYzLDcgQEAKICAgLy8gUGVyZm9ybSBkaXJlY3QgbmFtZSBsb29rdXAgaW50byB0aGUgbmFtZXNwYWNlcyBub21pbmF0ZWQgYnkgdGhlCiAgIC8vIHVzaW5nIGRpcmVjdGl2ZXMgd2hvc2UgY29tbW9uIGFuY2VzdG9yIGlzIHRoaXMgbmFtZXNwYWNlLgogICBVbnF1YWxVc2luZ0RpcmVjdGl2ZVNldDo6Y29uc3RfaXRlcmF0b3IgVUksIFVFbmQ7Ci0gIGxsdm06OnRpZShVSSwgVUVuZCkgPSBVRGlycy5nZXROYW1lc3BhY2VzRm9yKE5TKTsKKyAgc3RkOjp0aWUoVUksIFVFbmQpID0gVURpcnMuZ2V0TmFtZXNwYWNlc0ZvcihOUyk7CiAKICAgZm9yICg7IFVJICE9IFVFbmQ7ICsrVUkpCiAgICAgaWYgKExvb2t1cERpcmVjdChTLCBSLCBVSS0+Z2V0Tm9taW5hdGVkTmFtZXNwYWNlKCkpKQpAQCAtOTg5LDcgKzk3NSw3IEBACiAgICAgaWYgKEN0eCkgewogICAgICAgRGVjbENvbnRleHQgKk91dGVyQ3R4OwogICAgICAgYm9vbCBTZWFyY2hBZnRlclRlbXBsYXRlU2NvcGU7Ci0gICAgICBsbHZtOjp0aWUoT3V0ZXJDdHgsIFNlYXJjaEFmdGVyVGVtcGxhdGVTY29wZSkgPSBmaW5kT3V0ZXJDb250ZXh0KFMpOworICAgICAgc3RkOjp0aWUoT3V0ZXJDdHgsIFNlYXJjaEFmdGVyVGVtcGxhdGVTY29wZSkgPSBmaW5kT3V0ZXJDb250ZXh0KFMpOwogICAgICAgaWYgKFNlYXJjaEFmdGVyVGVtcGxhdGVTY29wZSkKICAgICAgICAgT3V0c2lkZU9mVGVtcGxhdGVQYXJhbURDID0gT3V0ZXJDdHg7CiAKQEAgLTExMzIsNyArMTExOCw3IEBACiAgICAgaWYgKEN0eCkgewogICAgICAgRGVjbENvbnRleHQgKk91dGVyQ3R4OwogICAgICAgYm9vbCBTZWFyY2hBZnRlclRlbXBsYXRlU2NvcGU7Ci0gICAgICBsbHZtOjp0aWUoT3V0ZXJDdHgsIFNlYXJjaEFmdGVyVGVtcGxhdGVTY29wZSkgPSBmaW5kT3V0ZXJDb250ZXh0KFMpOworICAgICAgc3RkOjp0aWUoT3V0ZXJDdHgsIFNlYXJjaEFmdGVyVGVtcGxhdGVTY29wZSkgPSBmaW5kT3V0ZXJDb250ZXh0KFMpOwogICAgICAgaWYgKFNlYXJjaEFmdGVyVGVtcGxhdGVTY29wZSkKICAgICAgICAgT3V0c2lkZU9mVGVtcGxhdGVQYXJhbURDID0gT3V0ZXJDdHg7CiAKQEAgLTEyNzgsOSArMTI2NCw4IEBACiBzdGF0aWMgTmFtZWREZWNsICpmaW5kQWNjZXB0YWJsZURlY2woU2VtYSAmU2VtYVJlZiwgTmFtZWREZWNsICpEKSB7CiAgIGFzc2VydCghTG9va3VwUmVzdWx0Ojppc1Zpc2libGUoU2VtYVJlZiwgRCkgJiYgIm5vdCBpbiBzbG93IGNhc2UiKTsKIAotICBmb3IgKERlY2w6OnJlZGVjbF9pdGVyYXRvciBSRCA9IEQtPnJlZGVjbHNfYmVnaW4oKSwgUkRFbmQgPSBELT5yZWRlY2xzX2VuZCgpOwotICAgICAgIFJEICE9IFJERW5kOyArK1JEKSB7Ci0gICAgaWYgKE5hbWVkRGVjbCAqTkQgPSBkeW5fY2FzdDxOYW1lZERlY2w+KCpSRCkpIHsKKyAgZm9yIChhdXRvIFJEIDogRC0+cmVkZWNscygpKSB7CisgICAgaWYgKGF1dG8gTkQgPSBkeW5fY2FzdDxOYW1lZERlY2w+KFJEKSkgewogICAgICAgaWYgKExvb2t1cFJlc3VsdDo6aXNWaXNpYmxlKFNlbWFSZWYsIE5EKSkKICAgICAgICAgcmV0dXJuIE5EOwogICAgIH0KQEAgLTE0NjIsMTAgKzE0NDcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0ICpTdGFydERDKSB7CiAgIGFzc2VydChTdGFydERDLT5pc0ZpbGVDb250ZXh0KCkgJiYgInN0YXJ0IGNvbnRleHQgaXMgbm90IGEgZmlsZSBjb250ZXh0Iik7CiAKLSAgRGVjbENvbnRleHQ6OnVkaXJfaXRlcmF0b3IgSSA9IFN0YXJ0REMtPnVzaW5nX2RpcmVjdGl2ZXNfYmVnaW4oKTsKLSAgRGVjbENvbnRleHQ6OnVkaXJfaXRlcmF0b3IgRSA9IFN0YXJ0REMtPnVzaW5nX2RpcmVjdGl2ZXNfZW5kKCk7Ci0KLSAgaWYgKEkgPT0gRSkgcmV0dXJuIGZhbHNlOworICBEZWNsQ29udGV4dDo6dWRpcl9yYW5nZSBVc2luZ0RpcmVjdGl2ZXMgPSBTdGFydERDLT51c2luZ19kaXJlY3RpdmVzKCk7CisgIGlmIChVc2luZ0RpcmVjdGl2ZXMuYmVnaW4oKSA9PSBVc2luZ0RpcmVjdGl2ZXMuZW5kKCkpIHJldHVybiBmYWxzZTsKIAogICAvLyBXZSBoYXZlIGF0IGxlYXN0IGFkZGVkIGFsbCB0aGVzZSBjb250ZXh0cyB0byB0aGUgcXVldWUuCiAgIGxsdm06OlNtYWxsUHRyU2V0PERlY2xDb250ZXh0KiwgOD4gVmlzaXRlZDsKQEAgLTE0NzcsOCArMTQ2MCw4IEBACiAKICAgLy8gV2UgaGF2ZSBhbHJlYWR5IGxvb2tlZCBpbnRvIHRoZSBpbml0aWFsIG5hbWVzcGFjZTsgc2VlZCB0aGUgcXVldWUKICAgLy8gd2l0aCBpdHMgdXNpbmctY2hpbGRyZW4uCi0gIGZvciAoOyBJICE9IEU7ICsrSSkgewotICAgIE5hbWVzcGFjZURlY2wgKk5EID0gKCpJKS0+Z2V0Tm9taW5hdGVkTmFtZXNwYWNlKCktPmdldE9yaWdpbmFsTmFtZXNwYWNlKCk7CisgIGZvciAoYXV0byAqSSA6IFVzaW5nRGlyZWN0aXZlcykgeworICAgIE5hbWVzcGFjZURlY2wgKk5EID0gSS0+Z2V0Tm9taW5hdGVkTmFtZXNwYWNlKCktPmdldE9yaWdpbmFsTmFtZXNwYWNlKCk7CiAgICAgaWYgKFZpc2l0ZWQuaW5zZXJ0KE5EKSkKICAgICAgIFF1ZXVlLnB1c2hfYmFjayhORCk7CiAgIH0KQEAgLTE1MjUsOCArMTUwOCw4IEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAKLSAgICBmb3IgKGxsdm06OnRpZShJLEUpID0gTkQtPmdldFVzaW5nRGlyZWN0aXZlcygpOyBJICE9IEU7ICsrSSkgewotICAgICAgTmFtZXNwYWNlRGVjbCAqTm9tID0gKCpJKS0+Z2V0Tm9taW5hdGVkTmFtZXNwYWNlKCk7CisgICAgZm9yIChhdXRvIEkgOiBORC0+dXNpbmdfZGlyZWN0aXZlcygpKSB7CisgICAgICBOYW1lc3BhY2VEZWNsICpOb20gPSBJLT5nZXROb21pbmF0ZWROYW1lc3BhY2UoKTsKICAgICAgIGlmIChWaXNpdGVkLmluc2VydChOb20pKQogICAgICAgICBRdWV1ZS5wdXNoX2JhY2soTm9tKTsKICAgICB9CkBAIC0yMDM5LDYgKzIwMjIsMTAgQEAKIAogICAvLyBBZGQgdGhlIGNsYXNzIGl0c2VsZi4gSWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgY2xhc3MsIHdlIGRvbid0CiAgIC8vIG5lZWQgdG8gdmlzaXQgYmFzZSBjbGFzc2VzLgorICAvLworICAvLyBGSVhNRTogVGhhdCdzIG5vdCBjb3JyZWN0LCB3ZSBtYXkgaGF2ZSBhZGRlZCB0aGlzIGNsYXNzIG9ubHkgYmVjYXVzZSBpdAorICAvLyB3YXMgdGhlIGVuY2xvc2luZyBjbGFzcyBvZiBhbm90aGVyIGNsYXNzLCBhbmQgaW4gdGhhdCBjYXNlIHdlIHdvbid0IGhhdmUKKyAgLy8gYWRkZWQgaXRzIGJhc2UgY2xhc3NlcyB5ZXQuCiAgIGlmICghUmVzdWx0LkNsYXNzZXMuaW5zZXJ0KENsYXNzKSkKICAgICByZXR1cm47CiAKQEAgLTIwNjUsMTIgKzIwNTIsOCBAQAogICB9CiAKICAgLy8gT25seSByZWN1cnNlIGludG8gYmFzZSBjbGFzc2VzIGZvciBjb21wbGV0ZSB0eXBlcy4KLSAgaWYgKCFDbGFzcy0+aGFzRGVmaW5pdGlvbigpKSB7Ci0gICAgUXVhbFR5cGUgdHlwZSA9IFJlc3VsdC5TLkNvbnRleHQuZ2V0VHlwZURlY2xUeXBlKENsYXNzKTsKLSAgICBpZiAoUmVzdWx0LlMuUmVxdWlyZUNvbXBsZXRlVHlwZShSZXN1bHQuSW5zdGFudGlhdGlvbkxvYywgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5vIGRpYWdub3N0aWMqLyAwKSkKLSAgICAgIHJldHVybjsKLSAgfQorICBpZiAoIUNsYXNzLT5oYXNEZWZpbml0aW9uKCkpCisgICAgcmV0dXJuOwogCiAgIC8vIEFkZCBkaXJlY3QgYW5kIGluZGlyZWN0IGJhc2UgY2xhc3NlcyBhbG9uZyB3aXRoIHRoZWlyIGFzc29jaWF0ZWQKICAgLy8gbmFtZXNwYWNlcy4KQEAgLTIwODEsMTAgKzIwNjQsOCBAQAogICAgIENsYXNzID0gQmFzZXMucG9wX2JhY2tfdmFsKCk7CiAKICAgICAvLyBWaXNpdCB0aGUgYmFzZSBjbGFzc2VzLgotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBCYXNlID0gQ2xhc3MtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VFbmQgPSBDbGFzcy0+YmFzZXNfZW5kKCk7Ci0gICAgICAgICBCYXNlICE9IEJhc2VFbmQ7ICsrQmFzZSkgewotICAgICAgY29uc3QgUmVjb3JkVHlwZSAqQmFzZVR5cGUgPSBCYXNlLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCk7CisgICAgZm9yIChjb25zdCBhdXRvICZCYXNlIDogQ2xhc3MtPmJhc2VzKCkpIHsKKyAgICAgIGNvbnN0IFJlY29yZFR5cGUgKkJhc2VUeXBlID0gQmFzZS5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCk7CiAgICAgICAvLyBJbiBkZXBlbmRlbnQgY29udGV4dHMsIHdlIGRvIEFETCB0d2ljZSwgYW5kIHRoZSBmaXJzdCB0aW1lIGFyb3VuZCwKICAgICAgIC8vIHRoZSBiYXNlIHR5cGUgbWlnaHQgYmUgYSBkZXBlbmRlbnQgVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUsIG9yIGEKICAgICAgIC8vIFRlbXBsYXRlVHlwZVBhcm1UeXBlLiBJZiB0aGF0IGhhcHBlbnMsIHNpbXBseSBpZ25vcmUgaXQuCkBAIC0yMTY0LDYgKzIxNDUsOCBAQAogICAgIC8vICAgICAgICBjbGFzc2VzLiBJdHMgYXNzb2NpYXRlZCBuYW1lc3BhY2VzIGFyZSB0aGUgbmFtZXNwYWNlcyBpbgogICAgIC8vICAgICAgICB3aGljaCBpdHMgYXNzb2NpYXRlZCBjbGFzc2VzIGFyZSBkZWZpbmVkLgogICAgIGNhc2UgVHlwZTo6UmVjb3JkOiB7CisgICAgICBSZXN1bHQuUy5SZXF1aXJlQ29tcGxldGVUeXBlKFJlc3VsdC5JbnN0YW50aWF0aW9uTG9jLCBRdWFsVHlwZShULCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypubyBkaWFnbm9zdGljKi8gMCk7CiAgICAgICBDWFhSZWNvcmREZWNsICpDbGFzcwogICAgICAgICA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oY2FzdDxSZWNvcmRUeXBlPihUKS0+Z2V0RGVjbCgpKTsKICAgICAgIGFkZEFzc29jaWF0ZWRDbGFzc2VzQW5kTmFtZXNwYWNlcyhSZXN1bHQsIENsYXNzKTsKQEAgLTIxOTIsMTUgKzIxNzUsMTMgQEAKICAgICAvLyAgICAgICAgdHlwZXMgYW5kIHRob3NlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmV0dXJuIHR5cGUuCiAgICAgY2FzZSBUeXBlOjpGdW5jdGlvblByb3RvOiB7CiAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqUHJvdG8gPSBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihUKTsKLSAgICAgIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yIEFyZyA9IFByb3RvLT5hcmdfdHlwZV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnRW5kID0gUHJvdG8tPmFyZ190eXBlX2VuZCgpOwotICAgICAgICAgICAgIEFyZyAhPSBBcmdFbmQ7ICsrQXJnKQotICAgICAgICBRdWV1ZS5wdXNoX2JhY2soQXJnLT5nZXRUeXBlUHRyKCkpOworICAgICAgZm9yIChjb25zdCBhdXRvICZBcmcgOiBQcm90by0+cGFyYW1fdHlwZXMoKSkKKyAgICAgICAgUXVldWUucHVzaF9iYWNrKEFyZy5nZXRUeXBlUHRyKCkpOwogICAgICAgLy8gZmFsbHRocm91Z2gKICAgICB9CiAgICAgY2FzZSBUeXBlOjpGdW5jdGlvbk5vUHJvdG86IHsKICAgICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRm5UeXBlID0gY2FzdDxGdW5jdGlvblR5cGU+KFQpOwotICAgICAgVCA9IEZuVHlwZS0+Z2V0UmVzdWx0VHlwZSgpLmdldFR5cGVQdHIoKTsKKyAgICAgIFQgPSBGblR5cGUtPmdldFJldHVyblR5cGUoKS5nZXRUeXBlUHRyKCk7CiAgICAgICBjb250aW51ZTsKICAgICB9CiAKQEAgLTIzMTgsMTEgKzIyOTksNyBAQAogICAgIGZvciAoVW5yZXNvbHZlZFNldEl0ZXJhdG9yIEkgPSBVTEUtPmRlY2xzX2JlZ2luKCksIEUgPSBVTEUtPmRlY2xzX2VuZCgpOwogICAgICAgICAgICBJICE9IEU7ICsrSSkgewogICAgICAgLy8gTG9vayB0aHJvdWdoIGFueSB1c2luZyBkZWNsYXJhdGlvbnMgdG8gZmluZCB0aGUgdW5kZXJseWluZyBmdW5jdGlvbi4KLSAgICAgIE5hbWVkRGVjbCAqRm4gPSAoKkkpLT5nZXRVbmRlcmx5aW5nRGVjbCgpOwotCi0gICAgICBGdW5jdGlvbkRlY2wgKkZEZWNsID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihGbik7Ci0gICAgICBpZiAoIUZEZWNsKQotICAgICAgICBGRGVjbCA9IGNhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEZuKS0+Z2V0VGVtcGxhdGVkRGVjbCgpOworICAgICAgRnVuY3Rpb25EZWNsICpGRGVjbCA9ICgqSSktPmdldFVuZGVybHlpbmdEZWNsKCktPmdldEFzRnVuY3Rpb24oKTsKIAogICAgICAgLy8gQWRkIHRoZSBjbGFzc2VzIGFuZCBuYW1lc3BhY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyYW1ldGVyCiAgICAgICAvLyB0eXBlcyBhbmQgcmV0dXJuIHR5cGUgb2YgdGhpcyBmdW5jdGlvbi4KQEAgLTIzNDcsMjAgKzIzMjQsMjAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIAogICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqUHJvdG8gPSBGbi0+Z2V0VHlwZSgpLT5nZXRBczxGdW5jdGlvblByb3RvVHlwZT4oKTsKLSAgaWYgKFByb3RvLT5nZXROdW1BcmdzKCkgPCAxKQorICBpZiAoUHJvdG8tPmdldE51bVBhcmFtcygpIDwgMSkKICAgICByZXR1cm4gZmFsc2U7CiAKICAgaWYgKFQxLT5pc0VudW1lcmFsVHlwZSgpKSB7Ci0gICAgUXVhbFR5cGUgQXJnVHlwZSA9IFByb3RvLT5nZXRBcmdUeXBlKDApLmdldE5vblJlZmVyZW5jZVR5cGUoKTsKKyAgICBRdWFsVHlwZSBBcmdUeXBlID0gUHJvdG8tPmdldFBhcmFtVHlwZSgwKS5nZXROb25SZWZlcmVuY2VUeXBlKCk7CiAgICAgaWYgKENvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShUMSwgQXJnVHlwZSkpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIGlmIChQcm90by0+Z2V0TnVtQXJncygpIDwgMikKKyAgaWYgKFByb3RvLT5nZXROdW1QYXJhbXMoKSA8IDIpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIGlmICghVDIuaXNOdWxsKCkgJiYgVDItPmlzRW51bWVyYWxUeXBlKCkpIHsKLSAgICBRdWFsVHlwZSBBcmdUeXBlID0gUHJvdG8tPmdldEFyZ1R5cGUoMSkuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpOworICAgIFF1YWxUeXBlIEFyZ1R5cGUgPSBQcm90by0+Z2V0UGFyYW1UeXBlKDEpLmdldE5vblJlZmVyZW5jZVR5cGUoKTsKICAgICBpZiAoQ29udGV4dC5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKFQyLCBBcmdUeXBlKSkKICAgICAgIHJldHVybiB0cnVlOwogICB9CkBAIC0yNTQ1LDcgKzI1MjIsNyBAQAogICAvLyBOb3cgd2UgcGVyZm9ybSBsb29rdXAgb24gdGhlIG5hbWUgd2UgY29tcHV0ZWQgZWFybGllciBhbmQgZG8gb3ZlcmxvYWQKICAgLy8gcmVzb2x1dGlvbi4gTG9va3VwIGlzIG9ubHkgcGVyZm9ybWVkIGRpcmVjdGx5IGludG8gdGhlIGNsYXNzIHNpbmNlIHRoZXJlCiAgIC8vIHdpbGwgYWx3YXlzIGJlIGEgKHBvc3NpYmx5IGltcGxpY2l0KSBkZWNsYXJhdGlvbiB0byBzaGFkb3cgYW55IG90aGVycy4KLSAgT3ZlcmxvYWRDYW5kaWRhdGVTZXQgT0NTKChTb3VyY2VMb2NhdGlvbigpKSk7CisgIE92ZXJsb2FkQ2FuZGlkYXRlU2V0IE9DUyhSRC0+Z2V0TG9jYXRpb24oKSk7CiAgIERlY2xDb250ZXh0Ojpsb29rdXBfcmVzdWx0IFIgPSBSRC0+bG9va3VwKE5hbWUpOwogICBhc3NlcnQoIVIuZW1wdHkoKSAmJgogICAgICAgICAgImxvb2t1cCBmb3IgYSBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50IG9wZXJhdG9yIHdhcyBlbXB0eSIpOwpAQCAtMjgxMiwxNCArMjc4OSw4IEBACiAgIC8vIG9wZXJhdG9yIHRlbXBsYXRlLCBidXQgbm90IGJvdGguCiAgIGlmIChGb3VuZFJhdyAmJiBGb3VuZFRlbXBsYXRlKSB7CiAgICAgRGlhZyhSLmdldE5hbWVMb2MoKSwgZGlhZzo6ZXJyX292bF9hbWJpZ3VvdXNfY2FsbCkgPDwgUi5nZXRMb29rdXBOYW1lKCk7Ci0gICAgZm9yIChMb29rdXBSZXN1bHQ6Oml0ZXJhdG9yIEkgPSBSLmJlZ2luKCksIEUgPSBSLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgRGVjbCAqRCA9ICpJOwotICAgICAgaWYgKFVzaW5nU2hhZG93RGVjbCAqVVNEID0gZHluX2Nhc3Q8VXNpbmdTaGFkb3dEZWNsPihEKSkKLSAgICAgICAgRCA9IFVTRC0+Z2V0VGFyZ2V0RGVjbCgpOwotICAgICAgaWYgKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpGdW5UbXBsID0gZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KEQpKQotICAgICAgICBEID0gRnVuVG1wbC0+Z2V0VGVtcGxhdGVkRGVjbCgpOwotICAgICAgTm90ZU92ZXJsb2FkQ2FuZGlkYXRlKGNhc3Q8RnVuY3Rpb25EZWNsPihEKSk7Ci0gICAgfQorICAgIGZvciAoTG9va3VwUmVzdWx0OjppdGVyYXRvciBJID0gUi5iZWdpbigpLCBFID0gUi5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBOb3RlT3ZlcmxvYWRDYW5kaWRhdGUoKCpJKS0+Z2V0VW5kZXJseWluZ0RlY2woKS0+Z2V0QXNGdW5jdGlvbigpKTsKICAgICByZXR1cm4gTE9MUl9FcnJvcjsKICAgfQogCkBAIC0yODUxLDE0ICsyODIyLDggQEAKICAgfQogCiAgIC8vIE90aGVyd2lzZSwgZGVjaWRlIHdoaWNoIGlzIGEgbW9yZSByZWNlbnQgcmVkZWNsYXJhdGlvbi4KLSAgRnVuY3Rpb25EZWNsICpPbGRGRCwgKk5ld0ZEOwotICBpZiAoaXNhPEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihOZXcpKSB7Ci0gICAgT2xkRkQgPSBjYXN0PEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihPbGQpLT5nZXRUZW1wbGF0ZWREZWNsKCk7Ci0gICAgTmV3RkQgPSBjYXN0PEZ1bmN0aW9uVGVtcGxhdGVEZWNsPihOZXcpLT5nZXRUZW1wbGF0ZWREZWNsKCk7Ci0gIH0gZWxzZSB7Ci0gICAgT2xkRkQgPSBjYXN0PEZ1bmN0aW9uRGVjbD4oT2xkKTsKLSAgICBOZXdGRCA9IGNhc3Q8RnVuY3Rpb25EZWNsPihOZXcpOwotICB9CisgIEZ1bmN0aW9uRGVjbCAqT2xkRkQgPSBPbGQtPmdldEFzRnVuY3Rpb24oKTsKKyAgRnVuY3Rpb25EZWNsICpOZXdGRCA9IE5ldy0+Z2V0QXNGdW5jdGlvbigpOwogCiAgIEZ1bmN0aW9uRGVjbCAqQ3Vyc29yID0gTmV3RkQ7CiAgIHdoaWxlICh0cnVlKSB7CkBAIC0zMDYzLDggKzMwMjgsOCBAQAogICAgICAgLy8gRnVuY3Rpb25zIGFuZCBmdW5jdGlvbiB0ZW1wbGF0ZXMgaW4gdGhlIHNhbWUgc2NvcGUgb3ZlcmxvYWQKICAgICAgIC8vIHJhdGhlciB0aGFuIGhpZGUuICBGSVhNRTogTG9vayBmb3IgaGlkaW5nIGJhc2VkIG9uIGZ1bmN0aW9uCiAgICAgICAvLyBzaWduYXR1cmVzIQotICAgICAgaWYgKCgqSSktPmlzRnVuY3Rpb25PckZ1bmN0aW9uVGVtcGxhdGUoKSAmJgotICAgICAgICAgIE5ELT5pc0Z1bmN0aW9uT3JGdW5jdGlvblRlbXBsYXRlKCkgJiYKKyAgICAgIGlmICgoKkkpLT5nZXRVbmRlcmx5aW5nRGVjbCgpLT5pc0Z1bmN0aW9uT3JGdW5jdGlvblRlbXBsYXRlKCkgJiYKKyAgICAgICAgICBORC0+Z2V0VW5kZXJseWluZ0RlY2woKS0+aXNGdW5jdGlvbk9yRnVuY3Rpb25UZW1wbGF0ZSgpICYmCiAgICAgICAgICAgU00gPT0gU2hhZG93TWFwcy5yYmVnaW4oKSkKICAgICAgICAgY29udGludWU7CiAKQEAgLTMwOTIsMTMgKzMwNTcsOSBAQAogICAgIFJlc3VsdC5nZXRTZW1hKCkuRm9yY2VEZWNsYXJhdGlvbk9mSW1wbGljaXRNZW1iZXJzKENsYXNzKTsKIAogICAvLyBFbnVtZXJhdGUgYWxsIG9mIHRoZSByZXN1bHRzIGluIHRoaXMgY29udGV4dC4KLSAgZm9yIChEZWNsQ29udGV4dDo6YWxsX2xvb2t1cHNfaXRlcmF0b3IgTCA9IEN0eC0+bG9va3Vwc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRW5kID0gQ3R4LT5sb29rdXBzX2VuZCgpOwotICAgICAgIEwgIT0gTEVuZDsgKytMKSB7Ci0gICAgRGVjbENvbnRleHQ6Omxvb2t1cF9yZXN1bHQgUiA9ICpMOwotICAgIGZvciAoRGVjbENvbnRleHQ6Omxvb2t1cF9pdGVyYXRvciBJID0gUi5iZWdpbigpLCBFID0gUi5lbmQoKTsgSSAhPSBFOwotICAgICAgICAgKytJKSB7Ci0gICAgICBpZiAoTmFtZWREZWNsICpORCA9IGR5bl9jYXN0PE5hbWVkRGVjbD4oKkkpKSB7CisgIGZvciAoY29uc3QgYXV0byAmUiA6IEN0eC0+bG9va3VwcygpKSB7CisgICAgZm9yIChhdXRvICpJIDogUikgeworICAgICAgaWYgKE5hbWVkRGVjbCAqTkQgPSBkeW5fY2FzdDxOYW1lZERlY2w+KEkpKSB7CiAgICAgICAgIGlmICgoTkQgPSBSZXN1bHQuZ2V0QWNjZXB0YWJsZURlY2woTkQpKSkgewogICAgICAgICAgIENvbnN1bWVyLkZvdW5kRGVjbChORCwgVmlzaXRlZC5jaGVja0hpZGRlbihORCksIEN0eCwgSW5CYXNlQ2xhc3MpOwogICAgICAgICAgIFZpc2l0ZWQuYWRkKE5EKTsKQEAgLTMxMTAsOSArMzA3MSw4IEBACiAgIC8vIFRyYXZlcnNlIHVzaW5nIGRpcmVjdGl2ZXMgZm9yIHF1YWxpZmllZCBuYW1lIGxvb2t1cC4KICAgaWYgKFF1YWxpZmllZE5hbWVMb29rdXApIHsKICAgICBTaGFkb3dDb250ZXh0UkFJSSBTaGFkb3coVmlzaXRlZCk7Ci0gICAgRGVjbENvbnRleHQ6OnVkaXJfaXRlcmF0b3IgSSwgRTsKLSAgICBmb3IgKGxsdm06OnRpZShJLCBFKSA9IEN0eC0+Z2V0VXNpbmdEaXJlY3RpdmVzKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBMb29rdXBWaXNpYmxlRGVjbHMoKCpJKS0+Z2V0Tm9taW5hdGVkTmFtZXNwYWNlKCksIFJlc3VsdCwKKyAgICBmb3IgKGF1dG8gSSA6IEN0eC0+dXNpbmdfZGlyZWN0aXZlcygpKSB7CisgICAgICBMb29rdXBWaXNpYmxlRGVjbHMoSS0+Z2V0Tm9taW5hdGVkTmFtZXNwYWNlKCksIFJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZWROYW1lTG9va3VwLCBJbkJhc2VDbGFzcywgQ29uc3VtZXIsIFZpc2l0ZWQpOwogICAgIH0KICAgfQpAQCAtMzEyMiwxMCArMzA4Miw4IEBACiAgICAgaWYgKCFSZWNvcmQtPmhhc0RlZmluaXRpb24oKSkKICAgICAgIHJldHVybjsKIAotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBCID0gUmVjb3JkLT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRW5kID0gUmVjb3JkLT5iYXNlc19lbmQoKTsKLSAgICAgICAgIEIgIT0gQkVuZDsgKytCKSB7Ci0gICAgICBRdWFsVHlwZSBCYXNlVHlwZSA9IEItPmdldFR5cGUoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkIgOiBSZWNvcmQtPmJhc2VzKCkpIHsKKyAgICAgIFF1YWxUeXBlIEJhc2VUeXBlID0gQi5nZXRUeXBlKCk7CiAKICAgICAgIC8vIERvbid0IGxvb2sgaW50byBkZXBlbmRlbnQgYmFzZXMsIGJlY2F1c2UgbmFtZSBsb29rdXAgY2FuJ3QgbG9vawogICAgICAgLy8gdGhlcmUgYW55d2F5LgpAQCAtMzE2NSwyMSArMzEyMywxNiBAQAogICAvLyBUcmF2ZXJzZSB0aGUgY29udGV4dHMgb2YgT2JqZWN0aXZlLUMgY2xhc3Nlcy4KICAgaWYgKE9iakNJbnRlcmZhY2VEZWNsICpJRmFjZSA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPihDdHgpKSB7CiAgICAgLy8gVHJhdmVyc2UgY2F0ZWdvcmllcy4KLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjp2aXNpYmxlX2NhdGVnb3JpZXNfaXRlcmF0b3IKLSAgICAgICAgICAgQ2F0ID0gSUZhY2UtPnZpc2libGVfY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgICBDYXRFbmQgPSBJRmFjZS0+dmlzaWJsZV9jYXRlZ29yaWVzX2VuZCgpOwotICAgICAgICAgQ2F0ICE9IENhdEVuZDsgKytDYXQpIHsKKyAgICBmb3IgKGF1dG8gKkNhdCA6IElGYWNlLT52aXNpYmxlX2NhdGVnb3JpZXMoKSkgewogICAgICAgU2hhZG93Q29udGV4dFJBSUkgU2hhZG93KFZpc2l0ZWQpOwotICAgICAgTG9va3VwVmlzaWJsZURlY2xzKCpDYXQsIFJlc3VsdCwgUXVhbGlmaWVkTmFtZUxvb2t1cCwgZmFsc2UsCisgICAgICBMb29rdXBWaXNpYmxlRGVjbHMoQ2F0LCBSZXN1bHQsIFF1YWxpZmllZE5hbWVMb29rdXAsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bWVyLCBWaXNpdGVkKTsKICAgICB9CiAKICAgICAvLyBUcmF2ZXJzZSBwcm90b2NvbHMuCi0gICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6YWxsX3Byb3RvY29sX2l0ZXJhdG9yCi0gICAgICAgICBJID0gSUZhY2UtPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2JlZ2luKCksCi0gICAgICAgICBFID0gSUZhY2UtPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGZvciAoYXV0byAqSSA6IElGYWNlLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbHMoKSkgewogICAgICAgU2hhZG93Q29udGV4dFJBSUkgU2hhZG93KFZpc2l0ZWQpOwotICAgICAgTG9va3VwVmlzaWJsZURlY2xzKCpJLCBSZXN1bHQsIFF1YWxpZmllZE5hbWVMb29rdXAsIGZhbHNlLCBDb25zdW1lciwKKyAgICAgIExvb2t1cFZpc2libGVEZWNscyhJLCBSZXN1bHQsIFF1YWxpZmllZE5hbWVMb29rdXAsIGZhbHNlLCBDb25zdW1lciwKICAgICAgICAgICAgICAgICAgICAgICAgICBWaXNpdGVkKTsKICAgICB9CiAKQEAgLTMxOTgsMTcgKzMxNTEsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZWROYW1lTG9va3VwLCBJbkJhc2VDbGFzcywgQ29uc3VtZXIsIFZpc2l0ZWQpOwogICAgIH0KICAgfSBlbHNlIGlmIChPYmpDUHJvdG9jb2xEZWNsICpQcm90b2NvbCA9IGR5bl9jYXN0PE9iakNQcm90b2NvbERlY2w+KEN0eCkpIHsKLSAgICBmb3IgKE9iakNQcm90b2NvbERlY2w6OnByb3RvY29sX2l0ZXJhdG9yIEkgPSBQcm90b2NvbC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgICAgRSA9IFByb3RvY29sLT5wcm90b2NvbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBmb3IgKGF1dG8gKkkgOiBQcm90b2NvbC0+cHJvdG9jb2xzKCkpIHsKICAgICAgIFNoYWRvd0NvbnRleHRSQUlJIFNoYWRvdyhWaXNpdGVkKTsKLSAgICAgIExvb2t1cFZpc2libGVEZWNscygqSSwgUmVzdWx0LCBRdWFsaWZpZWROYW1lTG9va3VwLCBmYWxzZSwgQ29uc3VtZXIsCisgICAgICBMb29rdXBWaXNpYmxlRGVjbHMoSSwgUmVzdWx0LCBRdWFsaWZpZWROYW1lTG9va3VwLCBmYWxzZSwgQ29uc3VtZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaXRlZCk7CiAgICAgfQogICB9IGVsc2UgaWYgKE9iakNDYXRlZ29yeURlY2wgKkNhdGVnb3J5ID0gZHluX2Nhc3Q8T2JqQ0NhdGVnb3J5RGVjbD4oQ3R4KSkgewotICAgIGZvciAoT2JqQ0NhdGVnb3J5RGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgSSA9IENhdGVnb3J5LT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICBFID0gQ2F0ZWdvcnktPnByb3RvY29sX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGZvciAoYXV0byAqSSA6IENhdGVnb3J5LT5wcm90b2NvbHMoKSkgewogICAgICAgU2hhZG93Q29udGV4dFJBSUkgU2hhZG93KFZpc2l0ZWQpOwotICAgICAgTG9va3VwVmlzaWJsZURlY2xzKCpJLCBSZXN1bHQsIFF1YWxpZmllZE5hbWVMb29rdXAsIGZhbHNlLCBDb25zdW1lciwKKyAgICAgIExvb2t1cFZpc2libGVEZWNscyhJLCBSZXN1bHQsIFF1YWxpZmllZE5hbWVMb29rdXAsIGZhbHNlLCBDb25zdW1lciwKICAgICAgICAgICAgICAgICAgICAgICAgICBWaXNpdGVkKTsKICAgICB9CiAKQEAgLTMyMzQsOSArMzE4NSw4IEBACiAgICAgICAoUy0+Z2V0RW50aXR5KCkpLT5pc0Z1bmN0aW9uT3JNZXRob2QoKSkgewogICAgIEZpbmRMb2NhbEV4dGVyblNjb3BlIEZpbmRMb2NhbHMoUmVzdWx0KTsKICAgICAvLyBXYWxrIHRocm91Z2ggdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGlzIFNjb3BlLgotICAgIGZvciAoU2NvcGU6OmRlY2xfaXRlcmF0b3IgRCA9IFMtPmRlY2xfYmVnaW4oKSwgREVuZCA9IFMtPmRlY2xfZW5kKCk7Ci0gICAgICAgICBEICE9IERFbmQ7ICsrRCkgewotICAgICAgaWYgKE5hbWVkRGVjbCAqTkQgPSBkeW5fY2FzdDxOYW1lZERlY2w+KCpEKSkKKyAgICBmb3IgKGF1dG8gKkQgOiBTLT5kZWNscygpKSB7CisgICAgICBpZiAoTmFtZWREZWNsICpORCA9IGR5bl9jYXN0PE5hbWVkRGVjbD4oRCkpCiAgICAgICAgIGlmICgoTkQgPSBSZXN1bHQuZ2V0QWNjZXB0YWJsZURlY2woTkQpKSkgewogICAgICAgICAgIENvbnN1bWVyLkZvdW5kRGVjbChORCwgVmlzaXRlZC5jaGVja0hpZGRlbihORCksIDAsIGZhbHNlKTsKICAgICAgICAgICBWaXNpdGVkLmFkZChORCk7CkBAIC0zMjk3LDcgKzMyNDcsNyBAQAogICAgIC8vIExvb2t1cCB2aXNpYmxlIGRlY2xhcmF0aW9ucyBpbiBhbnkgbmFtZXNwYWNlcyBmb3VuZCBieSB1c2luZwogICAgIC8vIGRpcmVjdGl2ZXMuCiAgICAgVW5xdWFsVXNpbmdEaXJlY3RpdmVTZXQ6OmNvbnN0X2l0ZXJhdG9yIFVJLCBVRW5kOwotICAgIGxsdm06OnRpZShVSSwgVUVuZCkgPSBVRGlycy5nZXROYW1lc3BhY2VzRm9yKEVudGl0eSk7CisgICAgc3RkOjp0aWUoVUksIFVFbmQpID0gVURpcnMuZ2V0TmFtZXNwYWNlc0ZvcihFbnRpdHkpOwogICAgIGZvciAoOyBVSSAhPSBVRW5kOyArK1VJKQogICAgICAgTG9va3VwVmlzaWJsZURlY2xzKGNvbnN0X2Nhc3Q8RGVjbENvbnRleHQgKj4oVUktPmdldE5vbWluYXRlZE5hbWVzcGFjZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQsIC8qUXVhbGlmaWVkTmFtZUxvb2t1cD0qL2ZhbHNlLApAQCAtMzQxMSwxMCArMzM2MSwxMCBAQAogICAgIDogVHlwbyhUeXBvLT5nZXROYW1lKCkpLAogICAgICAgU2VtYVJlZihTZW1hUmVmKSB7fQogCi0gIGJvb2wgaW5jbHVkZUhpZGRlbkRlY2xzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIGluY2x1ZGVIaWRkZW5EZWNscygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICB2aXJ0dWFsIHZvaWQgRm91bmREZWNsKE5hbWVkRGVjbCAqTkQsIE5hbWVkRGVjbCAqSGlkaW5nLCBEZWNsQ29udGV4dCAqQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5CYXNlQ2xhc3MpOworICB2b2lkIEZvdW5kRGVjbChOYW1lZERlY2wgKk5ELCBOYW1lZERlY2wgKkhpZGluZywgRGVjbENvbnRleHQgKkN0eCwKKyAgICAgICAgICAgICAgICAgYm9vbCBJbkJhc2VDbGFzcykgb3ZlcnJpZGU7CiAgIHZvaWQgRm91bmROYW1lKFN0cmluZ1JlZiBOYW1lKTsKICAgdm9pZCBhZGRLZXl3b3JkUmVzdWx0KFN0cmluZ1JlZiBLZXl3b3JkKTsKICAgdm9pZCBhZGROYW1lKFN0cmluZ1JlZiBOYW1lLCBOYW1lZERlY2wgKk5ELCBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMgPSBOVUxMLApAQCAtMzUyOCw3ICszNDc4LDcgQEAKICAgICBDTGlzdC5wdXNoX2JhY2soQ29ycmVjdGlvbik7CiAKICAgd2hpbGUgKENvcnJlY3Rpb25SZXN1bHRzLnNpemUoKSA+IE1heFR5cG9EaXN0YW5jZVJlc3VsdFNldHMpCi0gICAgZXJhc2UobGx2bTo6cHJpb3IoQ29ycmVjdGlvblJlc3VsdHMuZW5kKCkpKTsKKyAgICBlcmFzZShzdGQ6OnByZXYoQ29ycmVjdGlvblJlc3VsdHMuZW5kKCkpKTsKIH0KIAogLy8gRmlsbCB0aGUgc3VwcGxpZWQgdmVjdG9yIHdpdGggdGhlIElkZW50aWZpZXJJbmZvIHBvaW50ZXJzIGZvciBlYWNoIHBpZWNlIG9mCkBAIC00MDY0LDcgKzQwMTQsNyBAQAogICAvLyBJbiBNaWNyb3NvZnQgbW9kZSwgZG9uJ3QgcGVyZm9ybSB0eXBvIGNvcnJlY3Rpb24gaW4gYSB0ZW1wbGF0ZSBtZW1iZXIKICAgLy8gZnVuY3Rpb24gZGVwZW5kZW50IGNvbnRleHQgYmVjYXVzZSBpdCBpbnRlcmZlcmVzIHdpdGggdGhlICJsb29rdXAgaW50bwogICAvLyBkZXBlbmRlbnQgYmFzZXMgb2YgY2xhc3MgdGVtcGxhdGVzIiBmZWF0dXJlLgotICBpZiAoZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRNb2RlICYmIEN1ckNvbnRleHQtPmlzRGVwZW5kZW50Q29udGV4dCgpICYmCisgIGlmIChnZXRMYW5nT3B0cygpLk1TVkNDb21wYXQgJiYgQ3VyQ29udGV4dC0+aXNEZXBlbmRlbnRDb250ZXh0KCkgJiYKICAgICAgIGlzYTxDWFhNZXRob2REZWNsPihDdXJDb250ZXh0KSkKICAgICByZXR1cm4gVHlwb0NvcnJlY3Rpb24oKTsKIApAQCAtNDExNiwxMCArNDA2Niw4IEBACiAKICAgICAvLyBMb29rIGluIHF1YWxpZmllZCBpbnRlcmZhY2VzLgogICAgIGlmIChPUFQpIHsKLSAgICAgIGZvciAoT2JqQ09iamVjdFBvaW50ZXJUeXBlOjpxdWFsX2l0ZXJhdG9yCi0gICAgICAgICAgICAgSSA9IE9QVC0+cXVhbF9iZWdpbigpLCBFID0gT1BULT5xdWFsX2VuZCgpOwotICAgICAgICAgICBJICE9IEU7ICsrSSkKLSAgICAgICAgTG9va3VwVmlzaWJsZURlY2xzKCpJLCBMb29rdXBLaW5kLCBDb25zdW1lcik7CisgICAgICBmb3IgKGF1dG8gKkkgOiBPUFQtPnF1YWxzKCkpCisgICAgICAgIExvb2t1cFZpc2libGVEZWNscyhJLCBMb29rdXBLaW5kLCBDb25zdW1lcik7CiAgICAgfQogICB9IGVsc2UgaWYgKFNTICYmIFNTLT5pc1NldCgpKSB7CiAgICAgUXVhbGlmaWVkREMgPSBjb21wdXRlRGVjbENvbnRleHQoKlNTLCBFbnRlcmluZ0NvbnRleHQpOwpAQCAtNDE5MSw3ICs0MTM5LDcgQEAKICAgICAvLyBGSVhNRTogUmUtYWRkIHRoZSBhYmlsaXR5IHRvIHNraXAgdmVyeSB1bmxpa2VseSBwb3RlbnRpYWwgY29ycmVjdGlvbnMuCiAgICAgaWYgKElkZW50aWZpZXJJbmZvTG9va3VwICpFeHRlcm5hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ29udGV4dC5JZGVudHMuZ2V0RXh0ZXJuYWxJZGVudGlmaWVyTG9va3VwKCkpIHsKLSAgICAgIE93bmluZ1B0cjxJZGVudGlmaWVySXRlcmF0b3I+IEl0ZXIoRXh0ZXJuYWwtPmdldElkZW50aWZpZXJzKCkpOworICAgICAgc3RkOjp1bmlxdWVfcHRyPElkZW50aWZpZXJJdGVyYXRvcj4gSXRlcihFeHRlcm5hbC0+Z2V0SWRlbnRpZmllcnMoKSk7CiAgICAgICBkbyB7CiAgICAgICAgIFN0cmluZ1JlZiBOYW1lID0gSXRlci0+TmV4dCgpOwogICAgICAgICBpZiAoTmFtZS5lbXB0eSgpKQpAQCAtNDIyOCwxOSArNDE3NiwyMSBAQAogICAgICAgICBLbm93bk5hbWVzcGFjZXNbRXh0ZXJuYWxLbm93bk5hbWVzcGFjZXNbSV1dID0gdHJ1ZTsKICAgICB9CiAKLSAgICBmb3IgKGxsdm06Ok1hcFZlY3RvcjxOYW1lc3BhY2VEZWNsKiwgYm9vbD46Oml0ZXJhdG9yCi0gICAgICAgICAgIEtOSSA9IEtub3duTmFtZXNwYWNlcy5iZWdpbigpLAotICAgICAgICAgICBLTklFbmQgPSBLbm93bk5hbWVzcGFjZXMuZW5kKCk7Ci0gICAgICAgICBLTkkgIT0gS05JRW5kOyArK0tOSSkKLSAgICAgIE5hbWVzcGFjZXMuQWRkTmFtZVNwZWNpZmllcihLTkktPmZpcnN0KTsKKyAgICBmb3IgKGF1dG8gS05QYWlyIDogS25vd25OYW1lc3BhY2VzKQorICAgICAgTmFtZXNwYWNlcy5BZGROYW1lU3BlY2lmaWVyKEtOUGFpci5maXJzdCk7CiAKLSAgICBmb3IgKEFTVENvbnRleHQ6OnR5cGVfaXRlcmF0b3IgVEkgPSBDb250ZXh0LnR5cGVzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJRW5kID0gQ29udGV4dC50eXBlc19lbmQoKTsKLSAgICAgICAgIFRJICE9IFRJRW5kOyArK1RJKSB7Ci0gICAgICBpZiAoQ1hYUmVjb3JkRGVjbCAqQ0QgPSAoKlRJKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCkpIHsKKyAgICBib29sIFNTSXNUZW1wbGF0ZSA9IGZhbHNlOworICAgIGlmIChOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMgPQorICAgICAgICAgICAgKFNTICYmIFNTLT5pc1ZhbGlkKCkpID8gU1MtPmdldFNjb3BlUmVwKCkgOiAwKSB7CisgICAgICBpZiAoY29uc3QgVHlwZSAqVCA9IE5OUy0+Z2V0QXNUeXBlKCkpCisgICAgICAgIFNTSXNUZW1wbGF0ZSA9IFQtPmdldFR5cGVDbGFzcygpID09IFR5cGU6OlRlbXBsYXRlU3BlY2lhbGl6YXRpb247CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAqVEkgOiBDb250ZXh0LnR5cGVzKCkpIHsKKyAgICAgIGlmIChDWFhSZWNvcmREZWNsICpDRCA9IFRJLT5nZXRBc0NYWFJlY29yZERlY2woKSkgewogICAgICAgICBDRCA9IENELT5nZXRDYW5vbmljYWxEZWNsKCk7CiAgICAgICAgIGlmICghQ0QtPmlzRGVwZW5kZW50VHlwZSgpICYmICFDRC0+aXNBbm9ueW1vdXNTdHJ1Y3RPclVuaW9uKCkgJiYKLSAgICAgICAgICAgICFDRC0+aXNVbmlvbigpICYmCisgICAgICAgICAgICAhQ0QtPmlzVW5pb24oKSAmJiBDRC0+Z2V0SWRlbnRpZmllcigpICYmCisgICAgICAgICAgICAoU1NJc1RlbXBsYXRlIHx8ICFpc2E8Q2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbD4oQ0QpKSAmJgogICAgICAgICAgICAgKENELT5pc0JlaW5nRGVmaW5lZCgpIHx8IENELT5pc0NvbXBsZXRlRGVmaW5pdGlvbigpKSkKICAgICAgICAgICBOYW1lc3BhY2VzLkFkZE5hbWVTcGVjaWZpZXIoQ0QpOwogICAgICAgfQpAQCAtNDI1OCwxMyArNDIwOCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbmQgPSBESS0+c2Vjb25kLmVuZCgpOwogICAgICAgICAgSSAhPSBJRW5kOyAvKiBJbmNyZW1lbnQgaW4gbG9vcC4gKi8pIHsKICAgICAgIC8vIElmIHdlIG9ubHkgd2FudCBuZXN0ZWQgbmFtZSBzcGVjaWZpZXIgY29ycmVjdGlvbnMsIGlnbm9yZSBwb3RlbnRpYWwKLSAgICAgIC8vIGNvcnJlY3Rpb25zIHRoYXQgaGF2ZSBhIGRpZmZlcmVudCBiYXNlIGlkZW50aWZpZXIgZnJvbSB0aGUgdHlwby4KLSAgICAgIGlmIChBbGxvd09ubHlOTlNDaGFuZ2VzICYmCi0gICAgICAgICAgSS0+c2Vjb25kLmZyb250KCkuZ2V0Q29ycmVjdGlvbkFzSWRlbnRpZmllckluZm8oKSAhPSBUeXBvKSB7Ci0gICAgICAgIFR5cG9Db3JyZWN0aW9uQ29uc3VtZXI6OnJlc3VsdF9pdGVyYXRvciBQcmV2ID0gSTsKLSAgICAgICAgKytJOwotICAgICAgICBESS0+c2Vjb25kLmVyYXNlKFByZXYpOwotICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIGNvcnJlY3Rpb25zIHRoYXQgaGF2ZSBhIGRpZmZlcmVudCBiYXNlIGlkZW50aWZpZXIgZnJvbSB0aGUgdHlwbyBvcgorICAgICAgLy8gd2hpY2ggaGF2ZSBhIG5vcm1hbGl6ZWQgZWRpdCBkaXN0YW5jZSBsb25nZXIgdGhhbiB0aGUgdHlwbyBpdHNlbGYuCisgICAgICBpZiAoQWxsb3dPbmx5Tk5TQ2hhbmdlcykgeworICAgICAgICBUeXBvQ29ycmVjdGlvbiAmVEMgPSBJLT5zZWNvbmQuZnJvbnQoKTsKKyAgICAgICAgaWYgKFRDLmdldENvcnJlY3Rpb25Bc0lkZW50aWZpZXJJbmZvKCkgIT0gVHlwbyB8fAorICAgICAgICAgICAgVEMuZ2V0RWRpdERpc3RhbmNlKHRydWUpID4gVHlwb0xlbikgeworICAgICAgICAgIFR5cG9Db3JyZWN0aW9uQ29uc3VtZXI6OnJlc3VsdF9pdGVyYXRvciBQcmV2ID0gSTsKKyAgICAgICAgICArK0k7CisgICAgICAgICAgREktPnNlY29uZC5lcmFzZShQcmV2KTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvLyBJZiB0aGUgaXRlbSBhbHJlYWR5IGhhcyBiZWVuIGxvb2tlZCB1cCBvciBpcyBhIGtleXdvcmQsIGtlZXAgaXQuCkBAIC00MzM3LDEwICs0MjkxLDggQEAKICAgICAgIGNhc2UgTG9va3VwUmVzdWx0OjpGb3VuZE92ZXJsb2FkZWQ6IHsKICAgICAgICAgVHlwb0NvcnJlY3Rpb25Db25zdW1lcjo6cmVzdWx0X2l0ZXJhdG9yIFByZXYgPSBJOwogICAgICAgICAvLyBTdG9yZSBhbGwgb2YgdGhlIERlY2xzIGZvciBvdmVybG9hZGVkIHN5bWJvbHMKLSAgICAgICAgZm9yIChMb29rdXBSZXN1bHQ6Oml0ZXJhdG9yIFRSRCA9IFRtcFJlcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJERW5kID0gVG1wUmVzLmVuZCgpOwotICAgICAgICAgICAgIFRSRCAhPSBUUkRFbmQ7ICsrVFJEKQotICAgICAgICAgIENhbmRpZGF0ZS5hZGRDb3JyZWN0aW9uRGVjbCgqVFJEKTsKKyAgICAgICAgZm9yIChhdXRvICpUUkQgOiBUbXBSZXMpCisgICAgICAgICAgQ2FuZGlkYXRlLmFkZENvcnJlY3Rpb25EZWNsKFRSRCk7CiAgICAgICAgICsrSTsKICAgICAgICAgaWYgKCFpc0NhbmRpZGF0ZVZpYWJsZShDQ0MsIENhbmRpZGF0ZSkpIHsKICAgICAgICAgICBRdWFsaWZpZWRSZXN1bHRzLnB1c2hfYmFjayhDYW5kaWRhdGUpOwpAQCAtNDM3MiwxNSArNDMyNCwxMCBAQAogICAgIC8vIE9ubHkgcGVyZm9ybSB0aGUgcXVhbGlmaWVkIGxvb2t1cHMgZm9yIEMrKwogICAgIGlmIChTZWFyY2hOYW1lc3BhY2VzKSB7CiAgICAgICBUbXBSZXMuc3VwcHJlc3NEaWFnbm9zdGljcygpOwotICAgICAgZm9yIChTbWFsbFZlY3RvcjxUeXBvQ29ycmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgMTY+OjppdGVyYXRvciBRUkkgPSBRdWFsaWZpZWRSZXN1bHRzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVJJRW5kID0gUXVhbGlmaWVkUmVzdWx0cy5lbmQoKTsKLSAgICAgICAgICAgUVJJICE9IFFSSUVuZDsgKytRUkkpIHsKLSAgICAgICAgZm9yIChOYW1lc3BhY2VTcGVjaWZpZXJTZXQ6Oml0ZXJhdG9yIE5JID0gTmFtZXNwYWNlcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklFbmQgPSBOYW1lc3BhY2VzLmVuZCgpOwotICAgICAgICAgICAgIE5JICE9IE5JRW5kOyArK05JKSB7Ci0gICAgICAgICAgRGVjbENvbnRleHQgKkN0eCA9IE5JLT5EZWNsQ3R4OwotICAgICAgICAgIGNvbnN0IFR5cGUgKk5TVHlwZSA9IE5JLT5OYW1lU3BlY2lmaWVyLT5nZXRBc1R5cGUoKTsKKyAgICAgIGZvciAoYXV0byBRUiA6IFF1YWxpZmllZFJlc3VsdHMpIHsKKyAgICAgICAgZm9yIChhdXRvIE5TSSA6IE5hbWVzcGFjZXMpIHsKKyAgICAgICAgICBEZWNsQ29udGV4dCAqQ3R4ID0gTlNJLkRlY2xDdHg7CisgICAgICAgICAgY29uc3QgVHlwZSAqTlNUeXBlID0gTlNJLk5hbWVTcGVjaWZpZXItPmdldEFzVHlwZSgpOwogCiAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgTmVzdGVkTmFtZVNwZWNpZmllciByZWZlcnMgdG8gYSBjbGFzcyBhbmQgdGhlCiAgICAgICAgICAgLy8gY3VycmVudCBjb3JyZWN0aW9uIGNhbmRpZGF0ZSBpcyB0aGUgbmFtZSBvZiB0aGF0IGNsYXNzLCB0aGVuIHNraXAKQEAgLTQzODgsMjYgKzQzMzUsMjYgQEAKICAgICAgICAgICAvLyBpcyBhbiBhcHByb3ByaWF0ZSBjb3JyZWN0aW9uLgogICAgICAgICAgIGlmIChDWFhSZWNvcmREZWNsICpOU0RlY2wgPQogICAgICAgICAgICAgICAgICAgTlNUeXBlID8gTlNUeXBlLT5nZXRBc0NYWFJlY29yZERlY2woKSA6IDApIHsKLSAgICAgICAgICAgIGlmIChOU0RlY2wtPmdldElkZW50aWZpZXIoKSA9PSBRUkktPmdldENvcnJlY3Rpb25Bc0lkZW50aWZpZXJJbmZvKCkpCisgICAgICAgICAgICBpZiAoTlNEZWNsLT5nZXRJZGVudGlmaWVyKCkgPT0gUVIuZ2V0Q29ycmVjdGlvbkFzSWRlbnRpZmllckluZm8oKSkKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgfQogCi0gICAgICAgICAgVHlwb0NvcnJlY3Rpb24gVEMoKlFSSSk7CisgICAgICAgICAgVHlwb0NvcnJlY3Rpb24gVEMoUVIpOwogICAgICAgICAgIFRDLkNsZWFyQ29ycmVjdGlvbkRlY2xzKCk7Ci0gICAgICAgICAgVEMuc2V0Q29ycmVjdGlvblNwZWNpZmllcihOSS0+TmFtZVNwZWNpZmllcik7Ci0gICAgICAgICAgVEMuc2V0UXVhbGlmaWVyRGlzdGFuY2UoTkktPkVkaXREaXN0YW5jZSk7CisgICAgICAgICAgVEMuc2V0Q29ycmVjdGlvblNwZWNpZmllcihOU0kuTmFtZVNwZWNpZmllcik7CisgICAgICAgICAgVEMuc2V0UXVhbGlmaWVyRGlzdGFuY2UoTlNJLkVkaXREaXN0YW5jZSk7CiAgICAgICAgICAgVEMuc2V0Q2FsbGJhY2tEaXN0YW5jZSgwKTsgLy8gUmVzZXQgdGhlIGNhbGxiYWNrIGRpc3RhbmNlCiAKICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBjb3JyZWN0aW9uIGNhbmRpZGF0ZSBhbmQgbmFtZXNwYWNlIGNvbWJpbmF0aW9uIGFyZQogICAgICAgICAgIC8vIHRvbyBmYXIgYXdheSBmcm9tIHRoZSBvcmlnaW5hbCB0eXBvIGJhc2VkIG9uIHRoZSBub3JtYWxpemVkIGVkaXQKICAgICAgICAgICAvLyBkaXN0YW5jZSwgdGhlbiBza2lwIHBlcmZvcm1pbmcgYSBxdWFsaWZpZWQgbmFtZSBsb29rdXAuCiAgICAgICAgICAgdW5zaWduZWQgVG1wRUQgPSBUQy5nZXRFZGl0RGlzdGFuY2UodHJ1ZSk7Ci0gICAgICAgICAgaWYgKFFSSS0+Z2V0Q29ycmVjdGlvbkFzSWRlbnRpZmllckluZm8oKSAhPSBUeXBvICYmCisgICAgICAgICAgaWYgKFFSLmdldENvcnJlY3Rpb25Bc0lkZW50aWZpZXJJbmZvKCkgIT0gVHlwbyAmJgogICAgICAgICAgICAgICBUbXBFRCAmJiBUeXBvTGVuIC8gVG1wRUQgPCAzKQogICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICBUbXBSZXMuY2xlYXIoKTsKLSAgICAgICAgICBUbXBSZXMuc2V0TG9va3VwTmFtZShRUkktPmdldENvcnJlY3Rpb25Bc0lkZW50aWZpZXJJbmZvKCkpOworICAgICAgICAgIFRtcFJlcy5zZXRMb29rdXBOYW1lKFFSLmdldENvcnJlY3Rpb25Bc0lkZW50aWZpZXJJbmZvKCkpOwogICAgICAgICAgIGlmICghTG9va3VwUXVhbGlmaWVkTmFtZShUbXBSZXMsIEN0eCkpIGNvbnRpbnVlOwogCiAgICAgICAgICAgLy8gQW55IGNvcnJlY3Rpb25zIGFkZGVkIGJlbG93IHdpbGwgYmUgdmFsaWRhdGVkIGluIHN1YnNlcXVlbnQKQEAgLTQ1NjMsOCArNDUxMCwxMSBAQAogfQogCiBGdW5jdGlvbkNhbGxGaWx0ZXJDQ0M6OkZ1bmN0aW9uQ2FsbEZpbHRlckNDQyhTZW1hICZTZW1hUmVmLCB1bnNpZ25lZCBOdW1BcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNFeHBsaWNpdFRlbXBsYXRlQXJncykKLSAgICA6IE51bUFyZ3MoTnVtQXJncyksIEhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKEhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd05vblN0YXRpY01ldGhvZHMpCisgICAgOiBOdW1BcmdzKE51bUFyZ3MpLCBIYXNFeHBsaWNpdFRlbXBsYXRlQXJncyhIYXNFeHBsaWNpdFRlbXBsYXRlQXJncyksCisgICAgICBBbGxvd05vblN0YXRpY01ldGhvZHMoQWxsb3dOb25TdGF0aWNNZXRob2RzKSwKKyAgICAgIEN1ckNvbnRleHQoU2VtYVJlZi5DdXJDb250ZXh0KSB7CiAgIFdhbnRUeXBlU3BlY2lmaWVycyA9IFNlbWFSZWYuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXM7CiAgIFdhbnRSZW1haW5pbmdLZXl3b3JkcyA9IGZhbHNlOwogfQpAQCAtNDU4OSwxMyArNDUzOSwzMiBAQAogICAgICAgICBpZiAoVmFsVHlwZS0+aXNBbnlQb2ludGVyVHlwZSgpIHx8IFZhbFR5cGUtPmlzUmVmZXJlbmNlVHlwZSgpKQogICAgICAgICAgIFZhbFR5cGUgPSBWYWxUeXBlLT5nZXRQb2ludGVlVHlwZSgpOwogICAgICAgICBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9IFZhbFR5cGUtPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpKQotICAgICAgICAgIGlmIChGUFQtPmdldE51bUFyZ3MoKSA9PSBOdW1BcmdzKQorICAgICAgICAgIGlmIChGUFQtPmdldE51bVBhcmFtcygpID09IE51bUFyZ3MpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KICAgICB9Ci0gICAgaWYgKEZEICYmIEZELT5nZXROdW1QYXJhbXMoKSA+PSBOdW1BcmdzICYmCi0gICAgICAgIEZELT5nZXRNaW5SZXF1aXJlZEFyZ3VtZW50cygpIDw9IE51bUFyZ3MpCi0gICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFNraXAgdGhlIGN1cnJlbnQgY2FuZGlkYXRlIGlmIGl0IGlzIG5vdCBhIEZ1bmN0aW9uRGVjbCBvciBkb2VzIG5vdCBhY2NlcHQKKyAgICAvLyB0aGUgY3VycmVudCBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgIGlmICghRkQgfHwgIShGRC0+Z2V0TnVtUGFyYW1zKCkgPj0gTnVtQXJncyAmJgorICAgICAgICAgICAgICAgICBGRC0+Z2V0TWluUmVxdWlyZWRBcmd1bWVudHMoKSA8PSBOdW1BcmdzKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gSWYgdGhlIGN1cnJlbnQgY2FuZGlkYXRlIGlzIGEgbm9uLXN0YXRpYyBDKysgbWV0aG9kIGFuZCBub24tc3RhdGljCisgICAgLy8gbWV0aG9kcyBhcmUgYmVpbmcgZXhjbHVkZWQsIHRoZW4gc2tpcCB0aGUgY2FuZGlkYXRlIHVubGVzcyB0aGUgY3VycmVudAorICAgIC8vIERlY2xDb250ZXh0IGlzIGEgbWV0aG9kIGluIHRoZSBzYW1lIGNsYXNzIG9yIGEgZGVzY2VuZGVudCBjbGFzcyBvZiB0aGUKKyAgICAvLyBjYW5kaWRhdGUncyBwYXJlbnQgY2xhc3MuCisgICAgaWYgKENYWE1ldGhvZERlY2wgKk1EID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4oRkQpKSB7CisgICAgICBpZiAoIUFsbG93Tm9uU3RhdGljTWV0aG9kcyAmJiAhTUQtPmlzU3RhdGljKCkpIHsKKyAgICAgICAgQ1hYTWV0aG9kRGVjbCAqQ3VyTUQgPSBkeW5fY2FzdF9vcl9udWxsPENYWE1ldGhvZERlY2w+KEN1ckNvbnRleHQpOworICAgICAgICBDWFhSZWNvcmREZWNsICpDdXJSRCA9CisgICAgICAgICAgICBDdXJNRCA/IEN1ck1ELT5nZXRQYXJlbnQoKS0+Z2V0Q2Fub25pY2FsRGVjbCgpIDogMDsKKyAgICAgICAgQ1hYUmVjb3JkRGVjbCAqUkQgPSBNRC0+Z2V0UGFyZW50KCktPmdldENhbm9uaWNhbERlY2woKTsKKyAgICAgICAgaWYgKCFDdXJSRCB8fCAoQ3VyUkQgIT0gUkQgJiYgIUN1clJELT5pc0Rlcml2ZWRGcm9tKFJEKSkpCisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOwogICB9CiAgIHJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1NlbWFPYmpDUHJvcGVydHkuY3BwIGIvbGliL1NlbWEvU2VtYU9iakNQcm9wZXJ0eS5jcHAKaW5kZXggZDlkOWNlYy4uM2YzN2VmYSAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYU9iakNQcm9wZXJ0eS5jcHAKKysrIGIvbGliL1NlbWEvU2VtYU9iakNQcm9wZXJ0eS5jcHAKQEAgLTEzMiwxMSArMTMyLDggQEAKICAgfQogCiAgIC8vIENoZWNrIHRoaXMgcHJvcGVydHkgYWdhaW5zdCBhbnkgcHJvdG9jb2xzIHdlIGluaGVyaXQuCi0gIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUCA9IFByb3RvLT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFbmQgPSBQcm90by0+cHJvdG9jb2xfZW5kKCk7Ci0gICAgICAgUCAhPSBQRW5kOyArK1ApIHsKLSAgICBDaGVja1Byb3BlcnR5QWdhaW5zdFByb3RvY29sKFMsIFByb3AsICpQLCBLbm93bik7Ci0gIH0KKyAgZm9yIChhdXRvICpQIDogUHJvdG8tPnByb3RvY29scygpKQorICAgIENoZWNrUHJvcGVydHlBZ2FpbnN0UHJvdG9jb2woUywgUHJvcCwgUCwgS25vd24pOwogfQogCiBEZWNsICpTZW1hOjpBY3RPblByb3BlcnR5KFNjb3BlICpTLCBTb3VyY2VMb2NhdGlvbiBBdExvYywKQEAgLTIwNCw3ICsyMDEsOCBAQAogICBpZiAoT2JqQ0ludGVyZmFjZURlY2wgKklGYWNlID0gZHluX2Nhc3Q8T2JqQ0ludGVyZmFjZURlY2w+KENsYXNzRGVjbCkpIHsKICAgICAvLyBGb3IgYSBjbGFzcywgY29tcGFyZSB0aGUgcHJvcGVydHkgYWdhaW5zdCBhIHByb3BlcnR5IGluIG91ciBzdXBlcmNsYXNzLgogICAgIGJvb2wgRm91bmRJblN1cGVyID0gZmFsc2U7Ci0gICAgaWYgKE9iakNJbnRlcmZhY2VEZWNsICpTdXBlciA9IElGYWNlLT5nZXRTdXBlckNsYXNzKCkpIHsKKyAgICBPYmpDSW50ZXJmYWNlRGVjbCAqQ3VycmVudEludGVyZmFjZURlY2wgPSBJRmFjZTsKKyAgICB3aGlsZSAoT2JqQ0ludGVyZmFjZURlY2wgKlN1cGVyID0gQ3VycmVudEludGVyZmFjZURlY2wtPmdldFN1cGVyQ2xhc3MoKSkgewogICAgICAgRGVjbENvbnRleHQ6Omxvb2t1cF9yZXN1bHQgUiA9IFN1cGVyLT5sb29rdXAoUmVzLT5nZXREZWNsTmFtZSgpKTsKICAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBSLnNpemUoKTsgSSAhPSBOOyArK0kpIHsKICAgICAgICAgaWYgKE9iakNQcm9wZXJ0eURlY2wgKlN1cGVyUHJvcCA9IGR5bl9jYXN0PE9iakNQcm9wZXJ0eURlY2w+KFJbSV0pKSB7CkBAIC0yMTMsMzcgKzIxMSwzMCBAQAogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CisgICAgICBpZiAoRm91bmRJblN1cGVyKQorICAgICAgICBicmVhazsKKyAgICAgIGVsc2UKKyAgICAgICAgQ3VycmVudEludGVyZmFjZURlY2wgPSBTdXBlcjsKICAgICB9CiAKICAgICBpZiAoRm91bmRJblN1cGVyKSB7CiAgICAgICAvLyBBbHNvIGNvbXBhcmUgdGhlIHByb3BlcnR5IGFnYWluc3QgYSBwcm9wZXJ0eSBpbiBvdXIgcHJvdG9jb2xzLgotICAgICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUCA9IElGYWNlLT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVuZCA9IElGYWNlLT5wcm90b2NvbF9lbmQoKTsKLSAgICAgICAgICAgUCAhPSBQRW5kOyArK1ApIHsKLSAgICAgICAgQ2hlY2tQcm9wZXJ0eUFnYWluc3RQcm90b2NvbCgqdGhpcywgUmVzLCAqUCwgS25vd25Qcm90b3MpOworICAgICAgZm9yIChhdXRvICpQIDogQ3VycmVudEludGVyZmFjZURlY2wtPnByb3RvY29scygpKSB7CisgICAgICAgIENoZWNrUHJvcGVydHlBZ2FpbnN0UHJvdG9jb2woKnRoaXMsIFJlcywgUCwgS25vd25Qcm90b3MpOwogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAvLyBTbG93ZXIgcGF0aDogbG9vayBpbiBhbGwgcHJvdG9jb2xzIHdlIHJlZmVyZW5jZWQuCi0gICAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjphbGxfcHJvdG9jb2xfaXRlcmF0b3IKLSAgICAgICAgICAgICBQID0gSUZhY2UtPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29sX2JlZ2luKCksCi0gICAgICAgICAgICAgUEVuZCA9IElGYWNlLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9lbmQoKTsKLSAgICAgICAgICAgUCAhPSBQRW5kOyArK1ApIHsKLSAgICAgICAgQ2hlY2tQcm9wZXJ0eUFnYWluc3RQcm90b2NvbCgqdGhpcywgUmVzLCAqUCwgS25vd25Qcm90b3MpOworICAgICAgZm9yIChhdXRvICpQIDogSUZhY2UtPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29scygpKSB7CisgICAgICAgIENoZWNrUHJvcGVydHlBZ2FpbnN0UHJvdG9jb2woKnRoaXMsIFJlcywgUCwgS25vd25Qcm90b3MpOwogICAgICAgfQogICAgIH0KICAgfSBlbHNlIGlmIChPYmpDQ2F0ZWdvcnlEZWNsICpDYXQgPSBkeW5fY2FzdDxPYmpDQ2F0ZWdvcnlEZWNsPihDbGFzc0RlY2wpKSB7Ci0gICAgZm9yIChPYmpDQ2F0ZWdvcnlEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBQID0gQ2F0LT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVuZCA9IENhdC0+cHJvdG9jb2xfZW5kKCk7Ci0gICAgICAgICBQICE9IFBFbmQ7ICsrUCkgewotICAgICAgQ2hlY2tQcm9wZXJ0eUFnYWluc3RQcm90b2NvbCgqdGhpcywgUmVzLCAqUCwgS25vd25Qcm90b3MpOwotICAgIH0KKyAgICBmb3IgKGF1dG8gKlAgOiBDYXQtPnByb3RvY29scygpKQorICAgICAgQ2hlY2tQcm9wZXJ0eUFnYWluc3RQcm90b2NvbCgqdGhpcywgUmVzLCBQLCBLbm93blByb3Rvcyk7CiAgIH0gZWxzZSB7CiAgICAgT2JqQ1Byb3RvY29sRGVjbCAqUHJvdG8gPSBjYXN0PE9iakNQcm90b2NvbERlY2w+KENsYXNzRGVjbCk7Ci0gICAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBQID0gUHJvdG8tPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRW5kID0gUHJvdG8tPnByb3RvY29sX2VuZCgpOwotICAgICAgICAgUCAhPSBQRW5kOyArK1ApIHsKLSAgICAgIENoZWNrUHJvcGVydHlBZ2FpbnN0UHJvdG9jb2woKnRoaXMsIFJlcywgKlAsIEtub3duUHJvdG9zKTsKLSAgICB9CisgICAgZm9yIChhdXRvICpQIDogUHJvdG8tPnByb3RvY29scygpKQorICAgICAgQ2hlY2tQcm9wZXJ0eUFnYWluc3RQcm90b2NvbCgqdGhpcywgUmVzLCBQLCBLbm93blByb3Rvcyk7CiAgIH0KIAogICBBY3RPbkRvY3VtZW50YWJsZURlY2woUmVzKTsKQEAgLTMyMSwyMSArMzEyLDYgQEAKICAgICAgICAgICAgICAgICAgT2JqQ1Byb3BlcnR5RGVjbDo6T0JKQ19QUl91bnNhZmVfdW5yZXRhaW5lZCk7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICpOYW1lT2ZPd25lcnNoaXBBdHRyaWJ1dGUodW5zaWduZWQgYXR0cikgewotICBpZiAoYXR0ciAmIE9iakNQcm9wZXJ0eURlY2w6Ok9CSkNfUFJfYXNzaWduKQotICAgIHJldHVybiAiYXNzaWduIjsKLSAgaWYgKGF0dHIgJiBPYmpDUHJvcGVydHlEZWNsOjpPQkpDX1BSX3JldGFpbiApCi0gICAgcmV0dXJuICJyZXRhaW4iOwotICBpZiAoYXR0ciAmIE9iakNQcm9wZXJ0eURlY2w6Ok9CSkNfUFJfY29weSkKLSAgICByZXR1cm4gImNvcHkiOwotICBpZiAoYXR0ciAmIE9iakNQcm9wZXJ0eURlY2w6Ok9CSkNfUFJfd2VhaykKLSAgICByZXR1cm4gIndlYWsiOwotICBpZiAoYXR0ciAmIE9iakNQcm9wZXJ0eURlY2w6Ok9CSkNfUFJfc3Ryb25nKQotICAgIHJldHVybiAic3Ryb25nIjsKLSAgYXNzZXJ0KGF0dHIgJiBPYmpDUHJvcGVydHlEZWNsOjpPQkpDX1BSX3Vuc2FmZV91bnJldGFpbmVkKTsKLSAgcmV0dXJuICJ1bnNhZmVfdW5yZXRhaW5lZCI7Ci19Ci0KIE9iakNQcm9wZXJ0eURlY2wgKgogU2VtYTo6SGFuZGxlUHJvcGVydHlJbkNsYXNzRXh0ZW5zaW9uKFNjb3BlICpTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEF0TG9jLApAQCAtMzU4LDEyICszMzQsOSBAQAogICBpZiAoQ0NQcmltYXJ5KSB7CiAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiB0aGlzIHByb3BlcnR5IGluIGN1cnJlbnQgYW5kCiAgICAgLy8gb3RoZXIgY2xhc3MgZXh0ZW5zaW9ucy4KLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjprbm93bl9leHRlbnNpb25zX2l0ZXJhdG9yCi0gICAgICAgICAgIEV4dCA9IENDUHJpbWFyeS0+a25vd25fZXh0ZW5zaW9uc19iZWdpbigpLAotICAgICAgICAgICBFeHRFbmQgPSBDQ1ByaW1hcnktPmtub3duX2V4dGVuc2lvbnNfZW5kKCk7Ci0gICAgICAgICBFeHQgIT0gRXh0RW5kOyArK0V4dCkgeworICAgIGZvciAoY29uc3QgYXV0byAqRXh0IDogQ0NQcmltYXJ5LT5rbm93bl9leHRlbnNpb25zKCkpIHsKICAgICAgIGlmIChPYmpDUHJvcGVydHlEZWNsICpwcmV2RGVjbAotICAgICAgICAgICAgPSBPYmpDUHJvcGVydHlEZWNsOjpmaW5kUHJvcGVydHlEZWNsKCpFeHQsIFByb3BlcnR5SWQpKSB7CisgICAgICAgICAgICA9IE9iakNQcm9wZXJ0eURlY2w6OmZpbmRQcm9wZXJ0eURlY2woRXh0LCBQcm9wZXJ0eUlkKSkgewogICAgICAgICBEaWFnKEF0TG9jLCBkaWFnOjplcnJfZHVwbGljYXRlX3Byb3BlcnR5KTsKICAgICAgICAgRGlhZyhwcmV2RGVjbC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcm9wZXJ0eV9kZWNsYXJlKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC00NzgsNiArNDUxLDE4IEBACiAgICAgRGVjbENvbnRleHQgKkRDID0gY2FzdDxEZWNsQ29udGV4dD4oQ0NQcmltYXJ5KTsKICAgICBpZiAoIU9iakNQcm9wZXJ0eURlY2w6OmZpbmRQcm9wZXJ0eURlY2woREMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSURlY2wtPmdldERlY2xOYW1lKCkuZ2V0QXNJZGVudGlmaWVySW5mbygpKSkgeworICAgICAgLy8gSW4gbXJyIG1vZGUsICdyZWFkd3JpdGUnIHByb3BlcnR5IG11c3QgaGF2ZSBhbiBleHBsaWNpdAorICAgICAgLy8gbWVtb3J5IGF0dHJpYnV0ZS4gSWYgbm9uZSBzcGVjaWZpZWQsIHNlbGVjdCB0aGUgZGVmYXVsdCAoYXNzaWduKS4KKyAgICAgIGlmICghZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50KSB7CisgICAgICAgIGlmICghKFBJa2luZCAmIChPYmpDRGVjbFNwZWM6OkRRX1BSX2Fzc2lnbiB8CisgICAgICAgICAgICAgICAgICAgICAgICBPYmpDRGVjbFNwZWM6OkRRX1BSX3JldGFpbiB8CisgICAgICAgICAgICAgICAgICAgICAgICBPYmpDRGVjbFNwZWM6OkRRX1BSX3N0cm9uZyB8CisgICAgICAgICAgICAgICAgICAgICAgICBPYmpDRGVjbFNwZWM6OkRRX1BSX2NvcHkgfAorICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0RlY2xTcGVjOjpEUV9QUl91bnNhZmVfdW5yZXRhaW5lZCB8CisgICAgICAgICAgICAgICAgICAgICAgICBPYmpDRGVjbFNwZWM6OkRRX1BSX3dlYWspKSkKKyAgICAgICAgICBQSWtpbmQgfD0gT2JqQ1Byb3BlcnR5RGVjbDo6T0JKQ19QUl9hc3NpZ247CisgICAgICB9CisgICAgICAKICAgICAgIC8vIFByb3RvY29sIGlzIG5vdCBpbiB0aGUgcHJpbWFyeSBjbGFzcy4gTXVzdCBidWlsZCBvbmUgZm9yIGl0LgogICAgICAgT2JqQ0RlY2xTcGVjIFByb3RvY29sUHJvcGVydHlPRFM7CiAgICAgICAvLyBGSVhNRS4gQXNzdW1pbmcgdGhhdCBPYmpDRGVjbFNwZWM6Ok9iakNQcm9wZXJ0eUF0dHJpYnV0ZUtpbmQKQEAgLTc2MywxOCArNzQ4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0ludGVyZmFjZURlY2wgKkNsYXNzRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDUHJvcGVydHlEZWNsICpQcm9wZXJ0eSkgewogICBPYmpDSW50ZXJmYWNlRGVjbDo6UHJvdG9jb2xQcm9wZXJ0eU1hcCBQcm9wTWFwOwotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjphbGxfcHJvdG9jb2xfaXRlcmF0b3IKLSAgICAgICBQSSA9IENsYXNzRGVjbC0+YWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICBFID0gQ2xhc3NEZWNsLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9lbmQoKTsgUEkgIT0gRTsgKytQSSkgewotICAgIGlmIChjb25zdCBPYmpDUHJvdG9jb2xEZWNsICpQRGVjbCA9ICgqUEkpLT5nZXREZWZpbml0aW9uKCkpCisgIGZvciAoY29uc3QgYXV0byAqUEkgOiBDbGFzc0RlY2wtPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29scygpKSB7CisgICAgaWYgKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlBEZWNsID0gUEktPmdldERlZmluaXRpb24oKSkKICAgICAgIFBEZWNsLT5jb2xsZWN0SW5oZXJpdGVkUHJvdG9jb2xQcm9wZXJ0aWVzKFByb3BlcnR5LCBQcm9wTWFwKTsKICAgfQogICBpZiAoT2JqQ0ludGVyZmFjZURlY2wgKlNEZWNsID0gQ2xhc3NEZWNsLT5nZXRTdXBlckNsYXNzKCkpCiAgICAgd2hpbGUgKFNEZWNsKSB7Ci0gICAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjphbGxfcHJvdG9jb2xfaXRlcmF0b3IKLSAgICAgICAgICAgUEkgPSBTRGVjbC0+YWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgICAgRSA9IFNEZWNsLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbF9lbmQoKTsgUEkgIT0gRTsgKytQSSkgewotICAgICAgICBpZiAoY29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqUERlY2wgPSAoKlBJKS0+Z2V0RGVmaW5pdGlvbigpKQorICAgICAgZm9yIChjb25zdCBhdXRvICpQSSA6IFNEZWNsLT5hbGxfcmVmZXJlbmNlZF9wcm90b2NvbHMoKSkgeworICAgICAgICBpZiAoY29uc3QgT2JqQ1Byb3RvY29sRGVjbCAqUERlY2wgPSBQSS0+Z2V0RGVmaW5pdGlvbigpKQogICAgICAgICAgIFBEZWNsLT5jb2xsZWN0SW5oZXJpdGVkUHJvdG9jb2xQcm9wZXJ0aWVzKFByb3BlcnR5LCBQcm9wTWFwKTsKICAgICAgIH0KICAgICAgIFNEZWNsID0gU0RlY2wtPmdldFN1cGVyQ2xhc3MoKTsKQEAgLTg3NSw5ICs4NTYsNyBAQAogICAgICAgYm9vbCBSZWFkV3JpdGVQcm9wZXJ0eSA9IGZhbHNlOwogICAgICAgLy8gU2VhcmNoIGludG8gdGhlIGNsYXNzIGV4dGVuc2lvbnMgYW5kIHNlZSBpZiAncmVhZG9ubHkgcHJvcGVydHkgaXMKICAgICAgIC8vIHJlZGVjbGFyZWQgJ3JlYWR3cml0ZScsIHRoZW4gbm8gd2FybmluZyBpcyB0byBiZSBpc3N1ZWQuCi0gICAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjprbm93bl9leHRlbnNpb25zX2l0ZXJhdG9yCi0gICAgICAgICAgICBFeHQgPSBJRGVjbC0+a25vd25fZXh0ZW5zaW9uc19iZWdpbigpLAotICAgICAgICAgICAgRXh0RW5kID0gSURlY2wtPmtub3duX2V4dGVuc2lvbnNfZW5kKCk7IEV4dCAhPSBFeHRFbmQ7ICsrRXh0KSB7CisgICAgICBmb3IgKGF1dG8gKkV4dCA6IElEZWNsLT5rbm93bl9leHRlbnNpb25zKCkpIHsKICAgICAgICAgRGVjbENvbnRleHQ6Omxvb2t1cF9yZXN1bHQgUiA9IEV4dC0+bG9va3VwKHByb3BlcnR5LT5nZXREZWNsTmFtZSgpKTsKICAgICAgICAgaWYgKCFSLmVtcHR5KCkpCiAgICAgICAgICAgaWYgKE9iakNQcm9wZXJ0eURlY2wgKkV4dFByb3AgPSBkeW5fY2FzdDxPYmpDUHJvcGVydHlEZWNsPihSWzBdKSkgewpAQCAtODkxLDcgKzg3MCw3IEBACiAgICAgICAKICAgICAgIGlmICghUmVhZFdyaXRlUHJvcGVydHkpIHsKICAgICAgICAgRGlhZyhwcm9wZXJ0eS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6d2Fybl9hdXRvX3JlYWRvbmx5X2lib3V0bGV0X3Byb3BlcnR5KQotICAgICAgICAgICAgPDwgcHJvcGVydHktPmdldE5hbWUoKTsKKyAgICAgICAgICAgIDw8IHByb3BlcnR5OwogICAgICAgICBTb3VyY2VMb2NhdGlvbiByZWFkb25seUxvYzsKICAgICAgICAgaWYgKExvY1Byb3BlcnR5QXR0cmlidXRlKENvbnRleHQsICJyZWFkb25seSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHktPmdldExQYXJlbkxvYygpLCByZWFkb25seUxvYykpIHsKQEAgLTExNjMsMTkgKzExNDIsMjAgQEAKICAgICAgIEltcGxpY2l0UGFyYW1EZWNsICpTZWxmRGVjbCA9IGdldHRlck1ldGhvZC0+Z2V0U2VsZkRlY2woKTsKICAgICAgIERlY2xSZWZFeHByICpTZWxmRXhwciA9IAogICAgICAgICBuZXcgKENvbnRleHQpIERlY2xSZWZFeHByKFNlbGZEZWNsLCBmYWxzZSwgU2VsZkRlY2wtPmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19SVmFsdWUsIFByb3BlcnR5RGlhZ0xvYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTFZhbHVlLCBQcm9wZXJ0eURpYWdMb2MpOwogICAgICAgTWFya0RlY2xSZWZSZWZlcmVuY2VkKFNlbGZFeHByKTsKKyAgICAgIEV4cHIgKkxvYWRTZWxmRXhwciA9CisgICAgICAgIEltcGxpY2l0Q2FzdEV4cHI6OkNyZWF0ZShDb250ZXh0LCBTZWxmRGVjbC0+Z2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0tfTFZhbHVlVG9SVmFsdWUsIFNlbGZFeHByLCAwLCBWS19SVmFsdWUpOwogICAgICAgRXhwciAqSXZhclJlZkV4cHIgPQogICAgICAgICBuZXcgKENvbnRleHQpIE9iakNJdmFyUmVmRXhwcihJdmFyLCBJdmFyLT5nZXRUeXBlKCksIFByb3BlcnR5RGlhZ0xvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXZhci0+Z2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZkV4cHIsIHRydWUsIHRydWUpOwotICAgICAgRXhwclJlc3VsdCBSZXMgPSAKLSAgICAgICAgUGVyZm9ybUNvcHlJbml0aWFsaXphdGlvbihJbml0aWFsaXplZEVudGl0eTo6SW5pdGlhbGl6ZVJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGlhZ0xvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlck1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypOUlZPPSovZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGlhZ0xvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPd25lZChJdmFyUmVmRXhwcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkU2VsZkV4cHIsIHRydWUsIHRydWUpOworICAgICAgRXhwclJlc3VsdCBSZXMgPSBQZXJmb3JtQ29weUluaXRpYWxpemF0aW9uKAorICAgICAgICAgIEluaXRpYWxpemVkRW50aXR5OjpJbml0aWFsaXplUmVzdWx0KFByb3BlcnR5RGlhZ0xvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0ZXJNZXRob2QtPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk5SVk89Ki9mYWxzZSksCisgICAgICAgICAgUHJvcGVydHlEaWFnTG9jLCBPd25lZChJdmFyUmVmRXhwcikpOwogICAgICAgaWYgKCFSZXMuaXNJbnZhbGlkKCkpIHsKICAgICAgICAgRXhwciAqUmVzRXhwciA9IFJlcy50YWtlQXM8RXhwcj4oKTsKICAgICAgICAgaWYgKFJlc0V4cHIpCkBAIC0xMjExLDEyICsxMTkxLDE1IEBACiAgICAgICBJbXBsaWNpdFBhcmFtRGVjbCAqU2VsZkRlY2wgPSBzZXR0ZXJNZXRob2QtPmdldFNlbGZEZWNsKCk7CiAgICAgICBEZWNsUmVmRXhwciAqU2VsZkV4cHIgPSAKICAgICAgICAgbmV3IChDb250ZXh0KSBEZWNsUmVmRXhwcihTZWxmRGVjbCwgZmFsc2UsIFNlbGZEZWNsLT5nZXRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfUlZhbHVlLCBQcm9wZXJ0eURpYWdMb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0xWYWx1ZSwgUHJvcGVydHlEaWFnTG9jKTsKICAgICAgIE1hcmtEZWNsUmVmUmVmZXJlbmNlZChTZWxmRXhwcik7CisgICAgICBFeHByICpMb2FkU2VsZkV4cHIgPQorICAgICAgICBJbXBsaWNpdENhc3RFeHByOjpDcmVhdGUoQ29udGV4dCwgU2VsZkRlY2wtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENLX0xWYWx1ZVRvUlZhbHVlLCBTZWxmRXhwciwgMCwgVktfUlZhbHVlKTsKICAgICAgIEV4cHIgKmxocyA9CiAgICAgICAgIG5ldyAoQ29udGV4dCkgT2JqQ0l2YXJSZWZFeHByKEl2YXIsIEl2YXItPmdldFR5cGUoKSwgUHJvcGVydHlEaWFnTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdmFyLT5nZXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxmRXhwciwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRTZWxmRXhwciwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICBPYmpDTWV0aG9kRGVjbDo6cGFyYW1faXRlcmF0b3IgUCA9IHNldHRlck1ldGhvZC0+cGFyYW1fYmVnaW4oKTsKICAgICAgIFBhcm1WYXJEZWNsICpQYXJhbSA9ICgqUCk7CiAgICAgICBRdWFsVHlwZSBUID0gUGFyYW0tPmdldFR5cGUoKS5nZXROb25SZWZlcmVuY2VUeXBlKCk7CkBAIC0xMzk0LDcgKzEzNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MpIHsKICAgaWYgKCFHZXR0ZXJNZXRob2QpCiAgICAgcmV0dXJuIGZhbHNlOwotICBRdWFsVHlwZSBHZXR0ZXJUeXBlID0gR2V0dGVyTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCkuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpOworICBRdWFsVHlwZSBHZXR0ZXJUeXBlID0gR2V0dGVyTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCkuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpOwogICBRdWFsVHlwZSBQcm9wZXJ0eUl2YXJUeXBlID0gcHJvcGVydHktPmdldFR5cGUoKS5nZXROb25SZWZlcmVuY2VUeXBlKCk7CiAgIGJvb2wgY29tcGF0ID0gQ29udGV4dC5oYXNTYW1lVHlwZShQcm9wZXJ0eUl2YXJUeXBlLCBHZXR0ZXJUeXBlKTsKICAgaWYgKCFjb21wYXQpIHsKQEAgLTE0MzMsMzcgKzE0MTYsMzIgQEAKIAogLy8vIENvbGxlY3RJbW1lZGlhdGVQcm9wZXJ0aWVzIC0gVGhpcyByb3V0aW5lIGNvbGxlY3RzIGFsbCBwcm9wZXJ0aWVzIGluCiAvLy8gdGhlIGNsYXNzIGFuZCBpdHMgY29uZm9ybWluZyBwcm90b2NvbHM7IGJ1dCBub3QgdGhvc2UgaW4gaXRzIHN1cGVyIGNsYXNzLgotdm9pZCBTZW1hOjpDb2xsZWN0SW1tZWRpYXRlUHJvcGVydGllcyhPYmpDQ29udGFpbmVyRGVjbCAqQ0RlY2wsCi0gICAgICAgICAgICBPYmpDQ29udGFpbmVyRGVjbDo6UHJvcGVydHlNYXAgJlByb3BNYXAsCi0gICAgICAgICAgICBPYmpDQ29udGFpbmVyRGVjbDo6UHJvcGVydHlNYXAgJlN1cGVyUHJvcE1hcCkgeworc3RhdGljIHZvaWQgQ29sbGVjdEltbWVkaWF0ZVByb3BlcnRpZXMoT2JqQ0NvbnRhaW5lckRlY2wgKkNEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0NvbnRhaW5lckRlY2w6OlByb3BlcnR5TWFwICZQcm9wTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0NvbnRhaW5lckRlY2w6OlByb3BlcnR5TWFwICZTdXBlclByb3BNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluY2x1ZGVQcm90b2NvbHMgPSB0cnVlKSB7CisKICAgaWYgKE9iakNJbnRlcmZhY2VEZWNsICpJRGVjbCA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPihDRGVjbCkpIHsKLSAgICBmb3IgKE9iakNDb250YWluZXJEZWNsOjpwcm9wX2l0ZXJhdG9yIFAgPSBJRGVjbC0+cHJvcF9iZWdpbigpLAotICAgICAgICAgRSA9IElEZWNsLT5wcm9wX2VuZCgpOyBQICE9IEU7ICsrUCkgewotICAgICAgT2JqQ1Byb3BlcnR5RGVjbCAqUHJvcCA9ICpQOworICAgIGZvciAoYXV0byAqUHJvcCA6IElEZWNsLT5wcm9wZXJ0aWVzKCkpCiAgICAgICBQcm9wTWFwW1Byb3AtPmdldElkZW50aWZpZXIoKV0gPSBQcm9wOworICAgIGlmIChJbmNsdWRlUHJvdG9jb2xzKSB7CisgICAgICAvLyBTY2FuIHRocm91Z2ggY2xhc3MncyBwcm90b2NvbHMuCisgICAgICBmb3IgKGF1dG8gKlBJIDogSURlY2wtPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29scygpKQorICAgICAgICBDb2xsZWN0SW1tZWRpYXRlUHJvcGVydGllcyhQSSwgUHJvcE1hcCwgU3VwZXJQcm9wTWFwKTsKICAgICB9Ci0gICAgLy8gc2NhbiB0aHJvdWdoIGNsYXNzJ3MgcHJvdG9jb2xzLgotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OmFsbF9wcm90b2NvbF9pdGVyYXRvcgotICAgICAgICAgUEkgPSBJRGVjbC0+YWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBJRGVjbC0+YWxsX3JlZmVyZW5jZWRfcHJvdG9jb2xfZW5kKCk7IFBJICE9IEU7ICsrUEkpCi0gICAgICAgIENvbGxlY3RJbW1lZGlhdGVQcm9wZXJ0aWVzKCgqUEkpLCBQcm9wTWFwLCBTdXBlclByb3BNYXApOwogICB9CiAgIGlmIChPYmpDQ2F0ZWdvcnlEZWNsICpDQVREZWNsID0gZHluX2Nhc3Q8T2JqQ0NhdGVnb3J5RGVjbD4oQ0RlY2wpKSB7CiAgICAgaWYgKCFDQVREZWNsLT5Jc0NsYXNzRXh0ZW5zaW9uKCkpCi0gICAgICBmb3IgKE9iakNDb250YWluZXJEZWNsOjpwcm9wX2l0ZXJhdG9yIFAgPSBDQVREZWNsLT5wcm9wX2JlZ2luKCksCi0gICAgICAgICAgIEUgPSBDQVREZWNsLT5wcm9wX2VuZCgpOyBQICE9IEU7ICsrUCkgewotICAgICAgICBPYmpDUHJvcGVydHlEZWNsICpQcm9wID0gKlA7CisgICAgICBmb3IgKGF1dG8gKlByb3AgOiBDQVREZWNsLT5wcm9wZXJ0aWVzKCkpCiAgICAgICAgIFByb3BNYXBbUHJvcC0+Z2V0SWRlbnRpZmllcigpXSA9IFByb3A7Ci0gICAgICB9Ci0gICAgLy8gc2NhbiB0aHJvdWdoIGNsYXNzJ3MgcHJvdG9jb2xzLgotICAgIGZvciAoT2JqQ0NhdGVnb3J5RGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUEkgPSBDQVREZWNsLT5wcm90b2NvbF9iZWdpbigpLAotICAgICAgICAgRSA9IENBVERlY2wtPnByb3RvY29sX2VuZCgpOyBQSSAhPSBFOyArK1BJKQotICAgICAgQ29sbGVjdEltbWVkaWF0ZVByb3BlcnRpZXMoKCpQSSksIFByb3BNYXAsIFN1cGVyUHJvcE1hcCk7CisgICAgaWYgKEluY2x1ZGVQcm90b2NvbHMpIHsKKyAgICAgIC8vIFNjYW4gdGhyb3VnaCBjbGFzcydzIHByb3RvY29scy4KKyAgICAgIGZvciAoYXV0byAqUEkgOiBDQVREZWNsLT5wcm90b2NvbHMoKSkKKyAgICAgICAgQ29sbGVjdEltbWVkaWF0ZVByb3BlcnRpZXMoUEksIFByb3BNYXAsIFN1cGVyUHJvcE1hcCk7CisgICAgfQogICB9CiAgIGVsc2UgaWYgKE9iakNQcm90b2NvbERlY2wgKlBEZWNsID0gZHluX2Nhc3Q8T2JqQ1Byb3RvY29sRGVjbD4oQ0RlY2wpKSB7Ci0gICAgZm9yIChPYmpDUHJvdG9jb2xEZWNsOjpwcm9wX2l0ZXJhdG9yIFAgPSBQRGVjbC0+cHJvcF9iZWdpbigpLAotICAgICAgICAgRSA9IFBEZWNsLT5wcm9wX2VuZCgpOyBQICE9IEU7ICsrUCkgewotICAgICAgT2JqQ1Byb3BlcnR5RGVjbCAqUHJvcCA9ICpQOworICAgIGZvciAoYXV0byAqUHJvcCA6IFBEZWNsLT5wcm9wZXJ0aWVzKCkpIHsKICAgICAgIE9iakNQcm9wZXJ0eURlY2wgKlByb3BlcnR5RnJvbVN1cGVyID0gU3VwZXJQcm9wTWFwW1Byb3AtPmdldElkZW50aWZpZXIoKV07CiAgICAgICAvLyBFeGNsdWRlIHByb3BlcnR5IGZvciBwcm90b2NvbHMgd2hpY2ggY29uZm9ybSB0byBjbGFzcydzIHN1cGVyLWNsYXNzLCAKICAgICAgIC8vIGFzIHN1cGVyLWNsYXNzIGhhcyB0byBpbXBsZW1lbnQgdGhlIHByb3BlcnR5LgpAQCAtMTQ3NSw5ICsxNDUzLDggQEAKICAgICAgIH0KICAgICB9CiAgICAgLy8gc2NhbiB0aHJvdWdoIHByb3RvY29sJ3MgcHJvdG9jb2xzLgotICAgIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IgUEkgPSBQRGVjbC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBQRGVjbC0+cHJvdG9jb2xfZW5kKCk7IFBJICE9IEU7ICsrUEkpCi0gICAgICBDb2xsZWN0SW1tZWRpYXRlUHJvcGVydGllcygoKlBJKSwgUHJvcE1hcCwgU3VwZXJQcm9wTWFwKTsKKyAgICBmb3IgKGF1dG8gKlBJIDogUERlY2wtPnByb3RvY29scygpKQorICAgICAgQ29sbGVjdEltbWVkaWF0ZVByb3BlcnRpZXMoUEksIFByb3BNYXAsIFN1cGVyUHJvcE1hcCk7CiAgIH0KIH0KIApAQCAtMTUxMCwxNyArMTQ4NywzNSBAQAogICAKICAgLy8gbG9vayB1cCBhIHByb3BlcnR5IGRlY2xhcmF0aW9uIHdob3NlIG9uZSBvZiBpdHMgYWNjZXNzb3JzIGlzIGltcGxlbWVudGVkCiAgIC8vIGJ5IHRoaXMgbWV0aG9kLgotICBmb3IgKE9iakNDb250YWluZXJEZWNsOjpwcm9wX2l0ZXJhdG9yIFAgPSBJRmFjZS0+cHJvcF9iZWdpbigpLAotICAgICAgIEUgPSBJRmFjZS0+cHJvcF9lbmQoKTsgUCAhPSBFOyArK1ApIHsKLSAgICBPYmpDUHJvcGVydHlEZWNsICpwcm9wZXJ0eSA9ICpQOwotICAgIGlmICgocHJvcGVydHktPmdldEdldHRlck5hbWUoKSA9PSBJTUQtPmdldFNlbGVjdG9yKCkgfHwKLSAgICAgICAgIHByb3BlcnR5LT5nZXRTZXR0ZXJOYW1lKCkgPT0gSU1ELT5nZXRTZWxlY3RvcigpKSAmJgotICAgICAgICAocHJvcGVydHktPmdldFByb3BlcnR5SXZhckRlY2woKSA9PSBJVikpCisgIGZvciAoY29uc3QgYXV0byAqUHJvcGVydHkgOiBJRmFjZS0+cHJvcGVydGllcygpKSB7CisgICAgaWYgKChQcm9wZXJ0eS0+Z2V0R2V0dGVyTmFtZSgpID09IElNRC0+Z2V0U2VsZWN0b3IoKSB8fAorICAgICAgICAgUHJvcGVydHktPmdldFNldHRlck5hbWUoKSA9PSBJTUQtPmdldFNlbGVjdG9yKCkpICYmCisgICAgICAgIChQcm9wZXJ0eS0+Z2V0UHJvcGVydHlJdmFyRGVjbCgpID09IElWKSkKICAgICAgIHJldHVybiB0cnVlOwogICB9CiAgIHJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGJvb2wgU3VwZXJDbGFzc0ltcGxlbWVudHNQcm9wZXJ0eShPYmpDSW50ZXJmYWNlRGVjbCAqSURlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNQcm9wZXJ0eURlY2wgKlByb3ApIHsKKyAgYm9vbCBTdXBlckNsYXNzSW1wbGVtZW50c0dldHRlciA9IGZhbHNlOworICBib29sIFN1cGVyQ2xhc3NJbXBsZW1lbnRzU2V0dGVyID0gZmFsc2U7CisgIGlmIChQcm9wLT5nZXRQcm9wZXJ0eUF0dHJpYnV0ZXMoKSAmIE9iakNQcm9wZXJ0eURlY2w6Ok9CSkNfUFJfcmVhZG9ubHkpCisgICAgU3VwZXJDbGFzc0ltcGxlbWVudHNTZXR0ZXIgPSB0cnVlOworCisgIHdoaWxlIChJRGVjbC0+Z2V0U3VwZXJDbGFzcygpKSB7CisgICAgT2JqQ0ludGVyZmFjZURlY2wgKlNEZWNsID0gSURlY2wtPmdldFN1cGVyQ2xhc3MoKTsKKyAgICBpZiAoIVN1cGVyQ2xhc3NJbXBsZW1lbnRzR2V0dGVyICYmIFNEZWNsLT5nZXRJbnN0YW5jZU1ldGhvZChQcm9wLT5nZXRHZXR0ZXJOYW1lKCkpKQorICAgICAgU3VwZXJDbGFzc0ltcGxlbWVudHNHZXR0ZXIgPSB0cnVlOworCisgICAgaWYgKCFTdXBlckNsYXNzSW1wbGVtZW50c1NldHRlciAmJiBTRGVjbC0+Z2V0SW5zdGFuY2VNZXRob2QoUHJvcC0+Z2V0U2V0dGVyTmFtZSgpKSkKKyAgICAgIFN1cGVyQ2xhc3NJbXBsZW1lbnRzU2V0dGVyID0gdHJ1ZTsKKyAgICBpZiAoU3VwZXJDbGFzc0ltcGxlbWVudHNHZXR0ZXIgJiYgU3VwZXJDbGFzc0ltcGxlbWVudHNTZXR0ZXIpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBJRGVjbCA9IElEZWNsLT5nZXRTdXBlckNsYXNzKCk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQogCiAvLy8gXGJyaWVmIERlZmF1bHQgc3ludGhlc2l6ZXMgYWxsIHByb3BlcnRpZXMgd2hpY2ggbXVzdCBiZSBzeW50aGVzaXplZAogLy8vIGluIGNsYXNzJ3MgXEBpbXBsZW1lbnRhdGlvbi4KQEAgLTE1NTksNyArMTU1NCw3IEBACiAgICAgICAgICAgIUlNUERlY2wtPmdldEluc3RhbmNlTWV0aG9kKFByb3AtPmdldFNldHRlck5hbWUoKSkgJiYKICAgICAgICAgICAhSURlY2wtPkhhc1VzZXJEZWNsYXJlZFNldHRlck1ldGhvZChQcm9wKSkgewogICAgICAgICAgICAgRGlhZyhQcm9wLT5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX25vX2F1dG9zeW50aGVzaXNfcHJvcGVydHkpCi0gICAgICAgICAgICAgIDw8IFByb3AtPmdldElkZW50aWZpZXIoKS0+Z2V0TmFtZSgpOworICAgICAgICAgICAgICA8PCBQcm9wLT5nZXRJZGVudGlmaWVyKCk7CiAgICAgICAgICAgICBEaWFnKFByb3BJblN1cGVyQ2xhc3MtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJvcGVydHlfZGVjbGFyZSk7CiAgICAgICB9CiAgICAgICBjb250aW51ZTsKQEAgLTE1NjgsMTcgKzE1NjMsMjMgQEAKICAgICAgICAgSU1QRGVjbC0+RmluZFByb3BlcnR5SW1wbEl2YXJEZWNsKFByb3AtPmdldElkZW50aWZpZXIoKSkpIHsKICAgICAgIGlmIChQSUQtPmdldFByb3BlcnR5RGVjbCgpICE9IFByb3ApIHsKICAgICAgICAgRGlhZyhQcm9wLT5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX25vX2F1dG9zeW50aGVzaXNfc2hhcmVkX2l2YXJfcHJvcGVydHkpCi0gICAgICAgIDw8IFByb3AtPmdldElkZW50aWZpZXIoKS0+Z2V0TmFtZSgpOworICAgICAgICAgIDw8IFByb3AtPmdldElkZW50aWZpZXIoKTsKICAgICAgICAgaWYgKCFQSUQtPmdldExvY2F0aW9uKCkuaXNJbnZhbGlkKCkpCiAgICAgICAgICAgRGlhZyhQSUQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJvcGVydHlfc3ludGhlc2l6ZSk7CiAgICAgICB9CiAgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKGlzYTxPYmpDUHJvdG9jb2xEZWNsPihQcm9wLT5nZXREZWNsQ29udGV4dCgpKSkgeworICAgIGlmIChPYmpDUHJvdG9jb2xEZWNsICpQcm90byA9CisgICAgICAgICAgZHluX2Nhc3Q8T2JqQ1Byb3RvY29sRGVjbD4oUHJvcC0+Z2V0RGVjbENvbnRleHQoKSkpIHsKICAgICAgIC8vIFdlIHdvbid0IGF1dG8tc3ludGhlc2l6ZSBwcm9wZXJ0aWVzIGRlY2xhcmVkIGluIHByb3RvY29scy4KLSAgICAgIERpYWcoSU1QRGVjbC0+Z2V0TG9jYXRpb24oKSwgCi0gICAgICAgICAgIGRpYWc6Ondhcm5fYXV0b19zeW50aGVzaXppbmdfcHJvdG9jb2xfcHJvcGVydHkpOwotICAgICAgRGlhZyhQcm9wLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3Byb3BlcnR5X2RlY2xhcmUpOworICAgICAgLy8gU3VwcHJlc3MgdGhlIHdhcm5pbmcgaWYgY2xhc3MncyBzdXBlcmNsYXNzIGltcGxlbWVudHMgcHJvcGVydHkncworICAgICAgLy8gZ2V0dGVyIGFuZCBpbXBsZW1lbnRzIHByb3BlcnR5J3Mgc2V0dGVyIChpZiByZWFkd3JpdGUgcHJvcGVydHkpLgorICAgICAgaWYgKCFTdXBlckNsYXNzSW1wbGVtZW50c1Byb3BlcnR5KElEZWNsLCBQcm9wKSkgeworICAgICAgICBEaWFnKElNUERlY2wtPmdldExvY2F0aW9uKCksCisgICAgICAgICAgICAgZGlhZzo6d2Fybl9hdXRvX3N5bnRoZXNpemluZ19wcm90b2NvbF9wcm9wZXJ0eSkKKyAgICAgICAgICA8PCBQcm9wIDw8IFByb3RvOworICAgICAgICBEaWFnKFByb3AtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcHJvcGVydHlfZGVjbGFyZSk7CisgICAgICB9CiAgICAgICBjb250aW51ZTsKICAgICB9CiAKQEAgLTE2MTAsNDEgKzE2MTEsMTA1IEBACiAgICAgICBEZWZhdWx0U3ludGhlc2l6ZVByb3BlcnRpZXMoUywgSUMsIElEZWNsKTsKIH0KIAorc3RhdGljIHZvaWQgRGlhZ25vc2VVbmltcGxlbWVudGVkQWNjZXNzb3IoU2VtYSAmUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNJbnRlcmZhY2VEZWNsICpQcmltYXJ5Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDSW1wbERlY2wqIElNUERlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDQ29udGFpbmVyRGVjbCAqQ0RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDQ2F0ZWdvcnlEZWNsICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ1Byb3BlcnR5RGVjbCAqUHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWE6OlNlbGVjdG9yU2V0ICZTTWFwKSB7CisgIC8vIFdoZW4gcmVwb3J0aW5nIG9uIG1pc3NpbmcgcHJvcGVydHkgc2V0dGVyL2dldHRlciBpbXBsZW1lbnRhdGlvbiBpbgorICAvLyBjYXRlZ29yaWVzLCBkbyBub3QgcmVwb3J0IHdoZW4gdGhleSBhcmUgZGVjbGFyZWQgaW4gcHJpbWFyeSBjbGFzcywKKyAgLy8gY2xhc3MncyBwcm90b2NvbCwgb3Igb25lIG9mIGl0IHN1cGVyIGNsYXNzZXMuIFRoaXMgaXMgYmVjYXVzZSwKKyAgLy8gdGhlIGNsYXNzIGlzIGdvaW5nIHRvIGltcGxlbWVudCB0aGVtLgorICBpZiAoIVNNYXAuY291bnQoTWV0aG9kKSAmJgorICAgICAgKFByaW1hcnlDbGFzcyA9PSAwIHx8CisgICAgICAgIVByaW1hcnlDbGFzcy0+bG9va3VwUHJvcGVydHlBY2Nlc3NvcihNZXRob2QsIEMpKSkgeworICAgICAgICBTLkRpYWcoSU1QRGVjbC0+Z2V0TG9jYXRpb24oKSwKKyAgICAgICAgICAgICAgIGlzYTxPYmpDQ2F0ZWdvcnlEZWNsPihDRGVjbCkgPworICAgICAgICAgICAgICAgZGlhZzo6d2Fybl9zZXR0ZXJfZ2V0dGVyX2ltcGxfcmVxdWlyZWRfaW5fY2F0ZWdvcnkgOgorICAgICAgICAgICAgICAgZGlhZzo6d2Fybl9zZXR0ZXJfZ2V0dGVyX2ltcGxfcmVxdWlyZWQpCisgICAgICAgICAgICA8PCBQcm9wLT5nZXREZWNsTmFtZSgpIDw8IE1ldGhvZDsKKyAgICAgICAgUy5EaWFnKFByb3AtPmdldExvY2F0aW9uKCksCisgICAgICAgICAgICAgZGlhZzo6bm90ZV9wcm9wZXJ0eV9kZWNsYXJlKTsKKyAgICAgICAgaWYgKFMuTGFuZ09wdHMuT2JqQ0RlZmF1bHRTeW50aFByb3BlcnRpZXMgJiYKKyAgICAgICAgICAgIFMuTGFuZ09wdHMuT2JqQ1J1bnRpbWUuaXNOb25GcmFnaWxlKCkpCisgICAgICAgICAgaWYgKE9iakNJbnRlcmZhY2VEZWNsICpJRCA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPihDRGVjbCkpCisgICAgICAgICAgICBpZiAoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKlJJRCA9IElELT5pc09iakNSZXF1aXJlc1Byb3BlcnR5RGVmcygpKQorICAgICAgICAgICAgUy5EaWFnKFJJRC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9zdXBwcmVzc2VkX2NsYXNzX2RlY2xhcmUpOworICAgICAgfQorfQorCiB2b2lkIFNlbWE6OkRpYWdub3NlVW5pbXBsZW1lbnRlZFByb3BlcnRpZXMoU2NvcGUgKlMsIE9iakNJbXBsRGVjbCogSU1QRGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0NvbnRhaW5lckRlY2wgKkNEZWNsKSB7Ci0gIE9iakNDb250YWluZXJEZWNsOjpQcm9wZXJ0eU1hcCBOb05lZWRUb0ltcGxQcm9wTWFwOwotICBPYmpDSW50ZXJmYWNlRGVjbCAqSURlY2w7Ci0gIC8vIEdhdGhlciBwcm9wZXJ0aWVzIHdoaWNoIG5lZWQgbm90IGJlIGltcGxlbWVudGVkIGluIHRoaXMgY2xhc3MKLSAgLy8gb3IgY2F0ZWdvcnkuCi0gIGlmICghKElEZWNsID0gZHluX2Nhc3Q8T2JqQ0ludGVyZmFjZURlY2w+KENEZWNsKSkpCi0gICAgaWYgKE9iakNDYXRlZ29yeURlY2wgKkMgPSBkeW5fY2FzdDxPYmpDQ2F0ZWdvcnlEZWNsPihDRGVjbCkpIHsKLSAgICAgIC8vIEZvciBjYXRlZ29yaWVzLCBubyBuZWVkIHRvIGltcGxlbWVudCBwcm9wZXJ0aWVzIGRlY2xhcmVkIGluCi0gICAgICAvLyBpdHMgcHJpbWFyeSBjbGFzcyAoYW5kIGl0cyBzdXBlciBjbGFzc2VzKSBpZiBwcm9wZXJ0eSBpcwotICAgICAgLy8gZGVjbGFyZWQgaW4gb25lIG9mIHRob3NlIGNvbnRhaW5lcnMuCi0gICAgICBpZiAoKElEZWNsID0gQy0+Z2V0Q2xhc3NJbnRlcmZhY2UoKSkpIHsKLSAgICAgICAgT2JqQ0ludGVyZmFjZURlY2w6OlByb3BlcnR5RGVjbE9yZGVyIFBPOwotICAgICAgICBJRGVjbC0+Y29sbGVjdFByb3BlcnRpZXNUb0ltcGxlbWVudChOb05lZWRUb0ltcGxQcm9wTWFwLCBQTyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqQ0NvbnRhaW5lckRlY2wgKkNEZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3ludGhlc2l6ZVByb3BlcnRpZXMpIHsKKyAgT2JqQ0NvbnRhaW5lckRlY2w6OlByb3BlcnR5TWFwIFByb3BNYXA7CisgIE9iakNJbnRlcmZhY2VEZWNsICpJRGVjbCA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPihDRGVjbCk7CisKKyAgaWYgKCFTeW50aGVzaXplUHJvcGVydGllcykgeworICAgIE9iakNDb250YWluZXJEZWNsOjpQcm9wZXJ0eU1hcCBOb05lZWRUb0ltcGxQcm9wTWFwOworICAgIC8vIEdhdGhlciBwcm9wZXJ0aWVzIHdoaWNoIG5lZWQgbm90IGJlIGltcGxlbWVudGVkIGluIHRoaXMgY2xhc3MKKyAgICAvLyBvciBjYXRlZ29yeS4KKyAgICBpZiAoIUlEZWNsKQorICAgICAgaWYgKE9iakNDYXRlZ29yeURlY2wgKkMgPSBkeW5fY2FzdDxPYmpDQ2F0ZWdvcnlEZWNsPihDRGVjbCkpIHsKKyAgICAgICAgLy8gRm9yIGNhdGVnb3JpZXMsIG5vIG5lZWQgdG8gaW1wbGVtZW50IHByb3BlcnRpZXMgZGVjbGFyZWQgaW4KKyAgICAgICAgLy8gaXRzIHByaW1hcnkgY2xhc3MgKGFuZCBpdHMgc3VwZXIgY2xhc3NlcykgaWYgcHJvcGVydHkgaXMKKyAgICAgICAgLy8gZGVjbGFyZWQgaW4gb25lIG9mIHRob3NlIGNvbnRhaW5lcnMuCisgICAgICAgIGlmICgoSURlY2wgPSBDLT5nZXRDbGFzc0ludGVyZmFjZSgpKSkgeworICAgICAgICAgIE9iakNJbnRlcmZhY2VEZWNsOjpQcm9wZXJ0eURlY2xPcmRlciBQTzsKKyAgICAgICAgICBJRGVjbC0+Y29sbGVjdFByb3BlcnRpZXNUb0ltcGxlbWVudChOb05lZWRUb0ltcGxQcm9wTWFwLCBQTyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBpZiAoSURlY2wpCisgICAgICBDb2xsZWN0U3VwZXJDbGFzc1Byb3BlcnR5SW1wbGVtZW50YXRpb25zKElEZWNsLCBOb05lZWRUb0ltcGxQcm9wTWFwKTsKKyAgICAKKyAgICBDb2xsZWN0SW1tZWRpYXRlUHJvcGVydGllcyhDRGVjbCwgUHJvcE1hcCwgTm9OZWVkVG9JbXBsUHJvcE1hcCk7CisgIH0KKworICAvLyBTY2FuIHRoZSBAaW50ZXJmYWNlIHRvIHNlZSBpZiBhbnkgb2YgdGhlIHByb3RvY29scyBpdCBhZG9wdHMKKyAgLy8gcmVxdWlyZSBhbiBleHBsaWNpdCBpbXBsZW1lbnRhdGlvbiwgdmlhIGF0dHJpYnV0ZQorICAvLyAnb2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbicuCisgIGlmIChJRGVjbCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxPYmpDQ29udGFpbmVyRGVjbDo6UHJvcGVydHlNYXA+IExhenlNYXA7CisKKyAgICBmb3IgKGF1dG8gKlBEZWNsIDogSURlY2wtPmFsbF9yZWZlcmVuY2VkX3Byb3RvY29scygpKSB7CisgICAgICBpZiAoIVBEZWNsLT5oYXNBdHRyPE9iakNFeHBsaWNpdFByb3RvY29sSW1wbEF0dHI+KCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gTGF6aWx5IGNvbnN0cnVjdCBhIHNldCBvZiBhbGwgdGhlIHByb3BlcnRpZXMgaW4gdGhlIEBpbnRlcmZhY2UKKyAgICAgIC8vIG9mIHRoZSBjbGFzcywgd2l0aG91dCBsb29raW5nIGF0IHRoZSBzdXBlcmNsYXNzLiAgV2UgY2Fubm90CisgICAgICAvLyB1c2UgdGhlIGNhbGwgdG8gQ29sbGVjdEltbWVkaWF0ZVByb3BlcnRpZXMoKSBhYm92ZSBhcyB0aGF0CisgICAgICAvLyB1dGlsaXplcyBpbmZvcm1hdGlvbiBmcm9tdCBoZSBzdXBlciBjbGFzcydzIHByb3BlcnRpZXMgYXMgd2VsbAorICAgICAgLy8gYXMgc2NhbnMgdGhlIGFkb3B0ZWQgcHJvdG9jb2xzLiAgVGhpcyB3b3JrIG9ubHkgdHJpZ2dlcnMgZm9yIHByb3RvY29scworICAgICAgLy8gd2l0aCB0aGUgYXR0cmlidXRlLCB3aGljaCBpcyB2ZXJ5IHJhcmUsIGFuZCBvbmx5IG9jY3VycyB3aGVuCisgICAgICAvLyBhbmFseXppbmcgdGhlIEBpbXBsZW1lbnRhdGlvbi4KKyAgICAgIGlmICghTGF6eU1hcCkgeworICAgICAgICBPYmpDQ29udGFpbmVyRGVjbDo6UHJvcGVydHlNYXAgTm9OZWVkVG9JbXBsUHJvcE1hcDsKKyAgICAgICAgTGF6eU1hcC5yZXNldChuZXcgT2JqQ0NvbnRhaW5lckRlY2w6OlByb3BlcnR5TWFwKCkpOworICAgICAgICBDb2xsZWN0SW1tZWRpYXRlUHJvcGVydGllcyhDRGVjbCwgKkxhenlNYXAsIE5vTmVlZFRvSW1wbFByb3BNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVQcm90b2NvbHMgKi8gZmFsc2UpOworICAgICAgfQorICAgICAgLy8gQWRkIHRoZSBwcm9wZXJ0aWVzIG9mICdQRGVjbCcgdG8gdGhlIGxpc3Qgb2YgcHJvcGVydGllcyB0aGF0CisgICAgICAvLyBuZWVkIHRvIGJlIGltcGxlbWVudGVkLgorICAgICAgZm9yIChhdXRvICpQcm9wRGVjbCA6IFBEZWNsLT5wcm9wZXJ0aWVzKCkpIHsKKyAgICAgICAgaWYgKCgqTGF6eU1hcClbUHJvcERlY2wtPmdldElkZW50aWZpZXIoKV0pCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIFByb3BNYXBbUHJvcERlY2wtPmdldElkZW50aWZpZXIoKV0gPSBQcm9wRGVjbDsKICAgICAgIH0KICAgICB9Ci0gIGlmIChJRGVjbCkKLSAgICBDb2xsZWN0U3VwZXJDbGFzc1Byb3BlcnR5SW1wbGVtZW50YXRpb25zKElEZWNsLCBOb05lZWRUb0ltcGxQcm9wTWFwKTsKLSAgCi0gIE9iakNDb250YWluZXJEZWNsOjpQcm9wZXJ0eU1hcCBQcm9wTWFwOwotICBDb2xsZWN0SW1tZWRpYXRlUHJvcGVydGllcyhDRGVjbCwgUHJvcE1hcCwgTm9OZWVkVG9JbXBsUHJvcE1hcCk7CisgIH0KKwogICBpZiAoUHJvcE1hcC5lbXB0eSgpKQogICAgIHJldHVybjsKIAogICBsbHZtOjpEZW5zZVNldDxPYmpDUHJvcGVydHlEZWNsICo+IFByb3BJbXBsTWFwOwotICBmb3IgKE9iakNJbXBsRGVjbDo6cHJvcGltcGxfaXRlcmF0b3IKLSAgICAgICBJID0gSU1QRGVjbC0+cHJvcGltcGxfYmVnaW4oKSwKLSAgICAgICBFSSA9IElNUERlY2wtPnByb3BpbXBsX2VuZCgpOyBJICE9IEVJOyArK0kpCisgIGZvciAoY29uc3QgYXV0byAqSSA6IElNUERlY2wtPnByb3BlcnR5X2ltcGxzKCkpCiAgICAgUHJvcEltcGxNYXAuaW5zZXJ0KEktPmdldFByb3BlcnR5RGVjbCgpKTsKIAogICBTZWxlY3RvclNldCBJbnNNYXA7CiAgIC8vIENvbGxlY3QgcHJvcGVydHkgYWNjZXNzb3JzIGltcGxlbWVudGVkIGluIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uCi0gIGZvciAoT2JqQ0ltcGxlbWVudGF0aW9uRGVjbDo6aW5zdG1ldGhfaXRlcmF0b3IKLSAgICAgICBJID0gSU1QRGVjbC0+aW5zdG1ldGhfYmVnaW4oKSwgRSA9IElNUERlY2wtPmluc3RtZXRoX2VuZCgpOyBJIT1FOyArK0kpCi0gICAgSW5zTWFwLmluc2VydCgoKkkpLT5nZXRTZWxlY3RvcigpKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogSU1QRGVjbC0+aW5zdGFuY2VfbWV0aG9kcygpKQorICAgIEluc01hcC5pbnNlcnQoSS0+Z2V0U2VsZWN0b3IoKSk7CiAgIAogICBPYmpDQ2F0ZWdvcnlEZWNsICpDID0gZHluX2Nhc3Q8T2JqQ0NhdGVnb3J5RGVjbD4oQ0RlY2wpOwogICBPYmpDSW50ZXJmYWNlRGVjbCAqUHJpbWFyeUNsYXNzID0gMDsKQEAgLTE2NTUsOSArMTcyMCw4IEBACiAgICAgICAgIC8vIFdoZW4gcmVwb3J0aW5nIG9uIG1pc3Npbmcgc2V0dGVyL2dldHRlcnMsIGRvIG5vdCByZXBvcnQgd2hlbgogICAgICAgICAvLyBzZXR0ZXIvZ2V0dGVyIGlzIGltcGxlbWVudGVkIGluIGNhdGVnb3J5J3MgcHJpbWFyeSBjbGFzcwogICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgZm9yIChPYmpDSW1wbGVtZW50YXRpb25EZWNsOjppbnN0bWV0aF9pdGVyYXRvcgotICAgICAgICAgICAgIEkgPSBJTVAtPmluc3RtZXRoX2JlZ2luKCksIEUgPSBJTVAtPmluc3RtZXRoX2VuZCgpOyBJIT1FOyArK0kpCi0gICAgICAgICAgSW5zTWFwLmluc2VydCgoKkkpLT5nZXRTZWxlY3RvcigpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICpJIDogSU1QLT5pbnN0YW5jZV9tZXRob2RzKCkpCisgICAgICAgICAgSW5zTWFwLmluc2VydChJLT5nZXRTZWxlY3RvcigpKTsKICAgICAgIH0KIAogICBmb3IgKE9iakNDb250YWluZXJEZWNsOjpQcm9wZXJ0eU1hcDo6aXRlcmF0b3IKQEAgLTE2NjksNDUgKzE3MzMsMTQgQEAKICAgICAgICAgUHJvcEltcGxNYXAuY291bnQoUHJvcCkgfHwKICAgICAgICAgUHJvcC0+Z2V0QXZhaWxhYmlsaXR5KCkgPT0gQVJfVW5hdmFpbGFibGUpCiAgICAgICBjb250aW51ZTsKLSAgICAvLyBXaGVuIHJlcG9ydGluZyBvbiBtaXNzaW5nIHByb3BlcnR5IGdldHRlciBpbXBsZW1lbnRhdGlvbiBpbgotICAgIC8vIGNhdGVnb3JpZXMsIGRvIG5vdCByZXBvcnQgd2hlbiB0aGV5IGFyZSBkZWNsYXJlZCBpbiBwcmltYXJ5IGNsYXNzLAotICAgIC8vIGNsYXNzJ3MgcHJvdG9jb2wsIG9yIG9uZSBvZiBpdCBzdXBlciBjbGFzc2VzLiBUaGlzIGlzIGJlY2F1c2UsCi0gICAgLy8gdGhlIGNsYXNzIGlzIGdvaW5nIHRvIGltcGxlbWVudCB0aGVtLgotICAgIGlmICghSW5zTWFwLmNvdW50KFByb3AtPmdldEdldHRlck5hbWUoKSkgJiYKLSAgICAgICAgKFByaW1hcnlDbGFzcyA9PSAwIHx8Ci0gICAgICAgICAhUHJpbWFyeUNsYXNzLT5sb29rdXBQcm9wZXJ0eUFjY2Vzc29yKFByb3AtPmdldEdldHRlck5hbWUoKSwgQykpKSB7Ci0gICAgICBEaWFnKElNUERlY2wtPmdldExvY2F0aW9uKCksCi0gICAgICAgICAgIGlzYTxPYmpDQ2F0ZWdvcnlEZWNsPihDRGVjbCkgPwotICAgICAgICAgICAgZGlhZzo6d2Fybl9zZXR0ZXJfZ2V0dGVyX2ltcGxfcmVxdWlyZWRfaW5fY2F0ZWdvcnkgOgotICAgICAgICAgICAgZGlhZzo6d2Fybl9zZXR0ZXJfZ2V0dGVyX2ltcGxfcmVxdWlyZWQpCi0gICAgICA8PCBQcm9wLT5nZXREZWNsTmFtZSgpIDw8IFByb3AtPmdldEdldHRlck5hbWUoKTsKLSAgICAgIERpYWcoUHJvcC0+Z2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgZGlhZzo6bm90ZV9wcm9wZXJ0eV9kZWNsYXJlKTsKLSAgICAgIGlmIChMYW5nT3B0cy5PYmpDRGVmYXVsdFN5bnRoUHJvcGVydGllcyAmJiBMYW5nT3B0cy5PYmpDUnVudGltZS5pc05vbkZyYWdpbGUoKSkKLSAgICAgICAgaWYgKE9iakNJbnRlcmZhY2VEZWNsICpJRCA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPihDRGVjbCkpCi0gICAgICAgICAgaWYgKGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpSSUQgPSBJRC0+aXNPYmpDUmVxdWlyZXNQcm9wZXJ0eURlZnMoKSkKLSAgICAgICAgICAgIERpYWcoUklELT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3N1cHByZXNzZWRfY2xhc3NfZGVjbGFyZSk7Ci0gICAgICAgICAgICAKLSAgICB9Ci0gICAgLy8gV2hlbiByZXBvcnRpbmcgb24gbWlzc2luZyBwcm9wZXJ0eSBzZXR0ZXIgaW1wbGVtZW50YXRpb24gaW4KLSAgICAvLyBjYXRlZ29yaWVzLCBkbyBub3QgcmVwb3J0IHdoZW4gdGhleSBhcmUgZGVjbGFyZWQgaW4gcHJpbWFyeSBjbGFzcywKLSAgICAvLyBjbGFzcydzIHByb3RvY29sLCBvciBvbmUgb2YgaXQgc3VwZXIgY2xhc3Nlcy4gVGhpcyBpcyBiZWNhdXNlLAotICAgIC8vIHRoZSBjbGFzcyBpcyBnb2luZyB0byBpbXBsZW1lbnQgdGhlbS4KLSAgICBpZiAoIVByb3AtPmlzUmVhZE9ubHkoKSAmJiAhSW5zTWFwLmNvdW50KFByb3AtPmdldFNldHRlck5hbWUoKSkgJiYKLSAgICAgICAgKFByaW1hcnlDbGFzcyA9PSAwIHx8Ci0gICAgICAgICAhUHJpbWFyeUNsYXNzLT5sb29rdXBQcm9wZXJ0eUFjY2Vzc29yKFByb3AtPmdldFNldHRlck5hbWUoKSwgQykpKSB7Ci0gICAgICBEaWFnKElNUERlY2wtPmdldExvY2F0aW9uKCksCi0gICAgICAgICAgIGlzYTxPYmpDQ2F0ZWdvcnlEZWNsPihDRGVjbCkgPwotICAgICAgICAgICBkaWFnOjp3YXJuX3NldHRlcl9nZXR0ZXJfaW1wbF9yZXF1aXJlZF9pbl9jYXRlZ29yeSA6Ci0gICAgICAgICAgIGRpYWc6Ondhcm5fc2V0dGVyX2dldHRlcl9pbXBsX3JlcXVpcmVkKQotICAgICAgPDwgUHJvcC0+Z2V0RGVjbE5hbWUoKSA8PCBQcm9wLT5nZXRTZXR0ZXJOYW1lKCk7Ci0gICAgICBEaWFnKFByb3AtPmdldExvY2F0aW9uKCksCi0gICAgICAgICAgIGRpYWc6Om5vdGVfcHJvcGVydHlfZGVjbGFyZSk7Ci0gICAgICBpZiAoTGFuZ09wdHMuT2JqQ0RlZmF1bHRTeW50aFByb3BlcnRpZXMgJiYgTGFuZ09wdHMuT2JqQ1J1bnRpbWUuaXNOb25GcmFnaWxlKCkpCi0gICAgICAgIGlmIChPYmpDSW50ZXJmYWNlRGVjbCAqSUQgPSBkeW5fY2FzdDxPYmpDSW50ZXJmYWNlRGVjbD4oQ0RlY2wpKQotICAgICAgICAgIGlmIChjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqUklEID0gSUQtPmlzT2JqQ1JlcXVpcmVzUHJvcGVydHlEZWZzKCkpCi0gICAgICAgICAgICBEaWFnKFJJRC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9zdXBwcmVzc2VkX2NsYXNzX2RlY2xhcmUpOwotICAgIH0KKworICAgIC8vIERpYWdub3NlIHVuaW1wbGVtZW50ZWQgZ2V0dGVycyBhbmQgc2V0dGVycy4KKyAgICBEaWFnbm9zZVVuaW1wbGVtZW50ZWRBY2Nlc3NvcigqdGhpcywKKyAgICAgICAgICBQcmltYXJ5Q2xhc3MsIFByb3AtPmdldEdldHRlck5hbWUoKSwgSU1QRGVjbCwgQ0RlY2wsIEMsIFByb3AsIEluc01hcCk7CisgICAgaWYgKCFQcm9wLT5pc1JlYWRPbmx5KCkpCisgICAgICBEaWFnbm9zZVVuaW1wbGVtZW50ZWRBY2Nlc3NvcigqdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlDbGFzcywgUHJvcC0+Z2V0U2V0dGVyTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QRGVjbCwgQ0RlY2wsIEMsIFByb3AsIEluc01hcCk7CiAgIH0KIH0KIApAQCAtMTcxNywxMCArMTc1MCw3IEBACiAgIC8vIFJ1bGVzIGFwcGx5IGluIG5vbi1HQyBtb2RlIG9ubHkKICAgaWYgKGdldExhbmdPcHRzKCkuZ2V0R0MoKSAhPSBMYW5nT3B0aW9uczo6Tm9uR0MpCiAgICAgcmV0dXJuOwotICBmb3IgKE9iakNDb250YWluZXJEZWNsOjpwcm9wX2l0ZXJhdG9yIEkgPSBJRGVjbC0+cHJvcF9iZWdpbigpLAotICAgICAgIEUgPSBJRGVjbC0+cHJvcF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIE9iakNQcm9wZXJ0eURlY2wgKlByb3BlcnR5ID0gKkk7CisgIGZvciAoY29uc3QgYXV0byAqUHJvcGVydHkgOiBJRGVjbC0+cHJvcGVydGllcygpKSB7CiAgICAgT2JqQ01ldGhvZERlY2wgKkdldHRlck1ldGhvZCA9IDA7CiAgICAgT2JqQ01ldGhvZERlY2wgKlNldHRlck1ldGhvZCA9IDA7CiAgICAgYm9vbCBMb29rZWRVcEdldHRlclNldHRlciA9IGZhbHNlOwpAQCAtMTc1OCw3ICsxNzg4LDYgQEAKICAgICAgIGlmICghTG9va2VkVXBHZXR0ZXJTZXR0ZXIpIHsKICAgICAgICAgR2V0dGVyTWV0aG9kID0gSU1QRGVjbC0+Z2V0SW5zdGFuY2VNZXRob2QoUHJvcGVydHktPmdldEdldHRlck5hbWUoKSk7CiAgICAgICAgIFNldHRlck1ldGhvZCA9IElNUERlY2wtPmdldEluc3RhbmNlTWV0aG9kKFByb3BlcnR5LT5nZXRTZXR0ZXJOYW1lKCkpOwotICAgICAgICBMb29rZWRVcEdldHRlclNldHRlciA9IHRydWU7CiAgICAgICB9CiAgICAgICBpZiAoKEdldHRlck1ldGhvZCAmJiAhU2V0dGVyTWV0aG9kKSB8fCAoIUdldHRlck1ldGhvZCAmJiBTZXR0ZXJNZXRob2QpKSB7CiAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE1ldGhvZExvYyA9CkBAIC0xODA1LDEyICsxODM0LDcgQEAKICAgaWYgKGdldExhbmdPcHRzKCkuZ2V0R0MoKSA9PSBMYW5nT3B0aW9uczo6R0NPbmx5KQogICAgIHJldHVybjsKIAotICBmb3IgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2w6OnByb3BpbXBsX2l0ZXJhdG9yCi0gICAgICAgICBpID0gRC0+cHJvcGltcGxfYmVnaW4oKSwgZSA9IEQtPnByb3BpbXBsX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgIE9iakNQcm9wZXJ0eUltcGxEZWNsICpQSUQgPSAqaTsKLSAgICBpZiAoUElELT5nZXRQcm9wZXJ0eUltcGxlbWVudGF0aW9uKCkgIT0gT2JqQ1Byb3BlcnR5SW1wbERlY2w6OlN5bnRoZXNpemUpCi0gICAgICBjb250aW51ZTsKLSAgICAKKyAgZm9yIChjb25zdCBhdXRvICpQSUQgOiBELT5wcm9wZXJ0eV9pbXBscygpKSB7CiAgICAgY29uc3QgT2JqQ1Byb3BlcnR5RGVjbCAqUEQgPSBQSUQtPmdldFByb3BlcnR5RGVjbCgpOwogICAgIGlmIChQRCAmJiAhUEQtPmhhc0F0dHI8TlNSZXR1cm5zTm90UmV0YWluZWRBdHRyPigpICYmCiAgICAgICAgICFELT5nZXRJbnN0YW5jZU1ldGhvZChQRC0+Z2V0R2V0dGVyTmFtZSgpKSkgewpAQCAtMTgyMSwyNyArMTg0NSw1MSBAQAogICAgICAgaWYgKGZhbWlseSA9PSBPTUZfYWxsb2MgfHwgZmFtaWx5ID09IE9NRl9jb3B5IHx8CiAgICAgICAgICAgZmFtaWx5ID09IE9NRl9tdXRhYmxlQ29weSB8fCBmYW1pbHkgPT0gT01GX25ldykgewogICAgICAgICBpZiAoZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50KQotICAgICAgICAgIERpYWcoUElELT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfb3duaW5fZ2V0dGVyX3J1bGUpOworICAgICAgICAgIERpYWcoUEQtPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9jb2NvYV9uYW1pbmdfb3duZWRfcnVsZSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICBEaWFnKFBJRC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6d2Fybl9vd25pbmdfZ2V0dGVyX3J1bGUpOwotICAgICAgICBEaWFnKFBELT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3Byb3BlcnR5X2RlY2xhcmUpOworICAgICAgICAgIERpYWcoUEQtPmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5fY29jb2FfbmFtaW5nX293bmVkX3J1bGUpOwogICAgICAgfQogICAgIH0KICAgfQogfQogCit2b2lkIFNlbWE6OkRpYWdub3NlTWlzc2luZ0Rlc2lnbmF0ZWRJbml0T3ZlcnJpZGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpJbXBsRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklGRCkgeworICBhc3NlcnQoSUZELT5oYXNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKCkpOworICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqU3VwZXJEID0gSUZELT5nZXRTdXBlckNsYXNzKCk7CisgIGlmICghU3VwZXJEKQorICAgIHJldHVybjsKKworICBTZWxlY3RvclNldCBJbml0U2VsU2V0OworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBJbXBsRC0+aW5zdGFuY2VfbWV0aG9kcygpKQorICAgIGlmIChJLT5nZXRNZXRob2RGYW1pbHkoKSA9PSBPTUZfaW5pdCkKKyAgICAgIEluaXRTZWxTZXQuaW5zZXJ0KEktPmdldFNlbGVjdG9yKCkpOworCisgIFNtYWxsVmVjdG9yPGNvbnN0IE9iakNNZXRob2REZWNsICosIDg+IERlc2lnbmF0ZWRJbml0czsKKyAgU3VwZXJELT5nZXREZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKERlc2lnbmF0ZWRJbml0cyk7CisgIGZvciAoU21hbGxWZWN0b3I8Y29uc3QgT2JqQ01ldGhvZERlY2wgKiwgOD46Oml0ZXJhdG9yCisgICAgICAgICBJID0gRGVzaWduYXRlZEluaXRzLmJlZ2luKCksIEUgPSBEZXNpZ25hdGVkSW5pdHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1EID0gKkk7CisgICAgaWYgKCFJbml0U2VsU2V0LmNvdW50KE1ELT5nZXRTZWxlY3RvcigpKSkgeworICAgICAgRGlhZyhJbXBsRC0+Z2V0TG9jYXRpb24oKSwKKyAgICAgICAgICAgZGlhZzo6d2Fybl9vYmpjX2ltcGxlbWVudGF0aW9uX21pc3NpbmdfZGVzaWduYXRlZF9pbml0X292ZXJyaWRlKQorICAgICAgICA8PCBNRC0+Z2V0U2VsZWN0b3IoKTsKKyAgICAgIERpYWcoTUQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfb2JqY19kZXNpZ25hdGVkX2luaXRfbWFya2VkX2hlcmUpOworICAgIH0KKyAgfQorfQorCiAvLy8gQWRkUHJvcGVydHlBdHRycyAtIFByb3BhZ2F0ZXMgYXR0cmlidXRlcyBmcm9tIGEgcHJvcGVydHkgdG8gdGhlCiAvLy8gaW1wbGljaXRseS1kZWNsYXJlZCBnZXR0ZXIgb3Igc2V0dGVyIGZvciB0aGF0IHByb3BlcnR5Lgogc3RhdGljIHZvaWQgQWRkUHJvcGVydHlBdHRycyhTZW1hICZTLCBPYmpDTWV0aG9kRGVjbCAqUHJvcGVydHlNZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakNQcm9wZXJ0eURlY2wgKlByb3BlcnR5KSB7CiAgIC8vIFNob3VsZCB3ZSBqdXN0IGNsb25lIGFsbCBhdHRyaWJ1dGVzIG92ZXI/Ci0gIGZvciAoRGVjbDo6YXR0cl9pdGVyYXRvciBBID0gUHJvcGVydHktPmF0dHJfYmVnaW4oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBBRW5kID0gUHJvcGVydHktPmF0dHJfZW5kKCk7IAotICAgICAgIEEgIT0gQUVuZDsgKytBKSB7Ci0gICAgaWYgKGlzYTxEZXByZWNhdGVkQXR0cj4oKkEpIHx8IAotICAgICAgICBpc2E8VW5hdmFpbGFibGVBdHRyPigqQSkgfHwgCi0gICAgICAgIGlzYTxBdmFpbGFiaWxpdHlBdHRyPigqQSkpCi0gICAgICBQcm9wZXJ0eU1ldGhvZC0+YWRkQXR0cigoKkEpLT5jbG9uZShTLkNvbnRleHQpKTsKKyAgZm9yIChjb25zdCBhdXRvICpBIDogUHJvcGVydHktPmF0dHJzKCkpIHsKKyAgICBpZiAoaXNhPERlcHJlY2F0ZWRBdHRyPihBKSB8fCAKKyAgICAgICAgaXNhPFVuYXZhaWxhYmxlQXR0cj4oQSkgfHwgCisgICAgICAgIGlzYTxBdmFpbGFiaWxpdHlBdHRyPihBKSkKKyAgICAgIFByb3BlcnR5TWV0aG9kLT5hZGRBdHRyKEEtPmNsb25lKFMuQ29udGV4dCkpOwogICB9CiB9CiAKQEAgLTE4NjYsOCArMTkxNCw4IEBACiAgICAgT2JqQ1Byb3BlcnR5RGVjbDo6UHJvcGVydHlBdHRyaWJ1dGVLaW5kIENBdHRyID0KICAgICAgIHByb3BlcnR5LT5nZXRQcm9wZXJ0eUF0dHJpYnV0ZXMoKTsKICAgICBpZiAoKCEoQ0F0dHIgJiBPYmpDUHJvcGVydHlEZWNsOjpPQkpDX1BSX3JlYWRvbmx5KSkgJiYKLSAgICAgICAgQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKFNldHRlck1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpKSAhPQotICAgICAgICAgIENvbnRleHQuVm9pZFR5KQorICAgICAgICBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoU2V0dGVyTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCkpICE9CisgICAgICAgICAgICBDb250ZXh0LlZvaWRUeSkKICAgICAgIERpYWcoU2V0dGVyTWV0aG9kLT5nZXRMb2NhdGlvbigpLCBkaWFnOjplcnJfc2V0dGVyX3R5cGVfdm9pZCk7CiAgICAgaWYgKFNldHRlck1ldGhvZC0+cGFyYW1fc2l6ZSgpICE9IDEgfHwKICAgICAgICAgIUNvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZSgKQEAgLTE5MTMsMTIgKzE5NjEsMTYgQEAKICAgICBpZiAobGV4aWNhbERDKQogICAgICAgR2V0dGVyTWV0aG9kLT5zZXRMZXhpY2FsRGVjbENvbnRleHQobGV4aWNhbERDKTsKICAgICBpZiAocHJvcGVydHktPmhhc0F0dHI8TlNSZXR1cm5zTm90UmV0YWluZWRBdHRyPigpKQotICAgICAgR2V0dGVyTWV0aG9kLT5hZGRBdHRyKAotICAgICAgICA6Om5ldyAoQ29udGV4dCkgTlNSZXR1cm5zTm90UmV0YWluZWRBdHRyKExvYywgQ29udGV4dCkpOworICAgICAgR2V0dGVyTWV0aG9kLT5hZGRBdHRyKE5TUmV0dXJuc05vdFJldGFpbmVkQXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYykpOwogICAgIAogICAgIGlmIChwcm9wZXJ0eS0+aGFzQXR0cjxPYmpDUmV0dXJuc0lubmVyUG9pbnRlckF0dHI+KCkpCiAgICAgICBHZXR0ZXJNZXRob2QtPmFkZEF0dHIoCi0gICAgICAgIDo6bmV3IChDb250ZXh0KSBPYmpDUmV0dXJuc0lubmVyUG9pbnRlckF0dHIoTG9jLCBDb250ZXh0KSk7CisgICAgICAgIE9iakNSZXR1cm5zSW5uZXJQb2ludGVyQXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCwgTG9jKSk7CisgICAgCisgICAgaWYgKGNvbnN0IFNlY3Rpb25BdHRyICpTQSA9IHByb3BlcnR5LT5nZXRBdHRyPFNlY3Rpb25BdHRyPigpKQorICAgICAgR2V0dGVyTWV0aG9kLT5hZGRBdHRyKFNlY3Rpb25BdHRyOjpDcmVhdGVJbXBsaWNpdChDb250ZXh0LCBTQS0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2MpKTsKIAogICAgIGlmIChnZXRMYW5nT3B0cygpLk9iakNBdXRvUmVmQ291bnQpCiAgICAgICBDaGVja0FSQ01ldGhvZERlY2woR2V0dGVyTWV0aG9kKTsKQEAgLTE5NjksNyArMjAyMSw5IEBACiAgICAgICAvLyBhbmQgdGhlIHJlYWwgY29udGV4dCBzaG91bGQgYmUgdGhlIHNhbWUuCiAgICAgICBpZiAobGV4aWNhbERDKQogICAgICAgICBTZXR0ZXJNZXRob2QtPnNldExleGljYWxEZWNsQ29udGV4dChsZXhpY2FsREMpOwotCisgICAgICBpZiAoY29uc3QgU2VjdGlvbkF0dHIgKlNBID0gcHJvcGVydHktPmdldEF0dHI8U2VjdGlvbkF0dHI+KCkpCisgICAgICAgIFNldHRlck1ldGhvZC0+YWRkQXR0cihTZWN0aW9uQXR0cjo6Q3JlYXRlSW1wbGljaXQoQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQS0+Z2V0TmFtZSgpLCBMb2MpKTsKICAgICAgIC8vIEl0J3MgcG9zc2libGUgZm9yIHRoZSB1c2VyIHRvIGhhdmUgc2V0IGEgdmVyeSBvZGQgY3VzdG9tCiAgICAgICAvLyBzZXR0ZXIgc2VsZWN0b3IgdGhhdCBjYXVzZXMgaXQgdG8gaGF2ZSBhIG1ldGhvZCBmYW1pbHkuCiAgICAgICBpZiAoZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50KQpAQCAtMjAyNywyNyArMjA4MSwxOSBAQAogICBRdWFsVHlwZSBQcm9wZXJ0eVR5ID0gUHJvcGVydHlEZWNsLT5nZXRUeXBlKCk7CiAgIHVuc2lnbmVkIFByb3BlcnR5T3duZXJzaGlwID0gZ2V0T3duZXJzaGlwUnVsZShBdHRyaWJ1dGVzKTsKIAotICBpZiAoQXR0cmlidXRlcyAmIE9iakNEZWNsU3BlYzo6RFFfUFJfcmVhZG9ubHkpIHsKLSAgICBpZiAoZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50ICYmCi0gICAgICAgIFByb3BlcnR5VHktPmlzT2JqQ1JldGFpbmFibGVUeXBlKCkgJiYKLSAgICAgICAgIVByb3BlcnR5T3duZXJzaGlwKSB7Ci0gICAgICAvLyAncmVhZG9ubHknIHByb3BlcnR5IHdpdGggbm8gb2J2aW91cyBsaWZldGltZS4KLSAgICAgIC8vIGl0cyBsaWZlIHRpbWUgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IGl0cyBiYWNraW5nIGl2YXIuCi0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKFByb3BlcnR5T3duZXJzaGlwKSB7Ci0gICAgICBpZiAoIWdldFNvdXJjZU1hbmFnZXIoKS5pc0luU3lzdGVtSGVhZGVyKExvYykpCi0gICAgICAgIERpYWcoTG9jLCBkaWFnOjp3YXJuX29iamNfcHJvcGVydHlfYXR0cl9tdXR1YWxseV9leGNsdXNpdmUpCi0gICAgICAgICAgPDwgInJlYWRvbmx5IiA8PCBOYW1lT2ZPd25lcnNoaXBBdHRyaWJ1dGUoQXR0cmlidXRlcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9CisgIC8vICdyZWFkb25seScgcHJvcGVydHkgd2l0aCBubyBvYnZpb3VzIGxpZmV0aW1lLgorICAvLyBpdHMgbGlmZSB0aW1lIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSBpdHMgYmFja2luZyBpdmFyLgorICBpZiAoZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50ICYmCisgICAgICBBdHRyaWJ1dGVzICYgT2JqQ0RlY2xTcGVjOjpEUV9QUl9yZWFkb25seSAmJgorICAgICAgUHJvcGVydHlUeS0+aXNPYmpDUmV0YWluYWJsZVR5cGUoKSAmJgorICAgICAgIVByb3BlcnR5T3duZXJzaGlwKQorICAgIHJldHVybjsKIAogICAvLyBDaGVjayBmb3IgY29weSBvciByZXRhaW4gb24gbm9uLW9iamVjdCB0eXBlcy4KICAgaWYgKChBdHRyaWJ1dGVzICYgKE9iakNEZWNsU3BlYzo6RFFfUFJfd2VhayB8IE9iakNEZWNsU3BlYzo6RFFfUFJfY29weSB8CiAgICAgICAgICAgICAgICAgICAgIE9iakNEZWNsU3BlYzo6RFFfUFJfcmV0YWluIHwgT2JqQ0RlY2xTcGVjOjpEUV9QUl9zdHJvbmcpKSAmJgogICAgICAgIVByb3BlcnR5VHktPmlzT2JqQ1JldGFpbmFibGVUeXBlKCkgJiYKLSAgICAgICFQcm9wZXJ0eURlY2wtPmdldEF0dHI8T2JqQ05TT2JqZWN0QXR0cj4oKSkgeworICAgICAgIVByb3BlcnR5RGVjbC0+aGFzQXR0cjxPYmpDTlNPYmplY3RBdHRyPigpKSB7CiAgICAgRGlhZyhMb2MsIGRpYWc6OmVycl9vYmpjX3Byb3BlcnR5X3JlcXVpcmVzX29iamVjdCkKICAgICAgIDw8IChBdHRyaWJ1dGVzICYgT2JqQ0RlY2xTcGVjOjpEUV9QUl93ZWFrID8gIndlYWsiIDoKICAgICAgICAgICBBdHRyaWJ1dGVzICYgT2JqQ0RlY2xTcGVjOjpEUV9QUl9jb3B5ID8gImNvcHkiIDogInJldGFpbiAob3Igc3Ryb25nKSIpOwpAQCAtMjA3OSw3ICsyMTI1LDcgQEAKICAgICAgICAgPDwgImFzc2lnbiIgPDwgIndlYWsiOwogICAgICAgQXR0cmlidXRlcyAmPSB+T2JqQ0RlY2xTcGVjOjpEUV9QUl93ZWFrOwogICAgIH0KLSAgICBpZiAoUHJvcGVydHlEZWNsLT5nZXRBdHRyPElCT3V0bGV0Q29sbGVjdGlvbkF0dHI+KCkpCisgICAgaWYgKFByb3BlcnR5RGVjbC0+aGFzQXR0cjxJQk91dGxldENvbGxlY3Rpb25BdHRyPigpKQogICAgICAgRGlhZyhMb2MsIGRpYWc6Ondhcm5faWJvdXRsZXRjb2xsZWN0aW9uX3Byb3BlcnR5X2Fzc2lnbik7CiAgIH0gZWxzZSBpZiAoQXR0cmlidXRlcyAmIE9iakNEZWNsU3BlYzo6RFFfUFJfdW5zYWZlX3VucmV0YWluZWQpIHsKICAgICBpZiAoQXR0cmlidXRlcyAmIE9iakNEZWNsU3BlYzo6RFFfUFJfY29weSkgewpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvU2VtYU9wZW5NUC5jcHAgYi9saWIvU2VtYS9TZW1hT3Blbk1QLmNwcAppbmRleCBjNjNjYWY0Li43OGY3M2MwIDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hT3Blbk1QLmNwcAorKysgYi9saWIvU2VtYS9TZW1hT3Blbk1QLmNwcApAQCAtMjEsMTAgKzIxLDEwIEBACiAjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRWaXNpdG9yLmgiCiAjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3Nvci5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvSW5pdGlhbGl6YXRpb24uaCIKLSNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWFJbnRlcm5hbC5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvTG9va3VwLmgiCiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9TY29wZS5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2NvcGVJbmZvLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VtYS9TZW1hSW50ZXJuYWwuaCIKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTgyLDYgKzgyLDkgQEAKICAgdHlwZWRlZiBTbWFsbFZlY3RvcjxTaGFyaW5nTWFwVHksIDg+OjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CiAKICAgRFNBVmFyRGF0YSBnZXREU0EoU3RhY2tUeTo6cmV2ZXJzZV9pdGVyYXRvciBJdGVyLCBWYXJEZWNsICpEKTsKKworICAvLy8gXGJyaWVmIENoZWNrcyBpZiB0aGUgdmFyaWFibGUgaXMgYSBsb2NhbCBmb3IgT3Blbk1QIHJlZ2lvbi4KKyAgYm9vbCBpc09wZW5NUExvY2FsKFZhckRlY2wgKkQsIFN0YWNrVHk6OnJldmVyc2VfaXRlcmF0b3IgSXRlcik7CiBwdWJsaWM6CiAgIGV4cGxpY2l0IERTQVN0YWNrVHkoU2VtYSAmUykgOiBTdGFjaygxKSwgQWN0aW9ucyhTKSB7IH0KIApAQCAtOTgsOSArMTAxLDYgQEAKICAgLy8vIFxicmllZiBBZGRzIGV4cGxpY2l0IGRhdGEgc2hhcmluZyBhdHRyaWJ1dGUgdG8gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbi4KICAgdm9pZCBhZGREU0EoVmFyRGVjbCAqRCwgRGVjbFJlZkV4cHIgKkUsIE9wZW5NUENsYXVzZUtpbmQgQSk7CiAKLSAgLy8vIFxicmllZiBDaGVja3MgaWYgdGhlIHZhcmlhYmxlIGlzIGEgbG9jYWwgZm9yIE9wZW5NUCByZWdpb24uCi0gIGJvb2wgaXNPcGVuTVBMb2NhbChWYXJEZWNsICpEKTsKLQogICAvLy8gXGJyaWVmIFJldHVybnMgZGF0YSBzaGFyaW5nIGF0dHJpYnV0ZXMgZnJvbSB0b3Agb2YgdGhlIHN0YWNrIGZvciB0aGUKICAgLy8vIHNwZWNpZmllZCBkZWNsYXJhdGlvbi4KICAgRFNBVmFyRGF0YSBnZXRUb3BEU0EoVmFyRGVjbCAqRCk7CkBAIC0xMTEsNyArMTExLDYgQEAKICAgRFNBVmFyRGF0YSBoYXNEU0EoVmFyRGVjbCAqRCwgT3Blbk1QQ2xhdXNlS2luZCBDS2luZCwKICAgICAgICAgICAgICAgICAgICAgT3Blbk1QRGlyZWN0aXZlS2luZCBES2luZCA9IE9NUERfdW5rbm93bik7CiAKLQogICAvLy8gXGJyaWVmIFJldHVybnMgY3VycmVudGx5IGFuYWx5emVkIGRpcmVjdGl2ZS4KICAgT3Blbk1QRGlyZWN0aXZlS2luZCBnZXRDdXJyZW50RGlyZWN0aXZlKCkgY29uc3QgewogICAgIHJldHVybiBTdGFjay5iYWNrKCkuRGlyZWN0aXZlOwpAQCAtMTI2LDYgKzEyNSwxMyBAQAogICAgIHJldHVybiBTdGFjay5iYWNrKCkuRGVmYXVsdEF0dHI7CiAgIH0KIAorICAvLy8gXGJyaWVmIENoZWNrcyBpZiB0aGUgc3Bld2NpZmllZCB2YXJpYWJsZSBpcyB0aHJlYWRwcml2YXRlLgorICBib29sIGlzVGhyZWFkUHJpdmF0ZShWYXJEZWNsICpEKSB7CisgICAgRFNBVmFyRGF0YSBEVmFyID0gZ2V0VG9wRFNBKEQpOworICAgIHJldHVybiAoRFZhci5DS2luZCA9PSBPTVBDX3RocmVhZHByaXZhdGUgfHwgRFZhci5DS2luZCA9PSBPTVBDX2NvcHlpbik7CisgIH0KKworICBTY29wZSAqZ2V0Q3VyU2NvcGUoKSBjb25zdCB7IHJldHVybiBTdGFjay5iYWNrKCkuQ3VyU2NvcGU7IH0KICAgU2NvcGUgKmdldEN1clNjb3BlKCkgeyByZXR1cm4gU3RhY2suYmFjaygpLkN1clNjb3BlOyB9CiB9OwogfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZS4KQEAgLTE1Miw3ICsxNTgsMjEgQEAKIAogICAgIHJldHVybiBEVmFyOwogICB9CisKICAgRFZhci5ES2luZCA9IEl0ZXItPkRpcmVjdGl2ZTsKKyAgLy8gT3Blbk1QIFsyLjkuMS4xLCBEYXRhLXNoYXJpbmcgQXR0cmlidXRlIFJ1bGVzIGZvciBWYXJpYWJsZXMgUmVmZXJlbmNlZAorICAvLyBpbiBhIENvbnN0cnVjdCwgQy9DKyssIHByZWRldGVybWluZWQsIHAuMV0KKyAgLy8gVmFyaWFibGVzIHdpdGggYXV0b21hdGljIHN0b3JhZ2UgZHVyYXRpb24gdGhhdCBhcmUgZGVjbGFyZWQgaW4gYSBzY29wZQorICAvLyBpbnNpZGUgdGhlIGNvbnN0cnVjdCBhcmUgcHJpdmF0ZS4KKyAgaWYgKERWYXIuREtpbmQgIT0gT01QRF9wYXJhbGxlbCkgeworICAgIGlmIChpc09wZW5NUExvY2FsKEQsIEl0ZXIpICYmIEQtPmlzTG9jYWxWYXJEZWNsKCkgJiYKKyAgICAgICAgKEQtPmdldFN0b3JhZ2VDbGFzcygpID09IFNDX0F1dG8gfHwKKyAgICAgICAgIEQtPmdldFN0b3JhZ2VDbGFzcygpID09IFNDX05vbmUpKSB7CisgICAgICBEVmFyLkNLaW5kID0gT01QQ19wcml2YXRlOworICAgICAgcmV0dXJuIERWYXI7CisgICAgfQorICB9CisKICAgLy8gRXhwbGljaXRseSBzcGVjaWZpZWQgYXR0cmlidXRlcyBhbmQgbG9jYWwgdmFyaWFibGVzIHdpdGggcHJlZGV0ZXJtaW5lZAogICAvLyBhdHRyaWJ1dGVzLgogICBpZiAoSXRlci0+U2hhcmluZ01hcC5jb3VudChEKSkgewpAQCAtMTg5LDggKzIwOSw4IEBACiAgICAgLy8gVE9ETwogICAgIGlmIChEVmFyLkRLaW5kID09IE9NUERfdGFzaykgewogICAgICAgRFNBVmFyRGF0YSBEVmFyVGVtcDsKLSAgICAgIGZvciAoU3RhY2tUeTo6cmV2ZXJzZV9pdGVyYXRvciBJID0gSXRlciArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUUgPSBTdGFjay5yZW5kKCkgLSAxOworICAgICAgZm9yIChTdGFja1R5OjpyZXZlcnNlX2l0ZXJhdG9yIEkgPSBzdGQ6Om5leHQoSXRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUUgPSBzdGQ6OnByZXYoU3RhY2sucmVuZCgpKTsKICAgICAgICAgICAgSSAhPSBFRTsgKytJKSB7CiAgICAgICAgIC8vIE9wZW5NUCBbMi45LjEuMSwgRGF0YS1zaGFyaW5nIEF0dHJpYnV0ZSBSdWxlcyBmb3IgVmFyaWFibGVzIFJlZmVyZW5jZWQKICAgICAgICAgLy8gaW4gYSBDb25zdHJ1Y3QsIGltcGxpY2l0bHkgZGV0ZXJtaW5lZCwgcC42XQpAQCAtMjE3LDcgKzIzNyw3IEBACiAgIC8vICBGb3IgY29uc3RydWN0cyBvdGhlciB0aGFuIHRhc2ssIGlmIG5vIGRlZmF1bHQgY2xhdXNlIGlzIHByZXNlbnQsIHRoZXNlCiAgIC8vICB2YXJpYWJsZXMgaW5oZXJpdCB0aGVpciBkYXRhLXNoYXJpbmcgYXR0cmlidXRlcyBmcm9tIHRoZSBlbmNsb3NpbmcKICAgLy8gIGNvbnRleHQuCi0gIHJldHVybiBnZXREU0EoSXRlciArIDEsIEQpOworICByZXR1cm4gZ2V0RFNBKHN0ZDo6bmV4dChJdGVyKSwgRCk7CiB9CiAKIHZvaWQgRFNBU3RhY2tUeTo6YWRkRFNBKFZhckRlY2wgKkQsIERlY2xSZWZFeHByICpFLCBPcGVuTVBDbGF1c2VLaW5kIEEpIHsKQEAgLTIzMSwyMyArMjUxLDI0IEBACiAgIH0KIH0KIAotYm9vbCBEU0FTdGFja1R5Ojppc09wZW5NUExvY2FsKFZhckRlY2wgKkQpIHsKLSAgU2NvcGUgKkN1clNjb3BlID0gZ2V0Q3VyU2NvcGUoKTsKLSAgd2hpbGUgKEN1clNjb3BlICYmICFDdXJTY29wZS0+aXNEZWNsU2NvcGUoRCkpCi0gICAgQ3VyU2NvcGUgPSBDdXJTY29wZS0+Z2V0UGFyZW50KCk7Ci0gIHdoaWxlIChDdXJTY29wZSAmJiAhQ3VyU2NvcGUtPmlzT3Blbk1QRGlyZWN0aXZlU2NvcGUoKSkKLSAgICBDdXJTY29wZSA9IEN1clNjb3BlLT5nZXRQYXJlbnQoKTsKLSAgYm9vbCBpc09wZW5NUExvY2FsID0gISFDdXJTY29wZTsKLSAgaWYgKCFpc09wZW5NUExvY2FsKSB7Ci0gICAgQ3VyU2NvcGUgPSBnZXRDdXJTY29wZSgpOwotICAgIHdoaWxlIChDdXJTY29wZSAmJiAhQ3VyU2NvcGUtPmlzT3Blbk1QRGlyZWN0aXZlU2NvcGUoKSkKK2Jvb2wKK0RTQVN0YWNrVHk6OmlzT3Blbk1QTG9jYWwoVmFyRGVjbCAqRCwgU3RhY2tUeTo6cmV2ZXJzZV9pdGVyYXRvciBJdGVyKSB7CisgIGlmIChTdGFjay5zaXplKCkgPiAyKSB7CisgICAgcmV2ZXJzZV9pdGVyYXRvciBJID0gSXRlciwgRSA9IFN0YWNrLnJlbmQoKSAtIDE7CisgICAgU2NvcGUgKlRvcFNjb3BlID0gMDsKKyAgICB3aGlsZSAoSSAhPSBFICYmCisgICAgICAgICAgIEktPkRpcmVjdGl2ZSAhPSBPTVBEX3BhcmFsbGVsKSB7CisgICAgICArK0k7CisgICAgfQorICAgIGlmIChJID09IEUpIHJldHVybiBmYWxzZTsKKyAgICBUb3BTY29wZSA9IEktPkN1clNjb3BlID8gSS0+Q3VyU2NvcGUtPmdldFBhcmVudCgpIDogMDsKKyAgICBTY29wZSAqQ3VyU2NvcGUgPSBnZXRDdXJTY29wZSgpOworICAgIHdoaWxlIChDdXJTY29wZSAhPSBUb3BTY29wZSAmJiAhQ3VyU2NvcGUtPmlzRGVjbFNjb3BlKEQpKSB7CiAgICAgICBDdXJTY29wZSA9IEN1clNjb3BlLT5nZXRQYXJlbnQoKTsKLSAgICBpc09wZW5NUExvY2FsID0KLSAgICAgIEN1clNjb3BlICYmCi0gICAgICBpc2E8Q2FwdHVyZWREZWNsPihELT5nZXREZWNsQ29udGV4dCgpKSAmJgotICAgICAgQ3VyU2NvcGUtPmdldEZuUGFyZW50KCktPmdldEVudGl0eSgpLT5FbmNsb3NlcyhELT5nZXREZWNsQ29udGV4dCgpKTsKKyAgICB9CisgICAgcmV0dXJuIEN1clNjb3BlICE9IFRvcFNjb3BlOwogICB9Ci0gIHJldHVybiBpc09wZW5NUExvY2FsOworICByZXR1cm4gZmFsc2U7CiB9CiAKIERTQVN0YWNrVHk6OkRTQVZhckRhdGEgRFNBU3RhY2tUeTo6Z2V0VG9wRFNBKFZhckRlY2wgKkQpIHsKQEAgLTI3MCwxMSArMjkxLDEzIEBACiAgIC8vIGluIGEgQ29uc3RydWN0LCBDL0MrKywgcHJlZGV0ZXJtaW5lZCwgcC4xXQogICAvLyBWYXJpYWJsZXMgd2l0aCBhdXRvbWF0aWMgc3RvcmFnZSBkdXJhdGlvbiB0aGF0IGFyZSBkZWNsYXJlZCBpbiBhIHNjb3BlCiAgIC8vIGluc2lkZSB0aGUgY29uc3RydWN0IGFyZSBwcml2YXRlLgotICBpZiAoaXNPcGVuTVBMb2NhbChEKSAmJiBELT5pc0xvY2FsVmFyRGVjbCgpICYmCi0gICAgICAoRC0+Z2V0U3RvcmFnZUNsYXNzKCkgPT0gU0NfQXV0byB8fAotICAgICAgIEQtPmdldFN0b3JhZ2VDbGFzcygpID09IFNDX05vbmUpKSB7Ci0gICAgRFZhci5DS2luZCA9IE9NUENfcHJpdmF0ZTsKLSAgICByZXR1cm4gRFZhcjsKKyAgT3Blbk1QRGlyZWN0aXZlS2luZCBLaW5kID0gZ2V0Q3VycmVudERpcmVjdGl2ZSgpOworICBpZiAoS2luZCAhPSBPTVBEX3BhcmFsbGVsKSB7CisgICAgaWYgKGlzT3Blbk1QTG9jYWwoRCwgc3RkOjpuZXh0KFN0YWNrLnJiZWdpbigpKSkgJiYgRC0+aXNMb2NhbFZhckRlY2woKSAmJgorICAgICAgICAoRC0+Z2V0U3RvcmFnZUNsYXNzKCkgPT0gU0NfQXV0byB8fAorICAgICAgICAgRC0+Z2V0U3RvcmFnZUNsYXNzKCkgPT0gU0NfTm9uZSkpCisgICAgICBEVmFyLkNLaW5kID0gT01QQ19wcml2YXRlOworICAgICAgcmV0dXJuIERWYXI7CiAgIH0KIAogICAvLyBPcGVuTVAgWzIuOS4xLjEsIERhdGEtc2hhcmluZyBBdHRyaWJ1dGUgUnVsZXMgZm9yIFZhcmlhYmxlcyBSZWZlcmVuY2VkCkBAIC0zMTksNyArMzQyLDcgQEAKICAgLy8gaW4gYSBDb25zdHJ1Y3QsIEMvQysrLCBwcmVkZXRlcm1pbmVkLCBwLjddCiAgIC8vICBWYXJpYWJsZXMgd2l0aCBzdGF0aWMgc3RvcmFnZSBkdXJhdGlvbiB0aGF0IGFyZSBkZWNsYXJlZCBpbiBhIHNjb3BlCiAgIC8vICBpbnNpZGUgdGhlIGNvbnN0cnVjdCBhcmUgc2hhcmVkLgotICBpZiAoaXNPcGVuTVBMb2NhbChEKSAmJiBELT5pc1N0YXRpY0xvY2FsKCkpIHsKKyAgaWYgKEQtPmlzU3RhdGljTG9jYWwoKSkgewogICAgIERWYXIuQ0tpbmQgPSBPTVBDX3NoYXJlZDsKICAgICByZXR1cm4gRFZhcjsKICAgfQpAQCAtMzM1LDEzICszNTgsMTMgQEAKIH0KIAogRFNBU3RhY2tUeTo6RFNBVmFyRGF0YSBEU0FTdGFja1R5OjpnZXRJbXBsaWNpdERTQShWYXJEZWNsICpEKSB7Ci0gIHJldHVybiBnZXREU0EoU3RhY2sucmJlZ2luKCkgKyAxLCBEKTsKKyAgcmV0dXJuIGdldERTQShzdGQ6Om5leHQoU3RhY2sucmJlZ2luKCkpLCBEKTsKIH0KIAogRFNBU3RhY2tUeTo6RFNBVmFyRGF0YSBEU0FTdGFja1R5OjpoYXNEU0EoVmFyRGVjbCAqRCwgT3Blbk1QQ2xhdXNlS2luZCBDS2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5NUERpcmVjdGl2ZUtpbmQgREtpbmQpIHsKLSAgZm9yIChTdGFja1R5OjpyZXZlcnNlX2l0ZXJhdG9yIEkgPSBTdGFjay5yYmVnaW4oKSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gU3RhY2sucmVuZCgpIC0gMTsKKyAgZm9yIChTdGFja1R5OjpyZXZlcnNlX2l0ZXJhdG9yIEkgPSBzdGQ6Om5leHQoU3RhY2sucmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IHN0ZDo6cHJldihTdGFjay5yZW5kKCkpOwogICAgICAgIEkgIT0gRTsgKytJKSB7CiAgICAgaWYgKERLaW5kICE9IE9NUERfdW5rbm93biAmJiBES2luZCAhPSBJLT5EaXJlY3RpdmUpIGNvbnRpbnVlOwogICAgIERTQVZhckRhdGEgRFZhciA9IGdldERTQShJLCBEKTsKQEAgLTM4MSw3ICs0MDQsNyBAQAogICBTZW1hICZBY3Rpb25zOwogcHVibGljOgogICBWYXJEZWNsRmlsdGVyQ0NDKFNlbWEgJlMpIDogQWN0aW9ucyhTKSB7IH0KLSAgdmlydHVhbCBib29sIFZhbGlkYXRlQ2FuZGlkYXRlKGNvbnN0IFR5cG9Db3JyZWN0aW9uICZDYW5kaWRhdGUpIHsKKyAgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmQ2FuZGlkYXRlKSBvdmVycmlkZSB7CiAgICAgTmFtZWREZWNsICpORCA9IENhbmRpZGF0ZS5nZXRDb3JyZWN0aW9uRGVjbCgpOwogICAgIGlmIChWYXJEZWNsICpWRCA9IGR5bl9jYXN0X29yX251bGw8VmFyRGVjbD4oTkQpKSB7CiAgICAgICByZXR1cm4gVkQtPmhhc0dsb2JhbFN0b3JhZ2UoKSAmJgpAQCAtNTA5LDggKzUzMiw3IEBACiAgIH0KIAogICBRdWFsVHlwZSBFeHByVHlwZSA9IFZELT5nZXRUeXBlKCkuZ2V0Tm9uUmVmZXJlbmNlVHlwZSgpOwotICBFeHByUmVzdWx0IERFID0gQnVpbGREZWNsUmVmRXhwcihWRCwgRXhwclR5cGUsIFZLX1JWYWx1ZSwgSWQuZ2V0TG9jKCkpOwotICBEU0FTdGFjay0+YWRkRFNBKFZELCBjYXN0PERlY2xSZWZFeHByPihERS5nZXQoKSksIE9NUENfdGhyZWFkcHJpdmF0ZSk7CisgIEV4cHJSZXN1bHQgREUgPSBCdWlsZERlY2xSZWZFeHByKFZELCBFeHByVHlwZSwgVktfTFZhbHVlLCBJZC5nZXRMb2MoKSk7CiAgIHJldHVybiBERTsKIH0KIApAQCAtNTY2LDExICs1ODgsMTUgQEAKICAgICB9CiAKICAgICBWYXJzLnB1c2hfYmFjaygqSSk7CisgICAgRFNBU3RhY2stPmFkZERTQShWRCwgREUsIE9NUENfdGhyZWFkcHJpdmF0ZSk7CiAgIH0KLSAgcmV0dXJuIFZhcnMuZW1wdHkoKSA/Ci0gICAgICAgICAgICAgIDAgOiBPTVBUaHJlYWRQcml2YXRlRGVjbDo6Q3JlYXRlKENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1ckxleGljYWxDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYywgVmFycyk7CisgIE9NUFRocmVhZFByaXZhdGVEZWNsICpEID0gMDsKKyAgaWYgKCFWYXJzLmVtcHR5KCkpIHsKKyAgICBEID0gT01QVGhyZWFkUHJpdmF0ZURlY2w6OkNyZWF0ZShDb250ZXh0LCBnZXRDdXJMZXhpY2FsQ29udGV4dCgpLCBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFycyk7CisgICAgRC0+c2V0QWNjZXNzKEFTX3B1YmxpYyk7CisgIH0KKyAgcmV0dXJuIEQ7CiB9CiAKIG5hbWVzcGFjZSB7CkBAIC01OTIsNyArNjE4LDcgQEAKICAgICAgIERTQVN0YWNrVHk6OkRTQVZhckRhdGEgRFZhciA9IFN0YWNrLT5nZXRUb3BEU0EoVkQpOwogICAgICAgaWYgKERWYXIuQ0tpbmQgIT0gT01QQ191bmtub3duKSB7CiAgICAgICAgIGlmIChES2luZCA9PSBPTVBEX3Rhc2sgJiYgRFZhci5DS2luZCAhPSBPTVBDX3NoYXJlZCAmJgotICAgICAgICAgICAgRFZhci5DS2luZCAhPSBPTVBDX3RocmVhZHByaXZhdGUgJiYgIURWYXIuUmVmRXhwcikKKyAgICAgICAgICAgICFTdGFjay0+aXNUaHJlYWRQcml2YXRlKFZEKSAmJiAhRFZhci5SZWZFeHByKQogICAgICAgICAgIEltcGxpY2l0Rmlyc3Rwcml2YXRlLnB1c2hfYmFjayhEVmFyLlJlZkV4cHIpOwogICAgICAgICByZXR1cm47CiAgICAgICB9CkBAIC02ODAsNiArNzA2LDEwIEBACiAgICAgUmVzID0gQWN0T25PcGVuTVBQYXJhbGxlbERpcmVjdGl2ZShDbGF1c2VzV2l0aEltcGxpY2l0LCBBU3RtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBFbmRMb2MpOwogICAgIGJyZWFrOworICBjYXNlIE9NUERfc2ltZDoKKyAgICBSZXMgPSBBY3RPbk9wZW5NUFNpbWREaXJlY3RpdmUoQ2xhdXNlc1dpdGhJbXBsaWNpdCwgQVN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0TG9jLCBFbmRMb2MpOworICAgIGJyZWFrOwogICBjYXNlIE9NUERfdGhyZWFkcHJpdmF0ZToKICAgY2FzZSBPTVBEX3Rhc2s6CiAgICAgbGx2bV91bnJlYWNoYWJsZSgiT3Blbk1QIERpcmVjdGl2ZSBpcyBub3QgYWxsb3dlZCIpOwpAQCAtNzAyLDYgKzczMiwxODUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhdXNlcywgQVN0bXQpKTsKIH0KIAorU3RtdFJlc3VsdCBTZW1hOjpBY3RPbk9wZW5NUFNpbWREaXJlY3RpdmUoQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpBU3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKSB7CisgIFN0bXQgKkNTdG10ID0gQVN0bXQ7CisgIHdoaWxlIChDYXB0dXJlZFN0bXQgKkNTID0gZHluX2Nhc3Rfb3JfbnVsbDxDYXB0dXJlZFN0bXQ+KENTdG10KSkKKyAgICBDU3RtdCA9IENTLT5nZXRDYXB0dXJlZFN0bXQoKTsKKyAgd2hpbGUgKEF0dHJpYnV0ZWRTdG10ICpBUyA9IGR5bl9jYXN0X29yX251bGw8QXR0cmlidXRlZFN0bXQ+KENTdG10KSkKKyAgICBDU3RtdCA9IEFTLT5nZXRTdWJTdG10KCk7CisgIEZvclN0bXQgKkZvciA9IGR5bl9jYXN0PEZvclN0bXQ+KENTdG10KTsKKyAgaWYgKCFGb3IpIHsKKyAgICBEaWFnKENTdG10LT5nZXRMb2NTdGFydCgpLCBkaWFnOjplcnJfb21wX25vdF9mb3IpCisgICAgICA8PCBnZXRPcGVuTVBEaXJlY3RpdmVOYW1lKE9NUERfc2ltZCk7CisgICAgcmV0dXJuIFN0bXRFcnJvcigpOworICB9CisKKyAgLy8gRklYTUU6IENoZWNraW5nIGxvb3AgY2Fub25pY2FsIGZvcm0sIGNvbGxhcHNpbmcgZXRjLgorCisgIGdldEN1ckZ1bmN0aW9uKCktPnNldEhhc0JyYW5jaFByb3RlY3RlZFNjb3BlKCk7CisgIHJldHVybiBPd25lZChPTVBTaW1kRGlyZWN0aXZlOjpDcmVhdGUoQ29udGV4dCwgU3RhcnRMb2MsIEVuZExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGF1c2VzLCBBU3RtdCkpOworfQorCitPTVBDbGF1c2UgKlNlbWE6OkFjdE9uT3Blbk1QU2luZ2xlRXhwckNsYXVzZShPcGVuTVBDbGF1c2VLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByICpFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpIHsKKyAgT01QQ2xhdXNlICpSZXMgPSAwOworICBzd2l0Y2ggKEtpbmQpIHsKKyAgY2FzZSBPTVBDX2lmOgorICAgIFJlcyA9IEFjdE9uT3Blbk1QSWZDbGF1c2UoRXhwciwgU3RhcnRMb2MsIExQYXJlbkxvYywgRW5kTG9jKTsKKyAgICBicmVhazsKKyAgY2FzZSBPTVBDX251bV90aHJlYWRzOgorICAgIFJlcyA9IEFjdE9uT3Blbk1QTnVtVGhyZWFkc0NsYXVzZShFeHByLCBTdGFydExvYywgTFBhcmVuTG9jLCBFbmRMb2MpOworICAgIGJyZWFrOworICBjYXNlIE9NUENfc2FmZWxlbjoKKyAgICBSZXMgPSBBY3RPbk9wZW5NUFNhZmVsZW5DbGF1c2UoRXhwciwgU3RhcnRMb2MsIExQYXJlbkxvYywgRW5kTG9jKTsKKyAgICBicmVhazsKKyAgY2FzZSBPTVBDX2RlZmF1bHQ6CisgIGNhc2UgT01QQ19wcml2YXRlOgorICBjYXNlIE9NUENfZmlyc3Rwcml2YXRlOgorICBjYXNlIE9NUENfc2hhcmVkOgorICBjYXNlIE9NUENfY29weWluOgorICBjYXNlIE9NUENfdGhyZWFkcHJpdmF0ZToKKyAgY2FzZSBPTVBDX3Vua25vd246CisgIGNhc2UgTlVNX09QRU5NUF9DTEFVU0VTOgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkNsYXVzZSBpcyBub3QgYWxsb3dlZC4iKTsKKyAgfQorICByZXR1cm4gUmVzOworfQorCitPTVBDbGF1c2UgKlNlbWE6OkFjdE9uT3Blbk1QSWZDbGF1c2UoRXhwciAqQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpIHsKKyAgRXhwciAqVmFsRXhwciA9IENvbmRpdGlvbjsKKyAgaWYgKCFDb25kaXRpb24tPmlzVmFsdWVEZXBlbmRlbnQoKSAmJiAhQ29uZGl0aW9uLT5pc1R5cGVEZXBlbmRlbnQoKSAmJgorICAgICAgIUNvbmRpdGlvbi0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkgJiYKKyAgICAgICFDb25kaXRpb24tPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSkgeworICAgIEV4cHJSZXN1bHQgVmFsID0gQWN0T25Cb29sZWFuQ29uZGl0aW9uKERTQVN0YWNrLT5nZXRDdXJTY29wZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbi0+Z2V0RXhwckxvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbik7CisgICAgaWYgKFZhbC5pc0ludmFsaWQoKSkKKyAgICAgIHJldHVybiAwOworCisgICAgVmFsRXhwciA9IFZhbC50YWtlKCk7CisgIH0KKworICByZXR1cm4gbmV3IChDb250ZXh0KSBPTVBJZkNsYXVzZShWYWxFeHByLCBTdGFydExvYywgTFBhcmVuTG9jLCBFbmRMb2MpOworfQorCitFeHByUmVzdWx0IFNlbWE6OlBlcmZvcm1JbXBsaWNpdEludGVnZXJDb252ZXJzaW9uKFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqT3ApIHsKKyAgaWYgKCFPcCkKKyAgICByZXR1cm4gRXhwckVycm9yKCk7CisKKyAgY2xhc3MgSW50Q29udmVydERpYWdub3NlciA6IHB1YmxpYyBJQ0VDb252ZXJ0RGlhZ25vc2VyIHsKKyAgcHVibGljOgorICAgIEludENvbnZlcnREaWFnbm9zZXIoKQorICAgICAgICA6IElDRUNvbnZlcnREaWFnbm9zZXIoLypBbGxvd1Njb3BlZEVudW1lcmF0aW9ucyovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSkge30KKyAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VOb3RJbnQoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gUy5EaWFnKExvYywgZGlhZzo6ZXJyX29tcF9ub3RfaW50ZWdyYWwpIDw8IFQ7CisgICAgfQorICAgIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUluY29tcGxldGUoCisgICAgICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIFMuRGlhZyhMb2MsIGRpYWc6OmVycl9vbXBfaW5jb21wbGV0ZV90eXBlKSA8PCBUOworICAgIH0KKyAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VFeHBsaWNpdENvbnYoCisgICAgICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCwgUXVhbFR5cGUgQ29udlR5KSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gUy5EaWFnKExvYywgZGlhZzo6ZXJyX29tcF9leHBsaWNpdF9jb252ZXJzaW9uKSA8PCBUIDw8IENvbnZUeTsKKyAgICB9CisgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIG5vdGVFeHBsaWNpdENvbnYoCisgICAgICAgIFNlbWEgJlMsIENYWENvbnZlcnNpb25EZWNsICpDb252LCBRdWFsVHlwZSBDb252VHkpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBTLkRpYWcoQ29udi0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9vbXBfY29udmVyc2lvbl9oZXJlKQorICAgICAgICAgICAgICAgPDwgQ29udlR5LT5pc0VudW1lcmFsVHlwZSgpIDw8IENvbnZUeTsKKyAgICB9CisgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlQW1iaWd1b3VzKAorICAgICAgICBTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBTLkRpYWcoTG9jLCBkaWFnOjplcnJfb21wX2FtYmlndW91c19jb252ZXJzaW9uKSA8PCBUOworICAgIH0KKyAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgbm90ZUFtYmlndW91cygKKyAgICAgICAgU2VtYSAmUywgQ1hYQ29udmVyc2lvbkRlY2wgKkNvbnYsIFF1YWxUeXBlIENvbnZUeSkgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIFMuRGlhZyhDb252LT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX29tcF9jb252ZXJzaW9uX2hlcmUpCisgICAgICAgICAgICAgICA8PCBDb252VHktPmlzRW51bWVyYWxUeXBlKCkgPDwgQ29udlR5OworICAgIH0KKyAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VDb252ZXJzaW9uKAorICAgICAgICBTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQsIFF1YWxUeXBlIENvbnZUeSkgb3ZlcnJpZGUgeworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiY29udmVyc2lvbiBmdW5jdGlvbnMgYXJlIHBlcm1pdHRlZCIpOworICAgIH0KKyAgfSBDb252ZXJ0RGlhZ25vc2VyOworICByZXR1cm4gUGVyZm9ybUNvbnRleHR1YWxJbXBsaWNpdENvbnZlcnNpb24oTG9jLCBPcCwgQ29udmVydERpYWdub3Nlcik7Cit9CisKK09NUENsYXVzZSAqU2VtYTo6QWN0T25PcGVuTVBOdW1UaHJlYWRzQ2xhdXNlKEV4cHIgKk51bVRocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykgeworICBFeHByICpWYWxFeHByID0gTnVtVGhyZWFkczsKKyAgaWYgKCFOdW1UaHJlYWRzLT5pc1ZhbHVlRGVwZW5kZW50KCkgJiYgIU51bVRocmVhZHMtPmlzVHlwZURlcGVuZGVudCgpICYmCisgICAgICAhTnVtVGhyZWFkcy0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50KCkgJiYKKyAgICAgICFOdW1UaHJlYWRzLT5jb250YWluc1VuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrKCkpIHsKKyAgICBTb3VyY2VMb2NhdGlvbiBOdW1UaHJlYWRzTG9jID0gTnVtVGhyZWFkcy0+Z2V0TG9jU3RhcnQoKTsKKyAgICBFeHByUmVzdWx0IFZhbCA9CisgICAgICAgIFBlcmZvcm1JbXBsaWNpdEludGVnZXJDb252ZXJzaW9uKE51bVRocmVhZHNMb2MsIE51bVRocmVhZHMpOworICAgIGlmIChWYWwuaXNJbnZhbGlkKCkpCisgICAgICByZXR1cm4gMDsKKworICAgIFZhbEV4cHIgPSBWYWwudGFrZSgpOworCisgICAgLy8gT3Blbk1QIFsyLjUsIFJlc3RyaWN0aW9uc10KKyAgICAvLyAgVGhlIG51bV90aHJlYWRzIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUuCisgICAgbGx2bTo6QVBTSW50IFJlc3VsdDsKKyAgICBpZiAoVmFsRXhwci0+aXNJbnRlZ2VyQ29uc3RhbnRFeHByKFJlc3VsdCwgQ29udGV4dCkgJiYKKyAgICAgICAgUmVzdWx0LmlzU2lnbmVkKCkgJiYgIVJlc3VsdC5pc1N0cmljdGx5UG9zaXRpdmUoKSkgeworICAgICAgRGlhZyhOdW1UaHJlYWRzTG9jLCBkaWFnOjplcnJfb21wX25lZ2F0aXZlX2V4cHJlc3Npb25faW5fY2xhdXNlKQorICAgICAgICAgIDw8ICJudW1fdGhyZWFkcyIgPDwgTnVtVGhyZWFkcy0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIHJldHVybiBuZXcgKENvbnRleHQpIE9NUE51bVRocmVhZHNDbGF1c2UoVmFsRXhwciwgU3RhcnRMb2MsIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MpOworfQorCitFeHByUmVzdWx0IFNlbWE6OlZlcmlmeVBvc2l0aXZlSW50ZWdlckNvbnN0YW50SW5DbGF1c2UoRXhwciAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuTVBDbGF1c2VLaW5kIENLaW5kKSB7CisgIGlmICghRSkKKyAgICByZXR1cm4gRXhwckVycm9yKCk7CisgIGlmIChFLT5pc1ZhbHVlRGVwZW5kZW50KCkgfHwgRS0+aXNUeXBlRGVwZW5kZW50KCkgfHwKKyAgICAgIEUtPmlzSW5zdGFudGlhdGlvbkRlcGVuZGVudCgpIHx8IEUtPmNvbnRhaW5zVW5leHBhbmRlZFBhcmFtZXRlclBhY2soKSkKKyAgICByZXR1cm4gT3duZWQoRSk7CisgIGxsdm06OkFQU0ludCBSZXN1bHQ7CisgIEV4cHJSZXN1bHQgSUNFID0gVmVyaWZ5SW50ZWdlckNvbnN0YW50RXhwcmVzc2lvbihFLCAmUmVzdWx0KTsKKyAgaWYgKElDRS5pc0ludmFsaWQoKSkKKyAgICByZXR1cm4gRXhwckVycm9yKCk7CisgIGlmICghUmVzdWx0LmlzU3RyaWN0bHlQb3NpdGl2ZSgpKSB7CisgICAgRGlhZyhFLT5nZXRFeHByTG9jKCksIGRpYWc6OmVycl9vbXBfbmVnYXRpdmVfZXhwcmVzc2lvbl9pbl9jbGF1c2UpCisgICAgICAgIDw8IGdldE9wZW5NUENsYXVzZU5hbWUoQ0tpbmQpIDw8IEUtPmdldFNvdXJjZVJhbmdlKCk7CisgICAgcmV0dXJuIEV4cHJFcnJvcigpOworICB9CisgIHJldHVybiBJQ0U7Cit9CisKK09NUENsYXVzZSAqU2VtYTo6QWN0T25PcGVuTVBTYWZlbGVuQ2xhdXNlKEV4cHIgKkxlbiwgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpIHsKKyAgLy8gT3Blbk1QIFsyLjguMSwgc2ltZCBjb25zdHJ1Y3QsIERlc2NyaXB0aW9uXQorICAvLyBUaGUgcGFyYW1ldGVyIG9mIHRoZSBzYWZlbGVuIGNsYXVzZSBtdXN0IGJlIGEgY29uc3RhbnQKKyAgLy8gcG9zaXRpdmUgaW50ZWdlciBleHByZXNzaW9uLgorICBFeHByUmVzdWx0IFNhZmVsZW4gPSBWZXJpZnlQb3NpdGl2ZUludGVnZXJDb25zdGFudEluQ2xhdXNlKExlbiwgT01QQ19zYWZlbGVuKTsKKyAgaWYgKFNhZmVsZW4uaXNJbnZhbGlkKCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBuZXcgKENvbnRleHQpCisgICAgICBPTVBTYWZlbGVuQ2xhdXNlKFNhZmVsZW4udGFrZSgpLCBTdGFydExvYywgTFBhcmVuTG9jLCBFbmRMb2MpOworfQorCiBPTVBDbGF1c2UgKlNlbWE6OkFjdE9uT3Blbk1QU2ltcGxlQ2xhdXNlKE9wZW5NUENsYXVzZUtpbmQgS2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJndW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEFyZ3VtZW50TG9jLApAQCAtNzE1LDkgKzkyNCwxMyBAQAogICAgICAgQWN0T25PcGVuTVBEZWZhdWx0Q2xhdXNlKHN0YXRpY19jYXN0PE9wZW5NUERlZmF1bHRDbGF1c2VLaW5kPihBcmd1bWVudCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJndW1lbnRMb2MsIFN0YXJ0TG9jLCBMUGFyZW5Mb2MsIEVuZExvYyk7CiAgICAgYnJlYWs7CisgIGNhc2UgT01QQ19pZjoKKyAgY2FzZSBPTVBDX251bV90aHJlYWRzOgorICBjYXNlIE9NUENfc2FmZWxlbjoKICAgY2FzZSBPTVBDX3ByaXZhdGU6CiAgIGNhc2UgT01QQ19maXJzdHByaXZhdGU6CiAgIGNhc2UgT01QQ19zaGFyZWQ6CisgIGNhc2UgT01QQ19jb3B5aW46CiAgIGNhc2UgT01QQ190aHJlYWRwcml2YXRlOgogICBjYXNlIE9NUENfdW5rbm93bjoKICAgY2FzZSBOVU1fT1BFTk1QX0NMQVVTRVM6CkBAIC03MzMsNyArOTQ2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykgewogICBpZiAoS2luZCA9PSBPTVBDX0RFRkFVTFRfdW5rbm93bikgewogICAgIHN0ZDo6c3RyaW5nIFZhbHVlczsKLSAgICBzdGQ6OnN0cmluZyBTZXAoTlVNX09QRU5NUF9ERUZBVUxUX0tJTkRTID4gMSA/ICIsICIgOiAiIik7CisgICAgc3RhdGljX2Fzc2VydChOVU1fT1BFTk1QX0RFRkFVTFRfS0lORFMgPiAxLAorICAgICAgICAgICAgICAgICAgIk5VTV9PUEVOTVBfREVGQVVMVF9LSU5EUyBub3QgZ3JlYXRlciB0aGFuIDEiKTsKKyAgICBzdGQ6OnN0cmluZyBTZXAoIiwgIik7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gT01QQ19ERUZBVUxUX3Vua25vd24gKyAxOwogICAgICAgICAgaSA8IE5VTV9PUEVOTVBfREVGQVVMVF9LSU5EUzsgKytpKSB7CiAgICAgICBWYWx1ZXMgKz0gIiciOwpAQCAtNzYxLDcgKzk3Niw5IEBACiAgIGNhc2UgT01QQ19ERUZBVUxUX3NoYXJlZDoKICAgICBEU0FTdGFjay0+c2V0RGVmYXVsdERTQVNoYXJlZCgpOwogICAgIGJyZWFrOwotICBkZWZhdWx0OgorICBjYXNlIE9NUENfREVGQVVMVF91bmtub3duOgorICBjYXNlIE5VTV9PUEVOTVBfREVGQVVMVF9LSU5EUzoKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDbGF1c2Uga2luZCBpcyBub3QgYWxsb3dlZC4iKTsKICAgICBicmVhazsKICAgfQogICByZXR1cm4gbmV3IChDb250ZXh0KSBPTVBEZWZhdWx0Q2xhdXNlKEtpbmQsIEtpbmRLd0xvYywgU3RhcnRMb2MsIExQYXJlbkxvYywKQEAgLTc4NCw2ICsxMDAxLDEyIEBACiAgIGNhc2UgT01QQ19zaGFyZWQ6CiAgICAgUmVzID0gQWN0T25PcGVuTVBTaGFyZWRDbGF1c2UoVmFyTGlzdCwgU3RhcnRMb2MsIExQYXJlbkxvYywgRW5kTG9jKTsKICAgICBicmVhazsKKyAgY2FzZSBPTVBDX2NvcHlpbjoKKyAgICBSZXMgPSBBY3RPbk9wZW5NUENvcHlpbkNsYXVzZShWYXJMaXN0LCBTdGFydExvYywgTFBhcmVuTG9jLCBFbmRMb2MpOworICAgIGJyZWFrOworICBjYXNlIE9NUENfaWY6CisgIGNhc2UgT01QQ19udW1fdGhyZWFkczoKKyAgY2FzZSBPTVBDX3NhZmVsZW46CiAgIGNhc2UgT01QQ19kZWZhdWx0OgogICBjYXNlIE9NUENfdGhyZWFkcHJpdmF0ZToKICAgY2FzZSBPTVBDX3Vua25vd246CkBAIC0xMTE0LDkgKzEzMzcsMTAgQEAKICAgICBTb3VyY2VMb2NhdGlvbiBFTG9jID0gKCpJKS0+Z2V0RXhwckxvYygpOwogICAgIC8vIE9wZW5NUCBbMi4xLCBDL0MrK10KICAgICAvLyAgQSBsaXN0IGl0ZW0gaXMgYSB2YXJpYWJsZSBuYW1lLgotICAgIC8vIE9wZW5NUCAgWzIuOS4zLjQsIFJlc3RyaWN0aW9ucywgcC4xXQotICAgIC8vICBBIHZhcmlhYmxlIHRoYXQgaXMgcGFydCBvZiBhbm90aGVyIHZhcmlhYmxlIChhcyBhbiBhcnJheSBvcgotICAgIC8vICBzdHJ1Y3R1cmUgZWxlbWVudCkgY2Fubm90IGFwcGVhciBpbiBhIHByaXZhdGUgY2xhdXNlLgorICAgIC8vIE9wZW5NUCAgWzIuMTQuMy4yLCBSZXN0cmljdGlvbnMsIHAuMV0KKyAgICAvLyAgQSB2YXJpYWJsZSB0aGF0IGlzIHBhcnQgb2YgYW5vdGhlciB2YXJpYWJsZSAoYXMgYW4gYXJyYXkgb3Igc3RydWN0dXJlCisgICAgLy8gIGVsZW1lbnQpIGNhbm5vdCBhcHBlYXIgaW4gYSBzaGFyZWQgdW5sZXNzIGl0IGlzIGEgc3RhdGljIGRhdGEgbWVtYmVyCisgICAgLy8gIG9mIGEgQysrIGNsYXNzLgogICAgIERlY2xSZWZFeHByICpERSA9IGR5bl9jYXN0PERlY2xSZWZFeHByPigqSSk7CiAgICAgaWYgKCFERSB8fCAhaXNhPFZhckRlY2w+KERFLT5nZXREZWNsKCkpKSB7CiAgICAgICBEaWFnKEVMb2MsIGRpYWc6OmVycl9vbXBfZXhwZWN0ZWRfdmFyX25hbWUpCkBAIC0xMTU5LDQgKzEzODMsODQgQEAKICAgcmV0dXJuIE9NUFNoYXJlZENsYXVzZTo6Q3JlYXRlKENvbnRleHQsIFN0YXJ0TG9jLCBMUGFyZW5Mb2MsIEVuZExvYywgVmFycyk7CiB9CiAKK09NUENsYXVzZSAqU2VtYTo6QWN0T25PcGVuTVBDb3B5aW5DbGF1c2UoQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpIHsKKyAgU21hbGxWZWN0b3I8RXhwciAqLCA4PiBWYXJzOworICBmb3IgKEFycmF5UmVmPEV4cHIgKj46Oml0ZXJhdG9yIEkgPSBWYXJMaXN0LmJlZ2luKCksIEUgPSBWYXJMaXN0LmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgYXNzZXJ0KCpJICYmICJOVUxMIGV4cHIgaW4gT3Blbk1QIGNvcHlpbiBjbGF1c2UuIik7CisgICAgaWYgKGlzYTxEZXBlbmRlbnRTY29wZURlY2xSZWZFeHByPigqSSkpIHsKKyAgICAgIC8vIEl0IHdpbGwgYmUgYW5hbHl6ZWQgbGF0ZXIuCisgICAgICBWYXJzLnB1c2hfYmFjaygqSSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBTb3VyY2VMb2NhdGlvbiBFTG9jID0gKCpJKS0+Z2V0RXhwckxvYygpOworICAgIC8vIE9wZW5NUCBbMi4xLCBDL0MrK10KKyAgICAvLyAgQSBsaXN0IGl0ZW0gaXMgYSB2YXJpYWJsZSBuYW1lLgorICAgIC8vIE9wZW5NUCAgWzIuMTQuNC4xLCBSZXN0cmljdGlvbnMsIHAuMV0KKyAgICAvLyAgQSBsaXN0IGl0ZW0gdGhhdCBhcHBlYXJzIGluIGEgY29weWluIGNsYXVzZSBtdXN0IGJlIHRocmVhZHByaXZhdGUuCisgICAgRGVjbFJlZkV4cHIgKkRFID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KCpJKTsKKyAgICBpZiAoIURFIHx8ICFpc2E8VmFyRGVjbD4oREUtPmdldERlY2woKSkpIHsKKyAgICAgIERpYWcoRUxvYywgZGlhZzo6ZXJyX29tcF9leHBlY3RlZF92YXJfbmFtZSkKKyAgICAgICAgPDwgKCpJKS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIERlY2wgKkQgPSBERS0+Z2V0RGVjbCgpOworICAgIFZhckRlY2wgKlZEID0gY2FzdDxWYXJEZWNsPihEKTsKKworICAgIFF1YWxUeXBlIFR5cGUgPSBWRC0+Z2V0VHlwZSgpOworICAgIGlmIChUeXBlLT5pc0RlcGVuZGVudFR5cGUoKSB8fCBUeXBlLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnRUeXBlKCkpIHsKKyAgICAgIC8vIEl0IHdpbGwgYmUgYW5hbHl6ZWQgbGF0ZXIuCisgICAgICBWYXJzLnB1c2hfYmFjayhERSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBPcGVuTVAgWzIuMTQuNC4xLCBSZXN0cmljdGlvbnMsIEMvQysrLCBwLjFdCisgICAgLy8gIEEgbGlzdCBpdGVtIHRoYXQgYXBwZWFycyBpbiBhIGNvcHlpbiBjbGF1c2UgbXVzdCBiZSB0aHJlYWRwcml2YXRlLgorICAgIGlmICghRFNBU3RhY2stPmlzVGhyZWFkUHJpdmF0ZShWRCkpIHsKKyAgICAgIERpYWcoRUxvYywgZGlhZzo6ZXJyX29tcF9yZXF1aXJlZF9hY2Nlc3MpCisgICAgICAgICAgIDw8IGdldE9wZW5NUENsYXVzZU5hbWUoT01QQ19jb3B5aW4pCisgICAgICAgICAgIDw8IGdldE9wZW5NUERpcmVjdGl2ZU5hbWUoT01QRF90aHJlYWRwcml2YXRlKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIE9wZW5NUCBbMi4xNC40LjEsIFJlc3RyaWN0aW9ucywgQy9DKyssIHAuMl0KKyAgICAvLyAgQSB2YXJpYWJsZSBvZiBjbGFzcyB0eXBlIChvciBhcnJheSB0aGVyZW9mKSB0aGF0IGFwcGVhcnMgaW4gYQorICAgIC8vICBjb3B5aW4gY2xhdXNlIHJlcXVpcmVzIGFuIGFjY2VzaWJsZSwgdW5hbWJpZ3VvdXMgY29weSBhc3NpZ25tZW50CisgICAgLy8gIG9wZXJhdG9yIGZvciB0aGUgY2xhc3MgdHlwZS4KKyAgICBUeXBlID0gQ29udGV4dC5nZXRCYXNlRWxlbWVudFR5cGUoVHlwZSk7CisgICAgQ1hYUmVjb3JkRGVjbCAqUkQgPSBnZXRMYW5nT3B0cygpLkNQbHVzUGx1cyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUtPmdldEFzQ1hYUmVjb3JkRGVjbCgpIDogMDsKKyAgICBpZiAoUkQpIHsKKyAgICAgIENYWE1ldGhvZERlY2wgKk1EID0gTG9va3VwQ29weWluZ0Fzc2lnbm1lbnQoUkQsIDAsIGZhbHNlLCAwKTsKKyAgICAgIERlY2xBY2Nlc3NQYWlyIEZvdW5kRGVjbCA9IERlY2xBY2Nlc3NQYWlyOjptYWtlKE1ELCBNRC0+Z2V0QWNjZXNzKCkpOworICAgICAgaWYgKCFNRCB8fAorICAgICAgICAgIENoZWNrTWVtYmVyQWNjZXNzKEVMb2MsIFJELCBGb3VuZERlY2wpID09IEFSX2luYWNjZXNzaWJsZSB8fAorICAgICAgICAgIE1ELT5pc0RlbGV0ZWQoKSkgeworICAgICAgICBEaWFnKEVMb2MsIGRpYWc6OmVycl9vbXBfcmVxdWlyZWRfbWV0aG9kKQorICAgICAgICAgICAgIDw8IGdldE9wZW5NUENsYXVzZU5hbWUoT01QQ19jb3B5aW4pIDw8IDI7CisgICAgICAgIGJvb2wgSXNEZWNsID0gVkQtPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oQ29udGV4dCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICBWYXJEZWNsOjpEZWNsYXJhdGlvbk9ubHk7CisgICAgICAgIERpYWcoVkQtPmdldExvY2F0aW9uKCksIElzRGVjbCA/IGRpYWc6Om5vdGVfcHJldmlvdXNfZGVjbCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6Om5vdGVfZGVmaW5lZF9oZXJlKSA8PCBWRDsKKyAgICAgICAgRGlhZyhSRC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcmV2aW91c19kZWNsKSA8PCBSRDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBNYXJrRnVuY3Rpb25SZWZlcmVuY2VkKEVMb2MsIE1EKTsKKyAgICAgIERpYWdub3NlVXNlT2ZEZWNsKE1ELCBFTG9jKTsKKyAgICB9CisKKyAgICBEU0FTdGFjay0+YWRkRFNBKFZELCBERSwgT01QQ19jb3B5aW4pOworICAgIFZhcnMucHVzaF9iYWNrKERFKTsKKyAgfQorCisgIGlmIChWYXJzLmVtcHR5KCkpIHJldHVybiAwOworCisgIHJldHVybiBPTVBDb3B5aW5DbGF1c2U6OkNyZWF0ZShDb250ZXh0LCBTdGFydExvYywgTFBhcmVuTG9jLCBFbmRMb2MsIFZhcnMpOworfQorCiAjdW5kZWYgRFNBU3RhY2sKZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1NlbWFPdmVybG9hZC5jcHAgYi9saWIvU2VtYS9TZW1hT3ZlcmxvYWQuY3BwCmluZGV4IDgwMmYyYjcuLmVlMWZlYjUgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL1NlbWFPdmVybG9hZC5jcHAKKysrIGIvbGliL1NlbWEvU2VtYU92ZXJsb2FkLmNwcApAQCAtOTMwLDI0ICs5MzAsMTUgQEAKICAgICAgIChPbGRJc1VzaW5nRGVjbCB8fCBOZXdJc1VzaW5nRGVjbCkgJiYgQ3VyQ29udGV4dC0+aXNSZWNvcmQoKSAmJgogICAgICAgIU5ldy0+Z2V0RnJpZW5kT2JqZWN0S2luZCgpOwogCi0gICAgaWYgKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpPbGRUID0gZHluX2Nhc3Q8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KE9sZEQpKSB7Ci0gICAgICBpZiAoIUlzT3ZlcmxvYWQoTmV3LCBPbGRULT5nZXRUZW1wbGF0ZWREZWNsKCksIFVzZU1lbWJlclVzaW5nRGVjbFJ1bGVzKSkgewotICAgICAgICBpZiAoVXNlTWVtYmVyVXNpbmdEZWNsUnVsZXMgJiYgT2xkSXNVc2luZ0RlY2wpIHsKLSAgICAgICAgICBIaWRlVXNpbmdTaGFkb3dEZWNsKFMsIGNhc3Q8VXNpbmdTaGFkb3dEZWNsPigqSSkpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgTWF0Y2ggPSAqSTsKLSAgICAgICAgcmV0dXJuIE92bF9NYXRjaDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKEZ1bmN0aW9uRGVjbCAqT2xkRiA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oT2xkRCkpIHsKKyAgICBpZiAoRnVuY3Rpb25EZWNsICpPbGRGID0gT2xkRC0+Z2V0QXNGdW5jdGlvbigpKSB7CiAgICAgICBpZiAoIUlzT3ZlcmxvYWQoTmV3LCBPbGRGLCBVc2VNZW1iZXJVc2luZ0RlY2xSdWxlcykpIHsKICAgICAgICAgaWYgKFVzZU1lbWJlclVzaW5nRGVjbFJ1bGVzICYmIE9sZElzVXNpbmdEZWNsKSB7CiAgICAgICAgICAgSGlkZVVzaW5nU2hhZG93RGVjbChTLCBjYXN0PFVzaW5nU2hhZG93RGVjbD4oKkkpKTsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghc2hvdWxkTGlua1Bvc3NpYmx5SGlkZGVuRGVjbCgqSSwgTmV3KSkKKyAgICAgICAgaWYgKCFpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KE9sZEQpICYmCisgICAgICAgICAgICAhc2hvdWxkTGlua1Bvc3NpYmx5SGlkZGVuRGVjbCgqSSwgTmV3KSkKICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBNYXRjaCA9ICpJOwpAQCAtMTAwOCwxNiArOTk5LDE2IEBACiAgICAgICBpc2E8RnVuY3Rpb25Ob1Byb3RvVHlwZT4oTmV3UVR5cGUuZ2V0VHlwZVB0cigpKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUqIE9sZFR5cGUgPSBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihPbGRRVHlwZSk7Ci0gIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlKiBOZXdUeXBlID0gY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oTmV3UVR5cGUpOworICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqT2xkVHlwZSA9IGNhc3Q8RnVuY3Rpb25Qcm90b1R5cGU+KE9sZFFUeXBlKTsKKyAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKk5ld1R5cGUgPSBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihOZXdRVHlwZSk7CiAKICAgLy8gVGhlIHNpZ25hdHVyZSBvZiBhIGZ1bmN0aW9uIGluY2x1ZGVzIHRoZSB0eXBlcyBvZiBpdHMKICAgLy8gcGFyYW1ldGVycyAoQysrIDEuMy4xMCksIHdoaWNoIGluY2x1ZGVzIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlCiAgIC8vIG9mIHRoZSBlbGxpcHNpczsgc2VlIEMrKyBEUiAzNTcpLgogICBpZiAoT2xkUVR5cGUgIT0gTmV3UVR5cGUgJiYKLSAgICAgIChPbGRUeXBlLT5nZXROdW1BcmdzKCkgIT0gTmV3VHlwZS0+Z2V0TnVtQXJncygpIHx8CisgICAgICAoT2xkVHlwZS0+Z2V0TnVtUGFyYW1zKCkgIT0gTmV3VHlwZS0+Z2V0TnVtUGFyYW1zKCkgfHwKICAgICAgICBPbGRUeXBlLT5pc1ZhcmlhZGljKCkgIT0gTmV3VHlwZS0+aXNWYXJpYWRpYygpIHx8Ci0gICAgICAgIUZ1bmN0aW9uQXJnVHlwZXNBcmVFcXVhbChPbGRUeXBlLCBOZXdUeXBlKSkpCisgICAgICAgIUZ1bmN0aW9uUGFyYW1UeXBlc0FyZUVxdWFsKE9sZFR5cGUsIE5ld1R5cGUpKSkKICAgICByZXR1cm4gdHJ1ZTsKIAogICAvLyBDKysgW3RlbXAub3Zlci5saW5rXXA0OgpAQCAtMTAzNiw3ICsxMDI3LDcgQEAKICAgICAgICghVGVtcGxhdGVQYXJhbWV0ZXJMaXN0c0FyZUVxdWFsKE5ld1RlbXBsYXRlLT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9sZFRlbXBsYXRlLT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBUUExfVGVtcGxhdGVNYXRjaCkgfHwKLSAgICAgICBPbGRUeXBlLT5nZXRSZXN1bHRUeXBlKCkgIT0gTmV3VHlwZS0+Z2V0UmVzdWx0VHlwZSgpKSkKKyAgICAgICBPbGRUeXBlLT5nZXRSZXR1cm5UeXBlKCkgIT0gTmV3VHlwZS0+Z2V0UmV0dXJuVHlwZSgpKSkKICAgICByZXR1cm4gdHJ1ZTsKIAogICAvLyBJZiB0aGUgZnVuY3Rpb24gaXMgYSBjbGFzcyBtZW1iZXIsIGl0cyBzaWduYXR1cmUgaW5jbHVkZXMgdGhlCkBAIC0xMDg1LDYgKzEwNzYsMjIgQEAKICAgICAgIHJldHVybiB0cnVlOwogICB9CiAKKyAgLy8gZW5hYmxlX2lmIGF0dHJpYnV0ZXMgYXJlIGFuIG9yZGVyLXNlbnNpdGl2ZSBwYXJ0IG9mIHRoZSBzaWduYXR1cmUuCisgIGZvciAoc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxFbmFibGVJZkF0dHI+CisgICAgICAgICBOZXdJID0gTmV3LT5zcGVjaWZpY19hdHRyX2JlZ2luPEVuYWJsZUlmQXR0cj4oKSwKKyAgICAgICAgIE5ld0UgPSBOZXctPnNwZWNpZmljX2F0dHJfZW5kPEVuYWJsZUlmQXR0cj4oKSwKKyAgICAgICAgIE9sZEkgPSBPbGQtPnNwZWNpZmljX2F0dHJfYmVnaW48RW5hYmxlSWZBdHRyPigpLAorICAgICAgICAgT2xkRSA9IE9sZC0+c3BlY2lmaWNfYXR0cl9lbmQ8RW5hYmxlSWZBdHRyPigpOworICAgICAgIE5ld0kgIT0gTmV3RSB8fCBPbGRJICE9IE9sZEU7ICsrTmV3SSwgKytPbGRJKSB7CisgICAgaWYgKE5ld0kgPT0gTmV3RSB8fCBPbGRJID09IE9sZEUpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEIE5ld0lELCBPbGRJRDsKKyAgICBOZXdJLT5nZXRDb25kKCktPlByb2ZpbGUoTmV3SUQsIENvbnRleHQsIHRydWUpOworICAgIE9sZEktPmdldENvbmQoKS0+UHJvZmlsZShPbGRJRCwgQ29udGV4dCwgdHJ1ZSk7CisgICAgaWYgKE5ld0lEICE9IE9sZElEKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKwogICAvLyBUaGUgc2lnbmF0dXJlcyBtYXRjaDsgdGhpcyBpcyBub3QgYW4gb3ZlcmxvYWQuCiAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTExMjcsNiArMTEzNCw3IEBACiAKICAgaWYgKFVzZXJEZWZSZXN1bHQgPT0gT1JfU3VjY2VzcykgewogICAgIElDUy5zZXRVc2VyRGVmaW5lZCgpOworICAgIElDUy5Vc2VyRGVmaW5lZC5CZWZvcmUuc2V0QXNJZGVudGl0eUNvbnZlcnNpb24oKTsKICAgICAvLyBDKysgW292ZXIuaWNzLnVzZXJdcDQ6CiAgICAgLy8gICBBIGNvbnZlcnNpb24gb2YgYW4gZXhwcmVzc2lvbiBvZiBjbGFzcyB0eXBlIHRvIHRoZSBzYW1lIGNsYXNzCiAgICAgLy8gICB0eXBlIGlzIGdpdmVuIEV4YWN0IE1hdGNoIHJhbmssIGFuZCBhIGNvbnZlcnNpb24gb2YgYW4KQEAgLTEyOTgsNyArMTMwNiw5IEBACiAgIGJvb2wgQWxsb3dPYmpDV3JpdGViYWNrQ29udmVyc2lvbgogICAgID0gZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50ICYmIAogICAgICAgKEFjdGlvbiA9PSBBQV9QYXNzaW5nIHx8IEFjdGlvbiA9PSBBQV9TZW5kaW5nKTsKLQorICBpZiAoZ2V0TGFuZ09wdHMoKS5PYmpDMSkKKyAgICBDaGVja09iakNCcmlkZ2VSZWxhdGVkQ29udmVyc2lvbnMoRnJvbS0+Z2V0TG9jU3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9UeXBlLCBGcm9tLT5nZXRUeXBlKCksIEZyb20pOwogICBJQ1MgPSBjbGFuZzo6VHJ5SW1wbGljaXRDb252ZXJzaW9uKCp0aGlzLCBGcm9tLCBUb1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypTdXBwcmVzc1VzZXJDb252ZXJzaW9ucz0qL2ZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93RXhwbGljaXQsCkBAIC0xMzYyLDcgKzEzNzIsNyBAQAogLy8vCiAvLy8gXHBhcmFtIElDSyBXaWxsIGJlIHNldCB0byB0aGUgdmVjdG9yIGNvbnZlcnNpb24ga2luZCwgaWYgdGhpcyBpcyBhIHZlY3RvcgogLy8vIGNvbnZlcnNpb24uCi1zdGF0aWMgYm9vbCBJc1ZlY3RvckNvbnZlcnNpb24oQVNUQ29udGV4dCAmQ29udGV4dCwgUXVhbFR5cGUgRnJvbVR5cGUsCitzdGF0aWMgYm9vbCBJc1ZlY3RvckNvbnZlcnNpb24oU2VtYSAmUywgUXVhbFR5cGUgRnJvbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVG9UeXBlLCBJbXBsaWNpdENvbnZlcnNpb25LaW5kICZJQ0spIHsKICAgLy8gV2UgbmVlZCBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgdHlwZXMgdG8gYmUgYSB2ZWN0b3IgdHlwZSB0byBoYXZlIGEgdmVjdG9yCiAgIC8vIGNvbnZlcnNpb24uCkBAIC0xMzcwLDcgKzEzODAsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIAogICAvLyBJZGVudGljYWwgdHlwZXMgcmVxdWlyZSBubyBjb252ZXJzaW9ucy4KLSAgaWYgKENvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShGcm9tVHlwZSwgVG9UeXBlKSkKKyAgaWYgKFMuQ29udGV4dC5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKEZyb21UeXBlLCBUb1R5cGUpKQogICAgIHJldHVybiBmYWxzZTsKIAogICAvLyBUaGVyZSBhcmUgbm8gY29udmVyc2lvbnMgYmV0d2VlbiBleHRlbmRlZCB2ZWN0b3IgdHlwZXMsIG9ubHkgaWRlbnRpdHkuCkBAIC0xMzkyLDkgKzE0MDIsOCBAQAogICAvLyAyKWxheCB2ZWN0b3IgY29udmVyc2lvbnMgYXJlIHBlcm1pdHRlZCBhbmQgdGhlIHZlY3RvciB0eXBlcyBhcmUgb2YgdGhlCiAgIC8vICAgc2FtZSBzaXplCiAgIGlmIChUb1R5cGUtPmlzVmVjdG9yVHlwZSgpICYmIEZyb21UeXBlLT5pc1ZlY3RvclR5cGUoKSkgewotICAgIGlmIChDb250ZXh0LmFyZUNvbXBhdGlibGVWZWN0b3JUeXBlcyhGcm9tVHlwZSwgVG9UeXBlKSB8fAotICAgICAgICAoQ29udGV4dC5nZXRMYW5nT3B0cygpLkxheFZlY3RvckNvbnZlcnNpb25zICYmCi0gICAgICAgICAoQ29udGV4dC5nZXRUeXBlU2l6ZShGcm9tVHlwZSkgPT0gQ29udGV4dC5nZXRUeXBlU2l6ZShUb1R5cGUpKSkpIHsKKyAgICBpZiAoUy5Db250ZXh0LmFyZUNvbXBhdGlibGVWZWN0b3JUeXBlcyhGcm9tVHlwZSwgVG9UeXBlKSB8fAorICAgICAgICBTLmlzTGF4VmVjdG9yQ29udmVyc2lvbihGcm9tVHlwZSwgVG9UeXBlKSkgewogICAgICAgSUNLID0gSUNLX1ZlY3Rvcl9Db252ZXJzaW9uOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMTQyNSw3ICsxNDM0LDYgQEAKIAogICAvLyBTdGFuZGFyZCBjb252ZXJzaW9ucyAoQysrIFtjb252XSkKICAgU0NTLnNldEFzSWRlbnRpdHlDb252ZXJzaW9uKCk7Ci0gIFNDUy5EZXByZWNhdGVkU3RyaW5nTGl0ZXJhbFRvQ2hhclB0ciA9IGZhbHNlOwogICBTQ1MuSW5jb21wYXRpYmxlT2JqQyA9IGZhbHNlOwogICBTQ1Muc2V0RnJvbVR5cGUoRnJvbVR5cGUpOwogICBTQ1MuQ29weUNvbnN0cnVjdG9yID0gMDsKQEAgLTE1MjQsNyArMTUzMiw3IEBACiAgICAgRnJvbVR5cGUgPSBTLkNvbnRleHQuZ2V0QXJyYXlEZWNheWVkVHlwZShGcm9tVHlwZSk7CiAKICAgICBpZiAoUy5Jc1N0cmluZ0xpdGVyYWxUb05vbkNvbnN0UG9pbnRlckNvbnZlcnNpb24oRnJvbSwgVG9UeXBlKSkgewotICAgICAgLy8gVGhpcyBjb252ZXJzaW9uIGlzIGRlcHJlY2F0ZWQuIChDKysgRC40KS4KKyAgICAgIC8vIFRoaXMgY29udmVyc2lvbiBpcyBkZXByZWNhdGVkIGluIEMrKzAzIChELjQpCiAgICAgICBTQ1MuRGVwcmVjYXRlZFN0cmluZ0xpdGVyYWxUb0NoYXJQdHIgPSB0cnVlOwogCiAgICAgICAvLyBGb3IgdGhlIHB1cnBvc2Ugb2YgcmFua2luZyBpbiBvdmVybG9hZCByZXNvbHV0aW9uCkBAIC0xNjI0LDcgKzE2MzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbk92ZXJsb2FkUmVzb2x1dGlvbiwgRnJvbVR5cGUpKSB7CiAgICAgLy8gUG9pbnRlciB0byBtZW1iZXIgY29udmVyc2lvbnMgKDQuMTEpLgogICAgIFNDUy5TZWNvbmQgPSBJQ0tfUG9pbnRlcl9NZW1iZXI7Ci0gIH0gZWxzZSBpZiAoSXNWZWN0b3JDb252ZXJzaW9uKFMuQ29udGV4dCwgRnJvbVR5cGUsIFRvVHlwZSwgU2Vjb25kSUNLKSkgeworICB9IGVsc2UgaWYgKElzVmVjdG9yQ29udmVyc2lvbihTLCBGcm9tVHlwZSwgVG9UeXBlLCBTZWNvbmRJQ0spKSB7CiAgICAgU0NTLlNlY29uZCA9IFNlY29uZElDSzsKICAgICBGcm9tVHlwZSA9IFRvVHlwZS5nZXRVbnF1YWxpZmllZFR5cGUoKTsKICAgfSBlbHNlIGlmICghUy5nZXRMYW5nT3B0cygpLkNQbHVzUGx1cyAmJgpAQCAtMTcwNyw5ICsxNzE1LDcgQEAKICAgLy8gVGhlIGZpZWxkIHRvIGluaXRpYWxpemUgd2l0aGluIHRoZSB0cmFuc3BhcmVudCB1bmlvbi4KICAgUmVjb3JkRGVjbCAqVUQgPSBVVC0+Z2V0RGVjbCgpOwogICAvLyBJdCdzIGNvbXBhdGlibGUgaWYgdGhlIGV4cHJlc3Npb24gbWF0Y2hlcyBhbnkgb2YgdGhlIGZpZWxkcy4KLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBpdCA9IFVELT5maWVsZF9iZWdpbigpLAotICAgICAgIGl0ZW5kID0gVUQtPmZpZWxkX2VuZCgpOwotICAgICAgIGl0ICE9IGl0ZW5kOyArK2l0KSB7CisgIGZvciAoY29uc3QgYXV0byAqaXQgOiBVRC0+ZmllbGRzKCkpIHsKICAgICBpZiAoSXNTdGFuZGFyZENvbnZlcnNpb24oUywgRnJvbSwgaXQtPmdldFR5cGUoKSwgSW5PdmVybG9hZFJlc29sdXRpb24sIFNDUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1N0eWxlLCAvKk9iakNXcml0ZWJhY2tDb252ZXJzaW9uPSovZmFsc2UpKSB7CiAgICAgICBUb1R5cGUgPSBpdC0+Z2V0VHlwZSgpOwpAQCAtMjI4OCwxNyArMjI5NCwxNyBAQAogCiAgICAgLy8gUGVyZm9ybSB0aGUgcXVpY2sgY2hlY2tzIHRoYXQgd2lsbCB0ZWxsIHVzIHdoZXRoZXIgdGhlc2UKICAgICAvLyBmdW5jdGlvbiB0eXBlcyBhcmUgb2J2aW91c2x5IGRpZmZlcmVudC4KLSAgICBpZiAoRnJvbUZ1bmN0aW9uVHlwZS0+Z2V0TnVtQXJncygpICE9IFRvRnVuY3Rpb25UeXBlLT5nZXROdW1BcmdzKCkgfHwKKyAgICBpZiAoRnJvbUZ1bmN0aW9uVHlwZS0+Z2V0TnVtUGFyYW1zKCkgIT0gVG9GdW5jdGlvblR5cGUtPmdldE51bVBhcmFtcygpIHx8CiAgICAgICAgIEZyb21GdW5jdGlvblR5cGUtPmlzVmFyaWFkaWMoKSAhPSBUb0Z1bmN0aW9uVHlwZS0+aXNWYXJpYWRpYygpIHx8CiAgICAgICAgIEZyb21GdW5jdGlvblR5cGUtPmdldFR5cGVRdWFscygpICE9IFRvRnVuY3Rpb25UeXBlLT5nZXRUeXBlUXVhbHMoKSkKICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGJvb2wgSGFzT2JqQ0NvbnZlcnNpb24gPSBmYWxzZTsKLSAgICBpZiAoQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKEZyb21GdW5jdGlvblR5cGUtPmdldFJlc3VsdFR5cGUoKSkKLSAgICAgICAgICA9PSBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoVG9GdW5jdGlvblR5cGUtPmdldFJlc3VsdFR5cGUoKSkpIHsKKyAgICBpZiAoQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKEZyb21GdW5jdGlvblR5cGUtPmdldFJldHVyblR5cGUoKSkgPT0KKyAgICAgICAgQ29udGV4dC5nZXRDYW5vbmljYWxUeXBlKFRvRnVuY3Rpb25UeXBlLT5nZXRSZXR1cm5UeXBlKCkpKSB7CiAgICAgICAvLyBPa2F5LCB0aGUgdHlwZXMgbWF0Y2ggZXhhY3RseS4gTm90aGluZyB0byBkby4KLSAgICB9IGVsc2UgaWYgKGlzT2JqQ1BvaW50ZXJDb252ZXJzaW9uKEZyb21GdW5jdGlvblR5cGUtPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvRnVuY3Rpb25UeXBlLT5nZXRSZXN1bHRUeXBlKCksCisgICAgfSBlbHNlIGlmIChpc09iakNQb2ludGVyQ29udmVyc2lvbihGcm9tRnVuY3Rpb25UeXBlLT5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb0Z1bmN0aW9uVHlwZS0+Z2V0UmV0dXJuVHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGVkVHlwZSwgSW5jb21wYXRpYmxlT2JqQykpIHsKICAgICAgIC8vIE9rYXksIHdlIGhhdmUgYW4gT2JqZWN0aXZlLUMgcG9pbnRlciBjb252ZXJzaW9uLgogICAgICAgSGFzT2JqQ0NvbnZlcnNpb24gPSB0cnVlOwpAQCAtMjMwOCwxMCArMjMxNCwxMCBAQAogICAgIH0KIAogICAgIC8vIENoZWNrIGFyZ3VtZW50IHR5cGVzLgotICAgIGZvciAodW5zaWduZWQgQXJnSWR4ID0gMCwgTnVtQXJncyA9IEZyb21GdW5jdGlvblR5cGUtPmdldE51bUFyZ3MoKTsKKyAgICBmb3IgKHVuc2lnbmVkIEFyZ0lkeCA9IDAsIE51bUFyZ3MgPSBGcm9tRnVuY3Rpb25UeXBlLT5nZXROdW1QYXJhbXMoKTsKICAgICAgICAgIEFyZ0lkeCAhPSBOdW1BcmdzOyArK0FyZ0lkeCkgewotICAgICAgUXVhbFR5cGUgRnJvbUFyZ1R5cGUgPSBGcm9tRnVuY3Rpb25UeXBlLT5nZXRBcmdUeXBlKEFyZ0lkeCk7Ci0gICAgICBRdWFsVHlwZSBUb0FyZ1R5cGUgPSBUb0Z1bmN0aW9uVHlwZS0+Z2V0QXJnVHlwZShBcmdJZHgpOworICAgICAgUXVhbFR5cGUgRnJvbUFyZ1R5cGUgPSBGcm9tRnVuY3Rpb25UeXBlLT5nZXRQYXJhbVR5cGUoQXJnSWR4KTsKKyAgICAgIFF1YWxUeXBlIFRvQXJnVHlwZSA9IFRvRnVuY3Rpb25UeXBlLT5nZXRQYXJhbVR5cGUoQXJnSWR4KTsKICAgICAgIGlmIChDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoRnJvbUFyZ1R5cGUpCiAgICAgICAgICAgICA9PSBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoVG9BcmdUeXBlKSkgewogICAgICAgICAvLyBPa2F5LCB0aGUgdHlwZXMgbWF0Y2ggZXhhY3RseS4gTm90aGluZyB0byBkby4KQEAgLTI0MzYsNyArMjQ0Miw3IEBACiAgICAgCiAgIC8vIFBlcmZvcm0gdGhlIHF1aWNrIGNoZWNrcyB0aGF0IHdpbGwgdGVsbCB1cyB3aGV0aGVyIHRoZXNlCiAgIC8vIGZ1bmN0aW9uIHR5cGVzIGFyZSBvYnZpb3VzbHkgZGlmZmVyZW50LgotICBpZiAoRnJvbUZ1bmN0aW9uVHlwZS0+Z2V0TnVtQXJncygpICE9IFRvRnVuY3Rpb25UeXBlLT5nZXROdW1BcmdzKCkgfHwKKyAgaWYgKEZyb21GdW5jdGlvblR5cGUtPmdldE51bVBhcmFtcygpICE9IFRvRnVuY3Rpb25UeXBlLT5nZXROdW1QYXJhbXMoKSB8fAogICAgICAgRnJvbUZ1bmN0aW9uVHlwZS0+aXNWYXJpYWRpYygpICE9IFRvRnVuY3Rpb25UeXBlLT5pc1ZhcmlhZGljKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogICAgIApAQCAtMjQ0NiwxMiArMjQ1MiwxMiBAQAogICAgIHJldHVybiBmYWxzZTsKIAogICBib29sIEluY29tcGF0aWJsZU9iakMgPSBmYWxzZTsKLSAgaWYgKENvbnRleHQuaGFzU2FtZVR5cGUoRnJvbUZ1bmN0aW9uVHlwZS0+Z2V0UmVzdWx0VHlwZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVG9GdW5jdGlvblR5cGUtPmdldFJlc3VsdFR5cGUoKSkpIHsKKyAgaWYgKENvbnRleHQuaGFzU2FtZVR5cGUoRnJvbUZ1bmN0aW9uVHlwZS0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUb0Z1bmN0aW9uVHlwZS0+Z2V0UmV0dXJuVHlwZSgpKSkgewogICAgIC8vIE9rYXksIHRoZSB0eXBlcyBtYXRjaCBleGFjdGx5LiBOb3RoaW5nIHRvIGRvLgogICB9IGVsc2UgewotICAgIFF1YWxUeXBlIFJIUyA9IEZyb21GdW5jdGlvblR5cGUtPmdldFJlc3VsdFR5cGUoKTsKLSAgICBRdWFsVHlwZSBMSFMgPSBUb0Z1bmN0aW9uVHlwZS0+Z2V0UmVzdWx0VHlwZSgpOworICAgIFF1YWxUeXBlIFJIUyA9IEZyb21GdW5jdGlvblR5cGUtPmdldFJldHVyblR5cGUoKTsKKyAgICBRdWFsVHlwZSBMSFMgPSBUb0Z1bmN0aW9uVHlwZS0+Z2V0UmV0dXJuVHlwZSgpOwogICAgIGlmICgoIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzIHx8ICFSSFMtPmlzUmVjb3JkVHlwZSgpKSAmJgogICAgICAgICAhUkhTLmhhc1F1YWxpZmllcnMoKSAmJiBMSFMuaGFzUXVhbGlmaWVycygpKQogICAgICAgIExIUyA9IExIUy5nZXRVbnF1YWxpZmllZFR5cGUoKTsKQEAgLTI0NjksMTEgKzI0NzUsMTEgQEAKICAgIH0KICAgICAKICAgIC8vIENoZWNrIGFyZ3VtZW50IHR5cGVzLgotICAgZm9yICh1bnNpZ25lZCBBcmdJZHggPSAwLCBOdW1BcmdzID0gRnJvbUZ1bmN0aW9uVHlwZS0+Z2V0TnVtQXJncygpOworICAgZm9yICh1bnNpZ25lZCBBcmdJZHggPSAwLCBOdW1BcmdzID0gRnJvbUZ1bmN0aW9uVHlwZS0+Z2V0TnVtUGFyYW1zKCk7CiAgICAgICAgIEFyZ0lkeCAhPSBOdW1BcmdzOyArK0FyZ0lkeCkgewogICAgICBJbmNvbXBhdGlibGVPYmpDID0gZmFsc2U7Ci0gICAgIFF1YWxUeXBlIEZyb21BcmdUeXBlID0gRnJvbUZ1bmN0aW9uVHlwZS0+Z2V0QXJnVHlwZShBcmdJZHgpOwotICAgICBRdWFsVHlwZSBUb0FyZ1R5cGUgPSBUb0Z1bmN0aW9uVHlwZS0+Z2V0QXJnVHlwZShBcmdJZHgpOworICAgICBRdWFsVHlwZSBGcm9tQXJnVHlwZSA9IEZyb21GdW5jdGlvblR5cGUtPmdldFBhcmFtVHlwZShBcmdJZHgpOworICAgICBRdWFsVHlwZSBUb0FyZ1R5cGUgPSBUb0Z1bmN0aW9uVHlwZS0+Z2V0UGFyYW1UeXBlKEFyZ0lkeCk7CiAgICAgIGlmIChDb250ZXh0Lmhhc1NhbWVUeXBlKEZyb21BcmdUeXBlLCBUb0FyZ1R5cGUpKSB7CiAgICAgICAgLy8gT2theSwgdGhlIHR5cGVzIG1hdGNoIGV4YWN0bHkuIE5vdGhpbmcgdG8gZG8uCiAgICAgIH0gZWxzZSBpZiAoaXNPYmpDUG9pbnRlckNvbnZlcnNpb24oVG9BcmdUeXBlLCBGcm9tQXJnVHlwZSwKQEAgLTI1NTgsMjYgKzI1NjQsMjYgQEAKICAgICByZXR1cm47CiAgIH0KIAotICBpZiAoRnJvbUZ1bmN0aW9uLT5nZXROdW1BcmdzKCkgIT0gVG9GdW5jdGlvbi0+Z2V0TnVtQXJncygpKSB7Ci0gICAgUERpYWcgPDwgZnRfcGFyYW1ldGVyX2FyaXR5IDw8IFRvRnVuY3Rpb24tPmdldE51bUFyZ3MoKQotICAgICAgICAgIDw8IEZyb21GdW5jdGlvbi0+Z2V0TnVtQXJncygpOworICBpZiAoRnJvbUZ1bmN0aW9uLT5nZXROdW1QYXJhbXMoKSAhPSBUb0Z1bmN0aW9uLT5nZXROdW1QYXJhbXMoKSkgeworICAgIFBEaWFnIDw8IGZ0X3BhcmFtZXRlcl9hcml0eSA8PCBUb0Z1bmN0aW9uLT5nZXROdW1QYXJhbXMoKQorICAgICAgICAgIDw8IEZyb21GdW5jdGlvbi0+Z2V0TnVtUGFyYW1zKCk7CiAgICAgcmV0dXJuOwogICB9CiAKICAgLy8gSGFuZGxlIGRpZmZlcmVudCBwYXJhbWV0ZXIgdHlwZXMuCiAgIHVuc2lnbmVkIEFyZ1BvczsKLSAgaWYgKCFGdW5jdGlvbkFyZ1R5cGVzQXJlRXF1YWwoRnJvbUZ1bmN0aW9uLCBUb0Z1bmN0aW9uLCAmQXJnUG9zKSkgeworICBpZiAoIUZ1bmN0aW9uUGFyYW1UeXBlc0FyZUVxdWFsKEZyb21GdW5jdGlvbiwgVG9GdW5jdGlvbiwgJkFyZ1BvcykpIHsKICAgICBQRGlhZyA8PCBmdF9wYXJhbWV0ZXJfbWlzbWF0Y2ggPDwgQXJnUG9zICsgMQotICAgICAgICAgIDw8IFRvRnVuY3Rpb24tPmdldEFyZ1R5cGUoQXJnUG9zKQotICAgICAgICAgIDw8IEZyb21GdW5jdGlvbi0+Z2V0QXJnVHlwZShBcmdQb3MpOworICAgICAgICAgIDw8IFRvRnVuY3Rpb24tPmdldFBhcmFtVHlwZShBcmdQb3MpCisgICAgICAgICAgPDwgRnJvbUZ1bmN0aW9uLT5nZXRQYXJhbVR5cGUoQXJnUG9zKTsKICAgICByZXR1cm47CiAgIH0KIAogICAvLyBIYW5kbGUgZGlmZmVyZW50IHJldHVybiB0eXBlLgotICBpZiAoIUNvbnRleHQuaGFzU2FtZVR5cGUoRnJvbUZ1bmN0aW9uLT5nZXRSZXN1bHRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUb0Z1bmN0aW9uLT5nZXRSZXN1bHRUeXBlKCkpKSB7Ci0gICAgUERpYWcgPDwgZnRfcmV0dXJuX3R5cGUgPDwgVG9GdW5jdGlvbi0+Z2V0UmVzdWx0VHlwZSgpCi0gICAgICAgICAgPDwgRnJvbUZ1bmN0aW9uLT5nZXRSZXN1bHRUeXBlKCk7CisgIGlmICghQ29udGV4dC5oYXNTYW1lVHlwZShGcm9tRnVuY3Rpb24tPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvRnVuY3Rpb24tPmdldFJldHVyblR5cGUoKSkpIHsKKyAgICBQRGlhZyA8PCBmdF9yZXR1cm5fdHlwZSA8PCBUb0Z1bmN0aW9uLT5nZXRSZXR1cm5UeXBlKCkKKyAgICAgICAgICA8PCBGcm9tRnVuY3Rpb24tPmdldFJldHVyblR5cGUoKTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtMjU5MiwxOSArMjU5OCwyMSBAQAogICBQRGlhZyA8PCBmdF9kZWZhdWx0OwogfQogCi0vLy8gRnVuY3Rpb25BcmdUeXBlc0FyZUVxdWFsIC0gVGhpcyByb3V0aW5lIGNoZWNrcyB0d28gZnVuY3Rpb24gcHJvdG8gdHlwZXMKKy8vLyBGdW5jdGlvblBhcmFtVHlwZXNBcmVFcXVhbCAtIFRoaXMgcm91dGluZSBjaGVja3MgdHdvIGZ1bmN0aW9uIHByb3RvIHR5cGVzCiAvLy8gZm9yIGVxdWFsaXR5IG9mIHRoZWlyIGFyZ3VtZW50IHR5cGVzLiBDYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0CiAvLy8gdGhleSBoYXZlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIElmIHRoZSBwYXJhbWV0ZXJzIGFyZSBkaWZmZXJlbnQsCiAvLy8gQXJnUG9zIHdpbGwgaGF2ZSB0aGUgcGFyYW1ldGVyIGluZGV4IG9mIHRoZSBmaXJzdCBkaWZmZXJlbnQgcGFyYW1ldGVyLgotYm9vbCBTZW1hOjpGdW5jdGlvbkFyZ1R5cGVzQXJlRXF1YWwoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKk9sZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqTmV3VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpBcmdQb3MpIHsKLSAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6YXJnX3R5cGVfaXRlcmF0b3IgTyA9IE9sZFR5cGUtPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgTiA9IE5ld1R5cGUtPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgRSA9IE9sZFR5cGUtPmFyZ190eXBlX2VuZCgpOyBPICYmIChPICE9IEUpOyArK08sICsrTikgeworYm9vbCBTZW1hOjpGdW5jdGlvblBhcmFtVHlwZXNBcmVFcXVhbChjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqT2xkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKk5ld1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpBcmdQb3MpIHsKKyAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6cGFyYW1fdHlwZV9pdGVyYXRvciBPID0gT2xkVHlwZS0+cGFyYW1fdHlwZV9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gPSBOZXdUeXBlLT5wYXJhbV90eXBlX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IE9sZFR5cGUtPnBhcmFtX3R5cGVfZW5kKCk7CisgICAgICAgTyAmJiAoTyAhPSBFKTsgKytPLCArK04pIHsKICAgICBpZiAoIUNvbnRleHQuaGFzU2FtZVR5cGUoTy0+Z2V0VW5xdWFsaWZpZWRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tPmdldFVucXVhbGlmaWVkVHlwZSgpKSkgewotICAgICAgaWYgKEFyZ1BvcykgKkFyZ1BvcyA9IE8gLSBPbGRUeXBlLT5hcmdfdHlwZV9iZWdpbigpOworICAgICAgaWYgKEFyZ1BvcykKKyAgICAgICAgKkFyZ1BvcyA9IE8gLSBPbGRUeXBlLT5wYXJhbV90eXBlX2JlZ2luKCk7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICB9CkBAIC0yOTE5LDggKzI5MjcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFR5cGUpIHsKICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkN0b3JUeXBlID0KICAgICAgIENvbnN0cnVjdG9yLT5nZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwotICBpZiAoQ3RvclR5cGUtPmdldE51bUFyZ3MoKSA+IDApIHsKLSAgICBRdWFsVHlwZSBGaXJzdEFyZyA9IEN0b3JUeXBlLT5nZXRBcmdUeXBlKDApOworICBpZiAoQ3RvclR5cGUtPmdldE51bVBhcmFtcygpID4gMCkgeworICAgIFF1YWxUeXBlIEZpcnN0QXJnID0gQ3RvclR5cGUtPmdldFBhcmFtVHlwZSgwKTsKICAgICBpZiAoQ29udGV4dC5oYXNTYW1lVW5xdWFsaWZpZWRUeXBlKFR5cGUsIEZpcnN0QXJnLmdldE5vblJlZmVyZW5jZVR5cGUoKSkpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtMzI0MSwxOCArMzI0OSwxNSBAQAogICAgIElzVXNlckRlZmluZWRDb252ZXJzaW9uKCp0aGlzLCBGcm9tLCBUb1R5cGUsIElDUy5Vc2VyRGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5kaWRhdGVTZXQsIGZhbHNlLCBmYWxzZSk7CiAgIGlmIChPdlJlc3VsdCA9PSBPUl9BbWJpZ3VvdXMpCi0gICAgRGlhZyhGcm9tLT5nZXRMb2NTdGFydCgpLAotICAgICAgICAgZGlhZzo6ZXJyX3R5cGVjaGVja19hbWJpZ3VvdXNfY29uZGl0aW9uKQotICAgICAgICAgIDw8IEZyb20tPmdldFR5cGUoKSA8PCBUb1R5cGUgPDwgRnJvbS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICBEaWFnKEZyb20tPmdldExvY1N0YXJ0KCksIGRpYWc6OmVycl90eXBlY2hlY2tfYW1iaWd1b3VzX2NvbmRpdGlvbikKKyAgICAgICAgPDwgRnJvbS0+Z2V0VHlwZSgpIDw8IFRvVHlwZSA8PCBGcm9tLT5nZXRTb3VyY2VSYW5nZSgpOwogICBlbHNlIGlmIChPdlJlc3VsdCA9PSBPUl9Ob19WaWFibGVfRnVuY3Rpb24gJiYgIUNhbmRpZGF0ZVNldC5lbXB0eSgpKSB7CiAgICAgaWYgKCFSZXF1aXJlQ29tcGxldGVUeXBlKEZyb20tPmdldExvY1N0YXJ0KCksIFRvVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX3R5cGVjaGVja19ub252aWFibGVfY29uZGl0aW9uX2luY29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6OmVycl90eXBlY2hlY2tfbm9udmlhYmxlX2NvbmRpdGlvbl9pbmNvbXBsZXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9tLT5nZXRUeXBlKCksIEZyb20tPmdldFNvdXJjZVJhbmdlKCkpKQotICAgICAgRGlhZyhGcm9tLT5nZXRMb2NTdGFydCgpLAotICAgICAgICAgICBkaWFnOjplcnJfdHlwZWNoZWNrX25vbnZpYWJsZV9jb25kaXRpb24pCi0gICAgICAgICAgIDw8IEZyb20tPmdldFR5cGUoKSA8PCBGcm9tLT5nZXRTb3VyY2VSYW5nZSgpIDw8IFRvVHlwZTsKLSAgfQotICBlbHNlCisgICAgICBEaWFnKEZyb20tPmdldExvY1N0YXJ0KCksIGRpYWc6OmVycl90eXBlY2hlY2tfbm9udmlhYmxlX2NvbmRpdGlvbikKKyAgICAgICAgICA8PCBGcm9tLT5nZXRUeXBlKCkgPDwgRnJvbS0+Z2V0U291cmNlUmFuZ2UoKSA8PCBUb1R5cGU7CisgIH0gZWxzZQogICAgIHJldHVybiBmYWxzZTsKICAgQ2FuZGlkYXRlU2V0Lk5vdGVDYW5kaWRhdGVzKCp0aGlzLCBPQ0RfQWxsQ2FuZGlkYXRlcywgRnJvbSk7CiAgIHJldHVybiB0cnVlOwpAQCAtMzI2MiwzNyArMzI2Nyw0MyBAQAogLy8vIG9mIHR3byB1c2VyLWRlZmluZWQgY29udmVyc2lvbiBzZXF1ZW5jZXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW55IG9yZGVyaW5nCiAvLy8gaXMgcG9zc2libGUuCiBzdGF0aWMgSW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2U6OkNvbXBhcmVLaW5kCi1jb21wYXJlQ29udmVyc2lvbkZ1bmN0aW9ucyhTZW1hICZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsICpGdW5jdGlvbjEsCitjb21wYXJlQ29udmVyc2lvbkZ1bmN0aW9ucyhTZW1hICZTLCBGdW5jdGlvbkRlY2wgKkZ1bmN0aW9uMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24yKSB7CiAgIGlmICghUy5nZXRMYW5nT3B0cygpLk9iakMxIHx8ICFTLmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEpCiAgICAgcmV0dXJuIEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlOjpJbmRpc3Rpbmd1aXNoYWJsZTsKLSAgCisKICAgLy8gT2JqZWN0aXZlLUMrKzoKICAgLy8gICBJZiBib3RoIGNvbnZlcnNpb24gZnVuY3Rpb25zIGFyZSBpbXBsaWNpdGx5LWRlY2xhcmVkIGNvbnZlcnNpb25zIGZyb20KLSAgLy8gICBhIGxhbWJkYSBjbG9zdXJlIHR5cGUgdG8gYSBmdW5jdGlvbiBwb2ludGVyIGFuZCBhIGJsb2NrIHBvaW50ZXIsIAorICAvLyAgIGEgbGFtYmRhIGNsb3N1cmUgdHlwZSB0byBhIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIGEgYmxvY2sgcG9pbnRlciwKICAgLy8gICByZXNwZWN0aXZlbHksIGFsd2F5cyBwcmVmZXIgdGhlIGNvbnZlcnNpb24gdG8gYSBmdW5jdGlvbiBwb2ludGVyLAogICAvLyAgIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaXMgbW9yZSBsaWdodHdlaWdodCBhbmQgaXMgbW9yZSBsaWtlbHkKICAgLy8gICB0byBrZWVwIGNvZGUgd29ya2luZy4KLSAgQ1hYQ29udmVyc2lvbkRlY2wgKkNvbnYxID0gZHluX2Nhc3Q8Q1hYQ29udmVyc2lvbkRlY2w+KEZ1bmN0aW9uMSk7CisgIENYWENvbnZlcnNpb25EZWNsICpDb252MSA9IGR5bl9jYXN0X29yX251bGw8Q1hYQ29udmVyc2lvbkRlY2w+KEZ1bmN0aW9uMSk7CiAgIGlmICghQ29udjEpCiAgICAgcmV0dXJuIEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlOjpJbmRpc3Rpbmd1aXNoYWJsZTsKLSAgICAKKwogICBDWFhDb252ZXJzaW9uRGVjbCAqQ29udjIgPSBkeW5fY2FzdDxDWFhDb252ZXJzaW9uRGVjbD4oRnVuY3Rpb24yKTsKICAgaWYgKCFDb252MikKICAgICByZXR1cm4gSW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2U6OkluZGlzdGluZ3Vpc2hhYmxlOwotICAKKwogICBpZiAoQ29udjEtPmdldFBhcmVudCgpLT5pc0xhbWJkYSgpICYmIENvbnYyLT5nZXRQYXJlbnQoKS0+aXNMYW1iZGEoKSkgewogICAgIGJvb2wgQmxvY2sxID0gQ29udjEtPmdldENvbnZlcnNpb25UeXBlKCktPmlzQmxvY2tQb2ludGVyVHlwZSgpOwogICAgIGJvb2wgQmxvY2syID0gQ29udjItPmdldENvbnZlcnNpb25UeXBlKCktPmlzQmxvY2tQb2ludGVyVHlwZSgpOwogICAgIGlmIChCbG9jazEgIT0gQmxvY2syKQotICAgICAgcmV0dXJuIEJsb2NrMT8gSW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2U6OldvcnNlIAotICAgICAgICAgICAgICAgICAgIDogSW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2U6OkJldHRlcjsKKyAgICAgIHJldHVybiBCbG9jazEgPyBJbXBsaWNpdENvbnZlcnNpb25TZXF1ZW5jZTo6V29yc2UKKyAgICAgICAgICAgICAgICAgICAgOiBJbXBsaWNpdENvbnZlcnNpb25TZXF1ZW5jZTo6QmV0dGVyOwogICB9CiAKICAgcmV0dXJuIEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlOjpJbmRpc3Rpbmd1aXNoYWJsZTsKIH0KLSAgCisKK3N0YXRpYyBib29sIGhhc0RlcHJlY2F0ZWRTdHJpbmdMaXRlcmFsVG9DaGFyUHRyQ29udmVyc2lvbigKKyAgICBjb25zdCBJbXBsaWNpdENvbnZlcnNpb25TZXF1ZW5jZSAmSUNTKSB7CisgIHJldHVybiAoSUNTLmlzU3RhbmRhcmQoKSAmJiBJQ1MuU3RhbmRhcmQuRGVwcmVjYXRlZFN0cmluZ0xpdGVyYWxUb0NoYXJQdHIpIHx8CisgICAgICAgICAoSUNTLmlzVXNlckRlZmluZWQoKSAmJgorICAgICAgICAgIElDUy5Vc2VyRGVmaW5lZC5CZWZvcmUuRGVwcmVjYXRlZFN0cmluZ0xpdGVyYWxUb0NoYXJQdHIpOworfQorCiAvLy8gQ29tcGFyZUltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlcyAtIENvbXBhcmUgdHdvIGltcGxpY2l0CiAvLy8gY29udmVyc2lvbiBzZXF1ZW5jZXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb25lIGlzIGJldHRlciB0aGFuIHRoZQogLy8vIG90aGVyIG9yIGlmIHRoZXkgYXJlIGluZGlzdGluZ3Vpc2hhYmxlIChDKysgMTMuMy4zLjIpLgpAQCAtMzMxNSw2ICszMzI2LDMyIEBACiAgIC8vICAgZGVzY3JpYmVkIGluIDEzLjMuMy4yLCB0aGUgYW1iaWd1b3VzIGNvbnZlcnNpb24gc2VxdWVuY2UgaXMKICAgLy8gICB0cmVhdGVkIGFzIGEgdXNlci1kZWZpbmVkIHNlcXVlbmNlIHRoYXQgaXMgaW5kaXN0aW5ndWlzaGFibGUKICAgLy8gICBmcm9tIGFueSBvdGhlciB1c2VyLWRlZmluZWQgY29udmVyc2lvbiBzZXF1ZW5jZS4KKworICAvLyBTdHJpbmcgbGl0ZXJhbCB0byAnY2hhciAqJyBjb252ZXJzaW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gQysrMDMuIEl0IGhhcworICAvLyBiZWVuIHJlbW92ZWQgZnJvbSBDKysxMS4gV2Ugc3RpbGwgYWNjZXB0IHRoaXMgY29udmVyc2lvbiwgaWYgaXQgaGFwcGVucyBhdAorICAvLyB0aGUgYmVzdCB2aWFibGUgZnVuY3Rpb24uIE90aGVyd2lzZSwgdGhpcyBjb252ZXJzaW9uIGlzIGNvbnNpZGVyZWQgd29yc2UKKyAgLy8gdGhhbiBlbGxpcHNpcyBjb252ZXJzaW9uLiBDb25zaWRlciB0aGlzIGFzIGFuIGV4dGVuc2lvbjsgdGhpcyBpcyBub3QgaW4gdGhlCisgIC8vIHN0YW5kYXJkLiBGb3IgZXhhbXBsZToKKyAgLy8KKyAgLy8gaW50ICZmKC4uLik7ICAgIC8vICMxCisgIC8vIHZvaWQgZihjaGFyKik7ICAvLyAjMgorICAvLyB2b2lkIGcoKSB7IGludCAmciA9IGYoImZvbyIpOyB9CisgIC8vCisgIC8vIEluIEMrKzAzLCB3ZSBwaWNrICMyIGFzIHRoZSBiZXN0IHZpYWJsZSBmdW5jdGlvbi4KKyAgLy8gSW4gQysrMTEsIHdlIHBpY2sgIzEgYXMgdGhlIGJlc3QgdmlhYmxlIGZ1bmN0aW9uLCBiZWNhdXNlIGVsbGlwc2lzCisgIC8vIGNvbnZlcnNpb24gaXMgYmV0dGVyIHRoYW4gc3RyaW5nLWxpdGVyYWwgdG8gY2hhciogY29udmVyc2lvbiAoc2luY2UgdGhlcmUKKyAgLy8gaXMgbm8gc3VjaCBjb252ZXJzaW9uIGluIEMrKzExKS4gSWYgdGhlcmUgd2FzIG5vICMxIGF0IGFsbCBvciAjMSBjb3VsZG4ndAorICAvLyBjb252ZXJ0IGFyZ3VtZW50cywgIzIgd291bGQgYmUgdGhlIGJlc3QgdmlhYmxlIGZ1bmN0aW9uIGluIEMrKzExLgorICAvLyBJZiB0aGUgYmVzdCB2aWFibGUgZnVuY3Rpb24gaGFzIHRoaXMgY29udmVyc2lvbiwgYSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkCisgIC8vIGluIEMrKzAzLCBvciBhbiBFeHRXYXJuICgrU0ZJTkFFIGZhaWx1cmUpIHdpbGwgYmUgaXNzdWVkIGluIEMrKzExLgorCisgIGlmIChTLmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEgJiYgIVMuZ2V0TGFuZ09wdHMoKS5Xcml0YWJsZVN0cmluZ3MgJiYKKyAgICAgIGhhc0RlcHJlY2F0ZWRTdHJpbmdMaXRlcmFsVG9DaGFyUHRyQ29udmVyc2lvbihJQ1MxKSAhPQorICAgICAgaGFzRGVwcmVjYXRlZFN0cmluZ0xpdGVyYWxUb0NoYXJQdHJDb252ZXJzaW9uKElDUzIpKQorICAgIHJldHVybiBoYXNEZXByZWNhdGVkU3RyaW5nTGl0ZXJhbFRvQ2hhclB0ckNvbnZlcnNpb24oSUNTMSkKKyAgICAgICAgICAgICAgID8gSW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2U6OldvcnNlCisgICAgICAgICAgICAgICA6IEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlOjpCZXR0ZXI7CisKICAgaWYgKElDUzEuZ2V0S2luZFJhbmsoKSA8IElDUzIuZ2V0S2luZFJhbmsoKSkKICAgICByZXR1cm4gSW1wbGljaXRDb252ZXJzaW9uU2VxdWVuY2U6OkJldHRlcjsKICAgaWYgKElDUzIuZ2V0S2luZFJhbmsoKSA8IElDUzEuZ2V0S2luZFJhbmsoKSkKQEAgLTM2MTMsMTEgKzM2NTAsMTAgQEAKICAgLy8gfQogICAvLyBIZXJlLCBNU1ZDIHdpbGwgY2FsbCBmKGludCkgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgY29tcGlsZSBlcnJvcgogICAvLyBhcyBjbGFuZyB3aWxsIGRvIGluIHN0YW5kYXJkIG1vZGUuCi0gIGlmIChTLmdldExhbmdPcHRzKCkuTWljcm9zb2Z0TW9kZSAmJgotICAgICAgU0NTMS5TZWNvbmQgPT0gSUNLX0ludGVncmFsX0NvbnZlcnNpb24gJiYKLSAgICAgIFNDUzIuU2Vjb25kID09IElDS19GbG9hdGluZ19JbnRlZ3JhbCAmJiAKKyAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5NU1ZDQ29tcGF0ICYmIFNDUzEuU2Vjb25kID09IElDS19JbnRlZ3JhbF9Db252ZXJzaW9uICYmCisgICAgICBTQ1MyLlNlY29uZCA9PSBJQ0tfRmxvYXRpbmdfSW50ZWdyYWwgJiYKICAgICAgIFMuQ29udGV4dC5nZXRUeXBlU2l6ZShTQ1MxLmdldEZyb21UeXBlKCkpID09Ci0gICAgICBTLkNvbnRleHQuZ2V0VHlwZVNpemUoU0NTMS5nZXRUb1R5cGUoMikpKQorICAgICAgICAgIFMuQ29udGV4dC5nZXRUeXBlU2l6ZShTQ1MxLmdldFRvVHlwZSgyKSkpCiAgICAgcmV0dXJuIEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlOjpCZXR0ZXI7CiAKICAgcmV0dXJuIEltcGxpY2l0Q29udmVyc2lvblNlcXVlbmNlOjpJbmRpc3Rpbmd1aXNoYWJsZTsKQEAgLTQyMjcsNiArNDI2Myw3IEBACiAgICAgICBJQ1MuU3RhbmRhcmQuQmluZHNJbXBsaWNpdE9iamVjdEFyZ3VtZW50V2l0aG91dFJlZlF1YWxpZmllciA9IGZhbHNlOwogICAgICAgSUNTLlN0YW5kYXJkLk9iakNMaWZldGltZUNvbnZlcnNpb25CaW5kaW5nID0gT2JqQ0xpZmV0aW1lQ29udmVyc2lvbjsKICAgICAgIElDUy5TdGFuZGFyZC5Db3B5Q29uc3RydWN0b3IgPSAwOworICAgICAgSUNTLlN0YW5kYXJkLkRlcHJlY2F0ZWRTdHJpbmdMaXRlcmFsVG9DaGFyUHRyID0gZmFsc2U7CiAKICAgICAgIC8vIE5vdGhpbmcgbW9yZSB0byBkbzogdGhlIGluYWNjZXNzaWJpbGl0eS9hbWJpZ3VpdHkgY2hlY2sgZm9yCiAgICAgICAvLyBkZXJpdmVkLXRvLWJhc2UgY29udmVyc2lvbnMgaXMgc3VwcHJlc3NlZCB3aGVuIHdlJ3JlCkBAIC00MzAxLDYgKzQzMzgsNyBAQAogICAgIElDUy5TdGFuZGFyZC5CaW5kc0ltcGxpY2l0T2JqZWN0QXJndW1lbnRXaXRob3V0UmVmUXVhbGlmaWVyID0gZmFsc2U7CiAgICAgSUNTLlN0YW5kYXJkLk9iakNMaWZldGltZUNvbnZlcnNpb25CaW5kaW5nID0gT2JqQ0xpZmV0aW1lQ29udmVyc2lvbjsKICAgICBJQ1MuU3RhbmRhcmQuQ29weUNvbnN0cnVjdG9yID0gMDsKKyAgICBJQ1MuU3RhbmRhcmQuRGVwcmVjYXRlZFN0cmluZ0xpdGVyYWxUb0NoYXJQdHIgPSBmYWxzZTsKICAgICByZXR1cm4gSUNTOwogICB9CiAKQEAgLTQzOTgsOSArNDQzNiw5IEBACiAgIH0gZWxzZSBpZiAoSUNTLmlzVXNlckRlZmluZWQoKSkgewogICAgIC8vIERvbid0IGFsbG93IHJ2YWx1ZSByZWZlcmVuY2VzIHRvIGJpbmQgdG8gbHZhbHVlcy4KICAgICBpZiAoRGVjbFR5cGUtPmlzUlZhbHVlUmVmZXJlbmNlVHlwZSgpKSB7Ci0gICAgICBpZiAoY29uc3QgUmVmZXJlbmNlVHlwZSAqUmVmVHlwZQotICAgICAgICAgICAgPSBJQ1MuVXNlckRlZmluZWQuQ29udmVyc2lvbkZ1bmN0aW9uLT5nZXRSZXN1bHRUeXBlKCkKLSAgICAgICAgICAgICAgICAtPmdldEFzPExWYWx1ZVJlZmVyZW5jZVR5cGU+KCkpIHsKKyAgICAgIGlmIChjb25zdCBSZWZlcmVuY2VUeXBlICpSZWZUeXBlID0KKyAgICAgICAgICAgICAgSUNTLlVzZXJEZWZpbmVkLkNvbnZlcnNpb25GdW5jdGlvbi0+Z2V0UmV0dXJuVHlwZSgpCisgICAgICAgICAgICAgICAgICAtPmdldEFzPExWYWx1ZVJlZmVyZW5jZVR5cGU+KCkpIHsKICAgICAgICAgaWYgKCFSZWZUeXBlLT5nZXRQb2ludGVlVHlwZSgpLT5pc0Z1bmN0aW9uVHlwZSgpKSB7CiAgICAgICAgICAgSUNTLnNldEJhZChCYWRDb252ZXJzaW9uU2VxdWVuY2U6Omx2YWx1ZV9yZWZfdG9fcnZhbHVlLCBJbml0LCAKICAgICAgICAgICAgICAgICAgICAgIERlY2xUeXBlKTsKQEAgLTQ0MDgsNyArNDQ0Niw3IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgCisgICAgSUNTLlVzZXJEZWZpbmVkLkJlZm9yZS5zZXRBc0lkZW50aXR5Q29udmVyc2lvbigpOwogICAgIElDUy5Vc2VyRGVmaW5lZC5BZnRlci5SZWZlcmVuY2VCaW5kaW5nID0gdHJ1ZTsKICAgICBJQ1MuVXNlckRlZmluZWQuQWZ0ZXIuSXNMdmFsdWVSZWZlcmVuY2UgPSAhaXNSVmFsUmVmOwogICAgIElDUy5Vc2VyRGVmaW5lZC5BZnRlci5CaW5kc1RvRnVuY3Rpb25MdmFsdWUgPSBUMi0+aXNGdW5jdGlvblR5cGUoKTsKQEAgLTUyOTEsNyArNTMyOSw3IEBACiAgICAgVHlwZURpYWdub3NlclBhcnRpYWxEaWFnKENvbnRleHR1YWxJbXBsaWNpdENvbnZlcnRlciAmQ29udmVydGVyLCBFeHByICpGcm9tKQogICAgICAgICA6IFR5cGVEaWFnbm9zZXIoQ29udmVydGVyLlN1cHByZXNzKSwgQ29udmVydGVyKENvbnZlcnRlciksIEZyb20oRnJvbSkge30KIAotICAgIHZpcnR1YWwgdm9pZCBkaWFnbm9zZShTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIHsKKyAgICB2b2lkIGRpYWdub3NlKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCkgb3ZlcnJpZGUgewogICAgICAgQ29udmVydGVyLmRpYWdub3NlSW5jb21wbGV0ZShTLCBMb2MsIFQpIDw8IEZyb20tPmdldFNvdXJjZVJhbmdlKCk7CiAgICAgfQogICB9IEluY29tcGxldGVEaWFnbm9zZXIoQ29udmVydGVyLCBGcm9tKTsKQEAgLTU0NTAsMTEgKzU0ODgsMTEgQEAKIFNlbWE6OkFkZE92ZXJsb2FkQ2FuZGlkYXRlKEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsQWNjZXNzUGFpciBGb3VuZERlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFeHByICo+IEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZVNldCYgQ2FuZGlkYXRlU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGVTZXQgJkNhbmRpZGF0ZVNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3VwcHJlc3NVc2VyQ29udmVyc2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBhcnRpYWxPdmVybG9hZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dFeHBsaWNpdCkgewotICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSogUHJvdG8KKyAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlByb3RvCiAgICAgPSBkeW5fY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oRnVuY3Rpb24tPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpKTsKICAgYXNzZXJ0KFByb3RvICYmICJGdW5jdGlvbnMgd2l0aG91dCBhIHByb3RvdHlwZSBjYW5ub3QgYmUgb3ZlcmxvYWRlZCIpOwogICBhc3NlcnQoIUZ1bmN0aW9uLT5nZXREZXNjcmliZWRGdW5jdGlvblRlbXBsYXRlKCkgJiYKQEAgLTU1MTMsMTIgKzU1NTEsMTIgQEAKICAgQ2FuZGlkYXRlLklnbm9yZU9iamVjdEFyZ3VtZW50ID0gZmFsc2U7CiAgIENhbmRpZGF0ZS5FeHBsaWNpdENhbGxBcmd1bWVudHMgPSBBcmdzLnNpemUoKTsKIAotICB1bnNpZ25lZCBOdW1BcmdzSW5Qcm90byA9IFByb3RvLT5nZXROdW1BcmdzKCk7CisgIHVuc2lnbmVkIE51bVBhcmFtcyA9IFByb3RvLT5nZXROdW1QYXJhbXMoKTsKIAogICAvLyAoQysrIDEzLjMuMnAyKTogQSBjYW5kaWRhdGUgZnVuY3Rpb24gaGF2aW5nIGZld2VyIHRoYW4gbQogICAvLyBwYXJhbWV0ZXJzIGlzIHZpYWJsZSBvbmx5IGlmIGl0IGhhcyBhbiBlbGxpcHNpcyBpbiBpdHMgcGFyYW1ldGVyCiAgIC8vIGxpc3QgKDguMy41KS4KLSAgaWYgKChBcmdzLnNpemUoKSArIChQYXJ0aWFsT3ZlcmxvYWRpbmcgJiYgQXJncy5zaXplKCkpKSA+IE51bUFyZ3NJblByb3RvICYmCisgIGlmICgoQXJncy5zaXplKCkgKyAoUGFydGlhbE92ZXJsb2FkaW5nICYmIEFyZ3Muc2l6ZSgpKSkgPiBOdW1QYXJhbXMgJiYKICAgICAgICFQcm90by0+aXNWYXJpYWRpYygpKSB7CiAgICAgQ2FuZGlkYXRlLlZpYWJsZSA9IGZhbHNlOwogICAgIENhbmRpZGF0ZS5GYWlsdXJlS2luZCA9IG92bF9mYWlsX3Rvb19tYW55X2FyZ3VtZW50czsKQEAgLTU1NTAsMTIgKzU1ODgsMTIgQEAKICAgLy8gRGV0ZXJtaW5lIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHNlcXVlbmNlcyBmb3IgZWFjaCBvZiB0aGUKICAgLy8gYXJndW1lbnRzLgogICBmb3IgKHVuc2lnbmVkIEFyZ0lkeCA9IDA7IEFyZ0lkeCA8IEFyZ3Muc2l6ZSgpOyArK0FyZ0lkeCkgewotICAgIGlmIChBcmdJZHggPCBOdW1BcmdzSW5Qcm90bykgeworICAgIGlmIChBcmdJZHggPCBOdW1QYXJhbXMpIHsKICAgICAgIC8vIChDKysgMTMuMy4ycDMpOiBmb3IgRiB0byBiZSBhIHZpYWJsZSBmdW5jdGlvbiwgdGhlcmUgc2hhbGwKICAgICAgIC8vIGV4aXN0IGZvciBlYWNoIGFyZ3VtZW50IGFuIGltcGxpY2l0IGNvbnZlcnNpb24gc2VxdWVuY2UKICAgICAgIC8vICgxMy4zLjMuMSkgdGhhdCBjb252ZXJ0cyB0aGF0IGFyZ3VtZW50IHRvIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAvLyBwYXJhbWV0ZXIgb2YgRi4KLSAgICAgIFF1YWxUeXBlIFBhcmFtVHlwZSA9IFByb3RvLT5nZXRBcmdUeXBlKEFyZ0lkeCk7CisgICAgICBRdWFsVHlwZSBQYXJhbVR5cGUgPSBQcm90by0+Z2V0UGFyYW1UeXBlKEFyZ0lkeCk7CiAgICAgICBDYW5kaWRhdGUuQ29udmVyc2lvbnNbQXJnSWR4XQogICAgICAgICA9IFRyeUNvcHlJbml0aWFsaXphdGlvbigqdGhpcywgQXJnc1tBcmdJZHhdLCBQYXJhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHByZXNzVXNlckNvbnZlcnNpb25zLApAQCAtNTU2Niw3ICs1NjA0LDcgQEAKICAgICAgIGlmIChDYW5kaWRhdGUuQ29udmVyc2lvbnNbQXJnSWR4XS5pc0JhZCgpKSB7CiAgICAgICAgIENhbmRpZGF0ZS5WaWFibGUgPSBmYWxzZTsKICAgICAgICAgQ2FuZGlkYXRlLkZhaWx1cmVLaW5kID0gb3ZsX2ZhaWxfYmFkX2NvbnZlcnNpb247Ci0gICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIChDKysgMTMuMy4ycDIpOiBGb3IgdGhlIHB1cnBvc2VzIG9mIG92ZXJsb2FkIHJlc29sdXRpb24sIGFueQpAQCAtNTU3NSw2ICs1NjEzLDc4IEBACiAgICAgICBDYW5kaWRhdGUuQ29udmVyc2lvbnNbQXJnSWR4XS5zZXRFbGxpcHNpcygpOwogICAgIH0KICAgfQorCisgIGlmIChFbmFibGVJZkF0dHIgKkZhaWxlZEF0dHIgPSBDaGVja0VuYWJsZUlmKEZ1bmN0aW9uLCBBcmdzKSkgeworICAgIENhbmRpZGF0ZS5WaWFibGUgPSBmYWxzZTsKKyAgICBDYW5kaWRhdGUuRmFpbHVyZUtpbmQgPSBvdmxfZmFpbF9lbmFibGVfaWY7CisgICAgQ2FuZGlkYXRlLkRlZHVjdGlvbkZhaWx1cmUuRGF0YSA9IEZhaWxlZEF0dHI7CisgICAgcmV0dXJuOworICB9Cit9CisKK3N0YXRpYyBib29sIElzTm90RW5hYmxlSWZBdHRyKEF0dHIgKkEpIHsgcmV0dXJuICFpc2E8RW5hYmxlSWZBdHRyPihBKTsgfQorCitFbmFibGVJZkF0dHIgKlNlbWE6OkNoZWNrRW5hYmxlSWYoRnVuY3Rpb25EZWNsICpGdW5jdGlvbiwgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWlzc2luZ0ltcGxpY2l0VGhpcykgeworICAvLyBGSVhNRTogc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxFbmFibGVJZkF0dHI+IGl0ZXJhdGVzIGluIHJldmVyc2Ugb3JkZXIsIGJ1dAorICAvLyB3ZSBuZWVkIHRvIGZpbmQgdGhlIGZpcnN0IGZhaWxpbmcgb25lLgorICBpZiAoIUZ1bmN0aW9uLT5oYXNBdHRycygpKQorICAgIHJldHVybiAwOworICBBdHRyVmVjIEF0dHJzID0gRnVuY3Rpb24tPmdldEF0dHJzKCk7CisgIEF0dHJWZWM6Oml0ZXJhdG9yIEUgPSBzdGQ6OnJlbW92ZV9pZihBdHRycy5iZWdpbigpLCBBdHRycy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTm90RW5hYmxlSWZBdHRyKTsKKyAgaWYgKEF0dHJzLmJlZ2luKCkgPT0gRSkKKyAgICByZXR1cm4gMDsKKyAgc3RkOjpyZXZlcnNlKEF0dHJzLmJlZ2luKCksIEUpOworCisgIFNGSU5BRVRyYXAgVHJhcCgqdGhpcyk7CisKKyAgLy8gQ29udmVydCB0aGUgYXJndW1lbnRzLgorICBTbWFsbFZlY3RvcjxFeHByICosIDE2PiBDb252ZXJ0ZWRBcmdzOworICBib29sIEluaXRpYWxpemF0aW9uRmFpbGVkID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBBcmdzLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoaSA9PSAwICYmICFNaXNzaW5nSW1wbGljaXRUaGlzICYmIGlzYTxDWFhNZXRob2REZWNsPihGdW5jdGlvbikgJiYKKyAgICAgICAgIWNhc3Q8Q1hYTWV0aG9kRGVjbD4oRnVuY3Rpb24pLT5pc1N0YXRpYygpICYmCisgICAgICAgICFpc2E8Q1hYQ29uc3RydWN0b3JEZWNsPihGdW5jdGlvbikpIHsKKyAgICAgIENYWE1ldGhvZERlY2wgKk1ldGhvZCA9IGNhc3Q8Q1hYTWV0aG9kRGVjbD4oRnVuY3Rpb24pOworICAgICAgRXhwclJlc3VsdCBSID0KKyAgICAgICAgUGVyZm9ybU9iamVjdEFyZ3VtZW50SW5pdGlhbGl6YXRpb24oQXJnc1swXSwgLypRdWFsaWZpZXI9Ki8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QsIE1ldGhvZCk7CisgICAgICBpZiAoUi5pc0ludmFsaWQoKSkgeworICAgICAgICBJbml0aWFsaXphdGlvbkZhaWxlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ29udmVydGVkQXJncy5wdXNoX2JhY2soUi50YWtlKCkpOworICAgIH0gZWxzZSB7CisgICAgICBFeHByUmVzdWx0IFIgPQorICAgICAgICBQZXJmb3JtQ29weUluaXRpYWxpemF0aW9uKEluaXRpYWxpemVkRW50aXR5OjpJbml0aWFsaXplUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uLT5nZXRQYXJhbURlY2woaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnc1tpXSk7CisgICAgICBpZiAoUi5pc0ludmFsaWQoKSkgeworICAgICAgICBJbml0aWFsaXphdGlvbkZhaWxlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ29udmVydGVkQXJncy5wdXNoX2JhY2soUi50YWtlKCkpOworICAgIH0KKyAgfQorCisgIGlmIChJbml0aWFsaXphdGlvbkZhaWxlZCB8fCBUcmFwLmhhc0Vycm9yT2NjdXJyZWQoKSkKKyAgICByZXR1cm4gY2FzdDxFbmFibGVJZkF0dHI+KEF0dHJzWzBdKTsKKworICBmb3IgKEF0dHJWZWM6Oml0ZXJhdG9yIEkgPSBBdHRycy5iZWdpbigpOyBJICE9IEU7ICsrSSkgeworICAgIEFQVmFsdWUgUmVzdWx0OworICAgIEVuYWJsZUlmQXR0ciAqRUlBID0gY2FzdDxFbmFibGVJZkF0dHI+KCpJKTsKKyAgICBpZiAoIUVJQS0+Z2V0Q29uZCgpLT5FdmFsdWF0ZVdpdGhTdWJzdGl0dXRpb24oCisgICAgICAgICAgICBSZXN1bHQsIENvbnRleHQsIEZ1bmN0aW9uLAorICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8Y29uc3QgRXhwcio+KENvbnZlcnRlZEFyZ3MuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRlZEFyZ3Muc2l6ZSgpKSkgfHwKKyAgICAgICAgIVJlc3VsdC5pc0ludCgpIHx8ICFSZXN1bHQuZ2V0SW50KCkuZ2V0Qm9vbFZhbHVlKCkpIHsKKyAgICAgIHJldHVybiBFSUE7CisgICAgfQorICB9CisgIHJldHVybiAwOwogfQogCiAvLy8gXGJyaWVmIEFkZCBhbGwgb2YgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBpbiB0aGUgZ2l2ZW4gZnVuY3Rpb24gc2V0IHRvCkBAIC01NjU2LDkgKzU3NjYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIENYWFJlY29yZERlY2wgKkFjdGluZ0NvbnRleHQsIFF1YWxUeXBlIE9iamVjdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcjo6Q2xhc3NpZmljYXRpb24gT2JqZWN0Q2xhc3NpZmljYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RXhwciAqPiBBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJsb2FkQ2FuZGlkYXRlU2V0JiBDYW5kaWRhdGVTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGVTZXQgJkNhbmRpZGF0ZVNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN1cHByZXNzVXNlckNvbnZlcnNpb25zKSB7Ci0gIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlKiBQcm90bworICBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqUHJvdG8KICAgICA9IGR5bl9jYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihNZXRob2QtPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpKTsKICAgYXNzZXJ0KFByb3RvICYmICJNZXRob2RzIHdpdGhvdXQgYSBwcm90b3R5cGUgY2Fubm90IGJlIG92ZXJsb2FkZWQiKTsKICAgYXNzZXJ0KCFpc2E8Q1hYQ29uc3RydWN0b3JEZWNsPihNZXRob2QpICYmCkBAIC01Njg1LDEyICs1Nzk1LDEyIEBACiAgIENhbmRpZGF0ZS5JZ25vcmVPYmplY3RBcmd1bWVudCA9IGZhbHNlOwogICBDYW5kaWRhdGUuRXhwbGljaXRDYWxsQXJndW1lbnRzID0gQXJncy5zaXplKCk7CiAKLSAgdW5zaWduZWQgTnVtQXJnc0luUHJvdG8gPSBQcm90by0+Z2V0TnVtQXJncygpOworICB1bnNpZ25lZCBOdW1QYXJhbXMgPSBQcm90by0+Z2V0TnVtUGFyYW1zKCk7CiAKICAgLy8gKEMrKyAxMy4zLjJwMik6IEEgY2FuZGlkYXRlIGZ1bmN0aW9uIGhhdmluZyBmZXdlciB0aGFuIG0KICAgLy8gcGFyYW1ldGVycyBpcyB2aWFibGUgb25seSBpZiBpdCBoYXMgYW4gZWxsaXBzaXMgaW4gaXRzIHBhcmFtZXRlcgogICAvLyBsaXN0ICg4LjMuNSkuCi0gIGlmIChBcmdzLnNpemUoKSA+IE51bUFyZ3NJblByb3RvICYmICFQcm90by0+aXNWYXJpYWRpYygpKSB7CisgIGlmIChBcmdzLnNpemUoKSA+IE51bVBhcmFtcyAmJiAhUHJvdG8tPmlzVmFyaWFkaWMoKSkgewogICAgIENhbmRpZGF0ZS5WaWFibGUgPSBmYWxzZTsKICAgICBDYW5kaWRhdGUuRmFpbHVyZUtpbmQgPSBvdmxfZmFpbF90b29fbWFueV9hcmd1bWVudHM7CiAgICAgcmV0dXJuOwpAQCAtNTczMCwxMiArNTg0MCwxMiBAQAogICAvLyBEZXRlcm1pbmUgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gc2VxdWVuY2VzIGZvciBlYWNoIG9mIHRoZQogICAvLyBhcmd1bWVudHMuCiAgIGZvciAodW5zaWduZWQgQXJnSWR4ID0gMDsgQXJnSWR4IDwgQXJncy5zaXplKCk7ICsrQXJnSWR4KSB7Ci0gICAgaWYgKEFyZ0lkeCA8IE51bUFyZ3NJblByb3RvKSB7CisgICAgaWYgKEFyZ0lkeCA8IE51bVBhcmFtcykgewogICAgICAgLy8gKEMrKyAxMy4zLjJwMyk6IGZvciBGIHRvIGJlIGEgdmlhYmxlIGZ1bmN0aW9uLCB0aGVyZSBzaGFsbAogICAgICAgLy8gZXhpc3QgZm9yIGVhY2ggYXJndW1lbnQgYW4gaW1wbGljaXQgY29udmVyc2lvbiBzZXF1ZW5jZQogICAgICAgLy8gKDEzLjMuMy4xKSB0aGF0IGNvbnZlcnRzIHRoYXQgYXJndW1lbnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgIC8vIHBhcmFtZXRlciBvZiBGLgotICAgICAgUXVhbFR5cGUgUGFyYW1UeXBlID0gUHJvdG8tPmdldEFyZ1R5cGUoQXJnSWR4KTsKKyAgICAgIFF1YWxUeXBlIFBhcmFtVHlwZSA9IFByb3RvLT5nZXRQYXJhbVR5cGUoQXJnSWR4KTsKICAgICAgIENhbmRpZGF0ZS5Db252ZXJzaW9uc1tBcmdJZHggKyAxXQogICAgICAgICA9IFRyeUNvcHlJbml0aWFsaXphdGlvbigqdGhpcywgQXJnc1tBcmdJZHhdLCBQYXJhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHByZXNzVXNlckNvbnZlcnNpb25zLApAQCAtNTc0NSwxNSArNTg1NSwyMiBAQAogICAgICAgaWYgKENhbmRpZGF0ZS5Db252ZXJzaW9uc1tBcmdJZHggKyAxXS5pc0JhZCgpKSB7CiAgICAgICAgIENhbmRpZGF0ZS5WaWFibGUgPSBmYWxzZTsKICAgICAgICAgQ2FuZGlkYXRlLkZhaWx1cmVLaW5kID0gb3ZsX2ZhaWxfYmFkX2NvbnZlcnNpb247Ci0gICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIChDKysgMTMuMy4ycDIpOiBGb3IgdGhlIHB1cnBvc2VzIG9mIG92ZXJsb2FkIHJlc29sdXRpb24sIGFueQogICAgICAgLy8gYXJndW1lbnQgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIGlzCi0gICAgICAvLyBjb25zaWRlcmVkIHRvICIibWF0Y2ggdGhlIGVsbGlwc2lzIiAoQysgMTMuMy4zLjEuMykuCisgICAgICAvLyBjb25zaWRlcmVkIHRvICJtYXRjaCB0aGUgZWxsaXBzaXMiIChDKyAxMy4zLjMuMS4zKS4KICAgICAgIENhbmRpZGF0ZS5Db252ZXJzaW9uc1tBcmdJZHggKyAxXS5zZXRFbGxpcHNpcygpOwogICAgIH0KICAgfQorCisgIGlmIChFbmFibGVJZkF0dHIgKkZhaWxlZEF0dHIgPSBDaGVja0VuYWJsZUlmKE1ldGhvZCwgQXJncywgdHJ1ZSkpIHsKKyAgICBDYW5kaWRhdGUuVmlhYmxlID0gZmFsc2U7CisgICAgQ2FuZGlkYXRlLkZhaWx1cmVLaW5kID0gb3ZsX2ZhaWxfZW5hYmxlX2lmOworICAgIENhbmRpZGF0ZS5EZWR1Y3Rpb25GYWlsdXJlLkRhdGEgPSBGYWlsZWRBdHRyOworICAgIHJldHVybjsKKyAgfQogfQogCiAvLy8gXGJyaWVmIEFkZCBhIEMrKyBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGUgYXMgYSBjYW5kaWRhdGUgdG8gdGhlIGNhbmRpZGF0ZQpAQCAtNTk2OSw3ICs2MDg2LDcgQEAKICAgICByZXR1cm47CiAgIH0KIAotICAvLyBXZSB3b24ndCBnbyB0aHJvdWdoIGEgdXNlci1kZWZpbmUgdHlwZSBjb252ZXJzaW9uIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYQorICAvLyBXZSB3b24ndCBnbyB0aHJvdWdoIGEgdXNlci1kZWZpbmVkIHR5cGUgY29udmVyc2lvbiBmdW5jdGlvbiB0byBjb252ZXJ0IGEKICAgLy8gZGVyaXZlZCB0byBiYXNlIGFzIHN1Y2ggY29udmVyc2lvbnMgYXJlIGdpdmVuIENvbnZlcnNpb24gUmFuay4gVGhleSBvbmx5CiAgIC8vIGdvIHRocm91Z2ggYSBjb3B5IGNvbnN0cnVjdG9yLiAxMy4zLjMuMS4yLXA0IFtvdmVyLmljcy51c2VyXQogICBRdWFsVHlwZSBGcm9tQ2Fub24KQEAgLTYwMjksNiArNjE0Niw3IEBACiAgICAgICAgIEdldENvbnZlcnNpb25SYW5rKElDUy5TdGFuZGFyZC5TZWNvbmQpICE9IElDUl9FeGFjdF9NYXRjaCkgewogICAgICAgQ2FuZGlkYXRlLlZpYWJsZSA9IGZhbHNlOwogICAgICAgQ2FuZGlkYXRlLkZhaWx1cmVLaW5kID0gb3ZsX2ZhaWxfZmluYWxfY29udmVyc2lvbl9ub3RfZXhhY3Q7CisgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgLy8gQysrMHggW2RjbC5pbml0LnJlZl1wNToKQEAgLTYwNDAsMTggKzYxNTgsMjYgQEAKICAgICAgICAgSUNTLlN0YW5kYXJkLkZpcnN0ID09IElDS19MdmFsdWVfVG9fUnZhbHVlKSB7CiAgICAgICBDYW5kaWRhdGUuVmlhYmxlID0gZmFsc2U7CiAgICAgICBDYW5kaWRhdGUuRmFpbHVyZUtpbmQgPSBvdmxfZmFpbF9iYWRfZmluYWxfY29udmVyc2lvbjsKKyAgICAgIHJldHVybjsKICAgICB9CiAgICAgYnJlYWs7CiAKICAgY2FzZSBJbXBsaWNpdENvbnZlcnNpb25TZXF1ZW5jZTo6QmFkQ29udmVyc2lvbjoKICAgICBDYW5kaWRhdGUuVmlhYmxlID0gZmFsc2U7CiAgICAgQ2FuZGlkYXRlLkZhaWx1cmVLaW5kID0gb3ZsX2ZhaWxfYmFkX2ZpbmFsX2NvbnZlcnNpb247Ci0gICAgYnJlYWs7CisgICAgcmV0dXJuOwogCiAgIGRlZmF1bHQ6CiAgICAgbGx2bV91bnJlYWNoYWJsZSgKICAgICAgICAgICAgIkNhbiBvbmx5IGVuZCB1cCB3aXRoIGEgc3RhbmRhcmQgY29udmVyc2lvbiBzZXF1ZW5jZSBvciBmYWlsdXJlIik7CiAgIH0KKworICBpZiAoRW5hYmxlSWZBdHRyICpGYWlsZWRBdHRyID0gQ2hlY2tFbmFibGVJZihDb252ZXJzaW9uLCBBcnJheVJlZjxFeHByKj4oKSkpIHsKKyAgICBDYW5kaWRhdGUuVmlhYmxlID0gZmFsc2U7CisgICAgQ2FuZGlkYXRlLkZhaWx1cmVLaW5kID0gb3ZsX2ZhaWxfZW5hYmxlX2lmOworICAgIENhbmRpZGF0ZS5EZWR1Y3Rpb25GYWlsdXJlLkRhdGEgPSBGYWlsZWRBdHRyOworICAgIHJldHVybjsKKyAgfQogfQogCiAvLy8gXGJyaWVmIEFkZHMgYSBjb252ZXJzaW9uIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uCkBAIC02MTUxLDEyICs2Mjc3LDEyIEBACiAgIENhbmRpZGF0ZS5Db252ZXJzaW9uc1swXS5Vc2VyRGVmaW5lZC5BZnRlci5zZXRBc0lkZW50aXR5Q29udmVyc2lvbigpOwogCiAgIC8vIEZpbmQgdGhlCi0gIHVuc2lnbmVkIE51bUFyZ3NJblByb3RvID0gUHJvdG8tPmdldE51bUFyZ3MoKTsKKyAgdW5zaWduZWQgTnVtUGFyYW1zID0gUHJvdG8tPmdldE51bVBhcmFtcygpOwogCiAgIC8vIChDKysgMTMuMy4ycDIpOiBBIGNhbmRpZGF0ZSBmdW5jdGlvbiBoYXZpbmcgZmV3ZXIgdGhhbiBtCiAgIC8vIHBhcmFtZXRlcnMgaXMgdmlhYmxlIG9ubHkgaWYgaXQgaGFzIGFuIGVsbGlwc2lzIGluIGl0cyBwYXJhbWV0ZXIKICAgLy8gbGlzdCAoOC4zLjUpLgotICBpZiAoQXJncy5zaXplKCkgPiBOdW1BcmdzSW5Qcm90byAmJiAhUHJvdG8tPmlzVmFyaWFkaWMoKSkgeworICBpZiAoQXJncy5zaXplKCkgPiBOdW1QYXJhbXMgJiYgIVByb3RvLT5pc1ZhcmlhZGljKCkpIHsKICAgICBDYW5kaWRhdGUuVmlhYmxlID0gZmFsc2U7CiAgICAgQ2FuZGlkYXRlLkZhaWx1cmVLaW5kID0gb3ZsX2ZhaWxfdG9vX21hbnlfYXJndW1lbnRzOwogICAgIHJldHVybjsKQEAgLTYxNjQsNyArNjI5MCw3IEBACiAKICAgLy8gRnVuY3Rpb24gdHlwZXMgZG9uJ3QgaGF2ZSBhbnkgZGVmYXVsdCBhcmd1bWVudHMsIHNvIGp1c3QgY2hlY2sgaWYKICAgLy8gd2UgaGF2ZSBlbm91Z2ggYXJndW1lbnRzLgotICBpZiAoQXJncy5zaXplKCkgPCBOdW1BcmdzSW5Qcm90bykgeworICBpZiAoQXJncy5zaXplKCkgPCBOdW1QYXJhbXMpIHsKICAgICAvLyBOb3QgZW5vdWdoIGFyZ3VtZW50cy4KICAgICBDYW5kaWRhdGUuVmlhYmxlID0gZmFsc2U7CiAgICAgQ2FuZGlkYXRlLkZhaWx1cmVLaW5kID0gb3ZsX2ZhaWxfdG9vX2Zld19hcmd1bWVudHM7CkBAIC02MTc0LDEyICs2MzAwLDEyIEBACiAgIC8vIERldGVybWluZSB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBzZXF1ZW5jZXMgZm9yIGVhY2ggb2YgdGhlCiAgIC8vIGFyZ3VtZW50cy4KICAgZm9yICh1bnNpZ25lZCBBcmdJZHggPSAwLCBOID0gQXJncy5zaXplKCk7IEFyZ0lkeCAhPSBOOyArK0FyZ0lkeCkgewotICAgIGlmIChBcmdJZHggPCBOdW1BcmdzSW5Qcm90bykgeworICAgIGlmIChBcmdJZHggPCBOdW1QYXJhbXMpIHsKICAgICAgIC8vIChDKysgMTMuMy4ycDMpOiBmb3IgRiB0byBiZSBhIHZpYWJsZSBmdW5jdGlvbiwgdGhlcmUgc2hhbGwKICAgICAgIC8vIGV4aXN0IGZvciBlYWNoIGFyZ3VtZW50IGFuIGltcGxpY2l0IGNvbnZlcnNpb24gc2VxdWVuY2UKICAgICAgIC8vICgxMy4zLjMuMSkgdGhhdCBjb252ZXJ0cyB0aGF0IGFyZ3VtZW50IHRvIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAvLyBwYXJhbWV0ZXIgb2YgRi4KLSAgICAgIFF1YWxUeXBlIFBhcmFtVHlwZSA9IFByb3RvLT5nZXRBcmdUeXBlKEFyZ0lkeCk7CisgICAgICBRdWFsVHlwZSBQYXJhbVR5cGUgPSBQcm90by0+Z2V0UGFyYW1UeXBlKEFyZ0lkeCk7CiAgICAgICBDYW5kaWRhdGUuQ29udmVyc2lvbnNbQXJnSWR4ICsgMV0KICAgICAgICAgPSBUcnlDb3B5SW5pdGlhbGl6YXRpb24oKnRoaXMsIEFyZ3NbQXJnSWR4XSwgUGFyYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlN1cHByZXNzVXNlckNvbnZlcnNpb25zPSovZmFsc2UsCkBAIC02MTg5LDcgKzYzMTUsNyBAQAogICAgICAgaWYgKENhbmRpZGF0ZS5Db252ZXJzaW9uc1tBcmdJZHggKyAxXS5pc0JhZCgpKSB7CiAgICAgICAgIENhbmRpZGF0ZS5WaWFibGUgPSBmYWxzZTsKICAgICAgICAgQ2FuZGlkYXRlLkZhaWx1cmVLaW5kID0gb3ZsX2ZhaWxfYmFkX2NvbnZlcnNpb247Ci0gICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIChDKysgMTMuMy4ycDIpOiBGb3IgdGhlIHB1cnBvc2VzIG9mIG92ZXJsb2FkIHJlc29sdXRpb24sIGFueQpAQCAtNjE5OCw2ICs2MzI0LDEzIEBACiAgICAgICBDYW5kaWRhdGUuQ29udmVyc2lvbnNbQXJnSWR4ICsgMV0uc2V0RWxsaXBzaXMoKTsKICAgICB9CiAgIH0KKworICBpZiAoRW5hYmxlSWZBdHRyICpGYWlsZWRBdHRyID0gQ2hlY2tFbmFibGVJZihDb252ZXJzaW9uLCBBcnJheVJlZjxFeHByKj4oKSkpIHsKKyAgICBDYW5kaWRhdGUuVmlhYmxlID0gZmFsc2U7CisgICAgQ2FuZGlkYXRlLkZhaWx1cmVLaW5kID0gb3ZsX2ZhaWxfZW5hYmxlX2lmOworICAgIENhbmRpZGF0ZS5EZWR1Y3Rpb25GYWlsdXJlLkRhdGEgPSBGYWlsZWRBdHRyOworICAgIHJldHVybjsKKyAgfQogfQogCiAvLy8gXGJyaWVmIEFkZCBvdmVybG9hZCBjYW5kaWRhdGVzIGZvciBvdmVybG9hZGVkIG9wZXJhdG9ycyB0aGF0IGFyZQpAQCAtODEwOSw2ICs4MjQyLDQ3IEBACiAgICAgfQogICB9CiAKKyAgLy8gQ2hlY2sgZm9yIGVuYWJsZV9pZiB2YWx1ZS1iYXNlZCBvdmVybG9hZCByZXNvbHV0aW9uLgorICBpZiAoQ2FuZDEuRnVuY3Rpb24gJiYgQ2FuZDIuRnVuY3Rpb24gJiYKKyAgICAgIChDYW5kMS5GdW5jdGlvbi0+aGFzQXR0cjxFbmFibGVJZkF0dHI+KCkgfHwKKyAgICAgICBDYW5kMi5GdW5jdGlvbi0+aGFzQXR0cjxFbmFibGVJZkF0dHI+KCkpKSB7CisgICAgLy8gRklYTUU6IFRoZSBuZXh0IHNldmVyYWwgbGluZXMgYXJlIGp1c3QKKyAgICAvLyBzcGVjaWZpY19hdHRyX2l0ZXJhdG9yPEVuYWJsZUlmQXR0cj4gYnV0IGdvaW5nIGluIGRlY2xhcmF0aW9uIG9yZGVyLAorICAgIC8vIGluc3RlYWQgb2YgcmV2ZXJzZSBvcmRlciB3aGljaCBpcyBob3cgdGhleSdyZSBzdG9yZWQgaW4gdGhlIEFTVC4KKyAgICBBdHRyVmVjIENhbmQxQXR0cnM7CisgICAgQXR0clZlYzo6aXRlcmF0b3IgQ2FuZDFFID0gQ2FuZDFBdHRycy5lbmQoKTsKKyAgICBpZiAoQ2FuZDEuRnVuY3Rpb24tPmhhc0F0dHJzKCkpIHsKKyAgICAgIENhbmQxQXR0cnMgPSBDYW5kMS5GdW5jdGlvbi0+Z2V0QXR0cnMoKTsKKyAgICAgIENhbmQxRSA9IHN0ZDo6cmVtb3ZlX2lmKENhbmQxQXR0cnMuYmVnaW4oKSwgQ2FuZDFBdHRycy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTm90RW5hYmxlSWZBdHRyKTsKKyAgICAgIHN0ZDo6cmV2ZXJzZShDYW5kMUF0dHJzLmJlZ2luKCksIENhbmQxRSk7CisgICAgfQorCisgICAgQXR0clZlYyBDYW5kMkF0dHJzOworICAgIEF0dHJWZWM6Oml0ZXJhdG9yIENhbmQyRSA9IENhbmQyQXR0cnMuZW5kKCk7CisgICAgaWYgKENhbmQyLkZ1bmN0aW9uLT5oYXNBdHRycygpKSB7CisgICAgICBDYW5kMkF0dHJzID0gQ2FuZDIuRnVuY3Rpb24tPmdldEF0dHJzKCk7CisgICAgICBDYW5kMkUgPSBzdGQ6OnJlbW92ZV9pZihDYW5kMkF0dHJzLmJlZ2luKCksIENhbmQyQXR0cnMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc05vdEVuYWJsZUlmQXR0cik7CisgICAgICBzdGQ6OnJldmVyc2UoQ2FuZDJBdHRycy5iZWdpbigpLCBDYW5kMkUpOworICAgIH0KKyAgICBmb3IgKEF0dHJWZWM6Oml0ZXJhdG9yCisgICAgICAgICBDYW5kMUkgPSBDYW5kMUF0dHJzLmJlZ2luKCksIENhbmQySSA9IENhbmQyQXR0cnMuYmVnaW4oKTsKKyAgICAgICAgIENhbmQxSSAhPSBDYW5kMUUgfHwgQ2FuZDJJICE9IENhbmQyRTsgKytDYW5kMUksICsrQ2FuZDJJKSB7CisgICAgICBpZiAoQ2FuZDFJID09IENhbmQxRSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKENhbmQySSA9PSBDYW5kMkUpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgbGx2bTo6Rm9sZGluZ1NldE5vZGVJRCBDYW5kMUlELCBDYW5kMklEOworICAgICAgY2FzdDxFbmFibGVJZkF0dHI+KCpDYW5kMUkpLT5nZXRDb25kKCktPlByb2ZpbGUoQ2FuZDFJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuZ2V0QVNUQ29udGV4dCgpLCB0cnVlKTsKKyAgICAgIGNhc3Q8RW5hYmxlSWZBdHRyPigqQ2FuZDJJKS0+Z2V0Q29uZCgpLT5Qcm9maWxlKENhbmQySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLmdldEFTVENvbnRleHQoKSwgdHJ1ZSk7CisgICAgICBpZiAoQ2FuZDFJRCAhPSBDYW5kMklEKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC04NTU3LDE4ICs4NzMxLDE4IEBACiAgIC8vIGF0IGxlYXN0IC8gYXQgbW9zdCAvIGV4YWN0bHkKICAgdW5zaWduZWQgbW9kZSwgbW9kZUNvdW50OwogICBpZiAoTnVtRm9ybWFsQXJncyA8IE1pblBhcmFtcykgewotICAgIGlmIChNaW5QYXJhbXMgIT0gRm5UeS0+Z2V0TnVtQXJncygpIHx8Ci0gICAgICAgIEZuVHktPmlzVmFyaWFkaWMoKSB8fCBGblR5LT5pc1RlbXBsYXRlVmFyaWFkaWMoKSkKKyAgICBpZiAoTWluUGFyYW1zICE9IEZuVHktPmdldE51bVBhcmFtcygpIHx8IEZuVHktPmlzVmFyaWFkaWMoKSB8fAorICAgICAgICBGblR5LT5pc1RlbXBsYXRlVmFyaWFkaWMoKSkKICAgICAgIG1vZGUgPSAwOyAvLyAiYXQgbGVhc3QiCiAgICAgZWxzZQogICAgICAgbW9kZSA9IDI7IC8vICJleGFjdGx5IgogICAgIG1vZGVDb3VudCA9IE1pblBhcmFtczsKICAgfSBlbHNlIHsKLSAgICBpZiAoTWluUGFyYW1zICE9IEZuVHktPmdldE51bUFyZ3MoKSkKKyAgICBpZiAoTWluUGFyYW1zICE9IEZuVHktPmdldE51bVBhcmFtcygpKQogICAgICAgbW9kZSA9IDE7IC8vICJhdCBtb3N0IgogICAgIGVsc2UKICAgICAgIG1vZGUgPSAyOyAvLyAiZXhhY3RseSIKLSAgICBtb2RlQ291bnQgPSBGblR5LT5nZXROdW1BcmdzKCk7CisgICAgbW9kZUNvdW50ID0gRm5UeS0+Z2V0TnVtUGFyYW1zKCk7CiAgIH0KIAogICBzdGQ6OnN0cmluZyBEZXNjcmlwdGlvbjsKQEAgLTg4MTcsNiArODk5MSwxNSBAQAogICAgICAgPDwgKHVuc2lnbmVkKSBGbktpbmQgPDwgQ2FsbGVlVGFyZ2V0IDw8IENhbGxlclRhcmdldDsKIH0KIAordm9pZCBEaWFnbm9zZUZhaWxlZEVuYWJsZUlmQXR0cihTZW1hICZTLCBPdmVybG9hZENhbmRpZGF0ZSAqQ2FuZCkgeworICBGdW5jdGlvbkRlY2wgKkNhbGxlZSA9IENhbmQtPkZ1bmN0aW9uOworICBFbmFibGVJZkF0dHIgKkF0dHIgPSBzdGF0aWNfY2FzdDxFbmFibGVJZkF0dHIqPihDYW5kLT5EZWR1Y3Rpb25GYWlsdXJlLkRhdGEpOworCisgIFMuRGlhZyhDYWxsZWUtPmdldExvY2F0aW9uKCksCisgICAgICAgICBkaWFnOjpub3RlX292bF9jYW5kaWRhdGVfZGlzYWJsZWRfYnlfZW5hYmxlX2lmX2F0dHIpCisgICAgICA8PCBBdHRyLT5nZXRDb25kKCktPmdldFNvdXJjZVJhbmdlKCkgPDwgQXR0ci0+Z2V0TWVzc2FnZSgpOworfQorCiAvLy8gR2VuZXJhdGVzIGEgJ25vdGUnIGRpYWdub3N0aWMgZm9yIGFuIG92ZXJsb2FkIGNhbmRpZGF0ZS4gIFdlJ3ZlCiAvLy8gYWxyZWFkeSBnZW5lcmF0ZWQgYSBwcmltYXJ5IGVycm9yIGF0IHRoZSBjYWxsIHNpdGUuCiAvLy8KQEAgLTg4ODAsNiArOTA2Myw5IEBACiAKICAgY2FzZSBvdmxfZmFpbF9iYWRfdGFyZ2V0OgogICAgIHJldHVybiBEaWFnbm9zZUJhZFRhcmdldChTLCBDYW5kKTsKKworICBjYXNlIG92bF9mYWlsX2VuYWJsZV9pZjoKKyAgICByZXR1cm4gRGlhZ25vc2VGYWlsZWRFbmFibGVJZkF0dHIoUywgQ2FuZCk7CiAgIH0KIH0KIApAQCAtOTE2MCwxNSArOTM0NiwxNCBAQAogICB9CiAKICAgLy8gRmlsbCBpbiB0aGUgcmVzdCBvZiB0aGUgY29udmVyc2lvbnMuCi0gIHVuc2lnbmVkIE51bUFyZ3NJblByb3RvID0gUHJvdG8tPmdldE51bUFyZ3MoKTsKKyAgdW5zaWduZWQgTnVtUGFyYW1zID0gUHJvdG8tPmdldE51bVBhcmFtcygpOwogICBmb3IgKDsgQ29udklkeCAhPSBDb252Q291bnQ7ICsrQ29udklkeCwgKytBcmdJZHgpIHsKLSAgICBpZiAoQXJnSWR4IDwgTnVtQXJnc0luUHJvdG8pIHsKLSAgICAgIENhbmQtPkNvbnZlcnNpb25zW0NvbnZJZHhdCi0gICAgICAgID0gVHJ5Q29weUluaXRpYWxpemF0aW9uKFMsIEFyZ3NbQXJnSWR4XSwgUHJvdG8tPmdldEFyZ1R5cGUoQXJnSWR4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcHJlc3NVc2VyQ29udmVyc2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSW5PdmVybG9hZFJlc29sdXRpb249Ki90cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkFsbG93T2JqQ1dyaXRlYmFja0NvbnZlcnNpb249Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLmdldExhbmdPcHRzKCkuT2JqQ0F1dG9SZWZDb3VudCk7CisgICAgaWYgKEFyZ0lkeCA8IE51bVBhcmFtcykgeworICAgICAgQ2FuZC0+Q29udmVyc2lvbnNbQ29udklkeF0gPSBUcnlDb3B5SW5pdGlhbGl6YXRpb24oCisgICAgICAgICAgUywgQXJnc1tBcmdJZHhdLCBQcm90by0+Z2V0UGFyYW1UeXBlKEFyZ0lkeCksIFN1cHByZXNzVXNlckNvbnZlcnNpb25zLAorICAgICAgICAgIC8qSW5PdmVybG9hZFJlc29sdXRpb249Ki90cnVlLAorICAgICAgICAgIC8qQWxsb3dPYmpDV3JpdGViYWNrQ29udmVyc2lvbj0qLworICAgICAgICAgIFMuZ2V0TGFuZ09wdHMoKS5PYmpDQXV0b1JlZkNvdW50KTsKICAgICAgIC8vIFN0b3JlIHRoZSBGaXhJdCBpbiB0aGUgY2FuZGlkYXRlIGlmIGl0IGV4aXN0cy4KICAgICAgIGlmICghVW5maXhhYmxlICYmIENhbmQtPkNvbnZlcnNpb25zW0NvbnZJZHhdLmlzQmFkKCkpCiAgICAgICAgIFVuZml4YWJsZSA9ICFDYW5kLT5UcnlUb0ZpeEJhZENvbnZlcnNpb24oQ29udklkeCwgUyk7CkBAIC05MzIwLDcgKzk1MDUsNyBAQAogICBmb3IgKGl0ZXJhdG9yIENhbmQgPSBiZWdpbigpLCBMYXN0Q2FuZCA9IGVuZCgpOyBDYW5kICE9IExhc3RDYW5kOyArK0NhbmQpIHsKICAgICBpZiAoQ2FuZC0+U3BlY2lhbGl6YXRpb24pCiAgICAgICBDYW5kcy5wdXNoX2JhY2soQ2FuZCk7Ci0gICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgbm9uIG1hdGNoaW5nIGJ1aWx0aW4gY2FuZGlkYXRlLiAgV2UgZG8gbm90LAorICAgIC8vIE90aGVyd2lzZSwgdGhpcyBpcyBhIG5vbi1tYXRjaGluZyBidWlsdGluIGNhbmRpZGF0ZS4gIFdlIGRvIG5vdCwKICAgICAvLyBpbiBnZW5lcmFsLCB3YW50IHRvIGxpc3QgZXZlcnkgcG9zc2libGUgYnVpbHRpbiBjYW5kaWRhdGUuCiAgIH0KIApAQCAtOTUzMSw3ICs5NzE2LDcgQEAKICAgICAgIC8vIElmIGFueSBjYW5kaWRhdGUgaGFzIGEgcGxhY2Vob2xkZXIgcmV0dXJuIHR5cGUsIHRyaWdnZXIgaXRzIGRlZHVjdGlvbgogICAgICAgLy8gbm93LgogICAgICAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxeSAmJgotICAgICAgICAgIEZ1bkRlY2wtPmdldFJlc3VsdFR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCkgJiYKKyAgICAgICAgICBGdW5EZWNsLT5nZXRSZXR1cm5UeXBlKCktPmlzVW5kZWR1Y2VkVHlwZSgpICYmCiAgICAgICAgICAgUy5EZWR1Y2VSZXR1cm5UeXBlKEZ1bkRlY2wsIFNvdXJjZUV4cHItPmdldExvY1N0YXJ0KCksIENvbXBsYWluKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC05ODM2LDcgKzEwMDIxLDcgQEAKICAgfQogCiAgIGlmIChNYXRjaGVkICYmIGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMXkgJiYKLSAgICAgIE1hdGNoZWQtPmdldFJlc3VsdFR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCkgJiYKKyAgICAgIE1hdGNoZWQtPmdldFJldHVyblR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCkgJiYKICAgICAgIERlZHVjZVJldHVyblR5cGUoTWF0Y2hlZCwgb3ZsLT5nZXRFeHByTG9jKCksIENvbXBsYWluKSkKICAgICByZXR1cm4gMDsKIApAQCAtMTAxOTgsNyArMTAzODMsNyBAQAogICBMb29rdXBSZXN1bHQgUihTZW1hUmVmLCBVTEUtPmdldE5hbWUoKSwgVUxFLT5nZXROYW1lTG9jKCksCiAgICAgICAgICAgICAgICAgIFNlbWE6Okxvb2t1cE9yZGluYXJ5TmFtZSk7CiAgIEZ1bmN0aW9uQ2FsbEZpbHRlckNDQyBWYWxpZGF0b3IoU2VtYVJlZiwgQXJncy5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbGljaXRUZW1wbGF0ZUFyZ3MgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbGljaXRUZW1wbGF0ZUFyZ3MgIT0gMCwgZmFsc2UpOwogICBOb1R5cG9Db3JyZWN0aW9uQ0NDIFJlamVjdEFsbDsKICAgQ29ycmVjdGlvbkNhbmRpZGF0ZUNhbGxiYWNrICpDQ0MgPSBBbGxvd1R5cG9Db3JyZWN0aW9uID8KICAgICAgIChDb3JyZWN0aW9uQ2FuZGlkYXRlQ2FsbGJhY2sqKSZWYWxpZGF0b3IgOgpAQCAtMTAyODAsNyArMTA0NjUsNyBAQAogICAgIC8vIGNyZWF0ZSBhIHR5cGUgZGVwZW5kZW50IENhbGxFeHByLiBUaGUgZ29hbCBpcyB0byBwb3N0cG9uZSBuYW1lIGxvb2t1cAogICAgIC8vIHRvIGluc3RhbnRpYXRpb24gdGltZSB0byBiZSBhYmxlIHRvIHNlYXJjaCBpbnRvIHR5cGUgZGVwZW5kZW50IGJhc2UKICAgICAvLyBjbGFzc2VzLgotICAgIGlmIChnZXRMYW5nT3B0cygpLk1pY3Jvc29mdE1vZGUgJiYgQ3VyQ29udGV4dC0+aXNEZXBlbmRlbnRDb250ZXh0KCkgJiYgCisgICAgaWYgKGdldExhbmdPcHRzKCkuTVNWQ0NvbXBhdCAmJiBDdXJDb250ZXh0LT5pc0RlcGVuZGVudENvbnRleHQoKSAmJgogICAgICAgICAoaXNhPEZ1bmN0aW9uRGVjbD4oQ3VyQ29udGV4dCkgfHwgaXNhPENYWFJlY29yZERlY2w+KEN1ckNvbnRleHQpKSkgewogICAgICAgQ2FsbEV4cHIgKkNFID0gbmV3IChDb250ZXh0KSBDYWxsRXhwcihDb250ZXh0LCBGbiwgQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5EZXBlbmRlbnRUeSwgVktfUlZhbHVlLApAQCAtMTA1MzAsNyArMTA3MTUsNyBAQAogICAgICAgICByZXR1cm4gRXhwckVycm9yKCk7CiAKICAgICAgIC8vIERldGVybWluZSB0aGUgcmVzdWx0IHR5cGUuCi0gICAgICBRdWFsVHlwZSBSZXN1bHRUeSA9IEZuRGVjbC0+Z2V0UmVzdWx0VHlwZSgpOworICAgICAgUXVhbFR5cGUgUmVzdWx0VHkgPSBGbkRlY2wtPmdldFJldHVyblR5cGUoKTsKICAgICAgIEV4cHJWYWx1ZUtpbmQgVksgPSBFeHByOjpnZXRWYWx1ZUtpbmRGb3JUeXBlKFJlc3VsdFR5KTsKICAgICAgIFJlc3VsdFR5ID0gUmVzdWx0VHkuZ2V0Tm9uTFZhbHVlRXhwclR5cGUoQ29udGV4dCk7CiAKQEAgLTEwNTM5LDggKzEwNzI0LDcgQEAKICAgICAgICAgbmV3IChDb250ZXh0KSBDWFhPcGVyYXRvckNhbGxFeHByKENvbnRleHQsIE9wLCBGbkV4cHIudGFrZSgpLCBBcmdzQXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRUeSwgVkssIE9wTG9jLCBmYWxzZSk7CiAKLSAgICAgIGlmIChDaGVja0NhbGxSZXR1cm5UeXBlKEZuRGVjbC0+Z2V0UmVzdWx0VHlwZSgpLCBPcExvYywgVGhlQ2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZuRGVjbCkpCisgICAgICBpZiAoQ2hlY2tDYWxsUmV0dXJuVHlwZShGbkRlY2wtPmdldFJldHVyblR5cGUoKSwgT3BMb2MsIFRoZUNhbGwsIEZuRGVjbCkpCiAgICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKIAogICAgICAgcmV0dXJuIE1heWJlQmluZFRvVGVtcG9yYXJ5KFRoZUNhbGwpOwpAQCAtMTA3NjUsNyArMTA5NDksNyBAQAogICAgICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKIAogICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIHJlc3VsdCB0eXBlLgotICAgICAgICBRdWFsVHlwZSBSZXN1bHRUeSA9IEZuRGVjbC0+Z2V0UmVzdWx0VHlwZSgpOworICAgICAgICBRdWFsVHlwZSBSZXN1bHRUeSA9IEZuRGVjbC0+Z2V0UmV0dXJuVHlwZSgpOwogICAgICAgICBFeHByVmFsdWVLaW5kIFZLID0gRXhwcjo6Z2V0VmFsdWVLaW5kRm9yVHlwZShSZXN1bHRUeSk7CiAgICAgICAgIFJlc3VsdFR5ID0gUmVzdWx0VHkuZ2V0Tm9uTFZhbHVlRXhwclR5cGUoQ29udGV4dCk7CiAKQEAgLTEwNzc0LDcgKzEwOTU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncywgUmVzdWx0VHksIFZLLCBPcExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBGZWF0dXJlcy5mcF9jb250cmFjdCk7CiAKLSAgICAgICAgaWYgKENoZWNrQ2FsbFJldHVyblR5cGUoRm5EZWNsLT5nZXRSZXN1bHRUeXBlKCksIE9wTG9jLCBUaGVDYWxsLAorICAgICAgICBpZiAoQ2hlY2tDYWxsUmV0dXJuVHlwZShGbkRlY2wtPmdldFJldHVyblR5cGUoKSwgT3BMb2MsIFRoZUNhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZuRGVjbCkpCiAgICAgICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogCkBAIC0xMDk4MSw3ICsxMTE2NSw3IEBACiAgICAgICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogCiAgICAgICAgIC8vIERldGVybWluZSB0aGUgcmVzdWx0IHR5cGUKLSAgICAgICAgUXVhbFR5cGUgUmVzdWx0VHkgPSBGbkRlY2wtPmdldFJlc3VsdFR5cGUoKTsKKyAgICAgICAgUXVhbFR5cGUgUmVzdWx0VHkgPSBGbkRlY2wtPmdldFJldHVyblR5cGUoKTsKICAgICAgICAgRXhwclZhbHVlS2luZCBWSyA9IEV4cHI6OmdldFZhbHVlS2luZEZvclR5cGUoUmVzdWx0VHkpOwogICAgICAgICBSZXN1bHRUeSA9IFJlc3VsdFR5LmdldE5vbkxWYWx1ZUV4cHJUeXBlKENvbnRleHQpOwogCkBAIC0xMDk5MSw4ICsxMTE3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFR5LCBWSywgUkxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogCi0gICAgICAgIGlmIChDaGVja0NhbGxSZXR1cm5UeXBlKEZuRGVjbC0+Z2V0UmVzdWx0VHlwZSgpLCBMTG9jLCBUaGVDYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbkRlY2wpKQorICAgICAgICBpZiAoQ2hlY2tDYWxsUmV0dXJuVHlwZShGbkRlY2wtPmdldFJldHVyblR5cGUoKSwgTExvYywgVGhlQ2FsbCwgRm5EZWNsKSkKICAgICAgICAgICByZXR1cm4gRXhwckVycm9yKCk7CiAKICAgICAgICAgcmV0dXJuIE1heWJlQmluZFRvVGVtcG9yYXJ5KFRoZUNhbGwpOwpAQCAtMTEwODQsNyArMTEyNjcsNyBAQAogCiAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKnByb3RvID0gZm5UeXBlLT5jYXN0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CiAgICAgUXVhbFR5cGUgcmVzdWx0VHlwZSA9IHByb3RvLT5nZXRDYWxsUmVzdWx0VHlwZShDb250ZXh0KTsKLSAgICBFeHByVmFsdWVLaW5kIHZhbHVlS2luZCA9IEV4cHI6OmdldFZhbHVlS2luZEZvclR5cGUocHJvdG8tPmdldFJlc3VsdFR5cGUoKSk7CisgICAgRXhwclZhbHVlS2luZCB2YWx1ZUtpbmQgPSBFeHByOjpnZXRWYWx1ZUtpbmRGb3JUeXBlKHByb3RvLT5nZXRSZXR1cm5UeXBlKCkpOwogCiAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgb2JqZWN0IHR5cGUgaXNuJ3QgbW9yZSBxdWFsaWZpZWQgdGhhbiB0aGUKICAgICAvLyBtZW1iZXIgZnVuY3Rpb24gd2UncmUgY2FsbGluZy4KQEAgLTExMTA1LDEzICsxMTI4OCwxMiBAQAogICAgICAgICA8PCBxdWFsc1N0cmluZwogICAgICAgICA8PCAocXVhbHNTdHJpbmcuZmluZCgnICcpID09IHN0ZDo6c3RyaW5nOjpucG9zID8gMSA6IDIpOwogICAgIH0KLSAgICAgICAgICAgICAgCisKICAgICBDWFhNZW1iZXJDYWxsRXhwciAqY2FsbAogICAgICAgPSBuZXcgKENvbnRleHQpIENYWE1lbWJlckNhbGxFeHByKENvbnRleHQsIE1lbUV4cHJFLCBBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFR5cGUsIHZhbHVlS2luZCwgUlBhcmVuTG9jKTsKIAotICAgIGlmIChDaGVja0NhbGxSZXR1cm5UeXBlKHByb3RvLT5nZXRSZXN1bHRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AtPmdldFJIUygpLT5nZXRMb2NTdGFydCgpLAorICAgIGlmIChDaGVja0NhbGxSZXR1cm5UeXBlKHByb3RvLT5nZXRSZXR1cm5UeXBlKCksIG9wLT5nZXRSSFMoKS0+Z2V0TG9jU3RhcnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsLCAwKSkKICAgICAgIHJldHVybiBFeHByRXJyb3IoKTsKIApAQCAtMTEyNTAsNyArMTE0MzIsNyBAQAogICAgIE1lbUV4cHIgPSBjYXN0PE1lbWJlckV4cHI+KE1lbUV4cHJFLT5JZ25vcmVQYXJlbnMoKSk7CiAgIH0KIAotICBRdWFsVHlwZSBSZXN1bHRUeXBlID0gTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCk7CisgIFF1YWxUeXBlIFJlc3VsdFR5cGUgPSBNZXRob2QtPmdldFJldHVyblR5cGUoKTsKICAgRXhwclZhbHVlS2luZCBWSyA9IEV4cHI6OmdldFZhbHVlS2luZEZvclR5cGUoUmVzdWx0VHlwZSk7CiAgIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLmdldE5vbkxWYWx1ZUV4cHJUeXBlKENvbnRleHQpOwogCkBAIC0xMTI2MCw3ICsxMTQ0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRUeXBlLCBWSywgUlBhcmVuTG9jKTsKIAogICAvLyBDaGVjayBmb3IgYSB2YWxpZCByZXR1cm4gdHlwZS4KLSAgaWYgKENoZWNrQ2FsbFJldHVyblR5cGUoTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCksIE1lbUV4cHItPmdldE1lbWJlckxvYygpLAorICBpZiAoQ2hlY2tDYWxsUmV0dXJuVHlwZShNZXRob2QtPmdldFJldHVyblR5cGUoKSwgTWVtRXhwci0+Z2V0TWVtYmVyTG9jKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZUNhbGwsIE1ldGhvZCkpCiAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogCkBAIC0xMTQ4OSw3ICsxMTY3MSw3IEBACiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpQcm90byA9CiAgICAgTWV0aG9kLT5nZXRUeXBlKCktPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOwogCi0gIHVuc2lnbmVkIE51bUFyZ3NJblByb3RvID0gUHJvdG8tPmdldE51bUFyZ3MoKTsKKyAgdW5zaWduZWQgTnVtUGFyYW1zID0gUHJvdG8tPmdldE51bVBhcmFtcygpOwogCiAgIERlY2xhcmF0aW9uTmFtZUluZm8gT3BMb2NJbmZvKAogICAgICAgICAgICAgICAgQ29udGV4dC5EZWNsYXJhdGlvbk5hbWVzLmdldENYWE9wZXJhdG9yTmFtZShPT19DYWxsKSwgTFBhcmVuTG9jKTsKQEAgLTExNTAzLDEzICsxMTY4NSwxMyBAQAogCiAgIC8vIEJ1aWxkIHRoZSBmdWxsIGFyZ3VtZW50IGxpc3QgZm9yIHRoZSBtZXRob2QgY2FsbCAodGhlIGltcGxpY2l0IG9iamVjdAogICAvLyBwYXJhbWV0ZXIgaXMgcGxhY2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QpLgotICBsbHZtOjpPd25pbmdBcnJheVB0cjxFeHByICo+IE1ldGhvZEFyZ3MobmV3IEV4cHIqW0FyZ3Muc2l6ZSgpICsgMV0pOworICBzdGQ6OnVuaXF1ZV9wdHI8RXhwciAqIFtdPiBNZXRob2RBcmdzKG5ldyBFeHByICpbQXJncy5zaXplKCkgKyAxXSk7CiAgIE1ldGhvZEFyZ3NbMF0gPSBPYmplY3QuZ2V0KCk7CiAgIHN0ZDo6Y29weShBcmdzLmJlZ2luKCksIEFyZ3MuZW5kKCksICZNZXRob2RBcmdzWzFdKTsKIAogICAvLyBPbmNlIHdlJ3ZlIGJ1aWx0IFRoZUNhbGwsIGFsbCBvZiB0aGUgZXhwcmVzc2lvbnMgYXJlIHByb3Blcmx5CiAgIC8vIG93bmVkLgotICBRdWFsVHlwZSBSZXN1bHRUeSA9IE1ldGhvZC0+Z2V0UmVzdWx0VHlwZSgpOworICBRdWFsVHlwZSBSZXN1bHRUeSA9IE1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpOwogICBFeHByVmFsdWVLaW5kIFZLID0gRXhwcjo6Z2V0VmFsdWVLaW5kRm9yVHlwZShSZXN1bHRUeSk7CiAgIFJlc3VsdFR5ID0gUmVzdWx0VHkuZ2V0Tm9uTFZhbHVlRXhwclR5cGUoQ29udGV4dCk7CiAKQEAgLTExNTE5LDE0ICsxMTcwMSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRUeSwgVkssIFJQYXJlbkxvYywgZmFsc2UpOwogICBNZXRob2RBcmdzLnJlc2V0KCk7CiAKLSAgaWYgKENoZWNrQ2FsbFJldHVyblR5cGUoTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCksIExQYXJlbkxvYywgVGhlQ2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kKSkKKyAgaWYgKENoZWNrQ2FsbFJldHVyblR5cGUoTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCksIExQYXJlbkxvYywgVGhlQ2FsbCwgTWV0aG9kKSkKICAgICByZXR1cm4gdHJ1ZTsKIAogICAvLyBXZSBtYXkgaGF2ZSBkZWZhdWx0IGFyZ3VtZW50cy4gSWYgc28sIHdlIG5lZWQgdG8gYWxsb2NhdGUgbW9yZQogICAvLyBzbG90cyBpbiB0aGUgY2FsbCBmb3IgdGhlbS4KLSAgaWYgKEFyZ3Muc2l6ZSgpIDwgTnVtQXJnc0luUHJvdG8pCi0gICAgVGhlQ2FsbC0+c2V0TnVtQXJncyhDb250ZXh0LCBOdW1BcmdzSW5Qcm90byArIDEpOworICBpZiAoQXJncy5zaXplKCkgPCBOdW1QYXJhbXMpCisgICAgVGhlQ2FsbC0+c2V0TnVtQXJncyhDb250ZXh0LCBOdW1QYXJhbXMgKyAxKTsKIAogICBib29sIElzRXJyb3IgPSBmYWxzZTsKIApAQCAtMTE1NDEsNyArMTE3MjIsNyBAQAogICBUaGVDYWxsLT5zZXRBcmcoMCwgT2JqZWN0LnRha2UoKSk7CiAKICAgLy8gQ2hlY2sgdGhlIGFyZ3VtZW50IHR5cGVzLgotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUFyZ3NJblByb3RvOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1QYXJhbXM7IGkrKykgewogICAgIEV4cHIgKkFyZzsKICAgICBpZiAoaSA8IEFyZ3Muc2l6ZSgpKSB7CiAgICAgICBBcmcgPSBBcmdzW2ldOwpAQCAtMTE1NzMsNyArMTE3NTQsNyBAQAogICAvLyBJZiB0aGlzIGlzIGEgdmFyaWFkaWMgY2FsbCwgaGFuZGxlIGFyZ3MgcGFzc2VkIHRocm91Z2ggIi4uLiIuCiAgIGlmIChQcm90by0+aXNWYXJpYWRpYygpKSB7CiAgICAgLy8gUHJvbW90ZSB0aGUgYXJndW1lbnRzIChDOTkgNi41LjIuMnA3KS4KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSBOdW1BcmdzSW5Qcm90bywgZSA9IEFyZ3Muc2l6ZSgpOyBpIDwgZTsgaSsrKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gTnVtUGFyYW1zLCBlID0gQXJncy5zaXplKCk7IGkgPCBlOyBpKyspIHsKICAgICAgIEV4cHJSZXN1bHQgQXJnID0gRGVmYXVsdFZhcmlhZGljQXJndW1lbnRQcm9tb3Rpb24oQXJnc1tpXSwgVmFyaWFkaWNNZXRob2QsIDApOwogICAgICAgSXNFcnJvciB8PSBBcmcuaXNJbnZhbGlkKCk7CiAgICAgICBUaGVDYWxsLT5zZXRBcmcoaSArIDEsIEFyZy50YWtlKCkpOwpAQCAtMTE2OTIsMTUgKzExODczLDE0IEBACiAgIGlmIChGbkV4cHIuaXNJbnZhbGlkKCkpCiAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogCi0gIFF1YWxUeXBlIFJlc3VsdFR5ID0gTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCk7CisgIFF1YWxUeXBlIFJlc3VsdFR5ID0gTWV0aG9kLT5nZXRSZXR1cm5UeXBlKCk7CiAgIEV4cHJWYWx1ZUtpbmQgVksgPSBFeHByOjpnZXRWYWx1ZUtpbmRGb3JUeXBlKFJlc3VsdFR5KTsKICAgUmVzdWx0VHkgPSBSZXN1bHRUeS5nZXROb25MVmFsdWVFeHByVHlwZShDb250ZXh0KTsKICAgQ1hYT3BlcmF0b3JDYWxsRXhwciAqVGhlQ2FsbCA9CiAgICAgbmV3IChDb250ZXh0KSBDWFhPcGVyYXRvckNhbGxFeHByKENvbnRleHQsIE9PX0Fycm93LCBGbkV4cHIudGFrZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlLCBSZXN1bHRUeSwgVkssIE9wTG9jLCBmYWxzZSk7CiAKLSAgaWYgKENoZWNrQ2FsbFJldHVyblR5cGUoTWV0aG9kLT5nZXRSZXN1bHRUeXBlKCksIE9wTG9jLCBUaGVDYWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QpKQorICBpZiAoQ2hlY2tDYWxsUmV0dXJuVHlwZShNZXRob2QtPmdldFJldHVyblR5cGUoKSwgT3BMb2MsIFRoZUNhbGwsIE1ldGhvZCkpCiAgICAgICAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogCiAgIHJldHVybiBNYXliZUJpbmRUb1RlbXBvcmFyeShUaGVDYWxsKTsKQEAgLTExNzYxLDcgKzExOTQxLDcgQEAKICAgICBDb252QXJnc1tBcmdJZHhdID0gSW5wdXRJbml0LnRha2UoKTsKICAgfQogCi0gIFF1YWxUeXBlIFJlc3VsdFR5ID0gRkQtPmdldFJlc3VsdFR5cGUoKTsKKyAgUXVhbFR5cGUgUmVzdWx0VHkgPSBGRC0+Z2V0UmV0dXJuVHlwZSgpOwogICBFeHByVmFsdWVLaW5kIFZLID0gRXhwcjo6Z2V0VmFsdWVLaW5kRm9yVHlwZShSZXN1bHRUeSk7CiAgIFJlc3VsdFR5ID0gUmVzdWx0VHkuZ2V0Tm9uTFZhbHVlRXhwclR5cGUoQ29udGV4dCk7CiAKQEAgLTExNzcwLDcgKzExOTUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjptYWtlQXJyYXlSZWYoQ29udkFyZ3MsIEFyZ3Muc2l6ZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRUeSwgVkssIExpdEVuZExvYywgVURTdWZmaXhMb2MpOwogCi0gIGlmIChDaGVja0NhbGxSZXR1cm5UeXBlKEZELT5nZXRSZXN1bHRUeXBlKCksIFVEU3VmZml4TG9jLCBVREwsIEZEKSkKKyAgaWYgKENoZWNrQ2FsbFJldHVyblR5cGUoRkQtPmdldFJldHVyblR5cGUoKSwgVURTdWZmaXhMb2MsIFVETCwgRkQpKQogICAgIHJldHVybiBFeHByRXJyb3IoKTsKIAogICBpZiAoQ2hlY2tGdW5jdGlvbkNhbGwoRkQsIFVETCwgTlVMTCkpCkBAIC0xMTg5Myw3ICsxMjA3Myw3IEBACiAgICAgICAgIC8vIERvIG5vdGhpbmc6IHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIGFyZW4ndCBhbnkgZGlmZmVyZW50CiAgICAgICAgIC8vIGZyb20gbm9uLW1lbWJlciBmdW5jdGlvbnMuCiAgICAgICB9IGVsc2UgewotICAgICAgICAvLyBGaXggdGhlIHN1YiBleHByZXNzaW9uLCB3aGljaCByZWFsbHkgaGFzIHRvIGJlIGFuCisgICAgICAgIC8vIEZpeCB0aGUgc3ViZXhwcmVzc2lvbiwgd2hpY2ggcmVhbGx5IGhhcyB0byBiZSBhbgogICAgICAgICAvLyBVbnJlc29sdmVkTG9va3VwRXhwciBob2xkaW5nIGFuIG92ZXJsb2FkZWQgbWVtYmVyIGZ1bmN0aW9uCiAgICAgICAgIC8vIG9yIHRlbXBsYXRlLgogICAgICAgICBFeHByICpTdWJFeHByID0gRml4T3ZlcmxvYWRlZEZ1bmN0aW9uUmVmZXJlbmNlKFVuT3AtPmdldFN1YkV4cHIoKSwKZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1NlbWFQc2V1ZG9PYmplY3QuY3BwIGIvbGliL1NlbWEvU2VtYVBzZXVkb09iamVjdC5jcHAKaW5kZXggYWY3NGYwZC4uZGUwMmZhOSAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYVBzZXVkb09iamVjdC5jcHAKKysrIGIvbGliL1NlbWEvU2VtYVBzZXVkb09iamVjdC5jcHAKQEAgLTIzNSw3ICsyMzUsMTAgQEAKICAgICB9CiAKICAgICAvLy8gUmV0dXJuIHRydWUgaWYgYXNzaWdubWVudHMgaGF2ZSBhIG5vbi12b2lkIHJlc3VsdC4KLSAgICBib29sIENhbkNhcHR1cmVWYWx1ZU9mVHlwZShRdWFsVHlwZSB0eSkgeworICAgIGJvb2wgQ2FuQ2FwdHVyZVZhbHVlKEV4cHIgKmV4cCkgeworICAgICAgaWYgKGV4cC0+aXNHTFZhbHVlKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgUXVhbFR5cGUgdHkgPSBleHAtPmdldFR5cGUoKTsKICAgICAgIGFzc2VydCghdHktPmlzSW5jb21wbGV0ZVR5cGUoKSk7CiAgICAgICBhc3NlcnQoIXR5LT5pc0RlcGVuZGVudFR5cGUoKSk7CiAKQEAgLTI4MCwxMCArMjgzLDEwIEBACiAgICAgYm9vbCBmaW5kU2V0dGVyKGJvb2wgd2Fybj10cnVlKTsKICAgICBib29sIGZpbmRHZXR0ZXIoKTsKIAotICAgIEV4cHIgKnJlYnVpbGRBbmRDYXB0dXJlT2JqZWN0KEV4cHIgKnN5bnRhY3RpY0Jhc2UpOwotICAgIEV4cHJSZXN1bHQgYnVpbGRHZXQoKTsKLSAgICBFeHByUmVzdWx0IGJ1aWxkU2V0KEV4cHIgKm9wLCBTb3VyY2VMb2NhdGlvbiwgYm9vbCk7Ci0gICAgRXhwclJlc3VsdCBjb21wbGV0ZShFeHByICpTeW50YWN0aWNGb3JtKTsKKyAgICBFeHByICpyZWJ1aWxkQW5kQ2FwdHVyZU9iamVjdChFeHByICpzeW50YWN0aWNCYXNlKSBvdmVycmlkZTsKKyAgICBFeHByUmVzdWx0IGJ1aWxkR2V0KCkgb3ZlcnJpZGU7CisgICAgRXhwclJlc3VsdCBidWlsZFNldChFeHByICpvcCwgU291cmNlTG9jYXRpb24sIGJvb2wpIG92ZXJyaWRlOworICAgIEV4cHJSZXN1bHQgY29tcGxldGUoRXhwciAqU3ludGFjdGljRm9ybSkgb3ZlcnJpZGU7CiAKICAgICBib29sIGlzV2Vha1Byb3BlcnR5KCkgY29uc3Q7CiAgIH07CkBAIC0zMTEsMTMgKzMxNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gb3BMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcktpbmQgb3Bjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwciAqTEhTLCBFeHByICpSSFMpOwotICAgRXhwciAqcmVidWlsZEFuZENhcHR1cmVPYmplY3QoRXhwciAqc3ludGFjdGljQmFzZSk7Ci0gICAKKyAgIEV4cHIgKnJlYnVpbGRBbmRDYXB0dXJlT2JqZWN0KEV4cHIgKnN5bnRhY3RpY0Jhc2UpIG92ZXJyaWRlOworCiAgICBib29sIGZpbmRBdEluZGV4R2V0dGVyKCk7CiAgICBib29sIGZpbmRBdEluZGV4U2V0dGVyKCk7Ci0gIAotICAgRXhwclJlc3VsdCBidWlsZEdldCgpOwotICAgRXhwclJlc3VsdCBidWlsZFNldChFeHByICpvcCwgU291cmNlTG9jYXRpb24sIGJvb2wpOworCisgICBFeHByUmVzdWx0IGJ1aWxkR2V0KCkgb3ZlcnJpZGU7CisgICBFeHByUmVzdWx0IGJ1aWxkU2V0KEV4cHIgKm9wLCBTb3VyY2VMb2NhdGlvbiwgYm9vbCkgb3ZlcnJpZGU7CiAgfTsKIAogIGNsYXNzIE1TUHJvcGVydHlPcEJ1aWxkZXIgOiBwdWJsaWMgUHNldWRvT3BCdWlsZGVyIHsKQEAgLTMyOCw5ICszMzEsOSBAQAogICAgICBQc2V1ZG9PcEJ1aWxkZXIoUywgcmVmRXhwci0+Z2V0U291cmNlUmFuZ2UoKS5nZXRCZWdpbigpKSwKICAgICAgUmVmRXhwcihyZWZFeHByKSB7fQogCi0gICBFeHByICpyZWJ1aWxkQW5kQ2FwdHVyZU9iamVjdChFeHByICopOwotICAgRXhwclJlc3VsdCBidWlsZEdldCgpOwotICAgRXhwclJlc3VsdCBidWlsZFNldChFeHByICpvcCwgU291cmNlTG9jYXRpb24sIGJvb2wpOworICAgRXhwciAqcmVidWlsZEFuZENhcHR1cmVPYmplY3QoRXhwciAqKSBvdmVycmlkZTsKKyAgIEV4cHJSZXN1bHQgYnVpbGRHZXQoKSBvdmVycmlkZTsKKyAgIEV4cHJSZXN1bHQgYnVpbGRTZXQoRXhwciAqb3AsIFNvdXJjZUxvY2F0aW9uLCBib29sKSBvdmVycmlkZTsKICB9OwogfQogCkBAIC00NjEsNyArNDY0LDcgQEAKIAogICAvLyBUaGF0J3MgdGhlIHBvc3RmaXggcmVzdWx0LgogICBpZiAoVW5hcnlPcGVyYXRvcjo6aXNQb3N0Zml4KG9wY29kZSkgJiYKLSAgICAgIChyZXN1bHQuZ2V0KCktPmlzVHlwZURlcGVuZGVudCgpIHx8IENhbkNhcHR1cmVWYWx1ZU9mVHlwZShyZXN1bHRUeXBlKSkpIHsKKyAgICAgIChyZXN1bHQuZ2V0KCktPmlzVHlwZURlcGVuZGVudCgpIHx8IENhbkNhcHR1cmVWYWx1ZShyZXN1bHQuZ2V0KCkpKSkgewogICAgIHJlc3VsdCA9IGNhcHR1cmUocmVzdWx0LnRha2UoKSk7CiAgICAgc2V0UmVzdWx0VG9MYXN0U2VtYW50aWMoKTsKICAgfQpAQCAtNTQwLDcgKzU0Myw3IEBACiAKICAgICBUID0gUHJvcC0+Z2V0VHlwZSgpOwogICB9IGVsc2UgaWYgKEdldHRlcikgewotICAgIFQgPSBHZXR0ZXItPmdldFJlc3VsdFR5cGUoKTsKKyAgICBUID0gR2V0dGVyLT5nZXRSZXR1cm5UeXBlKCk7CiAgIH0gZWxzZSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CkBAIC02MjEsNyArNjI0LDcgQEAKICAgICAgICAgaWYgKE9iakNQcm9wZXJ0eURlY2wgKnByb3AxID0gSUZhY2UtPkZpbmRQcm9wZXJ0eURlY2xhcmF0aW9uKEFsdE1lbWJlcikpCiAgICAgICAgICAgaWYgKHByb3AgIT0gcHJvcDEgJiYgKHByb3AxLT5nZXRTZXR0ZXJNZXRob2REZWNsKCkgPT0gc2V0dGVyKSkgewogICAgICAgICAgICAgUy5EaWFnKFJlZkV4cHItPmdldEV4cHJMb2MoKSwgZGlhZzo6ZXJyb3JfcHJvcGVydHlfc2V0dGVyX2FtYmlndW91c191c2UpCi0gICAgICAgICAgICAgIDw8IHByb3AtPmdldE5hbWUoKSA8PCBwcm9wMS0+Z2V0TmFtZSgpIDw8IHNldHRlci0+Z2V0U2VsZWN0b3IoKTsKKyAgICAgICAgICAgICAgPDwgcHJvcCA8PCBwcm9wMSA8PCBzZXR0ZXItPmdldFNlbGVjdG9yKCk7CiAgICAgICAgICAgICBTLkRpYWcocHJvcC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcm9wZXJ0eV9kZWNsYXJlKTsKICAgICAgICAgICAgIFMuRGlhZyhwcm9wMS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcm9wZXJ0eV9kZWNsYXJlKTsKICAgICAgICAgICB9CkBAIC03NjIsNyArNzY1LDcgQEAKICAgICBPYmpDTWVzc2FnZUV4cHIgKm1zZ0V4cHIgPQogICAgICAgY2FzdDxPYmpDTWVzc2FnZUV4cHI+KG1zZy5nZXQoKS0+SWdub3JlSW1wbGljaXQoKSk7CiAgICAgRXhwciAqYXJnID0gbXNnRXhwci0+Z2V0QXJnKDApOwotICAgIGlmIChDYW5DYXB0dXJlVmFsdWVPZlR5cGUoYXJnLT5nZXRUeXBlKCkpKQorICAgIGlmIChDYW5DYXB0dXJlVmFsdWUoYXJnKSkKICAgICAgIG1zZ0V4cHItPnNldEFyZygwLCBjYXB0dXJlVmFsdWVBc1Jlc3VsdChhcmcpKTsKICAgfQogCkBAIC04MTMsNyArODE2LDcgQEAKICAgYXNzZXJ0KEdldHRlciAmJiAicHJvcGVydHkgaGFzIG5vIHNldHRlciBhbmQgbm8gZ2V0dGVyISIpOwogCiAgIC8vIE9ubHkgZG8gdGhpcyBpZiB0aGUgZ2V0dGVyIHJldHVybnMgYW4gbC12YWx1ZSByZWZlcmVuY2UgdHlwZS4KLSAgUXVhbFR5cGUgcmVzdWx0VHlwZSA9IEdldHRlci0+Z2V0UmVzdWx0VHlwZSgpOworICBRdWFsVHlwZSByZXN1bHRUeXBlID0gR2V0dGVyLT5nZXRSZXR1cm5UeXBlKCk7CiAgIGlmICghcmVzdWx0VHlwZS0+aXNMVmFsdWVSZWZlcmVuY2VUeXBlKCkpIHJldHVybiBmYWxzZTsKIAogICByZXN1bHQgPSBidWlsZFJWYWx1ZU9wZXJhdGlvbihvcCk7CkBAIC0xMDExLDggKzEwMTQsNiBAQAogICAKICAgLy8gTG9vayBmb3IgYSBjb252ZXJzaW9uIHRvIGFuIGludGVncmFsLCBlbnVtZXJhdGlvbiB0eXBlLCBvcgogICAvLyBvYmplY3RpdmUtQyBwb2ludGVyIHR5cGUuCi0gIFVucmVzb2x2ZWRTZXQ8ND4gVmlhYmxlQ29udmVyc2lvbnM7Ci0gIFVucmVzb2x2ZWRTZXQ8ND4gRXhwbGljaXRDb252ZXJzaW9uczsKICAgc3RkOjpwYWlyPENYWFJlY29yZERlY2w6OmNvbnZlcnNpb25faXRlcmF0b3IsCiAgICAgICAgICAgICBDWFhSZWNvcmREZWNsOjpjb252ZXJzaW9uX2l0ZXJhdG9yPiBDb252ZXJzaW9ucwogICAgID0gY2FzdDxDWFhSZWNvcmREZWNsPihSZWNvcmRUeS0+Z2V0RGVjbCgpKS0+Z2V0VmlzaWJsZUNvbnZlcnNpb25GdW5jdGlvbnMoKTsKQEAgLTExNzIsNyArMTE3Myw3IEBACiAgICAgICAgICAgICAgZGlhZzo6bm90ZV9wYXJhbWV0ZXJfdHlwZSkgPDwgVDsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgUXVhbFR5cGUgUiA9IEF0SW5kZXhHZXR0ZXItPmdldFJlc3VsdFR5cGUoKTsKKyAgICBRdWFsVHlwZSBSID0gQXRJbmRleEdldHRlci0+Z2V0UmV0dXJuVHlwZSgpOwogICAgIGlmICghUi0+aXNPYmpDT2JqZWN0UG9pbnRlclR5cGUoKSkgewogICAgICAgUy5EaWFnKFJlZkV4cHItPmdldEtleUV4cHIoKS0+Z2V0RXhwckxvYygpLAogICAgICAgICAgICAgIGRpYWc6OmVycl9vYmpjX2luZGV4aW5nX21ldGhvZF9yZXN1bHRfdHlwZSkgPDwgUiA8PCBhcnJheVJlZjsKQEAgLTEyMzksMTggKzEyNDAsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVC0+aXNPYmpDUXVhbGlmaWVkSWRUeXBlKCkpOwogCiAgIGlmICghQXRJbmRleFNldHRlciAmJiBTLmdldExhbmdPcHRzKCkuRGVidWdnZXJPYmpDTGl0ZXJhbCkgewotICAgIFR5cGVTb3VyY2VJbmZvICpSZXN1bHRUSW5mbyA9IDA7CisgICAgVHlwZVNvdXJjZUluZm8gKlJldHVyblRJbmZvID0gMDsKICAgICBRdWFsVHlwZSBSZXR1cm5UeXBlID0gUy5Db250ZXh0LlZvaWRUeTsKLSAgICBBdEluZGV4U2V0dGVyID0gT2JqQ01ldGhvZERlY2w6OkNyZWF0ZShTLkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBBdEluZGV4U2V0dGVyU2VsZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0VEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTLkNvbnRleHQuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKkluc3RhbmNlKi8sIGZhbHNlLyppc1ZhcmlhZGljKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlzUHJvcGVydHlBY2Nlc3Nvcj0qL2ZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppc0ltcGxpY2l0bHlEZWNsYXJlZD0qL3RydWUsIC8qaXNEZWZpbmVkPSovZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpDTWV0aG9kRGVjbDo6UmVxdWlyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7IAorICAgIEF0SW5kZXhTZXR0ZXIgPSBPYmpDTWV0aG9kRGVjbDo6Q3JlYXRlKAorICAgICAgICBTLkNvbnRleHQsIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIEF0SW5kZXhTZXR0ZXJTZWxlY3RvciwKKyAgICAgICAgUmV0dXJuVHlwZSwgUmV0dXJuVEluZm8sIFMuQ29udGV4dC5nZXRUcmFuc2xhdGlvblVuaXREZWNsKCksCisgICAgICAgIHRydWUgLypJbnN0YW5jZSovLCBmYWxzZSAvKmlzVmFyaWFkaWMqLywKKyAgICAgICAgLyppc1Byb3BlcnR5QWNjZXNzb3I9Ki9mYWxzZSwKKyAgICAgICAgLyppc0ltcGxpY2l0bHlEZWNsYXJlZD0qL3RydWUsIC8qaXNEZWZpbmVkPSovZmFsc2UsCisgICAgICAgIE9iakNNZXRob2REZWNsOjpSZXF1aXJlZCwgZmFsc2UpOwogICAgIFNtYWxsVmVjdG9yPFBhcm1WYXJEZWNsICosIDI+IFBhcmFtczsKICAgICBQYXJtVmFyRGVjbCAqb2JqZWN0ID0gUGFybVZhckRlY2w6OkNyZWF0ZShTLkNvbnRleHQsIEF0SW5kZXhTZXR0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBTb3VyY2VMb2NhdGlvbigpLApAQCAtMTM3Myw3ICsxMzcxLDcgQEAKICAgICBPYmpDTWVzc2FnZUV4cHIgKm1zZ0V4cHIgPQogICAgICAgY2FzdDxPYmpDTWVzc2FnZUV4cHI+KG1zZy5nZXQoKS0+SWdub3JlSW1wbGljaXQoKSk7CiAgICAgRXhwciAqYXJnID0gbXNnRXhwci0+Z2V0QXJnKDApOwotICAgIGlmIChDYW5DYXB0dXJlVmFsdWVPZlR5cGUoYXJnLT5nZXRUeXBlKCkpKQorICAgIGlmIChDYW5DYXB0dXJlVmFsdWUoYXJnKSkKICAgICAgIG1zZ0V4cHItPnNldEFyZygwLCBjYXB0dXJlVmFsdWVBc1Jlc3VsdChhcmcpKTsKICAgfQogICAKQEAgLTEzOTUsOCArMTM5Myw4IEBACiAKIEV4cHJSZXN1bHQgTVNQcm9wZXJ0eU9wQnVpbGRlcjo6YnVpbGRHZXQoKSB7CiAgIGlmICghUmVmRXhwci0+Z2V0UHJvcGVydHlEZWNsKCktPmhhc0dldHRlcigpKSB7Ci0gICAgUy5EaWFnKFJlZkV4cHItPmdldE1lbWJlckxvYygpLCBkaWFnOjplcnJfbm9fZ2V0dGVyX2Zvcl9wcm9wZXJ0eSkKLSAgICAgIDw8IFJlZkV4cHItPmdldFByb3BlcnR5RGVjbCgpLT5nZXROYW1lKCk7CisgICAgUy5EaWFnKFJlZkV4cHItPmdldE1lbWJlckxvYygpLCBkaWFnOjplcnJfbm9fYWNjZXNzb3JfZm9yX3Byb3BlcnR5KQorICAgICAgPDwgMCAvKiBnZXR0ZXIgKi8gPDwgUmVmRXhwci0+Z2V0UHJvcGVydHlEZWNsKCk7CiAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogICB9CiAKQEAgLTE0MTAsOCArMTQwOCw5IEBACiAgICAgUmVmRXhwci0+aXNBcnJvdygpID8gdG9rOjphcnJvdyA6IHRvazo6cGVyaW9kLCBTUywgU291cmNlTG9jYXRpb24oKSwKICAgICBHZXR0ZXJOYW1lLCAwLCB0cnVlKTsKICAgaWYgKEdldHRlckV4cHIuaXNJbnZhbGlkKCkpIHsKLSAgICBTLkRpYWcoUmVmRXhwci0+Z2V0TWVtYmVyTG9jKCksIGRpYWc6OmVycm9yX2Nhbm5vdF9maW5kX3N1aXRhYmxlX2dldHRlcikKLSAgICAgIDw8IFJlZkV4cHItPmdldFByb3BlcnR5RGVjbCgpLT5nZXROYW1lKCk7CisgICAgUy5EaWFnKFJlZkV4cHItPmdldE1lbWJlckxvYygpLAorICAgICAgICAgICBkaWFnOjplcnJvcl9jYW5ub3RfZmluZF9zdWl0YWJsZV9hY2Nlc3NvcikgPDwgMCAvKiBnZXR0ZXIgKi8KKyAgICAgIDw8IFJlZkV4cHItPmdldFByb3BlcnR5RGVjbCgpOwogICAgIHJldHVybiBFeHByRXJyb3IoKTsKICAgfQogCkBAIC0xNDI0LDggKzE0MjMsOCBAQAogRXhwclJlc3VsdCBNU1Byb3BlcnR5T3BCdWlsZGVyOjpidWlsZFNldChFeHByICpvcCwgU291cmNlTG9jYXRpb24gc2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FwdHVyZVNldFZhbHVlQXNSZXN1bHQpIHsKICAgaWYgKCFSZWZFeHByLT5nZXRQcm9wZXJ0eURlY2woKS0+aGFzU2V0dGVyKCkpIHsKLSAgICBTLkRpYWcoUmVmRXhwci0+Z2V0TWVtYmVyTG9jKCksIGRpYWc6OmVycl9ub19zZXR0ZXJfZm9yX3Byb3BlcnR5KQotICAgICAgPDwgUmVmRXhwci0+Z2V0UHJvcGVydHlEZWNsKCktPmdldE5hbWUoKTsKKyAgICBTLkRpYWcoUmVmRXhwci0+Z2V0TWVtYmVyTG9jKCksIGRpYWc6OmVycl9ub19hY2Nlc3Nvcl9mb3JfcHJvcGVydHkpCisgICAgICA8PCAxIC8qIHNldHRlciAqLyA8PCBSZWZFeHByLT5nZXRQcm9wZXJ0eURlY2woKTsKICAgICByZXR1cm4gRXhwckVycm9yKCk7CiAgIH0KIApAQCAtMTQzOSw4ICsxNDM4LDkgQEAKICAgICBSZWZFeHByLT5pc0Fycm93KCkgPyB0b2s6OmFycm93IDogdG9rOjpwZXJpb2QsIFNTLCBTb3VyY2VMb2NhdGlvbigpLAogICAgIFNldHRlck5hbWUsIDAsIHRydWUpOwogICBpZiAoU2V0dGVyRXhwci5pc0ludmFsaWQoKSkgewotICAgIFMuRGlhZyhSZWZFeHByLT5nZXRNZW1iZXJMb2MoKSwgZGlhZzo6ZXJyb3JfY2Fubm90X2ZpbmRfc3VpdGFibGVfc2V0dGVyKQotICAgICAgPDwgUmVmRXhwci0+Z2V0UHJvcGVydHlEZWNsKCktPmdldE5hbWUoKTsKKyAgICBTLkRpYWcoUmVmRXhwci0+Z2V0TWVtYmVyTG9jKCksCisgICAgICAgICAgIGRpYWc6OmVycm9yX2Nhbm5vdF9maW5kX3N1aXRhYmxlX2FjY2Vzc29yKSA8PCAxIC8qIHNldHRlciAqLworICAgICAgPDwgUmVmRXhwci0+Z2V0UHJvcGVydHlEZWNsKCk7CiAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1NlbWFTdG10LmNwcCBiL2xpYi9TZW1hL1NlbWFTdG10LmNwcAppbmRleCA5YmQ4Njc4Li4yYmU1ZDVjIDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hU3RtdC5jcHAKKysrIGIvbGliL1NlbWEvU2VtYVN0bXQuY3BwCkBAIC0xMTQsMjUgKzExNCwzOCBAQAogICB9CiB9CiAKLS8vLyBcYnJpZWYgRGlhZ25vc2UgdW51c2VkICc9PScgYW5kICchPScgYXMgbGlrZWx5IHR5cG9zIGZvciAnPScgb3IgJ3w9Jy4KKy8vLyBcYnJpZWYgRGlhZ25vc2UgdW51c2VkIGNvbXBhcmlzb25zLCBib3RoIGJ1aWx0aW4gYW5kIG92ZXJsb2FkZWQgb3BlcmF0b3JzLgorLy8vIEZvciAnPT0nIGFuZCAnIT0nLCBzdWdnZXN0IGZpeGl0cyBmb3IgJz0nIG9yICd8PScuCiAvLy8KIC8vLyBBZGRpbmcgYSBjYXN0IHRvIHZvaWQgKG9yIG90aGVyIGV4cHJlc3Npb24gd3JhcHBlcnMpIHdpbGwgcHJldmVudCB0aGUKIC8vLyB3YXJuaW5nIGZyb20gZmlyaW5nLgogc3RhdGljIGJvb2wgRGlhZ25vc2VVbnVzZWRDb21wYXJpc29uKFNlbWEgJlMsIGNvbnN0IEV4cHIgKkUpIHsKICAgU291cmNlTG9jYXRpb24gTG9jOwotICBib29sIElzTm90RXF1YWwsIENhbkFzc2lnbjsKKyAgYm9vbCBJc05vdEVxdWFsLCBDYW5Bc3NpZ24sIElzUmVsYXRpb25hbDsKIAogICBpZiAoY29uc3QgQmluYXJ5T3BlcmF0b3IgKk9wID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KEUpKSB7Ci0gICAgaWYgKE9wLT5nZXRPcGNvZGUoKSAhPSBCT19FUSAmJiBPcC0+Z2V0T3Bjb2RlKCkgIT0gQk9fTkUpCisgICAgaWYgKCFPcC0+aXNDb21wYXJpc29uT3AoKSkKICAgICAgIHJldHVybiBmYWxzZTsKIAorICAgIElzUmVsYXRpb25hbCA9IE9wLT5pc1JlbGF0aW9uYWxPcCgpOwogICAgIExvYyA9IE9wLT5nZXRPcGVyYXRvckxvYygpOwogICAgIElzTm90RXF1YWwgPSBPcC0+Z2V0T3Bjb2RlKCkgPT0gQk9fTkU7CiAgICAgQ2FuQXNzaWduID0gT3AtPmdldExIUygpLT5JZ25vcmVQYXJlbkltcENhc3RzKCktPmlzTFZhbHVlKCk7CiAgIH0gZWxzZSBpZiAoY29uc3QgQ1hYT3BlcmF0b3JDYWxsRXhwciAqT3AgPSBkeW5fY2FzdDxDWFhPcGVyYXRvckNhbGxFeHByPihFKSkgewotICAgIGlmIChPcC0+Z2V0T3BlcmF0b3IoKSAhPSBPT19FcXVhbEVxdWFsICYmCi0gICAgICAgIE9wLT5nZXRPcGVyYXRvcigpICE9IE9PX0V4Y2xhaW1FcXVhbCkKKyAgICBzd2l0Y2ggKE9wLT5nZXRPcGVyYXRvcigpKSB7CisgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIE9PX0VxdWFsRXF1YWw6CisgICAgY2FzZSBPT19FeGNsYWltRXF1YWw6CisgICAgICBJc1JlbGF0aW9uYWwgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgT09fTGVzczoKKyAgICBjYXNlIE9PX0dyZWF0ZXI6CisgICAgY2FzZSBPT19HcmVhdGVyRXF1YWw6CisgICAgY2FzZSBPT19MZXNzRXF1YWw6CisgICAgICBJc1JlbGF0aW9uYWwgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQogCiAgICAgTG9jID0gT3AtPmdldE9wZXJhdG9yTG9jKCk7CiAgICAgSXNOb3RFcXVhbCA9IE9wLT5nZXRPcGVyYXRvcigpID09IE9PX0V4Y2xhaW1FcXVhbDsKQEAgLTE0OCwxMSArMTYxLDExIEBACiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIFMuRGlhZyhMb2MsIGRpYWc6Ondhcm5fdW51c2VkX2NvbXBhcmlzb24pCi0gICAgPDwgKHVuc2lnbmVkKUlzTm90RXF1YWwgPDwgRS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICA8PCAodW5zaWduZWQpSXNSZWxhdGlvbmFsIDw8ICh1bnNpZ25lZClJc05vdEVxdWFsIDw8IEUtPmdldFNvdXJjZVJhbmdlKCk7CiAKICAgLy8gSWYgdGhlIExIUyBpcyBhIHBsYXVzaWJsZSBlbnRpdHkgdG8gYXNzaWduIHRvLCBwcm92aWRlIGEgZml4aXQgaGludCB0bwogICAvLyBjb3JyZWN0IGNvbW1vbiB0eXBvcy4KLSAgaWYgKENhbkFzc2lnbikgeworICBpZiAoIUlzUmVsYXRpb25hbCAmJiBDYW5Bc3NpZ24pIHsKICAgICBpZiAoSXNOb3RFcXVhbCkKICAgICAgIFMuRGlhZyhMb2MsIGRpYWc6Om5vdGVfaW5lcXVhbGl0eV9jb21wYXJpc29uX3RvX29yX2Fzc2lnbikKICAgICAgICAgPDwgRml4SXRIaW50OjpDcmVhdGVSZXBsYWNlbWVudChMb2MsICJ8PSIpOwpAQCAtMjE2LDE3ICsyMjksMTcgQEAKICAgICAvLyBpcyB3cml0dGVuIGluIGEgbWFjcm8gYm9keSwgb25seSB3YXJuIGlmIGl0IGhhcyB0aGUgd2Fybl91bnVzZWRfcmVzdWx0CiAgICAgLy8gYXR0cmlidXRlLgogICAgIGlmIChjb25zdCBEZWNsICpGRCA9IENFLT5nZXRDYWxsZWVEZWNsKCkpIHsKLSAgICAgIGlmIChGRC0+Z2V0QXR0cjxXYXJuVW51c2VkUmVzdWx0QXR0cj4oKSkgeworICAgICAgaWYgKEZELT5oYXNBdHRyPFdhcm5VbnVzZWRSZXN1bHRBdHRyPigpKSB7CiAgICAgICAgIERpYWcoTG9jLCBkaWFnOjp3YXJuX3VudXNlZF9yZXN1bHQpIDw8IFIxIDw8IFIyOwogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgICBpZiAoU2hvdWxkU3VwcHJlc3MpCiAgICAgICAgIHJldHVybjsKLSAgICAgIGlmIChGRC0+Z2V0QXR0cjxQdXJlQXR0cj4oKSkgeworICAgICAgaWYgKEZELT5oYXNBdHRyPFB1cmVBdHRyPigpKSB7CiAgICAgICAgIERpYWcoTG9jLCBkaWFnOjp3YXJuX3VudXNlZF9jYWxsKSA8PCBSMSA8PCBSMiA8PCAicHVyZSI7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KLSAgICAgIGlmIChGRC0+Z2V0QXR0cjxDb25zdEF0dHI+KCkpIHsKKyAgICAgIGlmIChGRC0+aGFzQXR0cjxDb25zdEF0dHI+KCkpIHsKICAgICAgICAgRGlhZyhMb2MsIGRpYWc6Ondhcm5fdW51c2VkX2NhbGwpIDw8IFIxIDw8IFIyIDw8ICJjb25zdCI7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KQEAgLTI0MCw3ICsyNTMsNyBAQAogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqTUQgPSBNRS0+Z2V0TWV0aG9kRGVjbCgpOwotICAgIGlmIChNRCAmJiBNRC0+Z2V0QXR0cjxXYXJuVW51c2VkUmVzdWx0QXR0cj4oKSkgeworICAgIGlmIChNRCAmJiBNRC0+aGFzQXR0cjxXYXJuVW51c2VkUmVzdWx0QXR0cj4oKSkgewogICAgICAgRGlhZyhMb2MsIGRpYWc6Ondhcm5fdW51c2VkX3Jlc3VsdCkgPDwgUjEgPDwgUjI7CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDk5LDcgKzUxMiw2IEBACiAgICAgLy8gV2UgZG9uJ3QgZGlhZ25vc2UgdGhpcyBvdmVyZmxvdywgYmVjYXVzZSBpdCBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkCiAgICAgLy8gYmVoYXZpb3IuCiAgICAgLy8gRklYTUU6IEludHJvZHVjZSBhIHNlY29uZCwgZGVmYXVsdC1pZ25vcmVkIHdhcm5pbmcgZm9yIHRoaXMgY2FzZT8KLSAgICBsbHZtOjpBUFNJbnQgT2xkVmFsKFZhbCk7CiAgICAgVmFsLnNldElzU2lnbmVkKE5ld1NpZ24pOwogICB9CiB9CkBAIC01ODksNDEgKzYwMSw0MSBAQAogICAgICAgICA6IElDRUNvbnZlcnREaWFnbm9zZXIoLypBbGxvd1Njb3BlZEVudW1lcmF0aW9ucyovdHJ1ZSwgZmFsc2UsIHRydWUpLAogICAgICAgICAgIENvbmQoQ29uZCkge30KIAotICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlTm90SW50KFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUKSB7CisgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlTm90SW50KFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCkgb3ZlcnJpZGUgewogICAgICAgcmV0dXJuIFMuRGlhZyhMb2MsIGRpYWc6OmVycl90eXBlY2hlY2tfc3RhdGVtZW50X3JlcXVpcmVzX2ludGVnZXIpIDw8IFQ7CiAgICAgfQogCi0gICAgdmlydHVhbCBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VJbmNvbXBsZXRlKAotICAgICAgICBTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIHsKKyAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VJbmNvbXBsZXRlKAorICAgICAgICBTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIG92ZXJyaWRlIHsKICAgICAgIHJldHVybiBTLkRpYWcoTG9jLCBkaWFnOjplcnJfc3dpdGNoX2luY29tcGxldGVfY2xhc3NfdHlwZSkKICAgICAgICAgICAgICAgIDw8IFQgPDwgQ29uZC0+Z2V0U291cmNlUmFuZ2UoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUV4cGxpY2l0Q29udigKLSAgICAgICAgU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBULCBRdWFsVHlwZSBDb252VHkpIHsKKyAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgZGlhZ25vc2VFeHBsaWNpdENvbnYoCisgICAgICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCwgUXVhbFR5cGUgQ29udlR5KSBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gUy5EaWFnKExvYywgZGlhZzo6ZXJyX3N3aXRjaF9leHBsaWNpdF9jb252ZXJzaW9uKSA8PCBUIDw8IENvbnZUeTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlciBub3RlRXhwbGljaXRDb252KAotICAgICAgICBTZW1hICZTLCBDWFhDb252ZXJzaW9uRGVjbCAqQ29udiwgUXVhbFR5cGUgQ29udlR5KSB7CisgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIG5vdGVFeHBsaWNpdENvbnYoCisgICAgICAgIFNlbWEgJlMsIENYWENvbnZlcnNpb25EZWNsICpDb252LCBRdWFsVHlwZSBDb252VHkpIG92ZXJyaWRlIHsKICAgICAgIHJldHVybiBTLkRpYWcoQ29udi0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9zd2l0Y2hfY29udmVyc2lvbikKICAgICAgICAgPDwgQ29udlR5LT5pc0VudW1lcmFsVHlwZSgpIDw8IENvbnZUeTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUFtYmlndW91cyhTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgVCkgeworICAgIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUFtYmlndW91cyhTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIFQpIG92ZXJyaWRlIHsKICAgICAgIHJldHVybiBTLkRpYWcoTG9jLCBkaWFnOjplcnJfc3dpdGNoX211bHRpcGxlX2NvbnZlcnNpb25zKSA8PCBUOwogICAgIH0KIAotICAgIHZpcnR1YWwgU2VtYURpYWdub3N0aWNCdWlsZGVyIG5vdGVBbWJpZ3VvdXMoCi0gICAgICAgIFNlbWEgJlMsIENYWENvbnZlcnNpb25EZWNsICpDb252LCBRdWFsVHlwZSBDb252VHkpIHsKKyAgICBTZW1hRGlhZ25vc3RpY0J1aWxkZXIgbm90ZUFtYmlndW91cygKKyAgICAgICAgU2VtYSAmUywgQ1hYQ29udmVyc2lvbkRlY2wgKkNvbnYsIFF1YWxUeXBlIENvbnZUeSkgb3ZlcnJpZGUgewogICAgICAgcmV0dXJuIFMuRGlhZyhDb252LT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3N3aXRjaF9jb252ZXJzaW9uKQogICAgICAgPDwgQ29udlR5LT5pc0VudW1lcmFsVHlwZSgpIDw8IENvbnZUeTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIFNlbWFEaWFnbm9zdGljQnVpbGRlciBkaWFnbm9zZUNvbnZlcnNpb24oCi0gICAgICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywgUXVhbFR5cGUgVCwgUXVhbFR5cGUgQ29udlR5KSB7CisgICAgU2VtYURpYWdub3N0aWNCdWlsZGVyIGRpYWdub3NlQ29udmVyc2lvbigKKyAgICAgICAgU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBULCBRdWFsVHlwZSBDb252VHkpIG92ZXJyaWRlIHsKICAgICAgIGxsdm1fdW5yZWFjaGFibGUoImNvbnZlcnNpb24gZnVuY3Rpb25zIGFyZSBwZXJtaXR0ZWQiKTsKICAgICB9CiAgIH0gU3dpdGNoRGlhZ25vc2VyKENvbmQpOwpAQCAtNjYwLDYgKzY3MiwyOSBAQAogICBWYWwuc2V0SXNTaWduZWQoSXNTaWduZWQpOwogfQogCisvLy8gUmV0dXJucyB0cnVlIGlmIHdlIHNob3VsZCBlbWl0IGEgZGlhZ25vc3RpYyBhYm91dCB0aGlzIGNhc2UgZXhwcmVzc2lvbiBub3QKKy8vLyBiZWluZyBhIHBhcnQgb2YgdGhlIGVudW0gdXNlZCBpbiB0aGUgc3dpdGNoIGNvbnRyb2xsaW5nIGV4cHJlc3Npb24uCitzdGF0aWMgYm9vbCBTaG91bGREaWFnbm9zZVN3aXRjaENhc2VOb3RJbkVudW0oY29uc3QgQVNUQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1EZWNsICpFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpDYXNlRXhwcikgeworICAvLyBEb24ndCB3YXJuIGlmIHRoZSAnY2FzZScgZXhwcmVzc2lvbiByZWZlcnMgdG8gYSBzdGF0aWMgY29uc3QgdmFyaWFibGUgb2YKKyAgLy8gdGhlIGVudW0gdHlwZS4KKyAgQ2FzZUV4cHIgPSBDYXNlRXhwci0+SWdub3JlUGFyZW5JbXBDYXN0cygpOworICBpZiAoY29uc3QgRGVjbFJlZkV4cHIgKkRSRSA9IGR5bl9jYXN0PERlY2xSZWZFeHByPihDYXNlRXhwcikpIHsKKyAgICBpZiAoY29uc3QgVmFyRGVjbCAqVkQgPSBkeW5fY2FzdDxWYXJEZWNsPihEUkUtPmdldERlY2woKSkpIHsKKyAgICAgIGlmICghVkQtPmhhc0dsb2JhbFN0b3JhZ2UoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBRdWFsVHlwZSBWYXJUeXBlID0gVkQtPmdldFR5cGUoKTsKKyAgICAgIGlmICghVmFyVHlwZS5pc0NvbnN0UXVhbGlmaWVkKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgUXVhbFR5cGUgRW51bVR5cGUgPSBDdHguZ2V0VHlwZURlY2xUeXBlKEVEKTsKKyAgICAgIGlmIChDdHguaGFzU2FtZVVucXVhbGlmaWVkVHlwZShFbnVtVHlwZSwgVmFyVHlwZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKIFN0bXRSZXN1bHQKIFNlbWE6OkFjdE9uRmluaXNoU3dpdGNoU3RtdChTb3VyY2VMb2NhdGlvbiBTd2l0Y2hMb2MsIFN0bXQgKlN3aXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG10ICpCb2R5U3RtdCkgewpAQCAtOTkzLDExICsxMDI4LDEwIEBACiAKICAgICAgIC8vIEdhdGhlciBhbGwgZW51bSB2YWx1ZXMsIHNldCB0aGVpciB0eXBlIGFuZCBzb3J0IHRoZW0sCiAgICAgICAvLyBhbGxvd2luZyBlYXNpZXIgY29tcGFyaXNvbiB3aXRoIENhc2VWYWxzLgotICAgICAgZm9yIChFbnVtRGVjbDo6ZW51bWVyYXRvcl9pdGVyYXRvciBFREkgPSBFRC0+ZW51bWVyYXRvcl9iZWdpbigpOwotICAgICAgICAgICBFREkgIT0gRUQtPmVudW1lcmF0b3JfZW5kKCk7ICsrRURJKSB7CisgICAgICBmb3IgKGF1dG8gKkVESSA6IEVELT5lbnVtZXJhdG9ycygpKSB7CiAgICAgICAgIGxsdm06OkFQU0ludCBWYWwgPSBFREktPmdldEluaXRWYWwoKTsKICAgICAgICAgQWRqdXN0QVBTSW50KFZhbCwgQ29uZFdpZHRoLCBDb25kSXNTaWduZWQpOwotICAgICAgICBFbnVtVmFscy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoVmFsLCAqRURJKSk7CisgICAgICAgIEVudW1WYWxzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihWYWwsIEVESSkpOwogICAgICAgfQogICAgICAgc3RkOjpzdGFibGVfc29ydChFbnVtVmFscy5iZWdpbigpLCBFbnVtVmFscy5lbmQoKSwgQ21wRW51bVZhbHMpOwogICAgICAgRW51bVZhbHNUeTo6aXRlcmF0b3IgRUllbmQgPQpAQCAtMTAwOSw5ICsxMDQzLDEyIEBACiAgICAgICAgICAgIENJICE9IENhc2VWYWxzLmVuZCgpOyBDSSsrKSB7CiAgICAgICAgIHdoaWxlIChFSSAhPSBFSWVuZCAmJiBFSS0+Zmlyc3QgPCBDSS0+Zmlyc3QpCiAgICAgICAgICAgRUkrKzsKLSAgICAgICAgaWYgKEVJID09IEVJZW5kIHx8IEVJLT5maXJzdCA+IENJLT5maXJzdCkKLSAgICAgICAgICBEaWFnKENJLT5zZWNvbmQtPmdldExIUygpLT5nZXRFeHByTG9jKCksIGRpYWc6Ondhcm5fbm90X2luX2VudW0pCi0gICAgICAgICAgICA8PCBDb25kVHlwZUJlZm9yZVByb21vdGlvbjsKKyAgICAgICAgaWYgKEVJID09IEVJZW5kIHx8IEVJLT5maXJzdCA+IENJLT5maXJzdCkgeworICAgICAgICAgIEV4cHIgKkNhc2VFeHByID0gQ0ktPnNlY29uZC0+Z2V0TEhTKCk7CisgICAgICAgICAgaWYgKFNob3VsZERpYWdub3NlU3dpdGNoQ2FzZU5vdEluRW51bShDb250ZXh0LCBFRCwgQ2FzZUV4cHIpKQorICAgICAgICAgICAgRGlhZyhDYXNlRXhwci0+Z2V0RXhwckxvYygpLCBkaWFnOjp3YXJuX25vdF9pbl9lbnVtKQorICAgICAgICAgICAgICA8PCBDb25kVHlwZUJlZm9yZVByb21vdGlvbjsKKyAgICAgICAgfQogICAgICAgfQogICAgICAgLy8gU2VlIHdoaWNoIG9mIGNhc2UgcmFuZ2VzIGFyZW4ndCBpbiBlbnVtCiAgICAgICBFSSA9IEVudW1WYWxzLmJlZ2luKCk7CkBAIC0xMDIxLDggKzEwNTgsMTAgQEAKICAgICAgICAgICBFSSsrOwogCiAgICAgICAgIGlmIChFSSA9PSBFSWVuZCB8fCBFSS0+Zmlyc3QgIT0gUkktPmZpcnN0KSB7Ci0gICAgICAgICAgRGlhZyhSSS0+c2Vjb25kLT5nZXRMSFMoKS0+Z2V0RXhwckxvYygpLCBkaWFnOjp3YXJuX25vdF9pbl9lbnVtKQotICAgICAgICAgICAgPDwgQ29uZFR5cGVCZWZvcmVQcm9tb3Rpb247CisgICAgICAgICAgRXhwciAqQ2FzZUV4cHIgPSBSSS0+c2Vjb25kLT5nZXRMSFMoKTsKKyAgICAgICAgICBpZiAoU2hvdWxkRGlhZ25vc2VTd2l0Y2hDYXNlTm90SW5FbnVtKENvbnRleHQsIEVELCBDYXNlRXhwcikpCisgICAgICAgICAgICBEaWFnKENhc2VFeHByLT5nZXRFeHByTG9jKCksIGRpYWc6Ondhcm5fbm90X2luX2VudW0pCisgICAgICAgICAgICAgIDw8IENvbmRUeXBlQmVmb3JlUHJvbW90aW9uOwogICAgICAgICB9CiAKICAgICAgICAgbGx2bTo6QVBTSW50IEhpID0KQEAgLTEwMzAsOSArMTA2OSwxMiBAQAogICAgICAgICBBZGp1c3RBUFNJbnQoSGksIENvbmRXaWR0aCwgQ29uZElzU2lnbmVkKTsKICAgICAgICAgd2hpbGUgKEVJICE9IEVJZW5kICYmIEVJLT5maXJzdCA8IEhpKQogICAgICAgICAgIEVJKys7Ci0gICAgICAgIGlmIChFSSA9PSBFSWVuZCB8fCBFSS0+Zmlyc3QgIT0gSGkpCi0gICAgICAgICAgRGlhZyhSSS0+c2Vjb25kLT5nZXRSSFMoKS0+Z2V0RXhwckxvYygpLCBkaWFnOjp3YXJuX25vdF9pbl9lbnVtKQotICAgICAgICAgICAgPDwgQ29uZFR5cGVCZWZvcmVQcm9tb3Rpb247CisgICAgICAgIGlmIChFSSA9PSBFSWVuZCB8fCBFSS0+Zmlyc3QgIT0gSGkpIHsKKyAgICAgICAgICBFeHByICpDYXNlRXhwciA9IFJJLT5zZWNvbmQtPmdldFJIUygpOworICAgICAgICAgIGlmIChTaG91bGREaWFnbm9zZVN3aXRjaENhc2VOb3RJbkVudW0oQ29udGV4dCwgRUQsIENhc2VFeHByKSkKKyAgICAgICAgICAgIERpYWcoQ2FzZUV4cHItPmdldEV4cHJMb2MoKSwgZGlhZzo6d2Fybl9ub3RfaW5fZW51bSkKKyAgICAgICAgICAgICAgPDwgQ29uZFR5cGVCZWZvcmVQcm9tb3Rpb247CisgICAgICAgIH0KICAgICAgIH0KIAogICAgICAgLy8gQ2hlY2sgd2hpY2ggZW51bSB2YWxzIGFyZW4ndCBpbiBzd2l0Y2gKQEAgLTEwNDQsNyArMTA4Niw2IEBACiAKICAgICAgIGZvciAoRUkgPSBFbnVtVmFscy5iZWdpbigpOyBFSSAhPSBFSWVuZDsgRUkrKyl7CiAgICAgICAgIC8vIERyb3AgdW5uZWVkZWQgY2FzZSB2YWx1ZXMKLSAgICAgICAgbGx2bTo6QVBTSW50IENJVmFsOwogICAgICAgICB3aGlsZSAoQ0kgIT0gQ2FzZVZhbHMuZW5kKCkgJiYgQ0ktPmZpcnN0IDwgRUktPmZpcnN0KQogICAgICAgICAgIENJKys7CiAKQEAgLTExMjAsNyArMTE2MSw3IEBACiAgICAgcmV0dXJuOwogCiAgIGlmIChjb25zdCBFbnVtVHlwZSAqRVQgPSBEc3RUeXBlLT5nZXRBczxFbnVtVHlwZT4oKSkKLSAgICBpZiAoIUNvbnRleHQuaGFzU2FtZVR5cGUoU3JjVHlwZSwgRHN0VHlwZSkgJiYKKyAgICBpZiAoIUNvbnRleHQuaGFzU2FtZVVucXVhbGlmaWVkVHlwZShTcmNUeXBlLCBEc3RUeXBlKSAmJgogICAgICAgICBTcmNUeXBlLT5pc0ludGVnZXJUeXBlKCkpIHsKICAgICAgIGlmICghU3JjRXhwci0+aXNUeXBlRGVwZW5kZW50KCkgJiYgIVNyY0V4cHItPmlzVmFsdWVEZXBlbmRlbnQoKSAmJgogICAgICAgICAgIFNyY0V4cHItPmlzSW50ZWdlckNvbnN0YW50RXhwcihDb250ZXh0KSkgewpAQCAtMTEzNywxMSArMTE3OCwxMCBAQAogCiAgICAgICAgIC8vIEdhdGhlciBhbGwgZW51bSB2YWx1ZXMsIHNldCB0aGVpciB0eXBlIGFuZCBzb3J0IHRoZW0sCiAgICAgICAgIC8vIGFsbG93aW5nIGVhc2llciBjb21wYXJpc29uIHdpdGggcmhzIGNvbnN0YW50LgotICAgICAgICBmb3IgKEVudW1EZWNsOjplbnVtZXJhdG9yX2l0ZXJhdG9yIEVESSA9IEVELT5lbnVtZXJhdG9yX2JlZ2luKCk7Ci0gICAgICAgICAgICAgRURJICE9IEVELT5lbnVtZXJhdG9yX2VuZCgpOyArK0VESSkgeworICAgICAgICBmb3IgKGF1dG8gKkVESSA6IEVELT5lbnVtZXJhdG9ycygpKSB7CiAgICAgICAgICAgbGx2bTo6QVBTSW50IFZhbCA9IEVESS0+Z2V0SW5pdFZhbCgpOwogICAgICAgICAgIEFkanVzdEFQU0ludChWYWwsIERzdFdpZHRoLCBEc3RJc1NpZ25lZCk7Ci0gICAgICAgICAgRW51bVZhbHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFZhbCwgKkVESSkpOworICAgICAgICAgIEVudW1WYWxzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihWYWwsIEVESSkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChFbnVtVmFscy5lbXB0eSgpKQogICAgICAgICAgIHJldHVybjsKQEAgLTExNTUsNyArMTE5NSw3IEBACiAgICAgICAgICAgRUkrKzsKICAgICAgICAgaWYgKEVJID09IEVJZW5kIHx8IEVJLT5maXJzdCAhPSBSaHNWYWwpIHsKICAgICAgICAgICBEaWFnKFNyY0V4cHItPmdldEV4cHJMb2MoKSwgZGlhZzo6d2Fybl9ub3RfaW5fZW51bV9hc3NpZ25tZW50KQotICAgICAgICAgIDw8IERzdFR5cGU7CisgICAgICAgICAgICAgIDw8IERzdFR5cGUuZ2V0VW5xdWFsaWZpZWRUeXBlKCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC0xMTc2LDYgKzEyMTYsNyBAQAogICBFeHByICpDb25kaXRpb25FeHByID0gQ29uZFJlc3VsdC50YWtlKCk7CiAgIGlmICghQ29uZGl0aW9uRXhwcikKICAgICByZXR1cm4gU3RtdEVycm9yKCk7CisgIENoZWNrQnJlYWtDb250aW51ZUJpbmRpbmcoQ29uZGl0aW9uRXhwcik7CiAKICAgRGlhZ25vc2VVbnVzZWRFeHByUmVzdWx0KEJvZHkpOwogCkBAIC0xMTkyLDYgKzEyMzMsNyBAQAogICAgICAgICAgICAgICAgICAgRXhwciAqQ29uZCwgU291cmNlTG9jYXRpb24gQ29uZFJQYXJlbikgewogICBhc3NlcnQoQ29uZCAmJiAiQWN0T25Eb1N0bXQoKTogbWlzc2luZyBleHByZXNzaW9uIik7CiAKKyAgQ2hlY2tCcmVha0NvbnRpbnVlQmluZGluZyhDb25kKTsKICAgRXhwclJlc3VsdCBDb25kUmVzdWx0ID0gQ2hlY2tCb29sZWFuQ29uZGl0aW9uKENvbmQsIERvTG9jKTsKICAgaWYgKENvbmRSZXN1bHQuaXNJbnZhbGlkKCkpCiAgICAgcmV0dXJuIFN0bXRFcnJvcigpOwpAQCAtMTQ1NCwyNSArMTQ5NiwzMyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIC8vIEEgdmlzaXRvciB0byBkZXRlcm1pbmUgaWYgYSBjb250aW51ZSBzdGF0ZW1lbnQgaXMgYSBzdWJleHByZXNzaW9uLgotICBjbGFzcyBDb250aW51ZUZpbmRlciA6IHB1YmxpYyBFdmFsdWF0ZWRFeHByVmlzaXRvcjxDb250aW51ZUZpbmRlcj4gewotICAgIGJvb2wgRm91bmQ7CisgIC8vIEEgdmlzaXRvciB0byBkZXRlcm1pbmUgaWYgYSBjb250aW51ZSBvciBicmVhayBzdGF0ZW1lbnQgaXMgYQorICAvLyBzdWJleHByZXNzaW9uLgorICBjbGFzcyBCcmVha0NvbnRpbnVlRmluZGVyIDogcHVibGljIEV2YWx1YXRlZEV4cHJWaXNpdG9yPEJyZWFrQ29udGludWVGaW5kZXI+IHsKKyAgICBTb3VyY2VMb2NhdGlvbiBCcmVha0xvYzsKKyAgICBTb3VyY2VMb2NhdGlvbiBDb250aW51ZUxvYzsKICAgcHVibGljOgotICAgIENvbnRpbnVlRmluZGVyKFNlbWEgJlMsIFN0bXQqIEJvZHkpIDoKLSAgICAgICAgSW5oZXJpdGVkKFMuQ29udGV4dCksCi0gICAgICAgIEZvdW5kKGZhbHNlKSB7CisgICAgQnJlYWtDb250aW51ZUZpbmRlcihTZW1hICZTLCBTdG10KiBCb2R5KSA6CisgICAgICAgIEluaGVyaXRlZChTLkNvbnRleHQpIHsKICAgICAgIFZpc2l0KEJvZHkpOwogICAgIH0KIAotICAgIHR5cGVkZWYgRXZhbHVhdGVkRXhwclZpc2l0b3I8Q29udGludWVGaW5kZXI+IEluaGVyaXRlZDsKKyAgICB0eXBlZGVmIEV2YWx1YXRlZEV4cHJWaXNpdG9yPEJyZWFrQ29udGludWVGaW5kZXI+IEluaGVyaXRlZDsKIAogICAgIHZvaWQgVmlzaXRDb250aW51ZVN0bXQoQ29udGludWVTdG10KiBFKSB7Ci0gICAgICBGb3VuZCA9IHRydWU7CisgICAgICBDb250aW51ZUxvYyA9IEUtPmdldENvbnRpbnVlTG9jKCk7CiAgICAgfQogCi0gICAgYm9vbCBDb250aW51ZUZvdW5kKCkgeyByZXR1cm4gRm91bmQ7IH0KKyAgICB2b2lkIFZpc2l0QnJlYWtTdG10KEJyZWFrU3RtdCogRSkgeworICAgICAgQnJlYWtMb2MgPSBFLT5nZXRCcmVha0xvYygpOworICAgIH0KIAotICB9OyAgLy8gZW5kIGNsYXNzIENvbnRpbnVlRmluZGVyCisgICAgYm9vbCBDb250aW51ZUZvdW5kKCkgeyByZXR1cm4gQ29udGludWVMb2MuaXNWYWxpZCgpOyB9CisgICAgYm9vbCBCcmVha0ZvdW5kKCkgeyByZXR1cm4gQnJlYWtMb2MuaXNWYWxpZCgpOyB9CisgICAgU291cmNlTG9jYXRpb24gR2V0Q29udGludWVMb2MoKSB7IHJldHVybiBDb250aW51ZUxvYzsgfQorICAgIFNvdXJjZUxvY2F0aW9uIEdldEJyZWFrTG9jKCkgeyByZXR1cm4gQnJlYWtMb2M7IH0KKworICB9OyAgLy8gZW5kIGNsYXNzIEJyZWFrQ29udGludWVGaW5kZXIKIAogICAvLyBFbWl0IGEgd2FybmluZyB3aGVuIGEgbG9vcCBpbmNyZW1lbnQvZGVjcmVtZW50IGFwcGVhcnMgdHdpY2UgcGVyIGxvb3AKICAgLy8gaXRlcmF0aW9uLiAgVGhlIGNvbmRpdGlvbnMgd2hpY2ggdHJpZ2dlciB0aGlzIHdhcm5pbmcgYXJlOgpAQCAtMTUwMSwxMSArMTU1MSwxMSBAQAogICAgIGlmICghUHJvY2Vzc0l0ZXJhdGlvblN0bXQoUywgTGFzdFN0bXQsIExhc3RJbmNyZW1lbnQsIExhc3REUkUpKSByZXR1cm47CiAKICAgICAvLyBDaGVjayB0aGF0IHRoZSB0d28gc3RhdGVtZW50cyBhcmUgYm90aCBpbmNyZW1lbnRzIG9yIGJvdGggZGVjcmVtZW50cwotICAgIC8vIG9uIHRoZSBzYW1lIHZhcmFpYmxlLgorICAgIC8vIG9uIHRoZSBzYW1lIHZhcmlhYmxlLgogICAgIGlmIChMb29wSW5jcmVtZW50ICE9IExhc3RJbmNyZW1lbnQgfHwKICAgICAgICAgTG9vcERSRS0+Z2V0RGVjbCgpICE9IExhc3REUkUtPmdldERlY2woKSkgcmV0dXJuOwogCi0gICAgaWYgKENvbnRpbnVlRmluZGVyKFMsIEJvZHkpLkNvbnRpbnVlRm91bmQoKSkgcmV0dXJuOworICAgIGlmIChCcmVha0NvbnRpbnVlRmluZGVyKFMsIEJvZHkpLkNvbnRpbnVlRm91bmQoKSkgcmV0dXJuOwogCiAgICAgUy5EaWFnKExhc3REUkUtPmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5fcmVkdW5kYW50X2xvb3BfaXRlcmF0aW9uKQogICAgICAgICAgPDwgTGFzdERSRS0+Z2V0RGVjbCgpIDw8IExhc3RJbmNyZW1lbnQ7CkBAIC0xNTE1LDYgKzE1NjUsMjUgQEAKIAogfSAvLyBlbmQgbmFtZXNwYWNlCiAKKwordm9pZCBTZW1hOjpDaGVja0JyZWFrQ29udGludWVCaW5kaW5nKEV4cHIgKkUpIHsKKyAgaWYgKCFFIHx8IGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKQorICAgIHJldHVybjsKKyAgQnJlYWtDb250aW51ZUZpbmRlciBCQ0ZpbmRlcigqdGhpcywgRSk7CisgIFNjb3BlICpCcmVha1BhcmVudCA9IEN1clNjb3BlLT5nZXRCcmVha1BhcmVudCgpOworICBpZiAoQkNGaW5kZXIuQnJlYWtGb3VuZCgpICYmIEJyZWFrUGFyZW50KSB7CisgICAgaWYgKEJyZWFrUGFyZW50LT5nZXRGbGFncygpICYgU2NvcGU6OlN3aXRjaFNjb3BlKSB7CisgICAgICBEaWFnKEJDRmluZGVyLkdldEJyZWFrTG9jKCksIGRpYWc6Ondhcm5fYnJlYWtfYmluZHNfdG9fc3dpdGNoKTsKKyAgICB9IGVsc2UgeworICAgICAgRGlhZyhCQ0ZpbmRlci5HZXRCcmVha0xvYygpLCBkaWFnOjp3YXJuX2xvb3BfY3RybF9iaW5kc190b19pbm5lcikKKyAgICAgICAgICA8PCAiYnJlYWsiOworICAgIH0KKyAgfSBlbHNlIGlmIChCQ0ZpbmRlci5Db250aW51ZUZvdW5kKCkgJiYgQ3VyU2NvcGUtPmdldENvbnRpbnVlUGFyZW50KCkpIHsKKyAgICBEaWFnKEJDRmluZGVyLkdldENvbnRpbnVlTG9jKCksIGRpYWc6Ondhcm5fbG9vcF9jdHJsX2JpbmRzX3RvX2lubmVyKQorICAgICAgICA8PCAiY29udGludWUiOworICB9Cit9CisKIFN0bXRSZXN1bHQKIFNlbWE6OkFjdE9uRm9yU3RtdChTb3VyY2VMb2NhdGlvbiBGb3JMb2MsIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKICAgICAgICAgICAgICAgICAgICBTdG10ICpGaXJzdCwgRnVsbEV4cHJBcmcgc2Vjb25kLCBEZWNsICpzZWNvbmRWYXIsCkBAIC0xNTI1LDE5ICsxNTk0LDIxIEBACiAgICAgICAvLyBDOTkgNi44LjVwMzogVGhlIGRlY2xhcmF0aW9uIHBhcnQgb2YgYSAnZm9yJyBzdGF0ZW1lbnQgc2hhbGwgb25seQogICAgICAgLy8gZGVjbGFyZSBpZGVudGlmaWVycyBmb3Igb2JqZWN0cyBoYXZpbmcgc3RvcmFnZSBjbGFzcyAnYXV0bycgb3IKICAgICAgIC8vICdyZWdpc3RlcicuCi0gICAgICBmb3IgKERlY2xTdG10OjpkZWNsX2l0ZXJhdG9yIERJPURTLT5kZWNsX2JlZ2luKCksIERFPURTLT5kZWNsX2VuZCgpOwotICAgICAgICAgICBESSE9REU7ICsrREkpIHsKLSAgICAgICAgVmFyRGVjbCAqVkQgPSBkeW5fY2FzdDxWYXJEZWNsPigqREkpOworICAgICAgZm9yIChhdXRvICpESSA6IERTLT5kZWNscygpKSB7CisgICAgICAgIFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oREkpOwogICAgICAgICBpZiAoVkQgJiYgVkQtPmlzTG9jYWxWYXJEZWNsKCkgJiYgIVZELT5oYXNMb2NhbFN0b3JhZ2UoKSkKICAgICAgICAgICBWRCA9IDA7CiAgICAgICAgIGlmIChWRCA9PSAwKSB7Ci0gICAgICAgICAgRGlhZygoKkRJKS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX25vbl9sb2NhbF92YXJpYWJsZV9kZWNsX2luX2Zvcik7Ci0gICAgICAgICAgKCpESSktPnNldEludmFsaWREZWNsKCk7CisgICAgICAgICAgRGlhZyhESS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX25vbl9sb2NhbF92YXJpYWJsZV9kZWNsX2luX2Zvcik7CisgICAgICAgICAgREktPnNldEludmFsaWREZWNsKCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIAorICBDaGVja0JyZWFrQ29udGludWVCaW5kaW5nKHNlY29uZC5nZXQoKSk7CisgIENoZWNrQnJlYWtDb250aW51ZUJpbmRpbmcodGhpcmQuZ2V0KCkpOworCiAgIENoZWNrRm9yTG9vcENvbmRpdGlvbmFsU3RhdGVtZW50KCp0aGlzLCBzZWNvbmQuZ2V0KCksIHRoaXJkLmdldCgpLCBCb2R5KTsKICAgQ2hlY2tGb3JSZWR1bmRhbnRJdGVyYXRpb24oKnRoaXMsIHRoaXJkLmdldCgpLCBCb2R5KTsKIApAQCAtMjQ5OSw3ICsyNTcwLDcgQEAKIHN0YXRpYyBib29sIGhhc0RlZHVjZWRSZXR1cm5UeXBlKEZ1bmN0aW9uRGVjbCAqRkQpIHsKICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9CiAgICAgICBGRC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZSgpLT5jYXN0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7Ci0gIHJldHVybiBGUFQtPmdldFJlc3VsdFR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCk7CisgIHJldHVybiBGUFQtPmdldFJldHVyblR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCk7CiB9CiAKIC8vLyBBY3RPbkNhcFNjb3BlUmV0dXJuU3RtdCAtIFV0aWxpdHkgcm91dGluZSB0byB0eXBlLWNoZWNrIHJldHVybiBzdGF0ZW1lbnRzCkBAIC0yNTE4LDcgKzI1ODksNyBAQAogICAgIC8vIEZJWE1FOiBCbG9ja3MgbWlnaHQgaGF2ZSBhIHJldHVybiB0eXBlIG9mICdhdXRvJyBleHBsaWNpdGx5IHNwZWNpZmllZC4KICAgICBGdW5jdGlvbkRlY2wgKkZEID0gQ3VyTGFtYmRhLT5DYWxsT3BlcmF0b3I7CiAgICAgaWYgKEN1ckNhcC0+UmV0dXJuVHlwZS5pc051bGwoKSkKLSAgICAgIEN1ckNhcC0+UmV0dXJuVHlwZSA9IEZELT5nZXRSZXN1bHRUeXBlKCk7CisgICAgICBDdXJDYXAtPlJldHVyblR5cGUgPSBGRC0+Z2V0UmV0dXJuVHlwZSgpOwogCiAgICAgQXV0b1R5cGUgKkFUID0gQ3VyQ2FwLT5SZXR1cm5UeXBlLT5nZXRDb250YWluZWRBdXRvVHlwZSgpOwogICAgIGFzc2VydChBVCAmJiAibG9zdCBhdXRvIHR5cGUgZnJvbSBsYW1iZGEgcmV0dXJuIHR5cGUiKTsKQEAgLTI1MjYsNyArMjU5Nyw3IEBACiAgICAgICBGRC0+c2V0SW52YWxpZERlY2woKTsKICAgICAgIHJldHVybiBTdG10RXJyb3IoKTsKICAgICB9Ci0gICAgQ3VyQ2FwLT5SZXR1cm5UeXBlID0gRm5SZXRUeXBlID0gRkQtPmdldFJlc3VsdFR5cGUoKTsKKyAgICBDdXJDYXAtPlJldHVyblR5cGUgPSBGblJldFR5cGUgPSBGRC0+Z2V0UmV0dXJuVHlwZSgpOwogICB9IGVsc2UgaWYgKEN1ckNhcC0+SGFzSW1wbGljaXRSZXR1cm5UeXBlKSB7CiAgICAgLy8gRm9yIGJsb2Nrcy9sYW1iZGFzIHdpdGggaW1wbGljaXQgcmV0dXJuIHR5cGVzLCB3ZSBjaGVjayBlYWNoIHJldHVybgogICAgIC8vIHN0YXRlbWVudCBpbmRpdmlkdWFsbHksIGFuZCBkZWR1Y2UgdGhlIGNvbW1vbiByZXR1cm4gdHlwZSB3aGVuIHRoZSBibG9jawpAQCAtMjYyMSw3ICsyNjkyLDcgQEAKICAgICAgIHJldHVybiBTdG10RXJyb3IoKTsKICAgICB9CiAgICAgUmV0VmFsRXhwID0gUmVzLnRha2UoKTsKLSAgICBDaGVja1JldHVyblN0YWNrQWRkcihSZXRWYWxFeHAsIEZuUmV0VHlwZSwgUmV0dXJuTG9jKTsKKyAgICBDaGVja1JldHVyblZhbEV4cHIoUmV0VmFsRXhwLCBGblJldFR5cGUsIFJldHVybkxvYyk7CiAgIH0KIAogICBpZiAoUmV0VmFsRXhwKSB7CkBAIC0yNjUxLDcgKzI3MjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByIComUmV0RXhwciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b1R5cGUgKkFUKSB7CiAgIFR5cGVMb2MgT3JpZ1Jlc3VsdFR5cGUgPSBGRC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpLgotICAgIElnbm9yZVBhcmVucygpLmNhc3RBczxGdW5jdGlvblByb3RvVHlwZUxvYz4oKS5nZXRSZXN1bHRMb2MoKTsKKyAgICBJZ25vcmVQYXJlbnMoKS5jYXN0QXM8RnVuY3Rpb25Qcm90b1R5cGVMb2M+KCkuZ2V0UmV0dXJuTG9jKCk7CiAgIFF1YWxUeXBlIERlZHVjZWQ7CiAKICAgaWYgKFJldEV4cHIgJiYgaXNhPEluaXRMaXN0RXhwcj4oUmV0RXhwcikpIHsKQEAgLTI3NDUsMTMgKzI4MTYsMjEgQEAKIAogICBRdWFsVHlwZSBGblJldFR5cGU7CiAgIFF1YWxUeXBlIFJlbGF0ZWRSZXRUeXBlOworICBjb25zdCBBdHRyVmVjICpBdHRycyA9IDA7CisgIGJvb2wgaXNPYmpDTWV0aG9kID0gZmFsc2U7CisKICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBnZXRDdXJGdW5jdGlvbkRlY2woKSkgewotICAgIEZuUmV0VHlwZSA9IEZELT5nZXRSZXN1bHRUeXBlKCk7CisgICAgRm5SZXRUeXBlID0gRkQtPmdldFJldHVyblR5cGUoKTsKKyAgICBpZiAoRkQtPmhhc0F0dHJzKCkpCisgICAgICBBdHRycyA9ICZGRC0+Z2V0QXR0cnMoKTsKICAgICBpZiAoRkQtPmlzTm9SZXR1cm4oKSkKICAgICAgIERpYWcoUmV0dXJuTG9jLCBkaWFnOjp3YXJuX25vcmV0dXJuX2Z1bmN0aW9uX2hhc19yZXR1cm5fZXhwcikKICAgICAgICAgPDwgRkQtPmdldERlY2xOYW1lKCk7CiAgIH0gZWxzZSBpZiAoT2JqQ01ldGhvZERlY2wgKk1EID0gZ2V0Q3VyTWV0aG9kRGVjbCgpKSB7Ci0gICAgRm5SZXRUeXBlID0gTUQtPmdldFJlc3VsdFR5cGUoKTsKKyAgICBGblJldFR5cGUgPSBNRC0+Z2V0UmV0dXJuVHlwZSgpOworICAgIGlzT2JqQ01ldGhvZCA9IHRydWU7CisgICAgaWYgKE1ELT5oYXNBdHRycygpKQorICAgICAgQXR0cnMgPSAmTUQtPmdldEF0dHJzKCk7CiAgICAgaWYgKE1ELT5oYXNSZWxhdGVkUmVzdWx0VHlwZSgpICYmIE1ELT5nZXRDbGFzc0ludGVyZmFjZSgpKSB7CiAgICAgICAvLyBJbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtZXRob2Qgd2l0aCBhIHJlbGF0ZWQgcmV0dXJuIHR5cGUsIHRoZQogICAgICAgLy8gdHlwZSB1c2VkIHRvIHR5cGUtY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHJldHVybiBzdGF0ZW1lbnRzIHdpdGhpbiB0aGUKQEAgLTI3NzEsNyArMjg1MCw3IEBACiAgICAgICAgIEZELT5zZXRJbnZhbGlkRGVjbCgpOwogICAgICAgICByZXR1cm4gU3RtdEVycm9yKCk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBGblJldFR5cGUgPSBGRC0+Z2V0UmVzdWx0VHlwZSgpOworICAgICAgICBGblJldFR5cGUgPSBGRC0+Z2V0UmV0dXJuVHlwZSgpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMjgwMyw4ICsyODgyLDE0IEBACiAgICAgICB9IGVsc2UgaWYgKCFSZXRWYWxFeHAtPmlzVHlwZURlcGVuZGVudCgpKSB7CiAgICAgICAgIC8vIEM5OSA2LjguNi40cDEgKGV4dF8gc2luY2UgR0NDIHdhcm5zKQogICAgICAgICB1bnNpZ25lZCBEID0gZGlhZzo6ZXh0X3JldHVybl9oYXNfZXhwcjsKLSAgICAgICAgaWYgKFJldFZhbEV4cC0+Z2V0VHlwZSgpLT5pc1ZvaWRUeXBlKCkpCi0gICAgICAgICAgRCA9IGRpYWc6OmV4dF9yZXR1cm5faGFzX3ZvaWRfZXhwcjsKKyAgICAgICAgaWYgKFJldFZhbEV4cC0+Z2V0VHlwZSgpLT5pc1ZvaWRUeXBlKCkpIHsKKyAgICAgICAgICBOYW1lZERlY2wgKkN1ckRlY2wgPSBnZXRDdXJGdW5jdGlvbk9yTWV0aG9kRGVjbCgpOworICAgICAgICAgIGlmIChpc2E8Q1hYQ29uc3RydWN0b3JEZWNsPihDdXJEZWNsKSB8fAorICAgICAgICAgICAgICBpc2E8Q1hYRGVzdHJ1Y3RvckRlY2w+KEN1ckRlY2wpKQorICAgICAgICAgICAgRCA9IGRpYWc6OmVycl9jdG9yX2R0b3JfcmV0dXJuc192b2lkOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEQgPSBkaWFnOjpleHRfcmV0dXJuX2hhc192b2lkX2V4cHI7CisgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgRXhwclJlc3VsdCBSZXN1bHQgPSBPd25lZChSZXRWYWxFeHApOwogICAgICAgICAgIFJlc3VsdCA9IElnbm9yZWRWYWx1ZUNvbnZlcnNpb25zKFJlc3VsdC50YWtlKCkpOwpAQCAtMjgxNCw5ICsyODk5LDE1IEBACiAgICAgICAgICAgUmV0VmFsRXhwID0gSW1wQ2FzdEV4cHJUb1R5cGUoUmV0VmFsRXhwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuVm9pZFR5LCBDS19Ub1ZvaWQpLnRha2UoKTsKICAgICAgICAgfQotCisgICAgICAgIC8vIHJldHVybiBvZiB2b2lkIGluIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgaXMgaWxsZWdhbCBpbiBDKysuCisgICAgICAgIGlmIChEID09IGRpYWc6OmVycl9jdG9yX2R0b3JfcmV0dXJuc192b2lkKSB7CisgICAgICAgICAgTmFtZWREZWNsICpDdXJEZWNsID0gZ2V0Q3VyRnVuY3Rpb25Pck1ldGhvZERlY2woKTsKKyAgICAgICAgICBEaWFnKFJldHVybkxvYywgRCkKKyAgICAgICAgICAgIDw8IEN1ckRlY2wtPmdldERlY2xOYW1lKCkgPDwgaXNhPENYWERlc3RydWN0b3JEZWNsPihDdXJEZWNsKQorICAgICAgICAgICAgPDwgUmV0VmFsRXhwLT5nZXRTb3VyY2VSYW5nZSgpOworICAgICAgICB9CiAgICAgICAgIC8vIHJldHVybiAoc29tZSB2b2lkIGV4cHJlc3Npb24pOyBpcyBsZWdhbCBpbiBDKysuCi0gICAgICAgIGlmIChEICE9IGRpYWc6OmV4dF9yZXR1cm5faGFzX3ZvaWRfZXhwciB8fAorICAgICAgICBlbHNlIGlmIChEICE9IGRpYWc6OmV4dF9yZXR1cm5faGFzX3ZvaWRfZXhwciB8fAogICAgICAgICAgICAgIWdldExhbmdPcHRzKCkuQ1BsdXNQbHVzKSB7CiAgICAgICAgICAgTmFtZWREZWNsICpDdXJEZWNsID0gZ2V0Q3VyRnVuY3Rpb25Pck1ldGhvZERlY2woKTsKIApAQCAtMjg5NCw3ICsyOTg1LDggQEAKICAgICAgICAgUmV0VmFsRXhwID0gUmVzLnRha2VBczxFeHByPigpOwogICAgICAgfQogCi0gICAgICBDaGVja1JldHVyblN0YWNrQWRkcihSZXRWYWxFeHAsIEZuUmV0VHlwZSwgUmV0dXJuTG9jKTsKKyAgICAgIENoZWNrUmV0dXJuVmFsRXhwcihSZXRWYWxFeHAsIEZuUmV0VHlwZSwgUmV0dXJuTG9jLCBpc09iakNNZXRob2QsIEF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1ckZ1bmN0aW9uRGVjbCgpKTsKICAgICB9CiAKICAgICBpZiAoUmV0VmFsRXhwKSB7CkBAIC0zMjY5LDEwICszMzYxLDcgQEAKICAgUmVjb3JkRGVjbCAqUmVjb3JkID0gUlNJLT5UaGVSZWNvcmREZWNsOwogICBSZWNvcmQtPnNldEludmFsaWREZWNsKCk7CiAKLSAgU21hbGxWZWN0b3I8RGVjbCosIDQ+IEZpZWxkczsKLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBJID0gUmVjb3JkLT5maWVsZF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBSZWNvcmQtPmZpZWxkX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBGaWVsZHMucHVzaF9iYWNrKCpJKTsKKyAgU21hbGxWZWN0b3I8RGVjbCosIDQ+IEZpZWxkcyhSZWNvcmQtPmZpZWxkcygpKTsKICAgQWN0T25GaWVsZHMoLypTY29wZT0qLzAsIFJlY29yZC0+Z2V0TG9jYXRpb24oKSwgUmVjb3JkLCBGaWVsZHMsCiAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKCksIFNvdXJjZUxvY2F0aW9uKCksIC8qQXR0cmlidXRlTGlzdD0qLzApOwogCmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hU3RtdEF0dHIuY3BwIGIvbGliL1NlbWEvU2VtYVN0bXRBdHRyLmNwcAppbmRleCBlYjAxODhhLi45YmIxOTFkIDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hU3RtdEF0dHIuY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFTdG10QXR0ci5jcHAKQEAgLTEyLDcgKzEyLDYgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWFJbnRlcm5hbC5oIgotI2luY2x1ZGUgIlRhcmdldEF0dHJpYnV0ZXNTZW1hLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnRleHQuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9Tb3VyY2VNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvTGV4L0xleGVyLmgiCkBAIC00MSw3ICs0MCw4IEBACiAgICAgUy5EaWFnKEEuZ2V0UmFuZ2UoKS5nZXRCZWdpbigpLCBkaWFnOjplcnJfZmFsbHRocm91Z2hfYXR0cl9vdXRzaWRlX3N3aXRjaCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KLSAgcmV0dXJuIDo6bmV3IChTLkNvbnRleHQpIEZhbGxUaHJvdWdoQXR0cihBLmdldFJhbmdlKCksIFMuQ29udGV4dCk7CisgIHJldHVybiA6Om5ldyAoUy5Db250ZXh0KSBGYWxsVGhyb3VnaEF0dHIoQS5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQS5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKTsKIH0KIAogCmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hVGVtcGxhdGUuY3BwIGIvbGliL1NlbWEvU2VtYVRlbXBsYXRlLmNwcAppbmRleCAyODYwM2RhLi45YmU3MTg5IDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hVGVtcGxhdGUuY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFUZW1wbGF0ZS5jcHAKQEAgLTEwLDggKzEwLDggQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8KIAogI2luY2x1ZGUgIlRyZWVUcmFuc2Zvcm0uaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb25zdW1lci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xGcmllbmQuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZVZpc2l0b3IuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1BhcnRpYWxEaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvRGVjbFNwZWMuaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL0xvb2t1cC5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvUGFyc2VkVGVtcGxhdGUuaCIKQEAgLTE5Myw4ICsxOTQsNyBAQAogICAgIFRlbXBsYXRlRGVjbCAqVEQgPSBjYXN0PFRlbXBsYXRlRGVjbD4oKCpSLmJlZ2luKCkpLT5nZXRVbmRlcmx5aW5nRGVjbCgpKTsKIAogICAgIGlmIChTUy5pc1NldCgpICYmICFTUy5pc0ludmFsaWQoKSkgewotICAgICAgTmVzdGVkTmFtZVNwZWNpZmllciAqUXVhbGlmaWVyCi0gICAgICAgID0gc3RhdGljX2Nhc3Q8TmVzdGVkTmFtZVNwZWNpZmllciAqPihTUy5nZXRTY29wZVJlcCgpKTsKKyAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKlF1YWxpZmllciA9IFNTLmdldFNjb3BlUmVwKCk7CiAgICAgICBUZW1wbGF0ZSA9IENvbnRleHQuZ2V0UXVhbGlmaWVkVGVtcGxhdGVOYW1lKFF1YWxpZmllciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGVtcGxhdGVLZXl3b3JkLCBURCk7CiAgICAgfSBlbHNlIHsKQEAgLTk2OCw3ICs5NjgsOCBAQAogICAgICAgICAgIFByZXZEZWNsID0gKCpQcmV2aW91cy5iZWdpbigpKS0+Z2V0VW5kZXJseWluZ0RlY2woKTsKICAgICAgIH0KICAgICB9Ci0gIH0gZWxzZSBpZiAoUHJldkRlY2wgJiYgIWlzRGVjbEluU2NvcGUoUHJldkRlY2wsIFNlbWFudGljQ29udGV4dCwgUykpCisgIH0gZWxzZSBpZiAoUHJldkRlY2wgJiYKKyAgICAgICAgICAgICAhaXNEZWNsSW5TY29wZShQcmV2RGVjbCwgU2VtYW50aWNDb250ZXh0LCBTLCBTUy5pc1ZhbGlkKCkpKQogICAgIFByZXZEZWNsID0gUHJldkNsYXNzVGVtcGxhdGUgPSAwOwogCiAgIGlmIChQcmV2Q2xhc3NUZW1wbGF0ZSkgewpAQCAtMTQ4Nyw2ICsxNDg4LDkgQEAKIAogICB1bnNpZ25lZCBEZXB0aDsKICAgYm9vbCBNYXRjaDsKKyAgU291cmNlTG9jYXRpb24gTWF0Y2hMb2M7CisKKyAgRGVwZW5kZW5jeUNoZWNrZXIodW5zaWduZWQgRGVwdGgpIDogRGVwdGgoRGVwdGgpLCBNYXRjaChmYWxzZSkge30KIAogICBEZXBlbmRlbmN5Q2hlY2tlcihUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlBhcmFtcykgOiBNYXRjaChmYWxzZSkgewogICAgIE5hbWVkRGVjbCAqTkQgPSBQYXJhbXMtPmdldFBhcmFtKDApOwpAQCAtMTUwMCwxNCArMTUwNCwxOSBAQAogICAgIH0KICAgfQogCi0gIGJvb2wgTWF0Y2hlcyh1bnNpZ25lZCBQYXJtRGVwdGgpIHsKKyAgYm9vbCBNYXRjaGVzKHVuc2lnbmVkIFBhcm1EZXB0aCwgU291cmNlTG9jYXRpb24gTG9jID0gU291cmNlTG9jYXRpb24oKSkgewogICAgIGlmIChQYXJtRGVwdGggPj0gRGVwdGgpIHsKICAgICAgIE1hdGNoID0gdHJ1ZTsKKyAgICAgIE1hdGNoTG9jID0gTG9jOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfQogCisgIGJvb2wgVmlzaXRUZW1wbGF0ZVR5cGVQYXJtVHlwZUxvYyhUZW1wbGF0ZVR5cGVQYXJtVHlwZUxvYyBUTCkgeworICAgIHJldHVybiAhTWF0Y2hlcyhUTC5nZXRUeXBlUHRyKCktPmdldERlcHRoKCksIFRMLmdldE5hbWVMb2MoKSk7CisgIH0KKwogICBib29sIFZpc2l0VGVtcGxhdGVUeXBlUGFybVR5cGUoY29uc3QgVGVtcGxhdGVUeXBlUGFybVR5cGUgKlQpIHsKICAgICByZXR1cm4gIU1hdGNoZXMoVC0+Z2V0RGVwdGgoKSk7CiAgIH0KQEAgLTE1MTUsMjEgKzE1MjQsMjggQEAKICAgYm9vbCBUcmF2ZXJzZVRlbXBsYXRlTmFtZShUZW1wbGF0ZU5hbWUgTikgewogICAgIGlmIChUZW1wbGF0ZVRlbXBsYXRlUGFybURlY2wgKlBEID0KICAgICAgICAgICBkeW5fY2FzdF9vcl9udWxsPFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbD4oTi5nZXRBc1RlbXBsYXRlRGVjbCgpKSkKLSAgICAgIGlmIChNYXRjaGVzKFBELT5nZXREZXB0aCgpKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKE1hdGNoZXMoUEQtPmdldERlcHRoKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgcmV0dXJuIHN1cGVyOjpUcmF2ZXJzZVRlbXBsYXRlTmFtZShOKTsKICAgfQogCiAgIGJvb2wgVmlzaXREZWNsUmVmRXhwcihEZWNsUmVmRXhwciAqRSkgewogICAgIGlmIChOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCAqUEQgPQotICAgICAgICAgIGR5bl9jYXN0PE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsPihFLT5nZXREZWNsKCkpKSB7Ci0gICAgICBpZiAoUEQtPmdldERlcHRoKCkgPT0gRGVwdGgpIHsKLSAgICAgICAgTWF0Y2ggPSB0cnVlOworICAgICAgICAgIGR5bl9jYXN0PE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsPihFLT5nZXREZWNsKCkpKQorICAgICAgaWYgKE1hdGNoZXMoUEQtPmdldERlcHRoKCksIEUtPmdldEV4cHJMb2MoKSkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9CiAgICAgcmV0dXJuIHN1cGVyOjpWaXNpdERlY2xSZWZFeHByKEUpOwogICB9Ci0gIAorCisgIGJvb2wgVmlzaXRTdWJzdFRlbXBsYXRlVHlwZVBhcm1UeXBlKGNvbnN0IFN1YnN0VGVtcGxhdGVUeXBlUGFybVR5cGUgKlQpIHsKKyAgICByZXR1cm4gVHJhdmVyc2VUeXBlKFQtPmdldFJlcGxhY2VtZW50VHlwZSgpKTsKKyAgfQorCisgIGJvb2wKKyAgVmlzaXRTdWJzdFRlbXBsYXRlVHlwZVBhcm1QYWNrVHlwZShjb25zdCBTdWJzdFRlbXBsYXRlVHlwZVBhcm1QYWNrVHlwZSAqVCkgeworICAgIHJldHVybiBUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnQoVC0+Z2V0QXJndW1lbnRQYWNrKCkpOworICB9CisKICAgYm9vbCBUcmF2ZXJzZUluamVjdGVkQ2xhc3NOYW1lVHlwZShjb25zdCBJbmplY3RlZENsYXNzTmFtZVR5cGUgKlQpIHsKICAgICByZXR1cm4gVHJhdmVyc2VUeXBlKFQtPmdldEluamVjdGVkU3BlY2lhbGl6YXRpb25UeXBlKCkpOwogICB9CkBAIC0xOTU5LDcgKzE5NzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJncyk7CiAKICAgVGVtcGxhdGVEZWNsICpUZW1wbGF0ZSA9IE5hbWUuZ2V0QXNUZW1wbGF0ZURlY2woKTsKLSAgaWYgKCFUZW1wbGF0ZSB8fCBpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KFRlbXBsYXRlKSkgeworICBpZiAoIVRlbXBsYXRlIHx8IGlzYTxGdW5jdGlvblRlbXBsYXRlRGVjbD4oVGVtcGxhdGUpIHx8CisgICAgICBpc2E8VmFyVGVtcGxhdGVEZWNsPihUZW1wbGF0ZSkpIHsKICAgICAvLyBXZSBtaWdodCBoYXZlIGEgc3Vic3RpdHV0ZWQgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyIHBhY2suIElmIHNvLAogICAgIC8vIGJ1aWxkIGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdHlwZSBmb3IgaXQuCiAgICAgaWYgKE5hbWUuZ2V0QXNTdWJzdFRlbXBsYXRlVGVtcGxhdGVQYXJtUGFjaygpKQpAQCAtMTk3NCwxNyArMTk5MSwxNSBAQAogICAvLyBDaGVjayB0aGF0IHRoZSB0ZW1wbGF0ZSBhcmd1bWVudCBsaXN0IGlzIHdlbGwtZm9ybWVkIGZvciB0aGlzCiAgIC8vIHRlbXBsYXRlLgogICBTbWFsbFZlY3RvcjxUZW1wbGF0ZUFyZ3VtZW50LCA0PiBDb252ZXJ0ZWQ7Ci0gIGJvb2wgRXhwYW5zaW9uSW50b0ZpeGVkTGlzdCA9IGZhbHNlOwogICBpZiAoQ2hlY2tUZW1wbGF0ZUFyZ3VtZW50TGlzdChUZW1wbGF0ZSwgVGVtcGxhdGVMb2MsIFRlbXBsYXRlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIENvbnZlcnRlZCwgJkV4cGFuc2lvbkludG9GaXhlZExpc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgQ29udmVydGVkKSkKICAgICByZXR1cm4gUXVhbFR5cGUoKTsKIAogICBRdWFsVHlwZSBDYW5vblR5cGU7CiAKICAgYm9vbCBJbnN0YW50aWF0aW9uRGVwZW5kZW50ID0gZmFsc2U7Ci0gIFR5cGVBbGlhc1RlbXBsYXRlRGVjbCAqQWxpYXNUZW1wbGF0ZSA9IDA7Ci0gIGlmICghRXhwYW5zaW9uSW50b0ZpeGVkTGlzdCAmJgotICAgICAgKEFsaWFzVGVtcGxhdGUgPSBkeW5fY2FzdDxUeXBlQWxpYXNUZW1wbGF0ZURlY2w+KFRlbXBsYXRlKSkpIHsKKyAgaWYgKFR5cGVBbGlhc1RlbXBsYXRlRGVjbCAqQWxpYXNUZW1wbGF0ZSA9CisgICAgICAgICAgZHluX2Nhc3Q8VHlwZUFsaWFzVGVtcGxhdGVEZWNsPihUZW1wbGF0ZSkpIHsKICAgICAvLyBGaW5kIHRoZSBjYW5vbmljYWwgdHlwZSBmb3IgdGhpcyB0eXBlIGFsaWFzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgIFR5cGVBbGlhc0RlY2wgKlBhdHRlcm4gPSBBbGlhc1RlbXBsYXRlLT5nZXRUZW1wbGF0ZWREZWNsKCk7CiAgICAgaWYgKFBhdHRlcm4tPmlzSW52YWxpZERlY2woKSkKQEAgLTIyNjcsOCArMjI4Miw4IEBACiB9CiAKIHN0YXRpYyBib29sIENoZWNrVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25BcmdzKAotICAgIFNlbWEgJlMsIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVGVtcGxhdGVQYXJhbXMsCi0gICAgU21hbGxWZWN0b3JJbXBsPFRlbXBsYXRlQXJndW1lbnQ+ICZUZW1wbGF0ZUFyZ3MpOworICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIE5hbWVMb2MsIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVGVtcGxhdGVQYXJhbXMsCisgICAgdW5zaWduZWQgRXhwbGljaXRBcmdzLCBTbWFsbFZlY3RvckltcGw8VGVtcGxhdGVBcmd1bWVudD4gJlRlbXBsYXRlQXJncyk7CiAKIHN0YXRpYyBib29sIENoZWNrVGVtcGxhdGVTcGVjaWFsaXphdGlvblNjb3BlKFNlbWEgJlMsIE5hbWVkRGVjbCAqU3BlY2lhbGl6ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKlByZXZEZWNsLApAQCAtMjM0MSwxMSArMjM1Niw5IEBACiB9CiAKIERlY2xSZXN1bHQgU2VtYTo6QWN0T25WYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uKAotICAgIFNjb3BlICpTLCBWYXJUZW1wbGF0ZURlY2wgKlZhclRlbXBsYXRlLCBEZWNsYXJhdG9yICZELCBUeXBlU291cmNlSW5mbyAqREksCi0gICAgU291cmNlTG9jYXRpb24gVGVtcGxhdGVLV0xvYywgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUZW1wbGF0ZVBhcmFtcywKLSAgICBWYXJEZWNsOjpTdG9yYWdlQ2xhc3MgU0MsIGJvb2wgSXNQYXJ0aWFsU3BlY2lhbGl6YXRpb24pIHsKLSAgYXNzZXJ0KFZhclRlbXBsYXRlICYmICJBIHZhcmlhYmxlIHRlbXBsYXRlIGlkIHdpdGhvdXQgdGVtcGxhdGU/Iik7Ci0KKyAgICBTY29wZSAqUywgRGVjbGFyYXRvciAmRCwgVHlwZVNvdXJjZUluZm8gKkRJLCBTb3VyY2VMb2NhdGlvbiBUZW1wbGF0ZUtXTG9jLAorICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVGVtcGxhdGVQYXJhbXMsIFZhckRlY2w6OlN0b3JhZ2VDbGFzcyBTQywKKyAgICBib29sIElzUGFydGlhbFNwZWNpYWxpemF0aW9uKSB7CiAgIC8vIEQgbXVzdCBiZSB2YXJpYWJsZSB0ZW1wbGF0ZSBpZC4KICAgYXNzZXJ0KEQuZ2V0TmFtZSgpLmdldEtpbmQoKSA9PSBVbnF1YWxpZmllZElkOjpJS19UZW1wbGF0ZUlkICYmCiAgICAgICAgICAiVmFyaWFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gaXMgZGVjbGFyZWQgd2l0aCBhIHRlbXBsYXRlIGl0LiIpOwpAQCAtMjM1OCw3ICsyMzcxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJZC0+TnVtQXJncyk7CiAgIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyBUZW1wbGF0ZUFyZ3MoTEFuZ2xlTG9jLCBSQW5nbGVMb2MpOwogICB0cmFuc2xhdGVUZW1wbGF0ZUFyZ3VtZW50cyhUZW1wbGF0ZUFyZ3NQdHIsIFRlbXBsYXRlQXJncyk7Ci0gIFRlbXBsYXRlTmFtZSBOYW1lKFZhclRlbXBsYXRlKTsKKyAgVGVtcGxhdGVOYW1lIE5hbWUgPSBUZW1wbGF0ZUlkLT5UZW1wbGF0ZS5nZXQoKTsKKworICAvLyBUaGUgdGVtcGxhdGUtaWQgbXVzdCBuYW1lIGEgdmFyaWFibGUgdGVtcGxhdGUuCisgIFZhclRlbXBsYXRlRGVjbCAqVmFyVGVtcGxhdGUgPQorICAgICAgZHluX2Nhc3Q8VmFyVGVtcGxhdGVEZWNsPihOYW1lLmdldEFzVGVtcGxhdGVEZWNsKCkpOworICBpZiAoIVZhclRlbXBsYXRlKQorICAgIHJldHVybiBEaWFnKEQuZ2V0SWRlbnRpZmllckxvYygpLCBkaWFnOjplcnJfdmFyX3NwZWNfbm9fdGVtcGxhdGUpCisgICAgICAgICAgICAgPDwgSXNQYXJ0aWFsU3BlY2lhbGl6YXRpb247CiAKICAgLy8gQ2hlY2sgZm9yIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2tzIGluIGFueSBvZiB0aGUgdGVtcGxhdGUgYXJndW1lbnRzLgogICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gVGVtcGxhdGVBcmdzLnNpemUoKTsgSSAhPSBOOyArK0kpCkBAIC0yMzk2LDcgKzI0MTYsOCBAQAogICAvLyBjb3JyZXNwb25kcyB0byB0aGVzZSBhcmd1bWVudHMuCiAgIGlmIChJc1BhcnRpYWxTcGVjaWFsaXphdGlvbikgewogICAgIGlmIChDaGVja1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uQXJncygKLSAgICAgICAgICAgICp0aGlzLCBWYXJUZW1wbGF0ZS0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCksIENvbnZlcnRlZCkpCisgICAgICAgICAgICAqdGhpcywgVGVtcGxhdGVOYW1lTG9jLCBWYXJUZW1wbGF0ZS0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCksCisgICAgICAgICAgICBUZW1wbGF0ZUFyZ3Muc2l6ZSgpLCBDb252ZXJ0ZWQpKQogICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBib29sIEluc3RhbnRpYXRpb25EZXBlbmRlbnQ7CkBAIC0yNDk0LDcgKzI1MTUsNyBAQAogICAgICAgICAgICAgICAgIDw8IFBhcmFtLT5nZXREZWNsTmFtZSgpOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIERpYWcoUGFyYW0tPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcGFydGlhbF9zcGVjX3VudXNlZF9wYXJhbWV0ZXIpCi0gICAgICAgICAgICAgICAgPDwgIjxhbm9ueW1vdXM+IjsKKyAgICAgICAgICAgICAgICA8PCAiKGFub255bW91cykiOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMjU4OSwxMSArMjYxMCwxMCBAQAogCiAgIC8vIENoZWNrIHRoYXQgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGxpc3QgaXMgd2VsbC1mb3JtZWQgZm9yIHRoaXMgdGVtcGxhdGUuCiAgIFNtYWxsVmVjdG9yPFRlbXBsYXRlQXJndW1lbnQsIDQ+IENvbnZlcnRlZDsKLSAgYm9vbCBFeHBhbnNpb25JbnRvRml4ZWRMaXN0ID0gZmFsc2U7CiAgIGlmIChDaGVja1RlbXBsYXRlQXJndW1lbnRMaXN0KAogICAgICAgICAgIFRlbXBsYXRlLCBUZW1wbGF0ZU5hbWVMb2MsCiAgICAgICAgICAgY29uc3RfY2FzdDxUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJj4oVGVtcGxhdGVBcmdzKSwgZmFsc2UsCi0gICAgICAgICAgQ29udmVydGVkLCAmRXhwYW5zaW9uSW50b0ZpeGVkTGlzdCkpCisgICAgICAgICAgQ29udmVydGVkKSkKICAgICByZXR1cm4gdHJ1ZTsKIAogICAvLyBGaW5kIHRoZSB2YXJpYWJsZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkZWNsYXJhdGlvbiB0aGF0CkBAIC0yNjUyLDExICsyNjcyLDYgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBtZW1iZXIgdGVtcGxhdGUgd2hlcmUgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMKLSAgICAvLyBoYXZlIGJlZW4gaW5zdGFudGlhdGVkLCB0aGlzIHByb3ZpZGVzIHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCi0gICAgLy8gZnJvbSB3aGljaCB0aGUgbWVtYmVyIHRlbXBsYXRlJ3MgcGFyYW1ldGVycyB3ZXJlIGluc3RhbnRpYXRlZC4KLSAgICBTbWFsbFZlY3Rvcjxjb25zdCBOYW1lZERlY2wgKiwgND4gSW5zdGFudGlhdGVkVGVtcGxhdGVQYXJhbWV0ZXJzOwotCiAgICAgaWYgKE1hdGNoZWQuc2l6ZSgpID49IDEpIHsKICAgICAgIFNtYWxsVmVjdG9yPE1hdGNoUmVzdWx0LCA0Pjo6aXRlcmF0b3IgQmVzdCA9IE1hdGNoZWQuYmVnaW4oKTsKICAgICAgIGlmIChNYXRjaGVkLnNpemUoKSA9PSAxKSB7CkBAIC0yNzc5LDEwICsyNzk0LDEzIEBACiAgIGFzc2VydCghUi5pc0FtYmlndW91cygpICYmICJhbWJpZ3VvdXMgbG9va3VwIHdoZW4gYnVpbGRpbmcgdGVtcGxhdGVpZCIpOwogCiAgIC8vIEluIEMrKzF5LCBjaGVjayB2YXJpYWJsZSB0ZW1wbGF0ZSBpZHMuCi0gIGlmIChSLmdldEFzU2luZ2xlPFZhclRlbXBsYXRlRGVjbD4oKSkgewotICAgIHJldHVybiBPd25lZChDaGVja1ZhclRlbXBsYXRlSWQoU1MsIFIuZ2V0TG9va3VwTmFtZUluZm8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZ2V0QXNTaW5nbGU8VmFyVGVtcGxhdGVEZWNsPigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVLV0xvYywgVGVtcGxhdGVBcmdzKSk7CisgIGJvb2wgSW5zdGFudGlhdGlvbkRlcGVuZGVudDsKKyAgaWYgKFIuZ2V0QXNTaW5nbGU8VmFyVGVtcGxhdGVEZWNsPigpICYmCisgICAgICAhVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGU6OmFueURlcGVuZGVudFRlbXBsYXRlQXJndW1lbnRzKAorICAgICAgICAgICAqVGVtcGxhdGVBcmdzLCBJbnN0YW50aWF0aW9uRGVwZW5kZW50KSkgeworICAgIHJldHVybiBDaGVja1ZhclRlbXBsYXRlSWQoU1MsIFIuZ2V0TG9va3VwTmFtZUluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZ2V0QXNTaW5nbGU8VmFyVGVtcGxhdGVEZWNsPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVLV0xvYywgVGVtcGxhdGVBcmdzKTsKICAgfQogCiAgIC8vIFdlIGRvbid0IHdhbnQgbG9va3VwIHdhcm5pbmdzIGF0IHRoaXMgcG9pbnQuCkBAIC0yODI5LDcgKzI4NDcsNyBAQAogCiAgIGlmIChDbGFzc1RlbXBsYXRlRGVjbCAqVGVtcCA9IFIuZ2V0QXNTaW5nbGU8Q2xhc3NUZW1wbGF0ZURlY2w+KCkpIHsKICAgICBEaWFnKE5hbWVJbmZvLmdldExvYygpLCBkaWFnOjplcnJfdGVtcGxhdGVfa3dfcmVmZXJzX3RvX2NsYXNzX3RlbXBsYXRlKQotICAgICAgPDwgKE5lc3RlZE5hbWVTcGVjaWZpZXIqKSBTUy5nZXRTY29wZVJlcCgpCisgICAgICA8PCBTUy5nZXRTY29wZVJlcCgpCiAgICAgICA8PCBOYW1lSW5mby5nZXROYW1lKCkgPDwgU1MuZ2V0UmFuZ2UoKTsKICAgICBEaWFnKFRlbXAtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfcmVmZXJlbmNlZF9jbGFzc190ZW1wbGF0ZSk7CiAgICAgcmV0dXJuIEV4cHJFcnJvcigpOwpAQCAtMjkwMyw4ICsyOTIxLDcgQEAKICAgICB9CiAgIH0KIAotICBOZXN0ZWROYW1lU3BlY2lmaWVyICpRdWFsaWZpZXIKLSAgICA9IHN0YXRpY19jYXN0PE5lc3RlZE5hbWVTcGVjaWZpZXIgKj4oU1MuZ2V0U2NvcGVSZXAoKSk7CisgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKlF1YWxpZmllciA9IFNTLmdldFNjb3BlUmVwKCk7CiAKICAgc3dpdGNoIChOYW1lLmdldEtpbmQoKSkgewogICBjYXNlIFVucXVhbGlmaWVkSWQ6OklLX0lkZW50aWZpZXI6CkBAIC0yOTE1LDExICsyOTMyLDEwIEBACiAgIGNhc2UgVW5xdWFsaWZpZWRJZDo6SUtfT3BlcmF0b3JGdW5jdGlvbklkOgogICAgIFJlc3VsdCA9IFRlbXBsYXRlVHk6Om1ha2UoQ29udGV4dC5nZXREZXBlbmRlbnRUZW1wbGF0ZU5hbWUoUXVhbGlmaWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS5PcGVyYXRvckZ1bmN0aW9uSWQuT3BlcmF0b3IpKTsKLSAgICByZXR1cm4gVE5LX0RlcGVuZGVudF90ZW1wbGF0ZV9uYW1lOworICAgIHJldHVybiBUTktfRnVuY3Rpb25fdGVtcGxhdGU7CiAKICAgY2FzZSBVbnF1YWxpZmllZElkOjpJS19MaXRlcmFsT3BlcmF0b3JJZDoKLSAgICBsbHZtX3VucmVhY2hhYmxlKAotICAgICAgICAgICAgIldlIGRvbid0IHN1cHBvcnQgdGhlc2U7IFBhcnNlIHNob3VsZG4ndCBoYXZlIGFsbG93ZWQgcHJvcGFnYXRpb24iKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJsaXRlcmFsIG9wZXJhdG9yIGlkIGNhbm5vdCBoYXZlIGEgZGVwZW5kZW50IHNjb3BlIik7CiAKICAgZGVmYXVsdDoKICAgICBicmVhazsKQEAgLTM1NTUsMTEgKzM1NzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAmVGVtcGxhdGVBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUGFydGlhbFRlbXBsYXRlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFRlbXBsYXRlQXJndW1lbnQ+ICZDb252ZXJ0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqRXhwYW5zaW9uSW50b0ZpeGVkTGlzdCkgewotICBpZiAoRXhwYW5zaW9uSW50b0ZpeGVkTGlzdCkKLSAgICAqRXhwYW5zaW9uSW50b0ZpeGVkTGlzdCA9IGZhbHNlOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUZW1wbGF0ZUFyZ3VtZW50PiAmQ29udmVydGVkKSB7CiAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqUGFyYW1zID0gVGVtcGxhdGUtPmdldFRlbXBsYXRlUGFyYW1ldGVycygpOwogCiAgIFNvdXJjZUxvY2F0aW9uIFJBbmdsZUxvYyA9IFRlbXBsYXRlQXJncy5nZXRSQW5nbGVMb2MoKTsKQEAgLTM2MTIsNiArMzYyNCwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudFBhY2suc2l6ZSgpLCBDb252ZXJ0ZWQpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAorICAgICAgaWYgKFRlbXBsYXRlQXJnc1tBcmdJZHhdLmdldEFyZ3VtZW50KCkuaXNQYWNrRXhwYW5zaW9uKCkgJiYKKyAgICAgICAgICBpc2E8VHlwZUFsaWFzVGVtcGxhdGVEZWNsPihUZW1wbGF0ZSkgJiYKKyAgICAgICAgICAhKFBhcmFtICsgMSA9PSBQYXJhbUVuZCAmJiAoKlBhcmFtKS0+aXNUZW1wbGF0ZVBhcmFtZXRlclBhY2soKSAmJgorICAgICAgICAgICAgIWdldEV4cGFuZGVkUGFja1NpemUoKlBhcmFtKSkpIHsKKyAgICAgICAgLy8gQ29yZSBpc3N1ZSAxNDMwOiB3ZSBoYXZlIGEgcGFjayBleHBhbnNpb24gYXMgYW4gYXJndW1lbnQgdG8gYW4KKyAgICAgICAgLy8gYWxpYXMgdGVtcGxhdGUsIGFuZCBpdCdzIG5vdCBwYXJ0IG9mIGEgZmluYWwgcGFyYW1ldGVyIHBhY2suIFRoaXMKKyAgICAgICAgLy8gY2FuJ3QgYmUgY2Fub25pY2FsaXplZCwgc28gcmVqZWN0IGl0IG5vdy4KKyAgICAgICAgRGlhZyhUZW1wbGF0ZUFyZ3NbQXJnSWR4XS5nZXRMb2NhdGlvbigpLAorICAgICAgICAgICAgIGRpYWc6OmVycl9hbGlhc190ZW1wbGF0ZV9leHBhbnNpb25faW50b19maXhlZF9saXN0KQorICAgICAgICAgIDw8IFRlbXBsYXRlQXJnc1tBcmdJZHhdLmdldFNvdXJjZVJhbmdlKCk7CisgICAgICAgIERpYWcoKCpQYXJhbSktPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfdGVtcGxhdGVfcGFyYW1faGVyZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCiAgICAgICAvLyBXZSdyZSBub3cgZG9uZSB3aXRoIHRoaXMgYXJndW1lbnQuCiAgICAgICArK0FyZ0lkeDsKIApAQCAtMzY1OCw5ICszNjg0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50UGFjay5kYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmd1bWVudFBhY2suc2l6ZSgpKSk7CiAgICAgICAgICAgQXJndW1lbnRQYWNrLmNsZWFyKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoRXhwYW5zaW9uSW50b0ZpeGVkTGlzdCkgewotICAgICAgICAgIC8vIFdlIGhhdmUgZXhwYW5kZWQgYSBwYWNrIGludG8gYSBmaXhlZCBsaXN0LgotICAgICAgICAgICpFeHBhbnNpb25JbnRvRml4ZWRMaXN0ID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTM4ODksMTkgKzM5MTIsMTcgQEAKIAogYm9vbCBVbm5hbWVkTG9jYWxOb0xpbmthZ2VGaW5kZXI6OlZpc2l0RnVuY3Rpb25Qcm90b1R5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlKiBUKSB7Ci0gIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmFyZ190eXBlX2l0ZXJhdG9yIEEgPSBULT5hcmdfdHlwZV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRW5kID0gVC0+YXJnX3R5cGVfZW5kKCk7Ci0gICAgICAgQSAhPSBBRW5kOyArK0EpIHsKLSAgICBpZiAoVmlzaXQoKkEpKQorICBmb3IgKGNvbnN0IGF1dG8gJkEgOiBULT5wYXJhbV90eXBlcygpKSB7CisgICAgaWYgKFZpc2l0KEEpKQogICAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICByZXR1cm4gVmlzaXQoVC0+Z2V0UmVzdWx0VHlwZSgpKTsKKyAgcmV0dXJuIFZpc2l0KFQtPmdldFJldHVyblR5cGUoKSk7CiB9CiAKIGJvb2wgVW5uYW1lZExvY2FsTm9MaW5rYWdlRmluZGVyOjpWaXNpdEZ1bmN0aW9uTm9Qcm90b1R5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uTm9Qcm90b1R5cGUqIFQpIHsKLSAgcmV0dXJuIFZpc2l0KFQtPmdldFJlc3VsdFR5cGUoKSk7CisgIHJldHVybiBWaXNpdChULT5nZXRSZXR1cm5UeXBlKCkpOwogfQogCiBib29sIFVubmFtZWRMb2NhbE5vTGlua2FnZUZpbmRlcjo6VmlzaXRVbnJlc29sdmVkVXNpbmdUeXBlKApAQCAtNDUyMyw2ICs0NTQ0LDggQEAKICAgY2FzZSBOUFZfTnVsbFBvaW50ZXI6CiAgICAgUy5EaWFnKEFyZy0+Z2V0RXhwckxvYygpLCBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF90ZW1wbGF0ZV9hcmdfbnVsbCk7CiAgICAgQ29udmVydGVkID0gVGVtcGxhdGVBcmd1bWVudChQYXJhbVR5cGUsIC8qaXNOdWxsUHRyKi90cnVlKTsKKyAgICBpZiAoUy5Db250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRDWFhBQkkoKS5pc01pY3Jvc29mdCgpKQorICAgICAgUy5SZXF1aXJlQ29tcGxldGVUeXBlKEFyZy0+Z2V0RXhwckxvYygpLCBQYXJhbVR5cGUsIDApOwogICAgIHJldHVybiBmYWxzZTsKICAgY2FzZSBOUFZfTm90TnVsbFBvaW50ZXI6CiAgICAgYnJlYWs7CkBAIC00NzU2LDkgKzQ3NzksOSBAQAogICAgICAgICAKICAgICAgIHB1YmxpYzoKICAgICAgICAgVG1wbEFyZ0lDRURpYWdub3NlcihRdWFsVHlwZSBUKSA6IFQoVCkgeyB9Ci0gICAgICAgIAotICAgICAgICB2aXJ0dWFsIHZvaWQgZGlhZ25vc2VOb3RJQ0UoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgU1IpIHsKKworICAgICAgICB2b2lkIGRpYWdub3NlTm90SUNFKFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBTUikgb3ZlcnJpZGUgewogICAgICAgICAgIFMuRGlhZyhMb2MsIGRpYWc6OmVycl90ZW1wbGF0ZV9hcmdfbm90X2ljZSkgPDwgVCA8PCBTUjsKICAgICAgICAgfQogICAgICAgfSBEaWFnbm9zZXIoQXJnVHlwZSk7CkBAIC01NDUwLDE4ICs1NDczLDE5IEBACiAgICAgICAgICAoUy0+Z2V0RmxhZ3MoKSAmIFNjb3BlOjpUZW1wbGF0ZVBhcmFtU2NvcGUpICE9IDApCiAgICAgUyA9IFMtPmdldFBhcmVudCgpOwogCi0gIC8vIEMrKyBbdGVtcF1wMjoKLSAgLy8gICBBIHRlbXBsYXRlLWRlY2xhcmF0aW9uIGNhbiBhcHBlYXIgb25seSBhcyBhIG5hbWVzcGFjZSBzY29wZSBvcgotICAvLyAgIGNsYXNzIHNjb3BlIGRlY2xhcmF0aW9uLgorICAvLyBDKysgW3RlbXBdcDQ6CisgIC8vICAgQSB0ZW1wbGF0ZSBbLi4uXSBzaGFsbCBub3QgaGF2ZSBDIGxpbmthZ2UuCiAgIERlY2xDb250ZXh0ICpDdHggPSBTLT5nZXRFbnRpdHkoKTsKLSAgaWYgKEN0eCAmJiBpc2E8TGlua2FnZVNwZWNEZWNsPihDdHgpICYmCi0gICAgICBjYXN0PExpbmthZ2VTcGVjRGVjbD4oQ3R4KS0+Z2V0TGFuZ3VhZ2UoKSAhPSBMaW5rYWdlU3BlY0RlY2w6OmxhbmdfY3h4KQorICBpZiAoQ3R4ICYmIEN0eC0+aXNFeHRlcm5DQ29udGV4dCgpKQogICAgIHJldHVybiBEaWFnKFRlbXBsYXRlUGFyYW1zLT5nZXRUZW1wbGF0ZUxvYygpLCBkaWFnOjplcnJfdGVtcGxhdGVfbGlua2FnZSkKICAgICAgICAgICAgICA8PCBUZW1wbGF0ZVBhcmFtcy0+Z2V0U291cmNlUmFuZ2UoKTsKIAogICB3aGlsZSAoQ3R4ICYmIGlzYTxMaW5rYWdlU3BlY0RlY2w+KEN0eCkpCiAgICAgQ3R4ID0gQ3R4LT5nZXRQYXJlbnQoKTsKIAorICAvLyBDKysgW3RlbXBdcDI6CisgIC8vICAgQSB0ZW1wbGF0ZS1kZWNsYXJhdGlvbiBjYW4gYXBwZWFyIG9ubHkgYXMgYSBuYW1lc3BhY2Ugc2NvcGUgb3IKKyAgLy8gICBjbGFzcyBzY29wZSBkZWNsYXJhdGlvbi4KICAgaWYgKEN0eCkgewogICAgIGlmIChDdHgtPmlzRmlsZUNvbnRleHQoKSkKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTU1OTgsMTMgKzU2MjIsMzcgQEAKICAgLy8gICBBIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gbWF5IGJlIGRlY2xhcmVkIG9yIHJlZGVjbGFyZWQKICAgLy8gICBpbiBhbnkgbmFtZXNwYWNlIHNjb3BlIGluIHdoaWNoIGl0cyBkZWZpbml0aW9uIG1heSBiZSBkZWZpbmVkICgxNC41LjEKICAgLy8gICBhbmQgMTQuNS4yKS4KLSAgYm9vbCBDb21wbGFpbmVkQWJvdXRTY29wZSA9IGZhbHNlOwotICBEZWNsQ29udGV4dCAqU3BlY2lhbGl6ZWRDb250ZXh0IAorICBEZWNsQ29udGV4dCAqU3BlY2lhbGl6ZWRDb250ZXh0CiAgICAgPSBTcGVjaWFsaXplZC0+Z2V0RGVjbENvbnRleHQoKS0+Z2V0RW5jbG9zaW5nTmFtZXNwYWNlQ29udGV4dCgpOwogICBEZWNsQ29udGV4dCAqREMgPSBTLkN1ckNvbnRleHQtPmdldEVuY2xvc2luZ05hbWVzcGFjZUNvbnRleHQoKTsKLSAgaWYgKCghUHJldkRlY2wgfHwKLSAgICAgICBnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZChQcmV2RGVjbCkgPT0gVFNLX1VuZGVjbGFyZWQgfHwKLSAgICAgICBnZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZChQcmV2RGVjbCkgPT0gVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbikpeworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcmVkZWNsYXJhdGlvbiAob3IgZGVmaW5pdGlvbikgb2NjdXJzIGluIGFuIGVuY2xvc2luZworICAvLyBuYW1lc3BhY2UuCisgIC8vIE5vdGUgdGhhdCBIYW5kbGVEZWNsYXJhdG9yKCkgcGVyZm9ybXMgdGhpcyBjaGVjayBmb3IgZXhwbGljaXQKKyAgLy8gc3BlY2lhbGl6YXRpb25zIG9mIGZ1bmN0aW9uIHRlbXBsYXRlcywgc3RhdGljIGRhdGEgbWVtYmVycywgYW5kIG1lbWJlcgorICAvLyBmdW5jdGlvbnMsIHNvIHdlIHNraXAgdGhlIGNoZWNrIGhlcmUgZm9yIHRob3NlIGtpbmRzIG9mIGVudGl0aWVzLgorICAvLyBGSVhNRTogSGFuZGxlRGVjbGFyYXRvcidzIGRpYWdub3N0aWNzIGFyZW4ndCBxdWl0ZSBhcyBnb29kLCB0aG91Z2guCisgIC8vIFNob3VsZCB3ZSByZWZhY3RvciB0aGF0IGNoZWNrLCBzbyB0aGF0IGl0IG9jY3VycyBsYXRlcj8KKyAgaWYgKCFEQy0+RW5jbG9zZXMoU3BlY2lhbGl6ZWRDb250ZXh0KSAmJgorICAgICAgIShpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KFNwZWNpYWxpemVkKSB8fAorICAgICAgICBpc2E8RnVuY3Rpb25EZWNsPihTcGVjaWFsaXplZCkgfHwKKyAgICAgICAgaXNhPFZhclRlbXBsYXRlRGVjbD4oU3BlY2lhbGl6ZWQpIHx8CisgICAgICAgIGlzYTxWYXJEZWNsPihTcGVjaWFsaXplZCkpKSB7CisgICAgaWYgKGlzYTxUcmFuc2xhdGlvblVuaXREZWNsPihTcGVjaWFsaXplZENvbnRleHQpKQorICAgICAgUy5EaWFnKExvYywgZGlhZzo6ZXJyX3RlbXBsYXRlX3NwZWNfcmVkZWNsX2dsb2JhbF9zY29wZSkKKyAgICAgICAgPDwgRW50aXR5S2luZCA8PCBTcGVjaWFsaXplZDsKKyAgICBlbHNlIGlmIChpc2E8TmFtZXNwYWNlRGVjbD4oU3BlY2lhbGl6ZWRDb250ZXh0KSkKKyAgICAgIFMuRGlhZyhMb2MsIGRpYWc6OmVycl90ZW1wbGF0ZV9zcGVjX3JlZGVjbF9vdXRfb2Zfc2NvcGUpCisgICAgICAgIDw8IEVudGl0eUtpbmQgPDwgU3BlY2lhbGl6ZWQKKyAgICAgICAgPDwgY2FzdDxOYW1lZERlY2w+KFNwZWNpYWxpemVkQ29udGV4dCk7CisgICAgZWxzZQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgidW5leHBlY3RlZCBuYW1lc3BhY2UgY29udGV4dCBmb3Igc3BlY2lhbGl6YXRpb24iKTsKKworICAgIFMuRGlhZyhTcGVjaWFsaXplZC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9zcGVjaWFsaXplZF9lbnRpdHkpOworICB9IGVsc2UgaWYgKCghUHJldkRlY2wgfHwKKyAgICAgICAgICAgICAgZ2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoUHJldkRlY2wpID09IFRTS19VbmRlY2xhcmVkIHx8CisgICAgICAgICAgICAgIGdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKFByZXZEZWNsKSA9PQorICAgICAgICAgICAgICAgICAgVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbikpIHsKICAgICAvLyBDKysgW3RlbXAuZXhwLnNwZWNdcDI6CiAgICAgLy8gICBBbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBzaGFsbCBiZSBkZWNsYXJlZCBpbiB0aGUgbmFtZXNwYWNlIG9mIHdoaWNoCiAgICAgLy8gICB0aGUgdGVtcGxhdGUgaXMgYSBtZW1iZXIsIG9yLCBmb3IgbWVtYmVyIHRlbXBsYXRlcywgaW4gdGhlIG5hbWVzcGFjZQpAQCAtNTYxMyw5ICs1NjYxLDEyIEBACiAgICAgLy8gICBzdGF0aWMgZGF0YSBtZW1iZXIgb2YgYSBjbGFzcyB0ZW1wbGF0ZSBzaGFsbCBiZSBkZWNsYXJlZCBpbiB0aGUKICAgICAvLyAgIG5hbWVzcGFjZSBvZiB3aGljaCB0aGUgY2xhc3MgdGVtcGxhdGUgaXMgYSBtZW1iZXIuCiAgICAgLy8KLSAgICAvLyBDKysweCBbdGVtcC5leHBsLnNwZWNdcDI6CisgICAgLy8gQysrMTEgW3RlbXAuZXhwbC5zcGVjXXAyOgogICAgIC8vICAgQW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gc2hhbGwgYmUgZGVjbGFyZWQgaW4gYSBuYW1lc3BhY2UgZW5jbG9zaW5nCiAgICAgLy8gICB0aGUgc3BlY2lhbGl6ZWQgdGVtcGxhdGUuCisgICAgLy8gQysrMTEgW3RlbXAuZXhwbGljaXRdcDM6CisgICAgLy8gICBBbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uIHNoYWxsIGFwcGVhciBpbiBhbiBlbmNsb3NpbmcgbmFtZXNwYWNlIG9mIGl0cworICAgIC8vICAgdGVtcGxhdGUuCiAgICAgaWYgKCFEQy0+SW5FbmNsb3NpbmdOYW1lc3BhY2VTZXRPZihTcGVjaWFsaXplZENvbnRleHQpKSB7CiAgICAgICBib29sIElzQ1BsdXNQbHVzMTFFeHRlbnNpb24gPSBEQy0+RW5jbG9zZXMoU3BlY2lhbGl6ZWRDb250ZXh0KTsKICAgICAgIGlmIChpc2E8VHJhbnNsYXRpb25Vbml0RGVjbD4oU3BlY2lhbGl6ZWRDb250ZXh0KSkgewpAQCAtNTYzNiw0NiArNTY4Nyw0MiBAQAogICAgICAgfQogCiAgICAgICBTLkRpYWcoU3BlY2lhbGl6ZWQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfc3BlY2lhbGl6ZWRfZW50aXR5KTsKLSAgICAgIENvbXBsYWluZWRBYm91dFNjb3BlID0KLSAgICAgICAgIShJc0NQbHVzUGx1czExRXh0ZW5zaW9uICYmIFMuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMSk7CiAgICAgfQogICB9CiAKLSAgLy8gTWFrZSBzdXJlIHRoYXQgdGhpcyByZWRlY2xhcmF0aW9uIChvciBkZWZpbml0aW9uKSBvY2N1cnMgaW4gYW4gZW5jbG9zaW5nCi0gIC8vIG5hbWVzcGFjZS4KLSAgLy8gTm90ZSB0aGF0IEhhbmRsZURlY2xhcmF0b3IoKSBwZXJmb3JtcyB0aGlzIGNoZWNrIGZvciBleHBsaWNpdAotICAvLyBzcGVjaWFsaXphdGlvbnMgb2YgZnVuY3Rpb24gdGVtcGxhdGVzLCBzdGF0aWMgZGF0YSBtZW1iZXJzLCBhbmQgbWVtYmVyCi0gIC8vIGZ1bmN0aW9ucywgc28gd2Ugc2tpcCB0aGUgY2hlY2sgaGVyZSBmb3IgdGhvc2Uga2luZHMgb2YgZW50aXRpZXMuCi0gIC8vIEZJWE1FOiBIYW5kbGVEZWNsYXJhdG9yJ3MgZGlhZ25vc3RpY3MgYXJlbid0IHF1aXRlIGFzIGdvb2QsIHRob3VnaC4KLSAgLy8gU2hvdWxkIHdlIHJlZmFjdG9yIHRoYXQgY2hlY2ssIHNvIHRoYXQgaXQgb2NjdXJzIGxhdGVyPwotICBpZiAoIUNvbXBsYWluZWRBYm91dFNjb3BlICYmICFEQy0+RW5jbG9zZXMoU3BlY2lhbGl6ZWRDb250ZXh0KSAmJgotICAgICAgIShpc2E8RnVuY3Rpb25UZW1wbGF0ZURlY2w+KFNwZWNpYWxpemVkKSB8fCBpc2E8VmFyRGVjbD4oU3BlY2lhbGl6ZWQpIHx8Ci0gICAgICAgIGlzYTxGdW5jdGlvbkRlY2w+KFNwZWNpYWxpemVkKSkpIHsKLSAgICBpZiAoaXNhPFRyYW5zbGF0aW9uVW5pdERlY2w+KFNwZWNpYWxpemVkQ29udGV4dCkpCi0gICAgICBTLkRpYWcoTG9jLCBkaWFnOjplcnJfdGVtcGxhdGVfc3BlY19yZWRlY2xfZ2xvYmFsX3Njb3BlKQotICAgICAgICA8PCBFbnRpdHlLaW5kIDw8IFNwZWNpYWxpemVkOwotICAgIGVsc2UgaWYgKGlzYTxOYW1lc3BhY2VEZWNsPihTcGVjaWFsaXplZENvbnRleHQpKQotICAgICAgUy5EaWFnKExvYywgZGlhZzo6ZXJyX3RlbXBsYXRlX3NwZWNfcmVkZWNsX291dF9vZl9zY29wZSkKLSAgICAgICAgPDwgRW50aXR5S2luZCA8PCBTcGVjaWFsaXplZAotICAgICAgICA8PCBjYXN0PE5hbWVkRGVjbD4oU3BlY2lhbGl6ZWRDb250ZXh0KTsKLQotICAgIFMuRGlhZyhTcGVjaWFsaXplZC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9zcGVjaWFsaXplZF9lbnRpdHkpOwotICB9Ci0KLSAgLy8gRklYTUU6IGNoZWNrIGZvciBzcGVjaWFsaXphdGlvbi1hZnRlci1pbnN0YW50aWF0aW9uIGVycm9ycyBhbmQgc3VjaC4KLQogICByZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyBTb3VyY2VSYW5nZSBmaW5kVGVtcGxhdGVQYXJhbWV0ZXIodW5zaWduZWQgRGVwdGgsIEV4cHIgKkUpIHsKKyAgaWYgKCFFLT5pc0luc3RhbnRpYXRpb25EZXBlbmRlbnQoKSkKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb24oKTsKKyAgRGVwZW5kZW5jeUNoZWNrZXIgQ2hlY2tlcihEZXB0aCk7CisgIENoZWNrZXIuVHJhdmVyc2VTdG10KEUpOworICBpZiAoQ2hlY2tlci5NYXRjaCAmJiBDaGVja2VyLk1hdGNoTG9jLmlzSW52YWxpZCgpKQorICAgIHJldHVybiBFLT5nZXRTb3VyY2VSYW5nZSgpOworICByZXR1cm4gQ2hlY2tlci5NYXRjaExvYzsKK30KKworc3RhdGljIFNvdXJjZVJhbmdlIGZpbmRUZW1wbGF0ZVBhcmFtZXRlcih1bnNpZ25lZCBEZXB0aCwgVHlwZUxvYyBUTCkgeworICBpZiAoIVRMLmdldFR5cGUoKS0+aXNEZXBlbmRlbnRUeXBlKCkpCisgICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uKCk7CisgIERlcGVuZGVuY3lDaGVja2VyIENoZWNrZXIoRGVwdGgpOworICBDaGVja2VyLlRyYXZlcnNlVHlwZUxvYyhUTCk7CisgIGlmIChDaGVja2VyLk1hdGNoICYmIENoZWNrZXIuTWF0Y2hMb2MuaXNJbnZhbGlkKCkpCisgICAgcmV0dXJuIFRMLmdldFNvdXJjZVJhbmdlKCk7CisgIHJldHVybiBDaGVja2VyLk1hdGNoTG9jOworfQorCiAvLy8gXGJyaWVmIFN1YnJvdXRpbmUgb2YgU2VtYTo6Q2hlY2tUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkFyZ3MKIC8vLyB0aGF0IGNoZWNrcyBub24tdHlwZSB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50cy4KIHN0YXRpYyBib29sIENoZWNrTm9uVHlwZVRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uQXJncygKLSAgICBTZW1hICZTLCBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCAqUGFyYW0sIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgKkFyZ3MsCi0gICAgdW5zaWduZWQgTnVtQXJncykgeworICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTmFtZUxvYywgTm9uVHlwZVRlbXBsYXRlUGFybURlY2wgKlBhcmFtLAorICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgKkFyZ3MsIHVuc2lnbmVkIE51bUFyZ3MsIGJvb2wgSXNEZWZhdWx0QXJndW1lbnQpIHsKICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSAhPSBOdW1BcmdzOyArK0kpIHsKICAgICBpZiAoQXJnc1tJXS5nZXRLaW5kKCkgPT0gVGVtcGxhdGVBcmd1bWVudDo6UGFjaykgewogICAgICAgaWYgKENoZWNrTm9uVHlwZVRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uQXJncygKLSAgICAgICAgICAgICAgUywgUGFyYW0sIEFyZ3NbSV0ucGFja19iZWdpbigpLCBBcmdzW0ldLnBhY2tfc2l6ZSgpKSkKKyAgICAgICAgICAgICAgUywgVGVtcGxhdGVOYW1lTG9jLCBQYXJhbSwgQXJnc1tJXS5wYWNrX2JlZ2luKCksCisgICAgICAgICAgICAgIEFyZ3NbSV0ucGFja19zaXplKCksIElzRGVmYXVsdEFyZ3VtZW50KSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgIGNvbnRpbnVlOwpAQCAtNTcxMywyMiArNTc2MCw0MyBAQAogICAgIC8vICAgICAgICBzaGFsbCBub3QgaW52b2x2ZSBhIHRlbXBsYXRlIHBhcmFtZXRlciBvZiB0aGUgcGFydGlhbAogICAgIC8vICAgICAgICBzcGVjaWFsaXphdGlvbiBleGNlcHQgd2hlbiB0aGUgYXJndW1lbnQgZXhwcmVzc2lvbiBpcyBhCiAgICAgLy8gICAgICAgIHNpbXBsZSBpZGVudGlmaWVyLgotICAgIGlmIChBcmdFeHByLT5pc1R5cGVEZXBlbmRlbnQoKSB8fCBBcmdFeHByLT5pc1ZhbHVlRGVwZW5kZW50KCkpIHsKLSAgICAgIFMuRGlhZyhBcmdFeHByLT5nZXRMb2NTdGFydCgpLAotICAgICAgICAgICBkaWFnOjplcnJfZGVwZW5kZW50X25vbl90eXBlX2FyZ19pbl9wYXJ0aWFsX3NwZWMpCi0gICAgICAgIDw8IEFyZ0V4cHItPmdldFNvdXJjZVJhbmdlKCk7CisgICAgU291cmNlUmFuZ2UgUGFyYW1Vc2VSYW5nZSA9CisgICAgICAgIGZpbmRUZW1wbGF0ZVBhcmFtZXRlcihQYXJhbS0+Z2V0RGVwdGgoKSwgQXJnRXhwcik7CisgICAgaWYgKFBhcmFtVXNlUmFuZ2UuaXNWYWxpZCgpKSB7CisgICAgICBpZiAoSXNEZWZhdWx0QXJndW1lbnQpIHsKKyAgICAgICAgUy5EaWFnKFRlbXBsYXRlTmFtZUxvYywKKyAgICAgICAgICAgICAgIGRpYWc6OmVycl9kZXBlbmRlbnRfbm9uX3R5cGVfYXJnX2luX3BhcnRpYWxfc3BlYyk7CisgICAgICAgIFMuRGlhZyhQYXJhbVVzZVJhbmdlLmdldEJlZ2luKCksCisgICAgICAgICAgICAgICBkaWFnOjpub3RlX2RlcGVuZGVudF9ub25fdHlwZV9kZWZhdWx0X2FyZ19pbl9wYXJ0aWFsX3NwZWMpCisgICAgICAgICAgPDwgUGFyYW1Vc2VSYW5nZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFMuRGlhZyhQYXJhbVVzZVJhbmdlLmdldEJlZ2luKCksCisgICAgICAgICAgICAgICBkaWFnOjplcnJfZGVwZW5kZW50X25vbl90eXBlX2FyZ19pbl9wYXJ0aWFsX3NwZWMpCisgICAgICAgICAgPDwgUGFyYW1Vc2VSYW5nZTsKKyAgICAgIH0KICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8vICAgICAtLSBUaGUgdHlwZSBvZiBhIHRlbXBsYXRlIHBhcmFtZXRlciBjb3JyZXNwb25kaW5nIHRvIGEKICAgICAvLyAgICAgICAgc3BlY2lhbGl6ZWQgbm9uLXR5cGUgYXJndW1lbnQgc2hhbGwgbm90IGJlIGRlcGVuZGVudCBvbiBhCiAgICAgLy8gICAgICAgIHBhcmFtZXRlciBvZiB0aGUgc3BlY2lhbGl6YXRpb24uCi0gICAgaWYgKFBhcmFtLT5nZXRUeXBlKCktPmlzRGVwZW5kZW50VHlwZSgpKSB7Ci0gICAgICBTLkRpYWcoQXJnRXhwci0+Z2V0TG9jU3RhcnQoKSwKLSAgICAgICAgICAgZGlhZzo6ZXJyX2RlcGVuZGVudF90eXBlZF9ub25fdHlwZV9hcmdfaW5fcGFydGlhbF9zcGVjKQotICAgICAgICA8PCBQYXJhbS0+Z2V0VHlwZSgpCi0gICAgICAgIDw8IEFyZ0V4cHItPmdldFNvdXJjZVJhbmdlKCk7Ci0gICAgICBTLkRpYWcoUGFyYW0tPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfdGVtcGxhdGVfcGFyYW1faGVyZSk7CisgICAgLy8KKyAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBkZWxheSB0aGlzIGNoZWNrIHVudGlsIGluc3RhbnRpYXRpb24gaW4gc29tZSBjYXNlczoKKyAgICAvLworICAgIC8vICAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIFg+IHN0cnVjdCBBIHsKKyAgICAvLyAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgWDxUPiBOPiBzdHJ1Y3QgQjsKKyAgICAvLyAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEI8VCwgMD47CisgICAgLy8gICB9OworICAgIC8vICAgdGVtcGxhdGU8dHlwZW5hbWU+IHVzaW5nIFggPSBpbnQ7CisgICAgLy8gICBBPFg+OjpCPGludCwgMD4gYjsKKyAgICBQYXJhbVVzZVJhbmdlID0gZmluZFRlbXBsYXRlUGFyYW1ldGVyKAorICAgICAgICAgICAgUGFyYW0tPmdldERlcHRoKCksIFBhcmFtLT5nZXRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpOworICAgIGlmIChQYXJhbVVzZVJhbmdlLmlzVmFsaWQoKSkgeworICAgICAgUy5EaWFnKElzRGVmYXVsdEFyZ3VtZW50ID8gVGVtcGxhdGVOYW1lTG9jIDogQXJnRXhwci0+Z2V0TG9jU3RhcnQoKSwKKyAgICAgICAgICAgICBkaWFnOjplcnJfZGVwZW5kZW50X3R5cGVkX25vbl90eXBlX2FyZ19pbl9wYXJ0aWFsX3NwZWMpCisgICAgICAgIDw8IFBhcmFtLT5nZXRUeXBlKCkgPDwgUGFyYW1Vc2VSYW5nZTsKKyAgICAgIFMuRGlhZyhQYXJhbS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV90ZW1wbGF0ZV9wYXJhbV9oZXJlKQorICAgICAgICA8PCAoSXNEZWZhdWx0QXJndW1lbnQgPyBQYXJhbVVzZVJhbmdlIDogU291cmNlUmFuZ2UoKSk7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgIH0KQEAgLTU3MzksMTUgKzU4MDcsMTcgQEAKIC8vLyBcYnJpZWYgQ2hlY2sgdGhlIG5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50cyBvZiBhIGNsYXNzIHRlbXBsYXRlCiAvLy8gcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhY2NvcmRpbmcgdG8gQysrIFt0ZW1wLmNsYXNzLnNwZWNdcDkuCiAvLy8KKy8vLyBccGFyYW0gVGVtcGxhdGVOYW1lTG9jIHRoZSBsb2NhdGlvbiBvZiB0aGUgdGVtcGxhdGUgbmFtZS4KIC8vLyBccGFyYW0gVGVtcGxhdGVQYXJhbXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgb2YgdGhlIHByaW1hcnkgY2xhc3MKLS8vLyB0ZW1wbGF0ZS4KLS8vLworLy8vICAgICAgICB0ZW1wbGF0ZS4KKy8vLyBccGFyYW0gTnVtRXhwbGljaXQgdGhlIG51bWJlciBvZiBleHBsaWNpdGx5LXNwZWNpZmllZCB0ZW1wbGF0ZSBhcmd1bWVudHMuCiAvLy8gXHBhcmFtIFRlbXBsYXRlQXJncyB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZQotLy8vIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCisvLy8gICAgICAgIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCiAvLy8KLS8vLyBccmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgZmFsc2Ugb3RoZXJ3aXNlLgorLy8vIFxyZXR1cm5zIFxjIHRydWUgaWYgdGhlcmUgd2FzIGFuIGVycm9yLCBcYyBmYWxzZSBvdGhlcndpc2UuCiBzdGF0aWMgYm9vbCBDaGVja1RlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uQXJncygKLSAgICBTZW1hICZTLCBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRlbXBsYXRlUGFyYW1zLAorICAgIFNlbWEgJlMsIFNvdXJjZUxvY2F0aW9uIFRlbXBsYXRlTmFtZUxvYywKKyAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRlbXBsYXRlUGFyYW1zLCB1bnNpZ25lZCBOdW1FeHBsaWNpdCwKICAgICBTbWFsbFZlY3RvckltcGw8VGVtcGxhdGVBcmd1bWVudD4gJlRlbXBsYXRlQXJncykgewogICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmdMaXN0ID0gVGVtcGxhdGVBcmdzLmRhdGEoKTsKIApAQCAtNTc1Nyw3ICs1ODI3LDggQEAKICAgICBpZiAoIVBhcmFtKQogICAgICAgY29udGludWU7CiAKLSAgICBpZiAoQ2hlY2tOb25UeXBlVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25BcmdzKFMsIFBhcmFtLCAmQXJnTGlzdFtJXSwgMSkpCisgICAgaWYgKENoZWNrTm9uVHlwZVRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uQXJncygKKyAgICAgICAgICAgIFMsIFRlbXBsYXRlTmFtZUxvYywgUGFyYW0sICZBcmdMaXN0W0ldLCAxLCBJID49IE51bUV4cGxpY2l0KSkKICAgICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTU5MDQsNyArNTk3NSw4IEBACiAgIC8vIGNvcnJlc3BvbmRzIHRvIHRoZXNlIGFyZ3VtZW50cy4KICAgaWYgKGlzUGFydGlhbFNwZWNpYWxpemF0aW9uKSB7CiAgICAgaWYgKENoZWNrVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25BcmdzKAotICAgICAgICAgICAgKnRoaXMsIENsYXNzVGVtcGxhdGUtPmdldFRlbXBsYXRlUGFyYW1ldGVycygpLCBDb252ZXJ0ZWQpKQorICAgICAgICAgICAgKnRoaXMsIFRlbXBsYXRlTmFtZUxvYywgQ2xhc3NUZW1wbGF0ZS0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCksCisgICAgICAgICAgICBUZW1wbGF0ZUFyZ3Muc2l6ZSgpLCBDb252ZXJ0ZWQpKQogICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBib29sIEluc3RhbnRpYXRpb25EZXBlbmRlbnQ7CkBAIC02MDQzLDcgKzYxMTUsNyBAQAogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIERpYWcoUGFyYW0tPmdldExvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgIGRpYWc6Om5vdGVfcGFydGlhbF9zcGVjX3VudXNlZF9wYXJhbWV0ZXIpCi0gICAgICAgICAgICAgIDw8ICI8YW5vbnltb3VzPiI7CisgICAgICAgICAgICAgIDw8ICIoYW5vbnltb3VzKSI7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC02MjEwLDEwICs2MjgyLDggQEAKICAgaWYgKEZ1bmN0aW9uRGVjbCAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEQpKSB7CiAgICAgRkQtPnNldElubGluZVNwZWNpZmllZChmYWxzZSk7CiAKLSAgICBmb3IgKEZ1bmN0aW9uRGVjbDo6cGFyYW1faXRlcmF0b3IgSSA9IEZELT5wYXJhbV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRkQtPnBhcmFtX2VuZCgpOwotICAgICAgICAgSSAhPSBFOyArK0kpCi0gICAgICAoKkkpLT5kcm9wQXR0cnMoKTsKKyAgICBmb3IgKGF1dG8gSSA6IEZELT5wYXJhbXMoKSkKKyAgICAgIEktPmRyb3BBdHRycygpOwogICB9CiB9CiAKQEAgLTY1MDksOCArNjU3OSw4IEBACiAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZQVCA9IEZULT5jYXN0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7CiAgICAgICAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBFUEkgPSBGUFQtPmdldEV4dFByb3RvSW5mbygpOwogICAgICAgICAgIEVQSS5UeXBlUXVhbHMgfD0gUXVhbGlmaWVyczo6Q29uc3Q7Ci0gICAgICAgICAgRlQgPSBDb250ZXh0LmdldEZ1bmN0aW9uVHlwZShGUFQtPmdldFJlc3VsdFR5cGUoKSwgRlBULT5nZXRBcmdUeXBlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBJKTsKKyAgICAgICAgICBGVCA9IENvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKEZQVC0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBULT5nZXRQYXJhbVR5cGVzKCksIEVQSSk7CiAgICAgICAgIH0KICAgICAgIH0KIApAQCAtNjY1Niw3ICs2NzI2LDEwIEBACiAgICAgICAgICAgIEkgIT0gRTsgKytJKSB7CiAgICAgICBOYW1lZERlY2wgKkQgPSAoKkkpLT5nZXRVbmRlcmx5aW5nRGVjbCgpOwogICAgICAgaWYgKENYWE1ldGhvZERlY2wgKk1ldGhvZCA9IGR5bl9jYXN0PENYWE1ldGhvZERlY2w+KEQpKSB7Ci0gICAgICAgIGlmIChDb250ZXh0Lmhhc1NhbWVUeXBlKEZ1bmN0aW9uLT5nZXRUeXBlKCksIE1ldGhvZC0+Z2V0VHlwZSgpKSkgeworICAgICAgICBRdWFsVHlwZSBBZGp1c3RlZCA9IEZ1bmN0aW9uLT5nZXRUeXBlKCk7CisgICAgICAgIGlmICghaGFzRXhwbGljaXRDYWxsaW5nQ29udihBZGp1c3RlZCkpCisgICAgICAgICAgQWRqdXN0ZWQgPSBhZGp1c3RDQ0FuZE5vUmV0dXJuKEFkanVzdGVkLCBNZXRob2QtPmdldFR5cGUoKSk7CisgICAgICAgIGlmIChDb250ZXh0Lmhhc1NhbWVUeXBlKEFkanVzdGVkLCBNZXRob2QtPmdldFR5cGUoKSkpIHsKICAgICAgICAgICBJbnN0YW50aWF0aW9uID0gTWV0aG9kOwogICAgICAgICAgIEluc3RhbnRpYXRlZEZyb20gPSBNZXRob2QtPmdldEluc3RhbnRpYXRlZEZyb21NZW1iZXJGdW5jdGlvbigpOwogICAgICAgICAgIE1TSW5mbyA9IE1ldGhvZC0+Z2V0TWVtYmVyU3BlY2lhbGl6YXRpb25JbmZvKCk7CkBAIC02ODc3LDggKzY5NTAsOCBAQAogICAvLyAgIG5hbWUgc2hhbGwgYmUgYSBzaW1wbGUtdGVtcGxhdGUtaWQuCiAgIC8vCiAgIC8vIEMrKzk4IGhhcyB0aGUgc2FtZSByZXN0cmljdGlvbiwganVzdCB3b3JkZWQgZGlmZmVyZW50bHkuCi0gIGZvciAoTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TID0gKE5lc3RlZE5hbWVTcGVjaWZpZXIgKilTUy5nZXRTY29wZVJlcCgpOwotICAgICAgIE5OUzsgTk5TID0gTk5TLT5nZXRQcmVmaXgoKSkKKyAgZm9yIChOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMgPSBTUy5nZXRTY29wZVJlcCgpOyBOTlM7CisgICAgICAgTk5TID0gTk5TLT5nZXRQcmVmaXgoKSkKICAgICBpZiAoY29uc3QgVHlwZSAqVCA9IE5OUy0+Z2V0QXNUeXBlKCkpCiAgICAgICBpZiAoaXNhPFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlPihUKSkKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC03MTAyLDcgKzcxNzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgS1dMb2MsIFNTLCBOYW1lLCBOYW1lTG9jLCBBdHRyLCBBU19ub25lLAogICAgICAgICAgICAgICAgICAgICAgICAgLypNb2R1bGVQcml2YXRlTG9jPSovU291cmNlTG9jYXRpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpVGVtcGxhdGVQYXJhbXNBcmcoKSwgT3duZWQsIElzRGVwZW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSwgZmFsc2UsIFR5cGVSZXN1bHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbigpLCBmYWxzZSwgVHlwZVJlc3VsdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgLypJc1R5cGVTcGVjaWZpZXIqL2ZhbHNlKTsKICAgYXNzZXJ0KCFJc0RlcGVuZGVudCAmJiAiZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBkZXBlbmRlbnQgbmFtZSBub3QgeWV0IGhhbmRsZWQiKTsKIAogICBpZiAoIVRhZ0QpCkBAIC03NTU0LDggKzc2MjgsNyBAQAogICAvLyBUaGlzIGhhcyB0byBob2xkLCBiZWNhdXNlIFNTIGlzIGV4cGVjdGVkIHRvIGJlIGRlZmluZWQuCiAgIGFzc2VydChOYW1lICYmICJFeHBlY3RlZCBhIG5hbWUgaW4gYSBkZXBlbmRlbnQgdGFnIik7CiAKLSAgTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TCi0gICAgPSBzdGF0aWNfY2FzdDxOZXN0ZWROYW1lU3BlY2lmaWVyICo+KFNTLmdldFNjb3BlUmVwKCkpOworICBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMgPSBTUy5nZXRTY29wZVJlcCgpOwogICBpZiAoIU5OUykKICAgICByZXR1cm4gdHJ1ZTsKIApAQCAtNzY0MSw4ICs3NzE0LDcgQEAKICAgaWYgKERlcGVuZGVudFRlbXBsYXRlTmFtZSAqRFROID0gVGVtcGxhdGUuZ2V0QXNEZXBlbmRlbnRUZW1wbGF0ZU5hbWUoKSkgewogICAgIC8vIENvbnN0cnVjdCBhIGRlcGVuZGVudCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0eXBlLgogICAgIGFzc2VydChEVE4gJiYgImRlcGVuZGVudCB0ZW1wbGF0ZSBoYXMgbm9uLWRlcGVuZGVudCBuYW1lPyIpOwotICAgIGFzc2VydChEVE4tPmdldFF1YWxpZmllcigpCi0gICAgICAgICAgID09IHN0YXRpY19jYXN0PE5lc3RlZE5hbWVTcGVjaWZpZXIqPihTUy5nZXRTY29wZVJlcCgpKSk7CisgICAgYXNzZXJ0KERUTi0+Z2V0UXVhbGlmaWVyKCkgPT0gU1MuZ2V0U2NvcGVSZXAoKSk7CiAgICAgUXVhbFR5cGUgVCA9IENvbnRleHQuZ2V0RGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUoRVRLX1R5cGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUTi0+Z2V0UXVhbGlmaWVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFROLT5nZXRJZGVudGlmaWVyKCksCmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hVGVtcGxhdGVEZWR1Y3Rpb24uY3BwIGIvbGliL1NlbWEvU2VtYVRlbXBsYXRlRGVkdWN0aW9uLmNwcAppbmRleCA4ZDY2ZmY2Li44YTA1ODlhIDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hVGVtcGxhdGVEZWR1Y3Rpb24uY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFUZW1wbGF0ZURlZHVjdGlvbi5jcHAKQEAgLTc4Myw3ICs3ODMsNyBAQAogICAgICAgUy5jb2xsZWN0VW5leHBhbmRlZFBhcmFtZXRlclBhY2tzKFBhdHRlcm4sIFVuZXhwYW5kZWQpOwogICAgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IFVuZXhwYW5kZWQuc2l6ZSgpOyBJICE9IE47ICsrSSkgewogICAgICAgICB1bnNpZ25lZCBEZXB0aCwgSW5kZXg7Ci0gICAgICAgIGxsdm06OnRpZShEZXB0aCwgSW5kZXgpID0gZ2V0RGVwdGhBbmRJbmRleChVbmV4cGFuZGVkW0ldKTsKKyAgICAgICAgc3RkOjp0aWUoRGVwdGgsIEluZGV4KSA9IGdldERlcHRoQW5kSW5kZXgoVW5leHBhbmRlZFtJXSk7CiAgICAgICAgIGlmIChEZXB0aCA9PSAwICYmICFTYXdJbmRpY2VzW0luZGV4XSkgewogICAgICAgICAgIFNhd0luZGljZXNbSW5kZXhdID0gdHJ1ZTsKICAgICAgICAgICBQYWNrSW5kaWNlcy5wdXNoX2JhY2soSW5kZXgpOwpAQCAtOTgxLDYgKzk4MSwxNyBAQAogICAgICAgICBDb21wYXJpc29uLlF1YWxpZmllcnMgPSBQYXJhbU1vcmVRdWFsaWZpZWQ7CiAgICAgICBlbHNlIGlmIChBcmdRdWFscy5pc1N0cmljdFN1cGVyc2V0T2YoUGFyYW1RdWFscykpCiAgICAgICAgIENvbXBhcmlzb24uUXVhbGlmaWVycyA9IEFyZ01vcmVRdWFsaWZpZWQ7CisgICAgICBlbHNlIGlmIChBcmdRdWFscy5nZXRPYmpDTGlmZXRpbWUoKSAhPSBQYXJhbVF1YWxzLmdldE9iakNMaWZldGltZSgpICYmCisgICAgICAgICAgICAgICBBcmdRdWFscy53aXRob3V0T2JqQ0xpZmV0aW1lKCkKKyAgICAgICAgICAgICAgICAgPT0gUGFyYW1RdWFscy53aXRob3V0T2JqQ0xpZmV0aW1lKCkpIHsKKyAgICAgICAgLy8gUHJlZmVyIGJpbmRpbmcgdG8gbm9uLV9fdW5zYWZlX2F1dG9yZXRhaW5lZCBwYXJhbWV0ZXJzLgorICAgICAgICBpZiAoQXJnUXVhbHMuZ2V0T2JqQ0xpZmV0aW1lKCkgPT0gUXVhbGlmaWVyczo6T0NMX0V4cGxpY2l0Tm9uZSAmJgorICAgICAgICAgICAgUGFyYW1RdWFscy5nZXRPYmpDTGlmZXRpbWUoKSkKKyAgICAgICAgICBDb21wYXJpc29uLlF1YWxpZmllcnMgPSBQYXJhbU1vcmVRdWFsaWZpZWQ7CisgICAgICAgIGVsc2UgaWYgKFBhcmFtUXVhbHMuZ2V0T2JqQ0xpZmV0aW1lKCkgPT0gUXVhbGlmaWVyczo6T0NMX0V4cGxpY2l0Tm9uZSAmJgorICAgICAgICAgICAgICAgICBBcmdRdWFscy5nZXRPYmpDTGlmZXRpbWUoKSkKKyAgICAgICAgICBDb21wYXJpc29uLlF1YWxpZmllcnMgPSBBcmdNb3JlUXVhbGlmaWVkOworICAgICAgfQogICAgICAgUmVmUGFyYW1Db21wYXJpc29ucy0+cHVzaF9iYWNrKENvbXBhcmlzb24pOwogICAgIH0KIApAQCAtMTM2NCwxOSArMTM3NSwxNyBAQAogICAgICAgICByZXR1cm4gU2VtYTo6VERLX05vbkRlZHVjZWRNaXNtYXRjaDsKIAogICAgICAgLy8gQ2hlY2sgcmV0dXJuIHR5cGVzLgotICAgICAgaWYgKFNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uUmVzdWx0IFJlc3VsdAotICAgICAgICAgICAgPSBEZWR1Y2VUZW1wbGF0ZUFyZ3VtZW50c0J5VHlwZU1hdGNoKFMsIFRlbXBsYXRlUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblByb3RvUGFyYW0tPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Qcm90b0FyZy0+Z2V0UmVzdWx0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvLCBEZWR1Y2VkLCAwKSkKKyAgICAgIGlmIChTZW1hOjpUZW1wbGF0ZURlZHVjdGlvblJlc3VsdCBSZXN1bHQgPQorICAgICAgICAgICAgICBEZWR1Y2VUZW1wbGF0ZUFyZ3VtZW50c0J5VHlwZU1hdGNoKAorICAgICAgICAgICAgICAgICAgUywgVGVtcGxhdGVQYXJhbXMsIEZ1bmN0aW9uUHJvdG9QYXJhbS0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Qcm90b0FyZy0+Z2V0UmV0dXJuVHlwZSgpLCBJbmZvLCBEZWR1Y2VkLCAwKSkKICAgICAgICAgcmV0dXJuIFJlc3VsdDsKIAotICAgICAgcmV0dXJuIERlZHVjZVRlbXBsYXRlQXJndW1lbnRzKFMsIFRlbXBsYXRlUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUHJvdG9QYXJhbS0+YXJnX3R5cGVfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblByb3RvUGFyYW0tPmdldE51bUFyZ3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblByb3RvQXJnLT5hcmdfdHlwZV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUHJvdG9BcmctPmdldE51bUFyZ3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvLCBEZWR1Y2VkLCBTdWJUREYpOworICAgICAgcmV0dXJuIERlZHVjZVRlbXBsYXRlQXJndW1lbnRzKAorICAgICAgICAgIFMsIFRlbXBsYXRlUGFyYW1zLCBGdW5jdGlvblByb3RvUGFyYW0tPnBhcmFtX3R5cGVfYmVnaW4oKSwKKyAgICAgICAgICBGdW5jdGlvblByb3RvUGFyYW0tPmdldE51bVBhcmFtcygpLAorICAgICAgICAgIEZ1bmN0aW9uUHJvdG9BcmctPnBhcmFtX3R5cGVfYmVnaW4oKSwKKyAgICAgICAgICBGdW5jdGlvblByb3RvQXJnLT5nZXROdW1QYXJhbXMoKSwgSW5mbywgRGVkdWNlZCwgU3ViVERGKTsKICAgICB9CiAKICAgICBjYXNlIFR5cGU6OkluamVjdGVkQ2xhc3NOYW1lOiB7CkBAIC0xNDYzLDEyICsxNDcyLDEwIEBACiAKICAgICAgICAgICAgIC8vIFZpc2l0IGJhc2UgY2xhc3NlcwogICAgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqTmV4dCA9IGNhc3Q8Q1hYUmVjb3JkRGVjbD4oTmV4dFQtPmdldERlY2woKSk7Ci0gICAgICAgICAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfaXRlcmF0b3IgQmFzZSA9IE5leHQtPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUVuZCA9IE5leHQtPmJhc2VzX2VuZCgpOwotICAgICAgICAgICAgICAgICBCYXNlICE9IEJhc2VFbmQ7ICsrQmFzZSkgewotICAgICAgICAgICAgICBhc3NlcnQoQmFzZS0+Z2V0VHlwZSgpLT5pc1JlY29yZFR5cGUoKSAmJgorICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZCYXNlIDogTmV4dC0+YmFzZXMoKSkgeworICAgICAgICAgICAgICBhc3NlcnQoQmFzZS5nZXRUeXBlKCktPmlzUmVjb3JkVHlwZSgpICYmCiAgICAgICAgICAgICAgICAgICAgICAiQmFzZSBjbGFzcyB0aGF0IGlzbid0IGEgcmVjb3JkPyIpOwotICAgICAgICAgICAgICBUb1Zpc2l0LnB1c2hfYmFjayhCYXNlLT5nZXRUeXBlKCktPmdldEFzPFJlY29yZFR5cGU+KCkpOworICAgICAgICAgICAgICBUb1Zpc2l0LnB1c2hfYmFjayhCYXNlLmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogCkBAIC0xODU0LDcgKzE4NjEsNyBAQAogICAgICAgUy5jb2xsZWN0VW5leHBhbmRlZFBhcmFtZXRlclBhY2tzKFBhdHRlcm4sIFVuZXhwYW5kZWQpOwogICAgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IFVuZXhwYW5kZWQuc2l6ZSgpOyBJICE9IE47ICsrSSkgewogICAgICAgICB1bnNpZ25lZCBEZXB0aCwgSW5kZXg7Ci0gICAgICAgIGxsdm06OnRpZShEZXB0aCwgSW5kZXgpID0gZ2V0RGVwdGhBbmRJbmRleChVbmV4cGFuZGVkW0ldKTsKKyAgICAgICAgc3RkOjp0aWUoRGVwdGgsIEluZGV4KSA9IGdldERlcHRoQW5kSW5kZXgoVW5leHBhbmRlZFtJXSk7CiAgICAgICAgIGlmIChEZXB0aCA9PSAwICYmICFTYXdJbmRpY2VzW0luZGV4XSkgewogICAgICAgICAgIFNhd0luZGljZXNbSW5kZXhdID0gdHJ1ZTsKICAgICAgICAgICBQYWNrSW5kaWNlcy5wdXNoX2JhY2soSW5kZXgpOwpAQCAtMjI3NCw4ICsyMjgxLDggQEAKICAgICByZXR1cm4gUmVzdWx0OwogCiAgIFNtYWxsVmVjdG9yPFRlbXBsYXRlQXJndW1lbnQsIDQ+IERlZHVjZWRBcmdzKERlZHVjZWQuYmVnaW4oKSwgRGVkdWNlZC5lbmQoKSk7Ci0gIEluc3RhbnRpYXRpbmdUZW1wbGF0ZSBJbnN0KCp0aGlzLCBQYXJ0aWFsLT5nZXRMb2NhdGlvbigpLCBQYXJ0aWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWR1Y2VkQXJncywgSW5mbyk7CisgIEluc3RhbnRpYXRpbmdUZW1wbGF0ZSBJbnN0KCp0aGlzLCBJbmZvLmdldExvY2F0aW9uKCksIFBhcnRpYWwsIERlZHVjZWRBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvKTsKICAgaWYgKEluc3QuaXNJbnZhbGlkKCkpCiAgICAgcmV0dXJuIFRES19JbnN0YW50aWF0aW9uRGVwdGg7CiAKQEAgLTI0MzgsOCArMjQ0NSw4IEBACiAgICAgcmV0dXJuIFJlc3VsdDsKIAogICBTbWFsbFZlY3RvcjxUZW1wbGF0ZUFyZ3VtZW50LCA0PiBEZWR1Y2VkQXJncyhEZWR1Y2VkLmJlZ2luKCksIERlZHVjZWQuZW5kKCkpOwotICBJbnN0YW50aWF0aW5nVGVtcGxhdGUgSW5zdCgqdGhpcywgUGFydGlhbC0+Z2V0TG9jYXRpb24oKSwgUGFydGlhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVkdWNlZEFyZ3MsIEluZm8pOworICBJbnN0YW50aWF0aW5nVGVtcGxhdGUgSW5zdCgqdGhpcywgSW5mby5nZXRMb2NhdGlvbigpLCBQYXJ0aWFsLCBEZWR1Y2VkQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyk7CiAgIGlmIChJbnN0LmlzSW52YWxpZCgpKQogICAgIHJldHVybiBUREtfSW5zdGFudGlhdGlvbkRlcHRoOwogCkBAIC0yNDk4LDExICsyNTA1LDggQEAKICAgaWYgKEV4cGxpY2l0VGVtcGxhdGVBcmdzLnNpemUoKSA9PSAwKSB7CiAgICAgLy8gTm8gYXJndW1lbnRzIHRvIHN1YnN0aXR1dGU7IGp1c3QgY29weSBvdmVyIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYW5kCiAgICAgLy8gZmlsbCBpbiB0aGUgZnVuY3Rpb24gdHlwZS4KLSAgICBmb3IgKEZ1bmN0aW9uRGVjbDo6cGFyYW1faXRlcmF0b3IgUCA9IEZ1bmN0aW9uLT5wYXJhbV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRW5kID0gRnVuY3Rpb24tPnBhcmFtX2VuZCgpOwotICAgICAgICAgUCAhPSBQRW5kOwotICAgICAgICAgKytQKQotICAgICAgUGFyYW1UeXBlcy5wdXNoX2JhY2soKCpQKS0+Z2V0VHlwZSgpKTsKKyAgICBmb3IgKGF1dG8gUCA6IEZ1bmN0aW9uLT5wYXJhbXMoKSkKKyAgICAgIFBhcmFtVHlwZXMucHVzaF9iYWNrKFAtPmdldFR5cGUoKSk7CiAKICAgICBpZiAoRnVuY3Rpb25UeXBlKQogICAgICAgKkZ1bmN0aW9uVHlwZSA9IEZ1bmN0aW9uLT5nZXRUeXBlKCk7CkBAIC0yNTI0LDggKzI1MjgsOCBAQAogICAvLyBleHBsaWNpdGx5LXNwZWNpZmllZCB0ZW1wbGF0ZSBhcmd1bWVudHMgYWdhaW5zdCB0aGlzIGZ1bmN0aW9uIHRlbXBsYXRlLAogICAvLyBhbmQgdGhlbiBzdWJzdGl0dXRlIHRoZW0gaW50byB0aGUgZnVuY3Rpb24gcGFyYW1ldGVyIHR5cGVzLgogICBTbWFsbFZlY3RvcjxUZW1wbGF0ZUFyZ3VtZW50LCA0PiBEZWR1Y2VkQXJncyhEZWR1Y2VkLmJlZ2luKCksIERlZHVjZWQuZW5kKCkpOwotICBJbnN0YW50aWF0aW5nVGVtcGxhdGUgSW5zdCgqdGhpcywgRnVuY3Rpb25UZW1wbGF0ZS0+Z2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25UZW1wbGF0ZSwgRGVkdWNlZEFyZ3MsCisgIEluc3RhbnRpYXRpbmdUZW1wbGF0ZSBJbnN0KCp0aGlzLCBJbmZvLmdldExvY2F0aW9uKCksIEZ1bmN0aW9uVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZHVjZWRBcmdzLAogICAgICAgICAgICBBY3RpdmVUZW1wbGF0ZUluc3RhbnRpYXRpb246OkV4cGxpY2l0VGVtcGxhdGVBcmd1bWVudFN1YnN0aXR1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyk7CiAgIGlmIChJbnN0LmlzSW52YWxpZCgpKQpAQCAtMjYwNCwxMSArMjYwOCwxMSBAQAogICAgICAgCiAgICAgQ1hYVGhpc1Njb3BlUkFJSSBUaGlzU2NvcGUoKnRoaXMsIFRoaXNDb250ZXh0LCBUaGlzVHlwZVF1YWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEpOwotICAgIAotICAgIFJlc3VsdFR5cGUgPSBTdWJzdFR5cGUoUHJvdG8tPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QoKkV4cGxpY2l0QXJndW1lbnRMaXN0KSwKLSAgICAgICAgICAgICAgICAgICBGdW5jdGlvbi0+Z2V0VHlwZVNwZWNTdGFydExvYygpLAotICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uLT5nZXREZWNsTmFtZSgpKTsKKworICAgIFJlc3VsdFR5cGUgPQorICAgICAgICBTdWJzdFR5cGUoUHJvdG8tPmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICAgIE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCgqRXhwbGljaXRBcmd1bWVudExpc3QpLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb24tPmdldFR5cGVTcGVjU3RhcnRMb2MoKSwgRnVuY3Rpb24tPmdldERlY2xOYW1lKCkpOwogICAgIGlmIChSZXN1bHRUeXBlLmlzTnVsbCgpIHx8IFRyYXAuaGFzRXJyb3JPY2N1cnJlZCgpKQogICAgICAgcmV0dXJuIFRES19TdWJzdGl0dXRpb25GYWlsdXJlOwogICB9CkBAIC0yNzc4LDggKzI3ODIsOCBAQAogICAvLyBFbnRlciBhIG5ldyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGNvbnRleHQgd2hpbGUgd2UgaW5zdGFudGlhdGUgdGhlCiAgIC8vIGFjdHVhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KICAgU21hbGxWZWN0b3I8VGVtcGxhdGVBcmd1bWVudCwgND4gRGVkdWNlZEFyZ3MoRGVkdWNlZC5iZWdpbigpLCBEZWR1Y2VkLmVuZCgpKTsKLSAgSW5zdGFudGlhdGluZ1RlbXBsYXRlIEluc3QoKnRoaXMsIEZ1bmN0aW9uVGVtcGxhdGUtPmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVGVtcGxhdGUsIERlZHVjZWRBcmdzLAorICBJbnN0YW50aWF0aW5nVGVtcGxhdGUgSW5zdCgqdGhpcywgSW5mby5nZXRMb2NhdGlvbigpLCBGdW5jdGlvblRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWR1Y2VkQXJncywKICAgICAgICAgICAgICAgQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uOjpEZWR1Y2VkVGVtcGxhdGVBcmd1bWVudFN1YnN0aXR1dGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyk7CiAgIGlmIChJbnN0LmlzSW52YWxpZCgpKQpAQCAtMjk3Niw4ICsyOTgwLDggQEAKIHN0YXRpYyBRdWFsVHlwZSBHZXRUeXBlT2ZGdW5jdGlvbihTZW1hICZTLCBjb25zdCBPdmVybG9hZEV4cHI6OkZpbmRSZXN1bHQgJlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25EZWNsICpGbikgewogICAvLyBXZSBtYXkgbmVlZCB0byBkZWR1Y2UgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiBub3cuCi0gIGlmIChTLmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMXkgJiYgRm4tPmdldFJlc3VsdFR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCkgJiYKLSAgICAgIFMuRGVkdWNlUmV0dXJuVHlwZShGbiwgUi5FeHByZXNzaW9uLT5nZXRFeHByTG9jKCksIC8qRGlhZ25vc2UqL2ZhbHNlKSkKKyAgaWYgKFMuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxeSAmJiBGbi0+Z2V0UmV0dXJuVHlwZSgpLT5pc1VuZGVkdWNlZFR5cGUoKSAmJgorICAgICAgUy5EZWR1Y2VSZXR1cm5UeXBlKEZuLCBSLkV4cHJlc3Npb24tPmdldEV4cHJMb2MoKSwgLypEaWFnbm9zZSovIGZhbHNlKSkKICAgICByZXR1cm4gUXVhbFR5cGUoKTsKIAogICBpZiAoQ1hYTWV0aG9kRGVjbCAqTWV0aG9kID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4oRm4pKQpAQCAtMzQwNiw3ICszNDEwLDcgQEAKICAgICAgIGNvbGxlY3RVbmV4cGFuZGVkUGFyYW1ldGVyUGFja3MoUGFyYW1QYXR0ZXJuLCBVbmV4cGFuZGVkKTsKICAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBVbmV4cGFuZGVkLnNpemUoKTsgSSAhPSBOOyArK0kpIHsKICAgICAgICAgdW5zaWduZWQgRGVwdGgsIEluZGV4OwotICAgICAgICBsbHZtOjp0aWUoRGVwdGgsIEluZGV4KSA9IGdldERlcHRoQW5kSW5kZXgoVW5leHBhbmRlZFtJXSk7CisgICAgICAgIHN0ZDo6dGllKERlcHRoLCBJbmRleCkgPSBnZXREZXB0aEFuZEluZGV4KFVuZXhwYW5kZWRbSV0pOwogICAgICAgICBpZiAoRGVwdGggPT0gMCAmJiAhU2F3SW5kaWNlc1tJbmRleF0pIHsKICAgICAgICAgICBTYXdJbmRpY2VzW0luZGV4XSA9IHRydWU7CiAgICAgICAgICAgUGFja0luZGljZXMucHVzaF9iYWNrKEluZGV4KTsKQEAgLTM1ODksNyArMzU5Myw3IEBACiAgIC8vIHR5cGUgc28gdGhhdCB3ZSB0cmVhdCBpdCBhcyBhIG5vbi1kZWR1Y2VkIGNvbnRleHQgaW4gd2hhdCBmb2xsb3dzLgogICBib29sIEhhc0RlZHVjZWRSZXR1cm5UeXBlID0gZmFsc2U7CiAgIGlmIChnZXRMYW5nT3B0cygpLkNQbHVzUGx1czF5ICYmIEluT3ZlcmxvYWRSZXNvbHV0aW9uICYmCi0gICAgICBGdW5jdGlvbi0+Z2V0UmVzdWx0VHlwZSgpLT5nZXRDb250YWluZWRBdXRvVHlwZSgpKSB7CisgICAgICBGdW5jdGlvbi0+Z2V0UmV0dXJuVHlwZSgpLT5nZXRDb250YWluZWRBdXRvVHlwZSgpKSB7CiAgICAgRnVuY3Rpb25UeXBlID0gU3Vic3RBdXRvVHlwZShGdW5jdGlvblR5cGUsIENvbnRleHQuRGVwZW5kZW50VHkpOwogICAgIEhhc0RlZHVjZWRSZXR1cm5UeXBlID0gdHJ1ZTsKICAgfQpAQCAtMzYxNCw3ICszNjE4LDcgQEAKICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGhhcyBhIGRlZHVjZWQgcmV0dXJuIHR5cGUsIGRlZHVjZSBpdCBub3csIHNvIHdlIGNhbiBjaGVjawogICAvLyB0aGF0IHRoZSBkZWR1Y2VkIGZ1bmN0aW9uIHR5cGUgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIHR5cGUuCiAgIGlmIChIYXNEZWR1Y2VkUmV0dXJuVHlwZSAmJgotICAgICAgU3BlY2lhbGl6YXRpb24tPmdldFJlc3VsdFR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCkgJiYKKyAgICAgIFNwZWNpYWxpemF0aW9uLT5nZXRSZXR1cm5UeXBlKCktPmlzVW5kZWR1Y2VkVHlwZSgpICYmCiAgICAgICBEZWR1Y2VSZXR1cm5UeXBlKFNwZWNpYWxpemF0aW9uLCBJbmZvLmdldExvY2F0aW9uKCksIGZhbHNlKSkKICAgICByZXR1cm4gVERLX01pc2NlbGxhbmVvdXNEZWR1Y3Rpb25GYWlsdXJlOwogCkBAIC0zNjQzLDcgKzM2NDcsNyBAQAogU3Vic3RBdXRvV2l0aGluRnVuY3Rpb25SZXR1cm5UeXBlKEZ1bmN0aW9uRGVjbCAqRiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBUeXBlVG9SZXBsYWNlQXV0b1dpdGgsIFNlbWEgJlMpIHsKICAgYXNzZXJ0KCFUeXBlVG9SZXBsYWNlQXV0b1dpdGgtPmdldENvbnRhaW5lZEF1dG9UeXBlKCkpOwotICBRdWFsVHlwZSBBdXRvUmVzdWx0VHlwZSA9IEYtPmdldFJlc3VsdFR5cGUoKTsKKyAgUXVhbFR5cGUgQXV0b1Jlc3VsdFR5cGUgPSBGLT5nZXRSZXR1cm5UeXBlKCk7CiAgIGFzc2VydChBdXRvUmVzdWx0VHlwZS0+Z2V0Q29udGFpbmVkQXV0b1R5cGUoKSk7IAogICBRdWFsVHlwZSBEZWR1Y2VkUmVzdWx0VHlwZSA9IFMuU3Vic3RBdXRvVHlwZShBdXRvUmVzdWx0VHlwZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVUb1JlcGxhY2VBdXRvV2l0aCk7CkBAIC0zNjY4LDcgKzM2NzIsNyBAQAogICBhc3NlcnQoTGFtYmRhQ2xhc3MgJiYgTGFtYmRhQ2xhc3MtPmlzR2VuZXJpY0xhbWJkYSgpKTsgCiAgIAogICBDWFhNZXRob2REZWNsICpDYWxsT3BHZW5lcmljID0gTGFtYmRhQ2xhc3MtPmdldExhbWJkYUNhbGxPcGVyYXRvcigpOwotICBRdWFsVHlwZSBDYWxsT3BSZXN1bHRUeXBlID0gQ2FsbE9wR2VuZXJpYy0+Z2V0UmVzdWx0VHlwZSgpOyAKKyAgUXVhbFR5cGUgQ2FsbE9wUmVzdWx0VHlwZSA9IENhbGxPcEdlbmVyaWMtPmdldFJldHVyblR5cGUoKTsKICAgY29uc3QgYm9vbCBHZW5lcmljTGFtYmRhQ2FsbE9wZXJhdG9ySGFzRGVkdWNlZFJldHVyblR5cGUgPSAKICAgICAgIENhbGxPcFJlc3VsdFR5cGUtPmdldENvbnRhaW5lZEF1dG9UeXBlKCk7CiAgIApAQCAtMzY4NSwxNSArMzY4OSwxNSBAQAogICAgIHJldHVybiBSZXN1bHQ7CiAgCiAgIC8vIElmIHdlIG5lZWQgdG8gZGVkdWNlIHRoZSByZXR1cm4gdHlwZSwgZG8gc28gKGluc3RhbnRpYXRlcyB0aGUgY2FsbG9wKS4KLSAgaWYgKEdlbmVyaWNMYW1iZGFDYWxsT3BlcmF0b3JIYXNEZWR1Y2VkUmV0dXJuVHlwZSAmJiAKLSAgICAgICAgICAgICAgICBDYWxsT3BTcGVjaWFsaXplZC0+Z2V0UmVzdWx0VHlwZSgpLT5pc1VuZGVkdWNlZFR5cGUoKSkKKyAgaWYgKEdlbmVyaWNMYW1iZGFDYWxsT3BlcmF0b3JIYXNEZWR1Y2VkUmV0dXJuVHlwZSAmJgorICAgICAgQ2FsbE9wU3BlY2lhbGl6ZWQtPmdldFJldHVyblR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCkpCiAgICAgUy5EZWR1Y2VSZXR1cm5UeXBlKENhbGxPcFNwZWNpYWxpemVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbE9wU3BlY2lhbGl6ZWQtPmdldFBvaW50T2ZJbnN0YW50aWF0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgIC8qRGlhZ25vc2UqLyB0cnVlKTsKICAgICAKICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZGVzdGluYXRpb24gcHRyLXRvLWZ1bmN0aW9uCiAgIC8vIG1hdGNoZXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBjYWxsIG9wZXJhdG9yLgotICBpZiAoIVMuQ29udGV4dC5oYXNTYW1lVHlwZShDYWxsT3BTcGVjaWFsaXplZC0+Z2V0UmVzdWx0VHlwZSgpLCAKKyAgaWYgKCFTLkNvbnRleHQuaGFzU2FtZVR5cGUoQ2FsbE9wU3BlY2lhbGl6ZWQtPmdldFJldHVyblR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZU9mRGVzdEZ1bmN0aW9uUHRyKSkKICAgICByZXR1cm4gU2VtYTo6VERLX05vbkRlZHVjZWRNaXNtYXRjaDsKICAgLy8gU2luY2Ugd2UgaGF2ZSBzdWNjZWVkZWQgaW4gbWF0Y2hpbmcgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KQEAgLTM3MTIsOCArMzcxNiw4IEBACiAgICAgIklmIHRoZSBjYWxsIG9wZXJhdG9yIHN1Y2NlZWRlZCBzbyBzaG91bGQgdGhlIGludm9rZXIhIik7CiAgIC8vIFNldCB0aGUgcmVzdWx0IHR5cGUgdG8gbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgY2FsbCBvcGVyYXRvcgogICAvLyBzcGVjaWFsaXphdGlvbidzIHJlc3VsdCB0eXBlLgotICBpZiAoR2VuZXJpY0xhbWJkYUNhbGxPcGVyYXRvckhhc0RlZHVjZWRSZXR1cm5UeXBlICYmIAotICAgICAgSW52b2tlclNwZWNpYWxpemVkLT5nZXRSZXN1bHRUeXBlKCktPmlzVW5kZWR1Y2VkVHlwZSgpKSB7CisgIGlmIChHZW5lcmljTGFtYmRhQ2FsbE9wZXJhdG9ySGFzRGVkdWNlZFJldHVyblR5cGUgJiYKKyAgICAgIEludm9rZXJTcGVjaWFsaXplZC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1VuZGVkdWNlZFR5cGUoKSkgewogICAgIC8vIEJlIHN1cmUgdG8gZ2V0IHRoZSB0eXBlIHRvIHJlcGxhY2UgJ2F1dG8nIHdpdGggYW5kIG5vdAogICAgIC8vIHRoZSBmdWxsIHJlc3VsdCB0eXBlIG9mIHRoZSBjYWxsIG9wIHNwZWNpYWxpemF0aW9uIAogICAgIC8vIHRvIHN1YnN0aXR1dGUgaW50byB0aGUgJ2F1dG8nIG9mIHRoZSBpbnZva2VyIGFuZCBjb252ZXJzaW9uCkBAIC0zNzIyLDkgKzM3MjYsOSBAQAogICAgIC8vICBpbnQqICgqZnApKGludCopID0gW10oYXV0byogYSkgLT4gYXV0byogeyByZXR1cm4gYTsgfTsKICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHN1YnN0ICdpbnQqJyBpbnRvICdhdXRvJyB0byBnZXQgaW50KiouCiAKLSAgICBRdWFsVHlwZSBUeXBlVG9SZXBsYWNlQXV0b1dpdGggPSAKLSAgICAgICAgQ2FsbE9wU3BlY2lhbGl6ZWQtPmdldFJlc3VsdFR5cGUoKS0+Ci0gICAgICAgICAgICBnZXRDb250YWluZWRBdXRvVHlwZSgpLT5nZXREZWR1Y2VkVHlwZSgpOworICAgIFF1YWxUeXBlIFR5cGVUb1JlcGxhY2VBdXRvV2l0aCA9IENhbGxPcFNwZWNpYWxpemVkLT5nZXRSZXR1cm5UeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRDb250YWluZWRBdXRvVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0RGVkdWNlZFR5cGUoKTsKICAgICBTdWJzdEF1dG9XaXRoaW5GdW5jdGlvblJldHVyblR5cGUoSW52b2tlclNwZWNpYWxpemVkLAogICAgICAgICBUeXBlVG9SZXBsYWNlQXV0b1dpdGgsIFMpOwogICAgIFN1YnN0QXV0b1dpdGhpbkZ1bmN0aW9uUmV0dXJuVHlwZShDb252ZXJzaW9uU3BlY2lhbGl6ZWQsIApAQCAtMzc0MCw3ICszNzQ0LDcgQEAKICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBFUEkgPSBJbnZva2VyRlBULT5nZXRFeHRQcm90b0luZm8oKTsKICAgRVBJLlR5cGVRdWFscyA9IDA7CiAgIEludm9rZXJTcGVjaWFsaXplZC0+c2V0VHlwZShTLkNvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKAotICAgICAgSW52b2tlckZQVC0+Z2V0UmVzdWx0VHlwZSgpLCBJbnZva2VyRlBULT5nZXRBcmdUeXBlcygpLEVQSSkpOworICAgICAgSW52b2tlckZQVC0+Z2V0UmV0dXJuVHlwZSgpLCBJbnZva2VyRlBULT5nZXRQYXJhbVR5cGVzKCksIEVQSSkpOwogICByZXR1cm4gU2VtYTo6VERLX1N1Y2Nlc3M7CiB9CiAvLy8gXGJyaWVmIERlZHVjZSB0ZW1wbGF0ZSBhcmd1bWVudHMgZm9yIGEgdGVtcGxhdGVkIGNvbnZlcnNpb24KQEAgLTM4NjMsOCArMzg2Nyw4IEBACiAgICAgICAgICJDYW4gb25seSBjb252ZXJ0IGZyb20gbGFtYmRhIHRvIHB0ci10by1mdW5jdGlvbiIpOwogICAgIGNvbnN0IEZ1bmN0aW9uVHlwZSAqVG9GdW5UeXBlID0gCiAgICAgICAgIEEtPmdldFBvaW50ZWVUeXBlKCkuZ2V0VHlwZVB0cigpLT5nZXRBczxGdW5jdGlvblR5cGU+KCk7Ci0gICAgY29uc3QgUXVhbFR5cGUgRGVzdEZ1bmN0aW9uUHRyUmV0dXJuVHlwZSA9IFRvRnVuVHlwZS0+Z2V0UmVzdWx0VHlwZSgpOwotICAgIAorICAgIGNvbnN0IFF1YWxUeXBlIERlc3RGdW5jdGlvblB0clJldHVyblR5cGUgPSBUb0Z1blR5cGUtPmdldFJldHVyblR5cGUoKTsKKwogICAgIC8vIENyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBzcGVjaWFsaXphdGlvbnMgb2YgdGhlIGNhbGwgb3BlcmF0b3IgYW5kIAogICAgIC8vIHRoZSBzdGF0aWMtaW52b2tlcjsgYW5kIGlmIHRoZSByZXR1cm4gdHlwZSBpcyBhdXRvLCAKICAgICAvLyBkZWR1Y2UgdGhlIHJldHVybiB0eXBlIGFuZCBjaGVjayBpZiBpdCBtYXRjaGVzIHRoZSAKQEAgLTQxMDksMTIgKzQxMTMsMTIgQEAKIAogYm9vbCBTZW1hOjpEZWR1Y2VSZXR1cm5UeXBlKEZ1bmN0aW9uRGVjbCAqRkQsIFNvdXJjZUxvY2F0aW9uIExvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpYWdub3NlKSB7Ci0gIGFzc2VydChGRC0+Z2V0UmVzdWx0VHlwZSgpLT5pc1VuZGVkdWNlZFR5cGUoKSk7CisgIGFzc2VydChGRC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1VuZGVkdWNlZFR5cGUoKSk7CiAKICAgaWYgKEZELT5nZXRUZW1wbGF0ZUluc3RhbnRpYXRpb25QYXR0ZXJuKCkpCiAgICAgSW5zdGFudGlhdGVGdW5jdGlvbkRlZmluaXRpb24oTG9jLCBGRCk7CiAKLSAgYm9vbCBTdGlsbFVuZGVkdWNlZCA9IEZELT5nZXRSZXN1bHRUeXBlKCktPmlzVW5kZWR1Y2VkVHlwZSgpOworICBib29sIFN0aWxsVW5kZWR1Y2VkID0gRkQtPmdldFJldHVyblR5cGUoKS0+aXNVbmRlZHVjZWRUeXBlKCk7CiAgIGlmIChTdGlsbFVuZGVkdWNlZCAmJiBEaWFnbm9zZSAmJiAhRkQtPmlzSW52YWxpZERlY2woKSkgewogICAgIERpYWcoTG9jLCBkaWFnOjplcnJfYXV0b19mbl91c2VkX2JlZm9yZV9kZWZpbmVkKSA8PCBGRDsKICAgICBEaWFnKEZELT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX2NhbGxlZV9kZWNsKSA8PCBGRDsKQEAgLTQyMjAsMTAgKzQyMjQsMTAgQEAKICAgICAgICAgKytTa2lwMTsKICAgICB9CiAKLSAgICBBcmdzMS5pbnNlcnQoQXJnczEuZW5kKCksCi0gICAgICAgICAgICAgICAgIFByb3RvMS0+YXJnX3R5cGVfYmVnaW4oKSArIFNraXAxLCBQcm90bzEtPmFyZ190eXBlX2VuZCgpKTsKLSAgICBBcmdzMi5pbnNlcnQoQXJnczIuZW5kKCksCi0gICAgICAgICAgICAgICAgIFByb3RvMi0+YXJnX3R5cGVfYmVnaW4oKSArIFNraXAyLCBQcm90bzItPmFyZ190eXBlX2VuZCgpKTsKKyAgICBBcmdzMS5pbnNlcnQoQXJnczEuZW5kKCksIFByb3RvMS0+cGFyYW1fdHlwZV9iZWdpbigpICsgU2tpcDEsCisgICAgICAgICAgICAgICAgIFByb3RvMS0+cGFyYW1fdHlwZV9lbmQoKSk7CisgICAgQXJnczIuaW5zZXJ0KEFyZ3MyLmVuZCgpLCBQcm90bzItPnBhcmFtX3R5cGVfYmVnaW4oKSArIFNraXAyLAorICAgICAgICAgICAgICAgICBQcm90bzItPnBhcmFtX3R5cGVfZW5kKCkpOwogCiAgICAgLy8gQysrIFt0ZW1wLmZ1bmMub3JkZXJdcDU6CiAgICAgLy8gICBUaGUgcHJlc2VuY2Ugb2YgdW51c2VkIGVsbGlwc2lzIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBoYXMgbm8gZWZmZWN0IG9uCkBAIC00MjQ0LDEyICs0MjQ4LDEwIEBACiAgIGNhc2UgVFBPQ19Db252ZXJzaW9uOgogICAgIC8vICAgLSBJbiB0aGUgY29udGV4dCBvZiBhIGNhbGwgdG8gYSBjb252ZXJzaW9uIG9wZXJhdG9yLCB0aGUgcmV0dXJuIHR5cGVzCiAgICAgLy8gICAgIG9mIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9uIHRlbXBsYXRlcyBhcmUgdXNlZC4KLSAgICBpZiAoRGVkdWNlVGVtcGxhdGVBcmd1bWVudHNCeVR5cGVNYXRjaChTLCBUZW1wbGF0ZVBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90bzItPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90bzEtPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvLCBEZWR1Y2VkLCBUREZfTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlBhcnRpYWxPcmRlcmluZz0qL3RydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmUGFyYW1Db21wYXJpc29ucykpCisgICAgaWYgKERlZHVjZVRlbXBsYXRlQXJndW1lbnRzQnlUeXBlTWF0Y2goCisgICAgICAgICAgICBTLCBUZW1wbGF0ZVBhcmFtcywgUHJvdG8yLT5nZXRSZXR1cm5UeXBlKCksIFByb3RvMS0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgICAgSW5mbywgRGVkdWNlZCwgVERGX05vbmUsCisgICAgICAgICAgICAvKlBhcnRpYWxPcmRlcmluZz0qL3RydWUsIFJlZlBhcmFtQ29tcGFyaXNvbnMpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGJyZWFrOwogCkBAIC00MjkzLDkgKzQyOTUsOCBAQAogICAgIGJyZWFrOwogCiAgIGNhc2UgVFBPQ19Db252ZXJzaW9uOgotICAgIDo6TWFya1VzZWRUZW1wbGF0ZVBhcmFtZXRlcnMoUy5Db250ZXh0LCBQcm90bzItPmdldFJlc3VsdFR5cGUoKSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtcy0+Z2V0RGVwdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWRQYXJhbWV0ZXJzKTsKKyAgICA6Ok1hcmtVc2VkVGVtcGxhdGVQYXJhbWV0ZXJzKFMuQ29udGV4dCwgUHJvdG8yLT5nZXRSZXR1cm5UeXBlKCksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVQYXJhbXMtPmdldERlcHRoKCksIFVzZWRQYXJhbWV0ZXJzKTsKICAgICBicmVhazsKIAogICBjYXNlIFRQT0NfT3RoZXI6CkBAIC00NjEzLDggKzQ2MTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlJlZlBhcmFtQ29tcGFyaXNvbnM9Ki8wKTsKICAgaWYgKEJldHRlcjEpIHsKICAgICBTbWFsbFZlY3RvcjxUZW1wbGF0ZUFyZ3VtZW50LCA0PiBEZWR1Y2VkQXJncyhEZWR1Y2VkLmJlZ2luKCksRGVkdWNlZC5lbmQoKSk7Ci0gICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlIEluc3QoKnRoaXMsIFBTMi0+Z2V0TG9jYXRpb24oKSwgUFMyLCBEZWR1Y2VkQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvKTsKKyAgICBJbnN0YW50aWF0aW5nVGVtcGxhdGUgSW5zdCgqdGhpcywgTG9jLCBQUzIsIERlZHVjZWRBcmdzLCBJbmZvKTsKICAgICBCZXR0ZXIxID0gITo6RmluaXNoVGVtcGxhdGVBcmd1bWVudERlZHVjdGlvbigKICAgICAgICAgKnRoaXMsIFBTMiwgUFMxLT5nZXRUZW1wbGF0ZUFyZ3MoKSwgRGVkdWNlZCwgSW5mbyk7CiAgIH0KQEAgLTQ2MjksOCArNDYyOSw3IEBACiAgIGlmIChCZXR0ZXIyKSB7CiAgICAgU21hbGxWZWN0b3I8VGVtcGxhdGVBcmd1bWVudCwgND4gRGVkdWNlZEFyZ3MoRGVkdWNlZC5iZWdpbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZHVjZWQuZW5kKCkpOwotICAgIEluc3RhbnRpYXRpbmdUZW1wbGF0ZSBJbnN0KCp0aGlzLCBQUzEtPmdldExvY2F0aW9uKCksIFBTMSwgRGVkdWNlZEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyk7CisgICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlIEluc3QoKnRoaXMsIExvYywgUFMxLCBEZWR1Y2VkQXJncywgSW5mbyk7CiAgICAgQmV0dGVyMiA9ICE6OkZpbmlzaFRlbXBsYXRlQXJndW1lbnREZWR1Y3Rpb24oCiAgICAgICAgICp0aGlzLCBQUzEsIFBTMi0+Z2V0VGVtcGxhdGVBcmdzKCksIERlZHVjZWQsIEluZm8pOwogICB9CkBAIC00NjUzLDcgKzQ2NTIsNyBAQAogICBTbWFsbFZlY3RvcjxEZWR1Y2VkVGVtcGxhdGVBcmd1bWVudCwgND4gRGVkdWNlZDsKICAgVGVtcGxhdGVEZWR1Y3Rpb25JbmZvIEluZm8oTG9jKTsKIAotICBhc3NlcnQoUFMxLT5nZXRTcGVjaWFsaXplZFRlbXBsYXRlKCkgPT0gUFMxLT5nZXRTcGVjaWFsaXplZFRlbXBsYXRlKCkgJiYKKyAgYXNzZXJ0KFBTMS0+Z2V0U3BlY2lhbGl6ZWRUZW1wbGF0ZSgpID09IFBTMi0+Z2V0U3BlY2lhbGl6ZWRUZW1wbGF0ZSgpICYmCiAgICAgICAgICAidGhlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb25zIGJlaW5nIGNvbXBhcmVkIHNob3VsZCBzcGVjaWFsaXplIgogICAgICAgICAgIiB0aGUgc2FtZSB0ZW1wbGF0ZS4iKTsKICAgVGVtcGxhdGVOYW1lIE5hbWUoUFMxLT5nZXRTcGVjaWFsaXplZFRlbXBsYXRlKCkpOwpAQCAtNDY3NCw4ICs0NjczLDcgQEAKICAgaWYgKEJldHRlcjEpIHsKICAgICBTbWFsbFZlY3RvcjxUZW1wbGF0ZUFyZ3VtZW50LCA0PiBEZWR1Y2VkQXJncyhEZWR1Y2VkLmJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVkdWNlZC5lbmQoKSk7Ci0gICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlIEluc3QoKnRoaXMsIFBTMi0+Z2V0TG9jYXRpb24oKSwgUFMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZHVjZWRBcmdzLCBJbmZvKTsKKyAgICBJbnN0YW50aWF0aW5nVGVtcGxhdGUgSW5zdCgqdGhpcywgTG9jLCBQUzIsIERlZHVjZWRBcmdzLCBJbmZvKTsKICAgICBCZXR0ZXIxID0gITo6RmluaXNoVGVtcGxhdGVBcmd1bWVudERlZHVjdGlvbigqdGhpcywgUFMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTMS0+Z2V0VGVtcGxhdGVBcmdzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVkdWNlZCwgSW5mbyk7CkBAIC00NjkxLDggKzQ2ODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlJlZlBhcmFtQ29tcGFyaXNvbnM9Ki8wKTsKICAgaWYgKEJldHRlcjIpIHsKICAgICBTbWFsbFZlY3RvcjxUZW1wbGF0ZUFyZ3VtZW50LCA0PiBEZWR1Y2VkQXJncyhEZWR1Y2VkLmJlZ2luKCksRGVkdWNlZC5lbmQoKSk7Ci0gICAgSW5zdGFudGlhdGluZ1RlbXBsYXRlIEluc3QoKnRoaXMsIFBTMS0+Z2V0TG9jYXRpb24oKSwgUFMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZHVjZWRBcmdzLCBJbmZvKTsKKyAgICBJbnN0YW50aWF0aW5nVGVtcGxhdGUgSW5zdCgqdGhpcywgTG9jLCBQUzEsIERlZHVjZWRBcmdzLCBJbmZvKTsKICAgICBCZXR0ZXIyID0gITo6RmluaXNoVGVtcGxhdGVBcmd1bWVudERlZHVjdGlvbigqdGhpcywgUFMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTMi0+Z2V0VGVtcGxhdGVBcmdzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVkdWNlZCwgSW5mbyk7CkBAIC00ODc0LDEwICs0ODcxLDEwIEBACiAKICAgY2FzZSBUeXBlOjpGdW5jdGlvblByb3RvOiB7CiAgICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlByb3RvID0gY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oVCk7Ci0gICAgTWFya1VzZWRUZW1wbGF0ZVBhcmFtZXRlcnMoQ3R4LCBQcm90by0+Z2V0UmVzdWx0VHlwZSgpLCBPbmx5RGVkdWNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXB0aCwgVXNlZCk7Ci0gICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IFByb3RvLT5nZXROdW1BcmdzKCk7IEkgIT0gTjsgKytJKQotICAgICAgTWFya1VzZWRUZW1wbGF0ZVBhcmFtZXRlcnMoQ3R4LCBQcm90by0+Z2V0QXJnVHlwZShJKSwgT25seURlZHVjZWQsCisgICAgTWFya1VzZWRUZW1wbGF0ZVBhcmFtZXRlcnMoQ3R4LCBQcm90by0+Z2V0UmV0dXJuVHlwZSgpLCBPbmx5RGVkdWNlZCwgRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCk7CisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IFByb3RvLT5nZXROdW1QYXJhbXMoKTsgSSAhPSBOOyArK0kpCisgICAgICBNYXJrVXNlZFRlbXBsYXRlUGFyYW1ldGVycyhDdHgsIFByb3RvLT5nZXRQYXJhbVR5cGUoSSksIE9ubHlEZWR1Y2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwdGgsIFVzZWQpOwogICAgIGJyZWFrOwogICB9CmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hVGVtcGxhdGVJbnN0YW50aWF0ZS5jcHAgYi9saWIvU2VtYS9TZW1hVGVtcGxhdGVJbnN0YW50aWF0ZS5jcHAKaW5kZXggODkwNGYzNy4uMWVlM2U0YiAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYVRlbXBsYXRlSW5zdGFudGlhdGUuY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFUZW1wbGF0ZUluc3RhbnRpYXRlLmNwcApAQCAtNzYsOCArNzYsMTggQEAKICAgICAgIC8vIElmIHRoaXMgdmFyaWFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gd2FzIGluc3RhbnRpYXRlZCBmcm9tIGEKICAgICAgIC8vIHNwZWNpYWxpemVkIG1lbWJlciB0aGF0IGlzIGEgdmFyaWFibGUgdGVtcGxhdGUsIHdlJ3JlIGRvbmUuCiAgICAgICBhc3NlcnQoU3BlYy0+Z2V0U3BlY2lhbGl6ZWRUZW1wbGF0ZSgpICYmICJObyB2YXJpYWJsZSB0ZW1wbGF0ZT8iKTsKLSAgICAgIGlmIChTcGVjLT5nZXRTcGVjaWFsaXplZFRlbXBsYXRlKCktPmlzTWVtYmVyU3BlY2lhbGl6YXRpb24oKSkKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgIGxsdm06OlBvaW50ZXJVbmlvbjxWYXJUZW1wbGF0ZURlY2wqLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCo+IFNwZWNpYWxpemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU3BlYy0+Z2V0U3BlY2lhbGl6ZWRUZW1wbGF0ZU9yUGFydGlhbCgpOworICAgICAgaWYgKFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUGFydGlhbCA9CisgICAgICAgICAgICAgIFNwZWNpYWxpemVkLmR5bl9jYXN0PFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqPigpKSB7CisgICAgICAgIGlmIChQYXJ0aWFsLT5pc01lbWJlclNwZWNpYWxpemF0aW9uKCkpCisgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFZhclRlbXBsYXRlRGVjbCAqVG1wbCA9IFNwZWNpYWxpemVkLmdldDxWYXJUZW1wbGF0ZURlY2wgKj4oKTsKKyAgICAgICAgaWYgKFRtcGwtPmlzTWVtYmVyU3BlY2lhbGl6YXRpb24oKSkKKyAgICAgICAgICByZXR1cm4gUmVzdWx0OworICAgICAgfQogICAgIH0KIAogICAgIC8vIElmIHdlIGhhdmUgYSB0ZW1wbGF0ZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgd2l0aCB0cmFuc2xhdGlvbiB1bml0IGNvbnRleHQsCkBAIC0xOTAsNTAgKzIwMCw0OSBAQAogICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIEluc3RhbnRpYXRpb25LaW5kISIpOwogfQogCit2b2lkIFNlbWE6Okluc3RhbnRpYXRpbmdUZW1wbGF0ZTo6SW5pdGlhbGl6ZSgKKyAgICBBY3RpdmVUZW1wbGF0ZUluc3RhbnRpYXRpb246Okluc3RhbnRpYXRpb25LaW5kIEtpbmQsCisgICAgU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb24sIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSwKKyAgICBEZWNsICpFbnRpdHksIE5hbWVkRGVjbCAqVGVtcGxhdGUsIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IFRlbXBsYXRlQXJncywKKyAgICBzZW1hOjpUZW1wbGF0ZURlZHVjdGlvbkluZm8gKkRlZHVjdGlvbkluZm8pIHsKKyAgU2F2ZWRJbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0ID0KKyAgICAgIFNlbWFSZWYuSW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dDsKKyAgSW52YWxpZCA9IENoZWNrSW5zdGFudGlhdGlvbkRlcHRoKFBvaW50T2ZJbnN0YW50aWF0aW9uLCBJbnN0YW50aWF0aW9uUmFuZ2UpOworICBpZiAoIUludmFsaWQpIHsKKyAgICBBY3RpdmVUZW1wbGF0ZUluc3RhbnRpYXRpb24gSW5zdDsKKyAgICBJbnN0LktpbmQgPSBLaW5kOworICAgIEluc3QuUG9pbnRPZkluc3RhbnRpYXRpb24gPSBQb2ludE9mSW5zdGFudGlhdGlvbjsKKyAgICBJbnN0LkVudGl0eSA9IEVudGl0eTsKKyAgICBJbnN0LlRlbXBsYXRlID0gVGVtcGxhdGU7CisgICAgSW5zdC5UZW1wbGF0ZUFyZ3MgPSBUZW1wbGF0ZUFyZ3MuZGF0YSgpOworICAgIEluc3QuTnVtVGVtcGxhdGVBcmdzID0gVGVtcGxhdGVBcmdzLnNpemUoKTsKKyAgICBJbnN0LkRlZHVjdGlvbkluZm8gPSBEZWR1Y3Rpb25JbmZvOworICAgIEluc3QuSW5zdGFudGlhdGlvblJhbmdlID0gSW5zdGFudGlhdGlvblJhbmdlOworICAgIFNlbWFSZWYuSW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dCA9IGZhbHNlOworICAgIFNlbWFSZWYuQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9ucy5wdXNoX2JhY2soSW5zdCk7CisgICAgaWYgKCFJbnN0LmlzSW5zdGFudGlhdGlvblJlY29yZCgpKQorICAgICAgKytTZW1hUmVmLk5vbkluc3RhbnRpYXRpb25FbnRyaWVzOworICB9Cit9CisKIFNlbWE6Okluc3RhbnRpYXRpbmdUZW1wbGF0ZTo6CiBJbnN0YW50aWF0aW5nVGVtcGxhdGUoU2VtYSAmU2VtYVJlZiwgU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgRGVjbCAqRW50aXR5LAogICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSkKLSAgOiBTZW1hUmVmKFNlbWFSZWYpLAotICAgIFNhdmVkSW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hUmVmLkluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQpCisgIDogU2VtYVJlZihTZW1hUmVmKQogewotICBJbnZhbGlkID0gQ2hlY2tJbnN0YW50aWF0aW9uRGVwdGgoUG9pbnRPZkluc3RhbnRpYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW50aWF0aW9uUmFuZ2UpOwotICBpZiAoIUludmFsaWQpIHsKLSAgICBBY3RpdmVUZW1wbGF0ZUluc3RhbnRpYXRpb24gSW5zdDsKLSAgICBJbnN0LktpbmQgPSBBY3RpdmVUZW1wbGF0ZUluc3RhbnRpYXRpb246OlRlbXBsYXRlSW5zdGFudGlhdGlvbjsKLSAgICBJbnN0LlBvaW50T2ZJbnN0YW50aWF0aW9uID0gUG9pbnRPZkluc3RhbnRpYXRpb247Ci0gICAgSW5zdC5FbnRpdHkgPSBFbnRpdHk7Ci0gICAgSW5zdC5UZW1wbGF0ZUFyZ3MgPSAwOwotICAgIEluc3QuTnVtVGVtcGxhdGVBcmdzID0gMDsKLSAgICBJbnN0Lkluc3RhbnRpYXRpb25SYW5nZSA9IEluc3RhbnRpYXRpb25SYW5nZTsKLSAgICBTZW1hUmVmLkluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQgPSBmYWxzZTsKLSAgICBTZW1hUmVmLkFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbnMucHVzaF9iYWNrKEluc3QpOwotICB9CisgIEluaXRpYWxpemUoQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uOjpUZW1wbGF0ZUluc3RhbnRpYXRpb24sCisgICAgICAgICAgICAgUG9pbnRPZkluc3RhbnRpYXRpb24sIEluc3RhbnRpYXRpb25SYW5nZSwgRW50aXR5KTsKIH0KIAogU2VtYTo6SW5zdGFudGlhdGluZ1RlbXBsYXRlOjoKIEluc3RhbnRpYXRpbmdUZW1wbGF0ZShTZW1hICZTZW1hUmVmLCBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkRlY2wgKkVudGl0eSwgRXhjZXB0aW9uU3BlY2lmaWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBJbnN0YW50aWF0aW9uUmFuZ2UpCi0gIDogU2VtYVJlZihTZW1hUmVmKSwKLSAgICBTYXZlZEluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYVJlZi5Jbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0KQorICA6IFNlbWFSZWYoU2VtYVJlZikKIHsKLSAgSW52YWxpZCA9IENoZWNrSW5zdGFudGlhdGlvbkRlcHRoKFBvaW50T2ZJbnN0YW50aWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvblJhbmdlKTsKLSAgaWYgKCFJbnZhbGlkKSB7Ci0gICAgQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uIEluc3Q7Ci0gICAgSW5zdC5LaW5kID0gQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uOjpFeGNlcHRpb25TcGVjSW5zdGFudGlhdGlvbjsKLSAgICBJbnN0LlBvaW50T2ZJbnN0YW50aWF0aW9uID0gUG9pbnRPZkluc3RhbnRpYXRpb247Ci0gICAgSW5zdC5FbnRpdHkgPSBFbnRpdHk7Ci0gICAgSW5zdC5UZW1wbGF0ZUFyZ3MgPSAwOwotICAgIEluc3QuTnVtVGVtcGxhdGVBcmdzID0gMDsKLSAgICBJbnN0Lkluc3RhbnRpYXRpb25SYW5nZSA9IEluc3RhbnRpYXRpb25SYW5nZTsKLSAgICBTZW1hUmVmLkluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQgPSBmYWxzZTsKLSAgICBTZW1hUmVmLkFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbnMucHVzaF9iYWNrKEluc3QpOwotICB9CisgIEluaXRpYWxpemUoQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uOjpFeGNlcHRpb25TcGVjSW5zdGFudGlhdGlvbiwKKyAgICAgICAgICAgICBQb2ludE9mSW5zdGFudGlhdGlvbiwgSW5zdGFudGlhdGlvblJhbmdlLCBFbnRpdHkpOwogfQogCiBTZW1hOjpJbnN0YW50aWF0aW5nVGVtcGxhdGU6OgpAQCAtMjQxLDI0ICsyNTAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZURlY2wgKlRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IFRlbXBsYXRlQXJncywKICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBJbnN0YW50aWF0aW9uUmFuZ2UpCi0gIDogU2VtYVJlZihTZW1hUmVmKSwKLSAgICBTYXZlZEluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYVJlZi5Jbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0KQorICA6IFNlbWFSZWYoU2VtYVJlZikKIHsKLSAgSW52YWxpZCA9IENoZWNrSW5zdGFudGlhdGlvbkRlcHRoKFBvaW50T2ZJbnN0YW50aWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvblJhbmdlKTsKLSAgaWYgKCFJbnZhbGlkKSB7Ci0gICAgQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uIEluc3Q7Ci0gICAgSW5zdC5LaW5kCi0gICAgICA9IEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6RGVmYXVsdFRlbXBsYXRlQXJndW1lbnRJbnN0YW50aWF0aW9uOwotICAgIEluc3QuUG9pbnRPZkluc3RhbnRpYXRpb24gPSBQb2ludE9mSW5zdGFudGlhdGlvbjsKLSAgICBJbnN0LkVudGl0eSA9IFRlbXBsYXRlOwotICAgIEluc3QuVGVtcGxhdGVBcmdzID0gVGVtcGxhdGVBcmdzLmRhdGEoKTsKLSAgICBJbnN0Lk51bVRlbXBsYXRlQXJncyA9IFRlbXBsYXRlQXJncy5zaXplKCk7Ci0gICAgSW5zdC5JbnN0YW50aWF0aW9uUmFuZ2UgPSBJbnN0YW50aWF0aW9uUmFuZ2U7Ci0gICAgU2VtYVJlZi5Jbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0ID0gZmFsc2U7Ci0gICAgU2VtYVJlZi5BY3RpdmVUZW1wbGF0ZUluc3RhbnRpYXRpb25zLnB1c2hfYmFjayhJbnN0KTsKLSAgfQorICBJbml0aWFsaXplKEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6RGVmYXVsdFRlbXBsYXRlQXJndW1lbnRJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgIFBvaW50T2ZJbnN0YW50aWF0aW9uLCBJbnN0YW50aWF0aW9uUmFuZ2UsCisgICAgICAgICAgICAgVGVtcGxhdGUsIG51bGxwdHIsIFRlbXBsYXRlQXJncyk7CiB9CiAKIFNlbWE6Okluc3RhbnRpYXRpbmdUZW1wbGF0ZTo6CkBAIC0yNjgsMjYgKzI2NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgIEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6SW5zdGFudGlhdGlvbktpbmQgS2luZCwKICAgICAgICAgICAgICAgICAgICAgICBzZW1hOjpUZW1wbGF0ZURlZHVjdGlvbkluZm8gJkRlZHVjdGlvbkluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgSW5zdGFudGlhdGlvblJhbmdlKQotICA6IFNlbWFSZWYoU2VtYVJlZiksCi0gICAgU2F2ZWRJbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFSZWYuSW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dCkKKyAgOiBTZW1hUmVmKFNlbWFSZWYpCiB7Ci0gIEludmFsaWQgPSBDaGVja0luc3RhbnRpYXRpb25EZXB0aChQb2ludE9mSW5zdGFudGlhdGlvbiwgSW5zdGFudGlhdGlvblJhbmdlKTsKLSAgaWYgKCFJbnZhbGlkKSB7Ci0gICAgQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uIEluc3Q7Ci0gICAgSW5zdC5LaW5kID0gS2luZDsKLSAgICBJbnN0LlBvaW50T2ZJbnN0YW50aWF0aW9uID0gUG9pbnRPZkluc3RhbnRpYXRpb247Ci0gICAgSW5zdC5FbnRpdHkgPSBGdW5jdGlvblRlbXBsYXRlOwotICAgIEluc3QuVGVtcGxhdGVBcmdzID0gVGVtcGxhdGVBcmdzLmRhdGEoKTsKLSAgICBJbnN0Lk51bVRlbXBsYXRlQXJncyA9IFRlbXBsYXRlQXJncy5zaXplKCk7Ci0gICAgSW5zdC5EZWR1Y3Rpb25JbmZvID0gJkRlZHVjdGlvbkluZm87Ci0gICAgSW5zdC5JbnN0YW50aWF0aW9uUmFuZ2UgPSBJbnN0YW50aWF0aW9uUmFuZ2U7Ci0gICAgU2VtYVJlZi5Jbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0ID0gZmFsc2U7Ci0gICAgU2VtYVJlZi5BY3RpdmVUZW1wbGF0ZUluc3RhbnRpYXRpb25zLnB1c2hfYmFjayhJbnN0KTsKLSAgICAKLSAgICBpZiAoIUluc3QuaXNJbnN0YW50aWF0aW9uUmVjb3JkKCkpCi0gICAgICArK1NlbWFSZWYuTm9uSW5zdGFudGlhdGlvbkVudHJpZXM7Ci0gIH0KKyAgSW5pdGlhbGl6ZShLaW5kLCBQb2ludE9mSW5zdGFudGlhdGlvbiwgSW5zdGFudGlhdGlvblJhbmdlLAorICAgICAgICAgICAgIEZ1bmN0aW9uVGVtcGxhdGUsIG51bGxwdHIsIFRlbXBsYXRlQXJncywgJkRlZHVjdGlvbkluZm8pOwogfQogCiBTZW1hOjpJbnN0YW50aWF0aW5nVGVtcGxhdGU6OgpAQCAtMjk2LDIzICsyNzYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBUZW1wbGF0ZUFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgc2VtYTo6VGVtcGxhdGVEZWR1Y3Rpb25JbmZvICZEZWR1Y3Rpb25JbmZvLAogICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSkKLSAgOiBTZW1hUmVmKFNlbWFSZWYpLAotICAgIFNhdmVkSW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hUmVmLkluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQpCisgIDogU2VtYVJlZihTZW1hUmVmKQogewotICBJbnZhbGlkID0gQ2hlY2tJbnN0YW50aWF0aW9uRGVwdGgoUG9pbnRPZkluc3RhbnRpYXRpb24sIEluc3RhbnRpYXRpb25SYW5nZSk7Ci0gIGlmICghSW52YWxpZCkgewotICAgIEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbiBJbnN0OwotICAgIEluc3QuS2luZCA9IEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6RGVkdWNlZFRlbXBsYXRlQXJndW1lbnRTdWJzdGl0dXRpb247Ci0gICAgSW5zdC5Qb2ludE9mSW5zdGFudGlhdGlvbiA9IFBvaW50T2ZJbnN0YW50aWF0aW9uOwotICAgIEluc3QuRW50aXR5ID0gUGFydGlhbFNwZWM7Ci0gICAgSW5zdC5UZW1wbGF0ZUFyZ3MgPSBUZW1wbGF0ZUFyZ3MuZGF0YSgpOwotICAgIEluc3QuTnVtVGVtcGxhdGVBcmdzID0gVGVtcGxhdGVBcmdzLnNpemUoKTsKLSAgICBJbnN0LkRlZHVjdGlvbkluZm8gPSAmRGVkdWN0aW9uSW5mbzsKLSAgICBJbnN0Lkluc3RhbnRpYXRpb25SYW5nZSA9IEluc3RhbnRpYXRpb25SYW5nZTsKLSAgICBTZW1hUmVmLkluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQgPSBmYWxzZTsKLSAgICBTZW1hUmVmLkFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbnMucHVzaF9iYWNrKEluc3QpOwotICB9CisgIEluaXRpYWxpemUoQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uOjpEZWR1Y2VkVGVtcGxhdGVBcmd1bWVudFN1YnN0aXR1dGlvbiwKKyAgICAgICAgICAgICBQb2ludE9mSW5zdGFudGlhdGlvbiwgSW5zdGFudGlhdGlvblJhbmdlLAorICAgICAgICAgICAgIFBhcnRpYWxTcGVjLCBudWxscHRyLCBUZW1wbGF0ZUFyZ3MsICZEZWR1Y3Rpb25JbmZvKTsKIH0KIAogU2VtYTo6SW5zdGFudGlhdGluZ1RlbXBsYXRlOjpJbnN0YW50aWF0aW5nVGVtcGxhdGUoCkBAIC0zMjAsMjIgKzI4OCwxMSBAQAogICAgIFZhclRlbXBsYXRlUGFydGlhbFNwZWNpYWxpemF0aW9uRGVjbCAqUGFydGlhbFNwZWMsCiAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzLAogICAgIHNlbWE6OlRlbXBsYXRlRGVkdWN0aW9uSW5mbyAmRGVkdWN0aW9uSW5mbywgU291cmNlUmFuZ2UgSW5zdGFudGlhdGlvblJhbmdlKQotICAgIDogU2VtYVJlZihTZW1hUmVmKSwgU2F2ZWRJbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFSZWYuSW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dCkgewotICBJbnZhbGlkID0gQ2hlY2tJbnN0YW50aWF0aW9uRGVwdGgoUG9pbnRPZkluc3RhbnRpYXRpb24sIEluc3RhbnRpYXRpb25SYW5nZSk7Ci0gIGlmICghSW52YWxpZCkgewotICAgIEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbiBJbnN0OwotICAgIEluc3QuS2luZCA9Ci0gICAgICAgIEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6RGVkdWNlZFRlbXBsYXRlQXJndW1lbnRTdWJzdGl0dXRpb247Ci0gICAgSW5zdC5Qb2ludE9mSW5zdGFudGlhdGlvbiA9IFBvaW50T2ZJbnN0YW50aWF0aW9uOwotICAgIEluc3QuRW50aXR5ID0gUGFydGlhbFNwZWM7Ci0gICAgSW5zdC5UZW1wbGF0ZUFyZ3MgPSBUZW1wbGF0ZUFyZ3MuZGF0YSgpOwotICAgIEluc3QuTnVtVGVtcGxhdGVBcmdzID0gVGVtcGxhdGVBcmdzLnNpemUoKTsKLSAgICBJbnN0LkRlZHVjdGlvbkluZm8gPSAmRGVkdWN0aW9uSW5mbzsKLSAgICBJbnN0Lkluc3RhbnRpYXRpb25SYW5nZSA9IEluc3RhbnRpYXRpb25SYW5nZTsKLSAgICBTZW1hUmVmLkluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQgPSBmYWxzZTsKLSAgICBTZW1hUmVmLkFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbnMucHVzaF9iYWNrKEluc3QpOwotICB9CisgIDogU2VtYVJlZihTZW1hUmVmKQoreworICBJbml0aWFsaXplKEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6RGVkdWNlZFRlbXBsYXRlQXJndW1lbnRTdWJzdGl0dXRpb24sCisgICAgICAgICAgICAgUG9pbnRPZkluc3RhbnRpYXRpb24sIEluc3RhbnRpYXRpb25SYW5nZSwKKyAgICAgICAgICAgICBQYXJ0aWFsU3BlYywgbnVsbHB0ciwgVGVtcGxhdGVBcmdzLCAmRGVkdWN0aW9uSW5mbyk7CiB9CiAKIFNlbWE6Okluc3RhbnRpYXRpbmdUZW1wbGF0ZTo6CkBAIC0zNDMsNDcgKzMwMCwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgIFBhcm1WYXJEZWNsICpQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBUZW1wbGF0ZUFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgSW5zdGFudGlhdGlvblJhbmdlKQotICA6IFNlbWFSZWYoU2VtYVJlZiksCi0gICAgU2F2ZWRJbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFSZWYuSW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dCkKKyAgOiBTZW1hUmVmKFNlbWFSZWYpCiB7Ci0gIEludmFsaWQgPSBDaGVja0luc3RhbnRpYXRpb25EZXB0aChQb2ludE9mSW5zdGFudGlhdGlvbiwgSW5zdGFudGlhdGlvblJhbmdlKTsKLSAgaWYgKCFJbnZhbGlkKSB7Ci0gICAgQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uIEluc3Q7Ci0gICAgSW5zdC5LaW5kCi0gICAgICA9IEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6RGVmYXVsdEZ1bmN0aW9uQXJndW1lbnRJbnN0YW50aWF0aW9uOwotICAgIEluc3QuUG9pbnRPZkluc3RhbnRpYXRpb24gPSBQb2ludE9mSW5zdGFudGlhdGlvbjsKLSAgICBJbnN0LkVudGl0eSA9IFBhcmFtOwotICAgIEluc3QuVGVtcGxhdGVBcmdzID0gVGVtcGxhdGVBcmdzLmRhdGEoKTsKLSAgICBJbnN0Lk51bVRlbXBsYXRlQXJncyA9IFRlbXBsYXRlQXJncy5zaXplKCk7Ci0gICAgSW5zdC5JbnN0YW50aWF0aW9uUmFuZ2UgPSBJbnN0YW50aWF0aW9uUmFuZ2U7Ci0gICAgU2VtYVJlZi5Jbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0ID0gZmFsc2U7Ci0gICAgU2VtYVJlZi5BY3RpdmVUZW1wbGF0ZUluc3RhbnRpYXRpb25zLnB1c2hfYmFjayhJbnN0KTsKLSAgfQorICBJbml0aWFsaXplKEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6RGVmYXVsdEZ1bmN0aW9uQXJndW1lbnRJbnN0YW50aWF0aW9uLAorICAgICAgICAgICAgIFBvaW50T2ZJbnN0YW50aWF0aW9uLCBJbnN0YW50aWF0aW9uUmFuZ2UsCisgICAgICAgICAgICAgUGFyYW0sIG51bGxwdHIsIFRlbXBsYXRlQXJncyk7CiB9CiAKKwogU2VtYTo6SW5zdGFudGlhdGluZ1RlbXBsYXRlOjoKIEluc3RhbnRpYXRpbmdUZW1wbGF0ZShTZW1hICZTZW1hUmVmLCBTb3VyY2VMb2NhdGlvbiBQb2ludE9mSW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKlRlbXBsYXRlLCBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbCAqUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VGVtcGxhdGVBcmd1bWVudD4gVGVtcGxhdGVBcmdzLAogICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIEluc3RhbnRpYXRpb25SYW5nZSkKLSAgOiBTZW1hUmVmKFNlbWFSZWYpLAotICAgIFNhdmVkSW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hUmVmLkluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQpCisgIDogU2VtYVJlZihTZW1hUmVmKQogewotICBJbnZhbGlkID0gQ2hlY2tJbnN0YW50aWF0aW9uRGVwdGgoUG9pbnRPZkluc3RhbnRpYXRpb24sIEluc3RhbnRpYXRpb25SYW5nZSk7Ci0gIGlmICghSW52YWxpZCkgewotICAgIEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbiBJbnN0OwotICAgIEluc3QuS2luZCA9IEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6UHJpb3JUZW1wbGF0ZUFyZ3VtZW50U3Vic3RpdHV0aW9uOwotICAgIEluc3QuUG9pbnRPZkluc3RhbnRpYXRpb24gPSBQb2ludE9mSW5zdGFudGlhdGlvbjsKLSAgICBJbnN0LlRlbXBsYXRlID0gVGVtcGxhdGU7Ci0gICAgSW5zdC5FbnRpdHkgPSBQYXJhbTsKLSAgICBJbnN0LlRlbXBsYXRlQXJncyA9IFRlbXBsYXRlQXJncy5kYXRhKCk7Ci0gICAgSW5zdC5OdW1UZW1wbGF0ZUFyZ3MgPSBUZW1wbGF0ZUFyZ3Muc2l6ZSgpOwotICAgIEluc3QuSW5zdGFudGlhdGlvblJhbmdlID0gSW5zdGFudGlhdGlvblJhbmdlOwotICAgIFNlbWFSZWYuSW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dCA9IGZhbHNlOwotICAgIFNlbWFSZWYuQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9ucy5wdXNoX2JhY2soSW5zdCk7Ci0gIH0KKyAgSW5pdGlhbGl6ZShBY3RpdmVUZW1wbGF0ZUluc3RhbnRpYXRpb246OlByaW9yVGVtcGxhdGVBcmd1bWVudFN1YnN0aXR1dGlvbiwKKyAgICAgICAgICAgICBQb2ludE9mSW5zdGFudGlhdGlvbiwgSW5zdGFudGlhdGlvblJhbmdlLAorICAgICAgICAgICAgIFBhcmFtLCBUZW1wbGF0ZSwgVGVtcGxhdGVBcmdzKTsKIH0KIAogU2VtYTo6SW5zdGFudGlhdGluZ1RlbXBsYXRlOjoKQEAgLTM5MSwyMyArMzI1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpUZW1wbGF0ZSwgVGVtcGxhdGVUZW1wbGF0ZVBhcm1EZWNsICpQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUZW1wbGF0ZUFyZ3VtZW50PiBUZW1wbGF0ZUFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgSW5zdGFudGlhdGlvblJhbmdlKQotICA6IFNlbWFSZWYoU2VtYVJlZiksCi0gICAgU2F2ZWRJbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFSZWYuSW5Ob25JbnN0YW50aWF0aW9uU0ZJTkFFQ29udGV4dCkKKyAgOiBTZW1hUmVmKFNlbWFSZWYpCiB7Ci0gIEludmFsaWQgPSBDaGVja0luc3RhbnRpYXRpb25EZXB0aChQb2ludE9mSW5zdGFudGlhdGlvbiwgSW5zdGFudGlhdGlvblJhbmdlKTsKLSAgaWYgKCFJbnZhbGlkKSB7Ci0gICAgQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uIEluc3Q7Ci0gICAgSW5zdC5LaW5kID0gQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uOjpQcmlvclRlbXBsYXRlQXJndW1lbnRTdWJzdGl0dXRpb247Ci0gICAgSW5zdC5Qb2ludE9mSW5zdGFudGlhdGlvbiA9IFBvaW50T2ZJbnN0YW50aWF0aW9uOwotICAgIEluc3QuVGVtcGxhdGUgPSBUZW1wbGF0ZTsKLSAgICBJbnN0LkVudGl0eSA9IFBhcmFtOwotICAgIEluc3QuVGVtcGxhdGVBcmdzID0gVGVtcGxhdGVBcmdzLmRhdGEoKTsKLSAgICBJbnN0Lk51bVRlbXBsYXRlQXJncyA9IFRlbXBsYXRlQXJncy5zaXplKCk7Ci0gICAgSW5zdC5JbnN0YW50aWF0aW9uUmFuZ2UgPSBJbnN0YW50aWF0aW9uUmFuZ2U7Ci0gICAgU2VtYVJlZi5Jbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0ID0gZmFsc2U7Ci0gICAgU2VtYVJlZi5BY3RpdmVUZW1wbGF0ZUluc3RhbnRpYXRpb25zLnB1c2hfYmFjayhJbnN0KTsKLSAgfQorICBJbml0aWFsaXplKEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6UHJpb3JUZW1wbGF0ZUFyZ3VtZW50U3Vic3RpdHV0aW9uLAorICAgICAgICAgICAgIFBvaW50T2ZJbnN0YW50aWF0aW9uLCBJbnN0YW50aWF0aW9uUmFuZ2UsCisgICAgICAgICAgICAgUGFyYW0sIFRlbXBsYXRlLCBUZW1wbGF0ZUFyZ3MpOwogfQogCiBTZW1hOjpJbnN0YW50aWF0aW5nVGVtcGxhdGU6OgpAQCAtNDE1LDI1ICszMzcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZURlY2wgKlRlbXBsYXRlLCBOYW1lZERlY2wgKlBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFRlbXBsYXRlQXJndW1lbnQ+IFRlbXBsYXRlQXJncywKICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBJbnN0YW50aWF0aW9uUmFuZ2UpCi0gIDogU2VtYVJlZihTZW1hUmVmKSwKLSAgICBTYXZlZEluTm9uSW5zdGFudGlhdGlvblNGSU5BRUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYVJlZi5Jbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0KQorICA6IFNlbWFSZWYoU2VtYVJlZikKIHsKLSAgSW52YWxpZCA9IGZhbHNlOwotICAKLSAgQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uIEluc3Q7Ci0gIEluc3QuS2luZCA9IEFjdGl2ZVRlbXBsYXRlSW5zdGFudGlhdGlvbjo6RGVmYXVsdFRlbXBsYXRlQXJndW1lbnRDaGVja2luZzsKLSAgSW5zdC5Qb2ludE9mSW5zdGFudGlhdGlvbiA9IFBvaW50T2ZJbnN0YW50aWF0aW9uOwotICBJbnN0LlRlbXBsYXRlID0gVGVtcGxhdGU7Ci0gIEluc3QuRW50aXR5ID0gUGFyYW07Ci0gIEluc3QuVGVtcGxhdGVBcmdzID0gVGVtcGxhdGVBcmdzLmRhdGEoKTsKLSAgSW5zdC5OdW1UZW1wbGF0ZUFyZ3MgPSBUZW1wbGF0ZUFyZ3Muc2l6ZSgpOwotICBJbnN0Lkluc3RhbnRpYXRpb25SYW5nZSA9IEluc3RhbnRpYXRpb25SYW5nZTsKLSAgU2VtYVJlZi5Jbk5vbkluc3RhbnRpYXRpb25TRklOQUVDb250ZXh0ID0gZmFsc2U7Ci0gIFNlbWFSZWYuQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9ucy5wdXNoX2JhY2soSW5zdCk7Ci0gIAotICBhc3NlcnQoIUluc3QuaXNJbnN0YW50aWF0aW9uUmVjb3JkKCkpOwotICArK1NlbWFSZWYuTm9uSW5zdGFudGlhdGlvbkVudHJpZXM7CisgIEluaXRpYWxpemUoQWN0aXZlVGVtcGxhdGVJbnN0YW50aWF0aW9uOjpEZWZhdWx0VGVtcGxhdGVBcmd1bWVudENoZWNraW5nLAorICAgICAgICAgICAgIFBvaW50T2ZJbnN0YW50aWF0aW9uLCBJbnN0YW50aWF0aW9uUmFuZ2UsCisgICAgICAgICAgICAgUGFyYW0sIFRlbXBsYXRlLCBUZW1wbGF0ZUFyZ3MpOwogfQogCiB2b2lkIFNlbWE6Okluc3RhbnRpYXRpbmdUZW1wbGF0ZTo6Q2xlYXIoKSB7CkBAIC03ODksNyArNjk3LDcgQEAKICAgICAgICAgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MKICAgICAgICAgICA9IGNvbnN0X2Nhc3Q8TXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICY+KHRoaXMtPlRlbXBsYXRlQXJncyk7CiAgICAgICAgIHVuc2lnbmVkIERlcHRoLCBJbmRleDsKLSAgICAgICAgbGx2bTo6dGllKERlcHRoLCBJbmRleCkgPSBnZXREZXB0aEFuZEluZGV4KFBhcnRpYWxQYWNrKTsKKyAgICAgICAgc3RkOjp0aWUoRGVwdGgsIEluZGV4KSA9IGdldERlcHRoQW5kSW5kZXgoUGFydGlhbFBhY2spOwogICAgICAgICBpZiAoVGVtcGxhdGVBcmdzLmhhc1RlbXBsYXRlQXJndW1lbnQoRGVwdGgsIEluZGV4KSkgewogICAgICAgICAgIFJlc3VsdCA9IFRlbXBsYXRlQXJncyhEZXB0aCwgSW5kZXgpOwogICAgICAgICAgIFRlbXBsYXRlQXJncy5zZXRBcmd1bWVudChEZXB0aCwgSW5kZXgsIFRlbXBsYXRlQXJndW1lbnQoKSk7CkBAIC04MDgsNyArNzE2LDcgQEAKICAgICAgICAgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MKICAgICAgICAgPSBjb25zdF9jYXN0PE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmPih0aGlzLT5UZW1wbGF0ZUFyZ3MpOwogICAgICAgICB1bnNpZ25lZCBEZXB0aCwgSW5kZXg7Ci0gICAgICAgIGxsdm06OnRpZShEZXB0aCwgSW5kZXgpID0gZ2V0RGVwdGhBbmRJbmRleChQYXJ0aWFsUGFjayk7CisgICAgICAgIHN0ZDo6dGllKERlcHRoLCBJbmRleCkgPSBnZXREZXB0aEFuZEluZGV4KFBhcnRpYWxQYWNrKTsKICAgICAgICAgVGVtcGxhdGVBcmdzLnNldEFyZ3VtZW50KERlcHRoLCBJbmRleCwgQXJnKTsKICAgICAgIH0KICAgICB9CkBAIC05MjksOCArODM3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9sZENhbGxPcGVyYXRvci0+Z2V0RGVzY3JpYmVkRnVuY3Rpb25UZW1wbGF0ZSgpOwogICAgICAgICBOZXdDYWxsT3BlcmF0b3JUZW1wbGF0ZS0+c2V0SW5zdGFudGlhdGVkRnJvbU1lbWJlclRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGRDYWxsT3BlcmF0b3JUZW1wbGF0ZSk7Ci0gICAgICAgIC8vIE1hcmsgdGhlIE5ld0NhbGxPcGVyYXRvclRlbXBsYXRlIGEgc3BlY2lhbGl6YXRpb24uICAKLSAgICAgICAgTmV3Q2FsbE9wZXJhdG9yVGVtcGxhdGUtPnNldE1lbWJlclNwZWNpYWxpemF0aW9uKCk7CiAgICAgICB9IGVsc2UgCiAgICAgICAgIC8vIEZvciBhIG5vbi1nZW5lcmljIGxhbWJkYSB3ZSBzZXQgdGhlIE5ld0NhbGxPcGVyYXRvciB0byAKICAgICAgICAgLy8gYmUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgT2xkQ2FsbE9wZXJhdG9yLgpAQCAtOTQwLDcgKzg0Niw3IEBACiAgICAgICByZXR1cm4gaW5oZXJpdGVkOjpUcmFuc2Zvcm1MYW1iZGFTY29wZShFLCBOZXdDYWxsT3BlcmF0b3IsIAogICAgICAgICAgIEluaXRDYXB0dXJlRXhwcnNBbmRUeXBlcyk7CiAgICAgfQotICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVHJhbnNmb3JtVGVtcGxhdGVQYXJhbWV0ZXJMaXN0KA0KKyAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRyYW5zZm9ybVRlbXBsYXRlUGFyYW1ldGVyTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqT3JpZ1RQTCkgIHsKICAgICAgIGlmICghT3JpZ1RQTCB8fCAhT3JpZ1RQTC0+c2l6ZSgpKSByZXR1cm4gT3JpZ1RQTDsKICAgICAgICAgIApAQCAtMTYyOCw4ICsxNTM0LDggQEAKICAgICByZXR1cm4gZmFsc2U7CiAKICAgRnVuY3Rpb25Qcm90b1R5cGVMb2MgRlAgPSBUTC5jYXN0QXM8RnVuY3Rpb25Qcm90b1R5cGVMb2M+KCk7Ci0gIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBGUC5nZXROdW1BcmdzKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgUGFybVZhckRlY2wgKlAgPSBGUC5nZXRBcmcoSSk7CisgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBGUC5nZXROdW1QYXJhbXMoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBQYXJtVmFyRGVjbCAqUCA9IEZQLmdldFBhcmFtKEkpOwogCiAgICAgLy8gVGhpcyBtdXN0IGJlIHN5bnRoZXNpemVkIGZyb20gYSB0eXBlZGVmLgogICAgIGlmICghUCkgY29udGludWU7CkBAIC0xODA4LDMxICsxNzE0LDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVGVtcGxhdGVBcmdzKSB7CiAgIGJvb2wgSW52YWxpZCA9IGZhbHNlOwogICBTbWFsbFZlY3RvcjxDWFhCYXNlU3BlY2lmaWVyKiwgND4gSW5zdGFudGlhdGVkQmFzZXM7Ci0gIGZvciAoQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvcgotICAgICAgICAgQmFzZSA9IFBhdHRlcm4tPmJhc2VzX2JlZ2luKCksIEJhc2VFbmQgPSBQYXR0ZXJuLT5iYXNlc19lbmQoKTsKLSAgICAgICBCYXNlICE9IEJhc2VFbmQ7ICsrQmFzZSkgewotICAgIGlmICghQmFzZS0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSkgewotICAgICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gQmFzZS0+Z2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKSkgeworICBmb3IgKGNvbnN0IGF1dG8gQmFzZSA6IFBhdHRlcm4tPmJhc2VzKCkpIHsKKyAgICBpZiAoIUJhc2UuZ2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSkgeworICAgICAgaWYgKGNvbnN0IENYWFJlY29yZERlY2wgKlJEID0gQmFzZS5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpKSB7CiAgICAgICAgIGlmIChSRC0+aXNJbnZhbGlkRGVjbCgpKQogICAgICAgICAgIEluc3RhbnRpYXRpb24tPnNldEludmFsaWREZWNsKCk7CiAgICAgICB9Ci0gICAgICBJbnN0YW50aWF0ZWRCYXNlcy5wdXNoX2JhY2sobmV3IChDb250ZXh0KSBDWFhCYXNlU3BlY2lmaWVyKCpCYXNlKSk7CisgICAgICBJbnN0YW50aWF0ZWRCYXNlcy5wdXNoX2JhY2sobmV3IChDb250ZXh0KSBDWFhCYXNlU3BlY2lmaWVyKEJhc2UpKTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIAogICAgIFNvdXJjZUxvY2F0aW9uIEVsbGlwc2lzTG9jOwogICAgIFR5cGVTb3VyY2VJbmZvICpCYXNlVHlwZUxvYzsKLSAgICBpZiAoQmFzZS0+aXNQYWNrRXhwYW5zaW9uKCkpIHsKKyAgICBpZiAoQmFzZS5pc1BhY2tFeHBhbnNpb24oKSkgewogICAgICAgLy8gVGhpcyBpcyBhIHBhY2sgZXhwYW5zaW9uLiBTZWUgd2hldGhlciB3ZSBzaG91bGQgZXhwYW5kIGl0IG5vdywgb3IKICAgICAgIC8vIHdhaXQgdW50aWwgbGF0ZXIuCiAgICAgICBTbWFsbFZlY3RvcjxVbmV4cGFuZGVkUGFyYW1ldGVyUGFjaywgMj4gVW5leHBhbmRlZDsKLSAgICAgIGNvbGxlY3RVbmV4cGFuZGVkUGFyYW1ldGVyUGFja3MoQmFzZS0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpLAorICAgICAgY29sbGVjdFVuZXhwYW5kZWRQYXJhbWV0ZXJQYWNrcyhCYXNlLmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5leHBhbmRlZCk7CiAgICAgICBib29sIFNob3VsZEV4cGFuZCA9IGZhbHNlOwogICAgICAgYm9vbCBSZXRhaW5FeHBhbnNpb24gPSBmYWxzZTsKICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBOdW1FeHBhbnNpb25zOwotICAgICAgaWYgKENoZWNrUGFyYW1ldGVyUGFja3NGb3JFeHBhbnNpb24oQmFzZS0+Z2V0RWxsaXBzaXNMb2MoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlLT5nZXRTb3VyY2VSYW5nZSgpLAorICAgICAgaWYgKENoZWNrUGFyYW1ldGVyUGFja3NGb3JFeHBhbnNpb24oQmFzZS5nZXRFbGxpcHNpc0xvYygpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UuZ2V0U291cmNlUmFuZ2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuZXhwYW5kZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3MsIFNob3VsZEV4cGFuZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXRhaW5FeHBhbnNpb24sCkBAIC0xODQ2LDkgKzE3NTAsOSBAQAogICAgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9ICpOdW1FeHBhbnNpb25zOyArK0kpIHsKICAgICAgICAgICAgIFNlbWE6OkFyZ3VtZW50UGFja1N1YnN0aXR1dGlvbkluZGV4UkFJSSBTdWJzdEluZGV4KCp0aGlzLCBJKTsKICAgICAgICAgICAKLSAgICAgICAgICBUeXBlU291cmNlSW5mbyAqQmFzZVR5cGVMb2MgPSBTdWJzdFR5cGUoQmFzZS0+Z2V0VHlwZVNvdXJjZUluZm8oKSwKKyAgICAgICAgICBUeXBlU291cmNlSW5mbyAqQmFzZVR5cGVMb2MgPSBTdWJzdFR5cGUoQmFzZS5nZXRUeXBlU291cmNlSW5mbygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZS0+Z2V0U291cmNlUmFuZ2UoKS5nZXRCZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UuZ2V0U291cmNlUmFuZ2UoKS5nZXRCZWdpbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWUoKSk7CiAgICAgICAgICAgaWYgKCFCYXNlVHlwZUxvYykgewogICAgICAgICAgICAgSW52YWxpZCA9IHRydWU7CkBAIC0xODU3LDkgKzE3NjEsOSBAQAogICAgICAgICAgIAogICAgICAgICAgIGlmIChDWFhCYXNlU3BlY2lmaWVyICpJbnN0YW50aWF0ZWRCYXNlCiAgICAgICAgICAgICAgICAgPSBDaGVja0Jhc2VTcGVjaWZpZXIoSW5zdGFudGlhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlLT5nZXRTb3VyY2VSYW5nZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UtPmlzVmlydHVhbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UtPmdldEFjY2Vzc1NwZWNpZmllckFzV3JpdHRlbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UuZ2V0U291cmNlUmFuZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlLmlzVmlydHVhbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UuZ2V0QWNjZXNzU3BlY2lmaWVyQXNXcml0dGVuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVR5cGVMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24oKSkpCiAgICAgICAgICAgICBJbnN0YW50aWF0ZWRCYXNlcy5wdXNoX2JhY2soSW5zdGFudGlhdGVkQmFzZSk7CkBAIC0xODcxLDE2ICsxNzc1LDE2IEBACiAgICAgICB9CiAgICAgICAKICAgICAgIC8vIFRoZSByZXN1bHRpbmcgYmFzZSBzcGVjaWZpZXIgd2lsbCAoc3RpbGwpIGJlIGEgcGFjayBleHBhbnNpb24uCi0gICAgICBFbGxpcHNpc0xvYyA9IEJhc2UtPmdldEVsbGlwc2lzTG9jKCk7CisgICAgICBFbGxpcHNpc0xvYyA9IEJhc2UuZ2V0RWxsaXBzaXNMb2MoKTsKICAgICAgIFNlbWE6OkFyZ3VtZW50UGFja1N1YnN0aXR1dGlvbkluZGV4UkFJSSBTdWJzdEluZGV4KCp0aGlzLCAtMSk7Ci0gICAgICBCYXNlVHlwZUxvYyA9IFN1YnN0VHlwZShCYXNlLT5nZXRUeXBlU291cmNlSW5mbygpLAorICAgICAgQmFzZVR5cGVMb2MgPSBTdWJzdFR5cGUoQmFzZS5nZXRUeXBlU291cmNlSW5mbygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZS0+Z2V0U291cmNlUmFuZ2UoKS5nZXRCZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZS5nZXRTb3VyY2VSYW5nZSgpLmdldEJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWUoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIEJhc2VUeXBlTG9jID0gU3Vic3RUeXBlKEJhc2UtPmdldFR5cGVTb3VyY2VJbmZvKCksCisgICAgICBCYXNlVHlwZUxvYyA9IFN1YnN0VHlwZShCYXNlLmdldFR5cGVTb3VyY2VJbmZvKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlLT5nZXRTb3VyY2VSYW5nZSgpLmdldEJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlLmdldFNvdXJjZVJhbmdlKCkuZ2V0QmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmF0aW9uTmFtZSgpKTsKICAgICB9CiAgICAgCkBAIC0xODkxLDkgKzE3OTUsOSBAQAogCiAgICAgaWYgKENYWEJhc2VTcGVjaWZpZXIgKkluc3RhbnRpYXRlZEJhc2UKICAgICAgICAgICA9IENoZWNrQmFzZVNwZWNpZmllcihJbnN0YW50aWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UtPmdldFNvdXJjZVJhbmdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZS0+aXNWaXJ0dWFsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZS0+Z2V0QWNjZXNzU3BlY2lmaWVyQXNXcml0dGVuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZS5nZXRTb3VyY2VSYW5nZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2UuaXNWaXJ0dWFsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZS5nZXRBY2Nlc3NTcGVjaWZpZXJBc1dyaXR0ZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVHlwZUxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGxpcHNpc0xvYykpCiAgICAgICBJbnN0YW50aWF0ZWRCYXNlcy5wdXNoX2JhY2soSW5zdGFudGlhdGVkQmFzZSk7CkBAIC0yMDA4LDcgKzE5MTIsNyBAQAogICAgIFNwZWMtPnNldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKFRTSyk7CiAgICAgU3BlYy0+c2V0UG9pbnRPZkluc3RhbnRpYXRpb24oUG9pbnRPZkluc3RhbnRpYXRpb24pOwogICB9Ci0gIAorCiAgIEluc3RhbnRpYXRpbmdUZW1wbGF0ZSBJbnN0KCp0aGlzLCBQb2ludE9mSW5zdGFudGlhdGlvbiwgSW5zdGFudGlhdGlvbik7CiAgIGlmIChJbnN0LmlzSW52YWxpZCgpKQogICAgIHJldHVybiB0cnVlOwpAQCAtMjAzMCw3ICsxOTM0LDEyIEBACiAKICAgLy8gU3RhcnQgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBpbnN0YW50aWF0aW9uLgogICBJbnN0YW50aWF0aW9uLT5zdGFydERlZmluaXRpb24oKTsKLSAgCisKKyAgLy8gVGhlIGluc3RhbnRpYXRpb24gaXMgdmlzaWJsZSBoZXJlLCBldmVuIGlmIGl0IHdhcyBmaXJzdCBkZWNsYXJlZCBpbiBhbgorICAvLyB1bmltcG9ydGVkIG1vZHVsZS4KKyAgSW5zdGFudGlhdGlvbi0+c2V0SGlkZGVuKGZhbHNlKTsKKworICAvLyBGSVhNRTogVGhpcyBsb3NlcyB0aGUgYXMtd3JpdHRlbiB0YWcga2luZCBmb3IgYW4gZXhwbGljaXQgaW5zdGFudGlhdGlvbi4KICAgSW5zdGFudGlhdGlvbi0+c2V0VGFnS2luZChQYXR0ZXJuLT5nZXRUYWdLaW5kKCkpOwogCiAgIC8vIERvIHN1YnN0aXR1dGlvbiBvbiB0aGUgYmFzZSBjbGFzcyBzcGVjaWZpZXJzLgpAQCAtMjA0NSw5ICsxOTU0LDcgQEAKICAgTGF0ZUluc3RhbnRpYXRlZEF0dHJWZWMgTGF0ZUF0dHJzOwogICBJbnN0YW50aWF0b3IuZW5hYmxlTGF0ZUF0dHJpYnV0ZUluc3RhbnRpYXRpb24oJkxhdGVBdHRycyk7CiAKLSAgZm9yIChSZWNvcmREZWNsOjpkZWNsX2l0ZXJhdG9yIE1lbWJlciA9IFBhdHRlcm4tPmRlY2xzX2JlZ2luKCksCi0gICAgICAgICBNZW1iZXJFbmQgPSBQYXR0ZXJuLT5kZWNsc19lbmQoKTsKLSAgICAgICBNZW1iZXIgIT0gTWVtYmVyRW5kOyArK01lbWJlcikgeworICBmb3IgKGF1dG8gKk1lbWJlciA6IFBhdHRlcm4tPmRlY2xzKCkpIHsKICAgICAvLyBEb24ndCBpbnN0YW50aWF0ZSBtZW1iZXJzIG5vdCBiZWxvbmdpbmcgaW4gdGhpcyBzZW1hbnRpYyBjb250ZXh0LgogICAgIC8vIGUuZy4gZm9yOgogICAgIC8vIEBjb2RlCkBAIC0yMDU3LDE5ICsxOTY0LDE5IEBACiAgICAgLy8gQGVuZGNvZGUKICAgICAvLyAnY2xhc3MgQicgaGFzIHRoZSB0ZW1wbGF0ZSBhcyBsZXhpY2FsIGNvbnRleHQgYnV0IHNlbWFudGljYWxseSBpdCBpcwogICAgIC8vIGludHJvZHVjZWQgaW4gbmFtZXNwYWNlIHNjb3BlLgotICAgIGlmICgoKk1lbWJlciktPmdldERlY2xDb250ZXh0KCkgIT0gUGF0dGVybikKKyAgICBpZiAoTWVtYmVyLT5nZXREZWNsQ29udGV4dCgpICE9IFBhdHRlcm4pCiAgICAgICBjb250aW51ZTsKIAotICAgIGlmICgoKk1lbWJlciktPmlzSW52YWxpZERlY2woKSkgeworICAgIGlmIChNZW1iZXItPmlzSW52YWxpZERlY2woKSkgewogICAgICAgSW5zdGFudGlhdGlvbi0+c2V0SW52YWxpZERlY2woKTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIAotICAgIERlY2wgKk5ld01lbWJlciA9IEluc3RhbnRpYXRvci5WaXNpdCgqTWVtYmVyKTsKKyAgICBEZWNsICpOZXdNZW1iZXIgPSBJbnN0YW50aWF0b3IuVmlzaXQoTWVtYmVyKTsKICAgICBpZiAoTmV3TWVtYmVyKSB7CiAgICAgICBpZiAoRmllbGREZWNsICpGaWVsZCA9IGR5bl9jYXN0PEZpZWxkRGVjbD4oTmV3TWVtYmVyKSkgewogICAgICAgICBGaWVsZHMucHVzaF9iYWNrKEZpZWxkKTsKLSAgICAgICAgRmllbGREZWNsICpPbGRGaWVsZCA9IGNhc3Q8RmllbGREZWNsPigqTWVtYmVyKTsKKyAgICAgICAgRmllbGREZWNsICpPbGRGaWVsZCA9IGNhc3Q8RmllbGREZWNsPihNZW1iZXIpOwogICAgICAgICBpZiAoT2xkRmllbGQtPmdldEluQ2xhc3NJbml0aWFsaXplcigpKQogICAgICAgICAgIEZpZWxkc1dpdGhNZW1iZXJJbml0aWFsaXplcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKE9sZEZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkKSk7CkBAIC0yMTI0LDE2ICsyMDMxLDE0IEBACiAgICAgICBGaWVsZERlY2wgKk5ld0ZpZWxkID0gRmllbGRzV2l0aE1lbWJlckluaXRpYWxpemVyc1tJXS5zZWNvbmQ7CiAgICAgICBFeHByICpPbGRJbml0ID0gT2xkRmllbGQtPmdldEluQ2xhc3NJbml0aWFsaXplcigpOwogCisgICAgICBBY3RPblN0YXJ0Q1hYSW5DbGFzc01lbWJlckluaXRpYWxpemVyKCk7CiAgICAgICBFeHByUmVzdWx0IE5ld0luaXQgPSBTdWJzdEluaXRpYWxpemVyKE9sZEluaXQsIFRlbXBsYXRlQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDWFhEaXJlY3RJbml0PSovZmFsc2UpOwotICAgICAgaWYgKE5ld0luaXQuaXNJbnZhbGlkKCkpCi0gICAgICAgIE5ld0ZpZWxkLT5zZXRJbnZhbGlkRGVjbCgpOwotICAgICAgZWxzZSB7Ci0gICAgICAgIEV4cHIgKkluaXQgPSBOZXdJbml0LnRha2UoKTsKLSAgICAgICAgYXNzZXJ0KEluaXQgJiYgIm5vLWFyZ3VtZW50IGluaXRpYWxpemVyIGluIGNsYXNzIik7Ci0gICAgICAgIGFzc2VydCghaXNhPFBhcmVuTGlzdEV4cHI+KEluaXQpICYmICJjYWxsLXN0eWxlIGluaXQgaW4gY2xhc3MiKTsKLSAgICAgICAgQWN0T25DWFhJbkNsYXNzTWVtYmVySW5pdGlhbGl6ZXIoTmV3RmllbGQsIEluaXQtPmdldExvY1N0YXJ0KCksIEluaXQpOwotICAgICAgfQorICAgICAgRXhwciAqSW5pdCA9IE5ld0luaXQudGFrZSgpOworICAgICAgYXNzZXJ0KCghSW5pdCB8fCAhaXNhPFBhcmVuTGlzdEV4cHI+KEluaXQpKSAmJgorICAgICAgICAgICAgICJjYWxsLXN0eWxlIGluaXQgaW4gY2xhc3MiKTsKKyAgICAgIEFjdE9uRmluaXNoQ1hYSW5DbGFzc01lbWJlckluaXRpYWxpemVyKE5ld0ZpZWxkLCBJbml0LT5nZXRMb2NTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdCk7CiAgICAgfQogICB9CiAgIC8vIEluc3RhbnRpYXRlIGxhdGUgcGFyc2VkIGF0dHJpYnV0ZXMsIGFuZCBhdHRhY2ggdGhlbSB0byB0aGVpciBkZWNscy4KQEAgLTIxNjEsNiArMjA2Niw4IEBACiAKICAgQWN0T25GaW5pc2hEZWxheWVkTWVtYmVySW5pdGlhbGl6ZXJzKEluc3RhbnRpYXRpb24pOwogCisgIC8vIEZJWE1FOiBXZSBzaG91bGQgZG8gc29tZXRoaW5nIHNpbWlsYXIgZm9yIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIHNvIHRoZXkKKyAgLy8gZW5kIHVwIGluIHRoZSByaWdodCBtb2R1bGUuCiAgIGlmIChUU0sgPT0gVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbikgewogICAgIEluc3RhbnRpYXRpb24tPnNldExvY2F0aW9uKFBhdHRlcm4tPmdldExvY2F0aW9uKCkpOwogICAgIEluc3RhbnRpYXRpb24tPnNldExvY1N0YXJ0KFBhdHRlcm4tPmdldElubmVyTG9jU3RhcnQoKSk7CkBAIC0yMjUwLDYgKzIxNTcsMTAgQEAKICAgaWYgKEluc3QuaXNJbnZhbGlkKCkpCiAgICAgcmV0dXJuIHRydWU7CiAKKyAgLy8gVGhlIGluc3RhbnRpYXRpb24gaXMgdmlzaWJsZSBoZXJlLCBldmVuIGlmIGl0IHdhcyBmaXJzdCBkZWNsYXJlZCBpbiBhbgorICAvLyB1bmltcG9ydGVkIG1vZHVsZS4KKyAgSW5zdGFudGlhdGlvbi0+c2V0SGlkZGVuKGZhbHNlKTsKKwogICAvLyBFbnRlciB0aGUgc2NvcGUgb2YgdGhpcyBpbnN0YW50aWF0aW9uLiBXZSBkb24ndCB1c2UKICAgLy8gUHVzaERlY2xDb250ZXh0IGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIHNjb3BlLgogICBDb250ZXh0UkFJSSBTYXZlZENvbnRleHQoKnRoaXMsIEluc3RhbnRpYXRpb24pOwpAQCAtMjM1NCw4ICsyMjY1LDcgQEAKICAgLy8gSWYgd2UncmUgZGVhbGluZyB3aXRoIGEgbWVtYmVyIHRlbXBsYXRlIHdoZXJlIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCiAgIC8vIGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQsIHRoaXMgcHJvdmlkZXMgdGhlIG9yaWdpbmFsIHRlbXBsYXRlIHBhcmFtZXRlcnMKICAgLy8gZnJvbSB3aGljaCB0aGUgbWVtYmVyIHRlbXBsYXRlJ3MgcGFyYW1ldGVycyB3ZXJlIGluc3RhbnRpYXRlZC4KLSAgU21hbGxWZWN0b3I8Y29uc3QgTmFtZWREZWNsICosIDQ+IEluc3RhbnRpYXRlZFRlbXBsYXRlUGFyYW1ldGVyczsKLSAgCisKICAgaWYgKE1hdGNoZWQuc2l6ZSgpID49IDEpIHsKICAgICBTbWFsbFZlY3RvckltcGw8TWF0Y2hSZXN1bHQ+OjppdGVyYXRvciBCZXN0ID0gTWF0Y2hlZC5iZWdpbigpOwogICAgIGlmIChNYXRjaGVkLnNpemUoKSA9PSAxKSB7CkBAIC0yNDY0LDExICsyMzc0LDkgQEAKICAgICAgICBUU0sgPT0gVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uIHx8CiAgICAgICAgKFRTSyA9PSBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uICYmIEluc3RhbnRpYXRpb24tPmlzTG9jYWxDbGFzcygpKSkgJiYKICAgICAgICJVbmV4cGVjdGVkIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGtpbmQhIik7Ci0gIGZvciAoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgRCA9IEluc3RhbnRpYXRpb24tPmRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVuZCA9IEluc3RhbnRpYXRpb24tPmRlY2xzX2VuZCgpOwotICAgICAgIEQgIT0gREVuZDsgKytEKSB7CisgIGZvciAoYXV0byAqRCA6IEluc3RhbnRpYXRpb24tPmRlY2xzKCkpIHsKICAgICBib29sIFN1cHByZXNzTmV3ID0gZmFsc2U7Ci0gICAgaWYgKEZ1bmN0aW9uRGVjbCAqRnVuY3Rpb24gPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KCpEKSkgeworICAgIGlmIChhdXRvICpGdW5jdGlvbiA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oRCkpIHsKICAgICAgIGlmIChGdW5jdGlvbkRlY2wgKlBhdHRlcm4KICAgICAgICAgICAgID0gRnVuY3Rpb24tPmdldEluc3RhbnRpYXRlZEZyb21NZW1iZXJGdW5jdGlvbigpKSB7CiAgICAgICAgIE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbyAqTVNJbmZvIApAQCAtMjUwOSw3ICsyNDE3LDcgQEAKICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihGdW5jdGlvbiwgUG9pbnRPZkluc3RhbnRpYXRpb24pKTsKICAgICAgICAgfQogICAgICAgfQotICAgIH0gZWxzZSBpZiAoVmFyRGVjbCAqVmFyID0gZHluX2Nhc3Q8VmFyRGVjbD4oKkQpKSB7CisgICAgfSBlbHNlIGlmIChhdXRvICpWYXIgPSBkeW5fY2FzdDxWYXJEZWNsPihEKSkgewogICAgICAgaWYgKGlzYTxWYXJUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbD4oVmFyKSkKICAgICAgICAgY29udGludWU7CiAKQEAgLTI1NDUsNyArMjQ1Myw3IEBACiAgICAgICAgICAgVmFyLT5zZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZChUU0ssIFBvaW50T2ZJbnN0YW50aWF0aW9uKTsKICAgICAgICAgfQogICAgICAgfSAgICAgIAotICAgIH0gZWxzZSBpZiAoQ1hYUmVjb3JkRGVjbCAqUmVjb3JkID0gZHluX2Nhc3Q8Q1hYUmVjb3JkRGVjbD4oKkQpKSB7CisgICAgfSBlbHNlIGlmIChhdXRvICpSZWNvcmQgPSBkeW5fY2FzdDxDWFhSZWNvcmREZWNsPihEKSkgewogICAgICAgLy8gQWx3YXlzIHNraXAgdGhlIGluamVjdGVkLWNsYXNzLW5hbWUsIGFsb25nIHdpdGggYW55CiAgICAgICAvLyByZWRlY2xhcmF0aW9ucyBvZiBuZXN0ZWQgY2xhc3Nlcywgc2luY2UgYm90aCB3b3VsZCBjYXVzZSB1cwogICAgICAgLy8gdG8gdHJ5IHRvIGluc3RhbnRpYXRlIHRoZSBtZW1iZXJzIG9mIGEgY2xhc3MgdHdpY2UuCkBAIC0yNjAyLDcgKzI1MTAsNyBAQAogICAgICAgaWYgKFBhdHRlcm4pCiAgICAgICAgIEluc3RhbnRpYXRlQ2xhc3NNZW1iZXJzKFBvaW50T2ZJbnN0YW50aWF0aW9uLCBQYXR0ZXJuLCBUZW1wbGF0ZUFyZ3MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU0spOwotICAgIH0gZWxzZSBpZiAoRW51bURlY2wgKkVudW0gPSBkeW5fY2FzdDxFbnVtRGVjbD4oKkQpKSB7CisgICAgfSBlbHNlIGlmIChhdXRvICpFbnVtID0gZHluX2Nhc3Q8RW51bURlY2w+KEQpKSB7CiAgICAgICBNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8gKk1TSW5mbyA9IEVudW0tPmdldE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbygpOwogICAgICAgYXNzZXJ0KE1TSW5mbyAmJiAiTm8gbWVtYmVyIHNwZWNpYWxpemF0aW9uIGluZm9ybWF0aW9uPyIpOwogCmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hVGVtcGxhdGVJbnN0YW50aWF0ZURlY2wuY3BwIGIvbGliL1NlbWEvU2VtYVRlbXBsYXRlSW5zdGFudGlhdGVEZWNsLmNwcAppbmRleCA1YzI4ZTNiLi4zMTZiNTc0IDEwMDY0NAotLS0gYS9saWIvU2VtYS9TZW1hVGVtcGxhdGVJbnN0YW50aWF0ZURlY2wuY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFUZW1wbGF0ZUluc3RhbnRpYXRlRGVjbC5jcHAKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWFJbnRlcm5hbC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb25zdW1lci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVE11dGF0aW9uTGlzdGVuZXIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbFRlbXBsYXRlLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xWaXNpdG9yLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlcGVuZGVudERpYWdub3N0aWMuaCIKQEAgLTEyOSwxNCArMTMwLDQ2IEBACiAgIH0KIH0KIAorc3RhdGljIHZvaWQgaW5zdGFudGlhdGVEZXBlbmRlbnRFbmFibGVJZkF0dHIoCisgICAgU2VtYSAmUywgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MsCisgICAgY29uc3QgRW5hYmxlSWZBdHRyICpBLCBjb25zdCBEZWNsICpUbXBsLCBEZWNsICpOZXcpIHsKKyAgRXhwciAqQ29uZCA9IDA7CisgIHsKKyAgICBFbnRlckV4cHJlc3Npb25FdmFsdWF0aW9uQ29udGV4dCBVbmV2YWx1YXRlZChTLCBTZW1hOjpVbmV2YWx1YXRlZCk7CisgICAgRXhwclJlc3VsdCBSZXN1bHQgPSBTLlN1YnN0RXhwcihBLT5nZXRDb25kKCksIFRlbXBsYXRlQXJncyk7CisgICAgaWYgKFJlc3VsdC5pc0ludmFsaWQoKSkKKyAgICAgIHJldHVybjsKKyAgICBDb25kID0gUmVzdWx0LnRha2VBczxFeHByPigpOworICB9CisgIGlmIChBLT5nZXRDb25kKCktPmlzVHlwZURlcGVuZGVudCgpICYmICFDb25kLT5pc1R5cGVEZXBlbmRlbnQoKSkgeworICAgIEV4cHJSZXN1bHQgQ29udmVydGVkID0gUy5QZXJmb3JtQ29udGV4dHVhbGx5Q29udmVydFRvQm9vbChDb25kKTsKKyAgICBpZiAoQ29udmVydGVkLmlzSW52YWxpZCgpKQorICAgICAgcmV0dXJuOworICAgIENvbmQgPSBDb252ZXJ0ZWQudGFrZSgpOworICB9CisKKyAgU21hbGxWZWN0b3I8UGFydGlhbERpYWdub3N0aWNBdCwgOD4gRGlhZ3M7CisgIGlmIChBLT5nZXRDb25kKCktPmlzVmFsdWVEZXBlbmRlbnQoKSAmJiAhQ29uZC0+aXNWYWx1ZURlcGVuZGVudCgpICYmCisgICAgICAhRXhwcjo6aXNQb3RlbnRpYWxDb25zdGFudEV4cHJVbmV2YWx1YXRlZChDb25kLCBjYXN0PEZ1bmN0aW9uRGVjbD4oVG1wbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFncykpIHsKKyAgICBTLkRpYWcoQS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX2VuYWJsZV9pZl9uZXZlcl9jb25zdGFudF9leHByKTsKKyAgICBmb3IgKGludCBJID0gMCwgTiA9IERpYWdzLnNpemUoKTsgSSAhPSBOOyArK0kpCisgICAgICBTLkRpYWcoRGlhZ3NbSV0uZmlyc3QsIERpYWdzW0ldLnNlY29uZCk7CisgICAgcmV0dXJuOworICB9CisKKyAgRW5hYmxlSWZBdHRyICpFSUEgPSBuZXcgKFMuZ2V0QVNUQ29udGV4dCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlSWZBdHRyKEEtPmdldExvY2F0aW9uKCksIFMuZ2V0QVNUQ29udGV4dCgpLCBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEtPmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTsKKyAgTmV3LT5hZGRBdHRyKEVJQSk7Cit9CisKIHZvaWQgU2VtYTo6SW5zdGFudGlhdGVBdHRycyhjb25zdCBNdWx0aUxldmVsVGVtcGxhdGVBcmd1bWVudExpc3QgJlRlbXBsYXRlQXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsICpUbXBsLCBEZWNsICpOZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZUluc3RhbnRpYXRlZEF0dHJWZWMgKkxhdGVBdHRycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbEluc3RhbnRpYXRpb25TY29wZSAqT3V0ZXJNb3N0U2NvcGUpIHsKLSAgZm9yIChBdHRyVmVjOjpjb25zdF9pdGVyYXRvciBpID0gVG1wbC0+YXR0cl9iZWdpbigpLCBlID0gVG1wbC0+YXR0cl9lbmQoKTsKLSAgICAgICBpICE9IGU7ICsraSkgewotICAgIGNvbnN0IEF0dHIgKlRtcGxBdHRyID0gKmk7Ci0KKyAgZm9yIChjb25zdCBhdXRvICpUbXBsQXR0ciA6IFRtcGwtPmF0dHJzKCkpIHsKICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgZ2VuZXJhbGl6ZWQgdG8gbW9yZSB0aGFuIGp1c3QgdGhlIEFsaWduZWRBdHRyLgogICAgIGNvbnN0IEFsaWduZWRBdHRyICpBbGlnbmVkID0gZHluX2Nhc3Q8QWxpZ25lZEF0dHI+KFRtcGxBdHRyKTsKICAgICBpZiAoQWxpZ25lZCAmJiBBbGlnbmVkLT5pc0FsaWdubWVudERlcGVuZGVudCgpKSB7CkBAIC0xNDQsNiArMTc3LDEzIEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAKKyAgICBjb25zdCBFbmFibGVJZkF0dHIgKkVuYWJsZUlmID0gZHluX2Nhc3Q8RW5hYmxlSWZBdHRyPihUbXBsQXR0cik7CisgICAgaWYgKEVuYWJsZUlmICYmIEVuYWJsZUlmLT5nZXRDb25kKCktPmlzVmFsdWVEZXBlbmRlbnQoKSkgeworICAgICAgaW5zdGFudGlhdGVEZXBlbmRlbnRFbmFibGVJZkF0dHIoKnRoaXMsIFRlbXBsYXRlQXJncywgRW5hYmxlSWYsIFRtcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXcpOworICAgICAgY29udGludWU7CisgICAgfQorCiAgICAgYXNzZXJ0KCFUbXBsQXR0ci0+aXNQYWNrRXhwYW5zaW9uKCkpOwogICAgIGlmIChUbXBsQXR0ci0+aXNMYXRlUGFyc2VkKCkgJiYgTGF0ZUF0dHJzKSB7CiAgICAgICAvLyBMYXRlIHBhcnNlZCBhdHRyaWJ1dGVzIG11c3QgYmUgaW5zdGFudGlhdGVkIGFuZCBhdHRhY2hlZCBhZnRlciB0aGUKQEAgLTQ3Niw3ICs1MTYsNyBAQAogCiAgIGlmIChESS0+Z2V0VHlwZSgpLT5pc1ZhcmlhYmx5TW9kaWZpZWRUeXBlKCkpIHsKICAgICBTZW1hUmVmLkRpYWcoRC0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX3Byb3BlcnR5X2lzX3ZhcmlhYmx5X21vZGlmaWVkKQotICAgIDw8IEQtPmdldE5hbWUoKTsKKyAgICAgIDw8IEQ7CiAgICAgSW52YWxpZCA9IHRydWU7CiAgIH0gZWxzZSBpZiAoREktPmdldFR5cGUoKS0+aXNJbnN0YW50aWF0aW9uRGVwZW5kZW50VHlwZSgpKSAgewogICAgIERJID0gU2VtYVJlZi5TdWJzdFR5cGUoREksIFRlbXBsYXRlQXJncywKQEAgLTQ5OSwxMSArNTM5LDkgQEAKICAgICBTZW1hUmVmLk1hcmtEZWNsYXJhdGlvbnNSZWZlcmVuY2VkSW5UeXBlKEQtPmdldExvY2F0aW9uKCksIERJLT5nZXRUeXBlKCkpOwogICB9CiAKLSAgTVNQcm9wZXJ0eURlY2wgKlByb3BlcnR5ID0gbmV3IChTZW1hUmVmLkNvbnRleHQpCi0gICAgICBNU1Byb3BlcnR5RGVjbChPd25lciwgRC0+Z2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgIEQtPmdldERlY2xOYW1lKCksIERJLT5nZXRUeXBlKCksIERJLAotICAgICAgICAgICAgICAgICAgICAgRC0+Z2V0TG9jU3RhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgIEQtPmdldEdldHRlcklkKCksIEQtPmdldFNldHRlcklkKCkpOworICBNU1Byb3BlcnR5RGVjbCAqUHJvcGVydHkgPSBNU1Byb3BlcnR5RGVjbDo6Q3JlYXRlKAorICAgICAgU2VtYVJlZi5Db250ZXh0LCBPd25lciwgRC0+Z2V0TG9jYXRpb24oKSwgRC0+Z2V0RGVjbE5hbWUoKSwgREktPmdldFR5cGUoKSwKKyAgICAgIERJLCBELT5nZXRMb2NTdGFydCgpLCBELT5nZXRHZXR0ZXJJZCgpLCBELT5nZXRTZXR0ZXJJZCgpKTsKIAogICBTZW1hUmVmLkluc3RhbnRpYXRlQXR0cnMoVGVtcGxhdGVBcmdzLCBELCBQcm9wZXJ0eSwgTGF0ZUF0dHJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRpbmdTY29wZSk7CkBAIC01MjIsMTAgKzU2MCw4IEBACiAgICAgbmV3IChTZW1hUmVmLkNvbnRleHQpTmFtZWREZWNsKltELT5nZXRDaGFpbmluZ1NpemUoKV07CiAKICAgaW50IGkgPSAwOwotICBmb3IgKEluZGlyZWN0RmllbGREZWNsOjpjaGFpbl9pdGVyYXRvciBQSSA9Ci0gICAgICAgRC0+Y2hhaW5fYmVnaW4oKSwgUEUgPSBELT5jaGFpbl9lbmQoKTsKLSAgICAgICBQSSAhPSBQRTsgKytQSSkgewotICAgIE5hbWVkRGVjbCAqTmV4dCA9IFNlbWFSZWYuRmluZEluc3RhbnRpYXRlZERlY2woRC0+Z2V0TG9jYXRpb24oKSwgKlBJLAorICBmb3IgKGF1dG8gKlBJIDogRC0+Y2hhaW4oKSkgeworICAgIE5hbWVkRGVjbCAqTmV4dCA9IFNlbWFSZWYuRmluZEluc3RhbnRpYXRlZERlY2woRC0+Z2V0TG9jYXRpb24oKSwgUEksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVBcmdzKTsKICAgICBpZiAoIU5leHQpCiAgICAgICByZXR1cm4gMDsKQEAgLTY1MCw2ICs2ODYsOCBAQAogCiAgIEVudW0tPnNldEluc3RhbnRpYXRpb25PZk1lbWJlckVudW0oRCwgVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbik7CiAgIEVudW0tPnNldEFjY2VzcyhELT5nZXRBY2Nlc3MoKSk7CisgIC8vIEZvcndhcmQgdGhlIG1hbmdsaW5nIG51bWJlciBmcm9tIHRoZSB0ZW1wbGF0ZSB0byB0aGUgaW5zdGFudGlhdGVkIGRlY2wuCisgIFNlbWFSZWYuQ29udGV4dC5zZXRNYW5nbGluZ051bWJlcihFbnVtLCBTZW1hUmVmLkNvbnRleHQuZ2V0TWFuZ2xpbmdOdW1iZXIoRCkpOwogICBpZiAoU3Vic3RRdWFsaWZpZXIoRCwgRW51bSkpIHJldHVybiAwOwogICBPd25lci0+YWRkRGVjbChFbnVtKTsKIApAQCAtNjkzLDkgKzczMSw3IEBACiAgIFNtYWxsVmVjdG9yPERlY2wqLCA0PiBFbnVtZXJhdG9yczsKIAogICBFbnVtQ29uc3RhbnREZWNsICpMYXN0RW51bUNvbnN0ID0gMDsKLSAgZm9yIChFbnVtRGVjbDo6ZW51bWVyYXRvcl9pdGVyYXRvciBFQyA9IFBhdHRlcm4tPmVudW1lcmF0b3JfYmVnaW4oKSwKLSAgICAgICAgIEVDRW5kID0gUGF0dGVybi0+ZW51bWVyYXRvcl9lbmQoKTsKLSAgICAgICBFQyAhPSBFQ0VuZDsgKytFQykgeworICBmb3IgKGF1dG8gKkVDIDogUGF0dGVybi0+ZW51bWVyYXRvcnMoKSkgewogICAgIC8vIFRoZSBzcGVjaWZpZWQgdmFsdWUgZm9yIHRoZSBlbnVtZXJhdG9yLgogICAgIEV4cHJSZXN1bHQgVmFsdWUgPSBTZW1hUmVmLk93bmVkKChFeHByICopMCk7CiAgICAgaWYgKEV4cHIgKlVuaW5zdFZhbHVlID0gRUMtPmdldEluaXRFeHByKCkpIHsKQEAgLTcyNSw3ICs3NjEsNyBAQAogICAgIH0KIAogICAgIGlmIChFbnVtQ29uc3QpIHsKLSAgICAgIFNlbWFSZWYuSW5zdGFudGlhdGVBdHRycyhUZW1wbGF0ZUFyZ3MsICpFQywgRW51bUNvbnN0KTsKKyAgICAgIFNlbWFSZWYuSW5zdGFudGlhdGVBdHRycyhUZW1wbGF0ZUFyZ3MsIEVDLCBFbnVtQ29uc3QpOwogCiAgICAgICBFbnVtQ29uc3QtPnNldEFjY2VzcyhFbnVtLT5nZXRBY2Nlc3MoKSk7CiAgICAgICBFbnVtLT5hZGREZWNsKEVudW1Db25zdCk7CkBAIC03MzYsNyArNzcyLDcgQEAKICAgICAgICAgICAhRW51bS0+aXNTY29wZWQoKSkgewogICAgICAgICAvLyBJZiB0aGUgZW51bWVyYXRpb24gaXMgd2l0aGluIGEgZnVuY3Rpb24gb3IgbWV0aG9kLCByZWNvcmQgdGhlIGVudW0KICAgICAgICAgLy8gY29uc3RhbnQgYXMgYSBsb2NhbC4KLSAgICAgICAgU2VtYVJlZi5DdXJyZW50SW5zdGFudGlhdGlvblNjb3BlLT5JbnN0YW50aWF0ZWRMb2NhbCgqRUMsIEVudW1Db25zdCk7CisgICAgICAgIFNlbWFSZWYuQ3VycmVudEluc3RhbnRpYXRpb25TY29wZS0+SW5zdGFudGlhdGVkTG9jYWwoRUMsIEVudW1Db25zdCk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC05OTEsOCArMTAyNyw5IEBACiAKICAgVmFyVGVtcGxhdGVEZWNsICpJbnN0ID0gVmFyVGVtcGxhdGVEZWNsOjpDcmVhdGUoCiAgICAgICBTZW1hUmVmLkNvbnRleHQsIERDLCBELT5nZXRMb2NhdGlvbigpLCBELT5nZXRJZGVudGlmaWVyKCksIEluc3RQYXJhbXMsCi0gICAgICBWYXJJbnN0LCBQcmV2VmFyVGVtcGxhdGUpOworICAgICAgVmFySW5zdCk7CiAgIFZhckluc3QtPnNldERlc2NyaWJlZFZhclRlbXBsYXRlKEluc3QpOworICBJbnN0LT5zZXRQcmV2aW91c0RlY2woUHJldlZhclRlbXBsYXRlKTsKIAogICBJbnN0LT5zZXRBY2Nlc3MoRC0+Z2V0QWNjZXNzKCkpOwogICBpZiAoIVByZXZWYXJUZW1wbGF0ZSkKQEAgLTExMzUsMTkgKzExNzIsMjAgQEAKICAgaWYgKEQtPmlzTG9jYWxDbGFzcygpKQogICAgIFNlbWFSZWYuQ3VycmVudEluc3RhbnRpYXRpb25TY29wZS0+SW5zdGFudGlhdGVkTG9jYWwoRCwgUmVjb3JkKTsKIAorICAvLyBGb3J3YXJkIHRoZSBtYW5nbGluZyBudW1iZXIgZnJvbSB0aGUgdGVtcGxhdGUgdG8gdGhlIGluc3RhbnRpYXRlZCBkZWNsLgorICBTZW1hUmVmLkNvbnRleHQuc2V0TWFuZ2xpbmdOdW1iZXIoUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYVJlZi5Db250ZXh0LmdldE1hbmdsaW5nTnVtYmVyKEQpKTsKKwogICBPd25lci0+YWRkRGVjbChSZWNvcmQpOwogCiAgIC8vIERSMTQ4NCBjbGFyaWZpZXMgdGhhdCB0aGUgbWVtYmVycyBvZiBhIGxvY2FsIGNsYXNzIGFyZSBpbnN0YW50aWF0ZWQgYXMgcGFydAogICAvLyBvZiB0aGUgaW5zdGFudGlhdGlvbiBvZiB0aGVpciBlbmNsb3NpbmcgZW50aXR5LgogICBpZiAoRC0+aXNDb21wbGV0ZURlZmluaXRpb24oKSAmJiBELT5pc0xvY2FsQ2xhc3MoKSkgewotICAgIGlmIChTZW1hUmVmLkluc3RhbnRpYXRlQ2xhc3MoRC0+Z2V0TG9jYXRpb24oKSwgUmVjb3JkLCBELCBUZW1wbGF0ZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDb21wbGFpbj0qL3RydWUpKSB7Ci0gICAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnN0YW50aWF0ZUNsYXNzIHNob3VsZG4ndCBmYWlsIGhlcmUhIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFNlbWFSZWYuSW5zdGFudGlhdGVDbGFzc01lbWJlcnMoRC0+Z2V0TG9jYXRpb24oKSwgUmVjb3JkLCBUZW1wbGF0ZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb24pOwotICAgIH0KKyAgICBTZW1hUmVmLkluc3RhbnRpYXRlQ2xhc3MoRC0+Z2V0TG9jYXRpb24oKSwgUmVjb3JkLCBELCBUZW1wbGF0ZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQ29tcGxhaW49Ki90cnVlKTsKKyAgICBTZW1hUmVmLkluc3RhbnRpYXRlQ2xhc3NNZW1iZXJzKEQtPmdldExvY2F0aW9uKCksIFJlY29yZCwgVGVtcGxhdGVBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbik7CiAgIH0KICAgcmV0dXJuIFJlY29yZDsKIH0KQEAgLTExNzAsMTUgKzEyMDgsMTQgQEAKIAogICBGdW5jdGlvblByb3RvVHlwZTo6RXh0UHJvdG9JbmZvIE5ld0VQSSA9IE5ld0Z1bmMtPmdldEV4dFByb3RvSW5mbygpOwogICBOZXdFUEkuRXh0SW5mbyA9IE9yaWdGdW5jLT5nZXRFeHRJbmZvKCk7Ci0gIHJldHVybiBDb250ZXh0LmdldEZ1bmN0aW9uVHlwZShOZXdGdW5jLT5nZXRSZXN1bHRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXdGdW5jLT5nZXRBcmdUeXBlcygpLCBOZXdFUEkpOworICByZXR1cm4gQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoTmV3RnVuYy0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3RnVuYy0+Z2V0UGFyYW1UeXBlcygpLCBOZXdFUEkpOwogfQogCiAvLy8gTm9ybWFsIGNsYXNzIG1lbWJlcnMgYXJlIG9mIG1vcmUgc3BlY2lmaWMgdHlwZXMgYW5kIHRoZXJlZm9yZQogLy8vIGRvbid0IG1ha2UgaXQgaGVyZS4gIFRoaXMgZnVuY3Rpb24gc2VydmVzIHR3byBwdXJwb3NlczoKIC8vLyAgIDEpIGluc3RhbnRpYXRpbmcgZnVuY3Rpb24gdGVtcGxhdGVzCiAvLy8gICAyKSBzdWJzdGl0dXRpbmcgZnJpZW5kIGRlY2xhcmF0aW9ucwotLy8vIEZJWE1FOiBwcmVzZXJ2ZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBpbiBjYXNlICMyCiBEZWNsICpUZW1wbGF0ZURlY2xJbnN0YW50aWF0b3I6OlZpc2l0RnVuY3Rpb25EZWNsKEZ1bmN0aW9uRGVjbCAqRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVGVtcGxhdGVQYXJhbXMpIHsKICAgLy8gQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhbHJlYWR5IGEgZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZm9yCkBAIC0xMzg4LDczICsxNDI1LDU2IEBACiAgICAgUHJpbmNpcGFsRGVjbC0+c2V0T2JqZWN0T2ZGcmllbmREZWNsKCk7CiAgICAgREMtPm1ha2VEZWNsVmlzaWJsZUluQ29udGV4dChQcmluY2lwYWxEZWNsKTsKIAotICAgIGJvb2wgcXVldWVkSW5zdGFudGlhdGlvbiA9IGZhbHNlOworICAgIGJvb2wgUXVldWVkSW5zdGFudGlhdGlvbiA9IGZhbHNlOwogCi0gICAgLy8gQysrOTggW3RlbXAuZnJpZW5kXXA1OiBXaGVuIGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbiBhIGZyaWVuZCBmdW5jdGlvbgotICAgIC8vICAgZGVjbGFyYXRpb24gaW4gYSBjbGFzcyB0ZW1wbGF0ZSwgdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXQgZWFjaAotICAgIC8vICAgaW5zdGFudGlhdGlvbiBvZiB0aGUgY2xhc3MgdGVtcGxhdGUuIFRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGV2ZW4gaWYgaXQKLSAgICAvLyAgIGlzIG5ldmVyIHVzZWQuCi0gICAgLy8gQysrMTEgW3RlbXAuZnJpZW5kXXA0OiBXaGVuIGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbiBhIGZyaWVuZCBmdW5jdGlvbgotICAgIC8vICAgZGVjbGFyYXRpb24gaW4gYSBjbGFzcyB0ZW1wbGF0ZSwgdGhlIGZ1bmN0aW9uIGlzIGluc3RhbnRpYXRlZCB3aGVuIHRoZQotICAgIC8vICAgZnVuY3Rpb24gaXMgb2RyLXVzZWQuCi0gICAgLy8KLSAgICAvLyBJZiAtV2MrKzk4LWNvbXBhdCBpcyBlbmFibGVkLCB3ZSBnbyB0aHJvdWdoIHRoZSBtb3Rpb25zIG9mIGNoZWNraW5nIGZvciBhCi0gICAgLy8gcmVkZWZpbml0aW9uLCBidXQgZG9uJ3QgaW5zdGFudGlhdGUgdGhlIGZ1bmN0aW9uLgotICAgIGlmICgoIVNlbWFSZWYuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMSB8fAotICAgICAgICAgU2VtYVJlZi5EaWFncy5nZXREaWFnbm9zdGljTGV2ZWwoCi0gICAgICAgICAgICAgZGlhZzo6d2Fybl9jeHg5OF9jb21wYXRfZnJpZW5kX3JlZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICBGdW5jdGlvbi0+Z2V0TG9jYXRpb24oKSkKLSAgICAgICAgICAgIT0gRGlhZ25vc3RpY3NFbmdpbmU6Oklnbm9yZWQpICYmCi0gICAgICAgIEQtPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkgeworICAgIC8vIEMrKzExIFt0ZW1wLmZyaWVuZF1wNCAoRFIzMjkpOgorICAgIC8vICAgV2hlbiBhIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4gYSBmcmllbmQgZnVuY3Rpb24gZGVjbGFyYXRpb24gaW4gYSBjbGFzcworICAgIC8vICAgdGVtcGxhdGUsIHRoZSBmdW5jdGlvbiBpcyBpbnN0YW50aWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgb2RyLXVzZWQuCisgICAgLy8gICBUaGUgc2FtZSByZXN0cmljdGlvbnMgb24gbXVsdGlwbGUgZGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyB0aGF0CisgICAgLy8gICBhcHBseSB0byBub24tdGVtcGxhdGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBhbHNvIGFwcGx5CisgICAgLy8gICB0byB0aGVzZSBpbXBsaWNpdCBkZWZpbml0aW9ucy4KKyAgICBpZiAoRC0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpKSB7CiAgICAgICAvLyBDaGVjayBmb3IgYSBmdW5jdGlvbiBib2R5LgogICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpEZWZpbml0aW9uID0gMDsKICAgICAgIGlmIChGdW5jdGlvbi0+aXNEZWZpbmVkKERlZmluaXRpb24pICYmCiAgICAgICAgICAgRGVmaW5pdGlvbi0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSA9PSBUU0tfVW5kZWNsYXJlZCkgewotICAgICAgICBTZW1hUmVmLkRpYWcoRnVuY3Rpb24tPmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICBTZW1hUmVmLmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEgPwotICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjp3YXJuX2N4eDk4X2NvbXBhdF9mcmllbmRfcmVkZWZpbml0aW9uIDoKLSAgICAgICAgICAgICAgICAgICAgICAgZGlhZzo6ZXJyX3JlZGVmaW5pdGlvbikgPDwgRnVuY3Rpb24tPmdldERlY2xOYW1lKCk7CisgICAgICAgIFNlbWFSZWYuRGlhZyhGdW5jdGlvbi0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6ZXJyX3JlZGVmaW5pdGlvbikKKyAgICAgICAgICAgIDw8IEZ1bmN0aW9uLT5nZXREZWNsTmFtZSgpOwogICAgICAgICBTZW1hUmVmLkRpYWcoRGVmaW5pdGlvbi0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9wcmV2aW91c19kZWZpbml0aW9uKTsKLSAgICAgICAgaWYgKCFTZW1hUmVmLmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEpCi0gICAgICAgICAgRnVuY3Rpb24tPnNldEludmFsaWREZWNsKCk7CiAgICAgICB9CiAgICAgICAvLyBDaGVjayBmb3IgcmVkZWZpbml0aW9ucyBkdWUgdG8gb3RoZXIgaW5zdGFudGlhdGlvbnMgb2YgdGhpcyBvcgogICAgICAgLy8gYSBzaW1pbGFyIGZyaWVuZCBmdW5jdGlvbi4KLSAgICAgIGVsc2UgZm9yIChGdW5jdGlvbkRlY2w6OnJlZGVjbF9pdGVyYXRvciBSID0gRnVuY3Rpb24tPnJlZGVjbHNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRW5kID0gRnVuY3Rpb24tPnJlZGVjbHNfZW5kKCk7Ci0gICAgICAgICAgICAgICAgUiAhPSBSRW5kOyArK1IpIHsKLSAgICAgICAgaWYgKCpSID09IEZ1bmN0aW9uKQorICAgICAgZWxzZSBmb3IgKGF1dG8gUiA6IEZ1bmN0aW9uLT5yZWRlY2xzKCkpIHsKKyAgICAgICAgaWYgKFIgPT0gRnVuY3Rpb24pCiAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIHN3aXRjaCAoUi0+Z2V0RnJpZW5kT2JqZWN0S2luZCgpKSB7Ci0gICAgICAgIGNhc2UgRGVjbDo6Rk9LX05vbmU6Ci0gICAgICAgICAgaWYgKCFTZW1hUmVmLmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMTEgJiYKLSAgICAgICAgICAgICAgIXF1ZXVlZEluc3RhbnRpYXRpb24gJiYgUi0+aXNVc2VkKGZhbHNlKSkgewotICAgICAgICAgICAgaWYgKE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbyAqTVNJbmZvCi0gICAgICAgICAgICAgICAgPSBGdW5jdGlvbi0+Z2V0TWVtYmVyU3BlY2lhbGl6YXRpb25JbmZvKCkpIHsKLSAgICAgICAgICAgICAgaWYgKE1TSW5mby0+Z2V0UG9pbnRPZkluc3RhbnRpYXRpb24oKS5pc0ludmFsaWQoKSkgewotICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExvYyA9IFItPmdldExvY2F0aW9uKCk7IC8vIEZJWE1FCi0gICAgICAgICAgICAgICAgTVNJbmZvLT5zZXRQb2ludE9mSW5zdGFudGlhdGlvbihMb2MpOwotICAgICAgICAgICAgICAgIFNlbWFSZWYuUGVuZGluZ0xvY2FsSW1wbGljaXRJbnN0YW50aWF0aW9ucy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoRnVuY3Rpb24sIExvYykpOwotICAgICAgICAgICAgICAgIHF1ZXVlZEluc3RhbnRpYXRpb24gPSB0cnVlOwotICAgICAgICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgc29tZSBwcmlvciBkZWNsYXJhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHVzZWQsIHdlIG5lZWQKKyAgICAgICAgLy8gdG8gaW5zdGFudGlhdGUgaXRzIGRlZmluaXRpb24uCisgICAgICAgIGlmICghUXVldWVkSW5zdGFudGlhdGlvbiAmJiBSLT5pc1VzZWQoZmFsc2UpKSB7CisgICAgICAgICAgaWYgKE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbyAqTVNJbmZvID0KKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uLT5nZXRNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8oKSkgeworICAgICAgICAgICAgaWYgKE1TSW5mby0+Z2V0UG9pbnRPZkluc3RhbnRpYXRpb24oKS5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBSLT5nZXRMb2NhdGlvbigpOyAvLyBGSVhNRQorICAgICAgICAgICAgICBNU0luZm8tPnNldFBvaW50T2ZJbnN0YW50aWF0aW9uKExvYyk7CisgICAgICAgICAgICAgIFNlbWFSZWYuUGVuZGluZ0xvY2FsSW1wbGljaXRJbnN0YW50aWF0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKEZ1bmN0aW9uLCBMb2MpKTsKKyAgICAgICAgICAgICAgUXVldWVkSW5zdGFudGlhdGlvbiA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKlJQYXR0ZXJuCi0gICAgICAgICAgICAgID0gUi0+Z2V0VGVtcGxhdGVJbnN0YW50aWF0aW9uUGF0dGVybigpKQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgc29tZSBwcmlvciBkZWNsYXJhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIHdhcyBhIGZyaWVuZCB3aXRoIGFuCisgICAgICAgIC8vIHVuaW5zdGFudGlhdGVkIGRlZmluaXRpb24sIHJlamVjdCBpdC4KKyAgICAgICAgaWYgKFItPmdldEZyaWVuZE9iamVjdEtpbmQoKSkgeworICAgICAgICAgIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKlJQYXR0ZXJuID0KKyAgICAgICAgICAgICAgICAgIFItPmdldFRlbXBsYXRlSW5zdGFudGlhdGlvblBhdHRlcm4oKSkgewogICAgICAgICAgICAgaWYgKFJQYXR0ZXJuLT5pc0RlZmluZWQoUlBhdHRlcm4pKSB7Ci0gICAgICAgICAgICAgIFNlbWFSZWYuRGlhZyhGdW5jdGlvbi0+Z2V0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFSZWYuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWc6Ondhcm5fY3h4OThfY29tcGF0X2ZyaWVuZF9yZWRlZmluaXRpb24gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfcmVkZWZpbml0aW9uKQorICAgICAgICAgICAgICBTZW1hUmVmLkRpYWcoRnVuY3Rpb24tPmdldExvY2F0aW9uKCksIGRpYWc6OmVycl9yZWRlZmluaXRpb24pCiAgICAgICAgICAgICAgICAgPDwgRnVuY3Rpb24tPmdldERlY2xOYW1lKCk7CiAgICAgICAgICAgICAgIFNlbWFSZWYuRGlhZyhSLT5nZXRMb2NhdGlvbigpLCBkaWFnOjpub3RlX3ByZXZpb3VzX2RlZmluaXRpb24pOwotICAgICAgICAgICAgICBpZiAoIVNlbWFSZWYuZ2V0TGFuZ09wdHMoKS5DUGx1c1BsdXMxMSkKLSAgICAgICAgICAgICAgICBGdW5jdGlvbi0+c2V0SW52YWxpZERlY2woKTsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMjE0OSw3ICsyMTY5LDcgQEAKICAgfQogCiAgIGlmICghTmV3VUQtPmlzSW52YWxpZERlY2woKSAmJgotICAgICAgU2VtYVJlZi5DaGVja1VzaW5nRGVjbFF1YWxpZmllcihELT5nZXRVc2luZ0xvYygpLCBTUywKKyAgICAgIFNlbWFSZWYuQ2hlY2tVc2luZ0RlY2xRdWFsaWZpZXIoRC0+Z2V0VXNpbmdMb2MoKSwgU1MsIE5hbWVJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBELT5nZXRMb2NhdGlvbigpKSkKICAgICBOZXdVRC0+c2V0SW52YWxpZERlY2woKTsKIApAQCAtMjE3MCw5ICsyMTkwLDcgQEAKICAgYm9vbCBpc0Z1bmN0aW9uU2NvcGUgPSBPd25lci0+aXNGdW5jdGlvbk9yTWV0aG9kKCk7CiAKICAgLy8gUHJvY2VzcyB0aGUgc2hhZG93IGRlY2xzLgotICBmb3IgKFVzaW5nRGVjbDo6c2hhZG93X2l0ZXJhdG9yIEkgPSBELT5zaGFkb3dfYmVnaW4oKSwgRSA9IEQtPnNoYWRvd19lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgVXNpbmdTaGFkb3dEZWNsICpTaGFkb3cgPSAqSTsKKyAgZm9yIChhdXRvICpTaGFkb3cgOiBELT5zaGFkb3dzKCkpIHsKICAgICBOYW1lZERlY2wgKkluc3RUYXJnZXQgPQogICAgICAgICBjYXN0X29yX251bGw8TmFtZWREZWNsPihTZW1hUmVmLkZpbmRJbnN0YW50aWF0ZWREZWNsKAogICAgICAgICAgICAgU2hhZG93LT5nZXRMb2NhdGlvbigpLCBTaGFkb3ctPmdldFRhcmdldERlY2woKSwgVGVtcGxhdGVBcmdzKSk7CkBAIC0yMjg4LDEwICsyMzA2LDggQEAKIERlY2wgKlRlbXBsYXRlRGVjbEluc3RhbnRpYXRvcjo6VmlzaXRPTVBUaHJlYWRQcml2YXRlRGVjbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBUaHJlYWRQcml2YXRlRGVjbCAqRCkgewogICBTbWFsbFZlY3RvcjxFeHByICosIDU+IFZhcnM7Ci0gIGZvciAoQXJyYXlSZWY8RXhwciAqPjo6aXRlcmF0b3IgSSA9IEQtPnZhcmxpc3RfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRC0+dmFybGlzdF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIEV4cHIgKlZhciA9IFNlbWFSZWYuU3Vic3RFeHByKCpJLCBUZW1wbGF0ZUFyZ3MpLnRha2UoKTsKKyAgZm9yIChhdXRvICpJIDogRC0+dmFybGlzdHMoKSkgeworICAgIEV4cHIgKlZhciA9IFNlbWFSZWYuU3Vic3RFeHByKEksIFRlbXBsYXRlQXJncykudGFrZSgpOwogICAgIGFzc2VydChpc2E8RGVjbFJlZkV4cHI+KFZhcikgJiYgInRocmVhZHByaXZhdGUgYXJnIGlzIG5vdCBhIERlY2xSZWZFeHByIik7CiAgICAgVmFycy5wdXNoX2JhY2soVmFyKTsKICAgfQpAQCAtMjI5OSw2ICsyMzE1LDkgQEAKICAgT01QVGhyZWFkUHJpdmF0ZURlY2wgKlREID0KICAgICBTZW1hUmVmLkNoZWNrT01QVGhyZWFkUHJpdmF0ZURlY2woRC0+Z2V0TG9jYXRpb24oKSwgVmFycyk7CiAKKyAgVEQtPnNldEFjY2VzcyhBU19wdWJsaWMpOworICBPd25lci0+YWRkRGVjbChURCk7CisKICAgcmV0dXJuIFREOwogfQogCkBAIC0yNDc2LDExICsyNDk1LDEwIEBACiAKICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGVtcGxhdGUgYXJndW1lbnQgbGlzdCBpcyB3ZWxsLWZvcm1lZCBmb3IgdGhpcyB0ZW1wbGF0ZS4KICAgU21hbGxWZWN0b3I8VGVtcGxhdGVBcmd1bWVudCwgND4gQ29udmVydGVkOwotICBib29sIEV4cGFuc2lvbkludG9GaXhlZExpc3QgPSBmYWxzZTsKICAgaWYgKFNlbWFSZWYuQ2hlY2tUZW1wbGF0ZUFyZ3VtZW50TGlzdCgKICAgICAgICAgICBWYXJUZW1wbGF0ZSwgVmFyVGVtcGxhdGUtPmdldExvY1N0YXJ0KCksCiAgICAgICAgICAgY29uc3RfY2FzdDxUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8gJj4oVmFyVGVtcGxhdGVBcmdzSW5mbyksIGZhbHNlLAotICAgICAgICAgIENvbnZlcnRlZCwgJkV4cGFuc2lvbkludG9GaXhlZExpc3QpKQorICAgICAgICAgIENvbnZlcnRlZCkpCiAgICAgcmV0dXJuIDA7CiAKICAgLy8gRmluZCB0aGUgdmFyaWFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZGVjbGFyYXRpb24gdGhhdApAQCAtMjg4Nyw5ICsyOTA1LDkgQEAKICAgICAgIFR5cGVMb2MgTmV3VEwgPSBOZXdUSW5mby0+Z2V0VHlwZUxvYygpLklnbm9yZVBhcmVucygpOwogICAgICAgRnVuY3Rpb25Qcm90b1R5cGVMb2MgTmV3UHJvdG9Mb2MgPSBOZXdUTC5jYXN0QXM8RnVuY3Rpb25Qcm90b1R5cGVMb2M+KCk7CiAgICAgICB1bnNpZ25lZCBOZXdJZHggPSAwOwotICAgICAgZm9yICh1bnNpZ25lZCBPbGRJZHggPSAwLCBOdW1PbGRQYXJhbXMgPSBPbGRQcm90b0xvYy5nZXROdW1BcmdzKCk7CisgICAgICBmb3IgKHVuc2lnbmVkIE9sZElkeCA9IDAsIE51bU9sZFBhcmFtcyA9IE9sZFByb3RvTG9jLmdldE51bVBhcmFtcygpOwogICAgICAgICAgICBPbGRJZHggIT0gTnVtT2xkUGFyYW1zOyArK09sZElkeCkgewotICAgICAgICBQYXJtVmFyRGVjbCAqT2xkUGFyYW0gPSBPbGRQcm90b0xvYy5nZXRBcmcoT2xkSWR4KTsKKyAgICAgICAgUGFybVZhckRlY2wgKk9sZFBhcmFtID0gT2xkUHJvdG9Mb2MuZ2V0UGFyYW0oT2xkSWR4KTsKICAgICAgICAgTG9jYWxJbnN0YW50aWF0aW9uU2NvcGUgKlNjb3BlID0gU2VtYVJlZi5DdXJyZW50SW5zdGFudGlhdGlvblNjb3BlOwogCiAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBOdW1Bcmd1bWVudHNJbkV4cGFuc2lvbjsKQEAgLTI5MDAsMTQgKzI5MTgsMTQgQEAKICAgICAgICAgaWYgKCFOdW1Bcmd1bWVudHNJbkV4cGFuc2lvbikgewogICAgICAgICAgIC8vIFNpbXBsZSBjYXNlOiBub3JtYWwgcGFyYW1ldGVyLCBvciBhIHBhcmFtZXRlciBwYWNrIHRoYXQncwogICAgICAgICAgIC8vIGluc3RhbnRpYXRlZCB0byBhIChzdGlsbC1kZXBlbmRlbnQpIHBhcmFtZXRlciBwYWNrLgotICAgICAgICAgIFBhcm1WYXJEZWNsICpOZXdQYXJhbSA9IE5ld1Byb3RvTG9jLmdldEFyZyhOZXdJZHgrKyk7CisgICAgICAgICAgUGFybVZhckRlY2wgKk5ld1BhcmFtID0gTmV3UHJvdG9Mb2MuZ2V0UGFyYW0oTmV3SWR4KyspOwogICAgICAgICAgIFBhcmFtcy5wdXNoX2JhY2soTmV3UGFyYW0pOwogICAgICAgICAgIFNjb3BlLT5JbnN0YW50aWF0ZWRMb2NhbChPbGRQYXJhbSwgTmV3UGFyYW0pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIC8vIFBhcmFtZXRlciBwYWNrIGV4cGFuc2lvbjogbWFrZSB0aGUgaW5zdGFudGlhdGlvbiBhbiBhcmd1bWVudCBwYWNrLgogICAgICAgICAgIFNjb3BlLT5NYWtlSW5zdGFudGlhdGVkTG9jYWxBcmdQYWNrKE9sZFBhcmFtKTsKICAgICAgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9ICpOdW1Bcmd1bWVudHNJbkV4cGFuc2lvbjsgKytJKSB7Ci0gICAgICAgICAgICBQYXJtVmFyRGVjbCAqTmV3UGFyYW0gPSBOZXdQcm90b0xvYy5nZXRBcmcoTmV3SWR4KyspOworICAgICAgICAgICAgUGFybVZhckRlY2wgKk5ld1BhcmFtID0gTmV3UHJvdG9Mb2MuZ2V0UGFyYW0oTmV3SWR4KyspOwogICAgICAgICAgICAgUGFyYW1zLnB1c2hfYmFjayhOZXdQYXJhbSk7CiAgICAgICAgICAgICBTY29wZS0+SW5zdGFudGlhdGVkTG9jYWxQYWNrQXJnKE9sZFBhcmFtLCBOZXdQYXJhbSk7CiAgICAgICAgICAgfQpAQCAtMjkxOSwxMSArMjkzNywxMiBAQAogICAgICAgLy8gdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgdGhlbXNlbHZlcy4KICAgICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpPbGRQcm90byA9CiAgICAgICAgICAgY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oT2xkUHJvdG9Mb2MuZ2V0VHlwZSgpKTsKLSAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGlfZW5kID0gT2xkUHJvdG9Mb2MuZ2V0TnVtQXJncygpOyBpICE9IGlfZW5kOyArK2kpIHsKLSAgICAgICAgUGFybVZhckRlY2wgKk9sZFBhcmFtID0gT2xkUHJvdG9Mb2MuZ2V0QXJnKGkpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgaV9lbmQgPSBPbGRQcm90b0xvYy5nZXROdW1QYXJhbXMoKTsgaSAhPSBpX2VuZDsKKyAgICAgICAgICAgKytpKSB7CisgICAgICAgIFBhcm1WYXJEZWNsICpPbGRQYXJhbSA9IE9sZFByb3RvTG9jLmdldFBhcmFtKGkpOwogICAgICAgICBpZiAoIU9sZFBhcmFtKSB7CiAgICAgICAgICAgUGFyYW1zLnB1c2hfYmFjayhTZW1hUmVmLkJ1aWxkUGFybVZhckRlY2xGb3JUeXBlZGVmKAotICAgICAgICAgICAgICBELCBELT5nZXRMb2NhdGlvbigpLCBPbGRQcm90by0+Z2V0QXJnVHlwZShpKSkpOworICAgICAgICAgICAgICBELCBELT5nZXRMb2NhdGlvbigpLCBPbGRQcm90by0+Z2V0UGFyYW1UeXBlKGkpKSk7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIApAQCAtMjk2OSw2ICsyOTg4LDE0IEBACiAgICAgICAvLyBTaW1wbGUgY2FzZTogbm90IGEgcGFyYW1ldGVyIHBhY2suCiAgICAgICBhc3NlcnQoRlBhcmFtSWR4IDwgRnVuY3Rpb24tPmdldE51bVBhcmFtcygpKTsKICAgICAgIFBhcm1WYXJEZWNsICpGdW5jdGlvblBhcmFtID0gRnVuY3Rpb24tPmdldFBhcmFtRGVjbChGUGFyYW1JZHgpOworICAgICAgLy8gSWYgdGhlIHBhcmFtZXRlcidzIHR5cGUgaXMgbm90IGRlcGVuZGVudCwgdXBkYXRlIGl0IHRvIG1hdGNoIHRoZSB0eXBlCisgICAgICAvLyBpbiB0aGUgcGF0dGVybi4gVGhleSBjYW4gZGlmZmVyIGluIHRvcC1sZXZlbCBjdi1xdWFsaWZpZXJzLCBhbmQgd2Ugd2FudAorICAgICAgLy8gdGhlIHBhdHRlcm4ncyB0eXBlIGhlcmUuIElmIHRoZSB0eXBlIGlzIGRlcGVuZGVudCwgdGhleSBjYW4ndCBkaWZmZXIsCisgICAgICAvLyBwZXIgY29yZSBpc3N1ZSAxNjY4LgorICAgICAgLy8gRklYTUU6IFVwZGF0aW5nIHRoZSB0eXBlIHRvIHdvcmsgYXJvdW5kIHRoaXMgaXMgYXQgYmVzdCBmcmFnaWxlLgorICAgICAgaWYgKCFQYXR0ZXJuRGVjbC0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSkKKyAgICAgICAgRnVuY3Rpb25QYXJhbS0+c2V0VHlwZShQYXR0ZXJuUGFyYW0tPmdldFR5cGUoKSk7CisKICAgICAgIEZ1bmN0aW9uUGFyYW0tPnNldERlY2xOYW1lKFBhdHRlcm5QYXJhbS0+Z2V0RGVjbE5hbWUoKSk7CiAgICAgICBTY29wZS5JbnN0YW50aWF0ZWRMb2NhbChQYXR0ZXJuUGFyYW0sIEZ1bmN0aW9uUGFyYW0pOwogICAgICAgKytGUGFyYW1JZHg7CkBAIC0yOTgzLDYgKzMwMTAsOSBAQAogICAgICAgICAgICAic2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gYWxsIHRlbXBsYXRlIGFyZ3VtZW50cyBhcmUga25vd24iKTsKICAgICBmb3IgKHVuc2lnbmVkIEFyZyA9IDA7IEFyZyA8ICpOdW1Bcmd1bWVudHNJbkV4cGFuc2lvbjsgKytBcmcpIHsKICAgICAgIFBhcm1WYXJEZWNsICpGdW5jdGlvblBhcmFtID0gRnVuY3Rpb24tPmdldFBhcmFtRGVjbChGUGFyYW1JZHgpOworICAgICAgaWYgKCFQYXR0ZXJuRGVjbC0+Z2V0VHlwZSgpLT5pc0RlcGVuZGVudFR5cGUoKSkKKyAgICAgICAgRnVuY3Rpb25QYXJhbS0+c2V0VHlwZShQYXR0ZXJuUGFyYW0tPmdldFR5cGUoKSk7CisKICAgICAgIEZ1bmN0aW9uUGFyYW0tPnNldERlY2xOYW1lKFBhdHRlcm5QYXJhbS0+Z2V0RGVjbE5hbWUoKSk7CiAgICAgICBTY29wZS5JbnN0YW50aWF0ZWRMb2NhbFBhY2tBcmcoUGF0dGVyblBhcmFtLCBGdW5jdGlvblBhcmFtKTsKICAgICAgICsrRlBhcmFtSWR4OwpAQCAtMzEwMiwxOSArMzEzMiwxMyBAQAogICAgIH0KICAgfQogCi0gIC8vIFJlYnVpbGQgdGhlIGZ1bmN0aW9uIHR5cGUKLSAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKk5ld1Byb3RvCi0gICAgPSBOZXctPmdldFR5cGUoKS0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCk7Ci0gIGFzc2VydChOZXdQcm90byAmJiAiVGVtcGxhdGUgaW5zdGFudGlhdGlvbiB3aXRob3V0IGZ1bmN0aW9uIHByb3RvdHlwZT8iKTsKLQotICBGdW5jdGlvblByb3RvVHlwZTo6RXh0UHJvdG9JbmZvIEVQSSA9IE5ld1Byb3RvLT5nZXRFeHRQcm90b0luZm8oKTsKKyAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyBFUEk7CiAgIEVQSS5FeGNlcHRpb25TcGVjVHlwZSA9IFByb3RvLT5nZXRFeGNlcHRpb25TcGVjVHlwZSgpOwogICBFUEkuTnVtRXhjZXB0aW9ucyA9IEV4Y2VwdGlvbnMuc2l6ZSgpOwogICBFUEkuRXhjZXB0aW9ucyA9IEV4Y2VwdGlvbnMuZGF0YSgpOwogICBFUEkuTm9leGNlcHRFeHByID0gTm9leGNlcHRFeHByOwogCi0gIE5ldy0+c2V0VHlwZShTZW1hUmVmLkNvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKE5ld1Byb3RvLT5nZXRSZXN1bHRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1Byb3RvLT5nZXRBcmdUeXBlcygpLCBFUEkpKTsKKyAgU2VtYVJlZi5VcGRhdGVFeGNlcHRpb25TcGVjKE5ldywgRVBJKTsKIH0KIAogdm9pZCBTZW1hOjpJbnN0YW50aWF0ZUV4Y2VwdGlvblNwZWMoU291cmNlTG9jYXRpb24gUG9pbnRPZkluc3RhbnRpYXRpb24sCkBAIC0zMTI4LDEwICszMTUyLDkgQEAKICAgaWYgKEluc3QuaXNJbnZhbGlkKCkpIHsKICAgICAvLyBXZSBoaXQgdGhlIGluc3RhbnRpYXRpb24gZGVwdGggbGltaXQuIENsZWFyIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbgogICAgIC8vIHNvIHRoYXQgb3VyIGNhbGxlcnMgZG9uJ3QgaGF2ZSB0byBjb3BlIHdpdGggRVNUX1VuaW5zdGFudGlhdGVkLgotICAgIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gRVBJID0gUHJvdG8tPmdldEV4dFByb3RvSW5mbygpOworICAgIEZ1bmN0aW9uUHJvdG9UeXBlOjpFeHRQcm90b0luZm8gRVBJOwogICAgIEVQSS5FeGNlcHRpb25TcGVjVHlwZSA9IEVTVF9Ob25lOwotICAgIERlY2wtPnNldFR5cGUoQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoUHJvdG8tPmdldFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvLT5nZXRBcmdUeXBlcygpLCBFUEkpKTsKKyAgICBVcGRhdGVFeGNlcHRpb25TcGVjKERlY2wsIEVQSSk7CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTMxNjEsNiArMzE4NCwxMCBAQAogICBpZiAoVG1wbC0+aXNEZWxldGVkKCkpCiAgICAgTmV3LT5zZXREZWxldGVkQXNXcml0dGVuKCk7CiAKKyAgLy8gRm9yd2FyZCB0aGUgbWFuZ2xpbmcgbnVtYmVyIGZyb20gdGhlIHRlbXBsYXRlIHRvIHRoZSBpbnN0YW50aWF0ZWQgZGVjbC4KKyAgU2VtYVJlZi5Db250ZXh0LnNldE1hbmdsaW5nTnVtYmVyKE5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFSZWYuQ29udGV4dC5nZXRNYW5nbGluZ051bWJlcihUbXBsKSk7CisKICAgLy8gSWYgd2UgYXJlIHBlcmZvcm1pbmcgc3Vic3RpdHV0aW5nIGV4cGxpY2l0bHktc3BlY2lmaWVkIHRlbXBsYXRlIGFyZ3VtZW50cwogICAvLyBvciBkZWR1Y2VkIHRlbXBsYXRlIGFyZ3VtZW50cyBpbnRvIGEgZnVuY3Rpb24gdGVtcGxhdGUgYW5kIHdlIHJlYWNoIHRoaXMKICAgLy8gcG9pbnQsIHdlIGFyZSBub3cgcGFzdCB0aGUgcG9pbnQgd2hlcmUgU0ZJTkFFIGFwcGxpZXMgYW5kIGhhdmUgY29tbWl0dGVkCkBAIC0zMjExLDcgKzMyMzgsNyBAQAogICAgICAgRVBJLkV4Y2VwdGlvblNwZWNEZWNsID0gTmV3OwogICAgICAgRVBJLkV4Y2VwdGlvblNwZWNUZW1wbGF0ZSA9IEV4Y2VwdGlvblNwZWNUZW1wbGF0ZTsKICAgICAgIE5ldy0+c2V0VHlwZShTZW1hUmVmLkNvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKAotICAgICAgICAgIE5ld1Byb3RvLT5nZXRSZXN1bHRUeXBlKCksIE5ld1Byb3RvLT5nZXRBcmdUeXBlcygpLCBFUEkpKTsKKyAgICAgICAgICBOZXdQcm90by0+Z2V0UmV0dXJuVHlwZSgpLCBOZXdQcm90by0+Z2V0UGFyYW1UeXBlcygpLCBFUEkpKTsKICAgICB9IGVsc2UgewogICAgICAgOjpJbnN0YW50aWF0ZUV4Y2VwdGlvblNwZWMoU2VtYVJlZiwgTmV3LCBQcm90bywgVGVtcGxhdGVBcmdzKTsKICAgICB9CkBAIC0zMzM5LDEwICszMzY2LDEwIEBACiAgIC8vICAgaW5pdGlhbGl6ZXIgb3IgcmV0dXJuIHZhbHVlLCBhbmQgY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zLCBvdGhlcgogICAvLyAgIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gZGVjbGFyYXRpb25zIGhhdmUgdGhlIGVmZmVjdCBvZiBzdXBwcmVzc2luZyB0aGUKICAgLy8gICBpbXBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIHRoZSBlbnRpdHkgdG8gd2hpY2ggdGhleSByZWZlci4KLSAgaWYgKEZ1bmN0aW9uLT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpCi0gICAgICAgID09IFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWNsYXJhdGlvbiAmJgorICBpZiAoRnVuY3Rpb24tPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkgPT0KKyAgICAgICAgICBUU0tfRXhwbGljaXRJbnN0YW50aWF0aW9uRGVjbGFyYXRpb24gJiYKICAgICAgICFQYXR0ZXJuRGVjbC0+aXNJbmxpbmVkKCkgJiYKLSAgICAgICFQYXR0ZXJuRGVjbC0+Z2V0UmVzdWx0VHlwZSgpLT5nZXRDb250YWluZWRBdXRvVHlwZSgpKQorICAgICAgIVBhdHRlcm5EZWNsLT5nZXRSZXR1cm5UeXBlKCktPmdldENvbnRhaW5lZEF1dG9UeXBlKCkpCiAgICAgcmV0dXJuOwogCiAgIGlmIChQYXR0ZXJuRGVjbC0+aXNJbmxpbmVkKCkpCkBAIC0zNDEzLDYgKzM0NDAsOSBAQAogCiAgICAgUGVyZm9ybURlcGVuZGVudERpYWdub3N0aWNzKFBhdHRlcm5EZWNsLCBUZW1wbGF0ZUFyZ3MpOwogCisgICAgaWYgKGF1dG8gKkxpc3RlbmVyID0gZ2V0QVNUTXV0YXRpb25MaXN0ZW5lcigpKQorICAgICAgTGlzdGVuZXItPkZ1bmN0aW9uRGVmaW5pdGlvbkluc3RhbnRpYXRlZChGdW5jdGlvbik7CisKICAgICBzYXZlZENvbnRleHQucG9wKCk7CiAgIH0KIApAQCAtMzQ2Nyw3ICszNDk3LDE4IEBACiAgIC8vIG9yIG1heSBub3QgYmUgdGhlIGRlY2xhcmF0aW9uIGluIHRoZSBjbGFzczsgaWYgaXQncyBpbiB0aGUgY2xhc3MsIHdlIHdhbnQKICAgLy8gdG8gaW5zdGFudGlhdGUgYSBtZW1iZXIgaW4gdGhlIGNsYXNzIChhIGRlY2xhcmF0aW9uKSwgYW5kIGlmIGl0J3Mgb3V0c2lkZSwKICAgLy8gd2Ugd2FudCB0byBpbnN0YW50aWF0ZSBhIGRlZmluaXRpb24uCi0gIEZyb21WYXIgPSBGcm9tVmFyLT5nZXRGaXJzdERlY2woKTsKKyAgLy8KKyAgLy8gSWYgd2UncmUgaW5zdGFudGlhdGluZyBhbiBleHBsaWNpdGx5LXNwZWNpYWxpemVkIG1lbWJlciB0ZW1wbGF0ZSBvciBtZW1iZXIKKyAgLy8gcGFydGlhbCBzcGVjaWFsaXphdGlvbiwgZG9uJ3QgZG8gdGhpcy4gVGhlIG1lbWJlciBzcGVjaWFsaXphdGlvbiBjb21wbGV0ZWx5CisgIC8vIHJlcGxhY2VzIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBpbiB0aGlzIGNhc2UuCisgIGJvb2wgSXNNZW1iZXJTcGVjID0gZmFsc2U7CisgIGlmIChWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wgKlBhcnRpYWxTcGVjID0KKyAgICAgICAgICBkeW5fY2FzdDxWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2w+KEZyb21WYXIpKQorICAgIElzTWVtYmVyU3BlYyA9IFBhcnRpYWxTcGVjLT5pc01lbWJlclNwZWNpYWxpemF0aW9uKCk7CisgIGVsc2UgaWYgKFZhclRlbXBsYXRlRGVjbCAqRnJvbVRlbXBsYXRlID0gRnJvbVZhci0+Z2V0RGVzY3JpYmVkVmFyVGVtcGxhdGUoKSkKKyAgICBJc01lbWJlclNwZWMgPSBGcm9tVGVtcGxhdGUtPmlzTWVtYmVyU3BlY2lhbGl6YXRpb24oKTsKKyAgaWYgKCFJc01lbWJlclNwZWMpCisgICAgRnJvbVZhciA9IEZyb21WYXItPmdldEZpcnN0RGVjbCgpOwogCiAgIE11bHRpTGV2ZWxUZW1wbGF0ZUFyZ3VtZW50TGlzdCBNdWx0aUxldmVsTGlzdChUZW1wbGF0ZUFyZ0xpc3QpOwogICBUZW1wbGF0ZURlY2xJbnN0YW50aWF0b3IgSW5zdGFudGlhdG9yKCp0aGlzLCBGcm9tVmFyLT5nZXREZWNsQ29udGV4dCgpLApAQCAtMzU1MiwxNiArMzU5MywxNSBAQAogCiAgIEluc3RhbnRpYXRlQXR0cnMoVGVtcGxhdGVBcmdzLCBPbGRWYXIsIE5ld1ZhciwgTGF0ZUF0dHJzLCBTdGFydGluZ1Njb3BlKTsKIAotICBpZiAoTmV3VmFyLT5oYXNBdHRycygpKQotICAgIENoZWNrQWxpZ25hc1VuZGVyYWxpZ25tZW50KE5ld1Zhcik7Ci0KICAgTG9va3VwUmVzdWx0IFByZXZpb3VzKAogICAgICAgKnRoaXMsIE5ld1Zhci0+Z2V0RGVjbE5hbWUoKSwgTmV3VmFyLT5nZXRMb2NhdGlvbigpLAogICAgICAgTmV3VmFyLT5pc0xvY2FsRXh0ZXJuRGVjbCgpID8gU2VtYTo6TG9va3VwUmVkZWNsYXJhdGlvbldpdGhMaW5rYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTZW1hOjpMb29rdXBPcmRpbmFyeU5hbWUsCiAgICAgICBTZW1hOjpGb3JSZWRlY2xhcmF0aW9uKTsKIAotICBpZiAoTmV3VmFyLT5pc0xvY2FsRXh0ZXJuRGVjbCgpICYmIE9sZFZhci0+Z2V0UHJldmlvdXNEZWNsKCkpIHsKKyAgaWYgKE5ld1Zhci0+aXNMb2NhbEV4dGVybkRlY2woKSAmJiBPbGRWYXItPmdldFByZXZpb3VzRGVjbCgpICYmCisgICAgICAoIU9sZFZhci0+Z2V0UHJldmlvdXNEZWNsKCktPmdldERlY2xDb250ZXh0KCktPmlzRGVwZW5kZW50Q29udGV4dCgpIHx8CisgICAgICAgT2xkVmFyLT5nZXRQcmV2aW91c0RlY2woKS0+Z2V0RGVjbENvbnRleHQoKT09T2xkVmFyLT5nZXREZWNsQ29udGV4dCgpKSkgewogICAgIC8vIFdlIGhhdmUgYSBwcmV2aW91cyBkZWNsYXJhdGlvbi4gVXNlIHRoYXQgb25lLCBzbyB3ZSBtZXJnZSB3aXRoIHRoZQogICAgIC8vIHJpZ2h0IHR5cGUuCiAgICAgaWYgKE5hbWVkRGVjbCAqTmV3UHJldiA9IEZpbmRJbnN0YW50aWF0ZWREZWNsKApAQCAtMzU4OSw5ICszNjI5LDE2IEBACiAgICAgTmV3VmFyLT5zZXRJbnN0YW50aWF0aW9uT2ZTdGF0aWNEYXRhTWVtYmVyKE9sZFZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbik7CiAKKyAgLy8gRm9yd2FyZCB0aGUgbWFuZ2xpbmcgbnVtYmVyIGZyb20gdGhlIHRlbXBsYXRlIHRvIHRoZSBpbnN0YW50aWF0ZWQgZGVjbC4KKyAgQ29udGV4dC5zZXRNYW5nbGluZ051bWJlcihOZXdWYXIsIENvbnRleHQuZ2V0TWFuZ2xpbmdOdW1iZXIoT2xkVmFyKSk7CisgIENvbnRleHQuc2V0U3RhdGljTG9jYWxOdW1iZXIoTmV3VmFyLCBDb250ZXh0LmdldFN0YXRpY0xvY2FsTnVtYmVyKE9sZFZhcikpOworCiAgIC8vIERlbGF5IGluc3RhbnRpYXRpb24gb2YgdGhlIGluaXRpYWxpemVyIGZvciB2YXJpYWJsZSB0ZW1wbGF0ZXMgdW50aWwgYQotICAvLyBkZWZpbml0aW9uIG9mIHRoZSB2YXJpYWJsZSBpcyBuZWVkZWQuCi0gIGlmICghaXNhPFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsPihOZXdWYXIpICYmICFJbnN0YW50aWF0aW5nVmFyVGVtcGxhdGUpCisgIC8vIGRlZmluaXRpb24gb2YgdGhlIHZhcmlhYmxlIGlzIG5lZWRlZC4gV2UgbmVlZCBpdCByaWdodCBhd2F5IGlmIHRoZSB0eXBlCisgIC8vIGNvbnRhaW5zICdhdXRvJy4KKyAgaWYgKCghaXNhPFZhclRlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsPihOZXdWYXIpICYmCisgICAgICAgIUluc3RhbnRpYXRpbmdWYXJUZW1wbGF0ZSkgfHwKKyAgICAgIE5ld1Zhci0+Z2V0VHlwZSgpLT5pc1VuZGVkdWNlZFR5cGUoKSkKICAgICBJbnN0YW50aWF0ZVZhcmlhYmxlSW5pdGlhbGl6ZXIoTmV3VmFyLCBPbGRWYXIsIFRlbXBsYXRlQXJncyk7CiAKICAgLy8gRGlhZ25vc2UgdW51c2VkIGxvY2FsIHZhcmlhYmxlcyB3aXRoIGRlcGVuZGVudCB0eXBlcywgd2hlcmUgdGhlIGRpYWdub3N0aWMKQEAgLTM5NTEsMTEgKzM5OTgsNyBAQAogICBib29sIEFueUVycm9ycyA9IFRtcGwtPmlzSW52YWxpZERlY2woKTsKIAogICAvLyBJbnN0YW50aWF0ZSBhbGwgdGhlIGluaXRpYWxpemVycy4KLSAgZm9yIChDWFhDb25zdHJ1Y3RvckRlY2w6OmluaXRfY29uc3RfaXRlcmF0b3IgSW5pdHMgPSBUbXBsLT5pbml0X2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRzRW5kID0gVG1wbC0+aW5pdF9lbmQoKTsKLSAgICAgICBJbml0cyAhPSBJbml0c0VuZDsgKytJbml0cykgewotICAgIENYWEN0b3JJbml0aWFsaXplciAqSW5pdCA9ICpJbml0czsKLQorICBmb3IgKGNvbnN0IGF1dG8gKkluaXQgOiBUbXBsLT5pbml0cygpKSB7CiAgICAgLy8gT25seSBpbnN0YW50aWF0ZSB3cml0dGVuIGluaXRpYWxpemVycywgbGV0IFNlbWEgcmUtY29uc3RydWN0IGltcGxpY2l0CiAgICAgLy8gb25lcy4KICAgICBpZiAoIUluaXQtPmlzV3JpdHRlbigpKQpAQCAtNDMzOSw3ICs0MzgyLDcgQEAKICAgLy8gZmluZCBhbiBpbnN0YW50aWF0ZWQgZGVjbCBmb3IgKFQgeSkgd2hlbiB0aGUgUGFyZW50REMgZm9yIHkgaXMKICAgLy8gdGhlIHRyYW5zbGF0aW9uIHVuaXQuICAKICAgLy8gICBlLmcuIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIEZvbyhhdXRvICgqcCkoVCB5KSAtPiBkZWNsdHlwZSh5KCkpKSB7fSAKLSAgLy8gICBmbG9hdCBiYXooZmxvYXQoKikoKSkgeyByZXR1cm4gMC4wOyB9DQorICAvLyAgIGZsb2F0IGJheihmbG9hdCgqKSgpKSB7IHJldHVybiAwLjA7IH0KICAgLy8gICBGb28oYmF6KTsKICAgLy8gVGhlIGJldHRlciBmaXggaGVyZSBpcyBwZXJoYXBzIHRvIGVuc3VyZSB0aGF0IGEgUGFybVZhckRlY2wsIGJ5IHRoZSB0aW1lCiAgIC8vIGl0IGdldHMgaGVyZSwgYWx3YXlzIGhhcyBhIEZ1bmN0aW9uT3JNZXRob2QgYXMgaXRzIFBhcmVudERDPz8KQEAgLTQ1NTAsMTQgKzQ1OTMsNiBAQAogLy8vIFxicmllZiBQZXJmb3JtcyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGZvciBhbGwgaW1wbGljaXQgdGVtcGxhdGUKIC8vLyBpbnN0YW50aWF0aW9ucyB3ZSBoYXZlIHNlZW4gdW50aWwgdGhpcyBwb2ludC4KIHZvaWQgU2VtYTo6UGVyZm9ybVBlbmRpbmdJbnN0YW50aWF0aW9ucyhib29sIExvY2FsT25seSkgewotICAvLyBMb2FkIHBlbmRpbmcgaW5zdGFudGlhdGlvbnMgZnJvbSB0aGUgZXh0ZXJuYWwgc291cmNlLgotICBpZiAoIUxvY2FsT25seSAmJiBFeHRlcm5hbFNvdXJjZSkgewotICAgIFNtYWxsVmVjdG9yPFBlbmRpbmdJbXBsaWNpdEluc3RhbnRpYXRpb24sIDQ+IFBlbmRpbmc7Ci0gICAgRXh0ZXJuYWxTb3VyY2UtPlJlYWRQZW5kaW5nSW5zdGFudGlhdGlvbnMoUGVuZGluZyk7Ci0gICAgUGVuZGluZ0luc3RhbnRpYXRpb25zLmluc2VydChQZW5kaW5nSW5zdGFudGlhdGlvbnMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmcuYmVnaW4oKSwgUGVuZGluZy5lbmQoKSk7Ci0gIH0KLQogICB3aGlsZSAoIVBlbmRpbmdMb2NhbEltcGxpY2l0SW5zdGFudGlhdGlvbnMuZW1wdHkoKSB8fAogICAgICAgICAgKCFMb2NhbE9ubHkgJiYgIVBlbmRpbmdJbnN0YW50aWF0aW9ucy5lbXB0eSgpKSkgewogICAgIFBlbmRpbmdJbXBsaWNpdEluc3RhbnRpYXRpb24gSW5zdDsKQEAgLTQ2MjQsMTAgKzQ2NTksNyBAQAogCiB2b2lkIFNlbWE6OlBlcmZvcm1EZXBlbmRlbnREaWFnbm9zdGljcyhjb25zdCBEZWNsQ29udGV4dCAqUGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXVsdGlMZXZlbFRlbXBsYXRlQXJndW1lbnRMaXN0ICZUZW1wbGF0ZUFyZ3MpIHsKLSAgZm9yIChEZWNsQ29udGV4dDo6ZGRpYWdfaXRlcmF0b3IgSSA9IFBhdHRlcm4tPmRkaWFnX2JlZ2luKCksCi0gICAgICAgICBFID0gUGF0dGVybi0+ZGRpYWdfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgRGVwZW5kZW50RGlhZ25vc3RpYyAqREQgPSAqSTsKLQorICBmb3IgKGF1dG8gREQgOiBQYXR0ZXJuLT5kZGlhZ3MoKSkgewogICAgIHN3aXRjaCAoREQtPmdldEtpbmQoKSkgewogICAgIGNhc2UgRGVwZW5kZW50RGlhZ25vc3RpYzo6QWNjZXNzOgogICAgICAgSGFuZGxlRGVwZW5kZW50QWNjZXNzQ2hlY2soKkRELCBUZW1wbGF0ZUFyZ3MpOwpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvU2VtYVRlbXBsYXRlVmFyaWFkaWMuY3BwIGIvbGliL1NlbWEvU2VtYVRlbXBsYXRlVmFyaWFkaWMuY3BwCmluZGV4IDc4YWE3ZjguLmRlODUwZTMgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL1NlbWFUZW1wbGF0ZVZhcmlhZGljLmNwcAorKysgYi9saWIvU2VtYS9TZW1hVGVtcGxhdGVWYXJpYWRpYy5jcHAKQEAgLTEwLDYgKzEwLDcgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8KIAogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2VtYS5oIgorI2luY2x1ZGUgIlR5cGVMb2NCdWlsZGVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvUmVjdXJzaXZlQVNUVmlzaXRvci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jLmgiCkBAIC0xOCw3ICsxOSw2IEBACiAjaW5jbHVkZSAiY2xhbmcvU2VtYS9TY29wZUluZm8uaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWFJbnRlcm5hbC5oIgogI2luY2x1ZGUgImNsYW5nL1NlbWEvVGVtcGxhdGUuaCIKLSNpbmNsdWRlICJUeXBlTG9jQnVpbGRlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiAKQEAgLTU1NCw4ICs1NTQsOCBAQAogICAgICAgaWYgKGlzYTxQYXJtVmFyRGVjbD4oTkQpKQogICAgICAgICBJc0Z1bmN0aW9uUGFyYW1ldGVyUGFjayA9IHRydWU7CiAgICAgICBlbHNlCi0gICAgICAgIGxsdm06OnRpZShEZXB0aCwgSW5kZXgpID0gZ2V0RGVwdGhBbmRJbmRleChORCk7ICAgICAgICAKLSAgICAgIAorICAgICAgICBzdGQ6OnRpZShEZXB0aCwgSW5kZXgpID0gZ2V0RGVwdGhBbmRJbmRleChORCk7CisKICAgICAgIE5hbWUgPSBORC0+Z2V0SWRlbnRpZmllcigpOwogICAgIH0KICAgICAKQEAgLTU5OSw3ICs1OTksNyBAQAogICAgICAgaWYgKE5hbWVkRGVjbCAqUGFydGlhbFBhY2sgCiAgICAgICAgICAgICAgICAgICAgID0gQ3VycmVudEluc3RhbnRpYXRpb25TY29wZS0+Z2V0UGFydGlhbGx5U3Vic3RpdHV0ZWRQYWNrKCkpewogICAgICAgICB1bnNpZ25lZCBQYXJ0aWFsRGVwdGgsIFBhcnRpYWxJbmRleDsKLSAgICAgICAgbGx2bTo6dGllKFBhcnRpYWxEZXB0aCwgUGFydGlhbEluZGV4KSA9IGdldERlcHRoQW5kSW5kZXgoUGFydGlhbFBhY2spOworICAgICAgICBzdGQ6OnRpZShQYXJ0aWFsRGVwdGgsIFBhcnRpYWxJbmRleCkgPSBnZXREZXB0aEFuZEluZGV4KFBhcnRpYWxQYWNrKTsKICAgICAgICAgaWYgKFBhcnRpYWxEZXB0aCA9PSBEZXB0aCAmJiBQYXJ0aWFsSW5kZXggPT0gSW5kZXgpCiAgICAgICAgICAgUmV0YWluRXhwYW5zaW9uID0gdHJ1ZTsKICAgICAgIH0KQEAgLTY2OSw4ICs2NjksOCBAQAogICAgICAgICBSZXN1bHQgPSBTaXplOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KLSAgICAgIAotICAgICAgbGx2bTo6dGllKERlcHRoLCBJbmRleCkgPSBnZXREZXB0aEFuZEluZGV4KE5EKTsgICAgICAgIAorCisgICAgICBzdGQ6OnRpZShEZXB0aCwgSW5kZXgpID0gZ2V0RGVwdGhBbmRJbmRleChORCk7CiAgICAgfQogICAgIGlmIChEZXB0aCA+PSBUZW1wbGF0ZUFyZ3MuZ2V0TnVtTGV2ZWxzKCkgfHwKICAgICAgICAgIVRlbXBsYXRlQXJncy5oYXNUZW1wbGF0ZUFyZ3VtZW50KERlcHRoLCBJbmRleCkpCkBAIC03MzAsMTQgKzczMCw2IEBACiAgIGNhc2UgVFNUX2F1dG86CiAgIGNhc2UgVFNUX2RlY2x0eXBlX2F1dG86CiAgIGNhc2UgVFNUX3Vua25vd25fYW55dHlwZToKLSAgY2FzZSBUU1RfaW1hZ2UxZF90OgotICBjYXNlIFRTVF9pbWFnZTFkX2FycmF5X3Q6Ci0gIGNhc2UgVFNUX2ltYWdlMWRfYnVmZmVyX3Q6Ci0gIGNhc2UgVFNUX2ltYWdlMmRfdDoKLSAgY2FzZSBUU1RfaW1hZ2UyZF9hcnJheV90OgotICBjYXNlIFRTVF9pbWFnZTNkX3Q6Ci0gIGNhc2UgVFNUX3NhbXBsZXJfdDoKLSAgY2FzZSBUU1RfZXZlbnRfdDoKICAgY2FzZSBUU1RfZXJyb3I6CiAgICAgYnJlYWs7CiAgIH0KQEAgLTc3NSw3ICs3NjcsNyBAQAogLy8gQ2FsbGJhY2sgdG8gb25seSBhY2NlcHQgdHlwbyBjb3JyZWN0aW9ucyB0aGF0IHJlZmVyIHRvIHBhcmFtZXRlciBwYWNrcy4KIGNsYXNzIFBhcmFtZXRlclBhY2tWYWxpZGF0b3JDQ0MgOiBwdWJsaWMgQ29ycmVjdGlvbkNhbmRpZGF0ZUNhbGxiYWNrIHsKICBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBWYWxpZGF0ZUNhbmRpZGF0ZShjb25zdCBUeXBvQ29ycmVjdGlvbiAmY2FuZGlkYXRlKSB7CisgIGJvb2wgVmFsaWRhdGVDYW5kaWRhdGUoY29uc3QgVHlwb0NvcnJlY3Rpb24gJmNhbmRpZGF0ZSkgb3ZlcnJpZGUgewogICAgIE5hbWVkRGVjbCAqTkQgPSBjYW5kaWRhdGUuZ2V0Q29ycmVjdGlvbkRlY2woKTsKICAgICByZXR1cm4gTkQgJiYgTkQtPmlzUGFyYW1ldGVyUGFjaygpOwogICB9CmRpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hVHlwZS5jcHAgYi9saWIvU2VtYS9TZW1hVHlwZS5jcHAKaW5kZXggYWE3NDU5ZC4uZTI3M2NiNiAxMDA2NDQKLS0tIGEvbGliL1NlbWEvU2VtYVR5cGUuY3BwCisrKyBiL2xpYi9TZW1hL1NlbWFUeXBlLmNwcApAQCAtMTIsNiArMTIsNyBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2VtYUludGVybmFsLmgiCisjaW5jbHVkZSAiVHlwZUxvY0J1aWxkZXIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29uc3VtZXIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RNdXRhdGlvbkxpc3RlbmVyLmgiCkBAIC0yMSw3ICsyMiw2IEBACiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZUxvYy5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jVmlzaXRvci5oIgotI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5DTC5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1BhcnRpYWxEaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVGFyZ2V0SW5mby5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKLSNpbmNsdWRlICJUeXBlTG9jQnVpbGRlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CiAKQEAgLTcyOCwxMyArNzI3LDE1IEBACiAgICAgICBSZXN1bHQgPSBDb250ZXh0LldDaGFyVHk7CiAgICAgZWxzZSBpZiAoRFMuZ2V0VHlwZVNwZWNTaWduKCkgPT0gRGVjbFNwZWM6OlRTU19zaWduZWQpIHsKICAgICAgIFMuRGlhZyhEUy5nZXRUeXBlU3BlY1NpZ25Mb2MoKSwgZGlhZzo6ZXh0X2ludmFsaWRfc2lnbl9zcGVjKQotICAgICAgICA8PCBEUy5nZXRTcGVjaWZpZXJOYW1lKERTLmdldFR5cGVTcGVjVHlwZSgpKTsKKyAgICAgICAgPDwgRFMuZ2V0U3BlY2lmaWVyTmFtZShEUy5nZXRUeXBlU3BlY1R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LmdldFByaW50aW5nUG9saWN5KCkpOwogICAgICAgUmVzdWx0ID0gQ29udGV4dC5nZXRTaWduZWRXQ2hhclR5cGUoKTsKICAgICB9IGVsc2UgewogICAgICAgYXNzZXJ0KERTLmdldFR5cGVTcGVjU2lnbigpID09IERlY2xTcGVjOjpUU1NfdW5zaWduZWQgJiYKICAgICAgICAgIlVua25vd24gVFNTIHZhbHVlIik7CiAgICAgICBTLkRpYWcoRFMuZ2V0VHlwZVNwZWNTaWduTG9jKCksIGRpYWc6OmV4dF9pbnZhbGlkX3NpZ25fc3BlYykKLSAgICAgICAgPDwgRFMuZ2V0U3BlY2lmaWVyTmFtZShEUy5nZXRUeXBlU3BlY1R5cGUoKSk7CisgICAgICAgIDw8IERTLmdldFNwZWNpZmllck5hbWUoRFMuZ2V0VHlwZVNwZWNUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5nZXRQcmludGluZ1BvbGljeSgpKTsKICAgICAgIFJlc3VsdCA9IENvbnRleHQuZ2V0VW5zaWduZWRXQ2hhclR5cGUoKTsKICAgICB9CiAgICAgYnJlYWs7CkBAIC0xMDU4LDM4ICsxMDU5LDYgQEAKICAgICB9CiAgICAgYnJlYWs7CiAKLSAgY2FzZSBEZWNsU3BlYzo6VFNUX2ltYWdlMWRfdDoKLSAgICBSZXN1bHQgPSBDb250ZXh0Lk9DTEltYWdlMWRUeTsKLSAgICBicmVhazsKLQotICBjYXNlIERlY2xTcGVjOjpUU1RfaW1hZ2UxZF9hcnJheV90OgotICAgIFJlc3VsdCA9IENvbnRleHQuT0NMSW1hZ2UxZEFycmF5VHk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBEZWNsU3BlYzo6VFNUX2ltYWdlMWRfYnVmZmVyX3Q6Ci0gICAgUmVzdWx0ID0gQ29udGV4dC5PQ0xJbWFnZTFkQnVmZmVyVHk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBEZWNsU3BlYzo6VFNUX2ltYWdlMmRfdDoKLSAgICBSZXN1bHQgPSBDb250ZXh0Lk9DTEltYWdlMmRUeTsKLSAgICBicmVhazsKLQotICBjYXNlIERlY2xTcGVjOjpUU1RfaW1hZ2UyZF9hcnJheV90OgotICAgIFJlc3VsdCA9IENvbnRleHQuT0NMSW1hZ2UyZEFycmF5VHk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBEZWNsU3BlYzo6VFNUX2ltYWdlM2RfdDoKLSAgICBSZXN1bHQgPSBDb250ZXh0Lk9DTEltYWdlM2RUeTsKLSAgICBicmVhazsKLQotICBjYXNlIERlY2xTcGVjOjpUU1Rfc2FtcGxlcl90OgotICAgIFJlc3VsdCA9IENvbnRleHQuT0NMU2FtcGxlclR5OwotICAgIGJyZWFrOwotCi0gIGNhc2UgRGVjbFNwZWM6OlRTVF9ldmVudF90OgotICAgIFJlc3VsdCA9IENvbnRleHQuT0NMRXZlbnRUeTsKLSAgICBicmVhazsKLQogICBjYXNlIERlY2xTcGVjOjpUU1RfZXJyb3I6CiAgICAgUmVzdWx0ID0gQ29udGV4dC5JbnRUeTsKICAgICBkZWNsYXJhdG9yLnNldEludmFsaWRUeXBlKHRydWUpOwpAQCAtMTE0OCwxNyArMTExNywzMyBAQAogICAgICAgfQogICAgIH0KIAotICAgIC8vIEMrKyBbZGNsLnJlZl1wMToKKyAgICAvLyBDKysxMSBbZGNsLnJlZl1wMToKICAgICAvLyAgIEN2LXF1YWxpZmllZCByZWZlcmVuY2VzIGFyZSBpbGwtZm9ybWVkIGV4Y2VwdCB3aGVuIHRoZQotICAgIC8vICAgY3YtcXVhbGlmaWVycyBhcmUgaW50cm9kdWNlZCB0aHJvdWdoIHRoZSB1c2Ugb2YgYSB0eXBlZGVmCi0gICAgLy8gICAoNy4xLjMpIG9yIG9mIGEgdGVtcGxhdGUgdHlwZSBhcmd1bWVudCAoMTQuMyksIGluIHdoaWNoCi0gICAgLy8gICBjYXNlIHRoZSBjdi1xdWFsaWZpZXJzIGFyZSBpZ25vcmVkLgotICAgIC8vIEZJWE1FOiBTaG91bGRuJ3Qgd2UgYmUgY2hlY2tpbmcgU0NTX3R5cGVkZWYgaGVyZT8KKyAgICAvLyAgIGN2LXF1YWxpZmllcnMgYXJlIGludHJvZHVjZWQgdGhyb3VnaCB0aGUgdXNlIG9mIGEgdHlwZWRlZi1uYW1lCisgICAgLy8gICBvciBkZWNsdHlwZS1zcGVjaWZpZXIsIGluIHdoaWNoIGNhc2UgdGhlIGN2LXF1YWxpZmllcnMgYXJlIGlnbm9yZWQuCisgICAgLy8KKyAgICAvLyBUaGVyZSBkb24ndCBhcHBlYXIgdG8gYmUgYW55IG90aGVyIGNvbnRleHRzIGluIHdoaWNoIGEgY3YtcXVhbGlmaWVkCisgICAgLy8gcmVmZXJlbmNlIHR5cGUgY291bGQgYmUgZm9ybWVkLCBzbyB0aGUgJ2lsbC1mb3JtZWQnIGNsYXVzZSBoZXJlIGFwcGVhcnMKKyAgICAvLyB0byBuZXZlciBoYXBwZW4uCiAgICAgaWYgKERTLmdldFR5cGVTcGVjVHlwZSgpID09IERlY2xTcGVjOjpUU1RfdHlwZW5hbWUgJiYKICAgICAgICAgVHlwZVF1YWxzICYmIFJlc3VsdC0+aXNSZWZlcmVuY2VUeXBlKCkpIHsKLSAgICAgIFR5cGVRdWFscyAmPSB+RGVjbFNwZWM6OlRRX2NvbnN0OwotICAgICAgVHlwZVF1YWxzICY9IH5EZWNsU3BlYzo6VFFfdm9sYXRpbGU7Ci0gICAgICBUeXBlUXVhbHMgJj0gfkRlY2xTcGVjOjpUUV9hdG9taWM7CisgICAgICAvLyBJZiB0aGlzIG9jY3VycyBvdXRzaWRlIGEgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiwgd2FybiB0aGUgdXNlciBhYm91dAorICAgICAgLy8gaXQ7IHRoZXkgcHJvYmFibHkgZGlkbid0IG1lYW4gdG8gc3BlY2lmeSBhIHJlZHVuZGFudCBxdWFsaWZpZXIuCisgICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxEZWNsU3BlYzo6VFEsIFNvdXJjZUxvY2F0aW9uPiBRdWFsTG9jOworICAgICAgUXVhbExvYyBRdWFsc1tdID0geworICAgICAgICBRdWFsTG9jKERlY2xTcGVjOjpUUV9jb25zdCwgRFMuZ2V0Q29uc3RTcGVjTG9jKCkpLAorICAgICAgICBRdWFsTG9jKERlY2xTcGVjOjpUUV92b2xhdGlsZSwgRFMuZ2V0Vm9sYXRpbGVTcGVjTG9jKCkpLAorICAgICAgICBRdWFsTG9jKERlY2xTcGVjOjpUUV9hdG9taWMsIERTLmdldEF0b21pY1NwZWNMb2MoKSkKKyAgICAgIH07CisgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gbGx2bTo6YXJyYXlfbGVuZ3Rob2YoUXVhbHMpOyBJICE9IE47ICsrSSkgeworICAgICAgICBpZiAoUy5BY3RpdmVUZW1wbGF0ZUluc3RhbnRpYXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgICBpZiAoVHlwZVF1YWxzICYgUXVhbHNbSV0uZmlyc3QpCisgICAgICAgICAgICBTLkRpYWcoUXVhbHNbSV0uc2Vjb25kLCBkaWFnOjp3YXJuX3R5cGVjaGVja19yZWZlcmVuY2VfcXVhbGlmaWVycykKKyAgICAgICAgICAgICAgPDwgRGVjbFNwZWM6OmdldFNwZWNpZmllck5hbWUoUXVhbHNbSV0uZmlyc3QpIDw8IFJlc3VsdAorICAgICAgICAgICAgICA8PCBGaXhJdEhpbnQ6OkNyZWF0ZVJlbW92YWwoUXVhbHNbSV0uc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICBUeXBlUXVhbHMgJj0gflF1YWxzW0ldLmZpcnN0OworICAgICAgfQogICAgIH0KIAogICAgIC8vIEM5MCA2LjUuMyBjb25zdHJhaW50czogIlRoZSBzYW1lIHR5cGUgcXVhbGlmaWVyIHNoYWxsIG5vdCBhcHBlYXIgbW9yZQpAQCAtMTQyNywxMCArMTQxMiwxMCBAQAogICBwdWJsaWM6CiAgICAgVkxBRGlhZ25vc2VyKCkgOiBTZW1hOjpWZXJpZnlJQ0VEaWFnbm9zZXIodHJ1ZSkge30KIAotICAgIHZpcnR1YWwgdm9pZCBkaWFnbm9zZU5vdElDRShTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIFNSKSB7CisgICAgdm9pZCBkaWFnbm9zZU5vdElDRShTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIFNSKSBvdmVycmlkZSB7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGRpYWdub3NlRm9sZChTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFNvdXJjZVJhbmdlIFNSKSB7CisgICAgdm9pZCBkaWFnbm9zZUZvbGQoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBTb3VyY2VSYW5nZSBTUikgb3ZlcnJpZGUgewogICAgICAgUy5EaWFnKExvYywgZGlhZzo6ZXh0X3ZsYV9mb2xkZWRfdG9fY29uc3RhbnQpIDw8IFNSOwogICAgIH0KICAgfSBEaWFnbm9zZXI7CkBAIC0xNDg3LDYgKzE0NzIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnOjplcnJfYXJyYXlfb2ZfYWJzdHJhY3RfdHlwZSkpCiAgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKIAorICAgIC8vIE1lbnRpb25pbmcgYSBtZW1iZXIgcG9pbnRlciB0eXBlIGZvciBhbiBhcnJheSB0eXBlIGNhdXNlcyB1cyB0byBsb2NrIGluCisgICAgLy8gYW4gaW5oZXJpdGFuY2UgbW9kZWwsIGV2ZW4gaWYgaXQncyBpbnNpZGUgYW4gdW51c2VkIHR5cGVkZWYuCisgICAgaWYgKENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldENYWEFCSSgpLmlzTWljcm9zb2Z0KCkpCisgICAgICBpZiAoY29uc3QgTWVtYmVyUG9pbnRlclR5cGUgKk1QVHkgPSBULT5nZXRBczxNZW1iZXJQb2ludGVyVHlwZT4oKSkKKyAgICAgICAgaWYgKCFNUFR5LT5nZXRDbGFzcygpLT5pc0RlcGVuZGVudFR5cGUoKSkKKyAgICAgICAgICBSZXF1aXJlQ29tcGxldGVUeXBlKExvYywgVCwgMCk7CisKICAgfSBlbHNlIHsKICAgICAvLyBDOTkgNi43LjUuMnAxOiBJZiB0aGUgZWxlbWVudCB0eXBlIGlzIGFuIGluY29tcGxldGUgb3IgZnVuY3Rpb24gdHlwZSwKICAgICAvLyByZWplY3QgaXQgKGUuZy4gdm9pZCBhcnlbN10sIHN0cnVjdCBmb28gYXJ5WzddLCB2b2lkIGFyeVs3XSgpKQpAQCAtMTYxNCw2ICsxNjA2LDcgQEAKICAgICAgIC8vIFByb2hpYml0IHRoZSB1c2Ugb2Ygbm9uLVBPRCB0eXBlcyBpbiBWTEFzLgogICAgICAgUXVhbFR5cGUgQmFzZVQgPSBDb250ZXh0LmdldEJhc2VFbGVtZW50VHlwZShUKTsKICAgICAgIGlmICghVC0+aXNEZXBlbmRlbnRUeXBlKCkgJiYKKyAgICAgICAgICAhUmVxdWlyZUNvbXBsZXRlVHlwZShMb2MsIEJhc2VULCAwKSAmJgogICAgICAgICAgICFCYXNlVC5pc1BPRFR5cGUoQ29udGV4dCkgJiYKICAgICAgICAgICAhQmFzZVQtPmlzT2JqQ0xpZmV0aW1lVHlwZSgpKSB7CiAgICAgICAgIERpYWcoTG9jLCBkaWFnOjplcnJfdmxhX25vbl9wb2QpCkBAIC0xNzY5LDEzICsxNzYyLDEzIEBACiAgIC8vICAgd2l0aCByZWZlcmVuY2UgdHlwZSwgb3IgImN2IHZvaWQuIgogICBpZiAoVC0+aXNSZWZlcmVuY2VUeXBlKCkpIHsKICAgICBEaWFnKExvYywgZGlhZzo6ZXJyX2lsbGVnYWxfZGVjbF9tZW1wb2ludGVyX3RvX3JlZmVyZW5jZSkKLSAgICAgIDw8IChFbnRpdHk/IEVudGl0eS5nZXRBc1N0cmluZygpIDogInR5cGUgbmFtZSIpIDw8IFQ7CisgICAgICA8PCBnZXRQcmludGFibGVOYW1lRm9yRW50aXR5KEVudGl0eSkgPDwgVDsKICAgICByZXR1cm4gUXVhbFR5cGUoKTsKICAgfQogCiAgIGlmIChULT5pc1ZvaWRUeXBlKCkpIHsKICAgICBEaWFnKExvYywgZGlhZzo6ZXJyX2lsbGVnYWxfZGVjbF9tZW1wb2ludGVyX3RvX3ZvaWQpCi0gICAgICA8PCAoRW50aXR5PyBFbnRpdHkuZ2V0QXNTdHJpbmcoKSA6ICJ0eXBlIG5hbWUiKTsKKyAgICAgIDw8IGdldFByaW50YWJsZU5hbWVGb3JFbnRpdHkoRW50aXR5KTsKICAgICByZXR1cm4gUXVhbFR5cGUoKTsKICAgfQogCkBAIC0xNzg0LDM1ICsxNzc3LDEwIEBACiAgICAgcmV0dXJuIFF1YWxUeXBlKCk7CiAgIH0KIAotICAvLyBDKysgYWxsb3dzIHRoZSBjbGFzcyB0eXBlIGluIGEgbWVtYmVyIHBvaW50ZXIgdG8gYmUgYW4gaW5jb21wbGV0ZSB0eXBlLgotICAvLyBJbiB0aGUgTWljcm9zb2Z0IEFCSSwgdGhlIHNpemUgb2YgdGhlIG1lbWJlciBwb2ludGVyIGNhbiB2YXJ5Ci0gIC8vIGFjY29yZGluZyB0byB0aGUgY2xhc3MgdHlwZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSByZWFsbHkgbmVlZCBhCi0gIC8vIGNvbXBsZXRlIHR5cGUgaWYgcG9zc2libGUsIHdoaWNoIG1lYW5zIHdlIG5lZWQgdG8gaW5zdGFudGlhdGUgdGVtcGxhdGVzLgotICAvLwotICAvLyBJZiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGZhaWxzIG9yIHRoZSB0eXBlIGlzIGp1c3QgaW5jb21wbGV0ZSwgd2UgaGF2ZSB0bwotICAvLyBhZGQgYW4gZXh0cmEgc2xvdCB0byB0aGUgbWVtYmVyIHBvaW50ZXIuICBZZXMsIHRoaXMgZG9lcyBjYXVzZSBwcm9ibGVtcwotICAvLyB3aGVuIHBhc3NpbmcgcG9pbnRlcnMgYmV0d2VlbiBUVXMgdGhhdCBkaXNhZ3JlZSBhYm91dCB0aGUgc2l6ZS4KLSAgaWYgKENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldENYWEFCSSgpLmlzTWljcm9zb2Z0KCkpIHsKLSAgICBDWFhSZWNvcmREZWNsICpSRCA9IENsYXNzLT5nZXRBc0NYWFJlY29yZERlY2woKTsKLSAgICBpZiAoUkQgJiYgIVJELT5oYXNBdHRyPE1TSW5oZXJpdGFuY2VBdHRyPigpKSB7Ci0gICAgICAvLyBMb2NrIGluIHRoZSBpbmhlcml0YW5jZSBtb2RlbCBvbiB0aGUgZmlyc3QgdXNlIG9mIGEgbWVtYmVyIHBvaW50ZXIuCi0gICAgICAvLyBPdGhlcndpc2Ugd2UgbWF5IGRpc2FncmVlIGFib3V0IHRoZSBzaXplIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGhlIFRVLgotICAgICAgLy8gRklYTUU6IE1TVkMgcGlja3MgYSBtb2RlbCBvbiB0aGUgZmlyc3QgdXNlIHRoYXQgbmVlZHMgdG8ga25vdyB0aGUgc2l6ZSwKLSAgICAgIC8vIHJhdGhlciB0aGFuIG9uIHRoZSBmaXJzdCBtZW50aW9uIG9mIHRoZSB0eXBlLCBlLmcuIHR5cGVkZWZzLgotICAgICAgaWYgKFJlcXVpcmVDb21wbGV0ZVR5cGUoTG9jLCBDbGFzcywgMCkgJiYgIVJELT5pc0JlaW5nRGVmaW5lZCgpKSB7Ci0gICAgICAgIC8vIFdlIGtub3cgaXQgZG9lc24ndCBoYXZlIGFuIGF0dHJpYnV0ZSBhbmQgaXQncyBpbmNvbXBsZXRlLCBzbyB1c2UgdGhlCi0gICAgICAgIC8vIHVuc3BlY2lmaWVkIGluaGVyaXRhbmNlIG1vZGVsLiAgSWYgd2UncmUgaW4gdGhlIHJlY29yZCBib2R5LCB3ZSBjYW4KLSAgICAgICAgLy8gZmlndXJlIG91dCB0aGUgaW5oZXJpdGFuY2UgbW9kZWwuCi0gICAgICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6cmVkZWNsX2l0ZXJhdG9yIEkgPSBSRC0+cmVkZWNsc19iZWdpbigpLAotICAgICAgICAgICAgIEUgPSBSRC0+cmVkZWNsc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgICAgICBJLT5hZGRBdHRyKDo6bmV3IChDb250ZXh0KSBVbnNwZWNpZmllZEluaGVyaXRhbmNlQXR0cigKLSAgICAgICAgICAgICAgUkQtPmdldFNvdXJjZVJhbmdlKCksIENvbnRleHQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIEZJWE1FOiBBZGp1c3QgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIgY2FsbGluZyBjb252ZW50aW9ucy4KKyAgLy8gQWRqdXN0IHRoZSBkZWZhdWx0IGZyZWUgZnVuY3Rpb24gY2FsbGluZyBjb252ZW50aW9uIHRvIHRoZSBkZWZhdWx0IG1ldGhvZAorICAvLyBjYWxsaW5nIGNvbnZlbnRpb24uCisgIGlmIChULT5pc0Z1bmN0aW9uVHlwZSgpKQorICAgIGFkanVzdE1lbWJlckZ1bmN0aW9uQ0MoVCwgLypJc1N0YXRpYz0qL2ZhbHNlKTsKIAogICByZXR1cm4gQ29udGV4dC5nZXRNZW1iZXJQb2ludGVyVHlwZShULCBDbGFzcy5nZXRUeXBlUHRyKCkpOwogfQpAQCAtMjM3NSwxMSArMjM0MywxMSBAQAogICAgIHJldHVybjsKIAogICAvLyBBbiBpbml0aWFsaXplciBmb3IgYSBub24tY2xhc3MgdHlwZSBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBhcmd1bWVudC4KLSAgaWYgKCFSVC0+aXNSZWNvcmRUeXBlKCkgJiYgRlRJLk51bUFyZ3MgPiAxKQorICBpZiAoIVJULT5pc1JlY29yZFR5cGUoKSAmJiBGVEkuTnVtUGFyYW1zID4gMSkKICAgICByZXR1cm47CiAKICAgLy8gQW4gaW5pdGlhbGl6ZXIgZm9yIGEgcmVmZXJlbmNlIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBhcmd1bWVudC4KLSAgaWYgKFJULT5pc1JlZmVyZW5jZVR5cGUoKSAmJiBGVEkuTnVtQXJncyAhPSAxKQorICBpZiAoUlQtPmlzUmVmZXJlbmNlVHlwZSgpICYmIEZUSS5OdW1QYXJhbXMgIT0gMSkKICAgICByZXR1cm47CiAKICAgLy8gT25seSB3YXJuIGlmIHRoaXMgZGVjbGFyYXRvciBpcyBkZWNsYXJpbmcgYSBmdW5jdGlvbiBhdCBibG9jayBzY29wZSwgYW5kCkBAIC0yMzk5LDkgKzIzNjcsOSBAQAogICBTb3VyY2VSYW5nZSBQYXJlblJhbmdlKERlY2xUeXBlLkxvYywgRGVjbFR5cGUuRW5kTG9jKTsKIAogICBTLkRpYWcoRGVjbFR5cGUuTG9jLAotICAgICAgICAgRlRJLk51bUFyZ3MgPyBkaWFnOjp3YXJuX3BhcmVuc19kaXNhbWJpZ3VhdGVkX2FzX2Z1bmN0aW9uX2RlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICA6IGRpYWc6Ondhcm5fZW1wdHlfcGFyZW5zX2FyZV9mdW5jdGlvbl9kZWNsKQotICAgIDw8IFBhcmVuUmFuZ2U7CisgICAgICAgICBGVEkuTnVtUGFyYW1zID8gZGlhZzo6d2Fybl9wYXJlbnNfZGlzYW1iaWd1YXRlZF9hc19mdW5jdGlvbl9kZWNsYXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6Ondhcm5fZW1wdHlfcGFyZW5zX2FyZV9mdW5jdGlvbl9kZWNsKQorICAgICAgPDwgUGFyZW5SYW5nZTsKIAogICAvLyBJZiB0aGUgZGVjbGFyYXRpb24gbG9va3MgbGlrZToKICAgLy8gICBUIHZhcjEsCkBAIC0yNDIyLDExICsyMzkwLDExIEBACiAgICAgfQogICB9CiAKLSAgaWYgKEZUSS5OdW1BcmdzID4gMCkgeworICBpZiAoRlRJLk51bVBhcmFtcyA+IDApIHsKICAgICAvLyBGb3IgYSBkZWNsYXJhdGlvbiB3aXRoIHBhcmFtZXRlcnMsIGVnLiAiVCB2YXIoVCgpKTsiLCBzdWdnZXN0IGFkZGluZyBwYXJlbnMKICAgICAvLyBhcm91bmQgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB0dXJuIHRoZSBkZWNsYXJhdGlvbiBpbnRvIGEgdmFyaWFibGUKICAgICAvLyBkZWNsYXJhdGlvbi4KLSAgICBTb3VyY2VSYW5nZSBSYW5nZSA9IEZUSS5BcmdJbmZvWzBdLlBhcmFtLT5nZXRTb3VyY2VSYW5nZSgpOworICAgIFNvdXJjZVJhbmdlIFJhbmdlID0gRlRJLlBhcmFtc1swXS5QYXJhbS0+Z2V0U291cmNlUmFuZ2UoKTsKICAgICBTb3VyY2VMb2NhdGlvbiBCID0gUmFuZ2UuZ2V0QmVnaW4oKTsKICAgICBTb3VyY2VMb2NhdGlvbiBFID0gUy5QUC5nZXRMb2NGb3JFbmRPZlRva2VuKFJhbmdlLmdldEVuZCgpKTsKICAgICAvLyBGSVhNRTogTWF5YmUgd2Ugc2hvdWxkIHN1Z2dlc3QgYWRkaW5nIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucwpAQCAtMjYyNSw3ICsyNTkzLDYgQEAKICAgICAgIH0KICAgICAgIFQgPSBTLkJ1aWxkUmVmZXJlbmNlVHlwZShULCBEZWNsVHlwZS5SZWYuTFZhbHVlUmVmLCBEZWNsVHlwZS5Mb2MsIE5hbWUpOwogCi0gICAgICBRdWFsaWZpZXJzIFF1YWxzOwogICAgICAgaWYgKERlY2xUeXBlLlJlZi5IYXNSZXN0cmljdCkKICAgICAgICAgVCA9IFMuQnVpbGRRdWFsaWZpZWRUeXBlKFQsIERlY2xUeXBlLkxvYywgUXVhbGlmaWVyczo6UmVzdHJpY3QpOwogICAgICAgYnJlYWs7CkBAIC0yNzI3LDExICsyNjk0LDEzIEBACiAgICAgICBpZiAoIUQuaXNJbnZhbGlkVHlwZSgpKSB7CiAgICAgICAgIC8vIHRyYWlsaW5nLXJldHVybi10eXBlIGlzIG9ubHkgcmVxdWlyZWQgaWYgd2UncmUgZGVjbGFyaW5nIGEgZnVuY3Rpb24sCiAgICAgICAgIC8vIGFuZCBub3QsIGZvciBpbnN0YW5jZSwgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24uCi0gICAgICAgIGlmIChELmdldERlY2xTcGVjKCkuZ2V0VHlwZVNwZWNUeXBlKCkgPT0gRGVjbFNwZWM6OlRTVF9hdXRvICYmCisgICAgICAgIGlmIChELmdldERlY2xTcGVjKCkuY29udGFpbnNQbGFjZWhvbGRlclR5cGUoKSAmJgogICAgICAgICAgICAgIUZUSS5oYXNUcmFpbGluZ1JldHVyblR5cGUoKSAmJiBjaHVua0luZGV4ID09IDAgJiYKICAgICAgICAgICAgICFTLmdldExhbmdPcHRzKCkuQ1BsdXNQbHVzMXkpIHsKICAgICAgICAgICBTLkRpYWcoRC5nZXREZWNsU3BlYygpLmdldFR5cGVTcGVjVHlwZUxvYygpLAotICAgICAgICAgICAgICAgZGlhZzo6ZXJyX2F1dG9fbWlzc2luZ190cmFpbGluZ19yZXR1cm4pOworICAgICAgICAgICAgICAgICBELmdldERlY2xTcGVjKCkuZ2V0VHlwZVNwZWNUeXBlKCkgPT0gRGVjbFNwZWM6OlRTVF9hdXRvCisgICAgICAgICAgICAgICAgICAgICA/IGRpYWc6OmVycl9hdXRvX21pc3NpbmdfdHJhaWxpbmdfcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6OmVycl9kZWR1Y2VkX3JldHVybl90eXBlKTsKICAgICAgICAgICBUID0gQ29udGV4dC5JbnRUeTsKICAgICAgICAgICBELnNldEludmFsaWRUeXBlKHRydWUpOwogICAgICAgICB9IGVsc2UgaWYgKEZUSS5oYXNUcmFpbGluZ1JldHVyblR5cGUoKSkgewpAQCAtMjg4MiwxNCArMjg1MSwxNCBAQAogCiAgICAgICBGdW5jdGlvblR5cGU6OkV4dEluZm8gRUkoZ2V0Q0NGb3JEZWNsYXJhdG9yQ2h1bmsoUywgRCwgRlRJLCBjaHVua0luZGV4KSk7CiAKLSAgICAgIGlmICghRlRJLk51bUFyZ3MgJiYgIUZUSS5pc1ZhcmlhZGljICYmICFMYW5nT3B0cy5DUGx1c1BsdXMpIHsKKyAgICAgIGlmICghRlRJLk51bVBhcmFtcyAmJiAhRlRJLmlzVmFyaWFkaWMgJiYgIUxhbmdPcHRzLkNQbHVzUGx1cykgewogICAgICAgICAvLyBTaW1wbGUgdm9pZCBmb28oKSwgd2hlcmUgdGhlIGluY29taW5nIFQgaXMgdGhlIHJlc3VsdCB0eXBlLgogICAgICAgICBUID0gQ29udGV4dC5nZXRGdW5jdGlvbk5vUHJvdG9UeXBlKFQsIEVJKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFdlIGFsbG93IGEgemVyby1wYXJhbWV0ZXIgdmFyaWFkaWMgZnVuY3Rpb24gaW4gQyBpZiB0aGUKICAgICAgICAgLy8gZnVuY3Rpb24gaXMgbWFya2VkIHdpdGggdGhlICJvdmVybG9hZGFibGUiIGF0dHJpYnV0ZS4gU2NhbgogICAgICAgICAvLyBmb3IgdGhpcyBhdHRyaWJ1dGUgbm93LgotICAgICAgICBpZiAoIUZUSS5OdW1BcmdzICYmIEZUSS5pc1ZhcmlhZGljICYmICFMYW5nT3B0cy5DUGx1c1BsdXMpIHsKKyAgICAgICAgaWYgKCFGVEkuTnVtUGFyYW1zICYmIEZUSS5pc1ZhcmlhZGljICYmICFMYW5nT3B0cy5DUGx1c1BsdXMpIHsKICAgICAgICAgICBib29sIE92ZXJsb2FkYWJsZSA9IGZhbHNlOwogICAgICAgICAgIGZvciAoY29uc3QgQXR0cmlidXRlTGlzdCAqQXR0cnMgPSBELmdldEF0dHJpYnV0ZXMoKTsKICAgICAgICAgICAgICAgIEF0dHJzOyBBdHRycyA9IEF0dHJzLT5nZXROZXh0KCkpIHsKQEAgLTI5MDMsMTAgKzI4NzIsMTEgQEAKICAgICAgICAgICAgIFMuRGlhZyhGVEkuZ2V0RWxsaXBzaXNMb2MoKSwgZGlhZzo6ZXJyX2VsbGlwc2lzX2ZpcnN0X2FyZyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoRlRJLk51bUFyZ3MgJiYgRlRJLkFyZ0luZm9bMF0uUGFyYW0gPT0gMCkgeworICAgICAgICBpZiAoRlRJLk51bVBhcmFtcyAmJiBGVEkuUGFyYW1zWzBdLlBhcmFtID09IDApIHsKICAgICAgICAgICAvLyBDOTkgNi43LjUuM3AzOiBSZWplY3QgaW50KHgseSx6KSB3aGVuIGl0J3Mgbm90IGEgZnVuY3Rpb24KICAgICAgICAgICAvLyBkZWZpbml0aW9uLgotICAgICAgICAgIFMuRGlhZyhGVEkuQXJnSW5mb1swXS5JZGVudExvYywgZGlhZzo6ZXJyX2lkZW50X2xpc3RfaW5fZm5fZGVjbGFyYXRpb24pOworICAgICAgICAgIFMuRGlhZyhGVEkuUGFyYW1zWzBdLklkZW50TG9jLAorICAgICAgICAgICAgICAgICBkaWFnOjplcnJfaWRlbnRfbGlzdF9pbl9mbl9kZWNsYXJhdGlvbik7CiAgICAgICAgICAgRC5zZXRJbnZhbGlkVHlwZSh0cnVlKTsKICAgICAgICAgICAvLyBSZWNvdmVyIGJ5IGNyZWF0aW5nIGEgSyZSLXN0eWxlIGZ1bmN0aW9uIHR5cGUuCiAgICAgICAgICAgVCA9IENvbnRleHQuZ2V0RnVuY3Rpb25Ob1Byb3RvVHlwZShULCBFSSk7CkBAIC0yOTI1LDE0ICsyODk1LDE0IEBACiAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSBhIGZ1bmN0aW9uIHdpdGggYW4gYXJndW1lbnQgbGlzdCB0aGF0IGlzCiAgICAgICAgIC8vIHBvdGVudGlhbGx5IHZhcmlhZGljLgogICAgICAgICBTbWFsbFZlY3RvcjxRdWFsVHlwZSwgMTY+IEFyZ1R5czsKLSAgICAgICAgQXJnVHlzLnJlc2VydmUoRlRJLk51bUFyZ3MpOworICAgICAgICBBcmdUeXMucmVzZXJ2ZShGVEkuTnVtUGFyYW1zKTsKIAotICAgICAgICBTbWFsbFZlY3Rvcjxib29sLCAxNj4gQ29uc3VtZWRBcmd1bWVudHM7Ci0gICAgICAgIENvbnN1bWVkQXJndW1lbnRzLnJlc2VydmUoRlRJLk51bUFyZ3MpOwotICAgICAgICBib29sIEhhc0FueUNvbnN1bWVkQXJndW1lbnRzID0gZmFsc2U7CisgICAgICAgIFNtYWxsVmVjdG9yPGJvb2wsIDE2PiBDb25zdW1lZFBhcmFtZXRlcnM7CisgICAgICAgIENvbnN1bWVkUGFyYW1ldGVycy5yZXNlcnZlKEZUSS5OdW1QYXJhbXMpOworICAgICAgICBib29sIEhhc0FueUNvbnN1bWVkUGFyYW1ldGVycyA9IGZhbHNlOwogCi0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVEkuTnVtQXJnczsgaSAhPSBlOyArK2kpIHsKLSAgICAgICAgICBQYXJtVmFyRGVjbCAqUGFyYW0gPSBjYXN0PFBhcm1WYXJEZWNsPihGVEkuQXJnSW5mb1tpXS5QYXJhbSk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBGVEkuTnVtUGFyYW1zOyBpICE9IGU7ICsraSkgeworICAgICAgICAgIFBhcm1WYXJEZWNsICpQYXJhbSA9IGNhc3Q8UGFybVZhckRlY2w+KEZUSS5QYXJhbXNbaV0uUGFyYW0pOwogICAgICAgICAgIFF1YWxUeXBlIEFyZ1R5ID0gUGFyYW0tPmdldFR5cGUoKTsKICAgICAgICAgICBhc3NlcnQoIUFyZ1R5LmlzTnVsbCgpICYmICJDb3VsZG4ndCBwYXJzZSB0eXBlPyIpOwogCkBAIC0yOTQzLDE0ICsyOTEzLDEzIEBACiAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHNvbWV0aGluZyBsaWtlICdmbG9hdChpbnQsIHZvaWQpJywgcmVqZWN0IGl0LiAgJ3ZvaWQnCiAgICAgICAgICAgICAvLyBpcyBhbiBpbmNvbXBsZXRlIHR5cGUgKEM5OSA2LjIuNXAxOSkgYW5kIGZ1bmN0aW9uIGRlY2xzIGNhbm5vdAogICAgICAgICAgICAgLy8gaGF2ZSBhcmd1bWVudHMgb2YgaW5jb21wbGV0ZSB0eXBlLgotICAgICAgICAgICAgaWYgKEZUSS5OdW1BcmdzICE9IDEgfHwgRlRJLmlzVmFyaWFkaWMpIHsKKyAgICAgICAgICAgIGlmIChGVEkuTnVtUGFyYW1zICE9IDEgfHwgRlRJLmlzVmFyaWFkaWMpIHsKICAgICAgICAgICAgICAgUy5EaWFnKERlY2xUeXBlLkxvYywgZGlhZzo6ZXJyX3ZvaWRfb25seV9wYXJhbSk7CiAgICAgICAgICAgICAgIEFyZ1R5ID0gQ29udGV4dC5JbnRUeTsKICAgICAgICAgICAgICAgUGFyYW0tPnNldFR5cGUoQXJnVHkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChGVEkuQXJnSW5mb1tpXS5JZGVudCkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChGVEkuUGFyYW1zW2ldLklkZW50KSB7CiAgICAgICAgICAgICAgIC8vIFJlamVjdCwgYnV0IGNvbnRpbnVlIHRvIHBhcnNlICdpbnQodm9pZCBhYmMpJy4KLSAgICAgICAgICAgICAgUy5EaWFnKEZUSS5BcmdJbmZvW2ldLklkZW50TG9jLAotICAgICAgICAgICAgICAgICAgIGRpYWc6OmVycl9wYXJhbV93aXRoX3ZvaWRfdHlwZSk7CisgICAgICAgICAgICAgIFMuRGlhZyhGVEkuUGFyYW1zW2ldLklkZW50TG9jLCBkaWFnOjplcnJfcGFyYW1fd2l0aF92b2lkX3R5cGUpOwogICAgICAgICAgICAgICBBcmdUeSA9IENvbnRleHQuSW50VHk7CiAgICAgICAgICAgICAgIFBhcmFtLT5zZXRUeXBlKEFyZ1R5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yOTkwLDE1ICsyOTU5LDE1IEBACiAKICAgICAgICAgICBpZiAoTGFuZ09wdHMuT2JqQ0F1dG9SZWZDb3VudCkgewogICAgICAgICAgICAgYm9vbCBDb25zdW1lZCA9IFBhcmFtLT5oYXNBdHRyPE5TQ29uc3VtZWRBdHRyPigpOwotICAgICAgICAgICAgQ29uc3VtZWRBcmd1bWVudHMucHVzaF9iYWNrKENvbnN1bWVkKTsKLSAgICAgICAgICAgIEhhc0FueUNvbnN1bWVkQXJndW1lbnRzIHw9IENvbnN1bWVkOworICAgICAgICAgICAgQ29uc3VtZWRQYXJhbWV0ZXJzLnB1c2hfYmFjayhDb25zdW1lZCk7CisgICAgICAgICAgICBIYXNBbnlDb25zdW1lZFBhcmFtZXRlcnMgfD0gQ29uc3VtZWQ7CiAgICAgICAgICAgfQogCiAgICAgICAgICAgQXJnVHlzLnB1c2hfYmFjayhBcmdUeSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoSGFzQW55Q29uc3VtZWRBcmd1bWVudHMpCi0gICAgICAgICAgRVBJLkNvbnN1bWVkQXJndW1lbnRzID0gQ29uc3VtZWRBcmd1bWVudHMuZGF0YSgpOworICAgICAgICBpZiAoSGFzQW55Q29uc3VtZWRQYXJhbWV0ZXJzKQorICAgICAgICAgIEVQSS5Db25zdW1lZFBhcmFtZXRlcnMgPSBDb25zdW1lZFBhcmFtZXRlcnMuZGF0YSgpOwogCiAgICAgICAgIFNtYWxsVmVjdG9yPFF1YWxUeXBlLCA0PiBFeGNlcHRpb25zOwogICAgICAgICBTbWFsbFZlY3RvcjxQYXJzZWRUeXBlLCAyPiBEeW5hbWljRXhjZXB0aW9uczsKQEAgLTMwNDAsOCArMzAwOSw3IEBACiAgICAgICAgIEQuc2V0SW52YWxpZFR5cGUodHJ1ZSk7CiAgICAgICB9IGVsc2UgaWYgKFMuaXNEZXBlbmRlbnRTY29wZVNwZWNpZmllcihTUykgfHwKICAgICAgICAgICAgICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxDWFhSZWNvcmREZWNsPihTLmNvbXB1dGVEZWNsQ29udGV4dChTUykpKSB7Ci0gICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUwotICAgICAgICAgID0gc3RhdGljX2Nhc3Q8TmVzdGVkTmFtZVNwZWNpZmllcio+KFNTLmdldFNjb3BlUmVwKCkpOworICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMgPSBTUy5nZXRTY29wZVJlcCgpOwogICAgICAgICBOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlNQcmVmaXggPSBOTlMtPmdldFByZWZpeCgpOwogICAgICAgICBzd2l0Y2ggKE5OUy0+Z2V0S2luZCgpKSB7CiAgICAgICAgIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6SWRlbnRpZmllcjoKQEAgLTMxNjUsNyArMzEzMyw3IEBACiAgICAgICBFUEkuVHlwZVF1YWxzID0gMDsKICAgICAgIEVQSS5SZWZRdWFsaWZpZXIgPSBSUV9Ob25lOwogCi0gICAgICBUID0gQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoRm5UeS0+Z2V0UmVzdWx0VHlwZSgpLCBGblR5LT5nZXRBcmdUeXBlcygpLAorICAgICAgVCA9IENvbnRleHQuZ2V0RnVuY3Rpb25UeXBlKEZuVHktPmdldFJldHVyblR5cGUoKSwgRm5UeS0+Z2V0UGFyYW1UeXBlcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQSSk7CiAgICAgICAvLyBSZWJ1aWxkIGFueSBwYXJlbnMgYXJvdW5kIHRoZSBpZGVudGlmaWVyIGluIHRoZSBmdW5jdGlvbiB0eXBlLgogICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IEQuZ2V0TnVtVHlwZU9iamVjdHMoKTsgaSAhPSBlOyArK2kpIHsKQEAgLTM0NzYsMTAgKzM0NDQsMTcgQEAKICAgfQogCiAgIFRMLnNldEF0dHJOYW1lTG9jKGF0dHJzLT5nZXRMb2MoKSk7Ci0gIGlmIChUTC5oYXNBdHRyRXhwck9wZXJhbmQoKSAmJiBhdHRycy0+aXNBcmdFeHByKDApKQorICBpZiAoVEwuaGFzQXR0ckV4cHJPcGVyYW5kKCkpIHsKKyAgICBhc3NlcnQoYXR0cnMtPmlzQXJnRXhwcigwKSAmJiAibWlzbWF0Y2hlZCBhdHRyaWJ1dGUgb3BlcmFuZCBraW5kIik7CiAgICAgVEwuc2V0QXR0ckV4cHJPcGVyYW5kKGF0dHJzLT5nZXRBcmdBc0V4cHIoMCkpOwotICBlbHNlIGlmIChUTC5oYXNBdHRyRW51bU9wZXJhbmQoKSAmJiBhdHRycy0+aXNBcmdJZGVudCgwKSkKLSAgICBUTC5zZXRBdHRyRW51bU9wZXJhbmRMb2MoYXR0cnMtPmdldEFyZ0FzSWRlbnQoMCktPkxvYyk7CisgIH0gZWxzZSBpZiAoVEwuaGFzQXR0ckVudW1PcGVyYW5kKCkpIHsKKyAgICBhc3NlcnQoKGF0dHJzLT5pc0FyZ0lkZW50KDApIHx8IGF0dHJzLT5pc0FyZ0V4cHIoMCkpICYmCisgICAgICAgICAgICJ1bmV4cGVjdGVkIGF0dHJpYnV0ZSBvcGVyYW5kIGtpbmQiKTsKKyAgICBpZiAoYXR0cnMtPmlzQXJnSWRlbnQoMCkpCisgICAgICBUTC5zZXRBdHRyRW51bU9wZXJhbmRMb2MoYXR0cnMtPmdldEFyZ0FzSWRlbnQoMCktPkxvYyk7CisgICAgZWxzZQorICAgICAgVEwuc2V0QXR0ckVudW1PcGVyYW5kTG9jKGF0dHJzLT5nZXRBcmdBc0V4cHIoMCktPmdldEV4cHJMb2MoKSk7CisgIH0KIAogICAvLyBGSVhNRTogcHJlc2VydmUgdGhpcyBpbmZvcm1hdGlvbiB0byBoZXJlLgogICBpZiAoVEwuaGFzQXR0ck9wZXJhbmQoKSkKQEAgLTM2ODIsNiArMzY1Nyw5IEBACiAgICAgdm9pZCBWaXNpdEF0dHJpYnV0ZWRUeXBlTG9jKEF0dHJpYnV0ZWRUeXBlTG9jIFRMKSB7CiAgICAgICBmaWxsQXR0cmlidXRlZFR5cGVMb2MoVEwsIENodW5rLmdldEF0dHJzKCkpOwogICAgIH0KKyAgICB2b2lkIFZpc2l0QWRqdXN0ZWRUeXBlTG9jKEFkanVzdGVkVHlwZUxvYyBUTCkgeworICAgICAgLy8gbm90aGluZworICAgIH0KICAgICB2b2lkIFZpc2l0QmxvY2tQb2ludGVyVHlwZUxvYyhCbG9ja1BvaW50ZXJUeXBlTG9jIFRMKSB7CiAgICAgICBhc3NlcnQoQ2h1bmsuS2luZCA9PSBEZWNsYXJhdG9yQ2h1bms6OkJsb2NrUG9pbnRlcik7CiAgICAgICBUTC5zZXRDYXJldExvYyhDaHVuay5Mb2MpOwpAQCAtMzc2Myw5ICszNzQxLDkgQEAKICAgICAgIGNvbnN0IERlY2xhcmF0b3JDaHVuazo6RnVuY3Rpb25UeXBlSW5mbyAmRlRJID0gQ2h1bmsuRnVuOwogICAgICAgVEwuc2V0TFBhcmVuTG9jKEZUSS5nZXRMUGFyZW5Mb2MoKSk7CiAgICAgICBUTC5zZXRSUGFyZW5Mb2MoRlRJLmdldFJQYXJlbkxvYygpKTsKLSAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUTC5nZXROdW1BcmdzKCksIHRwaSA9IDA7IGkgIT0gZTsgKytpKSB7Ci0gICAgICAgIFBhcm1WYXJEZWNsICpQYXJhbSA9IGNhc3Q8UGFybVZhckRlY2w+KEZUSS5BcmdJbmZvW2ldLlBhcmFtKTsKLSAgICAgICAgVEwuc2V0QXJnKHRwaSsrLCBQYXJhbSk7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVEwuZ2V0TnVtUGFyYW1zKCksIHRwaSA9IDA7IGkgIT0gZTsgKytpKSB7CisgICAgICAgIFBhcm1WYXJEZWNsICpQYXJhbSA9IGNhc3Q8UGFybVZhckRlY2w+KEZUSS5QYXJhbXNbaV0uUGFyYW0pOworICAgICAgICBUTC5zZXRQYXJhbSh0cGkrKywgUGFyYW0pOwogICAgICAgfQogICAgICAgLy8gRklYTUU6IGV4Y2VwdGlvbiBzcGVjcwogICAgIH0KQEAgLTM4MzcsNiArMzgxNSwxMCBAQAogICAgICAgQ3VyclRMID0gVEwuZ2V0TmV4dFR5cGVMb2MoKS5nZXRVbnF1YWxpZmllZExvYygpOwogICAgIH0KIAorICAgIC8vIEZJWE1FOiBPcmRlcmluZyBoZXJlPworICAgIHdoaWxlIChBZGp1c3RlZFR5cGVMb2MgVEwgPSBDdXJyVEwuZ2V0QXM8QWRqdXN0ZWRUeXBlTG9jPigpKQorICAgICAgQ3VyclRMID0gVEwuZ2V0TmV4dFR5cGVMb2MoKS5nZXRVbnF1YWxpZmllZExvYygpOworCiAgICAgRGVjbGFyYXRvckxvY0ZpbGxlcihDb250ZXh0LCBELmdldFR5cGVPYmplY3QoaSkpLlZpc2l0KEN1cnJUTCk7CiAgICAgQ3VyclRMID0gQ3VyclRMLmdldE5leHRUeXBlTG9jKCkuZ2V0VW5xdWFsaWZpZWRMb2MoKTsKICAgfQpAQCAtMzkzNiw0NCArMzkxOCw2MCBAQAogICAgIHJldHVybjsKICAgfQogCi0gIC8vIENoZWNrIHRoZSBhdHRyaWJ1dGUgYXJndW1lbnRzLgotICBpZiAoQXR0ci5nZXROdW1BcmdzKCkgIT0gMSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX251bWJlcl9hcmd1bWVudHMpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAxOwotICAgIEF0dHIuc2V0SW52YWxpZCgpOwotICAgIHJldHVybjsKLSAgfQotICBFeHByICpBU0FyZ0V4cHIgPSBzdGF0aWNfY2FzdDxFeHByICo+KEF0dHIuZ2V0QXJnQXNFeHByKDApKTsKLSAgbGx2bTo6QVBTSW50IGFkZHJTcGFjZSgzMik7Ci0gIGlmIChBU0FyZ0V4cHItPmlzVHlwZURlcGVuZGVudCgpIHx8IEFTQXJnRXhwci0+aXNWYWx1ZURlcGVuZGVudCgpIHx8Ci0gICAgICAhQVNBcmdFeHByLT5pc0ludGVnZXJDb25zdGFudEV4cHIoYWRkclNwYWNlLCBTLkNvbnRleHQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEFBTlRfQXJndW1lbnRJbnRlZ2VyQ29uc3RhbnQKLSAgICAgIDw8IEFTQXJnRXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKLSAgICBBdHRyLnNldEludmFsaWQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBCb3VuZHMgY2hlY2tpbmcuCi0gIGlmIChhZGRyU3BhY2UuaXNTaWduZWQoKSkgewotICAgIGlmIChhZGRyU3BhY2UuaXNOZWdhdGl2ZSgpKSB7Ci0gICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hZGRyZXNzX3NwYWNlX25lZ2F0aXZlKQorICB1bnNpZ25lZCBBU0lkeDsKKyAgaWYgKEF0dHIuZ2V0S2luZCgpID09IEF0dHJpYnV0ZUxpc3Q6OkFUX0FkZHJlc3NTcGFjZSkgeworICAgIC8vIENoZWNrIHRoZSBhdHRyaWJ1dGUgYXJndW1lbnRzLgorICAgIGlmIChBdHRyLmdldE51bUFyZ3MoKSAhPSAxKSB7CisgICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19udW1iZXJfYXJndW1lbnRzKQorICAgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAxOworICAgICAgQXR0ci5zZXRJbnZhbGlkKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIEV4cHIgKkFTQXJnRXhwciA9IHN0YXRpY19jYXN0PEV4cHIgKj4oQXR0ci5nZXRBcmdBc0V4cHIoMCkpOworICAgIGxsdm06OkFQU0ludCBhZGRyU3BhY2UoMzIpOworICAgIGlmIChBU0FyZ0V4cHItPmlzVHlwZURlcGVuZGVudCgpIHx8IEFTQXJnRXhwci0+aXNWYWx1ZURlcGVuZGVudCgpIHx8CisgICAgICAgICFBU0FyZ0V4cHItPmlzSW50ZWdlckNvbnN0YW50RXhwcihhZGRyU3BhY2UsIFMuQ29udGV4dCkpIHsKKyAgICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX2FyZ3VtZW50X3R5cGUpCisgICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEFBTlRfQXJndW1lbnRJbnRlZ2VyQ29uc3RhbnQKICAgICAgICAgPDwgQVNBcmdFeHByLT5nZXRTb3VyY2VSYW5nZSgpOwogICAgICAgQXR0ci5zZXRJbnZhbGlkKCk7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIGFkZHJTcGFjZS5zZXRJc1NpZ25lZChmYWxzZSk7Ci0gIH0KLSAgbGx2bTo6QVBTSW50IG1heChhZGRyU3BhY2UuZ2V0Qml0V2lkdGgoKSk7Ci0gIG1heCA9IFF1YWxpZmllcnM6Ok1heEFkZHJlc3NTcGFjZTsKLSAgaWYgKGFkZHJTcGFjZSA+IG1heCkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX2FkZHJlc3Nfc3BhY2VfdG9vX2hpZ2gpCi0gICAgICA8PCBpbnQoUXVhbGlmaWVyczo6TWF4QWRkcmVzc1NwYWNlKSA8PCBBU0FyZ0V4cHItPmdldFNvdXJjZVJhbmdlKCk7Ci0gICAgQXR0ci5zZXRJbnZhbGlkKCk7Ci0gICAgcmV0dXJuOwotICB9CiAKLSAgdW5zaWduZWQgQVNJZHggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYWRkclNwYWNlLmdldFpFeHRWYWx1ZSgpKTsKKyAgICAvLyBCb3VuZHMgY2hlY2tpbmcuCisgICAgaWYgKGFkZHJTcGFjZS5pc1NpZ25lZCgpKSB7CisgICAgICBpZiAoYWRkclNwYWNlLmlzTmVnYXRpdmUoKSkgeworICAgICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hZGRyZXNzX3NwYWNlX25lZ2F0aXZlKQorICAgICAgICAgIDw8IEFTQXJnRXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgICAgQXR0ci5zZXRJbnZhbGlkKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGFkZHJTcGFjZS5zZXRJc1NpZ25lZChmYWxzZSk7CisgICAgfQorICAgIGxsdm06OkFQU0ludCBtYXgoYWRkclNwYWNlLmdldEJpdFdpZHRoKCkpOworICAgIG1heCA9IFF1YWxpZmllcnM6Ok1heEFkZHJlc3NTcGFjZTsKKyAgICBpZiAoYWRkclNwYWNlID4gbWF4KSB7CisgICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hZGRyZXNzX3NwYWNlX3Rvb19oaWdoKQorICAgICAgICA8PCBpbnQoUXVhbGlmaWVyczo6TWF4QWRkcmVzc1NwYWNlKSA8PCBBU0FyZ0V4cHItPmdldFNvdXJjZVJhbmdlKCk7CisgICAgICBBdHRyLnNldEludmFsaWQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNJZHggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYWRkclNwYWNlLmdldFpFeHRWYWx1ZSgpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGUga2V5d29yZC1iYXNlZCB0eXBlIGF0dHJpYnV0ZXMgaW1wbHkgd2hpY2ggYWRkcmVzcyBzcGFjZSB0byB1c2UuCisgICAgc3dpdGNoIChBdHRyLmdldEtpbmQoKSkgeworICAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMR2xvYmFsQWRkcmVzc1NwYWNlOgorICAgICAgQVNJZHggPSBMYW5nQVM6Om9wZW5jbF9nbG9iYWw7IGJyZWFrOworICAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfT3BlbkNMTG9jYWxBZGRyZXNzU3BhY2U6CisgICAgICBBU0lkeCA9IExhbmdBUzo6b3BlbmNsX2xvY2FsOyBicmVhazsKKyAgICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX09wZW5DTENvbnN0YW50QWRkcmVzc1NwYWNlOgorICAgICAgQVNJZHggPSBMYW5nQVM6Om9wZW5jbF9jb25zdGFudDsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydChBdHRyLmdldEtpbmQoKSA9PSBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xQcml2YXRlQWRkcmVzc1NwYWNlKTsKKyAgICAgIEFTSWR4ID0gMDsgYnJlYWs7CisgICAgfQorICB9CisgIAogICBUeXBlID0gUy5Db250ZXh0LmdldEFkZHJTcGFjZVF1YWxUeXBlKFR5cGUsIEFTSWR4KTsKIH0KIApAQCAtNDU4Niw3MyArNDU4NCwzOCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBTZW1hOjpoYXNFeHBsaWNpdENhbGxpbmdDb252KFF1YWxUeXBlICZUKSB7CisgIFF1YWxUeXBlIFIgPSBULklnbm9yZVBhcmVucygpOworICB3aGlsZSAoY29uc3QgQXR0cmlidXRlZFR5cGUgKkFUID0gZHluX2Nhc3Q8QXR0cmlidXRlZFR5cGU+KFIpKSB7CisgICAgaWYgKEFULT5pc0NhbGxpbmdDb252KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBSID0gQVQtPmdldE1vZGlmaWVkVHlwZSgpLklnbm9yZVBhcmVucygpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBTZW1hOjphZGp1c3RNZW1iZXJGdW5jdGlvbkNDKFF1YWxUeXBlICZULCBib29sIElzU3RhdGljKSB7Ci0gIGNvbnN0IEZ1bmN0aW9uVHlwZSAqRlQgPSBULT5jYXN0QXM8RnVuY3Rpb25UeXBlPigpOworICBGdW5jdGlvblR5cGVVbndyYXBwZXIgVW53cmFwcGVkKCp0aGlzLCBUKTsKKyAgY29uc3QgRnVuY3Rpb25UeXBlICpGVCA9IFVud3JhcHBlZC5nZXQoKTsKICAgYm9vbCBJc1ZhcmlhZGljID0gKGlzYTxGdW5jdGlvblByb3RvVHlwZT4oRlQpICYmCiAgICAgICAgICAgICAgICAgICAgICBjYXN0PEZ1bmN0aW9uUHJvdG9UeXBlPihGVCktPmlzVmFyaWFkaWMoKSk7Ci0gIENhbGxpbmdDb252IENDID0gRlQtPmdldENhbGxDb252KCk7CiAKICAgLy8gT25seSBhZGp1c3QgdHlwZXMgd2l0aCB0aGUgZGVmYXVsdCBjb252ZW50aW9uLiAgRm9yIGV4YW1wbGUsIG9uIFdpbmRvd3Mgd2UKICAgLy8gc2hvdWxkIGFkanVzdCBhIF9fY2RlY2wgdHlwZSB0byBfX3RoaXNjYWxsIGZvciBpbnN0YW5jZSBtZXRob2RzLCBhbmQgYQogICAvLyBfX3RoaXNjYWxsIHR5cGUgdG8gX19jZGVjbCBmb3Igc3RhdGljIG1ldGhvZHMuCi0gIENhbGxpbmdDb252IERlZmF1bHRDQyA9CisgIENhbGxpbmdDb252IEN1ckNDID0gRlQtPmdldENhbGxDb252KCk7CisgIENhbGxpbmdDb252IEZyb21DQyA9CiAgICAgICBDb250ZXh0LmdldERlZmF1bHRDYWxsaW5nQ29udmVudGlvbihJc1ZhcmlhZGljLCBJc1N0YXRpYyk7Ci0gIGlmIChDQyAhPSBEZWZhdWx0Q0MpCisgIENhbGxpbmdDb252IFRvQ0MgPSBDb250ZXh0LmdldERlZmF1bHRDYWxsaW5nQ29udmVudGlvbihJc1ZhcmlhZGljLCAhSXNTdGF0aWMpOworICBpZiAoQ3VyQ0MgIT0gRnJvbUNDIHx8IEZyb21DQyA9PSBUb0NDKQogICAgIHJldHVybjsKIAotICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gZXhwbGljaXQgYXR0cmlidXRlLCBidXQgb25seSBsb29rIHRocm91Z2ggcGFyZW5zLgotICAvLyBUaGUgaW50ZW50IGlzIHRvIGxvb2sgZm9yIGFuIGF0dHJpYnV0ZSBvbiB0aGUgY3VycmVudCBkZWNsYXJhdG9yLCBidXQgbm90Ci0gIC8vIG9uZSB0aGF0IGNhbWUgZnJvbSBhIHR5cGVkZWYuCi0gIFF1YWxUeXBlIFIgPSBULklnbm9yZVBhcmVucygpOwotICB3aGlsZSAoY29uc3QgQXR0cmlidXRlZFR5cGUgKkFUID0gZHluX2Nhc3Q8QXR0cmlidXRlZFR5cGU+KFIpKSB7Ci0gICAgaWYgKEFULT5pc0NhbGxpbmdDb252KCkpCi0gICAgICByZXR1cm47Ci0gICAgUiA9IEFULT5nZXRNb2RpZmllZFR5cGUoKS5JZ25vcmVQYXJlbnMoKTsKLSAgfQotCi0gIC8vIEZJWE1FOiBUaGlzIGxvc2VzIHN1Z2FyLiAgVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZml4ZWQgd2l0aCBhbiBpbXBsaWNpdAotICAvLyBBdHRyaWJ1dGVkVHlwZSBub2RlIHRoYXQgYWRqdXN0cyB0aGUgY29udmVudGlvbi4KLSAgQ0MgPSBDb250ZXh0LmdldERlZmF1bHRDYWxsaW5nQ29udmVudGlvbihJc1ZhcmlhZGljLCAhSXNTdGF0aWMpOwotICBGVCA9IENvbnRleHQuYWRqdXN0RnVuY3Rpb25UeXBlKEZULCBGVC0+Z2V0RXh0SW5mbygpLndpdGhDYWxsaW5nQ29udihDQykpOwotICBGdW5jdGlvblR5cGVVbndyYXBwZXIgVW53cmFwcGVkKCp0aGlzLCBUKTsKLSAgVCA9IFVud3JhcHBlZC53cmFwKCp0aGlzLCBGVCk7Ci19Ci0KLS8vLyBIYW5kbGUgT3BlbkNMIGltYWdlIGFjY2VzcyBxdWFsaWZpZXJzOiByZWFkX29ubHksIHdyaXRlX29ubHksIHJlYWRfd3JpdGUKLXN0YXRpYyB2b2lkIEhhbmRsZU9wZW5DTEltYWdlQWNjZXNzQXR0cmlidXRlKFF1YWxUeXBlJiBDdXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWEgJlMpIHsKLSAgLy8gQ2hlY2sgdGhlIGF0dHJpYnV0ZSBhcmd1bWVudHMuCi0gIGlmIChBdHRyLmdldE51bUFyZ3MoKSAhPSAxKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfbnVtYmVyX2FyZ3VtZW50cykKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDE7Ci0gICAgQXR0ci5zZXRJbnZhbGlkKCk7CisgIGlmIChoYXNFeHBsaWNpdENhbGxpbmdDb252KFQpKQogICAgIHJldHVybjsKLSAgfQotICBFeHByICpzaXplRXhwciA9IHN0YXRpY19jYXN0PEV4cHIgKj4oQXR0ci5nZXRBcmdBc0V4cHIoMCkpOwotICBsbHZtOjpBUFNJbnQgYXJnKDMyKTsKLSAgaWYgKHNpemVFeHByLT5pc1R5cGVEZXBlbmRlbnQoKSB8fCBzaXplRXhwci0+aXNWYWx1ZURlcGVuZGVudCgpIHx8Ci0gICAgICAhc2l6ZUV4cHItPmlzSW50ZWdlckNvbnN0YW50RXhwcihhcmcsIFMuQ29udGV4dCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9hcmd1bWVudF90eXBlKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgQUFOVF9Bcmd1bWVudEludGVnZXJDb25zdGFudAotICAgICAgPDwgc2l6ZUV4cHItPmdldFNvdXJjZVJhbmdlKCk7Ci0gICAgQXR0ci5zZXRJbnZhbGlkKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVuc2lnbmVkIGlhcmcgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oYXJnLmdldFpFeHRWYWx1ZSgpKTsKLSAgc3dpdGNoIChpYXJnKSB7Ci0gIGNhc2UgQ0xJQV9yZWFkX29ubHk6Ci0gIGNhc2UgQ0xJQV93cml0ZV9vbmx5OgotICBjYXNlIENMSUFfcmVhZF93cml0ZToKLSAgICAvLyBJbXBsZW1lbnRlZCBpbiBhIHNlcGFyYXRlIHBhdGNoCi0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgLy8gSW1wbGVtZW50ZWQgaW4gYSBzZXBhcmF0ZSBwYXRjaAotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX2ludmFsaWRfc2l6ZSkKLSAgICAgIDw8IHNpemVFeHByLT5nZXRTb3VyY2VSYW5nZSgpOwotICAgIEF0dHIuc2V0SW52YWxpZCgpOwotICAgIGJyZWFrOwotICB9CisKKyAgRlQgPSBDb250ZXh0LmFkanVzdEZ1bmN0aW9uVHlwZShGVCwgRlQtPmdldEV4dEluZm8oKS53aXRoQ2FsbGluZ0NvbnYoVG9DQykpOworICBRdWFsVHlwZSBXcmFwcGVkID0gVW53cmFwcGVkLndyYXAoKnRoaXMsIEZUKTsKKyAgVCA9IENvbnRleHQuZ2V0QWRqdXN0ZWRUeXBlKFQsIFdyYXBwZWQpOwogfQogCiAvLy8gSGFuZGxlVmVjdG9yU2l6ZUF0dHJpYnV0ZSAtIHRoaXMgYXR0cmlidXRlIGlzIG9ubHkgYXBwbGljYWJsZSB0byBpbnRlZ3JhbApAQCAtNDc1NywxNyArNDcyMCwyNCBAQAogfQogCiBzdGF0aWMgYm9vbCBpc1Blcm1pdHRlZE5lb25CYXNlVHlwZShRdWFsVHlwZSAmVHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlOjpWZWN0b3JLaW5kIFZlY0tpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQUFyY2g2NCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZTo6VmVjdG9yS2luZCBWZWNLaW5kLCBTZW1hICZTKSB7CiAgIGNvbnN0IEJ1aWx0aW5UeXBlICpCVHkgPSBUeS0+Z2V0QXM8QnVpbHRpblR5cGU+KCk7CiAgIGlmICghQlR5KQogICAgIHJldHVybiBmYWxzZTsKIAorICBsbHZtOjpUcmlwbGUgVHJpcGxlID0gUy5Db250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRUcmlwbGUoKTsKKworICAvLyBTaWduZWQgcG9seSBpcyBtYXRoZW1hdGljYWxseSB3cm9uZywgYnV0IGhhcyBiZWVuIGJha2VkIGludG8gc29tZSBBQklzIGJ5CisgIC8vIG5vdy4KKyAgYm9vbCBJc1BvbHlVbnNpZ25lZCA9IFRyaXBsZS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICBUcmlwbGUuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6YWFyY2g2NF9iZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgVHJpcGxlLmdldEFyY2goKSA9PSBsbHZtOjpUcmlwbGU6OmFybTY0OwogICBpZiAoVmVjS2luZCA9PSBWZWN0b3JUeXBlOjpOZW9uUG9seVZlY3RvcikgewotICAgIGlmIChJc0FBcmNoNjQpIHsKKyAgICBpZiAoSXNQb2x5VW5zaWduZWQpIHsKICAgICAgIC8vIEFBcmNoNjQgcG9seW5vbWlhbCB2ZWN0b3JzIGFyZSB1bnNpZ25lZCBhbmQgc3VwcG9ydCBwb2x5NjQuCiAgICAgICByZXR1cm4gQlR5LT5nZXRLaW5kKCkgPT0gQnVpbHRpblR5cGU6OlVDaGFyIHx8CiAgICAgICAgICAgICAgQlR5LT5nZXRLaW5kKCkgPT0gQnVpbHRpblR5cGU6OlVTaG9ydCB8fAorICAgICAgICAgICAgIEJUeS0+Z2V0S2luZCgpID09IEJ1aWx0aW5UeXBlOjpVTG9uZyB8fAogICAgICAgICAgICAgIEJUeS0+Z2V0S2luZCgpID09IEJ1aWx0aW5UeXBlOjpVTG9uZ0xvbmc7CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIEFBcmNoMzIgcG9seW5vbWlhbCB2ZWN0b3IgYXJlIHNpZ25lZC4KQEAgLTQ3NzgsNyArNDc0OCwxMSBAQAogCiAgIC8vIE5vbi1wb2x5bm9taWFsIHZlY3RvciB0eXBlczogdGhlIHVzdWFsIHN1c3BlY3RzIGFyZSBhbGxvd2VkLCBhcyB3ZWxsIGFzCiAgIC8vIGZsb2F0NjRfdCBvbiBBQXJjaDY0LgotICBpZiAoSXNBQXJjaDY0ICYmIEJUeS0+Z2V0S2luZCgpID09IEJ1aWx0aW5UeXBlOjpEb3VibGUpCisgIGJvb2wgSXM2NEJpdCA9IFRyaXBsZS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0IHx8CisgICAgICAgICAgICAgICAgIFRyaXBsZS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphYXJjaDY0X2JlIHx8CisgICAgICAgICAgICAgICAgIFRyaXBsZS5nZXRBcmNoKCkgPT0gbGx2bTo6VHJpcGxlOjphcm02NDsKKworICBpZiAoSXM2NEJpdCAmJiBCVHktPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6RG91YmxlKQogICAgIHJldHVybiB0cnVlOwogCiAgIHJldHVybiBCVHktPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6U0NoYXIgfHwKQEAgLTQ3ODcsNiArNDc2MSw4IEBACiAgICAgICAgICBCVHktPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6VVNob3J0IHx8CiAgICAgICAgICBCVHktPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6SW50IHx8CiAgICAgICAgICBCVHktPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6VUludCB8fAorICAgICAgICAgQlR5LT5nZXRLaW5kKCkgPT0gQnVpbHRpblR5cGU6OkxvbmcgfHwKKyAgICAgICAgIEJUeS0+Z2V0S2luZCgpID09IEJ1aWx0aW5UeXBlOjpVTG9uZyB8fAogICAgICAgICAgQlR5LT5nZXRLaW5kKCkgPT0gQnVpbHRpblR5cGU6OkxvbmdMb25nIHx8CiAgICAgICAgICBCVHktPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6VUxvbmdMb25nIHx8CiAgICAgICAgICBCVHktPmdldEtpbmQoKSA9PSBCdWlsdGluVHlwZTo6RmxvYXQgfHwKQEAgLTQ4MjgsMTAgKzQ4MDQsNyBAQAogICAgIHJldHVybjsKICAgfQogICAvLyBPbmx5IGNlcnRhaW4gZWxlbWVudCB0eXBlcyBhcmUgc3VwcG9ydGVkIGZvciBOZW9uIHZlY3RvcnMuCi0gIGxsdm06OlRyaXBsZTo6QXJjaFR5cGUgQXJjaCA9Ci0gICAgICAgIFMuQ29udGV4dC5nZXRUYXJnZXRJbmZvKCkuZ2V0VHJpcGxlKCkuZ2V0QXJjaCgpOwotICBpZiAoIWlzUGVybWl0dGVkTmVvbkJhc2VUeXBlKEN1clR5cGUsIFZlY0tpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJjaCA9PSBsbHZtOjpUcmlwbGU6OmFhcmNoNjQpKSB7CisgIGlmICghaXNQZXJtaXR0ZWROZW9uQmFzZVR5cGUoQ3VyVHlwZSwgVmVjS2luZCwgUykpIHsKICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV9pbnZhbGlkX3ZlY3Rvcl90eXBlKSA8PCBDdXJUeXBlOwogICAgIEF0dHIuc2V0SW52YWxpZCgpOwogICAgIHJldHVybjsKQEAgLTQ5MTEsNiArNDg4NCwxMCBAQAogICAgICAgLy8gaXQgaXQgYnJlYWtzIGxhcmdlIGFtb3VudHMgb2YgTGludXggc29mdHdhcmUuCiAgICAgICBhdHRyLnNldFVzZWRBc1R5cGVBdHRyKCk7CiAgICAgICBicmVhazsKKyAgICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX09wZW5DTFByaXZhdGVBZGRyZXNzU3BhY2U6CisgICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xHbG9iYWxBZGRyZXNzU3BhY2U6CisgICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xMb2NhbEFkZHJlc3NTcGFjZToKKyAgICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX09wZW5DTENvbnN0YW50QWRkcmVzc1NwYWNlOgogICAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfQWRkcmVzc1NwYWNlOgogICAgICAgSGFuZGxlQWRkcmVzc1NwYWNlVHlwZUF0dHJpYnV0ZSh0eXBlLCBhdHRyLCBzdGF0ZS5nZXRTZW1hKCkpOwogICAgICAgYXR0ci5zZXRVc2VkQXNUeXBlQXR0cigpOwpAQCAtNDkzOSwxMyArNDkxNiwxMSBAQAogICAgICAgYXR0ci5zZXRVc2VkQXNUeXBlQXR0cigpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9PcGVuQ0xJbWFnZUFjY2VzczoKLSAgICAgIEhhbmRsZU9wZW5DTEltYWdlQWNjZXNzQXR0cmlidXRlKHR5cGUsIGF0dHIsIHN0YXRlLmdldFNlbWEoKSk7CisgICAgICAvLyBGSVhNRTogdGhlcmUgc2hvdWxkIGJlIHNvbWUgdHlwZSBjaGVja2luZyBoYXBwZW5pbmcgaGVyZSwgSSB3b3VsZAorICAgICAgLy8gaW1hZ2luZSwgYnV0IHRoZSBvcmlnaW5hbCBoYW5kbGVyJ3MgY2hlY2tpbmcgd2FzIGVudGlyZWx5IHN1cGVyZmx1b3VzLgogICAgICAgYXR0ci5zZXRVc2VkQXNUeXBlQXR0cigpOwogICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX1dpbjY0OgotICAgICAgYXR0ci5zZXRVc2VkQXNUeXBlQXR0cigpOwotICAgICAgYnJlYWs7CiAgICAgTVNfVFlQRV9BVFRSU19DQVNFTElTVDoKICAgICAgIGlmICghaGFuZGxlTVNQb2ludGVyVHlwZVF1YWxpZmllckF0dHIoc3RhdGUsIGF0dHIsIHR5cGUpKQogICAgICAgICBhdHRyLnNldFVzZWRBc1R5cGVBdHRyKCk7CkBAIC01MDU4LDcgKzUwMzMsNyBAQAogICAgIFR5cGVEaWFnbm9zZXJEaWFnKHVuc2lnbmVkIERpYWdJRCkKICAgICAgIDogU2VtYTo6VHlwZURpYWdub3NlcihEaWFnSUQgPT0gMCksIERpYWdJRChEaWFnSUQpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZGlhZ25vc2UoU2VtYSAmUywgU291cmNlTG9jYXRpb24gTG9jLCBRdWFsVHlwZSBUKSB7CisgICAgdm9pZCBkaWFnbm9zZShTZW1hICZTLCBTb3VyY2VMb2NhdGlvbiBMb2MsIFF1YWxUeXBlIFQpIG92ZXJyaWRlIHsKICAgICAgIGlmIChTdXBwcmVzc2VkKSByZXR1cm47CiAgICAgICBTLkRpYWcoTG9jLCBEaWFnSUQpIDw8IFQ7CiAgICAgfQpAQCAtNTEzMiw2ICs1MTA3LDQ2IEBACiAgICAgICB9CiAgICAgfQogCisgICAgLy8gV2UgbG9jayBpbiB0aGUgaW5oZXJpdGFuY2UgbW9kZWwgb25jZSBzb21lYm9keSBoYXMgYXNrZWQgdXMgdG8gZW5zdXJlCisgICAgLy8gdGhhdCBhIHBvaW50ZXItdG8tbWVtYmVyIHR5cGUgaXMgY29tcGxldGUuCisgICAgaWYgKENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldENYWEFCSSgpLmlzTWljcm9zb2Z0KCkpIHsKKyAgICAgIGlmIChjb25zdCBNZW1iZXJQb2ludGVyVHlwZSAqTVBUeSA9IFQtPmdldEFzPE1lbWJlclBvaW50ZXJUeXBlPigpKSB7CisgICAgICAgIGlmICghTVBUeS0+Z2V0Q2xhc3MoKS0+aXNEZXBlbmRlbnRUeXBlKCkpIHsKKyAgICAgICAgICBSZXF1aXJlQ29tcGxldGVUeXBlKExvYywgUXVhbFR5cGUoTVBUeS0+Z2V0Q2xhc3MoKSwgMCksIDApOworCisgICAgICAgICAgQ1hYUmVjb3JkRGVjbCAqUkQgPSBNUFR5LT5nZXRNb3N0UmVjZW50Q1hYUmVjb3JkRGVjbCgpOworICAgICAgICAgIGlmICghUkQtPmhhc0F0dHI8TVNJbmhlcml0YW5jZUF0dHI+KCkpIHsKKyAgICAgICAgICAgIE1TSW5oZXJpdGFuY2VBdHRyOjpTcGVsbGluZyBJbmhlcml0YW5jZU1vZGVsOworCisgICAgICAgICAgICBzd2l0Y2ggKE1TUG9pbnRlclRvTWVtYmVyUmVwcmVzZW50YXRpb25NZXRob2QpIHsKKyAgICAgICAgICAgIGNhc2UgTGFuZ09wdGlvbnM6OlBQVE1LX0Jlc3RDYXNlOgorICAgICAgICAgICAgICBJbmhlcml0YW5jZU1vZGVsID0gUkQtPmNhbGN1bGF0ZUluaGVyaXRhbmNlTW9kZWwoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExhbmdPcHRpb25zOjpQUFRNS19GdWxsR2VuZXJhbGl0eVNpbmdsZUluaGVyaXRhbmNlOgorICAgICAgICAgICAgICBJbmhlcml0YW5jZU1vZGVsID0gTVNJbmhlcml0YW5jZUF0dHI6OktleXdvcmRfc2luZ2xlX2luaGVyaXRhbmNlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTGFuZ09wdGlvbnM6OlBQVE1LX0Z1bGxHZW5lcmFsaXR5TXVsdGlwbGVJbmhlcml0YW5jZToKKyAgICAgICAgICAgICAgSW5oZXJpdGFuY2VNb2RlbCA9CisgICAgICAgICAgICAgICAgICBNU0luaGVyaXRhbmNlQXR0cjo6S2V5d29yZF9tdWx0aXBsZV9pbmhlcml0YW5jZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExhbmdPcHRpb25zOjpQUFRNS19GdWxsR2VuZXJhbGl0eVZpcnR1YWxJbmhlcml0YW5jZToKKyAgICAgICAgICAgICAgSW5oZXJpdGFuY2VNb2RlbCA9CisgICAgICAgICAgICAgICAgICBNU0luaGVyaXRhbmNlQXR0cjo6S2V5d29yZF91bnNwZWNpZmllZF9pbmhlcml0YW5jZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFJELT5hZGRBdHRyKE1TSW5oZXJpdGFuY2VBdHRyOjpDcmVhdGVJbXBsaWNpdCgKKyAgICAgICAgICAgICAgICBnZXRBU1RDb250ZXh0KCksIEluaGVyaXRhbmNlTW9kZWwsCisgICAgICAgICAgICAgICAgLypCZXN0Q2FzZT0qL01TUG9pbnRlclRvTWVtYmVyUmVwcmVzZW50YXRpb25NZXRob2QgPT0KKyAgICAgICAgICAgICAgICAgICAgTGFuZ09wdGlvbnM6OlBQVE1LX0Jlc3RDYXNlLAorICAgICAgICAgICAgICAgIEltcGxpY2l0TVNJbmhlcml0YW5jZUF0dHJMb2MuaXNWYWxpZCgpCisgICAgICAgICAgICAgICAgICAgID8gSW1wbGljaXRNU0luaGVyaXRhbmNlQXR0ckxvYworICAgICAgICAgICAgICAgICAgICA6IFJELT5nZXRTb3VyY2VSYW5nZSgpKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKQEAgLTUzMTAsMjkgKzUzMjUsMjYgQEAKICAgaWYgKFJELT5nZXROdW1WQmFzZXMoKSkgewogICAgIERpYWcoUkQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfbm9uX2xpdGVyYWxfdmlydHVhbF9iYXNlKQogICAgICAgPDwgZ2V0TGl0ZXJhbERpYWdGcm9tVGFnS2luZChSRC0+Z2V0VGFnS2luZCgpKSA8PCBSRC0+Z2V0TnVtVkJhc2VzKCk7Ci0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpiYXNlX2NsYXNzX2NvbnN0X2l0ZXJhdG9yIEkgPSBSRC0+dmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgIEUgPSBSRC0+dmJhc2VzX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICAgIERpYWcoSS0+Z2V0TG9jU3RhcnQoKSwKLSAgICAgICAgICAgZGlhZzo6bm90ZV9jb25zdGV4cHJfdmlydHVhbF9iYXNlX2hlcmUpIDw8IEktPmdldFNvdXJjZVJhbmdlKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogUkQtPnZiYXNlcygpKQorICAgICAgRGlhZyhJLmdldExvY1N0YXJ0KCksIGRpYWc6Om5vdGVfY29uc3RleHByX3ZpcnR1YWxfYmFzZV9oZXJlKQorICAgICAgICAgIDw8IEkuZ2V0U291cmNlUmFuZ2UoKTsKICAgfSBlbHNlIGlmICghUkQtPmlzQWdncmVnYXRlKCkgJiYgIVJELT5oYXNDb25zdGV4cHJOb25Db3B5TW92ZUNvbnN0cnVjdG9yKCkgJiYKICAgICAgICAgICAgICAhUkQtPmhhc1RyaXZpYWxEZWZhdWx0Q29uc3RydWN0b3IoKSkgewogICAgIERpYWcoUkQtPmdldExvY2F0aW9uKCksIGRpYWc6Om5vdGVfbm9uX2xpdGVyYWxfbm9fY29uc3RleHByX2N0b3JzKSA8PCBSRDsKICAgfSBlbHNlIGlmIChSRC0+aGFzTm9uTGl0ZXJhbFR5cGVGaWVsZHNPckJhc2VzKCkpIHsKLSAgICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFJELT5iYXNlc19iZWdpbigpLAotICAgICAgICAgRSA9IFJELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIGlmICghSS0+Z2V0VHlwZSgpLT5pc0xpdGVyYWxUeXBlKENvbnRleHQpKSB7Ci0gICAgICAgIERpYWcoSS0+Z2V0TG9jU3RhcnQoKSwKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBSRC0+YmFzZXMoKSkgeworICAgICAgaWYgKCFJLmdldFR5cGUoKS0+aXNMaXRlcmFsVHlwZShDb250ZXh0KSkgeworICAgICAgICBEaWFnKEkuZ2V0TG9jU3RhcnQoKSwKICAgICAgICAgICAgICBkaWFnOjpub3RlX25vbl9saXRlcmFsX2Jhc2VfY2xhc3MpCi0gICAgICAgICAgPDwgUkQgPDwgSS0+Z2V0VHlwZSgpIDw8IEktPmdldFNvdXJjZVJhbmdlKCk7CisgICAgICAgICAgPDwgUkQgPDwgSS5nZXRUeXBlKCkgPDwgSS5nZXRTb3VyY2VSYW5nZSgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChDWFhSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBJID0gUkQtPmZpZWxkX2JlZ2luKCksCi0gICAgICAgICBFID0gUkQtPmZpZWxkX2VuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGZvciAoY29uc3QgYXV0byAqSSA6IFJELT5maWVsZHMoKSkgewogICAgICAgaWYgKCFJLT5nZXRUeXBlKCktPmlzTGl0ZXJhbFR5cGUoQ29udGV4dCkgfHwKICAgICAgICAgICBJLT5nZXRUeXBlKCkuaXNWb2xhdGlsZVF1YWxpZmllZCgpKSB7CiAgICAgICAgIERpYWcoSS0+Z2V0TG9jYXRpb24oKSwgZGlhZzo6bm90ZV9ub25fbGl0ZXJhbF9maWVsZCkKLSAgICAgICAgICA8PCBSRCA8PCAqSSA8PCBJLT5nZXRUeXBlKCkKKyAgICAgICAgICA8PCBSRCA8PCBJIDw8IEktPmdldFR5cGUoKQogICAgICAgICAgIDw8IEktPmdldFR5cGUoKS5pc1ZvbGF0aWxlUXVhbGlmaWVkKCk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQpAQCAtNTM2OCw3ICs1MzgwLDcgQEAKICAgICByZXR1cm4gVDsKICAgTmVzdGVkTmFtZVNwZWNpZmllciAqTk5TOwogICBpZiAoU1MuaXNWYWxpZCgpKQotICAgIE5OUyA9IHN0YXRpY19jYXN0PE5lc3RlZE5hbWVTcGVjaWZpZXIgKj4oU1MuZ2V0U2NvcGVSZXAoKSk7CisgICAgTk5TID0gU1MuZ2V0U2NvcGVSZXAoKTsKICAgZWxzZSB7CiAgICAgaWYgKEtleXdvcmQgPT0gRVRLX05vbmUpCiAgICAgICByZXR1cm4gVDsKZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1RhcmdldEF0dHJpYnV0ZXNTZW1hLmNwcCBiL2xpYi9TZW1hL1RhcmdldEF0dHJpYnV0ZXNTZW1hLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwNjdkZS4uMDAwMDAwMAotLS0gYS9saWIvU2VtYS9UYXJnZXRBdHRyaWJ1dGVzU2VtYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLy89PT0tLSBUYXJnZXRBdHRyaWJ1dGVzU2VtYS5jcHAgLSBFbmNhcHN1bGF0ZSB0YXJnZXQgYXR0cmlidXRlcy0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgc2VtYW50aWMgYW5hbHlzaXMgaW1wbGVtZW50YXRpb24gZm9yIHRhcmdldC1zcGVjaWZpYwotLy8gYXR0cmlidXRlcy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaW5jbHVkZSAiVGFyZ2V0QXR0cmlidXRlc1NlbWEuaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgotI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1RhcmdldEluZm8uaCIKLSNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWFJbnRlcm5hbC5oIgotI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgotCi11c2luZyBuYW1lc3BhY2UgY2xhbmc7Ci0KLVRhcmdldEF0dHJpYnV0ZXNTZW1hOjp+VGFyZ2V0QXR0cmlidXRlc1NlbWEoKSB7fQotYm9vbCBUYXJnZXRBdHRyaWJ1dGVzU2VtYTo6UHJvY2Vzc0RlY2xBdHRyaWJ1dGUoU2NvcGUgKnNjb3BlLCBEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgU2VtYSAmUykgY29uc3QgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIEhhbmRsZUFSTUludGVycnVwdEF0dHIoRGVjbCAqZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgU2VtYSAmUykgewotICAvLyBDaGVjayB0aGUgYXR0cmlidXRlIGFyZ3VtZW50cy4KLSAgaWYgKEF0dHIuZ2V0TnVtQXJncygpID4gMSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3Rvb19tYW55X2FyZ3VtZW50cykKLSAgICAgICAgPDwgMTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBTdHJpbmdSZWYgU3RyOwotICBTb3VyY2VMb2NhdGlvbiBBcmdMb2M7Ci0KLSAgaWYgKEF0dHIuZ2V0TnVtQXJncygpID09IDApCi0gICAgU3RyID0gIiI7Ci0gIGVsc2UgaWYgKCFTLmNoZWNrU3RyaW5nTGl0ZXJhbEFyZ3VtZW50QXR0cihBdHRyLCAwLCBTdHIsICZBcmdMb2MpKQotICAgIHJldHVybjsKLQotICBBUk1JbnRlcnJ1cHRBdHRyOjpJbnRlcnJ1cHRUeXBlIEtpbmQ7Ci0gIGlmICghQVJNSW50ZXJydXB0QXR0cjo6Q29udmVydFN0clRvSW50ZXJydXB0VHlwZShTdHIsIEtpbmQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3R5cGVfbm90X3N1cHBvcnRlZCkKLSAgICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgU3RyIDw8IEFyZ0xvYzsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1bnNpZ25lZCBJbmRleCA9IEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKTsKLSAgZC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KQotICAgICAgICAgICAgIEFSTUludGVycnVwdEF0dHIoQXR0ci5nZXRMb2MoKSwgUy5Db250ZXh0LCBLaW5kLCBJbmRleCkpOwotfQotCi1uYW1lc3BhY2UgewotICBjbGFzcyBBUk1BdHRyaWJ1dGVzU2VtYSA6IHB1YmxpYyBUYXJnZXRBdHRyaWJ1dGVzU2VtYSB7Ci0gIHB1YmxpYzoKLSAgICBBUk1BdHRyaWJ1dGVzU2VtYSgpIHsgfQotICAgIGJvb2wgUHJvY2Vzc0RlY2xBdHRyaWJ1dGUoU2NvcGUgKnNjb3BlLCBEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgU2VtYSAmUykgY29uc3QgewotICAgICAgaWYgKEF0dHIuZ2V0TmFtZSgpLT5nZXROYW1lKCkgPT0gImludGVycnVwdCIpIHsKLSAgICAgICAgSGFuZGxlQVJNSW50ZXJydXB0QXR0cihELCBBdHRyLCBTKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9OwotfQotCi1zdGF0aWMgdm9pZCBIYW5kbGVNU1A0MzBJbnRlcnJ1cHRBdHRyKERlY2wgKmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIFNlbWEgJlMpIHsKLSAgICAvLyBDaGVjayB0aGUgYXR0cmlidXRlIGFyZ3VtZW50cy4KLSAgICBpZiAoQXR0ci5nZXROdW1BcmdzKCkgIT0gMSkgewotICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfd3JvbmdfbnVtYmVyX2FyZ3VtZW50cykKLSAgICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogQ2hlY2sgZm9yIGRlY2wgLSBpdCBzaG91bGQgYmUgdm9pZCAoKSh2b2lkKS4KLQotICAgIEV4cHIgKk51bVBhcmFtc0V4cHIgPSBzdGF0aWNfY2FzdDxFeHByICo+KEF0dHIuZ2V0QXJnQXNFeHByKDApKTsKLSAgICBsbHZtOjpBUFNJbnQgTnVtUGFyYW1zKDMyKTsKLSAgICBpZiAoIU51bVBhcmFtc0V4cHItPmlzSW50ZWdlckNvbnN0YW50RXhwcihOdW1QYXJhbXMsIFMuQ29udGV4dCkpIHsKLSAgICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX2FyZ3VtZW50X3R5cGUpCi0gICAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IEFBTlRfQXJndW1lbnRJbnRlZ2VyQ29uc3RhbnQKLSAgICAgICAgPDwgTnVtUGFyYW1zRXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBOdW0gPSBOdW1QYXJhbXMuZ2V0TGltaXRlZFZhbHVlKDI1NSk7Ci0gICAgaWYgKChOdW0gJiAxKSB8fCBOdW0gPiAzMCkgewotICAgICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6OmVycl9hdHRyaWJ1dGVfYXJndW1lbnRfb3V0X29mX2JvdW5kcykKLSAgICAgICAgPDwgImludGVycnVwdCIgPDwgKGludClOdW1QYXJhbXMuZ2V0U0V4dFZhbHVlKCkKLSAgICAgICAgPDwgTnVtUGFyYW1zRXhwci0+Z2V0U291cmNlUmFuZ2UoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkLT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpIE1TUDQzMEludGVycnVwdEF0dHIoQXR0ci5nZXRMb2MoKSwgUy5Db250ZXh0LCBOdW0pKTsKLSAgICBkLT5hZGRBdHRyKDo6bmV3IChTLkNvbnRleHQpIFVzZWRBdHRyKEF0dHIuZ2V0TG9jKCksIFMuQ29udGV4dCkpOwotICB9Ci0KLW5hbWVzcGFjZSB7Ci0gIGNsYXNzIE1TUDQzMEF0dHJpYnV0ZXNTZW1hIDogcHVibGljIFRhcmdldEF0dHJpYnV0ZXNTZW1hIHsKLSAgcHVibGljOgotICAgIE1TUDQzMEF0dHJpYnV0ZXNTZW1hKCkgeyB9Ci0gICAgYm9vbCBQcm9jZXNzRGVjbEF0dHJpYnV0ZShTY29wZSAqc2NvcGUsIERlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBTZW1hICZTKSBjb25zdCB7Ci0gICAgICBpZiAoQXR0ci5nZXROYW1lKCktPmdldE5hbWUoKSA9PSAiaW50ZXJydXB0IikgewotICAgICAgICBIYW5kbGVNU1A0MzBJbnRlcnJ1cHRBdHRyKEQsIEF0dHIsIFMpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH07Ci19Ci0KLXN0YXRpYyB2b2lkIEhhbmRsZVg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0cihEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZUxpc3QmIEF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYSAmUykgewotICAvLyBDaGVjayB0aGUgYXR0cmlidXRlIGFyZ3VtZW50cy4KLSAgaWYgKEF0dHIuZ2V0TnVtQXJncygpICE9IDApIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19udW1iZXJfYXJndW1lbnRzKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMDsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBJZiB3ZSB0cnkgdG8gYXBwbHkgaXQgdG8gYSBmdW5jdGlvbiBwb2ludGVyLCBkb24ndCB3YXJuLCBidXQgZG9uJ3QKLSAgLy8gZG8gYW55dGhpbmcsIGVpdGhlci4gSXQgZG9lc24ndCBtYXR0ZXIgYW55d2F5LCBiZWNhdXNlIHRoZXJlJ3Mgbm90aGluZwotICAvLyBzcGVjaWFsIGFib3V0IGNhbGxpbmcgYSBmb3JjZV9hbGlnbl9hcmdfcG9pbnRlciBmdW5jdGlvbi4KLSAgVmFsdWVEZWNsICpWRCA9IGR5bl9jYXN0PFZhbHVlRGVjbD4oRCk7Ci0gIGlmIChWRCAmJiBWRC0+Z2V0VHlwZSgpLT5pc0Z1bmN0aW9uUG9pbnRlclR5cGUoKSkKLSAgICByZXR1cm47Ci0gIC8vIEFsc28gZG9uJ3Qgd2FybiBvbiBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWZzLgotICBUeXBlZGVmTmFtZURlY2wgKlREID0gZHluX2Nhc3Q8VHlwZWRlZk5hbWVEZWNsPihEKTsKLSAgaWYgKFREICYmIChURC0+Z2V0VW5kZXJseWluZ1R5cGUoKS0+aXNGdW5jdGlvblBvaW50ZXJUeXBlKCkgfHwKLSAgICAgICAgICAgICBURC0+Z2V0VW5kZXJseWluZ1R5cGUoKS0+aXNGdW5jdGlvblR5cGUoKSkpCi0gICAgcmV0dXJuOwotICAvLyBBdHRyaWJ1dGUgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBmdW5jdGlvbiB0eXBlcy4KLSAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAvKiBmdW5jdGlvbiAqLzA7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KSBYODZGb3JjZUFsaWduQXJnUG9pbnRlckF0dHIoQXR0ci5nZXRSYW5nZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLkNvbnRleHQpKTsKLX0KLQotRExMSW1wb3J0QXR0ciAqU2VtYTo6bWVyZ2VETExJbXBvcnRBdHRyKERlY2wgKkQsIFNvdXJjZVJhbmdlIFJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJTcGVsbGluZ0xpc3RJbmRleCkgewotICBpZiAoRC0+aGFzQXR0cjxETExFeHBvcnRBdHRyPigpKSB7Ci0gICAgRGlhZyhSYW5nZS5nZXRCZWdpbigpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCAiZGxsaW1wb3J0IjsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChELT5oYXNBdHRyPERMTEltcG9ydEF0dHI+KCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oRCkpIHsKLSAgICBpZiAoVkQtPmhhc0RlZmluaXRpb24oKSkgewotICAgICAgLy8gZGxsaW1wb3J0IGNhbm5vdCBiZSBhcHBsaWVkIHRvIGRlZmluaXRpb25zLgotICAgICAgRGlhZyhELT5nZXRMb2NhdGlvbigpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pbnZhbGlkX29uX2RlZmluaXRpb24pCi0gICAgICAgIDw8ICJkbGxpbXBvcnQiOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDo6bmV3IChDb250ZXh0KSBETExJbXBvcnRBdHRyKFJhbmdlLCBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0clNwZWxsaW5nTGlzdEluZGV4KTsKLX0KLQotc3RhdGljIHZvaWQgSGFuZGxlRExMSW1wb3J0QXR0cihEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBTZW1hICZTKSB7Ci0gIC8vIGNoZWNrIHRoZSBhdHRyaWJ1dGUgYXJndW1lbnRzLgotICBpZiAoQXR0ci5nZXROdW1BcmdzKCkgIT0gMCkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX251bWJlcl9hcmd1bWVudHMpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAwOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEF0dHJpYnV0ZSBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIGZ1bmN0aW9ucyBvciB2YXJpYWJsZXMuCi0gIEZ1bmN0aW9uRGVjbCAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEQpOwotICBpZiAoIUZEICYmICFpc2E8VmFyRGVjbD4oRCkpIHsKLSAgICAvLyBBcHBhcmVudGx5IFZpc3VhbCBDKysgdGhpbmtzIGl0IGlzIG9rYXkgdG8gbm90IGVtaXQgYSB3YXJuaW5nCi0gICAgLy8gaW4gdGhpcyBjYXNlLCBzbyBvbmx5IGVtaXQgYSB3YXJuaW5nIHdoZW4gLWZtcy1leHRlbnNpb25zIGlzIG5vdAotICAgIC8vIHNwZWNpZmllZC4KLSAgICBpZiAoIVMuZ2V0TGFuZ09wdHMoKS5NaWNyb3NvZnRFeHQpCi0gICAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlKQotICAgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAyIC8qdmFyaWFibGUgYW5kIGZ1bmN0aW9uKi87Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQ3VycmVudGx5LCB0aGUgZGxsaW1wb3J0IGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGZvciBpbmxpbmVkIGZ1bmN0aW9ucy4KLSAgLy8gV2FybmluZyBpcyBlbWl0dGVkLgotICBpZiAoRkQgJiYgRkQtPmlzSW5saW5lU3BlY2lmaWVkKCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCkgPDwgImRsbGltcG9ydCI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdW5zaWduZWQgSW5kZXggPSBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCk7Ci0gIERMTEltcG9ydEF0dHIgKk5ld0F0dHIgPSBTLm1lcmdlRExMSW1wb3J0QXR0cihELCBBdHRyLmdldFJhbmdlKCksIEluZGV4KTsKLSAgaWYgKE5ld0F0dHIpCi0gICAgRC0+YWRkQXR0cihOZXdBdHRyKTsKLX0KLQotRExMRXhwb3J0QXR0ciAqU2VtYTo6bWVyZ2VETExFeHBvcnRBdHRyKERlY2wgKkQsIFNvdXJjZVJhbmdlIFJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJTcGVsbGluZ0xpc3RJbmRleCkgewotICBpZiAoRExMSW1wb3J0QXR0ciAqSW1wb3J0ID0gRC0+Z2V0QXR0cjxETExJbXBvcnRBdHRyPigpKSB7Ci0gICAgRGlhZyhJbXBvcnQtPmdldExvY2F0aW9uKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX2lnbm9yZWQpIDw8ICJkbGxpbXBvcnQiOwotICAgIEQtPmRyb3BBdHRyPERMTEltcG9ydEF0dHI+KCk7Ci0gIH0KLQotICBpZiAoRC0+aGFzQXR0cjxETExFeHBvcnRBdHRyPigpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiA6Om5ldyAoQ29udGV4dCkgRExMRXhwb3J0QXR0cihSYW5nZSwgQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJTcGVsbGluZ0xpc3RJbmRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEhhbmRsZURMTEV4cG9ydEF0dHIoRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgU2VtYSAmUykgewotICAvLyBjaGVjayB0aGUgYXR0cmlidXRlIGFyZ3VtZW50cy4KLSAgaWYgKEF0dHIuZ2V0TnVtQXJncygpICE9IDApIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19udW1iZXJfYXJndW1lbnRzKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMDsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBBdHRyaWJ1dGUgY2FuIGJlIGFwcGxpZWQgb25seSB0byBmdW5jdGlvbnMgb3IgdmFyaWFibGVzLgotICBGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihEKTsKLSAgaWYgKCFGRCAmJiAhaXNhPFZhckRlY2w+KEQpKSB7Ci0gICAgUy5EaWFnKEF0dHIuZ2V0TG9jKCksIGRpYWc6Ondhcm5fYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IDIgLyp2YXJpYWJsZSBhbmQgZnVuY3Rpb24qLzsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBDdXJyZW50bHksIHRoZSBkbGxleHBvcnQgYXR0cmlidXRlIGlzIGlnbm9yZWQgZm9yIGlubGluZWQgZnVuY3Rpb25zLCB1bmxlc3MKLSAgLy8gdGhlIC1ma2VlcC1pbmxpbmUtZnVuY3Rpb25zIGZsYWcgaGFzIGJlZW4gdXNlZC4gV2FybmluZyBpcyBlbWl0dGVkOwotICBpZiAoRkQgJiYgRkQtPmlzSW5saW5lU3BlY2lmaWVkKCkpIHsKLSAgICAvLyBGSVhNRTogLi4uIHVubGVzcyB0aGUgLWZrZWVwLWlubGluZS1mdW5jdGlvbnMgZmxhZyBoYXMgYmVlbiB1c2VkLgotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjp3YXJuX2F0dHJpYnV0ZV9pZ25vcmVkKSA8PCAiZGxsZXhwb3J0IjsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1bnNpZ25lZCBJbmRleCA9IEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKTsKLSAgRExMRXhwb3J0QXR0ciAqTmV3QXR0ciA9IFMubWVyZ2VETExFeHBvcnRBdHRyKEQsIEF0dHIuZ2V0UmFuZ2UoKSwgSW5kZXgpOwotICBpZiAoTmV3QXR0cikKLSAgICBELT5hZGRBdHRyKE5ld0F0dHIpOwotfQotCi1uYW1lc3BhY2UgewotICBjbGFzcyBYODZBdHRyaWJ1dGVzU2VtYSA6IHB1YmxpYyBUYXJnZXRBdHRyaWJ1dGVzU2VtYSB7Ci0gIHB1YmxpYzoKLSAgICBYODZBdHRyaWJ1dGVzU2VtYSgpIHsgfQotICAgIGJvb2wgUHJvY2Vzc0RlY2xBdHRyaWJ1dGUoU2NvcGUgKnNjb3BlLCBEZWNsICpELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgU2VtYSAmUykgY29uc3QgewotICAgICAgY29uc3QgbGx2bTo6VHJpcGxlICZUcmlwbGUoUy5Db250ZXh0LmdldFRhcmdldEluZm8oKS5nZXRUcmlwbGUoKSk7Ci0gICAgICBpZiAoVHJpcGxlLmdldE9TKCkgPT0gbGx2bTo6VHJpcGxlOjpXaW4zMiB8fAotICAgICAgICAgIFRyaXBsZS5nZXRPUygpID09IGxsdm06OlRyaXBsZTo6TWluR1czMikgewotICAgICAgICBzd2l0Y2ggKEF0dHIuZ2V0S2luZCgpKSB7Ci0gICAgICAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfRExMSW1wb3J0OiBIYW5kbGVETExJbXBvcnRBdHRyKEQsIEF0dHIsIFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgQXR0cmlidXRlTGlzdDo6QVRfRExMRXhwb3J0OiBIYW5kbGVETExFeHBvcnRBdHRyKEQsIEF0dHIsIFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKFRyaXBsZS5nZXRBcmNoKCkgIT0gbGx2bTo6VHJpcGxlOjp4ODZfNjQgJiYKLSAgICAgICAgICAoQXR0ci5nZXROYW1lKCktPmdldE5hbWUoKSA9PSAiZm9yY2VfYWxpZ25fYXJnX3BvaW50ZXIiIHx8Ci0gICAgICAgICAgIEF0dHIuZ2V0TmFtZSgpLT5nZXROYW1lKCkgPT0gIl9fZm9yY2VfYWxpZ25fYXJnX3BvaW50ZXJfXyIpKSB7Ci0gICAgICAgIEhhbmRsZVg4NkZvcmNlQWxpZ25BcmdQb2ludGVyQXR0cihELCBBdHRyLCBTKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9OwotfQotCi1zdGF0aWMgdm9pZCBIYW5kbGVNaXBzMTZBdHRyKERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsIFNlbWEgJlMpIHsKLSAgLy8gY2hlY2sgdGhlIGF0dHJpYnV0ZSBhcmd1bWVudHMuCi0gIGlmIChBdHRyLmdldE51bUFyZ3MoKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX251bWJlcl9hcmd1bWVudHMpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAwOwotICAgIHJldHVybjsKLSAgfQotICAvLyBBdHRyaWJ1dGUgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBmdW5jdGlvbiB0eXBlcy4KLSAgaWYgKCFpc2E8RnVuY3Rpb25EZWNsPihEKSkgewotICAgIFMuRGlhZyhBdHRyLmdldExvYygpLCBkaWFnOjplcnJfYXR0cmlidXRlX3dyb25nX2RlY2xfdHlwZSkKLSAgICAgIDw8IEF0dHIuZ2V0TmFtZSgpIDw8IC8qIGZ1bmN0aW9uICovMDsKLSAgICByZXR1cm47Ci0gIH0KLSAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KSBNaXBzMTZBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEhhbmRsZU5vTWlwczE2QXR0cihEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyLCBTZW1hICZTKSB7Ci0gIC8vIGNoZWNrIHRoZSBhdHRyaWJ1dGUgYXJndW1lbnRzLgotICBpZiAoQXR0ci5nZXROdW1BcmdzKCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19udW1iZXJfYXJndW1lbnRzKQotICAgICAgPDwgQXR0ci5nZXROYW1lKCkgPDwgMDsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gQXR0cmlidXRlIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gZnVuY3Rpb24gdHlwZXMuCi0gIGlmICghaXNhPEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6ZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUpCi0gICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAvKiBmdW5jdGlvbiAqLzA7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEQtPmFkZEF0dHIoOjpuZXcgKFMuQ29udGV4dCkKLSAgICAgICAgICAgICBOb01pcHMxNkF0dHIoQXR0ci5nZXRSYW5nZSgpLCBTLkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIuZ2V0QXR0cmlidXRlU3BlbGxpbmdMaXN0SW5kZXgoKSkpOwotfQotCi1uYW1lc3BhY2UgewotICBjbGFzcyBNaXBzQXR0cmlidXRlc1NlbWEgOiBwdWJsaWMgVGFyZ2V0QXR0cmlidXRlc1NlbWEgewotICBwdWJsaWM6Ci0gICAgTWlwc0F0dHJpYnV0ZXNTZW1hKCkgeyB9Ci0gICAgYm9vbCBQcm9jZXNzRGVjbEF0dHJpYnV0ZShTY29wZSAqc2NvcGUsIERlY2wgKkQsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hICZTKSBjb25zdCB7Ci0gICAgICBpZiAoQXR0ci5nZXROYW1lKCktPmdldE5hbWUoKSA9PSAibWlwczE2IikgewotICAgICAgICBIYW5kbGVNaXBzMTZBdHRyKEQsIEF0dHIsIFMpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoQXR0ci5nZXROYW1lKCktPmdldE5hbWUoKSA9PSAibm9taXBzMTYiKSB7Ci0gICAgICAgIEhhbmRsZU5vTWlwczE2QXR0cihELCBBdHRyLCBTKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9OwotfQotCi1jb25zdCBUYXJnZXRBdHRyaWJ1dGVzU2VtYSAmU2VtYTo6Z2V0VGFyZ2V0QXR0cmlidXRlc1NlbWEoKSBjb25zdCB7Ci0gIGlmIChUaGVUYXJnZXRBdHRyaWJ1dGVzU2VtYSkKLSAgICByZXR1cm4gKlRoZVRhcmdldEF0dHJpYnV0ZXNTZW1hOwotCi0gIGNvbnN0IGxsdm06OlRyaXBsZSAmVHJpcGxlKENvbnRleHQuZ2V0VGFyZ2V0SW5mbygpLmdldFRyaXBsZSgpKTsKLSAgc3dpdGNoIChUcmlwbGUuZ2V0QXJjaCgpKSB7Ci0gIGNhc2UgbGx2bTo6VHJpcGxlOjphcm06Ci0gIGNhc2UgbGx2bTo6VHJpcGxlOjp0aHVtYjoKLSAgICByZXR1cm4gKihUaGVUYXJnZXRBdHRyaWJ1dGVzU2VtYSA9IG5ldyBBUk1BdHRyaWJ1dGVzU2VtYSk7Ci0gIGNhc2UgbGx2bTo6VHJpcGxlOjptc3A0MzA6Ci0gICAgcmV0dXJuICooVGhlVGFyZ2V0QXR0cmlidXRlc1NlbWEgPSBuZXcgTVNQNDMwQXR0cmlidXRlc1NlbWEpOwotICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2OgotICBjYXNlIGxsdm06OlRyaXBsZTo6eDg2XzY0OgotICAgIHJldHVybiAqKFRoZVRhcmdldEF0dHJpYnV0ZXNTZW1hID0gbmV3IFg4NkF0dHJpYnV0ZXNTZW1hKTsKLSAgY2FzZSBsbHZtOjpUcmlwbGU6Om1pcHM6Ci0gIGNhc2UgbGx2bTo6VHJpcGxlOjptaXBzZWw6Ci0gICAgcmV0dXJuICooVGhlVGFyZ2V0QXR0cmlidXRlc1NlbWEgPSBuZXcgTWlwc0F0dHJpYnV0ZXNTZW1hKTsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gKihUaGVUYXJnZXRBdHRyaWJ1dGVzU2VtYSA9IG5ldyBUYXJnZXRBdHRyaWJ1dGVzU2VtYSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1RhcmdldEF0dHJpYnV0ZXNTZW1hLmggYi9saWIvU2VtYS9UYXJnZXRBdHRyaWJ1dGVzU2VtYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTBjOTAwLi4wMDAwMDAwCi0tLSBhL2xpYi9TZW1hL1RhcmdldEF0dHJpYnV0ZXNTZW1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLz09PS0tLSBUYXJnZXRBdHRyaWJ1dGVzU2VtYS5oIC0gU2VtYW50aWMgQW5hbHlzaXMgRm9yIFRhcmdldCBBdHRyaWJ1dGVzIC09PT0vLwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKLS8vCi0vLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLS8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLS8vCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotCi0jaWZuZGVmIENMQU5HX1NFTUFfVEFSR0VUU0VNQV9ICi0jZGVmaW5lIENMQU5HX1NFTUFfVEFSR0VUU0VNQV9ICi0KLW5hbWVzcGFjZSBjbGFuZyB7Ci0gIGNsYXNzIFNjb3BlOwotICBjbGFzcyBEZWNsOwotICBjbGFzcyBBdHRyaWJ1dGVMaXN0OwotICBjbGFzcyBTZW1hOwotCi0gIGNsYXNzIFRhcmdldEF0dHJpYnV0ZXNTZW1hIHsKLSAgcHVibGljOgotICAgIHZpcnR1YWwgflRhcmdldEF0dHJpYnV0ZXNTZW1hKCk7Ci0gICAgdmlydHVhbCBib29sIFByb2Nlc3NEZWNsQXR0cmlidXRlKFNjb3BlICpzY29wZSwgRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgU2VtYSAmUykgY29uc3Q7Ci0gIH07Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL1NlbWEvVHJlZVRyYW5zZm9ybS5oIGIvbGliL1NlbWEvVHJlZVRyYW5zZm9ybS5oCmluZGV4IDQzNTFjMjUuLmY3OGZjYTcgMTAwNjQ0Ci0tLSBhL2xpYi9TZW1hL1RyZWVUcmFuc2Zvcm0uaAorKysgYi9saWIvU2VtYS9UcmVlVHJhbnNmb3JtLmgKQEAgLTYwNyw2ICs2MDcsNyBAQAogICBFeHByUmVzdWx0IFRyYW5zZm9ybUFkZHJlc3NPZk9wZXJhbmQoRXhwciAqRSk7CiAgIEV4cHJSZXN1bHQgVHJhbnNmb3JtRGVwZW5kZW50U2NvcGVEZWNsUmVmRXhwcihEZXBlbmRlbnRTY29wZURlY2xSZWZFeHByICpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0FkZHJlc3NPZk9wZXJhbmQpOworICBTdG10UmVzdWx0IFRyYW5zZm9ybU9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoT01QRXhlY3V0YWJsZURpcmVjdGl2ZSAqUyk7CiAKIC8vIEZJWE1FOiBXZSB1c2UgTExWTV9BVFRSSUJVVEVfTk9JTkxJTkUgYmVjYXVzZSBpbmxpbmluZyBjYXVzZXMgYSByaWRpY3Vsb3VzCiAvLyBhbW91bnQgb2Ygc3RhY2sgdXNhZ2Ugd2l0aCBjbGFuZy4KQEAgLTk1MSw5ICs5NTIsOCBAQAogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgLy8gRklYTUU6IFdvdWxkIGJlIG5pY2UgdG8gaGlnaGxpZ2h0IGp1c3QgdGhlIHNvdXJjZSByYW5nZS4KICAgICAgICAgICBTZW1hUmVmLkRpYWcoSWRMb2MsIGRpYWc6OmVycl9ub3RfdGFnX2luX3Njb3BlKQotICAgICAgICAgICAgPDwgS2luZCA8PCBJZCA8PCBEQzsKKyAgICAgICAgICAgICAgPDwgS2luZCA8PCBJZCA8PCBEQyA8PCBRdWFsaWZpZXJMb2MuZ2V0U291cmNlUmFuZ2UoKTsKICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIHJldHVybiBRdWFsVHlwZSgpOwpAQCAtMTI4NiwxNiArMTI4Niw1MSBAQAogICAgIHJldHVybiBnZXRTZW1hKCkuQnVpbGRPYmpDQXRUaHJvd1N0bXQoQXRMb2MsIE9wZXJhbmQpOwogICB9CiAKLSAgLy8vIFxicmllZiBCdWlsZCBhIG5ldyBPcGVuTVAgcGFyYWxsZWwgZGlyZWN0aXZlLgorICAvLy8gXGJyaWVmIEJ1aWxkIGEgbmV3IE9wZW5NUCBleGVjdXRhYmxlIGRpcmVjdGl2ZS4KICAgLy8vCiAgIC8vLyBCeSBkZWZhdWx0LCBwZXJmb3JtcyBzZW1hbnRpYyBhbmFseXNpcyB0byBidWlsZCB0aGUgbmV3IHN0YXRlbWVudC4KICAgLy8vIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgcm91dGluZSB0byBwcm92aWRlIGRpZmZlcmVudCBiZWhhdmlvci4KLSAgU3RtdFJlc3VsdCBSZWJ1aWxkT01QUGFyYWxsZWxEaXJlY3RpdmUoQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0bXQgKkFTdG10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKSB7Ci0gICAgcmV0dXJuIGdldFNlbWEoKS5BY3RPbk9wZW5NUFBhcmFsbGVsRGlyZWN0aXZlKENsYXVzZXMsIEFTdG10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydExvYywgRW5kTG9jKTsKKyAgU3RtdFJlc3VsdCBSZWJ1aWxkT01QRXhlY3V0YWJsZURpcmVjdGl2ZShPcGVuTVBEaXJlY3RpdmVLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T01QQ2xhdXNlICo+IENsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RtdCAqQVN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKSB7CisgICAgcmV0dXJuIGdldFNlbWEoKS5BY3RPbk9wZW5NUEV4ZWN1dGFibGVEaXJlY3RpdmUoS2luZCwgQ2xhdXNlcywgQVN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRMb2MsIEVuZExvYyk7CisgIH0KKworICAvLy8gXGJyaWVmIEJ1aWxkIGEgbmV3IE9wZW5NUCAnaWYnIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBCeSBkZWZhdWx0LCBwZXJmb3JtcyBzZW1hbnRpYyBhbmFseXNpcyB0byBidWlsZCB0aGUgbmV3IHN0YXRlbWVudC4KKyAgLy8vIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgcm91dGluZSB0byBwcm92aWRlIGRpZmZlcmVudCBiZWhhdmlvci4KKyAgT01QQ2xhdXNlICpSZWJ1aWxkT01QSWZDbGF1c2UoRXhwciAqQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTFBhcmVuTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpIHsKKyAgICByZXR1cm4gZ2V0U2VtYSgpLkFjdE9uT3Blbk1QSWZDbGF1c2UoQ29uZGl0aW9uLCBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBhcmVuTG9jLCBFbmRMb2MpOworICB9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhIG5ldyBPcGVuTVAgJ251bV90aHJlYWRzJyBjbGF1c2UuCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCwgcGVyZm9ybXMgc2VtYW50aWMgYW5hbHlzaXMgdG8gYnVpbGQgdGhlIG5ldyBzdGF0ZW1lbnQuCisgIC8vLyBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIHJvdXRpbmUgdG8gcHJvdmlkZSBkaWZmZXJlbnQgYmVoYXZpb3IuCisgIE9NUENsYXVzZSAqUmVidWlsZE9NUE51bVRocmVhZHNDbGF1c2UoRXhwciAqTnVtVGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gRW5kTG9jKSB7CisgICAgcmV0dXJuIGdldFNlbWEoKS5BY3RPbk9wZW5NUE51bVRocmVhZHNDbGF1c2UoTnVtVGhyZWFkcywgU3RhcnRMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBhcmVuTG9jLCBFbmRMb2MpOworICB9CisKKyAgLy8vIFxicmllZiBCdWlsZCBhIG5ldyBPcGVuTVAgJ3NhZmVsZW4nIGNsYXVzZS4KKyAgLy8vCisgIC8vLyBCeSBkZWZhdWx0LCBwZXJmb3JtcyBzZW1hbnRpYyBhbmFseXNpcyB0byBidWlsZCB0aGUgbmV3IHN0YXRlbWVudC4KKyAgLy8vIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgcm91dGluZSB0byBwcm92aWRlIGRpZmZlcmVudCBiZWhhdmlvci4KKyAgT01QQ2xhdXNlICpSZWJ1aWxkT01QU2FmZWxlbkNsYXVzZShFeHByICpMZW4sIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBFbmRMb2MpIHsKKyAgICByZXR1cm4gZ2V0U2VtYSgpLkFjdE9uT3Blbk1QU2FmZWxlbkNsYXVzZShMZW4sIFN0YXJ0TG9jLCBMUGFyZW5Mb2MsIEVuZExvYyk7CiAgIH0KIAogICAvLy8gXGJyaWVmIEJ1aWxkIGEgbmV3IE9wZW5NUCAnZGVmYXVsdCcgY2xhdXNlLgpAQCAtMTMzNSw2ICsxMzcwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRMb2MpOwogICB9CiAKKyAgLy8vIFxicmllZiBCdWlsZCBhIG5ldyBPcGVuTVAgJ3NoYXJlZCcgY2xhdXNlLgorICAvLy8KKyAgLy8vIEJ5IGRlZmF1bHQsIHBlcmZvcm1zIHNlbWFudGljIGFuYWx5c2lzIHRvIGJ1aWxkIHRoZSBuZXcgc3RhdGVtZW50LgorICAvLy8gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyByb3V0aW5lIHRvIHByb3ZpZGUgZGlmZmVyZW50IGJlaGF2aW9yLgogICBPTVBDbGF1c2UgKlJlYnVpbGRPTVBTaGFyZWRDbGF1c2UoQXJyYXlSZWY8RXhwciAqPiBWYXJMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU3RhcnRMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMUGFyZW5Mb2MsCkBAIC0xMzQzLDYgKzEzODIsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZExvYyk7CiAgIH0KIAorICAvLy8gXGJyaWVmIEJ1aWxkIGEgbmV3IE9wZW5NUCAnY29weWluJyBjbGF1c2UuCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCwgcGVyZm9ybXMgc2VtYW50aWMgYW5hbHlzaXMgdG8gYnVpbGQgdGhlIG5ldyBzdGF0ZW1lbnQuCisgIC8vLyBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIHJvdXRpbmUgdG8gcHJvdmlkZSBkaWZmZXJlbnQgYmVoYXZpb3IuCisgIE9NUENsYXVzZSAqUmVidWlsZE9NUENvcHlpbkNsYXVzZShBcnJheVJlZjxFeHByICo+IFZhckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEVuZExvYykgeworICAgIHJldHVybiBnZXRTZW1hKCkuQWN0T25PcGVuTVBDb3B5aW5DbGF1c2UoVmFyTGlzdCwgU3RhcnRMb2MsIExQYXJlbkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZExvYyk7CisgIH0KKwogICAvLy8gXGJyaWVmIFJlYnVpbGQgdGhlIG9wZXJhbmQgdG8gYW4gT2JqZWN0aXZlLUMgXEBzeW5jaHJvbml6ZWQgc3RhdGVtZW50LgogICAvLy8KICAgLy8vIEJ5IGRlZmF1bHQsIHBlcmZvcm1zIHNlbWFudGljIGFuYWx5c2lzIHRvIGJ1aWxkIHRoZSBuZXcgc3RhdGVtZW50LgpAQCAtMjEzNSwyOSArMjE4Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kKTsKICAgfQogCi0gIC8vLyBcYnJpZWYgQnVpbGQgYSBuZXcgdW5hcnkgdHlwZSB0cmFpdCBleHByZXNzaW9uLgotICAvLy8KLSAgLy8vIEJ5IGRlZmF1bHQsIHBlcmZvcm1zIHNlbWFudGljIGFuYWx5c2lzIHRvIGJ1aWxkIHRoZSBuZXcgZXhwcmVzc2lvbi4KLSAgLy8vIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgcm91dGluZSB0byBwcm92aWRlIGRpZmZlcmVudCBiZWhhdmlvci4KLSAgRXhwclJlc3VsdCBSZWJ1aWxkVW5hcnlUeXBlVHJhaXQoVW5hcnlUeXBlVHJhaXQgVHJhaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0TG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlU291cmNlSW5mbyAqVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gUlBhcmVuTG9jKSB7Ci0gICAgcmV0dXJuIGdldFNlbWEoKS5CdWlsZFVuYXJ5VHlwZVRyYWl0KFRyYWl0LCBTdGFydExvYywgVCwgUlBhcmVuTG9jKTsKLSAgfQotCi0gIC8vLyBcYnJpZWYgQnVpbGQgYSBuZXcgYmluYXJ5IHR5cGUgdHJhaXQgZXhwcmVzc2lvbi4KLSAgLy8vCi0gIC8vLyBCeSBkZWZhdWx0LCBwZXJmb3JtcyBzZW1hbnRpYyBhbmFseXNpcyB0byBidWlsZCB0aGUgbmV3IGV4cHJlc3Npb24uCi0gIC8vLyBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIHJvdXRpbmUgdG8gcHJvdmlkZSBkaWZmZXJlbnQgYmVoYXZpb3IuCi0gIEV4cHJSZXN1bHQgUmVidWlsZEJpbmFyeVR5cGVUcmFpdChCaW5hcnlUeXBlVHJhaXQgVHJhaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBTdGFydExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTb3VyY2VJbmZvICpMaHNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVNvdXJjZUluZm8gKlJoc1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBSUGFyZW5Mb2MpIHsKLSAgICByZXR1cm4gZ2V0U2VtYSgpLkJ1aWxkQmluYXJ5VHlwZVRyYWl0KFRyYWl0LCBTdGFydExvYywgTGhzVCwgUmhzVCwgUlBhcmVuTG9jKTsKLSAgfQotCiAgIC8vLyBcYnJpZWYgQnVpbGQgYSBuZXcgdHlwZSB0cmFpdCBleHByZXNzaW9uLgogICAvLy8KICAgLy8vIEJ5IGRlZmF1bHQsIHBlcmZvcm1zIHNlbWFudGljIGFuYWx5c2lzIHRvIGJ1aWxkIHRoZSBuZXcgZXhwcmVzc2lvbi4KQEAgLTI1NTUsMTEgKzI1ODMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0tfQnVpbHRpbkZuVG9GblB0cikudGFrZSgpOwogCiAgICAgLy8gQnVpbGQgdGhlIENhbGxFeHByCi0gICAgRXhwclJlc3VsdCBUaGVDYWxsID0gU2VtYVJlZi5Pd25lZCgKLSAgICAgIG5ldyAoU2VtYVJlZi5Db250ZXh0KSBDYWxsRXhwcihTZW1hUmVmLkNvbnRleHQsIENhbGxlZSwgU3ViRXhwcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbi0+Z2V0Q2FsbFJlc3VsdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByOjpnZXRWYWx1ZUtpbmRGb3JUeXBlKEJ1aWx0aW4tPmdldFJlc3VsdFR5cGUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBhcmVuTG9jKSk7CisgICAgRXhwclJlc3VsdCBUaGVDYWxsID0gU2VtYVJlZi5Pd25lZChuZXcgKFNlbWFSZWYuQ29udGV4dCkgQ2FsbEV4cHIoCisgICAgICAgIFNlbWFSZWYuQ29udGV4dCwgQ2FsbGVlLCBTdWJFeHBycywgQnVpbHRpbi0+Z2V0Q2FsbFJlc3VsdFR5cGUoKSwKKyAgICAgICAgRXhwcjo6Z2V0VmFsdWVLaW5kRm9yVHlwZShCdWlsdGluLT5nZXRSZXR1cm5UeXBlKCkpLCBSUGFyZW5Mb2MpKTsKIAogICAgIC8vIFR5cGUtY2hlY2sgdGhlIF9fYnVpbHRpbl9zaHVmZmxldmVjdG9yIGV4cHJlc3Npb24uCiAgICAgcmV0dXJuIFNlbWFSZWYuU2VtYUJ1aWx0aW5TaHVmZmxlVmVjdG9yKGNhc3Q8Q2FsbEV4cHI+KFRoZUNhbGwudGFrZSgpKSk7CkBAIC0yNjU3LDYgKzI2ODMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlIE9iamVjdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZERlY2wgKkZpcnN0UXVhbGlmaWVySW5TY29wZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWFNjb3BlU3BlYyAmU1MpOworCisgIFR5cGVTb3VyY2VJbmZvICpUcmFuc2Zvcm1UU0lJbk9iamVjdFNjb3BlKFR5cGVMb2MgVEwsIFF1YWxUeXBlIE9iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqRmlyc3RRdWFsaWZpZXJJblNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhTY29wZVNwZWMgJlNTKTsKIH07CiAKIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CkBAIC0zNTY0LDUyICszNTk0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBPYmplY3RUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWREZWNsICpVbnF1YWxMb29rdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFhTY29wZVNwZWMgJlNTKSB7Ci0gIFF1YWxUeXBlIFQgPSBUTC5nZXRUeXBlKCk7Ci0gIGlmIChnZXREZXJpdmVkKCkuQWxyZWFkeVRyYW5zZm9ybWVkKFQpKQorICBpZiAoZ2V0RGVyaXZlZCgpLkFscmVhZHlUcmFuc2Zvcm1lZChUTC5nZXRUeXBlKCkpKQogICAgIHJldHVybiBUTDsKIAotICBUeXBlTG9jQnVpbGRlciBUTEI7Ci0gIFF1YWxUeXBlIFJlc3VsdDsKLQotICBpZiAoaXNhPFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlPihUKSkgewotICAgIFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlTG9jIFNwZWNUTCA9Ci0gICAgICAgIFRMLmNhc3RBczxUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZUxvYz4oKTsKLQotICAgIFRlbXBsYXRlTmFtZSBUZW1wbGF0ZSA9Ci0gICAgICBnZXREZXJpdmVkKCkuVHJhbnNmb3JtVGVtcGxhdGVOYW1lKFNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjVEwuZ2V0VHlwZVB0cigpLT5nZXRUZW1wbGF0ZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY1RMLmdldFRlbXBsYXRlTmFtZUxvYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RUeXBlLCBVbnF1YWxMb29rdXApOwotICAgIGlmIChUZW1wbGF0ZS5pc051bGwoKSkKLSAgICAgIHJldHVybiBUeXBlTG9jKCk7Ci0KLSAgICBSZXN1bHQgPSBnZXREZXJpdmVkKCkuVHJhbnNmb3JtVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUoVExCLCBTcGVjVEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlKTsKLSAgfSBlbHNlIGlmIChpc2E8RGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGU+KFQpKSB7Ci0gICAgRGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGVMb2MgU3BlY1RMID0KLSAgICAgICAgVEwuY2FzdEFzPERlcGVuZGVudFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlTG9jPigpOwotCi0gICAgVGVtcGxhdGVOYW1lIFRlbXBsYXRlCi0gICAgICA9IGdldERlcml2ZWQoKS5SZWJ1aWxkVGVtcGxhdGVOYW1lKFNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3BlY1RMLmdldFR5cGVQdHIoKS0+Z2V0SWRlbnRpZmllcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjVEwuZ2V0VGVtcGxhdGVOYW1lTG9jKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFR5cGUsIFVucXVhbExvb2t1cCk7Ci0gICAgaWYgKFRlbXBsYXRlLmlzTnVsbCgpKQotICAgICAgcmV0dXJuIFR5cGVMb2MoKTsKLQotICAgIFJlc3VsdCA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1EZXBlbmRlbnRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZShUTEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNUTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gTm90aGluZyBzcGVjaWFsIG5lZWRzIHRvIGJlIGRvbmUgZm9yIHRoZXNlLgotICAgIFJlc3VsdCA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1UeXBlKFRMQiwgVEwpOwotICB9Ci0KLSAgaWYgKFJlc3VsdC5pc051bGwoKSkKLSAgICByZXR1cm4gVHlwZUxvYygpOwotCi0gIHJldHVybiBUTEIuZ2V0VHlwZVNvdXJjZUluZm8oU2VtYVJlZi5Db250ZXh0LCBSZXN1bHQpLT5nZXRUeXBlTG9jKCk7CisgIFR5cGVTb3VyY2VJbmZvICpUU0kgPQorICAgICAgVHJhbnNmb3JtVFNJSW5PYmplY3RTY29wZShUTCwgT2JqZWN0VHlwZSwgVW5xdWFsTG9va3VwLCBTUyk7CisgIGlmIChUU0kpCisgICAgcmV0dXJuIFRTSS0+Z2V0VHlwZUxvYygpOworICByZXR1cm4gVHlwZUxvYygpOwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgpAQCAtMzYxOCwxNiArMzYxMCwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbFR5cGUgT2JqZWN0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkRGVjbCAqVW5xdWFsTG9va3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYU2NvcGVTcGVjICZTUykgewotICAvLyBGSVhNRTogUGFpbmZ1bGx5IGNvcHktcGFzdGUgZnJvbSB0aGUgYWJvdmUhCi0KLSAgUXVhbFR5cGUgVCA9IFRTSW5mby0+Z2V0VHlwZSgpOwotICBpZiAoZ2V0RGVyaXZlZCgpLkFscmVhZHlUcmFuc2Zvcm1lZChUKSkKKyAgaWYgKGdldERlcml2ZWQoKS5BbHJlYWR5VHJhbnNmb3JtZWQoVFNJbmZvLT5nZXRUeXBlKCkpKQogICAgIHJldHVybiBUU0luZm87CiAKKyAgcmV0dXJuIFRyYW5zZm9ybVRTSUluT2JqZWN0U2NvcGUoVFNJbmZvLT5nZXRUeXBlTG9jKCksIE9iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucXVhbExvb2t1cCwgU1MpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KK1R5cGVTb3VyY2VJbmZvICpUcmVlVHJhbnNmb3JtPERlcml2ZWQ+OjpUcmFuc2Zvcm1UU0lJbk9iamVjdFNjb3BlKAorICAgIFR5cGVMb2MgVEwsIFF1YWxUeXBlIE9iamVjdFR5cGUsIE5hbWVkRGVjbCAqVW5xdWFsTG9va3VwLAorICAgIENYWFNjb3BlU3BlYyAmU1MpIHsKKyAgUXVhbFR5cGUgVCA9IFRMLmdldFR5cGUoKTsKKyAgYXNzZXJ0KCFnZXREZXJpdmVkKCkuQWxyZWFkeVRyYW5zZm9ybWVkKFQpKTsKKwogICBUeXBlTG9jQnVpbGRlciBUTEI7CiAgIFF1YWxUeXBlIFJlc3VsdDsKIAotICBUeXBlTG9jIFRMID0gVFNJbmZvLT5nZXRUeXBlTG9jKCk7CiAgIGlmIChpc2E8VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGU+KFQpKSB7CiAgICAgVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGVMb2MgU3BlY1RMID0KICAgICAgICAgVEwuY2FzdEFzPFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlTG9jPigpOwpAQCAtMzY5Myw2ICszNjkyLDEzIEBACiAgIHJldHVybiBUcmFuc2Zvcm1UeXBlU3BlY1R5cGUoVExCLCBUKTsKIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CitRdWFsVHlwZSBUcmVlVHJhbnNmb3JtPERlcml2ZWQ+OjpUcmFuc2Zvcm1BZGp1c3RlZFR5cGUoVHlwZUxvY0J1aWxkZXIgJlRMQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGp1c3RlZFR5cGVMb2MgVEwpIHsKKyAgLy8gQWRqdXN0bWVudHMgYXBwbGllZCBkdXJpbmcgdHJhbnNmb3JtYXRpb24gYXJlIGhhbmRsZWQgZWxzZXdoZXJlLgorICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYW5zZm9ybVR5cGUoVExCLCBUTC5nZXRPcmlnaW5hbExvYygpKTsKK30KKwogdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KIFF1YWxUeXBlIFRyZWVUcmFuc2Zvcm08RGVyaXZlZD46OlRyYW5zZm9ybURlY2F5ZWRUeXBlKFR5cGVMb2NCdWlsZGVyICZUTEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNheWVkVHlwZUxvYyBUTCkgewpAQCAtMzg2MSw2ICszODY3LDE0IEBACiAgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKICAgfQogCisgIC8vIElmIHdlIGhhZCB0byBhZGp1c3QgdGhlIHBvaW50ZWUgdHlwZSB3aGVuIGJ1aWxkaW5nIGEgbWVtYmVyIHBvaW50ZXIsIG1ha2UKKyAgLy8gc3VyZSB0byBwdXNoIFR5cGVMb2MgaW5mbyBmb3IgaXQuCisgIGNvbnN0IE1lbWJlclBvaW50ZXJUeXBlICpNUFQgPSBSZXN1bHQtPmdldEFzPE1lbWJlclBvaW50ZXJUeXBlPigpOworICBpZiAoTVBUICYmIFBvaW50ZWVUeXBlICE9IE1QVC0+Z2V0UG9pbnRlZVR5cGUoKSkgeworICAgIGFzc2VydChpc2E8QWRqdXN0ZWRUeXBlPihNUFQtPmdldFBvaW50ZWVUeXBlKCkpKTsKKyAgICBUTEIucHVzaDxBZGp1c3RlZFR5cGVMb2M+KE1QVC0+Z2V0UG9pbnRlZVR5cGUoKSk7CisgIH0KKwogICBNZW1iZXJQb2ludGVyVHlwZUxvYyBOZXdUTCA9IFRMQi5wdXNoPE1lbWJlclBvaW50ZXJUeXBlTG9jPihSZXN1bHQpOwogICBOZXdUTC5zZXRTaWdpbExvYyhUTC5nZXRTaWdpbExvYygpKTsKICAgTmV3VEwuc2V0Q2xhc3NUSW5mbyhOZXdDbHNUSW5mbyk7CkBAIC0zOTY2LDcgKzM5ODAsOSBAQAogICAgICAgcmV0dXJuIFF1YWxUeXBlKCk7CiAgIH0KIAotICBWYXJpYWJsZUFycmF5VHlwZUxvYyBOZXdUTCA9IFRMQi5wdXNoPFZhcmlhYmxlQXJyYXlUeXBlTG9jPihSZXN1bHQpOworICAvLyBXZSBtaWdodCBoYXZlIGNvbnN0YW50IHNpemUgYXJyYXkgbm93LCBidXQgZm9ydHVuYXRlbHkgaXQgaGFzIHRoZSBzYW1lCisgIC8vIGxvY2F0aW9uIGxheW91dC4KKyAgQXJyYXlUeXBlTG9jIE5ld1RMID0gVExCLnB1c2g8QXJyYXlUeXBlTG9jPihSZXN1bHQpOwogICBOZXdUTC5zZXRMQnJhY2tldExvYyhUTC5nZXRMQnJhY2tldExvYygpKTsKICAgTmV3VEwuc2V0UkJyYWNrZXRMb2MoVEwuZ2V0UkJyYWNrZXRMb2MoKSk7CiAgIE5ld1RMLnNldFNpemVFeHByKFNpemUpOwpAQCAtNDM5MSwxMSArNDQwNyw5IEBACiAgIFF1YWxUeXBlIFJlc3VsdFR5cGU7CiAKICAgaWYgKFQtPmhhc1RyYWlsaW5nUmV0dXJuKCkpIHsKLSAgICBpZiAoZ2V0RGVyaXZlZCgpLlRyYW5zZm9ybUZ1bmN0aW9uVHlwZVBhcmFtcyhUTC5nZXRCZWdpbkxvYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMLmdldFBhcm1BcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMLmdldE51bUFyZ3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMLmdldFR5cGVQdHIoKS0+YXJnX3R5cGVfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbVR5cGVzLCAmUGFyYW1EZWNscykpCisgICAgaWYgKGdldERlcml2ZWQoKS5UcmFuc2Zvcm1GdW5jdGlvblR5cGVQYXJhbXMoCisgICAgICAgICAgICBUTC5nZXRCZWdpbkxvYygpLCBUTC5nZXRQYXJtQXJyYXkoKSwgVEwuZ2V0TnVtUGFyYW1zKCksCisgICAgICAgICAgICBUTC5nZXRUeXBlUHRyKCktPnBhcmFtX3R5cGVfYmVnaW4oKSwgUGFyYW1UeXBlcywgJlBhcmFtRGVjbHMpKQogICAgICAgcmV0dXJuIFF1YWxUeXBlKCk7CiAKICAgICB7CkBAIC00NDA3LDMxICs0NDIxLDI5IEBACiAgICAgICAvLyAgIGRlY2xhcmF0b3IuCiAgICAgICBTZW1hOjpDWFhUaGlzU2NvcGVSQUlJIFRoaXNTY29wZShTZW1hUmVmLCBUaGlzQ29udGV4dCwgVGhpc1R5cGVRdWFscyk7CiAKLSAgICAgIFJlc3VsdFR5cGUgPSBnZXREZXJpdmVkKCkuVHJhbnNmb3JtVHlwZShUTEIsIFRMLmdldFJlc3VsdExvYygpKTsKKyAgICAgIFJlc3VsdFR5cGUgPSBnZXREZXJpdmVkKCkuVHJhbnNmb3JtVHlwZShUTEIsIFRMLmdldFJldHVybkxvYygpKTsKICAgICAgIGlmIChSZXN1bHRUeXBlLmlzTnVsbCgpKQogICAgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKICAgICB9CiAgIH0KICAgZWxzZSB7Ci0gICAgUmVzdWx0VHlwZSA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1UeXBlKFRMQiwgVEwuZ2V0UmVzdWx0TG9jKCkpOworICAgIFJlc3VsdFR5cGUgPSBnZXREZXJpdmVkKCkuVHJhbnNmb3JtVHlwZShUTEIsIFRMLmdldFJldHVybkxvYygpKTsKICAgICBpZiAoUmVzdWx0VHlwZS5pc051bGwoKSkKICAgICAgIHJldHVybiBRdWFsVHlwZSgpOwogCi0gICAgaWYgKGdldERlcml2ZWQoKS5UcmFuc2Zvcm1GdW5jdGlvblR5cGVQYXJhbXMoVEwuZ2V0QmVnaW5Mb2MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTC5nZXRQYXJtQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTC5nZXROdW1BcmdzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTC5nZXRUeXBlUHRyKCktPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1UeXBlcywgJlBhcmFtRGVjbHMpKQorICAgIGlmIChnZXREZXJpdmVkKCkuVHJhbnNmb3JtRnVuY3Rpb25UeXBlUGFyYW1zKAorICAgICAgICAgICAgVEwuZ2V0QmVnaW5Mb2MoKSwgVEwuZ2V0UGFybUFycmF5KCksIFRMLmdldE51bVBhcmFtcygpLAorICAgICAgICAgICAgVEwuZ2V0VHlwZVB0cigpLT5wYXJhbV90eXBlX2JlZ2luKCksIFBhcmFtVHlwZXMsICZQYXJhbURlY2xzKSkKICAgICAgIHJldHVybiBRdWFsVHlwZSgpOwogICB9CiAKICAgLy8gRklYTUU6IE5lZWQgdG8gdHJhbnNmb3JtIHRoZSBleGNlcHRpb24tc3BlY2lmaWNhdGlvbiB0b28uCiAKICAgUXVhbFR5cGUgUmVzdWx0ID0gVEwuZ2V0VHlwZSgpOwotICBpZiAoZ2V0RGVyaXZlZCgpLkFsd2F5c1JlYnVpbGQoKSB8fAotICAgICAgUmVzdWx0VHlwZSAhPSBULT5nZXRSZXN1bHRUeXBlKCkgfHwKLSAgICAgIFQtPmdldE51bUFyZ3MoKSAhPSBQYXJhbVR5cGVzLnNpemUoKSB8fAotICAgICAgIXN0ZDo6ZXF1YWwoVC0+YXJnX3R5cGVfYmVnaW4oKSwgVC0+YXJnX3R5cGVfZW5kKCksIFBhcmFtVHlwZXMuYmVnaW4oKSkpIHsKKyAgaWYgKGdldERlcml2ZWQoKS5BbHdheXNSZWJ1aWxkKCkgfHwgUmVzdWx0VHlwZSAhPSBULT5nZXRSZXR1cm5UeXBlKCkgfHwKKyAgICAgIFQtPmdldE51bVBhcmFtcygpICE9IFBhcmFtVHlwZXMuc2l6ZSgpIHx8CisgICAgICAhc3RkOjplcXVhbChULT5wYXJhbV90eXBlX2JlZ2luKCksIFQtPnBhcmFtX3R5cGVfZW5kKCksCisgICAgICAgICAgICAgICAgICBQYXJhbVR5cGVzLmJlZ2luKCkpKSB7CiAgICAgUmVzdWx0ID0gZ2V0RGVyaXZlZCgpLlJlYnVpbGRGdW5jdGlvblByb3RvVHlwZShSZXN1bHRUeXBlLCBQYXJhbVR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC0+Z2V0RXh0UHJvdG9JbmZvKCkpOwogICAgIGlmIChSZXN1bHQuaXNOdWxsKCkpCkBAIC00NDQzLDggKzQ0NTUsOCBAQAogICBOZXdUTC5zZXRMUGFyZW5Mb2MoVEwuZ2V0TFBhcmVuTG9jKCkpOwogICBOZXdUTC5zZXRSUGFyZW5Mb2MoVEwuZ2V0UlBhcmVuTG9jKCkpOwogICBOZXdUTC5zZXRMb2NhbFJhbmdlRW5kKFRMLmdldExvY2FsUmFuZ2VFbmQoKSk7Ci0gIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOZXdUTC5nZXROdW1BcmdzKCk7IGkgIT0gZTsgKytpKQotICAgIE5ld1RMLnNldEFyZyhpLCBQYXJhbURlY2xzW2ldKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE5ld1RMLmdldE51bVBhcmFtcygpOyBpICE9IGU7ICsraSkKKyAgICBOZXdUTC5zZXRQYXJhbShpLCBQYXJhbURlY2xzW2ldKTsKIAogICByZXR1cm4gUmVzdWx0OwogfQpAQCAtNDQ1NCwxMyArNDQ2NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVMb2NCdWlsZGVyICZUTEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Ob1Byb3RvVHlwZUxvYyBUTCkgewogICBjb25zdCBGdW5jdGlvbk5vUHJvdG9UeXBlICpUID0gVEwuZ2V0VHlwZVB0cigpOwotICBRdWFsVHlwZSBSZXN1bHRUeXBlID0gZ2V0RGVyaXZlZCgpLlRyYW5zZm9ybVR5cGUoVExCLCBUTC5nZXRSZXN1bHRMb2MoKSk7CisgIFF1YWxUeXBlIFJlc3VsdFR5cGUgPSBnZXREZXJpdmVkKCkuVHJhbnNmb3JtVHlwZShUTEIsIFRMLmdldFJldHVybkxvYygpKTsKICAgaWYgKFJlc3VsdFR5cGUuaXNOdWxsKCkpCiAgICAgcmV0dXJuIFF1YWxUeXBlKCk7CiAKICAgUXVhbFR5cGUgUmVzdWx0ID0gVEwuZ2V0VHlwZSgpOwotICBpZiAoZ2V0RGVyaXZlZCgpLkFsd2F5c1JlYnVpbGQoKSB8fAotICAgICAgUmVzdWx0VHlwZSAhPSBULT5nZXRSZXN1bHRUeXBlKCkpCisgIGlmIChnZXREZXJpdmVkKCkuQWx3YXlzUmVidWlsZCgpIHx8IFJlc3VsdFR5cGUgIT0gVC0+Z2V0UmV0dXJuVHlwZSgpKQogICAgIFJlc3VsdCA9IGdldERlcml2ZWQoKS5SZWJ1aWxkRnVuY3Rpb25Ob1Byb3RvVHlwZShSZXN1bHRUeXBlKTsKIAogICBGdW5jdGlvbk5vUHJvdG9UeXBlTG9jIE5ld1RMID0gVExCLnB1c2g8RnVuY3Rpb25Ob1Byb3RvVHlwZUxvYz4oUmVzdWx0KTsKQEAgLTUyODQsMTMgKzUyOTUsMTIgQEAKICAgYm9vbCBTdWJTdG10SW52YWxpZCA9IGZhbHNlOwogICBib29sIFN1YlN0bXRDaGFuZ2VkID0gZmFsc2U7CiAgIFNtYWxsVmVjdG9yPFN0bXQqLCA4PiBTdGF0ZW1lbnRzOwotICBmb3IgKENvbXBvdW5kU3RtdDo6Ym9keV9pdGVyYXRvciBCID0gUy0+Ym9keV9iZWdpbigpLCBCRW5kID0gUy0+Ym9keV9lbmQoKTsKLSAgICAgICBCICE9IEJFbmQ7ICsrQikgewotICAgIFN0bXRSZXN1bHQgUmVzdWx0ID0gZ2V0RGVyaXZlZCgpLlRyYW5zZm9ybVN0bXQoKkIpOworICBmb3IgKGF1dG8gKkIgOiBTLT5ib2R5KCkpIHsKKyAgICBTdG10UmVzdWx0IFJlc3VsdCA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1TdG10KEIpOwogICAgIGlmIChSZXN1bHQuaXNJbnZhbGlkKCkpIHsKICAgICAgIC8vIEltbWVkaWF0ZWx5IGZhaWwgaWYgdGhpcyB3YXMgYSBEZWNsU3RtdCwgc2luY2UgaXQncyB2ZXJ5CiAgICAgICAvLyBsaWtlbHkgdGhhdCB0aGlzIHdpbGwgY2F1c2UgcHJvYmxlbXMgZm9yIGZ1dHVyZSBzdGF0ZW1lbnRzLgotICAgICAgaWYgKGlzYTxEZWNsU3RtdD4oKkIpKQorICAgICAgaWYgKGlzYTxEZWNsU3RtdD4oQikpCiAgICAgICAgIHJldHVybiBTdG10RXJyb3IoKTsKIAogICAgICAgLy8gT3RoZXJ3aXNlLCBqdXN0IGtlZXAgcHJvY2Vzc2luZyBzdWJzdGF0ZW1lbnRzIGFuZCBmYWlsIGxhdGVyLgpAQCAtNTI5OCw3ICs1MzA4LDcgQEAKICAgICAgIGNvbnRpbnVlOwogICAgIH0KIAotICAgIFN1YlN0bXRDaGFuZ2VkID0gU3ViU3RtdENoYW5nZWQgfHwgUmVzdWx0LmdldCgpICE9ICpCOworICAgIFN1YlN0bXRDaGFuZ2VkID0gU3ViU3RtdENoYW5nZWQgfHwgUmVzdWx0LmdldCgpICE9IEI7CiAgICAgU3RhdGVtZW50cy5wdXNoX2JhY2soUmVzdWx0LnRha2VBczxTdG10PigpKTsKICAgfQogCkBAIC01Njk1LDE0ICs1NzA1LDEyIEBACiBUcmVlVHJhbnNmb3JtPERlcml2ZWQ+OjpUcmFuc2Zvcm1EZWNsU3RtdChEZWNsU3RtdCAqUykgewogICBib29sIERlY2xDaGFuZ2VkID0gZmFsc2U7CiAgIFNtYWxsVmVjdG9yPERlY2wgKiwgND4gRGVjbHM7Ci0gIGZvciAoRGVjbFN0bXQ6OmRlY2xfaXRlcmF0b3IgRCA9IFMtPmRlY2xfYmVnaW4oKSwgREVuZCA9IFMtPmRlY2xfZW5kKCk7Ci0gICAgICAgRCAhPSBERW5kOyArK0QpIHsKLSAgICBEZWNsICpUcmFuc2Zvcm1lZCA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1EZWZpbml0aW9uKCgqRCktPmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRCk7CisgIGZvciAoYXV0byAqRCA6IFMtPmRlY2xzKCkpIHsKKyAgICBEZWNsICpUcmFuc2Zvcm1lZCA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1EZWZpbml0aW9uKEQtPmdldExvY2F0aW9uKCksIEQpOwogICAgIGlmICghVHJhbnNmb3JtZWQpCiAgICAgICByZXR1cm4gU3RtdEVycm9yKCk7CiAKLSAgICBpZiAoVHJhbnNmb3JtZWQgIT0gKkQpCisgICAgaWYgKFRyYW5zZm9ybWVkICE9IEQpCiAgICAgICBEZWNsQ2hhbmdlZCA9IHRydWU7CiAKICAgICBEZWNscy5wdXNoX2JhY2soVHJhbnNmb3JtZWQpOwpAQCAtNjI3Niw5ICs2Mjg0LDggQEAKIAogdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KIFN0bXRSZXN1bHQKLVRyZWVUcmFuc2Zvcm08RGVyaXZlZD46OlRyYW5zZm9ybU9NUFBhcmFsbGVsRGlyZWN0aXZlKE9NUFBhcmFsbGVsRGlyZWN0aXZlICpEKSB7Ci0gIERlY2xhcmF0aW9uTmFtZUluZm8gRGlyTmFtZTsKLSAgZ2V0U2VtYSgpLlN0YXJ0T3Blbk1QRFNBQmxvY2soT01QRF9wYXJhbGxlbCwgRGlyTmFtZSwgMCk7CitUcmVlVHJhbnNmb3JtPERlcml2ZWQ+OjpUcmFuc2Zvcm1PTVBFeGVjdXRhYmxlRGlyZWN0aXZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QRXhlY3V0YWJsZURpcmVjdGl2ZSAqRCkgewogCiAgIC8vIFRyYW5zZm9ybSB0aGUgY2xhdXNlcwogICBsbHZtOjpTbWFsbFZlY3RvcjxPTVBDbGF1c2UgKiwgMTY+IFRDbGF1c2VzOwpAQCAtNjI4OSw3ICs2Mjk2LDYgQEAKICAgICBpZiAoKkkpIHsKICAgICAgIE9NUENsYXVzZSAqQ2xhdXNlID0gZ2V0RGVyaXZlZCgpLlRyYW5zZm9ybU9NUENsYXVzZSgqSSk7CiAgICAgICBpZiAoIUNsYXVzZSkgewotICAgICAgICBnZXRTZW1hKCkuRW5kT3Blbk1QRFNBQmxvY2soMCk7CiAgICAgICAgIHJldHVybiBTdG10RXJyb3IoKTsKICAgICAgIH0KICAgICAgIFRDbGF1c2VzLnB1c2hfYmFjayhDbGF1c2UpOwpAQCAtNjI5OSwyNSArNjMwNSw3NCBAQAogICAgIH0KICAgfQogICBpZiAoIUQtPmdldEFzc29jaWF0ZWRTdG10KCkpIHsKLSAgICBnZXRTZW1hKCkuRW5kT3Blbk1QRFNBQmxvY2soMCk7CiAgICAgcmV0dXJuIFN0bXRFcnJvcigpOwogICB9CiAgIFN0bXRSZXN1bHQgQXNzb2NpYXRlZFN0bXQgPQogICAgIGdldERlcml2ZWQoKS5UcmFuc2Zvcm1TdG10KEQtPmdldEFzc29jaWF0ZWRTdG10KCkpOwogICBpZiAoQXNzb2NpYXRlZFN0bXQuaXNJbnZhbGlkKCkpIHsKLSAgICBnZXRTZW1hKCkuRW5kT3Blbk1QRFNBQmxvY2soMCk7CiAgICAgcmV0dXJuIFN0bXRFcnJvcigpOwogICB9CiAKLSAgU3RtdFJlc3VsdCBSZXMgPSBnZXREZXJpdmVkKCkuUmVidWlsZE9NUFBhcmFsbGVsRGlyZWN0aXZlKFRDbGF1c2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzb2NpYXRlZFN0bXQudGFrZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC0+Z2V0TG9jU3RhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQtPmdldExvY0VuZCgpKTsKLSAgZ2V0U2VtYSgpLkVuZE9wZW5NUERTQUJsb2NrKFJlcy5nZXQoKSk7CisgIHJldHVybiBnZXREZXJpdmVkKCkuUmVidWlsZE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoRC0+Z2V0RGlyZWN0aXZlS2luZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc29jaWF0ZWRTdG10LnRha2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBELT5nZXRMb2NTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQtPmdldExvY0VuZCgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK1N0bXRSZXN1bHQKK1RyZWVUcmFuc2Zvcm08RGVyaXZlZD46OlRyYW5zZm9ybU9NUFBhcmFsbGVsRGlyZWN0aXZlKE9NUFBhcmFsbGVsRGlyZWN0aXZlICpEKSB7CisgIERlY2xhcmF0aW9uTmFtZUluZm8gRGlyTmFtZTsKKyAgZ2V0RGVyaXZlZCgpLmdldFNlbWEoKS5TdGFydE9wZW5NUERTQUJsb2NrKE9NUERfcGFyYWxsZWwsIERpck5hbWUsIDApOworICBTdG10UmVzdWx0IFJlcyA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1PTVBFeGVjdXRhYmxlRGlyZWN0aXZlKEQpOworICBnZXREZXJpdmVkKCkuZ2V0U2VtYSgpLkVuZE9wZW5NUERTQUJsb2NrKFJlcy5nZXQoKSk7CiAgIHJldHVybiBSZXM7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CitTdG10UmVzdWx0CitUcmVlVHJhbnNmb3JtPERlcml2ZWQ+OjpUcmFuc2Zvcm1PTVBTaW1kRGlyZWN0aXZlKE9NUFNpbWREaXJlY3RpdmUgKkQpIHsKKyAgRGVjbGFyYXRpb25OYW1lSW5mbyBEaXJOYW1lOworICBnZXREZXJpdmVkKCkuZ2V0U2VtYSgpLlN0YXJ0T3Blbk1QRFNBQmxvY2soT01QRF9zaW1kLCBEaXJOYW1lLCAwKTsKKyAgU3RtdFJlc3VsdCBSZXMgPSBnZXREZXJpdmVkKCkuVHJhbnNmb3JtT01QRXhlY3V0YWJsZURpcmVjdGl2ZShEKTsKKyAgZ2V0RGVyaXZlZCgpLmdldFNlbWEoKS5FbmRPcGVuTVBEU0FCbG9jayhSZXMuZ2V0KCkpOworICByZXR1cm4gUmVzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorT01QQ2xhdXNlICoKK1RyZWVUcmFuc2Zvcm08RGVyaXZlZD46OlRyYW5zZm9ybU9NUElmQ2xhdXNlKE9NUElmQ2xhdXNlICpDKSB7CisgIEV4cHJSZXN1bHQgQ29uZCA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1FeHByKEMtPmdldENvbmRpdGlvbigpKTsKKyAgaWYgKENvbmQuaXNJbnZhbGlkKCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBnZXREZXJpdmVkKCkuUmVidWlsZE9NUElmQ2xhdXNlKENvbmQudGFrZSgpLCBDLT5nZXRMb2NTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLT5nZXRMUGFyZW5Mb2MoKSwgQy0+Z2V0TG9jRW5kKCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgorT01QQ2xhdXNlICoKK1RyZWVUcmFuc2Zvcm08RGVyaXZlZD46OlRyYW5zZm9ybU9NUE51bVRocmVhZHNDbGF1c2UoT01QTnVtVGhyZWFkc0NsYXVzZSAqQykgeworICBFeHByUmVzdWx0IE51bVRocmVhZHMgPSBnZXREZXJpdmVkKCkuVHJhbnNmb3JtRXhwcihDLT5nZXROdW1UaHJlYWRzKCkpOworICBpZiAoTnVtVGhyZWFkcy5pc0ludmFsaWQoKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIGdldERlcml2ZWQoKS5SZWJ1aWxkT01QTnVtVGhyZWFkc0NsYXVzZShOdW1UaHJlYWRzLnRha2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLT5nZXRMb2NTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMtPmdldExQYXJlbkxvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMtPmdldExvY0VuZCgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+CitPTVBDbGF1c2UgKgorVHJlZVRyYW5zZm9ybTxEZXJpdmVkPjo6VHJhbnNmb3JtT01QU2FmZWxlbkNsYXVzZShPTVBTYWZlbGVuQ2xhdXNlICpDKSB7CisgIEV4cHJSZXN1bHQgRSA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1FeHByKEMtPmdldFNhZmVsZW4oKSk7CisgIGlmIChFLmlzSW52YWxpZCgpKQorICAgIHJldHVybiAwOworICByZXR1cm4gZ2V0RGVyaXZlZCgpLlJlYnVpbGRPTVBTYWZlbGVuQ2xhdXNlKAorICAgICAgRS50YWtlKCksIEMtPmdldExvY1N0YXJ0KCksIEMtPmdldExQYXJlbkxvYygpLCBDLT5nZXRMb2NFbmQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+CiBPTVBDbGF1c2UgKgogVHJlZVRyYW5zZm9ybTxEZXJpdmVkPjo6VHJhbnNmb3JtT01QRGVmYXVsdENsYXVzZShPTVBEZWZhdWx0Q2xhdXNlICpDKSB7CiAgIHJldHVybiBnZXREZXJpdmVkKCkuUmVidWlsZE9NUERlZmF1bHRDbGF1c2UoQy0+Z2V0RGVmYXVsdEtpbmQoKSwKQEAgLTYzMzIsMTAgKzYzODcsOCBAQAogVHJlZVRyYW5zZm9ybTxEZXJpdmVkPjo6VHJhbnNmb3JtT01QUHJpdmF0ZUNsYXVzZShPTVBQcml2YXRlQ2xhdXNlICpDKSB7CiAgIGxsdm06OlNtYWxsVmVjdG9yPEV4cHIgKiwgMTY+IFZhcnM7CiAgIFZhcnMucmVzZXJ2ZShDLT52YXJsaXN0X3NpemUoKSk7Ci0gIGZvciAoT01QUHJpdmF0ZUNsYXVzZTo6dmFybGlzdF9pdGVyYXRvciBJID0gQy0+dmFybGlzdF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IEMtPnZhcmxpc3RfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBFeHByUmVzdWx0IEVWYXIgPSBnZXREZXJpdmVkKCkuVHJhbnNmb3JtRXhwcihjYXN0PEV4cHI+KCpJKSk7CisgIGZvciAoYXV0byAqSSA6IEMtPnZhcmxpc3RzKCkpIHsKKyAgICBFeHByUmVzdWx0IEVWYXIgPSBnZXREZXJpdmVkKCkuVHJhbnNmb3JtRXhwcihjYXN0PEV4cHI+KEkpKTsKICAgICBpZiAoRVZhci5pc0ludmFsaWQoKSkKICAgICAgIHJldHVybiAwOwogICAgIFZhcnMucHVzaF9iYWNrKEVWYXIudGFrZSgpKTsKQEAgLTYzNTIsMTAgKzY0MDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUEZpcnN0cHJpdmF0ZUNsYXVzZSAqQykgewogICBsbHZtOjpTbWFsbFZlY3RvcjxFeHByICosIDE2PiBWYXJzOwogICBWYXJzLnJlc2VydmUoQy0+dmFybGlzdF9zaXplKCkpOwotICBmb3IgKE9NUEZpcnN0cHJpdmF0ZUNsYXVzZTo6dmFybGlzdF9pdGVyYXRvciBJID0gQy0+dmFybGlzdF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gQy0+dmFybGlzdF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIEV4cHJSZXN1bHQgRVZhciA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1FeHByKGNhc3Q8RXhwcj4oKkkpKTsKKyAgZm9yIChhdXRvICpJIDogQy0+dmFybGlzdHMoKSkgeworICAgIEV4cHJSZXN1bHQgRVZhciA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1FeHByKGNhc3Q8RXhwcj4oSSkpOwogICAgIGlmIChFVmFyLmlzSW52YWxpZCgpKQogICAgICAgcmV0dXJuIDA7CiAgICAgVmFycy5wdXNoX2JhY2soRVZhci50YWtlKCkpOwpAQCAtNjM3MSwxMCArNjQyMiw4IEBACiBUcmVlVHJhbnNmb3JtPERlcml2ZWQ+OjpUcmFuc2Zvcm1PTVBTaGFyZWRDbGF1c2UoT01QU2hhcmVkQ2xhdXNlICpDKSB7CiAgIGxsdm06OlNtYWxsVmVjdG9yPEV4cHIgKiwgMTY+IFZhcnM7CiAgIFZhcnMucmVzZXJ2ZShDLT52YXJsaXN0X3NpemUoKSk7Ci0gIGZvciAoT01QU2hhcmVkQ2xhdXNlOjp2YXJsaXN0X2l0ZXJhdG9yIEkgPSBDLT52YXJsaXN0X2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBDLT52YXJsaXN0X2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgRXhwclJlc3VsdCBFVmFyID0gZ2V0RGVyaXZlZCgpLlRyYW5zZm9ybUV4cHIoY2FzdDxFeHByPigqSSkpOworICBmb3IgKGF1dG8gKkkgOiBDLT52YXJsaXN0cygpKSB7CisgICAgRXhwclJlc3VsdCBFVmFyID0gZ2V0RGVyaXZlZCgpLlRyYW5zZm9ybUV4cHIoY2FzdDxFeHByPihJKSk7CiAgICAgaWYgKEVWYXIuaXNJbnZhbGlkKCkpCiAgICAgICByZXR1cm4gMDsKICAgICBWYXJzLnB1c2hfYmFjayhFVmFyLnRha2UoKSk7CkBAIC02Mzg1LDYgKzY0MzQsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMtPmdldExvY0VuZCgpKTsKIH0KIAordGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KK09NUENsYXVzZSAqCitUcmVlVHJhbnNmb3JtPERlcml2ZWQ+OjpUcmFuc2Zvcm1PTVBDb3B5aW5DbGF1c2UoT01QQ29weWluQ2xhdXNlICpDKSB7CisgIGxsdm06OlNtYWxsVmVjdG9yPEV4cHIgKiwgMTY+IFZhcnM7CisgIFZhcnMucmVzZXJ2ZShDLT52YXJsaXN0X3NpemUoKSk7CisgIGZvciAoYXV0byAqSSA6IEMtPnZhcmxpc3RzKCkpIHsKKyAgICBFeHByUmVzdWx0IEVWYXIgPSBnZXREZXJpdmVkKCkuVHJhbnNmb3JtRXhwcihjYXN0PEV4cHI+KEkpKTsKKyAgICBpZiAoRVZhci5pc0ludmFsaWQoKSkKKyAgICAgIHJldHVybiAwOworICAgIFZhcnMucHVzaF9iYWNrKEVWYXIudGFrZSgpKTsKKyAgfQorICByZXR1cm4gZ2V0RGVyaXZlZCgpLlJlYnVpbGRPTVBDb3B5aW5DbGF1c2UoVmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMtPmdldExvY1N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLT5nZXRMUGFyZW5Mb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMtPmdldExvY0VuZCgpKTsKK30KKwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIC8vIEV4cHJlc3Npb24gdHJhbnNmb3JtYXRpb24KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCkBAIC03ODI5LDkgKzc4OTUsOCBAQAogICAgIC8vIEV4cGFuZCB1c2luZyBkZWNsYXJhdGlvbnMuCiAgICAgaWYgKGlzYTxVc2luZ0RlY2w+KEluc3REKSkgewogICAgICAgVXNpbmdEZWNsICpVRCA9IGNhc3Q8VXNpbmdEZWNsPihJbnN0RCk7Ci0gICAgICBmb3IgKFVzaW5nRGVjbDo6c2hhZG93X2l0ZXJhdG9yIEkgPSBVRC0+c2hhZG93X2JlZ2luKCksCi0gICAgICAgICAgICAgRSA9IFVELT5zaGFkb3dfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgICAgICBSLmFkZERlY2woKkkpOworICAgICAgZm9yIChhdXRvICpJIDogVUQtPnNoYWRvd3MoKSkKKyAgICAgICAgUi5hZGREZWNsKEkpOwogICAgICAgY29udGludWU7CiAgICAgfQogCkBAIC03ODkwLDQ0ICs3OTU1LDYgQEAKIAogdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KIEV4cHJSZXN1bHQKLVRyZWVUcmFuc2Zvcm08RGVyaXZlZD46OlRyYW5zZm9ybVVuYXJ5VHlwZVRyYWl0RXhwcihVbmFyeVR5cGVUcmFpdEV4cHIgKkUpIHsKLSAgVHlwZVNvdXJjZUluZm8gKlQgPSBnZXREZXJpdmVkKCkuVHJhbnNmb3JtVHlwZShFLT5nZXRRdWVyaWVkVHlwZVNvdXJjZUluZm8oKSk7Ci0gIGlmICghVCkKLSAgICByZXR1cm4gRXhwckVycm9yKCk7Ci0KLSAgaWYgKCFnZXREZXJpdmVkKCkuQWx3YXlzUmVidWlsZCgpICYmCi0gICAgICBUID09IEUtPmdldFF1ZXJpZWRUeXBlU291cmNlSW5mbygpKQotICAgIHJldHVybiBTZW1hUmVmLk93bmVkKEUpOwotCi0gIHJldHVybiBnZXREZXJpdmVkKCkuUmVidWlsZFVuYXJ5VHlwZVRyYWl0KEUtPmdldFRyYWl0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUtPmdldExvY1N0YXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUtPmdldExvY0VuZCgpKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLUV4cHJSZXN1bHQKLVRyZWVUcmFuc2Zvcm08RGVyaXZlZD46OlRyYW5zZm9ybUJpbmFyeVR5cGVUcmFpdEV4cHIoQmluYXJ5VHlwZVRyYWl0RXhwciAqRSkgewotICBUeXBlU291cmNlSW5mbyAqTGhzVCA9IGdldERlcml2ZWQoKS5UcmFuc2Zvcm1UeXBlKEUtPmdldExoc1R5cGVTb3VyY2VJbmZvKCkpOwotICBpZiAoIUxoc1QpCi0gICAgcmV0dXJuIEV4cHJFcnJvcigpOwotCi0gIFR5cGVTb3VyY2VJbmZvICpSaHNUID0gZ2V0RGVyaXZlZCgpLlRyYW5zZm9ybVR5cGUoRS0+Z2V0UmhzVHlwZVNvdXJjZUluZm8oKSk7Ci0gIGlmICghUmhzVCkKLSAgICByZXR1cm4gRXhwckVycm9yKCk7Ci0KLSAgaWYgKCFnZXREZXJpdmVkKCkuQWx3YXlzUmVidWlsZCgpICYmCi0gICAgICBMaHNUID09IEUtPmdldExoc1R5cGVTb3VyY2VJbmZvKCkgJiYgUmhzVCA9PSBFLT5nZXRSaHNUeXBlU291cmNlSW5mbygpKQotICAgIHJldHVybiBTZW1hUmVmLk93bmVkKEUpOwotCi0gIHJldHVybiBnZXREZXJpdmVkKCkuUmVidWlsZEJpbmFyeVR5cGVUcmFpdChFLT5nZXRUcmFpdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLT5nZXRMb2NTdGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaHNULCBSaHNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLT5nZXRMb2NFbmQoKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1FeHByUmVzdWx0CiBUcmVlVHJhbnNmb3JtPERlcml2ZWQ+OjpUcmFuc2Zvcm1UeXBlVHJhaXRFeHByKFR5cGVUcmFpdEV4cHIgKkUpIHsKICAgYm9vbCBBcmdDaGFuZ2VkID0gZmFsc2U7CiAgIFNtYWxsVmVjdG9yPFR5cGVTb3VyY2VJbmZvICosIDQ+IEFyZ3M7CkBAIC04MzUzLDcgKzgzODAsNyBAQAogICAgIEZ1bmN0aW9uUHJvdG9UeXBlTG9jIE5ld0NhbGxPcEZQVEwgPSAKICAgICAgICAgTmV3Q2FsbE9wVFNJLT5nZXRUeXBlTG9jKCkuY2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlTG9jPigpOwogICAgIFBhcm1WYXJEZWNsICoqTmV3UGFyYW1EZWNsQXJyYXkgPSBOZXdDYWxsT3BGUFRMLmdldFBhcm1BcnJheSgpOwotICAgIGNvbnN0IHVuc2lnbmVkIE5ld051bUFyZ3MgPSBOZXdDYWxsT3BGUFRMLmdldE51bUFyZ3MoKTsKKyAgICBjb25zdCB1bnNpZ25lZCBOZXdOdW1BcmdzID0gTmV3Q2FsbE9wRlBUTC5nZXROdW1QYXJhbXMoKTsKIAogICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgPCBOZXdOdW1BcmdzOyArK0kpIHsKICAgICAgIC8vIElmIHRoaXMgY2FsbCBvcGVyYXRvcidzIHR5cGUgZG9lcyBub3QgcmVxdWlyZSB0cmFuc2Zvcm1hdGlvbiwgCkBAIC04NDE2LDcgKzg0NDMsOCBAQAogICBib29sIEludmFsaWQgPSBmYWxzZTsKIAogICAvLyBJbnRyb2R1Y2UgdGhlIGNvbnRleHQgb2YgdGhlIGNhbGwgb3BlcmF0b3IuCi0gIFNlbWE6OkNvbnRleHRSQUlJIFNhdmVkQ29udGV4dChnZXRTZW1hKCksIENhbGxPcGVyYXRvcik7CisgIFNlbWE6OkNvbnRleHRSQUlJIFNhdmVkQ29udGV4dChnZXRTZW1hKCksIENhbGxPcGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qTmV3VGhpc0NvbnRleHQqL2ZhbHNlKTsKIAogICBMYW1iZGFTY29wZUluZm8gKmNvbnN0IExTSSA9IGdldFNlbWEoKS5nZXRDdXJMYW1iZGEoKTsKICAgLy8gRW50ZXIgdGhlIHNjb3BlIG9mIHRoZSBsYW1iZGEuCkBAIC04NzM0LDkgKzg3NjIsOCBAQAogICAgIC8vIEV4cGFuZCB1c2luZyBkZWNsYXJhdGlvbnMuCiAgICAgaWYgKGlzYTxVc2luZ0RlY2w+KEluc3REKSkgewogICAgICAgVXNpbmdEZWNsICpVRCA9IGNhc3Q8VXNpbmdEZWNsPihJbnN0RCk7Ci0gICAgICBmb3IgKFVzaW5nRGVjbDo6c2hhZG93X2l0ZXJhdG9yIEkgPSBVRC0+c2hhZG93X2JlZ2luKCksCi0gICAgICAgICAgICAgRSA9IFVELT5zaGFkb3dfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgICAgICBSLmFkZERlY2woKkkpOworICAgICAgZm9yIChhdXRvICpJIDogVUQtPnNoYWRvd3MoKSkKKyAgICAgICAgUi5hZGREZWNsKEkpOwogICAgICAgY29udGludWU7CiAgICAgfQogCkBAIC05MzM3LDcgKzkzNjQsNyBAQAogCiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpleHByRnVuY3Rpb25UeXBlID0gRS0+Z2V0RnVuY3Rpb25UeXBlKCk7CiAgIFF1YWxUeXBlIGV4cHJSZXN1bHRUeXBlID0KLSAgICAgIGdldERlcml2ZWQoKS5UcmFuc2Zvcm1UeXBlKGV4cHJGdW5jdGlvblR5cGUtPmdldFJlc3VsdFR5cGUoKSk7CisgICAgICBnZXREZXJpdmVkKCkuVHJhbnNmb3JtVHlwZShleHByRnVuY3Rpb25UeXBlLT5nZXRSZXR1cm5UeXBlKCkpOwogCiAgIFF1YWxUeXBlIGZ1bmN0aW9uVHlwZSA9CiAgICAgZ2V0RGVyaXZlZCgpLlJlYnVpbGRGdW5jdGlvblByb3RvVHlwZShleHByUmVzdWx0VHlwZSwgcGFyYW1UeXBlcywKQEAgLTkzNjQsOSArOTM5MSw4IEBACiAgIC8vIEluIGJ1aWxkcyB3aXRoIGFzc2VydGlvbnMsIG1ha2Ugc3VyZSB0aGF0IHdlIGNhcHR1cmVkIGV2ZXJ5dGhpbmcgd2UKICAgLy8gY2FwdHVyZWQgYmVmb3JlLgogICBpZiAoIVNlbWFSZWYuZ2V0RGlhZ25vc3RpY3MoKS5oYXNFcnJvck9jY3VycmVkKCkpIHsKLSAgICBmb3IgKEJsb2NrRGVjbDo6Y2FwdHVyZV9pdGVyYXRvciBpID0gb2xkQmxvY2stPmNhcHR1cmVfYmVnaW4oKSwKLSAgICAgICAgICAgZSA9IG9sZEJsb2NrLT5jYXB0dXJlX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgICAgVmFyRGVjbCAqb2xkQ2FwdHVyZSA9IGktPmdldFZhcmlhYmxlKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogb2xkQmxvY2stPmNhcHR1cmVzKCkpIHsKKyAgICAgIFZhckRlY2wgKm9sZENhcHR1cmUgPSBJLmdldFZhcmlhYmxlKCk7CiAKICAgICAgIC8vIElnbm9yZSBwYXJhbWV0ZXIgcGFja3MuCiAgICAgICBpZiAoaXNhPFBhcm1WYXJEZWNsPihvbGRDYXB0dXJlKSAmJgpAQCAtOTQ0Myw4ICs5NDY5LDggQEAKIFRyZWVUcmFuc2Zvcm08RGVyaXZlZD46OlJlYnVpbGRNZW1iZXJQb2ludGVyVHlwZShRdWFsVHlwZSBQb2ludGVlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBDbGFzc1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gU2lnaWwpIHsKLSAgcmV0dXJuIFNlbWFSZWYuQnVpbGRNZW1iZXJQb2ludGVyVHlwZShQb2ludGVlVHlwZSwgQ2xhc3NUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ2lsLCBnZXREZXJpdmVkKCkuZ2V0QmFzZUVudGl0eSgpKTsKKyAgcmV0dXJuIFNlbWFSZWYuQnVpbGRNZW1iZXJQb2ludGVyVHlwZShQb2ludGVlVHlwZSwgQ2xhc3NUeXBlLCBTaWdpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXJpdmVkKCkuZ2V0QmFzZUVudGl0eSgpKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KZGlmZiAtLWdpdCBhL2xpYi9TZXJpYWxpemF0aW9uL0FTVENvbW1vbi5oIGIvbGliL1NlcmlhbGl6YXRpb24vQVNUQ29tbW9uLmgKaW5kZXggZWY4MWU2OS4uNTI0YTljMiAxMDA2NDQKLS0tIGEvbGliL1NlcmlhbGl6YXRpb24vQVNUQ29tbW9uLmgKKysrIGIvbGliL1NlcmlhbGl6YXRpb24vQVNUQ29tbW9uLmgKQEAgLTI2LDggKzI2LDEyIEBACiAgIFVQRF9DWFhfQURERURfVEVNUExBVEVfU1BFQ0lBTElaQVRJT04sCiAgIFVQRF9DWFhfQURERURfQU5PTllNT1VTX05BTUVTUEFDRSwKICAgVVBEX0NYWF9JTlNUQU5USUFURURfU1RBVElDX0RBVEFfTUVNQkVSLAorICBVUERfQ1hYX0lOU1RBTlRJQVRFRF9GVU5DVElPTl9ERUZJTklUSU9OLAorICBVUERfQ1hYX1JFU09MVkVEX0VYQ0VQVElPTl9TUEVDLAogICBVUERfQ1hYX0RFRFVDRURfUkVUVVJOX1RZUEUsCi0gIFVQRF9ERUNMX01BUktFRF9VU0VECisgIFVQRF9ERUNMX01BUktFRF9VU0VELAorICBVUERfTUFOR0xJTkdfTlVNQkVSLAorICBVUERfU1RBVElDX0xPQ0FMX05VTUJFUgogfTsKIAogVHlwZUlkeCBUeXBlSWR4RnJvbUJ1aWx0aW4oY29uc3QgQnVpbHRpblR5cGUgKkJUKTsKZGlmZiAtLWdpdCBhL2xpYi9TZXJpYWxpemF0aW9uL0FTVFJlYWRlci5jcHAgYi9saWIvU2VyaWFsaXphdGlvbi9BU1RSZWFkZXIuY3BwCmluZGV4IDRkMWI0YjkuLmZmMGIxZGQgMTAwNjQ0Ci0tLSBhL2xpYi9TZXJpYWxpemF0aW9uL0FTVFJlYWRlci5jcHAKKysrIGIvbGliL1NlcmlhbGl6YXRpb24vQVNUUmVhZGVyLmNwcApAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TYXZlQW5kUmVzdG9yZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9zeXN0ZW1fZXJyb3IuaCIKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y3N0ZGlvPgpAQCAtNTksNiArNjAsNzUgQEAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6c2VyaWFsaXphdGlvbjo6cmVhZGVyOwogdXNpbmcgbGx2bTo6Qml0c3RyZWFtQ3Vyc29yOwogCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDaGFpbmVkQVNUUmVhZGVyTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2Jvb2wKK0NoYWluZWRBU1RSZWFkZXJMaXN0ZW5lcjo6UmVhZEZ1bGxWZXJzaW9uSW5mb3JtYXRpb24oU3RyaW5nUmVmIEZ1bGxWZXJzaW9uKSB7CisgIHJldHVybiBGaXJzdC0+UmVhZEZ1bGxWZXJzaW9uSW5mb3JtYXRpb24oRnVsbFZlcnNpb24pIHx8CisgICAgICAgICBTZWNvbmQtPlJlYWRGdWxsVmVyc2lvbkluZm9ybWF0aW9uKEZ1bGxWZXJzaW9uKTsKK30KK2Jvb2wgQ2hhaW5lZEFTVFJlYWRlckxpc3RlbmVyOjpSZWFkTGFuZ3VhZ2VPcHRpb25zKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIHsKKyAgcmV0dXJuIEZpcnN0LT5SZWFkTGFuZ3VhZ2VPcHRpb25zKExhbmdPcHRzLCBDb21wbGFpbikgfHwKKyAgICAgICAgIFNlY29uZC0+UmVhZExhbmd1YWdlT3B0aW9ucyhMYW5nT3B0cywgQ29tcGxhaW4pOworfQorYm9vbAorQ2hhaW5lZEFTVFJlYWRlckxpc3RlbmVyOjpSZWFkVGFyZ2V0T3B0aW9ucyhjb25zdCBUYXJnZXRPcHRpb25zICZUYXJnZXRPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKSB7CisgIHJldHVybiBGaXJzdC0+UmVhZFRhcmdldE9wdGlvbnMoVGFyZ2V0T3B0cywgQ29tcGxhaW4pIHx8CisgICAgICAgICBTZWNvbmQtPlJlYWRUYXJnZXRPcHRpb25zKFRhcmdldE9wdHMsIENvbXBsYWluKTsKK30KK2Jvb2wgQ2hhaW5lZEFTVFJlYWRlckxpc3RlbmVyOjpSZWFkRGlhZ25vc3RpY09wdGlvbnMoCisgICAgY29uc3QgRGlhZ25vc3RpY09wdGlvbnMgJkRpYWdPcHRzLCBib29sIENvbXBsYWluKSB7CisgIHJldHVybiBGaXJzdC0+UmVhZERpYWdub3N0aWNPcHRpb25zKERpYWdPcHRzLCBDb21wbGFpbikgfHwKKyAgICAgICAgIFNlY29uZC0+UmVhZERpYWdub3N0aWNPcHRpb25zKERpYWdPcHRzLCBDb21wbGFpbik7Cit9Citib29sCitDaGFpbmVkQVNUUmVhZGVyTGlzdGVuZXI6OlJlYWRGaWxlU3lzdGVtT3B0aW9ucyhjb25zdCBGaWxlU3lzdGVtT3B0aW9ucyAmRlNPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbikgeworICByZXR1cm4gRmlyc3QtPlJlYWRGaWxlU3lzdGVtT3B0aW9ucyhGU09wdHMsIENvbXBsYWluKSB8fAorICAgICAgICAgU2Vjb25kLT5SZWFkRmlsZVN5c3RlbU9wdGlvbnMoRlNPcHRzLCBDb21wbGFpbik7Cit9CisKK2Jvb2wgQ2hhaW5lZEFTVFJlYWRlckxpc3RlbmVyOjpSZWFkSGVhZGVyU2VhcmNoT3B0aW9ucygKKyAgICBjb25zdCBIZWFkZXJTZWFyY2hPcHRpb25zICZIU09wdHMsIGJvb2wgQ29tcGxhaW4pIHsKKyAgcmV0dXJuIEZpcnN0LT5SZWFkSGVhZGVyU2VhcmNoT3B0aW9ucyhIU09wdHMsIENvbXBsYWluKSB8fAorICAgICAgICAgU2Vjb25kLT5SZWFkSGVhZGVyU2VhcmNoT3B0aW9ucyhIU09wdHMsIENvbXBsYWluKTsKK30KK2Jvb2wgQ2hhaW5lZEFTVFJlYWRlckxpc3RlbmVyOjpSZWFkUHJlcHJvY2Vzc29yT3B0aW9ucygKKyAgICBjb25zdCBQcmVwcm9jZXNzb3JPcHRpb25zICZQUE9wdHMsIGJvb2wgQ29tcGxhaW4sCisgICAgc3RkOjpzdHJpbmcgJlN1Z2dlc3RlZFByZWRlZmluZXMpIHsKKyAgcmV0dXJuIEZpcnN0LT5SZWFkUHJlcHJvY2Vzc29yT3B0aW9ucyhQUE9wdHMsIENvbXBsYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Z2dlc3RlZFByZWRlZmluZXMpIHx8CisgICAgICAgICBTZWNvbmQtPlJlYWRQcmVwcm9jZXNzb3JPcHRpb25zKFBQT3B0cywgQ29tcGxhaW4sIFN1Z2dlc3RlZFByZWRlZmluZXMpOworfQordm9pZCBDaGFpbmVkQVNUUmVhZGVyTGlzdGVuZXI6OlJlYWRDb3VudGVyKGNvbnN0IHNlcmlhbGl6YXRpb246Ok1vZHVsZUZpbGUgJk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWUpIHsKKyAgRmlyc3QtPlJlYWRDb3VudGVyKE0sIFZhbHVlKTsKKyAgU2Vjb25kLT5SZWFkQ291bnRlcihNLCBWYWx1ZSk7Cit9Citib29sIENoYWluZWRBU1RSZWFkZXJMaXN0ZW5lcjo6bmVlZHNJbnB1dEZpbGVWaXNpdGF0aW9uKCkgeworICByZXR1cm4gRmlyc3QtPm5lZWRzSW5wdXRGaWxlVmlzaXRhdGlvbigpIHx8CisgICAgICAgICBTZWNvbmQtPm5lZWRzSW5wdXRGaWxlVmlzaXRhdGlvbigpOworfQorYm9vbCBDaGFpbmVkQVNUUmVhZGVyTGlzdGVuZXI6Om5lZWRzU3lzdGVtSW5wdXRGaWxlVmlzaXRhdGlvbigpIHsKKyAgcmV0dXJuIEZpcnN0LT5uZWVkc1N5c3RlbUlucHV0RmlsZVZpc2l0YXRpb24oKSB8fAorICBTZWNvbmQtPm5lZWRzU3lzdGVtSW5wdXRGaWxlVmlzaXRhdGlvbigpOworfQordm9pZCBDaGFpbmVkQVNUUmVhZGVyTGlzdGVuZXI6OnZpc2l0TW9kdWxlRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUpIHsKKyAgRmlyc3QtPnZpc2l0TW9kdWxlRmlsZShGaWxlbmFtZSk7CisgIFNlY29uZC0+dmlzaXRNb2R1bGVGaWxlKEZpbGVuYW1lKTsKK30KK2Jvb2wgQ2hhaW5lZEFTVFJlYWRlckxpc3RlbmVyOjp2aXNpdElucHV0RmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3ZlcnJpZGRlbikgeworICByZXR1cm4gRmlyc3QtPnZpc2l0SW5wdXRGaWxlKEZpbGVuYW1lLCBpc1N5c3RlbSwgaXNPdmVycmlkZGVuKSB8fAorICAgICAgICAgU2Vjb25kLT52aXNpdElucHV0RmlsZShGaWxlbmFtZSwgaXNTeXN0ZW0sIGlzT3ZlcnJpZGRlbik7Cit9CisKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAvLyBQQ0ggdmFsaWRhdG9yIGltcGxlbWVudGF0aW9uCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtMTQwLDcgKzIxMCw2IEBACiAgIENIRUNLX1RBUkdFVF9PUFQoVHJpcGxlLCAidGFyZ2V0Iik7CiAgIENIRUNLX1RBUkdFVF9PUFQoQ1BVLCAidGFyZ2V0IENQVSIpOwogICBDSEVDS19UQVJHRVRfT1BUKEFCSSwgInRhcmdldCBBQkkiKTsKLSAgQ0hFQ0tfVEFSR0VUX09QVChDWFhBQkksICJ0YXJnZXQgQysrIEFCSSIpOwogICBDSEVDS19UQVJHRVRfT1BUKExpbmtlclZlcnNpb24sICJ0YXJnZXQgbGlua2VyIHZlcnNpb24iKTsKICN1bmRlZiBDSEVDS19UQVJHRVRfT1BUCiAKQEAgLTQwMSwxOSArNDcwLDE5IEBACiAKIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+CiBBU1RTZWxlY3Rvckxvb2t1cFRyYWl0OjpSZWFkS2V5RGF0YUxlbmd0aChjb25zdCB1bnNpZ25lZCBjaGFyKiYgZCkgewotICB1c2luZyBuYW1lc3BhY2UgY2xhbmc6OmlvOwotICB1bnNpZ25lZCBLZXlMZW4gPSBSZWFkVW5hbGlnbmVkTEUxNihkKTsKLSAgdW5zaWduZWQgRGF0YUxlbiA9IFJlYWRVbmFsaWduZWRMRTE2KGQpOworICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgdW5zaWduZWQgS2V5TGVuID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpOworICB1bnNpZ25lZCBEYXRhTGVuID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpOwogICByZXR1cm4gc3RkOjptYWtlX3BhaXIoS2V5TGVuLCBEYXRhTGVuKTsKIH0KIAogQVNUU2VsZWN0b3JMb29rdXBUcmFpdDo6aW50ZXJuYWxfa2V5X3R5cGUgCiBBU1RTZWxlY3Rvckxvb2t1cFRyYWl0OjpSZWFkS2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIqIGQsIHVuc2lnbmVkKSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6aW87CisgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OwogICBTZWxlY3RvclRhYmxlICZTZWxUYWJsZSA9IFJlYWRlci5nZXRDb250ZXh0KCkuU2VsZWN0b3JzOwotICB1bnNpZ25lZCBOID0gUmVhZFVuYWxpZ25lZExFMTYoZCk7Ci0gIElkZW50aWZpZXJJbmZvICpGaXJzdElJCi0gICAgPSBSZWFkZXIuZ2V0TG9jYWxJZGVudGlmaWVyKEYsIFJlYWRVbmFsaWduZWRMRTMyKGQpKTsKKyAgdW5zaWduZWQgTiA9IGVuZGlhbjo6cmVhZE5leHQ8dWludDE2X3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKTsKKyAgSWRlbnRpZmllckluZm8gKkZpcnN0SUkgPSBSZWFkZXIuZ2V0TG9jYWxJZGVudGlmaWVyKAorICAgICAgRiwgZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpKTsKICAgaWYgKE4gPT0gMCkKICAgICByZXR1cm4gU2VsVGFibGUuZ2V0TnVsbGFyeVNlbGVjdG9yKEZpcnN0SUkpOwogICBlbHNlIGlmIChOID09IDEpCkBAIC00MjIsNyArNDkxLDggQEAKICAgU21hbGxWZWN0b3I8SWRlbnRpZmllckluZm8gKiwgMTY+IEFyZ3M7CiAgIEFyZ3MucHVzaF9iYWNrKEZpcnN0SUkpOwogICBmb3IgKHVuc2lnbmVkIEkgPSAxOyBJICE9IE47ICsrSSkKLSAgICBBcmdzLnB1c2hfYmFjayhSZWFkZXIuZ2V0TG9jYWxJZGVudGlmaWVyKEYsIFJlYWRVbmFsaWduZWRMRTMyKGQpKSk7CisgICAgQXJncy5wdXNoX2JhY2soUmVhZGVyLmdldExvY2FsSWRlbnRpZmllcigKKyAgICAgICAgRiwgZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpKSk7CiAKICAgcmV0dXJuIFNlbFRhYmxlLmdldFNlbGVjdG9yKE4sIEFyZ3MuZGF0YSgpKTsKIH0KQEAgLTQzMCwxMyArNTAwLDE2IEBACiBBU1RTZWxlY3Rvckxvb2t1cFRyYWl0OjpkYXRhX3R5cGUgCiBBU1RTZWxlY3Rvckxvb2t1cFRyYWl0OjpSZWFkRGF0YShTZWxlY3RvciwgY29uc3QgdW5zaWduZWQgY2hhciogZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEYXRhTGVuKSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6aW87CisgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OwogCiAgIGRhdGFfdHlwZSBSZXN1bHQ7CiAKLSAgUmVzdWx0LklEID0gUmVhZGVyLmdldEdsb2JhbFNlbGVjdG9ySUQoRiwgUmVhZFVuYWxpZ25lZExFMzIoZCkpOwotICB1bnNpZ25lZCBOdW1JbnN0YW5jZU1ldGhvZHNBbmRCaXRzID0gUmVhZFVuYWxpZ25lZExFMTYoZCk7Ci0gIHVuc2lnbmVkIE51bUZhY3RvcnlNZXRob2RzQW5kQml0cyA9IFJlYWRVbmFsaWduZWRMRTE2KGQpOworICBSZXN1bHQuSUQgPSBSZWFkZXIuZ2V0R2xvYmFsU2VsZWN0b3JJRCgKKyAgICAgIEYsIGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKSk7CisgIHVuc2lnbmVkIE51bUluc3RhbmNlTWV0aG9kc0FuZEJpdHMgPQorICAgICAgZW5kaWFuOjpyZWFkTmV4dDx1aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpOworICB1bnNpZ25lZCBOdW1GYWN0b3J5TWV0aG9kc0FuZEJpdHMgPQorICAgICAgZW5kaWFuOjpyZWFkTmV4dDx1aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpOwogICBSZXN1bHQuSW5zdGFuY2VCaXRzID0gTnVtSW5zdGFuY2VNZXRob2RzQW5kQml0cyAmIDB4MzsKICAgUmVzdWx0LkZhY3RvcnlCaXRzID0gTnVtRmFjdG9yeU1ldGhvZHNBbmRCaXRzICYgMHgzOwogICB1bnNpZ25lZCBOdW1JbnN0YW5jZU1ldGhvZHMgPSBOdW1JbnN0YW5jZU1ldGhvZHNBbmRCaXRzID4+IDI7CkBAIC00NDQsMTUgKzUxNywxNSBAQAogCiAgIC8vIExvYWQgaW5zdGFuY2UgbWV0aG9kcwogICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bUluc3RhbmNlTWV0aG9kczsgKytJKSB7Ci0gICAgaWYgKE9iakNNZXRob2REZWNsICpNZXRob2QKLSAgICAgICAgICA9IFJlYWRlci5HZXRMb2NhbERlY2xBczxPYmpDTWV0aG9kRGVjbD4oRiwgUmVhZFVuYWxpZ25lZExFMzIoZCkpKQorICAgIGlmIChPYmpDTWV0aG9kRGVjbCAqTWV0aG9kID0gUmVhZGVyLkdldExvY2FsRGVjbEFzPE9iakNNZXRob2REZWNsPigKKyAgICAgICAgICAgIEYsIGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKSkpCiAgICAgICBSZXN1bHQuSW5zdGFuY2UucHVzaF9iYWNrKE1ldGhvZCk7CiAgIH0KIAogICAvLyBMb2FkIGZhY3RvcnkgbWV0aG9kcwogICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bUZhY3RvcnlNZXRob2RzOyArK0kpIHsKLSAgICBpZiAoT2JqQ01ldGhvZERlY2wgKk1ldGhvZAotICAgICAgICAgID0gUmVhZGVyLkdldExvY2FsRGVjbEFzPE9iakNNZXRob2REZWNsPihGLCBSZWFkVW5hbGlnbmVkTEUzMihkKSkpCisgICAgaWYgKE9iakNNZXRob2REZWNsICpNZXRob2QgPSBSZWFkZXIuR2V0TG9jYWxEZWNsQXM8T2JqQ01ldGhvZERlY2w+KAorICAgICAgICAgICAgRiwgZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpKSkKICAgICAgIFJlc3VsdC5GYWN0b3J5LnB1c2hfYmFjayhNZXRob2QpOwogICB9CiAKQEAgLTQ2NSw5ICs1MzgsOSBAQAogCiBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPgogQVNUSWRlbnRpZmllckxvb2t1cFRyYWl0QmFzZTo6UmVhZEtleURhdGFMZW5ndGgoY29uc3QgdW5zaWduZWQgY2hhciomIGQpIHsKLSAgdXNpbmcgbmFtZXNwYWNlIGNsYW5nOjppbzsKLSAgdW5zaWduZWQgRGF0YUxlbiA9IFJlYWRVbmFsaWduZWRMRTE2KGQpOwotICB1bnNpZ25lZCBLZXlMZW4gPSBSZWFkVW5hbGlnbmVkTEUxNihkKTsKKyAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgIHVuc2lnbmVkIERhdGFMZW4gPSBlbmRpYW46OnJlYWROZXh0PHVpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CisgIHVuc2lnbmVkIEtleUxlbiA9IGVuZGlhbjo6cmVhZE5leHQ8dWludDE2X3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKTsKICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEtleUxlbiwgRGF0YUxlbik7CiB9CiAKQEAgLTQ5MCw4ICs1NjMsOCBAQAogSWRlbnRpZmllckluZm8gKkFTVElkZW50aWZpZXJMb29rdXBUcmFpdDo6UmVhZERhdGEoY29uc3QgaW50ZXJuYWxfa2V5X3R5cGUmIGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGF0YUxlbikgewotICB1c2luZyBuYW1lc3BhY2UgY2xhbmc6OmlvOwotICB1bnNpZ25lZCBSYXdJRCA9IFJlYWRVbmFsaWduZWRMRTMyKGQpOworICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgdW5zaWduZWQgUmF3SUQgPSBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CiAgIGJvb2wgSXNJbnRlcmVzdGluZyA9IFJhd0lEICYgMHgwMTsKIAogICAvLyBXaXBlIG91dCB0aGUgImlzIGludGVyZXN0aW5nIiBiaXQuCkBAIC01MTcsOCArNTkwLDggQEAKICAgICByZXR1cm4gSUk7CiAgIH0KIAotICB1bnNpZ25lZCBPYmpDT3JCdWlsdGluSUQgPSBSZWFkVW5hbGlnbmVkTEUxNihkKTsKLSAgdW5zaWduZWQgQml0cyA9IFJlYWRVbmFsaWduZWRMRTE2KGQpOworICB1bnNpZ25lZCBPYmpDT3JCdWlsdGluSUQgPSBlbmRpYW46OnJlYWROZXh0PHVpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CisgIHVuc2lnbmVkIEJpdHMgPSBlbmRpYW46OnJlYWROZXh0PHVpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CiAgIGJvb2wgQ1BsdXNQbHVzT3BlcmF0b3JLZXl3b3JkID0gQml0cyAmIDB4MDE7CiAgIEJpdHMgPj49IDE7CiAgIGJvb2wgSGFzUmV2ZXJ0ZWRUb2tlbklEVG9JZGVudGlmaWVyID0gQml0cyAmIDB4MDE7CkBAIC01NjcsMTEgKzY0MCwxMyBAQAogICAvLyBJZiB0aGlzIGlkZW50aWZpZXIgaXMgYSBtYWNybywgZGVzZXJpYWxpemUgdGhlIG1hY3JvCiAgIC8vIGRlZmluaXRpb24uCiAgIGlmIChoYWRNYWNyb0RlZmluaXRpb24pIHsKLSAgICB1aW50MzJfdCBNYWNyb0RpcmVjdGl2ZXNPZmZzZXQgPSBSZWFkVW5hbGlnbmVkTEUzMihkKTsKKyAgICB1aW50MzJfdCBNYWNyb0RpcmVjdGl2ZXNPZmZzZXQgPQorICAgICAgICBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CiAgICAgRGF0YUxlbiAtPSA0OwogICAgIFNtYWxsVmVjdG9yPHVpbnQzMl90LCA4PiBMb2NhbE1hY3JvSURzOwogICAgIGlmIChoYXNTdWJtb2R1bGVNYWNyb3MpIHsKLSAgICAgIHdoaWxlICh1aW50MzJfdCBMb2NhbE1hY3JvSUQgPSBSZWFkVW5hbGlnbmVkTEUzMihkKSkgeworICAgICAgd2hpbGUgKHVpbnQzMl90IExvY2FsTWFjcm9JRCA9CisgICAgICAgICAgICAgICAgIGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKSkgewogICAgICAgICBEYXRhTGVuIC09IDQ7CiAgICAgICAgIExvY2FsTWFjcm9JRHMucHVzaF9iYWNrKExvY2FsTWFjcm9JRCk7CiAgICAgICB9CkBAIC01NzksMTEgKzY1NCwzNCBAQAogICAgIH0KIAogICAgIGlmIChGLktpbmQgPT0gTUtfTW9kdWxlKSB7CisgICAgICAvLyBNYWNybyBkZWZpbml0aW9ucyBhcmUgc3RvcmVkIGZyb20gbmV3ZXN0IHRvIG9sZGVzdCwgc28gcmV2ZXJzZSB0aGVtCisgICAgICAvLyBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlbS4KKyAgICAgIGxsdm06OlNtYWxsVmVjdG9yPHVuc2lnbmVkLCA4PiBNYWNyb1NpemVzOwogICAgICAgZm9yIChTbWFsbFZlY3RvckltcGw8dWludDMyX3Q+OjppdGVyYXRvcgotICAgICAgICAgICAgIEkgPSBMb2NhbE1hY3JvSURzLmJlZ2luKCksIEUgPSBMb2NhbE1hY3JvSURzLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgICBNYWNyb0lEIE1hY0lEID0gUmVhZGVyLmdldEdsb2JhbE1hY3JvSUQoRiwgKkkpOwotICAgICAgICBSZWFkZXIuYWRkUGVuZGluZ01hY3JvRnJvbU1vZHVsZShJSSwgJkYsIE1hY0lELCBGLkRpcmVjdEltcG9ydExvYyk7CisgICAgICAgICAgICAgSSA9IExvY2FsTWFjcm9JRHMuYmVnaW4oKSwgRSA9IExvY2FsTWFjcm9JRHMuZW5kKCk7IEkgIT0gRTsgLyoqLykgeworICAgICAgICB1bnNpZ25lZCBTaXplID0gMTsKKworICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgSGFzT3ZlcnJpZGVzRmxhZyA9IDB4ODAwMDAwMDBVOworICAgICAgICBpZiAoSSArIDEgIT0gRSAmJiAoSVsxXSAmIEhhc092ZXJyaWRlc0ZsYWcpKQorICAgICAgICAgIFNpemUgKz0gMSArIChJWzFdICYgfkhhc092ZXJyaWRlc0ZsYWcpOworCisgICAgICAgIE1hY3JvU2l6ZXMucHVzaF9iYWNrKFNpemUpOworICAgICAgICBJICs9IFNpemU7CiAgICAgICB9CisKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDx1aW50MzJfdD46Oml0ZXJhdG9yIEkgPSBMb2NhbE1hY3JvSURzLmVuZCgpOworICAgICAgZm9yIChTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+OjpyZXZlcnNlX2l0ZXJhdG9yIFNJID0gTWFjcm9TaXplcy5yYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRSA9IE1hY3JvU2l6ZXMucmVuZCgpOworICAgICAgICAgICBTSSAhPSBTRTsgKytTSSkgeworICAgICAgICBJIC09ICpTSTsKKworICAgICAgICB1aW50MzJfdCBMb2NhbE1hY3JvSUQgPSAqSTsKKyAgICAgICAgbGx2bTo6QXJyYXlSZWY8dWludDMyX3Q+IE92ZXJyaWRlczsKKyAgICAgICAgaWYgKCpTSSAhPSAxKQorICAgICAgICAgIE92ZXJyaWRlcyA9IGxsdm06Om1ha2VBcnJheVJlZigmSVsyXSwgKlNJIC0gMik7CisgICAgICAgIFJlYWRlci5hZGRQZW5kaW5nTWFjcm9Gcm9tTW9kdWxlKElJLCAmRiwgTG9jYWxNYWNyb0lELCBPdmVycmlkZXMpOworICAgICAgfQorICAgICAgYXNzZXJ0KEkgPT0gTG9jYWxNYWNyb0lEcy5iZWdpbigpKTsKICAgICB9IGVsc2UgewogICAgICAgUmVhZGVyLmFkZFBlbmRpbmdNYWNyb0Zyb21QQ0goSUksICZGLCBNYWNyb0RpcmVjdGl2ZXNPZmZzZXQpOwogICAgIH0KQEAgLTU5Niw3ICs2OTQsOCBAQAogICBpZiAoRGF0YUxlbiA+IDApIHsKICAgICBTbWFsbFZlY3Rvcjx1aW50MzJfdCwgND4gRGVjbElEczsKICAgICBmb3IgKDsgRGF0YUxlbiA+IDA7IERhdGFMZW4gLT0gNCkKLSAgICAgIERlY2xJRHMucHVzaF9iYWNrKFJlYWRlci5nZXRHbG9iYWxEZWNsSUQoRiwgUmVhZFVuYWxpZ25lZExFMzIoZCkpKTsKKyAgICAgIERlY2xJRHMucHVzaF9iYWNrKFJlYWRlci5nZXRHbG9iYWxEZWNsSUQoCisgICAgICAgICAgRiwgZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpKSk7CiAgICAgUmVhZGVyLlNldEdsb2JhbGx5VmlzaWJsZURlY2xzKElJLCBEZWNsSURzKTsKICAgfQogCkBAIC02NjQsMzQgKzc2MywzNyBAQAogCiBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPgogQVNURGVjbENvbnRleHROYW1lTG9va3VwVHJhaXQ6OlJlYWRLZXlEYXRhTGVuZ3RoKGNvbnN0IHVuc2lnbmVkIGNoYXIqJiBkKSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6aW87Ci0gIHVuc2lnbmVkIEtleUxlbiA9IFJlYWRVbmFsaWduZWRMRTE2KGQpOwotICB1bnNpZ25lZCBEYXRhTGVuID0gUmVhZFVuYWxpZ25lZExFMTYoZCk7CisgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICB1bnNpZ25lZCBLZXlMZW4gPSBlbmRpYW46OnJlYWROZXh0PHVpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CisgIHVuc2lnbmVkIERhdGFMZW4gPSBlbmRpYW46OnJlYWROZXh0PHVpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CiAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihLZXlMZW4sIERhdGFMZW4pOwogfQogCiBBU1REZWNsQ29udGV4dE5hbWVMb29rdXBUcmFpdDo6aW50ZXJuYWxfa2V5X3R5cGUgCiBBU1REZWNsQ29udGV4dE5hbWVMb29rdXBUcmFpdDo6UmVhZEtleShjb25zdCB1bnNpZ25lZCBjaGFyKiBkLCB1bnNpZ25lZCkgewotICB1c2luZyBuYW1lc3BhY2UgY2xhbmc6OmlvOworICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKIAogICBEZWNsTmFtZUtleSBLZXk7CiAgIEtleS5LaW5kID0gKERlY2xhcmF0aW9uTmFtZTo6TmFtZUtpbmQpKmQrKzsKICAgc3dpdGNoIChLZXkuS2luZCkgewogICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6SWRlbnRpZmllcjoKLSAgICBLZXkuRGF0YSA9ICh1aW50NjRfdClSZWFkZXIuZ2V0TG9jYWxJZGVudGlmaWVyKEYsIFJlYWRVbmFsaWduZWRMRTMyKGQpKTsKKyAgICBLZXkuRGF0YSA9ICh1aW50NjRfdClSZWFkZXIuZ2V0TG9jYWxJZGVudGlmaWVyKAorICAgICAgICBGLCBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCkpOwogICAgIGJyZWFrOwogICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6T2JqQ1plcm9BcmdTZWxlY3RvcjoKICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6Ok9iakNPbmVBcmdTZWxlY3RvcjoKICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6Ok9iakNNdWx0aUFyZ1NlbGVjdG9yOgogICAgIEtleS5EYXRhID0KLSAgICAgICAodWludDY0X3QpUmVhZGVyLmdldExvY2FsU2VsZWN0b3IoRiwgUmVhZFVuYWxpZ25lZExFMzIoZCkpCi0gICAgICAgICAgICAgICAgICAgLmdldEFzT3BhcXVlUHRyKCk7CisgICAgICAgICh1aW50NjRfdClSZWFkZXIuZ2V0TG9jYWxTZWxlY3RvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRiwgZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCkpLmdldEFzT3BhcXVlUHRyKCk7CiAgICAgYnJlYWs7CiAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhPcGVyYXRvck5hbWU6CiAgICAgS2V5LkRhdGEgPSAqZCsrOyAvLyBPdmVybG9hZGVkT3BlcmF0b3JLaW5kCiAgICAgYnJlYWs7CiAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhMaXRlcmFsT3BlcmF0b3JOYW1lOgotICAgIEtleS5EYXRhID0gKHVpbnQ2NF90KVJlYWRlci5nZXRMb2NhbElkZW50aWZpZXIoRiwgUmVhZFVuYWxpZ25lZExFMzIoZCkpOworICAgIEtleS5EYXRhID0gKHVpbnQ2NF90KVJlYWRlci5nZXRMb2NhbElkZW50aWZpZXIoCisgICAgICAgIEYsIGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKSk7CiAgICAgYnJlYWs7CiAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhDb25zdHJ1Y3Rvck5hbWU6CiAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhEZXN0cnVjdG9yTmFtZToKQEAgLTcwOCw4ICs4MTAsOCBAQAogQVNURGVjbENvbnRleHROYW1lTG9va3VwVHJhaXQ6OlJlYWREYXRhKGludGVybmFsX2tleV90eXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERhdGFMZW4pIHsKLSAgdXNpbmcgbmFtZXNwYWNlIGNsYW5nOjppbzsKLSAgdW5zaWduZWQgTnVtRGVjbHMgPSBSZWFkVW5hbGlnbmVkTEUxNihkKTsKKyAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgIHVuc2lnbmVkIE51bURlY2xzID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpOwogICBMRTMyRGVjbElEICpTdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8TEUzMkRlY2xJRCAqPigKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhciAqPihkKSk7CiAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihTdGFydCwgU3RhcnQgKyBOdW1EZWNscyk7CkBAIC0xMjYyLDE2ICsxMzY0LDE4IEBACiAgICAgCiBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPgogSGVhZGVyRmlsZUluZm9UcmFpdDo6UmVhZEtleURhdGFMZW5ndGgoY29uc3QgdW5zaWduZWQgY2hhciomIGQpIHsKLSAgdW5zaWduZWQgS2V5TGVuID0gKHVuc2lnbmVkKSBjbGFuZzo6aW86OlJlYWRVbmFsaWduZWRMRTE2KGQpOworICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgdW5zaWduZWQgS2V5TGVuID0gKHVuc2lnbmVkKSBlbmRpYW46OnJlYWROZXh0PHVpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CiAgIHVuc2lnbmVkIERhdGFMZW4gPSAodW5zaWduZWQpICpkKys7CiAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihLZXlMZW4sIERhdGFMZW4pOwogfQogCiBIZWFkZXJGaWxlSW5mb1RyYWl0OjppbnRlcm5hbF9rZXlfdHlwZQogSGVhZGVyRmlsZUluZm9UcmFpdDo6UmVhZEtleShjb25zdCB1bnNpZ25lZCBjaGFyICpkLCB1bnNpZ25lZCkgeworICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKICAgaW50ZXJuYWxfa2V5X3R5cGUgaWtleTsKLSAgaWtleS5TaXplID0gb2ZmX3QoY2xhbmc6OmlvOjpSZWFkVW5hbGlnbmVkTEU2NChkKSk7Ci0gIGlrZXkuTW9kVGltZSA9IHRpbWVfdChjbGFuZzo6aW86OlJlYWRVbmFsaWduZWRMRTY0KGQpKTsKKyAgaWtleS5TaXplID0gb2ZmX3QoZW5kaWFuOjpyZWFkTmV4dDx1aW50NjRfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpKTsKKyAgaWtleS5Nb2RUaW1lID0gdGltZV90KGVuZGlhbjo6cmVhZE5leHQ8dWludDY0X3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKSk7CiAgIGlrZXkuRmlsZW5hbWUgPSAoY29uc3QgY2hhciAqKWQ7CiAgIHJldHVybiBpa2V5OwogfQpAQCAtMTI4MCw3ICsxMzg0LDcgQEAKIEhlYWRlckZpbGVJbmZvVHJhaXQ6OlJlYWREYXRhKGludGVybmFsX2tleV9yZWYga2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGF0YUxlbikgewogICBjb25zdCB1bnNpZ25lZCBjaGFyICpFbmQgPSBkICsgRGF0YUxlbjsKLSAgdXNpbmcgbmFtZXNwYWNlIGNsYW5nOjppbzsKKyAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CiAgIEhlYWRlckZpbGVJbmZvIEhGSTsKICAgdW5zaWduZWQgRmxhZ3MgPSAqZCsrOwogICBIRkkuSGVhZGVyUm9sZSA9IHN0YXRpY19jYXN0PE1vZHVsZU1hcDo6TW9kdWxlSGVhZGVyUm9sZT4KQEAgLTEyOTAsMTAgKzEzOTQsMTEgQEAKICAgSEZJLkRpckluZm8gPSAoRmxhZ3MgPj4gMikgJiAweDAzOwogICBIRkkuUmVzb2x2ZWQgPSAoRmxhZ3MgPj4gMSkgJiAweDAxOwogICBIRkkuSW5kZXhIZWFkZXJNYXBIZWFkZXIgPSBGbGFncyAmIDB4MDE7Ci0gIEhGSS5OdW1JbmNsdWRlcyA9IFJlYWRVbmFsaWduZWRMRTE2KGQpOwotICBIRkkuQ29udHJvbGxpbmdNYWNyb0lEID0gUmVhZGVyLmdldEdsb2JhbElkZW50aWZpZXJJRChNLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZFVuYWxpZ25lZExFMzIoZCkpOwotICBpZiAodW5zaWduZWQgRnJhbWV3b3JrT2Zmc2V0ID0gUmVhZFVuYWxpZ25lZExFMzIoZCkpIHsKKyAgSEZJLk51bUluY2x1ZGVzID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpOworICBIRkkuQ29udHJvbGxpbmdNYWNyb0lEID0gUmVhZGVyLmdldEdsb2JhbElkZW50aWZpZXJJRCgKKyAgICAgIE0sIGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKSk7CisgIGlmICh1bnNpZ25lZCBGcmFtZXdvcmtPZmZzZXQgPQorICAgICAgICAgIGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKSkgewogICAgIC8vIFRoZSBmcmFtZXdvcmsgb2Zmc2V0IGlzIDEgZ3JlYXRlciB0aGFuIHRoZSBhY3R1YWwgb2Zmc2V0LCAKICAgICAvLyBzaW5jZSAwIGlzIHVzZWQgYXMgYW4gaW5kaWNhdG9yIGZvciAibm8gZnJhbWV3b3JrIG5hbWUiLgogICAgIFN0cmluZ1JlZiBGcmFtZXdvcmtOYW1lKEZyYW1ld29ya1N0cmluZ3MgKyBGcmFtZXdvcmtPZmZzZXQgLSAxKTsKQEAgLTEzMDEsNyArMTQwNiw3IEBACiAgIH0KICAgCiAgIGlmIChkICE9IEVuZCkgewotICAgIHVpbnQzMl90IExvY2FsU01JRCA9IFJlYWRVbmFsaWduZWRMRTMyKGQpOworICAgIHVpbnQzMl90IExvY2FsU01JRCA9IGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKTsKICAgICBpZiAoTG9jYWxTTUlEKSB7CiAgICAgICAvLyBUaGlzIGhlYWRlciBpcyBwYXJ0IG9mIGEgbW9kdWxlLiBBc3NvY2lhdGUgaXQgd2l0aCB0aGUgbW9kdWxlIHRvIGVuYWJsZQogICAgICAgLy8gaW1wbGljaXQgbW9kdWxlIGltcG9ydC4KQEAgLTEzMjMsMTIgKzE0MjgsMTkgQEAKICAgcmV0dXJuIEhGSTsKIH0KIAotdm9pZCBBU1RSZWFkZXI6OmFkZFBlbmRpbmdNYWNyb0Zyb21Nb2R1bGUoSWRlbnRpZmllckluZm8gKklJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlRmlsZSAqTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbE1hY3JvSUQgR01hY0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gSW1wb3J0TG9jKSB7Cit2b2lkCitBU1RSZWFkZXI6OmFkZFBlbmRpbmdNYWNyb0Zyb21Nb2R1bGUoSWRlbnRpZmllckluZm8gKklJLCBNb2R1bGVGaWxlICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbE1hY3JvSUQgR01hY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkFycmF5UmVmPFN1Ym1vZHVsZUlEPiBPdmVycmlkZXMpIHsKICAgYXNzZXJ0KE51bUN1cnJlbnRFbGVtZW50c0Rlc2VyaWFsaXppbmcgPiAwICYmIk1pc3NpbmcgZGVzZXJpYWxpemF0aW9uIGd1YXJkIik7Ci0gIFBlbmRpbmdNYWNyb0lEc1tJSV0ucHVzaF9iYWNrKFBlbmRpbmdNYWNyb0luZm8oTSwgR01hY0lELCBJbXBvcnRMb2MpKTsKKyAgU3VibW9kdWxlSUQgKk92ZXJyaWRlRGF0YSA9IDA7CisgIGlmICghT3ZlcnJpZGVzLmVtcHR5KCkpIHsKKyAgICBPdmVycmlkZURhdGEgPSBuZXcgKENvbnRleHQpIFN1Ym1vZHVsZUlEW092ZXJyaWRlcy5zaXplKCkgKyAxXTsKKyAgICBPdmVycmlkZURhdGFbMF0gPSBPdmVycmlkZXMuc2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gT3ZlcnJpZGVzLnNpemUoKTsgKytJKQorICAgICAgT3ZlcnJpZGVEYXRhW0kgKyAxXSA9IGdldEdsb2JhbFN1Ym1vZHVsZUlEKCpNLCBPdmVycmlkZXNbSV0pOworICB9CisgIFBlbmRpbmdNYWNyb0lEc1tJSV0ucHVzaF9iYWNrKFBlbmRpbmdNYWNyb0luZm8oTSwgR01hY0lELCBPdmVycmlkZURhdGEpKTsKIH0KIAogdm9pZCBBU1RSZWFkZXI6OmFkZFBlbmRpbmdNYWNyb0Zyb21QQ0goSWRlbnRpZmllckluZm8gKklJLApAQCAtMTQ3Nyw2ICsxNTg5LDU5IEBACiAgICAgSWRlbnRpZmllckdlbmVyYXRpb25bSUldID0gQ3VycmVudEdlbmVyYXRpb247CiB9CiAKK3N0cnVjdCBBU1RSZWFkZXI6Ok1vZHVsZU1hY3JvSW5mbyB7CisgIFN1Ym1vZHVsZUlEIFN1Yk1vZElEOworICBNYWNyb0luZm8gKk1JOworICBTdWJtb2R1bGVJRCAqT3ZlcnJpZGVzOworICAvLyBGSVhNRTogUmVtb3ZlIHRoaXMuCisgIE1vZHVsZUZpbGUgKkY7CisKKyAgYm9vbCBpc0RlZmluZSgpIGNvbnN0IHsgcmV0dXJuIE1JOyB9CisKKyAgU3VibW9kdWxlSUQgZ2V0U3VibW9kdWxlSUQoKSBjb25zdCB7IHJldHVybiBTdWJNb2RJRDsgfQorCisgIGxsdm06OkFycmF5UmVmPFN1Ym1vZHVsZUlEPiBnZXRPdmVycmlkZGVuU3VibW9kdWxlcygpIGNvbnN0IHsKKyAgICBpZiAoIU92ZXJyaWRlcykKKyAgICAgIHJldHVybiBsbHZtOjpBcnJheVJlZjxTdWJtb2R1bGVJRD4oKTsKKyAgICByZXR1cm4gbGx2bTo6bWFrZUFycmF5UmVmKE92ZXJyaWRlcyArIDEsICpPdmVycmlkZXMpOworICB9CisKKyAgRGVmTWFjcm9EaXJlY3RpdmUgKmltcG9ydChQcmVwcm9jZXNzb3IgJlBQLCBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MpIGNvbnN0IHsKKyAgICBpZiAoIU1JKQorICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIFBQLkFsbG9jYXRlRGVmTWFjcm9EaXJlY3RpdmUoTUksIEltcG9ydExvYywgLyppc0ltcG9ydGVkPSovdHJ1ZSk7CisgIH0KK307CisKK0FTVFJlYWRlcjo6TW9kdWxlTWFjcm9JbmZvICoKK0FTVFJlYWRlcjo6Z2V0TW9kdWxlTWFjcm8oY29uc3QgUGVuZGluZ01hY3JvSW5mbyAmUE1JbmZvKSB7CisgIE1vZHVsZU1hY3JvSW5mbyBJbmZvOworCisgIHVpbnQzMl90IElEID0gUE1JbmZvLk1vZHVsZU1hY3JvRGF0YS5NYWNJRDsKKyAgaWYgKElEICYgMSkgeworICAgIC8vIE1hY3JvIHVuZGVmaW5pdGlvbi4KKyAgICBJbmZvLlN1Yk1vZElEID0gZ2V0R2xvYmFsU3VibW9kdWxlSUQoKlBNSW5mby5NLCBJRCA+PiAxKTsKKyAgICBJbmZvLk1JID0gMDsKKyAgfSBlbHNlIHsKKyAgICAvLyBNYWNybyBkZWZpbml0aW9uLgorICAgIEdsb2JhbE1hY3JvSUQgR01hY0lEID0gZ2V0R2xvYmFsTWFjcm9JRCgqUE1JbmZvLk0sIElEID4+IDEpOworICAgIGFzc2VydChHTWFjSUQpOworCisgICAgLy8gSWYgdGhpcyBtYWNybyBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCwgZG9uJ3QgZG8gc28gYWdhaW4uCisgICAgLy8gRklYTUU6IFRoaXMgaXMgaGlnaGx5IGR1YmlvdXMuIE11bHRpcGxlIG1hY3JvIGRlZmluaXRpb25zIGNhbiBoYXZlIHRoZQorICAgIC8vIHNhbWUgTWFjcm9JbmZvIChhbmQgaGVuY2UgdGhlIHNhbWUgR01hY0lEKSBkdWUgdG8gI3ByYWdtYSBwdXNoX21hY3JvIGV0Yy4KKyAgICBpZiAoTWFjcm9zTG9hZGVkW0dNYWNJRCAtIE5VTV9QUkVERUZfTUFDUk9fSURTXSkKKyAgICAgIHJldHVybiAwOworCisgICAgSW5mby5NSSA9IGdldE1hY3JvKEdNYWNJRCk7CisgICAgSW5mby5TdWJNb2RJRCA9IEluZm8uTUktPmdldE93bmluZ01vZHVsZUlEKCk7CisgIH0KKyAgSW5mby5PdmVycmlkZXMgPSBQTUluZm8uTW9kdWxlTWFjcm9EYXRhLk92ZXJyaWRlczsKKyAgSW5mby5GID0gUE1JbmZvLk07CisKKyAgcmV0dXJuIG5ldyAoQ29udGV4dCkgTW9kdWxlTWFjcm9JbmZvKEluZm8pOworfQorCiB2b2lkIEFTVFJlYWRlcjo6cmVzb2x2ZVBlbmRpbmdNYWNybyhJZGVudGlmaWVySW5mbyAqSUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQZW5kaW5nTWFjcm9JbmZvICZQTUluZm8pIHsKICAgYXNzZXJ0KElJKTsKQEAgLTE0ODYsNDIgKzE2NTEsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSW5mby5QQ0hNYWNyb0RhdGEuTWFjcm9EaXJlY3RpdmVzT2Zmc2V0KTsKICAgICByZXR1cm47CiAgIH0KLSAgCisKICAgLy8gTW9kdWxlIE1hY3JvLgogCi0gIEdsb2JhbE1hY3JvSUQgR01hY0lEID0gUE1JbmZvLk1vZHVsZU1hY3JvRGF0YS5HTWFjSUQ7Ci0gIFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYyA9Ci0gICAgICBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKFBNSW5mby5Nb2R1bGVNYWNyb0RhdGEuSW1wb3J0TG9jKTsKLQotICBhc3NlcnQoR01hY0lEKTsKLSAgLy8gSWYgdGhpcyBtYWNybyBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCwgZG9uJ3QgZG8gc28gYWdhaW4uCi0gIGlmIChNYWNyb3NMb2FkZWRbR01hY0lEIC0gTlVNX1BSRURFRl9NQUNST19JRFNdKQorICBNb2R1bGVNYWNyb0luZm8gKk1NSSA9IGdldE1vZHVsZU1hY3JvKFBNSW5mbyk7CisgIGlmICghTU1JKQogICAgIHJldHVybjsKIAotICBNYWNyb0luZm8gKk1JID0gZ2V0TWFjcm8oR01hY0lEKTsKLSAgU3VibW9kdWxlSUQgU3ViTW9kSUQgPSBNSS0+Z2V0T3duaW5nTW9kdWxlSUQoKTsKLSAgTWFjcm9EaXJlY3RpdmUgKk1EID0gUFAuQWxsb2NhdGVEZWZNYWNyb0RpcmVjdGl2ZShNSSwgSW1wb3J0TG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNJbXBvcnRlZD0qL3RydWUpOwotCi0gIC8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgbWFjcm8gZGVmaW5pdGlvbiBpcyB2aXNpYmxlLgotICBib29sIEhpZGRlbiA9IGZhbHNlOwotICBNb2R1bGUgKk93bmVyID0gMDsKLSAgaWYgKFN1Yk1vZElEKSB7Ci0gICAgaWYgKChPd25lciA9IGdldFN1Ym1vZHVsZShTdWJNb2RJRCkpKSB7Ci0gICAgICBpZiAoT3duZXItPk5hbWVWaXNpYmlsaXR5ID09IE1vZHVsZTo6SGlkZGVuKSB7Ci0gICAgICAgIC8vIFRoZSBvd25pbmcgbW9kdWxlIGlzIG5vdCB2aXNpYmxlLCBhbmQgdGhpcyBtYWNybyBkZWZpbml0aW9uCi0gICAgICAgIC8vIHNob3VsZCBub3QgYmUsIGVpdGhlci4KLSAgICAgICAgSGlkZGVuID0gdHJ1ZTsKLQotICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtYWNybyBkZWZpbml0aW9uIHdhcyBoaWRkZW4gYmVjYXVzZSBpdHMgb3duaW5nCi0gICAgICAgIC8vIG1vZHVsZSBpcyBub3QgeWV0IHZpc2libGUuCi0gICAgICAgIEhpZGRlbk5hbWVzTWFwW093bmVyXS5wdXNoX2JhY2soSGlkZGVuTmFtZShJSSwgTUQpKTsKLSAgICAgIH0KLSAgICB9CisgIE1vZHVsZSAqT3duZXIgPSBnZXRTdWJtb2R1bGUoTU1JLT5nZXRTdWJtb2R1bGVJRCgpKTsKKyAgaWYgKE93bmVyICYmIE93bmVyLT5OYW1lVmlzaWJpbGl0eSA9PSBNb2R1bGU6OkhpZGRlbikgeworICAgIC8vIE1hY3JvcyBpbiB0aGUgb3duaW5nIG1vZHVsZSBhcmUgaGlkZGVuLiBKdXN0IHJlbWVtYmVyIHRoaXMgbWFjcm8gdG8KKyAgICAvLyBpbnN0YWxsIGlmIHdlIG1ha2UgdGhpcyBtb2R1bGUgdmlzaWJsZS4KKyAgICBIaWRkZW5OYW1lc01hcFtPd25lcl0uSGlkZGVuTWFjcm9zLmluc2VydChzdGQ6Om1ha2VfcGFpcihJSSwgTU1JKSk7CisgIH0gZWxzZSB7CisgICAgaW5zdGFsbEltcG9ydGVkTWFjcm8oSUksIE1NSSwgT3duZXIpOwogICB9Ci0KLSAgaWYgKCFIaWRkZW4pCi0gICAgaW5zdGFsbEltcG9ydGVkTWFjcm8oSUksIE1ELCBPd25lcik7CiB9CiAKIHZvaWQgQVNUUmVhZGVyOjppbnN0YWxsUENITWFjcm9EaXJlY3RpdmVzKElkZW50aWZpZXJJbmZvICpJSSwKQEAgLTE2MDYsMzQgKzE3NTAsMTgxIEBACiAgIHJldHVybiBQcmV2SW5TeXN0ZW0gJiYgTmV3SW5TeXN0ZW07CiB9CiAKLXZvaWQgQVNUUmVhZGVyOjppbnN0YWxsSW1wb3J0ZWRNYWNybyhJZGVudGlmaWVySW5mbyAqSUksIE1hY3JvRGlyZWN0aXZlICpNRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKk93bmVyKSB7Ci0gIGFzc2VydChJSSAmJiBNRCk7Cit2b2lkIEFTVFJlYWRlcjo6cmVtb3ZlT3ZlcnJpZGRlbk1hY3JvcyhJZGVudGlmaWVySW5mbyAqSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbWJpZ3VvdXNNYWNyb3MgJkFtYmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8U3VibW9kdWxlSUQ+IE92ZXJyaWRlcykgeworICBmb3IgKHVuc2lnbmVkIE9JID0gMCwgT04gPSBPdmVycmlkZXMuc2l6ZSgpOyBPSSAhPSBPTjsgKytPSSkgeworICAgIFN1Ym1vZHVsZUlEIE93bmVySUQgPSBPdmVycmlkZXNbT0ldOwogCi0gIERlZk1hY3JvRGlyZWN0aXZlICpEZWZNRCA9IGNhc3Q8RGVmTWFjcm9EaXJlY3RpdmU+KE1EKTsKKyAgICAvLyBJZiB0aGlzIG1hY3JvIGlzIG5vdCB5ZXQgdmlzaWJsZSwgcmVtb3ZlIGl0IGZyb20gdGhlIGhpZGRlbiBuYW1lcyBsaXN0LgorICAgIE1vZHVsZSAqT3duZXIgPSBnZXRTdWJtb2R1bGUoT3duZXJJRCk7CisgICAgSGlkZGVuTmFtZXMgJkhpZGRlbiA9IEhpZGRlbk5hbWVzTWFwW093bmVyXTsKKyAgICBIaWRkZW5NYWNyb3NNYXA6Oml0ZXJhdG9yIEhJID0gSGlkZGVuLkhpZGRlbk1hY3Jvcy5maW5kKElJKTsKKyAgICBpZiAoSEkgIT0gSGlkZGVuLkhpZGRlbk1hY3Jvcy5lbmQoKSkgeworICAgICAgYXV0byBTdWJPdmVycmlkZXMgPSBISS0+c2Vjb25kLT5nZXRPdmVycmlkZGVuU3VibW9kdWxlcygpOworICAgICAgSGlkZGVuLkhpZGRlbk1hY3Jvcy5lcmFzZShISSk7CisgICAgICByZW1vdmVPdmVycmlkZGVuTWFjcm9zKElJLCBBbWJpZywgU3ViT3ZlcnJpZGVzKTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIG1hY3JvIGlzIGFscmVhZHkgaW4gb3VyIGxpc3Qgb2YgY29uZmxpY3RzLCByZW1vdmUgaXQgZnJvbSB0aGVyZS4KKyAgICBBbWJpZy5lcmFzZSgKKyAgICAgICAgc3RkOjpyZW1vdmVfaWYoQW1iaWcuYmVnaW4oKSwgQW1iaWcuZW5kKCksIFsmXShEZWZNYWNyb0RpcmVjdGl2ZSAqTUQpIHsKKyAgICAgICAgICByZXR1cm4gTUQtPmdldEluZm8oKS0+Z2V0T3duaW5nTW9kdWxlSUQoKSA9PSBPd25lcklEOworICAgICAgICB9KSwKKyAgICAgICAgQW1iaWcuZW5kKCkpOworICB9Cit9CisKK0FTVFJlYWRlcjo6QW1iaWd1b3VzTWFjcm9zICoKK0FTVFJlYWRlcjo6cmVtb3ZlT3ZlcnJpZGRlbk1hY3JvcyhJZGVudGlmaWVySW5mbyAqSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8U3VibW9kdWxlSUQ+IE92ZXJyaWRlcykgewogICBNYWNyb0RpcmVjdGl2ZSAqUHJldiA9IFBQLmdldE1hY3JvRGlyZWN0aXZlKElJKTsKLSAgaWYgKFByZXYpIHsKLSAgICBNYWNyb0RpcmVjdGl2ZTo6RGVmSW5mbyBQcmV2RGVmID0gUHJldi0+Z2V0RGVmaW5pdGlvbigpOwotICAgIE1hY3JvSW5mbyAqUHJldk1JID0gUHJldkRlZi5nZXRNYWNyb0luZm8oKTsKLSAgICBNYWNyb0luZm8gKk5ld01JID0gRGVmTUQtPmdldEluZm8oKTsKLSAgICBpZiAoTmV3TUkgIT0gUHJldk1JICYmICFQcmV2TUktPmlzSWRlbnRpY2FsVG8oKk5ld01JLCBQUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypTeW50YWN0aWNhbGx5PSovdHJ1ZSkpIHsKLSAgICAgIC8vIEJlZm9yZSBtYXJraW5nIHRoZSBtYWNyb3MgYXMgYW1iaWd1b3VzLCBjaGVjayBpZiB0aGlzIGlzIGEgY2FzZSB3aGVyZQotICAgICAgLy8gYm90aCBtYWNyb3MgYXJlIGluIHN5c3RlbSBoZWFkZXJzLiBJZiBzbywgd2UgdHJ1c3QgdGhhdCB0aGUgc3lzdGVtCi0gICAgICAvLyBkaWQgbm90IGdldCBpdCB3cm9uZy4gVGhpcyBhbHNvIGhhbmRsZXMgY2FzZXMgd2hlcmUgQ2xhbmcncyBvd24KLSAgICAgIC8vIGhlYWRlcnMgaGF2ZSBhIGRpZmZlcmVudCBzcGVsbGluZyBvZiBjZXJ0YWluIHN5c3RlbSBtYWNyb3M6Ci0gICAgICAvLyAgICNkZWZpbmUgTE9OR19NQVggX19MT05HX01BWF9fIChjbGFuZydzIGxpbWl0cy5oKQotICAgICAgLy8gICAjZGVmaW5lIExPTkdfTUFYIDB4N2ZmZmZmZmZmZmZmZmZmZkwgKHN5c3RlbSdzIGxpbWl0cy5oKQotICAgICAgaWYgKCFhcmVEZWZpbmVkSW5TeXN0ZW1Nb2R1bGVzKFByZXZNSSwgTmV3TUksIE93bmVyLCAqdGhpcykpIHsKLSAgICAgICAgUHJldkRlZi5nZXREaXJlY3RpdmUoKS0+c2V0QW1iaWd1b3VzKHRydWUpOwotICAgICAgICBEZWZNRC0+c2V0QW1iaWd1b3VzKHRydWUpOwotICAgICAgfQorICBpZiAoIVByZXYgJiYgT3ZlcnJpZGVzLmVtcHR5KCkpCisgICAgcmV0dXJuIDA7CisKKyAgRGVmTWFjcm9EaXJlY3RpdmUgKlByZXZEZWYgPSBQcmV2ID8gUHJldi0+Z2V0RGVmaW5pdGlvbigpLmdldERpcmVjdGl2ZSgpIDogMDsKKyAgaWYgKFByZXZEZWYgJiYgUHJldkRlZi0+aXNBbWJpZ3VvdXMoKSkgeworICAgIC8vIFdlIGhhZCBhIHByaW9yIGFtYmlndWl0eS4gQ2hlY2sgd2hldGhlciB3ZSByZXNvbHZlIGl0IChvciBtYWtlIGl0IHdvcnNlKS4KKyAgICBBbWJpZ3VvdXNNYWNyb3MgJkFtYmlnID0gQW1iaWd1b3VzTWFjcm9EZWZzW0lJXTsKKyAgICBBbWJpZy5wdXNoX2JhY2soUHJldkRlZik7CisKKyAgICByZW1vdmVPdmVycmlkZGVuTWFjcm9zKElJLCBBbWJpZywgT3ZlcnJpZGVzKTsKKworICAgIGlmICghQW1iaWcuZW1wdHkoKSkKKyAgICAgIHJldHVybiAmQW1iaWc7CisKKyAgICBBbWJpZ3VvdXNNYWNyb0RlZnMuZXJhc2UoSUkpOworICB9IGVsc2UgeworICAgIC8vIFRoZXJlJ3Mgbm8gYW1iaWd1aXR5IHlldC4gTWF5YmUgd2UncmUgaW50cm9kdWNpbmcgb25lLgorICAgIGxsdm06OlNtYWxsVmVjdG9yPERlZk1hY3JvRGlyZWN0aXZlKiwgMT4gQW1iaWc7CisgICAgaWYgKFByZXZEZWYpCisgICAgICBBbWJpZy5wdXNoX2JhY2soUHJldkRlZik7CisKKyAgICByZW1vdmVPdmVycmlkZGVuTWFjcm9zKElJLCBBbWJpZywgT3ZlcnJpZGVzKTsKKworICAgIGlmICghQW1iaWcuZW1wdHkoKSkgeworICAgICAgQW1iaWd1b3VzTWFjcm9zICZSZXN1bHQgPSBBbWJpZ3VvdXNNYWNyb0RlZnNbSUldOworICAgICAgUmVzdWx0LnN3YXAoQW1iaWcpOworICAgICAgcmV0dXJuICZSZXN1bHQ7CiAgICAgfQogICB9Ci0gIAorCisgIC8vIFdlIGVuZGVkIHVwIHdpdGggbm8gYW1iaWd1aXR5LgorICByZXR1cm4gMDsKK30KKwordm9pZCBBU1RSZWFkZXI6Omluc3RhbGxJbXBvcnRlZE1hY3JvKElkZW50aWZpZXJJbmZvICpJSSwgTW9kdWxlTWFjcm9JbmZvICpNTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICpPd25lcikgeworICBhc3NlcnQoSUkgJiYgT3duZXIpOworCisgIFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYyA9IE93bmVyLT5NYWNyb1Zpc2liaWxpdHlMb2M7CisgIGlmIChJbXBvcnRMb2MuaXNJbnZhbGlkKCkpIHsKKyAgICAvLyBGSVhNRTogSWYgd2UgbWFkZSBtYWNyb3MgZnJvbSB0aGlzIG1vZHVsZSB2aXNpYmxlIGJ1dCBkaWRuJ3QgcHJvdmlkZSBhCisgICAgLy8gc291cmNlIGxvY2F0aW9uIGZvciB0aGUgaW1wb3J0LCB3ZSBkb24ndCBoYXZlIGEgbG9jYXRpb24gZm9yIHRoZSBtYWNyby4KKyAgICAvLyBVc2UgdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRoZSBjb250YWluaW5nIG1vZHVsZSBmaWxlIHdhcyBmaXJzdCBpbXBvcnRlZAorICAgIC8vIGZvciBub3cuCisgICAgSW1wb3J0TG9jID0gTU1JLT5GLT5EaXJlY3RJbXBvcnRMb2M7CisgICAgYXNzZXJ0KEltcG9ydExvYy5pc1ZhbGlkKCkgJiYgIm5vIGltcG9ydCBsb2NhdGlvbiBmb3IgYSB2aXNpYmxlIG1hY3JvPyIpOworICB9CisKKyAgbGx2bTo6U21hbGxWZWN0b3JJbXBsPERlZk1hY3JvRGlyZWN0aXZlKj4gKlByZXYgPQorICAgICAgcmVtb3ZlT3ZlcnJpZGRlbk1hY3JvcyhJSSwgTU1JLT5nZXRPdmVycmlkZGVuU3VibW9kdWxlcygpKTsKKworCisgIC8vIENyZWF0ZSBhIHN5bnRoZXRpYyBtYWNybyBkZWZpbml0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGltcG9ydCAob3IgbnVsbAorICAvLyBpZiB0aGlzIHdhcyBhbiB1bmRlZmluaXRpb24gb2YgdGhlIG1hY3JvKS4KKyAgRGVmTWFjcm9EaXJlY3RpdmUgKk1EID0gTU1JLT5pbXBvcnQoUFAsIEltcG9ydExvYyk7CisKKyAgLy8gSWYgdGhlcmUncyBubyBhbWJpZ3VpdHksIGp1c3QgaW5zdGFsbCB0aGUgbWFjcm8uCisgIGlmICghUHJldikgeworICAgIGlmIChNRCkKKyAgICAgIFBQLmFwcGVuZE1hY3JvRGlyZWN0aXZlKElJLCBNRCk7CisgICAgZWxzZQorICAgICAgUFAuYXBwZW5kTWFjcm9EaXJlY3RpdmUoSUksIFBQLkFsbG9jYXRlVW5kZWZNYWNyb0RpcmVjdGl2ZShJbXBvcnRMb2MpKTsKKyAgICByZXR1cm47CisgIH0KKyAgYXNzZXJ0KCFQcmV2LT5lbXB0eSgpKTsKKworICBpZiAoIU1EKSB7CisgICAgLy8gV2UgaW1wb3J0ZWQgYSAjdW5kZWYgdGhhdCBkaWRuJ3QgcmVtb3ZlIGFsbCBwcmlvciBkZWZpbml0aW9ucy4gVGhlIG1vc3QKKyAgICAvLyByZWNlbnQgcHJpb3IgZGVmaW5pdGlvbiByZW1haW5zLCBhbmQgd2UgaW5zdGFsbCBpdCBpbiB0aGUgcGxhY2Ugb2YgdGhlCisgICAgLy8gaW1wb3J0ZWQgZGlyZWN0aXZlLgorICAgIE1hY3JvSW5mbyAqTmV3TUkgPSBQcmV2LT5iYWNrKCktPmdldEluZm8oKTsKKyAgICBQcmV2LT5wb3BfYmFjaygpOworICAgIE1EID0gUFAuQWxsb2NhdGVEZWZNYWNyb0RpcmVjdGl2ZShOZXdNSSwgSW1wb3J0TG9jLCAvKkltcG9ydGVkKi90cnVlKTsKKyAgfQorCisgIC8vIFdlJ3JlIGludHJvZHVjaW5nIGEgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGNyZWF0ZXMgb3IgYWRkcyB0byBhbiBhbWJpZ3VpdHkuCisgIC8vIFdlIGNhbiByZXNvbHZlIHRoYXQgYW1iaWd1aXR5IGlmIHRoaXMgbWFjcm8gaXMgdG9rZW4tZm9yLXRva2VuIGlkZW50aWNhbCB0bworICAvLyBhbGwgb2YgdGhlIGV4aXN0aW5nIGRlZmluaXRpb25zLgorICBNYWNyb0luZm8gKk5ld01JID0gTUQtPmdldEluZm8oKTsKKyAgYXNzZXJ0KE5ld01JICYmICJtYWNybyBkZWZpbml0aW9uIHdpdGggbm8gTWFjcm9JbmZvPyIpOworICB3aGlsZSAoIVByZXYtPmVtcHR5KCkpIHsKKyAgICBNYWNyb0luZm8gKlByZXZNSSA9IFByZXYtPmJhY2soKS0+Z2V0SW5mbygpOworICAgIGFzc2VydChQcmV2TUkgJiYgIm1hY3JvIGRlZmluaXRpb24gd2l0aCBubyBNYWNyb0luZm8/Iik7CisKKyAgICAvLyBCZWZvcmUgbWFya2luZyB0aGUgbWFjcm9zIGFzIGFtYmlndW91cywgY2hlY2sgaWYgdGhpcyBpcyBhIGNhc2Ugd2hlcmUKKyAgICAvLyBib3RoIG1hY3JvcyBhcmUgaW4gc3lzdGVtIGhlYWRlcnMuIElmIHNvLCB3ZSB0cnVzdCB0aGF0IHRoZSBzeXN0ZW0KKyAgICAvLyBkaWQgbm90IGdldCBpdCB3cm9uZy4gVGhpcyBhbHNvIGhhbmRsZXMgY2FzZXMgd2hlcmUgQ2xhbmcncyBvd24KKyAgICAvLyBoZWFkZXJzIGhhdmUgYSBkaWZmZXJlbnQgc3BlbGxpbmcgb2YgY2VydGFpbiBzeXN0ZW0gbWFjcm9zOgorICAgIC8vICAgI2RlZmluZSBMT05HX01BWCBfX0xPTkdfTUFYX18gKGNsYW5nJ3MgbGltaXRzLmgpCisgICAgLy8gICAjZGVmaW5lIExPTkdfTUFYIDB4N2ZmZmZmZmZmZmZmZmZmZkwgKHN5c3RlbSdzIGxpbWl0cy5oKQorICAgIC8vCisgICAgLy8gRklYTUU6IFJlbW92ZSB0aGUgZGVmaW5lZC1pbi1zeXN0ZW0taGVhZGVycyBjaGVjay4gY2xhbmcncyBsaW1pdHMuaAorICAgIC8vIG92ZXJyaWRlcyB0aGUgc3lzdGVtIGxpbWl0cy5oJ3MgbWFjcm9zLCBzbyB0aGVyZSdzIG5vIGNvbmZsaWN0IGhlcmUuCisgICAgaWYgKE5ld01JICE9IFByZXZNSSAmJgorICAgICAgICAhUHJldk1JLT5pc0lkZW50aWNhbFRvKCpOZXdNSSwgUFAsIC8qU3ludGFjdGljYWxseT0qL3RydWUpICYmCisgICAgICAgICFhcmVEZWZpbmVkSW5TeXN0ZW1Nb2R1bGVzKFByZXZNSSwgTmV3TUksIE93bmVyLCAqdGhpcykpCisgICAgICBicmVhazsKKworICAgIC8vIFRoZSBwcmV2aW91cyBkZWZpbml0aW9uIGlzIHRoZSBzYW1lIGFzIHRoaXMgb25lIChvciBib3RoIGFyZSBkZWZpbmVkIGluCisgICAgLy8gc3lzdGVtIG1vZHVsZXMgc28gd2UgY2FuIGFzc3VtZSB0aGV5J3JlIGVxdWl2YWxlbnQpOyB3ZSBkb24ndCBuZWVkIHRvCisgICAgLy8gdHJhY2sgaXQgYW55IG1vcmUuCisgICAgUHJldi0+cG9wX2JhY2soKTsKKyAgfQorCisgIGlmICghUHJldi0+ZW1wdHkoKSkKKyAgICBNRC0+c2V0QW1iaWd1b3VzKHRydWUpOworCiAgIFBQLmFwcGVuZE1hY3JvRGlyZWN0aXZlKElJLCBNRCk7CiB9CiAKK0FTVFJlYWRlcjo6SW5wdXRGaWxlSW5mbworQVNUUmVhZGVyOjpyZWFkSW5wdXRGaWxlSW5mbyhNb2R1bGVGaWxlICZGLCB1bnNpZ25lZCBJRCkgeworICAvLyBHbyBmaW5kIHRoaXMgaW5wdXQgZmlsZS4KKyAgQml0c3RyZWFtQ3Vyc29yICZDdXJzb3IgPSBGLklucHV0RmlsZXNDdXJzb3I7CisgIFNhdmVkU3RyZWFtUG9zaXRpb24gU2F2ZWRQb3NpdGlvbihDdXJzb3IpOworICBDdXJzb3IuSnVtcFRvQml0KEYuSW5wdXRGaWxlT2Zmc2V0c1tJRC0xXSk7CisKKyAgdW5zaWduZWQgQ29kZSA9IEN1cnNvci5SZWFkQ29kZSgpOworICBSZWNvcmREYXRhIFJlY29yZDsKKyAgU3RyaW5nUmVmIEJsb2I7CisKKyAgdW5zaWduZWQgUmVzdWx0ID0gQ3Vyc29yLnJlYWRSZWNvcmQoQ29kZSwgUmVjb3JkLCAmQmxvYik7CisgIGFzc2VydChzdGF0aWNfY2FzdDxJbnB1dEZpbGVSZWNvcmRUeXBlcz4oUmVzdWx0KSA9PSBJTlBVVF9GSUxFICYmCisgICAgICAgICAiaW52YWxpZCByZWNvcmQgdHlwZSBmb3IgaW5wdXQgZmlsZSIpOworICAodm9pZClSZXN1bHQ7CisKKyAgc3RkOjpzdHJpbmcgRmlsZW5hbWU7CisgIG9mZl90IFN0b3JlZFNpemU7CisgIHRpbWVfdCBTdG9yZWRUaW1lOworICBib29sIE92ZXJyaWRkZW47CisgIAorICBhc3NlcnQoUmVjb3JkWzBdID09IElEICYmICJCb2d1cyBzdG9yZWQgSUQgb3Igb2Zmc2V0Iik7CisgIFN0b3JlZFNpemUgPSBzdGF0aWNfY2FzdDxvZmZfdD4oUmVjb3JkWzFdKTsKKyAgU3RvcmVkVGltZSA9IHN0YXRpY19jYXN0PHRpbWVfdD4oUmVjb3JkWzJdKTsKKyAgT3ZlcnJpZGRlbiA9IHN0YXRpY19jYXN0PGJvb2w+KFJlY29yZFszXSk7CisgIEZpbGVuYW1lID0gQmxvYjsKKyAgTWF5YmVBZGRTeXN0ZW1Sb290VG9GaWxlbmFtZShGLCBGaWxlbmFtZSk7CisgIAorICBJbnB1dEZpbGVJbmZvIFIgPSB7IHN0ZDo6bW92ZShGaWxlbmFtZSksIFN0b3JlZFNpemUsIFN0b3JlZFRpbWUsIE92ZXJyaWRkZW4gfTsKKyAgcmV0dXJuIFI7Cit9CisKK3N0ZDo6c3RyaW5nIEFTVFJlYWRlcjo6Z2V0SW5wdXRGaWxlTmFtZShNb2R1bGVGaWxlICZGLCB1bnNpZ25lZCBpbnQgSUQpIHsKKyAgcmV0dXJuIHJlYWRJbnB1dEZpbGVJbmZvKEYsIElEKS5GaWxlbmFtZTsKK30KKwogSW5wdXRGaWxlIEFTVFJlYWRlcjo6Z2V0SW5wdXRGaWxlKE1vZHVsZUZpbGUgJkYsIHVuc2lnbmVkIElELCBib29sIENvbXBsYWluKSB7CiAgIC8vIElmIHRoaXMgSUQgaXMgYm9ndXMsIGp1c3QgcmV0dXJuIGFuIGVtcHR5IGlucHV0IGZpbGUuCiAgIGlmIChJRCA9PSAwIHx8IElEID4gRi5JbnB1dEZpbGVzTG9hZGVkLnNpemUoKSkKQEAgLTE2NDMsMTA3ICsxOTM0LDExMyBAQAogICBpZiAoRi5JbnB1dEZpbGVzTG9hZGVkW0lELTFdLmdldEZpbGUoKSkKICAgICByZXR1cm4gRi5JbnB1dEZpbGVzTG9hZGVkW0lELTFdOwogCisgIGlmIChGLklucHV0RmlsZXNMb2FkZWRbSUQtMV0uaXNOb3RGb3VuZCgpKQorICAgIHJldHVybiBJbnB1dEZpbGUoKTsKKwogICAvLyBHbyBmaW5kIHRoaXMgaW5wdXQgZmlsZS4KICAgQml0c3RyZWFtQ3Vyc29yICZDdXJzb3IgPSBGLklucHV0RmlsZXNDdXJzb3I7CiAgIFNhdmVkU3RyZWFtUG9zaXRpb24gU2F2ZWRQb3NpdGlvbihDdXJzb3IpOwogICBDdXJzb3IuSnVtcFRvQml0KEYuSW5wdXRGaWxlT2Zmc2V0c1tJRC0xXSk7CiAgIAotICB1bnNpZ25lZCBDb2RlID0gQ3Vyc29yLlJlYWRDb2RlKCk7Ci0gIFJlY29yZERhdGEgUmVjb3JkOwotICBTdHJpbmdSZWYgQmxvYjsKLSAgc3dpdGNoICgoSW5wdXRGaWxlUmVjb3JkVHlwZXMpQ3Vyc29yLnJlYWRSZWNvcmQoQ29kZSwgUmVjb3JkLCAmQmxvYikpIHsKLSAgY2FzZSBJTlBVVF9GSUxFOiB7Ci0gICAgdW5zaWduZWQgU3RvcmVkSUQgPSBSZWNvcmRbMF07Ci0gICAgYXNzZXJ0KElEID09IFN0b3JlZElEICYmICJCb2d1cyBzdG9yZWQgSUQgb3Igb2Zmc2V0Iik7Ci0gICAgKHZvaWQpU3RvcmVkSUQ7Ci0gICAgb2ZmX3QgU3RvcmVkU2l6ZSA9IChvZmZfdClSZWNvcmRbMV07Ci0gICAgdGltZV90IFN0b3JlZFRpbWUgPSAodGltZV90KVJlY29yZFsyXTsKLSAgICBib29sIE92ZXJyaWRkZW4gPSAoYm9vbClSZWNvcmRbM107Ci0gICAgCi0gICAgLy8gR2V0IHRoZSBmaWxlIGVudHJ5IGZvciB0aGlzIGlucHV0IGZpbGUuCi0gICAgU3RyaW5nUmVmIE9yaWdGaWxlbmFtZSA9IEJsb2I7Ci0gICAgc3RkOjpzdHJpbmcgRmlsZW5hbWUgPSBPcmlnRmlsZW5hbWU7Ci0gICAgTWF5YmVBZGRTeXN0ZW1Sb290VG9GaWxlbmFtZShGLCBGaWxlbmFtZSk7Ci0gICAgY29uc3QgRmlsZUVudHJ5ICpGaWxlIAotICAgICAgPSBPdmVycmlkZGVuPyBGaWxlTWdyLmdldFZpcnR1YWxGaWxlKEZpbGVuYW1lLCBTdG9yZWRTaXplLCBTdG9yZWRUaW1lKQotICAgICAgICAgICAgICAgICAgOiBGaWxlTWdyLmdldEZpbGUoRmlsZW5hbWUsIC8qT3BlbkZpbGU9Ki9mYWxzZSk7Ci0gICAgCi0gICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgdGhlIGZpbGUsIHJlc29sdmUgaXQgcmVsYXRpdmUgdG8gdGhlCi0gICAgLy8gb3JpZ2luYWwgZGlyZWN0b3J5IGZyb20gd2hpY2ggdGhpcyBBU1QgZmlsZSB3YXMgY3JlYXRlZC4KLSAgICBpZiAoRmlsZSA9PSAwICYmICFGLk9yaWdpbmFsRGlyLmVtcHR5KCkgJiYgIUN1cnJlbnREaXIuZW1wdHkoKSAmJgotICAgICAgICBGLk9yaWdpbmFsRGlyICE9IEN1cnJlbnREaXIpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIFJlc29sdmVkID0gcmVzb2x2ZUZpbGVSZWxhdGl2ZVRvT3JpZ2luYWxEaXIoRmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYuT3JpZ2luYWxEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnREaXIpOwotICAgICAgaWYgKCFSZXNvbHZlZC5lbXB0eSgpKQotICAgICAgICBGaWxlID0gRmlsZU1nci5nZXRGaWxlKFJlc29sdmVkKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gRm9yIGFuIG92ZXJyaWRkZW4gZmlsZSwgY3JlYXRlIGEgdmlydHVhbCBmaWxlIHdpdGggdGhlIHN0b3JlZAotICAgIC8vIHNpemUvdGltZXN0YW1wLgotICAgIGlmIChPdmVycmlkZGVuICYmIEZpbGUgPT0gMCkgewotICAgICAgRmlsZSA9IEZpbGVNZ3IuZ2V0VmlydHVhbEZpbGUoRmlsZW5hbWUsIFN0b3JlZFNpemUsIFN0b3JlZFRpbWUpOwotICAgIH0KLSAgICAKLSAgICBpZiAoRmlsZSA9PSAwKSB7Ci0gICAgICBpZiAoQ29tcGxhaW4pIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgRXJyb3JTdHIgPSAiY291bGQgbm90IGZpbmQgZmlsZSAnIjsKLSAgICAgICAgRXJyb3JTdHIgKz0gRmlsZW5hbWU7Ci0gICAgICAgIEVycm9yU3RyICs9ICInIHJlZmVyZW5jZWQgYnkgQVNUIGZpbGUiOwotICAgICAgICBFcnJvcihFcnJvclN0ci5jX3N0cigpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBJbnB1dEZpbGUoKTsKLSAgICB9CisgIElucHV0RmlsZUluZm8gRkkgPSByZWFkSW5wdXRGaWxlSW5mbyhGLCBJRCk7CisgIG9mZl90IFN0b3JlZFNpemUgPSBGSS5TdG9yZWRTaXplOworICB0aW1lX3QgU3RvcmVkVGltZSA9IEZJLlN0b3JlZFRpbWU7CisgIGJvb2wgT3ZlcnJpZGRlbiA9IEZJLk92ZXJyaWRkZW47CisgIFN0cmluZ1JlZiBGaWxlbmFtZSA9IEZJLkZpbGVuYW1lOwogCi0gICAgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGEgcmVxdWVzdCB0byBvdmVycmlkZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUKLSAgICAvLyB0aGF0IHdhcyBwYXJ0IG9mIHRoZSBwcmVjb21waWxlZCBoZWFkZXIuIE92ZXJyaWRkaW5nIHN1Y2ggYSBmaWxlCi0gICAgLy8gY2FuIGxlYWQgdG8gcHJvYmxlbXMgd2hlbiBsZXhpbmcgdXNpbmcgdGhlIHNvdXJjZSBsb2NhdGlvbnMgZnJvbSB0aGUKLSAgICAvLyBQQ0guCi0gICAgU291cmNlTWFuYWdlciAmU00gPSBnZXRTb3VyY2VNYW5hZ2VyKCk7Ci0gICAgaWYgKCFPdmVycmlkZGVuICYmIFNNLmlzRmlsZU92ZXJyaWRkZW4oRmlsZSkpIHsKLSAgICAgIGlmIChDb21wbGFpbikKLSAgICAgICAgRXJyb3IoZGlhZzo6ZXJyX2ZlX3BjaF9maWxlX292ZXJyaWRkZW4sIEZpbGVuYW1lKTsKLSAgICAgIC8vIEFmdGVyIGVtaXR0aW5nIHRoZSBkaWFnbm9zdGljLCByZWNvdmVyIGJ5IGRpc2FibGluZyB0aGUgb3ZlcnJpZGUgc28KLSAgICAgIC8vIHRoYXQgdGhlIG9yaWdpbmFsIGZpbGUgd2lsbCBiZSB1c2VkLgotICAgICAgU00uZGlzYWJsZUZpbGVDb250ZW50c092ZXJyaWRlKEZpbGUpOwotICAgICAgLy8gVGhlIEZpbGVFbnRyeSBpcyBhIHZpcnR1YWwgZmlsZSBlbnRyeSB3aXRoIHRoZSBzaXplIG9mIHRoZSBjb250ZW50cwotICAgICAgLy8gdGhhdCB3b3VsZCBvdmVycmlkZSB0aGUgb3JpZ2luYWwgY29udGVudHMuIFNldCBpdCB0byB0aGUgb3JpZ2luYWwncwotICAgICAgLy8gc2l6ZS90aW1lLgotICAgICAgRmlsZU1nci5tb2RpZnlGaWxlRW50cnkoY29uc3RfY2FzdDxGaWxlRW50cnkqPihGaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlZFNpemUsIFN0b3JlZFRpbWUpOworICBjb25zdCBGaWxlRW50cnkgKkZpbGUKKyAgICA9IE92ZXJyaWRkZW4/IEZpbGVNZ3IuZ2V0VmlydHVhbEZpbGUoRmlsZW5hbWUsIFN0b3JlZFNpemUsIFN0b3JlZFRpbWUpCisgICAgICAgICAgICAgICAgOiBGaWxlTWdyLmdldEZpbGUoRmlsZW5hbWUsIC8qT3BlbkZpbGU9Ki9mYWxzZSk7CisKKyAgLy8gSWYgd2UgZGlkbid0IGZpbmQgdGhlIGZpbGUsIHJlc29sdmUgaXQgcmVsYXRpdmUgdG8gdGhlCisgIC8vIG9yaWdpbmFsIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRoaXMgQVNUIGZpbGUgd2FzIGNyZWF0ZWQuCisgIGlmIChGaWxlID09IDAgJiYgIUYuT3JpZ2luYWxEaXIuZW1wdHkoKSAmJiAhQ3VycmVudERpci5lbXB0eSgpICYmCisgICAgICBGLk9yaWdpbmFsRGlyICE9IEN1cnJlbnREaXIpIHsKKyAgICBzdGQ6OnN0cmluZyBSZXNvbHZlZCA9IHJlc29sdmVGaWxlUmVsYXRpdmVUb09yaWdpbmFsRGlyKEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRi5PcmlnaW5hbERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnREaXIpOworICAgIGlmICghUmVzb2x2ZWQuZW1wdHkoKSkKKyAgICAgIEZpbGUgPSBGaWxlTWdyLmdldEZpbGUoUmVzb2x2ZWQpOworICB9CisKKyAgLy8gRm9yIGFuIG92ZXJyaWRkZW4gZmlsZSwgY3JlYXRlIGEgdmlydHVhbCBmaWxlIHdpdGggdGhlIHN0b3JlZAorICAvLyBzaXplL3RpbWVzdGFtcC4KKyAgaWYgKE92ZXJyaWRkZW4gJiYgRmlsZSA9PSAwKSB7CisgICAgRmlsZSA9IEZpbGVNZ3IuZ2V0VmlydHVhbEZpbGUoRmlsZW5hbWUsIFN0b3JlZFNpemUsIFN0b3JlZFRpbWUpOworICB9CisKKyAgaWYgKEZpbGUgPT0gMCkgeworICAgIGlmIChDb21wbGFpbikgeworICAgICAgc3RkOjpzdHJpbmcgRXJyb3JTdHIgPSAiY291bGQgbm90IGZpbmQgZmlsZSAnIjsKKyAgICAgIEVycm9yU3RyICs9IEZpbGVuYW1lOworICAgICAgRXJyb3JTdHIgKz0gIicgcmVmZXJlbmNlZCBieSBBU1QgZmlsZSI7CisgICAgICBFcnJvcihFcnJvclN0ci5jX3N0cigpKTsKICAgICB9CisgICAgLy8gUmVjb3JkIHRoYXQgd2UgZGlkbid0IGZpbmQgdGhlIGZpbGUuCisgICAgRi5JbnB1dEZpbGVzTG9hZGVkW0lELTFdID0gSW5wdXRGaWxlOjpnZXROb3RGb3VuZCgpOworICAgIHJldHVybiBJbnB1dEZpbGUoKTsKKyAgfQogCi0gICAgYm9vbCBJc091dE9mRGF0ZSA9IGZhbHNlOworICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYSByZXF1ZXN0IHRvIG92ZXJyaWRlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQorICAvLyB0aGF0IHdhcyBwYXJ0IG9mIHRoZSBwcmVjb21waWxlZCBoZWFkZXIuIE92ZXJyaWRkaW5nIHN1Y2ggYSBmaWxlCisgIC8vIGNhbiBsZWFkIHRvIHByb2JsZW1zIHdoZW4gbGV4aW5nIHVzaW5nIHRoZSBzb3VyY2UgbG9jYXRpb25zIGZyb20gdGhlCisgIC8vIFBDSC4KKyAgU291cmNlTWFuYWdlciAmU00gPSBnZXRTb3VyY2VNYW5hZ2VyKCk7CisgIGlmICghT3ZlcnJpZGRlbiAmJiBTTS5pc0ZpbGVPdmVycmlkZGVuKEZpbGUpKSB7CisgICAgaWYgKENvbXBsYWluKQorICAgICAgRXJyb3IoZGlhZzo6ZXJyX2ZlX3BjaF9maWxlX292ZXJyaWRkZW4sIEZpbGVuYW1lKTsKKyAgICAvLyBBZnRlciBlbWl0dGluZyB0aGUgZGlhZ25vc3RpYywgcmVjb3ZlciBieSBkaXNhYmxpbmcgdGhlIG92ZXJyaWRlIHNvCisgICAgLy8gdGhhdCB0aGUgb3JpZ2luYWwgZmlsZSB3aWxsIGJlIHVzZWQuCisgICAgU00uZGlzYWJsZUZpbGVDb250ZW50c092ZXJyaWRlKEZpbGUpOworICAgIC8vIFRoZSBGaWxlRW50cnkgaXMgYSB2aXJ0dWFsIGZpbGUgZW50cnkgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgY29udGVudHMKKyAgICAvLyB0aGF0IHdvdWxkIG92ZXJyaWRlIHRoZSBvcmlnaW5hbCBjb250ZW50cy4gU2V0IGl0IHRvIHRoZSBvcmlnaW5hbCdzCisgICAgLy8gc2l6ZS90aW1lLgorICAgIEZpbGVNZ3IubW9kaWZ5RmlsZUVudHJ5KGNvbnN0X2Nhc3Q8RmlsZUVudHJ5Kj4oRmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVkU2l6ZSwgU3RvcmVkVGltZSk7CisgIH0KIAotICAgIC8vIEZvciBhbiBvdmVycmlkZGVuIGZpbGUsIHRoZXJlIGlzIG5vdGhpbmcgdG8gdmFsaWRhdGUuCi0gICAgaWYgKCFPdmVycmlkZGVuICYmIChTdG9yZWRTaXplICE9IEZpbGUtPmdldFNpemUoKQorICBib29sIElzT3V0T2ZEYXRlID0gZmFsc2U7CisKKyAgLy8gRm9yIGFuIG92ZXJyaWRkZW4gZmlsZSwgdGhlcmUgaXMgbm90aGluZyB0byB2YWxpZGF0ZS4KKyAgaWYgKCFPdmVycmlkZGVuICYmIChTdG9yZWRTaXplICE9IEZpbGUtPmdldFNpemUoKQogI2lmICFkZWZpbmVkKExMVk1fT05fV0lOMzIpCi0gICAgICAgICAvLyBJbiBvdXIgcmVncmVzc2lvbiB0ZXN0aW5nLCB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSBzZWVtcyB0bwotICAgICAgICAgLy8gaGF2ZSBpbmNvbnNpc3RlbnQgbW9kaWZpY2F0aW9uIHRpbWVzIHRoYXQgc29tZXRpbWVzCi0gICAgICAgICAvLyBlcnJvbmVvdXNseSB0cmlnZ2VyIHRoaXMgZXJyb3ItaGFuZGxpbmcgcGF0aC4KLSAgICAgICAgIHx8IFN0b3JlZFRpbWUgIT0gRmlsZS0+Z2V0TW9kaWZpY2F0aW9uVGltZSgpCisgICAgICAgLy8gSW4gb3VyIHJlZ3Jlc3Npb24gdGVzdGluZywgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0gc2VlbXMgdG8KKyAgICAgICAvLyBoYXZlIGluY29uc2lzdGVudCBtb2RpZmljYXRpb24gdGltZXMgdGhhdCBzb21ldGltZXMKKyAgICAgICAvLyBlcnJvbmVvdXNseSB0cmlnZ2VyIHRoaXMgZXJyb3ItaGFuZGxpbmcgcGF0aC4KKyAgICAgICB8fCBTdG9yZWRUaW1lICE9IEZpbGUtPmdldE1vZGlmaWNhdGlvblRpbWUoKQogI2VuZGlmCi0gICAgICAgICApKSB7Ci0gICAgICBpZiAoQ29tcGxhaW4pIHsKLSAgICAgICAgRXJyb3IoZGlhZzo6ZXJyX2ZlX3BjaF9maWxlX21vZGlmaWVkLCBGaWxlbmFtZSwgRi5GaWxlTmFtZSk7Ci0gICAgICAgIGlmIChDb250ZXh0LmdldExhbmdPcHRzKCkuTW9kdWxlcyAmJiAhRGlhZ3MuaXNEaWFnbm9zdGljSW5GbGlnaHQoKSkgewotICAgICAgICAgIERpYWcoZGlhZzo6bm90ZV9tb2R1bGVfY2FjaGVfcGF0aCkKLSAgICAgICAgICAgIDw8IFBQLmdldEhlYWRlclNlYXJjaEluZm8oKS5nZXRNb2R1bGVDYWNoZVBhdGgoKTsKLSAgICAgICAgfQorICAgICAgICkpIHsKKyAgICBpZiAoQ29tcGxhaW4pIHsKKyAgICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB0aGUgUENIIGltcG9ydHMgdGhhdCBnb3QgdXMgaGVyZSAoaW4gcmV2ZXJzZSkuCisgICAgICBTbWFsbFZlY3RvcjxNb2R1bGVGaWxlICosIDQ+IEltcG9ydFN0YWNrKDEsICZGKTsKKyAgICAgIHdoaWxlIChJbXBvcnRTdGFjay5iYWNrKCktPkltcG9ydGVkQnkuc2l6ZSgpID4gMCkKKyAgICAgICAgSW1wb3J0U3RhY2sucHVzaF9iYWNrKEltcG9ydFN0YWNrLmJhY2soKS0+SW1wb3J0ZWRCeVswXSk7CisKKyAgICAgIC8vIFRoZSB0b3AtbGV2ZWwgUENIIGlzIHN0YWxlLgorICAgICAgU3RyaW5nUmVmIFRvcExldmVsUENITmFtZShJbXBvcnRTdGFjay5iYWNrKCktPkZpbGVOYW1lKTsKKyAgICAgIEVycm9yKGRpYWc6OmVycl9mZV9wY2hfZmlsZV9tb2RpZmllZCwgRmlsZW5hbWUsIFRvcExldmVsUENITmFtZSk7CisKKyAgICAgIC8vIFByaW50IHRoZSBpbXBvcnQgc3RhY2suCisgICAgICBpZiAoSW1wb3J0U3RhY2suc2l6ZSgpID4gMSAmJiAhRGlhZ3MuaXNEaWFnbm9zdGljSW5GbGlnaHQoKSkgeworICAgICAgICBEaWFnKGRpYWc6Om5vdGVfcGNoX3JlcXVpcmVkX2J5KQorICAgICAgICAgIDw8IEZpbGVuYW1lIDw8IEltcG9ydFN0YWNrWzBdLT5GaWxlTmFtZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBJID0gMTsgSSA8IEltcG9ydFN0YWNrLnNpemUoKTsgKytJKQorICAgICAgICAgIERpYWcoZGlhZzo6bm90ZV9wY2hfcmVxdWlyZWRfYnkpCisgICAgICAgICAgICA8PCBJbXBvcnRTdGFja1tJLTFdLT5GaWxlTmFtZSA8PCBJbXBvcnRTdGFja1tJXS0+RmlsZU5hbWU7CiAgICAgICB9CiAKLSAgICAgIElzT3V0T2ZEYXRlID0gdHJ1ZTsKKyAgICAgIGlmICghRGlhZ3MuaXNEaWFnbm9zdGljSW5GbGlnaHQoKSkKKyAgICAgICAgRGlhZyhkaWFnOjpub3RlX3BjaF9yZWJ1aWxkX3JlcXVpcmVkKSA8PCBUb3BMZXZlbFBDSE5hbWU7CiAgICAgfQogCi0gICAgSW5wdXRGaWxlIElGID0gSW5wdXRGaWxlKEZpbGUsIE92ZXJyaWRkZW4sIElzT3V0T2ZEYXRlKTsKLQotICAgIC8vIE5vdGUgdGhhdCB3ZSd2ZSBsb2FkZWQgdGhpcyBpbnB1dCBmaWxlLgotICAgIEYuSW5wdXRGaWxlc0xvYWRlZFtJRC0xXSA9IElGOwotICAgIHJldHVybiBJRjsKLSAgfQorICAgIElzT3V0T2ZEYXRlID0gdHJ1ZTsKICAgfQogCi0gIHJldHVybiBJbnB1dEZpbGUoKTsKKyAgSW5wdXRGaWxlIElGID0gSW5wdXRGaWxlKEZpbGUsIE92ZXJyaWRkZW4sIElzT3V0T2ZEYXRlKTsKKworICAvLyBOb3RlIHRoYXQgd2UndmUgbG9hZGVkIHRoaXMgaW5wdXQgZmlsZS4KKyAgRi5JbnB1dEZpbGVzTG9hZGVkW0lELTFdID0gSUY7CisgIHJldHVybiBJRjsKIH0KIAogY29uc3QgRmlsZUVudHJ5ICpBU1RSZWFkZXI6OmdldEZpbGVFbnRyeShTdHJpbmdSZWYgZmlsZW5hbWVTdHJSZWYpIHsKQEAgLTE4MDgsMjAgKzIxMDUsNTQgQEAKICAgICBjYXNlIGxsdm06OkJpdHN0cmVhbUVudHJ5OjpFcnJvcjoKICAgICAgIEVycm9yKCJtYWxmb3JtZWQgYmxvY2sgcmVjb3JkIGluIEFTVCBmaWxlIik7CiAgICAgICByZXR1cm4gRmFpbHVyZTsKLSAgICBjYXNlIGxsdm06OkJpdHN0cmVhbUVudHJ5OjpFbmRCbG9jazoKLSAgICAgIC8vIFZhbGlkYXRlIGFsbCBvZiB0aGUgbm9uLXN5c3RlbSBpbnB1dCBmaWxlcy4KLSAgICAgIGlmICghRGlzYWJsZVZhbGlkYXRpb24pIHsKKyAgICBjYXNlIGxsdm06OkJpdHN0cmVhbUVudHJ5OjpFbmRCbG9jazogeworICAgICAgLy8gVmFsaWRhdGUgaW5wdXQgZmlsZXMuCisgICAgICBjb25zdCBIZWFkZXJTZWFyY2hPcHRpb25zICZIU09wdHMgPQorICAgICAgICAgIFBQLmdldEhlYWRlclNlYXJjaEluZm8oKS5nZXRIZWFkZXJTZWFyY2hPcHRzKCk7CisKKyAgICAgIC8vIEFsbCB1c2VyIGlucHV0IGZpbGVzIHJlc2lkZSBhdCB0aGUgaW5kZXggcmFuZ2UgWzAsIFJlY29yZFsxXSksIGFuZAorICAgICAgLy8gc3lzdGVtIGlucHV0IGZpbGVzIHJlc2lkZSBhdCBbUmVjb3JkWzFdLCBSZWNvcmRbMF0pLgorICAgICAgLy8gUmVjb3JkIGlzIHRoZSBvbmUgZnJvbSBJTlBVVF9GSUxFX09GRlNFVFMuCisgICAgICB1bnNpZ25lZCBOdW1JbnB1dHMgPSBSZWNvcmRbMF07CisgICAgICB1bnNpZ25lZCBOdW1Vc2VySW5wdXRzID0gUmVjb3JkWzFdOworCisgICAgICBpZiAoIURpc2FibGVWYWxpZGF0aW9uICYmCisgICAgICAgICAgKCFIU09wdHMuTW9kdWxlc1ZhbGlkYXRlT25jZVBlckJ1aWxkU2Vzc2lvbiB8fAorICAgICAgICAgICBGLklucHV0RmlsZXNWYWxpZGF0aW9uVGltZXN0YW1wIDw9IEhTT3B0cy5CdWlsZFNlc3Npb25UaW1lc3RhbXApKSB7CiAgICAgICAgIGJvb2wgQ29tcGxhaW4gPSAoQ2xpZW50TG9hZENhcGFiaWxpdGllcyAmIEFSUl9PdXRPZkRhdGUpID09IDA7Ci0gICAgICAgIC8vIEFsbCB1c2VyIGlucHV0IGZpbGVzIHJlc2lkZSBhdCB0aGUgaW5kZXggcmFuZ2UgWzAsIFJlY29yZFsxXSkuCi0gICAgICAgIC8vIFJlY29yZCBpcyB0aGUgb25lIGZyb20gSU5QVVRfRklMRV9PRkZTRVRTLgotICAgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gUmVjb3JkWzFdOyBJIDwgTjsgKytJKSB7CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIHJlYWRpbmcgYSBtb2R1bGUsIHdlIHdpbGwgY3JlYXRlIGEgdmVyaWZpY2F0aW9uIHRpbWVzdGFtcCwKKyAgICAgICAgLy8gc28gd2UgdmVyaWZ5IGFsbCBpbnB1dCBmaWxlcy4gIE90aGVyd2lzZSwgdmVyaWZ5IG9ubHkgdXNlciBpbnB1dAorICAgICAgICAvLyBmaWxlcy4KKworICAgICAgICB1bnNpZ25lZCBOID0gTnVtVXNlcklucHV0czsKKyAgICAgICAgaWYgKFZhbGlkYXRlU3lzdGVtSW5wdXRzIHx8CisgICAgICAgICAgICAoSFNPcHRzLk1vZHVsZXNWYWxpZGF0ZU9uY2VQZXJCdWlsZFNlc3Npb24gJiYgRi5LaW5kID09IE1LX01vZHVsZSkpCisgICAgICAgICAgTiA9IE51bUlucHV0czsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgTjsgKytJKSB7CiAgICAgICAgICAgSW5wdXRGaWxlIElGID0gZ2V0SW5wdXRGaWxlKEYsIEkrMSwgQ29tcGxhaW4pOwogICAgICAgICAgIGlmICghSUYuZ2V0RmlsZSgpIHx8IElGLmlzT3V0T2ZEYXRlKCkpCiAgICAgICAgICAgICByZXR1cm4gT3V0T2ZEYXRlOwogICAgICAgICB9CiAgICAgICB9CisKKyAgICAgIGlmIChMaXN0ZW5lcikKKyAgICAgICAgTGlzdGVuZXItPnZpc2l0TW9kdWxlRmlsZShGLkZpbGVOYW1lKTsKKworICAgICAgaWYgKExpc3RlbmVyICYmIExpc3RlbmVyLT5uZWVkc0lucHV0RmlsZVZpc2l0YXRpb24oKSkgeworICAgICAgICB1bnNpZ25lZCBOID0gTGlzdGVuZXItPm5lZWRzU3lzdGVtSW5wdXRGaWxlVmlzaXRhdGlvbigpID8gTnVtSW5wdXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOdW1Vc2VySW5wdXRzOworICAgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgTjsgKytJKSB7CisgICAgICAgICAgYm9vbCBJc1N5c3RlbSA9IEkgPj0gTnVtVXNlcklucHV0czsKKyAgICAgICAgICBJbnB1dEZpbGVJbmZvIEZJID0gcmVhZElucHV0RmlsZUluZm8oRiwgSSsxKTsKKyAgICAgICAgICBMaXN0ZW5lci0+dmlzaXRJbnB1dEZpbGUoRkkuRmlsZW5hbWUsIElzU3lzdGVtLCBGSS5PdmVycmlkZGVuKTsKKyAgICAgICAgfQorICAgICAgfQorCiAgICAgICByZXR1cm4gU3VjY2VzczsKLSAgICAgIAorICAgIH0KKwogICAgIGNhc2UgbGx2bTo6Qml0c3RyZWFtRW50cnk6OlN1YkJsb2NrOgogICAgICAgc3dpdGNoIChFbnRyeS5JRCkgewogICAgICAgY2FzZSBJTlBVVF9GSUxFU19CTE9DS19JRDoKQEAgLTE4NTQsOCArMjE4NSw4IEBACiAgICAgY2FzZSBNRVRBREFUQTogewogICAgICAgaWYgKFJlY29yZFswXSAhPSBWRVJTSU9OX01BSk9SICYmICFEaXNhYmxlVmFsaWRhdGlvbikgewogICAgICAgICBpZiAoKENsaWVudExvYWRDYXBhYmlsaXRpZXMgJiBBUlJfVmVyc2lvbk1pc21hdGNoKSA9PSAwKQotICAgICAgICAgIERpYWcoUmVjb3JkWzBdIDwgVkVSU0lPTl9NQUpPUj8gZGlhZzo6d2Fybl9wY2hfdmVyc2lvbl90b29fb2xkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkaWFnOjp3YXJuX3BjaF92ZXJzaW9uX3Rvb19uZXcpOworICAgICAgICAgIERpYWcoUmVjb3JkWzBdIDwgVkVSU0lPTl9NQUpPUj8gZGlhZzo6ZXJyX3BjaF92ZXJzaW9uX3Rvb19vbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRpYWc6OmVycl9wY2hfdmVyc2lvbl90b29fbmV3KTsKICAgICAgICAgcmV0dXJuIFZlcnNpb25NaXNtYXRjaDsKICAgICAgIH0KIApAQCAtMTg3MSw3ICsyMjAyLDcgQEAKICAgICAgIFN0cmluZ1JlZiBBU1RCcmFuY2ggPSBCbG9iOwogICAgICAgaWYgKFN0cmluZ1JlZihDdXJCcmFuY2gpICE9IEFTVEJyYW5jaCAmJiAhRGlzYWJsZVZhbGlkYXRpb24pIHsKICAgICAgICAgaWYgKChDbGllbnRMb2FkQ2FwYWJpbGl0aWVzICYgQVJSX1ZlcnNpb25NaXNtYXRjaCkgPT0gMCkKLSAgICAgICAgICBEaWFnKGRpYWc6Ondhcm5fcGNoX2RpZmZlcmVudF9icmFuY2gpIDw8IEFTVEJyYW5jaCA8PCBDdXJCcmFuY2g7CisgICAgICAgICAgRGlhZyhkaWFnOjplcnJfcGNoX2RpZmZlcmVudF9icmFuY2gpIDw8IEFTVEJyYW5jaCA8PCBDdXJCcmFuY2g7CiAgICAgICAgIHJldHVybiBWZXJzaW9uTWlzbWF0Y2g7CiAgICAgICB9CiAgICAgICBicmVhazsKQEAgLTE5MTYsNyArMjI0Nyw3IEBACiAgICAgICBib29sIENvbXBsYWluID0gKENsaWVudExvYWRDYXBhYmlsaXRpZXMgJiBBUlJfQ29uZmlndXJhdGlvbk1pc21hdGNoKSA9PSAwOwogICAgICAgaWYgKExpc3RlbmVyICYmICZGID09ICpNb2R1bGVNZ3IuYmVnaW4oKSAmJgogICAgICAgICAgIFBhcnNlTGFuZ3VhZ2VPcHRpb25zKFJlY29yZCwgQ29tcGxhaW4sICpMaXN0ZW5lcikgJiYKLSAgICAgICAgICAhRGlzYWJsZVZhbGlkYXRpb24pCisgICAgICAgICAgIURpc2FibGVWYWxpZGF0aW9uICYmICFBbGxvd0NvbmZpZ3VyYXRpb25NaXNtYXRjaCkKICAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb25NaXNtYXRjaDsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTE5MjUsNyArMjI1Niw3IEBACiAgICAgICBib29sIENvbXBsYWluID0gKENsaWVudExvYWRDYXBhYmlsaXRpZXMgJiBBUlJfQ29uZmlndXJhdGlvbk1pc21hdGNoKT09MDsKICAgICAgIGlmIChMaXN0ZW5lciAmJiAmRiA9PSAqTW9kdWxlTWdyLmJlZ2luKCkgJiYKICAgICAgICAgICBQYXJzZVRhcmdldE9wdGlvbnMoUmVjb3JkLCBDb21wbGFpbiwgKkxpc3RlbmVyKSAmJgotICAgICAgICAgICFEaXNhYmxlVmFsaWRhdGlvbikKKyAgICAgICAgICAhRGlzYWJsZVZhbGlkYXRpb24gJiYgIUFsbG93Q29uZmlndXJhdGlvbk1pc21hdGNoKQogICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbk1pc21hdGNoOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMTkzNCw3ICsyMjY1LDcgQEAKICAgICAgIGJvb2wgQ29tcGxhaW4gPSAoQ2xpZW50TG9hZENhcGFiaWxpdGllcyAmIEFSUl9Db25maWd1cmF0aW9uTWlzbWF0Y2gpPT0wOwogICAgICAgaWYgKExpc3RlbmVyICYmICZGID09ICpNb2R1bGVNZ3IuYmVnaW4oKSAmJgogICAgICAgICAgIFBhcnNlRGlhZ25vc3RpY09wdGlvbnMoUmVjb3JkLCBDb21wbGFpbiwgKkxpc3RlbmVyKSAmJgotICAgICAgICAgICFEaXNhYmxlVmFsaWRhdGlvbikKKyAgICAgICAgICAhRGlzYWJsZVZhbGlkYXRpb24gJiYgIUFsbG93Q29uZmlndXJhdGlvbk1pc21hdGNoKQogICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbk1pc21hdGNoOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMTk0Myw3ICsyMjc0LDcgQEAKICAgICAgIGJvb2wgQ29tcGxhaW4gPSAoQ2xpZW50TG9hZENhcGFiaWxpdGllcyAmIEFSUl9Db25maWd1cmF0aW9uTWlzbWF0Y2gpPT0wOwogICAgICAgaWYgKExpc3RlbmVyICYmICZGID09ICpNb2R1bGVNZ3IuYmVnaW4oKSAmJgogICAgICAgICAgIFBhcnNlRmlsZVN5c3RlbU9wdGlvbnMoUmVjb3JkLCBDb21wbGFpbiwgKkxpc3RlbmVyKSAmJgotICAgICAgICAgICFEaXNhYmxlVmFsaWRhdGlvbikKKyAgICAgICAgICAhRGlzYWJsZVZhbGlkYXRpb24gJiYgIUFsbG93Q29uZmlndXJhdGlvbk1pc21hdGNoKQogICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbk1pc21hdGNoOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMTk1Miw3ICsyMjgzLDcgQEAKICAgICAgIGJvb2wgQ29tcGxhaW4gPSAoQ2xpZW50TG9hZENhcGFiaWxpdGllcyAmIEFSUl9Db25maWd1cmF0aW9uTWlzbWF0Y2gpPT0wOwogICAgICAgaWYgKExpc3RlbmVyICYmICZGID09ICpNb2R1bGVNZ3IuYmVnaW4oKSAmJgogICAgICAgICAgIFBhcnNlSGVhZGVyU2VhcmNoT3B0aW9ucyhSZWNvcmQsIENvbXBsYWluLCAqTGlzdGVuZXIpICYmCi0gICAgICAgICAgIURpc2FibGVWYWxpZGF0aW9uKQorICAgICAgICAgICFEaXNhYmxlVmFsaWRhdGlvbiAmJiAhQWxsb3dDb25maWd1cmF0aW9uTWlzbWF0Y2gpCiAgICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uTWlzbWF0Y2g7CiAgICAgICBicmVhazsKICAgICB9CkBAIC0xOTYyLDcgKzIyOTMsNyBAQAogICAgICAgaWYgKExpc3RlbmVyICYmICZGID09ICpNb2R1bGVNZ3IuYmVnaW4oKSAmJgogICAgICAgICAgIFBhcnNlUHJlcHJvY2Vzc29yT3B0aW9ucyhSZWNvcmQsIENvbXBsYWluLCAqTGlzdGVuZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Z2dlc3RlZFByZWRlZmluZXMpICYmCi0gICAgICAgICAgIURpc2FibGVWYWxpZGF0aW9uKQorICAgICAgICAgICFEaXNhYmxlVmFsaWRhdGlvbiAmJiAhQWxsb3dDb25maWd1cmF0aW9uTWlzbWF0Y2gpCiAgICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uTWlzbWF0Y2g7CiAgICAgICBicmVhazsKICAgICB9CkBAIC0yMDM1LDE0ICsyMzY2LDcgQEAKICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgICBjYXNlIERFQ0xfVVBEQVRFU19CTE9DS19JRDoKLSAgICAgICAgaWYgKFN0cmVhbS5Ta2lwQmxvY2soKSkgewotICAgICAgICAgIEVycm9yKCJtYWxmb3JtZWQgYmxvY2sgcmVjb3JkIGluIEFTVCBmaWxlIik7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAorCiAgICAgICBjYXNlIFBSRVBST0NFU1NPUl9CTE9DS19JRDoKICAgICAgICAgRi5NYWNyb0N1cnNvciA9IFN0cmVhbTsKICAgICAgICAgaWYgKCFQUC5nZXRFeHRlcm5hbFNvdXJjZSgpKQpAQCAtMjE5MSw2ICsyNTE1LDEyIEBACiAgICAgICAgIERlY2xDb250ZXh0ICpUVSA9IENvbnRleHQuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpOwogICAgICAgICBGLkRlY2xDb250ZXh0SW5mb3NbVFVdLk5hbWVMb29rdXBUYWJsZURhdGEgPSBUYWJsZTsKICAgICAgICAgVFUtPnNldEhhc0V4dGVybmFsVmlzaWJsZVN0b3JhZ2UodHJ1ZSk7CisgICAgICB9IGVsc2UgaWYgKERlY2wgKkQgPSBEZWNsc0xvYWRlZFtJRCAtIE5VTV9QUkVERUZfREVDTF9JRFNdKSB7CisgICAgICAgIGF1dG8gKkRDID0gY2FzdDxEZWNsQ29udGV4dD4oRCk7CisgICAgICAgIERDLT5nZXRQcmltYXJ5Q29udGV4dCgpLT5zZXRIYXNFeHRlcm5hbFZpc2libGVTdG9yYWdlKHRydWUpOworICAgICAgICBhdXRvIComTG9va3VwVGFibGUgPSBGLkRlY2xDb250ZXh0SW5mb3NbRENdLk5hbWVMb29rdXBUYWJsZURhdGE7CisgICAgICAgIGRlbGV0ZSBMb29rdXBUYWJsZTsKKyAgICAgICAgTG9va3VwVGFibGUgPSBUYWJsZTsKICAgICAgIH0gZWxzZQogICAgICAgICBQZW5kaW5nVmlzaWJsZVVwZGF0ZXNbSURdLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihUYWJsZSwgJkYpKTsKICAgICAgIGJyZWFrOwpAQCAtMjIzNyw5ICsyNTY3LDkgQEAKICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGNhc2UgRVhURVJOQUxfREVGSU5JVElPTlM6CisgICAgY2FzZSBFQUdFUkxZX0RFU0VSSUFMSVpFRF9ERUNMUzoKICAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBSZWNvcmQuc2l6ZSgpOyBJICE9IE47ICsrSSkKLSAgICAgICAgRXh0ZXJuYWxEZWZpbml0aW9ucy5wdXNoX2JhY2soZ2V0R2xvYmFsRGVjbElEKEYsIFJlY29yZFtJXSkpOworICAgICAgICBFYWdlcmx5RGVzZXJpYWxpemVkRGVjbHMucHVzaF9iYWNrKGdldEdsb2JhbERlY2xJRChGLCBSZWNvcmRbSV0pKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBTUEVDSUFMX1RZUEVTOgpAQCAtMjM2NSw3ICsyNjk1LDcgQEAKICAgICAgIEYuU0xvY0VudHJ5T2Zmc2V0cyA9IChjb25zdCB1aW50MzJfdCAqKUJsb2IuZGF0YSgpOwogICAgICAgRi5Mb2NhbE51bVNMb2NFbnRyaWVzID0gUmVjb3JkWzBdOwogICAgICAgdW5zaWduZWQgU0xvY1NwYWNlU2l6ZSA9IFJlY29yZFsxXTsKLSAgICAgIGxsdm06OnRpZShGLlNMb2NFbnRyeUJhc2VJRCwgRi5TTG9jRW50cnlCYXNlT2Zmc2V0KSA9CisgICAgICBzdGQ6OnRpZShGLlNMb2NFbnRyeUJhc2VJRCwgRi5TTG9jRW50cnlCYXNlT2Zmc2V0KSA9CiAgICAgICAgICAgU291cmNlTWdyLkFsbG9jYXRlTG9hZGVkU0xvY0VudHJpZXMoRi5Mb2NhbE51bVNMb2NFbnRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMb2NTcGFjZVNpemUpOwogICAgICAgLy8gTWFrZSBvdXIgZW50cnkgaW4gdGhlIHJhbmdlIG1hcC4gQmFzZUlEIGlzIG5lZ2F0aXZlIGFuZCBncm93aW5nLCBzbwpAQCAtMjM4NCw5ICsyNzE0LDkgQEAKIAogICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVtYXBwaW5nIHRhYmxlLgogICAgICAgLy8gSW52YWxpZCBzdGF5cyBpbnZhbGlkLgotICAgICAgRi5TTG9jUmVtYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKDBVLCAwKSk7CisgICAgICBGLlNMb2NSZW1hcC5pbnNlcnRPclJlcGxhY2Uoc3RkOjptYWtlX3BhaXIoMFUsIDApKTsKICAgICAgIC8vIFRoaXMgbW9kdWxlLiBCYXNlIHdhcyAyIHdoZW4gYmVpbmcgY29tcGlsZWQuCi0gICAgICBGLlNMb2NSZW1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoMlUsCisgICAgICBGLlNMb2NSZW1hcC5pbnNlcnRPclJlcGxhY2Uoc3RkOjptYWtlX3BhaXIoMlUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihGLlNMb2NFbnRyeUJhc2VPZmZzZXQgLSAyKSkpOwogICAgICAgCiAgICAgICBUb3RhbE51bVNMb2NFbnRyaWVzICs9IEYuTG9jYWxOdW1TTG9jRW50cmllczsKQEAgLTIzOTcsNyArMjcyNywxMyBAQAogICAgICAgLy8gQWRkaXRpb25hbCByZW1hcHBpbmcgaW5mb3JtYXRpb24uCiAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpEYXRhID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKUJsb2IuZGF0YSgpOwogICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqRGF0YUVuZCA9IERhdGEgKyBCbG9iLnNpemUoKTsKLSAgICAgIAorCisgICAgICAvLyBJZiB3ZSBzZWUgdGhpcyBlbnRyeSBiZWZvcmUgU09VUkNFX0xPQ0FUSU9OX09GRlNFVFMsIGFkZCBwbGFjZWhvbGRlcnMuCisgICAgICBpZiAoRi5TTG9jUmVtYXAuZmluZCgwKSA9PSBGLlNMb2NSZW1hcC5lbmQoKSkgeworICAgICAgICBGLlNMb2NSZW1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoMFUsIDApKTsKKyAgICAgICAgRi5TTG9jUmVtYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKDJVLCAxKSk7CisgICAgICB9CisKICAgICAgIC8vIENvbnRpbnVvdXMgcmFuZ2UgbWFwcyB3ZSBtYXkgYmUgdXBkYXRpbmcgaW4gb3VyIG1vZHVsZS4KICAgICAgIENvbnRpbnVvdXNSYW5nZU1hcDx1aW50MzJfdCwgaW50LCAyPjo6QnVpbGRlciBTTG9jUmVtYXAoRi5TTG9jUmVtYXApOwogICAgICAgQ29udGludW91c1JhbmdlTWFwPHVpbnQzMl90LCBpbnQsIDI+OjpCdWlsZGVyIApAQCAtMjQxNCw3ICsyNzUwLDggQEAKICAgICAgIENvbnRpbnVvdXNSYW5nZU1hcDx1aW50MzJfdCwgaW50LCAyPjo6QnVpbGRlciBUeXBlUmVtYXAoRi5UeXBlUmVtYXApOwogCiAgICAgICB3aGlsZShEYXRhIDwgRGF0YUVuZCkgewotICAgICAgICB1aW50MTZfdCBMZW4gPSBpbzo6UmVhZFVuYWxpZ25lZExFMTYoRGF0YSk7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgICAgICB1aW50MTZfdCBMZW4gPSBlbmRpYW46OnJlYWROZXh0PHVpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oRGF0YSk7CiAgICAgICAgIFN0cmluZ1JlZiBOYW1lID0gU3RyaW5nUmVmKChjb25zdCBjaGFyKilEYXRhLCBMZW4pOwogICAgICAgICBEYXRhICs9IExlbjsKICAgICAgICAgTW9kdWxlRmlsZSAqT00gPSBNb2R1bGVNZ3IubG9va3VwKE5hbWUpOwpAQCAtMjQyMywxNSArMjc2MCwyMyBAQAogICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgdWludDMyX3QgU0xvY09mZnNldCA9IGlvOjpSZWFkVW5hbGlnbmVkTEUzMihEYXRhKTsKLSAgICAgICAgdWludDMyX3QgSWRlbnRpZmllcklET2Zmc2V0ID0gaW86OlJlYWRVbmFsaWduZWRMRTMyKERhdGEpOwotICAgICAgICB1aW50MzJfdCBNYWNyb0lET2Zmc2V0ID0gaW86OlJlYWRVbmFsaWduZWRMRTMyKERhdGEpOwotICAgICAgICB1aW50MzJfdCBQcmVwcm9jZXNzZWRFbnRpdHlJRE9mZnNldCA9IGlvOjpSZWFkVW5hbGlnbmVkTEUzMihEYXRhKTsKLSAgICAgICAgdWludDMyX3QgU3VibW9kdWxlSURPZmZzZXQgPSBpbzo6UmVhZFVuYWxpZ25lZExFMzIoRGF0YSk7Ci0gICAgICAgIHVpbnQzMl90IFNlbGVjdG9ySURPZmZzZXQgPSBpbzo6UmVhZFVuYWxpZ25lZExFMzIoRGF0YSk7Ci0gICAgICAgIHVpbnQzMl90IERlY2xJRE9mZnNldCA9IGlvOjpSZWFkVW5hbGlnbmVkTEUzMihEYXRhKTsKLSAgICAgICAgdWludDMyX3QgVHlwZUluZGV4T2Zmc2V0ID0gaW86OlJlYWRVbmFsaWduZWRMRTMyKERhdGEpOwotICAgICAgICAKKyAgICAgICAgdWludDMyX3QgU0xvY09mZnNldCA9CisgICAgICAgICAgICBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oRGF0YSk7CisgICAgICAgIHVpbnQzMl90IElkZW50aWZpZXJJRE9mZnNldCA9CisgICAgICAgICAgICBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oRGF0YSk7CisgICAgICAgIHVpbnQzMl90IE1hY3JvSURPZmZzZXQgPQorICAgICAgICAgICAgZW5kaWFuOjpyZWFkTmV4dDx1aW50MzJfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KERhdGEpOworICAgICAgICB1aW50MzJfdCBQcmVwcm9jZXNzZWRFbnRpdHlJRE9mZnNldCA9CisgICAgICAgICAgICBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oRGF0YSk7CisgICAgICAgIHVpbnQzMl90IFN1Ym1vZHVsZUlET2Zmc2V0ID0KKyAgICAgICAgICAgIGVuZGlhbjo6cmVhZE5leHQ8dWludDMyX3QsIGxpdHRsZSwgdW5hbGlnbmVkPihEYXRhKTsKKyAgICAgICAgdWludDMyX3QgU2VsZWN0b3JJRE9mZnNldCA9CisgICAgICAgICAgICBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oRGF0YSk7CisgICAgICAgIHVpbnQzMl90IERlY2xJRE9mZnNldCA9CisgICAgICAgICAgICBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oRGF0YSk7CisgICAgICAgIHVpbnQzMl90IFR5cGVJbmRleE9mZnNldCA9CisgICAgICAgICAgICBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oRGF0YSk7CisKICAgICAgICAgLy8gU291cmNlIGxvY2F0aW9uIG9mZnNldCBpcyBtYXBwZWQgdG8gT00tPlNMb2NFbnRyeUJhc2VPZmZzZXQuCiAgICAgICAgIFNMb2NSZW1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoU0xvY09mZnNldCwKICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KE9NLT5TTG9jRW50cnlCYXNlT2Zmc2V0IC0gU0xvY09mZnNldCkpKTsKQEAgLTI1NjksNiArMjkxNCw3IEBACiAgICAgICAgIEVycm9yKCJpbnZhbGlkIERFQ0xfVVBEQVRFX09GRlNFVFMgYmxvY2sgaW4gQVNUIGZpbGUiKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CisgICAgICAvLyBGSVhNRTogSWYgd2UndmUgYWxyZWFkeSBsb2FkZWQgdGhlIGRlY2wsIHBlcmZvcm0gdGhlIHVwZGF0ZXMgbm93LgogICAgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IFJlY29yZC5zaXplKCk7IEkgIT0gTjsgSSArPSAyKQogICAgICAgICBEZWNsVXBkYXRlT2Zmc2V0c1tnZXRHbG9iYWxEZWNsSUQoRiwgUmVjb3JkW0ldKV0KICAgICAgICAgICAucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCZGLCBSZWNvcmRbSSsxXSkpOwpAQCAtMjY5MCw5ICszMDM2LDExIEBACiAgICAgICAgIC8vIElmIHdlIGFyZW4ndCBsb2FkaW5nIGEgbW9kdWxlICh3aGljaCBoYXMgaXRzIG93biBleHBvcnRzKSwgbWFrZQogICAgICAgICAvLyBhbGwgb2YgdGhlIGltcG9ydGVkIG1vZHVsZXMgdmlzaWJsZS4KICAgICAgICAgLy8gRklYTUU6IERlYWwgd2l0aCBtYWNyb3Mtb25seSBpbXBvcnRzLgotICAgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gUmVjb3JkLnNpemUoKTsgSSAhPSBOOyArK0kpIHsKLSAgICAgICAgICBpZiAodW5zaWduZWQgR2xvYmFsSUQgPSBnZXRHbG9iYWxTdWJtb2R1bGVJRChGLCBSZWNvcmRbSV0pKQotICAgICAgICAgICAgSW1wb3J0ZWRNb2R1bGVzLnB1c2hfYmFjayhHbG9iYWxJRCk7CisgICAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBSZWNvcmQuc2l6ZSgpOyBJICE9IE47IC8qKi8pIHsKKyAgICAgICAgICB1bnNpZ25lZCBHbG9iYWxJRCA9IGdldEdsb2JhbFN1Ym1vZHVsZUlEKEYsIFJlY29yZFtJKytdKTsKKyAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBMb2MgPSBSZWFkU291cmNlTG9jYXRpb24oRiwgUmVjb3JkLCBJKTsKKyAgICAgICAgICBpZiAoR2xvYmFsSUQpCisgICAgICAgICAgICBJbXBvcnRlZE1vZHVsZXMucHVzaF9iYWNrKEltcG9ydGVkU3VibW9kdWxlKEdsb2JhbElELCBMb2MpKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgYnJlYWs7CkBAIC0yNzkxLDMwICszMTM5LDI1IEBACiB9CiAKIHZvaWQgQVNUUmVhZGVyOjptYWtlTmFtZXNWaXNpYmxlKGNvbnN0IEhpZGRlbk5hbWVzICZOYW1lcywgTW9kdWxlICpPd25lcikgewotICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gTmFtZXMuc2l6ZSgpOyBJICE9IE47ICsrSSkgewotICAgIHN3aXRjaCAoTmFtZXNbSV0uZ2V0S2luZCgpKSB7Ci0gICAgY2FzZSBIaWRkZW5OYW1lOjpEZWNsYXJhdGlvbjogewotICAgICAgRGVjbCAqRCA9IE5hbWVzW0ldLmdldERlY2woKTsKLSAgICAgIGJvb2wgd2FzSGlkZGVuID0gRC0+SGlkZGVuOwotICAgICAgRC0+SGlkZGVuID0gZmFsc2U7CisgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBOYW1lcy5IaWRkZW5EZWNscy5zaXplKCk7IEkgIT0gTjsgKytJKSB7CisgICAgRGVjbCAqRCA9IE5hbWVzLkhpZGRlbkRlY2xzW0ldOworICAgIGJvb2wgd2FzSGlkZGVuID0gRC0+SGlkZGVuOworICAgIEQtPkhpZGRlbiA9IGZhbHNlOwogCi0gICAgICBpZiAod2FzSGlkZGVuICYmIFNlbWFPYmopIHsKLSAgICAgICAgaWYgKE9iakNNZXRob2REZWNsICpNZXRob2QgPSBkeW5fY2FzdDxPYmpDTWV0aG9kRGVjbD4oRCkpIHsKLSAgICAgICAgICBtb3ZlTWV0aG9kVG9CYWNrT2ZHbG9iYWxMaXN0KCpTZW1hT2JqLCBNZXRob2QpOwotICAgICAgICB9CisgICAgaWYgKHdhc0hpZGRlbiAmJiBTZW1hT2JqKSB7CisgICAgICBpZiAoT2JqQ01ldGhvZERlY2wgKk1ldGhvZCA9IGR5bl9jYXN0PE9iakNNZXRob2REZWNsPihEKSkgeworICAgICAgICBtb3ZlTWV0aG9kVG9CYWNrT2ZHbG9iYWxMaXN0KCpTZW1hT2JqLCBNZXRob2QpOwogICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgSGlkZGVuTmFtZTo6TWFjcm9WaXNpYmlsaXR5OiB7Ci0gICAgICBzdGQ6OnBhaXI8SWRlbnRpZmllckluZm8gKiwgTWFjcm9EaXJlY3RpdmUgKj4gTWFjcm8gPSBOYW1lc1tJXS5nZXRNYWNybygpOwotICAgICAgaW5zdGFsbEltcG9ydGVkTWFjcm8oTWFjcm8uZmlyc3QsIE1hY3JvLnNlY29uZCwgT3duZXIpOwotICAgICAgYnJlYWs7Ci0gICAgfQogICAgIH0KICAgfQorCisgIGZvciAoSGlkZGVuTWFjcm9zTWFwOjpjb25zdF9pdGVyYXRvciBJID0gTmFtZXMuSGlkZGVuTWFjcm9zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gTmFtZXMuSGlkZGVuTWFjcm9zLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIGluc3RhbGxJbXBvcnRlZE1hY3JvKEktPmZpcnN0LCBJLT5zZWNvbmQsIE93bmVyKTsKIH0KIAotdm9pZCBBU1RSZWFkZXI6Om1ha2VNb2R1bGVWaXNpYmxlKE1vZHVsZSAqTW9kLCAKK3ZvaWQgQVNUUmVhZGVyOjptYWtlTW9kdWxlVmlzaWJsZShNb2R1bGUgKk1vZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGU6Ok5hbWVWaXNpYmlsaXR5S2luZCBOYW1lVmlzaWJpbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMb2NhdGlvbiBJbXBvcnRMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbikgewpAQCAtMjgyOSwxNSArMzE3MiwxOCBAQAogICAgICAgLy8gdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIGRvLgogICAgICAgY29udGludWU7CiAgICAgfQotICAgIAorCiAgICAgaWYgKCFNb2QtPmlzQXZhaWxhYmxlKCkpIHsKICAgICAgIC8vIE1vZHVsZXMgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIGNhbm5vdCBiZSBtYWRlIHZpc2libGUuCiAgICAgICBjb250aW51ZTsKICAgICB9CiAKICAgICAvLyBVcGRhdGUgdGhlIG1vZHVsZSdzIG5hbWUgdmlzaWJpbGl0eS4KKyAgICBpZiAoTmFtZVZpc2liaWxpdHkgPj0gTW9kdWxlOjpNYWNyb3NWaXNpYmxlICYmCisgICAgICAgIE1vZC0+TmFtZVZpc2liaWxpdHkgPCBNb2R1bGU6Ok1hY3Jvc1Zpc2libGUpCisgICAgICBNb2QtPk1hY3JvVmlzaWJpbGl0eUxvYyA9IEltcG9ydExvYzsKICAgICBNb2QtPk5hbWVWaXNpYmlsaXR5ID0gTmFtZVZpc2liaWxpdHk7Ci0gICAgCisKICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGRlc2VyaWFsaXplZCBhbnkgbmFtZXMgZnJvbSB0aGlzIG1vZHVsZSwKICAgICAvLyBtYXJrIHRoZW0gYXMgdmlzaWJsZS4KICAgICBIaWRkZW5OYW1lc01hcFR5cGU6Oml0ZXJhdG9yIEhpZGRlbiA9IEhpZGRlbk5hbWVzTWFwLmZpbmQoTW9kKTsKQEAgLTI4OTksNiArMzI0NSwxNyBAQAogICAgICAgICAgIWhhc0dsb2JhbEluZGV4KCkgJiYgVHJpZWRMb2FkaW5nR2xvYmFsSW5kZXg7CiB9CiAKK3N0YXRpYyB2b2lkIHVwZGF0ZU1vZHVsZVRpbWVzdGFtcChNb2R1bGVGaWxlICZNRikgeworICAvLyBPdmVyd3JpdGUgdGhlIHRpbWVzdGFtcCBmaWxlIGNvbnRlbnRzIHNvIHRoYXQgZmlsZSdzIG10aW1lIGNoYW5nZXMuCisgIHN0ZDo6c3RyaW5nIFRpbWVzdGFtcEZpbGVuYW1lID0gTUYuZ2V0VGltZXN0YW1wRmlsZW5hbWUoKTsKKyAgc3RkOjpzdHJpbmcgRXJyb3JJbmZvOworICBsbHZtOjpyYXdfZmRfb3N0cmVhbSBPUyhUaW1lc3RhbXBGaWxlbmFtZS5jX3N0cigpLCBFcnJvckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN5czo6ZnM6OkZfVGV4dCk7CisgIGlmICghRXJyb3JJbmZvLmVtcHR5KCkpCisgICAgcmV0dXJuOworICBPUyA8PCAiVGltZXN0YW1wIGZpbGVcbiI7Cit9CisKIEFTVFJlYWRlcjo6QVNUUmVhZFJlc3VsdCBBU1RSZWFkZXI6OlJlYWRBU1QoY29uc3Qgc3RkOjpzdHJpbmcgJkZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVLaW5kIFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIEltcG9ydExvYywKQEAgLTMwNTcsNiArMzQxNCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICBQcmV2aW91c0dlbmVyYXRpb24pOwogICB9CiAKKyAgaWYgKFBQLmdldEhlYWRlclNlYXJjaEluZm8oKQorICAgICAgICAgIC5nZXRIZWFkZXJTZWFyY2hPcHRzKCkKKyAgICAgICAgICAuTW9kdWxlc1ZhbGlkYXRlT25jZVBlckJ1aWxkU2Vzc2lvbikgeworICAgIC8vIE5vdyB3ZSBhcmUgY2VydGFpbiB0aGF0IHRoZSBtb2R1bGUgYW5kIGFsbCBtb2R1bGVzIGl0IGRlcGVuZHMgb24gYXJlCisgICAgLy8gdXAgdG8gZGF0ZS4gIENyZWF0ZSBvciB1cGRhdGUgdGltZXN0YW1wIGZpbGVzIGZvciBtb2R1bGVzIHRoYXQgYXJlCisgICAgLy8gbG9jYXRlZCBpbiB0aGUgbW9kdWxlIGNhY2hlIChub3QgZm9yIFBDSCBmaWxlcyB0aGF0IGNvdWxkIGJlIGFueXdoZXJlCisgICAgLy8gaW4gdGhlIGZpbGVzeXN0ZW0pLgorICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBMb2FkZWQuc2l6ZSgpOyBJICE9IE47ICsrSSkgeworICAgICAgSW1wb3J0ZWRNb2R1bGUgJk0gPSBMb2FkZWRbSV07CisgICAgICBpZiAoTS5Nb2QtPktpbmQgPT0gTUtfTW9kdWxlKSB7CisgICAgICAgIHVwZGF0ZU1vZHVsZVRpbWVzdGFtcCgqTS5Nb2QpOworICAgICAgfQorICAgIH0KKyAgfQorCiAgIHJldHVybiBTdWNjZXNzOwogfQogCkBAIC0zMTc3LDcgKzM1NDksNyBAQAogICAgIGNhc2UgQVNUX0JMT0NLX0lEOgogICAgICAgaWYgKCFIYXZlUmVhZENvbnRyb2xCbG9jaykgewogICAgICAgICBpZiAoKENsaWVudExvYWRDYXBhYmlsaXRpZXMgJiBBUlJfVmVyc2lvbk1pc21hdGNoKSA9PSAwKQotICAgICAgICAgIERpYWcoZGlhZzo6d2Fybl9wY2hfdmVyc2lvbl90b29fb2xkKTsKKyAgICAgICAgICBEaWFnKGRpYWc6OmVycl9wY2hfdmVyc2lvbl90b29fb2xkKTsKICAgICAgICAgcmV0dXJuIFZlcnNpb25NaXNtYXRjaDsKICAgICAgIH0KIApAQCAtMzMyMywxMiArMzY5NSwxNCBAQAogICAgIENvbnRleHQuc2V0Y3VkYUNvbmZpZ3VyZUNhbGxEZWNsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxGdW5jdGlvbkRlY2w+KEdldERlY2woQ1VEQVNwZWNpYWxEZWNsUmVmc1swXSkpKTsKICAgfQotICAKKwogICAvLyBSZS1leHBvcnQgYW55IG1vZHVsZXMgdGhhdCB3ZXJlIGltcG9ydGVkIGJ5IGEgbm9uLW1vZHVsZSBBU1QgZmlsZS4KLSAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IEltcG9ydGVkTW9kdWxlcy5zaXplKCk7IEkgIT0gTjsgKytJKSB7Ci0gICAgaWYgKE1vZHVsZSAqSW1wb3J0ZWQgPSBnZXRTdWJtb2R1bGUoSW1wb3J0ZWRNb2R1bGVzW0ldKSkKKyAgLy8gRklYTUU6IFRoaXMgZG9lcyBub3QgbWFrZSBtYWNyby1vbmx5IGltcG9ydHMgdmlzaWJsZSBhZ2Fpbi4gSXQgYWxzbyBkb2Vzbid0CisgIC8vIG1ha2UgI2luY2x1ZGVzIG1hcHBlZCB0byBtb2R1bGUgaW1wb3J0cyB2aXNpYmxlLgorICBmb3IgKGF1dG8gJkltcG9ydCA6IEltcG9ydGVkTW9kdWxlcykgeworICAgIGlmIChNb2R1bGUgKkltcG9ydGVkID0gZ2V0U3VibW9kdWxlKEltcG9ydC5JRCkpCiAgICAgICBtYWtlTW9kdWxlVmlzaWJsZShJbXBvcnRlZCwgTW9kdWxlOjpBbGxWaXNpYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgLypJbXBvcnRMb2M9Ki9Tb3VyY2VMb2NhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgLypJbXBvcnRMb2M9Ki9JbXBvcnQuSW1wb3J0TG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgLypDb21wbGFpbj0qL2ZhbHNlKTsKICAgfQogICBJbXBvcnRlZE1vZHVsZXMuY2xlYXIoKTsKQEAgLTMzODEsNyArMzc1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZSAmRGlhZ3MpIHsKICAgLy8gT3BlbiB0aGUgQVNUIGZpbGUuCiAgIHN0ZDo6c3RyaW5nIEVyclN0cjsKLSAgT3duaW5nUHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBCdWZmZXI7CiAgIEJ1ZmZlci5yZXNldChGaWxlTWdyLmdldEJ1ZmZlckZvckZpbGUoQVNURmlsZU5hbWUsICZFcnJTdHIpKTsKICAgaWYgKCFCdWZmZXIpIHsKICAgICBEaWFncy5SZXBvcnQoZGlhZzo6ZXJyX2ZlX3VuYWJsZV90b19yZWFkX3BjaF9maWxlKSA8PCBBU1RGaWxlTmFtZSA8PCBFcnJTdHI7CkBAIC0zNDQ4LDE3ICszODIyLDE3IEBACiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCBSZWFkTGFuZ3VhZ2VPcHRpb25zKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKSB7CisgICAgYm9vbCBSZWFkTGFuZ3VhZ2VPcHRpb25zKGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDb21wbGFpbikgb3ZlcnJpZGUgewogICAgICAgcmV0dXJuIGNoZWNrTGFuZ3VhZ2VPcHRpb25zKEV4aXN0aW5nTGFuZ09wdHMsIExhbmdPcHRzLCAwKTsKICAgICB9Ci0gICAgdmlydHVhbCBib29sIFJlYWRUYXJnZXRPcHRpb25zKGNvbnN0IFRhcmdldE9wdGlvbnMgJlRhcmdldE9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4pIHsKKyAgICBib29sIFJlYWRUYXJnZXRPcHRpb25zKGNvbnN0IFRhcmdldE9wdGlvbnMgJlRhcmdldE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluKSBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gY2hlY2tUYXJnZXRPcHRpb25zKEV4aXN0aW5nVGFyZ2V0T3B0cywgVGFyZ2V0T3B0cywgMCk7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbCBSZWFkUHJlcHJvY2Vzc29yT3B0aW9ucyhjb25zdCBQcmVwcm9jZXNzb3JPcHRpb25zICZQUE9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29tcGxhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZTdWdnZXN0ZWRQcmVkZWZpbmVzKSB7CisgICAgYm9vbCBSZWFkUHJlcHJvY2Vzc29yT3B0aW9ucyhjb25zdCBQcmVwcm9jZXNzb3JPcHRpb25zICZQUE9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBsYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlN1Z2dlc3RlZFByZWRlZmluZXMpIG92ZXJyaWRlIHsKICAgICAgIHJldHVybiBjaGVja1ByZXByb2Nlc3Nvck9wdGlvbnMoRXhpc3RpbmdQUE9wdHMsIFBQT3B0cywgMCwgRmlsZU1nciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VnZ2VzdGVkUHJlZGVmaW5lcywgRXhpc3RpbmdMYW5nT3B0cyk7CiAgICAgfQpAQCAtMzQ3MCw3ICszODQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RSZWFkZXJMaXN0ZW5lciAmTGlzdGVuZXIpIHsKICAgLy8gT3BlbiB0aGUgQVNUIGZpbGUuCiAgIHN0ZDo6c3RyaW5nIEVyclN0cjsKLSAgT3duaW5nUHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBCdWZmZXI7CiAgIEJ1ZmZlci5yZXNldChGaWxlTWdyLmdldEJ1ZmZlckZvckZpbGUoRmlsZW5hbWUsICZFcnJTdHIpKTsKICAgaWYgKCFCdWZmZXIpIHsKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM0OTYsNiArMzg3MCw3IEBACiAgICAgcmV0dXJuIHRydWU7CiAKICAgYm9vbCBOZWVkc0lucHV0RmlsZXMgPSBMaXN0ZW5lci5uZWVkc0lucHV0RmlsZVZpc2l0YXRpb24oKTsKKyAgYm9vbCBOZWVkc1N5c3RlbUlucHV0RmlsZXMgPSBMaXN0ZW5lci5uZWVkc1N5c3RlbUlucHV0RmlsZVZpc2l0YXRpb24oKTsKICAgQml0c3RyZWFtQ3Vyc29yIElucHV0RmlsZXNDdXJzb3I7CiAgIGlmIChOZWVkc0lucHV0RmlsZXMpIHsKICAgICBJbnB1dEZpbGVzQ3Vyc29yID0gU3RyZWFtOwpAQCAtMzU4Miw2ICszOTU3LDEwIEBACiAgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bUlucHV0RmlsZXM7ICsrSSkgewogICAgICAgICAvLyBHbyBmaW5kIHRoaXMgaW5wdXQgZmlsZS4KICAgICAgICAgYm9vbCBpc1N5c3RlbUZpbGUgPSBJID49IE51bVVzZXJGaWxlczsKKworICAgICAgICBpZiAoaXNTeXN0ZW1GaWxlICYmICFOZWVkc1N5c3RlbUlucHV0RmlsZXMpCisgICAgICAgICAgYnJlYWs7IC8vIHRoZSByZXN0IGFyZSBzeXN0ZW0gaW5wdXQgZmlsZXMKKwogICAgICAgICBCaXRzdHJlYW1DdXJzb3IgJkN1cnNvciA9IElucHV0RmlsZXNDdXJzb3I7CiAgICAgICAgIFNhdmVkU3RyZWFtUG9zaXRpb24gU2F2ZWRQb3NpdGlvbihDdXJzb3IpOwogICAgICAgICBDdXJzb3IuSnVtcFRvQml0KElucHV0RmlsZU9mZnNbSV0pOwpAQCAtMzU5Miw3ICszOTcxLDggQEAKICAgICAgICAgYm9vbCBzaG91bGRDb250aW51ZSA9IGZhbHNlOwogICAgICAgICBzd2l0Y2ggKChJbnB1dEZpbGVSZWNvcmRUeXBlcylDdXJzb3IucmVhZFJlY29yZChDb2RlLCBSZWNvcmQsICZCbG9iKSkgewogICAgICAgICBjYXNlIElOUFVUX0ZJTEU6Ci0gICAgICAgICAgc2hvdWxkQ29udGludWUgPSBMaXN0ZW5lci52aXNpdElucHV0RmlsZShCbG9iLCBpc1N5c3RlbUZpbGUpOworICAgICAgICAgIGJvb2wgT3ZlcnJpZGRlbiA9IHN0YXRpY19jYXN0PGJvb2w+KFJlY29yZFszXSk7CisgICAgICAgICAgc2hvdWxkQ29udGludWUgPSBMaXN0ZW5lci52aXNpdElucHV0RmlsZShCbG9iLCBpc1N5c3RlbUZpbGUsIE92ZXJyaWRkZW4pOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmICghc2hvdWxkQ29udGludWUpCkBAIC0zNjYzLDE1ICs0MDQzLDE3IEBACiAgICAgICB9CiAgICAgICAKICAgICAgIFN0cmluZ1JlZiBOYW1lID0gQmxvYjsKLSAgICAgIFN1Ym1vZHVsZUlEIEdsb2JhbElEID0gZ2V0R2xvYmFsU3VibW9kdWxlSUQoRiwgUmVjb3JkWzBdKTsKLSAgICAgIFN1Ym1vZHVsZUlEIFBhcmVudCA9IGdldEdsb2JhbFN1Ym1vZHVsZUlEKEYsIFJlY29yZFsxXSk7Ci0gICAgICBib29sIElzRnJhbWV3b3JrID0gUmVjb3JkWzJdOwotICAgICAgYm9vbCBJc0V4cGxpY2l0ID0gUmVjb3JkWzNdOwotICAgICAgYm9vbCBJc1N5c3RlbSA9IFJlY29yZFs0XTsKLSAgICAgIGJvb2wgSW5mZXJTdWJtb2R1bGVzID0gUmVjb3JkWzVdOwotICAgICAgYm9vbCBJbmZlckV4cGxpY2l0U3VibW9kdWxlcyA9IFJlY29yZFs2XTsKLSAgICAgIGJvb2wgSW5mZXJFeHBvcnRXaWxkY2FyZCA9IFJlY29yZFs3XTsKLSAgICAgIGJvb2wgQ29uZmlnTWFjcm9zRXhoYXVzdGl2ZSA9IFJlY29yZFs4XTsKKyAgICAgIHVuc2lnbmVkIElkeCA9IDA7CisgICAgICBTdWJtb2R1bGVJRCBHbG9iYWxJRCA9IGdldEdsb2JhbFN1Ym1vZHVsZUlEKEYsIFJlY29yZFtJZHgrK10pOworICAgICAgU3VibW9kdWxlSUQgUGFyZW50ID0gZ2V0R2xvYmFsU3VibW9kdWxlSUQoRiwgUmVjb3JkW0lkeCsrXSk7CisgICAgICBib29sIElzRnJhbWV3b3JrID0gUmVjb3JkW0lkeCsrXTsKKyAgICAgIGJvb2wgSXNFeHBsaWNpdCA9IFJlY29yZFtJZHgrK107CisgICAgICBib29sIElzU3lzdGVtID0gUmVjb3JkW0lkeCsrXTsKKyAgICAgIGJvb2wgSXNFeHRlcm5DID0gUmVjb3JkW0lkeCsrXTsKKyAgICAgIGJvb2wgSW5mZXJTdWJtb2R1bGVzID0gUmVjb3JkW0lkeCsrXTsKKyAgICAgIGJvb2wgSW5mZXJFeHBsaWNpdFN1Ym1vZHVsZXMgPSBSZWNvcmRbSWR4KytdOworICAgICAgYm9vbCBJbmZlckV4cG9ydFdpbGRjYXJkID0gUmVjb3JkW0lkeCsrXTsKKyAgICAgIGJvb2wgQ29uZmlnTWFjcm9zRXhoYXVzdGl2ZSA9IFJlY29yZFtJZHgrK107CiAKICAgICAgIE1vZHVsZSAqUGFyZW50TW9kdWxlID0gMDsKICAgICAgIGlmIChQYXJlbnQpCkBAIC0zNzA3LDYgKzQwODksNyBAQAogICAgICAgCiAgICAgICBDdXJyZW50TW9kdWxlLT5Jc0Zyb21Nb2R1bGVGaWxlID0gdHJ1ZTsKICAgICAgIEN1cnJlbnRNb2R1bGUtPklzU3lzdGVtID0gSXNTeXN0ZW0gfHwgQ3VycmVudE1vZHVsZS0+SXNTeXN0ZW07CisgICAgICBDdXJyZW50TW9kdWxlLT5Jc0V4dGVybkMgPSBJc0V4dGVybkM7CiAgICAgICBDdXJyZW50TW9kdWxlLT5JbmZlclN1Ym1vZHVsZXMgPSBJbmZlclN1Ym1vZHVsZXM7CiAgICAgICBDdXJyZW50TW9kdWxlLT5JbmZlckV4cGxpY2l0U3VibW9kdWxlcyA9IEluZmVyRXhwbGljaXRTdWJtb2R1bGVzOwogICAgICAgQ3VycmVudE1vZHVsZS0+SW5mZXJFeHBvcnRXaWxkY2FyZCA9IEluZmVyRXhwb3J0V2lsZGNhcmQ7CkBAIC00MDA0LDcgKzQzODcsNiBAQAogICBUYXJnZXRPcHRzLlRyaXBsZSA9IFJlYWRTdHJpbmcoUmVjb3JkLCBJZHgpOwogICBUYXJnZXRPcHRzLkNQVSA9IFJlYWRTdHJpbmcoUmVjb3JkLCBJZHgpOwogICBUYXJnZXRPcHRzLkFCSSA9IFJlYWRTdHJpbmcoUmVjb3JkLCBJZHgpOwotICBUYXJnZXRPcHRzLkNYWEFCSSA9IFJlYWRTdHJpbmcoUmVjb3JkLCBJZHgpOwogICBUYXJnZXRPcHRzLkxpbmtlclZlcnNpb24gPSBSZWFkU3RyaW5nKFJlY29yZCwgSWR4KTsKICAgZm9yICh1bnNpZ25lZCBOID0gUmVjb3JkW0lkeCsrXTsgTjsgLS1OKSB7CiAgICAgVGFyZ2V0T3B0cy5GZWF0dXJlc0FzV3JpdHRlbi5wdXNoX2JhY2soUmVhZFN0cmluZyhSZWNvcmQsIElkeCkpOwpAQCAtNDA2OCw2ICs0NDUwLDcgQEAKIAogICBIU09wdHMuUmVzb3VyY2VEaXIgPSBSZWFkU3RyaW5nKFJlY29yZCwgSWR4KTsKICAgSFNPcHRzLk1vZHVsZUNhY2hlUGF0aCA9IFJlYWRTdHJpbmcoUmVjb3JkLCBJZHgpOworICBIU09wdHMuTW9kdWxlVXNlckJ1aWxkUGF0aCA9IFJlYWRTdHJpbmcoUmVjb3JkLCBJZHgpOwogICBIU09wdHMuRGlzYWJsZU1vZHVsZUhhc2ggPSBSZWNvcmRbSWR4KytdOwogICBIU09wdHMuVXNlQnVpbHRpbkluY2x1ZGVzID0gUmVjb3JkW0lkeCsrXTsKICAgSFNPcHRzLlVzZVN0YW5kYXJkU3lzdGVtSW5jbHVkZXMgPSBSZWNvcmRbSWR4KytdOwpAQCAtNDU0OCw2ICs0OTMxLDE2IEBACiAgICAgcmV0dXJuIERUOwogICB9CiAKKyAgY2FzZSBUWVBFX0FESlVTVEVEOiB7CisgICAgaWYgKFJlY29yZC5zaXplKCkgIT0gMikgeworICAgICAgRXJyb3IoIkluY29ycmVjdCBlbmNvZGluZyBvZiBhZGp1c3RlZCB0eXBlIik7CisgICAgICByZXR1cm4gUXVhbFR5cGUoKTsKKyAgICB9CisgICAgUXVhbFR5cGUgT3JpZ2luYWxUeSA9IHJlYWRUeXBlKCpMb2MuRiwgUmVjb3JkLCBJZHgpOworICAgIFF1YWxUeXBlIEFkanVzdGVkVHkgPSByZWFkVHlwZSgqTG9jLkYsIFJlY29yZCwgSWR4KTsKKyAgICByZXR1cm4gQ29udGV4dC5nZXRBZGp1c3RlZFR5cGUoT3JpZ2luYWxUeSwgQWRqdXN0ZWRUeSk7CisgIH0KKwogICBjYXNlIFRZUEVfQkxPQ0tfUE9JTlRFUjogewogICAgIGlmIChSZWNvcmQuc2l6ZSgpICE9IDEpIHsKICAgICAgIEVycm9yKCJJbmNvcnJlY3QgZW5jb2Rpbmcgb2YgYmxvY2sgcG9pbnRlciB0eXBlIik7CkBAIC00NjcxLDIzICs1MDY0LDggQEAKICAgICBFUEkuSGFzVHJhaWxpbmdSZXR1cm4gPSBSZWNvcmRbSWR4KytdOwogICAgIEVQSS5UeXBlUXVhbHMgPSBSZWNvcmRbSWR4KytdOwogICAgIEVQSS5SZWZRdWFsaWZpZXIgPSBzdGF0aWNfY2FzdDxSZWZRdWFsaWZpZXJLaW5kPihSZWNvcmRbSWR4KytdKTsKLSAgICBFeGNlcHRpb25TcGVjaWZpY2F0aW9uVHlwZSBFU1QgPQotICAgICAgICBzdGF0aWNfY2FzdDxFeGNlcHRpb25TcGVjaWZpY2F0aW9uVHlwZT4oUmVjb3JkW0lkeCsrXSk7Ci0gICAgRVBJLkV4Y2VwdGlvblNwZWNUeXBlID0gRVNUOwotICAgIFNtYWxsVmVjdG9yPFF1YWxUeXBlLCAyPiBFeGNlcHRpb25zOwotICAgIGlmIChFU1QgPT0gRVNUX0R5bmFtaWMpIHsKLSAgICAgIEVQSS5OdW1FeGNlcHRpb25zID0gUmVjb3JkW0lkeCsrXTsKLSAgICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gRVBJLk51bUV4Y2VwdGlvbnM7ICsrSSkKLSAgICAgICAgRXhjZXB0aW9ucy5wdXNoX2JhY2socmVhZFR5cGUoKkxvYy5GLCBSZWNvcmQsIElkeCkpOwotICAgICAgRVBJLkV4Y2VwdGlvbnMgPSBFeGNlcHRpb25zLmRhdGEoKTsKLSAgICB9IGVsc2UgaWYgKEVTVCA9PSBFU1RfQ29tcHV0ZWROb2V4Y2VwdCkgewotICAgICAgRVBJLk5vZXhjZXB0RXhwciA9IFJlYWRFeHByKCpMb2MuRik7Ci0gICAgfSBlbHNlIGlmIChFU1QgPT0gRVNUX1VuaW5zdGFudGlhdGVkKSB7Ci0gICAgICBFUEkuRXhjZXB0aW9uU3BlY0RlY2wgPSBSZWFkRGVjbEFzPEZ1bmN0aW9uRGVjbD4oKkxvYy5GLCBSZWNvcmQsIElkeCk7Ci0gICAgICBFUEkuRXhjZXB0aW9uU3BlY1RlbXBsYXRlID0gUmVhZERlY2xBczxGdW5jdGlvbkRlY2w+KCpMb2MuRiwgUmVjb3JkLCBJZHgpOwotICAgIH0gZWxzZSBpZiAoRVNUID09IEVTVF9VbmV2YWx1YXRlZCkgewotICAgICAgRVBJLkV4Y2VwdGlvblNwZWNEZWNsID0gUmVhZERlY2xBczxGdW5jdGlvbkRlY2w+KCpMb2MuRiwgUmVjb3JkLCBJZHgpOwotICAgIH0KKyAgICBTbWFsbFZlY3RvcjxRdWFsVHlwZSwgOD4gRXhjZXB0aW9uU3RvcmFnZTsKKyAgICByZWFkRXhjZXB0aW9uU3BlYygqTG9jLkYsIEV4Y2VwdGlvblN0b3JhZ2UsIEVQSSwgUmVjb3JkLCBJZHgpOwogICAgIHJldHVybiBDb250ZXh0LmdldEZ1bmN0aW9uVHlwZShSZXN1bHRUeXBlLCBQYXJhbVR5cGVzLCBFUEkpOwogICB9CiAKQEAgLTQ4MzcsOSArNTIxNSw5IEBACiAgICAgdW5zaWduZWQgSWR4ID0gMDsKICAgICBRdWFsVHlwZSBQYXJtID0gcmVhZFR5cGUoKkxvYy5GLCBSZWNvcmQsIElkeCk7CiAgICAgUXVhbFR5cGUgUmVwbGFjZW1lbnQgPSByZWFkVHlwZSgqTG9jLkYsIFJlY29yZCwgSWR4KTsKLSAgICByZXR1cm4KLSAgICAgIENvbnRleHQuZ2V0U3Vic3RUZW1wbGF0ZVR5cGVQYXJtVHlwZShjYXN0PFRlbXBsYXRlVHlwZVBhcm1UeXBlPihQYXJtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZW1lbnQpOworICAgIHJldHVybiBDb250ZXh0LmdldFN1YnN0VGVtcGxhdGVUeXBlUGFybVR5cGUoCisgICAgICAgIGNhc3Q8VGVtcGxhdGVUeXBlUGFybVR5cGU+KFBhcm0pLAorICAgICAgICBDb250ZXh0LmdldENhbm9uaWNhbFR5cGUoUmVwbGFjZW1lbnQpKTsKICAgfQogCiAgIGNhc2UgVFlQRV9TVUJTVF9URU1QTEFURV9UWVBFX1BBUk1fUEFDSzogewpAQCAtNDk0Miw2ICs1MzIwLDI5IEBACiAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgVHlwZUNvZGUhIik7CiB9CiAKK3ZvaWQgQVNUUmVhZGVyOjpyZWFkRXhjZXB0aW9uU3BlYyhNb2R1bGVGaWxlICZNb2R1bGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxRdWFsVHlwZT4gJkV4Y2VwdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25Qcm90b1R5cGU6OkV4dFByb3RvSW5mbyAmRVBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlY29yZERhdGEgJlJlY29yZCwgdW5zaWduZWQgJklkeCkgeworICBFeGNlcHRpb25TcGVjaWZpY2F0aW9uVHlwZSBFU1QgPQorICAgICAgc3RhdGljX2Nhc3Q8RXhjZXB0aW9uU3BlY2lmaWNhdGlvblR5cGU+KFJlY29yZFtJZHgrK10pOworICBFUEkuRXhjZXB0aW9uU3BlY1R5cGUgPSBFU1Q7CisgIGlmIChFU1QgPT0gRVNUX0R5bmFtaWMpIHsKKyAgICBFUEkuTnVtRXhjZXB0aW9ucyA9IFJlY29yZFtJZHgrK107CisgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSAhPSBFUEkuTnVtRXhjZXB0aW9uczsgKytJKQorICAgICAgRXhjZXB0aW9ucy5wdXNoX2JhY2socmVhZFR5cGUoTW9kdWxlRmlsZSwgUmVjb3JkLCBJZHgpKTsKKyAgICBFUEkuRXhjZXB0aW9ucyA9IEV4Y2VwdGlvbnMuZGF0YSgpOworICB9IGVsc2UgaWYgKEVTVCA9PSBFU1RfQ29tcHV0ZWROb2V4Y2VwdCkgeworICAgIEVQSS5Ob2V4Y2VwdEV4cHIgPSBSZWFkRXhwcihNb2R1bGVGaWxlKTsKKyAgfSBlbHNlIGlmIChFU1QgPT0gRVNUX1VuaW5zdGFudGlhdGVkKSB7CisgICAgRVBJLkV4Y2VwdGlvblNwZWNEZWNsID0gUmVhZERlY2xBczxGdW5jdGlvbkRlY2w+KE1vZHVsZUZpbGUsIFJlY29yZCwgSWR4KTsKKyAgICBFUEkuRXhjZXB0aW9uU3BlY1RlbXBsYXRlID0KKyAgICAgICAgUmVhZERlY2xBczxGdW5jdGlvbkRlY2w+KE1vZHVsZUZpbGUsIFJlY29yZCwgSWR4KTsKKyAgfSBlbHNlIGlmIChFU1QgPT0gRVNUX1VuZXZhbHVhdGVkKSB7CisgICAgRVBJLkV4Y2VwdGlvblNwZWNEZWNsID0gUmVhZERlY2xBczxGdW5jdGlvbkRlY2w+KE1vZHVsZUZpbGUsIFJlY29yZCwgSWR4KTsKKyAgfQorfQorCiBjbGFzcyBjbGFuZzo6VHlwZUxvY1JlYWRlciA6IHB1YmxpYyBUeXBlTG9jVmlzaXRvcjxUeXBlTG9jUmVhZGVyPiB7CiAgIEFTVFJlYWRlciAmUmVhZGVyOwogICBNb2R1bGVGaWxlICZGOwpAQCAtNDk5Nyw2ICs1Mzk4LDkgQEAKIHZvaWQgVHlwZUxvY1JlYWRlcjo6VmlzaXREZWNheWVkVHlwZUxvYyhEZWNheWVkVHlwZUxvYyBUTCkgewogICAvLyBub3RoaW5nIHRvIGRvCiB9Cit2b2lkIFR5cGVMb2NSZWFkZXI6OlZpc2l0QWRqdXN0ZWRUeXBlTG9jKEFkanVzdGVkVHlwZUxvYyBUTCkgeworICAvLyBub3RoaW5nIHRvIGRvCit9CiB2b2lkIFR5cGVMb2NSZWFkZXI6OlZpc2l0QmxvY2tQb2ludGVyVHlwZUxvYyhCbG9ja1BvaW50ZXJUeXBlTG9jIFRMKSB7CiAgIFRMLnNldENhcmV0TG9jKFJlYWRTb3VyY2VMb2NhdGlvbihSZWNvcmQsIElkeCkpOwogfQpAQCAtNTA0Niw4ICs1NDUwLDggQEAKICAgVEwuc2V0TFBhcmVuTG9jKFJlYWRTb3VyY2VMb2NhdGlvbihSZWNvcmQsIElkeCkpOwogICBUTC5zZXRSUGFyZW5Mb2MoUmVhZFNvdXJjZUxvY2F0aW9uKFJlY29yZCwgSWR4KSk7CiAgIFRMLnNldExvY2FsUmFuZ2VFbmQoUmVhZFNvdXJjZUxvY2F0aW9uKFJlY29yZCwgSWR4KSk7Ci0gIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUTC5nZXROdW1BcmdzKCk7IGkgIT0gZTsgKytpKSB7Ci0gICAgVEwuc2V0QXJnKGksIFJlYWREZWNsQXM8UGFybVZhckRlY2w+KFJlY29yZCwgSWR4KSk7CisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUTC5nZXROdW1QYXJhbXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICBUTC5zZXRQYXJhbShpLCBSZWFkRGVjbEFzPFBhcm1WYXJEZWNsPihSZWNvcmQsIElkeCkpOwogICB9CiB9CiB2b2lkIFR5cGVMb2NSZWFkZXI6OlZpc2l0RnVuY3Rpb25Qcm90b1R5cGVMb2MoRnVuY3Rpb25Qcm90b1R5cGVMb2MgVEwpIHsKQEAgLTU5MjQsMTUgKzYzMjgsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVENvbnN1bWVyICpDb25zdW1lcikgewogICBhc3NlcnQoSW1wbEQgJiYgQ29uc3VtZXIpOwogCi0gIGZvciAoT2JqQ0ltcGxEZWNsOjptZXRob2RfaXRlcmF0b3IKLSAgICAgICAgIEkgPSBJbXBsRC0+bWV0aF9iZWdpbigpLCBFID0gSW1wbEQtPm1ldGhfZW5kKCk7IEkgIT0gRTsgKytJKQotICAgIENvbnN1bWVyLT5IYW5kbGVJbnRlcmVzdGluZ0RlY2woRGVjbEdyb3VwUmVmKCpJKSk7CisgIGZvciAoYXV0byAqSSA6IEltcGxELT5tZXRob2RzKCkpCisgICAgQ29uc3VtZXItPkhhbmRsZUludGVyZXN0aW5nRGVjbChEZWNsR3JvdXBSZWYoSSkpOwogCiAgIENvbnN1bWVyLT5IYW5kbGVJbnRlcmVzdGluZ0RlY2woRGVjbEdyb3VwUmVmKEltcGxEKSk7CiB9CiAKIHZvaWQgQVNUUmVhZGVyOjpQYXNzSW50ZXJlc3RpbmdEZWNsc1RvQ29uc3VtZXIoKSB7CiAgIGFzc2VydChDb25zdW1lcik7CisKKyAgaWYgKFBhc3NpbmdEZWNsc1RvQ29uc3VtZXIpCisgICAgcmV0dXJuOworCisgIC8vIEd1YXJkIHZhcmlhYmxlIHRvIGF2b2lkIHJlY3Vyc2l2ZWx5IHJlZG9pbmcgdGhlIHByb2Nlc3Mgb2YgcGFzc2luZworICAvLyBkZWNscyB0byBjb25zdW1lci4KKyAgU2F2ZUFuZFJlc3RvcmU8Ym9vbD4gR3VhcmRQYXNzaW5nRGVjbHNUb0NvbnN1bWVyKFBhc3NpbmdEZWNsc1RvQ29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKwogICB3aGlsZSAoIUludGVyZXN0aW5nRGVjbHMuZW1wdHkoKSkgewogICAgIERlY2wgKkQgPSBJbnRlcmVzdGluZ0RlY2xzLmZyb250KCk7CiAgICAgSW50ZXJlc3RpbmdEZWNscy5wb3BfZnJvbnQoKTsKQEAgLTU5NTQsMTIgKzYzNjYsMTIgQEAKICAgaWYgKCFDb25zdW1lcikKICAgICByZXR1cm47CiAKLSAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IEV4dGVybmFsRGVmaW5pdGlvbnMuc2l6ZSgpOyBJICE9IE47ICsrSSkgeworICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gRWFnZXJseURlc2VyaWFsaXplZERlY2xzLnNpemUoKTsgSSAhPSBOOyArK0kpIHsKICAgICAvLyBGb3JjZSBkZXNlcmlhbGl6YXRpb24gb2YgdGhpcyBkZWNsLCB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGJlIHF1ZXVlZCBmb3IKICAgICAvLyBwYXNzaW5nIHRvIHRoZSBjb25zdW1lci4KLSAgICBHZXREZWNsKEV4dGVybmFsRGVmaW5pdGlvbnNbSV0pOworICAgIEdldERlY2woRWFnZXJseURlc2VyaWFsaXplZERlY2xzW0ldKTsKICAgfQotICBFeHRlcm5hbERlZmluaXRpb25zLmNsZWFyKCk7CisgIEVhZ2VybHlEZXNlcmlhbGl6ZWREZWNscy5jbGVhcigpOwogCiAgIFBhc3NJbnRlcmVzdGluZ0RlY2xzVG9Db25zdW1lcigpOwogfQpAQCAtNjIxMSw3ICs2NjIzLDcgQEAKICAgcHVibGljOgogICAgIGV4cGxpY2l0IEFTVElkZW50aWZpZXJJdGVyYXRvcihjb25zdCBBU1RSZWFkZXIgJlJlYWRlcik7CiAKLSAgICB2aXJ0dWFsIFN0cmluZ1JlZiBOZXh0KCk7CisgICAgU3RyaW5nUmVmIE5leHQoKSBvdmVycmlkZTsKICAgfTsKIH0KIApAQCAtNzI5OCw2ICs3NzEwLDcgQEAKICAgICAgICBJID0gQ29tbWVudHNDdXJzb3JzLmJlZ2luKCksCiAgICAgICAgRSA9IENvbW1lbnRzQ3Vyc29ycy5lbmQoKTsKICAgICAgICBJICE9IEU7ICsrSSkgeworICAgIENvbW1lbnRzLmNsZWFyKCk7CiAgICAgQml0c3RyZWFtQ3Vyc29yICZDdXJzb3IgPSBJLT5maXJzdDsKICAgICBzZXJpYWxpemF0aW9uOjpNb2R1bGVGaWxlICZGID0gKkktPnNlY29uZDsKICAgICBTYXZlZFN0cmVhbVBvc2l0aW9uIFNhdmVkUG9zaXRpb24oQ3Vyc29yKTsKQEAgLTczMDYsNyArNzcxOSw3IEBACiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgIGxsdm06OkJpdHN0cmVhbUVudHJ5IEVudHJ5ID0KICAgICAgICAgQ3Vyc29yLmFkdmFuY2VTa2lwcGluZ1N1YmJsb2NrcyhCaXRzdHJlYW1DdXJzb3I6OkFGX0RvbnRQb3BCbG9ja0F0RW5kKTsKLSAgICAgIAorCiAgICAgICBzd2l0Y2ggKEVudHJ5LktpbmQpIHsKICAgICAgIGNhc2UgbGx2bTo6Qml0c3RyZWFtRW50cnk6OlN1YkJsb2NrOiAvLyBIYW5kbGVkIGZvciB1cyBhbHJlYWR5LgogICAgICAgY2FzZSBsbHZtOjpCaXRzdHJlYW1FbnRyeTo6RXJyb3I6CkBAIC03MzM2LDkgKzc3NDksOSBAQAogICAgICAgfQogICAgICAgfQogICAgIH0KLSAgTmV4dEN1cnNvcjo7CisgIE5leHRDdXJzb3I6CisgICAgQ29udGV4dC5Db21tZW50cy5hZGREZXNlcmlhbGl6ZWRDb21tZW50cyhDb21tZW50cyk7CiAgIH0KLSAgQ29udGV4dC5Db21tZW50cy5hZGRDb21tZW50c1RvRnJvbnQoQ29tbWVudHMpOwogfQogCiB2b2lkIEFTVFJlYWRlcjo6ZmluaXNoUGVuZGluZ0FjdGlvbnMoKSB7CkBAIC03MzUyLDE0ICs3NzY1LDE0IEBACiAgICAgVG9wTGV2ZWxEZWNsc01hcCBUb3BMZXZlbERlY2xzOwogCiAgICAgd2hpbGUgKCFQZW5kaW5nSWRlbnRpZmllckluZm9zLmVtcHR5KCkpIHsKLSAgICAgIC8vIEZJWE1FOiBzdGQ6Om1vdmUKICAgICAgIElkZW50aWZpZXJJbmZvICpJSSA9IFBlbmRpbmdJZGVudGlmaWVySW5mb3MuYmFjaygpLmZpcnN0OwotICAgICAgU21hbGxWZWN0b3I8dWludDMyX3QsIDQ+IERlY2xJRHMgPSBQZW5kaW5nSWRlbnRpZmllckluZm9zLmJhY2soKS5zZWNvbmQ7CisgICAgICBTbWFsbFZlY3Rvcjx1aW50MzJfdCwgND4gRGVjbElEcyA9CisgICAgICAgICAgc3RkOjptb3ZlKFBlbmRpbmdJZGVudGlmaWVySW5mb3MuYmFjaygpLnNlY29uZCk7CiAgICAgICBQZW5kaW5nSWRlbnRpZmllckluZm9zLnBvcF9iYWNrKCk7CiAKICAgICAgIFNldEdsb2JhbGx5VmlzaWJsZURlY2xzKElJLCBEZWNsSURzLCAmVG9wTGV2ZWxEZWNsc1tJSV0pOwogICAgIH0KLSAgCisKICAgICAvLyBMb2FkIHBlbmRpbmcgZGVjbGFyYXRpb24gY2hhaW5zLgogICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gUGVuZGluZ0RlY2xDaGFpbnMuc2l6ZSgpOyArK0kpIHsKICAgICAgIGxvYWRQZW5kaW5nRGVjbENoYWluKFBlbmRpbmdEZWNsQ2hhaW5zW0ldKTsKQEAgLTczODIsMTQgKzc3OTUsMTQgQEAKICAgICAgIFNtYWxsVmVjdG9yPFBlbmRpbmdNYWNyb0luZm8sIDI+IEdsb2JhbElEczsKICAgICAgIEdsb2JhbElEcy5zd2FwKFBlbmRpbmdNYWNyb0lEcy5iZWdpbigpW0ldLnNlY29uZCk7CiAgICAgICAvLyBJbml0aWFsaXplIHRoZSBtYWNybyBoaXN0b3J5IGZyb20gY2hhaW5lZC1QQ0hzIGFoZWFkIG9mIG1vZHVsZSBpbXBvcnRzLgotICAgICAgZm9yICh1bnNpZ25lZCBJRElkeCA9IDAsIE51bUlEcyA9IEdsb2JhbElEcy5zaXplKCk7IElESWR4ICE9ICBOdW1JRHM7CisgICAgICBmb3IgKHVuc2lnbmVkIElESWR4ID0gMCwgTnVtSURzID0gR2xvYmFsSURzLnNpemUoKTsgSURJZHggIT0gTnVtSURzOwogICAgICAgICAgICArK0lESWR4KSB7CiAgICAgICAgIGNvbnN0IFBlbmRpbmdNYWNyb0luZm8gJkluZm8gPSBHbG9iYWxJRHNbSURJZHhdOwogICAgICAgICBpZiAoSW5mby5NLT5LaW5kICE9IE1LX01vZHVsZSkKICAgICAgICAgICByZXNvbHZlUGVuZGluZ01hY3JvKElJLCBJbmZvKTsKICAgICAgIH0KICAgICAgIC8vIEhhbmRsZSBtb2R1bGUgaW1wb3J0cy4KLSAgICAgIGZvciAodW5zaWduZWQgSURJZHggPSAwLCBOdW1JRHMgPSBHbG9iYWxJRHMuc2l6ZSgpOyBJRElkeCAhPSAgTnVtSURzOworICAgICAgZm9yICh1bnNpZ25lZCBJRElkeCA9IDAsIE51bUlEcyA9IEdsb2JhbElEcy5zaXplKCk7IElESWR4ICE9IE51bUlEczsKICAgICAgICAgICAgKytJRElkeCkgewogICAgICAgICBjb25zdCBQZW5kaW5nTWFjcm9JbmZvICZJbmZvID0gR2xvYmFsSURzW0lESWR4XTsKICAgICAgICAgaWYgKEluZm8uTS0+S2luZCA9PSBNS19Nb2R1bGUpCkBAIC03NDMwLDE2ICs3ODQzLDE0IEBACiAgICAgICBsbHZtOjpTbWFsbFZlY3Rvcjxjb25zdCBOYW1lZERlY2wqLCA0PiBDYW5kaWRhdGVzOwogICAgICAgZm9yIChEZWNsQ29udGV4dDo6bG9va3VwX2l0ZXJhdG9yIEkgPSBSLmJlZ2luKCksIEUgPSBSLmVuZCgpOwogICAgICAgICAgICAhRm91bmQgJiYgSSAhPSBFOyArK0kpIHsKLSAgICAgICAgZm9yIChEZWNsOjpyZWRlY2xfaXRlcmF0b3IgUkkgPSAoKkkpLT5yZWRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFID0gKCpJKS0+cmVkZWNsc19lbmQoKTsKLSAgICAgICAgICAgICBSSSAhPSBSRTsgKytSSSkgewotICAgICAgICAgIGlmICgoKlJJKS0+Z2V0TGV4aWNhbERlY2xDb250ZXh0KCkgPT0gQ2Fub25EZWYpIHsKKyAgICAgICAgZm9yIChhdXRvIFJJIDogKCpJKS0+cmVkZWNscygpKSB7CisgICAgICAgICAgaWYgKFJJLT5nZXRMZXhpY2FsRGVjbENvbnRleHQoKSA9PSBDYW5vbkRlZikgewogICAgICAgICAgICAgLy8gVGhpcyBkZWNsYXJhdGlvbiBpcyBwcmVzZW50IGluIHRoZSBjYW5vbmljYWwgZGVmaW5pdGlvbi4gSWYgaXQncwogICAgICAgICAgICAgLy8gaW4gdGhlIHNhbWUgcmVkZWNsIGNoYWluLCBpdCdzIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3IuCi0gICAgICAgICAgICBpZiAoKCpSSSktPmdldENhbm9uaWNhbERlY2woKSA9PSBEQ2Fub24pCisgICAgICAgICAgICBpZiAoUkktPmdldENhbm9uaWNhbERlY2woKSA9PSBEQ2Fub24pCiAgICAgICAgICAgICAgIEZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgQ2FuZGlkYXRlcy5wdXNoX2JhY2soY2FzdDxOYW1lZERlY2w+KCpSSSkpOworICAgICAgICAgICAgICBDYW5kaWRhdGVzLnB1c2hfYmFjayhjYXN0PE5hbWVkRGVjbD4oUkkpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzQ4MCw0NCArNzg5MSwzNSBAQAogICAgICAgICBjb25zdF9jYXN0PFRhZ1R5cGUqPihUYWdUKS0+ZGVjbCA9IFREOwogICAgICAgfQogICAgICAgCi0gICAgICBpZiAoQ1hYUmVjb3JkRGVjbCAqUkQgPSBkeW5fY2FzdDxDWFhSZWNvcmREZWNsPigqRCkpIHsKLSAgICAgICAgZm9yIChDWFhSZWNvcmREZWNsOjpyZWRlY2xfaXRlcmF0b3IgUiA9IFJELT5yZWRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFbmQgPSBSRC0+cmVkZWNsc19lbmQoKTsKLSAgICAgICAgICAgICBSICE9IFJFbmQ7ICsrUikKLSAgICAgICAgICBjYXN0PENYWFJlY29yZERlY2w+KCpSKS0+RGVmaW5pdGlvbkRhdGEgPSBSRC0+RGVmaW5pdGlvbkRhdGE7CisgICAgICBpZiAoYXV0byBSRCA9IGR5bl9jYXN0PENYWFJlY29yZERlY2w+KCpEKSkgeworICAgICAgICBmb3IgKGF1dG8gUiA6IFJELT5yZWRlY2xzKCkpCisgICAgICAgICAgY2FzdDxDWFhSZWNvcmREZWNsPihSKS0+RGVmaW5pdGlvbkRhdGEgPSBSRC0+RGVmaW5pdGlvbkRhdGE7CiAgICAgICAgIAogICAgICAgfQogCiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgCi0gICAgaWYgKE9iakNJbnRlcmZhY2VEZWNsICpJRCA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPigqRCkpIHsKKyAgICBpZiAoYXV0byBJRCA9IGR5bl9jYXN0PE9iakNJbnRlcmZhY2VEZWNsPigqRCkpIHsKICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBPYmpDSW50ZXJmYWNlVHlwZSBwb2ludHMgYXQgdGhlIGRlZmluaXRpb24uCiAgICAgICBjb25zdF9jYXN0PE9iakNJbnRlcmZhY2VUeXBlICo+KGNhc3Q8T2JqQ0ludGVyZmFjZVR5cGU+KElELT5UeXBlRm9yRGVjbCkpCiAgICAgICAgIC0+RGVjbCA9IElEOwogICAgICAgCi0gICAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjpyZWRlY2xfaXRlcmF0b3IgUiA9IElELT5yZWRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVuZCA9IElELT5yZWRlY2xzX2VuZCgpOwotICAgICAgICAgICBSICE9IFJFbmQ7ICsrUikKKyAgICAgIGZvciAoYXV0byBSIDogSUQtPnJlZGVjbHMoKSkKICAgICAgICAgUi0+RGF0YSA9IElELT5EYXRhOwogICAgICAgCiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgCi0gICAgaWYgKE9iakNQcm90b2NvbERlY2wgKlBEID0gZHluX2Nhc3Q8T2JqQ1Byb3RvY29sRGVjbD4oKkQpKSB7Ci0gICAgICBmb3IgKE9iakNQcm90b2NvbERlY2w6OnJlZGVjbF9pdGVyYXRvciBSID0gUEQtPnJlZGVjbHNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFbmQgPSBQRC0+cmVkZWNsc19lbmQoKTsKLSAgICAgICAgICAgUiAhPSBSRW5kOyArK1IpCisgICAgaWYgKGF1dG8gUEQgPSBkeW5fY2FzdDxPYmpDUHJvdG9jb2xEZWNsPigqRCkpIHsKKyAgICAgIGZvciAoYXV0byBSIDogUEQtPnJlZGVjbHMoKSkKICAgICAgICAgUi0+RGF0YSA9IFBELT5EYXRhOwogICAgICAgCiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgCi0gICAgUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsICpSVEQKLSAgICAgID0gY2FzdDxSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w+KCpEKS0+Z2V0Q2Fub25pY2FsRGVjbCgpOwotICAgIGZvciAoUmVkZWNsYXJhYmxlVGVtcGxhdGVEZWNsOjpyZWRlY2xfaXRlcmF0b3IgUiA9IFJURC0+cmVkZWNsc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVuZCA9IFJURC0+cmVkZWNsc19lbmQoKTsKLSAgICAgICAgIFIgIT0gUkVuZDsgKytSKQorICAgIGF1dG8gUlREID0gY2FzdDxSZWRlY2xhcmFibGVUZW1wbGF0ZURlY2w+KCpEKS0+Z2V0Q2Fub25pY2FsRGVjbCgpOworICAgIGZvciAoYXV0byBSIDogUlRELT5yZWRlY2xzKCkpCiAgICAgICBSLT5Db21tb24gPSBSVEQtPkNvbW1vbjsKICAgfQogICBQZW5kaW5nRGVmaW5pdGlvbnMuY2xlYXIoKTsKQEAgLTc1NTMsMjAgKzc5NTUsMTAgQEAKICAgfQogICAtLU51bUN1cnJlbnRFbGVtZW50c0Rlc2VyaWFsaXppbmc7CiAKLSAgaWYgKE51bUN1cnJlbnRFbGVtZW50c0Rlc2VyaWFsaXppbmcgPT0gMCAmJgotICAgICAgQ29uc3VtZXIgJiYgIVBhc3NpbmdEZWNsc1RvQ29uc3VtZXIpIHsKLSAgICAvLyBHdWFyZCB2YXJpYWJsZSB0byBhdm9pZCByZWN1cnNpdmVseSByZWRvaW5nIHRoZSBwcm9jZXNzIG9mIHBhc3NpbmcKLSAgICAvLyBkZWNscyB0byBjb25zdW1lci4KLSAgICBTYXZlQW5kUmVzdG9yZTxib29sPiBHdWFyZFBhc3NpbmdEZWNsc1RvQ29uc3VtZXIoUGFzc2luZ0RlY2xzVG9Db25zdW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0KLSAgICB3aGlsZSAoIUludGVyZXN0aW5nRGVjbHMuZW1wdHkoKSkgewotICAgICAgLy8gV2UgYXJlIG5vdCBpbiByZWN1cnNpdmUgbG9hZGluZywgc28gaXQncyBzYWZlIHRvIHBhc3MgdGhlICJpbnRlcmVzdGluZyIKLSAgICAgIC8vIGRlY2xzIHRvIHRoZSBjb25zdW1lci4KLSAgICAgIERlY2wgKkQgPSBJbnRlcmVzdGluZ0RlY2xzLmZyb250KCk7Ci0gICAgICBJbnRlcmVzdGluZ0RlY2xzLnBvcF9mcm9udCgpOwotICAgICAgUGFzc0ludGVyZXN0aW5nRGVjbFRvQ29uc3VtZXIoRCk7Ci0gICAgfQorICBpZiAoTnVtQ3VycmVudEVsZW1lbnRzRGVzZXJpYWxpemluZyA9PSAwICYmIENvbnN1bWVyKSB7CisgICAgLy8gV2UgYXJlIG5vdCBpbiByZWN1cnNpdmUgbG9hZGluZywgc28gaXQncyBzYWZlIHRvIHBhc3MgdGhlICJpbnRlcmVzdGluZyIKKyAgICAvLyBkZWNscyB0byB0aGUgY29uc3VtZXIuCisgICAgUGFzc0ludGVyZXN0aW5nRGVjbHNUb0NvbnN1bWVyKCk7CiAgIH0KIH0KIApAQCAtNzU4NywxMyArNzk3OSwxOCBAQAogCiBBU1RSZWFkZXI6OkFTVFJlYWRlcihQcmVwcm9jZXNzb3IgJlBQLCBBU1RDb250ZXh0ICZDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIGlzeXNyb290LCBib29sIERpc2FibGVWYWxpZGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0FTVFdpdGhDb21waWxlckVycm9ycywgYm9vbCBVc2VHbG9iYWxJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dBU1RXaXRoQ29tcGlsZXJFcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93Q29uZmlndXJhdGlvbk1pc21hdGNoLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBWYWxpZGF0ZVN5c3RlbUlucHV0cywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXNlR2xvYmFsSW5kZXgpCiAgIDogTGlzdGVuZXIobmV3IFBDSFZhbGlkYXRvcihQUCwgKnRoaXMpKSwgRGVzZXJpYWxpemF0aW9uTGlzdGVuZXIoMCksCiAgICAgU291cmNlTWdyKFBQLmdldFNvdXJjZU1hbmFnZXIoKSksIEZpbGVNZ3IoUFAuZ2V0RmlsZU1hbmFnZXIoKSksCiAgICAgRGlhZ3MoUFAuZ2V0RGlhZ25vc3RpY3MoKSksIFNlbWFPYmooMCksIFBQKFBQKSwgQ29udGV4dChDb250ZXh0KSwKICAgICBDb25zdW1lcigwKSwgTW9kdWxlTWdyKFBQLmdldEZpbGVNYW5hZ2VyKCkpLAogICAgIGlzeXNyb290KGlzeXNyb290KSwgRGlzYWJsZVZhbGlkYXRpb24oRGlzYWJsZVZhbGlkYXRpb24pLAogICAgIEFsbG93QVNUV2l0aENvbXBpbGVyRXJyb3JzKEFsbG93QVNUV2l0aENvbXBpbGVyRXJyb3JzKSwKKyAgICBBbGxvd0NvbmZpZ3VyYXRpb25NaXNtYXRjaChBbGxvd0NvbmZpZ3VyYXRpb25NaXNtYXRjaCksCisgICAgVmFsaWRhdGVTeXN0ZW1JbnB1dHMoVmFsaWRhdGVTeXN0ZW1JbnB1dHMpLAogICAgIFVzZUdsb2JhbEluZGV4KFVzZUdsb2JhbEluZGV4KSwgVHJpZWRMb2FkaW5nR2xvYmFsSW5kZXgoZmFsc2UpLAogICAgIEN1cnJlbnRHZW5lcmF0aW9uKDApLCBDdXJyU3dpdGNoQ2FzZVN0bXRzKCZTd2l0Y2hDYXNlU3RtdHMpLAogICAgIE51bVNMb2NFbnRyaWVzUmVhZCgwKSwgVG90YWxOdW1TTG9jRW50cmllcygwKSwgCmRpZmYgLS1naXQgYS9saWIvU2VyaWFsaXphdGlvbi9BU1RSZWFkZXJEZWNsLmNwcCBiL2xpYi9TZXJpYWxpemF0aW9uL0FTVFJlYWRlckRlY2wuY3BwCmluZGV4IGI4MTAyZDguLjdkOTUwNzIgMTAwNjQ0Ci0tLSBhL2xpYi9TZXJpYWxpemF0aW9uL0FTVFJlYWRlckRlY2wuY3BwCisrKyBiL2xpYi9TZXJpYWxpemF0aW9uL0FTVFJlYWRlckRlY2wuY3BwCkBAIC0zNTYsMTEgKzM1NiwxNCBAQAogfQogCiB2b2lkIEFTVERlY2xSZWFkZXI6OlZpc2l0RGVjbChEZWNsICpEKSB7Ci0gIGlmIChELT5pc1RlbXBsYXRlUGFyYW1ldGVyKCkpIHsKKyAgaWYgKEQtPmlzVGVtcGxhdGVQYXJhbWV0ZXIoKSB8fCBELT5pc1RlbXBsYXRlUGFyYW1ldGVyUGFjaygpIHx8CisgICAgICBpc2E8UGFybVZhckRlY2w+KEQpKSB7CiAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBkZXNlcmlhbGl6ZSB0aGUgRGVjbENvbnRleHQgb2YgYSB0ZW1wbGF0ZQotICAgIC8vIHBhcmFtZXRlciBpbW1lZGlhdGVseSwgYmVjYXVzZSB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIG1pZ2h0IGJlCi0gICAgLy8gdXNlZCBpbiB0aGUgZm9ybXVsYXRpb24gb2YgaXRzIERlY2xDb250ZXh0LiBVc2UgdGhlIHRyYW5zbGF0aW9uCi0gICAgLy8gdW5pdCBEZWNsQ29udGV4dCBhcyBhIHBsYWNlaG9sZGVyLgorICAgIC8vIHBhcmFtZXRlciBvciBvZiBhIHBhcmFtZXRlciBvZiBhIGZ1bmN0aW9uIHRlbXBsYXRlIGltbWVkaWF0ZWx5LiAgIFRoZXNlCisgICAgLy8gZW50aXRpZXMgbWlnaHQgYmUgdXNlZCBpbiB0aGUgZm9ybXVsYXRpb24gb2YgaXRzIERlY2xDb250ZXh0IChmb3IKKyAgICAvLyBleGFtcGxlLCBhIGZ1bmN0aW9uIHBhcmFtZXRlciBjYW4gYmUgdXNlZCBpbiBkZWNsdHlwZSgpIGluIHRyYWlsaW5nCisgICAgLy8gcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uKS4gIFVzZSB0aGUgdHJhbnNsYXRpb24gdW5pdCBEZWNsQ29udGV4dCBhcyBhCisgICAgLy8gcGxhY2Vob2xkZXIuCiAgICAgR2xvYmFsRGVjbElEIFNlbWFEQ0lERm9yVGVtcGxhdGVQYXJtRGVjbCA9IFJlYWREZWNsSUQoUmVjb3JkLCBJZHgpOwogICAgIEdsb2JhbERlY2xJRCBMZXhpY2FsRENJREZvclRlbXBsYXRlUGFybURlY2wgPSBSZWFkRGVjbElEKFJlY29yZCwgSWR4KTsKICAgICBSZWFkZXIuYWRkUGVuZGluZ0RlY2xDb250ZXh0SW5mbyhELApAQCAtNDA5LDcgKzQxMiw3IEBACiAgICAgICAgICAgCiAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgZGVjbGFyYXRpb24gd2FzIGhpZGRlbiBiZWNhdXNlIGl0cyBvd25pbmcgbW9kdWxlIGlzIAogICAgICAgICAgIC8vIG5vdCB5ZXQgdmlzaWJsZS4KLSAgICAgICAgICBSZWFkZXIuSGlkZGVuTmFtZXNNYXBbT3duZXJdLnB1c2hfYmFjayhEKTsKKyAgICAgICAgICBSZWFkZXIuSGlkZGVuTmFtZXNNYXBbT3duZXJdLkhpZGRlbkRlY2xzLnB1c2hfYmFjayhEKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTcwOSw4ICs3MTIsOCBAQAogICBNRC0+c2V0RGVjbEltcGxlbWVudGF0aW9uKChPYmpDTWV0aG9kRGVjbDo6SW1wbGVtZW50YXRpb25Db250cm9sKVJlY29yZFtJZHgrK10pOwogICBNRC0+c2V0T2JqQ0RlY2xRdWFsaWZpZXIoKERlY2w6Ok9iakNEZWNsUXVhbGlmaWVyKVJlY29yZFtJZHgrK10pOwogICBNRC0+U2V0UmVsYXRlZFJlc3VsdFR5cGUoUmVjb3JkW0lkeCsrXSk7Ci0gIE1ELT5zZXRSZXN1bHRUeXBlKFJlYWRlci5yZWFkVHlwZShGLCBSZWNvcmQsIElkeCkpOwotICBNRC0+c2V0UmVzdWx0VHlwZVNvdXJjZUluZm8oR2V0VHlwZVNvdXJjZUluZm8oUmVjb3JkLCBJZHgpKTsKKyAgTUQtPnNldFJldHVyblR5cGUoUmVhZGVyLnJlYWRUeXBlKEYsIFJlY29yZCwgSWR4KSk7CisgIE1ELT5zZXRSZXR1cm5UeXBlU291cmNlSW5mbyhHZXRUeXBlU291cmNlSW5mbyhSZWNvcmQsIElkeCkpOwogICBNRC0+RGVjbEVuZExvYyA9IFJlYWRTb3VyY2VMb2NhdGlvbihSZWNvcmQsIElkeCk7CiAgIHVuc2lnbmVkIE51bVBhcmFtcyA9IFJlY29yZFtJZHgrK107CiAgIFNtYWxsVmVjdG9yPFBhcm1WYXJEZWNsICosIDE2PiBQYXJhbXM7CkBAIC03NTUsNiArNzU4LDcgQEAKICAgICBEYXRhLlN1cGVyQ2xhc3NMb2MgPSBSZWFkU291cmNlTG9jYXRpb24oUmVjb3JkLCBJZHgpOwogCiAgICAgRGF0YS5FbmRMb2MgPSBSZWFkU291cmNlTG9jYXRpb24oUmVjb3JkLCBJZHgpOworICAgIERhdGEuSGFzRGVzaWduYXRlZEluaXRpYWxpemVycyA9IFJlY29yZFtJZHgrK107CiAgICAgCiAgICAgLy8gUmVhZCB0aGUgZGlyZWN0bHkgcmVmZXJlbmNlZCBwcm90b2NvbHMgYW5kIHRoZWlyIFNvdXJjZUxvY2F0aW9ucy4KICAgICB1bnNpZ25lZCBOdW1Qcm90b2NvbHMgPSBSZWNvcmRbSWR4KytdOwpAQCAtNzk4LDggKzgwMiw2IEBACiAgIElWRC0+c2V0TmV4dEl2YXIoMCk7CiAgIGJvb2wgc3ludGggPSBSZWNvcmRbSWR4KytdOwogICBJVkQtPnNldFN5bnRoZXNpemUoc3ludGgpOwotICBib29sIGJhY2tpbmdJdmFyUmVmZXJlbmNlZEluQWNjZXNzb3IgPSBSZWNvcmRbSWR4KytdOwotICBJVkQtPnNldEJhY2tpbmdJdmFyUmVmZXJlbmNlZEluQWNjZXNzb3IoYmFja2luZ0l2YXJSZWZlcmVuY2VkSW5BY2Nlc3Nvcik7CiB9CiAKIHZvaWQgQVNURGVjbFJlYWRlcjo6VmlzaXRPYmpDUHJvdG9jb2xEZWNsKE9iakNQcm90b2NvbERlY2wgKlBEKSB7CkBAIC05MDcsOCArOTA5LDggQEAKICAgRC0+c2V0SXZhclJCcmFjZUxvYyhSZWFkU291cmNlTG9jYXRpb24oUmVjb3JkLCBJZHgpKTsKICAgRC0+c2V0SGFzTm9uWmVyb0NvbnN0cnVjdG9ycyhSZWNvcmRbSWR4KytdKTsKICAgRC0+c2V0SGFzRGVzdHJ1Y3RvcnMoUmVjb3JkW0lkeCsrXSk7Ci0gIGxsdm06OnRpZShELT5JdmFySW5pdGlhbGl6ZXJzLCBELT5OdW1JdmFySW5pdGlhbGl6ZXJzKQotICAgICAgPSBSZWFkZXIuUmVhZENYWEN0b3JJbml0aWFsaXplcnMoRiwgUmVjb3JkLCBJZHgpOworICBzdGQ6OnRpZShELT5JdmFySW5pdGlhbGl6ZXJzLCBELT5OdW1JdmFySW5pdGlhbGl6ZXJzKSA9CisgICAgICBSZWFkZXIuUmVhZENYWEN0b3JJbml0aWFsaXplcnMoRiwgUmVjb3JkLCBJZHgpOwogfQogCiAKQEAgLTk3MSw3ICs5NzMsNyBAQAogICBWRC0+c2V0Q2FjaGVkTGlua2FnZShWYXJMaW5rYWdlKTsKIAogICAvLyBSZWNvbnN0cnVjdCB0aGUgb25lIHBpZWNlIG9mIHRoZSBJZGVudGlmaWVyTmFtZXNwYWNlIHRoYXQgd2UgbmVlZC4KLSAgaWYgKFZhckxpbmthZ2UgIT0gTm9MaW5rYWdlICYmCisgIGlmIChWRC0+Z2V0U3RvcmFnZUNsYXNzKCkgPT0gU0NfRXh0ZXJuICYmIFZhckxpbmthZ2UgIT0gTm9MaW5rYWdlICYmCiAgICAgICBWRC0+Z2V0TGV4aWNhbERlY2xDb250ZXh0KCktPmlzRnVuY3Rpb25Pck1ldGhvZCgpKQogICAgIFZELT5zZXRMb2NhbEV4dGVybkRlY2woKTsKIApAQCAtMTE4Niw2ICsxMTg4LDcgQEAKICAgRGF0YS5IYXNQcm90ZWN0ZWRGaWVsZHMgPSBSZWNvcmRbSWR4KytdOwogICBEYXRhLkhhc1B1YmxpY0ZpZWxkcyA9IFJlY29yZFtJZHgrK107CiAgIERhdGEuSGFzTXV0YWJsZUZpZWxkcyA9IFJlY29yZFtJZHgrK107CisgIERhdGEuSGFzVmFyaWFudE1lbWJlcnMgPSBSZWNvcmRbSWR4KytdOwogICBEYXRhLkhhc09ubHlDTWVtYmVycyA9IFJlY29yZFtJZHgrK107CiAgIERhdGEuSGFzSW5DbGFzc0luaXRpYWxpemVyID0gUmVjb3JkW0lkeCsrXTsKICAgRGF0YS5IYXNVbmluaXRpYWxpemVkUmVmZXJlbmNlTWVtYmVyID0gUmVjb3JkW0lkeCsrXTsKQEAgLTEzNDUsMTAgKzEzNDgsMTIgQEAKIAogdm9pZCBBU1REZWNsUmVhZGVyOjpWaXNpdENYWENvbnN0cnVjdG9yRGVjbChDWFhDb25zdHJ1Y3RvckRlY2wgKkQpIHsKICAgVmlzaXRDWFhNZXRob2REZWNsKEQpOwotICAKKworICBpZiAoYXV0byAqQ0QgPSBSZWFkRGVjbEFzPENYWENvbnN0cnVjdG9yRGVjbD4oUmVjb3JkLCBJZHgpKQorICAgIEQtPnNldEluaGVyaXRlZENvbnN0cnVjdG9yKENEKTsKICAgRC0+SXNFeHBsaWNpdFNwZWNpZmllZCA9IFJlY29yZFtJZHgrK107Ci0gIGxsdm06OnRpZShELT5DdG9ySW5pdGlhbGl6ZXJzLCBELT5OdW1DdG9ySW5pdGlhbGl6ZXJzKQotICAgICAgPSBSZWFkZXIuUmVhZENYWEN0b3JJbml0aWFsaXplcnMoRiwgUmVjb3JkLCBJZHgpOworICBzdGQ6OnRpZShELT5DdG9ySW5pdGlhbGl6ZXJzLCBELT5OdW1DdG9ySW5pdGlhbGl6ZXJzKSA9CisgICAgICBSZWFkZXIuUmVhZENYWEN0b3JJbml0aWFsaXplcnMoRiwgUmVjb3JkLCBJZHgpOwogfQogCiB2b2lkIEFTVERlY2xSZWFkZXI6OlZpc2l0Q1hYRGVzdHJ1Y3RvckRlY2woQ1hYRGVzdHJ1Y3RvckRlY2wgKkQpIHsKQEAgLTE5ODEsNyArMTk4Niw4IEBACiAKICAgaWYgKGlzYTxGaWxlU2NvcGVBc21EZWNsPihEKSB8fCAKICAgICAgIGlzYTxPYmpDUHJvdG9jb2xEZWNsPihEKSB8fCAKLSAgICAgIGlzYTxPYmpDSW1wbERlY2w+KEQpKQorICAgICAgaXNhPE9iakNJbXBsRGVjbD4oRCkgfHwKKyAgICAgIGlzYTxJbXBvcnREZWNsPihEKSkKICAgICByZXR1cm4gdHJ1ZTsKICAgaWYgKFZhckRlY2wgKlZhciA9IGR5bl9jYXN0PFZhckRlY2w+KEQpKQogICAgIHJldHVybiBWYXItPmlzRmlsZVZhckRlY2woKSAmJgpAQCAtMjYwNSwxMiArMjYxMSwxMCBAQAogICAgICAgLy8gVGhlcmUgYXJlIHVwZGF0ZXMuIFRoaXMgbWVhbnMgdGhlIGNvbnRleHQgaGFzIGV4dGVybmFsIHZpc2libGUKICAgICAgIC8vIHN0b3JhZ2UsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIHN0b3JlZCB2ZXJzaW9uIGRpZG4ndC4KICAgICAgIExvb2t1cERDLT5zZXRIYXNFeHRlcm5hbFZpc2libGVTdG9yYWdlKHRydWUpOwotICAgICAgRGVjbENvbnRleHRWaXNpYmxlVXBkYXRlcyAmVSA9IEktPnNlY29uZDsKLSAgICAgIGZvciAoRGVjbENvbnRleHRWaXNpYmxlVXBkYXRlczo6aXRlcmF0b3IgVUkgPSBVLmJlZ2luKCksIFVFID0gVS5lbmQoKTsKLSAgICAgICAgICAgVUkgIT0gVUU7ICsrVUkpIHsKLSAgICAgICAgRGVjbENvbnRleHRJbmZvICZJbmZvID0gVUktPnNlY29uZC0+RGVjbENvbnRleHRJbmZvc1tEQ107CisgICAgICBmb3IgKGNvbnN0IGF1dG8gJlVwZGF0ZSA6IEktPnNlY29uZCkgeworICAgICAgICBEZWNsQ29udGV4dEluZm8gJkluZm8gPSBVcGRhdGUuc2Vjb25kLT5EZWNsQ29udGV4dEluZm9zW0RDXTsKICAgICAgICAgZGVsZXRlIEluZm8uTmFtZUxvb2t1cFRhYmxlRGF0YTsKLSAgICAgICAgSW5mby5OYW1lTG9va3VwVGFibGVEYXRhID0gVUktPmZpcnN0OworICAgICAgICBJbmZvLk5hbWVMb29rdXBUYWJsZURhdGEgPSBVcGRhdGUuZmlyc3Q7CiAgICAgICB9CiAgICAgICBQZW5kaW5nVmlzaWJsZVVwZGF0ZXMuZXJhc2UoSSk7CiAgICAgfQpAQCAtMjY0Miw2ICsyNjQ2LDcgQEAKICAgRGVjbFVwZGF0ZU9mZnNldHNNYXA6Oml0ZXJhdG9yIFVwZEkgPSBEZWNsVXBkYXRlT2Zmc2V0cy5maW5kKElEKTsKICAgaWYgKFVwZEkgIT0gRGVjbFVwZGF0ZU9mZnNldHMuZW5kKCkpIHsKICAgICBGaWxlT2Zmc2V0c1R5ICZVcGRhdGVPZmZzZXRzID0gVXBkSS0+c2Vjb25kOworICAgIGJvb2wgV2FzSW50ZXJlc3RpbmcgPSBpc0NvbnN1bWVySW50ZXJlc3RlZEluKEQsIGZhbHNlKTsKICAgICBmb3IgKEZpbGVPZmZzZXRzVHk6Oml0ZXJhdG9yCiAgICAgICAgICBJID0gVXBkYXRlT2Zmc2V0cy5iZWdpbigpLCBFID0gVXBkYXRlT2Zmc2V0cy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKICAgICAgIE1vZHVsZUZpbGUgKkYgPSBJLT5maXJzdDsKQEAgLTI2NTQsMzMgKzI2NTksMjMgQEAKICAgICAgIHVuc2lnbmVkIFJlY0NvZGUgPSBDdXJzb3IucmVhZFJlY29yZChDb2RlLCBSZWNvcmQpOwogICAgICAgKHZvaWQpUmVjQ29kZTsKICAgICAgIGFzc2VydChSZWNDb2RlID09IERFQ0xfVVBEQVRFUyAmJiAiRXhwZWN0ZWQgREVDTF9VUERBVEVTIHJlY29yZCEiKTsKLSAgICAgIAorCiAgICAgICB1bnNpZ25lZCBJZHggPSAwOwogICAgICAgQVNURGVjbFJlYWRlciBSZWFkZXIoKnRoaXMsICpGLCBJRCwgMCwgUmVjb3JkLCBJZHgpOwogICAgICAgUmVhZGVyLlVwZGF0ZURlY2woRCwgKkYsIFJlY29yZCk7CisKKyAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgbWFkZSB0aGlzIGRlY2xhcmF0aW9uIGludGVyZXN0aW5nLiBJZiBzbywgcmVtZW1iZXIgdGhhdAorICAgICAgLy8gd2UgbmVlZCB0byBoYW5kIGl0IG9mZiB0byB0aGUgY29uc3VtZXIuCisgICAgICBpZiAoIVdhc0ludGVyZXN0aW5nICYmCisgICAgICAgICAgaXNDb25zdW1lckludGVyZXN0ZWRJbihELCBSZWFkZXIuaGFzUGVuZGluZ0JvZHkoKSkpIHsKKyAgICAgICAgSW50ZXJlc3RpbmdEZWNscy5wdXNoX2JhY2soRCk7CisgICAgICAgIFdhc0ludGVyZXN0aW5nID0gdHJ1ZTsKKyAgICAgIH0KICAgICB9CiAgIH0KIH0KIAogbmFtZXNwYWNlIHsKLSAgc3RydWN0IENvbXBhcmVMb2NhbFJlZGVjbGFyYXRpb25zSW5mb1RvSUQgewotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBMb2NhbFJlZGVjbGFyYXRpb25zSW5mbyAmWCwgRGVjbElEIFkpIHsKLSAgICAgIHJldHVybiBYLkZpcnN0SUQgPCBZOwotICAgIH0KLQotICAgIGJvb2wgb3BlcmF0b3IoKShEZWNsSUQgWCwgY29uc3QgTG9jYWxSZWRlY2xhcmF0aW9uc0luZm8gJlkpIHsKLSAgICAgIHJldHVybiBYIDwgWS5GaXJzdElEOwotICAgIH0KLQotICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBMb2NhbFJlZGVjbGFyYXRpb25zSW5mbyAmWCwgCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2FsUmVkZWNsYXJhdGlvbnNJbmZvICZZKSB7Ci0gICAgICByZXR1cm4gWC5GaXJzdElEIDwgWS5GaXJzdElEOwotICAgIH0KLSAgICBib29sIG9wZXJhdG9yKCkoRGVjbElEIFgsIERlY2xJRCBZKSB7Ci0gICAgICByZXR1cm4gWCA8IFk7Ci0gICAgfQotICB9OwotICAKICAgLy8vIFxicmllZiBNb2R1bGUgdmlzaXRvciBjbGFzcyB0aGF0IGZpbmRzIGFsbCBvZiB0aGUgcmVkZWNsYXJhdGlvbnMgb2YgYSAKICAgLy8vIAogICBjbGFzcyBSZWRlY2xDaGFpblZpc2l0b3IgewpAQCAtMjcyNCwxMCArMjcxOSwxMSBAQAogICAgICAgCiAgICAgICAvLyBQZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCB0byBmaW5kIHRoZSBsb2NhbCByZWRlY2xhcmF0aW9ucyBmb3IgdGhpcwogICAgICAgLy8gZGVjbGFyYXRpb24gKGlmIGFueSkuCisgICAgICBjb25zdCBMb2NhbFJlZGVjbGFyYXRpb25zSW5mbyBDb21wYXJlID0geyBJRCwgMCB9OwogICAgICAgY29uc3QgTG9jYWxSZWRlY2xhcmF0aW9uc0luZm8gKlJlc3VsdAogICAgICAgICA9IHN0ZDo6bG93ZXJfYm91bmQoTS5SZWRlY2xhcmF0aW9uc01hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uUmVkZWNsYXJhdGlvbnNNYXAgKyBNLkxvY2FsTnVtUmVkZWNsYXJhdGlvbnNJbk1hcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJRCwgQ29tcGFyZUxvY2FsUmVkZWNsYXJhdGlvbnNJbmZvVG9JRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmUpOwogICAgICAgaWYgKFJlc3VsdCA9PSBNLlJlZGVjbGFyYXRpb25zTWFwICsgTS5Mb2NhbE51bVJlZGVjbGFyYXRpb25zSW5NYXAgfHwKICAgICAgICAgICBSZXN1bHQtPkZpcnN0SUQgIT0gSUQpIHsKICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHByZXZpb3VzbHktY2Fub25pY2FsIHNpbmdsZXRvbiBkZWNsYXJhdGlvbiB0aGF0IHdhcyAKQEAgLTI4MDIsMjQgKzI3OTgsNiBAQAogfQogCiBuYW1lc3BhY2UgewotICBzdHJ1Y3QgQ29tcGFyZU9iakNDYXRlZ29yaWVzSW5mbyB7Ci0gICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IE9iakNDYXRlZ29yaWVzSW5mbyAmWCwgRGVjbElEIFkpIHsKLSAgICAgIHJldHVybiBYLkRlZmluaXRpb25JRCA8IFk7Ci0gICAgfQotICAgIAotICAgIGJvb2wgb3BlcmF0b3IoKShEZWNsSUQgWCwgY29uc3QgT2JqQ0NhdGVnb3JpZXNJbmZvICZZKSB7Ci0gICAgICByZXR1cm4gWCA8IFkuRGVmaW5pdGlvbklEOwotICAgIH0KLSAgICAKLSAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgT2JqQ0NhdGVnb3JpZXNJbmZvICZYLCAKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0NhdGVnb3JpZXNJbmZvICZZKSB7Ci0gICAgICByZXR1cm4gWC5EZWZpbml0aW9uSUQgPCBZLkRlZmluaXRpb25JRDsKLSAgICB9Ci0gICAgYm9vbCBvcGVyYXRvcigpKERlY2xJRCBYLCBEZWNsSUQgWSkgewotICAgICAgcmV0dXJuIFggPCBZOwotICAgIH0KLSAgfTsKLQogICAvLy8gXGJyaWVmIEdpdmVuIGFuIE9iakMgaW50ZXJmYWNlLCBnb2VzIHRocm91Z2ggdGhlIG1vZHVsZXMgYW5kIGxpbmtzIHRvIHRoZQogICAvLy8gaW50ZXJmYWNlIGFsbCB0aGUgY2F0ZWdvcmllcyBmb3IgaXQuCiAgIGNsYXNzIE9iakNDYXRlZ29yaWVzVmlzaXRvciB7CkBAIC0yODgxLDE1ICsyODU5LDEyIEBACiAgICAgICAgIFRhaWwoMCkgCiAgICAgewogICAgICAgLy8gUG9wdWxhdGUgdGhlIG5hbWUgLT4gY2F0ZWdvcnkgbWFwIHdpdGggdGhlIHNldCBvZiBrbm93biBjYXRlZ29yaWVzLgotICAgICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6a25vd25fY2F0ZWdvcmllc19pdGVyYXRvcgotICAgICAgICAgICAgIENhdCA9IEludGVyZmFjZS0+a25vd25fY2F0ZWdvcmllc19iZWdpbigpLAotICAgICAgICAgICAgIENhdEVuZCA9IEludGVyZmFjZS0+a25vd25fY2F0ZWdvcmllc19lbmQoKTsKLSAgICAgICAgICAgQ2F0ICE9IENhdEVuZDsgKytDYXQpIHsKKyAgICAgIGZvciAoYXV0byAqQ2F0IDogSW50ZXJmYWNlLT5rbm93bl9jYXRlZ29yaWVzKCkpIHsKICAgICAgICAgaWYgKENhdC0+Z2V0RGVjbE5hbWUoKSkKLSAgICAgICAgICBOYW1lQ2F0ZWdvcnlNYXBbQ2F0LT5nZXREZWNsTmFtZSgpXSA9ICpDYXQ7CisgICAgICAgICAgTmFtZUNhdGVnb3J5TWFwW0NhdC0+Z2V0RGVjbE5hbWUoKV0gPSBDYXQ7CiAgICAgICAgIAogICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSB0YWlsIG9mIHRoZSBjYXRlZ29yeSBsaXN0LgotICAgICAgICBUYWlsID0gKkNhdDsKKyAgICAgICAgVGFpbCA9IENhdDsKICAgICAgIH0KICAgICB9CiAKQEAgLTI5MTIsMTAgKzI4ODcsMTEgQEAKIAogICAgICAgLy8gUGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggdG8gZmluZCB0aGUgbG9jYWwgcmVkZWNsYXJhdGlvbnMgZm9yIHRoaXMKICAgICAgIC8vIGRlY2xhcmF0aW9uIChpZiBhbnkpLgorICAgICAgY29uc3QgT2JqQ0NhdGVnb3JpZXNJbmZvIENvbXBhcmUgPSB7IExvY2FsSUQsIDAgfTsKICAgICAgIGNvbnN0IE9iakNDYXRlZ29yaWVzSW5mbyAqUmVzdWx0CiAgICAgICAgID0gc3RkOjpsb3dlcl9ib3VuZChNLk9iakNDYXRlZ29yaWVzTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTS5PYmpDQ2F0ZWdvcmllc01hcCArIE0uTG9jYWxOdW1PYmpDQ2F0ZWdvcmllc0luTWFwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsSUQsIENvbXBhcmVPYmpDQ2F0ZWdvcmllc0luZm8oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJlKTsKICAgICAgIGlmIChSZXN1bHQgPT0gTS5PYmpDQ2F0ZWdvcmllc01hcCArIE0uTG9jYWxOdW1PYmpDQ2F0ZWdvcmllc0luTWFwIHx8CiAgICAgICAgICAgUmVzdWx0LT5EZWZpbml0aW9uSUQgIT0gTG9jYWxJRCkgewogICAgICAgICAvLyBXZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4gSWYgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgaW4gdGhpcyBtb2R1bGUKQEAgLTI5NzksNiArMjk1NSwzNiBAQAogICAgICAgICAgIFJlYWRlci5SZWFkU291cmNlTG9jYXRpb24oTW9kdWxlRmlsZSwgUmVjb3JkLCBJZHgpKTsKICAgICAgIGJyZWFrOwogCisgICAgY2FzZSBVUERfQ1hYX0lOU1RBTlRJQVRFRF9GVU5DVElPTl9ERUZJTklUSU9OOiB7CisgICAgICBGdW5jdGlvbkRlY2wgKkZEID0gY2FzdDxGdW5jdGlvbkRlY2w+KEQpOworICAgICAgaWYgKFJlYWRlci5QZW5kaW5nQm9kaWVzW0ZEXSkKKyAgICAgICAgLy8gRklYTUU6IE1heWJlIGNoZWNrIGZvciBPRFIgdmlvbGF0aW9ucy4KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmIChSZWNvcmRbSWR4KytdKQorICAgICAgICBGRC0+c2V0SW1wbGljaXRseUlubGluZSgpOworICAgICAgRkQtPnNldElubmVyTG9jU3RhcnQoUmVhZGVyLlJlYWRTb3VyY2VMb2NhdGlvbihNb2R1bGVGaWxlLCBSZWNvcmQsIElkeCkpOworICAgICAgaWYgKGF1dG8gKkNEID0gZHluX2Nhc3Q8Q1hYQ29uc3RydWN0b3JEZWNsPihGRCkpCisgICAgICAgIHN0ZDo6dGllKENELT5DdG9ySW5pdGlhbGl6ZXJzLCBDRC0+TnVtQ3RvckluaXRpYWxpemVycykgPQorICAgICAgICAgICAgUmVhZGVyLlJlYWRDWFhDdG9ySW5pdGlhbGl6ZXJzKE1vZHVsZUZpbGUsIFJlY29yZCwgSWR4KTsKKyAgICAgIC8vIFN0b3JlIHRoZSBvZmZzZXQgb2YgdGhlIGJvZHkgc28gd2UgY2FuIGxhemlseSBsb2FkIGl0IGxhdGVyLgorICAgICAgUmVhZGVyLlBlbmRpbmdCb2RpZXNbRkRdID0gR2V0Q3VycmVudEN1cnNvck9mZnNldCgpOworICAgICAgSGFzUGVuZGluZ0JvZHkgPSB0cnVlOworICAgICAgYXNzZXJ0KElkeCA9PSBSZWNvcmQuc2l6ZSgpICYmICJsYXp5IGJvZHkgbXVzdCBiZSBsYXN0Iik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFVQRF9DWFhfUkVTT0xWRURfRVhDRVBUSU9OX1NQRUM6IHsKKyAgICAgIGF1dG8gKkZEID0gY2FzdDxGdW5jdGlvbkRlY2w+KEQpOworICAgICAgYXV0byAqRlBUID0gRkQtPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpOworICAgICAgYXV0byBFUEkgPSBGUFQtPmdldEV4dFByb3RvSW5mbygpOworICAgICAgU21hbGxWZWN0b3I8UXVhbFR5cGUsIDg+IEV4Y2VwdGlvblN0b3JhZ2U7CisgICAgICBSZWFkZXIucmVhZEV4Y2VwdGlvblNwZWMoTW9kdWxlRmlsZSwgRXhjZXB0aW9uU3RvcmFnZSwgRVBJLCBSZWNvcmQsIElkeCk7CisgICAgICBGRC0+c2V0VHlwZShSZWFkZXIuQ29udGV4dC5nZXRGdW5jdGlvblR5cGUoRlBULT5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBULT5nZXRQYXJhbVR5cGVzKCksIEVQSSkpOworICAgICAgYnJlYWs7CisgICAgfQorCiAgICAgY2FzZSBVUERfQ1hYX0RFRFVDRURfUkVUVVJOX1RZUEU6IHsKICAgICAgIEZ1bmN0aW9uRGVjbCAqRkQgPSBjYXN0PEZ1bmN0aW9uRGVjbD4oRCk7CiAgICAgICBSZWFkZXIuQ29udGV4dC5hZGp1c3REZWR1Y2VkRnVuY3Rpb25SZXN1bHRUeXBlKApAQCAtMjk5Miw2ICsyOTk4LDE0IEBACiAgICAgICBELT5Vc2VkID0gdHJ1ZTsKICAgICAgIGJyZWFrOwogICAgIH0KKworICAgIGNhc2UgVVBEX01BTkdMSU5HX05VTUJFUjoKKyAgICAgIFJlYWRlci5Db250ZXh0LnNldE1hbmdsaW5nTnVtYmVyKGNhc3Q8TmFtZWREZWNsPihEKSwgUmVjb3JkW0lkeCsrXSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVVBEX1NUQVRJQ19MT0NBTF9OVU1CRVI6CisgICAgICBSZWFkZXIuQ29udGV4dC5zZXRTdGF0aWNMb2NhbE51bWJlcihjYXN0PFZhckRlY2w+KEQpLCBSZWNvcmRbSWR4KytdKTsKKyAgICAgIGJyZWFrOwogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL1NlcmlhbGl6YXRpb24vQVNUUmVhZGVyU3RtdC5jcHAgYi9saWIvU2VyaWFsaXphdGlvbi9BU1RSZWFkZXJTdG10LmNwcAppbmRleCAxMTE1ZThmLi45YTIwMWQwIDEwMDY0NAotLS0gYS9saWIvU2VyaWFsaXphdGlvbi9BU1RSZWFkZXJTdG10LmNwcAorKysgYi9saWIvU2VyaWFsaXphdGlvbi9BU1RSZWFkZXJTdG10LmNwcApAQCAtMzk5LDEzICszOTksMTEgQEAKICAgUy0+Z2V0Q2FwdHVyZWREZWNsKCktPnNldEJvZHkoUy0+Z2V0Q2FwdHVyZWRTdG10KCkpOwogCiAgIC8vIENhcHR1cmVzCi0gIGZvciAoQ2FwdHVyZWRTdG10OjpjYXB0dXJlX2l0ZXJhdG9yIEkgPSBTLT5jYXB0dXJlX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBTLT5jYXB0dXJlX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgSS0+VmFyQW5kS2luZC5zZXRQb2ludGVyKFJlYWREZWNsQXM8VmFyRGVjbD4oUmVjb3JkLCBJZHgpKTsKLSAgICBJLT5WYXJBbmRLaW5kCisgIGZvciAoYXV0byAmSSA6IFMtPmNhcHR1cmVzKCkpIHsKKyAgICBJLlZhckFuZEtpbmQuc2V0UG9pbnRlcihSZWFkRGVjbEFzPFZhckRlY2w+KFJlY29yZCwgSWR4KSk7CisgICAgSS5WYXJBbmRLaW5kCiAgICAgICAgIC5zZXRJbnQoc3RhdGljX2Nhc3Q8Q2FwdHVyZWRTdG10OjpWYXJpYWJsZUNhcHR1cmVLaW5kPihSZWNvcmRbSWR4KytdKSk7Ci0gICAgSS0+TG9jID0gUmVhZFNvdXJjZUxvY2F0aW9uKFJlY29yZCwgSWR4KTsKKyAgICBJLkxvYyA9IFJlYWRTb3VyY2VMb2NhdGlvbihSZWNvcmQsIElkeCk7CiAgIH0KIH0KIApAQCAtMTQ4NCwzMyArMTQ4MiwxNSBAQAogICBFLT5OYW1pbmdDbGFzcyA9IFJlYWREZWNsQXM8Q1hYUmVjb3JkRGVjbD4oUmVjb3JkLCBJZHgpOwogfQogCi12b2lkIEFTVFN0bXRSZWFkZXI6OlZpc2l0VW5hcnlUeXBlVHJhaXRFeHByKFVuYXJ5VHlwZVRyYWl0RXhwciAqRSkgewotICBWaXNpdEV4cHIoRSk7Ci0gIEUtPlVUVCA9IChVbmFyeVR5cGVUcmFpdClSZWNvcmRbSWR4KytdOwotICBFLT5WYWx1ZSA9IChib29sKVJlY29yZFtJZHgrK107Ci0gIFNvdXJjZVJhbmdlIFJhbmdlID0gUmVhZFNvdXJjZVJhbmdlKFJlY29yZCwgSWR4KTsKLSAgRS0+TG9jID0gUmFuZ2UuZ2V0QmVnaW4oKTsKLSAgRS0+UlBhcmVuID0gUmFuZ2UuZ2V0RW5kKCk7Ci0gIEUtPlF1ZXJpZWRUeXBlID0gR2V0VHlwZVNvdXJjZUluZm8oUmVjb3JkLCBJZHgpOwotfQotCi12b2lkIEFTVFN0bXRSZWFkZXI6OlZpc2l0QmluYXJ5VHlwZVRyYWl0RXhwcihCaW5hcnlUeXBlVHJhaXRFeHByICpFKSB7Ci0gIFZpc2l0RXhwcihFKTsKLSAgRS0+QlRUID0gKEJpbmFyeVR5cGVUcmFpdClSZWNvcmRbSWR4KytdOwotICBFLT5WYWx1ZSA9IChib29sKVJlY29yZFtJZHgrK107Ci0gIFNvdXJjZVJhbmdlIFJhbmdlID0gUmVhZFNvdXJjZVJhbmdlKFJlY29yZCwgSWR4KTsKLSAgRS0+TG9jID0gUmFuZ2UuZ2V0QmVnaW4oKTsKLSAgRS0+UlBhcmVuID0gUmFuZ2UuZ2V0RW5kKCk7Ci0gIEUtPkxoc1R5cGUgPSBHZXRUeXBlU291cmNlSW5mbyhSZWNvcmQsIElkeCk7Ci0gIEUtPlJoc1R5cGUgPSBHZXRUeXBlU291cmNlSW5mbyhSZWNvcmQsIElkeCk7Ci19Ci0KIHZvaWQgQVNUU3RtdFJlYWRlcjo6VmlzaXRUeXBlVHJhaXRFeHByKFR5cGVUcmFpdEV4cHIgKkUpIHsKICAgVmlzaXRFeHByKEUpOwogICBFLT5UeXBlVHJhaXRFeHByQml0cy5OdW1BcmdzID0gUmVjb3JkW0lkeCsrXTsKICAgRS0+VHlwZVRyYWl0RXhwckJpdHMuS2luZCA9IFJlY29yZFtJZHgrK107CiAgIEUtPlR5cGVUcmFpdEV4cHJCaXRzLlZhbHVlID0gUmVjb3JkW0lkeCsrXTsKLSAgCisgIFNvdXJjZVJhbmdlIFJhbmdlID0gUmVhZFNvdXJjZVJhbmdlKFJlY29yZCwgSWR4KTsKKyAgRS0+TG9jID0gUmFuZ2UuZ2V0QmVnaW4oKTsKKyAgRS0+UlBhcmVuTG9jID0gUmFuZ2UuZ2V0RW5kKCk7CisKICAgVHlwZVNvdXJjZUluZm8gKipBcmdzID0gRS0+Z2V0VHlwZVNvdXJjZUluZm9zKCk7CiAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBFLT5nZXROdW1BcmdzKCk7IEkgIT0gTjsgKytJKQogICAgIEFyZ3NbSV0gPSBHZXRUeXBlU291cmNlSW5mbyhSZWNvcmQsIElkeCk7CkBAIC0xNjkxLDYgKzE2NzEsMTUgQEAKIE9NUENsYXVzZSAqT01QQ2xhdXNlUmVhZGVyOjpyZWFkQ2xhdXNlKCkgewogICBPTVBDbGF1c2UgKkM7CiAgIHN3aXRjaCAoUmVjb3JkW0lkeCsrXSkgeworICBjYXNlIE9NUENfaWY6CisgICAgQyA9IG5ldyAoQ29udGV4dCkgT01QSWZDbGF1c2UoKTsKKyAgICBicmVhazsKKyAgY2FzZSBPTVBDX251bV90aHJlYWRzOgorICAgIEMgPSBuZXcgKENvbnRleHQpIE9NUE51bVRocmVhZHNDbGF1c2UoKTsKKyAgICBicmVhazsKKyAgY2FzZSBPTVBDX3NhZmVsZW46CisgICAgQyA9IG5ldyAoQ29udGV4dCkgT01QU2FmZWxlbkNsYXVzZSgpOworICAgIGJyZWFrOwogICBjYXNlIE9NUENfZGVmYXVsdDoKICAgICBDID0gbmV3IChDb250ZXh0KSBPTVBEZWZhdWx0Q2xhdXNlKCk7CiAgICAgYnJlYWs7CkBAIC0xNzAzLDYgKzE2OTIsOSBAQAogICBjYXNlIE9NUENfc2hhcmVkOgogICAgIEMgPSBPTVBTaGFyZWRDbGF1c2U6OkNyZWF0ZUVtcHR5KENvbnRleHQsIFJlY29yZFtJZHgrK10pOwogICAgIGJyZWFrOworICBjYXNlIE9NUENfY29weWluOgorICAgIEMgPSBPTVBDb3B5aW5DbGF1c2U6OkNyZWF0ZUVtcHR5KENvbnRleHQsIFJlY29yZFtJZHgrK10pOworICAgIGJyZWFrOwogICB9CiAgIFZpc2l0KEMpOwogICBDLT5zZXRMb2NTdGFydChSZWFkZXItPlJlYWRTb3VyY2VMb2NhdGlvbihSZWNvcmQsIElkeCkpOwpAQCAtMTcxMSw2ICsxNzAzLDIxIEBACiAgIHJldHVybiBDOwogfQogCit2b2lkIE9NUENsYXVzZVJlYWRlcjo6VmlzaXRPTVBJZkNsYXVzZShPTVBJZkNsYXVzZSAqQykgeworICBDLT5zZXRDb25kaXRpb24oUmVhZGVyLT5SZWFkZXIuUmVhZFN1YkV4cHIoKSk7CisgIEMtPnNldExQYXJlbkxvYyhSZWFkZXItPlJlYWRTb3VyY2VMb2NhdGlvbihSZWNvcmQsIElkeCkpOworfQorCit2b2lkIE9NUENsYXVzZVJlYWRlcjo6VmlzaXRPTVBOdW1UaHJlYWRzQ2xhdXNlKE9NUE51bVRocmVhZHNDbGF1c2UgKkMpIHsKKyAgQy0+c2V0TnVtVGhyZWFkcyhSZWFkZXItPlJlYWRlci5SZWFkU3ViRXhwcigpKTsKKyAgQy0+c2V0TFBhcmVuTG9jKFJlYWRlci0+UmVhZFNvdXJjZUxvY2F0aW9uKFJlY29yZCwgSWR4KSk7Cit9CisKK3ZvaWQgT01QQ2xhdXNlUmVhZGVyOjpWaXNpdE9NUFNhZmVsZW5DbGF1c2UoT01QU2FmZWxlbkNsYXVzZSAqQykgeworICBDLT5zZXRTYWZlbGVuKFJlYWRlci0+UmVhZGVyLlJlYWRTdWJFeHByKCkpOworICBDLT5zZXRMUGFyZW5Mb2MoUmVhZGVyLT5SZWFkU291cmNlTG9jYXRpb24oUmVjb3JkLCBJZHgpKTsKK30KKwogdm9pZCBPTVBDbGF1c2VSZWFkZXI6OlZpc2l0T01QRGVmYXVsdENsYXVzZShPTVBEZWZhdWx0Q2xhdXNlICpDKSB7CiAgIEMtPnNldERlZmF1bHRLaW5kKAogICAgICAgIHN0YXRpY19jYXN0PE9wZW5NUERlZmF1bHRDbGF1c2VLaW5kPihSZWNvcmRbSWR4KytdKSk7CkBAIC0xNzQ4LDEyICsxNzU1LDIwIEBACiAgIEMtPnNldFZhclJlZnMoVmFycyk7CiB9CiAKK3ZvaWQgT01QQ2xhdXNlUmVhZGVyOjpWaXNpdE9NUENvcHlpbkNsYXVzZShPTVBDb3B5aW5DbGF1c2UgKkMpIHsKKyAgQy0+c2V0TFBhcmVuTG9jKFJlYWRlci0+UmVhZFNvdXJjZUxvY2F0aW9uKFJlY29yZCwgSWR4KSk7CisgIHVuc2lnbmVkIE51bVZhcnMgPSBDLT52YXJsaXN0X3NpemUoKTsKKyAgU21hbGxWZWN0b3I8RXhwciAqLCAxNj4gVmFyczsKKyAgVmFycy5yZXNlcnZlKE51bVZhcnMpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bVZhcnM7ICsraSkKKyAgICBWYXJzLnB1c2hfYmFjayhSZWFkZXItPlJlYWRlci5SZWFkU3ViRXhwcigpKTsKKyAgQy0+c2V0VmFyUmVmcyhWYXJzKTsKK30KKwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIC8vIE9wZW5NUCBEaXJlY3RpdmVzLgogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIHZvaWQgQVNUU3RtdFJlYWRlcjo6VmlzaXRPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgKkUpIHsKLSAgVmlzaXRTdG10KEUpOwotICArK0lkeDsKICAgRS0+c2V0TG9jU3RhcnQoUmVhZFNvdXJjZUxvY2F0aW9uKFJlY29yZCwgSWR4KSk7CiAgIEUtPnNldExvY0VuZChSZWFkU291cmNlTG9jYXRpb24oUmVjb3JkLCBJZHgpKTsKICAgT01QQ2xhdXNlUmVhZGVyIENsYXVzZVJlYWRlcih0aGlzLCBSZWFkZXIuZ2V0Q29udGV4dCgpLCBSZWNvcmQsIElkeCk7CkBAIC0xNzY1LDYgKzE3ODAsMTYgQEAKIH0KIAogdm9pZCBBU1RTdG10UmVhZGVyOjpWaXNpdE9NUFBhcmFsbGVsRGlyZWN0aXZlKE9NUFBhcmFsbGVsRGlyZWN0aXZlICpEKSB7CisgIFZpc2l0U3RtdChEKTsKKyAgLy8gVGhlIE51bUNsYXVzZXMgZmllbGQgd2FzIHJlYWQgaW4gUmVhZFN0bXRGcm9tU3RyZWFtLgorICArK0lkeDsKKyAgVmlzaXRPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKEQpOworfQorCit2b2lkIEFTVFN0bXRSZWFkZXI6OlZpc2l0T01QU2ltZERpcmVjdGl2ZShPTVBTaW1kRGlyZWN0aXZlICpEKSB7CisgIFZpc2l0U3RtdChEKTsKKyAgLy8gVHdvIGZpZWxkcyAoTnVtQ2xhdXNlcyBhbmQgQ29sbGFwc2VkTnVtKSB3ZXJlIHJlYWQgaW4gUmVhZFN0bXRGcm9tU3RyZWFtLgorICBJZHggKz0gMjsKICAgVmlzaXRPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKEQpOwogfQogCkBAIC0yMjQwLDEzICsyMjY1LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjbGFyYXRpb25OYW1lSW5mbygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgYnJlYWs7CisKICAgICBjYXNlIFNUTVRfT01QX1BBUkFMTEVMX0RJUkVDVElWRToKICAgICAgIFMgPQogICAgICAgICBPTVBQYXJhbGxlbERpcmVjdGl2ZTo6Q3JlYXRlRW1wdHkoQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZFtBU1RTdG10UmVhZGVyOjpOdW1TdG10RmllbGRzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5KTsKICAgICAgIGJyZWFrOwotICAgICAgICAKKworICAgIGNhc2UgU1RNVF9PTVBfU0lNRF9ESVJFQ1RJVkU6IHsKKyAgICAgIHVuc2lnbmVkIE51bUNsYXVzZXMgPSBSZWNvcmRbQVNUU3RtdFJlYWRlcjo6TnVtU3RtdEZpZWxkc107CisgICAgICB1bnNpZ25lZCBDb2xsYXBzZWROdW0gPSBSZWNvcmRbQVNUU3RtdFJlYWRlcjo6TnVtU3RtdEZpZWxkcyArIDFdOworICAgICAgUyA9IE9NUFNpbWREaXJlY3RpdmU6OkNyZWF0ZUVtcHR5KENvbnRleHQsIE51bUNsYXVzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGFwc2VkTnVtLCBFbXB0eSk7CisgICAgICBicmVhazsKKyAgICB9CisKICAgICBjYXNlIEVYUFJfQ1hYX09QRVJBVE9SX0NBTEw6CiAgICAgICBTID0gbmV3IChDb250ZXh0KSBDWFhPcGVyYXRvckNhbGxFeHByKENvbnRleHQsIEVtcHR5KTsKICAgICAgIGJyZWFrOwpAQCAtMjI1NCwxMSArMjI4OCwxMSBAQAogICAgIGNhc2UgRVhQUl9DWFhfTUVNQkVSX0NBTEw6CiAgICAgICBTID0gbmV3IChDb250ZXh0KSBDWFhNZW1iZXJDYWxsRXhwcihDb250ZXh0LCBFbXB0eSk7CiAgICAgICBicmVhazsKLSAgICAgICAgCisKICAgICBjYXNlIEVYUFJfQ1hYX0NPTlNUUlVDVDoKICAgICAgIFMgPSBuZXcgKENvbnRleHQpIENYWENvbnN0cnVjdEV4cHIoRW1wdHkpOwogICAgICAgYnJlYWs7Ci0gICAgICAKKwogICAgIGNhc2UgRVhQUl9DWFhfVEVNUE9SQVJZX09CSkVDVDoKICAgICAgIFMgPSBuZXcgKENvbnRleHQpIENYWFRlbXBvcmFyeU9iamVjdEV4cHIoRW1wdHkpOwogICAgICAgYnJlYWs7CkBAIC0yMzkzLDE0ICsyNDI3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBSZWNvcmRbQVNUU3RtdFJlYWRlcjo6TnVtRXhwckZpZWxkcyArIDFdIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDApOwogICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEVYUFJfQ1hYX1VOQVJZX1RZUEVfVFJBSVQ6Ci0gICAgICBTID0gbmV3IChDb250ZXh0KSBVbmFyeVR5cGVUcmFpdEV4cHIoRW1wdHkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVYUFJfQklOQVJZX1RZUEVfVFJBSVQ6Ci0gICAgICBTID0gbmV3IChDb250ZXh0KSBCaW5hcnlUeXBlVHJhaXRFeHByKEVtcHR5KTsKLSAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFWFBSX1RZUEVfVFJBSVQ6CiAgICAgICBTID0gVHlwZVRyYWl0RXhwcjo6Q3JlYXRlRGVzZXJpYWxpemVkKENvbnRleHQsIApAQCAtMjQ5MSw3ICsyNTE3LDcgQEAKICAgICBTdG10U3RhY2sucHVzaF9iYWNrKFMpOwogICB9CiBEb25lOgotICBhc3NlcnQoU3RtdFN0YWNrLnNpemUoKSA+IFByZXZOdW1TdG10cyAmJiAiUmVhZCB0b28gbWFueSBzdWIgc3RtdHMhIik7CisgIGFzc2VydChTdG10U3RhY2suc2l6ZSgpID4gUHJldk51bVN0bXRzICYmICJSZWFkIHRvbyBtYW55IHN1Yi1zdG10cyEiKTsKICAgYXNzZXJ0KFN0bXRTdGFjay5zaXplKCkgPT0gUHJldk51bVN0bXRzICsgMSAmJiAiRXh0cmEgZXhwcmVzc2lvbnMgb24gc3RhY2shIik7CiAgIHJldHVybiBTdG10U3RhY2sucG9wX2JhY2tfdmFsKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvU2VyaWFsaXphdGlvbi9BU1RXcml0ZXIuY3BwIGIvbGliL1NlcmlhbGl6YXRpb24vQVNUV3JpdGVyLmNwcAppbmRleCA0MDU0ODhjLi5lNGI1Y2RiIDEwMDY0NAotLS0gYS9saWIvU2VyaWFsaXphdGlvbi9BU1RXcml0ZXIuY3BwCisrKyBiL2xpYi9TZXJpYWxpemF0aW9uL0FTVFdyaXRlci5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQ29udGV4dEludGVybmFscy5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsRnJpZW5kLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xMb29rdXBzLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJDWFguaCIKQEAgLTQ1LDYgKzQ2LDcgQEAKICNpbmNsdWRlICJsbHZtL0FEVC9IYXNoaW5nLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCiAjaW5jbHVkZSAibGx2bS9CaXRjb2RlL0JpdHN0cmVhbVdyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW5TdHJlYW0uaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgpAQCAtMTEzLDYgKzExNSwxMiBAQAogICBDb2RlID0gVFlQRV9ERUNBWUVEOwogfQogCit2b2lkIEFTVFR5cGVXcml0ZXI6OlZpc2l0QWRqdXN0ZWRUeXBlKGNvbnN0IEFkanVzdGVkVHlwZSAqVCkgeworICBXcml0ZXIuQWRkVHlwZVJlZihULT5nZXRPcmlnaW5hbFR5cGUoKSwgUmVjb3JkKTsKKyAgV3JpdGVyLkFkZFR5cGVSZWYoVC0+Z2V0QWRqdXN0ZWRUeXBlKCksIFJlY29yZCk7CisgIENvZGUgPSBUWVBFX0FESlVTVEVEOworfQorCiB2b2lkIEFTVFR5cGVXcml0ZXI6OlZpc2l0QmxvY2tQb2ludGVyVHlwZShjb25zdCBCbG9ja1BvaW50ZXJUeXBlICpUKSB7CiAgIFdyaXRlci5BZGRUeXBlUmVmKFQtPmdldFBvaW50ZWVUeXBlKCksIFJlY29yZCk7CiAgIENvZGUgPSBUWVBFX0JMT0NLX1BPSU5URVI7CkBAIC0xNzMsNyArMTgxLDcgQEAKIH0KIAogdm9pZCBBU1RUeXBlV3JpdGVyOjpWaXNpdEZ1bmN0aW9uVHlwZShjb25zdCBGdW5jdGlvblR5cGUgKlQpIHsKLSAgV3JpdGVyLkFkZFR5cGVSZWYoVC0+Z2V0UmVzdWx0VHlwZSgpLCBSZWNvcmQpOworICBXcml0ZXIuQWRkVHlwZVJlZihULT5nZXRSZXR1cm5UeXBlKCksIFJlY29yZCk7CiAgIEZ1bmN0aW9uVHlwZTo6RXh0SW5mbyBDID0gVC0+Z2V0RXh0SW5mbygpOwogICBSZWNvcmQucHVzaF9iYWNrKEMuZ2V0Tm9SZXR1cm4oKSk7CiAgIFJlY29yZC5wdXNoX2JhY2soQy5nZXRIYXNSZWdQYXJtKCkpOwpAQCAtMTg4LDE1ICsxOTYsOCBAQAogICBDb2RlID0gVFlQRV9GVU5DVElPTl9OT19QUk9UTzsKIH0KIAotdm9pZCBBU1RUeXBlV3JpdGVyOjpWaXNpdEZ1bmN0aW9uUHJvdG9UeXBlKGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpUKSB7Ci0gIFZpc2l0RnVuY3Rpb25UeXBlKFQpOwotICBSZWNvcmQucHVzaF9iYWNrKFQtPmdldE51bUFyZ3MoKSk7Ci0gIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBULT5nZXROdW1BcmdzKCk7IEkgIT0gTjsgKytJKQotICAgIFdyaXRlci5BZGRUeXBlUmVmKFQtPmdldEFyZ1R5cGUoSSksIFJlY29yZCk7Ci0gIFJlY29yZC5wdXNoX2JhY2soVC0+aXNWYXJpYWRpYygpKTsKLSAgUmVjb3JkLnB1c2hfYmFjayhULT5oYXNUcmFpbGluZ1JldHVybigpKTsKLSAgUmVjb3JkLnB1c2hfYmFjayhULT5nZXRUeXBlUXVhbHMoKSk7Ci0gIFJlY29yZC5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFQtPmdldFJlZlF1YWxpZmllcigpKSk7CitzdGF0aWMgdm9pZCBhZGRFeGNlcHRpb25TcGVjKEFTVFdyaXRlciAmV3JpdGVyLCBjb25zdCBGdW5jdGlvblByb3RvVHlwZSAqVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUV3JpdGVyOjpSZWNvcmREYXRhSW1wbCAmUmVjb3JkKSB7CiAgIFJlY29yZC5wdXNoX2JhY2soVC0+Z2V0RXhjZXB0aW9uU3BlY1R5cGUoKSk7CiAgIGlmIChULT5nZXRFeGNlcHRpb25TcGVjVHlwZSgpID09IEVTVF9EeW5hbWljKSB7CiAgICAgUmVjb3JkLnB1c2hfYmFjayhULT5nZXROdW1FeGNlcHRpb25zKCkpOwpAQCAtMjEwLDYgKzIxMSwxOCBAQAogICB9IGVsc2UgaWYgKFQtPmdldEV4Y2VwdGlvblNwZWNUeXBlKCkgPT0gRVNUX1VuZXZhbHVhdGVkKSB7CiAgICAgV3JpdGVyLkFkZERlY2xSZWYoVC0+Z2V0RXhjZXB0aW9uU3BlY0RlY2woKSwgUmVjb3JkKTsKICAgfQorfQorCit2b2lkIEFTVFR5cGVXcml0ZXI6OlZpc2l0RnVuY3Rpb25Qcm90b1R5cGUoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlQpIHsKKyAgVmlzaXRGdW5jdGlvblR5cGUoVCk7CisgIFJlY29yZC5wdXNoX2JhY2soVC0+Z2V0TnVtUGFyYW1zKCkpOworICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gVC0+Z2V0TnVtUGFyYW1zKCk7IEkgIT0gTjsgKytJKQorICAgIFdyaXRlci5BZGRUeXBlUmVmKFQtPmdldFBhcmFtVHlwZShJKSwgUmVjb3JkKTsKKyAgUmVjb3JkLnB1c2hfYmFjayhULT5pc1ZhcmlhZGljKCkpOworICBSZWNvcmQucHVzaF9iYWNrKFQtPmhhc1RyYWlsaW5nUmV0dXJuKCkpOworICBSZWNvcmQucHVzaF9iYWNrKFQtPmdldFR5cGVRdWFscygpKTsKKyAgUmVjb3JkLnB1c2hfYmFjayhzdGF0aWNfY2FzdDx1bnNpZ25lZD4oVC0+Z2V0UmVmUXVhbGlmaWVyKCkpKTsKKyAgYWRkRXhjZXB0aW9uU3BlYyhXcml0ZXIsIFQsIFJlY29yZCk7CiAgIENvZGUgPSBUWVBFX0ZVTkNUSU9OX1BST1RPOwogfQogCkBAIC0zOTUsOSArNDA4LDggQEAKIHZvaWQgQVNUVHlwZVdyaXRlcjo6VmlzaXRPYmpDT2JqZWN0VHlwZShjb25zdCBPYmpDT2JqZWN0VHlwZSAqVCkgewogICBXcml0ZXIuQWRkVHlwZVJlZihULT5nZXRCYXNlVHlwZSgpLCBSZWNvcmQpOwogICBSZWNvcmQucHVzaF9iYWNrKFQtPmdldE51bVByb3RvY29scygpKTsKLSAgZm9yIChPYmpDT2JqZWN0VHlwZTo6cXVhbF9pdGVyYXRvciBJID0gVC0+cXVhbF9iZWdpbigpLAotICAgICAgIEUgPSBULT5xdWFsX2VuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBXcml0ZXIuQWRkRGVjbFJlZigqSSwgUmVjb3JkKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogVC0+cXVhbHMoKSkKKyAgICBXcml0ZXIuQWRkRGVjbFJlZihJLCBSZWNvcmQpOwogICBDb2RlID0gVFlQRV9PQkpDX09CSkVDVDsKIH0KIApAQCAtNDU1LDYgKzQ2Nyw5IEBACiB2b2lkIFR5cGVMb2NXcml0ZXI6OlZpc2l0RGVjYXllZFR5cGVMb2MoRGVjYXllZFR5cGVMb2MgVEwpIHsKICAgLy8gbm90aGluZyB0byBkbwogfQordm9pZCBUeXBlTG9jV3JpdGVyOjpWaXNpdEFkanVzdGVkVHlwZUxvYyhBZGp1c3RlZFR5cGVMb2MgVEwpIHsKKyAgLy8gbm90aGluZyB0byBkbworfQogdm9pZCBUeXBlTG9jV3JpdGVyOjpWaXNpdEJsb2NrUG9pbnRlclR5cGVMb2MoQmxvY2tQb2ludGVyVHlwZUxvYyBUTCkgewogICBXcml0ZXIuQWRkU291cmNlTG9jYXRpb24oVEwuZ2V0Q2FyZXRMb2MoKSwgUmVjb3JkKTsKIH0KQEAgLTUwMyw4ICs1MTgsOCBAQAogICBXcml0ZXIuQWRkU291cmNlTG9jYXRpb24oVEwuZ2V0TFBhcmVuTG9jKCksIFJlY29yZCk7CiAgIFdyaXRlci5BZGRTb3VyY2VMb2NhdGlvbihUTC5nZXRSUGFyZW5Mb2MoKSwgUmVjb3JkKTsKICAgV3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKFRMLmdldExvY2FsUmFuZ2VFbmQoKSwgUmVjb3JkKTsKLSAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFRMLmdldE51bUFyZ3MoKTsgaSAhPSBlOyArK2kpCi0gICAgV3JpdGVyLkFkZERlY2xSZWYoVEwuZ2V0QXJnKGkpLCBSZWNvcmQpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVEwuZ2V0TnVtUGFyYW1zKCk7IGkgIT0gZTsgKytpKQorICAgIFdyaXRlci5BZGREZWNsUmVmKFRMLmdldFBhcmFtKGkpLCBSZWNvcmQpOwogfQogdm9pZCBUeXBlTG9jV3JpdGVyOjpWaXNpdEZ1bmN0aW9uUHJvdG9UeXBlTG9jKEZ1bmN0aW9uUHJvdG9UeXBlTG9jIFRMKSB7CiAgIFZpc2l0RnVuY3Rpb25UeXBlTG9jKFRMKTsKQEAgLTc2NCwxMCArNzc5LDggQEAKICAgUkVDT1JEKEVYUFJfQ1hYX1VOUkVTT0xWRURfQ09OU1RSVUNUKTsKICAgUkVDT1JEKEVYUFJfQ1hYX1VOUkVTT0xWRURfTUVNQkVSKTsKICAgUkVDT1JEKEVYUFJfQ1hYX1VOUkVTT0xWRURfTE9PS1VQKTsKLSAgUkVDT1JEKEVYUFJfQ1hYX1VOQVJZX1RZUEVfVFJBSVQpOwogICBSRUNPUkQoRVhQUl9DWFhfTk9FWENFUFQpOwogICBSRUNPUkQoRVhQUl9PUEFRVUVfVkFMVUUpOwotICBSRUNPUkQoRVhQUl9CSU5BUllfVFlQRV9UUkFJVCk7CiAgIFJFQ09SRChFWFBSX1BBQ0tfRVhQQU5TSU9OKTsKICAgUkVDT1JEKEVYUFJfU0laRU9GX1BBQ0spOwogICBSRUNPUkQoRVhQUl9TVUJTVF9OT05fVFlQRV9URU1QTEFURV9QQVJNX1BBQ0spOwpAQCAtODA2LDcgKzgxOSw3IEBACiAgIFJFQ09SRChERUNMX09GRlNFVCk7CiAgIFJFQ09SRChJREVOVElGSUVSX09GRlNFVCk7CiAgIFJFQ09SRChJREVOVElGSUVSX1RBQkxFKTsKLSAgUkVDT1JEKEVYVEVSTkFMX0RFRklOSVRJT05TKTsKKyAgUkVDT1JEKEVBR0VSTFlfREVTRVJJQUxJWkVEX0RFQ0xTKTsKICAgUkVDT1JEKFNQRUNJQUxfVFlQRVMpOwogICBSRUNPUkQoU1RBVElTVElDUyk7CiAgIFJFQ09SRChURU5UQVRJVkVfREVGSU5JVElPTlMpOwpAQCAtMTA0MCw3ICsxMDUzLDYgQEAKICAgLy8gSW1wb3J0cwogICBpZiAoQ2hhaW4pIHsKICAgICBzZXJpYWxpemF0aW9uOjpNb2R1bGVNYW5hZ2VyICZNZ3IgPSBDaGFpbi0+Z2V0TW9kdWxlTWFuYWdlcigpOwotICAgIFNtYWxsVmVjdG9yPGNoYXIsIDEyOD4gTW9kdWxlUGF0aHM7CiAgICAgUmVjb3JkLmNsZWFyKCk7CiAKICAgICBmb3IgKE1vZHVsZU1hbmFnZXI6Ok1vZHVsZUl0ZXJhdG9yIE0gPSBNZ3IuYmVnaW4oKSwgTUVuZCA9IE1nci5lbmQoKTsKQEAgLTEwOTcsNyArMTEwOSw2IEBACiAgIEFkZFN0cmluZyhUYXJnZXRPcHRzLlRyaXBsZSwgUmVjb3JkKTsKICAgQWRkU3RyaW5nKFRhcmdldE9wdHMuQ1BVLCBSZWNvcmQpOwogICBBZGRTdHJpbmcoVGFyZ2V0T3B0cy5BQkksIFJlY29yZCk7Ci0gIEFkZFN0cmluZyhUYXJnZXRPcHRzLkNYWEFCSSwgUmVjb3JkKTsKICAgQWRkU3RyaW5nKFRhcmdldE9wdHMuTGlua2VyVmVyc2lvbiwgUmVjb3JkKTsKICAgUmVjb3JkLnB1c2hfYmFjayhUYXJnZXRPcHRzLkZlYXR1cmVzQXNXcml0dGVuLnNpemUoKSk7CiAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBUYXJnZXRPcHRzLkZlYXR1cmVzQXNXcml0dGVuLnNpemUoKTsgSSAhPSBOOyArK0kpIHsKQEAgLTExNTYsNiArMTE2Nyw3IEBACiAKICAgQWRkU3RyaW5nKEhTT3B0cy5SZXNvdXJjZURpciwgUmVjb3JkKTsKICAgQWRkU3RyaW5nKEhTT3B0cy5Nb2R1bGVDYWNoZVBhdGgsIFJlY29yZCk7CisgIEFkZFN0cmluZyhIU09wdHMuTW9kdWxlVXNlckJ1aWxkUGF0aCwgUmVjb3JkKTsKICAgUmVjb3JkLnB1c2hfYmFjayhIU09wdHMuRGlzYWJsZU1vZHVsZUhhc2gpOwogICBSZWNvcmQucHVzaF9iYWNrKEhTT3B0cy5Vc2VCdWlsdGluSW5jbHVkZXMpOwogICBSZWNvcmQucHVzaF9iYWNrKEhTT3B0cy5Vc2VTdGFuZGFyZFN5c3RlbUluY2x1ZGVzKTsKQEAgLTEyOTQsMzMgKzEzMDYsNiBAQAogICAgICAgU29ydGVkRmlsZXMucHVzaF9mcm9udChFbnRyeSk7CiAgIH0KIAotICAvLyBJZiB3ZSBoYXZlIGFuIGlzeXNyb290IGZvciBhIERhcndpbiBTREssIGluY2x1ZGUgaXRzIFNES1NldHRpbmdzLnBsaXN0IGluCi0gIC8vIHRoZSBzZXQgb2YgKG5vbi1zeXN0ZW0pIGlucHV0IGZpbGVzLiBUaGlzIGlzIHNpbXBsZSBoZXVyaXN0aWMgZm9yCi0gIC8vIGRldGVjdGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gaGVhZGVycyBtYXkgaGF2ZSBjaGFuZ2VkLCBiZWNhdXNlIGl0IGlzIHRvbwotICAvLyBleHBlbnNpdmUgdG8gc3RhdCgpIGFsbCBvZiB0aGUgc3lzdGVtIGhlYWRlcnMuCi0gIEZpbGVNYW5hZ2VyICZGaWxlTWdyID0gU291cmNlTWdyLmdldEZpbGVNYW5hZ2VyKCk7Ci0gIGlmICghSFNPcHRzLlN5c3Jvb3QuZW1wdHkoKSAmJiAhQ2hhaW4pIHsKLSAgICBsbHZtOjpTbWFsbFN0cmluZzwxMjg+IFNES1NldHRpbmdzRmlsZU5hbWUoSFNPcHRzLlN5c3Jvb3QpOwotICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKFNES1NldHRpbmdzRmlsZU5hbWUsICJTREtTZXR0aW5ncy5wbGlzdCIpOwotICAgIGlmIChjb25zdCBGaWxlRW50cnkgKlNES1NldHRpbmdzRmlsZSA9IEZpbGVNZ3IuZ2V0RmlsZShTREtTZXR0aW5nc0ZpbGVOYW1lKSkgewotICAgICAgSW5wdXRGaWxlRW50cnkgRW50cnkgPSB7IFNES1NldHRpbmdzRmlsZSwgZmFsc2UsIGZhbHNlIH07Ci0gICAgICBTb3J0ZWRGaWxlcy5wdXNoX2Zyb250KEVudHJ5KTsKLSAgICB9Ci0gIH0KLQotICAvLyBBZGQgdGhlIGNvbXBpbGVyJ3Mgb3duIG1vZHVsZS5tYXAgaW4gdGhlIHNldCBvZiAobm9uLXN5c3RlbSkgaW5wdXQgZmlsZXMuCi0gIC8vIFRoaXMgaXMgYSBzaW1wbGUgaGV1cmlzdGljIGZvciBkZXRlY3Rpbmcgd2hldGhlciB0aGUgY29tcGlsZXIncyBoZWFkZXJzCi0gIC8vIGhhdmUgY2hhbmdlZCwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHN0YXQoKSBhbGwgb2YgdGhlbS4KLSAgaWYgKE1vZHVsZXMgJiYgIUNoYWluKSB7Ci0gICAgU21hbGxTdHJpbmc8MTI4PiBQID0gU3RyaW5nUmVmKEhTT3B0cy5SZXNvdXJjZURpcik7Ci0gICAgbGx2bTo6c3lzOjpwYXRoOjphcHBlbmQoUCwgImluY2x1ZGUiKTsKLSAgICBsbHZtOjpzeXM6OnBhdGg6OmFwcGVuZChQLCAibW9kdWxlLm1hcCIpOwotICAgIGlmIChjb25zdCBGaWxlRW50cnkgKk1vZHVsZU1hcEZpbGUgPSBGaWxlTWdyLmdldEZpbGUoUCkpIHsKLSAgICAgIElucHV0RmlsZUVudHJ5IEVudHJ5ID0geyBNb2R1bGVNYXBGaWxlLCBmYWxzZSwgZmFsc2UgfTsKLSAgICAgIFNvcnRlZEZpbGVzLnB1c2hfZnJvbnQoRW50cnkpOwotICAgIH0KLSAgfQotCiAgIHVuc2lnbmVkIFVzZXJGaWxlc051bSA9IDA7CiAgIC8vIFdyaXRlIG91dCBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLgogICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gSW5wdXRGaWxlT2Zmc2V0czsKQEAgLTEzNTcsNyArMTM0Miw3IEBACiAgICAgCiAgICAgLy8gQXNrIHRoZSBmaWxlIG1hbmFnZXIgdG8gZml4dXAgdGhlIHJlbGF0aXZlIHBhdGggZm9yIHVzLiBUaGlzIHdpbGwgCiAgICAgLy8gaG9ub3IgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgotICAgIEZpbGVNZ3IuRml4dXBSZWxhdGl2ZVBhdGgoRmlsZVBhdGgpOworICAgIFNvdXJjZU1nci5nZXRGaWxlTWFuYWdlcigpLkZpeHVwUmVsYXRpdmVQYXRoKEZpbGVQYXRoKTsKICAgICAKICAgICAvLyBGSVhNRTogVGhpcyBjYWxsIHRvIG1ha2VfYWJzb2x1dGUgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgdGhlCiAgICAgLy8gY2FsbCB0byBGaXh1cFJlbGF0aXZlUGF0aCBzaG91bGQgYWx3YXlzIHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoLgpAQCAtMTQ4MSwyNiArMTQ2NiwzMSBAQAogICAgIAogICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4KICAgICBFbWl0S2V5RGF0YUxlbmd0aChyYXdfb3N0cmVhbSYgT3V0LCBrZXlfdHlwZV9yZWYga2V5LCBkYXRhX3R5cGVfcmVmIERhdGEpIHsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgICAgZW5kaWFuOjpXcml0ZXI8bGl0dGxlPiBXcml0ZXIoT3V0KTsKICAgICAgIHVuc2lnbmVkIEtleUxlbiA9IHN0cmxlbihrZXkuRmlsZW5hbWUpICsgMSArIDggKyA4OwotICAgICAgY2xhbmc6OmlvOjpFbWl0MTYoT3V0LCBLZXlMZW4pOworICAgICAgV3JpdGVyLndyaXRlPHVpbnQxNl90PihLZXlMZW4pOwogICAgICAgdW5zaWduZWQgRGF0YUxlbiA9IDEgKyAyICsgNCArIDQ7CiAgICAgICBpZiAoRGF0YS5pc01vZHVsZUhlYWRlcikKICAgICAgICAgRGF0YUxlbiArPSA0OwotICAgICAgY2xhbmc6OmlvOjpFbWl0OChPdXQsIERhdGFMZW4pOworICAgICAgV3JpdGVyLndyaXRlPHVpbnQ4X3Q+KERhdGFMZW4pOwogICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEtleUxlbiwgRGF0YUxlbik7CiAgICAgfQogICAgIAogICAgIHZvaWQgRW1pdEtleShyYXdfb3N0cmVhbSYgT3V0LCBrZXlfdHlwZV9yZWYga2V5LCB1bnNpZ25lZCBLZXlMZW4pIHsKLSAgICAgIGNsYW5nOjppbzo6RW1pdDY0KE91dCwga2V5LkZFLT5nZXRTaXplKCkpOworICAgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+IExFKE91dCk7CisgICAgICBMRS53cml0ZTx1aW50NjRfdD4oa2V5LkZFLT5nZXRTaXplKCkpOwogICAgICAgS2V5TGVuIC09IDg7Ci0gICAgICBjbGFuZzo6aW86OkVtaXQ2NChPdXQsIGtleS5GRS0+Z2V0TW9kaWZpY2F0aW9uVGltZSgpKTsKKyAgICAgIExFLndyaXRlPHVpbnQ2NF90PihrZXkuRkUtPmdldE1vZGlmaWNhdGlvblRpbWUoKSk7CiAgICAgICBLZXlMZW4gLT0gODsKICAgICAgIE91dC53cml0ZShrZXkuRmlsZW5hbWUsIEtleUxlbik7CiAgICAgfQogICAgIAogICAgIHZvaWQgRW1pdERhdGEocmF3X29zdHJlYW0gJk91dCwga2V5X3R5cGVfcmVmIGtleSwKICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZV9yZWYgRGF0YSwgdW5zaWduZWQgRGF0YUxlbikgewotICAgICAgdXNpbmcgbmFtZXNwYWNlIGNsYW5nOjppbzsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgICAgZW5kaWFuOjpXcml0ZXI8bGl0dGxlPiBMRShPdXQpOwogICAgICAgdWludDY0X3QgU3RhcnQgPSBPdXQudGVsbCgpOyAodm9pZClTdGFydDsKICAgICAgIAogICAgICAgdW5zaWduZWQgY2hhciBGbGFncyA9IChEYXRhLkhlYWRlclJvbGUgPDwgNikKQEAgLTE1MDksMTMgKzE0OTksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoRGF0YS5EaXJJbmZvIDw8IDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKERhdGEuUmVzb2x2ZWQgPDwgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEYXRhLkluZGV4SGVhZGVyTWFwSGVhZGVyOwotICAgICAgRW1pdDgoT3V0LCAodWludDhfdClGbGFncyk7Ci0gICAgICBFbWl0MTYoT3V0LCAodWludDE2X3QpIERhdGEuTnVtSW5jbHVkZXMpOworICAgICAgTEUud3JpdGU8dWludDhfdD4oRmxhZ3MpOworICAgICAgTEUud3JpdGU8dWludDE2X3Q+KERhdGEuTnVtSW5jbHVkZXMpOwogICAgICAgCiAgICAgICBpZiAoIURhdGEuQ29udHJvbGxpbmdNYWNybykKLSAgICAgICAgRW1pdDMyKE91dCwgKHVpbnQzMl90KURhdGEuQ29udHJvbGxpbmdNYWNyb0lEKTsKKyAgICAgICAgTEUud3JpdGU8dWludDMyX3Q+KERhdGEuQ29udHJvbGxpbmdNYWNyb0lEKTsKICAgICAgIGVsc2UKLSAgICAgICAgRW1pdDMyKE91dCwgKHVpbnQzMl90KVdyaXRlci5nZXRJZGVudGlmaWVyUmVmKERhdGEuQ29udHJvbGxpbmdNYWNybykpOworICAgICAgICBMRS53cml0ZTx1aW50MzJfdD4oV3JpdGVyLmdldElkZW50aWZpZXJSZWYoRGF0YS5Db250cm9sbGluZ01hY3JvKSk7CiAgICAgICAKICAgICAgIHVuc2lnbmVkIE9mZnNldCA9IDA7CiAgICAgICBpZiAoIURhdGEuRnJhbWV3b3JrLmVtcHR5KCkpIHsKQEAgLTE1MzIsMTEgKzE1MjIsMTEgQEAKICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgT2Zmc2V0ID0gUG9zLT5zZWNvbmQ7CiAgICAgICB9Ci0gICAgICBFbWl0MzIoT3V0LCBPZmZzZXQpOworICAgICAgTEUud3JpdGU8dWludDMyX3Q+KE9mZnNldCk7CiAKICAgICAgIGlmIChEYXRhLmlzTW9kdWxlSGVhZGVyKSB7CiAgICAgICAgIE1vZHVsZSAqTW9kID0gSFMuZmluZE1vZHVsZUZvckhlYWRlcihrZXkuRkUpLmdldE1vZHVsZSgpOwotICAgICAgICBFbWl0MzIoT3V0LCBXcml0ZXIuZ2V0RXhpc3RpbmdTdWJtb2R1bGVJRChNb2QpKTsKKyAgICAgICAgTEUud3JpdGU8dWludDMyX3Q+KFdyaXRlci5nZXRFeGlzdGluZ1N1Ym1vZHVsZUlEKE1vZCkpOwogICAgICAgfQogCiAgICAgICBhc3NlcnQoT3V0LnRlbGwoKSAtIFN0YXJ0ID09IERhdGFMZW4gJiYgIldyb25nIGRhdGEgbGVuZ3RoIik7CkBAIC0xNTY4LDEwICsxNTU4LDEwIEBACiAKICAgICAvLyBVc2UgSGVhZGVyU2VhcmNoJ3MgZ2V0RmlsZUluZm8gdG8gbWFrZSBzdXJlIHdlIGdldCB0aGUgSGVhZGVyRmlsZUluZm8KICAgICAvLyBmcm9tIHRoZSBleHRlcm5hbCBzb3VyY2UgaWYgaXQgd2FzIG5vdCBwcm92aWRlZCBhbHJlYWR5LgotICAgIGNvbnN0IEhlYWRlckZpbGVJbmZvICZIRkkgPSBIUy5nZXRGaWxlSW5mbyhGaWxlKTsKLSAgICBpZiAoSEZJLkV4dGVybmFsICYmIENoYWluKQotICAgICAgY29udGludWU7Ci0gICAgaWYgKEhGSS5pc01vZHVsZUhlYWRlciAmJiAhSEZJLmlzQ29tcGlsaW5nTW9kdWxlSGVhZGVyKQorICAgIEhlYWRlckZpbGVJbmZvIEhGSTsKKyAgICBpZiAoIUhTLnRyeUdldEZpbGVJbmZvKEZpbGUsIEhGSSkgfHwKKyAgICAgICAgKEhGSS5FeHRlcm5hbCAmJiBDaGFpbikgfHwKKyAgICAgICAgKEhGSS5pc01vZHVsZUhlYWRlciAmJiAhSEZJLmlzQ29tcGlsaW5nTW9kdWxlSGVhZGVyKSkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgLy8gVHVybiB0aGUgZmlsZSBuYW1lIGludG8gYW4gYWJzb2x1dGUgcGF0aCwgaWYgaXQgaXNuJ3QgYWxyZWFkeS4KQEAgLTE1OTQsOSArMTU4NCwxMCBAQAogICBTbWFsbFN0cmluZzw0MDk2PiBUYWJsZURhdGE7CiAgIHVpbnQzMl90IEJ1Y2tldE9mZnNldDsKICAgeworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OwogICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gT3V0KFRhYmxlRGF0YSk7CiAgICAgLy8gTWFrZSBzdXJlIHRoYXQgbm8gYnVja2V0IGlzIGF0IG9mZnNldCAwCi0gICAgY2xhbmc6OmlvOjpFbWl0MzIoT3V0LCAwKTsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+KE91dCkud3JpdGU8dWludDMyX3Q+KDApOwogICAgIEJ1Y2tldE9mZnNldCA9IEdlbmVyYXRvci5FbWl0KE91dCwgR2VuZXJhdG9yVHJhaXQpOwogICB9CiAKQEAgLTE4NTEsMTIgKzE4NDIsMTQgQEAKICAgfQogCiAgIHN0YXRpYyB2b2lkIEVtaXRLZXkocmF3X29zdHJlYW0mIE91dCwga2V5X3R5cGVfcmVmIEtleSwgdW5zaWduZWQgS2V5TGVuKSB7Ci0gICAgY2xhbmc6OmlvOjpFbWl0MzIoT3V0LCBLZXkpOworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgIGVuZGlhbjo6V3JpdGVyPGxpdHRsZT4oT3V0KS53cml0ZTx1aW50MzJfdD4oS2V5KTsKICAgfQogCiAgIHN0YXRpYyB2b2lkIEVtaXREYXRhKHJhd19vc3RyZWFtJiBPdXQsIGtleV90eXBlX3JlZiBLZXksIGRhdGFfdHlwZV9yZWYgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQpIHsKLSAgICBjbGFuZzo6aW86OkVtaXQzMihPdXQsIERhdGEuTWFjcm9EaXJlY3RpdmVzT2Zmc2V0KTsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+KE91dCkud3JpdGU8dWludDMyX3Q+KERhdGEuTWFjcm9EaXJlY3RpdmVzT2Zmc2V0KTsKICAgfQogfTsKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKQEAgLTE5NDYsOCArMTkzOSw2IEBACiAKICAgICAvLyBFbWl0IHRoZSBtYWNybyBkaXJlY3RpdmVzIGluIHJldmVyc2Ugc291cmNlIG9yZGVyLgogICAgIGZvciAoOyBNRDsgTUQgPSBNRC0+Z2V0UHJldmlvdXMoKSkgewotICAgICAgaWYgKE1ELT5pc0hpZGRlbigpKQotICAgICAgICBjb250aW51ZTsKICAgICAgIGlmIChzaG91bGRJZ25vcmVNYWNybyhNRCwgSXNNb2R1bGUsIFBQKSkKICAgICAgICAgY29udGludWU7CiAKQEAgLTIwNTQsOSArMjA0NSwxMCBAQAogICBTbWFsbFN0cmluZzw0MDk2PiBNYWNyb1RhYmxlOwogICB1aW50MzJfdCBCdWNrZXRPZmZzZXQ7CiAgIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIE91dChNYWNyb1RhYmxlKTsKICAgICAvLyBNYWtlIHN1cmUgdGhhdCBubyBidWNrZXQgaXMgYXQgb2Zmc2V0IDAKLSAgICBjbGFuZzo6aW86OkVtaXQzMihPdXQsIDApOworICAgIGVuZGlhbjo6V3JpdGVyPGxpdHRsZT4oT3V0KS53cml0ZTx1aW50MzJfdD4oMCk7CiAgICAgQnVja2V0T2Zmc2V0ID0gR2VuZXJhdG9yLkVtaXQoT3V0KTsKICAgfQogCkBAIC0yMjI3LDkgKzIyMTksNyBAQAogICAvLyBvdGhlciBjb25zdW1lcnMgb2YgdGhpcyBpbmZvcm1hdGlvbi4KICAgU291cmNlTWFuYWdlciAmU3JjTWdyID0gUFAtPmdldFNvdXJjZU1hbmFnZXIoKTsKICAgTW9kdWxlTWFwICZNb2RNYXAgPSBQUC0+Z2V0SGVhZGVyU2VhcmNoSW5mbygpLmdldE1vZHVsZU1hcCgpOwotICBmb3IgKEFTVENvbnRleHQ6OmltcG9ydF9pdGVyYXRvciBJID0gQ29udGV4dC0+bG9jYWxfaW1wb3J0X2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbmQgPSBDb250ZXh0LT5sb2NhbF9pbXBvcnRfZW5kKCk7Ci0gICAgICAgSSAhPSBJRW5kOyArK0kpIHsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogQ29udGV4dC0+bG9jYWxfaW1wb3J0cygpKSB7CiAgICAgaWYgKE1vZHVsZSAqSW1wb3J0ZWRGcm9tCiAgICAgICAgICAgPSBNb2RNYXAuaW5mZXJNb2R1bGVGcm9tTG9jYXRpb24oRnVsbFNvdXJjZUxvYyhJLT5nZXRMb2NhdGlvbigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY01ncikpKSB7CkBAIC0yMjQ4LDcgKzIyMzgsOCBAQAogICBBYmJyZXYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpWQlIsIDYpKTsgLy8gUGFyZW50CiAgIEFiYnJldi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLCAxKSk7IC8vIElzRnJhbWV3b3JrCiAgIEFiYnJldi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLCAxKSk7IC8vIElzRXhwbGljaXQKLSAgQWJicmV2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIDEpKTsgLy8gSXNTeXN0ZW0gIAorICBBYmJyZXYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpGaXhlZCwgMSkpOyAvLyBJc1N5c3RlbQorICBBYmJyZXYtPkFkZChCaXRDb2RlQWJicmV2T3AoQml0Q29kZUFiYnJldk9wOjpGaXhlZCwgMSkpOyAvLyBJc0V4dGVybkMKICAgQWJicmV2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIDEpKTsgLy8gSW5mZXJTdWJtb2R1bGVzLi4uCiAgIEFiYnJldi0+QWRkKEJpdENvZGVBYmJyZXZPcChCaXRDb2RlQWJicmV2T3A6OkZpeGVkLCAxKSk7IC8vIEluZmVyRXhwbGljaXQuLi4KICAgQWJicmV2LT5BZGQoQml0Q29kZUFiYnJldk9wKEJpdENvZGVBYmJyZXZPcDo6Rml4ZWQsIDEpKTsgLy8gSW5mZXJFeHBvcnRXaWxkLi4uCkBAIC0yMzM2LDYgKzIzMjcsNyBAQAogICAgIFJlY29yZC5wdXNoX2JhY2soTW9kLT5Jc0ZyYW1ld29yayk7CiAgICAgUmVjb3JkLnB1c2hfYmFjayhNb2QtPklzRXhwbGljaXQpOwogICAgIFJlY29yZC5wdXNoX2JhY2soTW9kLT5Jc1N5c3RlbSk7CisgICAgUmVjb3JkLnB1c2hfYmFjayhNb2QtPklzRXh0ZXJuQyk7CiAgICAgUmVjb3JkLnB1c2hfYmFjayhNb2QtPkluZmVyU3VibW9kdWxlcyk7CiAgICAgUmVjb3JkLnB1c2hfYmFjayhNb2QtPkluZmVyRXhwbGljaXRTdWJtb2R1bGVzKTsKICAgICBSZWNvcmQucHVzaF9iYWNrKE1vZC0+SW5mZXJFeHBvcnRXaWxkY2FyZCk7CkBAIC0yNjE4LDkgKzI2MTAsOCBAQAogICBSZWNvcmREYXRhIFJlY29yZDsKICAgUmVjb3JkLnB1c2hfYmFjayhERUNMX0NPTlRFWFRfTEVYSUNBTCk7CiAgIFNtYWxsVmVjdG9yPEtpbmREZWNsSURQYWlyLCA2ND4gRGVjbHM7Ci0gIGZvciAoRGVjbENvbnRleHQ6OmRlY2xfaXRlcmF0b3IgRCA9IERDLT5kZWNsc19iZWdpbigpLCBERW5kID0gREMtPmRlY2xzX2VuZCgpOwotICAgICAgICAgRCAhPSBERW5kOyArK0QpCi0gICAgRGVjbHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKCgqRCktPmdldEtpbmQoKSwgR2V0RGVjbFJlZigqRCkpKTsKKyAgZm9yIChjb25zdCBhdXRvICpEIDogREMtPmRlY2xzKCkpCisgICAgRGVjbHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEQtPmdldEtpbmQoKSwgR2V0RGVjbFJlZihEKSkpOwogCiAgICsrTnVtTGV4aWNhbERlY2xDb250ZXh0czsKICAgU3RyZWFtLkVtaXRSZWNvcmRXaXRoQmxvYihEZWNsQ29udGV4dExleGljYWxBYmJyZXYsIFJlY29yZCwgZGF0YShEZWNscykpOwpAQCAtMjcyOCw4ICsyNzE5LDEwIEBACiAgIHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4KICAgICBFbWl0S2V5RGF0YUxlbmd0aChyYXdfb3N0cmVhbSYgT3V0LCBTZWxlY3RvciBTZWwsCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YV90eXBlX3JlZiBNZXRob2RzKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgZW5kaWFuOjpXcml0ZXI8bGl0dGxlPiBMRShPdXQpOwogICAgIHVuc2lnbmVkIEtleUxlbiA9IDIgKyAoU2VsLmdldE51bUFyZ3MoKT8gU2VsLmdldE51bUFyZ3MoKSAqIDQgOiA0KTsKLSAgICBjbGFuZzo6aW86OkVtaXQxNihPdXQsIEtleUxlbik7CisgICAgTEUud3JpdGU8dWludDE2X3Q+KEtleUxlbik7CiAgICAgdW5zaWduZWQgRGF0YUxlbiA9IDQgKyAyICsgMjsgLy8gMiBieXRlcyBmb3IgZWFjaCBvZiB0aGUgbWV0aG9kIGNvdW50cwogICAgIGZvciAoY29uc3QgT2JqQ01ldGhvZExpc3QgKk1ldGhvZCA9ICZNZXRob2RzLkluc3RhbmNlOyBNZXRob2Q7CiAgICAgICAgICBNZXRob2QgPSBNZXRob2QtPmdldE5leHQoKSkKQEAgLTI3MzksMjcgKzI3MzIsMzEgQEAKICAgICAgICAgIE1ldGhvZCA9IE1ldGhvZC0+Z2V0TmV4dCgpKQogICAgICAgaWYgKE1ldGhvZC0+TWV0aG9kKQogICAgICAgICBEYXRhTGVuICs9IDQ7Ci0gICAgY2xhbmc6OmlvOjpFbWl0MTYoT3V0LCBEYXRhTGVuKTsKKyAgICBMRS53cml0ZTx1aW50MTZfdD4oRGF0YUxlbik7CiAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEtleUxlbiwgRGF0YUxlbik7CiAgIH0KIAogICB2b2lkIEVtaXRLZXkocmF3X29zdHJlYW0mIE91dCwgU2VsZWN0b3IgU2VsLCB1bnNpZ25lZCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgIGVuZGlhbjo6V3JpdGVyPGxpdHRsZT4gTEUoT3V0KTsKICAgICB1aW50NjRfdCBTdGFydCA9IE91dC50ZWxsKCk7CiAgICAgYXNzZXJ0KChTdGFydCA+PiAzMikgPT0gMCAmJiAiU2VsZWN0b3Iga2V5IG9mZnNldCB0b28gbGFyZ2UiKTsKICAgICBXcml0ZXIuU2V0U2VsZWN0b3JPZmZzZXQoU2VsLCBTdGFydCk7CiAgICAgdW5zaWduZWQgTiA9IFNlbC5nZXROdW1BcmdzKCk7Ci0gICAgY2xhbmc6OmlvOjpFbWl0MTYoT3V0LCBOKTsKKyAgICBMRS53cml0ZTx1aW50MTZfdD4oTik7CiAgICAgaWYgKE4gPT0gMCkKICAgICAgIE4gPSAxOwogICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gTjsgKytJKQotICAgICAgY2xhbmc6OmlvOjpFbWl0MzIoT3V0LAotICAgICAgICAgICAgICAgICAgICBXcml0ZXIuZ2V0SWRlbnRpZmllclJlZihTZWwuZ2V0SWRlbnRpZmllckluZm9Gb3JTbG90KEkpKSk7CisgICAgICBMRS53cml0ZTx1aW50MzJfdD4oCisgICAgICAgICAgV3JpdGVyLmdldElkZW50aWZpZXJSZWYoU2VsLmdldElkZW50aWZpZXJJbmZvRm9yU2xvdChJKSkpOwogICB9CiAKICAgdm9pZCBFbWl0RGF0YShyYXdfb3N0cmVhbSYgT3V0LCBrZXlfdHlwZV9yZWYsCiAgICAgICAgICAgICAgICAgZGF0YV90eXBlX3JlZiBNZXRob2RzLCB1bnNpZ25lZCBEYXRhTGVuKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgZW5kaWFuOjpXcml0ZXI8bGl0dGxlPiBMRShPdXQpOwogICAgIHVpbnQ2NF90IFN0YXJ0ID0gT3V0LnRlbGwoKTsgKHZvaWQpU3RhcnQ7Ci0gICAgY2xhbmc6OmlvOjpFbWl0MzIoT3V0LCBNZXRob2RzLklEKTsKKyAgICBMRS53cml0ZTx1aW50MzJfdD4oTWV0aG9kcy5JRCk7CiAgICAgdW5zaWduZWQgTnVtSW5zdGFuY2VNZXRob2RzID0gMDsKICAgICBmb3IgKGNvbnN0IE9iakNNZXRob2RMaXN0ICpNZXRob2QgPSAmTWV0aG9kcy5JbnN0YW5jZTsgTWV0aG9kOwogICAgICAgICAgTWV0aG9kID0gTWV0aG9kLT5nZXROZXh0KCkpCkBAIC0yNzc5LDE2ICsyNzc2LDE2IEBACiAgICAgdW5zaWduZWQgRmFjdG9yeUJpdHMgPSBNZXRob2RzLkZhY3RvcnkuZ2V0Qml0cygpOwogICAgIGFzc2VydChGYWN0b3J5Qml0cyA8IDQpOwogICAgIHVuc2lnbmVkIE51bUZhY3RvcnlNZXRob2RzQW5kQml0cyA9IChOdW1GYWN0b3J5TWV0aG9kcyA8PCAyKSB8IEZhY3RvcnlCaXRzOwotICAgIGNsYW5nOjppbzo6RW1pdDE2KE91dCwgTnVtSW5zdGFuY2VNZXRob2RzQW5kQml0cyk7Ci0gICAgY2xhbmc6OmlvOjpFbWl0MTYoT3V0LCBOdW1GYWN0b3J5TWV0aG9kc0FuZEJpdHMpOworICAgIExFLndyaXRlPHVpbnQxNl90PihOdW1JbnN0YW5jZU1ldGhvZHNBbmRCaXRzKTsKKyAgICBMRS53cml0ZTx1aW50MTZfdD4oTnVtRmFjdG9yeU1ldGhvZHNBbmRCaXRzKTsKICAgICBmb3IgKGNvbnN0IE9iakNNZXRob2RMaXN0ICpNZXRob2QgPSAmTWV0aG9kcy5JbnN0YW5jZTsgTWV0aG9kOwogICAgICAgICAgTWV0aG9kID0gTWV0aG9kLT5nZXROZXh0KCkpCiAgICAgICBpZiAoTWV0aG9kLT5NZXRob2QpCi0gICAgICAgIGNsYW5nOjppbzo6RW1pdDMyKE91dCwgV3JpdGVyLmdldERlY2xJRChNZXRob2QtPk1ldGhvZCkpOworICAgICAgICBMRS53cml0ZTx1aW50MzJfdD4oV3JpdGVyLmdldERlY2xJRChNZXRob2QtPk1ldGhvZCkpOwogICAgIGZvciAoY29uc3QgT2JqQ01ldGhvZExpc3QgKk1ldGhvZCA9ICZNZXRob2RzLkZhY3Rvcnk7IE1ldGhvZDsKICAgICAgICAgIE1ldGhvZCA9IE1ldGhvZC0+Z2V0TmV4dCgpKQogICAgICAgaWYgKE1ldGhvZC0+TWV0aG9kKQotICAgICAgICBjbGFuZzo6aW86OkVtaXQzMihPdXQsIFdyaXRlci5nZXREZWNsSUQoTWV0aG9kLT5NZXRob2QpKTsKKyAgICAgICAgTEUud3JpdGU8dWludDMyX3Q+KFdyaXRlci5nZXREZWNsSUQoTWV0aG9kLT5NZXRob2QpKTsKIAogICAgIGFzc2VydChPdXQudGVsbCgpIC0gU3RhcnQgPT0gRGF0YUxlbiAmJiAiRGF0YSBsZW5ndGggaXMgd3JvbmciKTsKICAgfQpAQCAtMjg1NywxMCArMjg1NCwxMSBAQAogICAgIFNtYWxsU3RyaW5nPDQwOTY+IE1ldGhvZFBvb2w7CiAgICAgdWludDMyX3QgQnVja2V0T2Zmc2V0OwogICAgIHsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OwogICAgICAgQVNUTWV0aG9kUG9vbFRyYWl0IFRyYWl0KCp0aGlzKTsKICAgICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gT3V0KE1ldGhvZFBvb2wpOwogICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgbm8gYnVja2V0IGlzIGF0IG9mZnNldCAwCi0gICAgICBjbGFuZzo6aW86OkVtaXQzMihPdXQsIDApOworICAgICAgZW5kaWFuOjpXcml0ZXI8bGl0dGxlPihPdXQpLndyaXRlPHVpbnQzMl90PigwKTsKICAgICAgIEJ1Y2tldE9mZnNldCA9IEdlbmVyYXRvci5FbWl0KE91dCwgVHJhaXQpOwogICAgIH0KIApAQCAtMjk1OSw4MyArMjk1NywxMDEgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBEZWZNYWNyb0RpcmVjdGl2ZSAqZ2V0Rmlyc3RQdWJsaWNTdWJtb2R1bGVNYWNybyhNYWNyb0RpcmVjdGl2ZSAqTUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1vZHVsZUlEICZNb2RJRCkgeworICB0eXBlZGVmIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxTdWJtb2R1bGVJRD4gT3ZlcnJpZGRlbkxpc3Q7CisKKyAgTWFjcm9EaXJlY3RpdmUgKgorICBnZXRGaXJzdFB1YmxpY1N1Ym1vZHVsZU1hY3JvKE1hY3JvRGlyZWN0aXZlICpNRCwgU3VibW9kdWxlSUQgJk1vZElEKSB7CiAgICAgTW9kSUQgPSAwOwotICAgIGlmIChEZWZNYWNyb0RpcmVjdGl2ZSAqRGVmTUQgPSBnZXRQdWJsaWNTdWJtb2R1bGVNYWNybyhNRCwgTW9kSUQpKQotICAgICAgaWYgKCFzaG91bGRJZ25vcmVNYWNybyhEZWZNRCwgSXNNb2R1bGUsIFBQKSkKLSAgICAgICAgcmV0dXJuIERlZk1EOworICAgIGxsdm06OlNtYWxsVmVjdG9yPFN1Ym1vZHVsZUlELCAxPiBPdmVycmlkZGVuOworICAgIGlmIChNYWNyb0RpcmVjdGl2ZSAqTmV4dE1EID0gZ2V0UHVibGljU3VibW9kdWxlTWFjcm8oTUQsIE1vZElELCBPdmVycmlkZGVuKSkKKyAgICAgIGlmICghc2hvdWxkSWdub3JlTWFjcm8oTmV4dE1ELCBJc01vZHVsZSwgUFApKQorICAgICAgICByZXR1cm4gTmV4dE1EOwogICAgIHJldHVybiAwOwogICB9CiAKLSAgRGVmTWFjcm9EaXJlY3RpdmUgKmdldE5leHRQdWJsaWNTdWJtb2R1bGVNYWNybyhEZWZNYWNyb0RpcmVjdGl2ZSAqTUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibW9kdWxlSUQgJk1vZElEKSB7Ci0gICAgaWYgKERlZk1hY3JvRGlyZWN0aXZlICoKLSAgICAgICAgICBEZWZNRCA9IGdldFB1YmxpY1N1Ym1vZHVsZU1hY3JvKE1ELT5nZXRQcmV2aW91cygpLCBNb2RJRCkpCi0gICAgICBpZiAoIXNob3VsZElnbm9yZU1hY3JvKERlZk1ELCBJc01vZHVsZSwgUFApKQotICAgICAgICByZXR1cm4gRGVmTUQ7CisgIE1hY3JvRGlyZWN0aXZlICoKKyAgZ2V0TmV4dFB1YmxpY1N1Ym1vZHVsZU1hY3JvKE1hY3JvRGlyZWN0aXZlICpNRCwgU3VibW9kdWxlSUQgJk1vZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGRlbkxpc3QgJk92ZXJyaWRkZW4pIHsKKyAgICBpZiAoTWFjcm9EaXJlY3RpdmUgKk5leHRNRCA9CisgICAgICAgICAgICBnZXRQdWJsaWNTdWJtb2R1bGVNYWNybyhNRC0+Z2V0UHJldmlvdXMoKSwgTW9kSUQsIE92ZXJyaWRkZW4pKQorICAgICAgaWYgKCFzaG91bGRJZ25vcmVNYWNybyhOZXh0TUQsIElzTW9kdWxlLCBQUCkpCisgICAgICAgIHJldHVybiBOZXh0TUQ7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICAvLy8gXGJyaWVmIFRyYXZlcnNlcyB0aGUgbWFjcm8gZGlyZWN0aXZlcyBoaXN0b3J5IGFuZCByZXR1cm5zIHRoZSBsYXRlc3QKLSAgLy8vIG1hY3JvIHRoYXQgaXMgcHVibGljIGFuZCBub3QgdW5kZWZpbmVkIGluIHRoZSBzYW1lIHN1Ym1vZHVsZS4KLSAgLy8vIEEgbWFjcm8gdGhhdCBpcyBkZWZpbmVkIGluIHN1Ym1vZHVsZSBBIGFuZCB1bmRlZmluZWQgaW4gc3VibW9kdWxlIEIsCisgIC8vLyBwdWJsaWMgbWFjcm8gZGVmaW5pdGlvbiBvciB1bmRlZmluaXRpb24gdGhhdCBpcyBub3QgaW4gTW9kSUQuCisgIC8vLyBBIG1hY3JvIHRoYXQgaXMgZGVmaW5lZCBpbiBzdWJtb2R1bGUgQSBhbmQgdW5kZWZpbmVkIGluIHN1Ym1vZHVsZSBCCiAgIC8vLyB3aWxsIHN0aWxsIGJlIGNvbnNpZGVyZWQgYXMgZGVmaW5lZC9leHBvcnRlZCBmcm9tIHN1Ym1vZHVsZSBBLgotICBEZWZNYWNyb0RpcmVjdGl2ZSAqZ2V0UHVibGljU3VibW9kdWxlTWFjcm8oTWFjcm9EaXJlY3RpdmUgKk1ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibW9kdWxlSUQgJk1vZElEKSB7CisgIC8vLyBNb2RJRCBpcyB1cGRhdGVkIHRvIHRoZSBtb2R1bGUgY29udGFpbmluZyB0aGUgcmV0dXJuZWQgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIEZJWE1FOiBUaGlzIHByb2Nlc3MgYnJlYWtzIGRvd24gaWYgYSBtb2R1bGUgZGVmaW5lcyBhIG1hY3JvLCBpbXBvcnRzCisgIC8vLyAgICAgICAgYW5vdGhlciBzdWJtb2R1bGUgdGhhdCBjaGFuZ2VzIHRoZSBtYWNybywgdGhlbiBjaGFuZ2VzIHRoZQorICAvLy8gICAgICAgIG1hY3JvIGFnYWluIGl0c2VsZi4KKyAgTWFjcm9EaXJlY3RpdmUgKmdldFB1YmxpY1N1Ym1vZHVsZU1hY3JvKE1hY3JvRGlyZWN0aXZlICpNRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1vZHVsZUlEICZNb2RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJyaWRkZW5MaXN0ICZPdmVycmlkZGVuKSB7CiAgICAgaWYgKCFNRCkKICAgICAgIHJldHVybiAwOwogCisgICAgT3ZlcnJpZGRlbi5jbGVhcigpOwogICAgIFN1Ym1vZHVsZUlEIE9yaWdNb2RJRCA9IE1vZElEOwotICAgIGJvb2wgaXNVbmRlZmluZWQgPSBmYWxzZTsKLSAgICBPcHRpb25hbDxib29sPiBpc1B1YmxpYzsKKyAgICBPcHRpb25hbDxib29sPiBJc1B1YmxpYzsKICAgICBmb3IgKDsgTUQ7IE1EID0gTUQtPmdldFByZXZpb3VzKCkpIHsKLSAgICAgIGlmIChNRC0+aXNIaWRkZW4oKSkKLSAgICAgICAgY29udGludWU7Ci0KICAgICAgIFN1Ym1vZHVsZUlEIFRoaXNNb2RJRCA9IGdldFN1Ym1vZHVsZUlEKE1EKTsKICAgICAgIGlmIChUaGlzTW9kSUQgPT0gMCkgewotICAgICAgICBpc1VuZGVmaW5lZCA9IGZhbHNlOwotICAgICAgICBpc1B1YmxpYyA9IE9wdGlvbmFsPGJvb2w+KCk7CisgICAgICAgIElzUHVibGljID0gT3B0aW9uYWw8Ym9vbD4oKTsKICAgICAgICAgY29udGludWU7CiAgICAgICB9Ci0gICAgICBpZiAoVGhpc01vZElEICE9IE1vZElEKXsKKyAgICAgIGlmIChUaGlzTW9kSUQgIT0gTW9kSUQpIHsKICAgICAgICAgTW9kSUQgPSBUaGlzTW9kSUQ7Ci0gICAgICAgIGlzVW5kZWZpbmVkID0gZmFsc2U7Ci0gICAgICAgIGlzUHVibGljID0gT3B0aW9uYWw8Ym9vbD4oKTsKKyAgICAgICAgSXNQdWJsaWMgPSBPcHRpb25hbDxib29sPigpOwogICAgICAgfQorCisgICAgICAvLyBJZiB0aGlzIGlzIGEgZGVmaW5pdGlvbiBmcm9tIGEgc3VibW9kdWxlIGltcG9ydCwgdGhhdCBzdWJtb2R1bGUncworICAgICAgLy8gZGVmaW5pdGlvbiBpcyBvdmVycmlkZGVuIGJ5IHRoZSBkZWZpbml0aW9uIG9yIHVuZGVmaW5pdGlvbiB0aGF0IHdlCisgICAgICAvLyBzdGFydGVkIHdpdGguCisgICAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgb25seSBhcHBseSB0byBtYWNyb3MgZGVmaW5lZCBpbiBPcmlnTW9kSUQuCisgICAgICAvLyBXZSBjYW4ndCBkbyB0aGF0IGN1cnJlbnRseSwgYmVjYXVzZSBhICNpbmNsdWRlIG9mIGEgZGlmZmVyZW50IHN1Ym1vZHVsZQorICAgICAgLy8gb2YgdGhlIHNhbWUgbW9kdWxlIGp1c3QgbGVha3MgdGhyb3VnaCBtYWNyb3MgaW5zdGVhZCBvZiBwcm92aWRpbmcgbmV3CisgICAgICAvLyBEZWZNYWNyb0RpcmVjdGl2ZXMgZm9yIHRoZW0uCisgICAgICBpZiAoRGVmTWFjcm9EaXJlY3RpdmUgKkRlZk1EID0gZHluX2Nhc3Q8RGVmTWFjcm9EaXJlY3RpdmU+KE1EKSkgeworICAgICAgICAvLyBGaWd1cmUgb3V0IHdoaWNoIHN1Ym1vZHVsZSB0aGUgbWFjcm8gd2FzIG9yaWdpbmFsbHkgZGVmaW5lZCB3aXRoaW4uCisgICAgICAgIFN1Ym1vZHVsZUlEIFNvdXJjZUlEID0gRGVmTUQtPmdldEluZm8oKS0+Z2V0T3duaW5nTW9kdWxlSUQoKTsKKyAgICAgICAgaWYgKCFTb3VyY2VJRCkgeworICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIERlZkxvYyA9IERlZk1ELT5nZXRJbmZvKCktPmdldERlZmluaXRpb25Mb2MoKTsKKyAgICAgICAgICBpZiAoRGVmTG9jID09IE1ELT5nZXRMb2NhdGlvbigpKQorICAgICAgICAgICAgU291cmNlSUQgPSBUaGlzTW9kSUQ7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgU291cmNlSUQgPSBXcml0ZXIuaW5mZXJTdWJtb2R1bGVJREZyb21Mb2NhdGlvbihEZWZMb2MpOworICAgICAgICB9CisgICAgICAgIGlmIChTb3VyY2VJRCAhPSBPcmlnTW9kSUQpCisgICAgICAgICAgT3ZlcnJpZGRlbi5wdXNoX2JhY2soU291cmNlSUQpOworICAgICAgfQorCiAgICAgICAvLyBXZSBhcmUgbG9va2luZyBmb3IgYSBkZWZpbml0aW9uIGluIGEgZGlmZmVyZW50IHN1Ym1vZHVsZSB0aGFuIHRoZSBvbmUKICAgICAgIC8vIHRoYXQgd2Ugc3RhcnRlZCB3aXRoLiBJZiBhIHN1Ym1vZHVsZSBoYXMgcmUtZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUKICAgICAgIC8vIG1hY3JvLCBvbmx5IHRoZSBsYXN0IGRlZmluaXRpb24gd2lsbCBiZSB1c2VkIGFzIHRoZSAiZXhwb3J0ZWQiIG9uZS4KICAgICAgIGlmIChNb2RJRCA9PSBPcmlnTW9kSUQpCiAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICBpZiAoRGVmTWFjcm9EaXJlY3RpdmUgKkRlZk1EID0gZHluX2Nhc3Q8RGVmTWFjcm9EaXJlY3RpdmU+KE1EKSkgewotICAgICAgICBpZiAoIWlzVW5kZWZpbmVkICYmICghaXNQdWJsaWMuaGFzVmFsdWUoKSB8fCBpc1B1YmxpYy5nZXRWYWx1ZSgpKSkKLSAgICAgICAgICByZXR1cm4gRGVmTUQ7Ci0gICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gVGhlIGxhdGVzdCB2aXNpYmlsaXR5IGRpcmVjdGl2ZSBmb3IgYSBuYW1lIGluIGEgc3VibW9kdWxlIGFmZmVjdHMgYWxsCisgICAgICAvLyB0aGUgZGlyZWN0aXZlcyB0aGF0IGNvbWUgYmVmb3JlIGl0LgorICAgICAgaWYgKFZpc2liaWxpdHlNYWNyb0RpcmVjdGl2ZSAqVmlzTUQgPQorICAgICAgICAgICAgICBkeW5fY2FzdDxWaXNpYmlsaXR5TWFjcm9EaXJlY3RpdmU+KE1EKSkgeworICAgICAgICBpZiAoIUlzUHVibGljLmhhc1ZhbHVlKCkpCisgICAgICAgICAgSXNQdWJsaWMgPSBWaXNNRC0+aXNQdWJsaWMoKTsKKyAgICAgIH0gZWxzZSBpZiAoIUlzUHVibGljLmhhc1ZhbHVlKCkgfHwgSXNQdWJsaWMuZ2V0VmFsdWUoKSkgeworICAgICAgICAvLyBGSVhNRTogSWYgd2UgZmluZCBhbiBpbXBvcnRlZCBtYWNybywgd2Ugc2hvdWxkIGluY2x1ZGUgaXRzIGxpc3Qgb2YKKyAgICAgICAgLy8gb3ZlcnJpZGVzIGluIG91ciBleHBvcnQuCisgICAgICAgIHJldHVybiBNRDsKICAgICAgIH0KLQotICAgICAgaWYgKGlzYTxVbmRlZk1hY3JvRGlyZWN0aXZlPihNRCkpIHsKLSAgICAgICAgaXNVbmRlZmluZWQgPSB0cnVlOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgVmlzaWJpbGl0eU1hY3JvRGlyZWN0aXZlICpWaXNNRCA9IGNhc3Q8VmlzaWJpbGl0eU1hY3JvRGlyZWN0aXZlPihNRCk7Ci0gICAgICBpZiAoIWlzUHVibGljLmhhc1ZhbHVlKCkpCi0gICAgICAgIGlzUHVibGljID0gVmlzTUQtPmlzUHVibGljKCk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBTdWJtb2R1bGVJRCBnZXRTdWJtb2R1bGVJRChNYWNyb0RpcmVjdGl2ZSAqTUQpIHsKLSAgICBpZiAoRGVmTWFjcm9EaXJlY3RpdmUgKkRlZk1EID0gZHluX2Nhc3Q8RGVmTWFjcm9EaXJlY3RpdmU+KE1EKSkgewotICAgICAgTWFjcm9JbmZvICpNSSA9IERlZk1ELT5nZXRJbmZvKCk7Ci0gICAgICBpZiAodW5zaWduZWQgSUQgPSBNSS0+Z2V0T3duaW5nTW9kdWxlSUQoKSkKLSAgICAgICAgcmV0dXJuIElEOwotICAgICAgcmV0dXJuIFdyaXRlci5pbmZlclN1Ym1vZHVsZUlERnJvbUxvY2F0aW9uKE1JLT5nZXREZWZpbml0aW9uTG9jKCkpOwotICAgIH0KICAgICByZXR1cm4gV3JpdGVyLmluZmVyU3VibW9kdWxlSURGcm9tTG9jYXRpb24oTUQtPmdldExvY2F0aW9uKCkpOwogICB9CiAKQEAgLTMwNjYsMTEgKzMwODIsMTggQEAKICAgICAgICAgRGF0YUxlbiArPSA0OyAvLyBNYWNyb0RpcmVjdGl2ZXMgb2Zmc2V0LgogICAgICAgICBpZiAoSXNNb2R1bGUpIHsKICAgICAgICAgICBTdWJtb2R1bGVJRCBNb2RJRDsKLSAgICAgICAgICBmb3IgKERlZk1hY3JvRGlyZWN0aXZlICoKLSAgICAgICAgICAgICAgICAgRGVmTUQgPSBnZXRGaXJzdFB1YmxpY1N1Ym1vZHVsZU1hY3JvKE1hY3JvLCBNb2RJRCk7Ci0gICAgICAgICAgICAgICAgIERlZk1EOyBEZWZNRCA9IGdldE5leHRQdWJsaWNTdWJtb2R1bGVNYWNybyhEZWZNRCwgTW9kSUQpKSB7Ci0gICAgICAgICAgICBEYXRhTGVuICs9IDQ7IC8vIE1hY3JvSW5mbyBJRC4KKyAgICAgICAgICBsbHZtOjpTbWFsbFZlY3RvcjxTdWJtb2R1bGVJRCwgND4gT3ZlcnJpZGRlbjsKKyAgICAgICAgICBmb3IgKE1hY3JvRGlyZWN0aXZlICoKKyAgICAgICAgICAgICAgICAgTUQgPSBnZXRGaXJzdFB1YmxpY1N1Ym1vZHVsZU1hY3JvKE1hY3JvLCBNb2RJRCk7CisgICAgICAgICAgICAgICAgIE1EOyBNRCA9IGdldE5leHRQdWJsaWNTdWJtb2R1bGVNYWNybyhNRCwgTW9kSUQsIE92ZXJyaWRkZW4pKSB7CisgICAgICAgICAgICAvLyBQcmV2aW91cyBtYWNybydzIG92ZXJyaWRlcy4KKyAgICAgICAgICAgIGlmICghT3ZlcnJpZGRlbi5lbXB0eSgpKQorICAgICAgICAgICAgICBEYXRhTGVuICs9IDQgKiAoMSArIE92ZXJyaWRkZW4uc2l6ZSgpKTsKKyAgICAgICAgICAgIERhdGFMZW4gKz0gNDsgLy8gTWFjcm9JbmZvIElEIG9yIE1vZHVsZUlELgogICAgICAgICAgIH0KKyAgICAgICAgICAvLyBQcmV2aW91cyBtYWNybydzIG92ZXJyaWRlcy4KKyAgICAgICAgICBpZiAoIU92ZXJyaWRkZW4uZW1wdHkoKSkKKyAgICAgICAgICAgIERhdGFMZW4gKz0gNCAqICgxICsgT3ZlcnJpZGRlbi5zaXplKCkpOwogICAgICAgICAgIERhdGFMZW4gKz0gNDsKICAgICAgICAgfQogICAgICAgfQpAQCAtMzA4MCwxMSArMzEwMywxNCBAQAogICAgICAgICAgICBEICE9IERFbmQ7ICsrRCkKICAgICAgICAgRGF0YUxlbiArPSBzaXplb2YoRGVjbElEKTsKICAgICB9Ci0gICAgY2xhbmc6OmlvOjpFbWl0MTYoT3V0LCBEYXRhTGVuKTsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+IExFKE91dCk7CisKKyAgICBMRS53cml0ZTx1aW50MTZfdD4oRGF0YUxlbik7CiAgICAgLy8gV2UgZW1pdCB0aGUga2V5IGxlbmd0aCBhZnRlciB0aGUgZGF0YSBsZW5ndGggc28gdGhhdCBldmVyeQogICAgIC8vIHN0cmluZyBpcyBwcmVjZWRlZCBieSBhIDE2LWJpdCBsZW5ndGguIFRoaXMgbWF0Y2hlcyB0aGUgUFRICiAgICAgLy8gZm9ybWF0IGZvciBzdG9yaW5nIGlkZW50aWZpZXJzLgotICAgIGNsYW5nOjppbzo6RW1pdDE2KE91dCwgS2V5TGVuKTsKKyAgICBMRS53cml0ZTx1aW50MTZfdD4oS2V5TGVuKTsKICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoS2V5TGVuLCBEYXRhTGVuKTsKICAgfQogCkBAIC0zMDk2LDE4ICszMTIyLDMxIEBACiAgICAgT3V0LndyaXRlKElJLT5nZXROYW1lU3RhcnQoKSwgS2V5TGVuKTsKICAgfQogCisgIHN0YXRpYyB2b2lkIGVtaXRNYWNyb092ZXJyaWRlcyhyYXdfb3N0cmVhbSAmT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXJyYXlSZWY8U3VibW9kdWxlSUQ+IE92ZXJyaWRkZW4pIHsKKyAgICBpZiAoIU92ZXJyaWRkZW4uZW1wdHkoKSkgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+IExFKE91dCk7CisgICAgICBMRS53cml0ZTx1aW50MzJfdD4oT3ZlcnJpZGRlbi5zaXplKCkgfCAweDgwMDAwMDAwVSk7CisgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gT3ZlcnJpZGRlbi5zaXplKCk7IEkgIT0gTjsgKytJKQorICAgICAgICBMRS53cml0ZTx1aW50MzJfdD4oT3ZlcnJpZGRlbltJXSk7CisgICAgfQorICB9CisKICAgdm9pZCBFbWl0RGF0YShyYXdfb3N0cmVhbSYgT3V0LCBJZGVudGlmaWVySW5mbyogSUksCiAgICAgICAgICAgICAgICAgSWRlbnRJRCBJRCwgdW5zaWduZWQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+IExFKE91dCk7CiAgICAgTWFjcm9EaXJlY3RpdmUgKk1hY3JvID0gMDsKICAgICBpZiAoIWlzSW50ZXJlc3RpbmdJZGVudGlmaWVyKElJLCBNYWNybykpIHsKLSAgICAgIGNsYW5nOjppbzo6RW1pdDMyKE91dCwgSUQgPDwgMSk7CisgICAgICBMRS53cml0ZTx1aW50MzJfdD4oSUQgPDwgMSk7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgY2xhbmc6OmlvOjpFbWl0MzIoT3V0LCAoSUQgPDwgMSkgfCAweDAxKTsKKyAgICBMRS53cml0ZTx1aW50MzJfdD4oKElEIDw8IDEpIHwgMHgwMSk7CiAgICAgdWludDMyX3QgQml0cyA9ICh1aW50MzJfdClJSS0+Z2V0T2JqQ09yQnVpbHRpbklEKCk7CiAgICAgYXNzZXJ0KChCaXRzICYgMHhmZmZmKSA9PSBCaXRzICYmICJPYmpDT3JCdWlsdGluSUQgdG9vIGJpZyBmb3IgQVNUUmVhZGVyLiIpOwotICAgIGNsYW5nOjppbzo6RW1pdDE2KE91dCwgQml0cyk7CisgICAgTEUud3JpdGU8dWludDE2X3Q+KEJpdHMpOwogICAgIEJpdHMgPSAwOwogICAgIGJvb2wgSGFkTWFjcm9EZWZpbml0aW9uID0gaGFkTWFjcm9EZWZpbml0aW9uKElJLCBNYWNybyk7CiAgICAgQml0cyA9IChCaXRzIDw8IDEpIHwgdW5zaWduZWQoSGFkTWFjcm9EZWZpbml0aW9uKTsKQEAgLTMxMTYsMjEgKzMxNTUsMzAgQEAKICAgICBCaXRzID0gKEJpdHMgPDwgMSkgfCB1bnNpZ25lZChJSS0+aXNQb2lzb25lZCgpKTsKICAgICBCaXRzID0gKEJpdHMgPDwgMSkgfCB1bnNpZ25lZChJSS0+aGFzUmV2ZXJ0ZWRUb2tlbklEVG9JZGVudGlmaWVyKCkpOwogICAgIEJpdHMgPSAoQml0cyA8PCAxKSB8IHVuc2lnbmVkKElJLT5pc0NQbHVzUGx1c09wZXJhdG9yS2V5d29yZCgpKTsKLSAgICBjbGFuZzo6aW86OkVtaXQxNihPdXQsIEJpdHMpOworICAgIExFLndyaXRlPHVpbnQxNl90PihCaXRzKTsKIAogICAgIGlmIChIYWRNYWNyb0RlZmluaXRpb24pIHsKLSAgICAgIGNsYW5nOjppbzo6RW1pdDMyKE91dCwgV3JpdGVyLmdldE1hY3JvRGlyZWN0aXZlc09mZnNldChJSSkpOworICAgICAgTEUud3JpdGU8dWludDMyX3Q+KFdyaXRlci5nZXRNYWNyb0RpcmVjdGl2ZXNPZmZzZXQoSUkpKTsKICAgICAgIGlmIChJc01vZHVsZSkgewogICAgICAgICAvLyBXcml0ZSB0aGUgSURzIG9mIG1hY3JvcyBjb21pbmcgZnJvbSBkaWZmZXJlbnQgc3VibW9kdWxlcy4KICAgICAgICAgU3VibW9kdWxlSUQgTW9kSUQ7Ci0gICAgICAgIGZvciAoRGVmTWFjcm9EaXJlY3RpdmUgKgotICAgICAgICAgICAgICAgRGVmTUQgPSBnZXRGaXJzdFB1YmxpY1N1Ym1vZHVsZU1hY3JvKE1hY3JvLCBNb2RJRCk7Ci0gICAgICAgICAgICAgICBEZWZNRDsgRGVmTUQgPSBnZXROZXh0UHVibGljU3VibW9kdWxlTWFjcm8oRGVmTUQsIE1vZElEKSkgewotICAgICAgICAgIE1hY3JvSUQgSW5mb0lEID0gV3JpdGVyLmdldE1hY3JvSUQoRGVmTUQtPmdldEluZm8oKSk7Ci0gICAgICAgICAgYXNzZXJ0KEluZm9JRCk7Ci0gICAgICAgICAgY2xhbmc6OmlvOjpFbWl0MzIoT3V0LCBJbmZvSUQpOworICAgICAgICBsbHZtOjpTbWFsbFZlY3RvcjxTdWJtb2R1bGVJRCwgND4gT3ZlcnJpZGRlbjsKKyAgICAgICAgZm9yIChNYWNyb0RpcmVjdGl2ZSAqCisgICAgICAgICAgICAgICBNRCA9IGdldEZpcnN0UHVibGljU3VibW9kdWxlTWFjcm8oTWFjcm8sIE1vZElEKTsKKyAgICAgICAgICAgICAgIE1EOyBNRCA9IGdldE5leHRQdWJsaWNTdWJtb2R1bGVNYWNybyhNRCwgTW9kSUQsIE92ZXJyaWRkZW4pKSB7CisgICAgICAgICAgTWFjcm9JRCBJbmZvSUQgPSAwOworICAgICAgICAgIGVtaXRNYWNyb092ZXJyaWRlcyhPdXQsIE92ZXJyaWRkZW4pOworICAgICAgICAgIGlmIChEZWZNYWNyb0RpcmVjdGl2ZSAqRGVmTUQgPSBkeW5fY2FzdDxEZWZNYWNyb0RpcmVjdGl2ZT4oTUQpKSB7CisgICAgICAgICAgICBJbmZvSUQgPSBXcml0ZXIuZ2V0TWFjcm9JRChEZWZNRC0+Z2V0SW5mbygpKTsKKyAgICAgICAgICAgIGFzc2VydChJbmZvSUQpOworICAgICAgICAgICAgTEUud3JpdGU8dWludDMyX3Q+KEluZm9JRCA8PCAxKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGlzYTxVbmRlZk1hY3JvRGlyZWN0aXZlPihNRCkpOworICAgICAgICAgICAgTEUud3JpdGU8dWludDMyX3Q+KChNb2RJRCA8PCAxKSB8IDEpOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjbGFuZzo6aW86OkVtaXQzMihPdXQsIDApOworICAgICAgICBlbWl0TWFjcm9PdmVycmlkZXMoT3V0LCBPdmVycmlkZGVuKTsKKyAgICAgICAgTEUud3JpdGU8dWludDMyX3Q+KDApOwogICAgICAgfQogICAgIH0KIApAQCAtMzE0NSw3ICszMTkzLDcgQEAKICAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxEZWNsICo+OjpyZXZlcnNlX2l0ZXJhdG9yIEQgPSBEZWNscy5yYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFbmQgPSBEZWNscy5yZW5kKCk7CiAgICAgICAgICBEICE9IERFbmQ7ICsrRCkKLSAgICAgIGNsYW5nOjppbzo6RW1pdDMyKE91dCwgV3JpdGVyLmdldERlY2xJRChnZXRNb3N0UmVjZW50TG9jYWxEZWNsKCpEKSkpOworICAgICAgTEUud3JpdGU8dWludDMyX3Q+KFdyaXRlci5nZXREZWNsSUQoZ2V0TW9zdFJlY2VudExvY2FsRGVjbCgqRCkpKTsKICAgfQogCiAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgbG9jYWwgZGVjbCBvciB0aGUgZ2l2ZW4gZGVjbCBpZiB0aGVyZSBhcmUKQEAgLTMyMTQsMTAgKzMyNjIsMTEgQEAKICAgICBTbWFsbFN0cmluZzw0MDk2PiBJZGVudGlmaWVyVGFibGU7CiAgICAgdWludDMyX3QgQnVja2V0T2Zmc2V0OwogICAgIHsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OwogICAgICAgQVNUSWRlbnRpZmllclRhYmxlVHJhaXQgVHJhaXQoKnRoaXMsIFBQLCBJZFJlc29sdmVyLCBJc01vZHVsZSk7CiAgICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIE91dChJZGVudGlmaWVyVGFibGUpOwogICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgbm8gYnVja2V0IGlzIGF0IG9mZnNldCAwCi0gICAgICBjbGFuZzo6aW86OkVtaXQzMihPdXQsIDApOworICAgICAgZW5kaWFuOjpXcml0ZXI8bGl0dGxlPihPdXQpLndyaXRlPHVpbnQzMl90PigwKTsKICAgICAgIEJ1Y2tldE9mZnNldCA9IEdlbmVyYXRvci5FbWl0KE91dCwgVHJhaXQpOwogICAgIH0KIApAQCAtMzMwNiw2ICszMzU1LDggQEAKICAgc3RkOjpwYWlyPHVuc2lnbmVkLHVuc2lnbmVkPgogICAgIEVtaXRLZXlEYXRhTGVuZ3RoKHJhd19vc3RyZWFtJiBPdXQsIERlY2xhcmF0aW9uTmFtZSBOYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZV9yZWYgTG9va3VwKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgZW5kaWFuOjpXcml0ZXI8bGl0dGxlPiBMRShPdXQpOwogICAgIHVuc2lnbmVkIEtleUxlbiA9IDE7CiAgICAgc3dpdGNoIChOYW1lLmdldE5hbWVLaW5kKCkpIHsKICAgICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6SWRlbnRpZmllcjoKQEAgLTMzMjQsMzUgKzMzNzUsMzUgQEAKICAgICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYVXNpbmdEaXJlY3RpdmU6CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2xhbmc6OmlvOjpFbWl0MTYoT3V0LCBLZXlMZW4pOworICAgIExFLndyaXRlPHVpbnQxNl90PihLZXlMZW4pOwogCiAgICAgLy8gMiBieXRlcyBmb3IgbnVtIG9mIGRlY2xzIGFuZCA0IGZvciBlYWNoIERlY2xJRC4KICAgICB1bnNpZ25lZCBEYXRhTGVuID0gMiArIDQgKiBMb29rdXAuc2l6ZSgpOwotICAgIGNsYW5nOjppbzo6RW1pdDE2KE91dCwgRGF0YUxlbik7CisgICAgTEUud3JpdGU8dWludDE2X3Q+KERhdGFMZW4pOwogCiAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEtleUxlbiwgRGF0YUxlbik7CiAgIH0KIAogICB2b2lkIEVtaXRLZXkocmF3X29zdHJlYW0mIE91dCwgRGVjbGFyYXRpb25OYW1lIE5hbWUsIHVuc2lnbmVkKSB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIGNsYW5nOjppbzsKLQotICAgIEVtaXQ4KE91dCwgTmFtZS5nZXROYW1lS2luZCgpKTsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+IExFKE91dCk7CisgICAgTEUud3JpdGU8dWludDhfdD4oTmFtZS5nZXROYW1lS2luZCgpKTsKICAgICBzd2l0Y2ggKE5hbWUuZ2V0TmFtZUtpbmQoKSkgewogICAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpJZGVudGlmaWVyOgotICAgICAgRW1pdDMyKE91dCwgV3JpdGVyLmdldElkZW50aWZpZXJSZWYoTmFtZS5nZXRBc0lkZW50aWZpZXJJbmZvKCkpKTsKKyAgICAgIExFLndyaXRlPHVpbnQzMl90PihXcml0ZXIuZ2V0SWRlbnRpZmllclJlZihOYW1lLmdldEFzSWRlbnRpZmllckluZm8oKSkpOwogICAgICAgcmV0dXJuOwogICAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpPYmpDWmVyb0FyZ1NlbGVjdG9yOgogICAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpPYmpDT25lQXJnU2VsZWN0b3I6CiAgICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6Ok9iakNNdWx0aUFyZ1NlbGVjdG9yOgotICAgICAgRW1pdDMyKE91dCwgV3JpdGVyLmdldFNlbGVjdG9yUmVmKE5hbWUuZ2V0T2JqQ1NlbGVjdG9yKCkpKTsKKyAgICAgIExFLndyaXRlPHVpbnQzMl90PihXcml0ZXIuZ2V0U2VsZWN0b3JSZWYoTmFtZS5nZXRPYmpDU2VsZWN0b3IoKSkpOwogICAgICAgcmV0dXJuOwogICAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhPcGVyYXRvck5hbWU6CiAgICAgICBhc3NlcnQoTmFtZS5nZXRDWFhPdmVybG9hZGVkT3BlcmF0b3IoKSA8IE5VTV9PVkVSTE9BREVEX09QRVJBVE9SUyAmJgogICAgICAgICAgICAgICJJbnZhbGlkIG9wZXJhdG9yPyIpOwotICAgICAgRW1pdDgoT3V0LCBOYW1lLmdldENYWE92ZXJsb2FkZWRPcGVyYXRvcigpKTsKKyAgICAgIExFLndyaXRlPHVpbnQ4X3Q+KE5hbWUuZ2V0Q1hYT3ZlcmxvYWRlZE9wZXJhdG9yKCkpOwogICAgICAgcmV0dXJuOwogICAgIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpDWFhMaXRlcmFsT3BlcmF0b3JOYW1lOgotICAgICAgRW1pdDMyKE91dCwgV3JpdGVyLmdldElkZW50aWZpZXJSZWYoTmFtZS5nZXRDWFhMaXRlcmFsSWRlbnRpZmllcigpKSk7CisgICAgICBMRS53cml0ZTx1aW50MzJfdD4oV3JpdGVyLmdldElkZW50aWZpZXJSZWYoTmFtZS5nZXRDWFhMaXRlcmFsSWRlbnRpZmllcigpKSk7CiAgICAgICByZXR1cm47CiAgICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWENvbnN0cnVjdG9yTmFtZToKICAgICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYRGVzdHJ1Y3Rvck5hbWU6CkBAIC0zMzY2LDE3ICszNDE3LDExMCBAQAogCiAgIHZvaWQgRW1pdERhdGEocmF3X29zdHJlYW0mIE91dCwga2V5X3R5cGVfcmVmLAogICAgICAgICAgICAgICAgIGRhdGFfdHlwZSBMb29rdXAsIHVuc2lnbmVkIERhdGFMZW4pIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKKyAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+IExFKE91dCk7CiAgICAgdWludDY0X3QgU3RhcnQgPSBPdXQudGVsbCgpOyAodm9pZClTdGFydDsKLSAgICBjbGFuZzo6aW86OkVtaXQxNihPdXQsIExvb2t1cC5zaXplKCkpOworICAgIExFLndyaXRlPHVpbnQxNl90PihMb29rdXAuc2l6ZSgpKTsKICAgICBmb3IgKERlY2xDb250ZXh0Ojpsb29rdXBfaXRlcmF0b3IgSSA9IExvb2t1cC5iZWdpbigpLCBFID0gTG9va3VwLmVuZCgpOwogICAgICAgICAgSSAhPSBFOyArK0kpCi0gICAgICBjbGFuZzo6aW86OkVtaXQzMihPdXQsIFdyaXRlci5HZXREZWNsUmVmKCpJKSk7CisgICAgICBMRS53cml0ZTx1aW50MzJfdD4oV3JpdGVyLkdldERlY2xSZWYoKkkpKTsKIAogICAgIGFzc2VydChPdXQudGVsbCgpIC0gU3RhcnQgPT0gRGF0YUxlbiAmJiAiRGF0YSBsZW5ndGggaXMgd3JvbmciKTsKICAgfQogfTsKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIAordWludDMyX3QKK0FTVFdyaXRlcjo6R2VuZXJhdGVOYW1lTG9va3VwVGFibGUoY29uc3QgRGVjbENvbnRleHQgKkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkxvb2t1cFRhYmxlKSB7CisgIGFzc2VydCghREMtPkxvb2t1cFB0ci5nZXRJbnQoKSAmJiAibXVzdCBjYWxsIGJ1aWxkTG9va3VwcyBmaXJzdCIpOworICBhc3NlcnQoREMgPT0gREMtPmdldFByaW1hcnlDb250ZXh0KCkgJiYgIm9ubHkgcHJpbWFyeSBEQyBoYXMgbG9va3VwIHRhYmxlIik7CisKKyAgT25EaXNrQ2hhaW5lZEhhc2hUYWJsZUdlbmVyYXRvcjxBU1REZWNsQ29udGV4dE5hbWVMb29rdXBUcmFpdD4gR2VuZXJhdG9yOworICBBU1REZWNsQ29udGV4dE5hbWVMb29rdXBUcmFpdCBUcmFpdCgqdGhpcyk7CisKKyAgLy8gQ3JlYXRlIHRoZSBvbi1kaXNrIGhhc2ggdGFibGUgcmVwcmVzZW50YXRpb24uCisgIERlY2xhcmF0aW9uTmFtZSBDb25zdHJ1Y3Rvck5hbWU7CisgIERlY2xhcmF0aW9uTmFtZSBDb252ZXJzaW9uTmFtZTsKKyAgU21hbGxWZWN0b3I8TmFtZWREZWNsICosIDg+IENvbnN0cnVjdG9yRGVjbHM7CisgIFNtYWxsVmVjdG9yPE5hbWVkRGVjbCAqLCA0PiBDb252ZXJzaW9uRGVjbHM7CisKKyAgYXV0byBBZGRMb29rdXBSZXN1bHQgPSBbJl0oRGVjbGFyYXRpb25OYW1lIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xDb250ZXh0Ojpsb29rdXBfcmVzdWx0IFJlc3VsdCkgeworICAgIGlmIChSZXN1bHQuZW1wdHkoKSkKKyAgICAgIHJldHVybjsKKworICAgIC8vIERpZmZlcmVudCBEZWNsYXJhdGlvbk5hbWUgdmFsdWVzIG9mIGNlcnRhaW4ga2luZHMgYXJlIG1hcHBlZCB0bworICAgIC8vIGlkZW50aWNhbCBzZXJpYWxpemVkIGtleXMsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB1c2UgdHlwZQorICAgIC8vIGlkZW50aWZpZXJzIGluIHRoZSBrZXlzIChzaW5jZSB0eXBlIGlkcyBhcmUgbG9jYWwgdG8gdGhlIG1vZHVsZSkuCisgICAgc3dpdGNoIChOYW1lLmdldE5hbWVLaW5kKCkpIHsKKyAgICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYQ29uc3RydWN0b3JOYW1lOgorICAgICAgLy8gVGhlcmUgbWF5IGJlIGRpZmZlcmVudCBDWFhDb25zdHJ1Y3Rvck5hbWUgRGVjbGFyYXRpb25OYW1lIHZhbHVlcworICAgICAgLy8gaW4gYSBEZWNsQ29udGV4dCBiZWNhdXNlIGEgVXNpbmdEZWNsIHRoYXQgaW5oZXJpdHMgY29uc3RydWN0b3JzCisgICAgICAvLyBoYXMgdGhlIERlY2xhcmF0aW9uTmFtZSBvZiB0aGUgaW5oZXJpdGVkIGNvbnN0cnVjdG9ycy4KKyAgICAgIGlmICghQ29uc3RydWN0b3JOYW1lKQorICAgICAgICBDb25zdHJ1Y3Rvck5hbWUgPSBOYW1lOworICAgICAgQ29uc3RydWN0b3JEZWNscy5hcHBlbmQoUmVzdWx0LmJlZ2luKCksIFJlc3VsdC5lbmQoKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWENvbnZlcnNpb25GdW5jdGlvbk5hbWU6CisgICAgICBpZiAoIUNvbnZlcnNpb25OYW1lKQorICAgICAgICBDb252ZXJzaW9uTmFtZSA9IE5hbWU7CisgICAgICBDb252ZXJzaW9uRGVjbHMuYXBwZW5kKFJlc3VsdC5iZWdpbigpLCBSZXN1bHQuZW5kKCkpOworICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBHZW5lcmF0b3IuaW5zZXJ0KE5hbWUsIFJlc3VsdCwgVHJhaXQpOworICB9OworCisgIFNtYWxsVmVjdG9yPERlY2xhcmF0aW9uTmFtZSwgMTY+IEV4dGVybmFsTmFtZXM7CisgIGZvciAoYXV0byAmTG9va3VwIDogKkRDLT5nZXRMb29rdXBQdHIoKSkgeworICAgIGlmIChMb29rdXAuc2Vjb25kLmhhc0V4dGVybmFsRGVjbHMoKSB8fAorICAgICAgICBEQy0+TmVlZFRvUmVjb25jaWxlRXh0ZXJuYWxWaXNpYmxlU3RvcmFnZSkgeworICAgICAgLy8gV2UgZG9uJ3Qga25vdyBmb3Igc3VyZSB3aGF0IGRlY2xhcmF0aW9ucyBhcmUgZm91bmQgYnkgdGhpcyBuYW1lLAorICAgICAgLy8gYmVjYXVzZSB0aGUgZXh0ZXJuYWwgc291cmNlIG1pZ2h0IGhhdmUgYSBkaWZmZXJlbnQgc2V0IGZyb20gdGhlIHNldAorICAgICAgLy8gdGhhdCBhcmUgaW4gdGhlIGxvb2t1cCBtYXAsIGFuZCB3ZSBjYW4ndCB1cGRhdGUgaXQgbm93IHdpdGhvdXQKKyAgICAgIC8vIHJpc2tpbmcgaW52YWxpZGF0aW5nIG91ciBsb29rdXAgaXRlcmF0b3IuIFNvIGFkZCBpdCB0byBhIHF1ZXVlIHRvCisgICAgICAvLyBkZWFsIHdpdGggbGF0ZXIuCisgICAgICBFeHRlcm5hbE5hbWVzLnB1c2hfYmFjayhMb29rdXAuZmlyc3QpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgQWRkTG9va3VwUmVzdWx0KExvb2t1cC5maXJzdCwgTG9va3VwLnNlY29uZC5nZXRMb29rdXBSZXN1bHQoKSk7CisgIH0KKworICAvLyBBZGQgdGhlIG5hbWVzIHdlIG5lZWRlZCB0byBkZWZlci4gTm90ZSwgdGhpcyBzaG91bGRuJ3QgYWRkIGFueSBuZXcgZGVjbHMKKyAgLy8gdG8gdGhlIGxpc3Qgd2UgbmVlZCB0byBzZXJpYWxpemU6IGFueSBuZXcgZGVjbGFyYXRpb25zIHdlIGZpbmQgaGVyZSBzaG91bGQKKyAgLy8gYmUgaW1wb3J0ZWQgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UuCisgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBleHRlcm5hbCBzb3VyY2UgaXNuJ3QgYW4gQVNUUmVhZGVyPworICBmb3IgKGNvbnN0IGF1dG8gJk5hbWUgOiBFeHRlcm5hbE5hbWVzKQorICAgIC8vIEZJWE1FOiBjb25zdF9jYXN0IHNpbmNlIE9uRGlza0hhc2hUYWJsZSB3YW50cyBhIG5vbi1jb25zdCBsb29rdXAgcmVzdWx0LgorICAgIEFkZExvb2t1cFJlc3VsdChOYW1lLCBjb25zdF9jYXN0PERlY2xDb250ZXh0Kj4oREMpLT5sb29rdXAoTmFtZSkpOworCisgIC8vIEFkZCB0aGUgY29uc3RydWN0b3JzLgorICBpZiAoIUNvbnN0cnVjdG9yRGVjbHMuZW1wdHkoKSkgeworICAgIEdlbmVyYXRvci5pbnNlcnQoQ29uc3RydWN0b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQ6Omxvb2t1cF9yZXN1bHQoQ29uc3RydWN0b3JEZWNscy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3JEZWNscy5lbmQoKSksCisgICAgICAgICAgICAgICAgICAgICBUcmFpdCk7CisgIH0KKyAgLy8gQWRkIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4KKyAgaWYgKCFDb252ZXJzaW9uRGVjbHMuZW1wdHkoKSkgeworICAgIEdlbmVyYXRvci5pbnNlcnQoQ29udmVyc2lvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICBEZWNsQ29udGV4dDo6bG9va3VwX3Jlc3VsdChDb252ZXJzaW9uRGVjbHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb25EZWNscy5lbmQoKSksCisgICAgICAgICAgICAgICAgICAgICBUcmFpdCk7CisgIH0KKworICAvLyBDcmVhdGUgdGhlIG9uLWRpc2sgaGFzaCB0YWJsZSBpbiBhIGJ1ZmZlci4KKyAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPdXQoTG9va3VwVGFibGUpOworICAvLyBNYWtlIHN1cmUgdGhhdCBubyBidWNrZXQgaXMgYXQgb2Zmc2V0IDAKKyAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgIGVuZGlhbjo6V3JpdGVyPGxpdHRsZT4oT3V0KS53cml0ZTx1aW50MzJfdD4oMCk7CisgIHJldHVybiBHZW5lcmF0b3IuRW1pdChPdXQsIFRyYWl0KTsKK30KKwogLy8vIFxicmllZiBXcml0ZSB0aGUgYmxvY2sgY29udGFpbmluZyBhbGwgb2YgdGhlIGRlY2xhcmF0aW9uIElEcwogLy8vIHZpc2libGUgZnJvbSB0aGUgZ2l2ZW4gRGVjbENvbnRleHQuCiAvLy8KQEAgLTM0MDcsNTAgKzM1NTEsOSBAQAogICBpZiAoIU1hcCB8fCBNYXAtPmVtcHR5KCkpCiAgICAgcmV0dXJuIDA7CiAKLSAgT25EaXNrQ2hhaW5lZEhhc2hUYWJsZUdlbmVyYXRvcjxBU1REZWNsQ29udGV4dE5hbWVMb29rdXBUcmFpdD4gR2VuZXJhdG9yOwotICBBU1REZWNsQ29udGV4dE5hbWVMb29rdXBUcmFpdCBUcmFpdCgqdGhpcyk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBvbi1kaXNrIGhhc2ggdGFibGUgcmVwcmVzZW50YXRpb24uCi0gIERlY2xhcmF0aW9uTmFtZSBDb252ZXJzaW9uTmFtZTsKLSAgU21hbGxWZWN0b3I8TmFtZWREZWNsICosIDQ+IENvbnZlcnNpb25EZWNsczsKLSAgZm9yIChTdG9yZWREZWNsc01hcDo6aXRlcmF0b3IgRCA9IE1hcC0+YmVnaW4oKSwgREVuZCA9IE1hcC0+ZW5kKCk7Ci0gICAgICAgRCAhPSBERW5kOyArK0QpIHsKLSAgICBEZWNsYXJhdGlvbk5hbWUgTmFtZSA9IEQtPmZpcnN0OwotICAgIERlY2xDb250ZXh0Ojpsb29rdXBfcmVzdWx0IFJlc3VsdCA9IEQtPnNlY29uZC5nZXRMb29rdXBSZXN1bHQoKTsKLSAgICBpZiAoIVJlc3VsdC5lbXB0eSgpKSB7Ci0gICAgICBpZiAoTmFtZS5nZXROYW1lS2luZCgpID09IERlY2xhcmF0aW9uTmFtZTo6Q1hYQ29udmVyc2lvbkZ1bmN0aW9uTmFtZSkgewotICAgICAgICAvLyBIYXNoIGFsbCBjb252ZXJzaW9uIGZ1bmN0aW9uIG5hbWVzIHRvIHRoZSBzYW1lIG5hbWUuIFRoZSBhY3R1YWwKLSAgICAgICAgLy8gdHlwZSBpbmZvcm1hdGlvbiBpbiBjb252ZXJzaW9uIGZ1bmN0aW9uIG5hbWUgaXMgbm90IHVzZWQgaW4gdGhlCi0gICAgICAgIC8vIGtleSAoc2luY2Ugc3VjaCB0eXBlIGluZm9ybWF0aW9uIGlzIG5vdCBzdGFibGUgYWNyb3NzIGRpZmZlcmVudAotICAgICAgICAvLyBtb2R1bGVzKSwgc28gdGhlIGludGVuZGVkIGVmZmVjdCBpcyB0byBjb2FsZXNjZSBhbGwgb2YgdGhlIGNvbnZlcnNpb24KLSAgICAgICAgLy8gZnVuY3Rpb25zIHVuZGVyIGEgc2luZ2xlIGtleS4KLSAgICAgICAgaWYgKCFDb252ZXJzaW9uTmFtZSkKLSAgICAgICAgICBDb252ZXJzaW9uTmFtZSA9IE5hbWU7Ci0gICAgICAgIENvbnZlcnNpb25EZWNscy5hcHBlbmQoUmVzdWx0LmJlZ2luKCksIFJlc3VsdC5lbmQoKSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgCi0gICAgICBHZW5lcmF0b3IuaW5zZXJ0KE5hbWUsIFJlc3VsdCwgVHJhaXQpOwotICAgIH0KLSAgfQotCi0gIC8vIEFkZCB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMKLSAgaWYgKCFDb252ZXJzaW9uRGVjbHMuZW1wdHkoKSkgewotICAgIEdlbmVyYXRvci5pbnNlcnQoQ29udmVyc2lvbk5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgRGVjbENvbnRleHQ6Omxvb2t1cF9yZXN1bHQoQ29udmVyc2lvbkRlY2xzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uRGVjbHMuZW5kKCkpLAotICAgICAgICAgICAgICAgICAgICAgVHJhaXQpOwotICB9Ci0gIAogICAvLyBDcmVhdGUgdGhlIG9uLWRpc2sgaGFzaCB0YWJsZSBpbiBhIGJ1ZmZlci4KICAgU21hbGxTdHJpbmc8NDA5Nj4gTG9va3VwVGFibGU7Ci0gIHVpbnQzMl90IEJ1Y2tldE9mZnNldDsKLSAgewotICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gT3V0KExvb2t1cFRhYmxlKTsKLSAgICAvLyBNYWtlIHN1cmUgdGhhdCBubyBidWNrZXQgaXMgYXQgb2Zmc2V0IDAKLSAgICBjbGFuZzo6aW86OkVtaXQzMihPdXQsIDApOwotICAgIEJ1Y2tldE9mZnNldCA9IEdlbmVyYXRvci5FbWl0KE91dCwgVHJhaXQpOwotICB9CisgIHVpbnQzMl90IEJ1Y2tldE9mZnNldCA9IEdlbmVyYXRlTmFtZUxvb2t1cFRhYmxlKERDLCBMb29rdXBUYWJsZSk7CiAKICAgLy8gV3JpdGUgdGhlIGxvb2t1cCB0YWJsZQogICBSZWNvcmREYXRhIFJlY29yZDsKQEAgLTM0NzEsMzMgKzM1NzQsMTMgQEAKIC8vLyAoaW4gQysrKSwgZm9yIG5hbWVzcGFjZXMsIGFuZCBmb3IgY2xhc3NlcyB3aXRoIGZvcndhcmQtZGVjbGFyZWQgdW5zY29wZWQKIC8vLyBlbnVtZXJhdGlvbiBtZW1iZXJzIChpbiBDKysxMSkuCiB2b2lkIEFTVFdyaXRlcjo6V3JpdGVEZWNsQ29udGV4dFZpc2libGVVcGRhdGUoY29uc3QgRGVjbENvbnRleHQgKkRDKSB7Ci0gIFN0b3JlZERlY2xzTWFwICpNYXAgPSBzdGF0aWNfY2FzdDxTdG9yZWREZWNsc01hcCo+KERDLT5nZXRMb29rdXBQdHIoKSk7CisgIFN0b3JlZERlY2xzTWFwICpNYXAgPSBEQy0+Z2V0TG9va3VwUHRyKCk7CiAgIGlmICghTWFwIHx8IE1hcC0+ZW1wdHkoKSkKICAgICByZXR1cm47CiAKLSAgT25EaXNrQ2hhaW5lZEhhc2hUYWJsZUdlbmVyYXRvcjxBU1REZWNsQ29udGV4dE5hbWVMb29rdXBUcmFpdD4gR2VuZXJhdG9yOwotICBBU1REZWNsQ29udGV4dE5hbWVMb29rdXBUcmFpdCBUcmFpdCgqdGhpcyk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBoYXNoIHRhYmxlLgotICBmb3IgKFN0b3JlZERlY2xzTWFwOjppdGVyYXRvciBEID0gTWFwLT5iZWdpbigpLCBERW5kID0gTWFwLT5lbmQoKTsKLSAgICAgICBEICE9IERFbmQ7ICsrRCkgewotICAgIERlY2xhcmF0aW9uTmFtZSBOYW1lID0gRC0+Zmlyc3Q7Ci0gICAgRGVjbENvbnRleHQ6Omxvb2t1cF9yZXN1bHQgUmVzdWx0ID0gRC0+c2Vjb25kLmdldExvb2t1cFJlc3VsdCgpOwotICAgIC8vIEZvciBhbnkgbmFtZSB0aGF0IGFwcGVhcnMgaW4gdGhpcyB0YWJsZSwgdGhlIHJlc3VsdHMgYXJlIGNvbXBsZXRlLCBpLmUuCi0gICAgLy8gdGhleSBvdmVyd3JpdGUgcmVzdWx0cyBmcm9tIHByZXZpb3VzIFBDSHMuIE1lcmdpbmcgaXMgYWx3YXlzIGEgbWVzcy4KLSAgICBpZiAoIVJlc3VsdC5lbXB0eSgpKQotICAgICAgR2VuZXJhdG9yLmluc2VydChOYW1lLCBSZXN1bHQsIFRyYWl0KTsKLSAgfQotCiAgIC8vIENyZWF0ZSB0aGUgb24tZGlzayBoYXNoIHRhYmxlIGluIGEgYnVmZmVyLgogICBTbWFsbFN0cmluZzw0MDk2PiBMb29rdXBUYWJsZTsKLSAgdWludDMyX3QgQnVja2V0T2Zmc2V0OwotICB7Ci0gICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPdXQoTG9va3VwVGFibGUpOwotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG5vIGJ1Y2tldCBpcyBhdCBvZmZzZXQgMAotICAgIGNsYW5nOjppbzo6RW1pdDMyKE91dCwgMCk7Ci0gICAgQnVja2V0T2Zmc2V0ID0gR2VuZXJhdG9yLkVtaXQoT3V0LCBUcmFpdCk7Ci0gIH0KKyAgdWludDMyX3QgQnVja2V0T2Zmc2V0ID0gR2VuZXJhdGVOYW1lTG9va3VwVGFibGUoREMsIExvb2t1cFRhYmxlKTsKIAogICAvLyBXcml0ZSB0aGUgbG9va3VwIHRhYmxlCiAgIFJlY29yZERhdGEgUmVjb3JkOwpAQCAtMzc5OSw5ICszODgyLDcgQEAKIH0KIAogQVNUV3JpdGVyOjp+QVNUV3JpdGVyKCkgewotICBmb3IgKEZpbGVEZWNsSURzVHk6Oml0ZXJhdG9yCi0gICAgICAgICBJID0gRmlsZURlY2xJRHMuYmVnaW4oKSwgRSA9IEZpbGVEZWNsSURzLmVuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBkZWxldGUgSS0+c2Vjb25kOworICBsbHZtOjpEZWxldGVDb250YWluZXJTZWNvbmRzKEZpbGVEZWNsSURzKTsKIH0KIAogdm9pZCBBU1RXcml0ZXI6OldyaXRlQVNUKFNlbWEgJlNlbWFSZWYsCkBAIC00MDMyLDExICs0MTEzLDkgQEAKICAgLy8gdHJhbnNsYXRpb24gdW5pdCB0aGF0IGRvIG5vdCBjb21lIGZyb20gb3RoZXIgQVNUIGZpbGVzLgogICBjb25zdCBUcmFuc2xhdGlvblVuaXREZWNsICpUVSA9IENvbnRleHQuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpOwogICBTbWFsbFZlY3RvcjxLaW5kRGVjbElEUGFpciwgNjQ+IE5ld0dsb2JhbERlY2xzOwotICBmb3IgKERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIEkgPSBUVS0+bm9sb2FkX2RlY2xzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IFRVLT5ub2xvYWRfZGVjbHNfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBpZiAoISgqSSktPmlzRnJvbUFTVEZpbGUoKSkKLSAgICAgIE5ld0dsb2JhbERlY2xzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigoKkkpLT5nZXRLaW5kKCksIEdldERlY2xSZWYoKkkpKSk7CisgIGZvciAoY29uc3QgYXV0byAqSSA6IFRVLT5ub2xvYWRfZGVjbHMoKSkgeworICAgIGlmICghSS0+aXNGcm9tQVNURmlsZSgpKQorICAgICAgTmV3R2xvYmFsRGVjbHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEktPmdldEtpbmQoKSwgR2V0RGVjbFJlZihJKSkpOwogICB9CiAgIAogICBsbHZtOjpCaXRDb2RlQWJicmV2ICpBYnYgPSBuZXcgbGx2bTo6Qml0Q29kZUFiYnJldigpOwpAQCAtNDA1OSwxNCArNDEzOCwyNSBAQAogICAKICAgLy8gSWYgdGhlIHRyYW5zbGF0aW9uIHVuaXQgaGFzIGFuIGFub255bW91cyBuYW1lc3BhY2UsIGFuZCB3ZSBkb24ndCBhbHJlYWR5CiAgIC8vIGhhdmUgYW4gdXBkYXRlIGJsb2NrIGZvciBpdCwgd3JpdGUgaXQgYXMgYW4gdXBkYXRlIGJsb2NrLgorICAvLyBGSVhNRTogV2h5IGRvIHdlIG5vdCBkbyB0aGlzIGlmIHRoZXJlJ3MgYWxyZWFkeSBhbiB1cGRhdGUgYmxvY2s/CiAgIGlmIChOYW1lc3BhY2VEZWNsICpOUyA9IFRVLT5nZXRBbm9ueW1vdXNOYW1lc3BhY2UoKSkgewogICAgIEFTVFdyaXRlcjo6VXBkYXRlUmVjb3JkICZSZWNvcmQgPSBEZWNsVXBkYXRlc1tUVV07Ci0gICAgaWYgKFJlY29yZC5lbXB0eSgpKSB7Ci0gICAgICBSZWNvcmQucHVzaF9iYWNrKFVQRF9DWFhfQURERURfQU5PTllNT1VTX05BTUVTUEFDRSk7Ci0gICAgICBSZWNvcmQucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KE5TKSk7Ci0gICAgfQorICAgIGlmIChSZWNvcmQuZW1wdHkoKSkKKyAgICAgIFJlY29yZC5wdXNoX2JhY2soRGVjbFVwZGF0ZShVUERfQ1hYX0FEREVEX0FOT05ZTU9VU19OQU1FU1BBQ0UsIE5TKSk7CiAgIH0KIAorICAvLyBBZGQgdXBkYXRlIHJlY29yZHMgZm9yIGFsbCBtYW5nbGluZyBudW1iZXJzIGFuZCBzdGF0aWMgbG9jYWwgbnVtYmVycy4KKyAgLy8gVGhlc2UgYXJlbid0IHJlYWxseSB1cGRhdGUgcmVjb3JkcywgYnV0IHRoaXMgaXMgYSBjb252ZW5pZW50IHdheSBvZgorICAvLyB0YWdnaW5nIHRoaXMgcmFyZSBleHRyYSBkYXRhIG9udG8gdGhlIGRlY2xhcmF0aW9ucy4KKyAgZm9yIChjb25zdCBhdXRvICZOdW1iZXIgOiBDb250ZXh0Lk1hbmdsZU51bWJlcnMpCisgICAgaWYgKCFOdW1iZXIuZmlyc3QtPmlzRnJvbUFTVEZpbGUoKSkKKyAgICAgIERlY2xVcGRhdGVzW051bWJlci5maXJzdF0ucHVzaF9iYWNrKERlY2xVcGRhdGUoVVBEX01BTkdMSU5HX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyLnNlY29uZCkpOworICBmb3IgKGNvbnN0IGF1dG8gJk51bWJlciA6IENvbnRleHQuU3RhdGljTG9jYWxOdW1iZXJzKQorICAgIGlmICghTnVtYmVyLmZpcnN0LT5pc0Zyb21BU1RGaWxlKCkpCisgICAgICBEZWNsVXBkYXRlc1tOdW1iZXIuZmlyc3RdLnB1c2hfYmFjayhEZWNsVXBkYXRlKFVQRF9TVEFUSUNfTE9DQUxfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIuc2Vjb25kKSk7CisKICAgLy8gTWFrZSBzdXJlIHZpc2libGUgZGVjbHMsIGFkZGVkIHRvIERlY2xDb250ZXh0cyBwcmV2aW91c2x5IGxvYWRlZCBmcm9tCiAgIC8vIGFuIEFTVCBmaWxlLCBhcmUgcmVnaXN0ZXJlZCBmb3Igc2VyaWFsaXphdGlvbi4KICAgZm9yIChTbWFsbFZlY3RvckltcGw8Y29uc3QgRGVjbCAqPjo6aXRlcmF0b3IKQEAgLTQwOTAsOSArNDE4MCw2IEBACiAgICAgfQogICB9CiAKLSAgLy8gUmVzb2x2ZSBhbnkgZGVjbGFyYXRpb24gcG9pbnRlcnMgd2l0aGluIHRoZSBkZWNsYXJhdGlvbiB1cGRhdGVzIGJsb2NrLgotICBSZXNvbHZlRGVjbFVwZGF0ZXNCbG9ja3MoKTsKLSAgCiAgIC8vIEZvcm0gdGhlIHJlY29yZCBvZiBzcGVjaWFsIHR5cGVzLgogICBSZWNvcmREYXRhIFNwZWNpYWxUeXBlczsKICAgQWRkVHlwZVJlZihDb250ZXh0LmdldFJhd0NGQ29uc3RhbnRTdHJpbmdUeXBlKCksIFNwZWNpYWxUeXBlcyk7CkBAIC00MTA0LDMwICs0MTkxLDYgQEAKICAgQWRkVHlwZVJlZihDb250ZXh0Lk9iakNTZWxSZWRlZmluaXRpb25UeXBlLCBTcGVjaWFsVHlwZXMpOwogICBBZGRUeXBlUmVmKENvbnRleHQuZ2V0dWNvbnRleHRfdFR5cGUoKSwgU3BlY2lhbFR5cGVzKTsKIAotICAvLyBLZWVwIHdyaXRpbmcgdHlwZXMgYW5kIGRlY2xhcmF0aW9ucyB1bnRpbCBhbGwgdHlwZXMgYW5kCi0gIC8vIGRlY2xhcmF0aW9ucyBoYXZlIGJlZW4gd3JpdHRlbi4KLSAgU3RyZWFtLkVudGVyU3ViYmxvY2soREVDTFRZUEVTX0JMT0NLX0lELCBOVU1fQUxMT1dFRF9BQkJSRVZTX1NJWkUpOwotICBXcml0ZURlY2xzQmxvY2tBYmJyZXZzKCk7Ci0gIGZvciAoRGVjbHNUb1Jld3JpdGVUeTo6aXRlcmF0b3IgSSA9IERlY2xzVG9SZXdyaXRlLmJlZ2luKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBEZWNsc1RvUmV3cml0ZS5lbmQoKTsgCi0gICAgICAgSSAhPSBFOyArK0kpCi0gICAgRGVjbFR5cGVzVG9FbWl0LnB1c2goY29uc3RfY2FzdDxEZWNsKj4oKkkpKTsKLSAgd2hpbGUgKCFEZWNsVHlwZXNUb0VtaXQuZW1wdHkoKSkgewotICAgIERlY2xPclR5cGUgRE9UID0gRGVjbFR5cGVzVG9FbWl0LmZyb250KCk7Ci0gICAgRGVjbFR5cGVzVG9FbWl0LnBvcCgpOwotICAgIGlmIChET1QuaXNUeXBlKCkpCi0gICAgICBXcml0ZVR5cGUoRE9ULmdldFR5cGUoKSk7Ci0gICAgZWxzZQotICAgICAgV3JpdGVEZWNsKENvbnRleHQsIERPVC5nZXREZWNsKCkpOwotICB9Ci0gIFN0cmVhbS5FeGl0QmxvY2soKTsKLQotICBEb25lV3JpdGluZ0RlY2xzQW5kVHlwZXMgPSB0cnVlOwotCi0gIFdyaXRlRmlsZURlY2xJRHNNYXAoKTsKLSAgV3JpdGVTb3VyY2VNYW5hZ2VyQmxvY2soQ29udGV4dC5nZXRTb3VyY2VNYW5hZ2VyKCksIFBQLCBpc3lzcm9vdCk7Ci0gIFdyaXRlQ29tbWVudHMoKTsKLSAgCiAgIGlmIChDaGFpbikgewogICAgIC8vIFdyaXRlIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgb3VyIG1vZHVsZSBkZXBlbmRlbmNpZXMgYW5kIGhvdwogICAgIC8vIGVhY2ggb2YgdGhvc2UgbW9kdWxlcyB3ZXJlIG1hcHBlZCBpbnRvIG91ciBvd24gb2Zmc2V0L0lEIHNwYWNlLCBzbyB0aGF0CkBAIC00MTU0LDE3ICs0MjE3LDE5IEBACiAgICAgICBmb3IgKE1vZHVsZU1hbmFnZXI6Ok1vZHVsZUNvbnN0SXRlcmF0b3IgTSA9IENoYWluLT5Nb2R1bGVNZ3IuYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRW5kID0gQ2hhaW4tPk1vZHVsZU1nci5lbmQoKTsKICAgICAgICAgICAgTSAhPSBNRW5kOyArK00pIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgICAgIGVuZGlhbjo6V3JpdGVyPGxpdHRsZT4gTEUoT3V0KTsKICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lID0gKCpNKS0+RmlsZU5hbWU7Ci0gICAgICAgIGlvOjpFbWl0MTYoT3V0LCBGaWxlTmFtZS5zaXplKCkpOworICAgICAgICBMRS53cml0ZTx1aW50MTZfdD4oRmlsZU5hbWUuc2l6ZSgpKTsKICAgICAgICAgT3V0LndyaXRlKEZpbGVOYW1lLmRhdGEoKSwgRmlsZU5hbWUuc2l6ZSgpKTsKLSAgICAgICAgaW86OkVtaXQzMihPdXQsICgqTSktPlNMb2NFbnRyeUJhc2VPZmZzZXQpOwotICAgICAgICBpbzo6RW1pdDMyKE91dCwgKCpNKS0+QmFzZUlkZW50aWZpZXJJRCk7Ci0gICAgICAgIGlvOjpFbWl0MzIoT3V0LCAoKk0pLT5CYXNlTWFjcm9JRCk7Ci0gICAgICAgIGlvOjpFbWl0MzIoT3V0LCAoKk0pLT5CYXNlUHJlcHJvY2Vzc2VkRW50aXR5SUQpOwotICAgICAgICBpbzo6RW1pdDMyKE91dCwgKCpNKS0+QmFzZVN1Ym1vZHVsZUlEKTsKLSAgICAgICAgaW86OkVtaXQzMihPdXQsICgqTSktPkJhc2VTZWxlY3RvcklEKTsKLSAgICAgICAgaW86OkVtaXQzMihPdXQsICgqTSktPkJhc2VEZWNsSUQpOwotICAgICAgICBpbzo6RW1pdDMyKE91dCwgKCpNKS0+QmFzZVR5cGVJbmRleCk7CisgICAgICAgIExFLndyaXRlPHVpbnQzMl90PigoKk0pLT5TTG9jRW50cnlCYXNlT2Zmc2V0KTsKKyAgICAgICAgTEUud3JpdGU8dWludDMyX3Q+KCgqTSktPkJhc2VJZGVudGlmaWVySUQpOworICAgICAgICBMRS53cml0ZTx1aW50MzJfdD4oKCpNKS0+QmFzZU1hY3JvSUQpOworICAgICAgICBMRS53cml0ZTx1aW50MzJfdD4oKCpNKS0+QmFzZVByZXByb2Nlc3NlZEVudGl0eUlEKTsKKyAgICAgICAgTEUud3JpdGU8dWludDMyX3Q+KCgqTSktPkJhc2VTdWJtb2R1bGVJRCk7CisgICAgICAgIExFLndyaXRlPHVpbnQzMl90PigoKk0pLT5CYXNlU2VsZWN0b3JJRCk7CisgICAgICAgIExFLndyaXRlPHVpbnQzMl90PigoKk0pLT5CYXNlRGVjbElEKTsKKyAgICAgICAgTEUud3JpdGU8dWludDMyX3Q+KCgqTSktPkJhc2VUeXBlSW5kZXgpOwogICAgICAgfQogICAgIH0KICAgICBSZWNvcmQuY2xlYXIoKTsKQEAgLTQxNzIsNiArNDIzNyw0MSBAQAogICAgIFN0cmVhbS5FbWl0UmVjb3JkV2l0aEJsb2IoTW9kdWxlT2Zmc2V0TWFwQWJicmV2LCBSZWNvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIuZGF0YSgpLCBCdWZmZXIuc2l6ZSgpKTsKICAgfQorCisgIFJlY29yZERhdGEgRGVjbFVwZGF0ZXNPZmZzZXRzUmVjb3JkOworCisgIC8vIEtlZXAgd3JpdGluZyB0eXBlcywgZGVjbGFyYXRpb25zLCBhbmQgZGVjbGFyYXRpb24gdXBkYXRlIHJlY29yZHMKKyAgLy8gdW50aWwgd2UndmUgZW1pdHRlZCBhbGwgb2YgdGhlbS4KKyAgU3RyZWFtLkVudGVyU3ViYmxvY2soREVDTFRZUEVTX0JMT0NLX0lELCBOVU1fQUxMT1dFRF9BQkJSRVZTX1NJWkUpOworICBXcml0ZURlY2xzQmxvY2tBYmJyZXZzKCk7CisgIGZvciAoRGVjbHNUb1Jld3JpdGVUeTo6aXRlcmF0b3IgSSA9IERlY2xzVG9SZXdyaXRlLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IERlY2xzVG9SZXdyaXRlLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIERlY2xUeXBlc1RvRW1pdC5wdXNoKGNvbnN0X2Nhc3Q8RGVjbCo+KCpJKSk7CisgIGRvIHsKKyAgICBXcml0ZURlY2xVcGRhdGVzQmxvY2tzKERlY2xVcGRhdGVzT2Zmc2V0c1JlY29yZCk7CisgICAgd2hpbGUgKCFEZWNsVHlwZXNUb0VtaXQuZW1wdHkoKSkgeworICAgICAgRGVjbE9yVHlwZSBET1QgPSBEZWNsVHlwZXNUb0VtaXQuZnJvbnQoKTsKKyAgICAgIERlY2xUeXBlc1RvRW1pdC5wb3AoKTsKKyAgICAgIGlmIChET1QuaXNUeXBlKCkpCisgICAgICAgIFdyaXRlVHlwZShET1QuZ2V0VHlwZSgpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgV3JpdGVEZWNsKENvbnRleHQsIERPVC5nZXREZWNsKCkpOworICAgIH0KKyAgfSB3aGlsZSAoIURlY2xVcGRhdGVzLmVtcHR5KCkpOworICBTdHJlYW0uRXhpdEJsb2NrKCk7CisKKyAgRG9uZVdyaXRpbmdEZWNsc0FuZFR5cGVzID0gdHJ1ZTsKKworICAvLyBUaGVzZSB0aGluZ3MgY2FuIG9ubHkgYmUgZG9uZSBvbmNlIHdlJ3ZlIHdyaXR0ZW4gb3V0IGRlY2xzIGFuZCB0eXBlcy4KKyAgV3JpdGVUeXBlRGVjbE9mZnNldHMoKTsKKyAgaWYgKCFEZWNsVXBkYXRlc09mZnNldHNSZWNvcmQuZW1wdHkoKSkKKyAgICBTdHJlYW0uRW1pdFJlY29yZChERUNMX1VQREFURV9PRkZTRVRTLCBEZWNsVXBkYXRlc09mZnNldHNSZWNvcmQpOworICBXcml0ZUNYWEJhc2VTcGVjaWZpZXJzT2Zmc2V0cygpOworICBXcml0ZUZpbGVEZWNsSURzTWFwKCk7CisgIFdyaXRlU291cmNlTWFuYWdlckJsb2NrKENvbnRleHQuZ2V0U291cmNlTWFuYWdlcigpLCBQUCwgaXN5c3Jvb3QpOworCisgIFdyaXRlQ29tbWVudHMoKTsKICAgV3JpdGVQcmVwcm9jZXNzb3IoUFAsIGlzTW9kdWxlKTsKICAgV3JpdGVIZWFkZXJTZWFyY2goUFAuZ2V0SGVhZGVyU2VhcmNoSW5mbygpLCBpc3lzcm9vdCk7CiAgIFdyaXRlU2VsZWN0b3JzKFNlbWFSZWYpOwpAQCAtNDE3OSwxMiArNDI3OSw4IEBACiAgIFdyaXRlSWRlbnRpZmllclRhYmxlKFBQLCBTZW1hUmVmLklkUmVzb2x2ZXIsIGlzTW9kdWxlKTsKICAgV3JpdGVGUFByYWdtYU9wdGlvbnMoU2VtYVJlZi5nZXRGUE9wdGlvbnMoKSk7CiAgIFdyaXRlT3BlbkNMRXh0ZW5zaW9ucyhTZW1hUmVmKTsKLQotICBXcml0ZVR5cGVEZWNsT2Zmc2V0cygpOwogICBXcml0ZVByYWdtYURpYWdub3N0aWNNYXBwaW5ncyhDb250ZXh0LmdldERpYWdub3N0aWNzKCksIGlzTW9kdWxlKTsKIAotICBXcml0ZUNYWEJhc2VTcGVjaWZpZXJzT2Zmc2V0cygpOwotICAKICAgLy8gSWYgd2UncmUgZW1pdHRpbmcgYSBtb2R1bGUsIHdyaXRlIG91dCB0aGUgc3VibW9kdWxlIGluZm9ybWF0aW9uLiAgCiAgIGlmIChXcml0aW5nTW9kdWxlKQogICAgIFdyaXRlU3VibW9kdWxlcyhXcml0aW5nTW9kdWxlKTsKQEAgLTQxOTIsOCArNDI4OCw4IEBACiAgIFN0cmVhbS5FbWl0UmVjb3JkKFNQRUNJQUxfVFlQRVMsIFNwZWNpYWxUeXBlcyk7CiAKICAgLy8gV3JpdGUgdGhlIHJlY29yZCBjb250YWluaW5nIGV4dGVybmFsLCB1bm5hbWVkIGRlZmluaXRpb25zLgotICBpZiAoIUV4dGVybmFsRGVmaW5pdGlvbnMuZW1wdHkoKSkKLSAgICBTdHJlYW0uRW1pdFJlY29yZChFWFRFUk5BTF9ERUZJTklUSU9OUywgRXh0ZXJuYWxEZWZpbml0aW9ucyk7CisgIGlmICghRWFnZXJseURlc2VyaWFsaXplZERlY2xzLmVtcHR5KCkpCisgICAgU3RyZWFtLkVtaXRSZWNvcmQoRUFHRVJMWV9ERVNFUklBTElaRURfREVDTFMsIEVhZ2VybHlEZXNlcmlhbGl6ZWREZWNscyk7CiAKICAgLy8gV3JpdGUgdGhlIHJlY29yZCBjb250YWluaW5nIHRlbnRhdGl2ZSBkZWZpbml0aW9ucy4KICAgaWYgKCFUZW50YXRpdmVEZWZpbml0aW9ucy5lbXB0eSgpKQpAQCAtNDI1OCwyNyArNDM1NCw0MSBAQAogCiAgIGlmICghV3JpdGluZ01vZHVsZSkgewogICAgIC8vIFdyaXRlIHRoZSBzdWJtb2R1bGVzIHRoYXQgd2VyZSBpbXBvcnRlZCwgaWYgYW55LgotICAgIFJlY29yZERhdGEgSW1wb3J0ZWRNb2R1bGVzOwotICAgIGZvciAoQVNUQ29udGV4dDo6aW1wb3J0X2l0ZXJhdG9yIEkgPSBDb250ZXh0LmxvY2FsX2ltcG9ydF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFbmQgPSBDb250ZXh0LmxvY2FsX2ltcG9ydF9lbmQoKTsKLSAgICAgICAgIEkgIT0gSUVuZDsgKytJKSB7CisgICAgc3RydWN0IE1vZHVsZUluZm8geworICAgICAgdWludDY0X3QgSUQ7CisgICAgICBNb2R1bGUgKk07CisgICAgICBNb2R1bGVJbmZvKHVpbnQ2NF90IElELCBNb2R1bGUgKk0pIDogSUQoSUQpLCBNKE0pIHt9CisgICAgfTsKKyAgICBsbHZtOjpTbWFsbFZlY3RvcjxNb2R1bGVJbmZvLCA2ND4gSW1wb3J0czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBDb250ZXh0LmxvY2FsX2ltcG9ydHMoKSkgewogICAgICAgYXNzZXJ0KFN1Ym1vZHVsZUlEcy5maW5kKEktPmdldEltcG9ydGVkTW9kdWxlKCkpICE9IFN1Ym1vZHVsZUlEcy5lbmQoKSk7Ci0gICAgICBJbXBvcnRlZE1vZHVsZXMucHVzaF9iYWNrKFN1Ym1vZHVsZUlEc1tJLT5nZXRJbXBvcnRlZE1vZHVsZSgpXSk7CisgICAgICBJbXBvcnRzLnB1c2hfYmFjayhNb2R1bGVJbmZvKFN1Ym1vZHVsZUlEc1tJLT5nZXRJbXBvcnRlZE1vZHVsZSgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJLT5nZXRJbXBvcnRlZE1vZHVsZSgpKSk7CiAgICAgfQotICAgIGlmICghSW1wb3J0ZWRNb2R1bGVzLmVtcHR5KCkpIHsKLSAgICAgIC8vIFNvcnQgbW9kdWxlIElEcy4KLSAgICAgIGxsdm06OmFycmF5X3BvZF9zb3J0KEltcG9ydGVkTW9kdWxlcy5iZWdpbigpLCBJbXBvcnRlZE1vZHVsZXMuZW5kKCkpOwotICAgICAgCi0gICAgICAvLyBVbmlxdWUgbW9kdWxlIElEcy4KLSAgICAgIEltcG9ydGVkTW9kdWxlcy5lcmFzZShzdGQ6OnVuaXF1ZShJbXBvcnRlZE1vZHVsZXMuYmVnaW4oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0ZWRNb2R1bGVzLmVuZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRlZE1vZHVsZXMuZW5kKCkpOwotICAgICAgCisKKyAgICBpZiAoIUltcG9ydHMuZW1wdHkoKSkgeworICAgICAgYXV0byBDbXAgPSBbXShjb25zdCBNb2R1bGVJbmZvICZBLCBjb25zdCBNb2R1bGVJbmZvICZCKSB7CisgICAgICAgIHJldHVybiBBLklEIDwgQi5JRDsKKyAgICAgIH07CisKKyAgICAgIC8vIFNvcnQgYW5kIGRlZHVwbGljYXRlIG1vZHVsZSBJRHMuCisgICAgICBzdGQ6OnNvcnQoSW1wb3J0cy5iZWdpbigpLCBJbXBvcnRzLmVuZCgpLCBDbXApOworICAgICAgSW1wb3J0cy5lcmFzZShzdGQ6OnVuaXF1ZShJbXBvcnRzLmJlZ2luKCksIEltcG9ydHMuZW5kKCksIENtcCksCisgICAgICAgICAgICAgICAgICAgIEltcG9ydHMuZW5kKCkpOworCisgICAgICBSZWNvcmREYXRhIEltcG9ydGVkTW9kdWxlczsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmSW1wb3J0IDogSW1wb3J0cykgeworICAgICAgICBJbXBvcnRlZE1vZHVsZXMucHVzaF9iYWNrKEltcG9ydC5JRCk7CisgICAgICAgIC8vIEZJWE1FOiBJZiB0aGUgbW9kdWxlIGhhcyBtYWNyb3MgaW1wb3J0ZWQgdGhlbiBsYXRlciBoYXMgZGVjbGFyYXRpb25zCisgICAgICAgIC8vIGltcG9ydGVkLCB0aGlzIGxvY2F0aW9uIHdvbid0IGJlIHRoZSByaWdodCBvbmUgYXMgYSBsb2NhdGlvbiBmb3IgdGhlCisgICAgICAgIC8vIGRlY2xhcmF0aW9uIGltcG9ydHMuCisgICAgICAgIEFkZFNvdXJjZUxvY2F0aW9uKEltcG9ydC5NLT5NYWNyb1Zpc2liaWxpdHlMb2MsIEltcG9ydGVkTW9kdWxlcyk7CisgICAgICB9CisKICAgICAgIFN0cmVhbS5FbWl0UmVjb3JkKElNUE9SVEVEX01PRFVMRVMsIEltcG9ydGVkTW9kdWxlcyk7CiAgICAgfQogICB9CiAKLSAgV3JpdGVEZWNsVXBkYXRlc0Jsb2NrcygpOwogICBXcml0ZURlY2xSZXBsYWNlbWVudHNCbG9jaygpOwogICBXcml0ZVJlZGVjbGFyYXRpb25zKCk7CiAgIFdyaXRlTWVyZ2VkRGVjbHMoKTsKQEAgLTQyOTUsNjQgKzQ0MDUsNzkgQEAKICAgU3RyZWFtLkV4aXRCbG9jaygpOwogfQogCi0vLy8gXGJyaWVmIEdvIHRocm91Z2ggdGhlIGRlY2xhcmF0aW9uIHVwZGF0ZSBibG9ja3MgYW5kIHJlc29sdmUgZGVjbGFyYXRpb24KLS8vLyBwb2ludGVycyBpbnRvIGRlY2xhcmF0aW9uIElEcy4KLXZvaWQgQVNUV3JpdGVyOjpSZXNvbHZlRGVjbFVwZGF0ZXNCbG9ja3MoKSB7Ci0gIGZvciAoRGVjbFVwZGF0ZU1hcDo6aXRlcmF0b3IKLSAgICAgICBJID0gRGVjbFVwZGF0ZXMuYmVnaW4oKSwgRSA9IERlY2xVcGRhdGVzLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGNvbnN0IERlY2wgKkQgPSBJLT5maXJzdDsKLSAgICBVcGRhdGVSZWNvcmQgJlVSZWMgPSBJLT5zZWNvbmQ7Ci0gICAgCi0gICAgaWYgKGlzUmV3cml0dGVuKEQpKQotICAgICAgY29udGludWU7IC8vIFRoZSBkZWNsIHdpbGwgYmUgd3JpdHRlbiBjb21wbGV0ZWx5Ci0KLSAgICB1bnNpZ25lZCBJZHggPSAwLCBOID0gVVJlYy5zaXplKCk7Ci0gICAgd2hpbGUgKElkeCA8IE4pIHsKLSAgICAgIHN3aXRjaCAoKERlY2xVcGRhdGVLaW5kKVVSZWNbSWR4KytdKSB7Ci0gICAgICBjYXNlIFVQRF9DWFhfQURERURfSU1QTElDSVRfTUVNQkVSOgotICAgICAgY2FzZSBVUERfQ1hYX0FEREVEX1RFTVBMQVRFX1NQRUNJQUxJWkFUSU9OOgotICAgICAgY2FzZSBVUERfQ1hYX0FEREVEX0FOT05ZTU9VU19OQU1FU1BBQ0U6Ci0gICAgICAgIFVSZWNbSWR4XSA9IEdldERlY2xSZWYocmVpbnRlcnByZXRfY2FzdDxEZWNsICo+KFVSZWNbSWR4XSkpOwotICAgICAgICArK0lkeDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVVBEX0NYWF9JTlNUQU5USUFURURfU1RBVElDX0RBVEFfTUVNQkVSOgotICAgICAgY2FzZSBVUERfREVDTF9NQVJLRURfVVNFRDoKLSAgICAgICAgKytJZHg7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFVQRF9DWFhfREVEVUNFRF9SRVRVUk5fVFlQRToKLSAgICAgICAgVVJlY1tJZHhdID0gR2V0T3JDcmVhdGVUeXBlSUQoCi0gICAgICAgICAgICBRdWFsVHlwZTo6Z2V0RnJvbU9wYXF1ZVB0cihyZWludGVycHJldF9jYXN0PHZvaWQgKj4oVVJlY1tJZHhdKSkpOwotICAgICAgICArK0lkeDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQVNUV3JpdGVyOjpXcml0ZURlY2xVcGRhdGVzQmxvY2tzKCkgewordm9pZCBBU1RXcml0ZXI6OldyaXRlRGVjbFVwZGF0ZXNCbG9ja3MoUmVjb3JkRGF0YUltcGwgJk9mZnNldHNSZWNvcmQpIHsKICAgaWYgKERlY2xVcGRhdGVzLmVtcHR5KCkpCiAgICAgcmV0dXJuOwogCi0gIFJlY29yZERhdGEgT2Zmc2V0c1JlY29yZDsKLSAgU3RyZWFtLkVudGVyU3ViYmxvY2soREVDTF9VUERBVEVTX0JMT0NLX0lELCBOVU1fQUxMT1dFRF9BQkJSRVZTX1NJWkUpOwotICBmb3IgKERlY2xVcGRhdGVNYXA6Oml0ZXJhdG9yCi0gICAgICAgICBJID0gRGVjbFVwZGF0ZXMuYmVnaW4oKSwgRSA9IERlY2xVcGRhdGVzLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGNvbnN0IERlY2wgKkQgPSBJLT5maXJzdDsKLSAgICBVcGRhdGVSZWNvcmQgJlVSZWMgPSBJLT5zZWNvbmQ7CisgIERlY2xVcGRhdGVNYXAgTG9jYWxVcGRhdGVzOworICBMb2NhbFVwZGF0ZXMuc3dhcChEZWNsVXBkYXRlcyk7CiAKKyAgZm9yIChhdXRvICZEZWNsVXBkYXRlIDogTG9jYWxVcGRhdGVzKSB7CisgICAgY29uc3QgRGVjbCAqRCA9IERlY2xVcGRhdGUuZmlyc3Q7CiAgICAgaWYgKGlzUmV3cml0dGVuKEQpKQogICAgICAgY29udGludWU7IC8vIFRoZSBkZWNsIHdpbGwgYmUgd3JpdHRlbiBjb21wbGV0ZWx5LG5vIG5lZWQgdG8gc3RvcmUgdXBkYXRlcy4KIAotICAgIHVpbnQ2NF90IE9mZnNldCA9IFN0cmVhbS5HZXRDdXJyZW50Qml0Tm8oKTsKLSAgICBTdHJlYW0uRW1pdFJlY29yZChERUNMX1VQREFURVMsIFVSZWMpOwotCiAgICAgT2Zmc2V0c1JlY29yZC5wdXNoX2JhY2soR2V0RGVjbFJlZihEKSk7Ci0gICAgT2Zmc2V0c1JlY29yZC5wdXNoX2JhY2soT2Zmc2V0KTsKKyAgICBPZmZzZXRzUmVjb3JkLnB1c2hfYmFjayhTdHJlYW0uR2V0Q3VycmVudEJpdE5vKCkpOworCisgICAgYm9vbCBIYXNVcGRhdGVkQm9keSA9IGZhbHNlOworICAgIFJlY29yZERhdGEgUmVjb3JkOworICAgIGZvciAoYXV0byAmVXBkYXRlIDogRGVjbFVwZGF0ZS5zZWNvbmQpIHsKKyAgICAgIERlY2xVcGRhdGVLaW5kIEtpbmQgPSAoRGVjbFVwZGF0ZUtpbmQpVXBkYXRlLmdldEtpbmQoKTsKKworICAgICAgUmVjb3JkLnB1c2hfYmFjayhLaW5kKTsKKyAgICAgIHN3aXRjaCAoS2luZCkgeworICAgICAgY2FzZSBVUERfQ1hYX0FEREVEX0lNUExJQ0lUX01FTUJFUjoKKyAgICAgIGNhc2UgVVBEX0NYWF9BRERFRF9URU1QTEFURV9TUEVDSUFMSVpBVElPTjoKKyAgICAgIGNhc2UgVVBEX0NYWF9BRERFRF9BTk9OWU1PVVNfTkFNRVNQQUNFOgorICAgICAgICBSZWNvcmQucHVzaF9iYWNrKEdldERlY2xSZWYoVXBkYXRlLmdldERlY2woKSkpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBVUERfQ1hYX0lOU1RBTlRJQVRFRF9TVEFUSUNfREFUQV9NRU1CRVI6CisgICAgICAgIEFkZFNvdXJjZUxvY2F0aW9uKFVwZGF0ZS5nZXRMb2MoKSwgUmVjb3JkKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVVBEX0NYWF9JTlNUQU5USUFURURfRlVOQ1RJT05fREVGSU5JVElPTjoKKyAgICAgICAgLy8gQW4gdXBkYXRlZCBib2R5IGlzIGVtaXR0ZWQgbGFzdCwgc28gdGhhdCB0aGUgcmVhZGVyIGRvZXNuJ3QgbmVlZAorICAgICAgICAvLyB0byBza2lwIG92ZXIgdGhlIGxhenkgYm9keSB0byByZWFjaCBzdGF0ZW1lbnRzIGZvciBvdGhlciByZWNvcmRzLgorICAgICAgICBSZWNvcmQucG9wX2JhY2soKTsKKyAgICAgICAgSGFzVXBkYXRlZEJvZHkgPSB0cnVlOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBVUERfQ1hYX1JFU09MVkVEX0VYQ0VQVElPTl9TUEVDOgorICAgICAgICBhZGRFeGNlcHRpb25TcGVjKAorICAgICAgICAgICAgKnRoaXMsCisgICAgICAgICAgICBjYXN0PEZ1bmN0aW9uRGVjbD4oRCktPmdldFR5cGUoKS0+Y2FzdEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpLAorICAgICAgICAgICAgUmVjb3JkKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVVBEX0NYWF9ERURVQ0VEX1JFVFVSTl9UWVBFOgorICAgICAgICBSZWNvcmQucHVzaF9iYWNrKEdldE9yQ3JlYXRlVHlwZUlEKFVwZGF0ZS5nZXRUeXBlKCkpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVVBEX0RFQ0xfTUFSS0VEX1VTRUQ6CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFVQRF9NQU5HTElOR19OVU1CRVI6CisgICAgICBjYXNlIFVQRF9TVEFUSUNfTE9DQUxfTlVNQkVSOgorICAgICAgICBSZWNvcmQucHVzaF9iYWNrKFVwZGF0ZS5nZXROdW1iZXIoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChIYXNVcGRhdGVkQm9keSkgeworICAgICAgY29uc3QgRnVuY3Rpb25EZWNsICpEZWYgPSBjYXN0PEZ1bmN0aW9uRGVjbD4oRCk7CisgICAgICBSZWNvcmQucHVzaF9iYWNrKFVQRF9DWFhfSU5TVEFOVElBVEVEX0ZVTkNUSU9OX0RFRklOSVRJT04pOworICAgICAgUmVjb3JkLnB1c2hfYmFjayhEZWYtPmlzSW5saW5lZCgpKTsKKyAgICAgIEFkZFNvdXJjZUxvY2F0aW9uKERlZi0+Z2V0SW5uZXJMb2NTdGFydCgpLCBSZWNvcmQpOworICAgICAgQWRkRnVuY3Rpb25EZWZpbml0aW9uKERlZiwgUmVjb3JkKTsKKyAgICB9CisKKyAgICBTdHJlYW0uRW1pdFJlY29yZChERUNMX1VQREFURVMsIFJlY29yZCk7CisKKyAgICAvLyBGbHVzaCBhbnkgc3RhdGVtZW50cyB0aGF0IHdlcmUgd3JpdHRlbiBhcyBwYXJ0IG9mIHRoaXMgdXBkYXRlIHJlY29yZC4KKyAgICBGbHVzaFN0bXRzKCk7CiAgIH0KLSAgU3RyZWFtLkV4aXRCbG9jaygpOwotICBTdHJlYW0uRW1pdFJlY29yZChERUNMX1VQREFURV9PRkZTRVRTLCBPZmZzZXRzUmVjb3JkKTsKIH0KIAogdm9pZCBBU1RXcml0ZXI6OldyaXRlRGVjbFJlcGxhY2VtZW50c0Jsb2NrKCkgewpAQCAtNDY0OCw3ICs0NzczLDcgQEAKICAgYXNzZXJ0KFNNLmlzTG9jYWxTb3VyY2VMb2NhdGlvbihGaWxlTG9jKSk7CiAgIEZpbGVJRCBGSUQ7CiAgIHVuc2lnbmVkIE9mZnNldDsKLSAgbGx2bTo6dGllKEZJRCwgT2Zmc2V0KSA9IFNNLmdldERlY29tcG9zZWRMb2MoRmlsZUxvYyk7CisgIHN0ZDo6dGllKEZJRCwgT2Zmc2V0KSA9IFNNLmdldERlY29tcG9zZWRMb2MoRmlsZUxvYyk7CiAgIGlmIChGSUQuaXNJbnZhbGlkKCkpCiAgICAgcmV0dXJuOwogICBhc3NlcnQoU00uZ2V0U0xvY0VudHJ5KEZJRCkuaXNGaWxlKCkpOwpAQCAtNTA4NCw2ICs1MjA5LDcgQEAKICAgUmVjb3JkLnB1c2hfYmFjayhEYXRhLkhhc1Byb3RlY3RlZEZpZWxkcyk7CiAgIFJlY29yZC5wdXNoX2JhY2soRGF0YS5IYXNQdWJsaWNGaWVsZHMpOwogICBSZWNvcmQucHVzaF9iYWNrKERhdGEuSGFzTXV0YWJsZUZpZWxkcyk7CisgIFJlY29yZC5wdXNoX2JhY2soRGF0YS5IYXNWYXJpYW50TWVtYmVycyk7CiAgIFJlY29yZC5wdXNoX2JhY2soRGF0YS5IYXNPbmx5Q01lbWJlcnMpOwogICBSZWNvcmQucHVzaF9iYWNrKERhdGEuSGFzSW5DbGFzc0luaXRpYWxpemVyKTsKICAgUmVjb3JkLnB1c2hfYmFjayhEYXRhLkhhc1VuaW5pdGlhbGl6ZWRSZWZlcmVuY2VNZW1iZXIpOwpAQCAtNTI2Niw5ICs1MzkyLDcgQEAKIAogICAvLyBBIGRlY2wgY29taW5nIGZyb20gUENIIHdhcyBtb2RpZmllZC4KICAgYXNzZXJ0KFJELT5pc0NvbXBsZXRlRGVmaW5pdGlvbigpKTsKLSAgVXBkYXRlUmVjb3JkICZSZWNvcmQgPSBEZWNsVXBkYXRlc1tSRF07Ci0gIFJlY29yZC5wdXNoX2JhY2soVVBEX0NYWF9BRERFRF9JTVBMSUNJVF9NRU1CRVIpOwotICBSZWNvcmQucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KEQpKTsKKyAgRGVjbFVwZGF0ZXNbUkRdLnB1c2hfYmFjayhEZWNsVXBkYXRlKFVQRF9DWFhfQURERURfSU1QTElDSVRfTUVNQkVSLCBEKSk7CiB9CiAKIHZvaWQgQVNUV3JpdGVyOjpBZGRlZENYWFRlbXBsYXRlU3BlY2lhbGl6YXRpb24oY29uc3QgQ2xhc3NUZW1wbGF0ZURlY2wgKlRELApAQCAtNTI3OSw5ICs1NDAzLDggQEAKICAgaWYgKCEoIUQtPmlzRnJvbUFTVEZpbGUoKSAmJiBURC0+aXNGcm9tQVNURmlsZSgpKSkKICAgICByZXR1cm47IC8vIE5vdCBhIHNvdXJjZSBzcGVjaWFsaXphdGlvbiBhZGRlZCB0byBhIHRlbXBsYXRlIGZyb20gUENILgogCi0gIFVwZGF0ZVJlY29yZCAmUmVjb3JkID0gRGVjbFVwZGF0ZXNbVERdOwotICBSZWNvcmQucHVzaF9iYWNrKFVQRF9DWFhfQURERURfVEVNUExBVEVfU1BFQ0lBTElaQVRJT04pOwotICBSZWNvcmQucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KEQpKTsKKyAgRGVjbFVwZGF0ZXNbVERdLnB1c2hfYmFjayhEZWNsVXBkYXRlKFVQRF9DWFhfQURERURfVEVNUExBVEVfU1BFQ0lBTElaQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEKSk7CiB9CiAKIHZvaWQgQVNUV3JpdGVyOjpBZGRlZENYWFRlbXBsYXRlU3BlY2lhbGl6YXRpb24oCkBAIC01MjkyLDkgKzU0MTUsOCBAQAogICBpZiAoISghRC0+aXNGcm9tQVNURmlsZSgpICYmIFRELT5pc0Zyb21BU1RGaWxlKCkpKQogICAgIHJldHVybjsgLy8gTm90IGEgc291cmNlIHNwZWNpYWxpemF0aW9uIGFkZGVkIHRvIGEgdGVtcGxhdGUgZnJvbSBQQ0guCiAKLSAgVXBkYXRlUmVjb3JkICZSZWNvcmQgPSBEZWNsVXBkYXRlc1tURF07Ci0gIFJlY29yZC5wdXNoX2JhY2soVVBEX0NYWF9BRERFRF9URU1QTEFURV9TUEVDSUFMSVpBVElPTik7Ci0gIFJlY29yZC5wdXNoX2JhY2socmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdD4oRCkpOworICBEZWNsVXBkYXRlc1tURF0ucHVzaF9iYWNrKERlY2xVcGRhdGUoVVBEX0NYWF9BRERFRF9URU1QTEFURV9TUEVDSUFMSVpBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQpKTsKIH0KIAogdm9pZCBBU1RXcml0ZXI6OkFkZGVkQ1hYVGVtcGxhdGVTcGVjaWFsaXphdGlvbihjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqVEQsCkBAIC01MzA1LDkgKzU0MjcsMTcgQEAKICAgaWYgKCEoIUQtPmlzRnJvbUFTVEZpbGUoKSAmJiBURC0+aXNGcm9tQVNURmlsZSgpKSkKICAgICByZXR1cm47IC8vIE5vdCBhIHNvdXJjZSBzcGVjaWFsaXphdGlvbiBhZGRlZCB0byBhIHRlbXBsYXRlIGZyb20gUENILgogCi0gIFVwZGF0ZVJlY29yZCAmUmVjb3JkID0gRGVjbFVwZGF0ZXNbVERdOwotICBSZWNvcmQucHVzaF9iYWNrKFVQRF9DWFhfQURERURfVEVNUExBVEVfU1BFQ0lBTElaQVRJT04pOwotICBSZWNvcmQucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KEQpKTsKKyAgRGVjbFVwZGF0ZXNbVERdLnB1c2hfYmFjayhEZWNsVXBkYXRlKFVQRF9DWFhfQURERURfVEVNUExBVEVfU1BFQ0lBTElaQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEKSk7Cit9CisKK3ZvaWQgQVNUV3JpdGVyOjpSZXNvbHZlZEV4Y2VwdGlvblNwZWMoY29uc3QgRnVuY3Rpb25EZWNsICpGRCkgeworICBhc3NlcnQoIVdyaXRpbmdBU1QgJiYgIkFscmVhZHkgd3JpdGluZyB0aGUgQVNUISIpOworICBGRCA9IEZELT5nZXRDYW5vbmljYWxEZWNsKCk7CisgIGlmICghRkQtPmlzRnJvbUFTVEZpbGUoKSkKKyAgICByZXR1cm47IC8vIE5vdCBhIGZ1bmN0aW9uIGRlY2xhcmVkIGluIFBDSCBhbmQgZGVmaW5lZCBvdXRzaWRlLgorCisgIERlY2xVcGRhdGVzW0ZEXS5wdXNoX2JhY2soVVBEX0NYWF9SRVNPTFZFRF9FWENFUFRJT05fU1BFQyk7CiB9CiAKIHZvaWQgQVNUV3JpdGVyOjpEZWR1Y2VkUmV0dXJuVHlwZShjb25zdCBGdW5jdGlvbkRlY2wgKkZELCBRdWFsVHlwZSBSZXR1cm5UeXBlKSB7CkBAIC01MzE2LDkgKzU0NDYsNyBAQAogICBpZiAoIUZELT5pc0Zyb21BU1RGaWxlKCkpCiAgICAgcmV0dXJuOyAvLyBOb3QgYSBmdW5jdGlvbiBkZWNsYXJlZCBpbiBQQ0ggYW5kIGRlZmluZWQgb3V0c2lkZS4KIAotICBVcGRhdGVSZWNvcmQgJlJlY29yZCA9IERlY2xVcGRhdGVzW0ZEXTsKLSAgUmVjb3JkLnB1c2hfYmFjayhVUERfQ1hYX0RFRFVDRURfUkVUVVJOX1RZUEUpOwotICBSZWNvcmQucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KFJldHVyblR5cGUuZ2V0QXNPcGFxdWVQdHIoKSkpOworICBEZWNsVXBkYXRlc1tGRF0ucHVzaF9iYWNrKERlY2xVcGRhdGUoVVBEX0NYWF9ERURVQ0VEX1JFVFVSTl9UWVBFLCBSZXR1cm5UeXBlKSk7CiB9CiAKIHZvaWQgQVNUV3JpdGVyOjpDb21wbGV0ZWRJbXBsaWNpdERlZmluaXRpb24oY29uc3QgRnVuY3Rpb25EZWNsICpEKSB7CkBAIC01MzMxLDYgKzU0NTksMTcgQEAKICAgUmV3cml0ZURlY2woRCk7CiB9CiAKK3ZvaWQgQVNUV3JpdGVyOjpGdW5jdGlvbkRlZmluaXRpb25JbnN0YW50aWF0ZWQoY29uc3QgRnVuY3Rpb25EZWNsICpEKSB7CisgIGFzc2VydCghV3JpdGluZ0FTVCAmJiAiQWxyZWFkeSB3cml0aW5nIHRoZSBBU1QhIik7CisgIGlmICghRC0+aXNGcm9tQVNURmlsZSgpKQorICAgIHJldHVybjsKKworICAvLyBTaW5jZSB0aGUgYWN0dWFsIGluc3RhbnRpYXRpb24gaXMgZGVsYXllZCwgdGhpcyByZWFsbHkgbWVhbnMgdGhhdCB3ZSBuZWVkCisgIC8vIHRvIHVwZGF0ZSB0aGUgaW5zdGFudGlhdGlvbiBsb2NhdGlvbi4KKyAgRGVjbFVwZGF0ZXNbRF0ucHVzaF9iYWNrKAorICAgICAgRGVjbFVwZGF0ZShVUERfQ1hYX0lOU1RBTlRJQVRFRF9GVU5DVElPTl9ERUZJTklUSU9OKSk7Cit9CisKIHZvaWQgQVNUV3JpdGVyOjpTdGF0aWNEYXRhTWVtYmVySW5zdGFudGlhdGVkKGNvbnN0IFZhckRlY2wgKkQpIHsKICAgYXNzZXJ0KCFXcml0aW5nQVNUICYmICJBbHJlYWR5IHdyaXRpbmcgdGhlIEFTVCEiKTsKICAgaWYgKCFELT5pc0Zyb21BU1RGaWxlKCkpCkBAIC01MzM4LDEwICs1NDc3LDkgQEAKIAogICAvLyBTaW5jZSB0aGUgYWN0dWFsIGluc3RhbnRpYXRpb24gaXMgZGVsYXllZCwgdGhpcyByZWFsbHkgbWVhbnMgdGhhdCB3ZSBuZWVkCiAgIC8vIHRvIHVwZGF0ZSB0aGUgaW5zdGFudGlhdGlvbiBsb2NhdGlvbi4KLSAgVXBkYXRlUmVjb3JkICZSZWNvcmQgPSBEZWNsVXBkYXRlc1tEXTsKLSAgUmVjb3JkLnB1c2hfYmFjayhVUERfQ1hYX0lOU1RBTlRJQVRFRF9TVEFUSUNfREFUQV9NRU1CRVIpOwotICBBZGRTb3VyY2VMb2NhdGlvbigKLSAgICAgIEQtPmdldE1lbWJlclNwZWNpYWxpemF0aW9uSW5mbygpLT5nZXRQb2ludE9mSW5zdGFudGlhdGlvbigpLCBSZWNvcmQpOworICBEZWNsVXBkYXRlc1tEXS5wdXNoX2JhY2soCisgICAgICBEZWNsVXBkYXRlKFVQRF9DWFhfSU5TVEFOVElBVEVEX1NUQVRJQ19EQVRBX01FTUJFUiwKKyAgICAgICBELT5nZXRNZW1iZXJTcGVjaWFsaXphdGlvbkluZm8oKS0+Z2V0UG9pbnRPZkluc3RhbnRpYXRpb24oKSkpOwogfQogCiB2b2lkIEFTVFdyaXRlcjo6QWRkZWRPYmpDQ2F0ZWdvcnlUb0ludGVyZmFjZShjb25zdCBPYmpDQ2F0ZWdvcnlEZWNsICpDYXRELApAQCAtNTM3NSw2ICs1NTEzLDUgQEAKICAgaWYgKCFELT5pc0Zyb21BU1RGaWxlKCkpCiAgICAgcmV0dXJuOwogCi0gIFVwZGF0ZVJlY29yZCAmUmVjb3JkID0gRGVjbFVwZGF0ZXNbRF07Ci0gIFJlY29yZC5wdXNoX2JhY2soVVBEX0RFQ0xfTUFSS0VEX1VTRUQpOworICBEZWNsVXBkYXRlc1tEXS5wdXNoX2JhY2soRGVjbFVwZGF0ZShVUERfREVDTF9NQVJLRURfVVNFRCkpOwogfQpkaWZmIC0tZ2l0IGEvbGliL1NlcmlhbGl6YXRpb24vQVNUV3JpdGVyRGVjbC5jcHAgYi9saWIvU2VyaWFsaXphdGlvbi9BU1RXcml0ZXJEZWNsLmNwcAppbmRleCA1NWY4MzBhLi4xNDMwNGFiIDEwMDY0NAotLS0gYS9saWIvU2VyaWFsaXphdGlvbi9BU1RXcml0ZXJEZWNsLmNwcAorKysgYi9saWIvU2VyaWFsaXphdGlvbi9BU1RXcml0ZXJEZWNsLmNwcApAQCAtMTMwLDYgKzEzMCwxNCBAQAogICAgIHZvaWQgVmlzaXRPYmpDUHJvcGVydHlEZWNsKE9iakNQcm9wZXJ0eURlY2wgKkQpOwogICAgIHZvaWQgVmlzaXRPYmpDUHJvcGVydHlJbXBsRGVjbChPYmpDUHJvcGVydHlJbXBsRGVjbCAqRCk7CiAgICAgdm9pZCBWaXNpdE9NUFRocmVhZFByaXZhdGVEZWNsKE9NUFRocmVhZFByaXZhdGVEZWNsICpEKTsKKworICAgIHZvaWQgQWRkRnVuY3Rpb25EZWZpbml0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQpIHsKKyAgICAgIGFzc2VydChGRC0+ZG9lc1RoaXNEZWNsYXJhdGlvbkhhdmVBQm9keSgpKTsKKyAgICAgIGlmIChhdXRvICpDRCA9IGR5bl9jYXN0PENYWENvbnN0cnVjdG9yRGVjbD4oRkQpKQorICAgICAgICBXcml0ZXIuQWRkQ1hYQ3RvckluaXRpYWxpemVycyhDRC0+Q3RvckluaXRpYWxpemVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0QtPk51bUN0b3JJbml0aWFsaXplcnMsIFJlY29yZCk7CisgICAgICBXcml0ZXIuQWRkU3RtdChGRC0+Z2V0Qm9keSgpKTsKKyAgICB9CiAgIH07CiB9CiAKQEAgLTE2OCw2ICsxNzYsMjQgQEAKICAgUmVjb3JkLnB1c2hfYmFjayhELT5nZXRBY2Nlc3MoKSk7CiAgIFJlY29yZC5wdXNoX2JhY2soRC0+aXNNb2R1bGVQcml2YXRlKCkpOwogICBSZWNvcmQucHVzaF9iYWNrKFdyaXRlci5pbmZlclN1Ym1vZHVsZUlERnJvbUxvY2F0aW9uKEQtPmdldExvY2F0aW9uKCkpKTsKKworICAvLyBJZiB0aGlzIGRlY2xhcmF0aW9uIGluamVjdGVkIGEgbmFtZSBpbnRvIGEgY29udGV4dCBkaWZmZXJlbnQgZnJvbSBpdHMKKyAgLy8gbGV4aWNhbCBjb250ZXh0LCBhbmQgdGhhdCBjb250ZXh0IGlzIGFuIGltcG9ydGVkIG5hbWVzcGFjZSwgd2UgbmVlZCB0bworICAvLyB1cGRhdGUgaXRzIHZpc2libGUgZGVjbGFyYXRpb25zIHRvIGluY2x1ZGUgdGhpcyBuYW1lLgorICAvLworICAvLyBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBpbnN0YW50aWF0ZSBhIGNsYXNzIHdpdGggYSBmcmllbmQgZGVjbGFyYXRpb24gb3IgYQorICAvLyBmdW5jdGlvbiB3aXRoIGEgbG9jYWwgZXh0ZXJuIGRlY2xhcmF0aW9uLCBmb3IgaW5zdGFuY2UuCisgIGlmIChELT5pc091dE9mTGluZSgpKSB7CisgICAgYXV0byAqREMgPSBELT5nZXREZWNsQ29udGV4dCgpOworICAgIHdoaWxlIChhdXRvICpOUyA9IGR5bl9jYXN0PE5hbWVzcGFjZURlY2w+KERDLT5nZXRSZWRlY2xDb250ZXh0KCkpKSB7CisgICAgICBpZiAoIU5TLT5pc0Zyb21BU1RGaWxlKCkpCisgICAgICAgIGJyZWFrOworICAgICAgV3JpdGVyLkFkZFVwZGF0ZWREZWNsQ29udGV4dChOUy0+Z2V0UHJpbWFyeUNvbnRleHQoKSk7CisgICAgICBpZiAoIU5TLT5pc0lubGluZU5hbWVzcGFjZSgpKQorICAgICAgICBicmVhazsKKyAgICAgIERDID0gTlMtPmdldFBhcmVudCgpOworICAgIH0KKyAgfQogfQogCiB2b2lkIEFTVERlY2xXcml0ZXI6OlZpc2l0VHJhbnNsYXRpb25Vbml0RGVjbChUcmFuc2xhdGlvblVuaXREZWNsICpEKSB7CkBAIC00MTQsOSArNDQwLDggQEAKICAgfQogCiAgIFJlY29yZC5wdXNoX2JhY2soRC0+cGFyYW1fc2l6ZSgpKTsKLSAgZm9yIChGdW5jdGlvbkRlY2w6OnBhcmFtX2l0ZXJhdG9yIFAgPSBELT5wYXJhbV9iZWdpbigpLCBQRW5kID0gRC0+cGFyYW1fZW5kKCk7Ci0gICAgICAgUCAhPSBQRW5kOyArK1ApCi0gICAgV3JpdGVyLkFkZERlY2xSZWYoKlAsIFJlY29yZCk7CisgIGZvciAoYXV0byBQIDogRC0+cGFyYW1zKCkpCisgICAgV3JpdGVyLkFkZERlY2xSZWYoUCwgUmVjb3JkKTsKICAgQ29kZSA9IHNlcmlhbGl6YXRpb246OkRFQ0xfRlVOQ1RJT047CiB9CiAKQEAgLTQ1MSwxMyArNDc2LDEyIEBACiAgIC8vIEZJWE1FOiBzdGFibGUgZW5jb2RpbmcgZm9yIGluL291dC9pbm91dC9ieWNvcHkvYnlyZWYvb25ld2F5CiAgIFJlY29yZC5wdXNoX2JhY2soRC0+Z2V0T2JqQ0RlY2xRdWFsaWZpZXIoKSk7CiAgIFJlY29yZC5wdXNoX2JhY2soRC0+aGFzUmVsYXRlZFJlc3VsdFR5cGUoKSk7Ci0gIFdyaXRlci5BZGRUeXBlUmVmKEQtPmdldFJlc3VsdFR5cGUoKSwgUmVjb3JkKTsKLSAgV3JpdGVyLkFkZFR5cGVTb3VyY2VJbmZvKEQtPmdldFJlc3VsdFR5cGVTb3VyY2VJbmZvKCksIFJlY29yZCk7CisgIFdyaXRlci5BZGRUeXBlUmVmKEQtPmdldFJldHVyblR5cGUoKSwgUmVjb3JkKTsKKyAgV3JpdGVyLkFkZFR5cGVTb3VyY2VJbmZvKEQtPmdldFJldHVyblR5cGVTb3VyY2VJbmZvKCksIFJlY29yZCk7CiAgIFdyaXRlci5BZGRTb3VyY2VMb2NhdGlvbihELT5nZXRMb2NFbmQoKSwgUmVjb3JkKTsKICAgUmVjb3JkLnB1c2hfYmFjayhELT5wYXJhbV9zaXplKCkpOwotICBmb3IgKE9iakNNZXRob2REZWNsOjpwYXJhbV9pdGVyYXRvciBQID0gRC0+cGFyYW1fYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVuZCA9IEQtPnBhcmFtX2VuZCgpOyBQICE9IFBFbmQ7ICsrUCkKLSAgICBXcml0ZXIuQWRkRGVjbFJlZigqUCwgUmVjb3JkKTsKKyAgZm9yIChjb25zdCBhdXRvICpQIDogRC0+cGFyYW1zKCkpCisgICAgV3JpdGVyLkFkZERlY2xSZWYoUCwgUmVjb3JkKTsKIAogICBSZWNvcmQucHVzaF9iYWNrKEQtPlNlbExvY3NLaW5kKTsKICAgdW5zaWduZWQgTnVtU3RvcmVkU2VsTG9jcyA9IEQtPmdldE51bVN0b3JlZFNlbExvY3MoKTsKQEAgLTQ4OSwxNyArNTEzLDE0IEBACiAgICAgV3JpdGVyLkFkZERlY2xSZWYoRC0+Z2V0U3VwZXJDbGFzcygpLCBSZWNvcmQpOwogICAgIFdyaXRlci5BZGRTb3VyY2VMb2NhdGlvbihELT5nZXRTdXBlckNsYXNzTG9jKCksIFJlY29yZCk7CiAgICAgV3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKEQtPmdldEVuZE9mRGVmaW5pdGlvbkxvYygpLCBSZWNvcmQpOworICAgIFJlY29yZC5wdXNoX2JhY2soRGF0YS5IYXNEZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKTsKIAogICAgIC8vIFdyaXRlIG91dCB0aGUgcHJvdG9jb2xzIHRoYXQgYXJlIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgdGhlIEBpbnRlcmZhY2UuCiAgICAgUmVjb3JkLnB1c2hfYmFjayhEYXRhLlJlZmVyZW5jZWRQcm90b2NvbHMuc2l6ZSgpKTsKLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjpwcm90b2NvbF9pdGVyYXRvciBQID0gRC0+cHJvdG9jb2xfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRW5kID0gRC0+cHJvdG9jb2xfZW5kKCk7Ci0gICAgICAgICBQICE9IFBFbmQ7ICsrUCkKLSAgICAgIFdyaXRlci5BZGREZWNsUmVmKCpQLCBSZWNvcmQpOwotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnByb3RvY29sX2xvY19pdGVyYXRvciBQTCA9IEQtPnByb3RvY29sX2xvY19iZWdpbigpLAotICAgICAgICAgUExFbmQgPSBELT5wcm90b2NvbF9sb2NfZW5kKCk7Ci0gICAgICAgICBQTCAhPSBQTEVuZDsgKytQTCkKLSAgICAgIFdyaXRlci5BZGRTb3VyY2VMb2NhdGlvbigqUEwsIFJlY29yZCk7CisgICAgZm9yIChjb25zdCBhdXRvICpQIDogRC0+cHJvdG9jb2xzKCkpCisgICAgICBXcml0ZXIuQWRkRGVjbFJlZihQLCBSZWNvcmQpOworICAgIGZvciAoY29uc3QgYXV0byAmUEwgOiBELT5wcm90b2NvbF9sb2NzKCkpCisgICAgICBXcml0ZXIuQWRkU291cmNlTG9jYXRpb24oUEwsIFJlY29yZCk7CiAgICAgCiAgICAgLy8gV3JpdGUgb3V0IHRoZSBwcm90b2NvbHMgdGhhdCBhcmUgdHJhbnNpdGl2ZWx5IHJlZmVyZW5jZWQuCiAgICAgUmVjb3JkLnB1c2hfYmFjayhEYXRhLkFsbFJlZmVyZW5jZWRQcm90b2NvbHMuc2l6ZSgpKTsKQEAgLTUyOCw3ICs1NDksNiBAQAogICAvLyBGSVhNRTogc3RhYmxlIGVuY29kaW5nIGZvciBAcHVibGljL0Bwcml2YXRlL0Bwcm90ZWN0ZWQvQHBhY2thZ2UKICAgUmVjb3JkLnB1c2hfYmFjayhELT5nZXRBY2Nlc3NDb250cm9sKCkpOwogICBSZWNvcmQucHVzaF9iYWNrKEQtPmdldFN5bnRoZXNpemUoKSk7Ci0gIFJlY29yZC5wdXNoX2JhY2soRC0+Z2V0QmFja2luZ0l2YXJSZWZlcmVuY2VkSW5BY2Nlc3NvcigpKTsKIAogICBpZiAoIUQtPmhhc0F0dHJzKCkgJiYKICAgICAgICFELT5pc0ltcGxpY2l0KCkgJiYKQEAgLTU1MSwxMyArNTcxLDEwIEBACiAgIFJlY29yZC5wdXNoX2JhY2soRC0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpKTsKICAgaWYgKEQtPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkgewogICAgIFJlY29yZC5wdXNoX2JhY2soRC0+cHJvdG9jb2xfc2l6ZSgpKTsKLSAgICBmb3IgKE9iakNQcm90b2NvbERlY2w6OnByb3RvY29sX2l0ZXJhdG9yCi0gICAgICAgICBJID0gRC0+cHJvdG9jb2xfYmVnaW4oKSwgSUVuZCA9IEQtPnByb3RvY29sX2VuZCgpOyBJICE9IElFbmQ7ICsrSSkKLSAgICAgIFdyaXRlci5BZGREZWNsUmVmKCpJLCBSZWNvcmQpOwotICAgIGZvciAoT2JqQ1Byb3RvY29sRGVjbDo6cHJvdG9jb2xfbG9jX2l0ZXJhdG9yIFBMID0gRC0+cHJvdG9jb2xfbG9jX2JlZ2luKCksCi0gICAgICAgICAgIFBMRW5kID0gRC0+cHJvdG9jb2xfbG9jX2VuZCgpOwotICAgICAgICAgUEwgIT0gUExFbmQ7ICsrUEwpCi0gICAgICBXcml0ZXIuQWRkU291cmNlTG9jYXRpb24oKlBMLCBSZWNvcmQpOworICAgIGZvciAoY29uc3QgYXV0byAqSSA6IEQtPnByb3RvY29scygpKQorICAgICAgV3JpdGVyLkFkZERlY2xSZWYoSSwgUmVjb3JkKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlBMIDogRC0+cHJvdG9jb2xfbG9jcygpKQorICAgICAgV3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKFBMLCBSZWNvcmQpOwogICB9CiAgIAogICBDb2RlID0gc2VyaWFsaXphdGlvbjo6REVDTF9PQkpDX1BST1RPQ09MOwpAQCAtNTc1LDEzICs1OTIsMTAgQEAKICAgV3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKEQtPmdldEl2YXJSQnJhY2VMb2MoKSwgUmVjb3JkKTsKICAgV3JpdGVyLkFkZERlY2xSZWYoRC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKSwgUmVjb3JkKTsKICAgUmVjb3JkLnB1c2hfYmFjayhELT5wcm90b2NvbF9zaXplKCkpOwotICBmb3IgKE9iakNDYXRlZ29yeURlY2w6OnByb3RvY29sX2l0ZXJhdG9yCi0gICAgICAgSSA9IEQtPnByb3RvY29sX2JlZ2luKCksIElFbmQgPSBELT5wcm90b2NvbF9lbmQoKTsgSSAhPSBJRW5kOyArK0kpCi0gICAgV3JpdGVyLkFkZERlY2xSZWYoKkksIFJlY29yZCk7Ci0gIGZvciAoT2JqQ0NhdGVnb3J5RGVjbDo6cHJvdG9jb2xfbG9jX2l0ZXJhdG9yIAotICAgICAgICAgUEwgPSBELT5wcm90b2NvbF9sb2NfYmVnaW4oKSwgUExFbmQgPSBELT5wcm90b2NvbF9sb2NfZW5kKCk7Ci0gICAgICAgUEwgIT0gUExFbmQ7ICsrUEwpCi0gICAgV3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKCpQTCwgUmVjb3JkKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogRC0+cHJvdG9jb2xzKCkpCisgICAgV3JpdGVyLkFkZERlY2xSZWYoSSwgUmVjb3JkKTsKKyAgZm9yIChjb25zdCBhdXRvICZQTCA6IEQtPnByb3RvY29sX2xvY3MoKSkKKyAgICBXcml0ZXIuQWRkU291cmNlTG9jYXRpb24oUEwsIFJlY29yZCk7CiAgIENvZGUgPSBzZXJpYWxpemF0aW9uOjpERUNMX09CSkNfQ0FURUdPUlk7CiB9CiAKQEAgLTY4OCwxMCArNzAyLDggQEAKICAgVmlzaXRWYWx1ZURlY2woRCk7CiAgIFJlY29yZC5wdXNoX2JhY2soRC0+Z2V0Q2hhaW5pbmdTaXplKCkpOwogCi0gIGZvciAoSW5kaXJlY3RGaWVsZERlY2w6OmNoYWluX2l0ZXJhdG9yCi0gICAgICAgUCA9IEQtPmNoYWluX2JlZ2luKCksCi0gICAgICAgUEVuZCA9IEQtPmNoYWluX2VuZCgpOyBQICE9IFBFbmQ7ICsrUCkKLSAgICBXcml0ZXIuQWRkRGVjbFJlZigqUCwgUmVjb3JkKTsKKyAgZm9yIChjb25zdCBhdXRvICpQIDogRC0+Y2hhaW4oKSkKKyAgICBXcml0ZXIuQWRkRGVjbFJlZihQLCBSZWNvcmQpOwogICBDb2RlID0gc2VyaWFsaXphdGlvbjo6REVDTF9JTkRJUkVDVEZJRUxEOwogfQogCkBAIC04MzMsOSArODQ1LDcgQEAKICAgUmVjb3JkLnB1c2hfYmFjayhELT5pc0NvbnZlcnNpb25Gcm9tTGFtYmRhKCkpOwogICBSZWNvcmQucHVzaF9iYWNrKEQtPmNhcHR1cmVzQ1hYVGhpcygpKTsKICAgUmVjb3JkLnB1c2hfYmFjayhELT5nZXROdW1DYXB0dXJlcygpKTsKLSAgZm9yIChCbG9ja0RlY2w6OmNhcHR1cmVfaXRlcmF0b3IKLSAgICAgICAgIGkgPSBELT5jYXB0dXJlX2JlZ2luKCksIGUgPSBELT5jYXB0dXJlX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgIGNvbnN0IEJsb2NrRGVjbDo6Q2FwdHVyZSAmY2FwdHVyZSA9ICppOworICBmb3IgKGNvbnN0IGF1dG8gJmNhcHR1cmUgOiBELT5jYXB0dXJlcygpKSB7CiAgICAgV3JpdGVyLkFkZERlY2xSZWYoY2FwdHVyZS5nZXRWYXJpYWJsZSgpLCBSZWNvcmQpOwogCiAgICAgdW5zaWduZWQgZmxhZ3MgPSAwOwpAQCAtOTExLDkgKzkyMSw4IEBACiAgICAgRGVjbCAqUGFyZW50ID0gY2FzdDxEZWNsPigKICAgICAgICAgRC0+Z2V0UGFyZW50KCktPmdldFJlZGVjbENvbnRleHQoKS0+Z2V0UHJpbWFyeUNvbnRleHQoKSk7CiAgICAgaWYgKFBhcmVudC0+aXNGcm9tQVNURmlsZSgpIHx8IGlzYTxUcmFuc2xhdGlvblVuaXREZWNsPihQYXJlbnQpKSB7Ci0gICAgICBBU1RXcml0ZXI6OlVwZGF0ZVJlY29yZCAmUmVjb3JkID0gV3JpdGVyLkRlY2xVcGRhdGVzW1BhcmVudF07Ci0gICAgICBSZWNvcmQucHVzaF9iYWNrKFVQRF9DWFhfQURERURfQU5PTllNT1VTX05BTUVTUEFDRSk7Ci0gICAgICBXcml0ZXIuQWRkRGVjbFJlZihELCBSZWNvcmQpOworICAgICAgV3JpdGVyLkRlY2xVcGRhdGVzW1BhcmVudF0ucHVzaF9iYWNrKAorICAgICAgICAgIEFTVFdyaXRlcjo6RGVjbFVwZGF0ZShVUERfQ1hYX0FEREVEX0FOT05ZTU9VU19OQU1FU1BBQ0UsIEQpKTsKICAgICB9CiAgIH0KIH0KQEAgLTEwMjEsNiArMTAzMCw3IEBACiB2b2lkIEFTVERlY2xXcml0ZXI6OlZpc2l0Q1hYQ29uc3RydWN0b3JEZWNsKENYWENvbnN0cnVjdG9yRGVjbCAqRCkgewogICBWaXNpdENYWE1ldGhvZERlY2woRCk7CiAKKyAgV3JpdGVyLkFkZERlY2xSZWYoRC0+Z2V0SW5oZXJpdGVkQ29uc3RydWN0b3IoKSwgUmVjb3JkKTsKICAgUmVjb3JkLnB1c2hfYmFjayhELT5Jc0V4cGxpY2l0U3BlY2lmaWVkKTsKICAgV3JpdGVyLkFkZENYWEN0b3JJbml0aWFsaXplcnMoRC0+Q3RvckluaXRpYWxpemVycywgRC0+TnVtQ3RvckluaXRpYWxpemVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkKTsKQEAgLTE0MjksMTAgKzE0MzksOCBAQAogdm9pZCBBU1REZWNsV3JpdGVyOjpWaXNpdE9NUFRocmVhZFByaXZhdGVEZWNsKE9NUFRocmVhZFByaXZhdGVEZWNsICpEKSB7CiAgIFJlY29yZC5wdXNoX2JhY2soRC0+dmFybGlzdF9zaXplKCkpOwogICBWaXNpdERlY2woRCk7Ci0gIGZvciAoT01QVGhyZWFkUHJpdmF0ZURlY2w6OnZhcmxpc3RfaXRlcmF0b3IgSSA9IEQtPnZhcmxpc3RfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRC0+dmFybGlzdF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkKLSAgICBXcml0ZXIuQWRkU3RtdCgqSSk7CisgIGZvciAoYXV0byAqSSA6IEQtPnZhcmxpc3RzKCkpCisgICAgV3JpdGVyLkFkZFN0bXQoSSk7CiAgIENvZGUgPSBzZXJpYWxpemF0aW9uOjpERUNMX09NUF9USFJFQURQUklWQVRFOwogfQogCkBAIC0xODE3LDggKzE4MjUsMTAgQEAKICAgLy8gQW4gT2JqQ01ldGhvZERlY2wgaXMgbmV2ZXIgY29uc2lkZXJlZCBhcyAicmVxdWlyZWQiIGJlY2F1c2UgaXRzCiAgIC8vIGltcGxlbWVudGF0aW9uIGNvbnRhaW5lciBhbHdheXMgaXMuCiAKLSAgLy8gRmlsZSBzY29wZWQgYXNzZW1ibHkgb3Igb2JqLWMgaW1wbGVtZW50YXRpb24gbXVzdCBiZSBzZWVuLgotICBpZiAoaXNhPEZpbGVTY29wZUFzbURlY2w+KEQpIHx8IGlzYTxPYmpDSW1wbERlY2w+KEQpKQorICAvLyBGaWxlIHNjb3BlZCBhc3NlbWJseSBvciBvYmotYyBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIHNlZW4uIEltcG9ydERlY2wgaXMKKyAgLy8gdXNlZCBieSBjb2RlZ2VuIHRvIGRldGVybWluZSB0aGUgc2V0IG9mIGltcG9ydGVkIG1vZHVsZXMgdG8gc2VhcmNoIGZvcgorICAvLyBpbnB1dHMgZm9yIGF1dG9tYXRpYyBsaW5raW5nLgorICBpZiAoaXNhPEZpbGVTY29wZUFzbURlY2w+KEQpIHx8IGlzYTxPYmpDSW1wbERlY2w+KEQpIHx8IGlzYTxJbXBvcnREZWNsPihEKSkKICAgICByZXR1cm4gdHJ1ZTsKIAogICByZXR1cm4gQ29udGV4dC5EZWNsTXVzdEJlRW1pdHRlZChEKTsKQEAgLTE5MDYsMTAgKzE5MTYsMTYgQEAKICAgLy8gRmx1c2ggQysrIGJhc2Ugc3BlY2lmaWVycywgaWYgdGhlcmUgYXJlIGFueS4KICAgRmx1c2hDWFhCYXNlU3BlY2lmaWVycygpOwogICAKLSAgLy8gTm90ZSAiZXh0ZXJuYWwiIGRlY2xhcmF0aW9ucyBzbyB0aGF0IHdlIGNhbiBhZGQgdGhlbSB0byBhIHJlY29yZCBpbiB0aGUKLSAgLy8gQVNUIGZpbGUgbGF0ZXIuCi0gIC8vCi0gIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSByZW5hbWVkLCB0aGUgcHJlZGljYXRlIGlzIG11Y2ggbW9yZSBjb21wbGljYXRlZC4KKyAgLy8gTm90ZSBkZWNsYXJhdGlvbnMgdGhhdCBzaG91bGQgYmUgZGVzZXJpYWxpemVkIGVhZ2VybHkgc28gdGhhdCB3ZSBjYW4gYWRkCisgIC8vIHRoZW0gdG8gYSByZWNvcmQgaW4gdGhlIEFTVCBmaWxlIGxhdGVyLgogICBpZiAoaXNSZXF1aXJlZERlY2woRCwgQ29udGV4dCkpCi0gICAgRXh0ZXJuYWxEZWZpbml0aW9ucy5wdXNoX2JhY2soSUQpOworICAgIEVhZ2VybHlEZXNlcmlhbGl6ZWREZWNscy5wdXNoX2JhY2soSUQpOworfQorCit2b2lkIEFTVFdyaXRlcjo6QWRkRnVuY3Rpb25EZWZpbml0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZERhdGEgJlJlY29yZCkgeworICBDbGVhclN3aXRjaENhc2VJRHMoKTsKKworICBBU1REZWNsV3JpdGVyIFcoKnRoaXMsIEZELT5nZXRBU1RDb250ZXh0KCksIFJlY29yZCk7CisgIFcuQWRkRnVuY3Rpb25EZWZpbml0aW9uKEZEKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9TZXJpYWxpemF0aW9uL0FTVFdyaXRlclN0bXQuY3BwIGIvbGliL1NlcmlhbGl6YXRpb24vQVNUV3JpdGVyU3RtdC5jcHAKaW5kZXggMDcyZmM5OC4uZGQ0NGE2OSAxMDA2NDQKLS0tIGEvbGliL1NlcmlhbGl6YXRpb24vQVNUV3JpdGVyU3RtdC5jcHAKKysrIGIvbGliL1NlcmlhbGl6YXRpb24vQVNUV3JpdGVyU3RtdC5jcHAKQEAgLTcxLDkgKzcxLDggQEAKIHZvaWQgQVNUU3RtdFdyaXRlcjo6VmlzaXRDb21wb3VuZFN0bXQoQ29tcG91bmRTdG10ICpTKSB7CiAgIFZpc2l0U3RtdChTKTsKICAgUmVjb3JkLnB1c2hfYmFjayhTLT5zaXplKCkpOwotICBmb3IgKENvbXBvdW5kU3RtdDo6Ym9keV9pdGVyYXRvciBDUyA9IFMtPmJvZHlfYmVnaW4oKSwgQ1NFbmQgPSBTLT5ib2R5X2VuZCgpOwotICAgICAgIENTICE9IENTRW5kOyArK0NTKQotICAgIFdyaXRlci5BZGRTdG10KCpDUyk7CisgIGZvciAoYXV0byAqQ1MgOiBTLT5ib2R5KCkpCisgICAgV3JpdGVyLkFkZFN0bXQoQ1MpOwogICBXcml0ZXIuQWRkU291cmNlTG9jYXRpb24oUy0+Z2V0TEJyYWNMb2MoKSwgUmVjb3JkKTsKICAgV3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKFMtPmdldFJCcmFjTG9jKCksIFJlY29yZCk7CiAgIENvZGUgPSBzZXJpYWxpemF0aW9uOjpTVE1UX0NPTVBPVU5EOwpAQCAtMzAwLDI0ICsyOTksMjAgQEAKICAgV3JpdGVyLkFkZERlY2xSZWYoUy0+Z2V0Q2FwdHVyZWRSZWNvcmREZWNsKCksIFJlY29yZCk7CiAKICAgLy8gQ2FwdHVyZSBpbml0cwotICBmb3IgKENhcHR1cmVkU3RtdDo6Y2FwdHVyZV9pbml0X2l0ZXJhdG9yIEkgPSBTLT5jYXB0dXJlX2luaXRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gUy0+Y2FwdHVyZV9pbml0X2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKQotICAgIFdyaXRlci5BZGRTdG10KCpJKTsKKyAgZm9yIChhdXRvICpJIDogUy0+Y2FwdHVyZV9pbml0cygpKQorICAgIFdyaXRlci5BZGRTdG10KEkpOwogCiAgIC8vIEJvZHkKICAgV3JpdGVyLkFkZFN0bXQoUy0+Z2V0Q2FwdHVyZWRTdG10KCkpOwogCiAgIC8vIENhcHR1cmVzCi0gIGZvciAoQ2FwdHVyZWRTdG10OjpjYXB0dXJlX2l0ZXJhdG9yIEkgPSBTLT5jYXB0dXJlX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBTLT5jYXB0dXJlX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgaWYgKEktPmNhcHR1cmVzVGhpcygpKQorICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBTLT5jYXB0dXJlcygpKSB7CisgICAgaWYgKEkuY2FwdHVyZXNUaGlzKCkpCiAgICAgICBXcml0ZXIuQWRkRGVjbFJlZigwLCBSZWNvcmQpOwogICAgIGVsc2UKLSAgICAgIFdyaXRlci5BZGREZWNsUmVmKEktPmdldENhcHR1cmVkVmFyKCksIFJlY29yZCk7Ci0gICAgUmVjb3JkLnB1c2hfYmFjayhJLT5nZXRDYXB0dXJlS2luZCgpKTsKLSAgICBXcml0ZXIuQWRkU291cmNlTG9jYXRpb24oSS0+Z2V0TG9jYXRpb24oKSwgUmVjb3JkKTsKKyAgICAgIFdyaXRlci5BZGREZWNsUmVmKEkuZ2V0Q2FwdHVyZWRWYXIoKSwgUmVjb3JkKTsKKyAgICBSZWNvcmQucHVzaF9iYWNrKEkuZ2V0Q2FwdHVyZUtpbmQoKSk7CisgICAgV3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKEkuZ2V0TG9jYXRpb24oKSwgUmVjb3JkKTsKICAgfQogCiAgIENvZGUgPSBzZXJpYWxpemF0aW9uOjpTVE1UX0NBUFRVUkVEOwpAQCAtMTQ4NiwzMCArMTQ4MSwxMiBAQAogICBDb2RlID0gc2VyaWFsaXphdGlvbjo6RVhQUl9DWFhfVU5SRVNPTFZFRF9MT09LVVA7CiB9CiAKLXZvaWQgQVNUU3RtdFdyaXRlcjo6VmlzaXRVbmFyeVR5cGVUcmFpdEV4cHIoVW5hcnlUeXBlVHJhaXRFeHByICpFKSB7Ci0gIFZpc2l0RXhwcihFKTsKLSAgUmVjb3JkLnB1c2hfYmFjayhFLT5nZXRUcmFpdCgpKTsKLSAgUmVjb3JkLnB1c2hfYmFjayhFLT5nZXRWYWx1ZSgpKTsKLSAgV3JpdGVyLkFkZFNvdXJjZVJhbmdlKEUtPmdldFNvdXJjZVJhbmdlKCksIFJlY29yZCk7Ci0gIFdyaXRlci5BZGRUeXBlU291cmNlSW5mbyhFLT5nZXRRdWVyaWVkVHlwZVNvdXJjZUluZm8oKSwgUmVjb3JkKTsKLSAgQ29kZSA9IHNlcmlhbGl6YXRpb246OkVYUFJfQ1hYX1VOQVJZX1RZUEVfVFJBSVQ7Ci19Ci0KLXZvaWQgQVNUU3RtdFdyaXRlcjo6VmlzaXRCaW5hcnlUeXBlVHJhaXRFeHByKEJpbmFyeVR5cGVUcmFpdEV4cHIgKkUpIHsKLSAgVmlzaXRFeHByKEUpOwotICBSZWNvcmQucHVzaF9iYWNrKEUtPmdldFRyYWl0KCkpOwotICBSZWNvcmQucHVzaF9iYWNrKEUtPmdldFZhbHVlKCkpOwotICBXcml0ZXIuQWRkU291cmNlUmFuZ2UoRS0+Z2V0U291cmNlUmFuZ2UoKSwgUmVjb3JkKTsKLSAgV3JpdGVyLkFkZFR5cGVTb3VyY2VJbmZvKEUtPmdldExoc1R5cGVTb3VyY2VJbmZvKCksIFJlY29yZCk7Ci0gIFdyaXRlci5BZGRUeXBlU291cmNlSW5mbyhFLT5nZXRSaHNUeXBlU291cmNlSW5mbygpLCBSZWNvcmQpOwotICBDb2RlID0gc2VyaWFsaXphdGlvbjo6RVhQUl9CSU5BUllfVFlQRV9UUkFJVDsKLX0KLQogdm9pZCBBU1RTdG10V3JpdGVyOjpWaXNpdFR5cGVUcmFpdEV4cHIoVHlwZVRyYWl0RXhwciAqRSkgewogICBWaXNpdEV4cHIoRSk7CiAgIFJlY29yZC5wdXNoX2JhY2soRS0+VHlwZVRyYWl0RXhwckJpdHMuTnVtQXJncyk7CiAgIFJlY29yZC5wdXNoX2JhY2soRS0+VHlwZVRyYWl0RXhwckJpdHMuS2luZCk7IC8vIEZJWE1FOiBTdGFibGUgZW5jb2RpbmcKICAgUmVjb3JkLnB1c2hfYmFjayhFLT5UeXBlVHJhaXRFeHByQml0cy5WYWx1ZSk7CisgIFdyaXRlci5BZGRTb3VyY2VSYW5nZShFLT5nZXRTb3VyY2VSYW5nZSgpLCBSZWNvcmQpOwogICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gRS0+Z2V0TnVtQXJncygpOyBJICE9IE47ICsrSSkKICAgICBXcml0ZXIuQWRkVHlwZVNvdXJjZUluZm8oRS0+Z2V0QXJnKEkpLCBSZWNvcmQpOwogICBDb2RlID0gc2VyaWFsaXphdGlvbjo6RVhQUl9UWVBFX1RSQUlUOwpAQCAtMTY5Nyw2ICsxNjc0LDIxIEBACiAgIFdyaXRlci0+V3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKEMtPmdldExvY0VuZCgpLCBSZWNvcmQpOwogfQogCit2b2lkIE9NUENsYXVzZVdyaXRlcjo6VmlzaXRPTVBJZkNsYXVzZShPTVBJZkNsYXVzZSAqQykgeworICBXcml0ZXItPldyaXRlci5BZGRTdG10KEMtPmdldENvbmRpdGlvbigpKTsKKyAgV3JpdGVyLT5Xcml0ZXIuQWRkU291cmNlTG9jYXRpb24oQy0+Z2V0TFBhcmVuTG9jKCksIFJlY29yZCk7Cit9CisKK3ZvaWQgT01QQ2xhdXNlV3JpdGVyOjpWaXNpdE9NUE51bVRocmVhZHNDbGF1c2UoT01QTnVtVGhyZWFkc0NsYXVzZSAqQykgeworICBXcml0ZXItPldyaXRlci5BZGRTdG10KEMtPmdldE51bVRocmVhZHMoKSk7CisgIFdyaXRlci0+V3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKEMtPmdldExQYXJlbkxvYygpLCBSZWNvcmQpOworfQorCit2b2lkIE9NUENsYXVzZVdyaXRlcjo6VmlzaXRPTVBTYWZlbGVuQ2xhdXNlKE9NUFNhZmVsZW5DbGF1c2UgKkMpIHsKKyAgV3JpdGVyLT5Xcml0ZXIuQWRkU3RtdChDLT5nZXRTYWZlbGVuKCkpOworICBXcml0ZXItPldyaXRlci5BZGRTb3VyY2VMb2NhdGlvbihDLT5nZXRMUGFyZW5Mb2MoKSwgUmVjb3JkKTsKK30KKwogdm9pZCBPTVBDbGF1c2VXcml0ZXI6OlZpc2l0T01QRGVmYXVsdENsYXVzZShPTVBEZWZhdWx0Q2xhdXNlICpDKSB7CiAgIFJlY29yZC5wdXNoX2JhY2soQy0+Z2V0RGVmYXVsdEtpbmQoKSk7CiAgIFdyaXRlci0+V3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKEMtPmdldExQYXJlbkxvYygpLCBSZWNvcmQpOwpAQCAtMTcwNiwzNiArMTY5OCwzNSBAQAogdm9pZCBPTVBDbGF1c2VXcml0ZXI6OlZpc2l0T01QUHJpdmF0ZUNsYXVzZShPTVBQcml2YXRlQ2xhdXNlICpDKSB7CiAgIFJlY29yZC5wdXNoX2JhY2soQy0+dmFybGlzdF9zaXplKCkpOwogICBXcml0ZXItPldyaXRlci5BZGRTb3VyY2VMb2NhdGlvbihDLT5nZXRMUGFyZW5Mb2MoKSwgUmVjb3JkKTsKLSAgZm9yIChPTVBQcml2YXRlQ2xhdXNlOjp2YXJsaXN0X2l0ZXJhdG9yIEkgPSBDLT52YXJsaXN0X2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gQy0+dmFybGlzdF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkKLSAgICBXcml0ZXItPldyaXRlci5BZGRTdG10KCpJKTsKKyAgZm9yIChhdXRvICpJIDogQy0+dmFybGlzdHMoKSkKKyAgICBXcml0ZXItPldyaXRlci5BZGRTdG10KEkpOwogfQogCiB2b2lkIE9NUENsYXVzZVdyaXRlcjo6VmlzaXRPTVBGaXJzdHByaXZhdGVDbGF1c2UoT01QRmlyc3Rwcml2YXRlQ2xhdXNlICpDKSB7CiAgIFJlY29yZC5wdXNoX2JhY2soQy0+dmFybGlzdF9zaXplKCkpOwogICBXcml0ZXItPldyaXRlci5BZGRTb3VyY2VMb2NhdGlvbihDLT5nZXRMUGFyZW5Mb2MoKSwgUmVjb3JkKTsKLSAgZm9yIChPTVBGaXJzdHByaXZhdGVDbGF1c2U6OnZhcmxpc3RfaXRlcmF0b3IgSSA9IEMtPnZhcmxpc3RfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IEMtPnZhcmxpc3RfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpCi0gICAgV3JpdGVyLT5Xcml0ZXIuQWRkU3RtdCgqSSk7CisgIGZvciAoYXV0byAqSSA6IEMtPnZhcmxpc3RzKCkpCisgICAgV3JpdGVyLT5Xcml0ZXIuQWRkU3RtdChJKTsKIH0KIAogdm9pZCBPTVBDbGF1c2VXcml0ZXI6OlZpc2l0T01QU2hhcmVkQ2xhdXNlKE9NUFNoYXJlZENsYXVzZSAqQykgewogICBSZWNvcmQucHVzaF9iYWNrKEMtPnZhcmxpc3Rfc2l6ZSgpKTsKICAgV3JpdGVyLT5Xcml0ZXIuQWRkU291cmNlTG9jYXRpb24oQy0+Z2V0TFBhcmVuTG9jKCksIFJlY29yZCk7Ci0gIGZvciAoT01QU2hhcmVkQ2xhdXNlOjp2YXJsaXN0X2l0ZXJhdG9yIEkgPSBDLT52YXJsaXN0X2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBDLT52YXJsaXN0X2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKQotICAgIFdyaXRlci0+V3JpdGVyLkFkZFN0bXQoKkkpOworICBmb3IgKGF1dG8gKkkgOiBDLT52YXJsaXN0cygpKQorICAgIFdyaXRlci0+V3JpdGVyLkFkZFN0bXQoSSk7Cit9CisKK3ZvaWQgT01QQ2xhdXNlV3JpdGVyOjpWaXNpdE9NUENvcHlpbkNsYXVzZShPTVBDb3B5aW5DbGF1c2UgKkMpIHsKKyAgUmVjb3JkLnB1c2hfYmFjayhDLT52YXJsaXN0X3NpemUoKSk7CisgIFdyaXRlci0+V3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKEMtPmdldExQYXJlbkxvYygpLCBSZWNvcmQpOworICBmb3IgKGF1dG8gKkkgOiBDLT52YXJsaXN0cygpKQorICAgIFdyaXRlci0+V3JpdGVyLkFkZFN0bXQoSSk7CiB9CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAvLyBPcGVuTVAgRGlyZWN0aXZlcy4KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiB2b2lkIEFTVFN0bXRXcml0ZXI6OlZpc2l0T01QRXhlY3V0YWJsZURpcmVjdGl2ZShPTVBFeGVjdXRhYmxlRGlyZWN0aXZlICpFKSB7Ci0gIFZpc2l0U3RtdChFKTsKLSAgUmVjb3JkLnB1c2hfYmFjayhFLT5nZXROdW1DbGF1c2VzKCkpOwogICBXcml0ZXIuQWRkU291cmNlTG9jYXRpb24oRS0+Z2V0TG9jU3RhcnQoKSwgUmVjb3JkKTsKICAgV3JpdGVyLkFkZFNvdXJjZUxvY2F0aW9uKEUtPmdldExvY0VuZCgpLCBSZWNvcmQpOwogICBPTVBDbGF1c2VXcml0ZXIgQ2xhdXNlV3JpdGVyKHRoaXMsIFJlY29yZCk7CkBAIC0xNzQ2LDEwICsxNzM3LDIwIEBACiB9CiAKIHZvaWQgQVNUU3RtdFdyaXRlcjo6VmlzaXRPTVBQYXJhbGxlbERpcmVjdGl2ZShPTVBQYXJhbGxlbERpcmVjdGl2ZSAqRCkgeworICBWaXNpdFN0bXQoRCk7CisgIFJlY29yZC5wdXNoX2JhY2soRC0+Z2V0TnVtQ2xhdXNlcygpKTsKICAgVmlzaXRPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKEQpOwogICBDb2RlID0gc2VyaWFsaXphdGlvbjo6U1RNVF9PTVBfUEFSQUxMRUxfRElSRUNUSVZFOwogfQogCit2b2lkIEFTVFN0bXRXcml0ZXI6OlZpc2l0T01QU2ltZERpcmVjdGl2ZShPTVBTaW1kRGlyZWN0aXZlICpEKSB7CisgIFZpc2l0U3RtdChEKTsKKyAgUmVjb3JkLnB1c2hfYmFjayhELT5nZXROdW1DbGF1c2VzKCkpOworICBSZWNvcmQucHVzaF9iYWNrKEQtPmdldENvbGxhcHNlZE51bWJlcigpKTsKKyAgVmlzaXRPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKEQpOworICBDb2RlID0gc2VyaWFsaXphdGlvbjo6U1RNVF9PTVBfU0lNRF9ESVJFQ1RJVkU7Cit9CisKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAvLyBBU1RXcml0ZXIgSW1wbGVtZW50YXRpb24KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCkBAIC0xODEyLDcgKzE4MTMsNyBAQAogICBQYXJlbnRTdG10SW5zZXJ0ZXJSQUlJIFBhcmVudFN0bXRJbnNlcnRlcihTLCBQYXJlbnRTdG10cyk7CiAjZW5kaWYKIAotICAvLyBSZWRpcmVjdCBBU1RXcml0ZXI6OkFkZFN0bXQgdG8gY29sbGVjdCBzdWIgc3RtdHMuCisgIC8vIFJlZGlyZWN0IEFTVFdyaXRlcjo6QWRkU3RtdCB0byBjb2xsZWN0IHN1Yi1zdG10cy4KICAgU21hbGxWZWN0b3I8U3RtdCAqLCAxNj4gU3ViU3RtdHM7CiAgIENvbGxlY3RlZFN0bXRzID0gJlN1YlN0bXRzOwogCkBAIC0xODI1LDE2ICsxODI2LDE2IEBACiAgICAgU291cmNlTWFuYWdlciAmU3JjTWdyCiAgICAgICA9IERlY2xJRHMuYmVnaW4oKS0+Zmlyc3QtPmdldEFTVENvbnRleHQoKS5nZXRTb3VyY2VNYW5hZ2VyKCk7CiAgICAgUy0+ZHVtcChTcmNNZ3IpOwotICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCBzdWIgc3RhdGVtZW50IHdyaXRpbmcgQVNUIGZpbGUiKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgc3ViLXN0YXRlbWVudCB3cml0aW5nIEFTVCBmaWxlIik7CiAgIH0KICNlbmRpZgogCiAgIC8vIFJldmVydCBBU1RXcml0ZXI6OkFkZFN0bXQuCiAgIENvbGxlY3RlZFN0bXRzID0gJlN0bXRzVG9FbWl0OwogCi0gIC8vIFdyaXRlIHRoZSBzdWIgc3RtdHMgaW4gcmV2ZXJzZSBvcmRlciwgbGFzdCB0byBmaXJzdC4gV2hlbiByZWFkaW5nIHRoZW0gYmFjaworICAvLyBXcml0ZSB0aGUgc3ViLXN0bXRzIGluIHJldmVyc2Ugb3JkZXIsIGxhc3QgdG8gZmlyc3QuIFdoZW4gcmVhZGluZyB0aGVtIGJhY2sKICAgLy8gd2Ugd2lsbCByZWFkIHRoZW0gaW4gY29ycmVjdCBvcmRlciBieSAicG9wImluZyB0aGVtIGZyb20gdGhlIFN0bXRzIHN0YWNrLgotICAvLyBUaGlzIHNpbXBsaWZpZXMgcmVhZGluZyBhbmQgYWxsb3dzIHRvIHN0b3JlIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN1YiBzdG10cworICAvLyBUaGlzIHNpbXBsaWZpZXMgcmVhZGluZyBhbmQgYWxsb3dzIHRvIHN0b3JlIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN1Yi1zdG10cwogICAvLyB3aXRob3V0IGtub3dpbmcgaXQgaW4gYWR2YW5jZS4KICAgd2hpbGUgKCFTdWJTdG10cy5lbXB0eSgpKQogICAgIFdyaXRlU3ViU3RtdChTdWJTdG10cy5wb3BfYmFja192YWwoKSwgU3ViU3RtdEVudHJpZXMsIFBhcmVudFN0bXRzKTsKQEAgLTE4NTEsNyArMTg1Miw3IEBACiAKICAgLy8gV2UgZXhwZWN0IHRvIGJlIHRoZSBvbmx5IGNvbnN1bWVyIG9mIHRoZSB0d28gdGVtcG9yYXJ5IHN0YXRlbWVudCBtYXBzLAogICAvLyBhc3NlcnQgdGhhdCB0aGV5IGFyZSBlbXB0eS4KLSAgYXNzZXJ0KFN1YlN0bXRFbnRyaWVzLmVtcHR5KCkgJiYgInVuZXhwZWN0ZWQgZW50cmllcyBpbiBzdWIgc3RtdCBtYXAiKTsKKyAgYXNzZXJ0KFN1YlN0bXRFbnRyaWVzLmVtcHR5KCkgJiYgInVuZXhwZWN0ZWQgZW50cmllcyBpbiBzdWItc3RtdCBtYXAiKTsKICAgYXNzZXJ0KFBhcmVudFN0bXRzLmVtcHR5KCkgJiYgInVuZXhwZWN0ZWQgZW50cmllcyBpbiBwYXJlbnQgc3RtdCBtYXAiKTsKIAogICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gU3RtdHNUb0VtaXQuc2l6ZSgpOyBJICE9IE47ICsrSSkgewpkaWZmIC0tZ2l0IGEvbGliL1NlcmlhbGl6YXRpb24vQ01ha2VMaXN0cy50eHQgYi9saWIvU2VyaWFsaXphdGlvbi9DTWFrZUxpc3RzLnR4dAppbmRleCAzYzY4YjY0Li5kODg1ZGIyIDEwMDY0NAotLS0gYS9saWIvU2VyaWFsaXphdGlvbi9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvU2VyaWFsaXphdGlvbi9DTWFrZUxpc3RzLnR4dApAQCAtMSw4ICsxLDEwIEBACi1zZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMgYml0cmVhZGVyKQorc2V0KExMVk1fTElOS19DT01QT05FTlRTCisgIEJpdFJlYWRlcgorICBTdXBwb3J0CisgICkKKwogCiBhZGRfY2xhbmdfbGlicmFyeShjbGFuZ1NlcmlhbGl6YXRpb24KLSAgQVNUQ29tbW9uLmgKLSAgQVNUUmVhZGVySW50ZXJuYWxzLmgKICAgQVNUQ29tbW9uLmNwcAogICBBU1RSZWFkZXIuY3BwCiAgIEFTVFJlYWRlckRlY2wuY3BwCkBAIC0xNCwyMyArMTYsMTQgQEAKICAgR2xvYmFsTW9kdWxlSW5kZXguY3BwCiAgIE1vZHVsZS5jcHAKICAgTW9kdWxlTWFuYWdlci5jcHAKLSAgKQogCi1hZGRfZGVwZW5kZW5jaWVzKGNsYW5nU2VyaWFsaXphdGlvbgotICBDbGFuZ0F0dHJDbGFzc2VzCi0gIENsYW5nQXR0ckxpc3QKLSAgQ2xhbmdBdHRyUGFyc2VkQXR0ckxpc3QKLSAgQ2xhbmdBdHRyUENIUmVhZAotICBDbGFuZ0F0dHJQQ0hXcml0ZQotICBDbGFuZ0NvbW1lbnROb2RlcwotICBDbGFuZ0RlY2xOb2RlcwotICBDbGFuZ0RpYWdub3N0aWNDb21tb24KLSAgQ2xhbmdEaWFnbm9zdGljTGV4Ci0gIENsYW5nRGlhZ25vc3RpY1NlbWEKLSAgQ2xhbmdEaWFnbm9zdGljU2VyaWFsaXphdGlvbgotICBDbGFuZ1N0bXROb2RlcwotICApCisgIEFERElUSU9OQUxfSEVBREVSUworICBBU1RDb21tb24uaAorICBBU1RSZWFkZXJJbnRlcm5hbHMuaAogCi10YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmdTZXJpYWxpemF0aW9uCisgIExJTktfTElCUworICBjbGFuZ0FTVAorICBjbGFuZ0Jhc2ljCisgIGNsYW5nTGV4CiAgIGNsYW5nU2VtYQogICApCmRpZmYgLS1naXQgYS9saWIvU2VyaWFsaXphdGlvbi9HbG9iYWxNb2R1bGVJbmRleC5jcHAgYi9saWIvU2VyaWFsaXphdGlvbi9HbG9iYWxNb2R1bGVJbmRleC5jcHAKaW5kZXggZmI2NDdiMC4uMTRiMTQ5ZiAxMDA2NDQKLS0tIGEvbGliL1NlcmlhbGl6YXRpb24vR2xvYmFsTW9kdWxlSW5kZXguY3BwCisrKyBiL2xpYi9TZXJpYWxpemF0aW9uL0dsb2JhbE1vZHVsZUluZGV4LmNwcApAQCAtODIsOSArODIsOSBAQAogCiAgIHN0YXRpYyBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPgogICBSZWFkS2V5RGF0YUxlbmd0aChjb25zdCB1bnNpZ25lZCBjaGFyKiYgZCkgewotICAgIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6aW87Ci0gICAgdW5zaWduZWQgS2V5TGVuID0gUmVhZFVuYWxpZ25lZExFMTYoZCk7Ci0gICAgdW5zaWduZWQgRGF0YUxlbiA9IFJlYWRVbmFsaWduZWRMRTE2KGQpOworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgIHVuc2lnbmVkIEtleUxlbiA9IGVuZGlhbjo6cmVhZE5leHQ8dWludDE2X3QsIGxpdHRsZSwgdW5hbGlnbmVkPihkKTsKKyAgICB1bnNpZ25lZCBEYXRhTGVuID0gZW5kaWFuOjpyZWFkTmV4dDx1aW50MTZfdCwgbGl0dGxlLCB1bmFsaWduZWQ+KGQpOwogICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihLZXlMZW4sIERhdGFMZW4pOwogICB9CiAKQEAgLTEwMSwxMSArMTAxLDExIEBACiAgIHN0YXRpYyBkYXRhX3R5cGUgUmVhZERhdGEoY29uc3QgaW50ZXJuYWxfa2V5X3R5cGUmIGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEYXRhTGVuKSB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIGNsYW5nOjppbzsKKyAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKIAogICAgIGRhdGFfdHlwZSBSZXN1bHQ7CiAgICAgd2hpbGUgKERhdGFMZW4gPiAwKSB7Ci0gICAgICB1bnNpZ25lZCBJRCA9IFJlYWRVbmFsaWduZWRMRTMyKGQpOworICAgICAgdW5zaWduZWQgSUQgPSBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CiAgICAgICBSZXN1bHQucHVzaF9iYWNrKElEKTsKICAgICAgIERhdGFMZW4gLT0gNDsKICAgICB9CkBAIC0yMjgsNyArMjI4LDcgQEAKICAgSW5kZXhQYXRoICs9IFBhdGg7CiAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKEluZGV4UGF0aCwgSW5kZXhGaWxlTmFtZSk7CiAKLSAgbGx2bTo6T3duaW5nUHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBCdWZmZXI7CiAgIGlmIChsbHZtOjpNZW1vcnlCdWZmZXI6OmdldEZpbGUoSW5kZXhQYXRoLmNfc3RyKCksIEJ1ZmZlcikgIT0KICAgICAgIGxsdm06OmVycmM6OnN1Y2Nlc3MpCiAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKChHbG9iYWxNb2R1bGVJbmRleCAqKTAsIEVDX05vdEZvdW5kKTsKQEAgLTI0Nyw4ICsyNDcsOSBAQAogICAgICAgQ3Vyc29yLlJlYWQoOCkgIT0gJ0knKSB7CiAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKChHbG9iYWxNb2R1bGVJbmRleCAqKTAsIEVDX0lPRXJyb3IpOwogICB9Ci0gIAotICByZXR1cm4gc3RkOjptYWtlX3BhaXIobmV3IEdsb2JhbE1vZHVsZUluZGV4KEJ1ZmZlci50YWtlKCksIEN1cnNvciksIEVDX05vbmUpOworCisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihuZXcgR2xvYmFsTW9kdWxlSW5kZXgoQnVmZmVyLnJlbGVhc2UoKSwgQ3Vyc29yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVDX05vbmUpOwogfQogCiB2b2lkCkBAIC00NTgsOCArNDU5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGF0YUxlbikgewogICAgICAgLy8gVGhlIGZpcnN0IGJpdCBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlkZW50aWZpZXIgaXMgaW50ZXJlc3RpbmcuCiAgICAgICAvLyBUaGF0J3MgYWxsIHdlIGNhcmUgYWJvdXQuCi0gICAgICB1c2luZyBuYW1lc3BhY2UgY2xhbmc6OmlvOwotICAgICAgdW5zaWduZWQgUmF3SUQgPSBSZWFkVW5hbGlnbmVkTEUzMihkKTsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgICAgdW5zaWduZWQgUmF3SUQgPSBlbmRpYW46OnJlYWROZXh0PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oZCk7CiAgICAgICBib29sIElzSW50ZXJlc3RpbmcgPSBSYXdJRCAmIDB4MDE7CiAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaywgSXNJbnRlcmVzdGluZyk7CiAgICAgfQpAQCAtNDY4LDcgKzQ2OSw3IEBACiAKIGJvb2wgR2xvYmFsTW9kdWxlSW5kZXhCdWlsZGVyOjpsb2FkTW9kdWxlRmlsZShjb25zdCBGaWxlRW50cnkgKkZpbGUpIHsKICAgLy8gT3BlbiB0aGUgbW9kdWxlIGZpbGUuCi0gIE93bmluZ1B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IEJ1ZmZlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyOwogICBzdGQ6OnN0cmluZyBFcnJvclN0cjsKICAgQnVmZmVyLnJlc2V0KEZpbGVNZ3IuZ2V0QnVmZmVyRm9yRmlsZShGaWxlLCAmRXJyb3JTdHIsIC8qaXNWb2xhdGlsZT0qL3RydWUpKTsKICAgaWYgKCFCdWZmZXIpIHsKQEAgLTU5MiwxMCArNTkzLDEwIEBACiAgICAgaWYgKFN0YXRlID09IEFTVEJsb2NrICYmIENvZGUgPT0gSURFTlRJRklFUl9UQUJMRSAmJiBSZWNvcmRbMF0gPiAwKSB7CiAgICAgICB0eXBlZGVmIE9uRGlza0NoYWluZWRIYXNoVGFibGU8SW50ZXJlc3RpbmdBU1RJZGVudGlmaWVyTG9va3VwVHJhaXQ+CiAgICAgICAgIEludGVyZXN0aW5nSWRlbnRpZmllclRhYmxlOwotICAgICAgbGx2bTo6T3duaW5nUHRyPEludGVyZXN0aW5nSWRlbnRpZmllclRhYmxlPgotICAgICAgICBUYWJsZShJbnRlcmVzdGluZ0lkZW50aWZpZXJUYWJsZTo6Q3JlYXRlKAotICAgICAgICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopQmxvYi5kYXRhKCkgKyBSZWNvcmRbMF0sCi0gICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilCbG9iLmRhdGEoKSkpOworICAgICAgc3RkOjp1bmlxdWVfcHRyPEludGVyZXN0aW5nSWRlbnRpZmllclRhYmxlPiBUYWJsZSgKKyAgICAgICAgICBJbnRlcmVzdGluZ0lkZW50aWZpZXJUYWJsZTo6Q3JlYXRlKAorICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKUJsb2IuZGF0YSgpICsgUmVjb3JkWzBdLAorICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKUJsb2IuZGF0YSgpKSk7CiAgICAgICBmb3IgKEludGVyZXN0aW5nSWRlbnRpZmllclRhYmxlOjpkYXRhX2l0ZXJhdG9yIEQgPSBUYWJsZS0+ZGF0YV9iZWdpbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERW5kID0gVGFibGUtPmRhdGFfZW5kKCk7CiAgICAgICAgICAgIEQgIT0gREVuZDsgKytEKSB7CkBAIC02MzAsMTAgKzYzMSwxMiBAQAogCiAgIHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4KICAgRW1pdEtleURhdGFMZW5ndGgocmF3X29zdHJlYW0mIE91dCwga2V5X3R5cGVfcmVmIEtleSwgZGF0YV90eXBlX3JlZiBEYXRhKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgZW5kaWFuOjpXcml0ZXI8bGl0dGxlPiBMRShPdXQpOwogICAgIHVuc2lnbmVkIEtleUxlbiA9IEtleS5zaXplKCk7CiAgICAgdW5zaWduZWQgRGF0YUxlbiA9IERhdGEuc2l6ZSgpICogNDsKLSAgICBjbGFuZzo6aW86OkVtaXQxNihPdXQsIEtleUxlbik7Ci0gICAgY2xhbmc6OmlvOjpFbWl0MTYoT3V0LCBEYXRhTGVuKTsKKyAgICBMRS53cml0ZTx1aW50MTZfdD4oS2V5TGVuKTsKKyAgICBMRS53cml0ZTx1aW50MTZfdD4oRGF0YUxlbik7CiAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEtleUxlbiwgRGF0YUxlbik7CiAgIH0KICAgCkBAIC02NDMsOCArNjQ2LDkgQEAKIAogICB2b2lkIEVtaXREYXRhKHJhd19vc3RyZWFtJiBPdXQsIGtleV90eXBlX3JlZiBLZXksIGRhdGFfdHlwZV9yZWYgRGF0YSwKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEYXRhTGVuKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CiAgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IERhdGEuc2l6ZSgpOyBJICE9IE47ICsrSSkKLSAgICAgIGNsYW5nOjppbzo6RW1pdDMyKE91dCwgRGF0YVtJXSk7CisgICAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+KE91dCkud3JpdGU8dWludDMyX3Q+KERhdGFbSV0pOwogICB9CiB9OwogCkBAIC03MDYsOSArNzEwLDEwIEBACiAgICAgU21hbGxTdHJpbmc8NDA5Nj4gSWRlbnRpZmllclRhYmxlOwogICAgIHVpbnQzMl90IEJ1Y2tldE9mZnNldDsKICAgICB7CisgICAgICB1c2luZyBuYW1lc3BhY2UgbGx2bTo6c3VwcG9ydDsKICAgICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gT3V0KElkZW50aWZpZXJUYWJsZSk7CiAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBubyBidWNrZXQgaXMgYXQgb2Zmc2V0IDAKLSAgICAgIGNsYW5nOjppbzo6RW1pdDMyKE91dCwgMCk7CisgICAgICBlbmRpYW46OldyaXRlcjxsaXR0bGU+KE91dCkud3JpdGU8dWludDMyX3Q+KDApOwogICAgICAgQnVja2V0T2Zmc2V0ID0gR2VuZXJhdG9yLkVtaXQoT3V0LCBUcmFpdCk7CiAgICAgfQogCkBAIC04MDcsMTMgKzgxMiwxMiBAQAogICAgIHJldHVybiBFQ19JT0Vycm9yOwogCiAgIC8vIFJlbW92ZSB0aGUgb2xkIGluZGV4IGZpbGUuIEl0IGlzbid0IHJlbGV2YW50IGFueSBtb3JlLgotICBib29sIE9sZEluZGV4RXhpc3RlZDsKLSAgbGx2bTo6c3lzOjpmczo6cmVtb3ZlKEluZGV4UGF0aC5zdHIoKSwgT2xkSW5kZXhFeGlzdGVkKTsKKyAgbGx2bTo6c3lzOjpmczo6cmVtb3ZlKEluZGV4UGF0aC5zdHIoKSk7CiAKICAgLy8gUmVuYW1lIHRoZSBuZXdseS13cml0dGVuIGluZGV4IGZpbGUgdG8gdGhlIHByb3BlciBuYW1lLgogICBpZiAobGx2bTo6c3lzOjpmczo6cmVuYW1lKEluZGV4VG1wUGF0aC5zdHIoKSwgSW5kZXhQYXRoLnN0cigpKSkgewogICAgIC8vIFJlbmFtZSBmYWlsZWQ7IGp1c3QgcmVtb3ZlIHRoZSAKLSAgICBsbHZtOjpzeXM6OmZzOjpyZW1vdmUoSW5kZXhUbXBQYXRoLnN0cigpLCBPbGRJbmRleEV4aXN0ZWQpOworICAgIGxsdm06OnN5czo6ZnM6OnJlbW92ZShJbmRleFRtcFBhdGguc3RyKCkpOwogICAgIHJldHVybiBFQ19JT0Vycm9yOwogICB9CiAKQEAgLTgzNSw3ICs4MzksNyBAQAogICAgICAgRW5kID0gSWR4LmtleV9lbmQoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIFN0cmluZ1JlZiBOZXh0KCkgeworICAgIFN0cmluZ1JlZiBOZXh0KCkgb3ZlcnJpZGUgewogICAgICAgaWYgKEN1cnJlbnQgPT0gRW5kKQogICAgICAgICByZXR1cm4gU3RyaW5nUmVmKCk7CiAKZGlmZiAtLWdpdCBhL2xpYi9TZXJpYWxpemF0aW9uL01vZHVsZU1hbmFnZXIuY3BwIGIvbGliL1NlcmlhbGl6YXRpb24vTW9kdWxlTWFuYWdlci5jcHAKaW5kZXggOWM0YjNkOS4uMzUxM2ViYSAxMDA2NDQKLS0tIGEvbGliL1NlcmlhbGl6YXRpb24vTW9kdWxlTWFuYWdlci5jcHAKKysrIGIvbGliL1NlcmlhbGl6YXRpb24vTW9kdWxlTWFuYWdlci5jcHAKQEAgLTg2LDYgKzg2LDE2IEBACiAgICAgTmV3TW9kdWxlID0gdHJ1ZTsKICAgICBNb2R1bGVFbnRyeSA9IE5ldzsKIAorICAgIE5ldy0+SW5wdXRGaWxlc1ZhbGlkYXRpb25UaW1lc3RhbXAgPSAwOworICAgIGlmIChOZXctPktpbmQgPT0gTUtfTW9kdWxlKSB7CisgICAgICBzdGQ6OnN0cmluZyBUaW1lc3RhbXBGaWxlbmFtZSA9IE5ldy0+Z2V0VGltZXN0YW1wRmlsZW5hbWUoKTsKKyAgICAgIHZmczo6U3RhdHVzIFN0YXR1czsKKyAgICAgIC8vIEEgY2FjaGVkIHN0YXQgdmFsdWUgd291bGQgYmUgZmluZSBhcyB3ZWxsLgorICAgICAgaWYgKCFGaWxlTWdyLmdldE5vbmNhY2hlZFN0YXRWYWx1ZShUaW1lc3RhbXBGaWxlbmFtZSwgU3RhdHVzKSkKKyAgICAgICAgTmV3LT5JbnB1dEZpbGVzVmFsaWRhdGlvblRpbWVzdGFtcCA9CisgICAgICAgICAgICBTdGF0dXMuZ2V0TGFzdE1vZGlmaWNhdGlvblRpbWUoKS50b0Vwb2NoVGltZSgpOworICAgIH0KKwogICAgIC8vIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtb2R1bGUKICAgICBpZiAobGx2bTo6TWVtb3J5QnVmZmVyICpCdWZmZXIgPSBsb29rdXBCdWZmZXIoRmlsZU5hbWUpKSB7CiAgICAgICAvLyBUaGUgYnVmZmVyIHdhcyBhbHJlYWR5IHByb3ZpZGVkIGZvciB1cy4KQEAgLTEyNCwyMiArMTM0LDYgQEAKICAgcmV0dXJuIE5ld01vZHVsZT8gTmV3bHlMb2FkZWQgOiBBbHJlYWR5TG9hZGVkOwogfQogCi1uYW1lc3BhY2UgewotICAvLy8gXGJyaWVmIFByZWRpY2F0ZSB0aGF0IGNoZWNrcyB3aGV0aGVyIGEgbW9kdWxlIGZpbGUgb2NjdXJzIHdpdGhpbgotICAvLy8gdGhlIGdpdmVuIHNldC4KLSAgY2xhc3MgSXNJbk1vZHVsZUZpbGVTZXQgOiBwdWJsaWMgc3RkOjp1bmFyeV9mdW5jdGlvbjxNb2R1bGVGaWxlICosIGJvb2w+IHsKLSAgICBsbHZtOjpTbWFsbFB0clNldDxNb2R1bGVGaWxlICosIDQ+ICZSZW1vdmVkOwotCi0gIHB1YmxpYzoKLSAgICBJc0luTW9kdWxlRmlsZVNldChsbHZtOjpTbWFsbFB0clNldDxNb2R1bGVGaWxlICosIDQ+ICZSZW1vdmVkKQotICAgIDogUmVtb3ZlZChSZW1vdmVkKSB7IH0KLQotICAgIGJvb2wgb3BlcmF0b3IoKShNb2R1bGVGaWxlICpNRikgY29uc3QgewotICAgICAgcmV0dXJuIFJlbW92ZWQuY291bnQoTUYpOwotICAgIH0KLSAgfTsKLX0KLQogdm9pZCBNb2R1bGVNYW5hZ2VyOjpyZW1vdmVNb2R1bGVzKE1vZHVsZUl0ZXJhdG9yIGZpcnN0LCBNb2R1bGVJdGVyYXRvciBsYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZU1hcCAqbW9kTWFwKSB7CiAgIGlmIChmaXJzdCA9PSBsYXN0KQpAQCAtMTQ5LDkgKzE0MywxMCBAQAogICBsbHZtOjpTbWFsbFB0clNldDxNb2R1bGVGaWxlICosIDQ+IHZpY3RpbVNldChmaXJzdCwgbGFzdCk7CiAKICAgLy8gUmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBub3ctZGVzdHJveWVkIG1vZHVsZXMuCi0gIElzSW5Nb2R1bGVGaWxlU2V0IGNoZWNrSW5TZXQodmljdGltU2V0KTsKICAgZm9yICh1bnNpZ25lZCBpID0gMCwgbiA9IENoYWluLnNpemUoKTsgaSAhPSBuOyArK2kpIHsKLSAgICBDaGFpbltpXS0+SW1wb3J0ZWRCeS5yZW1vdmVfaWYoY2hlY2tJblNldCk7CisgICAgQ2hhaW5baV0tPkltcG9ydGVkQnkucmVtb3ZlX2lmKFsmXShNb2R1bGVGaWxlICpNRikgeworICAgICAgcmV0dXJuIHZpY3RpbVNldC5jb3VudChNRik7CisgICAgfSk7CiAgIH0KIAogICAvLyBEZWxldGUgdGhlIG1vZHVsZXMgYW5kIGVyYXNlIHRoZW0gZnJvbSB0aGUgdmFyaW91cyBzdHJ1Y3R1cmVzLgpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0FuYWx5emVyU3RhdHNDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9BbmFseXplclN0YXRzQ2hlY2tlci5jcHAKaW5kZXggOWFmMGE1YS4uM2JlY2RjYSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0FuYWx5emVyU3RhdHNDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQW5hbHl6ZXJTdGF0c0NoZWNrZXIuY3BwCkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICAgIDw8ICIgfCBFbXB0eSBXb3JrTGlzdDogIgogICAgICAgPDwgKEVuZy5oYXNFbXB0eVdvcmtMaXN0KCkgPyAieWVzIiA6ICJubyIpOwogCi0gIEIuRW1pdEJhc2ljUmVwb3J0KEQsICJBbmFseXplciBTdGF0aXN0aWNzIiwgIkludGVybmFsIFN0YXRpc3RpY3MiLAorICBCLkVtaXRCYXNpY1JlcG9ydChELCB0aGlzLCAiQW5hbHl6ZXIgU3RhdGlzdGljcyIsICJJbnRlcm5hbCBTdGF0aXN0aWNzIiwKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnN0cigpLCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uKEQsIFNNKSk7CiAKICAgLy8gRW1pdCB3YXJuaW5nIGZvciBlYWNoIGJsb2NrIHdlIGJhaWxlZCBvdXQgb24uCkBAIC0xMjksNyArMTI5LDcgQEAKICAgICAgIG91dHB1dEkgPDwgIigiIDw8IE5hbWVPZlJvb3RGdW5jdGlvbiA8PCAiKSIgPDwKICAgICAgICAgICAgICAgICAgIjogVGhlIGFuYWx5emVyIGdlbmVyYXRlZCBhIHNpbmsgYXQgdGhpcyBwb2ludCI7CiAgICAgICBCLkVtaXRCYXNpY1JlcG9ydCgKLSAgICAgICAgICBELCAiU2luayBQb2ludCIsICJJbnRlcm5hbCBTdGF0aXN0aWNzIiwgb3V0cHV0SS5zdHIoKSwKKyAgICAgICAgICBELCB0aGlzLCAiU2luayBQb2ludCIsICJJbnRlcm5hbCBTdGF0aXN0aWNzIiwgb3V0cHV0SS5zdHIoKSwKICAgICAgICAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uOjpjcmVhdGVCZWdpbihDUy0+Z2V0U3RtdCgpLCBTTSwgTEMpKTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9BbmRyb2lkLm1rIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0FuZHJvaWQubWsKaW5kZXggOTAyZmMxMS4uYmIyYTUzOSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0FuZHJvaWQubWsKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0FuZHJvaWQubWsKQEAgLTUsNiArNSw3IEBACiAgIEF0dHJMaXN0LmluYyBcCiAgIEF0dHJQYXJzZWRBdHRyTGlzdC5pbmMgXAogICBBdHRycy5pbmMgXAorICBBdHRyVmlzaXRvci5pbmMgXAogICBDaGVja2Vycy5pbmMgXAogICBDb21tZW50Q29tbWFuZExpc3QuaW5jIFwKICAgQ29tbWVudE5vZGVzLmluYyBcCkBAIC00MSw3ICs0Miw2IEBACiAgIEV4cHJJbnNwZWN0aW9uQ2hlY2tlci5jcHAgXAogICBGaXhlZEFkZHJlc3NDaGVja2VyLmNwcCBcCiAgIEdlbmVyaWNUYWludENoZWNrZXIuY3BwIFwKLSAgSWRlbXBvdGVudE9wZXJhdGlvbkNoZWNrZXIuY3BwIFwKICAgSWRlbnRpY2FsRXhwckNoZWNrZXIuY3BwIFwKICAgSXZhckludmFsaWRhdGlvbkNoZWNrZXIuY3BwIFwKICAgTExWTUNvbnZlbnRpb25zQ2hlY2tlci5jcHAgXApkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0FycmF5Qm91bmRDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9BcnJheUJvdW5kQ2hlY2tlci5jcHAKaW5kZXggMzEyYmM3NC4uY2I1YjAxMCAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0FycmF5Qm91bmRDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQXJyYXlCb3VuZENoZWNrZXIuY3BwCkBAIC0yNSw3ICsyNSw4IEBACiBuYW1lc3BhY2UgewogY2xhc3MgQXJyYXlCb3VuZENoZWNrZXIgOiAKICAgICBwdWJsaWMgQ2hlY2tlcjxjaGVjazo6TG9jYXRpb24+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVpbHRpbkJ1Zz4gQlQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1aWx0aW5CdWc+IEJUOworCiBwdWJsaWM6CiAgIHZvaWQgY2hlY2tMb2NhdGlvbihTVmFsIGwsIGJvb2wgaXNMb2FkLCBjb25zdCBTdG10KiBTLAogICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwpAQCAtNjYsOCArNjcsOSBAQAogICAgICAgcmV0dXJuOwogICAKICAgICBpZiAoIUJUKQotICAgICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcoIk91dC1vZi1ib3VuZCBhcnJheSBhY2Nlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAiQWNjZXNzIG91dC1vZi1ib3VuZCBhcnJheSBlbGVtZW50IChidWZmZXIgb3ZlcmZsb3cpIikpOworICAgICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcoCisgICAgICAgICAgdGhpcywgIk91dC1vZi1ib3VuZCBhcnJheSBhY2Nlc3MiLAorICAgICAgICAgICJBY2Nlc3Mgb3V0LW9mLWJvdW5kIGFycmF5IGVsZW1lbnQgKGJ1ZmZlciBvdmVyZmxvdykiKSk7CiAKICAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgbmljZSB0byBldmVudHVhbGx5IG1ha2UgdGhpcyBkaWFnbm9zdGljIG1vcmUgY2xlYXIsCiAgICAgLy8gZS5nLiwgYnkgcmVmZXJlbmNpbmcgdGhlIG9yaWdpbmFsIGRlY2xhcmF0aW9uIG9yIGJ5IHNheWluZyAqd2h5KiB0aGlzCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQXJyYXlCb3VuZENoZWNrZXJWMi5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQXJyYXlCb3VuZENoZWNrZXJWMi5jcHAKaW5kZXggNWU0YjgyNC4uYThkN2IzYSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0FycmF5Qm91bmRDaGVja2VyVjIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9BcnJheUJvdW5kQ2hlY2tlclYyLmNwcApAQCAtMjgsOCArMjgsOCBAQAogbmFtZXNwYWNlIHsKIGNsYXNzIEFycmF5Qm91bmRDaGVja2VyVjIgOiAKICAgICBwdWJsaWMgQ2hlY2tlcjxjaGVjazo6TG9jYXRpb24+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVpbHRpbkJ1Zz4gQlQ7Ci0gICAgICAKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVpbHRpbkJ1Zz4gQlQ7CisKICAgZW51bSBPT0JfS2luZCB7IE9PQl9QcmVjZWRlcywgT09CX0V4Y2VkZXMsIE9PQl9UYWludGVkIH07CiAgIAogICB2b2lkIHJlcG9ydE9PQihDaGVja2VyQ29udGV4dCAmQywgUHJvZ3JhbVN0YXRlUmVmIGVycm9yU3RhdGUsCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgIHJldHVybjsKICAgICAKICAgICBQcm9ncmFtU3RhdGVSZWYgc3RhdGVfcHJlY2VkZXNMb3dlckJvdW5kLCBzdGF0ZV93aXRoaW5Mb3dlckJvdW5kOwotICAgIGxsdm06OnRpZShzdGF0ZV9wcmVjZWRlc0xvd2VyQm91bmQsIHN0YXRlX3dpdGhpbkxvd2VyQm91bmQpID0KKyAgICBzdGQ6OnRpZShzdGF0ZV9wcmVjZWRlc0xvd2VyQm91bmQsIHN0YXRlX3dpdGhpbkxvd2VyQm91bmQpID0KICAgICAgIHN0YXRlLT5hc3N1bWUoKmxvd2VyQm91bmRUb0NoZWNrKTsKIAogICAgIC8vIEFyZSB3ZSBjb25zdHJhaW5lZCBlbm91Z2ggdG8gZGVmaW5pdGVseSBwcmVjZWRlIHRoZSBsb3dlciBib3VuZD8KQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgICAgYnJlYWs7CiAgIAogICAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZV9leGNlZWRzVXBwZXJCb3VuZCwgc3RhdGVfd2l0aGluVXBwZXJCb3VuZDsKLSAgICBsbHZtOjp0aWUoc3RhdGVfZXhjZWVkc1VwcGVyQm91bmQsIHN0YXRlX3dpdGhpblVwcGVyQm91bmQpID0KKyAgICBzdGQ6OnRpZShzdGF0ZV9leGNlZWRzVXBwZXJCb3VuZCwgc3RhdGVfd2l0aGluVXBwZXJCb3VuZCkgPQogICAgICAgc3RhdGUtPmFzc3VtZSgqdXBwZXJib3VuZFRvQ2hlY2spOwogCiAgICAgLy8gSWYgd2UgYXJlIHVuZGVyIGNvbnN0cmFpbmVkIGFuZCB0aGUgaW5kZXggdmFyaWFibGVzIGFyZSB0YWludGVkLCByZXBvcnQuCkBAIC0xODcsNyArMTg3LDcgQEAKICAgICByZXR1cm47CiAKICAgaWYgKCFCVCkKLSAgICBCVC5yZXNldChuZXcgQnVpbHRpbkJ1ZygiT3V0LW9mLWJvdW5kIGFjY2VzcyIpKTsKKyAgICBCVC5yZXNldChuZXcgQnVpbHRpbkJ1Zyh0aGlzLCAiT3V0LW9mLWJvdW5kIGFjY2VzcyIpKTsKIAogICAvLyBGSVhNRTogVGhpcyBkaWFnbm9zdGljcyBhcmUgcHJlbGltaW5hcnkuICBXZSBzaG91bGQgZ2V0IGZhciBiZXR0ZXIKICAgLy8gZGlhZ25vc3RpY3MgZm9yIGV4cGxhaW5pbmcgYnVmZmVyIG92ZXJydW5zLgpAQCAtMzExLDcgKzMxMSw2IEBACiAgIHJldHVybiBSZWdpb25SYXdPZmZzZXRWMigpOwogfQogCi0KIHZvaWQgZW50bzo6cmVnaXN0ZXJBcnJheUJvdW5kQ2hlY2tlclYyKENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKICAgbWdyLnJlZ2lzdGVyQ2hlY2tlcjxBcnJheUJvdW5kQ2hlY2tlclYyPigpOwogfQpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0Jhc2ljT2JqQ0ZvdW5kYXRpb25DaGVja3MuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0Jhc2ljT2JqQ0ZvdW5kYXRpb25DaGVja3MuY3BwCmluZGV4IGY2NmY4YjcuLjRiMmNjZDQgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9CYXNpY09iakNGb3VuZGF0aW9uQ2hlY2tzLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQmFzaWNPYmpDRm91bmRhdGlvbkNoZWNrcy5jcHAKQEAgLTM5LDcgKzM5LDggQEAKIG5hbWVzcGFjZSB7CiBjbGFzcyBBUElNaXN1c2UgOiBwdWJsaWMgQnVnVHlwZSB7CiBwdWJsaWM6Ci0gIEFQSU1pc3VzZShjb25zdCBjaGFyKiBuYW1lKSA6IEJ1Z1R5cGUobmFtZSwgIkFQSSBNaXN1c2UgKEFwcGxlKSIpIHt9CisgIEFQSU1pc3VzZShjb25zdCBDaGVja2VyQmFzZSAqY2hlY2tlciwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgIDogQnVnVHlwZShjaGVja2VyLCBuYW1lLCAiQVBJIE1pc3VzZSAoQXBwbGUpIikge30KIH07CiB9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKQEAgLTk0LDcgKzk1LDcgQEAKICAgY2xhc3MgTmlsQXJnQ2hlY2tlciA6IHB1YmxpYyBDaGVja2VyPGNoZWNrOjpQcmVPYmpDTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrOjpQb3N0U3RtdDxPYmpDRGljdGlvbmFyeUxpdGVyYWw+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s6OlBvc3RTdG10PE9iakNBcnJheUxpdGVyYWw+ID4gewotICAgIG11dGFibGUgT3duaW5nUHRyPEFQSU1pc3VzZT4gQlQ7CisgICAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QVBJTWlzdXNlPiBCVDsKIAogICAgIHZvaWQgd2FybklmTmlsRXhwcihjb25zdCBFeHByICpFLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpNc2csCkBAIC0xNzAsMTAgKzE3MSwxMyBAQAogICAgICAgICAgIGFzc2VydChBcmcgPT0gMSk7CiAgICAgICAgICAgb3MgPDwgIktleSBhcmd1bWVudCAiOwogICAgICAgICB9Ci0gICAgICAgIG9zIDw8ICJ0byAnIiA8PCBtc2cuZ2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpIDw8ICInIGNhbm5vdCBiZSBuaWwiOworICAgICAgICBvcyA8PCAidG8gJyI7CisgICAgICAgIG1zZy5nZXRTZWxlY3RvcigpLnByaW50KG9zKTsKKyAgICAgICAgb3MgPDwgIicgY2Fubm90IGJlIG5pbCI7CiAgICAgICB9IGVsc2UgewotICAgICAgICBvcyA8PCAiQXJndW1lbnQgdG8gJyIgPDwgR2V0UmVjZWl2ZXJJbnRlcmZhY2VOYW1lKG1zZykgPDwgIicgbWV0aG9kICciCi0gICAgICAgIDw8IG1zZy5nZXRTZWxlY3RvcigpLmdldEFzU3RyaW5nKCkgPDwgIicgY2Fubm90IGJlIG5pbCI7CisgICAgICAgIG9zIDw8ICJBcmd1bWVudCB0byAnIiA8PCBHZXRSZWNlaXZlckludGVyZmFjZU5hbWUobXNnKSA8PCAiJyBtZXRob2QgJyI7CisgICAgICAgIG1zZy5nZXRTZWxlY3RvcigpLnByaW50KG9zKTsKKyAgICAgICAgb3MgPDwgIicgY2Fubm90IGJlIG5pbCI7CiAgICAgICB9CiAgICAgfQogICAgIApAQCAtMTg4LDcgKzE5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdCB7CiAgIGlmICghQlQpCi0gICAgQlQucmVzZXQobmV3IEFQSU1pc3VzZSgibmlsIGFyZ3VtZW50IikpOworICAgIEJULnJlc2V0KG5ldyBBUElNaXN1c2UodGhpcywgIm5pbCBhcmd1bWVudCIpKTsKIAogICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVCwgTXNnLCBOKTsKICAgUi0+YWRkUmFuZ2UoUmFuZ2UpOwpAQCAtMzA5LDcgKzMxMyw3IEBACiAKIG5hbWVzcGFjZSB7CiBjbGFzcyBDRk51bWJlckNyZWF0ZUNoZWNrZXIgOiBwdWJsaWMgQ2hlY2tlcjwgY2hlY2s6OlByZVN0bXQ8Q2FsbEV4cHI+ID4gewotICBtdXRhYmxlIE93bmluZ1B0cjxBUElNaXN1c2U+IEJUOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxBUElNaXN1c2U+IEJUOwogICBtdXRhYmxlIElkZW50aWZpZXJJbmZvKiBJSTsKIHB1YmxpYzoKICAgQ0ZOdW1iZXJDcmVhdGVDaGVja2VyKCkgOiBJSSgwKSB7fQpAQCAtNDgwLDggKzQ4NCw4IEBACiAgICAgICA8PCAiIGJpdHMgb2YgdGhlIGlucHV0IGludGVnZXIgd2lsbCBiZSBsb3N0LiI7CiAKICAgICBpZiAoIUJUKQotICAgICAgQlQucmVzZXQobmV3IEFQSU1pc3VzZSgiQmFkIHVzZSBvZiBDRk51bWJlckNyZWF0ZSIpKTsKLSAgICAKKyAgICAgIEJULnJlc2V0KG5ldyBBUElNaXN1c2UodGhpcywgIkJhZCB1c2Ugb2YgQ0ZOdW1iZXJDcmVhdGUiKSk7CisKICAgICBCdWdSZXBvcnQgKnJlcG9ydCA9IG5ldyBCdWdSZXBvcnQoKkJULCBvcy5zdHIoKSwgTik7CiAgICAgcmVwb3J0LT5hZGRSYW5nZShDRS0+Z2V0QXJnKDIpLT5nZXRTb3VyY2VSYW5nZSgpKTsKICAgICBDLmVtaXRSZXBvcnQocmVwb3J0KTsKQEAgLTQ5NCw3ICs0OTgsNyBAQAogCiBuYW1lc3BhY2UgewogY2xhc3MgQ0ZSZXRhaW5SZWxlYXNlQ2hlY2tlciA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6UHJlU3RtdDxDYWxsRXhwcj4gPiB7Ci0gIG11dGFibGUgT3duaW5nUHRyPEFQSU1pc3VzZT4gQlQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEFQSU1pc3VzZT4gQlQ7CiAgIG11dGFibGUgSWRlbnRpZmllckluZm8gKlJldGFpbiwgKlJlbGVhc2UsICpNYWtlQ29sbGVjdGFibGU7CiBwdWJsaWM6CiAgIENGUmV0YWluUmVsZWFzZUNoZWNrZXIoKTogUmV0YWluKDApLCBSZWxlYXNlKDApLCBNYWtlQ29sbGVjdGFibGUoMCkge30KQEAgLTUxOSw4ICs1MjMsOCBAQAogICAgIFJldGFpbiA9ICZDdHguSWRlbnRzLmdldCgiQ0ZSZXRhaW4iKTsKICAgICBSZWxlYXNlID0gJkN0eC5JZGVudHMuZ2V0KCJDRlJlbGVhc2UiKTsKICAgICBNYWtlQ29sbGVjdGFibGUgPSAmQ3R4LklkZW50cy5nZXQoIkNGTWFrZUNvbGxlY3RhYmxlIik7Ci0gICAgQlQucmVzZXQoCi0gICAgICBuZXcgQVBJTWlzdXNlKCJudWxsIHBhc3NlZCB0byBDRlJldGFpbi9DRlJlbGVhc2UvQ0ZNYWtlQ29sbGVjdGFibGUiKSk7CisgICAgQlQucmVzZXQobmV3IEFQSU1pc3VzZSgKKyAgICAgICAgdGhpcywgIm51bGwgcGFzc2VkIHRvIENGUmV0YWluL0NGUmVsZWFzZS9DRk1ha2VDb2xsZWN0YWJsZSIpKTsKICAgfQogCiAgIC8vIENoZWNrIGlmIHdlIGNhbGxlZCBDRlJldGFpbi9DRlJlbGVhc2UvQ0ZNYWtlQ29sbGVjdGFibGUuCkBAIC01NDgsNyArNTUyLDcgQEAKIAogICAvLyBBcmUgdGhleSBlcXVhbD8KICAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlVHJ1ZSwgc3RhdGVGYWxzZTsKLSAgbGx2bTo6dGllKHN0YXRlVHJ1ZSwgc3RhdGVGYWxzZSkgPSBzdGF0ZS0+YXNzdW1lKEFyZ0lzTnVsbCk7CisgIHN0ZDo6dGllKHN0YXRlVHJ1ZSwgc3RhdGVGYWxzZSkgPSBzdGF0ZS0+YXNzdW1lKEFyZ0lzTnVsbCk7CiAKICAgaWYgKHN0YXRlVHJ1ZSAmJiAhc3RhdGVGYWxzZSkgewogICAgIEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKHN0YXRlVHJ1ZSk7CkBAIC01ODYsNyArNTkwLDcgQEAKICAgbXV0YWJsZSBTZWxlY3RvciByZXRhaW5TOwogICBtdXRhYmxlIFNlbGVjdG9yIGF1dG9yZWxlYXNlUzsKICAgbXV0YWJsZSBTZWxlY3RvciBkcmFpblM7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVDsKIAogcHVibGljOgogICB2b2lkIGNoZWNrUHJlT2JqQ01lc3NhZ2UoY29uc3QgT2JqQ01ldGhvZENhbGwgJm1zZywgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwpAQCAtNTk3LDkgKzYwMSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0IHsKICAgCiAgIGlmICghQlQpIHsKLSAgICBCVC5yZXNldChuZXcgQVBJTWlzdXNlKCJtZXNzYWdlIGluY29ycmVjdGx5IHNlbnQgdG8gY2xhc3MgaW5zdGVhZCBvZiBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2UiKSk7Ci0gIAorICAgIEJULnJlc2V0KG5ldyBBUElNaXN1c2UoCisgICAgICAgIHRoaXMsICJtZXNzYWdlIGluY29ycmVjdGx5IHNlbnQgdG8gY2xhc3MgaW5zdGVhZCBvZiBjbGFzcyBpbnN0YW5jZSIpKTsKKwogICAgIEFTVENvbnRleHQgJkN0eCA9IEMuZ2V0QVNUQ29udGV4dCgpOwogICAgIHJlbGVhc2VTID0gR2V0TnVsbGFyeVNlbGVjdG9yKCJyZWxlYXNlIiwgQ3R4KTsKICAgICByZXRhaW5TID0gR2V0TnVsbGFyeVNlbGVjdG9yKCJyZXRhaW4iLCBDdHgpOwpAQCAtNjIwLDcgKzYyNCw5IEBACiAgICAgU21hbGxTdHJpbmc8MjAwPiBidWY7CiAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvcyhidWYpOwogCi0gICAgb3MgPDwgIlRoZSAnIiA8PCBTLmdldEFzU3RyaW5nKCkgPDwgIicgbWVzc2FnZSBzaG91bGQgYmUgc2VudCB0byBpbnN0YW5jZXMgIgorICAgIG9zIDw8ICJUaGUgJyI7CisgICAgUy5wcmludChvcyk7CisgICAgb3MgPDwgIicgbWVzc2FnZSBzaG91bGQgYmUgc2VudCB0byBpbnN0YW5jZXMgIgogICAgICAgICAgICJvZiBjbGFzcyAnIiA8PCBDbGFzcy0+Z2V0TmFtZSgpCiAgICAgICAgPDwgIicgYW5kIG5vdCB0aGUgY2xhc3MgZGlyZWN0bHkiOwogICAKQEAgLTY0Myw3ICs2NDksNyBAQAogICBtdXRhYmxlIFNlbGVjdG9yIG9yZGVyZWRTZXRXaXRoT2JqZWN0c1M7CiAgIG11dGFibGUgU2VsZWN0b3IgaW5pdFdpdGhPYmplY3RzUzsKICAgbXV0YWJsZSBTZWxlY3RvciBpbml0V2l0aE9iamVjdHNBbmRLZXlzUzsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUOwogCiAgIGJvb2wgaXNWYXJpYWRpY01lc3NhZ2UoY29uc3QgT2JqQ01ldGhvZENhbGwgJm1zZykgY29uc3Q7CiAKQEAgLTcwMyw3ICs3MDksOCBAQAogdm9pZCBWYXJpYWRpY01ldGhvZFR5cGVDaGVja2VyOjpjaGVja1ByZU9iakNNZXNzYWdlKGNvbnN0IE9iakNNZXRob2RDYWxsICZtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0IHsKICAgaWYgKCFCVCkgewotICAgIEJULnJlc2V0KG5ldyBBUElNaXN1c2UoIkFyZ3VtZW50cyBwYXNzZWQgdG8gdmFyaWFkaWMgbWV0aG9kIGFyZW4ndCBhbGwgIgorICAgIEJULnJlc2V0KG5ldyBBUElNaXN1c2UodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudHMgcGFzc2VkIHRvIHZhcmlhZGljIG1ldGhvZCBhcmVuJ3QgYWxsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3RpdmUtQyBwb2ludGVyIHR5cGVzIikpOwogCiAgICAgQVNUQ29udGV4dCAmQ3R4ID0gQy5nZXRBU1RDb250ZXh0KCk7CkBAIC03MzMsOCArNzQwLDcgQEAKIAogICAvLyBWZXJpZnkgdGhhdCBhbGwgYXJndW1lbnRzIGhhdmUgT2JqZWN0aXZlLUMgdHlwZXMuCiAgIE9wdGlvbmFsPEV4cGxvZGVkTm9kZSo+IGVycm9yTm9kZTsKLSAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlID0gQy5nZXRTdGF0ZSgpOwotICAKKwogICBmb3IgKHVuc2lnbmVkIEkgPSB2YXJpYWRpY0FyZ3NCZWdpbjsgSSAhPSB2YXJpYWRpY0FyZ3NFbmQ7ICsrSSkgewogICAgIFF1YWxUeXBlIEFyZ1R5ID0gbXNnLmdldEFyZ0V4cHIoSSktPmdldFR5cGUoKTsKICAgICBpZiAoQXJnVHktPmlzT2JqQ09iamVjdFBvaW50ZXJUeXBlKCkpCkBAIC03NzIsOCArNzc4LDggQEAKICAgICBlbHNlCiAgICAgICBvcyA8PCAiQXJndW1lbnQgdG8gbWV0aG9kICciOwogCi0gICAgb3MgPDwgbXNnLmdldFNlbGVjdG9yKCkuZ2V0QXNTdHJpbmcoKSAKLSAgICAgICA8PCAiJyBzaG91bGQgYmUgYW4gT2JqZWN0aXZlLUMgcG9pbnRlciB0eXBlLCBub3QgJyI7CisgICAgbXNnLmdldFNlbGVjdG9yKCkucHJpbnQob3MpOworICAgIG9zIDw8ICInIHNob3VsZCBiZSBhbiBPYmplY3RpdmUtQyBwb2ludGVyIHR5cGUsIG5vdCAnIjsKICAgICBBcmdUeS5wcmludChvcywgQy5nZXRMYW5nT3B0cygpKTsKICAgICBvcyA8PCAiJyI7CiAKQEAgLTg1Miw3ICs4NTgsNyBAQAogICAgIHJldHVybiBTdGF0ZTsKIAogICBQcm9ncmFtU3RhdGVSZWYgU3ROb25OaWwsIFN0TmlsOwotICBsbHZtOjp0aWUoU3ROb25OaWwsIFN0TmlsKSA9IFN0YXRlLT5hc3N1bWUoKktub3duQ29sbGVjdGlvbik7CisgIHN0ZDo6dGllKFN0Tm9uTmlsLCBTdE5pbCkgPSBTdGF0ZS0+YXNzdW1lKCpLbm93bkNvbGxlY3Rpb24pOwogICBpZiAoU3ROaWwgJiYgIVN0Tm9uTmlsKSB7CiAgICAgLy8gVGhlIGNvbGxlY3Rpb24gaXMgbmlsLiBUaGlzIHBhdGggaXMgaW5mZWFzaWJsZS4KICAgICByZXR1cm4gTlVMTDsKQEAgLTExMzUsNyArMTE0MSwxMCBAQAogLy8vIFxicmllZiBUaGUgY2hlY2tlciByZXN0cmljdHMgdGhlIHJldHVybiB2YWx1ZXMgb2YgQVBJcyBrbm93biB0bwogLy8vIG5ldmVyIChvciBhbG1vc3QgbmV2ZXIpIHJldHVybiAnbmlsJy4KIGNsYXNzIE9iakNOb25OaWxSZXR1cm5WYWx1ZUNoZWNrZXIKLSAgOiBwdWJsaWMgQ2hlY2tlcjxjaGVjazo6UG9zdE9iakNNZXNzYWdlPiB7CisgIDogcHVibGljIENoZWNrZXI8Y2hlY2s6OlBvc3RPYmpDTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICBjaGVjazo6UG9zdFN0bXQ8T2JqQ0FycmF5TGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgY2hlY2s6OlBvc3RTdG10PE9iakNEaWN0aW9uYXJ5TGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgY2hlY2s6OlBvc3RTdG10PE9iakNCb3hlZEV4cHI+ID4gewogICAgIG11dGFibGUgYm9vbCBJbml0aWFsaXplZDsKICAgICBtdXRhYmxlIFNlbGVjdG9yIE9iamVjdEF0SW5kZXg7CiAgICAgbXV0YWJsZSBTZWxlY3RvciBPYmplY3RBdEluZGV4ZWRTdWJzY3JpcHQ7CkBAIC0xMTQzLDEzICsxMTUyLDMyIEBACiAKIHB1YmxpYzoKICAgT2JqQ05vbk5pbFJldHVyblZhbHVlQ2hlY2tlcigpIDogSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKKyAgUHJvZ3JhbVN0YXRlUmVmIGFzc3VtZUV4cHJJc05vbk51bGwoY29uc3QgRXhwciAqTm9uTnVsbEV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OworICB2b2lkIGFzc3VtZUV4cHJJc05vbk51bGwoY29uc3QgRXhwciAqRSwgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0IHsKKyAgICBDLmFkZFRyYW5zaXRpb24oYXNzdW1lRXhwcklzTm9uTnVsbChFLCBDLmdldFN0YXRlKCksIEMpKTsKKyAgfQorCisgIHZvaWQgY2hlY2tQb3N0U3RtdChjb25zdCBPYmpDQXJyYXlMaXRlcmFsICpFLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3QgeworICAgIGFzc3VtZUV4cHJJc05vbk51bGwoRSwgQyk7CisgIH0KKyAgdm9pZCBjaGVja1Bvc3RTdG10KGNvbnN0IE9iakNEaWN0aW9uYXJ5TGl0ZXJhbCAqRSwgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0IHsKKyAgICBhc3N1bWVFeHBySXNOb25OdWxsKEUsIEMpOworICB9CisgIHZvaWQgY2hlY2tQb3N0U3RtdChjb25zdCBPYmpDQm94ZWRFeHByICpFLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3QgeworICAgIGFzc3VtZUV4cHJJc05vbk51bGwoRSwgQyk7CisgIH0KKwogICB2b2lkIGNoZWNrUG9zdE9iakNNZXNzYWdlKGNvbnN0IE9iakNNZXRob2RDYWxsICZNLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CiB9OwogfQogCi1zdGF0aWMgUHJvZ3JhbVN0YXRlUmVmIGFzc3VtZUV4cHJJc05vbk51bGwoY29uc3QgRXhwciAqTm9uTnVsbEV4cHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSB7CitQcm9ncmFtU3RhdGVSZWYKK09iakNOb25OaWxSZXR1cm5WYWx1ZUNoZWNrZXI6OmFzc3VtZUV4cHJJc05vbk51bGwoY29uc3QgRXhwciAqTm9uTnVsbEV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0IHsKICAgU1ZhbCBWYWwgPSBTdGF0ZS0+Z2V0U1ZhbChOb25OdWxsRXhwciwgQy5nZXRMb2NhdGlvbkNvbnRleHQoKSk7CiAgIGlmIChPcHRpb25hbDxEZWZpbmVkT3JVbmtub3duU1ZhbD4gRFYgPSBWYWwuZ2V0QXM8RGVmaW5lZE9yVW5rbm93blNWYWw+KCkpCiAgICAgcmV0dXJuIFN0YXRlLT5hc3N1bWUoKkRWLCB0cnVlKTsKQEAgLTEyMzcsNiArMTI2NSw3IEBACiAgIG1nci5yZWdpc3RlckNoZWNrZXI8T2JqQ0xvb3BDaGVja2VyPigpOwogfQogCi12b2lkIGVudG86OnJlZ2lzdGVyT2JqQ05vbk5pbFJldHVyblZhbHVlQ2hlY2tlcihDaGVja2VyTWFuYWdlciAmbWdyKSB7Cit2b2lkCitlbnRvOjpyZWdpc3Rlck9iakNOb25OaWxSZXR1cm5WYWx1ZUNoZWNrZXIoQ2hlY2tlck1hbmFnZXIgJm1ncikgewogICBtZ3IucmVnaXN0ZXJDaGVja2VyPE9iakNOb25OaWxSZXR1cm5WYWx1ZUNoZWNrZXI+KCk7CiB9CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQm9vbEFzc2lnbm1lbnRDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Cb29sQXNzaWdubWVudENoZWNrZXIuY3BwCmluZGV4IDUxNjkyNDQuLjgzYTM3YzkgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Cb29sQXNzaWdubWVudENoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Cb29sQXNzaWdubWVudENoZWNrZXIuY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAKIG5hbWVzcGFjZSB7CiAgIGNsYXNzIEJvb2xBc3NpZ25tZW50Q2hlY2tlciA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6QmluZCA+IHsKLSAgICBtdXRhYmxlIE93bmluZ1B0cjxCdWlsdGluQnVnPiBCVDsKKyAgICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWlsdGluQnVnPiBCVDsKICAgICB2b2lkIGVtaXRSZXBvcnQoUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CiAgIHB1YmxpYzoKICAgICB2b2lkIGNoZWNrQmluZChTVmFsIGxvYywgU1ZhbCB2YWwsIGNvbnN0IFN0bXQgKlMsIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdDsKQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdCB7CiAgIGlmIChFeHBsb2RlZE5vZGUgKk4gPSBDLmFkZFRyYW5zaXRpb24oc3RhdGUpKSB7CiAgICAgaWYgKCFCVCkKLSAgICAgIEJULnJlc2V0KG5ldyBCdWlsdGluQnVnKCJBc3NpZ25tZW50IG9mIGEgbm9uLUJvb2xlYW4gdmFsdWUiKSk7ICAgIAorICAgICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcodGhpcywgIkFzc2lnbm1lbnQgb2YgYSBub24tQm9vbGVhbiB2YWx1ZSIpKTsKICAgICBDLmVtaXRSZXBvcnQobmV3IEJ1Z1JlcG9ydCgqQlQsIEJULT5nZXREZXNjcmlwdGlvbigpLCBOKSk7CiAgIH0KIH0KQEAgLTk2LDcgKzk2LDcgQEAKICAgfQogICAKICAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlTFQsIHN0YXRlR0U7Ci0gIGxsdm06OnRpZShzdGF0ZUdFLCBzdGF0ZUxUKSA9IENNLmFzc3VtZUR1YWwoc3RhdGUsICpncmVhdGVyVGhhbkVxdWFsVG9aZXJvKTsKKyAgc3RkOjp0aWUoc3RhdGVHRSwgc3RhdGVMVCkgPSBDTS5hc3N1bWVEdWFsKHN0YXRlLCAqZ3JlYXRlclRoYW5FcXVhbFRvWmVybyk7CiAgIAogICAvLyBJcyBpdCBwb3NzaWJsZSBmb3IgdGhlIHZhbHVlIHRvIGJlIGxlc3MgdGhhbiB6ZXJvPwogICBpZiAoc3RhdGVMVCkgewpAQCAtMTMyLDcgKzEzMiw3IEBACiAgIH0KICAgCiAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZUdULCBzdGF0ZUxFOwotICBsbHZtOjp0aWUoc3RhdGVMRSwgc3RhdGVHVCkgPSBDTS5hc3N1bWVEdWFsKHN0YXRlLCAqbGVzc1RoYW5FcVRvT25lKTsKKyAgc3RkOjp0aWUoc3RhdGVMRSwgc3RhdGVHVCkgPSBDTS5hc3N1bWVEdWFsKHN0YXRlLCAqbGVzc1RoYW5FcVRvT25lKTsKICAgCiAgIC8vIElzIGl0IHBvc3NpYmxlIGZvciB0aGUgdmFsdWUgdG8gYmUgZ3JlYXRlciB0aGFuIG9uZT8KICAgaWYgKHN0YXRlR1QpIHsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DTWFrZUxpc3RzLnR4dCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DTWFrZUxpc3RzLnR4dAppbmRleCBlYmQzMzc3Li44ZTdhODM5IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NNYWtlTGlzdHMudHh0CkBAIC0zLDYgKzMsMTAgQEAKICAgU09VUkNFIENoZWNrZXJzLnRkCiAgIFRBUkdFVCBDbGFuZ1NBQ2hlY2tlcnMpCiAKK3NldChMTFZNX0xJTktfQ09NUE9ORU5UUworICBTdXBwb3J0CisgICkKKwogYWRkX2NsYW5nX2xpYnJhcnkoY2xhbmdTdGF0aWNBbmFseXplckNoZWNrZXJzCiAgIEFsbG9jYXRpb25EaWFnbm9zdGljcy5jcHAKICAgQW5hbHl6ZXJTdGF0c0NoZWNrZXIuY3BwCkBAIC0zMiw3ICszNiw2IEBACiAgIEV4cHJJbnNwZWN0aW9uQ2hlY2tlci5jcHAKICAgRml4ZWRBZGRyZXNzQ2hlY2tlci5jcHAKICAgR2VuZXJpY1RhaW50Q2hlY2tlci5jcHAKLSAgSWRlbXBvdGVudE9wZXJhdGlvbkNoZWNrZXIuY3BwCiAgIElkZW50aWNhbEV4cHJDaGVja2VyLmNwcAogICBJdmFySW52YWxpZGF0aW9uQ2hlY2tlci5jcHAKICAgTExWTUNvbnZlbnRpb25zQ2hlY2tlci5jcHAKQEAgLTcxLDIxICs3NCwxMyBAQAogICBVbnJlYWNoYWJsZUNvZGVDaGVja2VyLmNwcAogICBWTEFTaXplQ2hlY2tlci5jcHAKICAgVmlydHVhbENhbGxDaGVja2VyLmNwcAotICApCiAKLWFkZF9kZXBlbmRlbmNpZXMoY2xhbmdTdGF0aWNBbmFseXplckNoZWNrZXJzCi0gIGNsYW5nU3RhdGljQW5hbHl6ZXJDb3JlCi0gIENsYW5nQXR0ckNsYXNzZXMKLSAgQ2xhbmdBdHRyTGlzdAotICBDbGFuZ0NvbW1lbnROb2RlcwotICBDbGFuZ0RlY2xOb2RlcwotICBDbGFuZ0RpYWdub3N0aWNDb21tb24KLSAgQ2xhbmdTdG10Tm9kZXMKKyAgREVQRU5EUwogICBDbGFuZ1NBQ2hlY2tlcnMKLSAgKQogCi10YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmdTdGF0aWNBbmFseXplckNoZWNrZXJzCi0gIGNsYW5nQmFzaWMKKyAgTElOS19MSUJTCiAgIGNsYW5nQVNUCisgIGNsYW5nQW5hbHlzaXMKKyAgY2xhbmdCYXNpYwogICBjbGFuZ1N0YXRpY0FuYWx5emVyQ29yZQogICApCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ1N0cmluZ0NoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NTdHJpbmdDaGVja2VyLmNwcAppbmRleCBjMzczNmQ3Li5kN2MxZDk0IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ1N0cmluZ0NoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DU3RyaW5nQ2hlY2tlci5jcHAKQEAgLTM1LDExICszNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrOjpEZWFkU3ltYm9scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s6OlJlZ2lvbkNoYW5nZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiB7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUX051bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUX0JvdW5kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfT3ZlcmxhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfTm90Q1N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfQWRkaXRpb25PdmVyZmxvdzsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlRfTnVsbCwgQlRfQm91bmRzLCBCVF9PdmVybGFwLAorICAgICAgQlRfTm90Q1N0cmluZywgQlRfQWRkaXRpb25PdmVyZmxvdzsKIAogICBtdXRhYmxlIGNvbnN0IGNoYXIgKkN1cnJlbnRGdW5jdGlvbkRlc2NyaXB0aW9uOwogCkBAIC01MSw2ICs0OCwxMSBAQAogICAgIERlZmF1bHRCb29sIENoZWNrQ1N0cmluZ091dE9mQm91bmRzOwogICAgIERlZmF1bHRCb29sIENoZWNrQ1N0cmluZ0J1ZmZlck92ZXJsYXA7CiAgICAgRGVmYXVsdEJvb2wgQ2hlY2tDU3RyaW5nTm90TnVsbFRlcm07CisKKyAgICBDaGVja05hbWUgQ2hlY2tOYW1lQ1N0cmluZ051bGxBcmc7CisgICAgQ2hlY2tOYW1lIENoZWNrTmFtZUNTdHJpbmdPdXRPZkJvdW5kczsKKyAgICBDaGVja05hbWUgQ2hlY2tOYW1lQ1N0cmluZ0J1ZmZlck92ZXJsYXA7CisgICAgQ2hlY2tOYW1lIENoZWNrTmFtZUNTdHJpbmdOb3ROdWxsVGVybTsKICAgfTsKIAogICBDU3RyaW5nQ2hlY2tzRmlsdGVyIEZpbHRlcjsKQEAgLTIyMSw3ICsyMjMsNyBAQAogICAgIHJldHVybiBOVUxMOwogCiAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZU51bGwsIHN0YXRlTm9uTnVsbDsKLSAgbGx2bTo6dGllKHN0YXRlTnVsbCwgc3RhdGVOb25OdWxsKSA9IGFzc3VtZVplcm8oQywgc3RhdGUsIGwsIFMtPmdldFR5cGUoKSk7CisgIHN0ZDo6dGllKHN0YXRlTnVsbCwgc3RhdGVOb25OdWxsKSA9IGFzc3VtZVplcm8oQywgc3RhdGUsIGwsIFMtPmdldFR5cGUoKSk7CiAKICAgaWYgKHN0YXRlTnVsbCAmJiAhc3RhdGVOb25OdWxsKSB7CiAgICAgaWYgKCFGaWx0ZXIuQ2hlY2tDU3RyaW5nTnVsbEFyZykKQEAgLTIzMiw4ICsyMzQsOSBAQAogICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoIUJUX051bGwpCi0gICAgICBCVF9OdWxsLnJlc2V0KG5ldyBCdWlsdGluQnVnKGNhdGVnb3JpZXM6OlVuaXhBUEksCi0gICAgICAgICJOdWxsIHBvaW50ZXIgYXJndW1lbnQgaW4gY2FsbCB0byBieXRlIHN0cmluZyBmdW5jdGlvbiIpKTsKKyAgICAgIEJUX051bGwucmVzZXQobmV3IEJ1aWx0aW5CdWcoCisgICAgICAgICAgRmlsdGVyLkNoZWNrTmFtZUNTdHJpbmdOdWxsQXJnLCBjYXRlZ29yaWVzOjpVbml4QVBJLAorICAgICAgICAgICJOdWxsIHBvaW50ZXIgYXJndW1lbnQgaW4gY2FsbCB0byBieXRlIHN0cmluZyBmdW5jdGlvbiIpKTsKIAogICAgIFNtYWxsU3RyaW5nPDgwPiBidWY7CiAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvcyhidWYpOwpAQCAtMjk0LDggKzI5Nyw5IEBACiAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmICghQlRfQm91bmRzKSB7Ci0gICAgICBCVF9Cb3VuZHMucmVzZXQobmV3IEJ1aWx0aW5CdWcoIk91dC1vZi1ib3VuZCBhcnJheSBhY2Nlc3MiLAotICAgICAgICAiQnl0ZSBzdHJpbmcgZnVuY3Rpb24gYWNjZXNzZXMgb3V0LW9mLWJvdW5kIGFycmF5IGVsZW1lbnQiKSk7CisgICAgICBCVF9Cb3VuZHMucmVzZXQobmV3IEJ1aWx0aW5CdWcoCisgICAgICAgICAgRmlsdGVyLkNoZWNrTmFtZUNTdHJpbmdPdXRPZkJvdW5kcywgIk91dC1vZi1ib3VuZCBhcnJheSBhY2Nlc3MiLAorICAgICAgICAgICJCeXRlIHN0cmluZyBmdW5jdGlvbiBhY2Nlc3NlcyBvdXQtb2YtYm91bmQgYXJyYXkgZWxlbWVudCIpKTsKICAgICB9CiAgICAgQnVpbHRpbkJ1ZyAqQlQgPSBzdGF0aWNfY2FzdDxCdWlsdGluQnVnKj4oQlRfQm91bmRzLmdldCgpKTsKIApAQCAtNDM5LDcgKzQ0Myw3IEBACiAKICAgLy8gQXJlIHRoZSB0d28gdmFsdWVzIHRoZSBzYW1lPwogICBTVmFsQnVpbGRlciAmc3ZhbEJ1aWxkZXIgPSBDLmdldFNWYWxCdWlsZGVyKCk7ICAKLSAgbGx2bTo6dGllKHN0YXRlVHJ1ZSwgc3RhdGVGYWxzZSkgPQorICBzdGQ6OnRpZShzdGF0ZVRydWUsIHN0YXRlRmFsc2UpID0KICAgICBzdGF0ZS0+YXNzdW1lKHN2YWxCdWlsZGVyLmV2YWxFUShzdGF0ZSwgKmZpcnN0TG9jLCAqc2Vjb25kTG9jKSk7CiAKICAgaWYgKHN0YXRlVHJ1ZSAmJiAhc3RhdGVGYWxzZSkgewpAQCAtNDYxLDcgKzQ2NSw3IEBACiAgIGlmICghcmV2ZXJzZVRlc3QpCiAgICAgcmV0dXJuIHN0YXRlOwogCi0gIGxsdm06OnRpZShzdGF0ZVRydWUsIHN0YXRlRmFsc2UpID0gc3RhdGUtPmFzc3VtZSgqcmV2ZXJzZVRlc3QpOworICBzdGQ6OnRpZShzdGF0ZVRydWUsIHN0YXRlRmFsc2UpID0gc3RhdGUtPmFzc3VtZSgqcmV2ZXJzZVRlc3QpOwogICBpZiAoc3RhdGVUcnVlKSB7CiAgICAgaWYgKHN0YXRlRmFsc2UpIHsKICAgICAgIC8vIElmIHdlIGRvbid0IGtub3cgd2hpY2ggb25lIGNvbWVzIGZpcnN0LCB3ZSBjYW4ndCBwZXJmb3JtIHRoaXMgdGVzdC4KQEAgLTUwNiw3ICs1MTAsNyBAQAogICBpZiAoIU92ZXJsYXBUZXN0KQogICAgIHJldHVybiBzdGF0ZTsKIAotICBsbHZtOjp0aWUoc3RhdGVUcnVlLCBzdGF0ZUZhbHNlKSA9IHN0YXRlLT5hc3N1bWUoKk92ZXJsYXBUZXN0KTsKKyAgc3RkOjp0aWUoc3RhdGVUcnVlLCBzdGF0ZUZhbHNlKSA9IHN0YXRlLT5hc3N1bWUoKk92ZXJsYXBUZXN0KTsKIAogICBpZiAoc3RhdGVUcnVlICYmICFzdGF0ZUZhbHNlKSB7CiAgICAgLy8gT3ZlcmxhcCEKQEAgLTUyNiw3ICs1MzAsOCBAQAogICAgIHJldHVybjsKIAogICBpZiAoIUJUX092ZXJsYXApCi0gICAgQlRfT3ZlcmxhcC5yZXNldChuZXcgQnVnVHlwZShjYXRlZ29yaWVzOjpVbml4QVBJLCAiSW1wcm9wZXIgYXJndW1lbnRzIikpOworICAgIEJUX092ZXJsYXAucmVzZXQobmV3IEJ1Z1R5cGUoRmlsdGVyLkNoZWNrTmFtZUNTdHJpbmdCdWZmZXJPdmVybGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllczo6VW5peEFQSSwgIkltcHJvcGVyIGFyZ3VtZW50cyIpKTsKIAogICAvLyBHZW5lcmF0ZSBhIHJlcG9ydCBmb3IgdGhpcyBidWcuCiAgIEJ1Z1JlcG9ydCAqcmVwb3J0ID0gCkBAIC01NzYsNyArNTgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptYXhNaW51c1JpZ2h0TkwsIGNtcFR5KTsKIAogICAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZU92ZXJmbG93LCBzdGF0ZU9rYXk7Ci0gICAgbGx2bTo6dGllKHN0YXRlT3ZlcmZsb3csIHN0YXRlT2theSkgPQorICAgIHN0ZDo6dGllKHN0YXRlT3ZlcmZsb3csIHN0YXRlT2theSkgPQogICAgICAgc3RhdGUtPmFzc3VtZSh3aWxsT3ZlcmZsb3cuY2FzdEFzPERlZmluZWRPclVua25vd25TVmFsPigpKTsKIAogICAgIGlmIChzdGF0ZU92ZXJmbG93ICYmICFzdGF0ZU9rYXkpIHsKQEAgLTU4Niw4ICs1OTEsOSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgICAgaWYgKCFCVF9BZGRpdGlvbk92ZXJmbG93KQotICAgICAgICBCVF9BZGRpdGlvbk92ZXJmbG93LnJlc2V0KG5ldyBCdWlsdGluQnVnKCJBUEkiLAotICAgICAgICAgICJTdW0gb2YgZXhwcmVzc2lvbnMgY2F1c2VzIG92ZXJmbG93IikpOworICAgICAgICBCVF9BZGRpdGlvbk92ZXJmbG93LnJlc2V0KAorICAgICAgICAgICAgbmV3IEJ1aWx0aW5CdWcoRmlsdGVyLkNoZWNrTmFtZUNTdHJpbmdPdXRPZkJvdW5kcywgIkFQSSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtIG9mIGV4cHJlc3Npb25zIGNhdXNlcyBvdmVyZmxvdyIpKTsKIAogICAgICAgLy8gVGhpcyBpc24ndCBhIGdyZWF0IGVycm9yIG1lc3NhZ2UsIGJ1dCB0aGlzIHNob3VsZCBuZXZlciBvY2N1ciBpbiByZWFsCiAgICAgICAvLyBjb2RlIGFueXdheSAtLSB5b3UnZCBoYXZlIHRvIGNyZWF0ZSBhIGJ1ZmZlciBsb25nZXIgdGhhbiBhIHNpemVfdCBjYW4KQEAgLTcwMyw4ICs3MDksOSBAQAogCiAgICAgICBpZiAoRXhwbG9kZWROb2RlICpOID0gQy5hZGRUcmFuc2l0aW9uKHN0YXRlKSkgewogICAgICAgICBpZiAoIUJUX05vdENTdHJpbmcpCi0gICAgICAgICAgQlRfTm90Q1N0cmluZy5yZXNldChuZXcgQnVpbHRpbkJ1ZyhjYXRlZ29yaWVzOjpVbml4QVBJLAotICAgICAgICAgICAgIkFyZ3VtZW50IGlzIG5vdCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIikpOworICAgICAgICAgIEJUX05vdENTdHJpbmcucmVzZXQobmV3IEJ1aWx0aW5CdWcoCisgICAgICAgICAgICAgIEZpbHRlci5DaGVja05hbWVDU3RyaW5nTm90TnVsbFRlcm0sIGNhdGVnb3JpZXM6OlVuaXhBUEksCisgICAgICAgICAgICAgICJBcmd1bWVudCBpcyBub3QgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiIpKTsKIAogICAgICAgICBTbWFsbFN0cmluZzwxMjA+IGJ1ZjsKICAgICAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvcyhidWYpOwpAQCAtNzE0LDggKzcyMSw3IEBACiAgICAgICAgICAgIDw8ICInLCB3aGljaCBpcyBub3QgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIjsKIAogICAgICAgICAvLyBHZW5lcmF0ZSBhIHJlcG9ydCBmb3IgdGhpcyBidWcuCi0gICAgICAgIEJ1Z1JlcG9ydCAqcmVwb3J0ID0gbmV3IEJ1Z1JlcG9ydCgqQlRfTm90Q1N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdHIoKSwgTik7CisgICAgICAgIEJ1Z1JlcG9ydCAqcmVwb3J0ID0gbmV3IEJ1Z1JlcG9ydCgqQlRfTm90Q1N0cmluZywgb3Muc3RyKCksIE4pOwogCiAgICAgICAgIHJlcG9ydC0+YWRkUmFuZ2UoRXgtPmdldFNvdXJjZVJhbmdlKCkpOwogICAgICAgICBDLmVtaXRSZXBvcnQocmVwb3J0KTsgICAgICAgIApAQCAtNzYzLDggKzc2OSw5IEBACiAKICAgICBpZiAoRXhwbG9kZWROb2RlICpOID0gQy5hZGRUcmFuc2l0aW9uKHN0YXRlKSkgewogICAgICAgaWYgKCFCVF9Ob3RDU3RyaW5nKQotICAgICAgICBCVF9Ob3RDU3RyaW5nLnJlc2V0KG5ldyBCdWlsdGluQnVnKGNhdGVnb3JpZXM6OlVuaXhBUEksCi0gICAgICAgICAgIkFyZ3VtZW50IGlzIG5vdCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIikpOworICAgICAgICBCVF9Ob3RDU3RyaW5nLnJlc2V0KG5ldyBCdWlsdGluQnVnKAorICAgICAgICAgICAgRmlsdGVyLkNoZWNrTmFtZUNTdHJpbmdOb3ROdWxsVGVybSwgY2F0ZWdvcmllczo6VW5peEFQSSwKKyAgICAgICAgICAgICJBcmd1bWVudCBpcyBub3QgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiIpKTsKIAogICAgICAgU21hbGxTdHJpbmc8MTIwPiBidWY7CiAgICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zKGJ1Zik7CkBAIC05MDksNyArOTE2LDcgQEAKICAgUXVhbFR5cGUgc2l6ZVR5ID0gU2l6ZS0+Z2V0VHlwZSgpOwogCiAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZVplcm9TaXplLCBzdGF0ZU5vblplcm9TaXplOwotICBsbHZtOjp0aWUoc3RhdGVaZXJvU2l6ZSwgc3RhdGVOb25aZXJvU2l6ZSkgPQorICBzdGQ6OnRpZShzdGF0ZVplcm9TaXplLCBzdGF0ZU5vblplcm9TaXplKSA9CiAgICAgYXNzdW1lWmVybyhDLCBzdGF0ZSwgc2l6ZVZhbCwgc2l6ZVR5KTsKIAogICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBEZXN0LgpAQCAtMTA2Niw3ICsxMDczLDcgQEAKICAgUXVhbFR5cGUgc2l6ZVR5ID0gU2l6ZS0+Z2V0VHlwZSgpOwogCiAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZVplcm9TaXplLCBzdGF0ZU5vblplcm9TaXplOwotICBsbHZtOjp0aWUoc3RhdGVaZXJvU2l6ZSwgc3RhdGVOb25aZXJvU2l6ZSkgPQorICBzdGQ6OnRpZShzdGF0ZVplcm9TaXplLCBzdGF0ZU5vblplcm9TaXplKSA9CiAgICAgYXNzdW1lWmVybyhDLCBzdGF0ZSwgc2l6ZVZhbCwgc2l6ZVR5KTsKIAogICAvLyBJZiB0aGUgc2l6ZSBjYW4gYmUgemVybywgdGhlIHJlc3VsdCB3aWxsIGJlIDAgaW4gdGhhdCBjYXNlLCBhbmQgd2UgZG9uJ3QKQEAgLTEwOTIsNyArMTA5OSw3IEBACiAgICAgLy8gU2VlIGlmIHRoZXkgYXJlIHRoZSBzYW1lLgogICAgIERlZmluZWRPclVua25vd25TVmFsIFNhbWVCdWYgPSBzdmFsQnVpbGRlci5ldmFsRVEoc3RhdGUsIExWLCBSVik7CiAgICAgUHJvZ3JhbVN0YXRlUmVmIFN0U2FtZUJ1ZiwgU3ROb3RTYW1lQnVmOwotICAgIGxsdm06OnRpZShTdFNhbWVCdWYsIFN0Tm90U2FtZUJ1ZikgPSBzdGF0ZS0+YXNzdW1lKFNhbWVCdWYpOworICAgIHN0ZDo6dGllKFN0U2FtZUJ1ZiwgU3ROb3RTYW1lQnVmKSA9IHN0YXRlLT5hc3N1bWUoU2FtZUJ1Zik7CiAKICAgICAvLyBJZiB0aGUgdHdvIGFyZ3VtZW50cyBtaWdodCBiZSB0aGUgc2FtZSBidWZmZXIsIHdlIGtub3cgdGhlIHJlc3VsdCBpcyAwLAogICAgIC8vIGFuZCB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIHNpemUuCkBAIC0xMTUwLDcgKzExNTcsNyBAQAogICAgIFNWYWwgbWF4bGVuVmFsID0gc3RhdGUtPmdldFNWYWwobWF4bGVuRXhwciwgTEN0eCk7CiAKICAgICBQcm9ncmFtU3RhdGVSZWYgc3RhdGVaZXJvU2l6ZSwgc3RhdGVOb25aZXJvU2l6ZTsKLSAgICBsbHZtOjp0aWUoc3RhdGVaZXJvU2l6ZSwgc3RhdGVOb25aZXJvU2l6ZSkgPQorICAgIHN0ZDo6dGllKHN0YXRlWmVyb1NpemUsIHN0YXRlTm9uWmVyb1NpemUpID0KICAgICAgIGFzc3VtZVplcm8oQywgc3RhdGUsIG1heGxlblZhbCwgbWF4bGVuRXhwci0+Z2V0VHlwZSgpKTsKIAogICAgIC8vIElmIHRoZSBzaXplIGNhbiBiZSB6ZXJvLCB0aGUgcmVzdWx0IHdpbGwgYmUgMCBpbiB0aGF0IGNhc2UsIGFuZCB3ZSBkb24ndApAQCAtMTIwNCwxMCArMTIxMSwxMCBAQAogICAgICAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlU3RyaW5nVG9vTG9uZywgc3RhdGVTdHJpbmdOb3RUb29Mb25nOwogCiAgICAgICAvLyBDaGVjayBpZiB0aGUgc3RyTGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4bGVuLgotICAgICAgbGx2bTo6dGllKHN0YXRlU3RyaW5nVG9vTG9uZywgc3RhdGVTdHJpbmdOb3RUb29Mb25nKSA9Ci0gICAgICAgICAgc3RhdGUtPmFzc3VtZShDLmdldFNWYWxCdWlsZGVyKCkuZXZhbEJpbk9wTk4oCi0gICAgICAgICAgICAgIHN0YXRlLCBCT19HVCwgKnN0ckxlbmd0aE5MLCAqbWF4bGVuVmFsTkwsIGNtcFR5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXN0QXM8RGVmaW5lZE9yVW5rbm93blNWYWw+KCkpOworICAgICAgc3RkOjp0aWUoc3RhdGVTdHJpbmdUb29Mb25nLCBzdGF0ZVN0cmluZ05vdFRvb0xvbmcpID0gc3RhdGUtPmFzc3VtZSgKKyAgICAgICAgICBDLmdldFNWYWxCdWlsZGVyKCkKKyAgICAgICAgICAgICAgLmV2YWxCaW5PcE5OKHN0YXRlLCBCT19HVCwgKnN0ckxlbmd0aE5MLCAqbWF4bGVuVmFsTkwsIGNtcFR5KQorICAgICAgICAgICAgICAuY2FzdEFzPERlZmluZWRPclVua25vd25TVmFsPigpKTsKIAogICAgICAgaWYgKHN0YXRlU3RyaW5nVG9vTG9uZyAmJiAhc3RhdGVTdHJpbmdOb3RUb29Mb25nKSB7CiAgICAgICAgIC8vIElmIHRoZSBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gbWF4bGVuLCByZXR1cm4gbWF4bGVuLgpAQCAtMTM3MSw3ICsxMzc4LDcgQEAKICAgICAgIC8vIENoZWNrIGlmIHRoZSBtYXggbnVtYmVyIHRvIGNvcHkgaXMgbGVzcyB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHNyYy4KICAgICAgIC8vIElmIHRoZSBib3VuZCBpcyBlcXVhbCB0byB0aGUgc291cmNlIGxlbmd0aCwgc3RybmNweSB3b24ndCBudWxsLQogICAgICAgLy8gdGVybWluYXRlIHRoZSByZXN1bHQhCi0gICAgICBsbHZtOjp0aWUoc3RhdGVTb3VyY2VUb29Mb25nLCBzdGF0ZVNvdXJjZU5vdFRvb0xvbmcpID0gc3RhdGUtPmFzc3VtZSgKKyAgICAgIHN0ZDo6dGllKHN0YXRlU291cmNlVG9vTG9uZywgc3RhdGVTb3VyY2VOb3RUb29Mb25nKSA9IHN0YXRlLT5hc3N1bWUoCiAgICAgICAgICAgc3ZhbEJ1aWxkZXIuZXZhbEJpbk9wTk4oc3RhdGUsIEJPX0dFLCAqc3RyTGVuZ3RoTkwsICpsZW5WYWxOTCwgY21wVHkpCiAgICAgICAgICAgICAgIC5jYXN0QXM8RGVmaW5lZE9yVW5rbm93blNWYWw+KCkpOwogCkBAIC0xNDE4LDcgKzE0MjUsNyBAQAogICAgICAgICAvLyBjYXNlIHN0cm5jcHkgd2lsbCBkbyBubyB3b3JrIGF0IGFsbC4gT3VyIGJvdW5kcyBjaGVjayB1c2VzIG4tMQogICAgICAgICAvLyBhcyB0aGUgbGFzdCBlbGVtZW50IGFjY2Vzc2VkLCBzbyBuID09IDAgaXMgcHJvYmxlbWF0aWMuCiAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZVplcm9TaXplLCBTdGF0ZU5vblplcm9TaXplOwotICAgICAgICBsbHZtOjp0aWUoU3RhdGVaZXJvU2l6ZSwgU3RhdGVOb25aZXJvU2l6ZSkgPQorICAgICAgICBzdGQ6OnRpZShTdGF0ZVplcm9TaXplLCBTdGF0ZU5vblplcm9TaXplKSA9CiAgICAgICAgICAgYXNzdW1lWmVybyhDLCBzdGF0ZSwgKmxlblZhbE5MLCBzaXplVHkpOwogCiAgICAgICAgIC8vIElmIHRoZSBzaXplIGlzIGtub3duIHRvIGJlIHplcm8sIHdlJ3JlIGRvbmUuCkBAIC0xNzExLDcgKzE3MTgsNyBAQAogICBTVmFsQnVpbGRlciAmc3ZhbEJ1aWxkZXIgPSBDLmdldFNWYWxCdWlsZGVyKCk7CiAgIERlZmluZWRPclVua25vd25TVmFsIFNhbWVCdWYgPSBzdmFsQnVpbGRlci5ldmFsRVEoc3RhdGUsIExWLCBSVik7CiAgIFByb2dyYW1TdGF0ZVJlZiBTdFNhbWVCdWYsIFN0Tm90U2FtZUJ1ZjsKLSAgbGx2bTo6dGllKFN0U2FtZUJ1ZiwgU3ROb3RTYW1lQnVmKSA9IHN0YXRlLT5hc3N1bWUoU2FtZUJ1Zik7CisgIHN0ZDo6dGllKFN0U2FtZUJ1ZiwgU3ROb3RTYW1lQnVmKSA9IHN0YXRlLT5hc3N1bWUoU2FtZUJ1Zik7CiAKICAgLy8gSWYgdGhlIHR3byBhcmd1bWVudHMgbWlnaHQgYmUgdGhlIHNhbWUgYnVmZmVyLCB3ZSBrbm93IHRoZSByZXN1bHQgaXMgMCwKICAgLy8gYW5kIHdlIG9ubHkgbmVlZCB0byBjaGVjayBvbmUgc2l6ZS4KQEAgLTE5MjgsOSArMTkzNSw4IEBACiAgIC8vIFJlY29yZCBzdHJpbmcgbGVuZ3RoIGZvciBjaGFyIGFbXSA9ICJhYmMiOwogICBQcm9ncmFtU3RhdGVSZWYgc3RhdGUgPSBDLmdldFN0YXRlKCk7CiAKLSAgZm9yIChEZWNsU3RtdDo6Y29uc3RfZGVjbF9pdGVyYXRvciBJID0gRFMtPmRlY2xfYmVnaW4oKSwgRSA9IERTLT5kZWNsX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgVmFyRGVjbCAqRCA9IGR5bl9jYXN0PFZhckRlY2w+KCpJKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogRFMtPmRlY2xzKCkpIHsKKyAgICBjb25zdCBWYXJEZWNsICpEID0gZHluX2Nhc3Q8VmFyRGVjbD4oSSk7CiAgICAgaWYgKCFEKQogICAgICAgY29udGludWU7CiAKQEAgLTIwNTcsMTAgKzIwNjMsMTIgQEAKICAgQy5hZGRUcmFuc2l0aW9uKHN0YXRlKTsKIH0KIAotI2RlZmluZSBSRUdJU1RFUl9DSEVDS0VSKG5hbWUpIFwKLXZvaWQgZW50bzo6cmVnaXN0ZXIjI25hbWUoQ2hlY2tlck1hbmFnZXIgJm1ncikge1wKLSAgbWdyLnJlZ2lzdGVyQ2hlY2tlcjxDU3RyaW5nQ2hlY2tlcj4oKS0+RmlsdGVyLkNoZWNrIyNuYW1lID0gdHJ1ZTsgXAotfQorI2RlZmluZSBSRUdJU1RFUl9DSEVDS0VSKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBlbnRvOjpyZWdpc3RlciMjbmFtZShDaGVja2VyTWFuYWdlciAmbWdyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1N0cmluZ0NoZWNrZXIgKmNoZWNrZXIgPSBtZ3IucmVnaXN0ZXJDaGVja2VyPENTdHJpbmdDaGVja2VyPigpOyAgICAgICAgICAgXAorICAgIGNoZWNrZXItPkZpbHRlci5DaGVjayMjbmFtZSA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGVja2VyLT5GaWx0ZXIuQ2hlY2tOYW1lIyNuYW1lID0gbWdyLmdldEN1cnJlbnRDaGVja05hbWUoKTsgICAgICAgICAgICAgICBcCisgIH0KIAogUkVHSVNURVJfQ0hFQ0tFUihDU3RyaW5nTnVsbEFyZykKIFJFR0lTVEVSX0NIRUNLRVIoQ1N0cmluZ091dE9mQm91bmRzKQpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NTdHJpbmdTeW50YXhDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DU3RyaW5nU3ludGF4Q2hlY2tlci5jcHAKaW5kZXggZDI5YTEyYS4uYWJmYjk3MSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NTdHJpbmdTeW50YXhDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ1N0cmluZ1N5bnRheENoZWNrZXIuY3BwCkBAIC0zMSw2ICszMSw3IEBACiAKIG5hbWVzcGFjZSB7CiBjbGFzcyBXYWxrQVNUOiBwdWJsaWMgU3RtdFZpc2l0b3I8V2Fsa0FTVD4geworICBjb25zdCBDaGVja2VyQmFzZSAqQ2hlY2tlcjsKICAgQnVnUmVwb3J0ZXIgJkJSOwogICBBbmFseXNpc0RlY2xDb250ZXh0KiBBQzsKIApAQCAtODEsOSArODIsOCBAQAogICBib29sIGNvbnRhaW5zQmFkU3RybmNhdFBhdHRlcm4oY29uc3QgQ2FsbEV4cHIgKkNFKTsKIAogcHVibGljOgotICBXYWxrQVNUKEJ1Z1JlcG9ydGVyICZiciwgQW5hbHlzaXNEZWNsQ29udGV4dCogYWMpIDoKLSAgICAgIEJSKGJyKSwgQUMoYWMpIHsKLSAgfQorICBXYWxrQVNUKGNvbnN0IENoZWNrZXJCYXNlICpjaGVja2VyLCBCdWdSZXBvcnRlciAmYnIsIEFuYWx5c2lzRGVjbENvbnRleHQgKmFjKQorICAgICAgOiBDaGVja2VyKGNoZWNrZXIpLCBCUihiciksIEFDKGFjKSB7fQogCiAgIC8vIFN0YXRlbWVudCB2aXNpdG9yIG1ldGhvZHMuCiAgIHZvaWQgVmlzaXRDaGlsZHJlbihTdG10ICpTKTsKQEAgLTE1Nyw4ICsxNTcsOSBAQAogICAgICAgICBvcyA8PCAiVSI7CiAgICAgICBvcyA8PCAic2UgYSBzYWZlciAnc3RybGNhdCcgQVBJIjsKIAotICAgICAgQlIuRW1pdEJhc2ljUmVwb3J0KEZELCAiQW50aS1wYXR0ZXJuIGluIHRoZSBhcmd1bWVudCIsICJDIFN0cmluZyBBUEkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0cigpLCBMb2MsIExlbkFyZy0+Z2V0U291cmNlUmFuZ2UoKSk7CisgICAgICBCUi5FbWl0QmFzaWNSZXBvcnQoRkQsIENoZWNrZXIsICJBbnRpLXBhdHRlcm4gaW4gdGhlIGFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQyBTdHJpbmcgQVBJIiwgb3Muc3RyKCksIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMZW5BcmctPmdldFNvdXJjZVJhbmdlKCkpOwogICAgIH0KICAgfQogCkBAIC0xNzksNyArMTgwLDcgQEAKIAogICB2b2lkIGNoZWNrQVNUQ29kZUJvZHkoY29uc3QgRGVjbCAqRCwgQW5hbHlzaXNNYW5hZ2VyJiBNZ3IsCiAgICAgICBCdWdSZXBvcnRlciAmQlIpIGNvbnN0IHsKLSAgICBXYWxrQVNUIHdhbGtlcihCUiwgTWdyLmdldEFuYWx5c2lzRGVjbENvbnRleHQoRCkpOworICAgIFdhbGtBU1Qgd2Fsa2VyKHRoaXMsIEJSLCBNZ3IuZ2V0QW5hbHlzaXNEZWNsQ29udGV4dChEKSk7CiAgICAgd2Fsa2VyLlZpc2l0KEQtPmdldEJvZHkoKSk7CiAgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2FsbEFuZE1lc3NhZ2VDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DYWxsQW5kTWVzc2FnZUNoZWNrZXIuY3BwCmluZGV4IGZlZmNiZTcuLjkwN2Y1MTYgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DYWxsQW5kTWVzc2FnZUNoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DYWxsQW5kTWVzc2FnZUNoZWNrZXIuY3BwCkBAIC0yNywyNCArMjcsMzUgQEAKIHVzaW5nIG5hbWVzcGFjZSBlbnRvOwogCiBuYW1lc3BhY2UgeworCitzdHJ1Y3QgQ2hlY2tzRmlsdGVyIHsKKyAgRGVmYXVsdEJvb2wgQ2hlY2tfQ2FsbEFuZE1lc3NhZ2VVbkluaXRSZWZBcmc7CisgIERlZmF1bHRCb29sIENoZWNrX0NhbGxBbmRNZXNzYWdlQ2hlY2tlcjsKKworICBDaGVja05hbWUgQ2hlY2tOYW1lX0NhbGxBbmRNZXNzYWdlVW5Jbml0UmVmQXJnOworICBDaGVja05hbWUgQ2hlY2tOYW1lX0NhbGxBbmRNZXNzYWdlQ2hlY2tlcjsKK307CisKIGNsYXNzIENhbGxBbmRNZXNzYWdlQ2hlY2tlcgogICA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6UHJlU3RtdDxDYWxsRXhwcj4sCiAgICAgICAgICAgICAgICAgICAgIGNoZWNrOjpQcmVTdG10PENYWERlbGV0ZUV4cHI+LAogICAgICAgICAgICAgICAgICAgICBjaGVjazo6UHJlT2JqQ01lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgIGNoZWNrOjpQcmVDYWxsID4gewotICBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVF9jYWxsX251bGw7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUX2NhbGxfdW5kZWY7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUX2N4eF9jYWxsX251bGw7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUX2N4eF9jYWxsX3VuZGVmOwotICBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVF9jYWxsX2FyZzsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlRfY3h4X2RlbGV0ZV91bmRlZjsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlRfbXNnX3VuZGVmOwotICBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVF9vYmpjX3Byb3BfdW5kZWY7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUX29iamNfc3Vic2NyaXB0X3VuZGVmOwotICBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVF9tc2dfYXJnOwotICBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVF9tc2dfcmV0OwotICBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVF9jYWxsX2Zld19hcmdzOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVF9jYWxsX251bGw7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUX2NhbGxfdW5kZWY7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUX2N4eF9jYWxsX251bGw7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUX2N4eF9jYWxsX3VuZGVmOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVF9jYWxsX2FyZzsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlRfY3h4X2RlbGV0ZV91bmRlZjsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlRfbXNnX3VuZGVmOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVF9vYmpjX3Byb3BfdW5kZWY7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUX29iamNfc3Vic2NyaXB0X3VuZGVmOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVF9tc2dfYXJnOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVF9tc2dfcmV0OworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVF9jYWxsX2Zld19hcmdzOworCiBwdWJsaWM6CisgIENoZWNrc0ZpbHRlciBGaWx0ZXI7CiAKICAgdm9pZCBjaGVja1ByZVN0bXQoY29uc3QgQ2FsbEV4cHIgKkNFLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CiAgIHZvaWQgY2hlY2tQcmVTdG10KGNvbnN0IENYWERlbGV0ZUV4cHIgKkRFLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CkBAIC01MiwxMCArNjMsMTEgQEAKICAgdm9pZCBjaGVja1ByZUNhbGwoY29uc3QgQ2FsbEV2ZW50ICZDYWxsLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CiAKIHByaXZhdGU6Ci0gIHN0YXRpYyBib29sIFByZVZpc2l0UHJvY2Vzc0FyZyhDaGVja2VyQ29udGV4dCAmQywgU1ZhbCBWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlUmFuZ2UgYXJnUmFuZ2UsIGNvbnN0IEV4cHIgKmFyZ0V4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0ZpcnN0QXJndW1lbnQsIGJvb2wgY2hlY2tVbmluaXRGaWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXZlbnQgJkNhbGwsIE93bmluZ1B0cjxCdWdUeXBlPiAmQlQpOworICBib29sIFByZVZpc2l0UHJvY2Vzc0FyZyhDaGVja2VyQ29udGV4dCAmQywgU1ZhbCBWLCBTb3VyY2VSYW5nZSBBcmdSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqQXJnRXgsIGJvb2wgSXNGaXJzdEFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENoZWNrVW5pbml0RmllbGRzLCBjb25zdCBDYWxsRXZlbnQgJkNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiAmQlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcm1WYXJEZWNsICpQYXJhbURlY2wpIGNvbnN0OwogCiAgIHN0YXRpYyB2b2lkIGVtaXRCYWRDYWxsKEJ1Z1R5cGUgKkJULCBDaGVja2VyQ29udGV4dCAmQywgY29uc3QgRXhwciAqQmFkRSk7CiAgIHZvaWQgZW1pdE5pbFJlY2VpdmVyQnVnKENoZWNrZXJDb250ZXh0ICZDLCBjb25zdCBPYmpDTWV0aG9kQ2FsbCAmbXNnLApAQCAtNjUsMTAgKzc3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2RDYWxsICZtc2cpIGNvbnN0OwogCi0gIHN0YXRpYyB2b2lkIExhenlJbml0X0JUKGNvbnN0IGNoYXIgKmRlc2MsIE93bmluZ1B0cjxCdWdUeXBlPiAmQlQpIHsKKyAgdm9pZCBMYXp5SW5pdF9CVChjb25zdCBjaGFyICpkZXNjLCBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gJkJUKSBjb25zdCB7CiAgICAgaWYgKCFCVCkKLSAgICAgIEJULnJlc2V0KG5ldyBCdWlsdGluQnVnKGRlc2MpKTsKKyAgICAgIEJULnJlc2V0KG5ldyBCdWlsdGluQnVnKHRoaXMsIGRlc2MpKTsKICAgfQorICBib29sIHVuaW5pdFJlZk9yUG9pbnRlcihDaGVja2VyQ29udGV4dCAmQywgY29uc3QgU1ZhbCAmViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlUmFuZ2UgJkFyZ1JhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpBcmdFeCwgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+ICZCVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFybVZhckRlY2wgKlBhcmFtRGVjbCwgY29uc3QgY2hhciAqQkQpIGNvbnN0OwogfTsKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIApAQCAtMTEzLDMwICsxMjksODYgQEAKICAgfQogfQogCitib29sIENhbGxBbmRNZXNzYWdlQ2hlY2tlcjo6dW5pbml0UmVmT3JQb2ludGVyKENoZWNrZXJDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTVmFsICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VSYW5nZSAmQXJnUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKkFyZ0V4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gJkJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJtVmFyRGVjbCAqUGFyYW1EZWNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpCRCkgY29uc3QgeworICBpZiAoIUZpbHRlci5DaGVja19DYWxsQW5kTWVzc2FnZVVuSW5pdFJlZkFyZykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gTm8gcGFyYW1ldGVyIGRlY2xhcmF0aW9uIGF2YWlsYWJsZSwgaS5lLiB2YXJpYWRpYyBmdW5jdGlvbiBhcmd1bWVudC4KKyAgaWYoIVBhcmFtRGVjbCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gSWYgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIGFzIHBvaW50ZXIgdG8gY29uc3QgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb24sCisgIC8vIHRoZW4gY2hlY2sgaWYgY29ycmVzcG9uZGluZyBhcmd1bWVudCBpbiBmdW5jdGlvbiBjYWxsIGlzCisgIC8vIHBvaW50aW5nIHRvIHVuZGVmaW5lZCBzeW1ib2wgdmFsdWUgKHVuaW5pdGlhbGl6ZWQgbWVtb3J5KS4KKyAgU3RyaW5nUmVmIE1lc3NhZ2U7CisKKyAgaWYgKFBhcmFtRGVjbC0+Z2V0VHlwZSgpLT5pc1BvaW50ZXJUeXBlKCkpIHsKKyAgICBNZXNzYWdlID0gIkZ1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWUiOworICB9IGVsc2UgaWYgKFBhcmFtRGVjbC0+Z2V0VHlwZSgpLT5pc1JlZmVyZW5jZVR5cGUoKSkgeworICAgIE1lc3NhZ2UgPSAiRnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhbiB1bmluaXRpYWxpemVkIHZhbHVlIjsKKyAgfSBlbHNlCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmKCFQYXJhbURlY2wtPmdldFR5cGUoKS0+Z2V0UG9pbnRlZVR5cGUoKS5pc0NvbnN0UXVhbGlmaWVkKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChjb25zdCBNZW1SZWdpb24gKlNWYWxNZW1SZWdpb24gPSBWLmdldEFzUmVnaW9uKCkpIHsKKyAgICBjb25zdCBQcm9ncmFtU3RhdGVSZWYgU3RhdGUgPSBDLmdldFN0YXRlKCk7CisgICAgY29uc3QgU1ZhbCBQU1YgPSBTdGF0ZS0+Z2V0U1ZhbChTVmFsTWVtUmVnaW9uKTsKKyAgICBpZiAoUFNWLmlzVW5kZWYoKSkgeworICAgICAgaWYgKEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKCkpIHsKKyAgICAgICAgTGF6eUluaXRfQlQoQkQsIEJUKTsKKyAgICAgICAgQnVnUmVwb3J0ICpSID0gbmV3IEJ1Z1JlcG9ydCgqQlQsIE1lc3NhZ2UsIE4pOworICAgICAgICBSLT5hZGRSYW5nZShBcmdSYW5nZSk7CisgICAgICAgIGlmIChBcmdFeCkgeworICAgICAgICAgIGJ1Z3JlcG9ydGVyOjp0cmFja051bGxPclVuZGVmVmFsdWUoTiwgQXJnRXgsICpSKTsKKyAgICAgICAgfQorICAgICAgICBDLmVtaXRSZXBvcnQoUik7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCiBib29sIENhbGxBbmRNZXNzYWdlQ2hlY2tlcjo6UHJlVmlzaXRQcm9jZXNzQXJnKENoZWNrZXJDb250ZXh0ICZDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVmFsIFYsIFNvdXJjZVJhbmdlIGFyZ1JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICphcmdFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZhbCBWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBBcmdSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqQXJnRXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNGaXJzdEFyZ3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNoZWNrVW5pbml0RmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENoZWNrVW5pbml0RmllbGRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXZlbnQgJkNhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmluZ1B0cjxCdWdUeXBlPiAmQlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+ICZCVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFybVZhckRlY2wgKlBhcmFtRGVjbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIGNvbnN0IHsKKyAgY29uc3QgY2hhciAqQkQgPSAiVW5pbml0aWFsaXplZCBhcmd1bWVudCB2YWx1ZSI7CisKKyAgaWYgKHVuaW5pdFJlZk9yUG9pbnRlcihDLCBWLCBBcmdSYW5nZSwgQXJnRXgsIEJULCBQYXJhbURlY2wsIEJEKSkKKyAgICByZXR1cm4gdHJ1ZTsKKwogICBpZiAoVi5pc1VuZGVmKCkpIHsKICAgICBpZiAoRXhwbG9kZWROb2RlICpOID0gQy5nZW5lcmF0ZVNpbmsoKSkgewotICAgICAgTGF6eUluaXRfQlQoIlVuaW5pdGlhbGl6ZWQgYXJndW1lbnQgdmFsdWUiLCBCVCk7CisgICAgICBMYXp5SW5pdF9CVChCRCwgQlQpOwogCiAgICAgICAvLyBHZW5lcmF0ZSBhIHJlcG9ydCBmb3IgdGhpcyBidWcuCi0gICAgICBTdHJpbmdSZWYgRGVzYyA9IGRlc2NyaWJlVW5pbml0aWFsaXplZEFyZ3VtZW50SW5DYWxsKENhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzRmlyc3RBcmd1bWVudCk7CisgICAgICBTdHJpbmdSZWYgRGVzYyA9CisgICAgICAgICAgZGVzY3JpYmVVbmluaXRpYWxpemVkQXJndW1lbnRJbkNhbGwoQ2FsbCwgSXNGaXJzdEFyZ3VtZW50KTsKICAgICAgIEJ1Z1JlcG9ydCAqUiA9IG5ldyBCdWdSZXBvcnQoKkJULCBEZXNjLCBOKTsKLSAgICAgIFItPmFkZFJhbmdlKGFyZ1JhbmdlKTsKLSAgICAgIGlmIChhcmdFeCkKLSAgICAgICAgYnVncmVwb3J0ZXI6OnRyYWNrTnVsbE9yVW5kZWZWYWx1ZShOLCBhcmdFeCwgKlIpOworICAgICAgUi0+YWRkUmFuZ2UoQXJnUmFuZ2UpOworICAgICAgaWYgKEFyZ0V4KQorICAgICAgICBidWdyZXBvcnRlcjo6dHJhY2tOdWxsT3JVbmRlZlZhbHVlKE4sIEFyZ0V4LCAqUik7CiAgICAgICBDLmVtaXRSZXBvcnQoUik7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgaWYgKCFjaGVja1VuaW5pdEZpZWxkcykKKyAgaWYgKCFDaGVja1VuaW5pdEZpZWxkcykKICAgICByZXR1cm4gZmFsc2U7CiAKICAgaWYgKE9wdGlvbmFsPG5vbmxvYzo6TGF6eUNvbXBvdW5kVmFsPiBMViA9CkBAIC0xNTksMTAgKzIzMSw5IEBACiAgICAgICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpSVCA9IFQtPmdldEFzU3RydWN0dXJlVHlwZSgpKSB7CiAgICAgICAgICAgY29uc3QgUmVjb3JkRGVjbCAqUkQgPSBSVC0+Z2V0RGVjbCgpLT5nZXREZWZpbml0aW9uKCk7CiAgICAgICAgICAgYXNzZXJ0KFJEICYmICJSZWZlcnJlZCByZWNvcmQgaGFzIG5vIGRlZmluaXRpb24iKTsKLSAgICAgICAgICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEkgPQotICAgICAgICAgICAgICAgUkQtPmZpZWxkX2JlZ2luKCksIEUgPSBSRC0+ZmllbGRfZW5kKCk7IEkhPUU7ICsrSSkgewotICAgICAgICAgICAgY29uc3QgRmllbGRSZWdpb24gKkZSID0gTXJNZ3IuZ2V0RmllbGRSZWdpb24oKkksIFIpOwotICAgICAgICAgICAgRmllbGRDaGFpbi5wdXNoX2JhY2soKkkpOworICAgICAgICAgIGZvciAoY29uc3QgYXV0byAqSSA6IFJELT5maWVsZHMoKSkgeworICAgICAgICAgICAgY29uc3QgRmllbGRSZWdpb24gKkZSID0gTXJNZ3IuZ2V0RmllbGRSZWdpb24oSSwgUik7CisgICAgICAgICAgICBGaWVsZENoYWluLnB1c2hfYmFjayhJKTsKICAgICAgICAgICAgIFQgPSBJLT5nZXRUeXBlKCk7CiAgICAgICAgICAgICBpZiAoVC0+Z2V0QXNTdHJ1Y3R1cmVUeXBlKCkpIHsKICAgICAgICAgICAgICAgaWYgKEZpbmQoRlIpKQpAQCAtMTg4LDcgKzI1OSw3IEBACiAKICAgICBpZiAoRi5GaW5kKEQtPmdldFJlZ2lvbigpKSkgewogICAgICAgaWYgKEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKCkpIHsKLSAgICAgICAgTGF6eUluaXRfQlQoIlVuaW5pdGlhbGl6ZWQgYXJndW1lbnQgdmFsdWUiLCBCVCk7CisgICAgICAgIExhenlJbml0X0JUKEJELCBCVCk7CiAgICAgICAgIFNtYWxsU3RyaW5nPDUxMj4gU3RyOwogICAgICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zKFN0cik7CiAgICAgICAgIG9zIDw8ICJQYXNzZWQtYnktdmFsdWUgc3RydWN0IGFyZ3VtZW50IGNvbnRhaW5zIHVuaW5pdGlhbGl6ZWQgZGF0YSI7CkBAIC0yMTEsNyArMjgyLDcgQEAKIAogICAgICAgICAvLyBHZW5lcmF0ZSBhIHJlcG9ydCBmb3IgdGhpcyBidWcuCiAgICAgICAgIEJ1Z1JlcG9ydCAqUiA9IG5ldyBCdWdSZXBvcnQoKkJULCBvcy5zdHIoKSwgTik7Ci0gICAgICAgIFItPmFkZFJhbmdlKGFyZ1JhbmdlKTsKKyAgICAgICAgUi0+YWRkUmFuZ2UoQXJnUmFuZ2UpOwogCiAgICAgICAgIC8vIEZJWE1FOiBlbmhhbmNlIHRyYWNrIGJhY2sgZm9yIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZm9yIGFyYml0cmFyeQogICAgICAgICAvLyBtZW1yZWdpb25zCkBAIC0yMzQsMjAgKzMwNSwxOSBAQAogCiAgIGlmIChMLmlzVW5kZWYoKSkgewogICAgIGlmICghQlRfY2FsbF91bmRlZikKLSAgICAgIEJUX2NhbGxfdW5kZWYucmVzZXQobmV3IEJ1aWx0aW5CdWcoIkNhbGxlZCBmdW5jdGlvbiBwb2ludGVyIGlzIGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuaW5pdGFsaXplZCBwb2ludGVyIHZhbHVlIikpOworICAgICAgQlRfY2FsbF91bmRlZi5yZXNldChuZXcgQnVpbHRpbkJ1ZygKKyAgICAgICAgICB0aGlzLCAiQ2FsbGVkIGZ1bmN0aW9uIHBvaW50ZXIgaXMgYW4gdW5pbml0YWxpemVkIHBvaW50ZXIgdmFsdWUiKSk7CiAgICAgZW1pdEJhZENhbGwoQlRfY2FsbF91bmRlZi5nZXQoKSwgQywgQ2FsbGVlKTsKICAgICByZXR1cm47CiAgIH0KIAogICBQcm9ncmFtU3RhdGVSZWYgU3ROb25OdWxsLCBTdE51bGw7Ci0gIGxsdm06OnRpZShTdE5vbk51bGwsIFN0TnVsbCkgPQotICAgICAgU3RhdGUtPmFzc3VtZShMLmNhc3RBczxEZWZpbmVkT3JVbmtub3duU1ZhbD4oKSk7CisgIHN0ZDo6dGllKFN0Tm9uTnVsbCwgU3ROdWxsKSA9IFN0YXRlLT5hc3N1bWUoTC5jYXN0QXM8RGVmaW5lZE9yVW5rbm93blNWYWw+KCkpOwogCiAgIGlmIChTdE51bGwgJiYgIVN0Tm9uTnVsbCkgewogICAgIGlmICghQlRfY2FsbF9udWxsKQotICAgICAgQlRfY2FsbF9udWxsLnJlc2V0KAotICAgICAgICBuZXcgQnVpbHRpbkJ1ZygiQ2FsbGVkIGZ1bmN0aW9uIHBvaW50ZXIgaXMgbnVsbCAobnVsbCBkZXJlZmVyZW5jZSkiKSk7CisgICAgICBCVF9jYWxsX251bGwucmVzZXQobmV3IEJ1aWx0aW5CdWcoCisgICAgICAgICAgdGhpcywgIkNhbGxlZCBmdW5jdGlvbiBwb2ludGVyIGlzIG51bGwgKG51bGwgZGVyZWZlcmVuY2UpIikpOwogICAgIGVtaXRCYWRDYWxsKEJUX2NhbGxfbnVsbC5nZXQoKSwgQywgQ2FsbGVlKTsKICAgICByZXR1cm47CiAgIH0KQEAgLTI2NSw3ICszMzUsOCBAQAogICAgIGlmICghTikKICAgICAgIHJldHVybjsKICAgICBpZiAoIUJUX2N4eF9kZWxldGVfdW5kZWYpCi0gICAgICBCVF9jeHhfZGVsZXRlX3VuZGVmLnJlc2V0KG5ldyBCdWlsdGluQnVnKCJVbmluaXRpYWxpemVkIGFyZ3VtZW50IHZhbHVlIikpOworICAgICAgQlRfY3h4X2RlbGV0ZV91bmRlZi5yZXNldCgKKyAgICAgICAgICBuZXcgQnVpbHRpbkJ1Zyh0aGlzLCAiVW5pbml0aWFsaXplZCBhcmd1bWVudCB2YWx1ZSIpKTsKICAgICBpZiAoREUtPmlzQXJyYXlGb3JtQXNXcml0dGVuKCkpCiAgICAgICBEZXNjID0gIkFyZ3VtZW50IHRvICdkZWxldGVbXScgaXMgdW5pbml0aWFsaXplZCI7CiAgICAgZWxzZQpAQCAtMjg5LDIwICszNjAsMjAgQEAKICAgICBTVmFsIFYgPSBDQy0+Z2V0Q1hYVGhpc1ZhbCgpOwogICAgIGlmIChWLmlzVW5kZWYoKSkgewogICAgICAgaWYgKCFCVF9jeHhfY2FsbF91bmRlZikKLSAgICAgICAgQlRfY3h4X2NhbGxfdW5kZWYucmVzZXQobmV3IEJ1aWx0aW5CdWcoIkNhbGxlZCBDKysgb2JqZWN0IHBvaW50ZXIgaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5pbml0aWFsaXplZCIpKTsKKyAgICAgICAgQlRfY3h4X2NhbGxfdW5kZWYucmVzZXQoCisgICAgICAgICAgICBuZXcgQnVpbHRpbkJ1Zyh0aGlzLCAiQ2FsbGVkIEMrKyBvYmplY3QgcG9pbnRlciBpcyB1bmluaXRpYWxpemVkIikpOwogICAgICAgZW1pdEJhZENhbGwoQlRfY3h4X2NhbGxfdW5kZWYuZ2V0KCksIEMsIENDLT5nZXRDWFhUaGlzRXhwcigpKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBQcm9ncmFtU3RhdGVSZWYgU3ROb25OdWxsLCBTdE51bGw7Ci0gICAgbGx2bTo6dGllKFN0Tm9uTnVsbCwgU3ROdWxsKSA9CisgICAgc3RkOjp0aWUoU3ROb25OdWxsLCBTdE51bGwpID0KICAgICAgICAgU3RhdGUtPmFzc3VtZShWLmNhc3RBczxEZWZpbmVkT3JVbmtub3duU1ZhbD4oKSk7CiAKICAgICBpZiAoU3ROdWxsICYmICFTdE5vbk51bGwpIHsKICAgICAgIGlmICghQlRfY3h4X2NhbGxfbnVsbCkKLSAgICAgICAgQlRfY3h4X2NhbGxfbnVsbC5yZXNldChuZXcgQnVpbHRpbkJ1ZygiQ2FsbGVkIEMrKyBvYmplY3QgcG9pbnRlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG51bGwiKSk7CisgICAgICAgIEJUX2N4eF9jYWxsX251bGwucmVzZXQoCisgICAgICAgICAgICBuZXcgQnVpbHRpbkJ1Zyh0aGlzLCAiQ2FsbGVkIEMrKyBvYmplY3QgcG9pbnRlciBpcyBudWxsIikpOwogICAgICAgZW1pdEJhZENhbGwoQlRfY3h4X2NhbGxfbnVsbC5nZXQoKSwgQywgQ0MtPmdldENYWFRoaXNFeHByKCkpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTMxMSw3ICszODIsOCBAQAogICB9CiAKICAgY29uc3QgRGVjbCAqRCA9IENhbGwuZ2V0RGVjbCgpOwotICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb25EZWNsPihEKSkgeworICBjb25zdCBGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Rfb3JfbnVsbDxGdW5jdGlvbkRlY2w+KEQpOworICBpZiAoRkQpIHsKICAgICAvLyBJZiB3ZSBoYXZlIGEgZGVjbGFyYXRpb24sIHdlIGNhbiBtYWtlIHN1cmUgd2UgcGFzcyBlbm91Z2ggcGFyYW1ldGVycyB0bwogICAgIC8vIHRoZSBmdW5jdGlvbi4KICAgICB1bnNpZ25lZCBQYXJhbXMgPSBGRC0+Z2V0TnVtUGFyYW1zKCk7CkBAIC0zNDAsMTcgKzQxMiwyMSBAQAogICBjb25zdCBib29sIGNoZWNrVW5pbml0RmllbGRzID0KICAgICAhKEMuZ2V0QW5hbHlzaXNNYW5hZ2VyKCkuc2hvdWxkSW5saW5lQ2FsbCgpICYmIChEICYmIEQtPmdldEJvZHkoKSkpOwogCi0gIE93bmluZ1B0cjxCdWdUeXBlPiAqQlQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiAqQlQ7CiAgIGlmIChpc2E8T2JqQ01ldGhvZENhbGw+KENhbGwpKQogICAgIEJUID0gJkJUX21zZ19hcmc7CiAgIGVsc2UKICAgICBCVCA9ICZCVF9jYWxsX2FyZzsKIAotICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ2FsbC5nZXROdW1BcmdzKCk7IGkgIT0gZTsgKytpKQorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ2FsbC5nZXROdW1BcmdzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY29uc3QgUGFybVZhckRlY2wgKlBhcmFtRGVjbCA9IE5VTEw7CisgICAgaWYoRkQgJiYgaSA8IEZELT5nZXROdW1QYXJhbXMoKSkKKyAgICAgIFBhcmFtRGVjbCA9IEZELT5nZXRQYXJhbURlY2woaSk7CiAgICAgaWYgKFByZVZpc2l0UHJvY2Vzc0FyZyhDLCBDYWxsLmdldEFyZ1NWYWwoaSksIENhbGwuZ2V0QXJnU291cmNlUmFuZ2UoaSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsLmdldEFyZ0V4cHIoaSksIC8qSXNGaXJzdEFyZ3VtZW50PSovaSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tVbmluaXRGaWVsZHMsIENhbGwsICpCVCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1VuaW5pdEZpZWxkcywgQ2FsbCwgKkJULCBQYXJhbURlY2wpKQogICAgICAgcmV0dXJuOworICB9CiAKICAgLy8gSWYgd2UgbWFrZSBpdCBoZXJlLCByZWNvcmQgb3VyIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjYWxsZWUuCiAgIEMuYWRkVHJhbnNpdGlvbihTdGF0ZSk7CkBAIC0zNjUsMjIgKzQ0MSwyMSBAQAogICAgICAgc3dpdGNoIChtc2cuZ2V0TWVzc2FnZUtpbmQoKSkgewogICAgICAgY2FzZSBPQ01fTWVzc2FnZToKICAgICAgICAgaWYgKCFCVF9tc2dfdW5kZWYpCi0gICAgICAgICAgQlRfbXNnX3VuZGVmLnJlc2V0KG5ldyBCdWlsdGluQnVnKCJSZWNlaXZlciBpbiBtZXNzYWdlIGV4cHJlc3Npb24gIgorICAgICAgICAgIEJUX21zZ191bmRlZi5yZXNldChuZXcgQnVpbHRpbkJ1Zyh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZXIgaW4gbWVzc2FnZSBleHByZXNzaW9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUiKSk7CiAgICAgICAgIEJUID0gQlRfbXNnX3VuZGVmLmdldCgpOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgT0NNX1Byb3BlcnR5QWNjZXNzOgogICAgICAgICBpZiAoIUJUX29iamNfcHJvcF91bmRlZikKLSAgICAgICAgICBCVF9vYmpjX3Byb3BfdW5kZWYucmVzZXQobmV3IEJ1aWx0aW5CdWcoIlByb3BlcnR5IGFjY2VzcyBvbiBhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmluaXRpYWxpemVkIG9iamVjdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludGVyIikpOworICAgICAgICAgIEJUX29iamNfcHJvcF91bmRlZi5yZXNldChuZXcgQnVpbHRpbkJ1ZygKKyAgICAgICAgICAgICAgdGhpcywgIlByb3BlcnR5IGFjY2VzcyBvbiBhbiB1bmluaXRpYWxpemVkIG9iamVjdCBwb2ludGVyIikpOwogICAgICAgICBCVCA9IEJUX29iamNfcHJvcF91bmRlZi5nZXQoKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIE9DTV9TdWJzY3JpcHQ6CiAgICAgICAgIGlmICghQlRfb2JqY19zdWJzY3JpcHRfdW5kZWYpCi0gICAgICAgICAgQlRfb2JqY19zdWJzY3JpcHRfdW5kZWYucmVzZXQobmV3IEJ1aWx0aW5CdWcoIlN1YnNjcmlwdCBhY2Nlc3Mgb24gYW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmluaXRpYWxpemVkIG9iamVjdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50ZXIiKSk7CisgICAgICAgICAgQlRfb2JqY19zdWJzY3JpcHRfdW5kZWYucmVzZXQobmV3IEJ1aWx0aW5CdWcoCisgICAgICAgICAgICAgIHRoaXMsICJTdWJzY3JpcHQgYWNjZXNzIG9uIGFuIHVuaW5pdGlhbGl6ZWQgb2JqZWN0IHBvaW50ZXIiKSk7CiAgICAgICAgIEJUID0gQlRfb2JqY19zdWJzY3JpcHRfdW5kZWYuZ2V0KCk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQpAQCAtNDAyLDcgKzQ3Nyw3IEBACiAKICAgICBQcm9ncmFtU3RhdGVSZWYgc3RhdGUgPSBDLmdldFN0YXRlKCk7CiAgICAgUHJvZ3JhbVN0YXRlUmVmIG5vdE5pbFN0YXRlLCBuaWxTdGF0ZTsKLSAgICBsbHZtOjp0aWUobm90TmlsU3RhdGUsIG5pbFN0YXRlKSA9IHN0YXRlLT5hc3N1bWUocmVjZWl2ZXJWYWwpOworICAgIHN0ZDo6dGllKG5vdE5pbFN0YXRlLCBuaWxTdGF0ZSkgPSBzdGF0ZS0+YXNzdW1lKHJlY2VpdmVyVmFsKTsKIAogICAgIC8vIEhhbmRsZSByZWNlaXZlciBtdXN0IGJlIG5pbC4KICAgICBpZiAobmlsU3RhdGUgJiYgIW5vdE5pbFN0YXRlKSB7CkBAIC00MTgsNyArNDkzLDcgQEAKIAogICBpZiAoIUJUX21zZ19yZXQpCiAgICAgQlRfbXNnX3JldC5yZXNldCgKLSAgICAgIG5ldyBCdWlsdGluQnVnKCJSZWNlaXZlciBpbiBtZXNzYWdlIGV4cHJlc3Npb24gaXMgJ25pbCciKSk7CisgICAgICAgIG5ldyBCdWlsdGluQnVnKHRoaXMsICJSZWNlaXZlciBpbiBtZXNzYWdlIGV4cHJlc3Npb24gaXMgJ25pbCciKSk7CiAKICAgY29uc3QgT2JqQ01lc3NhZ2VFeHByICpNRSA9IG1zZy5nZXRPcmlnaW5FeHByKCk7CiAKQEAgLTQyNiw4ICs1MDEsOSBAQAogCiAgIFNtYWxsU3RyaW5nPDIwMD4gYnVmOwogICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zKGJ1Zik7Ci0gIG9zIDw8ICJUaGUgcmVjZWl2ZXIgb2YgbWVzc2FnZSAnIiA8PCBNRS0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpCi0gICAgIDw8ICInIGlzIG5pbCI7CisgIG9zIDw8ICJUaGUgcmVjZWl2ZXIgb2YgbWVzc2FnZSAnIjsKKyAgTUUtPmdldFNlbGVjdG9yKCkucHJpbnQob3MpOworICBvcyA8PCAiJyBpcyBuaWwiOwogICBpZiAoUmVzVHktPmlzUmVmZXJlbmNlVHlwZSgpKSB7CiAgICAgb3MgPDwgIiwgd2hpY2ggcmVzdWx0cyBpbiBmb3JtaW5nIGEgbnVsbCByZWZlcmVuY2UiOwogICB9IGVsc2UgewpAQCAtNDU0LDcgKzUzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNNZXRob2RDYWxsICZNc2cpIGNvbnN0IHsKICAgQVNUQ29udGV4dCAmQ3R4ID0gQy5nZXRBU1RDb250ZXh0KCk7Ci0gIHN0YXRpYyBTaW1wbGVQcm9ncmFtUG9pbnRUYWcgVGFnKCJDYWxsQW5kTWVzc2FnZUNoZWNrZXIgOiBOaWxSZWNlaXZlciIpOworICBzdGF0aWMgQ2hlY2tlclByb2dyYW1Qb2ludFRhZyBUYWcodGhpcywgIk5pbFJlY2VpdmVyIik7CiAKICAgLy8gQ2hlY2sgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXNzYWdlIGV4cHJlc3Npb24uICBBIG1lc3NhZ2UgdG8gbmlsIHdpbGwKICAgLy8gcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMgZGVwZW5kaW5nIG9uIHRoZSByZXR1cm4gdHlwZSBhbmQgdGhlIGFyY2hpdGVjdHVyZS4KQEAgLTUxMCw2ICs1ODYsMTMgQEAKICAgQy5hZGRUcmFuc2l0aW9uKHN0YXRlKTsKIH0KIAotdm9pZCBlbnRvOjpyZWdpc3RlckNhbGxBbmRNZXNzYWdlQ2hlY2tlcihDaGVja2VyTWFuYWdlciAmbWdyKSB7Ci0gIG1nci5yZWdpc3RlckNoZWNrZXI8Q2FsbEFuZE1lc3NhZ2VDaGVja2VyPigpOwotfQorI2RlZmluZSBSRUdJU1RFUl9DSEVDS0VSKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBlbnRvOjpyZWdpc3RlciMjbmFtZShDaGVja2VyTWFuYWdlciAmbWdyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ2FsbEFuZE1lc3NhZ2VDaGVja2VyICpDaGVja2VyID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtZ3IucmVnaXN0ZXJDaGVja2VyPENhbGxBbmRNZXNzYWdlQ2hlY2tlcj4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDaGVja2VyLT5GaWx0ZXIuQ2hlY2tfIyNuYW1lID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ2hlY2tlci0+RmlsdGVyLkNoZWNrTmFtZV8jI25hbWUgPSBtZ3IuZ2V0Q3VycmVudENoZWNrTmFtZSgpOyAgICAgICAgICAgICAgXAorICB9CisKK1JFR0lTVEVSX0NIRUNLRVIoQ2FsbEFuZE1lc3NhZ2VVbkluaXRSZWZBcmcpCitSRUdJU1RFUl9DSEVDS0VSKENhbGxBbmRNZXNzYWdlQ2hlY2tlcikKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DYXN0U2l6ZUNoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0Nhc3RTaXplQ2hlY2tlci5jcHAKaW5kZXggNWU2ZTEwNS4uZTlhZGYzMCAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0Nhc3RTaXplQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0Nhc3RTaXplQ2hlY2tlci5jcHAKQEAgLTIzLDEyICsyMyw3MSBAQAogCiBuYW1lc3BhY2UgewogY2xhc3MgQ2FzdFNpemVDaGVja2VyIDogcHVibGljIENoZWNrZXI8IGNoZWNrOjpQcmVTdG10PENhc3RFeHByPiA+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVpbHRpbkJ1Zz4gQlQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1aWx0aW5CdWc+IEJUOworCiBwdWJsaWM6CiAgIHZvaWQgY2hlY2tQcmVTdG10KGNvbnN0IENhc3RFeHByICpDRSwgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwogfTsKIH0KIAorLy8vIENoZWNrIGlmIHdlIGFyZSBjYXN0aW5nIHRvIGEgc3RydWN0IHdpdGggYSBmbGV4aWJsZSBhcnJheSBhdCB0aGUgZW5kLgorLy8vIFxjb2RlCisvLy8gc3RydWN0IGZvbyB7CisvLy8gICBzaXplX3QgbGVuOworLy8vICAgc3RydWN0IGJhciBkYXRhW107CisvLy8gfTsKKy8vLyBcZW5kY29kZQorLy8vIG9yCisvLy8gXGNvZGUKKy8vLyBzdHJ1Y3QgZm9vIHsKKy8vLyAgIHNpemVfdCBsZW47CisvLy8gICBzdHJ1Y3QgYmFyIGRhdGFbMF07CisvLy8gfQorLy8vIFxlbmRjb2RlCisvLy8gSW4gdGhlc2UgY2FzZXMgaXQgaXMgYWxzbyB2YWxpZCB0byBhbGxvY2F0ZSBzaXplIG9mIHN0cnVjdCBmb28gKyBhIG11bHRpcGxlCisvLy8gb2Ygc3RydWN0IGJhci4KK3N0YXRpYyBib29sIGV2ZW5GbGV4aWJsZUFycmF5U2l6ZShBU1RDb250ZXh0ICZDdHgsIENoYXJVbml0cyBSZWdpb25TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJVbml0cyBUeXBlU2l6ZSwgUXVhbFR5cGUgVG9Qb2ludGVlVHkpIHsKKyAgY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBUb1BvaW50ZWVUeS0+Z2V0QXM8UmVjb3JkVHlwZT4oKTsKKyAgaWYgKCFSVCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgUmVjb3JkRGVjbCAqUkQgPSBSVC0+Z2V0RGVjbCgpOworICBSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBJdGVyKFJELT5maWVsZF9iZWdpbigpKTsKKyAgUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgRW5kKFJELT5maWVsZF9lbmQoKSk7CisgIGNvbnN0IEZpZWxkRGVjbCAqTGFzdCA9IDA7CisgIGZvciAoOyBJdGVyICE9IEVuZDsgKytJdGVyKQorICAgIExhc3QgPSAqSXRlcjsKKyAgYXNzZXJ0KExhc3QgJiYgImVtcHR5IHN0cnVjdHMgc2hvdWxkIGFscmVhZHkgYmUgaGFuZGxlZCIpOworCisgIGNvbnN0IFR5cGUgKkVsZW1UeXBlID0gTGFzdC0+Z2V0VHlwZSgpLT5nZXRBcnJheUVsZW1lbnRUeXBlTm9UeXBlUXVhbCgpOworICBDaGFyVW5pdHMgRmxleFNpemU7CisgIGlmIChjb25zdCBDb25zdGFudEFycmF5VHlwZSAqQXJyYXlUeSA9CisgICAgICAgIEN0eC5nZXRBc0NvbnN0YW50QXJyYXlUeXBlKExhc3QtPmdldFR5cGUoKSkpIHsKKyAgICBGbGV4U2l6ZSA9IEN0eC5nZXRUeXBlU2l6ZUluQ2hhcnMoRWxlbVR5cGUpOworICAgIGlmIChBcnJheVR5LT5nZXRTaXplKCkgPT0gMSAmJiBUeXBlU2l6ZSA+IEZsZXhTaXplKQorICAgICAgVHlwZVNpemUgLT0gRmxleFNpemU7CisgICAgZWxzZSBpZiAoQXJyYXlUeS0+Z2V0U2l6ZSgpICE9IDApCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAoUkQtPmhhc0ZsZXhpYmxlQXJyYXlNZW1iZXIoKSkgeworICAgIEZsZXhTaXplID0gQ3R4LmdldFR5cGVTaXplSW5DaGFycyhFbGVtVHlwZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKEZsZXhTaXplLmlzWmVybygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBDaGFyVW5pdHMgTGVmdCA9IFJlZ2lvblNpemUgLSBUeXBlU2l6ZTsKKyAgaWYgKExlZnQuaXNOZWdhdGl2ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoTGVmdCAlIEZsZXhTaXplID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIENhc3RTaXplQ2hlY2tlcjo6Y2hlY2tQcmVTdG10KGNvbnN0IENhc3RFeHByICpDRSxDaGVja2VyQ29udGV4dCAmQykgY29uc3QgewogICBjb25zdCBFeHByICpFID0gQ0UtPmdldFN1YkV4cHIoKTsKICAgQVNUQ29udGV4dCAmQ3R4ID0gQy5nZXRBU1RDb250ZXh0KCk7CkBAIC02NiwyMSArMTI1LDIzIEBACiAgIGlmICh0eXBlU2l6ZS5pc1plcm8oKSkKICAgICByZXR1cm47CiAKLSAgaWYgKHJlZ2lvblNpemUgJSB0eXBlU2l6ZSAhPSAwKSB7Ci0gICAgaWYgKEV4cGxvZGVkTm9kZSAqZXJyb3JOb2RlID0gQy5nZW5lcmF0ZVNpbmsoKSkgewotICAgICAgaWYgKCFCVCkKLSAgICAgICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcoIkNhc3QgcmVnaW9uIHdpdGggd3Jvbmcgc2l6ZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXN0IGEgcmVnaW9uIHdob3NlIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGVzdGluYXRpb24gdHlwZSBzaXplLiIpKTsKLSAgICAgIEJ1Z1JlcG9ydCAqUiA9IG5ldyBCdWdSZXBvcnQoKkJULCBCVC0+Z2V0RGVzY3JpcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb2RlKTsKLSAgICAgIFItPmFkZFJhbmdlKENFLT5nZXRTb3VyY2VSYW5nZSgpKTsKLSAgICAgIEMuZW1pdFJlcG9ydChSKTsKLSAgICB9CisgIGlmIChyZWdpb25TaXplICUgdHlwZVNpemUgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKGV2ZW5GbGV4aWJsZUFycmF5U2l6ZShDdHgsIHJlZ2lvblNpemUsIHR5cGVTaXplLCBUb1BvaW50ZWVUeSkpCisgICAgcmV0dXJuOworCisgIGlmIChFeHBsb2RlZE5vZGUgKmVycm9yTm9kZSA9IEMuZ2VuZXJhdGVTaW5rKCkpIHsKKyAgICBpZiAoIUJUKQorICAgICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcodGhpcywgIkNhc3QgcmVnaW9uIHdpdGggd3Jvbmcgc2l6ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhc3QgYSByZWdpb24gd2hvc2Ugc2l6ZSBpcyBub3QgYSBtdWx0aXBsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb2YgdGhlIGRlc3RpbmF0aW9uIHR5cGUgc2l6ZS4iKSk7CisgICAgQnVnUmVwb3J0ICpSID0gbmV3IEJ1Z1JlcG9ydCgqQlQsIEJULT5nZXREZXNjcmlwdGlvbigpLCBlcnJvck5vZGUpOworICAgIFItPmFkZFJhbmdlKENFLT5nZXRTb3VyY2VSYW5nZSgpKTsKKyAgICBDLmVtaXRSZXBvcnQoUik7CiAgIH0KIH0KIAotCiB2b2lkIGVudG86OnJlZ2lzdGVyQ2FzdFNpemVDaGVja2VyKENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKLSAgbWdyLnJlZ2lzdGVyQ2hlY2tlcjxDYXN0U2l6ZUNoZWNrZXI+KCk7ICAKKyAgbWdyLnJlZ2lzdGVyQ2hlY2tlcjxDYXN0U2l6ZUNoZWNrZXI+KCk7CiB9CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2FzdFRvU3RydWN0Q2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2FzdFRvU3RydWN0Q2hlY2tlci5jcHAKaW5kZXggNjAzNDhjNy4uZDc2NTMxNSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0Nhc3RUb1N0cnVjdENoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DYXN0VG9TdHJ1Y3RDaGVja2VyLmNwcApAQCAtMjQsNyArMjQsNyBAQAogCiBuYW1lc3BhY2UgewogY2xhc3MgQ2FzdFRvU3RydWN0Q2hlY2tlciA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6UHJlU3RtdDxDYXN0RXhwcj4gPiB7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1aWx0aW5CdWc+IEJUOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWlsdGluQnVnPiBCVDsKIAogcHVibGljOgogICB2b2lkIGNoZWNrUHJlU3RtdChjb25zdCBDYXN0RXhwciAqQ0UsIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdDsKQEAgLTU4LDEwICs1OCwxMSBAQAogICBpZiAoIU9yaWdQb2ludGVlVHktPmlzUmVjb3JkVHlwZSgpKSB7CiAgICAgaWYgKEV4cGxvZGVkTm9kZSAqTiA9IEMuYWRkVHJhbnNpdGlvbigpKSB7CiAgICAgICBpZiAoIUJUKQotICAgICAgICBCVC5yZXNldChuZXcgQnVpbHRpbkJ1ZygiQ2FzdCBmcm9tIG5vbi1zdHJ1Y3QgdHlwZSB0byBzdHJ1Y3QgdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhc3RpbmcgYSBub24tc3RydWN0dXJlIHR5cGUgdG8gYSBzdHJ1Y3R1cmUgdHlwZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBhY2Nlc3NpbmcgYSBmaWVsZCBjYW4gbGVhZCB0byBtZW1vcnkgYWNjZXNzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JzIG9yIGRhdGEgY29ycnVwdGlvbi4iKSk7CisgICAgICAgIEJULnJlc2V0KAorICAgICAgICAgICAgbmV3IEJ1aWx0aW5CdWcodGhpcywgIkNhc3QgZnJvbSBub24tc3RydWN0IHR5cGUgdG8gc3RydWN0IHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhc3RpbmcgYSBub24tc3RydWN0dXJlIHR5cGUgdG8gYSBzdHJ1Y3R1cmUgdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIGFjY2Vzc2luZyBhIGZpZWxkIGNhbiBsZWFkIHRvIG1lbW9yeSBhY2Nlc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9ycyBvciBkYXRhIGNvcnJ1cHRpb24uIikpOwogICAgICAgQnVnUmVwb3J0ICpSID0gbmV3IEJ1Z1JlcG9ydCgqQlQsQlQtPmdldERlc2NyaXB0aW9uKCksIE4pOwogICAgICAgUi0+YWRkUmFuZ2UoQ0UtPmdldFNvdXJjZVJhbmdlKCkpOwogICAgICAgQy5lbWl0UmVwb3J0KFIpOwpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NoZWNrT2JqQ0RlYWxsb2MuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NoZWNrT2JqQ0RlYWxsb2MuY3BwCmluZGV4IDNmOWIzY2MuLjgyN2ExMGEgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DaGVja09iakNEZWFsbG9jLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2hlY2tPYmpDRGVhbGxvYy5jcHAKQEAgLTk3LDggKzk3LDkgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCBjaGVja09iakNEZWFsbG9jKGNvbnN0IE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zJiBMT3B0cywgQnVnUmVwb3J0ZXImIEJSKSB7CitzdGF0aWMgdm9pZCBjaGVja09iakNEZWFsbG9jKGNvbnN0IENoZWNrZXJCYXNlICpDaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTE9wdHMsIEJ1Z1JlcG9ydGVyICZCUikgewogCiAgIGFzc2VydCAoTE9wdHMuZ2V0R0MoKSAhPSBMYW5nT3B0aW9uczo6R0NPbmx5KTsKIApAQCAtMTEyLDE1ICsxMTMsMTIgQEAKIAogICBib29sIGNvbnRhaW5zUG9pbnRlckl2YXIgPSBmYWxzZTsKIAotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjppdmFyX2l0ZXJhdG9yIEk9SUQtPml2YXJfYmVnaW4oKSwgRT1JRC0+aXZhcl9lbmQoKTsKLSAgICAgICBJIT1FOyArK0kpIHsKLQotICAgIE9iakNJdmFyRGVjbCAqSUQgPSAqSTsKLSAgICBRdWFsVHlwZSBUID0gSUQtPmdldFR5cGUoKTsKKyAgZm9yIChjb25zdCBhdXRvICpJdmFyIDogSUQtPml2YXJzKCkpIHsKKyAgICBRdWFsVHlwZSBUID0gSXZhci0+Z2V0VHlwZSgpOwogCiAgICAgaWYgKCFULT5pc09iakNPYmplY3RQb2ludGVyVHlwZSgpIHx8Ci0gICAgICAgIElELT5nZXRBdHRyPElCT3V0bGV0QXR0cj4oKSB8fCAvLyBTa2lwIElCT3V0bGV0cy4KLSAgICAgICAgSUQtPmdldEF0dHI8SUJPdXRsZXRDb2xsZWN0aW9uQXR0cj4oKSkgLy8gU2tpcCBJQk91dGxldENvbGxlY3Rpb25zLgorICAgICAgICBJdmFyLT5oYXNBdHRyPElCT3V0bGV0QXR0cj4oKSB8fCAvLyBTa2lwIElCT3V0bGV0cy4KKyAgICAgICAgSXZhci0+aGFzQXR0cjxJQk91dGxldENvbGxlY3Rpb25BdHRyPigpKSAvLyBTa2lwIElCT3V0bGV0Q29sbGVjdGlvbnMuCiAgICAgICBjb250aW51ZTsKIAogICAgIGNvbnRhaW5zUG9pbnRlckl2YXIgPSB0cnVlOwpAQCAtMTU1LDE0ICsxNTMsMTIgQEAKICAgLy8gR2V0IHRoZSAiZGVhbGxvYyIgc2VsZWN0b3IuCiAgIElkZW50aWZpZXJJbmZvKiBJSSA9ICZDdHguSWRlbnRzLmdldCgiZGVhbGxvYyIpOwogICBTZWxlY3RvciBTID0gQ3R4LlNlbGVjdG9ycy5nZXRTZWxlY3RvcigwLCAmSUkpOwotICBPYmpDTWV0aG9kRGVjbCAqTUQgPSAwOworICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqTUQgPSAwOwogCiAgIC8vIFNjYW4gdGhlIGluc3RhbmNlIG1ldGhvZHMgZm9yICJkZWFsbG9jIi4KLSAgZm9yIChPYmpDSW1wbGVtZW50YXRpb25EZWNsOjppbnN0bWV0aF9pdGVyYXRvciBJID0gRC0+aW5zdG1ldGhfYmVnaW4oKSwKLSAgICAgICBFID0gRC0+aW5zdG1ldGhfZW5kKCk7IEkhPUU7ICsrSSkgewotCi0gICAgaWYgKCgqSSktPmdldFNlbGVjdG9yKCkgPT0gUykgewotICAgICAgTUQgPSAqSTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogRC0+aW5zdGFuY2VfbWV0aG9kcygpKSB7CisgICAgaWYgKEktPmdldFNlbGVjdG9yKCkgPT0gUykgeworICAgICAgTUQgPSBJOwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CkBAIC0xODAsNyArMTc2LDcgQEAKICAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gb3MoYnVmKTsKICAgICBvcyA8PCAiT2JqZWN0aXZlLUMgY2xhc3MgJyIgPDwgKkQgPDwgIicgbGFja3MgYSAnZGVhbGxvYycgaW5zdGFuY2UgbWV0aG9kIjsKIAotICAgIEJSLkVtaXRCYXNpY1JlcG9ydChELCBuYW1lLCBjYXRlZ29yaWVzOjpDb3JlRm91bmRhdGlvbk9iamVjdGl2ZUMsCisgICAgQlIuRW1pdEJhc2ljUmVwb3J0KEQsIENoZWNrZXIsIG5hbWUsIGNhdGVnb3JpZXM6OkNvcmVGb3VuZGF0aW9uT2JqZWN0aXZlQywKICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RyKCksIERMb2MpOwogICAgIHJldHVybjsKICAgfQpAQCAtMTk4LDcgKzE5NCw3IEBACiAgICAgICAgPDwgIicgZG9lcyBub3Qgc2VuZCBhICdkZWFsbG9jJyBtZXNzYWdlIHRvIGl0cyBzdXBlciBjbGFzcyIKICAgICAgICAgICAgIiAobWlzc2luZyBbc3VwZXIgZGVhbGxvY10pIjsKIAotICAgIEJSLkVtaXRCYXNpY1JlcG9ydChNRCwgbmFtZSwgY2F0ZWdvcmllczo6Q29yZUZvdW5kYXRpb25PYmplY3RpdmVDLAorICAgIEJSLkVtaXRCYXNpY1JlcG9ydChNRCwgQ2hlY2tlciwgbmFtZSwgY2F0ZWdvcmllczo6Q29yZUZvdW5kYXRpb25PYmplY3RpdmVDLAogICAgICAgICAgICAgICAgICAgICAgICBvcy5zdHIoKSwgRExvYyk7CiAgICAgcmV0dXJuOwogICB9CkBAIC0yMTIsOSArMjA4LDcgQEAKIAogICAvLyBTY2FuIGZvciBtaXNzaW5nIGFuZCBleHRyYSByZWxlYXNlcyBvZiBpdmFycyB1c2VkIGJ5IGltcGxlbWVudGF0aW9ucwogICAvLyBvZiBzeW50aGVzaXplZCBwcm9wZXJ0aWVzCi0gIGZvciAoT2JqQ0ltcGxlbWVudGF0aW9uRGVjbDo6cHJvcGltcGxfaXRlcmF0b3IgSSA9IEQtPnByb3BpbXBsX2JlZ2luKCksCi0gICAgICAgRSA9IEQtPnByb3BpbXBsX2VuZCgpOyBJIT1FOyArK0kpIHsKLQorICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBELT5wcm9wZXJ0eV9pbXBscygpKSB7CiAgICAgLy8gV2UgY2FuIG9ubHkgY2hlY2sgdGhlIHN5bnRoZXNpemVkIHByb3BlcnRpZXMKICAgICBpZiAoSS0+Z2V0UHJvcGVydHlJbXBsZW1lbnRhdGlvbigpICE9IE9iakNQcm9wZXJ0eUltcGxEZWNsOjpTeW50aGVzaXplKQogICAgICAgY29udGludWU7CkBAIC0yNjIsMTAgKzI1NiwxMCBAQAogICAgICAgfQogCiAgICAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIFNETG9jID0KLSAgICAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlQmVnaW4oKkksIEJSLmdldFNvdXJjZU1hbmFnZXIoKSk7CisgICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUJlZ2luKEksIEJSLmdldFNvdXJjZU1hbmFnZXIoKSk7CiAKLSAgICAgIEJSLkVtaXRCYXNpY1JlcG9ydChNRCwgbmFtZSwgY2F0ZWdvcmllczo6Q29yZUZvdW5kYXRpb25PYmplY3RpdmVDLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0cigpLCBTRExvYyk7CisgICAgICBCUi5FbWl0QmFzaWNSZXBvcnQoTUQsIENoZWNrZXIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllczo6Q29yZUZvdW5kYXRpb25PYmplY3RpdmVDLCBvcy5zdHIoKSwgU0RMb2MpOwogICAgIH0KICAgfQogfQpAQCAtMjgyLDcgKzI3Niw4IEBACiAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyICZCUikgY29uc3QgewogICAgIGlmIChtZ3IuZ2V0TGFuZ09wdHMoKS5nZXRHQygpID09IExhbmdPcHRpb25zOjpHQ09ubHkpCiAgICAgICByZXR1cm47Ci0gICAgY2hlY2tPYmpDRGVhbGxvYyhjYXN0PE9iakNJbXBsZW1lbnRhdGlvbkRlY2w+KEQpLCBtZ3IuZ2V0TGFuZ09wdHMoKSwgQlIpOworICAgIGNoZWNrT2JqQ0RlYWxsb2ModGhpcywgY2FzdDxPYmpDSW1wbGVtZW50YXRpb25EZWNsPihEKSwgbWdyLmdldExhbmdPcHRzKCksCisgICAgICAgICAgICAgICAgICAgICBCUik7CiAgIH0KIH07CiB9CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2hlY2tPYmpDSW5zdE1ldGhTaWduYXR1cmUuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NoZWNrT2JqQ0luc3RNZXRoU2lnbmF0dXJlLmNwcAppbmRleCA5Y2IxZDJkLi5kYzUzNjAyIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2hlY2tPYmpDSW5zdE1ldGhTaWduYXR1cmUuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DaGVja09iakNJbnN0TWV0aFNpZ25hdHVyZS5jcHAKQEAgLTQwLDEwICs0MCwxMSBAQAogc3RhdGljIHZvaWQgQ29tcGFyZVJldHVyblR5cGVzKGNvbnN0IE9iakNNZXRob2REZWNsICpNZXRoRGVyaXZlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqTWV0aEFuY2VzdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyICZCUiwgQVNUQ29udGV4dCAmQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKklEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hlY2tlckJhc2UgKkNoZWNrZXIpIHsKIAotICBRdWFsVHlwZSBSZXNEZXJpdmVkICA9IE1ldGhEZXJpdmVkLT5nZXRSZXN1bHRUeXBlKCk7Ci0gIFF1YWxUeXBlIFJlc0FuY2VzdG9yID0gTWV0aEFuY2VzdG9yLT5nZXRSZXN1bHRUeXBlKCk7CisgIFF1YWxUeXBlIFJlc0Rlcml2ZWQgPSBNZXRoRGVyaXZlZC0+Z2V0UmV0dXJuVHlwZSgpOworICBRdWFsVHlwZSBSZXNBbmNlc3RvciA9IE1ldGhBbmNlc3Rvci0+Z2V0UmV0dXJuVHlwZSgpOwogCiAgIGlmICghQXJlVHlwZXNDb21wYXRpYmxlKFJlc0Rlcml2ZWQsIFJlc0FuY2VzdG9yLCBDdHgpKSB7CiAgICAgc3RkOjpzdHJpbmcgc2J1ZjsKQEAgLTUzLDkgKzU0LDkgQEAKICAgICAgICA8PCAqTWV0aERlcml2ZWQtPmdldENsYXNzSW50ZXJmYWNlKCkKICAgICAgICA8PCAiJywgd2hpY2ggaXMgZGVyaXZlZCBmcm9tIGNsYXNzICciCiAgICAgICAgPDwgKk1ldGhBbmNlc3Rvci0+Z2V0Q2xhc3NJbnRlcmZhY2UoKQotICAgICAgIDw8ICInLCBkZWZpbmVzIHRoZSBpbnN0YW5jZSBtZXRob2QgJyIKLSAgICAgICA8PCBNZXRoRGVyaXZlZC0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpCi0gICAgICAgPDwgIicgd2hvc2UgcmV0dXJuIHR5cGUgaXMgJyIKKyAgICAgICA8PCAiJywgZGVmaW5lcyB0aGUgaW5zdGFuY2UgbWV0aG9kICciOworICAgIE1ldGhEZXJpdmVkLT5nZXRTZWxlY3RvcigpLnByaW50KG9zKTsKKyAgICBvcyA8PCAiJyB3aG9zZSByZXR1cm4gdHlwZSBpcyAnIgogICAgICAgIDw8IFJlc0Rlcml2ZWQuZ2V0QXNTdHJpbmcoKQogICAgICAgIDw8ICInLiAgQSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIChzYW1lIHNlbGVjdG9yKSBpcyBhbHNvIGRlZmluZWQgaW4gIgogICAgICAgICAgICJjbGFzcyAnIgpAQCAtNjksMTUgKzcwLDE1IEBACiAgICAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uOjpjcmVhdGVCZWdpbihNZXRoRGVyaXZlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSLmdldFNvdXJjZU1hbmFnZXIoKSk7CiAKLSAgICBCUi5FbWl0QmFzaWNSZXBvcnQoTWV0aERlcml2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICJJbmNvbXBhdGlibGUgaW5zdGFuY2UgbWV0aG9kIHJldHVybiB0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllczo6Q29yZUZvdW5kYXRpb25PYmplY3RpdmVDLAotICAgICAgICAgICAgICAgICAgICAgICBvcy5zdHIoKSwgTWV0aERMb2MpOworICAgIEJSLkVtaXRCYXNpY1JlcG9ydCgKKyAgICAgICAgTWV0aERlcml2ZWQsIENoZWNrZXIsICJJbmNvbXBhdGlibGUgaW5zdGFuY2UgbWV0aG9kIHJldHVybiB0eXBlIiwKKyAgICAgICAgY2F0ZWdvcmllczo6Q29yZUZvdW5kYXRpb25PYmplY3RpdmVDLCBvcy5zdHIoKSwgTWV0aERMb2MpOwogICB9CiB9CiAKIHN0YXRpYyB2b2lkIENoZWNrT2JqQ0luc3RNZXRoU2lnbmF0dXJlKGNvbnN0IE9iakNJbXBsZW1lbnRhdGlvbkRlY2wgKklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXImIEJSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlciAmQlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGVja2VyQmFzZSAqQ2hlY2tlcikgewogCiAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpEID0gSUQtPmdldENsYXNzSW50ZXJmYWNlKCk7CiAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpDID0gRC0+Z2V0U3VwZXJDbGFzcygpOwpAQCAtOTIsMTAgKzkzLDcgQEAKICAgTWFwVHkgSU1ldGhzOwogICB1bnNpZ25lZCBOdW1NZXRob2RzID0gMDsKIAotICBmb3IgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2w6Omluc3RtZXRoX2l0ZXJhdG9yIEk9SUQtPmluc3RtZXRoX2JlZ2luKCksCi0gICAgICAgRT1JRC0+aW5zdG1ldGhfZW5kKCk7IEkhPUU7ICsrSSkgewotCi0gICAgT2JqQ01ldGhvZERlY2wgKk0gPSAqSTsKKyAgZm9yIChhdXRvICpNIDogSUQtPmluc3RhbmNlX21ldGhvZHMoKSkgewogICAgIElNZXRoc1tNLT5nZXRTZWxlY3RvcigpXSA9IE07CiAgICAgKytOdW1NZXRob2RzOwogICB9CkBAIC0xMDMsMTAgKzEwMSw3IEBACiAgIC8vIE5vdyByZWN1cnNlIHRoZSBjbGFzcyBoaWVyYXJjaHkgY2hhaW4gbG9va2luZyBmb3IgbWV0aG9kcyB3aXRoIHRoZQogICAvLyBzYW1lIHNpZ25hdHVyZXMuCiAgIHdoaWxlIChDICYmIE51bU1ldGhvZHMpIHsKLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjppbnN0bWV0aF9pdGVyYXRvciBJPUMtPmluc3RtZXRoX2JlZ2luKCksCi0gICAgICAgICBFPUMtPmluc3RtZXRoX2VuZCgpOyBJIT1FOyArK0kpIHsKLQotICAgICAgT2JqQ01ldGhvZERlY2wgKk0gPSAqSTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKk0gOiBDLT5pbnN0YW5jZV9tZXRob2RzKCkpIHsKICAgICAgIFNlbGVjdG9yIFMgPSBNLT5nZXRTZWxlY3RvcigpOwogCiAgICAgICBNYXBUeTo6aXRlcmF0b3IgTUkgPSBJTWV0aHMuZmluZChTKTsKQEAgLTExOCw3ICsxMTMsNyBAQAogICAgICAgT2JqQ01ldGhvZERlY2wgKk1ldGhEZXJpdmVkID0gTUktPnNlY29uZDsKICAgICAgIE1JLT5zZWNvbmQgPSAwOwogCi0gICAgICBDb21wYXJlUmV0dXJuVHlwZXMoTWV0aERlcml2ZWQsIE0sIEJSLCBDdHgsIElEKTsKKyAgICAgIENvbXBhcmVSZXR1cm5UeXBlcyhNZXRoRGVyaXZlZCwgTSwgQlIsIEN0eCwgSUQsIENoZWNrZXIpOwogICAgIH0KIAogICAgIEMgPSBDLT5nZXRTdXBlckNsYXNzKCk7CkBAIC0xMzUsNyArMTMwLDcgQEAKIHB1YmxpYzoKICAgdm9pZCBjaGVja0FTVERlY2woY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqRCwgQW5hbHlzaXNNYW5hZ2VyJiBtZ3IsCiAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyICZCUikgY29uc3QgewotICAgIENoZWNrT2JqQ0luc3RNZXRoU2lnbmF0dXJlKEQsIEJSKTsKKyAgICBDaGVja09iakNJbnN0TWV0aFNpZ25hdHVyZShELCBCUiwgdGhpcyk7CiAgIH0KIH07CiB9CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2hlY2tTZWN1cml0eVN5bnRheE9ubHkuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NoZWNrU2VjdXJpdHlTeW50YXhPbmx5LmNwcAppbmRleCA0MTVkM2VjLi41NzA2MzY0IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2hlY2tTZWN1cml0eVN5bnRheE9ubHkuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DaGVja1NlY3VyaXR5U3ludGF4T25seS5jcHAKQEAgLTQ2LDggKzQ2LDE4IEBACiAgIERlZmF1bHRCb29sIGNoZWNrX3Zmb3JrOwogICBEZWZhdWx0Qm9vbCBjaGVja19GbG9hdExvb3BDb3VudGVyOwogICBEZWZhdWx0Qm9vbCBjaGVja19VbmNoZWNrZWRSZXR1cm47CisKKyAgQ2hlY2tOYW1lIGNoZWNrTmFtZV9nZXRzOworICBDaGVja05hbWUgY2hlY2tOYW1lX2dldHB3OworICBDaGVja05hbWUgY2hlY2tOYW1lX21rdGVtcDsKKyAgQ2hlY2tOYW1lIGNoZWNrTmFtZV9ta3N0ZW1wOworICBDaGVja05hbWUgY2hlY2tOYW1lX3N0cmNweTsKKyAgQ2hlY2tOYW1lIGNoZWNrTmFtZV9yYW5kOworICBDaGVja05hbWUgY2hlY2tOYW1lX3Zmb3JrOworICBDaGVja05hbWUgY2hlY2tOYW1lX0Zsb2F0TG9vcENvdW50ZXI7CisgIENoZWNrTmFtZSBjaGVja05hbWVfVW5jaGVja2VkUmV0dXJuOwogfTsKLSAgCisKIGNsYXNzIFdhbGtBU1QgOiBwdWJsaWMgU3RtdFZpc2l0b3I8V2Fsa0FTVD4gewogICBCdWdSZXBvcnRlciAmQlI7CiAgIEFuYWx5c2lzRGVjbENvbnRleHQqIEFDOwpAQCAtMjgxLDcgKzI5MSw3IEBACiAKICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBGU0xvYyA9CiAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlQmVnaW4oRlMsIEJSLmdldFNvdXJjZU1hbmFnZXIoKSwgQUMpOwotICBCUi5FbWl0QmFzaWNSZXBvcnQoQUMtPmdldERlY2woKSwKKyAgQlIuRW1pdEJhc2ljUmVwb3J0KEFDLT5nZXREZWNsKCksIGZpbHRlci5jaGVja05hbWVfRmxvYXRMb29wQ291bnRlciwKICAgICAgICAgICAgICAgICAgICAgIGJ1Z1R5cGUsICJTZWN1cml0eSIsIG9zLnN0cigpLAogICAgICAgICAgICAgICAgICAgICAgRlNMb2MsIHJhbmdlcyk7CiB9CkBAIC0zMDIsMTEgKzMxMiwxMSBAQAogICAgIHJldHVybjsKIAogICAvLyBWZXJpZnkgdGhhdCB0aGUgZnVuY3Rpb24gdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQuCi0gIGlmIChGUFQtPmdldE51bUFyZ3MoKSAhPSAxKQorICBpZiAoRlBULT5nZXROdW1QYXJhbXMoKSAhPSAxKQogICAgIHJldHVybjsKIAogICAvLyBJcyB0aGUgYXJndW1lbnQgYSAnY2hhcionPwotICBjb25zdCBQb2ludGVyVHlwZSAqUFQgPSBGUFQtPmdldEFyZ1R5cGUoMCktPmdldEFzPFBvaW50ZXJUeXBlPigpOworICBjb25zdCBQb2ludGVyVHlwZSAqUFQgPSBGUFQtPmdldFBhcmFtVHlwZSgwKS0+Z2V0QXM8UG9pbnRlclR5cGU+KCk7CiAgIGlmICghUFQpCiAgICAgcmV0dXJuOwogCkBAIC0zMTYsNyArMzI2LDcgQEAKICAgLy8gSXNzdWUgYSB3YXJuaW5nLgogICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIENFTG9jID0KICAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uOjpjcmVhdGVCZWdpbihDRSwgQlIuZ2V0U291cmNlTWFuYWdlcigpLCBBQyk7Ci0gIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLAorICBCUi5FbWl0QmFzaWNSZXBvcnQoQUMtPmdldERlY2woKSwgZmlsdGVyLmNoZWNrTmFtZV9nZXRzLAogICAgICAgICAgICAgICAgICAgICAgIlBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgaW4gY2FsbCB0byAnZ2V0cyciLAogICAgICAgICAgICAgICAgICAgICAgIlNlY3VyaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICJDYWxsIHRvIGZ1bmN0aW9uICdnZXRzJyBpcyBleHRyZW1lbHkgaW5zZWN1cmUgYXMgaXQgY2FuICIKQEAgLTMzOCwxNSArMzQ4LDE1IEBACiAgICAgcmV0dXJuOwogCiAgIC8vIFZlcmlmeSB0aGF0IHRoZSBmdW5jdGlvbiB0YWtlcyB0d28gYXJndW1lbnRzLgotICBpZiAoRlBULT5nZXROdW1BcmdzKCkgIT0gMikKKyAgaWYgKEZQVC0+Z2V0TnVtUGFyYW1zKCkgIT0gMikKICAgICByZXR1cm47CiAKICAgLy8gVmVyaWZ5IHRoZSBmaXJzdCBhcmd1bWVudCB0eXBlIGlzIGludGVnZXIuCi0gIGlmICghRlBULT5nZXRBcmdUeXBlKDApLT5pc0ludGVncmFsT3JVbnNjb3BlZEVudW1lcmF0aW9uVHlwZSgpKQorICBpZiAoIUZQVC0+Z2V0UGFyYW1UeXBlKDApLT5pc0ludGVncmFsT3JVbnNjb3BlZEVudW1lcmF0aW9uVHlwZSgpKQogICAgIHJldHVybjsKIAogICAvLyBWZXJpZnkgdGhlIHNlY29uZCBhcmd1bWVudCB0eXBlIGlzIGNoYXIqLgotICBjb25zdCBQb2ludGVyVHlwZSAqUFQgPSBGUFQtPmdldEFyZ1R5cGUoMSktPmdldEFzPFBvaW50ZXJUeXBlPigpOworICBjb25zdCBQb2ludGVyVHlwZSAqUFQgPSBGUFQtPmdldFBhcmFtVHlwZSgxKS0+Z2V0QXM8UG9pbnRlclR5cGU+KCk7CiAgIGlmICghUFQpCiAgICAgcmV0dXJuOwogCkBAIC0zNTYsNyArMzY2LDcgQEAKICAgLy8gSXNzdWUgYSB3YXJuaW5nLgogICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIENFTG9jID0KICAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uOjpjcmVhdGVCZWdpbihDRSwgQlIuZ2V0U291cmNlTWFuYWdlcigpLCBBQyk7Ci0gIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLAorICBCUi5FbWl0QmFzaWNSZXBvcnQoQUMtPmdldERlY2woKSwgZmlsdGVyLmNoZWNrTmFtZV9nZXRwdywKICAgICAgICAgICAgICAgICAgICAgICJQb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93IGluIGNhbGwgdG8gJ2dldHB3JyIsCiAgICAgICAgICAgICAgICAgICAgICAiU2VjdXJpdHkiLAogICAgICAgICAgICAgICAgICAgICAgIlRoZSBnZXRwdygpIGZ1bmN0aW9uIGlzIGRhbmdlcm91cyBhcyBpdCBtYXkgb3ZlcmZsb3cgdGhlICIKQEAgLTM4MiwxMSArMzkyLDExIEBACiAgICAgcmV0dXJuOwogCiAgIC8vIFZlcmlmeSB0aGF0IHRoZSBmdW5jdGlvbiB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudC4KLSAgaWYgKEZQVC0+Z2V0TnVtQXJncygpICE9IDEpCisgIGlmIChGUFQtPmdldE51bVBhcmFtcygpICE9IDEpCiAgICAgcmV0dXJuOwogCiAgIC8vIFZlcmlmeSB0aGF0IHRoZSBhcmd1bWVudCBpcyBQb2ludGVyIFR5cGUuCi0gIGNvbnN0IFBvaW50ZXJUeXBlICpQVCA9IEZQVC0+Z2V0QXJnVHlwZSgwKS0+Z2V0QXM8UG9pbnRlclR5cGU+KCk7CisgIGNvbnN0IFBvaW50ZXJUeXBlICpQVCA9IEZQVC0+Z2V0UGFyYW1UeXBlKDApLT5nZXRBczxQb2ludGVyVHlwZT4oKTsKICAgaWYgKCFQVCkKICAgICByZXR1cm47CiAKQEAgLTM5Nyw3ICs0MDcsNyBAQAogICAvLyBJc3N1ZSBhIHdhcmluZy4KICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBDRUxvYyA9CiAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlQmVnaW4oQ0UsIEJSLmdldFNvdXJjZU1hbmFnZXIoKSwgQUMpOwotICBCUi5FbWl0QmFzaWNSZXBvcnQoQUMtPmdldERlY2woKSwKKyAgQlIuRW1pdEJhc2ljUmVwb3J0KEFDLT5nZXREZWNsKCksIGZpbHRlci5jaGVja05hbWVfbWt0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgIlBvdGVudGlhbCBpbnNlY3VyZSB0ZW1wb3JhcnkgZmlsZSBpbiBjYWxsICdta3RlbXAnIiwKICAgICAgICAgICAgICAgICAgICAgICJTZWN1cml0eSIsCiAgICAgICAgICAgICAgICAgICAgICAiQ2FsbCB0byBmdW5jdGlvbiAnbWt0ZW1wJyBpcyBpbnNlY3VyZSBhcyBpdCBhbHdheXMgIgpAQCAtNDgzLDcgKzQ5Myw3IEBACiAgICAgb3V0IDw8ICIgdXNlZCBhcyBhIHN1ZmZpeCI7CiAgIH0KICAgb3V0IDw8ICcpJzsKLSAgQlIuRW1pdEJhc2ljUmVwb3J0KEFDLT5nZXREZWNsKCksCisgIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLCBmaWx0ZXIuY2hlY2tOYW1lX21rc3RlbXAsCiAgICAgICAgICAgICAgICAgICAgICAiSW5zZWN1cmUgdGVtcG9yYXJ5IGZpbGUgY3JlYXRpb24iLCAiU2VjdXJpdHkiLAogICAgICAgICAgICAgICAgICAgICAgb3V0LnN0cigpLCBDRUxvYywgc3RyQXJnLT5nZXRTb3VyY2VSYW5nZSgpKTsKIH0KQEAgLTUwNCw3ICs1MTQsNyBAQAogICAvLyBJc3N1ZSBhIHdhcm5pbmcuCiAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gQ0VMb2MgPQogICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUJlZ2luKENFLCBCUi5nZXRTb3VyY2VNYW5hZ2VyKCksIEFDKTsKLSAgQlIuRW1pdEJhc2ljUmVwb3J0KEFDLT5nZXREZWNsKCksCisgIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLCBmaWx0ZXIuY2hlY2tOYW1lX3N0cmNweSwKICAgICAgICAgICAgICAgICAgICAgICJQb3RlbnRpYWwgaW5zZWN1cmUgbWVtb3J5IGJ1ZmZlciBib3VuZHMgcmVzdHJpY3Rpb24gaW4gIgogICAgICAgICAgICAgICAgICAgICAgImNhbGwgJ3N0cmNweSciLAogICAgICAgICAgICAgICAgICAgICAgIlNlY3VyaXR5IiwKQEAgLTUzMSw3ICs1NDEsNyBAQAogICAvLyBJc3N1ZSBhIHdhcm5pbmcuCiAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gQ0VMb2MgPQogICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUJlZ2luKENFLCBCUi5nZXRTb3VyY2VNYW5hZ2VyKCksIEFDKTsKLSAgQlIuRW1pdEJhc2ljUmVwb3J0KEFDLT5nZXREZWNsKCksCisgIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLCBmaWx0ZXIuY2hlY2tOYW1lX3N0cmNweSwKICAgICAgICAgICAgICAgICAgICAgICJQb3RlbnRpYWwgaW5zZWN1cmUgbWVtb3J5IGJ1ZmZlciBib3VuZHMgcmVzdHJpY3Rpb24gaW4gIgogICAgICAgICAgICAgICAgICAgICAgImNhbGwgJ3N0cmNhdCciLAogICAgICAgICAgICAgICAgICAgICAgIlNlY3VyaXR5IiwKQEAgLTU1MSwxNCArNTYxLDE0IEBACiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIC8vIFZlcmlmeSB0aGUgZnVuY3Rpb24gdGFrZXMgdHdvIGFyZ3VtZW50cywgdGhyZWUgaW4gdGhlIF9jaGsgdmVyc2lvbi4KLSAgaW50IG51bUFyZ3MgPSBGUFQtPmdldE51bUFyZ3MoKTsKKyAgaW50IG51bUFyZ3MgPSBGUFQtPmdldE51bVBhcmFtcygpOwogICBpZiAobnVtQXJncyAhPSAyICYmIG51bUFyZ3MgIT0gMykKICAgICByZXR1cm4gZmFsc2U7CiAKICAgLy8gVmVyaWZ5IHRoZSB0eXBlIGZvciBib3RoIGFyZ3VtZW50cy4KICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgYXJndW1lbnRzIGFyZSBwb2ludGVycy4KLSAgICBjb25zdCBQb2ludGVyVHlwZSAqUFQgPSBGUFQtPmdldEFyZ1R5cGUoaSktPmdldEFzPFBvaW50ZXJUeXBlPigpOworICAgIGNvbnN0IFBvaW50ZXJUeXBlICpQVCA9IEZQVC0+Z2V0UGFyYW1UeXBlKGkpLT5nZXRBczxQb2ludGVyVHlwZT4oKTsKICAgICBpZiAoIVBUKQogICAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC01ODQsMTcgKzU5NCwxNiBAQAogICBpZiAoIUZUUCkKICAgICByZXR1cm47CiAKLSAgaWYgKEZUUC0+Z2V0TnVtQXJncygpID09IDEpIHsKKyAgaWYgKEZUUC0+Z2V0TnVtUGFyYW1zKCkgPT0gMSkgewogICAgIC8vIElzIHRoZSBhcmd1bWVudCBhbiAndW5zaWduZWQgc2hvcnQgKic/CiAgICAgLy8gKEFjdHVhbGx5IGFueSBpbnRlZ2VyIHR5cGUgaXMgYWxsb3dlZC4pCi0gICAgY29uc3QgUG9pbnRlclR5cGUgKlBUID0gRlRQLT5nZXRBcmdUeXBlKDApLT5nZXRBczxQb2ludGVyVHlwZT4oKTsKKyAgICBjb25zdCBQb2ludGVyVHlwZSAqUFQgPSBGVFAtPmdldFBhcmFtVHlwZSgwKS0+Z2V0QXM8UG9pbnRlclR5cGU+KCk7CiAgICAgaWYgKCFQVCkKICAgICAgIHJldHVybjsKIAogICAgIGlmICghIFBULT5nZXRQb2ludGVlVHlwZSgpLT5pc0ludGVncmFsT3JVbnNjb3BlZEVudW1lcmF0aW9uVHlwZSgpKQogICAgICAgcmV0dXJuOwotICB9Ci0gIGVsc2UgaWYgKEZUUC0+Z2V0TnVtQXJncygpICE9IDApCisgIH0gZWxzZSBpZiAoRlRQLT5nZXROdW1QYXJhbXMoKSAhPSAwKQogICAgIHJldHVybjsKIAogICAvLyBJc3N1ZSBhIHdhcm5pbmcuCkBAIC02MTAsOCArNjE5LDkgQEAKIAogICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIENFTG9jID0KICAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uOjpjcmVhdGVCZWdpbihDRSwgQlIuZ2V0U291cmNlTWFuYWdlcigpLCBBQyk7Ci0gIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLCBvczEuc3RyKCksICJTZWN1cml0eSIsIG9zMi5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgIENFTG9jLCBDRS0+Z2V0Q2FsbGVlKCktPmdldFNvdXJjZVJhbmdlKCkpOworICBCUi5FbWl0QmFzaWNSZXBvcnQoQUMtPmdldERlY2woKSwgZmlsdGVyLmNoZWNrTmFtZV9yYW5kLCBvczEuc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAiU2VjdXJpdHkiLCBvczIuc3RyKCksIENFTG9jLAorICAgICAgICAgICAgICAgICAgICAgQ0UtPmdldENhbGxlZSgpLT5nZXRTb3VyY2VSYW5nZSgpKTsKIH0KIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTYyOCwxMyArNjM4LDEzIEBACiAgICAgcmV0dXJuOwogCiAgIC8vIFZlcmlmeSB0aGF0IHRoZSBmdW5jdGlvbiB0YWtlcyBubyBhcmd1bWVudC4KLSAgaWYgKEZUUC0+Z2V0TnVtQXJncygpICE9IDApCisgIGlmIChGVFAtPmdldE51bVBhcmFtcygpICE9IDApCiAgICAgcmV0dXJuOwogCiAgIC8vIElzc3VlIGEgd2FybmluZy4KICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBDRUxvYyA9CiAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlQmVnaW4oQ0UsIEJSLmdldFNvdXJjZU1hbmFnZXIoKSwgQUMpOwotICBCUi5FbWl0QmFzaWNSZXBvcnQoQUMtPmdldERlY2woKSwKKyAgQlIuRW1pdEJhc2ljUmVwb3J0KEFDLT5nZXREZWNsKCksIGZpbHRlci5jaGVja05hbWVfcmFuZCwKICAgICAgICAgICAgICAgICAgICAgICIncmFuZG9tJyBpcyBub3QgYSBzZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IiLAogICAgICAgICAgICAgICAgICAgICAgIlNlY3VyaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICJUaGUgJ3JhbmRvbScgZnVuY3Rpb24gcHJvZHVjZXMgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgdGhhdCAiCkBAIC02NTQsNyArNjY0LDcgQEAKICAgLy8gQWxsIGNhbGxzIHRvIHZmb3JrKCkgYXJlIGluc2VjdXJlLCBpc3N1ZSBhIHdhcm5pbmcuCiAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gQ0VMb2MgPQogICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUJlZ2luKENFLCBCUi5nZXRTb3VyY2VNYW5hZ2VyKCksIEFDKTsKLSAgQlIuRW1pdEJhc2ljUmVwb3J0KEFDLT5nZXREZWNsKCksCisgIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLCBmaWx0ZXIuY2hlY2tOYW1lX3Zmb3JrLAogICAgICAgICAgICAgICAgICAgICAgIlBvdGVudGlhbCBpbnNlY3VyZSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBiZWhhdmlvciBpbiAiCiAgICAgICAgICAgICAgICAgICAgICAiY2FsbCAndmZvcmsnIiwKICAgICAgICAgICAgICAgICAgICAgICJTZWN1cml0eSIsCkBAIC03MDQsMTIgKzcxNCwxMiBAQAogCiAgIC8vIFZlcmlmeSB0aGF0IHRoZSBmdW5jdGlvbiB0YWtlcyBvbmUgb3IgdHdvIGFyZ3VtZW50cyAoZGVwZW5kaW5nIG9uCiAgIC8vICAgdGhlIGZ1bmN0aW9uKS4KLSAgaWYgKEZUUC0+Z2V0TnVtQXJncygpICE9IChpZGVudGlmaWVyaWQgPCA0ID8gMSA6IDIpKQorICBpZiAoRlRQLT5nZXROdW1QYXJhbXMoKSAhPSAoaWRlbnRpZmllcmlkIDwgNCA/IDEgOiAyKSkKICAgICByZXR1cm47CiAKICAgLy8gVGhlIGFyZ3VtZW50cyBtdXN0IGJlIGludGVnZXJzLgotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRlRQLT5nZXROdW1BcmdzKCk7IGkrKykKLSAgICBpZiAoISBGVFAtPmdldEFyZ1R5cGUoaSktPmlzSW50ZWdyYWxPclVuc2NvcGVkRW51bWVyYXRpb25UeXBlKCkpCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBGVFAtPmdldE51bVBhcmFtcygpOyBpKyspCisgICAgaWYgKCFGVFAtPmdldFBhcmFtVHlwZShpKS0+aXNJbnRlZ3JhbE9yVW5zY29wZWRFbnVtZXJhdGlvblR5cGUoKSkKICAgICAgIHJldHVybjsKIAogICAvLyBJc3N1ZSBhIHdhcm5pbmcuCkBAIC03MjUsOCArNzM1LDkgQEAKIAogICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIENFTG9jID0KICAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uOjpjcmVhdGVCZWdpbihDRSwgQlIuZ2V0U291cmNlTWFuYWdlcigpLCBBQyk7Ci0gIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLCBvczEuc3RyKCksICJTZWN1cml0eSIsIG9zMi5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgIENFTG9jLCBDRS0+Z2V0Q2FsbGVlKCktPmdldFNvdXJjZVJhbmdlKCkpOworICBCUi5FbWl0QmFzaWNSZXBvcnQoQUMtPmdldERlY2woKSwgZmlsdGVyLmNoZWNrTmFtZV9VbmNoZWNrZWRSZXR1cm4sIG9zMS5zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICJTZWN1cml0eSIsIG9zMi5zdHIoKSwgQ0VMb2MsCisgICAgICAgICAgICAgICAgICAgICBDRS0+Z2V0Q2FsbGVlKCktPmdldFNvdXJjZVJhbmdlKCkpOwogfQogCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtNzQ2LDEwICs3NTcsMTMgQEAKIH07CiB9CiAKLSNkZWZpbmUgUkVHSVNURVJfQ0hFQ0tFUihuYW1lKSBcCi12b2lkIGVudG86OnJlZ2lzdGVyIyNuYW1lKENoZWNrZXJNYW5hZ2VyICZtZ3IpIHtcCi0gIG1nci5yZWdpc3RlckNoZWNrZXI8U2VjdXJpdHlTeW50YXhDaGVja2VyPigpLT5maWx0ZXIuY2hlY2tfIyNuYW1lID0gdHJ1ZTtcCi19CisjZGVmaW5lIFJFR0lTVEVSX0NIRUNLRVIobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGVudG86OnJlZ2lzdGVyIyNuYW1lKENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTZWN1cml0eVN5bnRheENoZWNrZXIgKmNoZWNrZXIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1nci5yZWdpc3RlckNoZWNrZXI8U2VjdXJpdHlTeW50YXhDaGVja2VyPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoZWNrZXItPmZpbHRlci5jaGVja18jI25hbWUgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGVja2VyLT5maWx0ZXIuY2hlY2tOYW1lXyMjbmFtZSA9IG1nci5nZXRDdXJyZW50Q2hlY2tOYW1lKCk7ICAgICAgICAgICAgICBcCisgIH0KIAogUkVHSVNURVJfQ0hFQ0tFUihnZXRzKQogUkVHSVNURVJfQ0hFQ0tFUihnZXRwdykKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DaGVja1NpemVvZlBvaW50ZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NoZWNrU2l6ZW9mUG9pbnRlci5jcHAKaW5kZXggMTIwN2I2Ny4uNTEwNmIwNiAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NoZWNrU2l6ZW9mUG9pbnRlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NoZWNrU2l6ZW9mUG9pbnRlci5jcHAKQEAgLTI0LDEwICsyNCwxMiBAQAogbmFtZXNwYWNlIHsKIGNsYXNzIFdhbGtBU1QgOiBwdWJsaWMgU3RtdFZpc2l0b3I8V2Fsa0FTVD4gewogICBCdWdSZXBvcnRlciAmQlI7CisgIGNvbnN0IENoZWNrZXJCYXNlICpDaGVja2VyOwogICBBbmFseXNpc0RlY2xDb250ZXh0KiBBQzsKIAogcHVibGljOgotICBXYWxrQVNUKEJ1Z1JlcG9ydGVyICZiciwgQW5hbHlzaXNEZWNsQ29udGV4dCogYWMpIDogQlIoYnIpLCBBQyhhYykge30KKyAgV2Fsa0FTVChCdWdSZXBvcnRlciAmYnIsIGNvbnN0IENoZWNrZXJCYXNlICpjaGVja2VyLCBBbmFseXNpc0RlY2xDb250ZXh0ICphYykKKyAgICAgIDogQlIoYnIpLCBDaGVja2VyKGNoZWNrZXIpLCBBQyhhYykge30KICAgdm9pZCBWaXNpdFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwcihVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHIgKkUpOwogICB2b2lkIFZpc2l0U3RtdChTdG10ICpTKSB7IFZpc2l0Q2hpbGRyZW4oUyk7IH0KICAgdm9pZCBWaXNpdENoaWxkcmVuKFN0bXQgKlMpOwpAQCAtNjIsNyArNjQsNyBAQAogCiAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBFTG9jID0KICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUJlZ2luKEUsIEJSLmdldFNvdXJjZU1hbmFnZXIoKSwgQUMpOwotICAgIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLAorICAgIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLCBDaGVja2VyLAogICAgICAgICAgICAgICAgICAgICAgICAiUG90ZW50aWFsIHVuaW50ZW5kZWQgdXNlIG9mIHNpemVvZigpIG9uIHBvaW50ZXIgdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3JpZXM6OkxvZ2ljRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgY29kZSBjYWxscyBzaXplb2YoKSBvbiBhIHBvaW50ZXIgdHlwZS4gIgpAQCAtODAsNyArODIsNyBAQAogcHVibGljOgogICB2b2lkIGNoZWNrQVNUQ29kZUJvZHkoY29uc3QgRGVjbCAqRCwgQW5hbHlzaXNNYW5hZ2VyJiBtZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlciAmQlIpIGNvbnN0IHsKLSAgICBXYWxrQVNUIHdhbGtlcihCUiwgbWdyLmdldEFuYWx5c2lzRGVjbENvbnRleHQoRCkpOworICAgIFdhbGtBU1Qgd2Fsa2VyKEJSLCB0aGlzLCBtZ3IuZ2V0QW5hbHlzaXNEZWNsQ29udGV4dChEKSk7CiAgICAgd2Fsa2VyLlZpc2l0KEQtPmdldEJvZHkoKSk7CiAgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2hlY2tlcnMudGQgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2hlY2tlcnMudGQKaW5kZXggODYyMjEyZC4uYTQ1N2I0NCAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0NoZWNrZXJzLnRkCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DaGVja2Vycy50ZApAQCAtMTIwLDYgKzEyMCwxMCBAQAogICBIZWxwVGV4dDwiV2FybiBhYm91dCB1bmludGVuZGVkIHVzZSBvZiBzaXplb2YoKSBvbiBwb2ludGVyIGV4cHJlc3Npb25zIj4sCiAgIERlc2NGaWxlPCJDaGVja1NpemVvZlBvaW50ZXIuY3BwIj47CiAKK2RlZiBDYWxsQW5kTWVzc2FnZVVuSW5pdFJlZkFyZyA6IENoZWNrZXI8IkNhbGxBbmRNZXNzYWdlVW5Jbml0UmVmQXJnIj4sCisgIEhlbHBUZXh0PCJDaGVjayBmb3IgbG9naWNhbCBlcnJvcnMgZm9yIGZ1bmN0aW9uIGNhbGxzIGFuZCBPYmplY3RpdmUtQyBtZXNzYWdlIGV4cHJlc3Npb25zIChlLmcuLCB1bmluaXRpYWxpemVkIGFyZ3VtZW50cywgbnVsbCBmdW5jdGlvbiBwb2ludGVycywgYW5kIHBvaW50ZXIgdG8gdW5kZWZpbmVkIHZhcmlhYmxlcykiPiwKKyAgRGVzY0ZpbGU8IkNhbGxBbmRNZXNzYWdlQ2hlY2tlci5jcHAiPjsKKwogfSAvLyBlbmQgImFscGhhLmNvcmUiCiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCkBAIC0yMDMsMTAgKzIwNyw2IEBACiAKIGxldCBQYXJlbnRQYWNrYWdlID0gRGVhZENvZGVBbHBoYSBpbiB7CiAKLWRlZiBJZGVtcG90ZW50T3BlcmF0aW9uQ2hlY2tlciA6IENoZWNrZXI8IklkZW1wb3RlbnRPcGVyYXRpb25zIj4sCi0gIEhlbHBUZXh0PCJXYXJuIGFib3V0IGlkZW1wb3RlbnQgb3BlcmF0aW9ucyI+LAotICBEZXNjRmlsZTwiSWRlbXBvdGVudE9wZXJhdGlvbkNoZWNrZXIuY3BwIj47Ci0KIGRlZiBVbnJlYWNoYWJsZUNvZGVDaGVja2VyIDogQ2hlY2tlcjwiVW5yZWFjaGFibGVDb2RlIj4sCiAgIEhlbHBUZXh0PCJDaGVjayB1bnJlYWNoYWJsZSBjb2RlIj4sCiAgIERlc2NGaWxlPCJVbnJlYWNoYWJsZUNvZGVDaGVja2VyLmNwcCI+OwpAQCAtNDE2LDYgKzQxNiwxMCBAQAogICBIZWxwVGV4dDwiTW9kZWwgdGhlIEFQSXMgdGhhdCBhcmUgZ3VhcmFudGVlZCB0byByZXR1cm4gYSBub24tbmlsIHZhbHVlIj4sCiAgIERlc2NGaWxlPCJCYXNpY09iakNGb3VuZGF0aW9uQ2hlY2tzLmNwcCI+OwogCitkZWYgT2JqQ1N1cGVyQ2FsbENoZWNrZXIgOiBDaGVja2VyPCJNaXNzaW5nU3VwZXJDYWxsIj4sCisgIEhlbHBUZXh0PCJXYXJuIGFib3V0IE9iamVjdGl2ZS1DIG1ldGhvZHMgdGhhdCBsYWNrIGEgbmVjZXNzYXJ5IGNhbGwgdG8gc3VwZXIiPiwKKyAgRGVzY0ZpbGU8Ik9iakNNaXNzaW5nU3VwZXJDYWxsQ2hlY2tlci5jcHAiPjsKKwogZGVmIE5TRXJyb3JDaGVja2VyIDogQ2hlY2tlcjwiTlNFcnJvciI+LAogICBIZWxwVGV4dDwiQ2hlY2sgdXNhZ2Ugb2YgTlNFcnJvcioqIHBhcmFtZXRlcnMiPiwKICAgRGVzY0ZpbGU8Ik5TRXJyb3JDaGVja2VyLmNwcCI+OwpAQCAtNDQ4LDEwICs0NTIsNiBAQAogICBIZWxwVGV4dDwiQ2hlY2sgZm9yIGRpcmVjdCBhc3NpZ25tZW50cyB0byBpbnN0YW5jZSB2YXJpYWJsZXMgaW4gdGhlIG1ldGhvZHMgYW5ub3RhdGVkIHdpdGggb2JqY19ub19kaXJlY3RfaW5zdGFuY2VfdmFyaWFibGVfYXNzaWdubWVudCI+LAogICBEZXNjRmlsZTwiRGlyZWN0SXZhckFzc2lnbm1lbnQuY3BwIj47CiAKLWRlZiBPYmpDU3VwZXJDYWxsQ2hlY2tlciA6IENoZWNrZXI8Ik1pc3NpbmdTdXBlckNhbGwiPiwKLSAgSGVscFRleHQ8Ildhcm4gYWJvdXQgT2JqZWN0aXZlLUMgbWV0aG9kcyB0aGF0IGxhY2sgYSBuZWNlc3NhcnkgY2FsbCB0byBzdXBlciI+LAotICBEZXNjRmlsZTwiT2JqQ01pc3NpbmdTdXBlckNhbGxDaGVja2VyLmNwcCI+OwotCiB9IC8vIGVuZCAiYWxwaGEub3N4LmNvY29hIgogCiBsZXQgUGFyZW50UGFja2FnZSA9IENvcmVGb3VuZGF0aW9uIGluIHsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DaHJvb3RDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DaHJvb3RDaGVja2VyLmNwcAppbmRleCA5OTEyOTY1Li42MjhjZjJjIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQ2hyb290Q2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0Nocm9vdENoZWNrZXIuY3BwCkBAIC00MSw3ICs0MSw3IEBACiBjbGFzcyBDaHJvb3RDaGVja2VyIDogcHVibGljIENoZWNrZXI8ZXZhbDo6Q2FsbCwgY2hlY2s6OlByZVN0bXQ8Q2FsbEV4cHI+ID4gewogICBtdXRhYmxlIElkZW50aWZpZXJJbmZvICpJSV9jaHJvb3QsICpJSV9jaGRpcjsKICAgLy8gVGhpcyBidWcgcmVmZXJzIHRvIHBvc3NpYmx5IGJyZWFrIG91dCBvZiBhIGNocm9vdCgpIGphaWwuCi0gIG11dGFibGUgT3duaW5nUHRyPEJ1aWx0aW5CdWc+IEJUX0JyZWFrSmFpbDsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVpbHRpbkJ1Zz4gQlRfQnJlYWtKYWlsOwogCiBwdWJsaWM6CiAgIENocm9vdENoZWNrZXIoKSA6IElJX2Nocm9vdCgwKSwgSUlfY2hkaXIoMCkge30KQEAgLTE0Miw5ICsxNDIsOSBAQAogICAgIGlmIChpc1Jvb3RDaGFuZ2VkKChpbnRwdHJfdCkgKmspKQogICAgICAgaWYgKEV4cGxvZGVkTm9kZSAqTiA9IEMuYWRkVHJhbnNpdGlvbigpKSB7CiAgICAgICAgIGlmICghQlRfQnJlYWtKYWlsKQotICAgICAgICAgIEJUX0JyZWFrSmFpbC5yZXNldChuZXcgQnVpbHRpbkJ1ZygiQnJlYWsgb3V0IG9mIGphaWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjYWxsIG9mIGNoZGlyKFwiL1wiKSBpbW1lZGlhdGVseSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyIGNocm9vdCIpKTsKKyAgICAgICAgICBCVF9CcmVha0phaWwucmVzZXQobmV3IEJ1aWx0aW5CdWcoCisgICAgICAgICAgICAgIHRoaXMsICJCcmVhayBvdXQgb2YgamFpbCIsICJObyBjYWxsIG9mIGNoZGlyKFwiL1wiKSBpbW1lZGlhdGVseSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlciBjaHJvb3QiKSk7CiAgICAgICAgIEJ1Z1JlcG9ydCAqUiA9IG5ldyBCdWdSZXBvcnQoKkJUX0JyZWFrSmFpbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfQnJlYWtKYWlsLT5nZXREZXNjcmlwdGlvbigpLCBOKTsKICAgICAgICAgQy5lbWl0UmVwb3J0KFIpOwpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0RlYWRTdG9yZXNDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9EZWFkU3RvcmVzQ2hlY2tlci5jcHAKaW5kZXggOWQ4NTVjZS4uNjAwMWEzYyAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0RlYWRTdG9yZXNDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvRGVhZFN0b3Jlc0NoZWNrZXIuY3BwCkBAIC0xMjQsMjEgKzEyNCwyMyBAQAogICBjb25zdCBDRkcgJmNmZzsKICAgQVNUQ29udGV4dCAmQ3R4OwogICBCdWdSZXBvcnRlciYgQlI7CisgIGNvbnN0IENoZWNrZXJCYXNlICpDaGVja2VyOwogICBBbmFseXNpc0RlY2xDb250ZXh0KiBBQzsKICAgUGFyZW50TWFwJiBQYXJlbnRzOwogICBsbHZtOjpTbWFsbFB0clNldDxjb25zdCBWYXJEZWNsKiwgMjA+IEVzY2FwZWQ7Ci0gIE93bmluZ1B0cjxSZWFjaGFibGVDb2RlPiByZWFjaGFibGVDb2RlOworICBzdGQ6OnVuaXF1ZV9wdHI8UmVhY2hhYmxlQ29kZT4gcmVhY2hhYmxlQ29kZTsKICAgY29uc3QgQ0ZHQmxvY2sgKmN1cnJlbnRCbG9jazsKLSAgT3duaW5nUHRyPGxsdm06OkRlbnNlU2V0PGNvbnN0IFZhckRlY2wgKj4gPiBJbkVIOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6RGVuc2VTZXQ8Y29uc3QgVmFyRGVjbCAqPj4gSW5FSDsKIAogICBlbnVtIERlYWRTdG9yZUtpbmQgeyBTdGFuZGFyZCwgRW5jbG9zaW5nLCBEZWFkSW5jcmVtZW50LCBEZWFkSW5pdCB9OwogCiBwdWJsaWM6Ci0gIERlYWRTdG9yZU9icyhjb25zdCBDRkcgJmNmZywgQVNUQ29udGV4dCAmY3R4LAotICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXImIGJyLCBBbmFseXNpc0RlY2xDb250ZXh0KiBhYywgUGFyZW50TWFwJiBwYXJlbnRzLAotICAgICAgICAgICAgICAgbGx2bTo6U21hbGxQdHJTZXQ8Y29uc3QgVmFyRGVjbCosIDIwPiAmZXNjYXBlZCkKLSAgICA6IGNmZyhjZmcpLCBDdHgoY3R4KSwgQlIoYnIpLCBBQyhhYyksIFBhcmVudHMocGFyZW50cyksCi0gICAgICBFc2NhcGVkKGVzY2FwZWQpLCBjdXJyZW50QmxvY2soMCkge30KKyAgRGVhZFN0b3JlT2JzKGNvbnN0IENGRyAmY2ZnLCBBU1RDb250ZXh0ICZjdHgsIEJ1Z1JlcG9ydGVyICZiciwKKyAgICAgICAgICAgICAgIGNvbnN0IENoZWNrZXJCYXNlICpjaGVja2VyLCBBbmFseXNpc0RlY2xDb250ZXh0ICphYywKKyAgICAgICAgICAgICAgIFBhcmVudE1hcCAmcGFyZW50cywKKyAgICAgICAgICAgICAgIGxsdm06OlNtYWxsUHRyU2V0PGNvbnN0IFZhckRlY2wgKiwgMjA+ICZlc2NhcGVkKQorICAgICAgOiBjZmcoY2ZnKSwgQ3R4KGN0eCksIEJSKGJyKSwgQ2hlY2tlcihjaGVja2VyKSwgQUMoYWMpLCBQYXJlbnRzKHBhcmVudHMpLAorICAgICAgICBFc2NhcGVkKGVzY2FwZWQpLCBjdXJyZW50QmxvY2soMCkge30KIAogICB2aXJ0dWFsIH5EZWFkU3RvcmVPYnMoKSB7fQogCkBAIC0xOTksNyArMjAxLDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLCBCdWdUeXBlLCAiRGVhZCBzdG9yZSIsIG9zLnN0cigpLCBMLCBSKTsKKyAgICBCUi5FbWl0QmFzaWNSZXBvcnQoQUMtPmdldERlY2woKSwgQ2hlY2tlciwgQnVnVHlwZSwgIkRlYWQgc3RvcmUiLCBvcy5zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgTCwgUik7CiAgIH0KIAogICB2b2lkIENoZWNrVmFyRGVjbChjb25zdCBWYXJEZWNsICpWRCwgY29uc3QgRXhwciAqRXgsIGNvbnN0IEV4cHIgKlZhbCwKQEAgLTIxNCw3ICsyMTcsOCBAQAogICAgICAgcmV0dXJuOwogCiAgICAgaWYgKCFpc0xpdmUoTGl2ZSwgVkQpICYmCi0gICAgICAgICEoVkQtPmdldEF0dHI8VW51c2VkQXR0cj4oKSB8fCBWRC0+Z2V0QXR0cjxCbG9ja3NBdHRyPigpKSkgeworICAgICAgICAhKFZELT5oYXNBdHRyPFVudXNlZEF0dHI+KCkgfHwgVkQtPmhhc0F0dHI8QmxvY2tzQXR0cj4oKSB8fAorICAgICAgICAgIFZELT5oYXNBdHRyPE9iakNQcmVjaXNlTGlmZXRpbWVBdHRyPigpKSkgewogCiAgICAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIEV4TG9jID0KICAgICAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlQmVnaW4oRXgsIEJSLmdldFNvdXJjZU1hbmFnZXIoKSwgQUMpOwpAQCAtMjUxLDggKzI1NSw4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIG9ic2VydmVTdG10KGNvbnN0IFN0bXQgKlMsIGNvbnN0IENGR0Jsb2NrICpibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExpdmVWYXJpYWJsZXM6OkxpdmVuZXNzVmFsdWVzICZMaXZlKSB7CisgIHZvaWQgb2JzZXJ2ZVN0bXQoY29uc3QgU3RtdCAqUywgY29uc3QgQ0ZHQmxvY2sgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IExpdmVWYXJpYWJsZXM6OkxpdmVuZXNzVmFsdWVzICZMaXZlKSBvdmVycmlkZSB7CiAKICAgICBjdXJyZW50QmxvY2sgPSBibG9jazsKICAgICAKQEAgLTMwOSwxMCArMzEzLDggQEAKICAgICBlbHNlIGlmIChjb25zdCBEZWNsU3RtdCAqRFMgPSBkeW5fY2FzdDxEZWNsU3RtdD4oUykpCiAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGRlY2xzLiAgV2FybiBpZiBhbnkgaW5pdGlhbGl6ZXJzIGFyZSBjb21wbGV4CiAgICAgICAvLyBleHByZXNzaW9ucyB0aGF0IGFyZSBub3QgbGl2ZSAobmV2ZXIgdXNlZCkuCi0gICAgICBmb3IgKERlY2xTdG10Ojpjb25zdF9kZWNsX2l0ZXJhdG9yIERJPURTLT5kZWNsX2JlZ2luKCksIERFPURTLT5kZWNsX2VuZCgpOwotICAgICAgICAgICBESSAhPSBERTsgKytESSkgewotCi0gICAgICAgIFZhckRlY2wgKlYgPSBkeW5fY2FzdDxWYXJEZWNsPigqREkpOworICAgICAgZm9yIChjb25zdCBhdXRvICpESSA6IERTLT5kZWNscygpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gKlYgPSBkeW5fY2FzdDxWYXJEZWNsPihESSk7CiAKICAgICAgICAgaWYgKCFWKQogICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMzM5LDggKzM0MSwxMCBAQAogICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBBIGRlYWQgaW5pdGlhbGl6YXRpb24gaXMgYSB2YXJpYWJsZSB0aGF0IGlzIGRlYWQgYWZ0ZXIgaXQKICAgICAgICAgICAgIC8vIGlzIGluaXRpYWxpemVkLiAgV2UgZG9uJ3QgZmxhZyB3YXJuaW5ncyBmb3IgdGhvc2UgdmFyaWFibGVzCi0gICAgICAgICAgICAvLyBtYXJrZWQgJ3VudXNlZCcuCi0gICAgICAgICAgICBpZiAoIWlzTGl2ZShMaXZlLCBWKSAmJiBWLT5nZXRBdHRyPFVudXNlZEF0dHI+KCkgPT0gMCkgeworICAgICAgICAgICAgLy8gbWFya2VkICd1bnVzZWQnIG9yICdvYmpjX3ByZWNpc2VfbGlmZXRpbWUnLgorICAgICAgICAgICAgaWYgKCFpc0xpdmUoTGl2ZSwgVikgJiYKKyAgICAgICAgICAgICAgICAhVi0+aGFzQXR0cjxVbnVzZWRBdHRyPigpICYmCisgICAgICAgICAgICAgICAgIVYtPmhhc0F0dHI8T2JqQ1ByZWNpc2VMaWZldGltZUF0dHI+KCkpIHsKICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlOiBjaGVjayBmb3IgaW5pdGlhbGl6YXRpb25zIHdpdGggY29uc3RhbnRzLgogICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAvLyAgZS5nLiA6IGludCB4ID0gMDsKQEAgLTQzNiw3ICs0NDAsNyBAQAogICAgICAgUGFyZW50TWFwICZwbWFwID0gbWdyLmdldFBhcmVudE1hcChEKTsKICAgICAgIEZpbmRFc2NhcGVkIEZTOwogICAgICAgY2ZnLlZpc2l0QmxvY2tTdG10cyhGUyk7Ci0gICAgICBEZWFkU3RvcmVPYnMgQShjZmcsIEJSLmdldENvbnRleHQoKSwgQlIsIEFDLCBwbWFwLCBGUy5Fc2NhcGVkKTsKKyAgICAgIERlYWRTdG9yZU9icyBBKGNmZywgQlIuZ2V0Q29udGV4dCgpLCBCUiwgdGhpcywgQUMsIHBtYXAsIEZTLkVzY2FwZWQpOwogICAgICAgTC0+cnVuT25BbGxCbG9ja3MoQSk7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvRGVidWdDaGVja2Vycy5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvRGVidWdDaGVja2Vycy5jcHAKaW5kZXggYTJjOGQxZi4uNTFlN2EzZCAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0RlYnVnQ2hlY2tlcnMuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9EZWJ1Z0NoZWNrZXJzLmNwcApAQCAtOTUsNiArOTUsMTEgQEAKIHB1YmxpYzoKICAgdm9pZCBjaGVja0FTVENvZGVCb2R5KGNvbnN0IERlY2wgKkQsIEFuYWx5c2lzTWFuYWdlciYgbWdyLAogICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXIgJkJSKSBjb25zdCB7CisgICAgUHJpbnRpbmdQb2xpY3kgUG9saWN5KG1nci5nZXRMYW5nT3B0cygpKTsKKyAgICBQb2xpY3kuVGVyc2VPdXRwdXQgPSB0cnVlOworICAgIFBvbGljeS5Qb2xpc2hGb3JEZWNsYXJhdGlvbiA9IHRydWU7CisgICAgRC0+cHJpbnQobGx2bTo6ZXJycygpLCBQb2xpY3kpOworCiAgICAgaWYgKENGRyAqY2ZnID0gbWdyLmdldENGRyhEKSkgewogICAgICAgY2ZnLT5kdW1wKG1nci5nZXRMYW5nT3B0cygpLAogICAgICAgICAgICAgICAgIGxsdm06OnN5czo6UHJvY2Vzczo6U3RhbmRhcmRFcnJIYXNDb2xvcnMoKSk7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvRGVyZWZlcmVuY2VDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9EZXJlZmVyZW5jZUNoZWNrZXIuY3BwCmluZGV4IDcyZDQ2YzUuLmVmZGMyMTMgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9EZXJlZmVyZW5jZUNoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9EZXJlZmVyZW5jZUNoZWNrZXIuY3BwCkBAIC0yOSw4ICsyOSw4IEBACiAgICAgOiBwdWJsaWMgQ2hlY2tlcjwgY2hlY2s6OkxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIGNoZWNrOjpCaW5kLAogICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RGlzcGF0Y2hlcjxJbXBsaWNpdE51bGxEZXJlZkV2ZW50PiA+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVpbHRpbkJ1Zz4gQlRfbnVsbDsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVpbHRpbkJ1Zz4gQlRfdW5kZWY7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1aWx0aW5CdWc+IEJUX251bGw7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1aWx0aW5CdWc+IEJUX3VuZGVmOwogCiAgIHZvaWQgcmVwb3J0QnVnKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgY29uc3QgU3RtdCAqUywgQ2hlY2tlckNvbnRleHQgJkMsCiAgICAgICAgICAgICAgICAgIGJvb2wgSXNCaW5kID0gZmFsc2UpIGNvbnN0OwpAQCAtOTcsNyArOTcsNyBAQAogICAvLyBXZSBrbm93IHRoYXQgJ2xvY2F0aW9uJyBjYW5ub3QgYmUgbm9uLW51bGwuICBUaGlzIGlzIHdoYXQKICAgLy8gd2UgY2FsbCBhbiAiZXhwbGljaXQiIG51bGwgZGVyZWZlcmVuY2UuCiAgIGlmICghQlRfbnVsbCkKLSAgICBCVF9udWxsLnJlc2V0KG5ldyBCdWlsdGluQnVnKCJEZXJlZmVyZW5jZSBvZiBudWxsIHBvaW50ZXIiKSk7CisgICAgQlRfbnVsbC5yZXNldChuZXcgQnVpbHRpbkJ1Zyh0aGlzLCAiRGVyZWZlcmVuY2Ugb2YgbnVsbCBwb2ludGVyIikpOwogCiAgIFNtYWxsU3RyaW5nPDEwMD4gYnVmOwogICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zKGJ1Zik7CkBAIC0xODAsNyArMTgwLDggQEAKICAgaWYgKGwuaXNVbmRlZigpKSB7CiAgICAgaWYgKEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKCkpIHsKICAgICAgIGlmICghQlRfdW5kZWYpCi0gICAgICAgIEJUX3VuZGVmLnJlc2V0KG5ldyBCdWlsdGluQnVnKCJEZXJlZmVyZW5jZSBvZiB1bmRlZmluZWQgcG9pbnRlciB2YWx1ZSIpKTsKKyAgICAgICAgQlRfdW5kZWYucmVzZXQoCisgICAgICAgICAgICBuZXcgQnVpbHRpbkJ1Zyh0aGlzLCAiRGVyZWZlcmVuY2Ugb2YgdW5kZWZpbmVkIHBvaW50ZXIgdmFsdWUiKSk7CiAKICAgICAgIEJ1Z1JlcG9ydCAqcmVwb3J0ID0KICAgICAgICAgbmV3IEJ1Z1JlcG9ydCgqQlRfdW5kZWYsIEJUX3VuZGVmLT5nZXREZXNjcmlwdGlvbigpLCBOKTsKQEAgLTIwMCw3ICsyMDEsNyBAQAogICBQcm9ncmFtU3RhdGVSZWYgc3RhdGUgPSBDLmdldFN0YXRlKCk7CiAKICAgUHJvZ3JhbVN0YXRlUmVmIG5vdE51bGxTdGF0ZSwgbnVsbFN0YXRlOwotICBsbHZtOjp0aWUobm90TnVsbFN0YXRlLCBudWxsU3RhdGUpID0gc3RhdGUtPmFzc3VtZShsb2NhdGlvbik7CisgIHN0ZDo6dGllKG5vdE51bGxTdGF0ZSwgbnVsbFN0YXRlKSA9IHN0YXRlLT5hc3N1bWUobG9jYXRpb24pOwogCiAgIC8vIFRoZSBleHBsaWNpdCBOVUxMIGNhc2UuCiAgIGlmIChudWxsU3RhdGUpIHsKQEAgLTIzOSw4ICsyNDAsNyBAQAogICBQcm9ncmFtU3RhdGVSZWYgU3RhdGUgPSBDLmdldFN0YXRlKCk7CiAKICAgUHJvZ3JhbVN0YXRlUmVmIFN0Tm9uTnVsbCwgU3ROdWxsOwotICBsbHZtOjp0aWUoU3ROb25OdWxsLCBTdE51bGwpID0KLSAgICAgIFN0YXRlLT5hc3N1bWUoVi5jYXN0QXM8RGVmaW5lZE9yVW5rbm93blNWYWw+KCkpOworICBzdGQ6OnRpZShTdE5vbk51bGwsIFN0TnVsbCkgPSBTdGF0ZS0+YXNzdW1lKFYuY2FzdEFzPERlZmluZWRPclVua25vd25TVmFsPigpKTsKIAogICBpZiAoU3ROdWxsKSB7CiAgICAgaWYgKCFTdE5vbk51bGwpIHsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9EaXJlY3RJdmFyQXNzaWdubWVudC5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvRGlyZWN0SXZhckFzc2lnbm1lbnQuY3BwCmluZGV4IGI0M2RjMTguLjBiY2ViZjYgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9EaXJlY3RJdmFyQXNzaWdubWVudC5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0RpcmVjdEl2YXJBc3NpZ25tZW50LmNwcApAQCAtNjMsMTMgKzYzLDE1IEBACiAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1EOwogICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJbnRlcmZEOwogICAgIEJ1Z1JlcG9ydGVyICZCUjsKKyAgICBjb25zdCBDaGVja2VyQmFzZSAqQ2hlY2tlcjsKICAgICBMb2NhdGlvbk9yQW5hbHlzaXNEZWNsQ29udGV4dCBEQ3R4OwogCiAgIHB1YmxpYzoKICAgICBNZXRob2RDcmF3bGVyKGNvbnN0IEl2YXJUb1Byb3BlcnR5TWFwVHkgJkluTWFwLCBjb25zdCBPYmpDTWV0aG9kRGVjbCAqSW5NRCwKLSAgICAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKkluSUQsCi0gICAgICAgIEJ1Z1JlcG9ydGVyICZJbkJSLCBBbmFseXNpc0RlY2xDb250ZXh0ICpJbkRDdHgpCi0gICAgOiBJdmFyVG9Qcm9wTWFwKEluTWFwKSwgTUQoSW5NRCksIEludGVyZkQoSW5JRCksIEJSKEluQlIpLCBEQ3R4KEluREN0eCkge30KKyAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJbklELCBCdWdSZXBvcnRlciAmSW5CUiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENoZWNrZXJCYXNlICpDaGVja2VyLCBBbmFseXNpc0RlY2xDb250ZXh0ICpJbkRDdHgpCisgICAgICAgIDogSXZhclRvUHJvcE1hcChJbk1hcCksIE1EKEluTUQpLCBJbnRlcmZEKEluSUQpLCBCUihJbkJSKSwKKyAgICAgICAgICBDaGVja2VyKENoZWNrZXIpLCBEQ3R4KEluREN0eCkge30KIAogICAgIHZvaWQgVmlzaXRTdG10KGNvbnN0IFN0bXQgKlMpIHsgVmlzaXRDaGlsZHJlbihTKTsgfQogCkBAIC0xMjIsMTAgKzEyNCw3IEBACiAgIEl2YXJUb1Byb3BlcnR5TWFwVHkgSXZhclRvUHJvcE1hcDsKIAogICAvLyBGaW5kIGFsbCBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzLgotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjpwcm9wX2l0ZXJhdG9yIEkgPSBJbnRlckQtPnByb3BfYmVnaW4oKSwKLSAgICAgIEUgPSBJbnRlckQtPnByb3BfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgT2JqQ1Byb3BlcnR5RGVjbCAqUEQgPSAqSTsKLQorICBmb3IgKGNvbnN0IGF1dG8gKlBEIDogSW50ZXJELT5wcm9wZXJ0aWVzKCkpIHsKICAgICAvLyBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIElWYXIuCiAgICAgY29uc3QgT2JqQ0l2YXJEZWNsICpJRCA9IGZpbmRQcm9wZXJ0eUJhY2tpbmdJdmFyKFBELCBJbnRlckQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1nci5nZXRBU1RDb250ZXh0KCkpOwpAQCAtMTQwLDEwICsxMzksNyBAQAogICBpZiAoSXZhclRvUHJvcE1hcC5lbXB0eSgpKQogICAgIHJldHVybjsKIAotICBmb3IgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2w6Omluc3RtZXRoX2l0ZXJhdG9yIEkgPSBELT5pbnN0bWV0aF9iZWdpbigpLAotICAgICAgRSA9IEQtPmluc3RtZXRoX2VuZCgpOyBJICE9IEU7ICsrSSkgewotCi0gICAgT2JqQ01ldGhvZERlY2wgKk0gPSAqSTsKKyAgZm9yIChjb25zdCBhdXRvICpNIDogRC0+aW5zdGFuY2VfbWV0aG9kcygpKSB7CiAgICAgQW5hbHlzaXNEZWNsQ29udGV4dCAqREN0eCA9IE1nci5nZXRBbmFseXNpc0RlY2xDb250ZXh0KE0pOwogCiAgICAgaWYgKCgqU2hvdWxkU2tpcE1ldGhvZCkoTSkpCkBAIC0xNTIsMjAgKzE0OCwxNyBAQAogICAgIGNvbnN0IFN0bXQgKkJvZHkgPSBNLT5nZXRCb2R5KCk7CiAgICAgYXNzZXJ0KEJvZHkpOwogCi0gICAgTWV0aG9kQ3Jhd2xlciBNQyhJdmFyVG9Qcm9wTWFwLCBNLT5nZXRDYW5vbmljYWxEZWNsKCksIEludGVyRCwgQlIsIERDdHgpOworICAgIE1ldGhvZENyYXdsZXIgTUMoSXZhclRvUHJvcE1hcCwgTS0+Z2V0Q2Fub25pY2FsRGVjbCgpLCBJbnRlckQsIEJSLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgREN0eCk7CiAgICAgTUMuVmlzaXRTdG10KEJvZHkpOwogICB9CiB9CiAKIHN0YXRpYyBib29sIGlzQW5ub3RhdGVkVG9BbGxvd0RpcmVjdEFzc2lnbm1lbnQoY29uc3QgRGVjbCAqRCkgewotICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8QW5ub3RhdGVBdHRyPgotICAgICAgIEFJID0gRC0+c3BlY2lmaWNfYXR0cl9iZWdpbjxBbm5vdGF0ZUF0dHI+KCksCi0gICAgICAgQUUgPSBELT5zcGVjaWZpY19hdHRyX2VuZDxBbm5vdGF0ZUF0dHI+KCk7IEFJICE9IEFFOyArK0FJKSB7Ci0gICAgY29uc3QgQW5ub3RhdGVBdHRyICpBbm4gPSAqQUk7CisgIGZvciAoY29uc3QgYXV0byAqQW5uIDogRC0+c3BlY2lmaWNfYXR0cnM8QW5ub3RhdGVBdHRyPigpKQogICAgIGlmIChBbm4tPmdldEFubm90YXRpb24oKSA9PQogICAgICAgICAib2JqY19hbGxvd19kaXJlY3RfaW5zdGFuY2VfdmFyaWFibGVfYXNzaWdubWVudCIpCiAgICAgICByZXR1cm4gdHJ1ZTsKLSAgfQogICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTIwNCwxMyArMTk3LDExIEBACiAgICAgICBpZiAoR2V0dGVyTWV0aG9kICYmIEdldHRlck1ldGhvZC0+Z2V0Q2Fub25pY2FsRGVjbCgpID09IE1EKQogICAgICAgICByZXR1cm47CiAKLSAgICAgIEJSLkVtaXRCYXNpY1JlcG9ydChNRCwKLSAgICAgICAgICAiUHJvcGVydHkgYWNjZXNzIiwKLSAgICAgICAgICBjYXRlZ29yaWVzOjpDb3JlRm91bmRhdGlvbk9iamVjdGl2ZUMsCisgICAgICBCUi5FbWl0QmFzaWNSZXBvcnQoCisgICAgICAgICAgTUQsIENoZWNrZXIsICJQcm9wZXJ0eSBhY2Nlc3MiLCBjYXRlZ29yaWVzOjpDb3JlRm91bmRhdGlvbk9iamVjdGl2ZUMsCiAgICAgICAgICAgIkRpcmVjdCBhc3NpZ25tZW50IHRvIGFuIGluc3RhbmNlIHZhcmlhYmxlIGJhY2tpbmcgYSBwcm9wZXJ0eTsgIgotICAgICAgICAgICJ1c2UgdGhlIHNldHRlciBpbnN0ZWFkIiwgUGF0aERpYWdub3N0aWNMb2NhdGlvbihJdmFyUmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSLmdldFNvdXJjZU1hbmFnZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ3R4KSk7CisgICAgICAgICAgInVzZSB0aGUgc2V0dGVyIGluc3RlYWQiLAorICAgICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24oSXZhclJlZiwgQlIuZ2V0U291cmNlTWFuYWdlcigpLCBEQ3R4KSk7CiAgICAgfQogICB9CiB9CkBAIC0yMjUsMTQgKzIxNiw5IEBACiAvLyBSZWdpc3RlciB0aGUgY2hlY2tlciB0aGF0IGNoZWNrcyBmb3IgZGlyZWN0IGFjY2Vzc2VzIGluIGZ1bmN0aW9ucyBhbm5vdGF0ZWQKIC8vIHdpdGggX19hdHRyaWJ1dGVfXygoYW5ub3RhdGUoIm9iamNfbm9fZGlyZWN0X2luc3RhbmNlX3ZhcmlhYmxlX2Fzc2lnbm1lbnQiKSkpLgogc3RhdGljIGJvb2wgQXR0ckZpbHRlcihjb25zdCBPYmpDTWV0aG9kRGVjbCAqTSkgewotICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8QW5ub3RhdGVBdHRyPgotICAgICAgICAgICBBSSA9IE0tPnNwZWNpZmljX2F0dHJfYmVnaW48QW5ub3RhdGVBdHRyPigpLAotICAgICAgICAgICBBRSA9IE0tPnNwZWNpZmljX2F0dHJfZW5kPEFubm90YXRlQXR0cj4oKTsKLSAgICAgICBBSSAhPSBBRTsgKytBSSkgewotICAgIGNvbnN0IEFubm90YXRlQXR0ciAqQW5uID0gKkFJOworICBmb3IgKGNvbnN0IGF1dG8gKkFubiA6IE0tPnNwZWNpZmljX2F0dHJzPEFubm90YXRlQXR0cj4oKSkKICAgICBpZiAoQW5uLT5nZXRBbm5vdGF0aW9uKCkgPT0gIm9iamNfbm9fZGlyZWN0X2luc3RhbmNlX3ZhcmlhYmxlX2Fzc2lnbm1lbnQiKQogICAgICAgcmV0dXJuIGZhbHNlOwotICB9CiAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvRGl2WmVyb0NoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0Rpdlplcm9DaGVja2VyLmNwcAppbmRleCA5M2RhZjk0Li5lMDYwYzM2IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvRGl2WmVyb0NoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9EaXZaZXJvQ2hlY2tlci5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKIAogbmFtZXNwYWNlIHsKIGNsYXNzIERpdlplcm9DaGVja2VyIDogcHVibGljIENoZWNrZXI8IGNoZWNrOjpQcmVTdG10PEJpbmFyeU9wZXJhdG9yPiA+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVpbHRpbkJ1Zz4gQlQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1aWx0aW5CdWc+IEJUOwogICB2b2lkIHJlcG9ydEJ1Zyhjb25zdCBjaGFyICpNc2csCiAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZVplcm8sCiAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdCA7CkBAIC0zNyw3ICszNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0IHsKICAgaWYgKEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKFN0YXRlWmVybykpIHsKICAgICBpZiAoIUJUKQotICAgICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcoIkRpdmlzaW9uIGJ5IHplcm8iKSk7CisgICAgICBCVC5yZXNldChuZXcgQnVpbHRpbkJ1Zyh0aGlzLCAiRGl2aXNpb24gYnkgemVybyIpKTsKIAogICAgIEJ1Z1JlcG9ydCAqUiA9IG5ldyBCdWdSZXBvcnQoKkJULCBNc2csIE4pOwogICAgIGJ1Z3JlcG9ydGVyOjp0cmFja051bGxPclVuZGVmVmFsdWUoTiwgYnVncmVwb3J0ZXI6OkdldERlbm9tRXhwcihOKSwgKlIpOwpAQCAtNjgsNyArNjgsNyBAQAogICAvLyBDaGVjayBmb3IgZGl2aWRlIGJ5IHplcm8uCiAgIENvbnN0cmFpbnRNYW5hZ2VyICZDTSA9IEMuZ2V0Q29uc3RyYWludE1hbmFnZXIoKTsKICAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlTm90WmVybywgc3RhdGVaZXJvOwotICBsbHZtOjp0aWUoc3RhdGVOb3RaZXJvLCBzdGF0ZVplcm8pID0gQ00uYXNzdW1lRHVhbChDLmdldFN0YXRlKCksICpEVik7CisgIHN0ZDo6dGllKHN0YXRlTm90WmVybywgc3RhdGVaZXJvKSA9IENNLmFzc3VtZUR1YWwoQy5nZXRTdGF0ZSgpLCAqRFYpOwogCiAgIGlmICghc3RhdGVOb3RaZXJvKSB7CiAgICAgYXNzZXJ0KHN0YXRlWmVybyk7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvRXhwckluc3BlY3Rpb25DaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9FeHBySW5zcGVjdGlvbkNoZWNrZXIuY3BwCmluZGV4IDNlZDI0MzUuLjlhMGZhMDkgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9FeHBySW5zcGVjdGlvbkNoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9FeHBySW5zcGVjdGlvbkNoZWNrZXIuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiAKIG5hbWVzcGFjZSB7CiBjbGFzcyBFeHBySW5zcGVjdGlvbkNoZWNrZXIgOiBwdWJsaWMgQ2hlY2tlcjwgZXZhbDo6Q2FsbCA+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUOwogCiAgIHZvaWQgYW5hbHl6ZXJFdmFsKGNvbnN0IENhbGxFeHByICpDRSwgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwogICB2b2lkIGFuYWx5emVyQ2hlY2tJbmxpbmVkKGNvbnN0IENhbGxFeHByICpDRSwgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwpAQCAtNjgsNyArNjgsNyBAQAogICAgIHJldHVybiAiVU5ERUZJTkVEIjsKIAogICBQcm9ncmFtU3RhdGVSZWYgU3RUcnVlLCBTdEZhbHNlOwotICBsbHZtOjp0aWUoU3RUcnVlLCBTdEZhbHNlKSA9CisgIHN0ZDo6dGllKFN0VHJ1ZSwgU3RGYWxzZSkgPQogICAgIFN0YXRlLT5hc3N1bWUoQXNzZXJ0aW9uVmFsLmNhc3RBczxEZWZpbmVkT3JVbmtub3duU1ZhbD4oKSk7CiAKICAgaWYgKFN0VHJ1ZSkgewpAQCAtOTUsNyArOTUsNyBAQAogICAgIHJldHVybjsKIAogICBpZiAoIUJUKQotICAgIEJULnJlc2V0KG5ldyBCdWdUeXBlKCJDaGVja2luZyBhbmFseXplciBhc3N1bXB0aW9ucyIsICJkZWJ1ZyIpKTsKKyAgICBCVC5yZXNldChuZXcgQnVnVHlwZSh0aGlzLCAiQ2hlY2tpbmcgYW5hbHl6ZXIgYXNzdW1wdGlvbnMiLCAiZGVidWciKSk7CiAKICAgQnVnUmVwb3J0ICpSID0gbmV3IEJ1Z1JlcG9ydCgqQlQsIGdldEFyZ3VtZW50VmFsdWVTdHJpbmcoQ0UsIEMpLCBOKTsKICAgQy5lbWl0UmVwb3J0KFIpOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAgIEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2V0UHJlZGVjZXNzb3IoKTsKIAogICBpZiAoIUJUKQotICAgIEJULnJlc2V0KG5ldyBCdWdUeXBlKCJDaGVja2luZyBhbmFseXplciBhc3N1bXB0aW9ucyIsICJkZWJ1ZyIpKTsKKyAgICBCVC5yZXNldChuZXcgQnVnVHlwZSh0aGlzLCAiQ2hlY2tpbmcgYW5hbHl6ZXIgYXNzdW1wdGlvbnMiLCAiZGVidWciKSk7CiAKICAgQnVnUmVwb3J0ICpSID0gbmV3IEJ1Z1JlcG9ydCgqQlQsICJSRUFDSEFCTEUiLCBOKTsKICAgQy5lbWl0UmVwb3J0KFIpOwpAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgcmV0dXJuOwogCiAgIGlmICghQlQpCi0gICAgQlQucmVzZXQobmV3IEJ1Z1R5cGUoIkNoZWNraW5nIGFuYWx5emVyIGFzc3VtcHRpb25zIiwgImRlYnVnIikpOworICAgIEJULnJlc2V0KG5ldyBCdWdUeXBlKHRoaXMsICJDaGVja2luZyBhbmFseXplciBhc3N1bXB0aW9ucyIsICJkZWJ1ZyIpKTsKIAogICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVCwgZ2V0QXJndW1lbnRWYWx1ZVN0cmluZyhDRSwgQyksIE4pOwogICBDLmVtaXRSZXBvcnQoUik7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvRml4ZWRBZGRyZXNzQ2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvRml4ZWRBZGRyZXNzQ2hlY2tlci5jcHAKaW5kZXggMDg1YTk5MS4uNjBiYjAzNiAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0ZpeGVkQWRkcmVzc0NoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9GaXhlZEFkZHJlc3NDaGVja2VyLmNwcApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIHsKIGNsYXNzIEZpeGVkQWRkcmVzc0NoZWNrZXIgCiAgIDogcHVibGljIENoZWNrZXI8IGNoZWNrOjpQcmVTdG10PEJpbmFyeU9wZXJhdG9yPiA+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVpbHRpbkJ1Zz4gQlQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1aWx0aW5CdWc+IEJUOwogCiBwdWJsaWM6CiAgIHZvaWQgY2hlY2tQcmVTdG10KGNvbnN0IEJpbmFyeU9wZXJhdG9yICpCLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CkBAIC01MiwxMCArNTIsMTEgQEAKIAogICBpZiAoRXhwbG9kZWROb2RlICpOID0gQy5hZGRUcmFuc2l0aW9uKCkpIHsKICAgICBpZiAoIUJUKQotICAgICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcoIlVzZSBmaXhlZCBhZGRyZXNzIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJVc2luZyBhIGZpeGVkIGFkZHJlc3MgaXMgbm90IHBvcnRhYmxlIGJlY2F1c2UgdGhhdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRyZXNzIHdpbGwgcHJvYmFibHkgbm90IGJlIHZhbGlkIGluIGFsbCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJlbnZpcm9ubWVudHMgb3IgcGxhdGZvcm1zLiIpKTsKKyAgICAgIEJULnJlc2V0KAorICAgICAgICAgIG5ldyBCdWlsdGluQnVnKHRoaXMsICJVc2UgZml4ZWQgYWRkcmVzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlVzaW5nIGEgZml4ZWQgYWRkcmVzcyBpcyBub3QgcG9ydGFibGUgYmVjYXVzZSB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkcmVzcyB3aWxsIHByb2JhYmx5IG5vdCBiZSB2YWxpZCBpbiBhbGwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlbnZpcm9ubWVudHMgb3IgcGxhdGZvcm1zLiIpKTsKICAgICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVCwgQlQtPmdldERlc2NyaXB0aW9uKCksIE4pOwogICAgIFItPmFkZFJhbmdlKEItPmdldFJIUygpLT5nZXRTb3VyY2VSYW5nZSgpKTsKICAgICBDLmVtaXRSZXBvcnQoUik7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvR2VuZXJpY1RhaW50Q2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvR2VuZXJpY1RhaW50Q2hlY2tlci5jcHAKaW5kZXggMWRjNjBjNi4uOTNiYzEyYyAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0dlbmVyaWNUYWludENoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9HZW5lcmljVGFpbnRDaGVja2VyLmNwcApAQCAtMzQsNyArMzQsNiBAQAogICBzdGF0aWMgdm9pZCAqZ2V0VGFnKCkgeyBzdGF0aWMgaW50IFRhZzsgcmV0dXJuICZUYWc7IH0KIAogICB2b2lkIGNoZWNrUG9zdFN0bXQoY29uc3QgQ2FsbEV4cHIgKkNFLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7Ci0gIHZvaWQgY2hlY2tQb3N0U3RtdChjb25zdCBEZWNsUmVmRXhwciAqRFJFLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CiAKICAgdm9pZCBjaGVja1ByZVN0bXQoY29uc3QgQ2FsbEV4cHIgKkNFLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CiAKQEAgLTQzLDEwICs0MiwxMCBAQAogICAvLy8gRGVub3RlcyB0aGUgcmV0dXJuIHZhbGUuCiAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZXR1cm5WYWx1ZUluZGV4ID0gVUlOVF9NQVggLSAxOwogCi0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVDsKICAgaW5saW5lIHZvaWQgaW5pdEJ1Z1R5cGUoKSBjb25zdCB7CiAgICAgaWYgKCFCVCkKLSAgICAgIEJULnJlc2V0KG5ldyBCdWdUeXBlKCJVc2Ugb2YgVW50cnVzdGVkIERhdGEiLCAiVW50cnVzdGVkIERhdGEiKSk7CisgICAgICBCVC5yZXNldChuZXcgQnVnVHlwZSh0aGlzLCAiVXNlIG9mIFVudHJ1c3RlZCBEYXRhIiwgIlVudHJ1c3RlZCBEYXRhIikpOwogICB9CiAKICAgLy8vIFxicmllZiBDYXRjaCB0YWludCByZWxhdGVkIGJ1Z3MuIENoZWNrIGlmIHRhaW50ZWQgZGF0YSBpcyBwYXNzZWQgdG8gYQpAQCAtNjEzLDExICs2MTIsNyBAQAogICBjb25zdCBGdW5jdGlvbkRlY2wgKkZEZWNsID0gQy5nZXRDYWxsZWVEZWNsKENFKTsKICAgaWYgKCFGRGVjbCkKICAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxGb3JtYXRBdHRyPgotICAgICAgICAgaSA9IEZEZWNsLT5zcGVjaWZpY19hdHRyX2JlZ2luPEZvcm1hdEF0dHI+KCksCi0gICAgICAgICBlID0gRkRlY2wtPnNwZWNpZmljX2F0dHJfZW5kPEZvcm1hdEF0dHI+KCk7IGkgIT0gZSA7ICsraSkgewotCi0gICAgY29uc3QgRm9ybWF0QXR0ciAqRm9ybWF0ID0gKmk7CisgIGZvciAoY29uc3QgYXV0byAqRm9ybWF0IDogRkRlY2wtPnNwZWNpZmljX2F0dHJzPEZvcm1hdEF0dHI+KCkpIHsKICAgICBBcmdOdW0gPSBGb3JtYXQtPmdldEZvcm1hdElkeCgpIC0gMTsKICAgICBpZiAoKEZvcm1hdC0+Z2V0VHlwZSgpLT5nZXROYW1lKCkgPT0gInByaW50ZiIpICYmCiAgICAgICAgICBDRS0+Z2V0TnVtQXJncygpID4gQXJnTnVtKQpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0lkZW1wb3RlbnRPcGVyYXRpb25DaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9JZGVtcG90ZW50T3BlcmF0aW9uQ2hlY2tlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTdmOGQuLjAwMDAwMDAKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0lkZW1wb3RlbnRPcGVyYXRpb25DaGVja2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDczNyArMCwwIEBACi0vLz09LSBJZGVtcG90ZW50T3BlcmF0aW9uQ2hlY2tlci5jcHAgLSBJZGVtcG90ZW50IE9wZXJhdGlvbnMgLS0tLSotIEMrKyAtKi09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBzZXQgb2YgcGF0aC1zZW5zaXRpdmUgY2hlY2tzIGZvciBpZGVtcG90ZW50IGFuZC9vcgotLy8gdGF1dG9sb2dpY2FsIG9wZXJhdGlvbnMuIEVhY2ggcG90ZW50aWFsIG9wZXJhdGlvbiBpcyBjaGVja2VkIGFsb25nIGFsbCBwYXRocwotLy8gdG8gc2VlIGlmIGV2ZXJ5IHBhdGggcmVzdWx0cyBpbiBhIHBvaW50bGVzcyBvcGVyYXRpb24uCi0vLyAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0vLyAgICAgICAgICAgICAgICAgfFRhYmxlIG9mIGlkZW1wb3RlbnQvdGF1dG9sb2dpY2FsIG9wZXJhdGlvbnN8Ci0vLyAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0vLystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS8vfE9wZXJhdG9yIHwgeCBvcCB4IHwgeCBvcCAxIHwgMSBvcCB4IHwgeCBvcCAwIHwgMCBvcCB4IHwgeCBvcCB+MCB8IH4wIG9wIHggfAotLy8rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0vLyAgKywgKz0gICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgeCAgICB8ICAgeCAgICB8ICAgICAgICAgfAotLy8gIC0sIC09ICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgIHggICAgfCAgIC14ICAgfCAgICAgICAgIHwKLS8vICAqLCAqPSAgIHwgICAgICAgIHwgICB4ICAgIHwgICB4ICAgIHwgICAwICAgIHwgICAwICAgIHwgICAgICAgICB8Ci0vLyAgLywgLz0gICB8ICAgMSAgICB8ICAgeCAgICB8ICAgICAgICB8ICBOL0EgICB8ICAgMCAgICB8ICAgICAgICAgfAotLy8gICYsICY9ICAgfCAgIHggICAgfCAgICAgICAgfCAgICAgICAgfCAgIDAgICAgfCAgIDAgICAgfCAgIHggICAgIHwgICAgeAotLy8gIHwsIHw9ICAgfCAgIHggICAgfCAgICAgICAgfCAgICAgICAgfCAgIHggICAgfCAgIHggICAgfCAgIH4wICAgIHwgICAgfjAKLS8vICBeLCBePSAgIHwgICAwICAgIHwgICAgICAgIHwgICAgICAgIHwgICB4ICAgIHwgICB4ICAgIHwgICAgICAgICB8Ci0vLyAgPDwsIDw8PSB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgeCAgICB8ICAgMCAgICB8ICAgICAgICAgfAotLy8gID4+LCA+Pj0gfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgIHggICAgfCAgIDAgICAgfCAgICAgICAgIHwKLS8vICB8fCAgICAgIHwgICB4ICAgIHwgICAxICAgIHwgICAxICAgIHwgICB4ICAgIHwgICB4ICAgIHwgICAxICAgICB8ICAgIDEKLS8vICAmJiAgICAgIHwgICB4ICAgIHwgICB4ICAgIHwgICB4ICAgIHwgICAwICAgIHwgICAwICAgIHwgICB4ICAgICB8ICAgIHgKLS8vICA9ICAgICAgIHwgICB4ICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgICB8Ci0vLyAgPT0gICAgICB8ICAgMSAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICAgfAotLy8gID49ICAgICAgfCAgIDEgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgIHwKLS8vICA8PSAgICAgIHwgICAxICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgICB8Ci0vLyAgPiAgICAgICB8ICAgMCAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICB8ICAgICAgICAgfAotLy8gIDwgICAgICAgfCAgIDAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgfCAgICAgICAgIHwKLS8vICAhPSAgICAgIHwgICAwICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgIHwgICAgICAgICB8Ci0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwotLy8KLS8vIFRoaW5ncyBUT0RPOgotLy8gLSBJbXByb3ZlZCBlcnJvciBtZXNzYWdlcwotLy8gLSBIYW5kbGUgbWl4ZWQgYXNzdW1wdGlvbnMgKHdoaWNoIGFzc3VtcHRpb25zIGNhbiBiZWxvbmcgdG9nZXRoZXI/KQotLy8gLSBGaW5lciBncmFpbmVkIGZhbHNlIHBvc2l0aXZlIGNvbnRyb2wgKGxldmVscykKLS8vIC0gSGFuZGxpbmcgfjAgdmFsdWVzCi0KLSNpbmNsdWRlICJDbGFuZ1NBQ2hlY2tlcnMuaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdC5oIgotI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL0NGR1JlYWNoYWJpbGl0eUFuYWx5c2lzLmgiCi0jaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQW5hbHlzZXMvUHNldWRvQ29uc3RhbnRBbmFseXNpcy5oIgotI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0NGR1N0bXRNYXAuaCIKLSNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyL0J1Z1JlcG9ydGVyLmgiCi0jaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdUeXBlLmgiCi0jaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyLmgiCi0jaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyTWFuYWdlci5oIgotI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9DaGVja2VyQ29udGV4dC5oIgotI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9DaGVja2VySGVscGVycy5oIgotI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9Db3JlRW5naW5lLmgiCi0jaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL1NWYWxzLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgotI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKLQotdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwotdXNpbmcgbmFtZXNwYWNlIGVudG87Ci0KLW5hbWVzcGFjZSB7Ci1jbGFzcyBJZGVtcG90ZW50T3BlcmF0aW9uQ2hlY2tlcgotICA6IHB1YmxpYyBDaGVja2VyPGNoZWNrOjpQcmVTdG10PEJpbmFyeU9wZXJhdG9yPiwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrOjpQb3N0U3RtdDxCaW5hcnlPcGVyYXRvcj4sCi0gICAgICAgICAgICAgICAgICAgICBjaGVjazo6RW5kQW5hbHlzaXM+IHsKLXB1YmxpYzoKLSAgdm9pZCBjaGVja1ByZVN0bXQoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkIsIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdDsKLSAgdm9pZCBjaGVja1Bvc3RTdG10KGNvbnN0IEJpbmFyeU9wZXJhdG9yICpCLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7Ci0gIHZvaWQgY2hlY2tFbmRBbmFseXNpcyhFeHBsb2RlZEdyYXBoICZHLCBCdWdSZXBvcnRlciAmQixFeHByRW5naW5lICZFbmcpIGNvbnN0OwotCi1wcml2YXRlOgotICAvLyBPdXIgYXNzdW1wdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uLgotICBlbnVtIEFzc3VtcHRpb24geyBQb3NzaWJsZSA9IDAsIEltcG9zc2libGUsIEVxdWFsLCBMSFNpczEsIFJIU2lzMSwgTEhTaXMwLAotICAgICAgUkhTaXMwIH07Ci0KLSAgc3RhdGljIHZvaWQgVXBkYXRlQXNzdW1wdGlvbihBc3N1bXB0aW9uICZBLCBjb25zdCBBc3N1bXB0aW9uICZOZXcpOwotCi0gIC8vIEZhbHNlIHBvc2l0aXZlIHJlZHVjdGlvbiBtZXRob2RzCi0gIHN0YXRpYyBib29sIGlzU2VsZkFzc2lnbihjb25zdCBFeHByICpMSFMsIGNvbnN0IEV4cHIgKlJIUyk7Ci0gIHN0YXRpYyBib29sIGlzVW51c2VkKGNvbnN0IEV4cHIgKkUsIEFuYWx5c2lzRGVjbENvbnRleHQgKkFDKTsKLSAgc3RhdGljIGJvb2wgaXNUcnVuY2F0aW9uRXh0ZW5zaW9uQXNzaWdubWVudChjb25zdCBFeHByICpMSFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqUkhTKTsKLSAgc3RhdGljIGJvb2wgcGF0aFdhc0NvbXBsZXRlbHlBbmFseXplZChBbmFseXNpc0RlY2xDb250ZXh0ICpBQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqQ0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29yZUVuZ2luZSAmQ0UpOwotICBzdGF0aWMgYm9vbCBDYW5WYXJ5KGNvbnN0IEV4cHIgKkV4LAotICAgICAgICAgICAgICAgICAgICAgIEFuYWx5c2lzRGVjbENvbnRleHQgKkFDKTsKLSAgc3RhdGljIGJvb2wgaXNDb25zdGFudE9yUHNldWRvQ29uc3RhbnQoY29uc3QgRGVjbFJlZkV4cHIgKkRSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFseXNpc0RlY2xDb250ZXh0ICpBQyk7Ci0gIHN0YXRpYyBib29sIGNvbnRhaW5zTm9uTG9jYWxWYXJEZWNsKGNvbnN0IFN0bXQgKlMpOwotCi0gIC8vIEhhc2ggdGFibGUgYW5kIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCi0gIHN0cnVjdCBCaW5hcnlPcGVyYXRvckRhdGEgewotICAgIEJpbmFyeU9wZXJhdG9yRGF0YSgpIDogYXNzdW1wdGlvbihQb3NzaWJsZSkge30KLQotICAgIEFzc3VtcHRpb24gYXNzdW1wdGlvbjsKLSAgICBFeHBsb2RlZE5vZGVTZXQgZXhwbG9kZWROb2RlczsgLy8gU2V0IG9mIEV4cGxvZGVkTm9kZXMgdGhhdCByZWZlciB0byBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJpbmFyeU9wZXJhdG9yCi0gIH07Ci0gIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8Y29uc3QgQmluYXJ5T3BlcmF0b3IgKiwgQmluYXJ5T3BlcmF0b3JEYXRhPgotICAgICAgQXNzdW1wdGlvbk1hcDsKLSAgbXV0YWJsZSBBc3N1bXB0aW9uTWFwIGhhc2g7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUOwotfTsKLX0KLQotdm9pZCBJZGVtcG90ZW50T3BlcmF0aW9uQ2hlY2tlcjo6Y2hlY2tQcmVTdG10KGNvbnN0IEJpbmFyeU9wZXJhdG9yICpCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdCB7Ci0gIC8vIEZpbmQgb3IgY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBoYXNoIGZvciB0aGlzIEJpbmFyeU9wZXJhdG9yIGluc3RhbmNlLgotICAvLyBJZiB3ZSBoYXZlbid0IGRvbmUgYSBsb29rdXAgYmVmb3JlLCBpdCB3aWxsIGdldCBkZWZhdWx0IGluaXRpYWxpemVkIHRvCi0gIC8vICdQb3NzaWJsZScuIEF0IHRoaXMgc3RhZ2Ugd2UgZG8gbm90IHN0b3JlIHRoZSBFeHBsb2RlZE5vZGUsIGFzIGl0IGhhcyBub3QKLSAgLy8gYmVlbiBjcmVhdGVkIHlldC4KLSAgQmluYXJ5T3BlcmF0b3JEYXRhICZEYXRhID0gaGFzaFtCXTsKLSAgQXNzdW1wdGlvbiAmQSA9IERhdGEuYXNzdW1wdGlvbjsKLSAgQW5hbHlzaXNEZWNsQ29udGV4dCAqQUMgPSBDLmdldEN1cnJlbnRBbmFseXNpc0RlY2xDb250ZXh0KCk7Ci0KLSAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHZpc2l0ZWQgdGhpcyBub2RlIG9uIGEgcGF0aCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW4KLSAgLy8gaWRlbXBvdGVudCBvcGVyYXRpb24sIHJldHVybiBpbW1lZGlhdGVseS4KLSAgaWYgKEEgPT0gSW1wb3NzaWJsZSkKLSAgICByZXR1cm47Ci0KLSAgLy8gUmV0cmlldmUgYm90aCBzaWRlcyBvZiB0aGUgb3BlcmF0b3IgYW5kIGRldGVybWluZSBpZiB0aGV5IGNhbiB2YXJ5ICh3aGljaAotICAvLyBtYXkgbWVhbiB0aGlzIGlzIGEgZmFsc2UgcG9zaXRpdmUuCi0gIGNvbnN0IEV4cHIgKkxIUyA9IEItPmdldExIUygpOwotICBjb25zdCBFeHByICpSSFMgPSBCLT5nZXRSSFMoKTsKLQotICAvLyBBdCB0aGlzIHN0YWdlIHdlIGNhbiBjYWxjdWxhdGUgd2hldGhlciBlYWNoIHNpZGUgY29udGFpbnMgYSBmYWxzZSBwb3NpdGl2ZQotICAvLyB0aGF0IGFwcGxpZXMgdG8gYWxsIG9wZXJhdG9ycy4gV2Ugb25seSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGlzIHRoZSBmaXJzdAotICAvLyB0aW1lLgotICBib29sIExIU0NvbnRhaW5zRmFsc2VQb3NpdGl2ZSA9IGZhbHNlLCBSSFNDb250YWluc0ZhbHNlUG9zaXRpdmUgPSBmYWxzZTsKLSAgaWYgKEEgPT0gUG9zc2libGUpIHsKLSAgICAvLyBBbiBleHByZXNzaW9uIGNvbnRhaW5zIGEgZmFsc2UgcG9zaXRpdmUgaWYgaXQgY2FuJ3QgdmFyeSwgb3IgaWYgaXQKLSAgICAvLyBjb250YWlucyBhIGtub3duIGZhbHNlIHBvc2l0aXZlIFZhckRlY2wuCi0gICAgTEhTQ29udGFpbnNGYWxzZVBvc2l0aXZlID0gIUNhblZhcnkoTEhTLCBBQykKLSAgICAgICAgfHwgY29udGFpbnNOb25Mb2NhbFZhckRlY2woTEhTKTsKLSAgICBSSFNDb250YWluc0ZhbHNlUG9zaXRpdmUgPSAhQ2FuVmFyeShSSFMsIEFDKQotICAgICAgICB8fCBjb250YWluc05vbkxvY2FsVmFyRGVjbChSSFMpOwotICB9Ci0KLSAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlID0gQy5nZXRTdGF0ZSgpOwotICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHggPSBDLmdldExvY2F0aW9uQ29udGV4dCgpOwotICBTVmFsIExIU1ZhbCA9IHN0YXRlLT5nZXRTVmFsKExIUywgTEN0eCk7Ci0gIFNWYWwgUkhTVmFsID0gc3RhdGUtPmdldFNWYWwoUkhTLCBMQ3R4KTsKLQotICAvLyBJZiBlaXRoZXIgdmFsdWUgaXMgdW5rbm93biwgd2UgY2FuJ3QgYmUgMTAwJSBzdXJlIG9mIGFsbCBwYXRocy4KLSAgaWYgKExIU1ZhbC5pc1Vua25vd25PclVuZGVmKCkgfHwgUkhTVmFsLmlzVW5rbm93bk9yVW5kZWYoKSkgewotICAgIEEgPSBJbXBvc3NpYmxlOwotICAgIHJldHVybjsKLSAgfQotICBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIE9wID0gQi0+Z2V0T3Bjb2RlKCk7Ci0KLSAgLy8gRGVyZWZlcmVuY2UgdGhlIExIUyBTVmFsIGlmIHRoaXMgaXMgYW4gYXNzaWduIG9wZXJhdGlvbgotICBzd2l0Y2ggKE9wKSB7Ci0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7Ci0KLSAgLy8gRmFsbCB0aHJvdWdoIGludGVudGlvbmFsCi0gIGNhc2UgQk9fQWRkQXNzaWduOgotICBjYXNlIEJPX1N1YkFzc2lnbjoKLSAgY2FzZSBCT19NdWxBc3NpZ246Ci0gIGNhc2UgQk9fRGl2QXNzaWduOgotICBjYXNlIEJPX0FuZEFzc2lnbjoKLSAgY2FzZSBCT19PckFzc2lnbjoKLSAgY2FzZSBCT19Yb3JBc3NpZ246Ci0gIGNhc2UgQk9fU2hsQXNzaWduOgotICBjYXNlIEJPX1NockFzc2lnbjoKLSAgY2FzZSBCT19Bc3NpZ246Ci0gIC8vIEFzc2lnbiBzdGF0ZW1lbnRzIGhhdmUgb25lIGV4dHJhIGxldmVsIG9mIGluZGlyZWN0aW9uCi0gICAgaWYgKCFMSFNWYWwuZ2V0QXM8TG9jPigpKSB7Ci0gICAgICBBID0gSW1wb3NzaWJsZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTEhTVmFsID0gc3RhdGUtPmdldFNWYWwoTEhTVmFsLmNhc3RBczxMb2M+KCksIExIUy0+Z2V0VHlwZSgpKTsKLSAgfQotCi0KLSAgLy8gV2Ugbm93IGNoZWNrIGZvciB2YXJpb3VzIGNhc2VzIHdoaWNoIHJlc3VsdCBpbiBhbiBpZGVtcG90ZW50IG9wZXJhdGlvbi4KLQotICAvLyB4IG9wIHgKLSAgc3dpdGNoIChPcCkgewotICBkZWZhdWx0OgotICAgIGJyZWFrOyAvLyBXZSBkb24ndCBjYXJlIGFib3V0IGFueSBvdGhlciBvcGVyYXRvcnMuCi0KLSAgLy8gRmFsbCB0aHJvdWdoIGludGVudGlvbmFsCi0gIGNhc2UgQk9fQXNzaWduOgotICAgIC8vIHggQXNzaWduIHggY2FuIGJlIHVzZWQgdG8gc2lsZW5jZSB1bnVzZWQgdmFyaWFibGUgd2FybmluZ3MgaW50ZW50aW9uYWxseS4KLSAgICAvLyBJZiB0aGlzIGlzIGEgc2VsZiBhc3NpZ25tZW50IGFuZCB0aGUgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBlbHNld2hlcmUsCi0gICAgLy8gYW5kIHRoZSBhc3NpZ25tZW50IGlzIG5vdCBhIHRydW5jYXRpb24gb3IgZXh0ZW5zaW9uLCB0aGVuIGl0IGlzIGEgZmFsc2UKLSAgICAvLyBwb3NpdGl2ZS4KLSAgICBpZiAoaXNTZWxmQXNzaWduKExIUywgUkhTKSkgewotICAgICAgaWYgKCFpc1VudXNlZChMSFMsIEFDKSAmJiAhaXNUcnVuY2F0aW9uRXh0ZW5zaW9uQXNzaWdubWVudChMSFMsIFJIUykpIHsKLSAgICAgICAgVXBkYXRlQXNzdW1wdGlvbihBLCBFcXVhbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBBID0gSW1wb3NzaWJsZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICBjYXNlIEJPX1N1YkFzc2lnbjoKLSAgY2FzZSBCT19EaXZBc3NpZ246Ci0gIGNhc2UgQk9fQW5kQXNzaWduOgotICBjYXNlIEJPX09yQXNzaWduOgotICBjYXNlIEJPX1hvckFzc2lnbjoKLSAgY2FzZSBCT19TdWI6Ci0gIGNhc2UgQk9fRGl2OgotICBjYXNlIEJPX0FuZDoKLSAgY2FzZSBCT19PcjoKLSAgY2FzZSBCT19Yb3I6Ci0gIGNhc2UgQk9fTE9yOgotICBjYXNlIEJPX0xBbmQ6Ci0gIGNhc2UgQk9fRVE6Ci0gIGNhc2UgQk9fTkU6Ci0gICAgaWYgKExIU1ZhbCAhPSBSSFNWYWwgfHwgTEhTQ29udGFpbnNGYWxzZVBvc2l0aXZlCi0gICAgICAgIHx8IFJIU0NvbnRhaW5zRmFsc2VQb3NpdGl2ZSkKLSAgICAgIGJyZWFrOwotICAgIFVwZGF0ZUFzc3VtcHRpb24oQSwgRXF1YWwpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIHggb3AgMQotICBzd2l0Y2ggKE9wKSB7Ci0gICBkZWZhdWx0OgotICAgICBicmVhazsgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCBhbnkgb3RoZXIgb3BlcmF0b3JzLgotCi0gICAvLyBGYWxsIHRocm91Z2ggaW50ZW50aW9uYWwKLSAgIGNhc2UgQk9fTXVsQXNzaWduOgotICAgY2FzZSBCT19EaXZBc3NpZ246Ci0gICBjYXNlIEJPX011bDoKLSAgIGNhc2UgQk9fRGl2OgotICAgY2FzZSBCT19MT3I6Ci0gICBjYXNlIEJPX0xBbmQ6Ci0gICAgIGlmICghUkhTVmFsLmlzQ29uc3RhbnQoMSkgfHwgUkhTQ29udGFpbnNGYWxzZVBvc2l0aXZlKQotICAgICAgIGJyZWFrOwotICAgICBVcGRhdGVBc3N1bXB0aW9uKEEsIFJIU2lzMSk7Ci0gICAgIHJldHVybjsKLSAgfQotCi0gIC8vIDEgb3AgeAotICBzd2l0Y2ggKE9wKSB7Ci0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7IC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgYW55IG90aGVyIG9wZXJhdG9ycy4KLQotICAvLyBGYWxsIHRocm91Z2ggaW50ZW50aW9uYWwKLSAgY2FzZSBCT19NdWxBc3NpZ246Ci0gIGNhc2UgQk9fTXVsOgotICBjYXNlIEJPX0xPcjoKLSAgY2FzZSBCT19MQW5kOgotICAgIGlmICghTEhTVmFsLmlzQ29uc3RhbnQoMSkgfHwgTEhTQ29udGFpbnNGYWxzZVBvc2l0aXZlKQotICAgICAgYnJlYWs7Ci0gICAgVXBkYXRlQXNzdW1wdGlvbihBLCBMSFNpczEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIHggb3AgMAotICBzd2l0Y2ggKE9wKSB7Ci0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7IC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgYW55IG90aGVyIG9wZXJhdG9ycy4KLQotICAvLyBGYWxsIHRocm91Z2ggaW50ZW50aW9uYWwKLSAgY2FzZSBCT19BZGRBc3NpZ246Ci0gIGNhc2UgQk9fU3ViQXNzaWduOgotICBjYXNlIEJPX011bEFzc2lnbjoKLSAgY2FzZSBCT19BbmRBc3NpZ246Ci0gIGNhc2UgQk9fT3JBc3NpZ246Ci0gIGNhc2UgQk9fWG9yQXNzaWduOgotICBjYXNlIEJPX0FkZDoKLSAgY2FzZSBCT19TdWI6Ci0gIGNhc2UgQk9fTXVsOgotICBjYXNlIEJPX0FuZDoKLSAgY2FzZSBCT19PcjoKLSAgY2FzZSBCT19Yb3I6Ci0gIGNhc2UgQk9fU2hsOgotICBjYXNlIEJPX1NocjoKLSAgY2FzZSBCT19MT3I6Ci0gIGNhc2UgQk9fTEFuZDoKLSAgICBpZiAoIVJIU1ZhbC5pc0NvbnN0YW50KDApIHx8IFJIU0NvbnRhaW5zRmFsc2VQb3NpdGl2ZSkKLSAgICAgIGJyZWFrOwotICAgIFVwZGF0ZUFzc3VtcHRpb24oQSwgUkhTaXMwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyAwIG9wIHgKLSAgc3dpdGNoIChPcCkgewotICBkZWZhdWx0OgotICAgIGJyZWFrOyAvLyBXZSBkb24ndCBjYXJlIGFib3V0IGFueSBvdGhlciBvcGVyYXRvcnMuCi0KLSAgLy8gRmFsbCB0aHJvdWdoIGludGVudGlvbmFsCi0gIC8vY2FzZSBCT19BZGRBc3NpZ246IC8vIENvbW1vbiBmYWxzZSBwb3NpdGl2ZQotICBjYXNlIEJPX1N1YkFzc2lnbjogLy8gQ2hlY2sgb25seSBpZiB1bnNpZ25lZAotICBjYXNlIEJPX011bEFzc2lnbjoKLSAgY2FzZSBCT19EaXZBc3NpZ246Ci0gIGNhc2UgQk9fQW5kQXNzaWduOgotICAvL2Nhc2UgQk9fT3JBc3NpZ246IC8vIENvbW1vbiBmYWxzZSBwb3NpdGl2ZQotICAvL2Nhc2UgQk9fWG9yQXNzaWduOiAvLyBDb21tb24gZmFsc2UgcG9zaXRpdmUKLSAgY2FzZSBCT19TaGxBc3NpZ246Ci0gIGNhc2UgQk9fU2hyQXNzaWduOgotICBjYXNlIEJPX0FkZDoKLSAgY2FzZSBCT19TdWI6Ci0gIGNhc2UgQk9fTXVsOgotICBjYXNlIEJPX0RpdjoKLSAgY2FzZSBCT19BbmQ6Ci0gIGNhc2UgQk9fT3I6Ci0gIGNhc2UgQk9fWG9yOgotICBjYXNlIEJPX1NobDoKLSAgY2FzZSBCT19TaHI6Ci0gIGNhc2UgQk9fTE9yOgotICBjYXNlIEJPX0xBbmQ6Ci0gICAgaWYgKCFMSFNWYWwuaXNDb25zdGFudCgwKSB8fCBMSFNDb250YWluc0ZhbHNlUG9zaXRpdmUpCi0gICAgICBicmVhazsKLSAgICBVcGRhdGVBc3N1bXB0aW9uKEEsIExIU2lzMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gSWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIHRoZXJlIGhhcyBiZWVuIGEgdmFsaWQgdXNlIG9mIHRoaXMgb3BlcmF0aW9uLgotICBBID0gSW1wb3NzaWJsZTsKLX0KLQotLy8gQXQgdGhlIHBvc3QgdmlzaXQgc3RhZ2UsIHRoZSBwcmVkZWNlc3NvciBFeHBsb2RlZE5vZGUgd2lsbCBiZSB0aGUKLS8vIEJpbmFyeU9wZXJhdG9yIHRoYXQgd2FzIGp1c3QgY3JlYXRlZC4gV2UgdXNlIHRoaXMgaG9vayB0byBjb2xsZWN0IHRoZQotLy8gRXhwbG9kZWROb2RlLgotdm9pZCBJZGVtcG90ZW50T3BlcmF0aW9uQ2hlY2tlcjo6Y2hlY2tQb3N0U3RtdChjb25zdCBCaW5hcnlPcGVyYXRvciAqQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0IHsKLSAgLy8gQWRkIHRoZSBFeHBsb2RlZE5vZGUgd2UganVzdCB2aXNpdGVkCi0gIEJpbmFyeU9wZXJhdG9yRGF0YSAmRGF0YSA9IGhhc2hbQl07Ci0KLSAgY29uc3QgU3RtdCAqcHJlZFN0bXQgPQotICAgICAgQy5nZXRQcmVkZWNlc3NvcigpLT5nZXRMb2NhdGlvbigpLmNhc3RBczxTdG10UG9pbnQ+KCkuZ2V0U3RtdCgpOwotCi0gIC8vIElnbm9yZSBpbXBsaWNpdCBjYWxscyB0byBzZXR0ZXJzLgotICBpZiAoIWlzYTxCaW5hcnlPcGVyYXRvcj4ocHJlZFN0bXQpKQotICAgIHJldHVybjsKLQotICBEYXRhLmV4cGxvZGVkTm9kZXMuQWRkKEMuZ2V0UHJlZGVjZXNzb3IoKSk7Ci19Ci0KLXZvaWQgSWRlbXBvdGVudE9wZXJhdGlvbkNoZWNrZXI6OmNoZWNrRW5kQW5hbHlzaXMoRXhwbG9kZWRHcmFwaCAmRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXIgJkJSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHByRW5naW5lICZFbmcpIGNvbnN0IHsKLSAgaWYgKCFCVCkKLSAgICBCVC5yZXNldChuZXcgQnVnVHlwZSgiSWRlbXBvdGVudCBvcGVyYXRpb24iLCAiRGVhZCBjb2RlIikpOwotCi0gIC8vIEl0ZXJhdGUgb3ZlciB0aGUgaGFzaCB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgcGF0aHMgd2l0aCBkZWZpbml0ZQotICAvLyBpZGVtcG90ZW50IG9wZXJhdGlvbnMuCi0gIGZvciAoQXNzdW1wdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgaSA9IGhhc2guYmVnaW4oKTsgaSAhPSBoYXNoLmVuZCgpOyArK2kpIHsKLSAgICAvLyBVbnBhY2sgdGhlIGhhc2ggY29udGVudHMKLSAgICBjb25zdCBCaW5hcnlPcGVyYXRvckRhdGEgJkRhdGEgPSBpLT5zZWNvbmQ7Ci0gICAgY29uc3QgQXNzdW1wdGlvbiAmQSA9IERhdGEuYXNzdW1wdGlvbjsKLSAgICBjb25zdCBFeHBsb2RlZE5vZGVTZXQgJkVTID0gRGF0YS5leHBsb2RlZE5vZGVzOwotCi0gICAgLy8gSWYgdGhlcmUgYXJlIG5vIG5vZGVzIGFjY29zdGVkIHdpdGggdGhlIGV4cHJlc3Npb24sIG5vdGhpbmcgdG8gcmVwb3J0LgotICAgIC8vIEZJWE1FOiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgdGhlIGNoZWNrZXIgZG9lcyBwYXJ0IG9mIHByb2Nlc3NpbmcgaW4KLSAgICAvLyBjaGVja1ByZVN0bXQgYW5kIHBhcnQgaW4gY2hlY2tQb3N0U3RtdC4KLSAgICBpZiAoRVMuYmVnaW4oKSA9PSBFUy5lbmQoKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgY29uc3QgQmluYXJ5T3BlcmF0b3IgKkIgPSBpLT5maXJzdDsKLQotICAgIGlmIChBID09IEltcG9zc2libGUpCi0gICAgICBjb250aW51ZTsKLQotICAgIC8vIElmIHRoZSBhbmFseXplciBkaWQgbm90IGZpbmlzaCwgY2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBzdGlsbCBlbWl0IHRoaXMKLSAgICAvLyB3YXJuaW5nCi0gICAgaWYgKEVuZy5oYXNXb3JrUmVtYWluaW5nKCkpIHsKLSAgICAgIC8vIElmIHdlIGNhbiB0cmFjZSBiYWNrCi0gICAgICBBbmFseXNpc0RlY2xDb250ZXh0ICpBQyA9ICgqRVMuYmVnaW4oKSktPmdldExvY2F0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0QW5hbHlzaXNEZWNsQ29udGV4dCgpOwotICAgICAgaWYgKCFwYXRoV2FzQ29tcGxldGVseUFuYWx5emVkKEFDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDLT5nZXRDRkdTdG10TWFwKCktPmdldEJsb2NrKEIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZy5nZXRDb3JlRW5naW5lKCkpKQotICAgICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBTZWxlY3QgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIFNvdXJjZVJhbmdlcyB0byByZXBvcnQuCi0gICAgU21hbGxTdHJpbmc8MTI4PiBidWY7Ci0gICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBvcyhidWYpOwotICAgIGJvb2wgTEhTUmVsZXZhbnQgPSBmYWxzZSwgUkhTUmVsZXZhbnQgPSBmYWxzZTsKLSAgICBzd2l0Y2ggKEEpIHsKLSAgICBjYXNlIEVxdWFsOgotICAgICAgTEhTUmVsZXZhbnQgPSB0cnVlOwotICAgICAgUkhTUmVsZXZhbnQgPSB0cnVlOwotICAgICAgaWYgKEItPmdldE9wY29kZSgpID09IEJPX0Fzc2lnbikKLSAgICAgICAgb3MgPDwgIkFzc2lnbmVkIHZhbHVlIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgZXhpc3RpbmcgdmFsdWUiOwotICAgICAgZWxzZQotICAgICAgICBvcyA8PCAiQm90aCBvcGVyYW5kcyB0byAnIiA8PCBCLT5nZXRPcGNvZGVTdHIoKQotICAgICAgICAgICA8PCAiJyBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExIU2lzMToKLSAgICAgIExIU1JlbGV2YW50ID0gdHJ1ZTsKLSAgICAgIG9zIDw8ICJUaGUgbGVmdCBvcGVyYW5kIHRvICciIDw8IEItPmdldE9wY29kZVN0cigpIDw8ICInIGlzIGFsd2F5cyAxIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkhTaXMxOgotICAgICAgUkhTUmVsZXZhbnQgPSB0cnVlOwotICAgICAgb3MgPDwgIlRoZSByaWdodCBvcGVyYW5kIHRvICciIDw8IEItPmdldE9wY29kZVN0cigpIDw8ICInIGlzIGFsd2F5cyAxIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTEhTaXMwOgotICAgICAgTEhTUmVsZXZhbnQgPSB0cnVlOwotICAgICAgb3MgPDwgIlRoZSBsZWZ0IG9wZXJhbmQgdG8gJyIgPDwgQi0+Z2V0T3Bjb2RlU3RyKCkgPDwgIicgaXMgYWx3YXlzIDAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSSFNpczA6Ci0gICAgICBSSFNSZWxldmFudCA9IHRydWU7Ci0gICAgICBvcyA8PCAiVGhlIHJpZ2h0IG9wZXJhbmQgdG8gJyIgPDwgQi0+Z2V0T3Bjb2RlU3RyKCkgPDwgIicgaXMgYWx3YXlzIDAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQb3NzaWJsZToKLSAgICAgIGxsdm1fdW5yZWFjaGFibGUoIk9wZXJhdGlvbiB3YXMgbmV2ZXIgbWFya2VkIHdpdGggYW4gYXNzdW1wdGlvbiIpOwotICAgIGNhc2UgSW1wb3NzaWJsZToKLSAgICAgIGxsdm1fdW5yZWFjaGFibGUoMCk7Ci0gICAgfQotCi0gICAgLy8gQWRkIGEgcmVwb3J0IGZvciBlYWNoIEV4cGxvZGVkTm9kZQotICAgIGZvciAoRXhwbG9kZWROb2RlU2V0OjppdGVyYXRvciBJID0gRVMuYmVnaW4oKSwgRSA9IEVTLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgQnVnUmVwb3J0ICpyZXBvcnQgPSBuZXcgQnVnUmVwb3J0KCpCVCwgb3Muc3RyKCksICpJKTsKLQotICAgICAgLy8gQWRkIHNvdXJjZSByYW5nZXMgYW5kIHZpc2l0b3IgaG9va3MKLSAgICAgIGlmIChMSFNSZWxldmFudCkgewotICAgICAgICBjb25zdCBFeHByICpMSFMgPSBpLT5maXJzdC0+Z2V0TEhTKCk7Ci0gICAgICAgIHJlcG9ydC0+YWRkUmFuZ2UoTEhTLT5nZXRTb3VyY2VSYW5nZSgpKTsKLSAgICAgICAgRmluZExhc3RTdG9yZUJSVmlzaXRvcjo6cmVnaXN0ZXJTdGF0ZW1lbnRWYXJEZWNscygqcmVwb3J0LCBMSFMsIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGlmIChSSFNSZWxldmFudCkgewotICAgICAgICBjb25zdCBFeHByICpSSFMgPSBpLT5maXJzdC0+Z2V0UkhTKCk7Ci0gICAgICAgIHJlcG9ydC0+YWRkUmFuZ2UoaS0+Zmlyc3QtPmdldFJIUygpLT5nZXRTb3VyY2VSYW5nZSgpKTsKLSAgICAgICAgRmluZExhc3RTdG9yZUJSVmlzaXRvcjo6cmVnaXN0ZXJTdGF0ZW1lbnRWYXJEZWNscygqcmVwb3J0LCBSSFMsIGZhbHNlKTsKLSAgICAgIH0KLQotICAgICAgQlIuZW1pdFJlcG9ydChyZXBvcnQpOwotICAgIH0KLSAgfQotCi0gIGhhc2guY2xlYXIoKTsKLX0KLQotLy8gVXBkYXRlcyB0aGUgY3VycmVudCBhc3N1bXB0aW9uIGdpdmVuIHRoZSBuZXcgYXNzdW1wdGlvbgotaW5saW5lIHZvaWQgSWRlbXBvdGVudE9wZXJhdGlvbkNoZWNrZXI6OlVwZGF0ZUFzc3VtcHRpb24oQXNzdW1wdGlvbiAmQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXNzdW1wdGlvbiAmTmV3KSB7Ci0vLyBJZiB0aGUgYXNzdW1wdGlvbiBpcyB0aGUgc2FtZSwgdGhlcmUgaXMgbm90aGluZyB0byBkbwotICBpZiAoQSA9PSBOZXcpCi0gICAgcmV0dXJuOwotCi0gIHN3aXRjaCAoQSkgewotICAvLyBJZiB3ZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBhbiBhc3N1bXB0aW9uLCBzZXQgaXQKLSAgY2FzZSBQb3NzaWJsZToKLSAgICBBID0gTmV3OwotICAgIHJldHVybjsKLQotICAvLyBJZiB3ZSBoYXZlIGRldGVybWluZWQgdGhhdCBhIHZhbGlkIHN0YXRlIGhhcHBlbmVkLCBpZ25vcmUgdGhlIG5ldwotICAvLyBhc3N1bXB0aW9uLgotICBjYXNlIEltcG9zc2libGU6Ci0gICAgcmV0dXJuOwotCi0gIC8vIEFueSBvdGhlciBjYXNlIG1lYW5zIHRoYXQgd2UgaGFkIGEgZGlmZmVyZW50IGFzc3VtcHRpb24gbGFzdCB0aW1lLiBXZSBkb24ndAotICAvLyBjdXJyZW50bHkgc3VwcG9ydCBtaXhpbmcgYXNzdW1wdGlvbnMgZm9yIGRpYWdub3N0aWMgcmVhc29ucywgc28gd2Ugc2V0Ci0gIC8vIG91ciBhc3N1bXB0aW9uIHRvIGJlIGltcG9zc2libGUuCi0gIGRlZmF1bHQ6Ci0gICAgQSA9IEltcG9zc2libGU7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLS8vIENoZWNrIGZvciBhIHN0YXRlbWVudCB3aGVyZSBhIHZhcmlhYmxlIGlzIHNlbGYgYXNzaWduZWQgdG8gcG9zc2libHkgYXZvaWQgYW4KLS8vIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nLgotYm9vbCBJZGVtcG90ZW50T3BlcmF0aW9uQ2hlY2tlcjo6aXNTZWxmQXNzaWduKGNvbnN0IEV4cHIgKkxIUywgY29uc3QgRXhwciAqUkhTKSB7Ci0gIExIUyA9IExIUy0+SWdub3JlUGFyZW5DYXN0cygpOwotICBSSFMgPSBSSFMtPklnbm9yZVBhcmVuQ2FzdHMoKTsKLQotICBjb25zdCBEZWNsUmVmRXhwciAqTEhTX0RSID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KExIUyk7Ci0gIGlmICghTEhTX0RSKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb25zdCBWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KExIU19EUi0+Z2V0RGVjbCgpKTsKLSAgaWYgKCFWRCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY29uc3QgRGVjbFJlZkV4cHIgKlJIU19EUiA9IGR5bl9jYXN0PERlY2xSZWZFeHByPihSSFMpOwotICBpZiAoIVJIU19EUikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKFZEICE9IFJIU19EUi0+Z2V0RGVjbCgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBFeHByIHBvaW50cyB0byBhIFZhckRlY2wgdGhhdCBpcyBub3QgcmVhZCBhbnl3aGVyZQotLy8gb3V0c2lkZSBvZiBzZWxmLWFzc2lnbm1lbnRzLgotYm9vbCBJZGVtcG90ZW50T3BlcmF0aW9uQ2hlY2tlcjo6aXNVbnVzZWQoY29uc3QgRXhwciAqRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWx5c2lzRGVjbENvbnRleHQgKkFDKSB7Ci0gIGlmICghRSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY29uc3QgRGVjbFJlZkV4cHIgKkRSID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KEUtPklnbm9yZVBhcmVuQ2FzdHMoKSk7Ci0gIGlmICghRFIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvbnN0IFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oRFItPmdldERlY2woKSk7Ci0gIGlmICghVkQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChBQy0+Z2V0UHNldWRvQ29uc3RhbnRBbmFseXNpcygpLT53YXNSZWZlcmVuY2VkKFZEKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIENoZWNrIGZvciBzZWxmIGNhc3RzIHRydW5jYXRpbmcvZXh0ZW5kaW5nIGEgdmFyaWFibGUKLWJvb2wgSWRlbXBvdGVudE9wZXJhdGlvbkNoZWNrZXI6OmlzVHJ1bmNhdGlvbkV4dGVuc2lvbkFzc2lnbm1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cHIgKkxIUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqUkhTKSB7Ci0KLSAgY29uc3QgRGVjbFJlZkV4cHIgKkxIU19EUiA9IGR5bl9jYXN0PERlY2xSZWZFeHByPihMSFMtPklnbm9yZVBhcmVuQ2FzdHMoKSk7Ci0gIGlmICghTEhTX0RSKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb25zdCBWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KExIU19EUi0+Z2V0RGVjbCgpKTsKLSAgaWYgKCFWRCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY29uc3QgRGVjbFJlZkV4cHIgKlJIU19EUiA9IGR5bl9jYXN0PERlY2xSZWZFeHByPihSSFMtPklnbm9yZVBhcmVuQ2FzdHMoKSk7Ci0gIGlmICghUkhTX0RSKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoVkQgIT0gUkhTX0RSLT5nZXREZWNsKCkpCi0gICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KFJIUy0+SWdub3JlUGFyZW5MVmFsdWVDYXN0cygpKSA9PSBOVUxMOwotfQotCi0vLyBSZXR1cm5zIGZhbHNlIGlmIGEgcGF0aCB0byB0aGlzIGJsb2NrIHdhcyBub3QgY29tcGxldGVseSBhbmFseXplZCwgb3IgdHJ1ZQotLy8gb3RoZXJ3aXNlLgotYm9vbAotSWRlbXBvdGVudE9wZXJhdGlvbkNoZWNrZXI6OnBhdGhXYXNDb21wbGV0ZWx5QW5hbHl6ZWQoQW5hbHlzaXNEZWNsQ29udGV4dCAqQUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkdCbG9jayAqQ0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb3JlRW5naW5lICZDRSkgewotCi0gIENGR1JldmVyc2VCbG9ja1JlYWNoYWJpbGl0eUFuYWx5c2lzICpDUkEgPSBBQy0+Z2V0Q0ZHUmVhY2hhYmxpdHlBbmFseXNpcygpOwotICAKLSAgLy8gVGVzdCBmb3IgcmVhY2hhYmlsaXR5IGZyb20gYW55IGFib3J0ZWQgYmxvY2tzIHRvIHRoaXMgYmxvY2sKLSAgdHlwZWRlZiBDb3JlRW5naW5lOjpCbG9ja3NFeGhhdXN0ZWQ6OmNvbnN0X2l0ZXJhdG9yIEV4aGF1c3RlZEl0ZXJhdG9yOwotICBmb3IgKEV4aGF1c3RlZEl0ZXJhdG9yIEkgPSBDRS5ibG9ja3NfZXhoYXVzdGVkX2JlZ2luKCksCi0gICAgICBFID0gQ0UuYmxvY2tzX2V4aGF1c3RlZF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICBjb25zdCBCbG9ja0VkZ2UgJkJFID0gIEktPmZpcnN0OwotCi0gICAgLy8gVGhlIGRlc3RpbmF0aW9uIGJsb2NrIG9uIHRoZSBCbG9ja0VkZ2UgaXMgdGhlIGZpcnN0IGJsb2NrIHRoYXQgd2FzIG5vdAotICAgIC8vIGFuYWx5emVkLiBJZiB3ZSBjYW4gcmVhY2ggdGhpcyBibG9jayBmcm9tIHRoZSBhYm9ydGVkIGJsb2NrLCB0aGVuIHRoaXMKLSAgICAvLyBibG9jayB3YXMgbm90IGNvbXBsZXRlbHkgYW5hbHl6ZWQuCi0gICAgLy8KLSAgICAvLyBBbHNvIGV4cGxpY2l0bHkgY2hlY2sgaWYgdGhlIGN1cnJlbnQgYmxvY2sgaXMgdGhlIGRlc3RpbmF0aW9uIGJsb2NrLgotICAgIC8vIFdoaWxlIHRlY2huaWNhbGx5IHJlYWNoYWJsZSwgaXQgbWVhbnMgd2UgYWJvcnRlZCB0aGUgYW5hbHlzaXMgb24KLSAgICAvLyBhIHBhdGggdGhhdCBpbmNsdWRlZCB0aGF0IGJsb2NrLgotICAgIGNvbnN0IENGR0Jsb2NrICpkZXN0QmxvY2sgPSBCRS5nZXREc3QoKTsKLSAgICBpZiAoZGVzdEJsb2NrID09IENCIHx8IENSQS0+aXNSZWFjaGFibGUoZGVzdEJsb2NrLCBDQikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBUZXN0IGZvciByZWFjaGFiaWxpdHkgZnJvbSBibG9ja3Mgd2UganVzdCBnYXZlIHVwIG9uLgotICB0eXBlZGVmIENvcmVFbmdpbmU6OkJsb2Nrc0Fib3J0ZWQ6OmNvbnN0X2l0ZXJhdG9yIEFib3J0ZWRJdGVyYXRvcjsKLSAgZm9yIChBYm9ydGVkSXRlcmF0b3IgSSA9IENFLmJsb2Nrc19hYm9ydGVkX2JlZ2luKCksCi0gICAgICAgRSA9IENFLmJsb2Nrc19hYm9ydGVkX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGNvbnN0IENGR0Jsb2NrICpkZXN0QmxvY2sgPSBJLT5maXJzdDsKLSAgICBpZiAoZGVzdEJsb2NrID09IENCIHx8IENSQS0+aXNSZWFjaGFibGUoZGVzdEJsb2NrLCBDQikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8vIEZvciB0aGUgaXRlbXMgc3RpbGwgb24gdGhlIHdvcmtsaXN0LCBzZWUgaWYgdGhleSBhcmUgaW4gYmxvY2tzIHRoYXQKLSAgLy8gY2FuIGV2ZW50dWFsbHkgcmVhY2ggJ0NCJy4KLSAgY2xhc3MgVmlzaXRXTCA6IHB1YmxpYyBXb3JrTGlzdDo6VmlzaXRvciB7Ci0gICAgY29uc3QgQ0ZHU3RtdE1hcCAqQ0JNOwotICAgIGNvbnN0IENGR0Jsb2NrICpUYXJnZXRCbG9jazsKLSAgICBDRkdSZXZlcnNlQmxvY2tSZWFjaGFiaWxpdHlBbmFseXNpcyAmQ1JBOwotICBwdWJsaWM6Ci0gICAgVmlzaXRXTChjb25zdCBDRkdTdG10TWFwICpjYm0sIGNvbnN0IENGR0Jsb2NrICp0YXJnZXRCbG9jaywKLSAgICAgICAgICAgIENGR1JldmVyc2VCbG9ja1JlYWNoYWJpbGl0eUFuYWx5c2lzICZjcmEpCi0gICAgICA6IENCTShjYm0pLCBUYXJnZXRCbG9jayh0YXJnZXRCbG9jayksIENSQShjcmEpIHt9Ci0gICAgdmlydHVhbCBib29sIHZpc2l0KGNvbnN0IFdvcmtMaXN0VW5pdCAmVSkgewotICAgICAgUHJvZ3JhbVBvaW50IFAgPSBVLmdldE5vZGUoKS0+Z2V0TG9jYXRpb24oKTsKLSAgICAgIGNvbnN0IENGR0Jsb2NrICpCID0gMDsKLSAgICAgIGlmIChPcHRpb25hbDxTdG10UG9pbnQ+IFNQID0gUC5nZXRBczxTdG10UG9pbnQ+KCkpIHsKLSAgICAgICAgQiA9IENCTS0+Z2V0QmxvY2soU1AtPmdldFN0bXQoKSk7Ci0gICAgICB9IGVsc2UgaWYgKE9wdGlvbmFsPEJsb2NrRWRnZT4gQkUgPSBQLmdldEFzPEJsb2NrRWRnZT4oKSkgewotICAgICAgICBCID0gQkUtPmdldERzdCgpOwotICAgICAgfSBlbHNlIGlmIChPcHRpb25hbDxCbG9ja0VudHJhbmNlPiBCRW50ID0gUC5nZXRBczxCbG9ja0VudHJhbmNlPigpKSB7Ci0gICAgICAgIEIgPSBCRW50LT5nZXRCbG9jaygpOwotICAgICAgfSBlbHNlIGlmIChPcHRpb25hbDxCbG9ja0V4aXQ+IEJFeGl0ID0gUC5nZXRBczxCbG9ja0V4aXQ+KCkpIHsKLSAgICAgICAgQiA9IEJFeGl0LT5nZXRCbG9jaygpOwotICAgICAgfQotICAgICAgaWYgKCFCKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIAotICAgICAgcmV0dXJuIEIgPT0gVGFyZ2V0QmxvY2sgfHwgQ1JBLmlzUmVhY2hhYmxlKEIsIFRhcmdldEJsb2NrKTsKLSAgICB9Ci0gIH07Ci0gIFZpc2l0V0wgdmlzaXRXTChBQy0+Z2V0Q0ZHU3RtdE1hcCgpLCBDQiwgKkNSQSk7Ci0gIC8vIFdlcmUgdGhlcmUgYW55IGl0ZW1zIGluIHRoZSB3b3JrbGlzdCB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IHJlYWNoCi0gIC8vIHRoaXMgYmxvY2s/Ci0gIGlmIChDRS5nZXRXb3JrTGlzdCgpLT52aXNpdEl0ZW1zSW5Xb3JrTGlzdCh2aXNpdFdMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgdGhpcyBibG9jayBpcyByZWFjaGFibGUgZnJvbSB0aGUgZW50cnkgYmxvY2sKLSAgaWYgKCFDUkEtPmlzUmVhY2hhYmxlKCZBQy0+Z2V0Q0ZHKCktPmdldEVudHJ5KCksIENCKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gSWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIHRoZXJlIGlzIG5vIGNvbm5lY3Rpb24gdG8gdGhlIGVudHJ5IGJsb2NrIG9yIGFuCi0gIC8vIGFib3J0ZWQgYmxvY2suIFRoaXMgcGF0aCBpcyB1bnJlYWNoYWJsZSBhbmQgd2UgY2FuIHJlcG9ydCB0aGUgZXJyb3IuCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBSZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXhwcmVzc2lvbiBjb250YWlucyBhbnkgZWxlbWVudAotLy8gdGhhdCB2YXJpZXMuIFRoaXMgY291bGQgYmUgZHVlIHRvIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IGxpa2Ugc2l6ZW9mLiBBbgotLy8gZXhwcmVzc2lvbiBtYXkgYWxzbyBpbnZvbHZlIGEgdmFyaWFibGUgdGhhdCBiZWhhdmVzIGxpa2UgYSBjb25zdGFudC4gVGhlCi0vLyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIGV4cHJlc3Npb24gdmFyaWVzLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotYm9vbCBJZGVtcG90ZW50T3BlcmF0aW9uQ2hlY2tlcjo6Q2FuVmFyeShjb25zdCBFeHByICpFeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbHlzaXNEZWNsQ29udGV4dCAqQUMpIHsKLSAgLy8gUGFyZW50aGVzZXMgYW5kIGNhc3RzIGFyZSBpcnJlbGV2YW50IGhlcmUKLSAgRXggPSBFeC0+SWdub3JlUGFyZW5DYXN0cygpOwotCi0gIGlmIChFeC0+Z2V0TG9jU3RhcnQoKS5pc01hY3JvSUQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3dpdGNoIChFeC0+Z2V0U3RtdENsYXNzKCkpIHsKLSAgLy8gVHJpdmlhbGx5IHRydWUgY2FzZXMKLSAgY2FzZSBTdG10OjpBcnJheVN1YnNjcmlwdEV4cHJDbGFzczoKLSAgY2FzZSBTdG10OjpNZW1iZXJFeHByQ2xhc3M6Ci0gIGNhc2UgU3RtdDo6U3RtdEV4cHJDbGFzczoKLSAgY2FzZSBTdG10OjpDYWxsRXhwckNsYXNzOgotICBjYXNlIFN0bXQ6OlZBQXJnRXhwckNsYXNzOgotICBjYXNlIFN0bXQ6OlNodWZmbGVWZWN0b3JFeHByQ2xhc3M6Ci0gICAgcmV0dXJuIHRydWU7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLy8gVHJpdmlhbGx5IGZhbHNlIGNhc2VzCi0gIGNhc2UgU3RtdDo6SW50ZWdlckxpdGVyYWxDbGFzczoKLSAgY2FzZSBTdG10OjpDaGFyYWN0ZXJMaXRlcmFsQ2xhc3M6Ci0gIGNhc2UgU3RtdDo6RmxvYXRpbmdMaXRlcmFsQ2xhc3M6Ci0gIGNhc2UgU3RtdDo6UHJlZGVmaW5lZEV4cHJDbGFzczoKLSAgY2FzZSBTdG10OjpJbWFnaW5hcnlMaXRlcmFsQ2xhc3M6Ci0gIGNhc2UgU3RtdDo6U3RyaW5nTGl0ZXJhbENsYXNzOgotICBjYXNlIFN0bXQ6Ok9mZnNldE9mRXhwckNsYXNzOgotICBjYXNlIFN0bXQ6OkNvbXBvdW5kTGl0ZXJhbEV4cHJDbGFzczoKLSAgY2FzZSBTdG10OjpBZGRyTGFiZWxFeHByQ2xhc3M6Ci0gIGNhc2UgU3RtdDo6QmluYXJ5VHlwZVRyYWl0RXhwckNsYXNzOgotICBjYXNlIFN0bXQ6OkdOVU51bGxFeHByQ2xhc3M6Ci0gIGNhc2UgU3RtdDo6SW5pdExpc3RFeHByQ2xhc3M6Ci0gIGNhc2UgU3RtdDo6RGVzaWduYXRlZEluaXRFeHByQ2xhc3M6Ci0gIGNhc2UgU3RtdDo6QmxvY2tFeHByQ2xhc3M6Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIENhc2VzIHJlcXVpcmluZyBjdXN0b20gbG9naWMKLSAgY2FzZSBTdG10OjpVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHJDbGFzczogewotICAgIGNvbnN0IFVuYXJ5RXhwck9yVHlwZVRyYWl0RXhwciAqU0UgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgY2FzdDxjb25zdCBVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHI+KEV4KTsKLSAgICBpZiAoU0UtPmdldEtpbmQoKSAhPSBVRVRUX1NpemVPZikKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gU0UtPmdldFR5cGVPZkFyZ3VtZW50KCktPmlzVmFyaWFibGVBcnJheVR5cGUoKTsKLSAgfQotICBjYXNlIFN0bXQ6OkRlY2xSZWZFeHByQ2xhc3M6Ci0gICAgLy8gQ2hlY2sgZm9yIGNvbnN0YW50cy9wc2V1ZG9jb25zdGFudHMKLSAgICByZXR1cm4gIWlzQ29uc3RhbnRPclBzZXVkb0NvbnN0YW50KGNhc3Q8RGVjbFJlZkV4cHI+KEV4KSwgQUMpOwotCi0gIC8vIFRoZSBuZXh0IGNhc2VzIHJlcXVpcmUgcmVjdXJzaW9uIGZvciBzdWJleHByZXNzaW9ucwotICBjYXNlIFN0bXQ6OkJpbmFyeU9wZXJhdG9yQ2xhc3M6IHsKLSAgICBjb25zdCBCaW5hcnlPcGVyYXRvciAqQiA9IGNhc3Q8Y29uc3QgQmluYXJ5T3BlcmF0b3I+KEV4KTsKLQotICAgIC8vIEV4Y2x1ZGUgY2FzZXMgaW52b2x2aW5nIHBvaW50ZXIgYXJpdGhtZXRpYy4gIFRoZXNlIGFyZSB1c3VhbGx5Ci0gICAgLy8gZmFsc2UgcG9zaXRpdmVzLgotICAgIGlmIChCLT5nZXRPcGNvZGUoKSA9PSBCT19TdWIgfHwgQi0+Z2V0T3Bjb2RlKCkgPT0gQk9fQWRkKQotICAgICAgaWYgKEItPmdldExIUygpLT5nZXRUeXBlKCktPmdldEFzPFBvaW50ZXJUeXBlPigpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gQ2FuVmFyeShCLT5nZXRSSFMoKSwgQUMpCi0gICAgICAgIHx8IENhblZhcnkoQi0+Z2V0TEhTKCksIEFDKTsKLSAgIH0KLSAgY2FzZSBTdG10OjpVbmFyeU9wZXJhdG9yQ2xhc3M6Ci0gICAgcmV0dXJuIENhblZhcnkoY2FzdDxVbmFyeU9wZXJhdG9yPihFeCktPmdldFN1YkV4cHIoKSwgQUMpOwotICBjYXNlIFN0bXQ6OkNvbmRpdGlvbmFsT3BlcmF0b3JDbGFzczoKLSAgY2FzZSBTdG10OjpCaW5hcnlDb25kaXRpb25hbE9wZXJhdG9yQ2xhc3M6Ci0gICAgcmV0dXJuIENhblZhcnkoY2FzdDxBYnN0cmFjdENvbmRpdGlvbmFsT3BlcmF0b3I+KEV4KS0+Z2V0Q29uZCgpLCBBQyk7Ci0gIH0KLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIGEgRGVjbFJlZkV4cHIgaXMgb3IgYmVoYXZlcyBsaWtlIGEgY29uc3RhbnQuCi1ib29sIElkZW1wb3RlbnRPcGVyYXRpb25DaGVja2VyOjppc0NvbnN0YW50T3JQc2V1ZG9Db25zdGFudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsUmVmRXhwciAqRFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbHlzaXNEZWNsQ29udGV4dCAqQUMpIHsKLSAgLy8gQ2hlY2sgaWYgdGhlIHR5cGUgb2YgdGhlIERlY2wgaXMgY29uc3QtcXVhbGlmaWVkCi0gIGlmIChEUi0+Z2V0VHlwZSgpLmlzQ29uc3RRdWFsaWZpZWQoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvLyBDaGVjayBmb3IgYW4gZW51bQotICBpZiAoaXNhPEVudW1Db25zdGFudERlY2w+KERSLT5nZXREZWNsKCkpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGNvbnN0IFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oRFItPmdldERlY2woKSk7Ci0gIGlmICghVkQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLy8gQ2hlY2sgaWYgdGhlIERlY2wgYmVoYXZlcyBsaWtlIGEgY29uc3RhbnQuIFRoaXMgY2hlY2sgYWxzbyB0YWtlcyBjYXJlIG9mCi0gIC8vIHN0YXRpYyB2YXJpYWJsZXMsIHdoaWNoIGNhbiBvbmx5IGNoYW5nZSBiZXR3ZWVuIGZ1bmN0aW9uIGNhbGxzIGlmIHRoZXkgYXJlCi0gIC8vIG1vZGlmaWVkIGluIHRoZSBBU1QuCi0gIFBzZXVkb0NvbnN0YW50QW5hbHlzaXMgKlBDQSA9IEFDLT5nZXRQc2V1ZG9Db25zdGFudEFuYWx5c2lzKCk7Ci0gIGlmIChQQ0EtPmlzUHNldWRvQ29uc3RhbnQoVkQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUmVjdXJzaXZlbHkgZmluZCBhbnkgc3Vic3RhdGVtZW50cyBjb250YWluaW5nIFZhckRlY2wncyB3aXRoIHN0b3JhZ2Ugb3RoZXIKLS8vIHRoYW4gbG9jYWwKLWJvb2wgSWRlbXBvdGVudE9wZXJhdGlvbkNoZWNrZXI6OmNvbnRhaW5zTm9uTG9jYWxWYXJEZWNsKGNvbnN0IFN0bXQgKlMpIHsKLSAgY29uc3QgRGVjbFJlZkV4cHIgKkRSID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KFMpOwotCi0gIGlmIChEUikKLSAgICBpZiAoY29uc3QgVmFyRGVjbCAqVkQgPSBkeW5fY2FzdDxWYXJEZWNsPihEUi0+Z2V0RGVjbCgpKSkKLSAgICAgIGlmICghVkQtPmhhc0xvY2FsU3RvcmFnZSgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKFN0bXQ6OmNvbnN0X2NoaWxkX2l0ZXJhdG9yIEkgPSBTLT5jaGlsZF9iZWdpbigpOyBJICE9IFMtPmNoaWxkX2VuZCgpOwotICAgICAgKytJKQotICAgIGlmIChjb25zdCBTdG10ICpjaGlsZCA9ICpJKQotICAgICAgaWYgKGNvbnRhaW5zTm9uTG9jYWxWYXJEZWNsKGNoaWxkKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLXZvaWQgZW50bzo6cmVnaXN0ZXJJZGVtcG90ZW50T3BlcmF0aW9uQ2hlY2tlcihDaGVja2VyTWFuYWdlciAmbWdyKSB7Ci0gIG1nci5yZWdpc3RlckNoZWNrZXI8SWRlbXBvdGVudE9wZXJhdGlvbkNoZWNrZXI+KCk7Ci19CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvSWRlbnRpY2FsRXhwckNoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0lkZW50aWNhbEV4cHJDaGVja2VyLmNwcAppbmRleCBlNjk2ZTM4Li5kNWM1MmI0IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvSWRlbnRpY2FsRXhwckNoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9JZGVudGljYWxFeHByQ2hlY2tlci5jcHAKQEAgLTExLDIyICsxMSwyMyBAQAogLy8vIFxicmllZiBUaGlzIGRlZmluZXMgSWRlbnRpY2FsRXhwckNoZWNrZXIsIGEgY2hlY2sgdGhhdCB3YXJucyBhYm91dAogLy8vIHVuaW50ZW5kZWQgdXNlIG9mIGlkZW50aWNhbCBleHByZXNzaW9ucy4KIC8vLwotLy8vIEl0IGNoZWNrcyBmb3IgdXNlIG9mIGlkZW50aWNhbCBleHByZXNzaW9ucyB3aXRoIGNvbXBhcmlzb24gb3BlcmF0b3JzLgorLy8vIEl0IGNoZWNrcyBmb3IgdXNlIG9mIGlkZW50aWNhbCBleHByZXNzaW9ucyB3aXRoIGNvbXBhcmlzb24gb3BlcmF0b3JzIGFuZAorLy8vIGluc2lkZSBjb25kaXRpb25hbCBleHByZXNzaW9ucy4KIC8vLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgIkNsYW5nU0FDaGVja2Vycy5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9SZWN1cnNpdmVBU1RWaXNpdG9yLmgiCiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdUeXBlLmgiCiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyTWFuYWdlci5oIgogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aFNlbnNpdGl2ZS9DaGVja2VyQ29udGV4dC5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9SZWN1cnNpdmVBU1RWaXNpdG9yLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIHVzaW5nIG5hbWVzcGFjZSBlbnRvOwogCi1zdGF0aWMgYm9vbCBpc0lkZW50aWNhbEV4cHIoY29uc3QgQVNUQ29udGV4dCAmQ3R4LCBjb25zdCBFeHByICpFeHByMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpFeHByMik7CitzdGF0aWMgYm9vbCBpc0lkZW50aWNhbFN0bXQoY29uc3QgQVNUQ29udGV4dCAmQ3R4LCBjb25zdCBTdG10ICpTdG10MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpTdG10MiwgYm9vbCBJZ25vcmVTaWRlRWZmZWN0cyA9IGZhbHNlKTsKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAvLyBGaW5kSWRlbnRpY2FsRXhwclZpc2l0b3IgLSBJZGVudGlmeSBub2RlcyB1c2luZyBpZGVudGljYWwgZXhwcmVzc2lvbnMuCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtMzQsMjMgKzM1LDE1MyBAQAogbmFtZXNwYWNlIHsKIGNsYXNzIEZpbmRJZGVudGljYWxFeHByVmlzaXRvcgogICAgIDogcHVibGljIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RmluZElkZW50aWNhbEV4cHJWaXNpdG9yPiB7CisgIEJ1Z1JlcG9ydGVyICZCUjsKKyAgY29uc3QgQ2hlY2tlckJhc2UgKkNoZWNrZXI7CisgIEFuYWx5c2lzRGVjbENvbnRleHQgKkFDOwogcHVibGljOgotICBleHBsaWNpdCBGaW5kSWRlbnRpY2FsRXhwclZpc2l0b3IoQnVnUmVwb3J0ZXIgJkIsIEFuYWx5c2lzRGVjbENvbnRleHQgKkEpCi0gICAgICA6IEJSKEIpLCBBQyhBKSB7fQorICBleHBsaWNpdCBGaW5kSWRlbnRpY2FsRXhwclZpc2l0b3IoQnVnUmVwb3J0ZXIgJkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGVja2VyQmFzZSAqQ2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWx5c2lzRGVjbENvbnRleHQgKkEpCisgICAgICA6IEJSKEIpLCBDaGVja2VyKENoZWNrZXIpLCBBQyhBKSB7fQogICAvLyBGaW5kSWRlbnRpY2FsRXhwclZpc2l0b3Igb25seSB2aXNpdHMgbm9kZXMKLSAgLy8gdGhhdCBhcmUgYmluYXJ5IG9wZXJhdG9ycy4KKyAgLy8gdGhhdCBhcmUgYmluYXJ5IG9wZXJhdG9ycywgaWYgc3RhdGVtZW50cyBvcgorICAvLyBjb25kaXRpb25hbCBvcGVyYXRvcnMuCiAgIGJvb2wgVmlzaXRCaW5hcnlPcGVyYXRvcihjb25zdCBCaW5hcnlPcGVyYXRvciAqQik7CisgIGJvb2wgVmlzaXRJZlN0bXQoY29uc3QgSWZTdG10ICpJKTsKKyAgYm9vbCBWaXNpdENvbmRpdGlvbmFsT3BlcmF0b3IoY29uc3QgQ29uZGl0aW9uYWxPcGVyYXRvciAqQyk7CiAKIHByaXZhdGU6Ci0gIEJ1Z1JlcG9ydGVyICZCUjsKLSAgQW5hbHlzaXNEZWNsQ29udGV4dCAqQUM7CisgIHZvaWQgcmVwb3J0SWRlbnRpY2FsRXhwcihjb25zdCBCaW5hcnlPcGVyYXRvciAqQiwgYm9vbCBDaGVja0JpdHdpc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VSYW5nZT4gU3IpOworICB2b2lkIGNoZWNrQml0d2lzZU9yTG9naWNhbE9wKGNvbnN0IEJpbmFyeU9wZXJhdG9yICpCLCBib29sIENoZWNrQml0d2lzZSk7CisgIHZvaWQgY2hlY2tDb21wYXJpc29uT3AoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkIpOwogfTsKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIAordm9pZCBGaW5kSWRlbnRpY2FsRXhwclZpc2l0b3I6OnJlcG9ydElkZW50aWNhbEV4cHIoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENoZWNrQml0d2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNvdXJjZVJhbmdlPiBTcikgeworICBTdHJpbmdSZWYgTWVzc2FnZTsKKyAgaWYgKENoZWNrQml0d2lzZSkKKyAgICBNZXNzYWdlID0gImlkZW50aWNhbCBleHByZXNzaW9ucyBvbiBib3RoIHNpZGVzIG9mIGJpdHdpc2Ugb3BlcmF0b3IiOworICBlbHNlCisgICAgTWVzc2FnZSA9ICJpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiBsb2dpY2FsIG9wZXJhdG9yIjsKKworICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIEVMb2MgPQorICAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlT3BlcmF0b3JMb2MoQiwgQlIuZ2V0U291cmNlTWFuYWdlcigpKTsKKyAgQlIuRW1pdEJhc2ljUmVwb3J0KEFDLT5nZXREZWNsKCksIENoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAiVXNlIG9mIGlkZW50aWNhbCBleHByZXNzaW9ucyIsCisgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWVzOjpMb2dpY0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSwgRUxvYywgU3IpOworfQorCit2b2lkIEZpbmRJZGVudGljYWxFeHByVmlzaXRvcjo6Y2hlY2tCaXR3aXNlT3JMb2dpY2FsT3AoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDaGVja0JpdHdpc2UpIHsKKyAgU291cmNlUmFuZ2UgU3JbMl07CisKKyAgY29uc3QgRXhwciAqTEhTID0gQi0+Z2V0TEhTKCk7CisgIGNvbnN0IEV4cHIgKlJIUyA9IEItPmdldFJIUygpOworCisgIC8vIFNwbGl0IG9wZXJhdG9ycyBhcyBsb25nIGFzIHdlIHN0aWxsIGhhdmUgb3BlcmF0b3JzIHRvIHNwbGl0IG9uLiBXZSB3aWxsCisgIC8vIGdldCBjYWxsZWQgZm9yIGV2ZXJ5IGJpbmFyeSBvcGVyYXRvciBpbiBhbiBleHByZXNzaW9uIHNvIHRoZXJlIGlzIG5vIG5lZWQKKyAgLy8gdG8gY2hlY2sgZXZlcnkgb25lIGFnYWluc3QgZWFjaCBvdGhlciBoZXJlLCBqdXN0IHRoZSByaWdodCBtb3N0IG9uZSB3aXRoCisgIC8vIHRoZSBvdGhlcnMuCisgIHdoaWxlIChjb25zdCBCaW5hcnlPcGVyYXRvciAqQjIgPSBkeW5fY2FzdDxCaW5hcnlPcGVyYXRvcj4oTEhTKSkgeworICAgIGlmIChCLT5nZXRPcGNvZGUoKSAhPSBCMi0+Z2V0T3Bjb2RlKCkpCisgICAgICBicmVhazsKKyAgICBpZiAoaXNJZGVudGljYWxTdG10KEFDLT5nZXRBU1RDb250ZXh0KCksIFJIUywgQjItPmdldFJIUygpKSkgeworICAgICAgU3JbMF0gPSBSSFMtPmdldFNvdXJjZVJhbmdlKCk7CisgICAgICBTclsxXSA9IEIyLT5nZXRSSFMoKS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgIHJlcG9ydElkZW50aWNhbEV4cHIoQiwgQ2hlY2tCaXR3aXNlLCBTcik7CisgICAgfQorICAgIExIUyA9IEIyLT5nZXRMSFMoKTsKKyAgfQorICAKKyAgaWYgKGlzSWRlbnRpY2FsU3RtdChBQy0+Z2V0QVNUQ29udGV4dCgpLCBSSFMsIExIUykpIHsKKyAgICBTclswXSA9IFJIUy0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICBTclsxXSA9IExIUy0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICByZXBvcnRJZGVudGljYWxFeHByKEIsIENoZWNrQml0d2lzZSwgU3IpOworICB9Cit9CisKK2Jvb2wgRmluZElkZW50aWNhbEV4cHJWaXNpdG9yOjpWaXNpdElmU3RtdChjb25zdCBJZlN0bXQgKkkpIHsKKyAgY29uc3QgU3RtdCAqU3RtdDEgPSBJLT5nZXRUaGVuKCk7CisgIGNvbnN0IFN0bXQgKlN0bXQyID0gSS0+Z2V0RWxzZSgpOworCisgIC8vIENoZWNrIGZvciBpZGVudGljYWwgY29uZGl0aW9uczoKKyAgLy8KKyAgLy8gaWYgKGIpIHsKKyAgLy8gICBmb28xKCk7CisgIC8vIH0gZWxzZSBpZiAoYikgeworICAvLyAgIGZvbzIoKTsKKyAgLy8gfQorICBpZiAoU3RtdDEgJiYgU3RtdDIpIHsKKyAgICBjb25zdCBFeHByICpDb25kMSA9IEktPmdldENvbmQoKTsKKyAgICBjb25zdCBTdG10ICpFbHNlID0gU3RtdDI7CisgICAgd2hpbGUgKGNvbnN0IElmU3RtdCAqSTIgPSBkeW5fY2FzdF9vcl9udWxsPElmU3RtdD4oRWxzZSkpIHsKKyAgICAgIGNvbnN0IEV4cHIgKkNvbmQyID0gSTItPmdldENvbmQoKTsKKyAgICAgIGlmIChpc0lkZW50aWNhbFN0bXQoQUMtPmdldEFTVENvbnRleHQoKSwgQ29uZDEsIENvbmQyLCBmYWxzZSkpIHsKKyAgICAgICAgU291cmNlUmFuZ2UgU3IgPSBDb25kMS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBFTG9jKENvbmQyLCBCUi5nZXRTb3VyY2VNYW5hZ2VyKCksIEFDKTsKKyAgICAgICAgQlIuRW1pdEJhc2ljUmVwb3J0KEFDLT5nZXREZWNsKCksIENoZWNrZXIsICJJZGVudGljYWwgY29uZGl0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWVzOjpMb2dpY0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cHJlc3Npb24gaXMgaWRlbnRpY2FsIHRvIHByZXZpb3VzIGNvbmRpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTG9jLCBTcik7CisgICAgICB9CisgICAgICBFbHNlID0gSTItPmdldEVsc2UoKTsKKyAgICB9CisgIH0KKworICBpZiAoIVN0bXQxIHx8ICFTdG10MikKKyAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb2RlIGxpa2U6CisgIC8vCisgIC8vIGlmIChiKSB7CisgIC8vICAgaSA9IDE7CisgIC8vIH0gZWxzZQorICAvLyAgIGkgPSAxOworICBpZiAoY29uc3QgQ29tcG91bmRTdG10ICpDb21wU3RtdCA9IGR5bl9jYXN0PENvbXBvdW5kU3RtdD4oU3RtdDEpKSB7CisgICAgaWYgKENvbXBTdG10LT5zaXplKCkgPT0gMSkKKyAgICAgIFN0bXQxID0gQ29tcFN0bXQtPmJvZHlfYmFjaygpOworICB9CisgIGlmIChjb25zdCBDb21wb3VuZFN0bXQgKkNvbXBTdG10ID0gZHluX2Nhc3Q8Q29tcG91bmRTdG10PihTdG10MikpIHsKKyAgICBpZiAoQ29tcFN0bXQtPnNpemUoKSA9PSAxKQorICAgICAgU3RtdDIgPSBDb21wU3RtdC0+Ym9keV9iYWNrKCk7CisgIH0KKworICBpZiAoaXNJZGVudGljYWxTdG10KEFDLT5nZXRBU1RDb250ZXh0KCksIFN0bXQxLCBTdG10MiwgdHJ1ZSkpIHsKKyAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gRUxvYyA9CisgICAgICAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlQmVnaW4oSSwgQlIuZ2V0U291cmNlTWFuYWdlcigpLCBBQyk7CisgICAgICBCUi5FbWl0QmFzaWNSZXBvcnQoQUMtPmdldERlY2woKSwgQ2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSWRlbnRpY2FsIGJyYW5jaGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWVzOjpMb2dpY0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIGFuZCBmYWxzZSBicmFuY2hlcyBhcmUgaWRlbnRpY2FsIiwgRUxvYyk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgRmluZElkZW50aWNhbEV4cHJWaXNpdG9yOjpWaXNpdEJpbmFyeU9wZXJhdG9yKGNvbnN0IEJpbmFyeU9wZXJhdG9yICpCKSB7CiAgIEJpbmFyeU9wZXJhdG9yOjpPcGNvZGUgT3AgPSBCLT5nZXRPcGNvZGUoKTsKLSAgaWYgKCFCaW5hcnlPcGVyYXRvcjo6aXNDb21wYXJpc29uT3AoT3ApKQotICAgIHJldHVybiB0cnVlOworCisgIGlmIChCaW5hcnlPcGVyYXRvcjo6aXNCaXR3aXNlT3AoT3ApKQorICAgIGNoZWNrQml0d2lzZU9yTG9naWNhbE9wKEIsIHRydWUpOworCisgIGlmIChCaW5hcnlPcGVyYXRvcjo6aXNMb2dpY2FsT3AoT3ApKQorICAgIGNoZWNrQml0d2lzZU9yTG9naWNhbE9wKEIsIGZhbHNlKTsKKworICBpZiAoQmluYXJ5T3BlcmF0b3I6OmlzQ29tcGFyaXNvbk9wKE9wKSkKKyAgICBjaGVja0NvbXBhcmlzb25PcChCKTsKKworICAvLyBXZSB3YW50IHRvIHZpc2l0IEFMTCBub2RlcyAoc3ViZXhwcmVzc2lvbnMgb2YgYmluYXJ5IGNvbXBhcmlzb24KKyAgLy8gZXhwcmVzc2lvbnMgdG9vKSB0aGF0IGNvbnRhaW5zIGNvbXBhcmlzb24gb3BlcmF0b3JzLgorICAvLyBUcnVlIGlzIGFsd2F5cyByZXR1cm5lZCB0byB0cmF2ZXJzZSBBTEwgbm9kZXMuCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZpbmRJZGVudGljYWxFeHByVmlzaXRvcjo6Y2hlY2tDb21wYXJpc29uT3AoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkIpIHsKKyAgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBPcCA9IEItPmdldE9wY29kZSgpOworCiAgIC8vCiAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24uCiAgIC8vCkBAIC04MywyNiArMjE0LDI2IEBACiAgICAgICAgIChEZWNsUmVmMi0+Z2V0VHlwZSgpLT5oYXNGbG9hdGluZ1JlcHJlc2VudGF0aW9uKCkpKSB7CiAgICAgICBpZiAoRGVjbFJlZjEtPmdldERlY2woKSA9PSBEZWNsUmVmMi0+Z2V0RGVjbCgpKSB7CiAgICAgICAgIGlmICgoT3AgPT0gQk9fRVEpIHx8IChPcCA9PSBCT19ORSkpIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0gZWxzZSBpZiAoKEZsb2F0TGl0MSkgJiYgKEZsb2F0TGl0MikpIHsKICAgICBpZiAoRmxvYXRMaXQxLT5nZXRWYWx1ZSgpLmJpdHdpc2VJc0VxdWFsKEZsb2F0TGl0Mi0+Z2V0VmFsdWUoKSkpIHsKICAgICAgIGlmICgoT3AgPT0gQk9fRVEpIHx8IChPcCA9PSBCT19ORSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICB9CiAgIH0gZWxzZSBpZiAoTEhTLT5nZXRUeXBlKCktPmhhc0Zsb2F0aW5nUmVwcmVzZW50YXRpb24oKSkgewogICAgIC8vIElmIGFueSBzaWRlIG9mIGNvbXBhcmlzb24gb3BlcmF0b3Igc3RpbGwgaGFzIGZsb2F0aW5nLXBvaW50CiAgICAgLy8gcmVwcmVzZW50YXRpb24sIHRoZW4gaXQncyBhbiBleHByZXNzaW9uLiBEb24ndCB3YXJuLgogICAgIC8vIEhlcmUgb25seSBMSFMgaXMgY2hlY2tlZCBzaW5jZSBSSFMgd2lsbCBiZSBpbXBsaWNpdCBjYXN0ZWQgdG8gZmxvYXQuCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuOwogICB9IGVsc2UgewogICAgIC8vIE5vIHNwZWNpYWwgY2FzZSB3aXRoIGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9uLCByZXBvcnQgYXMgdXN1YWwuCiAgIH0KIAotICBpZiAoaXNJZGVudGljYWxFeHByKEFDLT5nZXRBU1RDb250ZXh0KCksIEItPmdldExIUygpLCBCLT5nZXRSSFMoKSkpIHsKKyAgaWYgKGlzSWRlbnRpY2FsU3RtdChBQy0+Z2V0QVNUQ29udGV4dCgpLCBCLT5nZXRMSFMoKSwgQi0+Z2V0UkhTKCkpKSB7CiAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBFTG9jID0KICAgICAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlT3BlcmF0b3JMb2MoQiwgQlIuZ2V0U291cmNlTWFuYWdlcigpKTsKICAgICBTdHJpbmdSZWYgTWVzc2FnZTsKQEAgLTExMCwxNSArMjQxLDQxIEBACiAgICAgICBNZXNzYWdlID0gImNvbXBhcmlzb24gb2YgaWRlbnRpY2FsIGV4cHJlc3Npb25zIGFsd2F5cyBldmFsdWF0ZXMgdG8gdHJ1ZSI7CiAgICAgZWxzZQogICAgICAgTWVzc2FnZSA9ICJjb21wYXJpc29uIG9mIGlkZW50aWNhbCBleHByZXNzaW9ucyBhbHdheXMgZXZhbHVhdGVzIHRvIGZhbHNlIjsKLSAgICBCUi5FbWl0QmFzaWNSZXBvcnQoQUMtPmdldERlY2woKSwgIkNvbXBhcmUgb2YgaWRlbnRpY2FsIGV4cHJlc3Npb25zIiwKKyAgICBCUi5FbWl0QmFzaWNSZXBvcnQoQUMtPmdldERlY2woKSwgQ2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmUgb2YgaWRlbnRpY2FsIGV4cHJlc3Npb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllczo6TG9naWNFcnJvciwgTWVzc2FnZSwgRUxvYyk7CiAgIH0KLSAgLy8gV2Ugd2FudCB0byB2aXNpdCBBTEwgbm9kZXMgKHN1YmV4cHJlc3Npb25zIG9mIGJpbmFyeSBjb21wYXJpc29uCi0gIC8vIGV4cHJlc3Npb25zIHRvbykgdGhhdCBjb250YWlucyBjb21wYXJpc29uIG9wZXJhdG9ycy4KLSAgLy8gVHJ1ZSBpcyBhbHdheXMgcmV0dXJuZWQgdG8gdHJhdmVyc2UgQUxMIG5vZGVzLgorfQorCitib29sIEZpbmRJZGVudGljYWxFeHByVmlzaXRvcjo6VmlzaXRDb25kaXRpb25hbE9wZXJhdG9yKAorICAgIGNvbnN0IENvbmRpdGlvbmFsT3BlcmF0b3IgKkMpIHsKKworICAvLyBDaGVjayBpZiBleHByZXNzaW9ucyBpbiBjb25kaXRpb25hbCBleHByZXNzaW9uIGFyZSBpZGVudGljYWwKKyAgLy8gZnJvbSBhIHN5bWJvbGljIHBvaW50IG9mIHZpZXcuCisKKyAgaWYgKGlzSWRlbnRpY2FsU3RtdChBQy0+Z2V0QVNUQ29udGV4dCgpLCBDLT5nZXRUcnVlRXhwcigpLAorICAgICAgICAgICAgICAgICAgICAgIEMtPmdldEZhbHNlRXhwcigpLCB0cnVlKSkgeworICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gRUxvYyA9CisgICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUNvbmRpdGlvbmFsQ29sb25Mb2MoCisgICAgICAgICAgICBDLCBCUi5nZXRTb3VyY2VNYW5hZ2VyKCkpOworCisgICAgU291cmNlUmFuZ2UgU3JbMl07CisgICAgU3JbMF0gPSBDLT5nZXRUcnVlRXhwcigpLT5nZXRTb3VyY2VSYW5nZSgpOworICAgIFNyWzFdID0gQy0+Z2V0RmFsc2VFeHByKCktPmdldFNvdXJjZVJhbmdlKCk7CisgICAgQlIuRW1pdEJhc2ljUmVwb3J0KAorICAgICAgICBBQy0+Z2V0RGVjbCgpLCBDaGVja2VyLAorICAgICAgICAiSWRlbnRpY2FsIGV4cHJlc3Npb25zIGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24iLAorICAgICAgICBjYXRlZ29yaWVzOjpMb2dpY0Vycm9yLAorICAgICAgICAiaWRlbnRpY2FsIGV4cHJlc3Npb25zIG9uIGJvdGggc2lkZXMgb2YgJzonIGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24iLAorICAgICAgICBFTG9jLCBTcik7CisgIH0KKyAgLy8gV2Ugd2FudCB0byB2aXNpdCBBTEwgbm9kZXMgKGV4cHJlc3Npb25zIGluIGNvbmRpdGlvbmFsCisgIC8vIGV4cHJlc3Npb25zIHRvbykgdGhhdCBjb250YWlucyBjb25kaXRpb25hbCBvcGVyYXRvcnMsCisgIC8vIHRodXMgYWx3YXlzIHJldHVybiB0cnVlIHRvIHRyYXZlcnNlIEFMTCBub2Rlcy4KICAgcmV0dXJuIHRydWU7CiB9Ci0vLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0d28gZXhwcmVzc2lvbiB0cmVlcyBhcmUgaWRlbnRpY2FsIHJlZ2FyZGluZworCisvLy8gXGJyaWVmIERldGVybWluZXMgd2hldGhlciB0d28gc3RhdGVtZW50IHRyZWVzIGFyZSBpZGVudGljYWwgcmVnYXJkaW5nCiAvLy8gb3BlcmF0b3JzIGFuZCBzeW1ib2xzLgogLy8vCiAvLy8gRXhjZXB0aW9uczogZXhwcmVzc2lvbnMgY29udGFpbmluZyBtYWNyb3Mgb3IgZnVuY3Rpb25zIHdpdGggcG9zc2libGUgc2lkZQpAQCAtMTI2LDgyICsyODMsMTg5IEBACiAvLy8gTGltaXRhdGlvbnM6ICh0ICsgdSkgYW5kICh1ICsgdCkgYXJlIG5vdCBjb25zaWRlcmVkIGlkZW50aWNhbC4KIC8vLyB0Kih1ICsgdCkgYW5kIHQqdSArIHQqdCBhcmUgbm90IGNvbnNpZGVyZWQgaWRlbnRpY2FsLgogLy8vCi1zdGF0aWMgYm9vbCBpc0lkZW50aWNhbEV4cHIoY29uc3QgQVNUQ29udGV4dCAmQ3R4LCBjb25zdCBFeHByICpFeHByMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpFeHByMikgewotICAvLyBJZiBFeHByMSAmIEV4cHIyIGFyZSBvZiBkaWZmZXJlbnQgY2xhc3MgdGhlbiB0aGV5IGFyZSBub3QKLSAgLy8gaWRlbnRpY2FsIGV4cHJlc3Npb24uCi0gIGlmIChFeHByMS0+Z2V0U3RtdENsYXNzKCkgIT0gRXhwcjItPmdldFN0bXRDbGFzcygpKQorc3RhdGljIGJvb2wgaXNJZGVudGljYWxTdG10KGNvbnN0IEFTVENvbnRleHQgJkN0eCwgY29uc3QgU3RtdCAqU3RtdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RtdCAqU3RtdDIsIGJvb2wgSWdub3JlU2lkZUVmZmVjdHMpIHsKKworICBpZiAoIVN0bXQxIHx8ICFTdG10MikgeworICAgIGlmICghU3RtdDEgJiYgIVN0bXQyKQorICAgICAgcmV0dXJuIHRydWU7CiAgICAgcmV0dXJuIGZhbHNlOwotICAvLyBJZiBFeHByMSBoYXMgc2lkZSBlZmZlY3RzIHRoZW4gZG9uJ3Qgd2FybiBldmVuIGlmIGV4cHJlc3Npb25zCi0gIC8vIGFyZSBpZGVudGljYWwuCi0gIGlmIChFeHByMS0+SGFzU2lkZUVmZmVjdHMoQ3R4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC8vIElzIGV4cHJlc3Npb24gaXMgYmFzZWQgb24gbWFjcm8gdGhlbiBkb24ndCB3YXJuIGV2ZW4gaWYKLSAgLy8gdGhlIGV4cHJlc3Npb25zIGFyZSBpZGVudGljYWwuCi0gIGlmICgoRXhwcjEtPmdldEV4cHJMb2MoKS5pc01hY3JvSUQoKSkgfHwgKEV4cHIyLT5nZXRFeHByTG9jKCkuaXNNYWNyb0lEKCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLy8gSWYgYWxsIGNoaWxkcmVuIG9mIHR3byBleHByZXNzaW9ucyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gdHJ1ZS4KLSAgRXhwcjo6Y29uc3RfY2hpbGRfaXRlcmF0b3IgSTEgPSBFeHByMS0+Y2hpbGRfYmVnaW4oKTsKLSAgRXhwcjo6Y29uc3RfY2hpbGRfaXRlcmF0b3IgSTIgPSBFeHByMi0+Y2hpbGRfYmVnaW4oKTsKLSAgd2hpbGUgKEkxICE9IEV4cHIxLT5jaGlsZF9lbmQoKSAmJiBJMiAhPSBFeHByMi0+Y2hpbGRfZW5kKCkpIHsKLSAgICBjb25zdCBFeHByICpDaGlsZDEgPSBkeW5fY2FzdDxFeHByPigqSTEpOwotICAgIGNvbnN0IEV4cHIgKkNoaWxkMiA9IGR5bl9jYXN0PEV4cHI+KCpJMik7Ci0gICAgaWYgKCFDaGlsZDEgfHwgIUNoaWxkMiB8fCAhaXNJZGVudGljYWxFeHByKEN0eCwgQ2hpbGQxLCBDaGlsZDIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgICsrSTE7Ci0gICAgKytJMjsKICAgfQotICAvLyBJZiB0aGVyZSBhcmUgZGlmZmVyZW50IG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGUgZXhwcmVzc2lvbnMsIHJldHVybiBmYWxzZS4KLSAgLy8gKFRPRE86IGNoZWNrIGlmIHRoaXMgaXMgYSByZWR1bmRhbnQgY29uZGl0aW9uLikKLSAgaWYgKEkxICE9IEV4cHIxLT5jaGlsZF9lbmQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChJMiAhPSBFeHByMi0+Y2hpbGRfZW5kKCkpCisKKyAgLy8gSWYgU3RtdDEgJiBTdG10MiBhcmUgb2YgZGlmZmVyZW50IGNsYXNzIHRoZW4gdGhleSBhcmUgbm90CisgIC8vIGlkZW50aWNhbCBzdGF0ZW1lbnRzLgorICBpZiAoU3RtdDEtPmdldFN0bXRDbGFzcygpICE9IFN0bXQyLT5nZXRTdG10Q2xhc3MoKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgc3dpdGNoIChFeHByMS0+Z2V0U3RtdENsYXNzKCkpIHsKKyAgY29uc3QgRXhwciAqRXhwcjEgPSBkeW5fY2FzdDxFeHByPihTdG10MSk7CisgIGNvbnN0IEV4cHIgKkV4cHIyID0gZHluX2Nhc3Q8RXhwcj4oU3RtdDIpOworCisgIGlmIChFeHByMSAmJiBFeHByMikgeworICAgIC8vIElmIFN0bXQxIGhhcyBzaWRlIGVmZmVjdHMgdGhlbiBkb24ndCB3YXJuIGV2ZW4gaWYgZXhwcmVzc2lvbnMKKyAgICAvLyBhcmUgaWRlbnRpY2FsLgorICAgIGlmICghSWdub3JlU2lkZUVmZmVjdHMgJiYgRXhwcjEtPkhhc1NpZGVFZmZlY3RzKEN0eCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gSWYgZWl0aGVyIGV4cHJlc3Npb24gY29tZXMgZnJvbSBhIG1hY3JvIHRoZW4gZG9uJ3Qgd2FybiBldmVuIGlmCisgICAgLy8gdGhlIGV4cHJlc3Npb25zIGFyZSBpZGVudGljYWwuCisgICAgaWYgKChFeHByMS0+Z2V0RXhwckxvYygpLmlzTWFjcm9JRCgpKSB8fCAoRXhwcjItPmdldEV4cHJMb2MoKS5pc01hY3JvSUQoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiBhbGwgY2hpbGRyZW4gb2YgdHdvIGV4cHJlc3Npb25zIGFyZSBpZGVudGljYWwsIHJldHVybiB0cnVlLgorICAgIEV4cHI6OmNvbnN0X2NoaWxkX2l0ZXJhdG9yIEkxID0gRXhwcjEtPmNoaWxkX2JlZ2luKCk7CisgICAgRXhwcjo6Y29uc3RfY2hpbGRfaXRlcmF0b3IgSTIgPSBFeHByMi0+Y2hpbGRfYmVnaW4oKTsKKyAgICB3aGlsZSAoSTEgIT0gRXhwcjEtPmNoaWxkX2VuZCgpICYmIEkyICE9IEV4cHIyLT5jaGlsZF9lbmQoKSkgeworICAgICAgaWYgKCEqSTEgfHwgISpJMiB8fCAhaXNJZGVudGljYWxTdG10KEN0eCwgKkkxLCAqSTIsIElnbm9yZVNpZGVFZmZlY3RzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgKytJMTsKKyAgICAgICsrSTI7CisgICAgfQorICAgIC8vIElmIHRoZXJlIGFyZSBkaWZmZXJlbnQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoZSBzdGF0ZW1lbnRzLCByZXR1cm4KKyAgICAvLyBmYWxzZS4KKyAgICBpZiAoSTEgIT0gRXhwcjEtPmNoaWxkX2VuZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChJMiAhPSBFeHByMi0+Y2hpbGRfZW5kKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzd2l0Y2ggKFN0bXQxLT5nZXRTdG10Q2xhc3MoKSkgewogICBkZWZhdWx0OgogICAgIHJldHVybiBmYWxzZTsKKyAgY2FzZSBTdG10OjpDYWxsRXhwckNsYXNzOgogICBjYXNlIFN0bXQ6OkFycmF5U3Vic2NyaXB0RXhwckNsYXNzOgotICBjYXNlIFN0bXQ6OkNTdHlsZUNhc3RFeHByQ2xhc3M6CiAgIGNhc2UgU3RtdDo6SW1wbGljaXRDYXN0RXhwckNsYXNzOgogICBjYXNlIFN0bXQ6OlBhcmVuRXhwckNsYXNzOgorICBjYXNlIFN0bXQ6OkJyZWFrU3RtdENsYXNzOgorICBjYXNlIFN0bXQ6OkNvbnRpbnVlU3RtdENsYXNzOgorICBjYXNlIFN0bXQ6Ok51bGxTdG10Q2xhc3M6CiAgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgU3RtdDo6Q1N0eWxlQ2FzdEV4cHJDbGFzczogeworICAgIGNvbnN0IENTdHlsZUNhc3RFeHByKiBDYXN0RXhwcjEgPSBjYXN0PENTdHlsZUNhc3RFeHByPihTdG10MSk7CisgICAgY29uc3QgQ1N0eWxlQ2FzdEV4cHIqIENhc3RFeHByMiA9IGNhc3Q8Q1N0eWxlQ2FzdEV4cHI+KFN0bXQyKTsKKworICAgIHJldHVybiBDYXN0RXhwcjEtPmdldFR5cGVBc1dyaXR0ZW4oKSA9PSBDYXN0RXhwcjItPmdldFR5cGVBc1dyaXR0ZW4oKTsKKyAgfQorICBjYXNlIFN0bXQ6OlJldHVyblN0bXRDbGFzczogeworICAgIGNvbnN0IFJldHVyblN0bXQgKlJldHVyblN0bXQxID0gY2FzdDxSZXR1cm5TdG10PihTdG10MSk7CisgICAgY29uc3QgUmV0dXJuU3RtdCAqUmV0dXJuU3RtdDIgPSBjYXN0PFJldHVyblN0bXQ+KFN0bXQyKTsKKworICAgIHJldHVybiBpc0lkZW50aWNhbFN0bXQoQ3R4LCBSZXR1cm5TdG10MS0+Z2V0UmV0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN0bXQyLT5nZXRSZXRWYWx1ZSgpLCBJZ25vcmVTaWRlRWZmZWN0cyk7CisgIH0KKyAgY2FzZSBTdG10OjpGb3JTdG10Q2xhc3M6IHsKKyAgICBjb25zdCBGb3JTdG10ICpGb3JTdG10MSA9IGNhc3Q8Rm9yU3RtdD4oU3RtdDEpOworICAgIGNvbnN0IEZvclN0bXQgKkZvclN0bXQyID0gY2FzdDxGb3JTdG10PihTdG10Mik7CisKKyAgICBpZiAoIWlzSWRlbnRpY2FsU3RtdChDdHgsIEZvclN0bXQxLT5nZXRJbml0KCksIEZvclN0bXQyLT5nZXRJbml0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlU2lkZUVmZmVjdHMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghaXNJZGVudGljYWxTdG10KEN0eCwgRm9yU3RtdDEtPmdldENvbmQoKSwgRm9yU3RtdDItPmdldENvbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVTaWRlRWZmZWN0cykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFpc0lkZW50aWNhbFN0bXQoQ3R4LCBGb3JTdG10MS0+Z2V0SW5jKCksIEZvclN0bXQyLT5nZXRJbmMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVTaWRlRWZmZWN0cykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFpc0lkZW50aWNhbFN0bXQoQ3R4LCBGb3JTdG10MS0+Z2V0Qm9keSgpLCBGb3JTdG10Mi0+Z2V0Qm9keSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZVNpZGVFZmZlY3RzKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBjYXNlIFN0bXQ6OkRvU3RtdENsYXNzOiB7CisgICAgY29uc3QgRG9TdG10ICpEU3RtdDEgPSBjYXN0PERvU3RtdD4oU3RtdDEpOworICAgIGNvbnN0IERvU3RtdCAqRFN0bXQyID0gY2FzdDxEb1N0bXQ+KFN0bXQyKTsKKworICAgIGlmICghaXNJZGVudGljYWxTdG10KEN0eCwgRFN0bXQxLT5nZXRDb25kKCksIERTdG10Mi0+Z2V0Q29uZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZVNpZGVFZmZlY3RzKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIWlzSWRlbnRpY2FsU3RtdChDdHgsIERTdG10MS0+Z2V0Qm9keSgpLCBEU3RtdDItPmdldEJvZHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVTaWRlRWZmZWN0cykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2FzZSBTdG10OjpXaGlsZVN0bXRDbGFzczogeworICAgIGNvbnN0IFdoaWxlU3RtdCAqV1N0bXQxID0gY2FzdDxXaGlsZVN0bXQ+KFN0bXQxKTsKKyAgICBjb25zdCBXaGlsZVN0bXQgKldTdG10MiA9IGNhc3Q8V2hpbGVTdG10PihTdG10Mik7CisKKyAgICBpZiAoIWlzSWRlbnRpY2FsU3RtdChDdHgsIFdTdG10MS0+Z2V0Q29uZCgpLCBXU3RtdDItPmdldENvbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVTaWRlRWZmZWN0cykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFpc0lkZW50aWNhbFN0bXQoQ3R4LCBXU3RtdDEtPmdldEJvZHkoKSwgV1N0bXQyLT5nZXRCb2R5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlU2lkZUVmZmVjdHMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgU3RtdDo6SWZTdG10Q2xhc3M6IHsKKyAgICBjb25zdCBJZlN0bXQgKklTdG10MSA9IGNhc3Q8SWZTdG10PihTdG10MSk7CisgICAgY29uc3QgSWZTdG10ICpJU3RtdDIgPSBjYXN0PElmU3RtdD4oU3RtdDIpOworCisgICAgaWYgKCFpc0lkZW50aWNhbFN0bXQoQ3R4LCBJU3RtdDEtPmdldENvbmQoKSwgSVN0bXQyLT5nZXRDb25kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlU2lkZUVmZmVjdHMpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghaXNJZGVudGljYWxTdG10KEN0eCwgSVN0bXQxLT5nZXRUaGVuKCksIElTdG10Mi0+Z2V0VGhlbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZVNpZGVFZmZlY3RzKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIWlzSWRlbnRpY2FsU3RtdChDdHgsIElTdG10MS0+Z2V0RWxzZSgpLCBJU3RtdDItPmdldEVsc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVTaWRlRWZmZWN0cykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2FzZSBTdG10OjpDb21wb3VuZFN0bXRDbGFzczogeworICAgIGNvbnN0IENvbXBvdW5kU3RtdCAqQ29tcFN0bXQxID0gY2FzdDxDb21wb3VuZFN0bXQ+KFN0bXQxKTsKKyAgICBjb25zdCBDb21wb3VuZFN0bXQgKkNvbXBTdG10MiA9IGNhc3Q8Q29tcG91bmRTdG10PihTdG10Mik7CisKKyAgICBpZiAoQ29tcFN0bXQxLT5zaXplKCkgIT0gQ29tcFN0bXQyLT5zaXplKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBDb21wb3VuZFN0bXQ6OmNvbnN0X2JvZHlfaXRlcmF0b3IgSTEgPSBDb21wU3RtdDEtPmJvZHlfYmVnaW4oKTsKKyAgICBDb21wb3VuZFN0bXQ6OmNvbnN0X2JvZHlfaXRlcmF0b3IgSTIgPSBDb21wU3RtdDItPmJvZHlfYmVnaW4oKTsKKyAgICB3aGlsZSAoSTEgIT0gQ29tcFN0bXQxLT5ib2R5X2VuZCgpICYmIEkyICE9IENvbXBTdG10Mi0+Ym9keV9lbmQoKSkgeworICAgICAgaWYgKCFpc0lkZW50aWNhbFN0bXQoQ3R4LCAqSTEsICpJMiwgSWdub3JlU2lkZUVmZmVjdHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICArK0kxOworICAgICAgKytJMjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBjYXNlIFN0bXQ6OkNvbXBvdW5kQXNzaWduT3BlcmF0b3JDbGFzczoKICAgY2FzZSBTdG10OjpCaW5hcnlPcGVyYXRvckNsYXNzOiB7Ci0gICAgY29uc3QgQmluYXJ5T3BlcmF0b3IgKkJpbk9wMSA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihFeHByMSk7Ci0gICAgY29uc3QgQmluYXJ5T3BlcmF0b3IgKkJpbk9wMiA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihFeHByMik7CisgICAgY29uc3QgQmluYXJ5T3BlcmF0b3IgKkJpbk9wMSA9IGNhc3Q8QmluYXJ5T3BlcmF0b3I+KFN0bXQxKTsKKyAgICBjb25zdCBCaW5hcnlPcGVyYXRvciAqQmluT3AyID0gY2FzdDxCaW5hcnlPcGVyYXRvcj4oU3RtdDIpOwogICAgIHJldHVybiBCaW5PcDEtPmdldE9wY29kZSgpID09IEJpbk9wMi0+Z2V0T3Bjb2RlKCk7CiAgIH0KICAgY2FzZSBTdG10OjpDaGFyYWN0ZXJMaXRlcmFsQ2xhc3M6IHsKLSAgICBjb25zdCBDaGFyYWN0ZXJMaXRlcmFsICpDaGFyTGl0MSA9IGR5bl9jYXN0PENoYXJhY3RlckxpdGVyYWw+KEV4cHIxKTsKLSAgICBjb25zdCBDaGFyYWN0ZXJMaXRlcmFsICpDaGFyTGl0MiA9IGR5bl9jYXN0PENoYXJhY3RlckxpdGVyYWw+KEV4cHIyKTsKKyAgICBjb25zdCBDaGFyYWN0ZXJMaXRlcmFsICpDaGFyTGl0MSA9IGNhc3Q8Q2hhcmFjdGVyTGl0ZXJhbD4oU3RtdDEpOworICAgIGNvbnN0IENoYXJhY3RlckxpdGVyYWwgKkNoYXJMaXQyID0gY2FzdDxDaGFyYWN0ZXJMaXRlcmFsPihTdG10Mik7CiAgICAgcmV0dXJuIENoYXJMaXQxLT5nZXRWYWx1ZSgpID09IENoYXJMaXQyLT5nZXRWYWx1ZSgpOwogICB9CiAgIGNhc2UgU3RtdDo6RGVjbFJlZkV4cHJDbGFzczogewotICAgIGNvbnN0IERlY2xSZWZFeHByICpEZWNsUmVmMSA9IGR5bl9jYXN0PERlY2xSZWZFeHByPihFeHByMSk7Ci0gICAgY29uc3QgRGVjbFJlZkV4cHIgKkRlY2xSZWYyID0gZHluX2Nhc3Q8RGVjbFJlZkV4cHI+KEV4cHIyKTsKKyAgICBjb25zdCBEZWNsUmVmRXhwciAqRGVjbFJlZjEgPSBjYXN0PERlY2xSZWZFeHByPihTdG10MSk7CisgICAgY29uc3QgRGVjbFJlZkV4cHIgKkRlY2xSZWYyID0gY2FzdDxEZWNsUmVmRXhwcj4oU3RtdDIpOwogICAgIHJldHVybiBEZWNsUmVmMS0+Z2V0RGVjbCgpID09IERlY2xSZWYyLT5nZXREZWNsKCk7CiAgIH0KICAgY2FzZSBTdG10OjpJbnRlZ2VyTGl0ZXJhbENsYXNzOiB7Ci0gICAgY29uc3QgSW50ZWdlckxpdGVyYWwgKkludExpdDEgPSBkeW5fY2FzdDxJbnRlZ2VyTGl0ZXJhbD4oRXhwcjEpOwotICAgIGNvbnN0IEludGVnZXJMaXRlcmFsICpJbnRMaXQyID0gZHluX2Nhc3Q8SW50ZWdlckxpdGVyYWw+KEV4cHIyKTsKKyAgICBjb25zdCBJbnRlZ2VyTGl0ZXJhbCAqSW50TGl0MSA9IGNhc3Q8SW50ZWdlckxpdGVyYWw+KFN0bXQxKTsKKyAgICBjb25zdCBJbnRlZ2VyTGl0ZXJhbCAqSW50TGl0MiA9IGNhc3Q8SW50ZWdlckxpdGVyYWw+KFN0bXQyKTsKICAgICByZXR1cm4gSW50TGl0MS0+Z2V0VmFsdWUoKSA9PSBJbnRMaXQyLT5nZXRWYWx1ZSgpOwogICB9CiAgIGNhc2UgU3RtdDo6RmxvYXRpbmdMaXRlcmFsQ2xhc3M6IHsKLSAgICBjb25zdCBGbG9hdGluZ0xpdGVyYWwgKkZsb2F0TGl0MSA9IGR5bl9jYXN0PEZsb2F0aW5nTGl0ZXJhbD4oRXhwcjEpOwotICAgIGNvbnN0IEZsb2F0aW5nTGl0ZXJhbCAqRmxvYXRMaXQyID0gZHluX2Nhc3Q8RmxvYXRpbmdMaXRlcmFsPihFeHByMik7CisgICAgY29uc3QgRmxvYXRpbmdMaXRlcmFsICpGbG9hdExpdDEgPSBjYXN0PEZsb2F0aW5nTGl0ZXJhbD4oU3RtdDEpOworICAgIGNvbnN0IEZsb2F0aW5nTGl0ZXJhbCAqRmxvYXRMaXQyID0gY2FzdDxGbG9hdGluZ0xpdGVyYWw+KFN0bXQyKTsKICAgICByZXR1cm4gRmxvYXRMaXQxLT5nZXRWYWx1ZSgpLmJpdHdpc2VJc0VxdWFsKEZsb2F0TGl0Mi0+Z2V0VmFsdWUoKSk7CiAgIH0KKyAgY2FzZSBTdG10OjpTdHJpbmdMaXRlcmFsQ2xhc3M6IHsKKyAgICBjb25zdCBTdHJpbmdMaXRlcmFsICpTdHJpbmdMaXQxID0gY2FzdDxTdHJpbmdMaXRlcmFsPihTdG10MSk7CisgICAgY29uc3QgU3RyaW5nTGl0ZXJhbCAqU3RyaW5nTGl0MiA9IGNhc3Q8U3RyaW5nTGl0ZXJhbD4oU3RtdDIpOworICAgIHJldHVybiBTdHJpbmdMaXQxLT5nZXRTdHJpbmcoKSA9PSBTdHJpbmdMaXQyLT5nZXRTdHJpbmcoKTsKKyAgfQogICBjYXNlIFN0bXQ6Ok1lbWJlckV4cHJDbGFzczogewotICAgIGNvbnN0IE1lbWJlckV4cHIgKk1lbWJlckV4cHIxID0gZHluX2Nhc3Q8TWVtYmVyRXhwcj4oRXhwcjEpOwotICAgIGNvbnN0IE1lbWJlckV4cHIgKk1lbWJlckV4cHIyID0gZHluX2Nhc3Q8TWVtYmVyRXhwcj4oRXhwcjIpOwotICAgIHJldHVybiBNZW1iZXJFeHByMS0+Z2V0TWVtYmVyRGVjbCgpID09IE1lbWJlckV4cHIyLT5nZXRNZW1iZXJEZWNsKCk7CisgICAgY29uc3QgTWVtYmVyRXhwciAqTWVtYmVyU3RtdDEgPSBjYXN0PE1lbWJlckV4cHI+KFN0bXQxKTsKKyAgICBjb25zdCBNZW1iZXJFeHByICpNZW1iZXJTdG10MiA9IGNhc3Q8TWVtYmVyRXhwcj4oU3RtdDIpOworICAgIHJldHVybiBNZW1iZXJTdG10MS0+Z2V0TWVtYmVyRGVjbCgpID09IE1lbWJlclN0bXQyLT5nZXRNZW1iZXJEZWNsKCk7CiAgIH0KICAgY2FzZSBTdG10OjpVbmFyeU9wZXJhdG9yQ2xhc3M6IHsKLSAgICBjb25zdCBVbmFyeU9wZXJhdG9yICpVbmFyeU9wMSA9IGR5bl9jYXN0PFVuYXJ5T3BlcmF0b3I+KEV4cHIxKTsKLSAgICBjb25zdCBVbmFyeU9wZXJhdG9yICpVbmFyeU9wMiA9IGR5bl9jYXN0PFVuYXJ5T3BlcmF0b3I+KEV4cHIyKTsKLSAgICBpZiAoVW5hcnlPcDEtPmdldE9wY29kZSgpICE9IFVuYXJ5T3AyLT5nZXRPcGNvZGUoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gIVVuYXJ5T3AxLT5pc0luY3JlbWVudERlY3JlbWVudE9wKCk7CisgICAgY29uc3QgVW5hcnlPcGVyYXRvciAqVW5hcnlPcDEgPSBjYXN0PFVuYXJ5T3BlcmF0b3I+KFN0bXQxKTsKKyAgICBjb25zdCBVbmFyeU9wZXJhdG9yICpVbmFyeU9wMiA9IGNhc3Q8VW5hcnlPcGVyYXRvcj4oU3RtdDIpOworICAgIHJldHVybiBVbmFyeU9wMS0+Z2V0T3Bjb2RlKCkgPT0gVW5hcnlPcDItPmdldE9wY29kZSgpOwogICB9CiAgIH0KIH0KQEAgLTIxNSw3ICs0NzksNyBAQAogcHVibGljOgogICB2b2lkIGNoZWNrQVNUQ29kZUJvZHkoY29uc3QgRGVjbCAqRCwgQW5hbHlzaXNNYW5hZ2VyICZNZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlciAmQlIpIGNvbnN0IHsKLSAgICBGaW5kSWRlbnRpY2FsRXhwclZpc2l0b3IgVmlzaXRvcihCUiwgTWdyLmdldEFuYWx5c2lzRGVjbENvbnRleHQoRCkpOworICAgIEZpbmRJZGVudGljYWxFeHByVmlzaXRvciBWaXNpdG9yKEJSLCB0aGlzLCBNZ3IuZ2V0QW5hbHlzaXNEZWNsQ29udGV4dChEKSk7CiAgICAgVmlzaXRvci5UcmF2ZXJzZURlY2woY29uc3RfY2FzdDxEZWNsICo+KEQpKTsKICAgfQogfTsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9JdmFySW52YWxpZGF0aW9uQ2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvSXZhckludmFsaWRhdGlvbkNoZWNrZXIuY3BwCmluZGV4IGNjOTQwYmUuLmZkZDFmZGMgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9JdmFySW52YWxpZGF0aW9uQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0l2YXJJbnZhbGlkYXRpb25DaGVja2VyLmNwcApAQCAtNDksNiArNDksOSBAQAogICBEZWZhdWx0Qm9vbCBjaGVja19NaXNzaW5nSW52YWxpZGF0aW9uTWV0aG9kOwogICAvLy8gQ2hlY2sgdGhhdCBhbGwgaXZhcnMgYXJlIGludmFsaWRhdGVkLgogICBEZWZhdWx0Qm9vbCBjaGVja19JbnN0YW5jZVZhcmlhYmxlSW52YWxpZGF0aW9uOworCisgIENoZWNrTmFtZSBjaGVja05hbWVfTWlzc2luZ0ludmFsaWRhdGlvbk1ldGhvZDsKKyAgQ2hlY2tOYW1lIGNoZWNrTmFtZV9JbnN0YW5jZVZhcmlhYmxlSW52YWxpZGF0aW9uOwogfTsKIAogY2xhc3MgSXZhckludmFsaWRhdGlvbkNoZWNrZXJJbXBsIHsKQEAgLTIwMCw3ICsyMDMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqQ0l2YXJEZWNsICpJdmFyRGVjbCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEl2YXJUb1Byb3BNYXBUeSAmSXZhclRvUG9wZXJ0eU1hcCk7CiAKLSAgdm9pZCByZXBvcnROb0ludmFsaWRhdGlvbk1ldGhvZChjb25zdCBPYmpDSXZhckRlY2wgKkZpcnN0SXZhckRlY2wsCisgIHZvaWQgcmVwb3J0Tm9JbnZhbGlkYXRpb25NZXRob2QoQ2hlY2tOYW1lIENoZWNrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmpDSXZhckRlY2wgKkZpcnN0SXZhckRlY2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSXZhclRvUHJvcE1hcFR5ICZJdmFyVG9Qb3BlcnR5TWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJbnRlcmZhY2VELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWlzc2luZ0RlY2xhcmF0aW9uKSBjb25zdDsKQEAgLTIyMywxMCArMjI3LDcgQEAKIH07CiAKIHN0YXRpYyBib29sIGlzSW52YWxpZGF0aW9uTWV0aG9kKGNvbnN0IE9iakNNZXRob2REZWNsICpNLCBib29sIExvb2tGb3JQYXJ0aWFsKSB7Ci0gIGZvciAoc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxBbm5vdGF0ZUF0dHI+Ci0gICAgICAgQUkgPSBNLT5zcGVjaWZpY19hdHRyX2JlZ2luPEFubm90YXRlQXR0cj4oKSwKLSAgICAgICBBRSA9IE0tPnNwZWNpZmljX2F0dHJfZW5kPEFubm90YXRlQXR0cj4oKTsgQUkgIT0gQUU7ICsrQUkpIHsKLSAgICBjb25zdCBBbm5vdGF0ZUF0dHIgKkFubiA9ICpBSTsKKyAgZm9yIChjb25zdCBhdXRvICpBbm4gOiBNLT5zcGVjaWZpY19hdHRyczxBbm5vdGF0ZUF0dHI+KCkpIHsKICAgICBpZiAoIUxvb2tGb3JQYXJ0aWFsICYmCiAgICAgICAgIEFubi0+Z2V0QW5ub3RhdGlvbigpID09ICJvYmpjX2luc3RhbmNlX3ZhcmlhYmxlX2ludmFsaWRhdG9yIikKICAgICAgIHJldHVybiB0cnVlOwpAQCAtMjQ3LDMzICsyNDgsMjIgQEAKICAgLy8gVE9ETzogQ2FjaGUgdGhlIHJlc3VsdHMuCiAKICAgLy8gQ2hlY2sgYWxsIG1ldGhvZHMuCi0gIGZvciAoT2JqQ0NvbnRhaW5lckRlY2w6Om1ldGhvZF9pdGVyYXRvcgotICAgICAgSSA9IEQtPm1ldGhfYmVnaW4oKSwKLSAgICAgIEUgPSBELT5tZXRoX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKk1ESSA9ICpJOwotICAgICAgaWYgKGlzSW52YWxpZGF0aW9uTWV0aG9kKE1ESSwgUGFydGlhbCkpCi0gICAgICAgIE91dEluZm8uYWRkSW52YWxpZGF0aW9uTWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8T2JqQ01ldGhvZERlY2w+KE1ESS0+Z2V0Q2Fub25pY2FsRGVjbCgpKSk7Ci0gIH0KKyAgZm9yIChjb25zdCBhdXRvICpNREkgOiBELT5tZXRob2RzKCkpCisgICAgaWYgKGlzSW52YWxpZGF0aW9uTWV0aG9kKE1ESSwgUGFydGlhbCkpCisgICAgICBPdXRJbmZvLmFkZEludmFsaWRhdGlvbk1ldGhvZCgKKyAgICAgICAgICBjYXN0PE9iakNNZXRob2REZWNsPihNREktPmdldENhbm9uaWNhbERlY2woKSkpOwogCiAgIC8vIElmIGludGVyZmFjZSwgY2hlY2sgYWxsIHBhcmVudCBwcm90b2NvbHMgYW5kIHN1cGVyLgogICBpZiAoY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKkludGVyZkQgPSBkeW5fY2FzdDxPYmpDSW50ZXJmYWNlRGVjbD4oRCkpIHsKIAogICAgIC8vIFZpc2l0IGFsbCBwcm90b2NvbHMuCi0gICAgZm9yIChPYmpDSW50ZXJmYWNlRGVjbDo6cHJvdG9jb2xfaXRlcmF0b3IKLSAgICAgICAgSSA9IEludGVyZkQtPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgIEUgPSBJbnRlcmZELT5wcm90b2NvbF9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIGNvbnRhaW5zSW52YWxpZGF0aW9uTWV0aG9kKCgqSSktPmdldERlZmluaXRpb24oKSwgT3V0SW5mbywgUGFydGlhbCk7Ci0gICAgfQorICAgIGZvciAoY29uc3QgYXV0byAqSSA6IEludGVyZkQtPnByb3RvY29scygpKQorICAgICAgY29udGFpbnNJbnZhbGlkYXRpb25NZXRob2QoSS0+Z2V0RGVmaW5pdGlvbigpLCBPdXRJbmZvLCBQYXJ0aWFsKTsKIAogICAgIC8vIFZpc2l0IGFsbCBjYXRlZ29yaWVzIGluIGNhc2UgdGhlIGludmFsaWRhdGlvbiBtZXRob2QgaXMgZGVjbGFyZWQgaW4KICAgICAvLyBhIGNhdGVnb3J5LgotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnZpc2libGVfZXh0ZW5zaW9uc19pdGVyYXRvcgotICAgICAgICAgICBFeHQgPSBJbnRlcmZELT52aXNpYmxlX2V4dGVuc2lvbnNfYmVnaW4oKSwKLSAgICAgICAgICAgRXh0RW5kID0gSW50ZXJmRC0+dmlzaWJsZV9leHRlbnNpb25zX2VuZCgpOwotICAgICAgICAgRXh0ICE9IEV4dEVuZDsgKytFeHQpIHsKLSAgICAgIGNvbnRhaW5zSW52YWxpZGF0aW9uTWV0aG9kKCpFeHQsIE91dEluZm8sIFBhcnRpYWwpOwotICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gKkV4dCA6IEludGVyZkQtPnZpc2libGVfZXh0ZW5zaW9ucygpKQorICAgICAgY29udGFpbnNJbnZhbGlkYXRpb25NZXRob2QoRXh0LCBPdXRJbmZvLCBQYXJ0aWFsKTsKIAogICAgIGNvbnRhaW5zSW52YWxpZGF0aW9uTWV0aG9kKEludGVyZkQtPmdldFN1cGVyQ2xhc3MoKSwgT3V0SW5mbywgUGFydGlhbCk7CiAgICAgcmV0dXJuOwpAQCAtMjgxLDEwICsyNzEsOCBAQAogCiAgIC8vIElmIHByb3RvY29sLCBjaGVjayBhbGwgcGFyZW50IHByb3RvY29scy4KICAgaWYgKGNvbnN0IE9iakNQcm90b2NvbERlY2wgKlByb3REID0gZHluX2Nhc3Q8T2JqQ1Byb3RvY29sRGVjbD4oRCkpIHsKLSAgICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjpwcm90b2NvbF9pdGVyYXRvcgotICAgICAgICBJID0gUHJvdEQtPnByb3RvY29sX2JlZ2luKCksCi0gICAgICAgIEUgPSBQcm90RC0+cHJvdG9jb2xfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBjb250YWluc0ludmFsaWRhdGlvbk1ldGhvZCgoKkkpLT5nZXREZWZpbml0aW9uKCksIE91dEluZm8sIFBhcnRpYWwpOworICAgIGZvciAoY29uc3QgYXV0byAqSSA6IFByb3RELT5wcm90b2NvbHMoKSkgeworICAgICAgY29udGFpbnNJbnZhbGlkYXRpb25NZXRob2QoSS0+Z2V0RGVmaW5pdGlvbigpLCBPdXRJbmZvLCBQYXJ0aWFsKTsKICAgICB9CiAgICAgcmV0dXJuOwogICB9CkBAIC00NzYsNyArNDY0LDggQEAKICAgLy8gUmVwb3J0IGFuIGVycm9yIGluIGNhc2Ugbm9uZSBvZiB0aGUgaW52YWxpZGF0aW9uIG1ldGhvZHMgYXJlIGRlY2xhcmVkLgogICBpZiAoIUluZm8ubmVlZHNJbnZhbGlkYXRpb24oKSAmJiAhUGFydGlhbEluZm8ubmVlZHNJbnZhbGlkYXRpb24oKSkgewogICAgIGlmIChGaWx0ZXIuY2hlY2tfTWlzc2luZ0ludmFsaWRhdGlvbk1ldGhvZCkKLSAgICAgIHJlcG9ydE5vSW52YWxpZGF0aW9uTWV0aG9kKEZpcnN0SXZhckRlY2wsIEl2YXJUb1BvcGVydHlNYXAsIEludGVyZmFjZUQsCisgICAgICByZXBvcnROb0ludmFsaWRhdGlvbk1ldGhvZChGaWx0ZXIuY2hlY2tOYW1lX01pc3NpbmdJbnZhbGlkYXRpb25NZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXJzdEl2YXJEZWNsLCBJdmFyVG9Qb3BlcnR5TWFwLCBJbnRlcmZhY2VELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNaXNzaW5nRGVjbGFyYXRpb24qLyB0cnVlKTsKICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaW52YWxpZGF0aW9uIG1ldGhvZHMsIHRoZXJlIGlzIG5vIGl2YXIgdmFsaWRhdGlvbiB3b3JrCiAgICAgLy8gdG8gYmUgZG9uZS4KQEAgLTUzMiwxNyArNTIxLDE3IEBACiAgICAgICAgIHJlcG9ydEl2YXJOZWVkc0ludmFsaWRhdGlvbihJLT5maXJzdCwgSXZhclRvUG9wZXJ0eU1hcCwgMCk7CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIE90aGVyd2lzZSwgbm8gaW52YWxpZGF0aW9uIG1ldGhvZHMgd2VyZSBpbXBsZW1lbnRlZC4KLSAgICAgIHJlcG9ydE5vSW52YWxpZGF0aW9uTWV0aG9kKEZpcnN0SXZhckRlY2wsIEl2YXJUb1BvcGVydHlNYXAsIEludGVyZmFjZUQsCisgICAgICByZXBvcnROb0ludmFsaWRhdGlvbk1ldGhvZChGaWx0ZXIuY2hlY2tOYW1lX0luc3RhbmNlVmFyaWFibGVJbnZhbGlkYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXJzdEl2YXJEZWNsLCBJdmFyVG9Qb3BlcnR5TWFwLCBJbnRlcmZhY2VELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNaXNzaW5nRGVjbGFyYXRpb24qLyBmYWxzZSk7CiAgICAgfQogICB9CiB9CiAKLXZvaWQgSXZhckludmFsaWRhdGlvbkNoZWNrZXJJbXBsOjoKLXJlcG9ydE5vSW52YWxpZGF0aW9uTWV0aG9kKGNvbnN0IE9iakNJdmFyRGVjbCAqRmlyc3RJdmFyRGVjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEl2YXJUb1Byb3BNYXBUeSAmSXZhclRvUG9wZXJ0eU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJbnRlcmZhY2VELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNaXNzaW5nRGVjbGFyYXRpb24pIGNvbnN0IHsKK3ZvaWQgSXZhckludmFsaWRhdGlvbkNoZWNrZXJJbXBsOjpyZXBvcnROb0ludmFsaWRhdGlvbk1ldGhvZCgKKyAgICBDaGVja05hbWUgQ2hlY2tOYW1lLCBjb25zdCBPYmpDSXZhckRlY2wgKkZpcnN0SXZhckRlY2wsCisgICAgY29uc3QgSXZhclRvUHJvcE1hcFR5ICZJdmFyVG9Qb3BlcnR5TWFwLAorICAgIGNvbnN0IE9iakNJbnRlcmZhY2VEZWNsICpJbnRlcmZhY2VELCBib29sIE1pc3NpbmdEZWNsYXJhdGlvbikgY29uc3QgewogICBTbWFsbFN0cmluZzwxMjg+IHNidWY7CiAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gb3Moc2J1Zik7CiAgIGFzc2VydChGaXJzdEl2YXJEZWNsKTsKQEAgLTU1Nyw3ICs1NDYsNyBAQAogICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIEl2YXJEZWNMb2NhdGlvbiA9CiAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlQmVnaW4oRmlyc3RJdmFyRGVjbCwgQlIuZ2V0U291cmNlTWFuYWdlcigpKTsKIAotICBCUi5FbWl0QmFzaWNSZXBvcnQoRmlyc3RJdmFyRGVjbCwgIkluY29tcGxldGUgaW52YWxpZGF0aW9uIiwKKyAgQlIuRW1pdEJhc2ljUmVwb3J0KEZpcnN0SXZhckRlY2wsIENoZWNrTmFtZSwgIkluY29tcGxldGUgaW52YWxpZGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3JpZXM6OkNvcmVGb3VuZGF0aW9uT2JqZWN0aXZlQywgb3Muc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICBJdmFyRGVjTG9jYXRpb24pOwogfQpAQCAtNTc1LDE1ICs1NjQsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUVuZChNZXRob2RELT5nZXRCb2R5KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUi5nZXRTb3VyY2VNYW5hZ2VyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZ3IuZ2V0QW5hbHlzaXNEZWNsQ29udGV4dChNZXRob2REKSk7Ci0gICAgQlIuRW1pdEJhc2ljUmVwb3J0KE1ldGhvZEQsICJJbmNvbXBsZXRlIGludmFsaWRhdGlvbiIsCisgICAgQlIuRW1pdEJhc2ljUmVwb3J0KE1ldGhvZEQsIEZpbHRlci5jaGVja05hbWVfSW5zdGFuY2VWYXJpYWJsZUludmFsaWRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkluY29tcGxldGUgaW52YWxpZGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllczo6Q29yZUZvdW5kYXRpb25PYmplY3RpdmVDLCBvcy5zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjTG9jYXRpb24pOwogICB9IGVsc2UgewotICAgIEJSLkVtaXRCYXNpY1JlcG9ydChJdmFyRCwgIkluY29tcGxldGUgaW52YWxpZGF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcmllczo6Q29yZUZvdW5kYXRpb25PYmplY3RpdmVDLCBvcy5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlQmVnaW4oSXZhckQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSLmdldFNvdXJjZU1hbmFnZXIoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBCUi5FbWl0QmFzaWNSZXBvcnQoCisgICAgICAgIEl2YXJELCBGaWx0ZXIuY2hlY2tOYW1lX0luc3RhbmNlVmFyaWFibGVJbnZhbGlkYXRpb24sCisgICAgICAgICJJbmNvbXBsZXRlIGludmFsaWRhdGlvbiIsIGNhdGVnb3JpZXM6OkNvcmVGb3VuZGF0aW9uT2JqZWN0aXZlQywKKyAgICAgICAgb3Muc3RyKCksCisgICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUJlZ2luKEl2YXJELCBCUi5nZXRTb3VyY2VNYW5hZ2VyKCkpKTsKICAgfQogfQogCkBAIC03NTAsMTAgKzc0MCwxMyBAQAogfTsKIH0KIAotI2RlZmluZSBSRUdJU1RFUl9DSEVDS0VSKG5hbWUpIFwKLXZvaWQgZW50bzo6cmVnaXN0ZXIjI25hbWUoQ2hlY2tlck1hbmFnZXIgJm1ncikge1wKLSAgbWdyLnJlZ2lzdGVyQ2hlY2tlcjxJdmFySW52YWxpZGF0aW9uQ2hlY2tlcj4oKS0+RmlsdGVyLmNoZWNrXyMjbmFtZSA9IHRydWU7XAotfQorI2RlZmluZSBSRUdJU1RFUl9DSEVDS0VSKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBlbnRvOjpyZWdpc3RlciMjbmFtZShDaGVja2VyTWFuYWdlciAmbWdyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSXZhckludmFsaWRhdGlvbkNoZWNrZXIgKmNoZWNrZXIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtZ3IucmVnaXN0ZXJDaGVja2VyPEl2YXJJbnZhbGlkYXRpb25DaGVja2VyPigpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGVja2VyLT5GaWx0ZXIuY2hlY2tfIyNuYW1lID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hlY2tlci0+RmlsdGVyLmNoZWNrTmFtZV8jI25hbWUgPSBtZ3IuZ2V0Q3VycmVudENoZWNrTmFtZSgpOyAgICAgICAgICAgICAgXAorICB9CiAKIFJFR0lTVEVSX0NIRUNLRVIoSW5zdGFuY2VWYXJpYWJsZUludmFsaWRhdGlvbikKIFJFR0lTVEVSX0NIRUNLRVIoTWlzc2luZ0ludmFsaWRhdGlvbk1ldGhvZCkKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9MTFZNQ29udmVudGlvbnNDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9MTFZNQ29udmVudGlvbnNDaGVja2VyLmNwcAppbmRleCAwMmE3Y2MzLi4xN2ViZjllIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTExWTUNvbnZlbnRpb25zQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0xMVk1Db252ZW50aW9uc0NoZWNrZXIuY3BwCkBAIC0xMTUsMTEgKzExNSwxNCBAQAogCiBuYW1lc3BhY2UgewogY2xhc3MgU3RyaW5nUmVmQ2hlY2tlclZpc2l0b3IgOiBwdWJsaWMgU3RtdFZpc2l0b3I8U3RyaW5nUmVmQ2hlY2tlclZpc2l0b3I+IHsKLSAgQnVnUmVwb3J0ZXIgJkJSOwogICBjb25zdCBEZWNsICpEZWNsV2l0aElzc3VlOworICBCdWdSZXBvcnRlciAmQlI7CisgIGNvbnN0IENoZWNrZXJCYXNlICpDaGVja2VyOworCiBwdWJsaWM6Ci0gIFN0cmluZ1JlZkNoZWNrZXJWaXNpdG9yKGNvbnN0IERlY2wgKmRlY2xXaXRoSXNzdWUsIEJ1Z1JlcG9ydGVyICZicikKLSAgICA6IEJSKGJyKSwgRGVjbFdpdGhJc3N1ZShkZWNsV2l0aElzc3VlKSB7fQorICBTdHJpbmdSZWZDaGVja2VyVmlzaXRvcihjb25zdCBEZWNsICpkZWNsV2l0aElzc3VlLCBCdWdSZXBvcnRlciAmYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoZWNrZXJCYXNlICpjaGVja2VyKQorICAgICAgOiBEZWNsV2l0aElzc3VlKGRlY2xXaXRoSXNzdWUpLCBCUihiciksIENoZWNrZXIoY2hlY2tlcikge30KICAgdm9pZCBWaXNpdENoaWxkcmVuKFN0bXQgKlMpIHsKICAgICBmb3IgKFN0bXQ6OmNoaWxkX2l0ZXJhdG9yIEkgPSBTLT5jaGlsZF9iZWdpbigpLCBFID0gUy0+Y2hpbGRfZW5kKCkgOwogICAgICAgSSAhPSBFOyArK0kpCkBAIC0xMzMsMTYgKzEzNiwxNyBAQAogfTsKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIAotc3RhdGljIHZvaWQgQ2hlY2tTdHJpbmdSZWZBc3NpZ25lZFRlbXBvcmFyeShjb25zdCBEZWNsICpELCBCdWdSZXBvcnRlciAmQlIpIHsKLSAgU3RyaW5nUmVmQ2hlY2tlclZpc2l0b3Igd2Fsa2VyKEQsIEJSKTsKK3N0YXRpYyB2b2lkIENoZWNrU3RyaW5nUmVmQXNzaWduZWRUZW1wb3JhcnkoY29uc3QgRGVjbCAqRCwgQnVnUmVwb3J0ZXIgJkJSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGVja2VyQmFzZSAqQ2hlY2tlcikgeworICBTdHJpbmdSZWZDaGVja2VyVmlzaXRvciB3YWxrZXIoRCwgQlIsIENoZWNrZXIpOwogICB3YWxrZXIuVmlzaXQoRC0+Z2V0Qm9keSgpKTsKIH0KIAogdm9pZCBTdHJpbmdSZWZDaGVja2VyVmlzaXRvcjo6VmlzaXREZWNsU3RtdChEZWNsU3RtdCAqUykgewogICBWaXNpdENoaWxkcmVuKFMpOwogCi0gIGZvciAoRGVjbFN0bXQ6OmRlY2xfaXRlcmF0b3IgSSA9IFMtPmRlY2xfYmVnaW4oKSwgRSA9IFMtPmRlY2xfZW5kKCk7SSE9RTsgKytJKQotICAgIGlmIChWYXJEZWNsICpWRCA9IGR5bl9jYXN0PFZhckRlY2w+KCpJKSkKKyAgZm9yIChhdXRvICpJIDogUy0+ZGVjbHMoKSkKKyAgICBpZiAoVmFyRGVjbCAqVkQgPSBkeW5fY2FzdDxWYXJEZWNsPihJKSkKICAgICAgIFZpc2l0VmFyRGVjbChWRCk7CiB9CiAKQEAgLTE3OSw3ICsxODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgInN0ZDo6c3RyaW5nIHRoYXQgaXQgb3V0bGl2ZXMiOwogICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIFZETG9jID0KICAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uOjpjcmVhdGVCZWdpbihWRCwgQlIuZ2V0U291cmNlTWFuYWdlcigpKTsKLSAgQlIuRW1pdEJhc2ljUmVwb3J0KERlY2xXaXRoSXNzdWUsIGRlc2MsICJMTFZNIENvbnZlbnRpb25zIiwgZGVzYywKKyAgQlIuRW1pdEJhc2ljUmVwb3J0KERlY2xXaXRoSXNzdWUsIENoZWNrZXIsIGRlc2MsICJMTFZNIENvbnZlbnRpb25zIiwgZGVzYywKICAgICAgICAgICAgICAgICAgICAgIFZETG9jLCBJbml0LT5nZXRTb3VyY2VSYW5nZSgpKTsKIH0KIApAQCAtMTk3LDkgKzIwMSw3IEBACiAgIGlmIChJc0NsYW5nU3RtdChSKSB8fCBJc0NsYW5nVHlwZShSKSB8fCBJc0NsYW5nRGVjbChSKSB8fCBJc0NsYW5nQXR0cihSKSkKICAgICByZXR1cm4gdHJ1ZTsKIAotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IFItPmJhc2VzX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gUi0+YmFzZXNfZW5kKCk7IEkhPUU7ICsrSSkgewotICAgIENYWEJhc2VTcGVjaWZpZXIgQlMgPSAqSTsKKyAgZm9yIChjb25zdCBhdXRvICZCUyA6IFItPmJhc2VzKCkpIHsKICAgICBRdWFsVHlwZSBUID0gQlMuZ2V0VHlwZSgpOwogICAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpiYXNlVCA9IFQtPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKICAgICAgIENYWFJlY29yZERlY2wgKmJhc2VEID0gY2FzdDxDWFhSZWNvcmREZWNsPihiYXNlVC0+Z2V0RGVjbCgpKTsKQEAgLTIxNiwyMyArMjE4LDI2IEBACiAgIFNtYWxsVmVjdG9yPEZpZWxkRGVjbCosIDEwPiBGaWVsZENoYWluOwogICBjb25zdCBDWFhSZWNvcmREZWNsICpSb290OwogICBCdWdSZXBvcnRlciAmQlI7CisgIGNvbnN0IENoZWNrZXJCYXNlICpDaGVja2VyOworCiBwdWJsaWM6Ci0gIEFTVEZpZWxkVmlzaXRvcihjb25zdCBDWFhSZWNvcmREZWNsICpyb290LCBCdWdSZXBvcnRlciAmYnIpCi0gICAgOiBSb290KHJvb3QpLCBCUihicikge30KKyAgQVNURmllbGRWaXNpdG9yKGNvbnN0IENYWFJlY29yZERlY2wgKnJvb3QsIEJ1Z1JlcG9ydGVyICZiciwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENoZWNrZXJCYXNlICpjaGVja2VyKQorICAgICAgOiBSb290KHJvb3QpLCBCUihiciksIENoZWNrZXIoY2hlY2tlcikge30KIAogICB2b2lkIFZpc2l0KEZpZWxkRGVjbCAqRCk7CiAgIHZvaWQgUmVwb3J0RXJyb3IoUXVhbFR5cGUgVCk7CiB9OwogfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQogCi1zdGF0aWMgdm9pZCBDaGVja0FTVE1lbW9yeShjb25zdCBDWFhSZWNvcmREZWNsICpSLCBCdWdSZXBvcnRlciAmQlIpIHsKK3N0YXRpYyB2b2lkIENoZWNrQVNUTWVtb3J5KGNvbnN0IENYWFJlY29yZERlY2wgKlIsIEJ1Z1JlcG9ydGVyICZCUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoZWNrZXJCYXNlICpDaGVja2VyKSB7CiAgIGlmICghSXNQYXJ0T2ZBU1QoUikpCiAgICAgcmV0dXJuOwogCi0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgSSA9IFItPmZpZWxkX2JlZ2luKCksIEUgPSBSLT5maWVsZF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIEFTVEZpZWxkVmlzaXRvciB3YWxrZXIoUiwgQlIpOwotICAgIHdhbGtlci5WaXNpdCgqSSk7CisgIGZvciAoYXV0byAqSSA6IFItPmZpZWxkcygpKSB7CisgICAgQVNURmllbGRWaXNpdG9yIHdhbGtlcihSLCBCUiwgQ2hlY2tlcik7CisgICAgd2Fsa2VyLlZpc2l0KEkpOwogICB9CiB9CiAKQEAgLTI0Niw5ICsyNTEsOCBAQAogCiAgIGlmIChjb25zdCBSZWNvcmRUeXBlICpSVCA9IFQtPmdldEFzPFJlY29yZFR5cGU+KCkpIHsKICAgICBjb25zdCBSZWNvcmREZWNsICpSRCA9IFJULT5nZXREZWNsKCktPmdldERlZmluaXRpb24oKTsKLSAgICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEkgPSBSRC0+ZmllbGRfYmVnaW4oKSwgRSA9IFJELT5maWVsZF9lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKQotICAgICAgVmlzaXQoKkkpOworICAgIGZvciAoYXV0byAqSSA6IFJELT5maWVsZHMoKSkKKyAgICAgIFZpc2l0KEkpOwogICB9CiAKICAgRmllbGRDaGFpbi5wb3BfYmFjaygpOwpAQCAtMjg0LDggKzI4OCw4IEBACiAgIC8vIHRoZSBjbGFzcyBtYXkgYmUgaW4gdGhlIGhlYWRlciBmaWxlLCBmb3IgZXhhbXBsZSkuCiAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gTCA9IFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUJlZ2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkQ2hhaW4uZnJvbnQoKSwgQlIuZ2V0U291cmNlTWFuYWdlcigpKTsKLSAgQlIuRW1pdEJhc2ljUmVwb3J0KFJvb3QsICJBU1Qgbm9kZSBhbGxvY2F0ZXMgaGVhcCBtZW1vcnkiLCAiTExWTSBDb252ZW50aW9ucyIsCi0gICAgICAgICAgICAgICAgICAgICBvcy5zdHIoKSwgTCk7CisgIEJSLkVtaXRCYXNpY1JlcG9ydChSb290LCBDaGVja2VyLCAiQVNUIG5vZGUgYWxsb2NhdGVzIGhlYXAgbWVtb3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICJMTFZNIENvbnZlbnRpb25zIiwgb3Muc3RyKCksIEwpOwogfQogCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtMzAwLDEyICszMDQsMTIgQEAKICAgdm9pZCBjaGVja0FTVERlY2woY29uc3QgQ1hYUmVjb3JkRGVjbCAqUiwgQW5hbHlzaXNNYW5hZ2VyJiBtZ3IsCiAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyICZCUikgY29uc3QgewogICAgIGlmIChSLT5pc0NvbXBsZXRlRGVmaW5pdGlvbigpKQotICAgICAgQ2hlY2tBU1RNZW1vcnkoUiwgQlIpOworICAgICAgQ2hlY2tBU1RNZW1vcnkoUiwgQlIsIHRoaXMpOwogICB9CiAKICAgdm9pZCBjaGVja0FTVENvZGVCb2R5KGNvbnN0IERlY2wgKkQsIEFuYWx5c2lzTWFuYWdlciYgbWdyLAogICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXIgJkJSKSBjb25zdCB7Ci0gICAgQ2hlY2tTdHJpbmdSZWZBc3NpZ25lZFRlbXBvcmFyeShELCBCUik7CisgICAgQ2hlY2tTdHJpbmdSZWZBc3NpZ25lZFRlbXBvcmFyeShELCBCUiwgdGhpcyk7CiAgIH0KIH07CiB9CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTWFjT1NLZXljaGFpbkFQSUNoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL01hY09TS2V5Y2hhaW5BUElDaGVja2VyLmNwcAppbmRleCBmMWYwNmM3Li40YTI5M2M0IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTWFjT1NLZXljaGFpbkFQSUNoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9NYWNPU0tleWNoYWluQVBJQ2hlY2tlci5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKIGNsYXNzIE1hY09TS2V5Y2hhaW5BUElDaGVja2VyIDogcHVibGljIENoZWNrZXI8Y2hlY2s6OlByZVN0bXQ8Q2FsbEV4cHI+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjazo6UG9zdFN0bXQ8Q2FsbEV4cHI+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjazo6RGVhZFN5bWJvbHM+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUOwogCiBwdWJsaWM6CiAgIC8vLyBBbGxvY2F0aW9uU3RhdGUgaXMgYSBwYXJ0IG9mIHRoZSBjaGVja2VyIHNwZWNpZmljIHN0YXRlIHRvZ2V0aGVyIHdpdGggdGhlCkBAIC05MSw3ICs5MSw3IEBACiAKICAgaW5saW5lIHZvaWQgaW5pdEJ1Z1R5cGUoKSBjb25zdCB7CiAgICAgaWYgKCFCVCkKLSAgICAgIEJULnJlc2V0KG5ldyBCdWdUeXBlKCJJbXByb3BlciB1c2Ugb2YgU2VjS2V5Y2hhaW4gQVBJIiwKKyAgICAgIEJULnJlc2V0KG5ldyBCdWdUeXBlKHRoaXMsICJJbXByb3BlciB1c2Ugb2YgU2VjS2V5Y2hhaW4gQVBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUEkgTWlzdXNlIChBcHBsZSkiKSk7CiAgIH0KIApAQCAtMTM5LDcgKzEzOSw3IEBACiAgICAgU2VjS2V5Y2hhaW5CdWdWaXNpdG9yKFN5bWJvbFJlZiBTKSA6IFN5bShTKSB7fQogICAgIHZpcnR1YWwgflNlY0tleWNoYWluQnVnVmlzaXRvcigpIHt9CiAKLSAgICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IHsKKyAgICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHN0YXRpYyBpbnQgWCA9IDA7CiAgICAgICBJRC5BZGRQb2ludGVyKCZYKTsKICAgICAgIElELkFkZFBvaW50ZXIoU3ltKTsKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgIFBhdGhEaWFnbm9zdGljUGllY2UgKlZpc2l0Tm9kZShjb25zdCBFeHBsb2RlZE5vZGUgKk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqUHJldk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUikgb3ZlcnJpZGU7CiAgIH07CiB9OwogfQpAQCAtNTc1LDcgKzU3NSw3IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgc3RhdGljIFNpbXBsZVByb2dyYW1Qb2ludFRhZyBUYWcoIk1hY09TS2V5Y2hhaW5BUElDaGVja2VyIDogRGVhZFN5bWJvbHNMZWFrIik7CisgIHN0YXRpYyBDaGVja2VyUHJvZ3JhbVBvaW50VGFnIFRhZyh0aGlzLCAiRGVhZFN5bWJvbHNMZWFrIik7CiAgIEV4cGxvZGVkTm9kZSAqTiA9IEMuYWRkVHJhbnNpdGlvbihDLmdldFN0YXRlKCksIEMuZ2V0UHJlZGVjZXNzb3IoKSwgJlRhZyk7CiAKICAgLy8gR2VuZXJhdGUgdGhlIGVycm9yIHJlcG9ydHMuCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTWFjT1NYQVBJQ2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTWFjT1NYQVBJQ2hlY2tlci5jcHAKaW5kZXggMzJlYmI1MS4uZDllNDY5OSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL01hY09TWEFQSUNoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9NYWNPU1hBUElDaGVja2VyLmNwcApAQCAtMzEsNyArMzEsNyBAQAogCiBuYW1lc3BhY2UgewogY2xhc3MgTWFjT1NYQVBJQ2hlY2tlciA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6UHJlU3RtdDxDYWxsRXhwcj4gPiB7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUX2Rpc3BhdGNoT25jZTsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlRfZGlzcGF0Y2hPbmNlOwogCiBwdWJsaWM6CiAgIHZvaWQgY2hlY2tQcmVTdG10KGNvbnN0IENhbGxFeHByICpDRSwgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwpAQCAtNjcsNyArNjcsNyBAQAogICAgIHJldHVybjsKIAogICBpZiAoIUJUX2Rpc3BhdGNoT25jZSkKLSAgICBCVF9kaXNwYXRjaE9uY2UucmVzZXQobmV3IEJ1Z1R5cGUoIkltcHJvcGVyIHVzZSBvZiAnZGlzcGF0Y2hfb25jZSciLAorICAgIEJUX2Rpc3BhdGNoT25jZS5yZXNldChuZXcgQnVnVHlwZSh0aGlzLCAiSW1wcm9wZXIgdXNlIG9mICdkaXNwYXRjaF9vbmNlJyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUEkgTWlzdXNlIChBcHBsZSkiKSk7CiAKICAgLy8gSGFuZGxlIF9kaXNwYXRjaF9vbmNlLiAgSW4gc29tZSB2ZXJzaW9ucyBvZiB0aGUgT1MgWCBTREsgd2UgaGF2ZSB0aGUgY2FzZQpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL01hbGxvY0NoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL01hbGxvY0NoZWNrZXIuY3BwCmluZGV4IGM3YWEwZmIuLmYwZDE5MjQgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9NYWxsb2NDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTWFsbG9jQ2hlY2tlci5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlICJJbnRlckNoZWNrZXJBUEkuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQXR0ci5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9UYXJnZXRJbmZvLmgiCiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci9CdWdUeXBlLmgiCiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyLmgiCiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyTWFuYWdlci5oIgpAQCAtNDgsNyArNDksNyBAQAogICAgICAgICAgICAgICBBbGxvY2F0ZWQsCiAgICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSB0byByZWxlYXNlZC9mcmVlZCBtZW1vcnkuCiAgICAgICAgICAgICAgIFJlbGVhc2VkLAotICAgICAgICAgICAgICAvLyBUaGUgcmVzcG9uc2liaWxpdHkgZm9yIGZyZWVpbmcgcmVzb3VyY2VzIGhhcyB0cmFuc2ZlcmVkIGZyb20KKyAgICAgICAgICAgICAgLy8gVGhlIHJlc3BvbnNpYmlsaXR5IGZvciBmcmVlaW5nIHJlc291cmNlcyBoYXMgdHJhbnNmZXJyZWQgZnJvbQogICAgICAgICAgICAgICAvLyB0aGlzIHJlZmVyZW5jZS4gQSByZWxpbnF1aXNoZWQgc3ltYm9sIHNob3VsZCBub3QgYmUgZnJlZWQuCiAgICAgICAgICAgICAgIFJlbGlucXVpc2hlZCwKICAgICAgICAgICAgICAgLy8gV2UgYXJlIG5vIGxvbmdlciBndWFyYW50ZWVkIHRvIGhhdmUgb2JzZXJ2ZWQgYWxsIG1hbmlwdWxhdGlvbnMKQEAgLTEwMCwxNyArMTAxLDE2IEBACiAgIH0KIAogICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFRhYmxlW10gPSB7Ci0gICAgICAiQWxsb2NhdGVkIiwKLSAgICAgICJSZWxlYXNlZCIsCi0gICAgICAiUmVsaW5xdWlzaGVkIgotICAgIH07Ci0gICAgT1MgPDwgVGFibGVbKHVuc2lnbmVkKSBLXTsKKyAgICBzd2l0Y2ggKHN0YXRpY19jYXN0PEtpbmQ+KEspKSB7CisjZGVmaW5lIENBU0UoSUQpIGNhc2UgSUQ6IE9TIDw8ICNJRDsgYnJlYWs7CisgICAgQ0FTRShBbGxvY2F0ZWQpCisgICAgQ0FTRShSZWxlYXNlZCkKKyAgICBDQVNFKFJlbGlucXVpc2hlZCkKKyAgICBDQVNFKEVzY2FwZWQpCisgICAgfQogICB9CiAKLSAgTExWTV9BVFRSSUJVVEVfVVNFRCB2b2lkIGR1bXAoKSBjb25zdCB7Ci0gICAgZHVtcChsbHZtOjplcnJzKCkpOwotICB9CisgIExMVk1fRFVNUF9NRVRIT0Qgdm9pZCBkdW1wKCkgY29uc3QgeyBkdW1wKGxsdm06OmVycnMoKSk7IH0KIH07CiAKIGVudW0gUmVhbGxvY1BhaXJLaW5kIHsKQEAgLTE1NiwzMCArMTU2LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s6OkxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWw6OkFzc3VtZT4KIHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlRfRG91YmxlRnJlZTsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlRfTGVhazsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlRfVXNlRnJlZTsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlRfQmFkRnJlZTsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlRfTWlzbWF0Y2hlZERlYWxsb2M7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUX09mZnNldEZyZWU7Ci0gIG11dGFibGUgSWRlbnRpZmllckluZm8gKklJX21hbGxvYywgKklJX2ZyZWUsICpJSV9yZWFsbG9jLCAqSUlfY2FsbG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICpJSV92YWxsb2MsICpJSV9yZWFsbG9jZiwgKklJX3N0cm5kdXAsICpJSV9zdHJkdXA7Ci0KIHB1YmxpYzoKICAgTWFsbG9jQ2hlY2tlcigpIDogSUlfbWFsbG9jKDApLCBJSV9mcmVlKDApLCBJSV9yZWFsbG9jKDApLCBJSV9jYWxsb2MoMCksCi0gICAgICAgICAgICAgICAgICAgIElJX3ZhbGxvYygwKSwgSUlfcmVhbGxvY2YoMCksIElJX3N0cm5kdXAoMCksIElJX3N0cmR1cCgwKSB7fQorICAgICAgICAgICAgICAgICAgICBJSV92YWxsb2MoMCksIElJX3JlYWxsb2NmKDApLCBJSV9zdHJuZHVwKDApLCBJSV9zdHJkdXAoMCksCisgICAgICAgICAgICAgICAgICAgIElJX2ttYWxsb2MoMCkge30KIAogICAvLy8gSW4gcGVzc2ltaXN0aWMgbW9kZSwgdGhlIGNoZWNrZXIgYXNzdW1lcyB0aGF0IGl0IGRvZXMgbm90IGtub3cgd2hpY2gKICAgLy8vIGZ1bmN0aW9ucyBtaWdodCBmcmVlIHRoZSBtZW1vcnkuCi0gIHN0cnVjdCBDaGVja3NGaWx0ZXIgewotICAgIERlZmF1bHRCb29sIENNYWxsb2NQZXNzaW1pc3RpYzsKLSAgICBEZWZhdWx0Qm9vbCBDTWFsbG9jT3B0aW1pc3RpYzsKLSAgICBEZWZhdWx0Qm9vbCBDTmV3RGVsZXRlQ2hlY2tlcjsKLSAgICBEZWZhdWx0Qm9vbCBDTmV3RGVsZXRlTGVha3NDaGVja2VyOwotICAgIERlZmF1bHRCb29sIENNaXNtYXRjaGVkRGVhbGxvY2F0b3JDaGVja2VyOworICBlbnVtIENoZWNrS2luZCB7CisgICAgQ0tfTWFsbG9jUGVzc2ltaXN0aWMsCisgICAgQ0tfTWFsbG9jT3B0aW1pc3RpYywKKyAgICBDS19OZXdEZWxldGVDaGVja2VyLAorICAgIENLX05ld0RlbGV0ZUxlYWtzQ2hlY2tlciwKKyAgICBDS19NaXNtYXRjaGVkRGVhbGxvY2F0b3JDaGVja2VyLAorICAgIENLX051bUNoZWNrS2luZHMKICAgfTsKIAotICBDaGVja3NGaWx0ZXIgRmlsdGVyOworICBEZWZhdWx0Qm9vbCBDaGVja3NFbmFibGVkW0NLX051bUNoZWNrS2luZHNdOworICBDaGVja05hbWUgQ2hlY2tOYW1lc1tDS19OdW1DaGVja0tpbmRzXTsKIAogICB2b2lkIGNoZWNrUHJlQ2FsbChjb25zdCBDYWxsRXZlbnQgJkNhbGwsIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdDsKICAgdm9pZCBjaGVja1Bvc3RTdG10KGNvbnN0IENhbGxFeHByICpDRSwgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwpAQCAtMjA0LDkgKzE5OCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlckVzY2FwZUtpbmQgS2luZCkgY29uc3Q7CiAKICAgdm9pZCBwcmludFN0YXRlKHJhd19vc3RyZWFtICZPdXQsIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5MLCBjb25zdCBjaGFyICpTZXApIGNvbnN0OworICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTkwsIGNvbnN0IGNoYXIgKlNlcCkgY29uc3Qgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUX0RvdWJsZUZyZWVbQ0tfTnVtQ2hlY2tLaW5kc107CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUX0RvdWJsZURlbGV0ZTsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlRfTGVha1tDS19OdW1DaGVja0tpbmRzXTsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlRfVXNlRnJlZVtDS19OdW1DaGVja0tpbmRzXTsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlRfQmFkRnJlZVtDS19OdW1DaGVja0tpbmRzXTsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlRfTWlzbWF0Y2hlZERlYWxsb2M7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUX09mZnNldEZyZWVbQ0tfTnVtQ2hlY2tLaW5kc107CisgIG11dGFibGUgSWRlbnRpZmllckluZm8gKklJX21hbGxvYywgKklJX2ZyZWUsICpJSV9yZWFsbG9jLCAqSUlfY2FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICpJSV92YWxsb2MsICpJSV9yZWFsbG9jZiwgKklJX3N0cm5kdXAsICpJSV9zdHJkdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgKklJX2ttYWxsb2M7CisgIG11dGFibGUgT3B0aW9uYWw8dWludDY0X3Q+IEtlcm5lbFplcm9GbGFnVmFsOworCiAgIHZvaWQgaW5pdElkZW50aWZpZXJJbmZvKEFTVENvbnRleHQgJkMpIGNvbnN0OwogCiAgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGZhbWlseSBvZiBhIGRlYWxsb2NhdGlvbiBleHByZXNzaW9uLgpAQCAtMjM0LDkgKzI0MCw5IEBACiAgIGJvb2wgaXNBbGxvY2F0aW9uRnVuY3Rpb24oY29uc3QgRnVuY3Rpb25EZWNsICpGRCwgQVNUQ29udGV4dCAmQykgY29uc3Q7CiAgIGJvb2wgaXNTdGFuZGFyZE5ld0RlbGV0ZShjb25zdCBGdW5jdGlvbkRlY2wgKkZELCBBU1RDb250ZXh0ICZDKSBjb25zdDsKICAgLy8vQH0KLSAgc3RhdGljIFByb2dyYW1TdGF0ZVJlZiBNYWxsb2NNZW1SZXR1cm5zQXR0cihDaGVja2VyQ29udGV4dCAmQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXhwciAqQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3duZXJzaGlwQXR0ciogQXR0KTsKKyAgUHJvZ3JhbVN0YXRlUmVmIE1hbGxvY01lbVJldHVybnNBdHRyKENoZWNrZXJDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV4cHIgKkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3duZXJzaGlwQXR0ciogQXR0KSBjb25zdDsKICAgc3RhdGljIFByb2dyYW1TdGF0ZVJlZiBNYWxsb2NNZW1BdXgoQ2hlY2tlckNvbnRleHQgJkMsIGNvbnN0IENhbGxFeHByICpDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpTaXplRXgsIFNWYWwgSW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgU3RhdGUsCkBAIC0yNTEsNiArMjU3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb25GYW1pbHkgRmFtaWx5ID0gQUZfTWFsbG9jKTsKIAorICAvLyBDaGVjayBpZiB0aGlzIG1hbGxvYygpIGZvciBzcGVjaWFsIGZsYWdzLiBBdCBwcmVzZW50IHRoYXQgbWVhbnMgTV9aRVJPIG9yCisgIC8vIF9fR0ZQX1pFUk8gKGluIHdoaWNoIGNhc2UsIHRyZWF0IGl0IGxpa2UgY2FsbG9jKS4KKyAgbGx2bTo6T3B0aW9uYWw8UHJvZ3JhbVN0YXRlUmVmPgorICBwZXJmb3JtS2VybmVsTWFsbG9jKGNvbnN0IENhbGxFeHByICpDRSwgQ2hlY2tlckNvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvZ3JhbVN0YXRlUmVmICZTdGF0ZSkgY29uc3Q7CisKICAgLy8vIFVwZGF0ZSB0aGUgUmVmU3RhdGUgdG8gcmVmbGVjdCB0aGUgbmV3IG1lbW9yeSBhbGxvY2F0aW9uLgogICBzdGF0aWMgUHJvZ3JhbVN0YXRlUmVmIAogICBNYWxsb2NVcGRhdGVSZWZTdGF0ZShDaGVja2VyQ29udGV4dCAmQywgY29uc3QgRXhwciAqRSwgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLApAQCAtMjc5LDYgKzI5MSw4IEBACiAKICAgYm9vbCBjaGVja1VzZUFmdGVyRnJlZShTeW1ib2xSZWYgU3ltLCBDaGVja2VyQ29udGV4dCAmQywgY29uc3QgU3RtdCAqUykgY29uc3Q7CiAKKyAgYm9vbCBjaGVja0RvdWJsZURlbGV0ZShTeW1ib2xSZWYgU3ltLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CisKICAgLy8vIENoZWNrIGlmIHRoZSBmdW5jdGlvbiBpcyBrbm93biBmcmVlIG1lbW9yeSwgb3IgaWYgaXQgaXMKICAgLy8vICJpbnRlcmVzdGluZyIgYW5kIHNob3VsZCBiZSBtb2RlbGVkIGV4cGxpY2l0bHkuCiAgIC8vLwpAQCAtMzAyLDEwICszMTYsMTIgQEAKIAogICAvLy9AewogICAvLy8gVGVsbHMgaWYgYSBnaXZlbiBmYW1pbHkvY2FsbC9zeW1ib2wgaXMgdHJhY2tlZCBieSB0aGUgY3VycmVudCBjaGVja2VyLgotICBib29sIGlzVHJhY2tlZEJ5Q3VycmVudENoZWNrZXIoQWxsb2NhdGlvbkZhbWlseSBGYW1pbHkpIGNvbnN0OwotICBib29sIGlzVHJhY2tlZEJ5Q3VycmVudENoZWNrZXIoQ2hlY2tlckNvbnRleHQgJkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpBbGxvY0RlYWxsb2NTdG10KSBjb25zdDsKLSAgYm9vbCBpc1RyYWNrZWRCeUN1cnJlbnRDaGVja2VyKENoZWNrZXJDb250ZXh0ICZDLCBTeW1ib2xSZWYgU3ltKSBjb25zdDsKKyAgLy8vIFNldHMgQ2hlY2tLaW5kIHRvIHRoZSBraW5kIG9mIHRoZSBjaGVja2VyIHJlc3BvbnNpYmxlIGZvciB0aGlzCisgIC8vLyBmYW1pbHkvY2FsbC9zeW1ib2wuCisgIE9wdGlvbmFsPENoZWNrS2luZD4gZ2V0Q2hlY2tJZlRyYWNrZWQoQWxsb2NhdGlvbkZhbWlseSBGYW1pbHkpIGNvbnN0OworICBPcHRpb25hbDxDaGVja0tpbmQ+IGdldENoZWNrSWZUcmFja2VkKENoZWNrZXJDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0bXQgKkFsbG9jRGVhbGxvY1N0bXQpIGNvbnN0OworICBPcHRpb25hbDxDaGVja0tpbmQ+IGdldENoZWNrSWZUcmFja2VkKENoZWNrZXJDb250ZXh0ICZDLCBTeW1ib2xSZWYgU3ltKSBjb25zdDsKICAgLy8vQH0KICAgc3RhdGljIGJvb2wgU3VtbWFyaXplVmFsdWUocmF3X29zdHJlYW0gJm9zLCBTVmFsIFYpOwogICBzdGF0aWMgYm9vbCBTdW1tYXJpemVSZWdpb24ocmF3X29zdHJlYW0gJm9zLCBjb25zdCBNZW1SZWdpb24gKk1SKTsKQEAgLTMyMiw2ICszMzgsOCBAQAogICB2b2lkIFJlcG9ydERvdWJsZUZyZWUoQ2hlY2tlckNvbnRleHQgJkMsIFNvdXJjZVJhbmdlIFJhbmdlLCBib29sIFJlbGVhc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmIFN5bSwgU3ltYm9sUmVmIFByZXZTeW0pIGNvbnN0OwogCisgIHZvaWQgUmVwb3J0RG91YmxlRGVsZXRlKENoZWNrZXJDb250ZXh0ICZDLCBTeW1ib2xSZWYgU3ltKSBjb25zdDsKKwogICAvLy8gRmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIGFsbG9jYXRpb24gZm9yIFN5bSBvbiB0aGUgcGF0aCBsZWFkaW5nIHRvIHRoZQogICAvLy8gZXhwbG9kZWQgbm9kZSBOLgogICBMZWFrSW5mbyBnZXRBbGxvY2F0aW9uU2l0ZShjb25zdCBFeHBsb2RlZE5vZGUgKk4sIFN5bWJvbFJlZiBTeW0sCkBAIC0zNTYsNyArMzc0LDcgQEAKIAogICAgIHZpcnR1YWwgfk1hbGxvY0J1Z1Zpc2l0b3IoKSB7fQogCi0gICAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgICAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBzdGF0aWMgaW50IFggPSAwOwogICAgICAgSUQuQWRkUG9pbnRlcigmWCk7CiAgICAgICBJRC5BZGRQb2ludGVyKFN5bSk7CkBAIC0zOTgsMTEgKzQxNiwxMSBAQAogICAgIFBhdGhEaWFnbm9zdGljUGllY2UgKlZpc2l0Tm9kZShjb25zdCBFeHBsb2RlZE5vZGUgKk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqUHJldk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUikgb3ZlcnJpZGU7CiAKICAgICBQYXRoRGlhZ25vc3RpY1BpZWNlKiBnZXRFbmRQYXRoKEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpFbmRQYXRoTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIG92ZXJyaWRlIHsKICAgICAgIGlmICghSXNMZWFrKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtNDIwLDcgKzQzOCw4IEBACiAgICAgICBTdGFja0hpbnRHZW5lcmF0b3JGb3JSZWFsbG9jYXRpb25GYWlsZWQoU3ltYm9sUmVmIFMsIFN0cmluZ1JlZiBNKQogICAgICAgICA6IFN0YWNrSGludEdlbmVyYXRvckZvclN5bWJvbChTLCBNKSB7fQogCi0gICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldE1lc3NhZ2VGb3JBcmcoY29uc3QgRXhwciAqQXJnRSwgdW5zaWduZWQgQXJnSW5kZXgpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGdldE1lc3NhZ2VGb3JBcmcoY29uc3QgRXhwciAqQXJnRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJnSW5kZXgpIG92ZXJyaWRlIHsKICAgICAgICAgLy8gUHJpbnRlZCBwYXJhbWV0ZXJzIHN0YXJ0IGF0IDEsIG5vdCAwLgogICAgICAgICArK0FyZ0luZGV4OwogCkBAIC00MzMsNyArNDUyLDcgQEAKICAgICAgICAgcmV0dXJuIG9zLnN0cigpOwogICAgICAgfQogCi0gICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldE1lc3NhZ2VGb3JSZXR1cm4oY29uc3QgQ2FsbEV4cHIgKkNhbGxFeHByKSB7CisgICAgICBzdGQ6OnN0cmluZyBnZXRNZXNzYWdlRm9yUmV0dXJuKGNvbnN0IENhbGxFeHByICpDYWxsRXhwcikgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gIlJlYWxsb2NhdGlvbiBvZiByZXR1cm5lZCB2YWx1ZSBmYWlsZWQiOwogICAgICAgfQogICAgIH07CkBAIC00NTUsNyArNDc0LDcgQEAKICAgU3RvcFRyYWNraW5nQ2FsbGJhY2soUHJvZ3JhbVN0YXRlUmVmIHN0KSA6IHN0YXRlKHN0KSB7fQogICBQcm9ncmFtU3RhdGVSZWYgZ2V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBzdGF0ZTsgfQogCi0gIGJvb2wgVmlzaXRTeW1ib2woU3ltYm9sUmVmIHN5bSkgeworICBib29sIFZpc2l0U3ltYm9sKFN5bWJvbFJlZiBzeW0pIG92ZXJyaWRlIHsKICAgICBzdGF0ZSA9IHN0YXRlLT5yZW1vdmU8UmVnaW9uU3RhdGU+KHN5bSk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTQ3Myw2ICs0OTIsNyBAQAogICBJSV92YWxsb2MgPSAmQ3R4LklkZW50cy5nZXQoInZhbGxvYyIpOwogICBJSV9zdHJkdXAgPSAmQ3R4LklkZW50cy5nZXQoInN0cmR1cCIpOwogICBJSV9zdHJuZHVwID0gJkN0eC5JZGVudHMuZ2V0KCJzdHJuZHVwIik7CisgIElJX2ttYWxsb2MgPSAmQ3R4LklkZW50cy5nZXQoImttYWxsb2MiKTsKIH0KIAogYm9vbCBNYWxsb2NDaGVja2VyOjppc01lbUZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQsIEFTVENvbnRleHQgJkMpIGNvbnN0IHsKQEAgLTQ5OSwxNiArNTE5LDEzIEBACiAKICAgICBpZiAoRnVuSSA9PSBJSV9tYWxsb2MgfHwgRnVuSSA9PSBJSV9yZWFsbG9jIHx8CiAgICAgICAgIEZ1bkkgPT0gSUlfcmVhbGxvY2YgfHwgRnVuSSA9PSBJSV9jYWxsb2MgfHwgRnVuSSA9PSBJSV92YWxsb2MgfHwKLSAgICAgICAgRnVuSSA9PSBJSV9zdHJkdXAgfHwgRnVuSSA9PSBJSV9zdHJuZHVwKQorICAgICAgICBGdW5JID09IElJX3N0cmR1cCB8fCBGdW5JID09IElJX3N0cm5kdXAgfHwgRnVuSSA9PSBJSV9rbWFsbG9jKQogICAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICBpZiAoRmlsdGVyLkNNYWxsb2NPcHRpbWlzdGljICYmIEZELT5oYXNBdHRycygpKQotICAgIGZvciAoc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxPd25lcnNoaXBBdHRyPgotICAgICAgICAgICBpID0gRkQtPnNwZWNpZmljX2F0dHJfYmVnaW48T3duZXJzaGlwQXR0cj4oKSwKLSAgICAgICAgICAgZSA9IEZELT5zcGVjaWZpY19hdHRyX2VuZDxPd25lcnNoaXBBdHRyPigpOwotICAgICAgICAgICBpICE9IGU7ICsraSkKLSAgICAgIGlmICgoKmkpLT5nZXRPd25LaW5kKCkgPT0gT3duZXJzaGlwQXR0cjo6UmV0dXJucykKKyAgaWYgKENoZWNrc0VuYWJsZWRbQ0tfTWFsbG9jT3B0aW1pc3RpY10gJiYgRkQtPmhhc0F0dHJzKCkpCisgICAgZm9yIChjb25zdCBhdXRvICpJIDogRkQtPnNwZWNpZmljX2F0dHJzPE93bmVyc2hpcEF0dHI+KCkpCisgICAgICBpZiAoSS0+Z2V0T3duS2luZCgpID09IE93bmVyc2hpcEF0dHI6OlJldHVybnMpCiAgICAgICAgIHJldHVybiB0cnVlOwogICByZXR1cm4gZmFsc2U7CiB9CkBAIC01MjUsMTMgKzU0MiwxMCBAQAogICAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICBpZiAoRmlsdGVyLkNNYWxsb2NPcHRpbWlzdGljICYmIEZELT5oYXNBdHRycygpKQotICAgIGZvciAoc3BlY2lmaWNfYXR0cl9pdGVyYXRvcjxPd25lcnNoaXBBdHRyPgotICAgICAgICAgICBpID0gRkQtPnNwZWNpZmljX2F0dHJfYmVnaW48T3duZXJzaGlwQXR0cj4oKSwKLSAgICAgICAgICAgZSA9IEZELT5zcGVjaWZpY19hdHRyX2VuZDxPd25lcnNoaXBBdHRyPigpOwotICAgICAgICAgICBpICE9IGU7ICsraSkKLSAgICAgIGlmICgoKmkpLT5nZXRPd25LaW5kKCkgPT0gT3duZXJzaGlwQXR0cjo6VGFrZXMgfHwKLSAgICAgICAgICAoKmkpLT5nZXRPd25LaW5kKCkgPT0gT3duZXJzaGlwQXR0cjo6SG9sZHMpCisgIGlmIChDaGVja3NFbmFibGVkW0NLX01hbGxvY09wdGltaXN0aWNdICYmIEZELT5oYXNBdHRycygpKQorICAgIGZvciAoY29uc3QgYXV0byAqSSA6IEZELT5zcGVjaWZpY19hdHRyczxPd25lcnNoaXBBdHRyPigpKQorICAgICAgaWYgKEktPmdldE93bktpbmQoKSA9PSBPd25lcnNoaXBBdHRyOjpUYWtlcyB8fAorICAgICAgICAgIEktPmdldE93bktpbmQoKSA9PSBPd25lcnNoaXBBdHRyOjpIb2xkcykKICAgICAgICAgcmV0dXJuIHRydWU7CiAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTU2OSwxMCArNTgzLDg4IEBACiAgIHJldHVybiB0cnVlOwogfQogCitsbHZtOjpPcHRpb25hbDxQcm9ncmFtU3RhdGVSZWY+IE1hbGxvY0NoZWNrZXI6OnBlcmZvcm1LZXJuZWxNYWxsb2MoCisgIGNvbnN0IENhbGxFeHByICpDRSwgQ2hlY2tlckNvbnRleHQgJkMsIGNvbnN0IFByb2dyYW1TdGF0ZVJlZiAmU3RhdGUpIGNvbnN0IHsKKyAgLy8gMy1hcmd1bWVudCBtYWxsb2MoKSwgYXMgY29tbW9ubHkgdXNlZCBpbiB7RnJlZSxOZXQsT3Blbn1CU0QgS2VybmVsczoKKyAgLy8KKyAgLy8gdm9pZCAqbWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IG1hbGxvY190eXBlICptdHAsIGludCBmbGFncyk7CisgIC8vCisgIC8vIE9uZSBvZiB0aGUgcG9zc2libGUgZmxhZ3MgaXMgTV9aRVJPLCB3aGljaCBtZWFucyAnZ2l2ZSBtZSBiYWNrIGFuCisgIC8vIGFsbG9jYXRpb24gd2hpY2ggaXMgYWxyZWFkeSB6ZXJvZWQnLCBsaWtlIGNhbGxvYy4KKworICAvLyAyLWFyZ3VtZW50IGttYWxsb2MoKSwgYXMgdXNlZCBpbiB0aGUgTGludXgga2VybmVsOgorICAvLworICAvLyB2b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7CisgIC8vCisgIC8vIEhhcyB0aGUgc2ltaWxhciBmbGFnIHZhbHVlIF9fR0ZQX1pFUk8uCisKKyAgLy8gVGhpcyBsb2dpYyBpcyBsYXJnZWx5IGNsb25lZCBmcm9tIE9fQ1JFQVQgaW4gVW5peEFQSUNoZWNrZXIsIG1heWJlIHNvbWUKKyAgLy8gY29kZSBjb3VsZCBiZSBzaGFyZWQuCisKKyAgQVNUQ29udGV4dCAmQ3R4ID0gQy5nZXRBU1RDb250ZXh0KCk7CisgIGxsdm06OlRyaXBsZTo6T1NUeXBlIE9TID0gQ3R4LmdldFRhcmdldEluZm8oKS5nZXRUcmlwbGUoKS5nZXRPUygpOworCisgIGlmICghS2VybmVsWmVyb0ZsYWdWYWwuaGFzVmFsdWUoKSkgeworICAgIGlmIChPUyA9PSBsbHZtOjpUcmlwbGU6OkZyZWVCU0QpCisgICAgICBLZXJuZWxaZXJvRmxhZ1ZhbCA9IDB4MDEwMDsKKyAgICBlbHNlIGlmIChPUyA9PSBsbHZtOjpUcmlwbGU6Ok5ldEJTRCkKKyAgICAgIEtlcm5lbFplcm9GbGFnVmFsID0gMHgwMDAyOworICAgIGVsc2UgaWYgKE9TID09IGxsdm06OlRyaXBsZTo6T3BlbkJTRCkKKyAgICAgIEtlcm5lbFplcm9GbGFnVmFsID0gMHgwMDA4OworICAgIGVsc2UgaWYgKE9TID09IGxsdm06OlRyaXBsZTo6TGludXgpCisgICAgICAvLyBfX0dGUF9aRVJPCisgICAgICBLZXJuZWxaZXJvRmxhZ1ZhbCA9IDB4ODAwMDsKKyAgICBlbHNlCisgICAgICAvLyBGSVhNRTogV2UgbmVlZCBhIG1vcmUgZ2VuZXJhbCB3YXkgb2YgZ2V0dGluZyB0aGUgTV9aRVJPIHZhbHVlLgorICAgICAgLy8gU2VlIGFsc286IE9fQ1JFQVQgaW4gVW5peEFQSUNoZWNrZXIuY3BwLgorCisgICAgICAvLyBGYWxsIGJhY2sgdG8gbm9ybWFsIG1hbGxvYyBiZWhhdmlvciBvbiBwbGF0Zm9ybXMgd2hlcmUgd2UgZG9uJ3QKKyAgICAgIC8vIGtub3cgTV9aRVJPLgorICAgICAgcmV0dXJuIE5vbmU7CisgIH0KKworICAvLyBXZSB0cmVhdCB0aGUgbGFzdCBhcmd1bWVudCBhcyB0aGUgZmxhZ3MgYXJndW1lbnQsIGFuZCBjYWxsZXJzIGZhbGwtYmFjayB0bworICAvLyBub3JtYWwgbWFsbG9jIG9uIGEgTm9uZSByZXR1cm4uIFRoaXMgd29ya3MgZm9yIHRoZSBGcmVlQlNEIGtlcm5lbCBtYWxsb2MKKyAgLy8gYXMgd2VsbCBhcyBMaW51eCBrbWFsbG9jLgorICBpZiAoQ0UtPmdldE51bUFyZ3MoKSA8IDIpCisgICAgcmV0dXJuIE5vbmU7CisKKyAgY29uc3QgRXhwciAqRmxhZ3NFeCA9IENFLT5nZXRBcmcoQ0UtPmdldE51bUFyZ3MoKSAtIDEpOworICBjb25zdCBTVmFsIFYgPSBTdGF0ZS0+Z2V0U1ZhbChGbGFnc0V4LCBDLmdldExvY2F0aW9uQ29udGV4dCgpKTsKKyAgaWYgKCFWLmdldEFzPE5vbkxvYz4oKSkgeworICAgIC8vIFRoZSBjYXNlIHdoZXJlICdWJyBjYW4gYmUgYSBsb2NhdGlvbiBjYW4gb25seSBiZSBkdWUgdG8gYSBiYWQgaGVhZGVyLAorICAgIC8vIHNvIGluIHRoaXMgY2FzZSBiYWlsIG91dC4KKyAgICByZXR1cm4gTm9uZTsKKyAgfQorCisgIE5vbkxvYyBGbGFncyA9IFYuY2FzdEFzPE5vbkxvYz4oKTsKKyAgTm9uTG9jIFplcm9GbGFnID0gQy5nZXRTVmFsQnVpbGRlcigpCisgICAgICAubWFrZUludFZhbChLZXJuZWxaZXJvRmxhZ1ZhbC5nZXRWYWx1ZSgpLCBGbGFnc0V4LT5nZXRUeXBlKCkpCisgICAgICAuY2FzdEFzPE5vbkxvYz4oKTsKKyAgU1ZhbCBNYXNrZWRGbGFnc1VDID0gQy5nZXRTVmFsQnVpbGRlcigpLmV2YWxCaW5PcE5OKFN0YXRlLCBCT19BbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFncywgWmVyb0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnc0V4LT5nZXRUeXBlKCkpOworICBpZiAoTWFza2VkRmxhZ3NVQy5pc1Vua25vd25PclVuZGVmKCkpCisgICAgcmV0dXJuIE5vbmU7CisgIERlZmluZWRTVmFsIE1hc2tlZEZsYWdzID0gTWFza2VkRmxhZ3NVQy5jYXN0QXM8RGVmaW5lZFNWYWw+KCk7CisKKyAgLy8gQ2hlY2sgaWYgbWFza2VkRmxhZ3MgaXMgbm9uLXplcm8uCisgIFByb2dyYW1TdGF0ZVJlZiBUcnVlU3RhdGUsIEZhbHNlU3RhdGU7CisgIHN0ZDo6dGllKFRydWVTdGF0ZSwgRmFsc2VTdGF0ZSkgPSBTdGF0ZS0+YXNzdW1lKE1hc2tlZEZsYWdzKTsKKworICAvLyBJZiBNX1pFUk8gaXMgc2V0LCB0cmVhdCB0aGlzIGxpa2UgY2FsbG9jIChpbml0aWFsaXplZCkuCisgIGlmIChUcnVlU3RhdGUgJiYgIUZhbHNlU3RhdGUpIHsKKyAgICBTVmFsIFplcm9WYWwgPSBDLmdldFNWYWxCdWlsZGVyKCkubWFrZVplcm9WYWwoQ3R4LkNoYXJUeSk7CisgICAgcmV0dXJuIE1hbGxvY01lbUF1eChDLCBDRSwgQ0UtPmdldEFyZygwKSwgWmVyb1ZhbCwgVHJ1ZVN0YXRlKTsKKyAgfQorCisgIHJldHVybiBOb25lOworfQorCiB2b2lkIE1hbGxvY0NoZWNrZXI6OmNoZWNrUG9zdFN0bXQoY29uc3QgQ2FsbEV4cHIgKkNFLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3QgewogICBpZiAoQy53YXNJbmxpbmVkKQogICAgIHJldHVybjsKLSAgCisKICAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IEMuZ2V0Q2FsbGVlRGVjbChDRSk7CiAgIGlmICghRkQpCiAgICAgcmV0dXJuOwpAQCAtNTg0LDcgKzY3NiwyNyBAQAogICAgIGluaXRJZGVudGlmaWVySW5mbyhDLmdldEFTVENvbnRleHQoKSk7CiAgICAgSWRlbnRpZmllckluZm8gKkZ1bkkgPSBGRC0+Z2V0SWRlbnRpZmllcigpOwogCi0gICAgaWYgKEZ1bkkgPT0gSUlfbWFsbG9jIHx8IEZ1bkkgPT0gSUlfdmFsbG9jKSB7CisgICAgaWYgKEZ1bkkgPT0gSUlfbWFsbG9jKSB7CisgICAgICBpZiAoQ0UtPmdldE51bUFyZ3MoKSA8IDEpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChDRS0+Z2V0TnVtQXJncygpIDwgMykgeworICAgICAgICBTdGF0ZSA9IE1hbGxvY01lbUF1eChDLCBDRSwgQ0UtPmdldEFyZygwKSwgVW5kZWZpbmVkVmFsKCksIFN0YXRlKTsKKyAgICAgIH0gZWxzZSBpZiAoQ0UtPmdldE51bUFyZ3MoKSA9PSAzKSB7CisgICAgICAgIGxsdm06Ok9wdGlvbmFsPFByb2dyYW1TdGF0ZVJlZj4gTWF5YmVTdGF0ZSA9CisgICAgICAgICAgcGVyZm9ybUtlcm5lbE1hbGxvYyhDRSwgQywgU3RhdGUpOworICAgICAgICBpZiAoTWF5YmVTdGF0ZS5oYXNWYWx1ZSgpKQorICAgICAgICAgIFN0YXRlID0gTWF5YmVTdGF0ZS5nZXRWYWx1ZSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgU3RhdGUgPSBNYWxsb2NNZW1BdXgoQywgQ0UsIENFLT5nZXRBcmcoMCksIFVuZGVmaW5lZFZhbCgpLCBTdGF0ZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChGdW5JID09IElJX2ttYWxsb2MpIHsKKyAgICAgIGxsdm06Ok9wdGlvbmFsPFByb2dyYW1TdGF0ZVJlZj4gTWF5YmVTdGF0ZSA9CisgICAgICAgIHBlcmZvcm1LZXJuZWxNYWxsb2MoQ0UsIEMsIFN0YXRlKTsKKyAgICAgIGlmIChNYXliZVN0YXRlLmhhc1ZhbHVlKCkpCisgICAgICAgIFN0YXRlID0gTWF5YmVTdGF0ZS5nZXRWYWx1ZSgpOworICAgICAgZWxzZQorICAgICAgICBTdGF0ZSA9IE1hbGxvY01lbUF1eChDLCBDRSwgQ0UtPmdldEFyZygwKSwgVW5kZWZpbmVkVmFsKCksIFN0YXRlKTsKKyAgICB9IGVsc2UgaWYgKEZ1bkkgPT0gSUlfdmFsbG9jKSB7CiAgICAgICBpZiAoQ0UtPmdldE51bUFyZ3MoKSA8IDEpCiAgICAgICAgIHJldHVybjsKICAgICAgIFN0YXRlID0gTWFsbG9jTWVtQXV4KEMsIENFLCBDRS0+Z2V0QXJnKDApLCBVbmRlZmluZWRWYWwoKSwgU3RhdGUpOwpAQCAtNjIwLDIxICs3MzIsMTkgQEAKICAgICB9CiAgIH0KIAotICBpZiAoRmlsdGVyLkNNYWxsb2NPcHRpbWlzdGljIHx8IEZpbHRlci5DTWlzbWF0Y2hlZERlYWxsb2NhdG9yQ2hlY2tlcikgeworICBpZiAoQ2hlY2tzRW5hYmxlZFtDS19NYWxsb2NPcHRpbWlzdGljXSB8fAorICAgICAgQ2hlY2tzRW5hYmxlZFtDS19NaXNtYXRjaGVkRGVhbGxvY2F0b3JDaGVja2VyXSkgewogICAgIC8vIENoZWNrIGFsbCB0aGUgYXR0cmlidXRlcywgaWYgdGhlcmUgYXJlIGFueS4KICAgICAvLyBUaGVyZSBjYW4gYmUgbXVsdGlwbGUgb2YgdGhlc2UgYXR0cmlidXRlcy4KICAgICBpZiAoRkQtPmhhc0F0dHJzKCkpCi0gICAgICBmb3IgKHNwZWNpZmljX2F0dHJfaXRlcmF0b3I8T3duZXJzaGlwQXR0cj4KLSAgICAgICAgICBpID0gRkQtPnNwZWNpZmljX2F0dHJfYmVnaW48T3duZXJzaGlwQXR0cj4oKSwKLSAgICAgICAgICBlID0gRkQtPnNwZWNpZmljX2F0dHJfZW5kPE93bmVyc2hpcEF0dHI+KCk7Ci0gICAgICAgICAgaSAhPSBlOyArK2kpIHsKLSAgICAgICAgc3dpdGNoICgoKmkpLT5nZXRPd25LaW5kKCkpIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byAqSSA6IEZELT5zcGVjaWZpY19hdHRyczxPd25lcnNoaXBBdHRyPigpKSB7CisgICAgICAgIHN3aXRjaCAoSS0+Z2V0T3duS2luZCgpKSB7CiAgICAgICAgIGNhc2UgT3duZXJzaGlwQXR0cjo6UmV0dXJuczoKLSAgICAgICAgICBTdGF0ZSA9IE1hbGxvY01lbVJldHVybnNBdHRyKEMsIENFLCAqaSk7CisgICAgICAgICAgU3RhdGUgPSBNYWxsb2NNZW1SZXR1cm5zQXR0cihDLCBDRSwgSSk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgT3duZXJzaGlwQXR0cjo6VGFrZXM6CiAgICAgICAgIGNhc2UgT3duZXJzaGlwQXR0cjo6SG9sZHM6Ci0gICAgICAgICAgU3RhdGUgPSBGcmVlTWVtQXR0cihDLCBDRSwgKmkpOworICAgICAgICAgIFN0YXRlID0gRnJlZU1lbUF0dHIoQywgQ0UsIEkpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CkBAIC02NjcsNyArNzc3LDcgQEAKIHZvaWQgTWFsbG9jQ2hlY2tlcjo6Y2hlY2tQcmVTdG10KGNvbnN0IENYWERlbGV0ZUV4cHIgKkRFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdCB7CiAKLSAgaWYgKCFGaWx0ZXIuQ05ld0RlbGV0ZUNoZWNrZXIpCisgIGlmICghQ2hlY2tzRW5hYmxlZFtDS19OZXdEZWxldGVDaGVja2VyXSkKICAgICBpZiAoU3ltYm9sUmVmIFN5bSA9IEMuZ2V0U1ZhbChERS0+Z2V0QXJndW1lbnQoKSkuZ2V0QXNTeW1ib2woKSkKICAgICAgIGNoZWNrVXNlQWZ0ZXJGcmVlKFN5bSwgQywgREUtPmdldEFyZ3VtZW50KCkpOwogCkBAIC03MjksMTAgKzgzOSwxMCBAQAogICBDLmFkZFRyYW5zaXRpb24oU3RhdGUpOwogfQogCi1Qcm9ncmFtU3RhdGVSZWYgTWFsbG9jQ2hlY2tlcjo6TWFsbG9jTWVtUmV0dXJuc0F0dHIoQ2hlY2tlckNvbnRleHQgJkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbEV4cHIgKkNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE93bmVyc2hpcEF0dHIqIEF0dCkgewotICBpZiAoQXR0LT5nZXRNb2R1bGUoKSAhPSAibWFsbG9jIikKK1Byb2dyYW1TdGF0ZVJlZgorTWFsbG9jQ2hlY2tlcjo6TWFsbG9jTWVtUmV0dXJuc0F0dHIoQ2hlY2tlckNvbnRleHQgJkMsIGNvbnN0IENhbGxFeHByICpDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE93bmVyc2hpcEF0dHIgKkF0dCkgY29uc3QgeworICBpZiAoQXR0LT5nZXRNb2R1bGUoKSAhPSBJSV9tYWxsb2MpCiAgICAgcmV0dXJuIDA7CiAKICAgT3duZXJzaGlwQXR0cjo6YXJnc19pdGVyYXRvciBJID0gQXR0LT5hcmdzX2JlZ2luKCksIEUgPSBBdHQtPmFyZ3NfZW5kKCk7CkBAIC04MDQsOCArOTE0LDggQEAKIAogUHJvZ3JhbVN0YXRlUmVmIE1hbGxvY0NoZWNrZXI6OkZyZWVNZW1BdHRyKENoZWNrZXJDb250ZXh0ICZDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFeHByICpDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPd25lcnNoaXBBdHRyKiBBdHQpIGNvbnN0IHsKLSAgaWYgKEF0dC0+Z2V0TW9kdWxlKCkgIT0gIm1hbGxvYyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3duZXJzaGlwQXR0ciAqQXR0KSBjb25zdCB7CisgIGlmIChBdHQtPmdldE1vZHVsZSgpICE9IElJX21hbGxvYykKICAgICByZXR1cm4gMDsKIAogICBQcm9ncmFtU3RhdGVSZWYgU3RhdGUgPSBDLmdldFN0YXRlKCk7CkBAIC05MDksNyArMTAxOSw3IEBACiAgICAgICBvcyA8PCAiLSI7CiAgICAgZWxzZQogICAgICAgb3MgPDwgIisiOwotICAgIG9zIDw8IE1zZy0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpOworICAgIE1zZy0+Z2V0U2VsZWN0b3IoKS5wcmludChvcyk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIApAQCAtOTcxLDcgKzEwODEsNyBAQAogCiAgIC8vIFRoZSBleHBsaWNpdCBOVUxMIGNhc2UsIG5vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCiAgIFByb2dyYW1TdGF0ZVJlZiBub3ROdWxsU3RhdGUsIG51bGxTdGF0ZTsKLSAgbGx2bTo6dGllKG5vdE51bGxTdGF0ZSwgbnVsbFN0YXRlKSA9IFN0YXRlLT5hc3N1bWUobG9jYXRpb24pOworICBzdGQ6OnRpZShub3ROdWxsU3RhdGUsIG51bGxTdGF0ZSkgPSBTdGF0ZS0+YXNzdW1lKGxvY2F0aW9uKTsKICAgaWYgKG51bGxTdGF0ZSAmJiAhbm90TnVsbFN0YXRlKQogICAgIHJldHVybiAwOwogCkBAIC0xMDg4LDE4ICsxMTk4LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZTdGF0ZTo6Z2V0UmVsZWFzZWQoRmFtaWx5LCBQYXJlbnRFeHByKSk7CiB9CiAKLWJvb2wgTWFsbG9jQ2hlY2tlcjo6aXNUcmFja2VkQnlDdXJyZW50Q2hlY2tlcihBbGxvY2F0aW9uRmFtaWx5IEZhbWlseSkgY29uc3QgeworT3B0aW9uYWw8TWFsbG9jQ2hlY2tlcjo6Q2hlY2tLaW5kPgorTWFsbG9jQ2hlY2tlcjo6Z2V0Q2hlY2tJZlRyYWNrZWQoQWxsb2NhdGlvbkZhbWlseSBGYW1pbHkpIGNvbnN0IHsKICAgc3dpdGNoIChGYW1pbHkpIHsKICAgY2FzZSBBRl9NYWxsb2M6IHsKLSAgICBpZiAoIUZpbHRlci5DTWFsbG9jT3B0aW1pc3RpYyAmJiAhRmlsdGVyLkNNYWxsb2NQZXNzaW1pc3RpYykKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoQ2hlY2tzRW5hYmxlZFtDS19NYWxsb2NPcHRpbWlzdGljXSkgeworICAgICAgcmV0dXJuIENLX01hbGxvY09wdGltaXN0aWM7CisgICAgfSBlbHNlIGlmIChDaGVja3NFbmFibGVkW0NLX01hbGxvY1Blc3NpbWlzdGljXSkgeworICAgICAgcmV0dXJuIENLX01hbGxvY1Blc3NpbWlzdGljOworICAgIH0KKyAgICByZXR1cm4gT3B0aW9uYWw8TWFsbG9jQ2hlY2tlcjo6Q2hlY2tLaW5kPigpOwogICB9CiAgIGNhc2UgQUZfQ1hYTmV3OgogICBjYXNlIEFGX0NYWE5ld0FycmF5OiB7Ci0gICAgaWYgKCFGaWx0ZXIuQ05ld0RlbGV0ZUNoZWNrZXIpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgaWYgKENoZWNrc0VuYWJsZWRbQ0tfTmV3RGVsZXRlQ2hlY2tlcl0pIHsKKyAgICAgIHJldHVybiBDS19OZXdEZWxldGVDaGVja2VyOworICAgIH0KKyAgICByZXR1cm4gT3B0aW9uYWw8TWFsbG9jQ2hlY2tlcjo6Q2hlY2tLaW5kPigpOwogICB9CiAgIGNhc2UgQUZfTm9uZTogewogICAgIGxsdm1fdW5yZWFjaGFibGUoIm5vIGZhbWlseSIpOwpAQCAtMTEwOCwxOCArMTIyMywxOCBAQAogICBsbHZtX3VucmVhY2hhYmxlKCJ1bmhhbmRsZWQgZmFtaWx5Iik7CiB9CiAKLWJvb2wKLU1hbGxvY0NoZWNrZXI6OmlzVHJhY2tlZEJ5Q3VycmVudENoZWNrZXIoQ2hlY2tlckNvbnRleHQgJkMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpBbGxvY0RlYWxsb2NTdG10KSBjb25zdCB7Ci0gIHJldHVybiBpc1RyYWNrZWRCeUN1cnJlbnRDaGVja2VyKGdldEFsbG9jYXRpb25GYW1pbHkoQywgQWxsb2NEZWFsbG9jU3RtdCkpOworT3B0aW9uYWw8TWFsbG9jQ2hlY2tlcjo6Q2hlY2tLaW5kPgorTWFsbG9jQ2hlY2tlcjo6Z2V0Q2hlY2tJZlRyYWNrZWQoQ2hlY2tlckNvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdG10ICpBbGxvY0RlYWxsb2NTdG10KSBjb25zdCB7CisgIHJldHVybiBnZXRDaGVja0lmVHJhY2tlZChnZXRBbGxvY2F0aW9uRmFtaWx5KEMsIEFsbG9jRGVhbGxvY1N0bXQpKTsKIH0KIAotYm9vbCBNYWxsb2NDaGVja2VyOjppc1RyYWNrZWRCeUN1cnJlbnRDaGVja2VyKENoZWNrZXJDb250ZXh0ICZDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJlZiBTeW0pIGNvbnN0IHsKK09wdGlvbmFsPE1hbGxvY0NoZWNrZXI6OkNoZWNrS2luZD4KK01hbGxvY0NoZWNrZXI6OmdldENoZWNrSWZUcmFja2VkKENoZWNrZXJDb250ZXh0ICZDLCBTeW1ib2xSZWYgU3ltKSBjb25zdCB7CiAKICAgY29uc3QgUmVmU3RhdGUgKlJTID0gQy5nZXRTdGF0ZSgpLT5nZXQ8UmVnaW9uU3RhdGU+KFN5bSk7CiAgIGFzc2VydChSUyk7Ci0gIHJldHVybiBpc1RyYWNrZWRCeUN1cnJlbnRDaGVja2VyKFJTLT5nZXRBbGxvY2F0aW9uRmFtaWx5KCkpOworICByZXR1cm4gZ2V0Q2hlY2tJZlRyYWNrZWQoUlMtPmdldEFsbG9jYXRpb25GYW1pbHkoKSk7CiB9CiAKIGJvb2wgTWFsbG9jQ2hlY2tlcjo6U3VtbWFyaXplVmFsdWUocmF3X29zdHJlYW0gJm9zLCBTVmFsIFYpIHsKQEAgLTEyMTMsMTcgKzEzMjgsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VSYW5nZSBSYW5nZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqRGVhbGxvY0V4cHIpIGNvbnN0IHsKIAotICBpZiAoIUZpbHRlci5DTWFsbG9jT3B0aW1pc3RpYyAmJiAhRmlsdGVyLkNNYWxsb2NQZXNzaW1pc3RpYyAmJiAKLSAgICAgICFGaWx0ZXIuQ05ld0RlbGV0ZUNoZWNrZXIpCisgIGlmICghQ2hlY2tzRW5hYmxlZFtDS19NYWxsb2NPcHRpbWlzdGljXSAmJgorICAgICAgIUNoZWNrc0VuYWJsZWRbQ0tfTWFsbG9jUGVzc2ltaXN0aWNdICYmCisgICAgICAhQ2hlY2tzRW5hYmxlZFtDS19OZXdEZWxldGVDaGVja2VyXSkKICAgICByZXR1cm47CiAKLSAgaWYgKCFpc1RyYWNrZWRCeUN1cnJlbnRDaGVja2VyKEMsIERlYWxsb2NFeHByKSkKKyAgT3B0aW9uYWw8TWFsbG9jQ2hlY2tlcjo6Q2hlY2tLaW5kPiBDaGVja0tpbmQgPQorICAgICAgZ2V0Q2hlY2tJZlRyYWNrZWQoQywgRGVhbGxvY0V4cHIpOworICBpZiAoIUNoZWNrS2luZC5oYXNWYWx1ZSgpKQogICAgIHJldHVybjsKIAogICBpZiAoRXhwbG9kZWROb2RlICpOID0gQy5nZW5lcmF0ZVNpbmsoKSkgewotICAgIGlmICghQlRfQmFkRnJlZSkKLSAgICAgIEJUX0JhZEZyZWUucmVzZXQobmV3IEJ1Z1R5cGUoIkJhZCBmcmVlIiwgIk1lbW9yeSBFcnJvciIpKTsKLSAgICAKKyAgICBpZiAoIUJUX0JhZEZyZWVbKkNoZWNrS2luZF0pCisgICAgICBCVF9CYWRGcmVlWypDaGVja0tpbmRdLnJlc2V0KAorICAgICAgICAgIG5ldyBCdWdUeXBlKENoZWNrTmFtZXNbKkNoZWNrS2luZF0sICJCYWQgZnJlZSIsICJNZW1vcnkgRXJyb3IiKSk7CisKICAgICBTbWFsbFN0cmluZzwxMDA+IGJ1ZjsKICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zKGJ1Zik7CiAKQEAgLTEyNDksNyArMTM2OCw3IEBACiAgICAgICBwcmludEV4cGVjdGVkQWxsb2NOYW1lKG9zLCBDLCBEZWFsbG9jRXhwcik7CiAgICAgfQogCi0gICAgQnVnUmVwb3J0ICpSID0gbmV3IEJ1Z1JlcG9ydCgqQlRfQmFkRnJlZSwgb3Muc3RyKCksIE4pOworICAgIEJ1Z1JlcG9ydCAqUiA9IG5ldyBCdWdSZXBvcnQoKkJUX0JhZEZyZWVbKkNoZWNrS2luZF0sIG9zLnN0cigpLCBOKTsKICAgICBSLT5tYXJrSW50ZXJlc3RpbmcoTVIpOwogICAgIFItPmFkZFJhbmdlKFJhbmdlKTsKICAgICBDLmVtaXRSZXBvcnQoUik7CkBAIC0xMjYzLDE0ICsxMzgyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJlZiBTeW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE93bmVyc2hpcFRyYW5zZmVycmVkKSBjb25zdCB7CiAKLSAgaWYgKCFGaWx0ZXIuQ01pc21hdGNoZWREZWFsbG9jYXRvckNoZWNrZXIpCisgIGlmICghQ2hlY2tzRW5hYmxlZFtDS19NaXNtYXRjaGVkRGVhbGxvY2F0b3JDaGVja2VyXSkKICAgICByZXR1cm47CiAKICAgaWYgKEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKCkpIHsKICAgICBpZiAoIUJUX01pc21hdGNoZWREZWFsbG9jKQotICAgICAgQlRfTWlzbWF0Y2hlZERlYWxsb2MucmVzZXQobmV3IEJ1Z1R5cGUoIkJhZCBkZWFsbG9jYXRvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVtb3J5IEVycm9yIikpOwotICAgIAorICAgICAgQlRfTWlzbWF0Y2hlZERlYWxsb2MucmVzZXQoCisgICAgICAgICAgbmV3IEJ1Z1R5cGUoQ2hlY2tOYW1lc1tDS19NaXNtYXRjaGVkRGVhbGxvY2F0b3JDaGVja2VyXSwKKyAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRlYWxsb2NhdG9yIiwgIk1lbW9yeSBFcnJvciIpKTsKKwogICAgIFNtYWxsU3RyaW5nPDEwMD4gYnVmOwogICAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gb3MoYnVmKTsKIApAQCAtMTMxNCwxOSArMTQzNCwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlLCBjb25zdCBFeHByICpEZWFsbG9jRXhwciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHByICpBbGxvY0V4cHIpIGNvbnN0IHsKIAotICBpZiAoIUZpbHRlci5DTWFsbG9jT3B0aW1pc3RpYyAmJiAhRmlsdGVyLkNNYWxsb2NQZXNzaW1pc3RpYyAmJiAKLSAgICAgICFGaWx0ZXIuQ05ld0RlbGV0ZUNoZWNrZXIpCisgIGlmICghQ2hlY2tzRW5hYmxlZFtDS19NYWxsb2NPcHRpbWlzdGljXSAmJgorICAgICAgIUNoZWNrc0VuYWJsZWRbQ0tfTWFsbG9jUGVzc2ltaXN0aWNdICYmCisgICAgICAhQ2hlY2tzRW5hYmxlZFtDS19OZXdEZWxldGVDaGVja2VyXSkKICAgICByZXR1cm47CiAKLSAgaWYgKCFpc1RyYWNrZWRCeUN1cnJlbnRDaGVja2VyKEMsIEFsbG9jRXhwcikpCisgIE9wdGlvbmFsPE1hbGxvY0NoZWNrZXI6OkNoZWNrS2luZD4gQ2hlY2tLaW5kID0KKyAgICAgIGdldENoZWNrSWZUcmFja2VkKEMsIEFsbG9jRXhwcik7CisgIGlmICghQ2hlY2tLaW5kLmhhc1ZhbHVlKCkpCiAgICAgcmV0dXJuOwogCiAgIEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKCk7CiAgIGlmIChOID09IE5VTEwpCiAgICAgcmV0dXJuOwogCi0gIGlmICghQlRfT2Zmc2V0RnJlZSkKLSAgICBCVF9PZmZzZXRGcmVlLnJlc2V0KG5ldyBCdWdUeXBlKCJPZmZzZXQgZnJlZSIsICJNZW1vcnkgRXJyb3IiKSk7CisgIGlmICghQlRfT2Zmc2V0RnJlZVsqQ2hlY2tLaW5kXSkKKyAgICBCVF9PZmZzZXRGcmVlWypDaGVja0tpbmRdLnJlc2V0KAorICAgICAgICBuZXcgQnVnVHlwZShDaGVja05hbWVzWypDaGVja0tpbmRdLCAiT2Zmc2V0IGZyZWUiLCAiTWVtb3J5IEVycm9yIikpOwogCiAgIFNtYWxsU3RyaW5nPDEwMD4gYnVmOwogICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zKGJ1Zik7CkBAIC0xMzU3LDcgKzE0ODEsNyBAQAogICBlbHNlCiAgICAgb3MgPDwgImFsbG9jYXRlZCBtZW1vcnkiOwogCi0gIEJ1Z1JlcG9ydCAqUiA9IG5ldyBCdWdSZXBvcnQoKkJUX09mZnNldEZyZWUsIG9zLnN0cigpLCBOKTsKKyAgQnVnUmVwb3J0ICpSID0gbmV3IEJ1Z1JlcG9ydCgqQlRfT2Zmc2V0RnJlZVsqQ2hlY2tLaW5kXSwgb3Muc3RyKCksIE4pOwogICBSLT5tYXJrSW50ZXJlc3RpbmcoTVItPmdldEJhc2VSZWdpb24oKSk7CiAgIFItPmFkZFJhbmdlKFJhbmdlKTsKICAgQy5lbWl0UmVwb3J0KFIpOwpAQCAtMTM2NiwxOCArMTQ5MCwyMSBAQAogdm9pZCBNYWxsb2NDaGVja2VyOjpSZXBvcnRVc2VBZnRlckZyZWUoQ2hlY2tlckNvbnRleHQgJkMsIFNvdXJjZVJhbmdlIFJhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmIFN5bSkgY29uc3QgewogCi0gIGlmICghRmlsdGVyLkNNYWxsb2NPcHRpbWlzdGljICYmICFGaWx0ZXIuQ01hbGxvY1Blc3NpbWlzdGljICYmIAotICAgICAgIUZpbHRlci5DTmV3RGVsZXRlQ2hlY2tlcikKKyAgaWYgKCFDaGVja3NFbmFibGVkW0NLX01hbGxvY09wdGltaXN0aWNdICYmCisgICAgICAhQ2hlY2tzRW5hYmxlZFtDS19NYWxsb2NQZXNzaW1pc3RpY10gJiYKKyAgICAgICFDaGVja3NFbmFibGVkW0NLX05ld0RlbGV0ZUNoZWNrZXJdKQogICAgIHJldHVybjsKIAotICBpZiAoIWlzVHJhY2tlZEJ5Q3VycmVudENoZWNrZXIoQywgU3ltKSkKKyAgT3B0aW9uYWw8TWFsbG9jQ2hlY2tlcjo6Q2hlY2tLaW5kPiBDaGVja0tpbmQgPSBnZXRDaGVja0lmVHJhY2tlZChDLCBTeW0pOworICBpZiAoIUNoZWNrS2luZC5oYXNWYWx1ZSgpKQogICAgIHJldHVybjsKIAogICBpZiAoRXhwbG9kZWROb2RlICpOID0gQy5nZW5lcmF0ZVNpbmsoKSkgewotICAgIGlmICghQlRfVXNlRnJlZSkKLSAgICAgIEJUX1VzZUZyZWUucmVzZXQobmV3IEJ1Z1R5cGUoIlVzZS1hZnRlci1mcmVlIiwgIk1lbW9yeSBFcnJvciIpKTsKKyAgICBpZiAoIUJUX1VzZUZyZWVbKkNoZWNrS2luZF0pCisgICAgICBCVF9Vc2VGcmVlWypDaGVja0tpbmRdLnJlc2V0KG5ldyBCdWdUeXBlKAorICAgICAgICAgIENoZWNrTmFtZXNbKkNoZWNrS2luZF0sICJVc2UtYWZ0ZXItZnJlZSIsICJNZW1vcnkgRXJyb3IiKSk7CiAKLSAgICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVF9Vc2VGcmVlLAorICAgIEJ1Z1JlcG9ydCAqUiA9IG5ldyBCdWdSZXBvcnQoKkJUX1VzZUZyZWVbKkNoZWNrS2luZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlIG9mIG1lbW9yeSBhZnRlciBpdCBpcyBmcmVlZCIsIE4pOwogCiAgICAgUi0+bWFya0ludGVyZXN0aW5nKFN5bSk7CkBAIC0xMzkxLDIxICsxNTE4LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWxlYXNlZCwgU3ltYm9sUmVmIFN5bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmIFByZXZTeW0pIGNvbnN0IHsKIAotICBpZiAoIUZpbHRlci5DTWFsbG9jT3B0aW1pc3RpYyAmJiAhRmlsdGVyLkNNYWxsb2NQZXNzaW1pc3RpYyAmJiAKLSAgICAgICFGaWx0ZXIuQ05ld0RlbGV0ZUNoZWNrZXIpCisgIGlmICghQ2hlY2tzRW5hYmxlZFtDS19NYWxsb2NPcHRpbWlzdGljXSAmJgorICAgICAgIUNoZWNrc0VuYWJsZWRbQ0tfTWFsbG9jUGVzc2ltaXN0aWNdICYmCisgICAgICAhQ2hlY2tzRW5hYmxlZFtDS19OZXdEZWxldGVDaGVja2VyXSkKICAgICByZXR1cm47CiAKLSAgaWYgKCFpc1RyYWNrZWRCeUN1cnJlbnRDaGVja2VyKEMsIFN5bSkpCisgIE9wdGlvbmFsPE1hbGxvY0NoZWNrZXI6OkNoZWNrS2luZD4gQ2hlY2tLaW5kID0gZ2V0Q2hlY2tJZlRyYWNrZWQoQywgU3ltKTsKKyAgaWYgKCFDaGVja0tpbmQuaGFzVmFsdWUoKSkKICAgICByZXR1cm47CiAKICAgaWYgKEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKCkpIHsKLSAgICBpZiAoIUJUX0RvdWJsZUZyZWUpCi0gICAgICBCVF9Eb3VibGVGcmVlLnJlc2V0KG5ldyBCdWdUeXBlKCJEb3VibGUgZnJlZSIsICJNZW1vcnkgRXJyb3IiKSk7CisgICAgaWYgKCFCVF9Eb3VibGVGcmVlWypDaGVja0tpbmRdKQorICAgICAgQlRfRG91YmxlRnJlZVsqQ2hlY2tLaW5kXS5yZXNldCgKKyAgICAgICAgICBuZXcgQnVnVHlwZShDaGVja05hbWVzWypDaGVja0tpbmRdLCAiRG91YmxlIGZyZWUiLCAiTWVtb3J5IEVycm9yIikpOwogCi0gICAgQnVnUmVwb3J0ICpSID0gbmV3IEJ1Z1JlcG9ydCgqQlRfRG91YmxlRnJlZSwKLSAgICAgIChSZWxlYXNlZCA/ICJBdHRlbXB0IHRvIGZyZWUgcmVsZWFzZWQgbWVtb3J5IgotICAgICAgICAgICAgICAgIDogIkF0dGVtcHQgdG8gZnJlZSBub24tb3duZWQgbWVtb3J5IiksCi0gICAgICBOKTsKKyAgICBCdWdSZXBvcnQgKlIgPQorICAgICAgICBuZXcgQnVnUmVwb3J0KCpCVF9Eb3VibGVGcmVlWypDaGVja0tpbmRdLAorICAgICAgICAgICAgICAgICAgICAgIChSZWxlYXNlZCA/ICJBdHRlbXB0IHRvIGZyZWUgcmVsZWFzZWQgbWVtb3J5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBdHRlbXB0IHRvIGZyZWUgbm9uLW93bmVkIG1lbW9yeSIpLAorICAgICAgICAgICAgICAgICAgICAgIE4pOwogICAgIFItPmFkZFJhbmdlKFJhbmdlKTsKICAgICBSLT5tYXJrSW50ZXJlc3RpbmcoU3ltKTsKICAgICBpZiAoUHJldlN5bSkKQEAgLTE0MTUsNiArMTU0NiwzMCBAQAogICB9CiB9CiAKK3ZvaWQgTWFsbG9jQ2hlY2tlcjo6UmVwb3J0RG91YmxlRGVsZXRlKENoZWNrZXJDb250ZXh0ICZDLCBTeW1ib2xSZWYgU3ltKSBjb25zdCB7CisKKyAgaWYgKCFDaGVja3NFbmFibGVkW0NLX05ld0RlbGV0ZUNoZWNrZXJdKQorICAgIHJldHVybjsKKworICBPcHRpb25hbDxNYWxsb2NDaGVja2VyOjpDaGVja0tpbmQ+IENoZWNrS2luZCA9IGdldENoZWNrSWZUcmFja2VkKEMsIFN5bSk7CisgIGlmICghQ2hlY2tLaW5kLmhhc1ZhbHVlKCkpCisgICAgcmV0dXJuOworICBhc3NlcnQoKkNoZWNrS2luZCA9PSBDS19OZXdEZWxldGVDaGVja2VyICYmICJpbnZhbGlkIGNoZWNrIGtpbmQiKTsKKworICBpZiAoRXhwbG9kZWROb2RlICpOID0gQy5nZW5lcmF0ZVNpbmsoKSkgeworICAgIGlmICghQlRfRG91YmxlRGVsZXRlKQorICAgICAgQlRfRG91YmxlRGVsZXRlLnJlc2V0KG5ldyBCdWdUeXBlKENoZWNrTmFtZXNbQ0tfTmV3RGVsZXRlQ2hlY2tlcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvdWJsZSBkZWxldGUiLCAiTWVtb3J5IEVycm9yIikpOworCisgICAgQnVnUmVwb3J0ICpSID0gbmV3IEJ1Z1JlcG9ydCgqQlRfRG91YmxlRGVsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gZGVsZXRlIHJlbGVhc2VkIG1lbW9yeSIsIE4pOworCisgICAgUi0+bWFya0ludGVyZXN0aW5nKFN5bSk7CisgICAgUi0+YWRkVmlzaXRvcihuZXcgTWFsbG9jQnVnVmlzaXRvcihTeW0pKTsKKyAgICBDLmVtaXRSZXBvcnQoUik7CisgIH0KK30KKwogUHJvZ3JhbVN0YXRlUmVmIE1hbGxvY0NoZWNrZXI6OlJlYWxsb2NNZW0oQ2hlY2tlckNvbnRleHQgJkMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXhwciAqQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZyZWVzT25GYWlsKSBjb25zdCB7CkBAIC0xNDUxLDkgKzE2MDYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICBzdmFsQnVpbGRlci5tYWtlSW50VmFsV2l0aFB0cldpZHRoKDAsIGZhbHNlKSk7CiAKICAgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlUHRySXNOdWxsLCBTdGF0ZVB0ck5vdE51bGw7Ci0gIGxsdm06OnRpZShTdGF0ZVB0cklzTnVsbCwgU3RhdGVQdHJOb3ROdWxsKSA9IHN0YXRlLT5hc3N1bWUoUHRyRVEpOworICBzdGQ6OnRpZShTdGF0ZVB0cklzTnVsbCwgU3RhdGVQdHJOb3ROdWxsKSA9IHN0YXRlLT5hc3N1bWUoUHRyRVEpOwogICBQcm9ncmFtU3RhdGVSZWYgU3RhdGVTaXplSXNaZXJvLCBTdGF0ZVNpemVOb3RaZXJvOwotICBsbHZtOjp0aWUoU3RhdGVTaXplSXNaZXJvLCBTdGF0ZVNpemVOb3RaZXJvKSA9IHN0YXRlLT5hc3N1bWUoU2l6ZVplcm8pOworICBzdGQ6OnRpZShTdGF0ZVNpemVJc1plcm8sIFN0YXRlU2l6ZU5vdFplcm8pID0gc3RhdGUtPmFzc3VtZShTaXplWmVybyk7CiAgIC8vIFdlIG9ubHkgYXNzdW1lIGV4Y2VwdGlvbmFsIHN0YXRlcyBpZiB0aGV5IGFyZSBkZWZpbml0ZWx5IHRydWU7IGlmIHRoZQogICAvLyBzdGF0ZSBpcyB1bmRlci1jb25zdHJhaW5lZCwgYXNzdW1lIHJlZ3VsYXIgcmVhbGxvYyBiZWhhdmlvci4KICAgYm9vbCBQcnRJc051bGwgPSBTdGF0ZVB0cklzTnVsbCAmJiAhU3RhdGVQdHJOb3ROdWxsOwpAQCAtMTU3NiwzMSArMTczMSwzNCBAQAogdm9pZCBNYWxsb2NDaGVja2VyOjpyZXBvcnRMZWFrKFN5bWJvbFJlZiBTeW0sIEV4cGxvZGVkTm9kZSAqTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQ29udGV4dCAmQykgY29uc3QgewogCi0gIGlmICghRmlsdGVyLkNNYWxsb2NPcHRpbWlzdGljICYmICFGaWx0ZXIuQ01hbGxvY1Blc3NpbWlzdGljICYmIAotICAgICAgIUZpbHRlci5DTmV3RGVsZXRlTGVha3NDaGVja2VyKQorICBpZiAoIUNoZWNrc0VuYWJsZWRbQ0tfTWFsbG9jT3B0aW1pc3RpY10gJiYKKyAgICAgICFDaGVja3NFbmFibGVkW0NLX01hbGxvY1Blc3NpbWlzdGljXSAmJgorICAgICAgIUNoZWNrc0VuYWJsZWRbQ0tfTmV3RGVsZXRlTGVha3NDaGVja2VyXSkKICAgICByZXR1cm47CiAKICAgY29uc3QgUmVmU3RhdGUgKlJTID0gQy5nZXRTdGF0ZSgpLT5nZXQ8UmVnaW9uU3RhdGU+KFN5bSk7CiAgIGFzc2VydChSUyAmJiAiY2Fubm90IGxlYWsgYW4gdW50cmFja2VkIHN5bWJvbCIpOwogICBBbGxvY2F0aW9uRmFtaWx5IEZhbWlseSA9IFJTLT5nZXRBbGxvY2F0aW9uRmFtaWx5KCk7Ci0gIGlmICghaXNUcmFja2VkQnlDdXJyZW50Q2hlY2tlcihGYW1pbHkpKQorICBPcHRpb25hbDxNYWxsb2NDaGVja2VyOjpDaGVja0tpbmQ+IENoZWNrS2luZCA9IGdldENoZWNrSWZUcmFja2VkKEZhbWlseSk7CisgIGlmICghQ2hlY2tLaW5kLmhhc1ZhbHVlKCkpCiAgICAgcmV0dXJuOwogCiAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgbmV3IGFuZCBuZXdbXTsgdGhlc2UgYXJlIGNvbnRyb2xsZWQgYnkgYSBzZXBhcmF0ZSBjaGVja2VyCiAgIC8vIGZsYWcgc28gdGhhdCB0aGV5IGNhbiBiZSBzZWxlY3RpdmVseSBkaXNhYmxlZC4KICAgaWYgKEZhbWlseSA9PSBBRl9DWFhOZXcgfHwgRmFtaWx5ID09IEFGX0NYWE5ld0FycmF5KQotICAgIGlmICghRmlsdGVyLkNOZXdEZWxldGVMZWFrc0NoZWNrZXIpCisgICAgaWYgKCFDaGVja3NFbmFibGVkW0NLX05ld0RlbGV0ZUxlYWtzQ2hlY2tlcl0pCiAgICAgICByZXR1cm47CiAKICAgYXNzZXJ0KE4pOwotICBpZiAoIUJUX0xlYWspIHsKLSAgICBCVF9MZWFrLnJlc2V0KG5ldyBCdWdUeXBlKCJNZW1vcnkgbGVhayIsICJNZW1vcnkgRXJyb3IiKSk7CisgIGlmICghQlRfTGVha1sqQ2hlY2tLaW5kXSkgeworICAgIEJUX0xlYWtbKkNoZWNrS2luZF0ucmVzZXQoCisgICAgICAgIG5ldyBCdWdUeXBlKENoZWNrTmFtZXNbKkNoZWNrS2luZF0sICJNZW1vcnkgbGVhayIsICJNZW1vcnkgRXJyb3IiKSk7CiAgICAgLy8gTGVha3Mgc2hvdWxkIG5vdCBiZSByZXBvcnRlZCBpZiB0aGV5IGFyZSBwb3N0LWRvbWluYXRlZCBieSBhIHNpbms6CiAgICAgLy8gKDEpIFNpbmtzIGFyZSBoaWdoZXIgaW1wb3J0YW5jZSBidWdzLgogICAgIC8vICgyKSBOb1JldHVybkZ1bmN0aW9uQ2hlY2tlciB1c2VzIHNpbmsgbm9kZXMgdG8gcmVwcmVzZW50IHBhdGhzIGVuZGluZwogICAgIC8vICAgICB3aXRoIF9fbm9yZXR1cm4gZnVuY3Rpb25zIHN1Y2ggYXMgYXNzZXJ0KCkgb3IgZXhpdCgpLiBXZSBjaG9vc2Ugbm90CiAgICAgLy8gICAgIHRvIHJlcG9ydCBsZWFrcyBvbiBzdWNoIHBhdGhzLgotICAgIEJUX0xlYWstPnNldFN1cHByZXNzT25TaW5rKHRydWUpOworICAgIEJUX0xlYWtbKkNoZWNrS2luZF0tPnNldFN1cHByZXNzT25TaW5rKHRydWUpOwogICB9CiAKICAgLy8gTW9zdCBidWcgcmVwb3J0cyBhcmUgY2FjaGVkIGF0IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGV5IG9jY3VycmVkLgpAQCAtMTYwOSw3ICsxNzY3LDcgQEAKICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBMb2NVc2VkRm9yVW5pcXVlaW5nOwogICBjb25zdCBFeHBsb2RlZE5vZGUgKkFsbG9jTm9kZSA9IDA7CiAgIGNvbnN0IE1lbVJlZ2lvbiAqUmVnaW9uID0gMDsKLSAgbGx2bTo6dGllKEFsbG9jTm9kZSwgUmVnaW9uKSA9IGdldEFsbG9jYXRpb25TaXRlKE4sIFN5bSwgQyk7CisgIHN0ZDo6dGllKEFsbG9jTm9kZSwgUmVnaW9uKSA9IGdldEFsbG9jYXRpb25TaXRlKE4sIFN5bSwgQyk7CiAgIAogICBQcm9ncmFtUG9pbnQgUCA9IEFsbG9jTm9kZS0+Z2V0TG9jYXRpb24oKTsKICAgY29uc3QgU3RtdCAqQWxsb2NhdGlvblN0bXQgPSAwOwpAQCAtMTYzMSw5ICsxNzg5LDkgQEAKICAgICBvcyA8PCAiUG90ZW50aWFsIG1lbW9yeSBsZWFrIjsKICAgfQogCi0gIEJ1Z1JlcG9ydCAqUiA9IG5ldyBCdWdSZXBvcnQoKkJUX0xlYWssIG9zLnN0cigpLCBOLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NVc2VkRm9yVW5pcXVlaW5nLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY05vZGUtPmdldExvY2F0aW9uQ29udGV4dCgpLT5nZXREZWNsKCkpOworICBCdWdSZXBvcnQgKlIgPQorICAgICAgbmV3IEJ1Z1JlcG9ydCgqQlRfTGVha1sqQ2hlY2tLaW5kXSwgb3Muc3RyKCksIE4sIExvY1VzZWRGb3JVbmlxdWVpbmcsCisgICAgICAgICAgICAgICAgICAgIEFsbG9jTm9kZS0+Z2V0TG9jYXRpb25Db250ZXh0KCktPmdldERlY2woKSk7CiAgIFItPm1hcmtJbnRlcmVzdGluZyhTeW0pOwogICBSLT5hZGRWaXNpdG9yKG5ldyBNYWxsb2NCdWdWaXNpdG9yKFN5bSwgdHJ1ZSkpOwogICBDLmVtaXRSZXBvcnQoUik7CkBAIC0xNjgxLDcgKzE4MzksNyBAQAogICAvLyBHZW5lcmF0ZSBsZWFrIG5vZGUuCiAgIEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2V0UHJlZGVjZXNzb3IoKTsKICAgaWYgKCFFcnJvcnMuZW1wdHkoKSkgewotICAgIHN0YXRpYyBTaW1wbGVQcm9ncmFtUG9pbnRUYWcgVGFnKCJNYWxsb2NDaGVja2VyIDogRGVhZFN5bWJvbHNMZWFrIik7CisgICAgc3RhdGljIENoZWNrZXJQcm9ncmFtUG9pbnRUYWcgVGFnKCJNYWxsb2NDaGVja2VyIiwgIkRlYWRTeW1ib2xzTGVhayIpOwogICAgIE4gPSBDLmFkZFRyYW5zaXRpb24oQy5nZXRTdGF0ZSgpLCBDLmdldFByZWRlY2Vzc29yKCksICZUYWcpOwogICAgIGZvciAoU21hbGxWZWN0b3JJbXBsPFN5bWJvbFJlZj46Oml0ZXJhdG9yCiAgICAgICAgICAgIEkgPSBFcnJvcnMuYmVnaW4oKSwgRSA9IEVycm9ycy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKQEAgLTE2OTUsMTcgKzE4NTMsMjQgQEAKIHZvaWQgTWFsbG9jQ2hlY2tlcjo6Y2hlY2tQcmVDYWxsKGNvbnN0IENhbGxFdmVudCAmQ2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdCB7CiAKKyAgaWYgKGNvbnN0IENYWERlc3RydWN0b3JDYWxsICpEQyA9IGR5bl9jYXN0PENYWERlc3RydWN0b3JDYWxsPigmQ2FsbCkpIHsKKyAgICBTeW1ib2xSZWYgU3ltID0gREMtPmdldENYWFRoaXNWYWwoKS5nZXRBc1N5bWJvbCgpOworICAgIGlmICghU3ltIHx8IGNoZWNrRG91YmxlRGVsZXRlKFN5bSwgQykpCisgICAgICByZXR1cm47CisgIH0KKwogICAvLyBXZSB3aWxsIGNoZWNrIGZvciBkb3VibGUgZnJlZSBpbiB0aGUgcG9zdCB2aXNpdC4KICAgaWYgKGNvbnN0IEFueUZ1bmN0aW9uQ2FsbCAqRkMgPSBkeW5fY2FzdDxBbnlGdW5jdGlvbkNhbGw+KCZDYWxsKSkgewogICAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBGQy0+Z2V0RGVjbCgpOwogICAgIGlmICghRkQpCiAgICAgICByZXR1cm47CiAKLSAgICBpZiAoKEZpbHRlci5DTWFsbG9jT3B0aW1pc3RpYyB8fCBGaWx0ZXIuQ01hbGxvY1Blc3NpbWlzdGljKSAmJgorICAgIGlmICgoQ2hlY2tzRW5hYmxlZFtDS19NYWxsb2NPcHRpbWlzdGljXSB8fAorICAgICAgICAgQ2hlY2tzRW5hYmxlZFtDS19NYWxsb2NQZXNzaW1pc3RpY10pICYmCiAgICAgICAgIGlzRnJlZUZ1bmN0aW9uKEZELCBDLmdldEFTVENvbnRleHQoKSkpCiAgICAgICByZXR1cm47CiAKLSAgICBpZiAoRmlsdGVyLkNOZXdEZWxldGVDaGVja2VyICYmCisgICAgaWYgKENoZWNrc0VuYWJsZWRbQ0tfTmV3RGVsZXRlQ2hlY2tlcl0gJiYKICAgICAgICAgaXNTdGFuZGFyZE5ld0RlbGV0ZShGRCwgQy5nZXRBU1RDb250ZXh0KCkpKQogICAgICAgcmV0dXJuOwogICB9CkBAIC0xODAzLDggKzE5NjgsNyBAQAogYm9vbCBNYWxsb2NDaGVja2VyOjpjaGVja1VzZUFmdGVyRnJlZShTeW1ib2xSZWYgU3ltLCBDaGVja2VyQ29udGV4dCAmQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RtdCAqUykgY29uc3QgewogCi0gIC8vIEZJWE1FOiBIYW5kbGUgZGVzdHJ1Y3RvciBjYWxsZWQgZnJvbSBkZWxldGUgbW9yZSBwcmVjaXNlbHkuCi0gIGlmIChpc1JlbGVhc2VkKFN5bSwgQykgJiYgUykgeworICBpZiAoaXNSZWxlYXNlZChTeW0sIEMpKSB7CiAgICAgUmVwb3J0VXNlQWZ0ZXJGcmVlKEMsIFMtPmdldFNvdXJjZVJhbmdlKCksIFN5bSk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTE4MTIsNiArMTk3NiwxNSBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgTWFsbG9jQ2hlY2tlcjo6Y2hlY2tEb3VibGVEZWxldGUoU3ltYm9sUmVmIFN5bSwgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0IHsKKworICBpZiAoaXNSZWxlYXNlZChTeW0sIEMpKSB7CisgICAgUmVwb3J0RG91YmxlRGVsZXRlKEMsIFN5bSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCiAvLyBDaGVjayBpZiB0aGUgbG9jYXRpb24gaXMgYSBmcmVlZCBzeW1ib2xpYyByZWdpb24uCiB2b2lkIE1hbGxvY0NoZWNrZXI6OmNoZWNrTG9jYXRpb24oU1ZhbCBsLCBib29sIGlzTG9hZCwgY29uc3QgU3RtdCAqUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQ29udGV4dCAmQykgY29uc3QgewpAQCAtMTg2OSwxMSArMjA0MiwxMSBAQAogICBhc3NlcnQoQ2FsbCk7CiAgIEVzY2FwaW5nU3ltYm9sID0gMDsKICAgCi0gIC8vIEZvciBub3csIGFzc3VtZSB0aGF0IGFueSBDKysgY2FsbCBjYW4gZnJlZSBtZW1vcnkuCisgIC8vIEZvciBub3csIGFzc3VtZSB0aGF0IGFueSBDKysgb3IgYmxvY2sgY2FsbCBjYW4gZnJlZSBtZW1vcnkuCiAgIC8vIFRPRE86IElmIHdlIHdhbnQgdG8gYmUgbW9yZSBvcHRpbWlzdGljIGhlcmUsIHdlJ2xsIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQKICAgLy8gcmVnaW9ucyBlc2NhcGUgdG8gQysrIGNvbnRhaW5lcnMuIFRoZXkgc2VlbSB0byBkbyB0aGF0IGV2ZW4gbm93LCBidXQgZm9yCiAgIC8vIG15c3RlcmlvdXMgcmVhc29ucy4KLSAgaWYgKCEoaXNhPEZ1bmN0aW9uQ2FsbD4oQ2FsbCkgfHwgaXNhPE9iakNNZXRob2RDYWxsPihDYWxsKSkpCisgIGlmICghKGlzYTxTaW1wbGVGdW5jdGlvbkNhbGw+KENhbGwpIHx8IGlzYTxPYmpDTWV0aG9kQ2FsbD4oQ2FsbCkpKQogICAgIHJldHVybiB0cnVlOwogCiAgIC8vIENoZWNrIE9iamVjdGl2ZS1DIG1lc3NhZ2VzIGJ5IHNlbGVjdG9yIG5hbWUuCkBAIC0xOTA5LDcgKzIwODIsOCBAQAogICAgIC8vIHRoYXQgdGhlIHBvaW50ZXJzIGdldCBmcmVlZCBieSBmb2xsb3dpbmcgdGhlIGNvbnRhaW5lciBpdHNlbGYuCiAgICAgaWYgKEZpcnN0U2xvdC5zdGFydHN3aXRoKCJhZGRQb2ludGVyIikgfHwKICAgICAgICAgRmlyc3RTbG90LnN0YXJ0c3dpdGgoImluc2VydFBvaW50ZXIiKSB8fAotICAgICAgICBGaXJzdFNsb3Quc3RhcnRzd2l0aCgicmVwbGFjZVBvaW50ZXIiKSkgeworICAgICAgICBGaXJzdFNsb3Quc3RhcnRzd2l0aCgicmVwbGFjZVBvaW50ZXIiKSB8fAorICAgICAgICBGaXJzdFNsb3QuZXF1YWxzKCJ2YWx1ZVdpdGhQb2ludGVyIikpIHsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMTkyNyw3ICsyMTAxLDcgQEAKICAgfQogCiAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIG9ubHkgdGhpbmcgbGVmdCB0byBoYW5kbGUgaXMgc3RyYWlnaHQgZnVuY3Rpb24gY2FsbHMuCi0gIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBjYXN0PEZ1bmN0aW9uQ2FsbD4oQ2FsbCktPmdldERlY2woKTsKKyAgY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGNhc3Q8U2ltcGxlRnVuY3Rpb25DYWxsPihDYWxsKS0+Z2V0RGVjbCgpOwogICBpZiAoIUZEKQogICAgIHJldHVybiB0cnVlOwogCkBAIC0yMTMwLDcgKzIzMDQsNyBAQAogICAgICAgU3RhY2tIaW50ID0gbmV3IFN0YWNrSGludEdlbmVyYXRvckZvclN5bWJvbChTeW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmV0dXJuaW5nOyBtZW1vcnkgd2FzIHJlbGVhc2VkIik7CiAgICAgfSBlbHNlIGlmIChpc1JlbGlucXVpc2hlZChSUywgUlNQcmV2LCBTKSkgewotICAgICAgTXNnID0gIk1lbW9yeSBvd25lcnNoaXAgaXMgdHJhbnNmZXJlZCI7CisgICAgICBNc2cgPSAiTWVtb3J5IG93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCI7CiAgICAgICBTdGFja0hpbnQgPSBuZXcgU3RhY2tIaW50R2VuZXJhdG9yRm9yU3ltYm9sKFN5bSwgIiIpOwogICAgIH0gZWxzZSBpZiAoaXNSZWFsbG9jRmFpbGVkQ2hlY2soUlMsIFJTUHJldiwgUykpIHsKICAgICAgIE1vZGUgPSBSZWFsbG9jYXRpb25GYWlsZWQ7CkBAIC0yMTc4LDExICsyMzUyLDE3IEBACiAgIFJlZ2lvblN0YXRlVHkgUlMgPSBTdGF0ZS0+Z2V0PFJlZ2lvblN0YXRlPigpOwogCiAgIGlmICghUlMuaXNFbXB0eSgpKSB7Ci0gICAgT3V0IDw8IFNlcCA8PCAiTWFsbG9jQ2hlY2tlcjoiIDw8IE5MOworICAgIE91dCA8PCBTZXAgPDwgIk1hbGxvY0NoZWNrZXIgOiIgPDwgTkw7CiAgICAgZm9yIChSZWdpb25TdGF0ZVR5OjppdGVyYXRvciBJID0gUlMuYmVnaW4oKSwgRSA9IFJTLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgICAgY29uc3QgUmVmU3RhdGUgKlJlZlMgPSBTdGF0ZS0+Z2V0PFJlZ2lvblN0YXRlPihJLmdldEtleSgpKTsKKyAgICAgIEFsbG9jYXRpb25GYW1pbHkgRmFtaWx5ID0gUmVmUy0+Z2V0QWxsb2NhdGlvbkZhbWlseSgpOworICAgICAgT3B0aW9uYWw8TWFsbG9jQ2hlY2tlcjo6Q2hlY2tLaW5kPiBDaGVja0tpbmQgPSBnZXRDaGVja0lmVHJhY2tlZChGYW1pbHkpOworCiAgICAgICBJLmdldEtleSgpLT5kdW1wVG9TdHJlYW0oT3V0KTsKICAgICAgIE91dCA8PCAiIDogIjsKICAgICAgIEkuZ2V0RGF0YSgpLmR1bXAoT3V0KTsKKyAgICAgIGlmIChDaGVja0tpbmQuaGFzVmFsdWUoKSkKKyAgICAgICAgT3V0IDw8ICIgKCIgPDwgQ2hlY2tOYW1lc1sqQ2hlY2tLaW5kXS5nZXROYW1lKCkgPDwgIikiOwogICAgICAgT3V0IDw8IE5MOwogICAgIH0KICAgfQpAQCAtMjE5MCwxNyArMjM3MCwyMyBAQAogCiB2b2lkIGVudG86OnJlZ2lzdGVyTmV3RGVsZXRlTGVha3NDaGVja2VyKENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKICAgcmVnaXN0ZXJDU3RyaW5nQ2hlY2tlckJhc2ljKG1ncik7Ci0gIG1nci5yZWdpc3RlckNoZWNrZXI8TWFsbG9jQ2hlY2tlcj4oKS0+RmlsdGVyLkNOZXdEZWxldGVMZWFrc0NoZWNrZXIgPSB0cnVlOworICBNYWxsb2NDaGVja2VyICpjaGVja2VyID0gbWdyLnJlZ2lzdGVyQ2hlY2tlcjxNYWxsb2NDaGVja2VyPigpOworICBjaGVja2VyLT5DaGVja3NFbmFibGVkW01hbGxvY0NoZWNrZXI6OkNLX05ld0RlbGV0ZUxlYWtzQ2hlY2tlcl0gPSB0cnVlOworICBjaGVja2VyLT5DaGVja05hbWVzW01hbGxvY0NoZWNrZXI6OkNLX05ld0RlbGV0ZUxlYWtzQ2hlY2tlcl0gPQorICAgICAgbWdyLmdldEN1cnJlbnRDaGVja05hbWUoKTsKICAgLy8gV2UgY3VycmVudGx5IHRyZWF0IE5ld0RlbGV0ZUxlYWtzIGNoZWNrZXIgYXMgYSBzdWJjaGVja2VyIG9mIE5ld0RlbGV0ZSAKICAgLy8gY2hlY2tlci4KLSAgbWdyLnJlZ2lzdGVyQ2hlY2tlcjxNYWxsb2NDaGVja2VyPigpLT5GaWx0ZXIuQ05ld0RlbGV0ZUNoZWNrZXIgPSB0cnVlOworICBpZiAoIWNoZWNrZXItPkNoZWNrc0VuYWJsZWRbTWFsbG9jQ2hlY2tlcjo6Q0tfTmV3RGVsZXRlQ2hlY2tlcl0pCisgICAgY2hlY2tlci0+Q2hlY2tzRW5hYmxlZFtNYWxsb2NDaGVja2VyOjpDS19OZXdEZWxldGVDaGVja2VyXSA9IHRydWU7CiB9CiAKLSNkZWZpbmUgUkVHSVNURVJfQ0hFQ0tFUihuYW1lKSBcCi12b2lkIGVudG86OnJlZ2lzdGVyIyNuYW1lKENoZWNrZXJNYW5hZ2VyICZtZ3IpIHtcCi0gIHJlZ2lzdGVyQ1N0cmluZ0NoZWNrZXJCYXNpYyhtZ3IpOyBcCi0gIG1nci5yZWdpc3RlckNoZWNrZXI8TWFsbG9jQ2hlY2tlcj4oKS0+RmlsdGVyLkMjI25hbWUgPSB0cnVlO1wKLX0KKyNkZWZpbmUgUkVHSVNURVJfQ0hFQ0tFUihuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgZW50bzo6cmVnaXN0ZXIjI25hbWUoQ2hlY2tlck1hbmFnZXIgJm1ncikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlZ2lzdGVyQ1N0cmluZ0NoZWNrZXJCYXNpYyhtZ3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWxsb2NDaGVja2VyICpjaGVja2VyID0gbWdyLnJlZ2lzdGVyQ2hlY2tlcjxNYWxsb2NDaGVja2VyPigpOyAgICAgICAgICAgICBcCisgICAgY2hlY2tlci0+Q2hlY2tzRW5hYmxlZFtNYWxsb2NDaGVja2VyOjpDS18jI25hbWVdID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgXAorICAgIGNoZWNrZXItPkNoZWNrTmFtZXNbTWFsbG9jQ2hlY2tlcjo6Q0tfIyNuYW1lXSA9IG1nci5nZXRDdXJyZW50Q2hlY2tOYW1lKCk7IFwKKyAgfQogCiBSRUdJU1RFUl9DSEVDS0VSKE1hbGxvY1Blc3NpbWlzdGljKQogUkVHSVNURVJfQ0hFQ0tFUihNYWxsb2NPcHRpbWlzdGljKQpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL01hbGxvY092ZXJmbG93U2VjdXJpdHlDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9NYWxsb2NPdmVyZmxvd1NlY3VyaXR5Q2hlY2tlci5jcHAKaW5kZXggMGNkZjkxMS4uODA5NzcyNyAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL01hbGxvY092ZXJmbG93U2VjdXJpdHlDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTWFsbG9jT3ZlcmZsb3dTZWN1cml0eUNoZWNrZXIuY3BwCkBAIC0yMTMsMTEgKzIxMywxMiBAQAogICAgICAgIGUgPSBQb3NzaWJsZU1hbGxvY092ZXJmbG93cy5lbmQoKTsKICAgICAgICBpICE9IGU7CiAgICAgICAgKytpKSB7Ci0gICAgQlIuRW1pdEJhc2ljUmVwb3J0KEQsICJtYWxsb2MoKSBzaXplIG92ZXJmbG93IiwgY2F0ZWdvcmllczo6VW5peEFQSSwKLSAgICAgICJ0aGUgY29tcHV0YXRpb24gb2YgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG1heSBvdmVyZmxvdyIsCi0gICAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uOjpjcmVhdGVPcGVyYXRvckxvYyhpLT5tdWxvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJSLmdldFNvdXJjZU1hbmFnZXIoKSksCi0gICAgICBpLT5tdWxvcC0+Z2V0U291cmNlUmFuZ2UoKSk7CisgICAgQlIuRW1pdEJhc2ljUmVwb3J0KAorICAgICAgICBELCB0aGlzLCAibWFsbG9jKCkgc2l6ZSBvdmVyZmxvdyIsIGNhdGVnb3JpZXM6OlVuaXhBUEksCisgICAgICAgICJ0aGUgY29tcHV0YXRpb24gb2YgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG1heSBvdmVyZmxvdyIsCisgICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZU9wZXJhdG9yTG9jKGktPm11bG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUi5nZXRTb3VyY2VNYW5hZ2VyKCkpLAorICAgICAgICBpLT5tdWxvcC0+Z2V0U291cmNlUmFuZ2UoKSk7CiAgIH0KIH0KIApAQCAtMjYyLDYgKzI2Myw3IEBACiAgIE91dHB1dFBvc3NpYmxlT3ZlcmZsb3dzKFBvc3NpYmxlTWFsbG9jT3ZlcmZsb3dzLCBELCBCUiwgbWdyKTsKIH0KIAotdm9pZCBlbnRvOjpyZWdpc3Rlck1hbGxvY092ZXJmbG93U2VjdXJpdHlDaGVja2VyKENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKK3ZvaWQKK2VudG86OnJlZ2lzdGVyTWFsbG9jT3ZlcmZsb3dTZWN1cml0eUNoZWNrZXIoQ2hlY2tlck1hbmFnZXIgJm1ncikgewogICBtZ3IucmVnaXN0ZXJDaGVja2VyPE1hbGxvY092ZXJmbG93U2VjdXJpdHlDaGVja2VyPigpOwogfQpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL01hbGxvY1NpemVvZkNoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL01hbGxvY1NpemVvZkNoZWNrZXIuY3BwCmluZGV4IDZjNzc2ZWIuLjViMDY4YzggMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9NYWxsb2NTaXplb2ZDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTWFsbG9jU2l6ZW9mQ2hlY2tlci5jcHAKQEAgLTEwMSw5ICsxMDEsOCBAQAogICB9CiAKICAgVHlwZUNhbGxQYWlyIFZpc2l0RGVjbFN0bXQoY29uc3QgRGVjbFN0bXQgKlMpIHsKLSAgICBmb3IgKERlY2xTdG10Ojpjb25zdF9kZWNsX2l0ZXJhdG9yIEkgPSBTLT5kZWNsX2JlZ2luKCksIEUgPSBTLT5kZWNsX2VuZCgpOwotICAgICAgICAgSSE9RTsgKytJKQotICAgICAgaWYgKGNvbnN0IFZhckRlY2wgKlZEID0gZHluX2Nhc3Q8VmFyRGVjbD4oKkkpKQorICAgIGZvciAoY29uc3QgYXV0byAqSSA6IFMtPmRlY2xzKCkpCisgICAgICBpZiAoY29uc3QgVmFyRGVjbCAqVkQgPSBkeW5fY2FzdDxWYXJEZWNsPihJKSkKICAgICAgICAgaWYgKGNvbnN0IEV4cHIgKkluaXQgPSBWRC0+Z2V0SW5pdCgpKQogICAgICAgICAgIFZpc2l0Q2hpbGQoVkQsIEluaXQpOwogICAgIHJldHVybiBUeXBlQ2FsbFBhaXIoKTsKQEAgLTIzNiwxMCArMjM1LDggQEAKICAgICAgICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUJlZ2luKGktPkFsbG9jQ2FsbC0+Z2V0Q2FsbGVlKCksCiAgICAgICAgICAgICAgICAgQlIuZ2V0U291cmNlTWFuYWdlcigpLCBBREMpOwogCi0gICAgICAgIEJSLkVtaXRCYXNpY1JlcG9ydChELCAiQWxsb2NhdG9yIHNpemVvZiBvcGVyYW5kIG1pc21hdGNoIiwKLSAgICAgICAgICAgIGNhdGVnb3JpZXM6OlVuaXhBUEksCi0gICAgICAgICAgICBPUy5zdHIoKSwKLSAgICAgICAgICAgIEwsIFJhbmdlcyk7CisgICAgICAgIEJSLkVtaXRCYXNpY1JlcG9ydChELCB0aGlzLCAiQWxsb2NhdG9yIHNpemVvZiBvcGVyYW5kIG1pc21hdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3JpZXM6OlVuaXhBUEksIE9TLnN0cigpLCBMLCBSYW5nZXMpOwogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL05TQXV0b3JlbGVhc2VQb29sQ2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTlNBdXRvcmVsZWFzZVBvb2xDaGVja2VyLmNwcAppbmRleCBmYzI4ZTFmLi5iMTgwYzAzIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTlNBdXRvcmVsZWFzZVBvb2xDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTlNBdXRvcmVsZWFzZVBvb2xDaGVja2VyLmNwcApAQCAtMzIsNyArMzIsNyBAQAogbmFtZXNwYWNlIHsKIGNsYXNzIE5TQXV0b3JlbGVhc2VQb29sQ2hlY2tlcgogICA6IHB1YmxpYyBDaGVja2VyPGNoZWNrOjpQcmVPYmpDTWVzc2FnZT4gewotICBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVDsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlQ7CiAgIG11dGFibGUgU2VsZWN0b3IgcmVsZWFzZVM7CiAKIHB1YmxpYzoKQEAgLTU5LDcgKzU5LDcgQEAKICAgICByZXR1cm47CiAKICAgaWYgKCFCVCkKLSAgICBCVC5yZXNldChuZXcgQnVnVHlwZSgiVXNlIC1kcmFpbiBpbnN0ZWFkIG9mIC1yZWxlYXNlIiwKKyAgICBCVC5yZXNldChuZXcgQnVnVHlwZSh0aGlzLCAiVXNlIC1kcmFpbiBpbnN0ZWFkIG9mIC1yZWxlYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiQVBJIFVwZ3JhZGUgKEFwcGxlKSIpKTsKIAogICBFeHBsb2RlZE5vZGUgKk4gPSBDLmFkZFRyYW5zaXRpb24oKTsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9OU0Vycm9yQ2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTlNFcnJvckNoZWNrZXIuY3BwCmluZGV4IDlmMDE1MjIuLjVhNTA1ZmMgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9OU0Vycm9yQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL05TRXJyb3JDaGVja2VyLmNwcApAQCAtNTQsMTYgKzU0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXIgJkJSKSBjb25zdCB7CiAgIGlmICghRC0+aXNUaGlzRGVjbGFyYXRpb25BRGVmaW5pdGlvbigpKQogICAgIHJldHVybjsKLSAgaWYgKCFELT5nZXRSZXN1bHRUeXBlKCktPmlzVm9pZFR5cGUoKSkKKyAgaWYgKCFELT5nZXRSZXR1cm5UeXBlKCktPmlzVm9pZFR5cGUoKSkKICAgICByZXR1cm47CiAKICAgaWYgKCFJSSkKICAgICBJSSA9ICZELT5nZXRBU1RDb250ZXh0KCkuSWRlbnRzLmdldCgiTlNFcnJvciIpOyAKIAogICBib29sIGhhc05TRXJyb3IgPSBmYWxzZTsKLSAgZm9yIChPYmpDTWV0aG9kRGVjbDo6cGFyYW1fY29uc3RfaXRlcmF0b3IKLSAgICAgICAgIEkgPSBELT5wYXJhbV9iZWdpbigpLCBFID0gRC0+cGFyYW1fZW5kKCk7IEkgIT0gRTsgKytJKSAgewotICAgIGlmIChJc05TRXJyb3IoKCpJKS0+Z2V0VHlwZSgpLCBJSSkpIHsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogRC0+cGFyYW1zKCkpICB7CisgICAgaWYgKElzTlNFcnJvcihJLT5nZXRUeXBlKCksIElJKSkgewogICAgICAgaGFzTlNFcnJvciA9IHRydWU7CiAgICAgICBicmVhazsKICAgICB9CkBAIC03NSw3ICs3NCw3IEBACiAgICAgICAgICJlcnJvciBvY2N1cnJlZCI7CiAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBMID0KICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZShELCBCUi5nZXRTb3VyY2VNYW5hZ2VyKCkpOwotICAgIEJSLkVtaXRCYXNpY1JlcG9ydChELCAiQmFkIHJldHVybiB0eXBlIHdoZW4gcGFzc2luZyBOU0Vycm9yKioiLAorICAgIEJSLkVtaXRCYXNpY1JlcG9ydChELCB0aGlzLCAiQmFkIHJldHVybiB0eXBlIHdoZW4gcGFzc2luZyBOU0Vycm9yKioiLAogICAgICAgICAgICAgICAgICAgICAgICAiQ29kaW5nIGNvbnZlbnRpb25zIChBcHBsZSkiLCBlcnIsIEwpOwogICB9CiB9CkBAIC0xMDIsMTYgKzEwMSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyICZCUikgY29uc3QgewogICBpZiAoIUQtPmRvZXNUaGlzRGVjbGFyYXRpb25IYXZlQUJvZHkoKSkKICAgICByZXR1cm47Ci0gIGlmICghRC0+Z2V0UmVzdWx0VHlwZSgpLT5pc1ZvaWRUeXBlKCkpCisgIGlmICghRC0+Z2V0UmV0dXJuVHlwZSgpLT5pc1ZvaWRUeXBlKCkpCiAgICAgcmV0dXJuOwogCiAgIGlmICghSUkpCiAgICAgSUkgPSAmRC0+Z2V0QVNUQ29udGV4dCgpLklkZW50cy5nZXQoIkNGRXJyb3JSZWYiKTsgCiAKICAgYm9vbCBoYXNDRkVycm9yID0gZmFsc2U7Ci0gIGZvciAoRnVuY3Rpb25EZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvcgotICAgICAgICAgSSA9IEQtPnBhcmFtX2JlZ2luKCksIEUgPSBELT5wYXJhbV9lbmQoKTsgSSAhPSBFOyArK0kpICB7Ci0gICAgaWYgKElzQ0ZFcnJvcigoKkkpLT5nZXRUeXBlKCksIElJKSkgeworICBmb3IgKGF1dG8gSSA6IEQtPnBhcmFtcygpKSAgeworICAgIGlmIChJc0NGRXJyb3IoSS0+Z2V0VHlwZSgpLCBJSSkpIHsKICAgICAgIGhhc0NGRXJyb3IgPSB0cnVlOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMTIzLDcgKzEyMSw3IEBACiAgICAgICAgICJlcnJvciBvY2N1cnJlZCI7CiAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBMID0KICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZShELCBCUi5nZXRTb3VyY2VNYW5hZ2VyKCkpOwotICAgIEJSLkVtaXRCYXNpY1JlcG9ydChELCAiQmFkIHJldHVybiB0eXBlIHdoZW4gcGFzc2luZyBDRkVycm9yUmVmKiIsCisgICAgQlIuRW1pdEJhc2ljUmVwb3J0KEQsIHRoaXMsICJCYWQgcmV0dXJuIHR5cGUgd2hlbiBwYXNzaW5nIENGRXJyb3JSZWYqIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNvZGluZyBjb252ZW50aW9ucyAoQXBwbGUpIiwgZXJyLCBMKTsKICAgfQogfQpAQCAtMTM2LDE0ICsxMzQsMTYgQEAKIAogY2xhc3MgTlNFcnJvckRlcmVmQnVnIDogcHVibGljIEJ1Z1R5cGUgewogcHVibGljOgotICBOU0Vycm9yRGVyZWZCdWcoKSA6IEJ1Z1R5cGUoIk5TRXJyb3IqKiBudWxsIGRlcmVmZXJlbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2RpbmcgY29udmVudGlvbnMgKEFwcGxlKSIpIHt9CisgIE5TRXJyb3JEZXJlZkJ1Zyhjb25zdCBDaGVja2VyQmFzZSAqQ2hlY2tlcikKKyAgICAgIDogQnVnVHlwZShDaGVja2VyLCAiTlNFcnJvcioqIG51bGwgZGVyZWZlcmVuY2UiLAorICAgICAgICAgICAgICAgICJDb2RpbmcgY29udmVudGlvbnMgKEFwcGxlKSIpIHt9CiB9OwogCiBjbGFzcyBDRkVycm9yRGVyZWZCdWcgOiBwdWJsaWMgQnVnVHlwZSB7CiBwdWJsaWM6Ci0gIENGRXJyb3JEZXJlZkJ1ZygpIDogQnVnVHlwZSgiQ0ZFcnJvclJlZiogbnVsbCBkZXJlZmVyZW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29kaW5nIGNvbnZlbnRpb25zIChBcHBsZSkiKSB7fQorICBDRkVycm9yRGVyZWZCdWcoY29uc3QgQ2hlY2tlckJhc2UgKkNoZWNrZXIpCisgICAgICA6IEJ1Z1R5cGUoQ2hlY2tlciwgIkNGRXJyb3JSZWYqIG51bGwgZGVyZWZlcmVuY2UiLAorICAgICAgICAgICAgICAgICJDb2RpbmcgY29udmVudGlvbnMgKEFwcGxlKSIpIHt9CiB9OwogCiB9CkBAIC0yNjQsMTEgKzI2NCwxMCBAQAogCiAgIEJ1Z1R5cGUgKmJ1ZyA9IDA7CiAgIGlmIChpc05TRXJyb3IpCi0gICAgYnVnID0gbmV3IE5TRXJyb3JEZXJlZkJ1ZygpOworICAgIGJ1ZyA9IG5ldyBOU0Vycm9yRGVyZWZCdWcodGhpcyk7CiAgIGVsc2UKLSAgICBidWcgPSBuZXcgQ0ZFcnJvckRlcmVmQnVnKCk7Ci0gIEJ1Z1JlcG9ydCAqcmVwb3J0ID0gbmV3IEJ1Z1JlcG9ydCgqYnVnLCBvcy5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5TaW5rTm9kZSk7CisgICAgYnVnID0gbmV3IENGRXJyb3JEZXJlZkJ1Zyh0aGlzKTsKKyAgQnVnUmVwb3J0ICpyZXBvcnQgPSBuZXcgQnVnUmVwb3J0KCpidWcsIG9zLnN0cigpLCBldmVudC5TaW5rTm9kZSk7CiAgIEJSLmVtaXRSZXBvcnQocmVwb3J0KTsKIH0KIApAQCAtMzA1LDE0ICszMDQsMTQgQEAKIAogdm9pZCBlbnRvOjpyZWdpc3Rlck5TRXJyb3JDaGVja2VyKENoZWNrZXJNYW5hZ2VyICZtZ3IpIHsKICAgbWdyLnJlZ2lzdGVyQ2hlY2tlcjxOU0Vycm9yTWV0aG9kQ2hlY2tlcj4oKTsKLSAgTlNPckNGRXJyb3JEZXJlZkNoZWNrZXIgKgotICAgIGNoZWNrZXIgPSBtZ3IucmVnaXN0ZXJDaGVja2VyPE5TT3JDRkVycm9yRGVyZWZDaGVja2VyPigpOworICBOU09yQ0ZFcnJvckRlcmVmQ2hlY2tlciAqY2hlY2tlciA9CisgICAgICBtZ3IucmVnaXN0ZXJDaGVja2VyPE5TT3JDRkVycm9yRGVyZWZDaGVja2VyPigpOwogICBjaGVja2VyLT5TaG91bGRDaGVja05TRXJyb3IgPSB0cnVlOwogfQogCiB2b2lkIGVudG86OnJlZ2lzdGVyQ0ZFcnJvckNoZWNrZXIoQ2hlY2tlck1hbmFnZXIgJm1ncikgewogICBtZ3IucmVnaXN0ZXJDaGVja2VyPENGRXJyb3JGdW5jdGlvbkNoZWNrZXI+KCk7Ci0gIE5TT3JDRkVycm9yRGVyZWZDaGVja2VyICoKLSAgICBjaGVja2VyID0gbWdyLnJlZ2lzdGVyQ2hlY2tlcjxOU09yQ0ZFcnJvckRlcmVmQ2hlY2tlcj4oKTsKKyAgTlNPckNGRXJyb3JEZXJlZkNoZWNrZXIgKmNoZWNrZXIgPQorICAgICAgbWdyLnJlZ2lzdGVyQ2hlY2tlcjxOU09yQ0ZFcnJvckRlcmVmQ2hlY2tlcj4oKTsKICAgY2hlY2tlci0+U2hvdWxkQ2hlY2tDRkVycm9yID0gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Ob1JldHVybkZ1bmN0aW9uQ2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTm9SZXR1cm5GdW5jdGlvbkNoZWNrZXIuY3BwCmluZGV4IDBlMTA2NGUuLjBlOWNiYmEgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Ob1JldHVybkZ1bmN0aW9uQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL05vUmV0dXJuRnVuY3Rpb25DaGVja2VyLmNwcApAQCAtMzcsMTEgKzM3LDEwIEBACiAKIHZvaWQgTm9SZXR1cm5GdW5jdGlvbkNoZWNrZXI6OmNoZWNrUG9zdENhbGwoY29uc3QgQ2FsbEV2ZW50ICZDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0IHsKLSAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlID0gQy5nZXRTdGF0ZSgpOwogICBib29sIEJ1aWxkU2lua3MgPSBmYWxzZTsKIAogICBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGR5bl9jYXN0X29yX251bGw8RnVuY3Rpb25EZWNsPihDRS5nZXREZWNsKCkpKQotICAgIEJ1aWxkU2lua3MgPSBGRC0+Z2V0QXR0cjxBbmFseXplck5vUmV0dXJuQXR0cj4oKSB8fCBGRC0+aXNOb1JldHVybigpOworICAgIEJ1aWxkU2lua3MgPSBGRC0+aGFzQXR0cjxBbmFseXplck5vUmV0dXJuQXR0cj4oKSB8fCBGRC0+aXNOb1JldHVybigpOwogCiAgIGNvbnN0IEV4cHIgKkNhbGxlZSA9IENFLmdldE9yaWdpbkV4cHIoKTsKICAgaWYgKCFCdWlsZFNpbmtzICYmIENhbGxlZSkKQEAgLTE1MSw3ICsxNTAsNiBAQAogICBDLmdlbmVyYXRlU2luaygpOwogfQogCi0KIHZvaWQgZW50bzo6cmVnaXN0ZXJOb1JldHVybkZ1bmN0aW9uQ2hlY2tlcihDaGVja2VyTWFuYWdlciAmbWdyKSB7CiAgIG1nci5yZWdpc3RlckNoZWNrZXI8Tm9SZXR1cm5GdW5jdGlvbkNoZWNrZXI+KCk7CiB9CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTm9uTnVsbFBhcmFtQ2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvTm9uTnVsbFBhcmFtQ2hlY2tlci5jcHAKaW5kZXggMjczYTdhMy4uMjkzMTE0ZiAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL05vbk51bGxQYXJhbUNoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Ob25OdWxsUGFyYW1DaGVja2VyLmNwcApAQCAtMjksOCArMjksOSBAQAogbmFtZXNwYWNlIHsKIGNsYXNzIE5vbk51bGxQYXJhbUNoZWNrZXIKICAgOiBwdWJsaWMgQ2hlY2tlcjwgY2hlY2s6OlByZUNhbGwgPiB7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUQXR0ck5vbk51bGw7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUTnVsbFJlZkFyZzsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlRBdHRyTm9uTnVsbDsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlROdWxsUmVmQXJnOworCiBwdWJsaWM6CiAKICAgdm9pZCBjaGVja1ByZUNhbGwoY29uc3QgQ2FsbEV2ZW50ICZDYWxsLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CkBAIC00Myw3ICs0NCw3IEBACiB9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIHZvaWQgTm9uTnVsbFBhcmFtQ2hlY2tlcjo6Y2hlY2tQcmVDYWxsKGNvbnN0IENhbGxFdmVudCAmQ2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdCB7CiAgIGNvbnN0IERlY2wgKkZEID0gQ2FsbC5nZXREZWNsKCk7CiAgIGlmICghRkQpCiAgICAgcmV0dXJuOwpAQCAtNjYsNiArNjcsMTIgQEAKICAgICB9CiAKICAgICBib29sIGhhdmVBdHRyTm9uTnVsbCA9IEF0dCAmJiBBdHQtPmlzTm9uTnVsbChpZHgpOworICAgIGlmICghaGF2ZUF0dHJOb25OdWxsKSB7CisgICAgICAvLyBDaGVjayBpZiB0aGUgcGFyYW1ldGVyIGlzIGFsc28gbWFya2VkICdub25udWxsJy4KKyAgICAgIEFycmF5UmVmPFBhcm1WYXJEZWNsKj4gcGFybXMgPSBDYWxsLnBhcmFtZXRlcnMoKTsKKyAgICAgIGlmIChpZHggPCBwYXJtcy5zaXplKCkpCisgICAgICAgIGhhdmVBdHRyTm9uTnVsbCA9IHBhcm1zW2lkeF0tPmhhc0F0dHI8Tm9uTnVsbEF0dHI+KCk7CisgICAgfQogCiAgICAgaWYgKCFoYXZlUmVmVHlwZVBhcmFtICYmICFoYXZlQXR0ck5vbk51bGwpCiAgICAgICBjb250aW51ZTsKQEAgLTk4LDcgKzEwNSw5IEBACiAgICAgICAgIFYgPSAqQ1NWX0k7CiAgICAgICAgIERWID0gVi5nZXRBczxEZWZpbmVkU1ZhbD4oKTsKICAgICAgICAgYXNzZXJ0KCsrQ1NWX0kgPT0gQ1NWLT5lbmQoKSk7Ci0gICAgICAgIGlmICghRFYpCisgICAgICAgIC8vIEZJWE1FOiBIYW5kbGUgKHNvbWVfdW5pb24peyBzb21lX290aGVyX3VuaW9uX3ZhbCB9LCB3aGljaCB0dXJucyBpbnRvCisgICAgICAgIC8vIGEgTGF6eUNvbXBvdW5kVmFsIGluc2lkZSBhIENvbXBvdW5kVmFsLgorICAgICAgICBpZiAoIVYuZ2V0QXM8TG9jPigpKQogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgY29ycmVzcG9uZGluZyBleHByZXNzaW9uLgogICAgICAgICBpZiAoY29uc3QgQ29tcG91bmRMaXRlcmFsRXhwciAqQ0UgPSBkeW5fY2FzdDxDb21wb3VuZExpdGVyYWxFeHByPihBcmdFKSkKQEAgLTExNCw3ICsxMjMsNyBAQAogCiAgICAgQ29uc3RyYWludE1hbmFnZXIgJkNNID0gQy5nZXRDb25zdHJhaW50TWFuYWdlcigpOwogICAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZU5vdE51bGwsIHN0YXRlTnVsbDsKLSAgICBsbHZtOjp0aWUoc3RhdGVOb3ROdWxsLCBzdGF0ZU51bGwpID0gQ00uYXNzdW1lRHVhbChzdGF0ZSwgKkRWKTsKKyAgICBzdGQ6OnRpZShzdGF0ZU5vdE51bGwsIHN0YXRlTnVsbCkgPSBDTS5hc3N1bWVEdWFsKHN0YXRlLCAqRFYpOwogCiAgICAgaWYgKHN0YXRlTnVsbCAmJiAhc3RhdGVOb3ROdWxsKSB7CiAgICAgICAvLyBHZW5lcmF0ZSBhbiBlcnJvciBub2RlLiAgQ2hlY2sgZm9yIGEgbnVsbCBub2RlIGluIGNhc2UKQEAgLTE1Niw4ICsxNjUsNyBAQAogICAvLyB0aGUgQnVnUmVwb3J0IGlzIHBhc3NlZCB0byAnRW1pdFdhcm5pbmcnLgogICBpZiAoIUJUQXR0ck5vbk51bGwpCiAgICAgQlRBdHRyTm9uTnVsbC5yZXNldChuZXcgQnVnVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgd2l0aCAnbm9ubnVsbCcgYXR0cmlidXRlIHBhc3NlZCBudWxsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVBJIikpOworICAgICAgICB0aGlzLCAiQXJndW1lbnQgd2l0aCAnbm9ubnVsbCcgYXR0cmlidXRlIHBhc3NlZCBudWxsIiwgIkFQSSIpKTsKIAogICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVEF0dHJOb25OdWxsLAogICAgICAgICAgICAgICAgICAgIk51bGwgcG9pbnRlciBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gYSAnbm9ubnVsbCcgcGFyYW1ldGVyIiwKQEAgLTE3MSw3ICsxNzksNyBAQAogQnVnUmVwb3J0ICpOb25OdWxsUGFyYW1DaGVja2VyOjpnZW5SZXBvcnRSZWZlcmVuY2VUb051bGxQb2ludGVyKAogICBjb25zdCBFeHBsb2RlZE5vZGUgKkVycm9yTm9kZSwgY29uc3QgRXhwciAqQXJnRSkgY29uc3QgewogICBpZiAoIUJUTnVsbFJlZkFyZykKLSAgICBCVE51bGxSZWZBcmcucmVzZXQobmV3IEJ1aWx0aW5CdWcoIkRlcmVmZXJlbmNlIG9mIG51bGwgcG9pbnRlciIpKTsKKyAgICBCVE51bGxSZWZBcmcucmVzZXQobmV3IEJ1aWx0aW5CdWcodGhpcywgIkRlcmVmZXJlbmNlIG9mIG51bGwgcG9pbnRlciIpKTsKIAogICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVE51bGxSZWZBcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvcm1pbmcgcmVmZXJlbmNlIHRvIG51bGwgcG9pbnRlciIsCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvT2JqQ0F0U3luY0NoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL09iakNBdFN5bmNDaGVja2VyLmNwcAppbmRleCA0MDE4YTY2Li5mYmYyZDczIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvT2JqQ0F0U3luY0NoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDQXRTeW5jQ2hlY2tlci5jcHAKQEAgLTI2LDggKzI2LDggQEAKIG5hbWVzcGFjZSB7CiBjbGFzcyBPYmpDQXRTeW5jQ2hlY2tlcgogICAgIDogcHVibGljIENoZWNrZXI8IGNoZWNrOjpQcmVTdG10PE9iakNBdFN5bmNocm9uaXplZFN0bXQ+ID4gewotICBtdXRhYmxlIE93bmluZ1B0cjxCdWlsdGluQnVnPiBCVF9udWxsOwotICBtdXRhYmxlIE93bmluZ1B0cjxCdWlsdGluQnVnPiBCVF91bmRlZjsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVpbHRpbkJ1Zz4gQlRfbnVsbDsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVpbHRpbkJ1Zz4gQlRfdW5kZWY7CiAKIHB1YmxpYzoKICAgdm9pZCBjaGVja1ByZVN0bXQoY29uc3QgT2JqQ0F0U3luY2hyb25pemVkU3RtdCAqUywgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwpAQCAtNDUsOCArNDUsOCBAQAogICBpZiAoVi5nZXRBczxVbmRlZmluZWRWYWw+KCkpIHsKICAgICBpZiAoRXhwbG9kZWROb2RlICpOID0gQy5nZW5lcmF0ZVNpbmsoKSkgewogICAgICAgaWYgKCFCVF91bmRlZikKLSAgICAgICAgQlRfdW5kZWYucmVzZXQobmV3IEJ1aWx0aW5CdWcoIlVuaW5pdGlhbGl6ZWQgdmFsdWUgdXNlZCBhcyBtdXRleCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBAc3luY2hyb25pemVkIikpOworICAgICAgICBCVF91bmRlZi5yZXNldChuZXcgQnVpbHRpbkJ1Zyh0aGlzLCAiVW5pbml0aWFsaXplZCB2YWx1ZSB1c2VkIGFzIG11dGV4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBAc3luY2hyb25pemVkIikpOwogICAgICAgQnVnUmVwb3J0ICpyZXBvcnQgPQogICAgICAgICBuZXcgQnVnUmVwb3J0KCpCVF91bmRlZiwgQlRfdW5kZWYtPmdldERlc2NyaXB0aW9uKCksIE4pOwogICAgICAgYnVncmVwb3J0ZXI6OnRyYWNrTnVsbE9yVW5kZWZWYWx1ZShOLCBFeCwgKnJlcG9ydCk7CkBAIC02MCw3ICs2MCw3IEBACiAKICAgLy8gQ2hlY2sgZm9yIG51bGwgbXV0ZXhlcy4KICAgUHJvZ3JhbVN0YXRlUmVmIG5vdE51bGxTdGF0ZSwgbnVsbFN0YXRlOwotICBsbHZtOjp0aWUobm90TnVsbFN0YXRlLCBudWxsU3RhdGUpID0gc3RhdGUtPmFzc3VtZShWLmNhc3RBczxEZWZpbmVkU1ZhbD4oKSk7CisgIHN0ZDo6dGllKG5vdE51bGxTdGF0ZSwgbnVsbFN0YXRlKSA9IHN0YXRlLT5hc3N1bWUoVi5jYXN0QXM8RGVmaW5lZFNWYWw+KCkpOwogCiAgIGlmIChudWxsU3RhdGUpIHsKICAgICBpZiAoIW5vdE51bGxTdGF0ZSkgewpAQCAtNjgsOCArNjgsOSBAQAogICAgICAgLy8gYSBudWxsIG11dGV4IGp1c3QgbWVhbnMgbm8gc3luY2hyb25pemF0aW9uIG9jY3Vycy4KICAgICAgIGlmIChFeHBsb2RlZE5vZGUgKk4gPSBDLmFkZFRyYW5zaXRpb24obnVsbFN0YXRlKSkgewogICAgICAgICBpZiAoIUJUX251bGwpCi0gICAgICAgICAgQlRfbnVsbC5yZXNldChuZXcgQnVpbHRpbkJ1ZygiTmlsIHZhbHVlIHVzZWQgYXMgbXV0ZXggZm9yIEBzeW5jaHJvbml6ZWQoKSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIobm8gc3luY2hyb25pemF0aW9uIHdpbGwgb2NjdXIpIikpOworICAgICAgICAgIEJUX251bGwucmVzZXQobmV3IEJ1aWx0aW5CdWcoCisgICAgICAgICAgICAgIHRoaXMsICJOaWwgdmFsdWUgdXNlZCBhcyBtdXRleCBmb3IgQHN5bmNocm9uaXplZCgpICIKKyAgICAgICAgICAgICAgICAgICAgIihubyBzeW5jaHJvbml6YXRpb24gd2lsbCBvY2N1cikiKSk7CiAgICAgICAgIEJ1Z1JlcG9ydCAqcmVwb3J0ID0KICAgICAgICAgICBuZXcgQnVnUmVwb3J0KCpCVF9udWxsLCBCVF9udWxsLT5nZXREZXNjcmlwdGlvbigpLCBOKTsKICAgICAgICAgYnVncmVwb3J0ZXI6OnRyYWNrTnVsbE9yVW5kZWZWYWx1ZShOLCBFeCwgKnJlcG9ydCk7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvT2JqQ0NvbnRhaW5lcnNBU1RDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDQ29udGFpbmVyc0FTVENoZWNrZXIuY3BwCmluZGV4IDUwM2IxYjUuLjIzOTg2MGQgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDQ29udGFpbmVyc0FTVENoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDQ29udGFpbmVyc0FTVENoZWNrZXIuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiBuYW1lc3BhY2UgewogY2xhc3MgV2Fsa0FTVCA6IHB1YmxpYyBTdG10VmlzaXRvcjxXYWxrQVNUPiB7CiAgIEJ1Z1JlcG9ydGVyICZCUjsKKyAgY29uc3QgQ2hlY2tlckJhc2UgKkNoZWNrZXI7CiAgIEFuYWx5c2lzRGVjbENvbnRleHQqIEFDOwogICBBU1RDb250ZXh0ICZBU1RDOwogICB1aW50NjRfdCBQdHJXaWR0aDsKQEAgLTcxLDkgKzcyLDkgQEAKICAgfQogCiBwdWJsaWM6Ci0gIFdhbGtBU1QoQnVnUmVwb3J0ZXIgJmJyLCBBbmFseXNpc0RlY2xDb250ZXh0KiBhYykKLSAgOiBCUihiciksIEFDKGFjKSwgQVNUQyhBQy0+Z2V0QVNUQ29udGV4dCgpKSwKLSAgICBQdHJXaWR0aChBU1RDLmdldFRhcmdldEluZm8oKS5nZXRQb2ludGVyV2lkdGgoMCkpIHt9CisgIFdhbGtBU1QoQnVnUmVwb3J0ZXIgJmJyLCBjb25zdCBDaGVja2VyQmFzZSAqY2hlY2tlciwgQW5hbHlzaXNEZWNsQ29udGV4dCAqYWMpCisgICAgICA6IEJSKGJyKSwgQ2hlY2tlcihjaGVja2VyKSwgQUMoYWMpLCBBU1RDKEFDLT5nZXRBU1RDb250ZXh0KCkpLAorICAgICAgICBQdHJXaWR0aChBU1RDLmdldFRhcmdldEluZm8oKS5nZXRQb2ludGVyV2lkdGgoMCkpIHt9CiAKICAgLy8gU3RhdGVtZW50IHZpc2l0b3IgbWV0aG9kcy4KICAgdm9pZCBWaXNpdENoaWxkcmVuKFN0bXQgKlMpOwpAQCAtMTQyLDkgKzE0Myw5IEBACiAKICAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIENFTG9jID0KICAgICAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlQmVnaW4oQ0UsIEJSLmdldFNvdXJjZU1hbmFnZXIoKSwgQUMpOwotICAgIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLAotICAgICAgICAgICAgICAgICAgICAgICBPc05hbWUuc3RyKCksIGNhdGVnb3JpZXM6OkNvcmVGb3VuZGF0aW9uT2JqZWN0aXZlQywKLSAgICAgICAgICAgICAgICAgICAgICAgT3Muc3RyKCksIENFTG9jLCBBcmctPmdldFNvdXJjZVJhbmdlKCkpOworICAgIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLCBDaGVja2VyLCBPc05hbWUuc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3JpZXM6OkNvcmVGb3VuZGF0aW9uT2JqZWN0aXZlQywgT3Muc3RyKCksIENFTG9jLAorICAgICAgICAgICAgICAgICAgICAgICBBcmctPmdldFNvdXJjZVJhbmdlKCkpOwogICB9CiAKICAgLy8gUmVjdXJzZSBhbmQgY2hlY2sgY2hpbGRyZW4uCkBAIC0xNjMsNyArMTY0LDcgQEAKIAogICB2b2lkIGNoZWNrQVNUQ29kZUJvZHkoY29uc3QgRGVjbCAqRCwgQW5hbHlzaXNNYW5hZ2VyJiBNZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlciAmQlIpIGNvbnN0IHsKLSAgICBXYWxrQVNUIHdhbGtlcihCUiwgTWdyLmdldEFuYWx5c2lzRGVjbENvbnRleHQoRCkpOworICAgIFdhbGtBU1Qgd2Fsa2VyKEJSLCB0aGlzLCBNZ3IuZ2V0QW5hbHlzaXNEZWNsQ29udGV4dChEKSk7CiAgICAgd2Fsa2VyLlZpc2l0KEQtPmdldEJvZHkoKSk7CiAgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvT2JqQ0NvbnRhaW5lcnNDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDQ29udGFpbmVyc0NoZWNrZXIuY3BwCmluZGV4IGI5ZTk2ZWUuLjhlNTExNTQgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDQ29udGFpbmVyc0NoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDQ29udGFpbmVyc0NoZWNrZXIuY3BwCkBAIC0zMCwxMCArMzAsMTAgQEAKIG5hbWVzcGFjZSB7CiBjbGFzcyBPYmpDQ29udGFpbmVyc0NoZWNrZXIgOiBwdWJsaWMgQ2hlY2tlcjwgY2hlY2s6OlByZVN0bXQ8Q2FsbEV4cHI+LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s6OlBvc3RTdG10PENhbGxFeHByPiA+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUOwogICBpbmxpbmUgdm9pZCBpbml0QnVnVHlwZSgpIGNvbnN0IHsKICAgICBpZiAoIUJUKQotICAgICAgQlQucmVzZXQobmV3IEJ1Z1R5cGUoIkNGQXJyYXkgQVBJIiwKKyAgICAgIEJULnJlc2V0KG5ldyBCdWdUeXBlKHRoaXMsICJDRkFycmF5IEFQSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWVzOjpDb3JlRm91bmRhdGlvbk9iamVjdGl2ZUMpKTsKICAgfQogCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvT2JqQ01pc3NpbmdTdXBlckNhbGxDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDTWlzc2luZ1N1cGVyQ2FsbENoZWNrZXIuY3BwCmluZGV4IDc4OWI5ZjQuLmEyY2Y4ZTEgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDTWlzc2luZ1N1cGVyQ2FsbENoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDTWlzc2luZ1N1cGVyQ2FsbENoZWNrZXIuY3BwCkBAIC0xODEsMTYgKzE4MSwxMiBAQAogCiAKICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBpbnN0YW5jZSBtZXRob2RzLgotICBmb3IgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2w6Omluc3RtZXRoX2l0ZXJhdG9yIEkgPSBELT5pbnN0bWV0aF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBELT5pbnN0bWV0aF9lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIFNlbGVjdG9yIFMgPSAoKkkpLT5nZXRTZWxlY3RvcigpOworICBmb3IgKGF1dG8gKk1EIDogRC0+aW5zdGFuY2VfbWV0aG9kcygpKSB7CisgICAgU2VsZWN0b3IgUyA9IE1ELT5nZXRTZWxlY3RvcigpOwogICAgIC8vIEZpbmQgb3V0IHdoZXRoZXIgdGhpcyBpcyBhIHNlbGVjdG9yIHRoYXQgd2Ugd2FudCB0byBjaGVjay4KICAgICBpZiAoIVNlbGVjdG9yc0ZvckNsYXNzW1N1cGVyY2xhc3NOYW1lXS5jb3VudChTKSkKICAgICAgIGNvbnRpbnVlOwogCi0gICAgT2JqQ01ldGhvZERlY2wgKk1EID0gKkk7Ci0KICAgICAvLyBDaGVjayBpZiB0aGUgbWV0aG9kIGNhbGxzIGl0cyBzdXBlcmNsYXNzIGltcGxlbWVudGF0aW9uLgogICAgIGlmIChNRC0+Z2V0Qm9keSgpKQogICAgIHsKQEAgLTIxMiw3ICsyMDgsNyBAQAogICAgICAgICAgICA8PCAiJyBpbnN0YW5jZSBtZXRob2QgaW4gIiA8PCBTdXBlcmNsYXNzTmFtZS5zdHIoKSA8PCAiIHN1YmNsYXNzICciCiAgICAgICAgICAgIDw8ICpEIDw8ICInIGlzIG1pc3NpbmcgYSBbc3VwZXIgIiA8PCBTLmdldEFzU3RyaW5nKCkgPDwgIl0gY2FsbCI7CiAKLSAgICAgICAgQlIuRW1pdEJhc2ljUmVwb3J0KE1ELCBOYW1lLCBjYXRlZ29yaWVzOjpDb3JlRm91bmRhdGlvbk9iamVjdGl2ZUMsCisgICAgICAgIEJSLkVtaXRCYXNpY1JlcG9ydChNRCwgdGhpcywgTmFtZSwgY2F0ZWdvcmllczo6Q29yZUZvdW5kYXRpb25PYmplY3RpdmVDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RyKCksIERMb2MpOwogICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDU2VsZkluaXRDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDU2VsZkluaXRDaGVja2VyLmNwcAppbmRleCA4NTA2ZTA4Li42YzMzMDg0IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvT2JqQ1NlbGZJbml0Q2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL09iakNTZWxmSW5pdENoZWNrZXIuY3BwCkBAIC03NCwxNyArNzQsMTcgQEAKICAgdm9pZCBjaGVja1Bvc3RDYWxsKGNvbnN0IENhbGxFdmVudCAmQ0UsIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdDsKIAogICB2b2lkIHByaW50U3RhdGUocmF3X29zdHJlYW0gJk91dCwgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTkwsIGNvbnN0IGNoYXIgKlNlcCkgY29uc3Q7CisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOTCwgY29uc3QgY2hhciAqU2VwKSBjb25zdCBvdmVycmlkZTsKIH07CiB9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIG5hbWVzcGFjZSB7CiAKIGNsYXNzIEluaXRTZWxmQnVnIDogcHVibGljIEJ1Z1R5cGUgewotICBjb25zdCBzdGQ6OnN0cmluZyBkZXNjOwogcHVibGljOgotICBJbml0U2VsZkJ1ZygpIDogQnVnVHlwZSgiTWlzc2luZyBcInNlbGYgPSBbKHN1cGVyIG9yIHNlbGYpIGluaXQuLi5dXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yaWVzOjpDb3JlRm91bmRhdGlvbk9iamVjdGl2ZUMpIHt9CisgIEluaXRTZWxmQnVnKGNvbnN0IENoZWNrZXJCYXNlICpDaGVja2VyKQorICAgICAgOiBCdWdUeXBlKENoZWNrZXIsICJNaXNzaW5nIFwic2VsZiA9IFsoc3VwZXIgb3Igc2VsZikgaW5pdC4uLl1cIiIsCisgICAgICAgICAgICAgICAgY2F0ZWdvcmllczo6Q29yZUZvdW5kYXRpb25PYmplY3RpdmVDKSB7fQogfTsKIAogfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQpAQCAtMTQ3LDcgKzE0Nyw4IEBACiB9CiAKIHN0YXRpYyB2b2lkIGNoZWNrRm9ySW52YWxpZFNlbGYoY29uc3QgRXhwciAqRSwgQ2hlY2tlckNvbnRleHQgJkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yU3RyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGVja2VyQmFzZSAqQ2hlY2tlcikgewogICBpZiAoIUUpCiAgICAgcmV0dXJuOwogICAKQEAgLTE2Miw4ICsxNjMsNyBAQAogICBpZiAoIU4pCiAgICAgcmV0dXJuOwogCi0gIEJ1Z1JlcG9ydCAqcmVwb3J0ID0KLSAgICBuZXcgQnVnUmVwb3J0KCpuZXcgSW5pdFNlbGZCdWcoKSwgZXJyb3JTdHIsIE4pOworICBCdWdSZXBvcnQgKnJlcG9ydCA9IG5ldyBCdWdSZXBvcnQoKm5ldyBJbml0U2VsZkJ1ZyhDaGVja2VyKSwgZXJyb3JTdHIsIE4pOwogICBDLmVtaXRSZXBvcnQocmVwb3J0KTsKIH0KIApAQCAtMjA1LDkgKzIwNSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQy5nZXRDdXJyZW50QW5hbHlzaXNEZWNsQ29udGV4dCgpLT5nZXREZWNsKCkpKSkKICAgICByZXR1cm47CiAKLSAgY2hlY2tGb3JJbnZhbGlkU2VsZihFLT5nZXRCYXNlKCksIEMsCi0gICAgIkluc3RhbmNlIHZhcmlhYmxlIHVzZWQgd2hpbGUgJ3NlbGYnIGlzIG5vdCBzZXQgdG8gdGhlIHJlc3VsdCBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidbKHN1cGVyIG9yIHNlbGYpIGluaXQuLi5dJyIpOworICBjaGVja0ZvckludmFsaWRTZWxmKAorICAgICAgRS0+Z2V0QmFzZSgpLCBDLAorICAgICAgIkluc3RhbmNlIHZhcmlhYmxlIHVzZWQgd2hpbGUgJ3NlbGYnIGlzIG5vdCBzZXQgdG8gdGhlIHJlc3VsdCBvZiAiCisgICAgICAiJ1soc3VwZXIgb3Igc2VsZikgaW5pdC4uLl0nIiwKKyAgICAgIHRoaXMpOwogfQogCiB2b2lkIE9iakNTZWxmSW5pdENoZWNrZXI6OmNoZWNrUHJlU3RtdChjb25zdCBSZXR1cm5TdG10ICpTLApAQCAtMjE4LDggKzIyMCw5IEBACiAgICAgcmV0dXJuOwogCiAgIGNoZWNrRm9ySW52YWxpZFNlbGYoUy0+Z2V0UmV0VmFsdWUoKSwgQywKLSAgICAiUmV0dXJuaW5nICdzZWxmJyB3aGlsZSBpdCBpcyBub3Qgc2V0IHRvIHRoZSByZXN1bHQgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInWyhzdXBlciBvciBzZWxmKSBpbml0Li4uXSciKTsKKyAgICAgICAgICAgICAgICAgICAgICAiUmV0dXJuaW5nICdzZWxmJyB3aGlsZSBpdCBpcyBub3Qgc2V0IHRvIHRoZSByZXN1bHQgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICInWyhzdXBlciBvciBzZWxmKSBpbml0Li4uXSciLAorICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOwogfQogCiAvLyBXaGVuIGEgY2FsbCByZWNlaXZlcyBhIHJlZmVyZW5jZSB0byAnc2VsZicsIFtQcmUvUG9zdF1DYWxsIHBhc3MKQEAgLTM0Nyw3ICszNTAsNyBAQAogICBpZiAoRmxhZ01hcC5pc0VtcHR5KCkgJiYgIURpZENhbGxJbml0ICYmICFQcmVDYWxsRmxhZ3MpCiAgICAgcmV0dXJuOwogCi0gIE91dCA8PCBTZXAgPDwgTkwgPDwgIk9iakNTZWxmSW5pdENoZWNrZXI6IiA8PCBOTDsKKyAgT3V0IDw8IFNlcCA8PCBOTCA8PCAqdGhpcyA8PCAiIDoiIDw8IE5MOwogCiAgIGlmIChEaWRDYWxsSW5pdCkKICAgICBPdXQgPDwgIiAgQW4gaW5pdCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLiIgPDwgTkw7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvT2JqQ1VudXNlZElWYXJzQ2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvT2JqQ1VudXNlZElWYXJzQ2hlY2tlci5jcHAKaW5kZXggYzY2YzdkMC4uZDNiMTc1MyAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL09iakNVbnVzZWRJVmFyc0NoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9PYmpDVW51c2VkSVZhcnNDaGVja2VyLmNwcApAQCAtNzcsMjIgKzc3LDE3IEBACiAKIHN0YXRpYyB2b2lkIFNjYW4oSXZhclVzYWdlTWFwJiBNLCBjb25zdCBPYmpDQ29udGFpbmVyRGVjbCAqRCkgewogICAvLyBTY2FuIHRoZSBtZXRob2RzIGZvciBhY2Nlc3Nlcy4KLSAgZm9yIChPYmpDQ29udGFpbmVyRGVjbDo6aW5zdG1ldGhfaXRlcmF0b3IgSSA9IEQtPmluc3RtZXRoX2JlZ2luKCksCi0gICAgICAgRSA9IEQtPmluc3RtZXRoX2VuZCgpOyBJIT1FOyArK0kpCi0gICAgU2NhbihNLCAoKkkpLT5nZXRCb2R5KCkpOworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBELT5pbnN0YW5jZV9tZXRob2RzKCkpCisgICAgU2NhbihNLCBJLT5nZXRCb2R5KCkpOwogCiAgIGlmIChjb25zdCBPYmpDSW1wbGVtZW50YXRpb25EZWNsICpJRCA9IGR5bl9jYXN0PE9iakNJbXBsZW1lbnRhdGlvbkRlY2w+KEQpKSB7CiAgICAgLy8gU2NhbiBmb3IgQHN5bnRoZXNpemVkIHByb3BlcnR5IG1ldGhvZHMgdGhhdCBhY3QgYXMgc2V0dGVycy9nZXR0ZXJzCiAgICAgLy8gdG8gYW4gaXZhci4KLSAgICBmb3IgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2w6OnByb3BpbXBsX2l0ZXJhdG9yIEkgPSBJRC0+cHJvcGltcGxfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBJRC0+cHJvcGltcGxfZW5kKCk7IEkhPUU7ICsrSSkKLSAgICAgIFNjYW4oTSwgKkkpOworICAgIGZvciAoY29uc3QgYXV0byAqSSA6IElELT5wcm9wZXJ0eV9pbXBscygpKQorICAgICAgU2NhbihNLCBJKTsKIAogICAgIC8vIFNjYW4gdGhlIGFzc29jaWF0ZWQgY2F0ZWdvcmllcyBhcyB3ZWxsLgotICAgIGZvciAoT2JqQ0ludGVyZmFjZURlY2w6OnZpc2libGVfY2F0ZWdvcmllc19pdGVyYXRvcgotICAgICAgICAgICBDYXQgPSBJRC0+Z2V0Q2xhc3NJbnRlcmZhY2UoKS0+dmlzaWJsZV9jYXRlZ29yaWVzX2JlZ2luKCksCi0gICAgICAgICAgIENhdEVuZCA9IElELT5nZXRDbGFzc0ludGVyZmFjZSgpLT52aXNpYmxlX2NhdGVnb3JpZXNfZW5kKCk7Ci0gICAgICAgICBDYXQgIT0gQ2F0RW5kOyArK0NhdCkgeworICAgIGZvciAoY29uc3QgYXV0byAqQ2F0IDogSUQtPmdldENsYXNzSW50ZXJmYWNlKCktPnZpc2libGVfY2F0ZWdvcmllcygpKSB7CiAgICAgICBpZiAoY29uc3QgT2JqQ0NhdGVnb3J5SW1wbERlY2wgKkNJRCA9IENhdC0+Z2V0SW1wbGVtZW50YXRpb24oKSkKICAgICAgICAgU2NhbihNLCBDSUQpOwogICAgIH0KQEAgLTEwMSw5ICs5Niw4IEBACiAKIHN0YXRpYyB2b2lkIFNjYW4oSXZhclVzYWdlTWFwICZNLCBjb25zdCBEZWNsQ29udGV4dCAqQywgY29uc3QgRmlsZUlEIEZJRCwKICAgICAgICAgICAgICAgICAgU291cmNlTWFuYWdlciAmU00pIHsKLSAgZm9yIChEZWNsQ29udGV4dDo6ZGVjbF9pdGVyYXRvciBJPUMtPmRlY2xzX2JlZ2luKCksIEU9Qy0+ZGVjbHNfZW5kKCk7Ci0gICAgICAgSSE9RTsgKytJKQotICAgIGlmIChjb25zdCBGdW5jdGlvbkRlY2wgKkZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPigqSSkpIHsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogQy0+ZGVjbHMoKSkKKyAgICBpZiAoY29uc3QgYXV0byAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEkpKSB7CiAgICAgICBTb3VyY2VMb2NhdGlvbiBMID0gRkQtPmdldExvY1N0YXJ0KCk7CiAgICAgICBpZiAoU00uZ2V0RmlsZUlEKEwpID09IEZJRCkKICAgICAgICAgU2NhbihNLCBGRC0+Z2V0Qm9keSgpKTsKQEAgLTExMSwyOSArMTA1LDI2IEBACiB9CiAKIHN0YXRpYyB2b2lkIGNoZWNrT2JqQ1VudXNlZEl2YXIoY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXIgJkJSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyICZCUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hlY2tlckJhc2UgKkNoZWNrZXIpIHsKIAogICBjb25zdCBPYmpDSW50ZXJmYWNlRGVjbCAqSUQgPSBELT5nZXRDbGFzc0ludGVyZmFjZSgpOwogICBJdmFyVXNhZ2VNYXAgTTsKIAogICAvLyBJdGVyYXRlIG92ZXIgdGhlIGl2YXJzLgotICBmb3IgKE9iakNJbnRlcmZhY2VEZWNsOjppdmFyX2l0ZXJhdG9yIEk9SUQtPml2YXJfYmVnaW4oKSwKLSAgICAgICAgRT1JRC0+aXZhcl9lbmQoKTsgSSE9RTsgKytJKSB7Ci0KLSAgICBjb25zdCBPYmpDSXZhckRlY2wgKklEID0gKkk7Ci0KKyAgZm9yIChjb25zdCBhdXRvICpJdmFyIDogSUQtPml2YXJzKCkpIHsKICAgICAvLyBJZ25vcmUgaXZhcnMgdGhhdC4uLgogICAgIC8vIChhKSBhcmVuJ3QgcHJpdmF0ZQogICAgIC8vIChiKSBleHBsaWNpdGx5IG1hcmtlZCB1bnVzZWQKICAgICAvLyAoYykgYXJlIGlib3V0bGV0cwogICAgIC8vIChkKSBhcmUgdW5uYW1lZCBiaXRmaWVsZHMKLSAgICBpZiAoSUQtPmdldEFjY2Vzc0NvbnRyb2woKSAhPSBPYmpDSXZhckRlY2w6OlByaXZhdGUgfHwKLSAgICAgICAgSUQtPmdldEF0dHI8VW51c2VkQXR0cj4oKSB8fCBJRC0+Z2V0QXR0cjxJQk91dGxldEF0dHI+KCkgfHwKLSAgICAgICAgSUQtPmdldEF0dHI8SUJPdXRsZXRDb2xsZWN0aW9uQXR0cj4oKSB8fAotICAgICAgICBJRC0+aXNVbm5hbWVkQml0ZmllbGQoKSkKKyAgICBpZiAoSXZhci0+Z2V0QWNjZXNzQ29udHJvbCgpICE9IE9iakNJdmFyRGVjbDo6UHJpdmF0ZSB8fAorICAgICAgICBJdmFyLT5oYXNBdHRyPFVudXNlZEF0dHI+KCkgfHwgSXZhci0+aGFzQXR0cjxJQk91dGxldEF0dHI+KCkgfHwKKyAgICAgICAgSXZhci0+aGFzQXR0cjxJQk91dGxldENvbGxlY3Rpb25BdHRyPigpIHx8CisgICAgICAgIEl2YXItPmlzVW5uYW1lZEJpdGZpZWxkKCkpCiAgICAgICBjb250aW51ZTsKIAotICAgIE1bSURdID0gVW51c2VkOworICAgIE1bSXZhcl0gPSBVbnVzZWQ7CiAgIH0KIAogICBpZiAoTS5lbXB0eSgpKQpAQCAtMTcyLDcgKzE2Myw3IEBACiAKICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gTCA9CiAgICAgICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZShJLT5maXJzdCwgQlIuZ2V0U291cmNlTWFuYWdlcigpKTsKLSAgICAgIEJSLkVtaXRCYXNpY1JlcG9ydChELCAiVW51c2VkIGluc3RhbmNlIHZhcmlhYmxlIiwgIk9wdGltaXphdGlvbiIsCisgICAgICBCUi5FbWl0QmFzaWNSZXBvcnQoRCwgQ2hlY2tlciwgIlVudXNlZCBpbnN0YW5jZSB2YXJpYWJsZSIsICJPcHRpbWl6YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0cigpLCBMKTsKICAgICB9CiB9CkBAIC0xODcsNyArMTc4LDcgQEAKIHB1YmxpYzoKICAgdm9pZCBjaGVja0FTVERlY2woY29uc3QgT2JqQ0ltcGxlbWVudGF0aW9uRGVjbCAqRCwgQW5hbHlzaXNNYW5hZ2VyJiBtZ3IsCiAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydGVyICZCUikgY29uc3QgewotICAgIGNoZWNrT2JqQ1VudXNlZEl2YXIoRCwgQlIpOworICAgIGNoZWNrT2JqQ1VudXNlZEl2YXIoRCwgQlIsIHRoaXMpOwogICB9CiB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1BvaW50ZXJBcml0aENoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1BvaW50ZXJBcml0aENoZWNrZXIuY3BwCmluZGV4IGJjYmZhY2QuLjAwNDgwZTQgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Qb2ludGVyQXJpdGhDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvUG9pbnRlckFyaXRoQ2hlY2tlci5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSB7CiBjbGFzcyBQb2ludGVyQXJpdGhDaGVja2VyIAogICA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6UHJlU3RtdDxCaW5hcnlPcGVyYXRvcj4gPiB7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1aWx0aW5CdWc+IEJUOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWlsdGluQnVnPiBCVDsKIAogcHVibGljOgogICB2b2lkIGNoZWNrUHJlU3RtdChjb25zdCBCaW5hcnlPcGVyYXRvciAqQiwgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwpAQCAtNTMsMTAgKzUzLDExIEBACiAKICAgICBpZiAoRXhwbG9kZWROb2RlICpOID0gQy5hZGRUcmFuc2l0aW9uKCkpIHsKICAgICAgIGlmICghQlQpCi0gICAgICAgIEJULnJlc2V0KG5ldyBCdWlsdGluQnVnKCJEYW5nZXJvdXMgcG9pbnRlciBhcml0aG1ldGljIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9pbnRlciBhcml0aG1ldGljIGRvbmUgb24gbm9uLWFycmF5IHZhcmlhYmxlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lYW5zIHJlbGlhbmNlIG9uIG1lbW9yeSBsYXlvdXQsIHdoaWNoIGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFuZ2Vyb3VzLiIpKTsKKyAgICAgICAgQlQucmVzZXQoCisgICAgICAgICAgICBuZXcgQnVpbHRpbkJ1Zyh0aGlzLCAiRGFuZ2Vyb3VzIHBvaW50ZXIgYXJpdGhtZXRpYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9pbnRlciBhcml0aG1ldGljIGRvbmUgb24gbm9uLWFycmF5IHZhcmlhYmxlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVhbnMgcmVsaWFuY2Ugb24gbWVtb3J5IGxheW91dCwgd2hpY2ggaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhbmdlcm91cy4iKSk7CiAgICAgICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVCwgQlQtPmdldERlc2NyaXB0aW9uKCksIE4pOwogICAgICAgUi0+YWRkUmFuZ2UoQi0+Z2V0U291cmNlUmFuZ2UoKSk7CiAgICAgICBDLmVtaXRSZXBvcnQoUik7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvUG9pbnRlclN1YkNoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1BvaW50ZXJTdWJDaGVja2VyLmNwcAppbmRleCAwN2M4MmQ0Li5mYmIyNjI4IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvUG9pbnRlclN1YkNoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Qb2ludGVyU3ViQ2hlY2tlci5jcHAKQEAgLTI1LDcgKzI1LDcgQEAKIG5hbWVzcGFjZSB7CiBjbGFzcyBQb2ludGVyU3ViQ2hlY2tlciAKICAgOiBwdWJsaWMgQ2hlY2tlcjwgY2hlY2s6OlByZVN0bXQ8QmluYXJ5T3BlcmF0b3I+ID4gewotICBtdXRhYmxlIE93bmluZ1B0cjxCdWlsdGluQnVnPiBCVDsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVpbHRpbkJ1Zz4gQlQ7CiAKIHB1YmxpYzoKICAgdm9pZCBjaGVja1ByZVN0bXQoY29uc3QgQmluYXJ5T3BlcmF0b3IgKkIsIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdDsKQEAgLTYyLDkgKzYyLDEwIEBACiAKICAgaWYgKEV4cGxvZGVkTm9kZSAqTiA9IEMuYWRkVHJhbnNpdGlvbigpKSB7CiAgICAgaWYgKCFCVCkKLSAgICAgIEJULnJlc2V0KG5ldyBCdWlsdGluQnVnKCJQb2ludGVyIHN1YnRyYWN0aW9uIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJ0cmFjdGlvbiBvZiB0d28gcG9pbnRlcnMgdGhhdCBkbyBub3QgcG9pbnQgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHNhbWUgbWVtb3J5IGNodW5rIG1heSBjYXVzZSBpbmNvcnJlY3QgcmVzdWx0LiIpKTsKKyAgICAgIEJULnJlc2V0KAorICAgICAgICAgIG5ldyBCdWlsdGluQnVnKHRoaXMsICJQb2ludGVyIHN1YnRyYWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiU3VidHJhY3Rpb24gb2YgdHdvIHBvaW50ZXJzIHRoYXQgZG8gbm90IHBvaW50IHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHNhbWUgbWVtb3J5IGNodW5rIG1heSBjYXVzZSBpbmNvcnJlY3QgcmVzdWx0LiIpKTsKICAgICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVCwgQlQtPmdldERlc2NyaXB0aW9uKCksIE4pOwogICAgIFItPmFkZFJhbmdlKEItPmdldFNvdXJjZVJhbmdlKCkpOwogICAgIEMuZW1pdFJlcG9ydChSKTsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9QdGhyZWFkTG9ja0NoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1B0aHJlYWRMb2NrQ2hlY2tlci5jcHAKaW5kZXggZmZiOGNmMi4uMWVkZTNhMiAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1B0aHJlYWRMb2NrQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1B0aHJlYWRMb2NrQ2hlY2tlci5jcHAKQEAgLTI0LDkgKzI0LDM3IEBACiB1c2luZyBuYW1lc3BhY2UgZW50bzsKIAogbmFtZXNwYWNlIHsKKworc3RydWN0IExvY2tTdGF0ZSB7CisgIGVudW0gS2luZCB7IERlc3Ryb3llZCwgTG9ja2VkLCBVbmxvY2tlZCB9IEs7CisKK3ByaXZhdGU6CisgIExvY2tTdGF0ZShLaW5kIEspIDogSyhLKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBMb2NrU3RhdGUgZ2V0TG9ja2VkKHZvaWQpIHsgcmV0dXJuIExvY2tTdGF0ZShMb2NrZWQpOyB9CisgIHN0YXRpYyBMb2NrU3RhdGUgZ2V0VW5sb2NrZWQodm9pZCkgeyByZXR1cm4gTG9ja1N0YXRlKFVubG9ja2VkKTsgfQorICBzdGF0aWMgTG9ja1N0YXRlIGdldERlc3Ryb3llZCh2b2lkKSB7IHJldHVybiBMb2NrU3RhdGUoRGVzdHJveWVkKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMb2NrU3RhdGUgJlgpIGNvbnN0IHsKKyAgICByZXR1cm4gSyA9PSBYLks7CisgIH0KKworICBib29sIGlzTG9ja2VkKCkgY29uc3QgeyByZXR1cm4gSyA9PSBMb2NrZWQ7IH0KKyAgYm9vbCBpc1VubG9ja2VkKCkgY29uc3QgeyByZXR1cm4gSyA9PSBVbmxvY2tlZDsgfQorICBib29sIGlzRGVzdHJveWVkKCkgY29uc3QgeyByZXR1cm4gSyA9PSBEZXN0cm95ZWQ7IH0KKworICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IHsKKyAgICBJRC5BZGRJbnRlZ2VyKEspOworICB9Cit9OworCiBjbGFzcyBQdGhyZWFkTG9ja0NoZWNrZXIgOiBwdWJsaWMgQ2hlY2tlcjwgY2hlY2s6OlBvc3RTdG10PENhbGxFeHByPiA+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlRfZG91YmxlbG9jazsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlRfbG9yOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVF9kb3VibGVsb2NrOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVF9kb3VibGV1bmxvY2s7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUX2Rlc3Ryb3lsb2NrOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVF9pbml0bG9jazsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlRfbG9yOwogICBlbnVtIExvY2tpbmdTZW1hbnRpY3MgewogICAgIE5vdEFwcGxpY2FibGUgPSAwLAogICAgIFB0aHJlYWRTZW1hbnRpY3MsCkBAIC0zOSwxMiArNjcsMTYgQEAKICAgICAgICAgICAgICAgICAgICBib29sIGlzVHJ5TG9jaywgZW51bSBMb2NraW5nU2VtYW50aWNzIHNlbWFudGljcykgY29uc3Q7CiAgICAgCiAgIHZvaWQgUmVsZWFzZUxvY2soQ2hlY2tlckNvbnRleHQgJkMsIGNvbnN0IENhbGxFeHByICpDRSwgU1ZhbCBsb2NrKSBjb25zdDsKKyAgdm9pZCBEZXN0cm95TG9jayhDaGVja2VyQ29udGV4dCAmQywgY29uc3QgQ2FsbEV4cHIgKkNFLCBTVmFsIExvY2spIGNvbnN0OworICB2b2lkIEluaXRMb2NrKENoZWNrZXJDb250ZXh0ICZDLCBjb25zdCBDYWxsRXhwciAqQ0UsIFNWYWwgTG9jaykgY29uc3Q7CisgIHZvaWQgcmVwb3J0VXNlRGVzdHJveWVkQnVnKENoZWNrZXJDb250ZXh0ICZDLCBjb25zdCBDYWxsRXhwciAqQ0UpIGNvbnN0OwogfTsKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIAogLy8gR0RNIEVudHJ5IGZvciB0cmFja2luZyBsb2NrIHN0YXRlLgogUkVHSVNURVJfTElTVF9XSVRIX1BST0dSQU1TVEFURShMb2NrU2V0LCBjb25zdCBNZW1SZWdpb24gKikKIAorUkVHSVNURVJfTUFQX1dJVEhfUFJPR1JBTVNUQVRFKExvY2tNYXAsIGNvbnN0IE1lbVJlZ2lvbiAqLCBMb2NrU3RhdGUpCiAKIHZvaWQgUHRocmVhZExvY2tDaGVja2VyOjpjaGVja1Bvc3RTdG10KGNvbnN0IENhbGxFeHByICpDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdCB7CkBAIC01NCw3ICs4Niw3IEBACiAgIGlmIChGTmFtZS5lbXB0eSgpKQogICAgIHJldHVybjsKIAotICBpZiAoQ0UtPmdldE51bUFyZ3MoKSAhPSAxKQorICBpZiAoQ0UtPmdldE51bUFyZ3MoKSAhPSAxICYmIENFLT5nZXROdW1BcmdzKCkgIT0gMikKICAgICByZXR1cm47CiAKICAgaWYgKEZOYW1lID09ICJwdGhyZWFkX211dGV4X2xvY2siIHx8CkBAIC02OSw3ICsxMDEsNyBAQAogICAgICAgICAgICAgICAgIGZhbHNlLCBYTlVTZW1hbnRpY3MpOwogICBlbHNlIGlmIChGTmFtZSA9PSAicHRocmVhZF9tdXRleF90cnlsb2NrIiB8fAogICAgICAgICAgICBGTmFtZSA9PSAicHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrIiB8fAotICAgICAgICAgICBGTmFtZSA9PSAicHRocmVhZF9yd2xvY2tfdHJ5cndsb2NrIikKKyAgICAgICAgICAgRk5hbWUgPT0gInB0aHJlYWRfcndsb2NrX3RyeXdybG9jayIpCiAgICAgQWNxdWlyZUxvY2soQywgQ0UsIHN0YXRlLT5nZXRTVmFsKENFLT5nZXRBcmcoMCksIExDdHgpLAogICAgICAgICAgICAgICAgIHRydWUsIFB0aHJlYWRTZW1hbnRpY3MpOwogICBlbHNlIGlmIChGTmFtZSA9PSAibGNrX210eF90cnlfbG9jayIgfHwKQEAgLTgyLDYgKzExNCwxMSBAQAogICAgICAgICAgICBGTmFtZSA9PSAibGNrX210eF91bmxvY2siIHx8CiAgICAgICAgICAgIEZOYW1lID09ICJsY2tfcndfZG9uZSIpCiAgICAgUmVsZWFzZUxvY2soQywgQ0UsIHN0YXRlLT5nZXRTVmFsKENFLT5nZXRBcmcoMCksIExDdHgpKTsKKyAgZWxzZSBpZiAoRk5hbWUgPT0gInB0aHJlYWRfbXV0ZXhfZGVzdHJveSIgfHwKKyAgICAgICAgICAgRk5hbWUgPT0gImxja19tdHhfZGVzdHJveSIpCisgICAgRGVzdHJveUxvY2soQywgQ0UsIHN0YXRlLT5nZXRTVmFsKENFLT5nZXRBcmcoMCksIExDdHgpKTsKKyAgZWxzZSBpZiAoRk5hbWUgPT0gInB0aHJlYWRfbXV0ZXhfaW5pdCIpCisgICAgSW5pdExvY2soQywgQ0UsIHN0YXRlLT5nZXRTVmFsKENFLT5nZXRBcmcoMCksIExDdHgpKTsKIH0KIAogdm9pZCBQdGhyZWFkTG9ja0NoZWNrZXI6OkFjcXVpcmVMb2NrKENoZWNrZXJDb250ZXh0ICZDLCBjb25zdCBDYWxsRXhwciAqQ0UsCkBAIC0xMDAsMTggKzEzNywyNCBAQAogICAKICAgRGVmaW5lZFNWYWwgcmV0VmFsID0gWC5jYXN0QXM8RGVmaW5lZFNWYWw+KCk7CiAKLSAgaWYgKHN0YXRlLT5jb250YWluczxMb2NrU2V0Pihsb2NrUikpIHsKLSAgICBpZiAoIUJUX2RvdWJsZWxvY2spCi0gICAgICBCVF9kb3VibGVsb2NrLnJlc2V0KG5ldyBCdWdUeXBlKCJEb3VibGUgbG9ja2luZyIsICJMb2NrIGNoZWNrZXIiKSk7Ci0gICAgRXhwbG9kZWROb2RlICpOID0gQy5nZW5lcmF0ZVNpbmsoKTsKLSAgICBpZiAoIU4pCisgIGlmIChjb25zdCBMb2NrU3RhdGUgKkxTdGF0ZSA9IHN0YXRlLT5nZXQ8TG9ja01hcD4obG9ja1IpKSB7CisgICAgaWYgKExTdGF0ZS0+aXNMb2NrZWQoKSkgeworICAgICAgaWYgKCFCVF9kb3VibGVsb2NrKQorICAgICAgICBCVF9kb3VibGVsb2NrLnJlc2V0KG5ldyBCdWdUeXBlKHRoaXMsICJEb3VibGUgbG9ja2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvY2sgY2hlY2tlciIpKTsKKyAgICAgIEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKCk7CisgICAgICBpZiAoIU4pCisgICAgICAgIHJldHVybjsKKyAgICAgIEJ1Z1JlcG9ydCAqcmVwb3J0ID0gbmV3IEJ1Z1JlcG9ydCgqQlRfZG91YmxlbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBsb2NrIGhhcyBhbHJlYWR5IGJlZW4gYWNxdWlyZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4pOworICAgICAgcmVwb3J0LT5hZGRSYW5nZShDRS0+Z2V0QXJnKDApLT5nZXRTb3VyY2VSYW5nZSgpKTsKKyAgICAgIEMuZW1pdFJlcG9ydChyZXBvcnQpOwogICAgICAgcmV0dXJuOwotICAgIEJ1Z1JlcG9ydCAqcmVwb3J0ID0gbmV3IEJ1Z1JlcG9ydCgqQlRfZG91YmxlbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGxvY2sgaGFzIGFscmVhZHkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZW4gYWNxdWlyZWQiLCBOKTsKLSAgICByZXBvcnQtPmFkZFJhbmdlKENFLT5nZXRBcmcoMCktPmdldFNvdXJjZVJhbmdlKCkpOwotICAgIEMuZW1pdFJlcG9ydChyZXBvcnQpOwotICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKExTdGF0ZS0+aXNEZXN0cm95ZWQoKSkgeworICAgICAgcmVwb3J0VXNlRGVzdHJveWVkQnVnKEMsIENFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CiAgIH0KIAogICBQcm9ncmFtU3RhdGVSZWYgbG9ja1N1Y2MgPSBzdGF0ZTsKQEAgLTEyMCwxMCArMTYzLDEwIEBACiAgICAgUHJvZ3JhbVN0YXRlUmVmIGxvY2tGYWlsOwogICAgIHN3aXRjaCAoc2VtYW50aWNzKSB7CiAgICAgY2FzZSBQdGhyZWFkU2VtYW50aWNzOgotICAgICAgbGx2bTo6dGllKGxvY2tGYWlsLCBsb2NrU3VjYykgPSBzdGF0ZS0+YXNzdW1lKHJldFZhbCk7ICAgIAorICAgICAgc3RkOjp0aWUobG9ja0ZhaWwsIGxvY2tTdWNjKSA9IHN0YXRlLT5hc3N1bWUocmV0VmFsKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgWE5VU2VtYW50aWNzOgotICAgICAgbGx2bTo6dGllKGxvY2tTdWNjLCBsb2NrRmFpbCkgPSBzdGF0ZS0+YXNzdW1lKHJldFZhbCk7ICAgIAorICAgICAgc3RkOjp0aWUobG9ja1N1Y2MsIGxvY2tGYWlsKSA9IHN0YXRlLT5hc3N1bWUocmV0VmFsKTsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHRyeUxvY2sgbG9ja2luZyBzZW1hbnRpY3MiKTsKQEAgLTE0NCw2ICsxODcsNyBAQAogICAKICAgLy8gUmVjb3JkIHRoYXQgdGhlIGxvY2sgd2FzIGFjcXVpcmVkLiAgCiAgIGxvY2tTdWNjID0gbG9ja1N1Y2MtPmFkZDxMb2NrU2V0Pihsb2NrUik7CisgIGxvY2tTdWNjID0gbG9ja1N1Y2MtPnNldDxMb2NrTWFwPihsb2NrUiwgTG9ja1N0YXRlOjpnZXRMb2NrZWQoKSk7CiAgIEMuYWRkVHJhbnNpdGlvbihsb2NrU3VjYyk7CiB9CiAKQEAgLTE1NSwzNSArMTk5LDE0MCBAQAogICAgIHJldHVybjsKICAgCiAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSA9IEMuZ2V0U3RhdGUoKTsKKworICBpZiAoY29uc3QgTG9ja1N0YXRlICpMU3RhdGUgPSBzdGF0ZS0+Z2V0PExvY2tNYXA+KGxvY2tSKSkgeworICAgIGlmIChMU3RhdGUtPmlzVW5sb2NrZWQoKSkgeworICAgICAgaWYgKCFCVF9kb3VibGV1bmxvY2spCisgICAgICAgIEJUX2RvdWJsZXVubG9jay5yZXNldChuZXcgQnVnVHlwZSh0aGlzLCAiRG91YmxlIHVubG9ja2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9jayBjaGVja2VyIikpOworICAgICAgRXhwbG9kZWROb2RlICpOID0gQy5nZW5lcmF0ZVNpbmsoKTsKKyAgICAgIGlmICghTikKKyAgICAgICAgcmV0dXJuOworICAgICAgQnVnUmVwb3J0ICpSZXBvcnQgPSBuZXcgQnVnUmVwb3J0KCpCVF9kb3VibGV1bmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgbG9jayBoYXMgYWxyZWFkeSBiZWVuIHVubG9ja2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOKTsKKyAgICAgIFJlcG9ydC0+YWRkUmFuZ2UoQ0UtPmdldEFyZygwKS0+Z2V0U291cmNlUmFuZ2UoKSk7CisgICAgICBDLmVtaXRSZXBvcnQoUmVwb3J0KTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKExTdGF0ZS0+aXNEZXN0cm95ZWQoKSkgeworICAgICAgcmVwb3J0VXNlRGVzdHJveWVkQnVnKEMsIENFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKwogICBMb2NrU2V0VHkgTFMgPSBzdGF0ZS0+Z2V0PExvY2tTZXQ+KCk7CiAKICAgLy8gRklYTUU6IEJldHRlciBhbmFseXNpcyByZXF1aXJlcyBJUEEgZm9yIHdyYXBwZXJzLgotICAvLyBGSVhNRTogY2hlY2sgZm9yIGRvdWJsZSB1bmxvY2tzCi0gIGlmIChMUy5pc0VtcHR5KCkpCi0gICAgcmV0dXJuOwotICAKLSAgY29uc3QgTWVtUmVnaW9uICpmaXJzdExvY2tSID0gTFMuZ2V0SGVhZCgpOwotICBpZiAoZmlyc3RMb2NrUiAhPSBsb2NrUikgewotICAgIGlmICghQlRfbG9yKQotICAgICAgQlRfbG9yLnJlc2V0KG5ldyBCdWdUeXBlKCJMb2NrIG9yZGVyIHJldmVyc2FsIiwgIkxvY2sgY2hlY2tlciIpKTsKLSAgICBFeHBsb2RlZE5vZGUgKk4gPSBDLmdlbmVyYXRlU2luaygpOwotICAgIGlmICghTikKKworICBpZiAoIUxTLmlzRW1wdHkoKSkgeworICAgIGNvbnN0IE1lbVJlZ2lvbiAqZmlyc3RMb2NrUiA9IExTLmdldEhlYWQoKTsKKyAgICBpZiAoZmlyc3RMb2NrUiAhPSBsb2NrUikgeworICAgICAgaWYgKCFCVF9sb3IpCisgICAgICAgIEJUX2xvci5yZXNldChuZXcgQnVnVHlwZSh0aGlzLCAiTG9jayBvcmRlciByZXZlcnNhbCIsICJMb2NrIGNoZWNrZXIiKSk7CisgICAgICBFeHBsb2RlZE5vZGUgKk4gPSBDLmdlbmVyYXRlU2luaygpOworICAgICAgaWYgKCFOKQorICAgICAgICByZXR1cm47CisgICAgICBCdWdSZXBvcnQgKnJlcG9ydCA9IG5ldyBCdWdSZXBvcnQoKkJUX2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyB3YXMgbm90IHRoZSBtb3N0IHJlY2VudGx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNxdWlyZWQgbG9jay4gUG9zc2libGUgbG9jayBvcmRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldmVyc2FsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOKTsKKyAgICAgIHJlcG9ydC0+YWRkUmFuZ2UoQ0UtPmdldEFyZygwKS0+Z2V0U291cmNlUmFuZ2UoKSk7CisgICAgICBDLmVtaXRSZXBvcnQocmVwb3J0KTsKICAgICAgIHJldHVybjsKLSAgICBCdWdSZXBvcnQgKnJlcG9ydCA9IG5ldyBCdWdSZXBvcnQoKkJUX2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHdhcyBub3QgdGhlIG1vc3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VudGx5IGFjcXVpcmVkIGxvY2suICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3NzaWJsZSBsb2NrIG9yZGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXZlcnNhbCIsIE4pOwotICAgIHJlcG9ydC0+YWRkUmFuZ2UoQ0UtPmdldEFyZygwKS0+Z2V0U291cmNlUmFuZ2UoKSk7Ci0gICAgQy5lbWl0UmVwb3J0KHJlcG9ydCk7Ci0gICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBSZWNvcmQgdGhhdCB0aGUgbG9jayB3YXMgcmVsZWFzZWQuCisgICAgc3RhdGUgPSBzdGF0ZS0+c2V0PExvY2tTZXQ+KExTLmdldFRhaWwoKSk7CiAgIH0KIAotICAvLyBSZWNvcmQgdGhhdCB0aGUgbG9jayB3YXMgcmVsZWFzZWQuIAotICBzdGF0ZSA9IHN0YXRlLT5zZXQ8TG9ja1NldD4oTFMuZ2V0VGFpbCgpKTsKKyAgc3RhdGUgPSBzdGF0ZS0+c2V0PExvY2tNYXA+KGxvY2tSLCBMb2NrU3RhdGU6OmdldFVubG9ja2VkKCkpOwogICBDLmFkZFRyYW5zaXRpb24oc3RhdGUpOwogfQogCit2b2lkIFB0aHJlYWRMb2NrQ2hlY2tlcjo6RGVzdHJveUxvY2soQ2hlY2tlckNvbnRleHQgJkMsIGNvbnN0IENhbGxFeHByICpDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVmFsIExvY2spIGNvbnN0IHsKKworICBjb25zdCBNZW1SZWdpb24gKkxvY2tSID0gTG9jay5nZXRBc1JlZ2lvbigpOworICBpZiAoIUxvY2tSKQorICAgIHJldHVybjsKKworICBQcm9ncmFtU3RhdGVSZWYgU3RhdGUgPSBDLmdldFN0YXRlKCk7CisKKyAgY29uc3QgTG9ja1N0YXRlICpMU3RhdGUgPSBTdGF0ZS0+Z2V0PExvY2tNYXA+KExvY2tSKTsKKyAgaWYgKCFMU3RhdGUgfHwgTFN0YXRlLT5pc1VubG9ja2VkKCkpIHsKKyAgICBTdGF0ZSA9IFN0YXRlLT5zZXQ8TG9ja01hcD4oTG9ja1IsIExvY2tTdGF0ZTo6Z2V0RGVzdHJveWVkKCkpOworICAgIEMuYWRkVHJhbnNpdGlvbihTdGF0ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgU3RyaW5nUmVmIE1lc3NhZ2U7CisKKyAgaWYgKExTdGF0ZS0+aXNMb2NrZWQoKSkgeworICAgIE1lc3NhZ2UgPSAiVGhpcyBsb2NrIGlzIHN0aWxsIGxvY2tlZCI7CisgIH0gZWxzZSB7CisgICAgTWVzc2FnZSA9ICJUaGlzIGxvY2sgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQiOworICB9CisKKyAgaWYgKCFCVF9kZXN0cm95bG9jaykKKyAgICBCVF9kZXN0cm95bG9jay5yZXNldChuZXcgQnVnVHlwZSh0aGlzLCAiRGVzdHJveSBpbnZhbGlkIGxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb2NrIGNoZWNrZXIiKSk7CisgIEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKCk7CisgIGlmICghTikKKyAgICByZXR1cm47CisgIEJ1Z1JlcG9ydCAqUmVwb3J0ID0gbmV3IEJ1Z1JlcG9ydCgqQlRfZGVzdHJveWxvY2ssIE1lc3NhZ2UsIE4pOworICBSZXBvcnQtPmFkZFJhbmdlKENFLT5nZXRBcmcoMCktPmdldFNvdXJjZVJhbmdlKCkpOworICBDLmVtaXRSZXBvcnQoUmVwb3J0KTsKK30KKwordm9pZCBQdGhyZWFkTG9ja0NoZWNrZXI6OkluaXRMb2NrKENoZWNrZXJDb250ZXh0ICZDLCBjb25zdCBDYWxsRXhwciAqQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZhbCBMb2NrKSBjb25zdCB7CisKKyAgY29uc3QgTWVtUmVnaW9uICpMb2NrUiA9IExvY2suZ2V0QXNSZWdpb24oKTsKKyAgaWYgKCFMb2NrUikKKyAgICByZXR1cm47CisKKyAgUHJvZ3JhbVN0YXRlUmVmIFN0YXRlID0gQy5nZXRTdGF0ZSgpOworCisgIGNvbnN0IHN0cnVjdCBMb2NrU3RhdGUgKkxTdGF0ZSA9IFN0YXRlLT5nZXQ8TG9ja01hcD4oTG9ja1IpOworICBpZiAoIUxTdGF0ZSB8fCBMU3RhdGUtPmlzRGVzdHJveWVkKCkpIHsKKyAgICBTdGF0ZSA9IFN0YXRlLT5zZXQ8TG9ja01hcD4oTG9ja1IsIExvY2tTdGF0ZTo6Z2V0VW5sb2NrZWQoKSk7CisgICAgQy5hZGRUcmFuc2l0aW9uKFN0YXRlKTsKKyAgICByZXR1cm47CisgIH0KKworICBTdHJpbmdSZWYgTWVzc2FnZTsKKworICBpZiAoTFN0YXRlLT5pc0xvY2tlZCgpKSB7CisgICAgTWVzc2FnZSA9ICJUaGlzIGxvY2sgaXMgc3RpbGwgYmVpbmcgaGVsZCI7CisgIH0gZWxzZSB7CisgICAgTWVzc2FnZSA9ICJUaGlzIGxvY2sgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCI7CisgIH0KKworICBpZiAoIUJUX2luaXRsb2NrKQorICAgIEJUX2luaXRsb2NrLnJlc2V0KG5ldyBCdWdUeXBlKHRoaXMsICJJbml0IGludmFsaWQgbG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvY2sgY2hlY2tlciIpKTsKKyAgRXhwbG9kZWROb2RlICpOID0gQy5nZW5lcmF0ZVNpbmsoKTsKKyAgaWYgKCFOKQorICAgIHJldHVybjsKKyAgQnVnUmVwb3J0ICpSZXBvcnQgPSBuZXcgQnVnUmVwb3J0KCpCVF9pbml0bG9jaywgTWVzc2FnZSwgTik7CisgIFJlcG9ydC0+YWRkUmFuZ2UoQ0UtPmdldEFyZygwKS0+Z2V0U291cmNlUmFuZ2UoKSk7CisgIEMuZW1pdFJlcG9ydChSZXBvcnQpOworfQorCit2b2lkIFB0aHJlYWRMb2NrQ2hlY2tlcjo6cmVwb3J0VXNlRGVzdHJveWVkQnVnKENoZWNrZXJDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsRXhwciAqQ0UpIGNvbnN0IHsKKyAgaWYgKCFCVF9kZXN0cm95bG9jaykKKyAgICBCVF9kZXN0cm95bG9jay5yZXNldChuZXcgQnVnVHlwZSh0aGlzLCAiVXNlIGRlc3Ryb3llZCBsb2NrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9jayBjaGVja2VyIikpOworICBFeHBsb2RlZE5vZGUgKk4gPSBDLmdlbmVyYXRlU2luaygpOworICBpZiAoIU4pCisgICAgcmV0dXJuOworICBCdWdSZXBvcnQgKlJlcG9ydCA9IG5ldyBCdWdSZXBvcnQoKkJUX2Rlc3Ryb3lsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgbG9jayBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOKTsKKyAgUmVwb3J0LT5hZGRSYW5nZShDRS0+Z2V0QXJnKDApLT5nZXRTb3VyY2VSYW5nZSgpKTsKKyAgQy5lbWl0UmVwb3J0KFJlcG9ydCk7Cit9CiAKIHZvaWQgZW50bzo6cmVnaXN0ZXJQdGhyZWFkTG9ja0NoZWNrZXIoQ2hlY2tlck1hbmFnZXIgJm1ncikgewogICBtZ3IucmVnaXN0ZXJDaGVja2VyPFB0aHJlYWRMb2NrQ2hlY2tlcj4oKTsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9SZXRhaW5Db3VudENoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1JldGFpbkNvdW50Q2hlY2tlci5jcHAKaW5kZXggYzQ3NGU3OC4uOWFjOTkzMSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1JldGFpbkNvdW50Q2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1JldGFpbkNvdW50Q2hlY2tlci5jcHAKQEAgLTEzLDYgKzEzLDcgQEAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICNpbmNsdWRlICJDbGFuZ1NBQ2hlY2tlcnMuaCIKKyNpbmNsdWRlICJBbGxvY2F0aW9uRGlhZ25vc3RpY3MuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvQXR0ci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsQ1hYLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xPYmpDLmgiCkBAIC0yMCw2ICsyMSw3IEBACiAjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvRG9tYWluU3BlY2lmaWMvQ29jb2FDb252ZW50aW9ucy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgorI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL09iakNSZXRhaW5Db3VudC5oIgogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvQnVnVHlwZS5oIgogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIvUGF0aERpYWdub3N0aWMuaCIKICNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0NoZWNrZXIuaCIKQEAgLTI4LDcgKzMwLDYgQEAKICNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvQ2hlY2tlckNvbnRleHQuaCIKICNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvUHJvZ3JhbVN0YXRlVHJhaXQuaCIKICNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvU3ltYm9sTWFuYWdlci5oIgotI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL09iakNSZXRhaW5Db3VudC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0ltbXV0YWJsZUxpc3QuaCIKQEAgLTM4LDggKzM5LDYgQEAKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKICNpbmNsdWRlIDxjc3RkYXJnPgogCi0jaW5jbHVkZSAiQWxsb2NhdGlvbkRpYWdub3N0aWNzLmgiCi0KIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIHVzaW5nIG5hbWVzcGFjZSBlbnRvOwogdXNpbmcgbmFtZXNwYWNlIG9iamNfcmV0YWluOwpAQCAtOTUsMjkgKzk0LDcwIEBACiAgIH07CiAKIHByaXZhdGU6Ci0gIEtpbmQga2luZDsKLSAgUmV0RWZmZWN0OjpPYmpLaW5kIG9raW5kOworICAvLy8gVGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyByZXRhaW5zLgogICB1bnNpZ25lZCBDbnQ7CisgIC8vLyBUaGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGF1dG9yZWxlYXNlcy4KICAgdW5zaWduZWQgQUNudDsKKyAgLy8vIFRoZSAoc3RhdGljKSB0eXBlIG9mIHRoZSBvYmplY3QgYXQgdGhlIHRpbWUgd2Ugc3RhcnRlZCB0cmFja2luZyBpdC4KICAgUXVhbFR5cGUgVDsKIAotICBSZWZWYWwoS2luZCBrLCBSZXRFZmZlY3Q6Ok9iaktpbmQgbywgdW5zaWduZWQgY250LCB1bnNpZ25lZCBhY250LCBRdWFsVHlwZSB0KQotICA6IGtpbmQoayksIG9raW5kKG8pLCBDbnQoY250KSwgQUNudChhY250KSwgVCh0KSB7fQorICAvLy8gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG9iamVjdC4KKyAgLy8vCisgIC8vLyBTZWUgdGhlIFJlZlZhbDo6S2luZCBlbnVtIGZvciBwb3NzaWJsZSB2YWx1ZXMuCisgIHVuc2lnbmVkIFJhd0tpbmQgOiA1OworCisgIC8vLyBUaGUga2luZCBvZiBvYmplY3QgYmVpbmcgdHJhY2tlZCAoQ0Ygb3IgT2JqQyksIGlmIGtub3duLgorICAvLy8KKyAgLy8vIFNlZSB0aGUgUmV0RWZmZWN0OjpPYmpLaW5kIGVudW0gZm9yIHBvc3NpYmxlIHZhbHVlcy4KKyAgdW5zaWduZWQgUmF3T2JqZWN0S2luZCA6IDI7CisKKyAgLy8vIFRydWUgaWYgdGhlIGN1cnJlbnQgc3RhdGUgYW5kL29yIHJldGFpbiBjb3VudCBtYXkgdHVybiBvdXQgdG8gbm90IGJlIHRoZQorICAvLy8gYmVzdCBwb3NzaWJsZSBhcHByb3hpbWF0aW9uIG9mIHRoZSByZWZlcmVuY2UgY291bnRpbmcgc3RhdGUuCisgIC8vLworICAvLy8gSWYgdHJ1ZSwgdGhlIGNoZWNrZXIgbWF5IGRlY2lkZSB0byB0aHJvdyBhd2F5ICgib3ZlcnJpZGUiKSB0aGlzIHN0YXRlCisgIC8vLyBpbiBmYXZvciBvZiBzb21ldGhpbmcgZWxzZSB3aGVuIGl0IHNlZXMgdGhlIG9iamVjdCBiZWluZyB1c2VkIGluIG5ldyB3YXlzLgorICAvLy8KKyAgLy8vIFRoaXMgc2V0dGluZyBzaG91bGQgbm90IGJlIHByb3BhZ2F0ZWQgdG8gc3RhdGUgZGVyaXZlZCBmcm9tIHRoaXMgc3RhdGUuCisgIC8vLyBPbmNlIHdlIHN0YXJ0IGRlcml2aW5nIG5ldyBzdGF0ZXMsIGl0IHdvdWxkIGJlIGluY29uc2lzdGVudCB0byBvdmVycmlkZQorICAvLy8gdGhlbS4KKyAgdW5zaWduZWQgSXNPdmVycmlkYWJsZSA6IDE7CisKKyAgUmVmVmFsKEtpbmQgaywgUmV0RWZmZWN0OjpPYmpLaW5kIG8sIHVuc2lnbmVkIGNudCwgdW5zaWduZWQgYWNudCwgUXVhbFR5cGUgdCwKKyAgICAgICAgIGJvb2wgT3ZlcnJpZGFibGUgPSBmYWxzZSkKKyAgICA6IENudChjbnQpLCBBQ250KGFjbnQpLCBUKHQpLCBSYXdLaW5kKHN0YXRpY19jYXN0PHVuc2lnbmVkPihrKSksCisgICAgICBSYXdPYmplY3RLaW5kKHN0YXRpY19jYXN0PHVuc2lnbmVkPihvKSksIElzT3ZlcnJpZGFibGUoT3ZlcnJpZGFibGUpIHsKKyAgICBhc3NlcnQoZ2V0S2luZCgpID09IGsgJiYgIm5vdCBlbm91Z2ggYml0cyBmb3IgdGhlIGtpbmQiKTsKKyAgICBhc3NlcnQoZ2V0T2JqS2luZCgpID09IG8gJiYgIm5vdCBlbm91Z2ggYml0cyBmb3IgdGhlIG9iamVjdCBraW5kIik7CisgIH0KIAogcHVibGljOgotICBLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBraW5kOyB9CisgIEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PEtpbmQ+KFJhd0tpbmQpOyB9CiAKLSAgUmV0RWZmZWN0OjpPYmpLaW5kIGdldE9iaktpbmQoKSBjb25zdCB7IHJldHVybiBva2luZDsgfQorICBSZXRFZmZlY3Q6Ok9iaktpbmQgZ2V0T2JqS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmV0RWZmZWN0OjpPYmpLaW5kPihSYXdPYmplY3RLaW5kKTsKKyAgfQogCiAgIHVuc2lnbmVkIGdldENvdW50KCkgY29uc3QgeyByZXR1cm4gQ250OyB9CiAgIHVuc2lnbmVkIGdldEF1dG9yZWxlYXNlQ291bnQoKSBjb25zdCB7IHJldHVybiBBQ250OyB9CiAgIHVuc2lnbmVkIGdldENvbWJpbmVkQ291bnRzKCkgY29uc3QgeyByZXR1cm4gQ250ICsgQUNudDsgfQotICB2b2lkIGNsZWFyQ291bnRzKCkgeyBDbnQgPSAwOyBBQ250ID0gMDsgfQotICB2b2lkIHNldENvdW50KHVuc2lnbmVkIGkpIHsgQ250ID0gaTsgfQotICB2b2lkIHNldEF1dG9yZWxlYXNlQ291bnQodW5zaWduZWQgaSkgeyBBQ250ID0gaTsgfQorICB2b2lkIGNsZWFyQ291bnRzKCkgeworICAgIENudCA9IDA7CisgICAgQUNudCA9IDA7CisgICAgSXNPdmVycmlkYWJsZSA9IGZhbHNlOworICB9CisgIHZvaWQgc2V0Q291bnQodW5zaWduZWQgaSkgeworICAgIENudCA9IGk7CisgICAgSXNPdmVycmlkYWJsZSA9IGZhbHNlOworICB9CisgIHZvaWQgc2V0QXV0b3JlbGVhc2VDb3VudCh1bnNpZ25lZCBpKSB7CisgICAgQUNudCA9IGk7CisgICAgSXNPdmVycmlkYWJsZSA9IGZhbHNlOworICB9CiAKICAgUXVhbFR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFQ7IH0KIAorICBib29sIGlzT3ZlcnJpZGFibGUoKSBjb25zdCB7IHJldHVybiBJc092ZXJyaWRhYmxlOyB9CisKICAgYm9vbCBpc093bmVkKCkgY29uc3QgewogICAgIHJldHVybiBnZXRLaW5kKCkgPT0gT3duZWQ7CiAgIH0KQEAgLTEzNCwyMCArMTc0LDMxIEBACiAgICAgcmV0dXJuIGdldEtpbmQoKSA9PSBSZXR1cm5lZE5vdE93bmVkOwogICB9CiAKKyAgLy8vIENyZWF0ZSBhIHN0YXRlIGZvciBhbiBvYmplY3Qgd2hvc2UgbGlmZXRpbWUgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQorICAvLy8gY3VycmVudCBmdW5jdGlvbiwgYXQgbGVhc3QgcGFydGlhbGx5LgorICAvLy8KKyAgLy8vIE1vc3QgY29tbW9ubHksIHRoaXMgaXMgYW4gb3duZWQgb2JqZWN0IHdpdGggYSByZXRhaW4gY291bnQgb2YgKzEuCiAgIHN0YXRpYyBSZWZWYWwgbWFrZU93bmVkKFJldEVmZmVjdDo6T2JqS2luZCBvLCBRdWFsVHlwZSB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb3VudCA9IDEpIHsKICAgICByZXR1cm4gUmVmVmFsKE93bmVkLCBvLCBDb3VudCwgMCwgdCk7CiAgIH0KIAorICAvLy8gQ3JlYXRlIGEgc3RhdGUgZm9yIGFuIG9iamVjdCB3aG9zZSBsaWZldGltZSBpcyBub3QgdGhlIHJlc3BvbnNpYmlsaXR5IG9mCisgIC8vLyB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBNb3N0IGNvbW1vbmx5LCB0aGlzIGlzIGFuIHVub3duZWQgb2JqZWN0IHdpdGggYSByZXRhaW4gY291bnQgb2YgKzAuCiAgIHN0YXRpYyBSZWZWYWwgbWFrZU5vdE93bmVkKFJldEVmZmVjdDo6T2JqS2luZCBvLCBRdWFsVHlwZSB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb3VudCA9IDApIHsKICAgICByZXR1cm4gUmVmVmFsKE5vdE93bmVkLCBvLCBDb3VudCwgMCwgdCk7CiAgIH0KIAotICAvLyBDb21wYXJpc29uLCBwcm9maWxpbmcsIGFuZCBwcmV0dHktcHJpbnRpbmcuCi0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlZlZhbCYgWCkgY29uc3QgewotICAgIHJldHVybiBraW5kID09IFgua2luZCAmJiBDbnQgPT0gWC5DbnQgJiYgVCA9PSBYLlQgJiYgQUNudCA9PSBYLkFDbnQ7CisgIC8vLyBDcmVhdGUgYW4gIm92ZXJyaWRhYmxlIiBzdGF0ZSBmb3IgYW4gdW5vd25lZCBvYmplY3QgYXQgKzAuCisgIC8vLworICAvLy8gQW4gb3ZlcnJpZGFibGUgc3RhdGUgaXMgb25lIHRoYXQgcHJvdmlkZXMgYSBnb29kIGFwcHJveGltYXRpb24gb2YgdGhlCisgIC8vLyByZWZlcmVuY2UgY291bnRpbmcgc3RhdGUgbm93LCBidXQgd2hpY2ggbWF5IGJlIGRpc2NhcmRlZCBsYXRlciBpZiB0aGUKKyAgLy8vIGNoZWNrZXIgc2VlcyB0aGUgb2JqZWN0IGJlaW5nIHVzZWQgaW4gbmV3IHdheXMuCisgIHN0YXRpYyBSZWZWYWwgbWFrZU92ZXJyaWRhYmxlTm90T3duZWQoUmV0RWZmZWN0OjpPYmpLaW5kIG8sIFF1YWxUeXBlIHQpIHsKKyAgICByZXR1cm4gUmVmVmFsKE5vdE93bmVkLCBvLCAwLCAwLCB0LCAvKk92ZXJyaWRhYmxlPSovdHJ1ZSk7CiAgIH0KIAogICBSZWZWYWwgb3BlcmF0b3ItKHNpemVfdCBpKSBjb25zdCB7CkBAIC0xNzAsMTEgKzIyMSwyNCBAQAogICAgICAgICAgICAgICAgICAgZ2V0VHlwZSgpKTsKICAgfQogCisgIC8vIENvbXBhcmlzb24sIHByb2ZpbGluZywgYW5kIHByZXR0eS1wcmludGluZy4KKworICBib29sIGhhc1NhbWVTdGF0ZShjb25zdCBSZWZWYWwgJlgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0S2luZCgpID09IFguZ2V0S2luZCgpICYmIENudCA9PSBYLkNudCAmJiBBQ250ID09IFguQUNudDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWZWYWwmIFgpIGNvbnN0IHsKKyAgICByZXR1cm4gVCA9PSBYLlQgJiYgaGFzU2FtZVN0YXRlKFgpICYmIGdldE9iaktpbmQoKSA9PSBYLmdldE9iaktpbmQoKSAmJgorICAgICAgICAgICBJc092ZXJyaWRhYmxlID09IFguSXNPdmVycmlkYWJsZTsKKyAgfQorICAKICAgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCB7Ci0gICAgSUQuQWRkSW50ZWdlcigodW5zaWduZWQpIGtpbmQpOworICAgIElELkFkZChUKTsKKyAgICBJRC5BZGRJbnRlZ2VyKFJhd0tpbmQpOwogICAgIElELkFkZEludGVnZXIoQ250KTsKICAgICBJRC5BZGRJbnRlZ2VyKEFDbnQpOwotICAgIElELkFkZChUKTsKKyAgICBJRC5BZGRJbnRlZ2VyKFJhd09iamVjdEtpbmQpOworICAgIElELkFkZEJvb2xlYW4oSXNPdmVycmlkYWJsZSk7CiAgIH0KIAogICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPdXQpIGNvbnN0OwpAQCAtMTg0LDYgKzI0OCw5IEBACiAgIGlmICghVC5pc051bGwoKSkKICAgICBPdXQgPDwgIlRyYWNrZWQgIiA8PCBULmdldEFzU3RyaW5nKCkgPDwgJy8nOwogCisgIGlmIChpc092ZXJyaWRhYmxlKCkpCisgICAgT3V0IDw8ICIob3ZlcnJpZGFibGUpICI7CisKICAgc3dpdGNoIChnZXRLaW5kKCkpIHsKICAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIFJlZlZhbCBraW5kIik7CiAgICAgY2FzZSBPd25lZDogewpAQCAtNjUzLDExICs3MjAsMTEgQEAKICAgICAgQUYoQlBBbGxvYyksIFNjcmF0Y2hBcmdzKEFGLmdldEVtcHR5TWFwKCkpLAogICAgICBPYmpDQWxsb2NSZXRFKGdjZW5hYmxlZAogICAgICAgICAgICAgICAgICAgICA/IFJldEVmZmVjdDo6TWFrZUdDTm90T3duZWQoKQotICAgICAgICAgICAgICAgICAgICA6ICh1c2VzQVJDID8gUmV0RWZmZWN0OjpNYWtlQVJDTm90T3duZWQoKQorICAgICAgICAgICAgICAgICAgICA6ICh1c2VzQVJDID8gUmV0RWZmZWN0OjpNYWtlTm90T3duZWQoUmV0RWZmZWN0OjpPYmpDKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUmV0RWZmZWN0OjpNYWtlT3duZWQoUmV0RWZmZWN0OjpPYmpDLCB0cnVlKSkpLAogICAgICBPYmpDSW5pdFJldEUoZ2NlbmFibGVkIAogICAgICAgICAgICAgICAgICAgICA/IFJldEVmZmVjdDo6TWFrZUdDTm90T3duZWQoKQotICAgICAgICAgICAgICAgICAgICA6ICh1c2VzQVJDID8gUmV0RWZmZWN0OjpNYWtlQVJDTm90T3duZWQoKQorICAgICAgICAgICAgICAgICAgICA6ICh1c2VzQVJDID8gUmV0RWZmZWN0OjpNYWtlTm90T3duZWQoUmV0RWZmZWN0OjpPYmpDKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUmV0RWZmZWN0OjpNYWtlT3duZWRXaGVuVHJhY2tlZFJlY2VpdmVyKCkpKSB7CiAgICAgSW5pdGlhbGl6ZUNsYXNzTWV0aG9kU3VtbWFyaWVzKCk7CiAgICAgSW5pdGlhbGl6ZU1ldGhvZFN1bW1hcmllcygpOwpAQCAtNjg5LDcgKzc1Niw3IEBACiAgIGNvbnN0IFJldGFpblN1bW1hcnkgKmdldE1ldGhvZFN1bW1hcnkoY29uc3QgT2JqQ01ldGhvZERlY2wgKk1EKSB7CiAgICAgY29uc3QgT2JqQ0ludGVyZmFjZURlY2wgKklEID0gTUQtPmdldENsYXNzSW50ZXJmYWNlKCk7CiAgICAgU2VsZWN0b3IgUyA9IE1ELT5nZXRTZWxlY3RvcigpOwotICAgIFF1YWxUeXBlIFJlc3VsdFR5ID0gTUQtPmdldFJlc3VsdFR5cGUoKTsKKyAgICBRdWFsVHlwZSBSZXN1bHRUeSA9IE1ELT5nZXRSZXR1cm5UeXBlKCk7CiAKICAgICBPYmpDTWV0aG9kU3VtbWFyaWVzVHkgKkNhY2hlZFN1bW1hcmllczsKICAgICBpZiAoTUQtPmlzSW5zdGFuY2VNZXRob2QoKSkKQEAgLTg2MSw3ICs5MjgsNyBAQAogICAgIC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgdGhlIGNhbGxiYWNrIGFyZ3VtZW50IENBTk5PVCBmcmVlIHRoZSByZXR1cm4gdmFsdWUuCiAgICAgLy8gVGhpcyBjYW4gZ2VuZXJhbGx5IG9ubHkgaGFwcGVuIGlmIHdlIGtub3cgdGhhdCB0aGUgY2FsbGJhY2sgd2lsbCBvbmx5IGJlCiAgICAgLy8gY2FsbGVkIHdoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBhbHJlYWR5IGJlaW5nIGRlYWxsb2NhdGVkLgotICAgIGlmIChjb25zdCBGdW5jdGlvbkNhbGwgKkZDID0gZHluX2Nhc3Q8RnVuY3Rpb25DYWxsPigmQ2FsbCkpIHsKKyAgICBpZiAoY29uc3QgU2ltcGxlRnVuY3Rpb25DYWxsICpGQyA9IGR5bl9jYXN0PFNpbXBsZUZ1bmN0aW9uQ2FsbD4oJkNhbGwpKSB7CiAgICAgICBpZiAoSWRlbnRpZmllckluZm8gKk5hbWUgPSBGQy0+Z2V0RGVjbCgpLT5nZXRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgLy8gV2hlbiB0aGUgQ0dCaXRtYXBDb250ZXh0IGlzIGRlYWxsb2NhdGVkLCB0aGUgY2FsbGJhY2sgaGVyZSB3aWxsIGZyZWUKICAgICAgICAgLy8gdGhlIGFzc29jaWF0ZWQgZGF0YSBidWZmZXIuCkBAIC05MDksNyArOTc2LDcgQEAKICAgY29uc3QgUmV0YWluU3VtbWFyeSAqU3VtbTsKICAgc3dpdGNoIChDYWxsLmdldEtpbmQoKSkgewogICBjYXNlIENFX0Z1bmN0aW9uOgotICAgIFN1bW0gPSBnZXRGdW5jdGlvblN1bW1hcnkoY2FzdDxGdW5jdGlvbkNhbGw+KENhbGwpLmdldERlY2woKSk7CisgICAgU3VtbSA9IGdldEZ1bmN0aW9uU3VtbWFyeShjYXN0PFNpbXBsZUZ1bmN0aW9uQ2FsbD4oQ2FsbCkuZ2V0RGVjbCgpKTsKICAgICBicmVhazsKICAgY2FzZSBDRV9DWFhNZW1iZXI6CiAgIGNhc2UgQ0VfQ1hYTWVtYmVyT3BlcmF0b3I6CkBAIC05NzEsNyArMTAzOCw3IEBACiAgICAgRk5hbWUgPSBGTmFtZS5zdWJzdHIoRk5hbWUuZmluZF9maXJzdF9ub3Rfb2YoJ18nKSk7CiAKICAgICAvLyBJbnNwZWN0IHRoZSByZXN1bHQgdHlwZS4KLSAgICBRdWFsVHlwZSBSZXRUeSA9IEZULT5nZXRSZXN1bHRUeXBlKCk7CisgICAgUXVhbFR5cGUgUmV0VHkgPSBGVC0+Z2V0UmV0dXJuVHlwZSgpOwogCiAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGFsbCBiZSByZWZhY3RvcmVkIGludG8gYSBjaGFpbiBvZiAic3VtbWFyeSBsb29rdXAiCiAgICAgLy8gIGZpbHRlcnMuCkBAIC0xMTAyLDcgKzExNjksNyBAQAogICAgICAgICBicmVhazsKICAgICAgIH0KIAotICAgICAgaWYgKEZELT5nZXRBdHRyPENGQXVkaXRlZFRyYW5zZmVyQXR0cj4oKSkgeworICAgICAgaWYgKEZELT5oYXNBdHRyPENGQXVkaXRlZFRyYW5zZmVyQXR0cj4oKSkgewogICAgICAgICBTID0gZ2V0Q0ZDcmVhdGVHZXRSdWxlU3VtbWFyeShGRCk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQpAQCAtMTE3NSw3ICsxMjQyLDcgQEAKICAgLy8gU2FuaXR5IGNoZWNrIHRoYXQgdGhpcyBpcyAqcmVhbGx5KiBhIHVuYXJ5IGZ1bmN0aW9uLiAgVGhpcyBjYW4KICAgLy8gaGFwcGVuIGlmIHBlb3BsZSBkbyB3ZWlyZCB0aGluZ3MuCiAgIGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlKiBGVFAgPSBkeW5fY2FzdDxGdW5jdGlvblByb3RvVHlwZT4oRlQpOwotICBpZiAoIUZUUCB8fCBGVFAtPmdldE51bUFyZ3MoKSAhPSAxKQorICBpZiAoIUZUUCB8fCBGVFAtPmdldE51bVBhcmFtcygpICE9IDEpCiAgICAgcmV0dXJuIGdldFBlcnNpc3RlbnRTdG9wU3VtbWFyeSgpOwogCiAgIGFzc2VydCAoU2NyYXRjaEFyZ3MuaXNFbXB0eSgpKTsKQEAgLTEyMTQsMjEgKzEyODEsMjEgQEAKIFJldGFpblN1bW1hcnlNYW5hZ2VyOjpnZXRSZXRFZmZlY3RGcm9tQW5ub3RhdGlvbnMoUXVhbFR5cGUgUmV0VHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2wgKkQpIHsKICAgaWYgKGNvY29hOjppc0NvY29hT2JqZWN0UmVmKFJldFR5KSkgewotICAgIGlmIChELT5nZXRBdHRyPE5TUmV0dXJuc1JldGFpbmVkQXR0cj4oKSkKKyAgICBpZiAoRC0+aGFzQXR0cjxOU1JldHVybnNSZXRhaW5lZEF0dHI+KCkpCiAgICAgICByZXR1cm4gT2JqQ0FsbG9jUmV0RTsKIAotICAgIGlmIChELT5nZXRBdHRyPE5TUmV0dXJuc05vdFJldGFpbmVkQXR0cj4oKSB8fAotICAgICAgICBELT5nZXRBdHRyPE5TUmV0dXJuc0F1dG9yZWxlYXNlZEF0dHI+KCkpCisgICAgaWYgKEQtPmhhc0F0dHI8TlNSZXR1cm5zTm90UmV0YWluZWRBdHRyPigpIHx8CisgICAgICAgIEQtPmhhc0F0dHI8TlNSZXR1cm5zQXV0b3JlbGVhc2VkQXR0cj4oKSkKICAgICAgIHJldHVybiBSZXRFZmZlY3Q6Ok1ha2VOb3RPd25lZChSZXRFZmZlY3Q6Ok9iakMpOwogCiAgIH0gZWxzZSBpZiAoIVJldFR5LT5pc1BvaW50ZXJUeXBlKCkpIHsKICAgICByZXR1cm4gTm9uZTsKICAgfQogCi0gIGlmIChELT5nZXRBdHRyPENGUmV0dXJuc1JldGFpbmVkQXR0cj4oKSkKKyAgaWYgKEQtPmhhc0F0dHI8Q0ZSZXR1cm5zUmV0YWluZWRBdHRyPigpKQogICAgIHJldHVybiBSZXRFZmZlY3Q6Ok1ha2VPd25lZChSZXRFZmZlY3Q6OkNGLCB0cnVlKTsKIAotICBpZiAoRC0+Z2V0QXR0cjxDRlJldHVybnNOb3RSZXRhaW5lZEF0dHI+KCkpCisgIGlmIChELT5oYXNBdHRyPENGUmV0dXJuc05vdFJldGFpbmVkQXR0cj4oKSkKICAgICByZXR1cm4gUmV0RWZmZWN0OjpNYWtlTm90T3duZWQoUmV0RWZmZWN0OjpDRik7CiAKICAgcmV0dXJuIE5vbmU7CkBAIC0xMjQ4LDEzICsxMzE1LDEzIEBACiAgIGZvciAoRnVuY3Rpb25EZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBwaSA9IEZELT5wYXJhbV9iZWdpbigpLCAKICAgICAgICAgIHBlID0gRkQtPnBhcmFtX2VuZCgpOyBwaSAhPSBwZTsgKytwaSwgKytwYXJtX2lkeCkgewogICAgIGNvbnN0IFBhcm1WYXJEZWNsICpwZCA9ICpwaTsKLSAgICBpZiAocGQtPmdldEF0dHI8TlNDb25zdW1lZEF0dHI+KCkpCisgICAgaWYgKHBkLT5oYXNBdHRyPE5TQ29uc3VtZWRBdHRyPigpKQogICAgICAgVGVtcGxhdGUtPmFkZEFyZyhBRiwgcGFybV9pZHgsIERlY1JlZk1zZyk7Ci0gICAgZWxzZSBpZiAocGQtPmdldEF0dHI8Q0ZDb25zdW1lZEF0dHI+KCkpCisgICAgZWxzZSBpZiAocGQtPmhhc0F0dHI8Q0ZDb25zdW1lZEF0dHI+KCkpCiAgICAgICBUZW1wbGF0ZS0+YWRkQXJnKEFGLCBwYXJtX2lkeCwgRGVjUmVmKTsgICAgICAKICAgfQotICAKLSAgUXVhbFR5cGUgUmV0VHkgPSBGRC0+Z2V0UmVzdWx0VHlwZSgpOworCisgIFF1YWxUeXBlIFJldFR5ID0gRkQtPmdldFJldHVyblR5cGUoKTsKICAgaWYgKE9wdGlvbmFsPFJldEVmZmVjdD4gUmV0RSA9IGdldFJldEVmZmVjdEZyb21Bbm5vdGF0aW9ucyhSZXRUeSwgRkQpKQogICAgIFRlbXBsYXRlLT5zZXRSZXRFZmZlY3QoKlJldEUpOwogfQpAQCAtMTI2OSw3ICsxMzM2LDcgQEAKICAgUmV0YWluU3VtbWFyeVRlbXBsYXRlIFRlbXBsYXRlKFN1bW0sICp0aGlzKTsKIAogICAvLyBFZmZlY3RzIG9uIHRoZSByZWNlaXZlci4KLSAgaWYgKE1ELT5nZXRBdHRyPE5TQ29uc3VtZXNTZWxmQXR0cj4oKSkKKyAgaWYgKE1ELT5oYXNBdHRyPE5TQ29uc3VtZXNTZWxmQXR0cj4oKSkKICAgICBUZW1wbGF0ZS0+c2V0UmVjZWl2ZXJFZmZlY3QoRGVjUmVmTXNnKTsgICAgICAKICAgCiAgIC8vIEVmZmVjdHMgb24gdGhlIHBhcmFtZXRlcnMuCkBAIC0xMjc4LDE0ICsxMzQ1LDE0IEBACiAgICAgICAgICBwaT1NRC0+cGFyYW1fYmVnaW4oKSwgcGU9TUQtPnBhcmFtX2VuZCgpOwogICAgICAgIHBpICE9IHBlOyArK3BpLCArK3Bhcm1faWR4KSB7CiAgICAgY29uc3QgUGFybVZhckRlY2wgKnBkID0gKnBpOwotICAgIGlmIChwZC0+Z2V0QXR0cjxOU0NvbnN1bWVkQXR0cj4oKSkKKyAgICBpZiAocGQtPmhhc0F0dHI8TlNDb25zdW1lZEF0dHI+KCkpCiAgICAgICBUZW1wbGF0ZS0+YWRkQXJnKEFGLCBwYXJtX2lkeCwgRGVjUmVmTXNnKTsgICAgICAKLSAgICBlbHNlIGlmIChwZC0+Z2V0QXR0cjxDRkNvbnN1bWVkQXR0cj4oKSkgeworICAgIGVsc2UgaWYgKHBkLT5oYXNBdHRyPENGQ29uc3VtZWRBdHRyPigpKSB7CiAgICAgICBUZW1wbGF0ZS0+YWRkQXJnKEFGLCBwYXJtX2lkeCwgRGVjUmVmKTsgICAgICAKICAgICB9ICAgCiAgIH0KLSAgCi0gIFF1YWxUeXBlIFJldFR5ID0gTUQtPmdldFJlc3VsdFR5cGUoKTsKKworICBRdWFsVHlwZSBSZXRUeSA9IE1ELT5nZXRSZXR1cm5UeXBlKCk7CiAgIGlmIChPcHRpb25hbDxSZXRFZmZlY3Q+IFJldEUgPSBnZXRSZXRFZmZlY3RGcm9tQW5ub3RhdGlvbnMoUmV0VHksIE1EKSkKICAgICBUZW1wbGF0ZS0+c2V0UmV0RWZmZWN0KCpSZXRFKTsKIH0KQEAgLTE1MDcsNiArMTU3NCwxMSBAQAogICAvLyAgIGFzIGZvciBOU1dpbmRvdyBvYmplY3RzLgogICBhZGRDbGFzc01ldGhTdW1tYXJ5KCJOU1BhbmVsIiwgImFsbG9jIiwgTm9UcmFja1lldCk7CiAKKyAgLy8gRm9yIE5TTnVsbCwgb2JqZWN0cyByZXR1cm5lZCBieSArbnVsbCBhcmUgc2luZ2xldG9ucyB0aGF0IGlnbm9yZQorICAvLyByZXRhaW4vcmVsZWFzZSBzZW1hbnRpY3MuICBKdXN0IGRvbid0IHRyYWNrIHRoZW0uCisgIC8vIDxyZGFyOi8vcHJvYmxlbS8xMjg1ODkxNT4KKyAgYWRkQ2xhc3NNZXRoU3VtbWFyeSgiTlNOdWxsIiwgIm51bGwiLCBOb1RyYWNrWWV0KTsKKwogICAvLyBEb24ndCB0cmFjayBhbGxvY2F0ZWQgYXV0b3JlbGVhc2UgcG9vbHMsIGFzIGl0IGlzIG9rYXkgdG8gcHJlbWF0dXJlbHkKICAgLy8gZXhpdCBhIG1ldGhvZC4KICAgYWRkQ2xhc3NNZXRoU3VtbWFyeSgiTlNBdXRvcmVsZWFzZVBvb2wiLCAiYWxsb2MiLCBOb1RyYWNrWWV0KTsKQEAgLTE1NDMsOCArMTYxNSw5IEBACiAKICAgY2xhc3MgQ0ZSZWZCdWcgOiBwdWJsaWMgQnVnVHlwZSB7CiAgIHByb3RlY3RlZDoKLSAgICBDRlJlZkJ1ZyhTdHJpbmdSZWYgbmFtZSkKLSAgICA6IEJ1Z1R5cGUobmFtZSwgY2F0ZWdvcmllczo6TWVtb3J5Q29yZUZvdW5kYXRpb25PYmplY3RpdmVDKSB7fQorICAgIENGUmVmQnVnKGNvbnN0IENoZWNrZXJCYXNlICpjaGVja2VyLCBTdHJpbmdSZWYgbmFtZSkKKyAgICAgICAgOiBCdWdUeXBlKGNoZWNrZXIsIG5hbWUsIGNhdGVnb3JpZXM6Ok1lbW9yeUNvcmVGb3VuZGF0aW9uT2JqZWN0aXZlQykge30KKwogICBwdWJsaWM6CiAKICAgICAvLyBGSVhNRTogRXZlbnR1YWxseSByZW1vdmUuCkBAIC0xNTU1LDE4ICsxNjI4LDE5IEBACiAKICAgY2xhc3MgVXNlQWZ0ZXJSZWxlYXNlIDogcHVibGljIENGUmVmQnVnIHsKICAgcHVibGljOgotICAgIFVzZUFmdGVyUmVsZWFzZSgpIDogQ0ZSZWZCdWcoIlVzZS1hZnRlci1yZWxlYXNlIikge30KKyAgICBVc2VBZnRlclJlbGVhc2UoY29uc3QgQ2hlY2tlckJhc2UgKmNoZWNrZXIpCisgICAgICAgIDogQ0ZSZWZCdWcoY2hlY2tlciwgIlVzZS1hZnRlci1yZWxlYXNlIikge30KIAotICAgIGNvbnN0IGNoYXIgKmdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgIGNvbnN0IGNoYXIgKmdldERlc2NyaXB0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgcmV0dXJuICJSZWZlcmVuY2UtY291bnRlZCBvYmplY3QgaXMgdXNlZCBhZnRlciBpdCBpcyByZWxlYXNlZCI7CiAgICAgfQogICB9OwogCiAgIGNsYXNzIEJhZFJlbGVhc2UgOiBwdWJsaWMgQ0ZSZWZCdWcgewogICBwdWJsaWM6Ci0gICAgQmFkUmVsZWFzZSgpIDogQ0ZSZWZCdWcoIkJhZCByZWxlYXNlIikge30KKyAgICBCYWRSZWxlYXNlKGNvbnN0IENoZWNrZXJCYXNlICpjaGVja2VyKSA6IENGUmVmQnVnKGNoZWNrZXIsICJCYWQgcmVsZWFzZSIpIHt9CiAKLSAgICBjb25zdCBjaGFyICpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICBjb25zdCBjaGFyICpnZXREZXNjcmlwdGlvbigpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHJldHVybiAiSW5jb3JyZWN0IGRlY3JlbWVudCBvZiB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuIG9iamVjdCB0aGF0IGlzICIKICAgICAgICAgICAgICAibm90IG93bmVkIGF0IHRoaXMgcG9pbnQgYnkgdGhlIGNhbGxlciI7CiAgICAgfQpAQCAtMTU3NCw0MCArMTY0OCw0MCBAQAogCiAgIGNsYXNzIERlYWxsb2NHQyA6IHB1YmxpYyBDRlJlZkJ1ZyB7CiAgIHB1YmxpYzoKLSAgICBEZWFsbG9jR0MoKQotICAgIDogQ0ZSZWZCdWcoIi1kZWFsbG9jIGNhbGxlZCB3aGlsZSB1c2luZyBnYXJiYWdlIGNvbGxlY3Rpb24iKSB7fQorICAgIERlYWxsb2NHQyhjb25zdCBDaGVja2VyQmFzZSAqY2hlY2tlcikKKyAgICAgICAgOiBDRlJlZkJ1ZyhjaGVja2VyLCAiLWRlYWxsb2MgY2FsbGVkIHdoaWxlIHVzaW5nIGdhcmJhZ2UgY29sbGVjdGlvbiIpIHt9CiAKLSAgICBjb25zdCBjaGFyICpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICBjb25zdCBjaGFyICpnZXREZXNjcmlwdGlvbigpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHJldHVybiAiLWRlYWxsb2MgY2FsbGVkIHdoaWxlIHVzaW5nIGdhcmJhZ2UgY29sbGVjdGlvbiI7CiAgICAgfQogICB9OwogCiAgIGNsYXNzIERlYWxsb2NOb3RPd25lZCA6IHB1YmxpYyBDRlJlZkJ1ZyB7CiAgIHB1YmxpYzoKLSAgICBEZWFsbG9jTm90T3duZWQoKQotICAgIDogQ0ZSZWZCdWcoIi1kZWFsbG9jIHNlbnQgdG8gbm9uLWV4Y2x1c2l2ZWx5IG93bmVkIG9iamVjdCIpIHt9CisgICAgRGVhbGxvY05vdE93bmVkKGNvbnN0IENoZWNrZXJCYXNlICpjaGVja2VyKQorICAgICAgICA6IENGUmVmQnVnKGNoZWNrZXIsICItZGVhbGxvYyBzZW50IHRvIG5vbi1leGNsdXNpdmVseSBvd25lZCBvYmplY3QiKSB7fQogCi0gICAgY29uc3QgY2hhciAqZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgY29uc3QgY2hhciAqZ2V0RGVzY3JpcHRpb24oKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gIi1kZWFsbG9jIHNlbnQgdG8gb2JqZWN0IHRoYXQgbWF5IGJlIHJlZmVyZW5jZWQgZWxzZXdoZXJlIjsKICAgICB9CiAgIH07CiAKICAgY2xhc3MgT3ZlckF1dG9yZWxlYXNlIDogcHVibGljIENGUmVmQnVnIHsKICAgcHVibGljOgotICAgIE92ZXJBdXRvcmVsZWFzZSgpCi0gICAgOiBDRlJlZkJ1ZygiT2JqZWN0IGF1dG9yZWxlYXNlZCB0b28gbWFueSB0aW1lcyIpIHt9CisgICAgT3ZlckF1dG9yZWxlYXNlKGNvbnN0IENoZWNrZXJCYXNlICpjaGVja2VyKQorICAgICAgICA6IENGUmVmQnVnKGNoZWNrZXIsICJPYmplY3QgYXV0b3JlbGVhc2VkIHRvbyBtYW55IHRpbWVzIikge30KIAotICAgIGNvbnN0IGNoYXIgKmdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgIGNvbnN0IGNoYXIgKmdldERlc2NyaXB0aW9uKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgcmV0dXJuICJPYmplY3QgYXV0b3JlbGVhc2VkIHRvbyBtYW55IHRpbWVzIjsKICAgICB9CiAgIH07CiAKICAgY2xhc3MgUmV0dXJuZWROb3RPd25lZEZvck93bmVkIDogcHVibGljIENGUmVmQnVnIHsKICAgcHVibGljOgotICAgIFJldHVybmVkTm90T3duZWRGb3JPd25lZCgpCi0gICAgOiBDRlJlZkJ1ZygiTWV0aG9kIHNob3VsZCByZXR1cm4gYW4gb3duZWQgb2JqZWN0Iikge30KKyAgICBSZXR1cm5lZE5vdE93bmVkRm9yT3duZWQoY29uc3QgQ2hlY2tlckJhc2UgKmNoZWNrZXIpCisgICAgICAgIDogQ0ZSZWZCdWcoY2hlY2tlciwgIk1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIG93bmVkIG9iamVjdCIpIHt9CiAKLSAgICBjb25zdCBjaGFyICpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICBjb25zdCBjaGFyICpnZXREZXNjcmlwdGlvbigpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHJldHVybiAiT2JqZWN0IHdpdGggYSArMCByZXRhaW4gY291bnQgcmV0dXJuZWQgdG8gY2FsbGVyIHdoZXJlIGEgKzEgIgogICAgICAgICAgICAgICIob3duaW5nKSByZXRhaW4gY291bnQgaXMgZXhwZWN0ZWQiOwogICAgIH0KQEAgLTE2MTUsMTUgKzE2ODksMTQgQEAKIAogICBjbGFzcyBMZWFrIDogcHVibGljIENGUmVmQnVnIHsKICAgcHVibGljOgotICAgIExlYWsoU3RyaW5nUmVmIG5hbWUpCi0gICAgOiBDRlJlZkJ1ZyhuYW1lKSB7CisgICAgTGVhayhjb25zdCBDaGVja2VyQmFzZSAqY2hlY2tlciwgU3RyaW5nUmVmIG5hbWUpIDogQ0ZSZWZCdWcoY2hlY2tlciwgbmFtZSkgewogICAgICAgLy8gTGVha3Mgc2hvdWxkIG5vdCBiZSByZXBvcnRlZCBpZiB0aGV5IGFyZSBwb3N0LWRvbWluYXRlZCBieSBhIHNpbmsuCiAgICAgICBzZXRTdXBwcmVzc09uU2luayh0cnVlKTsKICAgICB9CiAKLSAgICBjb25zdCBjaGFyICpnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgICAgY29uc3QgY2hhciAqZ2V0RGVzY3JpcHRpb24oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiIjsgfQogCi0gICAgYm9vbCBpc0xlYWsoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgYm9vbCBpc0xlYWsoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAgIH07CiAKICAgLy89PT0tLS0tLS0tLS09PT0vLwpAQCAtMTY0MCwyMCArMTcxMywyMCBAQAogICAgIENGUmVmUmVwb3J0VmlzaXRvcihTeW1ib2xSZWYgc3ltLCBib29sIGdjRW5hYmxlZCwgY29uc3QgU3VtbWFyeUxvZ1R5ICZsb2cpCiAgICAgICAgOiBTeW0oc3ltKSwgU3VtbWFyeUxvZyhsb2cpLCBHQ0VuYWJsZWQoZ2NFbmFibGVkKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IHsKKyAgICB2b2lkIFByb2ZpbGUobGx2bTo6Rm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHN0YXRpYyBpbnQgeCA9IDA7CiAgICAgICBJRC5BZGRQb2ludGVyKCZ4KTsKICAgICAgIElELkFkZFBvaW50ZXIoU3ltKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIFBhdGhEaWFnbm9zdGljUGllY2UgKlZpc2l0Tm9kZShjb25zdCBFeHBsb2RlZE5vZGUgKk4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpQcmV2TiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlckNvbnRleHQgJkJSQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKTsKKyAgICBQYXRoRGlhZ25vc3RpY1BpZWNlICpWaXNpdE5vZGUoY29uc3QgRXhwbG9kZWROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKlByZXZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlckNvbnRleHQgJkJSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUikgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIFBhdGhEaWFnbm9zdGljUGllY2UgKmdldEVuZFBhdGgoQnVnUmVwb3J0ZXJDb250ZXh0ICZCUkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUik7CisgICAgUGF0aERpYWdub3N0aWNQaWVjZSAqZ2V0RW5kUGF0aChCdWdSZXBvcnRlckNvbnRleHQgJkJSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIG92ZXJyaWRlOwogICB9OwogCiAgIGNsYXNzIENGUmVmTGVha1JlcG9ydFZpc2l0b3IgOiBwdWJsaWMgQ0ZSZWZSZXBvcnRWaXNpdG9yIHsKQEAgLTE2NjQsOSArMTczNyw5IEBACiAKICAgICBQYXRoRGlhZ25vc3RpY1BpZWNlICpnZXRFbmRQYXRoKEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwbG9kZWROb2RlICpOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgQnVnUmVwb3J0ZXJWaXNpdG9yICpjbG9uZSgpIGNvbnN0IHsKKyAgICBCdWdSZXBvcnRlclZpc2l0b3IgKmNsb25lKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgLy8gVGhlIGN1cmlvdXNseS1yZWN1cnJpbmcgdGVtcGxhdGUgcGF0dGVybiBvbmx5IHdvcmtzIGZvciBvbmUgbGV2ZWwgb2YKICAgICAgIC8vIHN1YmNsYXNzaW5nLiBSYXRoZXIgdGhhbiBtYWtlIGEgbmV3IHRlbXBsYXRlIGJhc2UgZm9yCiAgICAgICAvLyBDRlJlZlJlcG9ydFZpc2l0b3IsIHdlIHNpbXBseSBvdmVycmlkZSBjbG9uZSgpIHRvIGRvIHRoZSByaWdodCB0aGluZy4KQEAgLTE2OTcsNyArMTc3MCw3IEBACiAgICAgICBhZGRHQ01vZGVEZXNjcmlwdGlvbihMT3B0cywgR0NFbmFibGVkKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0ZDo6cGFpcjxyYW5nZXNfaXRlcmF0b3IsIHJhbmdlc19pdGVyYXRvcj4gZ2V0UmFuZ2VzKCkgeworICAgIHN0ZDo6cGFpcjxyYW5nZXNfaXRlcmF0b3IsIHJhbmdlc19pdGVyYXRvcj4gZ2V0UmFuZ2VzKCkgb3ZlcnJpZGUgewogICAgICAgY29uc3QgQ0ZSZWZCdWcmIEJ1Z1R5ID0gc3RhdGljX2Nhc3Q8Q0ZSZWZCdWcmPihnZXRCdWdUeXBlKCkpOwogICAgICAgaWYgKCFCdWdUeS5pc0xlYWsoKSkKICAgICAgICAgcmV0dXJuIEJ1Z1JlcG9ydDo6Z2V0UmFuZ2VzKCk7CkBAIC0xNzE0LDcgKzE3ODcsNyBAQAogICAgICAgICAgICAgICAgICAgICBDaGVja2VyQ29udGV4dCAmQ3R4LAogICAgICAgICAgICAgICAgICAgICBib29sIEluY2x1ZGVBbGxvY2F0aW9uTGluZSk7CiAKLSAgICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uIGdldExvY2F0aW9uKGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKSBjb25zdCB7CisgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBnZXRMb2NhdGlvbihjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgYXNzZXJ0KExvY2F0aW9uLmlzVmFsaWQoKSk7CiAgICAgICByZXR1cm4gTG9jYXRpb247CiAgICAgfQpAQCAtMTkxOCw3ICsxOTkxLDcgQEAKICAgICBpZiAoIUdDRW5hYmxlZCAmJiBzdGQ6OmZpbmQoQUVmZmVjdHMuYmVnaW4oKSwgQUVmZmVjdHMuZW5kKCksIERlYWxsb2MpICE9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFZmZlY3RzLmVuZCgpKSB7CiAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCB3YXMgcHVzaGVkIHRvIHplcm8uCi0gICAgICBhc3NlcnQoIShQcmV2ViA9PSBDdXJyVikgJiYgIlRoZSB0eXBlc3RhdGUgKm11c3QqIGhhdmUgY2hhbmdlZC4iKTsKKyAgICAgIGFzc2VydCghUHJldlYuaGFzU2FtZVN0YXRlKEN1cnJWKSAmJiAiVGhlIHN0YXRlIHNob3VsZCBoYXZlIGNoYW5nZWQuIik7CiAgICAgICAvLyBXZSBtYXkgbm90IGhhdmUgdHJhbnNpdGlvbmVkIHRvICdyZWxlYXNlJyBpZiB3ZSBoaXQgYW4gZXJyb3IuCiAgICAgICAvLyBUaGlzIGNhc2UgaXMgaGFuZGxlZCBlbHNld2hlcmUuCiAgICAgICBpZiAoQ3VyclYuZ2V0S2luZCgpID09IFJlZlZhbDo6UmVsZWFzZWQpIHsKQEAgLTE5MzksNyArMjAxMiw3IEBACiAKICAgICAgIGlmIChHQ0VuYWJsZWQpIHsKICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBvYmplY3QncyByZWZlcmVuY2UgY291bnQgd2FzIHB1c2hlZCB0byB6ZXJvLgotICAgICAgICBhc3NlcnQoIShQcmV2ViA9PSBDdXJyVikgJiYgIlRoZSB0eXBlc3RhdGUgKm11c3QqIGhhdmUgY2hhbmdlZC4iKTsKKyAgICAgICAgYXNzZXJ0KCFQcmV2Vi5oYXNTYW1lU3RhdGUoQ3VyclYpICYmICJUaGUgc3RhdGUgc2hvdWxkIGhhdmUgY2hhbmdlZC4iKTsKIAogICAgICAgICBvcyA8PCAiSW4gR0MgbW9kZSBhIGNhbGwgdG8gJyIgPDwgKkZECiAgICAgICAgIDw8ICAiJyBkZWNyZW1lbnRzIGFuIG9iamVjdCdzIHJldGFpbiBjb3VudCBhbmQgcmVnaXN0ZXJzIHRoZSAiCkBAIC0xOTY0LDcgKzIwMzcsNyBAQAogICAgIH0KIAogICAgIC8vIERldGVybWluZSBpZiB0aGUgdHlwZXN0YXRlIGhhcyBjaGFuZ2VkLgotICAgIGlmICghKFByZXZWID09IEN1cnJWKSkKKyAgICBpZiAoIVByZXZWLmhhc1NhbWVTdGF0ZShDdXJyVikpCiAgICAgICBzd2l0Y2ggKEN1cnJWLmdldEtpbmQoKSkgewogICAgICAgICBjYXNlIFJlZlZhbDo6T3duZWQ6CiAgICAgICAgIGNhc2UgUmVmVmFsOjpOb3RPd25lZDoKQEAgLTIyMTIsOSArMjI4NSw5IEBACiAgICAgb3MgPDwgKGlzYTxPYmpDTWV0aG9kRGVjbD4oRCkgPyAiIGlzIHJldHVybmVkIGZyb20gYSBtZXRob2QgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiBpcyByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24gIik7CiAgICAgCi0gICAgaWYgKEQtPmdldEF0dHI8Q0ZSZXR1cm5zTm90UmV0YWluZWRBdHRyPigpKQorICAgIGlmIChELT5oYXNBdHRyPENGUmV0dXJuc05vdFJldGFpbmVkQXR0cj4oKSkKICAgICAgIG9zIDw8ICJ0aGF0IGlzIGFubm90YXRlZCBhcyBDRl9SRVRVUk5TX05PVF9SRVRBSU5FRCI7Ci0gICAgZWxzZSBpZiAoRC0+Z2V0QXR0cjxOU1JldHVybnNOb3RSZXRhaW5lZEF0dHI+KCkpCisgICAgZWxzZSBpZiAoRC0+aGFzQXR0cjxOU1JldHVybnNOb3RSZXRhaW5lZEF0dHI+KCkpCiAgICAgICBvcyA8PCAidGhhdCBpcyBhbm5vdGF0ZWQgYXMgTlNfUkVUVVJOU19OT1RfUkVUQUlORUQiOwogICAgIGVsc2UgewogICAgICAgaWYgKGNvbnN0IE9iakNNZXRob2REZWNsICpNRCA9IGR5bl9jYXN0PE9iakNNZXRob2REZWNsPihEKSkgewpAQCAtMjMyOCwyNCArMjQwMSwyNSBAQAogICAgICAgICAgICAgICAgICAgICBjaGVjazo6UG9zdFN0bXQ8T2JqQ0FycmF5TGl0ZXJhbD4sCiAgICAgICAgICAgICAgICAgICAgIGNoZWNrOjpQb3N0U3RtdDxPYmpDRGljdGlvbmFyeUxpdGVyYWw+LAogICAgICAgICAgICAgICAgICAgICBjaGVjazo6UG9zdFN0bXQ8T2JqQ0JveGVkRXhwcj4sCisgICAgICAgICAgICAgICAgICAgIGNoZWNrOjpQb3N0U3RtdDxPYmpDSXZhclJlZkV4cHI+LAogICAgICAgICAgICAgICAgICAgICBjaGVjazo6UG9zdENhbGwsCiAgICAgICAgICAgICAgICAgICAgIGNoZWNrOjpQcmVTdG10PFJldHVyblN0bXQ+LAogICAgICAgICAgICAgICAgICAgICBjaGVjazo6UmVnaW9uQ2hhbmdlcywKICAgICAgICAgICAgICAgICAgICAgZXZhbDo6QXNzdW1lLAogICAgICAgICAgICAgICAgICAgICBldmFsOjpDYWxsID4gewotICBtdXRhYmxlIE93bmluZ1B0cjxDRlJlZkJ1Zz4gdXNlQWZ0ZXJSZWxlYXNlLCByZWxlYXNlTm90T3duZWQ7Ci0gIG11dGFibGUgT3duaW5nUHRyPENGUmVmQnVnPiBkZWFsbG9jR0MsIGRlYWxsb2NOb3RPd25lZDsKLSAgbXV0YWJsZSBPd25pbmdQdHI8Q0ZSZWZCdWc+IG92ZXJBdXRvcmVsZWFzZSwgcmV0dXJuTm90T3duZWRGb3JPd25lZDsKLSAgbXV0YWJsZSBPd25pbmdQdHI8Q0ZSZWZCdWc+IGxlYWtXaXRoaW5GdW5jdGlvbiwgbGVha0F0UmV0dXJuOwotICBtdXRhYmxlIE93bmluZ1B0cjxDRlJlZkJ1Zz4gbGVha1dpdGhpbkZ1bmN0aW9uR0MsIGxlYWtBdFJldHVybkdDOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxDRlJlZkJ1Zz4gdXNlQWZ0ZXJSZWxlYXNlLCByZWxlYXNlTm90T3duZWQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPENGUmVmQnVnPiBkZWFsbG9jR0MsIGRlYWxsb2NOb3RPd25lZDsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8Q0ZSZWZCdWc+IG92ZXJBdXRvcmVsZWFzZSwgcmV0dXJuTm90T3duZWRGb3JPd25lZDsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8Q0ZSZWZCdWc+IGxlYWtXaXRoaW5GdW5jdGlvbiwgbGVha0F0UmV0dXJuOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxDRlJlZkJ1Zz4gbGVha1dpdGhpbkZ1bmN0aW9uR0MsIGxlYWtBdFJldHVybkdDOwogCi0gIHR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8U3ltYm9sUmVmLCBjb25zdCBTaW1wbGVQcm9ncmFtUG9pbnRUYWcgKj4gU3ltYm9sVGFnTWFwOworICB0eXBlZGVmIGxsdm06OkRlbnNlTWFwPFN5bWJvbFJlZiwgY29uc3QgQ2hlY2tlclByb2dyYW1Qb2ludFRhZyAqPiBTeW1ib2xUYWdNYXA7CiAKICAgLy8gVGhpcyBtYXAgaXMgb25seSB1c2VkIHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgYW55IGFsbG9jYXRlZCB0YWdzLgogICBtdXRhYmxlIFN5bWJvbFRhZ01hcCBEZWFkU3ltYm9sVGFnczsKIAotICBtdXRhYmxlIE93bmluZ1B0cjxSZXRhaW5TdW1tYXJ5TWFuYWdlcj4gU3VtbWFyaWVzOwotICBtdXRhYmxlIE93bmluZ1B0cjxSZXRhaW5TdW1tYXJ5TWFuYWdlcj4gU3VtbWFyaWVzR0M7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPFJldGFpblN1bW1hcnlNYW5hZ2VyPiBTdW1tYXJpZXM7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPFJldGFpblN1bW1hcnlNYW5hZ2VyPiBTdW1tYXJpZXNHQzsKICAgbXV0YWJsZSBTdW1tYXJ5TG9nVHkgU3VtbWFyeUxvZzsKICAgbXV0YWJsZSBib29sIFNob3VsZFJlc2V0U3VtbWFyeUxvZzsKIApAQCAtMjQwMiwxNyArMjQ3NiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgR0NFbmFibGVkKSBjb25zdCB7CiAgICAgaWYgKEdDRW5hYmxlZCkgewogICAgICAgaWYgKCFsZWFrV2l0aGluRnVuY3Rpb25HQykKLSAgICAgICAgbGVha1dpdGhpbkZ1bmN0aW9uR0MucmVzZXQobmV3IExlYWsoIkxlYWsgb2Ygb2JqZWN0IHdoZW4gdXNpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdhcmJhZ2UgY29sbGVjdGlvbiIpKTsKKyAgICAgICAgbGVha1dpdGhpbkZ1bmN0aW9uR0MucmVzZXQobmV3IExlYWsodGhpcywgIkxlYWsgb2Ygb2JqZWN0IHdoZW4gdXNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2FyYmFnZSBjb2xsZWN0aW9uIikpOwogICAgICAgcmV0dXJuIGxlYWtXaXRoaW5GdW5jdGlvbkdDLmdldCgpOwogICAgIH0gZWxzZSB7CiAgICAgICBpZiAoIWxlYWtXaXRoaW5GdW5jdGlvbikgewogICAgICAgICBpZiAoTE9wdHMuZ2V0R0MoKSA9PSBMYW5nT3B0aW9uczo6SHlicmlkR0MpIHsKLSAgICAgICAgICBsZWFrV2l0aGluRnVuY3Rpb24ucmVzZXQobmV3IExlYWsoIkxlYWsgb2Ygb2JqZWN0IHdoZW4gbm90IHVzaW5nICIKKyAgICAgICAgICBsZWFrV2l0aGluRnVuY3Rpb24ucmVzZXQobmV3IExlYWsodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlYWsgb2Ygb2JqZWN0IHdoZW4gbm90IHVzaW5nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdhcmJhZ2UgY29sbGVjdGlvbiAoR0MpIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1YWwgR0Mvbm9uLUdDIGNvZGUiKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbGVha1dpdGhpbkZ1bmN0aW9uLnJlc2V0KG5ldyBMZWFrKCJMZWFrIikpOworICAgICAgICAgIGxlYWtXaXRoaW5GdW5jdGlvbi5yZXNldChuZXcgTGVhayh0aGlzLCAiTGVhayIpKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgcmV0dXJuIGxlYWtXaXRoaW5GdW5jdGlvbi5nZXQoKTsKQEAgLTI0MjIsMTcgKzI0OTcsMTkgQEAKICAgQ0ZSZWZCdWcgKmdldExlYWtBdFJldHVybkJ1Zyhjb25zdCBMYW5nT3B0aW9ucyAmTE9wdHMsIGJvb2wgR0NFbmFibGVkKSBjb25zdCB7CiAgICAgaWYgKEdDRW5hYmxlZCkgewogICAgICAgaWYgKCFsZWFrQXRSZXR1cm5HQykKLSAgICAgICAgbGVha0F0UmV0dXJuR0MucmVzZXQobmV3IExlYWsoIkxlYWsgb2YgcmV0dXJuZWQgb2JqZWN0IHdoZW4gdXNpbmcgIgorICAgICAgICBsZWFrQXRSZXR1cm5HQy5yZXNldChuZXcgTGVhayh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGVhayBvZiByZXR1cm5lZCBvYmplY3Qgd2hlbiB1c2luZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnYXJiYWdlIGNvbGxlY3Rpb24iKSk7CiAgICAgICByZXR1cm4gbGVha0F0UmV0dXJuR0MuZ2V0KCk7CiAgICAgfSBlbHNlIHsKICAgICAgIGlmICghbGVha0F0UmV0dXJuKSB7CiAgICAgICAgIGlmIChMT3B0cy5nZXRHQygpID09IExhbmdPcHRpb25zOjpIeWJyaWRHQykgewotICAgICAgICAgIGxlYWtBdFJldHVybi5yZXNldChuZXcgTGVhaygiTGVhayBvZiByZXR1cm5lZCBvYmplY3Qgd2hlbiBub3QgdXNpbmcgIgorICAgICAgICAgIGxlYWtBdFJldHVybi5yZXNldChuZXcgTGVhayh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGVhayBvZiByZXR1cm5lZCBvYmplY3Qgd2hlbiBub3QgdXNpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2FyYmFnZSBjb2xsZWN0aW9uIChHQykgaW4gZHVhbCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHQy9ub24tR0MgY29kZSIpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBsZWFrQXRSZXR1cm4ucmVzZXQobmV3IExlYWsoIkxlYWsgb2YgcmV0dXJuZWQgb2JqZWN0IikpOworICAgICAgICAgIGxlYWtBdFJldHVybi5yZXNldChuZXcgTGVhayh0aGlzLCAiTGVhayBvZiByZXR1cm5lZCBvYmplY3QiKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHJldHVybiBsZWFrQXRSZXR1cm4uZ2V0KCk7CkBAIC0yNDY0LDcgKzI1NDEsNyBAQAogICB9CiAKICAgdm9pZCBwcmludFN0YXRlKHJhd19vc3RyZWFtICZPdXQsIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5MLCBjb25zdCBjaGFyICpTZXApIGNvbnN0OworICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqTkwsIGNvbnN0IGNoYXIgKlNlcCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgdm9pZCBjaGVja0JpbmQoU1ZhbCBsb2MsIFNWYWwgdmFsLCBjb25zdCBTdG10ICpTLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CiAgIHZvaWQgY2hlY2tQb3N0U3RtdChjb25zdCBCbG9ja0V4cHIgKkJFLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CkBAIC0yNDc0LDYgKzI1NTEsOCBAQAogICB2b2lkIGNoZWNrUG9zdFN0bXQoY29uc3QgT2JqQ0RpY3Rpb25hcnlMaXRlcmFsICpETCwgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwogICB2b2lkIGNoZWNrUG9zdFN0bXQoY29uc3QgT2JqQ0JveGVkRXhwciAqQkUsIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdDsKIAorICB2b2lkIGNoZWNrUG9zdFN0bXQoY29uc3QgT2JqQ0l2YXJSZWZFeHByICpJUkUsIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdDsKKwogICB2b2lkIGNoZWNrUG9zdENhbGwoY29uc3QgQ2FsbEV2ZW50ICZDYWxsLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgCiAgIHZvaWQgY2hlY2tTdW1tYXJ5KGNvbnN0IFJldGFpblN1bW1hcnkgJlN1bW0sIGNvbnN0IENhbGxFdmVudCAmQ2FsbCwKQEAgLTI1NDIsNyArMjYyMSw3IEBACiAgIFN0b3BUcmFja2luZ0NhbGxiYWNrKFByb2dyYW1TdGF0ZVJlZiBzdCkgOiBzdGF0ZShzdCkge30KICAgUHJvZ3JhbVN0YXRlUmVmIGdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gc3RhdGU7IH0KIAotICBib29sIFZpc2l0U3ltYm9sKFN5bWJvbFJlZiBzeW0pIHsKKyAgYm9vbCBWaXNpdFN5bWJvbChTeW1ib2xSZWYgc3ltKSBvdmVycmlkZSB7CiAgICAgc3RhdGUgPSBzdGF0ZS0+cmVtb3ZlPFJlZkJpbmRpbmdzPihzeW0pOwogICAgIHJldHVybiB0cnVlOwogICB9CkBAIC0yNjkxLDYgKzI3NzAsMjAgQEAKICAgQy5hZGRUcmFuc2l0aW9uKFN0YXRlKTsKIH0KIAordm9pZCBSZXRhaW5Db3VudENoZWNrZXI6OmNoZWNrUG9zdFN0bXQoY29uc3QgT2JqQ0l2YXJSZWZFeHByICpJUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja2VyQ29udGV4dCAmQykgY29uc3QgeworICBQcm9ncmFtU3RhdGVSZWYgU3RhdGUgPSBDLmdldFN0YXRlKCk7CisgIC8vIElmIGFuIGluc3RhbmNlIHZhcmlhYmxlIHdhcyBwcmV2aW91c2x5IGFjY2Vzc2VkIHRocm91Z2ggYSBwcm9wZXJ0eSwKKyAgLy8gaXQgbWF5IGhhdmUgYSBzeW50aGVzaXplZCByZWZjb3VudCBvZiArMC4gT3ZlcnJpZGUgcmlnaHQgbm93IHRoYXQgd2UncmUKKyAgLy8gZG9pbmcgZGlyZWN0IGFjY2Vzcy4KKyAgaWYgKE9wdGlvbmFsPExvYz4gSVZhckxvYyA9IEMuZ2V0U1ZhbChJUkUpLmdldEFzPExvYz4oKSkKKyAgICBpZiAoU3ltYm9sUmVmIFN5bSA9IFN0YXRlLT5nZXRTVmFsKCpJVmFyTG9jKS5nZXRBc1N5bWJvbCgpKQorICAgICAgaWYgKGNvbnN0IFJlZlZhbCAqUlYgPSBnZXRSZWZCaW5kaW5nKFN0YXRlLCBTeW0pKQorICAgICAgICBpZiAoUlYtPmlzT3ZlcnJpZGFibGUoKSkKKyAgICAgICAgICBTdGF0ZSA9IHJlbW92ZVJlZkJpbmRpbmcoU3RhdGUsIFN5bSk7CisgIEMuYWRkVHJhbnNpdGlvbihTdGF0ZSk7Cit9CisKIHZvaWQgUmV0YWluQ291bnRDaGVja2VyOjpjaGVja1Bvc3RDYWxsKGNvbnN0IENhbGxFdmVudCAmQ2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdCB7CiAgIFJldGFpblN1bW1hcnlNYW5hZ2VyICZTdW1tYXJpZXMgPSBnZXRTdW1tYXJ5TWFuYWdlcihDKTsKQEAgLTI3MzEsNiArMjgyNCwxNiBAQAogICByZXR1cm4gUmV0VHk7CiB9CiAKK3N0YXRpYyBib29sIHdhc1N5bnRoZXNpemVkUHJvcGVydHkoY29uc3QgT2JqQ01ldGhvZENhbGwgKkNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqTikgeworICBpZiAoIUNhbGwgfHwgIUNhbGwtPmdldERlY2woKS0+aXNQcm9wZXJ0eUFjY2Vzc29yKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENhbGxFeGl0RW5kIFBQID0gTi0+Z2V0TG9jYXRpb24oKS5jYXN0QXM8Q2FsbEV4aXRFbmQ+KCk7CisgIGNvbnN0IFN0YWNrRnJhbWVDb250ZXh0ICpGcmFtZSA9IFBQLmdldENhbGxlZUNvbnRleHQoKTsKKyAgcmV0dXJuIEZyYW1lLT5nZXRBbmFseXNpc0RlY2xDb250ZXh0KCktPmlzQm9keUF1dG9zeW50aGVzaXplZCgpOworfQorCiAvLyBXZSBkb24ndCBhbHdheXMgZ2V0IHRoZSBleGFjdCBtb2RlbGluZyBvZiB0aGUgZnVuY3Rpb24gd2l0aCByZWdhcmRzIHRvIHRoZQogLy8gcmV0YWluIGNvdW50IGNoZWNrZXIgZXZlbiB3aGVuIHRoZSBmdW5jdGlvbiBpcyBpbmxpbmVkLiBGb3IgZXhhbXBsZSwgd2UgbmVlZAogLy8gdG8gc3RvcCB0cmFja2luZyB0aGUgc3ltYm9scyB3aGljaCB3ZXJlIG1hcmtlZCB3aXRoIFN0b3BUcmFja2luZ0hhcmQuCkBAIC0yNzY1LDYgKzI4NjgsMTkgQEAKICAgICBTeW1ib2xSZWYgU3ltID0gQ2FsbE9yTXNnLmdldFJldHVyblZhbHVlKCkuZ2V0QXNTeW1ib2woKTsKICAgICBpZiAoU3ltKQogICAgICAgc3RhdGUgPSByZW1vdmVSZWZCaW5kaW5nKHN0YXRlLCBTeW0pOworICB9IGVsc2UgaWYgKFJFLmdldEtpbmQoKSA9PSBSZXRFZmZlY3Q6Ok5vdE93bmVkU3ltYm9sKSB7CisgICAgaWYgKHdhc1N5bnRoZXNpemVkUHJvcGVydHkoTXNnSW52b2NhdGlvbiwgQy5nZXRQcmVkZWNlc3NvcigpKSkgeworICAgICAgLy8gQmVsaWV2ZSB0aGUgc3VtbWFyeSBpZiB3ZSBzeW50aGVzaXplZCB0aGUgYm9keSBvZiBhIHByb3BlcnR5IGdldHRlcgorICAgICAgLy8gYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgY3VycmVudGx5IHVudHJhY2tlZC4gSWYgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgIC8vIGluc3RhbmNlIHZhcmlhYmxlIGlzIGxhdGVyIGFjY2Vzc2VkIGRpcmVjdGx5LCBob3dldmVyLCB3ZSdyZSBnb2luZyB0bworICAgICAgLy8gd2FudCB0byBvdmVycmlkZSB0aGlzIHN0YXRlLCBzbyB0aGF0IHRoZSBvd25pbmcgb2JqZWN0IGNhbiBwZXJmb3JtCisgICAgICAvLyByZWZlcmVuY2UgY291bnRpbmcgb3BlcmF0aW9ucyBvbiBpdHMgb3duIGl2YXJzLgorICAgICAgU3ltYm9sUmVmIFN5bSA9IENhbGxPck1zZy5nZXRSZXR1cm5WYWx1ZSgpLmdldEFzU3ltYm9sKCk7CisgICAgICBpZiAoU3ltICYmICFnZXRSZWZCaW5kaW5nKHN0YXRlLCBTeW0pKQorICAgICAgICBzdGF0ZSA9IHNldFJlZkJpbmRpbmcoc3RhdGUsIFN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZlZhbDo6bWFrZU92ZXJyaWRhYmxlTm90T3duZWQoUkUuZ2V0T2JqS2luZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW0tPmdldFR5cGUoKSkpOworICAgIH0KICAgfQogICAKICAgQy5hZGRUcmFuc2l0aW9uKHN0YXRlKTsKQEAgLTI4NTcsNyArMjk3Myw2IEBACiAgICAgfQogCiAgICAgY2FzZSBSZXRFZmZlY3Q6OkdDTm90T3duZWRTeW1ib2w6Ci0gICAgY2FzZSBSZXRFZmZlY3Q6OkFSQ05vdE93bmVkU3ltYm9sOgogICAgIGNhc2UgUmV0RWZmZWN0OjpOb3RPd25lZFN5bWJvbDogewogICAgICAgY29uc3QgRXhwciAqRXggPSBDYWxsT3JNc2cuZ2V0T3JpZ2luRXhwcigpOwogICAgICAgU3ltYm9sUmVmIFN5bSA9IENhbGxPck1zZy5nZXRSZXR1cm5WYWx1ZSgpLmdldEFzU3ltYm9sKCk7CkBAIC0zMDUzLDIyICszMTY4LDIyIEBACiAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgZXJyb3IuIik7CiAgICAgY2FzZSBSZWZWYWw6OkVycm9yVXNlQWZ0ZXJSZWxlYXNlOgogICAgICAgaWYgKCF1c2VBZnRlclJlbGVhc2UpCi0gICAgICAgIHVzZUFmdGVyUmVsZWFzZS5yZXNldChuZXcgVXNlQWZ0ZXJSZWxlYXNlKCkpOworICAgICAgICB1c2VBZnRlclJlbGVhc2UucmVzZXQobmV3IFVzZUFmdGVyUmVsZWFzZSh0aGlzKSk7CiAgICAgICBCVCA9ICYqdXNlQWZ0ZXJSZWxlYXNlOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBSZWZWYWw6OkVycm9yUmVsZWFzZU5vdE93bmVkOgogICAgICAgaWYgKCFyZWxlYXNlTm90T3duZWQpCi0gICAgICAgIHJlbGVhc2VOb3RPd25lZC5yZXNldChuZXcgQmFkUmVsZWFzZSgpKTsKKyAgICAgICAgcmVsZWFzZU5vdE93bmVkLnJlc2V0KG5ldyBCYWRSZWxlYXNlKHRoaXMpKTsKICAgICAgIEJUID0gJipyZWxlYXNlTm90T3duZWQ7CiAgICAgICBicmVhazsKICAgICBjYXNlIFJlZlZhbDo6RXJyb3JEZWFsbG9jR0M6CiAgICAgICBpZiAoIWRlYWxsb2NHQykKLSAgICAgICAgZGVhbGxvY0dDLnJlc2V0KG5ldyBEZWFsbG9jR0MoKSk7CisgICAgICAgIGRlYWxsb2NHQy5yZXNldChuZXcgRGVhbGxvY0dDKHRoaXMpKTsKICAgICAgIEJUID0gJipkZWFsbG9jR0M7CiAgICAgICBicmVhazsKICAgICBjYXNlIFJlZlZhbDo6RXJyb3JEZWFsbG9jTm90T3duZWQ6CiAgICAgICBpZiAoIWRlYWxsb2NOb3RPd25lZCkKLSAgICAgICAgZGVhbGxvY05vdE93bmVkLnJlc2V0KG5ldyBEZWFsbG9jTm90T3duZWQoKSk7CisgICAgICAgIGRlYWxsb2NOb3RPd25lZC5yZXNldChuZXcgRGVhbGxvY05vdE93bmVkKHRoaXMpKTsKICAgICAgIEJUID0gJipkZWFsbG9jTm90T3duZWQ7CiAgICAgICBicmVhazsKICAgfQpAQCAtMzIzMiw4ICszMzQ3LDcgQEAKICAgICByZXR1cm47CiAKICAgLy8gVXBkYXRlIHRoZSBhdXRvcmVsZWFzZSBjb3VudHMuCi0gIHN0YXRpYyBTaW1wbGVQcm9ncmFtUG9pbnRUYWcKLSAgICAgICAgIEF1dG9yZWxlYXNlVGFnKCJSZXRhaW5Db3VudENoZWNrZXIgOiBBdXRvcmVsZWFzZSIpOworICBzdGF0aWMgQ2hlY2tlclByb2dyYW1Qb2ludFRhZyBBdXRvcmVsZWFzZVRhZyh0aGlzLCAiQXV0b3JlbGVhc2UiKTsKICAgc3RhdGUgPSBoYW5kbGVBdXRvcmVsZWFzZUNvdW50cyhzdGF0ZSwgUHJlZCwgJkF1dG9yZWxlYXNlVGFnLCBDLCBTeW0sIFgpOwogCiAgIC8vIERpZCB3ZSBjYWNoZSBvdXQ/CkBAIC0zMjk0LDggKzM0MDgsNyBAQAogICAgICAgICAvLyBHZW5lcmF0ZSBhbiBlcnJvciBub2RlLgogICAgICAgICBzdGF0ZSA9IHNldFJlZkJpbmRpbmcoc3RhdGUsIFN5bSwgWCk7CiAKLSAgICAgICAgc3RhdGljIFNpbXBsZVByb2dyYW1Qb2ludFRhZwotICAgICAgICAgICAgICAgUmV0dXJuT3duTGVha1RhZygiUmV0YWluQ291bnRDaGVja2VyIDogUmV0dXJuc093bkxlYWsiKTsKKyAgICAgICAgc3RhdGljIENoZWNrZXJQcm9ncmFtUG9pbnRUYWcgUmV0dXJuT3duTGVha1RhZyh0aGlzLCAiUmV0dXJuc093bkxlYWsiKTsKICAgICAgICAgRXhwbG9kZWROb2RlICpOID0gQy5hZGRUcmFuc2l0aW9uKHN0YXRlLCBQcmVkLCAmUmV0dXJuT3duTGVha1RhZyk7CiAgICAgICAgIGlmIChOKSB7CiAgICAgICAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxPcHRzID0gQy5nZXRBU1RDb250ZXh0KCkuZ2V0TGFuZ09wdHMoKTsKQEAgLTMzMTUsMTIgKzM0MjgsMTIgQEAKICAgICAgIC8vIG93bmVkIG9iamVjdC4KICAgICAgIHN0YXRlID0gc2V0UmVmQmluZGluZyhzdGF0ZSwgU3ltLCBYIF4gUmVmVmFsOjpFcnJvclJldHVybmVkTm90T3duZWQpOwogCi0gICAgICBzdGF0aWMgU2ltcGxlUHJvZ3JhbVBvaW50VGFnCi0gICAgICAgICAgICAgUmV0dXJuTm90T3duZWRUYWcoIlJldGFpbkNvdW50Q2hlY2tlciA6IFJldHVybk5vdE93bmVkRm9yT3duZWQiKTsKKyAgICAgIHN0YXRpYyBDaGVja2VyUHJvZ3JhbVBvaW50VGFnIFJldHVybk5vdE93bmVkVGFnKHRoaXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldHVybk5vdE93bmVkRm9yT3duZWQiKTsKICAgICAgIEV4cGxvZGVkTm9kZSAqTiA9IEMuYWRkVHJhbnNpdGlvbihzdGF0ZSwgUHJlZCwgJlJldHVybk5vdE93bmVkVGFnKTsKICAgICAgIGlmIChOKSB7CiAgICAgICAgIGlmICghcmV0dXJuTm90T3duZWRGb3JPd25lZCkKLSAgICAgICAgICByZXR1cm5Ob3RPd25lZEZvck93bmVkLnJlc2V0KG5ldyBSZXR1cm5lZE5vdE93bmVkRm9yT3duZWQoKSk7CisgICAgICAgICAgcmV0dXJuTm90T3duZWRGb3JPd25lZC5yZXNldChuZXcgUmV0dXJuZWROb3RPd25lZEZvck93bmVkKHRoaXMpKTsKIAogICAgICAgICBDRlJlZlJlcG9ydCAqcmVwb3J0ID0KICAgICAgICAgICAgIG5ldyBDRlJlZlJlcG9ydCgqcmV0dXJuTm90T3duZWRGb3JPd25lZCwKQEAgLTMzNzUsNyArMzQ4OCw3IEBACiAgIC8vIGZhbHNlIHBvc2l0aXZlcy4KICAgaWYgKGNvbnN0IFZhclJlZ2lvbiAqTFZSID0gZHluX2Nhc3Rfb3JfbnVsbDxWYXJSZWdpb24+KGxvYy5nZXRBc1JlZ2lvbigpKSkgewogICAgIGNvbnN0IFZhckRlY2wgKlZEID0gTFZSLT5nZXREZWNsKCk7Ci0gICAgaWYgKFZELT5nZXRBdHRyPENsZWFudXBBdHRyPigpKSB7CisgICAgaWYgKFZELT5oYXNBdHRyPENsZWFudXBBdHRyPigpKSB7CiAgICAgICBlc2NhcGVzID0gdHJ1ZTsKICAgICB9CiAgIH0KQEAgLTM1MDgsNyArMzYyMSw3IEBACiAgICAgb3MgPDwgImhhcyBhICsiIDw8IFYuZ2V0Q291bnQoKSA8PCAiIHJldGFpbiBjb3VudCI7CiAKICAgICBpZiAoIW92ZXJBdXRvcmVsZWFzZSkKLSAgICAgIG92ZXJBdXRvcmVsZWFzZS5yZXNldChuZXcgT3ZlckF1dG9yZWxlYXNlKCkpOworICAgICAgb3ZlckF1dG9yZWxlYXNlLnJlc2V0KG5ldyBPdmVyQXV0b3JlbGVhc2UodGhpcykpOwogCiAgICAgY29uc3QgTGFuZ09wdGlvbnMgJkxPcHRzID0gQ3R4LmdldEFTVENvbnRleHQoKS5nZXRMYW5nT3B0cygpOwogICAgIENGUmVmUmVwb3J0ICpyZXBvcnQgPQpAQCAtMzYwMiwxMyArMzcxNSwxMyBAQAogCiBjb25zdCBQcm9ncmFtUG9pbnRUYWcgKgogUmV0YWluQ291bnRDaGVja2VyOjpnZXREZWFkU3ltYm9sVGFnKFN5bWJvbFJlZiBzeW0pIGNvbnN0IHsKLSAgY29uc3QgU2ltcGxlUHJvZ3JhbVBvaW50VGFnIComdGFnID0gRGVhZFN5bWJvbFRhZ3Nbc3ltXTsKKyAgY29uc3QgQ2hlY2tlclByb2dyYW1Qb2ludFRhZyAqJnRhZyA9IERlYWRTeW1ib2xUYWdzW3N5bV07CiAgIGlmICghdGFnKSB7CiAgICAgU21hbGxTdHJpbmc8NjQ+IGJ1ZjsKICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG91dChidWYpOwotICAgIG91dCA8PCAiUmV0YWluQ291bnRDaGVja2VyIDogRGVhZCBTeW1ib2wgOiAiOworICAgIG91dCA8PCAiRGVhZCBTeW1ib2wgOiAiOwogICAgIHN5bS0+ZHVtcFRvU3RyZWFtKG91dCk7Ci0gICAgdGFnID0gbmV3IFNpbXBsZVByb2dyYW1Qb2ludFRhZyhvdXQuc3RyKCkpOworICAgIHRhZyA9IG5ldyBDaGVja2VyUHJvZ3JhbVBvaW50VGFnKHRoaXMsIG91dC5zdHIoKSk7CiAgIH0KICAgcmV0dXJuIHRhZzsgIAogfQpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1JldHVyblBvaW50ZXJSYW5nZUNoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1JldHVyblBvaW50ZXJSYW5nZUNoZWNrZXIuY3BwCmluZGV4IGZlMjUzYjcuLmIxY2RlNmIgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9SZXR1cm5Qb2ludGVyUmFuZ2VDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvUmV0dXJuUG9pbnRlclJhbmdlQ2hlY2tlci5jcHAKQEAgLTI1LDcgKzI1LDggQEAKIG5hbWVzcGFjZSB7CiBjbGFzcyBSZXR1cm5Qb2ludGVyUmFuZ2VDaGVja2VyIDogCiAgICAgcHVibGljIENoZWNrZXI8IGNoZWNrOjpQcmVTdG10PFJldHVyblN0bXQ+ID4gewotICBtdXRhYmxlIE93bmluZ1B0cjxCdWlsdGluQnVnPiBCVDsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVpbHRpbkJ1Zz4gQlQ7CisKIHB1YmxpYzoKICAgICB2b2lkIGNoZWNrUHJlU3RtdChjb25zdCBSZXR1cm5TdG10ICpSUywgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwogfTsKQEAgLTY5LDkgKzcwLDEwIEBACiAgICAgLy8gRklYTUU6IFRoaXMgYnVnIGNvcnJlc3BvbmQgdG8gQ1dFLTQ2Ni4gIEV2ZW50dWFsbHkgd2Ugc2hvdWxkIGhhdmUgYnVnCiAgICAgLy8gdHlwZXMgZXhwbGljaXRseSByZWZlcmVuY2Ugc3VjaCBleHBsb2l0IGNhdGVnb3JpZXMgKHdoZW4gYXBwbGljYWJsZSkuCiAgICAgaWYgKCFCVCkKLSAgICAgIEJULnJlc2V0KG5ldyBCdWlsdGluQnVnKCJSZXR1cm4gb2YgcG9pbnRlciB2YWx1ZSBvdXRzaWRlIG9mIGV4cGVjdGVkIHJhbmdlIiwKLSAgICAgICAgICAgIlJldHVybmVkIHBvaW50ZXIgdmFsdWUgcG9pbnRzIG91dHNpZGUgdGhlIG9yaWdpbmFsIG9iamVjdCAiCi0gICAgICAgICAgICIocG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdykiKSk7CisgICAgICBCVC5yZXNldChuZXcgQnVpbHRpbkJ1ZygKKyAgICAgICAgICB0aGlzLCAiUmV0dXJuIG9mIHBvaW50ZXIgdmFsdWUgb3V0c2lkZSBvZiBleHBlY3RlZCByYW5nZSIsCisgICAgICAgICAgIlJldHVybmVkIHBvaW50ZXIgdmFsdWUgcG9pbnRzIG91dHNpZGUgdGhlIG9yaWdpbmFsIG9iamVjdCAiCisgICAgICAgICAgIihwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93KSIpKTsKIAogICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBuaWNlIHRvIGV2ZW50dWFsbHkgbWFrZSB0aGlzIGRpYWdub3N0aWMgbW9yZSBjbGVhciwKICAgICAvLyBlLmcuLCBieSByZWZlcmVuY2luZyB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24gb3IgYnkgc2F5aW5nICp3aHkqIHRoaXMKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9SZXR1cm5VbmRlZkNoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1JldHVyblVuZGVmQ2hlY2tlci5jcHAKaW5kZXggZWQ5NmM0MC4uYjRkOTJkNiAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1JldHVyblVuZGVmQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1JldHVyblVuZGVmQ2hlY2tlci5jcHAKQEAgLTI1LDggKzI1LDggQEAKIAogbmFtZXNwYWNlIHsKIGNsYXNzIFJldHVyblVuZGVmQ2hlY2tlciA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6UHJlU3RtdDxSZXR1cm5TdG10PiA+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVpbHRpbkJ1Zz4gQlRfVW5kZWY7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1aWx0aW5CdWc+IEJUX051bGxSZWZlcmVuY2U7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1aWx0aW5CdWc+IEJUX1VuZGVmOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWlsdGluQnVnPiBCVF9OdWxsUmVmZXJlbmNlOwogCiAgIHZvaWQgZW1pdFVuZGVmKENoZWNrZXJDb250ZXh0ICZDLCBjb25zdCBFeHByICpSZXRFKSBjb25zdDsKICAgdm9pZCBjaGVja1JlZmVyZW5jZShDaGVja2VyQ29udGV4dCAmQywgY29uc3QgRXhwciAqUmV0RSwKQEAgLTk0LDE2ICs5NCwxNiBAQAogCiB2b2lkIFJldHVyblVuZGVmQ2hlY2tlcjo6ZW1pdFVuZGVmKENoZWNrZXJDb250ZXh0ICZDLCBjb25zdCBFeHByICpSZXRFKSBjb25zdCB7CiAgIGlmICghQlRfVW5kZWYpCi0gICAgQlRfVW5kZWYucmVzZXQobmV3IEJ1aWx0aW5CdWcoIkdhcmJhZ2UgcmV0dXJuIHZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5kZWZpbmVkIG9yIGdhcmJhZ2UgdmFsdWUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIHRvIGNhbGxlciIpKTsKKyAgICBCVF9VbmRlZi5yZXNldCgKKyAgICAgICAgbmV3IEJ1aWx0aW5CdWcodGhpcywgIkdhcmJhZ2UgcmV0dXJuIHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIlVuZGVmaW5lZCBvciBnYXJiYWdlIHZhbHVlIHJldHVybmVkIHRvIGNhbGxlciIpKTsKICAgZW1pdEJ1ZyhDLCAqQlRfVW5kZWYsIFJldEUpOwogfQogCiB2b2lkIFJldHVyblVuZGVmQ2hlY2tlcjo6Y2hlY2tSZWZlcmVuY2UoQ2hlY2tlckNvbnRleHQgJkMsIGNvbnN0IEV4cHIgKlJldEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lZE9yVW5rbm93blNWYWwgUmV0VmFsKSBjb25zdCB7CiAgIFByb2dyYW1TdGF0ZVJlZiBTdE5vbk51bGwsIFN0TnVsbDsKLSAgbGx2bTo6dGllKFN0Tm9uTnVsbCwgU3ROdWxsKSA9IEMuZ2V0U3RhdGUoKS0+YXNzdW1lKFJldFZhbCk7CisgIHN0ZDo6dGllKFN0Tm9uTnVsbCwgU3ROdWxsKSA9IEMuZ2V0U3RhdGUoKS0+YXNzdW1lKFJldFZhbCk7CiAKICAgaWYgKFN0Tm9uTnVsbCkgewogICAgIC8vIEdvaW5nIGZvcndhcmQsIGFzc3VtZSB0aGUgbG9jYXRpb24gaXMgbm9uLW51bGwuCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGtub3duIHRvIGJlIG51bGwuIEVtaXQgYSBidWcgcmVwb3J0LgogICBpZiAoIUJUX051bGxSZWZlcmVuY2UpCi0gICAgQlRfTnVsbFJlZmVyZW5jZS5yZXNldChuZXcgQnVpbHRpbkJ1ZygiUmV0dXJuaW5nIG51bGwgcmVmZXJlbmNlIikpOworICAgIEJUX051bGxSZWZlcmVuY2UucmVzZXQobmV3IEJ1aWx0aW5CdWcodGhpcywgIlJldHVybmluZyBudWxsIHJlZmVyZW5jZSIpKTsKIAogICBlbWl0QnVnKEMsICpCVF9OdWxsUmVmZXJlbmNlLCBSZXRFLCBidWdyZXBvcnRlcjo6Z2V0RGVyZWZFeHByKFJldEUpKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9TaW1wbGVTdHJlYW1DaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9TaW1wbGVTdHJlYW1DaGVja2VyLmNwcAppbmRleCA5Y2EwYWI1Li44M2IxNWVjIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvU2ltcGxlU3RyZWFtQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1NpbXBsZVN0cmVhbUNoZWNrZXIuY3BwCkBAIC01NCw4ICs1NCw4IEBACiAKICAgbXV0YWJsZSBJZGVudGlmaWVySW5mbyAqSUlmb3BlbiwgKklJZmNsb3NlOwogCi0gIE93bmluZ1B0cjxCdWdUeXBlPiBEb3VibGVDbG9zZUJ1Z1R5cGU7Ci0gIE93bmluZ1B0cjxCdWdUeXBlPiBMZWFrQnVnVHlwZTsKKyAgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IERvdWJsZUNsb3NlQnVnVHlwZTsKKyAgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IExlYWtCdWdUeXBlOwogCiAgIHZvaWQgaW5pdElkZW50aWZpZXJJbmZvKEFTVENvbnRleHQgJkN0eCkgY29uc3Q7CiAKQEAgLTk5LDcgKzk5LDcgQEAKICAgU3RvcFRyYWNraW5nQ2FsbGJhY2soUHJvZ3JhbVN0YXRlUmVmIHN0KSA6IHN0YXRlKHN0KSB7fQogICBQcm9ncmFtU3RhdGVSZWYgZ2V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBzdGF0ZTsgfQogCi0gIGJvb2wgVmlzaXRTeW1ib2woU3ltYm9sUmVmIHN5bSkgeworICBib29sIFZpc2l0U3ltYm9sKFN5bWJvbFJlZiBzeW0pIG92ZXJyaWRlIHsKICAgICBzdGF0ZSA9IHN0YXRlLT5yZW1vdmU8U3RyZWFtTWFwPihzeW0pOwogICAgIHJldHVybiB0cnVlOwogICB9CkBAIC0xMDksMTEgKzEwOSwxMSBAQAogCiBTaW1wbGVTdHJlYW1DaGVja2VyOjpTaW1wbGVTdHJlYW1DaGVja2VyKCkgOiBJSWZvcGVuKDApLCBJSWZjbG9zZSgwKSB7CiAgIC8vIEluaXRpYWxpemUgdGhlIGJ1ZyB0eXBlcy4KLSAgRG91YmxlQ2xvc2VCdWdUeXBlLnJlc2V0KG5ldyBCdWdUeXBlKCJEb3VibGUgZmNsb3NlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbml4IFN0cmVhbSBBUEkgRXJyb3IiKSk7CisgIERvdWJsZUNsb3NlQnVnVHlwZS5yZXNldCgKKyAgICAgIG5ldyBCdWdUeXBlKHRoaXMsICJEb3VibGUgZmNsb3NlIiwgIlVuaXggU3RyZWFtIEFQSSBFcnJvciIpKTsKIAotICBMZWFrQnVnVHlwZS5yZXNldChuZXcgQnVnVHlwZSgiUmVzb3VyY2UgTGVhayIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbml4IFN0cmVhbSBBUEkgRXJyb3IiKSk7CisgIExlYWtCdWdUeXBlLnJlc2V0KAorICAgICAgbmV3IEJ1Z1R5cGUodGhpcywgIlJlc291cmNlIExlYWsiLCAiVW5peCBTdHJlYW0gQVBJIEVycm9yIikpOwogICAvLyBTaW5rcyBhcmUgaGlnaGVyIGltcG9ydGFuY2UgYnVncyBhcyB3ZWxsIGFzIGNhbGxzIHRvIGFzc2VydCgpIG9yIGV4aXQoMCkuCiAgIExlYWtCdWdUeXBlLT5zZXRTdXBwcmVzc09uU2luayh0cnVlKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9TdGFja0FkZHJFc2NhcGVDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9TdGFja0FkZHJFc2NhcGVDaGVja2VyLmNwcAppbmRleCA0ZmQ3NzhlLi4zMjdhOWUwIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvU3RhY2tBZGRyRXNjYXBlQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1N0YWNrQWRkckVzY2FwZUNoZWNrZXIuY3BwCkBAIC0yOCw4ICsyOCw4IEBACiBuYW1lc3BhY2UgewogY2xhc3MgU3RhY2tBZGRyRXNjYXBlQ2hlY2tlciA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6UHJlU3RtdDxSZXR1cm5TdG10PiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s6OkVuZEZ1bmN0aW9uID4gewotICBtdXRhYmxlIE93bmluZ1B0cjxCdWlsdGluQnVnPiBCVF9zdGFja2xlYWs7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1aWx0aW5CdWc+IEJUX3JldHVybnN0YWNrOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWlsdGluQnVnPiBCVF9zdGFja2xlYWs7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1aWx0aW5CdWc+IEJUX3JldHVybnN0YWNrOwogCiBwdWJsaWM6CiAgIHZvaWQgY2hlY2tQcmVTdG10KGNvbnN0IFJldHVyblN0bXQgKlJTLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CkBAIC0xMDAsOCArMTAwLDggQEAKICAgICByZXR1cm47CiAKICAgaWYgKCFCVF9yZXR1cm5zdGFjaykKLSAgIEJUX3JldHVybnN0YWNrLnJlc2V0KAotICAgICAgICAgICAgICAgICBuZXcgQnVpbHRpbkJ1ZygiUmV0dXJuIG9mIGFkZHJlc3MgdG8gc3RhY2stYWxsb2NhdGVkIG1lbW9yeSIpKTsKKyAgICBCVF9yZXR1cm5zdGFjay5yZXNldCgKKyAgICAgICAgbmV3IEJ1aWx0aW5CdWcodGhpcywgIlJldHVybiBvZiBhZGRyZXNzIHRvIHN0YWNrLWFsbG9jYXRlZCBtZW1vcnkiKSk7CiAKICAgLy8gR2VuZXJhdGUgYSByZXBvcnQgZm9yIHRoaXMgYnVnLgogICBTbWFsbFN0cmluZzw1MTI+IGJ1ZjsKQEAgLTE3Nyw4ICsxNzcsOCBAQAogICAgIHt9CiAgICAgCiAgICAgYm9vbCBIYW5kbGVCaW5kaW5nKFN0b3JlTWFuYWdlciAmU01nciwgU3RvcmUgc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbVJlZ2lvbiAqcmVnaW9uLCBTVmFsIHZhbCkgewotICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbVJlZ2lvbiAqcmVnaW9uLCBTVmFsIHZhbCkgb3ZlcnJpZGUgeworCiAgICAgICBpZiAoIWlzYTxHbG9iYWxzU3BhY2VSZWdpb24+KHJlZ2lvbi0+Z2V0TWVtb3J5U3BhY2UoKSkpCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgCkBAIC0yMTcsMTEgKzIxNywxMSBAQAogCiAgIGlmICghQlRfc3RhY2tsZWFrKQogICAgIEJUX3N0YWNrbGVhay5yZXNldCgKLSAgICAgIG5ldyBCdWlsdGluQnVnKCJTdGFjayBhZGRyZXNzIHN0b3JlZCBpbnRvIGdsb2JhbCB2YXJpYWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAiU3RhY2sgYWRkcmVzcyB3YXMgc2F2ZWQgaW50byBhIGdsb2JhbCB2YXJpYWJsZS4gIgotICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgZGFuZ2Vyb3VzIGJlY2F1c2UgdGhlIGFkZHJlc3Mgd2lsbCBiZWNvbWUgIgotICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIGZ1bmN0aW9uIikpOwotICAKKyAgICAgICAgbmV3IEJ1aWx0aW5CdWcodGhpcywgIlN0YWNrIGFkZHJlc3Mgc3RvcmVkIGludG8gZ2xvYmFsIHZhcmlhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIlN0YWNrIGFkZHJlc3Mgd2FzIHNhdmVkIGludG8gYSBnbG9iYWwgdmFyaWFibGUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgZGFuZ2Vyb3VzIGJlY2F1c2UgdGhlIGFkZHJlc3Mgd2lsbCBiZWNvbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBhZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgZnVuY3Rpb24iKSk7CisKICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGNiLlYuc2l6ZSgpOyBpICE9IGU7ICsraSkgewogICAgIC8vIEdlbmVyYXRlIGEgcmVwb3J0IGZvciB0aGlzIGJ1Zy4KICAgICBTbWFsbFN0cmluZzw1MTI+IGJ1ZjsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9TdHJlYW1DaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9TdHJlYW1DaGVja2VyLmNwcAppbmRleCBmZmRmMmQ1Li42MDAwOTQyIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvU3RyZWFtQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1N0cmVhbUNoZWNrZXIuY3BwCkBAIC02Miw4ICs2Miw4IEBACiAgICAgICAgICAgICAgICAgICpJSV9md3JpdGUsIAogICAgICAgICAgICAgICAgICAqSUlfZnNlZWssICpJSV9mdGVsbCwgKklJX3Jld2luZCwgKklJX2ZnZXRwb3MsICpJSV9mc2V0cG9zLCAgCiAgICAgICAgICAgICAgICAgICpJSV9jbGVhcmVyciwgKklJX2Zlb2YsICpJSV9mZXJyb3IsICpJSV9maWxlbm87Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1aWx0aW5CdWc+IEJUX251bGxmcCwgQlRfaWxsZWdhbHdoZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfZG91YmxlY2xvc2UsIEJUX1Jlc291cmNlTGVhazsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVpbHRpbkJ1Zz4gQlRfbnVsbGZwLCBCVF9pbGxlZ2Fsd2hlbmNlLAorICAgICAgQlRfZG91YmxlY2xvc2UsIEJUX1Jlc291cmNlTGVhazsKIAogcHVibGljOgogICBTdHJlYW1DaGVja2VyKCkgCkBAIC0yMTgsNyArMjE4LDcgQEAKICAgLy8gQmlmdXJjYXRlIHRoZSBzdGF0ZSBpbnRvIHR3bzogb25lIHdpdGggYSB2YWxpZCBGSUxFKiBwb2ludGVyLCB0aGUgb3RoZXIKICAgLy8gd2l0aCBhIE5VTEwuCiAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZU5vdE51bGwsIHN0YXRlTnVsbDsKLSAgbGx2bTo6dGllKHN0YXRlTm90TnVsbCwgc3RhdGVOdWxsKSA9IENNLmFzc3VtZUR1YWwoc3RhdGUsIFJldFZhbCk7CisgIHN0ZDo6dGllKHN0YXRlTm90TnVsbCwgc3RhdGVOdWxsKSA9IENNLmFzc3VtZUR1YWwoc3RhdGUsIFJldFZhbCk7CiAgIAogICBpZiAoU3ltYm9sUmVmIFN5bSA9IFJldFZhbC5nZXRBc1N5bWJvbCgpKSB7CiAgICAgLy8gaWYgUmV0VmFsIGlzIG5vdCBOVUxMLCBzZXQgdGhlIHN5bWJvbCdzIHN0YXRlIHRvIE9wZW5lZC4KQEAgLTI3MCw5ICsyNzAsMTAgQEAKIAogICBpZiAoRXhwbG9kZWROb2RlICpOID0gQy5hZGRUcmFuc2l0aW9uKHN0YXRlKSkgewogICAgIGlmICghQlRfaWxsZWdhbHdoZW5jZSkKLSAgICAgIEJUX2lsbGVnYWx3aGVuY2UucmVzZXQobmV3IEJ1aWx0aW5CdWcoIklsbGVnYWwgd2hlbmNlIGFyZ3VtZW50IiwKLQkJCQkJIlRoZSB3aGVuY2UgYXJndW1lbnQgdG8gZnNlZWsoKSBzaG91bGQgYmUgIgotCQkJCQkiU0VFS19TRVQsIFNFRUtfRU5ELCBvciBTRUVLX0NVUi4iKSk7CisgICAgICBCVF9pbGxlZ2Fsd2hlbmNlLnJlc2V0KAorICAgICAgICAgIG5ldyBCdWlsdGluQnVnKHRoaXMsICJJbGxlZ2FsIHdoZW5jZSBhcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB3aGVuY2UgYXJndW1lbnQgdG8gZnNlZWsoKSBzaG91bGQgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJTRUVLX1NFVCwgU0VFS19FTkQsIG9yIFNFRUtfQ1VSLiIpKTsKICAgICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVF9pbGxlZ2Fsd2hlbmNlLCAKIAkJCQkgQlRfaWxsZWdhbHdoZW5jZS0+Z2V0RGVzY3JpcHRpb24oKSwgTik7CiAgICAgQy5lbWl0UmVwb3J0KFIpOwpAQCAtMzQzLDEzICszNDQsMTMgQEAKIAogICBDb25zdHJhaW50TWFuYWdlciAmQ00gPSBDLmdldENvbnN0cmFpbnRNYW5hZ2VyKCk7CiAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZU5vdE51bGwsIHN0YXRlTnVsbDsKLSAgbGx2bTo6dGllKHN0YXRlTm90TnVsbCwgc3RhdGVOdWxsKSA9IENNLmFzc3VtZUR1YWwoc3RhdGUsICpEVik7CisgIHN0ZDo6dGllKHN0YXRlTm90TnVsbCwgc3RhdGVOdWxsKSA9IENNLmFzc3VtZUR1YWwoc3RhdGUsICpEVik7CiAKICAgaWYgKCFzdGF0ZU5vdE51bGwgJiYgc3RhdGVOdWxsKSB7CiAgICAgaWYgKEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKHN0YXRlTnVsbCkpIHsKICAgICAgIGlmICghQlRfbnVsbGZwKQotICAgICAgICBCVF9udWxsZnAucmVzZXQobmV3IEJ1aWx0aW5CdWcoIk5VTEwgc3RyZWFtIHBvaW50ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJlYW0gcG9pbnRlciBtaWdodCBiZSBOVUxMLiIpKTsKKyAgICAgICAgQlRfbnVsbGZwLnJlc2V0KG5ldyBCdWlsdGluQnVnKHRoaXMsICJOVUxMIHN0cmVhbSBwb2ludGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJlYW0gcG9pbnRlciBtaWdodCBiZSBOVUxMLiIpKTsKICAgICAgIEJ1Z1JlcG9ydCAqUiA9bmV3IEJ1Z1JlcG9ydCgqQlRfbnVsbGZwLCBCVF9udWxsZnAtPmdldERlc2NyaXB0aW9uKCksIE4pOwogICAgICAgQy5lbWl0UmVwb3J0KFIpOwogICAgIH0KQEAgLTM3OCw5ICszNzksOSBAQAogICAgIEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKCk7CiAgICAgaWYgKE4pIHsKICAgICAgIGlmICghQlRfZG91YmxlY2xvc2UpCi0gICAgICAgIEJUX2RvdWJsZWNsb3NlLnJlc2V0KG5ldyBCdWlsdGluQnVnKCJEb3VibGUgZmNsb3NlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ5IHRvIGNsb3NlIGEgZmlsZSBEZXNjcmlwdG9yIGFscmVhZHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjbG9zZWQuIENhdXNlIHVuZGVmaW5lZCBiZWhhdmlvdXIuIikpOworICAgICAgICBCVF9kb3VibGVjbG9zZS5yZXNldChuZXcgQnVpbHRpbkJ1ZygKKyAgICAgICAgICAgIHRoaXMsICJEb3VibGUgZmNsb3NlIiwgIlRyeSB0byBjbG9zZSBhIGZpbGUgRGVzY3JpcHRvciBhbHJlYWR5IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNsb3NlZC4gQ2F1c2UgdW5kZWZpbmVkIGJlaGF2aW91ci4iKSk7CiAgICAgICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVF9kb3VibGVjbG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfZG91YmxlY2xvc2UtPmdldERlc2NyaXB0aW9uKCksIE4pOwogICAgICAgQy5lbWl0UmVwb3J0KFIpOwpAQCAtNDA3LDggKzQwOCw5IEBACiAgICAgICBFeHBsb2RlZE5vZGUgKk4gPSBDLmdlbmVyYXRlU2luaygpOwogICAgICAgaWYgKE4pIHsKICAgICAgICAgaWYgKCFCVF9SZXNvdXJjZUxlYWspCi0gICAgICAgICAgQlRfUmVzb3VyY2VMZWFrLnJlc2V0KG5ldyBCdWlsdGluQnVnKCJSZXNvdXJjZSBMZWFrIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIk9wZW5lZCBGaWxlIG5ldmVyIGNsb3NlZC4gUG90ZW50aWFsIFJlc291cmNlIGxlYWsuIikpOworICAgICAgICAgIEJUX1Jlc291cmNlTGVhay5yZXNldChuZXcgQnVpbHRpbkJ1ZygKKyAgICAgICAgICAgICAgdGhpcywgIlJlc291cmNlIExlYWsiLAorICAgICAgICAgICAgICAiT3BlbmVkIEZpbGUgbmV2ZXIgY2xvc2VkLiBQb3RlbnRpYWwgUmVzb3VyY2UgbGVhay4iKSk7CiAgICAgICAgIEJ1Z1JlcG9ydCAqUiA9IG5ldyBCdWdSZXBvcnQoKkJUX1Jlc291cmNlTGVhaywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRfUmVzb3VyY2VMZWFrLT5nZXREZXNjcmlwdGlvbigpLCBOKTsKICAgICAgICAgQy5lbWl0UmVwb3J0KFIpOwpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1RhaW50VGVzdGVyQ2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVGFpbnRUZXN0ZXJDaGVja2VyLmNwcAppbmRleCAyNjRmN2Y5Li5kMzNjOTc3IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVGFpbnRUZXN0ZXJDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVGFpbnRUZXN0ZXJDaGVja2VyLmNwcApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIHsKIGNsYXNzIFRhaW50VGVzdGVyQ2hlY2tlciA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6UG9zdFN0bXQ8RXhwcj4gPiB7CiAKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVnVHlwZT4gQlQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUOwogICB2b2lkIGluaXRCdWdUeXBlKCkgY29uc3Q7CiAKICAgLy8vIEdpdmVuIGEgcG9pbnRlciBhcmd1bWVudCwgZ2V0IHRoZSBzeW1ib2wgb2YgdGhlIHZhbHVlIGl0IGNvbnRhaW5zCkBAIC0zOCw3ICszOCw3IEBACiAKIGlubGluZSB2b2lkIFRhaW50VGVzdGVyQ2hlY2tlcjo6aW5pdEJ1Z1R5cGUoKSBjb25zdCB7CiAgIGlmICghQlQpCi0gICAgQlQucmVzZXQobmV3IEJ1Z1R5cGUoIlRhaW50ZWQgZGF0YSIsICJHZW5lcmFsIikpOworICAgIEJULnJlc2V0KG5ldyBCdWdUeXBlKHRoaXMsICJUYWludGVkIGRhdGEiLCAiR2VuZXJhbCIpKTsKIH0KIAogdm9pZCBUYWludFRlc3RlckNoZWNrZXI6OmNoZWNrUG9zdFN0bXQoY29uc3QgRXhwciAqRSwKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9VbmRlZkJyYW5jaENoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VuZGVmQnJhbmNoQ2hlY2tlci5jcHAKaW5kZXggODIzNWU2OC4uMjJlMjE1NSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VuZGVmQnJhbmNoQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VuZGVmQnJhbmNoQ2hlY2tlci5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSB7CiAKIGNsYXNzIFVuZGVmQnJhbmNoQ2hlY2tlciA6IHB1YmxpYyBDaGVja2VyPGNoZWNrOjpCcmFuY2hDb25kaXRpb24+IHsKLSAgbXV0YWJsZSBPd25pbmdQdHI8QnVpbHRpbkJ1Zz4gQlQ7CisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1aWx0aW5CdWc+IEJUOwogCiAgIHN0cnVjdCBGaW5kVW5kZWZFeHByIHsKICAgICBQcm9ncmFtU3RhdGVSZWYgU3Q7CkBAIC02Nyw4ICs2Nyw4IEBACiAgICAgRXhwbG9kZWROb2RlICpOID0gQ3R4LmdlbmVyYXRlU2luaygpOwogICAgIGlmIChOKSB7CiAgICAgICBpZiAoIUJUKQotICAgICAgICBCVC5yZXNldCgKLSAgICAgICAgICAgICAgIG5ldyBCdWlsdGluQnVnKCJCcmFuY2ggY29uZGl0aW9uIGV2YWx1YXRlcyB0byBhIGdhcmJhZ2UgdmFsdWUiKSk7CisgICAgICAgIEJULnJlc2V0KG5ldyBCdWlsdGluQnVnKAorICAgICAgICAgICAgdGhpcywgIkJyYW5jaCBjb25kaXRpb24gZXZhbHVhdGVzIHRvIGEgZ2FyYmFnZSB2YWx1ZSIpKTsKIAogICAgICAgLy8gV2hhdCdzIGdvaW5nIG9uIGhlcmU6IHdlIHdhbnQgdG8gaGlnaGxpZ2h0IHRoZSBzdWJleHByZXNzaW9uIG9mIHRoZQogICAgICAgLy8gY29uZGl0aW9uIHRoYXQgaXMgdGhlIG1vc3QgbGlrZWx5IHNvdXJjZSBvZiB0aGUgInVuaW5pdGlhbGl6ZWQKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9VbmRlZkNhcHR1cmVkQmxvY2tWYXJDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9VbmRlZkNhcHR1cmVkQmxvY2tWYXJDaGVja2VyLmNwcAppbmRleCA5MzgxMmY3Li45M2ZlN2Q0IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVW5kZWZDYXB0dXJlZEJsb2NrVmFyQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VuZGVmQ2FwdHVyZWRCbG9ja1ZhckNoZWNrZXIuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiBuYW1lc3BhY2UgewogY2xhc3MgVW5kZWZDYXB0dXJlZEJsb2NrVmFyQ2hlY2tlcgogICA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6UG9zdFN0bXQ8QmxvY2tFeHByPiA+IHsKLSBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVDsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlQ7CiAKIHB1YmxpYzoKICAgdm9pZCBjaGVja1Bvc3RTdG10KGNvbnN0IEJsb2NrRXhwciAqQkUsIENoZWNrZXJDb250ZXh0ICZDKSBjb25zdDsKQEAgLTcxLDcgKzcxLDcgQEAKICAgICBjb25zdCBWYXJSZWdpb24gKlZSID0gSS5nZXRDYXB0dXJlZFJlZ2lvbigpOwogICAgIGNvbnN0IFZhckRlY2wgKlZEID0gVlItPmdldERlY2woKTsKIAotICAgIGlmIChWRC0+Z2V0QXR0cjxCbG9ja3NBdHRyPigpIHx8ICFWRC0+aGFzTG9jYWxTdG9yYWdlKCkpCisgICAgaWYgKFZELT5oYXNBdHRyPEJsb2Nrc0F0dHI+KCkgfHwgIVZELT5oYXNMb2NhbFN0b3JhZ2UoKSkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgLy8gR2V0IHRoZSBWYXJSZWdpb24gYXNzb2NpYXRlZCB3aXRoIFZEIGluIHRoZSBsb2NhbCBzdGFjayBmcmFtZS4KQEAgLTc5LDcgKzc5LDggQEAKICAgICAgICAgICBzdGF0ZS0+Z2V0U1ZhbChJLmdldE9yaWdpbmFsUmVnaW9uKCkpLmdldEFzPFVuZGVmaW5lZFZhbD4oKSkgewogICAgICAgaWYgKEV4cGxvZGVkTm9kZSAqTiA9IEMuZ2VuZXJhdGVTaW5rKCkpIHsKICAgICAgICAgaWYgKCFCVCkKLSAgICAgICAgICBCVC5yZXNldChuZXcgQnVpbHRpbkJ1ZygidW5pbml0aWFsaXplZCB2YXJpYWJsZSBjYXB0dXJlZCBieSBibG9jayIpKTsKKyAgICAgICAgICBCVC5yZXNldCgKKyAgICAgICAgICAgICAgbmV3IEJ1aWx0aW5CdWcodGhpcywgInVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY2FwdHVyZWQgYnkgYmxvY2siKSk7CiAKICAgICAgICAgLy8gR2VuZXJhdGUgYSBidWcgcmVwb3J0LgogICAgICAgICBTbWFsbFN0cmluZzwxMjg+IGJ1ZjsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9VbmRlZlJlc3VsdENoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VuZGVmUmVzdWx0Q2hlY2tlci5jcHAKaW5kZXggM2Y2NTQ5ZC4uMDBmZDk3MSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VuZGVmUmVzdWx0Q2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VuZGVmUmVzdWx0Q2hlY2tlci5jcHAKQEAgLTI4LDggKzI4LDggQEAKIGNsYXNzIFVuZGVmUmVzdWx0Q2hlY2tlciAKICAgOiBwdWJsaWMgQ2hlY2tlcjwgY2hlY2s6OlBvc3RTdG10PEJpbmFyeU9wZXJhdG9yPiA+IHsKIAotICBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVDsKLSAgCisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPEJ1Z1R5cGU+IEJUOworCiBwdWJsaWM6CiAgIHZvaWQgY2hlY2tQb3N0U3RtdChjb25zdCBCaW5hcnlPcGVyYXRvciAqQiwgQ2hlY2tlckNvbnRleHQgJkMpIGNvbnN0OwogfTsKQEAgLTU1LDcgKzU1LDggQEAKICAgICAgIHJldHVybjsKICAgICAKICAgICBpZiAoIUJUKQotICAgICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcoIlJlc3VsdCBvZiBvcGVyYXRpb24gaXMgZ2FyYmFnZSBvciB1bmRlZmluZWQiKSk7CisgICAgICBCVC5yZXNldCgKKyAgICAgICAgICBuZXcgQnVpbHRpbkJ1Zyh0aGlzLCAiUmVzdWx0IG9mIG9wZXJhdGlvbiBpcyBnYXJiYWdlIG9yIHVuZGVmaW5lZCIpKTsKIAogICAgIFNtYWxsU3RyaW5nPDI1Nj4gc2J1ZjsKICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIE9TKHNidWYpOwpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VuZGVmaW5lZEFycmF5U3Vic2NyaXB0Q2hlY2tlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVW5kZWZpbmVkQXJyYXlTdWJzY3JpcHRDaGVja2VyLmNwcAppbmRleCA1ZGY4ODQ2Li5lOTUyNjcxIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVW5kZWZpbmVkQXJyYXlTdWJzY3JpcHRDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVW5kZWZpbmVkQXJyYXlTdWJzY3JpcHRDaGVja2VyLmNwcApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIHsKIGNsYXNzIFVuZGVmaW5lZEFycmF5U3Vic2NyaXB0Q2hlY2tlcgogICA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6UHJlU3RtdDxBcnJheVN1YnNjcmlwdEV4cHI+ID4gewotICBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVDsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlQ7CiAKIHB1YmxpYzoKICAgdm9pZCBjaGVja1ByZVN0bXQoY29uc3QgQXJyYXlTdWJzY3JpcHRFeHByICpBLCBDaGVja2VyQ29udGV4dCAmQykgY29uc3Q7CkBAIC01MCw3ICs1MCw3IEBACiAgIGlmICghTikKICAgICByZXR1cm47CiAgIGlmICghQlQpCi0gICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcoIkFycmF5IHN1YnNjcmlwdCBpcyB1bmRlZmluZWQiKSk7CisgICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcodGhpcywgIkFycmF5IHN1YnNjcmlwdCBpcyB1bmRlZmluZWQiKSk7CiAKICAgLy8gR2VuZXJhdGUgYSByZXBvcnQgZm9yIHRoaXMgYnVnLgogICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVCwgQlQtPmdldE5hbWUoKSwgTik7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVW5kZWZpbmVkQXNzaWdubWVudENoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VuZGVmaW5lZEFzc2lnbm1lbnRDaGVja2VyLmNwcAppbmRleCAwMTZlM2M4Li4zMDc3NWQ1IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVW5kZWZpbmVkQXNzaWdubWVudENoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9VbmRlZmluZWRBc3NpZ25tZW50Q2hlY2tlci5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSB7CiBjbGFzcyBVbmRlZmluZWRBc3NpZ25tZW50Q2hlY2tlcgogICA6IHB1YmxpYyBDaGVja2VyPGNoZWNrOjpCaW5kPiB7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVDsKIAogcHVibGljOgogICB2b2lkIGNoZWNrQmluZChTVmFsIGxvY2F0aW9uLCBTVmFsIHZhbCwgY29uc3QgU3RtdCAqUywKQEAgLTU0LDcgKzU0LDcgQEAKICAgY29uc3QgY2hhciAqc3RyID0gIkFzc2lnbmVkIHZhbHVlIGlzIGdhcmJhZ2Ugb3IgdW5kZWZpbmVkIjsKIAogICBpZiAoIUJUKQotICAgIEJULnJlc2V0KG5ldyBCdWlsdGluQnVnKHN0cikpOworICAgIEJULnJlc2V0KG5ldyBCdWlsdGluQnVnKHRoaXMsIHN0cikpOwogCiAgIC8vIEdlbmVyYXRlIGEgcmVwb3J0IGZvciB0aGlzIGJ1Zy4KICAgY29uc3QgRXhwciAqZXggPSAwOwpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VuaXhBUElDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Vbml4QVBJQ2hlY2tlci5jcHAKaW5kZXggNGVhMDdlMi4uYWE3ZTI1YmMgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9Vbml4QVBJQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VuaXhBUElDaGVja2VyLmNwcApAQCAtMzAsNyArMzAsNyBAQAogCiBuYW1lc3BhY2UgewogY2xhc3MgVW5peEFQSUNoZWNrZXIgOiBwdWJsaWMgQ2hlY2tlcjwgY2hlY2s6OlByZVN0bXQ8Q2FsbEV4cHI+ID4gewotICBtdXRhYmxlIE93bmluZ1B0cjxCdWdUeXBlPiBCVF9vcGVuLCBCVF9wdGhyZWFkT25jZSwgQlRfbWFsbG9jWmVybzsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8QnVnVHlwZT4gQlRfb3BlbiwgQlRfcHRocmVhZE9uY2UsIEJUX21hbGxvY1plcm87CiAgIG11dGFibGUgT3B0aW9uYWw8dWludDY0X3Q+IFZhbF9PX0NSRUFUOwogCiBwdWJsaWM6CkBAIC01NywyMSArNTcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBudW1BcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNpemVBcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm4pIGNvbnN0OworICB2b2lkIExhenlJbml0aWFsaXplKHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiAmQlQsIGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKKyAgICBpZiAoQlQpCisgICAgICByZXR1cm47CisgICAgQlQucmVzZXQobmV3IEJ1Z1R5cGUodGhpcywgbmFtZSwgY2F0ZWdvcmllczo6VW5peEFQSSkpOworICB9CiB9OwogfSAvL2VuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLyBVdGlsaXR5IGZ1bmN0aW9ucy4KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBMYXp5SW5pdGlhbGl6ZShPd25pbmdQdHI8QnVnVHlwZT4gJkJULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgaWYgKEJUKQotICAgIHJldHVybjsKLSAgQlQucmVzZXQobmV3IEJ1Z1R5cGUobmFtZSwgY2F0ZWdvcmllczo6VW5peEFQSSkpOwotfQotCi0vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogLy8gIm9wZW4iIChtYW4gMiBvcGVuKQogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIApAQCAtODYsNiArODAsNyBAQAogICAgICAgLy8gRklYTUU6IFdlIG5lZWQgYSBtb3JlIGdlbmVyYWwgd2F5IG9mIGdldHRpbmcgdGhlIE9fQ1JFQVQgdmFsdWUuCiAgICAgICAvLyBXZSBjb3VsZCBwb3NzaWJseSBncm92ZWwgdGhyb3VnaCB0aGUgcHJlcHJvY2Vzc29yIHN0YXRlLCBidXQKICAgICAgIC8vIHRoYXQgd291bGQgcmVxdWlyZSBwYXNzaW5nIHRoZSBQcmVwcm9jZXNzb3Igb2JqZWN0IHRvIHRoZSBFeHByRW5naW5lLgorICAgICAgLy8gU2VlIGFsc286IE1hbGxvY0NoZWNrZXIuY3BwIC8gTV9aRVJPLgogICAgICAgcmV0dXJuOwogICAgIH0KICAgfQpAQCAtMTE5LDcgKzExNCw3IEBACiAKICAgLy8gQ2hlY2sgaWYgbWFza2VkRmxhZ3MgaXMgbm9uLXplcm8uCiAgIFByb2dyYW1TdGF0ZVJlZiB0cnVlU3RhdGUsIGZhbHNlU3RhdGU7Ci0gIGxsdm06OnRpZSh0cnVlU3RhdGUsIGZhbHNlU3RhdGUpID0gc3RhdGUtPmFzc3VtZShtYXNrZWRGbGFncyk7CisgIHN0ZDo6dGllKHRydWVTdGF0ZSwgZmFsc2VTdGF0ZSkgPSBzdGF0ZS0+YXNzdW1lKG1hc2tlZEZsYWdzKTsKIAogICAvLyBPbmx5IGVtaXQgYW4gZXJyb3IgaWYgdGhlIHZhbHVlIG9mICdtYXNrZWRGbGFncycgaXMgcHJvcGVybHkKICAgLy8gY29uc3RyYWluZWQ7CkBAIC0xOTksNyArMTk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1ZhbCBhcmdWYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiAqdHJ1ZVN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RhdGVSZWYgKmZhbHNlU3RhdGUpIHsKLSAgbGx2bTo6dGllKCp0cnVlU3RhdGUsICpmYWxzZVN0YXRlKSA9CisgIHN0ZDo6dGllKCp0cnVlU3RhdGUsICpmYWxzZVN0YXRlKSA9CiAgICAgc3RhdGUtPmFzc3VtZShhcmdWYWwuY2FzdEFzPERlZmluZWRTVmFsPigpKTsKICAgCiAgIHJldHVybiAoKmZhbHNlU3RhdGUgJiYgISp0cnVlU3RhdGUpOwpAQCAtMjA3LDcgKzIwMiw3IEBACiAKIC8vIEdlbmVyYXRlcyBhbiBlcnJvciByZXBvcnQsIGluZGljYXRpbmcgdGhhdCB0aGUgZnVuY3Rpb24gd2hvc2UgbmFtZSBpcyBnaXZlbgogLy8gd2lsbCBwZXJmb3JtIGEgemVybyBieXRlIGFsbG9jYXRpb24uCi0vLyBSZXR1cm5zIGZhbHNlIGlmIGFuIGVycm9yIG9jY3VyZWQsIHRydWUgb3RoZXJ3aXNlLgorLy8gUmV0dXJucyBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgdHJ1ZSBvdGhlcndpc2UuCiBib29sIFVuaXhBUElDaGVja2VyOjpSZXBvcnRaZXJvQnl0ZUFsbG9jYXRpb24oQ2hlY2tlckNvbnRleHQgJkMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbVN0YXRlUmVmIGZhbHNlU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXhwciAqYXJnLApAQCAtMjE3LDcgKzIxMiw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIExhenlJbml0aWFsaXplKEJUX21hbGxvY1plcm8sCi0gICAgIlVuZGVmaW5lZCBhbGxvY2F0aW9uIG9mIDAgYnl0ZXMgKENFUlQgTUVNMDQtQzsgQ1dFLTEzMSkiKTsKKyAgICAgICAgICAgICAgICAgIlVuZGVmaW5lZCBhbGxvY2F0aW9uIG9mIDAgYnl0ZXMgKENFUlQgTUVNMDQtQzsgQ1dFLTEzMSkiKTsKIAogICBTbWFsbFN0cmluZzwyNTY+IFM7CiAgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gb3MoUyk7ICAgIApkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VucmVhY2hhYmxlQ29kZUNoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1VucmVhY2hhYmxlQ29kZUNoZWNrZXIuY3BwCmluZGV4IGE0MGI1YTMuLjY2YzFhY2QgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9VbnJlYWNoYWJsZUNvZGVDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVW5yZWFjaGFibGVDb2RlQ2hlY2tlci5jcHAKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICAgICAgICBjaSAhPSBjZTsgKytjaSkgewogICAgICAgICBpZiAoT3B0aW9uYWw8Q0ZHU3RtdD4gUyA9ICgqY2kpLmdldEFzPENGR1N0bXQ+KCkpCiAgICAgICAgICAgaWYgKGNvbnN0IENhbGxFeHByICpDRSA9IGR5bl9jYXN0PENhbGxFeHByPihTLT5nZXRTdG10KCkpKSB7Ci0gICAgICAgICAgICBpZiAoQ0UtPmlzQnVpbHRpbkNhbGwoKSA9PSBCdWlsdGluOjpCSV9fYnVpbHRpbl91bnJlYWNoYWJsZSkgeworICAgICAgICAgICAgaWYgKENFLT5nZXRCdWlsdGluQ2FsbGVlKCkgPT0gQnVpbHRpbjo6QklfX2J1aWx0aW5fdW5yZWFjaGFibGUpIHsKICAgICAgICAgICAgICAgZm91bmRVbnJlYWNoYWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgaWYgKFNNLmlzSW5TeXN0ZW1IZWFkZXIoU0wpIHx8IFNNLmlzSW5FeHRlcm5DU3lzdGVtSGVhZGVyKFNMKSkKICAgICAgIGNvbnRpbnVlOwogCi0gICAgQi5FbWl0QmFzaWNSZXBvcnQoRCwgIlVucmVhY2hhYmxlIGNvZGUiLCAiRGVhZCBjb2RlIiwKKyAgICBCLkVtaXRCYXNpY1JlcG9ydChELCB0aGlzLCAiVW5yZWFjaGFibGUgY29kZSIsICJEZWFkIGNvZGUiLAogICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHN0YXRlbWVudCBpcyBuZXZlciBleGVjdXRlZCIsIERMLCBTUik7CiAgIH0KIH0KQEAgLTE3OCw2ICsxNzgsOSBAQAogCiAgIGZvciAoQ0ZHQmxvY2s6OmNvbnN0X3ByZWRfaXRlcmF0b3IgSSA9IENCLT5wcmVkX2JlZ2luKCksIEUgPSBDQi0+cHJlZF9lbmQoKTsKICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKCEqSSkKKyAgICAgIGNvbnRpbnVlOworCiAgICAgaWYgKCFyZWFjaGFibGUuY291bnQoKCpJKS0+Z2V0QmxvY2tJRCgpKSkgewogICAgICAgLy8gSWYgd2UgZmluZCBhbiB1bnJlYWNoYWJsZSBwcmVkZWNlc3NvciwgbWFyayB0aGlzIGJsb2NrIGFzIHJlYWNoYWJsZSBzbwogICAgICAgLy8gd2UgZG9uJ3QgcmVwb3J0IHRoaXMgYmxvY2sKQEAgLTIxOSw2ICsyMjIsOCBAQAogICAgIHJldHVybiBmYWxzZTsKIAogICBjb25zdCBDRkdCbG9jayAqcHJlZCA9ICpDQi0+cHJlZF9iZWdpbigpOworICBpZiAoIXByZWQpCisgICAgcmV0dXJuIGZhbHNlOwogCiAgIC8vIEdldCB0aGUgcHJlZGVjZXNzb3IgYmxvY2sncyB0ZXJtaW5hdG9yIGNvbmRpdG9uCiAgIGNvbnN0IFN0bXQgKmNvbmQgPSBwcmVkLT5nZXRUZXJtaW5hdG9yQ29uZGl0aW9uKCk7CkBAIC0yNDIsNyArMjQ3LDcgQEAKIGJvb2wgVW5yZWFjaGFibGVDb2RlQ2hlY2tlcjo6aXNFbXB0eUNGR0Jsb2NrKGNvbnN0IENGR0Jsb2NrICpDQikgewogICByZXR1cm4gQ0ItPmdldExhYmVsKCkgPT0gMCAgICAgICAvLyBObyBsYWJlbHMKICAgICAgICYmIENCLT5zaXplKCkgPT0gMCAgICAgICAgICAgLy8gTm8gc3RhdGVtZW50cwotICAgICAgJiYgQ0ItPmdldFRlcm1pbmF0b3IoKSA9PSAwOyAvLyBObyB0ZXJtaW5hdG9yCisgICAgICAmJiAhQ0ItPmdldFRlcm1pbmF0b3IoKTsgICAgIC8vIE5vIHRlcm1pbmF0b3IKIH0KIAogdm9pZCBlbnRvOjpyZWdpc3RlclVucmVhY2hhYmxlQ29kZUNoZWNrZXIoQ2hlY2tlck1hbmFnZXIgJm1ncikgewpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1ZMQVNpemVDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9WTEFTaXplQ2hlY2tlci5jcHAKaW5kZXggMzBhZWYwNi4uYzdiMjAyNCAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL1ZMQVNpemVDaGVja2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVkxBU2l6ZUNoZWNrZXIuY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAKIG5hbWVzcGFjZSB7CiBjbGFzcyBWTEFTaXplQ2hlY2tlciA6IHB1YmxpYyBDaGVja2VyPCBjaGVjazo6UHJlU3RtdDxEZWNsU3RtdD4gPiB7Ci0gIG11dGFibGUgT3duaW5nUHRyPEJ1Z1R5cGU+IEJUOworICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxCdWdUeXBlPiBCVDsKICAgZW51bSBWTEFTaXplX0tpbmQgeyBWTEFfR2FyYmFnZSwgVkxBX1plcm8sIFZMQV9UYWludGVkIH07CiAKICAgdm9pZCByZXBvcnRCdWcoVkxBU2l6ZV9LaW5kIEtpbmQsCkBAIC01MSw3ICs1MSw4IEBACiAgICAgcmV0dXJuOwogCiAgIGlmICghQlQpCi0gICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcoIkRhbmdlcm91cyB2YXJpYWJsZS1sZW5ndGggYXJyYXkgKFZMQSkgZGVjbGFyYXRpb24iKSk7CisgICAgQlQucmVzZXQobmV3IEJ1aWx0aW5CdWcoCisgICAgICAgIHRoaXMsICJEYW5nZXJvdXMgdmFyaWFibGUtbGVuZ3RoIGFycmF5IChWTEEpIGRlY2xhcmF0aW9uIikpOwogCiAgIFNtYWxsU3RyaW5nPDI1Nj4gYnVmOwogICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIG9zKGJ1Zik7CkBAIC0xMTMsNyArMTE0LDcgQEAKICAgRGVmaW5lZFNWYWwgc2l6ZUQgPSBzaXplVi5jYXN0QXM8RGVmaW5lZFNWYWw+KCk7CiAKICAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlTm90WmVybywgc3RhdGVaZXJvOwotICBsbHZtOjp0aWUoc3RhdGVOb3RaZXJvLCBzdGF0ZVplcm8pID0gc3RhdGUtPmFzc3VtZShzaXplRCk7CisgIHN0ZDo6dGllKHN0YXRlTm90WmVybywgc3RhdGVaZXJvKSA9IHN0YXRlLT5hc3N1bWUoc2l6ZUQpOwogCiAgIGlmIChzdGF0ZVplcm8gJiYgIXN0YXRlTm90WmVybykgewogICAgIHJlcG9ydEJ1ZyhWTEFfWmVybywgU0UsIHN0YXRlWmVybywgQyk7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvVmlydHVhbENhbGxDaGVja2VyLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9WaXJ0dWFsQ2FsbENoZWNrZXIuY3BwCmluZGV4IDdiNmFkYmYuLjliNWM4NTIgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9WaXJ0dWFsQ2FsbENoZWNrZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9WaXJ0dWFsQ2FsbENoZWNrZXIuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiBuYW1lc3BhY2UgewogCiBjbGFzcyBXYWxrQVNUIDogcHVibGljIFN0bXRWaXNpdG9yPFdhbGtBU1Q+IHsKKyAgY29uc3QgQ2hlY2tlckJhc2UgKkNoZWNrZXI7CiAgIEJ1Z1JlcG9ydGVyICZCUjsKICAgQW5hbHlzaXNEZWNsQ29udGV4dCAqQUM7CiAKQEAgLTU4LDExICs1OSwxMCBAQAogICBjb25zdCBDYWxsRXhwciAqdmlzaXRpbmdDYWxsRXhwcjsKICAgCiBwdWJsaWM6Ci0gIFdhbGtBU1QoQnVnUmVwb3J0ZXIgJmJyLCBBbmFseXNpc0RlY2xDb250ZXh0ICphYykKLSAgICA6IEJSKGJyKSwKLSAgICAgIEFDKGFjKSwKLSAgICAgIHZpc2l0aW5nQ2FsbEV4cHIoMCkge30KLSAgCisgIFdhbGtBU1QoY29uc3QgQ2hlY2tlckJhc2UgKmNoZWNrZXIsIEJ1Z1JlcG9ydGVyICZiciwKKyAgICAgICAgICBBbmFseXNpc0RlY2xDb250ZXh0ICphYykKKyAgICAgIDogQ2hlY2tlcihjaGVja2VyKSwgQlIoYnIpLCBBQyhhYyksIHZpc2l0aW5nQ2FsbEV4cHIoMCkge30KKwogICBib29sIGhhc1dvcmsoKSBjb25zdCB7IHJldHVybiAhV0xpc3QuZW1wdHkoKTsgfQogCiAgIC8vLyBUaGlzIG1ldGhvZCBhZGRzIGEgQ2FsbEV4cHIgdG8gdGhlIHdvcmtsaXN0IGFuZCBtYXJrcyB0aGUgY2FsbGVlIGFzCkBAIC0xODcsMjEgKzE4NywxOSBAQAogICBpZiAoaXNQdXJlKSB7CiAgICAgb3MgPDwgIlxuIiA8PCAgIkNhbGwgcHVyZSB2aXJ0dWFsIGZ1bmN0aW9ucyBkdXJpbmcgY29uc3RydWN0aW9uIG9yICIKICAgICAgICA8PCAiZGVzdHJ1Y3Rpb24gbWF5IGxlYWRzIHVuZGVmaW5lZCBiZWhhdmlvdXIiOwotICAgIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLAorICAgIEJSLkVtaXRCYXNpY1JlcG9ydChBQy0+Z2V0RGVjbCgpLCBDaGVja2VyLAogICAgICAgICAgICAgICAgICAgICAgICAiQ2FsbCBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gZHVyaW5nIGNvbnN0cnVjdGlvbiBvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICJEZXN0cnVjdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJDcGx1c3BsdXMiLAotICAgICAgICAgICAgICAgICAgICAgICBvcy5zdHIoKSwgQ0VMb2MsIFIpOworICAgICAgICAgICAgICAgICAgICAgICAiQ3BsdXNwbHVzIiwgb3Muc3RyKCksIENFTG9jLCBSKTsKICAgICByZXR1cm47CiAgIH0KICAgZWxzZSB7CiAgICAgb3MgPDwgIlxuIiA8PCAiQ2FsbCB2aXJ0dWFsIGZ1bmN0aW9ucyBkdXJpbmcgY29uc3RydWN0aW9uIG9yICIKICAgICAgICA8PCAiZGVzdHJ1Y3Rpb24gd2lsbCBuZXZlciBnbyB0byBhIG1vcmUgZGVyaXZlZCBjbGFzcyI7Ci0gICAgQlIuRW1pdEJhc2ljUmVwb3J0KEFDLT5nZXREZWNsKCksCisgICAgQlIuRW1pdEJhc2ljUmVwb3J0KEFDLT5nZXREZWNsKCksIENoZWNrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICJDYWxsIHZpcnR1YWwgZnVuY3Rpb24gZHVyaW5nIGNvbnN0cnVjdGlvbiBvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICJEZXN0cnVjdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJDcGx1c3BsdXMiLAotICAgICAgICAgICAgICAgICAgICAgICBvcy5zdHIoKSwgQ0VMb2MsIFIpOworICAgICAgICAgICAgICAgICAgICAgICAiQ3BsdXNwbHVzIiwgb3Muc3RyKCksIENFTG9jLCBSKTsKICAgICByZXR1cm47CiAgIH0KIH0KQEAgLTIxNSwxMSArMjEzLDEwIEBACiBwdWJsaWM6CiAgIHZvaWQgY2hlY2tBU1REZWNsKGNvbnN0IENYWFJlY29yZERlY2wgKlJELCBBbmFseXNpc01hbmFnZXImIG1nciwKICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ZXIgJkJSKSBjb25zdCB7Ci0gICAgV2Fsa0FTVCB3YWxrZXIoQlIsIG1nci5nZXRBbmFseXNpc0RlY2xDb250ZXh0KFJEKSk7CisgICAgV2Fsa0FTVCB3YWxrZXIodGhpcywgQlIsIG1nci5nZXRBbmFseXNpc0RlY2xDb250ZXh0KFJEKSk7CiAKICAgICAvLyBDaGVjayB0aGUgY29uc3RydWN0b3JzLgotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6Y3Rvcl9pdGVyYXRvciBJID0gUkQtPmN0b3JfYmVnaW4oKSwgRSA9IFJELT5jdG9yX2VuZCgpOwotICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBSRC0+Y3RvcnMoKSkgewogICAgICAgaWYgKCFJLT5pc0NvcHlPck1vdmVDb25zdHJ1Y3RvcigpKQogICAgICAgICBpZiAoU3RtdCAqQm9keSA9IEktPmdldEJvZHkoKSkgewogICAgICAgICAgIHdhbGtlci5WaXNpdChCb2R5KTsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5emVyT3B0aW9ucy5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9BbmFseXplck9wdGlvbnMuY3BwCmluZGV4IDlkY2Y1OGIuLjFiZWE5NmUgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5emVyT3B0aW9ucy5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQW5hbHl6ZXJPcHRpb25zLmNwcApAQCAtMTM0LDYgKzEzNCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAvKkRlZmF1bHQ9Ki90cnVlKTsKIH0KIAorYm9vbCBBbmFseXplck9wdGlvbnM6Om1heUlubGluZUNYWEFsbG9jYXRvcigpIHsKKyAgcmV0dXJuIGdldEJvb2xlYW5PcHRpb24oSW5saW5lQ1hYQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYysrLWFsbG9jYXRvci1pbmxpbmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRGVmYXVsdD0qL2ZhbHNlKTsKK30KKwogYm9vbCBBbmFseXplck9wdGlvbnM6Om1heUlubGluZUNYWENvbnRhaW5lckN0b3JzQW5kRHRvcnMoKSB7CiAgIHJldHVybiBnZXRCb29sZWFuT3B0aW9uKElubGluZUNYWENvbnRhaW5lckN0b3JzQW5kRHRvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJjKystY29udGFpbmVyLWlubGluaW5nIiwKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0Jhc2ljVmFsdWVGYWN0b3J5LmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0Jhc2ljVmFsdWVGYWN0b3J5LmNwcAppbmRleCBhNmM0MDBmLi44ZjkzY2VlIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9CYXNpY1ZhbHVlRmFjdG9yeS5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQmFzaWNWYWx1ZUZhY3RvcnkuY3BwCkBAIC0xNzcsNyArMTc3LDcgQEAKIAogICAgICAgdWludDY0X3QgQW10ID0gVjIuZ2V0WkV4dFZhbHVlKCk7CiAKLSAgICAgIGlmIChBbXQgPiBWMS5nZXRCaXRXaWR0aCgpKQorICAgICAgaWYgKEFtdCA+PSBWMS5nZXRCaXRXaWR0aCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgICAgcmV0dXJuICZnZXRWYWx1ZSggVjEub3BlcmF0b3I8PCggKHVuc2lnbmVkKSBBbXQgKSk7CkBAIC0xOTUsNyArMTk1LDcgQEAKIAogICAgICAgdWludDY0X3QgQW10ID0gVjIuZ2V0WkV4dFZhbHVlKCk7CiAKLSAgICAgIGlmIChBbXQgPiBWMS5nZXRCaXRXaWR0aCgpKQorICAgICAgaWYgKEFtdCA+PSBWMS5nZXRCaXRXaWR0aCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgICAgcmV0dXJuICZnZXRWYWx1ZSggVjEub3BlcmF0b3I+PiggKHVuc2lnbmVkKSBBbXQgKSk7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9CbG9ja0NvdW50ZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQmxvY2tDb3VudGVyLmNwcAppbmRleCA3NGQ3NjFlLi5jMWFjMDNkIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9CbG9ja0NvdW50ZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0Jsb2NrQ291bnRlci5jcHAKQEAgLTM0LDggKzM0LDcgQEAKICAgfQogCiAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENvdW50S2V5ICZSSFMpIGNvbnN0IHsKLSAgICByZXR1cm4gKENhbGxTaXRlID09IFJIUy5DYWxsU2l0ZSkgPyAoQmxvY2tJRCA8IFJIUy5CbG9ja0lEKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoQ2FsbFNpdGUgPCBSSFMuQ2FsbFNpdGUpOworICAgIHJldHVybiBzdGQ6OnRpZShDYWxsU2l0ZSwgQmxvY2tJRCkgPCBzdGQ6OnRpZShSSFMuQ2FsbFNpdGUsIFJIUy5CbG9ja0lEKTsKICAgfQogCiAgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXIuY3BwCmluZGV4IDE5NDBmYTcuLmEwOGEyMjYgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9CdWdSZXBvcnRlci5jcHAKQEAgLTIwLDggKzIwLDggQEAKICNpbmNsdWRlICJjbGFuZy9BU1QvRXhwci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByQ1hYLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL1BhcmVudE1hcC5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10T2JqQy5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10Q1hYLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRPYmpDLmgiCiAjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvQ0ZHLmgiCiAjaW5jbHVkZSAiY2xhbmcvQW5hbHlzaXMvUHJvZ3JhbVBvaW50LmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgpAQCAtMzAsMTEgKzMwLDExIEBACiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoU2Vuc2l0aXZlL0V4cHJFbmdpbmUuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgogI2luY2x1ZGUgImxsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oIgotI2luY2x1ZGUgImxsdm0vQURUL093bmluZ1B0ci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHF1ZXVlPgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CkBAIC0yNjUsNyArMjY1LDcgQEAKICAgICAgICAgSSA9IFBpZWNlcy5lcmFzZShJKTsKICAgICAgICAgY29udGludWU7CiAgICAgICB9IGVsc2UgaWYgKEVuZCAmJiBpc2E8Q1hYRGVmYXVsdEluaXRFeHByPihFbmQpKSB7Ci0gICAgICAgIFBhdGhQaWVjZXM6Oml0ZXJhdG9yIE5leHQgPSBsbHZtOjpuZXh0KEkpOworICAgICAgICBQYXRoUGllY2VzOjppdGVyYXRvciBOZXh0ID0gc3RkOjpuZXh0KEkpOwogICAgICAgICBpZiAoTmV4dCAhPSBFKSB7CiAgICAgICAgICAgaWYgKFBhdGhEaWFnbm9zdGljQ29udHJvbEZsb3dQaWVjZSAqTmV4dENGID0KICAgICAgICAgICAgICAgICBkeW5fY2FzdDxQYXRoRGlhZ25vc3RpY0NvbnRyb2xGbG93UGllY2U+KCpOZXh0KSkgewpAQCAtMzExLDcgKzMxMSw3IEBACiBwdWJsaWM6CiAgIE5vZGVNYXBDbG9zdXJlKEludGVyRXhwbG9kZWRHcmFwaE1hcCAmbSkgOiBNKG0pIHt9CiAKLSAgY29uc3QgRXhwbG9kZWROb2RlICpnZXRPcmlnaW5hbE5vZGUoY29uc3QgRXhwbG9kZWROb2RlICpOKSB7CisgIGNvbnN0IEV4cGxvZGVkTm9kZSAqZ2V0T3JpZ2luYWxOb2RlKGNvbnN0IEV4cGxvZGVkTm9kZSAqTikgb3ZlcnJpZGUgewogICAgIHJldHVybiBNLmxvb2t1cChOKTsKICAgfQogfTsKQEAgLTM0NSw3ICszNDUsNyBAQAogICAgIHJldHVybiBnZXRQYXJlbnRNYXAoKS5nZXRQYXJlbnQoUyk7CiAgIH0KIAotICB2aXJ0dWFsIE5vZGVNYXBDbG9zdXJlJiBnZXROb2RlUmVzb2x2ZXIoKSB7IHJldHVybiBOTUM7IH0KKyAgTm9kZU1hcENsb3N1cmUmIGdldE5vZGVSZXNvbHZlcigpIG92ZXJyaWRlIHsgcmV0dXJuIE5NQzsgfQogCiAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb24gZ2V0RW5jbG9zaW5nU3RtdExvY2F0aW9uKGNvbnN0IFN0bXQgKlMpOwogCkBAIC0xMjYzLDggKzEyNjMsOCBAQAogICAgICAgICAgIFNWYWwgQ2hpbGRWID0gU3RhdGUtPmdldFNWYWwoY2hpbGQsIExDdHgpOwogICAgICAgICAgIFIubWFya0ludGVyZXN0aW5nKENoaWxkVik7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CiAgICAgICB9CisgICAgICBicmVhazsKICAgICB9CiAgIH0KICAgCkBAIC0yNzQyLDEyICsyNzQyLDEwIEBACiAgICAgYXNzZXJ0KCFMb2NhdGlvbi5pc1ZhbGlkKCkgJiYKICAgICAgIkVpdGhlciBMb2NhdGlvbiBvciBFcnJvck5vZGUgc2hvdWxkIGJlIHNwZWNpZmllZCBidXQgbm90IGJvdGguIik7CiAgICAgcmV0dXJuIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUVuZE9mUGF0aChFcnJvck5vZGUsIFNNKTsKLSAgfSBlbHNlIHsKLSAgICBhc3NlcnQoTG9jYXRpb24uaXNWYWxpZCgpKTsKLSAgICByZXR1cm4gTG9jYXRpb247CiAgIH0KIAotICByZXR1cm4gUGF0aERpYWdub3N0aWNMb2NhdGlvbigpOworICBhc3NlcnQoTG9jYXRpb24uaXNWYWxpZCgpKTsKKyAgcmV0dXJuIExvY2F0aW9uOwogfQogCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtMjgwMiw5ICsyODAwLDcgQEAKICAgLy8gRW1pdEJhc2ljUmVwb3J0LgogICAvLyBGSVhNRTogVGhlcmUgYXJlIGxlYWtzIGZyb20gY2hlY2tlcnMgdGhhdCBhc3N1bWUgdGhhdCB0aGUgQnVnVHlwZXMgdGhleQogICAvLyBjcmVhdGUgd2lsbCBiZSBkZXN0cm95ZWQgYnkgdGhlIEJ1Z1JlcG9ydGVyLgotICBmb3IgKGxsdm06OlN0cmluZ01hcDxCdWdUeXBlKj46Oml0ZXJhdG9yCi0gICAgICAgICBJID0gU3RyQnVnVHlwZXMuYmVnaW4oKSwgRSA9IFN0ckJ1Z1R5cGVzLmVuZCgpOyBJICE9IEU7ICsrSSkKLSAgICBkZWxldGUgSS0+c2Vjb25kOworICBsbHZtOjpEZWxldGVDb250YWluZXJTZWNvbmRzKFN0ckJ1Z1R5cGVzKTsKIAogICAvLyBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIEJ1Z1R5cGUgb2JqZWN0cy4KICAgQnVnVHlwZXMgPSBGLmdldEVtcHR5U2V0KCk7CkBAIC0yODIwLDcgKzI4MTYsNyBAQAogY2xhc3MgUmVwb3J0R3JhcGggewogcHVibGljOgogICBJbnRlckV4cGxvZGVkR3JhcGhNYXAgQmFja01hcDsKLSAgT3duaW5nUHRyPEV4cGxvZGVkR3JhcGg+IEdyYXBoOworICBzdGQ6OnVuaXF1ZV9wdHI8RXhwbG9kZWRHcmFwaD4gR3JhcGg7CiAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqRXJyb3JOb2RlOwogICBzaXplX3QgSW5kZXg7CiB9OwpAQCAtMjgzNSw3ICsyODMxLDcgQEAKICAgdHlwZWRlZiBzdGQ6OnBhaXI8Y29uc3QgRXhwbG9kZWROb2RlICosIHNpemVfdD4gTm9kZUluZGV4UGFpcjsKICAgU21hbGxWZWN0b3I8Tm9kZUluZGV4UGFpciwgMzI+IFJlcG9ydE5vZGVzOwogCi0gIE93bmluZ1B0cjxFeHBsb2RlZEdyYXBoPiBHOworICBzdGQ6OnVuaXF1ZV9wdHI8RXhwbG9kZWRHcmFwaD4gRzsKIAogICAvLy8gQSBoZWxwZXIgY2xhc3MgZm9yIHNvcnRpbmcgRXhwbG9kZWROb2RlcyBieSBwcmlvcml0eS4KICAgdGVtcGxhdGUgPGJvb2wgRGVzY2VuZGluZz4KQEAgLTI5MDYsNyArMjkwMiw3IEBACiAKICAgICBQcmlvcml0eU1hcFR5OjppdGVyYXRvciBQcmlvcml0eUVudHJ5OwogICAgIGJvb2wgSXNOZXc7Ci0gICAgbGx2bTo6dGllKFByaW9yaXR5RW50cnksIElzTmV3KSA9CisgICAgc3RkOjp0aWUoUHJpb3JpdHlFbnRyeSwgSXNOZXcpID0KICAgICAgIFByaW9yaXR5TWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihOb2RlLCBQcmlvcml0eSkpOwogICAgICsrUHJpb3JpdHk7CiAKQEAgLTI5MzUsNyArMjkzMSw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqT3JpZ047Ci0gIGxsdm06OnRpZShPcmlnTiwgR3JhcGhXcmFwcGVyLkluZGV4KSA9IFJlcG9ydE5vZGVzLnBvcF9iYWNrX3ZhbCgpOworICBzdGQ6OnRpZShPcmlnTiwgR3JhcGhXcmFwcGVyLkluZGV4KSA9IFJlcG9ydE5vZGVzLnBvcF9iYWNrX3ZhbCgpOwogICBhc3NlcnQoUHJpb3JpdHlNYXAuZmluZChPcmlnTikgIT0gUHJpb3JpdHlNYXAuZW5kKCkgJiYKICAgICAgICAgICJlcnJvciBub2RlIG5vdCBhY2Nlc3NpYmxlIGZyb20gcm9vdCIpOwogCkBAIC0zMjQ3LDYgKzMyNDMsOSBAQAogfQogCiB2b2lkIEJ1Z1JlcG9ydGVyOjplbWl0UmVwb3J0KEJ1Z1JlcG9ydCogUikgeworICAvLyBUbyBndWFyYW50ZWUgbWVtb3J5IHJlbGVhc2UuCisgIHN0ZDo6dW5pcXVlX3B0cjxCdWdSZXBvcnQ+IFVuaXF1ZVIoUik7CisKICAgLy8gRGVmZW5zaXZlIGNoZWNraW5nOiB0aHJvdyB0aGUgYnVnIGF3YXkgaWYgaXQgY29tZXMgZnJvbSBhIEJvZHlGYXJtLQogICAvLyBnZW5lcmF0ZWQgYm9keS4gV2UgZG8gdGhpcyB2ZXJ5IGVhcmx5IGJlY2F1c2UgcmVwb3J0IHByb2Nlc3NpbmcgcmVsaWVzCiAgIC8vIG9uIHRoZSByZXBvcnQncyBsb2NhdGlvbiBiZWluZyB2YWxpZC4KQEAgLTMyNzcsMTIgKzMyNzYsMTIgQEAKICAgQnVnUmVwb3J0RXF1aXZDbGFzcyogRVEgPSBFUUNsYXNzZXMuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSW5zZXJ0UG9zKTsKIAogICBpZiAoIUVRKSB7Ci0gICAgRVEgPSBuZXcgQnVnUmVwb3J0RXF1aXZDbGFzcyhSKTsKKyAgICBFUSA9IG5ldyBCdWdSZXBvcnRFcXVpdkNsYXNzKFVuaXF1ZVIucmVsZWFzZSgpKTsKICAgICBFUUNsYXNzZXMuSW5zZXJ0Tm9kZShFUSwgSW5zZXJ0UG9zKTsKICAgICBFUUNsYXNzZXNWZWN0b3IucHVzaF9iYWNrKEVRKTsKICAgfQogICBlbHNlCi0gICAgRVEtPkFkZFJlcG9ydChSKTsKKyAgICBFUS0+QWRkUmVwb3J0KFVuaXF1ZVIucmVsZWFzZSgpKTsKIH0KIAogCkBAIC0zNDAzLDEwICszNDAyLDggQEAKICAgU21hbGxWZWN0b3I8QnVnUmVwb3J0KiwgMTA+IGJ1Z1JlcG9ydHM7CiAgIEJ1Z1JlcG9ydCAqZXhhbXBsZVJlcG9ydCA9IEZpbmRSZXBvcnRJbkVxdWl2YWxlbmNlQ2xhc3MoRVEsIGJ1Z1JlcG9ydHMpOwogICBpZiAoZXhhbXBsZVJlcG9ydCkgewotICAgIGNvbnN0IFBhdGhEaWFnbm9zdGljQ29uc3VtZXJzICZDID0gZ2V0UGF0aERpYWdub3N0aWNDb25zdW1lcnMoKTsKLSAgICBmb3IgKFBhdGhEaWFnbm9zdGljQ29uc3VtZXJzOjpjb25zdF9pdGVyYXRvciBJPUMuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFPUMuZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBGbHVzaFJlcG9ydChleGFtcGxlUmVwb3J0LCAqKkksIGJ1Z1JlcG9ydHMpOworICAgIGZvciAoUGF0aERpYWdub3N0aWNDb25zdW1lciAqUERDIDogZ2V0UGF0aERpYWdub3N0aWNDb25zdW1lcnMoKSkgeworICAgICAgRmx1c2hSZXBvcnQoZXhhbXBsZVJlcG9ydCwgKlBEQywgYnVnUmVwb3J0cyk7CiAgICAgfQogICB9CiB9CkBAIC0zNDE5LDE0ICszNDE2LDEzIEBACiAgIC8vIFByb2JhYmx5IGRvZXNuJ3QgbWFrZSBhIGRpZmZlcmVuY2UgaW4gcHJhY3RpY2UuCiAgIEJ1Z1R5cGUmIEJUID0gZXhhbXBsZVJlcG9ydC0+Z2V0QnVnVHlwZSgpOwogCi0gIE93bmluZ1B0cjxQYXRoRGlhZ25vc3RpYz4KLSAgICBEKG5ldyBQYXRoRGlhZ25vc3RpYyhleGFtcGxlUmVwb3J0LT5nZXREZWNsV2l0aElzc3VlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZVJlcG9ydC0+Z2V0QnVnVHlwZSgpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlUmVwb3J0LT5nZXREZXNjcmlwdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGVSZXBvcnQtPmdldFNob3J0RGVzY3JpcHRpb24oLypGYWxsYmFjaz0qL2ZhbHNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCVC5nZXRDYXRlZ29yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGVSZXBvcnQtPmdldFVuaXF1ZWluZ0xvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZVJlcG9ydC0+Z2V0VW5pcXVlaW5nRGVjbCgpKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxQYXRoRGlhZ25vc3RpYz4gRChuZXcgUGF0aERpYWdub3N0aWMoCisgICAgICBleGFtcGxlUmVwb3J0LT5nZXRCdWdUeXBlKCkuZ2V0Q2hlY2tOYW1lKCksCisgICAgICBleGFtcGxlUmVwb3J0LT5nZXREZWNsV2l0aElzc3VlKCksIGV4YW1wbGVSZXBvcnQtPmdldEJ1Z1R5cGUoKS5nZXROYW1lKCksCisgICAgICBleGFtcGxlUmVwb3J0LT5nZXREZXNjcmlwdGlvbigpLAorICAgICAgZXhhbXBsZVJlcG9ydC0+Z2V0U2hvcnREZXNjcmlwdGlvbigvKkZhbGxiYWNrPSovZmFsc2UpLCBCVC5nZXRDYXRlZ29yeSgpLAorICAgICAgZXhhbXBsZVJlcG9ydC0+Z2V0VW5pcXVlaW5nTG9jYXRpb24oKSwKKyAgICAgIGV4YW1wbGVSZXBvcnQtPmdldFVuaXF1ZWluZ0RlY2woKSkpOwogCiAgIE1heEJ1Z0NsYXNzU2l6ZSA9IHN0ZDo6bWF4KGJ1Z1JlcG9ydHMuc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KE1heEJ1Z0NsYXNzU2l6ZSkpOwpAQCAtMzQ1NSw3ICszNDUxLDcgQEAKICAgICBQYXRoRGlhZ25vc3RpY1BpZWNlICpwaWVjZSA9CiAgICAgICBuZXcgUGF0aERpYWdub3N0aWNFdmVudFBpZWNlKEwsIGV4YW1wbGVSZXBvcnQtPmdldERlc2NyaXB0aW9uKCkpOwogICAgIEJ1Z1JlcG9ydDo6cmFuZ2VzX2l0ZXJhdG9yIEJlZywgRW5kOwotICAgIGxsdm06OnRpZShCZWcsIEVuZCkgPSBleGFtcGxlUmVwb3J0LT5nZXRSYW5nZXMoKTsKKyAgICBzdGQ6OnRpZShCZWcsIEVuZCkgPSBleGFtcGxlUmVwb3J0LT5nZXRSYW5nZXMoKTsKICAgICBmb3IgKCA7IEJlZyAhPSBFbmQ7ICsrQmVnKQogICAgICAgcGllY2UtPmFkZFJhbmdlKCpCZWcpOwogICAgIEQtPnNldEVuZE9mUGF0aChwaWVjZSk7CkBAIC0zNDY4LDE3ICszNDY0LDI1IEBACiAgICAgRC0+YWRkTWV0YSgqaSk7CiAgIH0KIAotICBQRC5IYW5kbGVQYXRoRGlhZ25vc3RpYyhELnRha2UoKSk7CisgIFBELkhhbmRsZVBhdGhEaWFnbm9zdGljKEQucmVsZWFzZSgpKTsKIH0KIAogdm9pZCBCdWdSZXBvcnRlcjo6RW1pdEJhc2ljUmVwb3J0KGNvbnN0IERlY2wgKkRlY2xXaXRoSXNzdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIGNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoZWNrZXJCYXNlICpDaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN0ciwgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlUmFuZ2U+IFJhbmdlcykgeworICBFbWl0QmFzaWNSZXBvcnQoRGVjbFdpdGhJc3N1ZSwgQ2hlY2tlci0+Z2V0Q2hlY2tOYW1lKCksIE5hbWUsIENhdGVnb3J5LCBTdHIsCisgICAgICAgICAgICAgICAgICBMb2MsIFJhbmdlcyk7Cit9Cit2b2lkIEJ1Z1JlcG9ydGVyOjpFbWl0QmFzaWNSZXBvcnQoY29uc3QgRGVjbCAqRGVjbFdpdGhJc3N1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja05hbWUgQ2hlY2tOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBuYW1lLCBTdHJpbmdSZWYgY2F0ZWdvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIHN0ciwgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U291cmNlUmFuZ2U+IFJhbmdlcykgewogCiAgIC8vICdCVCcgaXMgb3duZWQgYnkgQnVnUmVwb3J0ZXIuCi0gIEJ1Z1R5cGUgKkJUID0gZ2V0QnVnVHlwZUZvck5hbWUobmFtZSwgY2F0ZWdvcnkpOworICBCdWdUeXBlICpCVCA9IGdldEJ1Z1R5cGVGb3JOYW1lKENoZWNrTmFtZSwgbmFtZSwgY2F0ZWdvcnkpOwogICBCdWdSZXBvcnQgKlIgPSBuZXcgQnVnUmVwb3J0KCpCVCwgc3RyLCBMb2MpOwogICBSLT5zZXREZWNsV2l0aElzc3VlKERlY2xXaXRoSXNzdWUpOwogICBmb3IgKEFycmF5UmVmPFNvdXJjZVJhbmdlPjo6aXRlcmF0b3IgSSA9IFJhbmdlcy5iZWdpbigpLCBFID0gUmFuZ2VzLmVuZCgpOwpAQCAtMzQ4NywyMiArMzQ5MSwyMiBAQAogICBlbWl0UmVwb3J0KFIpOwogfQogCi1CdWdUeXBlICpCdWdSZXBvcnRlcjo6Z2V0QnVnVHlwZUZvck5hbWUoU3RyaW5nUmVmIG5hbWUsCitCdWdUeXBlICpCdWdSZXBvcnRlcjo6Z2V0QnVnVHlwZUZvck5hbWUoQ2hlY2tOYW1lIENoZWNrTmFtZSwgU3RyaW5nUmVmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIGNhdGVnb3J5KSB7CiAgIFNtYWxsU3RyaW5nPDEzNj4gZnVsbERlc2M7Ci0gIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0oZnVsbERlc2MpIDw8IG5hbWUgPDwgIjoiIDw8IGNhdGVnb3J5OworICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtKGZ1bGxEZXNjKSA8PCBDaGVja05hbWUuZ2V0TmFtZSgpIDw8ICI6IiA8PCBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IiA8PCBjYXRlZ29yeTsKICAgbGx2bTo6U3RyaW5nTWFwRW50cnk8QnVnVHlwZSAqPiAmCiAgICAgICBlbnRyeSA9IFN0ckJ1Z1R5cGVzLkdldE9yQ3JlYXRlVmFsdWUoZnVsbERlc2MpOwogICBCdWdUeXBlICpCVCA9IGVudHJ5LmdldFZhbHVlKCk7CiAgIGlmICghQlQpIHsKLSAgICBCVCA9IG5ldyBCdWdUeXBlKG5hbWUsIGNhdGVnb3J5KTsKKyAgICBCVCA9IG5ldyBCdWdUeXBlKENoZWNrTmFtZSwgbmFtZSwgY2F0ZWdvcnkpOwogICAgIGVudHJ5LnNldFZhbHVlKEJUKTsKICAgfQogICByZXR1cm4gQlQ7CiB9CiAKLQotdm9pZCBQYXRoUGllY2VzOjpkdW1wKCkgY29uc3QgeworTExWTV9EVU1QX01FVEhPRCB2b2lkIFBhdGhQaWVjZXM6OmR1bXAoKSBjb25zdCB7CiAgIHVuc2lnbmVkIGluZGV4ID0gMDsKICAgZm9yIChQYXRoUGllY2VzOjpjb25zdF9pdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkgewogICAgIGxsdm06OmVycnMoKSA8PCAiWyIgPDwgaW5kZXgrKyA8PCAiXSAgIjsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0J1Z1JlcG9ydGVyVmlzaXRvcnMuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXJWaXNpdG9ycy5jcHAKaW5kZXggZTFhOTJiMy4uZmZjNmVlNSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXJWaXNpdG9ycy5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQnVnUmVwb3J0ZXJWaXNpdG9ycy5jcHAKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgIFBhdGhEaWFnbm9zdGljTG9jYXRpb246OmNyZWF0ZUVuZE9mUGF0aChFbmRQYXRoTm9kZSxCUkMuZ2V0U291cmNlTWFuYWdlcigpKTsKIAogICBCdWdSZXBvcnQ6OnJhbmdlc19pdGVyYXRvciBCZWcsIEVuZDsKLSAgbGx2bTo6dGllKEJlZywgRW5kKSA9IEJSLmdldFJhbmdlcygpOworICBzdGQ6OnRpZShCZWcsIEVuZCkgPSBCUi5nZXRSYW5nZXMoKTsKIAogICAvLyBPbmx5IGFkZCB0aGUgc3RhdGVtZW50IGl0c2VsZiBhcyBhIHJhbmdlIGlmIHdlIGRpZG4ndCBzcGVjaWZ5IGFueQogICAvLyBzcGVjaWFsIHJhbmdlcyBmb3IgdGhpcyByZXBvcnQuCkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dm9pZCAqPigmVGFnKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBQcm9maWxlKGxsdm06OkZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgIHZvaWQgUHJvZmlsZShsbHZtOjpGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Qgb3ZlcnJpZGUgewogICAgIElELkFkZFBvaW50ZXIoUmV0dXJuVmlzaXRvcjo6Z2V0VGFnKCkpOwogICAgIElELkFkZFBvaW50ZXIoU3RhY2tGcmFtZSk7CiAgICAgSUQuQWRkQm9vbGVhbihFbmFibGVOdWxsRlBTdXBwcmVzc2lvbik7CkBAIC0zODYsNyArMzg2LDcgQEAKICAgUGF0aERpYWdub3N0aWNQaWVjZSAqVmlzaXROb2RlKGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqUHJldk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnRlckNvbnRleHQgJkJSQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z1JlcG9ydCAmQlIpIG92ZXJyaWRlIHsKICAgICBzd2l0Y2ggKE1vZGUpIHsKICAgICBjYXNlIEluaXRpYWw6CiAgICAgICByZXR1cm4gdmlzaXROb2RlSW5pdGlhbChOLCBQcmV2TiwgQlJDLCBCUik7CkBAIC00MDEsNyArNDAxLDcgQEAKIAogICBQYXRoRGlhZ25vc3RpY1BpZWNlICpnZXRFbmRQYXRoKEJ1Z1JlcG9ydGVyQ29udGV4dCAmQlJDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4cGxvZGVkTm9kZSAqTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdSZXBvcnQgJkJSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVnUmVwb3J0ICZCUikgb3ZlcnJpZGUgewogICAgIGlmIChFbmFibGVOdWxsRlBTdXBwcmVzc2lvbikKICAgICAgIEJSLm1hcmtJbnZhbGlkKFJldHVyblZpc2l0b3I6OmdldFRhZygpLCBTdGFja0ZyYW1lKTsKICAgICByZXR1cm4gMDsKQEAgLTg2OSw3ICs4NjksNyBAQAogCiAgIC8vIFBlZWwgb2ZmIHRoZSB0ZXJuYXJ5IG9wZXJhdG9yLgogICBpZiAoY29uc3QgQ29uZGl0aW9uYWxPcGVyYXRvciAqQ08gPSBkeW5fY2FzdDxDb25kaXRpb25hbE9wZXJhdG9yPihFeCkpIHsKLSAgICAvLyBGaW5kIGEgbm9kZSB3aGVyZSB0aGUgYnJhbmNoaW5nIG9jY3VyZWQgYW5kIGZpbmQgb3V0IHdoaWNoIGJyYW5jaAorICAgIC8vIEZpbmQgYSBub2RlIHdoZXJlIHRoZSBicmFuY2hpbmcgb2NjdXJyZWQgYW5kIGZpbmQgb3V0IHdoaWNoIGJyYW5jaAogICAgIC8vIHdlIHRvb2sgKHRydWUvZmFsc2UpIGJ5IGxvb2tpbmcgYXQgdGhlIEV4cGxvZGVkR3JhcGguCiAgICAgY29uc3QgRXhwbG9kZWROb2RlICpOSSA9IE47CiAgICAgZG8gewpAQCAtMTA4Nyw3ICsxMDg3LDkgQEAKICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhCdWYpOwogCiAgIGlmIChjb25zdCBPYmpDTWVzc2FnZUV4cHIgKk1FID0gZHluX2Nhc3Q8T2JqQ01lc3NhZ2VFeHByPihTKSkgewotICAgIE9TIDw8ICInIiA8PCBNRS0+Z2V0U2VsZWN0b3IoKS5nZXRBc1N0cmluZygpIDw8ICInIG5vdCBjYWxsZWQiOworICAgIE9TIDw8ICInIjsKKyAgICBNRS0+Z2V0U2VsZWN0b3IoKS5wcmludChPUyk7CisgICAgT1MgPDwgIicgbm90IGNhbGxlZCI7CiAgIH0KICAgZWxzZSB7CiAgICAgT1MgPDwgIk5vIG1ldGhvZCBpcyBjYWxsZWQiOwpAQCAtMTU1NiwyNSArMTU1OCwxOCBAQAogICAgICAgLy8gICBzdGQ6OnUxNnN0cmluZyBzOyBzICs9IHUnYSc7CiAgICAgICAvLyBiZWNhdXNlIHdlIGNhbm5vdCByZWFzb24gYWJvdXQgdGhlIGludGVybmFsIGludmFyaWFudHMgb2YgdGhlCiAgICAgICAvLyBkYXRhc3RydWN0dXJlLgotICAgICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4ID0gTi0+Z2V0TG9jYXRpb25Db250ZXh0KCk7Ci0gICAgICBkbyB7CisgICAgICBmb3IgKGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCA9IE4tPmdldExvY2F0aW9uQ29udGV4dCgpOyBMQ3R4OworICAgICAgICAgICBMQ3R4ID0gTEN0eC0+Z2V0UGFyZW50KCkpIHsKICAgICAgICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqTUQgPSBkeW5fY2FzdDxDWFhNZXRob2REZWNsPihMQ3R4LT5nZXREZWNsKCkpOwogICAgICAgICBpZiAoIU1EKQotICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIGNvbnN0IENYWFJlY29yZERlY2wgKkNEID0gTUQtPmdldFBhcmVudCgpOwogICAgICAgICBpZiAoQ0QtPmdldE5hbWUoKSA9PSAiYmFzaWNfc3RyaW5nIikgewogICAgICAgICAgIEJSLm1hcmtJbnZhbGlkKGdldFRhZygpLCAwKTsKICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIGlmIChDRC0+Z2V0TmFtZSgpLmZpbmQoImFsbG9jYXRvciIpID09IFN0cmluZ1JlZjo6bnBvcykgewotICAgICAgICAgIC8vIE9ubHkga2VlcCBzZWFyY2hpbmcgaWYgdGhlIGN1cnJlbnQgbWV0aG9kIGlzIGluIGEgY2xhc3Mgd2l0aCB0aGUKLSAgICAgICAgICAvLyB3b3JkICJhbGxvY2F0b3IiIGluIGl0cyBuYW1lLCBlLmcuIHN0ZDo6YWxsb2NhdG9yIG9yCi0gICAgICAgICAgLy8gYWxsb2NhdG9yX3RyYWl0cy4KLSAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCi0gICAgICAgIExDdHggPSBMQ3R4LT5nZXRQYXJlbnQoKTsKLSAgICAgIH0gd2hpbGUgKExDdHgpOworICAgICAgfQogICAgIH0KICAgfQogCkBAIC0xNjExLDggKzE2MDYsMTAgQEAKICAgQ2FsbEV2ZW50TWFuYWdlciAmQ0VNZ3IgPSBCUkMuZ2V0U3RhdGVNYW5hZ2VyKCkuZ2V0Q2FsbEV2ZW50TWFuYWdlcigpOwogICBDYWxsRXZlbnRSZWY8PiBDYWxsID0gQ0VNZ3IuZ2V0Q2FsbGVyKENFbnRlci0+Z2V0Q2FsbGVlQ29udGV4dCgpLCBTdGF0ZSk7CiAgIHVuc2lnbmVkIElkeCA9IDA7Ci0gIGZvciAoQ2FsbEV2ZW50OjpwYXJhbV9pdGVyYXRvciBJID0gQ2FsbC0+cGFyYW1fYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBDYWxsLT5wYXJhbV9lbmQoKTsgSSAhPSBFOyArK0ksICsrSWR4KSB7CisgIEFycmF5UmVmPFBhcm1WYXJEZWNsKj4gcGFybXMgPSBDYWxsLT5wYXJhbWV0ZXJzKCk7CisKKyAgZm9yIChBcnJheVJlZjxQYXJtVmFyRGVjbCo+OjppdGVyYXRvciBJID0gcGFybXMuYmVnaW4oKSwgRSA9IHBhcm1zLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSAhPSBFOyArK0ksICsrSWR4KSB7CiAgICAgY29uc3QgTWVtUmVnaW9uICpBcmdSZWcgPSBDYWxsLT5nZXRBcmdTVmFsKElkeCkuZ2V0QXNSZWdpb24oKTsKIAogICAgIC8vIEFyZSB3ZSB0cmFja2luZyB0aGUgYXJndW1lbnQgb3IgaXRzIHN1YnJlZ2lvbj8KZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0NNYWtlTGlzdHMudHh0IGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQ01ha2VMaXN0cy50eHQKaW5kZXggMDEzZjhhNS4uM2EwMDEzMSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQ01ha2VMaXN0cy50eHQKQEAgLTM5LDIxICszOSwxMSBAQAogICBTdG9yZS5jcHAKICAgU3ViRW5naW5lLmNwcAogICBTeW1ib2xNYW5hZ2VyLmNwcAotICApCiAKLWFkZF9kZXBlbmRlbmNpZXMoY2xhbmdTdGF0aWNBbmFseXplckNvcmUKLSAgQ2xhbmdBdHRyQ2xhc3NlcwotICBDbGFuZ0F0dHJMaXN0Ci0gIENsYW5nQ29tbWVudE5vZGVzCi0gIENsYW5nRGVjbE5vZGVzCi0gIENsYW5nRGlhZ25vc3RpY0NvbW1vbgotICBDbGFuZ1N0bXROb2RlcwotICApCi0KLXRhcmdldF9saW5rX2xpYnJhcmllcyhjbGFuZ1N0YXRpY0FuYWx5emVyQ29yZQorICBMSU5LX0xJQlMKKyAgY2xhbmdBU1QKKyAgY2xhbmdBbmFseXNpcwogICBjbGFuZ0Jhc2ljCiAgIGNsYW5nTGV4Ci0gIGNsYW5nQVNUCi0gIGNsYW5nRnJvbnRlbmQKICAgY2xhbmdSZXdyaXRlQ29yZQogICApCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9DYWxsRXZlbnQuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2FsbEV2ZW50LmNwcAppbmRleCBhM2IzNGY0Li44NGE3NjlmIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9DYWxsRXZlbnQuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0NhbGxFdmVudC5jcHAKQEAgLTY4LDggKzY4LDcgQEAKIAogICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqUlQgPSBULT5nZXRBc1N0cnVjdHVyZVR5cGUoKSkgewogICAgIGNvbnN0IFJlY29yZERlY2wgKlJEID0gUlQtPmdldERlY2woKTsKLSAgICBmb3IgKFJlY29yZERlY2w6OmZpZWxkX2l0ZXJhdG9yIEkgPSBSRC0+ZmllbGRfYmVnaW4oKSwgRSA9IFJELT5maWVsZF9lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgZm9yIChjb25zdCBhdXRvICpJIDogUkQtPmZpZWxkcygpKSB7CiAgICAgICBRdWFsVHlwZSBGaWVsZFQgPSBJLT5nZXRUeXBlKCk7CiAgICAgICBpZiAoRmllbGRULT5pc0Jsb2NrUG9pbnRlclR5cGUoKSB8fCBGaWVsZFQtPmlzRnVuY3Rpb25Qb2ludGVyVHlwZSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTIwOSw5ICsyMDgsNyBAQAogICByZXR1cm4gZ2V0U1ZhbChFKTsKIH0KIAotdm9pZCBDYWxsRXZlbnQ6OmR1bXAoKSBjb25zdCB7Ci0gIGR1bXAobGx2bTo6ZXJycygpKTsKLX0KK0xMVk1fRFVNUF9NRVRIT0Qgdm9pZCBDYWxsRXZlbnQ6OmR1bXAoKSBjb25zdCB7IGR1bXAobGx2bTo6ZXJycygpKTsgfQogCiB2b2lkIENhbGxFdmVudDo6ZHVtcChyYXdfb3N0cmVhbSAmT3V0KSBjb25zdCB7CiAgIEFTVENvbnRleHQgJkN0eCA9IGdldFN0YXRlKCktPmdldFN0YXRlTWFuYWdlcigpLmdldENvbnRleHQoKTsKQEAgLTI0MSw5ICsyMzgsOSBAQAogUXVhbFR5cGUgQ2FsbEV2ZW50OjpnZXREZWNsYXJlZFJlc3VsdFR5cGUoY29uc3QgRGVjbCAqRCkgewogICBhc3NlcnQoRCk7CiAgIGlmIChjb25zdCBGdW5jdGlvbkRlY2wqIEZEID0gZHluX2Nhc3Q8RnVuY3Rpb25EZWNsPihEKSkKLSAgICByZXR1cm4gRkQtPmdldFJlc3VsdFR5cGUoKTsKKyAgICByZXR1cm4gRkQtPmdldFJldHVyblR5cGUoKTsKICAgaWYgKGNvbnN0IE9iakNNZXRob2REZWNsKiBNRCA9IGR5bl9jYXN0PE9iakNNZXRob2REZWNsPihEKSkKLSAgICByZXR1cm4gTUQtPmdldFJlc3VsdFR5cGUoKTsKKyAgICByZXR1cm4gTUQtPmdldFJldHVyblR5cGUoKTsKICAgaWYgKGNvbnN0IEJsb2NrRGVjbCAqQkQgPSBkeW5fY2FzdDxCbG9ja0RlY2w+KEQpKSB7CiAgICAgLy8gQmxvY2tzIGFyZSBkaWZmaWN1bHQgYmVjYXVzZSB0aGUgcmV0dXJuIHR5cGUgbWF5IG5vdCBiZSBzdG9yZWQgaW4gdGhlCiAgICAgLy8gQmxvY2tEZWNsIGl0c2VsZi4gVGhlIEFTVCBzaG91bGQgcHJvYmFibHkgYmUgZW5oYW5jZWQsIGJ1dCBmb3Igbm93IHdlCkBAIC0yNTYsNyArMjUzLDcgQEAKICAgICBpZiAoY29uc3QgVHlwZVNvdXJjZUluZm8gKlRTSSA9IEJELT5nZXRTaWduYXR1cmVBc1dyaXR0ZW4oKSkgewogICAgICAgUXVhbFR5cGUgVHkgPSBUU0ktPmdldFR5cGUoKTsKICAgICAgIGlmIChjb25zdCBGdW5jdGlvblR5cGUgKkZUID0gVHktPmdldEFzPEZ1bmN0aW9uVHlwZT4oKSkKLSAgICAgICAgVHkgPSBGVC0+Z2V0UmVzdWx0VHlwZSgpOworICAgICAgICBUeSA9IEZULT5nZXRSZXR1cm5UeXBlKCk7CiAgICAgICBpZiAoIVR5LT5pc0RlcGVuZGVudFR5cGUoKSkKICAgICAgICAgcmV0dXJuIFR5OwogICAgIH0KQEAgLTI4NCwxNCArMjgxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxFdmVudDo6QmluZGluZ3NUeSAmQmluZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWYWxCdWlsZGVyICZTVkIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAmQ2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEV2ZW50OjpwYXJhbV9pdGVyYXRvciBJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsRXZlbnQ6OnBhcmFtX2l0ZXJhdG9yIEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGFybVZhckRlY2wqPiBwYXJhbWV0ZXJzKSB7CiAgIE1lbVJlZ2lvbk1hbmFnZXIgJk1STWdyID0gU1ZCLmdldFJlZ2lvbk1hbmFnZXIoKTsKIAogICAvLyBJZiB0aGUgZnVuY3Rpb24gaGFzIGZld2VyIHBhcmFtZXRlcnMgdGhhbiB0aGUgY2FsbCBoYXMgYXJndW1lbnRzLCB3ZSBzaW1wbHkKICAgLy8gZG8gbm90IGJpbmQgYW55IHZhbHVlcyB0byB0aGVtLgogICB1bnNpZ25lZCBOdW1BcmdzID0gQ2FsbC5nZXROdW1BcmdzKCk7CiAgIHVuc2lnbmVkIElkeCA9IDA7CisgIEFycmF5UmVmPFBhcm1WYXJEZWNsKj46Oml0ZXJhdG9yIEkgPSBwYXJhbWV0ZXJzLmJlZ2luKCksIEUgPSBwYXJhbWV0ZXJzLmVuZCgpOwogICBmb3IgKDsgSSAhPSBFICYmIElkeCA8IE51bUFyZ3M7ICsrSSwgKytJZHgpIHsKICAgICBjb25zdCBQYXJtVmFyRGVjbCAqUGFyYW1EZWNsID0gKkk7CiAgICAgYXNzZXJ0KFBhcmFtRGVjbCAmJiAiRm9ybWFsIHBhcmFtZXRlciBoYXMgbm8gZGVjbD8iKTsKQEAgLTMwNiwyMSArMzAzLDExIEBACiAgIC8vIEZJWE1FOiBWYXJpYWRpYyBhcmd1bWVudHMgYXJlIG5vdCBoYW5kbGVkIGF0IGFsbCByaWdodCBub3cuCiB9CiAKLQotQ2FsbEV2ZW50OjpwYXJhbV9pdGVyYXRvciBBbnlGdW5jdGlvbkNhbGw6OnBhcmFtX2JlZ2luKCkgY29uc3QgeworQXJyYXlSZWY8UGFybVZhckRlY2wqPiBBbnlGdW5jdGlvbkNhbGw6OnBhcmFtZXRlcnMoKSBjb25zdCB7CiAgIGNvbnN0IEZ1bmN0aW9uRGVjbCAqRCA9IGdldERlY2woKTsKICAgaWYgKCFEKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBELT5wYXJhbV9iZWdpbigpOwotfQotCi1DYWxsRXZlbnQ6OnBhcmFtX2l0ZXJhdG9yIEFueUZ1bmN0aW9uQ2FsbDo6cGFyYW1fZW5kKCkgY29uc3QgewotICBjb25zdCBGdW5jdGlvbkRlY2wgKkQgPSBnZXREZWNsKCk7Ci0gIGlmICghRCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gRC0+cGFyYW1fZW5kKCk7CisgICAgcmV0dXJuIGxsdm06OkFycmF5UmVmPFBhcm1WYXJEZWNsKj4oKTsKKyAgcmV0dXJuIEQtPnBhcmFtZXRlcnMoKTsKIH0KIAogdm9pZCBBbnlGdW5jdGlvbkNhbGw6OmdldEluaXRpYWxTdGFja0ZyYW1lQ29udGVudHMoCkBAIC0zMjksNyArMzE2LDcgQEAKICAgY29uc3QgRnVuY3Rpb25EZWNsICpEID0gY2FzdDxGdW5jdGlvbkRlY2w+KENhbGxlZUN0eC0+Z2V0RGVjbCgpKTsKICAgU1ZhbEJ1aWxkZXIgJlNWQiA9IGdldFN0YXRlKCktPmdldFN0YXRlTWFuYWdlcigpLmdldFNWYWxCdWlsZGVyKCk7CiAgIGFkZFBhcmFtZXRlclZhbHVlc1RvQmluZGluZ3MoQ2FsbGVlQ3R4LCBCaW5kaW5ncywgU1ZCLCAqdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBELT5wYXJhbV9iZWdpbigpLCBELT5wYXJhbV9lbmQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC0+cGFyYW1ldGVycygpKTsKIH0KIAogYm9vbCBBbnlGdW5jdGlvbkNhbGw6OmFyZ3VtZW50c01heUVzY2FwZSgpIGNvbnN0IHsKQEAgLTM4OSw3ICszNzYsNyBAQAogfQogCiAKLWNvbnN0IEZ1bmN0aW9uRGVjbCAqU2ltcGxlQ2FsbDo6Z2V0RGVjbCgpIGNvbnN0IHsKK2NvbnN0IEZ1bmN0aW9uRGVjbCAqU2ltcGxlRnVuY3Rpb25DYWxsOjpnZXREZWNsKCkgY29uc3QgewogICBjb25zdCBGdW5jdGlvbkRlY2wgKkQgPSBnZXRPcmlnaW5FeHByKCktPmdldERpcmVjdENhbGxlZSgpOwogICBpZiAoRCkKICAgICByZXR1cm4gRDsKQEAgLTU1MCwxOCArNTM3LDExIEBACiAgIHJldHVybiBkeW5fY2FzdF9vcl9udWxsPEJsb2NrRGF0YVJlZ2lvbj4oRGF0YVJlZyk7CiB9CiAKLUNhbGxFdmVudDo6cGFyYW1faXRlcmF0b3IgQmxvY2tDYWxsOjpwYXJhbV9iZWdpbigpIGNvbnN0IHsKLSAgY29uc3QgQmxvY2tEZWNsICpEID0gZ2V0QmxvY2tEZWNsKCk7CitBcnJheVJlZjxQYXJtVmFyRGVjbCo+IEJsb2NrQ2FsbDo6cGFyYW1ldGVycygpIGNvbnN0IHsKKyAgY29uc3QgQmxvY2tEZWNsICpEID0gZ2V0RGVjbCgpOwogICBpZiAoIUQpCiAgICAgcmV0dXJuIDA7Ci0gIHJldHVybiBELT5wYXJhbV9iZWdpbigpOwotfQotCi1DYWxsRXZlbnQ6OnBhcmFtX2l0ZXJhdG9yIEJsb2NrQ2FsbDo6cGFyYW1fZW5kKCkgY29uc3QgewotICBjb25zdCBCbG9ja0RlY2wgKkQgPSBnZXRCbG9ja0RlY2woKTsKLSAgaWYgKCFEKQotICAgIHJldHVybiAwOwotICByZXR1cm4gRC0+cGFyYW1fZW5kKCk7CisgIHJldHVybiBELT5wYXJhbWV0ZXJzKCk7CiB9CiAKIHZvaWQgQmxvY2tDYWxsOjpnZXRFeHRyYUludmFsaWRhdGVkVmFsdWVzKFZhbHVlTGlzdCAmVmFsdWVzKSBjb25zdCB7CkBAIC01NzUsNyArNTU1LDcgQEAKICAgY29uc3QgQmxvY2tEZWNsICpEID0gY2FzdDxCbG9ja0RlY2w+KENhbGxlZUN0eC0+Z2V0RGVjbCgpKTsKICAgU1ZhbEJ1aWxkZXIgJlNWQiA9IGdldFN0YXRlKCktPmdldFN0YXRlTWFuYWdlcigpLmdldFNWYWxCdWlsZGVyKCk7CiAgIGFkZFBhcmFtZXRlclZhbHVlc1RvQmluZGluZ3MoQ2FsbGVlQ3R4LCBCaW5kaW5ncywgU1ZCLCAqdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBELT5wYXJhbV9iZWdpbigpLCBELT5wYXJhbV9lbmQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC0+cGFyYW1ldGVycygpKTsKIH0KIAogCkBAIC02MDQsOCArNTg0LDYgQEAKICAgfQogfQogCi0KLQogU1ZhbCBDWFhEZXN0cnVjdG9yQ2FsbDo6Z2V0Q1hYVGhpc1ZhbCgpIGNvbnN0IHsKICAgaWYgKERhdGEpCiAgICAgcmV0dXJuIGxvYzo6TWVtUmVnaW9uVmFsKER0b3JEYXRhVHk6OmdldEZyb21PcGFxdWVWYWx1ZShEYXRhKS5nZXRQb2ludGVyKCkpOwpAQCAtNjIxLDIxICs1OTksMTEgQEAKICAgcmV0dXJuIENYWEluc3RhbmNlQ2FsbDo6Z2V0UnVudGltZURlZmluaXRpb24oKTsKIH0KIAotCi1DYWxsRXZlbnQ6OnBhcmFtX2l0ZXJhdG9yIE9iakNNZXRob2RDYWxsOjpwYXJhbV9iZWdpbigpIGNvbnN0IHsKK0FycmF5UmVmPFBhcm1WYXJEZWNsKj4gT2JqQ01ldGhvZENhbGw6OnBhcmFtZXRlcnMoKSBjb25zdCB7CiAgIGNvbnN0IE9iakNNZXRob2REZWNsICpEID0gZ2V0RGVjbCgpOwogICBpZiAoIUQpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIEQtPnBhcmFtX2JlZ2luKCk7Ci19Ci0KLUNhbGxFdmVudDo6cGFyYW1faXRlcmF0b3IgT2JqQ01ldGhvZENhbGw6OnBhcmFtX2VuZCgpIGNvbnN0IHsKLSAgY29uc3QgT2JqQ01ldGhvZERlY2wgKkQgPSBnZXREZWNsKCk7Ci0gIGlmICghRCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gRC0+cGFyYW1fZW5kKCk7CisgICAgcmV0dXJuIEFycmF5UmVmPFBhcm1WYXJEZWNsKj4oKTsKKyAgcmV0dXJuIEQtPnBhcmFtZXRlcnMoKTsKIH0KIAogdm9pZApAQCAtODY1LDkgKzgzMywxNyBAQAogICAgICAgICBPcHRpb25hbDxjb25zdCBPYmpDTWV0aG9kRGVjbCAqPiAmVmFsID0gUE1DW3N0ZDo6bWFrZV9wYWlyKElEZWNsLCBTZWwpXTsKIAogICAgICAgICAvLyBRdWVyeSBsb29rdXBQcml2YXRlTWV0aG9kKCkgaWYgdGhlIGNhY2hlIGRvZXMgbm90IGhpdC4KLSAgICAgICAgaWYgKCFWYWwuaGFzVmFsdWUoKSkKKyAgICAgICAgaWYgKCFWYWwuaGFzVmFsdWUoKSkgewogICAgICAgICAgIFZhbCA9IElEZWNsLT5sb29rdXBQcml2YXRlTWV0aG9kKFNlbCk7CiAKKyAgICAgICAgICAvLyBJZiB0aGUgbWV0aG9kIGlzIGEgcHJvcGVydHkgYWNjZXNzb3IsIHdlIHNob3VsZCB0cnkgdG8gImlubGluZSIgaXQKKyAgICAgICAgICAvLyBldmVuIGlmIHdlIGRvbid0IGFjdHVhbGx5IGhhdmUgYW4gaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgaWYgKCEqVmFsKQorICAgICAgICAgICAgaWYgKGNvbnN0IE9iakNNZXRob2REZWNsICpDb21waWxlVGltZU1EID0gRS0+Z2V0TWV0aG9kRGVjbCgpKQorICAgICAgICAgICAgICBpZiAoQ29tcGlsZVRpbWVNRC0+aXNQcm9wZXJ0eUFjY2Vzc29yKCkpCisgICAgICAgICAgICAgICAgVmFsID0gSURlY2wtPmxvb2t1cEluc3RhbmNlTWV0aG9kKFNlbCk7CisgICAgICAgIH0KKwogICAgICAgICBjb25zdCBPYmpDTWV0aG9kRGVjbCAqTUQgPSBWYWwuZ2V0VmFsdWUoKTsKICAgICAgICAgaWYgKENhbkJlU3ViQ2xhc3NlZCkKICAgICAgICAgICByZXR1cm4gUnVudGltZURlZmluaXRpb24oTUQsIFJlY2VpdmVyKTsKQEAgLTg4OCwxMyArODY0LDI0IEBACiAgIHJldHVybiBSdW50aW1lRGVmaW5pdGlvbigpOwogfQogCitib29sIE9iakNNZXRob2RDYWxsOjphcmd1bWVudHNNYXlFc2NhcGUoKSBjb25zdCB7CisgIGlmIChpc0luU3lzdGVtSGVhZGVyKCkgJiYgIWlzSW5zdGFuY2VNZXNzYWdlKCkpIHsKKyAgICBTZWxlY3RvciBTZWwgPSBnZXRTZWxlY3RvcigpOworICAgIGlmIChTZWwuZ2V0TnVtQXJncygpID09IDEgJiYKKyAgICAgICAgU2VsLmdldElkZW50aWZpZXJJbmZvRm9yU2xvdCgwKS0+aXNTdHIoInZhbHVlV2l0aFBvaW50ZXIiKSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIENhbGxFdmVudDo6YXJndW1lbnRzTWF5RXNjYXBlKCk7Cit9CisKIHZvaWQgT2JqQ01ldGhvZENhbGw6OmdldEluaXRpYWxTdGFja0ZyYW1lQ29udGVudHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqQ2FsbGVlQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ3NUeSAmQmluZGluZ3MpIGNvbnN0IHsKICAgY29uc3QgT2JqQ01ldGhvZERlY2wgKkQgPSBjYXN0PE9iakNNZXRob2REZWNsPihDYWxsZWVDdHgtPmdldERlY2woKSk7CiAgIFNWYWxCdWlsZGVyICZTVkIgPSBnZXRTdGF0ZSgpLT5nZXRTdGF0ZU1hbmFnZXIoKS5nZXRTVmFsQnVpbGRlcigpOwogICBhZGRQYXJhbWV0ZXJWYWx1ZXNUb0JpbmRpbmdzKENhbGxlZUN0eCwgQmluZGluZ3MsIFNWQiwgKnRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC0+cGFyYW1fYmVnaW4oKSwgRC0+cGFyYW1fZW5kKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQtPnBhcmFtZXRlcnMoKSk7CiAKICAgU1ZhbCBTZWxmVmFsID0gZ2V0UmVjZWl2ZXJTVmFsKCk7CiAgIGlmICghU2VsZlZhbC5pc1Vua25vd24oKSkgewpAQCAtOTIzLDcgKzkxMCw3IEBACiAKICAgLy8gT3RoZXJ3aXNlLCBpdCdzIGEgbm9ybWFsIGZ1bmN0aW9uIGNhbGwsIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gY2FsbCwgb3IKICAgLy8gc29tZXRoaW5nIHdlIGNhbid0IHJlYXNvbiBhYm91dC4KLSAgcmV0dXJuIGNyZWF0ZTxGdW5jdGlvbkNhbGw+KENFLCBTdGF0ZSwgTEN0eCk7CisgIHJldHVybiBjcmVhdGU8U2ltcGxlRnVuY3Rpb25DYWxsPihDRSwgU3RhdGUsIExDdHgpOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0NoZWNrZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlci5jcHAKaW5kZXggMDdlMGFhYy4uMWEzOTY1YSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlci5jcHAKQEAgLTE4LDggKzE4LDIzIEBACiB1c2luZyBuYW1lc3BhY2UgZW50bzsKIAogU3RyaW5nUmVmIENoZWNrZXJCYXNlOjpnZXRUYWdEZXNjcmlwdGlvbigpIGNvbnN0IHsKLSAgLy8gRklYTUU6IFdlIHdhbnQgdG8gcmV0dXJuIHRoZSBwYWNrYWdlICsgbmFtZSBvZiB0aGUgY2hlY2tlciBoZXJlLgotICByZXR1cm4gIkEgQ2hlY2tlciI7ICAKKyAgcmV0dXJuIGdldENoZWNrTmFtZSgpLmdldE5hbWUoKTsKK30KKworQ2hlY2tOYW1lIENoZWNrZXJCYXNlOjpnZXRDaGVja05hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKK0NoZWNrZXJQcm9ncmFtUG9pbnRUYWc6OkNoZWNrZXJQcm9ncmFtUG9pbnRUYWcoU3RyaW5nUmVmIENoZWNrZXJOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1zZykKKyAgOiBTaW1wbGVQcm9ncmFtUG9pbnRUYWcoQ2hlY2tlck5hbWUsIE1zZykge30KKworQ2hlY2tlclByb2dyYW1Qb2ludFRhZzo6Q2hlY2tlclByb2dyYW1Qb2ludFRhZyhjb25zdCBDaGVja2VyQmFzZSAqQ2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1zZykKKyAgOiBTaW1wbGVQcm9ncmFtUG9pbnRUYWcoQ2hlY2tlci0+Z2V0Q2hlY2tOYW1lKCkuZ2V0TmFtZSgpLCBNc2cpIHt9CisKK3Jhd19vc3RyZWFtJiBjbGFuZzo6ZW50bzo6b3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoZWNrZXJCYXNlICZDaGVja2VyKSB7CisgIE91dCA8PCBDaGVja2VyLmdldENoZWNrTmFtZSgpLmdldE5hbWUoKTsKKyAgcmV0dXJuIE91dDsKIH0KIAogdm9pZCBDaGVja2VyPGNoZWNrOjpfVm9pZENoZWNrLCBjaGVjazo6X1ZvaWRDaGVjaywgY2hlY2s6Ol9Wb2lkQ2hlY2ssCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyUmVnaXN0cnkuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlclJlZ2lzdHJ5LmNwcAppbmRleCA0NzI5OTAzLi5kNGFmZWRhIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyUmVnaXN0cnkuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0NoZWNrZXJSZWdpc3RyeS5jcHAKQEAgLTg0LDEwICs4NCwxMCBAQAogCiAgIC8vIFJlY29yZCB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNoZWNrZXIgaW4gaXRzIHBhY2thZ2VzLgogICBTdHJpbmdSZWYgcGFja2FnZU5hbWUsIGxlYWZOYW1lOwotICBsbHZtOjp0aWUocGFja2FnZU5hbWUsIGxlYWZOYW1lKSA9IG5hbWUucnNwbGl0KFBhY2thZ2VTZXBhcmF0b3IpOworICBzdGQ6OnRpZShwYWNrYWdlTmFtZSwgbGVhZk5hbWUpID0gbmFtZS5yc3BsaXQoUGFja2FnZVNlcGFyYXRvcik7CiAgIHdoaWxlICghbGVhZk5hbWUuZW1wdHkoKSkgewogICAgIFBhY2thZ2VzW3BhY2thZ2VOYW1lXSArPSAxOwotICAgIGxsdm06OnRpZShwYWNrYWdlTmFtZSwgbGVhZk5hbWUpID0gcGFja2FnZU5hbWUucnNwbGl0KFBhY2thZ2VTZXBhcmF0b3IpOworICAgIHN0ZDo6dGllKHBhY2thZ2VOYW1lLCBsZWFmTmFtZSkgPSBwYWNrYWdlTmFtZS5yc3BsaXQoUGFja2FnZVNlcGFyYXRvcik7CiAgIH0KIH0KIApAQCAtMTA2LDYgKzEwNiw3IEBACiAgIC8vIEluaXRpYWxpemUgdGhlIENoZWNrZXJNYW5hZ2VyIHdpdGggYWxsIGVuYWJsZWQgY2hlY2tlcnMuCiAgIGZvciAoQ2hlY2tlckluZm9TZXQ6Oml0ZXJhdG9yCiAgICAgICAgICBpID0gZW5hYmxlZENoZWNrZXJzLmJlZ2luKCksIGUgPSBlbmFibGVkQ2hlY2tlcnMuZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgY2hlY2tlck1nci5zZXRDdXJyZW50Q2hlY2tOYW1lKENoZWNrTmFtZSgoKmkpLT5GdWxsTmFtZSkpOwogICAgICgqaSktPkluaXRpYWxpemUoY2hlY2tlck1ncik7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0NvcmVFbmdpbmUuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQ29yZUVuZ2luZS5jcHAKaW5kZXggYjA5YjJjMi4uODk3MTY0YiAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQ29yZUVuZ2luZS5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQ29yZUVuZ2luZS5jcHAKQEAgLTQzLDIyICs0MywyMiBAQAogY2xhc3MgREZTIDogcHVibGljIFdvcmtMaXN0IHsKICAgU21hbGxWZWN0b3I8V29ya0xpc3RVbml0LDIwPiBTdGFjazsKIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIGhhc1dvcmsoKSBjb25zdCB7CisgIGJvb2wgaGFzV29yaygpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gIVN0YWNrLmVtcHR5KCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgZW5xdWV1ZShjb25zdCBXb3JrTGlzdFVuaXQmIFUpIHsKKyAgdm9pZCBlbnF1ZXVlKGNvbnN0IFdvcmtMaXN0VW5pdCYgVSkgb3ZlcnJpZGUgewogICAgIFN0YWNrLnB1c2hfYmFjayhVKTsKICAgfQogCi0gIHZpcnR1YWwgV29ya0xpc3RVbml0IGRlcXVldWUoKSB7CisgIFdvcmtMaXN0VW5pdCBkZXF1ZXVlKCkgb3ZlcnJpZGUgewogICAgIGFzc2VydCAoIVN0YWNrLmVtcHR5KCkpOwogICAgIGNvbnN0IFdvcmtMaXN0VW5pdCYgVSA9IFN0YWNrLmJhY2soKTsKICAgICBTdGFjay5wb3BfYmFjaygpOyAvLyBUaGlzIHRlY2huaWNhbGx5ICJpbnZhbGlkYXRlcyIgVSwgYnV0IHdlIGFyZSBmaW5lLgogICAgIHJldHVybiBVOwogICB9Ci0gIAotICB2aXJ0dWFsIGJvb2wgdmlzaXRJdGVtc0luV29ya0xpc3QoVmlzaXRvciAmVikgeworCisgIGJvb2wgdmlzaXRJdGVtc0luV29ya0xpc3QoVmlzaXRvciAmVikgb3ZlcnJpZGUgewogICAgIGZvciAoU21hbGxWZWN0b3JJbXBsPFdvcmtMaXN0VW5pdD46Oml0ZXJhdG9yCiAgICAgICAgICBJID0gU3RhY2suYmVnaW4oKSwgRSA9IFN0YWNrLmVuZCgpOyBJICE9IEU7ICsrSSkgewogICAgICAgaWYgKFYudmlzaXQoKkkpKQpAQCAtNzEsMjEgKzcxLDIxIEBACiBjbGFzcyBCRlMgOiBwdWJsaWMgV29ya0xpc3QgewogICBzdGQ6OmRlcXVlPFdvcmtMaXN0VW5pdD4gUXVldWU7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBoYXNXb3JrKCkgY29uc3QgeworICBib29sIGhhc1dvcmsoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuICFRdWV1ZS5lbXB0eSgpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGVucXVldWUoY29uc3QgV29ya0xpc3RVbml0JiBVKSB7CisgIHZvaWQgZW5xdWV1ZShjb25zdCBXb3JrTGlzdFVuaXQmIFUpIG92ZXJyaWRlIHsKICAgICBRdWV1ZS5wdXNoX2JhY2soVSk7CiAgIH0KIAotICB2aXJ0dWFsIFdvcmtMaXN0VW5pdCBkZXF1ZXVlKCkgeworICBXb3JrTGlzdFVuaXQgZGVxdWV1ZSgpIG92ZXJyaWRlIHsKICAgICBXb3JrTGlzdFVuaXQgVSA9IFF1ZXVlLmZyb250KCk7CiAgICAgUXVldWUucG9wX2Zyb250KCk7CiAgICAgcmV0dXJuIFU7CiAgIH0KLSAgCi0gIHZpcnR1YWwgYm9vbCB2aXNpdEl0ZW1zSW5Xb3JrTGlzdChWaXNpdG9yICZWKSB7CisKKyAgYm9vbCB2aXNpdEl0ZW1zSW5Xb3JrTGlzdChWaXNpdG9yICZWKSBvdmVycmlkZSB7CiAgICAgZm9yIChzdGQ6OmRlcXVlPFdvcmtMaXN0VW5pdD46Oml0ZXJhdG9yCiAgICAgICAgICBJID0gUXVldWUuYmVnaW4oKSwgRSA9IFF1ZXVlLmVuZCgpOyBJICE9IEU7ICsrSSkgewogICAgICAgaWYgKFYudmlzaXQoKkkpKQpAQCAtMTA5LDE4ICsxMDksMTggQEAKICAgICBzdGQ6OmRlcXVlPFdvcmtMaXN0VW5pdD4gUXVldWU7CiAgICAgU21hbGxWZWN0b3I8V29ya0xpc3RVbml0LDIwPiBTdGFjazsKICAgcHVibGljOgotICAgIHZpcnR1YWwgYm9vbCBoYXNXb3JrKCkgY29uc3QgeworICAgIGJvb2wgaGFzV29yaygpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHJldHVybiAhUXVldWUuZW1wdHkoKSB8fCAhU3RhY2suZW1wdHkoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZW5xdWV1ZShjb25zdCBXb3JrTGlzdFVuaXQmIFUpIHsKKyAgICB2b2lkIGVucXVldWUoY29uc3QgV29ya0xpc3RVbml0JiBVKSBvdmVycmlkZSB7CiAgICAgICBpZiAoVS5nZXROb2RlKCktPmdldExvY2F0aW9uKCkuZ2V0QXM8QmxvY2tFbnRyYW5jZT4oKSkKICAgICAgICAgUXVldWUucHVzaF9mcm9udChVKTsKICAgICAgIGVsc2UKICAgICAgICAgU3RhY2sucHVzaF9iYWNrKFUpOwogICAgIH0KIAotICAgIHZpcnR1YWwgV29ya0xpc3RVbml0IGRlcXVldWUoKSB7CisgICAgV29ya0xpc3RVbml0IGRlcXVldWUoKSBvdmVycmlkZSB7CiAgICAgICAvLyBQcm9jZXNzIGFsbCBiYXNpYyBibG9ja3MgdG8gY29tcGxldGlvbi4KICAgICAgIGlmICghU3RhY2suZW1wdHkoKSkgewogICAgICAgICBjb25zdCBXb3JrTGlzdFVuaXQmIFUgPSBTdGFjay5iYWNrKCk7CkBAIC0xMzUsNyArMTM1LDcgQEAKICAgICAgIFF1ZXVlLnBvcF9mcm9udCgpOwogICAgICAgcmV0dXJuIFU7CiAgICAgfQotICAgIHZpcnR1YWwgYm9vbCB2aXNpdEl0ZW1zSW5Xb3JrTGlzdChWaXNpdG9yICZWKSB7CisgICAgYm9vbCB2aXNpdEl0ZW1zSW5Xb3JrTGlzdChWaXNpdG9yICZWKSBvdmVycmlkZSB7CiAgICAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxXb3JrTGlzdFVuaXQ+OjppdGVyYXRvcgogICAgICAgICAgICBJID0gU3RhY2suYmVnaW4oKSwgRSA9IFN0YWNrLmVuZCgpOyBJICE9IEU7ICsrSSkgewogICAgICAgICBpZiAoVi52aXNpdCgqSSkpCkBAIC01MzIsNiArNTMyLDExIEBACiAgICAgcmV0dXJuOwogICB9CiAKKyAgaWYgKCgqQmxvY2spW0lkeF0uZ2V0S2luZCgpID09IENGR0VsZW1lbnQ6Ok5ld0FsbG9jYXRvcikgeworICAgIFdMaXN0LT5lbnF1ZXVlKE4sIEJsb2NrLCBJZHgrMSk7CisgICAgcmV0dXJuOworICB9CisKICAgLy8gQXQgdGhpcyBwb2ludCwgd2Uga25vdyB3ZSdyZSBwcm9jZXNzaW5nIGEgbm9ybWFsIHN0YXRlbWVudC4KICAgQ0ZHU3RtdCBDUyA9ICgqQmxvY2spW0lkeF0uY2FzdEFzPENGR1N0bXQ+KCk7CiAgIFBvc3RTdG10IExvYyhDUy5nZXRTdG10KCksIE4tPmdldExvY2F0aW9uQ29udGV4dCgpKTsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0Vudmlyb25tZW50LmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0Vudmlyb25tZW50LmNwcAppbmRleCA3YjEzM2Y2Li4wMDQxZDlmIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9FbnZpcm9ubWVudC5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvRW52aXJvbm1lbnQuY3BwCkBAIC0xMjMsMTEgKzEyMywxMSBAQAogICBTeW1ib2xSZWFwZXIgJlN5bVJlYXBlcjsKIHB1YmxpYzoKICAgTWFya0xpdmVDYWxsYmFjayhTeW1ib2xSZWFwZXIgJnN5bXJlYXBlcikgOiBTeW1SZWFwZXIoc3ltcmVhcGVyKSB7fQotICBib29sIFZpc2l0U3ltYm9sKFN5bWJvbFJlZiBzeW0pIHsKKyAgYm9vbCBWaXNpdFN5bWJvbChTeW1ib2xSZWYgc3ltKSBvdmVycmlkZSB7CiAgICAgU3ltUmVhcGVyLm1hcmtMaXZlKHN5bSk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KLSAgYm9vbCBWaXNpdE1lbVJlZ2lvbihjb25zdCBNZW1SZWdpb24gKlIpIHsKKyAgYm9vbCBWaXNpdE1lbVJlZ2lvbihjb25zdCBNZW1SZWdpb24gKlIpIG92ZXJyaWRlIHsKICAgICBTeW1SZWFwZXIubWFya0xpdmUoUik7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0V4cGxvZGVkR3JhcGguY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvRXhwbG9kZWRHcmFwaC5jcHAKaW5kZXggZTljNGEzNS4uNzgxMmM5NiAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvRXhwbG9kZWRHcmFwaC5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvRXhwbG9kZWRHcmFwaC5jcHAKQEAgLTkwLDggKzkwLDkgQEAKICAgLy8gKDcpIFRoZSBMb2NhdGlvbkNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhlIHByZWRlY2Vzc29yLgogICAvLyAoOCkgRXhwcmVzc2lvbnMgdGhhdCBhcmUgKm5vdCogbHZhbHVlIGV4cHJlc3Npb25zLgogICAvLyAoOSkgVGhlIFBvc3RTdG10IGlzbid0IGZvciBhIG5vbi1jb25zdW1lZCBTdG10IG9yIEV4cHIuCi0gIC8vICgxMCkgVGhlIHN1Y2Nlc3NvciBpcyBub3QgYSBDYWxsRXhwciBTdG10UG9pbnQgKHNvIHRoYXQgd2Ugd291bGQKLSAgLy8gICAgICBiZSBhYmxlIHRvIGZpbmQgaXQgd2hlbiByZXRyeWluZyBhIGNhbGwgd2l0aCBubyBpbmxpbmluZykuCisgIC8vICgxMCkgVGhlIHN1Y2Nlc3NvciBpcyBuZWl0aGVyIGEgQ2FsbEV4cHIgU3RtdFBvaW50IG5vciBhIENhbGxFbnRlciBvciAKKyAgLy8gICAgICBQcmVJbXBsaWNpdENhbGwgKHNvIHRoYXQgd2Ugd291bGQgYmUgYWJsZSB0byBmaW5kIGl0IHdoZW4gcmV0cnlpbmcgYSAKKyAgLy8gICAgICBjYWxsIHdpdGggbm8gaW5saW5pbmcpLgogICAvLyBGSVhNRTogSXQgbWF5IGJlIHNhZmUgdG8gcmVjbGFpbSBQcmVDYWxsIGFuZCBQb3N0Q2FsbCBub2RlcyBhcyB3ZWxsLgogCiAgIC8vIENvbmRpdGlvbnMgMSBhbmQgMi4KQEAgLTE1Myw2ICsxNTQsMTAgQEAKICAgICBpZiAoQ2FsbEV2ZW50Ojppc0NhbGxTdG10KFNQLT5nZXRTdG10KCkpKQogICAgICAgcmV0dXJuIGZhbHNlOwogCisgIC8vIENvbmRpdGlvbiAxMCwgY29udGludWF0aW9uLgorICBpZiAoU3VjY0xvYy5nZXRBczxDYWxsRW50ZXI+KCkgfHwgU3VjY0xvYy5nZXRBczxQcmVJbXBsaWNpdENhbGw+KCkpCisgICAgcmV0dXJuIGZhbHNlOworCiAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9FeHByRW5naW5lLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0V4cHJFbmdpbmUuY3BwCmluZGV4IDk5MDdkMGMuLmU3ZjQ5YjIgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0V4cHJFbmdpbmUuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0V4cHJFbmdpbmUuY3BwCkBAIC01NSw2ICs1NSw4IEBACiAvLyBFbmdpbmUgY29uc3RydWN0aW9uIGFuZCBkZWxldGlvbi4KIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKK3N0YXRpYyBjb25zdCBjaGFyKiBUYWdQcm92aWRlck5hbWUgPSAiRXhwckVuZ2luZSI7CisKIEV4cHJFbmdpbmU6OkV4cHJFbmdpbmUoQW5hbHlzaXNNYW5hZ2VyICZtZ3IsIGJvb2wgZ2NFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICBTZXRPZkNvbnN0RGVjbHMgKlZpc2l0ZWRDYWxsZWVzSW4sCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uU3VtbWFyaWVzVHkgKkZTLApAQCAtMTE4LDcgKzEyMCw3IEBACiAgICAgICBTVmFsIFYgPSBzdGF0ZS0+Z2V0U1ZhbChsb2M6Ok1lbVJlZ2lvblZhbChSKSk7CiAgICAgICBTVmFsIENvbnN0cmFpbnRfdW50ZXN0ZWQgPSBldmFsQmluT3Aoc3RhdGUsIEJPX0dULCBWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2YWxCdWlsZGVyLm1ha2VaZXJvVmFsKFQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5JbnRUeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZhbEJ1aWxkZXIuZ2V0Q29uZGl0aW9uVHlwZSgpKTsKIAogICAgICAgT3B0aW9uYWw8RGVmaW5lZE9yVW5rbm93blNWYWw+IENvbnN0cmFpbnQgPQogICAgICAgICAgIENvbnN0cmFpbnRfdW50ZXN0ZWQuZ2V0QXM8RGVmaW5lZE9yVW5rbm93blNWYWw+KCk7CkBAIC0yODYsNiArMjg4LDEwIEBACiAgICAgY2FzZSBDRkdFbGVtZW50OjpJbml0aWFsaXplcjoKICAgICAgIFByb2Nlc3NJbml0aWFsaXplcihFLmNhc3RBczxDRkdJbml0aWFsaXplcj4oKS5nZXRJbml0aWFsaXplcigpLCBQcmVkKTsKICAgICAgIHJldHVybjsKKyAgICBjYXNlIENGR0VsZW1lbnQ6Ok5ld0FsbG9jYXRvcjoKKyAgICAgIFByb2Nlc3NOZXdBbGxvY2F0b3IoRS5jYXN0QXM8Q0ZHTmV3QWxsb2NhdG9yPigpLmdldEFsbG9jYXRvckV4cHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZCk7CisgICAgICByZXR1cm47CiAgICAgY2FzZSBDRkdFbGVtZW50OjpBdXRvbWF0aWNPYmplY3REdG9yOgogICAgIGNhc2UgQ0ZHRWxlbWVudDo6RGVsZXRlRHRvcjoKICAgICBjYXNlIENGR0VsZW1lbnQ6OkJhc2VEdG9yOgpAQCAtMzYyLDcgKzM2OCw3IEBACiAKICAgLy8gUHJvY2VzcyBhbnkgc3BlY2lhbCB0cmFuc2ZlciBmdW5jdGlvbiBmb3IgZGVhZCBzeW1ib2xzLgogICAvLyBBIHRhZyB0byB0cmFjayBjb252ZW5pZW5jZSB0cmFuc2l0aW9ucywgd2hpY2ggY2FuIGJlIHJlbW92ZWQgYXQgY2xlYW51cC4KLSAgc3RhdGljIFNpbXBsZVByb2dyYW1Qb2ludFRhZyBjbGVhbnVwVGFnKCJFeHByRW5naW5lIDogQ2xlYW4gTm9kZSIpOworICBzdGF0aWMgU2ltcGxlUHJvZ3JhbVBvaW50VGFnIGNsZWFudXBUYWcoVGFnUHJvdmlkZXJOYW1lLCAiQ2xlYW4gTm9kZSIpOwogICBpZiAoIVN5bVJlYXBlci5oYXNEZWFkU3ltYm9scygpKSB7CiAgICAgLy8gR2VuZXJhdGUgYSBDbGVhbmVkTm9kZSB0aGF0IGhhcyB0aGUgZW52aXJvbm1lbnQgYW5kIHN0b3JlIGNsZWFuZWQKICAgICAvLyB1cC4gU2luY2Ugbm8gc3ltYm9scyBhcmUgZGVhZCwgd2UgY2FuIG9wdGltaXplIGFuZCBub3QgY2xlYW4gb3V0CkBAIC01NDcsNiArNTUzLDI1IEBACiAgIEVuZ2luZS5lbnF1ZXVlKERzdCwgY3VyckJsZHJDdHgtPmdldEJsb2NrKCksIGN1cnJTdG10SWR4KTsKIH0KIAordm9pZCBFeHByRW5naW5lOjpQcm9jZXNzTmV3QWxsb2NhdG9yKGNvbnN0IENYWE5ld0V4cHIgKk5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCkgeworICBFeHBsb2RlZE5vZGVTZXQgRHN0OworICBBbmFseXNpc01hbmFnZXIgJkFNZ3IgPSBnZXRBbmFseXNpc01hbmFnZXIoKTsKKyAgQW5hbHl6ZXJPcHRpb25zICZPcHRzID0gQU1nci5vcHRpb25zOworICAvLyBUT0RPOiBXZSdyZSBub3QgZXZhbHVhdGluZyBhbGxvY2F0b3JzIGZvciBhbGwgY2FzZXMganVzdCB5ZXQgYXMKKyAgLy8gd2UncmUgbm90IGhhbmRsaW5nIHRoZSByZXR1cm4gdmFsdWUgY29ycmVjdGx5LCB3aGljaCBjYXVzZXMgZmFsc2UKKyAgLy8gcG9zaXRpdmVzIHdoZW4gdGhlIGFscGhhLmNwbHVzcGx1cy5OZXdEZWxldGVMZWFrcyBjaGVjayBpcyBvbi4KKyAgaWYgKE9wdHMubWF5SW5saW5lQ1hYQWxsb2NhdG9yKCkpCisgICAgVmlzaXRDWFhOZXdBbGxvY2F0b3JDYWxsKE5FLCBQcmVkLCBEc3QpOworICBlbHNlIHsKKyAgICBOb2RlQnVpbGRlciBCbGRyKFByZWQsIERzdCwgKmN1cnJCbGRyQ3R4KTsKKyAgICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHggPSBQcmVkLT5nZXRMb2NhdGlvbkNvbnRleHQoKTsKKyAgICBQb3N0SW1wbGljaXRDYWxsIFBQKE5FLT5nZXRPcGVyYXRvck5ldygpLCBORS0+Z2V0TG9jU3RhcnQoKSwgTEN0eCk7CisgICAgQmxkci5nZW5lcmF0ZU5vZGUoUFAsIFByZWQtPmdldFN0YXRlKCksIFByZWQpOworICB9CisgIEVuZ2luZS5lbnF1ZXVlKERzdCwgY3VyckJsZHJDdHgtPmdldEJsb2NrKCksIGN1cnJTdG10SWR4KTsKK30KKwogdm9pZCBFeHByRW5naW5lOjpQcm9jZXNzQXV0b21hdGljT2JqRHRvcihjb25zdCBDRkdBdXRvbWF0aWNPYmpEdG9yIER0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kZWROb2RlU2V0ICZEc3QpIHsKQEAgLTU5OCw3ICs2MjMsNiBAQAogdm9pZCBFeHByRW5naW5lOjpQcm9jZXNzQmFzZUR0b3IoY29uc3QgQ0ZHQmFzZUR0b3IgRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwgRXhwbG9kZWROb2RlU2V0ICZEc3QpIHsKICAgY29uc3QgTG9jYXRpb25Db250ZXh0ICpMQ3R4ID0gUHJlZC0+Z2V0TG9jYXRpb25Db250ZXh0KCk7Ci0gIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSA9IFByZWQtPmdldFN0YXRlKCk7CiAKICAgY29uc3QgQ1hYRGVzdHJ1Y3RvckRlY2wgKkN1ckR0b3IgPSBjYXN0PENYWERlc3RydWN0b3JEZWNsPihMQ3R4LT5nZXREZWNsKCkpOwogICBMb2MgVGhpc1B0ciA9IGdldFNWYWxCdWlsZGVyKCkuZ2V0Q1hYVGhpcyhDdXJEdG9yLApAQCAtNjY0LDggKzY4OCw2IEBACiAgICAgY2FzZSBTdG10OjpNU1Byb3BlcnR5UmVmRXhwckNsYXNzOgogICAgIGNhc2UgU3RtdDo6Q1hYVW5yZXNvbHZlZENvbnN0cnVjdEV4cHJDbGFzczoKICAgICBjYXNlIFN0bXQ6OkRlcGVuZGVudFNjb3BlRGVjbFJlZkV4cHJDbGFzczoKLSAgICBjYXNlIFN0bXQ6OlVuYXJ5VHlwZVRyYWl0RXhwckNsYXNzOgotICAgIGNhc2UgU3RtdDo6QmluYXJ5VHlwZVRyYWl0RXhwckNsYXNzOgogICAgIGNhc2UgU3RtdDo6VHlwZVRyYWl0RXhwckNsYXNzOgogICAgIGNhc2UgU3RtdDo6QXJyYXlUeXBlVHJhaXRFeHByQ2xhc3M6CiAgICAgY2FzZSBTdG10OjpFeHByZXNzaW9uVHJhaXRFeHByQ2xhc3M6CkBAIC03MDksNiArNzMxLDcgQEAKICAgICBjYXNlIEV4cHI6Ok1TRGVwZW5kZW50RXhpc3RzU3RtdENsYXNzOgogICAgIGNhc2UgU3RtdDo6Q2FwdHVyZWRTdG10Q2xhc3M6CiAgICAgY2FzZSBTdG10OjpPTVBQYXJhbGxlbERpcmVjdGl2ZUNsYXNzOgorICAgIGNhc2UgU3RtdDo6T01QU2ltZERpcmVjdGl2ZUNsYXNzOgogICAgICAgbGx2bV91bnJlYWNoYWJsZSgiU3RtdCBzaG91bGQgbm90IGJlIGluIGFuYWx5emVyIGV2YWx1YXRpb24gbG9vcCIpOwogCiAgICAgY2FzZSBTdG10OjpPYmpDU3Vic2NyaXB0UmVmRXhwckNsYXNzOgpAQCAtMTI1Myw3ICsxMjc2LDcgQEAKIAogICAvLyBGSVhNRTogUmVmYWN0b3IgdGhpcyBpbnRvIGEgY2hlY2tlci4KICAgaWYgKG5vZGVCdWlsZGVyLmdldENvbnRleHQoKS5ibG9ja0NvdW50KCkgPj0gQU1nci5vcHRpb25zLm1heEJsb2NrVmlzaXRPblBhdGgpIHsKLSAgICBzdGF0aWMgU2ltcGxlUHJvZ3JhbVBvaW50VGFnIHRhZygiRXhwckVuZ2luZSA6IEJsb2NrIGNvdW50IGV4Y2VlZGVkIik7CisgICAgc3RhdGljIFNpbXBsZVByb2dyYW1Qb2ludFRhZyB0YWcoVGFnUHJvdmlkZXJOYW1lLCAiQmxvY2sgY291bnQgZXhjZWVkZWQiKTsKICAgICBjb25zdCBFeHBsb2RlZE5vZGUgKlNpbmsgPQogICAgICAgICAgICAgICAgICAgIG5vZGVCdWlsZGVyLmdlbmVyYXRlU2luayhQcmVkLT5nZXRTdGF0ZSgpLCBQcmVkLCAmdGFnKTsKIApAQCAtMTQ0Myw3ICsxNDY2LDcgQEAKICAgICBEZWZpbmVkU1ZhbCBWID0gWC5jYXN0QXM8RGVmaW5lZFNWYWw+KCk7CiAKICAgICBQcm9ncmFtU3RhdGVSZWYgU3RUcnVlLCBTdEZhbHNlOwotICAgIHRpZShTdFRydWUsIFN0RmFsc2UpID0gUHJldlN0YXRlLT5hc3N1bWUoVik7CisgICAgc3RkOjp0aWUoU3RUcnVlLCBTdEZhbHNlKSA9IFByZXZTdGF0ZS0+YXNzdW1lKFYpOwogCiAgICAgLy8gUHJvY2VzcyB0aGUgdHJ1ZSBicmFuY2guCiAgICAgaWYgKGJ1aWxkZXIuaXNGZWFzaWJsZSh0cnVlKSkgewpAQCAtMTc1Miw3NSArMTc3NSw4NCBAQAogCiAvLy8gVmlzaXRNZW1iZXJFeHByIC0gVHJhbnNmZXIgZnVuY3Rpb24gZm9yIG1lbWJlciBleHByZXNzaW9ucy4KIHZvaWQgRXhwckVuZ2luZTo6VmlzaXRNZW1iZXJFeHByKGNvbnN0IE1lbWJlckV4cHIgKk0sIEV4cGxvZGVkTm9kZSAqUHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmVG9wRHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCkgewogCi0gIFN0bXROb2RlQnVpbGRlciBCbGRyKFByZWQsIFRvcERzdCwgKmN1cnJCbGRyQ3R4KTsKLSAgRXhwbG9kZWROb2RlU2V0IERzdDsKKyAgLy8gRklYTUU6IFByZWNoZWNrcyBldmVudHVhbGx5IGdvIGluIDo6VmlzaXQoKS4KKyAgRXhwbG9kZWROb2RlU2V0IENoZWNrZWRTZXQ7CisgIGdldENoZWNrZXJNYW5hZ2VyKCkucnVuQ2hlY2tlcnNGb3JQcmVTdG10KENoZWNrZWRTZXQsIFByZWQsIE0sICp0aGlzKTsKKworICBFeHBsb2RlZE5vZGVTZXQgRXZhbFNldDsKICAgVmFsdWVEZWNsICpNZW1iZXIgPSBNLT5nZXRNZW1iZXJEZWNsKCk7CiAKICAgLy8gSGFuZGxlIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIGFuZCBlbnVtIGNvbnN0YW50cyBhY2Nlc3NlZCB2aWEKICAgLy8gbWVtYmVyIHN5bnRheC4KICAgaWYgKGlzYTxWYXJEZWNsPihNZW1iZXIpIHx8IGlzYTxFbnVtQ29uc3RhbnREZWNsPihNZW1iZXIpKSB7Ci0gICAgQmxkci50YWtlTm9kZXMoUHJlZCk7Ci0gICAgVmlzaXRDb21tb25EZWNsUmVmRXhwcihNLCBNZW1iZXIsIFByZWQsIERzdCk7Ci0gICAgQmxkci5hZGROb2RlcyhEc3QpOwotICAgIHJldHVybjsKLSAgfQorICAgIEV4cGxvZGVkTm9kZVNldCBEc3Q7CisgICAgZm9yIChFeHBsb2RlZE5vZGVTZXQ6Oml0ZXJhdG9yIEkgPSBDaGVja2VkU2V0LmJlZ2luKCksIEUgPSBDaGVja2VkU2V0LmVuZCgpOworICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIFZpc2l0Q29tbW9uRGVjbFJlZkV4cHIoTSwgTWVtYmVyLCBQcmVkLCBFdmFsU2V0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgU3RtdE5vZGVCdWlsZGVyIEJsZHIoQ2hlY2tlZFNldCwgRXZhbFNldCwgKmN1cnJCbGRyQ3R4KTsKKyAgICBFeHBsb2RlZE5vZGVTZXQgVG1wOwogCi0gIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSA9IFByZWQtPmdldFN0YXRlKCk7Ci0gIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCA9IFByZWQtPmdldExvY2F0aW9uQ29udGV4dCgpOwotICBFeHByICpCYXNlRXhwciA9IE0tPmdldEJhc2UoKTsKKyAgICBmb3IgKEV4cGxvZGVkTm9kZVNldDo6aXRlcmF0b3IgSSA9IENoZWNrZWRTZXQuYmVnaW4oKSwgRSA9IENoZWNrZWRTZXQuZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgUHJvZ3JhbVN0YXRlUmVmIHN0YXRlID0gKCpJKS0+Z2V0U3RhdGUoKTsKKyAgICAgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCA9ICgqSSktPmdldExvY2F0aW9uQ29udGV4dCgpOworICAgICAgRXhwciAqQmFzZUV4cHIgPSBNLT5nZXRCYXNlKCk7CiAKLSAgLy8gSGFuZGxlIEMrKyBtZXRob2QgY2FsbHMuCi0gIGlmIChjb25zdCBDWFhNZXRob2REZWNsICpNRCA9IGR5bl9jYXN0PENYWE1ldGhvZERlY2w+KE1lbWJlcikpIHsKLSAgICBpZiAoTUQtPmlzSW5zdGFuY2UoKSkKKyAgICAgIC8vIEhhbmRsZSBDKysgbWV0aG9kIGNhbGxzLgorICAgICAgaWYgKGNvbnN0IENYWE1ldGhvZERlY2wgKk1EID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4oTWVtYmVyKSkgeworICAgICAgICBpZiAoTUQtPmlzSW5zdGFuY2UoKSkKKyAgICAgICAgICBzdGF0ZSA9IGNyZWF0ZVRlbXBvcmFyeVJlZ2lvbklmTmVlZGVkKHN0YXRlLCBMQ3R4LCBCYXNlRXhwcik7CisKKyAgICAgICAgU1ZhbCBNRFZhbCA9IHN2YWxCdWlsZGVyLmdldEZ1bmN0aW9uUG9pbnRlcihNRCk7CisgICAgICAgIHN0YXRlID0gc3RhdGUtPkJpbmRFeHByKE0sIExDdHgsIE1EVmFsKTsKKworICAgICAgICBCbGRyLmdlbmVyYXRlTm9kZShNLCAqSSwgc3RhdGUpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gSGFuZGxlIHJlZ3VsYXIgc3RydWN0IGZpZWxkcyAvIG1lbWJlciB2YXJpYWJsZXMuCiAgICAgICBzdGF0ZSA9IGNyZWF0ZVRlbXBvcmFyeVJlZ2lvbklmTmVlZGVkKHN0YXRlLCBMQ3R4LCBCYXNlRXhwcik7CisgICAgICBTVmFsIGJhc2VFeHByVmFsID0gc3RhdGUtPmdldFNWYWwoQmFzZUV4cHIsIExDdHgpOwogCi0gICAgU1ZhbCBNRFZhbCA9IHN2YWxCdWlsZGVyLmdldEZ1bmN0aW9uUG9pbnRlcihNRCk7Ci0gICAgc3RhdGUgPSBzdGF0ZS0+QmluZEV4cHIoTSwgTEN0eCwgTURWYWwpOworICAgICAgRmllbGREZWNsICpmaWVsZCA9IGNhc3Q8RmllbGREZWNsPihNZW1iZXIpOworICAgICAgU1ZhbCBMID0gc3RhdGUtPmdldExWYWx1ZShmaWVsZCwgYmFzZUV4cHJWYWwpOwogCi0gICAgQmxkci5nZW5lcmF0ZU5vZGUoTSwgUHJlZCwgc3RhdGUpOwotICAgIHJldHVybjsKLSAgfQorICAgICAgaWYgKE0tPmlzR0xWYWx1ZSgpIHx8IE0tPmdldFR5cGUoKS0+aXNBcnJheVR5cGUoKSkgeworICAgICAgICAvLyBXZSBzcGVjaWFsLWNhc2UgcnZhbHVlcyBvZiBhcnJheSB0eXBlIGJlY2F1c2UgdGhlIGFuYWx5emVyIGNhbm5vdAorICAgICAgICAvLyByZWFzb24gYWJvdXQgdGhlbSwgc2luY2Ugd2UgZXhwZWN0IGFsbCByZWdpb25zIHRvIGJlIHdyYXBwZWQgaW4gTG9jcy4KKyAgICAgICAgLy8gV2UgaW5zdGVhZCB0cmVhdCB0aGVzZSBhcyBsdmFsdWVzIGFuZCBhc3N1bWUgdGhhdCB0aGV5IHdpbGwgZGVjYXkgdG8KKyAgICAgICAgLy8gcG9pbnRlcnMgYXMgc29vbiBhcyB0aGV5IGFyZSB1c2VkLgorICAgICAgICBpZiAoIU0tPmlzR0xWYWx1ZSgpKSB7CisgICAgICAgICAgYXNzZXJ0KE0tPmdldFR5cGUoKS0+aXNBcnJheVR5cGUoKSk7CisgICAgICAgICAgY29uc3QgSW1wbGljaXRDYXN0RXhwciAqUEUgPQorICAgICAgICAgICAgZHluX2Nhc3Q8SW1wbGljaXRDYXN0RXhwcj4oKCpJKS0+Z2V0UGFyZW50TWFwKCkuZ2V0UGFyZW50KE0pKTsKKyAgICAgICAgICBpZiAoIVBFIHx8IFBFLT5nZXRDYXN0S2luZCgpICE9IENLX0FycmF5VG9Qb2ludGVyRGVjYXkpIHsKKyAgICAgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoInNob3VsZCBhbHdheXMgYmUgd3JhcHBlZCBpbiBBcnJheVRvUG9pbnRlckRlY2F5Iik7CisgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgLy8gSGFuZGxlIHJlZ3VsYXIgc3RydWN0IGZpZWxkcyAvIG1lbWJlciB2YXJpYWJsZXMuCi0gIHN0YXRlID0gY3JlYXRlVGVtcG9yYXJ5UmVnaW9uSWZOZWVkZWQoc3RhdGUsIExDdHgsIEJhc2VFeHByKTsKLSAgU1ZhbCBiYXNlRXhwclZhbCA9IHN0YXRlLT5nZXRTVmFsKEJhc2VFeHByLCBMQ3R4KTsKKyAgICAgICAgaWYgKGZpZWxkLT5nZXRUeXBlKCktPmlzUmVmZXJlbmNlVHlwZSgpKSB7CisgICAgICAgICAgaWYgKGNvbnN0IE1lbVJlZ2lvbiAqUiA9IEwuZ2V0QXNSZWdpb24oKSkKKyAgICAgICAgICAgIEwgPSBzdGF0ZS0+Z2V0U1ZhbChSKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBMID0gVW5rbm93blZhbCgpOworICAgICAgICB9CiAKLSAgRmllbGREZWNsICpmaWVsZCA9IGNhc3Q8RmllbGREZWNsPihNZW1iZXIpOwotICBTVmFsIEwgPSBzdGF0ZS0+Z2V0TFZhbHVlKGZpZWxkLCBiYXNlRXhwclZhbCk7Ci0KLSAgaWYgKE0tPmlzR0xWYWx1ZSgpIHx8IE0tPmdldFR5cGUoKS0+aXNBcnJheVR5cGUoKSkgewotCi0gICAgLy8gV2Ugc3BlY2lhbCBjYXNlIHJ2YWx1ZSBvZiBhcnJheSB0eXBlIGJlY2F1c2UgdGhlIGFuYWx5emVyIGNhbm5vdCByZWFzb24KLSAgICAvLyBhYm91dCBpdCwgc2luY2Ugd2UgZXhwZWN0IGFsbCByZWdpb25zIHRvIGJlIHdyYXBwZWQgaW4gTG9jcy4gU28gd2Ugd2lsbAotICAgIC8vIHRyZWF0IHRoZXNlIGFzIGx2YWx1ZXMgYXNzdW1pbmcgdGhhdCB0aGV5IHdpbGwgZGVjYXkgdG8gcG9pbnRlcnMgYXMgc29vbgotICAgIC8vIGFzIHRoZXkgYXJlIHVzZWQuCi0gICAgaWYgKCFNLT5pc0dMVmFsdWUoKSkgewotICAgICAgYXNzZXJ0KE0tPmdldFR5cGUoKS0+aXNBcnJheVR5cGUoKSk7Ci0gICAgICBjb25zdCBJbXBsaWNpdENhc3RFeHByICpQRSA9Ci0gICAgICAgIGR5bl9jYXN0PEltcGxpY2l0Q2FzdEV4cHI+KFByZWQtPmdldFBhcmVudE1hcCgpLmdldFBhcmVudChNKSk7Ci0gICAgICBpZiAoIVBFIHx8IFBFLT5nZXRDYXN0S2luZCgpICE9IENLX0FycmF5VG9Qb2ludGVyRGVjYXkpIHsKLSAgICAgICAgYXNzZXJ0KGZhbHNlICYmCi0gICAgICAgICAgICAgICAiV2UgYXNzdW1lIHRoYXQgYXJyYXkgaXMgYWx3YXlzIHdyYXBwZWQgaW4gQXJyYXlUb1BvaW50ZXJEZWNheSIpOwotICAgICAgICBMID0gVW5rbm93blZhbCgpOworICAgICAgICBCbGRyLmdlbmVyYXRlTm9kZShNLCAqSSwgc3RhdGUtPkJpbmRFeHByKE0sIExDdHgsIEwpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtUG9pbnQ6OlBvc3RMVmFsdWVLaW5kKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEJsZHIudGFrZU5vZGVzKCpJKTsKKyAgICAgICAgZXZhbExvYWQoVG1wLCBNLCBNLCAqSSwgc3RhdGUsIEwpOworICAgICAgICBCbGRyLmFkZE5vZGVzKFRtcCk7CiAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKGZpZWxkLT5nZXRUeXBlKCktPmlzUmVmZXJlbmNlVHlwZSgpKSB7Ci0gICAgICBpZiAoY29uc3QgTWVtUmVnaW9uICpSID0gTC5nZXRBc1JlZ2lvbigpKQotICAgICAgICBMID0gc3RhdGUtPmdldFNWYWwoUik7Ci0gICAgICBlbHNlCi0gICAgICAgIEwgPSBVbmtub3duVmFsKCk7Ci0gICAgfQotCi0gICAgQmxkci5nZW5lcmF0ZU5vZGUoTSwgUHJlZCwgc3RhdGUtPkJpbmRFeHByKE0sIExDdHgsIEwpLCAwLAotICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1Qb2ludDo6UG9zdExWYWx1ZUtpbmQpOwotICB9IGVsc2UgewotICAgIEJsZHIudGFrZU5vZGVzKFByZWQpOwotICAgIGV2YWxMb2FkKERzdCwgTSwgTSwgUHJlZCwgc3RhdGUsIEwpOwotICAgIEJsZHIuYWRkTm9kZXMoRHN0KTsKICAgfQorCisgIGdldENoZWNrZXJNYW5hZ2VyKCkucnVuQ2hlY2tlcnNGb3JQb3N0U3RtdChEc3QsIEV2YWxTZXQsIE0sICp0aGlzKTsKIH0KIAogbmFtZXNwYWNlIHsKQEAgLTE4MzAsNyArMTg2Miw3IEBACiAgIENvbGxlY3RSZWFjaGFibGVTeW1ib2xzQ2FsbGJhY2soUHJvZ3JhbVN0YXRlUmVmIFN0YXRlKSB7fQogICBjb25zdCBJbnZhbGlkYXRlZFN5bWJvbHMgJmdldFN5bWJvbHMoKSBjb25zdCB7IHJldHVybiBTeW1ib2xzOyB9CiAKLSAgYm9vbCBWaXNpdFN5bWJvbChTeW1ib2xSZWYgU3ltKSB7CisgIGJvb2wgVmlzaXRTeW1ib2woU3ltYm9sUmVmIFN5bSkgb3ZlcnJpZGUgewogICAgIFN5bWJvbHMuaW5zZXJ0KFN5bSk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTIwMzcsNyArMjA2OSw3IEBACiAgICAgUXVhbFR5cGUgVmFsVHkgPSBUUi0+Z2V0VmFsdWVUeXBlKCk7CiAgICAgaWYgKGNvbnN0IFJlZmVyZW5jZVR5cGUgKlJUID0gVmFsVHktPmdldEFzPFJlZmVyZW5jZVR5cGU+KCkpIHsKICAgICAgIHN0YXRpYyBTaW1wbGVQcm9ncmFtUG9pbnRUYWcKLSAgICAgICAgICAgICBsb2FkUmVmZXJlbmNlVGFnKCJFeHByRW5naW5lIDogTG9hZCBSZWZlcmVuY2UiKTsKKyAgICAgICAgICAgICBsb2FkUmVmZXJlbmNlVGFnKFRhZ1Byb3ZpZGVyTmFtZSwgIkxvYWQgUmVmZXJlbmNlIik7CiAgICAgICBFeHBsb2RlZE5vZGVTZXQgVG1wOwogICAgICAgZXZhbExvYWRDb21tb24oVG1wLCBOb2RlRXgsIEJvdW5kRXgsIFByZWQsIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sICZsb2FkUmVmZXJlbmNlVGFnLApAQCAtMjEyMCw3ICsyMTUyLDcgQEAKICAgICAvLyBpbnN0ZWFkICJpbnQgKnAiIGlzIG5vdGVkIGFzCiAgICAgLy8gIlZhcmlhYmxlICdwJyBpbml0aWFsaXplZCB0byBhIG51bGwgcG9pbnRlciB2YWx1ZSIKICAgICAKLSAgICBzdGF0aWMgU2ltcGxlUHJvZ3JhbVBvaW50VGFnIHRhZygiRXhwckVuZ2luZTogTG9jYXRpb24iKTsKKyAgICBzdGF0aWMgU2ltcGxlUHJvZ3JhbVBvaW50VGFnIHRhZyhUYWdQcm92aWRlck5hbWUsICJMb2NhdGlvbiIpOwogICAgIEJsZHIuZ2VuZXJhdGVOb2RlKE5vZGVFeCwgUHJlZCwgc3RhdGUsICZ0YWcpOwogICB9CiAgIEV4cGxvZGVkTm9kZVNldCBUbXA7CkBAIC0yMTMyLDggKzIxNjQsMTAgQEAKIHN0ZDo6cGFpcjxjb25zdCBQcm9ncmFtUG9pbnRUYWcgKiwgY29uc3QgUHJvZ3JhbVBvaW50VGFnKj4KIEV4cHJFbmdpbmU6OmdldGVhZ2VybHlBc3N1bWVCaW5PcEJpZnVyY2F0aW9uVGFncygpIHsKICAgc3RhdGljIFNpbXBsZVByb2dyYW1Qb2ludFRhZwotICAgICAgICAgZWFnZXJseUFzc3VtZUJpbk9wQmlmdXJjYXRpb25UcnVlKCJFeHByRW5naW5lIDogRWFnZXJseSBBc3N1bWUgVHJ1ZSIpLAotICAgICAgICAgZWFnZXJseUFzc3VtZUJpbk9wQmlmdXJjYXRpb25GYWxzZSgiRXhwckVuZ2luZSA6IEVhZ2VybHkgQXNzdW1lIEZhbHNlIik7CisgICAgICAgICBlYWdlcmx5QXNzdW1lQmluT3BCaWZ1cmNhdGlvblRydWUoVGFnUHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFYWdlcmx5IEFzc3VtZSBUcnVlIiksCisgICAgICAgICBlYWdlcmx5QXNzdW1lQmluT3BCaWZ1cmNhdGlvbkZhbHNlKFRhZ1Byb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVhZ2VybHkgQXNzdW1lIEZhbHNlIik7CiAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigmZWFnZXJseUFzc3VtZUJpbk9wQmlmdXJjYXRpb25UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgJmVhZ2VybHlBc3N1bWVCaW5PcEJpZnVyY2F0aW9uRmFsc2UpOwogfQpAQCAtMjE2MSw3ICsyMTk1LDcgQEAKICAgICAgICAgZ2V0ZWFnZXJseUFzc3VtZUJpbk9wQmlmdXJjYXRpb25UYWdzKCk7CiAKICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdGF0ZVRydWUsIFN0YXRlRmFsc2U7Ci0gICAgICB0aWUoU3RhdGVUcnVlLCBTdGF0ZUZhbHNlKSA9IHN0YXRlLT5hc3N1bWUoKlNFVik7CisgICAgICBzdGQ6OnRpZShTdGF0ZVRydWUsIFN0YXRlRmFsc2UpID0gc3RhdGUtPmFzc3VtZSgqU0VWKTsKIAogICAgICAgLy8gRmlyc3QgYXNzdW1lIHRoYXQgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgogICAgICAgaWYgKFN0YXRlVHJ1ZSkgewpAQCAtMjUxNSw3ICsyNTQ5LDcgQEAKICAgR3JhcGhQcmludENoZWNrZXJTdGF0ZSA9IHRoaXM7CiAgIEdyYXBoUHJpbnRTb3VyY2VNYW5hZ2VyID0gJmdldENvbnRleHQoKS5nZXRTb3VyY2VNYW5hZ2VyKCk7CiAKLSAgT3duaW5nUHRyPEV4cGxvZGVkR3JhcGg+IFRyaW1tZWRHKEcudHJpbShOb2RlcykpOworICBzdGQ6OnVuaXF1ZV9wdHI8RXhwbG9kZWRHcmFwaD4gVHJpbW1lZEcoRy50cmltKE5vZGVzKSk7CiAKICAgaWYgKCFUcmltbWVkRy5nZXQoKSkKICAgICBsbHZtOjplcnJzKCkgPDwgIndhcm5pbmc6IFRyaW1tZWQgRXhwbG9kZWRHcmFwaCBpcyBlbXB0eS5cbiI7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9FeHByRW5naW5lQy5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9FeHByRW5naW5lQy5jcHAKaW5kZXggOTgzZmRhMC4uOTFiMDcyZiAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvRXhwckVuZ2luZUMuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0V4cHJFbmdpbmVDLmNwcApAQCAtMjg2LDYgKzI4Niw3IEBACiAgICAgICBjYXNlIENLX0RlcGVuZGVudDoKICAgICAgIGNhc2UgQ0tfQXJyYXlUb1BvaW50ZXJEZWNheToKICAgICAgIGNhc2UgQ0tfQml0Q2FzdDoKKyAgICAgIGNhc2UgQ0tfQWRkcmVzc1NwYWNlQ29udmVyc2lvbjoKICAgICAgIGNhc2UgQ0tfSW50ZWdyYWxDYXN0OgogICAgICAgY2FzZSBDS19OdWxsVG9Qb2ludGVyOgogICAgICAgY2FzZSBDS19JbnRlZ3JhbFRvUG9pbnRlcjoKQEAgLTU1NCw3ICs1NTUsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICBEZWZpbmVkT3JVbmtub3duU1ZhbCBEZWZpbmVkUkhTID0gUkhTVmFsLmNhc3RBczxEZWZpbmVkT3JVbmtub3duU1ZhbD4oKTsKICAgICAgIFByb2dyYW1TdGF0ZVJlZiBTdFRydWUsIFN0RmFsc2U7Ci0gICAgICBsbHZtOjp0aWUoU3RUcnVlLCBTdEZhbHNlKSA9IE4tPmdldFN0YXRlKCktPmFzc3VtZShEZWZpbmVkUkhTKTsKKyAgICAgIHN0ZDo6dGllKFN0VHJ1ZSwgU3RGYWxzZSkgPSBOLT5nZXRTdGF0ZSgpLT5hc3N1bWUoRGVmaW5lZFJIUyk7CiAgICAgICBpZiAoU3RUcnVlKSB7CiAgICAgICAgIGlmIChTdEZhbHNlKSB7CiAgICAgICAgICAgLy8gV2UgY2FuJ3QgY29uc3RyYWluIHRoZSB2YWx1ZSB0byAwIG9yIDEuCkBAIC03MDcsMzQgKzcwOCw0MyBAQAogVmlzaXRVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHIoY29uc3QgVW5hcnlFeHByT3JUeXBlVHJhaXRFeHByICpFeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmRHN0KSB7Ci0gIFN0bXROb2RlQnVpbGRlciBCbGRyKFByZWQsIERzdCwgKmN1cnJCbGRyQ3R4KTsKKyAgLy8gRklYTUU6IFByZWNoZWNrcyBldmVudHVhbGx5IGdvIGluIDo6VmlzaXQoKS4KKyAgRXhwbG9kZWROb2RlU2V0IENoZWNrZWRTZXQ7CisgIGdldENoZWNrZXJNYW5hZ2VyKCkucnVuQ2hlY2tlcnNGb3JQcmVTdG10KENoZWNrZWRTZXQsIFByZWQsIEV4LCAqdGhpcyk7CisKKyAgRXhwbG9kZWROb2RlU2V0IEV2YWxTZXQ7CisgIFN0bXROb2RlQnVpbGRlciBCbGRyKENoZWNrZWRTZXQsIEV2YWxTZXQsICpjdXJyQmxkckN0eCk7CiAKICAgUXVhbFR5cGUgVCA9IEV4LT5nZXRUeXBlT2ZBcmd1bWVudCgpOwotICAKLSAgaWYgKEV4LT5nZXRLaW5kKCkgPT0gVUVUVF9TaXplT2YpIHsKLSAgICBpZiAoIVQtPmlzSW5jb21wbGV0ZVR5cGUoKSAmJiAhVC0+aXNDb25zdGFudFNpemVUeXBlKCkpIHsKLSAgICAgIGFzc2VydChULT5pc1ZhcmlhYmxlQXJyYXlUeXBlKCkgJiYgIlVua25vd24gbm9uLWNvbnN0YW50LXNpemVkIHR5cGUuIik7Ci0gICAgICAKLSAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3IgVkxBIHR5cGUgYXJndW1lbnRzIGFuZCBWTEEgZXhwcmVzc2lvbnMuCi0gICAgICAvLyBXaGVuIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkIHByb2JhYmx5IHJlZmFjdG9yIFZMQVNpemVDaGVja2VyJ3MgY29kZS4KLSAgICAgIHJldHVybjsKKworICBmb3IgKEV4cGxvZGVkTm9kZVNldDo6aXRlcmF0b3IgSSA9IENoZWNrZWRTZXQuYmVnaW4oKSwgRSA9IENoZWNrZWRTZXQuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoRXgtPmdldEtpbmQoKSA9PSBVRVRUX1NpemVPZikgeworICAgICAgaWYgKCFULT5pc0luY29tcGxldGVUeXBlKCkgJiYgIVQtPmlzQ29uc3RhbnRTaXplVHlwZSgpKSB7CisgICAgICAgIGFzc2VydChULT5pc1ZhcmlhYmxlQXJyYXlUeXBlKCkgJiYgIlVua25vd24gbm9uLWNvbnN0YW50LXNpemVkIHR5cGUuIik7CisgICAgICAgIAorICAgICAgICAvLyBGSVhNRTogQWRkIHN1cHBvcnQgZm9yIFZMQSB0eXBlIGFyZ3VtZW50cyBhbmQgVkxBIGV4cHJlc3Npb25zLgorICAgICAgICAvLyBXaGVuIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkIHByb2JhYmx5IHJlZmFjdG9yIFZMQVNpemVDaGVja2VyJ3MgY29kZS4KKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKFQtPmdldEFzPE9iakNPYmplY3RUeXBlPigpKSB7CisgICAgICAgIC8vIFNvbWUgY29kZSB0cmllcyB0byB0YWtlIHRoZSBzaXplb2YgYW4gT2JqQ09iamVjdFR5cGUsIHJlbHlpbmcgdGhhdAorICAgICAgICAvLyB0aGUgY29tcGlsZXIgaGFzIGxhaWQgb3V0IGl0cyByZXByZXNlbnRhdGlvbi4gIEp1c3QgcmVwb3J0IFVua25vd24KKyAgICAgICAgLy8gZm9yIHRoZXNlLgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KICAgICB9Ci0gICAgZWxzZSBpZiAoVC0+Z2V0QXM8T2JqQ09iamVjdFR5cGU+KCkpIHsKLSAgICAgIC8vIFNvbWUgY29kZSB0cmllcyB0byB0YWtlIHRoZSBzaXplb2YgYW4gT2JqQ09iamVjdFR5cGUsIHJlbHlpbmcgdGhhdAotICAgICAgLy8gdGhlIGNvbXBpbGVyIGhhcyBsYWlkIG91dCBpdHMgcmVwcmVzZW50YXRpb24uICBKdXN0IHJlcG9ydCBVbmtub3duCi0gICAgICAvLyBmb3IgdGhlc2UuCi0gICAgICByZXR1cm47Ci0gICAgfQorICAgIAorICAgIEFQU0ludCBWYWx1ZSA9IEV4LT5FdmFsdWF0ZUtub3duQ29uc3RJbnQoZ2V0Q29udGV4dCgpKTsKKyAgICBDaGFyVW5pdHMgYW10ID0gQ2hhclVuaXRzOjpmcm9tUXVhbnRpdHkoVmFsdWUuZ2V0WkV4dFZhbHVlKCkpOworICAgIAorICAgIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSA9ICgqSSktPmdldFN0YXRlKCk7CisgICAgc3RhdGUgPSBzdGF0ZS0+QmluZEV4cHIoRXgsICgqSSktPmdldExvY2F0aW9uQ29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2YWxCdWlsZGVyLm1ha2VJbnRWYWwoYW10LmdldFF1YW50aXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeC0+Z2V0VHlwZSgpKSk7CisgICAgQmxkci5nZW5lcmF0ZU5vZGUoRXgsICpJLCBzdGF0ZSk7CiAgIH0KLSAgCi0gIEFQU0ludCBWYWx1ZSA9IEV4LT5FdmFsdWF0ZUtub3duQ29uc3RJbnQoZ2V0Q29udGV4dCgpKTsKLSAgQ2hhclVuaXRzIGFtdCA9IENoYXJVbml0czo6ZnJvbVF1YW50aXR5KFZhbHVlLmdldFpFeHRWYWx1ZSgpKTsKLSAgCi0gIFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSA9IFByZWQtPmdldFN0YXRlKCk7Ci0gIHN0YXRlID0gc3RhdGUtPkJpbmRFeHByKEV4LCBQcmVkLT5nZXRMb2NhdGlvbkNvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZhbEJ1aWxkZXIubWFrZUludFZhbChhbXQuZ2V0UXVhbnRpdHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXgtPmdldFR5cGUoKSkpOwotICBCbGRyLmdlbmVyYXRlTm9kZShFeCwgUHJlZCwgc3RhdGUpOworCisgIGdldENoZWNrZXJNYW5hZ2VyKCkucnVuQ2hlY2tlcnNGb3JQb3N0U3RtdChEc3QsIEV2YWxTZXQsIEV4LCAqdGhpcyk7CiB9CiAKIHZvaWQgRXhwckVuZ2luZTo6VmlzaXRVbmFyeU9wZXJhdG9yKGNvbnN0IFVuYXJ5T3BlcmF0b3IqIFUsIApkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvRXhwckVuZ2luZUNYWC5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9FeHByRW5naW5lQ1hYLmNwcAppbmRleCBlYmE0Zjk0Li41MmZlMTU2IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9FeHByRW5naW5lQ1hYLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9FeHByRW5naW5lQ1hYLmNwcApAQCAtOTEsMTIgKzkxLDYgQEAKIC8vLyBJZiB0aGUgdHlwZSBpcyBub3QgYW4gYXJyYXkgdHlwZSBhdCBhbGwsIHRoZSBvcmlnaW5hbCB2YWx1ZSBpcyByZXR1cm5lZC4KIHN0YXRpYyBTVmFsIG1ha2VaZXJvRWxlbWVudFJlZ2lvbihQcm9ncmFtU3RhdGVSZWYgU3RhdGUsIFNWYWwgTFZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxUeXBlICZUeSkgewotICAvLyBGSVhNRTogVGhpcyBjaGVjayBpcyBqdXN0IGEgdGVtcG9yYXJ5IHdvcmthcm91bmQsIGJlY2F1c2UKLSAgLy8gUHJvY2Vzc1RlbXBvcmFyeUR0b3Igc2VuZHMgdXMgTlVMTCByZWdpb25zLiBJdCB3aWxsIG5vdCBiZSBuZWNlc3Nhcnkgb25jZQotICAvLyB3ZSBjYW4gcHJvcGVybHkgcHJvY2VzcyB0ZW1wb3JhcnkgZGVzdHJ1Y3RvcnMuCi0gIGlmICghTFZhbHVlLmdldEFzUmVnaW9uKCkpCi0gICAgcmV0dXJuIExWYWx1ZTsKLQogICBTVmFsQnVpbGRlciAmU1ZCID0gU3RhdGUtPmdldFN0YXRlTWFuYWdlcigpLmdldFNWYWxCdWlsZGVyKCk7CiAgIEFTVENvbnRleHQgJkN0eCA9IFNWQi5nZXRDb250ZXh0KCk7CiAKQEAgLTEwOCw2ICsxMDIsNzAgQEAKICAgcmV0dXJuIExWYWx1ZTsKIH0KIAorCitzdGF0aWMgY29uc3QgTWVtUmVnaW9uICpnZXRSZWdpb25Gb3JDb25zdHJ1Y3RlZE9iamVjdCgKKyAgICBjb25zdCBDWFhDb25zdHJ1Y3RFeHByICpDRSwgRXhwbG9kZWROb2RlICpQcmVkLCBFeHByRW5naW5lICZFbmcsCisgICAgdW5zaWduZWQgaW50IEN1cnJTdG10SWR4KSB7CisgIGNvbnN0IExvY2F0aW9uQ29udGV4dCAqTEN0eCA9IFByZWQtPmdldExvY2F0aW9uQ29udGV4dCgpOworICBQcm9ncmFtU3RhdGVSZWYgU3RhdGUgPSBQcmVkLT5nZXRTdGF0ZSgpOworICBjb25zdCBOb2RlQnVpbGRlckNvbnRleHQgJkN1cnJCbGRyQ3R4ID0gRW5nLmdldEJ1aWxkZXJDb250ZXh0KCk7CisKKyAgLy8gU2VlIGlmIHdlJ3JlIGNvbnN0cnVjdGluZyBhbiBleGlzdGluZyByZWdpb24gYnkgbG9va2luZyBhdCB0aGUgbmV4dAorICAvLyBlbGVtZW50IGluIHRoZSBDRkcuCisgIGNvbnN0IENGR0Jsb2NrICpCID0gQ3VyckJsZHJDdHguZ2V0QmxvY2soKTsKKyAgaWYgKEN1cnJTdG10SWR4ICsgMSA8IEItPnNpemUoKSkgeworICAgIENGR0VsZW1lbnQgTmV4dCA9ICgqQilbQ3VyclN0bXRJZHgrMV07CisKKyAgICAvLyBJcyB0aGlzIGEgY29uc3RydWN0b3IgZm9yIGEgbG9jYWwgdmFyaWFibGU/CisgICAgaWYgKE9wdGlvbmFsPENGR1N0bXQ+IFN0bXRFbGVtID0gTmV4dC5nZXRBczxDRkdTdG10PigpKSB7CisgICAgICBpZiAoY29uc3QgRGVjbFN0bXQgKkRTID0gZHluX2Nhc3Q8RGVjbFN0bXQ+KFN0bXRFbGVtLT5nZXRTdG10KCkpKSB7CisgICAgICAgIGlmIChjb25zdCBWYXJEZWNsICpWYXIgPSBkeW5fY2FzdDxWYXJEZWNsPihEUy0+Z2V0U2luZ2xlRGVjbCgpKSkgeworICAgICAgICAgIGlmIChWYXItPmdldEluaXQoKS0+SWdub3JlSW1wbGljaXQoKSA9PSBDRSkgeworICAgICAgICAgICAgU1ZhbCBMVmFsdWUgPSBTdGF0ZS0+Z2V0TFZhbHVlKFZhciwgTEN0eCk7CisgICAgICAgICAgICBRdWFsVHlwZSBUeSA9IFZhci0+Z2V0VHlwZSgpOworICAgICAgICAgICAgTFZhbHVlID0gbWFrZVplcm9FbGVtZW50UmVnaW9uKFN0YXRlLCBMVmFsdWUsIFR5KTsKKyAgICAgICAgICAgIHJldHVybiBMVmFsdWUuZ2V0QXNSZWdpb24oKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJcyB0aGlzIGEgY29uc3RydWN0b3IgZm9yIGEgbWVtYmVyPworICAgIGlmIChPcHRpb25hbDxDRkdJbml0aWFsaXplcj4gSW5pdEVsZW0gPSBOZXh0LmdldEFzPENGR0luaXRpYWxpemVyPigpKSB7CisgICAgICBjb25zdCBDWFhDdG9ySW5pdGlhbGl6ZXIgKkluaXQgPSBJbml0RWxlbS0+Z2V0SW5pdGlhbGl6ZXIoKTsKKyAgICAgIGFzc2VydChJbml0LT5pc0FueU1lbWJlckluaXRpYWxpemVyKCkpOworCisgICAgICBjb25zdCBDWFhNZXRob2REZWNsICpDdXJDdG9yID0gY2FzdDxDWFhNZXRob2REZWNsPihMQ3R4LT5nZXREZWNsKCkpOworICAgICAgTG9jIFRoaXNQdHIgPSBFbmcuZ2V0U1ZhbEJ1aWxkZXIoKS5nZXRDWFhUaGlzKEN1ckN0b3IsCisgICAgICAgICAgTEN0eC0+Z2V0Q3VycmVudFN0YWNrRnJhbWUoKSk7CisgICAgICBTVmFsIFRoaXNWYWwgPSBTdGF0ZS0+Z2V0U1ZhbChUaGlzUHRyKTsKKworICAgICAgY29uc3QgVmFsdWVEZWNsICpGaWVsZDsKKyAgICAgIFNWYWwgRmllbGRWYWw7CisgICAgICBpZiAoSW5pdC0+aXNJbmRpcmVjdE1lbWJlckluaXRpYWxpemVyKCkpIHsKKyAgICAgICAgRmllbGQgPSBJbml0LT5nZXRJbmRpcmVjdE1lbWJlcigpOworICAgICAgICBGaWVsZFZhbCA9IFN0YXRlLT5nZXRMVmFsdWUoSW5pdC0+Z2V0SW5kaXJlY3RNZW1iZXIoKSwgVGhpc1ZhbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBGaWVsZCA9IEluaXQtPmdldE1lbWJlcigpOworICAgICAgICBGaWVsZFZhbCA9IFN0YXRlLT5nZXRMVmFsdWUoSW5pdC0+Z2V0TWVtYmVyKCksIFRoaXNWYWwpOworICAgICAgfQorCisgICAgICBRdWFsVHlwZSBUeSA9IEZpZWxkLT5nZXRUeXBlKCk7CisgICAgICBGaWVsZFZhbCA9IG1ha2VaZXJvRWxlbWVudFJlZ2lvbihTdGF0ZSwgRmllbGRWYWwsIFR5KTsKKyAgICAgIHJldHVybiBGaWVsZFZhbC5nZXRBc1JlZ2lvbigpOworICAgIH0KKworICAgIC8vIEZJWE1FOiBUaGlzIHdpbGwgZXZlbnR1YWxseSBuZWVkIHRvIGhhbmRsZSBuZXctZXhwcmVzc2lvbnMgYXMgd2VsbC4KKyAgICAvLyBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIHRoZSBwcmUtY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24gY29kZSBpbgorICAgIC8vIEV4cHJFbmdpbmU6OlZpc2l0Q1hYQ29uc3RydWN0RXhwci4KKyAgfQorCisgIC8vIElmIHdlIGNvdWxkbid0IGZpbmQgYW4gZXhpc3RpbmcgcmVnaW9uIHRvIGNvbnN0cnVjdCBpbnRvLCBhc3N1bWUgd2UncmUKKyAgLy8gY29uc3RydWN0aW5nIGEgdGVtcG9yYXJ5LgorICBNZW1SZWdpb25NYW5hZ2VyICZNUk1nciA9IEVuZy5nZXRTVmFsQnVpbGRlcigpLmdldFJlZ2lvbk1hbmFnZXIoKTsKKyAgcmV0dXJuIE1STWdyLmdldENYWFRlbXBPYmplY3RSZWdpb24oQ0UsIExDdHgpOworfQorCiB2b2lkIEV4cHJFbmdpbmU6OlZpc2l0Q1hYQ29uc3RydWN0RXhwcihjb25zdCBDWFhDb25zdHJ1Y3RFeHByICpDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZSAqUHJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGVkTm9kZVNldCAmZGVzdE5vZGVzKSB7CkBAIC0xMjIsNjIgKzE4MCw3IEBACiAKICAgc3dpdGNoIChDRS0+Z2V0Q29uc3RydWN0aW9uS2luZCgpKSB7CiAgIGNhc2UgQ1hYQ29uc3RydWN0RXhwcjo6Q0tfQ29tcGxldGU6IHsKLSAgICAvLyBTZWUgaWYgd2UncmUgY29uc3RydWN0aW5nIGFuIGV4aXN0aW5nIHJlZ2lvbiBieSBsb29raW5nIGF0IHRoZSBuZXh0Ci0gICAgLy8gZWxlbWVudCBpbiB0aGUgQ0ZHLgotICAgIGNvbnN0IENGR0Jsb2NrICpCID0gY3VyckJsZHJDdHgtPmdldEJsb2NrKCk7Ci0gICAgaWYgKGN1cnJTdG10SWR4ICsgMSA8IEItPnNpemUoKSkgewotICAgICAgQ0ZHRWxlbWVudCBOZXh0ID0gKCpCKVtjdXJyU3RtdElkeCsxXTsKLQotICAgICAgLy8gSXMgdGhpcyBhIGNvbnN0cnVjdG9yIGZvciBhIGxvY2FsIHZhcmlhYmxlPwotICAgICAgaWYgKE9wdGlvbmFsPENGR1N0bXQ+IFN0bXRFbGVtID0gTmV4dC5nZXRBczxDRkdTdG10PigpKSB7Ci0gICAgICAgIGlmIChjb25zdCBEZWNsU3RtdCAqRFMgPSBkeW5fY2FzdDxEZWNsU3RtdD4oU3RtdEVsZW0tPmdldFN0bXQoKSkpIHsKLSAgICAgICAgICBpZiAoY29uc3QgVmFyRGVjbCAqVmFyID0gZHluX2Nhc3Q8VmFyRGVjbD4oRFMtPmdldFNpbmdsZURlY2woKSkpIHsKLSAgICAgICAgICAgIGlmIChWYXItPmdldEluaXQoKS0+SWdub3JlSW1wbGljaXQoKSA9PSBDRSkgewotICAgICAgICAgICAgICBTVmFsIExWYWx1ZSA9IFN0YXRlLT5nZXRMVmFsdWUoVmFyLCBMQ3R4KTsKLSAgICAgICAgICAgICAgUXVhbFR5cGUgVHkgPSBWYXItPmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgTFZhbHVlID0gbWFrZVplcm9FbGVtZW50UmVnaW9uKFN0YXRlLCBMVmFsdWUsIFR5KTsKLSAgICAgICAgICAgICAgVGFyZ2V0ID0gTFZhbHVlLmdldEFzUmVnaW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIElzIHRoaXMgYSBjb25zdHJ1Y3RvciBmb3IgYSBtZW1iZXI/Ci0gICAgICBpZiAoT3B0aW9uYWw8Q0ZHSW5pdGlhbGl6ZXI+IEluaXRFbGVtID0gTmV4dC5nZXRBczxDRkdJbml0aWFsaXplcj4oKSkgewotICAgICAgICBjb25zdCBDWFhDdG9ySW5pdGlhbGl6ZXIgKkluaXQgPSBJbml0RWxlbS0+Z2V0SW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgYXNzZXJ0KEluaXQtPmlzQW55TWVtYmVySW5pdGlhbGl6ZXIoKSk7Ci0KLSAgICAgICAgY29uc3QgQ1hYTWV0aG9kRGVjbCAqQ3VyQ3RvciA9IGNhc3Q8Q1hYTWV0aG9kRGVjbD4oTEN0eC0+Z2V0RGVjbCgpKTsKLSAgICAgICAgTG9jIFRoaXNQdHIgPSBnZXRTVmFsQnVpbGRlcigpLmdldENYWFRoaXMoQ3VyQ3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEN0eC0+Z2V0Q3VycmVudFN0YWNrRnJhbWUoKSk7Ci0gICAgICAgIFNWYWwgVGhpc1ZhbCA9IFN0YXRlLT5nZXRTVmFsKFRoaXNQdHIpOwotCi0gICAgICAgIGNvbnN0IFZhbHVlRGVjbCAqRmllbGQ7Ci0gICAgICAgIFNWYWwgRmllbGRWYWw7Ci0gICAgICAgIGlmIChJbml0LT5pc0luZGlyZWN0TWVtYmVySW5pdGlhbGl6ZXIoKSkgewotICAgICAgICAgIEZpZWxkID0gSW5pdC0+Z2V0SW5kaXJlY3RNZW1iZXIoKTsKLSAgICAgICAgICBGaWVsZFZhbCA9IFN0YXRlLT5nZXRMVmFsdWUoSW5pdC0+Z2V0SW5kaXJlY3RNZW1iZXIoKSwgVGhpc1ZhbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgRmllbGQgPSBJbml0LT5nZXRNZW1iZXIoKTsKLSAgICAgICAgICBGaWVsZFZhbCA9IFN0YXRlLT5nZXRMVmFsdWUoSW5pdC0+Z2V0TWVtYmVyKCksIFRoaXNWYWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgUXVhbFR5cGUgVHkgPSBGaWVsZC0+Z2V0VHlwZSgpOwotICAgICAgICBGaWVsZFZhbCA9IG1ha2VaZXJvRWxlbWVudFJlZ2lvbihTdGF0ZSwgRmllbGRWYWwsIFR5KTsKLSAgICAgICAgVGFyZ2V0ID0gRmllbGRWYWwuZ2V0QXNSZWdpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gRklYTUU6IFRoaXMgd2lsbCBldmVudHVhbGx5IG5lZWQgdG8gaGFuZGxlIG5ldy1leHByZXNzaW9ucyBhcyB3ZWxsLgotICAgICAgLy8gRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB0aGUgcHJlLWNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uIGNvZGUgYmVsb3cuCi0gICAgfQotCi0gICAgLy8gSWYgd2UgY291bGRuJ3QgZmluZCBhbiBleGlzdGluZyByZWdpb24gdG8gY29uc3RydWN0IGludG8sIGFzc3VtZSB3ZSdyZQotICAgIC8vIGNvbnN0cnVjdGluZyBhIHRlbXBvcmFyeS4KLSAgICBpZiAoIVRhcmdldCkgewotICAgICAgTWVtUmVnaW9uTWFuYWdlciAmTVJNZ3IgPSBnZXRTVmFsQnVpbGRlcigpLmdldFJlZ2lvbk1hbmFnZXIoKTsKLSAgICAgIFRhcmdldCA9IE1STWdyLmdldENYWFRlbXBPYmplY3RSZWdpb24oQ0UsIExDdHgpOwotICAgIH0KLQorICAgIFRhcmdldCA9IGdldFJlZ2lvbkZvckNvbnN0cnVjdGVkT2JqZWN0KENFLCBQcmVkLCAqdGhpcywgY3VyclN0bXRJZHgpOwogICAgIGJyZWFrOwogICB9CiAgIGNhc2UgQ1hYQ29uc3RydWN0RXhwcjo6Q0tfVmlydHVhbEJhc2U6CkBAIC0zMjksNiArMzMyLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQ2FsbCwgKnRoaXMpOwogfQogCit2b2lkIEV4cHJFbmdpbmU6OlZpc2l0Q1hYTmV3QWxsb2NhdG9yQ2FsbChjb25zdCBDWFhOZXdFeHByICpDTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGUgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCkgeworICBQcm9ncmFtU3RhdGVSZWYgU3RhdGUgPSBQcmVkLT5nZXRTdGF0ZSgpOworICBjb25zdCBMb2NhdGlvbkNvbnRleHQgKkxDdHggPSBQcmVkLT5nZXRMb2NhdGlvbkNvbnRleHQoKTsKKyAgUHJldHR5U3RhY2tUcmFjZUxvYyBDcmFzaEluZm8oZ2V0Q29udGV4dCgpLmdldFNvdXJjZU1hbmFnZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ05FLT5nZXRTdGFydExvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZXZhbHVhdGluZyBOZXcgQWxsb2NhdG9yIENhbGwiKTsKKyAgQ2FsbEV2ZW50TWFuYWdlciAmQ0VNZ3IgPSBnZXRTdGF0ZU1hbmFnZXIoKS5nZXRDYWxsRXZlbnRNYW5hZ2VyKCk7CisgIENhbGxFdmVudFJlZjxDWFhBbGxvY2F0b3JDYWxsPiBDYWxsID0KKyAgICBDRU1nci5nZXRDWFhBbGxvY2F0b3JDYWxsKENORSwgU3RhdGUsIExDdHgpOworCisgIEV4cGxvZGVkTm9kZVNldCBEc3RQcmVDYWxsOworICBnZXRDaGVja2VyTWFuYWdlcigpLnJ1bkNoZWNrZXJzRm9yUHJlQ2FsbChEc3RQcmVDYWxsLCBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQ2FsbCwgKnRoaXMpOworCisgIEV4cGxvZGVkTm9kZVNldCBEc3RJbnZhbGlkYXRlZDsKKyAgU3RtdE5vZGVCdWlsZGVyIEJsZHIoRHN0UHJlQ2FsbCwgRHN0SW52YWxpZGF0ZWQsICpjdXJyQmxkckN0eCk7CisgIGZvciAoRXhwbG9kZWROb2RlU2V0OjppdGVyYXRvciBJID0gRHN0UHJlQ2FsbC5iZWdpbigpLCBFID0gRHN0UHJlQ2FsbC5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBkZWZhdWx0RXZhbENhbGwoQmxkciwgKkksICpDYWxsKTsKKyAgZ2V0Q2hlY2tlck1hbmFnZXIoKS5ydW5DaGVja2Vyc0ZvclBvc3RDYWxsKERzdCwgRHN0SW52YWxpZGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQ2FsbCwgKnRoaXMpOworfQorCisKIHZvaWQgRXhwckVuZ2luZTo6VmlzaXRDWFhOZXdFeHByKGNvbnN0IENYWE5ld0V4cHIgKkNORSwgRXhwbG9kZWROb2RlICpQcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsb2RlZE5vZGVTZXQgJkRzdCkgewogICAvLyBGSVhNRTogTXVjaCBvZiB0aGlzIHNob3VsZCBldmVudHVhbGx5IG1pZ3JhdGUgdG8gQ1hYQWxsb2NhdG9yQ2FsbC4KZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0V4cHJFbmdpbmVDYWxsQW5kUmV0dXJuLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0V4cHJFbmdpbmVDYWxsQW5kUmV0dXJuLmNwcAppbmRleCAwNjMyOGU0Li43MmFmNzVkIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9FeHByRW5naW5lQ2FsbEFuZFJldHVybi5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvRXhwckVuZ2luZUNhbGxBbmRSZXR1cm4uY3BwCkBAIC00OSw3ICs0OSw3IEBACiAgIGFzc2VydChFbnRyeS0+ZW1wdHkoKSk7CiAgIGFzc2VydChFbnRyeS0+c3VjY19zaXplKCkgPT0gMSk7CiAgIAotICAvLyBHZXQgdGhlIHNvbGl0YXJ5IHN1Y2Vzc29yLgorICAvLyBHZXQgdGhlIHNvbGl0YXJ5IHN1Y2Nlc3Nvci4KICAgY29uc3QgQ0ZHQmxvY2sgKlN1Y2MgPSAqKEVudHJ5LT5zdWNjX2JlZ2luKCkpOwogICAKICAgLy8gQ29uc3RydWN0IGFuIGVkZ2UgcmVwcmVzZW50aW5nIHRoZSBzdGFydGluZyBsb2NhdGlvbiBpbiB0aGUgY2FsbGVlLgpAQCAtMTYyLDcgKzE2Miw3IEBACiAgIC8vIEZpbmQgdGhlIGxhc3Qgc3RhdGVtZW50IGluIHRoZSBmdW5jdGlvbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYmFzaWMgYmxvY2suCiAgIGNvbnN0IFN0bXQgKkxhc3RTdCA9IDA7CiAgIGNvbnN0IENGR0Jsb2NrICpCbGsgPSAwOwotICBsbHZtOjp0aWUoTGFzdFN0LCBCbGspID0gZ2V0TGFzdFN0bXQoUHJlZCk7CisgIHN0ZDo6dGllKExhc3RTdCwgQmxrKSA9IGdldExhc3RTdG10KFByZWQpOwogICBpZiAoIUJsayB8fCAhTGFzdFN0KSB7CiAgICAgRHN0LkFkZChQcmVkKTsKICAgICByZXR1cm47CkBAIC0yMzEsNyArMjMxLDcgQEAKICAgLy8gRmluZCB0aGUgbGFzdCBzdGF0ZW1lbnQgaW4gdGhlIGZ1bmN0aW9uIGFuZCB0aGUgY29ycmVzcG9uZGluZyBiYXNpYyBibG9jay4KICAgY29uc3QgU3RtdCAqTGFzdFN0ID0gMDsKICAgY29uc3QgQ0ZHQmxvY2sgKkJsayA9IDA7Ci0gIGxsdm06OnRpZShMYXN0U3QsIEJsaykgPSBnZXRMYXN0U3RtdChDRUJOb2RlKTsKKyAgc3RkOjp0aWUoTGFzdFN0LCBCbGspID0gZ2V0TGFzdFN0bXQoQ0VCTm9kZSk7CiAKICAgLy8gR2VuZXJhdGUgYSBDYWxsRXZlbnQgL2JlZm9yZS8gY2xlYW5pbmcgdGhlIHN0YXRlLCBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlCiAgIC8vIGNvcnJlY3QgdmFsdWUgZm9yICd0aGlzJyAoaWYgbmVjZXNzYXJ5KS4KQEAgLTI4Miw3ICsyODIsNyBAQAogICAvLyB0aGV5IG9jY3VycmVkLgogICBFeHBsb2RlZE5vZGVTZXQgQ2xlYW5lZE5vZGVzOwogICBpZiAoTGFzdFN0ICYmIEJsayAmJiBBTWdyLm9wdGlvbnMuQW5hbHlzaXNQdXJnZU9wdCAhPSBQdXJnZU5vbmUpIHsKLSAgICBzdGF0aWMgU2ltcGxlUHJvZ3JhbVBvaW50VGFnIHJldFZhbEJpbmQoIkV4cHJFbmdpbmUgOiBCaW5kIFJldHVybiBWYWx1ZSIpOworICAgIHN0YXRpYyBTaW1wbGVQcm9ncmFtUG9pbnRUYWcgcmV0VmFsQmluZCgiRXhwckVuZ2luZSIsICJCaW5kIFJldHVybiBWYWx1ZSIpOwogICAgIFBvc3RTdG10IExvYyhMYXN0U3QsIGNhbGxlZUN0eCwgJnJldFZhbEJpbmQpOwogICAgIGJvb2wgaXNOZXc7CiAgICAgRXhwbG9kZWROb2RlICpCaW5kZWRSZXROb2RlID0gRy5nZXROb2RlKExvYywgc3RhdGUsIGZhbHNlLCAmaXNOZXcpOwpAQCAtNjY0LDYgKzY2NCw4IEBACiAgICAgYnJlYWs7CiAgIH0KICAgY2FzZSBDRV9DWFhBbGxvY2F0b3I6CisgICAgaWYgKE9wdHMubWF5SW5saW5lQ1hYQWxsb2NhdG9yKCkpCisgICAgICBicmVhazsKICAgICAvLyBEbyBub3QgaW5saW5lIGFsbG9jYXRvcnMgdW50aWwgd2UgbW9kZWwgZGVhbGxvY2F0b3JzLgogICAgIC8vIFRoaXMgaXMgdW5mb3J0dW5hdGUsIGJ1dCBiYXNpY2FsbHkgbmVjZXNzYXJ5IGZvciBzbWFydCBwb2ludGVycyBhbmQgc3VjaC4KICAgICByZXR1cm4gQ0lQX0Rpc2FsbG93ZWRBbHdheXM7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9FeHByRW5naW5lT2JqQy5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9FeHByRW5naW5lT2JqQy5jcHAKaW5kZXggZDI3NmQ5Mi4uNTdjMDRiZiAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvRXhwckVuZ2luZU9iakMuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0V4cHJFbmdpbmVPYmpDLmNwcApAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICAgICAgICByZWNWYWwuY2FzdEFzPERlZmluZWRPclVua25vd25TVmFsPigpOwogCiAgICAgICAgIFByb2dyYW1TdGF0ZVJlZiBub3ROaWxTdGF0ZSwgbmlsU3RhdGU7Ci0gICAgICAgIGxsdm06OnRpZShub3ROaWxTdGF0ZSwgbmlsU3RhdGUpID0gU3RhdGUtPmFzc3VtZShyZWNlaXZlclZhbCk7CisgICAgICAgIHN0ZDo6dGllKG5vdE5pbFN0YXRlLCBuaWxTdGF0ZSkgPSBTdGF0ZS0+YXNzdW1lKHJlY2VpdmVyVmFsKTsKICAgICAgICAgCiAgICAgICAgIC8vIFRoZXJlIGFyZSB0aHJlZSBjYXNlczogY2FuIGJlIG5pbCBvciBub24tbmlsLCBtdXN0IGJlIG5pbCwgbXVzdCBiZQogICAgICAgICAvLyBub24tbmlsLiBXZSBpZ25vcmUgbXVzdCBiZSBuaWwsIGFuZCBtZXJnZSB0aGUgcmVzdCB0d28gaW50byBub24tbmlsLgpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvSFRNTERpYWdub3N0aWNzLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0hUTUxEaWFnbm9zdGljcy5jcHAKaW5kZXggMzY1ZjZhYi4uMDdhNzkzZSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvSFRNTERpYWdub3N0aWNzLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9IVE1MRGlhZ25vc3RpY3MuY3BwCkBAIC00NCwxMCArNDQsMTAgQEAKIAogICB2aXJ0dWFsIH5IVE1MRGlhZ25vc3RpY3MoKSB7IEZsdXNoRGlhZ25vc3RpY3MoTlVMTCk7IH0KIAotICB2aXJ0dWFsIHZvaWQgRmx1c2hEaWFnbm9zdGljc0ltcGwoc3RkOjp2ZWN0b3I8Y29uc3QgUGF0aERpYWdub3N0aWMgKj4gJkRpYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZXNNYWRlICpmaWxlc01hZGUpOworICB2b2lkIEZsdXNoRGlhZ25vc3RpY3NJbXBsKHN0ZDo6dmVjdG9yPGNvbnN0IFBhdGhEaWFnbm9zdGljICo+ICZEaWFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlc01hZGUgKmZpbGVzTWFkZSkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuICJIVE1MRGlhZ25vc3RpY3MiOwogICB9CiAKQEAgLTk5LDkgKzk5LDcgQEAKICAgLy8gQ3JlYXRlIHRoZSBIVE1MIGRpcmVjdG9yeSBpZiBpdCBpcyBtaXNzaW5nLgogICBpZiAoIWNyZWF0ZWREaXIpIHsKICAgICBjcmVhdGVkRGlyID0gdHJ1ZTsKLSAgICBib29sIGV4aXN0ZWQ7Ci0gICAgaWYgKGxsdm06OmVycm9yX2NvZGUgZWMgPQotICAgICAgICAgICAgbGx2bTo6c3lzOjpmczo6Y3JlYXRlX2RpcmVjdG9yaWVzKERpcmVjdG9yeSwgZXhpc3RlZCkpIHsKKyAgICBpZiAobGx2bTo6ZXJyb3JfY29kZSBlYyA9IGxsdm06OnN5czo6ZnM6OmNyZWF0ZV9kaXJlY3RvcmllcyhEaXJlY3RvcnkpKSB7CiAgICAgICBsbHZtOjplcnJzKCkgPDwgIndhcm5pbmc6IGNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICciCiAgICAgICAgICAgICAgICAgICAgPDwgRGlyZWN0b3J5IDw8ICInOiAiIDw8IGVjLm1lc3NhZ2UoKSA8PCAnXG4nOwogCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9NZW1SZWdpb24uY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvTWVtUmVnaW9uLmNwcAppbmRleCAxNjJjZDMzLi44ZjZjMzczIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9NZW1SZWdpb24uY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL01lbVJlZ2lvbi5jcHAKQEAgLTk3NSwxMCArOTc1LDggQEAKICAgaWYgKElzVmlydHVhbCkKICAgICByZXR1cm4gQ2xhc3MtPmlzVmlydHVhbGx5RGVyaXZlZEZyb20oQmFzZUNsYXNzKTsKIAotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IENsYXNzLT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IENsYXNzLT5iYXNlc19lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIGlmIChJLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpLT5nZXRDYW5vbmljYWxEZWNsKCkgPT0gQmFzZUNsYXNzKQorICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBDbGFzcy0+YmFzZXMoKSkgeworICAgIGlmIChJLmdldFR5cGUoKS0+Z2V0QXNDWFhSZWNvcmREZWNsKCktPmdldENhbm9uaWNhbERlY2woKSA9PSBCYXNlQ2xhc3MpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCkBAIC0xMTc2LDEwICsxMTc0LDggQEAKICAgLy8gTm90ZSB0aGF0IHdlIGRvIE5PVCBjYW5vbmljYWxpemUgdGhlIGJhc2UgY2xhc3MgaGVyZSwgYmVjYXVzZQogICAvLyBBU1RSZWNvcmRMYXlvdXQgZG9lc24ndCBlaXRoZXIuIElmIHRoYXQgbGVhZHMgdXMgZG93biB0aGUgd3JvbmcgcGF0aCwKICAgLy8gc28gYmUgaXQ7IGF0IGxlYXN0IHdlIHdvbid0IGNyYXNoLgotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IgSSA9IENoaWxkLT5iYXNlc19iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IENoaWxkLT5iYXNlc19lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIGlmIChJLT5nZXRUeXBlKCktPmdldEFzQ1hYUmVjb3JkRGVjbCgpID09IEJhc2UpCisgIGZvciAoY29uc3QgYXV0byAmSSA6IENoaWxkLT5iYXNlcygpKSB7CisgICAgaWYgKEkuZ2V0VHlwZSgpLT5nZXRBc0NYWFJlY29yZERlY2woKSA9PSBCYXNlKQogICAgICAgcmV0dXJuIHRydWU7CiAgIH0KIApAQCAtMTM2Myw3ICsxMzU5LDcgQEAKICAgY29uc3QgVmFyUmVnaW9uICpWUiA9IDA7CiAgIGNvbnN0IFZhclJlZ2lvbiAqT3JpZ2luYWxWUiA9IDA7CiAKLSAgaWYgKCFWRC0+Z2V0QXR0cjxCbG9ja3NBdHRyPigpICYmIFZELT5oYXNMb2NhbFN0b3JhZ2UoKSkgeworICBpZiAoIVZELT5oYXNBdHRyPEJsb2Nrc0F0dHI+KCkgJiYgVkQtPmhhc0xvY2FsU3RvcmFnZSgpKSB7CiAgICAgVlIgPSBNZW1NZ3IuZ2V0VmFyUmVnaW9uKFZELCB0aGlzKTsKICAgICBPcmlnaW5hbFZSID0gTWVtTWdyLmdldFZhclJlZ2lvbihWRCwgTEMpOwogICB9CkBAIC0xMzg2LDcgKzEzODIsNyBAQAogCiAgIEFuYWx5c2lzRGVjbENvbnRleHQgKkFDID0gZ2V0Q29kZVJlZ2lvbigpLT5nZXRBbmFseXNpc0RlY2xDb250ZXh0KCk7CiAgIEFuYWx5c2lzRGVjbENvbnRleHQ6OnJlZmVyZW5jZWRfZGVjbHNfaXRlcmF0b3IgSSwgRTsKLSAgbGx2bTo6dGllKEksIEUpID0gQUMtPmdldFJlZmVyZW5jZWRCbG9ja1ZhcnMoQkMtPmdldERlY2woKSk7CisgIHN0ZDo6dGllKEksIEUpID0gQUMtPmdldFJlZmVyZW5jZWRCbG9ja1ZhcnMoQkMtPmdldERlY2woKSk7CiAKICAgaWYgKEkgPT0gRSkgewogICAgIFJlZmVyZW5jZWRWYXJzID0gKHZvaWQqKSAweDE7CkBAIC0xNDA2LDcgKzE0MDIsNyBAQAogICBmb3IgKCA7IEkgIT0gRTsgKytJKSB7CiAgICAgY29uc3QgVmFyUmVnaW9uICpWUiA9IDA7CiAgICAgY29uc3QgVmFyUmVnaW9uICpPcmlnaW5hbFZSID0gMDsKLSAgICBsbHZtOjp0aWUoVlIsIE9yaWdpbmFsVlIpID0gZ2V0Q2FwdHVyZVJlZ2lvbnMoKkkpOworICAgIHN0ZDo6dGllKFZSLCBPcmlnaW5hbFZSKSA9IGdldENhcHR1cmVSZWdpb25zKCpJKTsKICAgICBhc3NlcnQoVlIpOwogICAgIGFzc2VydChPcmlnaW5hbFZSKTsKICAgICBCVi0+cHVzaF9iYWNrKFZSLCBCQyk7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoRGlhZ25vc3RpYy5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9QYXRoRGlhZ25vc3RpYy5jcHAKaW5kZXggYjUwNGRiNi4uODllNDMwOSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvUGF0aERpYWdub3N0aWMuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhEaWFnbm9zdGljLmNwcApAQCAtMTA2LDEyICsxMDYsMTMgQEAKIAogUGF0aERpYWdub3N0aWM6On5QYXRoRGlhZ25vc3RpYygpIHt9CiAKLVBhdGhEaWFnbm9zdGljOjpQYXRoRGlhZ25vc3RpYyhjb25zdCBEZWNsICpkZWNsV2l0aElzc3VlLAorUGF0aERpYWdub3N0aWM6OlBhdGhEaWFnbm9zdGljKFN0cmluZ1JlZiBDaGVja05hbWUsIGNvbnN0IERlY2wgKmRlY2xXaXRoSXNzdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIGJ1Z3R5cGUsIFN0cmluZ1JlZiB2ZXJib3NlRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgc2hvcnREZXNjLCBTdHJpbmdSZWYgY2F0ZWdvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aERpYWdub3N0aWNMb2NhdGlvbiBMb2NhdGlvblRvVW5pcXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2wgKkRlY2xUb1VuaXF1ZSkKLSAgOiBEZWNsV2l0aElzc3VlKGRlY2xXaXRoSXNzdWUpLAorICA6IENoZWNrTmFtZShDaGVja05hbWUpLAorICAgIERlY2xXaXRoSXNzdWUoZGVjbFdpdGhJc3N1ZSksCiAgICAgQnVnVHlwZShTdHJpcFRyYWlsaW5nRG90cyhidWd0eXBlKSksCiAgICAgVmVyYm9zZURlc2MoU3RyaXBUcmFpbGluZ0RvdHModmVyYm9zZURlc2MpKSwKICAgICBTaG9ydERlc2MoU3RyaXBUcmFpbGluZ0RvdHMoc2hvcnREZXNjKSksCkBAIC0xOTYsOCArMTk3LDggQEAKIH0KIAogdm9pZCBQYXRoRGlhZ25vc3RpY0NvbnN1bWVyOjpIYW5kbGVQYXRoRGlhZ25vc3RpYyhQYXRoRGlhZ25vc3RpYyAqRCkgewotICBPd25pbmdQdHI8UGF0aERpYWdub3N0aWM+IE93bmluZ0QoRCk7Ci0gIAorICBzdGQ6OnVuaXF1ZV9wdHI8UGF0aERpYWdub3N0aWM+IE93bmluZ0QoRCk7CisKICAgaWYgKCFEIHx8IEQtPnBhdGguZW1wdHkoKSkKICAgICByZXR1cm47CiAgIApAQCAtMjc0LDggKzI3NSw4IEBACiAgICAgRGlhZ3MuUmVtb3ZlTm9kZShvcmlnKTsKICAgICBkZWxldGUgb3JpZzsKICAgfQotICAKLSAgRGlhZ3MuSW5zZXJ0Tm9kZShPd25pbmdELnRha2UoKSk7CisKKyAgRGlhZ3MuSW5zZXJ0Tm9kZShPd25pbmdELnJlbGVhc2UoKSk7CiB9CiAKIHN0YXRpYyBPcHRpb25hbDxib29sPiBjb21wYXJlUGF0aChjb25zdCBQYXRoUGllY2VzICZYLCBjb25zdCBQYXRoUGllY2VzICZZKTsKQEAgLTQxNSwxNyArNDE2LDYgQEAKICAgcmV0dXJuIGIuZ2V0VmFsdWUoKTsKIH0KIAotbmFtZXNwYWNlIHsKLXN0cnVjdCBDb21wYXJlRGlhZ25vc3RpY3MgewotICAvLyBDb21wYXJlIGlmICdYJyBpcyAiPCIgdGhhbiAnWScuCi0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBQYXRoRGlhZ25vc3RpYyAqWCwgY29uc3QgUGF0aERpYWdub3N0aWMgKlkpIGNvbnN0IHsKLSAgICBpZiAoWCA9PSBZKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBjb21wYXJlKCpYLCAqWSk7Ci0gIH0KLX07Ci19Ci0KIHZvaWQgUGF0aERpYWdub3N0aWNDb25zdW1lcjo6Rmx1c2hEaWFnbm9zdGljcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoRGlhZ25vc3RpY0NvbnN1bWVyOjpGaWxlc01hZGUgKkZpbGVzKSB7CiAgIGlmIChmbHVzaGVkKQpAQCAtNDQzLDggKzQzMywxMSBAQAogICAvLyBTb3J0IHRoZSBkaWFnbm9zdGljcyBzbyB0aGF0IHRoZXkgYXJlIGFsd2F5cyBlbWl0dGVkIGluIGEgZGV0ZXJtaW5pc3RpYwogICAvLyBvcmRlci4KICAgaWYgKCFCYXRjaERpYWdzLmVtcHR5KCkpCi0gICAgc3RkOjpzb3J0KEJhdGNoRGlhZ3MuYmVnaW4oKSwgQmF0Y2hEaWFncy5lbmQoKSwgQ29tcGFyZURpYWdub3N0aWNzKCkpOwotICAKKyAgICBzdGQ6OnNvcnQoQmF0Y2hEaWFncy5iZWdpbigpLCBCYXRjaERpYWdzLmVuZCgpLAorICAgICAgICAgICAgICBbXShjb25zdCBQYXRoRGlhZ25vc3RpYyAqWCwgY29uc3QgUGF0aERpYWdub3N0aWMgKlkpIHsKKyAgICAgIHJldHVybiBYICE9IFkgJiYgY29tcGFyZSgqWCwgKlkpOworICAgIH0pOworCiAgIEZsdXNoRGlhZ25vc3RpY3NJbXBsKEJhdGNoRGlhZ3MsIEZpbGVzKTsKIAogICAvLyBEZWxldGUgdGhlIGZsdXNoZWQgZGlhZ25vc3RpY3MuCkBAIC01NzEsNiArNTY0LDcgQEAKICAgICByZXR1cm4gUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlKENhbGxlckluZm8tPmdldERlY2woKSwgU00pOwogICB9CiAgIGNhc2UgQ0ZHRWxlbWVudDo6VGVtcG9yYXJ5RHRvcjoKKyAgY2FzZSBDRkdFbGVtZW50OjpOZXdBbGxvY2F0b3I6CiAgICAgbGx2bV91bnJlYWNoYWJsZSgibm90IHlldCBpbXBsZW1lbnRlZCEiKTsKICAgfQogCkBAIC02MTAsNiArNjA0LDE0IEBACiB9CiAKIFBhdGhEaWFnbm9zdGljTG9jYXRpb24KKyAgUGF0aERpYWdub3N0aWNMb2NhdGlvbjo6Y3JlYXRlQ29uZGl0aW9uYWxDb2xvbkxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uZGl0aW9uYWxPcGVyYXRvciAqQ08sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKSB7CisgIHJldHVybiBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uKENPLT5nZXRDb2xvbkxvYygpLCBTTSwgU2luZ2xlTG9jSyk7Cit9CisKKworUGF0aERpYWdub3N0aWNMb2NhdGlvbgogICBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uOjpjcmVhdGVNZW1iZXJMb2MoY29uc3QgTWVtYmVyRXhwciAqTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgewogICByZXR1cm4gUGF0aERpYWdub3N0aWNMb2NhdGlvbihNRS0+Z2V0TWVtYmVyTG9jKCksIFNNLCBTaW5nbGVMb2NLKTsKQEAgLTczMSw4ICs3MzMsMTIgQEAKICAgYXNzZXJ0KE4gJiYgIkNhbm5vdCBjcmVhdGUgYSBsb2NhdGlvbiB3aXRoIGEgbnVsbCBub2RlLiIpOwogICBjb25zdCBTdG10ICpTID0gZ2V0U3RtdChOKTsKIAotICBpZiAoIVMpCisgIGlmICghUykgeworICAgIC8vIElmIHRoaXMgaXMgYW4gaW1wbGljaXQgY2FsbCwgcmV0dXJuIHRoZSBpbXBsaWNpdCBjYWxsIHBvaW50IGxvY2F0aW9uLgorICAgIGlmIChPcHRpb25hbDxQcmVJbXBsaWNpdENhbGw+IFBJRSA9IE4tPmdldExvY2F0aW9uQXM8UHJlSW1wbGljaXRDYWxsPigpKQorICAgICAgcmV0dXJuIFBhdGhEaWFnbm9zdGljTG9jYXRpb24oUElFLT5nZXRMb2NhdGlvbigpLCBTTSk7CiAgICAgUyA9IGdldE5leHRTdG10KE4pOworICB9CiAKICAgaWYgKFMpIHsKICAgICBQcm9ncmFtUG9pbnQgUCA9IE4tPmdldExvY2F0aW9uKCk7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9QbGlzdERpYWdub3N0aWNzLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1BsaXN0RGlhZ25vc3RpY3MuY3BwCmluZGV4IDVkY2E4MTEuLjhlMWVhMjUgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1BsaXN0RGlhZ25vc3RpY3MuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1BsaXN0RGlhZ25vc3RpY3MuY3BwCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5emVyT3B0aW9ucy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0ZpbGVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvUGxpc3RTdXBwb3J0LmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvU291cmNlTWFuYWdlci5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ZlcnNpb24uaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvUHJlcHJvY2Vzc29yLmgiCkBAIC0yMSwxMiArMjIsOSBAQAogI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIGVudG87Ci0KLXR5cGVkZWYgbGx2bTo6RGVuc2VNYXA8RmlsZUlELCB1bnNpZ25lZD4gRklETWFwOwotCit1c2luZyBuYW1lc3BhY2UgbWFya3VwOwogCiBuYW1lc3BhY2UgewogICBjbGFzcyBQbGlzdERpYWdub3N0aWNzIDogcHVibGljIFBhdGhEaWFnbm9zdGljQ29uc3VtZXIgewpAQCAtNDIsMTUgKzQwLDE3IEBACiAgICAgdmlydHVhbCB+UGxpc3REaWFnbm9zdGljcygpIHt9CiAKICAgICB2b2lkIEZsdXNoRGlhZ25vc3RpY3NJbXBsKHN0ZDo6dmVjdG9yPGNvbnN0IFBhdGhEaWFnbm9zdGljICo+ICZEaWFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzTWFkZSAqZmlsZXNNYWRlKTsKLSAgICAKLSAgICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZXNNYWRlICpmaWxlc01hZGUpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHJldHVybiAiUGxpc3REaWFnbm9zdGljcyI7CiAgICAgfQogCi0gICAgUGF0aEdlbmVyYXRpb25TY2hlbWUgZ2V0R2VuZXJhdGlvblNjaGVtZSgpIGNvbnN0IHsgcmV0dXJuIEV4dGVuc2l2ZTsgfQotICAgIGJvb2wgc3VwcG9ydHNMb2dpY2FsT3BDb250cm9sRmxvdygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNDcm9zc0ZpbGVEaWFnbm9zdGljcygpIGNvbnN0IHsKKyAgICBQYXRoR2VuZXJhdGlvblNjaGVtZSBnZXRHZW5lcmF0aW9uU2NoZW1lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIEV4dGVuc2l2ZTsKKyAgICB9CisgICAgYm9vbCBzdXBwb3J0c0xvZ2ljYWxPcENvbnRyb2xGbG93KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgc3VwcG9ydHNDcm9zc0ZpbGVEaWFnbm9zdGljcygpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHJldHVybiBTdXBwb3J0c0Nyb3NzRmlsZURpYWdub3N0aWNzOwogICAgIH0KICAgfTsKQEAgLTgwLDg0ICs4MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQLmdldExhbmdPcHRzKCksIHRydWUpKTsKIH0KIAotc3RhdGljIHZvaWQgQWRkRklEKEZJRE1hcCAmRklEcywgU21hbGxWZWN0b3JJbXBsPEZpbGVJRD4gJlYsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciogU00sIFNvdXJjZUxvY2F0aW9uIEwpIHsKLQotICBGaWxlSUQgRklEID0gU00tPmdldEZpbGVJRChTTS0+Z2V0RXhwYW5zaW9uTG9jKEwpKTsKLSAgRklETWFwOjppdGVyYXRvciBJID0gRklEcy5maW5kKEZJRCk7Ci0gIGlmIChJICE9IEZJRHMuZW5kKCkpIHJldHVybjsKLSAgRklEc1tGSURdID0gVi5zaXplKCk7Ci0gIFYucHVzaF9iYWNrKEZJRCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBHZXRGSUQoY29uc3QgRklETWFwJiBGSURzLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKLSAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCkgewotICBGaWxlSUQgRklEID0gU00uZ2V0RmlsZUlEKFNNLmdldEV4cGFuc2lvbkxvYyhMKSk7Ci0gIEZJRE1hcDo6Y29uc3RfaXRlcmF0b3IgSSA9IEZJRHMuZmluZChGSUQpOwotICBhc3NlcnQoSSAhPSBGSURzLmVuZCgpKTsKLSAgcmV0dXJuIEktPnNlY29uZDsKLX0KLQotc3RhdGljIHJhd19vc3RyZWFtICZJbmRlbnQocmF3X29zdHJlYW0gJm8sIGNvbnN0IHVuc2lnbmVkIGluZGVudCkgewotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgaW5kZW50OyArK2kpIG8gPDwgJyAnOwotICByZXR1cm4gbzsKLX0KLQotc3RhdGljIHZvaWQgRW1pdExvY2F0aW9uKHJhd19vc3RyZWFtICZvLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24gTCwgY29uc3QgRklETWFwICZGTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRlbnQsIGJvb2wgZXh0ZW5kID0gZmFsc2UpIHsKLQotICBGdWxsU291cmNlTG9jIExvYyhTTS5nZXRFeHBhbnNpb25Mb2MoTCksIGNvbnN0X2Nhc3Q8U291cmNlTWFuYWdlciY+KFNNKSk7Ci0KLSAgLy8gQWRkIGluIHRoZSBsZW5ndGggb2YgdGhlIHRva2VuLCBzbyB0aGF0IHdlIGNvdmVyIG11bHRpLWNoYXIgdG9rZW5zLgotICB1bnNpZ25lZCBvZmZzZXQgPQotICAgIGV4dGVuZCA/IExleGVyOjpNZWFzdXJlVG9rZW5MZW5ndGgoTG9jLCBTTSwgTGFuZ09wdHMpIC0gMSA6IDA7Ci0KLSAgSW5kZW50KG8sIGluZGVudCkgPDwgIjxkaWN0PlxuIjsKLSAgSW5kZW50KG8sIGluZGVudCkgPDwgIiA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4iCi0gICAgICAgICAgICAgICAgICAgIDw8IExvYy5nZXRFeHBhbnNpb25MaW5lTnVtYmVyKCkgPDwgIjwvaW50ZWdlcj5cbiI7Ci0gIEluZGVudChvLCBpbmRlbnQpIDw8ICIgPGtleT5jb2w8L2tleT48aW50ZWdlcj4iCi0gICAgICAgICAgICAgICAgICAgIDw8IExvYy5nZXRFeHBhbnNpb25Db2x1bW5OdW1iZXIoKSArIG9mZnNldCA8PCAiPC9pbnRlZ2VyPlxuIjsKLSAgSW5kZW50KG8sIGluZGVudCkgPDwgIiA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4iCi0gICAgICAgICAgICAgICAgICAgIDw8IEdldEZJRChGTSwgU00sIExvYykgPDwgIjwvaW50ZWdlcj5cbiI7Ci0gIEluZGVudChvLCBpbmRlbnQpIDw8ICI8L2RpY3Q+XG4iOwotfQotCi1zdGF0aWMgdm9pZCBFbWl0TG9jYXRpb24ocmF3X29zdHJlYW0gJm8sIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmdPcHRpb25zICZMYW5nT3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXRoRGlhZ25vc3RpY0xvY2F0aW9uICZMLCBjb25zdCBGSURNYXAmIEZNLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGVudCwgYm9vbCBleHRlbmQgPSBmYWxzZSkgewotICBFbWl0TG9jYXRpb24obywgU00sIExhbmdPcHRzLCBMLmFzTG9jYXRpb24oKSwgRk0sIGluZGVudCwgZXh0ZW5kKTsKLX0KLQotc3RhdGljIHZvaWQgRW1pdFJhbmdlKHJhd19vc3RyZWFtICZvLCBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmTGFuZ09wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgUGF0aERpYWdub3N0aWNSYW5nZSBSLCBjb25zdCBGSURNYXAgJkZNLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGVudCkgewotICBJbmRlbnQobywgaW5kZW50KSA8PCAiPGFycmF5PlxuIjsKLSAgRW1pdExvY2F0aW9uKG8sIFNNLCBMYW5nT3B0cywgUi5nZXRCZWdpbigpLCBGTSwgaW5kZW50KzEpOwotICBFbWl0TG9jYXRpb24obywgU00sIExhbmdPcHRzLCBSLmdldEVuZCgpLCBGTSwgaW5kZW50KzEsICFSLmlzUG9pbnQpOwotICBJbmRlbnQobywgaW5kZW50KSA8PCAiPC9hcnJheT5cbiI7Ci19Ci0KLXN0YXRpYyByYXdfb3N0cmVhbSAmRW1pdFN0cmluZyhyYXdfb3N0cmVhbSAmbywgU3RyaW5nUmVmIHMpIHsKLSAgbyA8PCAiPHN0cmluZz4iOwotICBmb3IgKFN0cmluZ1JlZjo6Y29uc3RfaXRlcmF0b3IgSSA9IHMuYmVnaW4oKSwgRSA9IHMuZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY2hhciBjID0gKkk7Ci0gICAgc3dpdGNoIChjKSB7Ci0gICAgZGVmYXVsdDogICBvIDw8IGM7IGJyZWFrOwotICAgIGNhc2UgJyYnOiAgbyA8PCAiJmFtcDsiOyBicmVhazsKLSAgICBjYXNlICc8JzogIG8gPDwgIiZsdDsiOyBicmVhazsKLSAgICBjYXNlICc+JzogIG8gPDwgIiZndDsiOyBicmVhazsKLSAgICBjYXNlICdcJyc6IG8gPDwgIiZhcG9zOyI7IGJyZWFrOwotICAgIGNhc2UgJ1wiJzogbyA8PCAiJnF1b3Q7IjsgYnJlYWs7Ci0gICAgfQotICB9Ci0gIG8gPDwgIjwvc3RyaW5nPiI7Ci0gIHJldHVybiBvOwotfQotCiBzdGF0aWMgdm9pZCBSZXBvcnRDb250cm9sRmxvdyhyYXdfb3N0cmVhbSAmbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhdGhEaWFnbm9zdGljQ29udHJvbEZsb3dQaWVjZSYgUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJRE1hcCYgRk0sCkBAIC0xODUsMTEgKzEwNywxMyBAQAogICAgIC8vIGxvZ2ljIGZvciBjbGllbnRzLgogICAgIEluZGVudChvLCBpbmRlbnQpIDw8ICI8a2V5PnN0YXJ0PC9rZXk+XG4iOwogICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0RWRnZSA9IEktPmdldFN0YXJ0KCkuYXNSYW5nZSgpLmdldEJlZ2luKCk7Ci0gICAgRW1pdFJhbmdlKG8sIFNNLCBMYW5nT3B0cywgU291cmNlUmFuZ2UoU3RhcnRFZGdlLCBTdGFydEVkZ2UpLCBGTSwgaW5kZW50KzEpOworICAgIEVtaXRSYW5nZShvLCBTTSwgTGFuZ09wdHMsIENoYXJTb3VyY2VSYW5nZTo6Z2V0VG9rZW5SYW5nZShTdGFydEVkZ2UpLCBGTSwKKyAgICAgICAgICAgICAgaW5kZW50ICsgMSk7CiAKICAgICBJbmRlbnQobywgaW5kZW50KSA8PCAiPGtleT5lbmQ8L2tleT5cbiI7CiAgICAgU291cmNlTG9jYXRpb24gRW5kRWRnZSA9IEktPmdldEVuZCgpLmFzUmFuZ2UoKS5nZXRCZWdpbigpOwotICAgIEVtaXRSYW5nZShvLCBTTSwgTGFuZ09wdHMsIFNvdXJjZVJhbmdlKEVuZEVkZ2UsIEVuZEVkZ2UpLCBGTSwgaW5kZW50KzEpOworICAgIEVtaXRSYW5nZShvLCBTTSwgTGFuZ09wdHMsIENoYXJTb3VyY2VSYW5nZTo6Z2V0VG9rZW5SYW5nZShFbmRFZGdlKSwgRk0sCisgICAgICAgICAgICAgIGluZGVudCArIDEpOwogCiAgICAgLS1pbmRlbnQ7CiAgICAgSW5kZW50KG8sIGluZGVudCkgPDwgIjwvZGljdD5cbiI7CkBAIC0yNDEsNyArMTY1LDggQEAKICAgICArK2luZGVudDsKICAgICBmb3IgKEFycmF5UmVmPFNvdXJjZVJhbmdlPjo6aXRlcmF0b3IgSSA9IFJhbmdlcy5iZWdpbigpLCBFID0gUmFuZ2VzLmVuZCgpOwogICAgICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICAgIEVtaXRSYW5nZShvLCBTTSwgTGFuZ09wdHMsICpJLCBGTSwgaW5kZW50KzEpOworICAgICAgRW1pdFJhbmdlKG8sIFNNLCBMYW5nT3B0cywgQ2hhclNvdXJjZVJhbmdlOjpnZXRUb2tlblJhbmdlKCpJKSwgRk0sCisgICAgICAgICAgICAgICAgaW5kZW50ICsgMSk7CiAgICAgfQogICAgIC0taW5kZW50OwogICAgIEluZGVudChvLCBpbmRlbnQpIDw8ICI8L2FycmF5PlxuIjsKQEAgLTM4NywxMiArMzEyLDEyIEBACiAgICAgICBmb3IgKFBhdGhQaWVjZXM6OmNvbnN0X2l0ZXJhdG9yIEkgPSBwYXRoLmJlZ2luKCksIEUgPSBwYXRoLmVuZCgpOyBJICE9IEU7CiAgICAgICAgICAgICsrSSkgewogICAgICAgICBjb25zdCBQYXRoRGlhZ25vc3RpY1BpZWNlICpwaWVjZSA9IEktPmdldFB0cigpOwotICAgICAgICBBZGRGSUQoRk0sIEZpZHMsIFNNLCBwaWVjZS0+Z2V0TG9jYXRpb24oKS5hc0xvY2F0aW9uKCkpOworICAgICAgICBBZGRGSUQoRk0sIEZpZHMsICpTTSwgcGllY2UtPmdldExvY2F0aW9uKCkuYXNMb2NhdGlvbigpKTsKICAgICAgICAgQXJyYXlSZWY8U291cmNlUmFuZ2U+IFJhbmdlcyA9IHBpZWNlLT5nZXRSYW5nZXMoKTsKICAgICAgICAgZm9yIChBcnJheVJlZjxTb3VyY2VSYW5nZT46Oml0ZXJhdG9yIEkgPSBSYW5nZXMuYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBSYW5nZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICAgICAgQWRkRklEKEZNLCBGaWRzLCBTTSwgSS0+Z2V0QmVnaW4oKSk7Ci0gICAgICAgICAgQWRkRklEKEZNLCBGaWRzLCBTTSwgSS0+Z2V0RW5kKCkpOworICAgICAgICAgIEFkZEZJRChGTSwgRmlkcywgKlNNLCBJLT5nZXRCZWdpbigpKTsKKyAgICAgICAgICBBZGRGSUQoRk0sIEZpZHMsICpTTSwgSS0+Z2V0RW5kKCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGNvbnN0IFBhdGhEaWFnbm9zdGljQ2FsbFBpZWNlICpjYWxsID0KQEAgLTQwMCw3ICszMjUsNyBAQAogICAgICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxQYXRoRGlhZ25vc3RpY0V2ZW50UGllY2U+CiAgICAgICAgICAgICBjYWxsRW50ZXJXaXRoaW4gPSBjYWxsLT5nZXRDYWxsRW50ZXJXaXRoaW5DYWxsZXJFdmVudCgpOwogICAgICAgICAgIGlmIChjYWxsRW50ZXJXaXRoaW4pCi0gICAgICAgICAgICBBZGRGSUQoRk0sIEZpZHMsIFNNLCBjYWxsRW50ZXJXaXRoaW4tPmdldExvY2F0aW9uKCkuYXNMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIEFkZEZJRChGTSwgRmlkcywgKlNNLCBjYWxsRW50ZXJXaXRoaW4tPmdldExvY2F0aW9uKCkuYXNMb2NhdGlvbigpKTsKIAogICAgICAgICAgIFdvcmtMaXN0LnB1c2hfYmFjaygmY2FsbC0+cGF0aCk7CiAgICAgICAgIH0KQEAgLTQxNCwxNyArMzM5LDE0IEBACiAKICAgLy8gT3BlbiB0aGUgZmlsZS4KICAgc3RkOjpzdHJpbmcgRXJyTXNnOwotICBsbHZtOjpyYXdfZmRfb3N0cmVhbSBvKE91dHB1dEZpbGUuY19zdHIoKSwgRXJyTXNnKTsKKyAgbGx2bTo6cmF3X2ZkX29zdHJlYW0gbyhPdXRwdXRGaWxlLmNfc3RyKCksIEVyck1zZywgbGx2bTo6c3lzOjpmczo6Rl9UZXh0KTsKICAgaWYgKCFFcnJNc2cuZW1wdHkoKSkgewogICAgIGxsdm06OmVycnMoKSA8PCAid2FybmluZzogY291bGQgbm90IGNyZWF0ZSBmaWxlOiAiIDw8IE91dHB1dEZpbGUgPDwgJ1xuJzsKICAgICByZXR1cm47CiAgIH0KIAogICAvLyBXcml0ZSB0aGUgcGxpc3QgaGVhZGVyLgotICBvIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIKLSAgIjwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgXCItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU5cIiAiCi0gICJcImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGRcIj5cbiIKLSAgIjxwbGlzdCB2ZXJzaW9uPVwiMS4wXCI+XG4iOworICBvIDw8IFBsaXN0SGVhZGVyOwogCiAgIC8vIFdyaXRlIHRoZSByb290IG9iamVjdDogYSA8ZGljdD4gY29udGFpbmluZy4uLgogICAvLyAgLSAiY2xhbmdfdmVyc2lvbiIsIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY2xhbmcgdmVyc2lvbgpAQCAtNTM1LDcgKzQ1Nyw3IEBACiAKICAgICAvLyBPdXRwdXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBidWcuCiAgICAgbyA8PCAiICA8a2V5PmxvY2F0aW9uPC9rZXk+XG4iOwotICAgIEVtaXRMb2NhdGlvbihvLCAqU00sIExhbmdPcHRzLCBELT5nZXRMb2NhdGlvbigpLCBGTSwgMik7CisgICAgRW1pdExvY2F0aW9uKG8sICpTTSwgTGFuZ09wdHMsIEQtPmdldExvY2F0aW9uKCkuYXNMb2NhdGlvbigpLCBGTSwgMik7CiAKICAgICAvLyBPdXRwdXQgdGhlIGRpYWdub3N0aWMgdG8gdGhlIHN1Yi1kaWFnbm9zdGljIGNsaWVudCwgaWYgYW55LgogICAgIGlmICghZmlsZXNNYWRlLT5lbXB0eSgpKSB7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9QcmV0dHlTdGFja1RyYWNlTG9jYXRpb25Db250ZXh0LmggYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9QcmV0dHlTdGFja1RyYWNlTG9jYXRpb25Db250ZXh0LmgKaW5kZXggZWQ2NGZjYi4uYzJhZjM2ZiAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvUHJldHR5U3RhY2tUcmFjZUxvY2F0aW9uQ29udGV4dC5oCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1ByZXR0eVN0YWNrVHJhY2VMb2NhdGlvbkNvbnRleHQuaApAQCAtMzMsNyArMzMsNyBAQAogICAgIGFzc2VydChMQ3R4KTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBPUyA8PCAiV2hpbGUgYW5hbHl6aW5nIHN0YWNrOiBcbiI7CiAgICAgTEN0eC0+ZHVtcFN0YWNrKE9TLCAiXHQiKTsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvUHJvZ3JhbVN0YXRlLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1Byb2dyYW1TdGF0ZS5jcHAKaW5kZXggNmUyMzY2OC4uMGJjNTEwYSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvUHJvZ3JhbVN0YXRlLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9Qcm9ncmFtU3RhdGUuY3BwCkBAIC0xNzUsNyArMTc1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxFdmVudCAqQ2FsbCkgY29uc3QgewogICBQcm9ncmFtU3RhdGVNYW5hZ2VyICZNZ3IgPSBnZXRTdGF0ZU1hbmFnZXIoKTsKICAgU3ViRW5naW5lKiBFbmcgPSBNZ3IuZ2V0T3duaW5nRW5naW5lKCk7Ci0gIEludmFsaWRhdGVkU3ltYm9scyBDb25zdElTOwogCiAgIEludmFsaWRhdGVkU3ltYm9scyBJbnZhbGlkYXRlZDsKICAgaWYgKCFJUykKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1JhbmdlQ29uc3RyYWludE1hbmFnZXIuY3BwIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvUmFuZ2VDb25zdHJhaW50TWFuYWdlci5jcHAKaW5kZXggMzYwNmUwOS4uMzYyYjk0ZiAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvUmFuZ2VDb25zdHJhaW50TWFuYWdlci5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvUmFuZ2VDb25zdHJhaW50TWFuYWdlci5jcHAKQEAgLTI5MCwzNSArMjkwLDM3IEBACiAKICAgUHJvZ3JhbVN0YXRlUmVmIGFzc3VtZVN5bU5FKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU3ltYm9sUmVmIHN5bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50JiBJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCkgb3ZlcnJpZGU7CiAKICAgUHJvZ3JhbVN0YXRlUmVmIGFzc3VtZVN5bUVRKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU3ltYm9sUmVmIHN5bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50JiBJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCkgb3ZlcnJpZGU7CiAKICAgUHJvZ3JhbVN0YXRlUmVmIGFzc3VtZVN5bUxUKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU3ltYm9sUmVmIHN5bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50JiBJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCkgb3ZlcnJpZGU7CiAKICAgUHJvZ3JhbVN0YXRlUmVmIGFzc3VtZVN5bUdUKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU3ltYm9sUmVmIHN5bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50JiBJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCkgb3ZlcnJpZGU7CiAKICAgUHJvZ3JhbVN0YXRlUmVmIGFzc3VtZVN5bUdFKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU3ltYm9sUmVmIHN5bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50JiBJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCkgb3ZlcnJpZGU7CiAKICAgUHJvZ3JhbVN0YXRlUmVmIGFzc3VtZVN5bUxFKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU3ltYm9sUmVmIHN5bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGx2bTo6QVBTSW50JiBJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCYgQWRqdXN0bWVudCkgb3ZlcnJpZGU7CiAKLSAgY29uc3QgbGx2bTo6QVBTSW50KiBnZXRTeW1WYWwoUHJvZ3JhbVN0YXRlUmVmIFN0LCBTeW1ib2xSZWYgc3ltKSBjb25zdDsKLSAgQ29uZGl0aW9uVHJ1dGhWYWwgY2hlY2tOdWxsKFByb2dyYW1TdGF0ZVJlZiBTdGF0ZSwgU3ltYm9sUmVmIFN5bSk7CisgIGNvbnN0IGxsdm06OkFQU0ludCogZ2V0U3ltVmFsKFByb2dyYW1TdGF0ZVJlZiBTdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVmIHN5bSkgY29uc3Qgb3ZlcnJpZGU7CisgIENvbmRpdGlvblRydXRoVmFsIGNoZWNrTnVsbChQcm9ncmFtU3RhdGVSZWYgU3RhdGUsIFN5bWJvbFJlZiBTeW0pIG92ZXJyaWRlOwogCi0gIFByb2dyYW1TdGF0ZVJlZiByZW1vdmVEZWFkQmluZGluZ3MoUHJvZ3JhbVN0YXRlUmVmIFN0LCBTeW1ib2xSZWFwZXImIFN5bVJlYXBlcik7CisgIFByb2dyYW1TdGF0ZVJlZiByZW1vdmVEZWFkQmluZGluZ3MoUHJvZ3JhbVN0YXRlUmVmIFN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJlYXBlciYgU3ltUmVhcGVyKSBvdmVycmlkZTsKIAogICB2b2lkIHByaW50KFByb2dyYW1TdGF0ZVJlZiBTdCwgcmF3X29zdHJlYW0gJk91dCwKLSAgICAgICAgICAgICBjb25zdCBjaGFyKiBubCwgY29uc3QgY2hhciAqc2VwKTsKKyAgICAgICAgICAgICBjb25zdCBjaGFyKiBubCwgY29uc3QgY2hhciAqc2VwKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgUmFuZ2VTZXQ6OkZhY3RvcnkgRjsKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1JlZ2lvblN0b3JlLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1JlZ2lvblN0b3JlLmNwcAppbmRleCAwYjUxOTc2Li5iODExYzY3IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9SZWdpb25TdG9yZS5jcHAKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvUmVnaW9uU3RvcmUuY3BwCkBAIC0xMDQsNyArMTA0LDcgQEAKICAgICAgICAgICAgRGF0YSA9PSBYLkRhdGE7CiAgIH0KIAotICBMTFZNX0FUVFJJQlVURV9VU0VEIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKIH07CiB9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKQEAgLTEzMyw5ICsxMzMsNyBAQAogICB9OwogfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKIAotdm9pZCBCaW5kaW5nS2V5OjpkdW1wKCkgY29uc3QgewotICBsbHZtOjplcnJzKCkgPDwgKnRoaXM7Ci19CitMTFZNX0RVTVBfTUVUSE9EIHZvaWQgQmluZGluZ0tleTo6ZHVtcCgpIGNvbnN0IHsgbGx2bTo6ZXJycygpIDw8ICp0aGlzOyB9CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAvLyBBY3R1YWwgU3RvcmUgdHlwZS4KQEAgLTIyNCw5ICsyMjIsNyBAQAogICAgfQogICB9CiAKLSAgTExWTV9BVFRSSUJVVEVfVVNFRCB2b2lkIGR1bXAoKSBjb25zdCB7Ci0gICAgZHVtcChsbHZtOjplcnJzKCksICJcbiIpOwotICB9CisgIExMVk1fRFVNUF9NRVRIT0Qgdm9pZCBkdW1wKCkgY29uc3QgeyBkdW1wKGxsdm06OmVycnMoKSwgIlxuIik7IH0KIH07CiB9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKQEAgLTM3Niw5ICszNzIsOSBAQAogICAvLy8gIHZlcnNpb24gb2YgdGhhdCBsdmFsdWUgKGkuZS4sIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZWxlbWVudCBvZgogICAvLy8gIHRoZSBhcnJheSkuICBUaGlzIGlzIGNhbGxlZCBieSBFeHByRW5naW5lIHdoZW4gZXZhbHVhdGluZwogICAvLy8gIGNhc3RzIGZyb20gYXJyYXlzIHRvIHBvaW50ZXJzLgotICBTVmFsIEFycmF5VG9Qb2ludGVyKExvYyBBcnJheSwgUXVhbFR5cGUgRWxlbWVudFR5KTsKKyAgU1ZhbCBBcnJheVRvUG9pbnRlcihMb2MgQXJyYXksIFF1YWxUeXBlIEVsZW1lbnRUeSkgb3ZlcnJpZGU7CiAKLSAgU3RvcmVSZWYgZ2V0SW5pdGlhbFN0b3JlKGNvbnN0IExvY2F0aW9uQ29udGV4dCAqSW5pdExvYykgeworICBTdG9yZVJlZiBnZXRJbml0aWFsU3RvcmUoY29uc3QgTG9jYXRpb25Db250ZXh0ICpJbml0TG9jKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFN0b3JlUmVmKFJCRmFjdG9yeS5nZXRFbXB0eU1hcCgpLmdldFJvb3RXaXRob3V0UmV0YWluKCksICp0aGlzKTsKICAgfQogCkBAIC00MDAsMjQgKzM5NiwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRlZFN5bWJvbHMgJklTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb25BbmRTeW1ib2xJbnZhbGlkYXRpb25UcmFpdHMgJklUcmFpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRhdGVkUmVnaW9ucyAqSW52YWxpZGF0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRhdGVkUmVnaW9ucyAqSW52YWxpZGF0ZWRUb3BMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRhdGVkUmVnaW9ucyAqSW52YWxpZGF0ZWRUb3BMZXZlbCkgb3ZlcnJpZGU7CiAKICAgYm9vbCBzY2FuUmVhY2hhYmxlU3ltYm9scyhTdG9yZSBTLCBjb25zdCBNZW1SZWdpb24gKlIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhblJlYWNoYWJsZVN5bWJvbHMgJkNhbGxiYWNrcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhblJlYWNoYWJsZVN5bWJvbHMgJkNhbGxiYWNrcykgb3ZlcnJpZGU7CiAKICAgUmVnaW9uQmluZGluZ3NSZWYgcmVtb3ZlU3ViUmVnaW9uQmluZGluZ3MoUmVnaW9uQmluZGluZ3NDb25zdFJlZiBCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJSZWdpb24gKlIpOwogCiBwdWJsaWM6IC8vIFBhcnQgb2YgcHVibGljIGludGVyZmFjZSB0byBjbGFzcy4KIAotICB2aXJ0dWFsIFN0b3JlUmVmIEJpbmQoU3RvcmUgc3RvcmUsIExvYyBMViwgU1ZhbCBWKSB7CisgIFN0b3JlUmVmIEJpbmQoU3RvcmUgc3RvcmUsIExvYyBMViwgU1ZhbCBWKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuIFN0b3JlUmVmKGJpbmQoZ2V0UmVnaW9uQmluZGluZ3Moc3RvcmUpLCBMViwgVikuYXNTdG9yZSgpLCAqdGhpcyk7CiAgIH0KIAogICBSZWdpb25CaW5kaW5nc1JlZiBiaW5kKFJlZ2lvbkJpbmRpbmdzQ29uc3RSZWYgQiwgTG9jIExWLCBTVmFsIFYpOwogCiAgIC8vIEJpbmREZWZhdWx0IGlzIG9ubHkgdXNlZCB0byBpbml0aWFsaXplIGEgcmVnaW9uIHdpdGggYSBkZWZhdWx0IHZhbHVlLgotICBTdG9yZVJlZiBCaW5kRGVmYXVsdChTdG9yZSBzdG9yZSwgY29uc3QgTWVtUmVnaW9uICpSLCBTVmFsIFYpIHsKKyAgU3RvcmVSZWYgQmluZERlZmF1bHQoU3RvcmUgc3RvcmUsIGNvbnN0IE1lbVJlZ2lvbiAqUiwgU1ZhbCBWKSBvdmVycmlkZSB7CiAgICAgUmVnaW9uQmluZGluZ3NSZWYgQiA9IGdldFJlZ2lvbkJpbmRpbmdzKHN0b3JlKTsKICAgICBhc3NlcnQoIUIubG9va3VwKFIsIEJpbmRpbmdLZXk6OkRpcmVjdCkpOwogCkBAIC00NzEsMjAgKzQ2NywyMCBAQAogICAvLy8gXGJyaWVmIENyZWF0ZSBhIG5ldyBzdG9yZSB3aXRoIHRoZSBzcGVjaWZpZWQgYmluZGluZyByZW1vdmVkLgogICAvLy8gXHBhcmFtIFNUIHRoZSBvcmlnaW5hbCBzdG9yZSwgdGhhdCBpcyB0aGUgYmFzaXMgZm9yIHRoZSBuZXcgc3RvcmUuCiAgIC8vLyBccGFyYW0gTCB0aGUgbG9jYXRpb24gd2hvc2UgYmluZGluZyBzaG91bGQgYmUgcmVtb3ZlZC4KLSAgdmlydHVhbCBTdG9yZVJlZiBraWxsQmluZGluZyhTdG9yZSBTVCwgTG9jIEwpOworICBTdG9yZVJlZiBraWxsQmluZGluZyhTdG9yZSBTVCwgTG9jIEwpIG92ZXJyaWRlOwogCi0gIHZvaWQgaW5jcmVtZW50UmVmZXJlbmNlQ291bnQoU3RvcmUgc3RvcmUpIHsKKyAgdm9pZCBpbmNyZW1lbnRSZWZlcmVuY2VDb3VudChTdG9yZSBzdG9yZSkgb3ZlcnJpZGUgewogICAgIGdldFJlZ2lvbkJpbmRpbmdzKHN0b3JlKS5tYW51YWxSZXRhaW4oKTsgICAgCiAgIH0KICAgCiAgIC8vLyBJZiB0aGUgU3RvcmVNYW5hZ2VyIHN1cHBvcnRzIGl0LCBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZgogICAvLy8gdGhlIHNwZWNpZmllZCBTdG9yZSBvYmplY3QuICBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IGhpdHMgMCwgdGhlIG1lbW9yeQogICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QgaXMgcmVjeWNsZWQuCi0gIHZvaWQgZGVjcmVtZW50UmVmZXJlbmNlQ291bnQoU3RvcmUgc3RvcmUpIHsKKyAgdm9pZCBkZWNyZW1lbnRSZWZlcmVuY2VDb3VudChTdG9yZSBzdG9yZSkgb3ZlcnJpZGUgewogICAgIGdldFJlZ2lvbkJpbmRpbmdzKHN0b3JlKS5tYW51YWxSZWxlYXNlKCk7CiAgIH0KLSAgCi0gIGJvb2wgaW5jbHVkZWRJbkJpbmRpbmdzKFN0b3JlIHN0b3JlLCBjb25zdCBNZW1SZWdpb24gKnJlZ2lvbikgY29uc3Q7CisKKyAgYm9vbCBpbmNsdWRlZEluQmluZGluZ3MoU3RvcmUgc3RvcmUsIGNvbnN0IE1lbVJlZ2lvbiAqcmVnaW9uKSBjb25zdCBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdmFsdWUgYm91bmQgdG8gc3BlY2lmaWVkIGxvY2F0aW9uIGluIGEgZ2l2ZW4gc3RhdGUuCiAgIC8vLwpAQCAtNDk5LDcgKzQ5NSw3IEBACiAgIC8vLyAgICAgICByZXR1cm4gdW5kZWZpbmVkCiAgIC8vLyAgICAgZWxzZQogICAvLy8gICAgICAgcmV0dXJuIHN5bWJvbGljCi0gIHZpcnR1YWwgU1ZhbCBnZXRCaW5kaW5nKFN0b3JlIFMsIExvYyBMLCBRdWFsVHlwZSBUKSB7CisgIFNWYWwgZ2V0QmluZGluZyhTdG9yZSBTLCBMb2MgTCwgUXVhbFR5cGUgVCkgb3ZlcnJpZGUgewogICAgIHJldHVybiBnZXRCaW5kaW5nKGdldFJlZ2lvbkJpbmRpbmdzKFMpLCBMLCBUKTsKICAgfQogCkBAIC01NjQsMTUgKzU2MCwxNiBAQAogICAvLy8gcmVtb3ZlRGVhZEJpbmRpbmdzIC0gU2NhbnMgdGhlIFJlZ2lvblN0b3JlIG9mICdzdGF0ZScgZm9yIGRlYWQgdmFsdWVzLgogICAvLy8gIEl0IHJldHVybnMgYSBuZXcgU3RvcmUgd2l0aCB0aGVzZSB2YWx1ZXMgcmVtb3ZlZC4KICAgU3RvcmVSZWYgcmVtb3ZlRGVhZEJpbmRpbmdzKFN0b3JlIHN0b3JlLCBjb25zdCBTdGFja0ZyYW1lQ29udGV4dCAqTEN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFJlYXBlciYgU3ltUmVhcGVyKTsKLSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZWFwZXImIFN5bVJlYXBlcikgb3ZlcnJpZGU7CisKICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogICAvLyBSZWdpb24gImV4dGVudHMiLgogICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKICAgLy8gRklYTUU6IFRoaXMgbWV0aG9kIHdpbGwgc29vbiBiZSBlbGltaW5hdGVkOyBzZWUgdGhlIG5vdGUgaW4gU3RvcmUuaC4KICAgRGVmaW5lZE9yVW5rbm93blNWYWwgZ2V0U2l6ZUluRWxlbWVudHMoUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1SZWdpb24qIFIsIFF1YWxUeXBlIEVsZVR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtUmVnaW9uKiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsVHlwZSBFbGVUeSkgb3ZlcnJpZGU7CiAKICAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogICAvLyBVdGlsaXR5IG1ldGhvZHMuCkBAIC01ODUsOSArNTgyLDkgQEAKICAgfQogCiAgIHZvaWQgcHJpbnQoU3RvcmUgc3RvcmUsIHJhd19vc3RyZWFtICZPdXQsIGNvbnN0IGNoYXIqIG5sLAotICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcCk7CisgICAgICAgICAgICAgY29uc3QgY2hhciAqc2VwKSBvdmVycmlkZTsKIAotICB2b2lkIGl0ZXJCaW5kaW5ncyhTdG9yZSBzdG9yZSwgQmluZGluZ3NIYW5kbGVyJiBmKSB7CisgIHZvaWQgaXRlckJpbmRpbmdzKFN0b3JlIHN0b3JlLCBCaW5kaW5nc0hhbmRsZXImIGYpIG92ZXJyaWRlIHsKICAgICBSZWdpb25CaW5kaW5nc1JlZiBCID0gZ2V0UmVnaW9uQmluZGluZ3Moc3RvcmUpOwogICAgIGZvciAoUmVnaW9uQmluZGluZ3NSZWY6Oml0ZXJhdG9yIEkgPSBCLmJlZ2luKCksIEUgPSBCLmVuZCgpOyBJICE9IEU7ICsrSSkgewogICAgICAgY29uc3QgQ2x1c3RlckJpbmRpbmdzICZDbHVzdGVyID0gSS5nZXREYXRhKCk7CkBAIC0xMDE2LDcgKzEwMTMsNyBAQAogICAgICAgICAgQkkgIT0gQkU7ICsrQkkpIHsKICAgICAgIGNvbnN0IFZhclJlZ2lvbiAqVlIgPSBCSS5nZXRDYXB0dXJlZFJlZ2lvbigpOwogICAgICAgY29uc3QgVmFyRGVjbCAqVkQgPSBWUi0+Z2V0RGVjbCgpOwotICAgICAgaWYgKFZELT5nZXRBdHRyPEJsb2Nrc0F0dHI+KCkgfHwgIVZELT5oYXNMb2NhbFN0b3JhZ2UoKSkgeworICAgICAgaWYgKFZELT5oYXNBdHRyPEJsb2Nrc0F0dHI+KCkgfHwgIVZELT5oYXNMb2NhbFN0b3JhZ2UoKSkgewogICAgICAgICBBZGRUb1dvcmtMaXN0KFZSKTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYgKExvYzo6aXNMb2NUeXBlKFZSLT5nZXRWYWx1ZVR5cGUoKSkpIHsKQEAgLTE2MzAsNyArMTYyNyw3IEBACiAgIC8vIExhenkgYmluZGluZz8KICAgU3RvcmUgbGF6eUJpbmRpbmdTdG9yZSA9IE5VTEw7CiAgIGNvbnN0IFN1YlJlZ2lvbiAqbGF6eUJpbmRpbmdSZWdpb24gPSBOVUxMOwotICBsbHZtOjp0aWUobGF6eUJpbmRpbmdTdG9yZSwgbGF6eUJpbmRpbmdSZWdpb24pID0gZmluZExhenlCaW5kaW5nKEIsIFIsIFIpOworICBzdGQ6OnRpZShsYXp5QmluZGluZ1N0b3JlLCBsYXp5QmluZGluZ1JlZ2lvbikgPSBmaW5kTGF6eUJpbmRpbmcoQiwgUiwgUik7CiAgIGlmIChsYXp5QmluZGluZ1JlZ2lvbikKICAgICByZXR1cm4gZ2V0TGF6eUJpbmRpbmcobGF6eUJpbmRpbmdSZWdpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lvbkJpbmRpbmdzKGxhenlCaW5kaW5nU3RvcmUpKTsKQEAgLTE3OTEsNyArMTc4OCw3IEBACiAgIC8vIHZhbHVlcyB0byByZXR1cm4uCiAgIGNvbnN0IENsdXN0ZXJCaW5kaW5ncyAqQ2x1c3RlciA9IEIubG9va3VwKExhenlSLT5nZXRCYXNlUmVnaW9uKCkpOwogICBpZiAoIUNsdXN0ZXIpCi0gICAgcmV0dXJuIChMYXp5QmluZGluZ3NNYXBbTENWLmdldENWRGF0YSgpXSA9IGxsdm1fbW92ZShMaXN0KSk7CisgICAgcmV0dXJuIChMYXp5QmluZGluZ3NNYXBbTENWLmdldENWRGF0YSgpXSA9IHN0ZDo6bW92ZShMaXN0KSk7CiAKICAgU21hbGxWZWN0b3I8QmluZGluZ1BhaXIsIDMyPiBCaW5kaW5nczsKICAgY29sbGVjdFN1YlJlZ2lvbkJpbmRpbmdzKEJpbmRpbmdzLCBzdmFsQnVpbGRlciwgKkNsdXN0ZXIsIExhenlSLApAQCAtMTgxMyw3ICsxODEwLDcgQEAKICAgICBMaXN0LnB1c2hfYmFjayhWKTsKICAgfQogCi0gIHJldHVybiAoTGF6eUJpbmRpbmdzTWFwW0xDVi5nZXRDVkRhdGEoKV0gPSBsbHZtX21vdmUoTGlzdCkpOworICByZXR1cm4gKExhenlCaW5kaW5nc01hcFtMQ1YuZ2V0Q1ZEYXRhKCldID0gc3RkOjptb3ZlKExpc3QpKTsKIH0KIAogTm9uTG9jIFJlZ2lvblN0b3JlTWFuYWdlcjo6Y3JlYXRlTGF6eUJpbmRpbmcoUmVnaW9uQmluZGluZ3NDb25zdFJlZiBCLApAQCAtMjA2Niw5ICsyMDYzLDcgQEAKICAgICBpZiAoQ2xhc3MtPmdldE51bUJhc2VzKCkgIT0gMCB8fCBDbGFzcy0+Z2V0TnVtVkJhc2VzKCkgIT0gMCkKICAgICAgIHJldHVybiBOb25lOwogCi0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgSSA9IFJELT5maWVsZF9iZWdpbigpLCBFID0gUkQtPmZpZWxkX2VuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgRmllbGREZWNsICpGRCA9ICpJOworICBmb3IgKGNvbnN0IGF1dG8gKkZEIDogUkQtPmZpZWxkcygpKSB7CiAgICAgaWYgKEZELT5pc1VubmFtZWRCaXRmaWVsZCgpKQogICAgICAgY29udGludWU7CiAKQEAgLTIwODEsNyArMjA3Niw3IEBACiAgICAgaWYgKCEoVHktPmlzU2NhbGFyVHlwZSgpIHx8IFR5LT5pc1JlZmVyZW5jZVR5cGUoKSkpCiAgICAgICByZXR1cm4gTm9uZTsKIAotICAgIEZpZWxkcy5wdXNoX2JhY2soKkkpOworICAgIEZpZWxkcy5wdXNoX2JhY2soRkQpOwogICB9CiAKICAgUmVnaW9uQmluZGluZ3NSZWYgTmV3QiA9IEI7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9TVmFsQnVpbGRlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9TVmFsQnVpbGRlci5jcHAKaW5kZXggYWRjNTQ2NS4uM2VkMmJkZSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvU1ZhbEJ1aWxkZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1NWYWxCdWlsZGVyLmNwcApAQCAtMzYyLDcgKzM2Miw3IEBACiBEZWZpbmVkT3JVbmtub3duU1ZhbCBTVmFsQnVpbGRlcjo6ZXZhbEVRKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lZE9yVW5rbm93blNWYWwgbGhzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVkT3JVbmtub3duU1ZhbCByaHMpIHsKLSAgcmV0dXJuIGV2YWxCaW5PcChzdGF0ZSwgQk9fRVEsIGxocywgcmhzLCBDb250ZXh0LkludFR5KQorICByZXR1cm4gZXZhbEJpbk9wKHN0YXRlLCBCT19FUSwgbGhzLCByaHMsIGdldENvbmRpdGlvblR5cGUoKSkKICAgICAgIC5jYXN0QXM8RGVmaW5lZE9yVW5rbm93blNWYWw+KCk7CiB9CiAKQEAgLTM3Niw3ICszNzYsNyBAQAogICAgIFRvVHkgPSBDb250ZXh0LmdldFVucXVhbGlmaWVkQXJyYXlUeXBlKFRvVHksIFF1YWxzMSk7CiAgICAgRnJvbVR5ID0gQ29udGV4dC5nZXRVbnF1YWxpZmllZEFycmF5VHlwZShGcm9tVHksIFF1YWxzMik7CiAKLSAgICAvLyBNYWtlIHN1cmUgdGhhdCBub24gY3ZyLXF1YWxpZmllcnMgdGhlIG90aGVyIHF1YWxpZmllcnMgKGUuZy4sIGFkZHJlc3MKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCBub24tY3ZyLXF1YWxpZmllcnMgdGhlIG90aGVyIHF1YWxpZmllcnMgKGUuZy4sIGFkZHJlc3MKICAgICAvLyBzcGFjZXMpIGFyZSBpZGVudGljYWwuCiAgICAgUXVhbHMxLnJlbW92ZUNWUlF1YWxpZmllcnMoKTsKICAgICBRdWFsczIucmVtb3ZlQ1ZSUXVhbGlmaWVycygpOwpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvU2ltcGxlQ29uc3RyYWludE1hbmFnZXIuaCBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1NpbXBsZUNvbnN0cmFpbnRNYW5hZ2VyLmgKaW5kZXggMjhhOWE0ZC4uMjFlMjI4MyAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvU2ltcGxlQ29uc3RyYWludE1hbmFnZXIuaAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9TaW1wbGVDb25zdHJhaW50TWFuYWdlci5oCkBAIC0zNCw3ICszNCw3IEBACiAgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogICBQcm9ncmFtU3RhdGVSZWYgYXNzdW1lKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgRGVmaW5lZFNWYWwgQ29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXNzdW1wdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFzc3VtcHRpb24pIG92ZXJyaWRlOwogCiAgIFByb2dyYW1TdGF0ZVJlZiBhc3N1bWUoUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLCBOb25Mb2MgQ29uZCwgYm9vbCBBc3N1bXB0aW9uKTsKIApAQCAtODIsNyArODIsNyBAQAogICBCYXNpY1ZhbHVlRmFjdG9yeSAmZ2V0QmFzaWNWYWxzKCkgY29uc3QgeyByZXR1cm4gU1ZCLmdldEJhc2ljVmFsdWVGYWN0b3J5KCk7IH0KICAgU3ltYm9sTWFuYWdlciAmZ2V0U3ltYm9sTWFuYWdlcigpIGNvbnN0IHsgcmV0dXJuIFNWQi5nZXRTeW1ib2xNYW5hZ2VyKCk7IH0KIAotICBib29sIGNhblJlYXNvbkFib3V0KFNWYWwgWCkgY29uc3Q7CisgIGJvb2wgY2FuUmVhc29uQWJvdXQoU1ZhbCBYKSBjb25zdCBvdmVycmlkZTsKIAogICBQcm9ncmFtU3RhdGVSZWYgYXNzdW1lQXV4KFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uTG9jIENvbmQsCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9TaW1wbGVTVmFsQnVpbGRlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9TaW1wbGVTVmFsQnVpbGRlci5jcHAKaW5kZXggY2MwZWUwYi4uYjQ4OGQzYyAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvU2ltcGxlU1ZhbEJ1aWxkZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL1NpbXBsZVNWYWxCdWlsZGVyLmNwcApAQCAtMjEsOSArMjEsOSBAQAogbmFtZXNwYWNlIHsKIGNsYXNzIFNpbXBsZVNWYWxCdWlsZGVyIDogcHVibGljIFNWYWxCdWlsZGVyIHsKIHByb3RlY3RlZDoKLSAgdmlydHVhbCBTVmFsIGRpc3BhdGNoQ2FzdChTVmFsIHZhbCwgUXVhbFR5cGUgY2FzdFR5KTsKLSAgdmlydHVhbCBTVmFsIGV2YWxDYXN0RnJvbU5vbkxvYyhOb25Mb2MgdmFsLCBRdWFsVHlwZSBjYXN0VHkpOwotICB2aXJ0dWFsIFNWYWwgZXZhbENhc3RGcm9tTG9jKExvYyB2YWwsIFF1YWxUeXBlIGNhc3RUeSk7CisgIFNWYWwgZGlzcGF0Y2hDYXN0KFNWYWwgdmFsLCBRdWFsVHlwZSBjYXN0VHkpIG92ZXJyaWRlOworICBTVmFsIGV2YWxDYXN0RnJvbU5vbkxvYyhOb25Mb2MgdmFsLCBRdWFsVHlwZSBjYXN0VHkpIG92ZXJyaWRlOworICBTVmFsIGV2YWxDYXN0RnJvbUxvYyhMb2MgdmFsLCBRdWFsVHlwZSBjYXN0VHkpIG92ZXJyaWRlOwogCiBwdWJsaWM6CiAgIFNpbXBsZVNWYWxCdWlsZGVyKGxsdm06OkJ1bXBQdHJBbGxvY2F0b3IgJmFsbG9jLCBBU1RDb250ZXh0ICZjb250ZXh0LApAQCAtMzEsMTkgKzMxLDE5IEBACiAgICAgICAgICAgICAgICAgICAgIDogU1ZhbEJ1aWxkZXIoYWxsb2MsIGNvbnRleHQsIHN0YXRlTWdyKSB7fQogICB2aXJ0dWFsIH5TaW1wbGVTVmFsQnVpbGRlcigpIHt9CiAKLSAgdmlydHVhbCBTVmFsIGV2YWxNaW51cyhOb25Mb2MgdmFsKTsKLSAgdmlydHVhbCBTVmFsIGV2YWxDb21wbGVtZW50KE5vbkxvYyB2YWwpOwotICB2aXJ0dWFsIFNWYWwgZXZhbEJpbk9wTk4oUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLCBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uTG9jIGxocywgTm9uTG9jIHJocywgUXVhbFR5cGUgcmVzdWx0VHkpOwotICB2aXJ0dWFsIFNWYWwgZXZhbEJpbk9wTEwoUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLCBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jIGxocywgTG9jIHJocywgUXVhbFR5cGUgcmVzdWx0VHkpOwotICB2aXJ0dWFsIFNWYWwgZXZhbEJpbk9wTE4oUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLCBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jIGxocywgTm9uTG9jIHJocywgUXVhbFR5cGUgcmVzdWx0VHkpOworICBTVmFsIGV2YWxNaW51cyhOb25Mb2MgdmFsKSBvdmVycmlkZTsKKyAgU1ZhbCBldmFsQ29tcGxlbWVudChOb25Mb2MgdmFsKSBvdmVycmlkZTsKKyAgU1ZhbCBldmFsQmluT3BOTihQcm9ncmFtU3RhdGVSZWYgc3RhdGUsIEJpbmFyeU9wZXJhdG9yOjpPcGNvZGUgb3AsCisgICAgICAgICAgICAgICAgICAgTm9uTG9jIGxocywgTm9uTG9jIHJocywgUXVhbFR5cGUgcmVzdWx0VHkpIG92ZXJyaWRlOworICBTVmFsIGV2YWxCaW5PcExMKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwKKyAgICAgICAgICAgICAgICAgICBMb2MgbGhzLCBMb2MgcmhzLCBRdWFsVHlwZSByZXN1bHRUeSkgb3ZlcnJpZGU7CisgIFNWYWwgZXZhbEJpbk9wTE4oUHJvZ3JhbVN0YXRlUmVmIHN0YXRlLCBCaW5hcnlPcGVyYXRvcjo6T3Bjb2RlIG9wLAorICAgICAgICAgICAgICAgICAgIExvYyBsaHMsIE5vbkxvYyByaHMsIFF1YWxUeXBlIHJlc3VsdFR5KSBvdmVycmlkZTsKIAogICAvLy8gZ2V0S25vd25WYWx1ZSAtIGV2YWx1YXRlcyBhIGdpdmVuIFNWYWwuIElmIHRoZSBTVmFsIGhhcyBvbmx5IG9uZSBwb3NzaWJsZQogICAvLy8gIChpbnRlZ2VyKSB2YWx1ZSwgdGhhdCB2YWx1ZSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCByZXR1cm5zIE5VTEwuCi0gIHZpcnR1YWwgY29uc3QgbGx2bTo6QVBTSW50ICpnZXRLbm93blZhbHVlKFByb2dyYW1TdGF0ZVJlZiBzdGF0ZSwgU1ZhbCBWKTsKLSAgCisgIGNvbnN0IGxsdm06OkFQU0ludCAqZ2V0S25vd25WYWx1ZShQcm9ncmFtU3RhdGVSZWYgc3RhdGUsIFNWYWwgVikgb3ZlcnJpZGU7CisKICAgU1ZhbCBNYWtlU3ltSW50VmFsKGNvbnN0IFN5bUV4cHIgKkxIUywgQmluYXJ5T3BlcmF0b3I6Ok9wY29kZSBvcCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsdm06OkFQU0ludCAmUkhTLCBRdWFsVHlwZSByZXN1bHRUeSk7CiB9OwpAQCAtOTcsNyArOTcsNyBAQAogICAgIHJldHVybiBVbmtub3duVmFsKCk7CiAgIH0KIAotICAvLyBJZiB2YWx1ZSBpcyBhIG5vbiBpbnRlZ2VyIGNvbnN0YW50LCBwcm9kdWNlIHVua25vd24uCisgIC8vIElmIHZhbHVlIGlzIGEgbm9uLWludGVnZXIgY29uc3RhbnQsIHByb2R1Y2UgdW5rbm93bi4KICAgaWYgKCF2YWwuZ2V0QXM8bm9ubG9jOjpDb25jcmV0ZUludD4oKSkKICAgICByZXR1cm4gVW5rbm93blZhbCgpOwogCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgfQogCiAgIC8vIE9ubHkgaGFuZGxlIGNhc3RzIGZyb20gaW50ZWdlcnMgdG8gaW50ZWdlcnMgLSBpZiB2YWwgaXMgYW4gaW50ZWdlciBjb25zdGFudAotICAvLyBiZWluZyBjYXN0IHRvIGEgbm9uIGludGVnZXIgdHlwZSwgcHJvZHVjZSB1bmtub3duLgorICAvLyBiZWluZyBjYXN0IHRvIGEgbm9uLWludGVnZXIgdHlwZSwgcHJvZHVjZSB1bmtub3duLgogICBpZiAoIWlzTG9jVHlwZSAmJiAhY2FzdFR5LT5pc0ludGVncmFsT3JFbnVtZXJhdGlvblR5cGUoKSkKICAgICByZXR1cm4gVW5rbm93blZhbCgpOwogCkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICAgIH0KIAogICAgICAgY2FzZSBsb2M6OkdvdG9MYWJlbEtpbmQ6Ci0gICAgICAgIC8vIExhYmVscyBhbmQgbm9uIHN5bWJvbGljIG1lbW9yeSByZWdpb25zIGFyZSBhbHdheXMgdHJ1ZS4KKyAgICAgICAgLy8gTGFiZWxzIGFuZCBub24tc3ltYm9saWMgbWVtb3J5IHJlZ2lvbnMgYXJlIGFsd2F5cyB0cnVlLgogICAgICAgICByZXR1cm4gbWFrZVRydXRoVmFsKHRydWUsIGNhc3RUeSk7CiAgICAgfQogICB9CkBAIC01NjksMTEgKzU2OSwxMCBAQAogICAvLyBtZW1iZXJzIGFuZCB0aGUgdW5pdHMgaW4gd2hpY2ggYml0LWZpZWxkcyByZXNpZGUgaGF2ZSBhZGRyZXNzZXMgdGhhdAogICAvLyBpbmNyZWFzZSBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZGVjbGFyZWQuIgogICBib29sIGxlZnRGaXJzdCA9IChvcCA9PSBCT19MVCB8fCBvcCA9PSBCT19MRSk7Ci0gIGZvciAoUmVjb3JkRGVjbDo6ZmllbGRfaXRlcmF0b3IgSSA9IFJELT5maWVsZF9iZWdpbigpLAotICAgICAgIEUgPSBSRC0+ZmllbGRfZW5kKCk7IEkhPUU7ICsrSSkgewotICAgIGlmICgqSSA9PSBMZWZ0RkQpCisgIGZvciAoY29uc3QgYXV0byAqSSA6IFJELT5maWVsZHMoKSkgeworICAgIGlmIChJID09IExlZnRGRCkKICAgICAgIHJldHVybiBTVkIubWFrZVRydXRoVmFsKGxlZnRGaXJzdCwgcmVzdWx0VHkpOwotICAgIGlmICgqSSA9PSBSaWdodEZEKQorICAgIGlmIChJID09IFJpZ2h0RkQpCiAgICAgICByZXR1cm4gU1ZCLm1ha2VUcnV0aFZhbCghbGVmdEZpcnN0LCByZXN1bHRUeSk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvU3ltYm9sTWFuYWdlci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9TeW1ib2xNYW5hZ2VyLmNwcAppbmRleCAxYjU2ZjgyLi5hMDRjYjQxIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9TeW1ib2xNYW5hZ2VyLmNwcAorKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9TeW1ib2xNYW5hZ2VyLmNwcApAQCAtMzI2LDExICszMjYsNyBAQAogfQogCiBTeW1ib2xNYW5hZ2VyOjp+U3ltYm9sTWFuYWdlcigpIHsKLSAgZm9yIChTeW1ib2xEZXBlbmRUeTo6Y29uc3RfaXRlcmF0b3IgSSA9IFN5bWJvbERlcGVuZGVuY2llcy5iZWdpbigpLAotICAgICAgIEUgPSBTeW1ib2xEZXBlbmRlbmNpZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgZGVsZXRlIEktPnNlY29uZDsKLSAgfQotCisgIGxsdm06OkRlbGV0ZUNvbnRhaW5lclNlY29uZHMoU3ltYm9sRGVwZW5kZW5jaWVzKTsKIH0KIAogYm9vbCBTeW1ib2xNYW5hZ2VyOjpjYW5TeW1ib2xpY2F0ZShRdWFsVHlwZSBUKSB7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5hbHlzaXNDb25zdW1lci5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5hbHlzaXNDb25zdW1lci5jcHAKaW5kZXggOWVmZTk5Ny4uNTYzOTI0ZCAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0FuYWx5c2lzQ29uc3VtZXIuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9BbmFseXNpc0NvbnN1bWVyLmNwcApAQCAtMTMsMTMgKzEzLDEzIEBACiAKICNkZWZpbmUgREVCVUdfVFlQRSAiQW5hbHlzaXNDb25zdW1lciIKIAotI2luY2x1ZGUgIkFuYWx5c2lzQ29uc3VtZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9BbmFseXNpc0NvbnN1bWVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnN1bWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0RhdGFSZWN1cnNpdmVBU1RWaXNpdG9yLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2wuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbENYWC5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsT2JqQy5oIgogI2luY2x1ZGUgImNsYW5nL0FTVC9QYXJlbnRNYXAuaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvUmVjdXJzaXZlQVNUVmlzaXRvci5oIgogI2luY2x1ZGUgImNsYW5nL0FuYWx5c2lzL0FuYWx5c2VzL0xpdmVWYXJpYWJsZXMuaCIKICNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9DRkcuaCIKICNpbmNsdWRlICJjbGFuZy9BbmFseXNpcy9DYWxsR3JhcGguaCIKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL1BhdGhTZW5zaXRpdmUvRXhwckVuZ2luZS5oIgogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0NoZWNrZXJSZWdpc3RyYXRpb24uaCIKICNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RhdGlzdGljLmgiCkBAIC00NSw2ICs0NCw3IEBACiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Byb2dyYW0uaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVGltZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8cXVldWU+CiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKQEAgLTkwLDEyICs5MCwxMiBAQAogICBDbGFuZ0RpYWdQYXRoRGlhZ0NvbnN1bWVyKERpYWdub3N0aWNzRW5naW5lICZEaWFnKQogICAgIDogRGlhZyhEaWFnKSwgSW5jbHVkZVBhdGgoZmFsc2UpIHt9CiAgIHZpcnR1YWwgfkNsYW5nRGlhZ1BhdGhEaWFnQ29uc3VtZXIoKSB7fQotICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gIkNsYW5nRGlhZ3MiOyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIkNsYW5nRGlhZ3MiOyB9CiAKLSAgdmlydHVhbCBib29sIHN1cHBvcnRzTG9naWNhbE9wQ29udHJvbEZsb3coKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0Nyb3NzRmlsZURpYWdub3N0aWNzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHN1cHBvcnRzTG9naWNhbE9wQ29udHJvbEZsb3coKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgc3VwcG9ydHNDcm9zc0ZpbGVEaWFnbm9zdGljcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KIAotICB2aXJ0dWFsIFBhdGhHZW5lcmF0aW9uU2NoZW1lIGdldEdlbmVyYXRpb25TY2hlbWUoKSBjb25zdCB7CisgIFBhdGhHZW5lcmF0aW9uU2NoZW1lIGdldEdlbmVyYXRpb25TY2hlbWUoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIEluY2x1ZGVQYXRoID8gTWluaW1hbCA6IE5vbmU7CiAgIH0KIApAQCAtMTAzLDM1ICsxMDMsMTcgQEAKICAgICBJbmNsdWRlUGF0aCA9IHRydWU7CiAgIH0KIAotICB2b2lkIGVtaXREaWFnKFNvdXJjZUxvY2F0aW9uIEwsIHVuc2lnbmVkIERpYWdJRCwKLSAgICAgICAgICAgICAgICBBcnJheVJlZjxTb3VyY2VSYW5nZT4gUmFuZ2VzKSB7Ci0gICAgRGlhZ25vc3RpY0J1aWxkZXIgRGlhZ0J1aWxkZXIgPSBEaWFnLlJlcG9ydChMLCBEaWFnSUQpOwotCi0gICAgZm9yIChBcnJheVJlZjxTb3VyY2VSYW5nZT46Oml0ZXJhdG9yIEkgPSBSYW5nZXMuYmVnaW4oKSwgRSA9IFJhbmdlcy5lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgICBEaWFnQnVpbGRlciA8PCAqSTsKLSAgICB9Ci0gIH0KLQogICB2b2lkIEZsdXNoRGlhZ25vc3RpY3NJbXBsKHN0ZDo6dmVjdG9yPGNvbnN0IFBhdGhEaWFnbm9zdGljICo+ICZEaWFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlc01hZGUgKmZpbGVzTWFkZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzTWFkZSAqZmlsZXNNYWRlKSBvdmVycmlkZSB7CisgICAgdW5zaWduZWQgV2FybklEID0gRGlhZy5nZXRDdXN0b21EaWFnSUQoRGlhZ25vc3RpY3NFbmdpbmU6Oldhcm5pbmcsICIlMCIpOworICAgIHVuc2lnbmVkIE5vdGVJRCA9IERpYWcuZ2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNzRW5naW5lOjpOb3RlLCAiJTAiKTsKKwogICAgIGZvciAoc3RkOjp2ZWN0b3I8Y29uc3QgUGF0aERpYWdub3N0aWMqPjo6aXRlcmF0b3IgSSA9IERpYWdzLmJlZ2luKCksCiAgICAgICAgICBFID0gRGlhZ3MuZW5kKCk7IEkgIT0gRTsgKytJKSB7CiAgICAgICBjb25zdCBQYXRoRGlhZ25vc3RpYyAqUEQgPSAqSTsKLSAgICAgIFN0cmluZ1JlZiBkZXNjID0gUEQtPmdldFNob3J0RGVzY3JpcHRpb24oKTsKLSAgICAgIFNtYWxsU3RyaW5nPDUxMj4gVG1wU3RyOwotICAgICAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPdXQoVG1wU3RyKTsKLSAgICAgIGZvciAoU3RyaW5nUmVmOjppdGVyYXRvciBJPWRlc2MuYmVnaW4oKSwgRT1kZXNjLmVuZCgpOyBJIT1FOyArK0kpIHsKLSAgICAgICAgaWYgKCpJID09ICclJykKLSAgICAgICAgICBPdXQgPDwgIiUlIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIE91dCA8PCAqSTsKLSAgICAgIH0KLSAgICAgIE91dC5mbHVzaCgpOwotICAgICAgdW5zaWduZWQgRXJyb3JEaWFnID0gRGlhZy5nZXRDdXN0b21EaWFnSUQoRGlhZ25vc3RpY3NFbmdpbmU6Oldhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbXBTdHIpOwotICAgICAgU291cmNlTG9jYXRpb24gTCA9IFBELT5nZXRMb2NhdGlvbigpLmFzTG9jYXRpb24oKTsKLSAgICAgIGVtaXREaWFnKEwsIEVycm9yRGlhZywgUEQtPnBhdGguYmFjaygpLT5nZXRSYW5nZXMoKSk7CisgICAgICBTb3VyY2VMb2NhdGlvbiBXYXJuTG9jID0gUEQtPmdldExvY2F0aW9uKCkuYXNMb2NhdGlvbigpOworICAgICAgRGlhZy5SZXBvcnQoV2FybkxvYywgV2FybklEKSA8PCBQRC0+Z2V0U2hvcnREZXNjcmlwdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFBELT5wYXRoLmJhY2soKS0+Z2V0UmFuZ2VzKCk7CiAKICAgICAgIGlmICghSW5jbHVkZVBhdGgpCiAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTQwLDExICsxMjIsOSBAQAogICAgICAgZm9yIChQYXRoUGllY2VzOjpjb25zdF9pdGVyYXRvciBQSSA9IEZsYXRQYXRoLmJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFID0gRmxhdFBhdGguZW5kKCk7CiAgICAgICAgICAgIFBJICE9IFBFOyArK1BJKSB7Ci0gICAgICAgIHVuc2lnbmVkIE5vdGVJRCA9IERpYWcuZ2V0Q3VzdG9tRGlhZ0lEKERpYWdub3N0aWNzRW5naW5lOjpOb3RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKlBJKS0+Z2V0U3RyaW5nKCkpOwotCiAgICAgICAgIFNvdXJjZUxvY2F0aW9uIE5vdGVMb2MgPSAoKlBJKS0+Z2V0TG9jYXRpb24oKS5hc0xvY2F0aW9uKCk7Ci0gICAgICAgIGVtaXREaWFnKE5vdGVMb2MsIE5vdGVJRCwgKCpQSSktPmdldFJhbmdlcygpKTsKKyAgICAgICAgRGlhZy5SZXBvcnQoTm90ZUxvYywgTm90ZUlEKSA8PCAoKlBJKS0+Z2V0U3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKlBJKS0+Z2V0UmFuZ2VzKCk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0xNTcsOCArMTM3LDggQEAKIAogbmFtZXNwYWNlIHsKIAotY2xhc3MgQW5hbHlzaXNDb25zdW1lciA6IHB1YmxpYyBBU1RDb25zdW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUmVjdXJzaXZlQVNUVmlzaXRvcjxBbmFseXNpc0NvbnN1bWVyPiB7CitjbGFzcyBBbmFseXNpc0NvbnN1bWVyIDogcHVibGljIEFuYWx5c2lzQVNUQ29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPEFuYWx5c2lzQ29uc3VtZXI+IHsKICAgZW51bSB7CiAgICAgQU1fTm9uZSA9IDAsCiAgICAgQU1fU3ludGF4ID0gMHgxLApAQCAtMTkxLDggKzE3MSw4IEBACiAgIFN0b3JlTWFuYWdlckNyZWF0b3IgQ3JlYXRlU3RvcmVNZ3I7CiAgIENvbnN0cmFpbnRNYW5hZ2VyQ3JlYXRvciBDcmVhdGVDb25zdHJhaW50TWdyOwogCi0gIE93bmluZ1B0cjxDaGVja2VyTWFuYWdlcj4gY2hlY2tlck1ncjsKLSAgT3duaW5nUHRyPEFuYWx5c2lzTWFuYWdlcj4gTWdyOworICBzdGQ6OnVuaXF1ZV9wdHI8Q2hlY2tlck1hbmFnZXI+IGNoZWNrZXJNZ3I7CisgIHN0ZDo6dW5pcXVlX3B0cjxBbmFseXNpc01hbmFnZXI+IE1ncjsKIAogICAvLy8gVGltZSB0aGUgYW5hbHl6ZXMgdGltZSBvZiBlYWNoIHRyYW5zbGF0aW9uIHVuaXQuCiAgIHN0YXRpYyBsbHZtOjpUaW1lciogVFVUb3RhbFRpbWVyOwpAQCAtMjIwLDIxICsyMDAsMjQgQEAKICAgfQogCiAgIHZvaWQgRGlnZXN0QW5hbHl6ZXJPcHRpb25zKCkgewotICAgIC8vIENyZWF0ZSB0aGUgUGF0aERpYWdub3N0aWNDb25zdW1lci4KLSAgICBDbGFuZ0RpYWdQYXRoRGlhZ0NvbnN1bWVyICpjbGFuZ0RpYWdzID0KLSAgICAgIG5ldyBDbGFuZ0RpYWdQYXRoRGlhZ0NvbnN1bWVyKFBQLmdldERpYWdub3N0aWNzKCkpOwotICAgIFBhdGhDb25zdW1lcnMucHVzaF9iYWNrKGNsYW5nRGlhZ3MpOworICAgIGlmIChPcHRzLT5BbmFseXNpc0RpYWdPcHQgIT0gUERfTk9ORSkgeworICAgICAgLy8gQ3JlYXRlIHRoZSBQYXRoRGlhZ25vc3RpY0NvbnN1bWVyLgorICAgICAgQ2xhbmdEaWFnUGF0aERpYWdDb25zdW1lciAqY2xhbmdEaWFncyA9CisgICAgICAgICAgbmV3IENsYW5nRGlhZ1BhdGhEaWFnQ29uc3VtZXIoUFAuZ2V0RGlhZ25vc3RpY3MoKSk7CisgICAgICBQYXRoQ29uc3VtZXJzLnB1c2hfYmFjayhjbGFuZ0RpYWdzKTsKIAotICAgIGlmIChPcHRzLT5BbmFseXNpc0RpYWdPcHQgPT0gUERfVEVYVCkgewotICAgICAgY2xhbmdEaWFncy0+ZW5hYmxlUGF0aHMoKTsKKyAgICAgIGlmIChPcHRzLT5BbmFseXNpc0RpYWdPcHQgPT0gUERfVEVYVCkgeworICAgICAgICBjbGFuZ0RpYWdzLT5lbmFibGVQYXRocygpOwogCi0gICAgfSBlbHNlIGlmICghT3V0RGlyLmVtcHR5KCkpIHsKLSAgICAgIHN3aXRjaCAoT3B0cy0+QW5hbHlzaXNEaWFnT3B0KSB7Ci0gICAgICBkZWZhdWx0OgotI2RlZmluZSBBTkFMWVNJU19ESUFHTk9TVElDUyhOQU1FLCBDTURGTEFHLCBERVNDLCBDUkVBVEVGTikgXAotICAgICAgICBjYXNlIFBEXyMjTkFNRTogQ1JFQVRFRk4oKk9wdHMuZ2V0UHRyKCksIFBhdGhDb25zdW1lcnMsIE91dERpciwgUFApO1wKLSAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgaWYgKCFPdXREaXIuZW1wdHkoKSkgeworICAgICAgICBzd2l0Y2ggKE9wdHMtPkFuYWx5c2lzRGlhZ09wdCkgeworICAgICAgICBkZWZhdWx0OgorI2RlZmluZSBBTkFMWVNJU19ESUFHTk9TVElDUyhOQU1FLCBDTURGTEFHLCBERVNDLCBDUkVBVEVGTikgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBQRF8jI05BTUU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1JFQVRFRk4oKk9wdHMuZ2V0UHRyKCksIFBhdGhDb25zdW1lcnMsIE91dERpciwgUFApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrOwogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQW5hbHlzZXMuZGVmIgorICAgICAgICB9CiAgICAgICB9CiAgICAgfQogCkBAIC0yOTksNyArMjgyLDcgQEAKICAgICB9CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDb250ZXh0KSB7CisgIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDb250ZXh0KSBvdmVycmlkZSB7CiAgICAgQ3R4ID0gJkNvbnRleHQ7CiAgICAgY2hlY2tlck1nci5yZXNldChjcmVhdGVDaGVja2VyTWFuYWdlcigqT3B0cywgUFAuZ2V0TGFuZ09wdHMoKSwgUGx1Z2lucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQLmdldERpYWdub3N0aWNzKCkpKTsKQEAgLTMxNSwxMCArMjk4LDEwIEBACiAKICAgLy8vIFxicmllZiBTdG9yZSB0aGUgdG9wIGxldmVsIGRlY2xzIGluIHRoZSBzZXQgdG8gYmUgcHJvY2Vzc2VkIGxhdGVyIG9uLgogICAvLy8gKERvaW5nIHRoaXMgcHJlLXByb2Nlc3NpbmcgYXZvaWRzIGRlc2VyaWFsaXphdGlvbiBvZiBkYXRhIGZyb20gUENILikKLSAgdmlydHVhbCBib29sIEhhbmRsZVRvcExldmVsRGVjbChEZWNsR3JvdXBSZWYgRCk7Ci0gIHZpcnR1YWwgdm9pZCBIYW5kbGVUb3BMZXZlbERlY2xJbk9iakNDb250YWluZXIoRGVjbEdyb3VwUmVmIEQpOworICBib29sIEhhbmRsZVRvcExldmVsRGVjbChEZWNsR3JvdXBSZWYgRCkgb3ZlcnJpZGU7CisgIHZvaWQgSGFuZGxlVG9wTGV2ZWxEZWNsSW5PYmpDQ29udGFpbmVyKERlY2xHcm91cFJlZiBEKSBvdmVycmlkZTsKIAotICB2aXJ0dWFsIHZvaWQgSGFuZGxlVHJhbnNsYXRpb25Vbml0KEFTVENvbnRleHQgJkMpOworICB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDKSBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIERldGVybWluZSB3aGljaCBpbmxpbmluZyBtb2RlIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhpcyBmdW5jdGlvbiBpcwogICAvLy8gYW5hbHl6ZWQuIFRoaXMgYWxsb3dzIHRvIHJlZGVmaW5lIHRoZSBkZWZhdWx0IGlubGluaW5nIHBvbGljaWVzIHdoZW4KQEAgLTM4OSw2ICszNzIsMTEgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCisgIHZpcnR1YWwgdm9pZAorICBBZGREaWFnbm9zdGljQ29uc3VtZXIoUGF0aERpYWdub3N0aWNDb25zdW1lciAqQ29uc3VtZXIpIG92ZXJyaWRlIHsKKyAgICBQYXRoQ29uc3VtZXJzLnB1c2hfYmFjayhDb25zdW1lcik7CisgIH0KKwogcHJpdmF0ZToKICAgdm9pZCBzdG9yZVRvcExldmVsRGVjbHMoRGVjbEdyb3VwUmVmIERHKTsKIApAQCAtNjUzLDcgKzY0MSw3IEBACiAgIEV4cHJFbmdpbmUgRW5nKCpNZ3IsIE9iakNHQ0VuYWJsZWQsIFZpc2l0ZWRDYWxsZWVzLCAmRnVuY3Rpb25TdW1tYXJpZXMsSU1vZGUpOwogCiAgIC8vIFNldCB0aGUgZ3JhcGggYXVkaXRvci4KLSAgT3duaW5nUHRyPEV4cGxvZGVkTm9kZTo6QXVkaXRvcj4gQXVkaXRvcjsKKyAgc3RkOjp1bmlxdWVfcHRyPEV4cGxvZGVkTm9kZTo6QXVkaXRvcj4gQXVkaXRvcjsKICAgaWYgKE1nci0+b3B0aW9ucy52aXN1YWxpemVFeHBsb2RlZEdyYXBoV2l0aFViaUdyYXBoKSB7CiAgICAgQXVkaXRvci5yZXNldChDcmVhdGVVYmlWaXooKSk7CiAgICAgRXhwbG9kZWROb2RlOjpTZXRBdWRpdG9yKEF1ZGl0b3IuZ2V0KCkpOwpAQCAtNjk5LDEwICs2ODcsMTAgQEAKIC8vIEFuYWx5c2lzQ29uc3VtZXIgY3JlYXRpb24uCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCi1BU1RDb25zdW1lciogZW50bzo6Q3JlYXRlQW5hbHlzaXNDb25zdW1lcihjb25zdCBQcmVwcm9jZXNzb3ImIHBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG91dERpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWx5emVyT3B0aW9uc1JlZiBvcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IHBsdWdpbnMpIHsKK0FuYWx5c2lzQVNUQ29uc3VtZXIgKgorZW50bzo6Q3JlYXRlQW5hbHlzaXNDb25zdW1lcihjb25zdCBQcmVwcm9jZXNzb3IgJnBwLCBjb25zdCBzdGQ6OnN0cmluZyAmb3V0RGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFseXplck9wdGlvbnNSZWYgb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IHBsdWdpbnMpIHsKICAgLy8gRGlzYWJsZSB0aGUgZWZmZWN0cyBvZiAnLVdlcnJvcicgd2hlbiB1c2luZyB0aGUgQW5hbHlzaXNDb25zdW1lci4KICAgcHAuZ2V0RGlhZ25vc3RpY3MoKS5zZXRXYXJuaW5nc0FzRXJyb3JzKGZhbHNlKTsKIApAQCAtNzE2LDcgKzcwNCw3IEBACiBuYW1lc3BhY2UgewogCiBjbGFzcyBVYmlncmFwaFZpeiA6IHB1YmxpYyBFeHBsb2RlZE5vZGU6OkF1ZGl0b3IgewotICBPd25pbmdQdHI8cmF3X29zdHJlYW0+IE91dDsKKyAgc3RkOjp1bmlxdWVfcHRyPHJhd19vc3RyZWFtPiBPdXQ7CiAgIHN0ZDo6c3RyaW5nIEZpbGVuYW1lOwogICB1bnNpZ25lZCBDbnRyOwogCkBAIC03MjgsNyArNzE2LDcgQEAKIAogICB+VWJpZ3JhcGhWaXooKTsKIAotICB2aXJ0dWFsIHZvaWQgQWRkRWRnZShFeHBsb2RlZE5vZGUgKlNyYywgRXhwbG9kZWROb2RlICpEc3QpOworICB2b2lkIEFkZEVkZ2UoRXhwbG9kZWROb2RlICpTcmMsIEV4cGxvZGVkTm9kZSAqRHN0KSBvdmVycmlkZTsKIH07CiAKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKQEAgLTczOSwxMCArNzI3LDEwIEBACiAgIGxsdm06OnN5czo6ZnM6OmNyZWF0ZVRlbXBvcmFyeUZpbGUoImxsdm1fdWJpIiwgIiIsIEZELCBQKTsKICAgbGx2bTo6ZXJycygpIDw8ICJXcml0aW5nICciIDw8IFAuc3RyKCkgPDwgIicuXG4iOwogCi0gIE93bmluZ1B0cjxsbHZtOjpyYXdfZmRfb3N0cmVhbT4gU3RyZWFtOworICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6cmF3X2ZkX29zdHJlYW0+IFN0cmVhbTsKICAgU3RyZWFtLnJlc2V0KG5ldyBsbHZtOjpyYXdfZmRfb3N0cmVhbShGRCwgdHJ1ZSkpOwogCi0gIHJldHVybiBuZXcgVWJpZ3JhcGhWaXooU3RyZWFtLnRha2UoKSwgUCk7CisgIHJldHVybiBuZXcgVWJpZ3JhcGhWaXooU3RyZWFtLnJlbGVhc2UoKSwgUCk7CiB9CiAKIHZvaWQgVWJpZ3JhcGhWaXo6OkFkZEVkZ2UoRXhwbG9kZWROb2RlICpTcmMsIEV4cGxvZGVkTm9kZSAqRHN0KSB7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5hbHlzaXNDb25zdW1lci5oIGIvbGliL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0FuYWx5c2lzQ29uc3VtZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1MjIwYi4uMDAwMDAwMAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5hbHlzaXNDb25zdW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy89PT0tLS0gQW5hbHlzaXNDb25zdW1lci5oIC0gRnJvbnQtZW5kIEFuYWx5c2lzIEVuZ2luZSBIb29rcyAtLS0qLSBDKysgLSotPT09Ly8KLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCi0vLwotLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi0vLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLS8vCi0vLyBUaGlzIGhlYWRlciBjb250YWlucyB0aGUgZnVuY3Rpb25zIG5lY2Vzc2FyeSBmb3IgYSBmcm9udC1lbmQgdG8gcnVuIHZhcmlvdXMKLS8vIGFuYWx5c2VzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0KLSNpZm5kZWYgTExWTV9DTEFOR19HUl9BTkFMWVNJU0NPTlNVTUVSX0gKLSNkZWZpbmUgTExWTV9DTEFOR19HUl9BTkFMWVNJU0NPTlNVTUVSX0gKLQotI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKLSNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Db3JlL0FuYWx5emVyT3B0aW9ucy5oIgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGNsYW5nIHsKLQotY2xhc3MgQVNUQ29uc3VtZXI7Ci1jbGFzcyBQcmVwcm9jZXNzb3I7Ci1jbGFzcyBEaWFnbm9zdGljc0VuZ2luZTsKLQotbmFtZXNwYWNlIGVudG8gewotY2xhc3MgQ2hlY2tlck1hbmFnZXI7Ci0KLS8vLyBDcmVhdGVBbmFseXNpc0NvbnN1bWVyIC0gQ3JlYXRlcyBhbiBBU1RDb25zdW1lciB0byBydW4gdmFyaW91cyBjb2RlCi0vLy8gYW5hbHlzaXMgcGFzc2VzLiAgKFRoZSBzZXQgb2YgYW5hbHlzZXMgcnVuIGlzIGNvbnRyb2xsZWQgYnkgY29tbWFuZC1saW5lCi0vLy8gb3B0aW9ucy4pCi1BU1RDb25zdW1lciogQ3JlYXRlQW5hbHlzaXNDb25zdW1lcihjb25zdCBQcmVwcm9jZXNzb3IgJnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuYWx5emVyT3B0aW9uc1JlZiBvcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IHBsdWdpbnMpOwotCi19IC8vIGVuZCBHUiBuYW1lc3BhY2UKLQotfSAvLyBlbmQgY2xhbmcgbmFtZXNwYWNlCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0FuZHJvaWQubWsgYi9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5kcm9pZC5tawppbmRleCAwMzFjMzMwLi5jY2ZmZGFkIDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5kcm9pZC5taworKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5kcm9pZC5tawpAQCAtNiw2ICs2LDcgQEAKIGNsYW5nX3N0YXRpY19hbmFseXplcl9mcm9udGVuZF9UQkxHRU5fVEFCTEVTIDo9IFwKICAgQXR0ckxpc3QuaW5jIFwKICAgQXR0cnMuaW5jIFwKKyAgQXR0clZpc2l0b3IuaW5jIFwKICAgQ29tbWVudENvbW1hbmRMaXN0LmluYyBcCiAgIENvbW1lbnROb2Rlcy5pbmMgXAogICBEZWNsTm9kZXMuaW5jIFwKZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9DTWFrZUxpc3RzLnR4dAppbmRleCBhYWZiMjQ5Li41MzQ5ZWQ5IDEwMDY0NAotLS0gYS9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0NNYWtlTGlzdHMudHh0CkBAIC0xLDMxICsxLDE5IEBACi1zZXQoTExWTV9OT19SVFRJIDEpCi0KIGluY2x1ZGVfZGlyZWN0b3JpZXMoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8uLi9DaGVja2VycyApCiAKK3NldChMTFZNX0xJTktfQ09NUE9ORU5UUworICBTdXBwb3J0CisgICkKKwogYWRkX2NsYW5nX2xpYnJhcnkoY2xhbmdTdGF0aWNBbmFseXplckZyb250ZW5kCiAgIEFuYWx5c2lzQ29uc3VtZXIuY3BwCiAgIENoZWNrZXJSZWdpc3RyYXRpb24uY3BwCiAgIEZyb250ZW5kQWN0aW9ucy5jcHAKLSAgKQogCi1hZGRfZGVwZW5kZW5jaWVzKGNsYW5nU3RhdGljQW5hbHl6ZXJGcm9udGVuZAorICBMSU5LX0xJQlMKKyAgY2xhbmdBU1QKKyAgY2xhbmdBbmFseXNpcworICBjbGFuZ0Jhc2ljCisgIGNsYW5nRnJvbnRlbmQKICAgY2xhbmdTdGF0aWNBbmFseXplckNoZWNrZXJzCiAgIGNsYW5nU3RhdGljQW5hbHl6ZXJDb3JlCi0gIENsYW5nQXR0ckNsYXNzZXMKLSAgQ2xhbmdBdHRyTGlzdAotICBDbGFuZ0NvbW1lbnROb2RlcwotICBDbGFuZ0RlY2xOb2RlcwotICBDbGFuZ0RpYWdub3N0aWNDb21tb24KLSAgQ2xhbmdEaWFnbm9zdGljRnJvbnRlbmQKLSAgQ2xhbmdTdG10Tm9kZXMKLSAgKQotCi10YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmdTdGF0aWNBbmFseXplckZyb250ZW5kCi0gIGNsYW5nQmFzaWMKLSAgY2xhbmdMZXgKLSAgY2xhbmdBU1QKLSAgY2xhbmdGcm9udGVuZAotICBjbGFuZ1Jld3JpdGVDb3JlCi0gIGNsYW5nUmV3cml0ZUZyb250ZW5kCi0gIGNsYW5nU3RhdGljQW5hbHl6ZXJDaGVja2VycwogICApCmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQ2hlY2tlclJlZ2lzdHJhdGlvbi5jcHAgYi9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQ2hlY2tlclJlZ2lzdHJhdGlvbi5jcHAKaW5kZXggZTdkZWYwOC4uZDlkNWJhZSAxMDA2NDQKLS0tIGEvbGliL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0NoZWNrZXJSZWdpc3RyYXRpb24uY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9DaGVja2VyUmVnaXN0cmF0aW9uLmNwcApAQCAtMjAsMTEgKzIwLDExIEBACiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvQ29yZS9DaGVja2VyT3B0SW5mby5oIgogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0NvcmUvQ2hlY2tlclJlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvT3duaW5nUHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRHluYW1pY0xpYnJhcnkuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KIAogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIGVudG87CkBAIC0xMDQsOCArMTA0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYW5nT3B0aW9ucyAmbGFuZ09wdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpzdHJpbmc+IHBsdWdpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmUgJmRpYWdzKSB7Ci0gIE93bmluZ1B0cjxDaGVja2VyTWFuYWdlcj4gY2hlY2tlck1ncihuZXcgQ2hlY2tlck1hbmFnZXIobGFuZ09wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdHMpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENoZWNrZXJNYW5hZ2VyPiBjaGVja2VyTWdyKAorICAgICAgbmV3IENoZWNrZXJNYW5hZ2VyKGxhbmdPcHRzLCAmb3B0cykpOwogCiAgIFNtYWxsVmVjdG9yPENoZWNrZXJPcHRJbmZvLCA4PiBjaGVja2VyT3B0czsKICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IG9wdHMuQ2hlY2tlcnNDb250cm9sTGlzdC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CkBAIC0xMjMsNyArMTIzLDcgQEAKICAgICAgICAgICA8PCBjaGVja2VyT3B0c1tpXS5nZXROYW1lKCk7CiAgIH0KIAotICByZXR1cm4gY2hlY2tlck1nci50YWtlKCk7CisgIHJldHVybiBjaGVja2VyTWdyLnJlbGVhc2UoKTsKIH0KIAogdm9pZCBlbnRvOjpwcmludENoZWNrZXJIZWxwKHJhd19vc3RyZWFtICZvdXQsIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBwbHVnaW5zKSB7CmRpZmYgLS1naXQgYS9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmNwcCBiL2xpYi9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuY3BwCmluZGV4IDEzOTcxYWYuLmFhMzgwNzcgMTAwNjQ0Ci0tLSBhL2xpYi9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuY3BwCisrKyBiL2xpYi9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuY3BwCkBAIC04LDggKzgsOCBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgImNsYW5nL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9ucy5oIgotI2luY2x1ZGUgIkFuYWx5c2lzQ29uc3VtZXIuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db21waWxlckluc3RhbmNlLmgiCisjaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5hbHlzaXNDb25zdW1lci5oIgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIGVudG87CiAKZGlmZiAtLWdpdCBhL2xpYi9Ub29saW5nL0NNYWtlTGlzdHMudHh0IGIvbGliL1Rvb2xpbmcvQ01ha2VMaXN0cy50eHQKaW5kZXggZDI5ZTU2NC4uYTFiZjk2NCAxMDA2NDQKLS0tIGEvbGliL1Rvb2xpbmcvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL1Rvb2xpbmcvQ01ha2VMaXN0cy50eHQKQEAgLTksMjIgKzksMTMgQEAKICAgUmVmYWN0b3JpbmcuY3BwCiAgIFJlZmFjdG9yaW5nQ2FsbGJhY2tzLmNwcAogICBUb29saW5nLmNwcAotICApCiAKLWFkZF9kZXBlbmRlbmNpZXMoY2xhbmdUb29saW5nCi0gIENsYW5nQXR0ckNsYXNzZXMKLSAgQ2xhbmdBdHRyTGlzdAotICBDbGFuZ0RlY2xOb2RlcwotICBDbGFuZ0RpYWdub3N0aWNDb21tb24KLSAgQ2xhbmdEaWFnbm9zdGljRnJvbnRlbmQKLSAgQ2xhbmdTdG10Tm9kZXMKLSAgKQotCi10YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmdUb29saW5nCi0gIGNsYW5nQmFzaWMKLSAgY2xhbmdGcm9udGVuZAorICBMSU5LX0xJQlMKICAgY2xhbmdBU1QKICAgY2xhbmdBU1RNYXRjaGVycworICBjbGFuZ0Jhc2ljCisgIGNsYW5nRHJpdmVyCisgIGNsYW5nRnJvbnRlbmQKKyAgY2xhbmdMZXgKICAgY2xhbmdSZXdyaXRlQ29yZQotICBjbGFuZ1Jld3JpdGVGcm9udGVuZAogICApCmRpZmYgLS1naXQgYS9saWIvVG9vbGluZy9Db21tb25PcHRpb25zUGFyc2VyLmNwcCBiL2xpYi9Ub29saW5nL0NvbW1vbk9wdGlvbnNQYXJzZXIuY3BwCmluZGV4IGNjZTQ4MTYuLmUwYjg0NGMgMTAwNjQ0Ci0tLSBhL2xpYi9Ub29saW5nL0NvbW1vbk9wdGlvbnNQYXJzZXIuY3BwCisrKyBiL2xpYi9Ub29saW5nL0NvbW1vbk9wdGlvbnNQYXJzZXIuY3BwCkBAIC01NCwxMiArNTQsMjYgQEAKICAgICAiXG4iOwogCiBDb21tb25PcHRpb25zUGFyc2VyOjpDb21tb25PcHRpb25zUGFyc2VyKGludCAmYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpPcHRpb25DYXRlZ29yeSAmQ2F0ZWdvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk92ZXJ2aWV3KSB7Ci0gIHN0YXRpYyBjbDo6b3B0PHN0ZDo6c3RyaW5nPiBCdWlsZFBhdGgoCi0gICAgICAicCIsIGNsOjpkZXNjKCJCdWlsZCBwYXRoIiksIGNsOjpPcHRpb25hbCk7CisgIHN0YXRpYyBjbDo6b3B0PGJvb2w+IEhlbHAoImgiLCBjbDo6ZGVzYygiQWxpYXMgZm9yIC1oZWxwIiksIGNsOjpIaWRkZW4pOworCisgIHN0YXRpYyBjbDo6b3B0PHN0ZDo6c3RyaW5nPiBCdWlsZFBhdGgoInAiLCBjbDo6ZGVzYygiQnVpbGQgcGF0aCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpPcHRpb25hbCwgY2w6OmNhdChDYXRlZ29yeSkpOwogCiAgIHN0YXRpYyBjbDo6bGlzdDxzdGQ6OnN0cmluZz4gU291cmNlUGF0aHMoCi0gICAgICBjbDo6UG9zaXRpb25hbCwgY2w6OmRlc2MoIjxzb3VyY2UwPiBbLi4uIDxzb3VyY2VOPl0iKSwgY2w6Ok9uZU9yTW9yZSk7CisgICAgICBjbDo6UG9zaXRpb25hbCwgY2w6OmRlc2MoIjxzb3VyY2UwPiBbLi4uIDxzb3VyY2VOPl0iKSwgY2w6Ok9uZU9yTW9yZSwKKyAgICAgIGNsOjpjYXQoQ2F0ZWdvcnkpKTsKKworICAvLyBIaWRlIHVucmVsYXRlZCBvcHRpb25zLgorICBTdHJpbmdNYXA8Y2w6Ok9wdGlvbio+IE9wdGlvbnM7CisgIGNsOjpnZXRSZWdpc3RlcmVkT3B0aW9ucyhPcHRpb25zKTsKKyAgZm9yIChTdHJpbmdNYXA8Y2w6Ok9wdGlvbiAqPjo6aXRlcmF0b3IgSSA9IE9wdGlvbnMuYmVnaW4oKSwgRSA9IE9wdGlvbnMuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICBpZiAoSS0+c2Vjb25kLT5DYXRlZ29yeSAhPSAmQ2F0ZWdvcnkgJiYgSS0+Zmlyc3QoKSAhPSAiaGVscCIgJiYKKyAgICAgICAgSS0+Zmlyc3QoKSAhPSAidmVyc2lvbiIpCisgICAgICBJLT5zZWNvbmQtPnNldEhpZGRlbkZsYWcoY2w6OlJlYWxseUhpZGRlbik7CisgIH0KIAogICBDb21waWxhdGlvbnMucmVzZXQoRml4ZWRDb21waWxhdGlvbkRhdGFiYXNlOjpsb2FkRnJvbUNvbW1hbmRMaW5lKGFyZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndikpOwpkaWZmIC0tZ2l0IGEvbGliL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZS5jcHAgYi9saWIvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlLmNwcAppbmRleCBjOTYyMDU1Li5iNTEzNDQ2IDEwMDY0NAotLS0gYS9saWIvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlLmNwcAorKysgYi9saWIvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlLmNwcApAQCAtMTMsMjIgKzEzLDIxIEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiAjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlLmgiCi0jaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlUGx1Z2luUmVnaXN0cnkuaCIKLSNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1Rvb2xpbmcuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L3N5c3RlbV9lcnJvci5oIgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KICNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL0FjdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0RyaXZlci9Db21waWxhdGlvbi5oIgogI2luY2x1ZGUgImNsYW5nL0RyaXZlci9Ecml2ZXIuaCIKICNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvRHJpdmVyRGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL0RyaXZlci9Kb2IuaCIKLSNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvQ29tcGlsYXRpb24uaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9UZXh0RGlhZ25vc3RpY1ByaW50ZXIuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSG9zdC5oIgorI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZVBsdWdpblJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Ub29saW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKICNpbmNsdWRlICJsbHZtL09wdGlvbi9BcmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSG9zdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3N5c3RlbV9lcnJvci5oIgorI2luY2x1ZGUgPHNzdHJlYW0+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CiBuYW1lc3BhY2UgdG9vbGluZyB7CkBAIC00NCw3ICs0Myw3IEBACiAgICAgICAgSWUgPSBDb21waWxhdGlvbkRhdGFiYXNlUGx1Z2luUmVnaXN0cnk6OmVuZCgpOwogICAgICAgIEl0ICE9IEllOyArK0l0KSB7CiAgICAgc3RkOjpzdHJpbmcgRGF0YWJhc2VFcnJvck1lc3NhZ2U7Ci0gICAgT3duaW5nUHRyPENvbXBpbGF0aW9uRGF0YWJhc2VQbHVnaW4+IFBsdWdpbihJdC0+aW5zdGFudGlhdGUoKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbXBpbGF0aW9uRGF0YWJhc2VQbHVnaW4+IFBsdWdpbihJdC0+aW5zdGFudGlhdGUoKSk7CiAgICAgaWYgKENvbXBpbGF0aW9uRGF0YWJhc2UgKkRCID0KICAgICAgICAgUGx1Z2luLT5sb2FkRnJvbURpcmVjdG9yeShCdWlsZERpcmVjdG9yeSwgRGF0YWJhc2VFcnJvck1lc3NhZ2UpKQogICAgICAgcmV0dXJuIERCOwpAQCAtMTU4LDcgKzE1Nyw3IEBACiAgIFVudXNlZElucHV0RGlhZ0NvbnN1bWVyKERpYWdub3N0aWNDb25zdW1lciAqT3RoZXIpIDogT3RoZXIoT3RoZXIpIHt9CiAKICAgdmlydHVhbCB2b2lkIEhhbmRsZURpYWdub3N0aWMoRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIERpYWdMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpYyAmSW5mbykgTExWTV9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pIG92ZXJyaWRlIHsKICAgICBpZiAoSW5mby5nZXRJRCgpID09IGNsYW5nOjpkaWFnOjp3YXJuX2Rydl9pbnB1dF9maWxlX3VudXNlZCkgewogICAgICAgLy8gQXJnIDEgZm9yIHRoaXMgZGlhZ25vc3RpYyBpcyB0aGUgb3B0aW9uIHRoYXQgZGlkbid0IGdldCB1c2VkLgogICAgICAgVW51c2VkSW5wdXRzLnB1c2hfYmFjayhJbmZvLmdldEFyZ1N0ZFN0cigwKSk7CkBAIC0yMDQsOCArMjAzLDggQEAKIC8vLyAgICAgICAgICBcbGkgdHJ1ZSBpZiBzdWNjZXNzZnVsLgogLy8vICAgICAgICAgIFxsaSBmYWxzZSBpZiBcYyBBcmdzIGNhbm5vdCBiZSB1c2VkIGZvciBjb21waWxhdGlvbiBqb2JzIChlLmcuCiAvLy8gICAgICAgICAgY29udGFpbnMgYW4gb3B0aW9uIGxpa2UgLUUgb3IgLXZlcnNpb24pLgotYm9vbCBzdHJpcFBvc2l0aW9uYWxBcmdzKHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJlJlc3VsdCkgeworc3RhdGljIGJvb2wgc3RyaXBQb3NpdGlvbmFsQXJncyhzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmUmVzdWx0KSB7CiAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljT3B0aW9ucz4gRGlhZ09wdHMgPSBuZXcgRGlhZ25vc3RpY09wdGlvbnMoKTsKICAgVW51c2VkSW5wdXREaWFnQ29uc3VtZXIgRGlhZ0NsaWVudDsKICAgRGlhZ25vc3RpY3NFbmdpbmUgRGlhZ25vc3RpY3MoCkBAIC0yMTQsNyArMjEzLDcgQEAKIAogICAvLyBOZWl0aGVyIGNsYW5nIGV4ZWN1dGFibGUgbm9yIGRlZmF1bHQgaW1hZ2UgbmFtZSBhcmUgcmVxdWlyZWQgc2luY2UgdGhlCiAgIC8vIGpvYnMgdGhlIGRyaXZlciBidWlsZHMgd2lsbCBub3QgYmUgZXhlY3V0ZWQuCi0gIE93bmluZ1B0cjxkcml2ZXI6OkRyaXZlcj4gTmV3RHJpdmVyKG5ldyBkcml2ZXI6OkRyaXZlcigKKyAgc3RkOjp1bmlxdWVfcHRyPGRyaXZlcjo6RHJpdmVyPiBOZXdEcml2ZXIobmV3IGRyaXZlcjo6RHJpdmVyKAogICAgICAgLyogQ2xhbmdFeGVjdXRhYmxlPSAqLyAiIiwgbGx2bTo6c3lzOjpnZXREZWZhdWx0VGFyZ2V0VHJpcGxlKCksCiAgICAgICAvKiBEZWZhdWx0SW1hZ2VOYW1lPSAqLyAiIiwgRGlhZ25vc3RpY3MpKTsKICAgTmV3RHJpdmVyLT5zZXRDaGVja0lucHV0c0V4aXN0KGZhbHNlKTsKQEAgLTIzNyw3ICsyMzYsMTIgQEAKICAgLy8gdXAgd2l0aCBubyBqb2JzIGJ1dCB0aGVuIHRoaXMgaXMgdGhlIHVzZXIncyBmYXVsdC4KICAgQXJncy5wdXNoX2JhY2soInBsYWNlaG9sZGVyLmNwcCIpOwogCi0gIGNvbnN0IE93bmluZ1B0cjxkcml2ZXI6OkNvbXBpbGF0aW9uPiBDb21waWxhdGlvbigKKyAgLy8gUmVtb3ZlIC1uby1pbnRlZ3JhdGVkLWFzOyBpdCdzIG5vdCB1c2VkIGZvciBzeW50YXggY2hlY2tpbmcsCisgIC8vIGFuZCBpdCBjb25mdXNlcyB0YXJnZXRzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhpcyBvcHRpb24uCisgIHN0ZDo6cmVtb3ZlX2lmKEFyZ3MuYmVnaW4oKSwgQXJncy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgTWF0Y2hlc0FueShzdGQ6OnN0cmluZygiLW5vLWludGVncmF0ZWQtYXMiKSkpOworCisgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxkcml2ZXI6OkNvbXBpbGF0aW9uPiBDb21waWxhdGlvbigKICAgICAgIE5ld0RyaXZlci0+QnVpbGRDb21waWxhdGlvbihBcmdzKSk7CiAKICAgY29uc3QgZHJpdmVyOjpKb2JMaXN0ICZKb2JzID0gQ29tcGlsYXRpb24tPmdldEpvYnMoKTsKQEAgLTI3MSw2ICsyNzUsNyBAQAogICBFbmQgPSBzdGQ6OnJlbW92ZV9pZihBcmdzLmJlZ2luKCksIEVuZCwgTWF0Y2hlc0FueShEaWFnQ2xpZW50LlVudXNlZElucHV0cykpOwogCiAgIC8vIFJlbW92ZSB0aGUgLWMgYWRkIGFib3ZlIGFzIHdlbGwuIEl0IHdpbGwgYmUgYXQgdGhlIGVuZCByaWdodCBub3cuCisgIGFzc2VydChzdHJjbXAoKihFbmQgLSAxKSwgIi1jIikgPT0gMCk7CiAgIC0tRW5kOwogCiAgIFJlc3VsdCA9IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPihBcmdzLmJlZ2luKCkgKyAxLCBFbmQpOwpAQCAtMjk4LDcgKzMwMyw4IEBACiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBUb29sQ29tbWFuZExpbmUoMSwgImNsYW5nLXRvb2wiKTsKICAgVG9vbENvbW1hbmRMaW5lLmluc2VydChUb29sQ29tbWFuZExpbmUuZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmUuYmVnaW4oKSwgQ29tbWFuZExpbmUuZW5kKCkpOwotICBDb21waWxlQ29tbWFuZHMucHVzaF9iYWNrKENvbXBpbGVDb21tYW5kKERpcmVjdG9yeSwgVG9vbENvbW1hbmRMaW5lKSk7CisgIENvbXBpbGVDb21tYW5kcy5wdXNoX2JhY2soCisgICAgICBDb21waWxlQ29tbWFuZChEaXJlY3RvcnksIHN0ZDo6bW92ZShUb29sQ29tbWFuZExpbmUpKSk7CiB9CiAKIHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPgpkaWZmIC0tZ2l0IGEvbGliL1Rvb2xpbmcvRmlsZU1hdGNoVHJpZS5jcHAgYi9saWIvVG9vbGluZy9GaWxlTWF0Y2hUcmllLmNwcAppbmRleCA4OTk3OWE4Li5kYzk5OTllIDEwMDY0NAotLS0gYS9saWIvVG9vbGluZy9GaWxlTWF0Y2hUcmllLmNwcAorKysgYi9saWIvVG9vbGluZy9GaWxlTWF0Y2hUcmllLmNwcApAQCAtMjQsNyArMjQsNyBAQAogLy8vIFxicmllZiBEZWZhdWx0IFxjIFBhdGhDb21wYXJhdG9yIHVzaW5nIFxjIGxsdm06OnN5czo6ZnM6OmVxdWl2YWxlbnQoKS4KIHN0cnVjdCBEZWZhdWx0UGF0aENvbXBhcmF0b3IgOiBwdWJsaWMgUGF0aENvbXBhcmF0b3IgewogICB2aXJ0dWFsIH5EZWZhdWx0UGF0aENvbXBhcmF0b3IoKSB7fQotICB2aXJ0dWFsIGJvb2wgZXF1aXZhbGVudChTdHJpbmdSZWYgRmlsZUEsIFN0cmluZ1JlZiBGaWxlQikgY29uc3QgeworICBib29sIGVxdWl2YWxlbnQoU3RyaW5nUmVmIEZpbGVBLCBTdHJpbmdSZWYgRmlsZUIpIGNvbnN0IG92ZXJyaWRlIHsKICAgICByZXR1cm4gRmlsZUEgPT0gRmlsZUIgfHwgbGx2bTo6c3lzOjpmczo6ZXF1aXZhbGVudChGaWxlQSwgRmlsZUIpOwogICB9CiB9OwpkaWZmIC0tZ2l0IGEvbGliL1Rvb2xpbmcvSlNPTkNvbXBpbGF0aW9uRGF0YWJhc2UuY3BwIGIvbGliL1Rvb2xpbmcvSlNPTkNvbXBpbGF0aW9uRGF0YWJhc2UuY3BwCmluZGV4IDFlMzNiNDEuLjVmZTA5ODAgMTAwNjQ0Ci0tLSBhL2xpYi9Ub29saW5nL0pTT05Db21waWxhdGlvbkRhdGFiYXNlLmNwcAorKysgYi9saWIvVG9vbGluZy9KU09OQ29tcGlsYXRpb25EYXRhYmFzZS5jcHAKQEAgLTExOCwxNSArMTE4LDE1IEBACiB9CiAKIGNsYXNzIEpTT05Db21waWxhdGlvbkRhdGFiYXNlUGx1Z2luIDogcHVibGljIENvbXBpbGF0aW9uRGF0YWJhc2VQbHVnaW4gewotICB2aXJ0dWFsIENvbXBpbGF0aW9uRGF0YWJhc2UgKmxvYWRGcm9tRGlyZWN0b3J5KAotICAgICAgU3RyaW5nUmVmIERpcmVjdG9yeSwgc3RkOjpzdHJpbmcgJkVycm9yTWVzc2FnZSkgeworICBDb21waWxhdGlvbkRhdGFiYXNlICpsb2FkRnJvbURpcmVjdG9yeShTdHJpbmdSZWYgRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmRXJyb3JNZXNzYWdlKSBvdmVycmlkZSB7CiAgICAgU21hbGxTdHJpbmc8MTAyND4gSlNPTkRhdGFiYXNlUGF0aChEaXJlY3RvcnkpOwogICAgIGxsdm06OnN5czo6cGF0aDo6YXBwZW5kKEpTT05EYXRhYmFzZVBhdGgsICJjb21waWxlX2NvbW1hbmRzLmpzb24iKTsKLSAgICBPd25pbmdQdHI8Q29tcGlsYXRpb25EYXRhYmFzZT4gRGF0YWJhc2UoCisgICAgc3RkOjp1bmlxdWVfcHRyPENvbXBpbGF0aW9uRGF0YWJhc2U+IERhdGFiYXNlKAogICAgICAgICBKU09OQ29tcGlsYXRpb25EYXRhYmFzZTo6bG9hZEZyb21GaWxlKEpTT05EYXRhYmFzZVBhdGgsIEVycm9yTWVzc2FnZSkpOwogICAgIGlmICghRGF0YWJhc2UpCiAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gRGF0YWJhc2UudGFrZSgpOworICAgIHJldHVybiBEYXRhYmFzZS5yZWxlYXNlKCk7CiAgIH0KIH07CiAKQEAgLTE0NCwzNyArMTQ0LDM3IEBACiBKU09OQ29tcGlsYXRpb25EYXRhYmFzZSAqCiBKU09OQ29tcGlsYXRpb25EYXRhYmFzZTo6bG9hZEZyb21GaWxlKFN0cmluZ1JlZiBGaWxlUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJkVycm9yTWVzc2FnZSkgewotICBPd25pbmdQdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBEYXRhYmFzZUJ1ZmZlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gRGF0YWJhc2VCdWZmZXI7CiAgIGxsdm06OmVycm9yX2NvZGUgUmVzdWx0ID0KICAgICBsbHZtOjpNZW1vcnlCdWZmZXI6OmdldEZpbGUoRmlsZVBhdGgsIERhdGFiYXNlQnVmZmVyKTsKICAgaWYgKFJlc3VsdCAhPSAwKSB7CiAgICAgRXJyb3JNZXNzYWdlID0gIkVycm9yIHdoaWxlIG9wZW5pbmcgSlNPTiBkYXRhYmFzZTogIiArIFJlc3VsdC5tZXNzYWdlKCk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KLSAgT3duaW5nUHRyPEpTT05Db21waWxhdGlvbkRhdGFiYXNlPiBEYXRhYmFzZSgKLSAgICBuZXcgSlNPTkNvbXBpbGF0aW9uRGF0YWJhc2UoRGF0YWJhc2VCdWZmZXIudGFrZSgpKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxKU09OQ29tcGlsYXRpb25EYXRhYmFzZT4gRGF0YWJhc2UoCisgICAgICBuZXcgSlNPTkNvbXBpbGF0aW9uRGF0YWJhc2UoRGF0YWJhc2VCdWZmZXIucmVsZWFzZSgpKSk7CiAgIGlmICghRGF0YWJhc2UtPnBhcnNlKEVycm9yTWVzc2FnZSkpCiAgICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBEYXRhYmFzZS50YWtlKCk7CisgIHJldHVybiBEYXRhYmFzZS5yZWxlYXNlKCk7CiB9CiAKIEpTT05Db21waWxhdGlvbkRhdGFiYXNlICoKIEpTT05Db21waWxhdGlvbkRhdGFiYXNlOjpsb2FkRnJvbUJ1ZmZlcihTdHJpbmdSZWYgRGF0YWJhc2VTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJkVycm9yTWVzc2FnZSkgewotICBPd25pbmdQdHI8bGx2bTo6TWVtb3J5QnVmZmVyPiBEYXRhYmFzZUJ1ZmZlcigKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gRGF0YWJhc2VCdWZmZXIoCiAgICAgICBsbHZtOjpNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlcihEYXRhYmFzZVN0cmluZykpOwotICBPd25pbmdQdHI8SlNPTkNvbXBpbGF0aW9uRGF0YWJhc2U+IERhdGFiYXNlKAotICAgICAgbmV3IEpTT05Db21waWxhdGlvbkRhdGFiYXNlKERhdGFiYXNlQnVmZmVyLnRha2UoKSkpOworICBzdGQ6OnVuaXF1ZV9wdHI8SlNPTkNvbXBpbGF0aW9uRGF0YWJhc2U+IERhdGFiYXNlKAorICAgICAgbmV3IEpTT05Db21waWxhdGlvbkRhdGFiYXNlKERhdGFiYXNlQnVmZmVyLnJlbGVhc2UoKSkpOwogICBpZiAoIURhdGFiYXNlLT5wYXJzZShFcnJvck1lc3NhZ2UpKQogICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gRGF0YWJhc2UudGFrZSgpOworICByZXR1cm4gRGF0YWJhc2UucmVsZWFzZSgpOwogfQogCiBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZD4KIEpTT05Db21waWxhdGlvbkRhdGFiYXNlOjpnZXRDb21waWxlQ29tbWFuZHMoU3RyaW5nUmVmIEZpbGVQYXRoKSBjb25zdCB7CiAgIFNtYWxsU3RyaW5nPDEyOD4gTmF0aXZlRmlsZVBhdGg7CiAgIGxsdm06OnN5czo6cGF0aDo6bmF0aXZlKEZpbGVQYXRoLCBOYXRpdmVGaWxlUGF0aCk7Ci0gIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gUG9zc2libGVNYXRjaGVzOworCiAgIHN0ZDo6c3RyaW5nIEVycm9yOwogICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gRVMoRXJyb3IpOwogICBTdHJpbmdSZWYgTWF0Y2ggPSBNYXRjaFRyaWUuZmluZEVxdWl2YWxlbnQoTmF0aXZlRmlsZVBhdGguc3RyKCksIEVTKTsKZGlmZiAtLWdpdCBhL2xpYi9Ub29saW5nL1JlZmFjdG9yaW5nLmNwcCBiL2xpYi9Ub29saW5nL1JlZmFjdG9yaW5nLmNwcAppbmRleCBlMTY1YzEyLi5kZjk2MDBlIDEwMDY0NAotLS0gYS9saWIvVG9vbGluZy9SZWZhY3RvcmluZy5jcHAKKysrIGIvbGliL1Rvb2xpbmcvUmVmYWN0b3JpbmcuY3BwCkBAIC0xOCw5ICsxOCw5IEBACiAjaW5jbHVkZSAiY2xhbmcvTGV4L0xleGVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvUmV3cml0ZS9Db3JlL1Jld3JpdGVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9SZWZhY3RvcmluZy5oIgotI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3Nfb3N0cmVhbS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdGguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zX29zdHJlYW0uaCIKIAogbmFtZXNwYWNlIGNsYW5nIHsKIG5hbWVzcGFjZSB0b29saW5nIHsKQEAgLTM1LDEyICszNSwxMyBAQAogICAgIDogRmlsZVBhdGgoRmlsZVBhdGgpLCBSZXBsYWNlbWVudFJhbmdlKE9mZnNldCwgTGVuZ3RoKSwKICAgICAgIFJlcGxhY2VtZW50VGV4dChSZXBsYWNlbWVudFRleHQpIHt9CiAKLVJlcGxhY2VtZW50OjpSZXBsYWNlbWVudChTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLCBTb3VyY2VMb2NhdGlvbiBTdGFydCwKK1JlcGxhY2VtZW50OjpSZXBsYWNlbWVudChjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLCBTb3VyY2VMb2NhdGlvbiBTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMZW5ndGgsIFN0cmluZ1JlZiBSZXBsYWNlbWVudFRleHQpIHsKICAgc2V0RnJvbVNvdXJjZUxvY2F0aW9uKFNvdXJjZXMsIFN0YXJ0LCBMZW5ndGgsIFJlcGxhY2VtZW50VGV4dCk7CiB9CiAKLVJlcGxhY2VtZW50OjpSZXBsYWNlbWVudChTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLCBjb25zdCBDaGFyU291cmNlUmFuZ2UgJlJhbmdlLAorUmVwbGFjZW1lbnQ6OlJlcGxhY2VtZW50KGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVwbGFjZW1lbnRUZXh0KSB7CiAgIHNldEZyb21Tb3VyY2VSYW5nZShTb3VyY2VzLCBSYW5nZSwgUmVwbGFjZW1lbnRUZXh0KTsKIH0KQEAgLTk5LDcgKzEwMCw3IEBACiAgICAgICAgICBMSFMuZ2V0UmVwbGFjZW1lbnRUZXh0KCkgPT0gUkhTLmdldFJlcGxhY2VtZW50VGV4dCgpOwogfQogCi12b2lkIFJlcGxhY2VtZW50OjpzZXRGcm9tU291cmNlTG9jYXRpb24oU291cmNlTWFuYWdlciAmU291cmNlcywKK3ZvaWQgUmVwbGFjZW1lbnQ6OnNldEZyb21Tb3VyY2VMb2NhdGlvbihjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uIFN0YXJ0LCB1bnNpZ25lZCBMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlcGxhY2VtZW50VGV4dCkgewogICBjb25zdCBzdGQ6OnBhaXI8RmlsZUlELCB1bnNpZ25lZD4gRGVjb21wb3NlZExvY2F0aW9uID0KQEAgLTEyMSw3ICsxMjIsOCBAQAogLy8gRklYTUU6IFRoaXMgc2hvdWxkIGdvIGludG8gdGhlIExleGVyLCBidXQgd2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdwogLy8gdG8gaGFuZGxlIHJhbmdlcyBmb3IgcmVmYWN0b3JpbmcgaW4gZ2VuZXJhbCBmaXJzdCAtIHRoZXJlIGlzIG5vIG9idmlvdXMKIC8vIGdvb2Qgd2F5IGhvdyB0byBpbnRlZ3JhdGUgdGhpcyBpbnRvIHRoZSBMZXhlciB5ZXQuCi1zdGF0aWMgaW50IGdldFJhbmdlU2l6ZShTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLCBjb25zdCBDaGFyU291cmNlUmFuZ2UgJlJhbmdlKSB7CitzdGF0aWMgaW50IGdldFJhbmdlU2l6ZShjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhclNvdXJjZVJhbmdlICZSYW5nZSkgewogICBTb3VyY2VMb2NhdGlvbiBTcGVsbGluZ0JlZ2luID0gU291cmNlcy5nZXRTcGVsbGluZ0xvYyhSYW5nZS5nZXRCZWdpbigpKTsKICAgU291cmNlTG9jYXRpb24gU3BlbGxpbmdFbmQgPSBTb3VyY2VzLmdldFNwZWxsaW5nTG9jKFJhbmdlLmdldEVuZCgpKTsKICAgc3RkOjpwYWlyPEZpbGVJRCwgdW5zaWduZWQ+IFN0YXJ0ID0gU291cmNlcy5nZXREZWNvbXBvc2VkTG9jKFNwZWxsaW5nQmVnaW4pOwpAQCAtMTMzLDcgKzEzNSw3IEBACiAgIHJldHVybiBFbmQuc2Vjb25kIC0gU3RhcnQuc2Vjb25kOwogfQogCi12b2lkIFJlcGxhY2VtZW50OjpzZXRGcm9tU291cmNlUmFuZ2UoU291cmNlTWFuYWdlciAmU291cmNlcywKK3ZvaWQgUmVwbGFjZW1lbnQ6OnNldEZyb21Tb3VyY2VSYW5nZShjb25zdCBTb3VyY2VNYW5hZ2VyICZTb3VyY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoYXJTb3VyY2VSYW5nZSAmUmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFJlcGxhY2VtZW50VGV4dCkgewogICBzZXRGcm9tU291cmNlTG9jYXRpb24oU291cmNlcywgU291cmNlcy5nZXRTcGVsbGluZ0xvYyhSYW5nZS5nZXRCZWdpbigpKSwKZGlmZiAtLWdpdCBhL2xpYi9Ub29saW5nL1Rvb2xpbmcuY3BwIGIvbGliL1Rvb2xpbmcvVG9vbGluZy5jcHAKaW5kZXggYTU4ODU0ZC4uNzQyNWUzYiAxMDA2NDQKLS0tIGEvbGliL1Rvb2xpbmcvVG9vbGluZy5jcHAKKysrIGIvbGliL1Rvb2xpbmcvVG9vbGluZy5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0FyZ3VtZW50c0FkanVzdGVycy5oIgogI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZS5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgogI2luY2x1ZGUgImxsdm0vT3B0aW9uL09wdGlvbi5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCkBAIC0zMSw3ICszMiw3IEBACiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCiAKIC8vIEZvciBjaGRpciwgc2VlIHRoZSBjb21tZW50IGluIENsYW5nVG9vbDo6cnVuIGZvciBtb3JlIGluZm9ybWF0aW9uLgotI2lmZGVmIF9XSU4zMgorI2lmZGVmIExMVk1fT05fV0lOMzIKICMgIGluY2x1ZGUgPGRpcmVjdC5oPgogI2Vsc2UKICMgIGluY2x1ZGUgPHVuaXN0ZC5oPgpAQCAtNTEsNyArNTIsNyBAQAogLy8vIFxicmllZiBCdWlsZHMgYSBjbGFuZyBkcml2ZXIgaW5pdGlhbGl6ZWQgZm9yIHJ1bm5pbmcgY2xhbmcgdG9vbHMuCiBzdGF0aWMgY2xhbmc6OmRyaXZlcjo6RHJpdmVyICpuZXdEcml2ZXIoY2xhbmc6OkRpYWdub3N0aWNzRW5naW5lICpEaWFnbm9zdGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpCaW5hcnlOYW1lKSB7Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIERlZmF1bHRPdXRwdXROYW1lID0gImEub3V0IjsKKyAgY29uc3QgY2hhciAqRGVmYXVsdE91dHB1dE5hbWUgPSAiYS5vdXQiOwogICBjbGFuZzo6ZHJpdmVyOjpEcml2ZXIgKkNvbXBpbGVyRHJpdmVyID0gbmV3IGNsYW5nOjpkcml2ZXI6OkRyaXZlcigKICAgICBCaW5hcnlOYW1lLCBsbHZtOjpzeXM6OmdldERlZmF1bHRUYXJnZXRUcmlwbGUoKSwKICAgICBEZWZhdWx0T3V0cHV0TmFtZSwgKkRpYWdub3N0aWNzKTsKQEAgLTk5LDYgKzEwMCw3IEBACiAgICAgICAqRGlhZ25vc3RpY3MpOwogICBJbnZvY2F0aW9uLT5nZXRGcm9udGVuZE9wdHMoKS5EaXNhYmxlRnJlZSA9IGZhbHNlOwogICBJbnZvY2F0aW9uLT5nZXRDb2RlR2VuT3B0cygpLkRpc2FibGVGcmVlID0gZmFsc2U7CisgIEludm9jYXRpb24tPmdldERlcGVuZGVuY3lPdXRwdXRPcHRzKCkgPSBEZXBlbmRlbmN5T3V0cHV0T3B0aW9ucygpOwogICByZXR1cm4gSW52b2NhdGlvbjsKIH0KIApAQCAtMTU4LDIyICsxNjAsMjIgQEAKIHB1YmxpYzoKICAgU2luZ2xlRnJvbnRlbmRBY3Rpb25GYWN0b3J5KEZyb250ZW5kQWN0aW9uICpBY3Rpb24pIDogQWN0aW9uKEFjdGlvbikge30KIAotICBGcm9udGVuZEFjdGlvbiAqY3JlYXRlKCkgeyByZXR1cm4gQWN0aW9uOyB9CisgIEZyb250ZW5kQWN0aW9uICpjcmVhdGUoKSBvdmVycmlkZSB7IHJldHVybiBBY3Rpb247IH0KIH07CiAKIH0KIAotVG9vbEludm9jYXRpb246OlRvb2xJbnZvY2F0aW9uKEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBDb21tYW5kTGluZSwKK1Rvb2xJbnZvY2F0aW9uOjpUb29sSW52b2NhdGlvbihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29tbWFuZExpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9vbEFjdGlvbiAqQWN0aW9uLCBGaWxlTWFuYWdlciAqRmlsZXMpCi0gICAgOiBDb21tYW5kTGluZShDb21tYW5kTGluZS52ZWMoKSksCisgICAgOiBDb21tYW5kTGluZShzdGQ6Om1vdmUoQ29tbWFuZExpbmUpKSwKICAgICAgIEFjdGlvbihBY3Rpb24pLAogICAgICAgT3duc0FjdGlvbihmYWxzZSksCiAgICAgICBGaWxlcyhGaWxlcyksCiAgICAgICBEaWFnQ29uc3VtZXIoTlVMTCkge30KIAotVG9vbEludm9jYXRpb246OlRvb2xJbnZvY2F0aW9uKEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBDb21tYW5kTGluZSwKK1Rvb2xJbnZvY2F0aW9uOjpUb29sSW52b2NhdGlvbihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29tbWFuZExpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmRBY3Rpb24gKkZBY3Rpb24sIEZpbGVNYW5hZ2VyICpGaWxlcykKLSAgICA6IENvbW1hbmRMaW5lKENvbW1hbmRMaW5lLnZlYygpKSwKKyAgICA6IENvbW1hbmRMaW5lKHN0ZDo6bW92ZShDb21tYW5kTGluZSkpLAogICAgICAgQWN0aW9uKG5ldyBTaW5nbGVGcm9udGVuZEFjdGlvbkZhY3RvcnkoRkFjdGlvbikpLAogICAgICAgT3duc0FjdGlvbih0cnVlKSwKICAgICAgIEZpbGVzKEZpbGVzKSwKQEAgLTE5Niw4ICsxOTgsOCBAQAogCiBib29sIFRvb2xJbnZvY2F0aW9uOjpydW4oKSB7CiAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBBcmd2OwotICBmb3IgKGludCBJID0gMCwgRSA9IENvbW1hbmRMaW5lLnNpemUoKTsgSSAhPSBFOyArK0kpCi0gICAgQXJndi5wdXNoX2JhY2soQ29tbWFuZExpbmVbSV0uY19zdHIoKSk7CisgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJlN0ciA6IENvbW1hbmRMaW5lKQorICAgIEFyZ3YucHVzaF9iYWNrKFN0ci5jX3N0cigpKTsKICAgY29uc3QgY2hhciAqY29uc3QgQmluYXJ5TmFtZSA9IEFyZ3ZbMF07CiAgIEludHJ1c2l2ZVJlZkNudFB0cjxEaWFnbm9zdGljT3B0aW9ucz4gRGlhZ09wdHMgPSBuZXcgRGlhZ25vc3RpY09wdGlvbnMoKTsKICAgVGV4dERpYWdub3N0aWNQcmludGVyIERpYWdub3N0aWNQcmludGVyKApAQCAtMjA2LDI4ICsyMDgsMjUgQEAKICAgICAgIEludHJ1c2l2ZVJlZkNudFB0cjxjbGFuZzo6RGlhZ25vc3RpY0lEcz4obmV3IERpYWdub3N0aWNJRHMoKSksICYqRGlhZ09wdHMsCiAgICAgICBEaWFnQ29uc3VtZXIgPyBEaWFnQ29uc3VtZXIgOiAmRGlhZ25vc3RpY1ByaW50ZXIsIGZhbHNlKTsKIAotICBjb25zdCBPd25pbmdQdHI8Y2xhbmc6OmRyaXZlcjo6RHJpdmVyPiBEcml2ZXIoCisgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxjbGFuZzo6ZHJpdmVyOjpEcml2ZXI+IERyaXZlcigKICAgICAgIG5ld0RyaXZlcigmRGlhZ25vc3RpY3MsIEJpbmFyeU5hbWUpKTsKICAgLy8gU2luY2UgdGhlIGlucHV0IG1pZ2h0IG9ubHkgYmUgdmlydHVhbCwgZG9uJ3QgY2hlY2sgd2hldGhlciBpdCBleGlzdHMuCiAgIERyaXZlci0+c2V0Q2hlY2tJbnB1dHNFeGlzdChmYWxzZSk7Ci0gIGNvbnN0IE93bmluZ1B0cjxjbGFuZzo6ZHJpdmVyOjpDb21waWxhdGlvbj4gQ29tcGlsYXRpb24oCisgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxjbGFuZzo6ZHJpdmVyOjpDb21waWxhdGlvbj4gQ29tcGlsYXRpb24oCiAgICAgICBEcml2ZXItPkJ1aWxkQ29tcGlsYXRpb24obGx2bTo6bWFrZUFycmF5UmVmKEFyZ3YpKSk7CiAgIGNvbnN0IGxsdm06Om9wdDo6QXJnU3RyaW5nTGlzdCAqY29uc3QgQ0MxQXJncyA9IGdldENDMUFyZ3VtZW50cygKICAgICAgICZEaWFnbm9zdGljcywgQ29tcGlsYXRpb24uZ2V0KCkpOwogICBpZiAoQ0MxQXJncyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIE93bmluZ1B0cjxjbGFuZzo6Q29tcGlsZXJJbnZvY2F0aW9uPiBJbnZvY2F0aW9uKAorICBzdGQ6OnVuaXF1ZV9wdHI8Y2xhbmc6OkNvbXBpbGVySW52b2NhdGlvbj4gSW52b2NhdGlvbigKICAgICAgIG5ld0ludm9jYXRpb24oJkRpYWdub3N0aWNzLCAqQ0MxQXJncykpOwotICBmb3IgKGxsdm06OlN0cmluZ01hcDxTdHJpbmdSZWY+Ojpjb25zdF9pdGVyYXRvcgotICAgICAgICAgICBJdCA9IE1hcHBlZEZpbGVDb250ZW50cy5iZWdpbigpLCBFbmQgPSBNYXBwZWRGaWxlQ29udGVudHMuZW5kKCk7Ci0gICAgICAgSXQgIT0gRW5kOyArK0l0KSB7CisgIGZvciAoY29uc3QgYXV0byAmSXQgOiBNYXBwZWRGaWxlQ29udGVudHMpIHsKICAgICAvLyBJbmplY3QgdGhlIGNvZGUgYXMgdGhlIGdpdmVuIGZpbGUgbmFtZSBpbnRvIHRoZSBwcmVwcm9jZXNzb3Igb3B0aW9ucy4KLSAgICBjb25zdCBsbHZtOjpNZW1vcnlCdWZmZXIgKklucHV0ID0KLSAgICAgICAgbGx2bTo6TWVtb3J5QnVmZmVyOjpnZXRNZW1CdWZmZXIoSXQtPmdldFZhbHVlKCkpOwotICAgIEludm9jYXRpb24tPmdldFByZXByb2Nlc3Nvck9wdHMoKS5hZGRSZW1hcHBlZEZpbGUoSXQtPmdldEtleSgpLCBJbnB1dCk7CisgICAgYXV0byAqSW5wdXQgPSBsbHZtOjpNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlcihJdC5nZXRWYWx1ZSgpKTsKKyAgICBJbnZvY2F0aW9uLT5nZXRQcmVwcm9jZXNzb3JPcHRzKCkuYWRkUmVtYXBwZWRGaWxlKEl0LmdldEtleSgpLCBJbnB1dCk7CiAgIH0KLSAgcmV0dXJuIHJ1bkludm9jYXRpb24oQmluYXJ5TmFtZSwgQ29tcGlsYXRpb24uZ2V0KCksIEludm9jYXRpb24udGFrZSgpKTsKKyAgcmV0dXJuIHJ1bkludm9jYXRpb24oQmluYXJ5TmFtZSwgQ29tcGlsYXRpb24uZ2V0KCksIEludm9jYXRpb24ucmVsZWFzZSgpKTsKIH0KIAogYm9vbCBUb29sSW52b2NhdGlvbjo6cnVuSW52b2NhdGlvbigKQEAgLTI1NCw4ICsyNTMsOCBAQAogCiAgIC8vIFRoZSBGcm9udGVuZEFjdGlvbiBjYW4gaGF2ZSBsaWZldGltZSByZXF1aXJlbWVudHMgZm9yIENvbXBpbGVyIG9yIGl0cwogICAvLyBtZW1iZXJzLCBhbmQgd2UgbmVlZCB0byBlbnN1cmUgaXQncyBkZWxldGVkIGVhcmxpZXIgdGhhbiBDb21waWxlci4gU28gd2UKLSAgLy8gcGFzcyBpdCB0byBhbiBPd25pbmdQdHIgZGVjbGFyZWQgYWZ0ZXIgdGhlIENvbXBpbGVyIHZhcmlhYmxlLgotICBPd25pbmdQdHI8RnJvbnRlbmRBY3Rpb24+IFNjb3BlZFRvb2xBY3Rpb24oY3JlYXRlKCkpOworICAvLyBwYXNzIGl0IHRvIGFuIHN0ZDo6dW5pcXVlX3B0ciBkZWNsYXJlZCBhZnRlciB0aGUgQ29tcGlsZXIgdmFyaWFibGUuCisgIHN0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbj4gU2NvcGVkVG9vbEFjdGlvbihjcmVhdGUoKSk7CiAKICAgLy8gQ3JlYXRlIHRoZSBjb21waWxlcnMgYWN0dWFsIGRpYWdub3N0aWNzIGVuZ2luZS4KICAgQ29tcGlsZXIuY3JlYXRlRGlhZ25vc3RpY3MoRGlhZ0NvbnN1bWVyLCAvKlNob3VsZE93bkNsaWVudD0qL2ZhbHNlKTsKQEAgLTI3NSwxNSArMjc0LDE1IEBACiAgICAgOiBGaWxlcyhuZXcgRmlsZU1hbmFnZXIoRmlsZVN5c3RlbU9wdGlvbnMoKSkpLCBEaWFnQ29uc3VtZXIoTlVMTCkgewogICBBcmdzQWRqdXN0ZXJzLnB1c2hfYmFjayhuZXcgQ2xhbmdTdHJpcE91dHB1dEFkanVzdGVyKCkpOwogICBBcmdzQWRqdXN0ZXJzLnB1c2hfYmFjayhuZXcgQ2xhbmdTeW50YXhPbmx5QWRqdXN0ZXIoKSk7Ci0gIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBTb3VyY2VQYXRocy5zaXplKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgU21hbGxTdHJpbmc8MTAyND4gRmlsZShnZXRBYnNvbHV0ZVBhdGgoU291cmNlUGF0aHNbSV0pKTsKKyAgZm9yIChjb25zdCBhdXRvICZTb3VyY2VQYXRoIDogU291cmNlUGF0aHMpIHsKKyAgICBzdGQ6OnN0cmluZyBGaWxlKGdldEFic29sdXRlUGF0aChTb3VyY2VQYXRoKSk7CiAKICAgICBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZD4gQ29tcGlsZUNvbW1hbmRzRm9yRmlsZSA9Ci0gICAgICBDb21waWxhdGlvbnMuZ2V0Q29tcGlsZUNvbW1hbmRzKEZpbGUuc3RyKCkpOworICAgICAgQ29tcGlsYXRpb25zLmdldENvbXBpbGVDb21tYW5kcyhGaWxlKTsKICAgICBpZiAoIUNvbXBpbGVDb21tYW5kc0ZvckZpbGUuZW1wdHkoKSkgewotICAgICAgZm9yIChpbnQgSSA9IDAsIEUgPSBDb21waWxlQ29tbWFuZHNGb3JGaWxlLnNpemUoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgICAgQ29tcGlsZUNvbW1hbmRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihGaWxlLnN0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVDb21tYW5kc0ZvckZpbGVbSV0pKTsKKyAgICAgIGZvciAoQ29tcGlsZUNvbW1hbmQgJkNvbXBpbGVDb21tYW5kIDogQ29tcGlsZUNvbW1hbmRzRm9yRmlsZSkgeworICAgICAgICBDb21waWxlQ29tbWFuZHMucHVzaF9iYWNrKAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoRmlsZSwgc3RkOjptb3ZlKENvbXBpbGVDb21tYW5kKSkpOwogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAvLyBGSVhNRTogVGhlcmUgYXJlIHR3byB1c2UgY2FzZXMgaGVyZTogZG9pbmcgYSBmdXp6eQpAQCAtMzMyLDggKzMzMSw3IEBACiAgICAgICBsbHZtOjpzeXM6OmZzOjpnZXRNYWluRXhlY3V0YWJsZSgiY2xhbmdfdG9vbCIsICZTdGF0aWNTeW1ib2wpOwogCiAgIGJvb2wgUHJvY2Vzc2luZ0ZhaWxlZCA9IGZhbHNlOwotICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgQ29tcGlsZUNvbW1hbmRzLnNpemUoKTsgKytJKSB7Ci0gICAgc3RkOjpzdHJpbmcgRmlsZSA9IENvbXBpbGVDb21tYW5kc1tJXS5maXJzdDsKKyAgZm9yIChjb25zdCBhdXRvICZDb21tYW5kIDogQ29tcGlsZUNvbW1hbmRzKSB7CiAgICAgLy8gRklYTUU6IGNoZGlyIGlzIHRocmVhZCBob3N0aWxlOyBvbiB0aGUgb3RoZXIgaGFuZCwgY3JlYXRpbmcgdGhlIHNhbWUKICAgICAvLyBiZWhhdmlvciBhcyBjaGRpciBpcyBjb21wbGV4OiBjaGRpciByZXNvbHZlcyB0aGUgcGF0aCBvbmNlLCB0aHVzCiAgICAgLy8gZ3VhcmFudGVlaW5nIHRoYXQgYWxsIHN1YnNlcXVlbnQgcmVsYXRpdmUgcGF0aCBvcGVyYXRpb25zIHdvcmsKQEAgLTM0MSwyOCArMzM5LDI3IEBACiAgICAgLy8gZm9yIGV4YW1wbGUgb24gbmV0d29yayBmaWxlc3lzdGVtcywgd2hlcmUgc3ltbGlua3MgbWlnaHQgYmUgc3dpdGNoZWQKICAgICAvLyBkdXJpbmcgcnVudGltZSBvZiB0aGUgdG9vbC4gRml4aW5nIHRoaXMgZGVwZW5kcyBvbiBoYXZpbmcgYSBmaWxlIHN5c3RlbQogICAgIC8vIGFic3RyYWN0aW9uIHRoYXQgYWxsb3dzIG9wZW5hdCgpIHN0eWxlIGludGVyYWN0aW9ucy4KLSAgICBpZiAoY2hkaXIoQ29tcGlsZUNvbW1hbmRzW0ldLnNlY29uZC5EaXJlY3RvcnkuY19zdHIoKSkpCisgICAgaWYgKGNoZGlyKENvbW1hbmQuc2Vjb25kLkRpcmVjdG9yeS5jX3N0cigpKSkKICAgICAgIGxsdm06OnJlcG9ydF9mYXRhbF9lcnJvcigiQ2Fubm90IGNoZGlyIGludG8gXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlQ29tbWFuZHNbSV0uc2Vjb25kLkRpcmVjdG9yeSArICJcbiEiKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29tbWFuZExpbmUgPSBDb21waWxlQ29tbWFuZHNbSV0uc2Vjb25kLkNvbW1hbmRMaW5lOwotICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBBcmdzQWRqdXN0ZXJzLnNpemUoKTsgSSAhPSBFOyArK0kpCi0gICAgICBDb21tYW5kTGluZSA9IEFyZ3NBZGp1c3RlcnNbSV0tPkFkanVzdChDb21tYW5kTGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHdpbmUoQ29tbWFuZC5zZWNvbmQuRGlyZWN0b3J5KSArICJcbiEiKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29tbWFuZExpbmUgPSBDb21tYW5kLnNlY29uZC5Db21tYW5kTGluZTsKKyAgICBmb3IgKEFyZ3VtZW50c0FkanVzdGVyICpBZGp1c3RlciA6IEFyZ3NBZGp1c3RlcnMpCisgICAgICBDb21tYW5kTGluZSA9IEFkanVzdGVyLT5BZGp1c3QoQ29tbWFuZExpbmUpOwogICAgIGFzc2VydCghQ29tbWFuZExpbmUuZW1wdHkoKSk7CiAgICAgQ29tbWFuZExpbmVbMF0gPSBNYWluRXhlY3V0YWJsZTsKICAgICAvLyBGSVhNRTogV2UgbmVlZCBhIGNhbGxiYWNrIG1lY2hhbmlzbSBmb3IgdGhlIHRvb2wgd3JpdGVyIHRvIG91dHB1dCBhCiAgICAgLy8gY3VzdG9taXplZCBtZXNzYWdlIGZvciBlYWNoIGZpbGUuCiAgICAgREVCVUcoewotICAgICAgbGx2bTo6ZGJncygpIDw8ICJQcm9jZXNzaW5nOiAiIDw8IEZpbGUgPDwgIi5cbiI7CisgICAgICBsbHZtOjpkYmdzKCkgPDwgIlByb2Nlc3Npbmc6ICIgPDwgQ29tbWFuZC5maXJzdCA8PCAiLlxuIjsKICAgICB9KTsKLSAgICBUb29sSW52b2NhdGlvbiBJbnZvY2F0aW9uKENvbW1hbmRMaW5lLCBBY3Rpb24sIEZpbGVzLmdldFB0cigpKTsKKyAgICBUb29sSW52b2NhdGlvbiBJbnZvY2F0aW9uKHN0ZDo6bW92ZShDb21tYW5kTGluZSksIEFjdGlvbiwgRmlsZXMuZ2V0UHRyKCkpOwogICAgIEludm9jYXRpb24uc2V0RGlhZ25vc3RpY0NvbnN1bWVyKERpYWdDb25zdW1lcik7Ci0gICAgZm9yIChpbnQgSSA9IDAsIEUgPSBNYXBwZWRGaWxlQ29udGVudHMuc2l6ZSgpOyBJICE9IEU7ICsrSSkgewotICAgICAgSW52b2NhdGlvbi5tYXBWaXJ0dWFsRmlsZShNYXBwZWRGaWxlQ29udGVudHNbSV0uZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBlZEZpbGVDb250ZW50c1tJXS5zZWNvbmQpOworICAgIGZvciAoY29uc3QgYXV0byAmTWFwcGVkRmlsZSA6IE1hcHBlZEZpbGVDb250ZW50cykgeworICAgICAgSW52b2NhdGlvbi5tYXBWaXJ0dWFsRmlsZShNYXBwZWRGaWxlLmZpcnN0LCBNYXBwZWRGaWxlLnNlY29uZCk7CiAgICAgfQogICAgIGlmICghSW52b2NhdGlvbi5ydW4oKSkgewogICAgICAgLy8gRklYTUU6IERpYWdub3N0aWNzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0gICAgICBsbHZtOjplcnJzKCkgPDwgIkVycm9yIHdoaWxlIHByb2Nlc3NpbmcgIiA8PCBGaWxlIDw8ICIuXG4iOworICAgICAgbGx2bTo6ZXJycygpIDw8ICJFcnJvciB3aGlsZSBwcm9jZXNzaW5nICIgPDwgQ29tbWFuZC5maXJzdCA8PCAiLlxuIjsKICAgICAgIFByb2Nlc3NpbmdGYWlsZWQgPSB0cnVlOwogICAgIH0KICAgfQpAQCAtMzc4LDcgKzM3NSw3IEBACiAgIEFTVEJ1aWxkZXJBY3Rpb24oc3RkOjp2ZWN0b3I8QVNUVW5pdCAqPiAmQVNUcykgOiBBU1RzKEFTVHMpIHt9CiAKICAgYm9vbCBydW5JbnZvY2F0aW9uKENvbXBpbGVySW52b2NhdGlvbiAqSW52b2NhdGlvbiwgRmlsZU1hbmFnZXIgKkZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY0NvbnN1bWVyICpEaWFnQ29uc3VtZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNDb25zdW1lciAqRGlhZ0NvbnN1bWVyKSBvdmVycmlkZSB7CiAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHVzZSB0aGUgcHJvdmlkZWQgRmlsZU1hbmFnZXIuCiAgICAgQVNUVW5pdCAqQVNUID0gQVNUVW5pdDo6TG9hZEZyb21Db21waWxlckludm9jYXRpb24oCiAgICAgICAgIEludm9jYXRpb24sIENvbXBpbGVySW5zdGFuY2U6OmNyZWF0ZURpYWdub3N0aWNzKApkaWZmIC0tZ2l0IGEvbGliL2luY2x1ZGUgYi9saWIvaW5jbHVkZQpkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNzRlYTg2MS4uMDAwMDAwMAotLS0gYS9saWIvaW5jbHVkZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUhlYWRlcnMvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGF0Y2hlcy8wMDAxLUFkZC1tb2R1bGUtbm90aWNlLnBhdGNoIGIvcGF0Y2hlcy8wMDAxLUFkZC1tb2R1bGUtbm90aWNlLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjQ3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYXRjaGVzLzAwMDEtQWRkLW1vZHVsZS1ub3RpY2UucGF0Y2gKQEAgLTAsMCArMSwxNyBAQAorRnJvbSA2YjczM2NmM2Y2YjkyM2RiMzMyYjg5NmM3OWI3YmE5NjFjMmRiZjcwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogVGltIE11cnJheSA8dGltbXVycmF5QGdvb2dsZS5jb20+CitEYXRlOiBUaHUsIDMgQXByIDIwMTQgMTA6NTI6NDYgLTA3MDAKK1N1YmplY3Q6IFtQQVRDSCAxLzRdIEFkZCBtb2R1bGUgbm90aWNlLgorCitDaGFuZ2UtSWQ6IElmY2Q4MjVkOGNjZDNmNWRhMjI1OTEwNzVhYTE1ZTY3MTBlNjFhOTMzCistLS0KKyBNT0RVTEVfTElDRU5TRV9CU0RfTElLRSB8IDAKKyAxIGZpbGUgY2hhbmdlZCwgMCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBNT0RVTEVfTElDRU5TRV9CU0RfTElLRQorCitkaWZmIC0tZ2l0IGEvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UgYi9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmU2OWRlMjkKKy0tIAorMS45LjEuNDIzLmc0NTk2ZTNhCisKZGlmZiAtLWdpdCBhL3BhdGNoZXMvMDAwMi1SZXZlcnQtdG8tb2xkLXZlY3Rvci1wYXNzaW5nLUFCSS1mb3ItYmFja3dhcmRzLWNvbXBhLnBhdGNoIGIvcGF0Y2hlcy8wMDAyLVJldmVydC10by1vbGQtdmVjdG9yLXBhc3NpbmctQUJJLWZvci1iYWNrd2FyZHMtY29tcGEucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhMTMxMgotLS0gL2Rldi9udWxsCisrKyBiL3BhdGNoZXMvMDAwMi1SZXZlcnQtdG8tb2xkLXZlY3Rvci1wYXNzaW5nLUFCSS1mb3ItYmFja3dhcmRzLWNvbXBhLnBhdGNoCkBAIC0wLDAgKzEsMzggQEAKK0Zyb20gMTBhNGZjNmM1NmE0Y2EyNmIyMjViZjkxMjk0OGY5NmU5ZjU1YzgxYSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IFRpbSBNdXJyYXkgPHRpbW11cnJheUBnb29nbGUuY29tPgorRGF0ZTogVGh1LCAzIEFwciAyMDE0IDEzOjI3OjE2IC0wNzAwCitTdWJqZWN0OiBbUEFUQ0ggMi80XSBSZXZlcnQgdG8gb2xkIHZlY3RvciBwYXNzaW5nIEFCSSBmb3IgYmFja3dhcmRzCisgY29tcGF0aWJpbGl0eS4KKworQ2hhbmdlLUlkOiBJNmQwZTZkYjQ1NGRlNzA5MGVmNDkwMDFlOTMxOGVhZTVhMTExMmUwOQorLS0tCisgbGliL0NvZGVHZW4vVGFyZ2V0SW5mby5jcHAgfCA2ICsrKy0tLQorIDEgZmlsZSBjaGFuZ2VkLCAzIGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9saWIvQ29kZUdlbi9UYXJnZXRJbmZvLmNwcCBiL2xpYi9Db2RlR2VuL1RhcmdldEluZm8uY3BwCitpbmRleCBkMmU1N2FjLi5kM2FiNDNhIDEwMDY0NAorLS0tIGEvbGliL0NvZGVHZW4vVGFyZ2V0SW5mby5jcHAKKysrKyBiL2xpYi9Db2RlR2VuL1RhcmdldEluZm8uY3BwCitAQCAtNDQwMyw3ICs0NDAzLDcgQEAgYm9vbCBBUk1BQklJbmZvOjppc0lsbGVnYWxWZWN0b3JUeXBlKFF1YWxUeXBlIFR5KSBjb25zdCB7CisgICAgIHVuc2lnbmVkIE51bUVsZW1lbnRzID0gVlQtPmdldE51bUVsZW1lbnRzKCk7CisgICAgIHVpbnQ2NF90IFNpemUgPSBnZXRDb250ZXh0KCkuZ2V0VHlwZVNpemUoVlQpOworICAgICAvLyBOdW1FbGVtZW50cyBzaG91bGQgYmUgcG93ZXIgb2YgMi4KKy0gICAgaWYgKChOdW1FbGVtZW50cyAmIChOdW1FbGVtZW50cyAtIDEpKSAhPSAwKQorKyAgICBpZiAoKChOdW1FbGVtZW50cyAmIChOdW1FbGVtZW50cyAtIDEpKSAhPSAwKSAmJiBOdW1FbGVtZW50cyAhPSAzKQorICAgICAgIHJldHVybiB0cnVlOworICAgICAvLyBTaXplIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMzIgYml0cy4KKyAgICAgcmV0dXJuIFNpemUgPD0gMzI7CitAQCAtNDQzNyw4ICs0NDM3LDggQEAgbGx2bTo6VmFsdWUgKkFSTUFCSUluZm86OkVtaXRWQUFyZyhsbHZtOjpWYWx1ZSAqVkFMaXN0QWRkciwgUXVhbFR5cGUgVHksCisgICAgIFR5QWxpZ24gPSBzdGQ6Om1pbihzdGQ6Om1heChUeUFsaWduLCAodWludDY0X3QpNCksICh1aW50NjRfdCk4KTsKKyAgIGVsc2UKKyAgICAgVHlBbGlnbiA9IDQ7CistICAvLyBVc2UgaW5kaXJlY3QgaWYgc2l6ZSBvZiB0aGUgaWxsZWdhbCB2ZWN0b3IgaXMgYmlnZ2VyIHRoYW4gMTYgYnl0ZXMuCistICBpZiAoaXNJbGxlZ2FsVmVjdG9yVHlwZShUeSkgJiYgU2l6ZSA+IDE2KSB7CisrICAvLyBVc2UgaW5kaXJlY3QgaWYgc2l6ZSBvZiB0aGUgaWxsZWdhbCB2ZWN0b3IgaXMgYmlnZ2VyIHRoYW4gMzIgYnl0ZXMuCisrICBpZiAoaXNJbGxlZ2FsVmVjdG9yVHlwZShUeSkgJiYgU2l6ZSA+IDMyKSB7CisgICAgIElzSW5kaXJlY3QgPSB0cnVlOworICAgICBTaXplID0gNDsKKyAgICAgVHlBbGlnbiA9IDQ7CistLSAKKzEuOS4xLjQyMy5nNDU5NmUzYQorCmRpZmYgLS1naXQgYS9wYXRjaGVzLzAwMDMtQWRkLXN1cHBvcnQtZm9yLVJlbmRlclNjcmlwdC1zcGVjaWZpYy1vcHRpb25zLnBhdGNoIGIvcGF0Y2hlcy8wMDAzLUFkZC1zdXBwb3J0LWZvci1SZW5kZXJTY3JpcHQtc3BlY2lmaWMtb3B0aW9ucy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTYwYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGF0Y2hlcy8wMDAzLUFkZC1zdXBwb3J0LWZvci1SZW5kZXJTY3JpcHQtc3BlY2lmaWMtb3B0aW9ucy5wYXRjaApAQCAtMCwwICsxLDE0NyBAQAorRnJvbSA0YWQzMDgxOWViMzBkN2M3MjMzNmNjNjFjYWJkODViNDJhMzUwYWFjIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogVGltIE11cnJheSA8dGltbXVycmF5QGdvb2dsZS5jb20+CitEYXRlOiBUaHUsIDMgQXByIDIwMTQgMTM6Mzg6MTUgLTA3MDAKK1N1YmplY3Q6IFtQQVRDSCAzLzRdIEFkZCBzdXBwb3J0IGZvciBSZW5kZXJTY3JpcHQgc3BlY2lmaWMgb3B0aW9ucy4KKworVGhlc2UgaW5jbHVkZSBfX2F0dHJpYnV0ZSgoa2VybmVsKSksIDY0LWJpdCBsb25ncywgYW5kIFJHQkEgdmVjdG9yIHN5bnRheC4KKworQ2hhbmdlLUlkOiBJNTkyZTVlYTJhYmM4NjI2OWE5NDFlMDQ5N2FjMTE2NjVmYjU2MmFhMAorLS0tCisgaW5jbHVkZS9jbGFuZy9BU1QvVHlwZS5oICAgICAgICAgICAgfCAgOCArKysrLS0tLQorIGluY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ci50ZCAgICAgICAgIHwgIDUgKysrKysKKyBpbmNsdWRlL2NsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmRlZiB8ICAxICsKKyBsaWIvQmFzaWMvVGFyZ2V0cy5jcHAgICAgICAgICAgICAgICB8ICAyICsrCisgbGliL1NlbWEvU2VtYURlY2xBdHRyLmNwcCAgICAgICAgICAgfCAxMyArKysrKysrKysrKysrCisgbGliL1NlbWEvU2VtYUV4cHJNZW1iZXIuY3BwICAgICAgICAgfCAxNyArKysrKysrKysrKysrKysrKworIDYgZmlsZXMgY2hhbmdlZCwgNDIgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGUuaCBiL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGUuaAoraW5kZXggMDAxYTg3ZS4uN2JlNmZjZCAxMDA2NDQKKy0tLSBhL2luY2x1ZGUvY2xhbmcvQVNUL1R5cGUuaAorKysrIGIvaW5jbHVkZS9jbGFuZy9BU1QvVHlwZS5oCitAQCAtMjU5MywxMCArMjU5MywxMCBAQCBwdWJsaWM6CisgICBzdGF0aWMgaW50IGdldFBvaW50QWNjZXNzb3JJZHgoY2hhciBjKSB7CisgICAgIHN3aXRjaCAoYykgeworICAgICBkZWZhdWx0OiByZXR1cm4gLTE7CistICAgIGNhc2UgJ3gnOiByZXR1cm4gMDsKKy0gICAgY2FzZSAneSc6IHJldHVybiAxOworLSAgICBjYXNlICd6JzogcmV0dXJuIDI7CistICAgIGNhc2UgJ3cnOiByZXR1cm4gMzsKKysgICAgY2FzZSAneCc6IGNhc2UgJ3InOiByZXR1cm4gMDsKKysgICAgY2FzZSAneSc6IGNhc2UgJ2cnOiByZXR1cm4gMTsKKysgICAgY2FzZSAneic6IGNhc2UgJ2InOiByZXR1cm4gMjsKKysgICAgY2FzZSAndyc6IGNhc2UgJ2EnOiByZXR1cm4gMzsKKyAgICAgfQorICAgfQorICAgc3RhdGljIGludCBnZXROdW1lcmljQWNjZXNzb3JJZHgoY2hhciBjKSB7CitkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyLnRkIGIvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyLnRkCitpbmRleCAxMmE4NTE3Li43MzYwNjgzIDEwMDY0NAorLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyLnRkCisrKysgYi9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQKK0BAIC02MTIsNiArNjEyLDExIEBAIGRlZiBPcGVuQ0xDb25zdGFudEFkZHJlc3NTcGFjZSA6IFR5cGVBdHRyIHsKKyAgIGxldCBEb2N1bWVudGF0aW9uID0gW1VuZG9jdW1lbnRlZF07CisgfQorIAorK2RlZiBLZXJuZWwgOiBBdHRyIHsKKysgIGxldCBTcGVsbGluZ3MgPSBbR05VPCJrZXJuZWwiPl07CisrICBsZXQgRG9jdW1lbnRhdGlvbiA9IFtVbmRvY3VtZW50ZWRdOworK30KKysKKyBkZWYgRGVwcmVjYXRlZCA6IEluaGVyaXRhYmxlQXR0ciB7CisgICBsZXQgU3BlbGxpbmdzID0gW0dDQzwiZGVwcmVjYXRlZCI+LCBEZWNsc3BlYzwiZGVwcmVjYXRlZCI+LAorICAgICAgICAgICAgICAgICAgICBDWFgxMTwiIiwiZGVwcmVjYXRlZCI+XTsKK2RpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmRlZiBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuZGVmCitpbmRleCAyMjY2MmUwLi43YjIxNDgyIDEwMDY0NAorLS0tIGEvaW5jbHVkZS9jbGFuZy9CYXNpYy9MYW5nT3B0aW9ucy5kZWYKKysrKyBiL2luY2x1ZGUvY2xhbmcvQmFzaWMvTGFuZ09wdGlvbnMuZGVmCitAQCAtMTIzLDYgKzEyMyw3IEBAIExBTkdPUFQoT3BlbkNMVmVyc2lvbiAgICAgLCAzMiwgMCwgIk9wZW5DTCB2ZXJzaW9uIikKKyBMQU5HT1BUKE5hdGl2ZUhhbGZUeXBlICAgICwgMSwgMCwgIk5hdGl2ZSBoYWxmIHR5cGUgc3VwcG9ydCIpCisgTEFOR09QVChDVURBICAgICAgICAgICAgICAsIDEsIDAsICJDVURBIikKKyBMQU5HT1BUKE9wZW5NUCAgICAgICAgICAgICwgMSwgMCwgIk9wZW5NUCBzdXBwb3J0IikKKytMQU5HT1BUKFJlbmRlcnNjcmlwdCAgICAgICwgMSwgMCwgIlJlbmRlclNjcmlwdCIpCisgCisgTEFOR09QVChBc3N1bWVTYW5lT3BlcmF0b3JOZXcgLCAxLCAxLCAiaW1wbGljaXQgX19hdHRyaWJ1dGVfXygobWFsbG9jKSkgZm9yIEMrKydzIG5ldyBvcGVyYXRvcnMiKQorIExBTkdPUFQoU2l6ZWREZWFsbG9jYXRpb24gLCAxLCAwLCAiZW5hYmxlIHNpemVkIGRlYWxsb2NhdGlvbiBmdW5jdGlvbnMiKQorZGlmZiAtLWdpdCBhL2xpYi9CYXNpYy9UYXJnZXRzLmNwcCBiL2xpYi9CYXNpYy9UYXJnZXRzLmNwcAoraW5kZXggM2QyOTRjZS4uZmQ1OWMwMCAxMDA2NDQKKy0tLSBhL2xpYi9CYXNpYy9UYXJnZXRzLmNwcAorKysrIGIvbGliL0Jhc2ljL1RhcmdldHMuY3BwCitAQCAtMzk4NCw2ICszOTg0LDggQEAgcHVibGljOgorICAgICAgICAgRlBVIHw9IEZQQVJNVjg7CisgICAgICAgZWxzZSBpZiAoRmVhdHVyZXNbaV0gPT0gIituZW9uIikKKyAgICAgICAgIEZQVSB8PSBOZW9uRlBVOworKyAgICAgIGVsc2UgaWYgKEZlYXR1cmVzW2ldID09ICIrbG9uZzY0IikKKysgICAgICAgIExvbmdXaWR0aCA9IExvbmdBbGlnbiA9IDY0OyAgLy8gUmVuZGVyU2NyaXB0IHVzZXMgYSA2NC1iaXQgbG9uZyB0eXBlCisgICAgICAgZWxzZSBpZiAoRmVhdHVyZXNbaV0gPT0gIitod2RpdiIpCisgICAgICAgICBIV0RpdiB8PSBIV0RpdlRodW1iOworICAgICAgIGVsc2UgaWYgKEZlYXR1cmVzW2ldID09ICIraHdkaXYtYXJtIikKK2RpZmYgLS1naXQgYS9saWIvU2VtYS9TZW1hRGVjbEF0dHIuY3BwIGIvbGliL1NlbWEvU2VtYURlY2xBdHRyLmNwcAoraW5kZXggNWY2MDc4My4uMzhiM2M0NSAxMDA2NDQKKy0tLSBhL2xpYi9TZW1hL1NlbWFEZWNsQXR0ci5jcHAKKysrKyBiL2xpYi9TZW1hL1NlbWFEZWNsQXR0ci5jcHAKK0BAIC0xMzk2LDYgKzEzOTYsMTYgQEAgc3RhdGljIHZvaWQgaGFuZGxlVExTTW9kZWxBdHRyKFNlbWEgJlMsIERlY2wgKkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCkpKTsKKyB9CisgCisrc3RhdGljIHZvaWQgaGFuZGxlS2VybmVsQXR0cihTZW1hICZTLCBEZWNsICpELCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7CisrICBpZiAoUy5MYW5nT3B0cy5SZW5kZXJzY3JpcHQpIHsKKysgICAgRC0+YWRkQXR0cig6Om5ldyAoUy5Db250ZXh0KSAKKysgICAgICAgICAgICAgICBLZXJuZWxBdHRyKEF0dHIuZ2V0UmFuZ2UoKSwgUy5Db250ZXh0LAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ci5nZXRBdHRyaWJ1dGVTcGVsbGluZ0xpc3RJbmRleCgpKSk7CisrICB9IGVsc2UgeworKyAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCkgPDwgImtlcm5lbCI7CisrICB9CisrfQorKworIHN0YXRpYyB2b2lkIGhhbmRsZU1hbGxvY0F0dHIoU2VtYSAmUywgRGVjbCAqRCwgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikgeworICAgaWYgKGNvbnN0IEZ1bmN0aW9uRGVjbCAqRkQgPSBkeW5fY2FzdDxGdW5jdGlvbkRlY2w+KEQpKSB7CisgICAgIFF1YWxUeXBlIFJldFR5ID0gRkQtPmdldFJldHVyblR5cGUoKTsKK0BAIC00MTMwLDYgKzQxNDAsOSBAQCBzdGF0aWMgdm9pZCBQcm9jZXNzRGVjbEF0dHJpYnV0ZShTZW1hICZTLCBTY29wZSAqc2NvcGUsIERlY2wgKkQsCisgICBjYXNlIEF0dHJpYnV0ZUxpc3Q6OkFUX0NVREFMYXVuY2hCb3VuZHM6CisgICAgIGhhbmRsZUxhdW5jaEJvdW5kc0F0dHIoUywgRCwgQXR0cik7CisgICAgIGJyZWFrOworKyAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9LZXJuZWw6CisrICAgIGhhbmRsZUtlcm5lbEF0dHIoUywgRCwgQXR0cik7CisrICAgIGJyZWFrOworICAgY2FzZSBBdHRyaWJ1dGVMaXN0OjpBVF9NYWxsb2M6CisgICAgIGhhbmRsZU1hbGxvY0F0dHIoUywgRCwgQXR0cik7CisgICAgIGJyZWFrOworZGlmZiAtLWdpdCBhL2xpYi9TZW1hL1NlbWFFeHByTWVtYmVyLmNwcCBiL2xpYi9TZW1hL1NlbWFFeHByTWVtYmVyLmNwcAoraW5kZXggMzU0ZGZjZi4uYzRhMTc4MCAxMDA2NDQKKy0tLSBhL2xpYi9TZW1hL1NlbWFFeHByTWVtYmVyLmNwcAorKysrIGIvbGliL1NlbWEvU2VtYUV4cHJNZW1iZXIuY3BwCitAQCAtMjY3LDYgKzI2NywyMCBAQCBTZW1hOjpCdWlsZFBvc3NpYmxlSW1wbGljaXRNZW1iZXJFeHByKGNvbnN0IENYWFNjb3BlU3BlYyAmU1MsCisgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmV4cGVjdGVkIGluc3RhbmNlIG1lbWJlciBhY2Nlc3Mga2luZCIpOworIH0KKyAKKysvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgaW5wdXQgY2hhciBpcyBmcm9tIHJnYmEgY29tcG9uZW50IHNldC4KKytzdGF0aWMgYm9vbAorK0lzUkdCQShjaGFyIGMpIHsKKysgIHN3aXRjaCAoYykgeworKyAgY2FzZSAncic6CisrICBjYXNlICdnJzoKKysgIGNhc2UgJ2InOgorKyAgY2FzZSAnYSc6CisrICAgIHJldHVybiB0cnVlOworKyAgZGVmYXVsdDoKKysgICAgcmV0dXJuIGZhbHNlOworKyAgfQorK30KKysKKyAvLy8gQ2hlY2sgYW4gZXh0LXZlY3RvciBjb21wb25lbnQgYWNjZXNzIGV4cHJlc3Npb24uCisgLy8vCisgLy8vIFZLIHNob3VsZCBiZSBzZXQgaW4gYWR2YW5jZSB0byB0aGUgdmFsdWUga2luZCBvZiB0aGUgYmFzZQorQEAgLTMwNiw3ICszMjAsMTAgQEAgQ2hlY2tFeHRWZWN0b3JDb21wb25lbnQoU2VtYSAmUywgUXVhbFR5cGUgYmFzZVR5cGUsIEV4cHJWYWx1ZUtpbmQgJlZLLAorICAgICBIYWx2aW5nU3dpenpsZSA9IHRydWU7CisgICB9IGVsc2UgaWYgKCFIZXhTd2l6emxlICYmCisgICAgICAgICAgICAgIChJZHggPSB2ZWNUeXBlLT5nZXRQb2ludEFjY2Vzc29ySWR4KCpjb21wU3RyKSkgIT0gLTEpIHsKKysgICAgYm9vbCBIYXNSR0JBID0gSXNSR0JBKCpjb21wU3RyKTsKKyAgICAgZG8geworKyAgICAgIGlmIChIYXNSR0JBICE9IElzUkdCQSgqY29tcFN0cikpCisrICAgICAgICBicmVhazsKKyAgICAgICBpZiAoSGFzSW5kZXhbSWR4XSkgSGFzUmVwZWF0ZWQgPSB0cnVlOworICAgICAgIEhhc0luZGV4W0lkeF0gPSB0cnVlOworICAgICAgIGNvbXBTdHIrKzsKKy0tIAorMS45LjEuNDIzLmc0NTk2ZTNhCisKZGlmZiAtLWdpdCBhL3BhdGNoZXMvMDAwNC1BZGQtQW5kcm9pZC1idWlsZC1zeXN0ZW0ucGF0Y2ggYi9wYXRjaGVzLzAwMDQtQWRkLUFuZHJvaWQtYnVpbGQtc3lzdGVtLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyN2E4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYXRjaGVzLzAwMDQtQWRkLUFuZHJvaWQtYnVpbGQtc3lzdGVtLnBhdGNoCkBAIC0wLDAgKzEsMTg2NiBAQAorRnJvbSBiZTkxMzc4ZGIwODQwZDI2YWUyMGJkNGQxM2EyYWE5NmQzZDAyMjQ5IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQorRnJvbTogVGltIE11cnJheSA8dGltbXVycmF5QGdvb2dsZS5jb20+CitEYXRlOiBUaHUsIDMgQXByIDIwMTQgMTQ6Mjk6MTUgLTA3MDAKK1N1YmplY3Q6IFtQQVRDSCA0LzRdIEFkZCBBbmRyb2lkIGJ1aWxkIHN5c3RlbS4KKworQ2hhbmdlLUlkOiBJOTczODU4MmVhNmJjZWRlOTlhNDJmZDM5MjZiYTIyZTgxZDVmZmYwMgorLS0tCisgQW5kcm9pZC5tayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMzQgKysrKysKKyBjbGFuZy1ob3N0LWJ1aWxkLm1rICAgICAgICAgICAgICAgICAgICB8ICAzOCArKysrKysKKyBjbGFuZy10YmxnZW4tcnVsZXMubWsgICAgICAgICAgICAgICAgICB8IDIzNyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyBjbGFuZy12ZXJzaW9uLWluYy5tayAgICAgICAgICAgICAgICAgICB8ICAzNiArKysrKworIGNsYW5nLm1rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3ICsKKyBob3N0X3NoYXJlZF9jbGFuZy5tayAgICAgICAgICAgICAgICAgICB8ICA0MSArKysrKysKKyBpbmNsdWRlL2NsYW5nL0NvbmZpZy9jb25maWcuaCAgICAgICAgICB8ICAyNSArKysrCisgbGliL0FSQ01pZ3JhdGUvQW5kcm9pZC5tayAgICAgICAgICAgICAgfCAgNTEgKysrKysrKworIGxpYi9BU1QvQW5kcm9pZC5tayAgICAgICAgICAgICAgICAgICAgIHwgIDk0ICsrKysrKysrKysrKysKKyBsaWIvQW5hbHlzaXMvQW5kcm9pZC5tayAgICAgICAgICAgICAgICB8ICA1MSArKysrKysrCisgbGliL0Jhc2ljL0FuZHJvaWQubWsgICAgICAgICAgICAgICAgICAgfCAgNTcgKysrKysrKysKKyBsaWIvQ29kZUdlbi9BbmRyb2lkLm1rICAgICAgICAgICAgICAgICB8ICA3NSArKysrKysrKysrKworIGxpYi9Ecml2ZXIvQW5kcm9pZC5tayAgICAgICAgICAgICAgICAgIHwgIDQ0ICsrKysrKworIGxpYi9FZGl0L0FuZHJvaWQubWsgICAgICAgICAgICAgICAgICAgIHwgIDMyICsrKysrCisgbGliL0Zvcm1hdC9BbmRyb2lkLm1rICAgICAgICAgICAgICAgICAgfCAgNDMgKysrKysrCisgbGliL0Zyb250ZW5kL0FuZHJvaWQubWsgICAgICAgICAgICAgICAgfCAgNjYgKysrKysrKysrCisgbGliL0Zyb250ZW5kVG9vbC9BbmRyb2lkLm1rICAgICAgICAgICAgfCAgMjQgKysrKworIGxpYi9IZWFkZXJzL0FuZHJvaWQubWsgICAgICAgICAgICAgICAgIHwgIDExICsrCisgbGliL0xleC9BbmRyb2lkLm1rICAgICAgICAgICAgICAgICAgICAgfCAgNDUgKysrKysrKworIGxpYi9QYXJzZS9BbmRyb2lkLm1rICAgICAgICAgICAgICAgICAgIHwgIDQ3ICsrKysrKysKKyBsaWIvUmV3cml0ZS9Db3JlL0FuZHJvaWQubWsgICAgICAgICAgICB8ICAzNCArKysrKworIGxpYi9SZXdyaXRlL0Zyb250ZW5kL0FuZHJvaWQubWsgICAgICAgIHwgIDM4ICsrKysrKworIGxpYi9TZW1hL0FuZHJvaWQubWsgICAgICAgICAgICAgICAgICAgIHwgIDg0ICsrKysrKysrKysrKworIGxpYi9TZXJpYWxpemF0aW9uL0FuZHJvaWQubWsgICAgICAgICAgIHwgIDQ2ICsrKysrKysKKyBsaWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQW5kcm9pZC5tayB8IDEwMCArKysrKysrKysrKysrKworIGxpYi9TdGF0aWNBbmFseXplci9Db3JlL0FuZHJvaWQubWsgICAgIHwgIDY4ICsrKysrKysrKysKKyBsaWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5kcm9pZC5tayB8ICA0MCArKysrKysKKyB0b29scy9kcml2ZXIvQW5kcm9pZC5tayAgICAgICAgICAgICAgICB8IDExOSArKysrKysrKysrKysrKysrKworIHV0aWxzL1RhYmxlR2VuL0FuZHJvaWQubWsgICAgICAgICAgICAgIHwgIDM1ICsrKysrCisgMjkgZmlsZXMgY2hhbmdlZCwgMTYyMiBpbnNlcnRpb25zKCspCisgY3JlYXRlIG1vZGUgMTAwNjQ0IEFuZHJvaWQubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgY2xhbmctaG9zdC1idWlsZC5taworIGNyZWF0ZSBtb2RlIDEwMDY0NCBjbGFuZy10YmxnZW4tcnVsZXMubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgY2xhbmctdmVyc2lvbi1pbmMubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgY2xhbmcubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgaG9zdF9zaGFyZWRfY2xhbmcubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9jbGFuZy9Db25maWcvY29uZmlnLmgKKyBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL0FSQ01pZ3JhdGUvQW5kcm9pZC5taworIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvQVNUL0FuZHJvaWQubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL0FuYWx5c2lzL0FuZHJvaWQubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL0Jhc2ljL0FuZHJvaWQubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL0NvZGVHZW4vQW5kcm9pZC5taworIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvRHJpdmVyL0FuZHJvaWQubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL0VkaXQvQW5kcm9pZC5taworIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvRm9ybWF0L0FuZHJvaWQubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL0Zyb250ZW5kL0FuZHJvaWQubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL0Zyb250ZW5kVG9vbC9BbmRyb2lkLm1rCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9IZWFkZXJzL0FuZHJvaWQubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL0xleC9BbmRyb2lkLm1rCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9QYXJzZS9BbmRyb2lkLm1rCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9SZXdyaXRlL0NvcmUvQW5kcm9pZC5taworIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvUmV3cml0ZS9Gcm9udGVuZC9BbmRyb2lkLm1rCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9TZW1hL0FuZHJvaWQubWsKKyBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL1NlcmlhbGl6YXRpb24vQW5kcm9pZC5taworIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQW5kcm9pZC5taworIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9BbmRyb2lkLm1rCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9BbmRyb2lkLm1rCisgY3JlYXRlIG1vZGUgMTAwNjQ0IHRvb2xzL2RyaXZlci9BbmRyb2lkLm1rCisgY3JlYXRlIG1vZGUgMTAwNjQ0IHV0aWxzL1RhYmxlR2VuL0FuZHJvaWQubWsKKworZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNWY2MmRhMworLS0tIC9kZXYvbnVsbAorKysrIGIvQW5kcm9pZC5taworQEAgLTAsMCArMSwzNCBAQAorK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKytDTEFOR19ST09UX1BBVEggOj0gJChMT0NBTF9QQVRIKQorKworK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorKworK3N1YmRpcnMgOj0gJChhZGRwcmVmaXggJChMT0NBTF9QQVRIKS8sJChhZGRzdWZmaXggL0FuZHJvaWQubWssIFwKKysgIGxpYi9BbmFseXNpcyBcCisrICBsaWIvQVNUIFwKKysgIGxpYi9BUkNNaWdyYXRlIFwKKysgIGxpYi9CYXNpYyBcCisrICBsaWIvQ29kZUdlbiBcCisrICBsaWIvRHJpdmVyIFwKKysgIGxpYi9FZGl0IFwKKysgIGxpYi9Gb3JtYXQgXAorKyAgbGliL0Zyb250ZW5kIFwKKysgIGxpYi9Gcm9udGVuZFRvb2wgXAorKyAgbGliL0hlYWRlcnMgXAorKyAgbGliL0xleCBcCisrICBsaWIvUGFyc2UgXAorKyAgbGliL1Jld3JpdGUvQ29yZSBcCisrICBsaWIvUmV3cml0ZS9Gcm9udGVuZCBcCisrICBsaWIvU2VtYSBcCisrICBsaWIvU2VyaWFsaXphdGlvbiBcCisrICBsaWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMgXAorKyAgbGliL1N0YXRpY0FuYWx5emVyL0NvcmUgXAorKyAgbGliL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kIFwKKysgIHRvb2xzL2RyaXZlciBcCisrICB1dGlscy9UYWJsZUdlbiBcCisrICApKQorKworK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9jbGFuZy5taworK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9ob3N0X3NoYXJlZF9jbGFuZy5taworKworK2luY2x1ZGUgJChzdWJkaXJzKQorZGlmZiAtLWdpdCBhL2NsYW5nLWhvc3QtYnVpbGQubWsgYi9jbGFuZy1ob3N0LWJ1aWxkLm1rCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uZTBiYTJlNgorLS0tIC9kZXYvbnVsbAorKysrIGIvY2xhbmctaG9zdC1idWlsZC5taworQEAgLTAsMCArMSwzOCBAQAorK0xPQ0FMX0NGTEFHUyA6PQlcCisrCS1wZWRhbnRpYwlcCisrCS1XY2FzdC1xdWFsCVwKKysJLVduby1sb25nLWxvbmcJXAorKwkkKExPQ0FMX0NGTEFHUykKKysKKytMT0NBTF9DUFBGTEFHUyA6PSBcCisrCS1Xbm8tc2lnbi1wcm9tbyBcCisrCSQoTE9DQUxfQ1BQRkxBR1MpCisrCisrIyBNYWtlIHN1cmUgYmlvbmljIGlzIGZpcnN0IHNvIHdlIGNhbiBpbmNsdWRlIHN5c3RlbSBoZWFkZXJzLgorK0xPQ0FMX0NfSU5DTFVERVMgOj0JXAorKwkkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZQlcCisrICAgICAgICAkKENMQU5HX1JPT1RfUEFUSCkvbGliL0NvZGVHZW4gICAgXAorKwkkKExPQ0FMX0NfSU5DTFVERVMpCisrCisrTExWTV9ST09UX1BBVEggOj0gZXh0ZXJuYWwvbGx2bQorK2luY2x1ZGUgJChMTFZNX1JPT1RfUEFUSCkvbGx2bS5taworKworK2lmbmVxICgkKExMVk1fSE9TVF9CVUlMRF9NSyksKQorK2luY2x1ZGUgJChMTFZNX0hPU1RfQlVJTERfTUspCisrZW5kaWYKKysKKysjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworKyMjIENvbW1hbmRzIGZvciBydW5uaW5nIHRibGdlbiB0byBjb21waWxlIGEgdGQgZmlsZQorKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisrZGVmaW5lIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dAorK0Bta2RpciAtcCAkKGRpciAkQCkKKytAZWNobyAiSG9zdCBDbGFuZyBUYWJsZUdlbjogJChUQkxHRU5fTE9DQUxfTU9EVUxFKSAoZ2VuLSQoMSkpIDw9ICQ8IgorKyQoaGlkZSkgJChDTEFOR19UQkxHRU4pIFwKKysJLUkgJChkaXIgJDwpCVwKKysJLUkgJChMTFZNX1JPT1RfUEFUSCkvaW5jbHVkZQlcCisrCS1JICQoTExWTV9ST09UX1BBVEgpL2hvc3QvaW5jbHVkZQlcCisrCS1JICQoTExWTV9ST09UX1BBVEgpL2xpYi9UYXJnZXQJXAorKwkkKGlmICQoc3RyaXAgJChDTEFOR19ST09UX1BBVEgpKSwtSSAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZSwpCVwKKysJLWdlbi0kKHN0cmlwICQoMSkpCVwKKysJLW8gJEAgJDwKKytlbmRlZgorZGlmZiAtLWdpdCBhL2NsYW5nLXRibGdlbi1ydWxlcy5tayBiL2NsYW5nLXRibGdlbi1ydWxlcy5taworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmEyYWU0MDUKKy0tLSAvZGV2L251bGwKKysrKyBiL2NsYW5nLXRibGdlbi1ydWxlcy5taworQEAgLTAsMCArMSwyMzcgQEAKKysjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzQjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKysjIyBUYWJsZUdlbjogQ29tcGlsZSAudGQgZmlsZXMgdG8gLmluYy4KKysjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworK2lmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSwpCisrICAgIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBTVEFUSUNfTElCUkFSSUVTCisrZW5kaWYKKysKKytpZm5lcSAoJChzdHJpcCAkKFRCTEdFTl9UQUJMRVMpKSwpCisrCisraW50ZXJtZWRpYXRlcyA6PSAkKGNhbGwgbG9jYWwtaW50ZXJtZWRpYXRlcy1kaXIpCisrCisraWZuZXEgKCQoZmluZHN0cmluZyBBdHRyRHVtcC5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQorK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvQXR0ckR1bXAuaW5jCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyRHVtcC5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyRHVtcC5pbmM6ICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQgfCAkKENMQU5HX1RCTEdFTikKKysJJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxjbGFuZy1hdHRyLWR1bXApCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIEF0dHJJbXBsLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9BdHRySW1wbC5pbmMKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0F0dHJJbXBsLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0F0dHJJbXBsLmluYzogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ci50ZCB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWF0dHItaW1wbCkKKytlbmRpZgorKworK2lmbmVxICgkKGZpbmRzdHJpbmcgQXR0ckhhc0F0dHJpYnV0ZUltcGwuaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKKytMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ckhhc0F0dHJpYnV0ZUltcGwuaW5jCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJIYXNBdHRyaWJ1dGVJbXBsLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ckhhc0F0dHJpYnV0ZUltcGwuaW5jOiAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyLnRkIHwgJChDTEFOR19UQkxHRU4pCisrCSQoY2FsbCB0cmFuc2Zvcm0taG9zdC1jbGFuZy10ZC10by1vdXQsY2xhbmctYXR0ci1oYXMtYXR0cmlidXRlLWltcGwpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIEF0dHJMaXN0LmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJMaXN0LmluYworKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyTGlzdC5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHJMaXN0LmluYzogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ci50ZCB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWF0dHItbGlzdCkKKytlbmRpZgorKworK2lmbmVxICgkKGZpbmRzdHJpbmcgQXR0clNwZWxsaW5nTGlzdEluZGV4LmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0clNwZWxsaW5nTGlzdEluZGV4LmluYworKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJTcGVsbGluZ0xpc3RJbmRleC5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0clNwZWxsaW5nTGlzdEluZGV4LmluYzogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ci50ZCB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWF0dHItc3BlbGxpbmctaW5kZXgpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIEF0dHJQQ0hSZWFkLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vQXR0clBDSFJlYWQuaW5jCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1NlcmlhbGl6YXRpb24vQXR0clBDSFJlYWQuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0F0dHJQQ0hSZWFkLmluYzogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ci50ZCB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWF0dHItcGNoLXJlYWQpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIEF0dHJQQ0hXcml0ZS5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQorK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0F0dHJQQ0hXcml0ZS5pbmMKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvU2VyaWFsaXphdGlvbi9BdHRyUENIV3JpdGUuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9TZXJpYWxpemF0aW9uL0F0dHJQQ0hXcml0ZS5pbmM6ICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQgfCAkKENMQU5HX1RCTEdFTikKKysJJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxjbGFuZy1hdHRyLXBjaC13cml0ZSkKKytlbmRpZgorKworK2lmbmVxICgkKGZpbmRzdHJpbmcgQXR0cnMuaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKKytMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0F0dHJzLmluYworKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvQXR0cnMuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvQXR0cnMuaW5jOiAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyLnRkIHwgJChDTEFOR19UQkxHRU4pCisrCSQoY2FsbCB0cmFuc2Zvcm0taG9zdC1jbGFuZy10ZC10by1vdXQsY2xhbmctYXR0ci1jbGFzc2VzKQorK2VuZGlmCisrCisraWZuZXEgKCQoZmluZHN0cmluZyBBdHRyUGFyc2VyU3RyaW5nU3dpdGNoZXMuaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKKytMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvUGFyc2UvQXR0clBhcnNlclN0cmluZ1N3aXRjaGVzLmluYworKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9QYXJzZS9BdHRyUGFyc2VyU3RyaW5nU3dpdGNoZXMuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9QYXJzZS9BdHRyUGFyc2VyU3RyaW5nU3dpdGNoZXMuaW5jOiAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9CYXNpYy9BdHRyLnRkIHwgJChDTEFOR19UQkxHRU4pCisrCSQoY2FsbCB0cmFuc2Zvcm0taG9zdC1jbGFuZy10ZC10by1vdXQsY2xhbmctYXR0ci1wYXJzZXItc3RyaW5nLXN3aXRjaGVzKQorK2VuZGlmCisrCisraWZuZXEgKCQoZmluZHN0cmluZyBBdHRyVmlzaXRvci5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQorK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvQXR0clZpc2l0b3IuaW5jCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyVmlzaXRvci5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9BdHRyVmlzaXRvci5pbmM6ICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQgfCAkKENMQU5HX1RCTEdFTikKKysJJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxjbGFuZy1hdHRyLWFzdC12aXNpdG9yKQorK2VuZGlmCisrCisraWZuZXEgKCQoZmluZHN0cmluZyBBdHRyUGFyc2VkQXR0cktpbmRzLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0clBhcnNlZEF0dHJLaW5kcy5pbmMKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyUGFyc2VkQXR0cktpbmRzLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyUGFyc2VkQXR0cktpbmRzLmluYzogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ci50ZCB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWF0dHItcGFyc2VkLWF0dHIta2luZHMpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIEF0dHJQYXJzZWRBdHRySW1wbC5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQorK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRySW1wbC5pbmMKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyUGFyc2VkQXR0ckltcGwuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRySW1wbC5pbmM6ICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQgfCAkKENMQU5HX1RCTEdFTikKKysJJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxjbGFuZy1hdHRyLXBhcnNlZC1hdHRyLWltcGwpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIEF0dHJQYXJzZWRBdHRyTGlzdC5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQorK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRyTGlzdC5pbmMKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvU2VtYS9BdHRyUGFyc2VkQXR0ckxpc3QuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJQYXJzZWRBdHRyTGlzdC5pbmM6ICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0F0dHIudGQgfCAkKENMQU5HX1RCTEdFTikKKysJJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxjbGFuZy1hdHRyLXBhcnNlZC1hdHRyLWxpc3QpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIEF0dHJUZW1wbGF0ZUluc3RhbnRpYXRlLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0clRlbXBsYXRlSW5zdGFudGlhdGUuaW5jCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL1NlbWEvQXR0clRlbXBsYXRlSW5zdGFudGlhdGUuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9TZW1hL0F0dHJUZW1wbGF0ZUluc3RhbnRpYXRlLmluYzogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvQXR0ci50ZCB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWF0dHItdGVtcGxhdGUtaW5zdGFudGlhdGUpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIENoZWNrZXJzLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9DaGVja2Vycy5pbmMKKyskKGludGVybWVkaWF0ZXMpL0NoZWNrZXJzLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyskKGludGVybWVkaWF0ZXMpL0NoZWNrZXJzLmluYzogXAorKyAgJChDTEFOR19ST09UX1BBVEgpL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DaGVja2Vycy50ZCBcCisrICAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9TdGF0aWNBbmFseXplci9DaGVja2Vycy9DaGVja2VyQmFzZS50ZCBcCisrICB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLXNhLWNoZWNrZXJzKQorK2VuZGlmCisrCisraWZuZXEgKCQoZmluZHN0cmluZyBDb21tZW50Q29tbWFuZEluZm8uaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKKytMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRDb21tYW5kSW5mby5pbmMKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRDb21tYW5kSW5mby5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50Q29tbWFuZEluZm8uaW5jOiBcCisrICAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudENvbW1hbmRzLnRkIFwKKysgIHwgJChDTEFOR19UQkxHRU4pCisrCSQoY2FsbCB0cmFuc2Zvcm0taG9zdC1jbGFuZy10ZC10by1vdXQsY2xhbmctY29tbWVudC1jb21tYW5kLWluZm8pCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIENvbW1lbnRDb21tYW5kTGlzdC5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQorK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudENvbW1hbmRMaXN0LmluYworKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudENvbW1hbmRMaXN0LmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRDb21tYW5kTGlzdC5pbmM6IFwKKysgICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50Q29tbWFuZHMudGQgXAorKyAgfCAkKENMQU5HX1RCTEdFTikKKysJJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxjbGFuZy1jb21tZW50LWNvbW1hbmQtbGlzdCkKKytlbmRpZgorKworK2lmbmVxICgkKGZpbmRzdHJpbmcgQ29tbWVudEhUTUxOYW1lZENoYXJhY3RlclJlZmVyZW5jZXMuaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKKytMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRIVE1MTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2VzLmluYworKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudEhUTUxOYW1lZENoYXJhY3RlclJlZmVyZW5jZXMuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudEhUTUxOYW1lZENoYXJhY3RlclJlZmVyZW5jZXMuaW5jOiBcCisrICAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudEhUTUxOYW1lZENoYXJhY3RlclJlZmVyZW5jZXMudGQgXAorKyAgfCAkKENMQU5HX1RCTEdFTikKKysJJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxjbGFuZy1jb21tZW50LWh0bWwtbmFtZWQtY2hhcmFjdGVyLXJlZmVyZW5jZXMpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIENvbW1lbnRIVE1MVGFnc1Byb3BlcnRpZXMuaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKKytMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRIVE1MVGFnc1Byb3BlcnRpZXMuaW5jCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50SFRNTFRhZ3NQcm9wZXJ0aWVzLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRIVE1MVGFnc1Byb3BlcnRpZXMuaW5jOiBcCisrICAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudEhUTUxUYWdzLnRkIFwKKysgIHwgJChDTEFOR19UQkxHRU4pCisrCSQoY2FsbCB0cmFuc2Zvcm0taG9zdC1jbGFuZy10ZC10by1vdXQsY2xhbmctY29tbWVudC1odG1sLXRhZ3MtcHJvcGVydGllcykKKytlbmRpZgorKworK2lmbmVxICgkKGZpbmRzdHJpbmcgQ29tbWVudEhUTUxUYWdzLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50SFRNTFRhZ3MuaW5jCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50SFRNTFRhZ3MuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvQ29tbWVudEhUTUxUYWdzLmluYzogXAorKyAgJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnRIVE1MVGFncy50ZCBcCisrICB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWNvbW1lbnQtaHRtbC10YWdzKQorK2VuZGlmCisrCisraWZuZXEgKCQoZmluZHN0cmluZyBDb21tZW50Tm9kZXMuaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKKytMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnROb2Rlcy5pbmMKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0NvbW1lbnROb2Rlcy5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0FTVC9Db21tZW50Tm9kZXMuaW5jOiBcCisrICAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9CYXNpYy9Db21tZW50Tm9kZXMudGQgXAorKyAgfCAkKENMQU5HX1RCTEdFTikKKysJJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxjbGFuZy1jb21tZW50LW5vZGVzKQorK2VuZGlmCisrCisraWZuZXEgKCQoZmlsdGVyIERpYWdub3N0aWMlS2luZHMuaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKKytMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGFkZHByZWZpeCAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQmFzaWMvLCQoZmlsdGVyIERpYWdub3N0aWMlS2luZHMuaW5jLCQoVEJMR0VOX1RBQkxFUykpKQorKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljJUtpbmRzLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpYyVLaW5kcy5pbmM6IFwKKysgICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWMudGQgXAorKyAgJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpYyVLaW5kcy50ZCBcCisrICB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWRpYWdzLWRlZnMgLWNsYW5nLWNvbXBvbmVudD0kKHBhdHN1YnN0IERpYWdub3N0aWMlS2luZHMuaW5jLCUsJChARikpKQorK2VuZGlmCisrCisraWZuZXEgKCQoZmluZHN0cmluZyBEaWFnbm9zdGljR3JvdXBzLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNHcm91cHMuaW5jCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNHcm91cHMuaW5jOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9ICQoTE9DQUxfTU9EVUxFKQorKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljR3JvdXBzLmluYzogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy50ZCAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljR3JvdXBzLnRkIHwgJChDTEFOR19UQkxHRU4pCisrCSQoY2FsbCB0cmFuc2Zvcm0taG9zdC1jbGFuZy10ZC10by1vdXQsY2xhbmctZGlhZy1ncm91cHMpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIERpYWdub3N0aWNJbmRleE5hbWUuaW5jLCQoVEJMR0VOX1RBQkxFUykpLCkKKytMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0luZGV4TmFtZS5pbmMKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0luZGV4TmFtZS5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RpYWdub3N0aWNJbmRleE5hbWUuaW5jOiAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9CYXNpYy9EaWFnbm9zdGljLnRkIHwgJChDTEFOR19UQkxHRU4pCisrCSQoY2FsbCB0cmFuc2Zvcm0taG9zdC1jbGFuZy10ZC10by1vdXQsY2xhbmctZGlhZy1ncm91cHMpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIERlY2xOb2Rlcy5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQorK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbE5vZGVzLmluYworKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvRGVjbE5vZGVzLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL0RlY2xOb2Rlcy5pbmM6ICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL0RlY2xOb2Rlcy50ZCB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLWRlY2wtbm9kZXMpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIFN0bXROb2Rlcy5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQorK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdE5vZGVzLmluYworKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9BU1QvU3RtdE5vZGVzLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvQVNUL1N0bXROb2Rlcy5pbmM6ICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1N0bXROb2Rlcy50ZCB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGNsYW5nLXN0bXQtbm9kZXMpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIGFybV9uZW9uLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL2FybV9uZW9uLmluYworKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9CYXNpYy9hcm1fbmVvbi5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL2FybV9uZW9uLmluYzogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvYXJtX25lb24udGQgfCAkKENMQU5HX1RCTEdFTikKKysJJChjYWxsIHRyYW5zZm9ybS1ob3N0LWNsYW5nLXRkLXRvLW91dCxhcm0tbmVvbi1zZW1hKQorK2VuZGlmCisrCisraWZuZXEgKCQoZmluZHN0cmluZyBPcHRpb25zLmluYywkKFRCTEdFTl9UQUJMRVMpKSwpCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0RyaXZlci9PcHRpb25zLmluYworKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvT3B0aW9ucy5pbmM6IFRCTEdFTl9MT0NBTF9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0RyaXZlci9PcHRpb25zLmluYzogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvRHJpdmVyL09wdGlvbnMudGQgJChMTFZNX1JPT1RfUEFUSCkvaW5jbHVkZS9sbHZtL09wdGlvbi9PcHRQYXJzZXIudGQgJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMudGQgXAorKyAgICB8ICQoQ0xBTkdfVEJMR0VOKSAkKFRCTEdFTikKKysJJChjYWxsIHRyYW5zZm9ybS1ob3N0LXRkLXRvLW91dCxvcHQtcGFyc2VyLWRlZnMpCisrZW5kaWYKKysKKytpZm5lcSAoJChmaW5kc3RyaW5nIENDMUFzT3B0aW9ucy5pbmMsJChUQkxHRU5fVEFCTEVTKSksKQorK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxQXNPcHRpb25zLmluYworKyQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxQXNPcHRpb25zLmluYzogVEJMR0VOX0xPQ0FMX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyskKGludGVybWVkaWF0ZXMpL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMUFzT3B0aW9ucy5pbmM6ICQoQ0xBTkdfUk9PVF9QQVRIKS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFBc09wdGlvbnMudGQgJChMTFZNX1JPT1RfUEFUSCkvaW5jbHVkZS9sbHZtL09wdGlvbi9PcHRQYXJzZXIudGQgXAorKyAgICB8ICQoQ0xBTkdfVEJMR0VOKSAkKFRCTEdFTikKKysJJChjYWxsIHRyYW5zZm9ybS1ob3N0LXRkLXRvLW91dCxvcHQtcGFyc2VyLWRlZnMpCisrZW5kaWYKKysKKytMT0NBTF9DX0lOQ0xVREVTICs9ICQoaW50ZXJtZWRpYXRlcykvaW5jbHVkZQorKworK2VuZGlmCitkaWZmIC0tZ2l0IGEvY2xhbmctdmVyc2lvbi1pbmMubWsgYi9jbGFuZy12ZXJzaW9uLWluYy5taworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjVhMjYyNzYKKy0tLSAvZGV2L251bGwKKysrKyBiL2NsYW5nLXZlcnNpb24taW5jLm1rCitAQCAtMCwwICsxLDM2IEBACisrIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKysjIyBHZW5lcmF0ZSBjbGFuZy9CYXNpYy9WZXJzaW9uLmluYworKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisraWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLCkKKysgICAgTE9DQUxfTU9EVUxFX0NMQVNTIDo9IFNUQVRJQ19MSUJSQVJJRVMKKytlbmRpZgorKworK2ludGVybWVkaWF0ZXMgOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyKQorKworK0xMVk1WZXJzaW9uIDo9ICQoc2hlbGwgZ3JlcCBQQUNLQUdFX1ZFUlNJT04gJChMTFZNX1JPT1RfUEFUSCkvaG9zdC9pbmNsdWRlL2xsdm0vQ29uZmlnL2NvbmZpZy5oIHwgc2VkIC1lICdzL1wjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiXCguKlwpIi9cMS9nJykKKysKKysjIENvbXB1dGUgdGhlIENsYW5nIHZlcnNpb24gZnJvbSB0aGUgTExWTSB2ZXJzaW9uLCB1bmxlc3Mgc3BlY2lmaWVkIGV4cGxpY2l0bHkuCisrIyAoQ29weSBmcm9tIGluY2x1ZGUvY2xhbmcvQmFzaWMvTWFrZWZpbGUpCisrQ0xBTkdfVkVSU0lPTiA6PSAkKHN1YnN0IHN2biwsJChMTFZNVmVyc2lvbikpCisrQ0xBTkdfVkVSU0lPTl9DT01QT05FTlRTIDo9ICQoc3Vic3QgLiwgLCQoQ0xBTkdfVkVSU0lPTikpCisrQ0xBTkdfVkVSU0lPTl9NQUpPUiA6PSAkKHdvcmQgMSwkKENMQU5HX1ZFUlNJT05fQ09NUE9ORU5UUykpCisrQ0xBTkdfVkVSU0lPTl9NSU5PUiA6PSAkKHdvcmQgMiwkKENMQU5HX1ZFUlNJT05fQ09NUE9ORU5UUykpCisrQ0xBTkdfVkVSU0lPTl9QQVRDSExFVkVMIDo9ICQod29yZCAzLCQoQ0xBTkdfVkVSU0lPTl9DT01QT05FTlRTKSkKKytpZmVxICgkKENMQU5HX1ZFUlNJT05fUEFUQ0hMRVZFTCksKQorKyAgICBDTEFOR19IQVNfVkVSU0lPTl9QQVRDSExFVkVMIDo9IDAKKytlbHNlCisrICAgIENMQU5HX0hBU19WRVJTSU9OX1BBVENITEVWRUwgOj0gMQorK2VuZGlmCisrCisrTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZlcnNpb24uaW5jCisrJChpbnRlcm1lZGlhdGVzKS9pbmNsdWRlL2NsYW5nL0Jhc2ljL1ZlcnNpb24uaW5jOiAkKENMQU5HX1JPT1RfUEFUSCkvaW5jbHVkZS9jbGFuZy9CYXNpYy9WZXJzaW9uLmluYy5pbiBcCisrICAkKExMVk1fUk9PVF9QQVRIKS9ob3N0L2luY2x1ZGUvbGx2bS9Db25maWcvY29uZmlnLmgKKysJQGVjaG8gIlVwZGF0aW5nIENsYW5nIHZlcnNpb24gaW5mby4iCisrCUBta2RpciAtcCAkKGRpciAkQCkKKysJJChoaWRlKSBzZWQgLWUgInMjQENMQU5HX1ZFUlNJT05AIyQoQ0xBTkdfVkVSU0lPTikjZyIgXAorKwktZSAicyNAQ0xBTkdfVkVSU0lPTl9NQUpPUkAjJChDTEFOR19WRVJTSU9OX01BSk9SKSNnIiBcCisrCS1lICJzI0BDTEFOR19WRVJTSU9OX01JTk9SQCMkKENMQU5HX1ZFUlNJT05fTUlOT1IpI2ciIFwKKysJLWUgInMjQENMQU5HX1ZFUlNJT05fUEFUQ0hMRVZFTEAjJChDTEFOR19WRVJTSU9OX1BBVENITEVWRUwpI2ciIFwKKysJLWUgInMjQENMQU5HX0hBU19WRVJTSU9OX1BBVENITEVWRUxAIyQoQ0xBTkdfSEFTX1ZFUlNJT05fUEFUQ0hMRVZFTCkjZyIgXAorKwkkPCA+ICRACisrCitkaWZmIC0tZ2l0IGEvY2xhbmcubWsgYi9jbGFuZy5taworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjU4N2E1MTAKKy0tLSAvZGV2L251bGwKKysrKyBiL2NsYW5nLm1rCitAQCAtMCwwICsxLDcgQEAKKytpZmVxICgkKENMQU5HX1JPT1RfUEFUSCksKQorKyQoZXJyb3IgTXVzdCBzZXQgdmFyaWFibGUgQ0xBTkdfUk9PVF9QQVRIIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyEgJChMT0NBTF9QQVRIKSkKKytlbmRpZgorKworK0NMQU5HX0hPU1RfQlVJTERfTUsgOj0gJChDTEFOR19ST09UX1BBVEgpL2NsYW5nLWhvc3QtYnVpbGQubWsKKytDTEFOR19UQkxHRU5fUlVMRVNfTUsgOj0gJChDTEFOR19ST09UX1BBVEgpL2NsYW5nLXRibGdlbi1ydWxlcy5taworK0NMQU5HX1ZFUlNJT05fSU5DX01LIDo9ICQoQ0xBTkdfUk9PVF9QQVRIKS9jbGFuZy12ZXJzaW9uLWluYy5taworZGlmZiAtLWdpdCBhL2hvc3Rfc2hhcmVkX2NsYW5nLm1rIGIvaG9zdF9zaGFyZWRfY2xhbmcubWsKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5mOWU0MTgxCistLS0gL2Rldi9udWxsCisrKysgYi9ob3N0X3NoYXJlZF9jbGFuZy5taworQEAgLTAsMCArMSw0MSBAQAorKyMgRG9uJ3QgYnVpbGQgdGhlIGxpYnJhcnkgdW5sZXNzIGZvcmNlZCB0by4KKytpZmVxICh0cnVlLCQoRk9SQ0VfQlVJTERfTExWTV9DT01QT05FTlRTKSkKKysjIERvbid0IGJ1aWxkIHRoZSBsaWJyYXJ5IGluIHVuYnVuZGxlZCBicmFuY2hlcy4KKytpZmVxICgsJChUQVJHRVRfQlVJTERfQVBQUykpCisrCisrTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisrCisrTE9DQUxfSVNfSE9TVF9NT0RVTEUgOj0gdHJ1ZQorKworK0xPQ0FMX01PRFVMRTo9IGxpYmNsYW5nCisrCisrTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKysKKytMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKysJbGliY2xhbmdEcml2ZXIgXAorKwlsaWJjbGFuZ1BhcnNlIFwKKysJbGliY2xhbmdTZW1hIFwKKysJbGliY2xhbmdBbmFseXNpcyBcCisrCWxpYmNsYW5nQ29kZUdlbiBcCisrCWxpYmNsYW5nQVNUIFwKKysJbGliY2xhbmdFZGl0IFwKKysJbGliY2xhbmdMZXggXAorKwlsaWJjbGFuZ0Zyb250ZW5kIFwKKysJbGliY2xhbmdCYXNpYyBcCisrCWxpYmNsYW5nUmV3cml0ZUZyb250ZW5kIFwKKysJbGliY2xhbmdSZXdyaXRlQ29yZSBcCisrCWxpYmNsYW5nU2VyaWFsaXphdGlvbgorKworK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliTExWTQorKworK2lmZXEgKCQoSE9TVF9PUyksd2luZG93cykKKysgIExPQ0FMX0xETElCUyA6PSAtbGltYWdlaGxwIC1scHNhcGkKKytlbHNlCisrICBMT0NBTF9MRExJQlMgOj0gLWxkbCAtbHB0aHJlYWQKKytlbmRpZgorKworK2luY2x1ZGUgJChDTEFOR19IT1NUX0JVSUxEX01LKQorK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NIQVJFRF9MSUJSQVJZKQorKworK2VuZGlmICMgZG9uJ3QgYnVpbGQgaW4gdW5idW5kbGVkIGJyYW5jaGVzCisrZW5kaWYgIyBkb24ndCBidWlsZCB1bmxlc3MgZm9yY2VkIHRvCitkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Db25maWcvY29uZmlnLmggYi9pbmNsdWRlL2NsYW5nL0NvbmZpZy9jb25maWcuaAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjUxZWY5ZjkKKy0tLSAvZGV2L251bGwKKysrKyBiL2luY2x1ZGUvY2xhbmcvQ29uZmlnL2NvbmZpZy5oCitAQCAtMCwwICsxLDI1IEBACisrLyogdG9vbHMvY2xhbmcvaW5jbHVkZS9jbGFuZy9Db25maWcvY29uZmlnLmguICBHZW5lcmF0ZWQgZnJvbSBjb25maWcuaC5pbiBieSBjb25maWd1cmUuICAqLworKy8qIGluY2x1ZGUvY2xhbmcvQ29uZmlnL2NvbmZpZy5oLmluLiAqLworKworKyNpZm5kZWYgQU5EUk9JRF9DT05GSUdfSAorKyNkZWZpbmUgQU5EUk9JRF9DT05GSUdfSAorKworKy8qIEJ1ZyByZXBvcnQgVVJMLiAqLworKyNkZWZpbmUgQlVHX1JFUE9SVF9VUkwgImh0dHA6Ly9sbHZtLm9yZy9idWdzLyIKKysKKysvKiBSZWxhdGl2ZSBkaXJlY3RvcnkgZm9yIHJlc291cmNlIGZpbGVzICovCisrI2RlZmluZSBDTEFOR19SRVNPVVJDRV9ESVIgIiIKKysKKysvKiBEaXJlY3RvcmllcyBjbGFuZyB3aWxsIHNlYXJjaCBmb3IgaGVhZGVycyAqLworKyNkZWZpbmUgQ19JTkNMVURFX0RJUlMgIiIKKysKKysvKiBMaW5rZXIgdmVyc2lvbiBkZXRlY3RlZCBhdCBjb21waWxlIHRpbWUuICovCisrI2RlZmluZSBIT1NUX0xJTktfVkVSU0lPTiAiMi4yMiIKKysKKysvKiBEZWZhdWx0IDxwYXRoPiB0byBhbGwgY29tcGlsZXIgaW52b2NhdGlvbnMgZm9yIC0tc3lzcm9vdD08cGF0aD4uICovCisrI2RlZmluZSBERUZBVUxUX1NZU1JPT1QgIiIKKysKKysvKiBEaXJlY3Rvcnkgd2hlcmUgZ2NjIGlzIGluc3RhbGxlZC4gKi8KKysjZGVmaW5lIEdDQ19JTlNUQUxMX1BSRUZJWCAiIgorKworKyNlbmRpZgorZGlmZiAtLWdpdCBhL2xpYi9BUkNNaWdyYXRlL0FuZHJvaWQubWsgYi9saWIvQVJDTWlncmF0ZS9BbmRyb2lkLm1rCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uODM0ZjU3MworLS0tIC9kZXYvbnVsbAorKysrIGIvbGliL0FSQ01pZ3JhdGUvQW5kcm9pZC5taworQEAgLTAsMCArMSw1MSBAQAorK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKysKKysjIEZvciB0aGUgaG9zdCBvbmx5CisrIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorK2luY2x1ZGUgJChDTEVBUl9UQkxHRU5fVkFSUykKKysKKytUQkxHRU5fVEFCTEVTIDo9IFwKKysgIEF0dHJzLmluYyBcCisrICBBdHRyTGlzdC5pbmMgXAorKyAgQXR0clBhcnNlZEF0dHJMaXN0LmluYyAgICBcCisrICBBdHRyVmlzaXRvci5pbmMgXAorKyAgQ29tbWVudENvbW1hbmRMaXN0LmluYyBcCisrICBDb21tZW50Tm9kZXMuaW5jIFwKKysgIERlY2xOb2Rlcy5pbmMgXAorKyAgRGlhZ25vc3RpY0NvbW1vbktpbmRzLmluYyBcCisrICBEaWFnbm9zdGljR3JvdXBzLmluYyBcCisrICBEaWFnbm9zdGljU2VtYUtpbmRzLmluYyBcCisrICBTdG10Tm9kZXMuaW5jCisrCisrY2xhbmdfYXJjX21pZ3JhdGVfU1JDX0ZJTEVTIDo9IFwKKysgIEFSQ01ULmNwcCBcCisrICBBUkNNVEFjdGlvbnMuY3BwIFwKKysgIEZpbGVSZW1hcHBlci5jcHAgXAorKyAgT2JqQ01ULmNwcCBcCisrICBQbGlzdFJlcG9ydGVyLmNwcCBcCisrICBUcmFuc0FQSVVzZXMuY3BwIFwKKysgIFRyYW5zQVJDQXNzaWduLmNwcCBcCisrICBUcmFuc0F1dG9yZWxlYXNlUG9vbC5jcHAgXAorKyAgVHJhbnNCbG9ja09iakNWYXJpYWJsZS5jcHAgXAorKyAgVHJhbnNFbXB0eVN0YXRlbWVudHNBbmREZWFsbG9jLmNwcCBcCisrICBUcmFuc2Zvcm1BY3Rpb25zLmNwcCBcCisrICBUcmFuc2Zvcm1zLmNwcCBcCisrICBUcmFuc0dDQXR0cnMuY3BwIFwKKysgIFRyYW5zR0NDYWxscy5jcHAgXAorKyAgVHJhbnNQcm9wZXJ0aWVzLmNwcCBcCisrICBUcmFuc1Byb3RlY3RlZFNjb3BlLmNwcCBcCisrICBUcmFuc1JldGFpblJlbGVhc2VEZWFsbG9jLmNwcCBcCisrICBUcmFuc1VuYnJpZGdlZENhc3RzLmNwcCBcCisrICBUcmFuc1VudXNlZEluaXREZWxlZ2F0ZS5jcHAgXAorKyAgVHJhbnNaZXJvT3V0UHJvcHNJbkRlYWxsb2MuY3BwCisrCisrTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2xhbmdfYXJjX21pZ3JhdGVfU1JDX0ZJTEVTKQorKworK0xPQ0FMX01PRFVMRSA6PSBsaWJjbGFuZ0FSQ01pZ3JhdGUKKytMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorKworK2luY2x1ZGUgJChDTEFOR19IT1NUX0JVSUxEX01LKQorK2luY2x1ZGUgJChDTEFOR19WRVJTSU9OX0lOQ19NSykKKytpbmNsdWRlICQoQ0xBTkdfVEJMR0VOX1JVTEVTX01LKQorK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorZGlmZiAtLWdpdCBhL2xpYi9BU1QvQW5kcm9pZC5tayBiL2xpYi9BU1QvQW5kcm9pZC5taworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjlkMGMwMDUKKy0tLSAvZGV2L251bGwKKysrKyBiL2xpYi9BU1QvQW5kcm9pZC5taworQEAgLTAsMCArMSw5NCBAQAorK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorKworKyMgRm9yIHRoZSBob3N0IG9ubHkKKysjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisraW5jbHVkZSAkKENMRUFSX1RCTEdFTl9WQVJTKQorKworK1RCTEdFTl9UQUJMRVMgOj0gICAgXAorKwlBdHRyRHVtcC5pbmMJXAorKwlBdHRySW1wbC5pbmMJXAorKwlBdHRyTGlzdC5pbmMJXAorKwlBdHRycy5pbmMJXAorKyAgICAgICAgQXR0clZpc2l0b3IuaW5jIFwKKysJQ29tbWVudENvbW1hbmRJbmZvLmluYyBcCisrCUNvbW1lbnRDb21tYW5kTGlzdC5pbmMgXAorKwlDb21tZW50SFRNTE5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlcy5pbmMgXAorKwlDb21tZW50SFRNTFRhZ3MuaW5jIFwKKysJQ29tbWVudEhUTUxUYWdzUHJvcGVydGllcy5pbmMgXAorKwlDb21tZW50Tm9kZXMuaW5jIFwKKysJRGVjbE5vZGVzLmluYwlcCisrCURpYWdub3N0aWNBU1RLaW5kcy5pbmMJXAorKwlEaWFnbm9zdGljQ29tbWVudEtpbmRzLmluYyBcCisrCURpYWdub3N0aWNDb21tb25LaW5kcy5pbmMJXAorKwlEaWFnbm9zdGljU2VtYUtpbmRzLmluYwlcCisrCVN0bXROb2Rlcy5pbmMKKysKKytjbGFuZ19hc3RfU1JDX0ZJTEVTIDo9CVwKKysJQVBWYWx1ZS5jcHAJXAorKwlBU1RDb25zdW1lci5jcHAJXAorKwlBU1RDb250ZXh0LmNwcAlcCisrCUFTVERpYWdub3N0aWMuY3BwCVwKKysJQVNURHVtcGVyLmNwcAlcCisrCUFTVEltcG9ydGVyLmNwcAlcCisrCUFTVFR5cGVUcmFpdHMuY3BwIFwKKysJQXR0ckltcGwuY3BwCVwKKysJQ29tbWVudC5jcHAgXAorKwlDb21tZW50QnJpZWZQYXJzZXIuY3BwIFwKKysJQ29tbWVudENvbW1hbmRUcmFpdHMuY3BwIFwKKysJQ29tbWVudExleGVyLmNwcCBcCisrCUNvbW1lbnRQYXJzZXIuY3BwIFwKKysJQ29tbWVudFNlbWEuY3BwIFwKKysJQ1hYSW5oZXJpdGFuY2UuY3BwCVwKKysJRGVjbC5jcHAJXAorKwlEZWNsYXJhdGlvbk5hbWUuY3BwCVwKKysJRGVjbEJhc2UuY3BwCVwKKysJRGVjbENYWC5jcHAJXAorKwlEZWNsRnJpZW5kLmNwcAlcCisrCURlY2xHcm91cC5jcHAJXAorKwlEZWNsT2JqQy5jcHAJXAorKwlEZWNsT3Blbk1QLmNwcAlcCisrCURlY2xQcmludGVyLmNwcAlcCisrCURlY2xUZW1wbGF0ZS5jcHAJXAorKwlFeHByLmNwcAlcCisrCUV4cHJDbGFzc2lmaWNhdGlvbi5jcHAJXAorKwlFeHByQ29uc3RhbnQuY3BwCVwKKysJRXhwckNYWC5jcHAJXAorKwlFeHRlcm5hbEFTVFNvdXJjZS5jcHAJXAorKwlJbmhlcml0Vml6LmNwcAlcCisrCUl0YW5pdW1DWFhBQkkuY3BwCVwKKysJSXRhbml1bU1hbmdsZS5jcHAJXAorKwlNYW5nbGUuY3BwCVwKKysJTWFuZ2xlTnVtYmVyaW5nQ29udGV4dC5jcHAgXAorKwlNaWNyb3NvZnRDWFhBQkkuY3BwCVwKKysJTWljcm9zb2Z0TWFuZ2xlLmNwcAlcCisrCU5lc3RlZE5hbWVTcGVjaWZpZXIuY3BwCVwKKysgICAgICAgIE5TQVBJLmNwcCAgICAgICBcCisrCVBhcmVudE1hcC5jcHAJXAorKwlSZWNvcmRMYXlvdXQuY3BwCVwKKysJUmVjb3JkTGF5b3V0QnVpbGRlci5jcHAJXAorKwlSYXdDb21tZW50TGlzdC5jcHAgXAorKwlTZWxlY3RvckxvY2F0aW9uc0tpbmQuY3BwIFwKKysJU3RtdC5jcHAJXAorKwlTdG10SXRlcmF0b3IuY3BwCVwKKysJU3RtdFByaW50ZXIuY3BwCVwKKysJU3RtdFByb2ZpbGUuY3BwCVwKKysJU3RtdFZpei5jcHAJXAorKwlUZW1wbGF0ZUJhc2UuY3BwCVwKKysJVGVtcGxhdGVOYW1lLmNwcAlcCisrCVR5cGUuY3BwCVwKKysJVHlwZUxvYy5jcHAJXAorKwlUeXBlUHJpbnRlci5jcHAgXAorKwlWVFRCdWlsZGVyLmNwcCBcCisrCVZUYWJsZUJ1aWxkZXIuY3BwCisrCisrTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2xhbmdfYXN0X1NSQ19GSUxFUykKKysKKytMT0NBTF9NT0RVTEU6PSBsaWJjbGFuZ0FTVAorK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisrCisrTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKysKKytpbmNsdWRlICQoQ0xBTkdfSE9TVF9CVUlMRF9NSykKKytpbmNsdWRlICQoQ0xBTkdfVEJMR0VOX1JVTEVTX01LKQorK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorZGlmZiAtLWdpdCBhL2xpYi9BbmFseXNpcy9BbmRyb2lkLm1rIGIvbGliL0FuYWx5c2lzL0FuZHJvaWQubWsKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi44Y2NiZjNlCistLS0gL2Rldi9udWxsCisrKysgYi9saWIvQW5hbHlzaXMvQW5kcm9pZC5taworQEAgLTAsMCArMSw1MSBAQAorK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorKworKyMgRm9yIHRoZSBob3N0IG9ubHkKKysjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisraW5jbHVkZSAkKENMRUFSX1RCTEdFTl9WQVJTKQorKworK1RCTEdFTl9UQUJMRVMgOj0gXAorKyAgQXR0ckxpc3QuaW5jIFwKKysgIEF0dHJzLmluYyBcCisrICBBdHRyVmlzaXRvci5pbmMgXAorKyAgQ29tbWVudENvbW1hbmRMaXN0LmluYyBcCisrICBDb21tZW50Tm9kZXMuaW5jIFwKKysgIERlY2xOb2Rlcy5pbmMgXAorKyAgRGlhZ25vc3RpY0NvbW1vbktpbmRzLmluYyBcCisrICBEaWFnbm9zdGljQW5hbHlzaXNLaW5kcy5pbmMgXAorKyAgU3RtdE5vZGVzLmluYworKworK2NsYW5nX2FuYWx5c2lzX1NSQ19GSUxFUyA6PSBcCisrICBBbmFseXNpc0RlY2xDb250ZXh0LmNwcCBcCisrICBCb2R5RmFybS5jcHAgXAorKyAgQ2FsbEdyYXBoLmNwcCBcCisrICBDRkcuY3BwIFwKKysgIENGR1JlYWNoYWJpbGl0eUFuYWx5c2lzLmNwcCBcCisrICBDRkdTdG10TWFwLmNwcCBcCisrICBDb2NvYUNvbnZlbnRpb25zLmNwcCBcCisrICBDb25zdW1lZC5jcHAgXAorKyAgRG9taW5hdG9ycy5jcHAgXAorKyAgRm9ybWF0U3RyaW5nLmNwcCBcCisrICBMaXZlVmFyaWFibGVzLmNwcCBcCisrICBPYmpDTm9SZXR1cm4uY3BwIFwKKysgIFBvc3RPcmRlckNGR1ZpZXcuY3BwIFwKKysgIFByaW50ZkZvcm1hdFN0cmluZy5jcHAgXAorKyAgUHJvZ3JhbVBvaW50LmNwcCBcCisrICBQc2V1ZG9Db25zdGFudEFuYWx5c2lzLmNwcCBcCisrICBSZWFjaGFibGVDb2RlLmNwcCBcCisrICBTY2FuZkZvcm1hdFN0cmluZy5jcHAgXAorKyAgVGhyZWFkU2FmZXR5LmNwcCBcCisrICBVbmluaXRpYWxpemVkVmFsdWVzLmNwcAorKworKworK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNsYW5nX2FuYWx5c2lzX1NSQ19GSUxFUykKKysKKytMT0NBTF9NT0RVTEU6PSBsaWJjbGFuZ0FuYWx5c2lzCisrTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKysKKytMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorKworK2luY2x1ZGUgJChDTEFOR19IT1NUX0JVSUxEX01LKQorK2luY2x1ZGUgJChDTEFOR19UQkxHRU5fUlVMRVNfTUspCisraW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCitkaWZmIC0tZ2l0IGEvbGliL0Jhc2ljL0FuZHJvaWQubWsgYi9saWIvQmFzaWMvQW5kcm9pZC5taworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjU0ZTYxYzIKKy0tLSAvZGV2L251bGwKKysrKyBiL2xpYi9CYXNpYy9BbmRyb2lkLm1rCitAQCAtMCwwICsxLDU3IEBACisrTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisrCisrIyBGb3IgdGhlIGhvc3Qgb25seQorKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKytpbmNsdWRlICQoQ0xFQVJfVkFSUykKKytpbmNsdWRlICQoQ0xFQVJfVEJMR0VOX1ZBUlMpCisrCisrVEJMR0VOX1RBQkxFUyA6PSBcCisrICBBdHRySGFzQXR0cmlidXRlSW1wbC5pbmMgXAorKyAgRGlhZ25vc3RpY0FTVEtpbmRzLmluYyBcCisrICBEaWFnbm9zdGljQW5hbHlzaXNLaW5kcy5pbmMgXAorKyAgRGlhZ25vc3RpY0NvbW1lbnRLaW5kcy5pbmMgXAorKyAgRGlhZ25vc3RpY0NvbW1vbktpbmRzLmluYyBcCisrICBEaWFnbm9zdGljRHJpdmVyS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNGcm9udGVuZEtpbmRzLmluYyBcCisrICBEaWFnbm9zdGljR3JvdXBzLmluYyBcCisrICBEaWFnbm9zdGljSW5kZXhOYW1lLmluYyBcCisrICBEaWFnbm9zdGljTGV4S2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNQYXJzZUtpbmRzLmluYyBcCisrICBEaWFnbm9zdGljU2VtYUtpbmRzLmluYyBcCisrICBEaWFnbm9zdGljU2VyaWFsaXphdGlvbktpbmRzLmluYyBcCisrICBhcm1fbmVvbi5pbmMKKysKKytjbGFuZ19iYXNpY19TUkNfRklMRVMgOj0gXAorKyAgQXR0cmlidXRlcy5jcHAgXAorKyAgQnVpbHRpbnMuY3BwIFwKKysgIENoYXJJbmZvLmNwcCBcCisrICBEaWFnbm9zdGljLmNwcCBcCisrICBEaWFnbm9zdGljSURzLmNwcCBcCisrICBGaWxlTWFuYWdlci5jcHAgXAorKyAgRmlsZVN5c3RlbVN0YXRDYWNoZS5jcHAgXAorKyAgSWRlbnRpZmllclRhYmxlLmNwcCBcCisrICBMYW5nT3B0aW9ucy5jcHAgXAorKyAgTW9kdWxlLmNwcCBcCisrICBPYmpDUnVudGltZS5jcHAgXAorKyAgT3Blbk1QS2luZHMuY3BwIFwKKysgIE9wZXJhdG9yUHJlY2VkZW5jZS5jcHAgXAorKyAgU291cmNlTG9jYXRpb24uY3BwIFwKKysgIFNvdXJjZU1hbmFnZXIuY3BwIFwKKysgIFRhcmdldEluZm8uY3BwIFwKKysgIFRhcmdldHMuY3BwIFwKKysgIFRva2VuS2luZHMuY3BwIFwKKysgIFZlcnNpb24uY3BwIFwKKysgIFZlcnNpb25UdXBsZS5jcHAgXAorKyAgVmlydHVhbEZpbGVTeXN0ZW0uY3BwCisrCisrTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2xhbmdfYmFzaWNfU1JDX0ZJTEVTKQorKworK0xPQ0FMX01PRFVMRTo9IGxpYmNsYW5nQmFzaWMKKytMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorKworK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisrCisraW5jbHVkZSAkKENMQU5HX0hPU1RfQlVJTERfTUspCisraW5jbHVkZSAkKENMQU5HX1ZFUlNJT05fSU5DX01LKQorK2luY2x1ZGUgJChDTEFOR19UQkxHRU5fUlVMRVNfTUspCisraW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCitkaWZmIC0tZ2l0IGEvbGliL0NvZGVHZW4vQW5kcm9pZC5tayBiL2xpYi9Db2RlR2VuL0FuZHJvaWQubWsKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4xYzRhMGI3CistLS0gL2Rldi9udWxsCisrKysgYi9saWIvQ29kZUdlbi9BbmRyb2lkLm1rCitAQCAtMCwwICsxLDc1IEBACisrTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisrCisrY2xhbmdfY29kZWdlbl9UQkxHRU5fVEFCTEVTIDo9IFwKKysgIEF0dHJMaXN0LmluYyBcCisrICBBdHRycy5pbmMgXAorKyAgQXR0clZpc2l0b3IuaW5jIFwKKysgIENvbW1lbnRDb21tYW5kTGlzdC5pbmMgXAorKyAgQ29tbWVudE5vZGVzLmluYyBcCisrICBEZWNsTm9kZXMuaW5jIFwKKysgIERpYWdub3N0aWNDb21tb25LaW5kcy5pbmMgXAorKyAgRGlhZ25vc3RpY0Zyb250ZW5kS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNTZW1hS2luZHMuaW5jIFwKKysgIFN0bXROb2Rlcy5pbmMgXAorKyAgYXJtX25lb24uaW5jCisrCisrY2xhbmdfY29kZWdlbl9TUkNfRklMRVMgOj0gXAorKyAgQmFja2VuZFV0aWwuY3BwIFwKKysgIENHQXRvbWljLmNwcCBcCisrICBDR0Jsb2Nrcy5jcHAgXAorKyAgQ0dCdWlsdGluLmNwcCBcCisrICBDR0NVREFOVi5jcHAgXAorKyAgQ0dDVURBUnVudGltZS5jcHAgXAorKyAgQ0dDWFguY3BwIFwKKysgIENHQ1hYQUJJLmNwcCBcCisrICBDR0NhbGwuY3BwIFwKKysgIENHQ2xhc3MuY3BwIFwKKysgIENHQ2xlYW51cC5jcHAgXAorKyAgQ0dEZWJ1Z0luZm8uY3BwIFwKKysgIENHRGVjbC5jcHAgXAorKyAgQ0dEZWNsQ1hYLmNwcCBcCisrICBDR0V4Y2VwdGlvbi5jcHAgXAorKyAgQ0dFeHByLmNwcCBcCisrICBDR0V4cHJBZ2cuY3BwIFwKKysgIENHRXhwckNYWC5jcHAgXAorKyAgQ0dFeHByQ29tcGxleC5jcHAgXAorKyAgQ0dFeHByQ29uc3RhbnQuY3BwIFwKKysgIENHRXhwclNjYWxhci5jcHAgXAorKyAgQ0dPYmpDLmNwcCBcCisrICBDR09iakNHTlUuY3BwIFwKKysgIENHT2JqQ01hYy5jcHAgXAorKyAgQ0dPYmpDUnVudGltZS5jcHAgXAorKyAgQ0dPcGVuQ0xSdW50aW1lLmNwcCBcCisrICBDR1JUVEkuY3BwIFwKKysgIENHUmVjb3JkTGF5b3V0QnVpbGRlci5jcHAgXAorKyAgQ0dTdG10LmNwcCBcCisrICBDR1ZUVC5jcHAgXAorKyAgQ0dWVGFibGVzLmNwcCBcCisrICBDb2RlR2VuQUJJVHlwZXMuY3BwIFwKKysgIENvZGVHZW5BY3Rpb24uY3BwIFwKKysgIENvZGVHZW5GdW5jdGlvbi5jcHAgXAorKyAgQ29kZUdlbk1vZHVsZS5jcHAgXAorKyAgQ29kZUdlblBHTy5jcHAgXAorKyAgQ29kZUdlblRCQUEuY3BwIFwKKysgIENvZGVHZW5UeXBlcy5jcHAgXAorKyAgSXRhbml1bUNYWEFCSS5jcHAgXAorKyAgTWljcm9zb2Z0Q1hYQUJJLmNwcCBcCisrICBNb2R1bGVCdWlsZGVyLmNwcCBcCisrICBUYXJnZXRJbmZvLmNwcAorKworKyMgRm9yIHRoZSBob3N0IG9ubHkKKysjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisraW5jbHVkZSAkKENMRUFSX1RCTEdFTl9WQVJTKQorKworK0xPQ0FMX01PRFVMRTo9IGxpYmNsYW5nQ29kZUdlbgorK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisrCisrTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2xhbmdfY29kZWdlbl9TUkNfRklMRVMpCisrVEJMR0VOX1RBQkxFUyA6PSAkKGNsYW5nX2NvZGVnZW5fVEJMR0VOX1RBQkxFUykKKysKKytpbmNsdWRlICQoQ0xBTkdfSE9TVF9CVUlMRF9NSykKKytpbmNsdWRlICQoQ0xBTkdfVkVSU0lPTl9JTkNfTUspCisraW5jbHVkZSAkKENMQU5HX1RCTEdFTl9SVUxFU19NSykKKytpbmNsdWRlICQoTExWTV9HRU5fSU5UUklOU0lDU19NSykKKytpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKK2RpZmYgLS1naXQgYS9saWIvRHJpdmVyL0FuZHJvaWQubWsgYi9saWIvRHJpdmVyL0FuZHJvaWQubWsKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi41NTljYTgzCistLS0gL2Rldi9udWxsCisrKysgYi9saWIvRHJpdmVyL0FuZHJvaWQubWsKK0BAIC0wLDAgKzEsNDQgQEAKKytMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKysKKysjIEZvciB0aGUgaG9zdCBvbmx5CisrIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorK2luY2x1ZGUgJChDTEVBUl9UQkxHRU5fVkFSUykKKysKKytUQkxHRU5fVEFCTEVTIDo9IFwKKysgIEF0dHJWaXNpdG9yLmluYyBcCisrICBEaWFnbm9zdGljQ29tbW9uS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNEcml2ZXJLaW5kcy5pbmMgXAorKyAgRGlhZ25vc3RpY1NlbWFLaW5kcy5pbmMgXAorKyAgT3B0aW9ucy5pbmMgXAorKyAgQ0MxT3B0aW9ucy5pbmMgXAorKyAgQ0MxQXNPcHRpb25zLmluYworKworK2NsYW5nX2RyaXZlcl9TUkNfRklMRVMgOj0gXAorKyAgQWN0aW9uLmNwcCBcCisrICBDQzFBc09wdGlvbnMuY3BwIFwKKysgIENvbXBpbGF0aW9uLmNwcCBcCisrICBEcml2ZXIuY3BwIFwKKysgIERyaXZlck9wdGlvbnMuY3BwIFwKKysgIEpvYi5jcHAgXAorKyAgTXVsdGlsaWIuY3BwIFwKKysgIFBoYXNlcy5jcHAgXAorKyAgU2FuaXRpemVyQXJncy5jcHAgXAorKyAgVG9vbC5jcHAgXAorKyAgVG9vbENoYWluLmNwcCBcCisrICBUb29sQ2hhaW5zLmNwcCBcCisrICBUb29scy5jcHAgXAorKyAgVHlwZXMuY3BwIFwKKysgIFdpbmRvd3NUb29sQ2hhaW4uY3BwCisrCisrTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2xhbmdfZHJpdmVyX1NSQ19GSUxFUykKKysKKytMT0NBTF9NT0RVTEUgOj0gbGliY2xhbmdEcml2ZXIKKytMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorKworK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisrCisraW5jbHVkZSAkKENMQU5HX0hPU1RfQlVJTERfTUspCisraW5jbHVkZSAkKENMQU5HX1RCTEdFTl9SVUxFU19NSykKKytpbmNsdWRlICQoQ0xBTkdfVkVSU0lPTl9JTkNfTUspCisraW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCitkaWZmIC0tZ2l0IGEvbGliL0VkaXQvQW5kcm9pZC5tayBiL2xpYi9FZGl0L0FuZHJvaWQubWsKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi44N2Y0ZTI1CistLS0gL2Rldi9udWxsCisrKysgYi9saWIvRWRpdC9BbmRyb2lkLm1rCitAQCAtMCwwICsxLDMyIEBACisrTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisrCisrY2xhbmdfZWRpdF9TUkNfRklMRVMgOj0gXAorKyAgQ29tbWl0LmNwcCBcCisrICBFZGl0ZWRTb3VyY2UuY3BwIFwKKysgIFJld3JpdGVPYmpDRm91bmRhdGlvbkFQSS5jcHAKKysKKysKKysjIEZvciB0aGUgaG9zdCBvbmx5CisrIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorK2luY2x1ZGUgJChDTEVBUl9UQkxHRU5fVkFSUykKKysKKytUQkxHRU5fVEFCTEVTIDo9IFwKKysgIEF0dHJzLmluYyBcCisrICBBdHRyTGlzdC5pbmMgXAorKyAgQ29tbWVudENvbW1hbmRMaXN0LmluYyBcCisrICBDb21tZW50Tm9kZXMuaW5jIFwKKysgIERlY2xOb2Rlcy5pbmMgXAorKyAgRGlhZ25vc3RpY0NvbW1vbktpbmRzLmluYyBcCisrICBTdG10Tm9kZXMuaW5jCisrCisrTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2xhbmdfZWRpdF9TUkNfRklMRVMpCisrCisrTE9DQUxfTU9EVUxFOj0gbGliY2xhbmdFZGl0CisrCisrTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKysKKytpbmNsdWRlICQoQ0xBTkdfSE9TVF9CVUlMRF9NSykKKytpbmNsdWRlICQoQ0xBTkdfVkVSU0lPTl9JTkNfTUspCisraW5jbHVkZSAkKENMQU5HX1RCTEdFTl9SVUxFU19NSykKKytpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKK2RpZmYgLS1naXQgYS9saWIvRm9ybWF0L0FuZHJvaWQubWsgYi9saWIvRm9ybWF0L0FuZHJvaWQubWsKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zMDJmMjhmCistLS0gL2Rldi9udWxsCisrKysgYi9saWIvRm9ybWF0L0FuZHJvaWQubWsKK0BAIC0wLDAgKzEsNDMgQEAKKytMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKysKKysjIEZvciB0aGUgaG9zdCBvbmx5CisrIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorK2luY2x1ZGUgJChDTEVBUl9UQkxHRU5fVkFSUykKKysKKytUQkxHRU5fVEFCTEVTIDo9IFwKKysgIEF0dHJIYXNBdHRyaWJ1dGVJbXBsLmluYyBcCisrICBEaWFnbm9zdGljQVNUS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNBbmFseXNpc0tpbmRzLmluYyBcCisrICBEaWFnbm9zdGljQ29tbWVudEtpbmRzLmluYyBcCisrICBEaWFnbm9zdGljQ29tbW9uS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNEcml2ZXJLaW5kcy5pbmMgXAorKyAgRGlhZ25vc3RpY0Zyb250ZW5kS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNHcm91cHMuaW5jIFwKKysgIERpYWdub3N0aWNJbmRleE5hbWUuaW5jIFwKKysgIERpYWdub3N0aWNMZXhLaW5kcy5pbmMgXAorKyAgRGlhZ25vc3RpY1BhcnNlS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNTZW1hS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNTZXJpYWxpemF0aW9uS2luZHMuaW5jIFwKKysgIGFybV9uZW9uLmluYworKworK2NsYW5nX2Zvcm1hdF9TUkNfRklMRVMgOj0gXAorKyAgQnJlYWthYmxlVG9rZW4uY3BwIFwKKysgIENvbnRpbnVhdGlvbkluZGVudGVyLmNwcCBcCisrICBGb3JtYXQuY3BwIFwKKysgIEZvcm1hdFRva2VuLmNwcCBcCisrICBUb2tlbkFubm90YXRvci5jcHAgXAorKyAgVW53cmFwcGVkTGluZVBhcnNlci5jcHAgXAorKyAgV2hpdGVzcGFjZU1hbmFnZXIuY3BwCisrCisrTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2xhbmdfZm9ybWF0X1NSQ19GSUxFUykKKysKKytMT0NBTF9NT0RVTEU6PSBsaWJjbGFuZ0Zvcm1hdAorK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisrCisrTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKysKKytpbmNsdWRlICQoQ0xBTkdfSE9TVF9CVUlMRF9NSykKKytpbmNsdWRlICQoQ0xBTkdfVkVSU0lPTl9JTkNfTUspCisraW5jbHVkZSAkKENMQU5HX1RCTEdFTl9SVUxFU19NSykKKytpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKK2RpZmYgLS1naXQgYS9saWIvRnJvbnRlbmQvQW5kcm9pZC5tayBiL2xpYi9Gcm9udGVuZC9BbmRyb2lkLm1rCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYzNjNDJjMworLS0tIC9kZXYvbnVsbAorKysrIGIvbGliL0Zyb250ZW5kL0FuZHJvaWQubWsKK0BAIC0wLDAgKzEsNjYgQEAKKytMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKysKKysjIEZvciB0aGUgaG9zdCBvbmx5CisrIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorK2luY2x1ZGUgJChDTEVBUl9UQkxHRU5fVkFSUykKKysKKytUQkxHRU5fVEFCTEVTIDo9IFwKKysgIEF0dHJMaXN0LmluYyBcCisrICBBdHRycy5pbmMgXAorKyAgQXR0clBhcnNlZEF0dHJMaXN0LmluYyBcCisrICBBdHRyVmlzaXRvci5pbmMgXAorKyAgQ0MxT3B0aW9ucy5pbmMgXAorKyAgQ29tbWVudENvbW1hbmRMaXN0LmluYyBcCisrICBDb21tZW50Tm9kZXMuaW5jIFwKKysgIERpYWdub3N0aWNBU1RLaW5kcy5pbmMgXAorKyAgRGlhZ25vc3RpY0NvbW1vbktpbmRzLmluYyBcCisrICBEaWFnbm9zdGljRHJpdmVyS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNGcm9udGVuZEtpbmRzLmluYyBcCisrICBEaWFnbm9zdGljTGV4S2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNTZW1hS2luZHMuaW5jIFwKKysgIERlY2xOb2Rlcy5pbmMgXAorKyAgU3RtdE5vZGVzLmluYworKworK2NsYW5nX2Zyb250ZW5kX1NSQ19GSUxFUyA6PSBcCisrICBBU1RDb25zdW1lcnMuY3BwIFwKKysgIEFTVE1lcmdlLmNwcCBcCisrICBBU1RVbml0LmNwcCBcCisrICBDYWNoZVRva2Vucy5jcHAgXAorKyAgQ2hhaW5lZERpYWdub3N0aWNDb25zdW1lci5jcHAgXAorKyAgQ2hhaW5lZEluY2x1ZGVzU291cmNlLmNwcCBcCisrICBDb21waWxlckluc3RhbmNlLmNwcCBcCisrICBDb21waWxlckludm9jYXRpb24uY3BwIFwKKysgIENyZWF0ZUludm9jYXRpb25Gcm9tQ29tbWFuZExpbmUuY3BwIFwKKysgIERlcGVuZGVuY3lGaWxlLmNwcCBcCisrICBEZXBlbmRlbmN5R3JhcGguY3BwIFwKKysgIERpYWdub3N0aWNSZW5kZXJlci5jcHAgXAorKyAgRnJvbnRlbmRBY3Rpb24uY3BwIFwKKysgIEZyb250ZW5kQWN0aW9ucy5jcHAgXAorKyAgRnJvbnRlbmRPcHRpb25zLmNwcCBcCisrICBIZWFkZXJJbmNsdWRlR2VuLmNwcCBcCisrICBJbml0SGVhZGVyU2VhcmNoLmNwcCBcCisrICBJbml0UHJlcHJvY2Vzc29yLmNwcCBcCisrICBMYW5nU3RhbmRhcmRzLmNwcCBcCisrICBMYXlvdXRPdmVycmlkZVNvdXJjZS5jcHAgXAorKyAgTG9nRGlhZ25vc3RpY1ByaW50ZXIuY3BwIFwKKysgIE11bHRpcGxleENvbnN1bWVyLmNwcCBcCisrICBQcmludFByZXByb2Nlc3NlZE91dHB1dC5jcHAgXAorKyAgU2VyaWFsaXplZERpYWdub3N0aWNQcmludGVyLmNwcCBcCisrICBUZXh0RGlhZ25vc3RpYy5jcHAgXAorKyAgVGV4dERpYWdub3N0aWNCdWZmZXIuY3BwIFwKKysgIFRleHREaWFnbm9zdGljUHJpbnRlci5jcHAgXAorKyAgV2FybmluZ3MuY3BwIFwKKysgIFZlcmlmeURpYWdub3N0aWNDb25zdW1lci5jcHAKKysKKytMT0NBTF9TUkNfRklMRVMgOj0gJChjbGFuZ19mcm9udGVuZF9TUkNfRklMRVMpCisrCisrTE9DQUxfTU9EVUxFOj0gbGliY2xhbmdGcm9udGVuZAorK0xPQ0FMX01PRFVMRV9UQUdTOj0gb3B0aW9uYWwKKysKKytMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorKworK2luY2x1ZGUgJChDTEFOR19IT1NUX0JVSUxEX01LKQorK2luY2x1ZGUgJChDTEFOR19UQkxHRU5fUlVMRVNfTUspCisraW5jbHVkZSAkKENMQU5HX1ZFUlNJT05fSU5DX01LKQorK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorZGlmZiAtLWdpdCBhL2xpYi9Gcm9udGVuZFRvb2wvQW5kcm9pZC5tayBiL2xpYi9Gcm9udGVuZFRvb2wvQW5kcm9pZC5taworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjI0OTZmNmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2xpYi9Gcm9udGVuZFRvb2wvQW5kcm9pZC5taworQEAgLTAsMCArMSwyNCBAQAorK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorKworKyMgRm9yIHRoZSBob3N0IG9ubHkKKysjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisraW5jbHVkZSAkKENMRUFSX1RCTEdFTl9WQVJTKQorKworK0xPQ0FMX01PRFVMRTo9IGxpYmNsYW5nRnJvbnRlbmRUb29sCisrCisrTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKysKKytUQkxHRU5fVEFCTEVTIDo9IFwKKysgIERpYWdub3N0aWNDb21tb25LaW5kcy5pbmMgXAorKyAgRGlhZ25vc3RpY0Zyb250ZW5kS2luZHMuaW5jIFwKKysgIENDMU9wdGlvbnMuaW5jCisrCisrY2xhbmdfZnJvbnRlbmRfdG9vbF9TUkNfRklMRVMgOj0gXAorKyAgRXhlY3V0ZUNvbXBpbGVySW52b2NhdGlvbi5jcHAKKysKKytMT0NBTF9TUkNfRklMRVMgOj0gJChjbGFuZ19mcm9udGVuZF90b29sX1NSQ19GSUxFUykKKysKKytpbmNsdWRlICQoQ0xBTkdfSE9TVF9CVUlMRF9NSykKKytpbmNsdWRlICQoQ0xBTkdfVEJMR0VOX1JVTEVTX01LKQorK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorZGlmZiAtLWdpdCBhL2xpYi9IZWFkZXJzL0FuZHJvaWQubWsgYi9saWIvSGVhZGVycy9BbmRyb2lkLm1rCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMTE3MTI5ZQorLS0tIC9kZXYvbnVsbAorKysrIGIvbGliL0hlYWRlcnMvQW5kcm9pZC5taworQEAgLTAsMCArMSwxMSBAQAorK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorKworK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorKworKyQoVEFSR0VUX09VVF9IRUFERVJTKS9jbGFuZy9hcm1fbmVvbi5oOiBUQkxHRU5fTE9DQUxfTU9EVUxFIDo9IGFybV9uZW9uLmgKKyskKFRBUkdFVF9PVVRfSEVBREVSUykvY2xhbmcvYXJtX25lb24uaDogJChDTEFOR19ST09UX1BBVEgpL2luY2x1ZGUvY2xhbmcvQmFzaWMvYXJtX25lb24udGQgXAorKyAgICB8ICQoQ0xBTkdfVEJMR0VOKQorKwkkKGNhbGwgdHJhbnNmb3JtLWhvc3QtY2xhbmctdGQtdG8tb3V0LGFybS1uZW9uKQorKworKyMgTWFrZSBzdXJlIHdoZW4gY2xhbmcgaXMgdXNlZCwgYXJtX25lb24uaCBkb2VzIGV4aXN0LgorKyQoQ0xBTkcpOiB8ICQoVEFSR0VUX09VVF9IRUFERVJTKS9jbGFuZy9hcm1fbmVvbi5oCitkaWZmIC0tZ2l0IGEvbGliL0xleC9BbmRyb2lkLm1rIGIvbGliL0xleC9BbmRyb2lkLm1rCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYTVlOTY2MQorLS0tIC9kZXYvbnVsbAorKysrIGIvbGliL0xleC9BbmRyb2lkLm1rCitAQCAtMCwwICsxLDQ1IEBACisrTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisrCisrIyBGb3IgdGhlIGhvc3Qgb25seQorKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKytpbmNsdWRlICQoQ0xFQVJfVkFSUykKKytpbmNsdWRlICQoQ0xFQVJfVEJMR0VOX1ZBUlMpCisrCisrVEJMR0VOX1RBQkxFUyA6PSBcCisrICBEaWFnbm9zdGljTGV4S2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNDb21tb25LaW5kcy5pbmMKKysKKytjbGFuZ19sZXhfU1JDX0ZJTEVTIDo9IFwKKysgIEhlYWRlck1hcC5jcHAgXAorKyAgSGVhZGVyU2VhcmNoLmNwcCBcCisrICBMZXhlci5jcHAgXAorKyAgTGl0ZXJhbFN1cHBvcnQuY3BwIFwKKysgIE1hY3JvQXJncy5jcHAgXAorKyAgTWFjcm9JbmZvLmNwcCBcCisrICBNb2R1bGVNYXAuY3BwIFwKKysgIFBQQ2FjaGluZy5jcHAgXAorKyAgUFBDYWxsYmFja3MuY3BwIFwKKysgIFBQQ29uZGl0aW9uYWxEaXJlY3RpdmVSZWNvcmQuY3BwIFwKKysgIFBQRGlyZWN0aXZlcy5jcHAgXAorKyAgUFBFeHByZXNzaW9ucy5jcHAgXAorKyAgUFBMZXhlckNoYW5nZS5jcHAgXAorKyAgUFBNYWNyb0V4cGFuc2lvbi5jcHAgXAorKyAgUFRITGV4ZXIuY3BwIFwKKysgIFByYWdtYS5jcHAgXAorKyAgUHJlcHJvY2Vzc2luZ1JlY29yZC5jcHAgXAorKyAgUHJlcHJvY2Vzc29yLmNwcCBcCisrICBQcmVwcm9jZXNzb3JMZXhlci5jcHAgXAorKyAgU2NyYXRjaEJ1ZmZlci5jcHAgXAorKyAgVG9rZW5Db25jYXRlbmF0aW9uLmNwcCBcCisrICBUb2tlbkxleGVyLmNwcAorKworK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNsYW5nX2xleF9TUkNfRklMRVMpCisrCisrTE9DQUxfTU9EVUxFOj0gbGliY2xhbmdMZXgKKytMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorKworK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisrCisraW5jbHVkZSAkKENMQU5HX0hPU1RfQlVJTERfTUspCisraW5jbHVkZSAkKENMQU5HX1RCTEdFTl9SVUxFU19NSykKKytpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKK2RpZmYgLS1naXQgYS9saWIvUGFyc2UvQW5kcm9pZC5tayBiL2xpYi9QYXJzZS9BbmRyb2lkLm1rCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNWJjMjIwMAorLS0tIC9kZXYvbnVsbAorKysrIGIvbGliL1BhcnNlL0FuZHJvaWQubWsKK0BAIC0wLDAgKzEsNDcgQEAKKytMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKysKKysjIEZvciB0aGUgaG9zdCBvbmx5CisrIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorK2luY2x1ZGUgJChDTEVBUl9UQkxHRU5fVkFSUykKKysKKytUQkxHRU5fVEFCTEVTIDo9ICBcCisrCUF0dHJMaXN0LmluYyAgXAorKwlBdHRyUGFyc2VkQXR0ckxpc3QuaW5jICBcCisrCUF0dHJzLmluYyAgXAorKyAgICAgICAgQXR0clZpc2l0b3IuaW5jIFwKKysgICAgICAgIEF0dHJQYXJzZXJTdHJpbmdTd2l0Y2hlcy5pbmMgXAorKwlDb21tZW50Q29tbWFuZExpc3QuaW5jIFwKKysJQ29tbWVudE5vZGVzLmluYyBcCisrCURlY2xOb2Rlcy5pbmMgIFwKKysJRGlhZ25vc3RpY1BhcnNlS2luZHMuaW5jICBcCisrICAgICAgICBEaWFnbm9zdGljQ29tbW9uS2luZHMuaW5jICBcCisrCURpYWdub3N0aWNTZW1hS2luZHMuaW5jCVwKKysJU3RtdE5vZGVzLmluYworKworK2NsYW5nX3BhcnNlX1NSQ19GSUxFUyA6PSAgXAorKwlQYXJzZUFTVC5jcHAgIFwKKysJUGFyc2VDWFhJbmxpbmVNZXRob2RzLmNwcCAgXAorKwlQYXJzZURlY2wuY3BwICBcCisrCVBhcnNlRGVjbENYWC5jcHAgIFwKKysJUGFyc2VFeHByLmNwcCAgXAorKwlQYXJzZUV4cHJDWFguY3BwICBcCisrCVBhcnNlSW5pdC5jcHAgIFwKKysJUGFyc2VPYmpjLmNwcCAgXAorKwlQYXJzZU9wZW5NUC5jcHAgIFwKKysJUGFyc2VQcmFnbWEuY3BwICBcCisrCVBhcnNlU3RtdC5jcHAgIFwKKysJUGFyc2VUZW1wbGF0ZS5jcHAgIFwKKysJUGFyc2VUZW50YXRpdmUuY3BwICBcCisrCVBhcnNlci5jcHAKKysKKytMT0NBTF9TUkNfRklMRVMgOj0gJChjbGFuZ19wYXJzZV9TUkNfRklMRVMpCisrCisrTE9DQUxfTU9EVUxFOj0gbGliY2xhbmdQYXJzZQorK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisrCisrTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKysKKytpbmNsdWRlICQoQ0xBTkdfSE9TVF9CVUlMRF9NSykKKytpbmNsdWRlICQoQ0xBTkdfVEJMR0VOX1JVTEVTX01LKQorK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorZGlmZiAtLWdpdCBhL2xpYi9SZXdyaXRlL0NvcmUvQW5kcm9pZC5tayBiL2xpYi9SZXdyaXRlL0NvcmUvQW5kcm9pZC5taworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjU0NmZjMDQKKy0tLSAvZGV2L251bGwKKysrKyBiL2xpYi9SZXdyaXRlL0NvcmUvQW5kcm9pZC5taworQEAgLTAsMCArMSwzNCBAQAorK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorKworKyMgRm9yIHRoZSBob3N0IG9ubHkKKysjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisraW5jbHVkZSAkKENMRUFSX1RCTEdFTl9WQVJTKQorKworK0xPQ0FMX01PRFVMRTo9IGxpYmNsYW5nUmV3cml0ZUNvcmUKKysKKytMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorKworK1RCTEdFTl9UQUJMRVMgOj0gXAorKyAgQXR0ckxpc3QuaW5jIFwKKysgIEF0dHJzLmluYyBcCisrICBBdHRyUGFyc2VkQXR0ckxpc3QuaW5jIFwKKysgIENvbW1lbnROb2Rlcy5pbmMgXAorKyAgRGVjbE5vZGVzLmluYyBcCisrICBEaWFnbm9zdGljQ29tbW9uS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNGcm9udGVuZEtpbmRzLmluYyBcCisrICBTdG10Tm9kZXMuaW5jCisrCisrY2xhbmdfcmV3cml0ZV9jb3JlX1NSQ19GSUxFUyA6PSBcCisrICBEZWx0YVRyZWUuY3BwIFwKKysgIEhUTUxSZXdyaXRlLmNwcCBcCisrICBSZXdyaXRlUm9wZS5jcHAgXAorKyAgUmV3cml0ZXIuY3BwIFwKKysgIFRva2VuUmV3cml0ZXIuY3BwCisrCisrTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2xhbmdfcmV3cml0ZV9jb3JlX1NSQ19GSUxFUykKKysKKysKKytpbmNsdWRlICQoQ0xBTkdfSE9TVF9CVUlMRF9NSykKKytpbmNsdWRlICQoQ0xBTkdfVEJMR0VOX1JVTEVTX01LKQorK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorZGlmZiAtLWdpdCBhL2xpYi9SZXdyaXRlL0Zyb250ZW5kL0FuZHJvaWQubWsgYi9saWIvUmV3cml0ZS9Gcm9udGVuZC9BbmRyb2lkLm1rCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMmJiZjMxMQorLS0tIC9kZXYvbnVsbAorKysrIGIvbGliL1Jld3JpdGUvRnJvbnRlbmQvQW5kcm9pZC5taworQEAgLTAsMCArMSwzOCBAQAorK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorKworKyMgRm9yIHRoZSBob3N0IG9ubHkKKysjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisraW5jbHVkZSAkKENMRUFSX1RCTEdFTl9WQVJTKQorKworK0xPQ0FMX01PRFVMRTo9IGxpYmNsYW5nUmV3cml0ZUZyb250ZW5kCisrCisrTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKysKKytUQkxHRU5fVEFCTEVTIDo9IFwKKysgIEF0dHJMaXN0LmluYyBcCisrICBBdHRycy5pbmMgXAorKyAgQXR0clBhcnNlZEF0dHJMaXN0LmluYyBcCisrICBDb21tZW50Q29tbWFuZExpc3QuaW5jIFwKKysgIENvbW1lbnROb2Rlcy5pbmMgXAorKyAgRGVjbE5vZGVzLmluYyBcCisrICBEaWFnbm9zdGljQ29tbW9uS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNGcm9udGVuZEtpbmRzLmluYyBcCisrICBTdG10Tm9kZXMuaW5jCisrCisrY2xhbmdfcmV3cml0ZV9mcm9udGVuZF9TUkNfRklMRVMgOj0gXAorKyAgRml4SXRSZXdyaXRlci5jcHAgXAorKyAgRnJvbnRlbmRBY3Rpb25zLmNwcCBcCisrICBIVE1MUHJpbnQuY3BwIFwKKysgIEluY2x1c2lvblJld3JpdGVyLmNwcCBcCisrICBSZXdyaXRlTWFjcm9zLmNwcCBcCisrICBSZXdyaXRlTW9kZXJuT2JqQy5jcHAgXAorKyAgUmV3cml0ZU9iakMuY3BwIFwKKysgIFJld3JpdGVUZXN0LmNwcAorKworK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNsYW5nX3Jld3JpdGVfZnJvbnRlbmRfU1JDX0ZJTEVTKQorKworKworK2luY2x1ZGUgJChDTEFOR19IT1NUX0JVSUxEX01LKQorK2luY2x1ZGUgJChDTEFOR19UQkxHRU5fUlVMRVNfTUspCisraW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCitkaWZmIC0tZ2l0IGEvbGliL1NlbWEvQW5kcm9pZC5tayBiL2xpYi9TZW1hL0FuZHJvaWQubWsKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43N2EyZTkzCistLS0gL2Rldi9udWxsCisrKysgYi9saWIvU2VtYS9BbmRyb2lkLm1rCitAQCAtMCwwICsxLDg0IEBACisrTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisrCisrIyBGb3IgdGhlIGhvc3Qgb25seQorKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKytpbmNsdWRlICQoQ0xFQVJfVkFSUykKKytpbmNsdWRlICQoQ0xFQVJfVEJMR0VOX1ZBUlMpCisrCisrVEJMR0VOX1RBQkxFUyA6PSAgICBcCisrCUF0dHJMaXN0LmluYwlcCisrCUF0dHJzLmluYwlcCisrCUF0dHJQYXJzZWRBdHRyS2luZHMuaW5jICAgIFwKKysJQXR0clBhcnNlZEF0dHJJbXBsLmluYyAgICBcCisrCUF0dHJQYXJzZWRBdHRyTGlzdC5pbmMgICAgXAorKwlBdHRyU3BlbGxpbmdMaXN0SW5kZXguaW5jIFwKKysJQXR0clRlbXBsYXRlSW5zdGFudGlhdGUuaW5jCVwKKysgICAgICAgIEF0dHJWaXNpdG9yLmluYyBcCisrCUNvbW1lbnRDb21tYW5kTGlzdC5pbmMgXAorKwlDb21tZW50Tm9kZXMuaW5jIFwKKysJRGVjbE5vZGVzLmluYwlcCisrCURpYWdub3N0aWNBU1RLaW5kcy5pbmMJXAorKwlEaWFnbm9zdGljU2VtYUtpbmRzLmluYwlcCisrCURpYWdub3N0aWNQYXJzZUtpbmRzLmluYwlcCisrCURpYWdub3N0aWNDb21tZW50S2luZHMuaW5jIFwKKysJRGlhZ25vc3RpY0NvbW1vbktpbmRzLmluYwlcCisrCVN0bXROb2Rlcy5pbmMJXAorKwlhcm1fbmVvbi5pbmMKKysKKytjbGFuZ19zZW1hX1NSQ19GSUxFUyA6PQlcCisrCUFuYWx5c2lzQmFzZWRXYXJuaW5ncy5jcHAJXAorKwlBdHRyaWJ1dGVMaXN0LmNwcAlcCisrCUNvZGVDb21wbGV0ZUNvbnN1bWVyLmNwcAlcCisrCURlY2xTcGVjLmNwcAlcCisrCUlkZW50aWZpZXJSZXNvbHZlci5jcHAJXAorKwlEZWxheWVkRGlhZ25vc3RpYy5jcHAgXAorKwlKdW1wRGlhZ25vc3RpY3MuY3BwCVwKKysJTXVsdGlwbGV4RXh0ZXJuYWxTZW1hU291cmNlLmNwcCBcCisrCVNjb3BlLmNwcCBcCisrCVNjb3BlSW5mby5jcHAgXAorKwlTZW1hLmNwcAlcCisrCVNlbWFBY2Nlc3MuY3BwCVwKKysJU2VtYUF0dHIuY3BwCVwKKysJU2VtYUNYWFNjb3BlU3BlYy5jcHAJXAorKwlTZW1hQ2FzdC5jcHAgXAorKwlTZW1hQ2hlY2tpbmcuY3BwCVwKKysJU2VtYUNvZGVDb21wbGV0ZS5jcHAJXAorKwlTZW1hQ29uc3VtZXIuY3BwCVwKKysJU2VtYURlY2wuY3BwCVwKKysJU2VtYURlY2xBdHRyLmNwcAlcCisrCVNlbWFEZWNsQ1hYLmNwcAlcCisrCVNlbWFEZWNsT2JqQy5jcHAJXAorKwlTZW1hRXhjZXB0aW9uU3BlYy5jcHAJXAorKwlTZW1hRXhwci5jcHAJXAorKwlTZW1hRXhwckNYWC5jcHAJXAorKwlTZW1hRXhwck1lbWJlci5jcHAgXAorKwlTZW1hRXhwck9iakMuY3BwCVwKKysJU2VtYUZpeEl0VXRpbHMuY3BwIFwKKysJU2VtYUluaXQuY3BwCVwKKysJU2VtYUxhbWJkYS5jcHAJXAorKwlTZW1hTG9va3VwLmNwcAlcCisrCVNlbWFPYmpDUHJvcGVydHkuY3BwCVwKKysJU2VtYU9wZW5NUC5jcHAJXAorKwlTZW1hT3ZlcmxvYWQuY3BwCVwKKysJU2VtYVBzZXVkb09iamVjdC5jcHAJXAorKwlTZW1hU3RtdC5jcHAJXAorKyAgICAgICAgU2VtYVN0bXRBc20uY3BwIFwKKysgICAgICAgIFNlbWFTdG10QXR0ci5jcHAgXAorKwlTZW1hVGVtcGxhdGUuY3BwCVwKKysJU2VtYVRlbXBsYXRlRGVkdWN0aW9uLmNwcAlcCisrCVNlbWFUZW1wbGF0ZUluc3RhbnRpYXRlLmNwcAlcCisrCVNlbWFUZW1wbGF0ZUluc3RhbnRpYXRlRGVjbC5jcHAJXAorKwlTZW1hVGVtcGxhdGVWYXJpYWRpYy5jcHAJXAorKwlTZW1hVHlwZS5jcHAJXAorKwlUeXBlTG9jQnVpbGRlci5jcHAKKysKKytMT0NBTF9TUkNfRklMRVMgOj0gJChjbGFuZ19zZW1hX1NSQ19GSUxFUykKKysKKytMT0NBTF9NT0RVTEU6PSBsaWJjbGFuZ1NlbWEKKytMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorKworK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisrCisraW5jbHVkZSAkKENMQU5HX0hPU1RfQlVJTERfTUspCisraW5jbHVkZSAkKENMQU5HX1RCTEdFTl9SVUxFU19NSykKKytpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKK2RpZmYgLS1naXQgYS9saWIvU2VyaWFsaXphdGlvbi9BbmRyb2lkLm1rIGIvbGliL1NlcmlhbGl6YXRpb24vQW5kcm9pZC5taworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjc1MWUzMDYKKy0tLSAvZGV2L251bGwKKysrKyBiL2xpYi9TZXJpYWxpemF0aW9uL0FuZHJvaWQubWsKK0BAIC0wLDAgKzEsNDYgQEAKKytMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKysKKysjIEZvciB0aGUgaG9zdCBvbmx5CisrIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorK2luY2x1ZGUgJChDTEVBUl9UQkxHRU5fVkFSUykKKysKKytMT0NBTF9NT0RVTEU6PSBsaWJjbGFuZ1NlcmlhbGl6YXRpb24KKysKKytMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorKworK1RCTEdFTl9UQUJMRVMgOj0gXAorKyAgQXR0ckxpc3QuaW5jIFwKKysgIEF0dHJQYXJzZWRBdHRyTGlzdC5pbmMgXAorKyAgQXR0clBDSFJlYWQuaW5jIFwKKysgIEF0dHJQQ0hXcml0ZS5pbmMgXAorKyAgQXR0cnMuaW5jIFwKKysgIENvbW1lbnRDb21tYW5kTGlzdC5pbmMgXAorKyAgQ29tbWVudE5vZGVzLmluYyBcCisrICBEZWNsTm9kZXMuaW5jIFwKKysgIERpYWdub3N0aWNDb21tb25LaW5kcy5pbmMgXAorKyAgRGlhZ25vc3RpY0Zyb250ZW5kS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNTZW1hS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNTZXJpYWxpemF0aW9uS2luZHMuaW5jIFwKKysgIFN0bXROb2Rlcy5pbmMKKysKKytjbGFuZ19zZXJpYWxpemF0aW9uX1NSQ19GSUxFUyA6PVwKKysgIEFTVENvbW1vbi5jcHAgXAorKyAgQVNUUmVhZGVyLmNwcCBcCisrICBBU1RSZWFkZXJEZWNsLmNwcCBcCisrICBBU1RSZWFkZXJTdG10LmNwcCBcCisrICBBU1RXcml0ZXIuY3BwIFwKKysgIEFTVFdyaXRlckRlY2wuY3BwIFwKKysgIEFTVFdyaXRlclN0bXQuY3BwIFwKKysgIEdlbmVyYXRlUENILmNwcCBcCisrICBHbG9iYWxNb2R1bGVJbmRleC5jcHAgXAorKyAgTW9kdWxlLmNwcCBcCisrICBNb2R1bGVNYW5hZ2VyLmNwcAorKworK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNsYW5nX3NlcmlhbGl6YXRpb25fU1JDX0ZJTEVTKQorKworKworK2luY2x1ZGUgJChDTEFOR19IT1NUX0JVSUxEX01LKQorK2luY2x1ZGUgJChDTEFOR19UQkxHRU5fUlVMRVNfTUspCisraW5jbHVkZSAkKENMQU5HX1ZFUlNJT05fSU5DX01LKQorK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9DaGVja2Vycy9BbmRyb2lkLm1rIGIvbGliL1N0YXRpY0FuYWx5emVyL0NoZWNrZXJzL0FuZHJvaWQubWsKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iYjJhNTM5CistLS0gL2Rldi9udWxsCisrKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMvQW5kcm9pZC5taworQEAgLTAsMCArMSwxMDAgQEAKKytMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKysKKytjbGFuZ19zdGF0aWNfYW5hbHl6ZXJfY2hlY2tlcnNfVEJMR0VOX1RBQkxFUyA6PSBcCisrICBBdHRyS2luZHMuaW5jIFwKKysgIEF0dHJMaXN0LmluYyBcCisrICBBdHRyUGFyc2VkQXR0ckxpc3QuaW5jIFwKKysgIEF0dHJzLmluYyBcCisrICBBdHRyVmlzaXRvci5pbmMgXAorKyAgQ2hlY2tlcnMuaW5jIFwKKysgIENvbW1lbnRDb21tYW5kTGlzdC5pbmMgXAorKyAgQ29tbWVudE5vZGVzLmluYyBcCisrICBEZWNsTm9kZXMuaW5jIFwKKysgIERpYWdub3N0aWNDb21tb25LaW5kcy5pbmMgXAorKyAgU3RtdE5vZGVzLmluYworKworK2NsYW5nX3N0YXRpY19hbmFseXplcl9jaGVja2Vyc19TUkNfRklMRVMgOj0gXAorKyAgQWxsb2NhdGlvbkRpYWdub3N0aWNzLmNwcCBcCisrICBBbmFseXplclN0YXRzQ2hlY2tlci5jcHAgXAorKyAgQXJyYXlCb3VuZENoZWNrZXIuY3BwIFwKKysgIEFycmF5Qm91bmRDaGVja2VyVjIuY3BwIFwKKysgIEJhc2ljT2JqQ0ZvdW5kYXRpb25DaGVja3MuY3BwIFwKKysgIEJvb2xBc3NpZ25tZW50Q2hlY2tlci5jcHAgXAorKyAgQnVpbHRpbkZ1bmN0aW9uQ2hlY2tlci5jcHAgXAorKyAgQ1N0cmluZ0NoZWNrZXIuY3BwIFwKKysgIENTdHJpbmdTeW50YXhDaGVja2VyLmNwcCBcCisrICBDYWxsQW5kTWVzc2FnZUNoZWNrZXIuY3BwIFwKKysgIENhc3RTaXplQ2hlY2tlci5jcHAgXAorKyAgQ2FzdFRvU3RydWN0Q2hlY2tlci5jcHAgXAorKyAgQ2hlY2tPYmpDRGVhbGxvYy5jcHAgXAorKyAgQ2hlY2tPYmpDSW5zdE1ldGhTaWduYXR1cmUuY3BwIFwKKysgIENoZWNrU2VjdXJpdHlTeW50YXhPbmx5LmNwcCBcCisrICBDaGVja1NpemVvZlBvaW50ZXIuY3BwIFwKKysgIENoZWNrZXJEb2N1bWVudGF0aW9uLmNwcCBcCisrICBDaHJvb3RDaGVja2VyLmNwcCBcCisrICBDbGFuZ0NoZWNrZXJzLmNwcCBcCisrICBEZWFkU3RvcmVzQ2hlY2tlci5jcHAgXAorKyAgRGVidWdDaGVja2Vycy5jcHAgXAorKyAgRGVyZWZlcmVuY2VDaGVja2VyLmNwcCBcCisrICBEaXJlY3RJdmFyQXNzaWdubWVudC5jcHAgXAorKyAgRGl2WmVyb0NoZWNrZXIuY3BwIFwKKysgIER5bmFtaWNUeXBlUHJvcGFnYXRpb24uY3BwIFwKKysgIEV4cHJJbnNwZWN0aW9uQ2hlY2tlci5jcHAgXAorKyAgRml4ZWRBZGRyZXNzQ2hlY2tlci5jcHAgXAorKyAgR2VuZXJpY1RhaW50Q2hlY2tlci5jcHAgXAorKyAgSWRlbnRpY2FsRXhwckNoZWNrZXIuY3BwIFwKKysgIEl2YXJJbnZhbGlkYXRpb25DaGVja2VyLmNwcCBcCisrICBMTFZNQ29udmVudGlvbnNDaGVja2VyLmNwcCBcCisrICBNYWNPU0tleWNoYWluQVBJQ2hlY2tlci5jcHAgXAorKyAgTWFjT1NYQVBJQ2hlY2tlci5jcHAgXAorKyAgTWFsbG9jQ2hlY2tlci5jcHAgXAorKyAgTWFsbG9jT3ZlcmZsb3dTZWN1cml0eUNoZWNrZXIuY3BwIFwKKysgIE1hbGxvY1NpemVvZkNoZWNrZXIuY3BwIFwKKysgIE5TQXV0b3JlbGVhc2VQb29sQ2hlY2tlci5jcHAgXAorKyAgTlNFcnJvckNoZWNrZXIuY3BwIFwKKysgIE5vUmV0dXJuRnVuY3Rpb25DaGVja2VyLmNwcCBcCisrICBOb25OdWxsUGFyYW1DaGVja2VyLmNwcCBcCisrICBPYmpDQXRTeW5jQ2hlY2tlci5jcHAgXAorKyAgT2JqQ0NvbnRhaW5lcnNBU1RDaGVja2VyLmNwcCBcCisrICBPYmpDQ29udGFpbmVyc0NoZWNrZXIuY3BwIFwKKysgIE9iakNNaXNzaW5nU3VwZXJDYWxsQ2hlY2tlci5jcHAgXAorKyAgT2JqQ1NlbGZJbml0Q2hlY2tlci5jcHAgXAorKyAgT2JqQ1VudXNlZElWYXJzQ2hlY2tlci5jcHAgXAorKyAgUG9pbnRlckFyaXRoQ2hlY2tlci5jcHAgXAorKyAgUG9pbnRlclN1YkNoZWNrZXIuY3BwIFwKKysgIFB0aHJlYWRMb2NrQ2hlY2tlci5jcHAgXAorKyAgUmV0YWluQ291bnRDaGVja2VyLmNwcCBcCisrICBSZXR1cm5Qb2ludGVyUmFuZ2VDaGVja2VyLmNwcCBcCisrICBSZXR1cm5VbmRlZkNoZWNrZXIuY3BwIFwKKysgIFNpbXBsZVN0cmVhbUNoZWNrZXIuY3BwIFwKKysgIFN0YWNrQWRkckVzY2FwZUNoZWNrZXIuY3BwIFwKKysgIFN0cmVhbUNoZWNrZXIuY3BwIFwKKysgIFRhaW50VGVzdGVyQ2hlY2tlci5jcHAgXAorKyAgVHJhdmVyc2FsQ2hlY2tlci5jcHAgXAorKyAgVW5kZWZCcmFuY2hDaGVja2VyLmNwcCBcCisrICBVbmRlZkNhcHR1cmVkQmxvY2tWYXJDaGVja2VyLmNwcCBcCisrICBVbmRlZlJlc3VsdENoZWNrZXIuY3BwIFwKKysgIFVuZGVmaW5lZEFycmF5U3Vic2NyaXB0Q2hlY2tlci5jcHAgXAorKyAgVW5kZWZpbmVkQXNzaWdubWVudENoZWNrZXIuY3BwIFwKKysgIFVuaXhBUElDaGVja2VyLmNwcCBcCisrICBVbnJlYWNoYWJsZUNvZGVDaGVja2VyLmNwcCBcCisrICBWaXJ0dWFsQ2FsbENoZWNrZXIuY3BwIFwKKysgIFZMQVNpemVDaGVja2VyLmNwcAorKworKyMgRm9yIHRoZSBob3N0IG9ubHkKKysjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisraW5jbHVkZSAkKENMRUFSX1RCTEdFTl9WQVJTKQorKworK1RCTEdFTl9UQUJMRVMgOj0gJChjbGFuZ19zdGF0aWNfYW5hbHl6ZXJfY2hlY2tlcnNfVEJMR0VOX1RBQkxFUykKKysKKytMT0NBTF9TUkNfRklMRVMgOj0gJChjbGFuZ19zdGF0aWNfYW5hbHl6ZXJfY2hlY2tlcnNfU1JDX0ZJTEVTKQorKworK0xPQ0FMX01PRFVMRTo9IGxpYmNsYW5nU3RhdGljQW5hbHl6ZXJDaGVja2VycworKworK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisrCisraW5jbHVkZSAkKENMQU5HX0hPU1RfQlVJTERfTUspCisraW5jbHVkZSAkKENMQU5HX1RCTEdFTl9SVUxFU19NSykKKytpbmNsdWRlICQoQ0xBTkdfVkVSU0lPTl9JTkNfTUspCisraW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCitkaWZmIC0tZ2l0IGEvbGliL1N0YXRpY0FuYWx5emVyL0NvcmUvQW5kcm9pZC5tayBiL2xpYi9TdGF0aWNBbmFseXplci9Db3JlL0FuZHJvaWQubWsKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi42OGQyYzM2CistLS0gL2Rldi9udWxsCisrKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvQ29yZS9BbmRyb2lkLm1rCitAQCAtMCwwICsxLDY4IEBACisrTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisrCisrY2xhbmdfc3RhdGljX2FuYWx5emVyX2NvcmVfVEJMR0VOX1RBQkxFUyA6PSBcCisrICBBdHRyTGlzdC5pbmMgXAorKyAgQXR0cnMuaW5jIFwKKysgIENvbW1lbnRDb21tYW5kTGlzdC5pbmMgXAorKyAgQ29tbWVudE5vZGVzLmluYyBcCisrICBEZWNsTm9kZXMuaW5jIFwKKysgIERpYWdub3N0aWNDb21tb25LaW5kcy5pbmMgXAorKyAgU3RtdE5vZGVzLmluYworKworK2NsYW5nX3N0YXRpY19hbmFseXplcl9jb3JlX1NSQ19GSUxFUyA6PSBcCisrICBBbmFseXNpc01hbmFnZXIuY3BwIFwKKysgIEFuYWx5emVyT3B0aW9ucy5jcHAgXAorKyAgQVBTSW50VHlwZS5jcHAgXAorKyAgQmFzaWNWYWx1ZUZhY3RvcnkuY3BwIFwKKysgIEJsb2NrQ291bnRlci5jcHAgXAorKyAgQnVnUmVwb3J0ZXIuY3BwIFwKKysgIEJ1Z1JlcG9ydGVyVmlzaXRvcnMuY3BwIFwKKysgIENhbGxFdmVudC5jcHAgXAorKyAgQ2hlY2tlci5jcHAgXAorKyAgQ2hlY2tlckNvbnRleHQuY3BwIFwKKysgIENoZWNrZXJIZWxwZXJzLmNwcCBcCisrICBDaGVja2VyTWFuYWdlci5jcHAgXAorKyAgQ2hlY2tlclJlZ2lzdHJ5LmNwcCBcCisrICBDb21tb25CdWdDYXRlZ29yaWVzLmNwcCBcCisrICBDb25zdHJhaW50TWFuYWdlci5jcHAgXAorKyAgQ29yZUVuZ2luZS5jcHAgXAorKyAgRW52aXJvbm1lbnQuY3BwIFwKKysgIEV4cGxvZGVkR3JhcGguY3BwIFwKKysgIEV4cHJFbmdpbmUuY3BwIFwKKysgIEV4cHJFbmdpbmVDLmNwcCBcCisrICBFeHByRW5naW5lQ1hYLmNwcCBcCisrICBFeHByRW5naW5lQ2FsbEFuZFJldHVybi5jcHAgXAorKyAgRXhwckVuZ2luZU9iakMuY3BwIFwKKysgIEZ1bmN0aW9uU3VtbWFyeS5jcHAgXAorKyAgSFRNTERpYWdub3N0aWNzLmNwcCBcCisrICBNZW1SZWdpb24uY3BwIFwKKysgIFBhdGhEaWFnbm9zdGljLmNwcCBcCisrICBQbGlzdERpYWdub3N0aWNzLmNwcCBcCisrICBQcm9ncmFtU3RhdGUuY3BwIFwKKysgIFJhbmdlQ29uc3RyYWludE1hbmFnZXIuY3BwIFwKKysgIFJlZ2lvblN0b3JlLmNwcCBcCisrICBTVmFsQnVpbGRlci5jcHAgXAorKyAgU1ZhbHMuY3BwIFwKKysgIFNpbXBsZUNvbnN0cmFpbnRNYW5hZ2VyLmNwcCBcCisrICBTaW1wbGVTVmFsQnVpbGRlci5jcHAgXAorKyAgU3RvcmUuY3BwIFwKKysgIFN1YkVuZ2luZS5jcHAgXAorKyAgU3ltYm9sTWFuYWdlci5jcHAKKysKKysjIEZvciB0aGUgaG9zdCBvbmx5CisrIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorK2luY2x1ZGUgJChDTEVBUl9UQkxHRU5fVkFSUykKKysKKytUQkxHRU5fVEFCTEVTIDo9ICQoY2xhbmdfc3RhdGljX2FuYWx5emVyX2NvcmVfVEJMR0VOX1RBQkxFUykKKysKKytMT0NBTF9TUkNfRklMRVMgOj0gJChjbGFuZ19zdGF0aWNfYW5hbHl6ZXJfY29yZV9TUkNfRklMRVMpCisrCisrTE9DQUxfTU9EVUxFOj0gbGliY2xhbmdTdGF0aWNBbmFseXplckNvcmUKKysKKytMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorKworK2luY2x1ZGUgJChDTEFOR19IT1NUX0JVSUxEX01LKQorK2luY2x1ZGUgJChDTEFOR19UQkxHRU5fUlVMRVNfTUspCisraW5jbHVkZSAkKENMQU5HX1ZFUlNJT05fSU5DX01LKQorK2luY2x1ZGUgJChCVUlMRF9IT1NUX1NUQVRJQ19MSUJSQVJZKQorZGlmZiAtLWdpdCBhL2xpYi9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9BbmRyb2lkLm1rIGIvbGliL1N0YXRpY0FuYWx5emVyL0Zyb250ZW5kL0FuZHJvaWQubWsKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5jY2ZmZGFkCistLS0gL2Rldi9udWxsCisrKysgYi9saWIvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvQW5kcm9pZC5taworQEAgLTAsMCArMSw0MCBAQAorK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorKworK2NsYW5nX3N0YXRpY19hbmFseXplcl9mcm9udGVuZF9DX0lOQ0xVREVTIDo9IFwKKysgICQoQ0xBTkdfUk9PVF9QQVRIKS9saWIvU3RhdGljQW5hbHl6ZXIvQ2hlY2tlcnMKKysKKytjbGFuZ19zdGF0aWNfYW5hbHl6ZXJfZnJvbnRlbmRfVEJMR0VOX1RBQkxFUyA6PSBcCisrICBBdHRyTGlzdC5pbmMgXAorKyAgQXR0cnMuaW5jIFwKKysgIEF0dHJWaXNpdG9yLmluYyBcCisrICBDb21tZW50Q29tbWFuZExpc3QuaW5jIFwKKysgIENvbW1lbnROb2Rlcy5pbmMgXAorKyAgRGVjbE5vZGVzLmluYyBcCisrICBEaWFnbm9zdGljQ29tbW9uS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNGcm9udGVuZEtpbmRzLmluYyBcCisrICBTdG10Tm9kZXMuaW5jCisrCisrY2xhbmdfc3RhdGljX2FuYWx5emVyX2Zyb250ZW5kX1NSQ19GSUxFUyA6PSBcCisrICBBbmFseXNpc0NvbnN1bWVyLmNwcCBcCisrICBDaGVja2VyUmVnaXN0cmF0aW9uLmNwcCBcCisrICBGcm9udGVuZEFjdGlvbnMuY3BwCisrCisrIyBGb3IgdGhlIGhvc3Qgb25seQorKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKytpbmNsdWRlICQoQ0xFQVJfVkFSUykKKytpbmNsdWRlICQoQ0xFQVJfVEJMR0VOX1ZBUlMpCisrCisrVEJMR0VOX1RBQkxFUyA6PSAkKGNsYW5nX3N0YXRpY19hbmFseXplcl9mcm9udGVuZF9UQkxHRU5fVEFCTEVTKQorKworK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNsYW5nX3N0YXRpY19hbmFseXplcl9mcm9udGVuZF9TUkNfRklMRVMpCisrCisrTE9DQUxfQ19JTkNMVURFUyA6PSAkKGNsYW5nX3N0YXRpY19hbmFseXplcl9mcm9udGVuZF9DX0lOQ0xVREVTKQorKworK0xPQ0FMX01PRFVMRTo9IGxpYmNsYW5nU3RhdGljQW5hbHl6ZXJGcm9udGVuZAorKworK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisrCisraW5jbHVkZSAkKENMQU5HX0hPU1RfQlVJTERfTUspCisraW5jbHVkZSAkKENMQU5HX1RCTEdFTl9SVUxFU19NSykKKytpbmNsdWRlICQoQ0xBTkdfVkVSU0lPTl9JTkNfTUspCisraW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCitkaWZmIC0tZ2l0IGEvdG9vbHMvZHJpdmVyL0FuZHJvaWQubWsgYi90b29scy9kcml2ZXIvQW5kcm9pZC5taworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmU3YWY1NjAKKy0tLSAvZGV2L251bGwKKysrKyBiL3Rvb2xzL2RyaXZlci9BbmRyb2lkLm1rCitAQCAtMCwwICsxLDExOSBAQAorK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorKworKyMgRm9yIHRoZSBob3N0IG9ubHkKKysjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisraW5jbHVkZSAkKENMRUFSX1RCTEdFTl9WQVJTKQorKworK0xPQ0FMX01PRFVMRSA6PSBjbGFuZworKworK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFWEVDVVRBQkxFUworKworK1RCTEdFTl9UQUJMRVMgOj0gXAorKyAgRGlhZ25vc3RpY0NvbW1vbktpbmRzLmluYyBcCisrICBEaWFnbm9zdGljRHJpdmVyS2luZHMuaW5jIFwKKysgIERpYWdub3N0aWNGcm9udGVuZEtpbmRzLmluYyBcCisrICBDQzFPcHRpb25zLmluYyBcCisrICBDQzFBc09wdGlvbnMuaW5jCisrCisrY2xhbmdfU1JDX0ZJTEVTIDo9IFwKKysgIGNjMV9tYWluLmNwcCBcCisrICBjYzFhc19tYWluLmNwcCBcCisrICBkcml2ZXIuY3BwCisrCisrTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2xhbmdfU1JDX0ZJTEVTKQorKworK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorKyAgbGliY2xhbmdGcm9udGVuZFRvb2wgXAorKyAgbGliY2xhbmdGcm9udGVuZCBcCisrICBsaWJjbGFuZ0FSQ01pZ3JhdGUgXAorKyAgbGliY2xhbmdEcml2ZXIgXAorKyAgbGliY2xhbmdTZXJpYWxpemF0aW9uIFwKKysgIGxpYmNsYW5nQ29kZUdlbiBcCisrICBsaWJjbGFuZ1Jld3JpdGVGcm9udGVuZCBcCisrICBsaWJjbGFuZ1Jld3JpdGVDb3JlIFwKKysgIGxpYmNsYW5nUGFyc2UgXAorKyAgbGliY2xhbmdTZW1hIFwKKysgIGxpYmNsYW5nU3RhdGljQW5hbHl6ZXJGcm9udGVuZCBcCisrICBsaWJjbGFuZ1N0YXRpY0FuYWx5emVyQ2hlY2tlcnMgXAorKyAgbGliY2xhbmdTdGF0aWNBbmFseXplckNvcmUgXAorKyAgbGliY2xhbmdBbmFseXNpcyBcCisrICBsaWJjbGFuZ0VkaXQgXAorKyAgbGliY2xhbmdBU1QgXAorKyAgbGliY2xhbmdMZXggXAorKyAgbGliY2xhbmdCYXNpYyBcCisrICBsaWJMTFZNQVJNQXNtUGFyc2VyIFwKKysgIGxpYkxMVk1BUk1Db2RlR2VuIFwKKysgIGxpYkxMVk1BUk1Bc21QcmludGVyIFwKKysgIGxpYkxMVk1BUk1EaXNhc3NlbWJsZXIgXAorKyAgbGliTExWTUFSTURlc2MgXAorKyAgbGliTExWTUFSTUluZm8gXAorKyAgbGliTExWTU1pcHNBc21QYXJzZXIgXAorKyAgbGliTExWTU1pcHNDb2RlR2VuIFwKKysgIGxpYkxMVk1NaXBzRGlzYXNzZW1ibGVyIFwKKysgIGxpYkxMVk1NaXBzQXNtUHJpbnRlciBcCisrICBsaWJMTFZNTWlwc0Rlc2MgXAorKyAgbGliTExWTU1pcHNJbmZvIFwKKysgIGxpYkxMVk1YODZJbmZvIFwKKysgIGxpYkxMVk1YODZBc21QYXJzZXIgXAorKyAgbGliTExWTVg4NkNvZGVHZW4gXAorKyAgbGliTExWTVg4NkRpc2Fzc2VtYmxlciBcCisrICBsaWJMTFZNWDg2RGVzYyBcCisrICBsaWJMTFZNWDg2QXNtUHJpbnRlciBcCisrICBsaWJMTFZNWDg2VXRpbHMgXAorKyAgbGliTExWTUFSTTY0SW5mbyBcCisrICBsaWJMTFZNQVJNNjRBc21QYXJzZXIgXAorKyAgbGliTExWTUFSTTY0Q29kZUdlbiBcCisrICBsaWJMTFZNQVJNNjREaXNhc3NlbWJsZXIgXAorKyAgbGliTExWTUFSTTY0RGVzYyBcCisrICBsaWJMTFZNQVJNNjRBc21QcmludGVyIFwKKysgIGxpYkxMVk1BUk02NFV0aWxzIFwKKysgIGxpYkxMVk1JUlJlYWRlciBcCisrICBsaWJMTFZNQXNtUGFyc2VyIFwKKysgIGxpYkxMVk1Bc21QcmludGVyIFwKKysgIGxpYkxMVk1CaXRSZWFkZXIgXAorKyAgbGliTExWTUJpdFdyaXRlciBcCisrICBsaWJMTFZNU2VsZWN0aW9uREFHIFwKKysgIGxpYkxMVk1pcG8gXAorKyAgbGliTExWTWlwYSBcCisrICBsaWJMTFZNSW5zdENvbWJpbmUgXAorKyAgbGliTExWTUluc3RydW1lbnRhdGlvbiBcCisrICBsaWJMTFZNQ29kZUdlbiBcCisrICBsaWJMTFZNT2JqZWN0IFwKKysgIGxpYkxMVk1MaW5rZXIgXAorKyAgbGliTExWTU1DIFwKKysgIGxpYkxMVk1NQ1BhcnNlciBcCisrICBsaWJMTFZNU2NhbGFyT3B0cyBcCisrICBsaWJMTFZNVHJhbnNmb3JtT2JqQ0FSQyBcCisrICBsaWJMTFZNVHJhbnNmb3JtVXRpbHMgXAorKyAgbGliTExWTVZlY3Rvcml6ZSBcCisrICBsaWJMTFZNQW5hbHlzaXMgXAorKyAgbGliTExWTUNvcmUgXAorKyAgbGliTExWTU9wdGlvbiBcCisrICBsaWJMTFZNU3VwcG9ydCBcCisrICBsaWJMTFZNVGFyZ2V0CisrCisrTE9DQUxfTERMSUJTICs9IC1sbQorK2lmZGVmIFVTRV9NSU5HVworK0xPQ0FMX0xETElCUyArPSAtbGltYWdlaGxwCisrZWxzZQorK0xPQ0FMX0xETElCUyArPSAtbHB0aHJlYWQgLWxkbAorK2VuZGlmCisrCisraW5jbHVkZSAkKENMQU5HX0hPU1RfQlVJTERfTUspCisraW5jbHVkZSAkKENMQU5HX1RCTEdFTl9SVUxFU19NSykKKytpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQorKworK2lmZXEgKHRydWUsJChGT1JDRV9CVUlMRF9MTFZNX0NPTVBPTkVOVFMpKQorKyMgTWFrZSBzdXJlIGlmIGNsYW5nIChpLmUuICQoTE9DQUxfTU9EVUxFKSkgZ2V0IGluc3RhbGxlZCwKKysjIGNsYW5nKysgd2lsbCBnZXQgaW5zdGFsbGVkIGFzIHdlbGwuCisrQUxMX01PRFVMRVMuJChMT0NBTF9NT0RVTEUpLklOU1RBTExFRCA6PSBcCisrICAgICQoQUxMX01PRFVMRVMuJChMT0NBTF9NT0RVTEUpLklOU1RBTExFRCkgJChDTEFOR19DWFgpCisrIyB0aGUgYWRkaXRpb25hbCBkZXBlbmRlbmN5IGlzIG5lZWRlZCB3aGVuIHlvdSBydW4gbW0vbW1tLgorKyQoTE9DQUxfTU9EVUxFKSA6ICQoQ0xBTkdfQ1hYKQorKworKyMgU3ltbGluayBmb3IgY2xhbmcrKworKyQoQ0xBTkdfQ1hYKSA6ICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkKKysJQGVjaG8gIlN5bWxpbmsgJEAgLT4gJDwiCisrCSQoaGlkZSkgbG4gLXNmICQobm90ZGlyICQ8KSAkQAorK2VuZGlmCitkaWZmIC0tZ2l0IGEvdXRpbHMvVGFibGVHZW4vQW5kcm9pZC5tayBiL3V0aWxzL1RhYmxlR2VuL0FuZHJvaWQubWsKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi40YTQwZGM4CistLS0gL2Rldi9udWxsCisrKysgYi91dGlscy9UYWJsZUdlbi9BbmRyb2lkLm1rCitAQCAtMCwwICsxLDM1IEBACisrTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisrCisrY2xhbmdfdGFibGVnZW5fU1JDX0ZJTEVTIDo9IFwKKysgIENsYW5nQVNUTm9kZXNFbWl0dGVyLmNwcCBcCisrICBDbGFuZ0F0dHJFbWl0dGVyLmNwcCBcCisrICBDbGFuZ0NvbW1lbnRDb21tYW5kSW5mb0VtaXR0ZXIuY3BwIFwKKysgIENsYW5nQ29tbWVudEhUTUxOYW1lZENoYXJhY3RlclJlZmVyZW5jZUVtaXR0ZXIuY3BwIFwKKysgIENsYW5nQ29tbWVudEhUTUxUYWdzRW1pdHRlci5jcHAgXAorKyAgQ2xhbmdEaWFnbm9zdGljc0VtaXR0ZXIuY3BwIFwKKysgIENsYW5nU0FDaGVja2Vyc0VtaXR0ZXIuY3BwIFwKKysgIE5lb25FbWl0dGVyLmNwcCBcCisrICBUYWJsZUdlbi5jcHAKKysKKytpbmNsdWRlICQoQ0xFQVJfVkFSUykKKysKKytMT0NBTF9NT0RVTEUgOj0gY2xhbmctdGJsZ2VuCisrTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKytMT0NBTF9TUkNfRklMRVMgOj0gJChjbGFuZ190YWJsZWdlbl9TUkNfRklMRVMpCisrCisrUkVRVUlSRVNfRUggOj0gMQorK1JFUVVJUkVTX1JUVEkgOj0gMQorKworK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorKyAgbGliTExWTVRhYmxlR2VuIFwKKysgIGxpYkxMVk1TdXBwb3J0CisrCisrTE9DQUxfTERMSUJTICs9IC1sbQorK2lmZXEgKCQoSE9TVF9PUyksd2luZG93cykKKysgIExPQ0FMX0xETElCUyArPSAtbGltYWdlaGxwIC1scHNhcGkKKytlbHNlCisrICBMT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkIC1sZGwKKytlbmRpZgorKworK2luY2x1ZGUgJChMTFZNX0hPU1RfQlVJTERfTUspCisraW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKKy0tIAorMS45LjEuNDIzLmc0NTk2ZTNhCisKZGlmZiAtLWdpdCBhL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQgYi9ydW50aW1lL0NNYWtlTGlzdHMudHh0CmluZGV4IDY4ZWUyNjYuLmRjMTQ1NDEgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQKKysrIGIvcnVudGltZS9DTWFrZUxpc3RzLnR4dApAQCAtMSw3ICsxLDggQEAKICMgVE9ETzogU2V0IHRoZSBpbnN0YWxsIGRpcmVjdG9yeS4KIAoraW5jbHVkZShFeHRlcm5hbFByb2plY3QpCisKIHNldChrbm93bl9zdWJkaXJzCi0gICJjb21waWxlci1ydCIKICAgImxpYmN4eCIKICAgKQogCkBAIC0xMCwzICsxMSw5OCBAQAogICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7ZGlyfSkKICAgZW5kaWYoKQogZW5kZm9yZWFjaCgpCisKK2Z1bmN0aW9uKGdldF9leHRfcHJvamVjdF9idWlsZF9jb21tYW5kIG91dF92YXIgdGFyZ2V0KQorICBpZiAoQ01BS0VfR0VORVJBVE9SIE1BVENIRVMgIk1ha2UiKQorICAgICMgVXNlIHNwZWNpYWwgY29tbWFuZCBmb3IgTWFrZWZpbGVzIHRvIHN1cHBvcnQgcGFyYWxsZWxpc20uCisgICAgc2V0KCR7b3V0X3Zhcn0gIiQoTUFLRSkiICIke3RhcmdldH0iIFBBUkVOVF9TQ09QRSkKKyAgZWxzZSgpCisgICAgc2V0KCR7b3V0X3Zhcn0gJHtDTUFLRV9DT01NQU5EfSAtLWJ1aWxkIC4gLS10YXJnZXQgJHt0YXJnZXR9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWNvbmZpZyAkPENPTkZJR1VSQVRJT04+IFBBUkVOVF9TQ09QRSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCitzZXQoQ09NUElMRVJfUlRfU1JDX1JPT1QgJHtMTFZNX01BSU5fU1JDX0RJUn0vcHJvamVjdHMvY29tcGlsZXItcnQpCitpZihMTFZNX0JVSUxEX0VYVEVSTkFMX0NPTVBJTEVSX1JUIEFORCBFWElTVFMgJHtDT01QSUxFUl9SVF9TUkNfUk9PVH0vKQorICBpZihDTUFLRV9HRU5FUkFUT1IgTUFUQ0hFUyAiTmluamEiKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKKyAgICAgICAgICAgICJOaW5qYSBnZW5lcmF0b3IgY2FuJ3QgYnVpbGQgY29tcGlsZXItcnQgYXMgRXh0ZXJuYWxQcm9qZWN0LiIKKyAgICAgICAgICAgICJVbnNldCBMTFZNX0JVSUxEX0VYVEVSTkFMX0NPTVBJTEVSX1JULCBvciBkb24ndCB1c2UgTmluamEuIgorICAgICAgICAgICAgIlNlZSBodHRwOi8vd3d3LmNtYWtlLm9yZy9CdWcvdmlldy5waHA/aWQ9MTQ3NzEiKQorICBlbmRpZigpCisKKyAgIyBBZGQgY29tcGlsZXItcnQgYXMgYW4gZXh0ZXJuYWwgcHJvamVjdC4KKyAgc2V0KENPTVBJTEVSX1JUX1BSRUZJWCAke0NNQUtFX0JJTkFSWV9ESVJ9L3Byb2plY3RzL2NvbXBpbGVyLXJ0KQorICAKKyAgRXh0ZXJuYWxQcm9qZWN0X0FkZChjb21waWxlci1ydAorICAgIFBSRUZJWCAke0NPTVBJTEVSX1JUX1BSRUZJWH0KKyAgICBTT1VSQ0VfRElSICR7Q09NUElMRVJfUlRfU1JDX1JPT1R9CisgICAgQ01BS0VfQVJHUyAtRENNQUtFX0NfQ09NUElMRVI9JHtMTFZNX1JVTlRJTUVfT1VUUFVUX0lOVERJUn0vY2xhbmcKKyAgICAgICAgICAgICAgIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPSR7TExWTV9SVU5USU1FX09VVFBVVF9JTlRESVJ9L2NsYW5nKysKKyAgICAgICAgICAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlCisgICAgICAgICAgICAgICAtRExMVk1fQ09ORklHX1BBVEg9JHtMTFZNX1JVTlRJTUVfT1VUUFVUX0lOVERJUn0vbGx2bS1jb25maWcKKyAgICAgICAgICAgICAgIC1EQ09NUElMRVJfUlRfT1VUUFVUX0RJUj0ke0xMVk1fTElCUkFSWV9PVVRQVVRfSU5URElSfS9jbGFuZy8ke0NMQU5HX1ZFUlNJT059CisgICAgICAgICAgICAgICAtRENPTVBJTEVSX1JUX0VYRUNfT1VUUFVUX0RJUj0ke0xMVk1fUlVOVElNRV9PVVRQVVRfSU5URElSfQorICAgICAgICAgICAgICAgLURDT01QSUxFUl9SVF9JTlNUQUxMX1BBVEg9bGliJHtMTFZNX0xJQkRJUl9TVUZGSVh9L2NsYW5nLyR7Q0xBTkdfVkVSU0lPTn0KKyAgICAgICAgICAgICAgIC1EQ09NUElMRVJfUlRfSU5DTFVERV9URVNUUz0ke0xMVk1fSU5DTFVERV9URVNUU30KKyAgICAgICAgICAgICAgIC1EQ09NUElMRVJfUlRfRU5BQkxFX1dFUlJPUj1PTgorICAgIElOU1RBTExfQ09NTUFORCAiIgorICAgIFNURVBfVEFSR0VUUyBjb25maWd1cmUgYnVpbGQKKyAgICApCisgICMgRHVlIHRvIGEgYnVnLCBERVBFTkRTIGluIEV4dGVybmFsUHJvamVjdF9BZGQgZG9lc24ndCB3b3JrCisgICMgaW4gQ01ha2UgMi44LjkgYW5kIDIuOC4xMC4KKyAgYWRkX2RlcGVuZGVuY2llcyhjb21waWxlci1ydCBsbHZtLWNvbmZpZyBjbGFuZykKKworICAjIEFkZCBhIGN1c3RvbSBzdGVwIHRvIGFsd2F5cyByZS1jb25maWd1cmUgY29tcGlsZXItcnQgKGluIGNhc2Ugc29tZSBvZiBpdHMKKyAgIyBzb3VyY2VzIGhhdmUgY2hhbmdlZCkuCisgIEV4dGVybmFsUHJvamVjdF9BZGRfU3RlcChjb21waWxlci1ydCBmb3JjZS1yZWNvbmZpZ3VyZQorICAgIERFUEVOREVSUyBjb25maWd1cmUKKyAgICBBTFdBWVMgMQorICAgICkKKworICBFeHRlcm5hbFByb2plY3RfQWRkX1N0ZXAoY29tcGlsZXItcnQgY2xvYmJlcgorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW1vdmVfZGlyZWN0b3J5IDxCSU5BUllfRElSPgorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSA8QklOQVJZX0RJUj4KKyAgICBDT01NRU5UICJDbG9iYmVycmluZyBjb21waWxlci1ydCBidWlsZCBkaXJlY3RvcnkuLi4iCisgICAgREVQRU5ERVJTIGNvbmZpZ3VyZQorICAgIERFUEVORFMgJHtMTFZNX1JVTlRJTUVfT1VUUFVUX0lOVERJUn0vY2xhbmcKKyAgKQorCisgIEV4dGVybmFsUHJvamVjdF9HZXRfUHJvcGVydHkoY29tcGlsZXItcnQgQklOQVJZX0RJUikKKyAgc2V0KENPTVBJTEVSX1JUX0JJTkFSWV9ESVIgJHtCSU5BUllfRElSfSkKKworICAjIEFkZCB0b3AtbGV2ZWwgdGFyZ2V0cyB0aGF0IGJ1aWxkIHNwZWNpZmljIGNvbXBpbGVyLXJ0IHJ1bnRpbWVzLgorICBzZXQoQ09NUElMRVJfUlRfUlVOVElNRVMgYXNhbiBidWlsdGlucyBkZnNhbiBsc2FuIG1zYW4gcHJvZmlsZSB0c2FuIHVic2FuKQorICBmb3JlYWNoKHJ1bnRpbWUgJHtDT01QSUxFUl9SVF9SVU5USU1FU30pCisgICAgZ2V0X2V4dF9wcm9qZWN0X2J1aWxkX2NvbW1hbmQoYnVpbGRfcnVudGltZV9jbWQgJHtydW50aW1lfSkKKyAgICBhZGRfY3VzdG9tX3RhcmdldCgke3J1bnRpbWV9CisgICAgICBDT01NQU5EICR7YnVpbGRfcnVudGltZV9jbWR9CisgICAgICBERVBFTkRTIGNvbXBpbGVyLXJ0LWNvbmZpZ3VyZQorICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDT01QSUxFUl9SVF9CSU5BUllfRElSfQorICAgICAgVkVSQkFUSU0pCisgIGVuZGZvcmVhY2goKQorCisgICMgQWRkIGJpbmFyaWVzIHRoYXQgY29tcGlsZXItcnQgdGVzdHMgZGVwZW5kIG9uLgorICBzZXQoQ09NUElMRVJfUlRfVEVTVF9ERVBFTkRFTkNJRVMKKyAgICBGaWxlQ2hlY2sgY291bnQgbm90IGxsdm0tbm0gbGx2bS1zeW1ib2xpemVyKQorCisgICMgQWRkIHRvcC1sZXZlbCB0YXJnZXRzIGZvciB2YXJpb3VzIGNvbXBpbGVyLXJ0IHRlc3Qgc3VpdGVzLgorICBzZXQoQ09NUElMRVJfUlRfVEVTVF9TVUlURVMgY2hlY2stYXNhbiBjaGVjay1kZnNhbiBjaGVjay1sc2FuIGNoZWNrLW1zYW4KKyAgICBjaGVjay1zYW5pdGl6ZXIgY2hlY2stdHNhbiBjaGVjay11YnNhbikKKyAgZm9yZWFjaCh0ZXN0X3N1aXRlICR7Q09NUElMRVJfUlRfVEVTVF9TVUlURVN9KQorICAgIGdldF9leHRfcHJvamVjdF9idWlsZF9jb21tYW5kKHJ1bl90ZXN0X3N1aXRlICR7dGVzdF9zdWl0ZX0pCisgICAgYWRkX2N1c3RvbV90YXJnZXQoJHt0ZXN0X3N1aXRlfQorICAgICAgQ09NTUFORCAke3J1bl90ZXN0X3N1aXRlfQorICAgICAgREVQRU5EUyBjb21waWxlci1ydC1idWlsZCAke0NPTVBJTEVSX1JUX1RFU1RfREVQRU5ERU5DSUVTfQorICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDT01QSUxFUl9SVF9CSU5BUllfRElSfQorICAgICAgVkVSQkFUSU0pCisgIGVuZGZvcmVhY2goKQorCisgICMgQWRkIHNwZWNpYWwgdGFyZ2V0IHRvIHJ1biBhbGwgY29tcGlsZXItcnQgdGVzdCBzdWl0ZXMuCisgIGdldF9leHRfcHJvamVjdF9idWlsZF9jb21tYW5kKHJ1bl9jaGVja19jb21waWxlcl9ydCBjaGVjay1hbGwpCisgIGFkZF9jdXN0b21fdGFyZ2V0KGNoZWNrLWNvbXBpbGVyLXJ0CisgICAgQ09NTUFORCAke3J1bl9jaGVja19jb21waWxlcl9ydH0KKyAgICBERVBFTkRTIGNvbXBpbGVyLXJ0LWJ1aWxkICR7Q09NUElMRVJfUlRfVEVTVF9ERVBFTkRFTkNJRVN9CisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDT01QSUxFUl9SVF9CSU5BUllfRElSfQorICAgIFZFUkJBVElNKQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvcnVudGltZS9jb21waWxlci1ydC9NYWtlZmlsZSBiL3J1bnRpbWUvY29tcGlsZXItcnQvTWFrZWZpbGUKaW5kZXggYzZmMzhiMi4uYjY4M2ZjZCAxMDA2NDQKLS0tIGEvcnVudGltZS9jb21waWxlci1ydC9NYWtlZmlsZQorKysgYi9ydW50aW1lL2NvbXBpbGVyLXJ0L01ha2VmaWxlCkBAIC02Niw3ICs2Niw3IEBACiAjICAzLiBDb21lIHVwIHdpdGggYW4gYWx0ZXJuYXRlIG1lY2hhbmlzbSB0byBkZWZpbmUgYWxsIHRoZSB0b29sY2hhaW4KICMgICAgIGluZm9ybWF0aW9uIHRoYXQgY29tcGlsZXItcnQgd291bGQgbmVlZCB0byBidWlsZCBsaWJyYXJpZXMgZm9yIGFsbCB0aGUKICMgICAgIHJlcXVlc3RlZCB0YXJnZXRzLiBUaGlzIG1pZ2h0IGJlIGEgc2ltcGxlIHNob3J0IHRlcm0gc29sdXRpb24sIGJ1dCBpcwotIyAgICAgbGlrZWx5IHRvIGJlIHVud2llbGRseSBhbmQgaXJyaXRhdGluZyB0byBtYWludGFpbiBpbiB0aGUgbG9uZyB0ZXJtLgorIyAgICAgbGlrZWx5IHRvIGJlIHVud2llbGR5IGFuZCBpcnJpdGF0aW5nIHRvIG1haW50YWluIGluIHRoZSBsb25nIHRlcm0uCiBpZm5lcSAoJChMTFZNX0NST1NTX0NPTVBJTElORyksMSkKIGlmbmVxICgkKENMQU5HX05PX1JVTlRJTUUpLDEpCiBpZmVxICgkKHNoZWxsIHRlc3QgLWQgJChDT01QSUxFUlJUX1NSQ19ST09UKSAmJiBlY2hvIE9LKSxPSykKQEAgLTc4LDE0ICs3OCwxOSBAQAogIyBzdXBwb3J0LgogUnVudGltZURpcnMgOj0KIGlmZXEgKCQoT1MpLERhcndpbikKLVJ1bnRpbWVEaXJzICs9IGRhcndpbiBkYXJ3aW5fZW1iZWRkZWQKK1J1bnRpbWVEaXJzICs9IGRhcndpbiBtYWNob19lbWJlZGRlZAogUnVudGltZUxpYnJhcnkuZGFyd2luLkNvbmZpZ3MgOj0gXAogCWVwcmludGYuYSAxMC40LmEgb3N4LmEgaW9zLmEgY2Nfa2V4dC5hIGNjX2tleHRfaW9zNS5hIFwKIAlhc2FuX29zeF9keW5hbWljLmR5bGliIFwKIAlwcm9maWxlX29zeC5hIHByb2ZpbGVfaW9zLmEgXAogCXVic2FuX29zeC5hCi1SdW50aW1lTGlicmFyeS5kYXJ3aW5fZW1iZWRkZWQuQ29uZmlncyA6PSBcCi0Jc29mdF9zdGF0aWMuYSBoYXJkX3N0YXRpYy5hIHNvZnRfcGljLmEgaGFyZF9waWMuYQorCitSdW50aW1lTGlicmFyeS5tYWNob19lbWJlZGRlZC5Db25maWdzIDo9IFwKKwloYXJkX3N0YXRpYy5hIGhhcmRfcGljLmEKK2lmbmVxICgsJChmaW5kc3RyaW5nIEFSTSwkKFRBUkdFVFNfVE9fQlVJTEQpKSkKK1J1bnRpbWVMaWJyYXJ5Lm1hY2hvX2VtYmVkZGVkLkNvbmZpZ3MgKz0gXAorCXNvZnRfc3RhdGljLmEgc29mdF9waWMuYQorZW5kaWYKIAogIyBTdXBwb3J0IGJ1aWxkaW5nIGNvbXBpbGVyLXJ0IHdpdGggcmVsb2NhdGFibGUgU0RLcy4KICMKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvR0MtY2hlY2std2Fybi1uc2FsbG9jLm0gYi90ZXN0L0FSQ01UL0dDLWNoZWNrLXdhcm4tbnNhbGxvYy5tCmluZGV4IDVjZTM2YzQuLjZiZTA1YjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvR0MtY2hlY2std2Fybi1uc2FsbG9jLm0KKysrIGIvdGVzdC9BUkNNVC9HQy1jaGVjay13YXJuLW5zYWxsb2MubQpAQCAtMSw2ICsxLDUgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtYXJjbXQtY2hlY2sgLXZlcmlmeSAtbm8tbnMtYWxsb2MtZXJyb3IgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZvYmpjLWdjLW9ubHkgJXMKIC8vIFJVTjogJWNsYW5nX2NjMSAtYXJjbXQtY2hlY2sgLXZlcmlmeSAtbm8tbnMtYWxsb2MtZXJyb3IgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZvYmpjLWdjLW9ubHkgLXggb2JqZWN0aXZlLWMrKyAlcwotLy8gRElTQUJMRTogbWluZ3czMgogLy8gcmRhcjovLzEwNTMyNTQxCiAvLyBYRkFJTDogKgogCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL0dDLWNoZWNrLm0gYi90ZXN0L0FSQ01UL0dDLWNoZWNrLm0KaW5kZXggM2ExYjY3Yy4uOTg2NDM1NCAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9HQy1jaGVjay5tCisrKyBiL3Rlc3QvQVJDTVQvR0MtY2hlY2subQpAQCAtMSw2ICsxLDUgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtYXJjbXQtY2hlY2sgLXZlcmlmeSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZm9iamMtZ2Mtb25seSAlcwogLy8gUlVOOiAlY2xhbmdfY2MxIC1hcmNtdC1jaGVjayAtdmVyaWZ5IC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mb2JqYy1nYy1vbmx5IC14IG9iamVjdGl2ZS1jKysgJXMKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogI2RlZmluZSBDRl9BVVRPTUFURURfUkVGQ09VTlRfVU5BVkFJTEFCTEUgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUoIm5vdCBhdmFpbGFibGUgaW4gYXV0b21hdGljIHJlZmVyZW5jZSBjb3VudGluZyBtb2RlIikpKQogdHlwZWRlZiB1bnNpZ25lZCBOU1VJbnRlZ2VyOwpkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9HQy1uby1hcmMtcnVudGltZS5tIGIvdGVzdC9BUkNNVC9HQy1uby1hcmMtcnVudGltZS5tCmluZGV4IGYwNjk5OTIuLjM3NjEzNGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvR0Mtbm8tYXJjLXJ1bnRpbWUubQorKysgYi90ZXN0L0FSQ01UL0dDLW5vLWFyYy1ydW50aW1lLm0KQEAgLTMsNyArMyw2IEBACiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0CiAvLyBSVU46IGFyY210LXRlc3QgLS1hcmdzIC10cmlwbGUgeDg2XzY0LWFwcGxlLW1hY29zeDEwLjYgLWZzeW50YXgtb25seSAtZm9iamMtZ2Mtb25seSAteCBvYmplY3RpdmUtYysrICVzID4gJXQKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogI2luY2x1ZGUgIkNvbW1vbi5oIgogI2luY2x1ZGUgIkdDLmgiCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL0dDLW5vLWFyYy1ydW50aW1lLm0ucmVzdWx0IGIvdGVzdC9BUkNNVC9HQy1uby1hcmMtcnVudGltZS5tLnJlc3VsdAppbmRleCBmNTVjYTM4Li5jMzM4YmRiIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL0dDLW5vLWFyYy1ydW50aW1lLm0ucmVzdWx0CisrKyBiL3Rlc3QvQVJDTVQvR0Mtbm8tYXJjLXJ1bnRpbWUubS5yZXN1bHQKQEAgLTMsNyArMyw2IEBACiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0CiAvLyBSVU46IGFyY210LXRlc3QgLS1hcmdzIC10cmlwbGUgeDg2XzY0LWFwcGxlLW1hY29zeDEwLjYgLWZzeW50YXgtb25seSAtZm9iamMtZ2Mtb25seSAteCBvYmplY3RpdmUtYysrICVzID4gJXQKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogI2luY2x1ZGUgIkNvbW1vbi5oIgogI2luY2x1ZGUgIkdDLmgiCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL0dDLW5vLWZpbmFsaXplLXJlbW92YWwubSBiL3Rlc3QvQVJDTVQvR0Mtbm8tZmluYWxpemUtcmVtb3ZhbC5tCmluZGV4IDE0ZTg2MDIuLmE4ZGI4MTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvR0Mtbm8tZmluYWxpemUtcmVtb3ZhbC5tCisrKyBiL3Rlc3QvQVJDTVQvR0Mtbm8tZmluYWxpemUtcmVtb3ZhbC5tCkBAIC0zLDcgKzMsNiBAQAogLy8gUlVOOiBkaWZmICV0ICVzLnJlc3VsdAogLy8gUlVOOiBhcmNtdC10ZXN0IC0tYXJncyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1tYWNvc3gxMC43IC1mc3ludGF4LW9ubHkgLWZvYmpjLWdjLW9ubHkgLW5vLWZpbmFsaXplLXJlbW92YWwgLXggb2JqZWN0aXZlLWMrKyAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKICNpbmNsdWRlICJDb21tb24uaCIKICNpbmNsdWRlICJHQy5oIgpkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9HQy1uby1maW5hbGl6ZS1yZW1vdmFsLm0ucmVzdWx0IGIvdGVzdC9BUkNNVC9HQy1uby1maW5hbGl6ZS1yZW1vdmFsLm0ucmVzdWx0CmluZGV4IGVhMTQ4NzMuLmI1NjNkMTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvR0Mtbm8tZmluYWxpemUtcmVtb3ZhbC5tLnJlc3VsdAorKysgYi90ZXN0L0FSQ01UL0dDLW5vLWZpbmFsaXplLXJlbW92YWwubS5yZXN1bHQKQEAgLTMsNyArMyw2IEBACiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0CiAvLyBSVU46IGFyY210LXRlc3QgLS1hcmdzIC10cmlwbGUgeDg2XzY0LWFwcGxlLW1hY29zeDEwLjcgLWZzeW50YXgtb25seSAtZm9iamMtZ2Mtb25seSAtbm8tZmluYWxpemUtcmVtb3ZhbCAteCBvYmplY3RpdmUtYysrICVzID4gJXQKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogI2luY2x1ZGUgIkNvbW1vbi5oIgogI2luY2x1ZGUgIkdDLmgiCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL0dDLm0gYi90ZXN0L0FSQ01UL0dDLm0KaW5kZXggZWViYmFmNi4uMmM5ZWE5YyAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9HQy5tCisrKyBiL3Rlc3QvQVJDTVQvR0MubQpAQCAtMyw3ICszLDYgQEAKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtbWFjb3N4MTAuNyAtZnN5bnRheC1vbmx5IC1mb2JqYy1nYy1vbmx5IC14IG9iamVjdGl2ZS1jKysgJXMgPiAldAogLy8gUlVOOiBkaWZmICV0ICVzLnJlc3VsdAotLy8gRElTQUJMRTogbWluZ3czMgogCiAjaW5jbHVkZSAiQ29tbW9uLmgiCiAjaW5jbHVkZSAiR0MuaCIKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvR0MubS5yZXN1bHQgYi90ZXN0L0FSQ01UL0dDLm0ucmVzdWx0CmluZGV4IGMyYzUyM2YuLjU5NWZmMjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvR0MubS5yZXN1bHQKKysrIGIvdGVzdC9BUkNNVC9HQy5tLnJlc3VsdApAQCAtMyw3ICszLDYgQEAKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtbWFjb3N4MTAuNyAtZnN5bnRheC1vbmx5IC1mb2JqYy1nYy1vbmx5IC14IG9iamVjdGl2ZS1jKysgJXMgPiAldAogLy8gUlVOOiBkaWZmICV0ICVzLnJlc3VsdAotLy8gRElTQUJMRTogbWluZ3czMgogCiAjaW5jbHVkZSAiQ29tbW9uLmgiCiAjaW5jbHVkZSAiR0MuaCIKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvYXBpLm0gYi90ZXN0L0FSQ01UL2FwaS5tCmluZGV4IGJhMTIyYzQuLmIxODZlYzcgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvYXBpLm0KKysrIGIvdGVzdC9BUkNNVC9hcGkubQpAQCAtMSw3ICsxLDYgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC1mb2JqYy1hcmMgLXggb2JqZWN0aXZlLWMgJXMucmVzdWx0CiAvLyBSVU46IGFyY210LXRlc3QgLS1hcmdzIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLXggb2JqZWN0aXZlLWMgJXMgPiAldAogLy8gUlVOOiBkaWZmICV0ICVzLnJlc3VsdAotLy8gRElTQUJMRTogbWluZ3czMgogCiAjaW5jbHVkZSAiQ29tbW9uLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvYXBpLm0ucmVzdWx0IGIvdGVzdC9BUkNNVC9hcGkubS5yZXN1bHQKaW5kZXggN2UwNGU3ZC4uZTMwOTM3NSAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9hcGkubS5yZXN1bHQKKysrIGIvdGVzdC9BUkNNVC9hcGkubS5yZXN1bHQKQEAgLTEsNyArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC14IG9iamVjdGl2ZS1jICVzLnJlc3VsdAogLy8gUlVOOiBhcmNtdC10ZXN0IC0tYXJncyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC14IG9iamVjdGl2ZS1jICVzID4gJXQKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogI2luY2x1ZGUgIkNvbW1vbi5oIgogCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2Fzc2lnbi1wcm9wLXdpdGgtYXJjLXJ1bnRpbWUubSBiL3Rlc3QvQVJDTVQvYXNzaWduLXByb3Atd2l0aC1hcmMtcnVudGltZS5tCmluZGV4IGMzNTdlZWIuLmEwMDUzOGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvYXNzaWduLXByb3Atd2l0aC1hcmMtcnVudGltZS5tCisrKyBiL3Rlc3QvQVJDTVQvYXNzaWduLXByb3Atd2l0aC1hcmMtcnVudGltZS5tCkBAIC0xLDcgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAtZm9iamMtcnVudGltZS1oYXMtd2VhayAteCBvYmplY3RpdmUtYyAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtbWFjb3N4MTAuNyAtZnN5bnRheC1vbmx5ICVzID4gJXQKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogI2luY2x1ZGUgIkNvbW1vbi5oIgogCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2Fzc2lnbi1wcm9wLXdpdGgtYXJjLXJ1bnRpbWUubS5yZXN1bHQgYi90ZXN0L0FSQ01UL2Fzc2lnbi1wcm9wLXdpdGgtYXJjLXJ1bnRpbWUubS5yZXN1bHQKaW5kZXggYTI1NWEzNi4uOGJiNjg0ZiAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9hc3NpZ24tcHJvcC13aXRoLWFyYy1ydW50aW1lLm0ucmVzdWx0CisrKyBiL3Rlc3QvQVJDTVQvYXNzaWduLXByb3Atd2l0aC1hcmMtcnVudGltZS5tLnJlc3VsdApAQCAtMSw3ICsxLDYgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC1mb2JqYy1hcmMgLWZvYmpjLXJ1bnRpbWUtaGFzLXdlYWsgLXggb2JqZWN0aXZlLWMgJXMucmVzdWx0CiAvLyBSVU46IGFyY210LXRlc3QgLS1hcmdzIC10cmlwbGUgeDg2XzY0LWFwcGxlLW1hY29zeDEwLjcgLWZzeW50YXgtb25seSAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKICNpbmNsdWRlICJDb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9hdGF1dG9yZWxlYXNlLTIubSBiL3Rlc3QvQVJDTVQvYXRhdXRvcmVsZWFzZS0yLm0KaW5kZXggNWMyY2Q2Yi4uYjliYzEwNiAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9hdGF1dG9yZWxlYXNlLTIubQorKysgYi90ZXN0L0FSQ01UL2F0YXV0b3JlbGVhc2UtMi5tCkBAIC0xLDcgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAteCBvYmplY3RpdmUtYyAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYyAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKIEBpbnRlcmZhY2UgTlNBdXRvcmVsZWFzZVBvb2wKIC0gZHJhaW47CmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2F0YXV0b3JlbGVhc2UtMi5tLnJlc3VsdCBiL3Rlc3QvQVJDTVQvYXRhdXRvcmVsZWFzZS0yLm0ucmVzdWx0CmluZGV4IDA2YmYwZDUuLjIwNTQ3MzMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvYXRhdXRvcmVsZWFzZS0yLm0ucmVzdWx0CisrKyBiL3Rlc3QvQVJDTVQvYXRhdXRvcmVsZWFzZS0yLm0ucmVzdWx0CkBAIC0xLDcgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAteCBvYmplY3RpdmUtYyAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYyAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKIEBpbnRlcmZhY2UgTlNBdXRvcmVsZWFzZVBvb2wKIC0gZHJhaW47CmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2F0YXV0b3JlbGVhc2UtMy5tIGIvdGVzdC9BUkNNVC9hdGF1dG9yZWxlYXNlLTMubQppbmRleCAwYjZhYmRmLi44N2I4MGFmIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL2F0YXV0b3JlbGVhc2UtMy5tCisrKyBiL3Rlc3QvQVJDTVQvYXRhdXRvcmVsZWFzZS0zLm0KQEAgLTEsNyArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC14IG9iamVjdGl2ZS1jICVzLnJlc3VsdAogLy8gUlVOOiBhcmNtdC10ZXN0IC0tYXJncyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC14IG9iamVjdGl2ZS1jICVzID4gJXQKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogQGludGVyZmFjZSBOU0F1dG9yZWxlYXNlUG9vbAogLSBkcmFpbjsKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvYXRhdXRvcmVsZWFzZS0zLm0ucmVzdWx0IGIvdGVzdC9BUkNNVC9hdGF1dG9yZWxlYXNlLTMubS5yZXN1bHQKaW5kZXggOTEwM2RlNC4uODAxMzc2YSAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9hdGF1dG9yZWxlYXNlLTMubS5yZXN1bHQKKysrIGIvdGVzdC9BUkNNVC9hdGF1dG9yZWxlYXNlLTMubS5yZXN1bHQKQEAgLTEsNyArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC14IG9iamVjdGl2ZS1jICVzLnJlc3VsdAogLy8gUlVOOiBhcmNtdC10ZXN0IC0tYXJncyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC14IG9iamVjdGl2ZS1jICVzID4gJXQKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogQGludGVyZmFjZSBOU0F1dG9yZWxlYXNlUG9vbAogLSBkcmFpbjsKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvYXRhdXRvcmVsZWFzZS1jaGVjay5tIGIvdGVzdC9BUkNNVC9hdGF1dG9yZWxlYXNlLWNoZWNrLm0KaW5kZXggOGRhZjlkNi4uZDc0ZWYzYiAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9hdGF1dG9yZWxlYXNlLWNoZWNrLm0KKysrIGIvdGVzdC9BUkNNVC9hdGF1dG9yZWxlYXNlLWNoZWNrLm0KQEAgLTEsNSArMSw0IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWFyY210LWNoZWNrIC12ZXJpZnkgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgJXMKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogI2lmIF9faGFzX2ZlYXR1cmUob2JqY19hcnIpCiAjZGVmaW5lIE5TX0FVVE9NQVRFRF9SRUZDT1VOVF9VTkFWQUlMQUJMRSBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSgibm90IGF2YWlsYWJsZSBpbiBhdXRvbWF0aWMgcmVmZXJlbmNlIGNvdW50aW5nIG1vZGUiKSkpCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2F0YXV0b3JlbGVhc2UubSBiL3Rlc3QvQVJDTVQvYXRhdXRvcmVsZWFzZS5tCmluZGV4IDEzMjU1M2IuLmE2YWVkMTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvYXRhdXRvcmVsZWFzZS5tCisrKyBiL3Rlc3QvQVJDTVQvYXRhdXRvcmVsZWFzZS5tCkBAIC0xLDcgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAteCBvYmplY3RpdmUtYyAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYyAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKICNpbmNsdWRlICJDb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9hdGF1dG9yZWxlYXNlLm0ucmVzdWx0IGIvdGVzdC9BUkNNVC9hdGF1dG9yZWxlYXNlLm0ucmVzdWx0CmluZGV4IDUxOTFmNDcuLmUyNDMzOWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvYXRhdXRvcmVsZWFzZS5tLnJlc3VsdAorKysgYi90ZXN0L0FSQ01UL2F0YXV0b3JlbGVhc2UubS5yZXN1bHQKQEAgLTEsNyArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC14IG9iamVjdGl2ZS1jICVzLnJlc3VsdAogLy8gUlVOOiBhcmNtdC10ZXN0IC0tYXJncyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC14IG9iamVjdGl2ZS1jICVzID4gJXQKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogI2luY2x1ZGUgIkNvbW1vbi5oIgogCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2F1dG9yZWxlYXNlcy5tIGIvdGVzdC9BUkNNVC9hdXRvcmVsZWFzZXMubQppbmRleCA1NDNiY2Y2Li45MTQxM2U1IDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL2F1dG9yZWxlYXNlcy5tCisrKyBiL3Rlc3QvQVJDTVQvYXV0b3JlbGVhc2VzLm0KQEAgLTEsNyArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC14IG9iamVjdGl2ZS1jICVzLnJlc3VsdAogLy8gUlVOOiBhcmNtdC10ZXN0IC0tYXJncyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC14IG9iamVjdGl2ZS1jICVzID4gJXQKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogI2luY2x1ZGUgIkNvbW1vbi5oIgogCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2F1dG9yZWxlYXNlcy5tLnJlc3VsdCBiL3Rlc3QvQVJDTVQvYXV0b3JlbGVhc2VzLm0ucmVzdWx0CmluZGV4IDliNzFmZjguLjMyYzdhZDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvYXV0b3JlbGVhc2VzLm0ucmVzdWx0CisrKyBiL3Rlc3QvQVJDTVQvYXV0b3JlbGVhc2VzLm0ucmVzdWx0CkBAIC0xLDcgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAteCBvYmplY3RpdmUtYyAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYyAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKICNpbmNsdWRlICJDb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9jaGVjay13aXRoLXBjaC5tIGIvdGVzdC9BUkNNVC9jaGVjay13aXRoLXBjaC5tCmluZGV4IDc4NjcwMDIuLjFhOTRkZGEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvY2hlY2std2l0aC1wY2gubQorKysgYi90ZXN0L0FSQ01UL2NoZWNrLXdpdGgtcGNoLm0KQEAgLTEsNiArMSw1IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXggb2JqZWN0aXZlLWMgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgJVMvQ29tbW9uLmggLWVtaXQtcGNoIC1vICV0LnBjaAogLy8gUlVOOiAlY2xhbmdfY2MxIC1pbmNsdWRlLXBjaCAldC5wY2ggLWFyY210LWNoZWNrIC12ZXJpZnkgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZibG9ja3MgLVdlcnJvciAlcwotLy8gRElTQUJMRTogbWluZ3czMgogCiAvLyByZGFyOi8vOTYwMTQzNwogQGludGVyZmFjZSBJOTYwMTQzNyB7CmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2NoZWNraW5nLWluLWFyYy5tIGIvdGVzdC9BUkNNVC9jaGVja2luZy1pbi1hcmMubQppbmRleCA0MGQ5YjE2Li5kNDFhMTYyIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL2NoZWNraW5nLWluLWFyYy5tCisrKyBiL3Rlc3QvQVJDTVQvY2hlY2tpbmctaW4tYXJjLm0KQEAgLTEsNSArMSw0IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWFyY210LWNoZWNrIC1mb2JqYy1hcmMgLWZvYmpjLXJ1bnRpbWU9bWFjb3N4LTEwLjguMCAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMiAtZmJsb2NrcyAtV2Vycm9yICVzCi0vLyBESVNBQkxFOiBtaW5ndzMyCiAKICNpZiBfX2hhc19mZWF0dXJlKG9iamNfYXJjKQogI2RlZmluZSBOU19BVVRPTUFURURfUkVGQ09VTlRfVU5BVkFJTEFCTEUgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUoIm5vdCBhdmFpbGFibGUgaW4gYXV0b21hdGljIHJlZmVyZW5jZSBjb3VudGluZyBtb2RlIikpKQpkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9jaGVja2luZy5tIGIvdGVzdC9BUkNNVC9jaGVja2luZy5tCmluZGV4IGE1NTA2MzMuLjc4MTUxMDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvY2hlY2tpbmcubQorKysgYi90ZXN0L0FSQ01UL2NoZWNraW5nLm0KQEAgLTEsNSArMSw0IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWFyY210LWNoZWNrIC12ZXJpZnkgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZibG9ja3MgLVdlcnJvciAlcwotLy8gRElTQUJMRTogbWluZ3czMgogCiAjaWYgX19oYXNfZmVhdHVyZShvYmpjX2FyYykKICNkZWZpbmUgTlNfQVVUT01BVEVEX1JFRkNPVU5UX1VOQVZBSUxBQkxFIF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKCJub3QgYXZhaWxhYmxlIGluIGF1dG9tYXRpYyByZWZlcmVuY2UgY291bnRpbmcgbW9kZSIpKSkKQEAgLTQ1LDkgKzQ0LDkgQEAKIH07CiAKIEBpbnRlcmZhY2UgQSA6IE5TT2JqZWN0Ci0tIChpZClyZXRhaW47IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJhdGlvbiBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZSBoZXJlfX0KLS0gKGlkKXJldGFpbkNvdW50OyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyYXRpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgdW5hdmFpbGFibGUgaGVyZX19Ci0tIChpZClhdXRvcmVsZWFzZTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7ZGVjbGFyYXRpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgdW5hdmFpbGFibGUgaGVyZX19CistIChpZClyZXRhaW47IC8vIGV4cGVjdGVkLW5vdGUge3sncmV0YWluJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZSBoZXJlfX0KKy0gKGlkKXJldGFpbkNvdW50OyAvLyBleHBlY3RlZC1ub3RlIHt7J3JldGFpbkNvdW50JyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZSBoZXJlfX0KKy0gKGlkKWF1dG9yZWxlYXNlOyAvLyBleHBlY3RlZC1ub3RlIDIge3snYXV0b3JlbGVhc2UnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQogLSAoaWQpaW5pdDsKIC0gKG9uZXdheSB2b2lkKXJlbGVhc2U7CiAtICh2b2lkKWRlYWxsb2M7CmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2N4eC1jaGVja2luZy5tbSBiL3Rlc3QvQVJDTVQvY3h4LWNoZWNraW5nLm1tCmluZGV4IDJmNWQ1ZDUuLmFhM2JjNDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvY3h4LWNoZWNraW5nLm1tCisrKyBiL3Rlc3QvQVJDTVQvY3h4LWNoZWNraW5nLm1tCkBAIC0xLDUgKzEsNCBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1hcmNtdC1jaGVjayAtdmVyaWZ5IC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZibG9ja3MgJXMKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogLy8gQ2xhc3NlcyB0aGF0IGhhdmUgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHBvaW50ZXIuCiBzdHJ1Y3QgSGFzT2JqZWN0TWVtYmVyMCB7CkBAIC04MSw3ICs4MCw3IEBACiAKIHN0cnVjdCBGbGV4aWJsZUFycmF5TWVtYmVyMCB7CiAgIGludCBsZW5ndGg7Ci0gIGlkIGFycmF5W107IC8vIGV4cGVjdGVkLWVycm9ye3tmbGV4aWJsZSBhcnJheSBtZW1iZXIgJ2FycmF5JyBvZiBub24tUE9EIGVsZW1lbnQgdHlwZSAnaWQgX19zdHJvbmdbXSd9fQorICBpZCBhcnJheVtdOyAvLyBleHBlY3RlZC1lcnJvcnt7ZmxleGlibGUgYXJyYXkgbWVtYmVyICdhcnJheScgb2YgdHlwZSAnaWQgX19zdHJvbmdbXScgd2l0aCBub24tdHJpdmlhbCBkZXN0cnVjdGlvbn19CiB9OwogCiBzdHJ1Y3QgRmxleGlibGVBcnJheU1lbWJlcjEgewpkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9jeHgtcmV3cml0ZS5tbSBiL3Rlc3QvQVJDTVQvY3h4LXJld3JpdGUubW0KaW5kZXggOTJiYjcxOC4uNGE5YzUwYyAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9jeHgtcmV3cml0ZS5tbQorKysgYi90ZXN0L0FSQ01UL2N4eC1yZXdyaXRlLm1tCkBAIC0xLDcgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAteCBvYmplY3RpdmUtYysrICVzLnJlc3VsdAogLy8gUlVOOiBhcmNtdC10ZXN0IC0tYXJncyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC14IG9iamVjdGl2ZS1jKysgJXMgPiAldAogLy8gUlVOOiBkaWZmICV0ICVzLnJlc3VsdAotLy8gRElTQUJMRTogbWluZ3czMgogCiAjaW5jbHVkZSAiQ29tbW9uLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvY3h4LXJld3JpdGUubW0ucmVzdWx0IGIvdGVzdC9BUkNNVC9jeHgtcmV3cml0ZS5tbS5yZXN1bHQKaW5kZXggN2M5NDRkNS4uYTk2ZDI1NCAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9jeHgtcmV3cml0ZS5tbS5yZXN1bHQKKysrIGIvdGVzdC9BUkNNVC9jeHgtcmV3cml0ZS5tbS5yZXN1bHQKQEAgLTEsNyArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC14IG9iamVjdGl2ZS1jKysgJXMucmVzdWx0CiAvLyBSVU46IGFyY210LXRlc3QgLS1hcmdzIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLXggb2JqZWN0aXZlLWMrKyAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKICNpbmNsdWRlICJDb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9kZWFsbG9jLm0gYi90ZXN0L0FSQ01UL2RlYWxsb2MubQppbmRleCAzNGRmMWE0Li5kN2E3MmFmIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL2RlYWxsb2MubQorKysgYi90ZXN0L0FSQ01UL2RlYWxsb2MubQpAQCAtMSw3ICsxLDYgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC1mb2JqYy1hcmMgLXggb2JqZWN0aXZlLWMgJXMucmVzdWx0CiAvLyBSVU46IGFyY210LXRlc3QgLS1hcmdzIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLXggb2JqZWN0aXZlLWMgJXMgPiAldAogLy8gUlVOOiBkaWZmICV0ICVzLnJlc3VsdAotLy8gRElTQUJMRTogbWluZ3czMgogCiBAaW50ZXJmYWNlIEEKIC0gKGlkKXJldGFpbjsKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvZGVhbGxvYy5tLnJlc3VsdCBiL3Rlc3QvQVJDTVQvZGVhbGxvYy5tLnJlc3VsdAppbmRleCAzZmYyODg1Li5mYmQ5ZTQ0IDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL2RlYWxsb2MubS5yZXN1bHQKKysrIGIvdGVzdC9BUkNNVC9kZWFsbG9jLm0ucmVzdWx0CkBAIC0xLDcgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAteCBvYmplY3RpdmUtYyAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYyAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKIEBpbnRlcmZhY2UgQQogLSAoaWQpcmV0YWluOwpkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9kZXNpZ25hdGVkLWluaXQtaW4taGVhZGVyL2Rlc2lnbmF0ZWQtaW5pdC1pbi1oZWFkZXIubSBiL3Rlc3QvQVJDTVQvZGVzaWduYXRlZC1pbml0LWluLWhlYWRlci9kZXNpZ25hdGVkLWluaXQtaW4taGVhZGVyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4NjU4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQVJDTVQvZGVzaWduYXRlZC1pbml0LWluLWhlYWRlci9kZXNpZ25hdGVkLWluaXQtaW4taGVhZGVyLm0KQEAgLTAsMCArMSwzIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLW9iamNtdC1taWdyYXRlLWRlc2lnbmF0ZWQtaW5pdCAtb2JqY210LW1pZ3JhdGUtcmVhZHdyaXRlLXByb3BlcnR5IC1vYmpjbXQtbWlncmF0ZS1pbnN0YW5jZXR5cGUgLXggb2JqZWN0aXZlLWMgJVMvZmlsZTEubS5pbiAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMSAtZm9iamMtYXJjIC1taWdyYXRlIC1vICV0MS5yZW1hcAorLy8gUlVOOiAlY2xhbmdfY2MxIC1vYmpjbXQtbWlncmF0ZS1kZXNpZ25hdGVkLWluaXQgLW9iamNtdC1taWdyYXRlLXJlYWR3cml0ZS1wcm9wZXJ0eSAtb2JqY210LW1pZ3JhdGUtaW5zdGFuY2V0eXBlIC14IG9iamVjdGl2ZS1jICVTL2ZpbGUyLm0uaW4gLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTEgLWZvYmpjLWFyYyAtbWlncmF0ZSAtbyAldDIucmVtYXAKKy8vIFJVTjogYy1hcmNtdC10ZXN0ICV0MS5yZW1hcCAldDIucmVtYXAgfCBhcmNtdC10ZXN0IC12ZXJpZnktdHJhbnNmb3JtZWQtZmlsZXMgJVMvaGVhZGVyMS5oLnJlc3VsdCAlUy9maWxlMi5tLmluLnJlc3VsdApkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9kZXNpZ25hdGVkLWluaXQtaW4taGVhZGVyL2ZpbGUxLm0uaW4gYi90ZXN0L0FSQ01UL2Rlc2lnbmF0ZWQtaW5pdC1pbi1oZWFkZXIvZmlsZTEubS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjAxYjMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9BUkNNVC9kZXNpZ25hdGVkLWluaXQtaW4taGVhZGVyL2ZpbGUxLm0uaW4KQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAiaGVhZGVyMS5oIgorCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2Rlc2lnbmF0ZWQtaW5pdC1pbi1oZWFkZXIvZmlsZTIubS5pbiBiL3Rlc3QvQVJDTVQvZGVzaWduYXRlZC1pbml0LWluLWhlYWRlci9maWxlMi5tLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODE1OTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0FSQ01UL2Rlc2lnbmF0ZWQtaW5pdC1pbi1oZWFkZXIvZmlsZTIubS5pbgpAQCAtMCwwICsxLDE0IEBACisjaW5jbHVkZSAiaGVhZGVyMS5oIgorCitAaW1wbGVtZW50YXRpb24gUzEKKy0oaW50KXByb3AgeyByZXR1cm4gMDsgfQorLSh2b2lkKXNldFByb3A6KGludClwIHt9CisrKGlkKXMxIHsgcmV0dXJuIDA7IH0KKy0oaWQpaW5pdFdpdGhGb286KE5TU3RyaW5nKilmb28gCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CitAZW5kCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2Rlc2lnbmF0ZWQtaW5pdC1pbi1oZWFkZXIvZmlsZTIubS5pbi5yZXN1bHQgYi90ZXN0L0FSQ01UL2Rlc2lnbmF0ZWQtaW5pdC1pbi1oZWFkZXIvZmlsZTIubS5pbi5yZXN1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2NWVkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQVJDTVQvZGVzaWduYXRlZC1pbml0LWluLWhlYWRlci9maWxlMi5tLmluLnJlc3VsdApAQCAtMCwwICsxLDE0IEBACisjaW5jbHVkZSAiaGVhZGVyMS5oIgorCitAaW1wbGVtZW50YXRpb24gUzEKKy0oaW50KXByb3AgeyByZXR1cm4gMDsgfQorLSh2b2lkKXNldFByb3A6KGludClwIHt9CisrKGluc3RhbmNldHlwZSlzMSB7IHJldHVybiAwOyB9CistKGluc3RhbmNldHlwZSlpbml0V2l0aEZvbzooTlNTdHJpbmcqKWZvbyAKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgaWYgKHNlbGYpIHsKKyAgfQorICByZXR1cm4gc2VsZjsKK30KK0BlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvZGVzaWduYXRlZC1pbml0LWluLWhlYWRlci9oZWFkZXIxLmggYi90ZXN0L0FSQ01UL2Rlc2lnbmF0ZWQtaW5pdC1pbi1oZWFkZXIvaGVhZGVyMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NjY4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0FSQ01UL2Rlc2lnbmF0ZWQtaW5pdC1pbi1oZWFkZXIvaGVhZGVyMS5oCkBAIC0wLDAgKzEsMTQgQEAKKyNkZWZpbmUgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUiBfX2F0dHJpYnV0ZV9fKChvYmpjX2Rlc2lnbmF0ZWRfaW5pdGlhbGl6ZXIpKQorCitAY2xhc3MgTlNTdHJpbmc7CisKK0BpbnRlcmZhY2UgQjEKKy0oaWQpaW5pdDsKK0BlbmQKKworQGludGVyZmFjZSBTMSA6IEIxCistKGludClwcm9wOworLSh2b2lkKXNldFByb3A6KGludClwOworKyhpZClzMTsKKy0oaWQpaW5pdFdpdGhGb286KE5TU3RyaW5nKilmb287CitAZW5kCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL2Rlc2lnbmF0ZWQtaW5pdC1pbi1oZWFkZXIvaGVhZGVyMS5oLnJlc3VsdCBiL3Rlc3QvQVJDTVQvZGVzaWduYXRlZC1pbml0LWluLWhlYWRlci9oZWFkZXIxLmgucmVzdWx0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NDE3NWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0FSQ01UL2Rlc2lnbmF0ZWQtaW5pdC1pbi1oZWFkZXIvaGVhZGVyMS5oLnJlc3VsdApAQCAtMCwwICsxLDEzIEBACisjZGVmaW5lIE5TX0RFU0lHTkFURURfSU5JVElBTElaRVIgX19hdHRyaWJ1dGVfXygob2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyKSkKKworQGNsYXNzIE5TU3RyaW5nOworCitAaW50ZXJmYWNlIEIxCistKGluc3RhbmNldHlwZSlpbml0OworQGVuZAorCitAaW50ZXJmYWNlIFMxIDogQjEKK0Bwcm9wZXJ0eSAobm9uYXRvbWljKSBpbnQgcHJvcDsKKysoaW5zdGFuY2V0eXBlKXMxOworLShpbnN0YW5jZXR5cGUpaW5pdFdpdGhGb286KE5TU3RyaW5nKilmb28gTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKK0BlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvaW5pdC5tIGIvdGVzdC9BUkNNVC9pbml0Lm0KaW5kZXggOWRiYjFmOC4uYjFmMTI3ZSAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9pbml0Lm0KKysrIGIvdGVzdC9BUkNNVC9pbml0Lm0KQEAgLTEsNyArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC14IG9iamVjdGl2ZS1jICVzLnJlc3VsdAogLy8gUlVOOiBhcmNtdC10ZXN0IC0tYXJncyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC14IG9iamVjdGl2ZS1jICVzID4gJXQKIC8vIFJVTjogZGlmZiAldCAlcy5yZXN1bHQKLS8vIERJU0FCTEU6IG1pbmd3MzIKIAogI2RlZmluZSBuaWwgKHZvaWQgKikwCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvaW5pdC5tLnJlc3VsdCBiL3Rlc3QvQVJDTVQvaW5pdC5tLnJlc3VsdAppbmRleCBkN2Y3MzAwLi5kNTUwZGVkIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL2luaXQubS5yZXN1bHQKKysrIGIvdGVzdC9BUkNNVC9pbml0Lm0ucmVzdWx0CkBAIC0xLDcgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAteCBvYmplY3RpdmUtYyAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYyAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKICNkZWZpbmUgbmlsICh2b2lkICopMAogCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL21pZ3JhdGUtcGxpc3Qtb3V0cHV0Lm0gYi90ZXN0L0FSQ01UL21pZ3JhdGUtcGxpc3Qtb3V0cHV0Lm0KaW5kZXggMzc3ZGNlMy4uOWI0N2I5MSAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9taWdyYXRlLXBsaXN0LW91dHB1dC5tCisrKyBiL3Rlc3QvQVJDTVQvbWlncmF0ZS1wbGlzdC1vdXRwdXQubQpAQCAtNDksNCArNDksMyBAQAogLy8gQ0hFQ0s6IDwvZGljdD4KIC8vIENIRUNLOiA8L3BsaXN0PgogCi0vLyBESVNBQkxFOiBtaW5ndzMyCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL21pZ3JhdGUtc3BhY2UtaW4tcGF0aC5tIGIvdGVzdC9BUkNNVC9taWdyYXRlLXNwYWNlLWluLXBhdGgubQppbmRleCA4OWRmZTE0Li5hNzk3ZTZkIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL21pZ3JhdGUtc3BhY2UtaW4tcGF0aC5tCisrKyBiL3Rlc3QvQVJDTVQvbWlncmF0ZS1zcGFjZS1pbi1wYXRoLm0KQEAgLTMsNCArMywzIEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWFyY210LW1pZ3JhdGUgLW10LW1pZ3JhdGUtZGlyZWN0b3J5ICV0Lm1pZ3JhdGUgJVMvIndpdGggc3BhY2UiL3Rlc3QyLm0uaW4gLXggb2JqZWN0aXZlLWMgCiAvLyBSVU46IGMtYXJjbXQtdGVzdCAtbXQtbWlncmF0ZS1kaXJlY3RvcnkgJXQubWlncmF0ZSB8IGFyY210LXRlc3QgLXZlcmlmeS10cmFuc2Zvcm1lZC1maWxlcyAlUy8id2l0aCBzcGFjZSIvdGVzdDEubS5pbi5yZXN1bHQgJVMvIndpdGggc3BhY2UiL3Rlc3QyLm0uaW4ucmVzdWx0ICVTLyJ3aXRoIHNwYWNlIi90ZXN0LmgucmVzdWx0CiAvLyBSVU46IHJtIC1yZiAldC5taWdyYXRlCi0vLyBESVNBQkxFOiBtaW5ndzMyCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL21pZ3JhdGUtd2l0aC1wY2gubSBiL3Rlc3QvQVJDTVQvbWlncmF0ZS13aXRoLXBjaC5tCmluZGV4IDdkY2E4YmUuLjFhYWZiZGEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvbWlncmF0ZS13aXRoLXBjaC5tCisrKyBiL3Rlc3QvQVJDTVQvbWlncmF0ZS13aXRoLXBjaC5tCkBAIC00LDQgKzQsMyBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1hcmNtdC1taWdyYXRlIC1tdC1taWdyYXRlLWRpcmVjdG9yeSAldCAlUy9JbnB1dHMvdGVzdDIubS5pbiAteCBvYmplY3RpdmUtYyAtaW5jbHVkZS1wY2ggJXQucGNoCiAvLyBSVU46IGMtYXJjbXQtdGVzdCAtbXQtbWlncmF0ZS1kaXJlY3RvcnkgJXQgfCBhcmNtdC10ZXN0IC12ZXJpZnktdHJhbnNmb3JtZWQtZmlsZXMgJVMvSW5wdXRzL3Rlc3QxLm0uaW4ucmVzdWx0ICVTL0lucHV0cy90ZXN0Mi5tLmluLnJlc3VsdCAlUy9JbnB1dHMvdGVzdC5oLnJlc3VsdAogLy8gUlVOOiBybSAtcmYgJXQKLS8vIERJU0FCTEU6IG1pbmd3MzIKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvbWlncmF0ZS5tIGIvdGVzdC9BUkNNVC9taWdyYXRlLm0KaW5kZXggNmY0MTI1OC4uZDkyY2VmNyAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9taWdyYXRlLm0KKysrIGIvdGVzdC9BUkNNVC9taWdyYXRlLm0KQEAgLTMsNCArMywzIEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWFyY210LW1pZ3JhdGUgLW10LW1pZ3JhdGUtZGlyZWN0b3J5ICV0ICVTL0lucHV0cy90ZXN0Mi5tLmluIC14IG9iamVjdGl2ZS1jIAogLy8gUlVOOiBjLWFyY210LXRlc3QgLW10LW1pZ3JhdGUtZGlyZWN0b3J5ICV0IHwgYXJjbXQtdGVzdCAtdmVyaWZ5LXRyYW5zZm9ybWVkLWZpbGVzICVTL0lucHV0cy90ZXN0MS5tLmluLnJlc3VsdCAlUy9JbnB1dHMvdGVzdDIubS5pbi5yZXN1bHQgJVMvSW5wdXRzL3Rlc3QuaC5yZXN1bHQKIC8vIFJVTjogcm0gLXJmICV0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL25vLWNhbmNlbGluZy1icmlkZ2UtdG8tYnJpZGdlLWNhc3QubSBiL3Rlc3QvQVJDTVQvbm8tY2FuY2VsaW5nLWJyaWRnZS10by1icmlkZ2UtY2FzdC5tCmluZGV4IDgxODQxZmIuLjJjNDc4MjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvbm8tY2FuY2VsaW5nLWJyaWRnZS10by1icmlkZ2UtY2FzdC5tCisrKyBiL3Rlc3QvQVJDTVQvbm8tY2FuY2VsaW5nLWJyaWRnZS10by1icmlkZ2UtY2FzdC5tCkBAIC0xLDUgKzEsNCBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1hcmNtdC1jaGVjayAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC14IG9iamVjdGl2ZS1jIC12ZXJpZnkgJXMgCi0vLyBESVNBQkxFOiBtaW5ndzMyCiAvLyByZGFyOi8vMTAzODcwODgKIHR5cGVkZWYgY29uc3Qgdm9pZCAqIENGVHlwZVJlZjsKIENGVHlwZVJlZiBDRkJyaWRnaW5nUmV0YWluKGlkIFgpOwpkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9ub25vYmpjLXRvLW9iamMtY2FzdC0yLm0gYi90ZXN0L0FSQ01UL25vbm9iamMtdG8tb2JqYy1jYXN0LTIubQppbmRleCBlNTU0YzdkLi4yYjQyMWIwIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL25vbm9iamMtdG8tb2JqYy1jYXN0LTIubQorKysgYi90ZXN0L0FSQ01UL25vbm9iamMtdG8tb2JqYy1jYXN0LTIubQpAQCAtMSw1ICsxLDQgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtYXJjbXQtY2hlY2sgLXZlcmlmeSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAlcwotLy8gRElTQUJMRTogbWluZ3czMgogCiAjaW5jbHVkZSAiQ29tbW9uLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvbm9ub2JqYy10by1vYmpjLWNhc3QubSBiL3Rlc3QvQVJDTVQvbm9ub2JqYy10by1vYmpjLWNhc3QubQppbmRleCA1NWI2NjU1Li5iN2QyYTczIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL25vbm9iamMtdG8tb2JqYy1jYXN0Lm0KKysrIGIvdGVzdC9BUkNNVC9ub25vYmpjLXRvLW9iamMtY2FzdC5tCkBAIC0xLDcgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAteCBvYmplY3RpdmUtYyAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYyAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKICNpbmNsdWRlICJDb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9ub25vYmpjLXRvLW9iamMtY2FzdC5tLnJlc3VsdCBiL3Rlc3QvQVJDTVQvbm9ub2JqYy10by1vYmpjLWNhc3QubS5yZXN1bHQKaW5kZXggNGY1MDhmNi4uY2U4MjdiYSAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9ub25vYmpjLXRvLW9iamMtY2FzdC5tLnJlc3VsdAorKysgYi90ZXN0L0FSQ01UL25vbm9iamMtdG8tb2JqYy1jYXN0Lm0ucmVzdWx0CkBAIC0xLDcgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAteCBvYmplY3RpdmUtYyAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYyAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKICNpbmNsdWRlICJDb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9vYmpjbXQtYXJjLWNmLWFubm90YXRpb25zLm0gYi90ZXN0L0FSQ01UL29iamNtdC1hcmMtY2YtYW5ub3RhdGlvbnMubQppbmRleCA5NzcyODI1Li4xZTA2M2Y2IDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL29iamNtdC1hcmMtY2YtYW5ub3RhdGlvbnMubQorKysgYi90ZXN0L0FSQ01UL29iamNtdC1hcmMtY2YtYW5ub3RhdGlvbnMubQpAQCAtMzYwLDcgKzM2MCw3IEBACiAKIE5TRGF0ZSogZ2xvYmFsX3g7CiAKLS8vIFRlc3QgdG8gc2VlIGlmIHdlIHN1cHJlc3NzIGFuIGVycm9yIHdoZW4gd2Ugc3RvcmUgdGhlIHBvaW50ZXIKKy8vIFRlc3QgdG8gc2VlIGlmIHdlIHN1cHByZXNzIGFuIGVycm9yIHdoZW4gd2Ugc3RvcmUgdGhlIHBvaW50ZXIKIC8vIHRvIGEgZ2xvYmFsLgogCiBDRkFic29sdXRlVGltZSBmMygpIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvb2JqY210LWFyYy1jZi1hbm5vdGF0aW9ucy5tLnJlc3VsdCBiL3Rlc3QvQVJDTVQvb2JqY210LWFyYy1jZi1hbm5vdGF0aW9ucy5tLnJlc3VsdAppbmRleCA3ZTBhOTA0Li43NWRkYTZjIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL29iamNtdC1hcmMtY2YtYW5ub3RhdGlvbnMubS5yZXN1bHQKKysrIGIvdGVzdC9BUkNNVC9vYmpjbXQtYXJjLWNmLWFubm90YXRpb25zLm0ucmVzdWx0CkBAIC0zOTAsNyArMzkwLDcgQEAKIAogTlNEYXRlKiBnbG9iYWxfeDsKIAotLy8gVGVzdCB0byBzZWUgaWYgd2Ugc3VwcmVzc3MgYW4gZXJyb3Igd2hlbiB3ZSBzdG9yZSB0aGUgcG9pbnRlcgorLy8gVGVzdCB0byBzZWUgaWYgd2Ugc3VwcHJlc3MgYW4gZXJyb3Igd2hlbiB3ZSBzdG9yZSB0aGUgcG9pbnRlcgogLy8gdG8gYSBnbG9iYWwuCiAKIENGQWJzb2x1dGVUaW1lIGYzKCkgewpkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9vYmpjbXQtYXRvbWljLXByb3BlcnR5Lm0ucmVzdWx0IGIvdGVzdC9BUkNNVC9vYmpjbXQtYXRvbWljLXByb3BlcnR5Lm0ucmVzdWx0CmluZGV4IDE2NTBjZDIuLjMzNzhmZjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvb2JqY210LWF0b21pYy1wcm9wZXJ0eS5tLnJlc3VsdAorKysgYi90ZXN0L0FSQ01UL29iamNtdC1hdG9taWMtcHJvcGVydHkubS5yZXN1bHQKQEAgLTIzLDE0ICsyMywxNCBAQAogfQogQHByb3BlcnR5ICh3ZWFrKSBOU1N0cmluZyAqV2Vha1Byb3A7CiAKLUBwcm9wZXJ0eSAocmV0YWluKSBOU1N0cmluZyAqU3Ryb25nUHJvcDsKK0Bwcm9wZXJ0eSAoc3Ryb25nKSBOU1N0cmluZyAqU3Ryb25nUHJvcDsKIAotQHByb3BlcnR5IChyZXRhaW4pIE5TU3RyaW5nICpVbmF2YWlsUHJvcCAgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUpKTsKK0Bwcm9wZXJ0eSAoc3Ryb25nKSBOU1N0cmluZyAqVW5hdmFpbFByb3AgIF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSk7CiAtICh2b2lkKSBzZXRVbmF2YWlsUHJvcCAgOiAoTlNTdHJpbmcgKilWYWw7CiAKLUBwcm9wZXJ0eSAocmV0YWluKSBOU1N0cmluZyAqVW5hdmFpbFByb3AxICBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOworQHByb3BlcnR5IChzdHJvbmcpIE5TU3RyaW5nICpVbmF2YWlsUHJvcDEgIF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSk7CiAKLUBwcm9wZXJ0eSAocmV0YWluKSBOU1N0cmluZyAqVW5hdmFpbFByb3AyOworQHByb3BlcnR5IChzdHJvbmcpIE5TU3RyaW5nICpVbmF2YWlsUHJvcDI7CiAtICh2b2lkKSBzZXRVbmF2YWlsUHJvcDIgIDogKE5TU3RyaW5nICopVmFsICBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOwogCiBAcHJvcGVydHkgKGNvcHkpIE5TRGljdGlvbmFyeSAqdW5kb0FjdGlvbjsKQEAgLTQ4LDEwICs0OCwxMCBAQAogICAgIE5TQXJyYXkgKl9uYW1lczM7CiAgICAgTlNBcnJheSAqX25hbWVzNDsKIH0KLUBwcm9wZXJ0eSAocmV0YWluKSBOU0FycmF5ICpuYW1lczI7Ci1AcHJvcGVydHkgKHJldGFpbikgTlNBcnJheSAqbmFtZXMzOwotQHByb3BlcnR5IChyZXRhaW4pIE5TQXJyYXkgKm5hbWVzNDsKLUBwcm9wZXJ0eSAocmV0YWluKSBOU0FycmF5ICpuYW1lczE7CitAcHJvcGVydHkgKHN0cm9uZykgTlNBcnJheSAqbmFtZXMyOworQHByb3BlcnR5IChzdHJvbmcpIE5TQXJyYXkgKm5hbWVzMzsKK0Bwcm9wZXJ0eSAoc3Ryb25nKSBOU0FycmF5ICpuYW1lczQ7CitAcHJvcGVydHkgKHN0cm9uZykgTlNBcnJheSAqbmFtZXMxOwogQGVuZAogCiAvLyBQcm9wZXJ0aWVzIHRoYXQgY29udGFpbiB0aGUgbmFtZSAiZGVsZWdhdGUiIG9yICJkYXRhU291cmNlIiwKQEAgLTY0LDkgKzY0LDkgQEAKIEBwcm9wZXJ0eSAoYXNzaWduKSBpZCB4eHhkZWxlZ2F0ZVlZWTsKIAogCi1AcHJvcGVydHkgKHJldGFpbikgaWQgTVl0YXJnZXQ7CitAcHJvcGVydHkgKHN0cm9uZykgaWQgTVl0YXJnZXQ7CiAKLUBwcm9wZXJ0eSAocmV0YWluKSBpZCB0YXJnZXRYOworQHByb3BlcnR5IChzdHJvbmcpIGlkIHRhcmdldFg7CiAgCiBAcHJvcGVydHkgIGludCB2YWx1ZTsKIApAQCAtODAsMTQgKzgwLDE0IEBACiAKIC0gKHZvaWQpIE5vdGhpbmc7CiBAcHJvcGVydHkgKHJlYWRvbmx5KSBpbnQgTGVuZ3RoOwotQHByb3BlcnR5IChyZWFkb25seSwgcmV0YWluKSBpZCBvYmplY3Q7CitAcHJvcGVydHkgKHJlYWRvbmx5LCBzdHJvbmcpIGlkIG9iamVjdDsKICsgKGRvdWJsZSkgRDsKIEBwcm9wZXJ0eSAocmVhZG9ubHkpIHZvaWQgKkpTT2JqZWN0IFdFQktJVF9PQkpDX01FVEhPRF9BTk5PVEFUSU9OKEFWQUlMQUJMRV9XRUJLSVRfVkVSU0lPTl8zXzBfQU5EX0xBVEVSKTsKIEBwcm9wZXJ0eSAoZ2V0dGVyPWlzSWdub3JpbmdJbnRlcmFjdGlvbkV2ZW50cywgcmVhZG9ubHkpIEJPT0wgaWdub3JpbmdJbnRlcmFjdGlvbkV2ZW50czsKIAotQHByb3BlcnR5IChnZXR0ZXI9Z2V0U3RyaW5nVmFsdWUsIHJldGFpbikgTlNTdHJpbmcgKnN0cmluZ1ZhbHVlOworQHByb3BlcnR5IChnZXR0ZXI9Z2V0U3RyaW5nVmFsdWUsIHN0cm9uZykgTlNTdHJpbmcgKnN0cmluZ1ZhbHVlOwogQHByb3BlcnR5IChnZXR0ZXI9Z2V0Q291bnRlclZhbHVlLCByZWFkb25seSkgQk9PTCBjb3VudGVyVmFsdWU7Ci1AcHJvcGVydHkgKGdldHRlcj1nZXRuc19kaXh0aW9uYXJ5LCByZWFkb25seSwgcmV0YWluKSBOU0RpY3Rpb25hcnkgKm5zX2RpeHRpb25hcnk7CitAcHJvcGVydHkgKGdldHRlcj1nZXRuc19kaXh0aW9uYXJ5LCByZWFkb25seSwgY29weSkgTlNEaWN0aW9uYXJ5ICpuc19kaXh0aW9uYXJ5OwogCiAtIChCT09MKWlzM2JhcjsgLy8gd2F0Y2ggb3V0CiAtIChOU1N0cmluZyAqKWdldDNmb287IC8vIHdhdGNoIG91dApAQCAtMTA4LDkgKzEwOCw5IEBACiBAcHJvcGVydHkgKGFzc2lnbikgaWQgeHh4ZGVsZWdhdGVZWVk7CiAKIAotQHByb3BlcnR5IChyZXRhaW4pIGlkIE1ZdGFyZ2V0OworQHByb3BlcnR5IChzdHJvbmcpIGlkIE1ZdGFyZ2V0OwogCi1AcHJvcGVydHkgKHJldGFpbikgaWQgdGFyZ2V0WDsKK0Bwcm9wZXJ0eSAoc3Ryb25nKSBpZCB0YXJnZXRYOwogCiBAcHJvcGVydHkgIGludCB2YWx1ZTsKIApAQCAtMTI0LDcgKzEyNCw3IEBACiAKIC0gKHZvaWQpIE5vdGhpbmc7CiBAcHJvcGVydHkgKHJlYWRvbmx5KSBpbnQgTGVuZ3RoOwotQHByb3BlcnR5IChyZWFkb25seSwgcmV0YWluKSBpZCBvYmplY3Q7CitAcHJvcGVydHkgKHJlYWRvbmx5LCBzdHJvbmcpIGlkIG9iamVjdDsKICsgKGRvdWJsZSkgRDsKIAogLSAoQk9PTClpczNiYXI7IC8vIHdhdGNoIG91dApAQCAtMTYxLDI2ICsxNjEsMjYgQEAKIAogQGludGVyZmFjZSBOU1VSTAogLy8gRG8gbm90IGluZmVyIGEgcHJvcGVydHkuCi1AcHJvcGVydHkgKHJldGFpbikgTlNVUkwgKmFwcFN0b3JlUmVjZWlwdFVSTCBOU19BVkFJTEFCTEU7CitAcHJvcGVydHkgKHN0cm9uZykgTlNVUkwgKmFwcFN0b3JlUmVjZWlwdFVSTCBOU19BVkFJTEFCTEU7CiAtICh2b2lkKSBzZXRBcHBTdG9yZVJlY2VpcHRVUkwgOiAoTlNVUkwgKilvYmplY3Q7CiAKLUBwcm9wZXJ0eSAocmV0YWluKSBOU1VSTCAqYXBwU3RvcmVSZWNlaXB0VVJMWCBOU19BVkFJTEFCTEU7CitAcHJvcGVydHkgKHN0cm9uZykgTlNVUkwgKmFwcFN0b3JlUmVjZWlwdFVSTFggTlNfQVZBSUxBQkxFOwogCiAvLyBEbyBub3QgaW5mZXIgYSBwcm9wZXJ0eS4KLUBwcm9wZXJ0eSAocmV0YWluKSBOU1VSTCAqYXBwU3RvcmVSZWNlaXB0VVJMWSA7CitAcHJvcGVydHkgKHN0cm9uZykgTlNVUkwgKmFwcFN0b3JlUmVjZWlwdFVSTFkgOwogLSAodm9pZCkgc2V0QXBwU3RvcmVSZWNlaXB0VVJMWSA6IChOU1VSTCAqKW9iamVjdCBOU19BVkFJTEFCTEU7CiAKLUBwcm9wZXJ0eSAocmVhZG9ubHksIHJldGFpbikgaWQgT2tUb0luZmVyIE5TX0FWQUlMQUJMRTsKK0Bwcm9wZXJ0eSAocmVhZG9ubHksIHN0cm9uZykgaWQgT2tUb0luZmVyIE5TX0FWQUlMQUJMRTsKIAogLy8gRG8gbm90IGluZmVyIGEgcHJvcGVydHkuCi1AcHJvcGVydHkgKHJldGFpbikgTlNVUkwgKmFwcFN0b3JlUmVjZWlwdFVSTFogOworQHByb3BlcnR5IChzdHJvbmcpIE5TVVJMICphcHBTdG9yZVJlY2VpcHRVUkxaIDsKIC0gKHZvaWQpIHNldEFwcFN0b3JlUmVjZWlwdFVSTFogOiAoTlNVUkwgKilvYmplY3QgTlNfQVZBSUxBQkxFOwogCiAvLyBEbyBub3QgaW5mZXIgYSBwcm9wZXJ0eS4KIC0gKGlkKSB0MSBOT1JFVFVSTiBOU19BVkFJTEFCTEU7CiAtICh2b2lkKSBzZXRUMSA6IChpZCkgYXJnIE5TX0FWQUlMQUJMRTsKIAotQHByb3BlcnR5IChyZXRhaW4pIGlkIG1ldGhvZDEgQUxJR05FRCBOU19BVkFJTEFCTEU7CitAcHJvcGVydHkgKHN0cm9uZykgaWQgbWV0aG9kMSBBTElHTkVEIE5TX0FWQUlMQUJMRTsKIAogLSAoTlNVUkwgKilpbml0OyAgLy8gTm8gQ2hhbmdlCiArIChpZClhbGxvYzsgICAgICAvLyBObyBDaGFuZ2UKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvb2JqY210LWRlcHJlY2F0ZWQtY2F0ZWdvcnkubSBiL3Rlc3QvQVJDTVQvb2JqY210LWRlcHJlY2F0ZWQtY2F0ZWdvcnkubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzOWU1YS4uMDAwMDAwMAotLS0gYS90ZXN0L0FSQ01UL29iamNtdC1kZXByZWNhdGVkLWNhdGVnb3J5Lm0KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLyBSVU46IHJtIC1yZiAldAotLy8gUlVOOiAlY2xhbmdfY2MxIC1vYmpjbXQtbWlncmF0ZS1hbm5vdGF0aW9uIC1tdC1taWdyYXRlLWRpcmVjdG9yeSAldCAlcyAteCBvYmplY3RpdmUtYyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMQotLy8gUlVOOiBjLWFyY210LXRlc3QgLW10LW1pZ3JhdGUtZGlyZWN0b3J5ICV0IHwgYXJjbXQtdGVzdCAtdmVyaWZ5LXRyYW5zZm9ybWVkLWZpbGVzICVzLnJlc3VsdAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLXggb2JqZWN0aXZlLWMgJXMucmVzdWx0Ci0vLyByZGFyOi8vMTUzMzc2NjEKLQotI2RlZmluZSBERVBSRUNBVEVEICBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkgCi0KLUBpbnRlcmZhY2UgTlNBcnJheQotLSAoaW50KW9uZTsKLUBlbmQKLQotQGludGVyZmFjZSBOU0FycmF5IChOU0RyYWdnaW5nU291cmNlRGVwcmVjYXRlZCkKLQotLyogVGhpcyBtZXRob2QgaXMgdW5zYWZlIGJlY2F1c2UgaXQgY291bGQgcG90ZW50aWFsbHkgY2F1c2UgYnVmZmVyIG92ZXJydW5zLiBZb3Ugc2hvdWxkIHVzZSAtZ2V0T2JqZWN0czpyYW5nZTogaW5zdGVhZC4KLSovCi0tICh2b2lkKWdldE9iamVjdHM6KGlkIF9fdW5zYWZlX3VucmV0YWluZWQgW10pb2JqZWN0czsKLS0gKHZvaWQpZGVwX2dldE9iamVjdHM6KGlkIF9fdW5zYWZlX3VucmV0YWluZWQgW10pZGVwX29iamVjdHMgREVQUkVDQVRFRDsKLQotQGVuZAotCi1AaW50ZXJmYWNlIE5TQXJyYXkgKE5TRGVwcmVjYXRlZCkKLQotLyogVGhpcyBtZXRob2QgaXMgdW5zYWZlIGJlY2F1c2UgaXQgY291bGQgcG90ZW50aWFsbHkgY2F1c2UgYnVmZmVyIG92ZXJydW5zLiBZb3Ugc2hvdWxkIHVzZSAtZ2V0T2JqZWN0czpyYW5nZTogaW5zdGVhZC4KLSovCi0tICh2b2lkKWRlcF9nZXRPYmplY3RzOihpZCBfX3Vuc2FmZV91bnJldGFpbmVkIFtdKWRlcF9vYmplY3RzIERFUFJFQ0FURUQ7Ci0tICh2b2lkKWdldE9iamVjdHM6KGlkIF9fdW5zYWZlX3VucmV0YWluZWQgW10pb2JqZWN0czsKLUBwcm9wZXJ0eSBpbnQgUDE7Ci1AcHJvcGVydHkgaW50IFAyIERFUFJFQ0FURUQ7Ci1AZW5kCi0KLUBpbnRlcmZhY2UgTlNBcnJheSAoRHJhZ2dpbmdTb3VyY2VEZXByZWNhdGVkKQotCi0vKiBUaGlzIG1ldGhvZCBpcyB1bnNhZmUgYmVjYXVzZSBpdCBjb3VsZCBwb3RlbnRpYWxseSBjYXVzZSBidWZmZXIgb3ZlcnJ1bnMuIFlvdSBzaG91bGQgdXNlIC1nZXRPYmplY3RzOnJhbmdlOiBpbnN0ZWFkLgotKi8KLS0gKHZvaWQpZ2V0T2JqZWN0czooaWQgX191bnNhZmVfdW5yZXRhaW5lZCBbXSlvYmplY3RzOwotLSAodm9pZClkZXBfZ2V0T2JqZWN0czooaWQgX191bnNhZmVfdW5yZXRhaW5lZCBbXSlkZXBfb2JqZWN0cyBERVBSRUNBVEVEOwotQHByb3BlcnR5IGludCBQMTsKLUBwcm9wZXJ0eSBpbnQgUDIgREVQUkVDQVRFRDsKLQotQGVuZAotCi1AaW50ZXJmYWNlIE5TQXJyYXkgKERlcHJlY2F0ZWQpCi0tICh2b2lkKWdldE9iamVjdHM6KGlkIF9fdW5zYWZlX3VucmV0YWluZWQgW10pb2JqZWN0czsKLS0gKHZvaWQpZGVwX2dldE9iamVjdHM6KGlkIF9fdW5zYWZlX3VucmV0YWluZWQgW10pZGVwX29iamVjdHMgREVQUkVDQVRFRDsKLUBwcm9wZXJ0eSBpbnQgUDE7Ci1AcHJvcGVydHkgaW50IFAyIERFUFJFQ0FURUQ7Ci1AZW5kCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL29iamNtdC1kZXByZWNhdGVkLWNhdGVnb3J5Lm0ucmVzdWx0IGIvdGVzdC9BUkNNVC9vYmpjbXQtZGVwcmVjYXRlZC1jYXRlZ29yeS5tLnJlc3VsdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiMTAwMC4uMDAwMDAwMAotLS0gYS90ZXN0L0FSQ01UL29iamNtdC1kZXByZWNhdGVkLWNhdGVnb3J5Lm0ucmVzdWx0CisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gUlVOOiBybSAtcmYgJXQKLS8vIFJVTjogJWNsYW5nX2NjMSAtb2JqY210LW1pZ3JhdGUtYW5ub3RhdGlvbiAtbXQtbWlncmF0ZS1kaXJlY3RvcnkgJXQgJXMgLXggb2JqZWN0aXZlLWMgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTEKLS8vIFJVTjogYy1hcmNtdC10ZXN0IC1tdC1taWdyYXRlLWRpcmVjdG9yeSAldCB8IGFyY210LXRlc3QgLXZlcmlmeS10cmFuc2Zvcm1lZC1maWxlcyAlcy5yZXN1bHQKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC14IG9iamVjdGl2ZS1jICVzLnJlc3VsdAotLy8gcmRhcjovLzE1MzM3NjYxCi0KLSNkZWZpbmUgREVQUkVDQVRFRCAgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpIAotCi1AaW50ZXJmYWNlIE5TQXJyYXkKLS0gKGludClvbmU7Ci1AZW5kCi0KLUBpbnRlcmZhY2UgTlNBcnJheSAoTlNEcmFnZ2luZ1NvdXJjZURlcHJlY2F0ZWQpCi0KLS8qIFRoaXMgbWV0aG9kIGlzIHVuc2FmZSBiZWNhdXNlIGl0IGNvdWxkIHBvdGVudGlhbGx5IGNhdXNlIGJ1ZmZlciBvdmVycnVucy4gWW91IHNob3VsZCB1c2UgLWdldE9iamVjdHM6cmFuZ2U6IGluc3RlYWQuCi0qLwotLSAodm9pZClnZXRPYmplY3RzOihpZCBfX3Vuc2FmZV91bnJldGFpbmVkIFtdKW9iamVjdHMgREVQUkVDQVRFRDsKLS0gKHZvaWQpZGVwX2dldE9iamVjdHM6KGlkIF9fdW5zYWZlX3VucmV0YWluZWQgW10pZGVwX29iamVjdHMgREVQUkVDQVRFRDsKLQotQGVuZAotCi1AaW50ZXJmYWNlIE5TQXJyYXkgKE5TRGVwcmVjYXRlZCkKLQotLyogVGhpcyBtZXRob2QgaXMgdW5zYWZlIGJlY2F1c2UgaXQgY291bGQgcG90ZW50aWFsbHkgY2F1c2UgYnVmZmVyIG92ZXJydW5zLiBZb3Ugc2hvdWxkIHVzZSAtZ2V0T2JqZWN0czpyYW5nZTogaW5zdGVhZC4KLSovCi0tICh2b2lkKWRlcF9nZXRPYmplY3RzOihpZCBfX3Vuc2FmZV91bnJldGFpbmVkIFtdKWRlcF9vYmplY3RzIERFUFJFQ0FURUQ7Ci0tICh2b2lkKWdldE9iamVjdHM6KGlkIF9fdW5zYWZlX3VucmV0YWluZWQgW10pb2JqZWN0cyBERVBSRUNBVEVEOwotQHByb3BlcnR5IGludCBQMSBERVBSRUNBVEVEOwotQHByb3BlcnR5IGludCBQMiBERVBSRUNBVEVEOwotQGVuZAotCi1AaW50ZXJmYWNlIE5TQXJyYXkgKERyYWdnaW5nU291cmNlRGVwcmVjYXRlZCkKLQotLyogVGhpcyBtZXRob2QgaXMgdW5zYWZlIGJlY2F1c2UgaXQgY291bGQgcG90ZW50aWFsbHkgY2F1c2UgYnVmZmVyIG92ZXJydW5zLiBZb3Ugc2hvdWxkIHVzZSAtZ2V0T2JqZWN0czpyYW5nZTogaW5zdGVhZC4KLSovCi0tICh2b2lkKWdldE9iamVjdHM6KGlkIF9fdW5zYWZlX3VucmV0YWluZWQgW10pb2JqZWN0cyBERVBSRUNBVEVEOwotLSAodm9pZClkZXBfZ2V0T2JqZWN0czooaWQgX191bnNhZmVfdW5yZXRhaW5lZCBbXSlkZXBfb2JqZWN0cyBERVBSRUNBVEVEOwotQHByb3BlcnR5IGludCBQMSBERVBSRUNBVEVEOwotQHByb3BlcnR5IGludCBQMiBERVBSRUNBVEVEOwotCi1AZW5kCi0KLUBpbnRlcmZhY2UgTlNBcnJheSAoRGVwcmVjYXRlZCkKLS0gKHZvaWQpZ2V0T2JqZWN0czooaWQgX191bnNhZmVfdW5yZXRhaW5lZCBbXSlvYmplY3RzIERFUFJFQ0FURUQ7Ci0tICh2b2lkKWRlcF9nZXRPYmplY3RzOihpZCBfX3Vuc2FmZV91bnJldGFpbmVkIFtdKWRlcF9vYmplY3RzIERFUFJFQ0FURUQ7Ci1AcHJvcGVydHkgaW50IFAxIERFUFJFQ0FURUQ7Ci1AcHJvcGVydHkgaW50IFAyIERFUFJFQ0FURUQ7Ci1AZW5kCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL29iamNtdC1kZXNpZ25hdGVkLWluaXRpYWxpemVyLm0gYi90ZXN0L0FSQ01UL29iamNtdC1kZXNpZ25hdGVkLWluaXRpYWxpemVyLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5ZDRmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQVJDTVQvb2JqY210LWRlc2lnbmF0ZWQtaW5pdGlhbGl6ZXIubQpAQCAtMCwwICsxLDQ0IEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC1vYmpjbXQtbWlncmF0ZS1kZXNpZ25hdGVkLWluaXQgJXMgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTEgLWZvYmpjLWFyYyAtbWlncmF0ZSAtbyAldC5yZW1hcAorLy8gUlVOOiBjLWFyY210LXRlc3QgJXQucmVtYXAgfCBhcmNtdC10ZXN0IC12ZXJpZnktdHJhbnNmb3JtZWQtZmlsZXMgJXMucmVzdWx0CisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTEgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYyAtZm9iamMtYXJjICVzLnJlc3VsdAorCisjZGVmaW5lIE5TX0RFU0lHTkFURURfSU5JVElBTElaRVIgX19hdHRyaWJ1dGVfXygob2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyKSkKKworQGNsYXNzIE5TU3RyaW5nOworCitAaW50ZXJmYWNlIEIxCistKGlkKWluaXQ7CitAZW5kCisKK0BpbnRlcmZhY2UgUzEgOiBCMQorLShpZClpbml0V2l0aEZvbzooTlNTdHJpbmcqKWZvbzsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFMxCistKGlkKWluaXRXaXRoRm9vOihOU1N0cmluZyopZm9vCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CitAZW5kCisKK0BpbnRlcmZhY2UgQjIKKy0oaWQpaW5pdCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOworQGVuZAorCitAaW50ZXJmYWNlIFMyIDogQjIKKy0oaWQpaW5pdDsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFMyCistKGlkKWluaXQKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgaWYgKHNlbGYpIHsKKyAgfQorICByZXR1cm4gc2VsZjsKK30KK0BlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvb2JqY210LWRlc2lnbmF0ZWQtaW5pdGlhbGl6ZXIubS5yZXN1bHQgYi90ZXN0L0FSQ01UL29iamNtdC1kZXNpZ25hdGVkLWluaXRpYWxpemVyLm0ucmVzdWx0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNTliMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0FSQ01UL29iamNtdC1kZXNpZ25hdGVkLWluaXRpYWxpemVyLm0ucmVzdWx0CkBAIC0wLDAgKzEsNDQgQEAKKy8vIFJVTjogcm0gLXJmICV0CisvLyBSVU46ICVjbGFuZ19jYzEgLW9iamNtdC1taWdyYXRlLWRlc2lnbmF0ZWQtaW5pdCAlcyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMSAtZm9iamMtYXJjIC1taWdyYXRlIC1vICV0LnJlbWFwCisvLyBSVU46IGMtYXJjbXQtdGVzdCAldC5yZW1hcCB8IGFyY210LXRlc3QgLXZlcmlmeS10cmFuc2Zvcm1lZC1maWxlcyAlcy5yZXN1bHQKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMSAtZnN5bnRheC1vbmx5IC14IG9iamVjdGl2ZS1jIC1mb2JqYy1hcmMgJXMucmVzdWx0CisKKyNkZWZpbmUgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUiBfX2F0dHJpYnV0ZV9fKChvYmpjX2Rlc2lnbmF0ZWRfaW5pdGlhbGl6ZXIpKQorCitAY2xhc3MgTlNTdHJpbmc7CisKK0BpbnRlcmZhY2UgQjEKKy0oaWQpaW5pdDsKK0BlbmQKKworQGludGVyZmFjZSBTMSA6IEIxCistKGlkKWluaXRXaXRoRm9vOihOU1N0cmluZyopZm9vIE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTMQorLShpZClpbml0V2l0aEZvbzooTlNTdHJpbmcqKWZvbworeworICBzZWxmID0gW3N1cGVyIGluaXRdOworICBpZiAoc2VsZikgeworICB9CisgIHJldHVybiBzZWxmOworfQorQGVuZAorCitAaW50ZXJmYWNlIEIyCistKGlkKWluaXQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKK0BlbmQKKworQGludGVyZmFjZSBTMiA6IEIyCistKGlkKWluaXQ7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTMgorLShpZClpbml0Cit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CitAZW5kCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL29iamNtdC1pbnN0YW5jZXR5cGUtMi5tLnJlc3VsdCBiL3Rlc3QvQVJDTVQvb2JqY210LWluc3RhbmNldHlwZS0yLm0ucmVzdWx0CmluZGV4IDg4MzdlOTcuLjdhMzI4OTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvb2JqY210LWluc3RhbmNldHlwZS0yLm0ucmVzdWx0CisrKyBiL3Rlc3QvQVJDTVQvb2JqY210LWluc3RhbmNldHlwZS0yLm0ucmVzdWx0CkBAIC0xNiwxMCArMTYsMTAgQEAKIAogQGNsYXNzIE5TU3RyaW5nLCBOU1VSTDsKIEBpbnRlcmZhY2UgTlNTdHJpbmcgKE5TU3RyaW5nRGVwcmVjYXRlZCkKLSsgKGluc3RhbmNldHlwZSlzdHJpbmdXaXRoQ29udGVudHNPZkZpbGU6KE5TU3RyaW5nICopcGF0aCBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuMCAsbWVzc2FnZT0iIiApKSk7Ci0rIChpbnN0YW5jZXR5cGUpc3RyaW5nV2l0aENvbnRlbnRzT2ZVUkw6KE5TVVJMICopdXJsIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC4wICxtZXNzYWdlPSIiICkpKTsKLSsgKGluc3RhbmNldHlwZSlzdHJpbmdXaXRoQ1N0cmluZzooY29uc3QgY2hhciAqKWJ5dGVzIGxlbmd0aDooTlNVSW50ZWdlcilsZW5ndGggX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjAgLG1lc3NhZ2U9IiIgKSkpOwotKyAoaW5zdGFuY2V0eXBlKXN0cmluZ1dpdGhDU3RyaW5nOihjb25zdCBjaGFyICopYnl0ZXMgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjAgLG1lc3NhZ2U9IiIgKSkpOworKyAoaWQpc3RyaW5nV2l0aENvbnRlbnRzT2ZGaWxlOihOU1N0cmluZyAqKXBhdGggX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjAgLG1lc3NhZ2U9IiIgKSkpOworKyAoaWQpc3RyaW5nV2l0aENvbnRlbnRzT2ZVUkw6KE5TVVJMICopdXJsIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC4wICxtZXNzYWdlPSIiICkpKTsKKysgKGlkKXN0cmluZ1dpdGhDU3RyaW5nOihjb25zdCBjaGFyICopYnl0ZXMgbGVuZ3RoOihOU1VJbnRlZ2VyKWxlbmd0aCBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuMCAsbWVzc2FnZT0iIiApKSk7CisrIChpZClzdHJpbmdXaXRoQ1N0cmluZzooY29uc3QgY2hhciAqKWJ5dGVzIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC4wICxtZXNzYWdlPSIiICkpKTsKIEBlbmQKIAogCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL29iamNtdC1ucy1ub25hdG9taWMtaW9zb25seS5tLnJlc3VsdCBiL3Rlc3QvQVJDTVQvb2JqY210LW5zLW5vbmF0b21pYy1pb3Nvbmx5Lm0ucmVzdWx0CmluZGV4IDgwNDE0MmUuLjhlOWUzYTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvb2JqY210LW5zLW5vbmF0b21pYy1pb3Nvbmx5Lm0ucmVzdWx0CisrKyBiL3Rlc3QvQVJDTVQvb2JqY210LW5zLW5vbmF0b21pYy1pb3Nvbmx5Lm0ucmVzdWx0CkBAIC0zMCwxNCArMzAsMTQgQEAKIH0KIEBwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHdlYWspIE5TU3RyaW5nICpXZWFrUHJvcDsKIAotQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgcmV0YWluKSBOU1N0cmluZyAqU3Ryb25nUHJvcDsKK0Bwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHN0cm9uZykgTlNTdHJpbmcgKlN0cm9uZ1Byb3A7CiAKLUBwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHJldGFpbikgTlNTdHJpbmcgKlVuYXZhaWxQcm9wICBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOworQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgc3Ryb25nKSBOU1N0cmluZyAqVW5hdmFpbFByb3AgIF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSk7CiAtICh2b2lkKSBzZXRVbmF2YWlsUHJvcCAgOiAoTlNTdHJpbmcgKilWYWw7CiAKLUBwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHJldGFpbikgTlNTdHJpbmcgKlVuYXZhaWxQcm9wMSAgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUpKTsKK0Bwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHN0cm9uZykgTlNTdHJpbmcgKlVuYXZhaWxQcm9wMSAgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUpKTsKIAotQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgcmV0YWluKSBOU1N0cmluZyAqVW5hdmFpbFByb3AyOworQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgc3Ryb25nKSBOU1N0cmluZyAqVW5hdmFpbFByb3AyOwogLSAodm9pZCkgc2V0VW5hdmFpbFByb3AyICA6IChOU1N0cmluZyAqKVZhbCAgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUpKTsKIAogQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgY29weSkgTlNEaWN0aW9uYXJ5ICp1bmRvQWN0aW9uOwpAQCAtNTUsMTAgKzU1LDEwIEBACiAgICAgTlNBcnJheSAqX25hbWVzMzsKICAgICBOU0FycmF5ICpfbmFtZXM0OwogfQotQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgcmV0YWluKSBOU0FycmF5ICpuYW1lczI7Ci1AcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCByZXRhaW4pIE5TQXJyYXkgKm5hbWVzMzsKLUBwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHJldGFpbikgTlNBcnJheSAqbmFtZXM0OwotQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgcmV0YWluKSBOU0FycmF5ICpuYW1lczE7CitAcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCBzdHJvbmcpIE5TQXJyYXkgKm5hbWVzMjsKK0Bwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHN0cm9uZykgTlNBcnJheSAqbmFtZXMzOworQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgc3Ryb25nKSBOU0FycmF5ICpuYW1lczQ7CitAcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCBzdHJvbmcpIE5TQXJyYXkgKm5hbWVzMTsKIEBlbmQKIAogLy8gUHJvcGVydGllcyB0aGF0IGNvbnRhaW4gdGhlIG5hbWUgImRlbGVnYXRlIiBvciAiZGF0YVNvdXJjZSIsCkBAIC03MSw5ICs3MSw5IEBACiBAcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCBhc3NpZ24pIGlkIHh4eGRlbGVnYXRlWVlZOwogCiAKLUBwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHJldGFpbikgaWQgTVl0YXJnZXQ7CitAcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCBzdHJvbmcpIGlkIE1ZdGFyZ2V0OwogCi1AcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCByZXRhaW4pIGlkIHRhcmdldFg7CitAcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCBzdHJvbmcpIGlkIHRhcmdldFg7CiAgCiBAcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZKSBpbnQgdmFsdWU7CiAKQEAgLTg3LDE0ICs4NywxNCBAQAogCiAtICh2b2lkKSBOb3RoaW5nOwogQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgcmVhZG9ubHkpIGludCBMZW5ndGg7Ci1AcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCByZWFkb25seSwgcmV0YWluKSBpZCBvYmplY3Q7CitAcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCByZWFkb25seSwgc3Ryb25nKSBpZCBvYmplY3Q7CiArIChkb3VibGUpIEQ7CiBAcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCByZWFkb25seSkgdm9pZCAqSlNPYmplY3QgV0VCS0lUX09CSkNfTUVUSE9EX0FOTk9UQVRJT04oQVZBSUxBQkxFX1dFQktJVF9WRVJTSU9OXzNfMF9BTkRfTEFURVIpOwogQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgZ2V0dGVyPWlzSWdub3JpbmdJbnRlcmFjdGlvbkV2ZW50cywgcmVhZG9ubHkpIEJPT0wgaWdub3JpbmdJbnRlcmFjdGlvbkV2ZW50czsKIAotQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgZ2V0dGVyPWdldFN0cmluZ1ZhbHVlLCByZXRhaW4pIE5TU3RyaW5nICpzdHJpbmdWYWx1ZTsKK0Bwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIGdldHRlcj1nZXRTdHJpbmdWYWx1ZSwgc3Ryb25nKSBOU1N0cmluZyAqc3RyaW5nVmFsdWU7CiBAcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCBnZXR0ZXI9Z2V0Q291bnRlclZhbHVlLCByZWFkb25seSkgQk9PTCBjb3VudGVyVmFsdWU7Ci1AcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCBnZXR0ZXI9Z2V0bnNfZGl4dGlvbmFyeSwgcmVhZG9ubHksIHJldGFpbikgTlNEaWN0aW9uYXJ5ICpuc19kaXh0aW9uYXJ5OworQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgZ2V0dGVyPWdldG5zX2RpeHRpb25hcnksIHJlYWRvbmx5LCBjb3B5KSBOU0RpY3Rpb25hcnkgKm5zX2RpeHRpb25hcnk7CiAKIC0gKEJPT0wpaXMzYmFyOyAvLyB3YXRjaCBvdXQKIC0gKE5TU3RyaW5nICopZ2V0M2ZvbzsgLy8gd2F0Y2ggb3V0CkBAIC0xMTUsOSArMTE1LDkgQEAKIEBwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIGFzc2lnbikgaWQgeHh4ZGVsZWdhdGVZWVk7CiAKIAotQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgcmV0YWluKSBpZCBNWXRhcmdldDsKK0Bwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHN0cm9uZykgaWQgTVl0YXJnZXQ7CiAKLUBwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHJldGFpbikgaWQgdGFyZ2V0WDsKK0Bwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHN0cm9uZykgaWQgdGFyZ2V0WDsKIAogQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSkgaW50IHZhbHVlOwogCkBAIC0xMzEsNyArMTMxLDcgQEAKIAogLSAodm9pZCkgTm90aGluZzsKIEBwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHJlYWRvbmx5KSBpbnQgTGVuZ3RoOwotQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgcmVhZG9ubHksIHJldGFpbikgaWQgb2JqZWN0OworQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgcmVhZG9ubHksIHN0cm9uZykgaWQgb2JqZWN0OwogKyAoZG91YmxlKSBEOwogCiAtIChCT09MKWlzM2JhcjsgLy8gd2F0Y2ggb3V0CkBAIC0xNjgsMjYgKzE2OCwyNiBAQAogCiBAaW50ZXJmYWNlIE5TVVJMCiAvLyBEbyBub3QgaW5mZXIgYSBwcm9wZXJ0eS4KLUBwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHJldGFpbikgTlNVUkwgKmFwcFN0b3JlUmVjZWlwdFVSTCBOU19BVkFJTEFCTEU7CitAcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCBzdHJvbmcpIE5TVVJMICphcHBTdG9yZVJlY2VpcHRVUkwgTlNfQVZBSUxBQkxFOwogLSAodm9pZCkgc2V0QXBwU3RvcmVSZWNlaXB0VVJMIDogKE5TVVJMICopb2JqZWN0OwogCi1AcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCByZXRhaW4pIE5TVVJMICphcHBTdG9yZVJlY2VpcHRVUkxYIE5TX0FWQUlMQUJMRTsKK0Bwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHN0cm9uZykgTlNVUkwgKmFwcFN0b3JlUmVjZWlwdFVSTFggTlNfQVZBSUxBQkxFOwogCiAvLyBEbyBub3QgaW5mZXIgYSBwcm9wZXJ0eS4KLUBwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHJldGFpbikgTlNVUkwgKmFwcFN0b3JlUmVjZWlwdFVSTFkgOworQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgc3Ryb25nKSBOU1VSTCAqYXBwU3RvcmVSZWNlaXB0VVJMWSA7CiAtICh2b2lkKSBzZXRBcHBTdG9yZVJlY2VpcHRVUkxZIDogKE5TVVJMICopb2JqZWN0IE5TX0FWQUlMQUJMRTsKIAotQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgcmVhZG9ubHksIHJldGFpbikgaWQgT2tUb0luZmVyIE5TX0FWQUlMQUJMRTsKK0Bwcm9wZXJ0eSAoTlNfTk9OQVRPTUlDX0lPU09OTFksIHJlYWRvbmx5LCBzdHJvbmcpIGlkIE9rVG9JbmZlciBOU19BVkFJTEFCTEU7CiAKIC8vIERvIG5vdCBpbmZlciBhIHByb3BlcnR5LgotQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgcmV0YWluKSBOU1VSTCAqYXBwU3RvcmVSZWNlaXB0VVJMWiA7CitAcHJvcGVydHkgKE5TX05PTkFUT01JQ19JT1NPTkxZLCBzdHJvbmcpIE5TVVJMICphcHBTdG9yZVJlY2VpcHRVUkxaIDsKIC0gKHZvaWQpIHNldEFwcFN0b3JlUmVjZWlwdFVSTFogOiAoTlNVUkwgKilvYmplY3QgTlNfQVZBSUxBQkxFOwogCiAvLyBEbyBub3QgaW5mZXIgYSBwcm9wZXJ0eS4KIC0gKGlkKSB0MSBOT1JFVFVSTiBOU19BVkFJTEFCTEU7CiAtICh2b2lkKSBzZXRUMSA6IChpZCkgYXJnIE5TX0FWQUlMQUJMRTsKIAotQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgcmV0YWluKSBpZCBtZXRob2QxIEFMSUdORUQgTlNfQVZBSUxBQkxFOworQHByb3BlcnR5IChOU19OT05BVE9NSUNfSU9TT05MWSwgc3Ryb25nKSBpZCBtZXRob2QxIEFMSUdORUQgTlNfQVZBSUxBQkxFOwogCiAtIChOU1VSTCAqKWluaXQ7ICAvLyBObyBDaGFuZ2UKICsgKGlkKWFsbG9jOyAgICAgIC8vIE5vIENoYW5nZQpkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9vYmpjbXQtcHJvcGVydHktYXZhaWxhYmlsaXR5Lm0ucmVzdWx0IGIvdGVzdC9BUkNNVC9vYmpjbXQtcHJvcGVydHktYXZhaWxhYmlsaXR5Lm0ucmVzdWx0CmluZGV4IDY4MWY5YTkuLmE1YTQ1ZTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvb2JqY210LXByb3BlcnR5LWF2YWlsYWJpbGl0eS5tLnJlc3VsdAorKysgYi90ZXN0L0FSQ01UL29iamNtdC1wcm9wZXJ0eS1hdmFpbGFiaWxpdHkubS5yZXN1bHQKQEAgLTE5LDIwICsxOSwyMCBAQAogI2RlZmluZSBVTkFWQUlMQUJMRSBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSgibm90IGF2YWlsYWJsZSBpbiBhdXRvbWF0aWMgcmVmZXJlbmNlIGNvdW50aW5nIG1vZGUiKSkpCiAKIEBpbnRlcmZhY2UgTUtNYXBJdGVtCi1AcHJvcGVydHkgKG5vbmF0b21pYywgcmV0YWluKSBNS01hcEl0ZW0gKnNvdXJjZSBOU19BVkFJTEFCTEUoMTBfOSwgNl8wKTsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBzdHJvbmcpIE1LTWFwSXRlbSAqc291cmNlIE5TX0FWQUlMQUJMRSgxMF85LCA2XzApOwogLSAodm9pZClzZXRTb3VyY2U6KE1LTWFwSXRlbSAqKXNvdXJjZSBOU19BVkFJTEFCTEUoMTBfOSwgN18wKTsKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTUtNYXBJdGVtICpkZXN0IE5TX0FWQUlMQUJMRSgxMF85LCA2XzApOworQHByb3BlcnR5IChub25hdG9taWMsIHN0cm9uZykgTUtNYXBJdGVtICpkZXN0IE5TX0FWQUlMQUJMRSgxMF85LCA2XzApOwogCi1AcHJvcGVydHkgKG5vbmF0b21pYywgcmV0YWluKSBNS01hcEl0ZW0gKmZpbmFsOworQHByb3BlcnR5IChub25hdG9taWMsIHN0cm9uZykgTUtNYXBJdGVtICpmaW5hbDsKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTUtNYXBJdGVtICp0b3RhbCBOU19BVkFJTEFCTEUoMTBfOSwgNl8wKTsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBzdHJvbmcpIE1LTWFwSXRlbSAqdG90YWwgTlNfQVZBSUxBQkxFKDEwXzksIDZfMCk7CiAtICh2b2lkKXNldFRvdGFsOihNS01hcEl0ZW0gKilzb3VyY2U7CiAKIC0gKE1LTWFwSXRlbSAqKWNvbXAgTlNfQVZBSUxBQkxFKDEwXzksIDZfMCk7CiAtICh2b2lkKXNldENvbXA6KE1LTWFwSXRlbSAqKXNvdXJjZSBVTkFWQUlMQUJMRTsKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTUtNYXBJdGVtICp0YWxseSAgVU5BVkFJTEFCTEUgTlNfQVZBSUxBQkxFKDEwXzksIDZfMCk7CitAcHJvcGVydHkgKG5vbmF0b21pYywgc3Ryb25nKSBNS01hcEl0ZW0gKnRhbGx5ICBVTkFWQUlMQUJMRSBOU19BVkFJTEFCTEUoMTBfOSwgNl8wKTsKIAogLSAoTUtNYXBJdGVtICopaXRhbGx5ICBOU19BVkFJTEFCTEUoMTBfOSwgNl8wKTsKIC0gKHZvaWQpc2V0SXRhbGx5OihNS01hcEl0ZW0gKilzb3VyY2UgVU5BVkFJTEFCTEUgTlNfQVZBSUxBQkxFKDEwXzksIDZfMCk7CmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL29iamNtdC1wcm9wZXJ0eS5tIGIvdGVzdC9BUkNNVC9vYmpjbXQtcHJvcGVydHkubQppbmRleCAzYjc3YWFkLi42MTczOWVmIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL29iamNtdC1wcm9wZXJ0eS5tCisrKyBiL3Rlc3QvQVJDTVQvb2JqY210LXByb3BlcnR5Lm0KQEAgLTcwLDYgKzcwLDkgQEAKIAogLSAoaWQpIGRhdGFTb3VyY2U7CiAKKy8vIHJkYXI6Ly8xNTUwOTgzMQorLSAoaWQpZGVsZWdhdGU7CisKIC0gKGlkKXh4eGRlbGVnYXRlWVlZOwogLSAodm9pZClzZXRYeHhkZWxlZ2F0ZVlZWTooaWQpZGVsZWdhdGU7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvb2JqY210LXByb3BlcnR5Lm0ucmVzdWx0IGIvdGVzdC9BUkNNVC9vYmpjbXQtcHJvcGVydHkubS5yZXN1bHQKaW5kZXggYzYzODBjOC4uZWM0YWM4NSAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9vYmpjbXQtcHJvcGVydHkubS5yZXN1bHQKKysrIGIvdGVzdC9BUkNNVC9vYmpjbXQtcHJvcGVydHkubS5yZXN1bHQKQEAgLTIzLDE0ICsyMywxNCBAQAogfQogQHByb3BlcnR5IChub25hdG9taWMsIHdlYWspIE5TU3RyaW5nICpXZWFrUHJvcDsKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTlNTdHJpbmcgKlN0cm9uZ1Byb3A7CitAcHJvcGVydHkgKG5vbmF0b21pYywgc3Ryb25nKSBOU1N0cmluZyAqU3Ryb25nUHJvcDsKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTlNTdHJpbmcgKlVuYXZhaWxQcm9wICBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOworQHByb3BlcnR5IChub25hdG9taWMsIHN0cm9uZykgTlNTdHJpbmcgKlVuYXZhaWxQcm9wICBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOwogLSAodm9pZCkgc2V0VW5hdmFpbFByb3AgIDogKE5TU3RyaW5nICopVmFsOwogCi1AcHJvcGVydHkgKG5vbmF0b21pYywgcmV0YWluKSBOU1N0cmluZyAqVW5hdmFpbFByb3AxICBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOworQHByb3BlcnR5IChub25hdG9taWMsIHN0cm9uZykgTlNTdHJpbmcgKlVuYXZhaWxQcm9wMSAgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUpKTsKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTlNTdHJpbmcgKlVuYXZhaWxQcm9wMjsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBzdHJvbmcpIE5TU3RyaW5nICpVbmF2YWlsUHJvcDI7CiAtICh2b2lkKSBzZXRVbmF2YWlsUHJvcDIgIDogKE5TU3RyaW5nICopVmFsICBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOwogCiBAcHJvcGVydHkgKG5vbmF0b21pYywgY29weSkgTlNEaWN0aW9uYXJ5ICp1bmRvQWN0aW9uOwpAQCAtNDgsMTAgKzQ4LDEwIEBACiAgICAgTlNBcnJheSAqX25hbWVzMzsKICAgICBOU0FycmF5ICpfbmFtZXM0OwogfQotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTlNBcnJheSAqbmFtZXMyOwotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTlNBcnJheSAqbmFtZXMzOwotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTlNBcnJheSAqbmFtZXM0OwotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTlNBcnJheSAqbmFtZXMxOworQHByb3BlcnR5IChub25hdG9taWMsIHN0cm9uZykgTlNBcnJheSAqbmFtZXMyOworQHByb3BlcnR5IChub25hdG9taWMsIHN0cm9uZykgTlNBcnJheSAqbmFtZXMzOworQHByb3BlcnR5IChub25hdG9taWMsIHN0cm9uZykgTlNBcnJheSAqbmFtZXM0OworQHByb3BlcnR5IChub25hdG9taWMsIHN0cm9uZykgTlNBcnJheSAqbmFtZXMxOwogQGVuZAogCiAvLyBQcm9wZXJ0aWVzIHRoYXQgY29udGFpbiB0aGUgbmFtZSAiZGVsZWdhdGUiIG9yICJkYXRhU291cmNlIiwKQEAgLTYxLDEyICs2MSwxNSBAQAogCiBAcHJvcGVydHkgKG5vbmF0b21pYywgYXNzaWduKSBpZCBkYXRhU291cmNlOwogCisvLyByZGFyOi8vMTU1MDk4MzEKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCByZWFkb25seSwgYXNzaWduKSBpZCBkZWxlZ2F0ZTsKKwogQHByb3BlcnR5IChub25hdG9taWMsIGFzc2lnbikgaWQgeHh4ZGVsZWdhdGVZWVk7CiAKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgaWQgTVl0YXJnZXQ7CitAcHJvcGVydHkgKG5vbmF0b21pYywgc3Ryb25nKSBpZCBNWXRhcmdldDsKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgaWQgdGFyZ2V0WDsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBzdHJvbmcpIGlkIHRhcmdldFg7CiAgCiBAcHJvcGVydHkgKG5vbmF0b21pYykgaW50IHZhbHVlOwogCkBAIC04MCwxNCArODMsMTQgQEAKIAogLSAodm9pZCkgTm90aGluZzsKIEBwcm9wZXJ0eSAobm9uYXRvbWljLCByZWFkb25seSkgaW50IExlbmd0aDsKLUBwcm9wZXJ0eSAobm9uYXRvbWljLCByZWFkb25seSwgcmV0YWluKSBpZCBvYmplY3Q7CitAcHJvcGVydHkgKG5vbmF0b21pYywgcmVhZG9ubHksIHN0cm9uZykgaWQgb2JqZWN0OwogKyAoZG91YmxlKSBEOwogQHByb3BlcnR5IChub25hdG9taWMsIHJlYWRvbmx5KSB2b2lkICpKU09iamVjdCBXRUJLSVRfT0JKQ19NRVRIT0RfQU5OT1RBVElPTihBVkFJTEFCTEVfV0VCS0lUX1ZFUlNJT05fM18wX0FORF9MQVRFUik7CiBAcHJvcGVydHkgKG5vbmF0b21pYywgZ2V0dGVyPWlzSWdub3JpbmdJbnRlcmFjdGlvbkV2ZW50cywgcmVhZG9ubHkpIEJPT0wgaWdub3JpbmdJbnRlcmFjdGlvbkV2ZW50czsKIAotQHByb3BlcnR5IChub25hdG9taWMsIGdldHRlcj1nZXRTdHJpbmdWYWx1ZSwgcmV0YWluKSBOU1N0cmluZyAqc3RyaW5nVmFsdWU7CitAcHJvcGVydHkgKG5vbmF0b21pYywgZ2V0dGVyPWdldFN0cmluZ1ZhbHVlLCBzdHJvbmcpIE5TU3RyaW5nICpzdHJpbmdWYWx1ZTsKIEBwcm9wZXJ0eSAobm9uYXRvbWljLCBnZXR0ZXI9Z2V0Q291bnRlclZhbHVlLCByZWFkb25seSkgQk9PTCBjb3VudGVyVmFsdWU7Ci1AcHJvcGVydHkgKG5vbmF0b21pYywgZ2V0dGVyPWdldG5zX2RpeHRpb25hcnksIHJlYWRvbmx5LCByZXRhaW4pIE5TRGljdGlvbmFyeSAqbnNfZGl4dGlvbmFyeTsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBnZXR0ZXI9Z2V0bnNfZGl4dGlvbmFyeSwgcmVhZG9ubHksIGNvcHkpIE5TRGljdGlvbmFyeSAqbnNfZGl4dGlvbmFyeTsKIAogLSAoQk9PTClpczNiYXI7IC8vIHdhdGNoIG91dAogLSAoTlNTdHJpbmcgKilnZXQzZm9vOyAvLyB3YXRjaCBvdXQKQEAgLTEwOCw5ICsxMTEsOSBAQAogQHByb3BlcnR5IChub25hdG9taWMsIGFzc2lnbikgaWQgeHh4ZGVsZWdhdGVZWVk7CiAKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgaWQgTVl0YXJnZXQ7CitAcHJvcGVydHkgKG5vbmF0b21pYywgc3Ryb25nKSBpZCBNWXRhcmdldDsKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgaWQgdGFyZ2V0WDsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBzdHJvbmcpIGlkIHRhcmdldFg7CiAKIEBwcm9wZXJ0eSAobm9uYXRvbWljKSBpbnQgdmFsdWU7CiAKQEAgLTEyNCw3ICsxMjcsNyBAQAogCiAtICh2b2lkKSBOb3RoaW5nOwogQHByb3BlcnR5IChub25hdG9taWMsIHJlYWRvbmx5KSBpbnQgTGVuZ3RoOwotQHByb3BlcnR5IChub25hdG9taWMsIHJlYWRvbmx5LCByZXRhaW4pIGlkIG9iamVjdDsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCByZWFkb25seSwgc3Ryb25nKSBpZCBvYmplY3Q7CiArIChkb3VibGUpIEQ7CiAKIC0gKEJPT0wpaXMzYmFyOyAvLyB3YXRjaCBvdXQKQEAgLTE2MSwyNiArMTY0LDI2IEBACiAKIEBpbnRlcmZhY2UgTlNVUkwKIC8vIERvIG5vdCBpbmZlciBhIHByb3BlcnR5LgotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTlNVUkwgKmFwcFN0b3JlUmVjZWlwdFVSTCBOU19BVkFJTEFCTEU7CitAcHJvcGVydHkgKG5vbmF0b21pYywgc3Ryb25nKSBOU1VSTCAqYXBwU3RvcmVSZWNlaXB0VVJMIE5TX0FWQUlMQUJMRTsKIC0gKHZvaWQpIHNldEFwcFN0b3JlUmVjZWlwdFVSTCA6IChOU1VSTCAqKW9iamVjdDsKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgTlNVUkwgKmFwcFN0b3JlUmVjZWlwdFVSTFggTlNfQVZBSUxBQkxFOworQHByb3BlcnR5IChub25hdG9taWMsIHN0cm9uZykgTlNVUkwgKmFwcFN0b3JlUmVjZWlwdFVSTFggTlNfQVZBSUxBQkxFOwogCiAvLyBEbyBub3QgaW5mZXIgYSBwcm9wZXJ0eS4KLUBwcm9wZXJ0eSAobm9uYXRvbWljLCByZXRhaW4pIE5TVVJMICphcHBTdG9yZVJlY2VpcHRVUkxZIDsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBzdHJvbmcpIE5TVVJMICphcHBTdG9yZVJlY2VpcHRVUkxZIDsKIC0gKHZvaWQpIHNldEFwcFN0b3JlUmVjZWlwdFVSTFkgOiAoTlNVUkwgKilvYmplY3QgTlNfQVZBSUxBQkxFOwogCi1AcHJvcGVydHkgKG5vbmF0b21pYywgcmVhZG9ubHksIHJldGFpbikgaWQgT2tUb0luZmVyIE5TX0FWQUlMQUJMRTsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCByZWFkb25seSwgc3Ryb25nKSBpZCBPa1RvSW5mZXIgTlNfQVZBSUxBQkxFOwogCiAvLyBEbyBub3QgaW5mZXIgYSBwcm9wZXJ0eS4KLUBwcm9wZXJ0eSAobm9uYXRvbWljLCByZXRhaW4pIE5TVVJMICphcHBTdG9yZVJlY2VpcHRVUkxaIDsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBzdHJvbmcpIE5TVVJMICphcHBTdG9yZVJlY2VpcHRVUkxaIDsKIC0gKHZvaWQpIHNldEFwcFN0b3JlUmVjZWlwdFVSTFogOiAoTlNVUkwgKilvYmplY3QgTlNfQVZBSUxBQkxFOwogCiAvLyBEbyBub3QgaW5mZXIgYSBwcm9wZXJ0eS4KIC0gKGlkKSB0MSBOT1JFVFVSTiBOU19BVkFJTEFCTEU7CiAtICh2b2lkKSBzZXRUMSA6IChpZCkgYXJnIE5TX0FWQUlMQUJMRTsKIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgaWQgbWV0aG9kMSBBTElHTkVEIE5TX0FWQUlMQUJMRTsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBzdHJvbmcpIGlkIG1ldGhvZDEgQUxJR05FRCBOU19BVkFJTEFCTEU7CiAKIC0gKE5TVVJMICopaW5pdDsgIC8vIE5vIENoYW5nZQogKyAoaWQpYWxsb2M7ICAgICAgLy8gTm8gQ2hhbmdlCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL29iamNtdC1wcm90b2NvbC1jb25mb3JtYW5jZS5tIGIvdGVzdC9BUkNNVC9vYmpjbXQtcHJvdG9jb2wtY29uZm9ybWFuY2UubQppbmRleCA3YmM3ZDkzLi5mNGM4ZjUxIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL29iamNtdC1wcm90b2NvbC1jb25mb3JtYW5jZS5tCisrKyBiL3Rlc3QvQVJDTVQvb2JqY210LXByb3RvY29sLWNvbmZvcm1hbmNlLm0KQEAgLTExMiwzICsxMTIsMTkgQEAKIEBpbXBsZW1lbnRhdGlvbiBUZXN0NwogQGVuZAogCisvLyByZGFyOi8vMTU1MTUyMDYKK0BpbnRlcmZhY2UgQlRMRUJyb3dzZXIKK0BlbmQKKworQHByb3RvY29sIENCQ2VudHJhbE1hbmFnZXJEZWxlZ2F0ZTsgCisKK0Bwcm90b2NvbCBDQkNlbnRyYWxNYW5hZ2VyRGVsZWdhdGUgCistIChpZCkgTWV0aDE6IChkb3VibGUpIGFyZzsKK0BlbmQKKworQGludGVyZmFjZSBCVExFQnJvd3NlcigpIDxDQkNlbnRyYWxNYW5hZ2VyRGVsZWdhdGU+IAorQGVuZAorCitAaW1wbGVtZW50YXRpb24gQlRMRUJyb3dzZXIKKy0gKGlkKSBNZXRoMTU1MTUyMDY6IChkb3VibGUpIGFyZyB7IHJldHVybiAwOyB9CitAZW5kCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL29iamNtdC1wcm90b2NvbC1jb25mb3JtYW5jZS5tLnJlc3VsdCBiL3Rlc3QvQVJDTVQvb2JqY210LXByb3RvY29sLWNvbmZvcm1hbmNlLm0ucmVzdWx0CmluZGV4IGRjMDg3NGMuLjAzMjJhYjggMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvb2JqY210LXByb3RvY29sLWNvbmZvcm1hbmNlLm0ucmVzdWx0CisrKyBiL3Rlc3QvQVJDTVQvb2JqY210LXByb3RvY29sLWNvbmZvcm1hbmNlLm0ucmVzdWx0CkBAIC0xMTIsMyArMTEyLDE5IEBACiBAaW1wbGVtZW50YXRpb24gVGVzdDcKIEBlbmQKIAorLy8gcmRhcjovLzE1NTE1MjA2CitAaW50ZXJmYWNlIEJUTEVCcm93c2VyCitAZW5kCisKK0Bwcm90b2NvbCBDQkNlbnRyYWxNYW5hZ2VyRGVsZWdhdGU7IAorCitAcHJvdG9jb2wgQ0JDZW50cmFsTWFuYWdlckRlbGVnYXRlIAorLSAoaWQpIE1ldGgxOiAoZG91YmxlKSBhcmc7CitAZW5kCisKK0BpbnRlcmZhY2UgQlRMRUJyb3dzZXIoKSA8Q0JDZW50cmFsTWFuYWdlckRlbGVnYXRlPiAKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEJUTEVCcm93c2VyCistIChpZCkgTWV0aDE1NTE1MjA2OiAoZG91YmxlKSBhcmcgeyByZXR1cm4gMDsgfQorQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9wcm90ZWN0ZWQtc2NvcGUubSBiL3Rlc3QvQVJDTVQvcHJvdGVjdGVkLXNjb3BlLm0KaW5kZXggOGFlY2U0NC4uYjUyMmY1NCAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC9wcm90ZWN0ZWQtc2NvcGUubQorKysgYi90ZXN0L0FSQ01UL3Byb3RlY3RlZC1zY29wZS5tCkBAIC0xLDcgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAteCBvYmplY3RpdmUtYyAlcy5yZXN1bHQKIC8vIFJVTjogYXJjbXQtdGVzdCAtLWFyZ3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYyAlcyA+ICV0CiAvLyBSVU46IGRpZmYgJXQgJXMucmVzdWx0Ci0vLyBESVNBQkxFOiBtaW5ndzMyCiAKICNpbmNsdWRlICJDb21tb24uaCIKIApkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC9wcm90ZWN0ZWQtc2NvcGUubS5yZXN1bHQgYi90ZXN0L0FSQ01UL3Byb3RlY3RlZC1zY29wZS5tLnJlc3VsdAppbmRleCBmMzg1ZDg4Li41NTA3MGYyIDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL3Byb3RlY3RlZC1zY29wZS5tLnJlc3VsdAorKysgYi90ZXN0L0FSQ01UL3Byb3RlY3RlZC1zY29wZS5tLnJlc3VsdApAQCAtMSw3ICsxLDYgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnN5bnRheC1vbmx5IC1mb2JqYy1hcmMgLXggb2JqZWN0aXZlLWMgJXMucmVzdWx0CiAvLyBSVU46IGFyY210LXRlc3QgLS1hcmdzIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mc3ludGF4LW9ubHkgLXggb2JqZWN0aXZlLWMgJXMgPiAldAogLy8gUlVOOiBkaWZmICV0ICVzLnJlc3VsdAotLy8gRElTQUJMRTogbWluZ3czMgogCiAjaW5jbHVkZSAiQ29tbW9uLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQVJDTVQvd2hpdGVsaXN0ZWQvaGVhZGVyMS5oIGIvdGVzdC9BUkNNVC93aGl0ZWxpc3RlZC9oZWFkZXIxLmgKaW5kZXggYTMwMTRlYi4uZDk0YjlmNyAxMDA2NDQKLS0tIGEvdGVzdC9BUkNNVC93aGl0ZWxpc3RlZC9oZWFkZXIxLmgKKysrIGIvdGVzdC9BUkNNVC93aGl0ZWxpc3RlZC9oZWFkZXIxLmgKQEAgLTIsNCArMiw1IEBACiBAaW50ZXJmYWNlIEkxIDogTlNPYmplY3QKIC0oaW50KXByb3A7CiAtKHZvaWQpc2V0UHJvcDooaW50KXA7CisrKGlkKWkxOwogQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC93aGl0ZWxpc3RlZC9oZWFkZXIxLmgucmVzdWx0IGIvdGVzdC9BUkNNVC93aGl0ZWxpc3RlZC9oZWFkZXIxLmgucmVzdWx0CmluZGV4IDc4MDhmYzguLjY1Y2JkMjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQVJDTVQvd2hpdGVsaXN0ZWQvaGVhZGVyMS5oLnJlc3VsdAorKysgYi90ZXN0L0FSQ01UL3doaXRlbGlzdGVkL2hlYWRlcjEuaC5yZXN1bHQKQEAgLTEsNCArMSw1IEBACiAKIEBpbnRlcmZhY2UgSTEgOiBOU09iamVjdAogQHByb3BlcnR5IChub25hdG9taWMpIGludCBwcm9wOworKyhpbnN0YW5jZXR5cGUpaTE7CiBAZW5kCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL3doaXRlbGlzdGVkL29iamNtdC13aXRoLXdoaXRlbGlzdC1pbXBsLm0gYi90ZXN0L0FSQ01UL3doaXRlbGlzdGVkL29iamNtdC13aXRoLXdoaXRlbGlzdC1pbXBsLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczNGVhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQVJDTVQvd2hpdGVsaXN0ZWQvb2JqY210LXdpdGgtd2hpdGVsaXN0LWltcGwubQpAQCAtMCwwICsxLDE4IEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC1vYmpjbXQtbWlncmF0ZS1yZWFkd3JpdGUtcHJvcGVydHkgLW9iamNtdC1taWdyYXRlLWluc3RhbmNldHlwZSAtb2JqY210LXdoaXRlLWxpc3QtZGlyLXBhdGg9JVMvSW5wdXRzICVzIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjExIC1taWdyYXRlIC1vICV0LnJlbWFwCisvLyBSVU46IGMtYXJjbXQtdGVzdCAldC5yZW1hcCB8IGFyY210LXRlc3QgLXZlcmlmeS10cmFuc2Zvcm1lZC1maWxlcyAlUy9oZWFkZXIxLmgucmVzdWx0ICVzLnJlc3VsdAorCitAaW50ZXJmYWNlIE5TT2JqZWN0CisrIChpZClhbGxvYzsKK0BlbmQKKworI2luY2x1ZGUgImhlYWRlcjEuaCIKKyNpbmNsdWRlICJoZWFkZXIyLmgiCisKK0BpbnRlcmZhY2UgSTIoY2F0KQorLShpZClpbml0SW5DYXQ7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBJMQorKyhpZClpMSB7fQorQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9BUkNNVC93aGl0ZWxpc3RlZC9vYmpjbXQtd2l0aC13aGl0ZWxpc3QtaW1wbC5tLnJlc3VsdCBiL3Rlc3QvQVJDTVQvd2hpdGVsaXN0ZWQvb2JqY210LXdpdGgtd2hpdGVsaXN0LWltcGwubS5yZXN1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzNmI1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQVJDTVQvd2hpdGVsaXN0ZWQvb2JqY210LXdpdGgtd2hpdGVsaXN0LWltcGwubS5yZXN1bHQKQEAgLTAsMCArMSwxOCBAQAorLy8gUlVOOiBybSAtcmYgJXQKKy8vIFJVTjogJWNsYW5nX2NjMSAtb2JqY210LW1pZ3JhdGUtcmVhZHdyaXRlLXByb3BlcnR5IC1vYmpjbXQtbWlncmF0ZS1pbnN0YW5jZXR5cGUgLW9iamNtdC13aGl0ZS1saXN0LWRpci1wYXRoPSVTL0lucHV0cyAlcyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMSAtbWlncmF0ZSAtbyAldC5yZW1hcAorLy8gUlVOOiBjLWFyY210LXRlc3QgJXQucmVtYXAgfCBhcmNtdC10ZXN0IC12ZXJpZnktdHJhbnNmb3JtZWQtZmlsZXMgJVMvaGVhZGVyMS5oLnJlc3VsdCAlcy5yZXN1bHQKKworQGludGVyZmFjZSBOU09iamVjdAorKyAoaWQpYWxsb2M7CitAZW5kCisKKyNpbmNsdWRlICJoZWFkZXIxLmgiCisjaW5jbHVkZSAiaGVhZGVyMi5oIgorCitAaW50ZXJmYWNlIEkyKGNhdCkKKy0oaWQpaW5pdEluQ2F0OworQGVuZAorCitAaW1wbGVtZW50YXRpb24gSTEKKysoaW5zdGFuY2V0eXBlKWkxIHt9CitAZW5kCmRpZmYgLS1naXQgYS90ZXN0L0FSQ01UL3doaXRlbGlzdGVkL29iamNtdC13aXRoLXdoaXRlbGlzdC5tIGIvdGVzdC9BUkNNVC93aGl0ZWxpc3RlZC9vYmpjbXQtd2l0aC13aGl0ZWxpc3QubQppbmRleCAxYjQ0YzlhLi5iZWY4MmM4IDEwMDY0NAotLS0gYS90ZXN0L0FSQ01UL3doaXRlbGlzdGVkL29iamNtdC13aXRoLXdoaXRlbGlzdC5tCisrKyBiL3Rlc3QvQVJDTVQvd2hpdGVsaXN0ZWQvb2JqY210LXdpdGgtd2hpdGVsaXN0Lm0KQEAgLTEsNyArMSw3IEBACiAvLyBSVU46IHJtIC1yZiAldAotLy8gUlVOOiAlY2xhbmdfY2MxIC1vYmpjbXQtbWlncmF0ZS1yZWFkd3JpdGUtcHJvcGVydHkgJXMgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTEgLW1pZ3JhdGUgLW8gJXQucmVtYXAKKy8vIFJVTjogJWNsYW5nX2NjMSAtb2JqY210LW1pZ3JhdGUtcmVhZHdyaXRlLXByb3BlcnR5IC1vYmpjbXQtbWlncmF0ZS1pbnN0YW5jZXR5cGUgJXMgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTEgLW1pZ3JhdGUgLW8gJXQucmVtYXAKIC8vIFJVTjogYy1hcmNtdC10ZXN0ICV0LnJlbWFwIHwgYXJjbXQtdGVzdCAtdmVyaWZ5LXRyYW5zZm9ybWVkLWZpbGVzICVTL2hlYWRlcjEuaC5yZXN1bHQgJVMvaGVhZGVyMi5oLnJlc3VsdAotLy8gUlVOOiAlY2xhbmdfY2MxIC1vYmpjbXQtbWlncmF0ZS1yZWFkd3JpdGUtcHJvcGVydHkgLW9iamNtdC13aGl0ZS1saXN0LWRpci1wYXRoPSVTL0lucHV0cyAlcyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMSAtbWlncmF0ZSAtbyAldC5yZW1hcAorLy8gUlVOOiAlY2xhbmdfY2MxIC1vYmpjbXQtbWlncmF0ZS1yZWFkd3JpdGUtcHJvcGVydHkgLW9iamNtdC1taWdyYXRlLWluc3RhbmNldHlwZSAtb2JqY210LXdoaXRlLWxpc3QtZGlyLXBhdGg9JVMvSW5wdXRzICVzIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjExIC1taWdyYXRlIC1vICV0LnJlbWFwCiAvLyBSVU46IGMtYXJjbXQtdGVzdCAldC5yZW1hcCB8IGFyY210LXRlc3QgLXZlcmlmeS10cmFuc2Zvcm1lZC1maWxlcyAlUy9oZWFkZXIxLmgucmVzdWx0CiAKIEBpbnRlcmZhY2UgTlNPYmplY3QKZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvSW5wdXRzL3N5c3RlbS1oZWFkZXItc2ltdWxhdG9yLWN4eC5oIGIvdGVzdC9BbmFseXNpcy9JbnB1dHMvc3lzdGVtLWhlYWRlci1zaW11bGF0b3ItY3h4LmgKaW5kZXggOWJiOGVjNC4uMzU4NjkyMSAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9JbnB1dHMvc3lzdGVtLWhlYWRlci1zaW11bGF0b3ItY3h4LmgKKysrIGIvdGVzdC9BbmFseXNpcy9JbnB1dHMvc3lzdGVtLWhlYWRlci1zaW11bGF0b3ItY3h4LmgKQEAgLTE0NCw3ICsxNDQsNyBAQAogICBwdWJsaWM6CiAgICAgdm9pZCBwb3BfZnJvbnQoKSB7CiAgICAgICAvLyBGYWtlIHVzZS1hZnRlci1mcmVlLgotICAgICAgLy8gTm8gd2FybmluZyBpcyBleHBlY3RlZCBhcyB3ZSBhcmUgc3VwcHJlc3Npbmcgd2FybmluZyBjb21taW5nCisgICAgICAvLyBObyB3YXJuaW5nIGlzIGV4cGVjdGVkIGFzIHdlIGFyZSBzdXBwcmVzc2luZyB3YXJuaW5nIGNvbWluZwogICAgICAgLy8gb3V0IG9mIHN0ZDo6bGlzdC4KICAgICAgIGludCB6ID0gMDsKICAgICAgIHogPSA1L3o7CkBAIC0xNTUsMjQgKzE1NSw0NyBAQAogICAvLyBiYXNpY19zdHJpbmcKICAgdGVtcGxhdGU8Y2xhc3MgX0NoYXJULCBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8X0NoYXJUPiA+CiAgIGNsYXNzIF9fYXR0cmlidXRlX18gKChfX3R5cGVfdmlzaWJpbGl0eV9fKCJkZWZhdWx0IikpKSBiYXNpY19zdHJpbmcgewotICAgIF9DaGFyVCBsb2NhbFN0b3JhZ2VbNF07CisgICAgYm9vbCBpc0xvbmc7CisgICAgdW5pb24geworICAgICAgX0NoYXJUIGxvY2FsU3RvcmFnZVs0XTsKKyAgICAgIF9DaGFyVCAqZXh0ZXJuYWxTdG9yYWdlOworCisgICAgICB2b2lkIGFzc2lnbkV4dGVybmFsKF9DaGFyVCAqbmV3RXh0ZXJuYWwpIHsKKyAgICAgICAgZXh0ZXJuYWxTdG9yYWdlID0gbmV3RXh0ZXJuYWw7CisgICAgICB9CisgICAgfSBzdG9yYWdlOwogCiAgICAgdHlwZWRlZiBhbGxvY2F0b3JfdHJhaXRzPF9BbGxvYz4gX19hbGxvY190cmFpdHM7CiAKICAgcHVibGljOgorICAgIGJhc2ljX3N0cmluZygpOworCiAgICAgdm9pZCBwdXNoX2JhY2soaW50IGMpIHsKICAgICAgIC8vIEZha2UgZXJyb3IgdHJpZ2dlci4KLSAgICAgIC8vIE5vIHdhcm5pbmcgaXMgZXhwZWN0ZWQgYXMgd2UgYXJlIHN1cHByZXNzaW5nIHdhcm5pbmcgY29tbWluZworICAgICAgLy8gTm8gd2FybmluZyBpcyBleHBlY3RlZCBhcyB3ZSBhcmUgc3VwcHJlc3Npbmcgd2FybmluZyBjb21pbmcKICAgICAgIC8vIG91dCBvZiBzdGQ6OmJhc2ljX3N0cmluZy4KICAgICAgIGludCB6ID0gMDsKICAgICAgIHogPSA1L3o7CiAgICAgfQogCisgICAgX0NoYXJUICpnZXRCdWZmZXIoKSB7CisgICAgICByZXR1cm4gaXNMb25nID8gc3RvcmFnZS5leHRlcm5hbFN0b3JhZ2UgOiBzdG9yYWdlLmxvY2FsU3RvcmFnZTsKKyAgICB9CisKICAgICBiYXNpY19zdHJpbmcgJm9wZXJhdG9yICs9KGludCBjKSB7CiAgICAgICAvLyBGYWtlIGRlYWxsb2NhdGUgc3RhY2stYmFzZWQgc3RvcmFnZS4KICAgICAgIC8vIE5vIHdhcm5pbmcgaXMgZXhwZWN0ZWQgYXMgd2UgYXJlIHN1cHByZXNzaW5nIHdhcm5pbmdzIHdpdGhpbgotICAgICAgLy8gYWxsb2NhdG9ycyBiZWluZyB1c2VkIGJ5IHN0ZDo6YmFzaWNfc3RyaW5nLgotICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoJmxvY2FsU3RvcmFnZSk7CisgICAgICAvLyBzdGQ6OmJhc2ljX3N0cmluZy4KKyAgICAgIF9fYWxsb2NfdHJhaXRzOjpkZWFsbG9jYXRlKGdldEJ1ZmZlcigpKTsKKyAgICB9CisKKyAgICBiYXNpY19zdHJpbmcgJm9wZXJhdG9yID0oY29uc3QgYmFzaWNfc3RyaW5nICZvdGhlcikgeworICAgICAgLy8gRmFrZSBkZWFsbG9jYXRlIHN0YWNrLWJhc2VkIHN0b3JhZ2UsIHRoZW4gdXNlIHRoZSB2YXJpYWJsZSBpbiB0aGUKKyAgICAgIC8vIHNhbWUgdW5pb24uCisgICAgICAvLyBObyB3YXJuaW5nIGlzIGV4cGVjdGVkIGFzIHdlIGFyZSBzdXBwcmVzc2luZyB3YXJuaW5ncyB3aXRoaW4KKyAgICAgIC8vIHN0ZDo6YmFzaWNfc3RyaW5nLgorICAgICAgX19hbGxvY190cmFpdHM6OmRlYWxsb2NhdGUoZ2V0QnVmZmVyKCkpOworICAgICAgc3RvcmFnZS5hc3NpZ25FeHRlcm5hbChuZXcgX0NoYXJUWzRdKTsKICAgICB9CiAgIH07CiB9CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL0lucHV0cy9zeXN0ZW0taGVhZGVyLXNpbXVsYXRvci1vYmpjLmggYi90ZXN0L0FuYWx5c2lzL0lucHV0cy9zeXN0ZW0taGVhZGVyLXNpbXVsYXRvci1vYmpjLmgKaW5kZXggM2UxZDk1NS4uOGE1ZDNiNiAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9JbnB1dHMvc3lzdGVtLWhlYWRlci1zaW11bGF0b3Itb2JqYy5oCisrKyBiL3Rlc3QvQW5hbHlzaXMvSW5wdXRzL3N5c3RlbS1oZWFkZXItc2ltdWxhdG9yLW9iamMuaApAQCAtNjYsOCArNjYsMTEgQEAKIE5TRmFzdEVudW1lcmF0aW9uU3RhdGU7CiBAcHJvdG9jb2wgTlNGYXN0RW51bWVyYXRpb24gIC0gKE5TVUludGVnZXIpY291bnRCeUVudW1lcmF0aW5nV2l0aFN0YXRlOihOU0Zhc3RFbnVtZXJhdGlvblN0YXRlICopc3RhdGUgb2JqZWN0czooaWQgKilzdGFja2J1ZiBjb3VudDooTlNVSW50ZWdlcilsZW47CiBAZW5kICAgICAgICAgICBAY2xhc3MgTlNTdHJpbmcsIE5TRGljdGlvbmFyeTsKLUBpbnRlcmZhY2UgTlNWYWx1ZSA6IE5TT2JqZWN0IDxOU0NvcHlpbmcsIE5TQ29kaW5nPiAgLSAodm9pZClnZXRWYWx1ZToodm9pZCAqKXZhbHVlOwotQGVuZCAgQGludGVyZmFjZSBOU051bWJlciA6IE5TVmFsdWUgIC0gKGNoYXIpY2hhclZhbHVlOworQGludGVyZmFjZSBOU1ZhbHVlIDogTlNPYmplY3QgPE5TQ29weWluZywgTlNDb2Rpbmc+CisrIChOU1ZhbHVlICopdmFsdWVXaXRoUG9pbnRlcjooY29uc3Qgdm9pZCAqKXA7CistICh2b2lkKWdldFZhbHVlOih2b2lkICopdmFsdWU7CitAZW5kCitAaW50ZXJmYWNlIE5TTnVtYmVyIDogTlNWYWx1ZSAgLSAoY2hhciljaGFyVmFsdWU7CiAtIChpZClpbml0V2l0aEludDooaW50KXZhbHVlOwogQGVuZCAgIEBjbGFzcyBOU1N0cmluZzsKIEBpbnRlcmZhY2UgTlNBcnJheSA6IE5TT2JqZWN0IDxOU0NvcHlpbmcsIE5TTXV0YWJsZUNvcHlpbmcsIE5TQ29kaW5nLCBOU0Zhc3RFbnVtZXJhdGlvbj4gIC0gKE5TVUludGVnZXIpY291bnQ7CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL05TQ29udGFpbmVycy5tIGIvdGVzdC9BbmFseXNpcy9OU0NvbnRhaW5lcnMubQppbmRleCBhOWU3NmZiLi4zZDM2MDNhIDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL05TQ29udGFpbmVycy5tCisrKyBiL3Rlc3QvQW5hbHlzaXMvTlNDb250YWluZXJzLm0KQEAgLTEsNCArMSw3IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxvc3guY29jb2EuTm9uTmlsUmV0dXJuVmFsdWUsb3N4LmNvY29hLk5pbEFyZyxvc3guY29jb2EuTG9vcHMgLXZlcmlmeSAtV25vLW9iamMtcm9vdC1jbGFzcyAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsb3N4LmNvY29hLk5vbk5pbFJldHVyblZhbHVlLG9zeC5jb2NvYS5OaWxBcmcsb3N4LmNvY29hLkxvb3BzLGRlYnVnLkV4cHJJbnNwZWN0aW9uIC12ZXJpZnkgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKKwordm9pZCBjbGFuZ19hbmFseXplcl9ldmFsKGludCk7CisKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBOU1VJbnRlZ2VyOwogdHlwZWRlZiBzaWduZWQgY2hhciBCT09MOwogdHlwZWRlZiBzdHJ1Y3QgX05TWm9uZSBOU1pvbmU7CkBAIC0yNzYsMyArMjc5LDggQEAKIAl9CiB9CiAKK3ZvaWQgdGVzdExpdGVyYWxzTm9uTmlsKCkgeworICBjbGFuZ19hbmFseXplcl9ldmFsKCEhQFtdKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19CisgIGNsYW5nX2FuYWx5emVyX2V2YWwoISFAe30pOyAvLyBleHBlY3RlZC13YXJuaW5ne3tUUlVFfX0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9OZXdEZWxldGUtY2hlY2tlci10ZXN0LmNwcCBiL3Rlc3QvQW5hbHlzaXMvTmV3RGVsZXRlLWNoZWNrZXItdGVzdC5jcHAKaW5kZXggY2M5NzI1MS4uODU1YjA1ZCAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9OZXdEZWxldGUtY2hlY2tlci10ZXN0LmNwcAorKysgYi90ZXN0L0FuYWx5c2lzL05ld0RlbGV0ZS1jaGVja2VyLXRlc3QuY3BwCkBAIC0zMzgsMTMgKzMzOCwxMyBAQAogcHVibGljOgogICBpbnQgKng7CiAgIERlcmVmQ2xhc3MoKSB7fQotICB+RGVyZWZDbGFzcygpIHsqeCA9IDE7fSAvL2V4cGVjdGVkLXdhcm5pbmcge3tVc2Ugb2YgbWVtb3J5IGFmdGVyIGl0IGlzIGZyZWVkfX0KKyAgfkRlcmVmQ2xhc3MoKSB7KnggPSAxO30KIH07CiAKIHZvaWQgdGVzdERvdWJsZURlbGV0ZUNsYXNzSW5zdGFuY2UoKSB7CiAgIERlcmVmQ2xhc3MgKmZvbyA9IG5ldyBEZXJlZkNsYXNzKCk7CiAgIGRlbGV0ZSBmb287Ci0gIGRlbGV0ZSBmb287IC8vIEZJWE1FOiBXZSBzaG91bGQgaWRlYWxseSByZXBvcnQgd2FybmluZyBoZXJlIGluc3RlYWQgb2YgaW5zaWRlIHRoZSBkZXN0cnVjdG9yLgorICBkZWxldGUgZm9vOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7QXR0ZW1wdCB0byBkZWxldGUgcmVsZWFzZWQgbWVtb3J5fX0KIH0KIAogY2xhc3MgRW1wdHlDbGFzc3sKQEAgLTM1Niw1ICszNTYsNSBAQAogdm9pZCB0ZXN0RG91YmxlRGVsZXRlRW1wdHlDbGFzcygpIHsKICAgRW1wdHlDbGFzcyAqZm9vID0gbmV3IEVtcHR5Q2xhc3MoKTsKICAgZGVsZXRlIGZvbzsKLSAgZGVsZXRlIGZvbzsgIC8vZXhwZWN0ZWQtd2FybmluZyB7e0F0dGVtcHQgdG8gZnJlZSByZWxlYXNlZCBtZW1vcnl9fQorICBkZWxldGUgZm9vOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0F0dGVtcHQgdG8gZGVsZXRlIHJlbGVhc2VkIG1lbW9yeX19CiB9CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL05ld0RlbGV0ZS12YXJpYWRpYy5jcHAgYi90ZXN0L0FuYWx5c2lzL05ld0RlbGV0ZS12YXJpYWRpYy5jcHAKaW5kZXggNTNkYmE0Ni4uNjJhN2QxNyAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9OZXdEZWxldGUtdmFyaWFkaWMuY3BwCisrKyBiL3Rlc3QvQW5hbHlzaXMvTmV3RGVsZXRlLXZhcmlhZGljLmNwcApAQCAtNSwxNSArNSwxOSBAQAogICB0eXBlZGVmIF9fdHlwZW9mX18oc2l6ZW9mKGludCkpIHNpemVfdDsKIH0KIAotdm9pZCAqb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90LCAuLi4pOwotdm9pZCAqb3BlcmF0b3IgbmV3W10oc3RkOjpzaXplX3QsIC4uLik7CitzdHJ1Y3QgWCB7fTsKKwordm9pZCAqb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90LCBYLCAuLi4pOwordm9pZCAqb3BlcmF0b3IgbmV3W10oc3RkOjpzaXplX3QsIFgsIC4uLik7CiAKIHZvaWQgdGVzdEdsb2JhbEN1c3RvbVZhcmlhZGljTmV3KCkgewotICB2b2lkICpwMSA9IG9wZXJhdG9yIG5ldygwKTsgLy8gbm8gd2FybgorICBYIHg7CiAKLSAgdm9pZCAqcDIgPSBvcGVyYXRvciBuZXdbXSgwKTsgLy8gbm8gd2FybgorICB2b2lkICpwMSA9IG9wZXJhdG9yIG5ldygwLCB4KTsgLy8gbm8gd2FybgogCi0gIGludCAqcDMgPSBuZXcgaW50OyAvLyBubyB3YXJuCisgIHZvaWQgKnAyID0gb3BlcmF0b3IgbmV3W10oMCwgeCk7IC8vIG5vIHdhcm4KIAotICBpbnQgKnA0ID0gbmV3IGludFswXTsgLy8gbm8gd2FybgorICBpbnQgKnAzID0gbmV3ICh4KSBpbnQ7IC8vIG5vIHdhcm4KKworICBpbnQgKnA0ID0gbmV3ICh4KSBpbnRbMF07IC8vIG5vIHdhcm4KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvTmV3RGVsZXRlTGVha3MtUFIxODM5NC5jcHAgYi90ZXN0L0FuYWx5c2lzL05ld0RlbGV0ZUxlYWtzLVBSMTgzOTQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDk0NTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0FuYWx5c2lzL05ld0RlbGV0ZUxlYWtzLVBSMTgzOTQuY3BwCkBAIC0wLDAgKzEsMTYgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZXItY29uZmlnIGdyYXBoLXRyaW0taW50ZXJ2YWw9MSAtYW5hbHl6ZXItbWF4LWxvb3AgMSAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlLGFscGhhLmNwbHVzcGx1cy5OZXdEZWxldGVMZWFrcyAtdmVyaWZ5ICVzCisvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcworCitjbGFzcyBBIHsKK3B1YmxpYzoKKyAgdm9pZCBmKCkge307CisgIH5BKCkgeworICAgIGZvciAoaW50IGk9MDsgaTwzOyBpKyspCisgICAgICBmKCk7CisgIH0KK307CisKK3ZvaWQgZXJyb3IoKSB7CisgIEEgKmEgPSBuZXcgQSgpOworICBkZWxldGUgYTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvTm9SZXR1cm4ubSBiL3Rlc3QvQW5hbHlzaXMvTm9SZXR1cm4ubQppbmRleCBjNzRkNTRlLi45YjcwMTFlIDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL05vUmV0dXJuLm0KKysrIGIvdGVzdC9BbmFseXNpcy9Ob1JldHVybi5tCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmcgLS1hbmFseXplIC1YY2xhbmcgLWFuYWx5emVyLWNoZWNrZXI9YWxwaGEuY29yZSAtWGNsYW5nIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlIC12ZXJpZnkgJXMKIAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL1BSOTc0MS5jcHAgYi90ZXN0L0FuYWx5c2lzL1BSOTc0MS5jcHAKaW5kZXggMjgwN2M0NC4uNTQyYmMyZCAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9QUjk3NDEuY3BwCisrKyBiL3Rlc3QvQW5hbHlzaXMvUFI5NzQxLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtY2MxIC1zdGQ9YysrMTEgLVd1bmluaXRpYWxpemVkIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1XdW5pbml0aWFsaXplZCAtdmVyaWZ5ICVzCiAvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwogCiB2b2lkIGYoKSB7CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL2FuYWx5emVyLXN0YXRzLmMgYi90ZXN0L0FuYWx5c2lzL2FuYWx5emVyLXN0YXRzLmMKaW5kZXggNjMwNzNiNy4uYTBhNTBjYiAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9hbmFseXplci1zdGF0cy5jCisrKyBiL3Rlc3QvQW5hbHlzaXMvYW5hbHl6ZXItc3RhdHMuYwpAQCAtMiw3ICsyLDcgQEAKIAogaW50IGZvbygpOwogCi1pbnQgdGVzdCgpIHsgLy8gZXhwZWN0ZWQtd2FybmluZy1yZXt7dGVzdCAtPiBUb3RhbCBDRkdCbG9ja3M6IFswLTldKyBcfCBVbnJlYWNoYWJsZSBDRkdCbG9ja3M6IDAgXHwgRXhoYXVzdGVkIEJsb2NrOiBubyBcfCBFbXB0eSBXb3JrTGlzdDogeWVzfX0KK2ludCB0ZXN0KCkgeyAvLyBleHBlY3RlZC13YXJuaW5nLXJle3t0ZXN0IC0+IFRvdGFsIENGR0Jsb2Nrczoge3tbMC05XSt9fSB8IFVucmVhY2hhYmxlIENGR0Jsb2NrczogMCB8IEV4aGF1c3RlZCBCbG9jazogbm8gfCBFbXB0eSBXb3JrTGlzdDogeWVzfX0KICAgaW50IGEgPSAxOwogICBhID0gMzQgLyAxMjsKIApkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9hdXRvLW9iai1kdG9ycy1jZmctb3V0cHV0LmNwcCBiL3Rlc3QvQW5hbHlzaXMvYXV0by1vYmotZHRvcnMtY2ZnLW91dHB1dC5jcHAKaW5kZXggMGRiYmZiNS4uMGI0NDU0ZiAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9hdXRvLW9iai1kdG9ycy1jZmctb3V0cHV0LmNwcAorKysgYi90ZXN0L0FuYWx5c2lzL2F1dG8tb2JqLWR0b3JzLWNmZy1vdXRwdXQuY3BwCkBAIC0yMjgsNyArMjI4LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgNzogYgogLy8gQ0hFQ0stTkVYVDogICA4OiBbQjQuN10gKEltcGxpY2l0Q2FzdEV4cHIsIE5vT3AsIGNvbnN0IGNsYXNzIEEpCiAvLyBDSEVDSy1ORVhUOiAgIDk6IFtCNC44XS5vcGVyYXRvciBpbnQKLS8vIENIRUNLOiAgICAgICAxMDogW0I0LjldKCkKKy8vIENIRUNLOiAgICAgICAxMDogW0I0LjhdCiAvLyBDSEVDSzogICAgICAgMTE6IFtCNC4xMF0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgaW50KQogLy8gQ0hFQ0s6ICAgICAgIDEyOiBbQjQuMTFdIChJbXBsaWNpdENhc3RFeHByLCBJbnRlZ3JhbFRvQm9vbGVhbiwgX0Jvb2wpCiAvLyBDSEVDSy1ORVhUOiAgIFQ6IGlmIFtCNC4xMl0KQEAgLTMwNyw3ICszMDcsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA3OiBiCiAvLyBDSEVDSy1ORVhUOiAgIDg6IFtCOC43XSAoSW1wbGljaXRDYXN0RXhwciwgTm9PcCwgY29uc3QgY2xhc3MgQSkKIC8vIENIRUNLLU5FWFQ6ICAgOTogW0I4LjhdLm9wZXJhdG9yIGludAotLy8gQ0hFQ0s6ICAgICAgIDEwOiBbQjguOV0oKQorLy8gQ0hFQ0s6ICAgICAgIDEwOiBbQjguOF0KIC8vIENIRUNLOiAgICAgICAxMTogW0I4LjEwXSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBpbnQpCiAvLyBDSEVDSzogICAgICAgMTI6IFtCOC4xMV0gKEltcGxpY2l0Q2FzdEV4cHIsIEludGVncmFsVG9Cb29sZWFuLCBfQm9vbCkKIC8vIENIRUNLLU5FWFQ6ICAgVDogaWYgW0I4LjEyXQpAQCAtMzU0LDcgKzM1NCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgIDU6IGIKIC8vIENIRUNLLU5FWFQ6ICAgNjogW0I0LjVdIChJbXBsaWNpdENhc3RFeHByLCBOb09wLCBjb25zdCBjbGFzcyBBKQogLy8gQ0hFQ0stTkVYVDogICA3OiBbQjQuNl0ub3BlcmF0b3IgaW50Ci0vLyBDSEVDSy1ORVhUOiAgIDg6IFtCNC43XSgpCisvLyBDSEVDSy1ORVhUOiAgIDg6IFtCNC42XQogLy8gQ0hFQ0stTkVYVDogICA5OiBbQjQuOF0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgaW50KQogLy8gQ0hFQ0s6ICAgICAgIDEwOiBbQjQuOV0gKEltcGxpY2l0Q2FzdEV4cHIsIEludGVncmFsVG9Cb29sZWFuLCBfQm9vbCkKIC8vIENIRUNLLU5FWFQ6ICAgVDogd2hpbGUgW0I0LjEwXQpAQCAtNDQwLDcgKzQ0MCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgIDU6IGIKIC8vIENIRUNLLU5FWFQ6ICAgNjogW0IxMC41XSAoSW1wbGljaXRDYXN0RXhwciwgTm9PcCwgY29uc3QgY2xhc3MgQSkKIC8vIENIRUNLLU5FWFQ6ICAgNzogW0IxMC42XS5vcGVyYXRvciBpbnQKLS8vIENIRUNLLU5FWFQ6ICAgODogW0IxMC43XSgpCisvLyBDSEVDSy1ORVhUOiAgIDg6IFtCMTAuNl0KIC8vIENIRUNLLU5FWFQ6ICAgOTogW0IxMC44XSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBpbnQpCiAvLyBDSEVDSzogICAgICAgMTA6IFtCMTAuOV0gKEltcGxpY2l0Q2FzdEV4cHIsIEludGVncmFsVG9Cb29sZWFuLCBfQm9vbCkKIC8vIENIRUNLLU5FWFQ6ICAgVDogd2hpbGUgW0IxMC4xMF0KQEAgLTU4Niw3ICs1ODYsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA3OiBiCiAvLyBDSEVDSy1ORVhUOiAgIDg6IFtCMi43XSAoSW1wbGljaXRDYXN0RXhwciwgTm9PcCwgY29uc3QgY2xhc3MgQSkKIC8vIENIRUNLLU5FWFQ6ICAgOTogW0IyLjhdLm9wZXJhdG9yIGludAotLy8gQ0hFQ0s6ICAgICAgIDEwOiBbQjIuOV0oKQorLy8gQ0hFQ0s6ICAgICAgIDEwOiBbQjIuOF0KIC8vIENIRUNLOiAgICAgICAxMTogW0IyLjEwXSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBpbnQpCiAvLyBDSEVDSy1ORVhUOiAgIFQ6IHN3aXRjaCBbQjIuMTFdCiAvLyBDSEVDSy1ORVhUOiAgIFByZWRzICgxKTogQjQKQEAgLTYyNCw3ICs2MjQsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA3OiBiCiAvLyBDSEVDSy1ORVhUOiAgIDg6IFtCMi43XSAoSW1wbGljaXRDYXN0RXhwciwgTm9PcCwgY29uc3QgY2xhc3MgQSkKIC8vIENIRUNLLU5FWFQ6ICAgOTogW0IyLjhdLm9wZXJhdG9yIGludAotLy8gQ0hFQ0s6ICAgICAgIDEwOiBbQjIuOV0oKQorLy8gQ0hFQ0s6ICAgICAgIDEwOiBbQjIuOF0KIC8vIENIRUNLOiAgICAgICAxMTogW0IyLjEwXSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBpbnQpCiAvLyBDSEVDSy1ORVhUOiAgIFQ6IHN3aXRjaCBbQjIuMTFdCiAvLyBDSEVDSy1ORVhUOiAgIFByZWRzICgxKTogQjkKQEAgLTcxMCw3ICs3MTAsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA1OiBiCiAvLyBDSEVDSy1ORVhUOiAgIDY6IFtCNC41XSAoSW1wbGljaXRDYXN0RXhwciwgTm9PcCwgY29uc3QgY2xhc3MgQSkKIC8vIENIRUNLLU5FWFQ6ICAgNzogW0I0LjZdLm9wZXJhdG9yIGludAotLy8gQ0hFQ0stTkVYVDogICA4OiBbQjQuN10oKQorLy8gQ0hFQ0stTkVYVDogICA4OiBbQjQuNl0KIC8vIENIRUNLLU5FWFQ6ICAgOTogW0I0LjhdIChJbXBsaWNpdENhc3RFeHByLCBVc2VyRGVmaW5lZENvbnZlcnNpb24sIGludCkKIC8vIENIRUNLOiAgICAgICAxMDogW0I0LjldIChJbXBsaWNpdENhc3RFeHByLCBJbnRlZ3JhbFRvQm9vbGVhbiwgX0Jvb2wpCiAvLyBDSEVDSy1ORVhUOiAgIFQ6IGZvciAoLi4uOyBbQjQuMTBdOyApCkBAIC03OTYsNyArNzk2LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgNTogYwogLy8gQ0hFQ0stTkVYVDogICA2OiBbQjEwLjVdIChJbXBsaWNpdENhc3RFeHByLCBOb09wLCBjb25zdCBjbGFzcyBBKQogLy8gQ0hFQ0stTkVYVDogICA3OiBbQjEwLjZdLm9wZXJhdG9yIGludAotLy8gQ0hFQ0stTkVYVDogICA4OiBbQjEwLjddKCkKKy8vIENIRUNLLU5FWFQ6ICAgODogW0IxMC42XQogLy8gQ0hFQ0stTkVYVDogICA5OiBbQjEwLjhdIChJbXBsaWNpdENhc3RFeHByLCBVc2VyRGVmaW5lZENvbnZlcnNpb24sIGludCkKIC8vIENIRUNLOiAgICAgICAxMDogW0IxMC45XSAoSW1wbGljaXRDYXN0RXhwciwgSW50ZWdyYWxUb0Jvb2xlYW4sIF9Cb29sKQogLy8gQ0hFQ0stTkVYVDogICBUOiBmb3IgKC4uLjsgW0IxMC4xMF07ICkKZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvYml0d2lzZS1vcHMuYyBiL3Rlc3QvQW5hbHlzaXMvYml0d2lzZS1vcHMuYwppbmRleCBiZjI4MmVjLi4wMWRhZjQyIDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL2JpdHdpc2Utb3BzLmMKKysrIGIvdGVzdC9BbmFseXNpcy9iaXR3aXNlLW9wcy5jCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsZGVidWcuRXhwckluc3BlY3Rpb24gLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsZGVidWcuRXhwckluc3BlY3Rpb24gLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTMgLVduby1zaGlmdC1jb3VudC1vdmVyZmxvdyAtdmVyaWZ5ICVzCiAKIHZvaWQgY2xhbmdfYW5hbHl6ZXJfZXZhbChpbnQpOwogI2RlZmluZSBDSEVDSyhleHByKSBpZiAoIShleHByKSkgcmV0dXJuOyBjbGFuZ19hbmFseXplcl9ldmFsKGV4cHIpCkBAIC0xMSw0ICsxMSwyMiBAQAogICAvLyBGYWxzZSBwb3NpdGl2ZXMgZHVlIHRvIFNWYWxCdWlsZGVyIGdpdmluZyB1cCBvbiBjZXJ0YWluIGtpbmRzIG9mIGV4cHJzLgogICBDSEVDSygxIC0geCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1VOS05PV059fQogICBDSEVDSyh4ICYgeSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1VOS05PV059fQorfQorCitpbnQgdGVzdENvbnN0YW50U2hpZnRzX1BSMTgwNzMoaW50IHdoaWNoKSB7CisgIC8vIEZJWE1FOiBXZSBzaG91bGQgaGF2ZSBhIGNoZWNrZXIgdGhhdCBhY3R1YWxseSBzcGVjaWZpY2FsbHkgY2hlY2tzIGJpdHdpc2UKKyAgLy8gc2hpZnRzIGFnYWluc3QgdGhlIHdpZHRoIG9mIHRoZSBMSFMncyAvc3RhdGljLyB0eXBlLCByYXRoZXIgdGhhbiBqdXN0CisgIC8vIGhhdmluZyBCYXNpY1ZhbHVlRmFjdG9yeSByZXR1cm4gInVuZGVmaW5lZCIgd2hlbiBkZWFsaW5nIHdpdGggdHdvIGNvbnN0YW50CisgIC8vIG9wZXJhbmRzLgorICBzd2l0Y2ggKHdoaWNoKSB7CisgIGNhc2UgMToKKyAgICByZXR1cm4gMFVMTCA8PCA2MzsgLy8gbm8td2FybmluZworICBjYXNlIDI6CisgICAgcmV0dXJuIDBVTEwgPDwgNjQ7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoZSByZXN1bHQgb2YgdGhlICc8PCcgZXhwcmVzc2lvbiBpcyB1bmRlZmluZWR9fQorICBjYXNlIDM6CisgICAgcmV0dXJuIDBVTEwgPDwgNjU7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoZSByZXN1bHQgb2YgdGhlICc8PCcgZXhwcmVzc2lvbiBpcyB1bmRlZmluZWR9fQorCisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDA7CisgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL2Nhc3RzLmMgYi90ZXN0L0FuYWx5c2lzL2Nhc3RzLmMKaW5kZXggM2UyZjgwNy4uNDJjMDViZSAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9jYXN0cy5jCisrKyBiL3Rlc3QvQW5hbHlzaXMvY2FzdHMuYwpAQCAtMTEwLDcgKzExMCw4IEBACiAgICAgY2xhbmdfYW5hbHl6ZXJfZXZhbChzeW1ib2xpY1BvaW50ZXIpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tUUlVFfX0KIAogICBpbnQgbG9jYWxJbnQ7Ci0gIGNsYW5nX2FuYWx5emVyX2V2YWwoJmxvY2FsSW50KTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19CisgIGludCogcHRyID0gJmxvY2FsSW50OworICBjbGFuZ19hbmFseXplcl9ldmFsKHB0cik7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQogICBjbGFuZ19hbmFseXplcl9ldmFsKCZjYXN0c1RvQm9vbCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQogICBjbGFuZ19hbmFseXplcl9ldmFsKCJhYmMiKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvY2FzdHMuY3BwIGIvdGVzdC9BbmFseXNpcy9jYXN0cy5jcHAKaW5kZXggMzM5NTM5MS4uNTNlMWNkMCAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9jYXN0cy5jcHAKKysrIGIvdGVzdC9BbmFseXNpcy9jYXN0cy5jcHAKQEAgLTEsNSArMSw0IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSAtYW5hbHl6ZXItc3RvcmU9cmVnaW9uIC12ZXJpZnkgJXMKLS8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCiAKIGJvb2wgUFIxNDYzNChpbnQgeCkgewogICBkb3VibGUgeSA9IChkb3VibGUpeDsKQEAgLTEwLDMgKzksMTUgQEAKICAgZG91YmxlIHkgPSAoZG91YmxlKXg7CiAgIHJldHVybiB5OwogfQorCit2b2lkIGludEFzQm9vbEFzU3dpdGNoQ29uZGl0aW9uKGludCBjKSB7CisgIHN3aXRjaCAoKGJvb2wpYykgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7c3dpdGNoIGNvbmRpdGlvbiBoYXMgYm9vbGVhbiB2YWx1ZX19CisgIGNhc2UgMDoKKyAgICBicmVhazsKKyAgfQorCisgIHN3aXRjaCAoKGludCkoYm9vbCljKSB7IC8vIG5vLXdhcm5pbmcKKyAgICBjYXNlIDA6CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9jZmcuY3BwIGIvdGVzdC9BbmFseXNpcy9jZmcuY3BwCmluZGV4IDY2MGQxZjIuLjY1MDYwYjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvY2ZnLmNwcAorKysgYi90ZXN0L0FuYWx5c2lzL2NmZy5jcHAKQEAgLTEsNSArMSw3IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9ZGVidWcuRHVtcENGRyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMiAtc3RkPWMrKzExICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1kZWJ1Zy5EdW1wQ0ZHIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEyIC1zdGQ9YysrMTEgJXMgPiAldCAyPiYxCisvLyBSVU46IEZpbGVDaGVjayAtLWlucHV0LWZpbGU9JXQgJXMKIAorLy8gQ0hFQ0stTEFCRUw6IHZvaWQgY2hlY2tXcmFwKGludCBpKQogLy8gQ0hFQ0s6IEVOVFJZCiAvLyBDSEVDSy1ORVhUOiBTdWNjcyAoMSk6IEIxCiAvLyBDSEVDSzogW0IxXQpAQCAtMzUsNiArMzcsNyBAQAogICB9CiB9CiAKKy8vIENIRUNLLUxBQkVMOiB2b2lkIGNoZWNrRGVjbFN0bXRzKCkKIC8vIENIRUNLOiBFTlRSWQogLy8gQ0hFQ0stTkVYVDogU3VjY3MgKDEpOiBCMQogLy8gQ0hFQ0s6IFtCMV0KQEAgLTQ4LDcgKzUxLDcgQEAKIC8vIENIRUNLLU5FWFQ6IENYWENvbnN0cnVjdEV4cHIKIC8vIENIRUNLLU5FWFQ6ICAgOTogc3RydWN0IHN0YW5kYWxvbmUgbXlTdGFuZGFsb25lOwogLy8gQ0hFQ0stTkVYVDogQ1hYQ29uc3RydWN0RXhwcgotLy8gQ0hFQ0stTkVYVDogIDExOiBzdHJ1Y3QgPGFub255bW91cyBzdHJ1Y3QgYXQge3suKn19PiBteUFub247CisvLyBDSEVDSy1ORVhUOiAgMTE6IHN0cnVjdCAoYW5vbnltb3VzIHN0cnVjdCBhdCB7ey4qfX0pIG15QW5vbjsKIC8vIENIRUNLLU5FWFQ6IENYWENvbnN0cnVjdEV4cHIKIC8vIENIRUNLLU5FWFQ6ICAxMzogc3RydWN0IG5hbWVkIG15TmFtZWQ7CiAvLyBDSEVDSy1ORVhUOiAgIFByZWRzICgxKTogQjIKQEAgLTY3LDYgKzcwLDcgQEAKICAgc3RhdGljX2Fzc2VydCgxLCAiYWJjIik7CiB9CiAKKy8vIENIRUNLLUxBQkVMOiB2b2lkIEYoRW1wdHlFIGUpCiAvLyBDSEVDSzogRU5UUlkKIC8vIENIRUNLLU5FWFQ6IFN1Y2NzICgxKTogQjEKIC8vIENIRUNLOiBbQjFdCkBAIC04Myw2ICs4Nyw3IEBACiAgIHN3aXRjaCAoZSkge30KIH0KIAorLy8gQ0hFQ0stTEFCRUw6IHZvaWQgdGVzdEJ1aWx0aW5TaXplKCkKIC8vIENIRUNLOiBFTlRSWQogLy8gQ0hFQ0stTkVYVDogU3VjY3MgKDEpOiBCMQogLy8gQ0hFQ0s6IFtCMV0KQEAgLTEwNiwxNiArMTExLDE4IEBACiAgIH5BKCkge30KIH07CiAKKy8vIENIRUNLLUxBQkVMOiB2b2lkIHRlc3RfZGVsZXRlZHRvcigpCiAvLyBDSEVDSzogW0IyIChFTlRSWSldCiAvLyBDSEVDSy1ORVhUOiAgIFN1Y2NzICgxKTogQjEKIC8vIENIRUNLOiBbQjFdCi0vLyBDSEVDSy1ORVhUOiAgIDE6ICAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgQSkKLS8vIENIRUNLLU5FWFQ6ICAgMjogbmV3IEEoW0IxLjFdKQotLy8gQ0hFQ0stTkVYVDogICAzOiBBICphID0gbmV3IEEoKTsKLS8vIENIRUNLLU5FWFQ6ICAgNDogYQotLy8gQ0hFQ0stTkVYVDogICA1OiBbQjEuNF0gKEltcGxpY2l0Q2FzdEV4cHIsIExWYWx1ZVRvUlZhbHVlLCBjbGFzcyBBICopCi0vLyBDSEVDSy1ORVhUOiAgIDY6IFtCMS41XS0+fkEoKSAoSW1wbGljaXQgZGVzdHJ1Y3RvcikKLS8vIENIRUNLLU5FWFQ6ICAgNzogZGVsZXRlIFtCMS41XQorLy8gQ0hFQ0stTkVYVDogICAxOiAgQ0ZHTmV3QWxsb2NhdG9yKEEgKikKKy8vIENIRUNLLU5FWFQ6ICAgMjogIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBBKQorLy8gQ0hFQ0stTkVYVDogICAzOiBuZXcgQShbQjEuMl0pCisvLyBDSEVDSy1ORVhUOiAgIDQ6IEEgKmEgPSBuZXcgQSgpOworLy8gQ0hFQ0stTkVYVDogICA1OiBhCisvLyBDSEVDSy1ORVhUOiAgIDY6IFtCMS41XSAoSW1wbGljaXRDYXN0RXhwciwgTFZhbHVlVG9SVmFsdWUsIGNsYXNzIEEgKikKKy8vIENIRUNLLU5FWFQ6ICAgNzogW0IxLjZdLT5+QSgpIChJbXBsaWNpdCBkZXN0cnVjdG9yKQorLy8gQ0hFQ0stTkVYVDogICA4OiBkZWxldGUgW0IxLjZdCiAvLyBDSEVDSy1ORVhUOiAgIFByZWRzICgxKTogQjIKIC8vIENIRUNLLU5FWFQ6ICAgU3VjY3MgKDEpOiBCMAogLy8gQ0hFQ0s6IFtCMCAoRVhJVCldCkBAIC0xMjUsMTcgKzEzMiwxOSBAQAogICBkZWxldGUgYTsKIH0KIAorLy8gQ0hFQ0stTEFCRUw6IHZvaWQgdGVzdF9kZWxldGVBcnJheWR0b3IoKQogLy8gQ0hFQ0s6IFtCMiAoRU5UUlkpXQogLy8gQ0hFQ0stTkVYVDogICBTdWNjcyAoMSk6IEIxCiAvLyBDSEVDSzogW0IxXQogLy8gQ0hFQ0stTkVYVDogICAxOiA1Ci0vLyBDSEVDSy1ORVhUOiAgIDI6ICAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgQSkKLS8vIENIRUNLLU5FWFQ6ICAgMzogbmV3IEEge3tcW1xbfX1CMS4xXV0KLS8vIENIRUNLLU5FWFQ6ICAgNDogQSAqYSA9IG5ldyBBIFs1XTsKLS8vIENIRUNLLU5FWFQ6ICAgNTogYQotLy8gQ0hFQ0stTkVYVDogICA2OiBbQjEuNV0gKEltcGxpY2l0Q2FzdEV4cHIsIExWYWx1ZVRvUlZhbHVlLCBjbGFzcyBBICopCi0vLyBDSEVDSy1ORVhUOiAgIDc6IFtCMS42XS0+fkEoKSAoSW1wbGljaXQgZGVzdHJ1Y3RvcikKLS8vIENIRUNLLU5FWFQ6ICAgODogZGVsZXRlIFtdIFtCMS42XQorLy8gQ0hFQ0stTkVYVDogICAyOiBDRkdOZXdBbGxvY2F0b3IoQSAqKQorLy8gQ0hFQ0stTkVYVDogICAzOiAgKENYWENvbnN0cnVjdEV4cHIsIGNsYXNzIEEpCisvLyBDSEVDSy1ORVhUOiAgIDQ6IG5ldyBBIHt7XFtcW319QjEuMV1dCisvLyBDSEVDSy1ORVhUOiAgIDU6IEEgKmEgPSBuZXcgQSBbNV07CisvLyBDSEVDSy1ORVhUOiAgIDY6IGEKKy8vIENIRUNLLU5FWFQ6ICAgNzogW0IxLjZdIChJbXBsaWNpdENhc3RFeHByLCBMVmFsdWVUb1JWYWx1ZSwgY2xhc3MgQSAqKQorLy8gQ0hFQ0stTkVYVDogICA4OiBbQjEuN10tPn5BKCkgKEltcGxpY2l0IGRlc3RydWN0b3IpCisvLyBDSEVDSy1ORVhUOiAgIDk6IGRlbGV0ZSBbXSBbQjEuN10KIC8vIENIRUNLLU5FWFQ6ICAgUHJlZHMgKDEpOiBCMgogLy8gQ0hFQ0stTkVYVDogICBTdWNjcyAoMSk6IEIwCiAvLyBDSEVDSzogW0IwIChFWElUKV0KQEAgLTE1Nyw3ICsxNjYsNyBAQAogICAgIH5CKCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKICAgfTsKIAotLy8gQ0hFQ0s6IEVOVFJZCisvLyBDSEVDSy1MQUJFTDogaW50IHRlc3QxKGludCAqeCkKIC8vIENIRUNLOiAxOiAxCiAvLyBDSEVDSy1ORVhUOiAyOiByZXR1cm4KIC8vIENIRUNLLU5FWFQ6IH5CKCkgKEltcGxpY2l0IGRlc3RydWN0b3IpCkBAIC0xNjksNyArMTc4LDcgQEAKICAgICAgIHJldHVybiAxOwogICB9CiAKLS8vIENIRUNLOiBFTlRSWQorLy8gQ0hFQ0stTEFCRUw6IGludCB0ZXN0MihpbnQgKngpCiAvLyBDSEVDSzogMTogMQogLy8gQ0hFQ0stTkVYVDogMjogcmV0dXJuCiAvLyBDSEVDSy1ORVhUOiBkZXN0cnVjdG9yCkBAIC0xODEsMyArMTkwLDIxNCBAQAogICAgICAgcmV0dXJuIDE7CiAgIH0KIH0KKworLy8gVGVzdCBDRkcgc3VwcG9ydCBmb3IgImV4dGVuZGluZyIgYW4gZW51bS4KKy8vIENIRUNLLUxBQkVMOiBpbnQgdGVzdF9lbnVtX3dpdGhfZXh0ZW5zaW9uKGVudW0gTXlFbnVtIHZhbHVlKQorLy8gQ0hFQ0s6ICBbQjcgKEVOVFJZKV0KKy8vIENIRUNLLU5FWFQ6ICAgIFN1Y2NzICgxKTogQjIKKy8vIENIRUNLOiAgW0IxXQorLy8gQ0hFQ0stTkVYVDogICAgMTogeAorLy8gQ0hFQ0stTkVYVDogICAgMjogW0IxLjFdIChJbXBsaWNpdENhc3RFeHByLCBMVmFsdWVUb1JWYWx1ZSwgaW50KQorLy8gQ0hFQ0stTkVYVDogICAgMzogcmV0dXJuIFtCMS4yXTsKKy8vIENIRUNLLU5FWFQ6ICAgIFByZWRzICg1KTogQjMgQjQgQjUgQjYgQjIoVW5yZWFjaGFibGUpCisvLyBDSEVDSy1ORVhUOiAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogIFtCMl0KKy8vIENIRUNLLU5FWFQ6ICAgIDE6IDAKKy8vIENIRUNLLU5FWFQ6ICAgIDI6IGludCB4ID0gMDsKKy8vIENIRUNLLU5FWFQ6ICAgIDM6IHZhbHVlCisvLyBDSEVDSy1ORVhUOiAgICA0OiBbQjIuM10gKEltcGxpY2l0Q2FzdEV4cHIsIExWYWx1ZVRvUlZhbHVlLCBlbnVtIE15RW51bSkKKy8vIENIRUNLLU5FWFQ6ICAgIDU6IFtCMi40XSAoSW1wbGljaXRDYXN0RXhwciwgSW50ZWdyYWxDYXN0LCBpbnQpCisvLyBDSEVDSy1ORVhUOiAgICBUOiBzd2l0Y2ggW0IyLjVdCisvLyBDSEVDSy1ORVhUOiAgICBQcmVkcyAoMSk6IEI3CisvLyBDSEVDSy1ORVhUOiAgICBTdWNjcyAoNSk6IEIzIEI0IEI1IEI2IEIxKFVucmVhY2hhYmxlKQorLy8gQ0hFQ0s6ICBbQjNdCisvLyBDSEVDSy1ORVhUOiAgIGNhc2UgRDoKKy8vIENIRUNLLU5FWFQ6ICAgIDE6IDQKKy8vIENIRUNLLU5FWFQ6ICAgIDI6IHgKKy8vIENIRUNLLU5FWFQ6ICAgIDM6IFtCMy4yXSA9IFtCMy4xXQorLy8gQ0hFQ0stTkVYVDogICAgVDogYnJlYWs7CisvLyBDSEVDSy1ORVhUOiAgICBQcmVkcyAoMSk6IEIyCisvLyBDSEVDSy1ORVhUOiAgICBTdWNjcyAoMSk6IEIxCisvLyBDSEVDSzogIFtCNF0KKy8vIENIRUNLLU5FWFQ6ICAgY2FzZSBDOgorLy8gQ0hFQ0stTkVYVDogICAgMTogMworLy8gQ0hFQ0stTkVYVDogICAgMjogeAorLy8gQ0hFQ0stTkVYVDogICAgMzogW0I0LjJdID0gW0I0LjFdCisvLyBDSEVDSy1ORVhUOiAgICBUOiBicmVhazsKKy8vIENIRUNLLU5FWFQ6ICAgIFByZWRzICgxKTogQjIKKy8vIENIRUNLLU5FWFQ6ICAgIFN1Y2NzICgxKTogQjEKKy8vIENIRUNLOiAgW0I1XQorLy8gQ0hFQ0stTkVYVDogICBjYXNlIEI6CisvLyBDSEVDSy1ORVhUOiAgICAxOiAyCisvLyBDSEVDSy1ORVhUOiAgICAyOiB4CisvLyBDSEVDSy1ORVhUOiAgICAzOiBbQjUuMl0gPSBbQjUuMV0KKy8vIENIRUNLLU5FWFQ6ICAgIFQ6IGJyZWFrOworLy8gQ0hFQ0stTkVYVDogICAgUHJlZHMgKDEpOiBCMgorLy8gQ0hFQ0stTkVYVDogICAgU3VjY3MgKDEpOiBCMQorLy8gQ0hFQ0s6ICBbQjZdCisvLyBDSEVDSy1ORVhUOiAgIGNhc2UgQToKKy8vIENIRUNLLU5FWFQ6ICAgIDE6IDEKKy8vIENIRUNLLU5FWFQ6ICAgIDI6IHgKKy8vIENIRUNLLU5FWFQ6ICAgIDM6IFtCNi4yXSA9IFtCNi4xXQorLy8gQ0hFQ0stTkVYVDogICAgVDogYnJlYWs7CisvLyBDSEVDSy1ORVhUOiAgICBQcmVkcyAoMSk6IEIyCisvLyBDSEVDSy1ORVhUOiAgICBTdWNjcyAoMSk6IEIxCisvLyBDSEVDSzogIFtCMCAoRVhJVCldCisvLyBDSEVDSy1ORVhUOiAgICBQcmVkcyAoMSk6IEIxCitlbnVtIE15RW51bSB7IEEsIEIsIEMgfTsKK3N0YXRpYyBjb25zdCBlbnVtIE15RW51bSBEID0gKGVudW0gTXlFbnVtKSAzMjsKKworaW50IHRlc3RfZW51bV93aXRoX2V4dGVuc2lvbihlbnVtIE15RW51bSB2YWx1ZSkgeworICBpbnQgeCA9IDA7CisgIHN3aXRjaCAodmFsdWUpIHsKKyAgICBjYXNlIEE6IHggPSAxOyBicmVhazsKKyAgICBjYXNlIEI6IHggPSAyOyBicmVhazsKKyAgICBjYXNlIEM6IHggPSAzOyBicmVhazsKKyAgICBjYXNlIEQ6IHggPSA0OyBicmVhazsKKyAgfQorICByZXR1cm4geDsKK30KKworLy8gQ0hFQ0stTEFCRUw6IGludCB0ZXN0X2VudW1fd2l0aF9leHRlbnNpb25fZGVmYXVsdChlbnVtIE15RW51bSB2YWx1ZSkKKy8vIENIRUNLOiAgW0I3IChFTlRSWSldCisvLyBDSEVDSy1ORVhUOiAgICBTdWNjcyAoMSk6IEIyCisvLyBDSEVDSzogIFtCMV0KKy8vIENIRUNLLU5FWFQ6ICAgIDE6IHgKKy8vIENIRUNLLU5FWFQ6ICAgIDI6IFtCMS4xXSAoSW1wbGljaXRDYXN0RXhwciwgTFZhbHVlVG9SVmFsdWUsIGludCkKKy8vIENIRUNLLU5FWFQ6ICAgIDM6IHJldHVybiBbQjEuMl07CisvLyBDSEVDSy1ORVhUOiAgICBQcmVkcyAoNCk6IEIzIEI0IEI1IEI2CisvLyBDSEVDSy1ORVhUOiAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogIFtCMl0KKy8vIENIRUNLLU5FWFQ6ICAgIDE6IDAKKy8vIENIRUNLLU5FWFQ6ICAgIDI6IGludCB4ID0gMDsKKy8vIENIRUNLLU5FWFQ6ICAgIDM6IHZhbHVlCisvLyBDSEVDSy1ORVhUOiAgICA0OiBbQjIuM10gKEltcGxpY2l0Q2FzdEV4cHIsIExWYWx1ZVRvUlZhbHVlLCBlbnVtIE15RW51bSkKKy8vIENIRUNLLU5FWFQ6ICAgIDU6IFtCMi40XSAoSW1wbGljaXRDYXN0RXhwciwgSW50ZWdyYWxDYXN0LCBpbnQpCisvLyBDSEVDSy1ORVhUOiAgICBUOiBzd2l0Y2ggW0IyLjVdCisvLyBDSEVDSy1ORVhUOiAgICBQcmVkcyAoMSk6IEI3CisvLyBDSEVDSy1ORVhUOiAgICBTdWNjcyAoNCk6IEI0IEI1IEI2IEIzKFVucmVhY2hhYmxlKQorLy8gQ0hFQ0s6ICBbQjNdCisvLyBDSEVDSy1ORVhUOiAgIGRlZmF1bHQ6CisvLyBDSEVDSy1ORVhUOiAgICAxOiA0CisvLyBDSEVDSy1ORVhUOiAgICAyOiB4CisvLyBDSEVDSy1ORVhUOiAgICAzOiBbQjMuMl0gPSBbQjMuMV0KKy8vIENIRUNLLU5FWFQ6ICAgIFQ6IGJyZWFrOworLy8gQ0hFQ0stTkVYVDogICAgUHJlZHMgKDEpOiBCMihVbnJlYWNoYWJsZSkKKy8vIENIRUNLLU5FWFQ6ICAgIFN1Y2NzICgxKTogQjEKKy8vIENIRUNLOiAgW0I0XQorLy8gQ0hFQ0stTkVYVDogICBjYXNlIEM6CisvLyBDSEVDSy1ORVhUOiAgICAxOiAzCisvLyBDSEVDSy1ORVhUOiAgICAyOiB4CisvLyBDSEVDSy1ORVhUOiAgICAzOiBbQjQuMl0gPSBbQjQuMV0KKy8vIENIRUNLLU5FWFQ6ICAgIFQ6IGJyZWFrOworLy8gQ0hFQ0stTkVYVDogICAgUHJlZHMgKDEpOiBCMgorLy8gQ0hFQ0stTkVYVDogICAgU3VjY3MgKDEpOiBCMQorLy8gQ0hFQ0s6ICBbQjVdCisvLyBDSEVDSy1ORVhUOiAgIGNhc2UgQjoKKy8vIENIRUNLLU5FWFQ6ICAgIDE6IDIKKy8vIENIRUNLLU5FWFQ6ICAgIDI6IHgKKy8vIENIRUNLLU5FWFQ6ICAgIDM6IFtCNS4yXSA9IFtCNS4xXQorLy8gQ0hFQ0stTkVYVDogICAgVDogYnJlYWs7CisvLyBDSEVDSy1ORVhUOiAgICBQcmVkcyAoMSk6IEIyCisvLyBDSEVDSy1ORVhUOiAgICBTdWNjcyAoMSk6IEIxCisvLyBDSEVDSzogIFtCNl0KKy8vIENIRUNLLU5FWFQ6ICAgY2FzZSBBOgorLy8gQ0hFQ0stTkVYVDogICAgMTogMQorLy8gQ0hFQ0stTkVYVDogICAgMjogeAorLy8gQ0hFQ0stTkVYVDogICAgMzogW0I2LjJdID0gW0I2LjFdCisvLyBDSEVDSy1ORVhUOiAgICBUOiBicmVhazsKKy8vIENIRUNLLU5FWFQ6ICAgIFByZWRzICgxKTogQjIKKy8vIENIRUNLLU5FWFQ6ICAgIFN1Y2NzICgxKTogQjEKKy8vIENIRUNLOiAgW0IwIChFWElUKV0KKy8vIENIRUNLLU5FWFQ6ICAgIFByZWRzICgxKTogQjEKK2ludCB0ZXN0X2VudW1fd2l0aF9leHRlbnNpb25fZGVmYXVsdChlbnVtIE15RW51bSB2YWx1ZSkgeworICBpbnQgeCA9IDA7CisgIHN3aXRjaCAodmFsdWUpIHsKKyAgICBjYXNlIEE6IHggPSAxOyBicmVhazsKKyAgICBjYXNlIEI6IHggPSAyOyBicmVhazsKKyAgICBjYXNlIEM6IHggPSAzOyBicmVhazsKKyAgICBkZWZhdWx0OiB4ID0gNDsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHg7Cit9CisKKworLy8gQ0hFQ0stTEFCRUw6IHZvaWQgdGVzdF9wbGFjZW1lbnRfbmV3KCkKKy8vIENIRUNLOiAgW0IyIChFTlRSWSldCisvLyBDSEVDSy1ORVhUOiAgU3VjY3MgKDEpOiBCMQorLy8gQ0hFQ0s6ICBbQjFdCisvLyBDSEVDSy1ORVhUOiAgMTogaW50IGJ1ZmZlclsxNl07CisvLyBDSEVDSy1ORVhUOiAgMjogYnVmZmVyCisvLyBDSEVDSy1ORVhUOiAgMzogW0IxLjJdIChJbXBsaWNpdENhc3RFeHByLCBBcnJheVRvUG9pbnRlckRlY2F5LCBpbnQgKikKKy8vIENIRUNLLU5FWFQ6ICA0OiBbQjEuM10gKEltcGxpY2l0Q2FzdEV4cHIsIEJpdENhc3QsIHZvaWQgKikKKy8vIENIRUNLLU5FWFQ6ICA1OiBDRkdOZXdBbGxvY2F0b3IoTXlDbGFzcyAqKQorLy8gQ0hFQ0stTkVYVDogIDY6ICAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgTXlDbGFzcykKKy8vIENIRUNLLU5FWFQ6ICA3OiBuZXcgKFtCMS40XSkgTXlDbGFzcyhbQjEuNl0pCisvLyBDSEVDSy1ORVhUOiAgODogTXlDbGFzcyAqb2JqID0gbmV3IChidWZmZXIpIE15Q2xhc3MoKTsKKy8vIENIRUNLLU5FWFQ6ICBQcmVkcyAoMSk6IEIyCisvLyBDSEVDSy1ORVhUOiAgU3VjY3MgKDEpOiBCMAorLy8gQ0hFQ0s6IFtCMCAoRVhJVCldCisvLyBDSEVDSy1ORVhUOiAgUHJlZHMgKDEpOiBCMQorCitleHRlcm4gdm9pZCogb3BlcmF0b3IgbmV3ICh1bnNpZ25lZCBsb25nIHN6LCB2b2lkKiB2KTsKK2V4dGVybiB2b2lkKiBvcGVyYXRvciBuZXdbXSAodW5zaWduZWQgbG9uZyBzeiwgdm9pZCogcHRyKTsKKworY2xhc3MgTXlDbGFzcyB7CitwdWJsaWM6CisgIE15Q2xhc3MoKSB7fQorICB+TXlDbGFzcygpIHt9Cit9OworCit2b2lkIHRlc3RfcGxhY2VtZW50X25ldygpIHsKKyAgaW50IGJ1ZmZlclsxNl07CisgIE15Q2xhc3MqIG9iaiA9IG5ldyAoYnVmZmVyKSBNeUNsYXNzKCk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB2b2lkIHRlc3RfcGxhY2VtZW50X25ld19hcnJheSgpCisvLyBDSEVDSzogIFtCMiAoRU5UUlkpXQorLy8gQ0hFQ0stTkVYVDogIFN1Y2NzICgxKTogQjEKKy8vIENIRUNLOiBbQjFdCisvLyBDSEVDSy1ORVhUOiAgMTogaW50IGJ1ZmZlclsxNl07CisvLyBDSEVDSy1ORVhUOiAgMjogYnVmZmVyCisvLyBDSEVDSy1ORVhUOiAgMzogW0IxLjJdIChJbXBsaWNpdENhc3RFeHByLCBBcnJheVRvUG9pbnRlckRlY2F5LCBpbnQgKikKKy8vIENIRUNLLU5FWFQ6ICA0OiBbQjEuM10gKEltcGxpY2l0Q2FzdEV4cHIsIEJpdENhc3QsIHZvaWQgKikKKy8vIENIRUNLLU5FWFQ6ICA1OiA1CisvLyBDSEVDSy1ORVhUOiAgNjogQ0ZHTmV3QWxsb2NhdG9yKE15Q2xhc3MgKikKKy8vIENIRUNLLU5FWFQ6ICA3OiAgKENYWENvbnN0cnVjdEV4cHIsIGNsYXNzIE15Q2xhc3MpCisvLyBDSEVDSy1ORVhUOiAgODogbmV3IChbQjEuNF0pIE15Q2xhc3Mge3tcW1xbfX1CMS41XV0KKy8vIENIRUNLLU5FWFQ6ICA5OiBNeUNsYXNzICpvYmogPSBuZXcgKGJ1ZmZlcikgTXlDbGFzcyBbNV07CisvLyBDSEVDSy1ORVhUOiAgUHJlZHMgKDEpOiBCMgorLy8gQ0hFQ0stTkVYVDogIFN1Y2NzICgxKTogQjAKKy8vIENIRUNLOiBbQjAgKEVYSVQpXQorLy8gQ0hFQ0stTkVYVDogIFByZWRzICgxKTogQjEKKwordm9pZCB0ZXN0X3BsYWNlbWVudF9uZXdfYXJyYXkoKSB7CisgIGludCBidWZmZXJbMTZdOworICBNeUNsYXNzKiBvYmogPSBuZXcgKGJ1ZmZlcikgTXlDbGFzc1s1XTsKK30KKworCisvLyBDSEVDSy1MQUJFTDogaW50ICpQUjE4NDcyKCkKKy8vIENIRUNLOiBbQjIgKEVOVFJZKV0KKy8vIENIRUNLLU5FWFQ6ICAgU3VjY3MgKDEpOiBCMQorLy8gQ0hFQ0s6IFtCMV0KKy8vIENIRUNLLU5FWFQ6ICAgMTogMAorLy8gQ0hFQ0stTkVYVDogICAyOiBbQjEuMV0gKEltcGxpY2l0Q2FzdEV4cHIsIE51bGxUb1BvaW50ZXIsIFBSMTg0NzJfdCkKKy8vIENIRUNLLU5FWFQ6ICAgMzogKFBSMTg0NzJfdClbQjEuMl0gKENTdHlsZUNhc3RFeHByLCBOb09wLCBQUjE4NDcyX3QpCisvLyBDSEVDSy1ORVhUOiAgIDQ6IENGR05ld0FsbG9jYXRvcihpbnQgKikKKy8vIENIRUNLLU5FWFQ6ICAgNTogbmV3ICgoW0IxLjNdKSkgaW50CisvLyBDSEVDSy1ORVhUOiAgIDY6IHJldHVybiBbQjEuNV07CisvLyBDSEVDSy1ORVhUOiAgIFByZWRzICgxKTogQjIKKy8vIENIRUNLLU5FWFQ6ICAgU3VjY3MgKDEpOiBCMAorLy8gQ0hFQ0s6IFtCMCAoRVhJVCldCisvLyBDSEVDSy1ORVhUOiAgIFByZWRzICgxKTogQjEKKworZXh0ZXJuICJDIiB0eXBlZGVmIGludCAqUFIxODQ3Ml90Owordm9pZCAqb3BlcmF0b3IgbmV3ICh1bnNpZ25lZCBsb25nLCBQUjE4NDcyX3QpOwordGVtcGxhdGUgPGNsYXNzIFQ+IFQgKlBSMTg0NzIoKSB7CisgIHJldHVybiBuZXcgKCgoUFIxODQ3Ml90KSAwKSkgVDsKK30KK3ZvaWQgUFIxODQ3Ml9oZWxwZXIoKSB7CisgIFBSMTg0NzI8aW50PigpOworfQorCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL2NoZWNrZXItcGx1Z2lucy5jIGIvdGVzdC9BbmFseXNpcy9jaGVja2VyLXBsdWdpbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODgyYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9BbmFseXNpcy9jaGVja2VyLXBsdWdpbnMuYwpAQCAtMCwwICsxLDEwIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWxvYWQgJWxsdm1zaGxpYmRpci9TYW1wbGVBbmFseXplclBsdWdpbiVwbHVnaW5leHQgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9J2V4YW1wbGUuTWFpbkNhbGxDaGVja2VyJyAtdmVyaWZ5ICVzCisvLyBSRVFVSVJFUzogcGx1Z2lucywgZXhhbXBsZXMKKworLy8gVGVzdCB0aGF0IHRoZSBNYWluQ2FsbENoZWNrZXIgZXhhbXBsZSBhbmFseXplciBwbHVnaW4gbG9hZHMgYW5kIHJ1bnMuCisKK2ludCBtYWluKCk7CisKK3ZvaWQgY2FsbGVyKCkgeworICBtYWluKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsIHRvIG1haW59fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9kZWFkLXN0b3Jlcy5jIGIvdGVzdC9BbmFseXNpcy9kZWFkLXN0b3Jlcy5jCmluZGV4IDA2N2EwNTAuLjViMmMyYTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvZGVhZC1zdG9yZXMuYworKysgYi90ZXN0L0FuYWx5c2lzL2RlYWQtc3RvcmVzLmMKQEAgLTEsNSArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLVd1bnVzZWQtdmFyaWFibGUgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxkZWFkY29kZS5EZWFkU3RvcmVzLGFscGhhLmRlYWRjb2RlLklkZW1wb3RlbnRPcGVyYXRpb25zIC1mYmxvY2tzIC12ZXJpZnkgLVduby11bnJlYWNoYWJsZS1jb2RlIC1hbmFseXplci1vcHQtYW5hbHl6ZS1uZXN0ZWQtYmxvY2tzICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLVd1bnVzZWQtdmFyaWFibGUgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxkZWFkY29kZS5EZWFkU3RvcmVzLGFscGhhLmRlYWRjb2RlLklkZW1wb3RlbnRPcGVyYXRpb25zIC1hbmFseXplci1zdG9yZT1yZWdpb24gLWFuYWx5emVyLWNvbnN0cmFpbnRzPXJhbmdlIC1mYmxvY2tzIC12ZXJpZnkgLVduby11bnJlYWNoYWJsZS1jb2RlIC1hbmFseXplci1vcHQtYW5hbHl6ZS1uZXN0ZWQtYmxvY2tzICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLVd1bnVzZWQtdmFyaWFibGUgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxkZWFkY29kZS5EZWFkU3RvcmVzIC1mYmxvY2tzIC12ZXJpZnkgLVduby11bnJlYWNoYWJsZS1jb2RlIC1hbmFseXplci1vcHQtYW5hbHl6ZS1uZXN0ZWQtYmxvY2tzICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLVd1bnVzZWQtdmFyaWFibGUgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxkZWFkY29kZS5EZWFkU3RvcmVzIC1hbmFseXplci1zdG9yZT1yZWdpb24gLWFuYWx5emVyLWNvbnN0cmFpbnRzPXJhbmdlIC1mYmxvY2tzIC12ZXJpZnkgLVduby11bnJlYWNoYWJsZS1jb2RlIC1hbmFseXplci1vcHQtYW5hbHl6ZS1uZXN0ZWQtYmxvY2tzICVzCiAKIHZvaWQgZjEoKSB7CiAgIGludCBrLCB5OyAvLyBleHBlY3RlZC13YXJuaW5ne3t1bnVzZWQgdmFyaWFibGUgJ2snfX0gZXhwZWN0ZWQtd2FybmluZ3t7dW51c2VkIHZhcmlhYmxlICd5J319CkBAIC0xNTIsNyArMTUyLDcgQEAKIC8vIHRvIHNlZSBhIHJlYWwgYnVnIGluIHRoaXMgc2NlbmFyaW8uCiBpbnQgZjE2KGludCB4KSB7CiAgIHggPSB4ICogMjsKLSAgeCA9IHNpemVvZihpbnQgW3ggPSAoeCB8fCB4ICsgMSkgKiAyXSkgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VGhlIGxlZnQgb3BlcmFuZCB0byAnKycgaXMgYWx3YXlzIDB9fSBleHBlY3RlZC13YXJuaW5ne3tUaGUgbGVmdCBvcGVyYW5kIHRvICcqJyBpcyBhbHdheXMgMX19CisgIHggPSBzaXplb2YoaW50IFt4ID0gKHggfHwgeCArIDEpICogMl0pCiAgICAgICA/IDUgOiA4OwogICByZXR1cm4geDsKIH0KQEAgLTQ4MCwxMSArNDgwLDExIEBACiAvLyBwbGFjZWQgd2l0aGluIHRoZSBpbmNyZW1lbnQgY29kZSBvZiBmb3IgbG9vcHMuCiB2b2lkIHJkYXI4MDE0MzM1KCkgewogICBmb3IgKGludCBpID0gMCA7IGkgIT0gMTAgOyAoeyBicmVhazsgfSkpIHsKLSAgICBmb3IgKCA7IDsgKHsgKytpOyBicmVhazsgfSkpIDsKKyAgICBmb3IgKCA7IDsgKHsgKytpOyBicmVhazsgfSkpIDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydicmVhaycgaXMgYm91bmQgdG8gY3VycmVudCBsb29wLCBHQ0MgYmluZHMgaXQgdG8gdGhlIGVuY2xvc2luZyBsb29wfX0KICAgICAvLyBOb3RlIHRoYXQgdGhlIG5leHQgdmFsdWUgc3RvcmVkIHRvICdpJyBpcyBuZXZlciBleGVjdXRlZAogICAgIC8vIGJlY2F1c2UgdGhlIG5leHQgc3RhdGVtZW50IHRvIGJlIGV4ZWN1dGVkIGlzIHRoZSAnYnJlYWsnCiAgICAgLy8gaW4gdGhlIGluY3JlbWVudCBjb2RlIG9mIHRoZSBmaXJzdCBsb29wLgotICAgIGkgPSBpICogMzsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VmFsdWUgc3RvcmVkIHRvICdpJyBpcyBuZXZlciByZWFkfX0gZXhwZWN0ZWQtd2FybmluZ3t7VGhlIGxlZnQgb3BlcmFuZCB0byAnKicgaXMgYWx3YXlzIDF9fQorICAgIGkgPSBpICogMzsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VmFsdWUgc3RvcmVkIHRvICdpJyBpcyBuZXZlciByZWFkfX0KICAgfQogfQogCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL2RlYWQtc3RvcmVzLm0gYi90ZXN0L0FuYWx5c2lzL2RlYWQtc3RvcmVzLm0KaW5kZXggNWE4MDdlZC4uMTNiMjhkYyAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9kZWFkLXN0b3Jlcy5tCisrKyBiL3Rlc3QvQW5hbHlzaXMvZGVhZC1zdG9yZXMubQpAQCAtMTA5LDMgKzEwOSwxMSBAQAogICAgIHJldHVybiB3cDsKIH0KIEBlbmQKKworaWQgdGVzdF9vYmpjX3ByZWNpc2VfbGlmZXRpbWVfZm9vKCk7Cit2b2lkIHRlc3Rfb2JqY19wcmVjaXNlX2xpZmV0aW1lKCkgeworICBfX2F0dHJpYnV0ZV9fKChvYmpjX3ByZWNpc2VfbGlmZXRpbWUpKSBpZCBkZWFkID0gdGVzdF9vYmpjX3ByZWNpc2VfbGlmZXRpbWVfZm9vKCk7IC8vIG5vLXdhcm5pbmcKKyAgZGVhZCA9IDA7CisgIGRlYWQgPSB0ZXN0X29iamNfcHJlY2lzZV9saWZldGltZV9mb28oKTsgLy8gbm8td2FybmluZworICBkZWFkID0gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvZGVmYXVsdC1hbmFseXplLm0gYi90ZXN0L0FuYWx5c2lzL2RlZmF1bHQtYW5hbHl6ZS5tCmluZGV4IDgyNjU2YjIuLjVmYmFhMmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvZGVmYXVsdC1hbmFseXplLm0KKysrIGIvdGVzdC9BbmFseXNpcy9kZWZhdWx0LWFuYWx5emUubQpAQCAtMTEsNyArMTEsNyBAQAogICAgIHRpdGxlID0gQCJiYXIiOwogICAgIGJyZWFrOwogICBkZWZhdWx0OgotICAgIHRpdGxlID0gIkBiYXoiOworICAgIHRpdGxlID0gQCJiYXoiOwogICAgIGJyZWFrOwogICB9CiAgIHJldHVybiB0aXRsZTsKZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvZHRvci1jeHgxMS5jcHAgYi90ZXN0L0FuYWx5c2lzL2R0b3ItY3h4MTEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMmU4N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0FuYWx5c2lzL2R0b3ItY3h4MTEuY3BwCkBAIC0wLDAgKzEsMTUgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtc3RkPWMrKzExIC1hbmFseXplci1jaGVja2VyPWNvcmUsdW5peC5NYWxsb2MsZGVidWcuRXhwckluc3BlY3Rpb24gLWFuYWx5emVyLWNvbmZpZyBjZmctdGVtcG9yYXJ5LWR0b3JzPXRydWUgLVduby1udWxsLWRlcmVmZXJlbmNlIC12ZXJpZnkgJXMKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisKKyNpbmNsdWRlICJJbnB1dHMvc3lzdGVtLWhlYWRlci1zaW11bGF0b3ItY3h4LmgiCisKK25hbWVzcGFjZSBDeHgxMUJyYWNlSW5pdCB7CisgIHN0cnVjdCBGb28geworICAgIH5Gb28oKSB7fQorICB9OworCisgIHZvaWQgdGVzdEluaXRpYWxpemVyTGlzdCgpIHsKKyAgICBmb3IgKEZvbyBmb28gOiB7Rm9vKCksIEZvbygpfSkge30KKyAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL2R0b3IuY3BwIGIvdGVzdC9BbmFseXNpcy9kdG9yLmNwcAppbmRleCAxMWNlMGQ1Li5kYmI5NTBlIDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL2R0b3IuY3BwCisrKyBiL3Rlc3QvQW5hbHlzaXMvZHRvci5jcHAKQEAgLTM3NCw2ICszNzQsNjQgQEAKICAgICBjbGFuZ19hbmFseXplcl9ldmFsKFNhdmVPbkRlc3RydWN0OjpsYXN0T3V0cHV0ID09IDQyKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19CiAgIH0KIAorICBzdHJ1Y3QgTlJDaGVjayB7CisgICAgYm9vbCBib29sXzsKKyAgICBOUkNoZWNrKCk6Ym9vbF8odHJ1ZSkge30KKyAgICB+TlJDaGVjaygpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGJvb2xfOyB9CisgIH07CisKKyAgc3RydWN0IENoZWNrQXV0b0Rlc3RydWN0b3IgeworICAgIGJvb2wgYm9vbF87CisgICAgQ2hlY2tBdXRvRGVzdHJ1Y3RvcigpOmJvb2xfKHRydWUpIHt9CisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGJvb2xfOyB9CisgIH07CisKKyAgc3RydWN0IENoZWNrQ3VzdG9tRGVzdHJ1Y3RvciB7CisgICAgYm9vbCBib29sXzsKKyAgICBDaGVja0N1c3RvbURlc3RydWN0b3IoKTpib29sXyh0cnVlKSB7fQorICAgIH5DaGVja0N1c3RvbURlc3RydWN0b3IoKTsKKyAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gYm9vbF87IH0KKyAgfTsKKworICBib29sIHRlc3RVbm5hbWVkTlIoKSB7CisgICAgaWYgKE5SQ2hlY2soKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgdGVzdE5hbWVkTlIoKSB7CisgICAgaWYgKE5SQ2hlY2sgYyA9IE5SQ2hlY2soKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgdGVzdFVubmFtZWRBdXRvRGVzdHJ1Y3RvcigpIHsKKyAgICBpZiAoQ2hlY2tBdXRvRGVzdHJ1Y3RvcigpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCB0ZXN0TmFtZWRBdXRvRGVzdHJ1Y3RvcigpIHsKKyAgICBpZiAoQ2hlY2tBdXRvRGVzdHJ1Y3RvciBjID0gQ2hlY2tBdXRvRGVzdHJ1Y3RvcigpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCB0ZXN0VW5uYW1lZEN1c3RvbURlc3RydWN0b3IoKSB7CisgICAgaWYgKENoZWNrQ3VzdG9tRGVzdHJ1Y3RvcigpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVGhpcyBjYXNlIHVzZWQgdG8gY2F1c2UgYW4gdW5leHBlY3RlZCAiVW5kZWZpbmVkIG9yIGdhcmJhZ2UgdmFsdWUgcmV0dXJuZWQKKyAgLy8gdG8gY2FsbGVyIiB3YXJuaW5nCisgIGJvb2wgdGVzdE5hbWVkQ3VzdG9tRGVzdHJ1Y3RvcigpIHsKKyAgICBpZiAoQ2hlY2tDdXN0b21EZXN0cnVjdG9yIGMgPSBDaGVja0N1c3RvbURlc3RydWN0b3IoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIGNsYXNzIFZpcnR1YWxEdG9yQmFzZSB7CiAgIHB1YmxpYzoKICAgICBpbnQgdmFsdWU7CkBAIC00MTYsNiArNDc0LDEyIEBACiAgICAgZigmeCk7CiAgICAgKnggPSA0NzsgLy8gbm8gd2FybmluZwogICB9CisKKyAgdm9pZCBnMihpbnQgKngpIHsKKyAgICBpZiAoISB4KSBOUigpOworICAgIC8vIEZJWE1FOiB0aGlzIHNob3VsZG4ndCBjYXVzZSBhIHdhcm5pbmcuCisgICAgKnggPSA0NzsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7RGVyZWZlcmVuY2Ugb2YgbnVsbCBwb2ludGVyfX0KKyAgfQogfQogCiBuYW1lc3BhY2UgUHNldWRvRHRvciB7CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL2R5bmFtaWMtY2FzdC5jcHAgYi90ZXN0L0FuYWx5c2lzL2R5bmFtaWMtY2FzdC5jcHAKaW5kZXggNmJiNTcxZC4uYjQ4ZWU1YiAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9keW5hbWljLWNhc3QuY3BwCisrKyBiL3Rlc3QvQW5hbHlzaXMvZHluYW1pYy1jYXN0LmNwcApAQCAtMTY5LDcgKzE2OSw3IEBACiAgIHJldHVybiAqcmVzOyAvLyBubyB3YXJuaW5nCiB9CiAKLWludCB0ZXN0UmVmZXJlbmNlU3VjY2VzZnVsQ2FzdCgpIHsKK2ludCB0ZXN0UmVmZXJlbmNlU3VjY2Vzc2Z1bENhc3QoKSB7CiAgIEIgcmI7CiAgIEIgJmIgPSBkeW5hbWljX2Nhc3Q8QiY+KHJiKTsKICAgaW50ICp4ID0gMDsKZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvaWRlbXBvdGVudC1vcGVyYXRpb25zLWxpbWl0ZWQtbG9vcHMuYyBiL3Rlc3QvQW5hbHlzaXMvaWRlbXBvdGVudC1vcGVyYXRpb25zLWxpbWl0ZWQtbG9vcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjNTFjZi4uMDAwMDAwMAotLS0gYS90ZXN0L0FuYWx5c2lzL2lkZW1wb3RlbnQtb3BlcmF0aW9ucy1saW1pdGVkLWxvb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLXN0b3JlPXJlZ2lvbiAtYW5hbHl6ZXItY29uc3RyYWludHM9cmFuZ2UgLWZibG9ja3MgLWFuYWx5emVyLW9wdC1hbmFseXplLW5lc3RlZC1ibG9ja3MgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxhbHBoYS5kZWFkY29kZS5JZGVtcG90ZW50T3BlcmF0aW9ucyAtYW5hbHl6ZXItbWF4LWxvb3AgMyAtdmVyaWZ5ICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLXN0b3JlPXJlZ2lvbiAtYW5hbHl6ZXItY29uc3RyYWludHM9cmFuZ2UgLWZibG9ja3MgLWFuYWx5emVyLW9wdC1hbmFseXplLW5lc3RlZC1ibG9ja3MgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxhbHBoYS5kZWFkY29kZS5JZGVtcG90ZW50T3BlcmF0aW9ucyAtYW5hbHl6ZXItbWF4LWxvb3AgNCAtdmVyaWZ5ICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLXN0b3JlPXJlZ2lvbiAtYW5hbHl6ZXItY29uc3RyYWludHM9cmFuZ2UgLWZibG9ja3MgLWFuYWx5emVyLW9wdC1hbmFseXplLW5lc3RlZC1ibG9ja3MgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxhbHBoYS5kZWFkY29kZS5JZGVtcG90ZW50T3BlcmF0aW9ucyAlcyAtdmVyaWZ5Ci0KLXZvaWQgYWx3YXlzX3dhcm5pbmcoKSB7IGludCAqcCA9IDA7ICpwID0gMHhERUFEQkVFRjsgfSAvLyBleHBlY3RlZC13YXJuaW5ne3tEZXJlZmVyZW5jZSBvZiBudWxsIHBvaW50ZXIgKGxvYWRlZCBmcm9tIHZhcmlhYmxlICdwJyl9fQotCi0vLyBUaGlzIHRlc3QgY2FzZSBwcmV2aW91c2x5IGNhdXNlZCBhIGJvZ3VzIGlkZW1wb3RlbnQgb3BlcmF0aW9uIHdhcm5pbmcKLS8vIGR1ZSB0byB1cyBub3QgcHJvcGVybHkgY3VsbGluZyB3YXJuaW5ncyBkdWUgdG8gaW5jb21wbGV0ZSBhbmFseXNpcyBvZiBsb29wcy4KLWludCBwcjg0MDMoKQotewotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yKGk9MDsgaTwxMDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGo7Ci0gICAgICAgICAgICAgICAgZm9yKGo9MDsgaisxPGk7IGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL2lkZW1wb3RlbnQtb3BlcmF0aW9ucy5jIGIvdGVzdC9BbmFseXNpcy9pZGVtcG90ZW50LW9wZXJhdGlvbnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjOWJjMS4uMDAwMDAwMAotLS0gYS90ZXN0L0FuYWx5c2lzL2lkZW1wb3RlbnQtb3BlcmF0aW9ucy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtV25vLWludC10by1wb2ludGVyLWNhc3QgLWFuYWx5emUgLWFuYWx5emVyLXN0b3JlPXJlZ2lvbiAtYW5hbHl6ZXItY29uc3RyYWludHM9cmFuZ2UgLWZibG9ja3MgLWFuYWx5emVyLW9wdC1hbmFseXplLW5lc3RlZC1ibG9ja3MgLWFuYWx5emVyLWNoZWNrZXI9YWxwaGEuZGVhZGNvZGUuSWRlbXBvdGVudE9wZXJhdGlvbnMgLXZlcmlmeSAlcwotCi0vLyBCYXNpYyB0ZXN0cwotCi1leHRlcm4gdm9pZCB0ZXN0KGludCBpKTsKLWV4dGVybiB2b2lkIHRlc3RfZihmbG9hdCBmKTsKLQotdW5zaWduZWQgYmFzaWMoKSB7Ci0gIGludCB4ID0gMTAsIHplcm8gPSAwLCBvbmUgPSAxOwotCi0gIC8vIHggb3AgeAotICB4ID0geDsgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tBc3NpZ25lZCB2YWx1ZSBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIGV4aXN0aW5nIHZhbHVlfX0KLSAgdGVzdCh4IC0geCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Qm90aCBvcGVyYW5kcyB0byAnLScgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWV9fQotICB4IC09IHg7ICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tCb3RoIG9wZXJhbmRzIHRvICctPScgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWV9fQotICB4ID0gMTA7ICAgICAgIC8vIG5vLXdhcm5pbmcKLSAgdGVzdCh4IC8geCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Qm90aCBvcGVyYW5kcyB0byAnLycgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWV9fQotICB4IC89IHg7ICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tCb3RoIG9wZXJhbmRzIHRvICcvPScgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWV9fQotICB4ID0gMTA7ICAgICAgIC8vIG5vLXdhcm5pbmcKLSAgdGVzdCh4ICYgeCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Qm90aCBvcGVyYW5kcyB0byAnJicgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWV9fQotICB4ICY9IHg7ICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tCb3RoIG9wZXJhbmRzIHRvICcmPScgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWV9fQotICB0ZXN0KHggfCB4KTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tCb3RoIG9wZXJhbmRzIHRvICd8JyBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZX19Ci0gIHggfD0geDsgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0JvdGggb3BlcmFuZHMgdG8gJ3w9JyBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZX19Ci0KLSAgLy8geCBvcCAxCi0gIHRlc3QoeCAqIG9uZSk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7VGhlIHJpZ2h0IG9wZXJhbmQgdG8gJyonIGlzIGFsd2F5cyAxfX0KLSAgeCAqPSBvbmU7ICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tUaGUgcmlnaHQgb3BlcmFuZCB0byAnKj0nIGlzIGFsd2F5cyAxfX0KLSAgdGVzdCh4IC8gb25lKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tUaGUgcmlnaHQgb3BlcmFuZCB0byAnLycgaXMgYWx3YXlzIDF9fQotICB4IC89IG9uZTsgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e1RoZSByaWdodCBvcGVyYW5kIHRvICcvPScgaXMgYWx3YXlzIDF9fQotCi0gIC8vIDEgb3AgeAotICB0ZXN0KG9uZSAqIHgpOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tUaGUgbGVmdCBvcGVyYW5kIHRvICcqJyBpcyBhbHdheXMgMX19Ci0KLSAgLy8geCBvcCAwCi0gIHRlc3QoeCArIHplcm8pOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e1RoZSByaWdodCBvcGVyYW5kIHRvICcrJyBpcyBhbHdheXMgMH19Ci0gIHRlc3QoeCAtIHplcm8pOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e1RoZSByaWdodCBvcGVyYW5kIHRvICctJyBpcyBhbHdheXMgMH19Ci0gIHRlc3QoeCAqIHplcm8pOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e1RoZSByaWdodCBvcGVyYW5kIHRvICcqJyBpcyBhbHdheXMgMH19Ci0gIHRlc3QoeCAmIHplcm8pOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e1RoZSByaWdodCBvcGVyYW5kIHRvICcmJyBpcyBhbHdheXMgMH19Ci0gIHRlc3QoeCB8IHplcm8pOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e1RoZSByaWdodCBvcGVyYW5kIHRvICd8JyBpcyBhbHdheXMgMH19Ci0gIHRlc3QoeCBeIHplcm8pOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e1RoZSByaWdodCBvcGVyYW5kIHRvICdeJyBpcyBhbHdheXMgMH19Ci0gIHRlc3QoeCA8PCB6ZXJvKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e1RoZSByaWdodCBvcGVyYW5kIHRvICc8PCcgaXMgYWx3YXlzIDB9fQotICB0ZXN0KHggPj4gemVybyk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tUaGUgcmlnaHQgb3BlcmFuZCB0byAnPj4nIGlzIGFsd2F5cyAwfX0KLQotICAvLyAwIG9wIHgKLSAgdGVzdCh6ZXJvICsgeCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7VGhlIGxlZnQgb3BlcmFuZCB0byAnKycgaXMgYWx3YXlzIDB9fQotICB0ZXN0KHplcm8gLSB4KTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tUaGUgbGVmdCBvcGVyYW5kIHRvICctJyBpcyBhbHdheXMgMH19Ci0gIHRlc3QoemVybyAvIHgpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e1RoZSBsZWZ0IG9wZXJhbmQgdG8gJy8nIGlzIGFsd2F5cyAwfX0KLSAgdGVzdCh6ZXJvICogeCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7VGhlIGxlZnQgb3BlcmFuZCB0byAnKicgaXMgYWx3YXlzIDB9fQotICB0ZXN0KHplcm8gJiB4KTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tUaGUgbGVmdCBvcGVyYW5kIHRvICcmJyBpcyBhbHdheXMgMH19Ci0gIHRlc3QoemVybyB8IHgpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e1RoZSBsZWZ0IG9wZXJhbmQgdG8gJ3wnIGlzIGFsd2F5cyAwfX0KLSAgdGVzdCh6ZXJvIF4geCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7VGhlIGxlZnQgb3BlcmFuZCB0byAnXicgaXMgYWx3YXlzIDB9fQotICB0ZXN0KHplcm8gPDwgeCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tUaGUgbGVmdCBvcGVyYW5kIHRvICc8PCcgaXMgYWx3YXlzIDB9fQotICB0ZXN0KHplcm8gPj4geCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tUaGUgbGVmdCBvcGVyYW5kIHRvICc+PicgaXMgYWx3YXlzIDB9fQotCi0gIC8vIE92ZXJ3cml0ZSB0aGUgdmFsdWVzIHNvIHRoZXNlIGFyZW4ndCBtYXJrZWQgYXMgUHNldWRvY29uc3RhbnRzCi0gIHggPSAxOwotICB6ZXJvID0gMjsKLSAgb25lID0gMzsKLQotICByZXR1cm4geCArIHplcm8gKyBvbmU7Ci19Ci0KLXZvaWQgZmxvYXRzKGZsb2F0IHgpIHsKLSAgdGVzdF9mKHggKiAxLjApOyAgLy8gbm8td2FybmluZwotICB0ZXN0X2YoeCAqIDEuMEYpOyAvLyBuby13YXJuaW5nCi19Ci0KLS8vIEVuc3VyZSB0aGF0IHdlIGRvbid0IHJlcG9ydCBmYWxzZSBwb2l0aXZlcyBpbiBjb21wbGV4IGxvb3BzCi12b2lkIGJhaWxvdXQoKSB7Ci0gIGludCB1bnVzZWQgPSAwLCByZXN1bHQgPSA0OwotICByZXN1bHQgPSByZXN1bHQ7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tBc3NpZ25lZCB2YWx1ZSBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIGV4aXN0aW5nIHZhbHVlfX0KLQotICBmb3IgKHVuc2lnbmVkIGJnID0gMDsgYmcgPCAxMDI0OyBiZyArKykgewotICAgIHJlc3VsdCA9IGJnICogcmVzdWx0OyAvLyBuby13YXJuaW5nCi0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICB1bnVzZWQgKj0gaTsgLy8gbm8td2FybmluZwotICAgIH0KLSAgfQotfQotCi0vLyBSZWxheGVkIGxpdmVuZXNzIC0gY2hlY2sgdGhhdCB3ZSBkb24ndCBraWxsIGxpdmVuZXNzIGF0IGFzc2lnbm1lbnRzCi10eXBlZGVmIHVuc2lnbmVkIHVpbnRwdHJfdDsKLXZvaWQga2lsbF9hdF9hc3NpZ24oKSB7Ci0gIHNob3J0IGFycmF5WzJdOwotICB1aW50cHRyX3QgeCA9ICh1aW50cHRyX3QpIGFycmF5OwotICBzaG9ydCAqcCA9IChzaG9ydCAqKSB4OwotCi0gIC8vIFRoZSBmb2xsb3dpbmcgYnJhbmNoIHNob3VsZCBiZSBpbmZlYXNpYmxlLgotICBpZiAoIShwID0gJmFycmF5WzBdKSkgeyAvLyBleHBlY3RlZC13YXJuaW5ne3tBc3NpZ25lZCB2YWx1ZSBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIGV4aXN0aW5nIHZhbHVlfX0KLSAgICBwID0gMDsKLSAgICAqcCA9IDE7IC8vIG5vLXdhcm5pbmcKLSAgfQotfQotCi0vLyBGYWxzZSBwb3NpdGl2ZSB0ZXN0cwotCi11bnNpZ25lZCBmYWxzZTEoKSB7Ci0gIGludCBhID0gMTA7Ci0gIHJldHVybiBhICogKDUgLSAyIC0gMyk7IC8vIG5vLXdhcm5pbmcKLX0KLQotZW51bSB0ZXN0ZW51bSB7IGVudW0xID0gMCwgZW51bTIgfTsKLXVuc2lnbmVkIGZhbHNlMigpIHsKLSAgaW50IGEgPSAxMjM0OwotICByZXR1cm4gZW51bTEgKyBhOyAvLyBuby13YXJuaW5nCi19Ci0KLS8vIFNlbGYgYXNzaWdubWVudHMgb2YgdW51c2VkIHZhcmlhYmxlcyBhcmUgY29tbW9uIGZhbHNlIHBvc2l0aXZlcwotdW5zaWduZWQgZmFsc2UzKGludCBwYXJhbSwgaW50IHBhcmFtMikgewotICBwYXJhbSA9IHBhcmFtOyAvLyBuby13YXJuaW5nCi0KLSAgLy8gaWYgYSBzZWxmIGFzc2lnbmVkIHZhcmlhYmxlIGlzIHVzZWQgbGF0ZXIsIHRoZW4gaXQgc2hvdWxkIGJlIHJlcG9ydGVkIHN0aWxsCi0gIHBhcmFtMiA9IHBhcmFtMjsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7QXNzaWduZWQgdmFsdWUgaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBleGlzdGluZyB2YWx1ZX19Ci0KLSAgdW5zaWduZWQgbm9ucGFyYW0gPSA1OwotCi0gIG5vbnBhcmFtID0gbm9ucGFyYW07IC8vIGV4cGVjdGVkLXdhcm5pbmd7e0Fzc2lnbmVkIHZhbHVlIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgZXhpc3RpbmcgdmFsdWV9fQotCi0gIHJldHVybiBwYXJhbTIgKyBub25wYXJhbTsKLX0KLQotLy8gUHNldWRvLWNvbnN0YW50cyAodmFycyBvbmx5IHJlYWQpIGFuZCBjb25zdGFudHMgc2hvdWxkIG5vdCBiZSByZXBvcnRlZAotdW5zaWduZWQgZmFsc2U0KCkgewotICAvLyBUcml2aWFsIGNvbnN0YW50Ci0gIGNvbnN0IGludCBoZWlnaHQgPSAxOwotICBpbnQgYyA9IDQyOwotICB0ZXN0KGhlaWdodCAqIGMpOyAvLyBuby13YXJuaW5nCi0KLSAgLy8gUHNldWRvLWNvbnN0YW50IChuZXZlciBjaGFuZ2VzIGFmdGVyIGRlY2wpCi0gIGludCB3aWR0aCA9IGhlaWdodDsKLQotICByZXR1cm4gd2lkdGggKiAxMDsgLy8gbm8td2FybmluZwotfQotCi0vLyBCbG9jayBwc2V1ZG9jb25zdGFudHMKLXZvaWQgZmFsc2U0YSgpIHsKLSAgLy8gUHNldWRvLWNvbnN0YW50Ci0gIF9fYmxvY2sgaW50IGEgPSAxOwotICBpbnQgYiA9IDEwOwotICBfX2Jsb2NrIGludCBjID0gMDsKLSAgYiAqPSBhOyAvLyBuby13YXJuaW5nCi0KLSAgXnsKLSAgICAvLyBQc3VlZG9jb25zdGFudCBibG9jayB2YXIKLSAgICB0ZXN0KGIgKiBjKTsgLy8gbm8td2FybmluZwotCi0gICAgLy8gTm9uLXBzZXVkb2NvbnN0YW50IGJsb2NrIHZhcgotICAgIGludCBkID0gMDsKLSAgICB0ZXN0KGIgKiBkKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VGhlIHJpZ2h0IG9wZXJhbmQgdG8gJyonIGlzIGFsd2F5cyAwfX0KLSAgICBkID0gNTsKLSAgICB0ZXN0KGQpOwotICB9KCk7Ci0KLSAgdGVzdChhICsgYik7Ci19Ci0KLS8vIFN0YXRpYyB2YXJzIGFyZSBjb21tb24gZmFsc2UgcG9zaXRpdmVzCi1pbnQgZmFsc2U1KCkgewotICBzdGF0aWMgaW50IHRlc3QgPSAwOwotICBpbnQgYSA9IDU2OwotICBhICo9IHRlc3Q7IC8vIG5vLXdhcm5pbmcKLSAgdGVzdCsrOwotICByZXR1cm4gYTsKLX0KLQotLy8gTm9uLWxvY2FsIHN0b3JhZ2UgdmFycyBhcmUgY29uc2lkZXJlZCBmYWxzZSBwb3NpdGl2ZXMKLWludCBnbG9iYWxJbnQgPSAxOwotaW50IGZhbHNlNigpIHsKLSAgaW50IGxvY2FsSW50ID0gMjM7Ci0KLSAgbG9jYWxJbnQgLz0gZ2xvYmFsSW50OwotCi0gIHJldHVybiBsb2NhbEludDsKLX0KLQotLy8gQ2hlY2sgdGhhdCBhc3NpZ25tZW50cyBmaWx0ZXIgb3V0IGZhbHNlIHBvc2l0aXZlcyBjb3JyZWN0bHkKLWludCBmYWxzZTcoKSB7Ci0gIGludCB6ZXJvID0gMDsgLy8gcHNldWRvLWNvbnN0YW50Ci0gIGludCBvbmUgPSAxOwotCi0gIGludCBhID0gNTU7Ci0gIGEgPSBhOyAvLyBleHBlY3RlZC13YXJuaW5ne3tBc3NpZ25lZCB2YWx1ZSBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIGV4aXN0aW5nIHZhbHVlfX0KLSAgYSA9IGVudW0xICogYTsgLy8gbm8td2FybmluZwotCi0gIGludCBiID0gMTIzOwotICBiID0gYjsgLy8gbm8td2FybmluZwotCi0gIHJldHVybiBhOwotfQotCi0vLyBDaGVjayB0cnVuY2F0aW9ucyBkbyBub3QgZmxhZyBhcyBzZWxmLWFzc2lnbm1lbnRzCi12b2lkIGZhbHNlOCgpIHsKLSAgaW50IGEgPSAxMDAwMDAwMDsKLSAgYSA9IChzaG9ydClhOyAvLyBuby13YXJuaW5nCi0gIHRlc3QoYSk7Ci19Ci0KLS8vIFRoaXMgdGVzdCBjYXNlIHByZXZpb3VzbHkgZmxhZ2dlZCBhIHdhcm5pbmcgYXQgJ2IgPT0gYycgYmVjYXVzZSB0aGUKLS8vIGFuYWx5emVyIHByZXZpb3VzbHkgYWxsb3dlZCAnVW5rbm93blZhbCcgYXMgdGhlIGluZGV4IGZvciBFbGVtZW50UmVnaW9ucy4KLXR5cGVkZWYgc3RydWN0IFJEYXI4NDMxNzI4X0YgewotICBpbnQgUkRhcjg0MzE3MjhfQTsKLSAgdW5zaWduZWQgY2hhciAqUkRhcjg0MzE3MjhfQjsKLSAgaW50IFJEYXI4NDMxNzI4X0VbNl07Ci19IFJEYXI4NDMxNzI4X0Q7Ci1zdGF0aWMgaW5saW5lIGludCBSRGFyODQzMTcyOF9DKFJEYXI4NDMxNzI4X0QgKiBzLCBpbnQgbiwKLSAgICB1bnNpZ25lZCBjaGFyICoqUkRhcjg0MzE3MjhfQl9wdHIpIHsKLSAgaW50IHh5LCB3cmFwLCBwcmVkLCBhLCBiLCBjOwotCi0gIHh5ID0gcy0+UkRhcjg0MzE3MjhfRVtuXTsKLSAgd3JhcCA9IHMtPlJEYXI4NDMxNzI4X0E7Ci0KLSAgYSA9IHMtPlJEYXI4NDMxNzI4X0JbeHkgLSAxXTsKLSAgYiA9IHMtPlJEYXI4NDMxNzI4X0JbeHkgLSAxIC0gd3JhcF07Ci0gIGMgPSBzLT5SRGFyODQzMTcyOF9CW3h5IC0gd3JhcF07Ci0KLSAgaWYgKGIgPT0gYykgeyAvLyBuby13YXJuaW5nCi0gICAgcHJlZCA9IGE7Ci0gIH0gZWxzZSB7Ci0gICAgcHJlZCA9IGM7Ci0gIH0KLQotICAqUkRhcjg0MzE3MjhfQl9wdHIgPSAmcy0+UkRhcjg0MzE3MjhfQlt4eV07Ci0KLSAgcmV0dXJuIHByZWQ7Ci19Ci0KLS8vIDxyZGFyOi8vcHJvYmxlbS84NjAxMjQzPiAtIERvbid0IHdhcm4gb24gcG9pbnRlciBhcml0aG1ldGljLiAgVGhpcwotLy8gaXMgb2Z0ZW4gaWRpb21hdGljLgotdW5zaWduZWQgcmRhcjg2MDEyNDNfYXV4KHVuc2lnbmVkIG4pOwotdm9pZCByZGFyODYwMTI0MygpIHsKLSAgY2hhciBhcnJbMTAwXTsKLSAgY2hhciAqc3RhcnQgPSBhcnI7Ci0gIHN0YXJ0ID0gc3RhcnQgKyByZGFyODYwMTI0M19hdXgoc2l6ZW9mKGFycikgLSAoYXJyIC0gc3RhcnQpKTsgLy8gbm8td2FybmluZwotICAodm9pZCkgc3RhcnQ7Ci19Ci0KLQotZmxvYXQgdGVzdEZsb2F0Q2FzdChpbnQgaSkgewotICBmbG9hdCBmID0gaTsKLQotICAvLyBEb24ndCBjcmFzaCB3aGVuIHRyeWluZyB0byBjcmVhdGUgYSAiemVybyIgZmxvYXQuCi0gIHJldHVybiBmIC0gZjsKLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9pZGVtcG90ZW50LW9wZXJhdGlvbnMuY3BwIGIvdGVzdC9BbmFseXNpcy9pZGVtcG90ZW50LW9wZXJhdGlvbnMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjYzNjY1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvQW5hbHlzaXMvaWRlbXBvdGVudC1vcGVyYXRpb25zLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtYW5hbHl6ZXItc3RvcmU9cmVnaW9uIC1hbmFseXplci1jb25zdHJhaW50cz1yYW5nZSAtZmJsb2NrcyAtYW5hbHl6ZXItb3B0LWFuYWx5emUtbmVzdGVkLWJsb2NrcyAtYW5hbHl6ZXItY2hlY2tlcj1hbHBoYS5kZWFkY29kZS5JZGVtcG90ZW50T3BlcmF0aW9ucyAtdmVyaWZ5ICVzCi0KLS8vIEMrKyBzcGVjaWZpYyBmYWxzZSBwb3NpdGl2ZXMKLQotZXh0ZXJuIHZvaWQgdGVzdChpbnQgaSk7Ci1leHRlcm4gdm9pZCB0ZXN0X3JlZihpbnQgJmkpOwotCi0vLyBUZXN0IHJlZmVyZW5jZXMgYWZmZWN0aW5nIHBzZXVkb2NvbnN0YW50cwotdm9pZCBmYWxzZTEoKSB7Ci0gIGludCBhID0gMDsKLSAgaW50IGZpdmUgPSA1OwotICBpbnQgJmIgPSBhOwotICAgdGVzdChmaXZlICogYSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tUaGUgcmlnaHQgb3BlcmFuZCB0byAnKicgaXMgYWx3YXlzIDB9fQotICAgYiA9IDQ7Ci19Ci0KLS8vIFRlc3Qgbm90IGZsYWdnaW5nIGlkZW1wb3RlbnQgb3BlcmF0aW9ucyBiZWNhdXNlIHdlIGFib3J0ZWQgdGhlIGFuYWx5c2lzCi0vLyBvZiBhIHBhdGggYmVjYXVzZSBvZiBhbiB1bnN1cHBvcnRlZCBjb25zdHJ1Y3QuCi1zdHJ1Y3QgUkRhcjkyMTkxNDNfRm9vIHsKLSAgflJEYXI5MjE5MTQzX0ZvbygpOwotICBvcGVyYXRvciBib29sKCkgY29uc3Q7Ci19OwotCi1SRGFyOTIxOTE0M19Gb28gZm9vKCk7Ci11bnNpZ25lZCBSRGFyOTIxOTE0M19iYXIoKTsKLXZvaWQgUkRhcjkyMTkxNDNfdGVzdCgpIHsKLSAgdW5zaWduZWQgaSwgZTsKLSAgZm9yIChpID0gMCwgZSA9IFJEYXI5MjE5MTQzX2JhcigpOyBpICE9IGU7ICsraSkKLSAgICBpZiAoZm9vKCkpCi0gICAgICBicmVhazsgIAotICBpZiAoaSA9PSBlKSAvLyBuby13YXJuaW5nCi0gICAgcmV0dXJuOwotfQotCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL2lkZW1wb3RlbnQtb3BlcmF0aW9ucy5tIGIvdGVzdC9BbmFseXNpcy9pZGVtcG90ZW50LW9wZXJhdGlvbnMubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2Mzc2ZC4uMDAwMDAwMAotLS0gYS90ZXN0L0FuYWx5c2lzL2lkZW1wb3RlbnQtb3BlcmF0aW9ucy5tCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1zdG9yZT1yZWdpb24gLWFuYWx5emVyLWNvbnN0cmFpbnRzPXJhbmdlIC1mYmxvY2tzIC1hbmFseXplci1vcHQtYW5hbHl6ZS1uZXN0ZWQtYmxvY2tzIC1hbmFseXplci1jaGVja2VyPWFscGhhLmRlYWRjb2RlLklkZW1wb3RlbnRPcGVyYXRpb25zLG9zeC5jb2NvYS5SZXRhaW5Db3VudCAtdmVyaWZ5ICVzCi0vLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwotCi10eXBlZGVmIHNpZ25lZCBjaGFyIEJPT0w7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgTlNVSW50ZWdlcjsKLXR5cGVkZWYgc3RydWN0IF9OU1pvbmUgTlNab25lOwotQHByb3RvY29sIE5TT2JqZWN0ICAtIChCT09MKWlzRXF1YWw6KGlkKW9iamVjdDsKLUBlbmQKLQotQGludGVyZmFjZSBOU09iamVjdCB7fQotICBAcHJvcGVydHkgaW50IGxvY2tlZDsKLSAgQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TT2JqZWN0ICptZWRpYTsKLUBlbmQKLQotLy8gPHJkYXI6Ly9wcm9ibGVtLzg3MjUwNDE+IC0gRG9uJ3QgZmxhZyBpZGVtcG90ZW50IG9wZXJhdGlvbiB3YXJuaW5ncyB3aGVuCi0vLyBhIG1ldGhvZCBtYXkgaW52YWxpZGF0ZSBhbiBpbnN0YW5jZSB2YXJpYWJsZS4KLUBpbnRlcmZhY2UgUmRhcjg3MjUwNDEgOiBOU09iamVjdCB7Ci0gIGlkIF9hdHRyaWJ1dGU7Ci19Ci0gIC0gKHZvaWQpIG1ldGhvZDI7Ci1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBSZGFyODcyNTA0MQotLSAoQk9PTCkgbWV0aG9kMSB7Ci0gIEJPT0wgbmVlZHNVcGRhdGUgPSAoQk9PTCkwOwotICBpZCBvbGRBdHRyaWJ1dGUgPSBfYXR0cmlidXRlOwotICBbc2VsZiBtZXRob2QyXTsKLSAgbmVlZHNVcGRhdGUgfD0gKF9hdHRyaWJ1dGUgIT0gb2xkQXR0cmlidXRlKTsgLy8gbm8td2FybmluZwotICByZXR1cm4gbmVlZHNVcGRhdGU7Ci19Ci0KLS0gKHZvaWQpIG1ldGhvZDIKLXsKLSAgX2F0dHJpYnV0ZSA9ICgodm9pZCopMCk7Ci19Ci1AZW5kCi0KLS8vIFRlc3QgdGhhdCB0aGUgaWRlbXBvdGVudCBvcGVyYXRpb25zIGNoZWNrZXIgd29ya3MgaW4gdGhlIHByZXNjZW5jZQotLy8gb2YgcHJvcGVydHkgZXhwcmVzc2lvbnMuCi12b2lkIHByOTExNihOU09iamVjdCAqcGxhY2Vob2xkZXIpIHsKLSAgaW50IHggPSBwbGFjZWhvbGRlci5tZWRpYS5sb2NrZWQgPSBwbGFjZWhvbGRlciA/IDEgOiAwOwotfQotCi0vLyA8cmRhcjovL3Byb2JsZW0vOTEzMDIzOT46IFRlc3QgdGhhdCBjYWxsaW5nIHByb3BlcnR5IHNldHRlcnMgZG9lc24ndCAKLS8vIHRyaWdnZXIgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgd2hlbiB0aGUgb2JqZWN0IGlzIG5pbC4KLUBpbnRlcmZhY2UgUkRhcjkxMzAyMzkKLUBwcm9wZXJ0eSAoYXNzaWduKSBpZCBkZWxlZ2F0ZTsKLUBlbmQKLQotdm9pZCB0ZXN0X1JEYXI5MTMwMjM5KFJEYXI5MTMwMjM5ICp4KSB7Ci0gIGlmICh4KQotICAgIHJldHVybjsKLSAgeC5kZWxlZ2F0ZSA9IHg7IC8vIG5vLXdhcm5pbmcKLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9pZGVudGljYWwtZXhwcmVzc2lvbnMuY3BwIGIvdGVzdC9BbmFseXNpcy9pZGVudGljYWwtZXhwcmVzc2lvbnMuY3BwCmluZGV4IDUwZjM0MWQuLjg1ZTMzMjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvaWRlbnRpY2FsLWV4cHJlc3Npb25zLmNwcAorKysgYi90ZXN0L0FuYWx5c2lzL2lkZW50aWNhbC1leHByZXNzaW9ucy5jcHAKQEAgLTIsNiArMiwyMSBAQAogCiAvKiBPbmx5IG9uZSBleHBlY3RlZCB3YXJuaW5nIHBlciBmdW5jdGlvbiBhbGxvd2VkIGF0IHRoZSB2ZXJ5IGVuZC4gKi8KIAoraW50IGZ1bmModm9pZCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBmdW5jMih2b2lkKQoreworICByZXR1cm4gMDsKK30KKworaW50IGZ1bmNQYXJhbShpbnQgYSkKK3sKKyAgcmV0dXJuIDA7Cit9CisKIC8qICchPScgb3BlcmF0b3IqLwogCiAvKiAnIT0nIHdpdGggZmxvYXQgKi8KQEAgLTI5NSw2ICszMTAsMzggQEAKIH0KIC8qICAgZW5kICchPScgaW50KiAgICAgICAgICAqLwogCisvKiAnIT0nIHdpdGggZnVuY3Rpb24qLworCitpbnQgY2hlY2tOb3RFcXVhbFNhbWVGdW5jdGlvbigpIHsKKyAgdW5zaWduZWQgYSA9IDA7CisgIHVuc2lnbmVkIGIgPSAxOworICBpbnQgcmVzID0gKGErZnVuYygpICE9IGErZnVuYygpKTsgIC8vIG5vIHdhcm5pbmcKKyAgcmV0dXJuICgwKTsKK30KKworaW50IGNoZWNrTm90RXF1YWxEaWZmZXJlbnRGdW5jdGlvbigpIHsKKyAgdW5zaWduZWQgYSA9IDA7CisgIHVuc2lnbmVkIGIgPSAxOworICBpbnQgcmVzID0gKGErZnVuYygpICE9IGErZnVuYzIoKSk7ICAvLyBubyB3YXJuaW5nCisgIHJldHVybiAoMCk7Cit9CisKK2ludCBjaGVja05vdEVxdWFsU2FtZUZ1bmN0aW9uU2FtZVBhcmFtKCkgeworICB1bnNpZ25lZCBhID0gMDsKKyAgdW5zaWduZWQgYiA9IDE7CisgIGludCByZXMgPSAoYStmdW5jUGFyYW0oYSkgIT0gYStmdW5jUGFyYW0oYSkpOyAgLy8gbm8gd2FybmluZworICByZXR1cm4gKDApOworfQorCitpbnQgY2hlY2tOb3RFcXVhbFNhbWVGdW5jdGlvbkRpZmZlcmVudFBhcmFtKCkgeworICB1bnNpZ25lZCBhID0gMDsKKyAgdW5zaWduZWQgYiA9IDE7CisgIGludCByZXMgPSAoYStmdW5jUGFyYW0oYSkgIT0gYStmdW5jUGFyYW0oYikpOyAgLy8gbm8gd2FybmluZworICByZXR1cm4gKDApOworfQorCisvKiAgIGVuZCAnIT0nIHdpdGggZnVuY3Rpb24qLworCiAvKiAgIGVuZCAnIT0nICovCiAKIApAQCAtNTI2LDYgKzU3MywzNyBAQAogICByZXR1cm4gKDApOwogfQogCisvKiAnPT0nIHdpdGggZnVuY3Rpb24qLworCitpbnQgY2hlY2tFcXVhbFNhbWVGdW5jdGlvbigpIHsKKyAgdW5zaWduZWQgYSA9IDA7CisgIHVuc2lnbmVkIGIgPSAxOworICBpbnQgcmVzID0gKGErZnVuYygpID09IGErZnVuYygpKTsgIC8vIG5vIHdhcm5pbmcKKyAgcmV0dXJuICgwKTsKK30KKworaW50IGNoZWNrRXF1YWxEaWZmZXJlbnRGdW5jdGlvbigpIHsKKyAgdW5zaWduZWQgYSA9IDA7CisgIHVuc2lnbmVkIGIgPSAxOworICBpbnQgcmVzID0gKGErZnVuYygpID09IGErZnVuYzIoKSk7ICAvLyBubyB3YXJuaW5nCisgIHJldHVybiAoMCk7Cit9CisKK2ludCBjaGVja0VxdWFsU2FtZUZ1bmN0aW9uU2FtZVBhcmFtKCkgeworICB1bnNpZ25lZCBhID0gMDsKKyAgdW5zaWduZWQgYiA9IDE7CisgIGludCByZXMgPSAoYStmdW5jUGFyYW0oYSkgPT0gYStmdW5jUGFyYW0oYSkpOyAgLy8gbm8gd2FybmluZworICByZXR1cm4gKDApOworfQorCitpbnQgY2hlY2tFcXVhbFNhbWVGdW5jdGlvbkRpZmZlcmVudFBhcmFtKCkgeworICB1bnNpZ25lZCBhID0gMDsKKyAgdW5zaWduZWQgYiA9IDE7CisgIGludCByZXMgPSAoYStmdW5jUGFyYW0oYSkgPT0gYStmdW5jUGFyYW0oYikpOyAgLy8gbm8gd2FybmluZworICByZXR1cm4gKDApOworfQorCisvKiAgIGVuZCAnPT0nIHdpdGggZnVuY3Rpb24qLwogCiAvKiAgIGVuZCBFUSBpbnQgICAgICAgICAgKi8KIApAQCAtOTQwLDMgKzEwMTgsNDk2IEBACiAvKiBlbmQgR1Qgd2l0aCBpbnQgKi8KIAogLyogZW5kIEdUICovCisKKworLyogQ2hlY2tpbmcgdXNlIG9mIGlkZW50aWNhbCBleHByZXNzaW9ucyBpbiBjb25kaXRpb25hbCBvcGVyYXRvciovCisKK3Vuc2lnbmVkIHRlc3RfdW5zaWduZWQodW5zaWduZWQgYSkgeworICB1bnNpZ25lZCBiID0gMTsKKyAgYSA9IGEgPiA1ID8gYiA6IGI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiAnOicgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbn19CisgIHJldHVybiBhOworfQorCit2b2lkIHRlc3Rfc2lnbmVkKCkgeworICBpbnQgYSA9IDA7CisgIGEgPSBhID4gNSA/IGEgOiBhOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aWRlbnRpY2FsIGV4cHJlc3Npb25zIG9uIGJvdGggc2lkZXMgb2YgJzonIGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb259fQorfQorCit2b2lkIHRlc3RfYm9vbChib29sIGEpIHsKKyAgYSA9IGEgPiAwID8gYSA6IGE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiAnOicgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbn19Cit9CisKK3ZvaWQgdGVzdF9mbG9hdCgpIHsKKyAgZmxvYXQgYSA9IDA7CisgIGZsb2F0IGIgPSAwOworICBhID0gYSA+IDUgPyBhIDogYTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lkZW50aWNhbCBleHByZXNzaW9ucyBvbiBib3RoIHNpZGVzIG9mICc6JyBpbiBjb25kaXRpb25hbCBleHByZXNzaW9ufX0KK30KKworY29uc3QgY2hhciAqdGVzdF9zdHJpbmcoKSB7CisgIGZsb2F0IGEgPSAwOworICByZXR1cm4gYSA+IDUgPyAiYWJjIiA6ICJhYmMiOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aWRlbnRpY2FsIGV4cHJlc3Npb25zIG9uIGJvdGggc2lkZXMgb2YgJzonIGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb259fQorfQorCit2b2lkIHRlc3RfdW5zaWduZWRfZXhwcigpIHsKKyAgdW5zaWduZWQgYSA9IDA7CisgIHVuc2lnbmVkIGIgPSAwOworICBhID0gYSA+IDUgPyBhK2IgOiBhK2I7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiAnOicgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbn19Cit9CisKK3ZvaWQgdGVzdF9zaWduZWRfZXhwcigpIHsKKyAgaW50IGEgPSAwOworICBpbnQgYiA9IDE7CisgIGEgPSBhID4gNSA/IGErYiA6IGErYjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lkZW50aWNhbCBleHByZXNzaW9ucyBvbiBib3RoIHNpZGVzIG9mICc6JyBpbiBjb25kaXRpb25hbCBleHByZXNzaW9ufX0KK30KKwordm9pZCB0ZXN0X2Jvb2xfZXhwcihib29sIGEpIHsKKyAgYm9vbCBiID0gMDsKKyAgYSA9IGEgPiAwID8gYSYmYiA6IGEmJmI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiAnOicgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbn19Cit9CisKK3ZvaWQgdGVzdF91bnNpZ25lZF9leHByX25lZ2F0aXZlKCkgeworICB1bnNpZ25lZCBhID0gMDsKKyAgdW5zaWduZWQgYiA9IDA7CisgIGEgPSBhID4gNSA/IGErYiA6IGIrYTsgLy8gbm8gd2FybmluZworfQorCit2b2lkIHRlc3Rfc2lnbmVkX2V4cHJfbmVnYXRpdmUoKSB7CisgIGludCBhID0gMDsKKyAgaW50IGIgPSAxOworICBhID0gYSA+IDUgPyBiK2EgOiBhK2I7IC8vIG5vIHdhcm5pbmcKK30KKwordm9pZCB0ZXN0X2Jvb2xfZXhwcl9uZWdhdGl2ZShib29sIGEpIHsKKyAgYm9vbCBiID0gMDsKKyAgYSA9IGEgPiAwID8gYSYmYiA6IGImJmE7IC8vIG5vIHdhcm5pbmcKK30KKwordm9pZCB0ZXN0X2Zsb2F0X2V4cHJfcG9zaXRpdmUoKSB7CisgIGZsb2F0IGEgPSAwOworICBmbG9hdCBiID0gMDsKKyAgYSA9IGEgPiA1ID8gYStiIDogYStiOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aWRlbnRpY2FsIGV4cHJlc3Npb25zIG9uIGJvdGggc2lkZXMgb2YgJzonIGluIGNvbmRpdGlvbmFsIGV4cHJlc3Npb259fQorfQorCit2b2lkIHRlc3RfZXhwcl9wb3NpdGl2ZV9mdW5jKCkgeworICB1bnNpZ25lZCBhID0gMDsKKyAgdW5zaWduZWQgYiA9IDE7CisgIGEgPSBhID4gNSA/IGErZnVuYygpIDogYStmdW5jKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiAnOicgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbn19Cit9CisKK3ZvaWQgdGVzdF9leHByX25lZ2F0aXZlX2Z1bmMoKSB7CisgIHVuc2lnbmVkIGEgPSAwOworICB1bnNpZ25lZCBiID0gMTsKKyAgYSA9IGEgPiA1ID8gYStmdW5jKCkgOiBhK2Z1bmMyKCk7IC8vIG5vIHdhcm5pbmcKK30KKwordm9pZCB0ZXN0X2V4cHJfcG9zaXRpdmVfZnVuY1BhcmFtKCkgeworICB1bnNpZ25lZCBhID0gMDsKKyAgdW5zaWduZWQgYiA9IDE7CisgIGEgPSBhID4gNSA/IGErZnVuY1BhcmFtKGIpIDogYStmdW5jUGFyYW0oYik7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiAnOicgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbn19Cit9CisKK3ZvaWQgdGVzdF9leHByX25lZ2F0aXZlX2Z1bmNQYXJhbSgpIHsKKyAgdW5zaWduZWQgYSA9IDA7CisgIHVuc2lnbmVkIGIgPSAxOworICBhID0gYSA+IDUgPyBhK2Z1bmNQYXJhbShhKSA6IGErZnVuY1BhcmFtKGIpOyAvLyBubyB3YXJuaW5nCit9CisKK3ZvaWQgdGVzdF9leHByX3Bvc2l0aXZlX2luYygpIHsKKyAgdW5zaWduZWQgYSA9IDA7CisgIHVuc2lnbmVkIGIgPSAxOworICBhID0gYSA+IDUgPyBhKysgOiBhKys7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiAnOicgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbn19Cit9CisKK3ZvaWQgdGVzdF9leHByX25lZ2F0aXZlX2luYygpIHsKKyAgdW5zaWduZWQgYSA9IDA7CisgIHVuc2lnbmVkIGIgPSAxOworICBhID0gYSA+IDUgPyBhKysgOiBiKys7IC8vIG5vIHdhcm5pbmcKK30KKwordm9pZCB0ZXN0X2V4cHJfcG9zaXRpdmVfYXNzaWduKCkgeworICB1bnNpZ25lZCBhID0gMDsKKyAgdW5zaWduZWQgYiA9IDE7CisgIGEgPSBhID4gNSA/IGE9MSA6IGE9MTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiAnOicgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbn19Cit9CisKK3ZvaWQgdGVzdF9leHByX25lZ2F0aXZlX2Fzc2lnbigpIHsKKyAgdW5zaWduZWQgYSA9IDA7CisgIHVuc2lnbmVkIGIgPSAxOworICBhID0gYSA+IDUgPyBhPTEgOiBhPTI7IC8vIG5vIHdhcm5pbmcKK30KKwordm9pZCB0ZXN0X3NpZ25lZF9uZXN0ZWRfZXhwcigpIHsKKyAgaW50IGEgPSAwOworICBpbnQgYiA9IDE7CisgIGludCBjID0gMzsKKyAgYSA9IGEgPiA1ID8gYStiKyhjK2EpKihhICsgYiooYythKSkgOiBhK2IrKGMrYSkqKGEgKyBiKihjK2EpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lkZW50aWNhbCBleHByZXNzaW9ucyBvbiBib3RoIHNpZGVzIG9mICc6JyBpbiBjb25kaXRpb25hbCBleHByZXNzaW9ufX0KK30KKwordm9pZCB0ZXN0X3NpZ25lZF9uZXN0ZWRfZXhwcl9uZWdhdGl2ZSgpIHsKKyAgaW50IGEgPSAwOworICBpbnQgYiA9IDE7CisgIGludCBjID0gMzsKKyAgYSA9IGEgPiA1ID8gYStiKyhjK2EpKihhICsgYiooYythKSkgOiBhK2IrKGMrYSkqKGEgKyBiKihhK2MpKTsgLy8gbm8gd2FybmluZworfQorCit2b2lkIHRlc3Rfc2lnbmVkX25lc3RlZF9jb25kX2V4cHJfbmVnYXRpdmUoKSB7CisgIGludCBhID0gMDsKKyAgaW50IGIgPSAxOworICBpbnQgYyA9IDM7CisgIGEgPSBhID4gNSA/IChiID4gNSA/IDEgOiA0KSA6IChiID4gNSA/IDIgOiA0KTsgLy8gbm8gd2FybmluZworfQorCit2b2lkIHRlc3Rfc2lnbmVkX25lc3RlZF9jb25kX2V4cHIoKSB7CisgIGludCBhID0gMDsKKyAgaW50IGIgPSAxOworICBpbnQgYyA9IDM7CisgIGEgPSBhID4gNSA/IChiID4gNSA/IDEgOiA0KSA6IChiID4gNSA/IDQgOiA0KTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lkZW50aWNhbCBleHByZXNzaW9ucyBvbiBib3RoIHNpZGVzIG9mICc6JyBpbiBjb25kaXRpb25hbCBleHByZXNzaW9ufX0KK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9icmFuY2hlczEoYm9vbCBiKSB7CisgIGludCBpID0gMDsKKyAgaWYgKGIpIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3RydWUgYW5kIGZhbHNlIGJyYW5jaGVzIGFyZSBpZGVudGljYWx9fQorICAgICsraTsKKyAgfSBlbHNlIHsKKyAgICArK2k7CisgIH0KK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9icmFuY2hlczIoYm9vbCBiKSB7CisgIGludCBpID0gMDsKKyAgaWYgKGIpIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3RydWUgYW5kIGZhbHNlIGJyYW5jaGVzIGFyZSBpZGVudGljYWx9fQorICAgICsraTsKKyAgfSBlbHNlCisgICAgKytpOworfQorCit2b2lkIHRlc3RfaWRlbnRpY2FsX2JyYW5jaGVzMyhib29sIGIpIHsKKyAgaW50IGkgPSAwOworICBpZiAoYikgeyAvLyBubyB3YXJuaW5nCisgICAgKytpOworICB9IGVsc2UgeworICAgIGkrKzsKKyAgfQorfQorCit2b2lkIHRlc3RfaWRlbnRpY2FsX2JyYW5jaGVzNChib29sIGIpIHsKKyAgaW50IGkgPSAwOworICBpZiAoYikgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dHJ1ZSBhbmQgZmFsc2UgYnJhbmNoZXMgYXJlIGlkZW50aWNhbH19CisgIH0gZWxzZSB7CisgIH0KK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9icmFuY2hlc19icmVhayhib29sIGIpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoYikgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3RydWUgYW5kIGZhbHNlIGJyYW5jaGVzIGFyZSBpZGVudGljYWx9fQorICAgICAgYnJlYWs7CisgICAgZWxzZQorICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9icmFuY2hlc19jb250aW51ZShib29sIGIpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoYikgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3RydWUgYW5kIGZhbHNlIGJyYW5jaGVzIGFyZSBpZGVudGljYWx9fQorICAgICAgY29udGludWU7CisgICAgZWxzZQorICAgICAgY29udGludWU7CisgIH0KK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9icmFuY2hlc19mdW5jKGJvb2wgYikgeworICBpZiAoYikgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3RydWUgYW5kIGZhbHNlIGJyYW5jaGVzIGFyZSBpZGVudGljYWx9fQorICAgIGZ1bmMoKTsKKyAgZWxzZQorICAgIGZ1bmMoKTsKK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9icmFuY2hlc19mdW5jX2FyZ3VtZW50cyhib29sIGIpIHsKKyAgaWYgKGIpIC8vIG5vLXdhcm5pbmcKKyAgICBmdW5jUGFyYW0oMSk7CisgIGVsc2UKKyAgICBmdW5jUGFyYW0oMik7Cit9CisKK3ZvaWQgdGVzdF9pZGVudGljYWxfYnJhbmNoZXNfY2FzdDEoYm9vbCBiKSB7CisgIGxvbmcgdiA9IC03OworICBpZiAoYikgLy8gbm8td2FybmluZworICAgIHYgPSAoc2lnbmVkIGludCkgdjsKKyAgZWxzZQorICAgIHYgPSAodW5zaWduZWQgaW50KSB2OworfQorCit2b2lkIHRlc3RfaWRlbnRpY2FsX2JyYW5jaGVzX2Nhc3QyKGJvb2wgYikgeworICBsb25nIHYgPSAtNzsKKyAgaWYgKGIpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t0cnVlIGFuZCBmYWxzZSBicmFuY2hlcyBhcmUgaWRlbnRpY2FsfX0KKyAgICB2ID0gKHNpZ25lZCBpbnQpIHY7CisgIGVsc2UKKyAgICB2ID0gKHNpZ25lZCBpbnQpIHY7Cit9CisKK2ludCB0ZXN0X2lkZW50aWNhbF9icmFuY2hlc19yZXR1cm5faW50KGJvb2wgYikgeworICBpbnQgaSA9IDA7CisgIGlmIChiKSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t0cnVlIGFuZCBmYWxzZSBicmFuY2hlcyBhcmUgaWRlbnRpY2FsfX0KKyAgICBpKys7CisgICAgcmV0dXJuIGk7CisgIH0gZWxzZSB7CisgICAgaSsrOworICAgIHJldHVybiBpOworICB9Cit9CisKK2ludCB0ZXN0X2lkZW50aWNhbF9icmFuY2hlc19yZXR1cm5fZnVuYyhib29sIGIpIHsKKyAgaWYgKGIpIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3RydWUgYW5kIGZhbHNlIGJyYW5jaGVzIGFyZSBpZGVudGljYWx9fQorICAgIHJldHVybiBmdW5jKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZ1bmMoKTsKKyAgfQorfQorCit2b2lkIHRlc3RfaWRlbnRpY2FsX2JyYW5jaGVzX2Zvcihib29sIGIpIHsKKyAgaW50IGk7CisgIGludCBqOworICBpZiAoYikgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dHJ1ZSBhbmQgZmFsc2UgYnJhbmNoZXMgYXJlIGlkZW50aWNhbH19CisgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCAxMDsgaSsrKQorICAgICAgaiArPSA0OworICB9IGVsc2UgeworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgIGogKz0gNDsKKyAgfQorfQorCit2b2lkIHRlc3RfaWRlbnRpY2FsX2JyYW5jaGVzX3doaWxlKGJvb2wgYikgeworICBpbnQgaSA9IDEwOworICBpZiAoYikgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dHJ1ZSBhbmQgZmFsc2UgYnJhbmNoZXMgYXJlIGlkZW50aWNhbH19CisgICAgd2hpbGUgKGZ1bmMoKSkKKyAgICAgIGktLTsKKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoZnVuYygpKQorICAgICAgaS0tOworICB9Cit9CisKK3ZvaWQgdGVzdF9pZGVudGljYWxfYnJhbmNoZXNfd2hpbGVfMihib29sIGIpIHsKKyAgaW50IGkgPSAxMDsKKyAgaWYgKGIpIHsgLy8gbm8td2FybmluZworICAgIHdoaWxlIChmdW5jKCkpCisgICAgICBpLS07CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKGZ1bmMoKSkKKyAgICAgIGkrKzsKKyAgfQorfQorCit2b2lkIHRlc3RfaWRlbnRpY2FsX2JyYW5jaGVzX2RvX3doaWxlKGJvb2wgYikgeworICBpbnQgaSA9IDEwOworICBpZiAoYikgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dHJ1ZSBhbmQgZmFsc2UgYnJhbmNoZXMgYXJlIGlkZW50aWNhbH19CisgICAgZG8geworICAgICAgaS0tOworICAgIH0gd2hpbGUgKGZ1bmMoKSk7CisgIH0gZWxzZSB7CisgICAgZG8geworICAgICAgaS0tOworICAgIH0gd2hpbGUgKGZ1bmMoKSk7CisgIH0KK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9icmFuY2hlc19pZihib29sIGIsIGludCBpKSB7CisgIGlmIChiKSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t0cnVlIGFuZCBmYWxzZSBicmFuY2hlcyBhcmUgaWRlbnRpY2FsfX0KKyAgICBpZiAoaSA8IDUpCisgICAgICBpICs9IDEwOworICB9IGVsc2UgeworICAgIGlmIChpIDwgNSkKKyAgICAgIGkgKz0gMTA7CisgIH0KK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9iaXR3aXNlMSgpIHsKKyAgaW50IGEgPSA1IHwgNTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lkZW50aWNhbCBleHByZXNzaW9ucyBvbiBib3RoIHNpZGVzIG9mIGJpdHdpc2Ugb3BlcmF0b3J9fQorfQorCit2b2lkIHRlc3RfaWRlbnRpY2FsX2JpdHdpc2UyKCkgeworICBpbnQgYSA9IDU7CisgIGludCBiID0gYSB8IGE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiBiaXR3aXNlIG9wZXJhdG9yfX0KK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9iaXR3aXNlMygpIHsKKyAgaW50IGEgPSA1OworICBpbnQgYiA9IChhIHwgYSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiBiaXR3aXNlIG9wZXJhdG9yfX0KK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9iaXR3aXNlNCgpIHsKKyAgaW50IGEgPSA0OworICBpbnQgYiA9IGEgfCA0OyAvLyBuby13YXJuaW5nCit9CisKK3ZvaWQgdGVzdF9pZGVudGljYWxfYml0d2lzZTUoKSB7CisgIGludCBhID0gNDsKKyAgaW50IGIgPSA0OworICBpbnQgYyA9IGEgfCBiOyAvLyBuby13YXJuaW5nCit9CisKK3ZvaWQgdGVzdF9pZGVudGljYWxfYml0d2lzZTYoKSB7CisgIGludCBhID0gNTsKKyAgaW50IGIgPSBhIHwgNCB8IGE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiBiaXR3aXNlIG9wZXJhdG9yfX0KK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9iaXR3aXNlNygpIHsKKyAgaW50IGEgPSA1OworICBpbnQgYiA9IGZ1bmMoKSB8IGZ1bmMoKTsgLy8gbm8td2FybmluZworfQorCit2b2lkIHRlc3RfaWRlbnRpY2FsX2xvZ2ljYWwxKGludCBhKSB7CisgIGlmIChhID09IDQgJiYgYSA9PSA0KSAvLyBleHBlY3RlZC13YXJuaW5nIHt7aWRlbnRpY2FsIGV4cHJlc3Npb25zIG9uIGJvdGggc2lkZXMgb2YgbG9naWNhbCBvcGVyYXRvcn19CisgICAgOworfQorCit2b2lkIHRlc3RfaWRlbnRpY2FsX2xvZ2ljYWwyKGludCBhKSB7CisgIGlmIChhID09IDQgfHwgYSA9PSA1IHx8IGEgPT0gNCkgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lkZW50aWNhbCBleHByZXNzaW9ucyBvbiBib3RoIHNpZGVzIG9mIGxvZ2ljYWwgb3BlcmF0b3J9fQorICAgIDsKK30KKwordm9pZCB0ZXN0X2lkZW50aWNhbF9sb2dpY2FsMyhpbnQgYSkgeworICBpZiAoYSA9PSA0IHx8IGEgPT0gNSB8fCBhID09IDYpIC8vIG5vLXdhcm5pbmcKKyAgICA7Cit9CisKK3ZvaWQgdGVzdF9pZGVudGljYWxfbG9naWNhbDQoaW50IGEpIHsKKyAgaWYgKGEgPT0gZnVuYygpIHx8IGEgPT0gZnVuYygpKSAvLyBuby13YXJuaW5nCisgICAgOworfQorCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbG9naWNhbC1vcC1wYXJlbnRoZXNlcyIKK3ZvaWQgdGVzdF9pZGVudGljYWxfbG9naWNhbDUoaW50IHgsIGludCB5KSB7CisgIGlmICh4ID09IDQgJiYgeSA9PSA1IHx8IHggPT0gNCAmJiB5ID09IDYpIC8vIG5vLXdhcm5pbmcKKyAgICA7Cit9CisKK3ZvaWQgdGVzdF9pZGVudGljYWxfbG9naWNhbDYoaW50IHgsIGludCB5KSB7CisgIGlmICh4ID09IDQgJiYgeSA9PSA1IHx8IHggPT0gNCAmJiB5ID09IDUpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZGVudGljYWwgZXhwcmVzc2lvbnMgb24gYm90aCBzaWRlcyBvZiBsb2dpY2FsIG9wZXJhdG9yfX0KKyAgICA7Cit9CisKK3ZvaWQgdGVzdF9pZGVudGljYWxfbG9naWNhbDcoaW50IHgsIGludCB5KSB7CisgIC8vIEZJWE1FOiBXZSBzaG91bGQgd2FybiBoZXJlCisgIGlmICh4ID09IDQgJiYgeSA9PSA1IHx8IHggPT0gNCkKKyAgICA7Cit9CisKK3ZvaWQgdGVzdF9pZGVudGljYWxfbG9naWNhbDgoaW50IHgsIGludCB5KSB7CisgIC8vIEZJWE1FOiBXZSBzaG91bGQgd2FybiBoZXJlCisgIGlmICh4ID09IDQgfHwgeSA9PSA1ICYmIHggPT0gNCkKKyAgICA7Cit9CisKK3ZvaWQgdGVzdF9pZGVudGljYWxfbG9naWNhbDkoaW50IHgsIGludCB5KSB7CisgIC8vIEZJWE1FOiBXZSBzaG91bGQgd2FybiBoZXJlCisgIGlmICh4ID09IDQgfHwgeCA9PSA0ICYmIHkgPT0gNSkKKyAgICA7Cit9CisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisKK3ZvaWQgdGVzdF93YXJuX2NoYWluZWRfaWZfc3RtdHNfMShpbnQgeCkgeworICBpZiAoeCA9PSAxKQorICAgIDsKKyAgZWxzZSBpZiAoeCA9PSAxKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwcmVzc2lvbiBpcyBpZGVudGljYWwgdG8gcHJldmlvdXMgY29uZGl0aW9ufX0KKyAgICA7Cit9CisKK3ZvaWQgdGVzdF93YXJuX2NoYWluZWRfaWZfc3RtdHNfMihpbnQgeCkgeworICBpZiAoeCA9PSAxKQorICAgIDsKKyAgZWxzZSBpZiAoeCA9PSAxKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwcmVzc2lvbiBpcyBpZGVudGljYWwgdG8gcHJldmlvdXMgY29uZGl0aW9ufX0KKyAgICA7CisgIGVsc2UgaWYgKHggPT0gMSkgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4cHJlc3Npb24gaXMgaWRlbnRpY2FsIHRvIHByZXZpb3VzIGNvbmRpdGlvbn19CisgICAgOworfQorCit2b2lkIHRlc3Rfd2Fybl9jaGFpbmVkX2lmX3N0bXRzXzMoaW50IHgpIHsKKyAgaWYgKHggPT0gMSkKKyAgICA7CisgIGVsc2UgaWYgKHggPT0gMikKKyAgICA7CisgIGVsc2UgaWYgKHggPT0gMSkgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4cHJlc3Npb24gaXMgaWRlbnRpY2FsIHRvIHByZXZpb3VzIGNvbmRpdGlvbn19CisgICAgOworfQorCit2b2lkIHRlc3Rfd2Fybl9jaGFpbmVkX2lmX3N0bXRzXzQoaW50IHgpIHsKKyAgaWYgKHggPT0gMSkKKyAgICA7CisgIGVsc2UgaWYgKGZ1bmMoKSkKKyAgICA7CisgIGVsc2UgaWYgKHggPT0gMSkgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4cHJlc3Npb24gaXMgaWRlbnRpY2FsIHRvIHByZXZpb3VzIGNvbmRpdGlvbn19CisgICAgOworfQorCit2b2lkIHRlc3Rfd2Fybl9jaGFpbmVkX2lmX3N0bXRzXzUoaW50IHgpIHsKKyAgaWYgKHggJiAxKQorICAgIDsKKyAgZWxzZSBpZiAoeCAmIDEpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHByZXNzaW9uIGlzIGlkZW50aWNhbCB0byBwcmV2aW91cyBjb25kaXRpb259fQorICAgIDsKK30KKwordm9pZCB0ZXN0X3dhcm5fY2hhaW5lZF9pZl9zdG10c182KGludCB4KSB7CisgIGlmICh4ID09IDEpCisgICAgOworICBlbHNlIGlmICh4ID09IDIpCisgICAgOworICBlbHNlIGlmICh4ID09IDIpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHByZXNzaW9uIGlzIGlkZW50aWNhbCB0byBwcmV2aW91cyBjb25kaXRpb259fQorICAgIDsKKyAgZWxzZSBpZiAoeCA9PSAzKQorICAgIDsKK30KKwordm9pZCB0ZXN0X3dhcm5fY2hhaW5lZF9pZl9zdG10c183KGludCB4KSB7CisgIGlmICh4ID09IDEpCisgICAgOworICBlbHNlIGlmICh4ID09IDIpCisgICAgOworICBlbHNlIGlmICh4ID09IDMpCisgICAgOworICBlbHNlIGlmICh4ID09IDIpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHByZXNzaW9uIGlzIGlkZW50aWNhbCB0byBwcmV2aW91cyBjb25kaXRpb259fQorICAgIDsKKyAgZWxzZSBpZiAoeCA9PSA1KQorICAgIDsKK30KKwordm9pZCB0ZXN0X3dhcm5fY2hhaW5lZF9pZl9zdG10c184KGludCB4KSB7CisgIGlmICh4ID09IDEpCisgICAgOworICBlbHNlIGlmICh4ID09IDIpCisgICAgOworICBlbHNlIGlmICh4ID09IDMpCisgICAgOworICBlbHNlIGlmICh4ID09IDIpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHByZXNzaW9uIGlzIGlkZW50aWNhbCB0byBwcmV2aW91cyBjb25kaXRpb259fQorICAgIDsKKyAgZWxzZSBpZiAoeCA9PSA1KQorICAgIDsKKyAgZWxzZSBpZiAoeCA9PSAzKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwcmVzc2lvbiBpcyBpZGVudGljYWwgdG8gcHJldmlvdXMgY29uZGl0aW9ufX0KKyAgICA7CisgIGVsc2UgaWYgKHggPT0gNykKKyAgICA7Cit9CisKK3ZvaWQgdGVzdF9ub3dhcm5fY2hhaW5lZF9pZl9zdG10c18xKGludCB4KSB7CisgIGlmIChmdW5jKCkpCisgICAgOworICBlbHNlIGlmIChmdW5jKCkpIC8vIG5vLXdhcm5pbmcKKyAgICA7Cit9CisKK3ZvaWQgdGVzdF9ub3dhcm5fY2hhaW5lZF9pZl9zdG10c18yKGludCB4KSB7CisgIGlmIChmdW5jKCkpCisgICAgOworICBlbHNlIGlmICh4ID09IDEpCisgICAgOworICBlbHNlIGlmIChmdW5jKCkpIC8vIG5vLXdhcm5pbmcKKyAgICA7Cit9CisKK3ZvaWQgdGVzdF9ub3dhcm5fY2hhaW5lZF9pZl9zdG10c18zKGludCB4KSB7CisgIGlmICh4KyspCisgICAgOworICBlbHNlIGlmICh4KyspIC8vIG5vLXdhcm5pbmcKKyAgICA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL2lubGluZS5jcHAgYi90ZXN0L0FuYWx5c2lzL2lubGluZS5jcHAKaW5kZXggY2ExMjZkZC4uMTgzZGYxNiAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9pbmxpbmUuY3BwCisrKyBiL3Rlc3QvQW5hbHlzaXMvaW5saW5lLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlLHVuaXguTWFsbG9jLGRlYnVnLkV4cHJJbnNwZWN0aW9uIC1hbmFseXplci1jb25maWcgaXBhPWlubGluaW5nIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlLHVuaXguTWFsbG9jLGRlYnVnLkV4cHJJbnNwZWN0aW9uIC1hbmFseXplci1jb25maWcgaXBhPWlubGluaW5nIC1hbmFseXplci1jb25maWcgYysrLWFsbG9jYXRvci1pbmxpbmluZz10cnVlIC12ZXJpZnkgJXMKIAogdm9pZCBjbGFuZ19hbmFseXplcl9ldmFsKGJvb2wpOwogdm9pZCBjbGFuZ19hbmFseXplcl9jaGVja0lubGluZWQoYm9vbCk7CkBAIC05LDYgKzksNyBAQAogLy8gVGhpcyBpcyB0aGUgc3RhbmRhcmQgcGxhY2VtZW50IG5ldy4KIGlubGluZSB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90LCB2b2lkKiBfX3ApIHRocm93KCkKIHsKKyAgY2xhbmdfYW5hbHl6ZXJfY2hlY2tJbmxpbmVkKHRydWUpOy8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQogICByZXR1cm4gX19wOwogfQogCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL2lubGluaW5nL2R5bi1kaXNwYXRjaC1iaWZ1cmNhdGUuY3BwIGIvdGVzdC9BbmFseXNpcy9pbmxpbmluZy9keW4tZGlzcGF0Y2gtYmlmdXJjYXRlLmNwcAppbmRleCBkMjE5NDQ2Li5lMjNkNGUyIDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL2lubGluaW5nL2R5bi1kaXNwYXRjaC1iaWZ1cmNhdGUuY3BwCisrKyBiL3Rlc3QvQW5hbHlzaXMvaW5saW5pbmcvZHluLWRpc3BhdGNoLWJpZnVyY2F0ZS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxkZWJ1Zy5FeHBySW5zcGVjdGlvbiAtYW5hbHl6ZXItY29uZmlnIGlwYT1keW5hbWljLWJpZnVyY2F0ZSAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxkZWJ1Zy5FeHBySW5zcGVjdGlvbiAtYW5hbHl6ZXItY29uZmlnIGlwYT1keW5hbWljLWJpZnVyY2F0ZSAtdmVyaWZ5IC1Xbm8tcmVpbnRlcnByZXQtYmFzZS1jbGFzcyAlcwogCiB2b2lkIGNsYW5nX2FuYWx5emVyX2V2YWwoYm9vbCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvaW5saW5pbmcvcGF0aC1ub3Rlcy5jcHAgYi90ZXN0L0FuYWx5c2lzL2lubGluaW5nL3BhdGgtbm90ZXMuY3BwCmluZGV4IGEzNTRlMTQuLmFmYmRmMjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvaW5saW5pbmcvcGF0aC1ub3Rlcy5jcHAKKysrIGIvdGVzdC9BbmFseXNpcy9pbmxpbmluZy9wYXRoLW5vdGVzLmNwcApAQCAtMTUwNiw3ICsxNTA2LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CkBAIC0xNTM1LDcgKzE1MzUsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KQEAgLTE3ODcsNyArMTc4Nyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9pbmxpbmluZy9zdGwuY3BwIGIvdGVzdC9BbmFseXNpcy9pbmxpbmluZy9zdGwuY3BwCmluZGV4IGMxNTMxNzQuLjcxMWMzMGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvaW5saW5pbmcvc3RsLmNwcAorKysgYi90ZXN0L0FuYWx5c2lzL2lubGluaW5nL3N0bC5jcHAKQEAgLTQyLDMgKzQyLDggQEAKICAgc3RkOjpiYXNpY19zdHJpbmc8Y2hhcjMyX3Q+IHY7CiAgIHYgKz0gJ2MnOyAvLyBuby13YXJuaW5nCiB9CisKK3ZvaWQgdGVzdEJhc2ljU3RyaW5nU3VwcHJlc3Npb25fYXNzaWduKHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXIzMl90PiAmdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXIzMl90PiAmdjIpIHsKKyAgdiA9IHYyOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9rbWFsbG9jLWxpbnV4LmMgYi90ZXN0L0FuYWx5c2lzL2ttYWxsb2MtbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2MxMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9BbmFseXNpcy9rbWFsbG9jLWxpbnV4LmMKQEAgLTAsMCArMSw1OCBAQAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtdW5rbm93bi1saW51eCAtLWFuYWx5emUgJXMKKworI2luY2x1ZGUgIklucHV0cy9zeXN0ZW0taGVhZGVyLXNpbXVsYXRvci5oIgorCisjZGVmaW5lIF9fR0ZQX1pFUk8gMHg4MDAwCisjZGVmaW5lIE5VTEwgKCh2b2lkICopMCkKKwordm9pZCAqa21hbGxvYyhzaXplX3QsIGludCk7CisKK3N0cnVjdCB0ZXN0IHsKK307CisKK3ZvaWQgZm9vKHN0cnVjdCB0ZXN0ICopOworCit2b2lkIHRlc3RfemVyb2VkKCkgeworICBzdHJ1Y3QgdGVzdCAqKmxpc3QsICp0OworICBpbnQgaTsKKworICBsaXN0ID0ga21hbGxvYyhzaXplb2YoKmxpc3QpICogMTAsIF9fR0ZQX1pFUk8pOworICBpZiAobGlzdCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIHQgPSBsaXN0W2ldOworICAgIGZvbyh0KTsKKyAgfQorICBmcmVlKGxpc3QpOyAvLyBuby13YXJuaW5nCit9CisKK3ZvaWQgdGVzdF9ub256ZXJvKCkgeworICBzdHJ1Y3QgdGVzdCAqKmxpc3QsICp0OworICBpbnQgaTsKKworICBsaXN0ID0ga21hbGxvYyhzaXplb2YoKmxpc3QpICogMTAsIDApOworICBpZiAobGlzdCA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIHQgPSBsaXN0W2ldOyAvLyBleHBlY3RlZC13YXJuaW5ne3t1bmRlZmluZWR9fQorICAgIGZvbyh0KTsKKyAgfQorICBmcmVlKGxpc3QpOworfQorCit2b2lkIHRlc3RfaW5kZXRlcm1pbmF0ZShpbnQgZmxhZ3MpIHsKKyAgc3RydWN0IHRlc3QgKipsaXN0LCAqdDsKKyAgaW50IGk7CisKKyAgbGlzdCA9IGttYWxsb2Moc2l6ZW9mKCpsaXN0KSAqIDEwLCBmbGFncyk7CisgIGlmIChsaXN0ID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgdCA9IGxpc3RbaV07IC8vIGV4cGVjdGVkLXdhcm5pbmd7e3VuZGVmaW5lZH19CisgICAgZm9vKHQpOworICB9CisgIGZyZWUobGlzdCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL21hbGxvYy10aHJlZS1hcmcuYyBiL3Rlc3QvQW5hbHlzaXMvbWFsbG9jLXRocmVlLWFyZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjA4YWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0FuYWx5c2lzL21hbGxvYy10aHJlZS1hcmcuYwpAQCAtMCwwICsxLDU4IEBACisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC11bmtub3duLWZyZWVic2QgLS1hbmFseXplICVzCisKKyNpbmNsdWRlICJJbnB1dHMvc3lzdGVtLWhlYWRlci1zaW11bGF0b3IuaCIKKworI2RlZmluZSBNX1pFUk8gMHgwMTAwCisjZGVmaW5lIE5VTEwgKCh2b2lkICopMCkKKwordm9pZCAqbWFsbG9jKHNpemVfdCwgdm9pZCAqLCBpbnQpOworCitzdHJ1Y3QgdGVzdCB7Cit9OworCit2b2lkIGZvbyhzdHJ1Y3QgdGVzdCAqKTsKKwordm9pZCB0ZXN0X3plcm9lZCgpIHsKKyAgc3RydWN0IHRlc3QgKipsaXN0LCAqdDsKKyAgaW50IGk7CisKKyAgbGlzdCA9IG1hbGxvYyhzaXplb2YoKmxpc3QpICogMTAsIE5VTEwsIE1fWkVSTyk7CisgIGlmIChsaXN0ID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgdCA9IGxpc3RbaV07CisgICAgZm9vKHQpOworICB9CisgIGZyZWUobGlzdCk7IC8vIG5vLXdhcm5pbmcKK30KKwordm9pZCB0ZXN0X25vbnplcm8oKSB7CisgIHN0cnVjdCB0ZXN0ICoqbGlzdCwgKnQ7CisgIGludCBpOworCisgIGxpc3QgPSBtYWxsb2Moc2l6ZW9mKCpsaXN0KSAqIDEwLCBOVUxMLCAwKTsKKyAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICB0ID0gbGlzdFtpXTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7dW5kZWZpbmVkfX0KKyAgICBmb28odCk7CisgIH0KKyAgZnJlZShsaXN0KTsKK30KKwordm9pZCB0ZXN0X2luZGV0ZXJtaW5hdGUoaW50IGZsYWdzKSB7CisgIHN0cnVjdCB0ZXN0ICoqbGlzdCwgKnQ7CisgIGludCBpOworCisgIGxpc3QgPSBtYWxsb2Moc2l6ZW9mKCpsaXN0KSAqIDEwLCBOVUxMLCBmbGFncyk7CisgIGlmIChsaXN0ID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgdCA9IGxpc3RbaV07IC8vIGV4cGVjdGVkLXdhcm5pbmd7e3VuZGVmaW5lZH19CisgICAgZm9vKHQpOworICB9CisgIGZyZWUobGlzdCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL21hbGxvYy5jIGIvdGVzdC9BbmFseXNpcy9tYWxsb2MuYwppbmRleCA1OGQ0MGEzLi45YzA4YmJjIDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL21hbGxvYy5jCisrKyBiL3Rlc3QvQW5hbHlzaXMvbWFsbG9jLmMKQEAgLTI3MCw2ICsyNzAsMjIyIEBACiAgIGJ1ZlsxXSA9ICdjJzsgLy8gbm90IGNyYXNoCiB9CiAKK3ZvaWQgY2FzdF9lbXRweV9zdHJ1Y3QoKSB7CisgIHN0cnVjdCBzdCB7CisgIH07CisKKyAgc3RydWN0IHN0ICpzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3QpKTsgLy8gbm8td2FybmluZworICBmcmVlKHMpOworfQorCit2b2lkIGNhc3Rfc3RydWN0XzEoKSB7CisgIHN0cnVjdCBzdCB7CisgICAgaW50IGlbMTAwXTsKKyAgICBjaGFyIGpbXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdCkpOyAvLyBuby13YXJuaW5nCisgIGZyZWUocyk7Cit9CisKK3ZvaWQgY2FzdF9zdHJ1Y3RfMigpIHsKKyAgc3RydWN0IHN0IHsKKyAgICBpbnQgaVsxMDBdOworICAgIGNoYXIgalswXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdCkpOyAvLyBuby13YXJuaW5nCisgIGZyZWUocyk7Cit9CisKK3ZvaWQgY2FzdF9zdHJ1Y3RfMygpIHsKKyAgc3RydWN0IHN0IHsKKyAgICBpbnQgaVsxMDBdOworICAgIGNoYXIgalsxXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdCkpOyAvLyBuby13YXJuaW5nCisgIGZyZWUocyk7Cit9CisKK3ZvaWQgY2FzdF9zdHJ1Y3RfNCgpIHsKKyAgc3RydWN0IHN0IHsKKyAgICBpbnQgaVsxMDBdOworICAgIGNoYXIgalsyXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdCkpOyAvLyBuby13YXJuaW5nCisgIGZyZWUocyk7Cit9CisKK3ZvaWQgY2FzdF9zdHJ1Y3RfNSgpIHsKKyAgc3RydWN0IHN0IHsKKyAgICBjaGFyIGlbMjAwXTsKKyAgICBjaGFyIGpbMV07CisgIH07CisKKyAgc3RydWN0IHN0ICpzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3QpIC0gc2l6ZW9mKGNoYXIpKTsgLy8gbm8td2FybmluZworICBmcmVlKHMpOworfQorCit2b2lkIGNhc3Rfc3RydWN0X3dhcm5fMSgpIHsKKyAgc3RydWN0IHN0IHsKKyAgICBpbnQgaVsxMDBdOworICAgIGNoYXIgalsyXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdCkgKyAyKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Q2FzdCBhIHJlZ2lvbiB3aG9zZSBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBkZXN0aW5hdGlvbiB0eXBlIHNpemV9fQorICBmcmVlKHMpOworfQorCit2b2lkIGNhc3Rfc3RydWN0X3dhcm5fMigpIHsKKyAgc3RydWN0IHN0IHsKKyAgICBpbnQgaVsxMDBdOworICAgIGNoYXIgalsyXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2MoMik7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e0Nhc3QgYSByZWdpb24gd2hvc2Ugc2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgZGVzdGluYXRpb24gdHlwZSBzaXplfX0KKyAgZnJlZShzKTsKK30KKwordm9pZCBjYXN0X3N0cnVjdF9mbGV4X2FycmF5XzEoKSB7CisgIHN0cnVjdCBzdCB7CisgICAgaW50IGlbMTAwXTsKKyAgICBjaGFyIGpbXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdCkgKyAzKTsgLy8gbm8td2FybmluZworICBmcmVlKHMpOworfQorCit2b2lkIGNhc3Rfc3RydWN0X2ZsZXhfYXJyYXlfMigpIHsKKyAgc3RydWN0IHN0IHsKKyAgICBpbnQgaVsxMDBdOworICAgIGNoYXIgalswXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdCkgKyAzKTsgLy8gbm8td2FybmluZworICBmcmVlKHMpOworfQorCit2b2lkIGNhc3Rfc3RydWN0X2ZsZXhfYXJyYXlfMygpIHsKKyAgc3RydWN0IHN0IHsKKyAgICBpbnQgaVsxMDBdOworICAgIGNoYXIgalsxXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdCkgKyAzKTsgLy8gbm8td2FybmluZworICBmcmVlKHMpOworfQorCit2b2lkIGNhc3Rfc3RydWN0X2ZsZXhfYXJyYXlfNCgpIHsKKyAgc3RydWN0IGZvbyB7CisgICAgY2hhciBmWzMyXTsKKyAgfTsKKyAgc3RydWN0IHN0IHsKKyAgICBjaGFyIGlbMTAwXTsKKyAgICBzdHJ1Y3QgZm9vIGRhdGFbXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdCkgKyAzICogc2l6ZW9mKHN0cnVjdCBmb28pKTsgLy8gbm8td2FybmluZworICBmcmVlKHMpOworfQorCit2b2lkIGNhc3Rfc3RydWN0X2ZsZXhfYXJyYXlfNSgpIHsKKyAgc3RydWN0IGZvbyB7CisgICAgY2hhciBmWzMyXTsKKyAgfTsKKyAgc3RydWN0IHN0IHsKKyAgICBjaGFyIGlbMTAwXTsKKyAgICBzdHJ1Y3QgZm9vIGRhdGFbMF07CisgIH07CisKKyAgc3RydWN0IHN0ICpzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3QpICsgMyAqIHNpemVvZihzdHJ1Y3QgZm9vKSk7IC8vIG5vLXdhcm5pbmcKKyAgZnJlZShzKTsKK30KKwordm9pZCBjYXN0X3N0cnVjdF9mbGV4X2FycmF5XzYoKSB7CisgIHN0cnVjdCBmb28geworICAgIGNoYXIgZlszMl07CisgIH07CisgIHN0cnVjdCBzdCB7CisgICAgY2hhciBpWzEwMF07CisgICAgc3RydWN0IGZvbyBkYXRhWzFdOworICB9OworCisgIHN0cnVjdCBzdCAqcyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0KSArIDMgKiBzaXplb2Yoc3RydWN0IGZvbykpOyAvLyBuby13YXJuaW5nCisgIGZyZWUocyk7Cit9CisKK3ZvaWQgY2FzdF9zdHJ1Y3RfZmxleF9hcnJheV93YXJuXzEoKSB7CisgIHN0cnVjdCBmb28geworICAgIGNoYXIgZlszMl07CisgIH07CisgIHN0cnVjdCBzdCB7CisgICAgY2hhciBpWzEwMF07CisgICAgc3RydWN0IGZvbyBkYXRhW107CisgIH07CisKKyAgc3RydWN0IHN0ICpzID0gbWFsbG9jKDMgKiBzaXplb2Yoc3RydWN0IHN0KSArIDMgKiBzaXplb2Yoc3RydWN0IGZvbykpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tDYXN0IGEgcmVnaW9uIHdob3NlIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGRlc3RpbmF0aW9uIHR5cGUgc2l6ZX19CisgIGZyZWUocyk7Cit9CisKK3ZvaWQgY2FzdF9zdHJ1Y3RfZmxleF9hcnJheV93YXJuXzIoKSB7CisgIHN0cnVjdCBmb28geworICAgIGNoYXIgZlszMl07CisgIH07CisgIHN0cnVjdCBzdCB7CisgICAgY2hhciBpWzEwMF07CisgICAgc3RydWN0IGZvbyBkYXRhWzBdOworICB9OworCisgIHN0cnVjdCBzdCAqcyA9IG1hbGxvYygzICogc2l6ZW9mKHN0cnVjdCBzdCkgKyAzICogc2l6ZW9mKHN0cnVjdCBmb28pKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Q2FzdCBhIHJlZ2lvbiB3aG9zZSBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBkZXN0aW5hdGlvbiB0eXBlIHNpemV9fQorICBmcmVlKHMpOworfQorCit2b2lkIGNhc3Rfc3RydWN0X2ZsZXhfYXJyYXlfd2Fybl8zKCkgeworICBzdHJ1Y3QgZm9vIHsKKyAgICBjaGFyIGZbMzJdOworICB9OworICBzdHJ1Y3Qgc3QgeworICAgIGNoYXIgaVsxMDBdOworICAgIHN0cnVjdCBmb28gZGF0YVsxXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2MoMyAqIHNpemVvZihzdHJ1Y3Qgc3QpICsgMyAqIHNpemVvZihzdHJ1Y3QgZm9vKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e0Nhc3QgYSByZWdpb24gd2hvc2Ugc2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgZGVzdGluYXRpb24gdHlwZSBzaXplfX0KKyAgZnJlZShzKTsKK30KKwordm9pZCBjYXN0X3N0cnVjdF9mbGV4X2FycmF5X3dhcm5fNCgpIHsKKyAgc3RydWN0IHN0IHsKKyAgICBpbnQgaVsxMDBdOworICAgIGludCBqW107CisgIH07CisKKyAgc3RydWN0IHN0ICpzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3QpICsgMyk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e0Nhc3QgYSByZWdpb24gd2hvc2Ugc2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgZGVzdGluYXRpb24gdHlwZSBzaXplfX0KKyAgZnJlZShzKTsKK30KKwordm9pZCBjYXN0X3N0cnVjdF9mbGV4X2FycmF5X3dhcm5fNSgpIHsKKyAgc3RydWN0IHN0IHsKKyAgICBpbnQgaVsxMDBdOworICAgIGludCBqWzBdOworICB9OworCisgIHN0cnVjdCBzdCAqcyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0KSArIDMpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tDYXN0IGEgcmVnaW9uIHdob3NlIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGRlc3RpbmF0aW9uIHR5cGUgc2l6ZX19CisgIGZyZWUocyk7Cit9CisKK3ZvaWQgY2FzdF9zdHJ1Y3RfZmxleF9hcnJheV93YXJuXzYoKSB7CisgIHN0cnVjdCBzdCB7CisgICAgaW50IGlbMTAwXTsKKyAgICBpbnQgalsxXTsKKyAgfTsKKworICBzdHJ1Y3Qgc3QgKnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdCkgKyAzKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Q2FzdCBhIHJlZ2lvbiB3aG9zZSBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBkZXN0aW5hdGlvbiB0eXBlIHNpemV9fQorICBmcmVlKHMpOworfQorCiB2b2lkIG1hbGxvY0Nhc3RUb1ZvaWQoKSB7CiAgIHZvaWQgKnAgPSBtYWxsb2MoMik7CiAgIGNvbnN0IHZvaWQgKmNwID0gcDsgLy8gbm90IGNyYXNoCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL21hbGxvYy5tIGIvdGVzdC9BbmFseXNpcy9tYWxsb2MubQppbmRleCBhZDE2ZGI1Li45MjAxYzJiIDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL21hbGxvYy5tCisrKyBiL3Rlc3QvQW5hbHlzaXMvbWFsbG9jLm0KQEAgLTQ5LDQgKzQ5LDkgQEAKIHZvaWQgdGVzdE5TRGF0YVRydWVQb3NpdGl2ZUxlYWsoKSB7CiAgIGNoYXIgKmIgPSAoY2hhciAqKW1hbGxvYygxMik7CiAgIE5TRGF0YSAqZCA9IFtbTlNEYXRhIGFsbG9jXSBpbml0V2l0aEJ5dGVzOiBiIGxlbmd0aDogMTJdOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7UG90ZW50aWFsIGxlYWsgb2YgbWVtb3J5IHBvaW50ZWQgdG8gYnkgJ2InfX0KK30KKworaWQgd3JhcEluTlNWYWx1ZSgpIHsKKyAgdm9pZCAqYnVmZmVyID0gbWFsbG9jKDQpOworICByZXR1cm4gW05TVmFsdWUgdmFsdWVXaXRoUG9pbnRlcjpidWZmZXJdOyAvLyBuby13YXJuaW5nCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9tZXRob2QtYXJnLWRlY2F5Lm0gYi90ZXN0L0FuYWx5c2lzL21ldGhvZC1hcmctZGVjYXkubQppbmRleCAwYWY5ZTNlLi5hMjIyMzQ2IDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL21ldGhvZC1hcmctZGVjYXkubQorKysgYi90ZXN0L0FuYWx5c2lzL21ldGhvZC1hcmctZGVjYXkubQpAQCAtNjcsMTIgKzY3LDEyIEBACiBAaW50ZXJmYWNlIFhDRXh0ZW5kZWRUYWJWaWV3IDogTlNUYWJWaWV3IDxYQ0RvY2tWaWV3SGVhZGVyPiB7CiB9CiBAZW5kICAgICBAY2xhc3MgUEJYUHJvamVjdERvY3VtZW50LCBQQlhGaWxlUmVmZXJlbmNlLCBQQlhNb2R1bGUsIFhDV2luZG93VG9vbDsKLUBpbnRlcmZhY2UgWENQZXJzcGVjdGl2ZU1vZHVsZSA6IFBCWFByb2plY3RNb2R1bGUgPFBCWFNlbGVjdGlvblRhcmdldD4geyAvLyBleHBlY3RlZC1ub3RlIHt7cmVxdWlyZWQgZm9yIGRpcmVjdCBvciBpbmRpcmVjdCBwcm90b2NvbCAnUEJYU2VsZWN0aW9uVGFyZ2V0J319CitAaW50ZXJmYWNlIFhDUGVyc3BlY3RpdmVNb2R1bGUgOiBQQlhQcm9qZWN0TW9kdWxlIDxQQlhTZWxlY3Rpb25UYXJnZXQ+IHsKICAgWENFeHRlbmRlZFRhYlZpZXcgKl9wZXJzcGVjdGl2ZXNUYWJWaWV3OwogfQogLSAoUEJYTW9kdWxlICopIG1vZHVsZUZvclRhYjooTlNUYWJWaWV3SXRlbSAqKWl0ZW07CiBAZW5kICAKLUBpbXBsZW1lbnRhdGlvbiBYQ1BlcnNwZWN0aXZlTW9kdWxlIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2QgJ3BlcmZvcm1BY3Rpb246d2l0aFNlbGVjdGlvbjonIGluIHByb3RvY29sIG5vdCBpbXBsZW1lbnRlZH19fQorQGltcGxlbWVudGF0aW9uIFhDUGVyc3BlY3RpdmVNb2R1bGUgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21ldGhvZCAncGVyZm9ybUFjdGlvbjp3aXRoU2VsZWN0aW9uOicgaW4gcHJvdG9jb2wgJ1BCWFNlbGVjdGlvblRhcmdldCcgbm90IGltcGxlbWVudGVkfX19CiArICh2b2lkKSBvcGVuRm9yUHJvamVjdERvY3VtZW50OihQQlhQcm9qZWN0RG9jdW1lbnQgKilwcm9qZWN0RG9jdW1lbnQgewogfQogLSAoUEJYTW9kdWxlICopIHR5cGU6KENsYXNzKXR5cGUgaW5QZXJzcGVjdGl2ZTooaWQpcGVyc3BlY3RpdmVJZGVudGlmZXIgIG1hdGNoaW5nRnVuY3Rpb246KEJPT0wgKHZvaWQgKiwgdm9pZCAqKSljb21wYXJhdG9yIHVzaW5nRGF0YToodm9pZCAqKWRhdGEgewpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9taXNjLXBzLXJlZ2lvbi1zdG9yZS5jcHAgYi90ZXN0L0FuYWx5c2lzL21pc2MtcHMtcmVnaW9uLXN0b3JlLmNwcAppbmRleCA2YTg3M2YwLi5jYjUxMDQyIDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL21pc2MtcHMtcmVnaW9uLXN0b3JlLmNwcAorKysgYi90ZXN0L0FuYWx5c2lzL21pc2MtcHMtcmVnaW9uLXN0b3JlLmNwcApAQCAtNTg4LDYgKzU4OCw3IEBACiAgIGludCB4ID0gaW50KCk7CiAgIGlmICgheCkgewogICAgIGNsYW5nX2FuYWx5emVyX3dhcm5JZlJlYWNoZWQoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e1JFQUNIQUJMRX19CisgICAgOyAvLyBTdXBwcmVzcyB3YXJuaW5nIHRoYXQgYm90aCBicmFuY2hlcyBhcmUgaWRlbnRpY2FsCiAgIH0KICAgZWxzZSB7CiAgICAgY2xhbmdfYW5hbHl6ZXJfd2FybklmUmVhY2hlZCgpOyAgLy8gbm8td2FybmluZwpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9taXNjLXBzLXJlZ2lvbi1zdG9yZS5tIGIvdGVzdC9BbmFseXNpcy9taXNjLXBzLXJlZ2lvbi1zdG9yZS5tCmluZGV4IGJhODhkZWMuLmIwNDhmOGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvbWlzYy1wcy1yZWdpb24tc3RvcmUubQorKysgYi90ZXN0L0FuYWx5c2lzL21pc2MtcHMtcmVnaW9uLXN0b3JlLm0KQEAgLTEsNSArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbjkgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxhbHBoYS5kZWFkY29kZS5JZGVtcG90ZW50T3BlcmF0aW9ucyxhbHBoYS5jb3JlLkNhc3RUb1N0cnVjdCxhbHBoYS5zZWN1cml0eS5SZXR1cm5QdHJSYW5nZSxhbHBoYS5zZWN1cml0eS5BcnJheUJvdW5kIC1hbmFseXplci1zdG9yZT1yZWdpb24gLXZlcmlmeSAtZmJsb2NrcyAtYW5hbHl6ZXItb3B0LWFuYWx5emUtbmVzdGVkLWJsb2NrcyAtV25vLW9iamMtcm9vdC1jbGFzcyAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjkgLURURVNUXzY0IC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsYWxwaGEuZGVhZGNvZGUuSWRlbXBvdGVudE9wZXJhdGlvbnMsYWxwaGEuY29yZS5DYXN0VG9TdHJ1Y3QsYWxwaGEuc2VjdXJpdHkuUmV0dXJuUHRyUmFuZ2UsYWxwaGEuc2VjdXJpdHkuQXJyYXlCb3VuZCAtYW5hbHl6ZXItc3RvcmU9cmVnaW9uIC12ZXJpZnkgLWZibG9ja3MgICAtYW5hbHl6ZXItb3B0LWFuYWx5emUtbmVzdGVkLWJsb2NrcyAtV25vLW9iamMtcm9vdC1jbGFzcyAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW45IC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsYWxwaGEuY29yZS5DYXN0VG9TdHJ1Y3QsYWxwaGEuc2VjdXJpdHkuUmV0dXJuUHRyUmFuZ2UsYWxwaGEuc2VjdXJpdHkuQXJyYXlCb3VuZCAtYW5hbHl6ZXItc3RvcmU9cmVnaW9uIC12ZXJpZnkgLWZibG9ja3MgLWFuYWx5emVyLW9wdC1hbmFseXplLW5lc3RlZC1ibG9ja3MgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW45IC1EVEVTVF82NCAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlLGFscGhhLmNvcmUuQ2FzdFRvU3RydWN0LGFscGhhLnNlY3VyaXR5LlJldHVyblB0clJhbmdlLGFscGhhLnNlY3VyaXR5LkFycmF5Qm91bmQgLWFuYWx5emVyLXN0b3JlPXJlZ2lvbiAtdmVyaWZ5IC1mYmxvY2tzICAgLWFuYWx5emVyLW9wdC1hbmFseXplLW5lc3RlZC1ibG9ja3MgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKIAogdHlwZWRlZiBsb25nIHVuc2lnbmVkIGludCBzaXplX3Q7CiB2b2lkICptZW1jcHkodm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CkBAIC0yNTMsNyArMjUzLDcgQEAKICAgYSA9IEE7CiAgIGIgPSBCOwogICAKLSAgbiA9ICphKys7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e0Fzc2lnbmVkIHZhbHVlIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgZXhpc3RpbmcgdmFsdWV9fQorICBuID0gKmErKzsKICAgaWYgKG4pCiAgICAgeCArPSAqYisrOyAvLyBuby13YXJuaW5nCiB9CkBAIC0xMTE1LDcgKzExMTUsNyBAQAogICBpbnQgbnVtYmVyID0gcHI4MDE1X0EoKTsKICAgY29uc3QgY2hhciAqbnVtYmVyc1tdID0geyAiemVybyIgfTsKICAgaWYgKG51bWJlciA9PSAwKSB7Ci0gICAgaWYgKG51bWJlcnNbbnVtYmVyXSA9PSBudW1iZXJzWzBdKSAvLyBleHBlY3RlZC13YXJuaW5ne3tCb3RoIG9wZXJhbmRzIHRvICc9PScgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWV9fQorICAgIGlmIChudW1iZXJzW251bWJlcl0gPT0gbnVtYmVyc1swXSkKICAgICAgIHJldHVybjsKICAgICAvLyBVbnJlYWNoYWJsZS4KICAgICBpbnQgKnAgPSAwOwpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9taXNjLXBzLm0gYi90ZXN0L0FuYWx5c2lzL21pc2MtcHMubQppbmRleCBiMjYxYjEwLi42ZGE5NjA0IDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL21pc2MtcHMubQorKysgYi90ZXN0L0FuYWx5c2lzL21pc2MtcHMubQpAQCAtMSw2ICsxLDYgQEAKIC8vIE5PVEU6IFVzZSAnLWZvYmpjLWdjJyB0byB0ZXN0IHRoZSBhbmFseXNpcyBiZWluZyBydW4gdHdpY2UsIGFuZCBtdWx0aXBsZSByZXBvcnRzIGFyZSBub3QgaXNzdWVkLgotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4xMCAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlLGFscGhhLmRlYWRjb2RlLklkZW1wb3RlbnRPcGVyYXRpb25zLGFscGhhLmNvcmUsb3N4LmNvY29hLkF0U3luYyAtYW5hbHl6ZXItc3RvcmU9cmVnaW9uIC1hbmFseXplci1jb25zdHJhaW50cz1yYW5nZSAtdmVyaWZ5IC1mYmxvY2tzIC1Xbm8tdW5yZWFjaGFibGUtY29kZSAtV25vLW51bGwtZGVyZWZlcmVuY2UgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlLGFscGhhLmRlYWRjb2RlLklkZW1wb3RlbnRPcGVyYXRpb25zLGFscGhhLmNvcmUsb3N4LmNvY29hLkF0U3luYyAtYW5hbHl6ZXItc3RvcmU9cmVnaW9uIC1hbmFseXplci1jb25zdHJhaW50cz1yYW5nZSAtdmVyaWZ5IC1mYmxvY2tzIC1Xbm8tdW5yZWFjaGFibGUtY29kZSAtV25vLW51bGwtZGVyZWZlcmVuY2UgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGkzODYtYXBwbGUtZGFyd2luMTAgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxhbHBoYS5jb3JlLG9zeC5jb2NvYS5BdFN5bmMgLWFuYWx5emVyLXN0b3JlPXJlZ2lvbiAtYW5hbHl6ZXItY29uc3RyYWludHM9cmFuZ2UgLXZlcmlmeSAtZmJsb2NrcyAtV25vLXVucmVhY2hhYmxlLWNvZGUgLVduby1udWxsLWRlcmVmZXJlbmNlIC1Xbm8tb2JqYy1yb290LWNsYXNzICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxhbHBoYS5jb3JlLG9zeC5jb2NvYS5BdFN5bmMgLWFuYWx5emVyLXN0b3JlPXJlZ2lvbiAtYW5hbHl6ZXItY29uc3RyYWludHM9cmFuZ2UgLXZlcmlmeSAtZmJsb2NrcyAtV25vLXVucmVhY2hhYmxlLWNvZGUgLVduby1udWxsLWRlcmVmZXJlbmNlIC1Xbm8tb2JqYy1yb290LWNsYXNzICVzCiAKICNpZm5kZWYgX19jbGFuZ19hbmFseXplcl9fCiAjZXJyb3IgX19jbGFuZ19hbmFseXplcl9fIG5vdCBkZWZpbmVkCkBAIC04MCwxMSArODAsMTEgQEAKIAogdm9pZCByNjI2ODM2NSgpIHsKICAgdW5zaWduZWQgeCA9IDA7Ci0gIHggJj0gcjYyNjgzNjVBdXgoKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VGhlIGxlZnQgb3BlcmFuZCB0byAnJj0nIGlzIGFsd2F5cyAwfX0KKyAgeCAmPSByNjI2ODM2NUF1eCgpOwogICB1bnNpZ25lZCBqID0gMDsKICAgICAKICAgaWYgKHggPT0gMCkgKytqOwotICBpZiAoeCA9PSAwKSB4ID0geCAvIGo7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e0Fzc2lnbmVkIHZhbHVlIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgZXhpc3RpbmcgdmFsdWV9fSBleHBlY3RlZC13YXJuaW5ne3tUaGUgcmlnaHQgb3BlcmFuZCB0byAnLycgaXMgYWx3YXlzIDF9fQorICBpZiAoeCA9PSAwKSB4ID0geCAvIGo7CiB9CiAKIHZvaWQgZGl2emVyb2Fzc3VtZSh1bnNpZ25lZCB4LCB1bnNpZ25lZCBqKSB7ICAKQEAgLTQxMiwxNCArNDEyLDE0IEBACiAgIGludCB0ZXN0X3RyaXZpYWxfc3ltYm9saWNfY29tcGFyaXNvbl9hdXgoKTsKICAgaW50IGEgPSB0ZXN0X3RyaXZpYWxfc3ltYm9saWNfY29tcGFyaXNvbl9hdXgoKTsKICAgaW50IGIgPSBhOwotICBpZiAoYSAhPSBiKSB7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e0JvdGggb3BlcmFuZHMgdG8gJyE9JyBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZX19CisgIGlmIChhICE9IGIpIHsKICAgICBpbnQgKnAgPSAwOwogICAgICpwID0gMHhERUFEQkVFRjsgICAgIC8vIG5vLXdhcm5pbmcKICAgfQogICAKICAgYSA9IGEgPT0gMTsKICAgYiA9IGIgPT0gMTsKLSAgaWYgKGEgIT0gYikgeyAvLyBleHBlY3RlZC13YXJuaW5ne3tCb3RoIG9wZXJhbmRzIHRvICchPScgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWV9fQorICBpZiAoYSAhPSBiKSB7CiAgICAgaW50ICpwID0gMDsKICAgICAqcCA9IDB4REVBREJFRUY7ICAgICAvLyBuby13YXJuaW5nCiAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvbmV3LmNwcCBiL3Rlc3QvQW5hbHlzaXMvbmV3LmNwcAppbmRleCAxMDVhOTczLi5lMjYyYWE3IDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL25ldy5jcHAKKysrIGIvdGVzdC9BbmFseXNpcy9uZXcuY3BwCkBAIC0yNjcsNyArMjY3LDcgQEAKICAgY2xhbmdfYW5hbHl6ZXJfZXZhbCh0cnVlKTsgLy8gbm8gd2FybgogfQogCi0vL0RlbGV0aW5nIGEgbm9uIGNsYXNzIHBvaW50ZXIgc2hvdWxkIG5vdCBjcmFzaC93YXJuCisvL0RlbGV0aW5nIGEgbm9uLWNsYXNzIHBvaW50ZXIgc2hvdWxkIG5vdCBjcmFzaC93YXJuCiB2b2lkIHRlc3RfdmFyX2RlbGV0ZSgpIHsKICAgaW50ICp2ID0gbmV3IGludDsKICAgZGVsZXRlIHY7ICAvLyBubyBjcmFzaC93YXJuCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL25vLW91dG9mYm91bmRzLmMgYi90ZXN0L0FuYWx5c2lzL25vLW91dG9mYm91bmRzLmMKaW5kZXggODRmODZkNy4uZDQwMTI3OSAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9uby1vdXRvZmJvdW5kcy5jCisrKyBiL3Rlc3QvQW5hbHlzaXMvbm8tb3V0b2Zib3VuZHMuYwpAQCAtMSw0ICsxLDUgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlLGFscGhhLmNvcmUsYWxwaGEudW5peCxhbHBoYS5zZWN1cml0eS5BcnJheUJvdW5kIC1hbmFseXplci1zdG9yZT1yZWdpb24gLXZlcmlmeSAlcworLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIC8vIFRoaXMgZmlsZSB0ZXN0cyBjYXNlcyB3aGVyZSB3ZSBzaG91bGQgbm90IGZsYWcgb3V0LW9mLWJvdW5kcyB3YXJuaW5ncy4KQEAgLTI0LDggKzI1LDcgQEAKIAogdm9pZCBmaWVsZCgpIHsKICAgc3RydWN0IHZlYyB7IHNpemVfdCBsZW47IGludCBkYXRhWzBdOyB9OwotICAvLyBGSVhNRTogTm90IHdhcm4gZm9yIHRoaXMuCi0gIHN0cnVjdCB2ZWMgKmEgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZWMpICsgMTApOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Q2FzdCBhIHJlZ2lvbiB3aG9zZSBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBkZXN0aW5hdGlvbiB0eXBlIHNpemV9fQorICBzdHJ1Y3QgdmVjICphID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmVjKSArIDEwKnNpemVvZihpbnQpKTsKICAgYS0+bGVuID0gMTA7CiAgIGEtPmRhdGFbMV0gPSA1OyAvLyBuby13YXJuaW5nCiAgIGZyZWUoYSk7CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL25vbm51bGwubSBiL3Rlc3QvQW5hbHlzaXMvbm9ubnVsbC5tCmluZGV4IGMzMmE3ZjcuLjBjZWE4MGIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvbm9ubnVsbC5tCisrKyBiL3Rlc3QvQW5hbHlzaXMvbm9ubnVsbC5tCkBAIC0xLDcgKzEsOSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUgLXcgLXZlcmlmeSAlcwogCiBAaW50ZXJmYWNlIE15T2JqZWN0CiAtICh2b2lkKXRha2VQb2ludGVyOih2b2lkICopcHRyIF9fYXR0cmlidXRlX18oKG5vbm51bGwoMSkpKTsKKy0gKHZvaWQpdGFrZVBvaW50ZXJBcmc6KHZvaWQgKilfX2F0dHJpYnV0ZV9fKChub25udWxsKSkgcHRyOworCiBAZW5kCiAKIHZvaWQgdGVzdE5vbk51bGxNZXRob2QoaW50ICpwLCBNeU9iamVjdCAqb2JqKSB7CkBAIC0yMSwzICsyMyw1NSBAQAogICAgIHJldHVybjsKICAgW29iaiB0YWtlUG9pbnRlcjpwXTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7bm9ubnVsbH19CiB9CisKK3ZvaWQgdGVzdFN1YmNsYXNzQXJnKGludCAqcCwgU3ViY2xhc3MgKm9iaikgeworICBpZiAocCkKKyAgICByZXR1cm47CisgIFtvYmogdGFrZVBvaW50ZXJBcmc6cF07IC8vIGV4cGVjdGVkLXdhcm5pbmd7e25vbm51bGx9fQorfQorCisKK3VuaW9uIHJkYXIxNjE1MzQ2NF9jb25zdF9jcF90IHsKKyAgY29uc3Qgc3RydWN0IHJkYXIxNjE1MzQ2NF9jY3pwICp6cDsKKyAgY29uc3Qgc3RydWN0IHJkYXIxNjE1MzQ2NF9jY3pwX3ByaW1lICpwcmltZTsKK30gX19hdHRyaWJ1dGVfXygodHJhbnNwYXJlbnRfdW5pb24pKTsKKworc3RydWN0IHJkYXIxNjE1MzQ2NF9oZWFkZXIgeworICB1bmlvbiByZGFyMTYxNTM0NjRfY29uc3RfY3BfdCBjcDsKKyAgdW5zaWduZWQgY2hhciBwYWRbMTYgLSBzaXplb2YodW5pb24gcmRhcjE2MTUzNDY0X2NvbnN0X2NwX3QgKildOworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOworCisKK3N0cnVjdCByZGFyMTYxNTM0NjRfZnVsbF9jdHggeworICBzdHJ1Y3QgcmRhcjE2MTUzNDY0X2hlYWRlciBoZHI7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSk7CisKKworc3RydWN0IHJkYXIxNjE1MzQ2NF9wdWJfY3R4IHsKKyAgc3RydWN0IHJkYXIxNjE1MzQ2NF9oZWFkZXIgaGRyOworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOworCisKK3VuaW9uIHJkYXIxNjE1MzQ2NF9mdWxsX2N0eF90IHsKKyAgc3RydWN0IHJkYXIxNjE1MzQ2NF9mdWxsX2N0eCAqX2Z1bGw7CisgIHN0cnVjdCByZGFyMTYxNTM0NjRfaGVhZGVyICpoZHI7CisgIHN0cnVjdCByZGFyMTYxNTM0NjRfYm9keSAqYm9keTsKKyAgc3RydWN0IHJkYXIxNjE1MzQ2NF9wdWJsaWMgKnB1YjsKK30gX19hdHRyaWJ1dGVfXygodHJhbnNwYXJlbnRfdW5pb24pKTsKKwordW5pb24gcmRhcjE2MTUzNDY0X3B1Yl9jdHhfdCB7CisgIHN0cnVjdCByZGFyMTYxNTM0NjRfcHViX2N0eCAqX3B1YjsKKyAgc3RydWN0IHJkYXIxNjE1MzQ2NF9mdWxsX2N0eCAqX2Z1bGw7CisgIHN0cnVjdCByZGFyMTYxNTM0NjRfaGVhZGVyICpoZHI7CisgIHN0cnVjdCByZGFyMTYxNTM0NjRfYm9keSAqYm9keTsKKyAgc3RydWN0IHJkYXIxNjE1MzQ2NF9wdWJsaWMgKnB1YjsKKyAgdW5pb24gcmRhcjE2MTUzNDY0X2Z1bGxfY3R4X3QgaW5uZXJ0OworfSBfX2F0dHJpYnV0ZV9fKCh0cmFuc3BhcmVudF91bmlvbikpOworCitpbnQgcmRhcjE2MTUzNDY0KHVuaW9uIHJkYXIxNjE1MzQ2NF9mdWxsX2N0eF90IGlubmVyKQoreworICBleHRlcm4gdm9pZCByZGFyMTYxNTM0NjRfY2hlY2sodW5pb24gcmRhcjE2MTUzNDY0X3B1Yl9jdHhfdCBvdXRlcikgX19hdHRyaWJ1dGUoKG5vbm51bGwoMSkpKTsKKyAgcmRhcjE2MTUzNDY0X2NoZWNrKCh1bmlvbiByZGFyMTYxNTM0NjRfcHViX2N0eF90KXsgLmlubmVydCA9IGlubmVyIH0pOyAvLyBuby13YXJuaW5nCisgIHJkYXIxNjE1MzQ2NF9jaGVjayhpbm5lcik7IC8vIG5vLXdhcm5pbmcKKyAgcmRhcjE2MTUzNDY0X2NoZWNrKDApOyAvLyBleHBlY3RlZC13YXJuaW5ne3tub25udWxsfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvbnVsbC1kZXJlZi1wcy5jIGIvdGVzdC9BbmFseXNpcy9udWxsLWRlcmVmLXBzLmMKaW5kZXggNGRjOGZjNC4uMjQwZThlZCAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9udWxsLWRlcmVmLXBzLmMKKysrIGIvdGVzdC9BbmFseXNpcy9udWxsLWRlcmVmLXBzLmMKQEAgLTEsNSArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbjEwIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsZGVhZGNvZGUsYWxwaGEuZGVhZGNvZGUuSWRlbXBvdGVudE9wZXJhdGlvbnMsYWxwaGEuY29yZSAtc3RkPWdudTk5IC1hbmFseXplci1zdG9yZT1yZWdpb24gLWFuYWx5emVyLWNvbnN0cmFpbnRzPXJhbmdlIC1hbmFseXplci1wdXJnZT1ub25lIC12ZXJpZnkgJXMgLVduby1lcnJvcj1yZXR1cm4tdHlwZQotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4xMCAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlLGRlYWRjb2RlLGFscGhhLmRlYWRjb2RlLklkZW1wb3RlbnRPcGVyYXRpb25zLGFscGhhLmNvcmUgLXN0ZD1nbnU5OSAtYW5hbHl6ZXItc3RvcmU9cmVnaW9uIC1hbmFseXplci1jb25zdHJhaW50cz1yYW5nZSAtdmVyaWZ5ICVzIC1Xbm8tZXJyb3I9cmV0dXJuLXR5cGUgCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbjEwIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsZGVhZGNvZGUsYWxwaGEuY29yZSAtc3RkPWdudTk5IC1hbmFseXplci1zdG9yZT1yZWdpb24gLWFuYWx5emVyLWNvbnN0cmFpbnRzPXJhbmdlIC1hbmFseXplci1wdXJnZT1ub25lIC12ZXJpZnkgJXMgLVduby1lcnJvcj1yZXR1cm4tdHlwZQorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4xMCAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlLGRlYWRjb2RlLGFscGhhLmNvcmUgLXN0ZD1nbnU5OSAtYW5hbHl6ZXItc3RvcmU9cmVnaW9uIC1hbmFseXplci1jb25zdHJhaW50cz1yYW5nZSAtdmVyaWZ5ICVzIC1Xbm8tZXJyb3I9cmV0dXJuLXR5cGUgCiAKIHR5cGVkZWYgdW5zaWduZWQgdWludHB0cl90OwogCkBAIC02NCw3ICs2NCw3IEBACiAgIHNob3J0ICpwID0geDsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7aW5jb21wYXRpYmxlIGludGVnZXIgdG8gcG9pbnRlciBjb252ZXJzaW9ufX0KIAogICAvLyBUaGUgZm9sbG93aW5nIGJyYW5jaCBzaG91bGQgYmUgaW5mZWFzaWJsZS4KLSAgaWYgKCEocCA9PSAmYXJyYXlbMF0pKSB7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e0JvdGggb3BlcmFuZHMgdG8gJz09JyBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZX19CisgIGlmICghKHAgPT0gJmFycmF5WzBdKSkgewogICAgIHAgPSAwOwogICAgICpwID0gMTsgLy8gbm8td2FybmluZwogICB9CkBAIC0yOTcsNyArMjk3LDcgQEAKIGludCBmb28xMDU5NTMyNyhpbnQgYikgewogICB2b2lkICgqZnApKGludCAqKTsKICAgLy8gV2UgdXNlIHBhdGggc2Vuc2l0aXZpdHkgdG8gZ2V0IHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gRXZlbiB3aGVuIHRoZQotICAvLyBmdW5jdGlvbiBwb2ludGVyIGlzIGNhc3QgdG8gbm9uIHBvaW50ZXItdG8tY29uc3QgcGFyYW1ldGVyIHR5cGUsIHdlIGNhbgorICAvLyBmdW5jdGlvbiBwb2ludGVyIGlzIGNhc3QgdG8gbm9uLXBvaW50ZXItdG8tY29uc3QgcGFyYW1ldGVyIHR5cGUsIHdlIGNhbgogICAvLyBmaW5kIHRoZSByaWdodCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KICAgaWYgKGIgPiA1KQogICAgIGZwID0gKE5vQ29uc3RUeXBlKXR0dDI7CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL29iamMtYXJjLm0gYi90ZXN0L0FuYWx5c2lzL29iamMtYXJjLm0KaW5kZXggYmE1OTBkNjE0Li45MjQzMmIxIDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL29iamMtYXJjLm0KKysrIGIvdGVzdC9BbmFseXNpcy9vYmpjLWFyYy5tCkBAIC0xMzgsNyArMTM4LDcgQEAKIHZvaWQgZnJvbV9jZigpIHsKICAgaWQgb2JqMSA9IChfX2JyaWRnZV90cmFuc2ZlciBpZClDRkNyZWF0ZVNvbWV0aGluZygpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tuZXZlciByZWFkfX0KICAgaWQgb2JqMiA9IChfX2JyaWRnZV90cmFuc2ZlciBOU1N0cmluZyopQ0ZDcmVhdGVTdHJpbmcoKTsKLSAgW29iajIgc2VsZl07IC8vIEFkZCBhIHVzZSwgdG8gc2hvdyB3ZSBjYW4gdXNlIHRoZSBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gdHJhbnNmZXJlZC4KKyAgW29iajIgc2VsZl07IC8vIEFkZCBhIHVzZSwgdG8gc2hvdyB3ZSBjYW4gdXNlIHRoZSBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gdHJhbnNmZXJyZWQuCiAgIGlkIG9iajMgPSAoX19icmlkZ2UgaWQpQ0ZHZXRTb21ldGhpbmcoKTsKICAgW29iajMgc2VsZl07IC8vIEFkZCBhIHVzZSwgdG8gc2hvdyB3ZSBjYW4gdXNlIHRoZSBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gYnJpZGdlZC4KICAgaWQgb2JqNCA9IChfX2JyaWRnZSBOU1N0cmluZyopQ0ZHZXRTdHJpbmcoKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7bmV2ZXIgcmVhZH19CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL29iamMtYm94aW5nLm0gYi90ZXN0L0FuYWx5c2lzL29iamMtYm94aW5nLm0KaW5kZXggOTgzMTBiNS4uYzIzMTkyZSAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9vYmpjLWJveGluZy5tCisrKyBiL3Rlc3QvQW5hbHlzaXMvb2JqYy1ib3hpbmcubQpAQCAtMSw0ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlLHVuaXguTWFsbG9jIC1hbmFseXplci1zdG9yZT1yZWdpb24gLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsdW5peC5NYWxsb2Msb3N4LmNvY29hLk5vbk5pbFJldHVyblZhbHVlLGRlYnVnLkV4cHJJbnNwZWN0aW9uIC1hbmFseXplci1zdG9yZT1yZWdpb24gLXZlcmlmeSAlcworCit2b2lkIGNsYW5nX2FuYWx5emVyX2V2YWwoaW50KTsKIAogdHlwZWRlZiBzaWduZWQgY2hhciBCT09MOwogdHlwZWRlZiBsb25nIE5TSW50ZWdlcjsKQEAgLTQxLDQgKzQzLDE1IEBACiAgIGlmICh4KQogICAgIHJldHVybiBAKDMpOwogICByZXR1cm4gQCgqeCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tEZXJlZmVyZW5jZSBvZiBudWxsIHBvaW50ZXIgKGxvYWRlZCBmcm9tIHZhcmlhYmxlICd4Jyl9fQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KKwordm9pZCBjaGVja05vbk5pbCgpIHsKKyAgY2xhbmdfYW5hbHl6ZXJfZXZhbCghIUAzKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19CisgIGNsYW5nX2FuYWx5emVyX2V2YWwoISFAKDMrNCkpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tUUlVFfX0KKyAgY2xhbmdfYW5hbHl6ZXJfZXZhbCghIUAoNTcuMCkpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tUUlVFfX0KKworICBjb25zdCBjaGFyICpzdHIgPSAiYWJjIjsKKyAgY2xhbmdfYW5hbHl6ZXJfZXZhbCghIUAoc3RyKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQorICBjbGFuZ19hbmFseXplcl9ldmFsKCEhQF9fb2JqY195ZXMpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tUUlVFfX0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9vYmpjLWZvci5tIGIvdGVzdC9BbmFseXNpcy9vYmpjLWZvci5tCmluZGV4IDJmMTRiOGEuLmQxZTA0NGEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvb2JqYy1mb3IubQorKysgYi90ZXN0L0FuYWx5c2lzL29iamMtZm9yLm0KQEAgLTEwOSw3ICsxMDksNyBAQAogfQogCiBpbnQgY29sbGVjdGlvbklzRW1wdHlOU1NldChOU1NldCAqUyl7Ci0gIGlmIChbUyBjb3VudF0gPT0gMikgeyAvLyBDb3VudCBpcyBub24gemVyby4KKyAgaWYgKFtTIGNvdW50XSA9PSAyKSB7IC8vIENvdW50IGlzIG5vbi16ZXJvLgogICAgIGludCB0YXBDb3VudHNbMl07CiAgICAgaW50IGkgPSAwOwogICAgIGZvciAoTlNTdHJpbmcgKmVsZW0gaW4gUykgewpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9vYmpjLXByb3BlcnRpZXMubSBiL3Rlc3QvQW5hbHlzaXMvb2JqYy1wcm9wZXJ0aWVzLm0KaW5kZXggMzIzZjQxYS4uZjZlZDNlNSAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9vYmpjLXByb3BlcnRpZXMubQorKysgYi90ZXN0L0FuYWx5c2lzL29iamMtcHJvcGVydGllcy5tCkBAIC0yMyw4ICsyMyw4IEBACiAKICAgQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgTXlDbGFzcyogWTsgLy8gYXV0b21hdGljYWxseSBzeW50aGVzaXplZCwgaW1wbGVtZW50ZWQKIAotICBAcHJvcGVydHkgKGFzc2lnbiwgbm9uYXRvbWljKSBNeUNsYXNzKiBaOyAvLyBub24gc3ludGhlc2l6ZWQgaXZhciwgaW1wbGVtZW50ZWQgc2V0dGVyCi0gIEBwcm9wZXJ0eSAocmVhZG9ubHkpIGlkIG5vblN5bnRoOyAgLy8gbm9uIHN5bnRoZXNpemVkLCBleHBsaWNpdGx5IGltcGxlbWVudGVkIHRvIHJldHVybiBpdmFyIHdpdGggZXhwZWN0ZWQgbmFtZQorICBAcHJvcGVydHkgKGFzc2lnbiwgbm9uYXRvbWljKSBNeUNsYXNzKiBaOyAvLyBub24tc3ludGhlc2l6ZWQgaXZhciwgaW1wbGVtZW50ZWQgc2V0dGVyCisgIEBwcm9wZXJ0eSAocmVhZG9ubHkpIGlkIG5vblN5bnRoOyAgLy8gbm9uLXN5bnRoZXNpemVkLCBleHBsaWNpdGx5IGltcGxlbWVudGVkIHRvIHJldHVybiBpdmFyIHdpdGggZXhwZWN0ZWQgbmFtZQogICAKICAgLSAoaWQpIGluaXRXaXRoUHRyOihNeUNsYXNzKikgdmFsdWU7CiAgIC0gKGlkKSBteUluaXRXaXRoUHRyOihNeUNsYXNzKikgdmFsdWU7CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL29iamMtc3RyaW5nLm1tIGIvdGVzdC9BbmFseXNpcy9vYmpjLXN0cmluZy5tbQppbmRleCBjNjdhYjVlLi5hMzJiNzQwIDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL29iamMtc3RyaW5nLm1tCisrKyBiL3Rlc3QvQW5hbHlzaXMvb2JqYy1zdHJpbmcubW0KQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxkZWJ1Zy5FeHBySW5zcGVjdGlvbiAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxkZWJ1Zy5FeHBySW5zcGVjdGlvbiAtdmVyaWZ5IC1Xbm8tb2JqYy1saXRlcmFsLWNvbnZlcnNpb24gJXMKIAogdm9pZCBjbGFuZ19hbmFseXplcl9ldmFsKGJvb2wpOwogQGNsYXNzIE5TU3RyaW5nOwpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9vYmpjL2RpcmVjdC1pdmFyLWFzc2lnbm1lbnQtaW4tYW5ub3RhdGVkLWZ1bmN0aW9ucy5tIGIvdGVzdC9BbmFseXNpcy9vYmpjL2RpcmVjdC1pdmFyLWFzc2lnbm1lbnQtaW4tYW5ub3RhdGVkLWZ1bmN0aW9ucy5tCmluZGV4IGYxZWNkNTQuLjQ3NzdhZWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvb2JqYy9kaXJlY3QtaXZhci1hc3NpZ25tZW50LWluLWFubm90YXRlZC1mdW5jdGlvbnMubQorKysgYi90ZXN0L0FuYWx5c2lzL29iamMvZGlyZWN0LWl2YXItYXNzaWdubWVudC1pbi1hbm5vdGF0ZWQtZnVuY3Rpb25zLm0KQEAgLTMyLDggKzMyLDggQEAKIAogICBAcHJvcGVydHkgKGFzc2lnbiwgbm9uYXRvbWljKSBNeUNsYXNzKiBZOyAvLyBhdXRvbWF0aWNhbGx5IHN5bnRoZXNpemVkLCBpbXBsZW1lbnRlZAogCi0gIEBwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE15Q2xhc3MqIFo7IC8vIG5vbiBzeW50aGVzaXplZCBpdmFyLCBpbXBsZW1lbnRlZCBzZXR0ZXIKLSAgQHByb3BlcnR5IChyZWFkb25seSkgaWQgbm9uU3ludGg7ICAvLyBub24gc3ludGhlc2l6ZWQsIGV4cGxpY2l0bHkgaW1wbGVtZW50ZWQgdG8gcmV0dXJuIGl2YXIgd2l0aCBleHBlY3RlZCBuYW1lCisgIEBwcm9wZXJ0eSAoYXNzaWduLCBub25hdG9taWMpIE15Q2xhc3MqIFo7IC8vIG5vbi1zeW50aGVzaXplZCBpdmFyLCBpbXBsZW1lbnRlZCBzZXR0ZXIKKyAgQHByb3BlcnR5IChyZWFkb25seSkgaWQgbm9uU3ludGg7ICAvLyBub24tc3ludGhlc2l6ZWQsIGV4cGxpY2l0bHkgaW1wbGVtZW50ZWQgdG8gcmV0dXJuIGl2YXIgd2l0aCBleHBlY3RlZCBuYW1lCiAgIAogICBAcHJvcGVydHkgKGFzc2lnbikgTXlDbGFzcyogTm90QTsgIC8vIHdhcm5pbmdzIHNob3VsZCBiZSBzdXBwcmVzc2VkLCBiYWNraW5nIGl2YXIgaXMgYW5ub3RhdGVkCiAgIEBwcm9wZXJ0eSAoYXNzaWduKSBNeUNsYXNzKiBOb3RYIF9fYXR0cmlidXRlX18oKGFubm90YXRlKCJvYmpjX2FsbG93X2RpcmVjdF9pbnN0YW5jZV92YXJpYWJsZV9hc3NpZ25tZW50IikpKTsgIC8vIHdhcm5pbmdzIHNob3VsZCBiZSBzdXBwcmVzc2VkCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL3Byb3BlcnRpZXMubSBiL3Rlc3QvQW5hbHlzaXMvcHJvcGVydGllcy5tCmluZGV4IGRkZDAwNjguLmY1YjVkOTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvcHJvcGVydGllcy5tCisrKyBiL3Rlc3QvQW5hbHlzaXMvcHJvcGVydGllcy5tCkBAIC0xLDQgKzEsNyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsb3N4LmNvY29hLlJldGFpbkNvdW50IC1hbmFseXplci1zdG9yZT1yZWdpb24gLXZlcmlmeSAtV25vLW9iamMtcm9vdC1jbGFzcyAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsb3N4LmNvY29hLlJldGFpbkNvdW50LGRlYnVnLkV4cHJJbnNwZWN0aW9uIC1hbmFseXplci1zdG9yZT1yZWdpb24gLXZlcmlmeSAtV25vLW9iamMtcm9vdC1jbGFzcyAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsb3N4LmNvY29hLlJldGFpbkNvdW50LGRlYnVnLkV4cHJJbnNwZWN0aW9uIC1hbmFseXplci1zdG9yZT1yZWdpb24gLXZlcmlmeSAtV25vLW9iamMtcm9vdC1jbGFzcyAtZm9iamMtYXJjICVzCisKK3ZvaWQgY2xhbmdfYW5hbHl6ZXJfZXZhbChpbnQpOwogCiB0eXBlZGVmIHNpZ25lZCBjaGFyIEJPT0w7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBOU1VJbnRlZ2VyOwpAQCAtMTQsNiArMTcsNyBAQAogLShpZClhdXRvcmVsZWFzZTsKIC0oaWQpY29weTsKIC0oaWQpcmV0YWluOworLShvbmV3YXkgdm9pZClyZWxlYXNlOwogQGVuZAogQGludGVyZmFjZSBOU1N0cmluZyA6IE5TT2JqZWN0IDxOU0NvcHlpbmcsIE5TTXV0YWJsZUNvcHlpbmcsIE5TQ29kaW5nPgogLSAoTlNVSW50ZWdlcilsZW5ndGg7CkBAIC0zNiw2ICs0MCw4IEBACiBAZW5kCiAKIAorI2lmICFfX2hhc19mZWF0dXJlKG9iamNfYXJjKQorCiBAaW1wbGVtZW50YXRpb24gVGVzdDEKIAogQHN5bnRoZXNpemUgdGV4dDsKQEAgLTExNCw2ICsxMjAsOCBAQAogICByZXR1cm4gW3Jlc3VsdCBhdXRvcmVsZWFzZV07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tPYmplY3QgYXV0b3JlbGVhc2VkIHRvbyBtYW55IHRpbWVzfX0KIH0KIAorI2VuZGlmCisKIAogLy8gcmRhcjovLzY2MTE4NzMKIApAQCAtMTIxLDE4ICsxMjksMjMgQEAKICAgTlNTdHJpbmcgKl9uYW1lOwogfQogQHByb3BlcnR5IChyZXRhaW4pIE5TU3RyaW5nICogbmFtZTsKK0Bwcm9wZXJ0eSAoYXNzaWduKSBpZCBmcmllbmQ7CiBAZW5kCiAKIEBpbXBsZW1lbnRhdGlvbiBQZXJzb24KIEBzeW50aGVzaXplIG5hbWUgPSBfbmFtZTsKIEBlbmQKIAorI2lmICFfX2hhc19mZWF0dXJlKG9iamNfYXJjKQogdm9pZCByZGFyNjYxMTg3MygpIHsKICAgUGVyc29uICpwID0gW1tbUGVyc29uIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07CiAgIAogICBwLm5hbWUgPSBbW05TU3RyaW5nIHN0cmluZ10gcmV0YWluXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2xlYWt9fQogICBwLm5hbWUgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0XTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2xlYWt9fQorCisgIHAuZnJpZW5kID0gW1tQZXJzb24gYWxsb2NdIGluaXRdOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bGVha319CiB9CisjZW5kaWYKIAogQGludGVyZmFjZSBTdWJQZXJzb24gOiBQZXJzb24KIC0oTlNTdHJpbmcgKilmb287CkBAIC0xNDQsNiArMTU3LDggQEAKIH0KIEBlbmQKIAorCisjaWYgIV9faGFzX2ZlYXR1cmUob2JqY19hcmMpCiAvLyA8cmRhcjovL3Byb2JsZW0vOTI0MTE4MD4gU3RhdGljIGFuYWx5emVyIGRvZXNuJ3QgZGV0ZWN0IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgaXNzdWVzIGZvciBwcm9wZXJ0eSBhY2Nlc3NlcwogQGludGVyZmFjZSBSRGFyOTI0MTE4MAogQHByb3BlcnR5IChyZWFkd3JpdGUsYXNzaWduKSBpZCB4OwpAQCAtMTY0LDUgKzE3OSwxNjggQEAKICAgc2VsZi54ID0geTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tBcmd1bWVudCBmb3IgcHJvcGVydHkgc2V0dGVyIGlzIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQogfQogQGVuZAorI2VuZGlmCiAKIAorLy8tLS0tLS0KKy8vIFByb3BlcnR5IGFjY2Vzc29yIHN5bnRoZXNpcworLy8tLS0tLS0KKworZXh0ZXJuIHZvaWQgZG9Tb21ldGhpbmdXaXRoUGVyc29uKFBlcnNvbiAqcCk7CitleHRlcm4gdm9pZCBkb1NvbWV0aGluZ1dpdGhOYW1lKE5TU3RyaW5nICpuYW1lKTsKKwordm9pZCB0ZXN0Q29uc2lzdGVuY3lSZXRhaW4oUGVyc29uICpwKSB7CisgIGNsYW5nX2FuYWx5emVyX2V2YWwocC5uYW1lID09IHAubmFtZSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQorCisgIGlkIG9yaWdOYW1lID0gcC5uYW1lOworICBjbGFuZ19hbmFseXplcl9ldmFsKHAubmFtZSA9PSBvcmlnTmFtZSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQorICBkb1NvbWV0aGluZ1dpdGhQZXJzb24ocCk7CisgIGNsYW5nX2FuYWx5emVyX2V2YWwocC5uYW1lID09IG9yaWdOYW1lKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VU5LTk9XTn19Cit9CisKK3ZvaWQgdGVzdENvbnNpc3RlbmN5QXNzaWduKFBlcnNvbiAqcCkgeworICBjbGFuZ19hbmFseXplcl9ldmFsKHAuZnJpZW5kID09IHAuZnJpZW5kKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19CisKKyAgaWQgb3JpZ0ZyaWVuZCA9IHAuZnJpZW5kOworICBjbGFuZ19hbmFseXplcl9ldmFsKHAuZnJpZW5kID09IG9yaWdGcmllbmQpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tUUlVFfX0KKyAgZG9Tb21ldGhpbmdXaXRoUGVyc29uKHApOworICBjbGFuZ19hbmFseXplcl9ldmFsKHAuZnJpZW5kID09IG9yaWdGcmllbmQpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tVTktOT1dOfX0KK30KKworI2lmICFfX2hhc19mZWF0dXJlKG9iamNfYXJjKQordm9pZCB0ZXN0T3ZlcnJlbGVhc2UoUGVyc29uICpwLCBpbnQgY29pbikgeworICBzd2l0Y2ggKGNvaW4pIHsKKyAgY2FzZSAwOgorICAgIFtwLm5hbWUgcmVsZWFzZV07IC8vIGV4cGVjdGVkLXdhcm5pbmd7e25vdCBvd25lZH19CisgICAgYnJlYWs7CisgIGNhc2UgMToKKyAgICBbcC5mcmllbmQgcmVsZWFzZV07IC8vIGV4cGVjdGVkLXdhcm5pbmd7e25vdCBvd25lZH19CisgICAgYnJlYWs7CisgIGNhc2UgMjogeworICAgIGlkIGZyaWVuZCA9IHAuZnJpZW5kOworICAgIGRvU29tZXRoaW5nV2l0aFBlcnNvbihwKTsKKyAgICBbZnJpZW5kIHJlbGVhc2VdOyAvLyBleHBlY3RlZC13YXJuaW5ne3tub3Qgb3duZWR9fQorICB9CisgIH0KK30KKworLy8gPHJkYXI6Ly9wcm9ibGVtLzE2MzMzMzY4PgorQGltcGxlbWVudGF0aW9uIFBlcnNvbiAoUmRhcjE2MzMzMzY4KQorCistICh2b2lkKXRlc3REZWxpYmVyYXRlUmVsZWFzZTooUGVyc29uICopb3RoZXIgeworICBkb1NvbWV0aGluZ1dpdGhOYW1lKHNlbGYubmFtZSk7CisgIFtfbmFtZSByZWxlYXNlXTsgLy8gbm8td2FybmluZworICBzZWxmLT5fbmFtZSA9IDA7CisKKyAgZG9Tb21ldGhpbmdXaXRoTmFtZShvdGhlci0+X25hbWUpOworICBbb3RoZXIubmFtZSByZWxlYXNlXTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7bm90IG93bmVkfX0KK30KKworLSAodm9pZClkZWxpYmVyYXRlUmVsZWFzZUZhbHNlTmVnYXRpdmUgeworICAvLyBUaGlzIGlzIGFyZ3VhYmx5IGEgZmFsc2UgbmVnYXRpdmUgYmVjYXVzZSB0aGUgcmVzdWx0IG9mIHAuZnJpZW5kIHNob3VsZG4ndAorICAvLyBiZSByZWxlYXNlZCwgZXZlbiB0aG91Z2ggd2UgYXJlIG1hbmlwdWxhdGluZyB0aGUgaXZhciBpbiBiZXR3ZWVuIHRoZSB0d28KKyAgLy8gYWN0aW9ucy4KKyAgaWQgbmFtZSA9IHNlbGYubmFtZTsKKyAgX25hbWUgPSAwOworICBbbmFtZSByZWxlYXNlXTsKK30KKworLSAodm9pZCl0ZXN0UmV0YWluQW5kUmVsZWFzZSB7CisgIFtzZWxmLm5hbWUgcmV0YWluXTsKKyAgW3NlbGYubmFtZSByZWxlYXNlXTsKKyAgW3NlbGYubmFtZSByZWxlYXNlXTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7bm90IG93bmVkfX0KK30KKworLSAodm9pZCl0ZXN0UmV0YWluQW5kUmVsZWFzZUlWYXIgeworICBbc2VsZi5uYW1lIHJldGFpbl07CisgIFtfbmFtZSByZWxlYXNlXTsKKyAgW19uYW1lIHJlbGVhc2VdOyAvLyBleHBlY3RlZC13YXJuaW5ne3tub3Qgb3duZWR9fQorfQorCitAZW5kCisjZW5kaWYKKworQGludGVyZmFjZSBJbnRXcmFwcGVyCitAcHJvcGVydHkgaW50IHZhbHVlOworQGVuZAorCitAaW1wbGVtZW50YXRpb24gSW50V3JhcHBlcgorQHN5bnRoZXNpemUgdmFsdWU7CitAZW5kCisKK3ZvaWQgdGVzdENvbnNpc3RlbmN5SW50KEludFdyYXBwZXIgKncpIHsKKyAgY2xhbmdfYW5hbHl6ZXJfZXZhbCh3LnZhbHVlID09IHcudmFsdWUpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tUUlVFfX0KKworICBpbnQgb3JpZ1ZhbHVlID0gdy52YWx1ZTsKKyAgaWYgKG9yaWdWYWx1ZSAhPSA0MikKKyAgICByZXR1cm47CisKKyAgY2xhbmdfYW5hbHl6ZXJfZXZhbCh3LnZhbHVlID09IDQyKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19Cit9CisKK3ZvaWQgdGVzdENvbnNpc3RlbmN5SW50MihJbnRXcmFwcGVyICp3KSB7CisgIGlmICh3LnZhbHVlICE9IDQyKQorICAgIHJldHVybjsKKworICBjbGFuZ19hbmFseXplcl9ldmFsKHcudmFsdWUgPT0gNDIpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tUUlVFfX0KK30KKworCitAaW50ZXJmYWNlIEludFdyYXBwZXJBdXRvCitAcHJvcGVydHkgaW50IHZhbHVlOworQGVuZAorCitAaW1wbGVtZW50YXRpb24gSW50V3JhcHBlckF1dG8KK0BlbmQKKwordm9pZCB0ZXN0Q29uc2lzdGVuY3lJbnRBdXRvKEludFdyYXBwZXJBdXRvICp3KSB7CisgIGNsYW5nX2FuYWx5emVyX2V2YWwody52YWx1ZSA9PSB3LnZhbHVlKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19CisKKyAgaW50IG9yaWdWYWx1ZSA9IHcudmFsdWU7CisgIGlmIChvcmlnVmFsdWUgIT0gNDIpCisgICAgcmV0dXJuOworCisgIGNsYW5nX2FuYWx5emVyX2V2YWwody52YWx1ZSA9PSA0Mik7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQorfQorCit2b2lkIHRlc3RDb25zaXN0ZW5jeUludEF1dG8yKEludFdyYXBwZXJBdXRvICp3KSB7CisgIGlmICh3LnZhbHVlICE9IDQyKQorICAgIHJldHVybjsKKworICBjbGFuZ19hbmFseXplcl9ldmFsKHcudmFsdWUgPT0gNDIpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tUUlVFfX0KK30KKworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB2YWx1ZTsKK30gSW50V3JhcHBlclN0cnVjdDsKKworQGludGVyZmFjZSBTdHJ1Y3RXcmFwcGVyCitAcHJvcGVydHkgSW50V3JhcHBlclN0cnVjdCBpbm5lcjsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFN0cnVjdFdyYXBwZXIKK0BzeW50aGVzaXplIGlubmVyOworQGVuZAorCit2b2lkIHRlc3RDb25zaXN0ZW5jeVN0cnVjdChTdHJ1Y3RXcmFwcGVyICp3KSB7CisgIGNsYW5nX2FuYWx5emVyX2V2YWwody5pbm5lci52YWx1ZSA9PSB3LmlubmVyLnZhbHVlKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19CisKKyAgaW50IG9yaWdWYWx1ZSA9IHcuaW5uZXIudmFsdWU7CisgIGlmIChvcmlnVmFsdWUgIT0gNDIpCisgICAgcmV0dXJuOworCisgIGNsYW5nX2FuYWx5emVyX2V2YWwody5pbm5lci52YWx1ZSA9PSA0Mik7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQorfQorCisKK0BpbnRlcmZhY2UgT3BhcXVlSW50V3JhcHBlcgorQHByb3BlcnR5IGludCB2YWx1ZTsKK0BlbmQKKworLy8gRm9yIG5vdywgZG9uJ3QgYXNzdW1lIGEgcHJvcGVydHkgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYW4gaXZhciB1bmxlc3Mgd2UgY2FuCisvLyBhY3R1YWxseSBzZWUgdGhhdCBpdCBpcy4KK3ZvaWQgdGVzdE9wYXF1ZUNvbnNpc3RlbmN5KE9wYXF1ZUludFdyYXBwZXIgKncpIHsKKyAgY2xhbmdfYW5hbHl6ZXJfZXZhbCh3LnZhbHVlID09IHcudmFsdWUpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tVTktOT1dOfX0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9wcm9wZXJ0aWVzLm1tIGIvdGVzdC9BbmFseXNpcy9wcm9wZXJ0aWVzLm1tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OWQwMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0FuYWx5c2lzL3Byb3BlcnRpZXMubW0KQEAgLTAsMCArMSw3OSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsb3N4LmNvY29hLlJldGFpbkNvdW50LGRlYnVnLkV4cHJJbnNwZWN0aW9uIC1hbmFseXplci1zdG9yZT1yZWdpb24gLXZlcmlmeSAtV25vLW9iamMtcm9vdC1jbGFzcyAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsb3N4LmNvY29hLlJldGFpbkNvdW50LGRlYnVnLkV4cHJJbnNwZWN0aW9uIC1hbmFseXplci1zdG9yZT1yZWdpb24gLXZlcmlmeSAtV25vLW9iamMtcm9vdC1jbGFzcyAtZm9iamMtYXJjICVzCisKK3ZvaWQgY2xhbmdfYW5hbHl6ZXJfZXZhbChib29sKTsKK3ZvaWQgY2xhbmdfYW5hbHl6ZXJfY2hlY2tJbmxpbmVkKGJvb2wpOworCitAaW50ZXJmYWNlIEludFdyYXBwZXIKK0Bwcm9wZXJ0eSAocmVhZG9ubHkpIGludCAmdmFsdWU7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBJbnRXcmFwcGVyCitAc3ludGhlc2l6ZSB2YWx1ZTsKK0BlbmQKKwordm9pZCB0ZXN0UmVmZXJlbmNlQ29uc2lzdGVuY3koSW50V3JhcHBlciAqdykgeworICBjbGFuZ19hbmFseXplcl9ldmFsKHcudmFsdWUgPT0gdy52YWx1ZSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQorICBjbGFuZ19hbmFseXplcl9ldmFsKCZ3LnZhbHVlID09ICZ3LnZhbHVlKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19CisKKyAgaWYgKHcudmFsdWUgIT0gNDIpCisgICAgcmV0dXJuOworCisgIGNsYW5nX2FuYWx5emVyX2V2YWwody52YWx1ZSA9PSA0Mik7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQorfQorCit2b2lkIHRlc3RSZWZlcmVuY2VBc3NpZ25tZW50KEludFdyYXBwZXIgKncpIHsKKyAgdy52YWx1ZSA9IDQyOworICBjbGFuZ19hbmFseXplcl9ldmFsKHcudmFsdWUgPT0gNDIpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tUUlVFfX0KK30KKworCitzdHJ1Y3QgSW50V3JhcHBlclN0cnVjdCB7CisgIGludCB2YWx1ZTsKK307CisKK0BpbnRlcmZhY2UgU3RydWN0V3JhcHBlcgorQHByb3BlcnR5IEludFdyYXBwZXJTdHJ1Y3QgaW5uZXI7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTdHJ1Y3RXcmFwcGVyCitAc3ludGhlc2l6ZSBpbm5lcjsKK0BlbmQKKwordm9pZCB0ZXN0Q29uc2lzdGVuY3lTdHJ1Y3QoU3RydWN0V3JhcHBlciAqdykgeworICBjbGFuZ19hbmFseXplcl9ldmFsKHcuaW5uZXIudmFsdWUgPT0gdy5pbm5lci52YWx1ZSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQorCisgIGludCBvcmlnVmFsdWUgPSB3LmlubmVyLnZhbHVlOworICBpZiAob3JpZ1ZhbHVlICE9IDQyKQorICAgIHJldHVybjsKKworICBjbGFuZ19hbmFseXplcl9ldmFsKHcuaW5uZXIudmFsdWUgPT0gNDIpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tUUlVFfX0KK30KKworCitjbGFzcyBDdXN0b21Db3B5IHsKK3B1YmxpYzoKKyAgQ3VzdG9tQ29weSgpIDogdmFsdWUoMCkge30KKyAgQ3VzdG9tQ29weShjb25zdCBDdXN0b21Db3B5ICZvdGhlcikgOiB2YWx1ZShvdGhlci52YWx1ZSkgeworICAgIGNsYW5nX2FuYWx5emVyX2NoZWNrSW5saW5lZCh0cnVlKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19CisgIH0KKyAgaW50IHZhbHVlOworfTsKKworQGludGVyZmFjZSBDdXN0b21Db3B5V3JhcHBlcgorQHByb3BlcnR5IEN1c3RvbUNvcHkgaW5uZXI7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBDdXN0b21Db3B5V3JhcHBlcgorLy9Ac3ludGhlc2l6ZSBpbm5lcjsKK0BlbmQKKwordm9pZCB0ZXN0Q29uc2lzdGVuY3lDdXN0b21Db3B5KEN1c3RvbUNvcHlXcmFwcGVyICp3KSB7CisgIGNsYW5nX2FuYWx5emVyX2V2YWwody5pbm5lci52YWx1ZSA9PSB3LmlubmVyLnZhbHVlKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7VFJVRX19CisKKyAgaW50IG9yaWdWYWx1ZSA9IHcuaW5uZXIudmFsdWU7CisgIGlmIChvcmlnVmFsdWUgIT0gNDIpCisgICAgcmV0dXJuOworCisgIGNsYW5nX2FuYWx5emVyX2V2YWwody5pbm5lci52YWx1ZSA9PSA0Mik7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9wdGhyZWFkbG9jay5jIGIvdGVzdC9BbmFseXNpcy9wdGhyZWFkbG9jay5jCmluZGV4IGI5MDQ3NzQuLjJhNTllMGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvcHRocmVhZGxvY2suYworKysgYi90ZXN0L0FuYWx5c2lzL3B0aHJlYWRsb2NrLmMKQEAgLTYsMTcgKzYsMzEgQEAKIAl2b2lkCSpmb287CiB9IHB0aHJlYWRfbXV0ZXhfdDsKIAordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQJKmZvbzsKK30gcHRocmVhZF9tdXRleGF0dHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQJKmZvbzsKK30gbGNrX2dycF90OworCiB0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBsY2tfbXR4X3Q7CiAKIGV4dGVybiBpbnQgcHRocmVhZF9tdXRleF9sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqKTsKIGV4dGVybiBpbnQgcHRocmVhZF9tdXRleF91bmxvY2socHRocmVhZF9tdXRleF90ICopOwogZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X3RyeWxvY2socHRocmVhZF9tdXRleF90ICopOworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kocHRocmVhZF9tdXRleF90ICopOworZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleF90ICAqbXV0ZXgsIGNvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKm11dGV4YXR0cik7CiBleHRlcm4gaW50IGxja19tdHhfbG9jayhsY2tfbXR4X3QgKik7CiBleHRlcm4gaW50IGxja19tdHhfdW5sb2NrKGxja19tdHhfdCAqKTsKIGV4dGVybiBpbnQgbGNrX210eF90cnlfbG9jayhsY2tfbXR4X3QgKik7CitleHRlcm4gdm9pZCBsY2tfbXR4X2Rlc3Ryb3kobGNrX210eF90ICpsY2ssIGxja19ncnBfdCAqZ3JwKTsKIAogcHRocmVhZF9tdXRleF90IG10eDEsIG10eDI7CiBsY2tfbXR4X3QgbGNrMSwgbGNrMjsKK2xja19ncnBfdCBncnAxOworCisjZGVmaW5lIE5VTEwgMAogCiB2b2lkCiBvazEodm9pZCkKQEAgLTY5LDYgKzgzLDEwNyBAQAogfQogCiB2b2lkCitvazgodm9pZCkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJm10eDEpOwkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF9sb2NrKCZtdHgyKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgyKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgxKTsJLy8gbm8td2FybmluZworfQorCit2b2lkCitvazkodm9pZCkKK3sKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbXR4MSk7CQkvLyBuby13YXJuaW5nCisJaWYgKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmbXR4MSkgPT0gMCkJLy8gbm8td2FybmluZworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbXR4MSk7CS8vIG5vLXdhcm5pbmcKK30KKwordm9pZAorb2sxMCh2b2lkKQoreworCWlmIChwdGhyZWFkX211dGV4X3RyeWxvY2soJm10eDEpICE9IDApCS8vIG5vLXdhcm5pbmcKKwkJcHRocmVhZF9tdXRleF9sb2NrKCZtdHgxKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgxKTsJCS8vIG5vLXdhcm5pbmcKK30KKwordm9pZAorb2sxMSh2b2lkKQoreworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXR4MSk7CS8vIG5vLXdhcm5pbmcKK30KKwordm9pZAorb2sxMih2b2lkKQoreworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXR4MSk7CS8vIG5vLXdhcm5pbmcKKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm10eDIpOwkvLyBuby13YXJuaW5nCit9CisKK3ZvaWQKK29rMTModm9pZCkKK3sKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbXR4MSk7CS8vIG5vLXdhcm5pbmcKKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm10eDEpOwkvLyBuby13YXJuaW5nCit9CisKK3ZvaWQKK29rMTQodm9pZCkKK3sKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbXR4MSk7CS8vIG5vLXdhcm5pbmcKKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm10eDEpOwkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF91bmxvY2soJm10eDIpOwkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdHgyKTsJLy8gbm8td2FybmluZworfQorCit2b2lkCitvazE1KHZvaWQpCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZtdHgxKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgxKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXR4MSk7CS8vIG5vLXdhcm5pbmcKK30KKwordm9pZAorb2sxNih2b2lkKQoreworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbXR4MSwgTlVMTCk7CS8vIG5vLXdhcm5pbmcKK30KKwordm9pZAorb2sxNyh2b2lkKQoreworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbXR4MSwgTlVMTCk7CS8vIG5vLXdhcm5pbmcKKwlwdGhyZWFkX211dGV4X2luaXQoJm10eDIsIE5VTEwpOwkvLyBuby13YXJuaW5nCit9CisKK3ZvaWQKK29rMTgodm9pZCkKK3sKKwlwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm10eDEpOwkJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbXR4MSwgTlVMTCk7CS8vIG5vLXdhcm5pbmcKK30KKwordm9pZAorb2sxOSh2b2lkKQoreworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXR4MSk7CQkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF9pbml0KCZtdHgxLCBOVUxMKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXR4Mik7CQkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF9pbml0KCZtdHgyLCBOVUxMKTsJLy8gbm8td2FybmluZworfQorCit2b2lkCitvazIwKHZvaWQpCit7CisJcHRocmVhZF9tdXRleF91bmxvY2soJm10eDEpOwkJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXR4MSk7CQkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF9pbml0KCZtdHgxLCBOVUxMKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXR4MSk7CQkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF9pbml0KCZtdHgxLCBOVUxMKTsJLy8gbm8td2FybmluZworfQorCit2b2lkCiBiYWQxKHZvaWQpCiB7CiAJcHRocmVhZF9tdXRleF9sb2NrKCZtdHgxKTsJLy8gbm8td2FybmluZwpAQCAtMTM1LDMgKzI1MCwxNTEgQEAKIAlsY2tfbXR4X2xvY2soJmxjazIpOwkJLy8gbm8td2FybmluZwogCWxja19tdHhfdW5sb2NrKCZsY2sxKTsJCS8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoaXMgd2FzIG5vdCB0aGUgbW9zdCByZWNlbnRseSBhY3F1aXJlZCBsb2NrfX0KIH0KKwordm9pZAorYmFkOSh2b2lkKQoreworCWxja19tdHhfdW5sb2NrKCZsY2sxKTsJCS8vIG5vLXdhcm5pbmcKKwlsY2tfbXR4X3VubG9jaygmbGNrMSk7CQkvLyBleHBlY3RlZC13YXJuaW5ne3tUaGlzIGxvY2sgaGFzIGFscmVhZHkgYmVlbiB1bmxvY2tlZH19Cit9CisKK3ZvaWQKK2JhZDEwKHZvaWQpCit7CisJbGNrX210eF9sb2NrKCZsY2sxKTsJCS8vIG5vLXdhcm5pbmcKKwlsY2tfbXR4X3VubG9jaygmbGNrMSk7CQkvLyBuby13YXJuaW5nCisJbGNrX210eF91bmxvY2soJmxjazEpOwkJLy8gZXhwZWN0ZWQtd2FybmluZ3t7VGhpcyBsb2NrIGhhcyBhbHJlYWR5IGJlZW4gdW5sb2NrZWR9fQorfQorCitzdGF0aWMgdm9pZAorYmFkMTFfc3ViKHB0aHJlYWRfbXV0ZXhfdCAqbG9jaykKK3sKKwlsY2tfbXR4X3VubG9jayhsb2NrKTsJCS8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoaXMgbG9jayBoYXMgYWxyZWFkeSBiZWVuIHVubG9ja2VkfX0KK30KKwordm9pZAorYmFkMTEoaW50IGkpCit7CisJbGNrX210eF9sb2NrKCZsY2sxKTsJCS8vIG5vLXdhcm5pbmcKKwlsY2tfbXR4X3VubG9jaygmbGNrMSk7CQkvLyBuby13YXJuaW5nCisJaWYgKGkgPCA1KQorCQliYWQxMV9zdWIoJmxjazEpOworfQorCit2b2lkCitiYWQxMih2b2lkKQoreworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbXR4MSk7CS8vIG5vLXdhcm5pbmcKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbXR4MSk7CS8vIG5vLXdhcm5pbmcKKwlwdGhyZWFkX211dGV4X2xvY2soJm10eDEpOwkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF91bmxvY2soJm10eDEpOwkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF91bmxvY2soJm10eDEpOwkvLyBleHBlY3RlZC13YXJuaW5ne3tUaGlzIGxvY2sgaGFzIGFscmVhZHkgYmVlbiB1bmxvY2tlZH19Cit9CisKK3ZvaWQKK2JhZDEzKHZvaWQpCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZtdHgxKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgxKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbXR4Mik7CS8vIG5vLXdhcm5pbmcKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbXR4Mik7CS8vIG5vLXdhcm5pbmcKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbXR4MSk7CS8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoaXMgbG9jayBoYXMgYWxyZWFkeSBiZWVuIHVubG9ja2VkfX0KK30KKwordm9pZAorYmFkMTQodm9pZCkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJm10eDEpOwkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF9sb2NrKCZtdHgyKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgyKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgxKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgyKTsJLy8gZXhwZWN0ZWQtd2FybmluZ3t7VGhpcyBsb2NrIGhhcyBhbHJlYWR5IGJlZW4gdW5sb2NrZWR9fQorfQorCit2b2lkCitiYWQxNSh2b2lkKQoreworCXB0aHJlYWRfbXV0ZXhfbG9jaygmbXR4MSk7CS8vIG5vLXdhcm5pbmcKKwlwdGhyZWFkX211dGV4X2xvY2soJm10eDIpOwkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF91bmxvY2soJm10eDIpOwkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF91bmxvY2soJm10eDEpOwkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF9sb2NrKCZtdHgxKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdHgyKTsJLy8gZXhwZWN0ZWQtd2FybmluZ3t7VGhpcyBsb2NrIGhhcyBhbHJlYWR5IGJlZW4gdW5sb2NrZWR9fQorfQorCit2b2lkCitiYWQxNih2b2lkKQoreworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXR4MSk7CS8vIG5vLXdhcm5pbmcKKwlwdGhyZWFkX211dGV4X2xvY2soJm10eDEpOwkvLyBleHBlY3RlZC13YXJuaW5ne3tUaGlzIGxvY2sgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWR9fQorfQorCit2b2lkCitiYWQxNyh2b2lkKQoreworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXR4MSk7CS8vIG5vLXdhcm5pbmcKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbXR4MSk7CS8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoaXMgbG9jayBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZH19Cit9CisKK3ZvaWQKK2JhZDE4KHZvaWQpCit7CisJcHRocmVhZF9tdXRleF9kZXN0cm95KCZtdHgxKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXR4MSk7CS8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoaXMgbG9jayBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZH19Cit9CisKK3ZvaWQKK2JhZDE5KHZvaWQpCit7CisJcHRocmVhZF9tdXRleF9sb2NrKCZtdHgxKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXR4MSk7CS8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoaXMgbG9jayBpcyBzdGlsbCBsb2NrZWR9fQorfQorCit2b2lkCitiYWQyMCh2b2lkKQoreworCWxja19tdHhfZGVzdHJveSgmbXR4MSwgJmdycDEpOwkvLyBuby13YXJuaW5nCisJbGNrX210eF9sb2NrKCZtdHgxKTsJCS8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoaXMgbG9jayBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZH19Cit9CisKK3ZvaWQKK2JhZDIxKHZvaWQpCit7CisJbGNrX210eF9kZXN0cm95KCZtdHgxLCAmZ3JwMSk7CS8vIG5vLXdhcm5pbmcKKwlsY2tfbXR4X3VubG9jaygmbXR4MSk7CQkvLyBleHBlY3RlZC13YXJuaW5ne3tUaGlzIGxvY2sgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWR9fQorfQorCit2b2lkCitiYWQyMih2b2lkKQoreworCWxja19tdHhfZGVzdHJveSgmbXR4MSwgJmdycDEpOwkvLyBuby13YXJuaW5nCisJbGNrX210eF9kZXN0cm95KCZtdHgxLCAmZ3JwMSk7CS8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoaXMgbG9jayBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZH19Cit9CisKK3ZvaWQKK2JhZDIzKHZvaWQpCit7CisJbGNrX210eF9sb2NrKCZtdHgxKTsJCS8vIG5vLXdhcm5pbmcKKwlsY2tfbXR4X2Rlc3Ryb3koJm10eDEsICZncnAxKTsJLy8gZXhwZWN0ZWQtd2FybmluZ3t7VGhpcyBsb2NrIGlzIHN0aWxsIGxvY2tlZH19Cit9CisKK3ZvaWQKK2JhZDI0KHZvaWQpCit7CisJcHRocmVhZF9tdXRleF9pbml0KCZtdHgxLCBOVUxMKTsJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbXR4MSwgTlVMTCk7CS8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoaXMgbG9jayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkfX0KK30KKwordm9pZAorYmFkMjUodm9pZCkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJm10eDEpOwkJLy8gbm8td2FybmluZworCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbXR4MSwgTlVMTCk7CS8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoaXMgbG9jayBpcyBzdGlsbCBiZWluZyBoZWxkfX0KK30KKwordm9pZAorYmFkMjYodm9pZCkKK3sKKwlwdGhyZWFkX211dGV4X3VubG9jaygmbXR4MSk7CQkvLyBuby13YXJuaW5nCisJcHRocmVhZF9tdXRleF9pbml0KCZtdHgxLCBOVUxMKTsJLy8gZXhwZWN0ZWQtd2FybmluZ3t7VGhpcyBsb2NrIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWR9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9wdHItYXJpdGguYyBiL3Rlc3QvQW5hbHlzaXMvcHRyLWFyaXRoLmMKaW5kZXggNGExNWJjMi4uOTZkYzhiYSAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9wdHItYXJpdGguYworKysgYi90ZXN0L0FuYWx5c2lzL3B0ci1hcml0aC5jCkBAIC0xLDUgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWFscGhhLmNvcmUuRml4ZWRBZGRyLGFscGhhLmNvcmUuUG9pbnRlckFyaXRobSxhbHBoYS5jb3JlLlBvaW50ZXJTdWIsZGVidWcuRXhwckluc3BlY3Rpb24gLWFuYWx5emVyLXN0b3JlPXJlZ2lvbiAtdmVyaWZ5IC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjkgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1hbHBoYS5jb3JlLkZpeGVkQWRkcixhbHBoYS5jb3JlLlBvaW50ZXJBcml0aG0sYWxwaGEuY29yZS5Qb2ludGVyU3ViLGRlYnVnLkV4cHJJbnNwZWN0aW9uIC1hbmFseXplci1zdG9yZT1yZWdpb24gLXZlcmlmeSAtdHJpcGxlIGk2ODYtYXBwbGUtZGFyd2luOSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWFscGhhLmNvcmUuRml4ZWRBZGRyLGFscGhhLmNvcmUuUG9pbnRlckFyaXRobSxhbHBoYS5jb3JlLlBvaW50ZXJTdWIsZGVidWcuRXhwckluc3BlY3Rpb24gLWFuYWx5emVyLXN0b3JlPXJlZ2lvbiAtdmVyaWZ5IC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjkgLVduby10YXV0b2xvZ2ljYWwtcG9pbnRlci1jb21wYXJlICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9YWxwaGEuY29yZS5GaXhlZEFkZHIsYWxwaGEuY29yZS5Qb2ludGVyQXJpdGhtLGFscGhhLmNvcmUuUG9pbnRlclN1YixkZWJ1Zy5FeHBySW5zcGVjdGlvbiAtYW5hbHl6ZXItc3RvcmU9cmVnaW9uIC12ZXJpZnkgLXRyaXBsZSBpNjg2LWFwcGxlLWRhcndpbjkgLVduby10YXV0b2xvZ2ljYWwtcG9pbnRlci1jb21wYXJlICVzCiAKIHZvaWQgY2xhbmdfYW5hbHl6ZXJfZXZhbChpbnQpOwogCmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL3JlZ2lvbi0xLm0gYi90ZXN0L0FuYWx5c2lzL3JlZ2lvbi0xLm0KaW5kZXggOWVkYjM1Yi4uNjk0MGM2OSAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9yZWdpb24tMS5tCisrKyBiL3Rlc3QvQW5hbHlzaXMvcmVnaW9uLTEubQpAQCAtMjUsNyArMjUsNyBAQAogQ0tfVU5SRVNUUklDVEVEPSAwLCAgICAgQ0tfUkVBRF9PTkxZLCAgICAgQ0tfQUREX09OTFksICAgICBDS19SRU1PVkVfT05MWSB9OwogQHByb3RvY29sIEVjb0NsYXNzIDxFY29CZWhhdmlvcmVkQ2xhc3NpZmllcj4gICAgICAtIChOU0FycmF5ICopIG93bmVkQXR0cmlidXRlczsKIEBlbmQgQHByb3RvY29sIEVjb05hbWVzcGFjZTsKLUBwcm90b2NvbCBFY29UeXBlOworQHByb3RvY29sIEVjb1R5cGUgQGVuZDsKIEBwcm90b2NvbCBFY29DbGFzc2lmaWVyIDxFY29OYW1lc3BhY2UsRWNvVHlwZT4gICAgLSAoTlNBcnJheSAqKSBmZWF0dXJlczsgCiBAZW5kIEBwcm90b2NvbCBFY29Db21tZW50OwogQHByb3RvY29sIEVjb0VsZW1lbnQgPE5TT2JqZWN0PiAtIChOU0FycmF5ICopIG93bmVkRWxlbWVudHM7CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL3JldGFpbi1yZWxlYXNlLm0gYi90ZXN0L0FuYWx5c2lzL3JldGFpbi1yZWxlYXNlLm0KaW5kZXggYWFmZDk0ZS4uYWZlOTk3YiAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy9yZXRhaW4tcmVsZWFzZS5tCisrKyBiL3Rlc3QvQW5hbHlzaXMvcmV0YWluLXJlbGVhc2UubQpAQCAtMTk0LDggKzE5NCwxNSBAQAogQGVuZAogQGludGVyZmFjZSBOU011dGFibGVEaWN0aW9uYXJ5IDogTlNEaWN0aW9uYXJ5ICAtICh2b2lkKXJlbW92ZU9iamVjdEZvcktleTooaWQpYUtleTsKIC0gKHZvaWQpc2V0T2JqZWN0OihpZClhbk9iamVjdCBmb3JLZXk6KGlkKWFLZXk7Ci1AZW5kICBAaW50ZXJmYWNlIE5TTXV0YWJsZURpY3Rpb25hcnkgKE5TTXV0YWJsZURpY3Rpb25hcnlDcmVhdGlvbikgICsgKGlkKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci1AZW5kICB0eXBlZGVmIGRvdWJsZSBDR0Zsb2F0OworQGVuZAorQGludGVyZmFjZSBOU011dGFibGVEaWN0aW9uYXJ5IChOU011dGFibGVEaWN0aW9uYXJ5Q3JlYXRpb24pICArIChpZClkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOworQGVuZAorCitAaW50ZXJmYWNlIE5TTnVsbCA6IE5TT2JqZWN0CisrIChOU051bGwqKSBudWxsOworQGVuZAorCit0eXBlZGVmIGRvdWJsZSBDR0Zsb2F0Owogc3RydWN0IENHU2l6ZSB7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgQ0dTaXplIENHU2l6ZTsKQEAgLTIxMCw3ICsyMTcsNyBAQAogdHlwZWRlZiB2b2lkICgqSU9TZXJ2aWNlTWF0Y2hpbmdDYWxsYmFjaykoICB2b2lkICogcmVmY29uLCAgaW9faXRlcmF0b3JfdCBpdGVyYXRvciApOwogaW9fc2VydmljZV90IElPU2VydmljZUdldE1hdGNoaW5nU2VydmljZSggIG1hY2hfcG9ydF90IG1hc3RlclBvcnQsICBDRkRpY3Rpb25hcnlSZWYgbWF0Y2hpbmcgKTsKIGtlcm5fcmV0dXJuX3QgSU9TZXJ2aWNlR2V0TWF0Y2hpbmdTZXJ2aWNlcyggIG1hY2hfcG9ydF90IG1hc3RlclBvcnQsICBDRkRpY3Rpb25hcnlSZWYgbWF0Y2hpbmcsICBpb19pdGVyYXRvcl90ICogZXhpc3RpbmcgKTsKLWtlcm5fcmV0dXJuX3QgSU9TZXJ2aWNlQWRkTm90aWZpY2F0aW9uKCAgbWFjaF9wb3J0X3QgbWFzdGVyUG9ydCwgIGNvbnN0IGlvX25hbWVfdCBub3RpZmljYXRpb25UeXBlLCAgQ0ZEaWN0aW9uYXJ5UmVmIG1hdGNoaW5nLCAgbWFjaF9wb3J0X3Qgd2FrZVBvcnQsICB1aW50cHRyX3QgcmVmZXJlbmNlLCAgaW9faXRlcmF0b3JfdCAqIG5vdGlmaWNhdGlvbiApIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydJT1NlcnZpY2VBZGROb3RpZmljYXRpb24nIGRlY2xhcmVkIGhlcmV9fQora2Vybl9yZXR1cm5fdCBJT1NlcnZpY2VBZGROb3RpZmljYXRpb24oICBtYWNoX3BvcnRfdCBtYXN0ZXJQb3J0LCAgY29uc3QgaW9fbmFtZV90IG5vdGlmaWNhdGlvblR5cGUsICBDRkRpY3Rpb25hcnlSZWYgbWF0Y2hpbmcsICBtYWNoX3BvcnRfdCB3YWtlUG9ydCwgIHVpbnRwdHJfdCByZWZlcmVuY2UsICBpb19pdGVyYXRvcl90ICogbm90aWZpY2F0aW9uICkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J0lPU2VydmljZUFkZE5vdGlmaWNhdGlvbicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIGtlcm5fcmV0dXJuX3QgSU9TZXJ2aWNlQWRkTWF0Y2hpbmdOb3RpZmljYXRpb24oICBJT05vdGlmaWNhdGlvblBvcnRSZWYgbm90aWZ5UG9ydCwgIGNvbnN0IGlvX25hbWVfdCBub3RpZmljYXRpb25UeXBlLCAgQ0ZEaWN0aW9uYXJ5UmVmIG1hdGNoaW5nLCAgICAgICAgIElPU2VydmljZU1hdGNoaW5nQ2FsbGJhY2sgY2FsbGJhY2ssICAgICAgICAgdm9pZCAqIHJlZkNvbiwgIGlvX2l0ZXJhdG9yX3QgKiBub3RpZmljYXRpb24gKTsKIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgSU9TZXJ2aWNlTWF0Y2hpbmcoICBjb25zdCBjaGFyICogbmFtZSApOwogQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBJT1NlcnZpY2VOYW1lTWF0Y2hpbmcoICBjb25zdCBjaGFyICogbmFtZSApOwpAQCAtMzQ4LDcgKzM1NSw3IEBACiAKIE5TRGF0ZSogZ2xvYmFsX3g7CiAKLS8vIFRlc3QgdG8gc2VlIGlmIHdlIHN1cHJlc3NzIGFuIGVycm9yIHdoZW4gd2Ugc3RvcmUgdGhlIHBvaW50ZXIKKy8vIFRlc3QgdG8gc2VlIGlmIHdlIHN1cHByZXNzIGFuIGVycm9yIHdoZW4gd2Ugc3RvcmUgdGhlIHBvaW50ZXIKIC8vIHRvIGEgZ2xvYmFsLgogCiBDRkFic29sdXRlVGltZSBmMygpIHsKQEAgLTIxMjEsNiArMjEyOCwxNSBAQAogICAgIENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoMCwgImhlbGxvIHdvcmxkIiwga0NGU3RyaW5nRW5jb2RpbmdVVEY4KTsKIH0KIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEhhbmRsZSBOU051bGwKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK19fYXR0cmlidXRlX18oKG5zX3JldHVybnNfcmV0YWluZWQpKQoraWQgcmV0dXJuTlNOdWxsKCkgeworICByZXR1cm4gW05TTnVsbCBudWxsXTsgLy8gbm8td2FybmluZworfQorCiAvLyBDSEVDSzogIDxrZXk+ZGlhZ25vc3RpY3M8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgpAQCAtMjEzNCwxMiArMjE1MCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMTQ3LDEyICsyMTYzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMTYxLDQ0ICsyMTc3LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIyMDYsMTIgKzIxODgsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMjMxLDI1ICsyMjEzLDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzI1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMjYxLDcgKzIyNDMsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMjY5LDI0ICsyMjUxLDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjMwNiwxMiArMjI4OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMzE5LDM3NCArMjMwMSwxMyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UgY291bnQgZGVjcmVtZW50ZWQuIFRoZSBvYmplY3Qgbm93IGhhcyBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UgY291bnQgZGVjcmVtZW50ZWQuIFRoZSBvYmplY3Qgbm93IGhhcyBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgcmVsZWFzZWQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHJlbGVhc2VkPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMyOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZS1jb3VudGVkIG9iamVjdCBpcyB1c2VkIGFmdGVyIGl0IGlzIHJlbGVhc2VkPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZS1jb3VudGVkIG9iamVjdCBpcyB1c2VkIGFmdGVyIGl0IGlzIHJlbGVhc2VkPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlJlZmVyZW5jZS1jb3VudGVkIG9iamVjdCBpcyB1c2VkIGFmdGVyIGl0IGlzIHJlbGVhc2VkPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+VXNlLWFmdGVyLXJlbGVhc2U8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjE8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz43PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztDRkRhdGVDcmVhdGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGRGF0ZUNyZWF0ZSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CkBAIC0yNzExLDkzICsyMzMyLDE4IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UgY291bnQgaW5jcmVtZW50ZWQuIFRoZSBvYmplY3Qgbm93IGhhcyBhICsyIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UgY291bnQgaW5jcmVtZW50ZWQuIFRoZSBvYmplY3Qgbm93IGhhcyBhICsyIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yODE3LDEyICsyMzYzLDg3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjMzOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCByZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgcmVsZWFzZWQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zMzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjg0NCwxMSArMjQ2NSw0NSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CkBAIC0yODU2LDIzICsyNTExLDMxNiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZS1jb3VudGVkIG9iamVjdCBpcyB1c2VkIGFmdGVyIGl0IGlzIHJlbGVhc2VkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZS1jb3VudGVkIG9iamVjdCBpcyB1c2VkIGFmdGVyIGl0IGlzIHJlbGVhc2VkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlJlZmVyZW5jZS1jb3VudGVkIG9iamVjdCBpcyB1c2VkIGFmdGVyIGl0IGlzIHJlbGVhc2VkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+VXNlLWFmdGVyLXJlbGVhc2U8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz43PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztDRkRhdGVDcmVhdGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGRGF0ZUNyZWF0ZSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzQ3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzQ3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UgY291bnQgaW5jcmVtZW50ZWQuIFRoZSBvYmplY3Qgbm93IGhhcyBhICsyIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UgY291bnQgaW5jcmVtZW50ZWQuIFRoZSBvYmplY3Qgbm93IGhhcyBhICsyIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzQ4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzQ4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBkZWNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBkZWNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzQ4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM1MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzUwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzUwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM1MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM1MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjg5MiwxMiArMjg0MCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzUwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM1MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI5MDUsMTIgKzI4NTMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzQxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzUxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjkyNiwxMiArMjg3NCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzUxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM1MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI5MzksMTIgKzI4ODcsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzQxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzUxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI5NTYsNyArMjkwNCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM1MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTI5NjQsMTIgKzI5MTIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM1MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yOTkwLDcgKzI5MzgsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjc8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM1MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTMwMDYsMTIgKzI5NTQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzcxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMzAxOSwxMiArMjk2NywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzcyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMzAzMyw0NCArMjk4MSwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzcyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzcyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzcyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM3MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0zMDc4LDEyICsyOTkyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzcyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzgyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMzEwMywyNSArMzAxNywyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM3MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzgyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzc0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0zMTM3LDEyICszMDUxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzc0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM3NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMzE1MCwxMiArMzA2NCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzc0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0zMTY3LDcgKzMwODEsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0zMTc1LDEyICszMDg5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzc0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM3NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTMyMDAsMTIgKzMxMTQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzc0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0zMjEzLDEyICszMTI3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM3NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTMyMzQsMTIgKzMxNDgsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzc3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0zMjQ3LDEyICszMTYxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM3NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzc3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMzI2NCw3ICszMTc4LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzc3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTMyNzIsMTIgKzMxODYsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM3NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0zMjk1LDEwICszMjA5LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjU8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz43PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzc3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTMzMDcsNDQgKzMyMjEsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzgzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMzM1MiwxMiArMzIzMiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzgzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTMzNzcsMjI3ICszMjU3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzgzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzgzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMiByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMiByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgcmV0dXJuZWQgdG8gY2FsbGVyIGFzIGFuIG93bmluZyByZWZlcmVuY2UgKHNpbmdsZSByZXRhaW4gY291bnQgdHJhbnNmZXJyZWQgdG8gY2FsbGVyKTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgcmV0dXJuZWQgdG8gY2FsbGVyIGFzIGFuIG93bmluZyByZWZlcmVuY2UgKHNpbmdsZSByZXRhaW4gY291bnQgdHJhbnNmZXJyZWQgdG8gY2FsbGVyKTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zODU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM4NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7ZGF0ZSZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7ZGF0ZSZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5kZXNjcmlwdGlvbjwva2V5PjxzdHJpbmc+UG90ZW50aWFsIGxlYWsgb2YgYW4gb2JqZWN0IHN0b3JlZCBpbnRvICZhcG9zO2RhdGUmYXBvczs8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPmY2PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+NDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzg2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0zNjA1LDE1MSArMzI3MCwxMyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5MTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7Q0ZEYXRlQ3JlYXRlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztDRkRhdGVDcmVhdGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMiByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMiByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzk0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgpAQCAtMzc3NCw2ICszMzAxLDMyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzk0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzIgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzIgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzk0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHJldHVybmVkIHRvIGNhbGxlciBhcyBhbiBvd25pbmcgcmVmZXJlbmNlIChzaW5nbGUgcmV0YWluIGNvdW50IHRyYW5zZmVycmVkIHRvIGNhbGxlcik8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHJldHVybmVkIHRvIGNhbGxlciBhcyBhbiBvd25pbmcgcmVmZXJlbmNlIChzaW5nbGUgcmV0YWluIGNvdW50IHRyYW5zZmVycmVkIHRvIGNhbGxlcik8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2RhdGUmYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2RhdGUmYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdCBzdG9yZWQgaW50byAmYXBvcztkYXRlJmFwb3M7PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5mNjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDAxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztDRkRhdGVDcmVhdGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGRGF0ZUNyZWF0ZSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDAxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDAyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDAyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzIgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzIgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDAyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMzc5MSwxMCArMzYzNywxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPmY3PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+NDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTM4MTAsMTIgKzM2NTYsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMzgyMywxMiArMzY2OSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0zODM3LDQ0ICszNjgzLDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMzg4MiwxMiArMzY5NCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDAzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTM5MDcsMjcyICszNzE5LDEzIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MzkzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHJldHVybmVkIHRvIGNhbGxlciBhcyBhbiBvd25pbmcgcmVmZXJlbmNlIChzaW5nbGUgcmV0YWluIGNvdW50IHRyYW5zZmVycmVkIHRvIGNhbGxlcik8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHJldHVybmVkIHRvIGNhbGxlciBhcyBhbiBvd25pbmcgcmVmZXJlbmNlIChzaW5nbGUgcmV0YWluIGNvdW50IHRyYW5zZmVycmVkIHRvIGNhbGxlcik8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjM5NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+Mzk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7ZGF0ZSZhcG9zOyBpcyByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24gd2hvc2UgbmFtZSAoJmFwb3M7ZjcmYXBvczspIGRvZXMgbm90IGNvbnRhaW4gJmFwb3M7Q29weSZhcG9zOyBvciAmYXBvcztDcmVhdGUmYXBvczsuICBUaGlzIHZpb2xhdGVzIHRoZSBuYW1pbmcgY29udmVudGlvbiBydWxlcyBnaXZlbiBpbiB0aGUgTWVtb3J5IE1hbmFnZW1lbnQgR3VpZGUgZm9yIENvcmUgRm91bmRhdGlvbjwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkYXRlJmFwb3M7IGlzIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbiB3aG9zZSBuYW1lICgmYXBvcztmNyZhcG9zOykgZG9lcyBub3QgY29udGFpbiAmYXBvcztDb3B5JmFwb3M7IG9yICZhcG9zO0NyZWF0ZSZhcG9zOy4gIFRoaXMgdmlvbGF0ZXMgdGhlIG5hbWluZyBjb252ZW50aW9uIHJ1bGVzIGdpdmVuIGluIHRoZSBNZW1vcnkgTWFuYWdlbWVudCBHdWlkZSBmb3IgQ29yZSBGb3VuZGF0aW9uPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdCBzdG9yZWQgaW50byAmYXBvcztkYXRlJmFwb3M7PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhayBvZiByZXR1cm5lZCBvYmplY3Q8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+Zjc8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz40PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4zOTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDAyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7TXlEYXRlQ3JlYXRlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztNeURhdGVDcmVhdGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDAzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDAzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDAzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMiByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMiByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDAzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgpAQCAtNDIzNCw2ICszNzg3LDgxIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHJldHVybmVkIHRvIGNhbGxlciBhcyBhbiBvd25pbmcgcmVmZXJlbmNlIChzaW5nbGUgcmV0YWluIGNvdW50IHRyYW5zZmVycmVkIHRvIGNhbGxlcik8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7ZGF0ZSZhcG9zOyBpcyByZXR1cm5lZCBmcm9tIGEgZnVuY3Rpb24gd2hvc2UgbmFtZSAoJmFwb3M7ZjcmYXBvczspIGRvZXMgbm90IGNvbnRhaW4gJmFwb3M7Q29weSZhcG9zOyBvciAmYXBvcztDcmVhdGUmYXBvczsuICBUaGlzIHZpb2xhdGVzIHRoZSBuYW1pbmcgY29udmVudGlvbiBydWxlcyBnaXZlbiBpbiB0aGUgTWVtb3J5IE1hbmFnZW1lbnQgR3VpZGUgZm9yIENvcmUgRm91bmRhdGlvbjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkYXRlJmFwb3M7IGlzIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbiB3aG9zZSBuYW1lICgmYXBvcztmNyZhcG9zOykgZG9lcyBub3QgY29udGFpbiAmYXBvcztDb3B5JmFwb3M7IG9yICZhcG9zO0NyZWF0ZSZhcG9zOy4gIFRoaXMgdmlvbGF0ZXMgdGhlIG5hbWluZyBjb252ZW50aW9uIHJ1bGVzIGdpdmVuIGluIHRoZSBNZW1vcnkgTWFuYWdlbWVudCBHdWlkZSBmb3IgQ29yZSBGb3VuZGF0aW9uPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdCBzdG9yZWQgaW50byAmYXBvcztkYXRlJmFwb3M7PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhayBvZiByZXR1cm5lZCBvYmplY3Q8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+Zjc8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4zPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7TXlEYXRlQ3JlYXRlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztNeURhdGVDcmVhdGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KQEAgLTQyNDEsMTIgKzM4NjksMTYyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzIgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzIgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDE0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDE0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDE0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHJldHVybmVkIHRvIGNhbGxlciBhcyBhbiBvd25pbmcgcmVmZXJlbmNlIChzaW5nbGUgcmV0YWluIGNvdW50IHRyYW5zZmVycmVkIHRvIGNhbGxlcik8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHJldHVybmVkIHRvIGNhbGxlciBhcyBhbiBvd25pbmcgcmVmZXJlbmNlIChzaW5nbGUgcmV0YWluIGNvdW50IHRyYW5zZmVycmVkIHRvIGNhbGxlcik8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDE0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC00MjU0LDEyICs0MDMyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTQyNzEsNyArNDA0OSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTQyODcsMTAgKzQwNjUsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5mODwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC00MzA2LDEyICs0MDg0LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDA4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDE4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTQzMTksMTIgKzQwOTcsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDA5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtNDMzNiw3ICs0MTE0LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDA5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtNDM0NCwxMiArNDEyMiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC00MzU3LDkgKzQxMzUsOSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+VmFyaWFibGUgJmFwb3M7cCZhcG9zOyBpbml0aWFsaXplZCB0byBhIG51bGwgcG9pbnRlciB2YWx1ZTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPiZhcG9zO3AmYXBvczsgaW5pdGlhbGl6ZWQgdG8gYSBudWxsIHBvaW50ZXIgdmFsdWU8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+VmFyaWFibGUgJmFwb3M7cCZhcG9zOyBpbml0aWFsaXplZCB0byBhIG51bGwgcG9pbnRlciB2YWx1ZTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPiZhcG9zO3AmYXBvczsgaW5pdGlhbGl6ZWQgdG8gYSBudWxsIHBvaW50ZXIgdmFsdWU8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgpAQCAtNDM2OSwxMiArNDE0NywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQwOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MDk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTQzODIsMTIgKzQxNjAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtNDQwMywxMiArNDE4MSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTQ0MTYsMTIgKzQxOTQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtNDQzMyw3ICs0MjExLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtNDQ0MSwxMiArNDIxOSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtNDQ2NiwxMiArNDI0NCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTQ0NzksMTIgKzQyNTcsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC00NDkzLDIzICs0MjcxLDU3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQxMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTQ1MzAsOCArNDM0Miw4IEBACiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+NDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTQ1MzksNDQgKzQzNTEsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtNDU4NCwxMiArNDM2MiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTQ2MDksMzg4ICs0Mzg3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG5vbi1udWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbm9uLW51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7ZGlzayZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7ZGlzayZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5kZXNjcmlwdGlvbjwva2V5PjxzdHJpbmc+UG90ZW50aWFsIGxlYWsgb2YgYW4gb2JqZWN0IHN0b3JlZCBpbnRvICZhcG9zO2Rpc2smYXBvczs8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPmYxMDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjc8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTQ5OTgsMTIgKzQ0MDAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtNTAxOSwxMiArNDQyMSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTUwMzIsMTIgKzQ0MzQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTUwNDksNyArNDQ1MSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTUwNTcsMTAwNCArNDQ1OSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztEQURpc2tDb3B5RGVzY3JpcHRpb24mYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0RBRGlza0NvcHlEZXNjcmlwdGlvbiZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2RpY3QmYXBvczsgaXMgbm9uLW51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGljdCZhcG9zOyBpcyBub24tbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkaWN0JmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkaWN0JmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Qgc3RvcmVkIGludG8gJmFwb3M7ZGljdCZhcG9zOzwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjEwPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+ODwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2RpY3QmYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaWN0JmFwb3M7IGlzIG51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0RBRGlza0NvcHlXaG9sZURpc2smYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0RBRGlza0NvcHlXaG9sZURpc2smYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtNjA3NCwxMiArNDQ4NCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC02MDg3LDEyICs0NDk3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtNjEwOCwxMiArNDUxOCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtNjEyMSw4OTAgKzQ1MzEsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkaXNrJmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkaXNrJmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Qgc3RvcmVkIGludG8gJmFwb3M7ZGlzayZhcG9zOzwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjEwPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTE8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0RBRGlza0NyZWF0ZUZyb21JT01lZGlhJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztEQURpc2tDcmVhdGVGcm9tSU9NZWRpYSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbm9uLW51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBub24tbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2RpY3QmYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaWN0JmFwb3M7IGlzIG51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Njc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Njc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2Rpc2smYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2Rpc2smYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdCBzdG9yZWQgaW50byAmYXBvcztkaXNrJmFwb3M7PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5mMTA8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xNDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTcwMjAsMTIgKzQ1NTIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC03MDMzLDQ2MiArNDU2NSw2IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGljdCZhcG9zOyBpcyBudWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2RpY3QmYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Njg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7REFEaXNzZW50ZXJDcmVhdGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0RBRGlzc2VudGVyQ3JlYXRlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgpAQCAtNzUyOSw3ICs0NjA1LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgpAQCAtNzU1NCwyMTcgKzQ2MzAsNiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzc2VudGVyJmFwb3M7IGlzIG5vbi1udWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc3NlbnRlciZhcG9zOyBpcyBub24tbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkaXNzZW50ZXImYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2Rpc3NlbnRlciZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5kZXNjcmlwdGlvbjwva2V5PjxzdHJpbmc+UG90ZW50aWFsIGxlYWsgb2YgYW4gb2JqZWN0IHN0b3JlZCBpbnRvICZhcG9zO2Rpc3NlbnRlciZhcG9zOzwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjEwPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTU8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC03Nzg0LDEyICs0NjQ5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTc3OTcsMTQzICs0NjYyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtNzk0OSwxMiArNDY4MywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC03OTYyLDQwNiArNDY5NiwxMyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2RpY3QmYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaWN0JmFwb3M7IGlzIG51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQyOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNzZW50ZXImYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNzZW50ZXImYXBvczsgaXMgbnVsbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgpAQCAtODM4NiwxNiArNDcyNywzMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0RBU2Vzc2lvbkNyZWF0ZSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7ZGlzayZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztEQVNlc3Npb25DcmVhdGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2Rpc2smYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdCBzdG9yZWQgaW50byAmYXBvcztkaXNrJmFwb3M7PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5mMTA8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztEQURpc2tDb3B5RGVzY3JpcHRpb24mYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0RBRGlza0NvcHlEZXNjcmlwdGlvbiZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KQEAgLTg0MDYsMTIgKzUwNTUsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KQEAgLTg0NTgsNyArNTEwNyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KQEAgLTg0ODMsNiArNTEzMiwyOTMxIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaWN0JmFwb3M7IGlzIG5vbi1udWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2RpY3QmYXBvczsgaXMgbm9uLW51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkaWN0JmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkaWN0JmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Qgc3RvcmVkIGludG8gJmFwb3M7ZGljdCZhcG9zOzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjEwPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Nzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2RpY3QmYXBvczsgaXMgbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaWN0JmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztEQURpc2tDb3B5V2hvbGVEaXNrJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztEQURpc2tDb3B5V2hvbGVEaXNrJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbm9uLW51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBub24tbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2Rpc2smYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2Rpc2smYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdCBzdG9yZWQgaW50byAmYXBvcztkaXNrJmFwb3M7PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5mMTA8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xMDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0RBRGlza0NyZWF0ZUZyb21JT01lZGlhJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztEQURpc2tDcmVhdGVGcm9tSU9NZWRpYSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG5vbi1udWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbm9uLW51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaWN0JmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGljdCZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7ZGlzayZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7ZGlzayZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5kZXNjcmlwdGlvbjwva2V5PjxzdHJpbmc+UG90ZW50aWFsIGxlYWsgb2YgYW4gb2JqZWN0IHN0b3JlZCBpbnRvICZhcG9zO2Rpc2smYXBvczs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPmYxMDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaWN0JmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGljdCZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztEQURpc3NlbnRlckNyZWF0ZSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7REFEaXNzZW50ZXJDcmVhdGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc3NlbnRlciZhcG9zOyBpcyBub24tbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNzZW50ZXImYXBvczsgaXMgbm9uLW51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkaXNzZW50ZXImYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2Rpc3NlbnRlciZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5kZXNjcmlwdGlvbjwva2V5PjxzdHJpbmc+UG90ZW50aWFsIGxlYWsgb2YgYW4gb2JqZWN0IHN0b3JlZCBpbnRvICZhcG9zO2Rpc3NlbnRlciZhcG9zOzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjEwPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTM8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaXNrJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40MzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztkaWN0JmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGljdCZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzayZhcG9zOyBpcyBudWxsPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO2Rpc2smYXBvczsgaXMgbnVsbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzc2VudGVyJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+QXNzdW1pbmcgJmFwb3M7ZGlzc2VudGVyJmFwb3M7IGlzIG51bGw8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7REFTZXNzaW9uQ3JlYXRlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztEQVNlc3Npb25DcmVhdGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC04NTAyLDEyICs4MDc2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQ3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTg1MTUsMTIgKzgwODksMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC04NTI5LDU4ICs4MTAzLDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Mzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQzNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CkBAIC04NTk3LDExICs4MTM3LDExIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjEwPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTg8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xNzwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDM3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTg2MTYsMTIgKzgxNTYsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NDM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ1MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDQzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtODYyOSwxMiArODE2OSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ2NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDU2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC04NjQzLDQ0ICs4MTgzLDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ1NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ1NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ1NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtODY4OCwxMiArODE5NCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ1NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ2NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDU2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDY2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTg3MTMsMjUgKzgyMTksMjUgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ2NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDU2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ3MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDYyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NzI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtODc0Myw3ICs4MjQ5LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDYyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDcyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtODc1MSwxMiArODI1NywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ2MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ3MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDYyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDcyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTg3NzcsNyArODI4Myw3IEBACiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ2MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ3MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTg3ODYsNDQgKzgyOTIsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ3MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDcwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ3MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ3MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtODgzMSwxMiArODMwMywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ3MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDcwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDgwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTg4NTYsMjUgKzgzMjgsMjUgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDcwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDcxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ3MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDgxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtODg4Niw3ICs4MzU4LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDcxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDgxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtODkwMiwxMCArODM3NCwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPmYxMjwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjI8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40NzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC04OTE0LDQ0ICs4Mzg2LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Nzk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ3OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Nzk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Nzk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDc5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTg5NTksMTIgKzgzOTcsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40Nzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ3OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC04OTg0LDI1ICs4NDIyLDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDc5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ3OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTkwMTQsNyArODQ1Miw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTkwMjIsMjQgKzg0NjAsMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDgwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDgwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtOTA1OSwxMiArODQ5NywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTkwNzIsMTIgKzg1MTAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDgxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtOTA4OSw3ICs4NTI3LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDgxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtOTA5NywyNCArODUzNSwyNCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC05MTM0LDEyICs4NTcyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDgxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtOTE0NywxMiArODU4NSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDgyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC05MTY0LDcgKzg2MDIsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC05MTgzLDcgKzg2MjEsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTkxOTIsNTgwICs4NjMwLDYgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztDRkFycmF5Q3JlYXRlTXV0YWJsZSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7Q0ZBcnJheUNyZWF0ZU11dGFibGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGF1dG9yZWxlYXNlZDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGF1dG9yZWxlYXNlZDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40ODg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ4ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCB3YXMgYXV0b3JlbGVhc2VkIDIgdGltZXMgYnV0IHRoZSBvYmplY3QgaGFzIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCB3YXMgYXV0b3JlbGVhc2VkIDIgdGltZXMgYnV0IHRoZSBvYmplY3QgaGFzIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPk9iamVjdCBhdXRvcmVsZWFzZWQgdG9vIG1hbnkgdGltZXM8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkIHRvbyBtYW55IHRpbWVzPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPmYxM19hdXRvcmVsZWFzZV9jPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+NDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDg4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGQXJyYXlDcmVhdGVNdXRhYmxlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztDRkFycmF5Q3JlYXRlTXV0YWJsZSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBhdXRvcmVsZWFzZWQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDkzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBhdXRvcmVsZWFzZWQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CkBAIC05NzkwLDIxICs4NjU0LDIzNCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHdhcyBhdXRvcmVsZWFzZWQgMiB0aW1lcyBidXQgdGhlIG9iamVjdCBoYXMgYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGQXJyYXlDcmVhdGVNdXRhYmxlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHdhcyBhdXRvcmVsZWFzZWQgMiB0aW1lcyBidXQgdGhlIG9iamVjdCBoYXMgYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGQXJyYXlDcmVhdGVNdXRhYmxlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGF1dG9yZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGF1dG9yZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjQ5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCB3YXMgYXV0b3JlbGVhc2VkIDIgdGltZXMgYnV0IHRoZSBvYmplY3QgaGFzIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCB3YXMgYXV0b3JlbGVhc2VkIDIgdGltZXMgYnV0IHRoZSBvYmplY3QgaGFzIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPk9iamVjdCBhdXRvcmVsZWFzZWQgdG9vIG1hbnkgdGltZXM8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkIHRvbyBtYW55IHRpbWVzPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPmYxM19hdXRvcmVsZWFzZV9kPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjEzX2F1dG9yZWxlYXNlX2M8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz40PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj40OTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NDk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC05ODE1LDYgKzg4OTIsNjkgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTAyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUwMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7Q0ZBcnJheUNyZWF0ZU11dGFibGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGQXJyYXlDcmVhdGVNdXRhYmxlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTAyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTAzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgpAQCAtOTgyOSw2ICs4OTY5LDIzNiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTAzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTAzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBhdXRvcmVsZWFzZWQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTAzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUwNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUwNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBhdXRvcmVsZWFzZWQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTA1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTA1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHdhcyBhdXRvcmVsZWFzZWQgMiB0aW1lcyBidXQgdGhlIG9iamVjdCBoYXMgYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHdhcyBhdXRvcmVsZWFzZWQgMiB0aW1lcyBidXQgdGhlIG9iamVjdCBoYXMgYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5kZXNjcmlwdGlvbjwva2V5PjxzdHJpbmc+T2JqZWN0IGF1dG9yZWxlYXNlZCB0b28gbWFueSB0aW1lczwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPk9iamVjdCBhdXRvcmVsZWFzZWQgdG9vIG1hbnkgdGltZXM8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjEzX2F1dG9yZWxlYXNlX2Q8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz40PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTk4NDgsMTIgKzkyMTgsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTAzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtOTg2MSwxMiArOTIzMSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC05ODc4LDcgKzkyNDgsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC05ODk0LDEwICs5MjY0LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+ZjE0X2xlYWtpbW1lZGlhdGVseTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjI8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC05OTEzLDEyICs5MjgzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTE4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtOTkyNiwxMiArOTI5NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTE4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC05OTQzLDcgKzkzMTMsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC05OTUxLDEyICs5MzIxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTE4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTk5NzYsMTIgKzkzNDYsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTE4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC05OTg5LDEyICs5MzU5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwMDEwLDEyICs5MzgwLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTAwMjMsMTIgKzkzOTMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTAwNDAsNyArOTQxMCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTEwMDQ4LDEyICs5NDE4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMDA3MywxMiArOTQ0MywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwMDg2LDEyICs5NDU2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMDEwMyw3ICs5NDczLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTAxMTEsMTIgKzk0ODEsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMDEzNyw3ICs5NTA3LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz41PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xMDE1MywxMiArOTUyMywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwMTY2LDEyICs5NTM2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwMTgzLDcgKzk1NTMsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xMDE5MSwxMiArOTU2MSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMDIxNiwxMiArOTU4NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwMjI5LDEyICs5NTk5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwMjUwLDEyICs5NjIwLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTAyNjMsMTIgKzk2MzMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTAyODAsNyArOTY1MCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTEwMjg4LDEyICs5NjU4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMDMxMywxMiArOTY4MywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwMzI2LDEyICs5Njk2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwMzQ3LDEyICs5NzE3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTAzNjAsMTIgKzk3MzAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMDM3Nyw3ICs5NzQ3LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTEwMzg1LDEyICs5NzU1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTA0MTAsMTIgKzk3ODAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwNDIzLDEyICs5NzkzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMDQ0MCw3ICs5ODEwLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTA0NDgsMTIgKzk4MTgsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMDQ3NCw3ICs5ODQ0LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz44PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xMDQ5MCwxMiArOTg2MCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwNTAzLDEyICs5ODczLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwNTIwLDcgKzk4OTAsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xMDUyOCwxMiArOTg5OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMDU1MywxMiArOTkyMywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwNTY2LDEyICs5OTM2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwNTg3LDEyICs5OTU3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTA2MDAsMTIgKzk5NzAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTA2MTcsNyArOTk4Nyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTEwNjI1LDEyICs5OTk1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMDY1MCwxMiArMTAwMjAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMDY2MywxMiArMTAwMzMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTA2ODQsMTIgKzEwMDU0LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTA2OTcsMTIgKzEwMDY3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTA3MTQsNyArMTAwODQsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTA3MjIsMTIgKzEwMDkyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTA3NDcsMTIgKzEwMTE3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUzNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMDc2MCwxMiArMTAxMzAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjUyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwNzc3LDcgKzEwMTQ3LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTA3ODUsMTIgKzEwMTU1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTA4MTEsNyArMTAxODEsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjExPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41Mzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xMDgyMCw0NCArMTAxOTAsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU3NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTc0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU3NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU3NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41NzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41ODQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTA4NjUsMTIgKzEwMjAxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTc0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41NzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41ODQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTA4OTAsMjUgKzEwMjI2LDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTc0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41ODQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU3NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU3NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41NzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU4NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEwOTIwLDcgKzEwMjU2LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTc1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTA5MjgsMjQgKzEwMjY0LDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTc1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU3NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU4NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTc1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41NzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41ODU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTA5NjEsNyArMTAyOTcsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41NzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41ODU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xMDk2OSwxMiArMTAzMDUsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41NzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41ODU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTc1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTEwOTk1LDcgKzEwMzMxLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41NzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41ODU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xMTAwNCw0NCArMTAzNDAsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU4ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU4ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU4ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41ODg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTEwNDksMTIgKzEwMzUxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41ODg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTEwNzQsMjUgKzEwMzc2LDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU4ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExMTA4LDEyICsxMDQxMCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExMTIxLDEyICsxMDQyMywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTEzOCw3ICsxMDQ0MCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTExMTQ2LDEyICsxMDQ0OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTExNzEsMTIgKzEwNDczLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTExODQsMTIgKzEwNDg2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTIwMSw3ICsxMDUwMyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTExMjA5LDEyICsxMDUxMSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTEyMzIsMTAgKzEwNTM0LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+cmRhcl82NjU5MTYwPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTM8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz41PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xMTI1MSwxMiArMTA1NTMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41ODg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTEyNjQsMTIgKzEwNTY2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExMjg1LDEyICsxMDU4NywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExMjk4LDEyICsxMDYwMCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTMxNSw3ICsxMDYxNyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTExMzIzLDEyICsxMDYyNSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTEzNDgsMTIgKzEwNjUwLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTEzNjEsMTIgKzEwNjYzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExMzc4LDcgKzEwNjgwLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTEzODYsMTIgKzEwNjg4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMTM5OSw5ICsxMDcwMSw5IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5WYXJpYWJsZSAmYXBvcztraW5kQyZhcG9zOyBpbml0aWFsaXplZCB0byBhIG51bGwgcG9pbnRlciB2YWx1ZTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPiZhcG9zO2tpbmRDJmFwb3M7IGluaXRpYWxpemVkIHRvIGEgbnVsbCBwb2ludGVyIHZhbHVlPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlZhcmlhYmxlICZhcG9zO2tpbmRDJmFwb3M7IGluaXRpYWxpemVkIHRvIGEgbnVsbCBwb2ludGVyIHZhbHVlPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+JmFwb3M7a2luZEMmYXBvczsgaW5pdGlhbGl6ZWQgdG8gYSBudWxsIHBvaW50ZXIgdmFsdWU8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgpAQCAtMTE0MTEsMTIgKzEwNzEzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTE0MjQsMTIgKzEwNzI2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExNDQ1LDEyICsxMDc0NywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExNDU4LDEyICsxMDc2MCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTQ3NSw3ICsxMDc3Nyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTExNDgzLDEyICsxMDc4NSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMTUwOCwxMiArMTA4MTAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTUyMSwxMiArMTA4MjMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTE1NDIsMTIgKzEwODQ0LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTE1NTUsMTIgKzEwODU3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExNTc2LDEyICsxMDg3OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExNTg5LDEyICsxMDg5MSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYyMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTYxMCwxMiArMTA5MTIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYyMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTYyMywxMiArMTA5MjUsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYyMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTY0MCw3ICsxMDk0Miw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYyMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xMTY0OCwxMiArMTA5NTAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYyMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMTY3NCw3ICsxMDk3Niw3IEBACiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mjc8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYyMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xMTY5MCwxMiArMTA5OTIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41ODg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTg4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTE3MDMsMTIgKzExMDA1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTcxNyw0NCArMTEwMTksMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTE3NjIsMTIgKzExMDMwLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTE3ODcsMjUgKzExMDU1LDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExODIxLDEyICsxMTA4OSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExODM0LDEyICsxMTEwMiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTg1MSw3ICsxMTExOSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTExODU5LDEyICsxMTEyNywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTE4ODQsMTIgKzExMTUyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NTk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTE4OTcsMTIgKzExMTY1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExOTE4LDEyICsxMTE4NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjU5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj41OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTExOTMxLDEyICsxMTE5OSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTk1MiwxMiArMTEyMjAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMTk2NSwxMiArMTEyMzMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTE5ODIsNyArMTEyNTAsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xMTk5MCwxMiArMTEyNTgsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTIwMTUsMjI5ICsxMTI4MywyMjkgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MDk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYwOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjA5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjEyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjEyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYyMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYyMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYyNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42MjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYyNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEyMjQ5LDcgKzExNTE3LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTIyNTcsMTIgKzExNTI1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYxNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYyNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTEyMjgzLDcgKzExNTUxLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4zMzwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTIyOTIsMzYwICsxMTU2MCwxMSBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjM4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42Mzg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42Mzg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42Mzg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjM4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42Mzg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYzODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk1ldGhvZCByZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk1ldGhvZCByZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYzODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYzODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42Mzk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYzOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYzOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42Mzk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjM5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42Mzk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjM5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgcmVsZWFzZWQgYnkgZGlyZWN0bHkgc2VuZGluZyB0aGUgJmFwb3M7LWRlYWxsb2MmYXBvczsgbWVzc2FnZTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgcmVsZWFzZWQgYnkgZGlyZWN0bHkgc2VuZGluZyB0aGUgJmFwb3M7LWRlYWxsb2MmYXBvczsgbWVzc2FnZTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42Mzk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjYzOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjQwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjQwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NDA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZS1jb3VudGVkIG9iamVjdCBpcyB1c2VkIGFmdGVyIGl0IGlzIHJlbGVhc2VkPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZS1jb3VudGVkIG9iamVjdCBpcyB1c2VkIGFmdGVyIGl0IGlzIHJlbGVhc2VkPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlJlZmVyZW5jZS1jb3VudGVkIG9iamVjdCBpcyB1c2VkIGFmdGVyIGl0IGlzIHJlbGVhc2VkPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+VXNlLWFmdGVyLXJlbGVhc2U8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+cHIzODIwX1JlbGVhc2VBZnRlckRlYWxsb2M8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4zPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NDA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NDY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjQ4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjQ4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KQEAgLTEyNjUzLDMzICsxMTU3MiwyMSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NDg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjQ4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCByZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk1ldGhvZCByZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCByZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk1ldGhvZCByZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KQEAgLTEyNjk1LDcgKzExNjAyLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KQEAgLTEyNzI4LDYgKzExNjM1LDE4IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NDk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTEyNzQwLDYgKzExNjU5LDI4NyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHJlbGVhc2VkIGJ5IGRpcmVjdGx5IHNlbmRpbmcgdGhlICZhcG9zOy1kZWFsbG9jJmFwb3M7IG1lc3NhZ2U8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHJlbGVhc2VkIGJ5IGRpcmVjdGx5IHNlbmRpbmcgdGhlICZhcG9zOy1kZWFsbG9jJmFwb3M7IG1lc3NhZ2U8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjQ5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NDk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY1MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY1MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjUwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UtY291bnRlZCBvYmplY3QgaXMgdXNlZCBhZnRlciBpdCBpcyByZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UtY291bnRlZCBvYmplY3QgaXMgdXNlZCBhZnRlciBpdCBpcyByZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5SZWZlcmVuY2UtY291bnRlZCBvYmplY3QgaXMgdXNlZCBhZnRlciBpdCBpcyByZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPlVzZS1hZnRlci1yZWxlYXNlPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnByMzgyMF9SZWxlYXNlQWZ0ZXJEZWFsbG9jPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjUwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjU2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjU3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5NZXRob2QgcmV0dXJucyBhbiBPYmplY3RpdmUtQyBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5NZXRob2QgcmV0dXJucyBhbiBPYmplY3RpdmUtQyBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY1ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjU4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjU4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY1ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY1ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCByZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgcmVsZWFzZWQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjU4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY1OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY1OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj42NTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NjU5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UtY291bnRlZCBvYmplY3QgaXMgdXNlZCBhZnRlciBpdCBpcyByZWxlYXNlZDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UtY291bnRlZCBvYmplY3QgaXMgdXNlZCBhZnRlciBpdCBpcyByZWxlYXNlZDwvc3RyaW5nPgpAQCAtMTI3NTMsNyArMTE5NTMsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY0OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjY1OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTEyNzY5LDEyICsxMTk2OSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcwMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMjc4MiwxMiArMTE5ODIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzAxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMjc5OSw3ICsxMTk5OSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcwMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xMjgwNywxMiArMTIwMDcsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcwMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMjgyNSw0NCArMTIwMjUsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5NZXRob2QgcmV0dXJucyBhbiBPYmplY3RpdmUtQyBvYmplY3Qgd2l0aCBhICswIHJldGFpbiBjb3VudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MDE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MDE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzAxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzAxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcwMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xMjg3MCwyNCArMTIwMzYsMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcwMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzAxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTI5MDcsMTIgKzEyMDczLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzAxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMjkyMCwxMyArMTIwODYsMTMgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzA2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzA2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgpAQCAtMTI5MzQsMzcgKzEyMTAwLDYgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MDY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkaWN0JmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztkaWN0JmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Qgc3RvcmVkIGludG8gJmFwb3M7ZGljdCZhcG9zOzwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPk9iamVjdGl2ZS1DIG1ldGhvZDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPmFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nOjwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjY8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcwNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgpAQCAtMTI5NzIsMTIgKzEyMTA3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEyOTg1LDE1MSArMTIxMjAsMTMgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5NZXRob2QgcmV0dXJucyBhbiBPYmplY3RpdmUtQyBvYmplY3Qgd2l0aCBhICswIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5NZXRob2QgcmV0dXJucyBhbiBPYmplY3RpdmUtQyBvYmplY3Qgd2l0aCBhICswIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzE1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KQEAgLTEzMTQ0LDEzICsxMjE0MSwxMyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzE1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KQEAgLTEzMTg5LDggKzEyMTg2LDggQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5PYmplY3RpdmUtQyBtZXRob2Q8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5yYWRhcjEwMTAyMjQ0PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+NDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPmFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nOjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcxNjwvaW50ZWdlcj4KQEAgLTEzMjA5LDI2ICsxMjIwNiwxMzAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzI1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CkBAIC0xMzI0MywyNiArMTIzNDQsOTQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KQEAgLTEzMjczLDcgKzEyNDQyLDcyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2RpY3QmYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2RpY3QmYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdCBzdG9yZWQgaW50byAmYXBvcztkaWN0JmFwb3M7PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+T2JqZWN0aXZlLUMgbWV0aG9kPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+cmFkYXIxMDEwMjI0NDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjczNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjczNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzM1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzM1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTEzMjgxLDEyICsxMjUxNSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjczNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzM1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTEzMzA2LDI1ICsxMjU0MCwyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzM1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjczNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjczNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEzMzM2LDcgKzEyNTcwLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTMzNDQsMTIgKzEyNTc4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+NzM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjcyNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjczNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTEzMzcwLDcgKzEyNjA0LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4zPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj43MzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xMzM4NiwxMiArMTI2MjAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODAxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMzM5OSwxMiArMTI2MzMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODAyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODEyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTM0MTYsNyArMTI2NTAsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xMzQyNCwxMiArMTI2NTgsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODAyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODEyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTEzNDQ5LDEyICsxMjY4MywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODEyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEzNDYyLDEyICsxMjY5NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODAzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xMzQ3OSw3ICsxMjcxMyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTEzNDg3LDEyICsxMjcyMSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTM1MTAsMTAgKzEyNzQ0LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPk9iamVjdGl2ZS1DIG1ldGhvZDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPl9pbml0UmV0dXJuaW5nTmV3Q2xhc3NCYWQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4zPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODAzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTM1MjksMTIgKzEyNzYzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTM1NDIsMTIgKzEyNzc2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODE3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEzNTU2LDQ0ICsxMjc5MCwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODA3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODA3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODE3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTEzNjAxLDEyICsxMjgwMSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODA3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODE3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTEzNjI2LDI1ICsxMjgyNiwyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODE4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTEzNjUzLDQ0ICsxMjg1MywxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODA4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODA4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODE4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTEzNjk4LDI0ICsxMjg2NCwyNCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODA4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODE4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xMzcyOCw0NCArMTI4OTQsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTEzNzczLDEyICsxMjkwNSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44MTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTM3OTksNyArMTI5MzEsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjM8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgwODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjgxODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTEzODA4LDQ0ICsxMjk0MCwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTM4NTMsMTIgKzEyOTUxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTM4NzEsNDQgKzEyOTY5LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTM5MTYsMjQgKzEyOTgwLDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTEzOTQ5LDcgKzEzMDEzLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTEzOTU3LDEyICsxMzAyMSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTEzOTgzLDcgKzEzMDQ3LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4wPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTM5OTIsNDQgKzEzMDU2LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNDAzNywxMiArMTMwNjcsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNDA1NSw0NCArMTMwODUsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5NZXRob2QgcmV0dXJucyBhbiBPYmplY3RpdmUtQyBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNDEwMCwyNCArMTMwOTYsMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODU3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTQxMzMsNyArMTMxMjksNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTQxNDEsMTIgKzEzMTM3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODU3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTQxNjcsNyArMTMxNjMsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjA8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xNDE3OSw3ICsxMzE3NSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg2MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE0MTg3LDEyICsxMzE4MywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg2MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTQyMDgsNyArMTMyMDQsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNDIyNiwxMiArMTMyMjIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNDIzOSwxMiArMTMyMzUsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNDI1Myw0NCArMTMyNDksMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE0Mjk4LDEyICsxMzI2MCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE0MzE5LDcgKzEzMjgxLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODUxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODYxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTQzMjcsMTggKzEzMjg5LDE4IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODUxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODYxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg2MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZXR1cm5pbmcgZnJvbSAmYXBvcztOb0NvcHlTdHJpbmcmYXBvczs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CkBAIC0xNDM1MiwxMiArMTMzMTQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg2MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODUxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNDM2NSwxMiArMTMzMjcsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODUyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODYyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTQzODIsNyArMTMzNDQsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNDM5MCwxMiArMTMzNTIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODUyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODYyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE0NDEzLDEwICsxMzM3NSwyNTkgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz50ZXN0X1JEYXI2ODU5NDU3PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODYyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODYxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg2MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg2MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODYyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbGluZyAmYXBvcztub0NvcHlTdHJpbmcmYXBvczs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbGluZyAmYXBvcztub0NvcHlTdHJpbmcmYXBvczs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkVudGVyZWQgY2FsbCBmcm9tICZhcG9zO3Rlc3RfUkRhcjY4NTk0NTcmYXBvczs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+RW50ZXJlZCBjYWxsIGZyb20gJmFwb3M7dGVzdF9SRGFyNjg1OTQ1NyZhcG9zOzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODU3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg2MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODYyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmV0dXJuaW5nIGZyb20gJmFwb3M7bm9Db3B5U3RyaW5nJmFwb3M7PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJldHVybmluZyBmcm9tICZhcG9zO25vQ29weVN0cmluZyZhcG9zOzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg2MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg2MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODYzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODYzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg2MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBhbGxvY2F0ZWQgb2JqZWN0IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBhbGxvY2F0ZWQgb2JqZWN0IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Q8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnRlc3RfUkRhcjY4NTk0NTc8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xNDQyNSwzMjcgKzEzNjM2LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1MTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsaW5nICZhcG9zO25vQ29weVN0cmluZyZhcG9zOzwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsaW5nICZhcG9zO25vQ29weVN0cmluZyZhcG9zOzwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+RW50ZXJlZCBjYWxsIGZyb20gJmFwb3M7dGVzdF9SRGFyNjg1OTQ1NyZhcG9zOzwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5FbnRlcmVkIGNhbGwgZnJvbSAmYXBvczt0ZXN0X1JEYXI2ODU5NDU3JmFwb3M7PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NDc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg0NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODQ3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmV0dXJuaW5nIGZyb20gJmFwb3M7bm9Db3B5U3RyaW5nJmFwb3M7PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJldHVybmluZyBmcm9tICZhcG9zO25vQ29weVN0cmluZyZhcG9zOzwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODUzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODUzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg1MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBhbGxvY2F0ZWQgb2JqZWN0IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBhbGxvY2F0ZWQgb2JqZWN0IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Q8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnRlc3RfUkRhcjY4NTk0NTc8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4zPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44NTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44ODY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg4NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg4NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg4NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44ODY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44OTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTQ3NTMsMTIgKzEzNjQ3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODg2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODk2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44ODY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44OTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTQ3NzEsNDQgKzEzNjY1LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODg2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODg2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg4NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODg2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODg2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODk2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTQ4MTYsMjQgKzEzNjc2LDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODg2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODk2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg4NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjg5NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODg2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODk2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44ODY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44OTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTQ4NDksNyArMTM3MDksNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44ODY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44OTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNDg1NywxMiArMTM3MTcsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44ODY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44OTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODg2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+ODk2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE0ODgzLDcgKzEzNzQzLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44ODY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj44OTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xNDg5NSw3ICsxMzc1NSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE0OTAzLDEyICsxMzc2MywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTQ5MjgsMTIgKzEzNzg4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTQ5NDEsMTIgKzEzODAxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE0OTU4LDcgKzEzODE4LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTQ5NjYsMTIgKzEzODI2LDE4OSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBhbGxvY2F0ZWQgb2JqZWN0IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBhbGxvY2F0ZWQgb2JqZWN0IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Q8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnJkYXI2OTAyNzEwPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNDk5Miw4ICsxNDAyOSw4IEBACiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTUwMDgsMTIgKzE0MDQ1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTUwMjEsMTIgKzE0MDU4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE1MDM4LDcgKzE0MDc1LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTUwNDYsMjIgKzE0MDgzLDIyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5NZXRob2QgcmV0dXJucyBhbiBPYmplY3RpdmUtQyBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk1ldGhvZCByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk1ldGhvZCByZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgpAQCAtMTUwNzEsMTIgKzE0MTA4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTUwODQsMTIgKzE0MTIxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE1MDk4LDI0ICsxNDEzNSw1OCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CkBAIC0xNTEzNSw4ICsxNDIwNiw4IEBACiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mzwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTUxNTEsMTIgKzE0MjIyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTUxNjQsMTIgKzE0MjM1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE1MTgxLDcgKzE0MjUyLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTUxODksMTU1ICsxNDI2MCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5NZXRob2QgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5NZXRob2QgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBhbGxvY2F0ZWQgb2JqZWN0IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBhbGxvY2F0ZWQgb2JqZWN0IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Q8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnJkYXI2OTAyNzEwPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+NDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTE5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE1MzU3LDEyICsxNDI4NSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkxOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE1MzcwLDEyICsxNDI5OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkzMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNTM4Nyw3ICsxNDMxNSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkzMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE1NDAzLDEwICsxNDMzMSwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnJkYXI2OTAyNzEwPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+NTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkzMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTE1NDE4LDcgKzE0MzQ2LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTU0MjYsMTIgKzE0MzU0LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkzODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNTQ1MSwxMiArMTQzNzksMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkzODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNTQ2NCwxMiArMTQzOTIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTI5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkyOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTM5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTU0ODEsNyArMTQ0MDksNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNTQ5NywxMCArMTQ0MjUsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5yZGFyNjk0NTU2MTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjI8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xNTUxMiw3ICsxNDQ0MCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk0NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE1NTIwLDEyICsxNDQ0OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk0NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTU1NDUsMTIgKzE0NDczLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTQ3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE1NTU4LDEyICsxNDQ4NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Mzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk0ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NDg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNTU3NSw3ICsxNDUwMyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjkzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk0ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE1NTkxLDEwICsxNDUxOSwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPklPQlNETmFtZU1hdGNoaW5nX3dyYXBwZXI8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTQ4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTU2MDYsNyArMTQ1MzQsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNTYxNCwxMiArMTQ1NDIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTQxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTUxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE1NjM5LDEyICsxNDU2NywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTUxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNTY1MiwxMiArMTQ1ODAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTUyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTU2NjksNyArMTQ1OTcsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNTY4NSwxMCArMTQ2MTMsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5JT1NlcnZpY2VNYXRjaGluZ193cmFwcGVyPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTE1NzAwLDcgKzE0NjI4LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTQ1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTU1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTU3MDgsMTIgKzE0NjM2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTQ1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTU1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk0NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNTczMywxMiArMTQ2NjEsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTQ1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTU3NDYsMTIgKzE0Njc0LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE1NzYzLDcgKzE0NjkxLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTU3NzksMTAgKzE0NzA3LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+SU9TZXJ2aWNlTmFtZU1hdGNoaW5nX3dyYXBwZXI8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTU3OTEsNDQgKzE0NzE5LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTUzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTYzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE1ODM2LDEyICsxNDczMCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTUzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTYzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE1ODYxLDI1ICsxNDc1NSwyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTYzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTU0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTU4OTEsNyArMTQ3ODUsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNTg5OSwyNCArMTQ3OTMsMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTU0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTY0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNTkzNiwxMiArMTQ4MzAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTU0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTU5NDksMTIgKzE0ODQzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTY1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNTk2Niw3ICsxNDg2MCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE1OTc0LDEyICsxNDg2OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk1NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTU1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTY1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE2MDAwLDcgKzE0ODk0LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz40PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xNjAxMiw3ICsxNDkwNiw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE2MDIwLDEyICsxNDkxNCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTYwNDUsMTIgKzE0OTM5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTYwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTcwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE2MDU4LDEyICsxNDk1MiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTYxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNjA3NSw3ICsxNDk2OSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE2MDkxLDEwICsxNDk4NSwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPklPUmVnaXN0cnlFbnRyeUlETWF0Y2hpbmdfd3JhcHBlcjwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjI8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xNjEwNiw3ICsxNTAwMCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE2MTE0LDEyICsxNTAwOCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTYxMzksMTIgKzE1MDMzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTY1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE2MTUyLDEyICsxNTA0NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTY2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNjE2OSw3ICsxNTA2Myw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE2MTg1LDEwICsxNTA3OSwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPklPT3BlbkZpcm13YXJlUGF0aE1hdGNoaW5nX3dyYXBwZXI8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTY2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTYxOTcsNDQgKzE1MDkxLDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Njk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Njk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Njk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE2MjQyLDEyICsxNTEwMiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE2MjY3LDI1ICsxNTEyNywyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk2OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Njk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTcwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTYyOTcsNyArMTUxNTcsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNjMwNSwyNCArMTUxNjUsMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTcwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTgwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNjM0MiwxMiArMTUyMDIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTcwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTYzNTUsMTIgKzE1MjE1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTgxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNjM3Miw3ICsxNTIzMiw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE2MzgwLDEyICsxNTI0MCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTcxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTgxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE2NDA2LDcgKzE1MjY2LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4zPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xNjQxNSw0NCArMTUyNzUsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTY0NjAsMTIgKzE1Mjg2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTY0ODUsMjUgKzE1MzExLDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNjUxNSw3ICsxNTM0MSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE2NTIzLDI0ICsxNTM0OSwyNCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE2NTYwLDEyICsxNTM4NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45NzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNjU3MywxMiArMTUzOTksMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE2NTkwLDcgKzE1NDE2LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTY1OTgsMTIgKzE1NDI0LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTc3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45Nzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTY2MjQsNyArMTU0NTAsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjM8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk3NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTE2NjMzLDQ0ICsxNTQ1OSwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTgzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTgzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTgzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk5MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNjY3OCwxMiArMTU0NzAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45OTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk5MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNjcwMywyNSArMTU0OTUsMjUgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk5MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTgzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45OTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45OTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTk0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE2NzMzLDcgKzE1NTI1LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTk0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTY3NDEsMjQgKzE1NTMzLDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTk0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk5NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk5NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTk0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE2Nzc4LDEyICsxNTU3MCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTk0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk5NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNjc5MSwxMiArMTU1ODMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45OTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTk1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE2ODA4LDcgKzE1NjAwLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTk1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTY4MTYsMTIgKzE1NjA4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTg1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+OTk1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45ODU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj45OTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTY4NDIsNyArMTU2MzQsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk4NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjk5NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTE2ODU4LDEyICsxNTY1MCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTY4NzEsMTIgKzE1NjYzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTY4ODUsNDQgKzE1Njc3LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE2OTMwLDEyICsxNTY4OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAzNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNjk1NSw1OSArMTU3MTMsMjUgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAyNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAzODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE3MDE5LDcgKzE1NzQzLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNzAyNywyNCArMTU3NTEsMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAzODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAzODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNzA2NCwxMiArMTU3ODgsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTcwNzcsMTIgKzE1ODAxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNzA5NCw3ICsxNTgxOCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDM5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTcxMDIsMjQgKzE1ODI2LDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAyOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAyOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDM5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwMjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDM5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTcxMzksMTIgKzE1ODYzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAyOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAzOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAyOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAzOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE3MTUyLDEyICsxNTg3NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDQwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDQwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE3MTY5LDcgKzE1ODkzLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNDA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNzE3NywxMiArMTU5MDEsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA0MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDMwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA0MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNzIwMCwxMCArMTU5MjQsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5yZGFyXzcxNTI2MTk8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz44PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+NDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTAzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNDA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xNzIxOSwxMiArMTU5NDMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDQ5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDQ5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTcyMzIsMTIgKzE1OTU2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTcyNTMsMTIgKzE1OTc3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA1MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA2MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA1MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA2MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNzI2NiwxMiArMTU5OTAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA1MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA2MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Njc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTcyODMsNyArMTYwMDcsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDUxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA2MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNzI5MSwxMiArMTYwMTUsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDUxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA2MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA1MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTczMTYsMTIgKzE2MDQwLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA1MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA2MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Njc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTczMjksMTIgKzE2MDUzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTczNDYsNyArMTYwNzAsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDUwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA2MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE3MzU0LDEyICsxNjA3OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE3Mzc3LDEwICsxNjEwMSwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnJkYXJfNzE4NDQ1MDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjEyPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTM8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTczOTYsMTIgKzE2MTIwLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA2MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA2MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE3NDA5LDEyICsxNjEzMywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDcyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDgyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDcyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDgyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE3NDMwLDEyICsxNjE1NCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTc0NDMsMTIgKzE2MTY3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDczPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDgzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE3NDYwLDcgKzE2MTg0LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTc0NjgsMTIgKzE2MTkyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDgzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE3NDkzLDEyICsxNjIxNywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDczPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDgzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE3NTA2LDEyICsxNjIzMCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDcyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDgyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDcyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDgyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE3NTIzLDcgKzE2MjQ3LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNzUzMSwxMiArMTYyNTUsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDcyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA4MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDcyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA4MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNzU1NCwxMCArMTYyNzgsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5yZGFyXzcxODQ0NTBfcG9zPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTI8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xMzwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xNzU3MywxMiArMTYyOTcsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDYxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDcxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDYxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDcxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTc1ODYsMTIgKzE2MzEwLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTc2MDcsMTIgKzE2MzMxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA4MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA4MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNzYyMCwxMiArMTYzNDQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNzYzNyw3ICsxNjM2MSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDgzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTc2NDUsMTIgKzE2MzY5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTA3MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE3NjcwLDEyICsxNjM5NCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTc2ODMsMTIgKzE2NDA3LDQ2IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDg1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDg1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwODc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNzcwMCw3ICsxNjQ1OCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTc3MTYsMTAgKzE2NDc0LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+cmRhcl83MTg0NDUwX3Bvczwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE3PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTM8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEwNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMDg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTc3MjgsNDQgKzE2NDg2LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjExMTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjExMTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE3NzczLDEyICsxNjQ5NywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjExMTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTEyMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xNzc5OCwyNSArMTY1MjIsMjUgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjExMTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjExMjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjExMTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjExMjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNzgyOCw3ICsxNjU1Miw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjExMTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTIyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTc4NDQsMTAgKzE2NTY4LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+cmRhcl83Mjk5Mzk0X3Bvc2l0aXZlPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjExMTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMTIyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTc4NjMsMTIgKzE2NTg3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI1NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI1NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNzg3NiwxMiArMTY2MDAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNzg5Myw3ICsxNjYxNyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTc5MDEsMTIgKzE2NjI1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTc5MjYsMTIgKzE2NjUwLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xNzkzOSwxMiArMTY2NjMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI1ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI1ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE3OTU2LDcgKzE2NjgwLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xNzk3MiwxMCArMTY2OTYsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5yZGFyXzczNTg4OTk8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz45PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Nzwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI0ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xNzk4NCw0NCArMTY3MDgsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjY0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI2NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjY0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI3NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xODAyOSwxMiArMTY3MTksMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjY0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI3NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI2NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTgwNTQsMjUgKzE2NzQ0LDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI2NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI3NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI2NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI3NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xODA4NCw3ICsxNjc3NCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyNjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjc1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTgxMDAsMTAgKzE2NzkwLDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+cmRhcjcyNjU3MTFfYTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjI8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjY1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI3NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTE4MTE5LDEyICsxNjgwOSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyODQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyODQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTgxMzIsMTIgKzE2ODIyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyODU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyODU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTgxNDYsNDQgKzE2ODM2LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjg1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjg1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyODU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjg1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyODU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE4MTkxLDEyICsxNjg0NywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyODU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjg1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI5NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xODIxNiwyNSArMTY4NzIsMjUgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjg1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjg1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyODY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyODY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xODI0Niw3ICsxNjkwMiw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyODY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTgyNjIsMTAgKzE2OTE4LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+cmRhcjczMDY4OTg8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz41PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+NDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI4NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xODI3Nyw3ICsxNjkzMyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTgyODUsMTIgKzE2OTQxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTgzMTEsNyArMTY5NjcsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTgzMjcsMTIgKzE2OTgzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE4MzQwLDEyICsxNjk5NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzA2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzA2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTgzNTcsNyArMTcwMTMsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMwNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE4MzY1LDEyICsxNzAyMSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzA2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzA2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE4MzkxLDcgKzE3MDQ3LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMwNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTE4NDA3LDEyICsxNzA2MywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xODQyMCwxMiArMTcwNzYsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI5NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMwNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI5NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMwNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE4NDM3LDcgKzE3MDkzLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI5NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xODQ0NSwxMiArMTcxMDEsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMwNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMwNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xODQ3MSw3ICsxNzEyNyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mzwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI5NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xODQ4NywxMiArMTcxNDMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMjk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTg1MDAsMTIgKzE3MTU2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMDg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMDg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xODUxNyw3ICsxNzE3Myw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTg1MjUsMTIgKzE3MTgxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMDg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTI5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMDg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTg1NTEsNyArMTcyMDcsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEyOTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTg1NjAsNDQgKzE3MjE2LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzI1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzI1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzI1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE4NjA1LDEyICsxNzIyNywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xODYzMCwyNSArMTcyNTIsMjUgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzI1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzI1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xODY2MCw3ICsxNzI4Miw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTg2NzYsMTAgKzE3Mjk4LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+dGVzdF9hdHRyXzE8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMyNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xODY4OCw0NCArMTczMTAsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMyOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMyOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTg3MzMsMTIgKzE3MzIxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMyOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE4NzU4LDI1ICsxNzM0NiwyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE4Nzg4LDcgKzE3Mzc2LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xODgwNCwxMCArMTczOTIsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz50ZXN0X2F0dHJfMWI8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xODgyMywxMiArMTc0MTEsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE4ODM2LDEyICsxNzQyNCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE4ODUwLDQ0ICsxNzQzOCwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xODg5NSwxMiArMTc0NDksMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTg5MjAsMjUgKzE3NDc0LDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE4OTU0LDEyICsxNzUwOCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTg5NjcsMTIgKzE3NTIxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE4OTg0LDcgKzE3NTM4LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTg5OTIsMTIgKzE3NTQ2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE5MDE1LDEwICsxNzU2OSwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnRlc3RfYXR0cjFjPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjI8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTE5MDM0LDEyICsxNzU4OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTkwNDcsMTIgKzE3NjAxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTkwNjgsMTIgKzE3NjIyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xOTA4MSwxMiArMTc2MzUsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTkwOTgsNyArMTc2NTIsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xOTEwNiwxMiArMTc2NjAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTkxMjQsNDQgKzE3Njc4LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTkxNjksMjQgKzE3Njg5LDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTkyMDYsMTIgKzE3NzI2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTkyMTksMTIgKzE3NzM5LDQ2IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xOTIzNiw3ICsxNzc5MCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzMzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTkyNTIsMTAgKzE3ODA2LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+dGVzdF9hdHRyMWM8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz41PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+NDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTMzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xOTI2NCw0NCArMTc4MTgsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTkzMDksMTIgKzE3ODI5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzUwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE5MzM0LDI1ICsxNzg1NCwyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM1MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM1MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE5MzY0LDcgKzE3ODg0LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xOTM4MCwxMCArMTc5MDAsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz50ZXN0YXR0cjJfYTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjI8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM1MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTE5MzkyLDQ0ICsxNzkxMiwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM1NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xOTQzNywxMiArMTc5MjMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM1NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMTk0NjIsMjUgKzE3OTQ4LDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM1NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM0NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM1NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzU1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzU1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTk0OTIsNyArMTc5NzgsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM1NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE5NTA4LDEwICsxNzk5NCwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnRlc3RhdHRyMl9iPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzU1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMTk1MjAsNDQgKzE4MDA2LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzU4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE5NTY1LDEyICsxODAxNywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzU4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM1ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xOTU5MCwyNSArMTgwNDIsNTkgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzU4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzQ4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzU4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzNTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzUwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTk2MjAsNyArMTgxMDYsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzUwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM2MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE5NjM2LDEwICsxODEyMiwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnRlc3RhdHRyMl9iXzExMzU4MjI0X3NlbGZfYXNzaWduX2xvb3Nlc190aGVfbGVhazwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjM8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzUwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM2MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTE5NjQ4LDQ0ICsxODEzNCwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM4MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM4MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzODA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzgwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzODA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzkwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTE5NjkzLDEyICsxODE0NSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzODA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzkwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzgwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xOTcxMSw0NCArMTgxNjMsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5NZXRob2QgcmV0dXJucyBhbiBPYmplY3RpdmUtQyBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzgwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM4MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzgwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzgwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM4MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzOTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xOTc1NiwyNCArMTgxNzQsMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzgwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzgwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM4MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzOTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzODA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzkwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE5Nzg5LDcgKzE4MjA3LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM4MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzOTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xOTc5NywxMiArMTgyMTUsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzgwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzgwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0xOTgyMyw3ICsxODI0MSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM4MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzOTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0xOTgzOSwxMiArMTgyNTcsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTk4NTIsMTIgKzE4MjcwLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE5ODY5LDcgKzE4Mjg3LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTk4NzcsMTIgKzE4Mjk1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTE5ODk4LDcgKzE4MzE2LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQwNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0xOTkxNiwxMiArMTgzMzQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTk5MjksMTIgKzE4MzQ3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0xOTk1MCwxMiArMTgzNjgsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMTk5NjMsMTIgKzE4MzgxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTE5OTgwLDcgKzE4Mzk4LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMTk5ODgsMTIgKzE4NDA2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIwMDA5LDcgKzE4NDI3LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMDAyNywyNiArMTg0NDUsMjYgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzk2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzOTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQwNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzk2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzk2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KQEAgLTIwMDU3LDcgKzE4NDc1LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjAwNjUsMTIgKzE4NDgzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzOTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIwMDg2LDcgKzE4NTA0LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjAwOTQsMjggKzE4NTEyLDYyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJldHVybmluZyBmcm9tICZhcG9zO3JldHVybnNSZXRhaW5lZENGRGF0ZSZhcG9zOzwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZXR1cm5pbmcgZnJvbSAmYXBvcztyZXR1cm5zUmV0YWluZWRDRkRhdGUmYXBvczs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIwMTIzLDE4ICsxODU3NSwxOCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZXR1cm5pbmcgZnJvbSAmYXBvcztyZXR1cm5zQ0ZSZXRhaW5lZEFzQ0YmYXBvczs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CkBAIC0yMDE0OCw0NiArMTg2MDAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMDE5NSwxMiArMTg2MTMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjAyMTIsNyArMTg2MzAsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMDIyMCwyNCArMTg2MzgsMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMDI1NywxMiArMTg2NzUsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMDI3MCwxMiArMTg2ODgsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIwMjg3LDcgKzE4NzA1LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMDI5NSwxMiArMTg3MTMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMDMyMSw3ICsxODczOSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0yMDMzNywxMiArMTg3NTUsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjAzNTAsMTIgKzE4NzY4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0Mjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIwMzY3LDcgKzE4Nzg1LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0Mjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjAzNzUsMTIgKzE4NzkzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0Mjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIwMzk2LDcgKzE4ODE0LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMDQxNCwyNiArMTg4MzIsMjYgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzk2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzOTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQwNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzk2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzk2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KQEAgLTIwNDQ0LDcgKzE4ODYyLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjA0NTIsMTIgKzE4ODcwLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzOTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIwNDczLDcgKzE4ODkxLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0Mjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjA0ODEsMTggKzE4ODk5LDE4IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0Mjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJldHVybmluZyBmcm9tICZhcG9zO3JldHVybnNSZXRhaW5lZENGRGF0ZSZhcG9zOzwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KQEAgLTIwNTA2LDQ2ICsxODkyNCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIwNTUzLDEyICsxODkzNywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjA1NzAsNyArMTg5NTQsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIwNTc4LDI0ICsxODk2MiwyNCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0Mjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjA2MTEsNyArMTg5OTUsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIwNjE5LDEyICsxOTAwMywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIwNjQ1LDcgKzE5MDI5LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTIwNjYxLDEyICsxOTA0NSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMDY3NCwxMiArMTkwNTgsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjA2OTEsNyArMTkwNzUsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMDY5OSwxMiArMTkwODMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjA3MjAsNyArMTkxMDQsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzk0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQwNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIwNzM4LDI2ICsxOTEyMiwyNiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzOTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQwNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzOTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjEzOTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgpAQCAtMjA3NjgsNyArMTkxNTIsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQwNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMDc3NiwxMiArMTkxNjAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xMzk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQwNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTM5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MDY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjUyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjA3OTcsNyArMTkxODEsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMDgwNSwxOCArMTkxODksMTggQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmV0dXJuaW5nIGZyb20gJmFwb3M7cmV0dXJuc1JldGFpbmVkQ0ZEYXRlJmFwb3M7PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgpAQCAtMjA4MzAsNDYgKzE5MjE0LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjA4NzcsMTIgKzE5MjI3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMDg5NCw3ICsxOTI0NCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjA5MDIsMjQgKzE5MjUyLDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDIxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQzMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMDkzNSw3ICsxOTI4NSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjA5NDMsMTIgKzE5MjkzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQyMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MzE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjA5NjksNyArMTkzMTksNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMjA5ODUsMTIgKzE5MzM1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ1MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ0MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ1MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIwOTk4LDEyICsxOTM0OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIxMDEyLDQ0ICsxOTM2MiwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ0MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ0MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDQyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ0MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ1MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMTA1NywxMiArMTkzNzMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ1MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjgyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjEwODIsMjUgKzE5Mzk4LDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ0MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ1MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ0MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ1MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDQzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDQzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjExMTIsNyArMTk0MjgsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDQzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ1MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIxMTI4LDEwICsxOTQ0NCwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnRlc3RfcGFuaWNfbmVnYXRpdmU8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4zPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ0MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0yMTE0NywxMiArMTk0NjMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDYyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDYyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjExNjAsMTIgKzE5NDc2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjExNzQsNDQgKzE5NDkwLDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDYzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIxMjE5LDEyICsxOTUwMSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDYzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ2MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMTI0NCwyNSArMTk1MjYsMjUgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDYzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDUzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDYzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMTI3OCwxMiArMTk1NjAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDU0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDY0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDU0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDY0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjEyOTEsMTIgKzE5NTczLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMTMwOCw3ICsxOTU5MCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDY0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjEzMTYsMTIgKzE5NTk4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ1NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ1NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMTM0MSwxMiArMTk2MjMsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDU0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDY0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDU0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDY0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjEzNTQsMTIgKzE5NjM2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMTM3MSw3ICsxOTY1Myw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDY2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjEzODcsMTAgKzE5NjY5LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+dGVzdF9wYW5pY19uZWdfMjwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjU8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDU2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ2NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTIxMzk5LDQ0ICsxOTY4MSwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ3NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ3NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDc2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ3NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDc2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMTQ0NCwxMiArMTk2OTIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDc2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ3NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0ODY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjUzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjE0NjksMjUgKzE5NzE3LDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ3NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ4NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ3NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ4NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDc3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDc3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjE0OTksNyArMTk3NDcsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDc3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ4NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIxNTA3LDEyICsxOTc1NSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0Nzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0Nzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjE1MzAsMTAgKzE5Nzc4LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+dGVzdF9ibG9ja3NfMV9wb3M8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ3NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0ODc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0yMTU0Miw0NCArMTk3OTAsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0OTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0OTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0OTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1MDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjE1ODcsMTIgKzE5ODAxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1MDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0OTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTA3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIxNjEyLDI1ICsxOTgyNiwyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0OTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1MDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0OTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1MDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIxNjQyLDcgKzE5ODU2LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1MDg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMTY1MCwxMiArMTk4NjQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMTY3MSw3ICsxOTg4NSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjE2ODksMTIgKzE5OTAzLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIxNzAyLDEyICsxOTkxNiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMTcxOSw3ICsxOTkzMyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIxNzI3LDI0ICsxOTk0MSwyNCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1MDg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTA4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIxNzYwLDcgKzE5OTc0LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1MDg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMTc2OCwxOCArMTk5ODIsMTggQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDk4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZXR1cm5pbmcgdG8gY2FsbGVyPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgpAQCAtMjE3OTMsMTIgKzIwMDA3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTQ5ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIxODA2LDEyICsyMDAyMCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDk5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTA5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDk5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTA5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjE4MjMsNyArMjAwMzcsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNDk5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTUwOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIxODM5LDEwICsyMDA1MywxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnRlc3RfYmxvY2tzXzFfaW5kaXJlY3RfcmV0YWluX3ZpYV9jYWxsPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE0OTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTA5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMjE4NTgsMTIgKzIwMDcyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU0OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU0OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMTg3MSwxMiArMjAwODUsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU2MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU2MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIxODg1LDExMiArMjAwOTksMTA3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1NTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5FbnRlcmluZyBsb29wIGJvZHk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+RW50ZXJpbmcgbG9vcCBib2R5PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTYzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTYzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU2MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU2MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTY1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTY1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjE5OTgsMTIgKzIwMjA3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTY1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIyMDIzLDI1ICsyMDIzMiwyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU2NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU2NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMjA1NywxMiArMjAyNjYsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTU3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTY3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTU3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTY3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIyMDcwLDEyICsyMDI3OSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTU3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTY3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU2NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMjA4Nyw3ICsyMDI5Niw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTY3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIyMDk1LDEyICsyMDMwNCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTY3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTU3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU2NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMjEyMCwxMiArMjAzMjksMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTU3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTY3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU2NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMjEzMywxMyArMjAzNDIsMTMgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU2MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTcwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU2MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU3MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgpAQCAtMjIxNTAsMjUgKzIwMzU5LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTcwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTYwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE1NjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjkxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztpbmZvJmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgpAQCAtMjIxODEsMTEgKzIwMzc1LDExIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+cmRhcl84NzI0Mjg3PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTI8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz43PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNTYwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTU3MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTIyMTkzLDQ0ICsyMDM4NywxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYwNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYwNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MDU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjA1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIyMjM4LDEyICsyMDM5OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjA1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYxNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMjI1Niw0NCArMjA0MTYsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGQXJyYXlDcmVhdGVNdXRhYmxlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYwNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MDU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYwNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYwNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjIzMDEsMjQgKzIwNDI3LDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjA1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYxNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMjMzNCw3ICsyMDQ2MCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjIzNDIsMTIgKzIwNDY4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYwNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjIzNjgsNyArMjA0OTQsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MDU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMjIzNzcsNDQgKzIwNTAzLDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYxMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MTM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjI0MjIsMTIgKzIwNTE0LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIyNDQwLDQ0ICsyMDUzMiwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7Q0ZBcnJheUNyZWF0ZU11dGFibGUmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYxMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjEzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMjQ4NSwyNCArMjA1NDMsMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIyNTE4LDcgKzIwNTc2LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMjUyNiwxMiArMjA1ODQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYyMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMjU1Miw3ICsyMDYxMCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYxMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0yMjU2MSw0NCArMjA2MTksMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjM0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYzNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMjYwNiwxMiArMjA2MzAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NDQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjI2MjQsNDQgKzIwNjQ4LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztDRkFycmF5Q3JlYXRlTXV0YWJsZSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjM0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MzQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIyNjY5LDI0ICsyMDY1OSwyNCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjQ0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjQ0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTYzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NDQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjI3MDIsNyArMjA2OTIsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIyNzEwLDEyICsyMDcwMCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjQ0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjQ0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIyNzM2LDcgKzIwNzI2LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTIyNzQ1LDQ0ICsyMDczNSwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NDY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjQ2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIyNzkwLDEyICsyMDc0NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMjgwOCw0NCArMjA3NjQsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGQXJyYXlDcmVhdGVNdXRhYmxlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NDY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjI4NTMsMjQgKzIwNzc1LDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjQ2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY1NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMjg4Niw3ICsyMDgwOCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjI4OTQsMTIgKzIwODE2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY0NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjYwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjI5MjAsNyArMjA4NDIsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2NDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjU2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMjI5MzYsMTIgKzIwODU4LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY2NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY3NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY2NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY3NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMjk0OSwxMiArMjA4NzEsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY2NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY3NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY2NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY3NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMjk2Myw0NCArMjA4ODUsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2Njc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2Njc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY2NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2Njc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY2NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2Nzc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjMwMDgsMTIgKzIwODk2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY2NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2Nzc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2Njc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjc3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIzMDMzLDI1ICsyMDkyMSwyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2Njc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2Nzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2Njc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2Nzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY2ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY3ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY2ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY3ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIzMDYzLDcgKzIwOTUxLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY2ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2Nzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yMzA3OSwxMCArMjA5NjcsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5yZGFyNjU4Mjc3ODwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjM8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjY4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY3ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTIzMDk4LDEyICsyMDk4NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjMxMTEsMTIgKzIwOTk5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjMxMjUsNDQgKzIxMDEzLDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNzA0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIzMTcwLDEyICsyMTAyNCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNzA0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjk0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTcwNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMzE5NSwyNSArMjEwNDksMjUgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNzA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjk0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNzA0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yMzIyNSw3ICsyMTA3OSw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNzA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjMyMzMsMjQgKzIxMDg3LDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNzA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNzA1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjMyNzAsMTIgKzIxMTI0LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTcwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTcwNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIzMjgzLDEyICsyMTEzNywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjk3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNzA3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjk3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNzA3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIzMzA0LDEyICsyMTE1OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjMzMTcsMTIgKzIxMTcxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjk3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNzA3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTIzMzM0LDcgKzIxMTg4LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY5NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjMzNDIsMTIgKzIxMTk2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTY5NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE3MDc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE2OTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNzA3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTIzMzY4LDcgKzIxMjIyLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz42PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xNjk3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTcwNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0yMzM4NCw0NiArMjEyMzgsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjM0MzEsMTIgKzIxMjUxLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjM0NDUsNDQgKzIxMjY1LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTIzNDkwLDEyICsyMTI3NiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yMzUxNSwzNDQgKzIxMzAxLDYgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxODwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgyMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODIxPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvczthJmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvczthJmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Qgc3RvcmVkIGludG8gJmFwb3M7YSZhcG9zOzwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+dGVzdF9vYmpjX2FycmF5czwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjY8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgyNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk1ldGhvZCByZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk1ldGhvZCByZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODMwPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2EyJmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvczthMiZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5kZXNjcmlwdGlvbjwva2V5PjxzdHJpbmc+UG90ZW50aWFsIGxlYWsgb2YgYW4gb2JqZWN0IHN0b3JlZCBpbnRvICZhcG9zO2EyJmFwb3M7PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz50ZXN0X29iamNfYXJyYXlzPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTU8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgpAQCAtMjM4NjMsMTY1ICsyMTMxMSw2IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5OU0FycmF5IGxpdGVyYWwgaXMgYW4gb2JqZWN0IHdpdGggYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TlNBcnJheSBsaXRlcmFsIGlzIGFuIG9iamVjdCB3aXRoIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UgY291bnQgaW5jcmVtZW50ZWQuIFRoZSBvYmplY3Qgbm93IGhhcyBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UgY291bnQgaW5jcmVtZW50ZWQuIFRoZSBvYmplY3Qgbm93IGhhcyBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgpAQCAtMjQwNjMsMTcgKzIxMzUyLDE3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvczthMyZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvczthJmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvczthMyZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvczthJmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Qgc3RvcmVkIGludG8gJmFwb3M7YTMmYXBvczs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdCBzdG9yZWQgaW50byAmYXBvczthJmFwb3M7PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz50ZXN0X29iamNfYXJyYXlzPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MjM8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4zPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM4PC9pbnRlZ2VyPgpAQCAtMjQwOTIsMjUgKzIxMzgxLDU5IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxNjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjQxMjYsMTIgKzIxNDQ5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg0MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgxNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg0MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNDEzOSwxMiArMjE0NjIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg0MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg0NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg0MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg0NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNDE1Myw1OCArMjE0NzYsMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg0MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg0MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODQ0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODQzPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg0NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KQEAgLTI0MjIzLDEzICsyMTUxMiwxMyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KQEAgLTI0Mjc0LDE3ICsyMTU2MywxNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7YSZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvczthMiZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7YSZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvczthMiZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5kZXNjcmlwdGlvbjwva2V5PjxzdHJpbmc+UG90ZW50aWFsIGxlYWsgb2YgYW4gb2JqZWN0IHN0b3JlZCBpbnRvICZhcG9zO2EmYXBvczs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdCBzdG9yZWQgaW50byAmYXBvczthMiZhcG9zOzwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+dGVzdF9vYmpjX2FycmF5czwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjMyPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTI8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CkBAIC0yNDMwMywyNSArMjE1OTIsNTkgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MTY8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg0MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg0MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNDMzNywxMiArMjE2NjAsODAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODQyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNDM1Niw3ICsyMTc0Nyw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CkBAIC0yNDM3Nyw3ICsyMTc2OCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CkBAIC0yNDM4NSwxMiArMjE3NzYsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KQEAgLTI0NDAyLDcgKzIxNzkzLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KQEAgLTI0NDEwLDg3ICsyMTgwMSw1MyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk5TRGljdGlvbmFyeSBsaXRlcmFsIGlzIGFuIG9iamVjdCB3aXRoIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk5TRGljdGlvbmFyeSBsaXRlcmFsIGlzIGFuIG9iamVjdCB3aXRoIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjg8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5OU0FycmF5IGxpdGVyYWwgaXMgYW4gb2JqZWN0IHdpdGggYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TlNBcnJheSBsaXRlcmFsIGlzIGFuIG9iamVjdCB3aXRoIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1MjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgpAQCAtMjQ1MTAsMjQgKzIxODY3LDU4IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNDUzOSw3ICsyMTkzMCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODU1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjQ1NDcsMTIgKzIxOTM4LDM1OSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODU1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODU1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7YTMmYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2EzJmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Qgc3RvcmVkIGludG8gJmFwb3M7YTMmYXBvczs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnRlc3Rfb2JqY19hcnJheXM8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yMDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+cGF0aDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODU1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODU1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODU1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODU1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODYwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODYwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODYwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TWV0aG9kIHJldHVybnMgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjQ1NzAsMTAgKzIyMzA4LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+dGVzdF9vYmpjX2FycmF5czwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjQxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mjg8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMjQ1ODksMTIgKzIyMzI3LDUzNiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4MzQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTgzODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NDc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODUxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODU1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODU1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODU1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODU1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg1OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5OU0RpY3Rpb25hcnkgbGl0ZXJhbCBpcyBhbiBvYmplY3Qgd2l0aCBhICswIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5OU0RpY3Rpb25hcnkgbGl0ZXJhbCBpcyBhbiBvYmplY3Qgd2l0aCBhICswIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODczPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg3MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2EmYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2EmYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdCBzdG9yZWQgaW50byAmYXBvczthJmFwb3M7PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz50ZXN0X29iamNfYXJyYXlzPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Mzc8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODYxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjQ2MDIsMTIgKzIyODY0LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODYxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI0NjE5LDcgKzIyODgxLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjQ2MjcsMTIgKzIyODg5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTI0NjQ1LDQ0ICsyMjkwNywxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk5TTnVtYmVyIGxpdGVyYWwgaXMgYW4gb2JqZWN0IHdpdGggYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjQ2OTAsMjQgKzIyOTE4LDI0IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODYxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg3ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjQ3MjcsMTIgKzIyOTU1LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg3ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjQ3NDAsMTIgKzIyOTY4LDgwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI0NzU3LDcgKzIzMDUzLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yNDc3MywxMCArMjMwNjksMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz50ZXN0X29iamNfaW50ZWdlcl9saXRlcmFsczwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjM8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODYzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTI0NzkyLDEyICsyMzA4OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNDgwNSwxMiArMjMxMDEsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjQ4MjIsNyArMjMxMTgsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yNDgzMCwxMiArMjMxMjYsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjQ4NDgsNDQgKzIzMTQ0LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+TlNOdW1iZXIgYm94ZWQgZXhwcmVzc2lvbiBwcm9kdWNlcyBhbiBvYmplY3Qgd2l0aCBhICswIHJldGFpbiBjb3VudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE1PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yNDg5MywyNCArMjMxNTUsMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODgzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yNDkzMCwxMiArMjMxOTIsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODgzPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNDk0MywxMiArMjMyMDUsNDYgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg3MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg3MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNDk2MCw3ICsyMzI1Niw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjQ5NjgsMTIgKzIzMjY0LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg3MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg3MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjQ5OTEsMTAgKzIzMjg3LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+dGVzdF9vYmpjX2JveGVkX2V4cHJlc3Npb25zPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+NTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NzA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg3PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMjUwMTAsMTIgKzIzMzA2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI1MDIzLDEyICsyMzMxOSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjUwNDQsMTIgKzIzMzQwLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI1MDU3LDEyICsyMzM1MywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNTA3NCw3ICsyMzM3MCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTI1MDgyLDEyICsyMzM3OCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yNTEwMCw0NCArMjMzOTYsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5OU1N0cmluZyBib3hlZCBleHByZXNzaW9uIHByb2R1Y2VzIGFuIG9iamVjdCB3aXRoIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTI1MTQ1LDI0ICsyMzQwNywyNCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4NjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg2OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTI1MTgyLDEyICsyMzQ0NCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Njk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODY5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI1MTk1LDEyICsyMzQ1Nyw4MCBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODcxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNTIxMiw3ICsyMzU0Miw3IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjUyMjgsMTAgKzIzNTU4LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+dGVzdF9vYmpjX2JveGVkX2V4cHJlc3Npb25zPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+Njwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjQ8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4NzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMjUyNDcsNDYgKzIzNTc3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg3NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg3NjwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4OTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODk0PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI1Mjk0LDEyICsyMzU5MCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODk1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODk1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjUzMTUsMTIgKzIzNjExLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg3ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg5NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg3ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg5NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI1MzI4LDEyICsyMzYyNCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODk1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODk1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjUzNDUsNyArMjM2NDEsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODc4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg5NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTI1MzUzLDEyICsyMzY0OSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODk1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODk1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTI1Mzc4LDEyICsyMzY3NCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4OTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4Nzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4OTU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNTM5MSwxMiArMjM2ODcsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg5ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg5ODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNTQwNSw0NCArMjM3MDEsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4OTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjU0NTAsMTIgKzIzNzEyLDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4OTg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODk4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTI1NDc1LDI1ICsyMzczNywyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4OTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg5OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg5OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI1NTA5LDEyICsyMzc3MSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4OTk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4OTk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+OTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNTUyMiwxMiArMjM3ODQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkwMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkwMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI1NTM5LDcgKzIzODAxLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MDA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yNTU0NywyNCArMjM4MDksMjQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODgzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkwMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODgzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkwMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MDA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MDA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjU1ODQsMTIgKzIzODQ2LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkwMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkwMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj41PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI1NTk3LDEyICsyMzg1OSwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTAxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTAxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjU2MTQsNyArMjM4NzYsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkwMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTI1NjIyLDEyICsyMzg4NCwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE4ODQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTAxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xODg0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkwMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yNTY0OCw3ICsyMzkxMCw3IEBACiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+OTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTg4NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MDE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CkBAIC0yNTY2NCwxMiArMjM5MjYsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTAzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTAzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTIwPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjU2NzcsMTIgKzIzOTM5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CkBAIC0yNTY5MSw0NCArMjM5NTMsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MTE8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTExPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkxMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yNTczNiwxMiArMjM5NjQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkyODwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkxMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjU3NjEsMjUgKzIzOTg5LDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkxMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkxMTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5Mjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5Mjk8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjU3OTEsNyArMjQwMTksNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkyOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTI1Nzk5LDEyICsyNDAyNywxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTI5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkyOTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzU8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CkBAIC0yNTgyNSw3ICsyNDA1Myw3IEBACiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfaGFzaDwva2V5PjxzdHJpbmc+MTA8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTI5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgpAQCAtMjU4NDEsMTIgKzI0MDY5LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkxNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkzMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkxNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkzMzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI1ODU0LDEyICsyNDA4MiwxMiBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTQxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTQxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjU4NjgsNDQgKzI0MDk2LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTI0PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkyNDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5NDE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgpAQCAtMjU5MTMsMTIgKzI0MTA3LDEyIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkyNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5NDE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTQxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KQEAgLTI1OTM4LDI1ICsyNDEzMiwyNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5NDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5MjQ8L2ludGVnZXI+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5NDE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTQyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTQyPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KQEAgLTI1OTY4LDcgKzI0MTYyLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkyNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5NDI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yNTk3NiwxMiArMjQxNzAsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTk0MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mjg8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkyNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5NDI8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ4PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjYwMDIsNyArMjQxOTYsNyBAQAogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjEwPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTI1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTk0MjwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KQEAgLTI2MDExLDQ0ICsyNDIwNSwxMCBAQAogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CiAvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CiAvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgotLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkzNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkzNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTM3PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE2PC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkzNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yOTwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgotLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+Ci0vLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTk1NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CkBAIC0yNjA1NiwxMiArMjQyMTYsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTk1NDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkzNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5NTQ8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjMxPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgpAQCAtMjYwODEsMjUgKzI0MjQxLDI1IEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkzNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTk1NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTkzNzwvaW50ZWdlcj4KLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yOTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTk1NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTU1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgotLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTU1PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgpAQCAtMjYxMTEsNyArMjQyNzEsNyBAQAogLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KIC8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+Ci0vLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTk1NTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CiAvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KQEAgLTI2MTI3LDEyICsyNDI4NywxODgxIEBACiAvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CiAvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+dGVzdF9jdXN0b21fY2Y8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTU1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5ODk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5ODk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5ODk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO21ha2VDdXN0b20mYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO21ha2VDdXN0b20mYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTg5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTg5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5OTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5OTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTkwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7b2JqJmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvcztvYmomYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdCBzdG9yZWQgaW50byAmYXBvcztvYmomYXBvczs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5MZWFrPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnRlc3RDdXN0b21SZXR1cm5zUmV0YWluZWQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4xPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4xOTkwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5OTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5OTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5OTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO2dldEN1c3RvbSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7Z2V0Q3VzdG9tJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5OTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTk5MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MTk5MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkluY29ycmVjdCBkZWNyZW1lbnQgb2YgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiBvYmplY3QgdGhhdCBpcyBub3Qgb3duZWQgYXQgdGhpcyBwb2ludCBieSB0aGUgY2FsbGVyPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkluY29ycmVjdCBkZWNyZW1lbnQgb2YgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiBvYmplY3QgdGhhdCBpcyBub3Qgb3duZWQgYXQgdGhpcyBwb2ludCBieSB0aGUgY2FsbGVyPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPkluY29ycmVjdCBkZWNyZW1lbnQgb2YgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiBvYmplY3QgdGhhdCBpcyBub3Qgb3duZWQgYXQgdGhpcyBwb2ludCBieSB0aGUgY2FsbGVyPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+QmFkIHJlbGVhc2U8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+dGVzdEN1c3RvbVJldHVybnNOb3RSZXRhaW5lZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5OTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAxMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAxMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAxMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAxMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk1ldGhvZCByZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk1ldGhvZCByZXR1cm5zIGFuIE9iamVjdGl2ZS1DIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbGluZyAmYXBvcztpbml0WCZhcG9zOzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsaW5nICZhcG9zO2luaXRYJmFwb3M7PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDA1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+RW50ZXJlZCBjYWxsIGZyb20gJmFwb3M7dGVzdDEyNzA2MTc3JmFwb3M7PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkVudGVyZWQgY2FsbCBmcm9tICZhcG9zO3Rlc3QxMjcwNjE3NyZhcG9zOzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDA1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDA1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDA2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMDY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5Bc3N1bWluZyAmYXBvcztDb25kJmFwb3M7IGlzIG5vdCBlcXVhbCB0byAwPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkFzc3VtaW5nICZhcG9zO0NvbmQmYXBvczsgaXMgbm90IGVxdWFsIHRvIDA8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj43PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAwNjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDA3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDA3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZXR1cm5pbmcgZnJvbSAmYXBvcztpbml0WCZhcG9zOzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZXR1cm5pbmcgZnJvbSAmYXBvcztpbml0WCZhcG9zOzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAxMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAxMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDEyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IGFsbG9jYXRlZCBvYmplY3QgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IGFsbG9jYXRlZCBvYmplY3QgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+ZGVzY3JpcHRpb248L2tleT48c3RyaW5nPlBvdGVudGlhbCBsZWFrIG9mIGFuIG9iamVjdDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPk9iamVjdGl2ZS1DIG1ldGhvZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnRlc3QxMjcwNjE3Nzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7Q0ZHZXRTb21ldGhpbmcmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICswIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGR2V0U29tZXRoaW5nJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBhdXRvcmVsZWFzZWQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGF1dG9yZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4yMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgcmV0dXJuZWQgdG8gY2FsbGVyIHdpdGggYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHJldHVybmVkIHRvIGNhbGxlciB3aXRoIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMjg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAyODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+NDA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCB3YXMgYXV0b3JlbGVhc2VkIGJ1dCBoYXMgYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHdhcyBhdXRvcmVsZWFzZWQgYnV0IGhhcyBhICswIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkIHRvbyBtYW55IHRpbWVzPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+T2JqZWN0IGF1dG9yZWxlYXNlZCB0b28gbWFueSB0aW1lczwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5nZXRJbmNvcnJlY3RseUF1dG9yZWxlYXNlZENGVHlwZTwvc3RyaW5nPgogLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjI8L3N0cmluZz4KIC8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgogLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KLS8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjE5Mzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDI4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGQ3JlYXRlU29tZXRoaW5nJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztDRkNyZWF0ZVNvbWV0aGluZyZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI0PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBhdXRvcmVsZWFzZWQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MjI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj44PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwMzM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjAzMzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHdpdGggYSArMCByZXRhaW4gY291bnQgcmV0dXJuZWQgdG8gY2FsbGVyIHdoZXJlIGEgKzEgKG93bmluZykgcmV0YWluIGNvdW50IGlzIGV4cGVjdGVkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCB3aXRoIGEgKzAgcmV0YWluIGNvdW50IHJldHVybmVkIHRvIGNhbGxlciB3aGVyZSBhICsxIChvd25pbmcpIHJldGFpbiBjb3VudCBpcyBleHBlY3RlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5PYmplY3Qgd2l0aCBhICswIHJldGFpbiBjb3VudCByZXR1cm5lZCB0byBjYWxsZXIgd2hlcmUgYSArMSAob3duaW5nKSByZXRhaW4gY291bnQgaXMgZXhwZWN0ZWQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+Y2F0ZWdvcnk8L2tleT48c3RyaW5nPk1lbW9yeSAoQ29yZSBGb3VuZGF0aW9uL09iamVjdGl2ZS1DKTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT50eXBlPC9rZXk+PHN0cmluZz5NZXRob2Qgc2hvdWxkIHJldHVybiBhbiBvd25lZCBvYmplY3Q8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+Y3JlYXRlSW5jb3JyZWN0bHlBdXRvcmVsZWFzZWRDRlR5cGU8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDMzPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGQ3JlYXRlU29tZXRoaW5nJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztDRkNyZWF0ZVNvbWV0aGluZyZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNDg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA0OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA0OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDQ5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNDk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA0OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA0OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA0OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCByZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgcmVsZWFzZWQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA0OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA0OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDUyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDUyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA1MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDUyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj45PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UtY291bnRlZCBvYmplY3QgaXMgdXNlZCBhZnRlciBpdCBpcyByZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5SZWZlcmVuY2UtY291bnRlZCBvYmplY3QgaXMgdXNlZCBhZnRlciBpdCBpcyByZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5SZWZlcmVuY2UtY291bnRlZCBvYmplY3QgaXMgdXNlZCBhZnRlciBpdCBpcyByZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPlVzZS1hZnRlci1yZWxlYXNlPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dF9raW5kPC9rZXk+PHN0cmluZz5mdW5jdGlvbjwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHQ8L2tleT48c3RyaW5nPnVzZUFmdGVyUmVsZWFzZTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjc8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+Mzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPkNhbGwgdG8gZnVuY3Rpb24gJmFwb3M7Q0ZDcmVhdGVTb21ldGhpbmcmYXBvczsgcmV0dXJucyBhIENvcmUgRm91bmRhdGlvbiBvYmplY3Qgd2l0aCBhICsxIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGQ3JlYXRlU29tZXRoaW5nJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA1NzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDU4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDU4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjExPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIyPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNTg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBhdXRvcmVsZWFzZWQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA1ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA1ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDU5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDU5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjEwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNTk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+cmFuZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA1OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDU5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDU5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDU5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMiByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+UmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLiBUaGUgb2JqZWN0IG5vdyBoYXMgYSArMiByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA1OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA1OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDYwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDYwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA2MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO29iaiZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGxlYWtlZDogb2JqZWN0IGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gJmFwb3M7b2JqJmFwb3M7IGlzIG5vdCByZWZlcmVuY2VkIGxhdGVyIGluIHRoaXMgZXhlY3V0aW9uIHBhdGggYW5kIGhhcyBhIHJldGFpbiBjb3VudCBvZiArMTwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5Qb3RlbnRpYWwgbGVhayBvZiBhbiBvYmplY3Qgc3RvcmVkIGludG8gJmFwb3M7b2JqJmFwb3M7PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+TGVhazwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz50ZXN0QXV0b3JlbGVhc2VSZXR1cm5zSW5wdXQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz4yPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDYwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5wYXRoPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjcwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5DYWxsIHRvIGZ1bmN0aW9uICZhcG9zO0NGQXJyYXlDcmVhdGVNdXRhYmxlJmFwb3M7IHJldHVybnMgYSBDb3JlIEZvdW5kYXRpb24gb2JqZWN0IHdpdGggYSArMSByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+Q2FsbCB0byBmdW5jdGlvbiAmYXBvcztDRkFycmF5Q3JlYXRlTXV0YWJsZSZhcG9zOyByZXR1cm5zIGEgQ29yZSBGb3VuZGF0aW9uIG9iamVjdCB3aXRoIGEgKzEgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNzc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA3ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA3ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDc4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDc4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zNDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDc4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42MjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDc4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40ODwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDc4PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj42MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmRlcHRoPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5leHRlbmRlZF9tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IGF1dG9yZWxlYXNlZDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5Pm1lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNzg8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA3OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA3OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xMDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmV2ZW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDc5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA3OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTc8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA3OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTI8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA3OTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTY8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzIgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPlJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZC4gVGhlIG9iamVjdCBub3cgaGFzIGEgKzIgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmtpbmQ8L2tleT48c3RyaW5nPmNvbnRyb2w8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5lZGdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PnN0YXJ0PC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwNzk8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA4MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA4MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwODA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgbGVha2VkOiBvYmplY3QgYWxsb2NhdGVkIGFuZCBzdG9yZWQgaW50byAmYXBvczthcnImYXBvczsgaXMgbm90IHJlZmVyZW5jZWQgbGF0ZXIgaW4gdGhpcyBleGVjdXRpb24gcGF0aCBhbmQgaGFzIGEgcmV0YWluIGNvdW50IG9mICsxPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBsZWFrZWQ6IG9iamVjdCBhbGxvY2F0ZWQgYW5kIHN0b3JlZCBpbnRvICZhcG9zO2FyciZhcG9zOyBpcyBub3QgcmVmZXJlbmNlZCBsYXRlciBpbiB0aGlzIGV4ZWN1dGlvbiBwYXRoIGFuZCBoYXMgYSByZXRhaW4gY291bnQgb2YgKzE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5kZXNjcmlwdGlvbjwva2V5PjxzdHJpbmc+UG90ZW50aWFsIGxlYWsgb2YgYW4gb2JqZWN0IHN0b3JlZCBpbnRvICZhcG9zO2FyciZhcG9zOzwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jYXRlZ29yeTwva2V5PjxzdHJpbmc+TWVtb3J5IChDb3JlIEZvdW5kYXRpb24vT2JqZWN0aXZlLUMpPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnR5cGU8L2tleT48c3RyaW5nPkxlYWs8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0X2tpbmQ8L2tleT48c3RyaW5nPmZ1bmN0aW9uPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+aXNzdWVfY29udGV4dDwva2V5PjxzdHJpbmc+YXV0b3JlbGVhc2VSZXR1cm5pbmdUeXBlZE9iamVjdDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2hhc2g8L2tleT48c3RyaW5nPjE8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwODA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PnBhdGg8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5jb250cm9sPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZWRnZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5zdGFydDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDkxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjM8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDkxPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGtleT5lbmQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA5NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA5NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+ZXZlbnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5sb2NhdGlvbjwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwOTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PnJhbmdlczwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwOTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE5PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwOTQ8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjIwPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5OU051bWJlciBsaXRlcmFsIGlzIGFuIG9iamVjdCB3aXRoIGEgKzAgcmV0YWluIGNvdW50PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk5TTnVtYmVyIGxpdGVyYWwgaXMgYW4gb2JqZWN0IHdpdGggYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA5NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA5NDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj40PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+ZW5kPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwOTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwOTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MzwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5yYW5nZXM8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDk1PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwOTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwOTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxrZXk+bGluZTwva2V5PjxpbnRlZ2VyPjIwOTU8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjI2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZGVwdGg8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmV4dGVuZGVkX21lc3NhZ2U8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+bWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCBhdXRvcmVsZWFzZWQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+a2luZDwva2V5PjxzdHJpbmc+Y29udHJvbDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmVkZ2VzPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8YXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgIDxrZXk+c3RhcnQ8L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgIDxhcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4zPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmZpbGU8L2tleT48aW50ZWdlcj4wPC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA5NTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xNTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICA8a2V5PmVuZDwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPGFycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDk2PC9pbnRlZ2VyPgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgICA8a2V5PmNvbDwva2V5PjxpbnRlZ2VyPjE8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgPC9kaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgICAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6ICAgICAgICA8L2RpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICAgICA8L2FycmF5PgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICA8ZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5raW5kPC9rZXk+PHN0cmluZz5ldmVudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgICA8a2V5PmxvY2F0aW9uPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxkaWN0PgorLy8gQ0hFQ0stTkVYVDogICAgICAgPGtleT5saW5lPC9rZXk+PGludGVnZXI+MjA5NjwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+Y29sPC9rZXk+PGludGVnZXI+MTwvaW50ZWdlcj4KKy8vIENIRUNLLU5FWFQ6ICAgICAgIDxrZXk+ZmlsZTwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5kZXB0aDwva2V5PjxpbnRlZ2VyPjA8L2ludGVnZXI+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxrZXk+ZXh0ZW5kZWRfbWVzc2FnZTwva2V5PgorLy8gQ0hFQ0stTkVYVDogICAgICA8c3RyaW5nPk9iamVjdCB3YXMgYXV0b3JlbGVhc2VkIGJ1dCBoYXMgYSArMCByZXRhaW4gY291bnQ8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgICAgPGtleT5tZXNzYWdlPC9rZXk+CisvLyBDSEVDSy1ORVhUOiAgICAgIDxzdHJpbmc+T2JqZWN0IHdhcyBhdXRvcmVsZWFzZWQgYnV0IGhhcyBhICswIHJldGFpbiBjb3VudDwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICAgIDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6ICAgIDwvYXJyYXk+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmRlc2NyaXB0aW9uPC9rZXk+PHN0cmluZz5PYmplY3QgYXV0b3JlbGVhc2VkIHRvbyBtYW55IHRpbWVzPC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmNhdGVnb3J5PC9rZXk+PHN0cmluZz5NZW1vcnkgKENvcmUgRm91bmRhdGlvbi9PYmplY3RpdmUtQyk8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgIDxrZXk+dHlwZTwva2V5PjxzdHJpbmc+T2JqZWN0IGF1dG9yZWxlYXNlZCB0b28gbWFueSB0aW1lczwvc3RyaW5nPgorLy8gQ0hFQ0stTkVYVDogICA8a2V5Pmlzc3VlX2NvbnRleHRfa2luZDwva2V5PjxzdHJpbmc+ZnVuY3Rpb248L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9jb250ZXh0PC9rZXk+PHN0cmluZz5hdXRvcmVsZWFzZU9iakM8L3N0cmluZz4KKy8vIENIRUNLLU5FWFQ6ICAgPGtleT5pc3N1ZV9oYXNoPC9rZXk+PHN0cmluZz42PC9zdHJpbmc+CisvLyBDSEVDSy1ORVhUOiAgIDxrZXk+bG9jYXRpb248L2tleT4KKy8vIENIRUNLLU5FWFQ6ICAgPGRpY3Q+CisvLyBDSEVDSy1ORVhUOiAgICA8a2V5PmxpbmU8L2tleT48aW50ZWdlcj4yMDk2PC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5jb2w8L2tleT48aW50ZWdlcj4xPC9pbnRlZ2VyPgogLy8gQ0hFQ0stTkVYVDogICAgPGtleT5maWxlPC9rZXk+PGludGVnZXI+MDwvaW50ZWdlcj4KIC8vIENIRUNLLU5FWFQ6ICAgPC9kaWN0PgogLy8gQ0hFQ0stTkVYVDogICA8L2RpY3Q+CiAvLyBDSEVDSy1ORVhUOiAgPC9hcnJheT4KKy8vIENIRUNLLU5FWFQ6IDwvZGljdD4KKy8vIENIRUNLLU5FWFQ6IDwvcGxpc3Q+CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL3N0YWNrYWRkcmxlYWsuYyBiL3Rlc3QvQW5hbHlzaXMvc3RhY2thZGRybGVhay5jCmluZGV4IDRmODFmNjYuLjIxYTE1ZDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvc3RhY2thZGRybGVhay5jCisrKyBiL3Rlc3QvQW5hbHlzaXMvc3RhY2thZGRybGVhay5jCkBAIC0xLDUgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUgLXZlcmlmeSAtc3RkPWM5OSAtRGJvb2w9X0Jvb2wgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlIC12ZXJpZnkgLXggYysrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y29yZSAtdmVyaWZ5IC1zdGQ9Yzk5IC1EYm9vbD1fQm9vbCAtV25vLWJvb2wtY29udmVyc2lvbiAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUgLXZlcmlmeSAteCBjKysgLVduby1ib29sLWNvbnZlcnNpb24gJXMKIAogdHlwZWRlZiBfX0lOVFBUUl9UWVBFX18gaW50cHRyX3Q7CiBjaGFyIGNvbnN0ICpwOwpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy9zdXBlcmNsYXNzLm0gYi90ZXN0L0FuYWx5c2lzL3N1cGVyY2xhc3MubQppbmRleCBiYTVlYTQwLi5kNWQzYzQ3IDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL3N1cGVyY2xhc3MubQorKysgYi90ZXN0L0FuYWx5c2lzL3N1cGVyY2xhc3MubQpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZmJsb2NrcyAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1hbHBoYS5vc3guY29jb2EuTWlzc2luZ1N1cGVyQ2FsbCAtdmVyaWZ5IC1Xbm8tb2JqYy1yb290LWNsYXNzICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZibG9ja3MgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9b3N4LmNvY29hLk1pc3NpbmdTdXBlckNhbGwgLXZlcmlmeSAtV25vLW9iamMtcm9vdC1jbGFzcyAlcwogCiAvLyBEZWZpbmUgdXNlZCBDbGFzc2VzCiBAcHJvdG9jb2wgTlNPYmplY3QKZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvdGVtcC1vYmotZHRvcnMtY2ZnLW91dHB1dC5jcHAgYi90ZXN0L0FuYWx5c2lzL3RlbXAtb2JqLWR0b3JzLWNmZy1vdXRwdXQuY3BwCmluZGV4IGZmNjhhODcuLjY0ZjFmYTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvdGVtcC1vYmotZHRvcnMtY2ZnLW91dHB1dC5jcHAKKysrIGIvdGVzdC9BbmFseXNpcy90ZW1wLW9iai1kdG9ycy1jZmctb3V0cHV0LmNwcApAQCAtMSw3ICsxLDYgQEAKIC8vIFJVTjogcm0gLWYgJXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1kZWJ1Zy5EdW1wQ0ZHIC1hbmFseXplci1jb25maWcgY2ZnLXRlbXBvcmFyeS1kdG9ycz10cnVlICVzID4gJXQgMj4mMQogLy8gUlVOOiBGaWxlQ2hlY2sgLS1pbnB1dC1maWxlPSV0ICVzCi0vLyBYUEFTUzogKgogCiBjbGFzcyBBIHsKIHB1YmxpYzoKQEAgLTUyLDYgKzUxLDM3IEBACiAgIGludCBiOwogfQogCitzdHJ1Y3QgQyB7CisgIEMoKTpiXyh0cnVlKSB7fQorICB+QygpIHt9CisKKyAgb3BlcmF0b3IgYm9vbCgpIHsgcmV0dXJuIGJfOyB9CisgIGJvb2wgYl87Cit9OworCitzdHJ1Y3QgRCB7CisgIEQoKTpiXyh0cnVlKSB7fQorCisgIG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiBiXzsgfQorICBib29sIGJfOworfTsKKworaW50IHRlc3RfY29uZF91bm5hbWVkX2N1c3RvbV9kZXN0cnVjdG9yKCkgeworICBpZiAoQygpKSB7IHJldHVybiAxOyB9IGVsc2UgeyByZXR1cm4gMDsgfQorfQorCitpbnQgdGVzdF9jb25kX25hbWVkX2N1c3RvbV9kZXN0cnVjdG9yKCkgeworICBpZiAoQyBjID0gQygpKSB7IHJldHVybiAxOyB9IGVsc2UgeyByZXR1cm4gMDsgfQorfQorCitpbnQgdGVzdF9jb25kX3VubmFtZWRfYXV0b19kZXN0cnVjdG9yKCkgeworICBpZiAoRCgpKSB7IHJldHVybiAxOyB9IGVsc2UgeyByZXR1cm4gMDsgfQorfQorCitpbnQgdGVzdF9jb25kX25hbWVkX2F1dG9fZGVzdHJ1Y3RvcigpIHsKKyAgaWYgKEQgZCA9IEQoKSkgeyByZXR1cm4gMTsgfSBlbHNlIHsgcmV0dXJuIDA7IH0KK30KKwogdm9pZCB0ZXN0X2NvbmRfY3JlZigpIHsKICAgY29uc3QgQSYgYSA9IEIoKSA/IEEoKSA6IEEoQigpKTsKICAgZm9vKEIoKSA/IEEoKSA6IEEoQigpKSk7CkBAIC0xMjYsNiArMTU2LDM4IEBACiAgIGludCBiOwogfQogCitleHRlcm4gYm9vbCBjaGVjayhjb25zdCBOb1JldHVybiYpOworCisvLyBQUjE2NjY0IGFuZCBQUjE4MTU5CitpbnQgdGVzdENvbnNpc3RlbmN5TmVzdGVkU2ltcGxlKGJvb2wgdmFsdWUpIHsKKyAgaWYgKHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSB8fCBjaGVjayhOb1JldHVybigpKSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvLyBQUjE2NjY0IGFuZCBQUjE4MTU5CitpbnQgdGVzdENvbnNpc3RlbmN5TmVzdGVkQ29tcGxleChib29sIHZhbHVlKSB7CisgIGlmICh2YWx1ZSkgeworICAgIGlmICghdmFsdWUgfHwgIXZhbHVlIHx8IGNoZWNrKE5vUmV0dXJuKCkpKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIFBSMTY2NjQgYW5kIFBSMTgxNTkKK2ludCB0ZXN0Q29uc2lzdGVuY3lOZXN0ZWROb3JtYWxSZXR1cm4oYm9vbCB2YWx1ZSkgeworICBpZiAodmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlIHx8IHZhbHVlIHx8IGNoZWNrKE5vUmV0dXJuKCkpKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKIC8vIENIRUNLOiAgIFtCMSAoRU5UUlkpXQogLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCiAvLyBDSEVDSzogICBbQjAgKEVYSVQpXQpAQCAtMjEyLDE3ICsyNzQsMTcgQEAKIC8vIENIRUNLOiAgICAgMTogQSgpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBBKQogLy8gQ0hFQ0s6ICAgICAyOiBbQjEuMV0gKEJpbmRUZW1wb3JhcnkpCiAvLyBDSEVDSzogICAgIDM6IFtCMS4yXS5vcGVyYXRvciBpbnQKLS8vIENIRUNLOiAgICAgNDogW0IxLjNdKCkKKy8vIENIRUNLOiAgICAgNDogW0IxLjJdCiAvLyBDSEVDSzogICAgIDU6IFtCMS40XSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBpbnQpCiAvLyBDSEVDSzogICAgIDY6IGludChbQjEuNV0pIChDWFhGdW5jdGlvbmFsQ2FzdEV4cHIsIE5vT3AsIGludCkKIC8vIENIRUNLOiAgICAgNzogQigpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBCKQogLy8gQ0hFQ0s6ICAgICA4OiBbQjEuN10gKEJpbmRUZW1wb3JhcnkpCiAvLyBDSEVDSzogICAgIDk6IFtCMS44XS5vcGVyYXRvciBpbnQKLS8vIENIRUNLOiAgICAxMDogW0IxLjldKCkKKy8vIENIRUNLOiAgICAxMDogW0IxLjhdCiAvLyBDSEVDSzogICAgMTE6IFtCMS4xMF0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgaW50KQogLy8gQ0hFQ0s6ICAgIDEyOiBpbnQoW0IxLjExXSkgKENYWEZ1bmN0aW9uYWxDYXN0RXhwciwgTm9PcCwgaW50KQogLy8gQ0hFQ0s6ICAgIDEzOiBbQjEuNl0gKyBbQjEuMTJdCi0vLyBDSEVDSzogICAgMTQ6IGludCBhID0gaW50KEEoKS5vcGVyYXRvciBpbnQoKSkgKyBpbnQoQigpLm9wZXJhdG9yIGludCgpKTsKKy8vIENIRUNLOiAgICAxNDogaW50IGEgPSBpbnQoQSgpKSArIGludChCKCkpOwogLy8gQ0hFQ0s6ICAgIDE1OiB+QigpIChUZW1wb3Jhcnkgb2JqZWN0IGRlc3RydWN0b3IpCiAvLyBDSEVDSzogICAgMTY6IH5BKCkgKFRlbXBvcmFyeSBvYmplY3QgZGVzdHJ1Y3RvcikKIC8vIENIRUNLOiAgICAxNzogZm9vCkBAIC0yMzAsMTMgKzI5MiwxMyBAQAogLy8gQ0hFQ0s6ICAgIDE5OiBBKCkgKENYWENvbnN0cnVjdEV4cHIsIGNsYXNzIEEpCiAvLyBDSEVDSzogICAgMjA6IFtCMS4xOV0gKEJpbmRUZW1wb3JhcnkpCiAvLyBDSEVDSzogICAgMjE6IFtCMS4yMF0ub3BlcmF0b3IgaW50Ci0vLyBDSEVDSzogICAgMjI6IFtCMS4yMV0oKQorLy8gQ0hFQ0s6ICAgIDIyOiBbQjEuMjBdCiAvLyBDSEVDSzogICAgMjM6IFtCMS4yMl0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgaW50KQogLy8gQ0hFQ0s6ICAgIDI0OiBpbnQoW0IxLjIzXSkgKENYWEZ1bmN0aW9uYWxDYXN0RXhwciwgTm9PcCwgaW50KQogLy8gQ0hFQ0s6ICAgIDI1OiBCKCkgKENYWENvbnN0cnVjdEV4cHIsIGNsYXNzIEIpCiAvLyBDSEVDSzogICAgMjY6IFtCMS4yNV0gKEJpbmRUZW1wb3JhcnkpCiAvLyBDSEVDSzogICAgMjc6IFtCMS4yNl0ub3BlcmF0b3IgaW50Ci0vLyBDSEVDSzogICAgMjg6IFtCMS4yN10oKQorLy8gQ0hFQ0s6ICAgIDI4OiBbQjEuMjZdCiAvLyBDSEVDSzogICAgMjk6IFtCMS4yOF0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgaW50KQogLy8gQ0hFQ0s6ICAgIDMwOiBpbnQoW0IxLjI5XSkgKENYWEZ1bmN0aW9uYWxDYXN0RXhwciwgTm9PcCwgaW50KQogLy8gQ0hFQ0s6ICAgIDMxOiBbQjEuMjRdICsgW0IxLjMwXQpAQCAtMjYyLDE0ICszMjQsMTQgQEAKIC8vIENIRUNLOiAgIFtCM10KIC8vIENIRUNLOiAgICAgMTogW0I1LjhdICYmIFtCNC41XQogLy8gQ0hFQ0s6ICAgICAyOiBbQjUuM10oW0IzLjFdKQotLy8gQ0hFQ0s6ICAgICBUOiBbQjUuOF0gJiYgLi4uCisvLyBDSEVDSzogICAgIFQ6IChUZW1wIER0b3IpIFtCNS44XSAmJiAuLi4KIC8vIENIRUNLOiAgICAgUHJlZHMgKDIpOiBCNCBCNQogLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMik6IEIyIEIxCiAvLyBDSEVDSzogICBbQjRdCiAvLyBDSEVDSzogICAgIDE6IEIoKSAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgQikKIC8vIENIRUNLOiAgICAgMjogW0I0LjFdIChCaW5kVGVtcG9yYXJ5KQotLy8gQ0hFQ0s6ICAgICAzOiBbQjQuMl0ub3BlcmF0b3IgX0Jvb2wKLS8vIENIRUNLOiAgICAgNDogW0I0LjNdKCkKKy8vIENIRUNLOiAgICAgMzogW0I0LjJdLm9wZXJhdG9yIGJvb2wKKy8vIENIRUNLOiAgICAgNDogW0I0LjJdCiAvLyBDSEVDSzogICAgIDU6IFtCNC40XSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBfQm9vbCkKIC8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCNQogLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIzCkBAIC0yNzksOCArMzQxLDggQEAKIC8vIENIRUNLOiAgICAgMzogW0I1LjJdIChJbXBsaWNpdENhc3RFeHByLCBGdW5jdGlvblRvUG9pbnRlckRlY2F5LCB2b2lkICgqKShfQm9vbCkpCiAvLyBDSEVDSzogICAgIDQ6IEEoKSAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgQSkKIC8vIENIRUNLOiAgICAgNTogW0I1LjRdIChCaW5kVGVtcG9yYXJ5KQotLy8gQ0hFQ0s6ICAgICA2OiBbQjUuNV0ub3BlcmF0b3IgX0Jvb2wKLS8vIENIRUNLOiAgICAgNzogW0I1LjZdKCkKKy8vIENIRUNLOiAgICAgNjogW0I1LjVdLm9wZXJhdG9yIGJvb2wKKy8vIENIRUNLOiAgICAgNzogW0I1LjVdCiAvLyBDSEVDSzogICAgIDg6IFtCNS43XSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBfQm9vbCkKIC8vIENIRUNLOiAgICAgVDogW0I1LjhdICYmIC4uLgogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMik6IEI2IEI3CkBAIC0yOTEsMjMgKzM1MywyMyBAQAogLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEI1CiAvLyBDSEVDSzogICBbQjddCiAvLyBDSEVDSzogICAgIDE6IFtCOS41XSAmJiBbQjguNV0KLS8vIENIRUNLOiAgICAgMjogYm9vbCBhID0gQSgpLm9wZXJhdG9yIF9Cb29sKCkgJiYgQigpLm9wZXJhdG9yIF9Cb29sKCk7Ci0vLyBDSEVDSzogICAgIFQ6IFtCOS41XSAmJiAuLi4KKy8vIENIRUNLOiAgICAgMjogYm9vbCBhID0gQSgpICYmIEIoKTsKKy8vIENIRUNLOiAgICAgVDogKFRlbXAgRHRvcikgW0I5LjVdICYmIC4uLgogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMik6IEI4IEI5CiAvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjYgQjUKIC8vIENIRUNLOiAgIFtCOF0KIC8vIENIRUNLOiAgICAgMTogQigpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBCKQogLy8gQ0hFQ0s6ICAgICAyOiBbQjguMV0gKEJpbmRUZW1wb3JhcnkpCi0vLyBDSEVDSzogICAgIDM6IFtCOC4yXS5vcGVyYXRvciBfQm9vbAotLy8gQ0hFQ0s6ICAgICA0OiBbQjguM10oKQorLy8gQ0hFQ0s6ICAgICAzOiBbQjguMl0ub3BlcmF0b3IgYm9vbAorLy8gQ0hFQ0s6ICAgICA0OiBbQjguMl0KIC8vIENIRUNLOiAgICAgNTogW0I4LjRdIChJbXBsaWNpdENhc3RFeHByLCBVc2VyRGVmaW5lZENvbnZlcnNpb24sIF9Cb29sKQogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI5CiAvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjcKIC8vIENIRUNLOiAgIFtCOV0KIC8vIENIRUNLOiAgICAgMTogQSgpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBBKQogLy8gQ0hFQ0s6ICAgICAyOiBbQjkuMV0gKEJpbmRUZW1wb3JhcnkpCi0vLyBDSEVDSzogICAgIDM6IFtCOS4yXS5vcGVyYXRvciBfQm9vbAotLy8gQ0hFQ0s6ICAgICA0OiBbQjkuM10oKQorLy8gQ0hFQ0s6ICAgICAzOiBbQjkuMl0ub3BlcmF0b3IgYm9vbAorLy8gQ0hFQ0s6ICAgICA0OiBbQjkuMl0KIC8vIENIRUNLOiAgICAgNTogW0I5LjRdIChJbXBsaWNpdENhc3RFeHByLCBVc2VyRGVmaW5lZENvbnZlcnNpb24sIF9Cb29sKQogLy8gQ0hFQ0s6ICAgICBUOiBbQjkuNV0gJiYgLi4uCiAvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjEwCkBAIC0zMjgsMTQgKzM5MCwxNCBAQAogLy8gQ0hFQ0s6ICAgW0IzXQogLy8gQ0hFQ0s6ICAgICAxOiBbQjUuOF0gfHwgW0I0LjVdCiAvLyBDSEVDSzogICAgIDI6IFtCNS4zXShbQjMuMV0pCi0vLyBDSEVDSzogICAgIFQ6IFtCNS44XSB8fCAuLi4KKy8vIENIRUNLOiAgICAgVDogKFRlbXAgRHRvcikgW0I1LjhdIHx8IC4uLgogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMik6IEI0IEI1CiAvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjEgQjIKIC8vIENIRUNLOiAgIFtCNF0KIC8vIENIRUNLOiAgICAgMTogQigpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBCKQogLy8gQ0hFQ0s6ICAgICAyOiBbQjQuMV0gKEJpbmRUZW1wb3JhcnkpCi0vLyBDSEVDSzogICAgIDM6IFtCNC4yXS5vcGVyYXRvciBfQm9vbAotLy8gQ0hFQ0s6ICAgICA0OiBbQjQuM10oKQorLy8gQ0hFQ0s6ICAgICAzOiBbQjQuMl0ub3BlcmF0b3IgYm9vbAorLy8gQ0hFQ0s6ICAgICA0OiBbQjQuMl0KIC8vIENIRUNLOiAgICAgNTogW0I0LjRdIChJbXBsaWNpdENhc3RFeHByLCBVc2VyRGVmaW5lZENvbnZlcnNpb24sIF9Cb29sKQogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI1CiAvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjMKQEAgLTM0NSw4ICs0MDcsOCBAQAogLy8gQ0hFQ0s6ICAgICAzOiBbQjUuMl0gKEltcGxpY2l0Q2FzdEV4cHIsIEZ1bmN0aW9uVG9Qb2ludGVyRGVjYXksIHZvaWQgKCopKF9Cb29sKSkKIC8vIENIRUNLOiAgICAgNDogQSgpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBBKQogLy8gQ0hFQ0s6ICAgICA1OiBbQjUuNF0gKEJpbmRUZW1wb3JhcnkpCi0vLyBDSEVDSzogICAgIDY6IFtCNS41XS5vcGVyYXRvciBfQm9vbAotLy8gQ0hFQ0s6ICAgICA3OiBbQjUuNl0oKQorLy8gQ0hFQ0s6ICAgICA2OiBbQjUuNV0ub3BlcmF0b3IgYm9vbAorLy8gQ0hFQ0s6ICAgICA3OiBbQjUuNV0KIC8vIENIRUNLOiAgICAgODogW0I1LjddIChJbXBsaWNpdENhc3RFeHByLCBVc2VyRGVmaW5lZENvbnZlcnNpb24sIF9Cb29sKQogLy8gQ0hFQ0s6ICAgICBUOiBbQjUuOF0gfHwgLi4uCiAvLyBDSEVDSzogICAgIFByZWRzICgyKTogQjYgQjcKQEAgLTM1NywyMyArNDE5LDIzIEBACiAvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjUKIC8vIENIRUNLOiAgIFtCN10KIC8vIENIRUNLOiAgICAgMTogW0I5LjVdIHx8IFtCOC41XQotLy8gQ0hFQ0s6ICAgICAyOiBib29sIGEgPSBBKCkub3BlcmF0b3IgX0Jvb2woKSB8fCBCKCkub3BlcmF0b3IgX0Jvb2woKTsKLS8vIENIRUNLOiAgICAgVDogW0I5LjVdIHx8IC4uLgorLy8gQ0hFQ0s6ICAgICAyOiBib29sIGEgPSBBKCkgfHwgQigpOworLy8gQ0hFQ0s6ICAgICBUOiAoVGVtcCBEdG9yKSBbQjkuNV0gfHwgLi4uCiAvLyBDSEVDSzogICAgIFByZWRzICgyKTogQjggQjkKIC8vIENIRUNLOiAgICAgU3VjY3MgKDIpOiBCNSBCNgogLy8gQ0hFQ0s6ICAgW0I4XQogLy8gQ0hFQ0s6ICAgICAxOiBCKCkgKENYWENvbnN0cnVjdEV4cHIsIGNsYXNzIEIpCiAvLyBDSEVDSzogICAgIDI6IFtCOC4xXSAoQmluZFRlbXBvcmFyeSkKLS8vIENIRUNLOiAgICAgMzogW0I4LjJdLm9wZXJhdG9yIF9Cb29sCi0vLyBDSEVDSzogICAgIDQ6IFtCOC4zXSgpCisvLyBDSEVDSzogICAgIDM6IFtCOC4yXS5vcGVyYXRvciBib29sCisvLyBDSEVDSzogICAgIDQ6IFtCOC4yXQogLy8gQ0hFQ0s6ICAgICA1OiBbQjguNF0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgX0Jvb2wpCiAvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjkKIC8vIENIRUNLOiAgICAgU3VjY3MgKDEpOiBCNwogLy8gQ0hFQ0s6ICAgW0I5XQogLy8gQ0hFQ0s6ICAgICAxOiBBKCkgKENYWENvbnN0cnVjdEV4cHIsIGNsYXNzIEEpCiAvLyBDSEVDSzogICAgIDI6IFtCOS4xXSAoQmluZFRlbXBvcmFyeSkKLS8vIENIRUNLOiAgICAgMzogW0I5LjJdLm9wZXJhdG9yIF9Cb29sCi0vLyBDSEVDSzogICAgIDQ6IFtCOS4zXSgpCisvLyBDSEVDSzogICAgIDM6IFtCOS4yXS5vcGVyYXRvciBib29sCisvLyBDSEVDSzogICAgIDQ6IFtCOS4yXQogLy8gQ0hFQ0s6ICAgICA1OiBbQjkuNF0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgX0Jvb2wpCiAvLyBDSEVDSzogICAgIFQ6IFtCOS41XSB8fCAuLi4KIC8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCMTAKQEAgLTQwNSw4ICs0NjcsOCBAQAogLy8gQ0hFQ0s6ICAgICAxOiB+QigpIChUZW1wb3Jhcnkgb2JqZWN0IGRlc3RydWN0b3IpCiAvLyBDSEVDSzogICAgIDI6IEIoKSAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgQikKIC8vIENIRUNLOiAgICAgMzogW0I0LjJdIChCaW5kVGVtcG9yYXJ5KQotLy8gQ0hFQ0s6ICAgICA0OiBbQjQuM10ub3BlcmF0b3IgX0Jvb2wKLS8vIENIRUNLOiAgICAgNTogW0I0LjRdKCkKKy8vIENIRUNLOiAgICAgNDogW0I0LjNdLm9wZXJhdG9yIGJvb2wKKy8vIENIRUNLOiAgICAgNTogW0I0LjNdCiAvLyBDSEVDSzogICAgIDY6IFtCNC41XSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBfQm9vbCkKIC8vIENIRUNLOiAgICAgNzogfkIoKSAoVGVtcG9yYXJ5IG9iamVjdCBkZXN0cnVjdG9yKQogLy8gQ0hFQ0s6ICAgICBUOiBpZiBbQjQuNl0KQEAgLTQyOSw4ICs0OTEsOCBAQAogLy8gQ0hFQ0s6ICAgICAyOiBbQjcuMV0gKEltcGxpY2l0Q2FzdEV4cHIsIE5vT3AsIGNvbnN0IGNsYXNzIEEpCiAvLyBDSEVDSzogICAgIDM6IFtCNy4yXQogLy8gQ0hFQ0s6ICAgICA0OiBbQjcuM10gKENYWENvbnN0cnVjdEV4cHIsIGNsYXNzIEEpCi0vLyBDSEVDSzogICAgIDU6IEEgYSA9IEIoKS5vcGVyYXRvciBfQm9vbCgpID8gQSgpIDogQShCKCkub3BlcmF0b3IgQSgpKTsKLS8vIENIRUNLOiAgICAgVDogW0IxMC41XSA/IC4uLiA6IC4uLgorLy8gQ0hFQ0s6ICAgICA1OiBBIGEgPSBCKCkgPyBBKCkgOiBBKEIoKSk7CisvLyBDSEVDSzogICAgIFQ6IChUZW1wIER0b3IpIFtCMTAuNV0gPyAuLi4gOiAuLi4KIC8vIENIRUNLOiAgICAgUHJlZHMgKDIpOiBCOCBCOQogLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMik6IEI1IEI2CiAvLyBDSEVDSzogICBbQjhdCkBAIC00NDYsNyArNTA4LDcgQEAKIC8vIENIRUNLOiAgICAgMTogQigpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBCKQogLy8gQ0hFQ0s6ICAgICAyOiBbQjkuMV0gKEJpbmRUZW1wb3JhcnkpCiAvLyBDSEVDSzogICAgIDM6IFtCOS4yXS5vcGVyYXRvciBBCi0vLyBDSEVDSzogICAgIDQ6IFtCOS4zXSgpCisvLyBDSEVDSzogICAgIDQ6IFtCOS4yXQogLy8gQ0hFQ0s6ICAgICA1OiBbQjkuNF0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgY2xhc3MgQSkKIC8vIENIRUNLOiAgICAgNjogW0I5LjVdIChCaW5kVGVtcG9yYXJ5KQogLy8gQ0hFQ0s6ICAgICA3OiBbQjkuNl0gKEltcGxpY2l0Q2FzdEV4cHIsIE5vT3AsIGNvbnN0IGNsYXNzIEEpCkBAIC00NjMsMTQgKzUyNSwxNzQgQEAKIC8vIENIRUNLOiAgIFtCMTBdCiAvLyBDSEVDSzogICAgIDE6IEIoKSAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgQikKIC8vIENIRUNLOiAgICAgMjogW0IxMC4xXSAoQmluZFRlbXBvcmFyeSkKLS8vIENIRUNLOiAgICAgMzogW0IxMC4yXS5vcGVyYXRvciBfQm9vbAotLy8gQ0hFQ0s6ICAgICA0OiBbQjEwLjNdKCkKKy8vIENIRUNLOiAgICAgMzogW0IxMC4yXS5vcGVyYXRvciBib29sCisvLyBDSEVDSzogICAgIDQ6IFtCMTAuMl0KIC8vIENIRUNLOiAgICAgNTogW0IxMC40XSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBfQm9vbCkKIC8vIENIRUNLOiAgICAgVDogW0IxMC41XSA/IC4uLiA6IC4uLgogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEIxMQogLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMik6IEI4IEI5CiAvLyBDSEVDSzogICBbQjAgKEVYSVQpXQogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEIxCisvLyBDSEVDSzogIEMoKSA6IGJfKHRydWUpCisvLyBDSEVDSzogICBbQjIgKEVOVFJZKV0KKy8vIENIRUNLOiAgICAgU3VjY3MgKDEpOiBCMQorLy8gQ0hFQ0s6ICAgW0IxXQorLy8gQ0hFQ0s6ICAgICAxOiB0cnVlCisvLyBDSEVDSzogICAgIDI6IGJfKFtCMS4xXSkgKE1lbWJlciBpbml0aWFsaXplcikKKy8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCMgorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogICBbQjAgKEVYSVQpXQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEIxCisvLyBDSEVDSzogIH5DKCkKKy8vIENIRUNLOiAgIFtCMSAoRU5UUlkpXQorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogICBbQjAgKEVYSVQpXQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEIxCisvLyBDSEVDSzogIG9wZXJhdG9yIGJvb2woKQorLy8gQ0hFQ0s6ICAgW0IyIChFTlRSWSldCisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjEKKy8vIENIRUNLOiAgIFtCMV0KKy8vIENIRUNLOiAgICAgMTogdGhpcworLy8gQ0hFQ0s6ICAgICAyOiBbQjEuMV0tPmJfCisvLyBDSEVDSzogICAgIDM6IFtCMS4yXSAoSW1wbGljaXRDYXN0RXhwciwgTFZhbHVlVG9SVmFsdWUsIF9Cb29sKQorLy8gQ0hFQ0s6ICAgICA0OiByZXR1cm4gW0IxLjNdOworLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEIyCisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKKy8vIENIRUNLOiAgIFtCMCAoRVhJVCldCisvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjEKKy8vIENIRUNLOiAgRCgpIDogYl8odHJ1ZSkKKy8vIENIRUNLOiAgIFtCMiAoRU5UUlkpXQorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIxCisvLyBDSEVDSzogICBbQjFdCisvLyBDSEVDSzogICAgIDE6IHRydWUKKy8vIENIRUNLOiAgICAgMjogYl8oW0IxLjFdKSAoTWVtYmVyIGluaXRpYWxpemVyKQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEIyCisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKKy8vIENIRUNLOiAgIFtCMCAoRVhJVCldCisvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjEKKy8vIENIRUNLOiAgb3BlcmF0b3IgYm9vbCgpCisvLyBDSEVDSzogICBbQjIgKEVOVFJZKV0KKy8vIENIRUNLOiAgICAgU3VjY3MgKDEpOiBCMQorLy8gQ0hFQ0s6ICAgW0IxXQorLy8gQ0hFQ0s6ICAgICAxOiB0aGlzCisvLyBDSEVDSzogICAgIDI6IFtCMS4xXS0+Yl8KKy8vIENIRUNLOiAgICAgMzogW0IxLjJdIChJbXBsaWNpdENhc3RFeHByLCBMVmFsdWVUb1JWYWx1ZSwgX0Jvb2wpCisvLyBDSEVDSzogICAgIDQ6IHJldHVybiBbQjEuM107CisvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjIKKy8vIENIRUNLOiAgICAgU3VjY3MgKDEpOiBCMAorLy8gQ0hFQ0s6ICAgW0IwIChFWElUKV0KKy8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCMQorLy8gQ0hFQ0s6ICBpbnQgdGVzdF9jb25kX3VubmFtZWRfY3VzdG9tX2Rlc3RydWN0b3IoKQorLy8gQ0hFQ0s6ICAgW0I0IChFTlRSWSldCisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjMKKy8vIENIRUNLOiAgIFtCMV0KKy8vIENIRUNLOiAgICAgMTogMAorLy8gQ0hFQ0s6ICAgICAyOiByZXR1cm4gW0IxLjFdOworLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEIzCisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKKy8vIENIRUNLOiAgIFtCMl0KKy8vIENIRUNLOiAgICAgMTogMQorLy8gQ0hFQ0s6ICAgICAyOiByZXR1cm4gW0IyLjFdOworLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEIzCisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKKy8vIENIRUNLOiAgIFtCM10KKy8vIENIRUNLOiAgICAgMTogQygpIChDWFhDb25zdHJ1Y3RFeHByLCBzdHJ1Y3QgQykKKy8vIENIRUNLOiAgICAgMjogW0IzLjFdIChCaW5kVGVtcG9yYXJ5KQorLy8gQ0hFQ0s6ICAgICAzOiBbQjMuMl0ub3BlcmF0b3IgYm9vbAorLy8gQ0hFQ0s6ICAgICA0OiBbQjMuMl0KKy8vIENIRUNLOiAgICAgNTogW0IzLjRdIChJbXBsaWNpdENhc3RFeHByLCBVc2VyRGVmaW5lZENvbnZlcnNpb24sIF9Cb29sKQorLy8gQ0hFQ0s6ICAgICA2OiB+QygpIChUZW1wb3Jhcnkgb2JqZWN0IGRlc3RydWN0b3IpCisvLyBDSEVDSzogICAgIFQ6IGlmIFtCMy41XQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI0CisvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjIgQjEKKy8vIENIRUNLOiAgIFtCMCAoRVhJVCldCisvLyBDSEVDSzogICAgIFByZWRzICgyKTogQjEgQjIKKy8vIENIRUNLOiAgaW50IHRlc3RfY29uZF9uYW1lZF9jdXN0b21fZGVzdHJ1Y3RvcigpCisvLyBDSEVDSzogICBbQjUgKEVOVFJZKV0KKy8vIENIRUNLOiAgICAgU3VjY3MgKDEpOiBCNAorLy8gQ0hFQ0s6ICAgW0IxXQorLy8gQ0hFQ0s6ICAgICAxOiBbQjQuN10ufkMoKSAoSW1wbGljaXQgZGVzdHJ1Y3RvcikKKy8vIENIRUNLOiAgICAgU3VjY3MgKDEpOiBCMAorLy8gQ0hFQ0s6ICAgW0IyXQorLy8gQ0hFQ0s6ICAgICAxOiAwCisvLyBDSEVDSzogICAgIDI6IHJldHVybiBbQjIuMV07CisvLyBDSEVDSzogICAgIDM6IFtCNC43XS5+QygpIChJbXBsaWNpdCBkZXN0cnVjdG9yKQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI0CisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKKy8vIENIRUNLOiAgIFtCM10KKy8vIENIRUNLOiAgICAgMTogMQorLy8gQ0hFQ0s6ICAgICAyOiByZXR1cm4gW0IzLjFdOworLy8gQ0hFQ0s6ICAgICAzOiBbQjQuN10ufkMoKSAoSW1wbGljaXQgZGVzdHJ1Y3RvcikKKy8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCNAorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogICBbQjRdCisvLyBDSEVDSzogICAgIDE6IEMoKSAoQ1hYQ29uc3RydWN0RXhwciwgc3RydWN0IEMpCisvLyBDSEVDSzogICAgIDI6IFtCNC4xXSAoQmluZFRlbXBvcmFyeSkKKy8vIENIRUNLOiAgICAgMzogW0I0LjJdIChJbXBsaWNpdENhc3RFeHByLCBOb09wLCBjb25zdCBzdHJ1Y3QgQykKKy8vIENIRUNLOiAgICAgNDogW0I0LjNdCisvLyBDSEVDSzogICAgIDU6IFtCNC40XSAoQ1hYQ29uc3RydWN0RXhwciwgc3RydWN0IEMpCisvLyBDSEVDSzogICAgIDY6IH5DKCkgKFRlbXBvcmFyeSBvYmplY3QgZGVzdHJ1Y3RvcikKKy8vIENIRUNLOiAgICAgNzogQyBjID0gQygpOworLy8gQ0hFQ0s6ICAgICA4OiBjCisvLyBDSEVDSzogICAgIDk6IFtCNC44XS5vcGVyYXRvciBib29sCisvLyBDSEVDSzogICAgMTA6IFtCNC44XQorLy8gQ0hFQ0s6ICAgIDExOiBbQjQuMTBdIChJbXBsaWNpdENhc3RFeHByLCBVc2VyRGVmaW5lZENvbnZlcnNpb24sIF9Cb29sKQorLy8gQ0hFQ0s6ICAgICBUOiBpZiBbQjQuMTFdCisvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjUKKy8vIENIRUNLOiAgICAgU3VjY3MgKDIpOiBCMyBCMgorLy8gQ0hFQ0s6ICAgW0IwIChFWElUKV0KKy8vIENIRUNLOiAgICAgUHJlZHMgKDMpOiBCMSBCMiBCMworLy8gQ0hFQ0s6ICBpbnQgdGVzdF9jb25kX3VubmFtZWRfYXV0b19kZXN0cnVjdG9yKCkKKy8vIENIRUNLOiAgIFtCNCAoRU5UUlkpXQorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIzCisvLyBDSEVDSzogICBbQjFdCisvLyBDSEVDSzogICAgIDE6IDAKKy8vIENIRUNLOiAgICAgMjogcmV0dXJuIFtCMS4xXTsKKy8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCMworLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogICBbQjJdCisvLyBDSEVDSzogICAgIDE6IDEKKy8vIENIRUNLOiAgICAgMjogcmV0dXJuIFtCMi4xXTsKKy8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCMworLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogICBbQjNdCisvLyBDSEVDSzogICAgIDE6IEQoKSAoQ1hYQ29uc3RydWN0RXhwciwgc3RydWN0IEQpCisvLyBDSEVDSzogICAgIDI6IFtCMy4xXS5vcGVyYXRvciBib29sCisvLyBDSEVDSzogICAgIDM6IFtCMy4xXQorLy8gQ0hFQ0s6ICAgICA0OiBbQjMuM10gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgX0Jvb2wpCisvLyBDSEVDSzogICAgIFQ6IGlmIFtCMy40XQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI0CisvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjIgQjEKKy8vIENIRUNLOiAgIFtCMCAoRVhJVCldCisvLyBDSEVDSzogICAgIFByZWRzICgyKTogQjEgQjIKKy8vIENIRUNLOiAgaW50IHRlc3RfY29uZF9uYW1lZF9hdXRvX2Rlc3RydWN0b3IoKQorLy8gQ0hFQ0s6ICAgW0I0IChFTlRSWSldCisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjMKKy8vIENIRUNLOiAgIFtCMV0KKy8vIENIRUNLOiAgICAgMTogMAorLy8gQ0hFQ0s6ICAgICAyOiByZXR1cm4gW0IxLjFdOworLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEIzCisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKKy8vIENIRUNLOiAgIFtCMl0KKy8vIENIRUNLOiAgICAgMTogMQorLy8gQ0hFQ0s6ICAgICAyOiByZXR1cm4gW0IyLjFdOworLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEIzCisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKKy8vIENIRUNLOiAgIFtCM10KKy8vIENIRUNLOiAgICAgMTogRCgpIChDWFhDb25zdHJ1Y3RFeHByLCBzdHJ1Y3QgRCkKKy8vIENIRUNLOiAgICAgMjogW0IzLjFdIChJbXBsaWNpdENhc3RFeHByLCBOb09wLCBjb25zdCBzdHJ1Y3QgRCkKKy8vIENIRUNLOiAgICAgMzogW0IzLjJdCisvLyBDSEVDSzogICAgIDQ6IFtCMy4zXSAoQ1hYQ29uc3RydWN0RXhwciwgc3RydWN0IEQpCisvLyBDSEVDSzogICAgIDU6IEQgZCA9IEQoKTsKKy8vIENIRUNLOiAgICAgNjogZAorLy8gQ0hFQ0s6ICAgICA3OiBbQjMuNl0ub3BlcmF0b3IgYm9vbAorLy8gQ0hFQ0s6ICAgICA4OiBbQjMuNl0KKy8vIENIRUNLOiAgICAgOTogW0IzLjhdIChJbXBsaWNpdENhc3RFeHByLCBVc2VyRGVmaW5lZENvbnZlcnNpb24sIF9Cb29sKQorLy8gQ0hFQ0s6ICAgICBUOiBpZiBbQjMuOV0KKy8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCNAorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMik6IEIyIEIxCisvLyBDSEVDSzogICBbQjAgKEVYSVQpXQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMik6IEIxIEIyCiAvLyBDSEVDSzogICBbQjE0IChFTlRSWSldCiAvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjEzCiAvLyBDSEVDSzogICBbQjFdCkBAIC00OTYsNyArNzE4LDcgQEAKIC8vIENIRUNLOiAgICAgMjogW0I0LjFdIChJbXBsaWNpdENhc3RFeHByLCBOb09wLCBjb25zdCBjbGFzcyBBKQogLy8gQ0hFQ0s6ICAgICAzOiBbQjQuMl0KIC8vIENIRUNLOiAgICAgNDogW0I3LjNdKFtCNC4zXSkKLS8vIENIRUNLOiAgICAgVDogW0I3LjhdID8gLi4uIDogLi4uCisvLyBDSEVDSzogICAgIFQ6IChUZW1wIER0b3IpIFtCNy44XSA/IC4uLiA6IC4uLgogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMik6IEI1IEI2CiAvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjIgQjMKIC8vIENIRUNLOiAgIFtCNV0KQEAgLTUxMiw3ICs3MzQsNyBAQAogLy8gQ0hFQ0s6ICAgICAxOiBCKCkgKENYWENvbnN0cnVjdEV4cHIsIGNsYXNzIEIpCiAvLyBDSEVDSzogICAgIDI6IFtCNi4xXSAoQmluZFRlbXBvcmFyeSkKIC8vIENIRUNLOiAgICAgMzogW0I2LjJdLm9wZXJhdG9yIEEKLS8vIENIRUNLOiAgICAgNDogW0I2LjNdKCkKKy8vIENIRUNLOiAgICAgNDogW0I2LjJdCiAvLyBDSEVDSzogICAgIDU6IFtCNi40XSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBjbGFzcyBBKQogLy8gQ0hFQ0s6ICAgICA2OiBbQjYuNV0gKEJpbmRUZW1wb3JhcnkpCiAvLyBDSEVDSzogICAgIDc6IFtCNi42XSAoSW1wbGljaXRDYXN0RXhwciwgTm9PcCwgY29uc3QgY2xhc3MgQSkKQEAgLTUzMiw4ICs3NTQsOCBAQAogLy8gQ0hFQ0s6ICAgICAzOiBbQjcuMl0gKEltcGxpY2l0Q2FzdEV4cHIsIEZ1bmN0aW9uVG9Qb2ludGVyRGVjYXksIHZvaWQgKCopKGNvbnN0IGNsYXNzIEEgJikpCiAvLyBDSEVDSzogICAgIDQ6IEIoKSAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgQikKIC8vIENIRUNLOiAgICAgNTogW0I3LjRdIChCaW5kVGVtcG9yYXJ5KQotLy8gQ0hFQ0s6ICAgICA2OiBbQjcuNV0ub3BlcmF0b3IgX0Jvb2wKLS8vIENIRUNLOiAgICAgNzogW0I3LjZdKCkKKy8vIENIRUNLOiAgICAgNjogW0I3LjVdLm9wZXJhdG9yIGJvb2wKKy8vIENIRUNLOiAgICAgNzogW0I3LjVdCiAvLyBDSEVDSzogICAgIDg6IFtCNy43XSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBfQm9vbCkKIC8vIENIRUNLOiAgICAgVDogW0I3LjhdID8gLi4uIDogLi4uCiAvLyBDSEVDSzogICAgIFByZWRzICgyKTogQjggQjkKQEAgLTU1Miw4ICs3NzQsOCBAQAogLy8gQ0hFQ0s6ICAgICAxOiBbQjEzLjVdID8gW0IxMS42XSA6IFtCMTIuMTVdCiAvLyBDSEVDSzogICAgIDI6IFtCMTAuMV0gKEltcGxpY2l0Q2FzdEV4cHIsIE5vT3AsIGNvbnN0IGNsYXNzIEEpCiAvLyBDSEVDSzogICAgIDM6IFtCMTAuMl0KLS8vIENIRUNLOiAgICAgNDogY29uc3QgQSAmYSA9IEIoKS5vcGVyYXRvciBfQm9vbCgpID8gQSgpIDogQShCKCkub3BlcmF0b3IgQSgpKTsKLS8vIENIRUNLOiAgICAgVDogW0IxMy41XSA/IC4uLiA6IC4uLgorLy8gQ0hFQ0s6ICAgICA0OiBjb25zdCBBICZhID0gQigpID8gQSgpIDogQShCKCkpOworLy8gQ0hFQ0s6ICAgICBUOiAoVGVtcCBEdG9yKSBbQjEzLjVdID8gLi4uIDogLi4uCiAvLyBDSEVDSzogICAgIFByZWRzICgyKTogQjExIEIxMgogLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMik6IEI4IEI5CiAvLyBDSEVDSzogICBbQjExXQpAQCAtNTY5LDcgKzc5MSw3IEBACiAvLyBDSEVDSzogICAgIDE6IEIoKSAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgQikKIC8vIENIRUNLOiAgICAgMjogW0IxMi4xXSAoQmluZFRlbXBvcmFyeSkKIC8vIENIRUNLOiAgICAgMzogW0IxMi4yXS5vcGVyYXRvciBBCi0vLyBDSEVDSzogICAgIDQ6IFtCMTIuM10oKQorLy8gQ0hFQ0s6ICAgICA0OiBbQjEyLjJdCiAvLyBDSEVDSzogICAgIDU6IFtCMTIuNF0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgY2xhc3MgQSkKIC8vIENIRUNLOiAgICAgNjogW0IxMi41XSAoQmluZFRlbXBvcmFyeSkKIC8vIENIRUNLOiAgICAgNzogW0IxMi42XSAoSW1wbGljaXRDYXN0RXhwciwgTm9PcCwgY29uc3QgY2xhc3MgQSkKQEAgLTU4Niw4ICs4MDgsOCBAQAogLy8gQ0hFQ0s6ICAgW0IxM10KIC8vIENIRUNLOiAgICAgMTogQigpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBCKQogLy8gQ0hFQ0s6ICAgICAyOiBbQjEzLjFdIChCaW5kVGVtcG9yYXJ5KQotLy8gQ0hFQ0s6ICAgICAzOiBbQjEzLjJdLm9wZXJhdG9yIF9Cb29sCi0vLyBDSEVDSzogICAgIDQ6IFtCMTMuM10oKQorLy8gQ0hFQ0s6ICAgICAzOiBbQjEzLjJdLm9wZXJhdG9yIGJvb2wKKy8vIENIRUNLOiAgICAgNDogW0IxMy4yXQogLy8gQ0hFQ0s6ICAgICA1OiBbQjEzLjRdIChJbXBsaWNpdENhc3RFeHByLCBVc2VyRGVmaW5lZENvbnZlcnNpb24sIF9Cb29sKQogLy8gQ0hFQ0s6ICAgICBUOiBbQjEzLjVdID8gLi4uIDogLi4uCiAvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjE0CkBAIC02MTcsNyArODM5LDcgQEAKIC8vIENIRUNLOiAgICAgMzogW0I0LjJdCiAvLyBDSEVDSzogICAgIDQ6IFtCNC4zXSAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgQSkKIC8vIENIRUNLOiAgICAgNTogQSBhID0gQSgpID86IEEoKTsKLS8vIENIRUNLOiAgICAgVDogW0I3LjVdID8gLi4uIDogLi4uCisvLyBDSEVDSzogICAgIFQ6IChUZW1wIER0b3IpIFtCNy41XSA/IC4uLiA6IC4uLgogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMik6IEI1IEI2CiAvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjIgQjMKIC8vIENIRUNLOiAgIFtCNV0KQEAgLTYzOSw4ICs4NjEsOCBAQAogLy8gQ0hFQ0s6ICAgW0I3XQogLy8gQ0hFQ0s6ICAgICAxOiBBKCkgKENYWENvbnN0cnVjdEV4cHIsIGNsYXNzIEEpCiAvLyBDSEVDSzogICAgIDI6IFtCNy4xXSAoQmluZFRlbXBvcmFyeSkKLS8vIENIRUNLOiAgICAgMzogW0I3LjJdLm9wZXJhdG9yIF9Cb29sCi0vLyBDSEVDSzogICAgIDQ6IFtCNy4zXSgpCisvLyBDSEVDSzogICAgIDM6IFtCNy4yXS5vcGVyYXRvciBib29sCisvLyBDSEVDSzogICAgIDQ6IFtCNy4yXQogLy8gQ0hFQ0s6ICAgICA1OiBbQjcuNF0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgX0Jvb2wpCiAvLyBDSEVDSzogICAgIFQ6IFtCNy41XSA/IC4uLiA6IC4uLgogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI4CkBAIC02NjksNyArODkxLDcgQEAKIC8vIENIRUNLOiAgICAgMjogW0I0LjFdIChJbXBsaWNpdENhc3RFeHByLCBOb09wLCBjb25zdCBjbGFzcyBBKQogLy8gQ0hFQ0s6ICAgICAzOiBbQjQuMl0KIC8vIENIRUNLOiAgICAgNDogW0I3LjNdKFtCNC4zXSkKLS8vIENIRUNLOiAgICAgVDogW0I3LjhdID8gLi4uIDogLi4uCisvLyBDSEVDSzogICAgIFQ6IChUZW1wIER0b3IpIFtCNy44XSA/IC4uLiA6IC4uLgogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMik6IEI1IEI2CiAvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjIgQjMKIC8vIENIRUNLOiAgIFtCNV0KQEAgLTY5NCw4ICs5MTYsOCBAQAogLy8gQ0hFQ0s6ICAgICAzOiBbQjcuMl0gKEltcGxpY2l0Q2FzdEV4cHIsIEZ1bmN0aW9uVG9Qb2ludGVyRGVjYXksIHZvaWQgKCopKGNvbnN0IGNsYXNzIEEgJikpCiAvLyBDSEVDSzogICAgIDQ6IEEoKSAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgQSkKIC8vIENIRUNLOiAgICAgNTogW0I3LjRdIChCaW5kVGVtcG9yYXJ5KQotLy8gQ0hFQ0s6ICAgICA2OiBbQjcuNV0ub3BlcmF0b3IgX0Jvb2wKLS8vIENIRUNLOiAgICAgNzogW0I3LjZdKCkKKy8vIENIRUNLOiAgICAgNjogW0I3LjVdLm9wZXJhdG9yIGJvb2wKKy8vIENIRUNLOiAgICAgNzogW0I3LjVdCiAvLyBDSEVDSzogICAgIDg6IFtCNy43XSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBfQm9vbCkKIC8vIENIRUNLOiAgICAgVDogW0I3LjhdID8gLi4uIDogLi4uCiAvLyBDSEVDSzogICAgIFByZWRzICgyKTogQjkgQjgKQEAgLTcwOSw3ICs5MzEsNyBAQAogLy8gQ0hFQ0s6ICAgICAyOiBbQjkuMV0gKEltcGxpY2l0Q2FzdEV4cHIsIE5vT3AsIGNvbnN0IGNsYXNzIEEpCiAvLyBDSEVDSzogICAgIDM6IFtCOS4yXQogLy8gQ0hFQ0s6ICAgICA0OiBjb25zdCBBICZhID0gQSgpID86IEEoKTsKLS8vIENIRUNLOiAgICAgVDogW0IxMi41XSA/IC4uLiA6IC4uLgorLy8gQ0hFQ0s6ICAgICBUOiAoVGVtcCBEdG9yKSBbQjEyLjVdID8gLi4uIDogLi4uCiAvLyBDSEVDSzogICAgIFByZWRzICgyKTogQjEwIEIxMQogLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMik6IEI3IEI4CiAvLyBDSEVDSzogICBbQjEwXQpAQCAtNzMxLDggKzk1Myw4IEBACiAvLyBDSEVDSzogICBbQjEyXQogLy8gQ0hFQ0s6ICAgICAxOiBBKCkgKENYWENvbnN0cnVjdEV4cHIsIGNsYXNzIEEpCiAvLyBDSEVDSzogICAgIDI6IFtCMTIuMV0gKEJpbmRUZW1wb3JhcnkpCi0vLyBDSEVDSzogICAgIDM6IFtCMTIuMl0ub3BlcmF0b3IgX0Jvb2wKLS8vIENIRUNLOiAgICAgNDogW0IxMi4zXSgpCisvLyBDSEVDSzogICAgIDM6IFtCMTIuMl0ub3BlcmF0b3IgYm9vbAorLy8gQ0hFQ0s6ICAgICA0OiBbQjEyLjJdCiAvLyBDSEVDSzogICAgIDU6IFtCMTIuNF0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgX0Jvb2wpCiAvLyBDSEVDSzogICAgIFQ6IFtCMTIuNV0gPyAuLi4gOiAuLi4KIC8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCMTMKQEAgLTgyOCw3ICsxMDUwLDcgQEAKIC8vIENIRUNLOiAgICAgMjogQSgpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBBKQogLy8gQ0hFQ0s6ICAgICAzOiBbQjEuMl0gKEJpbmRUZW1wb3JhcnkpCiAvLyBDSEVDSzogICAgIDQ6IFtCMS4zXS5vcGVyYXRvciBpbnQKLS8vIENIRUNLOiAgICAgNTogW0IxLjRdKCkKKy8vIENIRUNLOiAgICAgNTogW0IxLjNdCiAvLyBDSEVDSzogICAgIDY6IFtCMS41XSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBpbnQpCiAvLyBDSEVDSzogICAgIDc6IGEKIC8vIENIRUNLOiAgICAgODogW0IxLjddID0gW0IxLjZdCkBAIC04NDQsMTMgKzEwNjYsMTMgQEAKIC8vIENIRUNLOiAgICAgMTogQSgpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBBKQogLy8gQ0hFQ0s6ICAgICAyOiBbQjEuMV0gKEJpbmRUZW1wb3JhcnkpCiAvLyBDSEVDSzogICAgIDM6IFtCMS4yXS5vcGVyYXRvciBpbnQKLS8vIENIRUNLOiAgICAgNDogW0IxLjNdKCkKKy8vIENIRUNLOiAgICAgNDogW0IxLjJdCiAvLyBDSEVDSzogICAgIDU6IFtCMS40XSAoSW1wbGljaXRDYXN0RXhwciwgVXNlckRlZmluZWRDb252ZXJzaW9uLCBpbnQpCiAvLyBDSEVDSzogICAgIDY6IGludChbQjEuNV0pIChDWFhGdW5jdGlvbmFsQ2FzdEV4cHIsIE5vT3AsIGludCkKIC8vIENIRUNLOiAgICAgNzogQigpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBCKQogLy8gQ0hFQ0s6ICAgICA4OiBbQjEuN10gKEJpbmRUZW1wb3JhcnkpCiAvLyBDSEVDSzogICAgIDk6IFtCMS44XS5vcGVyYXRvciBpbnQKLS8vIENIRUNLOiAgICAxMDogW0IxLjldKCkKKy8vIENIRUNLOiAgICAxMDogW0IxLjhdCiAvLyBDSEVDSzogICAgMTE6IFtCMS4xMF0gKEltcGxpY2l0Q2FzdEV4cHIsIFVzZXJEZWZpbmVkQ29udmVyc2lvbiwgaW50KQogLy8gQ0hFQ0s6ICAgIDEyOiBpbnQoW0IxLjExXSkgKENYWEZ1bmN0aW9uYWxDYXN0RXhwciwgTm9PcCwgaW50KQogLy8gQ0hFQ0s6ICAgIDEzOiBbQjEuNl0gKyBbQjEuMTJdCkBAIC04NjMsMTMgKzEwODUsMTIgQEAKIC8vIENIRUNLOiAgICAgU3VjY3MgKDEpOiBCMAogLy8gQ0hFQ0s6ICAgW0IwIChFWElUKV0KIC8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCMQotCiAvLyBDSEVDSzogICBbQjMgKEVOVFJZKV0KIC8vIENIRUNLOiAgICAgU3VjY3MgKDEpOiBCMgogLy8gQ0hFQ0s6ICAgW0IxXQogLy8gQ0hFQ0s6ICAgICAxOiBpbnQgYjsKIC8vIENIRUNLOiAgICAgU3VjY3MgKDEpOiBCMAotLy8gQ0hFQ0s6ICAgW0IyXQorLy8gQ0hFQ0s6ICAgW0IyIChOT1JFVFVSTildCiAvLyBDSEVDSzogICAgIDE6IGludCBhOwogLy8gQ0hFQ0s6ICAgICAyOiBOb1JldHVybigpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBOb1JldHVybikKIC8vIENIRUNLOiAgICAgMzogW0IyLjJdIChCaW5kVGVtcG9yYXJ5KQpAQCAtODgwLDEzICsxMTAxLDEyIEBACiAvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKIC8vIENIRUNLOiAgIFtCMCAoRVhJVCldCiAvLyBDSEVDSzogICAgIFByZWRzICgyKTogQjEgQjIKLQogLy8gQ0hFQ0s6ICAgW0IzIChFTlRSWSldCiAvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjIKIC8vIENIRUNLOiAgIFtCMV0KIC8vIENIRUNLOiAgICAgMTogaW50IGI7CiAvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKLS8vIENIRUNLOiAgIFtCMl0KKy8vIENIRUNLOiAgIFtCMiAoTk9SRVRVUk4pXQogLy8gQ0hFQ0s6ICAgICAxOiBpbnQgYTsKIC8vIENIRUNLOiAgICAgMjogTm9SZXR1cm4oKSAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgTm9SZXR1cm4pCiAvLyBDSEVDSzogICAgIDM6IFtCMi4yXSAoQmluZFRlbXBvcmFyeSkKQEAgLTg5NywzICsxMTE3LDE2OSBAQAogLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCiAvLyBDSEVDSzogICBbQjAgKEVYSVQpXQogLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMik6IEIxIEIyCisvLyBDSEVDSzogIGludCB0ZXN0Q29uc2lzdGVuY3lOZXN0ZWRTaW1wbGUoYm9vbCB2YWx1ZSkKKy8vIENIRUNLOiAgIFtCOSAoRU5UUlkpXQorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEI4CisvLyBDSEVDSzogICBbQjFdCisvLyBDSEVDSzogICAgIDE6IDAKKy8vIENIRUNLOiAgICAgMjogcmV0dXJuIFtCMS4xXTsKKy8vIENIRUNLOiAgICAgUHJlZHMgKDIpOiBCMyBCOAorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogICBbQjJdCisvLyBDSEVDSzogICAgIDE6IDEKKy8vIENIRUNLOiAgICAgMjogcmV0dXJuIFtCMi4xXTsKKy8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCMworLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogICBbQjNdCisvLyBDSEVDSzogICAgIFQ6IGlmIFtCNS4xXQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI1CisvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjIgQjEKKy8vIENIRUNLOiAgIFtCNCAoTk9SRVRVUk4pXQorLy8gQ0hFQ0s6ICAgICAxOiB+Tm9SZXR1cm4oKSAoVGVtcG9yYXJ5IG9iamVjdCBkZXN0cnVjdG9yKQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI1CisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKKy8vIENIRUNLOiAgIFtCNV0KKy8vIENIRUNLOiAgICAgMTogW0I3LjNdIHx8IFtCNi43XQorLy8gQ0hFQ0s6ICAgICBUOiAoVGVtcCBEdG9yKSBbQjcuM10gfHwgLi4uCisvLyBDSEVDSzogICAgIFByZWRzICgyKTogQjYgQjcKKy8vIENIRUNLOiAgICAgU3VjY3MgKDIpOiBCMyBCNAorLy8gQ0hFQ0s6ICAgW0I2XQorLy8gQ0hFQ0s6ICAgICAxOiBjaGVjaworLy8gQ0hFQ0s6ICAgICAyOiBbQjYuMV0gKEltcGxpY2l0Q2FzdEV4cHIsIEZ1bmN0aW9uVG9Qb2ludGVyRGVjYXksIF9Cb29sICgqKShjb25zdCBjbGFzcyBOb1JldHVybiAmKSkKKy8vIENIRUNLOiAgICAgMzogTm9SZXR1cm4oKSAoQ1hYQ29uc3RydWN0RXhwciwgY2xhc3MgTm9SZXR1cm4pCisvLyBDSEVDSzogICAgIDQ6IFtCNi4zXSAoQmluZFRlbXBvcmFyeSkKKy8vIENIRUNLOiAgICAgNTogW0I2LjRdIChJbXBsaWNpdENhc3RFeHByLCBOb09wLCBjb25zdCBjbGFzcyBOb1JldHVybikKKy8vIENIRUNLOiAgICAgNjogW0I2LjVdCisvLyBDSEVDSzogICAgIDc6IFtCNi4yXShbQjYuNl0pCisvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjcKKy8vIENIRUNLOiAgICAgU3VjY3MgKDEpOiBCNQorLy8gQ0hFQ0s6ICAgW0I3XQorLy8gQ0hFQ0s6ICAgICAxOiB2YWx1ZQorLy8gQ0hFQ0s6ICAgICAyOiBbQjcuMV0gKEltcGxpY2l0Q2FzdEV4cHIsIExWYWx1ZVRvUlZhbHVlLCBfQm9vbCkKKy8vIENIRUNLOiAgICAgMzogIVtCNy4yXQorLy8gQ0hFQ0s6ICAgICBUOiBbQjcuM10gfHwgLi4uCisvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjgKKy8vIENIRUNLOiAgICAgU3VjY3MgKDIpOiBCNSBCNgorLy8gQ0hFQ0s6ICAgW0I4XQorLy8gQ0hFQ0s6ICAgICAxOiB2YWx1ZQorLy8gQ0hFQ0s6ICAgICAyOiBbQjguMV0gKEltcGxpY2l0Q2FzdEV4cHIsIExWYWx1ZVRvUlZhbHVlLCBfQm9vbCkKKy8vIENIRUNLOiAgICAgVDogaWYgW0I4LjJdCisvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjkKKy8vIENIRUNLOiAgICAgU3VjY3MgKDIpOiBCNyBCMQorLy8gQ0hFQ0s6ICAgW0IwIChFWElUKV0KKy8vIENIRUNLOiAgICAgUHJlZHMgKDMpOiBCMSBCMiBCNAorLy8gQ0hFQ0s6ICBpbnQgdGVzdENvbnNpc3RlbmN5TmVzdGVkQ29tcGxleChib29sIHZhbHVlKQorLy8gQ0hFQ0s6ICAgW0IxMCAoRU5UUlkpXQorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEI5CisvLyBDSEVDSzogICBbQjFdCisvLyBDSEVDSzogICAgIDE6IDAKKy8vIENIRUNLOiAgICAgMjogcmV0dXJuIFtCMS4xXTsKKy8vIENIRUNLOiAgICAgUHJlZHMgKDIpOiBCMyBCOQorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogICBbQjJdCisvLyBDSEVDSzogICAgIDE6IDEKKy8vIENIRUNLOiAgICAgMjogcmV0dXJuIFtCMi4xXTsKKy8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCMworLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogICBbQjNdCisvLyBDSEVDSzogICAgIFQ6IGlmIFtCNS4xXQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI1CisvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjIgQjEKKy8vIENIRUNLOiAgIFtCNCAoTk9SRVRVUk4pXQorLy8gQ0hFQ0s6ICAgICAxOiB+Tm9SZXR1cm4oKSAoVGVtcG9yYXJ5IG9iamVjdCBkZXN0cnVjdG9yKQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI1CisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKKy8vIENIRUNLOiAgIFtCNV0KKy8vIENIRUNLOiAgICAgMTogW0I4LjNdIHx8IFtCNy4zXSB8fCBbQjYuN10KKy8vIENIRUNLOiAgICAgVDogKFRlbXAgRHRvcikgW0I4LjNdIHx8IFtCNy4zXSB8fCAuLi4KKy8vIENIRUNLOiAgICAgUHJlZHMgKDMpOiBCNiBCNyBCOAorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMik6IEIzIEI0CisvLyBDSEVDSzogICBbQjZdCisvLyBDSEVDSzogICAgIDE6IGNoZWNrCisvLyBDSEVDSzogICAgIDI6IFtCNi4xXSAoSW1wbGljaXRDYXN0RXhwciwgRnVuY3Rpb25Ub1BvaW50ZXJEZWNheSwgX0Jvb2wgKCopKGNvbnN0IGNsYXNzIE5vUmV0dXJuICYpKQorLy8gQ0hFQ0s6ICAgICAzOiBOb1JldHVybigpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBOb1JldHVybikKKy8vIENIRUNLOiAgICAgNDogW0I2LjNdIChCaW5kVGVtcG9yYXJ5KQorLy8gQ0hFQ0s6ICAgICA1OiBbQjYuNF0gKEltcGxpY2l0Q2FzdEV4cHIsIE5vT3AsIGNvbnN0IGNsYXNzIE5vUmV0dXJuKQorLy8gQ0hFQ0s6ICAgICA2OiBbQjYuNV0KKy8vIENIRUNLOiAgICAgNzogW0I2LjJdKFtCNi42XSkKKy8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCNworLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEI1CisvLyBDSEVDSzogICBbQjddCisvLyBDSEVDSzogICAgIDE6IHZhbHVlCisvLyBDSEVDSzogICAgIDI6IFtCNy4xXSAoSW1wbGljaXRDYXN0RXhwciwgTFZhbHVlVG9SVmFsdWUsIF9Cb29sKQorLy8gQ0hFQ0s6ICAgICAzOiAhW0I3LjJdCisvLyBDSEVDSzogICAgIFQ6IFtCOC4zXSB8fCBbQjcuM10gfHwgLi4uCisvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjgKKy8vIENIRUNLOiAgICAgU3VjY3MgKDIpOiBCNSBCNgorLy8gQ0hFQ0s6ICAgW0I4XQorLy8gQ0hFQ0s6ICAgICAxOiB2YWx1ZQorLy8gQ0hFQ0s6ICAgICAyOiBbQjguMV0gKEltcGxpY2l0Q2FzdEV4cHIsIExWYWx1ZVRvUlZhbHVlLCBfQm9vbCkKKy8vIENIRUNLOiAgICAgMzogIVtCOC4yXQorLy8gQ0hFQ0s6ICAgICBUOiBbQjguM10gfHwgLi4uCisvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjkKKy8vIENIRUNLOiAgICAgU3VjY3MgKDIpOiBCNSBCNworLy8gQ0hFQ0s6ICAgW0I5XQorLy8gQ0hFQ0s6ICAgICAxOiB2YWx1ZQorLy8gQ0hFQ0s6ICAgICAyOiBbQjkuMV0gKEltcGxpY2l0Q2FzdEV4cHIsIExWYWx1ZVRvUlZhbHVlLCBfQm9vbCkKKy8vIENIRUNLOiAgICAgVDogaWYgW0I5LjJdCisvLyBDSEVDSzogICAgIFByZWRzICgxKTogQjEwCisvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjggQjEKKy8vIENIRUNLOiAgIFtCMCAoRVhJVCldCisvLyBDSEVDSzogICAgIFByZWRzICgzKTogQjEgQjIgQjQKKy8vIENIRUNLOiAgaW50IHRlc3RDb25zaXN0ZW5jeU5lc3RlZE5vcm1hbFJldHVybihib29sIHZhbHVlKQorLy8gQ0hFQ0s6ICAgW0IxMCAoRU5UUlkpXQorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEI5CisvLyBDSEVDSzogICBbQjFdCisvLyBDSEVDSzogICAgIDE6IDAKKy8vIENIRUNLOiAgICAgMjogcmV0dXJuIFtCMS4xXTsKKy8vIENIRUNLOiAgICAgUHJlZHMgKDIpOiBCMyBCOQorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogICBbQjJdCisvLyBDSEVDSzogICAgIDE6IDEKKy8vIENIRUNLOiAgICAgMjogcmV0dXJuIFtCMi4xXTsKKy8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCMworLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEIwCisvLyBDSEVDSzogICBbQjNdCisvLyBDSEVDSzogICAgIFQ6IGlmIFtCNS4xXQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI1CisvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjIgQjEKKy8vIENIRUNLOiAgIFtCNCAoTk9SRVRVUk4pXQorLy8gQ0hFQ0s6ICAgICAxOiB+Tm9SZXR1cm4oKSAoVGVtcG9yYXJ5IG9iamVjdCBkZXN0cnVjdG9yKQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI1CisvLyBDSEVDSzogICAgIFN1Y2NzICgxKTogQjAKKy8vIENIRUNLOiAgIFtCNV0KKy8vIENIRUNLOiAgICAgMTogW0I4LjNdIHx8IFtCNy4yXSB8fCBbQjYuN10KKy8vIENIRUNLOiAgICAgVDogKFRlbXAgRHRvcikgW0I4LjNdIHx8IFtCNy4yXSB8fCAuLi4KKy8vIENIRUNLOiAgICAgUHJlZHMgKDMpOiBCNiBCNyBCOAorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMik6IEIzIEI0CisvLyBDSEVDSzogICBbQjZdCisvLyBDSEVDSzogICAgIDE6IGNoZWNrCisvLyBDSEVDSzogICAgIDI6IFtCNi4xXSAoSW1wbGljaXRDYXN0RXhwciwgRnVuY3Rpb25Ub1BvaW50ZXJEZWNheSwgX0Jvb2wgKCopKGNvbnN0IGNsYXNzIE5vUmV0dXJuICYpKQorLy8gQ0hFQ0s6ICAgICAzOiBOb1JldHVybigpIChDWFhDb25zdHJ1Y3RFeHByLCBjbGFzcyBOb1JldHVybikKKy8vIENIRUNLOiAgICAgNDogW0I2LjNdIChCaW5kVGVtcG9yYXJ5KQorLy8gQ0hFQ0s6ICAgICA1OiBbQjYuNF0gKEltcGxpY2l0Q2FzdEV4cHIsIE5vT3AsIGNvbnN0IGNsYXNzIE5vUmV0dXJuKQorLy8gQ0hFQ0s6ICAgICA2OiBbQjYuNV0KKy8vIENIRUNLOiAgICAgNzogW0I2LjJdKFtCNi42XSkKKy8vIENIRUNLOiAgICAgUHJlZHMgKDEpOiBCNworLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMSk6IEI1CisvLyBDSEVDSzogICBbQjddCisvLyBDSEVDSzogICAgIDE6IHZhbHVlCisvLyBDSEVDSzogICAgIDI6IFtCNy4xXSAoSW1wbGljaXRDYXN0RXhwciwgTFZhbHVlVG9SVmFsdWUsIF9Cb29sKQorLy8gQ0hFQ0s6ICAgICBUOiBbQjguM10gfHwgW0I3LjJdIHx8IC4uLgorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI4CisvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjUgQjYKKy8vIENIRUNLOiAgIFtCOF0KKy8vIENIRUNLOiAgICAgMTogdmFsdWUKKy8vIENIRUNLOiAgICAgMjogW0I4LjFdIChJbXBsaWNpdENhc3RFeHByLCBMVmFsdWVUb1JWYWx1ZSwgX0Jvb2wpCisvLyBDSEVDSzogICAgIDM6ICFbQjguMl0KKy8vIENIRUNLOiAgICAgVDogW0I4LjNdIHx8IC4uLgorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEI5CisvLyBDSEVDSzogICAgIFN1Y2NzICgyKTogQjUgQjcKKy8vIENIRUNLOiAgIFtCOV0KKy8vIENIRUNLOiAgICAgMTogdmFsdWUKKy8vIENIRUNLOiAgICAgMjogW0I5LjFdIChJbXBsaWNpdENhc3RFeHByLCBMVmFsdWVUb1JWYWx1ZSwgX0Jvb2wpCisvLyBDSEVDSzogICAgIFQ6IGlmIFtCOS4yXQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMSk6IEIxMAorLy8gQ0hFQ0s6ICAgICBTdWNjcyAoMik6IEI4IEIxCisvLyBDSEVDSzogICBbQjAgKEVYSVQpXQorLy8gQ0hFQ0s6ICAgICBQcmVkcyAoMyk6IEIxIEIyIEI0CmRpZmYgLS1naXQgYS90ZXN0L0FuYWx5c2lzL3RlbXBvcmFyaWVzLmNwcCBiL3Rlc3QvQW5hbHlzaXMvdGVtcG9yYXJpZXMuY3BwCmluZGV4IDZiNDlmY2IuLjNiYjg4YzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5hbHlzaXMvdGVtcG9yYXJpZXMuY3BwCisrKyBiL3Rlc3QvQW5hbHlzaXMvdGVtcG9yYXJpZXMuY3BwCkBAIC0xMTksOCArMTE5LDggQEAKICAgICBleHRlcm4gYm9vbCBjaGVjayhjb25zdCBEdG9yICYpOwogCiAjaWZuZGVmIFRFTVBPUkFSWV9EVE9SUwotICAgIC8vIEZJWE1FOiBEb24ndCBjcmFzaCBoZXJlIHdoZW4gdG1wIGR0cm9zIGFyZSBlbmFibGVkLgotICAgIC8vIFBSMTY2NjQgYW5kIFBSMTgxNTkgCisgICAgLy8gRklYTUU6IERvbid0IGFzc2VydCBoZXJlIHdoZW4gdG1wIGR0b3JzIGFyZSBlbmFibGVkLgorICAgIC8vIFBSMTY2NjQgYW5kIFBSMTgxNTkKICAgICBpZiAoY29pbigpICYmIChjb2luKCkgfHwgY29pbigpIHx8IGNoZWNrKER0b3IoKSkpKSB7CiAgICAgICBEdG9yKCk7CiAgICAgfQpAQCAtMTcwLDEwICsxNzAsOSBAQAogICAgIGNsYW5nX2FuYWx5emVyX2V2YWwodHJ1ZSk7IC8vIG5vIHdhcm5pbmcsIHVucmVhY2hhYmxlIGNvZGUKICAgfQogCi0KIC8qCi0gIC8vIFBSMTY2NjQgYW5kIFBSMTgxNTkgCi0gIEZJWE1FOiBEb24ndCBjcmFzaCBoZXJlLgorICAvLyBQUjE2NjY0IGFuZCBQUjE4MTU5CisgIEZJWE1FOiBEb24ndCBhc3NlcnQgaGVyZS4KICAgdm9pZCB0ZXN0Q29uc2lzdGVuY3lOZXN0ZWQoaW50IGkpIHsKICAgICBleHRlcm4gYm9vbCBjb21wdXRlKGJvb2wpOwogICAKQEAgLTE5Myw2ICsxOTIsNyBAQAogICAgICAgY2xhbmdfYW5hbHl6ZXJfZXZhbCh0cnVlKTsgLy8gZXhwZWN0ZWQgVFJVRQogICAgIH0KIAorICAgIEZJWE1FOiBUaGlzIHNob3VsZG4ndCBjYXVzZSBhIHdhcm5pbmcuCiAgICAgaWYgKGNvbXB1dGUoaSA9PSA1ICYmCiAgICAgICAgICAgICAgICAgKGkgPT0gNCB8fCBpID09IDQgfHwKICAgICAgICAgICAgICAgICAgY29tcHV0ZShpID09IDUgJiYgKGkgPT0gNCB8fCBjaGVjayhOb1JldHVybkR0b3IoKSkpKSkpIHx8CkBAIC0yMDAsNyArMjAwLDM1IEBACiAgICAgICBjbGFuZ19hbmFseXplcl9ldmFsKHRydWUpOyAvLyBubyB3YXJuaW5nLCB1bnJlYWNoYWJsZSBjb2RlCiAgICAgfQogICB9Ki8KLSAgCisKKyAgLy8gUFIxNjY2NCBhbmQgUFIxODE1OQorICB2b2lkIHRlc3RDb25zaXN0ZW5jeU5lc3RlZFNpbXBsZShib29sIHZhbHVlKSB7CisgICAgaWYgKHZhbHVlKSB7CisgICAgICBpZiAoIXZhbHVlIHx8IGNoZWNrKE5vUmV0dXJuRHRvcigpKSkgeworICAgICAgICBjbGFuZ19hbmFseXplcl9ldmFsKHRydWUpOyAvLyBubyB3YXJuaW5nLCB1bnJlYWNoYWJsZSBjb2RlCisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gUFIxNjY2NCBhbmQgUFIxODE1OQorICB2b2lkIHRlc3RDb25zaXN0ZW5jeU5lc3RlZENvbXBsZXgoYm9vbCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSkgeworICAgICAgaWYgKCF2YWx1ZSB8fCAhdmFsdWUgfHwgY2hlY2soTm9SZXR1cm5EdG9yKCkpKSB7CisgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZG4ndCBjYXVzZSBhIHdhcm5pbmcuCisgICAgICAgIGNsYW5nX2FuYWx5emVyX2V2YWwodHJ1ZSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFBSMTY2NjQgYW5kIFBSMTgxNTkKKyAgdm9pZCB0ZXN0Q29uc2lzdGVuY3lOZXN0ZWRXYXJuaW5nKGJvb2wgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUgfHwgY2hlY2soTm9SZXR1cm5EdG9yKCkpKSB7CisgICAgICAgIGNsYW5nX2FuYWx5emVyX2V2YWwodHJ1ZSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RSVUV9fQorICAgICAgfQorICAgIH0KKyAgfQorCiAjZW5kaWYgLy8gVEVNUE9SQVJZX0RUT1JTCiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvdW5pbml0LWNvbnN0LmMgYi90ZXN0L0FuYWx5c2lzL3VuaW5pdC1jb25zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDJkMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0FuYWx5c2lzL3VuaW5pdC1jb25zdC5jCkBAIC0wLDAgKzEsMjE2IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9dW5peC5NYWxsb2MsY29yZSxhbHBoYS5jb3JlLkNhbGxBbmRNZXNzYWdlVW5Jbml0UmVmQXJnIC1hbmFseXplci1vdXRwdXQ9dGV4dCAtdmVyaWZ5ICVzCisKKy8vIFBhc3NpbmcgdW5pbml0aWFsaXplZCBjb25zdCBkYXRhIHRvIGZ1bmN0aW9uCisjaW5jbHVkZSAiSW5wdXRzL3N5c3RlbS1oZWFkZXItc2ltdWxhdG9yLmgiCisKK3R5cGVkZWYgX190eXBlb2Yoc2l6ZW9mKGludCkpIHNpemVfdDsKK3ZvaWQgKm1hbGxvYyhzaXplX3QpOwordm9pZCAqdmFsbG9jKHNpemVfdCk7Cit2b2lkIGZyZWUodm9pZCAqKTsKKworCit2b2lkIGRvU3R1ZmYzKGNvbnN0IGludCB5KXt9Cit2b2lkIGRvU3R1ZmYyKGludCBnKXt9Cit2b2lkIGRvU3R1ZmZfcG9pbnRlclRvQ29uc3RJbnQoY29uc3QgaW50ICp1KXt9Owordm9pZCBkb1N0dWZmX2FycmF5T2ZDb25zdEludChjb25zdCBpbnQgYVtdKXt9OworCit2b2lkIGRvU3R1ZmZfY29uc3RQb2ludGVyVG9Db25zdEludCAgICAgICAgICAgICAgKGludCBjb25zdCAqIGNvbnN0IHUpe307Cit2b2lkIGRvU3R1ZmZfY29uc3RQb2ludGVyVG9Db25zdFBvaW50ZXJUb0NvbnN0SW50KGludCBjb25zdCAqIGNvbnN0ICogY29uc3QgdSl7fTsKK3ZvaWQgZG9TdHVmZl9wb2ludGVyVG9Db25zdFBvaW50ZXJUb0NvbnN0SW50KGludCBjb25zdCAqIGNvbnN0ICogdSl7fTsKK3ZvaWQgZG9TdHVmZl9wb2ludGVyVG9Qb2ludGVyVG9Db25zdEludCAgICAgICAoaW50IGNvbnN0ICoqdSl7fTsKK3ZvaWQgZG9TdHVmZl9jb25zdFN0YXRpY1NpemVkQXJyYXkoY29uc3QgaW50IGFbc3RhdGljIDEwXSkge30KK3ZvaWQgZG9TdHVmZl92YXJpYWRpYyhjb25zdCBpbnQgKnUsIC4uLil7fTsKKwordm9pZCBmXzEodm9pZCkgeworICBpbnQgdDsKKyAgaW50KiB0cCA9ICZ0OyAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7eyd0cCcgaW5pdGlhbGl6ZWQgaGVyZX19CisgIGRvU3R1ZmZfcG9pbnRlclRvQ29uc3RJbnQodHApOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlQC0xIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdW5pbml0aWFsaXplZCB2YWx1ZX19Cit9CisKK3ZvaWQgZl8xXzEodm9pZCkgeworICBpbnQgdDsKKyAgaW50KiB0cDEgPSAmdDsKKyAgaW50KiB0cDIgPSB0cDE7ICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7J3RwMicgaW5pdGlhbGl6ZWQgaGVyZX19CisgIGRvU3R1ZmZfcG9pbnRlclRvQ29uc3RJbnQodHAyKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB1bmluaXRpYWxpemVkIHZhbHVlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMSB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorfQorCisKK2ludCAqZl8yX3N1YihpbnQgKnApIHsKKyAgcmV0dXJuIHA7Cit9CisKK3ZvaWQgZl8yKHZvaWQpIHsKKyAgaW50IHQ7CisgIGludCogcCA9IGZfMl9zdWIoJnQpOworICBpbnQqIHRwID0gcDsgLy8gZXhwZWN0ZWQtbm90ZSB7eyd0cCcgaW5pdGlhbGl6ZWQgaGVyZX19CisgIGRvU3R1ZmZfcG9pbnRlclRvQ29uc3RJbnQodHApOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdW5pbml0aWFsaXplZCB2YWx1ZX19CisgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMSB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorfQorCitpbnQgejsKK3ZvaWQgZl8zKHZvaWQpIHsKKyAgICAgIGRvU3R1ZmZfcG9pbnRlclRvQ29uc3RJbnQoJnopOyAgLy8gbm8gd2FybmluZworfQorCit2b2lkIGZfNCh2b2lkKSB7CisgICAgICBpbnQgeD01OworICAgICAgZG9TdHVmZl9wb2ludGVyVG9Db25zdEludCgmeCk7ICAvLyBubyB3YXJuaW5nCit9CisKK3ZvaWQgZl81KHZvaWQpIHsKKyAgaW50IHRhWzVdOworICBpbnQqIHRwID0gdGE7ICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7J3RwJyBpbml0aWFsaXplZCBoZXJlfX0KKyAgZG9TdHVmZl9wb2ludGVyVG9Db25zdEludCh0cCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdW5pbml0aWFsaXplZCB2YWx1ZX19CisgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGVALTEge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB1bmluaXRpYWxpemVkIHZhbHVlfX0KK30KKwordm9pZCBmXzVfMSh2b2lkKSB7CisgIGludCB0YVs1XTsgICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3sndGEnIGluaXRpYWxpemVkIGhlcmV9fQorICBkb1N0dWZmX3BvaW50ZXJUb0NvbnN0SW50KHRhKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB1bmluaXRpYWxpemVkIHZhbHVlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMSB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorfQorCit2b2lkIGZfNih2b2lkKSB7CisgIGludCB0YVs1XSA9IHsxLDIsMyw0LDV9OworICBpbnQqIHRwID0gdGE7CisgIGRvU3R1ZmZfcG9pbnRlclRvQ29uc3RJbnQodHApOyAvLyBuby13YXJuaW5nCit9CisKK3ZvaWQgZl82XzEodm9pZCkgeworICBpbnQgdGFbNV0gPSB7MSwyLDMsNCw1fTsKKyAgZG9TdHVmZl9wb2ludGVyVG9Db25zdEludCh0YSk7IC8vIG5vLXdhcm5pbmcKK30KKwordm9pZCBmXzcodm9pZCkgeworICAgICAgaW50IHo7ICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7J3onIGRlY2xhcmVkIHdpdGhvdXQgYW4gaW5pdGlhbCB2YWx1ZX19CisgICAgICBpbnQgeT16OyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tBc3NpZ25lZCB2YWx1ZSBpcyBnYXJiYWdlIG9yIHVuZGVmaW5lZH19CisgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGVALTEge3tBc3NpZ25lZCB2YWx1ZSBpcyBnYXJiYWdlIG9yIHVuZGVmaW5lZH19CisgICAgICBkb1N0dWZmMyh5KTsKK30KKwordm9pZCBmXzgodm9pZCkgeworICAgICAgaW50IGc7ICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3snZycgZGVjbGFyZWQgd2l0aG91dCBhbiBpbml0aWFsIHZhbHVlfX0KKyAgICAgIGRvU3R1ZmYyKGcpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhbiB1bmluaXRpYWxpemVkIHZhbHVlfX0KKyAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlQC0xIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhbiB1bmluaXRpYWxpemVkIHZhbHVlfX0KK30KKwordm9pZCBmXzkodm9pZCkgeworICBpbnQgIGFbNl07CisgIGludCBjb25zdCAqcHRhdSA9IGE7ICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3sncHRhdScgaW5pdGlhbGl6ZWQgaGVyZX19CisgIGRvU3R1ZmZfYXJyYXlPZkNvbnN0SW50KHB0YXUpOyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdW5pbml0aWFsaXplZCB2YWx1ZX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGVALTEge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB1bmluaXRpYWxpemVkIHZhbHVlfX0KK30KKwordm9pZCBmXzEwKHZvaWQpIHsKKyAgaW50ICBhWzZdOyAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3snYScgaW5pdGlhbGl6ZWQgaGVyZX19CisgIGRvU3R1ZmZfYXJyYXlPZkNvbnN0SW50KGEpOyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdW5pbml0aWFsaXplZCB2YWx1ZX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlQC0xIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdW5pbml0aWFsaXplZCB2YWx1ZX19Cit9CisKK3ZvaWQgZl8xMSh2b2lkKSB7CisgIGludCB0WzEwXTsgICAgICAgICAgICAgICAgICAgIC8vZXhwZWN0ZWQtbm90ZSB7eyd0JyBpbml0aWFsaXplZCBoZXJlfX0KKyAgZG9TdHVmZl9jb25zdFN0YXRpY1NpemVkQXJyYXkodCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdW5pbml0aWFsaXplZCB2YWx1ZX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGVALTEge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB1bmluaXRpYWxpemVkIHZhbHVlfX0KK30KKwordm9pZCBmXzEyKHZvaWQpIHsKKyAgaW50IHRbMTBdID0gezAsMSwyLDMsNCw1LDYsNyw4LDl9OworICBkb1N0dWZmX2NvbnN0U3RhdGljU2l6ZWRBcnJheSh0KTsgIC8vIG5vLXdhcm5pbmcKKworfQorCitpbnQgZl9tYWxsb2NfMSh2b2lkKSB7CisgIGludCAqcHRyOworCisgIHB0ciA9IChpbnQgKiltYWxsb2Moc2l6ZW9mKGludCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7VmFsdWUgYXNzaWduZWQgdG8gJ3B0cid9fQorCisgIGRvU3R1ZmZfcG9pbnRlclRvQ29uc3RJbnQocHRyKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlQC0xIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdW5pbml0aWFsaXplZCB2YWx1ZX19CisgIGZyZWUocHRyKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBmX21hbGxvY18yKHZvaWQpIHsKKyAgaW50ICpwdHI7CisKKyAgcHRyID0gKGludCAqKW1hbGxvYyhzaXplb2YoaW50KSk7CisgICpwdHIgPSAyNTsKKworICBkb1N0dWZmX3BvaW50ZXJUb0NvbnN0SW50KHB0cik7IC8vIG5vIHdhcm5pbmcKKyAgZnJlZShwdHIpOworICByZXR1cm4gMDsKK30KKworLy8gdW5pbml0IHBvaW50ZXIsIHVuaW5pdCB2YWwKK3ZvaWQgZl92YXJpYWRpY191bnBfdW52KHZvaWQpIHsKKyAgaW50IHQ7CisgIGludCB2OworICBpbnQqIHRwID0gJnQ7ICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7J3RwJyBpbml0aWFsaXplZCBoZXJlfX0KKyAgZG9TdHVmZl92YXJpYWRpYyh0cCx2KTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB1bmluaXRpYWxpemVkIHZhbHVlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMSB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorfQorLy8gdW5pbml0IHBvaW50ZXIsIGluaXQgdmFsCit2b2lkIGZfdmFyaWFkaWNfdW5wX2ludih2b2lkKSB7CisgIGludCB0OworICBpbnQgdiA9IDM7CisgIGludCogdHAgPSAmdDsgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3sndHAnIGluaXRpYWxpemVkIGhlcmV9fQorICBkb1N0dWZmX3ZhcmlhZGljKHRwLHYpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlQC0xIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdW5pbml0aWFsaXplZCB2YWx1ZX19Cit9CisKKy8vIGluaXQgcG9pbnRlciwgdW5pbml0IHZhbAordm9pZCBmX3ZhcmlhZGljX2lucF91bnYodm9pZCkgeworICBpbnQgdD01OworICBpbnQgdjsgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7J3YnIGRlY2xhcmVkIHdpdGhvdXQgYW4gaW5pdGlhbCB2YWx1ZX19CisgIGludCogdHAgPSAmdDsKKyAgZG9TdHVmZl92YXJpYWRpYyh0cCx2KTsvLyBleHBlY3RlZC13YXJuaW5nIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhbiB1bmluaXRpYWxpemVkIHZhbHVlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMSB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYW4gdW5pbml0aWFsaXplZCB2YWx1ZX19Cit9CisKKy8vIGluaXQgcG9pbnRlciwgaW5pdCB2YWwKK3ZvaWQgZl92YXJpYWRpY19pbnBfaW52KHZvaWQpIHsKKyAgaW50IHQ9NTsKKyAgaW50IHYgPSAzOworICBpbnQqIHRwID0gJnQ7CisgIGRvU3R1ZmZfdmFyaWFkaWModHAsdik7IC8vIG5vLXdhcm5pbmcKK30KKworLy8gaW5pdCBwb2ludGVyLCBpbml0IHBvaW50ZXIKK3ZvaWQgZl92YXJpYWRpY19pbnBfaW5wKHZvaWQpIHsKKyAgaW50IHQ9NTsKKyAgaW50IHU9MzsKKyAgaW50ICp2cCA9ICZ1IDsKKyAgaW50ICp0cCA9ICZ0OworICBkb1N0dWZmX3ZhcmlhZGljKHRwLHZwKTsgLy8gbm8td2FybmluZworfQorCisvL3VuaW5pdCBwb2ludGVyLCBpbml0IHBvaW50ZXIKK3ZvaWQgZl92YXJpYWRpY191bnBfaW5wKHZvaWQpIHsKKyAgaW50IHQ7CisgIGludCB1PTM7CisgIGludCAqdnAgPSAmdSA7CisgIGludCAqdHAgPSAmdDsgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7eyd0cCcgaW5pdGlhbGl6ZWQgaGVyZX19CisgIGRvU3R1ZmZfdmFyaWFkaWModHAsdnApOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdW5pbml0aWFsaXplZCB2YWx1ZX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMSB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorfQorCisvL2luaXQgcG9pbnRlciwgdW5pbml0IHBvaW50ZXIKK3ZvaWQgZl92YXJpYWRpY19pbnBfdW5wKHZvaWQpIHsKKyAgaW50IHQ9NTsKKyAgaW50IHU7CisgIGludCAqdnAgPSAmdSA7CisgIGludCAqdHAgPSAmdDsKKyAgZG9TdHVmZl92YXJpYWRpYyh0cCx2cCk7IC8vIG5vLXdhcm5pbmcKK30KKworLy91bmluaXQgcG9pbnRlciwgdW5pbml0IHBvaW50ZXIKK3ZvaWQgZl92YXJpYWRpY191bnBfdW5wKHZvaWQpIHsKKyAgaW50IHQ7CisgIGludCB1OworICBpbnQgKnZwID0gJnUgOworICBpbnQgKnRwID0gJnQ7ICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3sndHAnIGluaXRpYWxpemVkIGhlcmV9fQorICBkb1N0dWZmX3ZhcmlhZGljKHRwLHZwKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGVALTEge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB1bmluaXRpYWxpemVkIHZhbHVlfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvdW5pbml0LWNvbnN0LmNwcCBiL3Rlc3QvQW5hbHlzaXMvdW5pbml0LWNvbnN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmJmYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9BbmFseXNpcy91bmluaXQtY29uc3QuY3BwCkBAIC0wLDAgKzEsMTI4IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLWNoZWNrZXI9Y3BsdXNwbHVzLk5ld0RlbGV0ZSxjb3JlLGFscGhhLmNvcmUuQ2FsbEFuZE1lc3NhZ2VVbkluaXRSZWZBcmcgLWFuYWx5emVyLW91dHB1dD10ZXh0IC12ZXJpZnkgJXMKKy8vIFBhc3NpbmcgdW5pbml0aWFsaXplZCBjb25zdCBkYXRhIHRvIHVua25vd24gZnVuY3Rpb24KKworI2luY2x1ZGUgIklucHV0cy9zeXN0ZW0taGVhZGVyLXNpbXVsYXRvci1jeHguaCIKKwordm9pZCBkb1N0dWZmNihjb25zdCBpbnQmIGMpOwordm9pZCBkb1N0dWZmNChjb25zdCBpbnQgeSk7Cit2b2lkIGRvU3R1ZmYzKGludCYgZyk7Cit2b2lkIGRvU3R1ZmZfdW5pbml0KGNvbnN0IGludCAqdSk7CisKKworaW50IGYxMCh2b2lkKSB7CisgIGludCAqcHRyOworCisgIHB0ciA9IG5ldyBpbnQ7IC8vCisgIGlmKCpwdHIpIHsKKyAgICBkb1N0dWZmNCgqcHRyKTsKKyAgfQorICBkZWxldGUgcHRyOworICByZXR1cm4gMDsKK30KKworaW50IGY5KHZvaWQpIHsKKyAgaW50ICpwdHI7CisKKyAgcHRyID0gbmV3IGludDsgLy8KKworICBkb1N0dWZmX3VuaW5pdChwdHIpOyAvLyBubyB3YXJuaW5nCisgIGRlbGV0ZSBwdHI7CisgIHJldHVybiAwOworfQorCitpbnQgZjgodm9pZCkgeworICBpbnQgKnB0cjsKKworICBwdHIgPSBuZXcgaW50OworICAqcHRyID0gMjU7CisKKyAgZG9TdHVmZl91bmluaXQocHRyKTsgLy8gbm8gd2FybmluZz8KKyAgZGVsZXRlIHB0cjsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZjcodm9pZCkgeworICBpbnQgbSA9IDM7CisgIGRvU3R1ZmY2KG0pOyAvLyBubyB3YXJuaW5nCit9CisKKworaW50JiBmNl8xX3N1YihpbnQgJnApIHsKKyAgcmV0dXJuIHA7Cit9CisKK3ZvaWQgZjZfMSh2b2lkKSB7CisgIGludCB0OworICBpbnQgcCA9IGY2XzFfc3ViKHQpOyAvL2V4cGVjdGVkLXdhcm5pbmcge3tBc3NpZ25lZCB2YWx1ZSBpcyBnYXJiYWdlIG9yIHVuZGVmaW5lZH19CisgICAgICAgICAgICAgICAgICAgICAgIC8vZXhwZWN0ZWQtbm90ZUAtMSB7e0NhbGxpbmcgJ2Y2XzFfc3ViJ319CisgICAgICAgICAgICAgICAgICAgICAgIC8vZXhwZWN0ZWQtbm90ZUAtMiB7e1JldHVybmluZyBmcm9tICdmNl8xX3N1Yid9fQorICAgICAgICAgICAgICAgICAgICAgICAvL2V4cGVjdGVkLW5vdGVALTMge3tBc3NpZ25lZCB2YWx1ZSBpcyBnYXJiYWdlIG9yIHVuZGVmaW5lZH19CisgIGludCBxID0gcDsKKyAgZG9TdHVmZjYocSk7Cit9CisKK3ZvaWQgZjZfMih2b2lkKSB7CisgIGludCB0OyAgICAgICAvL2V4cGVjdGVkLW5vdGUge3sndCcgZGVjbGFyZWQgd2l0aG91dCBhbiBpbml0aWFsIHZhbHVlfX0KKyAgaW50ICZwID0gdDsKKyAgaW50ICZzID0gcDsKKyAgaW50ICZxID0gczsgIC8vZXhwZWN0ZWQtbm90ZSB7eydxJyBpbml0aWFsaXplZCBoZXJlfX0KKyAgZG9TdHVmZjYocSk7IC8vZXhwZWN0ZWQtd2FybmluZyB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYW4gdW5pbml0aWFsaXplZCB2YWx1ZX19CisgICAgICAgICAgICAgICAvL2V4cGVjdGVkLW5vdGVALTEge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorfQorCit2b2lkIGRvU3R1ZmY2XzMoaW50JiBxXywgaW50ICpwdHJfKSB7fQorCit2b2lkIGY2XzModm9pZCkgeworICBpbnQgKnB0cjsgICAgLy9leHBlY3RlZC1ub3RlIHt7J3B0cicgZGVjbGFyZWQgd2l0aG91dCBhbiBpbml0aWFsIHZhbHVlfX0KKyAgaW50IHQ7CisgIGludCAmcCA9IHQ7CisgIGludCAmcyA9IHA7CisgIGludCAmcSA9IHM7CisgIGRvU3R1ZmY2XzMocSxwdHIpOyAvL2V4cGVjdGVkLXdhcm5pbmcge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorICAgICAgICAgICAgICAgLy9leHBlY3RlZC1ub3RlQC0xIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhbiB1bmluaXRpYWxpemVkIHZhbHVlfX0KKworfQorCit2b2lkIGY2KHZvaWQpIHsKKyAgaW50IGs7ICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3snaycgZGVjbGFyZWQgd2l0aG91dCBhbiBpbml0aWFsIHZhbHVlfX0KKyAgZG9TdHVmZjYoayk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMSB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYW4gdW5pbml0aWFsaXplZCB2YWx1ZX19CisKK30KKworCisKK3ZvaWQgZjUodm9pZCkgeworICBpbnQgdDsKKyAgaW50KiB0cCA9ICZ0OyAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7eyd0cCcgaW5pdGlhbGl6ZWQgaGVyZX19CisgIGRvU3R1ZmZfdW5pbml0KHRwKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byB1bmluaXRpYWxpemVkIHZhbHVlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMSB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorfQorCisKK3ZvaWQgZjQodm9pZCkgeworICAgICAgaW50IHk7ICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7J3knIGRlY2xhcmVkIHdpdGhvdXQgYW4gaW5pdGlhbCB2YWx1ZX19CisgICAgICBkb1N0dWZmNCh5KTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tGdW5jdGlvbiBjYWxsIGFyZ3VtZW50IGlzIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlQC0xIHt7RnVuY3Rpb24gY2FsbCBhcmd1bWVudCBpcyBhbiB1bmluaXRpYWxpemVkIHZhbHVlfX0KK30KKwordm9pZCBmMyh2b2lkKSB7CisgICAgICBpbnQgZzsKKyAgICAgIGRvU3R1ZmYzKGcpOyAvLyBubyB3YXJuaW5nCit9CisKK2ludCB6Owordm9pZCBmMih2b2lkKSB7CisgICAgICBkb1N0dWZmX3VuaW5pdCgmeik7ICAvLyBubyB3YXJuaW5nCit9CisKK3ZvaWQgZjEodm9pZCkgeworICAgICAgaW50IHhfPTU7CisgICAgICBkb1N0dWZmX3VuaW5pdCgmeF8pOyAgLy8gbm8gd2FybmluZworfQorCit2b2lkIGZfdW5pbml0KHZvaWQpIHsKKyAgICAgIGludCB4OworICAgICAgZG9TdHVmZl91bmluaXQoJngpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMSB7e0Z1bmN0aW9uIGNhbGwgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIHVuaW5pdGlhbGl6ZWQgdmFsdWV9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9BbmFseXNpcy91bmluaXQtdmFscy1wcy1yZWdpb24ubSBiL3Rlc3QvQW5hbHlzaXMvdW5pbml0LXZhbHMtcHMtcmVnaW9uLm0KaW5kZXggYTRhYTVhMS4uODcyNTZiMyAxMDA2NDQKLS0tIGEvdGVzdC9BbmFseXNpcy91bmluaXQtdmFscy1wcy1yZWdpb24ubQorKysgYi90ZXN0L0FuYWx5c2lzL3VuaW5pdC12YWxzLXBzLXJlZ2lvbi5tCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1zdG9yZT1yZWdpb24gLWFuYWx5emVyLWNoZWNrZXI9Y29yZSxhbHBoYS5kZWFkY29kZS5JZGVtcG90ZW50T3BlcmF0aW9ucyAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWFuYWx5emUgLWFuYWx5emVyLXN0b3JlPXJlZ2lvbiAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlIC12ZXJpZnkgJXMKIAogc3RydWN0IHMgewogICBpbnQgZGF0YTsKQEAgLTQyLDcgKzQyLDcgQEAKIHZvaWQgdGVzdF91bmluaXRfbmVnKCkgewogICBzdHJ1Y3QgVGVzdFVuaW5pdCB2MSA9IHsgMCwgMCB9OwogICBzdHJ1Y3QgVGVzdFVuaW5pdCB2MiA9IHRlc3RfdW5pbml0X2F1eCgpOwotICB0ZXN0X3VuaXRfYXV4Mih2Mi54ICsgdjEueSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e1RoZSByaWdodCBvcGVyYW5kIHRvICcrJyBpcyBhbHdheXMgMH19CisgIHRlc3RfdW5pdF9hdXgyKHYyLnggKyB2MS55KTsKIH0KIAogZXh0ZXJuIHZvaWQgdGVzdF91bmluaXRfc3RydWN0X2FyZ19hdXgoc3RydWN0IFRlc3RVbmluaXQgYXJnKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQW5hbHlzaXMvd2Vhay1mdW5jdGlvbnMuYyBiL3Rlc3QvQW5hbHlzaXMvd2Vhay1mdW5jdGlvbnMuYwppbmRleCA5NmUzYjQ0Li5hOTgzZjkyIDEwMDY0NAotLS0gYS90ZXN0L0FuYWx5c2lzL3dlYWstZnVuY3Rpb25zLmMKKysrIGIvdGVzdC9BbmFseXNpcy93ZWFrLWZ1bmN0aW9ucy5jCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1hbmFseXplIC1hbmFseXplci1jaGVja2VyPWNvcmUsYWxwaGEuY29yZSxkZWJ1Zy5FeHBySW5zcGVjdGlvbix1bml4Lk1hbGxvYyx1bml4LmNzdHJpbmcsYWxwaGEudW5peC5jc3RyaW5nLHVuaXguQVBJLG9zeC5BUEksb3N4LmNvY29hLlJldGFpbkNvdW50IC1Xbm8tbnVsbC1kZXJlZmVyZW5jZSAtYW5hbHl6ZXItc3RvcmU9cmVnaW9uIC1mYmxvY2tzIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtYW5hbHl6ZSAtYW5hbHl6ZXItY2hlY2tlcj1jb3JlLGFscGhhLmNvcmUsZGVidWcuRXhwckluc3BlY3Rpb24sdW5peC5NYWxsb2MsdW5peC5jc3RyaW5nLGFscGhhLnVuaXguY3N0cmluZyx1bml4LkFQSSxvc3guQVBJLG9zeC5jb2NvYS5SZXRhaW5Db3VudCAtV25vLW51bGwtZGVyZWZlcmVuY2UgLVduby10YXV0b2xvZ2ljYWwtY29tcGFyZSAtYW5hbHl6ZXItc3RvcmU9cmVnaW9uIC1mYmxvY2tzIC12ZXJpZnkgJXMKICNkZWZpbmUgTlVMTCAwCiB2b2lkIGNsYW5nX2FuYWx5emVyX2V2YWwoaW50KTsKIHZvaWQgbXlGdW5jKCk7CmRpZmYgLS1naXQgYS90ZXN0L0NNYWtlTGlzdHMudHh0IGIvdGVzdC9DTWFrZUxpc3RzLnR4dAppbmRleCBhMTFiODNhLi4yMDkxNTQwIDEwMDY0NAotLS0gYS90ZXN0L0NNYWtlTGlzdHMudHh0CisrKyBiL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTEsMTEgKzEsMTMgQEAKICMgVGVzdCBydW5uZXIgaW5mcmFzdHJ1Y3R1cmUgZm9yIENsYW5nLiBUaGlzIGNvbmZpZ3VyZXMgdGhlIENsYW5nIHRlc3QgdHJlZXMKICMgZm9yIHVzZSBieSBMaXQsIGFuZCBkZWxlZ2F0ZXMgdG8gTExWTSdzIGxpdCB0ZXN0IGhhbmRsZXJzLgotIwotIyBJZiB0aGlzIGlzIGEgc3RhbmQtYWxvbmUgQ2xhbmcgYnVpbGQsIHdlIGZha2UgdXAgb3VyIG93biBMaXQgc3VwcG9ydCBoZXJlCi0jIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gTExWTSdzLgogCi1zZXQoQ0xBTkdfU09VUkNFX0RJUiAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uIikKLXNldChDTEFOR19CSU5BUllfRElSICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vLi4iKQoraWYgKENNQUtFX0NGR19JTlRESVIgU1RSRVFVQUwgIi4iKQorICBzZXQoTExWTV9CVUlMRF9NT0RFICIuIikKK2Vsc2UgKCkKKyAgc2V0KExMVk1fQlVJTERfTU9ERSAiJShidWlsZF9tb2RlKXMiKQorZW5kaWYgKCkKKworc3RyaW5nKFJFUExBQ0UgJHtDTUFLRV9DRkdfSU5URElSfSAke0xMVk1fQlVJTERfTU9ERX0gQ0xBTkdfVE9PTFNfRElSICR7TExWTV9SVU5USU1FX09VVFBVVF9JTlRESVJ9KQogCiBjb25maWd1cmVfbGl0X3NpdGVfY2ZnKAogICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGl0LnNpdGUuY2ZnLmluCkBAIC0xNyw4MSArMTksMzkgQEAKICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1VuaXQvbGl0LnNpdGUuY2ZnCiAgICkKIAotaWYoIFBBVEhfVE9fTExWTV9CVUlMRCApCi0gIHNldChDTEFOR19URVNUX0VYVFJBX0FSR1MgIi0tcGF0aD0ke0NMQU5HX0JJTkFSWV9ESVJ9L2Jpbi8ke0NNQUtFX0NGR19JTlRESVJ9IikKLWVuZGlmKCkKLQogb3B0aW9uKENMQU5HX1RFU1RfVVNFX1ZHICJSdW4gQ2xhbmcgdGVzdHMgdW5kZXIgVmFsZ3JpbmQiIE9GRikKIGlmKENMQU5HX1RFU1RfVVNFX1ZHKQogICBzZXQoQ0xBTkdfVEVTVF9FWFRSQV9BUkdTICR7Q0xBTkdfVEVTVF9FWFRSQV9BUkdTfSAiLS12ZyIpCiBlbmRpZiAoKQogCi1zZXQoQ0xBTkdfVEVTVF9ERVBTCitsaXN0KEFQUEVORCBDTEFOR19URVNUX0RFUFMKICAgY2xhbmcgY2xhbmctaGVhZGVycwogICBjLWluZGV4LXRlc3QgZGlhZ3Rvb2wgYXJjbXQtdGVzdCBjLWFyY210LXRlc3QKICAgY2xhbmctY2hlY2sgY2xhbmctZm9ybWF0CisgIGNsYW5nLXRibGdlbgorICBQcmludEZ1bmN0aW9uTmFtZXMKKyAgU2FtcGxlQW5hbHl6ZXJQbHVnaW4KICAgKQogc2V0KENMQU5HX1RFU1RfUEFSQU1TCiAgIGNsYW5nX3NpdGVfY29uZmlnPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saXQuc2l0ZS5jZmcKICAgKQogCi1pZihDTEFOR19JTkNMVURFX1RFU1RTKSAgCi0gIGxpc3QoQVBQRU5EIENMQU5HX1RFU1RfREVQUyBDbGFuZ1VuaXRUZXN0cykKLSAgbGlzdChBUFBFTkQgQ0xBTkdfVEVTVF9QQVJBTVMKLSAgICBjbGFuZ191bml0X3NpdGVfY29uZmlnPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9Vbml0L2xpdC5zaXRlLmNmZwotICAgICkKLWVuZGlmKCkKLQogaWYoIE5PVCBDTEFOR19CVUlMVF9TVEFOREFMT05FICkKICAgbGlzdChBUFBFTkQgQ0xBTkdfVEVTVF9ERVBTCisgICAgbGx2bS1jb25maWcKICAgICBsbGMgb3B0IEZpbGVDaGVjayBjb3VudCBub3QgbGx2bS1zeW1ib2xpemVyCiAgICAgKQotCi0gIGFkZF9saXRfdGVzdHN1aXRlKGNoZWNrLWNsYW5nICJSdW5uaW5nIHRoZSBDbGFuZyByZWdyZXNzaW9uIHRlc3RzIgotICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQotICAgIFBBUkFNUyAke0NMQU5HX1RFU1RfUEFSQU1TfQotICAgIERFUEVORFMgJHtDTEFOR19URVNUX0RFUFN9Ci0gICAgQVJHUyAke0NMQU5HX1RFU1RfRVhUUkFfQVJHU30KLSAgICApCi0gIHNldF90YXJnZXRfcHJvcGVydGllcyhjaGVjay1jbGFuZyBQUk9QRVJUSUVTIEZPTERFUiAiQ2xhbmcgdGVzdHMiKQotCi1lbHNlKCkKLQotICBpbmNsdWRlKEZpbmRQeXRob25JbnRlcnApCi0gIGlmKFBZVEhPTklOVEVSUF9GT1VORCkKLSAgICBpZiggTExWTV9NQUlOX1NSQ19ESVIgKQotICAgICAgc2V0KExJVCAiJHtMTFZNX01BSU5fU1JDX0RJUn0vdXRpbHMvbGl0L2xpdC5weSIpCi0gICAgZWxzZSgpCi0gICAgICBzZXQoTElUICIke1BBVEhfVE9fTExWTV9CVUlMRH0vYmluLyR7Q01BS0VfQ0ZHX0lOVERJUn0vbGx2bS1saXQiKQotICAgICAgIyBJbnN0YWxsZWQgTExWTSBkb2VzIG5vdCBjb250YWluICR7Q01BS0VfQ0ZHX0lOVERJUn0gaW4gcGF0aHMuCi0gICAgICBpZiggTk9UIEVYSVNUUyAke0xJVH0gKQotICAgICAgICBzZXQoTElUICIke1BBVEhfVE9fTExWTV9CVUlMRH0vYmluL2xsdm0tbGl0IikKLSAgICAgIGVuZGlmKCkKLSAgICBlbmRpZigpCi0KLSAgICBzZXQoTElUX0FSR1MgIiR7Q0xBTkdfVEVTVF9FWFRSQV9BUkdTfSAke0xMVk1fTElUX0FSR1N9IikKLSAgICBzZXBhcmF0ZV9hcmd1bWVudHMoTElUX0FSR1MpCi0gICAgCi0gICAgbGlzdChBUFBFTkQgQ0xBTkdfVEVTVF9QQVJBTVMgYnVpbGRfbW9kZT0ke0NNQUtFX0NGR19JTlRESVJ9KQotCi0gICAgZm9yZWFjaChwYXJhbSAke0NMQU5HX1RFU1RfUEFSQU1TfSkKLSAgICAgIGxpc3QoQVBQRU5EIExJVF9BUkdTIC0tcGFyYW0gJHtwYXJhbX0pCi0gICAgZW5kZm9yZWFjaCgpCi0KLSAgICBhZGRfY3VzdG9tX3RhcmdldChjaGVjay1jbGFuZwotICAgICAgQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfQotICAgICAgICAgICAgICAke0xJVH0KLSAgICAgICAgICAgICAgJHtMSVRfQVJHU30KLSAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ci0gICAgICAgICAgICAgICR7Q0xBTkdfVEVTVF9FWFRSQV9BUkdTfQotICAgICAgQ09NTUVOVCAiUnVubmluZyBDbGFuZyByZWdyZXNzaW9uIHRlc3RzIgotICAgICAgREVQRU5EUyAke0NMQU5HX1RFU1RfREVQU30KLSAgICAgICkKLSAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoY2hlY2stY2xhbmcgUFJPUEVSVElFUyBGT0xERVIgIkNsYW5nIHRlc3RzIikKLSAgZW5kaWYoKQotCiBlbmRpZigpCiAKK2FkZF9saXRfdGVzdHN1aXRlKGNoZWNrLWNsYW5nICJSdW5uaW5nIHRoZSBDbGFuZyByZWdyZXNzaW9uIHRlc3RzIgorICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgI0xJVCAke0xMVk1fTElUfQorICBQQVJBTVMgJHtDTEFOR19URVNUX1BBUkFNU30KKyAgREVQRU5EUyAke0NMQU5HX1RFU1RfREVQU30KKyAgQVJHUyAke0NMQU5HX1RFU1RfRVhUUkFfQVJHU30KKyAgKQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGNoZWNrLWNsYW5nIFBST1BFUlRJRVMgRk9MREVSICJDbGFuZyB0ZXN0cyIpCisKICMgQWRkIGEgbGVnYWN5IHRhcmdldCBzcGVsbGluZzogY2xhbmctdGVzdAogYWRkX2N1c3RvbV90YXJnZXQoY2xhbmctdGVzdCkKIGFkZF9kZXBlbmRlbmNpZXMoY2xhbmctdGVzdCBjaGVjay1jbGFuZykKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2Jhc2ljL2Jhc2ljLmxvb2t1cC9iYXNpYy5sb29rdXAucXVhbC9jbGFzcy5xdWFsL3AyLmNwcCBiL3Rlc3QvQ1hYL2Jhc2ljL2Jhc2ljLmxvb2t1cC9iYXNpYy5sb29rdXAucXVhbC9jbGFzcy5xdWFsL3AyLmNwcAppbmRleCAxZjc4YTczLi5iOWU4Mzk4IDEwMDY0NAotLS0gYS90ZXN0L0NYWC9iYXNpYy9iYXNpYy5sb29rdXAvYmFzaWMubG9va3VwLnF1YWwvY2xhc3MucXVhbC9wMi5jcHAKKysrIGIvdGVzdC9DWFgvYmFzaWMvYmFzaWMubG9va3VwL2Jhc2ljLmxvb2t1cC5xdWFsL2NsYXNzLnF1YWwvcDIuY3BwCkBAIC0xMDUsOSArMTA1LDEwIEBACiAKICAgfTsKIAorICAvLyBGSVhNRTogQ29uc2lkZXIgcmV1c2luZyB0aGUgc2FtZSBkaWFnbm9zdGljIGJldHdlZW4gZGVwZW5kZW50IGFuZCBub24tZGVwZW5kZW50IGNvbnRleHRzCiAgIHR5cGVkZWYgaW50IEk7CiAgIHN0cnVjdCBVc2luZ0ludCB7Ci0gICAgdXNpbmcgSTo6STsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBhIGNsYXNzIG9yIG5hbWVzcGFjZX19CisgICAgdXNpbmcgSTo6STsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snSScgKGFrYSAnaW50JykgaXMgbm90IGEgY2xhc3MsIG5hbWVzcGFjZSwgb3Igc2NvcGVkIGVudW1lcmF0aW9ufX0KICAgfTsKICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFVzaW5nSW50VGVtcGxhdGUgewogICAgIHVzaW5nIFQ6OlQ7IC8vIGV4cGVjdGVkLWVycm9yIHt7dHlwZSAnaW50JyBjYW5ub3QgYmUgdXNlZCBwcmlvciB0byAnOjonIGJlY2F1c2UgaXQgaGFzIG5vIG1lbWJlcnN9fQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvYmFzaWMvYmFzaWMubG9va3VwL2Jhc2ljLmxvb2t1cC5xdWFsL25hbWVzcGFjZS5xdWFsL3AyLmNwcCBiL3Rlc3QvQ1hYL2Jhc2ljL2Jhc2ljLmxvb2t1cC9iYXNpYy5sb29rdXAucXVhbC9uYW1lc3BhY2UucXVhbC9wMi5jcHAKaW5kZXggMzAzOTM5Ni4uNzkxOGU5ZiAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvYmFzaWMvYmFzaWMubG9va3VwL2Jhc2ljLmxvb2t1cC5xdWFsL25hbWVzcGFjZS5xdWFsL3AyLmNwcAorKysgYi90ZXN0L0NYWC9iYXNpYy9iYXNpYy5sb29rdXAvYmFzaWMubG9va3VwLnF1YWwvbmFtZXNwYWNlLnF1YWwvcDIuY3BwCkBAIC02MywzICs2MywxNCBAQAogICBOdW1iZXJzMjo6ZihmKTsKICAgTnVtYmVyczI6OmcoZik7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gdmlhYmxlIGNvbnZlcnNpb24gZnJvbSAnZmxvYXQnIHRvICdOdW1iZXJzOjpOdW1iZXInfX0KIH0KKworbmFtZXNwYWNlIGlubGluZV9ucyB7CisgIGludCB4OyAvLyBleHBlY3RlZC1ub3RlIDJ7e2ZvdW5kfX0KKyAgaW5saW5lIG5hbWVzcGFjZSBBIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0MrKzExfX0KKyAgICBpbnQgeDsgLy8gZXhwZWN0ZWQtbm90ZSAye3tmb3VuZH19CisgICAgaW50IHk7IC8vIGV4cGVjdGVkLW5vdGUgMnt7Zm91bmR9fQorICB9CisgIGludCB5OyAvLyBleHBlY3RlZC1ub3RlIDJ7e2ZvdW5kfX0KKyAgaW50IGsxID0geCArIHk7IC8vIGV4cGVjdGVkLWVycm9yIDJ7e2FtYmlndW91c319CisgIGludCBrMiA9IGlubGluZV9uczo6eCArIGlubGluZV9uczo6eTsgLy8gZXhwZWN0ZWQtZXJyb3IgMnt7YW1iaWd1b3VzfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2Jhc2ljL2Jhc2ljLnN0YXJ0L2Jhc2ljLnN0YXJ0LmluaXQvcDMuY3BwIGIvdGVzdC9DWFgvYmFzaWMvYmFzaWMuc3RhcnQvYmFzaWMuc3RhcnQuaW5pdC9wMy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2MjMyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ1hYL2Jhc2ljL2Jhc2ljLnN0YXJ0L2Jhc2ljLnN0YXJ0LmluaXQvcDMuY3BwCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5ICVzIC1wZWRhbnRpYy1lcnJvcnMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5ICVzIC1wZWRhbnRpYy1lcnJvcnMgLURJTkxJTkUKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5ICVzIC1wZWRhbnRpYy1lcnJvcnMgLURTVEFUSUMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5ICVzIC1wZWRhbnRpYy1lcnJvcnMgLXN0ZD1jKysxMSAtRENPTlNURVhQUgorLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgJXMgLXN0ZD1jKysxMSAtRERFTEVURUQKKworI2lmIElOTElORQoraW5saW5lIC8vIGV4cGVjdGVkLWVycm9yIHt7J21haW4nIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGRlY2xhcmVkIGlubGluZX19CisjZWxpZiBTVEFUSUMKK3N0YXRpYyAvLyBleHBlY3RlZC1lcnJvciB7eydtYWluJyBpcyBub3QgYWxsb3dlZCB0byBiZSBkZWNsYXJlZCBzdGF0aWN9fQorI2VsaWYgQ09OU1RFWFBSCitjb25zdGV4cHIgLy8gZXhwZWN0ZWQtZXJyb3Ige3snbWFpbicgaXMgbm90IGFsbG93ZWQgdG8gYmUgZGVjbGFyZWQgY29uc3RleHByfX0KKyNlbmRpZgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorI2lmIERFTEVURUQKKyAgPSBkZWxldGU7IC8vIGV4cGVjdGVkLWVycm9yIHt7J21haW4nIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGRlbGV0ZWR9fQorI2Vsc2UKK3sKKyAgaW50ICgqcG1haW4pKGludCwgY2hhcioqKSA9ICZtYWluOyAvLyBleHBlY3RlZC1lcnJvciB7e0lTTyBDKysgZG9lcyBub3QgYWxsb3cgJ21haW4nIHRvIGJlIHVzZWQgYnkgYSBwcm9ncmFtfX0KKworICBpZiAoYXJnYykKKyAgICBtYWluKDAsIDApOyAvLyBleHBlY3RlZC1lcnJvciB7e0lTTyBDKysgZG9lcyBub3QgYWxsb3cgJ21haW4nIHRvIGJlIHVzZWQgYnkgYSBwcm9ncmFtfX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvYmFzaWMvYmFzaWMuc3RjL2Jhc2ljLnN0Yy5keW5hbWljL2Jhc2ljLnN0Yy5keW5hbWljLmFsbG9jYXRpb24vcDEuY3BwIGIvdGVzdC9DWFgvYmFzaWMvYmFzaWMuc3RjL2Jhc2ljLnN0Yy5keW5hbWljL2Jhc2ljLnN0Yy5keW5hbWljLmFsbG9jYXRpb24vcDEuY3BwCmluZGV4IDhhNjJhZTguLjNiNzdhNjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2Jhc2ljL2Jhc2ljLnN0Yy9iYXNpYy5zdGMuZHluYW1pYy9iYXNpYy5zdGMuZHluYW1pYy5hbGxvY2F0aW9uL3AxLmNwcAorKysgYi90ZXN0L0NYWC9iYXNpYy9iYXNpYy5zdGMvYmFzaWMuc3RjLmR5bmFtaWMvYmFzaWMuc3RjLmR5bmFtaWMuYWxsb2NhdGlvbi9wMS5jcHAKQEAgLTksNyArOSw4IEBACiAgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QpOzsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb3BlcmF0b3IgbmV3JyBjYW5ub3QgYmUgZGVjbGFyZWQgaW5zaWRlIGEgbmFtZXNwYWNlfX0KIH0KIAotc3RhdGljIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QpOyAvLyBleHBlY3RlZC1lcnJvciB7eydvcGVyYXRvciBuZXcnIGNhbm5vdCBiZSBkZWNsYXJlZCBzdGF0aWMgaW4gZ2xvYmFsIHNjb3BlfX0KK3N0YXRpYyB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tzdGF0aWMgZGVjbGFyYXRpb24gb2YgJ29wZXJhdG9yIG5ldycgZm9sbG93cyBub24tc3RhdGljIGRlY2xhcmF0aW9ufX0gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KK3N0YXRpYyB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCBpbnQsIGludCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J29wZXJhdG9yIG5ldycgY2Fubm90IGJlIGRlY2xhcmVkIHN0YXRpYyBpbiBnbG9iYWwgc2NvcGV9fQogCiBzdHJ1Y3QgQiB7CiAgIHZvaWQgb3BlcmF0b3IgbmV3KHNpemVfdCk7ICAvLyBleHBlY3RlZC1lcnJvciB7eydvcGVyYXRvciBuZXcnIG11c3QgcmV0dXJuIHR5cGUgJ3ZvaWQgKid9fQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvYmFzaWMvYmFzaWMuc3RjL2Jhc2ljLnN0Yy5keW5hbWljL2Jhc2ljLnN0Yy5keW5hbWljLmRlYWxsb2NhdGlvbi9wMS5jcHAgYi90ZXN0L0NYWC9iYXNpYy9iYXNpYy5zdGMvYmFzaWMuc3RjLmR5bmFtaWMvYmFzaWMuc3RjLmR5bmFtaWMuZGVhbGxvY2F0aW9uL3AxLmNwcAppbmRleCBlMDBlOTQ4Li4wOWRkZThlIDEwMDY0NAotLS0gYS90ZXN0L0NYWC9iYXNpYy9iYXNpYy5zdGMvYmFzaWMuc3RjLmR5bmFtaWMvYmFzaWMuc3RjLmR5bmFtaWMuZGVhbGxvY2F0aW9uL3AxLmNwcAorKysgYi90ZXN0L0NYWC9iYXNpYy9iYXNpYy5zdGMvYmFzaWMuc3RjLmR5bmFtaWMvYmFzaWMuc3RjLmR5bmFtaWMuZGVhbGxvY2F0aW9uL3AxLmNwcApAQCAtOCw0ICs4LDUgQEAKICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb3BlcmF0b3IgZGVsZXRlJyBjYW5ub3QgYmUgZGVjbGFyZWQgaW5zaWRlIGEgbmFtZXNwYWNlfX0KIH0KIAotc3RhdGljIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKik7IC8vIGV4cGVjdGVkLWVycm9yIHt7J29wZXJhdG9yIGRlbGV0ZScgY2Fubm90IGJlIGRlY2xhcmVkIHN0YXRpYyBpbiBnbG9iYWwgc2NvcGV9fQorc3RhdGljIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKik7IC8vIGV4cGVjdGVkLWVycm9yIHt7Zm9sbG93cyBub24tc3RhdGljIGRlY2xhcmF0aW9ufX0gZXhwZWN0ZWQtbm90ZSB7e2ltcGxpY2l0fX0KK3N0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICosIGludCwgaW50KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb3BlcmF0b3IgZGVsZXRlJyBjYW5ub3QgYmUgZGVjbGFyZWQgc3RhdGljIGluIGdsb2JhbCBzY29wZX19CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9jbGFzcy5hY2Nlc3MvY2xhc3MuYWNjZXNzLmJhc2UvcDEuY3BwIGIvdGVzdC9DWFgvY2xhc3MuYWNjZXNzL2NsYXNzLmFjY2Vzcy5iYXNlL3AxLmNwcAppbmRleCA0M2NjOTllLi44OGUyNjg4IDEwMDY0NAotLS0gYS90ZXN0L0NYWC9jbGFzcy5hY2Nlc3MvY2xhc3MuYWNjZXNzLmJhc2UvcDEuY3BwCisrKyBiL3Rlc3QvQ1hYL2NsYXNzLmFjY2Vzcy9jbGFzcy5hY2Nlc3MuYmFzZS9wMS5jcHAKQEAgLTE1MywzICsxNTMsMTggQEAKICAgICB0LT5CYXNlOjpzcHJpdisrOyAvLyBleHBlY3RlZC1lcnJvciAyIHt7cHJpdmF0ZSBtZW1iZXJ9fQogICB9CiB9CisKK25hbWVzcGFjZSBQUjEyNzg4IHsKKyAgY2xhc3MgQSB7CisgIHByb3RlY3RlZDoKKyAgICBzdHJ1Y3QgeworICAgICAgaW50IHg7CisgICAgfTsKKyAgfTsKKyAgY2xhc3MgQiA6IEEgeworICAgIHZvaWQgZigpIHsKKyAgICAgICsreDsKKyAgICAgIEE6OngrKzsKKyAgICB9CisgIH07Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9jbGFzcy5hY2Nlc3MvcDQuY3BwIGIvdGVzdC9DWFgvY2xhc3MuYWNjZXNzL3A0LmNwcAppbmRleCAwNTY0YTUyLi40MzViMDk5IDEwMDY0NAotLS0gYS90ZXN0L0NYWC9jbGFzcy5hY2Nlc3MvcDQuY3BwCisrKyBiL3Rlc3QvQ1hYL2NsYXNzLmFjY2Vzcy9wNC5jcHAKQEAgLTc5LDggKzc5LDggQEAKICAgICAtY2E7CiAgICAgLy8gVGhlc2UgYXJlIGFsbCBzdXJyb2dhdGUgY2FsbHMKICAgICBjYShwdWIpOwotICAgIGNhKHByb3QpOyAvLyBleHBlY3RlZC1lcnJvciB7eydvcGVyYXRvciB2b2lkICgqKShjbGFzcyBQcm90ZWN0ZWQgJiknIGlzIGEgcHJvdGVjdGVkIG1lbWJlcn19Ci0gICAgY2EocHJpdik7IC8vIGV4cGVjdGVkLWVycm9yIHt7J29wZXJhdG9yIHZvaWQgKCopKGNsYXNzIFByaXZhdGUgJiknIGlzIGEgcHJpdmF0ZSBtZW1iZXJ9fQorICAgIGNhKHByb3QpOyAvLyBleHBlY3RlZC1lcnJvciB7eydvcGVyYXRvciB2b2lkICgqKShQcm90ZWN0ZWQgJiknIGlzIGEgcHJvdGVjdGVkIG1lbWJlcn19CisgICAgY2EocHJpdik7IC8vIGV4cGVjdGVkLWVycm9yIHt7J29wZXJhdG9yIHZvaWQgKCopKFByaXZhdGUgJiknIGlzIGEgcHJpdmF0ZSBtZW1iZXJ9fQogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2NsYXNzLmFjY2Vzcy9wNi5jcHAgYi90ZXN0L0NYWC9jbGFzcy5hY2Nlc3MvcDYuY3BwCmluZGV4IDZhOTM2NTguLmY5Yjk1ZjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2NsYXNzLmFjY2Vzcy9wNi5jcHAKKysrIGIvdGVzdC9DWFgvY2xhc3MuYWNjZXNzL3A2LmNwcApAQCAtMTc3LDcgKzE3Nyw3IEBACiAgIH07CiAKICAgdm9pZCB0ZXN0KEEgJmEpIHsKLSAgICBpZiAoYSkgcmV0dXJuOyAvLyBleHBlY3RlZC1lcnJvciB7eydvcGVyYXRvciB2b2lkICooY2xhc3MgdGVzdDg6OkE6OiopKHZvaWQpIGNvbnN0JyBpcyBhIHByaXZhdGUgbWVtYmVyIG9mICd0ZXN0ODo6QSd9fQorICAgIGlmIChhKSByZXR1cm47IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7J29wZXJhdG9yIHZvaWQgKih0ZXN0ODo6QTo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0gY29uc3QnIGlzIGEgcHJpdmF0ZSBtZW1iZXIgb2YgJ3Rlc3Q4OjpBJ319CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvY2xhc3MvY2xhc3Muc3RhdGljL2NsYXNzLnN0YXRpYy5kYXRhL3A0LmNwcCBiL3Rlc3QvQ1hYL2NsYXNzL2NsYXNzLnN0YXRpYy9jbGFzcy5zdGF0aWMuZGF0YS9wNC5jcHAKaW5kZXggMmIxZWNhNy4uODVkMThjNiAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvY2xhc3MvY2xhc3Muc3RhdGljL2NsYXNzLnN0YXRpYy5kYXRhL3A0LmNwcAorKysgYi90ZXN0L0NYWC9jbGFzcy9jbGFzcy5zdGF0aWMvY2xhc3Muc3RhdGljLmRhdGEvcDQuY3BwCkBAIC0xMCwxNSArMTAsMTQgQEAKIGludCBjb25zdCBPdXRPZkNsYXNzSW5pdGlhbGl6ZXJPbmx5OjppID0gMDsKIAogc3RydWN0IEluQ2xhc3NJbml0aWFsaXplckFuZE91dE9mQ2xhc3NDb3B5SW5pdGlhbGl6ZXIgewotICBzdGF0aWMgY29uc3QgaW50IGkgPSAwOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWZpbml0aW9uIGlzIGhlcmV9fQorICBzdGF0aWMgY29uc3QgaW50IGkgPSAwOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBpbml0aWFsaXphdGlvbiBpcyBoZXJlfX0KIH07Ci1pbnQgY29uc3QgSW5DbGFzc0luaXRpYWxpemVyQW5kT3V0T2ZDbGFzc0NvcHlJbml0aWFsaXplcjo6aSA9IDA7IC8vIGV4cGVjdGVkLWVycm9ye3tyZWRlZmluaXRpb24gb2YgJ2knfX0KK2ludCBjb25zdCBJbkNsYXNzSW5pdGlhbGl6ZXJBbmRPdXRPZkNsYXNzQ29weUluaXRpYWxpemVyOjppID0gMDsgLy8gZXhwZWN0ZWQtZXJyb3J7e3N0YXRpYyBkYXRhIG1lbWJlciAnaScgYWxyZWFkeSBoYXMgYW4gaW5pdGlhbGl6ZXJ9fQogCiBzdHJ1Y3QgSW5DbGFzc0luaXRpYWxpemVyQW5kT3V0T2ZDbGFzc0RpcmVjdEluaXRpYWxpemVyIHsKLSAgc3RhdGljIGNvbnN0IGludCBpID0gMDsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVmaW5pdGlvbiBpcyBoZXJlfX0KKyAgc3RhdGljIGNvbnN0IGludCBpID0gMDsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgaW5pdGlhbGl6YXRpb24gaXMgaGVyZX19CiB9OwotaW50IGNvbnN0IEluQ2xhc3NJbml0aWFsaXplckFuZE91dE9mQ2xhc3NEaXJlY3RJbml0aWFsaXplcjo6aSgwKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlZGVmaW5pdGlvbiBvZiAnaSd9fQotCitpbnQgY29uc3QgSW5DbGFzc0luaXRpYWxpemVyQW5kT3V0T2ZDbGFzc0RpcmVjdEluaXRpYWxpemVyOjppKDApOyAvLyBleHBlY3RlZC1lcnJvcnt7c3RhdGljIGRhdGEgbWVtYmVyICdpJyBhbHJlYWR5IGhhcyBhbiBpbml0aWFsaXplcn19CiAKIAogaW50IG1haW4oKSB7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2NsYXNzL2NsYXNzLnVuaW9uL3A4LmNwcCBiL3Rlc3QvQ1hYL2NsYXNzL2NsYXNzLnVuaW9uL3A4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzU0YmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9DWFgvY2xhc3MvY2xhc3MudW5pb24vcDguY3BwCkBAIC0wLDAgKzEsMTAgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC12ZXJpZnkgJXMKKwordW5pb24gVSB7CisgIGludCB4ID0gMDsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzIGluaXRpYWxpemF0aW9uIGlzIGhlcmV9fQorICB1bmlvbiB7fTsKKyAgdW5pb24geworICAgIGludCB6OworICAgIGludCB5ID0gMTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbml0aWFsaXppbmcgbXVsdGlwbGUgbWVtYmVycyBvZiB1bmlvbn19CisgIH07Cit9OwpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZGNsLmRjbC9iYXNpYy5uYW1lc3BhY2UvbmFtZXNwYWNlLnVkZWNsL3AxMS5jcHAgYi90ZXN0L0NYWC9kY2wuZGNsL2Jhc2ljLm5hbWVzcGFjZS9uYW1lc3BhY2UudWRlY2wvcDExLmNwcAppbmRleCBjNzk2NmNlLi40ZmZiOTNhIDEwMDY0NAotLS0gYS90ZXN0L0NYWC9kY2wuZGNsL2Jhc2ljLm5hbWVzcGFjZS9uYW1lc3BhY2UudWRlY2wvcDExLmNwcAorKysgYi90ZXN0L0NYWC9kY2wuZGNsL2Jhc2ljLm5hbWVzcGFjZS9uYW1lc3BhY2UudWRlY2wvcDExLmNwcApAQCAtMSwxNCArMSwxNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcwogCi0vLyBDKyswMyBbbmFtZXNwYWNlLnVkZWNsXXAxMToKKy8vIEMrKzAzIFtuYW1lc3BhY2UudWRlY2xdcDExOiAocGVyIERSMTAxKQogLy8gICBJZiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGluIG5hbWVzcGFjZSBzY29wZSBvciBibG9jayBzY29wZSBoYXMKIC8vICAgdGhlIHNhbWUgbmFtZSBhbmQgdGhlIHNhbWUgcGFyYW1ldGVyIHR5cGVzIGFzIGEgZnVuY3Rpb24KLS8vICAgaW50cm9kdWNlZCBieSBhIHVzaW5nLWRlY2xhcmF0aW9uLCB0aGUgcHJvZ3JhbSBpcwotLy8gICBpbGwtZm9ybWVkLiBbTm90ZTogdHdvIHVzaW5nLWRlY2xhcmF0aW9ucyBtYXkgaW50cm9kdWNlIGZ1bmN0aW9ucwotLy8gICB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlcy4gSWYsIGZvciBhIGNhbGwKLS8vICAgdG8gYW4gdW5xdWFsaWZpZWQgZnVuY3Rpb24gbmFtZSwgZnVuY3Rpb24gb3ZlcmxvYWQgcmVzb2x1dGlvbgotLy8gICBzZWxlY3RzIHRoZSBmdW5jdGlvbnMgaW50cm9kdWNlZCBieSBzdWNoIHVzaW5nLWRlY2xhcmF0aW9ucywgdGhlCi0vLyAgIGZ1bmN0aW9uIGNhbGwgaXMgaWxsLWZvcm1lZC4KKy8vICAgaW50cm9kdWNlZCBieSBhIHVzaW5nLWRlY2xhcmF0aW9uLCBhbmQgdGhlIGRlY2xhcmF0aW9ucyBkbyBub3QgZGVjbGFyZSB0aGUKKy8vICAgc2FtZSBmdW5jdGlvbiwgdGhlIHByb2dyYW0gaXMgaWxsLWZvcm1lZC4gW05vdGU6IHR3byB1c2luZy1kZWNsYXJhdGlvbnMgbWF5CisvLyAgIGludHJvZHVjZSBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCB0aGUgc2FtZSBwYXJhbWV0ZXIgdHlwZXMuIElmLAorLy8gICBmb3IgYSBjYWxsIHRvIGFuIHVucXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUsIGZ1bmN0aW9uIG92ZXJsb2FkIHJlc29sdXRpb24KKy8vICAgc2VsZWN0cyB0aGUgZnVuY3Rpb25zIGludHJvZHVjZWQgYnkgc3VjaCB1c2luZy1kZWNsYXJhdGlvbnMsIHRoZSBmdW5jdGlvbgorLy8gICBjYWxsIGlzIGlsbC1mb3JtZWQuXQorLy8KKy8vIEZJWE1FOiBEUjU2NSBpbnRyb2R1Y2VzIHBhcmFsbGVsIHdvcmRpbmcgaGVyZSBmb3IgZnVuY3Rpb24gdGVtcGxhdGVzLgogCiBuYW1lc3BhY2UgdGVzdDAgewogICBuYW1lc3BhY2UgbnMgeyB2b2lkIGZvbygpOyB9IC8vIGV4cGVjdGVkLW5vdGUge3t0YXJnZXQgb2YgdXNpbmcgZGVjbGFyYXRpb259fQpAQCAtODksMyArOTEsMTkgQEAKICAgdGVtcGxhdGUgY2xhc3MgVGVzdDA8aW50PjsKICAgdGVtcGxhdGUgY2xhc3MgVGVzdDE8aW50PjsKIH0KKworbmFtZXNwYWNlIHRlc3Q2IHsKKyAgbmFtZXNwYWNlIG5zIHsgdm9pZCBmb28oKTsgfSAvLyBleHBlY3RlZC1ub3RlIHt7dGFyZ2V0IG9mIHVzaW5nIGRlY2xhcmF0aW9ufX0KKyAgdXNpbmcgbnM6OmZvbzsgLy8gZXhwZWN0ZWQtbm90ZSB7e3VzaW5nIGRlY2xhcmF0aW9ufX0KKyAgbmFtZXNwYWNlIG5zIHsKKyAgICB1c2luZyB0ZXN0Njo6Zm9vOworICAgIHZvaWQgZm9vKCkge30KKyAgfQorICB2b2lkIGZvbygpOyAvLyBleHBlY3RlZC1lcnJvciB7e2RlY2xhcmF0aW9uIGNvbmZsaWN0cyB3aXRoIHRhcmdldCBvZiB1c2luZyBkZWNsYXJhdGlvbiBhbHJlYWR5IGluIHNjb3BlfX0KK30KKworbmFtZXNwYWNlIHRlc3Q3IHsKKyAgdm9pZCBmb28oKTsKKyAgdXNpbmcgdGVzdDc6OmZvbzsKKyAgdm9pZCBmb28oKSB7fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZGNsLmRjbC9iYXNpYy5uYW1lc3BhY2UvbmFtZXNwYWNlLnVkZWNsL3A1LWN4eDB4LmNwcCBiL3Rlc3QvQ1hYL2RjbC5kY2wvYmFzaWMubmFtZXNwYWNlL25hbWVzcGFjZS51ZGVjbC9wNS1jeHgweC5jcHAKaW5kZXggZWRhYTk3NS4uMzVlZjNiNSAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvZGNsLmRjbC9iYXNpYy5uYW1lc3BhY2UvbmFtZXNwYWNlLnVkZWNsL3A1LWN4eDB4LmNwcAorKysgYi90ZXN0L0NYWC9kY2wuZGNsL2Jhc2ljLm5hbWVzcGFjZS9uYW1lc3BhY2UudWRlY2wvcDUtY3h4MHguY3BwCkBAIC03LDYgKzcsNiBAQAogfTsKIAogc3RydWN0IEIgOiBBIHsKLSAgdXNpbmcgQTo6Zjxkb3VibGU+OyAvLyBleHBlY3RlZC1lcnJvcnt7dXNpbmcgZGVjbGFyYXRpb24gY2FuIG5vdCByZWZlciB0byBhIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ufX0KLSAgdXNpbmcgQTo6WDxpbnQ+OyAvLyBleHBlY3RlZC1lcnJvcnt7dXNpbmcgZGVjbGFyYXRpb24gY2FuIG5vdCByZWZlciB0byBhIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ufX0KKyAgdXNpbmcgQTo6Zjxkb3VibGU+OyAvLyBleHBlY3RlZC1lcnJvcnt7dXNpbmcgZGVjbGFyYXRpb24gY2Fubm90IHJlZmVyIHRvIGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb259fQorICB1c2luZyBBOjpYPGludD47IC8vIGV4cGVjdGVkLWVycm9ye3t1c2luZyBkZWNsYXJhdGlvbiBjYW5ub3QgcmVmZXIgdG8gYSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbn19CiB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZGNsLmRjbC9iYXNpYy5uYW1lc3BhY2UvbmFtZXNwYWNlLnVkZWNsL3A2LWN4eDB4LmNwcCBiL3Rlc3QvQ1hYL2RjbC5kY2wvYmFzaWMubmFtZXNwYWNlL25hbWVzcGFjZS51ZGVjbC9wNi1jeHgweC5jcHAKaW5kZXggYzRiODg0OS4uYzJmYjk1OSAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvZGNsLmRjbC9iYXNpYy5uYW1lc3BhY2UvbmFtZXNwYWNlLnVkZWNsL3A2LWN4eDB4LmNwcAorKysgYi90ZXN0L0NYWC9kY2wuZGNsL2Jhc2ljLm5hbWVzcGFjZS9uYW1lc3BhY2UudWRlY2wvcDYtY3h4MHguY3BwCkBAIC01LDQgKzUsNCBAQAogICBuYW1lc3BhY2UgQiB7IH0KIH0KIAotdXNpbmcgQTo6QjsgLy8gZXhwZWN0ZWQtZXJyb3J7e3VzaW5nIGRlY2xhcmF0aW9uIGNhbiBub3QgcmVmZXIgdG8gbmFtZXNwYWNlfX0KK3VzaW5nIEE6OkI7IC8vIGV4cGVjdGVkLWVycm9ye3t1c2luZyBkZWNsYXJhdGlvbiBjYW5ub3QgcmVmZXIgdG8gbmFtZXNwYWNlfX0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2RjbC5kY2wvYmFzaWMubmFtZXNwYWNlL25hbWVzcGFjZS51ZGVjbC9wOC1jeHgweC5jcHAgYi90ZXN0L0NYWC9kY2wuZGNsL2Jhc2ljLm5hbWVzcGFjZS9uYW1lc3BhY2UudWRlY2wvcDgtY3h4MHguY3BwCmluZGV4IDc4YjVhNDEuLjRmODlkY2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2RjbC5kY2wvYmFzaWMubmFtZXNwYWNlL25hbWVzcGFjZS51ZGVjbC9wOC1jeHgweC5jcHAKKysrIGIvdGVzdC9DWFgvZGNsLmRjbC9iYXNpYy5uYW1lc3BhY2UvbmFtZXNwYWNlLnVkZWNsL3A4LWN4eDB4LmNwcApAQCAtMSw0ICsxLDcgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC1zdGQ9YysrOTggLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXN0ZD1jKysxMSAtdmVyaWZ5ICVzCisvLyBSVU46IG5vdCAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXN0ZD1jKys5OCAtZmRpYWdub3N0aWNzLXBhcnNlYWJsZS1maXhpdHMgJXMgMj4mMSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DWFg5OCAlcworLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC1zdGQ9YysrMTEgLWZkaWFnbm9zdGljcy1wYXJzZWFibGUtZml4aXRzICVzIDI+JjEgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q1hYMTEgJXMKIC8vIEMrKzB4IE4yOTE0LgogCiBzdHJ1Y3QgWCB7CkBAIC02LDEwICs5LDEwMSBAQAogICBzdGF0aWMgaW50IGE7CiB9OwogCi11c2luZyBYOjppOyAvLyBleHBlY3RlZC1lcnJvcnt7dXNpbmcgZGVjbGFyYXRpb24gY2FuIG5vdCByZWZlciB0byBjbGFzcyBtZW1iZXJ9fQotdXNpbmcgWDo6czsgLy8gZXhwZWN0ZWQtZXJyb3J7e3VzaW5nIGRlY2xhcmF0aW9uIGNhbiBub3QgcmVmZXIgdG8gY2xhc3MgbWVtYmVyfX0KK3VzaW5nIFg6Omk7IC8vIGV4cGVjdGVkLWVycm9ye3t1c2luZyBkZWNsYXJhdGlvbiBjYW5ub3QgcmVmZXIgdG8gY2xhc3MgbWVtYmVyfX0KK3VzaW5nIFg6OnM7IC8vIGV4cGVjdGVkLWVycm9ye3t1c2luZyBkZWNsYXJhdGlvbiBjYW5ub3QgcmVmZXIgdG8gY2xhc3MgbWVtYmVyfX0KIAogdm9pZCBmKCkgewotICB1c2luZyBYOjppOyAvLyBleHBlY3RlZC1lcnJvcnt7dXNpbmcgZGVjbGFyYXRpb24gY2FuIG5vdCByZWZlciB0byBjbGFzcyBtZW1iZXJ9fQotICB1c2luZyBYOjpzOyAvLyBleHBlY3RlZC1lcnJvcnt7dXNpbmcgZGVjbGFyYXRpb24gY2FuIG5vdCByZWZlciB0byBjbGFzcyBtZW1iZXJ9fQorICB1c2luZyBYOjppOyAvLyBleHBlY3RlZC1lcnJvcnt7dXNpbmcgZGVjbGFyYXRpb24gY2Fubm90IHJlZmVyIHRvIGNsYXNzIG1lbWJlcn19CisgIHVzaW5nIFg6OnM7IC8vIGV4cGVjdGVkLWVycm9ye3t1c2luZyBkZWNsYXJhdGlvbiBjYW5ub3QgcmVmZXIgdG8gY2xhc3MgbWVtYmVyfX0KK30KKworc3RydWN0IFMgeworICBzdGF0aWMgaW50IG47CisgIHN0cnVjdCBRIHt9OworICBlbnVtIEUge307CisgIHR5cGVkZWYgUSBUOworICB2b2lkIGYoKTsKKyAgc3RhdGljIHZvaWQgZygpOworfTsKKwordXNpbmcgUzo6bjsgLy8gZXhwZWN0ZWQtZXJyb3J7e2NsYXNzIG1lbWJlcn19IGV4cGVjdGVkLW5vdGUge3t1c2UgYSByZWZlcmVuY2UgaW5zdGVhZH19CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisvLyBDWFg5OC1OT1Q6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0yXV0KKyNlbHNlCisvLyBDWFgxMTogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTRdXToxLVtbQExJTkUtNF1dOjZ9OiJhdXRvICZuID0gIgorI2VuZGlmCisKK3VzaW5nIFM6OlE7IC8vIGV4cGVjdGVkLWVycm9ye3tjbGFzcyBtZW1iZXJ9fQorI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBhIHR5cGVkZWYgZGVjbGFyYXRpb24gaW5zdGVhZH19CisvLyBDWFg5ODogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXToxLVtbQExJTkUtM11dOjZ9OiJ0eXBlZGVmIgorLy8gQ1hYOTg6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS00XV06MTEtW1tATElORS00XV06MTF9OiIgUSIKKyNlbHNlCisvLyBleHBlY3RlZC1ub3RlQC02IHt7dXNlIGFuIGFsaWFzIGRlY2xhcmF0aW9uIGluc3RlYWR9fQorLy8gQ1hYMTE6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS03XV06Ny1bW0BMSU5FLTddXTo3fToiUSA9ICIKKyNlbmRpZgorCit1c2luZyBTOjpFOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2xhc3MgbWVtYmVyfX0KKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKy8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgYSB0eXBlZGVmIGRlY2xhcmF0aW9uIGluc3RlYWR9fQorLy8gQ1hYOTg6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06MS1bW0BMSU5FLTNdXTo2fToidHlwZWRlZiIKKy8vIENYWDk4OiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtNF1dOjExLVtbQExJTkUtNF1dOjExfToiIEUiCisjZWxzZQorLy8gZXhwZWN0ZWQtbm90ZUAtNiB7e3VzZSBhbiBhbGlhcyBkZWNsYXJhdGlvbiBpbnN0ZWFkfX0KKy8vIENYWDExOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtN11dOjctW1tATElORS03XV06N306IkUgPSAiCisjZW5kaWYKKwordXNpbmcgUzo6VDsgLy8gZXhwZWN0ZWQtZXJyb3J7e2NsYXNzIG1lbWJlcn19CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGEgdHlwZWRlZiBkZWNsYXJhdGlvbiBpbnN0ZWFkfX0KKy8vIENYWDk4OiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjEtW1tATElORS0zXV06Nn06InR5cGVkZWYiCisvLyBDWFg5ODogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTRdXToxMS1bW0BMSU5FLTRdXToxMX06IiBUIgorI2Vsc2UKKy8vIGV4cGVjdGVkLW5vdGVALTYge3t1c2UgYW4gYWxpYXMgZGVjbGFyYXRpb24gaW5zdGVhZH19CisvLyBDWFgxMTogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTddXTo3LVtbQExJTkUtN11dOjd9OiJUID0gIgorI2VuZGlmCisKK3VzaW5nIFM6OmY7IC8vIGV4cGVjdGVkLWVycm9ye3tjbGFzcyBtZW1iZXJ9fQordXNpbmcgUzo6ZzsgLy8gZXhwZWN0ZWQtZXJyb3J7e2NsYXNzIG1lbWJlcn19CisKK3ZvaWQgaCgpIHsKKyAgdXNpbmcgUzo6bjsgLy8gZXhwZWN0ZWQtZXJyb3J7e2NsYXNzIG1lbWJlcn19IGV4cGVjdGVkLW5vdGUge3t1c2UgYSByZWZlcmVuY2UgaW5zdGVhZH19CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIC8vIENYWDk4LU5PVDogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTJdXQorI2Vsc2UKKyAgLy8gQ1hYMTE6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS00XV06My1bW0BMSU5FLTRdXTo4fToiYXV0byAmbiA9ICIKKyNlbmRpZgorCisgIHVzaW5nIFM6OlE7IC8vIGV4cGVjdGVkLWVycm9ye3tjbGFzcyBtZW1iZXJ9fQorI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGEgdHlwZWRlZiBkZWNsYXJhdGlvbiBpbnN0ZWFkfX0KKyAgLy8gQ1hYOTg6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06My1bW0BMSU5FLTNdXTo4fToidHlwZWRlZiIKKyAgLy8gQ1hYOTg6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS00XV06MTMtW1tATElORS00XV06MTN9OiIgUSIKKyNlbHNlCisgIC8vIGV4cGVjdGVkLW5vdGVALTYge3t1c2UgYW4gYWxpYXMgZGVjbGFyYXRpb24gaW5zdGVhZH19CisgIC8vIENYWDExOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtN11dOjktW1tATElORS03XV06OX06IlEgPSAiCisjZW5kaWYKKworICB1c2luZyBTOjpFOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2xhc3MgbWVtYmVyfX0KKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBhIHR5cGVkZWYgZGVjbGFyYXRpb24gaW5zdGVhZH19CisgIC8vIENYWDk4OiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjMtW1tATElORS0zXV06OH06InR5cGVkZWYiCisgIC8vIENYWDk4OiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtNF1dOjEzLVtbQExJTkUtNF1dOjEzfToiIEUiCisjZWxzZQorICAvLyBleHBlY3RlZC1ub3RlQC02IHt7dXNlIGFuIGFsaWFzIGRlY2xhcmF0aW9uIGluc3RlYWR9fQorICAvLyBDWFgxMTogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTddXTo5LVtbQExJTkUtN11dOjl9OiJFID0gIgorI2VuZGlmCisKKyAgdXNpbmcgUzo6VDsgLy8gZXhwZWN0ZWQtZXJyb3J7e2NsYXNzIG1lbWJlcn19CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgYSB0eXBlZGVmIGRlY2xhcmF0aW9uIGluc3RlYWR9fQorICAvLyBDWFg5ODogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTozLVtbQExJTkUtM11dOjh9OiJ0eXBlZGVmIgorICAvLyBDWFg5ODogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTRdXToxMy1bW0BMSU5FLTRdXToxM306IiBUIgorI2Vsc2UKKyAgLy8gZXhwZWN0ZWQtbm90ZUAtNiB7e3VzZSBhbiBhbGlhcyBkZWNsYXJhdGlvbiBpbnN0ZWFkfX0KKyAgLy8gQ1hYMTE6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS03XV06OS1bW0BMSU5FLTddXTo5fToiVCA9ICIKKyNlbmRpZgorCisgIHVzaW5nIFM6OmY7IC8vIGV4cGVjdGVkLWVycm9ye3tjbGFzcyBtZW1iZXJ9fQorICB1c2luZyBTOjpnOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2xhc3MgbWVtYmVyfX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLmF0dHIvZGNsLmFsaWduL3A1LmNwcCBiL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLmF0dHIvZGNsLmFsaWduL3A1LmNwcAppbmRleCAxMGJlOThkLi4zYzI1MGY5IDEwMDY0NAotLS0gYS90ZXN0L0NYWC9kY2wuZGNsL2RjbC5hdHRyL2RjbC5hbGlnbi9wNS5jcHAKKysrIGIvdGVzdC9DWFgvZGNsLmRjbC9kY2wuYXR0ci9kY2wuYWxpZ24vcDUuY3BwCkBAIC05LDYgKzksNyBAQAogYWxpZ25hcygxKSBpbnQgbjcgYWxpZ25hcygyKSwgLy8gZXhwZWN0ZWQtZXJyb3Ige3tsZXNzIHRoYW4gbWluaW11bSBhbGlnbm1lbnR9fQogICAgICAgICAgICAgICAgbjggYWxpZ25hcyg0KTsgLy8gb2sKIGFsaWduYXMoOCkgaW50IG45IGFsaWduYXMoMik7IC8vIG9rLCBvdmVyYWxpZ25lZAorYWxpZ25hcygxKSBleHRlcm4gaW50IG4xMDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tsZXNzIHRoYW4gbWluaW11bSBhbGlnbm1lbnR9fQogCiBlbnVtIGFsaWduYXMoMSkgRTEge307IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVxdWVzdGVkIGFsaWdubWVudCBpcyBsZXNzIHRoYW4gbWluaW11bSBhbGlnbm1lbnQgb2YgNCBmb3IgdHlwZSAnRTEnfX0KIGVudW0gYWxpZ25hcygxKSBFMiA6IGNoYXIge307IC8vIG9rCmRpZmYgLS1naXQgYS90ZXN0L0NYWC9kY2wuZGNsL2RjbC5hdHRyL2RjbC5hdHRyLmRlcHJlY2F0ZWQvcDEuY3BwIGIvdGVzdC9DWFgvZGNsLmRjbC9kY2wuYXR0ci9kY2wuYXR0ci5kZXByZWNhdGVkL3AxLmNwcAppbmRleCAyMTExOTM5Li4zYmJiZjllIDEwMDY0NAotLS0gYS90ZXN0L0NYWC9kY2wuZGNsL2RjbC5hdHRyL2RjbC5hdHRyLmRlcHJlY2F0ZWQvcDEuY3BwCisrKyBiL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLmF0dHIvZGNsLmF0dHIuZGVwcmVjYXRlZC9wMS5jcHAKQEAgLTEsMjUgKzEsMjUgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzF5IC12ZXJpZnkgJXMKIAotY2xhc3MgW1tkZXByZWNhdGVkXV0gQyB7fTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorY2xhc3MgW1tkZXByZWNhdGVkXV0gQyB7fTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydDJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogQyBjOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0MnIGlzIGRlcHJlY2F0ZWR9fQogCi10eXBlZGVmIGludCB0IFtbZGVwcmVjYXRlZF1dOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19Cit0eXBlZGVmIGludCB0IFtbZGVwcmVjYXRlZF1dOyAvLyBleHBlY3RlZC1ub3RlIHt7J3QnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiB0IHggPSA0MjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyd0JyBpcyBkZXByZWNhdGVkfX0KIAotW1tkZXByZWNhdGVkXV0gaW50IG9sZCA9IDQyOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CitbW2RlcHJlY2F0ZWRdXSBpbnQgb2xkID0gNDI7IC8vIGV4cGVjdGVkLW5vdGUge3snb2xkJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogaW50IHVzZSA9IG9sZDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydvbGQnIGlzIGRlcHJlY2F0ZWR9fQogCi1zdHJ1Y3QgUyB7IFtbZGVwcmVjYXRlZF1dIGludCBtZW1iZXIgPSA0MjsgfSBzOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CitzdHJ1Y3QgUyB7IFtbZGVwcmVjYXRlZF1dIGludCBtZW1iZXIgPSA0MjsgfSBzOyAvLyBleHBlY3RlZC1ub3RlIHt7J21lbWJlcicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIGludCB1c2UyID0gcy5tZW1iZXI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snbWVtYmVyJyBpcyBkZXByZWNhdGVkfX0KIAotW1tkZXByZWNhdGVkXV0gaW50IGYoKSB7IHJldHVybiA0MjsgfSAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CitbW2RlcHJlY2F0ZWRdXSBpbnQgZigpIHsgcmV0dXJuIDQyOyB9IC8vIGV4cGVjdGVkLW5vdGUge3snZicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIGludCB1c2UzID0gZigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2YnIGlzIGRlcHJlY2F0ZWR9fQogCi1lbnVtIFtbZGVwcmVjYXRlZF1dIGUgeyBFIH07IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KK2VudW0gW1tkZXByZWNhdGVkXV0gZSB7IEUgfTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydlJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogZSBteV9lbnVtOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2UnIGlzIGRlcHJlY2F0ZWR9fQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgWCB7fTsKLXRlbXBsYXRlIDw+IGNsYXNzIFtbZGVwcmVjYXRlZF1dIFg8aW50PiB7fTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQordGVtcGxhdGUgPD4gY2xhc3MgW1tkZXByZWNhdGVkXV0gWDxpbnQ+IHt9OyAvLyBleHBlY3RlZC1ub3RlIHt7J1g8aW50PicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIFg8Y2hhcj4geDE7CiAvLyBGSVhNRTogVGhlIGRpYWdub3N0aWMgaGVyZSBjb3VsZCBiZSBtdWNoIGJldHRlciBieSBtZW50aW9uaW5nIFg8aW50Pi4KIFg8aW50PiB4MjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydYJyBpcyBkZXByZWNhdGVkfX0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLmF0dHIvZGNsLmF0dHIubm9yZXR1cm4vcDEuY3BwIGIvdGVzdC9DWFgvZGNsLmRjbC9kY2wuYXR0ci9kY2wuYXR0ci5ub3JldHVybi9wMS5jcHAKaW5kZXggMGFmMjQxZi4uNTljYWMzNiAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvZGNsLmRjbC9kY2wuYXR0ci9kY2wuYXR0ci5ub3JldHVybi9wMS5jcHAKKysrIGIvdGVzdC9DWFgvZGNsLmRjbC9kY2wuYXR0ci9kY2wuYXR0ci5ub3JldHVybi9wMS5jcHAKQEAgLTEzLDcgKzEzLDcgQEAKIFtbbm9yZXR1cm4oKV1dIHZvaWQgYygpOyAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSAnbm9yZXR1cm4nIGNhbm5vdCBoYXZlIGFuIGFyZ3VtZW50IGxpc3R9fQogCiB2b2lkIGQoKSBbW25vcmV0dXJuXV07IC8vIGV4cGVjdGVkLWVycm9yIHt7J25vcmV0dXJuJyBhdHRyaWJ1dGUgY2Fubm90IGJlIGFwcGxpZWQgdG8gdHlwZXN9fQotaW50IGQyIFtbbm9yZXR1cm5dXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snbm9yZXR1cm4nIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zIGFuZCBtZXRob2RzfX0KK2ludCBkMiBbW25vcmV0dXJuXV07IC8vIGV4cGVjdGVkLWVycm9yIHt7J25vcmV0dXJuJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9uc319CiAKIFtbbm9yZXR1cm5dXSBpbnQgZSgpIHsgYjIoKTsgfSAvLyBvawogCmRpZmYgLS1naXQgYS90ZXN0L0NYWC9kY2wuZGNsL2RjbC5lbnVtL3AyLmNwcCBiL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLmVudW0vcDIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlODI2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NYWC9kY2wuZGNsL2RjbC5lbnVtL3AyLmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC12ZXJpZnkgJXMKKworLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKK2VudW0gY2xhc3MgRSA6IGludCBjb25zdCB2b2xhdGlsZSB7IH07Cit1c2luZyBUID0gX191bmRlcmx5aW5nX3R5cGUoRSk7Cit1c2luZyBUID0gaW50OwpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZGNsLmRjbC9kY2wubGluay9wMi5jcHAgYi90ZXN0L0NYWC9kY2wuZGNsL2RjbC5saW5rL3AyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWMzYmNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9DWFgvZGNsLmRjbC9kY2wubGluay9wMi5jcHAKQEAgLTAsMCArMSwxNCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLXZlcmlmeSAlcworCitleHRlcm4gIkMiIHsKKyAgZXh0ZXJuIFIiKEMrKykiIHsgfQorfQorCisjZGVmaW5lIHBsdXNwbHVzICIrKyIKK2V4dGVybiAiQyIgcGx1c3BsdXMgeworfQorCitleHRlcm4gdTgiQyIge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tzdHJpbmcgbGl0ZXJhbCBpbiBsYW5ndWFnZSBsaW5rYWdlIHNwZWNpZmllciBjYW5ub3QgaGF2ZSBhbiBlbmNvZGluZy1wcmVmaXh9fQorZXh0ZXJuIEwiQyIge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tzdHJpbmcgbGl0ZXJhbCBpbiBsYW5ndWFnZSBsaW5rYWdlIHNwZWNpZmllciBjYW5ub3QgaGF2ZSBhbiBlbmNvZGluZy1wcmVmaXh9fQorZXh0ZXJuIHUiQysrIiB7fSAvLyBleHBlY3RlZC1lcnJvciB7e3N0cmluZyBsaXRlcmFsIGluIGxhbmd1YWdlIGxpbmthZ2Ugc3BlY2lmaWVyIGNhbm5vdCBoYXZlIGFuIGVuY29kaW5nLXByZWZpeH19CitleHRlcm4gVSJDIiB7fSAvLyBleHBlY3RlZC1lcnJvciB7e3N0cmluZyBsaXRlcmFsIGluIGxhbmd1YWdlIGxpbmthZ2Ugc3BlY2lmaWVyIGNhbm5vdCBoYXZlIGFuIGVuY29kaW5nLXByZWZpeH19CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9kY2wuZGNsL2RjbC5saW5rL3A3LmNwcCBiL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLmxpbmsvcDcuY3BwCmluZGV4IGJkOWZmM2MuLjdkODBhMjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLmxpbmsvcDcuY3BwCisrKyBiL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLmxpbmsvcDcuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAogc3RydWN0IFggeyB9OwogCkBAIC03LDggKzcsNiBAQAogLy8gQ0hFQ0s6IEB4MiA9IGV4dGVybmFsIGdsb2JhbCAlc3RydWN0LlgKIC8vIENIRUNLOiBAeDMgPSBleHRlcm5hbCBnbG9iYWwgJXN0cnVjdC5YCiBleHRlcm4gIkMiIHsKLQotCiAgIFggeDE7CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLmNvbnN0ZXhwci9wMS5jcHAgYi90ZXN0L0NYWC9kY2wuZGNsL2RjbC5zcGVjL2RjbC5jb25zdGV4cHIvcDEuY3BwCmluZGV4IGNmNDIyOTcuLjA4ZmVmZGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLmNvbnN0ZXhwci9wMS5jcHAKKysrIGIvdGVzdC9DWFgvZGNsLmRjbC9kY2wuc3BlYy9kY2wuY29uc3RleHByL3AxLmNwcApAQCAtMjcsNyArMjcsNyBAQAogc3RydWN0IHMyIHsKICAgY29uc3RleHByIGludCBtaTE7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm9uLXN0YXRpYyBkYXRhIG1lbWJlciBjYW5ub3QgYmUgY29uc3RleHByOyBkaWQgeW91IGludGVuZCB0byBtYWtlIGl0IGNvbnN0P319CiAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG1pMjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZXF1aXJlcyBhbiBpbml0aWFsaXplcn19Ci0gIG11dGFibGUgY29uc3RleHByIGludCBtaTMgPSAzOyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e25vbi1zdGF0aWMgZGF0YSBtZW1iZXIgY2Fubm90IGJlIGNvbnN0ZXhwciR9fSBleHBlY3RlZC1lcnJvciB7eydtdXRhYmxlJyBhbmQgJ2NvbnN0JyBjYW5ub3QgYmUgbWl4ZWR9fQorICBtdXRhYmxlIGNvbnN0ZXhwciBpbnQgbWkzID0gMzsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3tub24tc3RhdGljIGRhdGEgbWVtYmVyIGNhbm5vdCBiZSBjb25zdGV4cHJ7eyR9fX19IGV4cGVjdGVkLWVycm9yIHt7J211dGFibGUnIGFuZCAnY29uc3QnIGNhbm5vdCBiZSBtaXhlZH19CiB9OwogLy8gdHlwZWRlZgogdHlwZWRlZiBjb25zdGV4cHIgaW50IENJOyAvLyBleHBlY3RlZC1lcnJvciB7e3R5cGVkZWYgY2Fubm90IGJlIGNvbnN0ZXhwcn19CkBAIC03Myw3ICs3Myw3IEBACiBzdHJ1Y3QgUyB7CiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0ZXhwciBUIGYoKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0MrKzF5fX0KICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIFQgZygpIGNvbnN0OyAvLyBleHBlY3RlZC1ub3RlIHt7Y2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IGNvdWxkIG5vdCBtYXRjaCAnVCAoKSBjb25zdCcgYWdhaW5zdCAnY2hhciAoKSd9fQorICBUIGcoKSBjb25zdDsgLy8gZXhwZWN0ZWQtbm90ZS1yZSB7e2NhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOiBjb3VsZCBub3QgbWF0Y2ggJ1QgKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319IGNvbnN0JyBhZ2FpbnN0ICdjaGFyICgpe3soIF9fYXR0cmlidXRlX19cKFwodGhpc2NhbGxcKVwpKT99fSd9fQogfTsKIAogLy8gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gY2FuIGRpZmZlciBpbiBjb25zdGVweHIKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLmNvbnN0ZXhwci9wMi5jcHAgYi90ZXN0L0NYWC9kY2wuZGNsL2RjbC5zcGVjL2RjbC5jb25zdGV4cHIvcDIuY3BwCmluZGV4IDAwMWEwODYuLmVlYjViNmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLmNvbnN0ZXhwci9wMi5jcHAKKysrIGIvdGVzdC9DWFgvZGNsLmRjbC9kY2wuc3BlYy9kY2wuY29uc3RleHByL3AyLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBjb25zdGV4cHIgZnVuY3Rpb25zIGFuZCBjb25zdGV4cHIgY29uc3RydWN0b3JzIGFyZSBpbXBsaWNpdGx5IGlubGluZS4KIHN0cnVjdCBTIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLnR5cGUvZGNsLnNwZWMuYXV0by9wNC5jcHAgYi90ZXN0L0NYWC9kY2wuZGNsL2RjbC5zcGVjL2RjbC50eXBlL2RjbC5zcGVjLmF1dG8vcDQuY3BwCmluZGV4IDg0ZjlmOWIuLjQ2Yzg3NGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLnR5cGUvZGNsLnNwZWMuYXV0by9wNC5jcHAKKysrIGIvdGVzdC9DWFgvZGNsLmRjbC9kY2wuc3BlYy9kY2wudHlwZS9kY2wuc3BlYy5hdXRvL3A0LmNwcApAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLXN0ZD1jKysxMQorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAtc3RkPWMrKzF5CisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzIC1zdGQ9YysrMTEgLVduby1jKysxeS1leHRlbnNpb25zCiAvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzIC1zdGQ9YysrOTggLVduby1jKysxMS1leHRlbnNpb25zCiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CkBAIC00MSwzICs0MiwyNSBAQAogfTsKIGNvbnN0IGludCBTOjpiOwogY29uc3QgYXV0byBTOjpjID0gMDsKKworbmFtZXNwYWNlIHN0ZCB7IHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBpbml0aWFsaXplcl9saXN0IHsgaW5pdGlhbGl6ZXJfbGlzdCgpOyB9OyB9CisKKy8vIEluIGFuIGluaXRpYWxpemVyIG9mIHRoZSBmb3JtICggZXhwcmVzc2lvbi1saXN0ICksIHRoZSBleHByZXNzaW9uLWxpc3QKKy8vIHNoYWxsIGJlIGEgc2luZ2xlIGFzc2lnbWVudC1leHByZXNzaW9uLgorYXV0byBwYXJlbnMxKDEpOworYXV0byBwYXJlbnMyKDIsIDMpOyAvLyBleHBlY3RlZC1lcnJvciB7e2luaXRpYWxpemVyIGZvciB2YXJpYWJsZSAncGFyZW5zMicgd2l0aCB0eXBlICdhdXRvJyBjb250YWlucyBtdWx0aXBsZSBleHByZXNzaW9uc319CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorYXV0byBwYXJlbnMzKHs0LCA1LCA2fSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGRlZHVjZSB0eXBlIGZvciB2YXJpYWJsZSAncGFyZW5zMycgd2l0aCB0eXBlICdhdXRvJyBmcm9tIHBhcmVudGhlc2l6ZWQgaW5pdGlhbGl6ZXIgbGlzdH19CithdXRvIHBhcmVuczQgPSBbcDQoMSldIHt9OworYXV0byBwYXJlbnM1ID0gW3A1KDIsIDMpXSB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbml0aWFsaXplciBmb3IgbGFtYmRhIGNhcHR1cmUgJ3A1JyBjb250YWlucyBtdWx0aXBsZSBleHByZXNzaW9uc319CithdXRvIHBhcmVuczYgPSBbcDYoezQsIDUsIDZ9KV0ge307IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGRlZHVjZSB0eXBlIGZvciBsYW1iZGEgY2FwdHVyZSAncDYnIGZyb20gcGFyZW50aGVzaXplZCBpbml0aWFsaXplciBsaXN0fX0KKyNlbmRpZgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxNDAyTAorbmFtZXNwYWNlIHN0ZF9leGFtcGxlIHsKKyAgLy8gVGhlIG90aGVyIGhhbGYgb2YgdGhpcyBleGFtcGxlIGlzIGluIHAzLmNwcAorICBhdXRvIGYoKSAtPiBpbnQ7CisgIGF1dG8gZygpIHsgcmV0dXJuIDAuMDsgfQorICBhdXRvIGgoKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZGNsLmRjbC9kY2wuc3BlYy9kY2wudHlwZS9kY2wudHlwZS5zaW1wbGUvcDUtY3h4MHguY3BwIGIvdGVzdC9DWFgvZGNsLmRjbC9kY2wuc3BlYy9kY2wudHlwZS9kY2wudHlwZS5zaW1wbGUvcDUtY3h4MHguY3BwCmluZGV4IDFlZDkzYjEuLjdmMWIzYjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLnR5cGUvZGNsLnR5cGUuc2ltcGxlL3A1LWN4eDB4LmNwcAorKysgYi90ZXN0L0NYWC9kY2wuZGNsL2RjbC5zcGVjL2RjbC50eXBlL2RjbC50eXBlLnNpbXBsZS9wNS1jeHgweC5jcHAKQEAgLTMwLDI5ICszMCwzMyBAQAogICB0eXBlZGVmIGludCBuOwogfTsKIAorUEQgcGQoKTsKK0REIGRkKCk7CisKIHN0cnVjdCBBIHsKLSAgZGVjbHR5cGUoUEQoKSkgczsgLy8gb2sKLSAgZGVjbHR5cGUoUEQoKSk6Om4gbjsgLy8gb2sKLSAgZGVjbHR5cGUoREQoKSkgKnAgPSBuZXcgZGVjbHR5cGUoREQoKSk7IC8vIG9rCisgIGRlY2x0eXBlKHBkKCkpIHM7IC8vIG9rCisgIGRlY2x0eXBlKHBkKCkpOjpuIG47IC8vIG9rCisgIGRlY2x0eXBlKGRkKCkpICpwID0gbmV3IGRlY2x0eXBlKGRkKCkpOyAvLyBvawogfTsKK0EgYSgpOwogCiAvLyBUd28gZXJyb3JzIGhlcmU6IG9uZSBmb3IgdGhlIGRlY2x0eXBlLCBvbmUgZm9yIHRoZSB2YXJpYWJsZS4KIGRlY2x0eXBlKAotICAgIFBEKCksIC8vIGV4cGVjdGVkLWVycm9yIHt7cHJpdmF0ZSBkZXN0cnVjdG9yfX0KLSAgICBQRCgpKSBwZDE7IC8vIGV4cGVjdGVkLWVycm9yIHt7cHJpdmF0ZSBkZXN0cnVjdG9yfX0KLWRlY2x0eXBlKEREKCksIC8vIGV4cGVjdGVkLWVycm9yIHt7ZGVsZXRlZCBmdW5jdGlvbn19Ci0gICAgICAgICBERCgpKSBkZDE7Ci1kZWNsdHlwZShBKCksCi0gICAgICAgICBERCgpKSBkZDI7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZGVsZXRlZCBmdW5jdGlvbn19CisgICAgcGQoKSwgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcml2YXRlIGRlc3RydWN0b3J9fQorICAgIHBkKCkpIHBkMTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcml2YXRlIGRlc3RydWN0b3J9fQorZGVjbHR5cGUoZGQoKSwgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkZWxldGVkIGZ1bmN0aW9ufX0KKyAgICAgICAgIGRkKCkpIGRkMTsKK2RlY2x0eXBlKGEoKSwKKyAgICAgICAgIGRkKCkpIGRkMjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkZWxldGVkIGZ1bmN0aW9ufX0KIGRlY2x0eXBlKAotICAgIFBEKCksIC8vIGV4cGVjdGVkLWVycm9yIHt7dGVtcG9yYXJ5IG9mIHR5cGUgJ1BEJyBoYXMgcHJpdmF0ZSBkZXN0cnVjdG9yfX0KKyAgICBwZCgpLCAvLyBleHBlY3RlZC1lcnJvciB7e3RlbXBvcmFyeSBvZiB0eXBlICdQRCcgaGFzIHByaXZhdGUgZGVzdHJ1Y3Rvcn19CiAgICAgMCkgcGQyOwogCi1kZWNsdHlwZSgoKDEzLCAoKEREKCkpKSkpKTo6biBkZF9wYXJlbnM7IC8vIG9rCi1kZWNsdHlwZSgoKCgoNDIpKSwgUEQoKSkpKTo6biBwZF9wYXJlbnNfY29tbWE7IC8vIG9rCitkZWNsdHlwZSgoKDEzLCAoKGRkKCkpKSkpKTo6biBkZF9wYXJlbnM7IC8vIG9rCitkZWNsdHlwZSgoKCgoNDIpKSwgcGQoKSkpKTo6biBwZF9wYXJlbnNfY29tbWE7IC8vIG9rCiAKIC8vIEVuc3VyZSBwYXJlbnMgYXJlbid0IHN0cmlwcGVkIGZyb20gYSBkZWNsdHlwZSBub2RlLgotZXh0ZXJuIGRlY2x0eXBlKFBEKCkpIHBkX3JlZjsgLy8gb2sKK2V4dGVybiBkZWNsdHlwZShwZCgpKSBwZF9yZWY7IC8vIG9rCiBkZWNsdHlwZSgocGRfcmVmKSkgcGRfcmVmMyA9IHBkX3JlZjsgLy8gb2ssIFBEICYKIGRlY2x0eXBlKHBkX3JlZikgcGRfcmVmMiA9IHBkX3JlZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcml2YXRlIGRlc3RydWN0b3J9fQogCkBAIC0xMDcsNyArMTExLDcgQEAKIAogbmFtZXNwYWNlIE92ZXJsb2FkIHsKICAgREQgb3BlcmF0b3IrKFBEICZhLCBQRCAmYik7Ci0gIGRlY2x0eXBlKFBEKCkpICpwZF9wdHI7CisgIGRlY2x0eXBlKHBkKCkpICpwZF9wdHI7CiAgIGRlY2x0eXBlKCpwZF9wdHIgKyAqcGRfcHRyKSAqZGRfcHRyOyAvLyBvawogCiAgIGRlY2x0eXBlKDAsICpwZF9wdHIpIHBkX3JlZjIgPSBwZF9yZWY7IC8vIG9rCmRpZmYgLS1naXQgYS90ZXN0L0NYWC9kY2wuZGNsL2RjbC5zcGVjL2RjbC50eXBlL3AzLTB4LmNwcCBiL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLnR5cGUvcDMtMHguY3BwCmluZGV4IDAyY2M5NzMuLjM5ZDZlNzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLnR5cGUvcDMtMHguY3BwCisrKyBiL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLnR5cGUvcDMtMHguY3BwCkBAIC0yLDEyICsyLDEyIEBACiAKIHVzaW5nIFggPSBzdHJ1Y3QgeyAvLyBvawogfTsKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHVzaW5nIFkgPSBzdHJ1Y3QgeyAvLyBleHBlY3RlZC1lcnJvciB7e2NhbiBub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgYWxpYXMgdGVtcGxhdGV9fQordGVtcGxhdGU8dHlwZW5hbWUgVD4gdXNpbmcgWSA9IHN0cnVjdCB7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIGFsaWFzIHRlbXBsYXRlfX0KIH07CiAKIGNsYXNzIEsgewogICB2aXJ0dWFsIH5LKCk7Ci0gIG9wZXJhdG9yIHN0cnVjdCBTIHt9ICgpOyAvLyBleHBlY3RlZC1lcnJvcnt7J0s6OlMnIGNhbiBub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KKyAgb3BlcmF0b3Igc3RydWN0IFMge30gKCk7IC8vIGV4cGVjdGVkLWVycm9ye3snSzo6UycgY2Fubm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CiB9OwogCiBzdHJ1Y3QgQSB7fTsKQEAgLTE4LDI2ICsxOCwyNiBAQAogICBmb3IgKHN0cnVjdCBTIHsgUyhpbnQpIHt9IH0gcyA6IGFycikgeyAvLyBleHBlY3RlZC1lcnJvciB7e3R5cGVzIG1heSBub3QgYmUgZGVmaW5lZCBpbiBhIGZvciByYW5nZSBkZWNsYXJhdGlvbn19CiAgIH0KIAotICBuZXcgc3RydWN0IFQge307IC8vIGV4cGVjdGVkLWVycm9yIHt7J1QnIGNhbiBub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KLSAgbmV3IHN0cnVjdCBBIHt9OyAvLyBleHBlY3RlZC1lcnJvciB7eydBJyBjYW4gbm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CisgIG5ldyBzdHJ1Y3QgVCB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snVCcgY2Fubm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CisgIG5ldyBzdHJ1Y3QgQSB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snQScgY2Fubm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CiAKLSAgdHJ5IHt9IGNhdGNoIChzdHJ1Y3QgVSB7fSkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3snVScgY2FuIG5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBzcGVjaWZpZXJ9fQorICB0cnkge30gY2F0Y2ggKHN0cnVjdCBVIHt9KSB7fSAvLyBleHBlY3RlZC1lcnJvciB7eydVJyBjYW5ub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KIAotICAodm9pZCkoc3RydWN0IFYgeyBWKGludCk7IH0pMDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snVicgY2FuIG5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBzcGVjaWZpZXJ9fQorICAodm9pZCkoc3RydWN0IFYgeyBWKGludCk7IH0pMDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snVicgY2Fubm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CiAKLSAgKHZvaWQpZHluYW1pY19jYXN0PHN0cnVjdCBXIHt9Kj4oKEsqKTApOyAvLyBleHBlY3RlZC1lcnJvciB7eydXJyBjYW4gbm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19Ci0gICh2b2lkKXN0YXRpY19jYXN0PHN0cnVjdCBYIHt9Kj4oMCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J1gnIGNhbiBub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KLSAgKHZvaWQpcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgWSB7fSo+KDApOyAvLyBleHBlY3RlZC1lcnJvciB7eydZJyBjYW4gbm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19Ci0gICh2b2lkKWNvbnN0X2Nhc3Q8c3RydWN0IFoge30qPigoY29uc3QgWiopMCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J1onIGNhbiBub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KKyAgKHZvaWQpZHluYW1pY19jYXN0PHN0cnVjdCBXIHt9Kj4oKEsqKTApOyAvLyBleHBlY3RlZC1lcnJvciB7eydXJyBjYW5ub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KKyAgKHZvaWQpc3RhdGljX2Nhc3Q8c3RydWN0IFgge30qPigwKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snWCcgY2Fubm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CisgICh2b2lkKXJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IFkge30qPigwKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snWScgY2Fubm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CisgICh2b2lkKWNvbnN0X2Nhc3Q8c3RydWN0IFoge30qPigoY29uc3QgWiopMCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J1onIGNhbm5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBzcGVjaWZpZXJ9fQogfQogCi12b2lkIGcoKSB0aHJvdyAoc3RydWN0IEV4IHt9KSB7IC8vIGV4cGVjdGVkLWVycm9yIHt7J0V4JyBjYW4gbm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19Cit2b2lkIGcoKSB0aHJvdyAoc3RydWN0IEV4IHt9KSB7IC8vIGV4cGVjdGVkLWVycm9yIHt7J0V4JyBjYW5ub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KIH0KIAotYWxpZ25hcyhzdHJ1Y3QgQWEge30pIGludCB4OyAvLyBleHBlY3RlZC1lcnJvciB7eydBYScgY2FuIG5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBzcGVjaWZpZXJ9fQorYWxpZ25hcyhzdHJ1Y3QgQWEge30pIGludCB4OyAvLyBleHBlY3RlZC1lcnJvciB7eydBYScgY2Fubm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CiAKLWludCBhID0gc2l6ZW9mKHN0cnVjdCBTbyB7fSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J1NvJyBjYW4gbm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19Ci1pbnQgYiA9IGFsaWdub2Yoc3RydWN0IEFvIHt9KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snQW8nIGNhbiBub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KK2ludCBhID0gc2l6ZW9mKHN0cnVjdCBTbyB7fSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J1NvJyBjYW5ub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KK2ludCBiID0gYWxpZ25vZihzdHJ1Y3QgQW8ge30pOyAvLyBleHBlY3RlZC1lcnJvciB7eydBbycgY2Fubm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CiAKIG5hbWVzcGFjZSBzdGQgeyBzdHJ1Y3QgdHlwZV9pbmZvOyB9Ci1jb25zdCBzdGQ6OnR5cGVfaW5mbyAmdGkgPSB0eXBlaWQoc3RydWN0IFRpIHt9KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snVGknIGNhbiBub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KK2NvbnN0IHN0ZDo6dHlwZV9pbmZvICZ0aSA9IHR5cGVpZChzdHJ1Y3QgVGkge30pOyAvLyBleHBlY3RlZC1lcnJvciB7eydUaScgY2Fubm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9kY2wuZGNsL2RjbC5zcGVjL2RjbC50eXBlZGVmL3AyLTB4LmNwcCBiL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLnR5cGVkZWYvcDItMHguY3BwCmluZGV4IDg5YTI4YWQuLmNjNDRmNzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLnR5cGVkZWYvcDItMHguY3BwCisrKyBiL3Rlc3QvQ1hYL2RjbC5kY2wvZGNsLnNwZWMvZGNsLnR5cGVkZWYvcDItMHguY3BwCkBAIC0xNTQsNSArMTU0LDUgQEAKIG5hbWVzcGFjZSBWb2lkQXJnIHsKICAgdXNpbmcgViA9IHZvaWQ7CiAgIFYgZihpbnQpOyAvLyBvawotICBWIGcoVik7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZW1wdHkgcGFyYW1ldGVyIGxpc3QgZGVmaW5lZCB3aXRoIGEgdHlwZSBhbGlhcyBvZiAndm9pZCcgbm90IGFsbG93ZWR9fQorICBWIGcoVik7IC8vIG9rIChEUjU3NykKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2RjbC5kZWNsL2RjbC5pbml0L2RjbC5pbml0Lmxpc3QvcDctMHguY3BwIGIvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLmluaXQvZGNsLmluaXQubGlzdC9wNy0weC5jcHAKaW5kZXggOWIxNzI3Zi4uZGUyYTc2YyAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLmluaXQvZGNsLmluaXQubGlzdC9wNy0weC5jcHAKKysrIGIvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLmluaXQvZGNsLmluaXQubGlzdC9wNy0weC5jcHAKQEAgLTE2Myw3ICsxNjMsOCBAQAogICBBZ2c8Ym9vbD4gYjMgPSB7LTF9OyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3sgY2Fubm90IGJlIG5hcnJvd2VkIH19IGV4cGVjdGVkLW5vdGUge3tvdmVycmlkZX19CiAKICAgLy8gQ29udmVyc2lvbnMgZnJvbSBwb2ludGVycyB0byBib29sZWFucyBhcmVuJ3QgbmFycm93aW5nIGNvbnZlcnNpb25zLgotICBBZ2c8Ym9vbD4gYiA9IHsmYjF9OyAgLy8gT0sKKyAgQWdnPGJvb2w+KiBwdHIgPSAmYjE7CisgIEFnZzxib29sPiBiID0ge3B0cn07ICAvLyBPSwogCiAgIEFnZzxzaG9ydD4gY2UxID0geyBDb252ZXJ0PGludD4oMTAwMDAwKSB9OyAvLyBleHBlY3RlZC1lcnJvciB7e2NvbnN0YW50IGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIDEwMDAwMCB3aGljaCBjYW5ub3QgYmUgbmFycm93ZWQgdG8gdHlwZSAnc2hvcnQnfX0gZXhwZWN0ZWQtbm90ZSB7e292ZXJyaWRlfX0gZXhwZWN0ZWQtd2FybmluZyB7e2NoYW5nZXMgdmFsdWUgZnJvbSAxMDAwMDAgdG8gLTMxMDcyfX0KICAgQWdnPGNoYXI+IGNlMiA9IHsgQ29udmVydFZhcjxzaG9ydD4oKSB9OyAvLyBleHBlY3RlZC1lcnJvciB7e25vbi1jb25zdGFudC1leHByZXNzaW9uIGNhbm5vdCBiZSBuYXJyb3dlZCBmcm9tIHR5cGUgJ3Nob3J0JyB0byAnY2hhcid9fSBleHBlY3RlZC1ub3RlIHt7b3ZlcnJpZGV9fQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLmluaXQvZGNsLmluaXQubGlzdC9wNy1jeHgxMS1ub3dhcm4uY3BwIGIvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLmluaXQvZGNsLmluaXQubGlzdC9wNy1jeHgxMS1ub3dhcm4uY3BwCmluZGV4IDRiY2YxMTMuLmNiZWFlNGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2RjbC5kZWNsL2RjbC5pbml0L2RjbC5pbml0Lmxpc3QvcDctY3h4MTEtbm93YXJuLmNwcAorKysgYi90ZXN0L0NYWC9kY2wuZGVjbC9kY2wuaW5pdC9kY2wuaW5pdC5saXN0L3A3LWN4eDExLW5vd2Fybi5jcHAKQEAgLTE2NCw3ICsxNjQsOCBAQAogICBBZ2c8Ym9vbD4gYjMgPSB7LTF9OyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyBjYW5ub3QgYmUgbmFycm93ZWQgfX0gZXhwZWN0ZWQtbm90ZSB7e292ZXJyaWRlfX0KIAogICAvLyBDb252ZXJzaW9ucyBmcm9tIHBvaW50ZXJzIHRvIGJvb2xlYW5zIGFyZW4ndCBuYXJyb3dpbmcgY29udmVyc2lvbnMuCi0gIEFnZzxib29sPiBiID0geyZiMX07ICAvLyBPSworICBBZ2c8Ym9vbD4qIHB0ciA9ICZiMTsKKyAgQWdnPGJvb2w+IGIgPSB7cHRyfTsgIC8vIE9LCiAKICAgQWdnPHNob3J0PiBjZTEgPSB7IENvbnZlcnQ8aW50PigxMDAwMDApIH07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjb25zdGFudCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byAxMDAwMDAgd2hpY2ggY2Fubm90IGJlIG5hcnJvd2VkIHRvIHR5cGUgJ3Nob3J0J319IGV4cGVjdGVkLW5vdGUge3tvdmVycmlkZX19IGV4cGVjdGVkLXdhcm5pbmcge3tjaGFuZ2VzIHZhbHVlIGZyb20gMTAwMDAwIHRvIC0zMTA3Mn19CiAgIEFnZzxjaGFyPiBjZTIgPSB7IENvbnZlcnRWYXI8c2hvcnQ+KCkgfTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e25vbi1jb25zdGFudC1leHByZXNzaW9uIGNhbm5vdCBiZSBuYXJyb3dlZCBmcm9tIHR5cGUgJ3Nob3J0JyB0byAnY2hhcid9fSBleHBlY3RlZC1ub3RlIHt7b3ZlcnJpZGV9fQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLm1lYW5pbmcvZGNsLmZjdC9wOC5jcHAgYi90ZXN0L0NYWC9kY2wuZGVjbC9kY2wubWVhbmluZy9kY2wuZmN0L3A4LmNwcAppbmRleCBlYzFjY2JmLi4wNDU0NDEyIDEwMDY0NAotLS0gYS90ZXN0L0NYWC9kY2wuZGVjbC9kY2wubWVhbmluZy9kY2wuZmN0L3A4LmNwcAorKysgYi90ZXN0L0NYWC9kY2wuZGVjbC9kY2wubWVhbmluZy9kY2wuZmN0L3A4LmNwcApAQCAtMSw4ICsxLDggQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKIAogc3RydWN0IEEgeyB9OwotQTo6QSAoZW51bSB7IGUxIH0pIHt9IC8vIGV4cGVjdGVkLWVycm9ye3tjYW4gbm90IGJlIGRlZmluZWQgaW4gYSBwYXJhbWV0ZXJ9fQotdm9pZCBBOjpmKGVudW0geyBlMiB9KSB7fSAvLyBleHBlY3RlZC1lcnJvcnt7Y2FuIG5vdCBiZSBkZWZpbmVkIGluIGEgcGFyYW1ldGVyfX0KK0E6OkEgKGVudW0geyBlMSB9KSB7fSAvLyBleHBlY3RlZC1lcnJvcnt7Y2Fubm90IGJlIGRlZmluZWQgaW4gYSBwYXJhbWV0ZXJ9fQordm9pZCBBOjpmKGVudW0geyBlMiB9KSB7fSAvLyBleHBlY3RlZC1lcnJvcnt7Y2Fubm90IGJlIGRlZmluZWQgaW4gYSBwYXJhbWV0ZXJ9fQogCi1lbnVtIHsgZTMgfSBBOjpnKCkgeyB9IC8vIGV4cGVjdGVkLWVycm9ye3tjYW4gbm90IGJlIGRlZmluZWQgaW4gdGhlIHJlc3VsdCB0eXBlfX0gXAorZW51bSB7IGUzIH0gQTo6ZygpIHsgfSAvLyBleHBlY3RlZC1lcnJvcnt7Y2Fubm90IGJlIGRlZmluZWQgaW4gdGhlIHJlc3VsdCB0eXBlfX0gXAogLy8gZXhwZWN0ZWQtZXJyb3J7e291dC1vZi1saW5lIGRlZmluaXRpb259fQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLm1lYW5pbmcvZGNsLm1wdHIvcDMuY3BwIGIvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLm1lYW5pbmcvZGNsLm1wdHIvcDMuY3BwCmluZGV4IDdlMzU3ODguLmUxNTlhYjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2RjbC5kZWNsL2RjbC5tZWFuaW5nL2RjbC5tcHRyL3AzLmNwcAorKysgYi90ZXN0L0NYWC9kY2wuZGVjbC9kY2wubWVhbmluZy9kY2wubXB0ci9wMy5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICAgQSBhKGIpOyAKICAgCiAgIGludCBBOjoqaXAgPSAmQTo6czsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW5ub3QgaW5pdGlhbGl6ZSBhIHZhcmlhYmxlIG9mIHR5cGUgJ2ludCBBOjoqJyB3aXRoIGFuIHJ2YWx1ZSBvZiB0eXBlICdpbnQgKid9fQotICBhLiomQTo6cyA9IDEwOyAvLyBleHBlY3RlZC1lcnJvcnt7cmlnaHQgaGFuZCBvcGVyYW5kIHRvIC4qIGhhcyBub24gcG9pbnRlci10by1tZW1iZXIgdHlwZSAnaW50IConfX0KKyAgYS4qJkE6OnMgPSAxMDsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JpZ2h0IGhhbmQgb3BlcmFuZCB0byAuKiBoYXMgbm9uLXBvaW50ZXItdG8tbWVtYmVyIHR5cGUgJ2ludCAqJ319CiAgIAogICBhLiomQTo6aSA9IDEwOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2Fubm90IGZvcm0gYSBwb2ludGVyLXRvLW1lbWJlciB0byBtZW1iZXIgJ2knIG9mIHJlZmVyZW5jZSB0eXBlICdpbnQgJid9fQogICBmdChhKTsgLy8gZXhwZWN0ZWQtbm90ZXt7aW4gaW5zdGFudGlhdGlvbiBvZiBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAnZnQ8QT4nIHJlcXVlc3RlZCBoZXJlfX0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2RjbC5kZWNsL2RjbC5tZWFuaW5nL2RjbC5yZWYvcDYtMHguY3BwIGIvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLm1lYW5pbmcvZGNsLnJlZi9wNi0weC5jcHAKaW5kZXggY2Q2MjNkZi4uMGY3NmUxZiAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLm1lYW5pbmcvZGNsLnJlZi9wNi0weC5jcHAKKysrIGIvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLm1lYW5pbmcvZGNsLnJlZi9wNi0weC5jcHAKQEAgLTEsNSArMSw0IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKLS8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IAogc3RydWN0IGlzX3NhbWUgewpAQCAtMjAsOCArMTksOCBAQAogdHlwZWRlZiBpbnQmJiBSUkk7CiAKIHR5cGVkZWYgTFJJJiByMTsgQ0hFQ0tfRVFVQUxfVFlQRVMocjEsIGludCYpOwotdHlwZWRlZiBjb25zdCBMUkkmIHIyOyBDSEVDS19FUVVBTF9UWVBFUyhyMiwgaW50Jik7Ci10eXBlZGVmIGNvbnN0IExSSSYmIHIzOyBDSEVDS19FUVVBTF9UWVBFUyhyMywgaW50Jik7Cit0eXBlZGVmIGNvbnN0IExSSSYgcjI7IENIRUNLX0VRVUFMX1RZUEVTKHIyLCBpbnQmKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydjb25zdCcgcXVhbGlmaWVyIG9uIHJlZmVyZW5jZSB0eXBlICdMUkknIChha2EgJ2ludCAmJykgaGFzIG5vIGVmZmVjdH19Cit0eXBlZGVmIGNvbnN0IExSSSYmIHIzOyBDSEVDS19FUVVBTF9UWVBFUyhyMywgaW50Jik7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snY29uc3QnIHF1YWxpZmllciBvbiByZWZlcmVuY2UgdHlwZSAnTFJJJyAoYWthICdpbnQgJicpIGhhcyBubyBlZmZlY3R9fQogCiB0eXBlZGVmIFJSSSYgcjQ7IENIRUNLX0VRVUFMX1RZUEVTKHI0LCBpbnQmKTsKIHR5cGVkZWYgUlJJJiYgcjU7IENIRUNLX0VRVUFMX1RZUEVTKHI1LCBpbnQmJik7CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9kY2wuZGVjbC9kY2wubWVhbmluZy9wMS0weC5jcHAgYi90ZXN0L0NYWC9kY2wuZGVjbC9kY2wubWVhbmluZy9wMS0weC5jcHAKaW5kZXggOTkzMzRiODQuLjQxZmYzZTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2RjbC5kZWNsL2RjbC5tZWFuaW5nL3AxLTB4LmNwcAorKysgYi90ZXN0L0NYWC9kY2wuZGVjbC9kY2wubWVhbmluZy9wMS0weC5jcHAKQEAgLTIyLDMgKzIyLDgzIEBACiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogdm9pZCBkZWNsdHlwZSh0Zm9vPFQ+KCkpOjpmdW5jKCkgeyAvLyBleHBlY3RlZC1lcnJvcnt7bmVzdGVkIG5hbWUgc3BlY2lmaWVyICdkZWNsdHlwZSh0Zm9vPFQ+KCkpOjonIGZvciBkZWNsYXJhdGlvbiBkb2VzIG5vdCByZWZlciBpbnRvIGEgY2xhc3MsIGNsYXNzIHRlbXBsYXRlIG9yIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb259fQogfQorCisvLyBBbiBpbml0LWRlY2xhcmF0b3IgbmFtZWQgd2l0aCBhIHF1YWxpZmllZC1pZCBjYW4gcmVmZXIgdG8gYW4gZWxlbWVudCBvZiB0aGUKKy8vIGlubGluZSBuYW1lc3BhY2Ugc2V0IG9mIHRoZSBuYW1lZCBuYW1lc3BhY2UuCituYW1lc3BhY2UgaW5saW5lX25hbWVzcGFjZXMgeworICBuYW1lc3BhY2UgTiB7CisgICAgaW5saW5lIG5hbWVzcGFjZSBNIHsKKyAgICAgIHZvaWQgZigpOyAvLyBleHBlY3RlZC1ub3RlIHt7cG9zc2libGUgdGFyZ2V0fX0KKyAgICAgIHZvaWQgZygpOworICAgICAgZXh0ZXJuIGludCBtOyAvLyBleHBlY3RlZC1ub3RlIHt7Y2FuZGlkYXRlfX0KKyAgICAgIGV4dGVybiBpbnQgbjsKKyAgICAgIHN0cnVjdCBTOyAvLyBleHBlY3RlZC1ub3RlIHt7Y2FuZGlkYXRlfX0KKyAgICAgIHN0cnVjdCBUOworICAgICAgZW51bSBFIDogaW50OyAvLyBleHBlY3RlZC1ub3RlIHt7Y2FuZGlkYXRlfX0KKyAgICAgIGVudW0gRiA6IGludDsKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZnQoKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2hlcmV9fQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBndCgpOyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBleHRlcm4gaW50IG10OyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19IGV4cGVjdGVkLXdhcm5pbmcge3tleHRlbnNpb259fQorICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gZXh0ZXJuIGludCBudDsgLy8gZXhwZWN0ZWQtbm90ZSB7e2hlcmV9fSBleHBlY3RlZC13YXJuaW5nIHt7ZXh0ZW5zaW9ufX0KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBVOyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgVjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2hlcmV9fQorICAgIH0KKworICAgIC8vIFdoZW4gbmFtZWQgYnkgdW5xdWFsaWZpZWQtaWQsIHdlIGRvICpub3QqIGxvb2sgaW4gdGhlIGlubGluZSBuYW1lc3BhY2UKKyAgICAvLyBzZXQuCisgICAgdm9pZCBmKCkge30gLy8gZXhwZWN0ZWQtbm90ZSB7e3Bvc3NpYmxlIHRhcmdldH19CisgICAgaW50IG07IC8vIGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGV9fQorICAgIHN0cnVjdCBTIHt9OyAvLyBleHBlY3RlZC1ub3RlIHt7Y2FuZGlkYXRlfX0KKyAgICBlbnVtIEUgOiBpbnQge307IC8vIGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGV9fQorCisgICAgc3RhdGljX2Fzc2VydCgmZiAhPSAmTTo6ZiwgIiIpOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlZmVyZW5jZSB0byBvdmVybG9hZGVkIGZ1bmN0aW9uIGNvdWxkIG5vdCBiZSByZXNvbHZlZH19CisgICAgc3RhdGljX2Fzc2VydCgmbSAhPSAmTTo6bSwgIiIpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FtYmlndW91c319CisgICAgdHlwZWRlZiBTIFg7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW1iaWd1b3VzfX0KKyAgICB0eXBlZGVmIEUgWTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thbWJpZ3VvdXN9fQorCisgICAgLy8gV2hlbiBuYW1lZCBieSAodW5xdWFsaWZpZWQpIHRlbXBsYXRlLWlkLCB3ZSBkbyBsb29rIGluIHRoZSBpbmxpbmUKKyAgICAvLyBuYW1lc3BhY2Ugc2V0LiAgU2VlIFtuYW1lc3BhY2UuZGVmXXA4LCBbdGVtcC5leHBsaWNpdF1wMywKKyAgICAvLyBbdGVtcC5leHBsLnNwZWNdcDIuCisgICAgLy8KKyAgICAvLyBUaGlzIGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCBmb3IgcGFydGlhbCBzcGVjaWFsaXphdGlvbnMsIGJ1dAorICAgIC8vIHRoYXQgaXMganVzdCBhIGxhbmd1YWdlIGRlZmVjdC4KKyAgICB0ZW1wbGF0ZTw+IHZvaWQgZnQ8aW50PigpIHt9CisgICAgdGVtcGxhdGUgdm9pZCBmdDxjaGFyPigpOyAvLyBleHBlY3RlZC1lcnJvciB7e3VuZGVmaW5lZH19CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgbXQ8VCo+OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0ZW5zaW9ufX0KKyAgICB0ZW1wbGF0ZTw+IGludCBtdDxpbnQ+OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0ZW5zaW9ufX0KKyAgICB0ZW1wbGF0ZSBpbnQgbXQ8aW50Kj47CisgICAgdGVtcGxhdGUgaW50IG10PGNoYXI+OyAvLyBleHBlY3RlZC1lcnJvciB7e3VuZGVmaW5lZH19CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgVTxUKj4ge307CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgVTxpbnQ+IHt9OworICAgIHRlbXBsYXRlIHN0cnVjdCBVPGludCo+OworICAgIHRlbXBsYXRlIHN0cnVjdCBVPGNoYXI+OyAvLyBleHBlY3RlZC1lcnJvciB7e3VuZGVmaW5lZH19CisgIH0KKworICAvLyBXaGVuIG5hbWVkIGJ5IHF1YWxpZmllZC1pZCwgd2UgKmRvKiBsb29rIGluIHRoZSBpbmxpbmUgbmFtZXNwYWNlIHNldC4KKyAgdm9pZCBOOjpnKCkge30KKyAgaW50IE46Om47CisgIHN0cnVjdCBOOjpUIHt9OworICBlbnVtIE46OkYgOiBpbnQge307CisKKyAgc3RhdGljX2Fzc2VydCgmTjo6ZyA9PSAmTjo6TTo6ZywgIiIpOworICBzdGF0aWNfYXNzZXJ0KCZOOjpuID09ICZOOjpNOjpuLCAiIik7CisgIHR5cGVkZWYgTjo6VCBYOworICB0eXBlZGVmIE46Ok06OlQgWDsKKyAgdHlwZWRlZiBOOjpGIFk7CisgIHR5cGVkZWYgTjo6TTo6RiBZOworCisgIHRlbXBsYXRlPD4gdm9pZCBOOjpndDxpbnQ+KCkge30KKyAgdGVtcGxhdGUgdm9pZCBOOjpndDxjaGFyPigpOyAvLyBleHBlY3RlZC1lcnJvciB7e3VuZGVmaW5lZH19CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IE46Om50PFQqPjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dGVuc2lvbn19CisgIHRlbXBsYXRlPD4gaW50IE46Om50PGludD47IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRlbnNpb259fQorICB0ZW1wbGF0ZSBpbnQgTjo6bnQ8aW50Kj47CisgIHRlbXBsYXRlIGludCBOOjpudDxjaGFyPjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1bmRlZmluZWR9fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBOOjpWPFQqPiB7fTsKKyAgdGVtcGxhdGU8PiBzdHJ1Y3QgTjo6VjxpbnQ+IHt9OworICB0ZW1wbGF0ZSBzdHJ1Y3QgTjo6VjxpbnQqPjsKKyAgdGVtcGxhdGUgc3RydWN0IE46OlY8Y2hhcj47IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5kZWZpbmVkfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2RjbC5kZWNsL2RjbC5tZWFuaW5nL3AxLmNwcCBiL3Rlc3QvQ1hYL2RjbC5kZWNsL2RjbC5tZWFuaW5nL3AxLmNwcAppbmRleCBlYzlhMjYxLi41NzQ3MzgwIDEwMDY0NAotLS0gYS90ZXN0L0NYWC9kY2wuZGVjbC9kY2wubWVhbmluZy9wMS5jcHAKKysrIGIvdGVzdC9DWFgvZGNsLmRlY2wvZGNsLm1lYW5pbmcvcDEuY3BwCkBAIC0yOSw5ICsyOSwxNyBAQAogICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHdpYmJsZShUKTsKIH0KIG5hbWVzcGFjZSBOUyB7Ci0gIHZvaWQgTlM6OmZvbygpIHt9IC8vIGV4cGVjdGVkLWVycm9ye3tleHRyYSBxdWFsaWZpY2F0aW9uIG9uIG1lbWJlciAnZm9vJ319Ci0gIGludCBOUzo6YmFyOyAvLyBleHBlY3RlZC1lcnJvcnt7ZXh0cmEgcXVhbGlmaWNhdGlvbiBvbiBtZW1iZXIgJ2Jhcid9fQotICBzdHJ1Y3QgTlM6OlggeyB9OyAvLyBleHBlY3RlZC1lcnJvcnt7ZXh0cmEgcXVhbGlmaWNhdGlvbiBvbiBtZW1iZXIgJ1gnfX0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IE5TOjpZOyAvLyBleHBlY3RlZC1lcnJvcnt7ZXh0cmEgcXVhbGlmaWNhdGlvbiBvbiBtZW1iZXIgJ1knfX0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBOUzo6d2liYmxlKFQpIHsgfSAvLyBleHBlY3RlZC1lcnJvcnt7ZXh0cmEgcXVhbGlmaWNhdGlvbiBvbiBtZW1iZXIgJ3dpYmJsZSd9fQorICAvLyBVbmRlciBEUjQ4MiwgdGhlc2UgYXJlIGFsbCB2YWxpZCwgZXhjZXB0IGZvciBmb3J3YXJkLWRlY2xhcmluZyBhIHN0cnVjdAorICAvLyB3aXRoIGEgbmVzdGVkLW5hbWUtc3BlY2lmaWVyLgorICB2b2lkIE5TOjpmb28oKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHF1YWxpZmljYXRpb259fQorICBleHRlcm4gaW50IE5TOjpiYXI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSBxdWFsaWZpY2F0aW9ufX0KKyAgc3RydWN0IE5TOjpYOyAvLyBleHBlY3RlZC1lcnJvciB7e2ZvcndhcmQgZGVjbGFyYXRpb24gb2Ygc3RydWN0IGNhbm5vdCBoYXZlIGEgbmVzdGVkIG5hbWUgc3BlY2lmaWVyfX0gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHF1YWxpZmljYXRpb259fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgTlM6Olk7IC8vIGV4cGVjdGVkLWVycm9yIHt7Zm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBzdHJ1Y3QgY2Fubm90IGhhdmUgYSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXJ9fSBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgcXVhbGlmaWNhdGlvbn19CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgTlM6OndpYmJsZShUKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHF1YWxpZmljYXRpb259fQorCisgIHZvaWQgTlM6OmZvbygpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4dHJhIHF1YWxpZmljYXRpb24gb24gbWVtYmVyICdmb28nfX0KKyAgaW50IE5TOjpiYXI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4dHJhIHF1YWxpZmljYXRpb24gb24gbWVtYmVyICdiYXInfX0KKyAgc3RydWN0IE5TOjpYIHsgfTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXh0cmEgcXVhbGlmaWNhdGlvbiBvbiBtZW1iZXIgJ1gnfX0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IE5TOjpZIHsgfTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXh0cmEgcXVhbGlmaWNhdGlvbiBvbiBtZW1iZXIgJ1knfX0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBOUzo6d2liYmxlKFQpIHsgfSAvLyBleHBlY3RlZC13YXJuaW5ne3tleHRyYSBxdWFsaWZpY2F0aW9uIG9uIG1lbWJlciAnd2liYmxlJ319CiB9CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9kcnMvZHIweHguY3BwIGIvdGVzdC9DWFgvZHJzL2RyMHh4LmNwcAppbmRleCAyNjVhNTJkLi4yOWUxNzIwIDEwMDY0NAotLS0gYS90ZXN0L0NYWC9kcnMvZHIweHguY3BwCisrKyBiL3Rlc3QvQ1hYL2Rycy9kcjB4eC5jcHAKQEAgLTQsNyArNCw3IEBACiAKIG5hbWVzcGFjZSBkcjEgeyAvLyBkcjE6IG5vCiAgIG5hbWVzcGFjZSBYIHsgZXh0ZXJuICJDIiB2b2lkIGRyMV9mKGludCBhID0gMSk7IH0KLSAgbmFtZXNwYWNlIFkgeyBleHRlcm4gIkMiIHZvaWQgZHIxX2YoaW50IGEgPSAyKTsgfQorICBuYW1lc3BhY2UgWSB7IGV4dGVybiAiQyIgdm9pZCBkcjFfZihpbnQgYSA9IDEpOyB9CiAgIHVzaW5nIFg6OmRyMV9mOyB1c2luZyBZOjpkcjFfZjsKICAgdm9pZCBnKCkgewogICAgIGRyMV9mKDApOwpAQCAtMjUsNyArMjUsMjMgQEAKICAgfQogICB2b2lkIFg6OnooaW50ID0gMSkge30gLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KICAgbmFtZXNwYWNlIFggewotICAgIHZvaWQgeihpbnQgPSAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZWRlZmluaXRpb24gb2YgZGVmYXVsdCBhcmd1bWVudH19CisgICAgdm9pZCB6KGludCA9IDEpOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlZGVmaW5pdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50fX0KKyAgfQorCisgIHZvaWQgaShpbnQgPSAxKTsKKyAgdm9pZCBqKCkgeworICAgIHZvaWQgaShpbnQgPSAxKTsKKyAgICB1c2luZyBkcjE6Omk7CisgICAgaSgwKTsKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgcmVqZWN0ZWQsIGR1ZSB0byB0aGUgYW1iaWd1b3VzIGRlZmF1bHQgYXJndW1lbnQuCisgICAgaSgpOworICB9CisgIHZvaWQgaygpIHsKKyAgICB1c2luZyBkcjE6Omk7CisgICAgdm9pZCBpKGludCA9IDEpOworICAgIGkoMCk7CisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIHJlamVjdGVkLCBkdWUgdG8gdGhlIGFtYmlndW91cyBkZWZhdWx0IGFyZ3VtZW50LgorICAgIGkoKTsKICAgfQogfQogCkBAIC0xNDEsNiArMTU3LDIxIEBACiAgIH0KIH0KIAorbmFtZXNwYWNlIGRyMTMgeyAvLyBkcjEzOiBubworICBleHRlcm4gIkMiIHZvaWQgZihpbnQpOworICB2b2lkIGcoY2hhcik7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEEgeworICAgIEEodm9pZCAoKmZwKShUKSk7CisgIH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBoKHZvaWQgKFQpKTsKKworICBBPGludD4gYTEoZik7IC8vIEZJWE1FOiBXZSBzaG91bGQgcmVqZWN0IHRoaXMuCisgIEE8Y2hhcj4gYTIoZyk7CisgIGludCBhMyA9IGgoZik7IC8vIEZJWE1FOiBXZSBzaG91bGQgcmVqZWN0IHRoaXMuCisgIGludCBhNCA9IGgoZyk7Cit9CisKIG5hbWVzcGFjZSBkcjE0IHsgLy8gZHIxNDogeWVzCiAgIG5hbWVzcGFjZSBYIHsgZXh0ZXJuICJDIiBpbnQgZHIxNF9mKCk7IH0KICAgbmFtZXNwYWNlIFkgeyBleHRlcm4gIkMiIGludCBkcjE0X2YoKTsgfQpAQCAtMTk0LDEwICsyMjUsNyBAQAogICB9OwogfQogCi1uYW1lc3BhY2UgZHIxOCB7IC8vIGRyMTg6IHllcwotICB0eXBlZGVmIHZvaWQgVm9pZDsKLSAgdm9pZCBmKFZvaWQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2VtcHR5IHBhcmFtZXRlciBsaXN0IGRlZmluZWQgd2l0aCBhIHR5cGVkZWYgb2YgJ3ZvaWQnfX0KLX0KKy8vIGRyMTg6IHN1cCA1NzcKIAogbmFtZXNwYWNlIGRyMTkgeyAvLyBkcjE5OiB5ZXMKICAgc3RydWN0IEEgewpAQCAtNDY0LDIzICs0OTIsMTUgQEAKICAgdGVtcGxhdGUgdGVtcGxhdGUgc3RydWN0IEE8aW50Pjo6QjxpbnQ+OyAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIHVucXVhbGlmaWVkLWlkfX0KIH0KIAotbmFtZXNwYWNlIGRyNDcgeyAvLyBkcjQ3OiBubworbmFtZXNwYWNlIGRyNDcgeyAvLyBkcjQ3OiBzdXAgMzI5CiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBIHsKLSAgICBmcmllbmQgdm9pZCBmKCkgeyBUIHQ7IH0KKyAgICBmcmllbmQgdm9pZCBmKCkgeyBUIHQ7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZWRlZmluaXRpb259fSBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXN9fQogICB9OwogICBBPGludD4gYTsKLSAgQTxmbG9hdD4gYjsKLSNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKLSAgLy8gZXhwZWN0ZWQtZXJyb3JALTUge3tyZWRlZmluaXRpb259fSBleHBlY3RlZC1ub3RlQC01IHt7cHJldmlvdXN9fQotICAvLyBleHBlY3RlZC1ub3RlQC0zIHt7aW5zdGFudGlhdGlvbiBvZn19Ci0jZWxzZQorICBBPGZsb2F0PiBiOyAvLyBleHBlY3RlZC1ub3RlIHt7aW5zdGFudGlhdGlvbiBvZn19CisKICAgdm9pZCBmKCk7Ci0gIC8vIEZJWE1FOiBXZSBzaG91bGQgcHJvZHVjZSBzb21lIGtpbmQgb2YgZXJyb3IgaGVyZS4gQysrMTEgW3RlbXAuZnJpZW5kXXA0Ci0gIC8vIHNheXMgd2UgaW5zdGFudGlhdGUgJ2YnIHdoZW4gaXQncyBvZHItdXNlZCwgYnV0IHRoYXQgZG9lc24ndCBpbXBseSB0aGF0Ci0gIC8vIHRoaXMgaXMgdmFsaWQ7IHdlIHN0aWxsIGhhdmUgbXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgJ2YnIGV2ZW4gaWYgd2UgbmV2ZXIKLSAgLy8gaW5zdGFudGlhdGUgYW55IG9mIHRoZW0uCiAgIHZvaWQgZygpIHsgZigpOyB9Ci0jZW5kaWYKIH0KIAogbmFtZXNwYWNlIGRyNDggeyAvLyBkcjQ4OiB5ZXMKQEAgLTkxOSwxMSArOTM5LDEwIEBACiAKIG5hbWVzcGFjZSBkcjg4IHsgLy8gZHI4ODogeWVzCiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBTIHsKLSAgICBzdGF0aWMgY29uc3QgaW50IGEgPSAxOworICAgIHN0YXRpYyBjb25zdCBpbnQgYSA9IDE7IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91c319CiAgICAgc3RhdGljIGNvbnN0IGludCBiOwogICB9OwotICAvLyBGSVhNRTogVGhpcyBkaWFnbm9zdGljIGlzIHByZXR0eSBiYWQuCi0gIHRlbXBsYXRlPD4gY29uc3QgaW50IFM8aW50Pjo6YSA9IDQ7IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVkZWZpbml0aW9ufX0gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KKyAgdGVtcGxhdGU8PiBjb25zdCBpbnQgUzxpbnQ+OjphID0gNDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thbHJlYWR5IGhhcyBhbiBpbml0aWFsaXplcn19CiAgIHRlbXBsYXRlPD4gY29uc3QgaW50IFM8aW50Pjo6YiA9IDQ7CiB9CiAKQEAgLTk2Myw2ICs5ODIsMjIgQEAKICAgaW50IGsgPSBmKFUoKSk7CiB9CiAKK25hbWVzcGFjZSBkcjkyIHsgLy8gZHI5MjogeWVzCisgIHZvaWQgZigpIHRocm93KGludCwgZmxvYXQpOworICB2b2lkICgqcCkoKSB0aHJvdyhpbnQpID0gJmY7IC8vIGV4cGVjdGVkLWVycm9yIHt7dGFyZ2V0IGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGlzIG5vdCBzdXBlcnNldCBvZiBzb3VyY2V9fQorICB2b2lkICgqcSkoKSB0aHJvdyhpbnQpOworICB2b2lkICgqKnBwKSgpIHRocm93KCkgPSAmcTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgYXJlIG5vdCBhbGxvd2VkfX0KKworICB2b2lkIGcodm9pZCgpIHRocm93KCkpOworICB2b2lkIGgoKSB7CisgICAgZyhmKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpcyBub3Qgc3VwZXJzZXR9fQorICAgIGcocSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7aXMgbm90IHN1cGVyc2V0fX0KKyAgfQorCisgIHRlbXBsYXRlPHZvaWQoKSB0aHJvdygpPiBzdHJ1Y3QgWCB7fTsKKyAgWDwmZj4geHA7IC8vIG9rCit9CisKIC8vIGRyOTM6IG5hCiAKIG5hbWVzcGFjZSBkcjk0IHsgLy8gZHI5NDogeWVzCmRpZmYgLS1naXQgYS90ZXN0L0NYWC9kcnMvZHIxM3h4LmNwcCBiL3Rlc3QvQ1hYL2Rycy9kcjEzeHguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MjcyOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NYWC9kcnMvZHIxM3h4LmNwcApAQCAtMCwwICsxLDI5IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKys5OCAlcyAtdmVyaWZ5IC1mZXhjZXB0aW9ucyAtZmN4eC1leGNlcHRpb25zIC1wZWRhbnRpYy1lcnJvcnMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExICVzIC12ZXJpZnkgLWZleGNlcHRpb25zIC1mY3h4LWV4Y2VwdGlvbnMgLXBlZGFudGljLWVycm9ycworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMXkgJXMgLXZlcmlmeSAtZmV4Y2VwdGlvbnMgLWZjeHgtZXhjZXB0aW9ucyAtcGVkYW50aWMtZXJyb3JzCisKK25hbWVzcGFjZSBkcjEzNDYgeyAvLyBkcjEzNDY6IDMuNQorICBhdXRvIGEoMSk7IC8vIGV4cGVjdGVkLWVycm9yIDAtMXt7ZXh0ZW5zaW9ufX0KKyAgYXV0byBiKDEsIDIpOyAvLyBleHBlY3RlZC1lcnJvciB7e211bHRpcGxlIGV4cHJlc3Npb25zfX0gZXhwZWN0ZWQtZXJyb3IgMC0xe3tleHRlbnNpb259fQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgYXV0byBjKHt9KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twYXJlbnRoZXNpemVkIGluaXRpYWxpemVyIGxpc3R9fSBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBkZWR1Y2V9fQorICBhdXRvIGQoezF9KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twYXJlbnRoZXNpemVkIGluaXRpYWxpemVyIGxpc3R9fSBleHBlY3RlZC1lcnJvciB7ezxpbml0aWFsaXplcl9saXN0Pn19CisgIGF1dG8gZSh7MSwgMn0pOyAvLyBleHBlY3RlZC1lcnJvciB7e3BhcmVudGhlc2l6ZWQgaW5pdGlhbGl6ZXIgbGlzdH19IGV4cGVjdGVkLWVycm9yIHt7PGluaXRpYWxpemVyX2xpc3Q+fX0KKyNlbmRpZgorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLlRzPiB2b2lkIGYoVHMgLi4udHMpIHsgLy8gZXhwZWN0ZWQtZXJyb3IgMC0xe3tleHRlbnNpb259fQorICAgIGF1dG8geCh0cy4uLik7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZW1wdHl9fSBleHBlY3RlZC1lcnJvciAwLTF7e2V4dGVuc2lvbn19CisgIH0KKyAgdGVtcGxhdGUgdm9pZCBmKCk7IC8vIGV4cGVjdGVkLW5vdGUge3tpbnN0YW50aWF0aW9ufX0KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdm9pZCBpbml0X2NhcHR1cmUoKSB7CisgICAgW2EoMSldIHt9ICgpOyAvLyBleHBlY3RlZC1lcnJvciAwLTF7e2V4dGVuc2lvbn19CisgICAgW2IoMSwgMildIHt9ICgpOyAvLyBleHBlY3RlZC1lcnJvciB7e211bHRpcGxlIGV4cHJlc3Npb25zfX0gZXhwZWN0ZWQtZXJyb3IgMC0xe3tleHRlbnNpb259fQorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICBbYyh7fSldIHt9ICgpOyAvLyBleHBlY3RlZC1lcnJvciB7e3BhcmVudGhlc2l6ZWQgaW5pdGlhbGl6ZXIgbGlzdH19IGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGRlZHVjZX19IGV4cGVjdGVkLWVycm9yIDAtMXt7ZXh0ZW5zaW9ufX0KKyAgICBbZCh7MX0pXSB7fSAoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twYXJlbnRoZXNpemVkIGluaXRpYWxpemVyIGxpc3R9fSBleHBlY3RlZC1lcnJvciB7ezxpbml0aWFsaXplcl9saXN0Pn19IGV4cGVjdGVkLWVycm9yIDAtMXt7ZXh0ZW5zaW9ufX0KKyAgICBbZSh7MSwgMn0pXSB7fSAoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twYXJlbnRoZXNpemVkIGluaXRpYWxpemVyIGxpc3R9fSBleHBlY3RlZC1lcnJvciB7ezxpbml0aWFsaXplcl9saXN0Pn19IGV4cGVjdGVkLWVycm9yIDAtMXt7ZXh0ZW5zaW9ufX0KKyNlbmRpZgorICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2Rycy9kcjE0eHguY3BwIGIvdGVzdC9DWFgvZHJzL2RyMTR4eC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlMWI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ1hYL2Rycy9kcjE0eHguY3BwCkBAIC0wLDAgKzEsMTk2IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKys5OCAlcyAtdmVyaWZ5IC1mZXhjZXB0aW9ucyAtZmN4eC1leGNlcHRpb25zIC1wZWRhbnRpYy1lcnJvcnMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExICVzIC12ZXJpZnkgLWZleGNlcHRpb25zIC1mY3h4LWV4Y2VwdGlvbnMgLXBlZGFudGljLWVycm9ycworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMXkgJXMgLXZlcmlmeSAtZmV4Y2VwdGlvbnMgLWZjeHgtZXhjZXB0aW9ucyAtcGVkYW50aWMtZXJyb3JzCisKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisjZW5kaWYKKworbmFtZXNwYWNlIGRyMTQ2MCB7IC8vIGRyMTQ2MDogMy41CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICBuYW1lc3BhY2UgRFJFeGFtcGxlIHsKKyAgICB1bmlvbiBBIHsKKyAgICAgIHVuaW9uIHt9OworICAgICAgdW5pb24ge307CisgICAgICBjb25zdGV4cHIgQSgpIHt9CisgICAgfTsKKyAgICBjb25zdGV4cHIgQSBhID0gQSgpOworCisgICAgdW5pb24gQiB7CisgICAgICB1bmlvbiB7fTsKKyAgICAgIHVuaW9uIHt9OworICAgICAgY29uc3RleHByIEIoKSA9IGRlZmF1bHQ7CisgICAgfTsKKyAgICBjb25zdGV4cHIgQiBiID0gQigpOworCisgICAgdW5pb24gQyB7CisgICAgICB1bmlvbiB7fTsKKyAgICAgIHVuaW9uIHt9OworICAgIH07CisgICAgY29uc3RleHByIEMgYyA9IEMoKTsKKyNpZiBfX2NwbHVzcGx1cyA+IDIwMTEwM0wKKyAgICBjb25zdGV4cHIgdm9pZCBmKCkgeyBDIGM7IH0KKyAgICBzdGF0aWNfYXNzZXJ0KChmKCksIHRydWUpLCAiIik7CisjZW5kaWYKKyAgfQorCisgIHVuaW9uIEEge307CisgIHVuaW9uIEIgeyBpbnQgbjsgfTsgLy8gZXhwZWN0ZWQtbm90ZSAre3toZXJlfX0KKyAgdW5pb24gQyB7IGludCBuID0gMDsgfTsKKyAgc3RydWN0IEQgeyB1bmlvbiB7fTsgfTsKKyAgc3RydWN0IEUgeyB1bmlvbiB7IGludCBuOyB9OyB9OyAvLyBleHBlY3RlZC1ub3RlICt7e2hlcmV9fQorICBzdHJ1Y3QgRiB7IHVuaW9uIHsgaW50IG4gPSAwOyB9OyB9OworCisgIHN0cnVjdCBYIHsKKyAgICBmcmllbmQgY29uc3RleHByIEE6OkEoKSBub2V4Y2VwdDsKKyAgICBmcmllbmQgY29uc3RleHByIEI6OkIoKSBub2V4Y2VwdDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tmb2xsb3dzIG5vbi1jb25zdGV4cHIgZGVjbGFyYXRpb259fQorICAgIGZyaWVuZCBjb25zdGV4cHIgQzo6QygpIG5vZXhjZXB0OworICAgIGZyaWVuZCBjb25zdGV4cHIgRDo6RCgpIG5vZXhjZXB0OworICAgIGZyaWVuZCBjb25zdGV4cHIgRTo6RSgpIG5vZXhjZXB0OyAvLyBleHBlY3RlZC1lcnJvciB7e2ZvbGxvd3Mgbm9uLWNvbnN0ZXhwciBkZWNsYXJhdGlvbn19CisgICAgZnJpZW5kIGNvbnN0ZXhwciBGOjpGKCkgbm9leGNlcHQ7CisgIH07CisKKyAgLy8gVGhlc2UgYXJlIE9LLCBiZWNhdXNlIHZhbHVlLWluaXRpYWxpemF0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgaW52b2tlIHRoZQorICAvLyBjb25zdHJ1Y3Rvci4KKyAgY29uc3RleHByIEEgYSA9IEEoKTsKKyAgY29uc3RleHByIEIgYiA9IEIoKTsKKyAgY29uc3RleHByIEMgYyA9IEMoKTsKKyAgY29uc3RleHByIEQgZCA9IEQoKTsKKyAgY29uc3RleHByIEUgZSA9IEUoKTsKKyAgY29uc3RleHByIEYgZiA9IEYoKTsKKworICBuYW1lc3BhY2UgRGVmYXVsdGVkIHsKKyAgICB1bmlvbiBBIHsgY29uc3RleHByIEEoKSA9IGRlZmF1bHQ7IH07CisgICAgdW5pb24gQiB7IGludCBuOyBjb25zdGV4cHIgQigpID0gZGVmYXVsdDsgfTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tub3QgY29uc3RleHByfX0KKyAgICB1bmlvbiBDIHsgaW50IG4gPSAwOyBjb25zdGV4cHIgQygpID0gZGVmYXVsdDsgfTsKKyAgICBzdHJ1Y3QgRCB7IHVuaW9uIHt9OyBjb25zdGV4cHIgRCgpID0gZGVmYXVsdDsgfTsKKyAgICBzdHJ1Y3QgRSB7IHVuaW9uIHsgaW50IG47IH07IGNvbnN0ZXhwciBFKCkgPSBkZWZhdWx0OyB9OyAvLyBleHBlY3RlZC1lcnJvciB7e25vdCBjb25zdGV4cHJ9fQorICAgIHN0cnVjdCBGIHsgdW5pb24geyBpbnQgbiA9IDA7IH07IGNvbnN0ZXhwciBGKCkgPSBkZWZhdWx0OyB9OworCisgICAgc3RydWN0IEcgeyB1bmlvbiB7IGludCBuID0gMDsgfTsgdW5pb24geyBpbnQgbTsgfTsgY29uc3RleHByIEcoKSA9IGRlZmF1bHQ7IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7bm90IGNvbnN0ZXhwcn19CisgICAgc3RydWN0IEggeworICAgICAgdW5pb24geworICAgICAgICBpbnQgbiA9IDA7CisgICAgICB9OworICAgICAgdW5pb24geyAvLyBleHBlY3RlZC1ub3RlIDJ7e21lbWJlciBub3QgaW5pdGlhbGl6ZWR9fQorICAgICAgICBpbnQgbTsKKyAgICAgIH07CisgICAgICBjb25zdGV4cHIgSCgpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7bXVzdCBpbml0aWFsaXplIGFsbCBtZW1iZXJzfX0KKyAgICAgIGNvbnN0ZXhwciBIKGJvb2wpIDogbSgxKSB7fQorICAgICAgY29uc3RleHByIEgoY2hhcikgOiBuKDEpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7bXVzdCBpbml0aWFsaXplIGFsbCBtZW1iZXJzfX0KKyAgICAgIGNvbnN0ZXhwciBIKGRvdWJsZSkgOiBtKDEpLCBuKDEpIHt9CisgICAgfTsKKyAgfQorCisjaWYgX19jcGx1c3BsdXMgPiAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0ZXhwciBib29sIGNoZWNrKCkgeworICAgIFQgdDsgLy8gZXhwZWN0ZWQtbm90ZS1yZSAye3tub24tY29uc3RleHByIGNvbnN0cnVjdG9yICd7e1tCRV19fSd9fQorICAgIHJldHVybiB0cnVlOworICB9CisgIHN0YXRpY19hc3NlcnQoY2hlY2s8QT4oKSwgIiIpOworICBzdGF0aWNfYXNzZXJ0KGNoZWNrPEI+KCksICIiKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjb25zdGFudH19IGV4cGVjdGVkLW5vdGUge3tpbiBjYWxsfX0KKyAgc3RhdGljX2Fzc2VydChjaGVjazxDPigpLCAiIik7CisgIHN0YXRpY19hc3NlcnQoY2hlY2s8RD4oKSwgIiIpOworICBzdGF0aWNfYXNzZXJ0KGNoZWNrPEU+KCksICIiKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjb25zdGFudH19IGV4cGVjdGVkLW5vdGUge3tpbiBjYWxsfX0KKyAgc3RhdGljX2Fzc2VydChjaGVjazxGPigpLCAiIik7CisjZW5kaWYKKworICB1bmlvbiBHIHsKKyAgICBpbnQgYSA9IDA7IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91cyBpbml0aWFsaXphdGlvbiBpcyBoZXJlfX0KKyAgICBpbnQgYiA9IDA7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW5pdGlhbGl6aW5nIG11bHRpcGxlIG1lbWJlcnMgb2YgdW5pb259fQorICB9OworICB1bmlvbiBIIHsKKyAgICB1bmlvbiB7CisgICAgICBpbnQgYSA9IDA7IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91cyBpbml0aWFsaXphdGlvbiBpcyBoZXJlfX0KKyAgICB9OworICAgIHVuaW9uIHsKKyAgICAgIGludCBiID0gMDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbml0aWFsaXppbmcgbXVsdGlwbGUgbWVtYmVycyBvZiB1bmlvbn19CisgICAgfTsKKyAgfTsKKyAgc3RydWN0IEkgeworICAgIHVuaW9uIHsKKyAgICAgIGludCBhID0gMDsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzIGluaXRpYWxpemF0aW9uIGlzIGhlcmV9fQorICAgICAgaW50IGIgPSAwOyAvLyBleHBlY3RlZC1lcnJvciB7e2luaXRpYWxpemluZyBtdWx0aXBsZSBtZW1iZXJzIG9mIHVuaW9ufX0KKyAgICB9OworICB9OworICBzdHJ1Y3QgSiB7CisgICAgdW5pb24geyBpbnQgYSA9IDA7IH07CisgICAgdW5pb24geyBpbnQgYiA9IDA7IH07CisgIH07CisKKyAgbmFtZXNwYWNlIE92ZXJyaWRpbmcgeworICAgIHN0cnVjdCBBIHsKKyAgICAgIGludCBhID0gMSwgYiwgYyA9IDM7CisgICAgICBjb25zdGV4cHIgQSgpIDogYigyKSB7fQorICAgIH07CisgICAgc3RhdGljX2Fzc2VydChBKCkuYSA9PSAxICYmIEEoKS5iID09IDIgJiYgQSgpLmMgPT0gMywgIiIpOworCisgICAgdW5pb24gQiB7CisgICAgICBpbnQgYSwgYiA9IDIsIGM7CisgICAgICBjb25zdGV4cHIgQigpIDogYSgxKSB7fQorICAgICAgY29uc3RleHByIEIoY2hhcikgOiBiKDQpIHt9CisgICAgICBjb25zdGV4cHIgQihpbnQpIDogYygzKSB7fQorICAgICAgY29uc3RleHByIEIoY29uc3QgY2hhciopIHt9CisgICAgfTsKKyAgICBzdGF0aWNfYXNzZXJ0KEIoKS5hID09IDEsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEIoKS5iID09IDIsICIiKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjb25zdGFudH19IGV4cGVjdGVkLW5vdGUge3tyZWFkIG9mfX0KKyAgICBzdGF0aWNfYXNzZXJ0KEIoJ3gnKS5hID09IDAsICIiKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjb25zdGFudH19IGV4cGVjdGVkLW5vdGUge3tyZWFkIG9mfX0KKyAgICBzdGF0aWNfYXNzZXJ0KEIoJ3gnKS5iID09IDQsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEIoMTIzKS5iID09IDIsICIiKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjb25zdGFudH19IGV4cGVjdGVkLW5vdGUge3tyZWFkIG9mfX0KKyAgICBzdGF0aWNfYXNzZXJ0KEIoMTIzKS5jID09IDMsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEIoIiIpLmEgPT0gMSwgIiIpOyAvLyBleHBlY3RlZC1lcnJvciB7e2NvbnN0YW50fX0gZXhwZWN0ZWQtbm90ZSB7e3JlYWQgb2Z9fQorICAgIHN0YXRpY19hc3NlcnQoQigiIikuYiA9PSAyLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChCKCIiKS5jID09IDMsICIiKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjb25zdGFudH19IGV4cGVjdGVkLW5vdGUge3tyZWFkIG9mfX0KKworICAgIHN0cnVjdCBDIHsKKyAgICAgIHVuaW9uIHsgaW50IGEsIGIgPSAyLCBjOyB9OworICAgICAgdW5pb24geyBpbnQgZCwgZSA9IDUsIGY7IH07CisgICAgICBjb25zdGV4cHIgQygpIDogYSgxKSB7fQorICAgICAgY29uc3RleHByIEMoY2hhcikgOiBjKDMpIHt9CisgICAgICBjb25zdGV4cHIgQyhpbnQpIDogZCg0KSB7fQorICAgICAgY29uc3RleHByIEMoZmxvYXQpIDogZig2KSB7fQorICAgICAgY29uc3RleHByIEMoY29uc3QgY2hhciopIHt9CisgICAgfTsKKworICAgIHN0YXRpY19hc3NlcnQoQygpLmEgPT0gMSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoQygpLmIgPT0gMiwgIiIpOyAvLyBleHBlY3RlZC1lcnJvciB7e2NvbnN0YW50fX0gZXhwZWN0ZWQtbm90ZSB7e3JlYWQgb2Z9fQorICAgIHN0YXRpY19hc3NlcnQoQygpLmQgPT0gNCwgIiIpOyAvLyBleHBlY3RlZC1lcnJvciB7e2NvbnN0YW50fX0gZXhwZWN0ZWQtbm90ZSB7e3JlYWQgb2Z9fQorICAgIHN0YXRpY19hc3NlcnQoQygpLmUgPT0gNSwgIiIpOworCisgICAgc3RhdGljX2Fzc2VydChDKCd4JykuYiA9PSAyLCAiIik7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29uc3RhbnR9fSBleHBlY3RlZC1ub3RlIHt7cmVhZCBvZn19CisgICAgc3RhdGljX2Fzc2VydChDKCd4JykuYyA9PSAzLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChDKCd4JykuZCA9PSA0LCAiIik7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29uc3RhbnR9fSBleHBlY3RlZC1ub3RlIHt7cmVhZCBvZn19CisgICAgc3RhdGljX2Fzc2VydChDKCd4JykuZSA9PSA1LCAiIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KEMoMSkuYiA9PSAyLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChDKDEpLmMgPT0gMywgIiIpOyAvLyBleHBlY3RlZC1lcnJvciB7e2NvbnN0YW50fX0gZXhwZWN0ZWQtbm90ZSB7e3JlYWQgb2Z9fQorICAgIHN0YXRpY19hc3NlcnQoQygxKS5kID09IDQsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMoMSkuZSA9PSA1LCAiIik7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29uc3RhbnR9fSBleHBlY3RlZC1ub3RlIHt7cmVhZCBvZn19CisKKyAgICBzdGF0aWNfYXNzZXJ0KEMoMS5mKS5iID09IDIsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMoMS5mKS5jID09IDMsICIiKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjb25zdGFudH19IGV4cGVjdGVkLW5vdGUge3tyZWFkIG9mfX0KKyAgICBzdGF0aWNfYXNzZXJ0KEMoMS5mKS5lID09IDUsICIiKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjb25zdGFudH19IGV4cGVjdGVkLW5vdGUge3tyZWFkIG9mfX0KKyAgICBzdGF0aWNfYXNzZXJ0KEMoMS5mKS5mID09IDYsICIiKTsKKworICAgIHN0YXRpY19hc3NlcnQoQygiIikuYSA9PSAxLCAiIik7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29uc3RhbnR9fSBleHBlY3RlZC1ub3RlIHt7cmVhZCBvZn19CisgICAgc3RhdGljX2Fzc2VydChDKCIiKS5iID09IDIsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMoIiIpLmMgPT0gMywgIiIpOyAvLyBleHBlY3RlZC1lcnJvciB7e2NvbnN0YW50fX0gZXhwZWN0ZWQtbm90ZSB7e3JlYWQgb2Z9fQorICAgIHN0YXRpY19hc3NlcnQoQygiIikuZCA9PSA0LCAiIik7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29uc3RhbnR9fSBleHBlY3RlZC1ub3RlIHt7cmVhZCBvZn19CisgICAgc3RhdGljX2Fzc2VydChDKCIiKS5lID09IDUsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMoIiIpLmYgPT0gNiwgIiIpOyAvLyBleHBlY3RlZC1lcnJvciB7e2NvbnN0YW50fX0gZXhwZWN0ZWQtbm90ZSB7e3JlYWQgb2Z9fQorCisgICAgc3RydWN0IEQ7CisgICAgZXh0ZXJuIGNvbnN0IEQgZDsKKyAgICBzdHJ1Y3QgRCB7CisgICAgICBpbnQgYTsKKyAgICAgIHVuaW9uIHsKKyAgICAgICAgaW50IGIgPSBjb25zdF9jYXN0PEQmPihkKS5hID0gMTsgLy8gbm90IGV2YWx1YXRlZAorICAgICAgICBpbnQgYzsKKyAgICAgIH07CisgICAgICBjb25zdGV4cHIgRCgpIDogYSgwKSwgYygwKSB7fQorICAgIH07CisgICAgY29uc3RleHByIEQgZCB7fTsKKyAgICBzdGF0aWNfYXNzZXJ0KGQuYSA9PSAwLCAiIik7CisgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZHJzL2RyMTV4eC5jcHAgYi90ZXN0L0NYWC9kcnMvZHIxNXh4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjYxOGMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9DWFgvZHJzL2RyMTV4eC5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrOTggLXRyaXBsZSB4ODZfNjQtdW5rbm93bi11bmtub3duICVzIC12ZXJpZnkgLWZleGNlcHRpb25zIC1mY3h4LWV4Y2VwdGlvbnMgLXBlZGFudGljLWVycm9ycworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLXRyaXBsZSB4ODZfNjQtdW5rbm93bi11bmtub3duICVzIC12ZXJpZnkgLWZleGNlcHRpb25zIC1mY3h4LWV4Y2VwdGlvbnMgLXBlZGFudGljLWVycm9ycworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMXkgLXRyaXBsZSB4ODZfNjQtdW5rbm93bi11bmtub3duICVzIC12ZXJpZnkgLWZleGNlcHRpb25zIC1mY3h4LWV4Y2VwdGlvbnMgLXBlZGFudGljLWVycm9ycworCisvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcworCituYW1lc3BhY2UgRFIxNTUwIHsgLy8gZHIxNTUwOiB5ZXMKKyAgaW50IGYoYm9vbCBiLCBpbnQgbikgeworICAgIHJldHVybiAoYiA/ICh0aHJvdyAwKSA6IG4pICsgKGIgPyBuIDogKHRocm93IDApKTsKKyAgfQorfQorCituYW1lc3BhY2UgRFIxNTYwIHsgLy8gZHIxNTYwOiAzLjUKKyAgdm9pZCBmKGJvb2wgYiwgaW50IG4pIHsKKyAgICAoYiA/IHRocm93IDAgOiBuKSA9IChiID8gbiA6IHRocm93IDApID0gMDsKKyAgfQorICBjbGFzcyBYIHsgWChjb25zdCBYJik7IH07CisgIGNvbnN0IFggJmdldCgpOworICBjb25zdCBYICZ4ID0gdHJ1ZSA/IGdldCgpIDogdGhyb3cgMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2Rycy9kcjF4eC5jcHAgYi90ZXN0L0NYWC9kcnMvZHIxeHguY3BwCmluZGV4IDcwNDUxNDguLjZhZmY0M2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2Rycy9kcjF4eC5jcHAKKysrIGIvdGVzdC9DWFgvZHJzL2RyMXh4LmNwcApAQCAtOSw3ICs5LDcgQEAKICAgQjwiYmFyIj4gYjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkb2VzIG5vdCByZWZlciB0byBhbnkgZGVjbGFyYXRpb259fQogfQogCi1uYW1lc3BhY2UgZHIxMDEgeyAvLyBkcjEwMTogeWVzCituYW1lc3BhY2UgZHIxMDEgeyAvLyBkcjEwMTogMy41CiAgIGV4dGVybiAiQyIgdm9pZCBkcjEwMV9mKCk7CiAgIHR5cGVkZWYgdW5zaWduZWQgc2l6ZV90OwogICBuYW1lc3BhY2UgWCB7CkBAIC0xOCw2ICsxOCw4IEBACiAgIH0KICAgdXNpbmcgWDo6ZHIxMDFfZjsKICAgdXNpbmcgWDo6c2l6ZV90OworICBleHRlcm4gIkMiIHZvaWQgZHIxMDFfZigpOworICB0eXBlZGVmIHVuc2lnbmVkIHNpemVfdDsKIH0KIAogbmFtZXNwYWNlIGRyMTAyIHsgLy8gZHIxMDI6IHllcwpAQCAtMzgsMTMgKzQwLDEzIEBACiBuYW1lc3BhY2UgZHIxMDYgeyAvLyBkcjEwNjogc3VwIDU0MAogICB0eXBlZGVmIGludCAmcjE7CiAgIHR5cGVkZWYgcjEgJnIxOwotICB0eXBlZGVmIGNvbnN0IHIxIHIxOwotICB0eXBlZGVmIGNvbnN0IHIxICZyMTsKKyAgdHlwZWRlZiBjb25zdCByMSByMTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2hhcyBubyBlZmZlY3R9fQorICB0eXBlZGVmIGNvbnN0IHIxICZyMTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2hhcyBubyBlZmZlY3R9fQogCiAgIHR5cGVkZWYgY29uc3QgaW50ICZyMjsKICAgdHlwZWRlZiByMiAmcjI7Ci0gIHR5cGVkZWYgY29uc3QgcjIgcjI7Ci0gIHR5cGVkZWYgY29uc3QgcjIgJnIyOworICB0eXBlZGVmIGNvbnN0IHIyIHIyOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aGFzIG5vIGVmZmVjdH19CisgIHR5cGVkZWYgY29uc3QgcjIgJnIyOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aGFzIG5vIGVmZmVjdH19CiB9CiAKIG5hbWVzcGFjZSBkcjEwNyB7IC8vIGRyMTA3OiB5ZXMKQEAgLTY0LDcgKzY2LDcgQEAKIG5hbWVzcGFjZSBkcjEwOSB7IC8vIGRyMTA5OiB5ZXMKICAgc3RydWN0IEEgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYoVCk7IH07CiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBCIDogVCB7Ci0gICAgdXNpbmcgVDo6dGVtcGxhdGUgZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2luZyBkZWNsYXJhdGlvbiBjYW4gbm90IHJlZmVyIHRvIGEgdGVtcGxhdGV9fQorICAgIHVzaW5nIFQ6OnRlbXBsYXRlIGY7IC8vIGV4cGVjdGVkLWVycm9yIHt7dXNpbmcgZGVjbGFyYXRpb24gY2Fubm90IHJlZmVyIHRvIGEgdGVtcGxhdGV9fQogICAgIHZvaWQgZygpIHsgdGhpcy0+ZjxpbnQ+KDEyMyk7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2UgJ3RlbXBsYXRlJ319CiAgIH07CiB9CkBAIC01OTIsMTEgKzU5NCwxMiBAQAogICBzdHJ1Y3QgUyB7IGludCBuOyB9IHMgPSB7IHsgMSB9IH07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3ticmFjZXMgYXJvdW5kIHNjYWxhciBpbml0aWFsaXplcn19CiB9CiAKLW5hbWVzcGFjZSBkcjE1OSB7IC8vIGRyMTU5OiBubworLy8gZHIxNTggRklYTUUgd3JpdGUgY29kZWdlbiB0ZXN0CisKK25hbWVzcGFjZSBkcjE1OSB7IC8vIGRyMTU5OiAzLjUKICAgbmFtZXNwYWNlIFggeyB2b2lkIGYoKTsgfQogICB2b2lkIGYoKTsKLSAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGFjY2VwdGVkLgotICB2b2lkIGRyMTU5OjpmKCkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHRyYSBxdWFsaWZpY2F0aW9ufX0KKyAgdm9pZCBkcjE1OTo6ZigpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSBxdWFsaWZpY2F0aW9ufX0KICAgdm9pZCBkcjE1OTo6WDo6ZigpIHt9CiB9CiAKQEAgLTcxOSw5ICs3MjIsOSBAQAogICB9OwogICBzdHJ1Y3QgRCA6IEE8aW50PiwgQiB7CiAgICAgdXNpbmcgQTxpbnQ+OjpuOwotICAgIHVzaW5nIEI6OkM8aW50PjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2luZyBkZWNsYXJhdGlvbiBjYW4gbm90IHJlZmVyIHRvIGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb259fQotICAgIHVzaW5nIEI6OmY8aW50PjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2luZyBkZWNsYXJhdGlvbiBjYW4gbm90IHJlZmVyIHRvIGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb259fQotICAgIHVzaW5nIEI6Om48aW50PjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2luZyBkZWNsYXJhdGlvbiBjYW4gbm90IHJlZmVyIHRvIGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb259fQorICAgIHVzaW5nIEI6OkM8aW50PjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2luZyBkZWNsYXJhdGlvbiBjYW5ub3QgcmVmZXIgdG8gYSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbn19CisgICAgdXNpbmcgQjo6ZjxpbnQ+OyAvLyBleHBlY3RlZC1lcnJvciB7e3VzaW5nIGRlY2xhcmF0aW9uIGNhbm5vdCByZWZlciB0byBhIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ufX0KKyAgICB1c2luZyBCOjpuPGludD47IC8vIGV4cGVjdGVkLWVycm9yIHt7dXNpbmcgZGVjbGFyYXRpb24gY2Fubm90IHJlZmVyIHRvIGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb259fQogICB9OwogfQogCmRpZmYgLS1naXQgYS90ZXN0L0NYWC9kcnMvZHIyeHguY3BwIGIvdGVzdC9DWFgvZHJzL2RyMnh4LmNwcAppbmRleCAyYzMyYTllLi4xOWNiMTIyIDEwMDY0NAotLS0gYS90ZXN0L0NYWC9kcnMvZHIyeHguY3BwCisrKyBiL3Rlc3QvQ1hYL2Rycy9kcjJ4eC5jcHAKQEAgLTMsNyArMyw3IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxeSAlcyAtdmVyaWZ5IC1mZXhjZXB0aW9ucyAtZmN4eC1leGNlcHRpb25zIC1wZWRhbnRpYy1lcnJvcnMKIAogLy8gUFIxMzgxOSAtLSBfX1NJWkVfVFlQRV9fIGlzIGluY29tcGF0aWJsZS4KLS8vIFJFUVVJUkVTOiBMUDY0Cit0eXBlZGVmIF9fU0laRV9UWVBFX18gc2l6ZV90OyAvLyBleHBlY3RlZC1lcnJvciAwLTEge3tleHRlbnNpb259fQogCiAjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCiAjZGVmaW5lIGZvbGQoeCkgKF9fYnVpbHRpbl9jb25zdGFudF9wKHgpID8gKHgpIDogKHgpKQpAQCAtMjE2LDggKzIxNiwyMiBAQAogICB9CiB9CiAKLS8vIGRyMjIyIGlzIGEgbXlzdGVyeSAtLSBpdCBsaXN0cyBubyBjaGFuZ2VzIHRvIHRoZSBzdGFuZGFyZCwgYW5kIHlldCB3YXMKLS8vIGFwcGFyZW50bHkgYm90aCB2b3RlZCBpbnRvIHRoZSBXUCBhbmQgYWN0ZWQgdXBvbiBieSB0aGUgZWRpdG9yLgorbmFtZXNwYWNlIGRyMjIyIHsgLy8gZHIyMjI6IGR1cCA2MzcKKyAgdm9pZCBmKGludCBhLCBpbnQgYiwgaW50IGMsIGludCAqeCkgeworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyB3YXJuaW5nICItV3Vuc2VxdWVuY2VkIgorICAgIHZvaWQoKGEgKz0gYikgKz0gYyk7CisgICAgdm9pZCgoYSArPSBiKSArIChhICs9IGMpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e211bHRpcGxlIHVuc2VxdWVuY2VkIG1vZGlmaWNhdGlvbnMgdG8gJ2EnfX0KKworICAgIHhbYSsrXSA9IGE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bnNlcXVlbmNlZCBtb2RpZmljYXRpb24gYW5kIGFjY2VzcyB0byAnYSd9fQorCisgICAgYSA9IGIgPSAwOyAvLyBvaywgcmVhZCBhbmQgd3JpdGUgb2YgJ2InIGFyZSBzZXF1ZW5jZWQKKworICAgIGEgPSAoYiA9IGErKyk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdWx0aXBsZSB1bnNlcXVlbmNlZCBtb2RpZmljYXRpb25zIHRvICdhJ319CisgICAgYSA9IChiID0gKythKTsKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyAgfQorfQogCiAvLyBkcjIyMzogbmEKIApAQCAtMzYzLDYgKzM3NywxMyBAQAogICB0ZW1wbGF0ZTw+IHZvaWQgZjxpbnQ+KCkge30KIH0KIAorbmFtZXNwYWNlIGRyMjMwIHsgLy8gZHIyMzA6IHllcworICBzdHJ1Y3QgUyB7CisgICAgUygpIHsgZigpOyB9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsIHRvIHB1cmUgdmlydHVhbCBtZW1iZXIgZnVuY3Rpb259fQorICAgIHZpcnR1YWwgdm9pZCBmKCkgPSAwOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CisgIH07Cit9CisKIG5hbWVzcGFjZSBkcjIzMSB7IC8vIGRyMjMxOiB5ZXMKICAgbmFtZXNwYWNlIG91dGVyIHsKICAgICBuYW1lc3BhY2UgaW5uZXIgewpAQCAtNTUyLDIxICs1NzMsMjEgQEAKIAogICBzdHJ1Y3QgRSB7CiAgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIGludCk7Ci0gICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopID0gZGVsZXRlOyAvLyBleHBlY3RlZC1lcnJvciAwLTF7e2V4dGVuc2lvbn19IGV4cGVjdGVkLW5vdGUge3toZXJlfX0KLSAgICB2aXJ0dWFsIH5FKCk7CisgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopID0gZGVsZXRlOyAvLyBleHBlY3RlZC1lcnJvciAwLTF7e2V4dGVuc2lvbn19IGV4cGVjdGVkLW5vdGUgMS0yIHt7aGVyZX19CisgICAgdmlydHVhbCB+RSgpOyAvLyBleHBlY3RlZC1lcnJvciAwLTEge3thdHRlbXB0IHRvIHVzZSBhIGRlbGV0ZWQgZnVuY3Rpb259fQogICB9OwotICBFOjp+RSgpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7ZGVsZXRlZH19CisgIEU6On5FKCkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3thdHRlbXB0IHRvIHVzZSBhIGRlbGV0ZWQgZnVuY3Rpb259fQogCiAgIHN0cnVjdCBGIHsKICAgICAvLyBJZiBib3RoIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLCB0aGUgZmlyc3Qgb25lIGlzIGEgcGxhY2VtZW50IGRlbGV0ZS4KLSAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgX19TSVpFX1RZUEVfXyk7CisgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIHNpemVfdCk7CiAgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopID0gZGVsZXRlOyAvLyBleHBlY3RlZC1lcnJvciAwLTF7e2V4dGVuc2lvbn19IGV4cGVjdGVkLW5vdGUge3toZXJlfX0KICAgICB2aXJ0dWFsIH5GKCk7CiAgIH07Ci0gIEY6On5GKCkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tkZWxldGVkfX0KKyAgRjo6fkYoKSB7fSAvLyBleHBlY3RlZC1lcnJvciB7e2F0dGVtcHQgdG8gdXNlIGEgZGVsZXRlZCBmdW5jdGlvbn19CiAKICAgc3RydWN0IEcgewotICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBfX1NJWkVfVFlQRV9fKTsKKyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsKICAgICB2aXJ0dWFsIH5HKCk7CiAgIH07CiAgIEc6On5HKCkge30KQEAgLTY3NCw3ICs2OTUsNyBAQAogICAvLyB0cmFuc2xhdGlvbiB1bml0LgogICAvLyBXZSdyZSBhbHNvIG1pc3NpbmcgdGhlIC1XdXNlZC1idXQtbWFya2VkLXVudXNlZCBkaWFnbm9zdGljIGhlcmUuCiAgIHN0cnVjdCBBIHsKLSAgICBpbmxpbmUgdm9pZCAqb3BlcmF0b3IgbmV3KF9fU0laRV9UWVBFX18pIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOworICAgIGlubGluZSB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90KSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKICAgICBpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOwogICAgIEEoKSB7fQogICB9OwpAQCAtNzI0LDMgKzc0NSwyODggQEAKIC8vIGRyMjY2OiBuYQogLy8gZHIyNjk6IG5hCiAvLyBkcjI3MDogbmEKKworbmFtZXNwYWNlIGRyMjcyIHsgLy8gZHIyNzI6IHllcworICBzdHJ1Y3QgWCB7CisgICAgdm9pZCBmKCkgeworICAgICAgdGhpcy0+flgoKTsKKyAgICAgIFg6On5YKCk7CisgICAgICB+WCgpOyAvLyBleHBlY3RlZC1lcnJvciB7e3VuYXJ5IGV4cHJlc3Npb259fQorICAgIH0KKyAgfTsKK30KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorbmFtZXNwYWNlIGRyMjczIHsgLy8gZHIyNzM6IHllcworICBzdHJ1Y3QgQSB7CisgICAgaW50IG47CisgIH07CisgIHZvaWQgb3BlcmF0b3ImKEEpOworICB2b2lkIGYoQSBhLCAuLi4pIHsKKyAgICBvZmZzZXRvZihBLCBuKTsKKyAgICB2YV9saXN0IHZhbDsKKyAgICB2YV9zdGFydCh2YWwsIGEpOworICAgIHZhX2VuZCh2YWwpOworICB9Cit9CisKKy8vIGRyMjc0OiBuYQorCituYW1lc3BhY2UgZHIyNzUgeyAvLyBkcjI3NTogbm8KKyAgbmFtZXNwYWNlIE4geworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGYoVCkge30gLy8gZXhwZWN0ZWQtbm90ZSAxLTR7e2hlcmV9fQorICAgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGcoVCkge30gLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZX19CisgICAgdGVtcGxhdGUgPD4gdm9pZCBmKGludCk7CisgICAgdGVtcGxhdGUgPD4gdm9pZCBmKGNoYXIpOworICAgIHRlbXBsYXRlIDw+IHZvaWQgZihkb3VibGUpOworICAgIHRlbXBsYXRlIDw+IHZvaWQgZyhjaGFyKTsKKyAgfQorCisgIHVzaW5nIG5hbWVzcGFjZSBOOworCisgIG5hbWVzcGFjZSBNIHsKKyAgICB0ZW1wbGF0ZSA8PiB2b2lkIE46OmYoY2hhcikge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3snTScgZG9lcyBub3QgZW5jbG9zZSBuYW1lc3BhY2UgJ04nfX0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBnKFQpIHt9CisgICAgdGVtcGxhdGUgPD4gdm9pZCBnKGNoYXIpIHt9CisgICAgdGVtcGxhdGUgdm9pZCBmKGxvbmcpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAvLyBGSVhNRTogdGhpcyBzaG91bGQgYmUgcmVqZWN0ZWQgaW4gYysrOTggdG9vCisgICAgLy8gZXhwZWN0ZWQtZXJyb3JALTMge3ttdXN0IG9jY3VyIGluIG5hbWVzcGFjZSAnTid9fQorI2VuZGlmCisgICAgdGVtcGxhdGUgdm9pZCBOOjpmKHVuc2lnbmVkIGxvbmcpOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgICAvLyBGSVhNRTogdGhpcyBzaG91bGQgYmUgcmVqZWN0ZWQgaW4gYysrOTggdG9vCisgICAgLy8gZXhwZWN0ZWQtZXJyb3JALTMge3tub3QgaW4gYSBuYW1lc3BhY2UgZW5jbG9zaW5nICdOJ319CisjZW5kaWYKKyAgICB0ZW1wbGF0ZSB2b2lkIGgobG9uZyk7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZG9lcyBub3QgcmVmZXIgdG8gYSBmdW5jdGlvbiB0ZW1wbGF0ZX19CisgICAgdGVtcGxhdGUgPD4gdm9pZCBmKGRvdWJsZSkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBmdW5jdGlvbiB0ZW1wbGF0ZSBtYXRjaGVzfX0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGcoVCkge30gLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZX19CisKKyAgdGVtcGxhdGUgPD4gdm9pZCBOOjpmKGNoYXIpIHt9CisgIHRlbXBsYXRlIDw+IHZvaWQgZihpbnQpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gZnVuY3Rpb24gdGVtcGxhdGUgbWF0Y2hlc319CisKKyAgdGVtcGxhdGUgdm9pZCBmKHNob3J0KTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBiZSByZWplY3RlZCBpbiBjKys5OCB0b28KKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTMge3ttdXN0IG9jY3VyIGluIG5hbWVzcGFjZSAnTid9fQorI2VuZGlmCisgIHRlbXBsYXRlIHZvaWQgTjo6Zih1bnNpZ25lZCBzaG9ydCk7CisKKyAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHZhbGlkLiB0aGUgd29yZGluZyBmcm9tIHRoZSBpc3N1ZQorICAvLyBkb2Vzbid0IGNsYXJpZnkgdGhpcywgYnV0IGl0IGZvbGxvd3MgZnJvbSB0aGUgdXN1YWwgcnVsZXMuCisgIHRlbXBsYXRlIHZvaWQgZyhpbnQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FtYmlndW91c319CisKKyAgLy8gRklYTUU6IGxpa2V3aXNlLCB0aGlzIHNob3VsZCBhbHNvIGJlIHZhbGlkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYoVCkge30gLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZX19CisgIHRlbXBsYXRlIHZvaWQgZihzaG9ydCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW1iaWd1b3VzfX0KK30KKworLy8gZHIyNzY6IG5hCisKK25hbWVzcGFjZSBkcjI3NyB7IC8vIGRyMjc3OiB5ZXMKKyAgdHlwZWRlZiBpbnQgKmludHA7CisgIGludCAqcCA9IGludHAoKTsKKyAgaW50IGFbZm9sZChpbnRwKCkgPyAtMSA6IDEpXTsKK30KKworbmFtZXNwYWNlIGRyMjgwIHsgLy8gZHIyODA6IHllcworICB0eXBlZGVmIHZvaWQgZjAoKTsKKyAgdHlwZWRlZiB2b2lkIGYxKGludCk7CisgIHR5cGVkZWYgdm9pZCBmMihpbnQsIGludCk7CisgIHR5cGVkZWYgdm9pZCBmMyhpbnQsIGludCwgaW50KTsKKyAgc3RydWN0IEEgeworICAgIG9wZXJhdG9yIGYxKigpOyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19IGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGV9fQorICAgIG9wZXJhdG9yIGYyKigpOworICB9OworICBzdHJ1Y3QgQiB7CisgICAgb3BlcmF0b3IgZjAqKCk7IC8vIGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGV9fQorICBwcml2YXRlOgorICAgIG9wZXJhdG9yIGYzKigpOyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19IGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGV9fQorICB9OworICBzdHJ1Y3QgQyB7CisgICAgb3BlcmF0b3IgZjAqKCk7IC8vIGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGV9fQorICAgIG9wZXJhdG9yIGYxKigpOyAvLyBleHBlY3RlZC1ub3RlIHt7Y2FuZGlkYXRlfX0KKyAgICBvcGVyYXRvciBmMiooKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZX19CisgICAgb3BlcmF0b3IgZjMqKCk7IC8vIGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGV9fQorICB9OworICBzdHJ1Y3QgRCA6IHByaXZhdGUgQSwgQiB7IC8vIGV4cGVjdGVkLW5vdGUgMnt7aGVyZX19CisgICAgb3BlcmF0b3IgZjIqKCk7IC8vIGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGV9fQorICB9IGQ7CisgIHN0cnVjdCBFIDogQywgRCB7fSBlOworICB2b2lkIGcoKSB7CisgICAgZCgpOyAvLyBvaywgcHVibGljCisgICAgZCgwKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcml2YXRlIG1lbWJlciBvZiAnZHIyODA6OkEnfX0gZXhwZWN0ZWQtZXJyb3Ige3twcml2YXRlIGJhc2UgY2xhc3MgJ2RyMjgwOjpBJ319CisgICAgZCgwLCAwKTsgLy8gb2ssIHN1cHByZXNzZWQgYnkgbWVtYmVyIGluIEQKKyAgICBkKDAsIDAsIDApOyAvLyBleHBlY3RlZC1lcnJvciB7e3ByaXZhdGUgbWVtYmVyIG9mICdkcjI4MDo6Qid9fQorICAgIGUoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thbWJpZ3VvdXN9fQorICAgIGUoMCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW1iaWd1b3VzfX0KKyAgICBlKDAsIDApOyAvLyBleHBlY3RlZC1lcnJvciB7e2FtYmlndW91c319CisgICAgZSgwLCAwLCAwKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thbWJpZ3VvdXN9fQorICB9Cit9CisKK25hbWVzcGFjZSBkcjI4MSB7IC8vIGRyMjgxOiBubworICB2b2lkIGEoKTsKKyAgaW5saW5lIHZvaWQgYigpOworCisgIHZvaWQgZCgpOworICBpbmxpbmUgdm9pZCBlKCk7CisKKyAgc3RydWN0IFMgeworICAgIGZyaWVuZCBpbmxpbmUgdm9pZCBhKCk7IC8vIEZJWE1FOiBpbGwtZm9ybWVkCisgICAgZnJpZW5kIGlubGluZSB2b2lkIGIoKTsKKyAgICBmcmllbmQgaW5saW5lIHZvaWQgYygpOyAvLyBGSVhNRTogaWxsLWZvcm1lZAorICAgIGZyaWVuZCBpbmxpbmUgdm9pZCBkKCkge30KKyAgICBmcmllbmQgaW5saW5lIHZvaWQgZSgpIHt9CisgICAgZnJpZW5kIGlubGluZSB2b2lkIGYoKSB7fQorICB9OworfQorCituYW1lc3BhY2UgZHIyODMgeyAvLyBkcjI4MzogeWVzCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IC8vIGV4cGVjdGVkLW5vdGUgMnt7aGVyZX19CisgIHN0cnVjdCBTIHsKKyAgICBmcmllbmQgY2xhc3MgVDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tzaGFkb3dzfX0KKyAgICBjbGFzcyBUOyAvLyBleHBlY3RlZC1lcnJvciB7e3NoYWRvd3N9fQorICB9OworfQorCituYW1lc3BhY2UgZHIyODQgeyAvLyBkcjI4NDogbm8KKyAgbmFtZXNwYWNlIEEgeworICAgIHN0cnVjdCBYOworICAgIGVudW0gWSB7fTsKKyAgICBjbGFzcyBaIHt9OworICB9CisgIG5hbWVzcGFjZSBCIHsKKyAgICBzdHJ1Y3QgVzsKKyAgICB1c2luZyBBOjpYOworICAgIHVzaW5nIEE6Olk7CisgICAgdXNpbmcgQTo6WjsKKyAgfQorICBzdHJ1Y3QgQjo6ViB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBzdHJ1Y3QgbmFtZWQgJ1YnfX0KKyAgc3RydWN0IEI6Olcge307CisgIHN0cnVjdCBCOjpYIHt9OyAvLyBGSVhNRTogaWxsLWZvcm1lZAorICBlbnVtIEI6OlkgZTsgLy8gb2sgcGVyIGRyNDE3CisgIGNsYXNzIEI6OlogejsgLy8gb2sgcGVyIGRyNDE3CisKKyAgc3RydWN0IEMgeworICAgIHN0cnVjdCBYOworICAgIGVudW0gWSB7fTsKKyAgICBjbGFzcyBaIHt9OworICB9OworICBzdHJ1Y3QgRCA6IEMgeworICAgIHN0cnVjdCBXOworICAgIHVzaW5nIEM6Olg7CisgICAgdXNpbmcgQzo6WTsKKyAgICB1c2luZyBDOjpaOworICB9OworICBzdHJ1Y3QgRDo6ViB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBzdHJ1Y3QgbmFtZWQgJ1YnfX0KKyAgc3RydWN0IEQ6Olcge307CisgIHN0cnVjdCBEOjpYIHt9OyAvLyBGSVhNRTogaWxsLWZvcm1lZAorICBlbnVtIEQ6OlkgZTI7IC8vIG9rIHBlciBkcjQxNworICBjbGFzcyBEOjpaIHoyOyAvLyBvayBwZXIgZHI0MTcKK30KKworbmFtZXNwYWNlIGRyMjg1IHsgLy8gZHIyODU6IHllcworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYoVCwgaW50KTsgLy8gZXhwZWN0ZWQtbm90ZSB7e21hdGNofX0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmKGludCwgVCk7IC8vIGV4cGVjdGVkLW5vdGUge3ttYXRjaH19CisgIHRlbXBsYXRlPD4gdm9pZCBmPGludD4oaW50LCBpbnQpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7YW1iaWd1b3VzfX0KK30KKworbmFtZXNwYWNlIGRyMjg2IHsgLy8gZHIyODY6IHllcworICB0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgQSB7CisgICAgY2xhc3MgQyB7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBUMj4gc3RydWN0IEIge307IC8vIGV4cGVjdGVkLW5vdGUge3toZXJlfX0KKyAgICB9OworICB9OworCisgIHRlbXBsYXRlPGNsYXNzIFQ+CisgIHRlbXBsYXRlPGNsYXNzIFQyPgorICBzdHJ1Y3QgQTxUPjo6Qzo6QjxUMio+IHsgfTsKKworICBBPHNob3J0Pjo6Qzo6QjxpbnQqPiBhYnNpcDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcml2YXRlfX0KK30KKworLy8gZHIyODg6IG5hCisKK25hbWVzcGFjZSBkcjI4OSB7IC8vIGRyMjg5OiB5ZXMKKyAgc3RydWN0IEE7IC8vIGV4cGVjdGVkLW5vdGUge3tmb3J3YXJkfX0KKyAgc3RydWN0IEIgOiBBIHt9OyAvLyBleHBlY3RlZC1lcnJvciB7e2luY29tcGxldGV9fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBDIHsgdHlwZW5hbWUgVDo6ZXJyb3IgZXJyb3I7IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGJlIHVzZWQgcHJpb3IgdG8gJzo6J319CisgIHN0cnVjdCBEIDogQzxpbnQ+IHt9OyAvLyBleHBlY3RlZC1ub3RlIHt7aW5zdGFudGlhdGlvbn19Cit9CisKKy8vIGRyMjkwOiBuYQorLy8gZHIyOTE6IGR1cCAzOTEKKy8vIGRyMjkyIEZJWE1FOiB3cml0ZSBhIGNvZGVnZW4gdGVzdAorCituYW1lc3BhY2UgZHIyOTQgeyAvLyBkcjI5NDogbm8KKyAgdm9pZCBmKCkgdGhyb3coaW50KTsKKyAgaW50IG1haW4oKSB7CisgICAgLy8gRklYTUU6IHdlIHJlamVjdCB0aGlzIGZvciB0aGUgd3JvbmcgcmVhc29uLCBiZWNhdXNlIHdlIGRvbid0IGltcGxlbWVudAorICAgIC8vIGRyODcgeWV0LgorICAgICh2b2lkKXN0YXRpY19jYXN0PHZvaWQgKCopKCkgdGhyb3coKT4oZik7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm90IHN1cGVyc2V0fX0KKyAgICB2b2lkICgqcCkoKSB0aHJvdygpID0gZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tub3Qgc3VwZXJzZXR9fQorCisgICAgKHZvaWQpc3RhdGljX2Nhc3Q8dm9pZCAoKikoKSB0aHJvdyhpbnQpPihmKTsgLy8gRklYTUU6IGlsbC1mb3JtZWQKKyAgfQorfQorCituYW1lc3BhY2UgZHIyOTUgeyAvLyBkcjI5NTogbm8KKyAgdHlwZWRlZiBpbnQgZigpOworICAvLyBGSVhNRTogVGhpcyB3YXJuaW5nIGlzIGluY29ycmVjdC4KKyAgY29uc3QgZiBnOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5zcGVjaWZpZWQgYmVoYXZpb3J9fQorICBjb25zdCBmICZyID0gZzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Vuc3BlY2lmaWVkIGJlaGF2aW9yfX0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFggeworICAgIGNvbnN0IFQgJmY7CisgIH07CisgIFg8Zj4geCA9IHtnfTsgLy8gRklYTUU6IGV4cGVjdGVkLWVycm9yIHt7ZHJvcHMgcXVhbGlmaWVyc319Cit9CisKK25hbWVzcGFjZSBkcjI5NiB7IC8vIGRyMjk2OiB5ZXMKKyAgc3RydWN0IEEgeworICAgIHN0YXRpYyBvcGVyYXRvciBpbnQoKSB7IHJldHVybiAwOyB9IC8vIGV4cGVjdGVkLWVycm9yIHt7c3RhdGljfX0KKyAgfTsKK30KKworbmFtZXNwYWNlIGRyMjk4IHsgLy8gZHIyOTg6IHllcworICBzdHJ1Y3QgQSB7CisgICAgdHlwZWRlZiBpbnQgdHlwZTsKKyAgICBBKCk7CisgICAgfkEoKTsKKyAgfTsKKyAgdHlwZWRlZiBBIEI7IC8vIGV4cGVjdGVkLW5vdGUge3toZXJlfX0KKyAgdHlwZWRlZiBjb25zdCBBIEM7IC8vIGV4cGVjdGVkLW5vdGUge3toZXJlfX0KKworICBBOjp0eXBlIGkxOworICBCOjp0eXBlIGkyOworICBDOjp0eXBlIGkzOworCisgIHN0cnVjdCBBIGE7CisgIHN0cnVjdCBCIGI7IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVmZXJzIHRvIGEgdHlwZWRlZn19CisgIHN0cnVjdCBDIGM7IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVmZXJzIHRvIGEgdHlwZWRlZn19CisKKyAgQjo6QigpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVxdWlyZXMgYSB0eXBlIHNwZWNpZmllcn19CisgIEI6OkEoKSB7fSAvLyBvaworICBDOjp+QygpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgdGhlIGNsYXNzIG5hbWV9fQorICBDOjp+QSgpIHt9IC8vIG9rCisKKyAgdHlwZWRlZiBzdHJ1Y3QgRCBFOyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19CisgIHN0cnVjdCBFIHt9OyAvLyBleHBlY3RlZC1lcnJvciB7e2NvbmZsaWN0cyB3aXRoIHR5cGVkZWZ9fQorfQorCituYW1lc3BhY2UgZHIyOTkgeyAvLyBkcjI5OTogeWVzIGMrKzExCisgIHN0cnVjdCBTIHsKKyAgICBvcGVyYXRvciBpbnQoKTsKKyAgfTsKKyAgc3RydWN0IFQgeworICAgIG9wZXJhdG9yIGludCgpOyAvLyBleHBlY3RlZC1ub3RlIHt7fX0KKyAgICBvcGVyYXRvciB1bnNpZ25lZCBzaG9ydCgpOyAvLyBleHBlY3RlZC1ub3RlIHt7fX0KKyAgfTsKKyAgLy8gRklYTUU6IHNob3VsZCB0aGlzIGFwcGx5IHRvIGMrKzk4IG1vZGU/CisgIGludCAqcCA9IG5ldyBpbnRbUygpXTsgLy8gZXhwZWN0ZWQtZXJyb3IgMC0xe3tleHRlbnNpb259fQorICBpbnQgKnEgPSBuZXcgaW50W1QoKV07IC8vIGV4cGVjdGVkLWVycm9yIHt7YW1iaWd1b3VzfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2Rycy9kcjN4eC5jcHAgYi90ZXN0L0NYWC9kcnMvZHIzeHguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZmMyMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NYWC9kcnMvZHIzeHguY3BwCkBAIC0wLDAgKzEsMTI4NSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrOTggJXMgLXZlcmlmeSAtZmV4Y2VwdGlvbnMgLWZjeHgtZXhjZXB0aW9ucyAtcGVkYW50aWMtZXJyb3JzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAlcyAtdmVyaWZ5IC1mZXhjZXB0aW9ucyAtZmN4eC1leGNlcHRpb25zIC1wZWRhbnRpYy1lcnJvcnMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzF5ICVzIC12ZXJpZnkgLWZleGNlcHRpb25zIC1mY3h4LWV4Y2VwdGlvbnMgLXBlZGFudGljLWVycm9ycworCituYW1lc3BhY2UgZHIzMDAgeyAvLyBkcjMwMDogeWVzCisgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEE+IHZvaWQgZihSICgmKShBKSkge30KKyAgaW50IGcoaW50KTsKKyAgdm9pZCBoKCkgeyBmKGcpOyB9Cit9CisKK25hbWVzcGFjZSBkcjMwMSB7IC8vIGRyMzAxOiB5ZXMKKyAgLy8gc2VlIGFsc28gZHIzOAorICBzdHJ1Y3QgUzsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBvcGVyYXRvcisoVCwgVCk7CisgIHZvaWQgb3BlcmF0b3ItKFMsIFMpOworCisgIHZvaWQgZigpIHsKKyAgICBib29sIGEgPSAodm9pZCgqKShTLCBTKSlvcGVyYXRvcis8Uz4gPAorICAgICAgICAgICAgICh2b2lkKCopKFMsIFMpKW9wZXJhdG9yKzxTPjsKKyAgICBib29sIGIgPSAodm9pZCgqKShTLCBTKSlvcGVyYXRvci0gPAorICAgICAgICAgICAgICh2b2lkKCopKFMsIFMpKW9wZXJhdG9yLTsKKyAgICBib29sIGMgPSAodm9pZCgqKShTLCBTKSlvcGVyYXRvcisgPAorICAgICAgICAgICAgICh2b2lkKCopKFMsIFMpKW9wZXJhdG9yLTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnPid9fQorICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmKCkgeworICAgIHR5cGVuYW1lIFQ6OnRlbXBsYXRlIG9wZXJhdG9yKzxpbnQ+IGE7IC8vIGV4cGVjdGVkLWVycm9yIHt7dHlwZW5hbWUgc3BlY2lmaWVyIHJlZmVycyB0byBhIG5vbi10eXBlIHRlbXBsYXRlfX0gZXhwZWN0ZWQtZXJyb3IgK3t7fX0KKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGRuJ3Qgc2F5IChudWxsKS4KKyAgICBjbGFzcyBUOjp0ZW1wbGF0ZSBvcGVyYXRvcis8aW50PiBiOyAvLyBleHBlY3RlZC1lcnJvciB7e2lkZW50aWZpZXIgZm9sbG93ZWQgYnkgJzwnIGluZGljYXRlcyBhIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGJ1dCAobnVsbCkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gdGVtcGxhdGV9fQorICAgIGVudW0gVDo6dGVtcGxhdGUgb3BlcmF0b3IrPGludD4gYzsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBpZGVudGlmaWVyfX0gZXhwZWN0ZWQtZXJyb3Ige3tkb2VzIG5vdCBkZWNsYXJlIGFueXRoaW5nfX0KKyAgICBlbnVtIFQ6OnRlbXBsYXRlIG9wZXJhdG9yKzxpbnQ+OjpFIGQ7IC8vIGV4cGVjdGVkLWVycm9yIHt7cXVhbGlmaWVkIG5hbWUgcmVmZXJzIGludG8gYSBzcGVjaWFsaXphdGlvbiBvZiBmdW5jdGlvbiB0ZW1wbGF0ZSAnVDo6dGVtcGxhdGUgb3BlcmF0b3IgKyd9fSBleHBlY3RlZC1lcnJvciB7e2ZvcndhcmQgcmVmZXJlbmNlfX0KKyAgICBlbnVtIFQ6OnRlbXBsYXRlIFg8aW50Pjo6RSBlOworICAgIFQ6OnRlbXBsYXRlIG9wZXJhdG9yKzxpbnQ+Ojpmb29iYXIoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3txdWFsaWZpZWQgbmFtZSByZWZlcnMgaW50byBhIHNwZWNpYWxpemF0aW9uIG9mIGZ1bmN0aW9uIHRlbXBsYXRlICdUOjp0ZW1wbGF0ZSBvcGVyYXRvciArJ319CisgICAgVDo6dGVtcGxhdGUgb3BlcmF0b3IrPGludD4oMCk7IC8vIG9rCisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBvcGVyYXRvciY8VCo+IHt9OyAvLyBleHBlY3RlZC1lcnJvciAre3t9fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUOjpvcGVyYXRvciYge307IC8vIGV4cGVjdGVkLWVycm9yICt7e319CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFM6Om9wZXJhdG9yJjxUKj4ge307IC8vIGV4cGVjdGVkLWVycm9yICt7e319Cit9CisKK25hbWVzcGFjZSBkcjMwMiB7IC8vIGRyMzAyOiB5ZXMKKyAgc3RydWN0IEEgeyBBKCk7IH5BKCk7IH07CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIHN0cnVjdCBCIHsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciAnZHIzMDI6OkInIG11c3QgZXhwbGljaXRseSBpbml0aWFsaXplIHRoZSBjb25zdCBtZW1iZXIgJ24nfX0KKyAgICBjb25zdCBpbnQgbjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorICAgIEEgYTsKKyAgfSBiID0gQigpOyAvLyBleHBlY3RlZC1ub3RlIHt7Zmlyc3QgcmVxdWlyZWQgaGVyZX19CisgIC8vIFRyaXZpYWwgZGVmYXVsdCBjb25zdHJ1Y3RvciBDOjpDKCkgaXMgbm90IGNhbGxlZCBoZXJlLgorICBzdHJ1Y3QgQyB7CisgICAgY29uc3QgaW50IG47CisgIH0gYyA9IEMoKTsKKyNlbHNlCisgIHN0cnVjdCBCIHsKKyAgICBjb25zdCBpbnQgbjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlbGV0ZWQgYmVjYXVzZSBmaWVsZCAnbicgb2YgY29uc3QtcXVhbGlmaWVkIHR5cGUgJ2NvbnN0IGludCcgd291bGQgbm90IGJlIGluaXRpYWxpemVkfX0KKyAgICBBIGE7CisgIH0gYiA9IEIoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYWxsIHRvIGltcGxpY2l0bHktZGVsZXRlZCBkZWZhdWx0IGNvbnN0cnVjdG9yfX0KKyAgLy8gQzo6QygpIGlzIGNhbGxlZCBoZXJlLCBiZWNhdXNlIGV2ZW4gdGhvdWdoIGl0J3MgdHJpdmlhbCwgaXQncyBkZWxldGVkLgorICBzdHJ1Y3QgQyB7CisgICAgY29uc3QgaW50IG47IC8vIGV4cGVjdGVkLW5vdGUge3tkZWxldGVkIGJlY2F1c2UgZmllbGQgJ24nIG9mIGNvbnN0LXF1YWxpZmllZCB0eXBlICdjb25zdCBpbnQnIHdvdWxkIG5vdCBiZSBpbml0aWFsaXplZH19CisgIH0gYyA9IEMoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYWxsIHRvIGltcGxpY2l0bHktZGVsZXRlZCBkZWZhdWx0IGNvbnN0cnVjdG9yfX0KKyAgc3RydWN0IEQgeworICAgIGNvbnN0IGludCBuID0gMDsKKyAgfSBkID0gRCgpOworI2VuZGlmCit9CisKKy8vIGRyMzAzOiBuYQorCituYW1lc3BhY2UgZHIzMDQgeyAvLyBkcjMwNDogeWVzCisgIHR5cGVkZWYgaW50ICZhOworICBpbnQgbiA9IGEoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZXF1aXJlcyBhbiBpbml0aWFsaXplcn19CisKKyAgc3RydWN0IFMgeyBpbnQgJmI7IH07CisgIGludCBtID0gUygpLmI7CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIC8vIGV4cGVjdGVkLWVycm9yQC0zIHt7cmVxdWlyZXMgYW4gaW5pdGlhbGl6ZXJ9fQorICAvLyBleHBlY3RlZC1ub3RlQC0zIHt7aW4gdmFsdWUtaW5pdGlhbGl6YXRpb259fQorI2Vsc2UKKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTUge3tkZWxldGVkfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtNyB7e3JlZmVyZW5jZX19CisjZW5kaWYKK30KKworbmFtZXNwYWNlIGRyMzA1IHsgLy8gZHIzMDU6IG5vCisgIHN0cnVjdCBBIHsKKyAgICB0eXBlZGVmIEEgQzsKKyAgfTsKKyAgdm9pZCBmKEEgKmEpIHsKKyAgICBzdHJ1Y3QgQSB7fTsKKyAgICBhLT5+QSgpOworICAgIGEtPn5DKCk7CisgIH0KKyAgdHlwZWRlZiBBIEI7CisgIHZvaWQgZyhCICpiKSB7CisgICAgYi0+fkIoKTsKKyAgICBiLT5+QygpOworICB9CisgIHZvaWQgaChCICpiKSB7CisgICAgc3RydWN0IEIge307IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KKyAgICBiLT5+QigpOyAvLyBleHBlY3RlZC1lcnJvciB7e2RvZXMgbm90IG1hdGNofX0KKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBYIHt9OworICB2b2lkIGkoWDxpbnQ+KiB4KSB7CisgICAgc3RydWN0IFgge307CisgICAgeC0+flg8aW50PigpOworICAgIHgtPn5YKCk7CisgICAgeC0+flg8Y2hhcj4oKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtZW1iZXIgbmFtZWR9fQorICB9CisKKyAgLy8gRklYTUU6IFRoaXMgYXBwZWFycyB0byBiZSB2YWxpZCAoYnV0IGFsbG93aW5nIHRoZSBuZXN0ZWQgdHlwZXMgbWlnaHQgYmUgYQorICAvLyBkZWZlY3QpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IE5lc3RlZCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBOZXN0ZWQge307CisgIH07CisgIHZvaWQgdGVzdE5lc3RlZChOZXN0ZWQ8aW50PiBuKSB7IG4ufk5lc3RlZDxpbnQ+KCk7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtZW1iZXIgbmFtZWR9fQorI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAvLyBleHBlY3RlZC1lcnJvckAtMiB7e2FtYmlndW91c319CisgIC8vIGV4cGVjdGVkLW5vdGVALTYge3toZXJlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtNiB7e2hlcmV9fQorI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHN0cnVjdCBZIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB1c2luZyBUMSA9IFk7CisgIH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHVzaW5nIFQyID0gWTsKKyAgdm9pZCBqKFkgKnkpIHsKKyAgICB5LT5+VDE8aW50PigpOworICAgIHktPn5UMjxpbnQ+KCk7CisgIH0KKyAgc3RydWN0IFogeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHVzaW5nIFQyID0gVDsKKyAgfTsKKyAgdm9pZCBrKFogKnopIHsKKyAgICAvLyBGSVhNRTogVGhpcyBkaWFnbm9zdGljIGlzIHRlcnJpYmxlLgorICAgIHotPn5UMTxpbnQ+KCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J1QxJyBmb2xsb3dpbmcgdGhlICd0ZW1wbGF0ZScga2V5d29yZCBkb2VzIG5vdCByZWZlciB0byBhIHRlbXBsYXRlfX0gZXhwZWN0ZWQtZXJyb3IgK3t7fX0KKyAgICB6LT5+VDI8aW50PigpOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1lbWJlciBuYW1lZCAnfmludCd9fQorICAgIHotPn5UMjxaPigpOworICB9CisKKyAgLy8gRklYTUU6IFRoaXMgaXMgdmFsaWQuCisgIG5hbWVzcGFjZSBRIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBPiBzdHJ1Y3QgUiB7fTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBPiB1c2luZyBSID0gUTo6UjxpbnQ+OworICB2b2lkIHFyKFE6OlI8aW50PiB4KSB7IHguflI8Y2hhcj4oKTsgfSAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1lbWJlciBuYW1lZH19CisjZW5kaWYKK30KKworbmFtZXNwYWNlIGRyMzA2IHsgLy8gZHIzMDY6IG5vCisgIC8vIEZJWE1FOiBkdXAgMzkKKyAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGFjY2VwdGVkLgorICBzdHJ1Y3QgQSB7IHN0cnVjdCBCIHt9OyB9OyAvLyBleHBlY3RlZC1ub3RlIDJ7e21lbWJlcn19CisgIHN0cnVjdCBDIHsgdHlwZWRlZiBBOjpCIEI7IH07IC8vIGV4cGVjdGVkLW5vdGUge3ttZW1iZXJ9fQorICBzdHJ1Y3QgRCA6IEEsIEE6OkIsIEMge307CisgIEQ6OkIgYjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tmb3VuZCBpbiBtdWx0aXBsZSBiYXNlIGNsYXNzZXMgb2YgZGlmZmVyZW50IHR5cGVzfX0KK30KKworLy8gZHIzMDc6IG5hCisKK25hbWVzcGFjZSBkcjMwOCB7IC8vIGRyMzA4OiB5ZXMKKyAgLy8gVGhpcyBpcyBtb3N0bHkgYW4gQUJJIGxpYnJhcnkgaXNzdWUuCisgIHN0cnVjdCBBIHt9OworICBzdHJ1Y3QgQiA6IEEge307CisgIHN0cnVjdCBDIDogQSB7fTsKKyAgc3RydWN0IEQgOiBCLCBDIHt9OworICB2b2lkIGYoKSB7CisgICAgdHJ5IHsKKyAgICAgIHRocm93IEQoKTsKKyAgICB9IGNhdGNoIChjb25zdCBBJikgeworICAgICAgLy8gdW5yZWFjaGFibGUKKyAgICB9IGNhdGNoIChjb25zdCBCJikgeworICAgICAgLy8gZ2V0IGhlcmUgaW5zdGVhZAorICAgIH0KKyAgfQorfQorCisvLyBkcjMwOTogZHVwIDQ4NQorCituYW1lc3BhY2UgZHIzMTEgeyAvLyBkcjMxMTogeWVzCisgIG5hbWVzcGFjZSBYIHsgbmFtZXNwYWNlIFkge30gfQorICBuYW1lc3BhY2UgWDo6WSB7fSAvLyBleHBlY3RlZC1lcnJvciB7e211c3QgZGVmaW5lIGVhY2ggbmFtZXNwYWNlIHNlcGFyYXRlbHl9fQorICBuYW1lc3BhY2UgWCB7CisgICAgbmFtZXNwYWNlIFg6Olkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3ttdXN0IGRlZmluZSBlYWNoIG5hbWVzcGFjZSBzZXBhcmF0ZWx5fX0KKyAgfQorICAvLyBGSVhNRTogVGhlIGRpYWdub3N0aWNzIGhlcmUgYXJlIG5vdCB2ZXJ5IGdvb2QuCisgIG5hbWVzcGFjZSA6OmRyMzExOjpYIHt9IC8vIGV4cGVjdGVkLWVycm9yIDIre3t9fSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgcXVhbH19Cit9CisKKy8vIGRyMzEyOiBkdXAgNjE2CisKK25hbWVzcGFjZSBkcjMxMyB7IC8vIGRyMzEzOiBkdXAgMjk5IGMrKzExCisgIHN0cnVjdCBBIHsgb3BlcmF0b3IgaW50KCkgY29uc3Q7IH07CisgIGludCAqcCA9IG5ldyBpbnRbQSgpXTsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gRklYTUU6IHNob3VsZCB0aGlzIGJlIGF2YWlsYWJsZSBpbiBjKys5OCBtb2RlPyBleHBlY3RlZC1lcnJvckAtMiB7e2V4dGVuc2lvbn19CisjZW5kaWYKK30KKworbmFtZXNwYWNlIGRyMzE0IHsgLy8gZHIzMTQ6IGR1cCAxNzEwCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzdHJ1Y3QgQiB7fTsKKyAgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEMgOiBwdWJsaWMgQTxUPjo6dGVtcGxhdGUgQjxUPiB7CisgICAgQygpIDogQTxUPjo6dGVtcGxhdGUgQjxUPigpIHt9CisgIH07Cit9CisKKy8vIGRyMzE1OiBuYQorLy8gZHIzMTY6IHN1cCAxMDA0CisKK25hbWVzcGFjZSBkcjMxNyB7IC8vIGRyMzE3OiAzLjUKKyAgdm9pZCBmKCkge30gLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KKyAgaW5saW5lIHZvaWQgZigpOyAvLyBleHBlY3RlZC1lcnJvciB7e2lubGluZSBkZWNsYXJhdGlvbiBvZiAnZicgZm9sbG93cyBub24taW5saW5lIGRlZmluaXRpb259fQorCisgIGludCBnKCk7CisgIGludCBuID0gZygpOworICBpbmxpbmUgaW50IGcoKSB7IHJldHVybiAwOyB9CisKKyAgaW50IGgoKTsKKyAgaW50IG0gPSBoKCk7CisgIGludCBoKCkgeyByZXR1cm4gMDsgfSAvLyBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXN9fQorICBpbmxpbmUgaW50IGgoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbmxpbmUgZGVjbGFyYXRpb24gb2YgJ2gnIGZvbGxvd3Mgbm9uLWlubGluZSBkZWZpbml0aW9ufX0KK30KKworbmFtZXNwYWNlIGRyMzE4IHsgLy8gZHIzMTg6IHN1cCAxMzEwCisgIHN0cnVjdCBBIHt9OworICBzdHJ1Y3QgQTo6QSBhOworfQorCituYW1lc3BhY2UgZHIzMTkgeyAvLyBkcjMxOTogbm8KKyAgLy8gRklYTUU6IGR1cCBkcjM4OQorICAvLyBGSVhNRTogV2UgZG9uJ3QgaGF2ZSBhIGRpYWdub3N0aWMgZm9yIGEgbmFtZSB3aXRoIGxpbmthZ2UKKyAgLy8gICAgICAgIGhhdmluZyBhIHR5cGUgd2l0aG91dCBsaW5rYWdlLgorICB0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGk7CisgIH0gKnBzOworICBleHRlcm4gIkMiIHZvaWQgZihwcyk7CisgIHZvaWQgZyhwcyk7IC8vIEZJWE1FOiBpbGwtZm9ybWVkLCB0eXBlICdwcycgaGFzIG5vIGxpbmthZ2UKKworICBzdGF0aWMgZW51bSB7IGUgfSBhMTsKKyAgZW51bSB7IGUyIH0gYTI7IC8vIEZJWE1FOiBpbGwtZm9ybWVkLCBlbnVtIHR5cGUgaGFzIG5vIGxpbmthZ2UKKworICBlbnVtIHsgbjEgPSAxdSB9OworICB0eXBlZGVmIGludCAoKnBhKVtuMV07CisgIHBhIHBhcnI7IC8vIG9rLCB0eXBlIGhhcyBsaW5rYWdlIGRlc3BpdGUgdXNpbmcgJ24xJworCisgIHRlbXBsYXRlPHR5cGVuYW1lPiBzdHJ1Y3QgWCB7fTsKKworICB2b2lkIGYoKSB7CisgICAgc3RydWN0IEEgeyBpbnQgbjsgfTsKKyAgICBleHRlcm4gQSBhOyAvLyBGSVhNRTogaWxsLWZvcm1lZAorICAgIFg8QT4geGE7CisKKyAgICB0eXBlZGVmIEEgQjsKKyAgICBleHRlcm4gQiBiOyAvLyBGSVhNRTogaWxsLWZvcm1lZAorICAgIFg8Qj4geGI7CisKKyAgICBjb25zdCBpbnQgbiA9IDE7CisgICAgdHlwZWRlZiBpbnQgKCpDKVtuXTsKKyAgICBleHRlcm4gQyBjOyAvLyBvaworICAgIFg8Qz4geGM7CisgIH0KKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTEyIHt7dXNlcyBsb2NhbCB0eXBlICdBJ319CisgIC8vIGV4cGVjdGVkLWVycm9yQC05IHt7dXNlcyBsb2NhbCB0eXBlICdBJ319CisjZW5kaWYKK30KKworbmFtZXNwYWNlIGRyMzIwIHsgLy8gZHIzMjA6IHllcworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgc3RydWN0IFggeworICAgIGNvbnN0ZXhwciBYKCkge30KKyAgICBjb25zdGV4cHIgWChjb25zdCBYICZ4KSA6IGNvcGllcyh4LmNvcGllcyArIDEpIHt9CisgICAgdW5zaWduZWQgY29waWVzID0gMDsKKyAgfTsKKyAgY29uc3RleHByIFggZihYIHgpIHsgcmV0dXJuIHg7IH0KKyAgY29uc3RleHByIHVuc2lnbmVkIGcoWCB4KSB7IHJldHVybiB4LmNvcGllczsgfQorICBzdGF0aWNfYXNzZXJ0KGYoWCgpKS5jb3BpZXMgPT0gZyhYKCkpICsgMSwgImV4cGVjdGVkIG9uZSBleHRyYSBjb3B5IGZvciByZXR1cm4gdmFsdWUiKTsKKyNlbmRpZgorfQorCituYW1lc3BhY2UgZHIzMjEgeyAvLyBkcjMyMTogZHVwIDU1NworICBuYW1lc3BhY2UgTiB7CisgICAgdGVtcGxhdGU8aW50PiBzdHJ1Y3QgQSB7CisgICAgICB0ZW1wbGF0ZTxpbnQ+IHN0cnVjdCBCOworICAgIH07CisgICAgdGVtcGxhdGU8PiB0ZW1wbGF0ZTw+IHN0cnVjdCBBPDA+OjpCPDA+OworICAgIHZvaWQgZihBPDA+OjpCPDA+KTsKKyAgfQorICB0ZW1wbGF0ZTw+IHRlbXBsYXRlPD4gc3RydWN0IE46OkE8MD46OkI8MD4ge307CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBnKFQgdCkgeyBmKHQpOyB9CisgIHRlbXBsYXRlIHZvaWQgZyhOOjpBPDA+OjpCPDA+KTsKKworICBuYW1lc3BhY2UgTiB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBJIHsgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJJiwgY29uc3QgSSYpOyB9OworICB9CisgIE46Okk8aW50PiBpLCBqOworICBib29sIHggPSBpID09IGo7Cit9CisKK25hbWVzcGFjZSBkcjMyMiB7IC8vIGRyMzIyOiB5ZXMKKyAgc3RydWN0IEEgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IG9wZXJhdG9yIFQmKCk7CisgIH0gYTsKKyAgaW50ICZyID0gc3RhdGljX2Nhc3Q8aW50Jj4oYSk7CisgIGludCAmcyA9IGE7Cit9CisKKy8vIGRyMzIzOiBubworCituYW1lc3BhY2UgZHIzMjQgeyAvLyBkcjMyNDogeWVzCisgIHN0cnVjdCBTIHsgaW50IG4gOiAxOyB9IHM7IC8vIGV4cGVjdGVkLW5vdGUgM3t7Yml0LWZpZWxkIGlzIGRlY2xhcmVkIGhlcmV9fQorICBpbnQgJmEgPSBzLm47IC8vIGV4cGVjdGVkLWVycm9yIHt7bm9uLWNvbnN0IHJlZmVyZW5jZSBjYW5ub3QgYmluZCB0byBiaXQtZmllbGR9fQorICBpbnQgKmIgPSAmcy5uOyAvLyBleHBlY3RlZC1lcnJvciB7e2FkZHJlc3Mgb2YgYml0LWZpZWxkfX0KKyAgaW50ICZjID0gKHMubiA9IDApOyAvLyBleHBlY3RlZC1lcnJvciB7e25vbi1jb25zdCByZWZlcmVuY2UgY2Fubm90IGJpbmQgdG8gYml0LWZpZWxkfX0KKyAgaW50ICpkID0gJihzLm4gPSAwKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thZGRyZXNzIG9mIGJpdC1maWVsZH19CisgIGludCAmZSA9IHRydWUgPyBzLm4gOiBzLm47IC8vIGV4cGVjdGVkLWVycm9yIHt7bm9uLWNvbnN0IHJlZmVyZW5jZSBjYW5ub3QgYmluZCB0byBiaXQtZmllbGR9fQorICBpbnQgKmYgPSAmKHRydWUgPyBzLm4gOiBzLm4pOyAvLyBleHBlY3RlZC1lcnJvciB7e2FkZHJlc3Mgb2YgYml0LWZpZWxkfX0KKyAgaW50ICZnID0gKHZvaWQoKSwgcy5uKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tub24tY29uc3QgcmVmZXJlbmNlIGNhbm5vdCBiaW5kIHRvIGJpdC1maWVsZH19CisgIGludCAqaCA9ICYodm9pZCgpLCBzLm4pOyAvLyBleHBlY3RlZC1lcnJvciB7e2FkZHJlc3Mgb2YgYml0LWZpZWxkfX0KK30KKworbmFtZXNwYWNlIGRyMzI2IHsgLy8gZHIzMjY6IHllcworICBzdHJ1Y3QgUyB7fTsKKyAgaW50IHRlc3RbX19pc190cml2aWFsbHlfY29uc3RydWN0aWJsZShTLCBjb25zdCBTJikgPyAxIDogLTFdOworfQorCituYW1lc3BhY2UgZHIzMjcgeyAvLyBkcjMyNzogZHVwIDUzOAorICBzdHJ1Y3QgQTsKKyAgY2xhc3MgQSB7fTsKKworICBjbGFzcyBCOworICBzdHJ1Y3QgQiB7fTsKK30KKworbmFtZXNwYWNlIGRyMzI4IHsgLy8gZHIzMjg6IHllcworICBzdHJ1Y3QgQTsgLy8gZXhwZWN0ZWQtbm90ZSAze3tmb3J3YXJkIGRlY2xhcmF0aW9ufX0KKyAgc3RydWN0IEIgeyBBIGE7IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7aW5jb21wbGV0ZX19CisgIHRlbXBsYXRlPHR5cGVuYW1lPiBzdHJ1Y3QgQyB7IEEgYTsgfTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbmNvbXBsZXRlfX0KKyAgQSAqcCA9IG5ldyBBWzBdOyAvLyBleHBlY3RlZC1lcnJvciB7e2luY29tcGxldGV9fQorfQorCituYW1lc3BhY2UgZHIzMjkgeyAvLyBkcjMyOTogMy41CisgIHN0cnVjdCBCIHt9OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQSA6IEIgeworICAgIGZyaWVuZCB2b2lkIGYoQSBhKSB7IGcoYSk7IH0KKyAgICBmcmllbmQgdm9pZCBoKEEgYSkgeyBnKGEpOyB9IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5kZWNsYXJlZH19CisgICAgZnJpZW5kIHZvaWQgaShCIGIpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVkZWZpbml0aW9ufX0gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KKyAgfTsKKyAgQTxpbnQ+IGE7CisgIEE8Y2hhcj4gYjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2luc3RhbnRpYXRpb259fQorCisgIHZvaWQgdGVzdCgpIHsKKyAgICBoKGEpOyAvLyBleHBlY3RlZC1ub3RlIHt7aW5zdGFudGlhdGlvbn19CisgIH0KK30KKworbmFtZXNwYWNlIGRyMzMxIHsgLy8gZHIzMzE6IHllcworICBzdHJ1Y3QgQSB7CisgICAgQSh2b2xhdGlsZSBBJik7IC8vIGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGV9fQorICB9IGNvbnN0IGEsIGIoYSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWF0Y2hpbmcgY29uc3RydWN0b3J9fQorfQorCituYW1lc3BhY2UgZHIzMzIgeyAvLyBkcjMzMjogZHVwIDU1NworICB2b2lkIGYodm9sYXRpbGUgdm9pZCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J3ZvaWQnIGFzIHBhcmFtZXRlciBtdXN0IG5vdCBoYXZlIHR5cGUgcXVhbGlmaWVyc319CisgIHZvaWQgZyhjb25zdCB2b2lkKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3sndm9pZCcgYXMgcGFyYW1ldGVyIG11c3Qgbm90IGhhdmUgdHlwZSBxdWFsaWZpZXJzfX0KKyAgdm9pZCBoKGludCBuLCB2b2xhdGlsZSB2b2lkKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3sndm9pZCcgbXVzdCBiZSB0aGUgZmlyc3QgYW5kIG9ubHkgcGFyYW1ldGVyfX0KK30KKworbmFtZXNwYWNlIGRyMzMzIHsgLy8gZHIzMzM6IHllcworICBpbnQgbiA9IDA7CisgIGludCBmKGludChuKSk7CisgIGludCBnKChpbnQobikpKTsKKyAgaW50IGggPSBmKGcpOworfQorCituYW1lc3BhY2UgZHIzMzQgeyAvLyBkcjMzNDogeWVzCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZigpIHsKKyAgICBUIHg7CisgICAgZigoeCwgMTIzKSk7CisgIH0KKyAgc3RydWN0IFMgeworICAgIGZyaWVuZCBTIG9wZXJhdG9yLChTLCBpbnQpOworICAgIGZyaWVuZCB2b2lkIGYoUyk7CisgIH07CisgIHRlbXBsYXRlIHZvaWQgZjxTPigpOworfQorCisvLyBkcjMzNTogbm8KKworbmFtZXNwYWNlIGRyMzM2IHsgLy8gZHIzMzY6IHllcworICBuYW1lc3BhY2UgUHJlIHsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUMT4gY2xhc3MgQSB7CisgICAgICB0ZW1wbGF0ZTxjbGFzcyBUMj4gY2xhc3MgQiB7CisgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQzPiB2b2lkIG1mMShUMyk7CisgICAgICAgIHZvaWQgbWYyKCk7CisgICAgICB9OworICAgIH07CisgICAgdGVtcGxhdGU8PiB0ZW1wbGF0ZTxjbGFzcyBYPiBjbGFzcyBBPGludD46OkIge307CisgICAgdGVtcGxhdGU8PiB0ZW1wbGF0ZTw+IHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgQTxpbnQ+OjpCPGRvdWJsZT46Om1mMShUIHQpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7ZG9lcyBub3QgbWF0Y2h9fQorICAgIHRlbXBsYXRlPGNsYXNzIFk+IHRlbXBsYXRlPD4gdm9pZCBBPFk+OjpCPGRvdWJsZT46Om1mMigpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7ZG9lcyBub3QgcmVmZXIgaW50byBhIGNsYXNzfX0KKyAgfQorICBuYW1lc3BhY2UgUG9zdCB7CisgICAgdGVtcGxhdGU8Y2xhc3MgVDE+IGNsYXNzIEEgeworICAgICAgdGVtcGxhdGU8Y2xhc3MgVDI+IGNsYXNzIEIgeworICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUMz4gdm9pZCBtZjEoVDMpOworICAgICAgICB2b2lkIG1mMigpOworICAgICAgfTsKKyAgICB9OworICAgIHRlbXBsYXRlPD4gdGVtcGxhdGU8Y2xhc3MgWD4gY2xhc3MgQTxpbnQ+OjpCIHsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgbWYxKFQpOworICAgIH07CisgICAgdGVtcGxhdGU8PiB0ZW1wbGF0ZTw+IHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgQTxpbnQ+OjpCPGRvdWJsZT46Om1mMShUIHQpIHt9CisgICAgLy8gRklYTUU6IFRoaXMgZGlhZ25vc3RpYyBpc24ndCB2ZXJ5IGdvb2QuCisgICAgdGVtcGxhdGU8Y2xhc3MgWT4gdGVtcGxhdGU8PiB2b2lkIEE8WT46OkI8ZG91YmxlPjo6bWYyKCkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tkb2VzIG5vdCByZWZlciBpbnRvIGEgY2xhc3N9fQorICB9Cit9CisKK25hbWVzcGFjZSBkcjMzNyB7IC8vIGRyMzM3OiB5ZXMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmKFQgKCopWzFdKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50ICZmKC4uLik7CisKKyAgc3RydWN0IEEgeyB2aXJ0dWFsIH5BKCkgPSAwOyB9OworICBpbnQgJnIgPSBmPEE+KDApOworCisgIC8vIEZJWE1FOiBUaGUgbGFuZ3VhZ2UgcnVsZXMgaGVyZSBhcmUgY29tcGxldGVseSBicm9rZW4uIFdlIGNhbm5vdCBkZXRlcm1pbmUKKyAgLy8gd2hldGhlciBhbiBpbmNvbXBsZXRlIHR5cGUgaXMgYWJzdHJhY3QuIFNlZSBEUjE2NDAsIHdoaWNoIHdpbGwgcHJvYmFibHkKKyAgLy8gc3VwZXJzZWRlIHRoaXMgb25lIGFuZCByZW1vdmUgdGhpcyBydWxlLgorICBzdHJ1Y3QgQjsKKyAgaW50ICZzID0gZjxCPigwKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tvZiB0eXBlICd2b2lkJ319CisgIHN0cnVjdCBCIHsgdmlydHVhbCB+QigpID0gMDsgfTsKK30KKworbmFtZXNwYWNlIGRyMzM5IHsgLy8gZHIzMzk6IHllcworICB0ZW1wbGF0ZSA8aW50IEk+IHN0cnVjdCBBIHsgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IEk7IH07CisKKyAgY2hhciB4eHgoaW50KTsKKyAgY2hhciAoJnh4eChmbG9hdCkpWzJdOworCisgIHRlbXBsYXRlPGNsYXNzIFQ+IEE8c2l6ZW9mKHh4eCgoVCkwKSk+IGYoVCkge30gLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZX19CisKKyAgdm9pZCB0ZXN0KCkgeworICAgIEE8MT4gYSA9IGYoMCk7CisgICAgQTwyPiBiID0gZigwLjBmKTsKKyAgICBBPDM+IGMgPSBmKCJmb28iKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaGluZyBmdW5jdGlvbn19CisgIH0KKworCisgIGNoYXIgZihpbnQpOworICBpbnQgZiguLi4pOworCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgY29udl9pbnQgeworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKGYoVCgpKSkgPT0gMTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gYm9vbCBjb252X2ludDIoQTxzaXplb2YoZihUKCkpKT4gcCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gQTxzaXplb2YoZihUKCkpKT4gbWFrZV9BKCk7CisKKyAgaW50IGFbY29udl9pbnQ8Y2hhcj46OnZhbHVlID8gMSA6IC0xXTsKKyAgYm9vbCBiID0gY29udl9pbnQyPGNoYXI+KEE8MT4oKSk7CisgIEE8MT4gYyA9IG1ha2VfQTxjaGFyPigpOworfQorCituYW1lc3BhY2UgZHIzNDAgeyAvLyBkcjM0MDogeWVzCisgIHN0cnVjdCBBIHsgQShpbnQpOyB9OworICBzdHJ1Y3QgQiB7IEIoQSwgQSwgaW50KTsgfTsKKyAgaW50IHgsIHk7CisgIEIgYihBKHgpLCBBKHkpLCAzKTsKK30KKworbmFtZXNwYWNlIGRyMzQxIHsgLy8gZHIzNDE6IHN1cCAxNzA4CisgIG5hbWVzcGFjZSBBIHsKKyAgICBpbnQgbjsKKyAgICBleHRlcm4gIkMiIGludCAmZHIzNDFfYSA9IG47IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91c319IGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCB3aXRoIEMgbGFuZ3VhZ2UgbGlua2FnZSBoZXJlfX0KKyAgfQorICBuYW1lc3BhY2UgQiB7CisgICAgZXh0ZXJuICJDIiBpbnQgJmRyMzQxX2EgPSBkcjM0MV9hOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlZGVmaW5pdGlvbn19CisgIH0KKyAgZXh0ZXJuICJDIiB2b2lkIGRyMzQxX2IoKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIHdpdGggQyBsYW5ndWFnZSBsaW5rYWdlIGhlcmV9fQorfQoraW50IGRyMzQxX2E7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZGVjbGFyYXRpb24gb2YgJ2RyMzQxX2EnIGluIGdsb2JhbCBzY29wZSBjb25mbGljdHMgd2l0aCBkZWNsYXJhdGlvbiB3aXRoIEMgbGFuZ3VhZ2UgbGlua2FnZX19CitpbnQgZHIzNDFfYjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkZWNsYXJhdGlvbiBvZiAnZHIzNDFfYicgaW4gZ2xvYmFsIHNjb3BlIGNvbmZsaWN0cyB3aXRoIGRlY2xhcmF0aW9uIHdpdGggQyBsYW5ndWFnZSBsaW5rYWdlfX0KK2ludCBkcjM0MV9jOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaW4gZ2xvYmFsIHNjb3BlIGhlcmV9fQoraW50IGRyMzQxX2Q7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBpbiBnbG9iYWwgc2NvcGUgaGVyZX19CituYW1lc3BhY2UgZHIzNDEgeworICBleHRlcm4gIkMiIGludCBkcjM0MV9jOyAvLyBleHBlY3RlZC1lcnJvciB7e2RlY2xhcmF0aW9uIG9mICdkcjM0MV9jJyB3aXRoIEMgbGFuZ3VhZ2UgbGlua2FnZSBjb25mbGljdHMgd2l0aCBkZWNsYXJhdGlvbiBpbiBnbG9iYWwgc2NvcGV9fQorICBleHRlcm4gIkMiIHZvaWQgZHIzNDFfZCgpOyAvLyBleHBlY3RlZC1lcnJvciB7e2RlY2xhcmF0aW9uIG9mICdkcjM0MV9kJyB3aXRoIEMgbGFuZ3VhZ2UgbGlua2FnZSBjb25mbGljdHMgd2l0aCBkZWNsYXJhdGlvbiBpbiBnbG9iYWwgc2NvcGV9fQorCisgIG5hbWVzcGFjZSBBIHsgZXh0ZXJuICJDIiBpbnQgZHIzNDFfZTsgfSAvLyBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXN9fQorICBuYW1lc3BhY2UgQiB7IGV4dGVybiAiQyIgdm9pZCBkcjM0MV9lKCk7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZWRlZmluaXRpb24gb2YgJ2RyMzQxX2UnIGFzIGRpZmZlcmVudCBraW5kIG9mIHN5bWJvbH19Cit9CisKKy8vIGRyMzQyOiBuYQorCituYW1lc3BhY2UgZHIzNDMgeyAvLyBkcjM0Mzogbm8KKyAgLy8gRklYTUU6IGR1cCAxNzEwCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzdHJ1Y3QgQiB7fTsKKyAgfTsKKyAgLy8gRklYTUU6IEluIHRoZXNlIGNvbnRleHRzLCB0aGUgJ3RlbXBsYXRlJyBrZXl3b3JkIGlzIG9wdGlvbmFsLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQyA6IHB1YmxpYyBBPFQ+OjpCPFQ+IHsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2UgJ3RlbXBsYXRlJ319CisgICAgQygpIDogQTxUPjo6QjxUPigpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlICd0ZW1wbGF0ZSd9fQorICB9OworfQorCituYW1lc3BhY2UgZHIzNDQgeyAvLyBkcjM0NDogZHVwIDE0MzUKKyAgc3RydWN0IEEgeyBpbmxpbmUgdmlydHVhbCB+QSgpOyB9OworICBzdHJ1Y3QgQiB7IGZyaWVuZCBBOjp+QSgpOyB9OworfQorCituYW1lc3BhY2UgZHIzNDUgeyAvLyBkcjM0NTogeWVzCisgIHN0cnVjdCBBIHsKKyAgICBzdHJ1Y3QgWCB7fTsKKyAgICBpbnQgWDsgLy8gZXhwZWN0ZWQtbm90ZSB7e2hlcmV9fQorICB9OworICBzdHJ1Y3QgQiB7CisgICAgc3RydWN0IFgge307CisgIH07CisgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGYoVCB0KSB7IHR5cGVuYW1lIFQ6OlggeDsgfSAvLyBleHBlY3RlZC1lcnJvciB7e3JlZmVycyB0byBub24tdHlwZSBtZW1iZXIgJ1gnfX0KKyAgdm9pZCBmKEEgYSwgQiBiKSB7CisgICAgZihiKTsKKyAgICBmKGEpOyAvLyBleHBlY3RlZC1ub3RlIHt7aW5zdGFudGlhdGlvbn19CisgIH0KK30KKworLy8gZHIzNDY6IG5hCisKK25hbWVzcGFjZSBkcjM0NyB7IC8vIGRyMzQ3OiB5ZXMKKyAgc3RydWN0IGJhc2UgeworICAgIHN0cnVjdCBuZXN0ZWQ7CisgICAgc3RhdGljIGludCBuOworICAgIHN0YXRpYyB2b2lkIGYoKTsKKyAgICB2b2lkIGcoKTsKKyAgfTsKKworICBzdHJ1Y3QgZGVyaXZlZCA6IGJhc2Uge307CisKKyAgc3RydWN0IGRlcml2ZWQ6Om5lc3RlZCB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBzdHJ1Y3QgbmFtZWQgJ25lc3RlZCd9fQorICBpbnQgZGVyaXZlZDo6bjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtZW1iZXIgbmFtZWQgJ24nfX0KKyAgdm9pZCBkZXJpdmVkOjpmKCkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tkb2VzIG5vdCBtYXRjaCBhbnl9fQorICB2b2lkIGRlcml2ZWQ6OmcoKSB7fSAvLyBleHBlY3RlZC1lcnJvciB7e2RvZXMgbm90IG1hdGNoIGFueX19Cit9CisKKy8vIGRyMzQ4OiBuYQorCituYW1lc3BhY2UgZHIzNDkgeyAvLyBkcjM0OTogbm8KKyAgc3RydWN0IEEgeworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBvcGVyYXRvciBUICoqKigpIHsKKyAgICAgIGludCAqKipwID0gMDsKKyAgICAgIHJldHVybiBwOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBpbml0aWFsaXplIHJldHVybiBvYmplY3Qgb2YgdHlwZSAnY29uc3QgaW50ICoqKicgd2l0aCBhbiBsdmFsdWUgb2YgdHlwZSAnaW50ICoqKid9fQorICAgIH0KKyAgfTsKKworICAvLyBGSVhNRTogVGhpcyBpcyB2YWxpZC4KKyAgQSBhOworICBjb25zdCBpbnQgKmNvbnN0ICpjb25zdCAqcDEgPSBhOyAvLyBleHBlY3RlZC1ub3RlIHt7aW4gaW5zdGFudGlhdGlvbiBvZn19CisKKyAgc3RydWN0IEIgeworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBvcGVyYXRvciBUICoqKigpIHsKKyAgICAgIGNvbnN0IGludCAqKipwID0gMDsKKyAgICAgIHJldHVybiBwOworICAgIH0KKyAgfTsKKworICAvLyBGSVhNRTogVGhpcyBpcyBpbnZhbGlkLgorICBCIGI7CisgIGNvbnN0IGludCAqY29uc3QgKmNvbnN0ICpwMiA9IGI7Cit9CisKKy8vIGRyMzUxOiBuYQorCituYW1lc3BhY2UgZHIzNTIgeyAvLyBkcjM1MjogeWVzCisgIG5hbWVzcGFjZSBleGFtcGxlMSB7CisgICAgbmFtZXNwYWNlIEEgeworICAgICAgZW51bSBFIHt9OworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQT4gdm9pZCBmb28oRSwgUiAoKikoQSkpOyAvLyBleHBlY3RlZC1ub3RlIDJ7e2NvdWxkbid0IGluZmVyIHRlbXBsYXRlIGFyZ3VtZW50ICdSJ319CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhcmcoVCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IGFyZyhUKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2hlcmV9fSBleHBlY3RlZC1lcnJvciAwLTF7e2V4dGVuc2lvbn19CisKKyAgICB2b2lkIGYoQTo6RSBlKSB7CisgICAgICBmb28oZSwgJmFyZyk7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWF0Y2hpbmcgZnVuY3Rpb259fQorCisgICAgICB1c2luZyBBOjpmb287CisgICAgICBmb288aW50LCBpbnQ+KGUsICZhcmcpOyAvLyBleHBlY3RlZC1lcnJvciB7e2RlbGV0ZWR9fQorICAgIH0KKworICAgIGludCBhcmcoaW50KTsKKworICAgIHZvaWQgZyhBOjpFIGUpIHsKKyAgICAgIGZvbyhlLCAmYXJnKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaGluZyBmdW5jdGlvbn19CisKKyAgICAgIHVzaW5nIEE6OmZvbzsKKyAgICAgIGZvbzxpbnQsIGludD4oZSwgJmFyZyk7IC8vIG9rLCB1c2VzIG5vbi10ZW1wbGF0ZQorICAgIH0KKyAgfQorCisgIG5hbWVzcGFjZSBjb250ZXh0cyB7CisgICAgdGVtcGxhdGU8aW50IEk+IHZvaWQgZjEoaW50ICgmKVtJXSk7CisgICAgdGVtcGxhdGU8aW50IEk+IHZvaWQgZjIoaW50ICgmKVtJKzFdKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NvdWxkbid0IGluZmVyfX0KKyAgICB0ZW1wbGF0ZTxpbnQgST4gdm9pZCBmMyhpbnQgKCYpW0krMV0sIGludCAoJilbSV0pOworICAgIHZvaWQgZigpIHsKKyAgICAgIGludCBhWzRdOworICAgICAgaW50IGJbM107CisgICAgICBmMShhKTsKKyAgICAgIGYyKGEpOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1hdGNoaW5nIGZ1bmN0aW9ufX0KKyAgICAgIGYzKGEsIGIpOworICAgIH0KKworICAgIHRlbXBsYXRlPGludCBJPiBzdHJ1Y3QgUyB7fTsKKyAgICB0ZW1wbGF0ZTxpbnQgST4gdm9pZCBnMShTPEk+KTsKKyAgICB0ZW1wbGF0ZTxpbnQgST4gdm9pZCBnMihTPEkrMT4pOyAvLyBleHBlY3RlZC1ub3RlIHt7Y291bGRuJ3QgaW5mZXJ9fQorICAgIHRlbXBsYXRlPGludCBJPiB2b2lkIGczKFM8SSsxPiwgUzxJPik7CisgICAgdm9pZCBnKCkgeworICAgICAgUzw0PiBhOworICAgICAgUzwzPiBiOworICAgICAgZzEoYSk7CisgICAgICBnMihhKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaGluZyBmdW5jdGlvbn19CisgICAgICBnMyhhLCBiKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGgxKFQgPSAwKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NvdWxkbid0IGluZmVyfX0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGgyKFQsIFQgPSAwKTsKKyAgICB2b2lkIGgoKSB7CisgICAgICBoMSgpOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1hdGNoaW5nIGZ1bmN0aW9ufX0KKyAgICAgIGgxKDApOworICAgICAgaDE8aW50PigpOworICAgICAgaDIoMCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IHRtcGwoVCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQT4gdm9pZCBpMShSICgqKShBKSk7IC8vIGV4cGVjdGVkLW5vdGUgM3t7Y291bGRuJ3QgaW5mZXJ9fQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEE+IHZvaWQgaTIoUiwgQSwgUiAoKikoQSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7bm90IHZpYWJsZX19CisgICAgdm9pZCBpKCkgeworICAgICAgZXh0ZXJuIGludCBzaW5nbGUoaW50KTsKKyAgICAgIGkxKHNpbmdsZSk7CisgICAgICBpMigwLCAwLCBzaW5nbGUpOworCisgICAgICBleHRlcm4gaW50IGFtYmlnKGZsb2F0KSwgYW1iaWcoaW50KTsKKyAgICAgIGkxKGFtYmlnKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaGluZyBmdW5jdGlvbn19CisgICAgICBpMigwLCAwLCBhbWJpZyk7CisKKyAgICAgIGV4dGVybiB2b2lkIG5vX21hdGNoKGZsb2F0KSwgbm9fbWF0Y2goaW50KTsKKyAgICAgIGkxKG5vX21hdGNoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaGluZyBmdW5jdGlvbn19CisgICAgICBpMigwLCAwLCBub19tYXRjaCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWF0Y2hpbmcgZnVuY3Rpb259fQorCisgICAgICBpMSh0bXBsKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaGluZyBmdW5jdGlvbn19CisgICAgICBpMigwLCAwLCB0bXBsKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNfaW50OworICB0ZW1wbGF0ZTw+IHN0cnVjdCBpc19pbnQ8aW50PiB7fTsKKworICBuYW1lc3BhY2UgZXhhbXBsZTIgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBmKFQgKCpwKShUKSkgeyBpc19pbnQ8VD4oKTsgfQorICAgIGludCBnKGludCk7CisgICAgaW50IGcoY2hhcik7CisgICAgaW50IGkgPSBmKGcpOworICB9CisKKyAgbmFtZXNwYWNlIGV4YW1wbGUzIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgZihULCBUICgqcCkoVCkpIHsgaXNfaW50PFQ+KCk7IH0KKyAgICBpbnQgZyhpbnQpOworICAgIGNoYXIgZyhjaGFyKTsKKyAgICBpbnQgaSA9IGYoMSwgZyk7CisgIH0KKworICBuYW1lc3BhY2UgZXhhbXBsZTQgeworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbnQgZihULCBUICgqcCkoVCkpIHsgaXNfaW50PFQ+KCk7IH0KKyAgICBjaGFyIGcoY2hhcik7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IFQgZyhUKTsKKyAgICBpbnQgaSA9IGYoMSwgZyk7CisgIH0KKworICBuYW1lc3BhY2UgZXhhbXBsZTUgeworICAgIHRlbXBsYXRlPGludCBJPiBjbGFzcyBBIHt9OworICAgIHRlbXBsYXRlPGludCBJPiB2b2lkIGcoQTxJKzE+KTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NvdWxkbid0IGluZmVyfX0KKyAgICB0ZW1wbGF0ZTxpbnQgST4gdm9pZCBmKEE8ST4sIEE8SSsxPik7CisgICAgdm9pZCBoKEE8MT4gYTEsIEE8Mj4gYTIpIHsKKyAgICAgIGcoYTEpOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1hdGNoaW5nIGZ1bmN0aW9ufX0KKyAgICAgIGc8MD4oYTEpOworICAgICAgZihhMSwgYTIpOworICAgIH0KKyAgfQorfQorCisvLyBkcjM1MyBuZWVkcyBhbiBJUkdlbiB0ZXN0LgorCituYW1lc3BhY2UgZHIzNTQgeyAvLyBkcjM1NDogeWVzIGMrKzExCisgIC8vIEZJWE1FOiBTaG91bGQgd2UgYWxsb3cgdGhpcyBpbiBDKys5OCB0b28/CisgIHN0cnVjdCBTIHt9OworCisgIHRlbXBsYXRlPGludCo+IHN0cnVjdCBwdHIge307IC8vIGV4cGVjdGVkLW5vdGUgK3t7aGVyZX19CisgIHB0cjwwPiBwMDsKKyAgcHRyPChpbnQqKTA+IHAxOworICBwdHI8KGZsb2F0KikwPiBwMjsKKyAgcHRyPChpbnQgUzo6KikwPiBwMzsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTUge3tkb2VzIG5vdCByZWZlciB0byBhbnkgZGVjbH19CisgIC8vIGV4cGVjdGVkLWVycm9yQC01IHt7ZG9lcyBub3QgcmVmZXIgdG8gYW55IGRlY2x9fQorICAvLyBleHBlY3RlZC1lcnJvckAtNSB7e2RvZXMgbm90IHJlZmVyIHRvIGFueSBkZWNsfX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTUge3tkb2VzIG5vdCByZWZlciB0byBhbnkgZGVjbH19CisjZWxzZQorICAvLyBleHBlY3RlZC1lcnJvckAtMTAge3ttdXN0IGJlIGNhc3R9fQorICAvLyBvaworICAvLyBleHBlY3RlZC1lcnJvckAtMTAge3tkb2VzIG5vdCBtYXRjaH19CisgIC8vIGV4cGVjdGVkLWVycm9yQC0xMCB7e2RvZXMgbm90IG1hdGNofX0KKyNlbmRpZgorCisgIHRlbXBsYXRlPGludCo+IGludCBib3RoKCk7CisgIHRlbXBsYXRlPGludD4gaW50IGJvdGgoKTsKKyAgaW50IGIwID0gYm90aDwwPigpOworICBpbnQgYjEgPSBib3RoPChpbnQqKTA+KCk7CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIC8vIGV4cGVjdGVkLWVycm9yQC0yIHt7bm8gbWF0Y2hpbmcgZnVuY3Rpb259fQorICAvLyBleHBlY3RlZC1ub3RlQC02IHt7Y2FuZGlkYXRlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtNiB7e2NhbmRpZGF0ZX19CisjZW5kaWYKKworICB0ZW1wbGF0ZTxpbnQgUzo6Kj4gc3RydWN0IHB0cl9tZW0ge307IC8vIGV4cGVjdGVkLW5vdGUgK3t7aGVyZX19CisgIHB0cl9tZW08MD4gbTA7CisgIHB0cl9tZW08KGludCBTOjoqKTA+IG0xOworICBwdHJfbWVtPChmbG9hdCBTOjoqKTA+IG0yOworICBwdHJfbWVtPChpbnQgKikwPiBtMzsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTUge3tjYW5ub3QgYmUgY29udmVydGVkfX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTUge3tpcyBub3QgYSBwb2ludGVyIHRvIG1lbWJlciBjb25zdGFudH19CisgIC8vIGV4cGVjdGVkLWVycm9yQC01IHt7Y2Fubm90IGJlIGNvbnZlcnRlZH19CisgIC8vIGV4cGVjdGVkLWVycm9yQC01IHt7Y2Fubm90IGJlIGNvbnZlcnRlZH19CisjZWxzZQorICAvLyBleHBlY3RlZC1lcnJvckAtMTAge3ttdXN0IGJlIGNhc3R9fQorICAvLyBvaworICAvLyBleHBlY3RlZC1lcnJvckAtMTAge3tkb2VzIG5vdCBtYXRjaH19CisgIC8vIGV4cGVjdGVkLWVycm9yQC0xMCB7e2RvZXMgbm90IG1hdGNofX0KKyNlbmRpZgorfQorCitzdHJ1Y3QgZHIzNTVfUzsgLy8gZHIzNTU6IHllcworc3RydWN0IDo6ZHIzNTVfUyB7fTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHF1YWxpZmljYXRpb259fQorbmFtZXNwYWNlIGRyMzU1IHsgc3RydWN0IDo6ZHIzNTVfUyBzOyB9CisKKy8vIGRyMzU2OiBuYQorCituYW1lc3BhY2UgZHIzNTcgeyAvLyBkcjM1NzogeWVzCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBIHsKKyAgICB2b2lkIGYoKSBjb25zdDsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NvbnN0IHF1YWxpZmllZH19CisgIH07CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgQTxUPjo6ZigpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7ZG9lcyBub3QgbWF0Y2h9fQorCisgIHN0cnVjdCBCIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYoKTsKKyAgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBCOjpmKCkgY29uc3Qge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tkb2VzIG5vdCBtYXRjaH19Cit9CisKK25hbWVzcGFjZSBkcjM1OCB7IC8vIGRyMzU4OiB5ZXMKKyAgZXh0ZXJuICJDIiB2b2lkIGRyMzU4X2YoKTsKKyAgbmFtZXNwYWNlIE4geworICAgIGludCB2YXI7CisgICAgZXh0ZXJuICJDIiB2b2lkIGRyMzU4X2YoKSB7IHZhciA9IDEwOyB9CisgIH0KK30KKworbmFtZXNwYWNlIGRyMzU5IHsgLy8gZHIzNTk6IHllcworICAvLyBOb3RlLCB0aGUgZXhhbXBsZSBpbiB0aGUgRFIgaXMgd3Jvbmc7IGl0IGRvZXNuJ3QgY29udGFpbiBhbiBhbm9ueW1vdXMKKyAgLy8gdW5pb24uCisgIHN0cnVjdCBFIHsKKyAgICB1bmlvbiB7CisgICAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgeDsKKyAgICAgIH0gczsKKyAgICB9IHY7CisKKyAgICB1bmlvbiB7CisgICAgICBzdHJ1Y3QgeyAvLyBleHBlY3RlZC1lcnJvciB7e2V4dGVuc2lvbn19CisgICAgICAgIGludCB4OworICAgICAgfSBzOworCisgICAgICBzdHJ1Y3QgUyB7IC8vIGV4cGVjdGVkLWVycm9yIHt7dHlwZXMgY2Fubm90IGJlIGRlY2xhcmVkIGluIGFuIGFub255bW91cyB1bmlvbn19CisgICAgICAgIGludCB4OworICAgICAgfSB0OworCisgICAgICB1bmlvbiB7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXh0ZW5zaW9ufX0KKyAgICAgICAgaW50IHU7CisgICAgICB9OworICAgIH07CisgIH07Cit9CisKKy8vIGRyMzYyOiBuYQorLy8gZHIzNjM6IG5hCisKK25hbWVzcGFjZSBkcjM2NCB7IC8vIGRyMzY0OiB5ZXMKKyAgc3RydWN0IFMgeworICAgIHN0YXRpYyB2b2lkIGYoaW50KTsKKyAgICB2b2lkIGYoY2hhcik7CisgIH07CisKKyAgdm9pZCBnKCkgeworICAgIFM6OmYoJ2EnKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYWxsIHRvIG5vbi1zdGF0aWN9fQorICAgIFM6OmYoMCk7CisgIH0KK30KKworI2lmICJmb28iIC8vIGV4cGVjdGVkLWVycm9yIHt7aW52YWxpZCB0b2tlbn19IGRyMzY2OiB5ZXMKKyNlbmRpZgorCituYW1lc3BhY2UgZHIzNjcgeyAvLyBkcjM2NzogeWVzCisgIC8vIEZJWE1FOiBUaGVzZSBkaWFnbm9zdGljcyBhcmUgdGVycmlibGUuIERvbid0IGRpYWdub3NlIGFuIGlsbC1mb3JtZWQgZ2xvYmFsCisgIC8vIGFycmF5IGFzIGJlaW5nIGEgVkxBIQorICBpbnQgYVt0cnVlID8gdGhyb3cgMCA6IDRdOyAvLyBleHBlY3RlZC1lcnJvciAye3t2YXJpYWJsZSBsZW5ndGggYXJyYXl9fQorICBpbnQgYlt0cnVlID8gNCA6IHRocm93IDBdOworICBpbnQgY1t0cnVlID8gKm5ldyBpbnQgOiA0XTsgLy8gZXhwZWN0ZWQtZXJyb3IgMnt7dmFyaWFibGUgbGVuZ3RoIGFycmF5fX0KKyAgaW50IGRbdHJ1ZSA/IDQgOiAqbmV3IGludF07CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIC8vIGV4cGVjdGVkLWVycm9yQC00IHt7dmFyaWFibGUgbGVuZ3RoIGFycmF5fX0gZXhwZWN0ZWQtZXJyb3JALTQge3tjb25zdGFudCBleHByZXNzaW9ufX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTMge3t2YXJpYWJsZSBsZW5ndGggYXJyYXl9fSBleHBlY3RlZC1lcnJvckAtMyB7e2NvbnN0YW50IGV4cHJlc3Npb259fQorI2VuZGlmCit9CisKK25hbWVzcGFjZSBkcjM2OCB7IC8vIGRyMzY4OiB5ZXMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgVD4gc3RydWN0IFMge307IC8vIGV4cGVjdGVkLW5vdGUge3toZXJlfX0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IGYoUzxULCBUKCk+ICopOyAvLyBleHBlY3RlZC1lcnJvciB7e2Z1bmN0aW9uIHR5cGV9fQorICAvL3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBnKFM8VCwgKFQoKSk+ICopOyAvLyBGSVhNRTogY3Jhc2hlcyBjbGFuZworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgZyhTPFQsIHRydWUgPyBUKCkgOiBUKCk+ICopOyAvLyBleHBlY3RlZC1ub3RlIHt7Y2Fubm90IGhhdmUgdHlwZSAnZHIzNjg6OlgnfX0KKyAgc3RydWN0IFgge307CisgIGludCBuID0gZzxYPigwKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaGluZ319Cit9CisKKy8vIGRyMzcwOiBuYQorCituYW1lc3BhY2UgZHIzNzIgeyAvLyBkcjM3Mjogbm8KKyAgbmFtZXNwYWNlIGV4YW1wbGUxIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7CisgICAgcHJvdGVjdGVkOgorICAgICAgdHlwZWRlZiBUIFR5cGU7IC8vIGV4cGVjdGVkLW5vdGUgMnt7cHJvdGVjdGVkfX0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBZIHt9OworCisgICAgLy8gRklYTUU6IFRoZXNlIHR3byBhcmUgdmFsaWQ7IGRlcml2aW5nIGZyb20gVDE8VD4gZ2l2ZXMgWjEgYWNjZXNzIHRvCisgICAgLy8gdGhlIHByb3RlY3RlZCBtZW1iZXIgVDE8VD46OlR5cGUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgVDEsCisgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIFQyPiBzdHJ1Y3QgWjEgOgorICAgICAgVDE8VD4sCisgICAgICBUMjx0eXBlbmFtZSBUMTxUPjo6VHlwZT4ge307IC8vIGV4cGVjdGVkLWVycm9yIHt7cHJvdGVjdGVkfX0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsCisgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIFQxLAorICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyBUMj4gc3RydWN0IFoyIDoKKyAgICAgIFQyPHR5cGVuYW1lIFQxPFQ+OjpUeXBlPiwgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcm90ZWN0ZWR9fQorICAgICAgVDE8VD4ge307CisKKyAgICBaMTxpbnQsIFgsIFk+IHoxOyAvLyBleHBlY3RlZC1ub3RlIHt7aW5zdGFudGlhdGlvbiBvZn19CisgICAgWjI8aW50LCBYLCBZPiB6MjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2luc3RhbnRpYXRpb24gb2Z9fQorICB9CisKKyAgbmFtZXNwYWNlIGV4YW1wbGUyIHsKKyAgICBzdHJ1Y3QgWCB7CisgICAgcHJpdmF0ZToKKyAgICAgIHR5cGVkZWYgaW50IFR5cGU7IC8vIGV4cGVjdGVkLW5vdGUge3twcml2YXRlfX0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBIHsKKyAgICAgIHR5cGVuYW1lIFQ6OlR5cGUgdDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcml2YXRlfX0KKyAgICB9OworICAgIEE8WD4gYXg7IC8vIGV4cGVjdGVkLW5vdGUge3tpbnN0YW50aWF0aW9uIG9mfX0KKyAgfQorCisgIG5hbWVzcGFjZSBleGFtcGxlMyB7CisgICAgc3RydWN0IEEgeworICAgIHByb3RlY3RlZDoKKyAgICAgIHR5cGVkZWYgaW50IE47IC8vIGV4cGVjdGVkLW5vdGUgMnt7cHJvdGVjdGVkfX0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEIge307CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3RydWN0IEMgOiBVLCBCPHR5cGVuYW1lIFU6Ok4+IHt9OyAvLyBleHBlY3RlZC1lcnJvciB7e3Byb3RlY3RlZH19CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3RydWN0IEQgOiBCPHR5cGVuYW1lIFU6Ok4+LCBVIHt9OyAvLyBleHBlY3RlZC1lcnJvciB7e3Byb3RlY3RlZH19CisKKyAgICBDPEE+IHg7IC8vIGV4cGVjdGVkLW5vdGUge3tpbnN0YW50aWF0aW9uIG9mfX0KKyAgICBEPEE+IHk7IC8vIGV4cGVjdGVkLW5vdGUge3tpbnN0YW50aWF0aW9uIG9mfX0KKyAgfQorCisgIG5hbWVzcGFjZSBleGFtcGxlNCB7CisgICAgY2xhc3MgQSB7CisgICAgICBjbGFzcyBCIHt9OworICAgICAgZnJpZW5kIGNsYXNzIFg7CisgICAgfTsKKworICAgIHN0cnVjdCBYIDogQTo6QiB7CisgICAgICBBOjpCIG14OworICAgICAgY2xhc3MgWSB7CisgICAgICAgIEE6OkIgbXk7CisgICAgICB9OworICAgIH07CisgIH0KK30KKworbmFtZXNwYWNlIGRyMzczIHsgLy8gZHIzNzM6IG5vCisgIC8vIEZJWE1FOiBUaGlzIGlzIHZhbGlkLgorICBuYW1lc3BhY2UgWCB7IGludCBkcjM3MzsgfSAvLyBleHBlY3RlZC1ub3RlIDJ7e2hlcmV9fQorICBzdHJ1Y3QgZHIzNzMgeyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19CisgICAgdm9pZCBmKCkgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIGRyMzczOjpYOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG5hbWVzcGFjZSBuYW1lZCAnWCcgaW4gJ2RyMzczOjpkcjM3Myd9fQorICAgICAgaW50IGsgPSBkcjM3MzsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkb2VzIG5vdCByZWZlciB0byBhIHZhbHVlfX0KKworICAgICAgbmFtZXNwYWNlIFkgPSBkcjM3Mzo6WDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBuYW1lc3BhY2UgbmFtZWQgJ1gnIGluICdkcjM3Mzo6ZHIzNzMnfX0KKyAgICAgIGsgPSBZOjpkcjM3MzsKKyAgICB9CisgIH07Cit9CisKK25hbWVzcGFjZSBkcjM3NCB7IC8vIGRyMzc0OiB5ZXMgYysrMTEKKyAgbmFtZXNwYWNlIE4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZigpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBIHsgdm9pZCBmKCk7IH07CisgIH0KKyAgdGVtcGxhdGU8PiB2b2lkIE46OmY8Y2hhcj4oKSB7fQorICB0ZW1wbGF0ZTw+IHZvaWQgTjo6QTxjaGFyPjo6ZigpIHt9CisgIHRlbXBsYXRlPD4gc3RydWN0IE46OkE8aW50PiB7fTsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTQge3tleHRlbnNpb259fSBleHBlY3RlZC1ub3RlQC03IHt7aGVyZX19CisgIC8vIGV4cGVjdGVkLWVycm9yQC00IHt7ZXh0ZW5zaW9ufX0gZXhwZWN0ZWQtbm90ZUAtNyB7e2hlcmV9fQorICAvLyBleHBlY3RlZC1lcnJvckAtNCB7e2V4dGVuc2lvbn19IGV4cGVjdGVkLW5vdGVALTgge3toZXJlfX0KKyNlbmRpZgorfQorCisvLyBkcjM3NTogZHVwIDM0NQorLy8gZHIzNzY6IG5hCisKK25hbWVzcGFjZSBkcjM3NyB7IC8vIGRyMzc3OiB5ZXMKKyAgZW51bSBFIHsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tlbnVtZXJhdGlvbiB2YWx1ZXMgZXhjZWVkIHJhbmdlIG9mIGxhcmdlc3QgaW50ZWdlcn19CisgICAgYSA9IC1fX0xPTkdfTE9OR19NQVhfXyAtIDEsIC8vIGV4cGVjdGVkLWVycm9yIDAtMXt7ZXh0ZW5zaW9ufX0KKyAgICBiID0gMiAqICh1bnNpZ25lZCBsb25nIGxvbmcpX19MT05HX0xPTkdfTUFYX18gLy8gZXhwZWN0ZWQtZXJyb3IgMC0ye3tleHRlbnNpb259fQorICB9OworfQorCisvLyBkcjM3ODogZHVwIDI3NgorLy8gZHIzNzk6IG5hCisKK25hbWVzcGFjZSBkcjM4MSB7IC8vIGRyMzgxOiB5ZXMKKyAgc3RydWN0IEEgeworICAgIGludCBhOworICB9OworICBzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7fTsKKyAgc3RydWN0IEMgOiBCIHt9OworICBzdHJ1Y3QgRCA6IEIge307CisgIHN0cnVjdCBFIDogcHVibGljIEMsIHB1YmxpYyBEIHt9OworICBzdHJ1Y3QgRiA6IHB1YmxpYyBBIHt9OworICB2b2lkIGYoKSB7CisgICAgRSBlOworICAgIGUuQjo6YSA9IDA7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW1iaWd1b3VzIGNvbnZlcnNpb259fQorICAgIEYgZjsKKyAgICBmLkE6OmEgPSAxOworICB9Cit9CisKK25hbWVzcGFjZSBkcjM4MiB7IC8vIGRyMzgyOiB5ZXMgYysrMTEKKyAgLy8gRklYTUU6IFNob3VsZCB3ZSBhbGxvdyB0aGlzIGluIEMrKzk4IG1vZGU/CisgIHN0cnVjdCBBIHsgdHlwZWRlZiBpbnQgVDsgfTsKKyAgdHlwZW5hbWUgQTo6VCB0OworICB0eXBlbmFtZSBkcjM4Mjo6QSBhOworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAvLyBleHBlY3RlZC1lcnJvckAtMyB7e29jY3VycyBvdXRzaWRlIG9mIGEgdGVtcGxhdGV9fQorICAvLyBleHBlY3RlZC1lcnJvckAtMyB7e29jY3VycyBvdXRzaWRlIG9mIGEgdGVtcGxhdGV9fQorI2VuZGlmCisgIHR5cGVuYW1lIEEgYjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBhIHF1YWxpZmllZCBuYW1lfX0KK30KKworbmFtZXNwYWNlIGRyMzgzIHsgLy8gZHIzODM6IHllcworICBzdHJ1Y3QgQSB7IEEgJm9wZXJhdG9yPShjb25zdCBBJik7IH07CisgIHN0cnVjdCBCIHsgfkIoKTsgfTsKKyAgdW5pb24gQyB7IEMgJm9wZXJhdG9yPShjb25zdCBDJik7IH07CisgIHVuaW9uIEQgeyB+RCgpOyB9OworICBpbnQgY2hlY2tbKF9faXNfcG9kKEEpIHx8IF9faXNfcG9kKEIpIHx8IF9faXNfcG9kKEMpIHx8IF9faXNfcG9kKEQpKSA/IC0xIDogMV07Cit9CisKK25hbWVzcGFjZSBkcjM4NCB7IC8vIGRyMzg0OiB5ZXMKKyAgbmFtZXNwYWNlIE4xIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQmFzZSB7fTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7CisgICAgICBzdHJ1Y3QgWSA6IHB1YmxpYyBCYXNlPFQ+IHsKKyAgICAgICAgWSBvcGVyYXRvcisoaW50KSBjb25zdDsKKyAgICAgIH07CisgICAgICBZIGYodW5zaWduZWQgaSkgeyByZXR1cm4gWSgpICsgaTsgfQorICAgIH07CisgIH0KKworICBuYW1lc3BhY2UgTjIgeworICAgIHN0cnVjdCBaIHt9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCAqb3BlcmF0b3IrKFQsIHVuc2lnbmVkKTsKKyAgfQorCisgIGludCBtYWluKCkgeworICAgIE4xOjpYPE4yOjpaPiB2OworICAgIHYuZigwKTsKKyAgfQorfQorCituYW1lc3BhY2UgZHIzODUgeyAvLyBkcjM4NTogeWVzCisgIHN0cnVjdCBBIHsgcHJvdGVjdGVkOiB2b2lkIGYoKTsgfTsgCisgIHN0cnVjdCBCIDogQSB7IHVzaW5nIEE6OmY7IH07CisgIHN0cnVjdCBDIDogQSB7IHZvaWQgZyhCIGIpIHsgYi5mKCk7IH0gfTsKKyAgdm9pZCBoKEIgYikgeyBiLmYoKTsgfQorCisgIHN0cnVjdCBEIHsgaW50IG47IH07IC8vIGV4cGVjdGVkLW5vdGUge3ttZW1iZXJ9fQorICBzdHJ1Y3QgRSA6IHByb3RlY3RlZCBEIHt9OyAvLyBleHBlY3RlZC1ub3RlIDJ7e3Byb3RlY3RlZH19CisgIHN0cnVjdCBGIDogRSB7IGZyaWVuZCBpbnQgaShFKTsgfTsKKyAgaW50IGkoRSBlKSB7IHJldHVybiBlLm47IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3twcm90ZWN0ZWQgYmFzZX19IGV4cGVjdGVkLWVycm9yIHt7cHJvdGVjdGVkIG1lbWJlcn19Cit9CisKK25hbWVzcGFjZSBkcjM4NyB7IC8vIGRyMzg3OiB5ZXMKKyAgbmFtZXNwYWNlIG9sZCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgbnVtYmVyIHsKKyAgICAgIG51bWJlcihpbnQpOyAvLyBleHBlY3RlZC1ub3RlIDJ7e2hlcmV9fQorICAgICAgZnJpZW5kIG51bWJlciBnY2QobnVtYmVyICZ4LCBudW1iZXIgJnkpIHt9CisgICAgfTsKKworICAgIHZvaWQgZygpIHsKKyAgICAgIG51bWJlcjxkb3VibGU+IGEoMyksIGIoNCk7IC8vIGV4cGVjdGVkLWVycm9yIDJ7e3ByaXZhdGV9fQorICAgICAgYSA9IGdjZChhLCBiKTsKKyAgICAgIGIgPSBnY2QoMywgNCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5kZWNsYXJlZH19CisgICAgfQorICB9CisKKyAgbmFtZXNwYWNlIG5ld2VyIHsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgbnVtYmVyIHsKKyAgICBwdWJsaWM6CisgICAgICBudW1iZXIoaW50KTsKKyAgICAgIGZyaWVuZCBudW1iZXIgZ2NkKG51bWJlciB4LCBudW1iZXIgeSkgeyByZXR1cm4gMDsgfQorICAgIH07CisKKyAgICB2b2lkIGcoKSB7CisgICAgICBudW1iZXI8ZG91YmxlPiBhKDMpLCBiKDQpOworICAgICAgYSA9IGdjZChhLCBiKTsKKyAgICAgIGIgPSBnY2QoMywgNCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5kZWNsYXJlZH19CisgICAgfQorICB9Cit9CisKKy8vIEZJWE1FOiBkcjM4OCBuZWVkcyBjb2RlZ2VuIHRlc3QKKworbmFtZXNwYWNlIGRyMzg5IHsgLy8gZHIzODk6IG5vCisgIHN0cnVjdCBTIHsKKyAgICB0eXBlZGVmIHN0cnVjdCB7fSBBOworICAgIHR5cGVkZWYgZW51bSB7fSBCOworICAgIHR5cGVkZWYgc3RydWN0IHt9IGNvbnN0IEM7IC8vIGV4cGVjdGVkLW5vdGUgMC0ye3toZXJlfX0KKyAgICB0eXBlZGVmIGVudW0ge30gY29uc3QgRDsgLy8gZXhwZWN0ZWQtbm90ZSAwLTF7e2hlcmV9fQorICB9OworICB0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IFQge307CisKKyAgc3RydWN0IFdpdGhMaW5rYWdlMSB7fTsKKyAgZW51bSBXaXRoTGlua2FnZTIge307CisgIHR5cGVkZWYgc3RydWN0IHt9ICpXaXRoTGlua2FnZTNhLCBXaXRoTGlua2FnZTNiOworICB0eXBlZGVmIGVudW0ge30gV2l0aExpbmthZ2U0YSwgKldpdGhMaW5rYWdlNGI7CisgIHR5cGVkZWYgUzo6QSBXaXRoTGlua2FnZTU7CisgIHR5cGVkZWYgY29uc3QgUzo6QiBXaXRoTGlua2FnZTY7CisgIHR5cGVkZWYgaW50IFdpdGhMaW5rYWdlNzsKKyAgdHlwZWRlZiB2b2lkICgqV2l0aExpbmthZ2U4KShXaXRoTGlua2FnZTIgV2l0aExpbmthZ2UxOjoqLCBXaXRoTGlua2FnZTUgKik7CisgIHR5cGVkZWYgVDxXaXRoTGlua2FnZTU+IFdpdGhMaW5rYWdlOTsKKworICB0eXBlZGVmIHN0cnVjdCB7fSAqV2l0aG91dExpbmthZ2UxOyAvLyBleHBlY3RlZC1ub3RlIDAtMXt7aGVyZX19CisgIHR5cGVkZWYgZW51bSB7fSBjb25zdCBXaXRob3V0TGlua2FnZTI7IC8vIGV4cGVjdGVkLW5vdGUgMC0xe3toZXJlfX0KKyAgLy8gVGhlc2UgdHdvIHR5cGVzIGRvbid0IGhhdmUgbGlua2FnZSBldmVuIHRob3VnaCB0aGV5IGFyZSBleHRlcm5hbGx5IHZpc2libGUKKyAgLy8gYW5kIHRoZSBPRFIgcmVxdWlyZXMgdGhlbSB0byBiZSBtZXJnZWQgYWNyb3NzIFRVcy4KKyAgdHlwZWRlZiBTOjpDIFdpdGhvdXRMaW5rYWdlMzsKKyAgdHlwZWRlZiBTOjpEIFdpdGhvdXRMaW5rYWdlNDsKKyAgdHlwZWRlZiB2b2lkICgqV2l0aG91dExpbmthZ2U1KShpbnQgKFdpdGhvdXRMaW5rYWdlMzo6KikoY2hhcikpOworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLyBUaGlzIGhhcyBsaW5rYWdlIGV2ZW4gdGhvdWdoIGl0cyB0ZW1wbGF0ZSBhcmd1bWVudCBkb2VzIG5vdC4KKyAgLy8gRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgYSBkZWZlY3QuCisgIHR5cGVkZWYgVDxXaXRob3V0TGlua2FnZTE+IFdpdGhMaW5rYWdlMTA7CisjZWxzZQorICB0eXBlZGVmIGludCBXaXRoTGlua2FnZTEwOyAvLyBkdW1teQorCisgIHR5cGVkZWYgVDxXaXRoTGlua2FnZTE+IEdvb2RBcmcxOworICB0eXBlZGVmIFQ8V2l0aExpbmthZ2UyPiBHb29kQXJnMjsKKyAgdHlwZWRlZiBUPFdpdGhMaW5rYWdlM2E+IEdvb2RBcmczYTsKKyAgdHlwZWRlZiBUPFdpdGhMaW5rYWdlM2I+IEdvb2RBcmczYjsKKyAgdHlwZWRlZiBUPFdpdGhMaW5rYWdlNGE+IEdvb2RBcmc0YTsKKyAgdHlwZWRlZiBUPFdpdGhMaW5rYWdlNGI+IEdvb2RBcmc0YjsKKyAgdHlwZWRlZiBUPFdpdGhMaW5rYWdlNT4gR29vZEFyZzU7CisgIHR5cGVkZWYgVDxXaXRoTGlua2FnZTY+IEdvb2RBcmc2OworICB0eXBlZGVmIFQ8V2l0aExpbmthZ2U3PiBHb29kQXJnNzsKKyAgdHlwZWRlZiBUPFdpdGhMaW5rYWdlOD4gR29vZEFyZzg7CisgIHR5cGVkZWYgVDxXaXRoTGlua2FnZTk+IEdvb2RBcmc5OworCisgIHR5cGVkZWYgVDxXaXRob3V0TGlua2FnZTE+IEJhZEFyZzE7IC8vIGV4cGVjdGVkLWVycm9ye3t0ZW1wbGF0ZSBhcmd1bWVudCB1c2VzfX0KKyAgdHlwZWRlZiBUPFdpdGhvdXRMaW5rYWdlMj4gQmFkQXJnMjsgLy8gZXhwZWN0ZWQtZXJyb3J7e3RlbXBsYXRlIGFyZ3VtZW50IHVzZXN9fQorICB0eXBlZGVmIFQ8V2l0aG91dExpbmthZ2UzPiBCYWRBcmczOyAvLyBleHBlY3RlZC1lcnJvcnt7dGVtcGxhdGUgYXJndW1lbnQgdXNlc319CisgIHR5cGVkZWYgVDxXaXRob3V0TGlua2FnZTQ+IEJhZEFyZzQ7IC8vIGV4cGVjdGVkLWVycm9ye3t0ZW1wbGF0ZSBhcmd1bWVudCB1c2VzfX0KKyAgdHlwZWRlZiBUPFdpdGhvdXRMaW5rYWdlNT4gQmFkQXJnNTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3RlbXBsYXRlIGFyZ3VtZW50IHVzZXN9fQorI2VuZGlmCisKKyAgZXh0ZXJuIFdpdGhMaW5rYWdlMSB3aXRoTGlua2FnZTE7CisgIGV4dGVybiBXaXRoTGlua2FnZTIgd2l0aExpbmthZ2UyOworICBleHRlcm4gV2l0aExpbmthZ2UzYSB3aXRoTGlua2FnZTNhOworICBleHRlcm4gV2l0aExpbmthZ2UzYiB3aXRoTGlua2FnZTNiOworICBleHRlcm4gV2l0aExpbmthZ2U0YSB3aXRoTGlua2FnZTRhOworICBleHRlcm4gV2l0aExpbmthZ2U0YiB3aXRoTGlua2FnZTRiOworICBleHRlcm4gV2l0aExpbmthZ2U1IHdpdGhMaW5rYWdlNTsKKyAgZXh0ZXJuIFdpdGhMaW5rYWdlNiB3aXRoTGlua2FnZTY7CisgIGV4dGVybiBXaXRoTGlua2FnZTcgd2l0aExpbmthZ2U3OworICBleHRlcm4gV2l0aExpbmthZ2U4IHdpdGhMaW5rYWdlODsKKyAgZXh0ZXJuIFdpdGhMaW5rYWdlOSB3aXRoTGlua2FnZTk7CisgIGV4dGVybiBXaXRoTGlua2FnZTEwIHdpdGhMaW5rYWdlMTA7CisKKyAgLy8gRklYTUU6IFRoZXNlIGFyZSBhbGwgaWxsLWZvcm1lZC4KKyAgZXh0ZXJuIFdpdGhvdXRMaW5rYWdlMSB3aXRob3V0TGlua2FnZTE7CisgIGV4dGVybiBXaXRob3V0TGlua2FnZTIgd2l0aG91dExpbmthZ2UyOworICBleHRlcm4gV2l0aG91dExpbmthZ2UzIHdpdGhvdXRMaW5rYWdlMzsKKyAgZXh0ZXJuIFdpdGhvdXRMaW5rYWdlNCB3aXRob3V0TGlua2FnZTQ7CisgIGV4dGVybiBXaXRob3V0TGlua2FnZTUgd2l0aG91dExpbmthZ2U1OworCisgIC8vIE9LLCBleHRlcm4gIkMiLgorICBleHRlcm4gIkMiIHsKKyAgICBleHRlcm4gV2l0aG91dExpbmthZ2UxIGRyMzg5X3dpdGhvdXRMaW5rYWdlMTsKKyAgICBleHRlcm4gV2l0aG91dExpbmthZ2UyIGRyMzg5X3dpdGhvdXRMaW5rYWdlMjsKKyAgICBleHRlcm4gV2l0aG91dExpbmthZ2UzIGRyMzg5X3dpdGhvdXRMaW5rYWdlMzsKKyAgICBleHRlcm4gV2l0aG91dExpbmthZ2U0IGRyMzg5X3dpdGhvdXRMaW5rYWdlNDsKKyAgICBleHRlcm4gV2l0aG91dExpbmthZ2U1IGRyMzg5X3dpdGhvdXRMaW5rYWdlNTsKKyAgfQorCisgIC8vIE9LLCBkZWZpbmVkLgorICBXaXRob3V0TGlua2FnZTEgd2l0aG91dExpbmthZ2VEZWYxOworICBXaXRob3V0TGlua2FnZTIgd2l0aG91dExpbmthZ2VEZWYyID0gV2l0aG91dExpbmthZ2UyKCk7CisgIFdpdGhvdXRMaW5rYWdlMyB3aXRob3V0TGlua2FnZURlZjMgPSB7fTsKKyAgV2l0aG91dExpbmthZ2U0IHdpdGhvdXRMaW5rYWdlRGVmNCA9IFdpdGhvdXRMaW5rYWdlNCgpOworICBXaXRob3V0TGlua2FnZTUgd2l0aG91dExpbmthZ2VEZWY1OworCisgIHZvaWQgdXNlKGNvbnN0IHZvaWQgKik7CisgIHZvaWQgdXNlX2FsbCgpIHsKKyAgICB1c2UoJndpdGhMaW5rYWdlMSk7IHVzZSgmd2l0aExpbmthZ2UyKTsgdXNlKCZ3aXRoTGlua2FnZTNhKTsgdXNlKCZ3aXRoTGlua2FnZTNiKTsKKyAgICB1c2UoJndpdGhMaW5rYWdlNGEpOyB1c2UoJndpdGhMaW5rYWdlNGIpOyB1c2UoJndpdGhMaW5rYWdlNSk7IHVzZSgmd2l0aExpbmthZ2U2KTsKKyAgICB1c2UoJndpdGhMaW5rYWdlNyk7IHVzZSgmd2l0aExpbmthZ2U4KTsgdXNlKCZ3aXRoTGlua2FnZTkpOyB1c2UoJndpdGhMaW5rYWdlMTApOworCisgICAgdXNlKCZ3aXRob3V0TGlua2FnZTEpOyB1c2UoJndpdGhvdXRMaW5rYWdlMik7IHVzZSgmd2l0aG91dExpbmthZ2UzKTsKKyAgICB1c2UoJndpdGhvdXRMaW5rYWdlNCk7IHVzZSgmd2l0aG91dExpbmthZ2U1KTsKKworICAgIHVzZSgmZHIzODlfd2l0aG91dExpbmthZ2UxKTsgdXNlKCZkcjM4OV93aXRob3V0TGlua2FnZTIpOworICAgIHVzZSgmZHIzODlfd2l0aG91dExpbmthZ2UzKTsgdXNlKCZkcjM4OV93aXRob3V0TGlua2FnZTQpOworICAgIHVzZSgmZHIzODlfd2l0aG91dExpbmthZ2U1KTsKKworICAgIHVzZSgmd2l0aG91dExpbmthZ2VEZWYxKTsgdXNlKCZ3aXRob3V0TGlua2FnZURlZjIpOyB1c2UoJndpdGhvdXRMaW5rYWdlRGVmMyk7CisgICAgdXNlKCZ3aXRob3V0TGlua2FnZURlZjQpOyB1c2UoJndpdGhvdXRMaW5rYWdlRGVmNSk7CisgIH0KKworICB2b2lkIGxvY2FsKCkgeworICAgIC8vIEZJWE1FOiBUaGlzIGlzIGlsbC1mb3JtZWQuCisgICAgZXh0ZXJuIFdpdGhvdXRMaW5rYWdlMSB3aXRob3V0TGlua2FnZUxvY2FsOworICB9Cit9CisKK25hbWVzcGFjZSBkcjM5MCB7IC8vIGRyMzkwOiB5ZXMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgc3RydWN0IEEgeworICAgIEEoKSB7IGYoKTsgfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbCB0byBwdXJlIHZpcnR9fQorICAgIHZpcnR1YWwgdm9pZCBmKCkgPSAwOyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19CisgICAgdmlydHVhbCB+QSgpID0gMDsKKyAgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gQTxUPjo6fkEoKSB7IFQ6OmVycm9yOyB9IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGJlIHVzZWQgcHJpb3IgdG99fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIEE8VD46OmYoKSB7IFQ6OmVycm9yOyB9IC8vIG9rLCBub3Qgb2RyLXVzZWQKKyAgc3RydWN0IEIgOiBBPGludD4geyAvLyBleHBlY3RlZC1ub3RlIDJ7e2luIGluc3RhbnRpYXRpb24gb2Z9fQorICAgIHZvaWQgZigpIHt9CisgIH0gYjsKK30KKworbmFtZXNwYWNlIGRyMzkxIHsgLy8gZHIzOTE6IHllcyBjKysxMQorICAvLyBGSVhNRTogU2hvdWxkIHRoaXMgYXBwbHkgdG8gQysrOTggdG9vPworICBjbGFzcyBBIHsgQShjb25zdCBBJik7IH07IC8vIGV4cGVjdGVkLW5vdGUgMC0xe3toZXJlfX0KKyAgQSBmYSgpOworICBjb25zdCBBICZhID0gZmEoKTsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTIge3tDKys5OCByZXF1aXJlcyBhbiBhY2Nlc3NpYmxlIGNvcHkgY29uc3RydWN0b3J9fQorI2VuZGlmCisKKyAgc3RydWN0IEIgeyBCKGNvbnN0IEImKSA9IGRlbGV0ZTsgfTsgLy8gZXhwZWN0ZWQtZXJyb3IgMC0xe3tleHRlbnNpb259fSBleHBlY3RlZC1ub3RlIDAtMXt7aGVyZX19CisgIEIgZmIoKTsKKyAgY29uc3QgQiAmYiA9IGZiKCk7CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIC8vIGV4cGVjdGVkLWVycm9yQC0yIHt7ZGVsZXRlZH19CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgQyB7CisgICAgQyhjb25zdCBDJikgeyBUOjplcnJvcjsgfQorICB9OworICBDPGludD4gZmMoKTsKKyAgY29uc3QgQzxpbnQ+ICZjID0gZmMoKTsKK30KKworLy8gZHIzOTIgRklYTUUgd3JpdGUgY29kZWdlbiB0ZXN0CisvLyBkcjM5NDogbmEKKworbmFtZXNwYWNlIGRyMzk1IHsgLy8gZHIzOTU6IHllcworICBzdHJ1Y3QgUyB7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOPigmb3BlcmF0b3IgVCgpKVtOXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3ttdXN0IHVzZSBhIHR5cGVkZWZ9fQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTj4gb3BlcmF0b3IoVCAoJilbTl0pKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0gZXhwZWN0ZWQtZXJyb3IgK3t7fX0KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gb3BlcmF0b3IgVCAqKCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiBvcGVyYXRvciBUIFU6OiooKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IG9wZXJhdG9yIFQgKFU6OiopKCkoKSBjb25zdCB7IHJldHVybiAwOyB9IC8vIGV4cGVjdGVkLWVycm9yICt7e319CisgIH07CisKKyAgc3RydWN0IG51bGwxX3QgeworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBzdHJ1Y3QgcHRyX21lbV9mdW5fdCB7CisgICAgICB0eXBlZGVmIFQgKFU6Oip0eXBlKSgpOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgICBvcGVyYXRvciB0eXBlbmFtZSBwdHJfbWVtX2Z1bl90PFQsIFU+Ojp0eXBlKCkgY29uc3QgeyAvLyBleHBlY3RlZC1ub3RlIHt7Y291bGRuJ3QgaW5mZXJ9fQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IG51bGwxOworICBpbnQgKFM6OipwKSgpID0gbnVsbDE7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gdmlhYmxlIGNvbnZlcnNpb259fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB1c2luZyBpZCA9IFQ7IC8vIGV4cGVjdGVkLWVycm9yIDAtMXt7ZXh0ZW5zaW9ufX0KKworICBzdHJ1Y3QgVCB7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBOPiBvcGVyYXRvciBpZDxUW05dPiAmKCk7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IG9wZXJhdG9yIGlkPFQgKFU6OiopKCk+KCkgY29uc3Q7CisgIH07CisKKyAgc3RydWN0IG51bGwyX3QgeworICAgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+IHVzaW5nIHB0cl9tZW1fZnVuX3QgPSBUIChVOjoqKSgpOyAvLyBleHBlY3RlZC1lcnJvciAwLTF7e2V4dGVuc2lvbn19CisgICAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4gb3BlcmF0b3IgcHRyX21lbV9mdW5fdDxULCBVPigpIGNvbnN0IHsgcmV0dXJuIDA7IH07CisgIH0gbnVsbDI7CisgIGludCAoUzo6KnEpKCkgPSBudWxsMjsKK30KKworbmFtZXNwYWNlIGRyMzk2IHsgLy8gZHIzOTY6IHllcworICB2b2lkIGYoKSB7CisgICAgYXV0byBpbnQgYSgpOyAvLyBleHBlY3RlZC1lcnJvciB7e3N0b3JhZ2UgY2xhc3Mgb24gZnVuY3Rpb259fQorICAgIGludCAoaSk7IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91c319CisgICAgYXV0byBpbnQgKGkpOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlZGVmaW5pdGlvbn19CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLyBleHBlY3RlZC1lcnJvckAtNCB7eydhdXRvJyBzdG9yYWdlIGNsYXNzfX0gZXhwZWN0ZWQtZXJyb3JALTIge3snYXV0bycgc3RvcmFnZSBjbGFzc319CisjZW5kaWYKKyAgfQorfQorCisvLyBkcjM5Nzogc3VwIDE4MjMKKworbmFtZXNwYWNlIGRyMzk4IHsgLy8gZHIzOTg6IHllcworICBuYW1lc3BhY2UgZXhhbXBsZTEgeworICAgIHN0cnVjdCBTIHsKKyAgICAgIHN0YXRpYyBpbnQgY29uc3QgSSA9IDQyOworICAgIH07CisgICAgdGVtcGxhdGUgPGludCBOPiBzdHJ1Y3QgWCB7fTsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBmKFg8VDo6ST4gKikge30KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBmKFg8VDo6Sj4gKikge30KKyAgICB2b2lkIGZvbygpIHsgZjxTPigwKTsgfQorICB9CisKKyAgbmFtZXNwYWNlIGV4YW1wbGUyIHsKKyAgICB0ZW1wbGF0ZSA8aW50IEk+IHN0cnVjdCBYIHt9OworICAgIHRlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3M+IHN0cnVjdCBaIHt9OworICAgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGYodHlwZW5hbWUgVDo6WSAqKSB7fSAvLyBleHBlY3RlZC1ub3RlIDJ7e3N1YnN0aXR1dGlvbiBmYWlsdXJlfX0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBnKFg8VDo6Tj4gKikge30gLy8gZXhwZWN0ZWQtbm90ZSB7e3N1YnN0aXR1dGlvbiBmYWlsdXJlfX0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBoKFo8VDo6dGVtcGxhdGUgVFQ+ICopIHt9IC8vIGV4cGVjdGVkLW5vdGUge3tzdWJzdGl0dXRpb24gZmFpbHVyZX19CisgICAgc3RydWN0IEEge307CisgICAgc3RydWN0IEIgeworICAgICAgaW50IFk7CisgICAgfTsKKyAgICBzdHJ1Y3QgQyB7CisgICAgICB0eXBlZGVmIGludCBOOworICAgIH07CisgICAgc3RydWN0IEQgeworICAgICAgdHlwZWRlZiBpbnQgVFQ7CisgICAgfTsKKworICAgIHZvaWQgdGVzdCgpIHsKKyAgICAgIGY8QT4oMCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWF0Y2hpbmcgZnVuY3Rpb259fQorICAgICAgZjxCPigwKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaGluZyBmdW5jdGlvbn19CisgICAgICBnPEM+KDApOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1hdGNoaW5nIGZ1bmN0aW9ufX0KKyAgICAgIGg8RD4oMCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWF0Y2hpbmcgZnVuY3Rpb259fQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZHJzL2RyNDEyLmNwcCBiL3Rlc3QvQ1hYL2Rycy9kcjQxMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzM2UyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ1hYL2Rycy9kcjQxMi5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrOTggJXMgLXZlcmlmeSAtZmV4Y2VwdGlvbnMgLWZjeHgtZXhjZXB0aW9ucyAtcGVkYW50aWMtZXJyb3JzIC1ETk9FWENFUFQ9InRocm93KCkiIC1EQkFEX0FMTE9DPSJ0aHJvdyhzdGQ6OmJhZF9hbGxvYykiCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAlcyAtdmVyaWZ5IC1mZXhjZXB0aW9ucyAtZmN4eC1leGNlcHRpb25zIC1wZWRhbnRpYy1lcnJvcnMgLUROT0VYQ0VQVD1ub2V4Y2VwdCAtREJBRF9BTExPQz0KKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzF5ICVzIC12ZXJpZnkgLWZleGNlcHRpb25zIC1mY3h4LWV4Y2VwdGlvbnMgLXBlZGFudGljLWVycm9ycyAtRE5PRVhDRVBUPW5vZXhjZXB0IC1EQkFEX0FMTE9DPQorCisvLyBkcjQxMjogeWVzCisvLyBsd2c0MDQ6IHllcworLy8gbHdnMjM0MDogeWVzCisKKy8vIEZJWE1FOiBfX1NJWkVfVFlQRV9fIGV4cGFuZHMgdG8gJ2xvbmcgbG9uZycgb24gc29tZSB0YXJnZXRzLgorX19leHRlbnNpb25fXyB0eXBlZGVmIF9fU0laRV9UWVBFX18gc2l6ZV90OworbmFtZXNwYWNlIHN0ZCB7IHN0cnVjdCBiYWRfYWxsb2Mge307IH0KKworaW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QpIEJBRF9BTExPQzsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW5ub3QgYmUgZGVjbGFyZWQgJ2lubGluZSd9fQoraW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ld1tdKHNpemVfdCkgQkFEX0FMTE9DOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBiZSBkZWNsYXJlZCAnaW5saW5lJ319CitpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopIE5PRVhDRVBUOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBiZSBkZWNsYXJlZCAnaW5saW5lJ319CitpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKikgTk9FWENFUFQ7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGJlIGRlY2xhcmVkICdpbmxpbmUnfX0KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDE0MDJMCitpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIHNpemVfdCkgTk9FWENFUFQ7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGJlIGRlY2xhcmVkICdpbmxpbmUnfX0KK2lubGluZSB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqLCBzaXplX3QpIE5PRVhDRVBUOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBiZSBkZWNsYXJlZCAnaW5saW5lJ319CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2Rycy9kcjR4eC5jcHAgYi90ZXN0L0NYWC9kcnMvZHI0eHguY3BwCmluZGV4IDFkM2I5NDAuLmRlODVhZWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2Rycy9kcjR4eC5jcHAKKysrIGIvdGVzdC9DWFgvZHJzL2RyNHh4LmNwcApAQCAtMSw2ICsxLDE0MCBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrOTggJXMgLXZlcmlmeSAtZmV4Y2VwdGlvbnMgLWZjeHgtZXhjZXB0aW9ucyAtcGVkYW50aWMtZXJyb3JzCiAvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAlcyAtdmVyaWZ5IC1mZXhjZXB0aW9ucyAtZmN4eC1leGNlcHRpb25zIC1wZWRhbnRpYy1lcnJvcnMKLS8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxeSAlcyAtdmVyaWZ5IC1mZXhjZXB0aW9ucyAtZmN4eC1leGNlcHRpb25zIC1wZWRhbnRpYy1lcnJvcnMKKworLy8gRklYTUU6IF9fU0laRV9UWVBFX18gZXhwYW5kcyB0byAnbG9uZyBsb25nJyBvbiBzb21lIHRhcmdldHMuCitfX2V4dGVuc2lvbl9fIHR5cGVkZWYgX19TSVpFX1RZUEVfXyBzaXplX3Q7CisKK25hbWVzcGFjZSBzdGQgeyBzdHJ1Y3QgdHlwZV9pbmZvOyB9CisKK25hbWVzcGFjZSBkcjQwMCB7IC8vIGRyNDAwOiB5ZXMKKyAgc3RydWN0IEEgeyBpbnQgYTsgc3RydWN0IGEge307IH07IC8vIGV4cGVjdGVkLW5vdGUgMnt7Y29uZmxpY3Rpbmd9fSBleHBlY3RlZC1ub3RlIHt7YW1iaWd1b3VzfX0KKyAgc3RydWN0IEIgeyBpbnQgYTsgc3RydWN0IGEge307IH07IC8vIGV4cGVjdGVkLW5vdGUgMnt7dGFyZ2V0fX0gZXhwZWN0ZWQtbm90ZSB7e2FtYmlndW91c319CisgIHN0cnVjdCBDIDogQSwgQiB7IHVzaW5nIEE6OmE7IHN0cnVjdCBhIGI7IH07CisgIHN0cnVjdCBEIDogQSwgQiB7IHVzaW5nIEE6OmE7IHVzaW5nIEI6OmE7IHN0cnVjdCBhIGI7IH07IC8vIGV4cGVjdGVkLWVycm9yIDJ7e2NvbmZsaWN0c319CisgIHN0cnVjdCBFIDogQSwgQiB7IHN0cnVjdCBhIGI7IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7Zm91bmQgaW4gbXVsdGlwbGUgYmFzZSBjbGFzc2VzfX0KK30KKworbmFtZXNwYWNlIGRyNDAxIHsgLy8gZHI0MDE6IHllcworICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVID0gdHlwZW5hbWUgVDo6dHlwZT4gY2xhc3MgQSA6IHB1YmxpYyBUIHt9OyAvLyBleHBlY3RlZC1lcnJvciB7e3Byb3RlY3RlZH19IGV4cGVjdGVkLWVycm9yIDJ7e3ByaXZhdGV9fQorCisgIGNsYXNzIEIgeworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiBpbnQgdHlwZTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Byb3RlY3RlZH19CisgIH07CisKKyAgY2xhc3MgQyB7CisgICAgdHlwZWRlZiBpbnQgdHlwZTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByaXZhdGV9fQorICAgIGZyaWVuZCBjbGFzcyBBPEM+OyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVmYXVsdCBhcmd1bWVudH19CisgIH07CisKKyAgY2xhc3MgRCB7CisgICAgdHlwZWRlZiBpbnQgdHlwZTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByaXZhdGV9fQorICAgIGZyaWVuZCBjbGFzcyBBPEQsIGludD47CisgIH07CisKKyAgQTxCPiAqYjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlZmF1bHQgYXJndW1lbnR9fQorICAvLyBGSVhNRTogV2UncmUgbWlzc2luZyB0aGUgImluIGluc3RhbnRpYXRpb24gb2YiIG5vdGUgZm9yIHRoZSBkZWZhdWx0CisgIC8vIGFyZ3VtZW50IGhlcmUuCisgIEE8RD4gKmQ7CisKKyAgc3RydWN0IEUgeworICAgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFUgPSB0eXBlbmFtZSBUOjp0eXBlPiBjbGFzcyBBIDogcHVibGljIFQge307CisgIH07CisgIGNsYXNzIEYgeworICAgIHR5cGVkZWYgaW50IHR5cGU7CisgICAgZnJpZW5kIGNsYXNzIEU7CisgIH07CisgIEU6OkE8Rj4gZWFmOyAvLyBvaywgZGVmYXVsdCBhcmd1bWVudCBpcyBpbiBiZWZyaWVuZGVkIGNvbnRleHQKKworICAvLyBGSVhNRTogV2h5IGRvIHdlIGdldCBkaWZmZXJlbnQgZGlhZ25vc3RpY3MgaW4gQysrMTEgb253YXJkcyBoZXJlPyBXZSBzZWVtCisgIC8vIHRvIG5vdCB0cmVhdCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudCBhcyBhIFNGSU5BRSBjb250ZXh0IGluIEMrKzk4LgorICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVID0gdHlwZW5hbWUgVDo6dHlwZT4gdm9pZCBmKFQpIHt9CisgIHZvaWQgZyhCIGIpIHsgZihiKTsgfQorI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAvLyBleHBlY3RlZC1lcnJvckAtMyAwLTF7e2V4dGVuc2lvbn19IGV4cGVjdGVkLWVycm9yQC0zIHt7cHJvdGVjdGVkfX0gZXhwZWN0ZWQtbm90ZUAtMyB7e2luc3RhbnRpYXRpb259fQorICAvLyBleHBlY3RlZC1ub3RlQC0zIHt7c3Vic3RpdHV0aW5nfX0KKyNlbHNlCisgIC8vIGV4cGVjdGVkLWVycm9yQC01IHt7bm8gbWF0Y2hpbmd9fSBleHBlY3RlZC1ub3RlQC02IHt7cHJvdGVjdGVkfX0KKyNlbmRpZgorfQorCituYW1lc3BhY2UgZHI0MDMgeyAvLyBkcjQwMzogeWVzCisgIG5hbWVzcGFjZSBBIHsKKyAgICBzdHJ1Y3QgUyB7fTsKKyAgICBpbnQgZih2b2lkKik7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFgge307CisgIHR5cGVkZWYgc3RydWN0IFg8QTo6Uz46OlggWFM7CisgIFhTICpwOworICBpbnQgayA9IGYocCk7IC8vIG9rLCBmaW5kcyBBOjpmLCBldmVuIHRob3VnaCB0eXBlIFhTIGlzIGEgdHlwZWRlZi1uYW1lCisgICAgICAgICAgICAgICAgLy8gcmVmZXJyaW5nIHRvIGFuIGVsYWJvcmF0ZWQtdHlwZS1zcGVjaWZpZXIgbmFtaW5nIGEKKyAgICAgICAgICAgICAgICAvLyBpbmplY3RlZC1jbGFzcy1uYW1lLCB3aGljaCBpcyBhYm91dCBhcyBmYXIgZnJvbSBhCisgICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUtaWQgYXMgd2UgY2FuIG1ha2UgaXQuCit9CisKKy8vIGRyNDA0OiBuYQorLy8gKE5COiBhbHNvIHN1cCA1OTQpCisKK25hbWVzcGFjZSBkcjQwNiB7IC8vIGRyNDA2OiB5ZXMKKyAgdHlwZWRlZiBzdHJ1Y3QgeworICAgIHN0YXRpYyBpbnQgbjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tzdGF0aWMgZGF0YSBtZW1iZXIgJ24nIG5vdCBhbGxvd2VkIGluIGFub255bW91cyBzdHJ1Y3R9fQorICB9IEE7Cit9CisKK25hbWVzcGFjZSBkcjQwNyB7IC8vIGRyNDA3OiBubworICBzdHJ1Y3QgUzsKKyAgdHlwZWRlZiBzdHJ1Y3QgUyBTOworICB2b2lkIGYoKSB7CisgICAgc3RydWN0IFMgKnA7CisgICAgeworICAgICAgdHlwZWRlZiBzdHJ1Y3QgUyBTOyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19CisgICAgICBzdHJ1Y3QgUyAqcDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZWZlcnMgdG8gYSB0eXBlZGVmfX0KKyAgICB9CisgIH0KKyAgc3RydWN0IFMge307CisKKyAgbmFtZXNwYWNlIFVzaW5nRGlyIHsKKyAgICBuYW1lc3BhY2UgQSB7CisgICAgICBzdHJ1Y3QgUyB7fTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvdW5kfX0KKyAgICB9CisgICAgbmFtZXNwYWNlIEIgeworICAgICAgdHlwZWRlZiBpbnQgUzsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvdW5kfX0KKyAgICB9CisgICAgbmFtZXNwYWNlIEMgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIEE7CisgICAgICB1c2luZyBuYW1lc3BhY2UgQjsKKyAgICAgIHN0cnVjdCBTIHM7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW1iaWd1b3VzfX0KKyAgICB9CisgICAgbmFtZXNwYWNlIEQgeworICAgICAgLy8gRklYTUU6IFRoaXMgaXMgdmFsaWQuCisgICAgICB1c2luZyBBOjpTOworICAgICAgdHlwZWRlZiBzdHJ1Y3QgUyBTOyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19CisgICAgICBzdHJ1Y3QgUyBzOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlZmVycyB0byBhIHR5cGVkZWZ9fQorICAgIH0KKyAgICBuYW1lc3BhY2UgRSB7CisgICAgICAvLyBGSVhNRTogVGhlIHN0YW5kYXJkIGRvZXNuJ3Qgc2F5IHdoZXRoZXIgdGhpcyBpcyB2YWxpZC4KKyAgICAgIHR5cGVkZWYgQTo6UyBTOworICAgICAgdXNpbmcgQTo6UzsKKyAgICAgIHN0cnVjdCBTIHM7CisgICAgfQorICAgIG5hbWVzcGFjZSBGIHsKKyAgICAgIHR5cGVkZWYgQTo6UyBTOyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19CisgICAgfQorICAgIC8vIEZJWE1FOiBUaGUgc3RhbmRhcmQgZG9lc24ndCBzYXkgd2hhdCB0byBkbyBpbiB0aGVzZSBjYXNlcywgYnV0CisgICAgLy8gb3VyIGJlaGF2aW9yIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiB0aGUgdXNpbmctZGlyZWN0aXZlcy4KKyAgICBuYW1lc3BhY2UgRyB7CisgICAgICB1c2luZyBuYW1lc3BhY2UgQTsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBGOworICAgICAgc3RydWN0IFMgczsKKyAgICB9CisgICAgbmFtZXNwYWNlIEggeworICAgICAgdXNpbmcgbmFtZXNwYWNlIEY7CisgICAgICB1c2luZyBuYW1lc3BhY2UgQTsKKyAgICAgIHN0cnVjdCBTIHM7IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVmZXJzIHRvIGEgdHlwZWRlZn19CisgICAgfQorICB9Cit9CiAKIG5hbWVzcGFjZSBkcjQwOCB7IC8vIGRyNDA4OiAzLjQKICAgdGVtcGxhdGU8aW50IE4+IHZvaWQgZygpIHsgaW50IGFycltOICE9IDEgPyAxIDogLTFdOyB9CkBAIC0zMCwzICsxNjQsMTA1MiBAQAogICB0ZW1wbGF0ZTw+IGludCBSPGludD46OmFyclsyXTsKICAgdGVtcGxhdGUgdm9pZCBSPGludD46OmYoKTsKIH0KKworbmFtZXNwYWNlIGRyNDA5IHsgLy8gZHI0MDk6IHllcworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQSB7CisgICAgdHlwZWRlZiBpbnQgQjsKKyAgICBCIGIxOworICAgIEE6OkIgYjI7CisgICAgQTxUPjo6QiBiMzsKKyAgICBBPFQqPjo6QiBiNDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3ttaXNzaW5nICd0eXBlbmFtZSd9fQorICB9OworfQorCituYW1lc3BhY2UgZHI0MTAgeyAvLyBkcjQxMDogbm8KKyAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBmKFQpOworICB2b2lkIGcoaW50KTsKKyAgbmFtZXNwYWNlIE0geworICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgaChUKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGkoVCk7CisgICAgc3RydWN0IEEgeworICAgICAgZnJpZW5kIHZvaWQgZjw+KGludCk7CisgICAgICBmcmllbmQgdm9pZCBoPD4oaW50KTsKKyAgICAgIGZyaWVuZCB2b2lkIGcoaW50KTsKKyAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgaShUKTsKKyAgICAgIGZyaWVuZCB2b2lkIGk8PihpbnQpOworICAgIHByaXZhdGU6CisgICAgICBzdGF0aWMgdm9pZCB6KCk7IC8vIGV4cGVjdGVkLW5vdGUge3twcml2YXRlfX0KKyAgICB9OworCisgICAgdGVtcGxhdGU8PiB2b2lkIGgoaW50KSB7IEE6OnooKTsgfQorICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBpbGwtZm9ybWVkLiBUaGUgbWVtYmVyIEE6Omk8PiBpcyBiZWZyaWVuZGVkLAorICAgIC8vIG5vdCB0aGlzIGZ1bmN0aW9uLgorICAgIHRlbXBsYXRlPD4gdm9pZCBpKGludCkgeyBBOjp6KCk7IH0KKyAgfQorICB0ZW1wbGF0ZTw+IHZvaWQgZihpbnQpIHsgTTo6QTo6eigpOyB9CisgIHZvaWQgZyhpbnQpIHsgTTo6QTo6eigpOyB9IC8vIGV4cGVjdGVkLWVycm9yIHt7cHJpdmF0ZX19Cit9CisKKy8vIGRyNDEyIGlzIGluIGl0cyBvd24gZmlsZS4KKworbmFtZXNwYWNlIGRyNDEzIHsgLy8gZHI0MTM6IHllcworICBzdHJ1Y3QgUyB7CisgICAgaW50IGE7CisgICAgaW50IDogMTc7CisgICAgaW50IGI7CisgIH07CisgIFMgcyA9IHsgMSwgMiwgMyB9OyAvLyBleHBlY3RlZC1lcnJvciB7e2V4Y2VzcyBlbGVtZW50c319CisKKyAgc3RydWN0IEUge307CisgIHN0cnVjdCBUIHsgLy8gZXhwZWN0ZWQtbm90ZSB7e2hlcmV9fQorICAgIGludCBhOworICAgIEUgZTsKKyAgICBpbnQgYjsKKyAgfTsKKyAgVCB0MSA9IHsgMSwge30sIDIgfTsKKyAgVCB0MiA9IHsgMSwgMiB9OyAvLyBleHBlY3RlZC1lcnJvciB7e2FnZ3JlZ2F0ZSB3aXRoIG5vIGVsZW1lbnRzIHJlcXVpcmVzIGV4cGxpY2l0IGJyYWNlc319Cit9CisKK25hbWVzcGFjZSBkcjQxNCB7IC8vIGRyNDE0OiBkdXAgMzA1CisgIHN0cnVjdCBYIHt9OworICB2b2lkIGYoKSB7CisgICAgWCB4OworICAgIHN0cnVjdCBYIHt9OworICAgIHguflgoKTsKKyAgfQorfQorCituYW1lc3BhY2UgZHI0MTUgeyAvLyBkcjQxNTogeWVzCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZihULCAuLi4pIHsgVDo6ZXJyb3I7IH0KKyAgdm9pZCBmKGludCwgaW50KTsKKyAgdm9pZCBnKCkgeyBmKDAsIDApOyB9IC8vIG9rCit9CisKK25hbWVzcGFjZSBkcjQxNiB7IC8vIGRyNDE2OiB5ZXMKKyAgZXh0ZXJuIHN0cnVjdCBBIGE7CisgIGludCAmb3BlcmF0b3IrKGNvbnN0IEEmLCBjb25zdCBBJik7CisgIGludCAmayA9IGEgKyBhOworICBzdHJ1Y3QgQSB7IGZsb2F0ICZvcGVyYXRvcisoQSYpOyB9OworICBmbG9hdCAmZiA9IGEgKyBhOworfQorCituYW1lc3BhY2UgZHI0MTcgeyAvLyBkcjQxNzogbm8KKyAgc3RydWN0IEE7CisgIHN0cnVjdCBkcjQxNzo6QSB7fTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHF1YWxpZmljYXRpb259fQorICBzdHJ1Y3QgQiB7IHN0cnVjdCBYOyB9OworICBzdHJ1Y3QgQyA6IEIge307CisgIHN0cnVjdCBDOjpYIHt9OyAvLyBleHBlY3RlZC1lcnJvciB7e25vIHN0cnVjdCBuYW1lZCAnWCcgaW4gJ2RyNDE3OjpDJ319CisgIHN0cnVjdCBCOjpYIHsgc3RydWN0IFk7IH07CisgIHN0cnVjdCBDOjpYOjpZIHt9OyAvLyBvayEKKyAgbmFtZXNwYWNlIE4geworICAgIHN0cnVjdCBEOworICAgIHN0cnVjdCBFOworICAgIHN0cnVjdCBGOworICAgIHN0cnVjdCBIOworICB9CisgIC8vIEZJWE1FOiBUaGlzIGlzIGlsbC1mb3JtZWQuCisgIHVzaW5nIE46OkQ7CisgIHN0cnVjdCBkcjQxNzo6RCB7fTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHF1YWxpZmljYXRpb259fQorICB1c2luZyBuYW1lc3BhY2UgTjsKKyAgc3RydWN0IGRyNDE3OjpFIHt9OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgcXVhbGlmaWNhdGlvbn19IGV4cGVjdGVkLWVycm9yIHt7bm8gc3RydWN0IG5hbWVkICdFJ319CisgIHN0cnVjdCBOOjpGIHt9OworICBzdHJ1Y3QgRzsKKyAgdXNpbmcgTjo6SDsKKyAgbmFtZXNwYWNlIE0geworICAgIHN0cnVjdCBkcjQxNzo6RyB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tuYW1lc3BhY2UgJ00nIGRvZXMgbm90IGVuY2xvc2V9fQorICAgIHN0cnVjdCBkcjQxNzo6SCB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tuYW1lc3BhY2UgJ00nIGRvZXMgbm90IGVuY2xvc2V9fQorICB9Cit9CisKK25hbWVzcGFjZSBkcjQyMCB7IC8vIGRyNDIwOiB5ZXMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHB0ciB7CisgICAgVCAqb3BlcmF0b3ItPigpIGNvbnN0OworICAgIFQgJm9wZXJhdG9yKigpIGNvbnN0OworICB9OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBQPiB2b2lkIHRlc3QoUCBwKSB7CisgICAgcC0+flQoKTsKKyAgICBwLT5UOjp+VCgpOworICAgICgqcCkuflQoKTsKKyAgICAoKnApLlQ6On5UKCk7CisgIH0KKyAgc3RydWN0IFgge307CisgIHRlbXBsYXRlIHZvaWQgdGVzdDxpbnQ+KGludCopOworICB0ZW1wbGF0ZSB2b2lkIHRlc3Q8aW50PihwdHI8aW50Pik7CisgIHRlbXBsYXRlIHZvaWQgdGVzdDxYPihYKik7CisgIHRlbXBsYXRlIHZvaWQgdGVzdDxYPihwdHI8WD4pOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHZvaWQgdGVzdDIoVCBwKSB7CisgICAgcC0+dGVtcGxhdGUgWTxpbnQ+Ojp+WTxpbnQ+KCk7CisgICAgcC0+flk8aW50PigpOworICAgIC8vIEZJWE1FOiBUaGlzIGlzIGlsbC1mb3JtZWQsIGJ1dCB0aGlzIGRpYWdub3N0aWMgaXMgdGVycmlibGUuIFdlIHNob3VsZAorICAgIC8vIHJlamVjdCB0aGlzIGluIHRoZSBwYXJzZXIuCisgICAgcC0+dGVtcGxhdGUgflk8aW50PigpOyAvLyBleHBlY3RlZC1lcnJvciAye3tubyBtZW1iZXIgbmFtZWQgJ350eXBlbmFtZSBZPGludD4nfX0KKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWSB7fTsKKyAgdGVtcGxhdGUgdm9pZCB0ZXN0MihZPGludD4qKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2luc3RhbnRpYXRpb259fQorICB0ZW1wbGF0ZSB2b2lkIHRlc3QyKHB0cjxZPGludD4gPik7IC8vIGV4cGVjdGVkLW5vdGUge3tpbnN0YW50aWF0aW9ufX0KKworICB2b2lkIHRlc3QzKGludCAqcCwgcHRyPGludD4gcSkgeworICAgIHR5cGVkZWYgaW50IEludDsKKyAgICBwLT5+SW50KCk7CisgICAgcS0+fkludCgpOworICAgIHAtPkludDo6fkludCgpOworICAgIHEtPkludDo6fkludCgpOworICB9CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHVzaW5nIGlkID0gVDsKKyAgc3RydWN0IEEgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB1c2luZyBpZCA9IFQ7IH07CisgIHZvaWQgdGVzdDQoaW50ICpwLCBwdHI8aW50PiBxKSB7CisgICAgcC0+fmlkPGludD4oKTsKKyAgICBxLT5+aWQ8aW50PigpOworICAgIHAtPmlkPGludD46On5pZDxpbnQ+KCk7CisgICAgcS0+aWQ8aW50Pjo6fmlkPGludD4oKTsKKyAgICBwLT50ZW1wbGF0ZSBpZDxpbnQ+Ojp+aWQ8aW50PigpOyAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIHVucXVhbGlmaWVkLWlkfX0KKyAgICBxLT50ZW1wbGF0ZSBpZDxpbnQ+Ojp+aWQ8aW50PigpOyAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIHVucXVhbGlmaWVkLWlkfX0KKyAgICBwLT5BOjp0ZW1wbGF0ZSBpZDxpbnQ+Ojp+aWQ8aW50PigpOworICAgIHEtPkE6OnRlbXBsYXRlIGlkPGludD46On5pZDxpbnQ+KCk7CisgIH0KKyNlbmRpZgorfQorCituYW1lc3BhY2UgZHI0MjEgeyAvLyBkcjQyMTogeWVzCisgIHN0cnVjdCBYIHsgWCgpOyBpbnQgbjsgaW50ICZyOyB9OworICBpbnQgKnAgPSAmWCgpLm47IC8vIGV4cGVjdGVkLWVycm9yIHt7dGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgdGVtcG9yYXJ5fX0KKyAgaW50ICpxID0gJlgoKS5yOworfQorCituYW1lc3BhY2UgZHI0MjIgeyAvLyBkcjQyMjogeWVzCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHZvaWQgZigpIHsKKyAgICB0eXBlZGVmIFQgdHlwZTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZ9fQorICAgIHR5cGVkZWYgVSB0eXBlOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlZGVmfX0KKyAgfQorICB0ZW1wbGF0ZSB2b2lkIGY8aW50LCBpbnQ+KCk7CisgIHRlbXBsYXRlIHZvaWQgZjxpbnQsIGNoYXI+KCk7IC8vIGV4cGVjdGVkLW5vdGUge3tpbnN0YW50aWF0aW9ufX0KK30KKworbmFtZXNwYWNlIGRyNDIzIHsgLy8gZHI0MjM6IHllcworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7IG9wZXJhdG9yIFQmKCk7IH07CisgIHZvaWQgZihYPGludD4geCkgeyB4ICs9IDE7IH0KK30KKworbmFtZXNwYWNlIGRyNDI0IHsgLy8gZHI0MjQ6IHllcworICBzdHJ1Y3QgQSB7CisgICAgdHlwZWRlZiBpbnQgTjsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KKyAgICB0eXBlZGVmIGludCBOOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlZGVmaW5pdGlvbn19CisKKyAgICBzdHJ1Y3QgWDsKKyAgICB0eXBlZGVmIFggWDsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KKyAgICBzdHJ1Y3QgWCB7fTsKKworICAgIHN0cnVjdCBYICpwOworICAgIHN0cnVjdCBBOjpYICpxOworICAgIFggKnI7CisKKyAgICB0eXBlZGVmIFggWDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZWRlZmluaXRpb259fQorICB9OworICBzdHJ1Y3QgQiB7CisgICAgdHlwZWRlZiBpbnQgTjsKKyAgfTsKKyAgc3RydWN0IEMgOiBCIHsKKyAgICB0eXBlZGVmIGludCBOOyAvLyBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXN9fQorICAgIHR5cGVkZWYgaW50IE47IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVkZWZpbml0aW9ufX0KKyAgfTsKK30KKworbmFtZXNwYWNlIGRyNDI1IHsgLy8gZHI0MjU6IHllcworICBzdHJ1Y3QgQSB7IHRlbXBsYXRlPHR5cGVuYW1lIFQ+IG9wZXJhdG9yIFQoKSBjb25zdDsgfSBhOworICBmbG9hdCBmID0gMS4wZiAqIGE7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW1iaWd1b3VzfX0gZXhwZWN0ZWQtbm90ZSA1K3t7YnVpbHQtaW4gY2FuZGlkYXRlfX0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNfZmxvYXQ7CisgIHRlbXBsYXRlPD4gc3RydWN0IGlzX2Zsb2F0PGZsb2F0PiB7IHR5cGVkZWYgdm9pZCB0eXBlOyB9OworCisgIHN0cnVjdCBCIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVID0gdHlwZW5hbWUgaXNfZmxvYXQ8VD46OnR5cGU+IG9wZXJhdG9yIFQoKSBjb25zdDsgLy8gZXhwZWN0ZWQtZXJyb3IgMC0xe3tleHRlbnNpb259fQorICB9IGI7CisgIGZsb2F0IGcgPSAxLjBmICogYjsgLy8gb2sKK30KKworbmFtZXNwYWNlIGRyNDI3IHsgLy8gZHI0Mjc6IHllcworICBzdHJ1Y3QgQiB7fTsKKyAgc3RydWN0IEQgOiBwdWJsaWMgQiB7CisgICAgRChCICYpID0gZGVsZXRlOyAvLyBleHBlY3RlZC1lcnJvciAwLTF7e2V4dGVuc2lvbn19IGV4cGVjdGVkLW5vdGUge3tkZWxldGVkfX0KKyAgfTsKKworICBleHRlcm4gRCBkMTsKKyAgQiAmYiA9IGQxOworICBjb25zdCBEICZkMiA9IHN0YXRpY19jYXN0PGNvbnN0IEQmPihiKTsKKyAgY29uc3QgRCAmZDMgPSAoY29uc3QgRCYpYjsKKyAgY29uc3QgRCAmZDQoYik7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZGVsZXRlZH19Cit9CisKK25hbWVzcGFjZSBkcjQyOCB7IC8vIGRyNDI4OiB5ZXMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBtYWtlKCk7CisgIGV4dGVybiBzdHJ1Y3QgWCB4OyAvLyBleHBlY3RlZC1ub3RlIDV7e2ZvcndhcmQgZGVjbGFyYXRpb259fQorICB2b2lkIGYoKSB7CisgICAgdGhyb3cgdm9pZCgpOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCB0aHJvd319CisgICAgdGhyb3cgbWFrZTx2b2lkKj4oKTsKKyAgICB0aHJvdyBtYWtlPGNvbnN0IHZvbGF0aWxlIHZvaWQqPigpOworICAgIHRocm93IHg7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IHRocm93fX0KKyAgICB0aHJvdyBtYWtlPFgmPigpOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCB0aHJvd319CisgICAgdGhyb3cgbWFrZTxYKj4oKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW5ub3QgdGhyb3d9fQorICAgIHRocm93IG1ha2U8Y29uc3Qgdm9sYXRpbGUgWCY+KCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IHRocm93fX0KKyAgICB0aHJvdyBtYWtlPGNvbnN0IHZvbGF0aWxlIFgqPigpOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCB0aHJvd319CisgIH0KK30KKworbmFtZXNwYWNlIGRyNDI5IHsgLy8gZHI0Mjk6IHllcyBjKysxMQorICAvLyBGSVhNRTogVGhpcyBydWxlIGlzIG9idmlvdXNseSBpbnRlbmRlZCB0byBhcHBseSB0byBDKys5OCBhcyB3ZWxsLgorICBzdHJ1Y3QgQSB7CisgICAgc3RhdGljIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHNpemVfdCk7CisgICAgc3RhdGljIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3QpOworICB9ICphID0gbmV3ICgwKSBBOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTIge3snbmV3JyBleHByZXNzaW9uIHdpdGggcGxhY2VtZW50IGFyZ3VtZW50cyByZWZlcnMgdG8gbm9uLXBsYWNlbWVudCAnb3BlcmF0b3IgZGVsZXRlJ319CisgIC8vIGV4cGVjdGVkLW5vdGVALTQge3toZXJlfX0KKyNlbmRpZgorICBzdHJ1Y3QgQiB7CisgICAgc3RhdGljIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHNpemVfdCk7CisgICAgc3RhdGljIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqKTsKKyAgICBzdGF0aWMgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIHNpemVfdCk7CisgIH0gKmIgPSBuZXcgKDApIEI7IC8vIG9rLCBzZWNvbmQgZGVsZXRlIGlzIG5vdCBhIG5vbi1wbGFjZW1lbnQgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uCit9CisKK25hbWVzcGFjZSBkcjQzMCB7IC8vIGRyNDMwOiB5ZXMgYysrMTEKKyAgLy8gcmVzb2x2ZWQgYnkgbjIyMzkKKyAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGFwcGx5IGluIEMrKzk4IHRvby4KKyAgdm9pZCBmKGludCBuKSB7CisgICAgaW50IGFbXSA9IHsgbisrLCBuKyssIG4rKyB9OworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTIge3ttdWx0aXBsZSB1bnNlcXVlbmNlZCBtb2RpZmljYXRpb25zIHRvICduJ319CisjZW5kaWYKKyAgfQorfQorCituYW1lc3BhY2UgZHI0MzEgeyAvLyBkcjQzMTogeWVzCisgIHN0cnVjdCBBIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUICpnZXQoKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQiB7CisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBVICpnZXQoKTsKKyAgICB9OworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZihBIGEpIHsKKyAgICBhLmdldDxBPigpLT5nZXQ8VD4oKTsKKyAgICBhLmdldDxUPigpCisgICAgICAgIC0+Z2V0PFQ+KCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlICd0ZW1wbGF0ZSd9fQorICAgIGEuZ2V0PFQ+KCktPnRlbXBsYXRlIGdldDxUPigpOworICAgIGEuQTo6Z2V0PFQ+KCk7CisgICAgQTo6QjxpbnQ+ICpiID0gYS5nZXQ8QTo6QjxpbnQ+ID4oKTsKKyAgICBiLT5nZXQ8aW50PigpOworICAgIGItPkE6OkI8aW50Pjo6Z2V0PGludD4oKTsKKyAgICBiLT5BOjpCPGludD46OmdldDxUPigpOworICAgIGItPkE6OkI8VD46OmdldDxpbnQ+KCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlICd0ZW1wbGF0ZSd9fQorICAgIGItPkE6OkI8VD46OnRlbXBsYXRlIGdldDxpbnQ+KCk7CisgICAgYi0+QTo6QjxUPjo6Z2V0PFQ+KCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlICd0ZW1wbGF0ZSd9fQorICAgIGItPkE6OkI8VD46OnRlbXBsYXRlIGdldDxUPigpOworICAgIEE6OkI8VD4gKmMgPSBhLmdldDxBOjpCPFQ+ID4oKTsKKyAgICBjLT5nZXQ8aW50PigpOyAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSAndGVtcGxhdGUnfX0KKyAgICBjLT50ZW1wbGF0ZSBnZXQ8aW50PigpOworICB9Cit9CisKK25hbWVzcGFjZSBkcjQzMiB7IC8vIGRyNDMyOiB5ZXMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEEge307CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBCIDogQTxCPiB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZXF1aXJlcyB0ZW1wbGF0ZSBhcmd1bWVudHN9fSBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWR9fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQyA6IEE8QzxUPiA+IHt9OworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEQgOiBkZWNsdHlwZShBPEQ+KCkpIHt9OyAvLyBleHBlY3RlZC1lcnJvciB7e3JlcXVpcmVzIHRlbXBsYXRlIGFyZ3VtZW50c319IGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZH19CisjZW5kaWYKK30KKworbmFtZXNwYWNlIGRyNDMzIHsgLy8gZHI0MzM6IHllcworICB0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgUyB7CisgICAgdm9pZCBmKHVuaW9uIFUqKTsKKyAgfTsKKyAgVSAqcDsKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBTPFQ+OjpmKHVuaW9uIFUqKSB7fQorCisgIFM8aW50PiBzOworfQorCituYW1lc3BhY2UgZHI0MzQgeyAvLyBkcjQzNDogeWVzCisgIHZvaWQgZigpIHsKKyAgICBjb25zdCBpbnQgY2kgPSAwOworICAgIGludCAqcGkgPSAwOworICAgIGNvbnN0IGludCAqJnJwY2kgPSBwaTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW5ub3QgYmluZH19CisgICAgcnBjaSA9ICZjaTsKKyAgICAqcGkgPSAxOworICB9Cit9CisKKy8vIGRyNDM1OiBuYQorCituYW1lc3BhY2UgZHI0MzYgeyAvLyBkcjQzNjogeWVzCisgIGVudW0gRSB7IGYgfTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KKyAgdm9pZCBmKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVkZWZpbml0aW9ufX0KK30KKworbmFtZXNwYWNlIGRyNDM3IHsgLy8gZHI0Mzc6IG5vCisgIC8vIFRoaXMgaXMgc3VwZXJzZWRlZCBieSAxMzA4LCB3aGljaCBpcyBpbiB0dXJuIHN1cGVyc2VkZWQgYnkgMTMzMCwKKyAgLy8gd2hpY2ggcmVzdG9yZXMgdGhpcyBydWxlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzdHJ1Y3QgVCA6IFUge307IC8vIGV4cGVjdGVkLWVycm9yIHt7aW5jb21wbGV0ZX19CisgIHN0cnVjdCBTIHsgLy8gZXhwZWN0ZWQtbm90ZSB7e25vdCBjb21wbGV0ZX19CisgICAgdm9pZCBmKCkgdGhyb3coUyk7CisgICAgdm9pZCBnKCkgdGhyb3coVDxTPik7IC8vIGV4cGVjdGVkLW5vdGUge3tpbiBpbnN0YW50aWF0aW9uIG9mfX0KKyAgICBzdHJ1Y3QgVTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvcndhcmR9fQorICAgIHZvaWQgaCgpIHRocm93KFUpOyAvLyBleHBlY3RlZC1lcnJvciB7e2luY29tcGxldGV9fQorICAgIHN0cnVjdCBVIHt9OworICB9OworfQorCisvLyBkcjQzOCBGSVhNRSB3cml0ZSBhIGNvZGVnZW4gdGVzdAorLy8gZHI0MzkgRklYTUUgd3JpdGUgYSBjb2RlZ2VuIHRlc3QKKy8vIGRyNDQxIEZJWE1FIHdyaXRlIGEgY29kZWdlbiB0ZXN0CisvLyBkcjQ0Mjogc3VwIDM0OAorLy8gZHI0NDM6IG5hCisKK25hbWVzcGFjZSBkcjQ0NCB7IC8vIGRyNDQ0OiB5ZXMKKyAgc3RydWN0IEQ7CisgIHN0cnVjdCBCIHsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZSBpcyB0aGUgaW1wbGljaXQgY29weX19IGV4cGVjdGVkLW5vdGUgMC0xIHt7aW1wbGljaXQgbW92ZX19CisgICAgRCAmb3BlcmF0b3I9KEQgJikgPSBkZWxldGU7IC8vIGV4cGVjdGVkLWVycm9yIDAtMXt7ZXh0ZW5zaW9ufX0gZXhwZWN0ZWQtbm90ZSB7e2RlbGV0ZWR9fQorICB9OworICBzdHJ1Y3QgRCA6IEIgeyAvLyBleHBlY3RlZC1ub3RlIHt7Y2FuZGlkYXRlIGlzIHRoZSBpbXBsaWNpdH19IGV4cGVjdGVkLW5vdGUgMC0xIHt7aW1wbGljaXQgbW92ZX19CisgICAgdXNpbmcgQjo6b3BlcmF0b3I9OworICB9IGV4dGVybiBkOworICB2b2lkIGYoKSB7CisgICAgZCA9IGQ7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZGVsZXRlZH19CisgIH0KK30KKworbmFtZXNwYWNlIGRyNDQ1IHsgLy8gZHI0NDU6IHllcworICBjbGFzcyBBIHsgdm9pZCBmKCk7IH07IC8vIGV4cGVjdGVkLW5vdGUge3twcml2YXRlfX0KKyAgc3RydWN0IEIgeworICAgIGZyaWVuZCB2b2lkIEE6OmYoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcml2YXRlfX0KKyAgfTsKK30KKworbmFtZXNwYWNlIGRyNDQ2IHsgLy8gZHI0NDY6IHllcworICBzdHJ1Y3QgQzsKKyAgc3RydWN0IEEgeworICAgIEEoKTsKKyAgICBBKGNvbnN0IEEmKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtZXJyb3IgMC0xe3tleHRlbnNpb259fSBleHBlY3RlZC1ub3RlICt7e2RlbGV0ZWR9fQorICAgIEEoY29uc3QgQyYpOworICB9OworICBzdHJ1Y3QgQyA6IEEge307CisgIHZvaWQgZihBIGEsIGJvb2wgYiwgQyBjKSB7CisgICAgdm9pZChiID8gYSA6IGEpOworICAgIGIgPyBBKCkgOiBhOyAvLyBleHBlY3RlZC1lcnJvciB7e2RlbGV0ZWR9fQorICAgIGIgPyBhIDogQSgpOyAvLyBleHBlY3RlZC1lcnJvciB7e2RlbGV0ZWR9fQorICAgIGIgPyBBKCkgOiBBKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZGVsZXRlZH19CisKKyAgICB2b2lkKGIgPyBhIDogYyk7CisgICAgYiA/IGEgOiBDKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZGVsZXRlZH19CisgICAgYiA/IGMgOiBBKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZGVsZXRlZH19CisgICAgYiA/IEEoKSA6IEMoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkZWxldGVkfX0KKyAgfQorfQorCituYW1lc3BhY2UgZHI0NDcgeyAvLyBkcjQ0NzogeWVzCisgIHN0cnVjdCBBIHsgaW50IG47IGludCBhWzRdOyB9OworICB0ZW1wbGF0ZTxpbnQ+IHN0cnVjdCBVIHsKKyAgICB0eXBlZGVmIGludCB0eXBlOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFY+IHN0YXRpYyB2b2lkIGgoKTsKKyAgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gVTxzaXplb2YoVCk+IGcoVCk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBOPiB2b2lkIGYoaW50IG4pIHsKKyAgICAvLyBvaywgbm90IHR5cGUgZGVwZW5kZW50CisgICAgZyhfX2J1aWx0aW5fb2Zmc2V0b2YoQSwgbikpLmg8aW50PigpOworICAgIGcoX19idWlsdGluX29mZnNldG9mKFQsIG4pKS5oPGludD4oKTsKKyAgICAvLyB2YWx1ZSBkZXBlbmRlbnQgaWYgZmlyc3QgYXJndW1lbnQgaXMgYSBkZXBlbmRlbnQgdHlwZQorICAgIFU8X19idWlsdGluX29mZnNldG9mKEEsIG4pPjo6dHlwZSBhOworICAgIFU8X19idWlsdGluX29mZnNldG9mKFQsIG4pPjo6dHlwZSBiOyAvLyBleHBlY3RlZC1lcnJvciAre3t9fSBleHBlY3RlZC13YXJuaW5nIDAre3t9fQorICAgIC8vIGFzIGFuIGV4dGVuc2lvbiwgd2UgYWxsb3cgdGhlIG1lbWJlci1kZXNpZ25hdG9yIHRvIGluY2x1ZGUgYXJyYXkgaW5kaWNlcworICAgIGcoX19idWlsdGluX29mZnNldG9mKEEsIGFbMF0pKS5oPGludD4oKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHRlbnNpb259fQorICAgIGcoX19idWlsdGluX29mZnNldG9mKEEsIGFbTl0pKS5oPGludD4oKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHRlbnNpb259fQorICAgIFU8X19idWlsdGluX29mZnNldG9mKEEsIGFbMF0pPjo6dHlwZSBjOyAvLyBleHBlY3RlZC1lcnJvciB7e2V4dGVuc2lvbn19CisgICAgVTxfX2J1aWx0aW5fb2Zmc2V0b2YoQSwgYVtOXSk+Ojp0eXBlIGQ7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXh0ZW5zaW9ufX0gZXhwZWN0ZWQtZXJyb3IgK3t7fX0gZXhwZWN0ZWQtd2FybmluZyAwK3t7fX0KKyAgfQorfQorCituYW1lc3BhY2UgZHI0NDggeyAvLyBkcjQ0ODogeWVzCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBpbnQ+IHZvaWQgZihpbnQpOyAvLyBleHBlY3RlZC1lcnJvciAwLTF7e2V4dGVuc2lvbn19IGV4cGVjdGVkLW5vdGUge3tubyBrbm93biBjb252ZXJzaW9ufX0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBnKFQgdCkgeworICAgIGY8VD4odCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7bmVpdGhlciB2aXNpYmxlIGluIHRoZSB0ZW1wbGF0ZSBkZWZpbml0aW9uIG5vciBmb3VuZCBieSBhcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwfX0KKyAgICBkcjQ0ODo6Zih0KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaGluZyBmdW5jdGlvbn19CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmKFQpOyAvLyBleHBlY3RlZC1ub3RlIHt7c2hvdWxkIGJlIGRlY2xhcmVkIHByaW9yIHRvIHRoZSBjYWxsIHNpdGV9fQorICBuYW1lc3BhY2UgSGlkZUZyb21BREwgeyBzdHJ1Y3QgWCB7fTsgfQorICB0ZW1wbGF0ZSB2b2lkIGcoaW50KTsgLy8gb2sKKyAgdGVtcGxhdGUgdm9pZCBnKEhpZGVGcm9tQURMOjpYKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2luc3RhbnRpYXRpb24gb2Z9fQorfQorCisvLyBkcjQ0OTogbmEKKworbmFtZXNwYWNlIGRyNDUwIHsgLy8gZHI0NTA6IHllcworICB0eXBlZGVmIGludCBBWzNdOworICB2b2lkIGYxKGNvbnN0IEEgJik7CisgIHZvaWQgZjIoQSAmKTsgLy8gZXhwZWN0ZWQtbm90ZSAre3tub3QgdmlhYmxlfX0KKyAgc3RydWN0IFMgeyBBIG47IH07CisgIHZvaWQgZygpIHsKKyAgICBmMShTKCkubik7CisgICAgZjIoUygpLm4pOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1hdGNofX19CisgIH0KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIHZvaWQgaCgpIHsKKyAgICBmMShBe30pOworICAgIGYyKEF7fSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWF0Y2h9fQorICB9CisjZW5kaWYKK30KKworbmFtZXNwYWNlIGRyNDUxIHsgLy8gZHI0NTE6IHllcworICBjb25zdCBpbnQgYSA9IDEgLyAwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5kZWZpbmVkfX0KKyAgY29uc3QgaW50IGIgPSAxIC8gMDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VuZGVmaW5lZH19CisgIGludCBhcnJbYl07IC8vIGV4cGVjdGVkLWVycm9yICt7e3ZhcmlhYmxlIGxlbmd0aCBhcnJ9fQorfQorCituYW1lc3BhY2UgZHI0NTIgeyAvLyBkcjQ1MjogeWVzCisgIHN0cnVjdCBBIHsKKyAgICBpbnQgYSwgYiwgYzsKKyAgICBBICpwOworICAgIGludCBmKCk7CisgICAgQSgpIDogYShmKCkpLCBiKHRoaXMtPmYoKSArIGEpLCBjKHRoaXMtPmEpLCBwKHRoaXMpIHt9CisgIH07Cit9CisKKy8vIGRyNDU0IEZJWE1FIHdyaXRlIGEgY29kZWdlbiB0ZXN0CisKK25hbWVzcGFjZSBkcjQ1NiB7IC8vIGRyNDU2OiB5ZXMKKyAgLy8gc3VwIDkwMyBjKysxMQorICBjb25zdCBpbnQgbnVsbCA9IDA7CisgIHZvaWQgKnAgPSBudWxsOworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTIge3tjYW5ub3QgaW5pdGlhbGl6ZX19CisjZWxzZQorICAvLyBleHBlY3RlZC13YXJuaW5nQC00IHt7bnVsbH19CisjZW5kaWYKKworICBjb25zdCBib29sIGYgPSBmYWxzZTsKKyAgdm9pZCAqcSA9IGY7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLyBleHBlY3RlZC1lcnJvckAtMiB7e2Nhbm5vdCBpbml0aWFsaXplfX0KKyNlbHNlCisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTQge3tudWxsfX0KKyNlbmRpZgorfQorCituYW1lc3BhY2UgZHI0NTcgeyAvLyBkcjQ1NzogeWVzCisgIGNvbnN0IGludCBhID0gMTsKKyAgY29uc3Qgdm9sYXRpbGUgaW50IGIgPSAxOworICBpbnQgYXhbYV07CisgIGludCBieFtiXTsgLy8gZXhwZWN0ZWQtZXJyb3IgK3t7dmFyaWFibGUgbGVuZ3RoIGFycmF5fX0KKworICBlbnVtIEUgeworICAgIGVhID0gYSwKKyAgICBlYiA9IGIgLy8gZXhwZWN0ZWQtZXJyb3Ige3tub3QgYW4gaW50ZWdyYWwgY29uc3RhbnR9fSBleHBlY3RlZC1ub3RlIHt7cmVhZCBvZiB2b2xhdGlsZS1xdWFsaWZpZWR9fQorICB9OworfQorCituYW1lc3BhY2UgZHI0NTggeyAvLyBkcjQ1ODogbm8KKyAgc3RydWN0IEEgeworICAgIGludCBUOworICAgIGludCBmKCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+IGludCBnKCk7CisgIH07CisKKyAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBCIDogQSB7CisgICAgaW50IGYoKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4gaW50IGcoKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4gaW50IGgoKTsKKyAgfTsKKworICBpbnQgQTo6ZigpIHsKKyAgICByZXR1cm4gVDsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBpbnQgQTo6ZygpIHsKKyAgICByZXR1cm4gVDsgLy8gRklYTUU6IHRoaXMgaXMgaW52YWxpZCwgaXQgZmluZHMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcgorICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW50IEI8VD46OmYoKSB7CisgICAgcmV0dXJuIFQ7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgaW50IEI8VD46OmcoKSB7CisgICAgcmV0dXJuIFQ7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW50IEI8VT46OmgoKSB7CisgICAgcmV0dXJuIFQ7IC8vIEZJWE1FOiB0aGlzIGlzIGludmFsaWQsIGl0IGZpbmRzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgfQorfQorCituYW1lc3BhY2UgZHI0NjAgeyAvLyBkcjQ2MDogeWVzCisgIG5hbWVzcGFjZSBYIHsgbmFtZXNwYWNlIFEgeyBpbnQgbjsgfSB9CisgIG5hbWVzcGFjZSBZIHsKKyAgICB1c2luZyBYOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlcXVpcmVzIGEgcXVhbGlmaWVkIG5hbWV9fQorICAgIHVzaW5nIGRyNDYwOjpYOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCByZWZlciB0byBuYW1lc3BhY2V9fQorICAgIHVzaW5nIFg6OlE7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IHJlZmVyIHRvIG5hbWVzcGFjZX19CisgIH0KK30KKworLy8gZHI0NjE6IG5hCisvLyBkcjQ2MiBGSVhNRSB3cml0ZSBhIGNvZGVnZW4gdGVzdAorLy8gZHI0NjM6IG5hCisvLyBkcjQ2NDogbmEKKy8vIGRyNDY1OiBuYQorCituYW1lc3BhY2UgZHI0NjYgeyAvLyBkcjQ2Njogbm8KKyAgdHlwZWRlZiBpbnQgSTsKKyAgdHlwZWRlZiBjb25zdCBpbnQgQ0k7CisgIHR5cGVkZWYgdm9sYXRpbGUgaW50IFZJOworICB2b2lkIGYoaW50ICphLCBDSSAqYiwgVkkgKmMpIHsKKyAgICBhLT5+SSgpOworICAgIGEtPn5DSSgpOworICAgIGEtPn5WSSgpOworICAgIGEtPkk6On5JKCk7CisgICAgYS0+Q0k6On5DSSgpOworICAgIGEtPlZJOjp+VkkoKTsKKworICAgIGEtPkNJOjp+VkkoKTsgLy8gRklYTUU6IFRoaXMgaXMgaW52YWxpZDsgQ0kgYW5kIFZJIGFyZSBub3QgdGhlIHNhbWUgc2NhbGFyIHR5cGUuCisKKyAgICBiLT5+SSgpOworICAgIGItPn5DSSgpOworICAgIGItPn5WSSgpOworICAgIGItPkk6On5JKCk7CisgICAgYi0+Q0k6On5DSSgpOworICAgIGItPlZJOjp+VkkoKTsKKworICAgIGMtPn5JKCk7CisgICAgYy0+fkNJKCk7CisgICAgYy0+flZJKCk7CisgICAgYy0+STo6fkkoKTsKKyAgICBjLT5DSTo6fkNJKCk7CisgICAgYy0+Vkk6On5WSSgpOworICB9Cit9CisKK25hbWVzcGFjZSBkcjQ2NyB7IC8vIGRyNDY3OiB5ZXMKKyAgaW50IHN0dWZmKCk7CisKKyAgaW50IGYoKSB7CisgICAgc3RhdGljIGJvb2wgZG9uZTsKKyAgICBpZiAoZG9uZSkKKyAgICAgIGdvdG8gbGF0ZXI7CisgICAgc3RhdGljIGludCBrID0gc3R1ZmYoKTsKKyAgICBkb25lID0gdHJ1ZTsKKyAgbGF0ZXI6CisgICAgcmV0dXJuIGs7CisgIH0KKyAgaW50IGcoKSB7CisgICAgZ290byBsYXRlcjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcm90ZWN0ZWQgc2NvcGV9fQorICAgIGludCBrID0gc3R1ZmYoKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2J5cGFzc2VzIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ufX0KKyAgbGF0ZXI6CisgICAgcmV0dXJuIGs7CisgIH0KK30KKworbmFtZXNwYWNlIGRyNDY4IHsgLy8gZHI0Njg6IHllcyBjKysxMQorICAvLyBGSVhNRTogU2hvdWxkIHdlIGFsbG93IHRoaXMgaW4gQysrOTggdG9vPworICB0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IEEgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lPiBzdHJ1Y3QgQiB7CisgICAgICBzdGF0aWMgaW50IEM7CisgICAgfTsKKyAgfTsKKyAgaW50IGsgPSBkcjQ2ODo6dGVtcGxhdGUgQTxpbnQ+Ojp0ZW1wbGF0ZSBCPGNoYXI+OjpDOworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAvLyBleHBlY3RlZC1lcnJvckAtMiAye3sndGVtcGxhdGUnIGtleXdvcmQgb3V0c2lkZSBvZiBhIHRlbXBsYXRlfX0KKyNlbmRpZgorfQorCituYW1lc3BhY2UgZHI0NjkgeyAvLyBkcjQ2OTogbm8KKyAgLy8gRklYTUU6IFRoZSBjb3JlIGlzc3VlIGhlcmUgZGlkbid0IHJlYWxseSBhbnN3ZXIgdGhlIHF1ZXN0aW9uLiBXZSBkb24ndAorICAvLyBkZWR1Y2UgJ2NvbnN0IFQnIGZyb20gYSBmdW5jdGlvbiBvciByZWZlcmVuY2UgdHlwZSBpbiBhIGNsYXNzIHRlbXBsYXRlLi4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBYOyAvLyBleHBlY3RlZC1ub3RlIDJ7e2hlcmV9fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWDxjb25zdCBUPiB7fTsKKyAgWDxpbnQmPiB4OyAvLyBleHBlY3RlZC1lcnJvciB7e3VuZGVmaW5lZH19CisgIFg8aW50KCk+IHk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5kZWZpbmVkfX0KKworICAvLyAuLi4gYnV0IHdlIGRvIGluIGEgZnVuY3Rpb24gdGVtcGxhdGUuIEdDQyBhbmQgRURHIGZhaWwgZGVkdWN0aW9uIG9mICdmJworICAvLyBhbmQgdGhlIHNlY29uZCAnaCcuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZihjb25zdCBUICopOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGcoVCAqLCBjb25zdCBUICogPSAwKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBoKFQgKikgeyBUOjplcnJvcjsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGgoY29uc3QgVCAqKTsKKyAgdm9pZCBpKCkgeworICAgIGYoJmkpOworICAgIGcoJmkpOworICAgIGgoJmkpOworICB9Cit9CisKK25hbWVzcGFjZSBkcjQ3MCB7IC8vIGRyNDcwOiB5ZXMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEEgeworICAgIHN0cnVjdCBCIHt9OworICB9OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQyB7CisgIH07CisKKyAgdGVtcGxhdGUgc3RydWN0IEE8aW50PjsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KKyAgdGVtcGxhdGUgc3RydWN0IEE8aW50Pjo6QjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkdXBsaWNhdGUgZXhwbGljaXQgaW5zdGFudGlhdGlvbn19CisKKyAgLy8gb2ssIGluc3RhbnRpYXRpbmcgQzxjaGFyPiBkb2Vzbid0IGluc3RhbnRpYXRlIGJhc2UgY2xhc3MgbWVtYmVycy4KKyAgdGVtcGxhdGUgc3RydWN0IEE8Y2hhcj47CisgIHRlbXBsYXRlIHN0cnVjdCBDPGNoYXI+OworfQorCituYW1lc3BhY2UgZHI0NzEgeyAvLyBkcjQ3MTogeWVzCisgIHN0cnVjdCBBIHsgaW50IG47IH07CisgIHN0cnVjdCBCIDogcHJpdmF0ZSB2aXJ0dWFsIEEge307CisgIHN0cnVjdCBDIDogcHJvdGVjdGVkIHZpcnR1YWwgQSB7fTsKKyAgc3RydWN0IEQgOiBCLCBDIHsgaW50IGYoKSB7IHJldHVybiBuOyB9IH07CisgIHN0cnVjdCBFIDogcHJpdmF0ZSB2aXJ0dWFsIEEgeworICAgIHVzaW5nIEE6Om47CisgIH07CisgIHN0cnVjdCBGIDogRSwgQiB7IGludCBmKCkgeyByZXR1cm4gbjsgfSB9OworICBzdHJ1Y3QgRyA6IHZpcnR1YWwgQSB7CisgIHByaXZhdGU6CisgICAgdXNpbmcgQTo6bjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2hlcmV9fQorICB9OworICBzdHJ1Y3QgSCA6IEIsIEcgeyBpbnQgZigpIHsgcmV0dXJuIG47IH0gfTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcml2YXRlfX0KK30KKworbmFtZXNwYWNlIGRyNDc0IHsgLy8gZHI0NzQ6IHllcworICBuYW1lc3BhY2UgTiB7CisgICAgc3RydWN0IFMgeworICAgICAgdm9pZCBmKCk7CisgICAgfTsKKyAgfQorICB2b2lkIE46OlM6OmYoKSB7CisgICAgdm9pZCBnKCk7IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91c319CisgIH0KKyAgaW50IGcoKTsKKyAgbmFtZXNwYWNlIE4geworICAgIGludCBnKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGJlIG92ZXJsb2FkZWR9fQorICB9Cit9CisKKy8vIGRyNDc1IEZJWE1FIHdyaXRlIGEgY29kZWdlbiB0ZXN0CisKK25hbWVzcGFjZSBkcjQ3NyB7IC8vIGRyNDc3OiBubworICBzdHJ1Y3QgQSB7CisgICAgZXhwbGljaXQgQSgpOworICAgIHZpcnR1YWwgdm9pZCBmKCk7CisgIH07CisgIHN0cnVjdCBCIHsKKyAgICBmcmllbmQgZXhwbGljaXQgQTo6QSgpOyAvLyBGSVhNRTogcmVqZWN0IHRoaXMKKyAgICBmcmllbmQgdmlydHVhbCB2b2lkIEE6OmYoKTsgLy8gRklYTUU6IHJlamVjdCB0aGlzCisgIH07CisgIGV4cGxpY2l0IEE6OkEoKSB7fSAvLyBleHBlY3RlZC1lcnJvciB7e2NhbiBvbmx5IGJlIHNwZWNpZmllZCBpbnNpZGUgdGhlIGNsYXNzIGRlZmluaXRpb259fQorICB2aXJ0dWFsIHZvaWQgQTo6ZigpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FuIG9ubHkgYmUgc3BlY2lmaWVkIGluc2lkZSB0aGUgY2xhc3MgZGVmaW5pdGlvbn19Cit9CisKK25hbWVzcGFjZSBkcjQ3OCB7IC8vIGRyNDc4OiB5ZXMKKyAgc3RydWN0IEEgeyB2aXJ0dWFsIHZvaWQgZigpID0gMDsgfTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3VuaW1wbGVtZW50ZWR9fQorICB2b2lkIGYoQSAqYSk7CisgIHZvaWQgZihBIGFbMTBdKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcnJheSBvZiBhYnN0cmFjdCBjbGFzcyB0eXBlfX0KK30KKworbmFtZXNwYWNlIGRyNDc5IHsgLy8gZHI0Nzk6IHllcworICBzdHJ1Y3QgUyB7CisgICAgUygpOworICBwcml2YXRlOgorICAgIFMoY29uc3QgUyYpOyAvLyBleHBlY3RlZC1ub3RlICt7e2hlcmV9fQorICAgIH5TKCk7IC8vIGV4cGVjdGVkLW5vdGUgK3t7aGVyZX19CisgIH07CisgIHZvaWQgZigpIHsKKyAgICB0aHJvdyBTKCk7CisgICAgLy8gZXhwZWN0ZWQtZXJyb3JALTEge3t0ZW1wb3Jhcnkgb2YgdHlwZSAnZHI0Nzk6OlMnIGhhcyBwcml2YXRlIGRlc3RydWN0b3J9fQorICAgIC8vIGV4cGVjdGVkLWVycm9yQC0yIHt7Y2FsbGluZyBhIHByaXZhdGUgY29uc3RydWN0b3J9fQorICAgIC8vIGV4cGVjdGVkLWVycm9yQC0zIHt7ZXhjZXB0aW9uIG9iamVjdCBvZiB0eXBlICdkcjQ3OTo6UycgaGFzIHByaXZhdGUgZGVzdHJ1Y3Rvcn19CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgLy8gZXhwZWN0ZWQtZXJyb3JALTUge3tDKys5OCByZXF1aXJlcyBhbiBhY2Nlc3NpYmxlIGNvcHkgY29uc3RydWN0b3J9fQorI2VuZGlmCisgIH0KKyAgdm9pZCBnKCkgeworICAgIFMgczsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcml2YXRlIGRlc3RydWN0b3J9fX0KKyAgICB0aHJvdyBzOworICAgIC8vIGV4cGVjdGVkLWVycm9yQC0xIHt7Y2FsbGluZyBhIHByaXZhdGUgY29uc3RydWN0b3J9fQorICAgIC8vIGV4cGVjdGVkLWVycm9yQC0yIHt7ZXhjZXB0aW9uIG9iamVjdCBvZiB0eXBlICdkcjQ3OTo6UycgaGFzIHByaXZhdGUgZGVzdHJ1Y3Rvcn19CisgIH0KKyAgdm9pZCBoKCkgeworICAgIHRyeSB7CisgICAgICBmKCk7CisgICAgICBnKCk7CisgICAgfSBjYXRjaCAoUyBzKSB7CisgICAgICAvLyBleHBlY3RlZC1lcnJvckAtMSB7e2NhbGxpbmcgYSBwcml2YXRlIGNvbnN0cnVjdG9yfX0KKyAgICAgIC8vIGV4cGVjdGVkLWVycm9yQC0yIHt7dmFyaWFibGUgb2YgdHlwZSAnZHI0Nzk6OlMnIGhhcyBwcml2YXRlIGRlc3RydWN0b3J9fQorICAgIH0KKyAgfQorfQorCituYW1lc3BhY2UgZHI0ODAgeyAvLyBkcjQ4MDogeWVzCisgIHN0cnVjdCBBIHsgaW50IG47IH07CisgIHN0cnVjdCBCIDogQSB7fTsKKyAgc3RydWN0IEMgOiB2aXJ0dWFsIEIge307CisgIHN0cnVjdCBEIDogQyB7fTsKKworICBpbnQgQTo6KmEgPSAmQTo6bjsKKyAgaW50IEQ6OipiID0gYTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2aXJ0dWFsIGJhc2V9fQorCisgIGV4dGVybiBpbnQgRDo6KmM7CisgIGludCBBOjoqZCA9IHN0YXRpY19jYXN0PGludCBBOjoqPihjKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2aXJ0dWFsIGJhc2V9fQorCisgIEQgKmU7CisgIEEgKmYgPSBlOworICBEICpnID0gc3RhdGljX2Nhc3Q8RCo+KGYpOyAvLyBleHBlY3RlZC1lcnJvciB7e3ZpcnR1YWwgYmFzZX19CisKKyAgZXh0ZXJuIEQgJmk7CisgIEEgJmogPSBpOworICBEICZrID0gc3RhdGljX2Nhc3Q8RCY+KGopOyAvLyBleHBlY3RlZC1lcnJvciB7e3ZpcnR1YWwgYmFzZX19Cit9CisKK25hbWVzcGFjZSBkcjQ4MSB7IC8vIGRyNDgxOiB5ZXMKKyAgdGVtcGxhdGU8Y2xhc3MgVCwgVCBVPiBjbGFzcyBBIHsgVCAqeDsgfTsKKyAgVCAqeDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1bmtub3duIHR5cGV9fQorCisgIHRlbXBsYXRlPGNsYXNzIFQgKlU+IGNsYXNzIEIgeyBUICp4OyB9OworICBUICp5OyAvLyBvaworCisgIHN0cnVjdCBDIHsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGYoY2xhc3MgRCAqcCk7CisgIH07CisgIEQgKno7IC8vIG9rCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQSA9IEMsIHR5cGVuYW1lIEMgPSBBPiBzdHJ1Y3QgRSB7CisgICAgdm9pZCBmKCkgeworICAgICAgdHlwZWRlZiA6OmRyNDgxOjpDIGM7IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91c319CisgICAgICB0eXBlZGVmIEMgYzsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkaWZmZXJlbnQgdHlwZX19CisgICAgfQorICB9OworICB0ZW1wbGF0ZSBzdHJ1Y3QgRTw+OyAvLyBvaworICB0ZW1wbGF0ZSBzdHJ1Y3QgRTxpbnQ+OyAvLyBleHBlY3RlZC1ub3RlIHt7aW5zdGFudGlhdGlvbiBvZn19CisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8dHlwZW5hbWUgVV9ub190eXBvX2NvcnJlY3Rpb24+IGNsYXNzIEEsCisgICAgICAgICAgIEE8aW50PiAqQiwKKyAgICAgICAgICAgVV9ub190eXBvX2NvcnJlY3Rpb24gKkM+IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5rbm93biB0eXBlfX0KKyAgc3RydWN0IEYgeworICAgIFVfbm9fdHlwb19jb3JyZWN0aW9uICp4OyAvLyBleHBlY3RlZC1lcnJvciB7e3Vua25vd24gdHlwZX19CisgIH07CisKKyAgdGVtcGxhdGU8dGVtcGxhdGU8Y2xhc3MgSCAqPiBjbGFzcz4gc3RydWN0IEcgeworICAgIEggKng7CisgIH07CisgIEggKnE7CisKKyAgdHlwZWRlZiBpbnQgTjsKKyAgdGVtcGxhdGU8TiBYLCB0eXBlbmFtZSBOLCB0ZW1wbGF0ZTxOIFk+IGNsYXNzIFQ+IHN0cnVjdCBJOworICB0ZW1wbGF0ZTxjaGFyKj4gc3RydWN0IEo7CisgIEk8MTIzLCBjaGFyKiwgSj4gKmo7Cit9CisKK25hbWVzcGFjZSBkcjQ4MiB7IC8vIGRyNDgyOiAzLjUKKyAgZXh0ZXJuIGludCBhOworICB2b2lkIGYoKTsKKworICBpbnQgZHI0ODI6OmEgPSAwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgcXVhbGlmaWNhdGlvbn19CisgIHZvaWQgZHI0ODI6OmYoKSB7fSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgcXVhbGlmaWNhdGlvbn19CisKKyAgaW5saW5lIG5hbWVzcGFjZSBYIHsgLy8gZXhwZWN0ZWQtZXJyb3IgMC0xe3tDKysxMSBmZWF0dXJlfX0KKyAgICBleHRlcm4gaW50IGI7CisgICAgdm9pZCBnKCk7CisgICAgc3RydWN0IFM7CisgIH0KKyAgaW50IGRyNDgyOjpiID0gMDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHF1YWxpZmljYXRpb259fQorICB2b2lkIGRyNDgyOjpnKCkge30gLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHF1YWxpZmljYXRpb259fQorICBzdHJ1Y3QgZHI0ODI6OlMge307IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSBxdWFsaWZpY2F0aW9ufX0KKworICB2b2lkIGRyNDgyOjpmKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSBxdWFsaWZpY2F0aW9ufX0KKyAgdm9pZCBkcjQ4Mjo6ZygpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgcXVhbGlmaWNhdGlvbn19CisKKyAgLy8gRklYTUU6IFRoZSBmb2xsb3dpbmcgYXJlIHZhbGlkIGluIERSNDgyJ3Mgd29yZGluZywgYnV0IHRoZXNlIGFyZSBidWdzIGluCisgIC8vIHRoZSB3b3JkaW5nIHdoaWNoIHdlIGRlbGliZXJhdGVseSBkb24ndCBpbXBsZW1lbnQuCisgIG5hbWVzcGFjZSBOIHsgdHlwZWRlZiBpbnQgdHlwZTsgfQorICB0eXBlZGVmIGludCBOOjp0eXBlOyAvLyBleHBlY3RlZC1lcnJvciB7e3R5cGVkZWYgZGVjbGFyYXRvciBjYW5ub3QgYmUgcXVhbGlmaWVkfX0KKyAgc3RydWN0IEEgeworICAgIHN0cnVjdCBCOworICAgIHN0cnVjdCBBOjpCIHt9OyAvLyBleHBlY3RlZC1lcnJvciB7e2V4dHJhIHF1YWxpZmljYXRpb259fQorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgIGVudW0gY2xhc3MgQzsKKyAgICBlbnVtIGNsYXNzIEE6OkMge307IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXh0cmEgcXVhbGlmaWNhdGlvbn19CisjZW5kaWYKKyAgfTsKK30KKworbmFtZXNwYWNlIGRyNDgzIHsgLy8gZHI0ODM6IHllcworICBuYW1lc3BhY2UgY2xpbWl0cyB7CisgICAgaW50IGNoZWNrMVtfX1NDSEFSX01BWF9fID49IDEyNyA/IDEgOiAtMV07CisgICAgaW50IGNoZWNrMltfX1NIUlRfTUFYX18gPj0gMzI3NjcgPyAxIDogLTFdOworICAgIGludCBjaGVjazNbX19JTlRfTUFYX18gPj0gMzI3NjcgPyAxIDogLTFdOworICAgIGludCBjaGVjazRbX19MT05HX01BWF9fID49IDIxNDc0ODM2NDcgPyAxIDogLTFdOworICAgIGludCBjaGVjazVbX19MT05HX0xPTkdfTUFYX18gPj0gOTIyMzM3MjAzNjg1NDc3NTgwNyA/IDEgOiAtMV07CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgLy8gZXhwZWN0ZWQtZXJyb3JALTIge3tleHRlbnNpb259fQorI2VuZGlmCisgIH0KKyAgbmFtZXNwYWNlIGNzdGRpbnQgeworICAgIGludCBjaGVjazFbX19QVFJESUZGX1dJRFRIX18gPj0gMTYgPyAxIDogLTFdOworICAgIGludCBjaGVjazJbX19TSUdfQVRPTUlDX1dJRFRIX18gPj0gOCA/IDEgOiAtMV07CisgICAgaW50IGNoZWNrM1tfX1NJWkVfV0lEVEhfXyA+PSAxNiA/IDEgOiAtMV07CisgICAgaW50IGNoZWNrNFtfX1dDSEFSX1dJRFRIX18gPj0gOCA/IDEgOiAtMV07CisgICAgaW50IGNoZWNrNVtfX1dJTlRfV0lEVEhfXyA+PSAxNiA/IDEgOiAtMV07CisgIH0KK30KKworbmFtZXNwYWNlIGRyNDg0IHsgLy8gZHI0ODQ6IHllcworICBzdHJ1Y3QgQSB7CisgICAgQSgpOworICAgIHZvaWQgZigpOworICB9OworICB0eXBlZGVmIGNvbnN0IEEgQ0E7CisgIHZvaWQgQ0E6OmYoKSB7CisgICAgdGhpcy0+fkNBKCk7CisgICAgdGhpcy0+Q0E6On5BKCk7CisgICAgdGhpcy0+Q0E6OkE6On5BKCk7CisgIH0KKyAgQ0E6OkEoKSB7fQorCisgIHN0cnVjdCBCIDogQ0EgeworICAgIEIoKSA6IENBKCkge30KKyAgICB2b2lkIGYoKSB7IHJldHVybiBDQTo6ZigpOyB9CisgIH07CisKKyAgc3RydWN0IEM7CisgIHR5cGVkZWYgQyBDVDsgLy8gZXhwZWN0ZWQtbm90ZSB7e2hlcmV9fQorICBzdHJ1Y3QgQ1Qge307IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29uZmxpY3RzIHdpdGggdHlwZWRlZn19CisKKyAgbmFtZXNwYWNlIE4geworICAgIHN0cnVjdCBEOworICAgIHR5cGVkZWYgRCBEVDsgLy8gZXhwZWN0ZWQtbm90ZSB7e2hlcmV9fQorICB9CisgIHN0cnVjdCBOOjpEVCB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjb25mbGljdHMgd2l0aCB0eXBlZGVmfX0KKworICB0eXBlZGVmIHN0cnVjdCB7CisgICAgUygpOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlcXVpcmVzIGEgdHlwZX19CisgIH0gUzsKK30KKworbmFtZXNwYWNlIGRyNDg1IHsgLy8gZHI0ODU6IHllcworICBuYW1lc3BhY2UgTiB7CisgICAgc3RydWN0IFMge307CisgICAgaW50IG9wZXJhdG9yKyhTLCBTKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgZihTKTsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgZigpOworCisgIE46OlMgczsKKyAgaW50IGEgPSBvcGVyYXRvcisocywgcyk7CisgIGludCBiID0gZjxpbnQ+KHMpOworfQorCituYW1lc3BhY2UgZHI0ODYgeyAvLyBkcjQ4NjogeWVzCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgZihUICopOyAvLyBleHBlY3RlZC1ub3RlIDJ7e3N1YnN0aXR1dGlvbiBmYWlsdXJlfX0KKyAgaW50ICZmKC4uLik7CisKKyAgdm9pZCBnKCk7CisgIGludCBuWzEwXTsKKworICB2b2lkIGgoKSB7CisgICAgaW50ICZhID0gZigmZyk7CisgICAgaW50ICZiID0gZigmbik7CisgICAgZjx2b2lkKCk+KCZnKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaH19CisgICAgZjxpbnRbMTBdPigmbik7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWF0Y2h9fQorICB9Cit9CisKK25hbWVzcGFjZSBkcjQ4NyB7IC8vIGRyNDg3OiB5ZXMKKyAgZW51bSBFIHsgZSB9OworICBpbnQgb3BlcmF0b3IrKGludCwgRSk7CisgIGludCBpWzQgKyBlXTsgLy8gZXhwZWN0ZWQtZXJyb3IgMnt7dmFyaWFibGUgbGVuZ3RoIGFycmF5fX0KK30KKworbmFtZXNwYWNlIGRyNDg4IHsgLy8gZHI0ODg6IHllcyBjKysxMQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBmKFQpOworICB2b2lkIGYoaW50KTsKKyAgdm9pZCBnKCkgeworICAgIC8vIEZJWE1FOiBJdCBzZWVtcyBDV0cgdGhvdWdodCB0aGlzIHNob3VsZCBiZSBhIFNGSU5BRSBmYWlsdXJlIHByaW9yIHRvCisgICAgLy8gYWxsb3dpbmcgbG9jYWwgdHlwZXMgYXMgdGVtcGxhdGUgYXJndW1lbnRzLiBJbiBDKys5OCwgd2Ugc2hvdWxkIGVpdGhlcgorICAgIC8vIGFsbG93IGxvY2FsIHR5cGVzIGFzIHRlbXBsYXRlIGFyZ3VtZW50cyBvciB0cmVhdCB0aGlzIGFzIGEgU0ZJTkFFCisgICAgLy8gZmFpbHVyZS4KKyAgICBlbnVtIEUgeyBlIH07CisgICAgZihlKTsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgICAvLyBleHBlY3RlZC1lcnJvckAtMiB7e2xvY2FsIHR5cGV9fQorI2VuZGlmCisgIH0KK30KKworLy8gZHI0ODk6IG5hCisKK25hbWVzcGFjZSBkcjQ5MCB7IC8vIGRyNDkwOiB5ZXMKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFgge307CisKKyAgc3RydWN0IEEgeworICAgIHR5cGVkZWYgaW50IFQ7CisgICAgc3RydWN0IEsge307IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZH19CisKKyAgICBpbnQgZihUKTsKKyAgICBpbnQgZyhUKTsKKyAgICBpbnQgaChYPFQ+KTsKKyAgICBpbnQgWDxUPjo6KmkoKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KKyAgICBpbnQgSzo6KmooKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgaygpOworCisgICAgb3BlcmF0b3IgWDxUPigpOworICB9OworCisgIHN0cnVjdCBCIHsKKyAgICB0eXBlZGVmIGNoYXIgVDsKKyAgICB0eXBlZGVmIGludCBVOworICAgIGZyaWVuZCBpbnQgQTo6ZihUKTsKKyAgICBmcmllbmQgaW50IEE6OmcoVSk7CisgICAgZnJpZW5kIGludCBBOjpoKFg8VD4pOworCisgICAgLy8gRklYTUU6IFBlciB0aGlzIERSLCB0aGVzZSB0d28gYXJlIHZhbGlkISBUaGF0IGlzIGFub3RoZXIgZGVmZWN0CisgICAgLy8gKG5vIG51bWJlciB5ZXQuLi4pIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBzdXBlcnNlZGUgdGhpcyBvbmUuCisgICAgZnJpZW5kIGludCBYPFQ+OjoqQTo6aSgpOyAvLyBleHBlY3RlZC1lcnJvciB7e3JldHVybiB0eXBlfX0KKyAgICBmcmllbmQgaW50IEs6OipBOjpqKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5kZWNsYXJlZCBpZGVudGlmaWVyICdLJzsgZGlkIHlvdSBtZWFuICdBOjpLJz99fQorCisgICAgLy8gb2ssIGxvb2t1cCBmaW5kcyBCOjpULCBub3QgQTo6VCwgc28gcmV0dXJuIHR5cGUgbWF0Y2hlcworICAgIGZyaWVuZCBjaGFyIEE6Oms8VD4oKTsKKyAgICBmcmllbmQgaW50IEE6Oms8VT4oKTsKKworICAgIC8vIEEgY29udmVyc2lvbi10eXBlLWlkIGluIGEgY29udmVyc2lvbi1mdW5jdGlvbi1pZCBpcyBhbHdheXMgbG9va2VkIHVwIGluCisgICAgLy8gdGhlIGNsYXNzIG9mIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZpcnN0LgorICAgIGZyaWVuZCBBOjpvcGVyYXRvciBYPFQ+KCk7CisgIH07Cit9CisKK25hbWVzcGFjZSBkcjQ5MSB7IC8vIGRyNDkxOiBkdXAgNDEzCisgIHN0cnVjdCBBIHt9IGEsIGJbM10gPSB7IGEsIHt9IH07CisgIEEgY1syXSA9IHsgYSwge30sIGJbMV0gfTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleGNlc3MgZWxlbWVudHN9fQorfQorCisvLyBkcjQ5MiBGSVhNRSB3cml0ZSBhIGNvZGVnZW4gdGVzdAorCituYW1lc3BhY2UgZHI0OTMgeyAvLyBkcjQ5MzogZHVwIDk3NgorICBzdHJ1Y3QgWCB7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IG9wZXJhdG9yIGNvbnN0IFQgJigpIGNvbnN0OworICB9OworICB2b2lkIGYoKSB7CisgICAgaWYgKFgoKSkgeworICAgIH0KKyAgfQorfQorCituYW1lc3BhY2UgZHI0OTQgeyAvLyBkcjQ5NDogZHVwIDM3MgorICBjbGFzcyBBIHsKKyAgICBjbGFzcyBCIHt9OworICAgIGZyaWVuZCBjbGFzcyBDOworICB9OworICBjbGFzcyBDIDogQTo6QiB7CisgICAgQTo6QiB4OworICAgIGNsYXNzIEQgOiBBOjpCIHsKKyAgICAgIEE6OkIgeTsKKyAgICB9OworICB9OworfQorCituYW1lc3BhY2UgZHI0OTUgeyAvLyBkcjQ5NTogeWVzCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBTIHsKKyAgICBvcGVyYXRvciBpbnQoKSB7IHJldHVybiBUOjplcnJvcjsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IG9wZXJhdG9yIFUoKTsKKyAgfTsKKyAgUzxpbnQ+IHM7CisgIGxvbmcgbiA9IHM7Cit9CisKK25hbWVzcGFjZSBkcjQ5NiB7IC8vIGRyNDk2OiBubworICBzdHJ1Y3QgQSB7IGludCBuOyB9OworICBzdHJ1Y3QgQiB7IHZvbGF0aWxlIGludCBuOyB9OworICBpbnQgY2hlY2sxWyBfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShjb25zdCBpbnQpID8gMSA6IC0xXTsKKyAgaW50IGNoZWNrMlshX19pc190cml2aWFsbHlfY29weWFibGUodm9sYXRpbGUgaW50KSA/IDEgOiAtMV07CisgIGludCBjaGVjazNbIF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoQSwgY29uc3QgQSYpID8gMSA6IC0xXTsKKyAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcuCisgIGludCBjaGVjazRbIF9faXNfdHJpdmlhbGx5X2NvbnN0cnVjdGlibGUoQiwgY29uc3QgQiYpID8gMSA6IC0xXTsKKyAgaW50IGNoZWNrNVsgX19pc190cml2aWFsbHlfYXNzaWduYWJsZShBLCBjb25zdCBBJikgPyAxIDogLTFdOworICAvLyBGSVhNRTogVGhpcyBpcyB3cm9uZy4KKyAgaW50IGNoZWNrNlsgX19pc190cml2aWFsbHlfYXNzaWduYWJsZShCLCBjb25zdCBCJikgPyAxIDogLTFdOworfQorCituYW1lc3BhY2UgZHI0OTcgeyAvLyBkcjQ5NzogeWVzCisgIHZvaWQgYmVmb3JlKCkgeworICAgIHN0cnVjdCBTIHsKKyAgICAgIG11dGFibGUgaW50IGk7CisgICAgfTsKKyAgICBjb25zdCBTIGNzOyAvLyBleHBlY3RlZC1lcnJvciB7e2RlZmF1bHQgaW5pdGlhbGl6YXRpb259fQorICAgIGludCBTOjoqcG0gPSAmUzo6aTsKKyAgICBjcy4qcG0gPSA4ODsKKyAgfQorCisgIHZvaWQgYWZ0ZXIoKSB7CisgICAgc3RydWN0IFMgeworICAgICAgUygpIDogaSgwKSB7fQorICAgICAgbXV0YWJsZSBpbnQgaTsKKyAgICB9OworICAgIGNvbnN0IFMgY3M7CisgICAgaW50IFM6OipwbSA9ICZTOjppOworICAgIGNzLipwbSA9IDg4OyAvLyBleHBlY3RlZC1lcnJvciB7e25vdCBhc3NpZ25hYmxlfX0KKyAgfQorfQorCituYW1lc3BhY2UgZHI0OTkgeyAvLyBkcjQ5OTogeWVzCisgIGV4dGVybiBjaGFyIHN0cltdOworICB2b2lkIGYoKSB7IHRocm93IHN0cjsgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZHJzL2RyNXh4LmNwcCBiL3Rlc3QvQ1hYL2Rycy9kcjV4eC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4ZDU2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ1hYL2Rycy9kcjV4eC5jcHAKQEAgLTAsMCArMSwxNyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrOTggJXMgLXZlcmlmeSAtZmV4Y2VwdGlvbnMgLWZjeHgtZXhjZXB0aW9ucyAtcGVkYW50aWMtZXJyb3JzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAlcyAtdmVyaWZ5IC1mZXhjZXB0aW9ucyAtZmN4eC1leGNlcHRpb25zIC1wZWRhbnRpYy1lcnJvcnMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzF5ICVzIC12ZXJpZnkgLWZleGNlcHRpb25zIC1mY3h4LWV4Y2VwdGlvbnMgLXBlZGFudGljLWVycm9ycworCituYW1lc3BhY2UgZHI1MDAgeyAvLyBkcjUwMDogZHVwIDM3MgorICBjbGFzcyBEOworICBjbGFzcyBBIHsKKyAgICBjbGFzcyBCOworICAgIGNsYXNzIEM7CisgICAgZnJpZW5kIGNsYXNzIEQ7CisgIH07CisgIGNsYXNzIEE6OkIge307CisgIGNsYXNzIEE6OkMgOiBwdWJsaWMgQTo6QiB7fTsKKyAgY2xhc3MgRCA6IHB1YmxpYyBBOjpCIHt9OworfQorCisvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZXhjZXB0L2V4Y2VwdC5zcGVjL2Nhbm9uaWNhbC5jcHAgYi90ZXN0L0NYWC9leGNlcHQvZXhjZXB0LnNwZWMvY2Fub25pY2FsLmNwcAppbmRleCBiNmQzZTljLi5kNmRjMjU4IDEwMDY0NAotLS0gYS90ZXN0L0NYWC9leGNlcHQvZXhjZXB0LnNwZWMvY2Fub25pY2FsLmNwcAorKysgYi90ZXN0L0NYWC9leGNlcHQvZXhjZXB0LnNwZWMvY2Fub25pY2FsLmNwcApAQCAtOSw3ICs5LDcgQEAKIHRlbXBsYXRlIDxjbGFzcyBfVHA+IF9UcCYmIGRlY2x2YWwoKSBub2V4Y2VwdDsKIAogdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MuLi4gX0FyZ3M+Ci1zdHJ1Y3QgX19pc19ub3Rocm93X2NvbnN0cnVjdGlibGUKK3N0cnVjdCBfaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlCiB7CiAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gbm9leGNlcHQoX1RwKGRlY2x2YWw8X0FyZ3M+KCkuLi4pKTsKIH07CkBAIC0yMiw3ICsyMiw3IEBACiAgIHR5cGVkZWYgX0FsbG9jYXRvciBhbGxvY2F0b3JfdHlwZTsKIAogICBiYXNpY19zdHJpbmcoKQotICAgICAgbm9leGNlcHQoX19pc19ub3Rocm93X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSk7CisgICAgICBub2V4Y2VwdChfaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpOwogfTsKIAogdGVtcGxhdGUgPGNsYXNzLCBjbGFzcywgY2xhc3MgX0NvbXBhcmU+CkBAIC0zMCw3ICszMCw3IEBACiB7CiBwdWJsaWM6CiAgIF9fbWFwX3ZhbHVlX2NvbXBhcmUoKQotICAgICAgbm9leGNlcHQoX19pc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSk7CisgICAgICBub2V4Y2VwdChfaXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpOwogfTsKIAogc3RydWN0IGxlc3MKQEAgLTQ1LDEwICs0NSwxMCBAQAogCiAKIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIF9UcmFpdHMsIGNsYXNzIF9BbGxvY2F0b3I+Ci1iYXNpY19zdHJpbmc8VCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZygpIG5vZXhjZXB0KF9faXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPGFsbG9jYXRvcl90eXBlPjo6dmFsdWUpIHt9CitiYXNpY19zdHJpbmc8VCwgX1RyYWl0cywgX0FsbG9jYXRvcj46OmJhc2ljX3N0cmluZygpIG5vZXhjZXB0KF9pc19ub3Rocm93X2NvbnN0cnVjdGlibGU8YWxsb2NhdG9yX3R5cGU+Ojp2YWx1ZSkge30KIAogdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFZhbHVlLCBjbGFzcyBfQ29tcGFyZT4KIF9fbWFwX3ZhbHVlX2NvbXBhcmU8VCwgVmFsdWUsIF9Db21wYXJlPjo6X19tYXBfdmFsdWVfY29tcGFyZSgpCi0gIG5vZXhjZXB0KF9faXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPF9Db21wYXJlPjo6dmFsdWUpIHt9CisgIG5vZXhjZXB0KF9pc19ub3Rocm93X2NvbnN0cnVjdGlibGU8X0NvbXBhcmU+Ojp2YWx1ZSkge30KIAogfSAgLy8gc3RkCmRpZmYgLS1naXQgYS90ZXN0L0NYWC9leGNlcHQvZXhjZXB0LnNwZWMvcDE1LmNwcCBiL3Rlc3QvQ1hYL2V4Y2VwdC9leGNlcHQuc3BlYy9wMTUuY3BwCmluZGV4IGZjZjEyMzUuLmFjZjQ0MjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2V4Y2VwdC9leGNlcHQuc3BlYy9wMTUuY3BwCisrKyBiL3Rlc3QvQ1hYL2V4Y2VwdC9leGNlcHQuc3BlYy9wMTUuY3BwCkBAIC0xLDE2ICsxLDIwIEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZmV4Y2VwdGlvbnMgLWZjeHgtZXhjZXB0aW9ucyAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtRFVTRSAtc3RkPWMrKzExIC1mZXhjZXB0aW9ucyAtZmN4eC1leGNlcHRpb25zIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworCisvLyBNYXliZSBmb3JjZSB0aGUgaW1wbGljaXQgZGVjbGFyYXRpb24gb2YgJ29wZXJhdG9yIGRlbGV0ZScgYW5kICdvcGVyYXRvcgorLy8gZGVsZXRlW10nLiBUaGlzIHNob3VsZCBtYWtlIG5vIGRpZmZlcmVuY2UgdG8gYW55dGhpbmchCisjaWZkZWYgVVNFCit2b2lkIGYoaW50ICpwKSB7CisgIGRlbGV0ZSBwOworICBkZWxldGUgW10gcDsKK30KKyNlbmRpZgogCiAvLyBEZWFsbG9jYXRpb24gZnVuY3Rpb25zIGFyZSBpbXBsaWNpdGx5IG5vZXhjZXB0LgogLy8gVGh1cywgZXhwbGljaXQgc3BlY3MgYXJlbid0IGFsbG93ZWQgdG8gY29uZmxpY3QuCiAKLXZvaWQgZigpIHsKLSAgLy8gRm9yY2UgaW1wbGljaXQgZGVjbGFyYXRpb24gb2YgZGVsZXRlLgotICBkZWxldGUgbmV3IGludDsKLSAgZGVsZXRlW10gbmV3IGludFsxXTsKLX0KLQotdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopOwotdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKik7Cit2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKik7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiBwcmV2aW91c2x5IGRlY2xhcmVkIHdpdGggYW4gZXhwbGljaXQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gcmVkZWNsYXJlZCB3aXRoIGFuIGltcGxpY2l0IGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ufX0KK3ZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCopOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gcHJldmlvdXNseSBkZWNsYXJlZCB3aXRoIGFuIGV4cGxpY2l0IGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHJlZGVjbGFyZWQgd2l0aCBhbiBpbXBsaWNpdCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbn19CiAKIHN0YXRpY19hc3NlcnQobm9leGNlcHQob3BlcmF0b3IgZGVsZXRlKDApKSwgIiIpOwogc3RhdGljX2Fzc2VydChub2V4Y2VwdChvcGVyYXRvciBkZWxldGVbXSgwKSksICIiKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2V4cHIvZXhwci5jb25zdC9wMi0weC5jcHAgYi90ZXN0L0NYWC9leHByL2V4cHIuY29uc3QvcDItMHguY3BwCmluZGV4IGYwYjUzYzcuLjg0Njg4MjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2V4cHIvZXhwci5jb25zdC9wMi0weC5jcHAKKysrIGIvdGVzdC9DWFgvZXhwci9leHByLmNvbnN0L3AyLTB4LmNwcApAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgY2FzZSAoaW50KSh1bnNpZ25lZCkobG9uZyBsb25nKTQuNGU5OiAvLyBvawogICAgIGNhc2UgKGludCkoZmxvYXQpMWUzMDA6IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29uc3RhbnQgZXhwcmVzc2lvbn19IGV4cGVjdGVkLW5vdGUge3t2YWx1ZSAxLjBFKzMwMCBpcyBvdXRzaWRlIHRoZSByYW5nZSBvZiByZXByZXNlbnRhYmxlIHZhbHVlcyBvZiB0eXBlICdmbG9hdCd9fSBleHBlY3RlZC1lcnJvciB7e2R1cGxpY2F0ZSBjYXNlIHZhbHVlICcyMTQ3NDgzNjQ3J319IGV4cGVjdGVkLW5vdGUge3twcmV2aW91cyBjYXNlIGRlZmluZWQgaGVyZX19CiAgICAgY2FzZSAoaW50KSgoZmxvYXQpMWUzNyAvIDFlMzApOiAvLyBvawotICAgIGNhc2UgKGludCkoX19mcDE2KTY1NTM2OiAvLyBleHBlY3RlZC1lcnJvciB7e2NvbnN0YW50IGV4cHJlc3Npb259fSBleHBlY3RlZC1ub3RlIHt7dmFsdWUgNjU1MzYgaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgcmVwcmVzZW50YWJsZSB2YWx1ZXMgb2YgdHlwZSAnaGFsZid9fSBleHBlY3RlZC1lcnJvciB7e2R1cGxpY2F0ZSBjYXNlIHZhbHVlICcyMTQ3NDgzNjQ3J319CisgICAgY2FzZSAoaW50KShfX2ZwMTYpNjU1MzY6IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29uc3RhbnQgZXhwcmVzc2lvbn19IGV4cGVjdGVkLW5vdGUge3t2YWx1ZSA2NTUzNiBpcyBvdXRzaWRlIHRoZSByYW5nZSBvZiByZXByZXNlbnRhYmxlIHZhbHVlcyBvZiB0eXBlICdfX2ZwMTYnfX0gZXhwZWN0ZWQtZXJyb3Ige3tkdXBsaWNhdGUgY2FzZSB2YWx1ZSAnMjE0NzQ4MzY0Nyd9fQogICAgICAgYnJlYWs7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9leHByL2V4cHIuY29uc3QvcDMtMHguY3BwIGIvdGVzdC9DWFgvZXhwci9leHByLmNvbnN0L3AzLTB4LmNwcAppbmRleCBlM2UzMmRmLi5kOWQ4NDg1IDEwMDY0NAotLS0gYS90ZXN0L0NYWC9leHByL2V4cHIuY29uc3QvcDMtMHguY3BwCisrKyBiL3Rlc3QvQ1hYL2V4cHIvZXhwci5jb25zdC9wMy0weC5jcHAKQEAgLTk3LDcgKzk3LDcgQEAKIHRlbXBsYXRlIGludCBmPCZTOjpvcGVyYXRvciBpbnQ+KCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZG9lcyBub3QgcmVmZXIgdG8gYSBmdW5jdGlvbiB0ZW1wbGF0ZX19CiB0ZW1wbGF0ZSBpbnQgZjwoYm9vbCkmUzo6b3BlcmF0b3IgaW50PigpOwogCi1pbnQgbiA9IFZhbDxib29sLCAmUzo6b3BlcmF0b3IgaW50Pjo6dmFsdWU7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29udmVyc2lvbiBmcm9tICdpbnQgKFM6OiopKCkgY29uc3QnIHRvICdib29sJyBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbnZlcnRlZCBjb25zdGFudCBleHByZXNzaW9ufX0KK2ludCBuID0gVmFsPGJvb2wsICZTOjpvcGVyYXRvciBpbnQ+Ojp2YWx1ZTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3tjb252ZXJzaW9uIGZyb20gJ2ludCAoUzo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0gY29uc3QnIHRvICdib29sJyBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbnZlcnRlZCBjb25zdGFudCBleHByZXNzaW9ufX0KIAogbmFtZXNwYWNlIE5vbkNvbnN0TFZhbHVlIHsKICAgc3RydWN0IFMgewpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZXhwci9leHByLm1wdHIub3Blci9wNS5jcHAgYi90ZXN0L0NYWC9leHByL2V4cHIubXB0ci5vcGVyL3A1LmNwcAppbmRleCA3MzgwYjVkLi5jMjZiMzBkIDEwMDY0NAotLS0gYS90ZXN0L0NYWC9leHByL2V4cHIubXB0ci5vcGVyL3A1LmNwcAorKysgYi90ZXN0L0NYWC9leHByL2V4cHIubXB0ci5vcGVyL3A1LmNwcApAQCAtMjQsMTkgKzI0LDE5IEBACiAgIChwLT4qcG12KSgpOwogICAocC0+KnBtY3YpKCk7CiAKLSAgKHBjLT4qcG0pKCk7IC8vIGV4cGVjdGVkLWVycm9ye3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCknIGRyb3BzICdjb25zdCcgcXVhbGlmaWVyfX0KKyAgKHBjLT4qcG0pKCk7IC8vIGV4cGVjdGVkLWVycm9yLXJle3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319JyBkcm9wcyAnY29uc3QnIHF1YWxpZmllcn19CiAgIChwYy0+KnBtYykoKTsKLSAgKHBjLT4qcG12KSgpOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2FsbCB0byBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiBvZiB0eXBlICd2b2lkICgpIHZvbGF0aWxlJyBkcm9wcyAnY29uc3QnIHF1YWxpZmllcn19CisgIChwYy0+KnBtdikoKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e2NhbGwgdG8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdHlwZSAndm9pZCAoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0gdm9sYXRpbGUnIGRyb3BzICdjb25zdCcgcXVhbGlmaWVyfX0KICAgKHBjLT4qcG1jdikoKTsKIAotICAocHYtPipwbSkoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2NhbGwgdG8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdHlwZSAndm9pZCAoKScgZHJvcHMgJ3ZvbGF0aWxlJyBxdWFsaWZpZXJ9fQotICAocHYtPipwbWMpKCk7IC8vIGV4cGVjdGVkLWVycm9ye3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCkgY29uc3QnIGRyb3BzICd2b2xhdGlsZScgcXVhbGlmaWVyfX0KKyAgKHB2LT4qcG0pKCk7IC8vIGV4cGVjdGVkLWVycm9yLXJle3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319JyBkcm9wcyAndm9sYXRpbGUnIHF1YWxpZmllcn19CisgIChwdi0+KnBtYykoKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e2NhbGwgdG8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdHlwZSAndm9pZCAoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0gY29uc3QnIGRyb3BzICd2b2xhdGlsZScgcXVhbGlmaWVyfX0KICAgKHB2LT4qcG12KSgpOwogICAocHYtPipwbWN2KSgpOwogCi0gIChwY3YtPipwbSkoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2NhbGwgdG8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdHlwZSAndm9pZCAoKScgZHJvcHMgJ2NvbnN0IHZvbGF0aWxlJyBxdWFsaWZpZXJzfX0KLSAgKHBjdi0+KnBtYykoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2NhbGwgdG8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdHlwZSAndm9pZCAoKSBjb25zdCcgZHJvcHMgJ3ZvbGF0aWxlJyBxdWFsaWZpZXJ9fQotICAocGN2LT4qcG12KSgpOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2FsbCB0byBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiBvZiB0eXBlICd2b2lkICgpIHZvbGF0aWxlJyBkcm9wcyAnY29uc3QnIHF1YWxpZmllcn19CisgIChwY3YtPipwbSkoKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e2NhbGwgdG8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdHlwZSAndm9pZCAoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIGRyb3BzICdjb25zdCB2b2xhdGlsZScgcXVhbGlmaWVyc319CisgIChwY3YtPipwbWMpKCk7IC8vIGV4cGVjdGVkLWVycm9yLXJle3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319IGNvbnN0JyBkcm9wcyAndm9sYXRpbGUnIHF1YWxpZmllcn19CisgIChwY3YtPipwbXYpKCk7IC8vIGV4cGVjdGVkLWVycm9yLXJle3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319IHZvbGF0aWxlJyBkcm9wcyAnY29uc3QnIHF1YWxpZmllcn19CiAgIChwY3YtPipwbWN2KSgpOwogCiAgIChvLipwbSkoKTsKQEAgLTQ0LDE4ICs0NCwxOCBAQAogICAoby4qcG12KSgpOwogICAoby4qcG1jdikoKTsKIAotICAob2MuKnBtKSgpOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2FsbCB0byBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiBvZiB0eXBlICd2b2lkICgpJyBkcm9wcyAnY29uc3QnIHF1YWxpZmllcn19CisgIChvYy4qcG0pKCk7IC8vIGV4cGVjdGVkLWVycm9yLXJle3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319JyBkcm9wcyAnY29uc3QnIHF1YWxpZmllcn19CiAgIChvYy4qcG1jKSgpOwotICAob2MuKnBtdikoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2NhbGwgdG8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdHlwZSAndm9pZCAoKSB2b2xhdGlsZScgZHJvcHMgJ2NvbnN0JyBxdWFsaWZpZXJ9fQorICAob2MuKnBtdikoKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e2NhbGwgdG8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdHlwZSAndm9pZCAoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0gdm9sYXRpbGUnIGRyb3BzICdjb25zdCcgcXVhbGlmaWVyfX0KICAgKG9jLipwbWN2KSgpOwogCi0gIChvdi4qcG0pKCk7IC8vIGV4cGVjdGVkLWVycm9ye3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCknIGRyb3BzICd2b2xhdGlsZScgcXVhbGlmaWVyfX0KLSAgKG92LipwbWMpKCk7IC8vIGV4cGVjdGVkLWVycm9ye3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCkgY29uc3QnIGRyb3BzICd2b2xhdGlsZScgcXVhbGlmaWVyfX0KKyAgKG92LipwbSkoKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e2NhbGwgdG8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdHlwZSAndm9pZCAoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIGRyb3BzICd2b2xhdGlsZScgcXVhbGlmaWVyfX0KKyAgKG92LipwbWMpKCk7IC8vIGV4cGVjdGVkLWVycm9yLXJle3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319IGNvbnN0JyBkcm9wcyAndm9sYXRpbGUnIHF1YWxpZmllcn19CiAgIChvdi4qcG12KSgpOwogICAob3YuKnBtY3YpKCk7CiAKLSAgKG9jdi4qcG0pKCk7IC8vIGV4cGVjdGVkLWVycm9ye3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCknIGRyb3BzICdjb25zdCB2b2xhdGlsZScgcXVhbGlmaWVyc319Ci0gIChvY3YuKnBtYykoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2NhbGwgdG8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdHlwZSAndm9pZCAoKSBjb25zdCcgZHJvcHMgJ3ZvbGF0aWxlJyBxdWFsaWZpZXJ9fQotICAob2N2LipwbXYpKCk7IC8vIGV4cGVjdGVkLWVycm9ye3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCkgdm9sYXRpbGUnIGRyb3BzICdjb25zdCcgcXVhbGlmaWVyfX0KKyAgKG9jdi4qcG0pKCk7IC8vIGV4cGVjdGVkLWVycm9yLXJle3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319JyBkcm9wcyAnY29uc3Qgdm9sYXRpbGUnIHF1YWxpZmllcnN9fQorICAob2N2LipwbWMpKCk7IC8vIGV4cGVjdGVkLWVycm9yLXJle3tjYWxsIHRvIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIG9mIHR5cGUgJ3ZvaWQgKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319IGNvbnN0JyBkcm9wcyAndm9sYXRpbGUnIHF1YWxpZmllcn19CisgIChvY3YuKnBtdikoKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e2NhbGwgdG8gcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdHlwZSAndm9pZCAoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0gdm9sYXRpbGUnIGRyb3BzICdjb25zdCcgcXVhbGlmaWVyfX0KICAgKG9jdi4qcG1jdikoKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2V4cHIvZXhwci5tcHRyLm9wZXIvcDYtMHguY3BwIGIvdGVzdC9DWFgvZXhwci9leHByLm1wdHIub3Blci9wNi0weC5jcHAKaW5kZXggOTE3YjJkYS4uYjE4MjNlNSAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvZXhwci9leHByLm1wdHIub3Blci9wNi0weC5jcHAKKysrIGIvdGVzdC9DWFgvZXhwci9leHByLm1wdHIub3Blci9wNi0weC5jcHAKQEAgLTIyLDEzICsyMiwxMyBAQAogCiAgIC8vIEx2YWx1ZSByZWYtcXVhbGlmaWVyLgogICAobHZhbHVlPFg+KCkuKmxfcG1mKSgxNyk7Ci0gICh4dmFsdWU8WD4oKS4qbF9wbWYpKDE3KTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3BvaW50ZXItdG8tbWVtYmVyIGZ1bmN0aW9uIHR5cGUgJ2ludCAoWDo6KikoaW50KSAmJyBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gbHZhbHVlfX0KLSAgKHBydmFsdWU8WD4oKS4qbF9wbWYpKDE3KTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3BvaW50ZXItdG8tbWVtYmVyIGZ1bmN0aW9uIHR5cGUgJ2ludCAoWDo6KikoaW50KSAmJyBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gbHZhbHVlfX0KKyAgKHh2YWx1ZTxYPigpLipsX3BtZikoMTcpOyAvLyBleHBlY3RlZC1lcnJvci1yZXt7cG9pbnRlci10by1tZW1iZXIgZnVuY3Rpb24gdHlwZSAnaW50IChYOjoqKShpbnQpe3soIF9fYXR0cmlidXRlX19cKFwodGhpc2NhbGxcKVwpKT99fSAmJyBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gbHZhbHVlfX0KKyAgKHBydmFsdWU8WD4oKS4qbF9wbWYpKDE3KTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e3BvaW50ZXItdG8tbWVtYmVyIGZ1bmN0aW9uIHR5cGUgJ2ludCAoWDo6KikoaW50KXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0gJicgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIGx2YWx1ZX19CiAgICh4cC0+KmxfcG1mKSgxNyk7CiAKICAgLy8gUnZhbHVlIHJlZi1xdWFsaWZpZXIuCi0gIChsdmFsdWU8WD4oKS4qcl9wbWYpKDE3KTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3BvaW50ZXItdG8tbWVtYmVyIGZ1bmN0aW9uIHR5cGUgJ2ludCAoWDo6KikoaW50KSAmJicgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIHJ2YWx1ZX19CisgIChsdmFsdWU8WD4oKS4qcl9wbWYpKDE3KTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e3BvaW50ZXItdG8tbWVtYmVyIGZ1bmN0aW9uIHR5cGUgJ2ludCAoWDo6KikoaW50KXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0gJiYnIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBydmFsdWV9fQogICAoeHZhbHVlPFg+KCkuKnJfcG1mKSgxNyk7CiAgIChwcnZhbHVlPFg+KCkuKnJfcG1mKSgxNyk7Ci0gICh4cC0+KnJfcG1mKSgxNyk7ICAvLyBleHBlY3RlZC1lcnJvcnt7cG9pbnRlci10by1tZW1iZXIgZnVuY3Rpb24gdHlwZSAnaW50IChYOjoqKShpbnQpICYmJyBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gcnZhbHVlfX0KKyAgKHhwLT4qcl9wbWYpKDE3KTsgIC8vIGV4cGVjdGVkLWVycm9yLXJle3twb2ludGVyLXRvLW1lbWJlciBmdW5jdGlvbiB0eXBlICdpbnQgKFg6OiopKGludCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319ICYmJyBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gcnZhbHVlfX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5nZW5lcmFsL3A0LTB4LmNwcCBiL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5nZW5lcmFsL3A0LTB4LmNwcAppbmRleCA0ZTU3Yjc0Li41NGIyZmY1IDEwMDY0NAotLS0gYS90ZXN0L0NYWC9leHByL2V4cHIucHJpbS9leHByLnByaW0uZ2VuZXJhbC9wNC0weC5jcHAKKysrIGIvdGVzdC9DWFgvZXhwci9leHByLnByaW0vZXhwci5wcmltLmdlbmVyYWwvcDQtMHguY3BwCkBAIC02LDYgKzYsOCBAQAogCiAgIGludCBhcnJbc2l6ZW9mKHRoaXMpXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbnZhbGlkIHVzZSBvZiAndGhpcycgb3V0c2lkZSBvZiBhIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9ufX0KICAgaW50IHN6ID0gc2l6ZW9mKHRoaXMpOyAvLyBvaworCisgIHR5cGVkZWYgYXV0byBmKCkgLT4gZGVjbHR5cGUodGhpcyk7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW52YWxpZCB1c2Ugb2YgJ3RoaXMnIG91dHNpZGUgb2YgYSBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbn19CiB9OwogCiBuYW1lc3BhY2UgQ2FwdHVyZVRoaXMgewpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZXhwci9leHByLnByaW0vZXhwci5wcmltLmxhbWJkYS9ibG9ja3MubW0gYi90ZXN0L0NYWC9leHByL2V4cHIucHJpbS9leHByLnByaW0ubGFtYmRhL2Jsb2Nrcy5tbQppbmRleCAwZGIyYmY1Li4zNDVlYTliIDEwMDY0NAotLS0gYS90ZXN0L0NYWC9leHByL2V4cHIucHJpbS9leHByLnByaW0ubGFtYmRhL2Jsb2Nrcy5tbQorKysgYi90ZXN0L0NYWC9leHByL2V4cHIucHJpbS9leHByLnByaW0ubGFtYmRhL2Jsb2Nrcy5tbQpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1mYmxvY2tzICVzIC12ZXJpZnkKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtcGMtbGludXggLXN0ZD1jKysxMSAtZmJsb2NrcyAlcyAtdmVyaWZ5CiAKIHZvaWQgYmxvY2tfY2FwdHVyZV9lcnJvcnMoKSB7CiAgIF9fYmxvY2sgaW50IHZhcjsgLy8gZXhwZWN0ZWQtbm90ZSAye3sndmFyJyBkZWNsYXJlZCBoZXJlfX0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5sYW1iZGEvZ2VuZXJpYy1sYW1iZGEtdW5pbXBsZW1lbnRlZC0xeS5jcHAgYi90ZXN0L0NYWC9leHByL2V4cHIucHJpbS9leHByLnByaW0ubGFtYmRhL2dlbmVyaWMtbGFtYmRhLXVuaW1wbGVtZW50ZWQtMXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQyYzM5Li4wMDAwMDAwCi0tLSBhL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5sYW1iZGEvZ2VuZXJpYy1sYW1iZGEtdW5pbXBsZW1lbnRlZC0xeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtc3RkPWMrKzF5ICVzIC12ZXJpZnkKLS8vZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKLW5hbWVzcGFjZSBsYW1iZGFfY2FwdHVyaW5nIHsKLS8vIEZJWE1FOiBPbmNlIHJldHVybiB0eXBlIGRlZHVjdGlvbiBpcyBpbXBsZW1lbnRlZCBmb3IgZ2VuZXJpYyBsYW1iZGFzCi0vLyB0aGlzIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkLgotdm9pZCB0ZXN0KCkgewotICBpbnQgaSA9IDEwOwotICB7Ci0gICAgYXV0byBMID0gWz1dKGF1dG8gYSkgLT4gaW50IHsgCi0gICAgICByZXR1cm4gaSArIGE7Ci0gICAgfTsKLSAgICBMKDMpOwotICB9Ci0gIHsKLSAgICBhdXRvIEwgPSBbaV0oYXV0byBhKSAtPiBpbnQgeyAKLSAgICAgIHJldHVybiBpICsgYTsKLSAgICB9OwotICAgIEwoMyk7Ci0gIH0gIAotICB7Ci0gICAgYXV0byBMID0gW2k9aV0oYXV0byBhKSAtPiBpbnQgeyAKLSAgICAgIHJldHVybiBpICsgYTsKLSAgICB9OwotICAgIEwoMyk7Ci0gIH0gIAotCi0gIAotfQotCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5sYW1iZGEvcDE0LmNwcCBiL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5sYW1iZGEvcDE0LmNwcAppbmRleCAyZGRjZjE4Li41NTFjMTAwIDEwMDY0NAotLS0gYS90ZXN0L0NYWC9leHByL2V4cHIucHJpbS9leHByLnByaW0ubGFtYmRhL3AxNC5jcHAKKysrIGIvdGVzdC9DWFgvZXhwci9leHByLnByaW0vZXhwci5wcmltLmxhbWJkYS9wMTQuY3BwCkBAIC0xMDAsMyArMTAwLDEyIEBACiAgICAgW3hdKCkge30oKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2J5LWNvcHkgY2FwdHVyZSBvZiB2YWx1ZSBvZiBhYnN0cmFjdCB0eXBlICdyZGFyMTQ0Njg4OTE6OlgnfX0KICAgfQogfQorCituYW1lc3BhY2UgcmRhcjE1NTYwNDY0IHsKKyAgc3RydWN0IFg7IC8vIGV4cGVjdGVkLW5vdGV7e2ZvcndhcmQgZGVjbGFyYXRpb24gb2YgJ3JkYXIxNTU2MDQ2NDo6WCd9fQorICB2b2lkIGZvbyhjb25zdCBYJiBwYXJhbSkgeworICAgIGF1dG8geCA9IChbPV0oKSB7CisgICAgICAgIGF1dG8mIHkgPSBwYXJhbTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2J5LWNvcHkgY2FwdHVyZSBvZiB2YXJpYWJsZSAncGFyYW0nIHdpdGggaW5jb21wbGV0ZSB0eXBlICdjb25zdCByZGFyMTU1NjA0NjQ6OlgnfX0KKyAgICAgIH0pOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9leHByL2V4cHIucHJpbS9leHByLnByaW0ubGFtYmRhL3AxOS5jcHAgYi90ZXN0L0NYWC9leHByL2V4cHIucHJpbS9leHByLnByaW0ubGFtYmRhL3AxOS5jcHAKaW5kZXggOGE2ZTc5Mi4uMzViNzc4OSAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvZXhwci9leHByLnByaW0vZXhwci5wcmltLmxhbWJkYS9wMTkuY3BwCisrKyBiL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5sYW1iZGEvcDE5LmNwcApAQCAtMTAsNyArMTAsNyBAQAogICBhdXRvIGxhbWJkYTEgPSBbaV0oKSB7IH07IC8vIGV4cGVjdGVkLW5vdGUgMiB7e2xhbWJkYSBleHByZXNzaW9uIGJlZ2lucyBoZXJlfX0KIAogICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gIGRlY2x0eXBlKGxhbWJkYTEpIGxhbWJkYTI7IC8vIGV4cGVjdGVkLWVycm9ye3tjYWxsIHRvIGltcGxpY2l0bHktZGVsZXRlZCBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mICdkZWNsdHlwZShsYW1iZGExKScgKGFrYSAnPGxhbWJkYX19CisgIGRlY2x0eXBlKGxhbWJkYTEpIGxhbWJkYTI7IC8vIGV4cGVjdGVkLWVycm9ye3tjYWxsIHRvIGltcGxpY2l0bHktZGVsZXRlZCBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mICdkZWNsdHlwZShsYW1iZGExKScgKGFrYSAnKGxhbWJkYX19CiAKICAgLy8gQ29weSBhc3NpZ25tZW50IG9wZXJhdG9yCiAgIGxhbWJkYTEgPSBsYW1iZGExOyAvLyBleHBlY3RlZC1lcnJvcnt7Y29weSBhc3NpZ25tZW50IG9wZXJhdG9yIGlzIGltcGxpY2l0bHkgZGVsZXRlZH19CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9leHByL2V4cHIucHJpbS9leHByLnByaW0ubGFtYmRhL3AyLWdlbmVyaWMtbGFtYmRhLTF5LmNwcCBiL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5sYW1iZGEvcDItZ2VuZXJpYy1sYW1iZGEtMXkuY3BwCmluZGV4IGQ0MWM0NTAuLjAzMTQ3YTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5sYW1iZGEvcDItZ2VuZXJpYy1sYW1iZGEtMXkuY3BwCisrKyBiL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5sYW1iZGEvcDItZ2VuZXJpYy1sYW1iZGEtMXkuY3BwCkBAIC0xLDI1ICsxLDI1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzIC1zdGQ9YysrMXkgLURDWFgxWQ0KLQ0KLS8vIHBydmFsdWUNCi12b2lkIHBydmFsdWUoKSB7DQotICBhdXRvJiYgeCA9IFtdKGF1dG8gYSktPnZvaWQgeyB9Ow0KLSAgYXV0byYgeSA9IFtdKGF1dG8gKmEpLT52b2lkIHsgfTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2Nhbm5vdCBiaW5kIHRvIGEgdGVtcG9yYXJ5IG9mIHR5cGV9fQ0KLX0NCi0NCi1uYW1lc3BhY2Ugc3RkIHsNCi0gIGNsYXNzIHR5cGVfaW5mbzsNCi19DQotDQotc3RydWN0IFAgew0KLSAgdmlydHVhbCB+UCgpOw0KLX07DQotDQotdm9pZCB1bmV2YWx1YXRlZF9vcGVyYW5kKFAgJnAsIGludCBpKSB7IC8vZXhwZWN0ZWQtbm90ZXt7ZGVjbGFyZWQgaGVyZX19DQotICAvLyBGSVhNRTogdGhpcyBzaG91bGQgb25seSBlbWl0IG9uZSBlcnJvci4NCi0gIGludCBpMiA9IHNpemVvZihbXShhdXRvIGEsIGF1dG8gYiktPnZvaWR7fSgzLCAnNCcpKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2xhbWJkYSBleHByZXNzaW9uIGluIGFuIHVuZXZhbHVhdGVkIG9wZXJhbmR9fSBcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLWVycm9ye3tpbnZhbGlkIGFwcGxpY2F0aW9uIG9mICdzaXplb2YnfX0NCi0gIGNvbnN0IHN0ZDo6dHlwZV9pbmZvICZ0aTEgPSB0eXBlaWQoW10oYXV0byAmYSkgLT4gUCYgeyBzdGF0aWMgUCBwOyByZXR1cm4gcDsgfShpKSk7DQotICBjb25zdCBzdGQ6OnR5cGVfaW5mbyAmdGkyID0gdHlwZWlkKFtdKGF1dG8pIC0+IGludCB7IHJldHVybiBpOyB9KGkpKTsgIC8vIGV4cGVjdGVkLWVycm9ye3tsYW1iZGEgZXhwcmVzc2lvbiBpbiBhbiB1bmV2YWx1YXRlZCBvcGVyYW5kfX1cDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLWVycm9ye3tjYW5ub3QgYmUgaW1wbGljaXRseSBjYXB0dXJlZH19XA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3Rle3tiZWdpbnMgaGVyZX19DQotfQ0KKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLXN0ZD1jKysxeSAtRENYWDFZCisKKy8vIHBydmFsdWUKK3ZvaWQgcHJ2YWx1ZSgpIHsKKyAgYXV0byYmIHggPSBbXShhdXRvIGEpLT52b2lkIHsgfTsKKyAgYXV0byYgeSA9IFtdKGF1dG8gKmEpLT52b2lkIHsgfTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2Nhbm5vdCBiaW5kIHRvIGEgdGVtcG9yYXJ5IG9mIHR5cGV9fQorfQorCituYW1lc3BhY2Ugc3RkIHsKKyAgY2xhc3MgdHlwZV9pbmZvOworfQorCitzdHJ1Y3QgUCB7CisgIHZpcnR1YWwgflAoKTsKK307CisKK3ZvaWQgdW5ldmFsdWF0ZWRfb3BlcmFuZChQICZwLCBpbnQgaSkgeyAvL2V4cGVjdGVkLW5vdGV7e2RlY2xhcmVkIGhlcmV9fQorICAvLyBGSVhNRTogdGhpcyBzaG91bGQgb25seSBlbWl0IG9uZSBlcnJvci4KKyAgaW50IGkyID0gc2l6ZW9mKFtdKGF1dG8gYSwgYXV0byBiKS0+dm9pZHt9KDMsICc0JykpOyAvLyBleHBlY3RlZC1lcnJvcnt7bGFtYmRhIGV4cHJlc3Npb24gaW4gYW4gdW5ldmFsdWF0ZWQgb3BlcmFuZH19IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1lcnJvcnt7aW52YWxpZCBhcHBsaWNhdGlvbiBvZiAnc2l6ZW9mJ319CisgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvICZ0aTEgPSB0eXBlaWQoW10oYXV0byAmYSkgLT4gUCYgeyBzdGF0aWMgUCBwOyByZXR1cm4gcDsgfShpKSk7CisgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvICZ0aTIgPSB0eXBlaWQoW10oYXV0bykgLT4gaW50IHsgcmV0dXJuIGk7IH0oaSkpOyAgLy8gZXhwZWN0ZWQtZXJyb3J7e2xhbWJkYSBleHByZXNzaW9uIGluIGFuIHVuZXZhbHVhdGVkIG9wZXJhbmR9fVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1lcnJvcnt7Y2Fubm90IGJlIGltcGxpY2l0bHkgY2FwdHVyZWR9fVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3Rle3tiZWdpbnMgaGVyZX19Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9leHByL2V4cHIucHJpbS9leHByLnByaW0ubGFtYmRhL3A1LWdlbmVyaWMtbGFtYmRhLTF5LmNwcCBiL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5sYW1iZGEvcDUtZ2VuZXJpYy1sYW1iZGEtMXkuY3BwCmluZGV4IGM1ZDNiZjYuLjQxNWMzZDggMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5sYW1iZGEvcDUtZ2VuZXJpYy1sYW1iZGEtMXkuY3BwCisrKyBiL3Rlc3QvQ1hYL2V4cHIvZXhwci5wcmltL2V4cHIucHJpbS5sYW1iZGEvcDUtZ2VuZXJpYy1sYW1iZGEtMXkuY3BwCkBAIC0xLDEzMSArMSwxMzEgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLXN0ZD1jKysxeSAtRENYWDFZIA0KLQ0KLW5hbWVzcGFjZSB0ZXN0X2ZhY3RvcmlhbCB7DQotDQotYXV0byBGYWN0ID0gW10oYXV0byBTZWxmLCB1bnNpZ25lZCBuKSAtPiB1bnNpZ25lZCB7DQotICAgIHJldHVybiAhbiA/IDEgOiBTZWxmKFNlbGYsIG4gLSAxKSAqIG47DQotfTsNCi0NCi1hdXRvIHNpeCA9IEZhY3QoRmFjdCwgMyk7DQotDQotfQ0KLQ0KLW5hbWVzcGFjZSBvdmVybG9hZF9nZW5lcmljX2xhbWJkYSB7DQotICB0ZW1wbGF0ZSA8Y2xhc3MgRjEsIGNsYXNzIEYyPiBzdHJ1Y3Qgb3ZlcmxvYWQgOiBGMSwgRjIgew0KLSAgICB1c2luZyBGMTo6b3BlcmF0b3IoKTsNCi0gICAgdXNpbmcgRjI6Om9wZXJhdG9yKCk7DQotICAgIG92ZXJsb2FkKEYxIGYxLCBGMiBmMikgOiBGMShmMSksIEYyKGYyKSB7IH0NCi0gIH07DQotDQotICBhdXRvIE51bVBhcmFtcyA9IFtdKGF1dG8gU2VsZiwgYXV0byBoLCBhdXRvIC4uLiByZXN0KSAtPiB1bnNpZ25lZCB7DQotICAgIHJldHVybiAxICsgU2VsZihTZWxmLCByZXN0Li4uKTsNCi0gIH07DQotICBhdXRvIEJhc2UgPSBbXShhdXRvIFNlbGYsIGF1dG8gaCkgLT4gdW5zaWduZWQgew0KLSAgICAgIHJldHVybiAxOw0KLSAgfTsNCi0gIG92ZXJsb2FkPGRlY2x0eXBlKEJhc2UpLCBkZWNsdHlwZShOdW1QYXJhbXMpPiBPKEJhc2UsIE51bVBhcmFtcyk7DQotICBpbnQgbnVtX3BhcmFtcyA9ICBPKE8sIDUsIDMsICJhYmMiLCAzLjE0LCAnYScpOw0KLX0NCi0NCi0NCi1uYW1lc3BhY2Ugb3ZlcmxvYWRfZ2VuZXJpY19sYW1iZGFfcmV0dXJuX3R5cGVfZGVkdWN0aW9uIHsNCi0gIHRlbXBsYXRlIDxjbGFzcyBGMSwgY2xhc3MgRjI+IHN0cnVjdCBvdmVybG9hZCA6IEYxLCBGMiB7DQotICAgIHVzaW5nIEYxOjpvcGVyYXRvcigpOw0KLSAgICB1c2luZyBGMjo6b3BlcmF0b3IoKTsNCi0gICAgb3ZlcmxvYWQoRjEgZjEsIEYyIGYyKSA6IEYxKGYxKSwgRjIoZjIpIHsgfQ0KLSAgfTsNCi0NCi0gIGF1dG8gTnVtUGFyYW1zID0gW10oYXV0byBTZWxmLCBhdXRvIGgsIGF1dG8gLi4uIHJlc3QpIHsNCi0gICAgcmV0dXJuIDEgKyBTZWxmKFNlbGYsIHJlc3QuLi4pOw0KLSAgfTsNCi0gIGF1dG8gQmFzZSA9IFtdKGF1dG8gU2VsZiwgYXV0byBoKSB7DQotICAgICAgcmV0dXJuIDE7DQotICB9Ow0KLSAgb3ZlcmxvYWQ8ZGVjbHR5cGUoQmFzZSksIGRlY2x0eXBlKE51bVBhcmFtcyk+IE8oQmFzZSwgTnVtUGFyYW1zKTsNCi0gIGludCBudW1fcGFyYW1zID0gIE8oTywgNSwgMywgImFiYyIsIDMuMTQsICdhJyk7DQotfQ0KLQ0KLW5hbWVzcGFjZSB0ZXN0X3N0YW5kYXJkX3A1IHsNCi0vLyBGSVhNRTogVGhpcyB0ZXN0IHNob3VsZCBldmVudHVhbGx5IGNvbXBpbGUgd2l0aG91dCBhbiBleHBsaWNpdCB0cmFpbGluZyByZXR1cm4gdHlwZQ0KLWF1dG8gZ2xhbWJkYSA9IFtdKGF1dG8gYSwgYXV0byYmIGIpIC0+Ym9vbCB7IHJldHVybiBhIDwgYjsgfTsNCi1ib29sIGIgPSBnbGFtYmRhKDMsIDMuMTQpOyAvLyBPSw0KLQ0KLX0NCi1uYW1lc3BhY2UgdGVzdF9kZWR1Y3Rpb25fZmFpbHVyZSB7DQotIGludCB0ZXN0KCkgew0KLSAgIGF1dG8gZyA9IFtdKGF1dG8gKmEpIHsgLy9leHBlY3RlZC1ub3Rle3tjYW5kaWRhdGUgdGVtcGxhdGUgaWdub3JlZH19DQotICAgIHJldHVybiBhOw0KLSAgIH07DQotICAgc3RydWN0IFggeyB9Ow0KLSAgIFggKng7DQotICAgZyh4KTsNCi0gICBnKDMpOyAvL2V4cGVjdGVkLWVycm9ye3tubyBtYXRjaGluZyBmdW5jdGlvbn19DQotICAgcmV0dXJuIDA7DQotIH0NCi0NCi19DQotICANCi1uYW1lc3BhY2UgdGVzdF9pbnN0YW50aWF0aW9uX29yX3NmaW5hZV9mYWlsdXJlIHsNCi1pbnQgdGVzdDIoKSB7DQotICB7DQotICAgIGF1dG8gTCA9IFtdKGF1dG8gKmEpIHsgDQotICAgICAgICAgICAgICAgIHJldHVybiAoKmEpKGEpOyB9OyAvL2V4cGVjdGVkLWVycm9ye3tjYWxsZWQgb2JqZWN0IHR5cGUgJ2RvdWJsZScgaXMgbm90IGEgZnVuY3Rpb259fQ0KLSAgICBkb3VibGUgZDsNCi0gICAgTCgmZCk7IC8vZXhwZWN0ZWQtbm90ZXt7aW4gaW5zdGFudGlhdGlvbiBvZn19DQotICAgIGF1dG8gTSA9IFtdKGF1dG8gYikgeyByZXR1cm4gYjsgfTsNCi0gICAgTCgmTSk7IC8vIG9rDQotICB9DQotICB7DQotICAgIGF1dG8gTCA9IFtdKGF1dG8gKmEpIC0+ZGVjbHR5cGUgKGEtPmZvbygpKSB7IC8vZXhwZWN0ZWQtbm90ZTJ7e2NhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOn19DQotICAgICAgICAgICAgICAgIHJldHVybiAoKmEpKGEpOyB9OyANCi0gICAgZG91YmxlIGQ7DQotICAgIEwoJmQpOyAvL2V4cGVjdGVkLWVycm9ye3tubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgY2FsbH19IA0KLSAgICBhdXRvIE0gPSBbXShhdXRvIGIpIHsgcmV0dXJuIGI7IH07DQotICAgIEwoJk0pOyAvL2V4cGVjdGVkLWVycm9ye3tubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgY2FsbH19IA0KLSANCi0gIH0NCi0gIHJldHVybiAwOw0KLX0NCi0NCi0NCi19DQotICANCi1uYW1lc3BhY2UgdGVzdF9taXNjIHsNCi1hdXRvIEdMID0gW10oYXV0byBhLCBkZWNsdHlwZShhKSBiKSAvL2V4cGVjdGVkLW5vdGV7e2NhbmRpZGF0ZSBmdW5jdGlvbn19IA0KLSAgICAgICAgICAgICAgICAtPiBpbnQgeyByZXR1cm4gYSArIGI7IH07DQotDQotdm9pZCB0ZXN0KCkgew0KLSAgIHN0cnVjdCBYIHsgfTsNCi0gICBHTCgzLCBYe30pOyAvL2V4cGVjdGVkLWVycm9ye3tubyBtYXRjaGluZyBmdW5jdGlvbn19DQotfQ0KLQ0KLXZvaWQgdGVzdDIoKSB7DQotICBhdXRvIGwgPSBbXShhdXRvICphKSAtPiBpbnQgeyANCi0gICAgICAgICAgICAgICgqYSkoYSk7IHJldHVybiAwOyB9OyAvL2V4cGVjdGVkLWVycm9ye3tjYWxsZWQgb2JqZWN0IHR5cGUgJ2RvdWJsZScgaXMgbm90IGEgZnVuY3Rpb259fQ0KLSAgbCgmbCk7DQotICBkb3VibGUgZDsNCi0gIGwoJmQpOyAvL2V4cGVjdGVkLW5vdGV7e2luIGluc3RhbnRpYXRpb24gb2Z9fQ0KLX0NCi0NCi19DQotDQotbmFtZXNwYWNlIG5lc3RlZF9sYW1iZGFzIHsNCi0gIGludCB0ZXN0KCkgew0KLSAgICBhdXRvIEwgPSBbXShhdXRvIGEpIHsNCi0gICAgICAgICAgICAgICAgIHJldHVybiBbPV0oYXV0byBiKSB7ICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSArIGI7DQotICAgICAgICAgICAgICAgICAgICAgICAgfTsNCi0gICAgICAgICAgICAgIH07DQotICB9DQotICBhdXRvIGdldF9sYW1iZGEoKSB7DQotICAgIHJldHVybiBbXShhdXRvIGEpIHsNCi0gICAgICByZXR1cm4gYTsgDQotICAgIH07DQotICB9Ow0KLSAgDQotICBpbnQgdGVzdDIoKSB7DQotICAgIGF1dG8gTCA9IGdldF9sYW1iZGEoKTsNCi0gICAgTCgzKTsNCi0gIH0NCi19DQotDQorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAtc3RkPWMrKzF5IC1EQ1hYMVkgCisKK25hbWVzcGFjZSB0ZXN0X2ZhY3RvcmlhbCB7CisKK2F1dG8gRmFjdCA9IFtdKGF1dG8gU2VsZiwgdW5zaWduZWQgbikgLT4gdW5zaWduZWQgeworICAgIHJldHVybiAhbiA/IDEgOiBTZWxmKFNlbGYsIG4gLSAxKSAqIG47Cit9OworCithdXRvIHNpeCA9IEZhY3QoRmFjdCwgMyk7CisKK30KKworbmFtZXNwYWNlIG92ZXJsb2FkX2dlbmVyaWNfbGFtYmRhIHsKKyAgdGVtcGxhdGUgPGNsYXNzIEYxLCBjbGFzcyBGMj4gc3RydWN0IG92ZXJsb2FkIDogRjEsIEYyIHsKKyAgICB1c2luZyBGMTo6b3BlcmF0b3IoKTsKKyAgICB1c2luZyBGMjo6b3BlcmF0b3IoKTsKKyAgICBvdmVybG9hZChGMSBmMSwgRjIgZjIpIDogRjEoZjEpLCBGMihmMikgeyB9CisgIH07CisKKyAgYXV0byBOdW1QYXJhbXMgPSBbXShhdXRvIFNlbGYsIGF1dG8gaCwgYXV0byAuLi4gcmVzdCkgLT4gdW5zaWduZWQgeworICAgIHJldHVybiAxICsgU2VsZihTZWxmLCByZXN0Li4uKTsKKyAgfTsKKyAgYXV0byBCYXNlID0gW10oYXV0byBTZWxmLCBhdXRvIGgpIC0+IHVuc2lnbmVkIHsKKyAgICAgIHJldHVybiAxOworICB9OworICBvdmVybG9hZDxkZWNsdHlwZShCYXNlKSwgZGVjbHR5cGUoTnVtUGFyYW1zKT4gTyhCYXNlLCBOdW1QYXJhbXMpOworICBpbnQgbnVtX3BhcmFtcyA9ICBPKE8sIDUsIDMsICJhYmMiLCAzLjE0LCAnYScpOworfQorCisKK25hbWVzcGFjZSBvdmVybG9hZF9nZW5lcmljX2xhbWJkYV9yZXR1cm5fdHlwZV9kZWR1Y3Rpb24geworICB0ZW1wbGF0ZSA8Y2xhc3MgRjEsIGNsYXNzIEYyPiBzdHJ1Y3Qgb3ZlcmxvYWQgOiBGMSwgRjIgeworICAgIHVzaW5nIEYxOjpvcGVyYXRvcigpOworICAgIHVzaW5nIEYyOjpvcGVyYXRvcigpOworICAgIG92ZXJsb2FkKEYxIGYxLCBGMiBmMikgOiBGMShmMSksIEYyKGYyKSB7IH0KKyAgfTsKKworICBhdXRvIE51bVBhcmFtcyA9IFtdKGF1dG8gU2VsZiwgYXV0byBoLCBhdXRvIC4uLiByZXN0KSB7CisgICAgcmV0dXJuIDEgKyBTZWxmKFNlbGYsIHJlc3QuLi4pOworICB9OworICBhdXRvIEJhc2UgPSBbXShhdXRvIFNlbGYsIGF1dG8gaCkgeworICAgICAgcmV0dXJuIDE7CisgIH07CisgIG92ZXJsb2FkPGRlY2x0eXBlKEJhc2UpLCBkZWNsdHlwZShOdW1QYXJhbXMpPiBPKEJhc2UsIE51bVBhcmFtcyk7CisgIGludCBudW1fcGFyYW1zID0gIE8oTywgNSwgMywgImFiYyIsIDMuMTQsICdhJyk7Cit9CisKK25hbWVzcGFjZSB0ZXN0X3N0YW5kYXJkX3A1IHsKKy8vIEZJWE1FOiBUaGlzIHRlc3Qgc2hvdWxkIGV2ZW50dWFsbHkgY29tcGlsZSB3aXRob3V0IGFuIGV4cGxpY2l0IHRyYWlsaW5nIHJldHVybiB0eXBlCithdXRvIGdsYW1iZGEgPSBbXShhdXRvIGEsIGF1dG8mJiBiKSAtPmJvb2wgeyByZXR1cm4gYSA8IGI7IH07Citib29sIGIgPSBnbGFtYmRhKDMsIDMuMTQpOyAvLyBPSworCit9CituYW1lc3BhY2UgdGVzdF9kZWR1Y3Rpb25fZmFpbHVyZSB7CisgaW50IHRlc3QoKSB7CisgICBhdXRvIGcgPSBbXShhdXRvICphKSB7IC8vZXhwZWN0ZWQtbm90ZXt7Y2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWR9fQorICAgIHJldHVybiBhOworICAgfTsKKyAgIHN0cnVjdCBYIHsgfTsKKyAgIFggKng7CisgICBnKHgpOworICAgZygzKTsgLy9leHBlY3RlZC1lcnJvcnt7bm8gbWF0Y2hpbmcgZnVuY3Rpb259fQorICAgcmV0dXJuIDA7CisgfQorCit9CisgIAorbmFtZXNwYWNlIHRlc3RfaW5zdGFudGlhdGlvbl9vcl9zZmluYWVfZmFpbHVyZSB7CitpbnQgdGVzdDIoKSB7CisgIHsKKyAgICBhdXRvIEwgPSBbXShhdXRvICphKSB7IAorICAgICAgICAgICAgICAgIHJldHVybiAoKmEpKGEpOyB9OyAvL2V4cGVjdGVkLWVycm9ye3tjYWxsZWQgb2JqZWN0IHR5cGUgJ2RvdWJsZScgaXMgbm90IGEgZnVuY3Rpb259fQorICAgIGRvdWJsZSBkOworICAgIEwoJmQpOyAvL2V4cGVjdGVkLW5vdGV7e2luIGluc3RhbnRpYXRpb24gb2Z9fQorICAgIGF1dG8gTSA9IFtdKGF1dG8gYikgeyByZXR1cm4gYjsgfTsKKyAgICBMKCZNKTsgLy8gb2sKKyAgfQorICB7CisgICAgYXV0byBMID0gW10oYXV0byAqYSkgLT5kZWNsdHlwZSAoYS0+Zm9vKCkpIHsgLy9leHBlY3RlZC1ub3RlMnt7Y2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6fX0KKyAgICAgICAgICAgICAgICByZXR1cm4gKCphKShhKTsgfTsgCisgICAgZG91YmxlIGQ7CisgICAgTCgmZCk7IC8vZXhwZWN0ZWQtZXJyb3J7e25vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBjYWxsfX0gCisgICAgYXV0byBNID0gW10oYXV0byBiKSB7IHJldHVybiBiOyB9OworICAgIEwoJk0pOyAvL2V4cGVjdGVkLWVycm9ye3tubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgY2FsbH19IAorIAorICB9CisgIHJldHVybiAwOworfQorCisKK30KKyAgCituYW1lc3BhY2UgdGVzdF9taXNjIHsKK2F1dG8gR0wgPSBbXShhdXRvIGEsIGRlY2x0eXBlKGEpIGIpIC8vZXhwZWN0ZWQtbm90ZXt7Y2FuZGlkYXRlIGZ1bmN0aW9ufX0gCisgICAgICAgICAgICAgICAgLT4gaW50IHsgcmV0dXJuIGEgKyBiOyB9OworCit2b2lkIHRlc3QoKSB7CisgICBzdHJ1Y3QgWCB7IH07CisgICBHTCgzLCBYe30pOyAvL2V4cGVjdGVkLWVycm9ye3tubyBtYXRjaGluZyBmdW5jdGlvbn19Cit9CisKK3ZvaWQgdGVzdDIoKSB7CisgIGF1dG8gbCA9IFtdKGF1dG8gKmEpIC0+IGludCB7IAorICAgICAgICAgICAgICAoKmEpKGEpOyByZXR1cm4gMDsgfTsgLy9leHBlY3RlZC1lcnJvcnt7Y2FsbGVkIG9iamVjdCB0eXBlICdkb3VibGUnIGlzIG5vdCBhIGZ1bmN0aW9ufX0KKyAgbCgmbCk7CisgIGRvdWJsZSBkOworICBsKCZkKTsgLy9leHBlY3RlZC1ub3Rle3tpbiBpbnN0YW50aWF0aW9uIG9mfX0KK30KKworfQorCituYW1lc3BhY2UgbmVzdGVkX2xhbWJkYXMgeworICBpbnQgdGVzdCgpIHsKKyAgICBhdXRvIEwgPSBbXShhdXRvIGEpIHsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIFs9XShhdXRvIGIpIHsgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgKyBiOworICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgfTsKKyAgfQorICBhdXRvIGdldF9sYW1iZGEoKSB7CisgICAgcmV0dXJuIFtdKGF1dG8gYSkgeworICAgICAgcmV0dXJuIGE7IAorICAgIH07CisgIH07CisgIAorICBpbnQgdGVzdDIoKSB7CisgICAgYXV0byBMID0gZ2V0X2xhbWJkYSgpOworICAgIEwoMyk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvZXhwci9leHByLnVuYXJ5L2V4cHIubmV3L3AyLWN4eDB4LmNwcCBiL3Rlc3QvQ1hYL2V4cHIvZXhwci51bmFyeS9leHByLm5ldy9wMi1jeHgweC5jcHAKaW5kZXggMmU5OWI1Mi4uNzMwNWJkMSAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvZXhwci9leHByLnVuYXJ5L2V4cHIubmV3L3AyLWN4eDB4LmNwcAorKysgYi90ZXN0L0NYWC9leHByL2V4cHIudW5hcnkvZXhwci5uZXcvcDItY3h4MHguY3BwCkBAIC0xMyw2ICsxMyw4IEBACiAgIG5ldyBhdXRvOyAvLyBleHBlY3RlZC1lcnJvcnt7bmV3IGV4cHJlc3Npb24gZm9yIHR5cGUgJ2F1dG8nIHJlcXVpcmVzIGEgY29uc3RydWN0b3IgYXJndW1lbnR9fQogICBuZXcgKGNvbnN0IGF1dG8pKCk7IC8vIGV4cGVjdGVkLWVycm9ye3tuZXcgZXhwcmVzc2lvbiBmb3IgdHlwZSAnY29uc3QgYXV0bycgcmVxdWlyZXMgYSBjb25zdHJ1Y3RvciBhcmd1bWVudH19CiAgIG5ldyAoYXV0bykgKDEsMiwzKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e25ldyBleHByZXNzaW9uIGZvciB0eXBlICdhdXRvJyBjb250YWlucyBtdWx0aXBsZSBjb25zdHJ1Y3RvciBhcmd1bWVudHN9fQorICBuZXcgYXV0byB7MSwyLDN9OyAvLyBleHBlY3RlZC1lcnJvcnt7bmV3IGV4cHJlc3Npb24gZm9yIHR5cGUgJ2F1dG8nIGNhbm5vdCB1c2UgbGlzdC1pbml0aWFsaXphdGlvbn19CisgIG5ldyBhdXRvICh7MSwyLDN9KTsgLy8gZXhwZWN0ZWQtZXJyb3J7e25ldyBleHByZXNzaW9uIGZvciB0eXBlICdhdXRvJyBjYW5ub3QgdXNlIGxpc3QtaW5pdGlhbGl6YXRpb259fQogfQogCiB2b2lkIHAyZXhhbXBsZSgpIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL2V4cHIvZXhwci51bmFyeS9leHByLnVuYXJ5Lm9wL3A0LmNwcCBiL3Rlc3QvQ1hYL2V4cHIvZXhwci51bmFyeS9leHByLnVuYXJ5Lm9wL3A0LmNwcAppbmRleCBjZDU1Y2MyLi45YmFiZjg3IDEwMDY0NAotLS0gYS90ZXN0L0NYWC9leHByL2V4cHIudW5hcnkvZXhwci51bmFyeS5vcC9wNC5jcHAKKysrIGIvdGVzdC9DWFgvZXhwci9leHByLnVuYXJ5L2V4cHIudW5hcnkub3AvcDQuY3BwCkBAIC03LDcgKzcsNyBAQAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZyhUKTsKIAogICAgIHZvaWQgdGVzdCgpIHsKLSAgICAgIGZvbygmZzxpbnQ+KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW4ndCBmb3JtIG1lbWJlciBwb2ludGVyIG9mIHR5cGUgJ3ZvaWQgKHRlc3QwOjpBOjoqKShpbnQpJyB3aXRob3V0ICcmJyBhbmQgY2xhc3MgbmFtZX19CisgICAgICBmb28oJmc8aW50Pik7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7Y2FuJ3QgZm9ybSBtZW1iZXIgcG9pbnRlciBvZiB0eXBlICd2b2lkICh0ZXN0MDo6QTo6KikoaW50KXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIHdpdGhvdXQgJyYnIGFuZCBjbGFzcyBuYW1lfX0KICAgICB9CiAgIH07CiB9CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9leHByL2V4cHIudW5hcnkvZXhwci51bmFyeS5vcC9wNi5jcHAgYi90ZXN0L0NYWC9leHByL2V4cHIudW5hcnkvZXhwci51bmFyeS5vcC9wNi5jcHAKaW5kZXggMjY0NjI2NC4uODMzYTQwMSAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvZXhwci9leHByLnVuYXJ5L2V4cHIudW5hcnkub3AvcDYuY3BwCisrKyBiL3Rlc3QvQ1hYL2V4cHIvZXhwci51bmFyeS9leHByLnVuYXJ5Lm9wL3A2LmNwcApAQCAtMTUsNyArMTUsNyBAQAogYm9vbCBiNSA9ICFGOwogCiAvLyAtLSAgcG9pbnRlciwgCi1ib29sIGI2ID0gISZiNDsKK2Jvb2wgYjYgPSAhJmI0OyAvLyBleHBlY3RlZC13YXJuaW5ne3thZGRyZXNzIG9mICdiNCcgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ3RydWUnfX0KIHZvaWQgZigpOwogYm9vbCBiNjEgPSAhJmY7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuY29weS9pbXBsaWNpdC1tb3ZlLWRlZi5jcHAgYi90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmNvcHkvaW1wbGljaXQtbW92ZS1kZWYuY3BwCmluZGV4IDU2OTZkMWYuLjg4MDI2OGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuY29weS9pbXBsaWNpdC1tb3ZlLWRlZi5jcHAKKysrIGIvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L2ltcGxpY2l0LW1vdmUtZGVmLmNwcApAQCAtMSw2ICsxLDYgQEAKLS8vIEZJWE1FOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAtc3RkPWMrKzExICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1vIC0gLXN0ZD1jKysxMSAlcyB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUFTU0lHTiAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAtc3RkPWMrKzExICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQ1RPUiAlcworLy8gRklYTUU6ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSAtc3RkPWMrKzExICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtbyAtIC1zdGQ9YysrMTEgJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1BU1NJR04gJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtbyAtIC1zdGQ9YysrMTEgJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DVE9SICVzCiAKIC8vIGNvbnN0cnVjdAogCmRpZmYgLS1naXQgYS90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmNvcHkvaW1wbGljaXQtbW92ZS5jcHAgYi90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmNvcHkvaW1wbGljaXQtbW92ZS5jcHAKaW5kZXggMjNlY2YyZS4uYTEwZDEzOSAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L2ltcGxpY2l0LW1vdmUuY3BwCisrKyBiL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuY29weS9pbXBsaWNpdC1tb3ZlLmNwcApAQCAtMjU4LDggKzI1OCw4IEBACiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgIHN0cnVjdCBGIDoKLSAgICAgIEU8VCwgMD4sIC8vIGV4cGVjdGVkLW5vdGUtcmUgMnt7J1tCRF0nIGlzIGEgdmlydHVhbCBiYXNlIGNsYXNzIG9mIGJhc2UgY2xhc3MgJ0U8fX0KLSAgICAgIEU8VCwgMT4ge307IC8vIGV4cGVjdGVkLW5vdGUtcmUgMnt7J1tCRF0nIGlzIGEgdmlydHVhbCBiYXNlIGNsYXNzIG9mIGJhc2UgY2xhc3MgJ0U8fX0KKyAgICAgIEU8VCwgMD4sIC8vIGV4cGVjdGVkLW5vdGUtcmUgMnt7J3t7W0JEXX19JyBpcyBhIHZpcnR1YWwgYmFzZSBjbGFzcyBvZiBiYXNlIGNsYXNzICdFPH19CisgICAgICBFPFQsIDE+IHt9OyAvLyBleHBlY3RlZC1ub3RlLXJlIDJ7eyd7e1tCRF19fScgaXMgYSB2aXJ0dWFsIGJhc2UgY2xhc3Mgb2YgYmFzZSBjbGFzcyAnRTx9fQogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICBzdHJ1Y3QgRyA6IEU8VCwgMCwgdHJ1ZT4sIEU8VCwgMD4ge307CkBAIC0yNzIsMTEgKzI3MiwxMSBAQAogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICBzdHJ1Y3QgSiA6Ci0gICAgICBFPFQsIDA+LCAvLyBleHBlY3RlZC1ub3RlLXJlIDJ7eydbQkRdJyBpcyBhIHZpcnR1YWwgYmFzZSBjbGFzcyBvZiBiYXNlIGNsYXNzICdFPH19Ci0gICAgICB2aXJ0dWFsIFQge307IC8vIGV4cGVjdGVkLW5vdGUtcmUgMnt7dmlydHVhbCBiYXNlIGNsYXNzICdbQkRdJyBkZWNsYXJlZCBoZXJlfX0KKyAgICAgIEU8VCwgMD4sIC8vIGV4cGVjdGVkLW5vdGUtcmUgMnt7J3t7W0JEXX19JyBpcyBhIHZpcnR1YWwgYmFzZSBjbGFzcyBvZiBiYXNlIGNsYXNzICdFPH19CisgICAgICB2aXJ0dWFsIFQge307IC8vIGV4cGVjdGVkLW5vdGUtcmUgMnt7dmlydHVhbCBiYXNlIGNsYXNzICd7e1tCRF19fScgZGVjbGFyZWQgaGVyZX19CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIG1vdmUoVCB0KSB7IHQgPSBzdGF0aWNfY2FzdDxUJiY+KHQpOyB9Ci0gICAgLy8gZXhwZWN0ZWQtd2FybmluZy1yZUAtMSA0e3tkZWZhdWx0ZWQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yIG9mIC4qIHdpbGwgbW92ZSBhc3NpZ24gdmlydHVhbCBiYXNlIGNsYXNzICdbQkRdJyBtdWx0aXBsZSB0aW1lc319CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZy1yZUAtMSA0e3tkZWZhdWx0ZWQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yIG9mIHt7Lip9fSB3aWxsIG1vdmUgYXNzaWduIHZpcnR1YWwgYmFzZSBjbGFzcyAne3tbQkRdfX0nIG11bHRpcGxlIHRpbWVzfX0KICAgICB0ZW1wbGF0ZSB2b2lkIG1vdmUoRjxBPik7CiAgICAgdGVtcGxhdGUgdm9pZCBtb3ZlKEY8Qj4pOyAvLyBleHBlY3RlZC1ub3RlIHt7aW4gaW5zdGFudGlhdGlvbiBvZn19CiAgICAgdGVtcGxhdGUgdm9pZCBtb3ZlKEY8Qz4pOwpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L3AxMS4weC5jb3B5LmNwcCBiL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuY29weS9wMTEuMHguY29weS5jcHAKaW5kZXggYTMzNGM1MC4uMWNhMDE0MyAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L3AxMS4weC5jb3B5LmNwcAorKysgYi90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmNvcHkvcDExLjB4LmNvcHkuY3BwCkBAIC0xMzksMyArMTM5LDIyIEBACiAgIFQgJmYoKTsKICAgVCB0ID0gZigpOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2FsbCB0byBpbXBsaWNpdGx5LWRlbGV0ZWQgY29weSBjb25zdHJ1Y3Rvcn19CiB9CisKK25hbWVzcGFjZSBNdXRhYmxlIHsKKyAgc3RydWN0IEEgeworICAgIEEoY29uc3QgQSAmKTsKKyAgICBBKEEgJikgPSBkZWxldGU7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWxldGVkIGhlcmV9fQorICB9OworCisgIHN0cnVjdCBCIHsKKyAgICBBIGE7CisgICAgQihjb25zdCBCICYpOworICB9OworICBCOjpCKGNvbnN0IEIgJikgPSBkZWZhdWx0OworCisgIHN0cnVjdCBDIHsKKyAgICBtdXRhYmxlIEEgYTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlbGV0ZWQgYmVjYXVzZSBmaWVsZCAnYScgaGFzIGEgZGVsZXRlZCBjb3B5IGNvbnN0cnVjdG9yfX0KKyAgICBDKGNvbnN0IEMgJik7CisgIH07CisgIEM6OkMoY29uc3QgQyAmKSA9IGRlZmF1bHQ7IC8vIGV4cGVjdGVkLWVycm9ye3t3b3VsZCBkZWxldGV9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L3AxMS4weC5tb3ZlLmNwcCBiL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuY29weS9wMTEuMHgubW92ZS5jcHAKaW5kZXggMWRjZTI3YS4uNTE0ODE3ZCAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L3AxMS4weC5tb3ZlLmNwcAorKysgYi90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmNvcHkvcDExLjB4Lm1vdmUuY3BwCkBAIC0yLDIxICsyLDIxIEBACiAKIHN0cnVjdCBUcml2aWFsIHt9Owogc3RydWN0IE5vblRyaXZpYWwgewotICBOb25Ucml2aWFsKE5vblRyaXZpYWwmJik7CisgIE5vblRyaXZpYWwoTm9uVHJpdmlhbCYmKTsgLy8gZXhwZWN0ZWQtbm90ZXt7Y29weSBjb25zdHJ1Y3RvciBpcyBpbXBsaWNpdGx5IGRlbGV0ZWR9fQogfTsKIAogLy8gQSBkZWZhdWx0ZWQgbW92ZSBjb25zdHJ1Y3RvciBmb3IgYSBjbGFzcyBYIGlzIGRlZmluZWQgYXMgZGVsZXRlZCBpZiBYIGhhczoKIAogLy8gLS0gYSB2YXJpYW50IG1lbWJlciB3aXRoIGEgbm9uLXRyaXZpYWwgY29ycmVzcG9uZGluZyBjb25zdHJ1Y3RvcgogdW5pb24gRGVsZXRlZE5UVmFyaWFudCB7Ci0gIE5vblRyaXZpYWwgTlQ7CisgIE5vblRyaXZpYWwgTlQ7IC8vIGV4cGVjdGVkLW5vdGV7e2RlbGV0ZWQgYmVjYXVzZSB2YXJpYW50IGZpZWxkICdOVCcgaGFzIGEgbm9uLXRyaXZpYWwgbW92ZSBjb25zdHJ1Y3Rvcn19CiAgIERlbGV0ZWROVFZhcmlhbnQoRGVsZXRlZE5UVmFyaWFudCYmKTsKIH07CiBEZWxldGVkTlRWYXJpYW50OjpEZWxldGVkTlRWYXJpYW50KERlbGV0ZWROVFZhcmlhbnQmJikgPSBkZWZhdWx0OyAvLyBleHBlY3RlZC1lcnJvcnt7d291bGQgZGVsZXRlfX0KIAogc3RydWN0IERlbGV0ZWROVFZhcmlhbnQyIHsKICAgdW5pb24gewotICAgIE5vblRyaXZpYWwgTlQ7CisgICAgTm9uVHJpdmlhbCBOVDsgLy8gZXhwZWN0ZWQtbm90ZXt7ZGVsZXRlZCBiZWNhdXNlIHZhcmlhbnQgZmllbGQgJ05UJyBoYXMgYSBub24tdHJpdmlhbCBtb3ZlIGNvbnN0cnVjdG9yfX0KICAgfTsKICAgRGVsZXRlZE5UVmFyaWFudDIoRGVsZXRlZE5UVmFyaWFudDImJik7CiB9OwpAQCAtMzQsNyArMzQsNyBAQAogfTsKIAogc3RydWN0IEhhc05vQWNjZXNzIHsKLSAgTm9BY2Nlc3MgTkE7CisgIE5vQWNjZXNzIE5BOyAvLyBleHBlY3RlZC1ub3Rle3tkZWxldGVkIGJlY2F1c2UgZmllbGQgJ05BJyBoYXMgYW4gaW5hY2Nlc3NpYmxlIG1vdmUgY29uc3RydWN0b3J9fQogICBIYXNOb0FjY2VzcyhIYXNOb0FjY2VzcyYmKTsKIH07CiBIYXNOb0FjY2Vzczo6SGFzTm9BY2Nlc3MoSGFzTm9BY2Nlc3MmJikgPSBkZWZhdWx0OyAvLyBleHBlY3RlZC1lcnJvcnt7d291bGQgZGVsZXRlfX0KQEAgLTUxLDEzICs1MSwxNiBAQAogfTsKIAogc3RydWN0IElzQW1iaWd1b3VzIHsKLSAgQW1iaWd1aXR5IEE7Ci0gIElzQW1iaWd1b3VzKElzQW1iaWd1b3VzJiYpOworICBBbWJpZ3VpdHkgQTsgLy8gZXhwZWN0ZWQtbm90ZXt7ZGVsZXRlZCBiZWNhdXNlIGZpZWxkICdBJyBoYXMgbXVsdGlwbGUgbW92ZSBjb25zdHJ1Y3RvcnN9fQorICBJc0FtYmlndW91cyhJc0FtYmlndW91cyYmKTsgLy8gZXhwZWN0ZWQtbm90ZXt7Y29weSBjb25zdHJ1Y3RvciBpcyBpbXBsaWNpdGx5IGRlbGV0ZWQgYmVjYXVzZSAnSXNBbWJpZ3VvdXMnIGhhcyBhIHVzZXItZGVjbGFyZWQgbW92ZSBjb25zdHJ1Y3Rvcn19CiB9OwogSXNBbWJpZ3VvdXM6OklzQW1iaWd1b3VzKElzQW1iaWd1b3VzJiYpID0gZGVmYXVsdDsgLy8gZXhwZWN0ZWQtZXJyb3J7e3dvdWxkIGRlbGV0ZX19CiAKIHN0cnVjdCBEZWxldGVkIHsKLSAgSXNBbWJpZ3VvdXMgSUE7CisgIC8vIEZJWE1FOiBUaGlzIGRpYWdub3N0aWMgaXMgc2xpZ2h0bHkgd3Jvbmc6IHRoZSBjb25zdHJ1Y3RvciB3ZSBzZWxlY3QgdG8gbW92ZQorICAvLyAnSUEnIGlzIGRlbGV0ZWQsIGJ1dCB3ZSBzZWxlY3QgdGhlIGNvcHkgY29uc3RydWN0b3IgKHdlIGlnbm9yZSB0aGUgbW92ZQorICAvLyBjb25zdHJ1Y3RvciwgYmVjYXVzZSBpdCB3YXMgZGVmYXVsdGVkIGFuZCBkZWxldGVkKS4KKyAgSXNBbWJpZ3VvdXMgSUE7IC8vIGV4cGVjdGVkLW5vdGV7e2RlbGV0ZWQgYmVjYXVzZSBmaWVsZCAnSUEnIGhhcyBhIGRlbGV0ZWQgbW92ZSBjb25zdHJ1Y3Rvcn19CiAgIERlbGV0ZWQoRGVsZXRlZCYmKTsKIH07CiBEZWxldGVkOjpEZWxldGVkKERlbGV0ZWQmJikgPSBkZWZhdWx0OyAvLyBleHBlY3RlZC1lcnJvcnt7d291bGQgZGVsZXRlfX0KQEAgLTcwLDEyICs3MywxNSBAQAogfTsKIENvbnN0TWVtYmVyOjpDb25zdE1lbWJlcihDb25zdE1lbWJlciYmKSA9IGRlZmF1bHQ7IC8vIG9rLCBjYWxscyBjb3B5IGN0b3IKIHN0cnVjdCBDb25zdE1vdmVPbmx5TWVtYmVyIHsKLSAgY29uc3QgTm9uVHJpdmlhbCBjbnQ7CisgIC8vIEZJWE1FOiBUaGlzIGRpYWdub3N0aWMgaXMgc2xpZ2h0bHkgd3Jvbmc6IHRoZSBjb25zdHJ1Y3RvciB3ZSBzZWxlY3QgdG8gbW92ZQorICAvLyAnY250JyBpcyBkZWxldGVkLCBidXQgd2Ugc2VsZWN0IHRoZSBjb3B5IGNvbnN0cnVjdG9yLCBiZWNhdXNlIHRoZSBvYmplY3QgaXMKKyAgLy8gY29uc3QuCisgIGNvbnN0IE5vblRyaXZpYWwgY250OyAvLyBleHBlY3RlZC1ub3Rle3tkZWxldGVkIGJlY2F1c2UgZmllbGQgJ2NudCcgaGFzIGEgZGVsZXRlZCBtb3ZlIGNvbnN0cnVjdG9yfX0KICAgQ29uc3RNb3ZlT25seU1lbWJlcihDb25zdE1vdmVPbmx5TWVtYmVyJiYpOwogfTsKIENvbnN0TW92ZU9ubHlNZW1iZXI6OkNvbnN0TW92ZU9ubHlNZW1iZXIoQ29uc3RNb3ZlT25seU1lbWJlciYmKSA9IGRlZmF1bHQ7IC8vIGV4cGVjdGVkLWVycm9ye3t3b3VsZCBkZWxldGV9fQogc3RydWN0IFZvbGF0aWxlTWVtYmVyIHsKLSAgdm9sYXRpbGUgVHJpdmlhbCB2dDsKKyAgdm9sYXRpbGUgVHJpdmlhbCB2dDsgLy8gZXhwZWN0ZWQtbm90ZXt7ZGVsZXRlZCBiZWNhdXNlIGZpZWxkICd2dCcgaGFzIG5vIG1vdmUgY29uc3RydWN0b3J9fQogICBWb2xhdGlsZU1lbWJlcihWb2xhdGlsZU1lbWJlciYmKTsKIH07CiBWb2xhdGlsZU1lbWJlcjo6Vm9sYXRpbGVNZW1iZXIoVm9sYXRpbGVNZW1iZXImJikgPSBkZWZhdWx0OyAvLyBleHBlY3RlZC1lcnJvcnt7d291bGQgZGVsZXRlfX0KQEAgLTgzLDE3ICs4OSwxNyBAQAogLy8gLS0gYSBkaXJlY3Qgb3IgdmlydHVhbCBiYXNlIGNsYXNzIEIgdGhhdCBjYW5ub3QgYmUgbW92ZWQgYmVjYXVzZSBvdmVybG9hZAogLy8gICAgcmVzb2x1dGlvbiByZXN1bHRzIGluIGFuIGFtYmlndWl0eSBvciBhIGZ1bmN0aW9uIHRoYXQgaXMgZGVsZXRlZCBvcgogLy8gICAgaW5hY2Nlc3NpYmxlCi1zdHJ1Y3QgQW1iaWd1b3VzTW92ZUJhc2UgOiBBbWJpZ3VpdHkgewotICBBbWJpZ3VvdXNNb3ZlQmFzZShBbWJpZ3VvdXNNb3ZlQmFzZSYmKTsKK3N0cnVjdCBBbWJpZ3VvdXNNb3ZlQmFzZSA6IEFtYmlndWl0eSB7IC8vIGV4cGVjdGVkLW5vdGV7e2RlbGV0ZWQgYmVjYXVzZSBiYXNlIGNsYXNzICdBbWJpZ3VpdHknIGhhcyBtdWx0aXBsZSBtb3ZlIGNvbnN0cnVjdG9yc319CisgIEFtYmlndW91c01vdmVCYXNlKEFtYmlndW91c01vdmVCYXNlJiYpOyAvLyBleHBlY3RlZC1ub3Rle3tjb3B5IGNvbnN0cnVjdG9yIGlzIGltcGxpY2l0bHkgZGVsZXRlZH19CiB9OwogQW1iaWd1b3VzTW92ZUJhc2U6OkFtYmlndW91c01vdmVCYXNlKEFtYmlndW91c01vdmVCYXNlJiYpID0gZGVmYXVsdDsgLy8gZXhwZWN0ZWQtZXJyb3J7e3dvdWxkIGRlbGV0ZX19CiAKLXN0cnVjdCBEZWxldGVkTW92ZUJhc2UgOiBBbWJpZ3VvdXNNb3ZlQmFzZSB7CitzdHJ1Y3QgRGVsZXRlZE1vdmVCYXNlIDogQW1iaWd1b3VzTW92ZUJhc2UgeyAvLyBleHBlY3RlZC1ub3Rle3tkZWxldGVkIGJlY2F1c2UgYmFzZSBjbGFzcyAnQW1iaWd1b3VzTW92ZUJhc2UnIGhhcyBhIGRlbGV0ZWQgbW92ZSBjb25zdHJ1Y3Rvcn19CiAgIERlbGV0ZWRNb3ZlQmFzZShEZWxldGVkTW92ZUJhc2UmJik7CiB9OwogRGVsZXRlZE1vdmVCYXNlOjpEZWxldGVkTW92ZUJhc2UoRGVsZXRlZE1vdmVCYXNlJiYpID0gZGVmYXVsdDsgLy8gZXhwZWN0ZWQtZXJyb3J7e3dvdWxkIGRlbGV0ZX19CiAKLXN0cnVjdCBJbmFjY2Vzc2libGVNb3ZlQmFzZSA6IE5vQWNjZXNzIHsKK3N0cnVjdCBJbmFjY2Vzc2libGVNb3ZlQmFzZSA6IE5vQWNjZXNzIHsgLy8gZXhwZWN0ZWQtbm90ZXt7ZGVsZXRlZCBiZWNhdXNlIGJhc2UgY2xhc3MgJ05vQWNjZXNzJyBoYXMgYW4gaW5hY2Nlc3NpYmxlIG1vdmUgY29uc3RydWN0b3J9fQogICBJbmFjY2Vzc2libGVNb3ZlQmFzZShJbmFjY2Vzc2libGVNb3ZlQmFzZSYmKTsKIH07CiBJbmFjY2Vzc2libGVNb3ZlQmFzZTo6SW5hY2Nlc3NpYmxlTW92ZUJhc2UoSW5hY2Nlc3NpYmxlTW92ZUJhc2UmJikgPSBkZWZhdWx0OyAvLyBleHBlY3RlZC1lcnJvcnt7d291bGQgZGVsZXRlfX0KQEAgLTEwOCw3ICsxMTQsNyBAQAogfTsKIAogc3RydWN0IEhhc05vQWNjZXNzRHRvciB7Ci0gIE5vQWNjZXNzRHRvciBOQUQ7CisgIE5vQWNjZXNzRHRvciBOQUQ7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWxldGVkIGJlY2F1c2UgZmllbGQgJ05BRCcgaGFzIGFuIGluYWNjZXNzaWJsZSBkZXN0cnVjdG9yfX0KICAgSGFzTm9BY2Nlc3NEdG9yKEhhc05vQWNjZXNzRHRvciYmKTsKIH07CiBIYXNOb0FjY2Vzc0R0b3I6Okhhc05vQWNjZXNzRHRvcihIYXNOb0FjY2Vzc0R0b3ImJikgPSBkZWZhdWx0OyAvLyBleHBlY3RlZC1lcnJvcnt7d291bGQgZGVsZXRlfX0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuY29weS9wMTMtMHguY3BwIGIvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L3AxMy0weC5jcHAKaW5kZXggNWQ0MzYwMS4uMTZjOGE0MCAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L3AxMy0weC5jcHAKKysrIGIvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L3AxMy0weC5jcHAKQEAgLTExNCwzICsxMTQsMTggQEAKICAgICBmcmllbmQgY29uc3RleHByIFM8Vz46OlMoY29uc3QgUzxXPiYpIG5vZXhjZXB0OwogICB9OwogfQorCituYW1lc3BhY2UgTXV0YWJsZSB7CisgIHN0cnVjdCBBIHsKKyAgICBjb25zdGV4cHIgQShBICYpOworICAgIEEoY29uc3QgQSAmKTsKKyAgfTsKKyAgc3RydWN0IEIgeworICAgIGNvbnN0ZXhwciBCKGNvbnN0IEIgJikgPSBkZWZhdWx0OyAvLyBvaworICAgIG11dGFibGUgQSBhOworICB9OworICBzdHJ1Y3QgQyB7CisgICAgY29uc3RleHByIEMoY29uc3QgQyAmKSA9IGRlZmF1bHQ7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm90IGNvbnN0ZXhwcn19CisgICAgQSBhOworICB9OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L3AyMy1jeHgxMS5jcHAgYi90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmNvcHkvcDIzLWN4eDExLmNwcAppbmRleCBkZTA3MWYwLi5hYzIxY2M2IDEwMDY0NAotLS0gYS90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmNvcHkvcDIzLWN4eDExLmNwcAorKysgYi90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmNvcHkvcDIzLWN4eDExLmNwcApAQCAtMzAsOCArMzAsOCBAQAogICBOb25Ucml2aWFsTW92ZUFzc2lnbiAmb3BlcmF0b3I9KE5vblRyaXZpYWxNb3ZlQXNzaWduICYmKTsKIH07CiBzdHJ1Y3QgQW1iaWd1b3VzQ29weUFzc2lnbiB7Ci0gIEFtYmlndW91c0NvcHlBc3NpZ24gJm9wZXJhdG9yPShjb25zdCBBbWJpZ3VvdXNDb3B5QXNzaWduICYpOwotICBBbWJpZ3VvdXNDb3B5QXNzaWduICZvcGVyYXRvcj0odm9sYXRpbGUgQW1iaWd1b3VzQ29weUFzc2lnbiAmKTsKKyAgQW1iaWd1b3VzQ29weUFzc2lnbiAmb3BlcmF0b3I9KGNvbnN0IEFtYmlndW91c0NvcHlBc3NpZ24gJikgdm9sYXRpbGU7CisgIEFtYmlndW91c0NvcHlBc3NpZ24gJm9wZXJhdG9yPShjb25zdCBBbWJpZ3VvdXNDb3B5QXNzaWduICYpIGNvbnN0OwogfTsKIHN0cnVjdCBBbWJpZ3VvdXNNb3ZlQXNzaWduIHsKICAgQW1iaWd1b3VzTW92ZUFzc2lnbiAmb3BlcmF0b3I9KGNvbnN0IEFtYmlndW91c01vdmVBc3NpZ24gJiYpOwpAQCAtMTc0LDMgKzE3NCwxOCBAQAogICAgIHQgPSBUKCk7IC8vIGV4cGVjdGVkLWVycm9ye3tvYmplY3Qgb2YgdHlwZSAnUFIxMzM4MTo6VCcgY2Fubm90IGJlIGFzc2lnbmVkIGJlY2F1c2UgaXRzIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvciBpcyBpbXBsaWNpdGx5IGRlbGV0ZWR9fQogICB9CiB9CisKK25hbWVzcGFjZSBNdXRhYmxlIHsKKyAgc3RydWN0IEFtYmlndW91c0NvcHlBc3NpZ24geworICAgIEFtYmlndW91c0NvcHlBc3NpZ24gJm9wZXJhdG9yPShjb25zdCBBbWJpZ3VvdXNDb3B5QXNzaWduICYpOworICAgIEFtYmlndW91c0NvcHlBc3NpZ24gJm9wZXJhdG9yPSh2b2xhdGlsZSBBbWJpZ3VvdXNDb3B5QXNzaWduICYpOworICB9OworICBzdHJ1Y3QgWCB7CisgICAgQW1iaWd1b3VzQ29weUFzc2lnbiBhOworICB9OworICBzdHJ1Y3QgWSB7CisgICAgbXV0YWJsZSBBbWJpZ3VvdXNDb3B5QXNzaWduIGE7IC8vIGV4cGVjdGVkLW5vdGUge3ttdWx0aXBsZSBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3JzfX0KKyAgfTsKK30KK3RlbXBsYXRlIHN0cnVjdCBDb3B5QXNzaWduPE11dGFibGU6Olg+OwordGVtcGxhdGUgc3RydWN0IENvcHlBc3NpZ248TXV0YWJsZTo6WT47IC8vIGV4cGVjdGVkLW5vdGUge3toZXJlfX0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuY29weS9wMzMtMHguY3BwIGIvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L3AzMy0weC5jcHAKaW5kZXggYjY2ZTE5YS4uMjhjZDRmMyAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L3AzMy0weC5jcHAKKysrIGIvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5jb3B5L3AzMy0weC5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICAgc3RydWN0IFggewogICAgIFgoKTsKICAgICBYKFgmJik7Ci0gICAgWChjb25zdCBYJikgPSBkZWxldGU7IC8vIGV4cGVjdGVkLW5vdGUgMnt7ZnVuY3Rpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KKyAgICBYKGNvbnN0IFgmKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSAye3snWCcgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KICAgfTsKIAogICB2b2lkIGYoaW50IGkpIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuZHRvci9wMTAtMHguY3BwIGIvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5kdG9yL3AxMC0weC5jcHAKaW5kZXggZTEwYWZiNS4uMDI5Y2JkNiAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5kdG9yL3AxMC0weC5jcHAKKysrIGIvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5kdG9yL3AxMC0weC5jcHAKQEAgLTcsNyArNyw3IEBACiB2b2lkIGIoY29uc3QgVCAqeCwgY29uc3QgQSAqeSkgewogICB4LT5+ZGVjbHR5cGUoVCgpKSgpOwogICB4LT5+ZGVjbHR5cGUoKngpKCk7IC8vIGV4cGVjdGVkLWVycm9ye3t0aGUgdHlwZSBvZiBvYmplY3QgZXhwcmVzc2lvbiAoJ2NvbnN0IGludCcpIGRvZXMgbm90IG1hdGNoIHRoZSB0eXBlIGJlaW5nIGRlc3Ryb3llZCAoJ2RlY2x0eXBlKCp4KScgKGFrYSAnY29uc3QgaW50ICYnKSkgaW4gcHNldWRvLWRlc3RydWN0b3IgZXhwcmVzc2lvbn19IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1lcnJvcnt7bm8gbWVtYmVyIG5hbWVkICd+Y29uc3Qgc3RydWN0IEEgJicgaW4gJ0EnfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1lcnJvcnt7bm8gbWVtYmVyIG5hbWVkICd+Y29uc3QgQSAmJyBpbiAnQSd9fQogICB4LT5+ZGVjbHR5cGUoaW50KCkpKCk7IC8vIGV4cGVjdGVkLWVycm9ye3tubyBtZW1iZXIgbmFtZWQgJ35pbnQnIGluICdBJ319CiAKICAgeS0+fmRlY2x0eXBlKCp5KSgpOyAvLyBleHBlY3RlZC1lcnJvcnt7ZGVzdHJ1Y3RvciB0eXBlICdkZWNsdHlwZSgqeSknIChha2EgJ2NvbnN0IEEgJicpIGluIG9iamVjdCBkZXN0cnVjdGlvbiBleHByZXNzaW9uIGRvZXMgbm90IG1hdGNoIHRoZSB0eXBlICdjb25zdCBBJyBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlc3Ryb3llZH19CmRpZmYgLS1naXQgYS90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmR0b3IvcDMtMHguY3BwIGIvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5kdG9yL3AzLTB4LmNwcAppbmRleCBkYzc2ZTAwLi4yZDdlYmE0IDEwMDY0NAotLS0gYS90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmR0b3IvcDMtMHguY3BwCisrKyBiL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuZHRvci9wMy0weC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZmV4Y2VwdGlvbnMgLWZjeHgtZXhjZXB0aW9ucyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZmV4Y2VwdGlvbnMgLWZjeHgtZXhjZXB0aW9ucyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAogc3RydWN0IEEgewogICB+QSgpOwpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5kdG9yL3A5LmNwcCBiL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuZHRvci9wOS5jcHAKaW5kZXggOGI3NmExNS4uYTAzZmNkYiAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5kdG9yL3A5LmNwcAorKysgYi90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmR0b3IvcDkuY3BwCkBAIC0xLDQgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC10cmlwbGUgJW1zX2FiaV90cmlwbGUgLURNU0FCSSAtdmVyaWZ5ICVzCiAKIHR5cGVkZWYgdHlwZW9mKHNpemVvZihpbnQpKSBzaXplX3Q7CiAKQEAgLTc0LDcgKzc1LDEzIEBACiAvLyBQUjczNDYKIG5hbWVzcGFjZSB0ZXN0MyB7CiAgIHN0cnVjdCBBIHsKKyNpZmRlZiBNU0FCSQorICAgIC8vIGV4cGVjdGVkLWVycm9yQCsyIHt7bm8gc3VpdGFibGUgbWVtYmVyICdvcGVyYXRvciBkZWxldGUnIGluICdBJ319CisjZW5kaWYKICAgICB2aXJ0dWFsIH5BKCk7CisjaWZkZWYgTVNBQkkKKyAgICAvLyBleHBlY3RlZC1ub3RlQCsyIHt7ZGVjbGFyZWQgaGVyZX19CisjZW5kaWYKICAgICBzdGF0aWMgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIGNvbnN0IGludCAmKTsKICAgfTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5pbmhjdG9yL2Vsc2V3aGVyZS5jcHAgYi90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmluaGN0b3IvZWxzZXdoZXJlLmNwcAppbmRleCBiOTg2ZjY1Li5jMDQyODM0IDEwMDY0NAotLS0gYS90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmluaGN0b3IvZWxzZXdoZXJlLmNwcAorKysgYi90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmluaGN0b3IvZWxzZXdoZXJlLmNwcApAQCAtOSw3ICs5LDcgQEAKICAgQjEoaW50KTsKIH07CiAKLXVzaW5nIEIxOjpCMTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2luZyBkZWNsYXJhdGlvbiBjYW4gbm90IHJlZmVyIHRvIGNsYXNzIG1lbWJlcn19Cit1c2luZyBCMTo6QjE7IC8vIGV4cGVjdGVkLWVycm9yIHt7dXNpbmcgZGVjbGFyYXRpb24gY2Fubm90IHJlZmVyIHRvIGNsYXNzIG1lbWJlcn19CiAKIC8vIEMrKzExIFtuYW1lc3BhY2UudWRlY2xdcDEwOgogLy8gICBBIHVzaW5nLWRlY2xhcmF0aW9uIGlzIGEgZGVjbGFyYXRpb24gYW5kIGNhbiB0aGVyZWZvcmUgYmUgdXNlZCByZXBlYXRlZGx5CkBAIC0yNyw3ICsyNyw3IEBACiAvLyAgIHNoYWxsIG5hbWUgYSBkaXJlY3QgYmFzZSBjbGFzcyBvZiB0aGUgY2xhc3MgYmVpbmcgZGVmaW5lZC4KIAogc3RydWN0IEQxIDogSTEgewotICB1c2luZyBCMTo6QjE7IC8vIGV4cGVjdGVkLWVycm9yIHt7J0IxJyBpcyBub3QgYSBkaXJlY3QgYmFzZSBvZiAnRDEnLCBjYW4gbm90IGluaGVyaXQgY29uc3RydWN0b3JzfX0KKyAgdXNpbmcgQjE6OkIxOyAvLyBleHBlY3RlZC1lcnJvciB7eydCMScgaXMgbm90IGEgZGlyZWN0IGJhc2Ugb2YgJ0QxJywgY2Fubm90IGluaGVyaXQgY29uc3RydWN0b3JzfX0KIH07CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBIHt9OwpAQCAtNDcsNyArNDcsNyBAQAogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgRCA6IEE8VD4ge307CiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgRSA6IEQ8VD4gewotICB1c2luZyBBPGJvb2w+OjpBOyAvLyBleHBlY3RlZC1lcnJvciB7eydBPGJvb2w+JyBpcyBub3QgYSBkaXJlY3QgYmFzZSBvZiAnRTxib29sPicsIGNhbiBub3QgaW5oZXJpdH19CisgIHVzaW5nIEE8Ym9vbD46OkE7IC8vIGV4cGVjdGVkLWVycm9yIHt7J0E8Ym9vbD4nIGlzIG5vdCBhIGRpcmVjdCBiYXNlIG9mICdFPGJvb2w+JywgY2Fubm90IGluaGVyaXR9fQogfTsKIEU8Ym9vbD4gZWI7IC8vIGV4cGVjdGVkLW5vdGUge3toZXJlfX0KIApkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5pbmhjdG9yL3A0LmNwcCBiL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuaW5oY3Rvci9wNC5jcHAKaW5kZXggMzU2Y2RlZi4uYWUxZjdhNSAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5pbmhjdG9yL3A0LmNwcAorKysgYi90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLmluaGN0b3IvcDQuY3BwCkBAIC00Myw4ICs0Myw4IEBACiAKIC8vIEl0IGlzIGRlbGV0ZWQgaWYgdGhlIGNvcnJlc3BvbmRpbmcgY29uc3RydWN0b3IgWy4uLl0gaXMgZGVsZXRlZC4KIHN0cnVjdCBHIHsKLSAgRyhpbnQpID0gZGVsZXRlOyAvLyBleHBlY3RlZC1ub3RlIHt7ZnVuY3Rpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gRyhUKikgPSBkZWxldGU7IC8vIGV4cGVjdGVkLW5vdGUge3tmdW5jdGlvbiBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZWxldGVkIGhlcmV9fQorICBHKGludCkgPSBkZWxldGU7IC8vIGV4cGVjdGVkLW5vdGUge3snRycgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gRyhUKikgPSBkZWxldGU7IC8vIGV4cGVjdGVkLW5vdGUge3snRzxjb25zdCBjaGFyPicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KIH07CiBzdHJ1Y3QgSCA6IEcgewogICB1c2luZyBHOjpHOyAvLyBleHBlY3RlZC1ub3RlIDJ7e2RlbGV0ZWQgY29uc3RydWN0b3Igd2FzIGluaGVyaXRlZCBoZXJlfX0KZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MuaW5pdC9jbGFzcy5iYXNlLmluaXQvcDgtMHguY3BwIGIvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5pbml0L2NsYXNzLmJhc2UuaW5pdC9wOC0weC5jcHAKaW5kZXggYTEwODUzMy4uNDU3NTVjYSAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5pbml0L2NsYXNzLmJhc2UuaW5pdC9wOC0weC5jcHAKKysrIGIvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy5pbml0L2NsYXNzLmJhc2UuaW5pdC9wOC0weC5jcHAKQEAgLTE2LDE2ICsxNiwxMyBAQAogfSBzKDApOwogCiB1bmlvbiBVIHsKLSAgaW50IGEgPSAwOyAvLyBkZXNpcmVkLW5vdGUgNSB7e3ByZXZpb3VzIGluaXRpYWxpemF0aW9uIGlzIGhlcmV9fQotICBjaGFyIGIgPSAneCc7CisgIGludCBhID0gMDsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzIGluaXRpYWxpemF0aW9ufX0KKyAgY2hhciBiID0gJ3gnOyAvLyBleHBlY3RlZC1lcnJvciB7e2luaXRpYWxpemluZyBtdWx0aXBsZSBtZW1iZXJzIG9mIHVuaW9ufX0KIAotICAvLyBGSVhNRTogdGhlc2Ugc2hvdWxkIGFsbCBiZSByZWplY3RlZAotICBVKCkge30gLy8gZGVzaXJlZC1lcnJvciB7e2luaXRpYWxpemluZyBtdWx0aXBsZSBtZW1iZXJzIG9mIHVuaW9ufX0KLSAgVShpbnQpIDogYSgxKSB7fSAvLyBkZXNpcmVkLWVycm9yIHt7aW5pdGlhbGl6aW5nIG11bHRpcGxlIG1lbWJlcnMgb2YgdW5pb259fQotICBVKGNoYXIpIDogYigneScpIHt9IC8vIGRlc2lyZWQtZXJyb3Ige3tpbml0aWFsaXppbmcgbXVsdGlwbGUgbWVtYmVycyBvZiB1bmlvbn19Ci0gIC8vIHRoaXMgZXhwZWN0ZWQgbm90ZSBzaG91bGQgYmUgcmVtb3ZlZCAmIHRoZSBub3RlIHNob3VsZCBhcHBlYXIgb24gdGhlIAotICAvLyBkZWNsYXJhdGlvbiBvZiAnYScgd2hlbiB0aGlzIHNldCBvZiBjYXNlcyBpcyBoYW5kbGVkIGNvcnJlY3RseS4KLSAgVShkb3VibGUpIDogYSgxKSwgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgaW5pdGlhbGl6YXRpb24gaXMgaGVyZX19IGRlc2lyZWQtZXJyb3Ige3tpbml0aWFsaXppbmcgbXVsdGlwbGUgbWVtYmVycyBvZiB1bmlvbn19CisgIFUoKSB7fQorICBVKGludCkgOiBhKDEpIHt9CisgIFUoY2hhcikgOiBiKCd5Jykge30KKyAgVShkb3VibGUpIDogYSgxKSwgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgaW5pdGlhbGl6YXRpb24gaXMgaGVyZX19CiAgICAgICAgICAgICAgIGIoJ3knKSB7fSAvLyBleHBlY3RlZC1lcnJvcnt7aW5pdGlhbGl6aW5nIG11bHRpcGxlIG1lbWJlcnMgb2YgdW5pb259fQogfTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy50ZW1wb3JhcnkvcDEuY3BwIGIvdGVzdC9DWFgvc3BlY2lhbC9jbGFzcy50ZW1wb3JhcnkvcDEuY3BwCmluZGV4IDRmNmFjMGEuLjc1YTU2ZGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL3NwZWNpYWwvY2xhc3MudGVtcG9yYXJ5L3AxLmNwcAorKysgYi90ZXN0L0NYWC9zcGVjaWFsL2NsYXNzLnRlbXBvcmFyeS9wMS5jcHAKQEAgLTYsNyArNiw3IEBACiAgICAgaW50IHg7CiAgICAgaW50IHk7CiAKLSAgICBBKGNvbnN0IEEmKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2Z1bmN0aW9uIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlbGV0ZWQgaGVyZX19CisgICAgQShjb25zdCBBJikgPSBkZWxldGU7IC8vIGV4cGVjdGVkLW5vdGUge3snQScgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KICAgfTsKIAogICB2b2lkIGZvbyguLi4pOwpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvdGVtcC9wMy5jcHAgYi90ZXN0L0NYWC90ZW1wL3AzLmNwcAppbmRleCAxMWY3MmRlLi5lOWZkOGEzIDEwMDY0NAotLS0gYS90ZXN0L0NYWC90ZW1wL3AzLmNwcAorKysgYi90ZXN0L0NYWC90ZW1wL3AzLmNwcApAQCAtOCw3ICs4LDggQEAKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEEgeyBzdGF0aWMgQSBhOyB9IEE8VD46OmE7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJzsnIGFmdGVyIHN0cnVjdH19IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ1QnfX0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWVycm9ye3tleHRyYSBxdWFsaWZpY2F0aW9ufX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1lcnJvciB7e25vIG1lbWJlciBuYW1lZCAnYSd9fSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHF1YWxpZmljYXRpb259fQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQiB7IH0gZigpOyAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICc7JyBhZnRlciBzdHJ1Y3R9fSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1lcnJvciB7e3JlcXVpcmVzIGEgdHlwZSBzcGVjaWZpZXJ9fQpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvdGVtcC90ZW1wLmFyZy90ZW1wLmFyZy5ub250eXBlL3A1LmNwcCBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5hcmcvdGVtcC5hcmcubm9udHlwZS9wNS5jcHAKaW5kZXggOWI5YjUzMi4uZTg3MTUzYiAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvdGVtcC90ZW1wLmFyZy90ZW1wLmFyZy5ub250eXBlL3A1LmNwcAorKysgYi90ZXN0L0NYWC90ZW1wL3RlbXAuYXJnL3RlbXAuYXJnLm5vbnR5cGUvcDUuY3BwCkBAIC0xODQsNyArMTg0LDcgQEAKICAgdGVtcGxhdGU8aW50IChZOjoqKShpbnQpPiBzdHJ1Y3QgWDAge307IC8vIGV4cGVjdGVkLW5vdGV7e3RlbXBsYXRlIHBhcmFtZXRlciBpcyBkZWNsYXJlZCBoZXJlfX0KICAgWDA8Jlk6OmY+IHgwYTsKICAgWDA8Jlk6Omc+IHgwYjsKLSAgWDA8Jlk6Omg+IHgwYzsgLy8gZXhwZWN0ZWQtZXJyb3J7e25vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IG9mIHR5cGUgJ2Zsb2F0IChwb2ludGVyX3RvX21lbWJlcl9mdW5jdGlvbjo6WTo6KikoZmxvYXQpJyBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgdmFsdWUgb2YgdHlwZSAnaW50IChwb2ludGVyX3RvX21lbWJlcl9mdW5jdGlvbjo6WTo6KikoaW50KSd9fQorICBYMDwmWTo6aD4geDBjOyAvLyBleHBlY3RlZC1lcnJvci1yZXt7bm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnQgb2YgdHlwZSAnZmxvYXQgKHBvaW50ZXJfdG9fbWVtYmVyX2Z1bmN0aW9uOjpZOjoqKShmbG9hdCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319JyBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgdmFsdWUgb2YgdHlwZSAnaW50IChwb2ludGVyX3RvX21lbWJlcl9mdW5jdGlvbjo6WTo6KikoaW50KXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nfX0KIH0KIAogLy8gICAgIC0tIEZvciBhIG5vbi10eXBlIHRlbXBsYXRlLXBhcmFtZXRlciBvZiB0eXBlIHBvaW50ZXIgdG8gZGF0YSBtZW1iZXIsCmRpZmYgLS1naXQgYS90ZXN0L0NYWC90ZW1wL3RlbXAuZGVjbHMvdGVtcC5jbGFzcy5zcGVjL3A4LTF5LmNwcCBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5kZWNscy90ZW1wLmNsYXNzLnNwZWMvcDgtMXkuY3BwCmluZGV4IGE0OWRiNTEuLjI2NTFmOTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL3RlbXAvdGVtcC5kZWNscy90ZW1wLmNsYXNzLnNwZWMvcDgtMXkuY3BwCisrKyBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5kZWNscy90ZW1wLmNsYXNzLnNwZWMvcDgtMXkuY3BwCkBAIC0yMSwxMCArMjEsMTAgQEAKIAogdGVtcGxhdGU8dHlwZW5hbWUgT3V0ZXI+IHN0cnVjdCBYIHsKICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5uZXI+IHN0YXRpYyBpbnQgeTsKLSAgdGVtcGxhdGU8dHlwZW5hbWUgSW5uZXI+IHN0YXRpYyBpbnQgeTxPdXRlcj47IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW4gbm90IGJlIGRlZHVjZWR9fSBleHBlY3RlZC1ub3RlIHt7J0lubmVyJ319CisgIHRlbXBsYXRlPHR5cGVuYW1lIElubmVyPiBzdGF0aWMgaW50IHk8T3V0ZXI+OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGJlIGRlZHVjZWR9fSBleHBlY3RlZC1ub3RlIHt7J0lubmVyJ319CiAgIHRlbXBsYXRlPHR5cGVuYW1lIElubmVyPiBzdGF0aWMgaW50IHk8SW5uZXI+OyAvLyBleHBlY3RlZC1lcnJvciB7e2RvZXMgbm90IHNwZWNpYWxpemV9fQogfTsKLXRlbXBsYXRlPHR5cGVuYW1lIE91dGVyPiB0ZW1wbGF0ZTx0eXBlbmFtZSBJbm5lcj4gaW50IFg8T3V0ZXI+Ojp5PE91dGVyPjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbiBub3QgYmUgZGVkdWNlZH19IGV4cGVjdGVkLW5vdGUge3snSW5uZXInfX0KK3RlbXBsYXRlPHR5cGVuYW1lIE91dGVyPiB0ZW1wbGF0ZTx0eXBlbmFtZSBJbm5lcj4gaW50IFg8T3V0ZXI+Ojp5PE91dGVyPjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Nhbm5vdCBiZSBkZWR1Y2VkfX0gZXhwZWN0ZWQtbm90ZSB7eydJbm5lcid9fQogdGVtcGxhdGU8dHlwZW5hbWUgT3V0ZXI+IHRlbXBsYXRlPHR5cGVuYW1lIElubmVyPiBpbnQgWDxPdXRlcj46Onk8SW5uZXI+OyAvLyBleHBlY3RlZC1lcnJvciB7e2RvZXMgbm90IHNwZWNpYWxpemV9fQogCiAvLyBGSVhNRTogTWVyZ2luZyB0aGlzIHdpdGggdGhlIGFib3ZlIGNsYXNzIGNhdXNlcyBhbiBhc3NlcnRpb24gZmFpbHVyZSB3aGVuCmRpZmYgLS1naXQgYS90ZXN0L0NYWC90ZW1wL3RlbXAuZGVjbHMvdGVtcC5tZW0vcDMuY3BwIGIvdGVzdC9DWFgvdGVtcC90ZW1wLmRlY2xzL3RlbXAubWVtL3AzLmNwcAppbmRleCAwZWI3NDdiLi43ZTEzZjJhIDEwMDY0NAotLS0gYS90ZXN0L0NYWC90ZW1wL3RlbXAuZGVjbHMvdGVtcC5tZW0vcDMuY3BwCisrKyBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5kZWNscy90ZW1wLm1lbS9wMy5jcHAKQEAgLTEsNiArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCiAKIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgQUEgeyAKLSAgdGVtcGxhdGUgPGNsYXNzIEM+IHZpcnR1YWwgdm9pZCBnKEMpOyAvLyBleHBlY3RlZC1lcnJvcnt7J3ZpcnR1YWwnIGNhbiBub3QgYmUgc3BlY2lmaWVkIG9uIG1lbWJlciBmdW5jdGlvbiB0ZW1wbGF0ZXN9fQorICB0ZW1wbGF0ZSA8Y2xhc3MgQz4gdmlydHVhbCB2b2lkIGcoQyk7IC8vIGV4cGVjdGVkLWVycm9ye3sndmlydHVhbCcgY2Fubm90IGJlIHNwZWNpZmllZCBvbiBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGVzfX0KICAgdmlydHVhbCB2b2lkIGYoKTsKIH07CmRpZmYgLS1naXQgYS90ZXN0L0NYWC90ZW1wL3RlbXAuZGVjbHMvdGVtcC52YXJpYWRpYy9maXhlZC1leHBhbnNpb24uY3BwIGIvdGVzdC9DWFgvdGVtcC90ZW1wLmRlY2xzL3RlbXAudmFyaWFkaWMvZml4ZWQtZXhwYW5zaW9uLmNwcAppbmRleCBmYjcyNzU0Li5hNDY2YmUwIDEwMDY0NAotLS0gYS90ZXN0L0NYWC90ZW1wL3RlbXAuZGVjbHMvdGVtcC52YXJpYWRpYy9maXhlZC1leHBhbnNpb24uY3BwCisrKyBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5kZWNscy90ZW1wLnZhcmlhZGljL2ZpeGVkLWV4cGFuc2lvbi5jcHAKQEAgLTEyMSw3ICsxMjEsMTYgQEAKIAogbmFtZXNwYWNlIEZpeGVkQWxpYXNUZW1wbGF0ZSB7CiAgIHRlbXBsYXRlPHR5cGVuYW1lLHR5cGVuYW1lLHR5cGVuYW1lPiBzdHJ1Y3QgUyB7fTsKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gdXNpbmcgVSA9IFM8VCwgaW50LCBVPjsKLSAgdGVtcGxhdGU8dHlwZW5hbWUuLi5Ucz4gVTxUcy4uLj4gJmYoVTxUcy4uLj4sIFRzLi4uKTsKLSAgUzxpbnQsIGludCwgZG91YmxlPiAmczEgPSBmKHt9LCAwLCAwLjApOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiB1c2luZyBVID0gUzxULCBpbnQsIFU+OyAvLyBleHBlY3RlZC1ub3RlIDJ7e3RlbXBsYXRlIHBhcmFtZXRlciBpcyBkZWNsYXJlZCBoZXJlfX0KKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi5Ucz4gVTxUcy4uLj4gJmYoVTxUcy4uLj4sIFRzLi4uKTsgLy8gZXhwZWN0ZWQtZXJyb3IgMnt7cGFjayBleHBhbnNpb24gdXNlZCBhcyBhcmd1bWVudCBmb3Igbm9uLXBhY2sgcGFyYW1ldGVyIG9mIGFsaWFzIHRlbXBsYXRlfX0KKyAgUzxpbnQsIGludCwgZG91YmxlPiAmczEgPSBmKHt9LCAwLCAwLjApOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1hdGNoaW5nIGZ1bmN0aW9ufX0KK30KKworbmFtZXNwYWNlIFBSMTg0MDEgeworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPiBzdHJ1Y3QgZm9vIHsgfTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4gdXNpbmcgYmFyID0gZm9vPFQsIEFyZ3MuLi4+OyAvLyBleHBlY3RlZC1ub3RlIDJ7e3RlbXBsYXRlIHBhcmFtZXRlciBpcyBkZWNsYXJlZCBoZXJlfX0gZXhwZWN0ZWQtbm90ZSB7eydiYXInIGRlY2xhcmVkIGhlcmV9fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPiB1c2luZyBiYXogPSBiYXI8QXJncy4uLiwgVD47IC8vIGV4cGVjdGVkLWVycm9yIHt7cGFjayBleHBhbnNpb24gdXNlZCBhcyBhcmd1bWVudCBmb3Igbm9uLXBhY2sgcGFyYW1ldGVyIG9mIGFsaWFzIHRlbXBsYXRlfX0KKyAgLy8gRklYTUU6IFdlIHNob3VsZCBzdGlsbCByZWNvcmQgdGhlIGFsaWFzIHRlbXBsYXRlLCBidXQgbWFyayBpdCBhcyBpbnZhbGlkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLlQ+IHZvaWQgZihiYXo8VC4uLj4pOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIHRlbXBsYXRlIG5hbWVkICdiYXonOyBkaWQgeW91IG1lYW4gJ2Jhcid9fSBleHBlY3RlZC1lcnJvciB7e3BhY2sgZXhwYW5zaW9uIHVzZWQgYXMgYXJndW1lbnQgZm9yIG5vbi1wYWNrfX0KKyAgdm9pZCBnKCkgeyBmKGZvbzxpbnQsIGNoYXIsIGRvdWJsZT4oKSk7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaGluZyBmdW5jdGlvbn19CiB9CmRpZmYgLS1naXQgYS90ZXN0L0NYWC90ZW1wL3RlbXAuZGVjbHMvdGVtcC52YXJpYWRpYy9wNS5jcHAgYi90ZXN0L0NYWC90ZW1wL3RlbXAuZGVjbHMvdGVtcC52YXJpYWRpYy9wNS5jcHAKaW5kZXggMzY4MWQ3Ny4uZGFlNjg2NSAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvdGVtcC90ZW1wLmRlY2xzL3RlbXAudmFyaWFkaWMvcDUuY3BwCisrKyBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5kZWNscy90ZW1wLnZhcmlhZGljL3A1LmNwcApAQCAtMzEwLDEwICszMTAsMTAgQEAKICAgdC5+VHlwZXMoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2V4cHJlc3Npb24gY29udGFpbnMgdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFjayAnVHlwZXMnfX0KICAgdC5UeXBlczo6flQoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2V4cHJlc3Npb24gY29udGFpbnMgdW5leHBhbmRlZCBwYXJhbWV0ZXIgcGFjayAnVHlwZXMnfX0KIAotICAvLyBVbmFyeVR5cGVUcmFpdEV4cHIKKyAgLy8gVW5hcnkgVHlwZVRyYWl0RXhwcgogICBfX2lzX3BvZChUeXBlcyk7IC8vIGV4cGVjdGVkLWVycm9ye3tleHByZXNzaW9uIGNvbnRhaW5zIHVuZXhwYW5kZWQgcGFyYW1ldGVyIHBhY2sgJ1R5cGVzJ319CiAKLSAgLy8gQmluYXJ5VHlwZVRyYWl0RXhwcgorICAvLyBCaW5hcnkgVHlwZVRyYWl0RXhwcgogICBfX2lzX2Jhc2Vfb2YoVHlwZXMsIFQpOyAvLyBleHBlY3RlZC1lcnJvcnt7ZXhwcmVzc2lvbiBjb250YWlucyB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrICdUeXBlcyd9fQogICBfX2lzX2Jhc2Vfb2YoVCwgVHlwZXMpOyAvLyBleHBlY3RlZC1lcnJvcnt7ZXhwcmVzc2lvbiBjb250YWlucyB1bmV4cGFuZGVkIHBhcmFtZXRlciBwYWNrICdUeXBlcyd9fQogCmRpZmYgLS1naXQgYS90ZXN0L0NYWC90ZW1wL3RlbXAuZmN0LnNwZWMvdGVtcC5kZWR1Y3QvdGVtcC5kZWR1Y3QudHlwZS9wOS0weC5jcHAgYi90ZXN0L0NYWC90ZW1wL3RlbXAuZmN0LnNwZWMvdGVtcC5kZWR1Y3QvdGVtcC5kZWR1Y3QudHlwZS9wOS0weC5jcHAKaW5kZXggZDc5ODllMy4uNzgyMDU3ZCAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvdGVtcC90ZW1wLmZjdC5zcGVjL3RlbXAuZGVkdWN0L3RlbXAuZGVkdWN0LnR5cGUvcDktMHguY3BwCisrKyBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5mY3Quc3BlYy90ZW1wLmRlZHVjdC90ZW1wLmRlZHVjdC50eXBlL3A5LTB4LmNwcApAQCAtMzIsNyArMzIsNyBAQAogCiAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBUeXBlcywgLy8gZXhwZWN0ZWQtbm90ZXt7bm9uLWRlZHVjaWJsZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgJ1R5cGVzJ319CiAgICAgICAgICAgIHR5cGVuYW1lIFRhaWw+IC8vIGV4cGVjdGVkLW5vdGV7e25vbi1kZWR1Y2libGUgdGVtcGxhdGUgcGFyYW1ldGVyICdUYWlsJ319Ci0gIHN0cnVjdCBVc2VsZXNzUGFydGlhbFNwZWM8VHlwZXMuLi4sIFRhaWw+OyAvLyBleHBlY3RlZC13YXJuaW5ne3tjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGNvbnRhaW5zIHRlbXBsYXRlIHBhcmFtZXRlcnMgdGhhdCBjYW4gbm90IGJlIGRlZHVjZWQ7IHRoaXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB3aWxsIG5ldmVyIGJlIHVzZWR9fQorICBzdHJ1Y3QgVXNlbGVzc1BhcnRpYWxTcGVjPFR5cGVzLi4uLCBUYWlsPjsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Y2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBjb250YWlucyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRoYXQgY2Fubm90IGJlIGRlZHVjZWQ7IHRoaXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB3aWxsIG5ldmVyIGJlIHVzZWR9fQogfQogCiBuYW1lc3BhY2UgRGVkdWNlTm9uVHlwZVRlbXBsYXRlQXJnc0luQXJyYXkgewpkaWZmIC0tZ2l0IGEvdGVzdC9DWFgvdGVtcC90ZW1wLnJlcy90ZW1wLmxvY2FsL3AzLmNwcCBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5yZXMvdGVtcC5sb2NhbC9wMy5jcHAKaW5kZXggNTRkYTg4NS4uZTI5Y2VkMSAxMDA2NDQKLS0tIGEvdGVzdC9DWFgvdGVtcC90ZW1wLnJlcy90ZW1wLmxvY2FsL3AzLmNwcAorKysgYi90ZXN0L0NYWC90ZW1wL3RlbXAucmVzL3RlbXAubG9jYWwvcDMuY3BwCkBAIC0xNSw3ICsxNSw3IEBACiAgICAgdC0+QmFzZTxUPjo6ZigpOwogICAgIHQtPkJhc2U6OmYoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e21lbWJlciAnQmFzZScgZm91bmQgaW4gbXVsdGlwbGUgYmFzZSBjbGFzc2VzIG9mIGRpZmZlcmVudCB0eXBlc319IFwKICAgICAvLyBleHBlY3RlZC1lcnJvcnt7bm8gbWVtYmVyIG5hbWVkICdmJyBpbiAnWDAnfX0gXAotICAgIC8vIGV4cGVjdGVkLWVycm9ye3tleHBlY3RlZCBhIGNsYXNzIG9yIG5hbWVzcGFjZX19CisgICAgLy8gZXhwZWN0ZWQtZXJyb3J7eydCYXNlJyBpcyBub3QgYSBjbGFzcywgbmFtZXNwYWNlLCBvciBzY29wZWQgZW51bWVyYXRpb259fQogICB9CiB9OwogCmRpZmYgLS1naXQgYS90ZXN0L0NYWC90ZW1wL3RlbXAuc3BlYy9jeHgxeS12YXJpYWJsZS10ZW1wbGF0ZS1uby1ib2R5LmNwcCBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5zcGVjL2N4eDF5LXZhcmlhYmxlLXRlbXBsYXRlLW5vLWJvZHkuY3BwCmluZGV4IDkzZjhmZjEuLjdlYjVlMzcgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL3RlbXAvdGVtcC5zcGVjL2N4eDF5LXZhcmlhYmxlLXRlbXBsYXRlLW5vLWJvZHkuY3BwCisrKyBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5zcGVjL2N4eDF5LXZhcmlhYmxlLXRlbXBsYXRlLW5vLWJvZHkuY3BwCkBAIC0yNCwxNCArMjQsMTQgQEAKICNlbmRpZgogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAKLVQgcGkxID0gVCgzLjE0MTU5MjY1MzU4OTc5MzIzODUpOworVCBwaTEgPSBUKDMuMTQxNTkyNjUzNTg5NzkzMjM4NSk7IC8vIGV4cGVjdGVkLW5vdGUgMC0yIHt7aGVyZX19CiAKIC8vIFNob3VsZCByZWNvdmVyIGFzIGlmIHNwZWNpYWxpemF0aW9uCiB0ZW1wbGF0ZSBmbG9hdCBwaTE8ZmxvYXQ+ID0gMS4wOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBsaWNpdCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGNhbm5vdCBoYXZlIGEgZGVmaW5pdGlvbjsgaWYgdGhpcyBkZWZpbml0aW9uIGlzIG1lYW50IHRvIGJlIGFuIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uLCBhZGQgJzw+JyBhZnRlciB0aGUgJ3RlbXBsYXRlJyBrZXl3b3JkfX0KICNpZm5kZWYgRklYSU5HCiBuYW1lc3BhY2UgZXhwZWN0ZWRfZ2xvYmFsIHsKLSAgdGVtcGxhdGU8PiBkb3VibGUgcGkxPGRvdWJsZT4gPSAxLjU7ICAvLyBleHBlY3RlZC1lcnJvciB7e25vIHZhcmlhYmxlIHRlbXBsYXRlIG1hdGNoZXMgc3BlY2lhbGl6YXRpb259fQorICB0ZW1wbGF0ZTw+IGRvdWJsZSBwaTE8ZG91YmxlPiA9IDEuNTsgIC8vIGV4cGVjdGVkLWVycm9yIHt7dmFyaWFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gb2YgJ3BpMScgbXVzdCBvcmlnaW5hbGx5IGJlIGRlY2xhcmVkIGluIHRoZSBnbG9iYWwgc2NvcGV9fQogICB0ZW1wbGF0ZSBpbnQgcGkxPGludD4gPSAxMDsgIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBjYW5ub3QgaGF2ZSBhIGRlZmluaXRpb247IGlmIHRoaXMgZGVmaW5pdGlvbiBpcyBtZWFudCB0byBiZSBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiwgYWRkICc8PicgYWZ0ZXIgdGhlICd0ZW1wbGF0ZScga2V5d29yZH19IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1lcnJvciB7e25vIHZhcmlhYmxlIHRlbXBsYXRlIG1hdGNoZXMgc3BlY2lhbGl6YXRpb259fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWVycm9yIHt7dmFyaWFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gb2YgJ3BpMScgbXVzdCBvcmlnaW5hbGx5IGJlIGRlY2xhcmVkIGluIHRoZSBnbG9iYWwgc2NvcGV9fQogfQogI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L0NYWC90ZW1wL3RlbXAuc3BlYy9uby1ib2R5LmNwcCBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5zcGVjL25vLWJvZHkuY3BwCmluZGV4IGE0ZDc5MTQuLjYxZDI4NWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ1hYL3RlbXAvdGVtcC5zcGVjL25vLWJvZHkuY3BwCisrKyBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5zcGVjL25vLWJvZHkuY3BwCkBAIC0zNyw3ICszNyw3IEBACiBuYW1lc3BhY2UgZXhwX3NwZWMgewogI2lmbmRlZiBGSVhJTkcKICAgdGVtcGxhdGU8PiB2b2lkIGYwPGludD4oaW50KSB7IH0gIC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gZnVuY3Rpb24gdGVtcGxhdGUgbWF0Y2hlcyBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAnZjAnfX0KLSAgdGVtcGxhdGU8PiBzdHJ1Y3QgeDA8aW50PiB7IH07ICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7Y2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gb2YgJ3gwJyBtdXN0IG9yaWdpbmFsbHkgYmUgZGVjbGFyZWQgaW4gdGhlIGdsb2JhbCBzY29wZX19CisgIHRlbXBsYXRlPD4gc3RydWN0IHgwPGludD4geyB9OyAgICAvLyBleHBlY3RlZC1lcnJvciB7e2NsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9mICd4MCcgbXVzdCBvY2N1ciBhdCBnbG9iYWwgc2NvcGV9fQogI2VuZGlmCiB9CiAKQEAgLTUxLDcgKzUxLDcgQEAKICAgdGVtcGxhdGUgdm9pZCBmMTxpbnQ+KGludCkgeyB9ICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBjYW5ub3QgaGF2ZSBhIGRlZmluaXRpb247IGlmIHRoaXMgZGVmaW5pdGlvbiBpcyBtZWFudCB0byBiZSBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiwgYWRkICc8PicgYWZ0ZXIgdGhlICd0ZW1wbGF0ZScga2V5d29yZH19IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWVycm9yIHt7bm8gZnVuY3Rpb24gdGVtcGxhdGUgbWF0Y2hlcyBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAnZjEnfX0KICAgdGVtcGxhdGUgc3RydWN0IHgxPGludD4geyB9OyAgICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBjYW5ub3QgaGF2ZSBhIGRlZmluaXRpb247IGlmIHRoaXMgZGVmaW5pdGlvbiBpcyBtZWFudCB0byBiZSBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiwgYWRkICc8PicgYWZ0ZXIgdGhlICd0ZW1wbGF0ZScga2V5d29yZH19IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWVycm9yIHt7Y2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gb2YgJ3gxJyBtdXN0IG9yaWdpbmFsbHkgYmUgZGVjbGFyZWQgaW4gdGhlIGdsb2JhbCBzY29wZX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1lcnJvciB7e2NsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG9mICd4MScgbXVzdCBvY2N1ciBhdCBnbG9iYWwgc2NvcGV9fQogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL3RlbXAvdGVtcC5zcGVjL3RlbXAuZXhwbC5zcGVjL3AyLTB4LmNwcCBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5zcGVjL3RlbXAuZXhwbC5zcGVjL3AyLTB4LmNwcAppbmRleCA3NWIxOThlLi5kMGUyNGY1IDEwMDY0NAotLS0gYS90ZXN0L0NYWC90ZW1wL3RlbXAuc3BlYy90ZW1wLmV4cGwuc3BlYy9wMi0weC5jcHAKKysrIGIvdGVzdC9DWFgvdGVtcC90ZW1wLnNwZWMvdGVtcC5leHBsLnNwZWMvcDItMHguY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtc3RkPWMrKzExICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1zdGQ9YysrMTEgJXMgLVduby1jKysxeS1leHRlbnNpb25zCiAKIC8vIFRoaXMgdGVzdCBjcmVhdGVzIGNhc2VzIHdoZXJlIGltcGxpY2l0IGluc3RhbnRpYXRpb25zIG9mIHZhcmlvdXMgZW50aXRpZXMKIC8vIHdvdWxkIGNhdXNlIGEgZGlhZ25vc3RpYywgYnV0IHByb3ZpZGVzIGV4cGxpaWN0IHNwZWNpYWxpemF0aW9ucyBmb3IgdGhvc2UKQEAgLTEwLDYgKzEwLDggQEAKICAgTm9uRGVmYXVsdENvbnN0cnVjdGlibGUoaW50KTsKIH07CiAKKy8vIEZJWE1FOiBUaGUgIm11c3Qgb3JpZ2luYWxseSBiZSBkZWNsYXJlZCBpbiBuYW1lc3BhY2UiIGRpYWdub3N0aWNzIHRocm91Z2hvdXQKKy8vIHRoaXMgZmlsZSBhcmUgd3JvbmcuCiAKIC8vIEMrKyBbdGVtcC5leHBsLnNwZWNdcDE6CiAvLyAgIEFuIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOgpAQCAtNzksNyArODEsNyBAQAogTjA6OlgwPHZvaWQ+IHRlc3RfWDA7CiAKIG5hbWVzcGFjZSBOMSB7Ci0gIHRlbXBsYXRlPD4gc3RydWN0IE4wOjpYMDxjb25zdCB2b2lkPiB7IH07IC8vIGV4cGVjdGVkLWVycm9ye3tjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBvZiAnWDAnIG11c3Qgb3JpZ2luYWxseSBiZSBkZWNsYXJlZCBpbiBuYW1lc3BhY2UgJ04wJ319CisgIHRlbXBsYXRlPD4gc3RydWN0IE4wOjpYMDxjb25zdCB2b2lkPiB7IH07IC8vIGV4cGVjdGVkLWVycm9ye3tjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBvZiAnWDAnIG5vdCBpbiBhIG5hbWVzcGFjZSBlbmNsb3NpbmcgJ04wJ319CiB9CiAKIG5hbWVzcGFjZSBOMCB7CkBAIC05MCw2ICs5Miw0NCBAQAogICB2b2lkIGYxKHZvaWQgKik7CiB9OwogCisvLyAgICAgLS0gdmFyaWFibGUgdGVtcGxhdGUgW0MrKzF5XQorbmFtZXNwYWNlIE4wIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCB2MDsgLy8gZXhwZWN0ZWQtbm90ZSAre3toZXJlfX0KK3RlbXBsYXRlPD4gZXh0ZXJuIGludCB2MDxjaGFyWzFdPjsKK3RlbXBsYXRlPD4gZXh0ZXJuIGludCB2MDxjaGFyWzJdPjsKK3RlbXBsYXRlPD4gZXh0ZXJuIGludCB2MDxjaGFyWzVdPjsKK3RlbXBsYXRlPD4gZXh0ZXJuIGludCB2MDxjaGFyWzZdPjsKK30KK3VzaW5nIE4wOjp2MDsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IHYxOyAvLyBleHBlY3RlZC1ub3RlICt7e2hlcmV9fQordGVtcGxhdGU8PiBleHRlcm4gaW50IHYxPGNoYXJbM10+OwordGVtcGxhdGU8PiBleHRlcm4gaW50IHYxPGNoYXJbNF0+OwordGVtcGxhdGU8PiBleHRlcm4gaW50IHYxPGNoYXJbN10+OwordGVtcGxhdGU8PiBleHRlcm4gaW50IHYxPGNoYXJbOF0+OworCit0ZW1wbGF0ZTw+IGludCBOMDo6djA8aW50WzFdPjsKK3RlbXBsYXRlPD4gaW50IHYwPGludFsyXT47IC8vIEZJWE1FOiBpbGwtZm9ybWVkCit0ZW1wbGF0ZTw+IGludCA6OnYxPGludFszXT47IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSBxdWFsaWZpY2F0aW9ufX0KK3RlbXBsYXRlPD4gaW50IHYxPGludFs0XT47CisKK3RlbXBsYXRlPD4gaW50IE4wOjp2MDxjaGFyWzFdPjsKK3RlbXBsYXRlPD4gaW50IHYwPGNoYXJbMl0+OyAvLyBGSVhNRTogaWxsLWZvcm1lZAordGVtcGxhdGU8PiBpbnQgOjp2MTxjaGFyWzNdPjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHF1YWxpZmljYXRpb259fQordGVtcGxhdGU8PiBpbnQgdjE8Y2hhcls0XT47CisKK25hbWVzcGFjZSBOMSB7Cit0ZW1wbGF0ZTw+IGludCBOMDo6djA8aW50WzVdPjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3ttdXN0IG9yaWdpbmFsbHkgYmUgZGVjbGFyZWQgaW4gbmFtZXNwYWNlICdOMCd9fSBleHBlY3RlZC1lcnJvciB7e2RvZXMgbm90IGVuY2xvc2UgbmFtZXNwYWNlfX0KK3RlbXBsYXRlPD4gaW50IHYwPGludFs2XT47IC8vIGV4cGVjdGVkLWVycm9yIHt7bXVzdCBvcmlnaW5hbGx5IGJlIGRlY2xhcmVkIGluIG5hbWVzcGFjZSAnTjAnfX0KK3RlbXBsYXRlPD4gaW50IDo6djE8aW50WzddPjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3ttdXN0IG9yaWdpbmFsbHkgYmUgZGVjbGFyZWQgaW4gdGhlIGdsb2JhbCBzY29wZX19IGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IG5hbWUgdGhlIGdsb2JhbCBzY29wZX19Cit0ZW1wbGF0ZTw+IGludCB2MTxpbnRbOF0+OyAvLyBleHBlY3RlZC1lcnJvciB7e211c3Qgb3JpZ2luYWxseSBiZSBkZWNsYXJlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlfX0KKwordGVtcGxhdGU8PiBpbnQgTjA6OnYwPGNoYXJbNV0+OyAvLyBleHBlY3RlZC1lcnJvciB7e2RvZXMgbm90IGVuY2xvc2UgbmFtZXNwYWNlICdOMCd9fQordGVtcGxhdGU8PiBpbnQgdjA8Y2hhcls2XT47IC8vIEZJWE1FOiBpbGwtZm9ybWVkCit0ZW1wbGF0ZTw+IGludCA6OnYxPGNoYXJbN10+OyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBuYW1lIHRoZSBnbG9iYWwgc2NvcGV9fQordGVtcGxhdGU8PiBpbnQgdjE8Y2hhcls4XT47IC8vIEZJWE1FOiBpbGwtZm9ybWVkCit9CisKIC8vICAgICAtLSBtZW1iZXIgZnVuY3Rpb24gb2YgYSBjbGFzcyB0ZW1wbGF0ZQogdGVtcGxhdGU8PiB2b2lkIE4wOjpYMDx2b2lkKj46OmYxKHZvaWQgKikgeyB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ1hYL3RlbXAvdGVtcC5zcGVjL3RlbXAuZXhwbC5zcGVjL3AyLmNwcCBiL3Rlc3QvQ1hYL3RlbXAvdGVtcC5zcGVjL3RlbXAuZXhwbC5zcGVjL3AyLmNwcAppbmRleCBjOTcyYmY3Li40ZmJjNDVhIDEwMDY0NAotLS0gYS90ZXN0L0NYWC90ZW1wL3RlbXAuc3BlYy90ZW1wLmV4cGwuc3BlYy9wMi5jcHAKKysrIGIvdGVzdC9DWFgvdGVtcC90ZW1wLnNwZWMvdGVtcC5leHBsLnNwZWMvcDIuY3BwCkBAIC04MCw3ICs4MCw3IEBACiBOMDo6WDA8dm9pZD4gdGVzdF9YMDsKIAogbmFtZXNwYWNlIE4xIHsKLSAgdGVtcGxhdGU8PiBzdHJ1Y3QgTjA6OlgwPGNvbnN0IHZvaWQ+IHsgfTsgLy8gZXhwZWN0ZWQtZXJyb3J7e29yaWdpbmFsbHl9fQorICB0ZW1wbGF0ZTw+IHN0cnVjdCBOMDo6WDA8Y29uc3Qgdm9pZD4geyB9OyAvLyBleHBlY3RlZC1lcnJvcnt7bm90IGluIGEgbmFtZXNwYWNlIGVuY2xvc2luZyAnTjAnfX0KIH0KIAogbmFtZXNwYWNlIE4wIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUNvbXBsZXRpb24vb2JqYy1tZXNzYWdlLm1tIGIvdGVzdC9Db2RlQ29tcGxldGlvbi9vYmpjLW1lc3NhZ2UubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyYTE4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUNvbXBsZXRpb24vb2JqYy1tZXNzYWdlLm1tCkBAIC0wLDAgKzEsNDYgQEAKKy8vIE5vdGU6IHRoZSBydW4gbGluZXMgZm9sbG93IHRoZWlyIHJlc3BlY3RpdmUgdGVzdHMsIHNpbmNlIGxpbmUvY29sdW1uCisvLyBtYXR0ZXIgaW4gdGhpcyB0ZXN0LgorCitAcHJvdG9jb2wgRm9vVGVzdFByb3RvY29sCisrIHByb3RvY29sQ2xhc3NNZXRob2Q7CistIHByb3RvY29sSW5zdGFuY2VNZXRob2Q7CitAZW5kCitAaW50ZXJmYWNlIEZvbyA8Rm9vVGVzdFByb3RvY29sPiB7CisgIHZvaWQgKmlzYTsKK30KKysgKGludCljbGFzc01ldGhvZDE6YSB3aXRoS2V5d29yZDpiOworKyAodm9pZCljbGFzc01ldGhvZDI7CisrIG5ldzsKKy0gaW5zdGFuY2VNZXRob2QxOworQGVuZAorCitAaW50ZXJmYWNlIEZvbyAoRm9vVGVzdENhdGVnb3J5KQorKyBjYXRlZ29yeUNsYXNzTWV0aG9kOworLSBjYXRlZ29yeUluc3RhbmNlTWV0aG9kOworQGVuZAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmV0YWluUHRyIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IHN0cnVjdCBSZW1vdmVQb2ludGVyIHsgdHlwZWRlZiBVIFR5cGU7IH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBzdHJ1Y3QgUmVtb3ZlUG9pbnRlcjxVKj4geyB0eXBlZGVmIFUgVHlwZTsgfTsKKyAgICAKKyAgdHlwZWRlZiB0eXBlbmFtZSBSZW1vdmVQb2ludGVyPFQ+OjpUeXBlKiBQdHJUeXBlOworCisgIGV4cGxpY2l0IG9wZXJhdG9yIFB0clR5cGUoKSBjb25zdDsKK307CisKK3ZvaWQgZnVuYyhjb25zdCBSZXRhaW5QdHI8Rm9vPiYgcHRyKQoreworICBbcHRyIGluc3RhbmNlTWV0aG9kMV07Cit9CisKK3ZvaWQgZnVuYyhjb25zdCBSZXRhaW5QdHI8aWQgPEZvb1Rlc3RQcm90b2NvbD4+JiBwdHIpCit7CisgIFtwdHIgaW5zdGFuY2VNZXRob2QxXTsKK30KKworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXN0ZD1jKysxMSAtY29kZS1jb21wbGV0aW9uLWF0PSVzOjMzOjcgJXMgLW8gLSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUNDMSAlcworLy8gQ0hFQ0stQ0MxOiBjYXRlZ29yeUluc3RhbmNlTWV0aG9kIDogWyNpZCNdY2F0ZWdvcnlJbnN0YW5jZU1ldGhvZAorLy8gQ0hFQ0stQ0MxOiBpbnN0YW5jZU1ldGhvZDEgOiBbI2lkI11pbnN0YW5jZU1ldGhvZDEKKy8vIENIRUNLLUNDMTogcHJvdG9jb2xJbnN0YW5jZU1ldGhvZCA6IFsjaWQjXXByb3RvY29sSW5zdGFuY2VNZXRob2QKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC1zdGQ9YysrMTEgLWNvZGUtY29tcGxldGlvbi1hdD0lczozODo3ICVzIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DQzIgJXMKKy8vIENIRUNLLUNDMjogcHJvdG9jb2xJbnN0YW5jZU1ldGhvZCA6IFsjaWQjXXByb3RvY29sSW5zdGFuY2VNZXRob2QKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi8yMDA3LTA2LTE4LVNleHRBdHRyQWdncmVnYXRlLmMgYi90ZXN0L0NvZGVHZW4vMjAwNy0wNi0xOC1TZXh0QXR0ckFnZ3JlZ2F0ZS5jCmluZGV4IGY1NDg5NTEuLjkyMTcxZTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi8yMDA3LTA2LTE4LVNleHRBdHRyQWdncmVnYXRlLmMKKysrIGIvdGVzdC9Db2RlR2VuLzIwMDctMDYtMTgtU2V4dEF0dHJBZ2dyZWdhdGUuYwpAQCAtMSw1ICsxLDUgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAlcyAtbyAtIC1lbWl0LWxsdm0gfCBGaWxlQ2hlY2sgJXMKLS8vIFhGQUlMOiBhYXJjaDY0CisvLyBYRkFJTDogYWFyY2g2NCwgYXJtNjQKIAogLy8gUFIxNTEzCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi8yMDA5LTAyLTEzLXplcm9zaXplLXVuaW9uLWZpZWxkLXBwYy5jIGIvdGVzdC9Db2RlR2VuLzIwMDktMDItMTMtemVyb3NpemUtdW5pb24tZmllbGQtcHBjLmMKaW5kZXggMmJjYzdjMy4uZWFiZjQ2MyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuLzIwMDktMDItMTMtemVyb3NpemUtdW5pb24tZmllbGQtcHBjLmMKKysrIGIvdGVzdC9Db2RlR2VuLzIwMDktMDItMTMtemVyb3NpemUtdW5pb24tZmllbGQtcHBjLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogcHBjMzItcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBwb3dlcnBjLXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSBwb3dlcnBjLXBjLWxpbnV4IC1lbWl0LWxsdm0gLW8gLSB8IGdyZXAge2kzMiAzMn0gfCBjb3VudCAzCiAvLyBYRkFJTDogKgogLy8gIEV2ZXJ5IHByaW50ZiBoYXMgJ2kzMiAwJyBmb3IgdGhlIEdFUCBvZiB0aGUgc3RyaW5nOyBubyBwb2ludCBjb3VudGluZyB0aG9zZS4KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi8yMDEwLTAxLTEzLU1lbUJhcnJpZXIuYyBiL3Rlc3QvQ29kZUdlbi8yMDEwLTAxLTEzLU1lbUJhcnJpZXIuYwppbmRleCBjMmIwYWNkLi43NGQwY2IwIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vMjAxMC0wMS0xMy1NZW1CYXJyaWVyLmMKKysrIGIvdGVzdC9Db2RlR2VuLzIwMTAtMDEtMTMtTWVtQmFycmllci5jCkBAIC0xLDUgKzEsNCBAQAogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcwotLy8gWEZBSUw6IHNwYXJjCiAvLyByZGFyOi8vNzUzNjM5MAogCiB0eXBlZGVmIHVuc2lnbmVkIF9fSU5UMzJfVFlQRV9fIHVpbnQzMl90OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuLzIwMTAtMDYtMTctYXNtY3Jhc2guYyBiL3Rlc3QvQ29kZUdlbi8yMDEwLTA2LTE3LWFzbWNyYXNoLmMKaW5kZXggMWI1ZWZkMy4uMDQ4ZTQyOSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuLzIwMTAtMDYtMTctYXNtY3Jhc2guYworKysgYi90ZXN0L0NvZGVHZW4vMjAxMC0wNi0xNy1hc21jcmFzaC5jCkBAIC0xLDUgKzEsNiBAQAotLy8gUkVRVUlSRVM6IHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LXVua25vd24tdW5rbm93biAtTzEgLVMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUkVRVUlSRVM6IHg4Ni1yZWdpc3RlcmVkLXRhcmdldAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LXVua25vd24tdW5rbm93biAtTzEgLW5vLWludGVncmF0ZWQtYXMgXAorLy8gUlVOOiAgICAgLVMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiB0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4X3Q7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vUFI0NjExLWJpdGZpZWxkLWxheW91dC5jIGIvdGVzdC9Db2RlR2VuL1BSNDYxMS1iaXRmaWVsZC1sYXlvdXQuYwppbmRleCBhMzgzZjM0Li40ZjlhYmVhIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vUFI0NjExLWJpdGZpZWxkLWxheW91dC5jCisrKyBiL3Rlc3QvQ29kZUdlbi9QUjQ2MTEtYml0ZmllbGQtbGF5b3V0LmMKQEAgLTEsNiArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LXVua25vd24tdW5rbm93biAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIC8vCi0vLyBDSEVDSzogc3RydWN0Lm9iamVjdF9lbnRyeSA9IHR5cGUgeyBbNCB4IGk4XSB9CisvLyBDSEVDSzogc3RydWN0Lm9iamVjdF9lbnRyeSA9IHR5cGUgeyBpMzIgfQogCiBzdHJ1Y3Qgb2JqZWN0X2VudHJ5IHsKICAgICAgICB1bnNpZ25lZCBpbnQgdHlwZTozLCBwYWNrX2lkOjE2LCBkZXB0aDoxMzsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9QUjg4ODAuYyBiL3Rlc3QvQ29kZUdlbi9QUjg4ODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDNkMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuL1BSODg4MC5jCkBAIC0wLDAgKzEsMTczIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLVduby1nY2MtY29tcGF0IC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworCit2b2lkIHByODg4MF9jZ18xKGludCAqaXB0cikgeworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBwcjg4ODBfY2dfMSgKKyAgaW50IGksIGo7CisvLyBDSEVDSzogYnIgbGFiZWwgJVtbT1VURVJfQ09ORDpbMC05QS1aYS16JC5fXStdXQorICBmb3IgKGkgPSAyOyBpICE9IDEwIDsgaSsrICkKKy8vIENIRUNLOiBbW09VVEVSX0NPTkRdXQorLy8gQ0hFQ0s6IGxhYmVsICVbW09VVEVSX0JPRFk6WzAtOUEtWmEteiQuX10rXV0sIGxhYmVsICVbW09VVEVSX0VORDpbMC05QS1aYS16JC5fXStdXQorLy8gQ0hFQ0s6IFtbT1VURVJfQk9EWV1dCisvLyBDSEVDSzogYnIgbGFiZWwgJVtbSU5ORVJfQ09ORDpbMC05QS1aYS16JC5fXStdXQorICAgIGZvciAoaiA9IDMgOyBqIDwgMjI7ICh2b2lkKSh7ICsrajsgYnJlYWs7IGo7fSkpIHsKKy8vIENIRUNLOiBbW0lOTkVSX0NPTkRdXQorLy8gQ0hFQ0s6IGxhYmVsICVbW0lOTkVSX0JPRFk6WzAtOUEtWmEteiQuX10rXV0sIGxhYmVsICVbW0lOTkVSX0VORDpbMC05QS1aYS16JC5fXStdXQorLy8gQ0hFQ0s6IFtbSU5ORVJfQk9EWV1dCisgICAgICAqaXB0ciA9IDc7CisvLyBDSEVDSzogc3RvcmUgaTMyIDcsCisvLyBDSEVDSzogYnIgbGFiZWwgJVtbSU5ORVJfSU5DOlswLTlBLVphLXokLl9dK11dCisvLyBDSEVDSzogW1tJTk5FUl9JTkNdXQorCisvLyBicmVhayBpbiAzcmQgZXhwcmVzc2lvbiBvZiBpbm5lciBsb29wIGNhdXNlcyBicmFuY2ggdG8gZW5kIG9mIGlubmVyIGxvb3AKKworLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW0lOTkVSX0VORDpbMC05QS1aYS16JC5fXStdXQorLy8gQ0hFQ0s6IFtbSU5ORVJfRU5EXV0KKyAgICB9CisvLyBDSEVDSzogYnIgbGFiZWwgJVtbT1VURVJfSU5DOlswLTlBLVphLXokLl9dK11dCisvLyBDSEVDSzogW1tPVVRFUl9JTkNdXQorLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW09VVEVSX0NPTkRdXQorLy8gQ0hFQ0s6IFtbT1VURVJfRU5EXV0KKy8vIENIRUNLOiByZXQKK30KKwordm9pZCBwcjg4ODBfY2dfMihpbnQgKmlwdHIpIHsKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAcHI4ODgwX2NnXzIoCisgIGludCBpLCBqOworLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW09VVEVSX0NPTkQ6WzAtOUEtWmEteiQuX10rXV0KKyAgZm9yIChpID0gMjsgaSAhPSAxMCA7IGkrKyApCisvLyBDSEVDSzogW1tPVVRFUl9DT05EXV0KKy8vIENIRUNLOiBsYWJlbCAlW1tPVVRFUl9CT0RZOlswLTlBLVphLXokLl9dK11dLCBsYWJlbCAlW1tPVVRFUl9FTkQ6WzAtOUEtWmEteiQuX10rXV0KKy8vIENIRUNLOiBbW09VVEVSX0JPRFldXQorLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW0lOTkVSX0NPTkQ6WzAtOUEtWmEteiQuX10rXV0KKyAgICBmb3IgKGogPSAzIDsgaiA8IDIyOyAodm9pZCkoeyArK2o7IGNvbnRpbnVlOyBqO30pKSB7CisvLyBDSEVDSzogW1tJTk5FUl9DT05EXV0KKy8vIENIRUNLOiBsYWJlbCAlW1tJTk5FUl9CT0RZOlswLTlBLVphLXokLl9dK11dLCBsYWJlbCAlW1tJTk5FUl9FTkQ6WzAtOUEtWmEteiQuX10rXV0KKy8vIENIRUNLOiBbW0lOTkVSX0JPRFldXQorICAgICAgKmlwdHIgPSA3OworLy8gQ0hFQ0s6IHN0b3JlIGkzMiA3LAorLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW0lOTkVSX0lOQzpbMC05QS1aYS16JC5fXStdXQorLy8gQ0hFQ0s6IFtbSU5ORVJfSU5DXV0KKworLy8gY29udGludWUgaW4gM3JkIGV4cHJlc3Npb24gb2YgaW5uZXIgbG9vcCBjYXVzZXMgYnJhbmNoIHRvIGluYyBvZiBpbm5lciBsb29wCisKKy8vIENIRUNLOiBiciBsYWJlbCAlW1tJTk5FUl9JTkNdXQorLy8gQ0hFQ0s6IFtbSU5ORVJfRU5EXV0KKyAgICB9CisvLyBDSEVDSzogYnIgbGFiZWwgJVtbT1VURVJfSU5DOlswLTlBLVphLXokLl9dK11dCisvLyBDSEVDSzogW1tPVVRFUl9JTkNdXQorLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW09VVEVSX0NPTkRdXQorLy8gQ0hFQ0s6IFtbT1VURVJfRU5EXV0KKy8vIENIRUNLOiByZXQKK30KKwordm9pZCBwcjg4ODBfY2dfMyhpbnQgKmlwdHIpIHsKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAcHI4ODgwX2NnXzMoCisgIGludCBpLCBqOworLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW09VVEVSX0NPTkQ6WzAtOUEtWmEteiQuX10rXV0KKyAgZm9yIChpID0gMiA7IGkgIT0gMTAgOyBpKysgKQorLy8gQ0hFQ0s6IFtbT1VURVJfQ09ORF1dCisvLyBDSEVDSzogbGFiZWwgJVtbT1VURVJfQk9EWTpbMC05QS1aYS16JC5fXStdXSwgbGFiZWwgJVtbT1VURVJfRU5EOlswLTlBLVphLXokLl9dK11dCisvLyBDSEVDSzogW1tPVVRFUl9CT0RZXV0KKy8vIENIRUNLOiBiciBsYWJlbCAlW1tJTk5FUl9DT05EOlswLTlBLVphLXokLl9dK11dCisgICAgZm9yIChqID0gMyA7ICh7YnJlYWs7IGo7fSk7IGorKykgeworCisvLyBicmVhayBpbiAybmQgZXhwcmVzc2lvbiBvZiBpbm5lciBsb29wIGNhdXNlcyBicmFuY2ggdG8gZW5kIG9mIGlubmVyIGxvb3AKKworLy8gQ0hFQ0s6IFtbSU5ORVJfQ09ORF1dCisvLyBDSEVDSzogYnIgbGFiZWwgJVtbSU5ORVJfRU5EOlswLTlBLVphLXokLl9dK11dCisvLyBDSEVDSzogbGFiZWwgJVtbSU5ORVJfQk9EWTpbMC05QS1aYS16JC5fXStdXSwgbGFiZWwgJVtbSU5ORVJfRU5EOlswLTlBLVphLXokLl9dK11dCisvLyBDSEVDSzogW1tJTk5FUl9CT0RZXV0KKyAgICAgICppcHRyID0gNzsKKy8vIENIRUNLOiBzdG9yZSBpMzIgNywKKy8vIENIRUNLOiBiciBsYWJlbCAlW1tJTk5FUl9JTkM6WzAtOUEtWmEteiQuX10rXV0KKy8vIENIRUNLOiBbW0lOTkVSX0lOQ11dCisvLyBDSEVDSzogYnIgbGFiZWwgJVtbSU5ORVJfQ09ORF1dCisgICAgfQorLy8gQ0hFQ0s6IFtbSU5ORVJfRU5EXV0KKy8vIENIRUNLOiBiciBsYWJlbCAlW1tPVVRFUl9JTkM6WzAtOUEtWmEteiQuX10rXV0KKy8vIENIRUNLOiBbW09VVEVSX0lOQ11dCisvLyBDSEVDSzogYnIgbGFiZWwgJVtbT1VURVJfQ09ORF1dCisvLyBDSEVDSzogW1tPVVRFUl9FTkRdXQorLy8gQ0hFQ0s6IHJldAorfQorCit2b2lkIHByODg4MF9jZ180KGludCAqaXB0cikgeworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBwcjg4ODBfY2dfNCgKKyAgaW50IGksIGo7CisvLyBDSEVDSzogYnIgbGFiZWwgJVtbT1VURVJfQ09ORDpbMC05QS1aYS16JC5fXStdXQorICBmb3IgKGkgPSAyIDsgaSAhPSAxMCA7IGkrKyApCisvLyBDSEVDSzogW1tPVVRFUl9DT05EXV0KKy8vIENIRUNLOiBsYWJlbCAlW1tPVVRFUl9CT0RZOlswLTlBLVphLXokLl9dK11dLCBsYWJlbCAlW1tPVVRFUl9FTkQ6WzAtOUEtWmEteiQuX10rXV0KKy8vIENIRUNLOiBbW09VVEVSX0JPRFldXQorLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW0lOTkVSX0NPTkQ6WzAtOUEtWmEteiQuX10rXV0KKyAgICBmb3IgKGogPSAzIDsgKHtjb250aW51ZTsgajt9KTsgaisrKSB7CisKKy8vIGNvbnRpbnVlIGluIDJuZCBleHByZXNzaW9uIG9mIGlubmVyIGxvb3AgY2F1c2VzIGJyYW5jaCB0byBpbmMgb2YgaW5uZXIgbG9vcAorCisvLyBDSEVDSzogW1tJTk5FUl9DT05EXV0KKy8vIENIRUNLOiBiciBsYWJlbCAlW1tJTk5FUl9JTkM6WzAtOUEtWmEteiQuX10rXV0KKy8vIENIRUNLOiBsYWJlbCAlW1tJTk5FUl9CT0RZOlswLTlBLVphLXokLl9dK11dLCBsYWJlbCAlW1tJTk5FUl9FTkQ6WzAtOUEtWmEteiQuX10rXV0KKy8vIENIRUNLOiBbW0lOTkVSX0JPRFldXQorICAgICAgKmlwdHIgPSA3OworLy8gQ0hFQ0s6IHN0b3JlIGkzMiA3LAorLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW0lOTkVSX0lOQ11dCisvLyBDSEVDSzogW1tJTk5FUl9JTkNdXQorLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW0lOTkVSX0NPTkRdXQorICAgIH0KKy8vIENIRUNLOiBbW0lOTkVSX0VORF1dCisvLyBDSEVDSzogYnIgbGFiZWwgJVtbT1VURVJfSU5DOlswLTlBLVphLXokLl9dK11dCisvLyBDSEVDSzogW1tPVVRFUl9JTkNdXQorLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW09VVEVSX0NPTkRdXQorLy8gQ0hFQ0s6IFtbT1VURVJfRU5EXV0KKy8vIENIRUNLOiByZXQKK30KKwordm9pZCBwcjg4ODBfY2dfNShpbnQgeCwgaW50ICppcHRyKSB7CisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQHByODg4MF9jZ181KAorICBpbnQgeSA9IDU7CisvLyBDSEVDSzogYnIgbGFiZWwgJVtbT1VURVJfQ09ORDpbMC05QS1aYS16JC5fXStdXQorLy8gQ0hFQ0s6IFtbT1VURVJfQ09ORF1dCisgIHdoaWxlKC0teCkgeworLy8gQ0hFQ0s6IGxhYmVsICVbW09VVEVSX0JPRFk6WzAtOUEtWmEteiQuX10rXV0sIGxhYmVsICVbW09VVEVSX0VORDpbMC05QS1aYS16JC5fXStdXQorLy8gQ0hFQ0s6IFtbT1VURVJfQk9EWV1dCisvLyBDSEVDSzogYnIgbGFiZWwgJVtbSU5ORVJfQ09ORDpbMC05QS1aYS16JC5fXStdXQorICAgIHdoaWxlKCh7IGJyZWFrOyAtLXk7IH0pKSB7CisvLyBDSEVDSzogW1tJTk5FUl9DT05EXV0KKy8vIENIRUNLOiBiciBsYWJlbCAlW1tJTk5FUl9FTkQ6WzAtOUEtWmEteiQuX10rXV0KKy8vIENIRUNLOiBsYWJlbCAlW1tJTk5FUl9CT0RZOlswLTlBLVphLXokLl9dK11dLCBsYWJlbCAlW1tJTk5FUl9FTkQ6WzAtOUEtWmEteiQuX10rXV0KKy8vIENIRUNLOiBbW0lOTkVSX0JPRFldXQorICAgICAgKmlwdHIgPSA3OworLy8gQ0hFQ0s6IHN0b3JlIGkzMiA3LAorICAgIH0KKy8vIENIRUNLOiBiciBsYWJlbCAlW1tJTk5FUl9DT05EXV0KKyAgfQorLy8gQ0hFQ0s6IFtbSU5ORVJfRU5EXV0KKy8vIENIRUNLOiBiciBsYWJlbCAlW1tPVVRFUl9DT05EXV0KKy8vIENIRUNLOiBbW09VVEVSX0VORF1dCisvLyBDSEVDSzogcmV0IHZvaWQKK30KKwordm9pZCBwcjg4ODBfY2dfNihpbnQgeCwgaW50ICppcHRyKSB7CisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQHByODg4MF9jZ182KAorICBpbnQgeSA9IDU7CisvLyBDSEVDSzogYnIgbGFiZWwgJVtbT1VURVJfQ09ORDpbMC05QS1aYS16JC5fXStdXQorLy8gQ0hFQ0s6IFtbT1VURVJfQ09ORF1dCisgIHdoaWxlKC0teCkgeworLy8gQ0hFQ0s6IGxhYmVsICVbW09VVEVSX0JPRFk6WzAtOUEtWmEteiQuX10rXV0sIGxhYmVsICVbW09VVEVSX0VORDpbMC05QS1aYS16JC5fXStdXQorLy8gQ0hFQ0s6IFtbT1VURVJfQk9EWV1dCisvLyBDSEVDSzogYnIgbGFiZWwgJVtbSU5ORVJfQk9EWTpbMC05QS1aYS16JC5fXStdXQorLy8gQ0hFQ0s6IFtbSU5ORVJfQk9EWV1dCisgICAgZG8geworLy8gQ0hFQ0s6IHN0b3JlIGkzMiA3LAorICAgICAgKmlwdHIgPSA3OworLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW0lOTkVSX0NPTkQ6WzAtOUEtWmEteiQuX10rXV0KKyAgICB9IHdoaWxlKCh7IGJyZWFrOyAtLXk7IH0pKTsKKy8vIENIRUNLOiBbW0lOTkVSX0NPTkRdXQorLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW0lOTkVSX0VORDpbMC05QS1aYS16JC5fXStdXQorLy8gQ0hFQ0s6IGxhYmVsICVbW0lOTkVSX0JPRFk6WzAtOUEtWmEteiQuX10rXV0sIGxhYmVsICVbW0lOTkVSX0VORF1dCisgIH0KKy8vIENIRUNLOiBbW0lOTkVSX0VORF1dCisvLyBDSEVDSzogYnIgbGFiZWwgJVtbT1VURVJfQ09ORF1dCisvLyBDSEVDSzogW1tPVVRFUl9FTkRdXQorLy8gQ0hFQ0s6IHJldCB2b2lkCit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYTE1LmMgYi90ZXN0L0NvZGVHZW4vYTE1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OTg2ZDguLjAwMDAwMDAKLS0tIGEvdGVzdC9Db2RlR2VuL2ExNS5jCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LW5vbmUtbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTE1IC1lbWl0LWxsdm0gLVMgJXMgIC1vIC9kZXYvbnVsbAotCi1pbnQgbWFpbigpIHsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYTUuYyBiL3Rlc3QvQ29kZUdlbi9hNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzQyZDM1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvQ29kZUdlbi9hNS5jCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LW5vbmUtbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTUgLWVtaXQtbGx2bSAtUyAlcyAgLW8gL2Rldi9udWxsCi0KLWludCBtYWluKCkgewotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LWFyZ3VtZW50cy5jIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtYXJndW1lbnRzLmMKaW5kZXggYTcwZGZiMS4uZjg3NTg4NiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtYXJndW1lbnRzLmMKKysrIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtYXJndW1lbnRzLmMKQEAgLTE5MCw1ICsxOTAsMTAgQEAKIHZvaWQgdmFyaWFkaWMoaW50IGEsIC4uLik7CiB2b2lkIGY0MyhfX2ZwMTYgKmluKSB7CiAgIHZhcmlhZGljKDQyLCAqaW4pOwotLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAdmFyaWFkaWMoaTMyIDQyLCBkb3VibGUKKy8vIFBDUzogY2FsbCB2b2lkIChpMzIsIC4uLikqIEB2YXJpYWRpYyhpMzIgNDIsIGRvdWJsZQogfQorCisvLyBDaGVja2luZzogYGRvdWJsZScgYW5kIGBsb25nIGRvdWJsZScgaGF2ZSBkaWZmZXJlbnQgbWFjaGluZSB0eXBlcywgc28gY2Fubm90IGJvdGggYmUgaW4gYW4gSEZBCitzdHJ1Y3QgczQ0IHsgbG9uZyBkb3VibGUgYTsgZG91YmxlIGI7IH07CisvLyBQQ1M6IGRlZmluZSB2b2lkIEBmNDQoJXN0cnVjdC5zNDQqCitzdHJ1Y3QgczQ0IGY0NCgpIHt9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLTJ2ZWxlbS5jIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi0ydmVsZW0uYwppbmRleCAwM2Y3ZGY3Li4xOWM5YjE2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLTJ2ZWxlbS5jCisrKyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tMnZlbGVtLmMKQEAgLTEsMTY5OCArMSwyNDU3IEBACiAvLyBSRVFVSVJFUzogYWFyY2g2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCiAvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCiAvLyBSVU46ICAgLVMgLU8zIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LW5vbmUtbGludXgtZ251IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIC8vIFRlc3QgbmV3IGFhcmNoNjQgaW50cmluc2ljcyBhbmQgdHlwZXMKIAogI2luY2x1ZGUgPGFybV9uZW9uLmg+CiAKIGludDE2eDRfdCB0ZXN0X3ZtbGFfbGFuZV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhX2xhbmVfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFfbGFuZV9zMTYKICAgcmV0dXJuIHZtbGFfbGFuZV9zMTYoYSwgYiwgdiwgMyk7CiAgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtbGFxX2xhbmVfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYXFfbGFuZV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYXFfbGFuZV9zMTYKICAgcmV0dXJuIHZtbGFxX2xhbmVfczE2KGEsIGIsIHYsIDMpOwogICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQzMngyX3QgdGVzdF92bWxhX2xhbmVfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYV9sYW5lX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX2xhbmVfczMyCiAgIHJldHVybiB2bWxhX2xhbmVfczMyKGEsIGIsIHYsIDEpOwogICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxhcV9sYW5lX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFxX2xhbmVfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX2xhbmVfczMyCiAgIHJldHVybiB2bWxhcV9sYW5lX3MzMihhLCBiLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KIH0KIAogaW50MTZ4NF90IHRlc3Rfdm1sYV9sYW5lcV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhX2xhbmVxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX2xhbmVxX3MxNgogICByZXR1cm4gdm1sYV9sYW5lcV9zMTYoYSwgYiwgdiwgNyk7CiAgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtbGFxX2xhbmVxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFxX2xhbmVxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV9sYW5lcV9zMTYKICAgcmV0dXJuIHZtbGFxX2xhbmVxX3MxNihhLCBiLCB2LCA3KTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbN10KIH0KIAogaW50MzJ4Ml90IHRlc3Rfdm1sYV9sYW5lcV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhX2xhbmVxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX2xhbmVxX3MzMgogICByZXR1cm4gdm1sYV9sYW5lcV9zMzIoYSwgYiwgdiwgMyk7CiAgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbGFxX2xhbmVxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFxX2xhbmVxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV9sYW5lcV9zMzIKICAgcmV0dXJuIHZtbGFxX2xhbmVxX3MzMihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbM10KIH0KIAogaW50MTZ4NF90IHRlc3Rfdm1sc19sYW5lX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNfbGFuZV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19sYW5lX3MxNgogICByZXR1cm4gdm1sc19sYW5lX3MxNihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbM10KIH0KIAogaW50MTZ4OF90IHRlc3Rfdm1sc3FfbGFuZV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzcV9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzcV9sYW5lX3MxNgogICByZXR1cm4gdm1sc3FfbGFuZV9zMTYoYSwgYiwgdiwgMyk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZtbHNfbGFuZV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzX2xhbmVfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNfbGFuZV9zMzIKICAgcmV0dXJuIHZtbHNfbGFuZV9zMzIoYSwgYiwgdiwgMSk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbHNxX2xhbmVfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc3FfbGFuZV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfbGFuZV9zMzIKICAgcmV0dXJuIHZtbHNxX2xhbmVfczMyKGEsIGIsIHYsIDEpOwogICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQxNng0X3QgdGVzdF92bWxzX2xhbmVxX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNfbGFuZXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNfbGFuZXFfczE2CiAgIHJldHVybiB2bWxzX2xhbmVxX3MxNihhLCBiLCB2LCA3KTsKICAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbN10KIH0KIAogaW50MTZ4OF90IHRlc3Rfdm1sc3FfbGFuZXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc3FfbGFuZXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNxX2xhbmVxX3MxNgogICByZXR1cm4gdm1sc3FfbGFuZXFfczE2KGEsIGIsIHYsIDcpOwogICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFs3XQogfQogCiBpbnQzMngyX3QgdGVzdF92bWxzX2xhbmVxX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNfbGFuZXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNfbGFuZXFfczMyCiAgIHJldHVybiB2bWxzX2xhbmVxX3MzMihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbM10KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sc3FfbGFuZXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc3FfbGFuZXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNxX2xhbmVxX3MzMgogICByZXR1cm4gdm1sc3FfbGFuZXFfczMyKGEsIGIsIHYsIDMpOwogICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1szXQogfQogCiBpbnQxNng0X3QgdGVzdF92bXVsX2xhbmVfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsX2xhbmVfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfbGFuZV9zMTYKICAgcmV0dXJuIHZtdWxfbGFuZV9zMTYoYSwgdiwgMyk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtdWxxX2xhbmVfczE2KGludDE2eDhfdCBhLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVscV9sYW5lX3MxNgogICByZXR1cm4gdm11bHFfbGFuZV9zMTYoYSwgdiwgMyk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZtdWxfbGFuZV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxfbGFuZV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bF9sYW5lX3MzMgogICByZXR1cm4gdm11bF9sYW5lX3MzMihhLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMV0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm11bHFfbGFuZV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxxX2xhbmVfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX2xhbmVfczMyCiAgIHJldHVybiB2bXVscV9sYW5lX3MzMihhLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZtdWxfbGFuZV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bF9sYW5lX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX2xhbmVfdTE2CiAgIHJldHVybiB2bXVsX2xhbmVfdTE2KGEsIHYsIDMpOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiB1aW50MTZ4OF90IHRlc3Rfdm11bHFfbGFuZV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bHFfbGFuZV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfbGFuZV91MTYKICAgcmV0dXJuIHZtdWxxX2xhbmVfdTE2KGEsIHYsIDMpOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiB1aW50MzJ4Ml90IHRlc3Rfdm11bF9sYW5lX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsX2xhbmVfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfbGFuZV91MzIKICAgcmV0dXJuIHZtdWxfbGFuZV91MzIoYSwgdiwgMSk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bXVscV9sYW5lX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV9sYW5lX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVscV9sYW5lX3UzMgogICByZXR1cm4gdm11bHFfbGFuZV91MzIoYSwgdiwgMSk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZtdWxfbGFuZXFfczE2KGludDE2eDRfdCBhLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsX2xhbmVxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX2xhbmVxX3MxNgogICByZXR1cm4gdm11bF9sYW5lcV9zMTYoYSwgdiwgNyk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtdWxxX2xhbmVxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bHFfbGFuZXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX2xhbmVxX3MxNgogICByZXR1cm4gdm11bHFfbGFuZXFfczE2KGEsIHYsIDcpOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFs3XQogfQogCiBpbnQzMngyX3QgdGVzdF92bXVsX2xhbmVxX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bF9sYW5lcV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bF9sYW5lcV9zMzIKICAgcmV0dXJuIHZtdWxfbGFuZXFfczMyKGEsIHYsIDMpOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1szXQogfQogCiBpbnQzMng0X3QgdGVzdF92bXVscV9sYW5lcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxxX2xhbmVxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVscV9sYW5lcV9zMzIKICAgcmV0dXJuIHZtdWxxX2xhbmVxX3MzMihhLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbM10KIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZtdWxfbGFuZXFfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxfbGFuZXFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfbGFuZXFfdTE2CiAgIHJldHVybiB2bXVsX2xhbmVxX3UxNihhLCB2LCA3KTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbN10KIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZtdWxxX2xhbmVxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV9sYW5lcV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfbGFuZXFfdTE2CiAgIHJldHVybiB2bXVscV9sYW5lcV91MTYoYSwgdiwgNyk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92bXVsX2xhbmVxX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsX2xhbmVxX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX2xhbmVxX3UzMgogICByZXR1cm4gdm11bF9sYW5lcV91MzIoYSwgdiwgMyk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bXVscV9sYW5lcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bHFfbGFuZXFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX2xhbmVxX3UzMgogICByZXR1cm4gdm11bHFfbGFuZXFfdTMyKGEsIHYsIDMpOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1szXQogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZmbWFfbGFuZV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92Zm1hX2xhbmVfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZmbWFfbGFuZV9mMzIKICAgcmV0dXJuIHZmbWFfbGFuZV9mMzIoYSwgYiwgdiwgMSk7CiAgIC8vIENIRUNLOiBmbWxhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZmbWFxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmZtYXFfbGFuZV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtYXFfbGFuZV9mMzIKICAgcmV0dXJuIHZmbWFxX2xhbmVfZjMyKGEsIGIsIHYsIDEpOwogICAvLyBDSEVDSzogZm1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92Zm1hX2xhbmVxX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbWFfbGFuZXFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZmbWFfbGFuZXFfZjMyCiAgIHJldHVybiB2Zm1hX2xhbmVxX2YzMihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IGZtbGEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdmZtYXFfbGFuZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmZtYXFfbGFuZXFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZmbWFxX2xhbmVxX2YzMgogICByZXR1cm4gdmZtYXFfbGFuZXFfZjMyKGEsIGIsIHYsIDMpOwogICAvLyBDSEVDSzogZm1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbM10KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92Zm1zX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmZtc19sYW5lX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1zX2xhbmVfZjMyCiAgIHJldHVybiB2Zm1zX2xhbmVfZjMyKGEsIGIsIHYsIDEpOwogICAvLyBDSEVDSzogZm1scyB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMV0KIH0KIAogZmxvYXQzMng0X3QgdGVzdF92Zm1zcV9sYW5lX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbXNxX2xhbmVfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZmbXNxX2xhbmVfZjMyCiAgIHJldHVybiB2Zm1zcV9sYW5lX2YzMihhLCBiLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IGZtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdmZtc19sYW5lcV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92Zm1zX2xhbmVxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1zX2xhbmVxX2YzMgogICByZXR1cm4gdmZtc19sYW5lcV9mMzIoYSwgYiwgdiwgMyk7CiAgIC8vIENIRUNLOiBmbWxzIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1szXQogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZmbXNxX2xhbmVxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbXNxX2xhbmVxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1zcV9sYW5lcV9mMzIKICAgcmV0dXJuIHZmbXNxX2xhbmVxX2YzMihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IGZtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdmZtYXFfbGFuZV9mNjQoZmxvYXQ2NHgyX3QgYSwgZmxvYXQ2NHgyX3QgYiwgZmxvYXQ2NHgxX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92Zm1hcV9sYW5lX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hcV9sYW5lX2Y2NAogICByZXR1cm4gdmZtYXFfbGFuZV9mNjQoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBmbWxhIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uZFswXQogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZmbWFxX2xhbmVxX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiLCBmbG9hdDY0eDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbWFxX2xhbmVxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hcV9sYW5lcV9mNjQKICAgcmV0dXJuIHZmbWFxX2xhbmVxX2Y2NChhLCBiLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IGZtbGEge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS5kWzFdCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdmZtc3FfbGFuZV9mNjQoZmxvYXQ2NHgyX3QgYSwgZmxvYXQ2NHgyX3QgYiwgZmxvYXQ2NHgxX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92Zm1zcV9sYW5lX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1zcV9sYW5lX2Y2NAogICByZXR1cm4gdmZtc3FfbGFuZV9mNjQoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBmbWxzIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uZFswXQogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZmbXNxX2xhbmVxX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiLCBmbG9hdDY0eDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbXNxX2xhbmVxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1zcV9sYW5lcV9mNjQKICAgcmV0dXJuIHZmbXNxX2xhbmVxX2Y2NChhLCBiLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IGZtbHMge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS5kWzFdCiB9CiAKK2Zsb2F0MzJfdCB0ZXN0X3ZmbWFzX2xhbmVxX2YzMihmbG9hdDMyX3QgYSwgZmxvYXQzMl90IGIsIGZsb2F0MzJ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtYXNfbGFuZXFfZjMyCisgIHJldHVybiB2Zm1hc19sYW5lcV9mMzIoYSwgYiwgdiwgMyk7CisgIC8vIENIRUNLOiBmbWxhIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uc1szXQorfQorCitmbG9hdDY0X3QgdGVzdF92Zm1zZF9sYW5lX2Y2NChmbG9hdDY0X3QgYSwgZmxvYXQ2NF90IGIsIGZsb2F0NjR4MV90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtc2RfbGFuZV9mNjQKKyAgcmV0dXJuIHZmbXNkX2xhbmVfZjY0KGEsIGIsIHYsIDApOworICAvLyBDSEVDSzoge3tmbWxzIGRbMC05XSssIGRbMC05XSssIHZbMC05XStcLmRcWzBcXXxmbXN1YiBkWzAtOV0rLCBkWzAtOV0rLCBkWzAtOV0rfX0KK30KKworZmxvYXQzMl90IHRlc3RfdmZtc3NfbGFuZXFfZjMyKGZsb2F0MzJfdCBhLCBmbG9hdDMyX3QgYiwgZmxvYXQzMng0X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1zc19sYW5lcV9mMzIKKyAgcmV0dXJuIHZmbXNzX2xhbmVxX2YzMihhLCBiLCB2LCAzKTsKKyAgLy8gQ0hFQ0s6IGZtbHMge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzNdCit9CisKK2Zsb2F0NjRfdCB0ZXN0X3ZmbXNkX2xhbmVxX2Y2NChmbG9hdDY0X3QgYSwgZmxvYXQ2NF90IGIsIGZsb2F0NjR4Ml90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtc2RfbGFuZXFfZjY0CisgIHJldHVybiB2Zm1zZF9sYW5lcV9mNjQoYSwgYiwgdiwgMSk7CisgIC8vIENIRUNLOiBmbWxzIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3t2WzAtOV0rfX0uZFsxXQorfQorCiBpbnQzMng0X3QgdGVzdF92bWxhbF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2xhbmVfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2xhbmVfczE2CiAgIHJldHVybiB2bWxhbF9sYW5lX3MxNihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHNtbGFsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxhbF9sYW5lX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2xhbmVfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2xhbmVfczMyCiAgIHJldHVybiB2bWxhbF9sYW5lX3MzMihhLCBiLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IHNtbGFsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxhbF9sYW5lcV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9sYW5lcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfbGFuZXFfczE2CiAgIHJldHVybiB2bWxhbF9sYW5lcV9zMTYoYSwgYiwgdiwgNyk7CiAgIC8vIENIRUNLOiBzbWxhbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbN10KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1sYWxfbGFuZXFfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfbGFuZXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2xhbmVxX3MzMgogICByZXR1cm4gdm1sYWxfbGFuZXFfczMyKGEsIGIsIHYsIDMpOwogICAvLyBDSEVDSzogc21sYWwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9oaWdoX2xhbmVfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV9zMTYKICAgcmV0dXJuIHZtbGFsX2hpZ2hfbGFuZV9zMTYoYSwgYiwgdiwgMyk7CiAgIC8vIENIRUNLOiBzbWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9oaWdoX2xhbmVfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV9zMzIKICAgcmV0dXJuIHZtbGFsX2hpZ2hfbGFuZV9zMzIoYSwgYiwgdiwgMSk7CiAgIC8vIENIRUNLOiBzbWxhbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZXFfczE2KGludDMyeDRfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfaGlnaF9sYW5lcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfaGlnaF9sYW5lcV9zMTYKICAgcmV0dXJuIHZtbGFsX2hpZ2hfbGFuZXFfczE2KGEsIGIsIHYsIDcpOwogICAvLyBDSEVDSzogc21sYWwyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFs3XQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxhbF9oaWdoX2xhbmVxX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZXFfczMyCiAgIHJldHVybiB2bWxhbF9oaWdoX2xhbmVxX3MzMihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHNtbGFsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbM10KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sc2xfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9sYW5lX3MxNgogICByZXR1cm4gdm1sc2xfbGFuZV9zMTYoYSwgYiwgdiwgMyk7CiAgIC8vIENIRUNLOiBzbWxzbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbM10KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1sc2xfbGFuZV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9sYW5lX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9sYW5lX3MzMgogICByZXR1cm4gdm1sc2xfbGFuZV9zMzIoYSwgYiwgdiwgMSk7CiAgIC8vIENIRUNLOiBzbWxzbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMV0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sc2xfbGFuZXFfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfbGFuZXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2xhbmVxX3MxNgogICByZXR1cm4gdm1sc2xfbGFuZXFfczE2KGEsIGIsIHYsIDcpOwogICAvLyBDSEVDSzogc21sc2wge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtbHNsX2xhbmVxX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2xhbmVxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9sYW5lcV9zMzIKICAgcmV0dXJuIHZtbHNsX2xhbmVxX3MzMihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHNtbHNsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1szXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxzbF9oaWdoX2xhbmVfczE2KGludDMyeDRfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfaGlnaF9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9oaWdoX2xhbmVfczE2CiAgIHJldHVybiB2bWxzbF9oaWdoX2xhbmVfczE2KGEsIGIsIHYsIDMpOwogICAvLyBDSEVDSzogc21sc2wyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxzbF9oaWdoX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfaGlnaF9sYW5lX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9oaWdoX2xhbmVfczMyCiAgIHJldHVybiB2bWxzbF9oaWdoX2xhbmVfczMyKGEsIGIsIHYsIDEpOwogICAvLyBDSEVDSzogc21sc2wyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxzbF9oaWdoX2xhbmVxX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZXFfczE2CiAgIHJldHVybiB2bWxzbF9oaWdoX2xhbmVxX3MxNihhLCBiLCB2LCA3KTsKICAgLy8gQ0hFQ0s6IHNtbHNsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbN10KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1sc2xfaGlnaF9sYW5lcV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9oaWdoX2xhbmVxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9oaWdoX2xhbmVxX3MzMgogICByZXR1cm4gdm1sc2xfaGlnaF9sYW5lcV9zMzIoYSwgYiwgdiwgMyk7CiAgIC8vIENIRUNLOiBzbWxzbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbGFsX2xhbmVfdTE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfbGFuZV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfbGFuZV91MTYKICAgcmV0dXJuIHZtbGFsX2xhbmVfdTE2KGEsIGIsIHYsIDMpOwogICAvLyBDSEVDSzogdW1sYWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtbGFsX2xhbmVfdTMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfbGFuZV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfbGFuZV91MzIKICAgcmV0dXJuIHZtbGFsX2xhbmVfdTMyKGEsIGIsIHYsIDEpOwogICAvLyBDSEVDSzogdW1sYWwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbGFsX2xhbmVxX3UxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2xhbmVxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9sYW5lcV91MTYKICAgcmV0dXJuIHZtbGFsX2xhbmVxX3UxNihhLCBiLCB2LCA3KTsKICAgLy8gQ0hFQ0s6IHVtbGFsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFs3XQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxhbF9sYW5lcV91MzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9sYW5lcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfbGFuZXFfdTMyCiAgIHJldHVybiB2bWxhbF9sYW5lcV91MzIoYSwgYiwgdiwgMyk7CiAgIC8vIENIRUNLOiB1bWxhbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbM10KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sYWxfaGlnaF9sYW5lX3UxNihpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfaGlnaF9sYW5lX3UxNgogICByZXR1cm4gdm1sYWxfaGlnaF9sYW5lX3UxNihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHVtbGFsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbM10KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1sYWxfaGlnaF9sYW5lX3UzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfaGlnaF9sYW5lX3UzMgogICByZXR1cm4gdm1sYWxfaGlnaF9sYW5lX3UzMihhLCBiLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IHVtbGFsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sYWxfaGlnaF9sYW5lcV91MTYoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9oaWdoX2xhbmVxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9oaWdoX2xhbmVxX3UxNgogICByZXR1cm4gdm1sYWxfaGlnaF9sYW5lcV91MTYoYSwgYiwgdiwgNyk7CiAgIC8vIENIRUNLOiB1bWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZXFfdTMyKGludDY0eDJfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfaGlnaF9sYW5lcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfaGlnaF9sYW5lcV91MzIKICAgcmV0dXJuIHZtbGFsX2hpZ2hfbGFuZXFfdTMyKGEsIGIsIHYsIDMpOwogICAvLyBDSEVDSzogdW1sYWwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1szXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxzbF9sYW5lX3UxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2xhbmVfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2xhbmVfdTE2CiAgIHJldHVybiB2bWxzbF9sYW5lX3UxNihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHVtbHNsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxzbF9sYW5lX3UzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2xhbmVfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2xhbmVfdTMyCiAgIHJldHVybiB2bWxzbF9sYW5lX3UzMihhLCBiLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IHVtbHNsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxzbF9sYW5lcV91MTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9sYW5lcV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfbGFuZXFfdTE2CiAgIHJldHVybiB2bWxzbF9sYW5lcV91MTYoYSwgYiwgdiwgNyk7CiAgIC8vIENIRUNLOiB1bWxzbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbN10KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1sc2xfbGFuZXFfdTMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfbGFuZXFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2xhbmVxX3UzMgogICByZXR1cm4gdm1sc2xfbGFuZXFfdTMyKGEsIGIsIHYsIDMpOwogICAvLyBDSEVDSzogdW1sc2wge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZV91MTYoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9oaWdoX2xhbmVfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZV91MTYKICAgcmV0dXJuIHZtbHNsX2hpZ2hfbGFuZV91MTYoYSwgYiwgdiwgMyk7CiAgIC8vIENIRUNLOiB1bWxzbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZV91MzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9oaWdoX2xhbmVfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZV91MzIKICAgcmV0dXJuIHZtbHNsX2hpZ2hfbGFuZV91MzIoYSwgYiwgdiwgMSk7CiAgIC8vIENIRUNLOiB1bWxzbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZXFfdTE2KGludDMyeDRfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfaGlnaF9sYW5lcV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfaGlnaF9sYW5lcV91MTYKICAgcmV0dXJuIHZtbHNsX2hpZ2hfbGFuZXFfdTE2KGEsIGIsIHYsIDcpOwogICAvLyBDSEVDSzogdW1sc2wyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFs3XQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxzbF9oaWdoX2xhbmVxX3UzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZXFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZXFfdTMyCiAgIHJldHVybiB2bWxzbF9oaWdoX2xhbmVxX3UzMihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHVtbHNsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbM10KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm11bGxfbGFuZV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2xhbmVfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2xhbmVfczE2CiAgIHJldHVybiB2bXVsbF9sYW5lX3MxNihhLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHNtdWxsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bXVsbF9sYW5lX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfbGFuZV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfbGFuZV9zMzIKICAgcmV0dXJuIHZtdWxsX2xhbmVfczMyKGEsIHYsIDEpOwogICAvLyBDSEVDSzogc211bGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bXVsbF9sYW5lX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9sYW5lX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9sYW5lX3UxNgogICByZXR1cm4gdm11bGxfbGFuZV91MTYoYSwgdiwgMyk7CiAgIC8vIENIRUNLOiB1bXVsbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbM10KIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZtdWxsX2xhbmVfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2xhbmVfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2xhbmVfdTMyCiAgIHJldHVybiB2bXVsbF9sYW5lX3UzMihhLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IHVtdWxsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQzMng0X3QgdGVzdF92bXVsbF9oaWdoX2xhbmVfczE2KGludDE2eDhfdCBhLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9oaWdoX2xhbmVfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZV9zMTYKICAgcmV0dXJuIHZtdWxsX2hpZ2hfbGFuZV9zMTYoYSwgdiwgMyk7CiAgIC8vIENIRUNLOiBzbXVsbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9sYW5lX3MzMgogICByZXR1cm4gdm11bGxfaGlnaF9sYW5lX3MzMihhLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IHNtdWxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfaGlnaF9sYW5lX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9oaWdoX2xhbmVfdTE2CiAgIHJldHVybiB2bXVsbF9oaWdoX2xhbmVfdTE2KGEsIHYsIDMpOwogICAvLyBDSEVDSzogdW11bGwyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiB1aW50NjR4Ml90IHRlc3Rfdm11bGxfaGlnaF9sYW5lX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9oaWdoX2xhbmVfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZV91MzIKICAgcmV0dXJuIHZtdWxsX2hpZ2hfbGFuZV91MzIoYSwgdiwgMSk7CiAgIC8vIENIRUNLOiB1bXVsbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtdWxsX2xhbmVxX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfbGFuZXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2xhbmVxX3MxNgogICByZXR1cm4gdm11bGxfbGFuZXFfczE2KGEsIHYsIDcpOwogICAvLyBDSEVDSzogc211bGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtdWxsX2xhbmVxX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfbGFuZXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2xhbmVxX3MzMgogICByZXR1cm4gdm11bGxfbGFuZXFfczMyKGEsIHYsIDMpOwogICAvLyBDSEVDSzogc211bGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bXVsbF9sYW5lcV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfbGFuZXFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2xhbmVxX3UxNgogICByZXR1cm4gdm11bGxfbGFuZXFfdTE2KGEsIHYsIDcpOwogICAvLyBDSEVDSzogdW11bGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92bXVsbF9sYW5lcV91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfbGFuZXFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2xhbmVxX3UzMgogICByZXR1cm4gdm11bGxfbGFuZXFfdTMyKGEsIHYsIDMpOwogICAvLyBDSEVDSzogdW11bGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9oaWdoX2xhbmVxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9oaWdoX2xhbmVxX3MxNgogICByZXR1cm4gdm11bGxfaGlnaF9sYW5lcV9zMTYoYSwgdiwgNyk7CiAgIC8vIENIRUNLOiBzbXVsbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9oaWdoX2xhbmVxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9oaWdoX2xhbmVxX3MzMgogICByZXR1cm4gdm11bGxfaGlnaF9sYW5lcV9zMzIoYSwgdiwgMyk7CiAgIC8vIENIRUNLOiBzbXVsbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bXVsbF9oaWdoX2xhbmVxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9oaWdoX2xhbmVxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9oaWdoX2xhbmVxX3UxNgogICByZXR1cm4gdm11bGxfaGlnaF9sYW5lcV91MTYoYSwgdiwgNyk7CiAgIC8vIENIRUNLOiB1bXVsbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92bXVsbF9oaWdoX2xhbmVxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9oaWdoX2xhbmVxX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9oaWdoX2xhbmVxX3UzMgogICByZXR1cm4gdm11bGxfaGlnaF9sYW5lcV91MzIoYSwgdiwgMyk7CiAgIC8vIENIRUNLOiB1bXVsbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxZG1sYWxfbGFuZV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtbGFsX2xhbmVfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sYWxfbGFuZV9zMTYKICAgcmV0dXJuIHZxZG1sYWxfbGFuZV9zMTYoYSwgYiwgdiwgMyk7CiAgIC8vIENIRUNLOiBzcWRtbGFsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92cWRtbGFsX2xhbmVfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbWxhbF9sYW5lX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsX2xhbmVfczMyCiAgIHJldHVybiB2cWRtbGFsX2xhbmVfczMyKGEsIGIsIHYsIDEpOwogICAvLyBDSEVDSzogc3FkbWxhbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMV0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnFkbWxhbF9oaWdoX2xhbmVfczE2KGludDMyeDRfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbWxhbF9oaWdoX2xhbmVfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sYWxfaGlnaF9sYW5lX3MxNgogICByZXR1cm4gdnFkbWxhbF9oaWdoX2xhbmVfczE2KGEsIGIsIHYsIDMpOwogICAvLyBDSEVDSzogc3FkbWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZxZG1sYWxfaGlnaF9sYW5lX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG1sYWxfaGlnaF9sYW5lX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsX2hpZ2hfbGFuZV9zMzIKICAgcmV0dXJuIHZxZG1sYWxfaGlnaF9sYW5lX3MzMihhLCBiLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IHNxZG1sYWwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQzMng0X3QgdGVzdF92cWRtbHNsX2xhbmVfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbWxzbF9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbHNsX2xhbmVfczE2CiAgIHJldHVybiB2cWRtbHNsX2xhbmVfczE2KGEsIGIsIHYsIDMpOwogICAvLyBDSEVDSzogc3FkbWxzbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbM10KIH0KIAogaW50NjR4Ml90IHRlc3RfdnFkbWxzbF9sYW5lX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG1sc2xfbGFuZV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxzbF9sYW5lX3MzMgogICByZXR1cm4gdnFkbWxzbF9sYW5lX3MzMihhLCBiLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IHNxZG1sc2wge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxZG1sc2xfaGlnaF9sYW5lX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG1sc2xfaGlnaF9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbHNsX2hpZ2hfbGFuZV9zMTYKICAgcmV0dXJuIHZxZG1sc2xfaGlnaF9sYW5lX3MxNihhLCBiLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHNxZG1sc2wyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92cWRtbHNsX2hpZ2hfbGFuZV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtbHNsX2hpZ2hfbGFuZV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxzbF9oaWdoX2xhbmVfczMyCiAgIHJldHVybiB2cWRtbHNsX2hpZ2hfbGFuZV9zMzIoYSwgYiwgdiwgMSk7CiAgIC8vIENIRUNLOiBzcWRtbHNsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnFkbXVsbF9sYW5lX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbF9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxsX2xhbmVfczE2CiAgIHJldHVybiB2cWRtdWxsX2xhbmVfczE2KGEsIHYsIDMpOwogICAvLyBDSEVDSzogc3FkbXVsbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbM10KIH0KIAogaW50NjR4Ml90IHRlc3RfdnFkbXVsbF9sYW5lX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbF9sYW5lX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxsX2xhbmVfczMyCiAgIHJldHVybiB2cWRtdWxsX2xhbmVfczMyKGEsIHYsIDEpOwogICAvLyBDSEVDSzogc3FkbXVsbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMV0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnFkbXVsbF9sYW5lcV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG11bGxfbGFuZXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGxfbGFuZXFfczE2CiAgIHJldHVybiB2cWRtdWxsX2xhbmVxX3MxNihhLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHNxZG11bGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZxZG11bGxfbGFuZXFfczMyKGludDMyeDJfdCBhLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtdWxsX2xhbmVxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxsX2xhbmVxX3MzMgogICByZXR1cm4gdnFkbXVsbF9sYW5lcV9zMzIoYSwgdiwgMyk7CiAgIC8vIENIRUNLOiBzcWRtdWxsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1szXQogfQogCiBpbnQzMng0X3QgdGVzdF92cWRtdWxsX2hpZ2hfbGFuZV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG11bGxfaGlnaF9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxsX2hpZ2hfbGFuZV9zMTYKICAgcmV0dXJuIHZxZG11bGxfaGlnaF9sYW5lX3MxNihhLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHNxZG11bGwyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92cWRtdWxsX2hpZ2hfbGFuZV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG11bGxfaGlnaF9sYW5lX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxsX2hpZ2hfbGFuZV9zMzIKICAgcmV0dXJuIHZxZG11bGxfaGlnaF9sYW5lX3MzMihhLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IHNxZG11bGwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQzMng0X3QgdGVzdF92cWRtdWxsX2hpZ2hfbGFuZXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtdWxsX2hpZ2hfbGFuZXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGxfaGlnaF9sYW5lcV9zMTYKICAgcmV0dXJuIHZxZG11bGxfaGlnaF9sYW5lcV9zMTYoYSwgdiwgNyk7CiAgIC8vIENIRUNLOiBzcWRtdWxsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbN10KIH0KIAogaW50NjR4Ml90IHRlc3RfdnFkbXVsbF9oaWdoX2xhbmVxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbF9oaWdoX2xhbmVxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxsX2hpZ2hfbGFuZXFfczMyCiAgIHJldHVybiB2cWRtdWxsX2hpZ2hfbGFuZXFfczMyKGEsIHYsIDMpOwogICAvLyBDSEVDSzogc3FkbXVsbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZxZG11bGhfbGFuZV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG11bGhfbGFuZV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsaF9sYW5lX3MxNgogICByZXR1cm4gdnFkbXVsaF9sYW5lX3MxNihhLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHNxZG11bGgge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZxZG11bGhxX2xhbmVfczE2KGludDE2eDhfdCBhLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtdWxocV9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxocV9sYW5lX3MxNgogICByZXR1cm4gdnFkbXVsaHFfbGFuZV9zMTYoYSwgdiwgMyk7CiAgIC8vIENIRUNLOiBzcWRtdWxoIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQzMngyX3QgdGVzdF92cWRtdWxoX2xhbmVfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtdWxoX2xhbmVfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGhfbGFuZV9zMzIKICAgcmV0dXJuIHZxZG11bGhfbGFuZV9zMzIoYSwgdiwgMSk7CiAgIC8vIENIRUNLOiBzcWRtdWxoIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQzMng0X3QgdGVzdF92cWRtdWxocV9sYW5lX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsaHFfbGFuZV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsaHFfbGFuZV9zMzIKICAgcmV0dXJuIHZxZG11bGhxX2xhbmVfczMyKGEsIHYsIDEpOwogICAvLyBDSEVDSzogc3FkbXVsaCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KIH0KIAogaW50MTZ4NF90IHRlc3RfdnFyZG11bGhfbGFuZV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxcmRtdWxoX2xhbmVfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcmRtdWxoX2xhbmVfczE2CiAgIHJldHVybiB2cXJkbXVsaF9sYW5lX3MxNihhLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQxNng4X3QgdGVzdF92cXJkbXVsaHFfbGFuZV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxcmRtdWxocV9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJkbXVsaHFfbGFuZV9zMTYKICAgcmV0dXJuIHZxcmRtdWxocV9sYW5lX3MxNihhLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQzMngyX3QgdGVzdF92cXJkbXVsaF9sYW5lX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFyZG11bGhfbGFuZV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhfbGFuZV9zMzIKICAgcmV0dXJuIHZxcmRtdWxoX2xhbmVfczMyKGEsIHYsIDEpOwogICAvLyBDSEVDSzogc3FyZG11bGgge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxcmRtdWxocV9sYW5lX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFyZG11bGhxX2xhbmVfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcmRtdWxocV9sYW5lX3MzMgogICByZXR1cm4gdnFyZG11bGhxX2xhbmVfczMyKGEsIHYsIDEpOwogICAvLyBDSEVDSzogc3FyZG11bGgge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3Rfdm11bF9sYW5lX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxfbGFuZV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bF9sYW5lX2YzMgogICByZXR1cm4gdm11bF9sYW5lX2YzMihhLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IGZtdWwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIAogZmxvYXQ2NHgxX3QgdGVzdF92bXVsX2xhbmVfZjY0KGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4MV90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bF9sYW5lX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX2xhbmVfZjY0CiAgIHJldHVybiB2bXVsX2xhbmVfZjY0KGEsIHYsIDApOwotICAvLyBDSEVDSzogZm11bCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMF0KKyAgLy8gQ0hFQ0s6IGZtdWwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e3ZbMC05XStcLmRcWzBcXXxkWzAtOV0rfX0KIH0KIAogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZtdWxxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bHFfbGFuZV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfbGFuZV9mMzIKICAgcmV0dXJuIHZtdWxxX2xhbmVfZjMyKGEsIHYsIDEpOwogICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92bXVscV9sYW5lX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDFfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxxX2xhbmVfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX2xhbmVfZjY0CiAgIHJldHVybiB2bXVscV9sYW5lX2Y2NChhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IGZtdWwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS5kWzBdCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3Rfdm11bF9sYW5lcV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsX2xhbmVxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX2xhbmVxX2YzMgogICByZXR1cm4gdm11bF9sYW5lcV9mMzIoYSwgdiwgMyk7CiAgIC8vIENIRUNLOiBmbXVsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1szXQogfQogCiBmbG9hdDY0eDFfdCB0ZXN0X3ZtdWxfbGFuZXFfZjY0KGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bF9sYW5lcV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bF9sYW5lcV9mNjQKICAgcmV0dXJuIHZtdWxfbGFuZXFfZjY0KGEsIHYsIDEpOwogICAvLyBDSEVDSzogZm11bCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMV0KIH0KIAogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZtdWxxX2xhbmVxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxxX2xhbmVxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVscV9sYW5lcV9mMzIKICAgcmV0dXJuIHZtdWxxX2xhbmVxX2YzMihhLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IGZtdWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3Rfdm11bHFfbGFuZXFfZjY0KGZsb2F0NjR4Ml90IGEsIGZsb2F0NjR4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bHFfbGFuZXFfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX2xhbmVxX2Y2NAogICByZXR1cm4gdm11bHFfbGFuZXFfZjY0KGEsIHYsIDEpOwogICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LmRbMV0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92bXVseF9sYW5lX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWx4X2xhbmVfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWx4X2xhbmVfZjMyCiAgIHJldHVybiB2bXVseF9sYW5lX2YzMihhLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IGZtdWx4IHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZtdWx4cV9sYW5lX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWx4cV9sYW5lX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseHFfbGFuZV9mMzIKICAgcmV0dXJuIHZtdWx4cV9sYW5lX2YzMihhLCB2LCAxKTsKICAgLy8gQ0hFQ0s6IGZtdWx4IHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZtdWx4cV9sYW5lX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDFfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWx4cV9sYW5lX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseHFfbGFuZV9mNjQKICAgcmV0dXJuIHZtdWx4cV9sYW5lX2Y2NChhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IGZtdWx4IHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uZFswXQogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZtdWx4X2xhbmVxX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWx4X2xhbmVxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseF9sYW5lcV9mMzIKICAgcmV0dXJuIHZtdWx4X2xhbmVxX2YzMihhLCB2LCAzKTsKICAgLy8gQ0hFQ0s6IGZtdWx4IHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1szXQogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZtdWx4cV9sYW5lcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVseHFfbGFuZXFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWx4cV9sYW5lcV9mMzIKICAgcmV0dXJuIHZtdWx4cV9sYW5lcV9mMzIoYSwgdiwgMyk7CiAgIC8vIENIRUNLOiBmbXVseCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbM10KIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92bXVseHFfbGFuZXFfZjY0KGZsb2F0NjR4Ml90IGEsIGZsb2F0NjR4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bHhxX2xhbmVxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseHFfbGFuZXFfZjY0CiAgIHJldHVybiB2bXVseHFfbGFuZXFfZjY0KGEsIHYsIDEpOwogICAvLyBDSEVDSzogZm11bHgge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS5kWzFdCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZtbGFfbGFuZV9zMTZfMChpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFfbGFuZV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX2xhbmVfczE2XzAKICAgcmV0dXJuIHZtbGFfbGFuZV9zMTYoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtbGFxX2xhbmVfczE2XzAoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhcV9sYW5lX3MxNl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX2xhbmVfczE2XzAKICAgcmV0dXJuIHZtbGFxX2xhbmVfczE2KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQzMngyX3QgdGVzdF92bWxhX2xhbmVfczMyXzAoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhX2xhbmVfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYV9sYW5lX3MzMl8wCiAgIHJldHVybiB2bWxhX2xhbmVfczMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxhcV9sYW5lX3MzMl8wKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYXFfbGFuZV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV9sYW5lX3MzMl8wCiAgIHJldHVybiB2bWxhcV9sYW5lX3MzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MTZ4NF90IHRlc3Rfdm1sYV9sYW5lcV9zMTZfMChpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFfbGFuZXFfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYV9sYW5lcV9zMTZfMAogICByZXR1cm4gdm1sYV9sYW5lcV9zMTYoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtbGFxX2xhbmVxX3MxNl8wKGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYXFfbGFuZXFfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYXFfbGFuZXFfczE2XzAKICAgcmV0dXJuIHZtbGFxX2xhbmVxX3MxNihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogaW50MzJ4Ml90IHRlc3Rfdm1sYV9sYW5lcV9zMzJfMChpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFfbGFuZXFfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYV9sYW5lcV9zMzJfMAogICByZXR1cm4gdm1sYV9sYW5lcV9zMzIoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbGFxX2xhbmVxX3MzMl8wKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYXFfbGFuZXFfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYXFfbGFuZXFfczMyXzAKICAgcmV0dXJuIHZtbGFxX2xhbmVxX3MzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MTZ4NF90IHRlc3Rfdm1sc19sYW5lX3MxNl8wKGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc19sYW5lX3MxNl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNfbGFuZV9zMTZfMAogICByZXR1cm4gdm1sc19sYW5lX3MxNihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogaW50MTZ4OF90IHRlc3Rfdm1sc3FfbGFuZV9zMTZfMChpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNxX2xhbmVfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfbGFuZV9zMTZfMAogICByZXR1cm4gdm1sc3FfbGFuZV9zMTYoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZtbHNfbGFuZV9zMzJfMChpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNfbGFuZV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzX2xhbmVfczMyXzAKICAgcmV0dXJuIHZtbHNfbGFuZV9zMzIoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbHNxX2xhbmVfczMyXzAoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzcV9sYW5lX3MzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNxX2xhbmVfczMyXzAKICAgcmV0dXJuIHZtbHNxX2xhbmVfczMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQxNng0X3QgdGVzdF92bWxzX2xhbmVxX3MxNl8wKGludDE2eDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc19sYW5lcV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzX2xhbmVxX3MxNl8wCiAgIHJldHVybiB2bWxzX2xhbmVxX3MxNihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogaW50MTZ4OF90IHRlc3Rfdm1sc3FfbGFuZXFfczE2XzAoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzcV9sYW5lcV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzcV9sYW5lcV9zMTZfMAogICByZXR1cm4gdm1sc3FfbGFuZXFfczE2KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQzMngyX3QgdGVzdF92bWxzX2xhbmVxX3MzMl8wKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc19sYW5lcV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzX2xhbmVxX3MzMl8wCiAgIHJldHVybiB2bWxzX2xhbmVxX3MzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sc3FfbGFuZXFfczMyXzAoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzcV9sYW5lcV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzcV9sYW5lcV9zMzJfMAogICByZXR1cm4gdm1sc3FfbGFuZXFfczMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQxNng0X3QgdGVzdF92bXVsX2xhbmVfczE2XzAoaW50MTZ4NF90IGEsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxfbGFuZV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX2xhbmVfczE2XzAKICAgcmV0dXJuIHZtdWxfbGFuZV9zMTYoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtdWxxX2xhbmVfczE2XzAoaW50MTZ4OF90IGEsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxxX2xhbmVfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfbGFuZV9zMTZfMAogICByZXR1cm4gdm11bHFfbGFuZV9zMTYoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZtdWxfbGFuZV9zMzJfMChpbnQzMngyX3QgYSwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bF9sYW5lX3MzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfbGFuZV9zMzJfMAogICByZXR1cm4gdm11bF9sYW5lX3MzMihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm11bHFfbGFuZV9zMzJfMChpbnQzMng0X3QgYSwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bHFfbGFuZV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVscV9sYW5lX3MzMl8wCiAgIHJldHVybiB2bXVscV9sYW5lX3MzMihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZtdWxfbGFuZV91MTZfMCh1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsX2xhbmVfdTE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bF9sYW5lX3UxNl8wCiAgIHJldHVybiB2bXVsX2xhbmVfdTE2KGEsIHYsIDApOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiB1aW50MTZ4OF90IHRlc3Rfdm11bHFfbGFuZV91MTZfMCh1aW50MTZ4OF90IGEsIHVpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV9sYW5lX3UxNl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX2xhbmVfdTE2XzAKICAgcmV0dXJuIHZtdWxxX2xhbmVfdTE2KGEsIHYsIDApOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiB1aW50MzJ4Ml90IHRlc3Rfdm11bF9sYW5lX3UzMl8wKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxfbGFuZV91MzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX2xhbmVfdTMyXzAKICAgcmV0dXJuIHZtdWxfbGFuZV91MzIoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bXVscV9sYW5lX3UzMl8wKHVpbnQzMng0X3QgYSwgdWludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxxX2xhbmVfdTMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfbGFuZV91MzJfMAogICByZXR1cm4gdm11bHFfbGFuZV91MzIoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZtdWxfbGFuZXFfczE2XzAoaW50MTZ4NF90IGEsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxfbGFuZXFfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bF9sYW5lcV9zMTZfMAogICByZXR1cm4gdm11bF9sYW5lcV9zMTYoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtdWxxX2xhbmVxX3MxNl8wKGludDE2eDhfdCBhLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV9sYW5lcV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVscV9sYW5lcV9zMTZfMAogICByZXR1cm4gdm11bHFfbGFuZXFfczE2KGEsIHYsIDApOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQzMngyX3QgdGVzdF92bXVsX2xhbmVxX3MzMl8wKGludDMyeDJfdCBhLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsX2xhbmVxX3MzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfbGFuZXFfczMyXzAKICAgcmV0dXJuIHZtdWxfbGFuZXFfczMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92bXVscV9sYW5lcV9zMzJfMChpbnQzMng0X3QgYSwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bHFfbGFuZXFfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfbGFuZXFfczMyXzAKICAgcmV0dXJuIHZtdWxxX2xhbmVxX3MzMihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZtdWxfbGFuZXFfdTE2XzAodWludDE2eDRfdCBhLCB1aW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bF9sYW5lcV91MTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX2xhbmVxX3UxNl8wCiAgIHJldHVybiB2bXVsX2xhbmVxX3UxNihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZtdWxxX2xhbmVxX3UxNl8wKHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxxX2xhbmVxX3UxNl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX2xhbmVxX3UxNl8wCiAgIHJldHVybiB2bXVscV9sYW5lcV91MTYoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92bXVsX2xhbmVxX3UzMl8wKHVpbnQzMngyX3QgYSwgdWludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxfbGFuZXFfdTMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bF9sYW5lcV91MzJfMAogICByZXR1cm4gdm11bF9sYW5lcV91MzIoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bXVscV9sYW5lcV91MzJfMCh1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV9sYW5lcV91MzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVscV9sYW5lcV91MzJfMAogICByZXR1cm4gdm11bHFfbGFuZXFfdTMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZmbWFfbGFuZV9mMzJfMChmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbWFfbGFuZV9mMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hX2xhbmVfZjMyXzAKICAgcmV0dXJuIHZmbWFfbGFuZV9mMzIoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBmbWxhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZmbWFxX2xhbmVfZjMyXzAoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92Zm1hcV9sYW5lX2YzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZmbWFxX2xhbmVfZjMyXzAKICAgcmV0dXJuIHZmbWFxX2xhbmVfZjMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogZm1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92Zm1hX2xhbmVxX2YzMl8wKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmZtYV9sYW5lcV9mMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hX2xhbmVxX2YzMl8wCiAgIHJldHVybiB2Zm1hX2xhbmVxX2YzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IGZtbGEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdmZtYXFfbGFuZXFfZjMyXzAoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92Zm1hcV9sYW5lcV9mMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hcV9sYW5lcV9mMzJfMAogICByZXR1cm4gdmZtYXFfbGFuZXFfZjMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogZm1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92Zm1zX2xhbmVfZjMyXzAoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92Zm1zX2xhbmVfZjMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtc19sYW5lX2YzMl8wCiAgIHJldHVybiB2Zm1zX2xhbmVfZjMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogZm1scyB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KIH0KIAogZmxvYXQzMng0X3QgdGVzdF92Zm1zcV9sYW5lX2YzMl8wKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmZtc3FfbGFuZV9mMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1zcV9sYW5lX2YzMl8wCiAgIHJldHVybiB2Zm1zcV9sYW5lX2YzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IGZtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdmZtc19sYW5lcV9mMzJfMChmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbXNfbGFuZXFfZjMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtc19sYW5lcV9mMzJfMAogICByZXR1cm4gdmZtc19sYW5lcV9mMzIoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBmbWxzIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZmbXNxX2xhbmVxX2YzMl8wKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmZtc3FfbGFuZXFfZjMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtc3FfbGFuZXFfZjMyXzAKICAgcmV0dXJuIHZmbXNxX2xhbmVxX2YzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IGZtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdmZtYXFfbGFuZXFfZjY0XzAoZmxvYXQ2NHgyX3QgYSwgZmxvYXQ2NHgyX3QgYiwgZmxvYXQ2NHgyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92Zm1hcV9sYW5lcV9mNjRfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hcV9sYW5lcV9mNjRfMAogICByZXR1cm4gdmZtYXFfbGFuZXFfZjY0KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogZm1sYSB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LmRbMF0KIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92Zm1zcV9sYW5lcV9mNjRfMChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiLCBmbG9hdDY0eDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbXNxX2xhbmVxX2Y2NF8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZmbXNxX2xhbmVxX2Y2NF8wCiAgIHJldHVybiB2Zm1zcV9sYW5lcV9mNjQoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBmbWxzIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uZFswXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxhbF9sYW5lX3MxNl8wKGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfbGFuZV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9sYW5lX3MxNl8wCiAgIHJldHVybiB2bWxhbF9sYW5lX3MxNihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNtbGFsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxhbF9sYW5lX3MzMl8wKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfbGFuZV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9sYW5lX3MzMl8wCiAgIHJldHVybiB2bWxhbF9sYW5lX3MzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNtbGFsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxhbF9sYW5lcV9zMTZfMChpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2xhbmVxX3MxNl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2xhbmVxX3MxNl8wCiAgIHJldHVybiB2bWxhbF9sYW5lcV9zMTYoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBzbWxhbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1sYWxfbGFuZXFfczMyXzAoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9sYW5lcV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9sYW5lcV9zMzJfMAogICByZXR1cm4gdm1sYWxfbGFuZXFfczMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogc21sYWwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV9zMTZfMChpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9oaWdoX2xhbmVfczE2XzAKICAgcmV0dXJuIHZtbGFsX2hpZ2hfbGFuZV9zMTYoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBzbWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV9zMzJfMChpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9oaWdoX2xhbmVfczMyXzAKICAgcmV0dXJuIHZtbGFsX2hpZ2hfbGFuZV9zMzIoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBzbWxhbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZXFfczE2XzAoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9oaWdoX2xhbmVxX3MxNl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZXFfczE2XzAKICAgcmV0dXJuIHZtbGFsX2hpZ2hfbGFuZXFfczE2KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogc21sYWwyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxhbF9oaWdoX2xhbmVxX3MzMl8wKGludDY0eDJfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfaGlnaF9sYW5lcV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9oaWdoX2xhbmVxX3MzMl8wCiAgIHJldHVybiB2bWxhbF9oaWdoX2xhbmVxX3MzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNtbGFsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sc2xfbGFuZV9zMTZfMChpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2xhbmVfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfbGFuZV9zMTZfMAogICByZXR1cm4gdm1sc2xfbGFuZV9zMTYoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBzbWxzbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1sc2xfbGFuZV9zMzJfMChpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2xhbmVfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfbGFuZV9zMzJfMAogICByZXR1cm4gdm1sc2xfbGFuZV9zMzIoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBzbWxzbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sc2xfbGFuZXFfczE2XzAoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9sYW5lcV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9sYW5lcV9zMTZfMAogICByZXR1cm4gdm1sc2xfbGFuZXFfczE2KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogc21sc2wge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtbHNsX2xhbmVxX3MzMl8wKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfbGFuZXFfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfbGFuZXFfczMyXzAKICAgcmV0dXJuIHZtbHNsX2xhbmVxX3MzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNtbHNsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxzbF9oaWdoX2xhbmVfczE2XzAoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9oaWdoX2xhbmVfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfaGlnaF9sYW5lX3MxNl8wCiAgIHJldHVybiB2bWxzbF9oaWdoX2xhbmVfczE2KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogc21sc2wyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxzbF9oaWdoX2xhbmVfczMyXzAoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9oaWdoX2xhbmVfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfaGlnaF9sYW5lX3MzMl8wCiAgIHJldHVybiB2bWxzbF9oaWdoX2xhbmVfczMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogc21sc2wyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxzbF9oaWdoX2xhbmVxX3MxNl8wKGludDMyeDRfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfaGlnaF9sYW5lcV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9oaWdoX2xhbmVxX3MxNl8wCiAgIHJldHVybiB2bWxzbF9oaWdoX2xhbmVxX3MxNihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNtbHNsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1sc2xfaGlnaF9sYW5lcV9zMzJfMChpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZXFfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfaGlnaF9sYW5lcV9zMzJfMAogICByZXR1cm4gdm1sc2xfaGlnaF9sYW5lcV9zMzIoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBzbWxzbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbGFsX2xhbmVfdTE2XzAoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9sYW5lX3UxNl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2xhbmVfdTE2XzAKICAgcmV0dXJuIHZtbGFsX2xhbmVfdTE2KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogdW1sYWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtbGFsX2xhbmVfdTMyXzAoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9sYW5lX3UzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2xhbmVfdTMyXzAKICAgcmV0dXJuIHZtbGFsX2xhbmVfdTMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogdW1sYWwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbGFsX2xhbmVxX3UxNl8wKGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfbGFuZXFfdTE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfbGFuZXFfdTE2XzAKICAgcmV0dXJuIHZtbGFsX2xhbmVxX3UxNihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHVtbGFsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxhbF9sYW5lcV91MzJfMChpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2xhbmVxX3UzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2xhbmVxX3UzMl8wCiAgIHJldHVybiB2bWxhbF9sYW5lcV91MzIoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiB1bWxhbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sYWxfaGlnaF9sYW5lX3UxNl8wKGludDMyeDRfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfaGlnaF9sYW5lX3UxNl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV91MTZfMAogICByZXR1cm4gdm1sYWxfaGlnaF9sYW5lX3UxNihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHVtbGFsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1sYWxfaGlnaF9sYW5lX3UzMl8wKGludDY0eDJfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfaGlnaF9sYW5lX3UzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZV91MzJfMAogICByZXR1cm4gdm1sYWxfaGlnaF9sYW5lX3UzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHVtbGFsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sYWxfaGlnaF9sYW5lcV91MTZfMChpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZXFfdTE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfaGlnaF9sYW5lcV91MTZfMAogICByZXR1cm4gdm1sYWxfaGlnaF9sYW5lcV91MTYoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiB1bWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZXFfdTMyXzAoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9oaWdoX2xhbmVxX3UzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfbGFuZXFfdTMyXzAKICAgcmV0dXJuIHZtbGFsX2hpZ2hfbGFuZXFfdTMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogdW1sYWwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxzbF9sYW5lX3UxNl8wKGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfbGFuZV91MTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9sYW5lX3UxNl8wCiAgIHJldHVybiB2bWxzbF9sYW5lX3UxNihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHVtbHNsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxzbF9sYW5lX3UzMl8wKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfbGFuZV91MzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9sYW5lX3UzMl8wCiAgIHJldHVybiB2bWxzbF9sYW5lX3UzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHVtbHNsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxzbF9sYW5lcV91MTZfMChpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2xhbmVxX3UxNl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2xhbmVxX3UxNl8wCiAgIHJldHVybiB2bWxzbF9sYW5lcV91MTYoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiB1bWxzbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1sc2xfbGFuZXFfdTMyXzAoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9sYW5lcV91MzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9sYW5lcV91MzJfMAogICByZXR1cm4gdm1sc2xfbGFuZXFfdTMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogdW1sc2wge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZV91MTZfMChpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZV91MTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9oaWdoX2xhbmVfdTE2XzAKICAgcmV0dXJuIHZtbHNsX2hpZ2hfbGFuZV91MTYoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiB1bWxzbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZV91MzJfMChpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZV91MzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9oaWdoX2xhbmVfdTMyXzAKICAgcmV0dXJuIHZtbHNsX2hpZ2hfbGFuZV91MzIoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiB1bWxzbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZXFfdTE2XzAoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9oaWdoX2xhbmVxX3UxNl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2hpZ2hfbGFuZXFfdTE2XzAKICAgcmV0dXJuIHZtbHNsX2hpZ2hfbGFuZXFfdTE2KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogdW1sc2wyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bWxzbF9oaWdoX2xhbmVxX3UzMl8wKGludDY0eDJfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfaGlnaF9sYW5lcV91MzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9oaWdoX2xhbmVxX3UzMl8wCiAgIHJldHVybiB2bWxzbF9oaWdoX2xhbmVxX3UzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHVtbHNsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm11bGxfbGFuZV9zMTZfMChpbnQxNng0X3QgYSwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfbGFuZV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9sYW5lX3MxNl8wCiAgIHJldHVybiB2bXVsbF9sYW5lX3MxNihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNtdWxsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bXVsbF9sYW5lX3MzMl8wKGludDMyeDJfdCBhLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9sYW5lX3MzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2xhbmVfczMyXzAKICAgcmV0dXJuIHZtdWxsX2xhbmVfczMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogc211bGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bXVsbF9sYW5lX3UxNl8wKHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2xhbmVfdTE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfbGFuZV91MTZfMAogICByZXR1cm4gdm11bGxfbGFuZV91MTYoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiB1bXVsbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZtdWxsX2xhbmVfdTMyXzAodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfbGFuZV91MzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9sYW5lX3UzMl8wCiAgIHJldHVybiB2bXVsbF9sYW5lX3UzMihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHVtdWxsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92bXVsbF9oaWdoX2xhbmVfczE2XzAoaW50MTZ4OF90IGEsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9oaWdoX2xhbmVfczE2XzAKICAgcmV0dXJuIHZtdWxsX2hpZ2hfbGFuZV9zMTYoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBzbXVsbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZV9zMzJfMChpbnQzMng0X3QgYSwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfaGlnaF9sYW5lX3MzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZV9zMzJfMAogICByZXR1cm4gdm11bGxfaGlnaF9sYW5lX3MzMihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNtdWxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZV91MTZfMCh1aW50MTZ4OF90IGEsIHVpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9oaWdoX2xhbmVfdTE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9sYW5lX3UxNl8wCiAgIHJldHVybiB2bXVsbF9oaWdoX2xhbmVfdTE2KGEsIHYsIDApOwogICAvLyBDSEVDSzogdW11bGwyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiB1aW50NjR4Ml90IHRlc3Rfdm11bGxfaGlnaF9sYW5lX3UzMl8wKHVpbnQzMng0X3QgYSwgdWludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZV91MzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9oaWdoX2xhbmVfdTMyXzAKICAgcmV0dXJuIHZtdWxsX2hpZ2hfbGFuZV91MzIoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiB1bXVsbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtdWxsX2xhbmVxX3MxNl8wKGludDE2eDRfdCBhLCBpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9sYW5lcV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9sYW5lcV9zMTZfMAogICByZXR1cm4gdm11bGxfbGFuZXFfczE2KGEsIHYsIDApOwogICAvLyBDSEVDSzogc211bGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtdWxsX2xhbmVxX3MzMl8wKGludDMyeDJfdCBhLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9sYW5lcV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9sYW5lcV9zMzJfMAogICByZXR1cm4gdm11bGxfbGFuZXFfczMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogc211bGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bXVsbF9sYW5lcV91MTZfMCh1aW50MTZ4NF90IGEsIHVpbnQxNng4X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9sYW5lcV91MTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9sYW5lcV91MTZfMAogICByZXR1cm4gdm11bGxfbGFuZXFfdTE2KGEsIHYsIDApOwogICAvLyBDSEVDSzogdW11bGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92bXVsbF9sYW5lcV91MzJfMCh1aW50MzJ4Ml90IGEsIHVpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9sYW5lcV91MzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9sYW5lcV91MzJfMAogICByZXR1cm4gdm11bGxfbGFuZXFfdTMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogdW11bGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZXFfczE2XzAoaW50MTZ4OF90IGEsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZXFfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9sYW5lcV9zMTZfMAogICByZXR1cm4gdm11bGxfaGlnaF9sYW5lcV9zMTYoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBzbXVsbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZXFfczMyXzAoaW50MzJ4NF90IGEsIGludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZXFfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9sYW5lcV9zMzJfMAogICByZXR1cm4gdm11bGxfaGlnaF9sYW5lcV9zMzIoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBzbXVsbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bXVsbF9oaWdoX2xhbmVxX3UxNl8wKHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZXFfdTE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9sYW5lcV91MTZfMAogICByZXR1cm4gdm11bGxfaGlnaF9sYW5lcV91MTYoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiB1bXVsbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92bXVsbF9oaWdoX2xhbmVxX3UzMl8wKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2hpZ2hfbGFuZXFfdTMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9sYW5lcV91MzJfMAogICByZXR1cm4gdm11bGxfaGlnaF9sYW5lcV91MzIoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiB1bXVsbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxZG1sYWxfbGFuZV9zMTZfMChpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG1sYWxfbGFuZV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsX2xhbmVfczE2XzAKICAgcmV0dXJuIHZxZG1sYWxfbGFuZV9zMTYoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBzcWRtbGFsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92cWRtbGFsX2xhbmVfczMyXzAoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtbGFsX2xhbmVfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxhbF9sYW5lX3MzMl8wCiAgIHJldHVybiB2cWRtbGFsX2xhbmVfczMyKGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogc3FkbWxhbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnFkbWxhbF9oaWdoX2xhbmVfczE2XzAoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtbGFsX2hpZ2hfbGFuZV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsX2hpZ2hfbGFuZV9zMTZfMAogICByZXR1cm4gdnFkbWxhbF9oaWdoX2xhbmVfczE2KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogc3FkbWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZxZG1sYWxfaGlnaF9sYW5lX3MzMl8wKGludDY0eDJfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbWxhbF9oaWdoX2xhbmVfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxhbF9oaWdoX2xhbmVfczMyXzAKICAgcmV0dXJuIHZxZG1sYWxfaGlnaF9sYW5lX3MzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNxZG1sYWwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92cWRtbHNsX2xhbmVfczE2XzAoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtbHNsX2xhbmVfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxzbF9sYW5lX3MxNl8wCiAgIHJldHVybiB2cWRtbHNsX2xhbmVfczE2KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogc3FkbWxzbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogaW50NjR4Ml90IHRlc3RfdnFkbWxzbF9sYW5lX3MzMl8wKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbWxzbF9sYW5lX3MzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sc2xfbGFuZV9zMzJfMAogICByZXR1cm4gdnFkbWxzbF9sYW5lX3MzMihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNxZG1sc2wge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxZG1sc2xfaGlnaF9sYW5lX3MxNl8wKGludDMyeDRfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbWxzbF9oaWdoX2xhbmVfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxzbF9oaWdoX2xhbmVfczE2XzAKICAgcmV0dXJuIHZxZG1sc2xfaGlnaF9sYW5lX3MxNihhLCBiLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNxZG1sc2wyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92cWRtbHNsX2hpZ2hfbGFuZV9zMzJfMChpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG1sc2xfaGlnaF9sYW5lX3MzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sc2xfaGlnaF9sYW5lX3MzMl8wCiAgIHJldHVybiB2cWRtbHNsX2hpZ2hfbGFuZV9zMzIoYSwgYiwgdiwgMCk7CiAgIC8vIENIRUNLOiBzcWRtbHNsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnFkbXVsbF9sYW5lX3MxNl8wKGludDE2eDRfdCBhLCBpbnQxNng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtdWxsX2xhbmVfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsbF9sYW5lX3MxNl8wCiAgIHJldHVybiB2cWRtdWxsX2xhbmVfczE2KGEsIHYsIDApOwogICAvLyBDSEVDSzogc3FkbXVsbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogaW50NjR4Ml90IHRlc3RfdnFkbXVsbF9sYW5lX3MzMl8wKGludDMyeDJfdCBhLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtdWxsX2xhbmVfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsbF9sYW5lX3MzMl8wCiAgIHJldHVybiB2cWRtdWxsX2xhbmVfczMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogc3FkbXVsbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnFkbXVsbF9sYW5lcV9zMTZfMChpbnQxNng0X3QgYSwgaW50MTZ4OF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbF9sYW5lcV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxsX2xhbmVxX3MxNl8wCiAgIHJldHVybiB2cWRtdWxsX2xhbmVxX3MxNihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNxZG11bGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZxZG11bGxfbGFuZXFfczMyXzAoaW50MzJ4Ml90IGEsIGludDMyeDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG11bGxfbGFuZXFfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsbF9sYW5lcV9zMzJfMAogICByZXR1cm4gdnFkbXVsbF9sYW5lcV9zMzIoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBzcWRtdWxsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92cWRtdWxsX2hpZ2hfbGFuZV9zMTZfMChpbnQxNng4X3QgYSwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbF9oaWdoX2xhbmVfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsbF9oaWdoX2xhbmVfczE2XzAKICAgcmV0dXJuIHZxZG11bGxfaGlnaF9sYW5lX3MxNihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNxZG11bGwyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92cWRtdWxsX2hpZ2hfbGFuZV9zMzJfMChpbnQzMng0X3QgYSwgaW50MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbF9oaWdoX2xhbmVfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsbF9oaWdoX2xhbmVfczMyXzAKICAgcmV0dXJuIHZxZG11bGxfaGlnaF9sYW5lX3MzMihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNxZG11bGwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92cWRtdWxsX2hpZ2hfbGFuZXFfczE2XzAoaW50MTZ4OF90IGEsIGludDE2eDhfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG11bGxfaGlnaF9sYW5lcV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxsX2hpZ2hfbGFuZXFfczE2XzAKICAgcmV0dXJuIHZxZG11bGxfaGlnaF9sYW5lcV9zMTYoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBzcWRtdWxsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMF0KIH0KIAogaW50NjR4Ml90IHRlc3RfdnFkbXVsbF9oaWdoX2xhbmVxX3MzMl8wKGludDMyeDRfdCBhLCBpbnQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtdWxsX2hpZ2hfbGFuZXFfczMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsbF9oaWdoX2xhbmVxX3MzMl8wCiAgIHJldHVybiB2cWRtdWxsX2hpZ2hfbGFuZXFfczMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogc3FkbXVsbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZxZG11bGhfbGFuZV9zMTZfMChpbnQxNng0X3QgYSwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsaF9sYW5lX3MxNl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGhfbGFuZV9zMTZfMAogICByZXR1cm4gdnFkbXVsaF9sYW5lX3MxNihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNxZG11bGgge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZxZG11bGhxX2xhbmVfczE2XzAoaW50MTZ4OF90IGEsIGludDE2eDRfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG11bGhxX2xhbmVfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsaHFfbGFuZV9zMTZfMAogICByZXR1cm4gdnFkbXVsaHFfbGFuZV9zMTYoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBzcWRtdWxoIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQzMngyX3QgdGVzdF92cWRtdWxoX2xhbmVfczMyXzAoaW50MzJ4Ml90IGEsIGludDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG11bGhfbGFuZV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxoX2xhbmVfczMyXzAKICAgcmV0dXJuIHZxZG11bGhfbGFuZV9zMzIoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBzcWRtdWxoIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBpbnQzMng0X3QgdGVzdF92cWRtdWxocV9sYW5lX3MzMl8wKGludDMyeDRfdCBhLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cWRtdWxocV9sYW5lX3MzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGhxX2xhbmVfczMyXzAKICAgcmV0dXJuIHZxZG11bGhxX2xhbmVfczMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogc3FkbXVsaCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogaW50MTZ4NF90IHRlc3RfdnFyZG11bGhfbGFuZV9zMTZfMChpbnQxNng0X3QgYSwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFyZG11bGhfbGFuZV9zMTZfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJkbXVsaF9sYW5lX3MxNl8wCiAgIHJldHVybiB2cXJkbXVsaF9sYW5lX3MxNihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQxNng4X3QgdGVzdF92cXJkbXVsaHFfbGFuZV9zMTZfMChpbnQxNng4X3QgYSwgaW50MTZ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFyZG11bGhxX2xhbmVfczE2XzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhxX2xhbmVfczE2XzAKICAgcmV0dXJuIHZxcmRtdWxocV9sYW5lX3MxNihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQogfQogCiBpbnQzMngyX3QgdGVzdF92cXJkbXVsaF9sYW5lX3MzMl8wKGludDMyeDJfdCBhLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cXJkbXVsaF9sYW5lX3MzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcmRtdWxoX2xhbmVfczMyXzAKICAgcmV0dXJuIHZxcmRtdWxoX2xhbmVfczMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogc3FyZG11bGgge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxcmRtdWxocV9sYW5lX3MzMl8wKGludDMyeDRfdCBhLCBpbnQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92cXJkbXVsaHFfbGFuZV9zMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJkbXVsaHFfbGFuZV9zMzJfMAogICByZXR1cm4gdnFyZG11bGhxX2xhbmVfczMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogc3FyZG11bGgge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3Rfdm11bF9sYW5lX2YzMl8wKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bF9sYW5lX2YzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfbGFuZV9mMzJfMAogICByZXR1cm4gdm11bF9sYW5lX2YzMihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IGZtdWwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3Rfdm11bHFfbGFuZV9mMzJfMChmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxxX2xhbmVfZjMyXzAKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfbGFuZV9mMzJfMAogICByZXR1cm4gdm11bHFfbGFuZV9mMzIoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBmbXVsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZtdWxfbGFuZXFfZjMyXzAoZmxvYXQzMngyX3QgYSwgZmxvYXQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVsX2xhbmVxX2YzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfbGFuZXFfZjMyXzAKICAgcmV0dXJuIHZtdWxfbGFuZXFfZjMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KIH0KIAogZmxvYXQ2NHgxX3QgdGVzdF92bXVsX2xhbmVxX2Y2NF8wKGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4Ml90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bF9sYW5lcV9mNjRfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX2xhbmVxX2Y2NF8wCiAgIHJldHVybiB2bXVsX2xhbmVxX2Y2NChhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IGZtdWwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e3ZbMC05XSt9fS5kWzBdCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3Rfdm11bHFfbGFuZXFfZjMyXzAoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV9sYW5lcV9mMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVscV9sYW5lcV9mMzJfMAogICByZXR1cm4gdm11bHFfbGFuZXFfZjMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92bXVscV9sYW5lcV9mNjRfMChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxxX2xhbmVxX2Y2NF8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX2xhbmVxX2Y2NF8wCiAgIHJldHVybiB2bXVscV9sYW5lcV9mNjQoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBmbXVsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uZFswXQogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZtdWx4X2xhbmVfZjMyXzAoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVseF9sYW5lX2YzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWx4X2xhbmVfZjMyXzAKICAgcmV0dXJuIHZtdWx4X2xhbmVfZjMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogZm11bHgge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3Rfdm11bHhxX2xhbmVfZjMyXzAoZmxvYXQzMng0X3QgYSwgZmxvYXQzMngyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVseHFfbGFuZV9mMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseHFfbGFuZV9mMzJfMAogICByZXR1cm4gdm11bHhxX2xhbmVfZjMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogZm11bHgge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3Rfdm11bHhxX2xhbmVfZjY0XzAoZmxvYXQ2NHgyX3QgYSwgZmxvYXQ2NHgxX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVseHFfbGFuZV9mNjRfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseHFfbGFuZV9mNjRfMAogICByZXR1cm4gdm11bHhxX2xhbmVfZjY0KGEsIHYsIDApOwogICAvLyBDSEVDSzogZm11bHgge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS5kWzBdCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3Rfdm11bHhfbGFuZXFfZjMyXzAoZmxvYXQzMngyX3QgYSwgZmxvYXQzMng0X3QgdikgewotICAvLyBDSEVDSzogdGVzdF92bXVseF9sYW5lcV9mMzJfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseF9sYW5lcV9mMzJfMAogICByZXR1cm4gdm11bHhfbGFuZXFfZjMyKGEsIHYsIDApOwogICAvLyBDSEVDSzogZm11bHgge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3Rfdm11bHhxX2xhbmVxX2YzMl8wKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bHhxX2xhbmVxX2YzMl8wCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWx4cV9sYW5lcV9mMzJfMAogICByZXR1cm4gdm11bHhxX2xhbmVxX2YzMihhLCB2LCAwKTsKICAgLy8gQ0hFQ0s6IGZtdWx4IHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZtdWx4cV9sYW5lcV9mNjRfMChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWx4cV9sYW5lcV9mNjRfMAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseHFfbGFuZXFfZjY0XzAKICAgcmV0dXJuIHZtdWx4cV9sYW5lcV9mNjQoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBmbXVseCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LmRbMF0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm11bGxfaGlnaF9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2hpZ2hfbl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9uX3MxNgogICByZXR1cm4gdm11bGxfaGlnaF9uX3MxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNtdWxsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMF0KKyAgLy8gQ0hFQ0s6IHNtdWxsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK1wuaFxbMFxdfHZbMC05XStcLjhofX0KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm11bGxfaGlnaF9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2hpZ2hfbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9uX3MzMgogICByZXR1cm4gdm11bGxfaGlnaF9uX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNtdWxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IHNtdWxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK1wuc1xbMFxdfHZbMC05XStcLjRzfX0KIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZtdWxsX2hpZ2hfbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2hpZ2hfbl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9uX3UxNgogICByZXR1cm4gdm11bGxfaGlnaF9uX3UxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHVtdWxsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMF0KKyAgLy8gQ0hFQ0s6IHVtdWxsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK1wuaFxbMFxdfHZbMC05XStcLjhofX0KIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZtdWxsX2hpZ2hfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX2hpZ2hfbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9uX3UzMgogICByZXR1cm4gdm11bGxfaGlnaF9uX3UzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHVtdWxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IHVtdWxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK1wuc1xbMFxdfHZbMC05XStcLjRzfX0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnFkbXVsbF9oaWdoX25fczE2KGludDE2eDhfdCBhLCBpbnQxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbF9oaWdoX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGxfaGlnaF9uX3MxNgogICByZXR1cm4gdnFkbXVsbF9oaWdoX25fczE2KGEsIGIpOwotICAvLyBDSEVDSzogc3FkbXVsbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCisgIC8vIENIRUNLOiBzcWRtdWxsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK1wuaFxbMFxdfHZbMC05XStcLjhofX0KIH0KIAogaW50NjR4Ml90IHRlc3RfdnFkbXVsbF9oaWdoX25fczMyKGludDMyeDRfdCBhLCBpbnQzMl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbF9oaWdoX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGxfaGlnaF9uX3MzMgogICByZXR1cm4gdnFkbXVsbF9oaWdoX25fczMyKGEsIGIpOwotICAvLyBDSEVDSzogc3FkbXVsbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCisgIC8vIENIRUNLOiBzcWRtdWxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK1wuc1xbMFxdfHZbMC05XStcLjRzfX0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sYWxfaGlnaF9uX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIsIGludDE2X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9oaWdoX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfbl9zMTYKICAgcmV0dXJuIHZtbGFsX2hpZ2hfbl9zMTYoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzbWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCisgIC8vIENIRUNLOiBzbWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XStcLmhcWzBcXXx2WzAtOV0rXC44aH19CiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZtbGFsX2hpZ2hfbl9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfaGlnaF9uX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9oaWdoX25fczMyCiAgIHJldHVybiB2bWxhbF9oaWdoX25fczMyKGEsIGIsIGMpOwotICAvLyBDSEVDSzogc21sYWwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQorICAvLyBDSEVDSzogc21sYWwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rXC5zXFswXF18dlswLTldK1wuNHN9fQogfQogCiB1aW50MzJ4NF90IHRlc3Rfdm1sYWxfaGlnaF9uX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9oaWdoX25fdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfbl91MTYKICAgcmV0dXJuIHZtbGFsX2hpZ2hfbl91MTYoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB1bWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCisgIC8vIENIRUNLOiB1bWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XStcLmhcWzBcXXx2WzAtOV0rXC44aH19CiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92bWxhbF9oaWdoX25fdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDRfdCBiLCB1aW50MzJfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2hpZ2hfbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfaGlnaF9uX3UzMgogICByZXR1cm4gdm1sYWxfaGlnaF9uX3UzMihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHVtbGFsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IHVtbGFsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK1wuc1xbMFxdfHZbMC05XStcLjRzfX0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnFkbWxhbF9oaWdoX25fczE2KGludDMyeDRfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG1sYWxfaGlnaF9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsX2hpZ2hfbl9zMTYKICAgcmV0dXJuIHZxZG1sYWxfaGlnaF9uX3MxNihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHNxZG1sYWwyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQorICAvLyBDSEVDSzogc3FkbWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XStcLmhcWzBcXXx2WzAtOV0rXC44aH19CiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZxZG1sYWxfaGlnaF9uX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyX3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cWRtbGFsX2hpZ2hfbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxhbF9oaWdoX25fczMyCiAgIHJldHVybiB2cWRtbGFsX2hpZ2hfbl9zMzIoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzcWRtbGFsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IHNxZG1sYWwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rXC5zXFswXF18dlswLTldK1wuNHN9fQogfQogCiBpbnQzMng0X3QgdGVzdF92bWxzbF9oaWdoX25fczE2KGludDMyeDRfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2hpZ2hfbl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfaGlnaF9uX3MxNgogICByZXR1cm4gdm1sc2xfaGlnaF9uX3MxNihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHNtbHNsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMF0KKyAgLy8gQ0hFQ0s6IHNtbHNsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK1wuaFxbMFxdfHZbMC05XStcLjhofX0KIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1sc2xfaGlnaF9uX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyX3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9oaWdoX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2hpZ2hfbl9zMzIKICAgcmV0dXJuIHZtbHNsX2hpZ2hfbl9zMzIoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzbWxzbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCisgIC8vIENIRUNLOiBzbWxzbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XStcLnNcWzBcXXx2WzAtOV0rXC40c319CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bWxzbF9oaWdoX25fdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2hpZ2hfbl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfaGlnaF9uX3UxNgogICByZXR1cm4gdm1sc2xfaGlnaF9uX3UxNihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHVtbHNsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMF0KKyAgLy8gQ0hFQ0s6IHVtbHNsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK1wuaFxbMFxdfHZbMC05XStcLjhofX0KIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZtbHNsX2hpZ2hfbl91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfaGlnaF9uX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9oaWdoX25fdTMyCiAgIHJldHVybiB2bWxzbF9oaWdoX25fdTMyKGEsIGIsIGMpOwotICAvLyBDSEVDSzogdW1sc2wyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQorICAvLyBDSEVDSzogdW1sc2wyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rXC5zXFswXF18dlswLTldK1wuNHN9fQogfQogCiBpbnQzMng0X3QgdGVzdF92cWRtbHNsX2hpZ2hfbl9zMTYoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbWxzbF9oaWdoX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sc2xfaGlnaF9uX3MxNgogICByZXR1cm4gdnFkbWxzbF9oaWdoX25fczE2KGEsIGIsIGMpOwotICAvLyBDSEVDSzogc3FkbWxzbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCisgIC8vIENIRUNLOiBzcWRtbHNsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK1wuaFxbMFxdfHZbMC05XStcLjhofX0KIH0KIAogaW50NjR4Ml90IHRlc3RfdnFkbWxzbF9oaWdoX25fczMyKGludDY0eDJfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG1sc2xfaGlnaF9uX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbHNsX2hpZ2hfbl9zMzIKICAgcmV0dXJuIHZxZG1sc2xfaGlnaF9uX3MzMihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHNxZG1sc2wyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQorICAvLyBDSEVDSzogc3FkbWxzbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XStcLnNcWzBcXXx2WzAtOV0rXC40c319CiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3Rfdm11bF9uX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92bXVsX25fZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfbl9mMzIKICAgcmV0dXJuIHZtdWxfbl9mMzIoYSwgYik7CiAgIC8vIENIRUNLOiBmbXVsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZtdWxxX25fZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxxX25fZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX25fZjMyCiAgIHJldHVybiB2bXVscV9uX2YzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IGZtdWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3Rfdm11bHFfbl9mNjQoZmxvYXQ2NHgyX3QgYSwgZmxvYXQ2NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bHFfbl9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfbl9mNjQKICAgcmV0dXJuIHZtdWxxX25fZjY0KGEsIGIpOwogICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LmRbMF0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92Zm1hX25fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJfdCBuKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbWFfbl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtYV9uX2YzMgogICByZXR1cm4gdmZtYV9uX2YzMihhLCBiLCBuKTsKICAgLy8gQ0hFQ0s6IGZtbGEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdmZtYXFfbl9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMl90IG4pIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmZtYXFfbl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtYXFfbl9mMzIKICAgcmV0dXJuIHZmbWFxX25fZjMyKGEsIGIsIG4pOwogICAvLyBDSEVDSzogZm1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92Zm1zX25fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJfdCBuKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbXNfbl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtc19uX2YzMgogICByZXR1cm4gdmZtc19uX2YzMihhLCBiLCBuKTsKICAgLy8gQ0hFQ0s6IGZtbHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdmZtc3Ffbl9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMl90IG4pIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmZtc3Ffbl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtc3Ffbl9mMzIKICAgcmV0dXJuIHZmbXNxX25fZjMyKGEsIGIsIG4pOwogICAvLyBDSEVDSzogZm1scyB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KIH0KKworaW50MTZ4NF90IHRlc3Rfdm11bF9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfbl9zMTYKKyAgcmV0dXJuIHZtdWxfbl9zMTYoYSwgYik7CisgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uNGgsIHcwCisgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAorfQorCitpbnQxNng4X3QgdGVzdF92bXVscV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX25fczE2CisgIHJldHVybiB2bXVscV9uX3MxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44aCwgdzAKKyAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCit9CisKK2ludDMyeDJfdCB0ZXN0X3ZtdWxfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX25fczMyCisgIHJldHVybiB2bXVsX25fczMyKGEsIGIpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB3MAorICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKK30KKworaW50MzJ4NF90IHRlc3Rfdm11bHFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVscV9uX3MzMgorICByZXR1cm4gdm11bHFfbl9zMzIoYSwgYik7CisgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uNHMsIHcwCisgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cworfQorCit1aW50MTZ4NF90IHRlc3Rfdm11bF9uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bF9uX3UxNgorICByZXR1cm4gdm11bF9uX3UxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwgdzAKKyAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCit9CisKK3VpbnQxNng4X3QgdGVzdF92bXVscV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfbl91MTYKKyAgcmV0dXJuIHZtdWxxX25fdTE2KGEsIGIpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjhoLCB3MAorICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKK30KKwordWludDMyeDJfdCB0ZXN0X3ZtdWxfbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfbl91MzIKKyAgcmV0dXJuIHZtdWxfbl91MzIoYSwgYik7CisgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMnMsIHcwCisgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworfQorCit1aW50MzJ4NF90IHRlc3Rfdm11bHFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX25fdTMyCisgIHJldHVybiB2bXVscV9uX3UzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40cywgdzAKKyAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCit9CisKK2ludDMyeDRfdCB0ZXN0X3ZtdWxsX25fczE2KGludDE2eDRfdCBhLCBpbnQxNl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfbl9zMTYKKyAgcmV0dXJuIHZtdWxsX25fczE2KGEsIGIpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRoLCB3MAorICAvLyBDSEVDSzogc211bGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAorfQorCitpbnQ2NHgyX3QgdGVzdF92bXVsbF9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX25fczMyCisgIHJldHVybiB2bXVsbF9uX3MzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywgdzAKKyAgLy8gQ0hFQ0s6IHNtdWxsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKK30KKwordWludDMyeDRfdCB0ZXN0X3ZtdWxsX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9uX3UxNgorICByZXR1cm4gdm11bGxfbl91MTYoYSwgYik7CisgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uNGgsIHcwCisgIC8vIENIRUNLOiB1bXVsbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCit9CisKK3VpbnQ2NHgyX3QgdGVzdF92bXVsbF9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfbl91MzIKKyAgcmV0dXJuIHZtdWxsX25fdTMyKGEsIGIpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB3MAorICAvLyBDSEVDSzogdW11bGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworfQorCitpbnQzMng0X3QgdGVzdF92cWRtdWxsX25fczE2KGludDE2eDRfdCBhLCBpbnQxNl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsbF9uX3MxNgorICByZXR1cm4gdnFkbXVsbF9uX3MxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwgdzAKKyAgLy8gQ0hFQ0s6IHNxZG11bGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAorfQorCitpbnQ2NHgyX3QgdGVzdF92cWRtdWxsX25fczMyKGludDMyeDJfdCBhLCBpbnQzMl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsbF9uX3MzMgorICByZXR1cm4gdnFkbXVsbF9uX3MzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywgdzAKKyAgLy8gQ0hFQ0s6IHNxZG11bGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworfQorCitpbnQxNng0X3QgdGVzdF92cWRtdWxoX25fczE2KGludDE2eDRfdCBhLCBpbnQxNl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsaF9uX3MxNgorICByZXR1cm4gdnFkbXVsaF9uX3MxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwgdzAKKyAgLy8gQ0hFQ0s6IHNxZG11bGgge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAorfQorCitpbnQxNng4X3QgdGVzdF92cWRtdWxocV9uX3MxNihpbnQxNng4X3QgYSwgaW50MTZfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGhxX25fczE2CisgIHJldHVybiB2cWRtdWxocV9uX3MxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44aCwgdzAKKyAgLy8gQ0hFQ0s6IHNxZG11bGgge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAorfQorCitpbnQzMngyX3QgdGVzdF92cWRtdWxoX25fczMyKGludDMyeDJfdCBhLCBpbnQzMl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsaF9uX3MzMgorICByZXR1cm4gdnFkbXVsaF9uX3MzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywgdzAKKyAgLy8gQ0hFQ0s6IHNxZG11bGgge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworfQorCitpbnQzMng0X3QgdGVzdF92cWRtdWxocV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGhxX25fczMyCisgIHJldHVybiB2cWRtdWxocV9uX3MzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40cywgdzAKKyAgLy8gQ0hFQ0s6IHNxZG11bGgge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cworfQorCitpbnQxNng0X3QgdGVzdF92cXJkbXVsaF9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcmRtdWxoX25fczE2CisgIHJldHVybiB2cXJkbXVsaF9uX3MxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwgdzAKKyAgLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKK30KKworaW50MTZ4OF90IHRlc3RfdnFyZG11bGhxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhxX25fczE2CisgIHJldHVybiB2cXJkbXVsaHFfbl9zMTYoYSwgYik7CisgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGgsIHcwCisgIC8vIENIRUNLOiBzcXJkbXVsaCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCit9CisKK2ludDMyeDJfdCB0ZXN0X3ZxcmRtdWxoX25fczMyKGludDMyeDJfdCBhLCBpbnQzMl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhfbl9zMzIKKyAgcmV0dXJuIHZxcmRtdWxoX25fczMyKGEsIGIpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB3MAorICAvLyBDSEVDSzogc3FyZG11bGgge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworfQorCitpbnQzMng0X3QgdGVzdF92cXJkbXVsaHFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJkbXVsaHFfbl9zMzIKKyAgcmV0dXJuIHZxcmRtdWxocV9uX3MzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40cywgdzAKKyAgLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKK30KKworaW50MTZ4NF90IHRlc3Rfdm1sYV9uX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX25fczE2CisgIHJldHVybiB2bWxhX25fczE2KGEsIGIsIGMpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRoLCB3MAorICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKK30KKworaW50MTZ4OF90IHRlc3Rfdm1sYXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiLCBpbnQxNl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYXFfbl9zMTYKKyAgcmV0dXJuIHZtbGFxX25fczE2KGEsIGIsIGMpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjhoLCB3MAorICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKK30KKworaW50MzJ4Ml90IHRlc3Rfdm1sYV9uX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX25fczMyCisgIHJldHVybiB2bWxhX25fczMyKGEsIGIsIGMpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB3MAorICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKK30KKworaW50MzJ4NF90IHRlc3Rfdm1sYXFfbl9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiLCBpbnQzMl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYXFfbl9zMzIKKyAgcmV0dXJuIHZtbGFxX25fczMyKGEsIGIsIGMpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRzLCB3MAorICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKK30KKwordWludDE2eDRfdCB0ZXN0X3ZtbGFfbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYV9uX3UxNgorICByZXR1cm4gdm1sYV9uX3UxNihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwgdzAKKyAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCit9CisKK3VpbnQxNng4X3QgdGVzdF92bWxhcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2X3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV9uX3UxNgorICByZXR1cm4gdm1sYXFfbl91MTYoYSwgYiwgYyk7CisgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGgsIHcwCisgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAorfQorCit1aW50MzJ4Ml90IHRlc3Rfdm1sYV9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyX3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX25fdTMyCisgIHJldHVybiB2bWxhX25fdTMyKGEsIGIsIGMpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB3MAorICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKK30KKwordWludDMyeDRfdCB0ZXN0X3ZtbGFxX25fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCB1aW50MzJfdCBjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX25fdTMyCisgIHJldHVybiB2bWxhcV9uX3UzMihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40cywgdzAKKyAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCit9CisKK2ludDMyeDRfdCB0ZXN0X3ZtbGFsX25fczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX25fczE2CisgIHJldHVybiB2bWxhbF9uX3MxNihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwgdzAKKyAgLy8gQ0hFQ0s6IHNtbGFsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKK30KKworaW50NjR4Ml90IHRlc3Rfdm1sYWxfbl9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfbl9zMzIKKyAgcmV0dXJuIHZtbGFsX25fczMyKGEsIGIsIGMpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB3MAorICAvLyBDSEVDSzogc21sYWwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworfQorCit1aW50MzJ4NF90IHRlc3Rfdm1sYWxfbl91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfbl91MTYKKyAgcmV0dXJuIHZtbGFsX25fdTE2KGEsIGIsIGMpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRoLCB3MAorICAvLyBDSEVDSzogdW1sYWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAorfQorCit1aW50NjR4Ml90IHRlc3Rfdm1sYWxfbl91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfbl91MzIKKyAgcmV0dXJuIHZtbGFsX25fdTMyKGEsIGIsIGMpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB3MAorICAvLyBDSEVDSzogdW1sYWwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworfQorCitpbnQzMng0X3QgdGVzdF92cWRtbGFsX25fczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZfdCBjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sYWxfbl9zMTYKKyAgcmV0dXJuIHZxZG1sYWxfbl9zMTYoYSwgYiwgYyk7CisgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uNGgsIHcwCisgIC8vIENIRUNLOiBzcWRtbGFsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKK30KKworaW50NjR4Ml90IHRlc3RfdnFkbWxhbF9uX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyX3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsX25fczMyCisgIHJldHVybiB2cWRtbGFsX25fczMyKGEsIGIsIGMpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB3MAorICAvLyBDSEVDSzogc3FkbWxhbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCit9CisKK2ludDE2eDRfdCB0ZXN0X3ZtbHNfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19uX3MxNgorICByZXR1cm4gdm1sc19uX3MxNihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwgdzAKKyAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCit9CisKK2ludDE2eDhfdCB0ZXN0X3ZtbHNxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZfdCBjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNxX25fczE2CisgIHJldHVybiB2bWxzcV9uX3MxNihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44aCwgdzAKKyAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCit9CisKK2ludDMyeDJfdCB0ZXN0X3ZtbHNfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19uX3MzMgorICByZXR1cm4gdm1sc19uX3MzMihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywgdzAKKyAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCit9CisKK2ludDMyeDRfdCB0ZXN0X3ZtbHNxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJfdCBjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNxX25fczMyCisgIHJldHVybiB2bWxzcV9uX3MzMihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCit9CisKK3VpbnQxNng0X3QgdGVzdF92bWxzX25fdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZfdCBjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNfbl91MTYKKyAgcmV0dXJuIHZtbHNfbl91MTYoYSwgYiwgYyk7CisgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uNGgsIHcwCisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAorfQorCit1aW50MTZ4OF90IHRlc3Rfdm1sc3Ffbl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3Ffbl91MTYKKyAgcmV0dXJuIHZtbHNxX25fdTE2KGEsIGIsIGMpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjhoLCB3MAorICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKK30KKwordWludDMyeDJfdCB0ZXN0X3ZtbHNfbl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19uX3UzMgorICByZXR1cm4gdm1sc19uX3UzMihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywgdzAKKyAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCit9CisKK3VpbnQzMng0X3QgdGVzdF92bWxzcV9uX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyX3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzcV9uX3UzMgorICByZXR1cm4gdm1sc3Ffbl91MzIoYSwgYiwgYyk7CisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cworfQorCitpbnQzMng0X3QgdGVzdF92bWxzbF9uX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9uX3MxNgorICByZXR1cm4gdm1sc2xfbl9zMTYoYSwgYiwgYyk7CisgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uNGgsIHcwCisgIC8vIENIRUNLOiBzbWxzbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCit9CisKK2ludDY0eDJfdCB0ZXN0X3ZtbHNsX25fczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJfdCBjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX25fczMyCisgIHJldHVybiB2bWxzbF9uX3MzMihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywgdzAKKyAgLy8gQ0hFQ0s6IHNtbHNsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKK30KKwordWludDMyeDRfdCB0ZXN0X3ZtbHNsX25fdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZfdCBjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX25fdTE2CisgIHJldHVybiB2bWxzbF9uX3UxNihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwgdzAKKyAgLy8gQ0hFQ0s6IHVtbHNsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKK30KKwordWludDY0eDJfdCB0ZXN0X3ZtbHNsX25fdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJfdCBjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX25fdTMyCisgIHJldHVybiB2bWxzbF9uX3UzMihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywgdzAKKyAgLy8gQ0hFQ0s6IHVtbHNsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKK30KKworaW50MzJ4NF90IHRlc3RfdnFkbWxzbF9uX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2X3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbHNsX25fczE2CisgIHJldHVybiB2cWRtbHNsX25fczE2KGEsIGIsIGMpOworICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRoLCB3MAorICAvLyBDSEVDSzogc3FkbWxzbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCit9CisKK2ludDY0eDJfdCB0ZXN0X3ZxZG1sc2xfbl9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxzbF9uX3MzMgorICByZXR1cm4gdnFkbWxzbF9uX3MzMihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywgdzAKKyAgLy8gQ0hFQ0s6IHNxZG1sc2wge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworfQorCit1aW50MTZ4NF90IHRlc3Rfdm1sYV9sYW5lX3UxNl8wKHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYV9sYW5lX3UxNl8wCisgIHJldHVybiB2bWxhX2xhbmVfdTE2KGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQorfQorCit1aW50MTZ4OF90IHRlc3Rfdm1sYXFfbGFuZV91MTZfMCh1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX2xhbmVfdTE2XzAKKyAgcmV0dXJuIHZtbGFxX2xhbmVfdTE2KGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQorfQorCit1aW50MzJ4Ml90IHRlc3Rfdm1sYV9sYW5lX3UzMl8wKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYV9sYW5lX3UzMl8wCisgIHJldHVybiB2bWxhX2xhbmVfdTMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQorfQorCit1aW50MzJ4NF90IHRlc3Rfdm1sYXFfbGFuZV91MzJfMCh1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDJfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX2xhbmVfdTMyXzAKKyAgcmV0dXJuIHZtbGFxX2xhbmVfdTMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQorfQorCit1aW50MTZ4NF90IHRlc3Rfdm1sYV9sYW5lcV91MTZfMCh1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDhfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFfbGFuZXFfdTE2XzAKKyAgcmV0dXJuIHZtbGFfbGFuZXFfdTE2KGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQorfQorCit1aW50MTZ4OF90IHRlc3Rfdm1sYXFfbGFuZXFfdTE2XzAodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng4X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV9sYW5lcV91MTZfMAorICByZXR1cm4gdm1sYXFfbGFuZXFfdTE2KGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQorfQorCit1aW50MzJ4Ml90IHRlc3Rfdm1sYV9sYW5lcV91MzJfMCh1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFfbGFuZXFfdTMyXzAKKyAgcmV0dXJuIHZtbGFfbGFuZXFfdTMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQorfQorCit1aW50MzJ4NF90IHRlc3Rfdm1sYXFfbGFuZXFfdTMyXzAodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMng0X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV9sYW5lcV91MzJfMAorICByZXR1cm4gdm1sYXFfbGFuZXFfdTMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQorfQorCitpbnQzMng0X3QgdGVzdF92cWRtbGFsX2xhbmVxX3MxNl8wKGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4OF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxhbF9sYW5lcV9zMTZfMAorICByZXR1cm4gdnFkbWxhbF9sYW5lcV9zMTYoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBzcWRtbGFsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQorfQorCitpbnQ2NHgyX3QgdGVzdF92cWRtbGFsX2xhbmVxX3MzMl8wKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxhbF9sYW5lcV9zMzJfMAorICByZXR1cm4gdnFkbWxhbF9sYW5lcV9zMzIoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBzcWRtbGFsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQorfQorCitpbnQzMng0X3QgdGVzdF92cWRtbGFsX2hpZ2hfbGFuZXFfczE2XzAoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsX2hpZ2hfbGFuZXFfczE2XzAKKyAgcmV0dXJuIHZxZG1sYWxfaGlnaF9sYW5lcV9zMTYoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBzcWRtbGFsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMF0KK30KKworaW50NjR4Ml90IHRlc3RfdnFkbWxhbF9oaWdoX2xhbmVxX3MzMl8wKGludDY0eDJfdCBhLCBpbnQzMng0X3QgYiwgaW50MzJ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxhbF9oaWdoX2xhbmVxX3MzMl8wCisgIHJldHVybiB2cWRtbGFsX2hpZ2hfbGFuZXFfczMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogc3FkbWxhbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK3VpbnQxNng0X3QgdGVzdF92bWxzX2xhbmVfdTE2XzAodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzX2xhbmVfdTE2XzAKKyAgcmV0dXJuIHZtbHNfbGFuZV91MTYoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCit9CisKK3VpbnQxNng4X3QgdGVzdF92bWxzcV9sYW5lX3UxNl8wKHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfbGFuZV91MTZfMAorICByZXR1cm4gdm1sc3FfbGFuZV91MTYoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCit9CisKK3VpbnQzMngyX3QgdGVzdF92bWxzX2xhbmVfdTMyXzAodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzX2xhbmVfdTMyXzAKKyAgcmV0dXJuIHZtbHNfbGFuZV91MzIoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK3VpbnQzMng0X3QgdGVzdF92bWxzcV9sYW5lX3UzMl8wKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiLCB1aW50MzJ4Ml90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfbGFuZV91MzJfMAorICByZXR1cm4gdm1sc3FfbGFuZV91MzIoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK3VpbnQxNng0X3QgdGVzdF92bWxzX2xhbmVxX3UxNl8wKHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4OF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19sYW5lcV91MTZfMAorICByZXR1cm4gdm1sc19sYW5lcV91MTYoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCit9CisKK3VpbnQxNng4X3QgdGVzdF92bWxzcV9sYW5lcV91MTZfMCh1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDhfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNxX2xhbmVxX3UxNl8wCisgIHJldHVybiB2bWxzcV9sYW5lcV91MTYoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCit9CisKK3VpbnQzMngyX3QgdGVzdF92bWxzX2xhbmVxX3UzMl8wKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19sYW5lcV91MzJfMAorICByZXR1cm4gdm1sc19sYW5lcV91MzIoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK3VpbnQzMng0X3QgdGVzdF92bWxzcV9sYW5lcV91MzJfMCh1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNxX2xhbmVxX3UzMl8wCisgIHJldHVybiB2bWxzcV9sYW5lcV91MzIoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK2ludDMyeDRfdCB0ZXN0X3ZxZG1sc2xfbGFuZXFfczE2XzAoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng4X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbHNsX2xhbmVxX3MxNl8wCisgIHJldHVybiB2cWRtbHNsX2xhbmVxX3MxNihhLCBiLCB2LCAwKTsKKyAgLy8gQ0hFQ0s6IHNxZG1sc2wge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzBdCit9CisKK2ludDY0eDJfdCB0ZXN0X3ZxZG1sc2xfbGFuZXFfczMyXzAoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMng0X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbHNsX2xhbmVxX3MzMl8wCisgIHJldHVybiB2cWRtbHNsX2xhbmVxX3MzMihhLCBiLCB2LCAwKTsKKyAgLy8gQ0hFQ0s6IHNxZG1sc2wge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK2ludDMyeDRfdCB0ZXN0X3ZxZG1sc2xfaGlnaF9sYW5lcV9zMTZfMChpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sc2xfaGlnaF9sYW5lcV9zMTZfMAorICByZXR1cm4gdnFkbWxzbF9oaWdoX2xhbmVxX3MxNihhLCBiLCB2LCAwKTsKKyAgLy8gQ0hFQ0s6IHNxZG1sc2wyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQorfQorCitpbnQ2NHgyX3QgdGVzdF92cWRtbHNsX2hpZ2hfbGFuZXFfczMyXzAoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbHNsX2hpZ2hfbGFuZXFfczMyXzAKKyAgcmV0dXJuIHZxZG1sc2xfaGlnaF9sYW5lcV9zMzIoYSwgYiwgdiwgMCk7CisgIC8vIENIRUNLOiBzcWRtbHNsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KK30KKworaW50MTZ4NF90IHRlc3RfdnFkbXVsaF9sYW5lcV9zMTZfMChpbnQxNng0X3QgYSwgaW50MTZ4OF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsaF9sYW5lcV9zMTZfMAorICByZXR1cm4gdnFkbXVsaF9sYW5lcV9zMTYoYSwgdiwgMCk7CisgIC8vIENIRUNLOiBzcWRtdWxoIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQorfQorCitpbnQxNng4X3QgdGVzdF92cWRtdWxocV9sYW5lcV9zMTZfMChpbnQxNng4X3QgYSwgaW50MTZ4OF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsaHFfbGFuZXFfczE2XzAKKyAgcmV0dXJuIHZxZG11bGhxX2xhbmVxX3MxNihhLCB2LCAwKTsKKyAgLy8gQ0hFQ0s6IHNxZG11bGgge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzBdCit9CisKK2ludDMyeDJfdCB0ZXN0X3ZxZG11bGhfbGFuZXFfczMyXzAoaW50MzJ4Ml90IGEsIGludDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGhfbGFuZXFfczMyXzAKKyAgcmV0dXJuIHZxZG11bGhfbGFuZXFfczMyKGEsIHYsIDApOworICAvLyBDSEVDSzogc3FkbXVsaCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KK30KKworaW50MzJ4NF90IHRlc3RfdnFkbXVsaHFfbGFuZXFfczMyXzAoaW50MzJ4NF90IGEsIGludDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGhxX2xhbmVxX3MzMl8wCisgIHJldHVybiB2cWRtdWxocV9sYW5lcV9zMzIoYSwgdiwgMCk7CisgIC8vIENIRUNLOiBzcWRtdWxoIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQorfQorCitpbnQxNng0X3QgdGVzdF92cXJkbXVsaF9sYW5lcV9zMTZfMChpbnQxNng0X3QgYSwgaW50MTZ4OF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhfbGFuZXFfczE2XzAKKyAgcmV0dXJuIHZxcmRtdWxoX2xhbmVxX3MxNihhLCB2LCAwKTsKKyAgLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFswXQorfQorCitpbnQxNng4X3QgdGVzdF92cXJkbXVsaHFfbGFuZXFfczE2XzAoaW50MTZ4OF90IGEsIGludDE2eDhfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcmRtdWxocV9sYW5lcV9zMTZfMAorICByZXR1cm4gdnFyZG11bGhxX2xhbmVxX3MxNihhLCB2LCAwKTsKKyAgLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFswXQorfQorCitpbnQzMngyX3QgdGVzdF92cXJkbXVsaF9sYW5lcV9zMzJfMChpbnQzMngyX3QgYSwgaW50MzJ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhfbGFuZXFfczMyXzAKKyAgcmV0dXJuIHZxcmRtdWxoX2xhbmVxX3MzMihhLCB2LCAwKTsKKyAgLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQorfQorCitpbnQzMng0X3QgdGVzdF92cXJkbXVsaHFfbGFuZXFfczMyXzAoaW50MzJ4NF90IGEsIGludDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcmRtdWxocV9sYW5lcV9zMzJfMAorICByZXR1cm4gdnFyZG11bGhxX2xhbmVxX3MzMihhLCB2LCAwKTsKKyAgLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQorfQorCit1aW50MTZ4NF90IHRlc3Rfdm1sYV9sYW5lX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFfbGFuZV91MTYKKyAgcmV0dXJuIHZtbGFfbGFuZV91MTYoYSwgYiwgdiwgMyk7CisgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzNdCit9CisKK3VpbnQxNng4X3QgdGVzdF92bWxhcV9sYW5lX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX2xhbmVfdTE2CisgIHJldHVybiB2bWxhcV9sYW5lX3UxNihhLCBiLCB2LCAzKTsKKyAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbM10KK30KKwordWludDMyeDJfdCB0ZXN0X3ZtbGFfbGFuZV91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX2xhbmVfdTMyCisgIHJldHVybiB2bWxhX2xhbmVfdTMyKGEsIGIsIHYsIDEpOworICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQorfQorCit1aW50MzJ4NF90IHRlc3Rfdm1sYXFfbGFuZV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMngyX3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV9sYW5lX3UzMgorICByZXR1cm4gdm1sYXFfbGFuZV91MzIoYSwgYiwgdiwgMSk7CisgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzFdCit9CisKK3VpbnQxNng0X3QgdGVzdF92bWxhX2xhbmVxX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDhfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFfbGFuZXFfdTE2CisgIHJldHVybiB2bWxhX2xhbmVxX3UxNihhLCBiLCB2LCA3KTsKKyAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbN10KK30KKwordWludDE2eDhfdCB0ZXN0X3ZtbGFxX2xhbmVxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYiwgdWludDE2eDhfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX2xhbmVxX3UxNgorICByZXR1cm4gdm1sYXFfbGFuZXFfdTE2KGEsIGIsIHYsIDcpOworICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFs3XQorfQorCit1aW50MzJ4Ml90IHRlc3Rfdm1sYV9sYW5lcV91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMng0X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX2xhbmVxX3UzMgorICByZXR1cm4gdm1sYV9sYW5lcV91MzIoYSwgYiwgdiwgMyk7CisgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCit9CisKK3VpbnQzMng0X3QgdGVzdF92bWxhcV9sYW5lcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMng0X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV9sYW5lcV91MzIKKyAgcmV0dXJuIHZtbGFxX2xhbmVxX3UzMihhLCBiLCB2LCAzKTsKKyAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbM10KK30KKworaW50MzJ4NF90IHRlc3RfdnFkbWxhbF9sYW5lcV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng4X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsX2xhbmVxX3MxNgorICByZXR1cm4gdnFkbWxhbF9sYW5lcV9zMTYoYSwgYiwgdiwgNyk7CisgIC8vIENIRUNLOiBzcWRtbGFsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFs3XQorfQorCitpbnQ2NHgyX3QgdGVzdF92cWRtbGFsX2xhbmVxX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sYWxfbGFuZXFfczMyCisgIHJldHVybiB2cWRtbGFsX2xhbmVxX3MzMihhLCBiLCB2LCAzKTsKKyAgLy8gQ0hFQ0s6IHNxZG1sYWwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCit9CisKK2ludDMyeDRfdCB0ZXN0X3ZxZG1sYWxfaGlnaF9sYW5lcV9zMTYoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsX2hpZ2hfbGFuZXFfczE2CisgIHJldHVybiB2cWRtbGFsX2hpZ2hfbGFuZXFfczE2KGEsIGIsIHYsIDcpOworICAvLyBDSEVDSzogc3FkbWxhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzddCit9CisKK2ludDY0eDJfdCB0ZXN0X3ZxZG1sYWxfaGlnaF9sYW5lcV9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsX2hpZ2hfbGFuZXFfczMyCisgIHJldHVybiB2cWRtbGFsX2hpZ2hfbGFuZXFfczMyKGEsIGIsIHYsIDMpOworICAvLyBDSEVDSzogc3FkbWxhbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzNdCit9CisKK3VpbnQxNng0X3QgdGVzdF92bWxzX2xhbmVfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19sYW5lX3UxNgorICByZXR1cm4gdm1sc19sYW5lX3UxNihhLCBiLCB2LCAzKTsKKyAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbM10KK30KKwordWludDE2eDhfdCB0ZXN0X3ZtbHNxX2xhbmVfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfbGFuZV91MTYKKyAgcmV0dXJuIHZtbHNxX2xhbmVfdTE2KGEsIGIsIHYsIDMpOworICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFszXQorfQorCit1aW50MzJ4Ml90IHRlc3Rfdm1sc19sYW5lX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNfbGFuZV91MzIKKyAgcmV0dXJuIHZtbHNfbGFuZV91MzIoYSwgYiwgdiwgMSk7CisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCit9CisKK3VpbnQzMng0X3QgdGVzdF92bWxzcV9sYW5lX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDJfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNxX2xhbmVfdTMyCisgIHJldHVybiB2bWxzcV9sYW5lX3UzMihhLCBiLCB2LCAxKTsKKyAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KK30KKwordWludDE2eDRfdCB0ZXN0X3ZtbHNfbGFuZXFfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4OF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19sYW5lcV91MTYKKyAgcmV0dXJuIHZtbHNfbGFuZXFfdTE2KGEsIGIsIHYsIDcpOworICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFs3XQorfQorCit1aW50MTZ4OF90IHRlc3Rfdm1sc3FfbGFuZXFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZ4OF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfbGFuZXFfdTE2CisgIHJldHVybiB2bWxzcV9sYW5lcV91MTYoYSwgYiwgdiwgNyk7CisgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzddCit9CisKK3VpbnQzMngyX3QgdGVzdF92bWxzX2xhbmVxX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNfbGFuZXFfdTMyCisgIHJldHVybiB2bWxzX2xhbmVxX3UzMihhLCBiLCB2LCAzKTsKKyAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbM10KK30KKwordWludDMyeDRfdCB0ZXN0X3ZtbHNxX2xhbmVxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNxX2xhbmVxX3UzMgorICByZXR1cm4gdm1sc3FfbGFuZXFfdTMyKGEsIGIsIHYsIDMpOworICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1szXQorfQorCitpbnQzMng0X3QgdGVzdF92cWRtbHNsX2xhbmVxX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDhfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sc2xfbGFuZXFfczE2CisgIHJldHVybiB2cWRtbHNsX2xhbmVxX3MxNihhLCBiLCB2LCA3KTsKKyAgLy8gQ0hFQ0s6IHNxZG1sc2wge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzddCit9CisKK2ludDY0eDJfdCB0ZXN0X3ZxZG1sc2xfbGFuZXFfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxzbF9sYW5lcV9zMzIKKyAgcmV0dXJuIHZxZG1sc2xfbGFuZXFfczMyKGEsIGIsIHYsIDMpOworICAvLyBDSEVDSzogc3FkbWxzbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbM10KK30KKworaW50MzJ4NF90IHRlc3RfdnFkbWxzbF9oaWdoX2xhbmVxX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sc2xfaGlnaF9sYW5lcV9zMTYKKyAgcmV0dXJuIHZxZG1sc2xfaGlnaF9sYW5lcV9zMTYoYSwgYiwgdiwgNyk7CisgIC8vIENIRUNLOiBzcWRtbHNsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbN10KK30KKworaW50NjR4Ml90IHRlc3RfdnFkbWxzbF9oaWdoX2xhbmVxX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sc2xfaGlnaF9sYW5lcV9zMzIKKyAgcmV0dXJuIHZxZG1sc2xfaGlnaF9sYW5lcV9zMzIoYSwgYiwgdiwgMyk7CisgIC8vIENIRUNLOiBzcWRtbHNsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbM10KK30KKworaW50MTZ4NF90IHRlc3RfdnFkbXVsaF9sYW5lcV9zMTYoaW50MTZ4NF90IGEsIGludDE2eDhfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGhfbGFuZXFfczE2CisgIHJldHVybiB2cWRtdWxoX2xhbmVxX3MxNihhLCB2LCA3KTsKKyAgLy8gQ0hFQ0s6IHNxZG11bGgge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzddCit9CisKK2ludDE2eDhfdCB0ZXN0X3ZxZG11bGhxX2xhbmVxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsaHFfbGFuZXFfczE2CisgIHJldHVybiB2cWRtdWxocV9sYW5lcV9zMTYoYSwgdiwgNyk7CisgIC8vIENIRUNLOiBzcWRtdWxoIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFs3XQorfQorCitpbnQzMngyX3QgdGVzdF92cWRtdWxoX2xhbmVxX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsaF9sYW5lcV9zMzIKKyAgcmV0dXJuIHZxZG11bGhfbGFuZXFfczMyKGEsIHYsIDMpOworICAvLyBDSEVDSzogc3FkbXVsaCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbM10KK30KKworaW50MzJ4NF90IHRlc3RfdnFkbXVsaHFfbGFuZXFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxocV9sYW5lcV9zMzIKKyAgcmV0dXJuIHZxZG11bGhxX2xhbmVxX3MzMihhLCB2LCAzKTsKKyAgLy8gQ0hFQ0s6IHNxZG11bGgge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzNdCit9CisKK2ludDE2eDRfdCB0ZXN0X3ZxcmRtdWxoX2xhbmVxX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4OF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhfbGFuZXFfczE2CisgIHJldHVybiB2cXJkbXVsaF9sYW5lcV9zMTYoYSwgdiwgNyk7CisgIC8vIENIRUNLOiBzcXJkbXVsaCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LmhbN10KK30KKworaW50MTZ4OF90IHRlc3RfdnFyZG11bGhxX2xhbmVxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhxX2xhbmVxX3MxNgorICByZXR1cm4gdnFyZG11bGhxX2xhbmVxX3MxNihhLCB2LCA3KTsKKyAgLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFs3XQorfQorCitpbnQzMngyX3QgdGVzdF92cXJkbXVsaF9sYW5lcV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcmRtdWxoX2xhbmVxX3MzMgorICByZXR1cm4gdnFyZG11bGhfbGFuZXFfczMyKGEsIHYsIDMpOworICAvLyBDSEVDSzogc3FyZG11bGgge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCit9CisKK2ludDMyeDRfdCB0ZXN0X3ZxcmRtdWxocV9sYW5lcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcmRtdWxocV9sYW5lcV9zMzIKKyAgcmV0dXJuIHZxcmRtdWxocV9sYW5lcV9zMzIoYSwgdiwgMyk7CisgIC8vIENIRUNLOiBzcXJkbXVsaCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbM10KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi0zdi5jIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi0zdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTE2OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLTN2LmMKQEAgLTAsMCArMSw0ODkgQEAKKy8vIFJFUVVJUkVTOiBhYXJjaDY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogYXJtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFhcmNoNjQtbm9uZS1saW51eC1nbnUgLXRhcmdldC1mZWF0dXJlICtuZW9uIFwKKy8vIFJVTjogICAtUyAtTzMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtbm9uZS1saW51eC1nbnUgLVMgLU8zIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKworLy8gVGVzdCBuZXcgYWFyY2g2NCBpbnRyaW5zaWNzIGFuZCB0eXBlcworCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworaW50OHg4X3QgdGVzdF92YW5kX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFuZF9zOAorICByZXR1cm4gdmFuZF9zOChhLCBiKTsKKyAgLy8gQ0hFQ0s6IGFuZCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK2ludDh4MTZfdCB0ZXN0X3ZhbmRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YW5kcV9zOAorICByZXR1cm4gdmFuZHFfczgoYSwgYik7CisgIC8vIENIRUNLOiBhbmQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCitpbnQxNng0X3QgdGVzdF92YW5kX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFuZF9zMTYKKyAgcmV0dXJuIHZhbmRfczE2KGEsIGIpOworICAvLyBDSEVDSzogYW5kIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKworaW50MTZ4OF90IHRlc3RfdmFuZHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YW5kcV9zMTYKKyAgcmV0dXJuIHZhbmRxX3MxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGFuZCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK2ludDMyeDJfdCB0ZXN0X3ZhbmRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YW5kX3MzMgorICByZXR1cm4gdmFuZF9zMzIoYSwgYik7CisgIC8vIENIRUNLOiBhbmQge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCitpbnQzMng0X3QgdGVzdF92YW5kcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhbmRxX3MzMgorICByZXR1cm4gdmFuZHFfczMyKGEsIGIpOworICAvLyBDSEVDSzogYW5kIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKworaW50NjR4MV90IHRlc3RfdmFuZF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhbmRfczY0CisgIHJldHVybiB2YW5kX3M2NChhLCBiKTsKKyAgLy8gQ0hFQ0s6IGFuZCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK2ludDY0eDJfdCB0ZXN0X3ZhbmRxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFuZHFfczY0CisgIHJldHVybiB2YW5kcV9zNjQoYSwgYik7CisgIC8vIENIRUNLOiBhbmQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCit1aW50OHg4X3QgdGVzdF92YW5kX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YW5kX3U4CisgIHJldHVybiB2YW5kX3U4KGEsIGIpOworICAvLyBDSEVDSzogYW5kIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKwordWludDh4MTZfdCB0ZXN0X3ZhbmRxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhbmRxX3U4CisgIHJldHVybiB2YW5kcV91OChhLCBiKTsKKyAgLy8gQ0hFQ0s6IGFuZCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK3VpbnQxNng0X3QgdGVzdF92YW5kX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YW5kX3UxNgorICByZXR1cm4gdmFuZF91MTYoYSwgYik7CisgIC8vIENIRUNLOiBhbmQge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCit1aW50MTZ4OF90IHRlc3RfdmFuZHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhbmRxX3UxNgorICByZXR1cm4gdmFuZHFfdTE2KGEsIGIpOworICAvLyBDSEVDSzogYW5kIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKwordWludDMyeDJfdCB0ZXN0X3ZhbmRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhbmRfdTMyCisgIHJldHVybiB2YW5kX3UzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGFuZCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK3VpbnQzMng0X3QgdGVzdF92YW5kcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFuZHFfdTMyCisgIHJldHVybiB2YW5kcV91MzIoYSwgYik7CisgIC8vIENIRUNLOiBhbmQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCit1aW50NjR4MV90IHRlc3RfdmFuZF91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFuZF91NjQKKyAgcmV0dXJuIHZhbmRfdTY0KGEsIGIpOworICAvLyBDSEVDSzogYW5kIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKwordWludDY0eDJfdCB0ZXN0X3ZhbmRxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YW5kcV91NjQKKyAgcmV0dXJuIHZhbmRxX3U2NChhLCBiKTsKKyAgLy8gQ0hFQ0s6IGFuZCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK2ludDh4OF90IHRlc3Rfdm9ycl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZvcnJfczgKKyAgcmV0dXJuIHZvcnJfczgoYSwgYik7CisgIC8vIENIRUNLOiBvcnIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCitpbnQ4eDE2X3QgdGVzdF92b3JycV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ycnFfczgKKyAgcmV0dXJuIHZvcnJxX3M4KGEsIGIpOworICAvLyBDSEVDSzogb3JyIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKworaW50MTZ4NF90IHRlc3Rfdm9ycl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZvcnJfczE2CisgIHJldHVybiB2b3JyX3MxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IG9yciB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK2ludDE2eDhfdCB0ZXN0X3ZvcnJxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ycnFfczE2CisgIHJldHVybiB2b3JycV9zMTYoYSwgYik7CisgIC8vIENIRUNLOiBvcnIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCitpbnQzMngyX3QgdGVzdF92b3JyX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ycl9zMzIKKyAgcmV0dXJuIHZvcnJfczMyKGEsIGIpOworICAvLyBDSEVDSzogb3JyIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKworaW50MzJ4NF90IHRlc3Rfdm9ycnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92b3JycV9zMzIKKyAgcmV0dXJuIHZvcnJxX3MzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IG9yciB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK2ludDY0eDFfdCB0ZXN0X3ZvcnJfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92b3JyX3M2NAorICByZXR1cm4gdm9ycl9zNjQoYSwgYik7CisgIC8vIENIRUNLOiBvcnIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCitpbnQ2NHgyX3QgdGVzdF92b3JycV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZvcnJxX3M2NAorICByZXR1cm4gdm9ycnFfczY0KGEsIGIpOworICAvLyBDSEVDSzogb3JyIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKwordWludDh4OF90IHRlc3Rfdm9ycl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ycl91OAorICByZXR1cm4gdm9ycl91OChhLCBiKTsKKyAgLy8gQ0hFQ0s6IG9yciB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK3VpbnQ4eDE2X3QgdGVzdF92b3JycV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92b3JycV91OAorICByZXR1cm4gdm9ycnFfdTgoYSwgYik7CisgIC8vIENIRUNLOiBvcnIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCit1aW50MTZ4NF90IHRlc3Rfdm9ycl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ycl91MTYKKyAgcmV0dXJuIHZvcnJfdTE2KGEsIGIpOworICAvLyBDSEVDSzogb3JyIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKwordWludDE2eDhfdCB0ZXN0X3ZvcnJxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92b3JycV91MTYKKyAgcmV0dXJuIHZvcnJxX3UxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IG9yciB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK3VpbnQzMngyX3QgdGVzdF92b3JyX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92b3JyX3UzMgorICByZXR1cm4gdm9ycl91MzIoYSwgYik7CisgIC8vIENIRUNLOiBvcnIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCit1aW50MzJ4NF90IHRlc3Rfdm9ycnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZvcnJxX3UzMgorICByZXR1cm4gdm9ycnFfdTMyKGEsIGIpOworICAvLyBDSEVDSzogb3JyIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKwordWludDY0eDFfdCB0ZXN0X3ZvcnJfdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZvcnJfdTY0CisgIHJldHVybiB2b3JyX3U2NChhLCBiKTsKKyAgLy8gQ0hFQ0s6IG9yciB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK3VpbnQ2NHgyX3QgdGVzdF92b3JycV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ycnFfdTY0CisgIHJldHVybiB2b3JycV91NjQoYSwgYik7CisgIC8vIENIRUNLOiBvcnIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCitpbnQ4eDhfdCB0ZXN0X3Zlb3JfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZW9yX3M4CisgIHJldHVybiB2ZW9yX3M4KGEsIGIpOworICAvLyBDSEVDSzogZW9yIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKworaW50OHgxNl90IHRlc3RfdmVvcnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zlb3JxX3M4CisgIHJldHVybiB2ZW9ycV9zOChhLCBiKTsKKyAgLy8gQ0hFQ0s6IGVvciB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK2ludDE2eDRfdCB0ZXN0X3Zlb3JfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZW9yX3MxNgorICByZXR1cm4gdmVvcl9zMTYoYSwgYik7CisgIC8vIENIRUNLOiBlb3Ige3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCitpbnQxNng4X3QgdGVzdF92ZW9ycV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zlb3JxX3MxNgorICByZXR1cm4gdmVvcnFfczE2KGEsIGIpOworICAvLyBDSEVDSzogZW9yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKworaW50MzJ4Ml90IHRlc3RfdmVvcl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zlb3JfczMyCisgIHJldHVybiB2ZW9yX3MzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGVvciB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK2ludDMyeDRfdCB0ZXN0X3Zlb3JxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmVvcnFfczMyCisgIHJldHVybiB2ZW9ycV9zMzIoYSwgYik7CisgIC8vIENIRUNLOiBlb3Ige3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCitpbnQ2NHgxX3QgdGVzdF92ZW9yX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmVvcl9zNjQKKyAgcmV0dXJuIHZlb3JfczY0KGEsIGIpOworICAvLyBDSEVDSzogZW9yIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKworaW50NjR4Ml90IHRlc3RfdmVvcnFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZW9ycV9zNjQKKyAgcmV0dXJuIHZlb3JxX3M2NChhLCBiKTsKKyAgLy8gQ0hFQ0s6IGVvciB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK3VpbnQ4eDhfdCB0ZXN0X3Zlb3JfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zlb3JfdTgKKyAgcmV0dXJuIHZlb3JfdTgoYSwgYik7CisgIC8vIENIRUNLOiBlb3Ige3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCit1aW50OHgxNl90IHRlc3RfdmVvcnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmVvcnFfdTgKKyAgcmV0dXJuIHZlb3JxX3U4KGEsIGIpOworICAvLyBDSEVDSzogZW9yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKwordWludDE2eDRfdCB0ZXN0X3Zlb3JfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zlb3JfdTE2CisgIHJldHVybiB2ZW9yX3UxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGVvciB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK3VpbnQxNng4X3QgdGVzdF92ZW9ycV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmVvcnFfdTE2CisgIHJldHVybiB2ZW9ycV91MTYoYSwgYik7CisgIC8vIENIRUNLOiBlb3Ige3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCit1aW50MzJ4Ml90IHRlc3RfdmVvcl91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmVvcl91MzIKKyAgcmV0dXJuIHZlb3JfdTMyKGEsIGIpOworICAvLyBDSEVDSzogZW9yIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKwordWludDMyeDRfdCB0ZXN0X3Zlb3JxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZW9ycV91MzIKKyAgcmV0dXJuIHZlb3JxX3UzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGVvciB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK3VpbnQ2NHgxX3QgdGVzdF92ZW9yX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZW9yX3U2NAorICByZXR1cm4gdmVvcl91NjQoYSwgYik7CisgIC8vIENIRUNLOiBlb3Ige3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCit1aW50NjR4Ml90IHRlc3RfdmVvcnFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zlb3JxX3U2NAorICByZXR1cm4gdmVvcnFfdTY0KGEsIGIpOworICAvLyBDSEVDSzogZW9yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKworaW50OHg4X3QgdGVzdF92YmljX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJpY19zOAorICByZXR1cm4gdmJpY19zOChhLCBiKTsKKyAgLy8gQ0hFQ0s6IGJpYyB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK2ludDh4MTZfdCB0ZXN0X3ZiaWNxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YmljcV9zOAorICByZXR1cm4gdmJpY3FfczgoYSwgYik7CisgIC8vIENIRUNLOiBiaWMge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCitpbnQxNng0X3QgdGVzdF92YmljX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJpY19zMTYKKyAgcmV0dXJuIHZiaWNfczE2KGEsIGIpOworICAvLyBDSEVDSzogYmljIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKworaW50MTZ4OF90IHRlc3RfdmJpY3FfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YmljcV9zMTYKKyAgcmV0dXJuIHZiaWNxX3MxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGJpYyB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK2ludDMyeDJfdCB0ZXN0X3ZiaWNfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YmljX3MzMgorICByZXR1cm4gdmJpY19zMzIoYSwgYik7CisgIC8vIENIRUNLOiBiaWMge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCitpbnQzMng0X3QgdGVzdF92YmljcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZiaWNxX3MzMgorICByZXR1cm4gdmJpY3FfczMyKGEsIGIpOworICAvLyBDSEVDSzogYmljIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKworaW50NjR4MV90IHRlc3RfdmJpY19zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZiaWNfczY0CisgIHJldHVybiB2YmljX3M2NChhLCBiKTsKKyAgLy8gQ0hFQ0s6IGJpYyB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK2ludDY0eDJfdCB0ZXN0X3ZiaWNxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJpY3FfczY0CisgIHJldHVybiB2YmljcV9zNjQoYSwgYik7CisgIC8vIENIRUNLOiBiaWMge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCit1aW50OHg4X3QgdGVzdF92YmljX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YmljX3U4CisgIHJldHVybiB2YmljX3U4KGEsIGIpOworICAvLyBDSEVDSzogYmljIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKwordWludDh4MTZfdCB0ZXN0X3ZiaWNxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZiaWNxX3U4CisgIHJldHVybiB2YmljcV91OChhLCBiKTsKKyAgLy8gQ0hFQ0s6IGJpYyB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK3VpbnQxNng0X3QgdGVzdF92YmljX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YmljX3UxNgorICByZXR1cm4gdmJpY191MTYoYSwgYik7CisgIC8vIENIRUNLOiBiaWMge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCit1aW50MTZ4OF90IHRlc3RfdmJpY3FfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZiaWNxX3UxNgorICByZXR1cm4gdmJpY3FfdTE2KGEsIGIpOworICAvLyBDSEVDSzogYmljIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKwordWludDMyeDJfdCB0ZXN0X3ZiaWNfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZiaWNfdTMyCisgIHJldHVybiB2YmljX3UzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGJpYyB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK3VpbnQzMng0X3QgdGVzdF92YmljcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJpY3FfdTMyCisgIHJldHVybiB2YmljcV91MzIoYSwgYik7CisgIC8vIENIRUNLOiBiaWMge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCit1aW50NjR4MV90IHRlc3RfdmJpY191NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJpY191NjQKKyAgcmV0dXJuIHZiaWNfdTY0KGEsIGIpOworICAvLyBDSEVDSzogYmljIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKwordWludDY0eDJfdCB0ZXN0X3ZiaWNxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YmljcV91NjQKKyAgcmV0dXJuIHZiaWNxX3U2NChhLCBiKTsKKyAgLy8gQ0hFQ0s6IGJpYyB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK2ludDh4OF90IHRlc3Rfdm9ybl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zvcm5fczgKKyAgcmV0dXJuIHZvcm5fczgoYSwgYik7CisgIC8vIENIRUNLOiBvcm4ge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCitpbnQ4eDE2X3QgdGVzdF92b3JucV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ybnFfczgKKyAgcmV0dXJuIHZvcm5xX3M4KGEsIGIpOworICAvLyBDSEVDSzogb3JuIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKworaW50MTZ4NF90IHRlc3Rfdm9ybl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zvcm5fczE2CisgIHJldHVybiB2b3JuX3MxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IG9ybiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK2ludDE2eDhfdCB0ZXN0X3Zvcm5xX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ybnFfczE2CisgIHJldHVybiB2b3JucV9zMTYoYSwgYik7CisgIC8vIENIRUNLOiBvcm4ge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCitpbnQzMngyX3QgdGVzdF92b3JuX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ybl9zMzIKKyAgcmV0dXJuIHZvcm5fczMyKGEsIGIpOworICAvLyBDSEVDSzogb3JuIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKworaW50MzJ4NF90IHRlc3Rfdm9ybnFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92b3JucV9zMzIKKyAgcmV0dXJuIHZvcm5xX3MzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IG9ybiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK2ludDY0eDFfdCB0ZXN0X3Zvcm5fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92b3JuX3M2NAorICByZXR1cm4gdm9ybl9zNjQoYSwgYik7CisgIC8vIENIRUNLOiBvcm4ge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCitpbnQ2NHgyX3QgdGVzdF92b3JucV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zvcm5xX3M2NAorICByZXR1cm4gdm9ybnFfczY0KGEsIGIpOworICAvLyBDSEVDSzogb3JuIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKwordWludDh4OF90IHRlc3Rfdm9ybl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ybl91OAorICByZXR1cm4gdm9ybl91OChhLCBiKTsKKyAgLy8gQ0hFQ0s6IG9ybiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK3VpbnQ4eDE2X3QgdGVzdF92b3JucV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92b3JucV91OAorICByZXR1cm4gdm9ybnFfdTgoYSwgYik7CisgIC8vIENIRUNLOiBvcm4ge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQorCit1aW50MTZ4NF90IHRlc3Rfdm9ybl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ybl91MTYKKyAgcmV0dXJuIHZvcm5fdTE2KGEsIGIpOworICAvLyBDSEVDSzogb3JuIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKwordWludDE2eDhfdCB0ZXN0X3Zvcm5xX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92b3JucV91MTYKKyAgcmV0dXJuIHZvcm5xX3UxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IG9ybiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK3VpbnQzMngyX3QgdGVzdF92b3JuX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92b3JuX3UzMgorICByZXR1cm4gdm9ybl91MzIoYSwgYik7CisgIC8vIENIRUNLOiBvcm4ge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgorfQorCit1aW50MzJ4NF90IHRlc3Rfdm9ybnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zvcm5xX3UzMgorICByZXR1cm4gdm9ybnFfdTMyKGEsIGIpOworICAvLyBDSEVDSzogb3JuIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKK30KKwordWludDY0eDFfdCB0ZXN0X3Zvcm5fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zvcm5fdTY0CisgIHJldHVybiB2b3JuX3U2NChhLCBiKTsKKyAgLy8gQ0hFQ0s6IG9ybiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCit9CisKK3VpbnQ2NHgyX3QgdGVzdF92b3JucV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm9ybnFfdTY0CisgIHJldHVybiB2b3JucV91NjQoYSwgYik7CisgIC8vIENIRUNLOiBvcm4ge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1hY3Jvc3MuYyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tYWNyb3NzLmMKaW5kZXggMjU3YjgzOS4uMTdhYzNlZiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1hY3Jvc3MuYworKysgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWFjcm9zcy5jCkBAIC0xLDI3MSArMSwyNzQgQEAKIC8vIFJFUVVJUkVTOiBhYXJjaDY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogYXJtNjQtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFhcmNoNjQtbm9uZS1saW51eC1nbnUgLXRhcmdldC1mZWF0dXJlICtuZW9uIFwKIC8vIFJVTjogICAtZmZwLWNvbnRyYWN0PWZhc3QgLVMgLU8zIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LW5vbmUtbGludXgtZ251IFwKKy8vIFJVTjogICAtZmZwLWNvbnRyYWN0PWZhc3QgLVMgLU8zIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAogLy8gVGVzdCBuZXcgYWFyY2g2NCBpbnRyaW5zaWNzIGFuZCB0eXBlcwogCiAjaW5jbHVkZSA8YXJtX25lb24uaD4KIAogaW50MTZfdCB0ZXN0X3ZhZGRsdl9zOChpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRsdl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkbHZfczgKICAgcmV0dXJuIHZhZGRsdl9zOChhKTsKICAgLy8gQ0hFQ0s6IHNhZGRsdiB7e2hbMC05XSt9fSwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MzJfdCB0ZXN0X3ZhZGRsdl9zMTYoaW50MTZ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZGx2X3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkbHZfczE2CiAgIHJldHVybiB2YWRkbHZfczE2KGEpOwogICAvLyBDSEVDSzogc2FkZGx2IHt7c1swLTldK319LCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50MTZfdCB0ZXN0X3ZhZGRsdl91OCh1aW50OHg4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92YWRkbHZfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGx2X3U4CiAgIHJldHVybiB2YWRkbHZfdTgoYSk7CiAgIC8vIENIRUNLOiB1YWRkbHYge3toWzAtOV0rfX0sIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQzMl90IHRlc3RfdmFkZGx2X3UxNih1aW50MTZ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZGx2X3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkbHZfdTE2CiAgIHJldHVybiB2YWRkbHZfdTE2KGEpOwogICAvLyBDSEVDSzogdWFkZGx2IHt7c1swLTldK319LCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQxNl90IHRlc3RfdmFkZGx2cV9zOChpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92YWRkbHZxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRsdnFfczgKICAgcmV0dXJuIHZhZGRsdnFfczgoYSk7CiAgIC8vIENIRUNLOiBzYWRkbHYge3toWzAtOV0rfX0sIHt7dlswLTldK319LjE2YgogfQogCiBpbnQzMl90IHRlc3RfdmFkZGx2cV9zMTYoaW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZGx2cV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGx2cV9zMTYKICAgcmV0dXJuIHZhZGRsdnFfczE2KGEpOwogICAvLyBDSEVDSzogc2FkZGx2IHt7c1swLTldK319LCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQ2NF90IHRlc3RfdmFkZGx2cV9zMzIoaW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZGx2cV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGx2cV9zMzIKICAgcmV0dXJuIHZhZGRsdnFfczMyKGEpOwogICAvLyBDSEVDSzogc2FkZGx2IHt7ZFswLTldK319LCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50MTZfdCB0ZXN0X3ZhZGRsdnFfdTgodWludDh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRsdnFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGx2cV91OAogICByZXR1cm4gdmFkZGx2cV91OChhKTsKICAgLy8gQ0hFQ0s6IHVhZGRsdiB7e2hbMC05XSt9fSwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQzMl90IHRlc3RfdmFkZGx2cV91MTYodWludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRsdnFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRsdnFfdTE2CiAgIHJldHVybiB2YWRkbHZxX3UxNihhKTsKICAgLy8gQ0hFQ0s6IHVhZGRsdiB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDY0X3QgdGVzdF92YWRkbHZxX3UzMih1aW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZGx2cV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGx2cV91MzIKICAgcmV0dXJuIHZhZGRsdnFfdTMyKGEpOwogICAvLyBDSEVDSzogdWFkZGx2IHt7ZFswLTldK319LCB7e3ZbMC05XSt9fS40cwogfQogCiBpbnQ4X3QgdGVzdF92bWF4dl9zOChpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtYXh2X3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtYXh2X3M4CiAgIHJldHVybiB2bWF4dl9zOChhKTsKICAgLy8gQ0hFQ0s6IHNtYXh2IHt7YlswLTldK319LCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQxNl90IHRlc3Rfdm1heHZfczE2KGludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtYXh2X3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4dl9zMTYKICAgcmV0dXJuIHZtYXh2X3MxNihhKTsKICAgLy8gQ0hFQ0s6IHNtYXh2IHt7aFswLTldK319LCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50OF90IHRlc3Rfdm1heHZfdTgodWludDh4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1heHZfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heHZfdTgKICAgcmV0dXJuIHZtYXh2X3U4KGEpOwogICAvLyBDSEVDSzogdW1heHYge3tiWzAtOV0rfX0sIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQxNl90IHRlc3Rfdm1heHZfdTE2KHVpbnQxNng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bWF4dl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heHZfdTE2CiAgIHJldHVybiB2bWF4dl91MTYoYSk7CiAgIC8vIENIRUNLOiB1bWF4diB7e2hbMC05XSt9fSwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50OF90IHRlc3Rfdm1heHZxX3M4KGludDh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtYXh2cV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4dnFfczgKICAgcmV0dXJuIHZtYXh2cV9zOChhKTsKICAgLy8gQ0hFQ0s6IHNtYXh2IHt7YlswLTldK319LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZfdCB0ZXN0X3ZtYXh2cV9zMTYoaW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1heHZxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4dnFfczE2CiAgIHJldHVybiB2bWF4dnFfczE2KGEpOwogICAvLyBDSEVDSzogc21heHYge3toWzAtOV0rfX0sIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyX3QgdGVzdF92bWF4dnFfczMyKGludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtYXh2cV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heHZxX3MzMgogICByZXR1cm4gdm1heHZxX3MzMihhKTsKICAgLy8gQ0hFQ0s6IHNtYXh2IHt7c1swLTldK319LCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50OF90IHRlc3Rfdm1heHZxX3U4KHVpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bWF4dnFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heHZxX3U4CiAgIHJldHVybiB2bWF4dnFfdTgoYSk7CiAgIC8vIENIRUNLOiB1bWF4diB7e2JbMC05XSt9fSwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNl90IHRlc3Rfdm1heHZxX3UxNih1aW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1heHZxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4dnFfdTE2CiAgIHJldHVybiB2bWF4dnFfdTE2KGEpOwogICAvLyBDSEVDSzogdW1heHYge3toWzAtOV0rfX0sIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQzMl90IHRlc3Rfdm1heHZxX3UzMih1aW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1heHZxX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4dnFfdTMyCiAgIHJldHVybiB2bWF4dnFfdTMyKGEpOwogICAvLyBDSEVDSzogdW1heHYge3tzWzAtOV0rfX0sIHt7dlswLTldK319LjRzCiB9CiAKIGludDhfdCB0ZXN0X3ZtaW52X3M4KGludDh4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1pbnZfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1pbnZfczgKICAgcmV0dXJuIHZtaW52X3M4KGEpOwogICAvLyBDSEVDSzogc21pbnYge3tiWzAtOV0rfX0sIHt7dlswLTldK319LjhiCiB9CiAKIGludDE2X3QgdGVzdF92bWludl9zMTYoaW50MTZ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1pbnZfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtaW52X3MxNgogICByZXR1cm4gdm1pbnZfczE2KGEpOwogICAvLyBDSEVDSzogc21pbnYge3toWzAtOV0rfX0sIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQ4X3QgdGVzdF92bWludl91OCh1aW50OHg4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bWludl91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWludl91OAogICByZXR1cm4gdm1pbnZfdTgoYSk7CiAgIC8vIENIRUNLOiB1bWludiB7e2JbMC05XSt9fSwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDE2X3QgdGVzdF92bWludl91MTYodWludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtaW52X3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWludl91MTYKICAgcmV0dXJuIHZtaW52X3UxNihhKTsKICAgLy8gQ0hFQ0s6IHVtaW52IHt7aFswLTldK319LCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQ4X3QgdGVzdF92bWludnFfczgoaW50OHgxNl90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1pbnZxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtaW52cV9zOAogICByZXR1cm4gdm1pbnZxX3M4KGEpOwogICAvLyBDSEVDSzogc21pbnYge3tiWzAtOV0rfX0sIHt7dlswLTldK319LjE2YgogfQogCiBpbnQxNl90IHRlc3Rfdm1pbnZxX3MxNihpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bWludnFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtaW52cV9zMTYKICAgcmV0dXJuIHZtaW52cV9zMTYoYSk7CiAgIC8vIENIRUNLOiBzbWludiB7e2hbMC05XSt9fSwge3t2WzAtOV0rfX0uOGgKIH0KIAogaW50MzJfdCB0ZXN0X3ZtaW52cV9zMzIoaW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1pbnZxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWludnFfczMyCiAgIHJldHVybiB2bWludnFfczMyKGEpOwogICAvLyBDSEVDSzogc21pbnYge3tzWzAtOV0rfX0sIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ4X3QgdGVzdF92bWludnFfdTgodWludDh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtaW52cV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWludnFfdTgKICAgcmV0dXJuIHZtaW52cV91OChhKTsKICAgLy8gQ0hFQ0s6IHVtaW52IHt7YlswLTldK319LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2X3QgdGVzdF92bWludnFfdTE2KHVpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bWludnFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtaW52cV91MTYKICAgcmV0dXJuIHZtaW52cV91MTYoYSk7CiAgIC8vIENIRUNLOiB1bWludiB7e2hbMC05XSt9fSwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyX3QgdGVzdF92bWludnFfdTMyKHVpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bWludnFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtaW52cV91MzIKICAgcmV0dXJuIHZtaW52cV91MzIoYSk7CiAgIC8vIENIRUNLOiB1bWludiB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50OF90IHRlc3RfdmFkZHZfczgoaW50OHg4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92YWRkdl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkdl9zOAogICByZXR1cm4gdmFkZHZfczgoYSk7CiAgIC8vIENIRUNLOiBhZGR2IHt7YlswLTldK319LCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQxNl90IHRlc3RfdmFkZHZfczE2KGludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGR2X3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkdl9zMTYKICAgcmV0dXJuIHZhZGR2X3MxNihhKTsKICAgLy8gQ0hFQ0s6IGFkZHYge3toWzAtOV0rfX0sIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQ4X3QgdGVzdF92YWRkdl91OCh1aW50OHg4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92YWRkdl91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkdl91OAogICByZXR1cm4gdmFkZHZfdTgoYSk7CiAgIC8vIENIRUNLOiBhZGR2IHt7YlswLTldK319LCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZfdCB0ZXN0X3ZhZGR2X3UxNih1aW50MTZ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZHZfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGR2X3UxNgogICByZXR1cm4gdmFkZHZfdTE2KGEpOwogICAvLyBDSEVDSzogYWRkdiB7e2hbMC05XSt9fSwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50OF90IHRlc3RfdmFkZHZxX3M4KGludDh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGR2cV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkdnFfczgKICAgcmV0dXJuIHZhZGR2cV9zOChhKTsKICAgLy8gQ0hFQ0s6IGFkZHYge3tiWzAtOV0rfX0sIHt7dlswLTldK319LjE2YgogfQogCiBpbnQxNl90IHRlc3RfdmFkZHZxX3MxNihpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92YWRkdnFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGR2cV9zMTYKICAgcmV0dXJuIHZhZGR2cV9zMTYoYSk7CiAgIC8vIENIRUNLOiBhZGR2IHt7aFswLTldK319LCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQzMl90IHRlc3RfdmFkZHZxX3MzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92YWRkdnFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGR2cV9zMzIKICAgcmV0dXJuIHZhZGR2cV9zMzIoYSk7CiAgIC8vIENIRUNLOiBhZGR2IHt7c1swLTldK319LCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50OF90IHRlc3RfdmFkZHZxX3U4KHVpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92YWRkdnFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZHZxX3U4CiAgIHJldHVybiB2YWRkdnFfdTgoYSk7CiAgIC8vIENIRUNLOiBhZGR2IHt7YlswLTldK319LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2X3QgdGVzdF92YWRkdnFfdTE2KHVpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92YWRkdnFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGR2cV91MTYKICAgcmV0dXJuIHZhZGR2cV91MTYoYSk7CiAgIC8vIENIRUNLOiBhZGR2IHt7aFswLTldK319LCB7e3ZbMC05XSt9fS44aAogfQogCiB1aW50MzJfdCB0ZXN0X3ZhZGR2cV91MzIodWludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGR2cV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZHZxX3UzMgogICByZXR1cm4gdmFkZHZxX3UzMihhKTsKICAgLy8gQ0hFQ0s6IGFkZHYge3tzWzAtOV0rfX0sIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0MzJfdCB0ZXN0X3ZtYXh2cV9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bWF4dnFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtYXh2cV9mMzIKICAgcmV0dXJuIHZtYXh2cV9mMzIoYSk7CiAgIC8vIENIRUNLOiBmbWF4diB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQzMl90IHRlc3Rfdm1pbnZxX2YzMihmbG9hdDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtaW52cV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1pbnZxX2YzMgogICByZXR1cm4gdm1pbnZxX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZtaW52IHt7c1swLTldK319LCB7e3ZbMC05XSt9fS40cwogfQogCiBmbG9hdDMyX3QgdGVzdF92bWF4bm12cV9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bWF4bm12cV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heG5tdnFfZjMyCiAgIHJldHVybiB2bWF4bm12cV9mMzIoYSk7CiAgIC8vIENIRUNLOiBmbWF4bm12IHt7c1swLTldK319LCB7e3ZbMC05XSt9fS40cwogfQogCiBmbG9hdDMyX3QgdGVzdF92bWlubm12cV9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bWlubm12cV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1pbm5tdnFfZjMyCiAgIHJldHVybiB2bWlubm12cV9mMzIoYSk7CiAgIC8vIENIRUNLOiBmbWlubm12IHt7c1swLTldK319LCB7e3ZbMC05XSt9fS40cwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1jb3B5LmMgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWNvcHkuYwppbmRleCBlYjkxYmY5Li5mOGIzZDkwIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWNvcHkuYworKysgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWNvcHkuYwpAQCAtNywxMzEzICs3LDE0MTAgQEAKICNpbmNsdWRlIDxhcm1fbmVvbi5oPgogCiB1aW50OHg4X3QgdGVzdF92c2V0X2xhbmVfdTgodWludDhfdCB2MSwgdWludDh4OF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0X2xhbmVfdTgKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzZXRfbGFuZV91OAogICByZXR1cm4gdnNldF9sYW5lX3U4KHYxLCB2MiwgNik7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uYls2XSwge3t3WzAtOV0rfX0KIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZzZXRfbGFuZV91MTYodWludDE2X3QgdjEsIHVpbnQxNng0X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZzZXRfbGFuZV91MTYKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzZXRfbGFuZV91MTYKICAgcmV0dXJuIHZzZXRfbGFuZV91MTYodjEsIHYyLCAyKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5oWzJdLCB7e3dbMC05XSt9fQogfQogCiB1aW50MzJ4Ml90IHRlc3RfdnNldF9sYW5lX3UzMih1aW50MzJfdCB2MSwgdWludDMyeDJfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnNldF9sYW5lX3UzMgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNldF9sYW5lX3UzMgogICByZXR1cm4gdnNldF9sYW5lX3UzMih2MSwgdjIsIDEpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LnNbMV0sIHt7d1swLTldK319CiB9CiB1aW50NjR4MV90IHRlc3RfdnNldF9sYW5lX3U2NCh1aW50NjRfdCB2MSwgdWludDY0eDFfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnNldF9sYW5lX3U2NAorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNldF9sYW5lX3U2NAogICByZXR1cm4gdnNldF9sYW5lX3U2NCh2MSwgdjIsIDApOwogICAvLyBDSEVDSzogZm1vdiB7e2RbMC05XSt9fSwge3t4WzAtOV0rfX0KIH0KIAogaW50OHg4X3QgdGVzdF92c2V0X2xhbmVfczgoaW50OF90IHYxLCBpbnQ4eDhfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnNldF9sYW5lX3M4CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0X2xhbmVfczgKICAgcmV0dXJuIHZzZXRfbGFuZV9zOCh2MSwgdjIsIDYpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmJbNl0sIHt7d1swLTldK319CiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZzZXRfbGFuZV9zMTYoaW50MTZfdCB2MSwgaW50MTZ4NF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0X2xhbmVfczE2CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0X2xhbmVfczE2CiAgIHJldHVybiB2c2V0X2xhbmVfczE2KHYxLCB2MiwgMik7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFsyXSwge3t3WzAtOV0rfX0KIH0KIAogaW50MzJ4Ml90IHRlc3RfdnNldF9sYW5lX3MzMihpbnQzMl90IHYxLCBpbnQzMngyX3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZzZXRfbGFuZV9zMzIKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzZXRfbGFuZV9zMzIKICAgcmV0dXJuIHZzZXRfbGFuZV9zMzIodjEsIHYyLCAxKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzFdLCB7e3dbMC05XSt9fQogfQogCiAgIGludDY0eDFfdCB0ZXN0X3ZzZXRfbGFuZV9zNjQoaW50NjRfdCB2MSwgaW50NjR4MV90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0X2xhbmVfczY0CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0X2xhbmVfczY0CiAgIHJldHVybiB2c2V0X2xhbmVfczY0KHYxLCB2MiwgMCk7CiAgIC8vIENIRUNLOiBmbW92IHt7ZFswLTldK319LCB7e3hbMC05XSt9fQogfQogCiB1aW50OHgxNl90IHRlc3RfdnNldHFfbGFuZV91OCh1aW50OF90IHYxLCB1aW50OHgxNl90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0cV9sYW5lX3U4CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0cV9sYW5lX3U4CiAgIHJldHVybiB2c2V0cV9sYW5lX3U4KHYxLCB2MiwgNik7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uYls2XSwge3t3WzAtOV0rfX0KIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZzZXRxX2xhbmVfdTE2KHVpbnQxNl90IHYxLCB1aW50MTZ4OF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0cV9sYW5lX3UxNgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNldHFfbGFuZV91MTYKICAgcmV0dXJuIHZzZXRxX2xhbmVfdTE2KHYxLCB2MiwgMik7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFsyXSwge3t3WzAtOV0rfX0KIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZzZXRxX2xhbmVfdTMyKHVpbnQzMl90IHYxLCB1aW50MzJ4NF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0cV9sYW5lX3UzMgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNldHFfbGFuZV91MzIKICAgcmV0dXJuIHZzZXRxX2xhbmVfdTMyKHYxLCB2MiwgMSk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t3WzAtOV0rfX0KIH0KIAogICB1aW50NjR4Ml90IHRlc3RfdnNldHFfbGFuZV91NjQodWludDY0X3QgdjEsIHVpbnQ2NHgyX3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZzZXRxX2xhbmVfdTY0CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0cV9sYW5lX3U2NAogICByZXR1cm4gdnNldHFfbGFuZV91NjQodjEsIHYyLCAxKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3hbMC05XSt9fQogfQogCiBpbnQ4eDE2X3QgdGVzdF92c2V0cV9sYW5lX3M4KGludDhfdCB2MSwgaW50OHgxNl90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0cV9sYW5lX3M4CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0cV9sYW5lX3M4CiAgIHJldHVybiB2c2V0cV9sYW5lX3M4KHYxLCB2MiwgNik7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uYls2XSwge3t3WzAtOV0rfX0KIH0KIAogaW50MTZ4OF90IHRlc3RfdnNldHFfbGFuZV9zMTYoaW50MTZfdCB2MSwgaW50MTZ4OF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0cV9sYW5lX3MxNgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNldHFfbGFuZV9zMTYKICAgcmV0dXJuIHZzZXRxX2xhbmVfczE2KHYxLCB2MiwgMik7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFsyXSwge3t3WzAtOV0rfX0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnNldHFfbGFuZV9zMzIoaW50MzJfdCB2MSwgaW50MzJ4NF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0cV9sYW5lX3MzMgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNldHFfbGFuZV9zMzIKICAgcmV0dXJuIHZzZXRxX2xhbmVfczMyKHYxLCB2MiwgMSk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t3WzAtOV0rfX0KIH0KIAogaW50NjR4Ml90IHRlc3RfdnNldHFfbGFuZV9zNjQoaW50NjRfdCB2MSwgaW50NjR4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0cV9sYW5lX3M2NAorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNldHFfbGFuZV9zNjQKICAgcmV0dXJuIHZzZXRxX2xhbmVfczY0KHYxLCB2MiwgMCk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uZFswXSwge3t4WzAtOV0rfX0KIH0KIAogcG9seTh4OF90IHRlc3RfdnNldF9sYW5lX3A4KHBvbHk4X3QgdjEsIHBvbHk4eDhfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnNldF9sYW5lX3A4CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0X2xhbmVfcDgKICAgcmV0dXJuIHZzZXRfbGFuZV9wOCh2MSwgdjIsIDYpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmJbNl0sIHt7d1swLTldK319CiB9CiAKIHBvbHkxNng0X3QgdGVzdF92c2V0X2xhbmVfcDE2KHBvbHkxNl90IHYxLCBwb2x5MTZ4NF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0X2xhbmVfcDE2CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0X2xhbmVfcDE2CiAgIHJldHVybiB2c2V0X2xhbmVfcDE2KHYxLCB2MiwgMik7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFsyXSwge3t3WzAtOV0rfX0KIH0KIAogcG9seTh4MTZfdCB0ZXN0X3ZzZXRxX2xhbmVfcDgocG9seThfdCB2MSwgcG9seTh4MTZfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnNldHFfbGFuZV9wOAorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNldHFfbGFuZV9wOAogICByZXR1cm4gdnNldHFfbGFuZV9wOCh2MSwgdjIsIDYpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmJbNl0sIHt7d1swLTldK319CiB9CiAKIHBvbHkxNng4X3QgdGVzdF92c2V0cV9sYW5lX3AxNihwb2x5MTZfdCB2MSwgcG9seTE2eDhfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnNldHFfbGFuZV9wMTYKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzZXRxX2xhbmVfcDE2CiAgIHJldHVybiB2c2V0cV9sYW5lX3AxNih2MSwgdjIsIDIpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmhbMl0sIHt7d1swLTldK319CiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdnNldF9sYW5lX2YzMihmbG9hdDMyX3QgdjEsIGZsb2F0MzJ4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0X2xhbmVfZjMyCisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0X2xhbmVfZjMyCiAgIHJldHVybiB2c2V0X2xhbmVfZjMyKHYxLCB2MiwgMSk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t2WzAtOV0rfX0uc1swXQogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZzZXRxX2xhbmVfZjMyKGZsb2F0MzJfdCB2MSwgZmxvYXQzMng0X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZzZXRxX2xhbmVfZjMyCisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0cV9sYW5lX2YzMgogICByZXR1cm4gdnNldHFfbGFuZV9mMzIodjEsIHYyLCAxKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzFdLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0NjR4MV90IHRlc3RfdnNldF9sYW5lX2Y2NChmbG9hdDY0X3QgdjEsIGZsb2F0NjR4MV90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0X2xhbmVfZjY0CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0X2xhbmVfZjY0CiAgIHJldHVybiB2c2V0X2xhbmVfZjY0KHYxLCB2MiwgMCk7CiAgIC8vIENIRUNLOiByZXQKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92c2V0cV9sYW5lX2Y2NChmbG9hdDY0X3QgdjEsIGZsb2F0NjR4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c2V0cV9sYW5lX2Y2NAorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNldHFfbGFuZV9mNjQKICAgcmV0dXJuIHZzZXRxX2xhbmVfZjY0KHYxLCB2MiwgMCk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uZFswXSwge3t2WzAtOV0rfX0uZFswXQogfQogCiB1aW50OF90IHRlc3RfdmdldF9sYW5lX3U4KHVpbnQ4eDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0X2xhbmVfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9sYW5lX3U4CiAgIHJldHVybiB2Z2V0X2xhbmVfdTgodjEsIDcpOwogICAvLyBDSEVDSzogdW1vdiB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uYls3XQogfQogCiB1aW50MTZfdCB0ZXN0X3ZnZXRfbGFuZV91MTYodWludDE2eDRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0X2xhbmVfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfbGFuZV91MTYKICAgcmV0dXJuIHZnZXRfbGFuZV91MTYodjEsIDMpOwogICAvLyBDSEVDSzogdW1vdiB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uaFszXQogfQogCiB1aW50MzJfdCB0ZXN0X3ZnZXRfbGFuZV91MzIodWludDMyeDJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0X2xhbmVfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfbGFuZV91MzIKICAgcmV0dXJuIHZnZXRfbGFuZV91MzIodjEsIDEpOwogICAvLyBDSEVDSzogdW1vdiB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uc1sxXQogfQogCiB1aW50NjRfdCB0ZXN0X3ZnZXRfbGFuZV91NjQodWludDY0eDFfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0X2xhbmVfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfbGFuZV91NjQKICAgcmV0dXJuIHZnZXRfbGFuZV91NjQodjEsIDApOwogICAvLyBDSEVDSzogZm1vdiB7e3hbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDhfdCB0ZXN0X3ZnZXRxX2xhbmVfdTgodWludDh4MTZfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0cV9sYW5lX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRxX2xhbmVfdTgKICAgcmV0dXJuIHZnZXRxX2xhbmVfdTgodjEsIDE1KTsKICAgLy8gQ0hFQ0s6IHVtb3Yge3t3WzAtOV0rfX0sIHt7dlswLTldK319LmJbMTVdCiB9CiAKIHVpbnQxNl90IHRlc3RfdmdldHFfbGFuZV91MTYodWludDE2eDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0cV9sYW5lX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0cV9sYW5lX3UxNgogICByZXR1cm4gdmdldHFfbGFuZV91MTYodjEsIDYpOwogICAvLyBDSEVDSzogdW1vdiB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uaFs2XQogfQogCiB1aW50MzJfdCB0ZXN0X3ZnZXRxX2xhbmVfdTMyKHVpbnQzMng0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmdldHFfbGFuZV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldHFfbGFuZV91MzIKICAgcmV0dXJuIHZnZXRxX2xhbmVfdTMyKHYxLCAyKTsKICAgLy8gQ0hFQ0s6IHVtb3Yge3t3WzAtOV0rfX0sIHt7dlswLTldK319LnNbMl0KIH0KIAogdWludDY0X3QgdGVzdF92Z2V0cV9sYW5lX3U2NCh1aW50NjR4Ml90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZnZXRxX2xhbmVfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRxX2xhbmVfdTY0CiAgIHJldHVybiB2Z2V0cV9sYW5lX3U2NCh2MSwgMSk7CiAgIC8vIENIRUNLOiB1bW92IHt7eFswLTldK319LCB7e3ZbMC05XSt9fS5kWzFdCiB9CiAKIHBvbHk4X3QgdGVzdF92Z2V0X2xhbmVfcDgocG9seTh4OF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZnZXRfbGFuZV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2xhbmVfcDgKICAgcmV0dXJuIHZnZXRfbGFuZV9wOCh2MSwgNyk7CiAgIC8vIENIRUNLOiB1bW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5iWzddCiB9CiAKIHBvbHkxNl90IHRlc3RfdmdldF9sYW5lX3AxNihwb2x5MTZ4NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZnZXRfbGFuZV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9sYW5lX3AxNgogICByZXR1cm4gdmdldF9sYW5lX3AxNih2MSwgMyk7CiAgIC8vIENIRUNLOiB1bW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIHBvbHk4X3QgdGVzdF92Z2V0cV9sYW5lX3A4KHBvbHk4eDE2X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmdldHFfbGFuZV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0cV9sYW5lX3A4CiAgIHJldHVybiB2Z2V0cV9sYW5lX3A4KHYxLCAxNCk7CiAgIC8vIENIRUNLOiB1bW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5iWzE0XQogfQogCiBwb2x5MTZfdCB0ZXN0X3ZnZXRxX2xhbmVfcDE2KHBvbHkxNng4X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmdldHFfbGFuZV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldHFfbGFuZV9wMTYKICAgcmV0dXJuIHZnZXRxX2xhbmVfcDE2KHYxLCA2KTsKICAgLy8gQ0hFQ0s6IHVtb3Yge3t3WzAtOV0rfX0sIHt7dlswLTldK319LmhbNl0KIH0KIAogaW50MzJfdCB0ZXN0X3ZnZXRfbGFuZV9zOChpbnQ4eDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0X2xhbmVfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9sYW5lX3M4CiAgIHJldHVybiB2Z2V0X2xhbmVfczgodjEsIDcpKzE7CiAgIC8vIENIRUNLOiBzbW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5iWzddCiB9CiAKIGludDMyX3QgdGVzdF92Z2V0X2xhbmVfczE2KGludDE2eDRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0X2xhbmVfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfbGFuZV9zMTYKICAgcmV0dXJuIHZnZXRfbGFuZV9zMTYodjEsIDMpKzE7CiAgIC8vIENIRUNLOiBzbW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDY0X3QgdGVzdF92Z2V0X2xhbmVfczMyKGludDMyeDJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0X2xhbmVfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfbGFuZV9zMzIKICAgcmV0dXJuIHZnZXRfbGFuZV9zMzIodjEsIDEpOwogICAvLyBDSEVDSzogc21vdiB7e3hbMC05XSt9fSwge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQ2NF90IHRlc3RfdmdldF9sYW5lX3M2NChpbnQ2NHgxX3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmdldF9sYW5lX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2xhbmVfczY0CiAgIHJldHVybiB2Z2V0X2xhbmVfczY0KHYxLCAwKTsKICAgLy8gQ0hFQ0s6IGZtb3Yge3t4WzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIGludDMyX3QgdGVzdF92Z2V0cV9sYW5lX3M4KGludDh4MTZfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0cV9sYW5lX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRxX2xhbmVfczgKICAgcmV0dXJuIHZnZXRxX2xhbmVfczgodjEsIDE1KSsxOwogICAvLyBDSEVDSzogc21vdiB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uYlsxNV0KIH0KIAogaW50MzJfdCB0ZXN0X3ZnZXRxX2xhbmVfczE2KGludDE2eDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0cV9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0cV9sYW5lX3MxNgogICByZXR1cm4gdmdldHFfbGFuZV9zMTYodjEsIDYpKzE7CiAgIC8vIENIRUNLOiBzbW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5oWzZdCiB9CiAKIGludDY0X3QgdGVzdF92Z2V0cV9sYW5lX3MzMihpbnQzMng0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmdldHFfbGFuZV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldHFfbGFuZV9zMzIKICAgcmV0dXJuIHZnZXRxX2xhbmVfczMyKHYxLCAyKTsKICAgLy8gQ0hFQ0s6IHNtb3Yge3t4WzAtOV0rfX0sIHt7dlswLTldK319LnNbMl0KIH0KIAogaW50NjRfdCB0ZXN0X3ZnZXRxX2xhbmVfczY0KGludDY0eDJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Z2V0cV9sYW5lX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0cV9sYW5lX3M2NAogICByZXR1cm4gdmdldHFfbGFuZV9zNjQodjEsIDEpOwogICAvLyBDSEVDSzogdW1vdiB7e3hbMC05XSt9fSwge3t2WzAtOV0rfX0uZFsxXQogfQogCiBpbnQ4eDhfdCB0ZXN0X3Zjb3B5X2xhbmVfczgoaW50OHg4X3QgdjEsIGludDh4OF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zjb3B5X2xhbmVfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlfbGFuZV9zOAogICByZXR1cm4gdmNvcHlfbGFuZV9zOCh2MSwgNSwgdjIsIDMpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmJbNV0sIHt7dlswLTldK319LmJbM10KIH0KIAogaW50MTZ4NF90IHRlc3RfdmNvcHlfbGFuZV9zMTYoaW50MTZ4NF90IHYxLCBpbnQxNng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlfbGFuZV9zMTYKICAgcmV0dXJuIHZjb3B5X2xhbmVfczE2KHYxLCAyLCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFsyXSwge3t2WzAtOV0rfX0uaFszXQogfQogCiBwb2x5OHg4X3QgdGVzdF92Y29weV9sYW5lX3A4KHBvbHk4eDhfdCB2MSwgcG9seTh4OF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zjb3B5X2xhbmVfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlfbGFuZV9wOAogICByZXR1cm4gdmNvcHlfbGFuZV9wOCh2MSwgNSwgdjIsIDMpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmJbNV0sIHt7dlswLTldK319LmJbM10KIH0KIAogcG9seTE2eDRfdCB0ZXN0X3Zjb3B5X2xhbmVfcDE2KHBvbHkxNng0X3QgdjEsIHBvbHkxNng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlfbGFuZV9wMTYKICAgcmV0dXJuIHZjb3B5X2xhbmVfcDE2KHYxLCAyLCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFsyXSwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQzMngyX3QgdGVzdF92Y29weV9sYW5lX3MzMihpbnQzMngyX3QgdjEsIGludDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weV9sYW5lX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weV9sYW5lX3MzMgogICByZXR1cm4gdmNvcHlfbGFuZV9zMzIodjEsIDAsIHYyLCAxKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzBdLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdmNvcHlfbGFuZV9mMzIoZmxvYXQzMngyX3QgdjEsIGZsb2F0MzJ4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zjb3B5X2xhbmVfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5X2xhbmVfZjMyCiAgIHJldHVybiB2Y29weV9sYW5lX2YzMih2MSwgMCwgdjIsIDEpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LnNbMF0sIHt7dlswLTldK319LnNbMV0KIH0KIAogdWludDh4OF90IHRlc3RfdmNvcHlfbGFuZV91OCh1aW50OHg4X3QgdjEsIHVpbnQ4eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weV9sYW5lX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5X2xhbmVfdTgKICAgcmV0dXJuIHZjb3B5X2xhbmVfdTgodjEsIDUsIHYyLCAzKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5iWzVdLCB7e3ZbMC05XSt9fS5iWzNdCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92Y29weV9sYW5lX3UxNih1aW50MTZ4NF90IHYxLCB1aW50MTZ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zjb3B5X2xhbmVfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5X2xhbmVfdTE2CiAgIHJldHVybiB2Y29weV9sYW5lX3UxNih2MSwgMiwgdjIsIDMpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmhbMl0sIHt7dlswLTldK319LmhbM10KIH0KIAogdWludDMyeDJfdCB0ZXN0X3Zjb3B5X2xhbmVfdTMyKHVpbnQzMngyX3QgdjEsIHVpbnQzMngyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlfbGFuZV91MzIKICAgcmV0dXJuIHZjb3B5X2xhbmVfdTMyKHYxLCAwLCB2MiwgMSk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQ4eDhfdCB0ZXN0X3Zjb3B5X2xhbmVxX3M4KGludDh4OF90IHYxLCBpbnQ4eDE2X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlfbGFuZXFfczgKICAgcmV0dXJuIHZjb3B5X2xhbmVxX3M4KHYxLCA1LCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uYls1XSwge3t2WzAtOV0rfX0uYlszXQogfQogCiBpbnQxNng0X3QgdGVzdF92Y29weV9sYW5lcV9zMTYoaW50MTZ4NF90IHYxLCBpbnQxNng4X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5X2xhbmVxX3MxNgogICByZXR1cm4gdmNvcHlfbGFuZXFfczE2KHYxLCAyLCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFsyXSwge3t2WzAtOV0rfX0uaFszXQogfQogCiBwb2x5OHg4X3QgdGVzdF92Y29weV9sYW5lcV9wOChwb2x5OHg4X3QgdjEsIHBvbHk4eDE2X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlfbGFuZXFfcDgKICAgcmV0dXJuIHZjb3B5X2xhbmVxX3A4KHYxLCA1LCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uYls1XSwge3t2WzAtOV0rfX0uYlszXQogfQogCiBwb2x5MTZ4NF90IHRlc3RfdmNvcHlfbGFuZXFfcDE2KHBvbHkxNng0X3QgdjEsIHBvbHkxNng4X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5X2xhbmVxX3AxNgogICByZXR1cm4gdmNvcHlfbGFuZXFfcDE2KHYxLCAyLCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFsyXSwge3t2WzAtOV0rfX0uaFszXQogfQogCiBpbnQzMngyX3QgdGVzdF92Y29weV9sYW5lcV9zMzIoaW50MzJ4Ml90IHYxLCBpbnQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5X2xhbmVxX3MzMgogICByZXR1cm4gdmNvcHlfbGFuZXFfczMyKHYxLCAwLCB2MiwgMSk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3Zjb3B5X2xhbmVxX2YzMihmbG9hdDMyeDJfdCB2MSwgZmxvYXQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5X2xhbmVxX2YzMgogICByZXR1cm4gdmNvcHlfbGFuZXFfZjMyKHYxLCAwLCB2MiwgMSk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQogfQogCiB1aW50OHg4X3QgdGVzdF92Y29weV9sYW5lcV91OCh1aW50OHg4X3QgdjEsIHVpbnQ4eDE2X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlfbGFuZXFfdTgKICAgcmV0dXJuIHZjb3B5X2xhbmVxX3U4KHYxLCA1LCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uYls1XSwge3t2WzAtOV0rfX0uYlszXQogfQogCiB1aW50MTZ4NF90IHRlc3RfdmNvcHlfbGFuZXFfdTE2KHVpbnQxNng0X3QgdjEsIHVpbnQxNng4X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5X2xhbmVxX3UxNgogICByZXR1cm4gdmNvcHlfbGFuZXFfdTE2KHYxLCAyLCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFsyXSwge3t2WzAtOV0rfX0uaFszXQogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmNvcHlfbGFuZXFfdTMyKHVpbnQzMngyX3QgdjEsIHVpbnQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5X2xhbmVxX3UzMgogICByZXR1cm4gdmNvcHlfbGFuZXFfdTMyKHYxLCAwLCB2MiwgMSk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQ4eDE2X3QgdGVzdF92Y29weXFfbGFuZV9zOChpbnQ4eDE2X3QgdjEsIGludDh4OF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zjb3B5cV9sYW5lX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lX3M4CiAgIHJldHVybiB2Y29weXFfbGFuZV9zOCh2MSwgNSwgdjIsIDMpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmJbNV0sIHt7dlswLTldK319LmJbM10KIH0KIAogaW50MTZ4OF90IHRlc3RfdmNvcHlxX2xhbmVfczE2KGludDE2eDhfdCB2MSwgaW50MTZ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zjb3B5cV9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weXFfbGFuZV9zMTYKICAgcmV0dXJuIHZjb3B5cV9sYW5lX3MxNih2MSwgMiwgdjIsIDMpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmhbMl0sIHt7dlswLTldK319LmhbM10KIH0KIAogcG9seTh4MTZfdCB0ZXN0X3Zjb3B5cV9sYW5lX3A4KHBvbHk4eDE2X3QgdjEsIHBvbHk4eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weXFfbGFuZV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weXFfbGFuZV9wOAogICByZXR1cm4gdmNvcHlxX2xhbmVfcDgodjEsIDUsIHYyLCAzKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5iWzVdLCB7e3ZbMC05XSt9fS5iWzNdCiB9CiAKIHBvbHkxNng4X3QgdGVzdF92Y29weXFfbGFuZV9wMTYocG9seTE2eDhfdCB2MSwgcG9seTE2eDRfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weXFfbGFuZV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVfcDE2CiAgIHJldHVybiB2Y29weXFfbGFuZV9wMTYodjEsIDIsIHYyLCAzKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5oWzJdLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3Zjb3B5cV9sYW5lX3MzMihpbnQzMng0X3QgdjEsIGludDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weXFfbGFuZV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVfczMyCiAgIHJldHVybiB2Y29weXFfbGFuZV9zMzIodjEsIDAsIHYyLCAxKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzBdLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGludDY0eDJfdCB0ZXN0X3Zjb3B5cV9sYW5lX3M2NChpbnQ2NHgyX3QgdjEsIGludDY0eDFfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weXFfbGFuZV9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVfczY0CiAgIHJldHVybiB2Y29weXFfbGFuZV9zNjQodjEsIDEsIHYyLCAwKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdmNvcHlxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IHYxLCBmbG9hdDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weXFfbGFuZV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVfZjMyCiAgIHJldHVybiB2Y29weXFfbGFuZV9mMzIodjEsIDAsIHYyLCAxKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzBdLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdmNvcHlxX2xhbmVfZjY0KGZsb2F0NjR4Ml90IHYxLCBmbG9hdDY0eDFfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weXFfbGFuZV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVfZjY0CiAgIHJldHVybiB2Y29weXFfbGFuZV9mNjQodjEsIDEsIHYyLCAwKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92Y29weXFfbGFuZV91OCh1aW50OHgxNl90IHYxLCB1aW50OHg4X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlxX2xhbmVfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVfdTgKICAgcmV0dXJuIHZjb3B5cV9sYW5lX3U4KHYxLCA1LCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uYls1XSwge3t2WzAtOV0rfX0uYlszXQogfQogCiB1aW50MTZ4OF90IHRlc3RfdmNvcHlxX2xhbmVfdTE2KHVpbnQxNng4X3QgdjEsIHVpbnQxNng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlxX2xhbmVfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lX3UxNgogICByZXR1cm4gdmNvcHlxX2xhbmVfdTE2KHYxLCAyLCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFsyXSwge3t2WzAtOV0rfX0uaFszXQogfQogCiB1aW50MzJ4NF90IHRlc3RfdmNvcHlxX2xhbmVfdTMyKHVpbnQzMng0X3QgdjEsIHVpbnQzMngyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlxX2xhbmVfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lX3UzMgogICByZXR1cm4gdmNvcHlxX2xhbmVfdTMyKHYxLCAwLCB2MiwgMSk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQogfQogCiB1aW50NjR4Ml90IHRlc3RfdmNvcHlxX2xhbmVfdTY0KHVpbnQ2NHgyX3QgdjEsIHVpbnQ2NHgxX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlxX2xhbmVfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lX3U2NAogICByZXR1cm4gdmNvcHlxX2xhbmVfdTY0KHYxLCAxLCB2MiwgMCk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uZFsxXSwge3t2WzAtOV0rfX0uZFswXQogfQogCiBpbnQ4eDE2X3QgdGVzdF92Y29weXFfbGFuZXFfczgoaW50OHgxNl90IHYxLCBpbnQ4eDE2X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlxX2xhbmVxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lcV9zOAogICByZXR1cm4gdmNvcHlxX2xhbmVxX3M4KHYxLCA1LCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uYls1XSwge3t2WzAtOV0rfX0uYlszXQogfQogCiBpbnQxNng4X3QgdGVzdF92Y29weXFfbGFuZXFfczE2KGludDE2eDhfdCB2MSwgaW50MTZ4OF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zjb3B5cV9sYW5lcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVxX3MxNgogICByZXR1cm4gdmNvcHlxX2xhbmVxX3MxNih2MSwgMiwgdjIsIDMpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmhbMl0sIHt7dlswLTldK319LmhbM10KIH0KIAogcG9seTh4MTZfdCB0ZXN0X3Zjb3B5cV9sYW5lcV9wOChwb2x5OHgxNl90IHYxLCBwb2x5OHgxNl90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zjb3B5cV9sYW5lcV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weXFfbGFuZXFfcDgKICAgcmV0dXJuIHZjb3B5cV9sYW5lcV9wOCh2MSwgNSwgdjIsIDMpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmJbNV0sIHt7dlswLTldK319LmJbM10KIH0KIAogcG9seTE2eDhfdCB0ZXN0X3Zjb3B5cV9sYW5lcV9wMTYocG9seTE2eDhfdCB2MSwgcG9seTE2eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weXFfbGFuZXFfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lcV9wMTYKICAgcmV0dXJuIHZjb3B5cV9sYW5lcV9wMTYodjEsIDIsIHYyLCAzKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5oWzJdLCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3Zjb3B5cV9sYW5lcV9zMzIoaW50MzJ4NF90IHYxLCBpbnQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlxX2xhbmVxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weXFfbGFuZXFfczMyCiAgIHJldHVybiB2Y29weXFfbGFuZXFfczMyKHYxLCAwLCB2MiwgMSk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3Zjb3B5cV9sYW5lcV9mMzIoZmxvYXQzMng0X3QgdjEsIGZsb2F0MzJ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zjb3B5cV9sYW5lcV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVxX2YzMgogICByZXR1cm4gdmNvcHlxX2xhbmVxX2YzMih2MSwgMCwgdjIsIDEpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LnNbMF0sIHt7dlswLTldK319LnNbMV0KIH0KIAogaW50NjR4Ml90IHRlc3RfdmNvcHlxX2xhbmVxX3M2NChpbnQ2NHgyX3QgdjEsIGludDY0eDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weXFfbGFuZXFfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lcV9zNjQKICAgcmV0dXJuIHZjb3B5cV9sYW5lcV9zNjQodjEsIDEsIHYyLCAxKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzFdCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92Y29weXFfbGFuZXFfdTgodWludDh4MTZfdCB2MSwgdWludDh4MTZfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weXFfbGFuZXFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVxX3U4CiAgIHJldHVybiB2Y29weXFfbGFuZXFfdTgodjEsIDUsIHYyLCAzKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5iWzVdLCB7e3ZbMC05XSt9fS5iWzNdCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92Y29weXFfbGFuZXFfdTE2KHVpbnQxNng4X3QgdjEsIHVpbnQxNng4X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlxX2xhbmVxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weXFfbGFuZXFfdTE2CiAgIHJldHVybiB2Y29weXFfbGFuZXFfdTE2KHYxLCAyLCB2MiwgMyk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFsyXSwge3t2WzAtOV0rfX0uaFszXQogfQogCiB1aW50MzJ4NF90IHRlc3RfdmNvcHlxX2xhbmVxX3UzMih1aW50MzJ4NF90IHYxLCB1aW50MzJ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zjb3B5cV9sYW5lcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVxX3UzMgogICByZXR1cm4gdmNvcHlxX2xhbmVxX3UzMih2MSwgMCwgdjIsIDEpOwogICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LnNbMF0sIHt7dlswLTldK319LnNbMV0KIH0KIAogdWludDY0eDJfdCB0ZXN0X3Zjb3B5cV9sYW5lcV91NjQodWludDY0eDJfdCB2MSwgdWludDY0eDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y29weXFfbGFuZXFfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lcV91NjQKICAgcmV0dXJuIHZjb3B5cV9sYW5lcV91NjQodjEsIDAsIHYyLCAxKTsKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzBdLCB7e3ZbMC05XSt9fS5kWzFdCiB9CiAKIGludDh4OF90IHRlc3RfdmNyZWF0ZV9zOCh1aW50NjRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Y3JlYXRlX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjcmVhdGVfczgKICAgcmV0dXJuIHZjcmVhdGVfczgodjEpOwogICAvLyBDSEVDSzogZm1vdiB7e2RbMC05XSt9fSwge3t4WzAtOV0rfX0KIH0KIAogaW50MTZ4NF90IHRlc3RfdmNyZWF0ZV9zMTYodWludDY0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNyZWF0ZV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNyZWF0ZV9zMTYKICAgcmV0dXJuIHZjcmVhdGVfczE2KHYxKTsKICAgLy8gQ0hFQ0s6IGZtb3Yge3tkWzAtOV0rfX0sIHt7eFswLTldK319CiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZjcmVhdGVfczMyKHVpbnQ2NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjcmVhdGVfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjcmVhdGVfczMyCiAgIHJldHVybiB2Y3JlYXRlX3MzMih2MSk7CiAgIC8vIENIRUNLOiBmbW92IHt7ZFswLTldK319LCB7e3hbMC05XSt9fQogfQogCiBpbnQ2NHgxX3QgdGVzdF92Y3JlYXRlX3M2NCh1aW50NjRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Y3JlYXRlX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3JlYXRlX3M2NAogICByZXR1cm4gdmNyZWF0ZV9zNjQodjEpOwogICAvLyBDSEVDSzogZm1vdiB7e2RbMC05XSt9fSwge3t4WzAtOV0rfX0KIH0KIAogdWludDh4OF90IHRlc3RfdmNyZWF0ZV91OCh1aW50NjRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Y3JlYXRlX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjcmVhdGVfdTgKICAgcmV0dXJuIHZjcmVhdGVfdTgodjEpOwogICAvLyBDSEVDSzogZm1vdiB7e2RbMC05XSt9fSwge3t4WzAtOV0rfX0KIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZjcmVhdGVfdTE2KHVpbnQ2NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjcmVhdGVfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjcmVhdGVfdTE2CiAgIHJldHVybiB2Y3JlYXRlX3UxNih2MSk7CiAgIC8vIENIRUNLOiBmbW92IHt7ZFswLTldK319LCB7e3hbMC05XSt9fQogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmNyZWF0ZV91MzIodWludDY0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNyZWF0ZV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNyZWF0ZV91MzIKICAgcmV0dXJuIHZjcmVhdGVfdTMyKHYxKTsKICAgLy8gQ0hFQ0s6IGZtb3Yge3tkWzAtOV0rfX0sIHt7eFswLTldK319CiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Y3JlYXRlX3U2NCh1aW50NjRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Y3JlYXRlX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3JlYXRlX3U2NAogICByZXR1cm4gdmNyZWF0ZV91NjQodjEpOwogICAvLyBDSEVDSzogZm1vdiB7e2RbMC05XSt9fSwge3t4WzAtOV0rfX0KIH0KIAogcG9seTh4OF90IHRlc3RfdmNyZWF0ZV9wOCh1aW50NjRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92Y3JlYXRlX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjcmVhdGVfcDgKICAgcmV0dXJuIHZjcmVhdGVfcDgodjEpOwogICAvLyBDSEVDSzogZm1vdiB7e2RbMC05XSt9fSwge3t4WzAtOV0rfX0KIH0KIAogcG9seTE2eDRfdCB0ZXN0X3ZjcmVhdGVfcDE2KHVpbnQ2NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjcmVhdGVfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjcmVhdGVfcDE2CiAgIHJldHVybiB2Y3JlYXRlX3AxNih2MSk7CiAgIC8vIENIRUNLOiBmbW92IHt7ZFswLTldK319LCB7e3hbMC05XSt9fQogfQogCiBmbG9hdDE2eDRfdCB0ZXN0X3ZjcmVhdGVfZjE2KHVpbnQ2NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjcmVhdGVfZjE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjcmVhdGVfZjE2CiAgIHJldHVybiB2Y3JlYXRlX2YxNih2MSk7CiAgIC8vIENIRUNLOiBmbW92IHt7ZFswLTldK319LCB7e3hbMC05XSt9fQogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZjcmVhdGVfZjMyKHVpbnQ2NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjcmVhdGVfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjcmVhdGVfZjMyCiAgIHJldHVybiB2Y3JlYXRlX2YzMih2MSk7CiAgIC8vIENIRUNLOiBmbW92IHt7ZFswLTldK319LCB7e3hbMC05XSt9fQogfQogCiBmbG9hdDY0eDFfdCB0ZXN0X3ZjcmVhdGVfZjY0KHVpbnQ2NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjcmVhdGVfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjcmVhdGVfZjY0CiAgIHJldHVybiB2Y3JlYXRlX2Y2NCh2MSk7CiAgIC8vIENIRUNLOiBmbW92IHt7ZFswLTldK319LCB7e3hbMC05XSt9fQogfQogCiB1aW50OHg4X3QgdGVzdF92ZHVwX25fdTgodWludDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX25fdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9uX3U4CiAgIHJldHVybiB2ZHVwX25fdTgodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjhiLCB7e3dbMC05XSt9fQogfQogCiB1aW50MTZ4NF90IHRlc3RfdmR1cF9uX3UxNih1aW50MTZfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX25fdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbl91MTYKICAgcmV0dXJuIHZkdXBfbl91MTYodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRoLCB7e3dbMC05XSt9fQogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmR1cF9uX3UzMih1aW50MzJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX25fdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbl91MzIKICAgcmV0dXJuIHZkdXBfbl91MzIodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB7e3dbMC05XSt9fQogfQogCiB1aW50NjR4MV90IHRlc3RfdmR1cF9uX3U2NCh1aW50NjRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX25fdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbl91NjQKICAgcmV0dXJuIHZkdXBfbl91NjQodjEpOwogICAvLyBDSEVDSzogZm1vdiB7e2RbMC05XSt9fSwge3t4WzAtOV0rfX0KIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZkdXBxX25fdTgodWludDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9uX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX25fdTgKICAgcmV0dXJuIHZkdXBxX25fdTgodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjE2Yiwge3t3WzAtOV0rfX0KIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZkdXBxX25fdTE2KHVpbnQxNl90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX25fdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX25fdTE2CiAgIHJldHVybiB2ZHVwcV9uX3UxNih2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGgsIHt7d1swLTldK319CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92ZHVwcV9uX3UzMih1aW50MzJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9uX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9uX3UzMgogICByZXR1cm4gdmR1cHFfbl91MzIodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRzLCB7e3dbMC05XSt9fQogfQogCiB1aW50NjR4Ml90IHRlc3RfdmR1cHFfbl91NjQodWludDY0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbl91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbl91NjQKICAgcmV0dXJuIHZkdXBxX25fdTY0KHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4yZCwge3t4WzAtOV0rfX0KIH0KIAogaW50OHg4X3QgdGVzdF92ZHVwX25fczgoaW50OF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBfbl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX25fczgKICAgcmV0dXJuIHZkdXBfbl9zOCh2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGIsIHt7d1swLTldK319CiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZkdXBfbl9zMTYoaW50MTZfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbl9zMTYKICAgcmV0dXJuIHZkdXBfbl9zMTYodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRoLCB7e3dbMC05XSt9fQogfQogCiBpbnQzMngyX3QgdGVzdF92ZHVwX25fczMyKGludDMyX3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9uX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX25fczMyCiAgIHJldHVybiB2ZHVwX25fczMyKHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywge3t3WzAtOV0rfX0KIH0KIAogaW50NjR4MV90IHRlc3RfdmR1cF9uX3M2NChpbnQ2NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBfbl9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9uX3M2NAogICByZXR1cm4gdmR1cF9uX3M2NCh2MSk7CiAgIC8vIENIRUNLOiBmbW92IHt7ZFswLTldK319LCB7e3hbMC05XSt9fQogfQogCiBpbnQ4eDE2X3QgdGVzdF92ZHVwcV9uX3M4KGludDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9uX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX25fczgKICAgcmV0dXJuIHZkdXBxX25fczgodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjE2Yiwge3t3WzAtOV0rfX0KIH0KIAogaW50MTZ4OF90IHRlc3RfdmR1cHFfbl9zMTYoaW50MTZfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9uX3MxNgogICByZXR1cm4gdmR1cHFfbl9zMTYodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjhoLCB7e3dbMC05XSt9fQogfQogCiBpbnQzMng0X3QgdGVzdF92ZHVwcV9uX3MzMihpbnQzMl90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX25fczMyCiAgIHJldHVybiB2ZHVwcV9uX3MzMih2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uNHMsIHt7d1swLTldK319CiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZkdXBxX25fczY0KGludDY0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbl9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbl9zNjQKICAgcmV0dXJuIHZkdXBxX25fczY0KHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4yZCwge3t4WzAtOV0rfX0KIH0KIAogcG9seTh4OF90IHRlc3RfdmR1cF9uX3A4KHBvbHk4X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9uX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbl9wOAogICByZXR1cm4gdmR1cF9uX3A4KHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44Yiwge3t3WzAtOV0rfX0KIH0KIAogcG9seTE2eDRfdCB0ZXN0X3ZkdXBfbl9wMTYocG9seTE2X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9uX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX25fcDE2CiAgIHJldHVybiB2ZHVwX25fcDE2KHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwge3t3WzAtOV0rfX0KIH0KIAogcG9seTh4MTZfdCB0ZXN0X3ZkdXBxX25fcDgocG9seThfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9uX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX25fcDgKICAgcmV0dXJuIHZkdXBxX25fcDgodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjE2Yiwge3t3WzAtOV0rfX0KIH0KIAogcG9seTE2eDhfdCB0ZXN0X3ZkdXBxX25fcDE2KHBvbHkxNl90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX25fcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX25fcDE2CiAgIHJldHVybiB2ZHVwcV9uX3AxNih2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGgsIHt7d1swLTldK319CiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdmR1cF9uX2YzMihmbG9hdDMyX3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9uX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX25fZjMyCiAgIHJldHVybiB2ZHVwX25fZjMyKHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQogfQogCiBmbG9hdDY0eDFfdCB0ZXN0X3ZkdXBfbl9mNjQoZmxvYXQ2NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBfbl9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9uX2Y2NAogICByZXR1cm4gdmR1cF9uX2Y2NCh2MSk7CiAgIC8vIENIRUNLOiByZXQKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92ZHVwcV9uX2YzMihmbG9hdDMyX3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbl9mMzIKICAgcmV0dXJuIHZkdXBxX25fZjMyKHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZkdXBxX25fZjY0KGZsb2F0NjRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9uX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9uX2Y2NAogICByZXR1cm4gdmR1cHFfbl9mNjQodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS5kWzBdCiB9CiAKIGludDh4OF90IHRlc3RfdmR1cF9sYW5lX3M4KGludDh4OF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBfbGFuZV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVfczgKICAgcmV0dXJuIHZkdXBfbGFuZV9zOCh2MSwgNSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LmJbNV0KIH0KIAogaW50MTZ4NF90IHRlc3RfdmR1cF9sYW5lX3MxNihpbnQxNng0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9sYW5lX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVfczE2CiAgIHJldHVybiB2ZHVwX2xhbmVfczE2KHYxLCAyKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFsyXQogfQogCiBpbnQzMngyX3QgdGVzdF92ZHVwX2xhbmVfczMyKGludDMyeDJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX2xhbmVfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbGFuZV9zMzIKICAgcmV0dXJuIHZkdXBfbGFuZV9zMzIodjEsIDEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGludDY0eDFfdCB0ZXN0X3ZkdXBfbGFuZV9zNjQoaW50NjR4MV90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBfbGFuZV9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9sYW5lX3M2NAogICByZXR1cm4gdmR1cF9sYW5lX3M2NCh2MSwgMCk7CiAgIC8vIENIRUNLOiByZXQKIH0KIAogaW50OHgxNl90IHRlc3RfdmR1cHFfbGFuZV9zOChpbnQ4eDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9sYW5lX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX2xhbmVfczgKICAgcmV0dXJuIHZkdXBxX2xhbmVfczgodjEsIDUpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uYls1XQogfQogCiBpbnQxNng4X3QgdGVzdF92ZHVwcV9sYW5lX3MxNihpbnQxNng0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZV9zMTYKICAgcmV0dXJuIHZkdXBxX2xhbmVfczE2KHYxLCAyKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFsyXQogfQogCiBpbnQzMng0X3QgdGVzdF92ZHVwcV9sYW5lX3MzMihpbnQzMngyX3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZV9zMzIKICAgcmV0dXJuIHZkdXBxX2xhbmVfczMyKHYxLCAxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92ZHVwcV9sYW5lX3M2NChpbnQ2NHgxX3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZV9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZV9zNjQKICAgcmV0dXJuIHZkdXBxX2xhbmVfczY0KHYxLCAwKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uZFswXQogfQogCiB1aW50OHg4X3QgdGVzdF92ZHVwX2xhbmVfdTgodWludDh4OF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBfbGFuZV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVfdTgKICAgcmV0dXJuIHZkdXBfbGFuZV91OCh2MSwgNSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LmJbNV0KIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZkdXBfbGFuZV91MTYodWludDE2eDRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX2xhbmVfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbGFuZV91MTYKICAgcmV0dXJuIHZkdXBfbGFuZV91MTYodjEsIDIpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzJdCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92ZHVwX2xhbmVfdTMyKHVpbnQzMngyX3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9sYW5lX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVfdTMyCiAgIHJldHVybiB2ZHVwX2xhbmVfdTMyKHYxLCAxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQogfQogCiB1aW50NjR4MV90IHRlc3RfdmR1cF9sYW5lX3U2NCh1aW50NjR4MV90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBfbGFuZV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9sYW5lX3U2NAogICByZXR1cm4gdmR1cF9sYW5lX3U2NCh2MSwgMCk7CiAgIC8vIENIRUNLOiByZXQKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZkdXBxX2xhbmVfdTgodWludDh4OF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX2xhbmVfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZV91OAogICByZXR1cm4gdmR1cHFfbGFuZV91OCh2MSwgNSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS5iWzVdCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92ZHVwcV9sYW5lX3UxNih1aW50MTZ4NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX2xhbmVfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX2xhbmVfdTE2CiAgIHJldHVybiB2ZHVwcV9sYW5lX3UxNih2MSwgMik7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMl0KIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZkdXBxX2xhbmVfdTMyKHVpbnQzMngyX3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZV91MzIKICAgcmV0dXJuIHZkdXBxX2xhbmVfdTMyKHYxLCAxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1sxXQogfQogCiB1aW50NjR4Ml90IHRlc3RfdmR1cHFfbGFuZV91NjQodWludDY0eDFfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9sYW5lX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9sYW5lX3U2NAogICByZXR1cm4gdmR1cHFfbGFuZV91NjQodjEsIDApOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS5kWzBdCiB9CiAKIGludDh4OF90IHRlc3RfdmR1cF9sYW5lcV9zOChpbnQ4eDE2X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9sYW5lcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVxX3M4CiAgIHJldHVybiB2ZHVwX2xhbmVxX3M4KHYxLCA1KTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uYls1XQogfQogCiBpbnQxNng0X3QgdGVzdF92ZHVwX2xhbmVxX3MxNihpbnQxNng4X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9sYW5lcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9sYW5lcV9zMTYKICAgcmV0dXJuIHZkdXBfbGFuZXFfczE2KHYxLCAyKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFsyXQogfQogCiBpbnQzMngyX3QgdGVzdF92ZHVwX2xhbmVxX3MzMihpbnQzMng0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9sYW5lcV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9sYW5lcV9zMzIKICAgcmV0dXJuIHZkdXBfbGFuZXFfczMyKHYxLCAxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQ2NHgxX3QgdGVzdF92ZHVwX2xhbmVxX3M2NChpbnQ2NHgyX3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9sYW5lcV9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9sYW5lcV9zNjQKICAgcmV0dXJuIHZkdXBfbGFuZXFfczY0KHYxLCAwKTsKICAgLy8gQ0hFQ0s6IHJldAogfQogCiBpbnQ4eDE2X3QgdGVzdF92ZHVwcV9sYW5lcV9zOChpbnQ4eDE2X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZXFfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZXFfczgKICAgcmV0dXJuIHZkdXBxX2xhbmVxX3M4KHYxLCA1KTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LmJbNV0KIH0KIAogaW50MTZ4OF90IHRlc3RfdmR1cHFfbGFuZXFfczE2KGludDE2eDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9sYW5lcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZXFfczE2CiAgIHJldHVybiB2ZHVwcV9sYW5lcV9zMTYodjEsIDIpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzJdCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZkdXBxX2xhbmVxX3MzMihpbnQzMng0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX2xhbmVxX3MzMgogICByZXR1cm4gdmR1cHFfbGFuZXFfczMyKHYxLCAxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBpbnQ2NHgyX3QgdGVzdF92ZHVwcV9sYW5lcV9zNjQoaW50NjR4Ml90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX2xhbmVxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9sYW5lcV9zNjQKICAgcmV0dXJuIHZkdXBxX2xhbmVxX3M2NCh2MSwgMCk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LmRbMF0KIH0KIAogdWludDh4OF90IHRlc3RfdmR1cF9sYW5lcV91OCh1aW50OHgxNl90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBfbGFuZXFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9sYW5lcV91OAogICByZXR1cm4gdmR1cF9sYW5lcV91OCh2MSwgNSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LmJbNV0KIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZkdXBfbGFuZXFfdTE2KHVpbnQxNng4X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9sYW5lcV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9sYW5lcV91MTYKICAgcmV0dXJuIHZkdXBfbGFuZXFfdTE2KHYxLCAyKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFsyXQogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmR1cF9sYW5lcV91MzIodWludDMyeDRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX2xhbmVxX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVxX3UzMgogICByZXR1cm4gdmR1cF9sYW5lcV91MzIodjEsIDEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92ZHVwX2xhbmVxX3U2NCh1aW50NjR4Ml90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBfbGFuZXFfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbGFuZXFfdTY0CiAgIHJldHVybiB2ZHVwX2xhbmVxX3U2NCh2MSwgMCk7CiAgIC8vIENIRUNLOiByZXQKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZkdXBxX2xhbmVxX3U4KHVpbnQ4eDE2X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZXFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZXFfdTgKICAgcmV0dXJuIHZkdXBxX2xhbmVxX3U4KHYxLCA1KTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LmJbNV0KIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZkdXBxX2xhbmVxX3UxNih1aW50MTZ4OF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX2xhbmVxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9sYW5lcV91MTYKICAgcmV0dXJuIHZkdXBxX2xhbmVxX3UxNih2MSwgMik7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMl0KIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZkdXBxX2xhbmVxX3UzMih1aW50MzJ4NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX2xhbmVxX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9sYW5lcV91MzIKICAgcmV0dXJuIHZkdXBxX2xhbmVxX3UzMih2MSwgMSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZkdXBxX2xhbmVxX3U2NCh1aW50NjR4Ml90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX2xhbmVxX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9sYW5lcV91NjQKICAgcmV0dXJuIHZkdXBxX2xhbmVxX3U2NCh2MSwgMCk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LmRbMF0KIH0KIAogcG9seTh4OF90IHRlc3RfdmR1cF9sYW5lX3A4KHBvbHk4eDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX2xhbmVfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9sYW5lX3A4CiAgIHJldHVybiB2ZHVwX2xhbmVfcDgodjEsIDUpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS5iWzVdCiB9CiAKIHBvbHkxNng0X3QgdGVzdF92ZHVwX2xhbmVfcDE2KHBvbHkxNng0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9sYW5lX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVfcDE2CiAgIHJldHVybiB2ZHVwX2xhbmVfcDE2KHYxLCAyKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFsyXQogfQogCiBwb2x5OHgxNl90IHRlc3RfdmR1cHFfbGFuZV9wOChwb2x5OHg4X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9sYW5lX3A4CiAgIHJldHVybiB2ZHVwcV9sYW5lX3A4KHYxLCA1KTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LmJbNV0KIH0KIAogcG9seTE2eDhfdCB0ZXN0X3ZkdXBxX2xhbmVfcDE2KHBvbHkxNng0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZV9wMTYKICAgcmV0dXJuIHZkdXBxX2xhbmVfcDE2KHYxLCAyKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFsyXQogfQogCiBwb2x5OHg4X3QgdGVzdF92ZHVwX2xhbmVxX3A4KHBvbHk4eDE2X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9sYW5lcV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVxX3A4CiAgIHJldHVybiB2ZHVwX2xhbmVxX3A4KHYxLCA1KTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uYls1XQogfQogCiBwb2x5MTZ4NF90IHRlc3RfdmR1cF9sYW5lcV9wMTYocG9seTE2eDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX2xhbmVxX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVxX3AxNgogICByZXR1cm4gdmR1cF9sYW5lcV9wMTYodjEsIDIpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzJdCiB9CiAKIHBvbHk4eDE2X3QgdGVzdF92ZHVwcV9sYW5lcV9wOChwb2x5OHgxNl90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX2xhbmVxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX2xhbmVxX3A4CiAgIHJldHVybiB2ZHVwcV9sYW5lcV9wOCh2MSwgNSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS5iWzVdCiB9CiAKIHBvbHkxNng4X3QgdGVzdF92ZHVwcV9sYW5lcV9wMTYocG9seTE2eDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9sYW5lcV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZXFfcDE2CiAgIHJldHVybiB2ZHVwcV9sYW5lcV9wMTYodjEsIDIpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS5oWzJdCiB9CiAKIGZsb2F0MTZ4NF90IHRlc3RfdmR1cF9sYW5lX2YxNihmbG9hdDE2eDRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX2xhbmVfZjE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbGFuZV9mMTYKICAgcmV0dXJuIHZkdXBfbGFuZV9mMTYodjEsIDIpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS5oWzJdCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdmR1cF9sYW5lX2YzMihmbG9hdDMyeDJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX2xhbmVfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbGFuZV9mMzIKICAgcmV0dXJuIHZkdXBfbGFuZV9mMzIodjEsIDEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGZsb2F0NjR4MV90IHRlc3RfdmR1cF9sYW5lX2Y2NChmbG9hdDY0eDFfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX2xhbmVfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbGFuZV9mNjQKICAgcmV0dXJuIHZkdXBfbGFuZV9mNjQodjEsIDApOwogICAvLyBDSEVDSzogcmV0CiB9CiAKIGZsb2F0MTZ4NF90IHRlc3RfdmR1cF9sYW5lcV9mMTYoZmxvYXQxNng4X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9sYW5lcV9mMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9sYW5lcV9mMTYKICAgcmV0dXJuIHZkdXBfbGFuZXFfZjE2KHYxLCAyKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uaFsyXQogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZkdXBfbGFuZXFfZjMyKGZsb2F0MzJ4NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBfbGFuZXFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbGFuZXFfZjMyCiAgIHJldHVybiB2ZHVwX2xhbmVxX2YzMih2MSwgMSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMV0KIH0KIAogZmxvYXQ2NHgxX3QgdGVzdF92ZHVwX2xhbmVxX2Y2NChmbG9hdDY0eDJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX2xhbmVxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVxX2Y2NAogICByZXR1cm4gdmR1cF9sYW5lcV9mNjQodjEsIDApOwogICAvLyBDSEVDSzogcmV0CiB9CiAKIGZsb2F0MTZ4OF90IHRlc3RfdmR1cHFfbGFuZV9mMTYoZmxvYXQxNng0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZV9mMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZV9mMTYKICAgcmV0dXJuIHZkdXBxX2xhbmVfZjE2KHYxLCAyKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uaFsyXQogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZkdXBxX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX2xhbmVfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX2xhbmVfZjMyCiAgIHJldHVybiB2ZHVwcV9sYW5lX2YzMih2MSwgMSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92ZHVwcV9sYW5lX2Y2NChmbG9hdDY0eDFfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9sYW5lX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9sYW5lX2Y2NAogICByZXR1cm4gdmR1cHFfbGFuZV9mNjQodjEsIDApOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS5kWzBdCiB9CiAKIGZsb2F0MTZ4OF90IHRlc3RfdmR1cHFfbGFuZXFfZjE2KGZsb2F0MTZ4OF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX2xhbmVxX2YxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9sYW5lcV9mMTYKICAgcmV0dXJuIHZkdXBxX2xhbmVxX2YxNih2MSwgMik7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LmhbMl0KIH0KIAogZmxvYXQzMng0X3QgdGVzdF92ZHVwcV9sYW5lcV9mMzIoZmxvYXQzMng0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZXFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBxX2xhbmVxX2YzMgogICByZXR1cm4gdmR1cHFfbGFuZXFfZjMyKHYxLCAxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1sxXQogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZkdXBxX2xhbmVxX2Y2NChmbG9hdDY0eDJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9sYW5lcV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZXFfZjY0CiAgIHJldHVybiB2ZHVwcV9sYW5lcV9mNjQodjEsIDApOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS5kWzBdCiB9CiAKIGludDh4OF90IHRlc3Rfdm1vdl9uX3M4KGludDhfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92bW92X25fczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdl9uX3M4CiAgIHJldHVybiB2bW92X25fczgodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjhiLCB7e3dbMC05XSt9fQogfQogCiBpbnQxNng0X3QgdGVzdF92bW92X25fczE2KGludDE2X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1vdl9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92X25fczE2CiAgIHJldHVybiB2bW92X25fczE2KHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS40aCwge3t3WzAtOV0rfX0KIH0KIAogaW50MzJ4Ml90IHRlc3Rfdm1vdl9uX3MzMihpbnQzMl90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3Zfbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdl9uX3MzMgogICByZXR1cm4gdm1vdl9uX3MzMih2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMnMsIHt7d1swLTldK319CiB9CiAKIGludDY0eDFfdCB0ZXN0X3Ztb3Zfbl9zNjQoaW50NjRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92bW92X25fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3Zfbl9zNjQKICAgcmV0dXJuIHZtb3Zfbl9zNjQodjEpOwogICAvLyBDSEVDSzogZm1vdiB7e2RbMC05XSt9fSwge3t4WzAtOV0rfX0KIH0KIAogaW50OHgxNl90IHRlc3Rfdm1vdnFfbl9zOChpbnQ4X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1vdnFfbl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92cV9uX3M4CiAgIHJldHVybiB2bW92cV9uX3M4KHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4xNmIsIHt7d1swLTldK319CiB9CiAKIGludDE2eDhfdCB0ZXN0X3Ztb3ZxX25fczE2KGludDE2X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1vdnFfbl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdnFfbl9zMTYKICAgcmV0dXJuIHZtb3ZxX25fczE2KHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44aCwge3t3WzAtOV0rfX0KIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1vdnFfbl9zMzIoaW50MzJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92bW92cV9uX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92cV9uX3MzMgogICByZXR1cm4gdm1vdnFfbl9zMzIodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRzLCB7e3dbMC05XSt9fQogfQogCiBpbnQ2NHgyX3QgdGVzdF92bW92cV9uX3M2NChpbnQ2NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3ZxX25fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3ZxX25fczY0CiAgIHJldHVybiB2bW92cV9uX3M2NCh2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMmQsIHt7eFswLTldK319CiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3Ztb3Zfbl91OCh1aW50OF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3Zfbl91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92X25fdTgKICAgcmV0dXJuIHZtb3Zfbl91OCh2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uOGIsIHt7d1swLTldK319CiB9CiAKIHVpbnQxNng0X3QgdGVzdF92bW92X25fdTE2KHVpbnQxNl90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3Zfbl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdl9uX3UxNgogICByZXR1cm4gdm1vdl9uX3UxNih2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uNGgsIHt7d1swLTldK319CiB9CiAKIHVpbnQzMngyX3QgdGVzdF92bW92X25fdTMyKHVpbnQzMl90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3Zfbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdl9uX3UzMgogICByZXR1cm4gdm1vdl9uX3UzMih2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMnMsIHt7d1swLTldK319CiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92bW92X25fdTY0KHVpbnQ2NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3Zfbl91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdl9uX3U2NAogICByZXR1cm4gdm1vdl9uX3U2NCh2MSk7CiAgIC8vIENIRUNLOiBmbW92IHt7ZFswLTldK319LCB7e3hbMC05XSt9fQogfQogCiB1aW50OHgxNl90IHRlc3Rfdm1vdnFfbl91OCh1aW50OF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3ZxX25fdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdnFfbl91OAogICByZXR1cm4gdm1vdnFfbl91OCh2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMTZiLCB7e3dbMC05XSt9fQogfQogCiB1aW50MTZ4OF90IHRlc3Rfdm1vdnFfbl91MTYodWludDE2X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1vdnFfbl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdnFfbl91MTYKICAgcmV0dXJuIHZtb3ZxX25fdTE2KHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44aCwge3t3WzAtOV0rfX0KIH0KIAogdWludDMyeDRfdCB0ZXN0X3Ztb3ZxX25fdTMyKHVpbnQzMl90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3ZxX25fdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3ZxX25fdTMyCiAgIHJldHVybiB2bW92cV9uX3UzMih2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uNHMsIHt7d1swLTldK319CiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92bW92cV9uX3U2NCh1aW50NjRfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92bW92cV9uX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92cV9uX3U2NAogICByZXR1cm4gdm1vdnFfbl91NjQodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJkLCB7e3hbMC05XSt9fQogfQogCiBwb2x5OHg4X3QgdGVzdF92bW92X25fcDgocG9seThfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92bW92X25fcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdl9uX3A4CiAgIHJldHVybiB2bW92X25fcDgodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjhiLCB7e3dbMC05XSt9fQogfQogCiBwb2x5MTZ4NF90IHRlc3Rfdm1vdl9uX3AxNihwb2x5MTZfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92bW92X25fcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3Zfbl9wMTYKICAgcmV0dXJuIHZtb3Zfbl9wMTYodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRoLCB7e3dbMC05XSt9fQogfQogCiBwb2x5OHgxNl90IHRlc3Rfdm1vdnFfbl9wOChwb2x5OF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3ZxX25fcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdnFfbl9wOAogICByZXR1cm4gdm1vdnFfbl9wOCh2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMTZiLCB7e3dbMC05XSt9fQogfQogCiBwb2x5MTZ4OF90IHRlc3Rfdm1vdnFfbl9wMTYocG9seTE2X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1vdnFfbl9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdnFfbl9wMTYKICAgcmV0dXJuIHZtb3ZxX25fcDE2KHYxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS44aCwge3t3WzAtOV0rfX0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92bW92X25fZjMyKGZsb2F0MzJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92bW92X25fZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3Zfbl9mMzIKICAgcmV0dXJuIHZtb3Zfbl9mMzIodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0NjR4MV90IHRlc3Rfdm1vdl9uX2Y2NChmbG9hdDY0X3QgdjEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1vdl9uX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92X25fZjY0CiAgIHJldHVybiB2bW92X25fZjY0KHYxKTsKICAgLy8gQ0hFQ0s6IHJldAogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3Ztb3ZxX25fZjMyKGZsb2F0MzJfdCB2MSkgewotICAvLyBDSEVDSzogdGVzdF92bW92cV9uX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92cV9uX2YzMgogICByZXR1cm4gdm1vdnFfbl9mMzIodjEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3Rfdm1vdnFfbl9mNjQoZmxvYXQ2NF90IHYxKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3ZxX25fZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3ZxX25fZjY0CiAgIHJldHVybiB2bW92cV9uX2Y2NCh2MSk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LmRbMF0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZV9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5X2xhbmVfczY0CiBpbnQ2NHgxX3QgdGVzdF92Y29weV9sYW5lX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGMpIHsKICAgcmV0dXJuIHZjb3B5X2xhbmVfczY0KGEsIDAsIGMsIDApOwogLy8gQ0hFQ0s6IGZtb3Yge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiAvLyBDSEVDSy1OT1Q6IGR1cCB7e2RbMC05XSt9fSwge3t2WzAtOV0rfX0uZFswXQogfQogCi0vLyBDSEVDSzogdGVzdF92Y29weV9sYW5lX3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlfbGFuZV91NjQKIHVpbnQ2NHgxX3QgdGVzdF92Y29weV9sYW5lX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYykgewogICByZXR1cm4gdmNvcHlfbGFuZV91NjQoYSwgMCwgYywgMCk7CiAvLyBDSEVDSzogZm1vdiB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIC8vIENIRUNLLU5PVDogZHVwIHt7ZFswLTldK319LCB7e3ZbMC05XSt9fS5kWzBdCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3Zjb3B5X2xhbmVfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weV9sYW5lX2Y2NAogZmxvYXQ2NHgxX3QgdGVzdF92Y29weV9sYW5lX2Y2NChmbG9hdDY0eDFfdCBhLCBmbG9hdDY0eDFfdCBjKSB7CiAgIHJldHVybiB2Y29weV9sYW5lX2Y2NChhLCAwLCBjLCAwKTsKIC8vIENIRUNLOiBmbW92IHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogLy8gQ0hFQ0stTk9UOiBkdXAge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMF0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weV9sYW5lcV9zNjQKIGludDY0eDFfdCB0ZXN0X3Zjb3B5X2xhbmVxX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4Ml90IGMpIHsKICAgcmV0dXJuIHZjb3B5X2xhbmVxX3M2NChhLCAwLCBjLCAxKTsKIC8vIENIRUNLOiBkdXAge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMV0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weV9sYW5lcV91NjQKIHVpbnQ2NHgxX3QgdGVzdF92Y29weV9sYW5lcV91NjQodWludDY0eDFfdCBhLCB1aW50NjR4Ml90IGMpIHsKICAgcmV0dXJuIHZjb3B5X2xhbmVxX3U2NChhLCAwLCBjLCAxKTsKIC8vIENIRUNLOiBkdXAge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMV0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weV9sYW5lcV9mNjQKIGZsb2F0NjR4MV90IHRlc3RfdmNvcHlfbGFuZXFfZjY0KGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4Ml90IGMpIHsKICAgcmV0dXJuIHZjb3B5X2xhbmVxX2Y2NChhLCAwLCBjLCAxKTsKIC8vIENIRUNLOiBkdXAge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMV0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNvcHlfbGFuZXFfcDY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weV9sYW5lcV9wNjQKIHBvbHk2NHgxX3QgdGVzdF92Y29weV9sYW5lcV9wNjQocG9seTY0eDFfdCBhLCBwb2x5NjR4Ml90IGMpIHsKICAgcmV0dXJuIHZjb3B5X2xhbmVxX3A2NChhLCAwLCBjLCAxKTsKIC8vIENIRUNLOiBkdXAge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMV0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNvcHlxX2xhbmVxX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVxX2Y2NAogZmxvYXQ2NHgyX3QgdGVzdF92Y29weXFfbGFuZXFfZjY0KGZsb2F0NjR4Ml90IGEsIGZsb2F0NjR4Ml90IGMpIHsKIC8vIENIRUNLOiBpbnMgIHt7dlswLTldK319LmRbMV0sIHt7dlswLTldK319LmRbMV0KICAgcmV0dXJuIHZjb3B5cV9sYW5lcV9mNjQoYSwgMSwgYywgMSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZnZXRfbGFuZV9mMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfbGFuZV9mMTYKIGludCB0ZXN0X3ZnZXRfbGFuZV9mMTYoZmxvYXQxNng0X3QgdjEpIHsKICAgZmxvYXQxNl90IGEgPSB2Z2V0X2xhbmVfZjE2KHYxLCAzKTsKICAgcmV0dXJuIChpbnQpYTsKIC8vIENIRUNLOiBkdXAge3toWzAtOV0rfX0sIHt7dlswLTldK319LmhbM10KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmdldHFfbGFuZV9mMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRxX2xhbmVfZjE2CiBpbnQgdGVzdF92Z2V0cV9sYW5lX2YxNihmbG9hdDE2eDhfdCB2MSkgewogICBmbG9hdDE2X3QgYSA9IHZnZXRxX2xhbmVfZjE2KHYxLCA3KTsKICAgcmV0dXJuIChpbnQpYTsKIC8vIENIRUNLOiBkdXAge3toWzAtOV0rfX0sIHt7dlswLTldK319LmhbN10KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmdldF9sYW5lX2YxNl8yCi1mbG9hdCB0ZXN0X3ZnZXRfbGFuZV9mMTZfMihmbG9hdDE2eDRfdCB2MSkgeworLy8gQ0hFQ0stTEFCRUw6IHRlc3QyX3ZnZXRfbGFuZV9mMTYKK2Zsb2F0IHRlc3QyX3ZnZXRfbGFuZV9mMTYoZmxvYXQxNng0X3QgdjEpIHsKICAgZmxvYXQxNl90IGEgPSB2Z2V0X2xhbmVfZjE2KHYxLCAzKTsKICAgcmV0dXJuIChmbG9hdClhOwogLy8gQ0hFQ0s6IGR1cCB7e2hbMC05XSt9fSwge3t2WzAtOV0rfX0uaFszXQogfQogCi0vLyBDSEVDSzogdGVzdF92Z2V0cV9sYW5lX2YxNl8yCi1mbG9hdCB0ZXN0X3ZnZXRxX2xhbmVfZjE2XzIoZmxvYXQxNng4X3QgdjEpIHsKKy8vIENIRUNLLUxBQkVMOiB0ZXN0Ml92Z2V0cV9sYW5lX2YxNgorZmxvYXQgdGVzdDJfdmdldHFfbGFuZV9mMTYoZmxvYXQxNng4X3QgdjEpIHsKICAgZmxvYXQxNl90IGEgPSB2Z2V0cV9sYW5lX2YxNih2MSwgNyk7CiAgIHJldHVybiAoZmxvYXQpYTsKIC8vIENIRUNLOiBkdXAge3toWzAtOV0rfX0sIHt7dlswLTldK319LmhbN10KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnNldF9sYW5lX2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNldF9sYW5lX2YxNgogZmxvYXQxNng0X3QgdGVzdF92c2V0X2xhbmVfZjE2KGZsb2F0MTZ4NF90IHYxKSB7Ci0gIGZsb2F0MTZfdCBhOworICBmbG9hdDE2X3QgYSA9IDAuMDsKICAgcmV0dXJuIHZzZXRfbGFuZV9mMTYoYSwgdjEsIDMpOwotLy8gQ0hFQ0s6IGZtb3YgIHt7c1swLTldK319LCB3enIKLS8vIENIRUNLLU5FWFQ6IGlucyB7e3ZbMC05XSt9fS5oWzNdLCAge3t2WzAtOV0rfX0uaFswXQorLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5oWzNdLCB3enIKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnNldHFfbGFuZV9mMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzZXRxX2xhbmVfZjE2CiBmbG9hdDE2eDhfdCB0ZXN0X3ZzZXRxX2xhbmVfZjE2KGZsb2F0MTZ4OF90IHYxKSB7Ci0gIGZsb2F0MTZfdCBhOworICBmbG9hdDE2X3QgYSA9IDAuMDsKICAgcmV0dXJuIHZzZXRxX2xhbmVfZjE2KGEsIHYxLCA3KTsKLS8vIENIRUNLOiBmbW92ICB7e3NbMC05XSt9fSwgd3pyCi0vLyBDSEVDSy1ORVhUOiBpbnMge3t2WzAtOV0rfX0uaFs3XSwgIHt7dlswLTldK319LmhbMF0KKy8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFs3XSwgd3pyCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZzZXRfbGFuZV9mMTZfMgotZmxvYXQxNng0X3QgdGVzdF92c2V0X2xhbmVfZjE2XzIoZmxvYXQxNng0X3QgdjEpIHsKKy8vIENIRUNLLUxBQkVMOiB0ZXN0Ml92c2V0X2xhbmVfZjE2CitmbG9hdDE2eDRfdCB0ZXN0Ml92c2V0X2xhbmVfZjE2KGZsb2F0MTZ4NF90IHYxKSB7CisgIGZsb2F0MTZfdCBhID0gMS4wOworICByZXR1cm4gdnNldF9sYW5lX2YxNihhLCB2MSwgMyk7CisvLyBDSEVDSzogIG1vdnogICAge3t3WzAtOV0rfX0sICMxNTM2MAorLy8gQ0hFQ0stTkVYVDogaW5zIHt7dlswLTldK319LmhbM10sIHt7d1swLTldK319Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0Ml92c2V0cV9sYW5lX2YxNgorZmxvYXQxNng4X3QgdGVzdDJfdnNldHFfbGFuZV9mMTYoZmxvYXQxNng4X3QgdjEpIHsKKyAgZmxvYXQxNl90IGEgPSAxLjA7CisgIHJldHVybiB2c2V0cV9sYW5lX2YxNihhLCB2MSwgNyk7CisvLyBDSEVDSzogIG1vdnogICAge3t3WzAtOV0rfX0sICMxNTM2MAorLy8gQ0hFQ0stTkVYVDogaW5zIHt7dlswLTldK319LmhbN10sICB7e3dbMC05XSt9fQorfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X3ZzZXRfbGFuZV9mMTYKK2Zsb2F0MTZ4NF90IHRlc3RfdmdldF92c2V0X2xhbmVfZjE2KGZsb2F0MTZ4NF90IHYxKSB7CiAgIGZsb2F0MTZfdCBhID0gdmdldF9sYW5lX2YxNih2MSwgMCk7CiAgIHJldHVybiB2c2V0X2xhbmVfZjE2KGEsIHYxLCAzKTsKIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFszXSwgIHt7dlswLTldK319LmhbMF0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnNldHFfbGFuZV9mMTZfMgotZmxvYXQxNng4X3QgdGVzdF92c2V0cV9sYW5lX2YxNl8yKGZsb2F0MTZ4OF90IHYxKSB7CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0cV92c2V0cV9sYW5lX2YxNgorZmxvYXQxNng4X3QgdGVzdF92Z2V0cV92c2V0cV9sYW5lX2YxNihmbG9hdDE2eDhfdCB2MSkgewogICBmbG9hdDE2X3QgYSA9IHZnZXRxX2xhbmVfZjE2KHYxLCAwKTsKICAgcmV0dXJuIHZzZXRxX2xhbmVfZjE2KGEsIHYxLCA3KTsKIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFs3XSwgIHt7dlswLTldK319LmhbMF0KIH0KIAorLy8gQ0hFQ0stTEFCRUw6IHRlc3Q0X3ZzZXRfbGFuZV9mMTYKK2Zsb2F0MTZ4NF90IHRlc3Q0X3ZzZXRfbGFuZV9mMTYoZmxvYXQxNng0X3QgdjEsIGZsb2F0IGIsIGZsb2F0IGMpIHsKKyAgZmxvYXQxNl90IGEgPSAoZmxvYXQxNl90KWI7CisgIHJldHVybiB2c2V0X2xhbmVfZjE2KGEsIHYxLCAzKTsKKy8vIENIRUNLOiBmbW92IHt7d1swLTldK319LCAge3tzWzAtOV0rfX0KKy8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFszXSwgIHt7d1swLTldK319Cit9CiAKLS8vIENIRUNLOiB0ZXN0X3ZzZXRxX2xhbmVfZjE2XzMKLWZsb2F0MTZ4OF90IHRlc3RfdnNldHFfbGFuZV9mMTZfMyhmbG9hdDE2eDhfdCB2MSwgZmxvYXQgYiwgZmxvYXQgYykgeworLy8gQ0hFQ0stTEFCRUw6IHRlc3Q0X3ZzZXRxX2xhbmVfZjE2CitmbG9hdDE2eDhfdCB0ZXN0NF92c2V0cV9sYW5lX2YxNihmbG9hdDE2eDhfdCB2MSwgZmxvYXQgYiwgZmxvYXQgYykgewogICBmbG9hdDE2X3QgYSA9IChmbG9hdDE2X3QpYjsKICAgcmV0dXJuIHZzZXRxX2xhbmVfZjE2KGEsIHYxLCA3KTsKKy8vIENIRUNLOiBmbW92IHt7d1swLTldK319LCAge3tzWzAtOV0rfX0KIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFs3XSwgIHt7d1swLTldK319CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZzZXRxX2xhbmVfZjE2XzQKLWZsb2F0MTZ4OF90IHRlc3RfdnNldHFfbGFuZV9mMTZfNChmbG9hdDE2eDhfdCB2MSwgZmxvYXQgYiwgZmxvYXQgYykgeworLy8gQ0hFQ0stTEFCRUw6IHRlc3Q1X3ZzZXRfbGFuZV9mMTYKK2Zsb2F0MTZ4NF90IHRlc3Q1X3ZzZXRfbGFuZV9mMTYoZmxvYXQxNng0X3QgdjEsIGZsb2F0IGIsIGZsb2F0IGMpIHsKKyAgZmxvYXQxNl90IGEgPSAoZmxvYXQxNl90KWI7CisgIHJldHVybiB2c2V0X2xhbmVfZjE2KGEsIHYxLCAzKTsKKy8vIENIRUNLOiBmbW92IHt7d1swLTldK319LCAge3tzWzAtOV0rfX0KKy8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uaFszXSwgIHt7d1swLTldK319Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0NV92c2V0cV9sYW5lX2YxNgorZmxvYXQxNng4X3QgdGVzdDVfdnNldHFfbGFuZV9mMTYoZmxvYXQxNng4X3QgdjEsIGZsb2F0IGIsIGZsb2F0IGMpIHsKICAgZmxvYXQxNl90IGEgPSAoZmxvYXQxNl90KWIgKyAxLjA7CiAgIHJldHVybiB2c2V0cV9sYW5lX2YxNihhLCB2MSwgNyk7CisvLyBDSEVDSzogZm1vdiB7e3dbMC05XSt9fSwgIHt7c1swLTldK319CiAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmhbN10sICB7e3dbMC05XSt9fQogfQogCisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0X3ZnZXRfbGFuZV9mMTYKK2ludCB0ZXN0X3ZzZXRfdmdldF9sYW5lX2YxNihmbG9hdDE2eDRfdCBhKSB7CisgIGZsb2F0MTZ4NF90IGI7CisgIGIgPSB2c2V0X2xhbmVfZjE2KDMuNSwgYSwgMyk7CisgIGZsb2F0MTZfdCBjID0gdmdldF9sYW5lX2YxNihiLCAzKTsKKyAgcmV0dXJuIChpbnQpYzsKKy8vIENIRUNLOiBtb3Z6IHh7e1swLTldK319LCAjMworfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0cV92Z2V0cV9sYW5lX2YxNgoraW50IHRlc3RfdnNldHFfdmdldHFfbGFuZV9mMTYoZmxvYXQxNng4X3QgYSkgeworICBmbG9hdDE2eDhfdCBiOworICBiID0gdnNldHFfbGFuZV9mMTYoMy41LCBhLCA1KTsKKyAgZmxvYXQxNl90IGMgPSB2Z2V0cV9sYW5lX2YxNihiLCA1KTsKKyAgcmV0dXJuIChpbnQpYzsKKy8vIENIRUNLOiBtb3Z6IHh7e1swLTldK319LCAjMworfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVxX3A2NDoKK3BvbHk2NHgxX3QgdGVzdF92ZHVwX2xhbmVxX3A2NChwb2x5NjR4Ml90IHZlYykgeworICByZXR1cm4gdmR1cF9sYW5lcV9wNjQodmVjLCAwKTsKKy8vIENIRUNLLU5FWFQ6IHJldAorfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX2xhbmVxX3A2NF8xCitwb2x5NjR4MV90IHRlc3RfdmR1cF9sYW5lcV9wNjRfMShwb2x5NjR4Ml90IHZlYykgeworICByZXR1cm4gdmR1cF9sYW5lcV9wNjQodmVjLCAxKTsKKy8vIENIRUNLOiBkdXAge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMV0KK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9sYW5lX2YzMgorZmxvYXQzMl90IHRlc3RfdmdldF9sYW5lX2YzMl8xKGZsb2F0MzJ4Ml90IHYpIHsKKyAgcmV0dXJuIHZnZXRfbGFuZV9mMzIodiwgMSk7CisvLyBDSEVDSzogZHVwIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzFdCit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfbGFuZV9mNjQ6CitmbG9hdDY0X3QgdGVzdF92Z2V0X2xhbmVfZjY0KGZsb2F0NjR4MV90IHYpIHsKKyAgcmV0dXJuIHZnZXRfbGFuZV9mNjQodiwgMCk7CisvLyBDSEVDSy1ORVhUOiByZXQKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldHFfbGFuZV9mNjRfMQorZmxvYXQ2NF90IHRlc3RfdmdldHFfbGFuZV9mNjRfMShmbG9hdDY0eDJfdCB2KSB7CisgIHJldHVybiB2Z2V0cV9sYW5lX2Y2NCh2LCAxKTsKKy8vIENIRUNLOiBkdXAge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMV0KK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9sYW5lX2YzMjoKK2Zsb2F0MzJfdCB0ZXN0X3ZnZXRfbGFuZV9mMzIoZmxvYXQzMngyX3QgdikgeworICByZXR1cm4gdmdldF9sYW5lX2YzMih2LCAwKTsKKy8vIENIRUNLLU5FWFQ6IHJldAorfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0cV9sYW5lX2YzMjoKK2Zsb2F0MzJfdCB0ZXN0X3ZnZXRxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IHYpIHsKKyAgcmV0dXJuIHZnZXRxX2xhbmVfZjMyKHYsIDApOworLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRxX2xhbmVfZjY0OgorZmxvYXQ2NF90IHRlc3RfdmdldHFfbGFuZV9mNjQoZmxvYXQ2NHgyX3QgdikgeworICByZXR1cm4gdmdldHFfbGFuZV9mNjQodiwgMCk7CisvLyBDSEVDSy1ORVhUOiByZXQKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1jcnlwdG8uYyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tY3J5cHRvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGYzNzkuLjAwMDAwMDAKLS0tIGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1jcnlwdG8uYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vIFJFUVVJUkVTOiBhYXJjaDY0LXJlZ2lzdGVyZWQtdGFyZ2V0Ci0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCi0vLyBSVU46ICAgLXRhcmdldC1mZWF0dXJlICtjcnlwdG8gLVMgLU8zIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogbm90ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCi0vLyBSVU46ICAgLVMgLU8zIC1vIC0gJXMgMj4mMSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1OTy1DUllQVE8gJXMKLQotLy8gVGVzdCBuZXcgYWFyY2g2NCBpbnRyaW5zaWNzIGFuZCB0eXBlcwotCi0jaW5jbHVkZSA8YXJtX25lb24uaD4KLQotdWludDh4MTZfdCB0ZXN0X3ZhZXNlcV91OCh1aW50OHgxNl90IGRhdGEsIHVpbnQ4eDE2X3Qga2V5KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZXNlcV91OAotICAvLyBDSEVDSy1OTy1DUllQVE86IHdhcm5pbmc6IGltcGxpY2l0IGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uICd2YWVzZXFfdTgnIGlzIGludmFsaWQgaW4gQzk5Ci0gIHJldHVybiB2YWVzZXFfdTgoZGF0YSwga2V5KTsKLSAgLy8gQ0hFQ0s6IGFlc2Uge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKLX0KLQotdWludDh4MTZfdCB0ZXN0X3ZhZXNkcV91OCh1aW50OHgxNl90IGRhdGEsIHVpbnQ4eDE2X3Qga2V5KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZXNkcV91OAotICByZXR1cm4gdmFlc2RxX3U4KGRhdGEsIGtleSk7Ci0gIC8vIENIRUNLOiBhZXNkIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCi19Ci0KLXVpbnQ4eDE2X3QgdGVzdF92YWVzbWNxX3U4KHVpbnQ4eDE2X3QgZGF0YSkgewotICAvLyBDSEVDSzogdGVzdF92YWVzbWNxX3U4Ci0gIHJldHVybiB2YWVzbWNxX3U4KGRhdGEpOwotICAvLyBDSEVDSzogYWVzbWMge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKLX0KLQotdWludDh4MTZfdCB0ZXN0X3ZhZXNpbWNxX3U4KHVpbnQ4eDE2X3QgZGF0YSkgewotICAvLyBDSEVDSzogdGVzdF92YWVzaW1jcV91OAotICByZXR1cm4gdmFlc2ltY3FfdTgoZGF0YSk7Ci0gIC8vIENIRUNLOiBhZXNpbWMge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKLX0KLQotdWludDMyX3QgdGVzdF92c2hhMWhfdTMyKHVpbnQzMl90IGhhc2hfZSkgewotICAvLyBDSEVDSzogdGVzdF92c2hhMWhfdTMyCi0gIHJldHVybiB2c2hhMWhfdTMyKGhhc2hfZSk7Ci0gIC8vIENIRUNLOiBzaGExaCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KLX0KLQotdWludDMyeDRfdCB0ZXN0X3ZzaGExc3UxcV91MzIodWludDMyeDRfdCB0dzBfMywgdWludDMyeDRfdCB3MTJfMTUpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNoYTFzdTFxX3UzMgotICByZXR1cm4gdnNoYTFzdTFxX3UzMih0dzBfMywgdzEyXzE1KTsKLSAgLy8gQ0hFQ0s6IHNoYTFzdTEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCi19Ci0KLXVpbnQzMng0X3QgdGVzdF92c2hhMjU2c3UwcV91MzIodWludDMyeDRfdCB3MF8zLCB1aW50MzJ4NF90IHc0XzcpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNoYTI1NnN1MHFfdTMyCi0gIHJldHVybiB2c2hhMjU2c3UwcV91MzIodzBfMywgdzRfNyk7Ci0gIC8vIENIRUNLOiBzaGEyNTZzdTAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCi19Ci0KLXVpbnQzMng0X3QgdGVzdF92c2hhMWNxX3UzMih1aW50MzJ4NF90IGhhc2hfYWJjZCwgdWludDMyX3QgaGFzaF9lLCB1aW50MzJ4NF90IHdrKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaGExY3FfdTMyCi0gIHJldHVybiB2c2hhMWNxX3UzMihoYXNoX2FiY2QsIGhhc2hfZSwgd2spOwotICAvLyBDSEVDSzogc2hhMWMge3txWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS40cwotfQotCi11aW50MzJ4NF90IHRlc3RfdnNoYTFwcV91MzIodWludDMyeDRfdCBoYXNoX2FiY2QsIHVpbnQzMl90IGhhc2hfZSwgdWludDMyeDRfdCB3aykgewotICAvLyBDSEVDSzogdGVzdF92c2hhMXBxX3UzMgotICByZXR1cm4gdnNoYTFwcV91MzIoaGFzaF9hYmNkLCBoYXNoX2UsIHdrKTsKLSAgLy8gQ0hFQ0s6IHNoYTFwIHt7cVswLTldK319LCB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uNHMKLX0KLQotdWludDMyeDRfdCB0ZXN0X3ZzaGExbXFfdTMyKHVpbnQzMng0X3QgaGFzaF9hYmNkLCB1aW50MzJfdCBoYXNoX2UsIHVpbnQzMng0X3Qgd2spIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNoYTFtcV91MzIKLSAgcmV0dXJuIHZzaGExbXFfdTMyKGhhc2hfYWJjZCwgaGFzaF9lLCB3ayk7Ci0gIC8vIENIRUNLOiBzaGExbSB7e3FbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7dlswLTldK319LjRzCi19Ci0KLXVpbnQzMng0X3QgdGVzdF92c2hhMXN1MHFfdTMyKHVpbnQzMng0X3QgdzBfMywgdWludDMyeDRfdCB3NF83LCB1aW50MzJ4NF90IHc4XzExKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaGExc3UwcV91MzIKLSAgcmV0dXJuIHZzaGExc3UwcV91MzIodzBfMywgdzRfNywgdzhfMTEpOwotICAvLyBDSEVDSzogc2hhMXN1MCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCi19Ci0KLXVpbnQzMng0X3QgdGVzdF92c2hhMjU2aHFfdTMyKHVpbnQzMng0X3QgaGFzaF9hYmNkLCB1aW50MzJ4NF90IGhhc2hfZWZnaCwgdWludDMyeDRfdCB3aykgewotICAvLyBDSEVDSzogdGVzdF92c2hhMjU2aHFfdTMyCi0gIHJldHVybiB2c2hhMjU2aHFfdTMyKGhhc2hfYWJjZCwgaGFzaF9lZmdoLCB3ayk7Ci0gIC8vIENIRUNLOiBzaGEyNTZoIHt7cVswLTldK319LCB7e3FbMC05XSt9fSwge3t2WzAtOV0rfX0uNHMKLX0KLQotdWludDMyeDRfdCB0ZXN0X3ZzaGEyNTZoMnFfdTMyKHVpbnQzMng0X3QgaGFzaF9lZmdoLCB1aW50MzJ4NF90IGhhc2hfYWJjZCwgdWludDMyeDRfdCB3aykgewotICAvLyBDSEVDSzogdGVzdF92c2hhMjU2aDJxX3UzMgotICByZXR1cm4gdnNoYTI1NmgycV91MzIoaGFzaF9lZmdoLCBoYXNoX2FiY2QsIHdrKTsKLSAgLy8gQ0hFQ0s6IHNoYTI1NmgyIHt7cVswLTldK319LCB7e3FbMC05XSt9fSwge3t2WzAtOV0rfX0uNHMKLX0KLQotdWludDMyeDRfdCB0ZXN0X3ZzaGEyNTZzdTFxX3UzMih1aW50MzJ4NF90IHR3MF8zLCB1aW50MzJ4NF90IHc4XzExLCB1aW50MzJ4NF90IHcxMl8xNSkgewotICAvLyBDSEVDSzogdGVzdF92c2hhMjU2c3UxcV91MzIKLSAgcmV0dXJuIHZzaGEyNTZzdTFxX3UzMih0dzBfMywgdzhfMTEsIHcxMl8xNSk7Ci0gIC8vIENIRUNLOiBzaGEyNTZzdTEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1leHRyYWN0LmMgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWV4dHJhY3QuYwppbmRleCBmYWYzNWFmLi43N2Q1NzRjIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWV4dHJhY3QuYworKysgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWV4dHJhY3QuYwpAQCAtMSwxNDggKzEsMTUxIEBACiAvLyBSRVFVSVJFUzogYWFyY2g2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCiAvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1ub25lLWxpbnV4LWdudSBcCisvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIC8vIFRlc3QgbmV3IGFhcmNoNjQgaW50cmluc2ljcyBhbmQgdHlwZXMKIAogI2luY2x1ZGUgPGFybV9uZW9uLmg+CiAKIGludDh4OF90IHRlc3RfdmV4dF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZleHRfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dF9zOAogICByZXR1cm4gdmV4dF9zOChhLCBiLCAyKTsKLSAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMHgyCisgIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgI3t7KDB4KT8yfX0KIH0KIAogaW50MTZ4NF90IHRlc3RfdmV4dF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZleHRfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZleHRfczE2CiAgIHJldHVybiB2ZXh0X3MxNihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMHg2CisgIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgI3t7KDB4KT82fX0KIH0KIAogaW50MzJ4Ml90IHRlc3RfdmV4dF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZleHRfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZleHRfczMyCiAgIHJldHVybiB2ZXh0X3MzMihhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMHg0CisgIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgI3t7KDB4KT80fX0KIH0KIAogaW50NjR4MV90IHRlc3RfdmV4dF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZleHRfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZleHRfczY0CiAgIHJldHVybiB2ZXh0X3M2NChhLCBiLCAwKTsKIH0KIAogaW50OHgxNl90IHRlc3RfdmV4dHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZleHRxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZleHRxX3M4CiAgIHJldHVybiB2ZXh0cV9zOChhLCBiLCAyKTsKLSAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMHgyCisgIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgI3t7KDB4KT8yfX0KIH0KIAogaW50MTZ4OF90IHRlc3RfdmV4dHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92ZXh0cV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dHFfczE2CiAgIHJldHVybiB2ZXh0cV9zMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzB4NgorICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICN7eygweCk/Nn19CiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZleHRxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmV4dHFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZleHRxX3MzMgogICByZXR1cm4gdmV4dHFfczMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICMweDQKKyAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAje3soMHgpPzR9fQogfQogCiBpbnQ2NHgyX3QgdGVzdF92ZXh0cV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZleHRxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZXh0cV9zNjQKICAgcmV0dXJuIHZleHRxX3M2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMHg4CisgIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgI3t7KDB4KT84fX0KIH0KIAogdWludDh4OF90IHRlc3RfdmV4dF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZXh0X3U4CiAgIHJldHVybiB2ZXh0X3U4KGEsIGIsIDIpOwotICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICMweDIKKyAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAje3soMHgpPzJ9fQogfQogCiB1aW50MTZ4NF90IHRlc3RfdmV4dF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dF91MTYKICAgcmV0dXJuIHZleHRfdTE2KGEsIGIsIDMpOwotICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICMweDYKKyAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAje3soMHgpPzZ9fQogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmV4dF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dF91MzIKICAgcmV0dXJuIHZleHRfdTMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICMweDQKKyAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAje3soMHgpPzR9fQogfQogCiB1aW50NjR4MV90IHRlc3RfdmV4dF91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dF91NjQKICAgcmV0dXJuIHZleHRfdTY0KGEsIGIsIDApOwogfQogCiB1aW50OHgxNl90IHRlc3RfdmV4dHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmV4dHFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dHFfdTgKICAgcmV0dXJuIHZleHRxX3U4KGEsIGIsIDIpOwotICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICMweDIKKyAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAje3soMHgpPzJ9fQogfQogCiB1aW50MTZ4OF90IHRlc3RfdmV4dHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZleHRxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZXh0cV91MTYKICAgcmV0dXJuIHZleHRxX3UxNihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMHg2CisgIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgI3t7KDB4KT82fX0KIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZleHRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92ZXh0cV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dHFfdTMyCiAgIHJldHVybiB2ZXh0cV91MzIoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzB4NAorICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICN7eygweCk/NH19CiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92ZXh0cV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmV4dHFfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZleHRxX3U2NAogICByZXR1cm4gdmV4dHFfdTY0KGEsIGIsIDEpOwotICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICMweDgKKyAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAje3soMHgpPzh9fQogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZleHRfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dF9mMzIKICAgcmV0dXJuIHZleHRfZjMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICMweDQKKyAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAje3soMHgpPzR9fQogfQogCiBmbG9hdDY0eDFfdCB0ZXN0X3ZleHRfZjY0KGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dF9mNjQKICAgcmV0dXJuIHZleHRfZjY0KGEsIGIsIDApOwogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZleHRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZleHRxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZXh0cV9mMzIKICAgcmV0dXJuIHZleHRxX2YzMihhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMHg0CisgIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgI3t7KDB4KT80fX0KIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92ZXh0cV9mNjQoZmxvYXQ2NHgyX3QgYSwgZmxvYXQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92ZXh0cV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dHFfZjY0CiAgIHJldHVybiB2ZXh0cV9mNjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzB4OAorICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICN7eygweCk/OH19CiB9CiAKIHBvbHk4eDhfdCB0ZXN0X3ZleHRfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZleHRfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dF9wOAogICByZXR1cm4gdmV4dF9wOChhLCBiLCAyKTsKLSAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMHgyCisgIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgI3t7KDB4KT8yfX0KIH0KIAogcG9seTE2eDRfdCB0ZXN0X3ZleHRfcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZleHRfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZleHRfcDE2CiAgIHJldHVybiB2ZXh0X3AxNihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMHg2CisgIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgI3t7KDB4KT82fX0KIH0KIAogcG9seTh4MTZfdCB0ZXN0X3ZleHRxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZleHRxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZleHRxX3A4CiAgIHJldHVybiB2ZXh0cV9wOChhLCBiLCAyKTsKLSAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMHgyCisgIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgI3t7KDB4KT8yfX0KIH0KIAogcG9seTE2eDhfdCB0ZXN0X3ZleHRxX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92ZXh0cV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dHFfcDE2CiAgIHJldHVybiB2ZXh0cV9wMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBleHQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzB4NgorICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICN7eygweCk/Nn19CiB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWZjdnQtaW50cmluc2ljcy5jIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1mY3Z0LWludHJpbnNpY3MuYwppbmRleCA5OGYxMzg5Li43NzAyMmY1IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWZjdnQtaW50cmluc2ljcy5jCisrKyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tZmN2dC1pbnRyaW5zaWNzLmMKQEAgLTEsMTMzICsxLDEzNiBAQAogLy8gUkVRVUlSRVM6IGFhcmNoNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBhcm02NC1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NC1ub25lLWxpbnV4LWdudSAtdGFyZ2V0LWZlYXR1cmUgK25lb24gXAogLy8gUlVOOiAgIC1mZnAtY29udHJhY3Q9ZmFzdCAtUyAtTzMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtbm9uZS1saW51eC1nbnUgXAorLy8gUlVOOiAgIC1mZnAtY29udHJhY3Q9ZmFzdCAtUyAtTzMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiAvLyBUZXN0IG5ldyBhYXJjaDY0IGludHJpbnNpY3MgYW5kIHR5cGVzCiAKICNpbmNsdWRlIDxhcm1fbmVvbi5oPgogCiBmbG9hdDMyX3QgdGVzdF92Y3Z0eGRfZjMyX2Y2NChmbG9hdDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dHhkX2YzMl9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnR4ZF9mMzJfZjY0CiAvLyBDSEVDSzogZmN2dHhuIHt7c1swLTldK319LCB7e2RbMC05XSt9fQogICByZXR1cm4gKGZsb2F0MzJfdCl2Y3Z0eGRfZjMyX2Y2NChhKTsKIH0KIAogaW50MzJfdCB0ZXN0X3ZjdnRhc19zMzJfZjMyKGZsb2F0MzJfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92Y3Z0YXNfczMyX2YzMgotLy8gQ0hFQ0s6IGZjdnRhcyB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRhc19zMzJfZjMyCisvLyBDSEVDSzogZmN2dGFzIHt7W3dzXVswLTldK319LCB7e3NbMC05XSt9fQogICByZXR1cm4gKGludDMyX3QpdmN2dGFzX3MzMl9mMzIoYSk7CiB9CiAKIGludDY0X3QgdGVzdF90ZXN0X3ZjdnRhZF9zNjRfZjY0KGZsb2F0NjRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF90ZXN0X3ZjdnRhZF9zNjRfZjY0Ci0vLyBDSEVDSzogZmN2dGFzIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdGVzdF92Y3Z0YWRfczY0X2Y2NAorLy8gQ0hFQ0s6IGZjdnRhcyB7e1tkeF1bMC05XSt9fSwge3tkWzAtOV0rfX0KICAgcmV0dXJuIChpbnQ2NF90KXZjdnRhZF9zNjRfZjY0KGEpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjdnRhc191MzJfZjMyKGZsb2F0MzJfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92Y3Z0YXNfdTMyX2YzMgotLy8gQ0hFQ0s6IGZjdnRhdSB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRhc191MzJfZjMyCisvLyBDSEVDSzogZmN2dGF1IHt7W3dzXVswLTldK319LCB7e3NbMC05XSt9fQogICByZXR1cm4gKHVpbnQzMl90KXZjdnRhc191MzJfZjMyKGEpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjdnRhZF91NjRfZjY0KGZsb2F0NjRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92Y3Z0YWRfdTY0X2Y2NAotLy8gQ0hFQ0s6IGZjdnRhdSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRhZF91NjRfZjY0CisvLyBDSEVDSzogZmN2dGF1IHt7W3hkXVswLTldK319LCB7e2RbMC05XSt9fQogICByZXR1cm4gKHVpbnQ2NF90KXZjdnRhZF91NjRfZjY0KGEpOwogfQogCiBpbnQzMl90IHRlc3RfdmN2dG1zX3MzMl9mMzIoZmxvYXQzMl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjdnRtc19zMzJfZjMyCi0vLyBDSEVDSzogZmN2dG1zIHt7c1swLTldK319LCB7e3NbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dG1zX3MzMl9mMzIKKy8vIENIRUNLOiBmY3Z0bXMge3tbc3ddWzAtOV0rfX0sIHt7c1swLTldK319CiAgIHJldHVybiAoaW50MzJfdCl2Y3Z0bXNfczMyX2YzMihhKTsKIH0KIAogaW50NjRfdCB0ZXN0X3ZjdnRtZF9zNjRfZjY0KGZsb2F0NjRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92Y3Z0bWRfczY0X2Y2NAotLy8gQ0hFQ0s6IGZjdnRtcyB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRtZF9zNjRfZjY0CisvLyBDSEVDSzogZmN2dG1zIHt7W2R4XVswLTldK319LCB7e2RbMC05XSt9fQogICByZXR1cm4gKGludDY0X3QpdmN2dG1kX3M2NF9mNjQoYSk7CiB9CiAKIHVpbnQzMl90IHRlc3RfdmN2dG1zX3UzMl9mMzIoZmxvYXQzMl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjdnRtc191MzJfZjMyCi0vLyBDSEVDSzogZmN2dG11IHt7c1swLTldK319LCB7e3NbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dG1zX3UzMl9mMzIKKy8vIENIRUNLOiBmY3Z0bXUge3tbd3NdWzAtOV0rfX0sIHt7c1swLTldK319CiAgIHJldHVybiAodWludDMyX3QpdmN2dG1zX3UzMl9mMzIoYSk7CiB9CiAKIHVpbnQ2NF90IHRlc3RfdmN2dG1kX3U2NF9mNjQoZmxvYXQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjdnRtZF91NjRfZjY0Ci0vLyBDSEVDSzogZmN2dG11IHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dG1kX3U2NF9mNjQKKy8vIENIRUNLOiBmY3Z0bXUge3tbeGRdWzAtOV0rfX0sIHt7ZFswLTldK319CiAgIHJldHVybiAodWludDY0X3QpdmN2dG1kX3U2NF9mNjQoYSk7CiB9CiAKIGludDMyX3QgdGVzdF92Y3Z0bnNfczMyX2YzMihmbG9hdDMyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dG5zX3MzMl9mMzIKLS8vIENIRUNLOiBmY3Z0bnMge3tzWzAtOV0rfX0sIHt7c1swLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0bnNfczMyX2YzMgorLy8gQ0hFQ0s6IGZjdnRucyB7e1tzd11bMC05XSt9fSwge3tzWzAtOV0rfX0KICAgcmV0dXJuIChpbnQzMl90KXZjdnRuc19zMzJfZjMyKGEpOwogfQogCiBpbnQ2NF90IHRlc3RfdmN2dG5kX3M2NF9mNjQoZmxvYXQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjdnRuZF9zNjRfZjY0Ci0vLyBDSEVDSzogZmN2dG5zIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dG5kX3M2NF9mNjQKKy8vIENIRUNLOiBmY3Z0bnMge3tbZHhdWzAtOV0rfX0sIHt7ZFswLTldK319CiAgIHJldHVybiAoaW50NjRfdCl2Y3Z0bmRfczY0X2Y2NChhKTsKIH0KIAogdWludDMyX3QgdGVzdF92Y3Z0bnNfdTMyX2YzMihmbG9hdDMyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dG5zX3UzMl9mMzIKLS8vIENIRUNLOiBmY3Z0bnUge3tzWzAtOV0rfX0sIHt7c1swLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0bnNfdTMyX2YzMgorLy8gQ0hFQ0s6IGZjdnRudSB7e1tzd11bMC05XSt9fSwge3tzWzAtOV0rfX0KICAgcmV0dXJuICh1aW50MzJfdCl2Y3Z0bnNfdTMyX2YzMihhKTsKIH0KIAogdWludDY0X3QgdGVzdF92Y3Z0bmRfdTY0X2Y2NChmbG9hdDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dG5kX3U2NF9mNjQKLS8vIENIRUNLOiBmY3Z0bnUge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0bmRfdTY0X2Y2NAorLy8gQ0hFQ0s6IGZjdnRudSB7e1tkeF1bMC05XSt9fSwge3tkWzAtOV0rfX0KICAgcmV0dXJuICh1aW50NjRfdCl2Y3Z0bmRfdTY0X2Y2NChhKTsKIH0KIAogaW50MzJfdCB0ZXN0X3ZjdnRwc19zMzJfZjMyKGZsb2F0MzJfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92Y3Z0cHNfczMyX2YzMgotLy8gQ0hFQ0s6IGZjdnRwcyB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRwc19zMzJfZjMyCisvLyBDSEVDSzogZmN2dHBzIHt7W3N3XVswLTldK319LCB7e3NbMC05XSt9fQogICByZXR1cm4gKGludDMyX3QpdmN2dHBzX3MzMl9mMzIoYSk7CiB9CiAKIGludDY0X3QgdGVzdF92Y3Z0cGRfczY0X2Y2NChmbG9hdDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dHBkX3M2NF9mNjQKLS8vIENIRUNLOiBmY3Z0cHMge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0cGRfczY0X2Y2NAorLy8gQ0hFQ0s6IGZjdnRwcyB7e1tkeF1bMC05XSt9fSwge3tkWzAtOV0rfX0KICAgcmV0dXJuIChpbnQ2NF90KXZjdnRwZF9zNjRfZjY0KGEpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjdnRwc191MzJfZjMyKGZsb2F0MzJfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92Y3Z0cHNfdTMyX2YzMgotLy8gQ0hFQ0s6IGZjdnRwdSB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRwc191MzJfZjMyCisvLyBDSEVDSzogZmN2dHB1IHt7W3N3XVswLTldK319LCB7e3NbMC05XSt9fQogICByZXR1cm4gKHVpbnQzMl90KXZjdnRwc191MzJfZjMyKGEpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjdnRwZF91NjRfZjY0KGZsb2F0NjRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92Y3Z0cGRfdTY0X2Y2NAotLy8gQ0hFQ0s6IGZjdnRwdSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRwZF91NjRfZjY0CisvLyBDSEVDSzogZmN2dHB1IHt7W2R4XVswLTldK319LCB7e2RbMC05XSt9fQogICByZXR1cm4gKHVpbnQ2NF90KXZjdnRwZF91NjRfZjY0KGEpOwogfQogCiBpbnQzMl90IHRlc3RfdmN2dHNfczMyX2YzMihmbG9hdDMyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dHNfczMyX2YzMgotLy8gQ0hFQ0s6IGZjdnR6cyB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRzX3MzMl9mMzIKKy8vIENIRUNLOiBmY3Z0enMge3tbc3ddWzAtOV0rfX0sIHt7c1swLTldK319CiAgIHJldHVybiAoaW50MzJfdCl2Y3Z0c19zMzJfZjMyKGEpOwogfQogCiBpbnQ2NF90IHRlc3RfdmN2dGRfczY0X2Y2NChmbG9hdDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dGRfczY0X2Y2NAotLy8gQ0hFQ0s6IGZjdnR6cyB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRkX3M2NF9mNjQKKy8vIENIRUNLOiBmY3Z0enMge3tbZHhdWzAtOV0rfX0sIHt7ZFswLTldK319CiAgIHJldHVybiAoaW50NjRfdCl2Y3Z0ZF9zNjRfZjY0KGEpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjdnRzX3UzMl9mMzIoZmxvYXQzMl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjdnRzX3UzMl9mMzIKLS8vIENIRUNLOiBmY3Z0enUge3tzWzAtOV0rfX0sIHt7c1swLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0c191MzJfZjMyCisvLyBDSEVDSzogZmN2dHp1IHt7W3N3XVswLTldK319LCB7e3NbMC05XSt9fQogICByZXR1cm4gKHVpbnQzMl90KXZjdnRzX3UzMl9mMzIoYSk7CiB9CiAKIHVpbnQ2NF90IHRlc3RfdmN2dGRfdTY0X2Y2NChmbG9hdDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dGRfdTY0X2Y2NAotLy8gQ0hFQ0s6IGZjdnR6dSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRkX3U2NF9mNjQKKy8vIENIRUNLOiBmY3Z0enUge3tbZHhdWzAtOV0rfX0sIHt7ZFswLTldK319CiAgIHJldHVybiAodWludDY0X3QpdmN2dGRfdTY0X2Y2NChhKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tZm1hLmMgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWZtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NjAzYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWZtYS5jCkBAIC0wLDAgKzEsMjA0IEBACisvLyBSRVFVSVJFUzogYWFyY2g2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCisvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stRk1BICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCisvLyBSVU46ICAgLVMgLU8zIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LW5vbmUtbGludXgtZ251IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisKKy8vIFRlc3QgbmV3IGFhcmNoNjQgaW50cmluc2ljcyBhbmQgdHlwZXMKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK2Zsb2F0MzJ4Ml90IHRlc3Rfdm1sYV9uX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyX3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX25fZjMyCisgIHJldHVybiB2bWxhX25fZjMyKGEsIGIsIGMpOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IGZhZGQge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworICAvLyBDSEVDSy1GTUE6IGR1cCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1swXQorICAvLyBDSEVDSy1GTUE6IGZtbGEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworfQorCitmbG9hdDMyeDRfdCB0ZXN0X3ZtbGFxX25fZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJfdCBjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX25fZjMyCisgIHJldHVybiB2bWxhcV9uX2YzMihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGZtdWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCisgIC8vIENIRUNLOiBmYWRkIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKKyAgLy8gQ0hFQ0stRk1BOiBkdXAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0stRk1BOiBmbWxhIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKK30KKworZmxvYXQ2NHgyX3QgdGVzdF92bWxhcV9uX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiLCBmbG9hdDY0X3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV9uX2Y2NAorICByZXR1cm4gdm1sYXFfbl9mNjQoYSwgYiwgYyk7CisgIC8vIENIRUNLOiBmbXVsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uZFswXQorICAvLyBDSEVDSzogZmFkZCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCisgIC8vIENIRUNLLUZNQTogZHVwIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLLUZNQTogZm1sYSB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCit9CisKK2Zsb2F0MzJ4NF90IHRlc3Rfdm1sc3Ffbl9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3Ffbl9mMzIKKyAgcmV0dXJuIHZtbHNxX25fZjMyKGEsIGIsIGMpOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IGZzdWIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cworICAvLyBDSEVDSy1GTUE6IGR1cCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1swXQorICAvLyBDSEVDSy1GTUE6IGZtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cworfQorCitmbG9hdDMyeDJfdCB0ZXN0X3ZtbHNfbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYiwgZmxvYXQzMl90IGMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19uX2YzMgorICByZXR1cm4gdm1sc19uX2YzMihhLCBiLCBjKTsKKyAgLy8gQ0hFQ0s6IGZtdWwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCisgIC8vIENIRUNLOiBmc3ViIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKKyAgLy8gQ0hFQ0stRk1BOiBkdXAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0stRk1BOiBmbWxzIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKK30KKworZmxvYXQ2NHgyX3QgdGVzdF92bWxzcV9uX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiLCBmbG9hdDY0X3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzcV9uX2Y2NAorICByZXR1cm4gdm1sc3Ffbl9mNjQoYSwgYiwgYyk7CisgIC8vIENIRUNLOiBmbXVsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uZFswXQorICAvLyBDSEVDSzogZnN1YiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCisgIC8vIENIRUNLLUZNQTogZHVwIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLLUZNQTogZm1scyB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCit9CisKK2Zsb2F0MzJ4Ml90IHRlc3Rfdm1sYV9sYW5lX2YzMl8wKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYV9sYW5lX2YzMl8wCisgIHJldHVybiB2bWxhX2xhbmVfZjMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IGZhZGQge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworICAvLyBDSEVDSy1GTUE6IGZtbGEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK2Zsb2F0MzJ4NF90IHRlc3Rfdm1sYXFfbGFuZV9mMzJfMChmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDJfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX2xhbmVfZjMyXzAKKyAgcmV0dXJuIHZtbGFxX2xhbmVfZjMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IGZhZGQge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cworICAvLyBDSEVDSy1GTUE6IGZtbGEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK2Zsb2F0MzJ4Ml90IHRlc3Rfdm1sYV9sYW5lcV9mMzJfMChmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFfbGFuZXFfZjMyXzAKKyAgcmV0dXJuIHZtbGFfbGFuZXFfZjMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IGZhZGQge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworICAvLyBDSEVDSy1GTUE6IGZtbGEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK2Zsb2F0MzJ4NF90IHRlc3Rfdm1sYXFfbGFuZXFfZjMyXzAoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMng0X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV9sYW5lcV9mMzJfMAorICByZXR1cm4gdm1sYXFfbGFuZXFfZjMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IGZhZGQge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cworICAvLyBDSEVDSy1GTUE6IGZtbGEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK2Zsb2F0MzJ4Ml90IHRlc3Rfdm1sc19sYW5lX2YzMl8wKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19sYW5lX2YzMl8wCisgIHJldHVybiB2bWxzX2xhbmVfZjMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IGZzdWIge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworICAvLyBDSEVDSy1GTUE6IGZtbHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK2Zsb2F0MzJ4NF90IHRlc3Rfdm1sc3FfbGFuZV9mMzJfMChmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDJfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNxX2xhbmVfZjMyXzAKKyAgcmV0dXJuIHZtbHNxX2xhbmVfZjMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IGZzdWIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cworICAvLyBDSEVDSy1GTUE6IGZtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK2Zsb2F0MzJ4Ml90IHRlc3Rfdm1sc19sYW5lcV9mMzJfMChmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDRfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNfbGFuZXFfZjMyXzAKKyAgcmV0dXJuIHZtbHNfbGFuZXFfZjMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IGZzdWIge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworICAvLyBDSEVDSy1GTUE6IGZtbHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK2Zsb2F0MzJ4NF90IHRlc3Rfdm1sc3FfbGFuZXFfZjMyXzAoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYiwgZmxvYXQzMng0X3QgdikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzcV9sYW5lcV9mMzJfMAorICByZXR1cm4gdm1sc3FfbGFuZXFfZjMyKGEsIGIsIHYsIDApOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMF0KKyAgLy8gQ0hFQ0s6IGZzdWIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cworICAvLyBDSEVDSy1GTUE6IGZtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzBdCit9CisKK2Zsb2F0MzJ4Ml90IHRlc3Rfdm1sYV9sYW5lX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiLCBmbG9hdDMyeDJfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFfbGFuZV9mMzIKKyAgcmV0dXJuIHZtbGFfbGFuZV9mMzIoYSwgYiwgdiwgMSk7CisgIC8vIENIRUNLOiBmbXVsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQorICAvLyBDSEVDSzogZmFkZCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCisgIC8vIENIRUNLLUZNQTogZm1sYSB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbMV0KK30KKworZmxvYXQzMng0X3QgdGVzdF92bWxhcV9sYW5lX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiLCBmbG9hdDMyeDJfdCB2KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX2xhbmVfZjMyCisgIHJldHVybiB2bWxhcV9sYW5lX2YzMihhLCBiLCB2LCAxKTsKKyAgLy8gQ0hFQ0s6IGZtdWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzFdCisgIC8vIENIRUNLOiBmYWRkIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKKyAgLy8gQ0hFQ0stRk1BOiBmbWxhIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1sxXQorfQorCitmbG9hdDMyeDJfdCB0ZXN0X3ZtbGFfbGFuZXFfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYV9sYW5lcV9mMzIKKyAgcmV0dXJuIHZtbGFfbGFuZXFfZjMyKGEsIGIsIHYsIDMpOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbM10KKyAgLy8gQ0hFQ0s6IGZhZGQge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworICAvLyBDSEVDSy1GTUE6IGZtbGEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCit9CisKK2Zsb2F0MzJ4NF90IHRlc3Rfdm1sYXFfbGFuZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYXFfbGFuZXFfZjMyCisgIHJldHVybiB2bWxhcV9sYW5lcV9mMzIoYSwgYiwgdiwgMyk7CisgIC8vIENIRUNLOiBmbXVsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1szXQorICAvLyBDSEVDSzogZmFkZCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCisgIC8vIENIRUNLLUZNQTogZm1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbM10KK30KKworZmxvYXQzMngyX3QgdGVzdF92bWxzX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4Ml90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19sYW5lX2YzMgorICByZXR1cm4gdm1sc19sYW5lX2YzMihhLCBiLCB2LCAxKTsKKyAgLy8gQ0hFQ0s6IGZtdWwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzFdCisgIC8vIENIRUNLOiBmc3ViIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKKyAgLy8gQ0hFQ0stRk1BOiBmbWxzIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uc1sxXQorfQorCitmbG9hdDMyeDRfdCB0ZXN0X3ZtbHNxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4Ml90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfbGFuZV9mMzIKKyAgcmV0dXJuIHZtbHNxX2xhbmVfZjMyKGEsIGIsIHYsIDEpOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbMV0KKyAgLy8gQ0hFQ0s6IGZzdWIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cworICAvLyBDSEVDSy1GTUE6IGZtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS5zWzFdCit9CitmbG9hdDMyeDJfdCB0ZXN0X3ZtbHNfbGFuZXFfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIsIGZsb2F0MzJ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19sYW5lcV9mMzIKKyAgcmV0dXJuIHZtbHNfbGFuZXFfZjMyKGEsIGIsIHYsIDMpOworICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LnNbM10KKyAgLy8gQ0hFQ0s6IGZzdWIge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworICAvLyBDSEVDSy1GTUE6IGZtbHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS5zWzNdCit9CisKK2Zsb2F0MzJ4NF90IHRlc3Rfdm1sc3FfbGFuZXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIsIGZsb2F0MzJ4NF90IHYpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfbGFuZXFfZjMyCisgIHJldHVybiB2bWxzcV9sYW5lcV9mMzIoYSwgYiwgdiwgMyk7CisgIC8vIENIRUNLOiBmbXVsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uc1szXQorICAvLyBDSEVDSzogZnN1YiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCisgIC8vIENIRUNLLUZNQTogZm1scyB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LnNbM10KK30KKworZmxvYXQ2NHgyX3QgdGVzdF92Zm1hcV9uX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiLCBmbG9hdDY0X3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hcV9uX2Y2NDoKKyAgcmV0dXJuIHZmbWFxX25fZjY0KGEsIGIsIGMpOworICAvLyBDSEVDSzogZm1sYSB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK1wuMmR8dlswLTldK1wuZFxbMFxdfX0KK30KKworZmxvYXQ2NHgyX3QgdGVzdF92Zm1zcV9uX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiLCBmbG9hdDY0X3QgYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1zcV9uX2Y2NDoKKyAgcmV0dXJuIHZmbXNxX25fZjY0KGEsIGIsIGMpOworICAvLyBDSEVDSzogZm1scyB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK1wuMmR8dlswLTldK1wuZFxbMFxdfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24taW50cmluc2ljcy5jIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1pbnRyaW5zaWNzLmMKaW5kZXggNmU5YjdmMS4uNGU4YzQwNSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1pbnRyaW5zaWNzLmMKKysrIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1pbnRyaW5zaWNzLmMKQEAgLTEsMTA5ICsxLDExMiBAQAogLy8gUkVRVUlSRVM6IGFhcmNoNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBhcm02NC1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NC1ub25lLWxpbnV4LWdudSAtdGFyZ2V0LWZlYXR1cmUgK25lb24gXAotLy8gUlVOOiAgIC1mZnAtY29udHJhY3Q9ZmFzdCAtUyAtTzMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAgIC1mZnAtY29udHJhY3Q9ZmFzdCAtUyAtTzMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSyAtLWNoZWNrLXByZWZpeD1DSEVDSy1BQVJDSDY0CisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1ub25lLWxpbnV4LWdudSBcCisvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLIC0tY2hlY2stcHJlZml4PUNIRUNLLUFSTTY0CiAKIC8vIFRlc3QgbmV3IGFhcmNoNjQgaW50cmluc2ljcyBhbmQgdHlwZXMKIAogI2luY2x1ZGUgPGFybV9uZW9uLmg+CiAKIGludDh4OF90IHRlc3RfdmFkZF9zOChpbnQ4eDhfdCB2MSwgaW50OHg4X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZhZGRfczgKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRfczgKICAgcmV0dXJuIHZhZGRfczgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGFkZCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZhZGRfczE2KGludDE2eDRfdCB2MSwgaW50MTZ4NF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92YWRkX3MxNgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZF9zMTYKICAgcmV0dXJuIHZhZGRfczE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBhZGQge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQzMngyX3QgdGVzdF92YWRkX3MzMihpbnQzMngyX3QgdjEsIGludDMyeDJfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdmFkZF9zMzIKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRfczMyCiAgIHJldHVybiB2YWRkX3MzMih2MSwgdjIpOwogICAvLyBDSEVDSzogYWRkIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50NjR4MV90IHRlc3RfdmFkZF9zNjQoaW50NjR4MV90IHYxLCBpbnQ2NHgxX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZF9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZF9zNjQKICAgcmV0dXJuIHZhZGRfczY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBhZGQge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZhZGRfZjMyKGZsb2F0MzJ4Ml90IHYxLCBmbG9hdDMyeDJfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdmFkZF9mMzIKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRfZjMyCiAgIHJldHVybiB2YWRkX2YzMih2MSwgdjIpOwogICAvLyBDSEVDSzogZmFkZCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZhZGRfdTgodWludDh4OF90IHYxLCB1aW50OHg4X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZhZGRfdTgKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRfdTgKICAgcmV0dXJuIHZhZGRfdTgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGFkZCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92YWRkX3UxNih1aW50MTZ4NF90IHYxLCB1aW50MTZ4NF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92YWRkX3UxNgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZF91MTYKICAgcmV0dXJuIHZhZGRfdTE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBhZGQge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmFkZF91MzIodWludDMyeDJfdCB2MSwgdWludDMyeDJfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdmFkZF91MzIKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRfdTMyCiAgIHJldHVybiB2YWRkX3UzMih2MSwgdjIpOwogICAvLyBDSEVDSzogYWRkIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDY0eDFfdCB0ZXN0X3ZhZGRfdTY0KHVpbnQ2NHgxX3QgdjEsIHVpbnQ2NHgxX3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZhZGRfdTY0CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkX3U2NAogICByZXR1cm4gdmFkZF91NjQodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGFkZCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZhZGRxX3M4KGludDh4MTZfdCB2MSwgaW50OHgxNl90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92YWRkcV9zOAorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZHFfczgKICAgcmV0dXJuIHZhZGRxX3M4KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBhZGQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQxNng4X3QgdGVzdF92YWRkcV9zMTYoaW50MTZ4OF90IHYxLCBpbnQxNng4X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZhZGRxX3MxNgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZHFfczE2CiAgIHJldHVybiB2YWRkcV9zMTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGFkZCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZhZGRxX3MzMihpbnQzMng0X3QgdjEsaW50MzJ4NF90ICB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdmFkZHFfczMyCisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkcV9zMzIKICAgcmV0dXJuIHZhZGRxX3MzMih2MSwgdjIpOwogICAvLyBDSEVDSzogYWRkIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdmFkZHFfczY0KGludDY0eDJfdCB2MSwgaW50NjR4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92YWRkcV9zNjQKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRxX3M2NAogICByZXR1cm4gdmFkZHFfczY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBhZGQge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZhZGRxX2YzMihmbG9hdDMyeDRfdCB2MSwgZmxvYXQzMng0X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZhZGRxX2YzMgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZHFfZjMyCiAgIHJldHVybiB2YWRkcV9mMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZhZGQge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZhZGRxX2Y2NChmbG9hdDY0eDJfdCB2MSwgZmxvYXQ2NHgyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZHFfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRxX2Y2NAogICByZXR1cm4gdmFkZHFfZjY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmYWRkIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZhZGRxX3U4KHVpbnQ4eDE2X3QgdjEsIHVpbnQ4eDE2X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZhZGRxX3U4CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkcV91OAogICByZXR1cm4gdmFkZHFfdTgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGFkZCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92YWRkcV91MTYodWludDE2eDhfdCB2MSwgdWludDE2eDhfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdmFkZHFfdTE2CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkcV91MTYKICAgcmV0dXJuIHZhZGRxX3UxNih2MSwgdjIpOwogICAvLyBDSEVDSzogYWRkIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KQEAgLTExNSwxMDcgKzExOCwxMDcgQEAKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZhZGRxX3U2NCh1aW50NjR4Ml90IHYxLCB1aW50NjR4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92YWRkcV91NjQKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRxX3U2NAogICByZXR1cm4gdmFkZHFfdTY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBhZGQge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZzdWJfczgoaW50OHg4X3QgdjEsIGludDh4OF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c3ViX3M4CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3ViX3M4CiAgIHJldHVybiB2c3ViX3M4KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzdWIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogaW50MTZ4NF90IHRlc3RfdnN1Yl9zMTYoaW50MTZ4NF90IHYxLCBpbnQxNng0X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZzdWJfczE2CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3ViX3MxNgogICByZXR1cm4gdnN1Yl9zMTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHN1YiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiBpbnQzMngyX3QgdGVzdF92c3ViX3MzMihpbnQzMngyX3QgdjEsIGludDMyeDJfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnN1Yl9zMzIKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJfczMyCiAgIHJldHVybiB2c3ViX3MzMih2MSwgdjIpOwogICAvLyBDSEVDSzogc3ViIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50NjR4MV90IHRlc3RfdnN1Yl9zNjQoaW50NjR4MV90IHYxLCBpbnQ2NHgxX3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZzdWJfczY0CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3ViX3M2NAogICByZXR1cm4gdnN1Yl9zNjQodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHN1YiB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdnN1Yl9mMzIoZmxvYXQzMngyX3QgdjEsIGZsb2F0MzJ4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c3ViX2YzMgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1Yl9mMzIKICAgcmV0dXJuIHZzdWJfZjMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmc3ViIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDh4OF90IHRlc3RfdnN1Yl91OCh1aW50OHg4X3QgdjEsIHVpbnQ4eDhfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnN1Yl91OAorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1Yl91OAogICByZXR1cm4gdnN1Yl91OCh2MSwgdjIpOwogICAvLyBDSEVDSzogc3ViIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZzdWJfdTE2KHVpbnQxNng0X3QgdjEsIHVpbnQxNng0X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZzdWJfdTE2CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3ViX3UxNgogICByZXR1cm4gdnN1Yl91MTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHN1YiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92c3ViX3UzMih1aW50MzJ4Ml90IHYxLCB1aW50MzJ4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c3ViX3UzMgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1Yl91MzIKICAgcmV0dXJuIHZzdWJfdTMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzdWIge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiB1aW50NjR4MV90IHRlc3RfdnN1Yl91NjQodWludDY0eDFfdCB2MSwgdWludDY0eDFfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnN1Yl91NjQKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJfdTY0CiAgIHJldHVybiB2c3ViX3U2NCh2MSwgdjIpOwogICAvLyBDSEVDSzogc3ViIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogaW50OHgxNl90IHRlc3RfdnN1YnFfczgoaW50OHgxNl90IHYxLCBpbnQ4eDE2X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZzdWJxX3M4CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3VicV9zOAogICByZXR1cm4gdnN1YnFfczgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHN1YiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZzdWJxX3MxNihpbnQxNng4X3QgdjEsIGludDE2eDhfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnN1YnFfczE2CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3VicV9zMTYKICAgcmV0dXJuIHZzdWJxX3MxNih2MSwgdjIpOwogICAvLyBDSEVDSzogc3ViIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogaW50MzJ4NF90IHRlc3RfdnN1YnFfczMyKGludDMyeDRfdCB2MSxpbnQzMng0X3QgIHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c3VicV9zMzIKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJxX3MzMgogICByZXR1cm4gdnN1YnFfczMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzdWIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBpbnQ2NHgyX3QgdGVzdF92c3VicV9zNjQoaW50NjR4Ml90IHYxLCBpbnQ2NHgyX3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZzdWJxX3M2NAorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YnFfczY0CiAgIHJldHVybiB2c3VicV9zNjQodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHN1YiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnN1YnFfZjMyKGZsb2F0MzJ4NF90IHYxLCBmbG9hdDMyeDRfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnN1YnFfZjMyCisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3VicV9mMzIKICAgcmV0dXJuIHZzdWJxX2YzMih2MSwgdjIpOwogICAvLyBDSEVDSzogZnN1YiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdnN1YnFfZjY0KGZsb2F0NjR4Ml90IHYxLCBmbG9hdDY0eDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92c3VicV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YnFfZjY0CiAgIHJldHVybiB2c3VicV9mNjQodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZzdWIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiB1aW50OHgxNl90IHRlc3RfdnN1YnFfdTgodWludDh4MTZfdCB2MSwgdWludDh4MTZfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnN1YnFfdTgKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJxX3U4CiAgIHJldHVybiB2c3VicV91OCh2MSwgdjIpOwogICAvLyBDSEVDSzogc3ViIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZzdWJxX3UxNih1aW50MTZ4OF90IHYxLCB1aW50MTZ4OF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c3VicV91MTYKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJxX3UxNgogICByZXR1cm4gdnN1YnFfdTE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzdWIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQpAQCAtMjI3LDk4ICsyMzAsOTggQEAKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZzdWJxX3U2NCh1aW50NjR4Ml90IHYxLCB1aW50NjR4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92c3VicV91NjQKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJxX3U2NAogICByZXR1cm4gdnN1YnFfdTY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzdWIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZtdWxfczgoaW50OHg4X3QgdjEsIGludDh4OF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bF9zOAogICByZXR1cm4gdm11bF9zOCh2MSwgdjIpOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MTZ4NF90IHRlc3Rfdm11bF9zMTYoaW50MTZ4NF90IHYxLCBpbnQxNng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bF9zMTYKICAgcmV0dXJuIHZtdWxfczE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQzMngyX3QgdGVzdF92bXVsX3MzMihpbnQzMngyX3QgdjEsIGludDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92bXVsX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX3MzMgogICByZXR1cm4gdm11bF9zMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3Rfdm11bF9mMzIoZmxvYXQzMngyX3QgdjEsIGZsb2F0MzJ4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfZjMyCiAgIHJldHVybiB2bXVsX2YzMih2MSwgdjIpOwogICAvLyBDSEVDSzogZm11bCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIAogdWludDh4OF90IHRlc3Rfdm11bF91OCh1aW50OHg4X3QgdjEsIHVpbnQ4eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92bXVsX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfdTgKICAgcmV0dXJuIHZtdWxfdTgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92bXVsX3UxNih1aW50MTZ4NF90IHYxLCB1aW50MTZ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxfdTE2CiAgIHJldHVybiB2bXVsX3UxNih2MSwgdjIpOwogICAvLyBDSEVDSzogbXVsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZtdWxfdTMyKHVpbnQzMngyX3QgdjEsIHVpbnQzMngyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bF91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bF91MzIKICAgcmV0dXJuIHZtdWxfdTMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBtdWwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBpbnQ4eDE2X3QgdGVzdF92bXVscV9zOChpbnQ4eDE2X3QgdjEsIGludDh4MTZfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVscV9zOAogICByZXR1cm4gdm11bHFfczgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtdWxxX3MxNihpbnQxNng4X3QgdjEsIGludDE2eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfczE2CiAgIHJldHVybiB2bXVscV9zMTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtdWxxX3MzMihpbnQzMng0X3QgdjEsIGludDMyeDRfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfczMyCiAgIHJldHVybiB2bXVscV9zMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAgICAgCiB1aW50OHgxNl90IHRlc3Rfdm11bHFfdTgodWludDh4MTZfdCB2MSwgdWludDh4MTZfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVscV91OAogICByZXR1cm4gdm11bHFfdTgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92bXVscV91MTYodWludDE2eDhfdCB2MSwgdWludDE2eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfdTE2CiAgIHJldHVybiB2bXVscV91MTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bXVscV91MzIodWludDMyeDRfdCB2MSwgdWludDMyeDRfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfdTMyCiAgIHJldHVybiB2bXVscV91MzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IG11bCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3Rfdm11bHFfZjMyKGZsb2F0MzJ4NF90IHYxLCBmbG9hdDMyeDRfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92bXVscV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHFfZjMyCiAgIHJldHVybiB2bXVscV9mMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZtdWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZtdWxxX2Y2NChmbG9hdDY0eDJfdCB2MSwgZmxvYXQ2NHgyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bHFfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxxX2Y2NAogICByZXR1cm4gdm11bHFfZjY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmbXVsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KQEAgLTMzNywxMDM3ICszNDAsMTA0OCBAQAogCiAKIGludDh4OF90IHRlc3Rfdm1sYV9zOChpbnQ4eDhfdCB2MSwgaW50OHg4X3QgdjIsIGludDh4OF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYV9zOAogICByZXR1cm4gdm1sYV9zOCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIGludDh4OF90IHRlc3Rfdm1sYV9zMTYoaW50MTZ4NF90IHYxLCBpbnQxNng0X3QgdjIsIGludDE2eDRfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxhX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX3MxNgogICByZXR1cm4gdm1sYV9zMTYodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQzMngyX3QgdGVzdF92bWxhX3MzMihpbnQzMngyX3QgdjEsIGludDMyeDJfdCB2MiwgaW50MzJ4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFfczMyCiAgIHJldHVybiB2bWxhX3MzMih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3Rfdm1sYV9mMzIoZmxvYXQzMngyX3QgdjEsIGZsb2F0MzJ4Ml90IHYyLCBmbG9hdDMyeDJfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxhX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhX2YzMgogICByZXR1cm4gdm1sYV9mMzIodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBmbWxhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDh4OF90IHRlc3Rfdm1sYV91OCh1aW50OHg4X3QgdjEsIHVpbnQ4eDhfdCB2MiwgdWludDh4OF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYV91OAogICByZXR1cm4gdm1sYV91OCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92bWxhX3UxNih1aW50MTZ4NF90IHYxLCB1aW50MTZ4NF90IHYyLCB1aW50MTZ4NF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFfdTE2CiAgIHJldHVybiB2bWxhX3UxNih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92bWxhX3UzMih1aW50MzJ4Ml90IHYxLCB1aW50MzJ4Ml90IHYyLCB1aW50MzJ4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFfdTMyCiAgIHJldHVybiB2bWxhX3UzMih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZtbGFxX3M4KGludDh4MTZfdCB2MSwgaW50OHgxNl90IHYyLCBpbnQ4eDE2X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYXFfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYXFfczgKICAgcmV0dXJuIHZtbGFxX3M4KHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4OF90IHRlc3Rfdm1sYXFfczE2KGludDE2eDhfdCB2MSwgaW50MTZ4OF90IHYyLCBpbnQxNng4X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX3MxNgogICByZXR1cm4gdm1sYXFfczE2KHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1sYXFfczMyKGludDMyeDRfdCB2MSwgaW50MzJ4NF90IHYyLCBpbnQzMng0X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX3MzMgogICByZXR1cm4gdm1sYXFfczMyKHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0gCiAKIGZsb2F0MzJ4NF90IHRlc3Rfdm1sYXFfZjMyKGZsb2F0MzJ4NF90IHYxLCBmbG9hdDMyeDRfdCB2MiwgZmxvYXQzMng0X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYXFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFxX2YzMgogICByZXR1cm4gdm1sYXFfZjMyKHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogZm1sYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92bWxhcV91OCh1aW50OHgxNl90IHYxLCB1aW50OHgxNl90IHYyLCB1aW50OHgxNl90IHYzKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92bWxhcV91OAorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYXFfdTgKICAgcmV0dXJuIHZtbGFxX3U4KHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogbWxhIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZtbGFxX3UxNih1aW50MTZ4OF90IHYxLCB1aW50MTZ4OF90IHYyLCB1aW50MTZ4OF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV91MTYKICAgcmV0dXJuIHZtbGFxX3UxNih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IG1sYSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bWxhcV91MzIodWludDMyeDRfdCB2MSwgdWludDMyeDRfdCB2MiwgdWludDMyeDRfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxhcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYXFfdTMyCiAgIHJldHVybiB2bWxhcV91MzIodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBtbGEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZtbGFxX2Y2NChmbG9hdDY0eDJfdCB2MSwgZmxvYXQ2NHgyX3QgdjIsIGZsb2F0NjR4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhcV9mNjQKICAgcmV0dXJuIHZtbGFxX2Y2NCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGZtbGEge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZtbHNfczgoaW50OHg4X3QgdjEsIGludDh4OF90IHYyLCBpbnQ4eDhfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxzX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNfczgKICAgcmV0dXJuIHZtbHNfczgodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZtbHNfczE2KGludDE2eDRfdCB2MSwgaW50MTZ4NF90IHYyLCBpbnQxNng0X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc19zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19zMTYKICAgcmV0dXJuIHZtbHNfczE2KHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50MzJ4Ml90IHRlc3Rfdm1sc19zMzIoaW50MzJ4Ml90IHYxLCBpbnQzMngyX3QgdjIsIGludDMyeDJfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxzX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzX3MzMgogICByZXR1cm4gdm1sc19zMzIodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZtbHNfZjMyKGZsb2F0MzJ4Ml90IHYxLCBmbG9hdDMyeDJfdCB2MiwgZmxvYXQzMngyX3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc19mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc19mMzIKICAgcmV0dXJuIHZtbHNfZjMyKHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogZm1scyB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZtbHNfdTgodWludDh4OF90IHYxLCB1aW50OHg4X3QgdjIsIHVpbnQ4eDhfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxzX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNfdTgKICAgcmV0dXJuIHZtbHNfdTgodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3Rfdm1sc191MTYodWludDE2eDRfdCB2MSwgdWludDE2eDRfdCB2MiwgdWludDE2eDRfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxzX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzX3UxNgogICByZXR1cm4gdm1sc191MTYodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50MzJ4Ml90IHRlc3Rfdm1sc191MzIodWludDMyeDJfdCB2MSwgdWludDMyeDJfdCB2MiwgdWludDMyeDJfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxzX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzX3UzMgogICByZXR1cm4gdm1sc191MzIodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogaW50OHgxNl90IHRlc3Rfdm1sc3FfczgoaW50OHgxNl90IHYxLCBpbnQ4eDE2X3QgdjIsIGludDh4MTZfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxzcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzcV9zOAogICByZXR1cm4gdm1sc3FfczgodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQxNng4X3QgdGVzdF92bWxzcV9zMTYoaW50MTZ4OF90IHYxLCBpbnQxNng4X3QgdjIsIGludDE2eDhfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxzcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfczE2CiAgIHJldHVybiB2bWxzcV9zMTYodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQzMng0X3QgdGVzdF92bWxzcV9zMzIoaW50MzJ4NF90IHYxLCBpbnQzMng0X3QgdjIsIGludDMyeDRfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxzcV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfczMyCiAgIHJldHVybiB2bWxzcV9zMzIodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZtbHNxX2YzMihmbG9hdDMyeDRfdCB2MSwgZmxvYXQzMng0X3QgdjIsIGZsb2F0MzJ4NF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzcV9mMzIKICAgcmV0dXJuIHZtbHNxX2YzMih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGZtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogdWludDh4MTZfdCB0ZXN0X3ZtbHNxX3U4KHVpbnQ4eDE2X3QgdjEsIHVpbnQ4eDE2X3QgdjIsIHVpbnQ4eDE2X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc3FfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfdTgKICAgcmV0dXJuIHZtbHNxX3U4KHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogbWxzIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZtbHNxX3UxNih1aW50MTZ4OF90IHYxLCB1aW50MTZ4OF90IHYyLCB1aW50MTZ4OF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzcV91MTYKICAgcmV0dXJuIHZtbHNxX3UxNih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IG1scyB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bWxzcV91MzIodWludDMyeDRfdCB2MSwgdWludDMyeDRfdCB2MiwgdWludDMyeDRfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92bWxzcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc3FfdTMyCiAgIHJldHVybiB2bWxzcV91MzIodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBtbHMge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZtbHNxX2Y2NChmbG9hdDY0eDJfdCB2MSwgZmxvYXQ2NHgyX3QgdjIsIGZsb2F0NjR4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzcV9mNjQKICAgcmV0dXJuIHZtbHNxX2Y2NCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGZtbHMge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogZmxvYXQzMngyX3QgdGVzdF92Zm1hX2YzMihmbG9hdDMyeDJfdCB2MSwgZmxvYXQzMngyX3QgdjIsIGZsb2F0MzJ4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbWFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZmbWFfZjMyCiAgIHJldHVybiB2Zm1hX2YzMih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGZtbGEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZmbWFxX2YzMihmbG9hdDMyeDRfdCB2MSwgZmxvYXQzMng0X3QgdjIsIGZsb2F0MzJ4NF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbWFxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hcV9mMzIKICAgcmV0dXJuIHZmbWFxX2YzMih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGZtbGEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZmbWFxX2Y2NChmbG9hdDY0eDJfdCB2MSwgZmxvYXQ2NHgyX3QgdjIsIGZsb2F0NjR4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbWFxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hcV9mNjQKICAgcmV0dXJuIHZmbWFxX2Y2NCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGZtbGEge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogZmxvYXQzMngyX3QgdGVzdF92Zm1zX2YzMihmbG9hdDMyeDJfdCB2MSwgZmxvYXQzMngyX3QgdjIsIGZsb2F0MzJ4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZmbXNfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZmbXNfZjMyCiAgIHJldHVybiB2Zm1zX2YzMih2MSwgdjIsIHYzKTsKLSAgLy8gQ0hFQ0s6IGZtbHMgdjAuMnMsIHYxLjJzLCB2Mi4ycworICAvLyBDSEVDSzogZm1scyB2MC4ycywge3t2MS4ycywgdjIuMnN8djIuMnMsIHYxLjJzfX0KIH0KIAogZmxvYXQzMng0X3QgdGVzdF92Zm1zcV9mMzIoZmxvYXQzMng0X3QgdjEsIGZsb2F0MzJ4NF90IHYyLCBmbG9hdDMyeDRfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92Zm1zcV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtc3FfZjMyCiAgIHJldHVybiB2Zm1zcV9mMzIodjEsIHYyLCB2Myk7Ci0gIC8vIENIRUNLOiBmbWxzIHYwLjRzLCB2MS40cywgdjIuNHMKKyAgLy8gQ0hFQ0s6IGZtbHMgdjAuNHMsIHt7djEuNHMsIHYyLjRzfHYyLjRzLCB2MS40c319CiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdmZtc3FfZjY0KGZsb2F0NjR4Ml90IHYxLCBmbG9hdDY0eDJfdCB2MiwgZmxvYXQ2NHgyX3QgdjMpIHsKICAgLy8gQ0hFQ0s6IHZmbXNxX2Y2NAogICByZXR1cm4gdmZtc3FfZjY0KHYxLCB2MiwgdjMpOwotICAvLyBDSEVDSzogZm1scyB2MC4yZCwgdjEuMmQsIHYyLjJkCisgIC8vIENIRUNLOiBmbWxzIHYwLjJkLCB7e3YxLjJkLCB2Mi4yZHx2Mi4yZCwgdjEuMmR9fQogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZkaXZxX2Y2NChmbG9hdDY0eDJfdCB2MSwgZmxvYXQ2NHgyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmRpdnFfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkaXZxX2Y2NAogICByZXR1cm4gdmRpdnFfZjY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmZGl2IHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92ZGl2cV9mMzIoZmxvYXQzMng0X3QgdjEsIGZsb2F0MzJ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkaXZxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZGl2cV9mMzIKICAgcmV0dXJuIHZkaXZxX2YzMih2MSwgdjIpOwogICAvLyBDSEVDSzogZmRpdiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdmRpdl9mMzIoZmxvYXQzMngyX3QgdjEsIGZsb2F0MzJ4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkaXZfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkaXZfZjMyCiAgIHJldHVybiB2ZGl2X2YzMih2MSwgdjIpOwogICAvLyBDSEVDSzogZmRpdiB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGludDh4OF90IHRlc3RfdmFiYV9zOChpbnQ4eDhfdCB2MSwgaW50OHg4X3QgdjIsIGludDh4OF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmFfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiYV9zOAogICByZXR1cm4gdmFiYV9zOCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IHNhYmEge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQxNng0X3QgdGVzdF92YWJhX3MxNihpbnQxNng0X3QgdjEsIGludDE2eDRfdCB2MiwgaW50MTZ4NF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmFfczE2CiAgIHJldHVybiB2YWJhX3MxNih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IHNhYmEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQzMngyX3QgdGVzdF92YWJhX3MzMihpbnQzMngyX3QgdjEsIGludDMyeDJfdCB2MiwgaW50MzJ4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmFfczMyCiAgIHJldHVybiB2YWJhX3MzMih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IHNhYmEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiB1aW50OHg4X3QgdGVzdF92YWJhX3U4KHVpbnQ4eDhfdCB2MSwgdWludDh4OF90IHYyLCB1aW50OHg4X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiYV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJhX3U4CiAgIHJldHVybiB2YWJhX3U4KHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogdWFiYSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92YWJhX3UxNih1aW50MTZ4NF90IHYxLCB1aW50MTZ4NF90IHYyLCB1aW50MTZ4NF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmFfdTE2CiAgIHJldHVybiB2YWJhX3UxNih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IHVhYmEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmFiYV91MzIodWludDMyeDJfdCB2MSwgdWludDMyeDJfdCB2MiwgdWludDMyeDJfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YWJhX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJhX3UzMgogICByZXR1cm4gdmFiYV91MzIodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiB1YWJhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50OHgxNl90IHRlc3RfdmFiYXFfczgoaW50OHgxNl90IHYxLCBpbnQ4eDE2X3QgdjIsIGludDh4MTZfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YWJhcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJhcV9zOAogICByZXR1cm4gdmFiYXFfczgodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBzYWJhIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4OF90IHRlc3RfdmFiYXFfczE2KGludDE2eDhfdCB2MSwgaW50MTZ4OF90IHYyLCBpbnQxNng4X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiYXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmFxX3MxNgogICByZXR1cm4gdmFiYXFfczE2KHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogc2FiYSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZhYmFxX3MzMihpbnQzMng0X3QgdjEsIGludDMyeDRfdCB2MiwgaW50MzJ4NF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmFxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJhcV9zMzIKICAgcmV0dXJuIHZhYmFxX3MzMih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IHNhYmEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50OHgxNl90IHRlc3RfdmFiYXFfdTgodWludDh4MTZfdCB2MSwgdWludDh4MTZfdCB2MiwgdWludDh4MTZfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YWJhcV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJhcV91OAogICByZXR1cm4gdmFiYXFfdTgodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiB1YWJhIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZhYmFxX3UxNih1aW50MTZ4OF90IHYxLCB1aW50MTZ4OF90IHYyLCB1aW50MTZ4OF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmFxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJhcV91MTYKICAgcmV0dXJuIHZhYmFxX3UxNih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IHVhYmEge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiB1aW50MzJ4NF90IHRlc3RfdmFiYXFfdTMyKHVpbnQzMng0X3QgdjEsIHVpbnQzMng0X3QgdjIsIHVpbnQzMng0X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiYXFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmFxX3UzMgogICByZXR1cm4gdmFiYXFfdTMyKHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogdWFiYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGludDh4OF90IHRlc3RfdmFiZF9zOChpbnQ4eDhfdCB2MSwgaW50OHg4X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiZF9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJkX3M4CiAgIHJldHVybiB2YWJkX3M4KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzYWJkIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MTZ4NF90IHRlc3RfdmFiZF9zMTYoaW50MTZ4NF90IHYxLCBpbnQxNng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiZF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZF9zMTYKICAgcmV0dXJuIHZhYmRfczE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzYWJkIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50MzJ4Ml90IHRlc3RfdmFiZF9zMzIoaW50MzJ4Ml90IHYxLCBpbnQzMngyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiZF9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZF9zMzIKICAgcmV0dXJuIHZhYmRfczMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzYWJkIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDh4OF90IHRlc3RfdmFiZF91OCh1aW50OHg4X3QgdjEsIHVpbnQ4eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92YWJkX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmRfdTgKICAgcmV0dXJuIHZhYmRfdTgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHVhYmQge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3RfdmFiZF91MTYodWludDE2eDRfdCB2MSwgdWludDE2eDRfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92YWJkX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJkX3UxNgogICByZXR1cm4gdmFiZF91MTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHVhYmQge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmFiZF91MzIodWludDMyeDJfdCB2MSwgdWludDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92YWJkX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJkX3UzMgogICByZXR1cm4gdmFiZF91MzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHVhYmQge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZhYmRfZjMyKGZsb2F0MzJ4Ml90IHYxLCBmbG9hdDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92YWJkX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJkX2YzMgogICByZXR1cm4gdmFiZF9mMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZhYmQge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBpbnQ4eDE2X3QgdGVzdF92YWJkcV9zOChpbnQ4eDE2X3QgdjEsIGludDh4MTZfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92YWJkcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJkcV9zOAogICByZXR1cm4gdmFiZHFfczgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHNhYmQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQxNng4X3QgdGVzdF92YWJkcV9zMTYoaW50MTZ4OF90IHYxLCBpbnQxNng4X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiZHFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmRxX3MxNgogICByZXR1cm4gdmFiZHFfczE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzYWJkIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogaW50MzJ4NF90IHRlc3RfdmFiZHFfczMyKGludDMyeDRfdCB2MSwgaW50MzJ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmRxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJkcV9zMzIKICAgcmV0dXJuIHZhYmRxX3MzMih2MSwgdjIpOwogICAvLyBDSEVDSzogc2FiZCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92YWJkcV91OCh1aW50OHgxNl90IHYxLCB1aW50OHgxNl90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmRxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmRxX3U4CiAgIHJldHVybiB2YWJkcV91OCh2MSwgdjIpOwogICAvLyBDSEVDSzogdWFiZCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92YWJkcV91MTYodWludDE2eDhfdCB2MSwgdWludDE2eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92YWJkcV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZHFfdTE2CiAgIHJldHVybiB2YWJkcV91MTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHVhYmQge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiB1aW50MzJ4NF90IHRlc3RfdmFiZHFfdTMyKHVpbnQzMng0X3QgdjEsIHVpbnQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiZHFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmRxX3UzMgogICByZXR1cm4gdmFiZHFfdTMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiB1YWJkIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92YWJkcV9mMzIoZmxvYXQzMng0X3QgdjEsIGZsb2F0MzJ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmRxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJkcV9mMzIKICAgcmV0dXJuIHZhYmRxX2YzMih2MSwgdjIpOwogICAvLyBDSEVDSzogZmFiZCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdmFiZHFfZjY0KGZsb2F0NjR4Ml90IHYxLCBmbG9hdDY0eDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92YWJkcV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZHFfZjY0CiAgIHJldHVybiB2YWJkcV9mNjQodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZhYmQge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiAKIGludDh4OF90IHRlc3RfdmJzbF9zOCh1aW50OHg4X3QgdjEsIGludDh4OF90IHYyLCBpbnQ4eDhfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YnNsX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zic2xfczgKICAgcmV0dXJuIHZic2xfczgodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBic2wge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDhfdCB0ZXN0X3Zic2xfczE2KHVpbnQxNng0X3QgdjEsIGludDE2eDRfdCB2MiwgaW50MTZ4NF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zic2xfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zic2xfczE2CiAgIHJldHVybiB2YnNsX3MxNih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIGludDMyeDJfdCB0ZXN0X3Zic2xfczMyKHVpbnQzMngyX3QgdjEsIGludDMyeDJfdCB2MiwgaW50MzJ4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zic2xfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zic2xfczMyCiAgIHJldHVybiB2YnNsX3MzMih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92YnNsX3M2NCh1aW50NjR4MV90IHYxLCB1aW50NjR4MV90IHYyLCB1aW50NjR4MV90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zic2xfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zic2xfczY0CiAgIHJldHVybiB2YnNsX3M2NCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3Zic2xfdTgodWludDh4OF90IHYxLCB1aW50OHg4X3QgdjIsIHVpbnQ4eDhfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YnNsX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zic2xfdTgKICAgcmV0dXJuIHZic2xfdTgodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBic2wge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3RfdmJzbF91MTYodWludDE2eDRfdCB2MSwgdWludDE2eDRfdCB2MiwgdWludDE2eDRfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YnNsX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YnNsX3UxNgogICByZXR1cm4gdmJzbF91MTYodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBic2wge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmJzbF91MzIodWludDMyeDJfdCB2MSwgdWludDMyeDJfdCB2MiwgdWludDMyeDJfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YnNsX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YnNsX3UzMgogICByZXR1cm4gdmJzbF91MzIodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBic2wge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50NjR4MV90IHRlc3RfdmJzbF91NjQodWludDY0eDFfdCB2MSwgdWludDY0eDFfdCB2MiwgdWludDY0eDFfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YnNsX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YnNsX3U2NAogICByZXR1cm4gdmJzbF91NjQodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBic2wge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3Zic2xfZjMyKGZsb2F0MzJ4Ml90IHYxLCBmbG9hdDMyeDJfdCB2MiwgZmxvYXQzMngyX3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmJzbF9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJzbF9mMzIKICAgcmV0dXJuIHZic2xfZjMyKHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogYnNsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogZmxvYXQ2NHgxX3QgdGVzdF92YnNsX2Y2NCh1aW50NjR4MV90IHYxLCBmbG9hdDY0eDFfdCB2MiwgZmxvYXQ2NHgxX3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmJzbF9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJzbF9mNjQKICAgcmV0dXJuIHZic2xfZjY0KHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogYnNsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogcG9seTh4OF90IHRlc3RfdmJzbF9wOCh1aW50OHg4X3QgdjEsIHBvbHk4eDhfdCB2MiwgcG9seTh4OF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zic2xfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJzbF9wOAogICByZXR1cm4gdmJzbF9wOCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHkxNng0X3QgdGVzdF92YnNsX3AxNih1aW50MTZ4NF90IHYxLCBwb2x5MTZ4NF90IHYyLCBwb2x5MTZ4NF90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zic2xfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zic2xfcDE2CiAgIHJldHVybiB2YnNsX3AxNih2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIGludDh4MTZfdCB0ZXN0X3Zic2xxX3M4KHVpbnQ4eDE2X3QgdjEsIGludDh4MTZfdCB2MiwgaW50OHgxNl90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zic2xxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zic2xxX3M4CiAgIHJldHVybiB2YnNscV9zOCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDE2eDhfdCB0ZXN0X3Zic2xxX3MxNih1aW50MTZ4OF90IHYxLCBpbnQxNng4X3QgdjIsIGludDE2eDhfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YnNscV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJzbHFfczE2CiAgIHJldHVybiB2YnNscV9zMTYodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBic2wge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQzMng0X3QgdGVzdF92YnNscV9zMzIodWludDMyeDRfdCB2MSwgaW50MzJ4NF90IHYyLCBpbnQzMng0X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmJzbHFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zic2xxX3MzMgogICByZXR1cm4gdmJzbHFfczMyKHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogYnNsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50NjR4Ml90IHRlc3RfdmJzbHFfczY0KHVpbnQ2NHgyX3QgdjEsIGludDY0eDJfdCB2MiwgaW50NjR4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zic2xxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YnNscV9zNjQKICAgcmV0dXJuIHZic2xxX3M2NCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92YnNscV91OCh1aW50OHgxNl90IHYxLCB1aW50OHgxNl90IHYyLCB1aW50OHgxNl90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zic2xxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zic2xxX3U4CiAgIHJldHVybiB2YnNscV91OCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92YnNscV91MTYodWludDE2eDhfdCB2MSwgdWludDE2eDhfdCB2MiwgdWludDE2eDhfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YnNscV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJzbHFfdTE2CiAgIHJldHVybiB2YnNscV91MTYodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBic2wge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQzMng0X3QgdGVzdF92YnNscV91MzIodWludDMyeDRfdCB2MSwgaW50MzJ4NF90IHYyLCBpbnQzMng0X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmJzbHFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zic2xxX3UzMgogICByZXR1cm4gdmJzbHFfczMyKHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogYnNsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDY0eDJfdCB0ZXN0X3Zic2xxX3U2NCh1aW50NjR4Ml90IHYxLCB1aW50NjR4Ml90IHYyLCB1aW50NjR4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zic2xxX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YnNscV91NjQKICAgcmV0dXJuIHZic2xxX3U2NCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdmJzbHFfZjMyKHVpbnQzMng0X3QgdjEsIGZsb2F0MzJ4NF90IHYyLCBmbG9hdDMyeDRfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YnNscV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJzbHFfZjMyCiAgIHJldHVybiB2YnNscV9mMzIodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBic2wge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBwb2x5OHgxNl90IHRlc3RfdmJzbHFfcDgodWludDh4MTZfdCB2MSwgcG9seTh4MTZfdCB2MiwgcG9seTh4MTZfdCB2MykgewotICAvLyBDSEVDSzogdGVzdF92YnNscV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YnNscV9wOAogICByZXR1cm4gdmJzbHFfcDgodjEsIHYyLCB2Myk7CiAgIC8vIENIRUNLOiBic2wge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBwb2x5MTZ4OF90IHRlc3RfdmJzbHFfcDE2KHVpbnQxNng4X3QgdjEsIHBvbHkxNng4X3QgdjIsIHBvbHkxNng4X3QgdjMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmJzbHFfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zic2xxX3AxNgogICByZXR1cm4gdmJzbHFfcDE2KHYxLCB2MiwgdjMpOwogICAvLyBDSEVDSzogYnNsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92YnNscV9mNjQodWludDY0eDJfdCB2MSwgZmxvYXQ2NHgyX3QgdjIsIGZsb2F0NjR4Ml90IHYzKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zic2xxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YnNscV9mNjQKICAgcmV0dXJuIHZic2xxX2Y2NCh2MSwgdjIsIHYzKTsKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdnJlY3BzX2YzMihmbG9hdDMyeDJfdCB2MSwgZmxvYXQzMngyX3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZyZWNwc19mMzIKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWNwc19mMzIKICAgIHJldHVybiB2cmVjcHNfZjMyKHYxLCB2Mik7CiAgICAvLyBDSEVDSzogZnJlY3BzIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92cmVjcHNxX2YzMihmbG9hdDMyeDRfdCB2MSwgZmxvYXQzMng0X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZyZWNwc3FfZjMyCisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVjcHNxX2YzMgogICAgcmV0dXJuIHZyZWNwc3FfZjMyKHYxLCB2Mik7CiAgICAvLyBDSEVDSzogZnJlY3BzIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92cmVjcHNxX2Y2NChmbG9hdDY0eDJfdCB2MSwgZmxvYXQ2NHgyX3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3ZyZWNwc3FfZjY0CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVjcHNxX2Y2NAogICByZXR1cm4gdnJlY3BzcV9mNjQodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZyZWNwcyB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdnJzcXJ0c19mMzIoZmxvYXQzMngyX3QgdjEsIGZsb2F0MzJ4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92cnNxcnRzX2YzMgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzcXJ0c19mMzIKICAgcmV0dXJuIHZyc3FydHNfZjMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmcnNxcnRzIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92cnNxcnRzcV9mMzIoZmxvYXQzMng0X3QgdjEsIGZsb2F0MzJ4NF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92cnNxcnRzcV9mMzIKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3FydHNxX2YzMgogICByZXR1cm4gdnJzcXJ0c3FfZjMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmcnNxcnRzIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92cnNxcnRzcV9mNjQoZmxvYXQ2NHgyX3QgdjEsIGZsb2F0NjR4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92cnNxcnRzcV9mNjQKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3FydHNxX2Y2NAogICByZXR1cm4gdnJzcXJ0c3FfZjY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmcnNxcnRzIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZjYWdlX2YzMihmbG9hdDMyeDJfdCB2MSwgZmxvYXQzMngyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNhZ2VfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjYWdlX2YzMgogICByZXR1cm4gdmNhZ2VfZjMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmYWNnZSB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Y2FnZV9mNjQoZmxvYXQ2NHgxX3QgYSwgZmxvYXQ2NHgxX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92Y2FnZV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhZ2VfZjY0CiAgIHJldHVybiB2Y2FnZV9mNjQoYSwgYik7CiAgIC8vIENIRUNLOiBmYWNnZSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92Y2FnZXFfZjMyKGZsb2F0MzJ4NF90IHYxLCBmbG9hdDMyeDRfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2FnZXFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjYWdlcV9mMzIKICAgcmV0dXJuIHZjYWdlcV9mMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZhY2dlIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZjYWdlcV9mNjQoZmxvYXQ2NHgyX3QgdjEsIGZsb2F0NjR4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjYWdlcV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhZ2VxX2Y2NAogICByZXR1cm4gdmNhZ2VxX2Y2NCh2MSwgdjIpOwogICAvLyBDSEVDSzogZmFjZ2Uge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmNhZ3RfZjMyKGZsb2F0MzJ4Ml90IHYxLCBmbG9hdDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2FndF9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhZ3RfZjMyCiAgIHJldHVybiB2Y2FndF9mMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZhY2d0IHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDY0eDFfdCB0ZXN0X3ZjYWd0X2Y2NChmbG9hdDY0eDFfdCBhLCBmbG9hdDY0eDFfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjYWd0X2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2FndF9mNjQKICAgcmV0dXJuIHZjYWd0X2Y2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IGZhY2d0IHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZjYWd0cV9mMzIoZmxvYXQzMng0X3QgdjEsIGZsb2F0MzJ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjYWd0cV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhZ3RxX2YzMgogICByZXR1cm4gdmNhZ3RxX2YzMih2MSwgdjIpOwogICAvLyBDSEVDSzogZmFjZ3Qge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50NjR4Ml90IHRlc3RfdmNhZ3RxX2Y2NChmbG9hdDY0eDJfdCB2MSwgZmxvYXQ2NHgyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNhZ3RxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2FndHFfZjY0CiAgIHJldHVybiB2Y2FndHFfZjY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmYWNndCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92Y2FsZV9mMzIoZmxvYXQzMngyX3QgdjEsIGZsb2F0MzJ4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjYWxlX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2FsZV9mMzIKICAgcmV0dXJuIHZjYWxlX2YzMih2MSwgdjIpOwogICAvLyBVc2luZyByZWdpc3RlcnMgb3RoZXIgdGhhbiB2MCwgdjEgYXJlIHBvc3NpYmxlLCBidXQgd291bGQgYmUgb2RkLgogICAvLyBDSEVDSzogZmFjZ2Uge3t2WzAtOV0rfX0uMnMsIHYxLjJzLCB2MC4ycwogfQogCiB1aW50NjR4MV90IHRlc3RfdmNhbGVfZjY0KGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNhbGVfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjYWxlX2Y2NAogICByZXR1cm4gdmNhbGVfZjY0KGEsIGIpOwogICAvLyBDSEVDSzogZmFjZ2Uge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiB1aW50MzJ4NF90IHRlc3RfdmNhbGVxX2YzMihmbG9hdDMyeDRfdCB2MSwgZmxvYXQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNhbGVxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2FsZXFfZjMyCiAgIHJldHVybiB2Y2FsZXFfZjMyKHYxLCB2Mik7CiAgIC8vIFVzaW5nIHJlZ2lzdGVycyBvdGhlciB0aGFuIHYwLCB2MSBhcmUgcG9zc2libGUsIGJ1dCB3b3VsZCBiZSBvZGQuCiAgIC8vIENIRUNLOiBmYWNnZSB7e3ZbMC05XSt9fS40cywgdjEuNHMsIHYwLjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92Y2FsZXFfZjY0KGZsb2F0NjR4Ml90IHYxLCBmbG9hdDY0eDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2FsZXFfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjYWxlcV9mNjQKICAgcmV0dXJuIHZjYWxlcV9mNjQodjEsIHYyKTsKICAgLy8gVXNpbmcgcmVnaXN0ZXJzIG90aGVyIHRoYW4gdjAsIHYxIGFyZSBwb3NzaWJsZSwgYnV0IHdvdWxkIGJlIG9kZC4KICAgLy8gQ0hFQ0s6IGZhY2dlIHt7dlswLTldK319LjJkLCB2MS4yZCwgdjAuMmQKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZjYWx0X2YzMihmbG9hdDMyeDJfdCB2MSwgZmxvYXQzMngyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNhbHRfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjYWx0X2YzMgogICByZXR1cm4gdmNhbHRfZjMyKHYxLCB2Mik7CiAgIC8vIFVzaW5nIHJlZ2lzdGVycyBvdGhlciB0aGFuIHYwLCB2MSBhcmUgcG9zc2libGUsIGJ1dCB3b3VsZCBiZSBvZGQuCiAgIC8vIENIRUNLOiBmYWNndCB7e3ZbMC05XSt9fS4ycywgdjEuMnMsIHYwLjJzCiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Y2FsdF9mNjQoZmxvYXQ2NHgxX3QgYSwgZmxvYXQ2NHgxX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92Y2FsdF9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhbHRfZjY0CiAgIHJldHVybiB2Y2FsdF9mNjQoYSwgYik7CiAgIC8vIENIRUNLOiBmYWNndCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92Y2FsdHFfZjMyKGZsb2F0MzJ4NF90IHYxLCBmbG9hdDMyeDRfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2FsdHFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjYWx0cV9mMzIKICAgcmV0dXJuIHZjYWx0cV9mMzIodjEsIHYyKTsKICAgLy8gVXNpbmcgcmVnaXN0ZXJzIG90aGVyIHRoYW4gdjAsIHYxIGFyZSBwb3NzaWJsZSwgYnV0IHdvdWxkIGJlIG9kZC4KICAgLy8gQ0hFQ0s6IGZhY2d0IHt7dlswLTldK319LjRzLCB2MS40cywgdjAuNHMKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZjYWx0cV9mNjQoZmxvYXQ2NHgyX3QgdjEsIGZsb2F0NjR4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjYWx0cV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhbHRxX2Y2NAogICByZXR1cm4gdmNhbHRxX2Y2NCh2MSwgdjIpOwogICAvLyBVc2luZyByZWdpc3RlcnMgb3RoZXIgdGhhbiB2MCwgdjEgYXJlIHBvc3NpYmxlLCBidXQgd291bGQgYmUgb2RkLgogICAvLyBDSEVDSzogZmFjZ3Qge3t2WzAtOV0rfX0uMmQsIHYxLjJkLCB2MC4yZAogfQogCiB1aW50OHg4X3QgdGVzdF92dHN0X3M4KGludDh4OF90IHYxLCBpbnQ4eDhfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnRzdF9zOAorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRzdF9zOAogICByZXR1cm4gdnRzdF9zOCh2MSwgdjIpOwogICAvLyBDSEVDSzogY210c3Qge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3RfdnRzdF9zMTYoaW50MTZ4NF90IHYxLCBpbnQxNng0X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3Z0c3RfczE2CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHN0X3MxNgogICByZXR1cm4gdnRzdF9zMTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtdHN0IHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3Z0c3RfczMyKGludDMyeDJfdCB2MSwgaW50MzJ4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92dHN0X3MzMgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRzdF9zMzIKICAgcmV0dXJuIHZ0c3RfczMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbXRzdCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3Z0c3RfdTgodWludDh4OF90IHYxLCB1aW50OHg4X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3Z0c3RfdTgKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0c3RfdTgKICAgcmV0dXJuIHZ0c3RfdTgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtdHN0IHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDE2eDRfdCB0ZXN0X3Z0c3RfdTE2KHVpbnQxNng0X3QgdjEsIHVpbnQxNng0X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3Z0c3RfdTE2CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHN0X3UxNgogICByZXR1cm4gdnRzdF91MTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtdHN0IHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3Z0c3RfdTMyKHVpbnQzMngyX3QgdjEsIHVpbnQzMngyX3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3Z0c3RfdTMyCisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHN0X3UzMgogICByZXR1cm4gdnRzdF91MzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtdHN0IHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDh4MTZfdCB0ZXN0X3Z0c3RxX3M4KGludDh4MTZfdCB2MSwgaW50OHgxNl90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92dHN0cV9zOAorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRzdHFfczgKICAgcmV0dXJuIHZ0c3RxX3M4KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbXRzdCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92dHN0cV9zMTYoaW50MTZ4OF90IHYxLCBpbnQxNng4X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3Z0c3RxX3MxNgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRzdHFfczE2CiAgIHJldHVybiB2dHN0cV9zMTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtdHN0IHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3Z0c3RxX3MzMihpbnQzMng0X3QgdjEsIGludDMyeDRfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnRzdHFfczMyCisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHN0cV9zMzIKICAgcmV0dXJuIHZ0c3RxX3MzMih2MSwgdjIpOwogICAvLyBDSEVDSzogY210c3Qge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50OHgxNl90IHRlc3RfdnRzdHFfdTgodWludDh4MTZfdCB2MSwgdWludDh4MTZfdCB2MikgewotICAgLy8gQ0hFQ0s6IHRlc3RfdnRzdHFfdTgKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0c3RxX3U4CiAgIHJldHVybiB2dHN0cV91OCh2MSwgdjIpOwogICAvLyBDSEVDSzogY210c3Qge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiB1aW50MTZ4OF90IHRlc3RfdnRzdHFfdTE2KHVpbnQxNng4X3QgdjEsIHVpbnQxNng4X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3Z0c3RxX3UxNgorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRzdHFfdTE2CiAgIHJldHVybiB2dHN0cV91MTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtdHN0IHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3Z0c3RxX3UzMih1aW50MzJ4NF90IHYxLCB1aW50MzJ4NF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92dHN0cV91MzIKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0c3RxX3UzMgogICByZXR1cm4gdnRzdHFfdTMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbXRzdCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92dHN0cV9zNjQoaW50NjR4Ml90IHYxLCBpbnQ2NHgyX3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3Z0c3RxX3M2NAorICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRzdHFfczY0CiAgIHJldHVybiB2dHN0cV9zNjQodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtdHN0IHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDY0eDJfdCB0ZXN0X3Z0c3RxX3U2NCh1aW50NjR4Ml90IHYxLCB1aW50NjR4Ml90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92dHN0cV91NjQKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0c3RxX3U2NAogICByZXR1cm4gdnRzdHFfdTY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbXRzdCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3Z0c3RfcDgocG9seTh4OF90IHYxLCBwb2x5OHg4X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3Z0c3RfcDgKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0c3RfcDgKICAgcmV0dXJuIHZ0c3RfcDgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtdHN0IHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDE2eDRfdCB0ZXN0X3Z0c3RfcDE2KHBvbHkxNng0X3QgdjEsIHBvbHkxNng0X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3Z0c3RfcDE2CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHN0X3AxNgogICByZXR1cm4gdnRzdF9wMTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtdHN0IHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDh4MTZfdCB0ZXN0X3Z0c3RxX3A4KHBvbHk4eDE2X3QgdjEsIHBvbHk4eDE2X3QgdjIpIHsKLSAgIC8vIENIRUNLOiB0ZXN0X3Z0c3RxX3A4CisgICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHN0cV9wOAogICByZXR1cm4gdnRzdHFfcDgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtdHN0IHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3Z0c3RxX3AxNihwb2x5MTZ4OF90IHYxLCBwb2x5MTZ4OF90IHYyKSB7Ci0gICAvLyBDSEVDSzogdGVzdF92dHN0cV9wMTYKKyAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0c3RxX3AxNgogICByZXR1cm4gdnRzdHFfcDE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbXRzdCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKK3VpbnQ2NHgxX3QgdGVzdF92dHN0X3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRzdF9zNjQKKyAgcmV0dXJuIHZ0c3RfczY0KGEsIGIpOworICAvLyBDSEVDSzogY210c3Qge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQorCit1aW50NjR4MV90IHRlc3RfdnRzdF91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRzdF91NjQKKyAgcmV0dXJuIHZ0c3RfdTY0KGEsIGIpOworICAvLyBDSEVDSzogY210c3Qge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQogCiB1aW50OHg4X3QgdGVzdF92Y2VxX3M4KGludDh4OF90IHYxLCBpbnQ4eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2VxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXFfczgKICAgcmV0dXJuIHZjZXFfczgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZXEge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3RfdmNlcV9zMTYoaW50MTZ4NF90IHYxLCBpbnQxNng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNlcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcV9zMTYKICAgcmV0dXJuIHZjZXFfczE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWVxIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZjZXFfczMyKGludDMyeDJfdCB2MSwgaW50MzJ4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXFfczMyCiAgIHJldHVybiB2Y2VxX3MzMih2MSwgdjIpOwogICAvLyBDSEVDSzogY21lcSB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Y2VxX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNlcV9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcV9zNjQKICAgcmV0dXJuIHZjZXFfczY0KGEsIGIpOwogICAvLyBDSEVDSzogY21lcSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Y2VxX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92Y2VxX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxX3U2NAogICByZXR1cm4gdmNlcV91NjQoYSwgYik7CiAgIC8vIENIRUNLOiBjbWVxIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZjZXFfZjMyKGZsb2F0MzJ4Ml90IHYxLCBmbG9hdDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2VxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxX2YzMgogICByZXR1cm4gdmNlcV9mMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZjbWVxIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDY0eDFfdCB0ZXN0X3ZjZXFfZjY0KGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNlcV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcV9mNjQKICAgcmV0dXJuIHZjZXFfZjY0KGEsIGIpOwogICAvLyBDSEVDSzogZmNtZXEge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiB1aW50OHg4X3QgdGVzdF92Y2VxX3U4KHVpbnQ4eDhfdCB2MSwgdWludDh4OF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZXFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcV91OAogICByZXR1cm4gdmNlcV91OCh2MSwgdjIpOwogICAvLyBDSEVDSzogY21lcSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92Y2VxX3UxNih1aW50MTZ4NF90IHYxLCB1aW50MTZ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZXFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXFfdTE2CiAgIHJldHVybiB2Y2VxX3UxNih2MSwgdjIpOwogICAvLyBDSEVDSzogY21lcSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92Y2VxX3UzMih1aW50MzJ4Ml90IHYxLCB1aW50MzJ4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZXFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXFfdTMyCiAgIHJldHVybiB2Y2VxX3UzMih2MSwgdjIpOwogICAvLyBDSEVDSzogY21lcSB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZjZXFfcDgocG9seTh4OF90IHYxLCBwb2x5OHg4X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNlcV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxX3A4CiAgIHJldHVybiB2Y2VxX3A4KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWVxIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZjZXFxX3M4KGludDh4MTZfdCB2MSwgaW50OHgxNl90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZXFxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXFxX3M4CiAgIHJldHVybiB2Y2VxcV9zOCh2MSwgdjIpOwogICAvLyBDSEVDSzogY21lcSB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92Y2VxcV9zMTYoaW50MTZ4OF90IHYxLCBpbnQxNng4X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNlcXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXFxX3MxNgogICByZXR1cm4gdmNlcXFfczE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWVxIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZjZXFxX3MzMihpbnQzMng0X3QgdjEsIGludDMyeDRfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2VxcV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXFfczMyCiAgIHJldHVybiB2Y2VxcV9zMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZXEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50MzJ4NF90IHRlc3RfdmNlcXFfZjMyKGZsb2F0MzJ4NF90IHYxLCBmbG9hdDMyeDRfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2VxcV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXFfZjMyCiAgIHJldHVybiB2Y2VxcV9mMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZjbWVxIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZjZXFxX3U4KHVpbnQ4eDE2X3QgdjEsIHVpbnQ4eDE2X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNlcXFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXFfdTgKICAgcmV0dXJuIHZjZXFxX3U4KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWVxIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZjZXFxX3UxNih1aW50MTZ4OF90IHYxLCB1aW50MTZ4OF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZXFxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxcV91MTYKICAgcmV0dXJuIHZjZXFxX3UxNih2MSwgdjIpOwogICAvLyBDSEVDSzogY21lcSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92Y2VxcV91MzIodWludDMyeDRfdCB2MSwgdWludDMyeDRfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2VxcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXFfdTMyCiAgIHJldHVybiB2Y2VxcV91MzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZXEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50OHgxNl90IHRlc3RfdmNlcXFfcDgocG9seTh4MTZfdCB2MSwgcG9seTh4MTZfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2VxcV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxcV9wOAogICByZXR1cm4gdmNlcXFfcDgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZXEge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiAKIHVpbnQ2NHgyX3QgdGVzdF92Y2VxcV9zNjQoaW50NjR4Ml90IHYxLCBpbnQ2NHgyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNlcXFfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXFxX3M2NAogICByZXR1cm4gdmNlcXFfczY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWVxIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZjZXFxX3U2NCh1aW50NjR4Ml90IHYxLCB1aW50NjR4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZXFxX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxcV91NjQKICAgcmV0dXJuIHZjZXFxX3U2NCh2MSwgdjIpOwogICAvLyBDSEVDSzogY21lcSB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92Y2VxcV9mNjQoZmxvYXQ2NHgyX3QgdjEsIGZsb2F0NjR4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZXFxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxcV9mNjQKICAgcmV0dXJuIHZjZXFxX2Y2NCh2MSwgdjIpOwogICAvLyBDSEVDSzogZmNtZXEge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogdWludDh4OF90IHRlc3RfdmNnZV9zOChpbnQ4eDhfdCB2MSwgaW50OHg4X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ2VfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VfczgKICAgcmV0dXJuIHZjZ2VfczgodjEsIHYyKTsKIC8vIENIRUNLOiBjbWdlIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZjZ2VfczE2KGludDE2eDRfdCB2MSwgaW50MTZ4NF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2dlX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNnZV9zMTYKICAgcmV0dXJuIHZjZ2VfczE2KHYxLCB2Mik7CiAvLyBDSEVDSzogY21nZSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92Y2dlX3MzMihpbnQzMngyX3QgdjEsIGludDMyeDJfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmNnZV9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VfczMyCiAgIHJldHVybiB2Y2dlX3MzMih2MSwgdjIpOwogLy8gQ0hFQ0s6IGNtZ2Uge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiB1aW50NjR4MV90IHRlc3RfdmNnZV9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZ2VfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VfczY0CiAgIHJldHVybiB2Y2dlX3M2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IGNtZ2Uge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiB1aW50NjR4MV90IHRlc3RfdmNnZV91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNnZV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNnZV91NjQKICAgcmV0dXJuIHZjZ2VfdTY0KGEsIGIpOwogICAvLyBDSEVDSzogY21ocyB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIHVpbnQzMngyX3QgdGVzdF92Y2dlX2YzMihmbG9hdDMyeDJfdCB2MSwgZmxvYXQzMngyX3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ2VfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2dlX2YzMgogICByZXR1cm4gdmNnZV9mMzIodjEsIHYyKTsKIC8vIENIRUNLOiBmY21nZSB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Y2dlX2Y2NChmbG9hdDY0eDFfdCBhLCBmbG9hdDY0eDFfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZ2VfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VfZjY0CiAgIHJldHVybiB2Y2dlX2Y2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IGZjbWdlIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDh4OF90IHRlc3RfdmNnZV91OCh1aW50OHg4X3QgdjEsIHVpbnQ4eDhfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmNnZV91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNnZV91OAogICByZXR1cm4gdmNnZV91OCh2MSwgdjIpOwogLy8gQ0hFQ0s6IGNtaHMge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3RfdmNnZV91MTYodWludDE2eDRfdCB2MSwgdWludDE2eDRfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmNnZV91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VfdTE2CiAgIHJldHVybiB2Y2dlX3UxNih2MSwgdjIpOwogLy8gQ0hFQ0s6IGNtaHMge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmNnZV91MzIodWludDMyeDJfdCB2MSwgdWludDMyeDJfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmNnZV91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VfdTMyCiAgIHJldHVybiB2Y2dlX3UzMih2MSwgdjIpOwogLy8gQ0hFQ0s6IGNtaHMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiB1aW50OHgxNl90IHRlc3RfdmNnZXFfczgoaW50OHgxNl90IHYxLCBpbnQ4eDE2X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ2VxX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2dlcV9zOAogICByZXR1cm4gdmNnZXFfczgodjEsIHYyKTsKIC8vIENIRUNLOiBjbWdlIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZjZ2VxX3MxNihpbnQxNng4X3QgdjEsIGludDE2eDhfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmNnZXFfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2dlcV9zMTYKICAgcmV0dXJuIHZjZ2VxX3MxNih2MSwgdjIpOwogLy8gQ0hFQ0s6IGNtZ2Uge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiB1aW50MzJ4NF90IHRlc3RfdmNnZXFfczMyKGludDMyeDRfdCB2MSwgaW50MzJ4NF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2dlcV9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VxX3MzMgogICByZXR1cm4gdmNnZXFfczMyKHYxLCB2Mik7CiAvLyBDSEVDSzogY21nZSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92Y2dlcV9mMzIoZmxvYXQzMng0X3QgdjEsIGZsb2F0MzJ4NF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2dlcV9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VxX2YzMgogICByZXR1cm4gdmNnZXFfZjMyKHYxLCB2Mik7CiAvLyBDSEVDSzogZmNtZ2Uge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50OHgxNl90IHRlc3RfdmNnZXFfdTgodWludDh4MTZfdCB2MSwgdWludDh4MTZfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmNnZXFfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VxX3U4CiAgIHJldHVybiB2Y2dlcV91OCh2MSwgdjIpOwogLy8gQ0hFQ0s6IGNtaHMge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiB1aW50MTZ4OF90IHRlc3RfdmNnZXFfdTE2KHVpbnQxNng4X3QgdjEsIHVpbnQxNng4X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ2VxX3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNnZXFfdTE2CiAgIHJldHVybiB2Y2dlcV91MTYodjEsIHYyKTsKIC8vIENIRUNLOiBjbWhzIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZjZ2VxX3UzMih1aW50MzJ4NF90IHYxLCB1aW50MzJ4NF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2dlcV91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VxX3UzMgogICByZXR1cm4gdmNnZXFfdTMyKHYxLCB2Mik7CiAvLyBDSEVDSzogY21ocyB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92Y2dlcV9zNjQoaW50NjR4Ml90IHYxLCBpbnQ2NHgyX3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ2VxX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNnZXFfczY0CiAgIHJldHVybiB2Y2dlcV9zNjQodjEsIHYyKTsKIC8vIENIRUNLOiBjbWdlIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZjZ2VxX3U2NCh1aW50NjR4Ml90IHYxLCB1aW50NjR4Ml90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2dlcV91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VxX3U2NAogICByZXR1cm4gdmNnZXFfdTY0KHYxLCB2Mik7CiAvLyBDSEVDSzogY21ocyB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92Y2dlcV9mNjQoZmxvYXQ2NHgyX3QgdjEsIGZsb2F0NjR4Ml90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2dlcV9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VxX2Y2NAogICByZXR1cm4gdmNnZXFfZjY0KHYxLCB2Mik7CiAvLyBDSEVDSzogZmNtZ2Uge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQpAQCAtMTM3NiwyNDIgKzEzOTAsMjQyIEBACiAvLyBMRSBjb25kaXRpb24gcHJlZGljYXRlIGltcGxlbWVudGVkIGFzIEdFLCBzbyBjaGVjayByZXZlcnNlZCBvcGVyYW5kcy4KIC8vIFVzaW5nIHJlZ2lzdGVycyBvdGhlciB0aGFuIHYwLCB2MSBhcmUgcG9zc2libGUsIGJ1dCB3b3VsZCBiZSBvZGQuCiB1aW50OHg4X3QgdGVzdF92Y2xlX3M4KGludDh4OF90IHYxLCBpbnQ4eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2xlX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVfczgKICAgcmV0dXJuIHZjbGVfczgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZ2Uge3t2WzAtOV0rfX0uOGIsIHYxLjhiLCB2MC44YgogfQogCiB1aW50MTZ4NF90IHRlc3RfdmNsZV9zMTYoaW50MTZ4NF90IHYxLCBpbnQxNng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsZV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZV9zMTYKICAgcmV0dXJuIHZjbGVfczE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWdlIHt7dlswLTldK319LjRoLCB2MS40aCwgdjAuNGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZjbGVfczMyKGludDMyeDJfdCB2MSwgaW50MzJ4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbGVfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVfczMyCiAgIHJldHVybiB2Y2xlX3MzMih2MSwgdjIpOwogICAvLyBDSEVDSzogY21nZSB7e3ZbMC05XSt9fS4ycywgdjEuMnMsIHYwLjJzCiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Y2xlX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsZV9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZV9zNjQKICAgcmV0dXJuIHZjbGVfczY0KGEsIGIpOwogICAvLyBDSEVDSzogY21nZSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Y2xlX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92Y2xlX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2xlX3U2NAogICByZXR1cm4gdmNsZV91NjQoYSwgYik7CiAgIC8vIENIRUNLOiBjbWhzIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZjbGVfZjMyKGZsb2F0MzJ4Ml90IHYxLCBmbG9hdDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2xlX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2xlX2YzMgogICByZXR1cm4gdmNsZV9mMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZjbWdlIHt7dlswLTldK319LjJzLCB2MS4ycywgdjAuMnMKIH0KIAogdWludDY0eDFfdCB0ZXN0X3ZjbGVfZjY0KGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsZV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZV9mNjQKICAgcmV0dXJuIHZjbGVfZjY0KGEsIGIpOwogICAvLyBDSEVDSzogZmNtZ2Uge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiB1aW50OHg4X3QgdGVzdF92Y2xlX3U4KHVpbnQ4eDhfdCB2MSwgdWludDh4OF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbGVfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZV91OAogICByZXR1cm4gdmNsZV91OCh2MSwgdjIpOwogICAvLyBDSEVDSzogY21ocyB7e3ZbMC05XSt9fS44YiwgdjEuOGIsIHYwLjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92Y2xlX3UxNih1aW50MTZ4NF90IHYxLCB1aW50MTZ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbGVfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVfdTE2CiAgIHJldHVybiB2Y2xlX3UxNih2MSwgdjIpOwogICAvLyBDSEVDSzogY21ocyB7e3ZbMC05XSt9fS40aCwgdjEuNGgsIHYwLjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92Y2xlX3UzMih1aW50MzJ4Ml90IHYxLCB1aW50MzJ4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbGVfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVfdTMyCiAgIHJldHVybiB2Y2xlX3UzMih2MSwgdjIpOwogICAvLyBDSEVDSzogY21ocyB7e3ZbMC05XSt9fS4ycywgdjEuMnMsIHYwLjJzCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92Y2xlcV9zOChpbnQ4eDE2X3QgdjEsIGludDh4MTZfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2xlcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2xlcV9zOAogICByZXR1cm4gdmNsZXFfczgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZ2Uge3t2WzAtOV0rfX0uMTZiLCB2MS4xNmIsIHYwLjE2YgogfQogCiB1aW50MTZ4OF90IHRlc3RfdmNsZXFfczE2KGludDE2eDhfdCB2MSwgaW50MTZ4OF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbGVxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2xlcV9zMTYKICAgcmV0dXJuIHZjbGVxX3MxNih2MSwgdjIpOwogICAvLyBDSEVDSzogY21nZSB7e3ZbMC05XSt9fS44aCwgdjEuOGgsIHYwLjhoCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92Y2xlcV9zMzIoaW50MzJ4NF90IHYxLCBpbnQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsZXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVxX3MzMgogICByZXR1cm4gdmNsZXFfczMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWdlIHt7dlswLTldK319LjRzLCB2MS40cywgdjAuNHMKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZjbGVxX2YzMihmbG9hdDMyeDRfdCB2MSwgZmxvYXQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsZXFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVxX2YzMgogICByZXR1cm4gdmNsZXFfZjMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmY21nZSB7e3ZbMC05XSt9fS40cywgdjEuNHMsIHYwLjRzCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92Y2xlcV91OCh1aW50OHgxNl90IHYxLCB1aW50OHgxNl90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbGVxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVxX3U4CiAgIHJldHVybiB2Y2xlcV91OCh2MSwgdjIpOwogICAvLyBDSEVDSzogY21ocyB7e3ZbMC05XSt9fS4xNmIsIHYxLjE2YiwgdjAuMTZiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92Y2xlcV91MTYodWludDE2eDhfdCB2MSwgdWludDE2eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2xlcV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZXFfdTE2CiAgIHJldHVybiB2Y2xlcV91MTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtaHMge3t2WzAtOV0rfX0uOGgsIHYxLjhoLCB2MC44aAogfQogCiB1aW50MzJ4NF90IHRlc3RfdmNsZXFfdTMyKHVpbnQzMng0X3QgdjEsIHVpbnQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsZXFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVxX3UzMgogICByZXR1cm4gdmNsZXFfdTMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWhzIHt7dlswLTldK319LjRzLCB2MS40cywgdjAuNHMKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZjbGVxX3M2NChpbnQ2NHgyX3QgdjEsIGludDY0eDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2xlcV9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZXFfczY0CiAgIHJldHVybiB2Y2xlcV9zNjQodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZ2Uge3t2WzAtOV0rfX0uMmQsIHYxLjJkLCB2MC4yZAogfQogCiB1aW50NjR4Ml90IHRlc3RfdmNsZXFfdTY0KHVpbnQ2NHgyX3QgdjEsIHVpbnQ2NHgyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsZXFfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVxX3U2NAogICByZXR1cm4gdmNsZXFfdTY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWhzIHt7dlswLTldK319LjJkLCB2MS4yZCwgdjAuMmQKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZjbGVxX2Y2NChmbG9hdDY0eDJfdCB2MSwgZmxvYXQ2NHgyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsZXFfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVxX2Y2NAogICByZXR1cm4gdmNsZXFfZjY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmY21nZSB7e3ZbMC05XSt9fS4yZCwgdjEuMmQsIHYwLjJkCiB9CiAKIAogdWludDh4OF90IHRlc3RfdmNndF9zOChpbnQ4eDhfdCB2MSwgaW50OHg4X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNndF9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0X3M4CiAgIHJldHVybiB2Y2d0X3M4KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWd0IHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZjZ3RfczE2KGludDE2eDRfdCB2MSwgaW50MTZ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZ3RfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3RfczE2CiAgIHJldHVybiB2Y2d0X3MxNih2MSwgdjIpOwogICAvLyBDSEVDSzogY21ndCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92Y2d0X3MzMihpbnQzMngyX3QgdjEsIGludDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2d0X3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0X3MzMgogICByZXR1cm4gdmNndF9zMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZ3Qge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiB1aW50NjR4MV90IHRlc3RfdmNndF9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZ3RfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3RfczY0CiAgIHJldHVybiB2Y2d0X3M2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IGNtZ3Qge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiB1aW50NjR4MV90IHRlc3RfdmNndF91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNndF91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndF91NjQKICAgcmV0dXJuIHZjZ3RfdTY0KGEsIGIpOwogICAvLyBDSEVDSzogY21oaSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIHVpbnQzMngyX3QgdGVzdF92Y2d0X2YzMihmbG9hdDMyeDJfdCB2MSwgZmxvYXQzMngyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNndF9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndF9mMzIKICAgcmV0dXJuIHZjZ3RfZjMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmY21ndCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Y2d0X2Y2NChmbG9hdDY0eDFfdCBhLCBmbG9hdDY0eDFfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZ3RfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3RfZjY0CiAgIHJldHVybiB2Y2d0X2Y2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IGZjbWd0IHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDh4OF90IHRlc3RfdmNndF91OCh1aW50OHg4X3QgdjEsIHVpbnQ4eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2d0X3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3RfdTgKICAgcmV0dXJuIHZjZ3RfdTgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtaGkge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3RfdmNndF91MTYodWludDE2eDRfdCB2MSwgdWludDE2eDRfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2d0X3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0X3UxNgogICByZXR1cm4gdmNndF91MTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtaGkge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmNndF91MzIodWludDMyeDJfdCB2MSwgdWludDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2d0X3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0X3UzMgogICByZXR1cm4gdmNndF91MzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtaGkge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiB1aW50OHgxNl90IHRlc3RfdmNndHFfczgoaW50OHgxNl90IHYxLCBpbnQ4eDE2X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNndHFfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndHFfczgKICAgcmV0dXJuIHZjZ3RxX3M4KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWd0IHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZjZ3RxX3MxNihpbnQxNng4X3QgdjEsIGludDE2eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2d0cV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndHFfczE2CiAgIHJldHVybiB2Y2d0cV9zMTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZ3Qge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiB1aW50MzJ4NF90IHRlc3RfdmNndHFfczMyKGludDMyeDRfdCB2MSwgaW50MzJ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZ3RxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0cV9zMzIKICAgcmV0dXJuIHZjZ3RxX3MzMih2MSwgdjIpOwogICAvLyBDSEVDSzogY21ndCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92Y2d0cV9mMzIoZmxvYXQzMng0X3QgdjEsIGZsb2F0MzJ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZ3RxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0cV9mMzIKICAgcmV0dXJuIHZjZ3RxX2YzMih2MSwgdjIpOwogICAvLyBDSEVDSzogZmNtZ3Qge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50OHgxNl90IHRlc3RfdmNndHFfdTgodWludDh4MTZfdCB2MSwgdWludDh4MTZfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2d0cV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0cV91OAogICByZXR1cm4gdmNndHFfdTgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtaGkge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiB1aW50MTZ4OF90IHRlc3RfdmNndHFfdTE2KHVpbnQxNng4X3QgdjEsIHVpbnQxNng4X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNndHFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3RxX3UxNgogICByZXR1cm4gdmNndHFfdTE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWhpIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZjZ3RxX3UzMih1aW50MzJ4NF90IHYxLCB1aW50MzJ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZ3RxX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0cV91MzIKICAgcmV0dXJuIHZjZ3RxX3UzMih2MSwgdjIpOwogICAvLyBDSEVDSzogY21oaSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92Y2d0cV9zNjQoaW50NjR4Ml90IHYxLCBpbnQ2NHgyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNndHFfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3RxX3M2NAogICByZXR1cm4gdmNndHFfczY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWd0IHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZjZ3RxX3U2NCh1aW50NjR4Ml90IHYxLCB1aW50NjR4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZ3RxX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0cV91NjQKICAgcmV0dXJuIHZjZ3RxX3U2NCh2MSwgdjIpOwogICAvLyBDSEVDSzogY21oaSB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92Y2d0cV9mNjQoZmxvYXQ2NHgyX3QgdjEsIGZsb2F0NjR4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZ3RxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0cV9mNjQKICAgcmV0dXJuIHZjZ3RxX2Y2NCh2MSwgdjIpOwogICAvLyBDSEVDSzogZmNtZ3Qge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQpAQCAtMTYyMiwzODEgKzE2MzYsMzgxIEBACiAvLyBVc2luZyByZWdpc3RlcnMgb3RoZXIgdGhhbiB2MCwgdjEgYXJlIHBvc3NpYmxlLCBidXQgd291bGQgYmUgb2RkLgogCiB1aW50OHg4X3QgdGVzdF92Y2x0X3M4KGludDh4OF90IHYxLCBpbnQ4eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2x0X3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRfczgKICAgcmV0dXJuIHZjbHRfczgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZ3Qge3t2WzAtOV0rfX0uOGIsIHYxLjhiLCB2MC44YgogfQogCiB1aW50MTZ4NF90IHRlc3RfdmNsdF9zMTYoaW50MTZ4NF90IHYxLCBpbnQxNng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsdF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdF9zMTYKICAgcmV0dXJuIHZjbHRfczE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWd0IHt7dlswLTldK319LjRoLCB2MS40aCwgdjAuNGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZjbHRfczMyKGludDMyeDJfdCB2MSwgaW50MzJ4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHRfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRfczMyCiAgIHJldHVybiB2Y2x0X3MzMih2MSwgdjIpOwogICAvLyBDSEVDSzogY21ndCB7e3ZbMC05XSt9fS4ycywgdjEuMnMsIHYwLjJzCiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Y2x0X3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsdF9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdF9zNjQKICAgcmV0dXJuIHZjbHRfczY0KGEsIGIpOwogICAvLyBDSEVDSzogY21ndCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Y2x0X3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92Y2x0X3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x0X3U2NAogICByZXR1cm4gdmNsdF91NjQoYSwgYik7CiAgIC8vIENIRUNLOiBjbWhpIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZjbHRfZjMyKGZsb2F0MzJ4Ml90IHYxLCBmbG9hdDMyeDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2x0X2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x0X2YzMgogICByZXR1cm4gdmNsdF9mMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGZjbWd0IHt7dlswLTldK319LjJzLCB2MS4ycywgdjAuMnMKIH0KIAogdWludDY0eDFfdCB0ZXN0X3ZjbHRfZjY0KGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsdF9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdF9mNjQKICAgcmV0dXJuIHZjbHRfZjY0KGEsIGIpOwogICAvLyBDSEVDSzogZmNtZ3Qge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiB1aW50OHg4X3QgdGVzdF92Y2x0X3U4KHVpbnQ4eDhfdCB2MSwgdWludDh4OF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHRfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdF91OAogICByZXR1cm4gdmNsdF91OCh2MSwgdjIpOwogICAvLyBDSEVDSzogY21oaSB7e3ZbMC05XSt9fS44YiwgdjEuOGIsIHYwLjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92Y2x0X3UxNih1aW50MTZ4NF90IHYxLCB1aW50MTZ4NF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHRfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRfdTE2CiAgIHJldHVybiB2Y2x0X3UxNih2MSwgdjIpOwogICAvLyBDSEVDSzogY21oaSB7e3ZbMC05XSt9fS40aCwgdjEuNGgsIHYwLjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92Y2x0X3UzMih1aW50MzJ4Ml90IHYxLCB1aW50MzJ4Ml90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHRfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRfdTMyCiAgIHJldHVybiB2Y2x0X3UzMih2MSwgdjIpOwogICAvLyBDSEVDSzogY21oaSB7e3ZbMC05XSt9fS4ycywgdjEuMnMsIHYwLjJzCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92Y2x0cV9zOChpbnQ4eDE2X3QgdjEsIGludDh4MTZfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2x0cV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x0cV9zOAogICByZXR1cm4gdmNsdHFfczgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZ3Qge3t2WzAtOV0rfX0uMTZiLCB2MS4xNmIsIHYwLjE2YgogfQogCiB1aW50MTZ4OF90IHRlc3RfdmNsdHFfczE2KGludDE2eDhfdCB2MSwgaW50MTZ4OF90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHRxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x0cV9zMTYKICAgcmV0dXJuIHZjbHRxX3MxNih2MSwgdjIpOwogICAvLyBDSEVDSzogY21ndCB7e3ZbMC05XSt9fS44aCwgdjEuOGgsIHYwLjhoCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92Y2x0cV9zMzIoaW50MzJ4NF90IHYxLCBpbnQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsdHFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRxX3MzMgogICByZXR1cm4gdmNsdHFfczMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWd0IHt7dlswLTldK319LjRzLCB2MS40cywgdjAuNHMKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZjbHRxX2YzMihmbG9hdDMyeDRfdCB2MSwgZmxvYXQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsdHFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRxX2YzMgogICByZXR1cm4gdmNsdHFfZjMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmY21ndCB7e3ZbMC05XSt9fS40cywgdjEuNHMsIHYwLjRzCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92Y2x0cV91OCh1aW50OHgxNl90IHYxLCB1aW50OHgxNl90IHYyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHRxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRxX3U4CiAgIHJldHVybiB2Y2x0cV91OCh2MSwgdjIpOwogICAvLyBDSEVDSzogY21oaSB7e3ZbMC05XSt9fS4xNmIsIHYxLjE2YiwgdjAuMTZiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92Y2x0cV91MTYodWludDE2eDhfdCB2MSwgdWludDE2eDhfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2x0cV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdHFfdTE2CiAgIHJldHVybiB2Y2x0cV91MTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtaGkge3t2WzAtOV0rfX0uOGgsIHYxLjhoLCB2MC44aAogfQogCiB1aW50MzJ4NF90IHRlc3RfdmNsdHFfdTMyKHVpbnQzMng0X3QgdjEsIHVpbnQzMng0X3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsdHFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRxX3UzMgogICByZXR1cm4gdmNsdHFfdTMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWhpIHt7dlswLTldK319LjRzLCB2MS40cywgdjAuNHMKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZjbHRxX3M2NChpbnQ2NHgyX3QgdjEsIGludDY0eDJfdCB2MikgewotICAvLyBDSEVDSzogdGVzdF92Y2x0cV9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdHFfczY0CiAgIHJldHVybiB2Y2x0cV9zNjQodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IGNtZ3Qge3t2WzAtOV0rfX0uMmQsIHYxLjJkLCB2MC4yZAogfQogCiB1aW50NjR4Ml90IHRlc3RfdmNsdHFfdTY0KHVpbnQ2NHgyX3QgdjEsIHVpbnQ2NHgyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsdHFfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRxX3U2NAogICByZXR1cm4gdmNsdHFfdTY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBjbWhpIHt7dlswLTldK319LjJkLCB2MS4yZCwgdjAuMmQKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZjbHRxX2Y2NChmbG9hdDY0eDJfdCB2MSwgZmxvYXQ2NHgyX3QgdjIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsdHFfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRxX2Y2NAogICByZXR1cm4gdmNsdHFfZjY0KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBmY21ndCB7e3ZbMC05XSt9fS4yZCwgdjEuMmQsIHYwLjJkCiB9CiAKIAogaW50OHg4X3QgdGVzdF92aGFkZF9zOChpbnQ4eDhfdCB2MSwgaW50OHg4X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZoYWRkX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92aGFkZF9zOAogICByZXR1cm4gdmhhZGRfczgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHNoYWRkIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MTZ4NF90IHRlc3RfdmhhZGRfczE2KGludDE2eDRfdCB2MSwgaW50MTZ4NF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92aGFkZF9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZoYWRkX3MxNgogICByZXR1cm4gdmhhZGRfczE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzaGFkZCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZoYWRkX3MzMihpbnQzMngyX3QgdjEsIGludDMyeDJfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmhhZGRfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92aGFkZF9zMzIKICAgcmV0dXJuIHZoYWRkX3MzMih2MSwgdjIpOwogICAvLyBDSEVDSzogc2hhZGQge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiB1aW50OHg4X3QgdGVzdF92aGFkZF91OCh1aW50OHg4X3QgdjEsIHVpbnQ4eDhfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmhhZGRfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZoYWRkX3U4CiAgIHJldHVybiB2aGFkZF91OCh2MSwgdjIpOwogICAvLyBDSEVDSzogdWhhZGQge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3RfdmhhZGRfdTE2KHVpbnQxNng0X3QgdjEsIHVpbnQxNng0X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZoYWRkX3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmhhZGRfdTE2CiAgIHJldHVybiB2aGFkZF91MTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHVoYWRkIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZoYWRkX3UzMih1aW50MzJ4Ml90IHYxLCB1aW50MzJ4Ml90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92aGFkZF91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZoYWRkX3UzMgogICByZXR1cm4gdmhhZGRfdTMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiB1aGFkZCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZoYWRkcV9zOChpbnQ4eDE2X3QgdjEsIGludDh4MTZfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmhhZGRxX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92aGFkZHFfczgKICAgcmV0dXJuIHZoYWRkcV9zOCh2MSwgdjIpOwogICAvLyBDSEVDSzogc2hhZGQge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQxNng4X3QgdGVzdF92aGFkZHFfczE2KGludDE2eDhfdCB2MSwgaW50MTZ4OF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92aGFkZHFfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92aGFkZHFfczE2CiAgIHJldHVybiB2aGFkZHFfczE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzaGFkZCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZoYWRkcV9zMzIoaW50MzJ4NF90IHYxLCBpbnQzMng0X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZoYWRkcV9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZoYWRkcV9zMzIKICAgcmV0dXJuIHZoYWRkcV9zMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHNoYWRkIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZoYWRkcV91OCh1aW50OHgxNl90IHYxLCB1aW50OHgxNl90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92aGFkZHFfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZoYWRkcV91OAogICByZXR1cm4gdmhhZGRxX3U4KHYxLCB2Mik7CiAgIC8vIENIRUNLOiB1aGFkZCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92aGFkZHFfdTE2KHVpbnQxNng4X3QgdjEsIHVpbnQxNng4X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZoYWRkcV91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZoYWRkcV91MTYKICAgcmV0dXJuIHZoYWRkcV91MTYodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHVoYWRkIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZoYWRkcV91MzIodWludDMyeDRfdCB2MSwgdWludDMyeDRfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmhhZGRxX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmhhZGRxX3UzMgogICByZXR1cm4gdmhhZGRxX3UzMih2MSwgdjIpOwogICAvLyBDSEVDSzogdWhhZGQge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiAKIGludDh4OF90IHRlc3RfdmhzdWJfczgoaW50OHg4X3QgdjEsIGludDh4OF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92aHN1Yl9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmhzdWJfczgKICAgcmV0dXJuIHZoc3ViX3M4KHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzaHN1YiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIGludDE2eDRfdCB0ZXN0X3Zoc3ViX3MxNihpbnQxNng0X3QgdjEsIGludDE2eDRfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmhzdWJfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92aHN1Yl9zMTYKICAgcmV0dXJuIHZoc3ViX3MxNih2MSwgdjIpOwogICAvLyBDSEVDSzogc2hzdWIge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQzMngyX3QgdGVzdF92aHN1Yl9zMzIoaW50MzJ4Ml90IHYxLCBpbnQzMngyX3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zoc3ViX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmhzdWJfczMyCiAgIHJldHVybiB2aHN1Yl9zMzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHNoc3ViIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDh4OF90IHRlc3RfdmhzdWJfdTgodWludDh4OF90IHYxLCB1aW50OHg4X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zoc3ViX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92aHN1Yl91OAogICByZXR1cm4gdmhzdWJfdTgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHVoc3ViIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDE2eDRfdCB0ZXN0X3Zoc3ViX3UxNih1aW50MTZ4NF90IHYxLCB1aW50MTZ4NF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92aHN1Yl91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zoc3ViX3UxNgogICByZXR1cm4gdmhzdWJfdTE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiB1aHN1YiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92aHN1Yl91MzIodWludDMyeDJfdCB2MSwgdWludDMyeDJfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmhzdWJfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92aHN1Yl91MzIKICAgcmV0dXJuIHZoc3ViX3UzMih2MSwgdjIpOwogICAvLyBDSEVDSzogdWhzdWIge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBpbnQ4eDE2X3QgdGVzdF92aHN1YnFfczgoaW50OHgxNl90IHYxLCBpbnQ4eDE2X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zoc3VicV9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmhzdWJxX3M4CiAgIHJldHVybiB2aHN1YnFfczgodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHNoc3ViIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4OF90IHRlc3RfdmhzdWJxX3MxNihpbnQxNng4X3QgdjEsIGludDE2eDhfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmhzdWJxX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmhzdWJxX3MxNgogICByZXR1cm4gdmhzdWJxX3MxNih2MSwgdjIpOwogICAvLyBDSEVDSzogc2hzdWIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQzMng0X3QgdGVzdF92aHN1YnFfczMyKGludDMyeDRfdCB2MSwgaW50MzJ4NF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92aHN1YnFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92aHN1YnFfczMyCiAgIHJldHVybiB2aHN1YnFfczMyKHYxLCB2Mik7CiAgIC8vIENIRUNLOiBzaHN1YiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92aHN1YnFfdTgodWludDh4MTZfdCB2MSwgdWludDh4MTZfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdmhzdWJxX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92aHN1YnFfdTgKICAgcmV0dXJuIHZoc3VicV91OCh2MSwgdjIpOwogICAvLyBDSEVDSzogdWhzdWIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiB1aW50MTZ4OF90IHRlc3RfdmhzdWJxX3UxNih1aW50MTZ4OF90IHYxLCB1aW50MTZ4OF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92aHN1YnFfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92aHN1YnFfdTE2CiAgIHJldHVybiB2aHN1YnFfdTE2KHYxLCB2Mik7CiAgIC8vIENIRUNLOiB1aHN1YiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92aHN1YnFfdTMyKHVpbnQzMng0X3QgdjEsIHVpbnQzMng0X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zoc3VicV91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zoc3VicV91MzIKICAgcmV0dXJuIHZoc3VicV91MzIodjEsIHYyKTsKICAgLy8gQ0hFQ0s6IHVoc3ViIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogCiBpbnQ4eDhfdCB0ZXN0X3ZyaGFkZF9zOChpbnQ4eDhfdCB2MSwgaW50OHg4X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZyaGFkZF9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJoYWRkX3M4CiAgIHJldHVybiB2cmhhZGRfczgodjEsIHYyKTsKIC8vIENIRUNLOiBzcmhhZGQge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQxNng0X3QgdGVzdF92cmhhZGRfczE2KGludDE2eDRfdCB2MSwgaW50MTZ4NF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92cmhhZGRfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmhhZGRfczE2CiAgIHJldHVybiB2cmhhZGRfczE2KHYxLCB2Mik7CiAvLyBDSEVDSzogc3JoYWRkIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnJoYWRkX3MzMihpbnQzMngyX3QgdjEsIGludDMyeDJfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdnJoYWRkX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJoYWRkX3MzMgogICByZXR1cm4gdnJoYWRkX3MzMih2MSwgdjIpOwogLy8gQ0hFQ0s6IHNyaGFkZCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZyaGFkZF91OCh1aW50OHg4X3QgdjEsIHVpbnQ4eDhfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdnJoYWRkX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmhhZGRfdTgKICAgcmV0dXJuIHZyaGFkZF91OCh2MSwgdjIpOwogLy8gQ0hFQ0s6IHVyaGFkZCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92cmhhZGRfdTE2KHVpbnQxNng0X3QgdjEsIHVpbnQxNng0X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZyaGFkZF91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyaGFkZF91MTYKICAgcmV0dXJuIHZyaGFkZF91MTYodjEsIHYyKTsKIC8vIENIRUNLOiB1cmhhZGQge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdnJoYWRkX3UzMih1aW50MzJ4Ml90IHYxLCB1aW50MzJ4Ml90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92cmhhZGRfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmhhZGRfdTMyCiAgIHJldHVybiB2cmhhZGRfdTMyKHYxLCB2Mik7CiAvLyBDSEVDSzogdXJoYWRkIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50OHgxNl90IHRlc3RfdnJoYWRkcV9zOChpbnQ4eDE2X3QgdjEsIGludDh4MTZfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdnJoYWRkcV9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJoYWRkcV9zOAogICByZXR1cm4gdnJoYWRkcV9zOCh2MSwgdjIpOwogLy8gQ0hFQ0s6IHNyaGFkZCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZyaGFkZHFfczE2KGludDE2eDhfdCB2MSwgaW50MTZ4OF90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92cmhhZGRxX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJoYWRkcV9zMTYKICAgcmV0dXJuIHZyaGFkZHFfczE2KHYxLCB2Mik7CiAvLyBDSEVDSzogc3JoYWRkIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogaW50MzJ4NF90IHRlc3RfdnJoYWRkcV9zMzIoaW50MzJ4NF90IHYxLCBpbnQzMng0X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZyaGFkZHFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmhhZGRxX3MzMgogICByZXR1cm4gdnJoYWRkcV9zMzIodjEsIHYyKTsKIC8vIENIRUNLOiBzcmhhZGQge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50OHgxNl90IHRlc3RfdnJoYWRkcV91OCh1aW50OHgxNl90IHYxLCB1aW50OHgxNl90IHYyKSB7Ci0vLyBDSEVDSzogdGVzdF92cmhhZGRxX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmhhZGRxX3U4CiAgIHJldHVybiB2cmhhZGRxX3U4KHYxLCB2Mik7CiAvLyBDSEVDSzogdXJoYWRkIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZyaGFkZHFfdTE2KHVpbnQxNng4X3QgdjEsIHVpbnQxNng4X3QgdjIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZyaGFkZHFfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmhhZGRxX3UxNgogICByZXR1cm4gdnJoYWRkcV91MTYodjEsIHYyKTsKIC8vIENIRUNLOiB1cmhhZGQge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiB1aW50MzJ4NF90IHRlc3RfdnJoYWRkcV91MzIodWludDMyeDRfdCB2MSwgdWludDMyeDRfdCB2MikgewotLy8gQ0hFQ0s6IHRlc3RfdnJoYWRkcV91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyaGFkZHFfdTMyCiAgIHJldHVybiB2cmhhZGRxX3UzMih2MSwgdjIpOwogLy8gQ0hFQ0s6IHVyaGFkZCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiBpbnQ4eDhfdCB0ZXN0X3ZxYWRkX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxYWRkX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWFkZF9zOAogICByZXR1cm4gdnFhZGRfczgoYSwgYik7CiAgIC8vIENIRUNLOiBzcWFkZCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZxYWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxYWRkX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhZGRfczE2CiAgIHJldHVybiB2cWFkZF9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiBzcWFkZCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZxYWRkX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxYWRkX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhZGRfczMyCiAgIHJldHVybiB2cWFkZF9zMzIoYSwgYik7CiAgIC8vIENIRUNLOiBzcWFkZCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGludDY0eDFfdCB0ZXN0X3ZxYWRkX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxYWRkX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhZGRfczY0CiAgIHJldHVybiB2cWFkZF9zNjQoYSwgYik7CiAvLyBDSEVDSzogIHNxYWRkIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDh4OF90IHRlc3RfdnFhZGRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFkZF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhZGRfdTgKICAgcmV0dXJuIHZxYWRkX3U4KGEsIGIpOwogICAvLyBDSEVDSzogdXFhZGQge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3RfdnFhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFkZF91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxYWRkX3UxNgogICByZXR1cm4gdnFhZGRfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdXFhZGQge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdnFhZGRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFkZF91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxYWRkX3UzMgogICByZXR1cm4gdnFhZGRfdTMyKGEsIGIpOwogICAvLyBDSEVDSzogdXFhZGQge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQpAQCAtMjAwOCwzNzY0ICsyMDIyLDM3OTMgQEAKIH0KIAogaW50OHgxNl90IHRlc3RfdnFhZGRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFhZGRxX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWFkZHFfczgKICAgcmV0dXJuIHZxYWRkcV9zOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHNxYWRkIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4OF90IHRlc3RfdnFhZGRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxYWRkcV9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxYWRkcV9zMTYKICAgcmV0dXJuIHZxYWRkcV9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiBzcWFkZCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxYWRkcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFkZHFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWFkZHFfczMyCiAgIHJldHVybiB2cWFkZHFfczMyKGEsIGIpOwogICAvLyBDSEVDSzogc3FhZGQge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBpbnQ2NHgyX3QgdGVzdF92cWFkZHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFhZGRxX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhZGRxX3M2NAogICByZXR1cm4gdnFhZGRxX3M2NChhLCBiKTsKIC8vIENIRUNLOiBzcWFkZCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92cWFkZHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxYWRkcV91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhZGRxX3U4CiAgIHJldHVybiB2cWFkZHFfdTgoYSwgYik7CiAgIC8vIENIRUNLOiB1cWFkZCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92cWFkZHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFkZHFfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWFkZHFfdTE2CiAgIHJldHVybiB2cWFkZHFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdXFhZGQge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiB1aW50MzJ4NF90IHRlc3RfdnFhZGRxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFhZGRxX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhZGRxX3UzMgogICByZXR1cm4gdnFhZGRxX3UzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHVxYWRkIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZxYWRkcV91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxYWRkcV91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxYWRkcV91NjQKICAgcmV0dXJuIHZxYWRkcV91NjQoYSwgYik7CiAvLyBDSEVDSzogdXFhZGQge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiAKIGludDh4OF90IHRlc3RfdnFzdWJfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc3ViX3M4CiAgIHJldHVybiB2cXN1Yl9zOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHNxc3ViIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnFzdWJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1Yl9zMTYKICAgcmV0dXJuIHZxc3ViX3MxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHNxc3ViIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnFzdWJfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1Yl9zMzIKICAgcmV0dXJuIHZxc3ViX3MzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHNxc3ViIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50NjR4MV90IHRlc3RfdnFzdWJfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1Yl9zNjQKICAgcmV0dXJuIHZxc3ViX3M2NChhLCBiKTsKIC8vIENIRUNLOiBzcXN1YiB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3Zxc3ViX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc3ViX3U4CiAgIHJldHVybiB2cXN1Yl91OChhLCBiKTsKICAgLy8gQ0hFQ0s6IHVxc3ViIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDE2eDRfdCB0ZXN0X3Zxc3ViX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1Yl91MTYKICAgcmV0dXJuIHZxc3ViX3UxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHVxc3ViIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3Zxc3ViX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1Yl91MzIKICAgcmV0dXJuIHZxc3ViX3UzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHVxc3ViIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDY0eDFfdCB0ZXN0X3Zxc3ViX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1Yl91NjQKICAgcmV0dXJuIHZxc3ViX3U2NChhLCBiKTsKIC8vIENIRUNLOiAgdXFzdWIge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiBpbnQ4eDE2X3QgdGVzdF92cXN1YnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXN1YnFfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc3VicV9zOAogICByZXR1cm4gdnFzdWJxX3M4KGEsIGIpOwogICAvLyBDSEVDSzogc3FzdWIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQxNng4X3QgdGVzdF92cXN1YnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJxX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzdWJxX3MxNgogICByZXR1cm4gdnFzdWJxX3MxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHNxc3ViIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogaW50MzJ4NF90IHRlc3RfdnFzdWJxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zxc3VicV9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc3VicV9zMzIKICAgcmV0dXJuIHZxc3VicV9zMzIoYSwgYik7CiAgIC8vIENIRUNLOiBzcXN1YiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGludDY0eDJfdCB0ZXN0X3Zxc3VicV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXN1YnFfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1YnFfczY0CiAgIHJldHVybiB2cXN1YnFfczY0KGEsIGIpOwogLy8gQ0hFQ0s6IHNxc3ViIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDh4MTZfdCB0ZXN0X3Zxc3VicV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJxX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1YnFfdTgKICAgcmV0dXJuIHZxc3VicV91OChhLCBiKTsKICAgLy8gQ0hFQ0s6IHVxc3ViIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3Zxc3VicV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zxc3VicV91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc3VicV91MTYKICAgcmV0dXJuIHZxc3VicV91MTYoYSwgYik7CiAgIC8vIENIRUNLOiB1cXN1YiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92cXN1YnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXN1YnFfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1YnFfdTMyCiAgIHJldHVybiB2cXN1YnFfdTMyKGEsIGIpOwogICAvLyBDSEVDSzogdXFzdWIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50NjR4Ml90IHRlc3RfdnFzdWJxX3U2NCh1aW50NjR4Ml90IGEsIHVpbnQ2NHgyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJxX3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzdWJxX3U2NAogICByZXR1cm4gdnFzdWJxX3U2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IHVxc3ViIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogCiBpbnQ4eDhfdCB0ZXN0X3ZzaGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnNobF9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobF9zOAogICByZXR1cm4gdnNobF9zOChhLCBiKTsKIC8vIENIRUNLOiBzc2hsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnNobF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hsX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobF9zMTYKICAgcmV0dXJuIHZzaGxfczE2KGEsIGIpOwogLy8gQ0hFQ0s6IHNzaGwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQzMngyX3QgdGVzdF92c2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsX3MzMgogICByZXR1cm4gdnNobF9zMzIoYSwgYik7CiAvLyBDSEVDSzogc3NobCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGludDY0eDFfdCB0ZXN0X3ZzaGxfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnNobF9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxfczY0CiAgIHJldHVybiB2c2hsX3M2NChhLCBiKTsKIC8vIENIRUNLOiBzc2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDh4OF90IHRlc3RfdnNobF91OCh1aW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnNobF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobF91OAogICByZXR1cm4gdnNobF91OChhLCBiKTsKIC8vIENIRUNLOiB1c2hsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZzaGxfdTE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsX3UxNgogICByZXR1cm4gdnNobF91MTYoYSwgYik7CiAvLyBDSEVDSzogdXNobCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92c2hsX3UzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hsX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobF91MzIKICAgcmV0dXJuIHZzaGxfdTMyKGEsIGIpOwogLy8gQ0hFQ0s6IHVzaGwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiB1aW50NjR4MV90IHRlc3RfdnNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnNobF91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxfdTY0CiAgIHJldHVybiB2c2hsX3U2NChhLCBiKTsKIC8vIENIRUNLOiB1c2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogaW50OHgxNl90IHRlc3RfdnNobHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hscV9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobHFfczgKICAgcmV0dXJuIHZzaGxxX3M4KGEsIGIpOwogLy8gQ0hFQ0s6IHNzaGwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQxNng4X3QgdGVzdF92c2hscV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hscV9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxxX3MxNgogICByZXR1cm4gdnNobHFfczE2KGEsIGIpOwogLy8gQ0hFQ0s6IHNzaGwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQzMng0X3QgdGVzdF92c2hscV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hscV9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxxX3MzMgogICByZXR1cm4gdnNobHFfczMyKGEsIGIpOwogLy8gQ0hFQ0s6IHNzaGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBpbnQ2NHgyX3QgdGVzdF92c2hscV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hscV9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxxX3M2NAogICByZXR1cm4gdnNobHFfczY0KGEsIGIpOwogLy8gQ0hFQ0s6IHNzaGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiB1aW50OHgxNl90IHRlc3RfdnNobHFfdTgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnNobHFfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxxX3U4CiAgIHJldHVybiB2c2hscV91OChhLCBiKTsKIC8vIENIRUNLOiB1c2hsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hscV91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxxX3UxNgogICByZXR1cm4gdnNobHFfdTE2KGEsIGIpOwogLy8gQ0hFQ0s6IHVzaGwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiB1aW50MzJ4NF90IHRlc3RfdnNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxxX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobHFfdTMyCiAgIHJldHVybiB2c2hscV91MzIoYSwgYik7CiAvLyBDSEVDSzogdXNobCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92c2hscV91NjQodWludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnNobHFfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hscV91NjQKICAgcmV0dXJuIHZzaGxxX3U2NChhLCBiKTsKIC8vIENIRUNLOiB1c2hsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogCiBpbnQ4eDhfdCB0ZXN0X3Zxc2hsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zxc2hsX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobF9zOAogICByZXR1cm4gdnFzaGxfczgoYSwgYik7CiAvLyBDSEVDSzogc3FzaGwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQxNng0X3QgdGVzdF92cXNobF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXNobF9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsX3MxNgogICByZXR1cm4gdnFzaGxfczE2KGEsIGIpOwogLy8gQ0hFQ0s6IHNxc2hsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnFzaGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzaGxfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobF9zMzIKICAgcmV0dXJuIHZxc2hsX3MzMihhLCBiKTsKIC8vIENIRUNLOiBzcXNobCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGludDY0eDFfdCB0ZXN0X3Zxc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zxc2hsX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxfczY0CiAgIHJldHVybiB2cXNobF9zNjQoYSwgYik7CiAvLyBDSEVDSzogc3FzaGwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiB1aW50OHg4X3QgdGVzdF92cXNobF91OCh1aW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzaGxfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsX3U4CiAgIHJldHVybiB2cXNobF91OChhLCBiKTsKIC8vIENIRUNLOiB1cXNobCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92cXNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzaGxfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobF91MTYKICAgcmV0dXJuIHZxc2hsX3UxNihhLCBiKTsKIC8vIENIRUNLOiB1cXNobCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92cXNobF91MzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzaGxfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobF91MzIKICAgcmV0dXJuIHZxc2hsX3UzMihhLCBiKTsKIC8vIENIRUNLOiB1cXNobCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92cXNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzaGxfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobF91NjQKICAgcmV0dXJuIHZxc2hsX3U2NChhLCBiKTsKIC8vIENIRUNLOiB1cXNobCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIGludDh4MTZfdCB0ZXN0X3Zxc2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zxc2hscV9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxxX3M4CiAgIHJldHVybiB2cXNobHFfczgoYSwgYik7CiAvLyBDSEVDSzogc3FzaGwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQxNng4X3QgdGVzdF92cXNobHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzaGxxX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxxX3MxNgogICByZXR1cm4gdnFzaGxxX3MxNihhLCBiKTsKIC8vIENIRUNLOiBzcXNobCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3Zxc2hscV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXNobHFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobHFfczMyCiAgIHJldHVybiB2cXNobHFfczMyKGEsIGIpOwogLy8gQ0hFQ0s6IHNxc2hsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnFzaGxxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zxc2hscV9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hscV9zNjQKICAgcmV0dXJuIHZxc2hscV9zNjQoYSwgYik7CiAvLyBDSEVDSzogc3FzaGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiB1aW50OHgxNl90IHRlc3RfdnFzaGxxX3U4KHVpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zxc2hscV91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxxX3U4CiAgIHJldHVybiB2cXNobHFfdTgoYSwgYik7CiAvLyBDSEVDSzogdXFzaGwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiB1aW50MTZ4OF90IHRlc3RfdnFzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXNobHFfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobHFfdTE2CiAgIHJldHVybiB2cXNobHFfdTE2KGEsIGIpOwogLy8gQ0hFQ0s6IHVxc2hsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3Zxc2hscV91MzIodWludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzaGxxX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxxX3UzMgogICByZXR1cm4gdnFzaGxxX3UzMihhLCBiKTsKIC8vIENIRUNLOiB1cXNobCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92cXNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zxc2hscV91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hscV91NjQKICAgcmV0dXJuIHZxc2hscV91NjQoYSwgYik7CiAvLyBDSEVDSzogdXFzaGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBpbnQ4eDhfdCB0ZXN0X3Zyc2hsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zyc2hsX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNobF9zOAogICByZXR1cm4gdnJzaGxfczgoYSwgYik7CiAvLyBDSEVDSzogc3JzaGwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQxNng0X3QgdGVzdF92cnNobF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cnNobF9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc2hsX3MxNgogICByZXR1cm4gdnJzaGxfczE2KGEsIGIpOwogLy8gQ0hFQ0s6IHNyc2hsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnJzaGxfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnJzaGxfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNobF9zMzIKICAgcmV0dXJuIHZyc2hsX3MzMihhLCBiKTsKIC8vIENIRUNLOiBzcnNobCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGludDY0eDFfdCB0ZXN0X3Zyc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zyc2hsX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaGxfczY0CiAgIHJldHVybiB2cnNobF9zNjQoYSwgYik7CiAvLyBDSEVDSzogc3JzaGwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiB1aW50OHg4X3QgdGVzdF92cnNobF91OCh1aW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnJzaGxfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc2hsX3U4CiAgIHJldHVybiB2cnNobF91OChhLCBiKTsKIC8vIENIRUNLOiB1cnNobCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92cnNobF91MTYodWludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnJzaGxfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNobF91MTYKICAgcmV0dXJuIHZyc2hsX3UxNihhLCBiKTsKIC8vIENIRUNLOiB1cnNobCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92cnNobF91MzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnJzaGxfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNobF91MzIKICAgcmV0dXJuIHZyc2hsX3UzMihhLCBiKTsKIC8vIENIRUNLOiB1cnNobCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92cnNobF91NjQodWludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnJzaGxfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNobF91NjQKICAgcmV0dXJuIHZyc2hsX3U2NChhLCBiKTsKIC8vIENIRUNLOiB1cnNobCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIGludDh4MTZfdCB0ZXN0X3Zyc2hscV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zyc2hscV9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaGxxX3M4CiAgIHJldHVybiB2cnNobHFfczgoYSwgYik7CiAvLyBDSEVDSzogc3JzaGwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQxNng4X3QgdGVzdF92cnNobHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnJzaGxxX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaGxxX3MxNgogICByZXR1cm4gdnJzaGxxX3MxNihhLCBiKTsKIC8vIENIRUNLOiBzcnNobCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3Zyc2hscV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cnNobHFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNobHFfczMyCiAgIHJldHVybiB2cnNobHFfczMyKGEsIGIpOwogLy8gQ0hFQ0s6IHNyc2hsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnJzaGxxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zyc2hscV9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc2hscV9zNjQKICAgcmV0dXJuIHZyc2hscV9zNjQoYSwgYik7CiAvLyBDSEVDSzogc3JzaGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiB1aW50OHgxNl90IHRlc3RfdnJzaGxxX3U4KHVpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zyc2hscV91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaGxxX3U4CiAgIHJldHVybiB2cnNobHFfdTgoYSwgYik7CiAvLyBDSEVDSzogdXJzaGwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiB1aW50MTZ4OF90IHRlc3RfdnJzaGxxX3UxNih1aW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cnNobHFfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNobHFfdTE2CiAgIHJldHVybiB2cnNobHFfdTE2KGEsIGIpOwogLy8gQ0hFQ0s6IHVyc2hsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3Zyc2hscV91MzIodWludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnJzaGxxX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaGxxX3UzMgogICByZXR1cm4gdnJzaGxxX3UzMihhLCBiKTsKIC8vIENIRUNLOiB1cnNobCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92cnNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zyc2hscV91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc2hscV91NjQKICAgcmV0dXJuIHZyc2hscV91NjQoYSwgYik7CiAvLyBDSEVDSzogdXJzaGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiAKIGludDh4OF90IHRlc3RfdnFyc2hsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobF9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyc2hsX3M4CiAgIHJldHVybiB2cXJzaGxfczgoYSwgYik7CiAvLyBDSEVDSzogc3Fyc2hsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnFyc2hsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobF9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNobF9zMTYKICAgcmV0dXJuIHZxcnNobF9zMTYoYSwgYik7CiAvLyBDSEVDSzogc3Fyc2hsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnFyc2hsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNobF9zMzIKICAgcmV0dXJuIHZxcnNobF9zMzIoYSwgYik7CiAvLyBDSEVDSzogc3Fyc2hsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50NjR4MV90IHRlc3RfdnFyc2hsX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobF9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNobF9zNjQKICAgcmV0dXJuIHZxcnNobF9zNjQoYSwgYik7CiAvLyBDSEVDSzogc3Fyc2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDh4OF90IHRlc3RfdnFyc2hsX3U4KHVpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXJzaGxfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNobF91OAogICByZXR1cm4gdnFyc2hsX3U4KGEsIGIpOwogLy8gQ0hFQ0s6IHVxcnNobCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92cXJzaGxfdTE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobF91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNobF91MTYKICAgcmV0dXJuIHZxcnNobF91MTYoYSwgYik7CiAvLyBDSEVDSzogdXFyc2hsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZxcnNobF91MzIodWludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFyc2hsX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyc2hsX3UzMgogICByZXR1cm4gdnFyc2hsX3UzMihhLCBiKTsKIC8vIENIRUNLOiB1cXJzaGwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiB1aW50NjR4MV90IHRlc3RfdnFyc2hsX3U2NCh1aW50NjR4MV90IGEsIGludDY0eDFfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXJzaGxfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaGxfdTY0CiAgIHJldHVybiB2cXJzaGxfdTY0KGEsIGIpOwogLy8gQ0hFQ0s6IHVxcnNobCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZxcnNobHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXJzaGxxX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaGxxX3M4CiAgIHJldHVybiB2cXJzaGxxX3M4KGEsIGIpOwogLy8gQ0hFQ0s6IHNxcnNobCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZxcnNobHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFyc2hscV9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNobHFfczE2CiAgIHJldHVybiB2cXJzaGxxX3MxNihhLCBiKTsKIC8vIENIRUNLOiBzcXJzaGwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQzMng0X3QgdGVzdF92cXJzaGxxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobHFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaGxxX3MzMgogICByZXR1cm4gdnFyc2hscV9zMzIoYSwgYik7CiAvLyBDSEVDSzogc3Fyc2hsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnFyc2hscV9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXJzaGxxX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyc2hscV9zNjQKICAgcmV0dXJuIHZxcnNobHFfczY0KGEsIGIpOwogLy8gQ0hFQ0s6IHNxcnNobCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobHFfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNobHFfdTgKIHVpbnQ4eDE2X3QgdGVzdF92cXJzaGxxX3U4KHVpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKICAgcmV0dXJuIHZxcnNobHFfdTgoYSwgYik7CiAvLyBDSEVDSzogdXFyc2hsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZxcnNobHFfdTE2KHVpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobHFfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaGxxX3UxNgogICByZXR1cm4gdnFyc2hscV91MTYoYSwgYik7CiAvLyBDSEVDSzogdXFyc2hsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZxcnNobHFfdTMyKHVpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobHFfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaGxxX3UzMgogICByZXR1cm4gdnFyc2hscV91MzIoYSwgYik7CiAvLyBDSEVDSzogdXFyc2hsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZxcnNobHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobHFfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaGxxX3U2NAogICByZXR1cm4gdnFyc2hscV91NjQoYSwgYik7CiAvLyBDSEVDSzogdXFyc2hsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAorcG9seTY0eDFfdCB0ZXN0X3ZzbGlfbl9wNjQocG9seTY0eDFfdCBhLCBwb2x5NjR4MV90IGIpIHsKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzbGlfbl9wNjQKKyAgcmV0dXJuIHZzbGlfbl9wNjQoYSwgYiwgMCk7IAorLy8gQ0hFQ0s6IHNsaSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMwCit9CisKK3BvbHk2NHgyX3QgdGVzdF92c2xpcV9uX3A2NChwb2x5NjR4Ml90IGEsIHBvbHk2NHgyX3QgYikgeworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNsaXFfbl9wNjQKKyAgcmV0dXJuIHZzbGlxX25fcDY0KGEsIGIsIDApOyAKKy8vIENIRUNLOiBzbGkge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjMAorfQorCiBpbnQ4eDhfdCB0ZXN0X3ZtYXhfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1heF9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heF9zOAogICByZXR1cm4gdm1heF9zOChhLCBiKTsKIC8vIENIRUNLOiBzbWF4IHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MTZ4NF90IHRlc3Rfdm1heF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92bWF4X3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heF9zMTYKICAgcmV0dXJuIHZtYXhfczE2KGEsIGIpOwogLy8gQ0hFQ0s6IHNtYXgge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQzMngyX3QgdGVzdF92bWF4X3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtYXhfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4X3MzMgogICByZXR1cm4gdm1heF9zMzIoYSwgYik7CiAvLyBDSEVDSzogc21heCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZtYXhfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92bWF4X3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4X3U4CiAgIHJldHVybiB2bWF4X3U4KGEsIGIpOwogLy8gQ0hFQ0s6IHVtYXgge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3Rfdm1heF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtYXhfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4X3UxNgogICByZXR1cm4gdm1heF91MTYoYSwgYik7CiAvLyBDSEVDSzogdW1heCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92bWF4X3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1heF91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtYXhfdTMyCiAgIHJldHVybiB2bWF4X3UzMihhLCBiKTsKIC8vIENIRUNLOiB1bWF4IHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92bWF4X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92bWF4X2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heF9mMzIKICAgcmV0dXJuIHZtYXhfZjMyKGEsIGIpOwogLy8gQ0hFQ0s6IGZtYXgge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBpbnQ4eDE2X3QgdGVzdF92bWF4cV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtYXhxX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4cV9zOAogICByZXR1cm4gdm1heHFfczgoYSwgYik7CiAvLyBDSEVDSzogc21heCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtYXhxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtYXhxX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heHFfczE2CiAgIHJldHVybiB2bWF4cV9zMTYoYSwgYik7CiAvLyBDSEVDSzogc21heCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtYXhxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtYXhxX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heHFfczMyCiAgIHJldHVybiB2bWF4cV9zMzIoYSwgYik7CiAvLyBDSEVDSzogc21heCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92bWF4cV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1heHFfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtYXhxX3U4CiAgIHJldHVybiB2bWF4cV91OChhLCBiKTsKIC8vIENIRUNLOiB1bWF4IHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZtYXhxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1heHFfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4cV91MTYKICAgcmV0dXJuIHZtYXhxX3UxNihhLCBiKTsKIC8vIENIRUNLOiB1bWF4IHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZtYXhxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1heHFfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4cV91MzIKICAgcmV0dXJuIHZtYXhxX3UzMihhLCBiKTsKIC8vIENIRUNLOiB1bWF4IHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92bWF4cV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1heHFfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4cV9mMzIKICAgcmV0dXJuIHZtYXhxX2YzMihhLCBiKTsKIC8vIENIRUNLOiBmbWF4IHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92bWF4cV9mNjQoZmxvYXQ2NHgyX3QgYSwgZmxvYXQ2NHgyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1heHFfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4cV9mNjQKICAgcmV0dXJuIHZtYXhxX2Y2NChhLCBiKTsKIC8vIENIRUNLOiBmbWF4IHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogCiBpbnQ4eDhfdCB0ZXN0X3ZtaW5fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1pbl9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1pbl9zOAogICByZXR1cm4gdm1pbl9zOChhLCBiKTsKIC8vIENIRUNLOiBzbWluIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MTZ4NF90IHRlc3Rfdm1pbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92bWluX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1pbl9zMTYKICAgcmV0dXJuIHZtaW5fczE2KGEsIGIpOwogLy8gQ0hFQ0s6IHNtaW4ge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQzMngyX3QgdGVzdF92bWluX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtaW5fczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWluX3MzMgogICByZXR1cm4gdm1pbl9zMzIoYSwgYik7CiAvLyBDSEVDSzogc21pbiB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZtaW5fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92bWluX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWluX3U4CiAgIHJldHVybiB2bWluX3U4KGEsIGIpOwogLy8gQ0hFQ0s6IHVtaW4ge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3Rfdm1pbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtaW5fdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWluX3UxNgogICByZXR1cm4gdm1pbl91MTYoYSwgYik7CiAvLyBDSEVDSzogdW1pbiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92bWluX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1pbl91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtaW5fdTMyCiAgIHJldHVybiB2bWluX3UzMihhLCBiKTsKIC8vIENIRUNLOiB1bWluIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92bWluX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92bWluX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1pbl9mMzIKICAgcmV0dXJuIHZtaW5fZjMyKGEsIGIpOwogLy8gQ0hFQ0s6IGZtaW4ge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBpbnQ4eDE2X3QgdGVzdF92bWlucV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtaW5xX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWlucV9zOAogICByZXR1cm4gdm1pbnFfczgoYSwgYik7CiAvLyBDSEVDSzogc21pbiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtaW5xX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtaW5xX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1pbnFfczE2CiAgIHJldHVybiB2bWlucV9zMTYoYSwgYik7CiAvLyBDSEVDSzogc21pbiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZtaW5xX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtaW5xX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1pbnFfczMyCiAgIHJldHVybiB2bWlucV9zMzIoYSwgYik7CiAvLyBDSEVDSzogc21pbiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92bWlucV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1pbnFfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtaW5xX3U4CiAgIHJldHVybiB2bWlucV91OChhLCBiKTsKIC8vIENIRUNLOiB1bWluIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZtaW5xX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1pbnFfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWlucV91MTYKICAgcmV0dXJuIHZtaW5xX3UxNihhLCBiKTsKIC8vIENIRUNLOiB1bWluIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZtaW5xX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1pbnFfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWlucV91MzIKICAgcmV0dXJuIHZtaW5xX3UzMihhLCBiKTsKIC8vIENIRUNLOiB1bWluIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92bWlucV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1pbnFfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWlucV9mMzIKICAgcmV0dXJuIHZtaW5xX2YzMihhLCBiKTsKIC8vIENIRUNLOiBmbWluIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92bWlucV9mNjQoZmxvYXQ2NHgyX3QgYSwgZmxvYXQ2NHgyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1pbnFfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWlucV9mNjQKICAgcmV0dXJuIHZtaW5xX2Y2NChhLCBiKTsKIC8vIENIRUNLOiBmbWluIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92bWF4bm1fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtYXhubV9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtYXhubV9mMzIKICAgcmV0dXJuIHZtYXhubV9mMzIoYSwgYik7CiAvLyBDSEVDSzogZm1heG5tIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92bWF4bm1xX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92bWF4bm1xX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heG5tcV9mMzIKICAgcmV0dXJuIHZtYXhubXFfZjMyKGEsIGIpOwogLy8gQ0hFQ0s6IGZtYXhubSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3Rfdm1heG5tcV9mNjQoZmxvYXQ2NHgyX3QgYSwgZmxvYXQ2NHgyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1heG5tcV9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtYXhubXFfZjY0CiAgIHJldHVybiB2bWF4bm1xX2Y2NChhLCBiKTsKIC8vIENIRUNLOiBmbWF4bm0ge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZtaW5ubV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm1pbm5tX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1pbm5tX2YzMgogICByZXR1cm4gdm1pbm5tX2YzMihhLCBiKTsKIC8vIENIRUNLOiBmbWlubm0ge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZtaW5ubXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtaW5ubXFfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92bWlubm1xX2YzMgogICByZXR1cm4gdm1pbm5tcV9mMzIoYSwgYik7CiAvLyBDSEVDSzogZm1pbm5tIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92bWlubm1xX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92bWlubm1xX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1pbm5tcV9mNjQKICAgcmV0dXJuIHZtaW5ubXFfZjY0KGEsIGIpOwogLy8gQ0hFQ0s6IGZtaW5ubSB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIGludDh4OF90IHRlc3RfdnBtYXhfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBtYXhfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWF4X3M4CiAgIHJldHVybiB2cG1heF9zOChhLCBiKTsKIC8vIENIRUNLOiBzbWF4cCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZwbWF4X3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWF4X3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtYXhfczE2CiAgIHJldHVybiB2cG1heF9zMTYoYSwgYik7CiAvLyBDSEVDSzogc21heHAge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQzMngyX3QgdGVzdF92cG1heF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1heF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWF4X3MzMgogICByZXR1cm4gdnBtYXhfczMyKGEsIGIpOwogLy8gQ0hFQ0s6IHNtYXhwIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDh4OF90IHRlc3RfdnBtYXhfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1heF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtYXhfdTgKICAgcmV0dXJuIHZwbWF4X3U4KGEsIGIpOwogLy8gQ0hFQ0s6IHVtYXhwIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZwbWF4X3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBtYXhfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1heF91MTYKICAgcmV0dXJuIHZwbWF4X3UxNihhLCBiKTsKIC8vIENIRUNLOiB1bWF4cCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92cG1heF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWF4X3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtYXhfdTMyCiAgIHJldHVybiB2cG1heF91MzIoYSwgYik7CiAvLyBDSEVDSzogdW1heHAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZwbWF4X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1heF9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWF4X2YzMgogICByZXR1cm4gdnBtYXhfZjMyKGEsIGIpOwogLy8gQ0hFQ0s6IGZtYXhwIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50OHgxNl90IHRlc3RfdnBtYXhxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBtYXhxX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1heHFfczgKICAgcmV0dXJuIHZwbWF4cV9zOChhLCBiKTsKIC8vIENIRUNLOiBzbWF4cCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZwbWF4cV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1heHFfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1heHFfczE2CiAgIHJldHVybiB2cG1heHFfczE2KGEsIGIpOwogLy8gQ0hFQ0s6IHNtYXhwIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogaW50MzJ4NF90IHRlc3RfdnBtYXhxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWF4cV9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWF4cV9zMzIKICAgcmV0dXJuIHZwbWF4cV9zMzIoYSwgYik7CiAvLyBDSEVDSzogc21heHAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50OHgxNl90IHRlc3RfdnBtYXhxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1heHFfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWF4cV91OAogICByZXR1cm4gdnBtYXhxX3U4KGEsIGIpOwogLy8gQ0hFQ0s6IHVtYXhwIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZwbWF4cV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWF4cV91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWF4cV91MTYKICAgcmV0dXJuIHZwbWF4cV91MTYoYSwgYik7CiAvLyBDSEVDSzogdW1heHAge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiB1aW50MzJ4NF90IHRlc3RfdnBtYXhxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBtYXhxX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtYXhxX3UzMgogICByZXR1cm4gdnBtYXhxX3UzMihhLCBiKTsKIC8vIENIRUNLOiB1bWF4cCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnBtYXhxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1heHFfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1heHFfZjMyCiAgIHJldHVybiB2cG1heHFfZjMyKGEsIGIpOwogLy8gQ0hFQ0s6IGZtYXhwIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92cG1heHFfZjY0KGZsb2F0NjR4Ml90IGEsIGZsb2F0NjR4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWF4cV9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWF4cV9mNjQKICAgcmV0dXJuIHZwbWF4cV9mNjQoYSwgYik7CiAvLyBDSEVDSzogZm1heHAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZwbWluX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWluX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1pbl9zOAogICByZXR1cm4gdnBtaW5fczgoYSwgYik7CiAvLyBDSEVDSzogc21pbnAge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQxNng0X3QgdGVzdF92cG1pbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1pbl9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWluX3MxNgogICByZXR1cm4gdnBtaW5fczE2KGEsIGIpOwogLy8gQ0hFQ0s6IHNtaW5wIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnBtaW5fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBtaW5fczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1pbl9zMzIKICAgcmV0dXJuIHZwbWluX3MzMihhLCBiKTsKIC8vIENIRUNLOiBzbWlucCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZwbWluX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBtaW5fdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWluX3U4CiAgIHJldHVybiB2cG1pbl91OChhLCBiKTsKIC8vIENIRUNLOiB1bWlucCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92cG1pbl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWluX3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtaW5fdTE2CiAgIHJldHVybiB2cG1pbl91MTYoYSwgYik7CiAvLyBDSEVDSzogdW1pbnAge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdnBtaW5fdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1pbl91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWluX3UzMgogICByZXR1cm4gdnBtaW5fdTMyKGEsIGIpOwogLy8gQ0hFQ0s6IHVtaW5wIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92cG1pbl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBtaW5fZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1pbl9mMzIKICAgcmV0dXJuIHZwbWluX2YzMihhLCBiKTsKIC8vIENIRUNLOiBmbWlucCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZwbWlucV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWlucV9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtaW5xX3M4CiAgIHJldHVybiB2cG1pbnFfczgoYSwgYik7CiAvLyBDSEVDSzogc21pbnAge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQxNng4X3QgdGVzdF92cG1pbnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBtaW5xX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtaW5xX3MxNgogICByZXR1cm4gdnBtaW5xX3MxNihhLCBiKTsKIC8vIENIRUNLOiBzbWlucCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZwbWlucV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1pbnFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1pbnFfczMyCiAgIHJldHVybiB2cG1pbnFfczMyKGEsIGIpOwogLy8gQ0hFQ0s6IHNtaW5wIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZwbWlucV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBtaW5xX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1pbnFfdTgKICAgcmV0dXJuIHZwbWlucV91OChhLCBiKTsKIC8vIENIRUNLOiB1bWlucCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92cG1pbnFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1pbnFfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1pbnFfdTE2CiAgIHJldHVybiB2cG1pbnFfdTE2KGEsIGIpOwogLy8gQ0hFQ0s6IHVtaW5wIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZwbWlucV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWlucV91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWlucV91MzIKICAgcmV0dXJuIHZwbWlucV91MzIoYSwgYik7CiAvLyBDSEVDSzogdW1pbnAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZwbWlucV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBtaW5xX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtaW5xX2YzMgogICByZXR1cm4gdnBtaW5xX2YzMihhLCBiKTsKIC8vIENIRUNLOiBmbWlucCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdnBtaW5xX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1pbnFfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1pbnFfZjY0CiAgIHJldHVybiB2cG1pbnFfZjY0KGEsIGIpOwogLy8gQ0hFQ0s6IGZtaW5wIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92cG1heG5tX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1heG5tX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtYXhubV9mMzIKICAgcmV0dXJuIHZwbWF4bm1fZjMyKGEsIGIpOwogLy8gQ0hFQ0s6IGZtYXhubXAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZwbWF4bm1xX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1heG5tcV9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWF4bm1xX2YzMgogICByZXR1cm4gdnBtYXhubXFfZjMyKGEsIGIpOwogLy8gQ0hFQ0s6IGZtYXhubXAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZwbWF4bm1xX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cG1heG5tcV9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWF4bm1xX2Y2NAogICByZXR1cm4gdnBtYXhubXFfZjY0KGEsIGIpOwogLy8gQ0hFQ0s6IGZtYXhubXAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZwbWlubm1fZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWlubm1fZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1pbm5tX2YzMgogICByZXR1cm4gdnBtaW5ubV9mMzIoYSwgYik7CiAvLyBDSEVDSzogZm1pbm5tcCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnBtaW5ubXFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWlubm1xX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtaW5ubXFfZjMyCiAgIHJldHVybiB2cG1pbm5tcV9mMzIoYSwgYik7CiAvLyBDSEVDSzogZm1pbm5tcCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdnBtaW5ubXFfZjY0KGZsb2F0NjR4Ml90IGEsIGZsb2F0NjR4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwbWlubm1xX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtaW5ubXFfZjY0CiAgIHJldHVybiB2cG1pbm5tcV9mNjQoYSwgYik7CiAvLyBDSEVDSzogZm1pbm5tcCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIGludDh4OF90IHRlc3RfdnBhZGRfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBhZGRfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkX3M4CiAgIHJldHVybiB2cGFkZF9zOChhLCBiKTsKIC8vIENIRUNLOiBhZGRwIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnBhZGRfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBhZGRfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkZF9zMTYKICAgcmV0dXJuIHZwYWRkX3MxNihhLCBiKTsKIC8vIENIRUNLOiBhZGRwIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnBhZGRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBhZGRfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkZF9zMzIKICAgcmV0dXJuIHZwYWRkX3MzMihhLCBiKTsKIC8vIENIRUNLOiBhZGRwIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDh4OF90IHRlc3RfdnBhZGRfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cGFkZF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGRfdTgKICAgcmV0dXJuIHZwYWRkX3U4KGEsIGIpOwogLy8gQ0hFQ0s6IGFkZHAge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MTZ4NF90IHRlc3RfdnBhZGRfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cGFkZF91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkX3UxNgogICByZXR1cm4gdnBhZGRfdTE2KGEsIGIpOwogLy8gQ0hFQ0s6IGFkZHAge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdnBhZGRfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cGFkZF91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkX3UzMgogICByZXR1cm4gdnBhZGRfdTMyKGEsIGIpOwogLy8gQ0hFQ0s6IGFkZHAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZwYWRkX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cGFkZF9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkX2YzMgogICByZXR1cm4gdnBhZGRfZjMyKGEsIGIpOwogLy8gQ0hFQ0s6IGZhZGRwIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50OHgxNl90IHRlc3RfdnBhZGRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBhZGRxX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkZHFfczgKICAgcmV0dXJuIHZwYWRkcV9zOChhLCBiKTsKIC8vIENIRUNLOiBhZGRwIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4OF90IHRlc3RfdnBhZGRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwYWRkcV9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkcV9zMTYKICAgcmV0dXJuIHZwYWRkcV9zMTYoYSwgYik7CiAvLyBDSEVDSzogYWRkcCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZwYWRkcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cGFkZHFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkZHFfczMyCiAgIHJldHVybiB2cGFkZHFfczMyKGEsIGIpOwogLy8gQ0hFQ0s6IGFkZHAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50OHgxNl90IHRlc3RfdnBhZGRxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cGFkZHFfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkcV91OAogICByZXR1cm4gdnBhZGRxX3U4KGEsIGIpOwogLy8gQ0hFQ0s6IGFkZHAge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiB1aW50MTZ4OF90IHRlc3RfdnBhZGRxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnBhZGRxX3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGRxX3UxNgogICByZXR1cm4gdnBhZGRxX3UxNihhLCBiKTsKIC8vIENIRUNLOiBhZGRwIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZwYWRkcV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwYWRkcV91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkcV91MzIKICAgcmV0dXJuIHZwYWRkcV91MzIoYSwgYik7CiAvLyBDSEVDSzogYWRkcCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnBhZGRxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cGFkZHFfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkZHFfZjMyCiAgIHJldHVybiB2cGFkZHFfZjMyKGEsIGIpOwogLy8gQ0hFQ0s6IGZhZGRwIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92cGFkZHFfZjY0KGZsb2F0NjR4Ml90IGEsIGZsb2F0NjR4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZwYWRkcV9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkcV9mNjQKICAgcmV0dXJuIHZwYWRkcV9mNjQoYSwgYik7CiAvLyBDSEVDSzogZmFkZHAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBpbnQxNng0X3QgdGVzdF92cWRtdWxoX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxZG11bGhfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxoX3MxNgogICByZXR1cm4gdnFkbXVsaF9zMTYoYSwgYik7CiAvLyBDSEVDSzogc3FkbXVsaCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZxZG11bGhfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsaF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGhfczMyCiAgIHJldHVybiB2cWRtdWxoX3MzMihhLCBiKTsKIC8vIENIRUNLOiBzcWRtdWxoIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50MTZ4OF90IHRlc3RfdnFkbXVsaHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsaHFfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxocV9zMTYKICAgcmV0dXJuIHZxZG11bGhxX3MxNihhLCBiKTsKIC8vIENIRUNLOiBzcWRtdWxoIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogaW50MzJ4NF90IHRlc3RfdnFkbXVsaHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsaHFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxocV9zMzIKICAgcmV0dXJuIHZxZG11bGhxX3MzMihhLCBiKTsKIC8vIENIRUNLOiBzcWRtdWxoIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50MTZ4NF90IHRlc3RfdnFyZG11bGhfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFyZG11bGhfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJkbXVsaF9zMTYKICAgcmV0dXJuIHZxcmRtdWxoX3MxNihhLCBiKTsKIC8vIENIRUNLOiBzcXJkbXVsaCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZxcmRtdWxoX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcmRtdWxoX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhfczMyCiAgIHJldHVybiB2cXJkbXVsaF9zMzIoYSwgYik7CiAvLyBDSEVDSzogc3FyZG11bGgge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBpbnQxNng4X3QgdGVzdF92cXJkbXVsaHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFyZG11bGhxX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhxX3MxNgogICByZXR1cm4gdnFyZG11bGhxX3MxNihhLCBiKTsKIC8vIENIRUNLOiBzcXJkbXVsaCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxcmRtdWxocV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXJkbXVsaHFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJkbXVsaHFfczMyCiAgIHJldHVybiB2cXJkbXVsaHFfczMyKGEsIGIpOwogLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAotCiBmbG9hdDMyeDJfdCB0ZXN0X3ZtdWx4X2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92bXVseF9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWx4X2YzMgogICByZXR1cm4gdm11bHhfZjMyKGEsIGIpOwogLy8gQ0hFQ0s6IGZtdWx4IHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92bXVseHFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtdWx4cV9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWx4cV9mMzIKICAgcmV0dXJuIHZtdWx4cV9mMzIoYSwgYik7CiAvLyBDSEVDSzogZm11bHgge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZtdWx4cV9mNjQoZmxvYXQ2NHgyX3QgYSwgZmxvYXQ2NHgyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm11bHhxX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHhxX2Y2NAogICByZXR1cm4gdm11bHhxX2Y2NChhLCBiKTsKIC8vIENIRUNLOiBmbXVseCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIGludDh4OF90IHRlc3RfdnNobF9uX3M4KGludDh4OF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxfbl9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobF9uX3M4CiAgIHJldHVybiB2c2hsX25fczgoYSwgMyk7CiAvLyBDSEVDSzogc2hsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgIzMKIH0KIAogaW50MTZ4NF90IHRlc3RfdnNobF9uX3MxNihpbnQxNng0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnNobF9uX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobF9uX3MxNgogICByZXR1cm4gdnNobF9uX3MxNihhLCAzKTsKIC8vIENIRUNLOiBzaGwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAjMwogfQogCiBpbnQzMngyX3QgdGVzdF92c2hsX25fczMyKGludDMyeDJfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hsX25fczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsX25fczMyCiAgIHJldHVybiB2c2hsX25fczMyKGEsIDMpOwogLy8gQ0hFQ0s6IHNobCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsICMzCiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZzaGxxX25fczgoaW50OHgxNl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxxX25fczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxxX25fczgKICAgcmV0dXJuIHZzaGxxX25fczgoYSwgMyk7CiAvLyBDSEVDSzogc2hsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMwogfQogCiBpbnQxNng4X3QgdGVzdF92c2hscV9uX3MxNihpbnQxNng4X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnNobHFfbl9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxxX25fczE2CiAgIHJldHVybiB2c2hscV9uX3MxNihhLCAzKTsKIC8vIENIRUNLOiBzaGwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCAjMwogfQogCiBpbnQzMng0X3QgdGVzdF92c2hscV9uX3MzMihpbnQzMng0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnNobHFfbl9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxxX25fczMyCiAgIHJldHVybiB2c2hscV9uX3MzMihhLCAzKTsKIC8vIENIRUNLOiBzaGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCAjMwogfQogCiBpbnQ2NHgyX3QgdGVzdF92c2hscV9uX3M2NChpbnQ2NHgyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnNobHFfbl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxxX25fczY0CiAgIHJldHVybiB2c2hscV9uX3M2NChhLCAzKTsKIC8vIENIRUNLOiBzaGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjMwogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZzaGxfbl91OChpbnQ4eDhfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hsX25fdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxfbl91OAogICByZXR1cm4gdnNobF9uX3U4KGEsIDMpOwogLy8gQ0hFQ0s6IHNobCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICMzCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZzaGxfbl91MTYoaW50MTZ4NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxfbl91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxfbl91MTYKICAgcmV0dXJuIHZzaGxfbl91MTYoYSwgMyk7CiAvLyBDSEVDSzogc2hsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgIzMKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnNobF9uX3UzMihpbnQzMngyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnNobF9uX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobF9uX3UzMgogICByZXR1cm4gdnNobF9uX3UzMihhLCAzKTsKIC8vIENIRUNLOiBzaGwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMwogfQogCiBpbnQ4eDE2X3QgdGVzdF92c2hscV9uX3U4KGludDh4MTZfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hscV9uX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hscV9uX3U4CiAgIHJldHVybiB2c2hscV9uX3U4KGEsIDMpOwogLy8gQ0hFQ0s6IHNobCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzMKIH0KIAogaW50MTZ4OF90IHRlc3RfdnNobHFfbl91MTYoaW50MTZ4OF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxxX25fdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hscV9uX3UxNgogICByZXR1cm4gdnNobHFfbl91MTYoYSwgMyk7CiAvLyBDSEVDSzogc2hsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogaW50MzJ4NF90IHRlc3RfdnNobHFfbl91MzIoaW50MzJ4NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxxX25fdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hscV9uX3UzMgogICByZXR1cm4gdnNobHFfbl91MzIoYSwgMyk7CiAvLyBDSEVDSzogc2hsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywgIzMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnNobHFfbl91NjQoaW50NjR4Ml90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxxX25fdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hscV9uX3U2NAogICByZXR1cm4gdnNobHFfbl91NjQoYSwgMyk7CiAvLyBDSEVDSzogc2hsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzMKIH0KIAogaW50OHg4X3QgdGVzdF92c2hyX25fczgoaW50OHg4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92c2hyX25fczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocl9uX3M4CiAgIHJldHVybiB2c2hyX25fczgoYSwgMyk7CiAgIC8vIENIRUNLOiBzc2hyIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgIzMKIH0KIAogaW50MTZ4NF90IHRlc3RfdnNocl9uX3MxNihpbnQxNng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92c2hyX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaHJfbl9zMTYKICAgcmV0dXJuIHZzaHJfbl9zMTYoYSwgMyk7CiAgIC8vIENIRUNLOiBzc2hyIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgIzMKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnNocl9uX3MzMihpbnQzMngyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92c2hyX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaHJfbl9zMzIKICAgcmV0dXJuIHZzaHJfbl9zMzIoYSwgMyk7CiAgIC8vIENIRUNLOiBzc2hyIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzMKIH0KIAogaW50OHgxNl90IHRlc3RfdnNocnFfbl9zOChpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92c2hycV9uX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaHJxX25fczgKICAgcmV0dXJuIHZzaHJxX25fczgoYSwgMyk7CiAgIC8vIENIRUNLOiBzc2hyIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMwogfQogCiBpbnQxNng4X3QgdGVzdF92c2hycV9uX3MxNihpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92c2hycV9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hycV9uX3MxNgogICByZXR1cm4gdnNocnFfbl9zMTYoYSwgMyk7CiAgIC8vIENIRUNLOiBzc2hyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogaW50MzJ4NF90IHRlc3RfdnNocnFfbl9zMzIoaW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNocnFfbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocnFfbl9zMzIKICAgcmV0dXJuIHZzaHJxX25fczMyKGEsIDMpOwogICAvLyBDSEVDSzogc3NociB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMzCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZzaHJxX25fczY0KGludDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaHJxX25fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaHJxX25fczY0CiAgIHJldHVybiB2c2hycV9uX3M2NChhLCAzKTsKICAgLy8gQ0hFQ0s6IHNzaHIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjMwogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZzaHJfbl91OChpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaHJfbl91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hyX25fdTgKICAgcmV0dXJuIHZzaHJfbl91OChhLCAzKTsKICAgLy8gQ0hFQ0s6IHVzaHIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMwogfQogCiBpbnQxNng0X3QgdGVzdF92c2hyX25fdTE2KGludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaHJfbl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocl9uX3UxNgogICByZXR1cm4gdnNocl9uX3UxNihhLCAzKTsKICAgLy8gQ0hFQ0s6IHVzaHIge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAjMwogfQogCiBpbnQzMngyX3QgdGVzdF92c2hyX25fdTMyKGludDMyeDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaHJfbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocl9uX3UzMgogICByZXR1cm4gdnNocl9uX3UzMihhLCAzKTsKICAgLy8gQ0hFQ0s6IHVzaHIge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMwogfQogCiBpbnQ4eDE2X3QgdGVzdF92c2hycV9uX3U4KGludDh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaHJxX25fdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocnFfbl91OAogICByZXR1cm4gdnNocnFfbl91OChhLCAzKTsKICAgLy8gQ0hFQ0s6IHVzaHIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICMzCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZzaHJxX25fdTE2KGludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaHJxX25fdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaHJxX25fdTE2CiAgIHJldHVybiB2c2hycV9uX3UxNihhLCAzKTsKICAgLy8gQ0hFQ0s6IHVzaHIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCAjMwogfQogCiBpbnQzMng0X3QgdGVzdF92c2hycV9uX3UzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92c2hycV9uX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hycV9uX3UzMgogICByZXR1cm4gdnNocnFfbl91MzIoYSwgMyk7CiAgIC8vIENIRUNLOiB1c2hyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywgIzMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnNocnFfbl91NjQoaW50NjR4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNocnFfbl91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocnFfbl91NjQKICAgcmV0dXJuIHZzaHJxX25fdTY0KGEsIDMpOwogICAvLyBDSEVDSzogdXNociB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICMzCiB9CiAKIGludDh4OF90IHRlc3RfdnNyYV9uX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyYV9uX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzcmFfbl9zOAogICByZXR1cm4gdnNyYV9uX3M4KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3NyYSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICMzCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZzcmFfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzcmFfbl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyYV9uX3MxNgogICByZXR1cm4gdnNyYV9uX3MxNihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNzcmEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAjMwogfQogCiBpbnQzMngyX3QgdGVzdF92c3JhX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JhX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzcmFfbl9zMzIKICAgcmV0dXJuIHZzcmFfbl9zMzIoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzc3JhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzMKIH0KIAogaW50OHgxNl90IHRlc3RfdnNyYXFfbl9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyYXFfbl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JhcV9uX3M4CiAgIHJldHVybiB2c3JhcV9uX3M4KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3NyYSB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzMKIH0KIAogaW50MTZ4OF90IHRlc3RfdnNyYXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzcmFxX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzcmFxX25fczE2CiAgIHJldHVybiB2c3JhcV9uX3MxNihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNzcmEge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCAjMwogfQogCiBpbnQzMng0X3QgdGVzdF92c3JhcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyYXFfbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyYXFfbl9zMzIKICAgcmV0dXJuIHZzcmFxX25fczMyKGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3NyYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMzCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZzcmFxX25fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JhcV9uX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JhcV9uX3M2NAogICByZXR1cm4gdnNyYXFfbl9zNjQoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzc3JhIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzMKIH0KIAogaW50OHg4X3QgdGVzdF92c3JhX25fdTgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JhX25fdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyYV9uX3U4CiAgIHJldHVybiB2c3JhX25fdTgoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiB1c3JhIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgIzMKIH0KIAogaW50MTZ4NF90IHRlc3RfdnNyYV9uX3UxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyYV9uX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JhX25fdTE2CiAgIHJldHVybiB2c3JhX25fdTE2KGEsIGIsIDMpOwogICAvLyBDSEVDSzogdXNyYSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsICMzCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZzcmFfbl91MzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzcmFfbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyYV9uX3UzMgogICByZXR1cm4gdnNyYV9uX3UzMihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHVzcmEge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMwogfQogCiBpbnQ4eDE2X3QgdGVzdF92c3JhcV9uX3U4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JhcV9uX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzcmFxX25fdTgKICAgcmV0dXJuIHZzcmFxX25fdTgoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiB1c3JhIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMwogfQogCiBpbnQxNng4X3QgdGVzdF92c3JhcV9uX3UxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyYXFfbl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyYXFfbl91MTYKICAgcmV0dXJuIHZzcmFxX25fdTE2KGEsIGIsIDMpOwogICAvLyBDSEVDSzogdXNyYSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZzcmFxX25fdTMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JhcV9uX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JhcV9uX3UzMgogICByZXR1cm4gdnNyYXFfbl91MzIoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiB1c3JhIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywgIzMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnNyYXFfbl91NjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzcmFxX25fdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzcmFxX25fdTY0CiAgIHJldHVybiB2c3JhcV9uX3U2NChhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHVzcmEge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjMwogfQogCiBpbnQ4eDhfdCB0ZXN0X3Zyc2hyX25fczgoaW50OHg4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cnNocl9uX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc2hyX25fczgKICAgcmV0dXJuIHZyc2hyX25fczgoYSwgMyk7CiAgIC8vIENIRUNLOiBzcnNociB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICMzCiB9CiAKIGludDE2eDRfdCB0ZXN0X3Zyc2hyX25fczE2KGludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc2hyX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc2hyX25fczE2CiAgIHJldHVybiB2cnNocl9uX3MxNihhLCAzKTsKICAgLy8gQ0hFQ0s6IHNyc2hyIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgIzMKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnJzaHJfbl9zMzIoaW50MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJzaHJfbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaHJfbl9zMzIKICAgcmV0dXJuIHZyc2hyX25fczMyKGEsIDMpOwogICAvLyBDSEVDSzogc3JzaHIge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMwogfQogCiBpbnQ4eDE2X3QgdGVzdF92cnNocnFfbl9zOChpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cnNocnFfbl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocnFfbl9zOAogICByZXR1cm4gdnJzaHJxX25fczgoYSwgMyk7CiAgIC8vIENIRUNLOiBzcnNociB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzMKIH0KIAogaW50MTZ4OF90IHRlc3RfdnJzaHJxX25fczE2KGludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc2hycV9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocnFfbl9zMTYKICAgcmV0dXJuIHZyc2hycV9uX3MxNihhLCAzKTsKICAgLy8gQ0hFQ0s6IHNyc2hyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogaW50MzJ4NF90IHRlc3RfdnJzaHJxX25fczMyKGludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc2hycV9uX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocnFfbl9zMzIKICAgcmV0dXJuIHZyc2hycV9uX3MzMihhLCAzKTsKICAgLy8gQ0hFQ0s6IHNyc2hyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywgIzMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnJzaHJxX25fczY0KGludDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc2hycV9uX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocnFfbl9zNjQKICAgcmV0dXJuIHZyc2hycV9uX3M2NChhLCAzKTsKICAgLy8gQ0hFQ0s6IHNyc2hyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzMKIH0KIAogaW50OHg4X3QgdGVzdF92cnNocl9uX3U4KGludDh4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJzaHJfbl91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocl9uX3U4CiAgIHJldHVybiB2cnNocl9uX3U4KGEsIDMpOwogICAvLyBDSEVDSzogdXJzaHIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMwogfQogCiBpbnQxNng0X3QgdGVzdF92cnNocl9uX3UxNihpbnQxNng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cnNocl9uX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocl9uX3UxNgogICByZXR1cm4gdnJzaHJfbl91MTYoYSwgMyk7CiAgIC8vIENIRUNLOiB1cnNociB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsICMzCiB9CiAKIGludDMyeDJfdCB0ZXN0X3Zyc2hyX25fdTMyKGludDMyeDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc2hyX25fdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc2hyX25fdTMyCiAgIHJldHVybiB2cnNocl9uX3UzMihhLCAzKTsKICAgLy8gQ0hFQ0s6IHVyc2hyIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzMKIH0KIAogaW50OHgxNl90IHRlc3RfdnJzaHJxX25fdTgoaW50OHgxNl90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJzaHJxX25fdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaHJxX25fdTgKICAgcmV0dXJuIHZyc2hycV9uX3U4KGEsIDMpOwogICAvLyBDSEVDSzogdXJzaHIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICMzCiB9CiAKIGludDE2eDhfdCB0ZXN0X3Zyc2hycV9uX3UxNihpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cnNocnFfbl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaHJxX25fdTE2CiAgIHJldHVybiB2cnNocnFfbl91MTYoYSwgMyk7CiAgIC8vIENIRUNLOiB1cnNociB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3Zyc2hycV9uX3UzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cnNocnFfbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaHJxX25fdTMyCiAgIHJldHVybiB2cnNocnFfbl91MzIoYSwgMyk7CiAgIC8vIENIRUNLOiB1cnNociB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMzCiB9CiAKIGludDY0eDJfdCB0ZXN0X3Zyc2hycV9uX3U2NChpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cnNocnFfbl91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaHJxX25fdTY0CiAgIHJldHVybiB2cnNocnFfbl91NjQoYSwgMyk7CiAgIC8vIENIRUNLOiB1cnNociB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICMzCiB9CiAKIGludDh4OF90IHRlc3RfdnJzcmFfbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc3JhX25fczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzcmFfbl9zOAogICByZXR1cm4gdnJzcmFfbl9zOChhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNyc3JhIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgIzMKIH0KIAogaW50MTZ4NF90IHRlc3RfdnJzcmFfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc3JhX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3JhX25fczE2CiAgIHJldHVybiB2cnNyYV9uX3MxNihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNyc3JhIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgIzMKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnJzcmFfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc3JhX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3JhX25fczMyCiAgIHJldHVybiB2cnNyYV9uX3MzMihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNyc3JhIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzMKIH0KIAogaW50OHgxNl90IHRlc3RfdnJzcmFxX25fczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc3JhcV9uX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3JhcV9uX3M4CiAgIHJldHVybiB2cnNyYXFfbl9zOChhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNyc3JhIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMwogfQogCiBpbnQxNng4X3QgdGVzdF92cnNyYXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc3JhcV9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNyYXFfbl9zMTYKICAgcmV0dXJuIHZyc3JhcV9uX3MxNihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNyc3JhIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogaW50MzJ4NF90IHRlc3RfdnJzcmFxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnNyYXFfbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzcmFxX25fczMyCiAgIHJldHVybiB2cnNyYXFfbl9zMzIoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzcnNyYSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMzCiB9CiAKIGludDY0eDJfdCB0ZXN0X3Zyc3JhcV9uX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJzcmFxX25fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3JhcV9uX3M2NAogICByZXR1cm4gdnJzcmFxX25fczY0KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3JzcmEge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjMwogfQogCiBpbnQ4eDhfdCB0ZXN0X3Zyc3JhX25fdTgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnNyYV9uX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3JhX25fdTgKICAgcmV0dXJuIHZyc3JhX25fdTgoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiB1cnNyYSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICMzCiB9CiAKIGludDE2eDRfdCB0ZXN0X3Zyc3JhX25fdTE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnNyYV9uX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNyYV9uX3UxNgogICByZXR1cm4gdnJzcmFfbl91MTYoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiB1cnNyYSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsICMzCiB9CiAKIGludDMyeDJfdCB0ZXN0X3Zyc3JhX25fdTMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnNyYV9uX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNyYV9uX3UzMgogICByZXR1cm4gdnJzcmFfbl91MzIoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiB1cnNyYSB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsICMzCiB9CiAKIGludDh4MTZfdCB0ZXN0X3Zyc3JhcV9uX3U4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnNyYXFfbl91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNyYXFfbl91OAogICByZXR1cm4gdnJzcmFxX25fdTgoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiB1cnNyYSB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzMKIH0KIAogaW50MTZ4OF90IHRlc3RfdnJzcmFxX25fdTE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnNyYXFfbl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzcmFxX25fdTE2CiAgIHJldHVybiB2cnNyYXFfbl91MTYoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiB1cnNyYSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3Zyc3JhcV9uX3UzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJzcmFxX25fdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3JhcV9uX3UzMgogICByZXR1cm4gdnJzcmFxX25fdTMyKGEsIGIsIDMpOwogICAvLyBDSEVDSzogdXJzcmEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCAjMwogfQogCiBpbnQ2NHgyX3QgdGVzdF92cnNyYXFfbl91NjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc3JhcV9uX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNyYXFfbl91NjQKICAgcmV0dXJuIHZyc3JhcV9uX3U2NChhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHVyc3JhIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzMKIH0KIAogaW50OHg4X3QgdGVzdF92c3JpX25fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JpX25fczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyaV9uX3M4CiAgIHJldHVybiB2c3JpX25fczgoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzcmkge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMwogfQogCiBpbnQxNng0X3QgdGVzdF92c3JpX25fczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JpX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zzcmlfbl9zMTYKICAgcmV0dXJuIHZzcmlfbl9zMTYoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzcmkge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAjMwogfQogCiBpbnQzMngyX3QgdGVzdF92c3JpX25fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JpX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zzcmlfbl9zMzIKICAgcmV0dXJuIHZzcmlfbl9zMzIoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzcmkge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMwogfQogCiBpbnQ4eDE2X3QgdGVzdF92c3JpcV9uX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JpcV9uX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzcmlxX25fczgKICAgcmV0dXJuIHZzcmlxX25fczgoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzcmkge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICMzCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZzcmlxX25fczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JpcV9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JpcV9uX3MxNgogICByZXR1cm4gdnNyaXFfbl9zMTYoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzcmkge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCAjMwogfQogCiBpbnQzMng0X3QgdGVzdF92c3JpcV9uX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyaXFfbl9zMzIKICAgcmV0dXJuIHZzcmlxX25fczMyKGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3JpIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywgIzMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnNyaXFfbl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzcmlxX25fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzcmlxX25fczY0CiAgIHJldHVybiB2c3JpcV9uX3M2NChhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNyaSB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICMzCiB9CiAKIGludDh4OF90IHRlc3RfdnNyaV9uX3U4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyaV9uX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zzcmlfbl91OAogICByZXR1cm4gdnNyaV9uX3U4KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3JpIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgIzMKIH0KIAogaW50MTZ4NF90IHRlc3RfdnNyaV9uX3UxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyaV9uX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JpX25fdTE2CiAgIHJldHVybiB2c3JpX25fdTE2KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3JpIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgIzMKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnNyaV9uX3UzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyaV9uX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JpX25fdTMyCiAgIHJldHVybiB2c3JpX25fdTMyKGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3JpIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzMKIH0KIAogaW50OHgxNl90IHRlc3RfdnNyaXFfbl91OChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JpcV9uX3U4CiAgIHJldHVybiB2c3JpcV9uX3U4KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3JpIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMwogfQogCiBpbnQxNng4X3QgdGVzdF92c3JpcV9uX3UxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyaXFfbl91MTYKICAgcmV0dXJuIHZzcmlxX25fdTE2KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3JpIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogaW50MzJ4NF90IHRlc3RfdnNyaXFfbl91MzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzcmlxX25fdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzcmlxX25fdTMyCiAgIHJldHVybiB2c3JpcV9uX3UzMihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNyaSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMzCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZzcmlxX25fdTY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JpcV9uX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JpcV9uX3U2NAogICByZXR1cm4gdnNyaXFfbl91NjQoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzcmkge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjMwogfQogCiBwb2x5OHg4X3QgdGVzdF92c3JpX25fcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zzcmlfbl9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JpX25fcDgKICAgcmV0dXJuIHZzcmlfbl9wOChhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNyaSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICMzCiB9CiAKIHBvbHkxNng0X3QgdGVzdF92c3JpX25fcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zzcmlfbl9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyaV9uX3AxNgogICByZXR1cm4gdnNyaV9uX3AxNihhLCBiLCAxNSk7CiAgIC8vIENIRUNLOiBzcmkge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAjMTUKIH0KIAogcG9seTh4MTZfdCB0ZXN0X3ZzcmlxX25fcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JpcV9uX3A4CiAgIHJldHVybiB2c3JpcV9uX3A4KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3JpIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMwogfQogCiBwb2x5MTZ4OF90IHRlc3RfdnNyaXFfbl9wMTYocG9seTE2eDhfdCBhLCBwb2x5MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyaXFfbl9wMTYKICAgcmV0dXJuIHZzcmlxX25fcDE2KGEsIGIsIDE1KTsKICAgLy8gQ0hFQ0s6IHNyaSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsICMxNQogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZzbGlfbl9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzbGlfbl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2xpX25fczgKICAgcmV0dXJuIHZzbGlfbl9zOChhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNsaSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICMzCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZzbGlfbl9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzbGlfbl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNsaV9uX3MxNgogICByZXR1cm4gdnNsaV9uX3MxNihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNsaSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsICMzCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZzbGlfbl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzbGlfbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNsaV9uX3MzMgogICByZXR1cm4gdnNsaV9uX3MzMihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNsaSB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsICMzCiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZzbGlxX25fczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzbGlxX25fczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNsaXFfbl9zOAogICByZXR1cm4gdnNsaXFfbl9zOChhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNsaSB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzMKIH0KIAogaW50MTZ4OF90IHRlc3RfdnNsaXFfbl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzbGlxX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzbGlxX25fczE2CiAgIHJldHVybiB2c2xpcV9uX3MxNihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNsaSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZzbGlxX25fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c2xpcV9uX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2xpcV9uX3MzMgogICByZXR1cm4gdnNsaXFfbl9zMzIoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzbGkge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCAjMwogfQogCiBpbnQ2NHgyX3QgdGVzdF92c2xpcV9uX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNsaXFfbl9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNsaXFfbl9zNjQKICAgcmV0dXJuIHZzbGlxX25fczY0KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc2xpIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzMKIH0KIAogdWludDh4OF90IHRlc3RfdnNsaV9uX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c2xpX25fdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNsaV9uX3U4CiAgIHJldHVybiB2c2xpX25fdTgoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzbGkge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMwogfQogCiB1aW50MTZ4NF90IHRlc3RfdnNsaV9uX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c2xpX25fdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzbGlfbl91MTYKICAgcmV0dXJuIHZzbGlfbl91MTYoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzbGkge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAjMwogfQogCiB1aW50MzJ4Ml90IHRlc3RfdnNsaV9uX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c2xpX25fdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzbGlfbl91MzIKICAgcmV0dXJuIHZzbGlfbl91MzIoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzbGkge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMwogfQogCiB1aW50OHgxNl90IHRlc3RfdnNsaXFfbl91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c2xpcV9uX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzbGlxX25fdTgKICAgcmV0dXJuIHZzbGlxX25fdTgoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzbGkge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICMzCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92c2xpcV9uX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c2xpcV9uX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2xpcV9uX3UxNgogICByZXR1cm4gdnNsaXFfbl91MTYoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzbGkge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCAjMwogfQogCiB1aW50MzJ4NF90IHRlc3RfdnNsaXFfbl91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNsaXFfbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNsaXFfbl91MzIKICAgcmV0dXJuIHZzbGlxX25fdTMyKGEsIGIsIDMpOwogICAvLyBDSEVDSzogc2xpIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywgIzMKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZzbGlxX25fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzbGlxX25fdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzbGlxX25fdTY0CiAgIHJldHVybiB2c2xpcV9uX3U2NChhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNsaSB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICMzCiB9CiAKIHBvbHk4eDhfdCB0ZXN0X3ZzbGlfbl9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNsaV9uX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzbGlfbl9wOAogICByZXR1cm4gdnNsaV9uX3A4KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc2xpIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgIzMKIH0KIAogcG9seTE2eDRfdCB0ZXN0X3ZzbGlfbl9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNsaV9uX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2xpX25fcDE2CiAgIHJldHVybiB2c2xpX25fcDE2KGEsIGIsIDE1KTsKICAgLy8gQ0hFQ0s6IHNsaSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsICMxNQogfQogCiBwb2x5OHgxNl90IHRlc3RfdnNsaXFfbl9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c2xpcV9uX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzbGlxX25fcDgKICAgcmV0dXJuIHZzbGlxX25fcDgoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzbGkge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICMzCiB9CiAKIHBvbHkxNng4X3QgdGVzdF92c2xpcV9uX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c2xpcV9uX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2xpcV9uX3AxNgogICByZXR1cm4gdnNsaXFfbl9wMTYoYSwgYiwgMTUpOwogICAvLyBDSEVDSzogc2xpIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzE1CiB9CiAKIGludDh4OF90IHRlc3RfdnFzaGx1X25fczgoaW50OHg4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXNobHVfbl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobHVfbl9zOAogICByZXR1cm4gdnFzaGx1X25fczgoYSwgMyk7CiAgIC8vIENIRUNLOiBzcXNobHUge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMwogfQogCiBpbnQxNng0X3QgdGVzdF92cXNobHVfbl9zMTYoaW50MTZ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFzaGx1X25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsdV9uX3MxNgogICByZXR1cm4gdnFzaGx1X25fczE2KGEsIDMpOwogICAvLyBDSEVDSzogc3FzaGx1IHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgIzMKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnFzaGx1X25fczMyKGludDMyeDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zxc2hsdV9uX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobHVfbl9zMzIKICAgcmV0dXJuIHZxc2hsdV9uX3MzMihhLCAzKTsKICAgLy8gQ0hFQ0s6IHNxc2hsdSB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsICMzCiB9CiAKIGludDh4MTZfdCB0ZXN0X3Zxc2hsdXFfbl9zOChpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXNobHVxX25fczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGx1cV9uX3M4CiAgIHJldHVybiB2cXNobHVxX25fczgoYSwgMyk7CiAgIC8vIENIRUNLOiBzcXNobHUge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICMzCiB9CiAKIGludDE2eDhfdCB0ZXN0X3Zxc2hsdXFfbl9zMTYoaW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFzaGx1cV9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobHVxX25fczE2CiAgIHJldHVybiB2cXNobHVxX25fczE2KGEsIDMpOwogICAvLyBDSEVDSzogc3FzaGx1IHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogaW50MzJ4NF90IHRlc3RfdnFzaGx1cV9uX3MzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXNobHVxX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsdXFfbl9zMzIKICAgcmV0dXJuIHZxc2hsdXFfbl9zMzIoYSwgMyk7CiAgIC8vIENIRUNLOiBzcXNobHUge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCAjMwogfQogCiBpbnQ2NHgyX3QgdGVzdF92cXNobHVxX25fczY0KGludDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zxc2hsdXFfbl9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGx1cV9uX3M2NAogICByZXR1cm4gdnFzaGx1cV9uX3M2NChhLCAzKTsKICAgLy8gQ0hFQ0s6IHNxc2hsdSB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICMzCiB9CiAKIGludDh4OF90IHRlc3RfdnNocm5fbl9zMTYoaW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNocm5fbl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocm5fbl9zMTYKICAgcmV0dXJuIHZzaHJuX25fczE2KGEsIDMpOwogICAvLyBDSEVDSzogc2hybiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZzaHJuX25fczMyKGludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaHJuX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaHJuX25fczMyCiAgIHJldHVybiB2c2hybl9uX3MzMihhLCA5KTsKICAgLy8gQ0hFQ0s6IHNocm4ge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRzLCAjOQogfQogCiBpbnQzMngyX3QgdGVzdF92c2hybl9uX3M2NChpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92c2hybl9uX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hybl9uX3M2NAogICByZXR1cm4gdnNocm5fbl9zNjQoYSwgMTkpOwogICAvLyBDSEVDSzogc2hybiB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMmQsICMxOQogfQogCiB1aW50OHg4X3QgdGVzdF92c2hybl9uX3UxNih1aW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNocm5fbl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocm5fbl91MTYKICAgcmV0dXJuIHZzaHJuX25fdTE2KGEsIDMpOwogICAvLyBDSEVDSzogc2hybiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92c2hybl9uX3UzMih1aW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNocm5fbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocm5fbl91MzIKICAgcmV0dXJuIHZzaHJuX25fdTMyKGEsIDkpOwogICAvLyBDSEVDSzogc2hybiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNHMsICM5CiB9CiAKIHVpbnQzMngyX3QgdGVzdF92c2hybl9uX3U2NCh1aW50NjR4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNocm5fbl91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocm5fbl91NjQKICAgcmV0dXJuIHZzaHJuX25fdTY0KGEsIDE5KTsKICAgLy8gQ0hFQ0s6IHNocm4ge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJkLCAjMTkKIH0KIAogaW50OHgxNl90IHRlc3RfdnNocm5faGlnaF9uX3MxNihpbnQ4eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c2hybl9oaWdoX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaHJuX2hpZ2hfbl9zMTYKICAgcmV0dXJuIHZzaHJuX2hpZ2hfbl9zMTYoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiBzaHJuMiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjhoLCAjMwogfQogCiBpbnQxNng4X3QgdGVzdF92c2hybl9oaWdoX25fczMyKGludDE2eDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c2hybl9oaWdoX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaHJuX2hpZ2hfbl9zMzIKICAgcmV0dXJuIHZzaHJuX2hpZ2hfbl9zMzIoYSwgYiwgOSk7CiAgIC8vIENIRUNLOiBzaHJuMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uNHMsICM5CiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZzaHJuX2hpZ2hfbl9zNjQoaW50MzJ4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaHJuX2hpZ2hfbl9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocm5faGlnaF9uX3M2NAogICByZXR1cm4gdnNocm5faGlnaF9uX3M2NChhLCBiLCAxOSk7CiAgIC8vIENIRUNLOiBzaHJuMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uMmQsICMxOQogfQogCiB1aW50OHgxNl90IHRlc3RfdnNocm5faGlnaF9uX3UxNih1aW50OHg4X3QgYSwgdWludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaHJuX2hpZ2hfbl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocm5faGlnaF9uX3UxNgogICByZXR1cm4gdnNocm5faGlnaF9uX3UxNihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNocm4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92c2hybl9oaWdoX25fdTMyKHVpbnQxNng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaHJuX2hpZ2hfbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNocm5faGlnaF9uX3UzMgogICByZXR1cm4gdnNocm5faGlnaF9uX3UzMihhLCBiLCA5KTsKICAgLy8gQ0hFQ0s6IHNocm4yIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS40cywgIzkKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZzaHJuX2hpZ2hfbl91NjQodWludDMyeDJfdCBhLCB1aW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNocm5faGlnaF9uX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hybl9oaWdoX25fdTY0CiAgIHJldHVybiB2c2hybl9oaWdoX25fdTY0KGEsIGIsIDE5KTsKICAgLy8gQ0hFQ0s6IHNocm4yIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS4yZCwgIzE5CiB9CiAKIGludDh4OF90IHRlc3RfdnFzaHJ1bl9uX3MxNihpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXNocnVuX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hydW5fbl9zMTYKICAgcmV0dXJuIHZxc2hydW5fbl9zMTYoYSwgMyk7CiAgIC8vIENIRUNLOiBzcXNocnVuIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogaW50MTZ4NF90IHRlc3RfdnFzaHJ1bl9uX3MzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXNocnVuX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hydW5fbl9zMzIKICAgcmV0dXJuIHZxc2hydW5fbl9zMzIoYSwgOSk7CiAgIC8vIENIRUNLOiBzcXNocnVuIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40cywgIzkKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnFzaHJ1bl9uX3M2NChpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXNocnVuX25fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hydW5fbl9zNjQKICAgcmV0dXJuIHZxc2hydW5fbl9zNjQoYSwgMTkpOwogICAvLyBDSEVDSzogc3FzaHJ1biB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMmQsICMxOQogfQogCiBpbnQ4eDE2X3QgdGVzdF92cXNocnVuX2hpZ2hfbl9zMTYoaW50OHg4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFzaHJ1bl9oaWdoX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hydW5faGlnaF9uX3MxNgogICByZXR1cm4gdnFzaHJ1bl9oaWdoX25fczE2KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3FzaHJ1bjIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogaW50MTZ4OF90IHRlc3RfdnFzaHJ1bl9oaWdoX25fczMyKGludDE2eDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXNocnVuX2hpZ2hfbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaHJ1bl9oaWdoX25fczMyCiAgIHJldHVybiB2cXNocnVuX2hpZ2hfbl9zMzIoYSwgYiwgOSk7CiAgIC8vIENIRUNLOiBzcXNocnVuMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uNHMsICM5CiB9CiAKIGludDMyeDRfdCB0ZXN0X3Zxc2hydW5faGlnaF9uX3M2NChpbnQzMngyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFzaHJ1bl9oaWdoX25fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hydW5faGlnaF9uX3M2NAogICByZXR1cm4gdnFzaHJ1bl9oaWdoX25fczY0KGEsIGIsIDE5KTsKICAgLy8gQ0hFQ0s6IHNxc2hydW4yIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS4yZCwgIzE5CiB9CiAKIGludDh4OF90IHRlc3RfdnJzaHJuX25fczE2KGludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc2hybl9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocm5fbl9zMTYKICAgcmV0dXJuIHZyc2hybl9uX3MxNihhLCAzKTsKICAgLy8gQ0hFQ0s6IHJzaHJuIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogaW50MTZ4NF90IHRlc3RfdnJzaHJuX25fczMyKGludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc2hybl9uX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocm5fbl9zMzIKICAgcmV0dXJuIHZyc2hybl9uX3MzMihhLCA5KTsKICAgLy8gQ0hFQ0s6IHJzaHJuIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40cywgIzkKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnJzaHJuX25fczY0KGludDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc2hybl9uX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocm5fbl9zNjQKICAgcmV0dXJuIHZyc2hybl9uX3M2NChhLCAxOSk7CiAgIC8vIENIRUNLOiByc2hybiB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMmQsICMxOQogfQogCiB1aW50OHg4X3QgdGVzdF92cnNocm5fbl91MTYodWludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc2hybl9uX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocm5fbl91MTYKICAgcmV0dXJuIHZyc2hybl9uX3UxNihhLCAzKTsKICAgLy8gQ0hFQ0s6IHJzaHJuIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogdWludDE2eDRfdCB0ZXN0X3Zyc2hybl9uX3UzMih1aW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJzaHJuX25fdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc2hybl9uX3UzMgogICByZXR1cm4gdnJzaHJuX25fdTMyKGEsIDkpOwogICAvLyBDSEVDSzogcnNocm4ge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRzLCAjOQogfQogCiB1aW50MzJ4Ml90IHRlc3RfdnJzaHJuX25fdTY0KHVpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cnNocm5fbl91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaHJuX25fdTY0CiAgIHJldHVybiB2cnNocm5fbl91NjQoYSwgMTkpOwogICAvLyBDSEVDSzogcnNocm4ge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJkLCAjMTkKIH0KIAogaW50OHgxNl90IHRlc3RfdnJzaHJuX2hpZ2hfbl9zMTYoaW50OHg4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJzaHJuX2hpZ2hfbl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaHJuX2hpZ2hfbl9zMTYKICAgcmV0dXJuIHZyc2hybl9oaWdoX25fczE2KGEsIGIsIDMpOwogICAvLyBDSEVDSzogcnNocm4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIGludDE2eDhfdCB0ZXN0X3Zyc2hybl9oaWdoX25fczMyKGludDE2eDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnNocm5faGlnaF9uX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocm5faGlnaF9uX3MzMgogICByZXR1cm4gdnJzaHJuX2hpZ2hfbl9zMzIoYSwgYiwgOSk7CiAgIC8vIENIRUNLOiByc2hybjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjRzLCAjOQogfQogCiBpbnQzMng0X3QgdGVzdF92cnNocm5faGlnaF9uX3M2NChpbnQzMngyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJzaHJuX2hpZ2hfbl9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaHJuX2hpZ2hfbl9zNjQKICAgcmV0dXJuIHZyc2hybl9oaWdoX25fczY0KGEsIGIsIDE5KTsKICAgLy8gQ0hFQ0s6IHJzaHJuMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uMmQsICMxOQogfQogCiB1aW50OHgxNl90IHRlc3RfdnJzaHJuX2hpZ2hfbl91MTYodWludDh4OF90IGEsIHVpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnNocm5faGlnaF9uX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocm5faGlnaF9uX3UxNgogICByZXR1cm4gdnJzaHJuX2hpZ2hfbl91MTYoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiByc2hybjIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogdWludDE2eDhfdCB0ZXN0X3Zyc2hybl9oaWdoX25fdTMyKHVpbnQxNng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc2hybl9oaWdoX25fdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc2hybl9oaWdoX25fdTMyCiAgIHJldHVybiB2cnNocm5faGlnaF9uX3UzMihhLCBiLCA5KTsKICAgLy8gQ0hFQ0s6IHJzaHJuMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uNHMsICM5CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92cnNocm5faGlnaF9uX3U2NCh1aW50MzJ4Ml90IGEsIHVpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnNocm5faGlnaF9uX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocm5faGlnaF9uX3U2NAogICByZXR1cm4gdnJzaHJuX2hpZ2hfbl91NjQoYSwgYiwgMTkpOwogICAvLyBDSEVDSzogcnNocm4yIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS4yZCwgIzE5CiB9CiAKIGludDh4OF90IHRlc3RfdnFyc2hydW5fbl9zMTYoaW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFyc2hydW5fbl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyc2hydW5fbl9zMTYKICAgcmV0dXJuIHZxcnNocnVuX25fczE2KGEsIDMpOwogICAvLyBDSEVDSzogc3Fyc2hydW4ge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhoLCAjMwogfQogCiBpbnQxNng0X3QgdGVzdF92cXJzaHJ1bl9uX3MzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXJzaHJ1bl9uX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaHJ1bl9uX3MzMgogICByZXR1cm4gdnFyc2hydW5fbl9zMzIoYSwgOSk7CiAgIC8vIENIRUNLOiBzcXJzaHJ1biB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNHMsICM5CiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZxcnNocnVuX25fczY0KGludDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxcnNocnVuX25fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocnVuX25fczY0CiAgIHJldHVybiB2cXJzaHJ1bl9uX3M2NChhLCAxOSk7CiAgIC8vIENIRUNLOiBzcXJzaHJ1biB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMmQsICMxOQogfQogCiBpbnQ4eDE2X3QgdGVzdF92cXJzaHJ1bl9oaWdoX25fczE2KGludDh4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxcnNocnVuX2hpZ2hfbl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyc2hydW5faGlnaF9uX3MxNgogICByZXR1cm4gdnFyc2hydW5faGlnaF9uX3MxNihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNxcnNocnVuMiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjhoLCAjMwogfQogCiBpbnQxNng4X3QgdGVzdF92cXJzaHJ1bl9oaWdoX25fczMyKGludDE2eDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXJzaHJ1bl9oaWdoX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocnVuX2hpZ2hfbl9zMzIKICAgcmV0dXJuIHZxcnNocnVuX2hpZ2hfbl9zMzIoYSwgYiwgOSk7CiAgIC8vIENIRUNLOiBzcXJzaHJ1bjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjRzLCAjOQogfQogCiBpbnQzMng0X3QgdGVzdF92cXJzaHJ1bl9oaWdoX25fczY0KGludDMyeDJfdCBhLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXJzaHJ1bl9oaWdoX25fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocnVuX2hpZ2hfbl9zNjQKICAgcmV0dXJuIHZxcnNocnVuX2hpZ2hfbl9zNjQoYSwgYiwgMTkpOwogICAvLyBDSEVDSzogc3Fyc2hydW4yIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS4yZCwgIzE5CiB9CiAKIGludDh4OF90IHRlc3RfdnFzaHJuX25fczE2KGludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zxc2hybl9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNocm5fbl9zMTYKICAgcmV0dXJuIHZxc2hybl9uX3MxNihhLCAzKTsKICAgLy8gQ0hFQ0s6IHNxc2hybiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIGludDE2eDRfdCB0ZXN0X3Zxc2hybl9uX3MzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXNocm5fbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaHJuX25fczMyCiAgIHJldHVybiB2cXNocm5fbl9zMzIoYSwgOSk7CiAgIC8vIENIRUNLOiBzcXNocm4ge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRzLCAjOQogfQogCiBpbnQzMngyX3QgdGVzdF92cXNocm5fbl9zNjQoaW50NjR4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFzaHJuX25fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hybl9uX3M2NAogICByZXR1cm4gdnFzaHJuX25fczY0KGEsIDE5KTsKICAgLy8gQ0hFQ0s6IHNxc2hybiB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMmQsICMxOQogfQogCiB1aW50OHg4X3QgdGVzdF92cXNocm5fbl91MTYodWludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zxc2hybl9uX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNocm5fbl91MTYKICAgcmV0dXJuIHZxc2hybl9uX3UxNihhLCAzKTsKICAgLy8gQ0hFQ0s6IHVxc2hybiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92cXNocm5fbl91MzIodWludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zxc2hybl9uX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNocm5fbl91MzIKICAgcmV0dXJuIHZxc2hybl9uX3UzMihhLCA5KTsKICAgLy8gQ0hFQ0s6IHVxc2hybiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNHMsICM5CiB9CiAKIHVpbnQzMngyX3QgdGVzdF92cXNocm5fbl91NjQodWludDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zxc2hybl9uX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNocm5fbl91NjQKICAgcmV0dXJuIHZxc2hybl9uX3U2NChhLCAxOSk7CiAgIC8vIENIRUNLOiB1cXNocm4ge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJkLCAjMTkKIH0KIAogaW50OHgxNl90IHRlc3RfdnFzaHJuX2hpZ2hfbl9zMTYoaW50OHg4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFzaHJuX2hpZ2hfbl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaHJuX2hpZ2hfbl9zMTYKICAgcmV0dXJuIHZxc2hybl9oaWdoX25fczE2KGEsIGIsIDMpOwogICAvLyBDSEVDSzogc3FzaHJuMiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjhoLCAjMwogfQogCiBpbnQxNng4X3QgdGVzdF92cXNocm5faGlnaF9uX3MzMihpbnQxNng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFzaHJuX2hpZ2hfbl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaHJuX2hpZ2hfbl9zMzIKICAgcmV0dXJuIHZxc2hybl9oaWdoX25fczMyKGEsIGIsIDkpOwogICAvLyBDSEVDSzogc3FzaHJuMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uNHMsICM5CiB9CiAKIGludDMyeDRfdCB0ZXN0X3Zxc2hybl9oaWdoX25fczY0KGludDMyeDJfdCBhLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXNocm5faGlnaF9uX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNocm5faGlnaF9uX3M2NAogICByZXR1cm4gdnFzaHJuX2hpZ2hfbl9zNjQoYSwgYiwgMTkpOwogICAvLyBDSEVDSzogc3FzaHJuMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uMmQsICMxOQogfQogCiB1aW50OHgxNl90IHRlc3RfdnFzaHJuX2hpZ2hfbl91MTYodWludDh4OF90IGEsIHVpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXNocm5faGlnaF9uX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNocm5faGlnaF9uX3UxNgogICByZXR1cm4gdnFzaHJuX2hpZ2hfbl91MTYoYSwgYiwgMyk7CiAgIC8vIENIRUNLOiB1cXNocm4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92cXNocm5faGlnaF9uX3UzMih1aW50MTZ4NF90IGEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXNocm5faGlnaF9uX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNocm5faGlnaF9uX3UzMgogICByZXR1cm4gdnFzaHJuX2hpZ2hfbl91MzIoYSwgYiwgOSk7CiAgIC8vIENIRUNLOiB1cXNocm4yIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS40cywgIzkKIH0KIAogdWludDMyeDRfdCB0ZXN0X3Zxc2hybl9oaWdoX25fdTY0KHVpbnQzMngyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zxc2hybl9oaWdoX25fdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hybl9oaWdoX25fdTY0CiAgIHJldHVybiB2cXNocm5faGlnaF9uX3U2NChhLCBiLCAxOSk7CiAgIC8vIENIRUNLOiB1cXNocm4yIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS4yZCwgIzE5CiB9CiAKIGludDh4OF90IHRlc3RfdnFyc2hybl9uX3MxNihpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXJzaHJuX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocm5fbl9zMTYKICAgcmV0dXJuIHZxcnNocm5fbl9zMTYoYSwgMyk7CiAgIC8vIENIRUNLOiBzcXJzaHJuIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogaW50MTZ4NF90IHRlc3RfdnFyc2hybl9uX3MzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXJzaHJuX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocm5fbl9zMzIKICAgcmV0dXJuIHZxcnNocm5fbl9zMzIoYSwgOSk7CiAgIC8vIENIRUNLOiBzcXJzaHJuIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40cywgIzkKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnFyc2hybl9uX3M2NChpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXJzaHJuX25fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocm5fbl9zNjQKICAgcmV0dXJuIHZxcnNocm5fbl9zNjQoYSwgMTkpOwogICAvLyBDSEVDSzogc3Fyc2hybiB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMmQsICMxOQogfQogCiB1aW50OHg4X3QgdGVzdF92cXJzaHJuX25fdTE2KHVpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cXJzaHJuX25fdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocm5fbl91MTYKICAgcmV0dXJuIHZxcnNocm5fbl91MTYoYSwgMyk7CiAgIC8vIENIRUNLOiB1cXJzaHJuIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZxcnNocm5fbl91MzIodWludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxcnNocm5fbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyc2hybl9uX3UzMgogICByZXR1cm4gdnFyc2hybl9uX3UzMihhLCA5KTsKICAgLy8gQ0hFQ0s6IHVxcnNocm4ge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRzLCAjOQogfQogCiB1aW50MzJ4Ml90IHRlc3RfdnFyc2hybl9uX3U2NCh1aW50NjR4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFyc2hybl9uX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaHJuX25fdTY0CiAgIHJldHVybiB2cXJzaHJuX25fdTY0KGEsIDE5KTsKICAgLy8gQ0hFQ0s6IHVxcnNocm4ge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJkLCAjMTkKIH0KIAogaW50OHgxNl90IHRlc3RfdnFyc2hybl9oaWdoX25fczE2KGludDh4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxcnNocm5faGlnaF9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaHJuX2hpZ2hfbl9zMTYKICAgcmV0dXJuIHZxcnNocm5faGlnaF9uX3MxNihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNxcnNocm4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uOGgsICMzCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZxcnNocm5faGlnaF9uX3MzMihpbnQxNng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFyc2hybl9oaWdoX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocm5faGlnaF9uX3MzMgogICByZXR1cm4gdnFyc2hybl9oaWdoX25fczMyKGEsIGIsIDkpOwogICAvLyBDSEVDSzogc3Fyc2hybjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjRzLCAjOQogfQogCiBpbnQzMng0X3QgdGVzdF92cXJzaHJuX2hpZ2hfbl9zNjQoaW50MzJ4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxcnNocm5faGlnaF9uX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaHJuX2hpZ2hfbl9zNjQKICAgcmV0dXJuIHZxcnNocm5faGlnaF9uX3M2NChhLCBiLCAxOSk7CiAgIC8vIENIRUNLOiBzcXJzaHJuMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uMmQsICMxOQogfQogCiB1aW50OHgxNl90IHRlc3RfdnFyc2hybl9oaWdoX25fdTE2KHVpbnQ4eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFyc2hybl9oaWdoX25fdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocm5faGlnaF9uX3UxNgogICByZXR1cm4gdnFyc2hybl9oaWdoX25fdTE2KGEsIGIsIDMpOwogICAvLyBDSEVDSzogdXFyc2hybjIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS44aCwgIzMKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZxcnNocm5faGlnaF9uX3UzMih1aW50MTZ4NF90IGEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXJzaHJuX2hpZ2hfbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyc2hybl9oaWdoX25fdTMyCiAgIHJldHVybiB2cXJzaHJuX2hpZ2hfbl91MzIoYSwgYiwgOSk7CiAgIC8vIENIRUNLOiB1cXJzaHJuMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uNHMsICM5CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92cXJzaHJuX2hpZ2hfbl91NjQodWludDMyeDJfdCBhLCB1aW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFyc2hybl9oaWdoX25fdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocm5faGlnaF9uX3U2NAogICByZXR1cm4gdnFyc2hybl9oaWdoX25fdTY0KGEsIGIsIDE5KTsKICAgLy8gQ0hFQ0s6IHVxcnNocm4yIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS4yZCwgIzE5CiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZzaGxsX25fczgoaW50OHg4X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnNobGxfbl9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobGxfbl9zOAogICByZXR1cm4gdnNobGxfbl9zOChhLCAzKTsKIC8vIENIRUNLOiBzc2hsbCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGIsICMzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZzaGxsX25fczE2KGludDE2eDRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hsbF9uX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobGxfbl9zMTYKICAgcmV0dXJuIHZzaGxsX25fczE2KGEsIDkpOwogLy8gQ0hFQ0s6IHNzaGxsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwgIzkKIH0KIAogaW50NjR4Ml90IHRlc3RfdnNobGxfbl9zMzIoaW50MzJ4Ml90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxsX25fczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsbF9uX3MzMgogICByZXR1cm4gdnNobGxfbl9zMzIoYSwgMTkpOwogLy8gQ0hFQ0s6IHNzaGxsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywgIzE5CiB9CiAKIHVpbnQxNng4X3QgdGVzdF92c2hsbF9uX3U4KHVpbnQ4eDhfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hsbF9uX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsbF9uX3U4CiAgIHJldHVybiB2c2hsbF9uX3U4KGEsIDMpOwogLy8gQ0hFQ0s6IHVzaGxsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44YiwgIzMKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZzaGxsX25fdTE2KHVpbnQxNng0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnNobGxfbl91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxsX25fdTE2CiAgIHJldHVybiB2c2hsbF9uX3UxNihhLCA5KTsKIC8vIENIRUNLOiB1c2hsbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsICM5CiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92c2hsbF9uX3UzMih1aW50MzJ4Ml90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxsX25fdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsbF9uX3UzMgogICByZXR1cm4gdnNobGxfbl91MzIoYSwgMTkpOwogLy8gQ0hFQ0s6IHVzaGxsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywgIzE5CiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZzaGxsX2hpZ2hfbl9zOChpbnQ4eDE2X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnNobGxfaGlnaF9uX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsbF9oaWdoX25fczgKICAgcmV0dXJuIHZzaGxsX2hpZ2hfbl9zOChhLCAzKTsKIC8vIENIRUNLOiBzc2hsbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2YiwgIzMKIH0KIAogaW50MzJ4NF90IHRlc3RfdnNobGxfaGlnaF9uX3MxNihpbnQxNng4X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnNobGxfaGlnaF9uX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobGxfaGlnaF9uX3MxNgogICByZXR1cm4gdnNobGxfaGlnaF9uX3MxNihhLCA5KTsKIC8vIENIRUNLOiBzc2hsbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCAjOQogfQogCiBpbnQ2NHgyX3QgdGVzdF92c2hsbF9oaWdoX25fczMyKGludDMyeDRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92c2hsbF9oaWdoX25fczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsbF9oaWdoX25fczMyCiAgIHJldHVybiB2c2hsbF9oaWdoX25fczMyKGEsIDE5KTsKIC8vIENIRUNLOiBzc2hsbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCAjMTkKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZzaGxsX2hpZ2hfbl91OCh1aW50OHgxNl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxsX2hpZ2hfbl91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobGxfaGlnaF9uX3U4CiAgIHJldHVybiB2c2hsbF9oaWdoX25fdTgoYSwgMyk7CiAvLyBDSEVDSzogdXNobGwyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS4xNmIsICMzCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92c2hsbF9oaWdoX25fdTE2KHVpbnQxNng4X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnNobGxfaGlnaF9uX3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobGxfaGlnaF9uX3UxNgogICByZXR1cm4gdnNobGxfaGlnaF9uX3UxNihhLCA5KTsKIC8vIENIRUNLOiB1c2hsbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCAjOQogfQogCiB1aW50NjR4Ml90IHRlc3RfdnNobGxfaGlnaF9uX3UzMih1aW50MzJ4NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxsX2hpZ2hfbl91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxsX2hpZ2hfbl91MzIKICAgcmV0dXJuIHZzaGxsX2hpZ2hfbl91MzIoYSwgMTkpOwogLy8gQ0hFQ0s6IHVzaGxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsICMxOQogfQogCiBpbnQxNng4X3QgdGVzdF92bW92bF9zOChpbnQ4eDhfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92bW92bF9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdmxfczgKICAgcmV0dXJuIHZtb3ZsX3M4KGEpOwogLy8gQ0hFQ0s6IHNzaGxsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44YiwgIzAKIH0KIAogaW50MzJ4NF90IHRlc3Rfdm1vdmxfczE2KGludDE2eDRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92bW92bF9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3ZsX3MxNgogICByZXR1cm4gdm1vdmxfczE2KGEpOwogLy8gQ0hFQ0s6IHNzaGxsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwgIzAKIH0KIAogaW50NjR4Ml90IHRlc3Rfdm1vdmxfczMyKGludDMyeDJfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92bW92bF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3ZsX3MzMgogICByZXR1cm4gdm1vdmxfczMyKGEpOwogLy8gQ0hFQ0s6IHNzaGxsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywgIzAKIH0KIAogdWludDE2eDhfdCB0ZXN0X3Ztb3ZsX3U4KHVpbnQ4eDhfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92bW92bF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdmxfdTgKICAgcmV0dXJuIHZtb3ZsX3U4KGEpOwogLy8gQ0hFQ0s6IHVzaGxsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44YiwgIzAKIH0KIAogdWludDMyeDRfdCB0ZXN0X3Ztb3ZsX3UxNih1aW50MTZ4NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3Ztb3ZsX3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdmxfdTE2CiAgIHJldHVybiB2bW92bF91MTYoYSk7CiAvLyBDSEVDSzogdXNobGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCAjMAogfQogCiB1aW50NjR4Ml90IHRlc3Rfdm1vdmxfdTMyKHVpbnQzMngyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3Rfdm1vdmxfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92bF91MzIKICAgcmV0dXJuIHZtb3ZsX3UzMihhKTsKIC8vIENIRUNLOiB1c2hsbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsICMwCiB9CiAKIGludDE2eDhfdCB0ZXN0X3Ztb3ZsX2hpZ2hfczgoaW50OHgxNl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3Ztb3ZsX2hpZ2hfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3ZsX2hpZ2hfczgKICAgcmV0dXJuIHZtb3ZsX2hpZ2hfczgoYSk7CiAvLyBDSEVDSzogc3NobGwyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS4xNmIsICMwCiB9CiAKIGludDMyeDRfdCB0ZXN0X3Ztb3ZsX2hpZ2hfczE2KGludDE2eDhfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92bW92bF9oaWdoX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdmxfaGlnaF9zMTYKICAgcmV0dXJuIHZtb3ZsX2hpZ2hfczE2KGEpOwogLy8gQ0hFQ0s6IHNzaGxsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsICMwCiB9CiAKIGludDY0eDJfdCB0ZXN0X3Ztb3ZsX2hpZ2hfczMyKGludDMyeDRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92bW92bF9oaWdoX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdmxfaGlnaF9zMzIKICAgcmV0dXJuIHZtb3ZsX2hpZ2hfczMyKGEpOwogLy8gQ0hFQ0s6IHNzaGxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsICMwCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92bW92bF9oaWdoX3U4KHVpbnQ4eDE2X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3Rfdm1vdmxfaGlnaF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdmxfaGlnaF91OAogICByZXR1cm4gdm1vdmxfaGlnaF91OChhKTsKIC8vIENIRUNLOiB1c2hsbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2YiwgIzAKIH0KIAogdWludDMyeDRfdCB0ZXN0X3Ztb3ZsX2hpZ2hfdTE2KHVpbnQxNng4X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3Rfdm1vdmxfaGlnaF91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3ZsX2hpZ2hfdTE2CiAgIHJldHVybiB2bW92bF9oaWdoX3UxNihhKTsKIC8vIENIRUNLOiB1c2hsbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCAjMAogfQogCiB1aW50NjR4Ml90IHRlc3Rfdm1vdmxfaGlnaF91MzIodWludDMyeDRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92bW92bF9oaWdoX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdmxfaGlnaF91MzIKICAgcmV0dXJuIHZtb3ZsX2hpZ2hfdTMyKGEpOwogLy8gQ0hFQ0s6IHVzaGxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsICMwCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdmN2dF9uX2YzMl9zMzIoaW50MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmN2dF9uX2YzMl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dF9uX2YzMl9zMzIKICAgcmV0dXJuIHZjdnRfbl9mMzJfczMyKGEsIDMxKTsKICAgLy8gQ0hFQ0s6IHNjdnRmIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzMxCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdmN2dHFfbl9mMzJfczMyKGludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjdnRxX25fZjMyX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0cV9uX2YzMl9zMzIKICAgcmV0dXJuIHZjdnRxX25fZjMyX3MzMihhLCAzMSk7CiAgIC8vIENIRUNLOiBzY3Z0ZiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMzMQogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZjdnRxX25fZjY0X3M2NChpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92Y3Z0cV9uX2Y2NF9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dHFfbl9mNjRfczY0CiAgIHJldHVybiB2Y3Z0cV9uX2Y2NF9zNjQoYSwgNTApOwogICAvLyBDSEVDSzogc2N2dGYge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjNTAKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92Y3Z0X25fZjMyX3UzMih1aW50MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmN2dF9uX2YzMl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dF9uX2YzMl91MzIKICAgcmV0dXJuIHZjdnRfbl9mMzJfdTMyKGEsIDMxKTsKICAgLy8gQ0hFQ0s6IHVjdnRmIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzMxCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdmN2dHFfbl9mMzJfdTMyKHVpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92Y3Z0cV9uX2YzMl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dHFfbl9mMzJfdTMyCiAgIHJldHVybiB2Y3Z0cV9uX2YzMl91MzIoYSwgMzEpOwogICAvLyBDSEVDSzogdWN2dGYge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCAjMzEKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92Y3Z0cV9uX2Y2NF91NjQodWludDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjdnRxX25fZjY0X3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0cV9uX2Y2NF91NjQKICAgcmV0dXJuIHZjdnRxX25fZjY0X3U2NChhLCA1MCk7CiAgIC8vIENIRUNLOiB1Y3Z0ZiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICM1MAogfQogCiBpbnQzMngyX3QgdGVzdF92Y3Z0X25fczMyX2YzMihmbG9hdDMyeDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjdnRfbl9zMzJfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRfbl9zMzJfZjMyCiAgIHJldHVybiB2Y3Z0X25fczMyX2YzMihhLCAzMSk7CiAgIC8vIENIRUNLOiBmY3Z0enMge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMzEKIH0KIAogaW50MzJ4NF90IHRlc3RfdmN2dHFfbl9zMzJfZjMyKGZsb2F0MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmN2dHFfbl9zMzJfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRxX25fczMyX2YzMgogICByZXR1cm4gdmN2dHFfbl9zMzJfZjMyKGEsIDMxKTsKICAgLy8gQ0hFQ0s6IGZjdnR6cyB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMzMQogfQogCiBpbnQ2NHgyX3QgdGVzdF92Y3Z0cV9uX3M2NF9mNjQoZmxvYXQ2NHgyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92Y3Z0cV9uX3M2NF9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dHFfbl9zNjRfZjY0CiAgIHJldHVybiB2Y3Z0cV9uX3M2NF9mNjQoYSwgNTApOwogICAvLyBDSEVDSzogZmN2dHpzIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzUwCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92Y3Z0X25fdTMyX2YzMihmbG9hdDMyeDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjdnRfbl91MzJfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRfbl91MzJfZjMyCiAgIHJldHVybiB2Y3Z0X25fdTMyX2YzMihhLCAzMSk7CiAgIC8vIENIRUNLOiBmY3Z0enUge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMzEKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZjdnRxX25fdTMyX2YzMihmbG9hdDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjdnRfbl91MzJfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRxX25fdTMyX2YzMgogICByZXR1cm4gdmN2dHFfbl91MzJfZjMyKGEsIDMxKTsKICAgLy8gQ0hFQ0s6IGZjdnR6dSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMzMQogfQogCiB1aW50NjR4Ml90IHRlc3RfdmN2dHFfbl91NjRfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmN2dHFfbl91NjRfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRxX25fdTY0X2Y2NAogICByZXR1cm4gdmN2dHFfbl91NjRfZjY0KGEsIDUwKTsKICAgLy8gQ0hFQ0s6IGZjdnR6dSB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICM1MAogfQogCiBpbnQxNng4X3QgdGVzdF92YWRkbF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRsX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRsX3M4CiAgIHJldHVybiB2YWRkbF9zOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNhZGRsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhiLCB7e3ZbMC0zMV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHNhZGRsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MzJ4NF90IHRlc3RfdmFkZGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkbF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGxfczE2CiAgIHJldHVybiB2YWRkbF9zMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzYWRkbCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40aCwge3t2WzAtMzFdK319LjRoCisgIC8vIENIRUNLOiBzYWRkbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZhZGRsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZGxfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRsX3MzMgogICByZXR1cm4gdmFkZGxfczMyKGEsIGIpOwotICAvLyBDSEVDSzogc2FkZGwge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMnMsIHt7dlswLTMxXSt9fS4ycworICAvLyBDSEVDSzogc2FkZGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiB1aW50MTZ4OF90IHRlc3RfdmFkZGxfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRsX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRsX3U4CiAgIHJldHVybiB2YWRkbF91OChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHVhZGRsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhiLCB7e3ZbMC0zMV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHVhZGRsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZhZGRsX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkbF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGxfdTE2CiAgIHJldHVybiB2YWRkbF91MTYoYSwgYik7Ci0gIC8vIENIRUNLOiB1YWRkbCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40aCwge3t2WzAtMzFdK319LjRoCisgIC8vIENIRUNLOiB1YWRkbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92YWRkbF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZGxfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRsX3UzMgogICByZXR1cm4gdmFkZGxfdTMyKGEsIGIpOwotICAvLyBDSEVDSzogdWFkZGwge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMnMsIHt7dlswLTMxXSt9fS4ycworICAvLyBDSEVDSzogdWFkZGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBpbnQxNng4X3QgdGVzdF92YWRkbF9oaWdoX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkbF9oaWdoX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRsX2hpZ2hfczgKICAgcmV0dXJuIHZhZGRsX2hpZ2hfczgoYSwgYik7Ci0gIC8vIENIRUNLOiBzYWRkbDIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uMTZiCisgIC8vIENIRUNLOiBzYWRkbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZhZGRsX2hpZ2hfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkbF9oaWdoX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkbF9oaWdoX3MxNgogICByZXR1cm4gdmFkZGxfaGlnaF9zMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzYWRkbDIge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44aAorICAvLyBDSEVDSzogc2FkZGwyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogaW50NjR4Ml90IHRlc3RfdmFkZGxfaGlnaF9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRsX2hpZ2hfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRsX2hpZ2hfczMyCiAgIHJldHVybiB2YWRkbF9oaWdoX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNhZGRsMiB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBzYWRkbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50MTZ4OF90IHRlc3RfdmFkZGxfaGlnaF91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkbF9oaWdoX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRsX2hpZ2hfdTgKICAgcmV0dXJuIHZhZGRsX2hpZ2hfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiB1YWRkbDIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uMTZiCisgIC8vIENIRUNLOiB1YWRkbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92YWRkbF9oaWdoX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkbF9oaWdoX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkbF9oaWdoX3UxNgogICByZXR1cm4gdmFkZGxfaGlnaF91MTYoYSwgYik7Ci0gIC8vIENIRUNLOiB1YWRkbDIge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44aAorICAvLyBDSEVDSzogdWFkZGwyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZhZGRsX2hpZ2hfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRsX2hpZ2hfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRsX2hpZ2hfdTMyCiAgIHJldHVybiB2YWRkbF9oaWdoX3UzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHVhZGRsMiB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiB1YWRkbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBpbnQxNng4X3QgdGVzdF92YWRkd19zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkd19zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkd19zOAogICByZXR1cm4gdmFkZHdfczgoYSwgYik7Ci0gIC8vIENIRUNLOiBzYWRkdyB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhiCisgIC8vIENIRUNLOiBzYWRkdyB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhiCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZhZGR3X3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZHdfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGR3X3MxNgogICByZXR1cm4gdmFkZHdfczE2KGEsIGIpOwotICAvLyBDSEVDSzogc2FkZHcge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40aAorICAvLyBDSEVDSzogc2FkZHcge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQ2NHgyX3QgdGVzdF92YWRkd19zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGR3X3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkd19zMzIKICAgcmV0dXJuIHZhZGR3X3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNhZGR3IHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMnMKKyAgLy8gQ0hFQ0s6IHNhZGR3IHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZhZGR3X3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZHdfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZHdfdTgKICAgcmV0dXJuIHZhZGR3X3U4KGEsIGIpOwotICAvLyBDSEVDSzogdWFkZHcge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44YgorICAvLyBDSEVDSzogdWFkZHcge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50MzJ4NF90IHRlc3RfdmFkZHdfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGR3X3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkd191MTYKICAgcmV0dXJuIHZhZGR3X3UxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHVhZGR3IHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNGgKKyAgLy8gQ0hFQ0s6IHVhZGR3IHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZhZGR3X3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkd191MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZHdfdTMyCiAgIHJldHVybiB2YWRkd191MzIoYSwgYik7Ci0gIC8vIENIRUNLOiB1YWRkdyB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJzCisgIC8vIENIRUNLOiB1YWRkdyB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZhZGR3X2hpZ2hfczgoaW50MTZ4OF90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGR3X2hpZ2hfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZHdfaGlnaF9zOAogICByZXR1cm4gdmFkZHdfaGlnaF9zOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNhZGR3MiB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjE2YgorICAvLyBDSEVDSzogc2FkZHcyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZhZGR3X2hpZ2hfczE2KGludDMyeDRfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkd19oaWdoX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkd19oaWdoX3MxNgogICByZXR1cm4gdmFkZHdfaGlnaF9zMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzYWRkdzIge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS44aAorICAvLyBDSEVDSzogc2FkZHcyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgKIH0KIAogaW50NjR4Ml90IHRlc3RfdmFkZHdfaGlnaF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGR3X2hpZ2hfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGR3X2hpZ2hfczMyCiAgIHJldHVybiB2YWRkd19oaWdoX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNhZGR3MiB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBzYWRkdzIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50MTZ4OF90IHRlc3RfdmFkZHdfaGlnaF91OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkd19oaWdoX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGR3X2hpZ2hfdTgKICAgcmV0dXJuIHZhZGR3X2hpZ2hfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiB1YWRkdzIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS4xNmIKKyAgLy8gQ0hFQ0s6IHVhZGR3MiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2YgogfQogCiB1aW50MzJ4NF90IHRlc3RfdmFkZHdfaGlnaF91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZHdfaGlnaF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZHdfaGlnaF91MTYKICAgcmV0dXJuIHZhZGR3X2hpZ2hfdTE2KGEsIGIpOwotICAvLyBDSEVDSzogdWFkZHcyIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHVhZGR3MiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92YWRkd19oaWdoX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkd19oaWdoX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkd19oaWdoX3UzMgogICByZXR1cm4gdmFkZHdfaGlnaF91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiB1YWRkdzIge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS40cworICAvLyBDSEVDSzogdWFkZHcyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50MTZ4OF90IHRlc3RfdnN1YmxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3VibF9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3VibF9zOAogICByZXR1cm4gdnN1YmxfczgoYSwgYik7Ci0gIC8vIENIRUNLOiBzc3VibCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44Yiwge3t2WzAtMzFdK319LjhiCisgIC8vIENIRUNLOiBzc3VibCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZzdWJsX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YmxfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJsX3MxNgogICByZXR1cm4gdnN1YmxfczE2KGEsIGIpOwotICAvLyBDSEVDSzogc3N1Ymwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNGgsIHt7dlswLTMxXSt9fS40aAorICAvLyBDSEVDSzogc3N1Ymwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQ2NHgyX3QgdGVzdF92c3VibF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdWJsX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3VibF9zMzIKICAgcmV0dXJuIHZzdWJsX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNzdWJsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJzLCB7e3ZbMC0zMV0rfX0uMnMKKyAgLy8gQ0hFQ0s6IHNzdWJsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZzdWJsX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3VibF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3VibF91OAogICByZXR1cm4gdnN1YmxfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiB1c3VibCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44Yiwge3t2WzAtMzFdK319LjhiCisgIC8vIENIRUNLOiB1c3VibCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92c3VibF91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YmxfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJsX3UxNgogICByZXR1cm4gdnN1YmxfdTE2KGEsIGIpOwotICAvLyBDSEVDSzogdXN1Ymwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNGgsIHt7dlswLTMxXSt9fS40aAorICAvLyBDSEVDSzogdXN1Ymwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiB1aW50NjR4Ml90IHRlc3RfdnN1YmxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdWJsX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3VibF91MzIKICAgcmV0dXJuIHZzdWJsX3UzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHVzdWJsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJzLCB7e3ZbMC0zMV0rfX0uMnMKKyAgLy8gQ0hFQ0s6IHVzdWJsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50MTZ4OF90IHRlc3RfdnN1YmxfaGlnaF9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YmxfaGlnaF9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3VibF9oaWdoX3M4CiAgIHJldHVybiB2c3VibF9oaWdoX3M4KGEsIGIpOwotICAvLyBDSEVDSzogc3N1YmwyIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjE2Yiwge3t2WzAtMzFdK319LjE2YgorICAvLyBDSEVDSzogc3N1YmwyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQzMng0X3QgdGVzdF92c3VibF9oaWdoX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YmxfaGlnaF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YmxfaGlnaF9zMTYKICAgcmV0dXJuIHZzdWJsX2hpZ2hfczE2KGEsIGIpOwotICAvLyBDSEVDSzogc3N1YmwyIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHNzdWJsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZzdWJsX2hpZ2hfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3VibF9oaWdoX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3VibF9oaWdoX3MzMgogICByZXR1cm4gdnN1YmxfaGlnaF9zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzc3VibDIge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40cworICAvLyBDSEVDSzogc3N1YmwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZzdWJsX2hpZ2hfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YmxfaGlnaF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3VibF9oaWdoX3U4CiAgIHJldHVybiB2c3VibF9oaWdoX3U4KGEsIGIpOwotICAvLyBDSEVDSzogdXN1YmwyIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjE2Yiwge3t2WzAtMzFdK319LjE2YgorICAvLyBDSEVDSzogdXN1YmwyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiB1aW50MzJ4NF90IHRlc3RfdnN1YmxfaGlnaF91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YmxfaGlnaF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YmxfaGlnaF91MTYKICAgcmV0dXJuIHZzdWJsX2hpZ2hfdTE2KGEsIGIpOwotICAvLyBDSEVDSzogdXN1YmwyIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHVzdWJsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92c3VibF9oaWdoX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3VibF9oaWdoX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3VibF9oaWdoX3UzMgogICByZXR1cm4gdnN1YmxfaGlnaF91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiB1c3VibDIge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40cworICAvLyBDSEVDSzogdXN1YmwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50MTZ4OF90IHRlc3RfdnN1YndfczgoaW50MTZ4OF90IGEsIGludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YndfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YndfczgKICAgcmV0dXJuIHZzdWJ3X3M4KGEsIGIpOwotICAvLyBDSEVDSzogc3N1Yncge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44YgorICAvLyBDSEVDSzogc3N1Yncge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQzMng0X3QgdGVzdF92c3Vid19zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdWJ3X3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Vid19zMTYKICAgcmV0dXJuIHZzdWJ3X3MxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNzdWJ3IHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNGgKKyAgLy8gQ0hFQ0s6IHNzdWJ3IHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50NjR4Ml90IHRlc3RfdnN1YndfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3Vid19zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YndfczMyCiAgIHJldHVybiB2c3Vid19zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzc3VidyB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJzCisgIC8vIENIRUNLOiBzc3VidyB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92c3Vid191OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdWJ3X3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJ3X3U4CiAgIHJldHVybiB2c3Vid191OChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHVzdWJ3IHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHVzdWJ3IHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZzdWJ3X3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3Vid191MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YndfdTE2CiAgIHJldHVybiB2c3Vid191MTYoYSwgYik7Ci0gIC8vIENIRUNLOiB1c3VidyB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRoCisgIC8vIENIRUNLOiB1c3VidyB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92c3Vid191MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YndfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJ3X3UzMgogICByZXR1cm4gdnN1YndfdTMyKGEsIGIpOwotICAvLyBDSEVDSzogdXN1Yncge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4ycworICAvLyBDSEVDSzogdXN1Yncge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycwogfQogCiBpbnQxNng4X3QgdGVzdF92c3Vid19oaWdoX3M4KGludDE2eDhfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3Vid19oaWdoX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJ3X2hpZ2hfczgKICAgcmV0dXJuIHZzdWJ3X2hpZ2hfczgoYSwgYik7Ci0gIC8vIENIRUNLOiBzc3VidzIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS4xNmIKKyAgLy8gQ0hFQ0s6IHNzdWJ3MiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2YgogfQogCiBpbnQzMng0X3QgdGVzdF92c3Vid19oaWdoX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YndfaGlnaF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YndfaGlnaF9zMTYKICAgcmV0dXJuIHZzdWJ3X2hpZ2hfczE2KGEsIGIpOwotICAvLyBDSEVDSzogc3N1YncyIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHNzdWJ3MiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZzdWJ3X2hpZ2hfczMyKGludDY0eDJfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3Vid19oaWdoX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Vid19oaWdoX3MzMgogICByZXR1cm4gdnN1YndfaGlnaF9zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzc3VidzIge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS40cworICAvLyBDSEVDSzogc3N1YncyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZzdWJ3X2hpZ2hfdTgodWludDE2eDhfdCBhLCB1aW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YndfaGlnaF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Vid19oaWdoX3U4CiAgIHJldHVybiB2c3Vid19oaWdoX3U4KGEsIGIpOwotICAvLyBDSEVDSzogdXN1YncyIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uMTZiCisgIC8vIENIRUNLOiB1c3VidzIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZzdWJ3X2hpZ2hfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdWJ3X2hpZ2hfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJ3X2hpZ2hfdTE2CiAgIHJldHVybiB2c3Vid19oaWdoX3UxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHVzdWJ3MiB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiB1c3VidzIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aAogfQogCiB1aW50NjR4Ml90IHRlc3RfdnN1YndfaGlnaF91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YndfaGlnaF91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YndfaGlnaF91MzIKICAgcmV0dXJuIHZzdWJ3X2hpZ2hfdTMyKGEsIGIpOwotICAvLyBDSEVDSzogdXN1YncyIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHVzdWJ3MiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzCiB9CiAKIGludDh4OF90IHRlc3RfdmFkZGhuX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZGhuX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkaG5fczE2CiAgIHJldHVybiB2YWRkaG5fczE2KGEsIGIpOwotICAvLyBDSEVDSzogYWRkaG4ge3t2WzAtMzFdK319LjhiLCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44aAorICAvLyBDSEVDSzogYWRkaG4ge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQxNng0X3QgdGVzdF92YWRkaG5fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkaG5fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRobl9zMzIKICAgcmV0dXJuIHZhZGRobl9zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBhZGRobiB7e3ZbMC0zMV0rfX0uNGgsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBhZGRobiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZhZGRobl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRobl9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGhuX3M2NAogICByZXR1cm4gdmFkZGhuX3M2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGFkZGhuIHt7dlswLTMxXSt9fS4ycywge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMmQKKyAgLy8gQ0hFQ0s6IGFkZGhuIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDh4OF90IHRlc3RfdmFkZGhuX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkaG5fdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRobl91MTYKICAgcmV0dXJuIHZhZGRobl91MTYoYSwgYik7Ci0gIC8vIENIRUNLOiBhZGRobiB7e3ZbMC0zMV0rfX0uOGIsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiBhZGRobiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92YWRkaG5fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRobl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGhuX3UzMgogICByZXR1cm4gdmFkZGhuX3UzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IGFkZGhuIHt7dlswLTMxXSt9fS40aCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IGFkZGhuIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZhZGRobl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZGhuX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkaG5fdTY0CiAgIHJldHVybiB2YWRkaG5fdTY0KGEsIGIpOwotICAvLyBDSEVDSzogYWRkaG4ge3t2WzAtMzFdK319LjJzLCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4yZAorICAvLyBDSEVDSzogYWRkaG4ge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBpbnQ4eDE2X3QgdGVzdF92YWRkaG5faGlnaF9zMTYoaW50OHg4X3QgciwgaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRobl9oaWdoX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkaG5faGlnaF9zMTYKICAgcmV0dXJuIHZhZGRobl9oaWdoX3MxNihyLCBhLCBiKTsKLSAgLy8gQ0hFQ0s6IGFkZGhuMiB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44aAorICAvLyBDSEVDSzogYWRkaG4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZhZGRobl9oaWdoX3MzMihpbnQxNng0X3QgciwgaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRobl9oaWdoX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkaG5faGlnaF9zMzIKICAgcmV0dXJuIHZhZGRobl9oaWdoX3MzMihyLCBhLCBiKTsKLSAgLy8gQ0hFQ0s6IGFkZGhuMiB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBhZGRobjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBpbnQzMng0X3QgdGVzdF92YWRkaG5faGlnaF9zNjQoaW50MzJ4Ml90IHIsIGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWRkaG5faGlnaF9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGhuX2hpZ2hfczY0CiAgIHJldHVybiB2YWRkaG5faGlnaF9zNjQociwgYSwgYik7Ci0gIC8vIENIRUNLOiBhZGRobjIge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4yZAorICAvLyBDSEVDSzogYWRkaG4yIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZhZGRobl9oaWdoX3UxNih1aW50OHg4X3QgciwgdWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZGhuX2hpZ2hfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRobl9oaWdoX3UxNgogICByZXR1cm4gdmFkZGhuX2hpZ2hfdTE2KHIsIGEsIGIpOwotICAvLyBDSEVDSzogYWRkaG4yIHt7dlswLTMxXSt9fS4xNmIsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiBhZGRobjIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZhZGRobl9oaWdoX3UzMih1aW50MTZ4NF90IHIsIHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhZGRobl9oaWdoX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkaG5faGlnaF91MzIKICAgcmV0dXJuIHZhZGRobl9oaWdoX3UzMihyLCBhLCBiKTsKLSAgLy8gQ0hFQ0s6IGFkZGhuMiB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBhZGRobjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50MzJ4NF90IHRlc3RfdmFkZGhuX2hpZ2hfdTY0KHVpbnQzMngyX3QgciwgdWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFkZGhuX2hpZ2hfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRobl9oaWdoX3U2NAogICByZXR1cm4gdmFkZGhuX2hpZ2hfdTY0KHIsIGEsIGIpOwotICAvLyBDSEVDSzogYWRkaG4yIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMmQKKyAgLy8gQ0hFQ0s6IGFkZGhuMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIGludDh4OF90IHRlc3RfdnJhZGRobl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZyYWRkaG5fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyYWRkaG5fczE2CiAgIHJldHVybiB2cmFkZGhuX3MxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHJhZGRobiB7e3ZbMC0zMV0rfX0uOGIsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiByYWRkaG4ge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQxNng0X3QgdGVzdF92cmFkZGhuX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJhZGRobl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJhZGRobl9zMzIKICAgcmV0dXJuIHZyYWRkaG5fczMyKGEsIGIpOwotICAvLyBDSEVDSzogcmFkZGhuIHt7dlswLTMxXSt9fS40aCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHJhZGRobiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZyYWRkaG5fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cmFkZGhuX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cmFkZGhuX3M2NAogICByZXR1cm4gdnJhZGRobl9zNjQoYSwgYik7Ci0gIC8vIENIRUNLOiByYWRkaG4ge3t2WzAtMzFdK319LjJzLCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4yZAorICAvLyBDSEVDSzogcmFkZGhuIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDh4OF90IHRlc3RfdnJhZGRobl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJhZGRobl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJhZGRobl91MTYKICAgcmV0dXJuIHZyYWRkaG5fdTE2KGEsIGIpOwotICAvLyBDSEVDSzogcmFkZGhuIHt7dlswLTMxXSt9fS44Yiwge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHJhZGRobiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92cmFkZGhuX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cmFkZGhuX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cmFkZGhuX3UzMgogICByZXR1cm4gdnJhZGRobl91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiByYWRkaG4ge3t2WzAtMzFdK319LjRoLCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40cworICAvLyBDSEVDSzogcmFkZGhuIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZyYWRkaG5fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZyYWRkaG5fdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyYWRkaG5fdTY0CiAgIHJldHVybiB2cmFkZGhuX3U2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHJhZGRobiB7e3ZbMC0zMV0rfX0uMnMsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJkCisgIC8vIENIRUNLOiByYWRkaG4ge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBpbnQ4eDE2X3QgdGVzdF92cmFkZGhuX2hpZ2hfczE2KGludDh4OF90IHIsIGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cmFkZGhuX2hpZ2hfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyYWRkaG5faGlnaF9zMTYKICAgcmV0dXJuIHZyYWRkaG5faGlnaF9zMTYociwgYSwgYik7Ci0gIC8vIENIRUNLOiByYWRkaG4yIHt7dlswLTMxXSt9fS4xNmIsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiByYWRkaG4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZyYWRkaG5faGlnaF9zMzIoaW50MTZ4NF90IHIsIGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cmFkZGhuX2hpZ2hfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyYWRkaG5faGlnaF9zMzIKICAgcmV0dXJuIHZyYWRkaG5faGlnaF9zMzIociwgYSwgYik7Ci0gIC8vIENIRUNLOiByYWRkaG4yIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHJhZGRobjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBpbnQzMng0X3QgdGVzdF92cmFkZGhuX2hpZ2hfczY0KGludDMyeDJfdCByLCBpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJhZGRobl9oaWdoX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cmFkZGhuX2hpZ2hfczY0CiAgIHJldHVybiB2cmFkZGhuX2hpZ2hfczY0KHIsIGEsIGIpOwotICAvLyBDSEVDSzogcmFkZGhuMiB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJkCisgIC8vIENIRUNLOiByYWRkaG4yIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZyYWRkaG5faGlnaF91MTYodWludDh4OF90IHIsIHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZyYWRkaG5faGlnaF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJhZGRobl9oaWdoX3UxNgogICByZXR1cm4gdnJhZGRobl9oaWdoX3UxNihyLCBhLCBiKTsKLSAgLy8gQ0hFQ0s6IHJhZGRobjIge3t2WzAtMzFdK319LjE2Yiwge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHJhZGRobjIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZyYWRkaG5faGlnaF91MzIodWludDE2eDRfdCByLCB1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cmFkZGhuX2hpZ2hfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyYWRkaG5faGlnaF91MzIKICAgcmV0dXJuIHZyYWRkaG5faGlnaF91MzIociwgYSwgYik7Ci0gIC8vIENIRUNLOiByYWRkaG4yIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHJhZGRobjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50MzJ4NF90IHRlc3RfdnJhZGRobl9oaWdoX3U2NCh1aW50MzJ4Ml90IHIsIHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZyYWRkaG5faGlnaF91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJhZGRobl9oaWdoX3U2NAogICByZXR1cm4gdnJhZGRobl9oaWdoX3U2NChyLCBhLCBiKTsKLSAgLy8gQ0hFQ0s6IHJhZGRobjIge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4yZAorICAvLyBDSEVDSzogcmFkZGhuMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIGludDh4OF90IHRlc3RfdnN1YmhuX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YmhuX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3ViaG5fczE2CiAgIHJldHVybiB2c3ViaG5fczE2KGEsIGIpOwotICAvLyBDSEVDSzogc3ViaG4ge3t2WzAtMzFdK319LjhiLCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44aAorICAvLyBDSEVDSzogc3ViaG4ge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQxNng0X3QgdGVzdF92c3ViaG5fczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3ViaG5fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJobl9zMzIKICAgcmV0dXJuIHZzdWJobl9zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdWJobiB7e3ZbMC0zMV0rfX0uNGgsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBzdWJobiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZzdWJobl9zNjQoaW50NjR4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdWJobl9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YmhuX3M2NAogICByZXR1cm4gdnN1YmhuX3M2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN1YmhuIHt7dlswLTMxXSt9fS4ycywge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMmQKKyAgLy8gQ0hFQ0s6IHN1YmhuIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDh4OF90IHRlc3RfdnN1YmhuX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3ViaG5fdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJobl91MTYKICAgcmV0dXJuIHZzdWJobl91MTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdWJobiB7e3ZbMC0zMV0rfX0uOGIsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiBzdWJobiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92c3ViaG5fdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdWJobl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YmhuX3UzMgogICByZXR1cm4gdnN1YmhuX3UzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN1YmhuIHt7dlswLTMxXSt9fS40aCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHN1YmhuIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZzdWJobl91NjQodWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YmhuX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3ViaG5fdTY0CiAgIHJldHVybiB2c3ViaG5fdTY0KGEsIGIpOwotICAvLyBDSEVDSzogc3ViaG4ge3t2WzAtMzFdK319LjJzLCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4yZAorICAvLyBDSEVDSzogc3ViaG4ge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBpbnQ4eDE2X3QgdGVzdF92c3ViaG5faGlnaF9zMTYoaW50OHg4X3QgciwgaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdWJobl9oaWdoX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3ViaG5faGlnaF9zMTYKICAgcmV0dXJuIHZzdWJobl9oaWdoX3MxNihyLCBhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN1YmhuMiB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44aAorICAvLyBDSEVDSzogc3ViaG4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZzdWJobl9oaWdoX3MzMihpbnQxNng0X3QgciwgaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdWJobl9oaWdoX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3ViaG5faGlnaF9zMzIKICAgcmV0dXJuIHZzdWJobl9oaWdoX3MzMihyLCBhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN1YmhuMiB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBzdWJobjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBpbnQzMng0X3QgdGVzdF92c3ViaG5faGlnaF9zNjQoaW50MzJ4Ml90IHIsIGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3ViaG5faGlnaF9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YmhuX2hpZ2hfczY0CiAgIHJldHVybiB2c3ViaG5faGlnaF9zNjQociwgYSwgYik7Ci0gIC8vIENIRUNLOiBzdWJobjIge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4yZAorICAvLyBDSEVDSzogc3ViaG4yIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZzdWJobl9oaWdoX3UxNih1aW50OHg4X3QgciwgdWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YmhuX2hpZ2hfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJobl9oaWdoX3UxNgogICByZXR1cm4gdnN1YmhuX2hpZ2hfdTE2KHIsIGEsIGIpOwotICAvLyBDSEVDSzogc3ViaG4yIHt7dlswLTMxXSt9fS4xNmIsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiBzdWJobjIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZzdWJobl9oaWdoX3UzMih1aW50MTZ4NF90IHIsIHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdWJobl9oaWdoX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3ViaG5faGlnaF91MzIKICAgcmV0dXJuIHZzdWJobl9oaWdoX3UzMihyLCBhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN1YmhuMiB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBzdWJobjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50MzJ4NF90IHRlc3RfdnN1YmhuX2hpZ2hfdTY0KHVpbnQzMngyX3QgciwgdWludDY0eDJfdCBhLCB1aW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN1YmhuX2hpZ2hfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdWJobl9oaWdoX3U2NAogICByZXR1cm4gdnN1YmhuX2hpZ2hfdTY0KHIsIGEsIGIpOwotICAvLyBDSEVDSzogc3ViaG4yIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMmQKKyAgLy8gQ0hFQ0s6IHN1YmhuMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIGludDh4OF90IHRlc3RfdnJzdWJobl9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc3ViaG5fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3ViaG5fczE2CiAgIHJldHVybiB2cnN1YmhuX3MxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHJzdWJobiB7e3ZbMC0zMV0rfX0uOGIsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiByc3ViaG4ge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQxNng0X3QgdGVzdF92cnN1YmhuX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJzdWJobl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzdWJobl9zMzIKICAgcmV0dXJuIHZyc3ViaG5fczMyKGEsIGIpOwotICAvLyBDSEVDSzogcnN1YmhuIHt7dlswLTMxXSt9fS40aCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHJzdWJobiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGludDMyeDJfdCB0ZXN0X3Zyc3ViaG5fczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnN1YmhuX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnN1YmhuX3M2NAogICByZXR1cm4gdnJzdWJobl9zNjQoYSwgYik7Ci0gIC8vIENIRUNLOiByc3ViaG4ge3t2WzAtMzFdK319LjJzLCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4yZAorICAvLyBDSEVDSzogcnN1YmhuIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDh4OF90IHRlc3RfdnJzdWJobl91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJzdWJobl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzdWJobl91MTYKICAgcmV0dXJuIHZyc3ViaG5fdTE2KGEsIGIpOwotICAvLyBDSEVDSzogcnN1YmhuIHt7dlswLTMxXSt9fS44Yiwge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHJzdWJobiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92cnN1YmhuX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnN1YmhuX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnN1YmhuX3UzMgogICByZXR1cm4gdnJzdWJobl91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiByc3ViaG4ge3t2WzAtMzFdK319LjRoLCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40cworICAvLyBDSEVDSzogcnN1YmhuIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogdWludDMyeDJfdCB0ZXN0X3Zyc3ViaG5fdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc3ViaG5fdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3ViaG5fdTY0CiAgIHJldHVybiB2cnN1YmhuX3U2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHJzdWJobiB7e3ZbMC0zMV0rfX0uMnMsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJkCisgIC8vIENIRUNLOiByc3ViaG4ge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBpbnQ4eDE2X3QgdGVzdF92cnN1YmhuX2hpZ2hfczE2KGludDh4OF90IHIsIGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnN1YmhuX2hpZ2hfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3ViaG5faGlnaF9zMTYKICAgcmV0dXJuIHZyc3ViaG5faGlnaF9zMTYociwgYSwgYik7Ci0gIC8vIENIRUNLOiByc3ViaG4yIHt7dlswLTMxXSt9fS4xNmIsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiByc3ViaG4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDE2eDhfdCB0ZXN0X3Zyc3ViaG5faGlnaF9zMzIoaW50MTZ4NF90IHIsIGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnN1YmhuX2hpZ2hfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3ViaG5faGlnaF9zMzIKICAgcmV0dXJuIHZyc3ViaG5faGlnaF9zMzIociwgYSwgYik7Ci0gIC8vIENIRUNLOiByc3ViaG4yIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHJzdWJobjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBpbnQzMng0X3QgdGVzdF92cnN1YmhuX2hpZ2hfczY0KGludDMyeDJfdCByLCBpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJzdWJobl9oaWdoX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnN1YmhuX2hpZ2hfczY0CiAgIHJldHVybiB2cnN1YmhuX2hpZ2hfczY0KHIsIGEsIGIpOwotICAvLyBDSEVDSzogcnN1YmhuMiB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJkCisgIC8vIENIRUNLOiByc3ViaG4yIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogdWludDh4MTZfdCB0ZXN0X3Zyc3ViaG5faGlnaF91MTYodWludDh4OF90IHIsIHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc3ViaG5faGlnaF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzdWJobl9oaWdoX3UxNgogICByZXR1cm4gdnJzdWJobl9oaWdoX3UxNihyLCBhLCBiKTsKLSAgLy8gQ0hFQ0s6IHJzdWJobjIge3t2WzAtMzFdK319LjE2Yiwge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHJzdWJobjIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDE2eDhfdCB0ZXN0X3Zyc3ViaG5faGlnaF91MzIodWludDE2eDRfdCByLCB1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cnN1YmhuX2hpZ2hfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3ViaG5faGlnaF91MzIKICAgcmV0dXJuIHZyc3ViaG5faGlnaF91MzIociwgYSwgYik7Ci0gIC8vIENIRUNLOiByc3ViaG4yIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHJzdWJobjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiB1aW50MzJ4NF90IHRlc3RfdnJzdWJobl9oaWdoX3U2NCh1aW50MzJ4Ml90IHIsIHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zyc3ViaG5faGlnaF91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzdWJobl9oaWdoX3U2NAogICByZXR1cm4gdnJzdWJobl9oaWdoX3U2NChyLCBhLCBiKTsKLSAgLy8gQ0hFQ0s6IHJzdWJobjIge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4yZAorICAvLyBDSEVDSzogcnN1YmhuMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZhYmRsX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiZGxfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZGxfczgKICAgcmV0dXJuIHZhYmRsX3M4KGEsIGIpOwotICAvLyBDSEVDSzogc2FiZGwge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGIsIHt7dlswLTMxXSt9fS44YgorICAvLyBDSEVDSzogc2FiZGwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogaW50MzJ4NF90IHRlc3RfdmFiZGxfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWJkbF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZGxfczE2CiAgIHJldHVybiB2YWJkbF9zMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzYWJkbCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40aCwge3t2WzAtMzFdK319LjRoCisgIC8vIENIRUNLOiBzYWJkbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiBpbnQ2NHgyX3QgdGVzdF92YWJkbF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmRsX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJkbF9zMzIKICAgcmV0dXJuIHZhYmRsX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNhYmRsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJzLCB7e3ZbMC0zMV0rfX0uMnMKKyAgLy8gQ0hFQ0s6IHNhYmRsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIHVpbnQxNng4X3QgdGVzdF92YWJkbF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiZGxfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZGxfdTgKICAgcmV0dXJuIHZhYmRsX3U4KGEsIGIpOwotICAvLyBDSEVDSzogdWFiZGwge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGIsIHt7dlswLTMxXSt9fS44YgorICAvLyBDSEVDSzogdWFiZGwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogdWludDMyeDRfdCB0ZXN0X3ZhYmRsX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWJkbF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZGxfdTE2CiAgIHJldHVybiB2YWJkbF91MTYoYSwgYik7Ci0gIC8vIENIRUNLOiB1YWJkbCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40aCwge3t2WzAtMzFdK319LjRoCisgIC8vIENIRUNLOiB1YWJkbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiB1aW50NjR4Ml90IHRlc3RfdmFiZGxfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmRsX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJkbF91MzIKICAgcmV0dXJuIHZhYmRsX3UzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHVhYmRsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJzLCB7e3ZbMC0zMV0rfX0uMnMKKyAgLy8gQ0hFQ0s6IHVhYmRsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50MTZ4OF90IHRlc3RfdmFiYWxfczgoaW50MTZ4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiYWxfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiYWxfczgKICAgcmV0dXJuIHZhYmFsX3M4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogc2FiYWwge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGIsIHt7dlswLTMxXSt9fS44YgorICAvLyBDSEVDSzogc2FiYWwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogaW50MzJ4NF90IHRlc3RfdmFiYWxfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiYWxfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmFsX3MxNgogICByZXR1cm4gdmFiYWxfczE2KGEsIGIsIGMpOwotICAvLyBDSEVDSzogc2FiYWwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNGgsIHt7dlswLTMxXSt9fS40aAorICAvLyBDSEVDSzogc2FiYWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogaW50NjR4Ml90IHRlc3RfdmFiYWxfczMyKGludDY0eDJfdCBhLCBpbnQzMngyX3QgYiwgaW50MzJ4Ml90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiYWxfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmFsX3MzMgogICByZXR1cm4gdmFiYWxfczMyKGEsIGIsIGMpOwotICAvLyBDSEVDSzogc2FiYWwge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMnMsIHt7dlswLTMxXSt9fS4ycworICAvLyBDSEVDSzogc2FiYWwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogdWludDE2eDhfdCB0ZXN0X3ZhYmFsX3U4KHVpbnQxNng4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmFsX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmFsX3U4CiAgIHJldHVybiB2YWJhbF91OChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHVhYmFsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhiLCB7e3ZbMC0zMV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHVhYmFsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIHVpbnQzMng0X3QgdGVzdF92YWJhbF91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4NF90IGIsIHVpbnQxNng0X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92YWJhbF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiYWxfdTE2CiAgIHJldHVybiB2YWJhbF91MTYoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB1YWJhbCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40aCwge3t2WzAtMzFdK319LjRoCisgIC8vIENIRUNLOiB1YWJhbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiB1aW50NjR4Ml90IHRlc3RfdmFiYWxfdTMyKHVpbnQ2NHgyX3QgYSwgdWludDMyeDJfdCBiLCB1aW50MzJ4Ml90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiYWxfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmFsX3UzMgogICByZXR1cm4gdmFiYWxfdTMyKGEsIGIsIGMpOwotICAvLyBDSEVDSzogdWFiYWwge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMnMsIHt7dlswLTMxXSt9fS4ycworICAvLyBDSEVDSzogdWFiYWwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBpbnQxNng4X3QgdGVzdF92YWJkbF9oaWdoX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWJkbF9oaWdoX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmRsX2hpZ2hfczgKICAgcmV0dXJuIHZhYmRsX2hpZ2hfczgoYSwgYik7Ci0gIC8vIENIRUNLOiBzYWJkbDIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uMTZiCisgIC8vIENIRUNLOiBzYWJkbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiBpbnQzMng0X3QgdGVzdF92YWJkbF9oaWdoX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiZGxfaGlnaF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZGxfaGlnaF9zMTYKICAgcmV0dXJuIHZhYmRsX2hpZ2hfczE2KGEsIGIpOwotICAvLyBDSEVDSzogc2FiZGwyIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHNhYmRsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiBpbnQ2NHgyX3QgdGVzdF92YWJkbF9oaWdoX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiZGxfaGlnaF9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZGxfaGlnaF9zMzIKICAgcmV0dXJuIHZhYmRsX2hpZ2hfczMyKGEsIGIpOwotICAvLyBDSEVDSzogc2FiZGwyIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHNhYmRsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiB1aW50MTZ4OF90IHRlc3RfdmFiZGxfaGlnaF91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92YWJkbF9oaWdoX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmRsX2hpZ2hfdTgKICAgcmV0dXJuIHZhYmRsX2hpZ2hfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiB1YWJkbDIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uMTZiCisgIC8vIENIRUNLOiB1YWJkbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiB1aW50MzJ4NF90IHRlc3RfdmFiZGxfaGlnaF91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiZGxfaGlnaF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZGxfaGlnaF91MTYKICAgcmV0dXJuIHZhYmRsX2hpZ2hfdTE2KGEsIGIpOwotICAvLyBDSEVDSzogdWFiZGwyIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHVhYmRsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiB1aW50NjR4Ml90IHRlc3RfdmFiZGxfaGlnaF91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiZGxfaGlnaF91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiZGxfaGlnaF91MzIKICAgcmV0dXJuIHZhYmRsX2hpZ2hfdTMyKGEsIGIpOwotICAvLyBDSEVDSzogdWFiZGwyIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHVhYmRsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZhYmFsX2hpZ2hfczgoaW50MTZ4OF90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92YWJhbF9oaWdoX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmFsX2hpZ2hfczgKICAgcmV0dXJuIHZhYmFsX2hpZ2hfczgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzYWJhbDIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uMTZiCisgIC8vIENIRUNLOiBzYWJhbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiBpbnQzMng0X3QgdGVzdF92YWJhbF9oaWdoX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYmFsX2hpZ2hfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYmFsX2hpZ2hfczE2CiAgIHJldHVybiB2YWJhbF9oaWdoX3MxNihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHNhYmFsMiB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiBzYWJhbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogaW50NjR4Ml90IHRlc3RfdmFiYWxfaGlnaF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92YWJhbF9oaWdoX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJhbF9oaWdoX3MzMgogICByZXR1cm4gdmFiYWxfaGlnaF9zMzIoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzYWJhbDIge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40cworICAvLyBDSEVDSzogc2FiYWwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIHVpbnQxNng4X3QgdGVzdF92YWJhbF9oaWdoX3U4KHVpbnQxNng4X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHgxNl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiYWxfaGlnaF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJhbF9oaWdoX3U4CiAgIHJldHVybiB2YWJhbF9oaWdoX3U4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdWFiYWwyIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjE2Yiwge3t2WzAtMzFdK319LjE2YgorICAvLyBDSEVDSzogdWFiYWwyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogdWludDMyeDRfdCB0ZXN0X3ZhYmFsX2hpZ2hfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZ4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFiYWxfaGlnaF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFiYWxfaGlnaF91MTYKICAgcmV0dXJuIHZhYmFsX2hpZ2hfdTE2KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdWFiYWwyIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHVhYmFsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiB1aW50NjR4Ml90IHRlc3RfdmFiYWxfaGlnaF91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMng0X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92YWJhbF9oaWdoX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJhbF9oaWdoX3UzMgogICByZXR1cm4gdmFiYWxfaGlnaF91MzIoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB1YWJhbDIge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40cworICAvLyBDSEVDSzogdWFiYWwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50MTZ4OF90IHRlc3Rfdm11bGxfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9zOAogICByZXR1cm4gdm11bGxfczgoYSwgYik7Ci0gIC8vIENIRUNLOiBzbXVsbCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44Yiwge3t2WzAtMzFdK319LjhiCisgIC8vIENIRUNLOiBzbXVsbCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiBpbnQzMng0X3QgdGVzdF92bXVsbF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF9zMTYKICAgcmV0dXJuIHZtdWxsX3MxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNtdWxsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRoLCB7e3ZbMC0zMV0rfX0uNGgKKyAgLy8gQ0hFQ0s6IHNtdWxsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIGludDY0eDJfdCB0ZXN0X3ZtdWxsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX3MzMgogICByZXR1cm4gdm11bGxfczMyKGEsIGIpOwotICAvLyBDSEVDSzogc211bGwge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMnMsIHt7dlswLTMxXSt9fS4ycworICAvLyBDSEVDSzogc211bGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogdWludDE2eDhfdCB0ZXN0X3ZtdWxsX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF91OAogICByZXR1cm4gdm11bGxfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiB1bXVsbCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44Yiwge3t2WzAtMzFdK319LjhiCisgIC8vIENIRUNLOiB1bXVsbCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiB1aW50MzJ4NF90IHRlc3Rfdm11bGxfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxsX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsbF91MTYKICAgcmV0dXJuIHZtdWxsX3UxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHVtdWxsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRoLCB7e3ZbMC0zMV0rfX0uNGgKKyAgLy8gQ0hFQ0s6IHVtdWxsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIHVpbnQ2NHgyX3QgdGVzdF92bXVsbF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX3UzMgogICByZXR1cm4gdm11bGxfdTMyKGEsIGIpOwotICAvLyBDSEVDSzogdW11bGwge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMnMsIHt7dlswLTMxXSt9fS4ycworICAvLyBDSEVDSzogdW11bGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBpbnQxNng4X3QgdGVzdF92bXVsbF9oaWdoX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9oaWdoX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2hpZ2hfczgKICAgcmV0dXJuIHZtdWxsX2hpZ2hfczgoYSwgYik7Ci0gIC8vIENIRUNLOiBzbXVsbDIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uMTZiCisgIC8vIENIRUNLOiBzbXVsbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiBpbnQzMng0X3QgdGVzdF92bXVsbF9oaWdoX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfaGlnaF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9zMTYKICAgcmV0dXJuIHZtdWxsX2hpZ2hfczE2KGEsIGIpOwotICAvLyBDSEVDSzogc211bGwyIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHNtdWxsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiBpbnQ2NHgyX3QgdGVzdF92bXVsbF9oaWdoX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfaGlnaF9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF9zMzIKICAgcmV0dXJuIHZtdWxsX2hpZ2hfczMyKGEsIGIpOwotICAvLyBDSEVDSzogc211bGwyIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHNtdWxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiB1aW50MTZ4OF90IHRlc3Rfdm11bGxfaGlnaF91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9oaWdoX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2hpZ2hfdTgKICAgcmV0dXJuIHZtdWxsX2hpZ2hfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiB1bXVsbDIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uMTZiCisgIC8vIENIRUNLOiB1bXVsbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiB1aW50MzJ4NF90IHRlc3Rfdm11bGxfaGlnaF91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfaGlnaF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF91MTYKICAgcmV0dXJuIHZtdWxsX2hpZ2hfdTE2KGEsIGIpOwotICAvLyBDSEVDSzogdW11bGwyIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHVtdWxsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiB1aW50NjR4Ml90IHRlc3Rfdm11bGxfaGlnaF91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfaGlnaF91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfaGlnaF91MzIKICAgcmV0dXJuIHZtdWxsX2hpZ2hfdTMyKGEsIGIpOwotICAvLyBDSEVDSzogdW11bGwyIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNHMKKyAgLy8gQ0hFQ0s6IHVtdWxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtbGFsX3M4KGludDE2eDhfdCBhLCBpbnQ4eDhfdCBiLCBpbnQ4eDhfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX3M4CiAgIHJldHVybiB2bWxhbF9zOChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHNtbGFsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhiLCB7e3ZbMC0zMV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHNtbGFsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIGludDMyeDRfdCB0ZXN0X3ZtbGFsX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4NF90IGIsIGludDE2eDRfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9zMTYKICAgcmV0dXJuIHZtbGFsX3MxNihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHNtbGFsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRoLCB7e3ZbMC0zMV0rfX0uNGgKKyAgLy8gQ0hFQ0s6IHNtbGFsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIGludDY0eDJfdCB0ZXN0X3ZtbGFsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9zMzIKICAgcmV0dXJuIHZtbGFsX3MzMihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHNtbGFsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJzLCB7e3ZbMC0zMV0rfX0uMnMKKyAgLy8gQ0hFQ0s6IHNtbGFsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIHVpbnQxNng4X3QgdGVzdF92bWxhbF91OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDhfdCBiLCB1aW50OHg4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF91OAogICByZXR1cm4gdm1sYWxfdTgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB1bWxhbCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44Yiwge3t2WzAtMzFdK319LjhiCisgIC8vIENIRUNLOiB1bWxhbCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiB1aW50MzJ4NF90IHRlc3Rfdm1sYWxfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDRfdCBiLCB1aW50MTZ4NF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX3UxNgogICByZXR1cm4gdm1sYWxfdTE2KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdW1sYWwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNGgsIHt7dlswLTMxXSt9fS40aAorICAvLyBDSEVDSzogdW1sYWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogdWludDY0eDJfdCB0ZXN0X3ZtbGFsX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMngyX3QgYiwgdWludDMyeDJfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF91MzIKICAgcmV0dXJuIHZtbGFsX3UzMihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHVtbGFsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJzLCB7e3ZbMC0zMV0rfX0uMnMKKyAgLy8gQ0hFQ0s6IHVtbGFsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50MTZ4OF90IHRlc3Rfdm1sYWxfaGlnaF9zOChpbnQxNng4X3QgYSwgaW50OHgxNl90IGIsIGludDh4MTZfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2hpZ2hfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfaGlnaF9zOAogICByZXR1cm4gdm1sYWxfaGlnaF9zOChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHNtbGFsMiB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS4xNmIsIHt7dlswLTMxXSt9fS4xNmIKKyAgLy8gQ0hFQ0s6IHNtbGFsMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIGludDMyeDRfdCB0ZXN0X3ZtbGFsX2hpZ2hfczE2KGludDMyeDRfdCBhLCBpbnQxNng4X3QgYiwgaW50MTZ4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sYWxfaGlnaF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sYWxfaGlnaF9zMTYKICAgcmV0dXJuIHZtbGFsX2hpZ2hfczE2KGEsIGIsIGMpOwotICAvLyBDSEVDSzogc21sYWwyIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHNtbGFsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiBpbnQ2NHgyX3QgdGVzdF92bWxhbF9oaWdoX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIsIGludDMyeDRfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2hpZ2hfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfczMyCiAgIHJldHVybiB2bWxhbF9oaWdoX3MzMihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHNtbGFsMiB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBzbWxhbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogdWludDE2eDhfdCB0ZXN0X3ZtbGFsX2hpZ2hfdTgodWludDE2eDhfdCBhLCB1aW50OHgxNl90IGIsIHVpbnQ4eDE2X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9oaWdoX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfdTgKICAgcmV0dXJuIHZtbGFsX2hpZ2hfdTgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB1bWxhbDIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uMTZiCisgIC8vIENIRUNLOiB1bWxhbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiB1aW50MzJ4NF90IHRlc3Rfdm1sYWxfaGlnaF91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4OF90IGIsIHVpbnQxNng4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxhbF9oaWdoX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxhbF9oaWdoX3UxNgogICByZXR1cm4gdm1sYWxfaGlnaF91MTYoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB1bWxhbDIge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44aAorICAvLyBDSEVDSzogdW1sYWwyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIHVpbnQ2NHgyX3QgdGVzdF92bWxhbF9oaWdoX3UzMih1aW50NjR4Ml90IGEsIHVpbnQzMng0X3QgYiwgdWludDMyeDRfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbGFsX2hpZ2hfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbGFsX2hpZ2hfdTMyCiAgIHJldHVybiB2bWxhbF9oaWdoX3UzMihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHVtbGFsMiB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiB1bWxhbDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogCiBpbnQxNng4X3QgdGVzdF92bWxzbF9zOChpbnQxNng4X3QgYSwgaW50OHg4X3QgYiwgaW50OHg4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9zOAogICByZXR1cm4gdm1sc2xfczgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzbWxzbCB7e3ZbMC0zMV0rfX0uOGgsIHt7dlswLTMxXSt9fS44Yiwge3t2WzAtMzFdK319LjhiCisgIC8vIENIRUNLOiBzbWxzbCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiBpbnQzMng0X3QgdGVzdF92bWxzbF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfczE2CiAgIHJldHVybiB2bWxzbF9zMTYoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzbWxzbCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40aCwge3t2WzAtMzFdK319LjRoCisgIC8vIENIRUNLOiBzbWxzbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiBpbnQ2NHgyX3QgdGVzdF92bWxzbF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfczMyCiAgIHJldHVybiB2bWxzbF9zMzIoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzbWxzbCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4ycywge3t2WzAtMzFdK319LjJzCisgIC8vIENIRUNLOiBzbWxzbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiB1aW50MTZ4OF90IHRlc3Rfdm1sc2xfdTgodWludDE2eDhfdCBhLCB1aW50OHg4X3QgYiwgdWludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfdTgKICAgcmV0dXJuIHZtbHNsX3U4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdW1sc2wge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGIsIHt7dlswLTMxXSt9fS44YgorICAvLyBDSEVDSzogdW1sc2wge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogdWludDMyeDRfdCB0ZXN0X3ZtbHNsX3UxNih1aW50MzJ4NF90IGEsIHVpbnQxNng0X3QgYiwgdWludDE2eDRfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF91MTYKICAgcmV0dXJuIHZtbHNsX3UxNihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHVtbHNsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRoLCB7e3ZbMC0zMV0rfX0uNGgKKyAgLy8gQ0hFQ0s6IHVtbHNsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIHVpbnQ2NHgyX3QgdGVzdF92bWxzbF91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4Ml90IGIsIHVpbnQzMngyX3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfdTMyCiAgIHJldHVybiB2bWxzbF91MzIoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB1bWxzbCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4ycywge3t2WzAtMzFdK319LjJzCisgIC8vIENIRUNLOiB1bWxzbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZtbHNsX2hpZ2hfczgoaW50MTZ4OF90IGEsIGludDh4MTZfdCBiLCBpbnQ4eDE2X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9oaWdoX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2hpZ2hfczgKICAgcmV0dXJuIHZtbHNsX2hpZ2hfczgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzbWxzbDIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uMTZiCisgIC8vIENIRUNLOiBzbWxzbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiBpbnQzMng0X3QgdGVzdF92bWxzbF9oaWdoX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIsIGludDE2eDhfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtbHNsX2hpZ2hfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtbHNsX2hpZ2hfczE2CiAgIHJldHVybiB2bWxzbF9oaWdoX3MxNihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHNtbHNsMiB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiBzbWxzbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogaW50NjR4Ml90IHRlc3Rfdm1sc2xfaGlnaF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9oaWdoX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9oaWdoX3MzMgogICByZXR1cm4gdm1sc2xfaGlnaF9zMzIoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzbWxzbDIge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40cworICAvLyBDSEVDSzogc21sc2wyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIHVpbnQxNng4X3QgdGVzdF92bWxzbF9oaWdoX3U4KHVpbnQxNng4X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHgxNl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfaGlnaF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9oaWdoX3U4CiAgIHJldHVybiB2bWxzbF9oaWdoX3U4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdW1sc2wyIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjE2Yiwge3t2WzAtMzFdK319LjE2YgorICAvLyBDSEVDSzogdW1sc2wyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogdWludDMyeDRfdCB0ZXN0X3ZtbHNsX2hpZ2hfdTE2KHVpbnQzMng0X3QgYSwgdWludDE2eDhfdCBiLCB1aW50MTZ4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1sc2xfaGlnaF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1sc2xfaGlnaF91MTYKICAgcmV0dXJuIHZtbHNsX2hpZ2hfdTE2KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdW1sc2wyIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGgKKyAgLy8gQ0hFQ0s6IHVtbHNsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiB1aW50NjR4Ml90IHRlc3Rfdm1sc2xfaGlnaF91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4NF90IGIsIHVpbnQzMng0X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92bWxzbF9oaWdoX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWxzbF9oaWdoX3UzMgogICByZXR1cm4gdm1sc2xfaGlnaF91MzIoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB1bWxzbDIge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40cworICAvLyBDSEVDSzogdW1sc2wyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50MzJ4NF90IHRlc3RfdnFkbXVsbF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG11bGxfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGxfczE2CiAgIHJldHVybiB2cWRtdWxsX3MxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHNxZG11bGwge3t2WzAtMzFdK319LjRzLCB7e3ZbMC0zMV0rfX0uNGgsIHt7dlswLTMxXSt9fS40aAorICAvLyBDSEVDSzogc3FkbXVsbCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiBpbnQ2NHgyX3QgdGVzdF92cWRtdWxsX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbF9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsbF9zMzIKICAgcmV0dXJuIHZxZG11bGxfczMyKGEsIGIpOwotICAvLyBDSEVDSzogc3FkbXVsbCB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS4ycywge3t2WzAtMzFdK319LjJzCisgIC8vIENIRUNLOiBzcWRtdWxsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKIH0KIAogaW50MzJ4NF90IHRlc3RfdnFkbWxhbF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDRfdCBiLCBpbnQxNng0X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cWRtbGFsX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsX3MxNgogICByZXR1cm4gdnFkbWxhbF9zMTYoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzcWRtbGFsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRoLCB7e3ZbMC0zMV0rfX0uNGgKKyAgLy8gQ0hFQ0s6IHNxZG1sYWwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQ2NHgyX3QgdGVzdF92cWRtbGFsX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4Ml90IGIsIGludDMyeDJfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxZG1sYWxfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sYWxfczMyCiAgIHJldHVybiB2cWRtbGFsX3MzMihhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHNxZG1sYWwge3t2WzAtMzFdK319LjJkLCB7e3ZbMC0zMV0rfX0uMnMsIHt7dlswLTMxXSt9fS4ycworICAvLyBDSEVDSzogc3FkbWxhbCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxZG1sc2xfczE2KGludDMyeDRfdCBhLCBpbnQxNng0X3QgYiwgaW50MTZ4NF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFkbWxzbF9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxzbF9zMTYKICAgcmV0dXJuIHZxZG1sc2xfczE2KGEsIGIsIGMpOwotICAvLyBDSEVDSzogc3FkbWxzbCB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS40aCwge3t2WzAtMzFdK319LjRoCisgIC8vIENIRUNLOiBzcWRtbHNsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogaW50NjR4Ml90IHRlc3RfdnFkbWxzbF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDJfdCBiLCBpbnQzMngyX3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cWRtbHNsX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbHNsX3MzMgogICByZXR1cm4gdnFkbWxzbF9zMzIoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzcWRtbHNsIHt7dlswLTMxXSt9fS4yZCwge3t2WzAtMzFdK319LjJzLCB7e3ZbMC0zMV0rfX0uMnMKKyAgLy8gQ0hFQ0s6IHNxZG1sc2wge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycwogfQogCiBpbnQzMng0X3QgdGVzdF92cWRtdWxsX2hpZ2hfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cWRtdWxsX2hpZ2hfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGxfaGlnaF9zMTYKICAgcmV0dXJuIHZxZG11bGxfaGlnaF9zMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzcWRtdWxsMiB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiBzcWRtdWxsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiBpbnQ2NHgyX3QgdGVzdF92cWRtdWxsX2hpZ2hfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cWRtdWxsX2hpZ2hfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGxfaGlnaF9zMzIKICAgcmV0dXJuIHZxZG11bGxfaGlnaF9zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzcWRtdWxsMiB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBzcWRtdWxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxZG1sYWxfaGlnaF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cWRtbGFsX2hpZ2hfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sYWxfaGlnaF9zMTYKICAgcmV0dXJuIHZxZG1sYWxfaGlnaF9zMTYoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzcWRtbGFsMiB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiBzcWRtbGFsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZxZG1sYWxfaGlnaF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cWRtbGFsX2hpZ2hfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sYWxfaGlnaF9zMzIKICAgcmV0dXJuIHZxZG1sYWxfaGlnaF9zMzIoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzcWRtbGFsMiB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBzcWRtbGFsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxZG1sc2xfaGlnaF9zMTYoaW50MzJ4NF90IGEsIGludDE2eDhfdCBiLCBpbnQxNng4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cWRtbHNsX2hpZ2hfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sc2xfaGlnaF9zMTYKICAgcmV0dXJuIHZxZG1sc2xfaGlnaF9zMTYoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzcWRtbHNsMiB7e3ZbMC0zMV0rfX0uNHMsIHt7dlswLTMxXSt9fS44aCwge3t2WzAtMzFdK319LjhoCisgIC8vIENIRUNLOiBzcWRtbHNsMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZxZG1sc2xfaGlnaF9zMzIoaW50NjR4Ml90IGEsIGludDMyeDRfdCBiLCBpbnQzMng0X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cWRtbHNsX2hpZ2hfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sc2xfaGlnaF9zMzIKICAgcmV0dXJuIHZxZG1sc2xfaGlnaF9zMzIoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiBzcWRtbHNsMiB7e3ZbMC0zMV0rfX0uMmQsIHt7dlswLTMxXSt9fS40cywge3t2WzAtMzFdK319LjRzCisgIC8vIENIRUNLOiBzcWRtbHNsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHBvbHkxNng4X3QgdGVzdF92bXVsbF9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bGxfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfcDgKICAgcmV0dXJuIHZtdWxsX3A4KGEsIGIpOwotICAvLyBDSEVDSzogcG11bGwge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uOGIsIHt7dlswLTMxXSt9fS44YgorICAvLyBDSEVDSzogcG11bGwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBwb2x5MTZ4OF90IHRlc3Rfdm11bGxfaGlnaF9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92bXVsbF9oaWdoX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2hpZ2hfcDgKICAgcmV0dXJuIHZtdWxsX2hpZ2hfcDgoYSwgYik7Ci0gIC8vIENIRUNLOiBwbXVsbDIge3t2WzAtMzFdK319LjhoLCB7e3ZbMC0zMV0rfX0uMTZiLCB7e3ZbMC0zMV0rfX0uMTZiCisgIC8vIENIRUNLOiBwbXVsbDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDY0X3QgdGVzdF92YWRkZF9zNjQoaW50NjRfdCBhLCBpbnQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZhZGRkX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGRfczY0CiAgIHJldHVybiB2YWRkZF9zNjQoYSwgYik7Ci0vLyBDSEVDSzogYWRkIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLOiBhZGQge3tbeGRdWzAtOV0rfX0sIHt7W3hkXVswLTldK319LCB7e1t4ZF1bMC05XSt9fQogfQogCiB1aW50NjRfdCB0ZXN0X3ZhZGRkX3U2NCh1aW50NjRfdCBhLCB1aW50NjRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92YWRkZF91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhZGRkX3U2NAogICByZXR1cm4gdmFkZGRfdTY0KGEsIGIpOwotLy8gQ0hFQ0s6IGFkZCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CisvLyBDSEVDSzogYWRkIHt7W3hkXVswLTldK319LCB7e1t4ZF1bMC05XSt9fSwge3tbeGRdWzAtOV0rfX0KIH0KIAogaW50NjRfdCB0ZXN0X3ZzdWJkX3M2NChpbnQ2NF90IGEsIGludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnN1YmRfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c3ViZF9zNjQKICAgcmV0dXJuIHZzdWJkX3M2NChhLCBiKTsKLS8vIENIRUNLOiBzdWIge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0s6IHN1YiB7e1t4ZF1bMC05XSt9fSwge3tbeGRdWzAtOV0rfX0sIHt7W3hkXVswLTldK319CiB9CiAKIHVpbnQ2NF90IHRlc3RfdnN1YmRfdTY0KHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzdWJkX3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN1YmRfdTY0CiAgIHJldHVybiB2c3ViZF91NjQoYSwgYik7Ci0vLyBDSEVDSzogc3ViIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLOiBzdWIge3tbeGRdWzAtOV0rfX0sIHt7W3hkXVswLTldK319LCB7e1t4ZF1bMC05XSt9fQogfQogCiBpbnQ4X3QgdGVzdF92cWFkZGJfczgoaW50OF90IGEsIGludDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFkZGJfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxYWRkYl9zOAogICByZXR1cm4gdnFhZGRiX3M4KGEsIGIpOwotLy8gQ0hFQ0s6IHNxYWRkIHt7YlswLTldK319LCB7e2JbMC05XSt9fSwge3tiWzAtOV0rfX0KKy8vIENIRUNLOiBzcWFkZCB7e2JbMC05XSt8dlswLTldKy44Yn19LCB7e2JbMC05XSt8dlswLTldKy44Yn19LCB7e2JbMC05XSt8dlswLTldKy44Yn19CiB9CiAKIGludDE2X3QgdGVzdF92cWFkZGhfczE2KGludDE2X3QgYSwgaW50MTZfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFkZGhfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWFkZGhfczE2CiAgIHJldHVybiB2cWFkZGhfczE2KGEsIGIpOwotLy8gQ0hFQ0s6IHNxYWRkIHt7aFswLTldK319LCB7e2hbMC05XSt9fSwge3toWzAtOV0rfX0KKy8vIENIRUNLOiBzcWFkZCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e2hbMC05XSt8dlswLTldKy40aH19CiB9CiAKIGludDMyX3QgdGVzdF92cWFkZHNfczMyKGludDMyX3QgYSwgaW50MzJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFkZHNfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWFkZHNfczMyCiAgIHJldHVybiB2cWFkZHNfczMyKGEsIGIpOwogLy8gQ0hFQ0s6IHNxYWRkIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KIH0KIAogaW50NjRfdCB0ZXN0X3ZxYWRkZF9zNjQoaW50NjRfdCBhLCBpbnQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxYWRkZF9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxYWRkZF9zNjQKICAgcmV0dXJuIHZxYWRkZF9zNjQoYSwgYik7CiAvLyBDSEVDSzogc3FhZGQge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiB1aW50OF90IHRlc3RfdnFhZGRiX3U4KHVpbnQ4X3QgYSwgdWludDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFkZGJfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxYWRkYl91OAogICByZXR1cm4gdnFhZGRiX3U4KGEsIGIpOwotLy8gQ0hFQ0s6IHVxYWRkIHt7YlswLTldK319LCB7e2JbMC05XSt9fSwge3tiWzAtOV0rfX0KKy8vIENIRUNLOiB1cWFkZCB7e2JbMC05XSt8dlswLTldKy44Yn19LCB7e2JbMC05XSt8dlswLTldKy44Yn19LCB7e2JbMC05XSt8dlswLTldKy44Yn19CiB9CiAKIHVpbnQxNl90IHRlc3RfdnFhZGRoX3UxNih1aW50MTZfdCBhLCB1aW50MTZfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFkZGhfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWFkZGhfdTE2CiAgIHJldHVybiB2cWFkZGhfdTE2KGEsIGIpOwotLy8gQ0hFQ0s6IHVxYWRkIHt7aFswLTldK319LCB7e2hbMC05XSt9fSwge3toWzAtOV0rfX0KKy8vIENIRUNLOiB1cWFkZCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e2hbMC05XSt8dlswLTldKy40aH19CiB9CiAKIHVpbnQzMl90IHRlc3RfdnFhZGRzX3UzMih1aW50MzJfdCBhLCB1aW50MzJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFkZHNfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWFkZHNfdTMyCiAgIHJldHVybiB2cWFkZHNfdTMyKGEsIGIpOwogLy8gQ0hFQ0s6IHVxYWRkIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KIH0KIAogdWludDY0X3QgdGVzdF92cWFkZGRfdTY0KHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxYWRkZF91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxYWRkZF91NjQKICAgcmV0dXJuIHZxYWRkZF91NjQoYSwgYik7CiAvLyBDSEVDSzogdXFhZGQge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiBpbnQ4X3QgdGVzdF92cXN1YmJfczgoaW50OF90IGEsIGludDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXN1YmJfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc3ViYl9zOAogICByZXR1cm4gdnFzdWJiX3M4KGEsIGIpOwotLy8gQ0hFQ0s6IHNxc3ViIHt7YlswLTldK319LCB7e2JbMC05XSt9fSwge3tiWzAtOV0rfX0KKy8vIENIRUNLOiBzcXN1YiB7e2JbMC05XSt8dlswLTldKy44Yn19LCB7e2JbMC05XSt8dlswLTldKy44Yn19LCB7e2JbMC05XSt8dlswLTldKy44Yn19CiB9CiAKIGludDE2X3QgdGVzdF92cXN1YmhfczE2KGludDE2X3QgYSwgaW50MTZfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXN1YmhfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1YmhfczE2CiAgIHJldHVybiB2cXN1YmhfczE2KGEsIGIpOwotLy8gQ0hFQ0s6IHNxc3ViIHt7aFswLTldK319LCB7e2hbMC05XSt9fSwge3toWzAtOV0rfX0KKy8vIENIRUNLOiBzcXN1YiB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e2hbMC05XSt8dlswLTldKy40aH19CiB9CiAKIGludDMyX3QgdGVzdF92cXN1YnNfczMyKGludDMyX3QgYSwgaW50MzJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zxc3Vic19zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzdWJzX3MzMgogICByZXR1cm4gdnFzdWJzX3MzMihhLCBiKTsKIC8vIENIRUNLOiBzcXN1YiB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7c1swLTldK319CiB9CiAKIGludDY0X3QgdGVzdF92cXN1YmRfczY0KGludDY0X3QgYSwgaW50NjRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXN1YmRfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1YmRfczY0CiAgIHJldHVybiB2cXN1YmRfczY0KGEsIGIpOwogLy8gQ0hFQ0s6IHNxc3ViIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDhfdCB0ZXN0X3Zxc3ViYl91OCh1aW50OF90IGEsIHVpbnQ4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJiX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1YmJfdTgKICAgcmV0dXJuIHZxc3ViYl91OChhLCBiKTsKLS8vIENIRUNLOiB1cXN1YiB7e2JbMC05XSt9fSwge3tiWzAtOV0rfX0sIHt7YlswLTldK319CisvLyBDSEVDSzogdXFzdWIge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fQogfQogCiB1aW50MTZfdCB0ZXN0X3Zxc3ViaF91MTYodWludDE2X3QgYSwgdWludDE2X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJoX3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzdWJoX3UxNgogICByZXR1cm4gdnFzdWJoX3UxNihhLCBiKTsKLS8vIENIRUNLOiB1cXN1YiB7e2hbMC05XSt9fSwge3toWzAtOV0rfX0sIHt7aFswLTldK319CisvLyBDSEVDSzogdXFzdWIge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fQogfQogCiB1aW50MzJfdCB0ZXN0X3Zxc3Vic191MzIodWludDMyX3QgYSwgdWludDMyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFzdWJzX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzdWJzX3UzMgogICByZXR1cm4gdnFzdWJzX3UzMihhLCBiKTsKIC8vIENIRUNLOiB1cXN1YiB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7c1swLTldK319CiB9CiAKIHVpbnQ2NF90IHRlc3RfdnFzdWJkX3U2NCh1aW50NjRfdCBhLCB1aW50NjRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cXN1YmRfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXN1YmRfdTY0CiAgIHJldHVybiB2cXN1YmRfdTY0KGEsIGIpOwogLy8gQ0hFQ0s6IHVxc3ViIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogaW50NjRfdCB0ZXN0X3ZzaGxkX3M2NChpbnQ2NF90IGEsIGludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnNobGRfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsZF9zNjQKICAgcmV0dXJuIHZzaGxkX3M2NChhLCBiKTsKIC8vIENIRUNLOiBzc2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAogdWludDY0X3QgdGVzdF92c2hsZF91NjQodWludDY0X3QgYSwgdWludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnNobGRfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsZF91NjQKICAgcmV0dXJuIHZzaGxkX3U2NChhLCBiKTsKIC8vIENIRUNLOiB1c2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnFzaGxiX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobGJfczgKIGludDhfdCB0ZXN0X3Zxc2hsYl9zOChpbnQ4X3QgYSwgaW50OF90IGIpIHsKICAgcmV0dXJuIHZxc2hsYl9zOChhLCBiKTsKLS8vIENIRUNLOiBzcXNobCB7e2JbMC05XSt9fSwge3tiWzAtOV0rfX0sIHt7YlswLTldK319CisvLyBDSEVDSzogc3FzaGwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fQogfQogCi0vLyBDSEVDSzogdGVzdF92cXNobGhfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobGhfczE2CiBpbnQxNl90IHRlc3RfdnFzaGxoX3MxNihpbnQxNl90IGEsIGludDE2X3QgYikgewogICByZXR1cm4gdnFzaGxoX3MxNihhLCBiKTsKLS8vIENIRUNLOiBzcXNobCB7e2hbMC05XSt9fSwge3toWzAtOV0rfX0sIHt7aFswLTldK319CisvLyBDSEVDSzogc3FzaGwge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fQogfQogCi0vLyBDSEVDSzogdGVzdF92cXNobHNfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobHNfczMyCiBpbnQzMl90IHRlc3RfdnFzaGxzX3MzMihpbnQzMl90IGEsIGludDMyX3QgYikgewogICByZXR1cm4gdnFzaGxzX3MzMihhLCBiKTsKIC8vIENIRUNLOiBzcXNobCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7c1swLTldK319CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3Zxc2hsZF9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsZF9zNjQKIGludDY0X3QgdGVzdF92cXNobGRfczY0KGludDY0X3QgYSwgaW50NjRfdCBiKSB7CiAgIHJldHVybiB2cXNobGRfczY0KGEsIGIpOwogLy8gQ0hFQ0s6IHNxc2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnFzaGxiX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobGJfdTgKIHVpbnQ4X3QgdGVzdF92cXNobGJfdTgodWludDhfdCBhLCB1aW50OF90IGIpIHsKICAgcmV0dXJuIHZxc2hsYl91OChhLCBiKTsKLS8vIENIRUNLOiB1cXNobCB7e2JbMC05XSt9fSwge3tiWzAtOV0rfX0sIHt7YlswLTldK319CisvLyBDSEVDSzogdXFzaGwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fQogfQogCi0vLyBDSEVDSzogdGVzdF92cXNobGhfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobGhfdTE2CiB1aW50MTZfdCB0ZXN0X3Zxc2hsaF91MTYodWludDE2X3QgYSwgdWludDE2X3QgYikgewogICByZXR1cm4gdnFzaGxoX3UxNihhLCBiKTsKLS8vIENIRUNLOiB1cXNobCB7e2hbMC05XSt9fSwge3toWzAtOV0rfX0sIHt7aFswLTldK319CisvLyBDSEVDSzogdXFzaGwge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fQogfQogCi0vLyBDSEVDSzogdGVzdF92cXNobHNfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobHNfdTMyCiB1aW50MzJfdCB0ZXN0X3Zxc2hsc191MzIodWludDMyX3QgYSwgdWludDMyX3QgYikgewogICByZXR1cm4gdnFzaGxzX3UzMihhLCBiKTsKIC8vIENIRUNLOiB1cXNobCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7c1swLTldK319CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3Zxc2hsZF91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsZF91NjQKIHVpbnQ2NF90IHRlc3RfdnFzaGxkX3U2NCh1aW50NjRfdCBhLCB1aW50NjRfdCBiKSB7CiAgIHJldHVybiB2cXNobGRfdTY0KGEsIGIpOwogLy8gQ0hFQ0s6IHVxc2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJzaGxkX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzaGxkX3M2NAogaW50NjRfdCB0ZXN0X3Zyc2hsZF9zNjQoaW50NjRfdCBhLCBpbnQ2NF90IGIpIHsKICAgcmV0dXJuIHZyc2hsZF9zNjQoYSwgYik7CiAvLyBDSEVDSzogc3JzaGwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiAKLS8vIENIRUNLOiB0ZXN0X3Zyc2hsZF91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc2hsZF91NjQKIHVpbnQ2NF90IHRlc3RfdnJzaGxkX3U2NCh1aW50NjRfdCBhLCB1aW50NjRfdCBiKSB7CiAgIHJldHVybiB2cnNobGRfdTY0KGEsIGIpOwogLy8gQ0hFQ0s6IHVyc2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnFyc2hsYl9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyc2hsYl9zOAogaW50OF90IHRlc3RfdnFyc2hsYl9zOChpbnQ4X3QgYSwgaW50OF90IGIpIHsKICAgcmV0dXJuIHZxcnNobGJfczgoYSwgYik7Ci0vLyBDSEVDSzogc3Fyc2hsIHt7YlswLTldK319LCB7e2JbMC05XSt9fSwge3tiWzAtOV0rfX0KKy8vIENIRUNLOiBzcXJzaGwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fQogfQogCi0vLyBDSEVDSzogdGVzdF92cXJzaGxoX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyc2hsaF9zMTYKIGludDE2X3QgdGVzdF92cXJzaGxoX3MxNihpbnQxNl90IGEsIGludDE2X3QgYikgewogICByZXR1cm4gdnFyc2hsaF9zMTYoYSwgYik7Ci0vLyBDSEVDSzogc3Fyc2hsIHt7aFswLTldK319LCB7e2hbMC05XSt9fSwge3toWzAtOV0rfX0KKy8vIENIRUNLOiBzcXJzaGwge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fQogfQogCi0vLyBDSEVDSzogdGVzdF92cXJzaGxzX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyc2hsc19zMzIKIGludDMyX3QgdGVzdF92cXJzaGxzX3MzMihpbnQzMl90IGEsIGludDMyX3QgYikgewogICByZXR1cm4gdnFyc2hsc19zMzIoYSwgYik7CiAvLyBDSEVDSzogc3Fyc2hsIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnFyc2hsZF9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNobGRfczY0CiBpbnQ2NF90IHRlc3RfdnFyc2hsZF9zNjQoaW50NjRfdCBhLCBpbnQ2NF90IGIpIHsKICAgcmV0dXJuIHZxcnNobGRfczY0KGEsIGIpOwogLy8gQ0hFQ0s6IHNxcnNobCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobGJfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNobGJfdTgKIHVpbnQ4X3QgdGVzdF92cXJzaGxiX3U4KHVpbnQ4X3QgYSwgdWludDhfdCBiKSB7CiAgIHJldHVybiB2cXJzaGxiX3U4KGEsIGIpOwotLy8gQ0hFQ0s6IHVxcnNobCB7e2JbMC05XSt9fSwge3tiWzAtOV0rfX0sIHt7YlswLTldK319CisvLyBDSEVDSzogdXFyc2hsIHt7YlswLTldK3x2WzAtOV0rLjhifX0sIHt7YlswLTldK3x2WzAtOV0rLjhifX0sIHt7YlswLTldK3x2WzAtOV0rLjhifX0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnFyc2hsaF91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNobGhfdTE2CiB1aW50MTZfdCB0ZXN0X3ZxcnNobGhfdTE2KHVpbnQxNl90IGEsIHVpbnQxNl90IGIpIHsKICAgcmV0dXJuIHZxcnNobGhfdTE2KGEsIGIpOwotLy8gQ0hFQ0s6IHVxcnNobCB7e2hbMC05XSt9fSwge3toWzAtOV0rfX0sIHt7aFswLTldK319CisvLyBDSEVDSzogdXFyc2hsIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnFyc2hsc191MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNobHNfdTMyCiB1aW50MzJfdCB0ZXN0X3ZxcnNobHNfdTMyKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpIHsKICAgcmV0dXJuIHZxcnNobHNfdTMyKGEsIGIpOwogLy8gQ0hFQ0s6IHVxcnNobCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7c1swLTldK319CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZxcnNobGRfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaGxkX3U2NAogdWludDY0X3QgdGVzdF92cXJzaGxkX3U2NCh1aW50NjRfdCBhLCB1aW50NjRfdCBiKSB7CiAgIHJldHVybiB2cXJzaGxkX3U2NChhLCBiKTsKIC8vIENIRUNLOiB1cXJzaGwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCi0vLyBDSEVDSzogdGVzdF92cGFkZGRfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkZGRfczY0CiBpbnQ2NF90IHRlc3RfdnBhZGRkX3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnBhZGRkX3M2NChhKTsKIC8vIENIRUNLOiBhZGRwIHt7ZFswLTldK319LCB7e3ZbMC05XSt9fS4yZAogfQogCi0vLyBDSEVDSzogdGVzdF92cGFkZHNfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkZHNfZjMyCiBmbG9hdDMyX3QgdGVzdF92cGFkZHNfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZwYWRkc19mMzIoYSk7CiAvLyBDSEVDSzogZmFkZHAge3tzWzAtOV0rfX0sIHt7dlswLTldK319LjJzCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZwYWRkZF9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkZF9mNjQKIGZsb2F0NjRfdCB0ZXN0X3ZwYWRkZF9mNjQoZmxvYXQ2NHgyX3QgYSkgewogICByZXR1cm4gdnBhZGRkX2Y2NChhKTsKIC8vIENIRUNLOiBmYWRkcCB7e2RbMC05XSt9fSwge3t2WzAtOV0rfX0uMmQKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnBtYXhubXNfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1heG5tc19mMzIKIGZsb2F0MzJfdCB0ZXN0X3ZwbWF4bm1zX2YzMihmbG9hdDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cG1heG5tc19mMzIoYSk7CiAvLyBDSEVDSzogZm1heG5tcCB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uMnMKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnBtYXhubXFkX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtYXhubXFkX2Y2NAogZmxvYXQ2NF90IHRlc3RfdnBtYXhubXFkX2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cG1heG5tcWRfZjY0KGEpOwogLy8gQ0hFQ0s6IGZtYXhubXAge3tkWzAtOV0rfX0sIHt7dlswLTldK319LjJkCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZwbWF4c19mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWF4c19mMzIKIGZsb2F0MzJfdCB0ZXN0X3ZwbWF4c19mMzIoZmxvYXQzMngyX3QgYSkgewogICByZXR1cm4gdnBtYXhzX2YzMihhKTsKIC8vIENIRUNLOiBmbWF4cCB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uMnMKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnBtYXhxZF9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWF4cWRfZjY0CiBmbG9hdDY0X3QgdGVzdF92cG1heHFkX2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cG1heHFkX2Y2NChhKTsKIC8vIENIRUNLOiBmbWF4cCB7e2RbMC05XSt9fSwge3t2WzAtOV0rfX0uMmQKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnBtaW5ubXNfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cG1pbm5tc19mMzIKIGZsb2F0MzJfdCB0ZXN0X3ZwbWlubm1zX2YzMihmbG9hdDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cG1pbm5tc19mMzIoYSk7CiAvLyBDSEVDSzogZm1pbm5tcCB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uMnMKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnBtaW5ubXFkX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBtaW5ubXFkX2Y2NAogZmxvYXQ2NF90IHRlc3RfdnBtaW5ubXFkX2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cG1pbm5tcWRfZjY0KGEpOwogLy8gQ0hFQ0s6IGZtaW5ubXAge3tkWzAtOV0rfX0sIHt7dlswLTldK319LjJkCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZwbWluc19mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWluc19mMzIKIGZsb2F0MzJfdCB0ZXN0X3ZwbWluc19mMzIoZmxvYXQzMngyX3QgYSkgewogICByZXR1cm4gdnBtaW5zX2YzMihhKTsKIC8vIENIRUNLOiBmbWlucCB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uMnMKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnBtaW5xZF9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwbWlucWRfZjY0CiBmbG9hdDY0X3QgdGVzdF92cG1pbnFkX2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cG1pbnFkX2Y2NChhKTsKIC8vIENIRUNLOiBmbWlucCB7e2RbMC05XSt9fSwge3t2WzAtOV0rfX0uMmQKIH0KIAogaW50MTZfdCB0ZXN0X3ZxZG11bGhoX3MxNihpbnQxNl90IGEsIGludDE2X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsaGhfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxoaF9zMTYKICAgcmV0dXJuIHZxZG11bGhoX3MxNihhLCBiKTsKLS8vIENIRUNLOiBzcWRtdWxoIHt7aFswLTldK319LCB7e2hbMC05XSt9fSwge3toWzAtOV0rfX0KKy8vIENIRUNLOiBzcWRtdWxoIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0KIH0KIAogaW50MzJfdCB0ZXN0X3ZxZG11bGhzX3MzMihpbnQzMl90IGEsIGludDMyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsaHNfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxoc19zMzIKICAgcmV0dXJuIHZxZG11bGhzX3MzMihhLCBiKTsKIC8vIENIRUNLOiBzcWRtdWxoIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KIH0KIAogaW50MTZfdCB0ZXN0X3ZxcmRtdWxoaF9zMTYoaW50MTZfdCBhLCBpbnQxNl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcmRtdWxoaF9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcmRtdWxoaF9zMTYKICAgcmV0dXJuIHZxcmRtdWxoaF9zMTYoYSwgYik7Ci0vLyBDSEVDSzogc3FyZG11bGgge3toWzAtOV0rfX0sIHt7aFswLTldK319LCB7e2hbMC05XSt9fQorLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0KIH0KIAogaW50MzJfdCB0ZXN0X3ZxcmRtdWxoc19zMzIoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxcmRtdWxoc19zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcmRtdWxoc19zMzIKICAgcmV0dXJuIHZxcmRtdWxoc19zMzIoYSwgYik7CiAvLyBDSEVDSzogc3FyZG11bGgge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3NbMC05XSt9fQogfQogCiBmbG9hdDMyX3QgdGVzdF92bXVseHNfZjMyKGZsb2F0MzJfdCBhLCBmbG9hdDMyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm11bHhzX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHhzX2YzMgogICByZXR1cm4gdm11bHhzX2YzMihhLCBiKTsKIC8vIENIRUNLOiBmbXVseCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7c1swLTldK319CiB9CiAKIGZsb2F0NjRfdCB0ZXN0X3ZtdWx4ZF9mNjQoZmxvYXQ2NF90IGEsIGZsb2F0NjRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92bXVseGRfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseGRfZjY0CiAgIHJldHVybiB2bXVseGRfZjY0KGEsIGIpOwogLy8gQ0hFQ0s6IGZtdWx4IHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAorZmxvYXQ2NHgxX3QgdGVzdF92bXVseF9mNjQoZmxvYXQ2NHgxX3QgYSwgZmxvYXQ2NHgxX3QgYikgeworLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHhfZjY0CisgIHJldHVybiB2bXVseF9mNjQoYSwgYik7CisvLyBDSEVDSzogZm11bHgge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQorCiBmbG9hdDMyX3QgdGVzdF92cmVjcHNzX2YzMihmbG9hdDMyX3QgYSwgZmxvYXQzMl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZyZWNwc3NfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVjcHNzX2YzMgogICByZXR1cm4gdnJlY3Bzc19mMzIoYSwgYik7CiAvLyBDSEVDSzogZnJlY3BzIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KIH0KIAogZmxvYXQ2NF90IHRlc3RfdnJlY3BzZF9mNjQoZmxvYXQ2NF90IGEsIGZsb2F0NjRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92cmVjcHNkX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlY3BzZF9mNjQKICAgcmV0dXJuIHZyZWNwc2RfZjY0KGEsIGIpOwogLy8gQ0hFQ0s6IGZyZWNwcyB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIGZsb2F0MzJfdCB0ZXN0X3Zyc3FydHNzX2YzMihmbG9hdDMyX3QgYSwgZmxvYXQzMl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zyc3FydHNzX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzcXJ0c3NfZjMyCiAgIHJldHVybiB2cnNxcnRzc19mMzIoYSwgYik7CiAvLyBDSEVDSzogZnJzcXJ0cyB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7c1swLTldK319CiB9CiAKIGZsb2F0NjRfdCB0ZXN0X3Zyc3FydHNkX2Y2NChmbG9hdDY0X3QgYSwgZmxvYXQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Zyc3FydHNkX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzcXJ0c2RfZjY0CiAgIHJldHVybiB2cnNxcnRzZF9mNjQoYSwgYik7CiAvLyBDSEVDSzogZnJzcXJ0cyB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIGZsb2F0MzJfdCB0ZXN0X3ZjdnRzX2YzMl9zMzIoaW50MzJfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92Y3Z0c19mMzJfczMyCi0vLyBDSEVDSzogc2N2dGYge3tzWzAtOV0rfX0sIHt7c1swLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0c19mMzJfczMyCisvLyBDSEVDSzogc2N2dGYge3tzWzAtOV0rfX0sIHt7W3dzXVswLTldK319CiAgIHJldHVybiB2Y3Z0c19mMzJfczMyKGEpOwogfQogCiBmbG9hdDY0X3QgdGVzdF92Y3Z0ZF9mNjRfczY0KGludDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dGRfZjY0X3M2NAotLy8gQ0hFQ0s6IHNjdnRmIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dGRfZjY0X3M2NAorLy8gQ0hFQ0s6IHNjdnRmIHt7ZFswLTldK319LCB7e1tkeF1bMC05XSt9fQogICByZXR1cm4gdmN2dGRfZjY0X3M2NChhKTsKIH0KIAogZmxvYXQzMl90IHRlc3RfdmN2dHNfZjMyX3UzMih1aW50MzJfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92Y3Z0c19mMzJfdTMyCi0vLyBDSEVDSzogdWN2dGYge3tzWzAtOV0rfX0sIHt7c1swLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0c19mMzJfdTMyCisvLyBDSEVDSzogdWN2dGYge3tzWzAtOV0rfX0sIHt7W3dzXVswLTldK319CiAgIHJldHVybiB2Y3Z0c19mMzJfdTMyKGEpOwogfQogCiBmbG9hdDY0X3QgdGVzdF92Y3Z0ZF9mNjRfdTY0KHVpbnQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjdnRkX2Y2NF91NjQKLS8vIENIRUNLOiB1Y3Z0ZiB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRkX2Y2NF91NjQKKy8vIENIRUNLOiB1Y3Z0ZiB7e2RbMC05XSt9fSwge3tbeGRdWzAtOV0rfX0KICAgcmV0dXJuIHZjdnRkX2Y2NF91NjQoYSk7CiB9CiAKIGZsb2F0MzJfdCB0ZXN0X3ZyZWNwZXNfZjMyKGZsb2F0MzJfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92cmVjcGVzX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlY3Blc19mMzIKIC8vIENIRUNLOiBmcmVjcGUge3tzWzAtOV0rfX0sIHt7c1swLTldK319CiAgIHJldHVybiB2cmVjcGVzX2YzMihhKTsKIH0KICAKIGZsb2F0NjRfdCB0ZXN0X3ZyZWNwZWRfZjY0KGZsb2F0NjRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92cmVjcGVkX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlY3BlZF9mNjQKIC8vIENIRUNLOiBmcmVjcGUge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiAgIHJldHVybiB2cmVjcGVkX2Y2NChhKTsKIH0KICAKIGZsb2F0MzJfdCB0ZXN0X3ZyZWNweHNfZjMyKGZsb2F0MzJfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92cmVjcHhzX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlY3B4c19mMzIKIC8vIENIRUNLOiBmcmVjcHgge3tzWzAtOV0rfX0sIHt7c1swLTldK319CiAgIHJldHVybiB2cmVjcHhzX2YzMihhKTsKICB9CiAgCiBmbG9hdDY0X3QgdGVzdF92cmVjcHhkX2Y2NChmbG9hdDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnJlY3B4ZF9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWNweGRfZjY0CiAvLyBDSEVDSzogZnJlY3B4IHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogICByZXR1cm4gdnJlY3B4ZF9mNjQoYSk7CiB9CiAKK3VpbnQzMngyX3QgdGVzdF92cnNxcnRlX3UzMih1aW50MzJ4Ml90IGEpIHsKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3FydGVfdTMyCisvLyBDSEVDSzogdXJzcXJ0ZSB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKKyAgcmV0dXJuIHZyc3FydGVfdTMyKGEpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnJzcXJ0ZXFfdTMyKHVpbnQzMng0X3QgYSkgeworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJzcXJ0ZXFfdTMyCisvLyBDSEVDSzogdXJzcXJ0ZSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKKyAgcmV0dXJuIHZyc3FydGVxX3UzMihhKTsKK30KKwogZmxvYXQzMl90IHRlc3RfdnJzcXJ0ZXNfZjMyKGZsb2F0MzJfdCBhKSB7CiAvLyBDSEVDSzogdnJzcXJ0ZXNfZjMyCiAvLyBDSEVDSzogZnJzcXJ0ZSB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KQEAgLTU3NzksMjk1NCArNTgyMiwyNzQ2IEBACiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92bGQxcV91OCh1aW50OF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDFxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3U4CiAgIHJldHVybiB2bGQxcV91OChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDEge3ZbMC05XSsuMTZifXxsZHIgcVswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92bGQxcV91MTYodWludDE2X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMXFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3UxNgogICByZXR1cm4gdmxkMXFfdTE2KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjhofXxsZHIgcVswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92bGQxcV91MzIodWludDMyX3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMXFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3UzMgogICByZXR1cm4gdmxkMXFfdTMyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjRzfXxsZHIgcVswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92bGQxcV91NjQodWludDY0X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMXFfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3U2NAogICByZXR1cm4gdmxkMXFfdTY0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjJkfXxsZHIgcVswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZsZDFxX3M4KGludDhfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQxcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9zOAogICByZXR1cm4gdmxkMXFfczgoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjE2Yn18bGRyIHFbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQxNng4X3QgdGVzdF92bGQxcV9zMTYoaW50MTZfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQxcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfczE2CiAgIHJldHVybiB2bGQxcV9zMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDEge3ZbMC05XSsuOGh9fGxkciBxWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MzJ4NF90IHRlc3RfdmxkMXFfczMyKGludDMyX3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3MzMgogICByZXR1cm4gdmxkMXFfczMyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjRzfXxsZHIgcVswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZsZDFxX3M2NChpbnQ2NF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDFxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9zNjQKICAgcmV0dXJuIHZsZDFxX3M2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMSB7dlswLTldKy4yZH18bGRyIHFbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBmbG9hdDE2eDhfdCB0ZXN0X3ZsZDFxX2YxNihmbG9hdDE2X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMXFfZjE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2YxNgogICByZXR1cm4gdmxkMXFfZjE2KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjhofXxsZHIgcVswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdmxkMXFfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQxcV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZjMyCiAgIHJldHVybiB2bGQxcV9mMzIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDEge3ZbMC05XSsuNHN9fGxkciBxWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92bGQxcV9mNjQoZmxvYXQ2NF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDFxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9mNjQKICAgcmV0dXJuIHZsZDFxX2Y2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMSB7dlswLTldKy4yZH18bGRyIHFbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5OHgxNl90IHRlc3RfdmxkMXFfcDgocG9seThfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQxcV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9wOAogICByZXR1cm4gdmxkMXFfcDgoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjE2Yn18bGRyIHFbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5MTZ4OF90IHRlc3RfdmxkMXFfcDE2KHBvbHkxNl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDFxX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9wMTYKICAgcmV0dXJuIHZsZDFxX3AxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMSB7dlswLTldKy44aH18bGRyIHFbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50OHg4X3QgdGVzdF92bGQxX3U4KHVpbnQ4X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3U4CiAgIHJldHVybiB2bGQxX3U4KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjhifXxsZHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92bGQxX3UxNih1aW50MTZfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3UxNgogICByZXR1cm4gdmxkMV91MTYoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDEge3ZbMC05XSsuNGh9fGxkciBkWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZsZDFfdTMyKHVpbnQzMl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfdTMyCiAgIHJldHVybiB2bGQxX3UzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMnN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMSB7dlswLTldKy4yc318bGRyIGRbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50NjR4MV90IHRlc3RfdmxkMV91NjQodWludDY0X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV91NjQKICAgcmV0dXJuIHZsZDFfdTY0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjFkfXxsZHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDh4OF90IHRlc3RfdmxkMV9zOChpbnQ4X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3M4CiAgIHJldHVybiB2bGQxX3M4KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjhifXxsZHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZsZDFfczE2KGludDE2X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9zMTYKICAgcmV0dXJuIHZsZDFfczE2KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjRofXxsZHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZsZDFfczMyKGludDMyX3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9zMzIKICAgcmV0dXJuIHZsZDFfczMyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjJzfXxsZHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDY0eDFfdCB0ZXN0X3ZsZDFfczY0KGludDY0X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMV9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9zNjQKICAgcmV0dXJuIHZsZDFfczY0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjFkfXxsZHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0MTZ4NF90IHRlc3RfdmxkMV9mMTYoZmxvYXQxNl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDFfZjE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfZjE2CiAgIHJldHVybiB2bGQxX2YxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMSB7dlswLTldKy40aH18bGRyIGRbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZsZDFfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2YzMgogICByZXR1cm4gdmxkMV9mMzIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDEge3ZbMC05XSsuMnN9fGxkciBkWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQ2NHgxX3QgdGVzdF92bGQxX2Y2NChmbG9hdDY0X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9mNjQKICAgcmV0dXJuIHZsZDFfZjY0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxIHt2WzAtOV0rLjFkfXxsZHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk4eDhfdCB0ZXN0X3ZsZDFfcDgocG9seThfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfcDgKICAgcmV0dXJuIHZsZDFfcDgoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjhifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDEge3ZbMC05XSsuOGJ9fGxkciBkWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTE2eDRfdCB0ZXN0X3ZsZDFfcDE2KHBvbHkxNl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDFfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfcDE2CiAgIHJldHVybiB2bGQxX3AxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMSB7dlswLTldKy40aH18bGRyIGRbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50OHgxNngyX3QgdGVzdF92bGQycV91OCh1aW50OF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDJxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX3U4CiAgIHJldHVybiB2bGQycV91OChhKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50MTZ4OHgyX3QgdGVzdF92bGQycV91MTYodWludDE2X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMnFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX3UxNgogICByZXR1cm4gdmxkMnFfdTE2KGEpOwotICAvLyBDSEVDSzogbGQyIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDMyeDR4Ml90IHRlc3RfdmxkMnFfdTMyKHVpbnQzMl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDJxX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV91MzIKICAgcmV0dXJuIHZsZDJxX3UzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyA/dlswLTldKy40cywgdlswLTldKy40cyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQ2NHgyeDJfdCB0ZXN0X3ZsZDJxX3U2NCh1aW50NjRfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQycV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMnFfdTY0CiAgIHJldHVybiB2bGQycV91NjQoYSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMiB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQ4eDE2eDJfdCB0ZXN0X3ZsZDJxX3M4KGludDhfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQycV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9zOAogICByZXR1cm4gdmxkMnFfczgoYSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MTZ4OHgyX3QgdGVzdF92bGQycV9zMTYoaW50MTZfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQycV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMnFfczE2CiAgIHJldHVybiB2bGQycV9zMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMiB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQzMng0eDJfdCB0ZXN0X3ZsZDJxX3MzMihpbnQzMl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDJxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9zMzIKICAgcmV0dXJuIHZsZDJxX3MzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyA/dlswLTldKy40cywgdlswLTldKy40cyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDY0eDJ4Ml90IHRlc3RfdmxkMnFfczY0KGludDY0X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMnFfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX3M2NAogICByZXR1cm4gdmxkMnFfczY0KGEpOwotICAvLyBDSEVDSzogbGQyIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQxNng4eDJfdCB0ZXN0X3ZsZDJxX2YxNihmbG9hdDE2X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMnFfZjE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX2YxNgogICByZXR1cm4gdmxkMnFfZjE2KGEpOwotICAvLyBDSEVDSzogbGQyIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQzMng0eDJfdCB0ZXN0X3ZsZDJxX2YzMihmbG9hdDMyX3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMnFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX2YzMgogICByZXR1cm4gdmxkMnFfZjMyKGEpOwotICAvLyBDSEVDSzogbGQyIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQ2NHgyeDJfdCB0ZXN0X3ZsZDJxX2Y2NChmbG9hdDY0X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMnFfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX2Y2NAogICByZXR1cm4gdmxkMnFfZjY0KGEpOwotICAvLyBDSEVDSzogbGQyIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTh4MTZ4Ml90IHRlc3RfdmxkMnFfcDgocG9seThfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQycV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9wOAogICByZXR1cm4gdmxkMnFfcDgoYSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTE2eDh4Ml90IHRlc3RfdmxkMnFfcDE2KHBvbHkxNl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDJxX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9wMTYKICAgcmV0dXJuIHZsZDJxX3AxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQ4eDh4Ml90IHRlc3RfdmxkMl91OCh1aW50OF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDJfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl91OAogICByZXR1cm4gdmxkMl91OChhKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQxNng0eDJfdCB0ZXN0X3ZsZDJfdTE2KHVpbnQxNl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDJfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfdTE2CiAgIHJldHVybiB2bGQyX3UxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQzMngyeDJfdCB0ZXN0X3ZsZDJfdTMyKHVpbnQzMl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDJfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfdTMyCiAgIHJldHVybiB2bGQyX3UzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyA/dlswLTldKy4ycywgdlswLTldKy4ycyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQ2NHgxeDJfdCB0ZXN0X3ZsZDJfdTY0KHVpbnQ2NF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDJfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfdTY0CiAgIHJldHVybiB2bGQyX3U2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDF8bGQyfX0ge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50OHg4eDJfdCB0ZXN0X3ZsZDJfczgoaW50OF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDJfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl9zOAogICByZXR1cm4gdmxkMl9zOChhKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDE2eDR4Ml90IHRlc3RfdmxkMl9zMTYoaW50MTZfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQyX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX3MxNgogICByZXR1cm4gdmxkMl9zMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMiB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQzMngyeDJfdCB0ZXN0X3ZsZDJfczMyKGludDMyX3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl9zMzIKICAgcmV0dXJuIHZsZDJfczMyKGEpOwotICAvLyBDSEVDSzogbGQyIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ID92WzAtOV0rLjJzLCB2WzAtOV0rLjJzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50NjR4MXgyX3QgdGVzdF92bGQyX3M2NChpbnQ2NF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDJfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfczY0CiAgIHJldHVybiB2bGQyX3M2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDF8bGQyfX0ge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQxNng0eDJfdCB0ZXN0X3ZsZDJfZjE2KGZsb2F0MTZfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQyX2YxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX2YxNgogICByZXR1cm4gdmxkMl9mMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMiB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBmbG9hdDMyeDJ4Ml90IHRlc3RfdmxkMl9mMzIoZmxvYXQzMl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDJfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfZjMyCiAgIHJldHVybiB2bGQyX2YzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyA/dlswLTldKy4ycywgdlswLTldKy4ycyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0NjR4MXgyX3QgdGVzdF92bGQyX2Y2NChmbG9hdDY0X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMl9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl9mNjQKICAgcmV0dXJuIHZsZDJfZjY0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMXxsZDJ9fSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5OHg4eDJfdCB0ZXN0X3ZsZDJfcDgocG9seThfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQyX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfcDgKICAgcmV0dXJuIHZsZDJfcDgoYSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMiB7e3sgP3ZbMC05XSsuOGIsIHZbMC05XSsuOGIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5MTZ4NHgyX3QgdGVzdF92bGQyX3AxNihwb2x5MTZfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQyX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX3AxNgogICByZXR1cm4gdmxkMl9wMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMiB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50OHgxNngzX3QgdGVzdF92bGQzcV91OCh1aW50OF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDNxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX3U4CiAgIHJldHVybiB2bGQzcV91OChhKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yn0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50MTZ4OHgzX3QgdGVzdF92bGQzcV91MTYodWludDE2X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkM3FfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX3UxNgogICByZXR1cm4gdmxkM3FfdTE2KGEpOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhofSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQzMng0eDNfdCB0ZXN0X3ZsZDNxX3UzMih1aW50MzJfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfdTMyCiAgIHJldHVybiB2bGQzcV91MzIoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDY0eDJ4M190IHRlc3RfdmxkM3FfdTY0KHVpbnQ2NF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDNxX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV91NjQKICAgcmV0dXJuIHZsZDNxX3U2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQ4eDE2eDNfdCB0ZXN0X3ZsZDNxX3M4KGludDhfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9zOAogICByZXR1cm4gdmxkM3FfczgoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmJ9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MTZ4OHgzX3QgdGVzdF92bGQzcV9zMTYoaW50MTZfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfczE2CiAgIHJldHVybiB2bGQzcV9zMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MzJ4NHgzX3QgdGVzdF92bGQzcV9zMzIoaW50MzJfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzcV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfczMyCiAgIHJldHVybiB2bGQzcV9zMzIoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50NjR4MngzX3QgdGVzdF92bGQzcV9zNjQoaW50NjRfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzcV9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfczY0CiAgIHJldHVybiB2bGQzcV9zNjQoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQxNng4eDNfdCB0ZXN0X3ZsZDNxX2YxNihmbG9hdDE2X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkM3FfZjE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2YxNgogICByZXR1cm4gdmxkM3FfZjE2KGEpOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhofSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0MzJ4NHgzX3QgdGVzdF92bGQzcV9mMzIoZmxvYXQzMl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDNxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9mMzIKICAgcmV0dXJuIHZsZDNxX2YzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40c30sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBmbG9hdDY0eDJ4M190IHRlc3RfdmxkM3FfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzcV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfZjY0CiAgIHJldHVybiB2bGQzcV9mNjQoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTh4MTZ4M190IHRlc3RfdmxkM3FfcDgocG9seThfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzcV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9wOAogICByZXR1cm4gdmxkM3FfcDgoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmJ9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTE2eDh4M190IHRlc3RfdmxkM3FfcDE2KHBvbHkxNl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDNxX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9wMTYKICAgcmV0dXJuIHZsZDNxX3AxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50OHg4eDNfdCB0ZXN0X3ZsZDNfdTgodWludDhfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNfdTgKICAgcmV0dXJuIHZsZDNfdTgoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGJ9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDE2eDR4M190IHRlc3RfdmxkM191MTYodWludDE2X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkM191MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM191MTYKICAgcmV0dXJuIHZsZDNfdTE2KGEpOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQzMngyeDNfdCB0ZXN0X3ZsZDNfdTMyKHVpbnQzMl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDNfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNfdTMyCiAgIHJldHVybiB2bGQzX3UzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50NjR4MXgzX3QgdGVzdF92bGQzX3U2NCh1aW50NjRfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX3U2NAogICByZXR1cm4gdmxkM191NjQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWR9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMXxsZDN9fSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQ4eDh4M190IHRlc3RfdmxkM19zOChpbnQ4X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkM19zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX3M4CiAgIHJldHVybiB2bGQzX3M4KGEpOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhifSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDE2eDR4M190IHRlc3RfdmxkM19zMTYoaW50MTZfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX3MxNgogICByZXR1cm4gdmxkM19zMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MzJ4MngzX3QgdGVzdF92bGQzX3MzMihpbnQzMl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDNfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNfczMyCiAgIHJldHVybiB2bGQzX3MzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQ2NHgxeDNfdCB0ZXN0X3ZsZDNfczY0KGludDY0X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkM19zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19zNjQKICAgcmV0dXJuIHZsZDNfczY0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDF8bGQzfX0ge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQxNng0eDNfdCB0ZXN0X3ZsZDNfZjE2KGZsb2F0MTZfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzX2YxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2YxNgogICByZXR1cm4gdmxkM19mMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQzMngyeDNfdCB0ZXN0X3ZsZDNfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2YzMgogICByZXR1cm4gdmxkM19mMzIoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnN9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjJzLCB2WzAtOV0rLjJzLCB2WzAtOV0rLjJzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQ2NHgxeDNfdCB0ZXN0X3ZsZDNfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2Y2NAogICByZXR1cm4gdmxkM19mNjQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWR9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMXxsZDN9fSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5OHg4eDNfdCB0ZXN0X3ZsZDNfcDgocG9seThfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQzX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNfcDgKICAgcmV0dXJuIHZsZDNfcDgoYSk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGJ9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTE2eDR4M190IHRlc3RfdmxkM19wMTYocG9seTE2X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkM19wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19wMTYKICAgcmV0dXJuIHZsZDNfcDE2KGEpOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQ4eDE2eDRfdCB0ZXN0X3ZsZDRxX3U4KHVpbnQ4X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkNHFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfdTgKICAgcmV0dXJuIHZsZDRxX3U4KGEpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLAotICAvLyB2e3tbMC05XSt9fS4xNmJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQxNng4eDRfdCB0ZXN0X3ZsZDRxX3UxNih1aW50MTZfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQ0cV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfdTE2CiAgIHJldHVybiB2bGQ0cV91MTYoYSk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQzMng0eDRfdCB0ZXN0X3ZsZDRxX3UzMih1aW50MzJfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQ0cV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfdTMyCiAgIHJldHVybiB2bGQ0cV91MzIoYSk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsCi0gIC8vIHZ7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyA/dlswLTldKy40cywgdlswLTldKy40cywgdlswLTldKy40cywgdlswLTldKy40cyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQ2NHgyeDRfdCB0ZXN0X3ZsZDRxX3U2NCh1aW50NjRfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQ0cV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfdTY0CiAgIHJldHVybiB2bGQ0cV91NjQoYSk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsCi0gIC8vIHZ7e1swLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyA/dlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTldKy4yZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDh4MTZ4NF90IHRlc3RfdmxkNHFfczgoaW50OF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX3M4CiAgIHJldHVybiB2bGQ0cV9zOChhKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YiwKLSAgLy8gdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQxNng4eDRfdCB0ZXN0X3ZsZDRxX3MxNihpbnQxNl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0cV9zMTYKICAgcmV0dXJuIHZsZDRxX3MxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwKLSAgLy8gdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MzJ4NHg0X3QgdGVzdF92bGQ0cV9zMzIoaW50MzJfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQ0cV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfczMyCiAgIHJldHVybiB2bGQ0cV9zMzIoYSk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsCi0gIC8vIHZ7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyA/dlswLTldKy40cywgdlswLTldKy40cywgdlswLTldKy40cywgdlswLTldKy40cyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDY0eDJ4NF90IHRlc3RfdmxkNHFfczY0KGludDY0X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkNHFfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX3M2NAogICByZXR1cm4gdmxkNHFfczY0KGEpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLAotICAvLyB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBmbG9hdDE2eDh4NF90IHRlc3RfdmxkNHFfZjE2KGZsb2F0MTZfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQ0cV9mMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfZjE2CiAgIHJldHVybiB2bGQ0cV9mMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0MzJ4NHg0X3QgdGVzdF92bGQ0cV9mMzIoZmxvYXQzMl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0cV9mMzIKICAgcmV0dXJuIHZsZDRxX2YzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywKLSAgLy8gdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQ2NHgyeDRfdCB0ZXN0X3ZsZDRxX2Y2NChmbG9hdDY0X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkNHFfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX2Y2NAogICByZXR1cm4gdmxkNHFfZjY0KGEpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLAotICAvLyB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5OHgxNng0X3QgdGVzdF92bGQ0cV9wOChwb2x5OF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX3A4CiAgIHJldHVybiB2bGQ0cV9wOChhKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YiwKLSAgLy8gdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5MTZ4OHg0X3QgdGVzdF92bGQ0cV9wMTYocG9seTE2X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkNHFfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX3AxNgogICByZXR1cm4gdmxkNHFfcDE2KGEpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLAotICAvLyB2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50OHg4eDRfdCB0ZXN0X3ZsZDRfdTgodWludDhfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQ0X3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfdTgKICAgcmV0dXJuIHZsZDRfdTgoYSk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsCi0gIC8vIHZ7e1swLTldK319LjhifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQxNng0eDRfdCB0ZXN0X3ZsZDRfdTE2KHVpbnQxNl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfdTE2CiAgIHJldHVybiB2bGQ0X3UxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwKLSAgLy8gdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDMyeDJ4NF90IHRlc3RfdmxkNF91MzIodWludDMyX3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkNF91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF91MzIKICAgcmV0dXJuIHZsZDRfdTMyKGEpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLAotICAvLyB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50NjR4MXg0X3QgdGVzdF92bGQ0X3U2NCh1aW50NjRfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQ0X3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X3U2NAogICByZXR1cm4gdmxkNF91NjQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsCi0gIC8vIHZ7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDF8bGQ0fX0ge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50OHg4eDRfdCB0ZXN0X3ZsZDRfczgoaW50OF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9zOAogICByZXR1cm4gdmxkNF9zOChhKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YiwKLSAgLy8gdnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MTZ4NHg0X3QgdGVzdF92bGQ0X3MxNihpbnQxNl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfczE2CiAgIHJldHVybiB2bGQ0X3MxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwKLSAgLy8gdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MzJ4Mng0X3QgdGVzdF92bGQ0X3MzMihpbnQzMl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfczMyCiAgIHJldHVybiB2bGQ0X3MzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywKLSAgLy8gdnt7WzAtOV0rfX0uMnN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ID92WzAtOV0rLjJzLCB2WzAtOV0rLjJzLCB2WzAtOV0rLjJzLCB2WzAtOV0rLjJzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50NjR4MXg0X3QgdGVzdF92bGQ0X3M2NChpbnQ2NF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfczY0CiAgIHJldHVybiB2bGQ0X3M2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwKLSAgLy8gdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMXxsZDR9fSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBmbG9hdDE2eDR4NF90IHRlc3RfdmxkNF9mMTYoZmxvYXQxNl90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRfZjE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfZjE2CiAgIHJldHVybiB2bGQ0X2YxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwKLSAgLy8gdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQzMngyeDRfdCB0ZXN0X3ZsZDRfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSkgewotICAvLyBDSEVDSzogdGVzdF92bGQ0X2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2YzMgogICByZXR1cm4gdmxkNF9mMzIoYSk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsCi0gIC8vIHZ7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyA/dlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0NjR4MXg0X3QgdGVzdF92bGQ0X2Y2NChmbG9hdDY0X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkNF9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9mNjQKICAgcmV0dXJuIHZsZDRfZjY0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLAotICAvLyB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxfGxkNH19IHt7eyA/dlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk4eDh4NF90IHRlc3RfdmxkNF9wOChwb2x5OF90IGNvbnN0ICphKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9wOAogICByZXR1cm4gdmxkNF9wOChhKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YiwKLSAgLy8gdnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTE2eDR4NF90IHRlc3RfdmxkNF9wMTYocG9seTE2X3QgY29uc3QgKmEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkNF9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9wMTYKICAgcmV0dXJuIHZsZDRfcDE2KGEpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLAotICAvLyB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfdTgodWludDhfdCAqYSwgdWludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3U4CiAgIHZzdDFxX3U4KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4xNmJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy4xNmJ9fHN0ciBxWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3UxNih1aW50MTZfdCAqYSwgdWludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV91MTYKICAgdnN0MXFfdTE2KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxIHt2WzAtOV0rLjhofXxzdHIgcVswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxcV91MzIodWludDMyX3QgKmEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfdTMyCiAgIHZzdDFxX3UzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy40c318c3RyIHFbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfdTY0KHVpbnQ2NF90ICphLCB1aW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3U2NAogICB2c3QxcV91NjQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tzdDEge3ZbMC05XSsuMmR9fHN0ciBxWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3M4KGludDhfdCAqYSwgaW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfczgKICAgdnN0MXFfczgoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxIHt2WzAtOV0rLjE2Yn18c3RyIHFbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfczE2KGludDE2X3QgKmEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9zMTYKICAgdnN0MXFfczE2KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxIHt2WzAtOV0rLjhofXxzdHIgcVswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxcV9zMzIoaW50MzJfdCAqYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3MzMgogICB2c3QxcV9zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tzdDEge3ZbMC05XSsuNHN9fHN0ciBxWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3M2NChpbnQ2NF90ICphLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfczY0CiAgIHZzdDFxX3M2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy4yZH18c3RyIHFbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfZjE2KGZsb2F0MTZfdCAqYSwgZmxvYXQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV9mMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfZjE2CiAgIHZzdDFxX2YxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy44aH18c3RyIHFbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfZjMyKGZsb2F0MzJfdCAqYSwgZmxvYXQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfZjMyCiAgIHZzdDFxX2YzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy40c318c3RyIHFbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfZjY0KGZsb2F0NjRfdCAqYSwgZmxvYXQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfZjY0CiAgIHZzdDFxX2Y2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy4yZH18c3RyIHFbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfcDgocG9seThfdCAqYSwgcG9seTh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3A4CiAgIHZzdDFxX3A4KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4xNmJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy4xNmJ9fHN0ciBxWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3AxNihwb2x5MTZfdCAqYSwgcG9seTE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9wMTYKICAgdnN0MXFfcDE2KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxIHt2WzAtOV0rLjhofXxzdHIgcVswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3U4KHVpbnQ4X3QgKmEsIHVpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV91OAogICB2c3QxX3U4KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxIHt2WzAtOV0rLjhifXxzdHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3UxNih1aW50MTZfdCAqYSwgdWludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfdTE2CiAgIHZzdDFfdTE2KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxIHt2WzAtOV0rLjRofXxzdHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3UzMih1aW50MzJfdCAqYSwgdWludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfdTMyCiAgIHZzdDFfdTMyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxIHt2WzAtOV0rLjJzfXxzdHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3U2NCh1aW50NjRfdCAqYSwgdWludDY0eDFfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfdTY0CiAgIHZzdDFfdTY0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxIHt2WzAtOV0rLjFkfXxzdHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3M4KGludDhfdCAqYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfczgKICAgdnN0MV9zOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy44Yn18c3RyIGRbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9zMTYoaW50MTZfdCAqYSwgaW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9zMTYKICAgdnN0MV9zMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tzdDEge3ZbMC05XSsuNGh9fHN0ciBkWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfczMyKGludDMyX3QgKmEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfczMyCiAgIHZzdDFfczMyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxIHt2WzAtOV0rLjJzfXxzdHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3M2NChpbnQ2NF90ICphLCBpbnQ2NHgxX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3M2NAogICB2c3QxX3M2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy4xZH18c3RyIGRbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9mMTYoZmxvYXQxNl90ICphLCBmbG9hdDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfZjE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfZjE2CiAgIHZzdDFfZjE2KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxIHt2WzAtOV0rLjRofXxzdHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX2YzMihmbG9hdDMyX3QgKmEsIGZsb2F0MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9mMzIKICAgdnN0MV9mMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tzdDEge3ZbMC05XSsuMnN9fHN0ciBkWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfZjY0KGZsb2F0NjRfdCAqYSwgZmxvYXQ2NHgxX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX2Y2NAogICB2c3QxX2Y2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy4xZH18c3RyIGRbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9wOChwb2x5OF90ICphLCBwb2x5OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfcDgKICAgdnN0MV9wOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy44Yn18c3RyIGRbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9wMTYocG9seTE2X3QgKmEsIHBvbHkxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3AxNgogICB2c3QxX3AxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy40aH18c3RyIGRbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MnFfdTgodWludDhfdCAqYSwgdWludDh4MTZ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MnFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfdTgKICAgdnN0MnFfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDJxX3UxNih1aW50MTZfdCAqYSwgdWludDE2eDh4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MnFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJxX3UxNgogICB2c3QycV91MTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MnFfdTMyKHVpbnQzMl90ICphLCB1aW50MzJ4NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QycV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfdTMyCiAgIHZzdDJxX3UzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyA/dlswLTldKy40cywgdlswLTldKy40cyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QycV91NjQodWludDY0X3QgKmEsIHVpbnQ2NHgyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDJxX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QycV91NjQKICAgdnN0MnFfdTY0KGEsIGIpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDJxX3M4KGludDhfdCAqYSwgaW50OHgxNngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QycV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QycV9zOAogICB2c3QycV9zOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MnFfczE2KGludDE2X3QgKmEsIGludDE2eDh4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MnFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJxX3MxNgogICB2c3QycV9zMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MnFfczMyKGludDMyX3QgKmEsIGludDMyeDR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MnFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJxX3MzMgogICB2c3QycV9zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MnFfczY0KGludDY0X3QgKmEsIGludDY0eDJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MnFfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJxX3M2NAogICB2c3QycV9zNjQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MnFfZjE2KGZsb2F0MTZfdCAqYSwgZmxvYXQxNng4eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDJxX2YxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QycV9mMTYKICAgdnN0MnFfZjE2KGEsIGIpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDJxX2YzMihmbG9hdDMyX3QgKmEsIGZsb2F0MzJ4NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QycV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfZjMyCiAgIHZzdDJxX2YzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyA/dlswLTldKy40cywgdlswLTldKy40cyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QycV9mNjQoZmxvYXQ2NF90ICphLCBmbG9hdDY0eDJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MnFfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJxX2Y2NAogICB2c3QycV9mNjQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MnFfcDgocG9seThfdCAqYSwgcG9seTh4MTZ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MnFfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfcDgKICAgdnN0MnFfcDgoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDJxX3AxNihwb2x5MTZfdCAqYSwgcG9seTE2eDh4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MnFfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJxX3AxNgogICB2c3QycV9wMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0Ml91OCh1aW50OF90ICphLCB1aW50OHg4eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDJfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0Ml91OAogICB2c3QyX3U4KGEsIGIpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDJfdTE2KHVpbnQxNl90ICphLCB1aW50MTZ4NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QyX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QyX3UxNgogICB2c3QyX3UxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QyX3UzMih1aW50MzJfdCAqYSwgdWludDMyeDJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0Ml91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0Ml91MzIKICAgdnN0Ml91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0Ml91NjQodWludDY0X3QgKmEsIHVpbnQ2NHgxeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDJfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJfdTY0CiAgIHZzdDJfdTY0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MXxzdDJ9fSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0Ml9zOChpbnQ4X3QgKmEsIGludDh4OHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QyX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJfczgKICAgdnN0Ml9zOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QyX3MxNihpbnQxNl90ICphLCBpbnQxNng0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDJfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJfczE2CiAgIHZzdDJfczE2KGEsIGIpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDJfczMyKGludDMyX3QgKmEsIGludDMyeDJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0Ml9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0Ml9zMzIKICAgdnN0Ml9zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0Ml9zNjQoaW50NjRfdCAqYSwgaW50NjR4MXgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QyX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QyX3M2NAogICB2c3QyX3M2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tzdDF8c3QyfX0ge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDJfZjE2KGZsb2F0MTZfdCAqYSwgZmxvYXQxNng0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDJfZjE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJfZjE2CiAgIHZzdDJfZjE2KGEsIGIpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDJfZjMyKGZsb2F0MzJfdCAqYSwgZmxvYXQzMngyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDJfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJfZjMyCiAgIHZzdDJfZjMyKGEsIGIpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ID92WzAtOV0rLjJzLCB2WzAtOV0rLjJzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDJfZjY0KGZsb2F0NjRfdCAqYSwgZmxvYXQ2NHgxeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDJfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJfZjY0CiAgIHZzdDJfZjY0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MXxzdDJ9fSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0Ml9wOChwb2x5OF90ICphLCBwb2x5OHg4eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDJfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0Ml9wOAogICB2c3QyX3A4KGEsIGIpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDJfcDE2KHBvbHkxNl90ICphLCBwb2x5MTZ4NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QyX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QyX3AxNgogICB2c3QyX3AxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QzcV91OCh1aW50OF90ICphLCB1aW50OHgxNngzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QzcV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzcV91OAogICB2c3QzcV91OChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yn0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0M3FfdTE2KHVpbnQxNl90ICphLCB1aW50MTZ4OHgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QzcV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M3FfdTE2CiAgIHZzdDNxX3UxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0M3FfdTMyKHVpbnQzMl90ICphLCB1aW50MzJ4NHgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QzcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M3FfdTMyCiAgIHZzdDNxX3UzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40c30sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0M3FfdTY0KHVpbnQ2NF90ICphLCB1aW50NjR4MngzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QzcV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M3FfdTY0CiAgIHZzdDNxX3U2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0M3FfczgoaW50OF90ICphLCBpbnQ4eDE2eDNfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDNxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNxX3M4CiAgIHZzdDNxX3M4KGEsIGIpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZifSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QzcV9zMTYoaW50MTZfdCAqYSwgaW50MTZ4OHgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QzcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M3FfczE2CiAgIHZzdDNxX3MxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0M3FfczMyKGludDMyX3QgKmEsIGludDMyeDR4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0M3FfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNxX3MzMgogICB2c3QzcV9zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDNxX3M2NChpbnQ2NF90ICphLCBpbnQ2NHgyeDNfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDNxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzcV9zNjQKICAgdnN0M3FfczY0KGEsIGIpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyA/dlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTldKy4yZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QzcV9mMTYoZmxvYXQxNl90ICphLCBmbG9hdDE2eDh4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0M3FfZjE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNxX2YxNgogICB2c3QzcV9mMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDNxX2YzMihmbG9hdDMyX3QgKmEsIGZsb2F0MzJ4NHgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QzcV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M3FfZjMyCiAgIHZzdDNxX2YzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40c30sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0M3FfZjY0KGZsb2F0NjRfdCAqYSwgZmxvYXQ2NHgyeDNfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDNxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzcV9mNjQKICAgdnN0M3FfZjY0KGEsIGIpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyA/dlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTldKy4yZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QzcV9wOChwb2x5OF90ICphLCBwb2x5OHgxNngzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QzcV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzcV9wOAogICB2c3QzcV9wOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yn0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0M3FfcDE2KHBvbHkxNl90ICphLCBwb2x5MTZ4OHgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QzcV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M3FfcDE2CiAgIHZzdDNxX3AxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0M191OCh1aW50OF90ICphLCB1aW50OHg4eDNfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDNfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M191OAogICB2c3QzX3U4KGEsIGIpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhifSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QzX3UxNih1aW50MTZfdCAqYSwgdWludDE2eDR4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0M191MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M191MTYKICAgdnN0M191MTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDNfdTMyKHVpbnQzMl90ICphLCB1aW50MzJ4MngzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QzX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzX3UzMgogICB2c3QzX3UzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0M191NjQodWludDY0X3QgKmEsIHVpbnQ2NHgxeDNfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDNfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNfdTY0CiAgIHZzdDNfdTY0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tzdDF8c3QzfX0ge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDNfczgoaW50OF90ICphLCBpbnQ4eDh4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0M19zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzX3M4CiAgIHZzdDNfczgoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGJ9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDNfczE2KGludDE2X3QgKmEsIGludDE2eDR4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0M19zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M19zMTYKICAgdnN0M19zMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDNfczMyKGludDMyX3QgKmEsIGludDMyeDJ4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0M19zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M19zMzIKICAgdnN0M19zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnN9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ID92WzAtOV0rLjJzLCB2WzAtOV0rLjJzLCB2WzAtOV0rLjJzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDNfczY0KGludDY0X3QgKmEsIGludDY0eDF4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0M19zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M19zNjQKICAgdnN0M19zNjQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWR9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MXxzdDN9fSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0M19mMTYoZmxvYXQxNl90ICphLCBmbG9hdDE2eDR4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0M19mMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M19mMTYKICAgdnN0M19mMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDNfZjMyKGZsb2F0MzJfdCAqYSwgZmxvYXQzMngyeDNfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDNfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNfZjMyCiAgIHZzdDNfZjMyKGEsIGIpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyA/dlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QzX2Y2NChmbG9hdDY0X3QgKmEsIGZsb2F0NjR4MXgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QzX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzX2Y2NAogICB2c3QzX2Y2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxfHN0M319IHt7eyA/dlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QzX3A4KHBvbHk4X3QgKmEsIHBvbHk4eDh4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0M19wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzX3A4CiAgIHZzdDNfcDgoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGJ9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDNfcDE2KHBvbHkxNl90ICphLCBwb2x5MTZ4NHgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QzX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzX3AxNgogICB2c3QzX3AxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0NHFfdTgodWludDhfdCAqYSwgdWludDh4MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NHFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NHFfdTgKICAgdnN0NHFfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsCi0gIC8vIHZ7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDRxX3UxNih1aW50MTZfdCAqYSwgdWludDE2eDh4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NHFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRxX3UxNgogICB2c3Q0cV91MTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3Q0cV91MzIodWludDMyX3QgKmEsIHVpbnQzMng0eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDRxX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV91MzIKICAgdnN0NHFfdTMyKGEsIGIpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLAotICAvLyB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0NHFfdTY0KHVpbnQ2NF90ICphLCB1aW50NjR4Mng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3Q0cV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NHFfdTY0CiAgIHZzdDRxX3U2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwKLSAgLy8gdnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDRxX3M4KGludDhfdCAqYSwgaW50OHgxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3Q0cV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV9zOAogICB2c3Q0cV9zOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YiwKLSAgLy8gdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0NHFfczE2KGludDE2X3QgKmEsIGludDE2eDh4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NHFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRxX3MxNgogICB2c3Q0cV9zMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3Q0cV9zMzIoaW50MzJfdCAqYSwgaW50MzJ4NHg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3Q0cV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NHFfczMyCiAgIHZzdDRxX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywKLSAgLy8gdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDRxX3M2NChpbnQ2NF90ICphLCBpbnQ2NHgyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDRxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV9zNjQKICAgdnN0NHFfczY0KGEsIGIpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLAotICAvLyB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0NHFfZjE2KGZsb2F0MTZfdCAqYSwgZmxvYXQxNng4eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDRxX2YxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV9mMTYKICAgdnN0NHFfZjE2KGEsIGIpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLAotICAvLyB2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0NHFfZjMyKGZsb2F0MzJfdCAqYSwgZmxvYXQzMng0eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDRxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV9mMzIKICAgdnN0NHFfZjMyKGEsIGIpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLAotICAvLyB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0NHFfZjY0KGZsb2F0NjRfdCAqYSwgZmxvYXQ2NHgyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDRxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV9mNjQKICAgdnN0NHFfZjY0KGEsIGIpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLAotICAvLyB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0NHFfcDgocG9seThfdCAqYSwgcG9seTh4MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NHFfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NHFfcDgKICAgdnN0NHFfcDgoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsCi0gIC8vIHZ7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDRxX3AxNihwb2x5MTZfdCAqYSwgcG9seTE2eDh4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NHFfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRxX3AxNgogICB2c3Q0cV9wMTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3Q0X3U4KHVpbnQ4X3QgKmEsIHVpbnQ4eDh4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X3U4CiAgIHZzdDRfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsCi0gIC8vIHZ7e1swLTldK319LjhifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3Q0X3UxNih1aW50MTZfdCAqYSwgdWludDE2eDR4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NF91MTYKICAgdnN0NF91MTYoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsCi0gIC8vIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3Q0X3UzMih1aW50MzJfdCAqYSwgdWludDMyeDJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NF91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NF91MzIKICAgdnN0NF91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsCi0gIC8vIHZ7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyA/dlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3Q0X3U2NCh1aW50NjRfdCAqYSwgdWludDY0eDF4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NF91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NF91NjQKICAgdnN0NF91NjQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsCi0gIC8vIHZ7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tzdDF8c3Q0fX0ge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDRfczgoaW50OF90ICphLCBpbnQ4eDh4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NF9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X3M4CiAgIHZzdDRfczgoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsCi0gIC8vIHZ7e1swLTldK319LjhifSwgW3t7eFswLTldK3xzcH19XQorLy8gQ0hFQ0s6IHN0NCB7e3sgP3ZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0NF9zMTYoaW50MTZfdCAqYSwgaW50MTZ4NHg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3Q0X3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X3MxNgogICB2c3Q0X3MxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwKLSAgLy8gdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDRfczMyKGludDMyX3QgKmEsIGludDMyeDJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NF9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NF9zMzIKICAgdnN0NF9zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsCi0gIC8vIHZ7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyA/dlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3Q0X3M2NChpbnQ2NF90ICphLCBpbnQ2NHgxeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDRfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRfczY0CiAgIHZzdDRfczY0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLAotICAvLyB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7c3QxfHN0NH19IHt7eyA/dlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3Q0X2YxNihmbG9hdDE2X3QgKmEsIGZsb2F0MTZ4NHg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3Q0X2YxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X2YxNgogICB2c3Q0X2YxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwKLSAgLy8gdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDRfZjMyKGZsb2F0MzJfdCAqYSwgZmxvYXQzMngyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDRfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRfZjMyCiAgIHZzdDRfZjMyKGEsIGIpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLAotICAvLyB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0NF9mNjQoZmxvYXQ2NF90ICphLCBmbG9hdDY0eDF4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NF9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NF9mNjQKICAgdnN0NF9mNjQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsCi0gIC8vIHZ7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tzdDF8c3Q0fX0ge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDRfcDgocG9seThfdCAqYSwgcG9seTh4OHg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3Q0X3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRfcDgKICAgdnN0NF9wOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YiwKLSAgLy8gdnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDRfcDE2KHBvbHkxNl90ICphLCBwb2x5MTZ4NHg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3Q0X3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X3AxNgogICB2c3Q0X3AxNihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwKLSAgLy8gdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDh4MTZ4Ml90IHRlc3RfdmxkMXFfdThfeDIodWludDhfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV91OF94MgogICByZXR1cm4gdmxkMXFfdThfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDE2eDh4Ml90IHRlc3RfdmxkMXFfdTE2X3gyKHVpbnQxNl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3UxNl94MgogICByZXR1cm4gdmxkMXFfdTE2X3gyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDMyeDR4Ml90IHRlc3RfdmxkMXFfdTMyX3gyKHVpbnQzMl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3UzMl94MgogICByZXR1cm4gdmxkMXFfdTMyX3gyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDY0eDJ4Ml90IHRlc3RfdmxkMXFfdTY0X3gyKHVpbnQ2NF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3U2NF94MgogICByZXR1cm4gdmxkMXFfdTY0X3gyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50OHgxNngyX3QgdGVzdF92bGQxcV9zOF94MihpbnQ4X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfczhfeDIKICAgcmV0dXJuIHZsZDFxX3M4X3gyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDE2eDh4Ml90IHRlc3RfdmxkMXFfczE2X3gyKGludDE2X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfczE2X3gyCiAgIHJldHVybiB2bGQxcV9zMTZfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQzMng0eDJfdCB0ZXN0X3ZsZDFxX3MzMl94MihpbnQzMl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3MzMl94MgogICByZXR1cm4gdmxkMXFfczMyX3gyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50NjR4MngyX3QgdGVzdF92bGQxcV9zNjRfeDIoaW50NjRfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9zNjRfeDIKICAgcmV0dXJuIHZsZDFxX3M2NF94MihhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4yZCwgdlswLTldKy4yZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0MTZ4OHgyX3QgdGVzdF92bGQxcV9mMTZfeDIoZmxvYXQxNl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2YxNl94MgogICByZXR1cm4gdmxkMXFfZjE2X3gyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQzMng0eDJfdCB0ZXN0X3ZsZDFxX2YzMl94MihmbG9hdDMyX3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZjMyX3gyCiAgIHJldHVybiB2bGQxcV9mMzJfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBmbG9hdDY0eDJ4Ml90IHRlc3RfdmxkMXFfZjY0X3gyKGZsb2F0NjRfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9mNjRfeDIKICAgcmV0dXJuIHZsZDFxX2Y2NF94MihhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4yZCwgdlswLTldKy4yZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk4eDE2eDJfdCB0ZXN0X3ZsZDFxX3A4X3gyKHBvbHk4X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfcDhfeDIKICAgcmV0dXJuIHZsZDFxX3A4X3gyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHkxNng4eDJfdCB0ZXN0X3ZsZDFxX3AxNl94Mihwb2x5MTZfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9wMTZfeDIKICAgcmV0dXJuIHZsZDFxX3AxNl94MihhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk2NHgyeDJfdCB0ZXN0X3ZsZDFxX3A2NF94Mihwb2x5NjRfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9wNjRfeDIKICAgcmV0dXJuIHZsZDFxX3A2NF94MihhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4yZCwgdlswLTldKy4yZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQ4eDh4Ml90IHRlc3RfdmxkMV91OF94Mih1aW50OF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfdThfeDIKICAgcmV0dXJuIHZsZDFfdThfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuOGIsIHZbMC05XSsuOGIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50MTZ4NHgyX3QgdGVzdF92bGQxX3UxNl94Mih1aW50MTZfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3UxNl94MgogICByZXR1cm4gdmxkMV91MTZfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50MzJ4MngyX3QgdGVzdF92bGQxX3UzMl94Mih1aW50MzJfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3UzMl94MgogICByZXR1cm4gdmxkMV91MzJfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50NjR4MXgyX3QgdGVzdF92bGQxX3U2NF94Mih1aW50NjRfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3U2NF94MgogICByZXR1cm4gdmxkMV91NjRfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQ4eDh4Ml90IHRlc3RfdmxkMV9zOF94MihpbnQ4X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9zOF94MgogICByZXR1cm4gdmxkMV9zOF94MihhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDE2eDR4Ml90IHRlc3RfdmxkMV9zMTZfeDIoaW50MTZfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3MxNl94MgogICByZXR1cm4gdmxkMV9zMTZfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQzMngyeDJfdCB0ZXN0X3ZsZDFfczMyX3gyKGludDMyX3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9zMzJfeDIKICAgcmV0dXJuIHZsZDFfczMyX3gyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjJzLCB2WzAtOV0rLjJzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50NjR4MXgyX3QgdGVzdF92bGQxX3M2NF94MihpbnQ2NF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfczY0X3gyCiAgIHJldHVybiB2bGQxX3M2NF94MihhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4xZCwgdlswLTldKy4xZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0MTZ4NHgyX3QgdGVzdF92bGQxX2YxNl94MihmbG9hdDE2X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9mMTZfeDIKICAgcmV0dXJuIHZsZDFfZjE2X3gyKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQzMngyeDJfdCB0ZXN0X3ZsZDFfZjMyX3gyKGZsb2F0MzJfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2YzMl94MgogICByZXR1cm4gdmxkMV9mMzJfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBmbG9hdDY0eDF4Ml90IHRlc3RfdmxkMV9mNjRfeDIoZmxvYXQ2NF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfZjY0X3gyCiAgIHJldHVybiB2bGQxX2Y2NF94MihhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4xZCwgdlswLTldKy4xZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk4eDh4Ml90IHRlc3RfdmxkMV9wOF94Mihwb2x5OF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfcDhfeDIKICAgcmV0dXJuIHZsZDFfcDhfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuOGIsIHZbMC05XSsuOGIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5MTZ4NHgyX3QgdGVzdF92bGQxX3AxNl94Mihwb2x5MTZfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3AxNl94MgogICByZXR1cm4gdmxkMV9wMTZfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5NjR4MXgyX3QgdGVzdF92bGQxX3A2NF94Mihwb2x5NjRfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3A2NF94MgogICByZXR1cm4gdmxkMV9wNjRfeDIoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50OHgxNngzX3QgdGVzdF92bGQxcV91OF94Myh1aW50OF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3U4X3gzCiAgIHJldHVybiB2bGQxcV91OF94MyhhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yn0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50MTZ4OHgzX3QgdGVzdF92bGQxcV91MTZfeDModWludDE2X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfdTE2X3gzCiAgIHJldHVybiB2bGQxcV91MTZfeDMoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDMyeDR4M190IHRlc3RfdmxkMXFfdTMyX3gzKHVpbnQzMl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3UzMl94MwogICByZXR1cm4gdmxkMXFfdTMyX3gzKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy40cywgdlswLTldKy40cywgdlswLTldKy40cyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQ2NHgyeDNfdCB0ZXN0X3ZsZDFxX3U2NF94Myh1aW50NjRfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV91NjRfeDMKICAgcmV0dXJuIHZsZDFxX3U2NF94MyhhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQ4eDE2eDNfdCB0ZXN0X3ZsZDFxX3M4X3gzKGludDhfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9zOF94MwogICByZXR1cm4gdmxkMXFfczhfeDMoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmJ9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MTZ4OHgzX3QgdGVzdF92bGQxcV9zMTZfeDMoaW50MTZfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9zMTZfeDMKICAgcmV0dXJuIHZsZDFxX3MxNl94MyhhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQzMng0eDNfdCB0ZXN0X3ZsZDFxX3MzMl94MyhpbnQzMl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3MzMl94MwogICByZXR1cm4gdmxkMXFfczMyX3gzKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy40cywgdlswLTldKy40cywgdlswLTldKy40cyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDY0eDJ4M190IHRlc3RfdmxkMXFfczY0X3gzKGludDY0X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfczY0X3gzCiAgIHJldHVybiB2bGQxcV9zNjRfeDMoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQxNng4eDNfdCB0ZXN0X3ZsZDFxX2YxNl94MyhmbG9hdDE2X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZjE2X3gzCiAgIHJldHVybiB2bGQxcV9mMTZfeDMoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQzMng0eDNfdCB0ZXN0X3ZsZDFxX2YzMl94MyhmbG9hdDMyX3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZjMyX3gzCiAgIHJldHVybiB2bGQxcV9mMzJfeDMoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQ2NHgyeDNfdCB0ZXN0X3ZsZDFxX2Y2NF94MyhmbG9hdDY0X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZjY0X3gzCiAgIHJldHVybiB2bGQxcV9mNjRfeDMoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTh4MTZ4M190IHRlc3RfdmxkMXFfcDhfeDMocG9seThfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9wOF94MwogICByZXR1cm4gdmxkMXFfcDhfeDMoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmJ9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTE2eDh4M190IHRlc3RfdmxkMXFfcDE2X3gzKHBvbHkxNl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3AxNl94MwogICByZXR1cm4gdmxkMXFfcDE2X3gzKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhofSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk2NHgyeDNfdCB0ZXN0X3ZsZDFxX3A2NF94Myhwb2x5NjRfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9wNjRfeDMKICAgcmV0dXJuIHZsZDFxX3A2NF94MyhhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50OHg4eDNfdCB0ZXN0X3ZsZDFfdThfeDModWludDhfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3U4X3gzCiAgIHJldHVybiB2bGQxX3U4X3gzKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhifSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQxNng0eDNfdCB0ZXN0X3ZsZDFfdTE2X3gzKHVpbnQxNl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfdTE2X3gzCiAgIHJldHVybiB2bGQxX3UxNl94MyhhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50MzJ4MngzX3QgdGVzdF92bGQxX3UzMl94Myh1aW50MzJfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3UzMl94MwogICByZXR1cm4gdmxkMV91MzJfeDMoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnN9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjJzLCB2WzAtOV0rLjJzLCB2WzAtOV0rLjJzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDY0eDF4M190IHRlc3RfdmxkMV91NjRfeDModWludDY0X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV91NjRfeDMKICAgcmV0dXJuIHZsZDFfdTY0X3gzKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDh4OHgzX3QgdGVzdF92bGQxX3M4X3gzKGludDhfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3M4X3gzCiAgIHJldHVybiB2bGQxX3M4X3gzKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhifSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDE2eDR4M190IHRlc3RfdmxkMV9zMTZfeDMoaW50MTZfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3MxNl94MwogICByZXR1cm4gdmxkMV9zMTZfeDMoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MzJ4MngzX3QgdGVzdF92bGQxX3MzMl94MyhpbnQzMl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfczMyX3gzCiAgIHJldHVybiB2bGQxX3MzMl94MyhhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQ2NHgxeDNfdCB0ZXN0X3ZsZDFfczY0X3gzKGludDY0X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9zNjRfeDMKICAgcmV0dXJuIHZsZDFfczY0X3gzKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0MTZ4NHgzX3QgdGVzdF92bGQxX2YxNl94MyhmbG9hdDE2X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9mMTZfeDMKICAgcmV0dXJuIHZsZDFfZjE2X3gzKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0MzJ4MngzX3QgdGVzdF92bGQxX2YzMl94MyhmbG9hdDMyX3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9mMzJfeDMKICAgcmV0dXJuIHZsZDFfZjMyX3gzKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0NjR4MXgzX3QgdGVzdF92bGQxX2Y2NF94MyhmbG9hdDY0X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9mNjRfeDMKICAgcmV0dXJuIHZsZDFfZjY0X3gzKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk4eDh4M190IHRlc3RfdmxkMV9wOF94Myhwb2x5OF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfcDhfeDMKICAgcmV0dXJuIHZsZDFfcDhfeDMoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGJ9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTE2eDR4M190IHRlc3RfdmxkMV9wMTZfeDMocG9seTE2X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9wMTZfeDMKICAgcmV0dXJuIHZsZDFfcDE2X3gzKGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk2NHgxeDNfdCB0ZXN0X3ZsZDFfcDY0X3gzKHBvbHk2NF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfcDY0X3gzCiAgIHJldHVybiB2bGQxX3A2NF94MyhhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50OHgxNng0X3QgdGVzdF92bGQxcV91OF94NCh1aW50OF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3U4X3g0CiAgIHJldHVybiB2bGQxcV91OF94NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YiwKLSAgLy8gdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50MTZ4OHg0X3QgdGVzdF92bGQxcV91MTZfeDQodWludDE2X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfdTE2X3g0CiAgIHJldHVybiB2bGQxcV91MTZfeDQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQzMng0eDRfdCB0ZXN0X3ZsZDFxX3UzMl94NCh1aW50MzJfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV91MzJfeDQKICAgcmV0dXJuIHZsZDFxX3UzMl94NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywKLSAgLy8gdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDY0eDJ4NF90IHRlc3RfdmxkMXFfdTY0X3g0KHVpbnQ2NF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3U2NF94NAogICByZXR1cm4gdmxkMXFfdTY0X3g0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLAotICAvLyB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQ4eDE2eDRfdCB0ZXN0X3ZsZDFxX3M4X3g0KGludDhfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9zOF94NAogICByZXR1cm4gdmxkMXFfczhfeDQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsCi0gIC8vIHZ7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MTZ4OHg0X3QgdGVzdF92bGQxcV9zMTZfeDQoaW50MTZfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9zMTZfeDQKICAgcmV0dXJuIHZsZDFxX3MxNl94NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwKLSAgLy8gdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50MzJ4NHg0X3QgdGVzdF92bGQxcV9zMzJfeDQoaW50MzJfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9zMzJfeDQKICAgcmV0dXJuIHZsZDFxX3MzMl94NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywKLSAgLy8gdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50NjR4Mng0X3QgdGVzdF92bGQxcV9zNjRfeDQoaW50NjRfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9zNjRfeDQKICAgcmV0dXJuIHZsZDFxX3M2NF94NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwKLSAgLy8gdnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQxNng4eDRfdCB0ZXN0X3ZsZDFxX2YxNl94NChmbG9hdDE2X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZjE2X3g0CiAgIHJldHVybiB2bGQxcV9mMTZfeDQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0MzJ4NHg0X3QgdGVzdF92bGQxcV9mMzJfeDQoZmxvYXQzMl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2YzMl94NAogICByZXR1cm4gdmxkMXFfZjMyX3g0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLAotICAvLyB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBmbG9hdDY0eDJ4NF90IHRlc3RfdmxkMXFfZjY0X3g0KGZsb2F0NjRfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9mNjRfeDQKICAgcmV0dXJuIHZsZDFxX2Y2NF94NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwKLSAgLy8gdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTh4MTZ4NF90IHRlc3RfdmxkMXFfcDhfeDQocG9seThfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9wOF94NAogICByZXR1cm4gdmxkMXFfcDhfeDQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsCi0gIC8vIHZ7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTE2eDh4NF90IHRlc3RfdmxkMXFfcDE2X3g0KHBvbHkxNl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX3AxNl94NAogICByZXR1cm4gdmxkMXFfcDE2X3g0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLAotICAvLyB2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5NjR4Mng0X3QgdGVzdF92bGQxcV9wNjRfeDQocG9seTY0X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfcDY0X3g0CiAgIHJldHVybiB2bGQxcV9wNjRfeDQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsCi0gIC8vIHZ7e1swLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTldKy4yZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQ4eDh4NF90IHRlc3RfdmxkMV91OF94NCh1aW50OF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfdThfeDQKICAgcmV0dXJuIHZsZDFfdThfeDQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsCi0gIC8vIHZ7e1swLTldK319LjhifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHVpbnQxNng0eDRfdCB0ZXN0X3ZsZDFfdTE2X3g0KHVpbnQxNl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfdTE2X3g0CiAgIHJldHVybiB2bGQxX3UxNl94NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwKLSAgLy8gdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdWludDMyeDJ4NF90IHRlc3RfdmxkMV91MzJfeDQodWludDMyX3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV91MzJfeDQKICAgcmV0dXJuIHZsZDFfdTMyX3g0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLAotICAvLyB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB1aW50NjR4MXg0X3QgdGVzdF92bGQxX3U2NF94NCh1aW50NjRfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3U2NF94NAogICByZXR1cm4gdmxkMV91NjRfeDQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsCi0gIC8vIHZ7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGludDh4OHg0X3QgdGVzdF92bGQxX3M4X3g0KGludDhfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3M4X3g0CiAgIHJldHVybiB2bGQxX3M4X3g0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLAotICAvLyB2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQxNng0eDRfdCB0ZXN0X3ZsZDFfczE2X3g0KGludDE2X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9zMTZfeDQKICAgcmV0dXJuIHZsZDFfczE2X3g0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLAotICAvLyB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQzMngyeDRfdCB0ZXN0X3ZsZDFfczMyX3g0KGludDMyX3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9zMzJfeDQKICAgcmV0dXJuIHZsZDFfczMyX3g0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLAotICAvLyB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBpbnQ2NHgxeDRfdCB0ZXN0X3ZsZDFfczY0X3g0KGludDY0X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9zNjRfeDQKICAgcmV0dXJuIHZsZDFfczY0X3g0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLAotICAvLyB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBmbG9hdDE2eDR4NF90IHRlc3RfdmxkMV9mMTZfeDQoZmxvYXQxNl90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfZjE2X3g0CiAgIHJldHVybiB2bGQxX2YxNl94NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwKLSAgLy8gdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogZmxvYXQzMngyeDRfdCB0ZXN0X3ZsZDFfZjMyX3g0KGZsb2F0MzJfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2YzMl94NAogICByZXR1cm4gdmxkMV9mMzJfeDQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsCi0gIC8vIHZ7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIGZsb2F0NjR4MXg0X3QgdGVzdF92bGQxX2Y2NF94NChmbG9hdDY0X3QgY29uc3QgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9mNjRfeDQKICAgcmV0dXJuIHZsZDFfZjY0X3g0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLAotICAvLyB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5OHg4eDRfdCB0ZXN0X3ZsZDFfcDhfeDQocG9seThfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3A4X3g0CiAgIHJldHVybiB2bGQxX3A4X3g0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLAotICAvLyB2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgP3ZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5MTZ4NHg0X3QgdGVzdF92bGQxX3AxNl94NChwb2x5MTZfdCBjb25zdCAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX3AxNl94NAogICByZXR1cm4gdmxkMV9wMTZfeDQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsCi0gIC8vIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk2NHgxeDRfdCB0ZXN0X3ZsZDFfcDY0X3g0KHBvbHk2NF90IGNvbnN0ICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfcDY0X3g0CiAgIHJldHVybiB2bGQxX3A2NF94NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwKLSAgLy8gdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3U4X3gyKHVpbnQ4X3QgKmEsIHVpbnQ4eDE2eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3U4X3gyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3U4X3gyCiAgIHZzdDFxX3U4X3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxcV91MTZfeDIodWludDE2X3QgKmEsIHVpbnQxNng4eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3UxNl94MgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV91MTZfeDIKICAgdnN0MXFfdTE2X3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3UzMl94Mih1aW50MzJfdCAqYSwgdWludDMyeDR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfdTMyX3gyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3UzMl94MgogICB2c3QxcV91MzJfeDIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfdTY0X3gyKHVpbnQ2NF90ICphLCB1aW50NjR4MngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV91NjRfeDIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfdTY0X3gyCiAgIHZzdDFxX3U2NF94MihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy4yZCwgdlswLTldKy4yZCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxcV9zOF94MihpbnQ4X3QgKmEsIGludDh4MTZ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfczhfeDIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfczhfeDIKICAgdnN0MXFfczhfeDIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3MxNl94MihpbnQxNl90ICphLCBpbnQxNng4eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3MxNl94MgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9zMTZfeDIKICAgdnN0MXFfczE2X3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3MzMl94MihpbnQzMl90ICphLCBpbnQzMng0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3MzMl94MgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9zMzJfeDIKICAgdnN0MXFfczMyX3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3M2NF94MihpbnQ2NF90ICphLCBpbnQ2NHgyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3M2NF94MgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9zNjRfeDIKICAgdnN0MXFfczY0X3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX2YxNl94MihmbG9hdDE2X3QgKmEsIGZsb2F0MTZ4OHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV9mMTZfeDIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfZjE2X3gyCiAgIHZzdDFxX2YxNl94MihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxcV9mMzJfeDIoZmxvYXQzMl90ICphLCBmbG9hdDMyeDR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfZjMyX3gyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX2YzMl94MgogICB2c3QxcV9mMzJfeDIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfZjY0X3gyKGZsb2F0NjRfdCAqYSwgZmxvYXQ2NHgyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX2Y2NF94MgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9mNjRfeDIKICAgdnN0MXFfZjY0X3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3A4X3gyKHBvbHk4X3QgKmEsIHBvbHk4eDE2eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3A4X3gyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3A4X3gyCiAgIHZzdDFxX3A4X3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxcV9wMTZfeDIocG9seTE2X3QgKmEsIHBvbHkxNng4eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3AxNl94MgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9wMTZfeDIKICAgdnN0MXFfcDE2X3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3A2NF94Mihwb2x5NjRfdCAqYSwgcG9seTY0eDJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfcDY0X3gyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3A2NF94MgogICB2c3QxcV9wNjRfeDIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV91OF94Mih1aW50OF90ICphLCB1aW50OHg4eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfdThfeDIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV91OF94MgogICB2c3QxX3U4X3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfdTE2X3gyKHVpbnQxNl90ICphLCB1aW50MTZ4NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3UxNl94MgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3UxNl94MgogICB2c3QxX3UxNl94MihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3UzMl94Mih1aW50MzJfdCAqYSwgdWludDMyeDJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV91MzJfeDIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV91MzJfeDIKICAgdnN0MV91MzJfeDIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV91NjRfeDIodWludDY0X3QgKmEsIHVpbnQ2NHgxeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfdTY0X3gyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfdTY0X3gyCiAgIHZzdDFfdTY0X3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfczhfeDIoaW50OF90ICphLCBpbnQ4eDh4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9zOF94MgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3M4X3gyCiAgIHZzdDFfczhfeDIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuOGIsIHZbMC05XSsuOGIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9zMTZfeDIoaW50MTZfdCAqYSwgaW50MTZ4NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3MxNl94MgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3MxNl94MgogICB2c3QxX3MxNl94MihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3MzMl94MihpbnQzMl90ICphLCBpbnQzMngyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfczMyX3gyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfczMyX3gyCiAgIHZzdDFfczMyX3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjJzLCB2WzAtOV0rLjJzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfczY0X3gyKGludDY0X3QgKmEsIGludDY0eDF4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9zNjRfeDIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9zNjRfeDIKICAgdnN0MV9zNjRfeDIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9mMTZfeDIoZmxvYXQxNl90ICphLCBmbG9hdDE2eDR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9mMTZfeDIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9mMTZfeDIKICAgdnN0MV9mMTZfeDIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9mMzJfeDIoZmxvYXQzMl90ICphLCBmbG9hdDMyeDJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9mMzJfeDIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9mMzJfeDIKICAgdnN0MV9mMzJfeDIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9mNjRfeDIoZmxvYXQ2NF90ICphLCBmbG9hdDY0eDF4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9mNjRfeDIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9mNjRfeDIKICAgdnN0MV9mNjRfeDIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9wOF94Mihwb2x5OF90ICphLCBwb2x5OHg4eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfcDhfeDIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9wOF94MgogICB2c3QxX3A4X3gyKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfcDE2X3gyKHBvbHkxNl90ICphLCBwb2x5MTZ4NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3AxNl94MgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3AxNl94MgogICB2c3QxX3AxNl94MihhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3A2NF94Mihwb2x5NjRfdCAqYSwgcG9seTY0eDF4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9wNjRfeDIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9wNjRfeDIKICAgdnN0MV9wNjRfeDIoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfdThfeDModWludDhfdCAqYSwgdWludDh4MTZ4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfdThfeDMKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfdThfeDMKICAgdnN0MXFfdThfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmJ9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3UxNl94Myh1aW50MTZfdCAqYSwgdWludDE2eDh4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfdTE2X3gzCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3UxNl94MwogICB2c3QxcV91MTZfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3UzMl94Myh1aW50MzJfdCAqYSwgdWludDMyeDR4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfdTMyX3gzCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3UzMl94MwogICB2c3QxcV91MzJfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3U2NF94Myh1aW50NjRfdCAqYSwgdWludDY0eDJ4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfdTY0X3gzCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3U2NF94MwogICB2c3QxcV91NjRfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3M4X3gzKGludDhfdCAqYSwgaW50OHgxNngzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV9zOF94MworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9zOF94MwogICB2c3QxcV9zOF94MyhhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yn0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfczE2X3gzKGludDE2X3QgKmEsIGludDE2eDh4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfczE2X3gzCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3MxNl94MwogICB2c3QxcV9zMTZfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3MzMl94MyhpbnQzMl90ICphLCBpbnQzMng0eDNfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3MzMl94MworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9zMzJfeDMKICAgdnN0MXFfczMyX3gzKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy40cywgdlswLTldKy40cywgdlswLTldKy40cyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxcV9zNjRfeDMoaW50NjRfdCAqYSwgaW50NjR4MngzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV9zNjRfeDMKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfczY0X3gzCiAgIHZzdDFxX3M2NF94MyhhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfZjE2X3gzKGZsb2F0MTZfdCAqYSwgZmxvYXQxNng4eDNfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX2YxNl94MworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9mMTZfeDMKICAgdnN0MXFfZjE2X3gzKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhofSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxcV9mMzJfeDMoZmxvYXQzMl90ICphLCBmbG9hdDMyeDR4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfZjMyX3gzCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX2YzMl94MwogICB2c3QxcV9mMzJfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX2Y2NF94MyhmbG9hdDY0X3QgKmEsIGZsb2F0NjR4MngzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV9mNjRfeDMKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfZjY0X3gzCiAgIHZzdDFxX2Y2NF94MyhhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfcDhfeDMocG9seThfdCAqYSwgcG9seTh4MTZ4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfcDhfeDMKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfcDhfeDMKICAgdnN0MXFfcDhfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmJ9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3AxNl94Myhwb2x5MTZfdCAqYSwgcG9seTE2eDh4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfcDE2X3gzCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3AxNl94MwogICB2c3QxcV9wMTZfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3A2NF94Myhwb2x5NjRfdCAqYSwgcG9seTY0eDJ4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfcDY0X3gzCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3A2NF94MwogICB2c3QxcV9wNjRfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfdThfeDModWludDhfdCAqYSwgdWludDh4OHgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3U4X3gzCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfdThfeDMKICAgdnN0MV91OF94MyhhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yn0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV91MTZfeDModWludDE2X3QgKmEsIHVpbnQxNng0eDNfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfdTE2X3gzCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfdTE2X3gzCiAgIHZzdDFfdTE2X3gzKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3UzMl94Myh1aW50MzJfdCAqYSwgdWludDMyeDJ4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV91MzJfeDMKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV91MzJfeDMKICAgdnN0MV91MzJfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnN9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjJzLCB2WzAtOV0rLjJzLCB2WzAtOV0rLjJzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfdTY0X3gzKHVpbnQ2NF90ICphLCB1aW50NjR4MXgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3U2NF94MworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3U2NF94MwogICB2c3QxX3U2NF94MyhhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9zOF94MyhpbnQ4X3QgKmEsIGludDh4OHgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3M4X3gzCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfczhfeDMKICAgdnN0MV9zOF94MyhhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yn0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9zMTZfeDMoaW50MTZfdCAqYSwgaW50MTZ4NHgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3MxNl94MworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3MxNl94MwogICB2c3QxX3MxNl94MyhhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9zMzJfeDMoaW50MzJfdCAqYSwgaW50MzJ4MngzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3MzMl94MworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3MzMl94MwogICB2c3QxX3MzMl94MyhhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9zNjRfeDMoaW50NjRfdCAqYSwgaW50NjR4MXgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3M2NF94MworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3M2NF94MwogICB2c3QxX3M2NF94MyhhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9mMTZfeDMoZmxvYXQxNl90ICphLCBmbG9hdDE2eDR4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9mMTZfeDMKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9mMTZfeDMKICAgdnN0MV9mMTZfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfZjMyX3gzKGZsb2F0MzJfdCAqYSwgZmxvYXQzMngyeDNfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfZjMyX3gzCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfZjMyX3gzCiAgIHZzdDFfZjMyX3gzKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzfSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX2Y2NF94MyhmbG9hdDY0X3QgKmEsIGZsb2F0NjR4MXgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX2Y2NF94MworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX2Y2NF94MwogICB2c3QxX2Y2NF94MyhhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9wOF94Myhwb2x5OF90ICphLCBwb2x5OHg4eDNfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfcDhfeDMKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9wOF94MwogICB2c3QxX3A4X3gzKGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhifSwKLSAgLy8gW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3AxNl94Myhwb2x5MTZfdCAqYSwgcG9seTE2eDR4M190IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9wMTZfeDMKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9wMTZfeDMKICAgdnN0MV9wMTZfeDMoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LAotICAvLyBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfcDY0X3gzKHBvbHk2NF90ICphLCBwb2x5NjR4MXgzX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3A2NF94MworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3A2NF94MwogICB2c3QxX3A2NF94MyhhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sCi0gIC8vIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfdThfeDQodWludDhfdCAqYSwgdWludDh4MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfdThfeDQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfdThfeDQKICAgdnN0MXFfdThfeDQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsCi0gIC8vIHZ7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3UxNl94NCh1aW50MTZfdCAqYSwgdWludDE2eDh4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfdTE2X3g0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3UxNl94NAogICB2c3QxcV91MTZfeDQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxcV91MzJfeDQodWludDMyX3QgKmEsIHVpbnQzMng0eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3UzMl94NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV91MzJfeDQKICAgdnN0MXFfdTMyX3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLAotICAvLyB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfdTY0X3g0KHVpbnQ2NF90ICphLCB1aW50NjR4Mng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV91NjRfeDQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfdTY0X3g0CiAgIHZzdDFxX3U2NF94NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwKLSAgLy8gdnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkLCB2WzAtOV0rLjJkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3M4X3g0KGludDhfdCAqYSwgaW50OHgxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV9zOF94NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9zOF94NAogICB2c3QxcV9zOF94NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YiwKLSAgLy8gdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfczE2X3g0KGludDE2X3QgKmEsIGludDE2eDh4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfczE2X3g0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3MxNl94NAogICB2c3QxcV9zMTZfeDQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxcV9zMzJfeDQoaW50MzJfdCAqYSwgaW50MzJ4NHg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxcV9zMzJfeDQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfczMyX3g0CiAgIHZzdDFxX3MzMl94NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywKLSAgLy8gdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3M2NF94NChpbnQ2NF90ICphLCBpbnQ2NHgyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3M2NF94NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9zNjRfeDQKICAgdnN0MXFfczY0X3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLAotICAvLyB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfZjE2X3g0KGZsb2F0MTZfdCAqYSwgZmxvYXQxNng4eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX2YxNl94NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9mMTZfeDQKICAgdnN0MXFfZjE2X3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLAotICAvLyB2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfZjMyX3g0KGZsb2F0MzJfdCAqYSwgZmxvYXQzMng0eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX2YzMl94NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9mMzJfeDQKICAgdnN0MXFfZjMyX3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLAotICAvLyB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfZjY0X3g0KGZsb2F0NjRfdCAqYSwgZmxvYXQ2NHgyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX2Y2NF94NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9mNjRfeDQKICAgdnN0MXFfZjY0X3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLAotICAvLyB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MXFfcDhfeDQocG9seThfdCAqYSwgcG9seTh4MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfcDhfeDQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfcDhfeDQKICAgdnN0MXFfcDhfeDQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsCi0gIC8vIHZ7e1swLTldK319LjE2Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3AxNl94NChwb2x5MTZfdCAqYSwgcG9seTE2eDh4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfcDE2X3g0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3AxNl94NAogICB2c3QxcV9wMTZfeDQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxcV9wNjRfeDQocG9seTY0X3QgKmEsIHBvbHk2NHgyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFxX3A2NF94NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9wNjRfeDQKICAgdnN0MXFfcDY0X3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLAotICAvLyB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV91OF94NCh1aW50OF90ICphLCB1aW50OHg4eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfdThfeDQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV91OF94NAogICB2c3QxX3U4X3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLAotICAvLyB2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV91MTZfeDQodWludDE2X3QgKmEsIHVpbnQxNng0eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfdTE2X3g0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfdTE2X3g0CiAgIHZzdDFfdTE2X3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLAotICAvLyB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV91MzJfeDQodWludDMyX3QgKmEsIHVpbnQzMngyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfdTMyX3g0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfdTMyX3g0CiAgIHZzdDFfdTMyX3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLAotICAvLyB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV91NjRfeDQodWludDY0X3QgKmEsIHVpbnQ2NHgxeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfdTY0X3g0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfdTY0X3g0CiAgIHZzdDFfdTY0X3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLAotICAvLyB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9zOF94NChpbnQ4X3QgKmEsIGludDh4OHg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3M4X3g0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfczhfeDQKICAgdnN0MV9zOF94NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YiwKLSAgLy8gdnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfczE2X3g0KGludDE2X3QgKmEsIGludDE2eDR4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9zMTZfeDQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9zMTZfeDQKICAgdnN0MV9zMTZfeDQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsCi0gIC8vIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX3MzMl94NChpbnQzMl90ICphLCBpbnQzMngyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfczMyX3g0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfczMyX3g0CiAgIHZzdDFfczMyX3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLAotICAvLyB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9zNjRfeDQoaW50NjRfdCAqYSwgaW50NjR4MXg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3M2NF94NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3M2NF94NAogICB2c3QxX3M2NF94NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwKLSAgLy8gdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfZjE2X3g0KGZsb2F0MTZfdCAqYSwgZmxvYXQxNng0eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfZjE2X3g0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfZjE2X3g0CiAgIHZzdDFfZjE2X3g0KGEsIGIpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLAotICAvLyB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgP3ZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGggP319fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9mMzJfeDQoZmxvYXQzMl90ICphLCBmbG9hdDMyeDJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MV9mMzJfeDQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9mMzJfeDQKICAgdnN0MV9mMzJfeDQoYSwgYik7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsCi0gIC8vIHZ7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyA/dlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycyA/fX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QxX2Y2NF94NChmbG9hdDY0X3QgKmEsIGZsb2F0NjR4MXg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX2Y2NF94NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX2Y2NF94NAogICB2c3QxX2Y2NF94NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwKLSAgLy8gdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfcDhfeDQocG9seThfdCAqYSwgcG9seTh4OHg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3A4X3g0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfcDhfeDQKICAgdnN0MV9wOF94NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YiwKLSAgLy8gdnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfcDE2X3g0KHBvbHkxNl90ICphLCBwb2x5MTZ4NHg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3AxNl94NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3AxNl94NAogICB2c3QxX3AxNl94NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwKLSAgLy8gdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFfcDY0X3g0KHBvbHk2NF90ICphLCBwb2x5NjR4MXg0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3QxX3A2NF94NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX3A2NF94NAogICB2c3QxX3A2NF94NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwKLSAgLy8gdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ID92WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkID99fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogaW50NjRfdCB0ZXN0X3ZjZXFkX3M2NChpbnQ2NF90IGEsIGludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdmNlcWRfczY0Ci0vLyBDSEVDSzogY21lcSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxZF9zNjQKKy8vIENIRUNLOiB7e2NtZXEgZFswLTldKywgZFswLTldKywgZFswLTldK3xjbXAgeDAsIHgxfX0KICAgcmV0dXJuIChpbnQ2NF90KXZjZXFkX3M2NChhLCBiKTsKIH0KIAogdWludDY0X3QgdGVzdF92Y2VxZF91NjQodWludDY0X3QgYSwgdWludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdmNlcWRfdTY0Ci0vLyBDSEVDSzogY21lcSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxZF91NjQKKy8vIENIRUNLOiB7e2NtZXEgZFswLTldKywgZFswLTldKywgZFswLTldK3xjbXAgeDAsIHgxfX0KICAgcmV0dXJuIChpbnQ2NF90KXZjZXFkX3U2NChhLCBiKTsKLX0gCit9CiAKIGludDY0X3QgdGVzdF92Y2VxemRfczY0KGludDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmNlcXpkX3M2NAotLy8gQ0hFQ0s6IGNtZXEge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxemRfczY0CisvLyBDSEVDSzoge3tjbWVxIGRbMC05XSssIGRbMC05XSssICMweDB8Y21wIHgwLCAjMH19CiAgIHJldHVybiAoaW50NjRfdCl2Y2VxemRfczY0KGEpOwogfQogCiBpbnQ2NF90IHRlc3RfdmNlcXpkX3U2NChpbnQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6ZF91NjQKLS8vIENIRUNLOiBjbWVxIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXpkX3U2NAorLy8gQ0hFQ0s6IHt7Y21lcSBkWzAtOV0rLCBkWzAtOV0rLCAjMHgwfGNtcCB4MCwgIzB9fQogICByZXR1cm4gKGludDY0X3QpdmNlcXpkX3U2NChhKTsKIH0KIAogaW50NjRfdCB0ZXN0X3ZjZ2VkX3M2NChpbnQ2NF90IGEsIGludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdmNnZWRfczY0Ci0vLyBDSEVDSzogY21nZSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2dlZF9zNjQKKy8vIENIRUNLOiB7e2NtZ2UgZFswLTldKywgZFswLTldKywgZFswLTldK3xjbXAgeDAsIHgxfX0KICAgcmV0dXJuIChpbnQ2NF90KXZjZ2VkX3M2NChhLCBiKTsKIH0KIAogdWludDY0X3QgdGVzdF92Y2dlZF91NjQodWludDY0X3QgYSwgdWludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdmNnZWRfdTY0Ci0vLyBDSEVDSzogY21ocyB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2dlZF91NjQKKy8vIENIRUNLOiB7e2NtaHMgZFswLTldKywgZFswLTldKywgZFswLTldK3xjbXAgeDAsIHgxfX0KICAgICByZXR1cm4gKHVpbnQ2NF90KXZjZ2VkX3U2NChhLCBiKTsKIH0KIAogaW50NjRfdCB0ZXN0X3ZjZ2V6ZF9zNjQoaW50NjRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2dlemRfczY0Ci0vLyBDSEVDSzogY21nZSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMweDAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2V6ZF9zNjQKKy8vIENIRUNLOiB7e2NtZ2UgZFswLTldKywgZFswLTldKywgIzB4MHxlb3IgeDAsIHhbMC05XSssIHgwLCBhc3IgIzYzfX0KICAgcmV0dXJuIChpbnQ2NF90KXZjZ2V6ZF9zNjQoYSk7CiB9CiAKIGludDY0X3QgdGVzdF92Y2d0ZF9zNjQoaW50NjRfdCBhLCBpbnQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ3RkX3M2NAotLy8gQ0hFQ0s6IGNtZ3Qge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndGRfczY0CisvLyBDSEVDSzoge3tjbWd0IGRbMC05XSssIGRbMC05XSssIGRbMC05XSt8Y21wIHgwLCB4MX19CiAgIHJldHVybiAoaW50NjRfdCl2Y2d0ZF9zNjQoYSwgYik7CiB9CiAKIHVpbnQ2NF90IHRlc3RfdmNndGRfdTY0KHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ3RkX3U2NAotLy8gQ0hFQ0s6IGNtaGkge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndGRfdTY0CisvLyBDSEVDSzoge3tjbWhpIGRbMC05XSssIGRbMC05XSssIGRbMC05XSt8Y21wIHgwLCB4MX19CiAgIHJldHVybiAodWludDY0X3QpdmNndGRfdTY0KGEsIGIpOwogfQogCiBpbnQ2NF90IHRlc3RfdmNndHpkX3M2NChpbnQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ3R6ZF9zNjQKLS8vIENIRUNLOiBjbWd0IHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndHpkX3M2NAorLy8gQ0hFQ0s6IHt7Y21ndCBkWzAtOV0rLCBkWzAtOV0rLCAjMHgwfGNtcCB4MCwgIzB9fQogICByZXR1cm4gKGludDY0X3QpdmNndHpkX3M2NChhKTsKIH0KIAogaW50NjRfdCB0ZXN0X3ZjbGVkX3M2NChpbnQ2NF90IGEsIGludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdmNsZWRfczY0Ci0vLyBDSEVDSzogY21nZSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2xlZF9zNjQKKy8vIENIRUNLOiB7e2NtZ2UgZFswLTldKywgZFswLTldKywgZFswLTldK3xjbXAgeDAsIHgxfX0KICAgcmV0dXJuIChpbnQ2NF90KXZjbGVkX3M2NChhLCBiKTsKIH0KIAogdWludDY0X3QgdGVzdF92Y2xlZF91NjQodWludDY0X3QgYSwgdWludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdmNsZWRfdTY0Ci0vLyBDSEVDSzogY21ocyB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319Ci0gIHJldHVybiAodWludDY0X3QpdmNsZWRfdTY0KGEsIDApOworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZWRfdTY0CisvLyBDSEVDSzoge3tjbWhzIGRbMC05XSssIGRbMC05XSssIGRbMC05XSt8Y21wIHgwLCB4MX19CisgIHJldHVybiAodWludDY0X3QpdmNsZWRfdTY0KGEsIGIpOwogfQogCiBpbnQ2NF90IHRlc3RfdmNsZXpkX3M2NChpbnQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjbGV6ZF9zNjQKLS8vIENIRUNLOiBjbWxlIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZXpkX3M2NAorLy8gQ0hFQ0s6IHt7Y21sZSBkWzAtOV0rLCBkWzAtOV0rLCAjMHgwfGNtcCB4MCwgIzF9fQogICByZXR1cm4gKGludDY0X3QpdmNsZXpkX3M2NChhKTsKIH0KIAogaW50NjRfdCB0ZXN0X3ZjbHRkX3M2NChpbnQ2NF90IGEsIGludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdmNsdGRfczY0Ci0vLyBDSEVDSzogY21ndCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x0ZF9zNjQKKy8vIENIRUNLOiB7e2NtZ3QgZFswLTldKywgZFswLTldKywgZFswLTldK3xjbXAgeDAsIHgxfX0KICAgcmV0dXJuIChpbnQ2NF90KXZjbHRkX3M2NChhLCBiKTsKIH0KIAogdWludDY0X3QgdGVzdF92Y2x0ZF91NjQodWludDY0X3QgYSwgdWludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdmNsdGRfdTY0Ci0vLyBDSEVDSzogY21oaSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x0ZF91NjQKKy8vIENIRUNLOiB7e2NtaGkgZFswLTldKywgZFswLTldKywgZFswLTldK3xjbXAgeDAsIHgxfX0KICAgcmV0dXJuICh1aW50NjRfdCl2Y2x0ZF91NjQoYSwgYik7CiB9CiAKIGludDY0X3QgdGVzdF92Y2x0emRfczY0KGludDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmNsdHpkX3M2NAotLy8gQ0hFQ0s6IGNtbHQge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x0emRfczY0CisvLyBDSEVDSzoge3tjbWx0IGRbMC05XSssIGRbMC05XSssICMweDB8YXNyIHgwLCB4MCwgIzYzfX0KICAgcmV0dXJuIChpbnQ2NF90KXZjbHR6ZF9zNjQoYSk7CiB9CiAKIGludDY0X3QgdGVzdF92dHN0ZF9zNjQoaW50NjRfdCBhLCBpbnQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Z0c3RkX3M2NAotLy8gQ0hFQ0s6IGNtdHN0IHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0c3RkX3M2NAorLy8gQ0hFQ0s6IHt7Y210c3QgZFswLTldKywgZFswLTldKywgZFswLTldK3xhbmQgeFswLTldKywgeDEsIHgwfX0KICAgcmV0dXJuIChpbnQ2NF90KXZ0c3RkX3M2NChhLCBiKTsKIH0KIAogdWludDY0X3QgdGVzdF92dHN0ZF91NjQodWludDY0X3QgYSwgdWludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnRzdGRfdTY0Ci0vLyBDSEVDSzogY210c3Qge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRzdGRfdTY0CisvLyBDSEVDSzoge3tjbXRzdCBkWzAtOV0rLCBkWzAtOV0rLCBkWzAtOV0rfGFuZCB4WzAtOV0rLCB4MSwgeDB9fQogICByZXR1cm4gKHVpbnQ2NF90KXZ0c3RkX3U2NChhLCBiKTsKIH0KIAogaW50NjRfdCB0ZXN0X3ZhYnNkX3M2NChpbnQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZhYnNkX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFic2RfczY0CiAvLyBDSEVDSzogYWJzIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogICByZXR1cm4gKGludDY0X3QpdmFic2RfczY0KGEpOwogfQogCiBpbnQ4X3QgdGVzdF92cWFic2JfczgoaW50OF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxYWJzYl9zOAotLy8gQ0hFQ0s6IHNxYWJzIHt7YlswLTldK319LCB7e2JbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhYnNiX3M4CisvLyBDSEVDSzogc3FhYnMge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fQogICByZXR1cm4gKGludDhfdCl2cWFic2JfczgoYSk7CiB9CiAKIGludDE2X3QgdGVzdF92cWFic2hfczE2KGludDE2X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnFhYnNoX3MxNgotLy8gQ0hFQ0s6IHNxYWJzIHt7aFswLTldK319LCB7e2hbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhYnNoX3MxNgorLy8gQ0hFQ0s6IHNxYWJzIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0KICAgcmV0dXJuIChpbnQxNl90KXZxYWJzaF9zMTYoYSk7CiB9CiAKIGludDMyX3QgdGVzdF92cWFic3NfczMyKGludDMyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnFhYnNzX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhYnNzX3MzMgogLy8gQ0hFQ0s6IHNxYWJzIHt7c1swLTldK319LCB7e3NbMC05XSt9fQogICByZXR1cm4gKGludDMyX3QpdnFhYnNzX3MzMihhKTsKIH0KIAogaW50NjRfdCB0ZXN0X3ZxYWJzZF9zNjQoaW50NjRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92cWFic2RfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWFic2RfczY0CiAvLyBDSEVDSzogc3FhYnMge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiAgIHJldHVybiAoaW50NjRfdCl2cWFic2RfczY0KGEpOwogfQogCiBpbnQ2NF90IHRlc3Rfdm5lZ2RfczY0KGludDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3Rfdm5lZ2RfczY0Ci0vLyBDSEVDSzogbmVnIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm5lZ2RfczY0CisvLyBDSEVDSzogbmVnIHt7W3hkXVswLTldK319LCB7e1t4ZF1bMC05XSt9fQogICByZXR1cm4gKGludDY0X3Qpdm5lZ2RfczY0KGEpOwogfQogCiBpbnQ4X3QgdGVzdF92cW5lZ2JfczgoaW50OF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxbmVnYl9zOAotLy8gQ0hFQ0s6IHNxbmVnIHt7YlswLTldK319LCB7e2JbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFuZWdiX3M4CisvLyBDSEVDSzogc3FuZWcge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fQogICByZXR1cm4gKGludDhfdCl2cW5lZ2JfczgoYSk7CiB9CiAKIGludDE2X3QgdGVzdF92cW5lZ2hfczE2KGludDE2X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnFuZWdoX3MxNgotLy8gQ0hFQ0s6IHNxbmVnIHt7aFswLTldK319LCB7e2hbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFuZWdoX3MxNgorLy8gQ0hFQ0s6IHNxbmVnIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0KICAgcmV0dXJuIChpbnQxNl90KXZxbmVnaF9zMTYoYSk7CiB9CiAKIGludDMyX3QgdGVzdF92cW5lZ3NfczMyKGludDMyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnFuZWdzX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFuZWdzX3MzMgogLy8gQ0hFQ0s6IHNxbmVnIHt7c1swLTldK319LCB7e3NbMC05XSt9fQogICByZXR1cm4gKGludDMyX3QpdnFuZWdzX3MzMihhKTsKIH0KIAogaW50NjRfdCB0ZXN0X3ZxbmVnZF9zNjQoaW50NjRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92cW5lZ2RfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cW5lZ2RfczY0CiAvLyBDSEVDSzogc3FuZWcge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiAgIHJldHVybiAoaW50NjRfdCl2cW5lZ2RfczY0KGEpOwogfQogCiBpbnQ4X3QgdGVzdF92dXFhZGRiX3M4KGludDhfdCBhLCBpbnQ4X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnVxYWRkYl9zOAotLy8gQ0hFQ0s6IHN1cWFkZCB7e2JbMC05XSt9fSwge3tiWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1cWFkZGJfczgKKy8vIENIRUNLOiBzdXFhZGQge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3tiWzAtOV0rfHZbMC05XSsuOGJ9fQogICByZXR1cm4gKGludDhfdCl2dXFhZGRiX3M4KGEsIGIpOwogfQogCiBpbnQxNl90IHRlc3RfdnVxYWRkaF9zMTYoaW50MTZfdCBhLCBpbnQxNl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3Z1cWFkZGhfczE2Ci0vLyBDSEVDSzogc3VxYWRkIHt7aFswLTldK319LCB7e2hbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnVxYWRkaF9zMTYKKy8vIENIRUNLOiBzdXFhZGQge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fQogICByZXR1cm4gKGludDE2X3QpdnVxYWRkaF9zMTYoYSwgYik7CiB9CiAKIGludDMyX3QgdGVzdF92dXFhZGRzX3MzMihpbnQzMl90IGEsIGludDMyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnVxYWRkc19zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1cWFkZHNfczMyCiAvLyBDSEVDSzogc3VxYWRkIHt7c1swLTldK319LCB7e3NbMC05XSt9fQogICByZXR1cm4gKGludDMyX3QpdnVxYWRkc19zMzIoYSwgYik7CiB9CiAKIGludDY0X3QgdGVzdF92dXFhZGRkX3M2NChpbnQ2NF90IGEsIGludDY0X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnVxYWRkZF9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1cWFkZGRfczY0CiAvLyBDSEVDSzogc3VxYWRkIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogICByZXR1cm4gKGludDY0X3QpdnVxYWRkZF9zNjQoYSwgYik7CiB9CiAKIHVpbnQ4X3QgdGVzdF92c3FhZGRiX3U4KHVpbnQ4X3QgYSwgdWludDhfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92c3FhZGRiX3U4Ci0vLyBDSEVDSzogdXNxYWRkIHt7YlswLTldK319LCB7e2JbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNxYWRkYl91OAorLy8gQ0hFQ0s6IHVzcWFkZCB7e2JbMC05XSt8dlswLTldKy44Yn19LCB7e2JbMC05XSt8dlswLTldKy44Yn19CiAgIHJldHVybiAodWludDhfdCl2c3FhZGRiX3U4KGEsIGIpOwogfQogCiB1aW50MTZfdCB0ZXN0X3ZzcWFkZGhfdTE2KHVpbnQxNl90IGEsIHVpbnQxNl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzcWFkZGhfdTE2Ci0vLyBDSEVDSzogdXNxYWRkIHt7aFswLTldK319LCB7e2hbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNxYWRkaF91MTYKKy8vIENIRUNLOiB1c3FhZGQge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fQogICByZXR1cm4gKHVpbnQxNl90KXZzcWFkZGhfdTE2KGEsIGIpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZzcWFkZHNfdTMyKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzcWFkZHNfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92c3FhZGRzX3UzMgogLy8gQ0hFQ0s6IHVzcWFkZCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KICAgcmV0dXJuICh1aW50MzJfdCl2c3FhZGRzX3UzMihhLCBiKTsKIH0KIAogdWludDY0X3QgdGVzdF92c3FhZGRkX3U2NCh1aW50NjRfdCBhLCB1aW50NjRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92c3FhZGRkX3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNxYWRkZF91NjQKIC8vIENIRUNLOiB1c3FhZGQge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CiAgIHJldHVybiAodWludDY0X3QpdnNxYWRkZF91NjQoYSwgYik7CiB9CiAKIGludDMyX3QgdGVzdF92cWRtbGFsaF9zMTYoaW50MzJfdCBhLCBpbnQxNl90IGIsIGludDE2X3QgYykgewotLy8gQ0hFQ0s6IHRlc3RfdnFkbWxhbGhfczE2Ci0vLyBDSEVDSzogc3FkbWxhbCB7e3NbMC05XSt9fSwge3toWzAtOV0rfX0sIHt7aFswLTldK319CisvLyBDSEVDSy1BQVJDSDY0LUxBQkVMOiB0ZXN0X3ZxZG1sYWxoX3MxNgorLy8gQ0hFQ0stQUFSQ0g2NDogc3FkbWxhbCB7e3NbMC05XSt9fSwge3toWzAtOV0rfX0sIHt7aFswLTldK319CisKKy8vIENIRUNLLUFSTTY0LUxBQkVMOiB0ZXN0X3ZxZG1sYWxoX3MxNgorLy8gQ0hFQ0stQVJNNjQ6IHNxZG11bGwgdltbUFJPRDpbMC05XStdXS40cywge3t2WzAtOV0rLjRofX0sIHt7dlswLTldKy40aH19CisvLyBDSEVDSy1BUk02NDogc3FhZGQge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCBzW1tQUk9EXV0KICAgcmV0dXJuIChpbnQzMl90KXZxZG1sYWxoX3MxNihhLCBiLCBjKTsKIH0KIAogaW50NjRfdCB0ZXN0X3ZxZG1sYWxzX3MzMihpbnQ2NF90IGEsIGludDMyX3QgYiwgaW50MzJfdCBjKSB7Ci0vLyBDSEVDSzogdGVzdF92cWRtbGFsc19zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sYWxzX3MzMgogLy8gQ0hFQ0s6IHNxZG1sYWwge3tkWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3NbMC05XSt9fQogICByZXR1cm4gKGludDY0X3QpdnFkbWxhbHNfczMyKGEsIGIsIGMpOwogfQogCiBpbnQzMl90IHRlc3RfdnFkbWxzbGhfczE2KGludDMyX3QgYSwgaW50MTZfdCBiLCBpbnQxNl90IGMpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxZG1sc2xoX3MxNgotLy8gQ0hFQ0s6IHNxZG1sc2wge3tzWzAtOV0rfX0sIHt7aFswLTldK319LCB7e2hbMC05XSt9fQorLy8gQ0hFQ0stQUFSQ0g2NC1MQUJFTDogdGVzdF92cWRtbHNsaF9zMTYKKy8vIENIRUNLLUFBUkNINjQ6IHNxZG1sc2wge3tzWzAtOV0rfHZbMC05XSsuNHN9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fQorCisvLyBDSEVDSy1BUk02NC1MQUJFTDogdGVzdF92cWRtbHNsaF9zMTYKKy8vIENIRUNLLUFSTTY0OiBzcWRtdWxsIHZbW1BST0Q6WzAtOV0rXV0uNHMsIHt7dlswLTldKy40aH19LCB7e3ZbMC05XSsuNGh9fQorLy8gQ0hFQ0stQVJNNjQ6IHNxc3ViIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwgc1tbUFJPRF1dCiAgIHJldHVybiAoaW50MzJfdCl2cWRtbHNsaF9zMTYoYSwgYiwgYyk7CiB9CiAKIGludDY0X3QgdGVzdF92cWRtbHNsc19zMzIoaW50NjRfdCBhLCBpbnQzMl90IGIsIGludDMyX3QgYykgewotLy8gQ0hFQ0s6IHRlc3RfdnFkbWxzbHNfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbHNsc19zMzIKIC8vIENIRUNLOiBzcWRtbHNsIHt7ZFswLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KICAgcmV0dXJuIChpbnQ2NF90KXZxZG1sc2xzX3MzMihhLCBiLCBjKTsKIH0KIAogaW50MzJfdCB0ZXN0X3ZxZG11bGxoX3MxNihpbnQxNl90IGEsIGludDE2X3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbGhfczE2Ci0vLyBDSEVDSzogc3FkbXVsbCB7e3NbMC05XSt9fSwge3toWzAtOV0rfX0sIHt7aFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxsaF9zMTYKKy8vIENIRUNLOiBzcWRtdWxsIHt7c1swLTldK3x2WzAtOV0rLjRzfX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0KICAgcmV0dXJuIChpbnQzMl90KXZxZG11bGxoX3MxNihhLCBiKTsKIH0KIAogaW50NjRfdCB0ZXN0X3ZxZG11bGxzX3MzMihpbnQzMl90IGEsIGludDMyX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbHNfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxsc19zMzIKIC8vIENIRUNLOiBzcWRtdWxsIHt7ZFswLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KICAgcmV0dXJuIChpbnQ2NF90KXZxZG11bGxzX3MzMihhLCBiKTsKIH0KIAogaW50OF90IHRlc3RfdnFtb3Z1bmhfczE2KGludDE2X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnFtb3Z1bmhfczE2Ci0vLyBDSEVDSzogc3F4dHVuIHt7YlswLTldK319LCB7e2hbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFtb3Z1bmhfczE2CisvLyBDSEVDSzogc3F4dHVuIHt7YlswLTldK3x2WzAtOV0rLjhifX0sIHt7aFswLTldK3x2WzAtOV0rLjhofX0KICAgcmV0dXJuIChpbnQ4X3QpdnFtb3Z1bmhfczE2KGEpOwogfQogCiBpbnQxNl90IHRlc3RfdnFtb3Z1bnNfczMyKGludDMyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnFtb3Z1bnNfczMyCi0vLyBDSEVDSzogc3F4dHVuIHt7aFswLTldK319LCB7e3NbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFtb3Z1bnNfczMyCisvLyBDSEVDSzogc3F4dHVuIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7c1swLTldK3x2WzAtOV0rLjRzfX0KICAgcmV0dXJuIChpbnQxNl90KXZxbW92dW5zX3MzMihhKTsKIH0KIAogaW50MzJfdCB0ZXN0X3ZxbW92dW5kX3M2NChpbnQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxbW92dW5kX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFtb3Z1bmRfczY0CiAvLyBDSEVDSzogc3F4dHVuIHt7c1swLTldK319LCB7e2RbMC05XSt9fQogICByZXR1cm4gKGludDMyX3QpdnFtb3Z1bmRfczY0KGEpOwogfQogCiBpbnQ4X3QgdGVzdF92cW1vdm5oX3MxNihpbnQxNl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxbW92bmhfczE2Ci0vLyBDSEVDSzogc3F4dG4ge3tiWzAtOV0rfX0sIHt7aFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cW1vdm5oX3MxNgorLy8gQ0hFQ0s6IHNxeHRuIHt7YlswLTldK3x2WzAtOV0rLjhifX0sIHt7aFswLTldK3x2WzAtOV0rLjhofX0KICAgcmV0dXJuIChpbnQ4X3QpdnFtb3ZuaF9zMTYoYSk7CiB9CiAKIGludDE2X3QgdGVzdF92cW1vdm5zX3MzMihpbnQzMl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxbW92bnNfczMyCi0vLyBDSEVDSzogc3F4dG4ge3toWzAtOV0rfX0sIHt7c1swLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cW1vdm5zX3MzMgorLy8gQ0hFQ0s6IHNxeHRuIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7c1swLTldK3x2WzAtOV0rLjRzfX0KICAgcmV0dXJuIChpbnQxNl90KXZxbW92bnNfczMyKGEpOwogfQogCiBpbnQzMl90IHRlc3RfdnFtb3ZuZF9zNjQoaW50NjRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92cW1vdm5kX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFtb3ZuZF9zNjQKIC8vIENIRUNLOiBzcXh0biB7e3NbMC05XSt9fSwge3tkWzAtOV0rfX0KICAgcmV0dXJuIChpbnQzMl90KXZxbW92bmRfczY0KGEpOwogfQogCiBpbnQ4X3QgdGVzdF92cW1vdm5oX3UxNihpbnQxNl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxbW92bmhfdTE2Ci0vLyBDSEVDSzogdXF4dG4ge3tiWzAtOV0rfX0sIHt7aFswLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cW1vdm5oX3UxNgorLy8gQ0hFQ0s6IHVxeHRuIHt7YlswLTldK3x2WzAtOV0rLjhifX0sIHt7aFswLTldK3x2WzAtOV0rLjhofX0KICAgcmV0dXJuIChpbnQ4X3QpdnFtb3ZuaF91MTYoYSk7CiB9CiAKIGludDE2X3QgdGVzdF92cW1vdm5zX3UzMihpbnQzMl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZxbW92bnNfdTMyCi0vLyBDSEVDSzogdXF4dG4ge3toWzAtOV0rfX0sIHt7c1swLTldK319CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cW1vdm5zX3UzMgorLy8gQ0hFQ0s6IHVxeHRuIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7c1swLTldK3x2WzAtOV0rLjRzfX0KICAgcmV0dXJuIChpbnQxNl90KXZxbW92bnNfdTMyKGEpOwogfQogCiBpbnQzMl90IHRlc3RfdnFtb3ZuZF91NjQoaW50NjRfdCBhKSB7Ci0vLyBDSEVDSzogdGVzdF92cW1vdm5kX3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFtb3ZuZF91NjQKIC8vIENIRUNLOiB1cXh0biB7e3NbMC05XSt9fSwge3tkWzAtOV0rfX0KICAgcmV0dXJuIChpbnQzMl90KXZxbW92bmRfdTY0KGEpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjZXFzX2YzMihmbG9hdDMyX3QgYSwgZmxvYXQzMl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZXFzX2YzMgotLy8gQ0hFQ0s6IGZjbWVxIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXFzX2YzMgorLy8gQ0hFQ0s6IHt7ZmNtZXEgczAsIHMwLCBzMXxmY21wIHMwLCBzMX19CiAgIHJldHVybiAodWludDMyX3QpdmNlcXNfZjMyKGEsIGIpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjZXFkX2Y2NChmbG9hdDY0X3QgYSwgZmxvYXQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZXFkX2Y2NAotLy8gQ0hFQ0s6IGZjbWVxIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXFkX2Y2NAorLy8gQ0hFQ0s6IHt7ZmNtZXEgZDAsIGQwLCBkMXxmY21wIGQwLCBkMX19CiAgIHJldHVybiAodWludDY0X3QpdmNlcWRfZjY0KGEsIGIpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjZXF6c19mMzIoZmxvYXQzMl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6c19mMzIKLS8vIENIRUNLOiBmY21lcSB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sICMwLjAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXF6c19mMzIKKy8vIENIRUNLOiB7e2ZjbWVxIHMwLCBzMCwgIzAuMHxmY21wIHMwLCAjMC4wfX0KICAgcmV0dXJuICh1aW50MzJfdCl2Y2VxenNfZjMyKGEpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjZXF6ZF9mNjQoZmxvYXQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6ZF9mNjQKLS8vIENIRUNLOiBmY21lcSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMwLjAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXF6ZF9mNjQKKy8vIENIRUNLOiB7e2ZjbWVxIGQwLCBkMCwgIzAuMHxmY21wIGQwLCAjMC4wfX0KICAgcmV0dXJuICh1aW50NjRfdCl2Y2VxemRfZjY0KGEpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjZ2VzX2YzMihmbG9hdDMyX3QgYSwgZmxvYXQzMl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ2VzX2YzMgotLy8gQ0hFQ0s6IGZjbWdlIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VzX2YzMgorLy8gQ0hFQ0s6IHt7ZmNtZ2UgczAsIHMwLCBzMXxmY21wIHMwLCBzMX19CiAgIHJldHVybiAodWludDMyX3QpdmNnZXNfZjMyKGEsIGIpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjZ2VkX2Y2NChmbG9hdDY0X3QgYSwgZmxvYXQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ2VkX2Y2NAotLy8gQ0hFQ0s6IGZjbWdlIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2VkX2Y2NAorLy8gQ0hFQ0s6IHt7ZmNtZ2UgZDAsIGQwLCBkMXxmY21wIGQwLCBkMX19CiAgIHJldHVybiAodWludDY0X3QpdmNnZWRfZjY0KGEsIGIpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjZ2V6c19mMzIoZmxvYXQzMl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ2V6c19mMzIKLS8vIENIRUNLOiBmY21nZSB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sICMwLjAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2V6c19mMzIKKy8vIENIRUNLOiB7e2ZjbWdlIHMwLCBzMCwgIzAuMHxmY21wIHMwLCAjMC4wfX0KICAgcmV0dXJuICh1aW50MzJfdCl2Y2dlenNfZjMyKGEpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjZ2V6ZF9mNjQoZmxvYXQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ2V6ZF9mNjQKLS8vIENIRUNLOiBmY21nZSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMwLjAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2V6ZF9mNjQKKy8vIENIRUNLOiB7e2ZjbWdlIGQwLCBkMCwgIzAuMHxmY21wIGQwLCAjMC4wfX0KICAgcmV0dXJuICh1aW50NjRfdCl2Y2dlemRfZjY0KGEpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjZ3RzX2YzMihmbG9hdDMyX3QgYSwgZmxvYXQzMl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ3RzX2YzMgotLy8gQ0hFQ0s6IGZjbWd0IHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3RzX2YzMgorLy8gQ0hFQ0s6IHt7ZmNtZ3QgczAsIHMwLCBzMXxmY21wIHMwLCBzMX19CiAgIHJldHVybiAodWludDMyX3QpdmNndHNfZjMyKGEsIGIpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjZ3RkX2Y2NChmbG9hdDY0X3QgYSwgZmxvYXQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ3RkX2Y2NAotLy8gQ0hFQ0s6IGZjbWd0IHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3RkX2Y2NAorLy8gQ0hFQ0s6IHt7ZmNtZ3QgZDAsIGQwLCBkMXxmY21wIGQwLCBkMX19CiAgIHJldHVybiAodWludDY0X3QpdmNndGRfZjY0KGEsIGIpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjZ3R6c19mMzIoZmxvYXQzMl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ3R6c19mMzIKLS8vIENIRUNLOiBmY21ndCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sICMwLjAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3R6c19mMzIKKy8vIENIRUNLOiB7e2ZjbWd0IHMwLCBzMCwgIzAuMHxmY21wIHMwLCAjMC4wfX0KICAgcmV0dXJuICh1aW50MzJfdCl2Y2d0enNfZjMyKGEpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjZ3R6ZF9mNjQoZmxvYXQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjZ3R6ZF9mNjQKLS8vIENIRUNLOiBmY21ndCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMwLjAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3R6ZF9mNjQKKy8vIENIRUNLOiB7e2ZjbWd0IGQwLCBkMCwgIzAuMHxmY21wIGQwLCAjMC4wfX0KICAgcmV0dXJuICh1aW50NjRfdCl2Y2d0emRfZjY0KGEpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjbGVzX2YzMihmbG9hdDMyX3QgYSwgZmxvYXQzMl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjbGVzX2YzMgotLy8gQ0hFQ0s6IGZjbWdlIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVzX2YzMgorLy8gQ0hFQ0s6IHt7ZmNtZ2UgczAsIHMxLCBzMHxmY21wIHMwLCBzMX19CiAgIHJldHVybiAodWludDMyX3QpdmNsZXNfZjMyKGEsIGIpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjbGVkX2Y2NChmbG9hdDY0X3QgYSwgZmxvYXQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjbGVkX2Y2NAotLy8gQ0hFQ0s6IGZjbWdlIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGVkX2Y2NAorLy8gQ0hFQ0s6IHt7ZmNtZ2UgZDAsIGQxLCBkMHxmY21wIGQwLCBkMX19CiAgIHJldHVybiAodWludDY0X3QpdmNsZWRfZjY0KGEsIGIpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjbGV6c19mMzIoZmxvYXQzMl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjbGV6c19mMzIKLS8vIENIRUNLOiBmY21sZSB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sICMwLjAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGV6c19mMzIKKy8vIENIRUNLOiB7e2ZjbWxlIHMwLCBzMCwgIzAuMHxmY21wIHMwLCAjMC4wfX0KICAgcmV0dXJuICh1aW50MzJfdCl2Y2xlenNfZjMyKGEpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjbGV6ZF9mNjQoZmxvYXQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjbGV6ZF9mNjQKLS8vIENIRUNLOiBmY21sZSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMwLjAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGV6ZF9mNjQKKy8vIENIRUNLOiB7e2ZjbWxlIGQwLCBkMCwgIzAuMHxmY21wIGQwLCAjMC4wfX0KICAgcmV0dXJuICh1aW50NjRfdCl2Y2xlemRfZjY0KGEpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjbHRzX2YzMihmbG9hdDMyX3QgYSwgZmxvYXQzMl90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjbHRzX2YzMgotLy8gQ0hFQ0s6IGZjbWd0IHt7c1swLTldK319LCBzMSwgczAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRzX2YzMgorLy8gQ0hFQ0s6IHt7ZmNtZ3QgczAsIHMxLCBzMHxmY21wIHMwLCBzMX19CiAgIHJldHVybiAodWludDMyX3QpdmNsdHNfZjMyKGEsIGIpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjbHRkX2Y2NChmbG9hdDY0X3QgYSwgZmxvYXQ2NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjbHRkX2Y2NAotLy8gQ0hFQ0s6IGZjbWd0IHt7ZFswLTldK319LCBkMSwgZDAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHRkX2Y2NAorLy8gQ0hFQ0s6IHt7ZmNtZ3QgZDAsIGQxLCBkMHxmY21wIGQwLCBkMX19CiAgIHJldHVybiAodWludDY0X3QpdmNsdGRfZjY0KGEsIGIpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjbHR6c19mMzIoZmxvYXQzMl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjbHR6c19mMzIKLS8vIENIRUNLOiBmY21sdCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sICMwLjAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHR6c19mMzIKKy8vIENIRUNLOiB7e2ZjbWx0IHMwLCBzMCwgIzAuMHxmY21wIHMwLCAjMC4wfX0KICAgcmV0dXJuICh1aW50MzJfdCl2Y2x0enNfZjMyKGEpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjbHR6ZF9mNjQoZmxvYXQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjbHR6ZF9mNjQKLS8vIENIRUNLOiBmY21sdCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMwLjAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHR6ZF9mNjQKKy8vIENIRUNLOiB7e2ZjbWx0IGQwLCBkMCwgIzAuMHxmY21wIGQwLCAjMC4wfX0KICAgcmV0dXJuICh1aW50NjRfdCl2Y2x0emRfZjY0KGEpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjYWdlc19mMzIoZmxvYXQzMl90IGEsIGZsb2F0MzJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2FnZXNfZjMyCi0vLyBDSEVDSzogZmFjZ2Uge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3NbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhZ2VzX2YzMgorLy8gQ0hFQ0s6IGZhY2dlIHMwLCBzMCwgczEKICAgcmV0dXJuICh1aW50MzJfdCl2Y2FnZXNfZjMyKGEsIGIpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjYWdlZF9mNjQoZmxvYXQ2NF90IGEsIGZsb2F0NjRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2FnZWRfZjY0Ci0vLyBDSEVDSzogZmFjZ2Uge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhZ2VkX2Y2NAorLy8gQ0hFQ0s6IGZhY2dlIGQwLCBkMCwgZDEKICAgcmV0dXJuICh1aW50NjRfdCl2Y2FnZWRfZjY0KGEsIGIpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjYWd0c19mMzIoZmxvYXQzMl90IGEsIGZsb2F0MzJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2FndHNfZjMyCi0vLyBDSEVDSzogZmFjZ3Qge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3NbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhZ3RzX2YzMgorLy8gQ0hFQ0s6IGZhY2d0IHMwLCBzMCwgczEKICAgcmV0dXJuICh1aW50MzJfdCl2Y2FndHNfZjMyKGEsIGIpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjYWd0ZF9mNjQoZmxvYXQ2NF90IGEsIGZsb2F0NjRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2FndGRfZjY0Ci0vLyBDSEVDSzogZmFjZ3Qge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhZ3RkX2Y2NAorLy8gQ0hFQ0s6IGZhY2d0IGQwLCBkMCwgZDEKICAgcmV0dXJuICh1aW50NjRfdCl2Y2FndGRfZjY0KGEsIGIpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjYWxlc19mMzIoZmxvYXQzMl90IGEsIGZsb2F0MzJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2FsZXNfZjMyCi0vLyBDSEVDSzogZmFjZ2Uge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3NbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhbGVzX2YzMgorLy8gQ0hFQ0s6IGZhY2dlIHMwLCBzMSwgczAKICAgcmV0dXJuICh1aW50MzJfdCl2Y2FsZXNfZjMyKGEsIGIpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjYWxlZF9mNjQoZmxvYXQ2NF90IGEsIGZsb2F0NjRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2FsZWRfZjY0Ci0vLyBDSEVDSzogZmFjZ2Uge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhbGVkX2Y2NAorLy8gQ0hFQ0s6IGZhY2dlIGQwLCBkMSwgZDAKICAgcmV0dXJuICh1aW50NjRfdCl2Y2FsZWRfZjY0KGEsIGIpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjYWx0c19mMzIoZmxvYXQzMl90IGEsIGZsb2F0MzJfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2FsdHNfZjMyCi0vLyBDSEVDSzogZmFjZ3Qge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3NbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhbHRzX2YzMgorLy8gQ0hFQ0s6IGZhY2d0IHMwLCBzMSwgczAKICAgcmV0dXJuICh1aW50MzJfdCl2Y2FsdHNfZjMyKGEsIGIpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjYWx0ZF9mNjQoZmxvYXQ2NF90IGEsIGZsb2F0NjRfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92Y2FsdGRfZjY0Ci0vLyBDSEVDSzogZmFjZ3Qge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNhbHRkX2Y2NAorLy8gQ0hFQ0s6IGZhY2d0IGQwLCBkMSwgZDAKICAgcmV0dXJuICh1aW50NjRfdCl2Y2FsdGRfZjY0KGEsIGIpOwogfQogCiBpbnQ2NF90IHRlc3RfdnNocmRfbl9zNjQoaW50NjRfdCBhKSB7CiAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hyZF9uX3M2NAotLy8gQ0hFQ0s6IHNzaHIge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjMQorLy8gQ0hFQ0s6IHt7c3NociBkWzAtOV0rLCBkWzAtOV0rLCAjMXxhc3IgeDAsIHgwLCAjMX19CiAgIHJldHVybiAoaW50NjRfdCl2c2hyZF9uX3M2NChhLCAxKTsKIH0KIApAQCAtODczOCw3ICs4NTczLDcgQEAKIAogdWludDY0X3QgdGVzdF92c2hyZF9uX3U2NCh1aW50NjRfdCBhKSB7CiAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hyZF9uX3U2NAotLy8gQ0hFQ0s6IHVzaHIge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjNjQKKy8vIENIRUNLOiB7e3VzaHIgZFswLTldKywgZFswLTldKywgIzY0fGxzciB4MCwgeDAsICM2M319CiAgIHJldHVybiAodWludDY0X3QpdnNocmRfbl91NjQoYSwgNjQpOwogfQogCkBAIC04NzU1LDcgKzg1OTAsNyBAQAogfQogCiBpbnQ2NHgxX3QgdGVzdF92cnNocl9uX3M2NChpbnQ2NHgxX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnJzaHJfbl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc2hyX25fczY0CiAvLyBDSEVDSzogc3JzaHIgZHt7WzAtOV0rfX0sIGR7e1swLTldK319LCAjMQogICByZXR1cm4gdnJzaHJfbl9zNjQoYSwgMSk7CiB9CkBAIC04NzY3LDQzICs4NjAyLDQzIEBACiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92cnNocl9uX3U2NCh1aW50NjR4MV90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3Zyc2hyX25fdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNocl9uX3U2NAogLy8gQ0hFQ0s6IHVyc2hyIGR7e1swLTldK319LCBke3tbMC05XSt9fSwgIzEKICAgcmV0dXJuIHZyc2hyX25fdTY0KGEsIDEpOwogfQogCiBpbnQ2NF90IHRlc3RfdnNyYWRfbl9zNjQoaW50NjRfdCBhLCBpbnQ2NF90IGIpIHsKIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzcmFkX25fczY0Ci0vLyBDSEVDSzogc3NyYSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICM2MworLy8gQ0hFQ0s6IHt7c3NyYSBkWzAtOV0rLCBkWzAtOV0rLCAjNjN8YWRkIHgwLCB4MCwgeDEsIGFzciAjNjN9fQogICByZXR1cm4gKGludDY0X3QpdnNyYWRfbl9zNjQoYSwgYiwgNjMpOwogfQogCiBpbnQ2NHgxX3QgdGVzdF92c3JhX25fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnNyYV9uX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyYV9uX3M2NAogLy8gQ0hFQ0s6IHNzcmEgZHt7WzAtOV0rfX0sIGR7e1swLTldK319LCAjMQogICByZXR1cm4gdnNyYV9uX3M2NChhLCBiLCAxKTsKIH0KIAogdWludDY0X3QgdGVzdF92c3JhZF9uX3U2NCh1aW50NjRfdCBhLCB1aW50NjRfdCBiKSB7CiAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JhZF9uX3U2NAotLy8gQ0hFQ0s6IHVzcmEge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjNjMKKy8vIENIRUNLOiB7e3VzcmEgZFswLTldKywgZFswLTldKywgIzYzfGFkZCB4MCwgeDAsIHgxLCBsc3IgIzYzfX0KICAgcmV0dXJuICh1aW50NjRfdCl2c3JhZF9uX3U2NChhLCBiLCA2Myk7CiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92c3JhX25fdTY0KHVpbnQ2NHgxX3QgYSwgdWludDY0eDFfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92c3JhX25fdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JhX25fdTY0CiAvLyBDSEVDSzogdXNyYSBke3tbMC05XSt9fSwgZHt7WzAtOV0rfX0sICMxCiAgIHJldHVybiB2c3JhX25fdTY0KGEsIGIsIDEpOwogfQogCiBpbnQ2NF90IHRlc3RfdnJzcmFkX25fczY0KGludDY0X3QgYSwgaW50NjRfdCBiKSB7CiAvLyBDSEVDSy1MQUJFTDogdGVzdF92cnNyYWRfbl9zNjQKLS8vIENIRUNLOiBzcnNyYSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICM2MworLy8gQ0hFQ0s6IHt7c3JzcmEgZFswLTldKywgZFswLTldKywgIzYzfX0KICAgcmV0dXJuIChpbnQ2NF90KXZyc3JhZF9uX3M2NChhLCBiLCA2Myk7CiB9CiAKIGludDY0eDFfdCB0ZXN0X3Zyc3JhX25fczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnJzcmFfbl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3JhX25fczY0CiAvLyBDSEVDSzogc3JzcmEgZHt7WzAtOV0rfX0sIGR7e1swLTldK319LCAjMQogICByZXR1cm4gdnJzcmFfbl9zNjQoYSwgYiwgMSk7CiB9CkBAIC04ODE1LDQzICs4NjUwLDQzIEBACiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92cnNyYV9uX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnJzcmFfbl91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zyc3JhX25fdTY0CiAvLyBDSEVDSzogdXJzcmEgZHt7WzAtOV0rfX0sIGR7e1swLTldK319LCAjMQogICByZXR1cm4gdnJzcmFfbl91NjQoYSwgYiwgMSk7CiB9CiAKIGludDY0X3QgdGVzdF92c2hsZF9uX3M2NChpbnQ2NF90IGEpIHsKIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxkX25fczY0Ci0vLyBDSEVDSzogc2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzAKLSAgcmV0dXJuIChpbnQ2NF90KXZzaGxkX25fczY0KGEsIDApOworLy8gQ0hFQ0s6IHt7c2hsIGRbMC05XSssIGRbMC05XSssICMxfGxzbCB4MCwgeDAsICMxfX0KKyAgcmV0dXJuIChpbnQ2NF90KXZzaGxkX25fczY0KGEsIDEpOwogfQogaW50NjR4MV90IHRlc3RfdnNobF9uX3M2NChpbnQ2NHgxX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnNobF9uX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobF9uX3M2NAogLy8gQ0hFQ0s6IHNobCBke3tbMC05XSt9fSwgZHt7WzAtOV0rfX0sICMxCiAgIHJldHVybiB2c2hsX25fczY0KGEsIDEpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZzaGxkX25fdTY0KHVpbnQ2NF90IGEpIHsKIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxkX25fdTY0Ci0vLyBDSEVDSzogc2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzYzCisvLyBDSEVDSzoge3tzaGwgZFswLTldKywgZFswLTldKywgIzYzfGxzbCB4MCwgeDAsICM2M319CiAgIHJldHVybiAodWludDY0X3QpdnNobGRfbl91NjQoYSwgNjMpOwogfQogCiB1aW50NjR4MV90IHRlc3RfdnNobF9uX3U2NCh1aW50NjR4MV90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzaGxfbl91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxfbl91NjQKIC8vIENIRUNLOiBzaGwgZHt7WzAtOV0rfX0sIGR7e1swLTldK319LCAjMQogICByZXR1cm4gdnNobF9uX3U2NChhLCAxKTsKIH0KIAogaW50OF90IHRlc3RfdnFzaGxiX25fczgoaW50OF90IGEpIHsKIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsYl9uX3M4Ci0vLyBDSEVDSzogc3FzaGwge3tiWzAtOV0rfX0sIHt7YlswLTldK319LCAjNworLy8gQ0hFQ0s6IHNxc2hsIHt7YlswLTldK3x2WzAtOV0rLjhifX0sIHt7YlswLTldK3x2WzAtOV0rLjhifX0sICM3CiAgIHJldHVybiAoaW50OF90KXZxc2hsYl9uX3M4KGEsIDcpOwogfQogCiBpbnQxNl90IHRlc3RfdnFzaGxoX25fczE2KGludDE2X3QgYSkgewogLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxoX25fczE2Ci0vLyBDSEVDSzogc3FzaGwge3toWzAtOV0rfX0sIHt7aFswLTldK319LCAjMTUKKy8vIENIRUNLOiBzcXNobCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e2hbMC05XSt8dlswLTldKy40aH19LCAjMTUKICAgcmV0dXJuIChpbnQxNl90KXZxc2hsaF9uX3MxNihhLCAxNSk7CiB9CiAKQEAgLTg4NjcsMjEgKzg3MDIsMTA1IEBACiAgIHJldHVybiAoaW50NjRfdCl2cXNobGRfbl9zNjQoYSwgNjMpOwogfQogCitpbnQ4eDhfdCB0ZXN0X3Zxc2hsX25fczgoaW50OHg4X3QgYSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobF9uX3M4CisgIHJldHVybiB2cXNobF9uX3M4KGEsIDApOworICAvLyBDSEVDSzogc3FzaGwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMAorfQorCitpbnQ4eDE2X3QgdGVzdF92cXNobHFfbl9zOChpbnQ4eDE2X3QgYSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobHFfbl9zOAorICByZXR1cm4gdnFzaGxxX25fczgoYSwgMCk7CisgIC8vIENIRUNLOiBzcXNobCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzAKK30KKworaW50MTZ4NF90IHRlc3RfdnFzaGxfbl9zMTYoaW50MTZ4NF90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxfbl9zMTYKKyAgcmV0dXJuIHZxc2hsX25fczE2KGEsIDApOworICAvLyBDSEVDSzogc3FzaGwge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAjMAorfQorCitpbnQxNng4X3QgdGVzdF92cXNobHFfbl9zMTYoaW50MTZ4OF90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxxX25fczE2CisgIHJldHVybiB2cXNobHFfbl9zMTYoYSwgMCk7CisgIC8vIENIRUNLOiBzcXNobCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsICMwCit9CisKK2ludDMyeDJfdCB0ZXN0X3Zxc2hsX25fczMyKGludDMyeDJfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsX25fczMyCisgIHJldHVybiB2cXNobF9uX3MzMihhLCAwKTsKKyAgLy8gQ0hFQ0s6IHNxc2hsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzAKK30KKworaW50MzJ4NF90IHRlc3RfdnFzaGxxX25fczMyKGludDMyeDRfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hscV9uX3MzMgorICByZXR1cm4gdnFzaGxxX25fczMyKGEsIDApOworICAvLyBDSEVDSzogc3FzaGwge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCAjMAorfQorCitpbnQ2NHgyX3QgdGVzdF92cXNobHFfbl9zNjQoaW50NjR4Ml90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxxX25fczY0CisgIHJldHVybiB2cXNobHFfbl9zNjQoYSwgMCk7CisgIC8vIENIRUNLOiBzcXNobCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICMwCit9CisKK3VpbnQ4eDhfdCB0ZXN0X3Zxc2hsX25fdTgodWludDh4OF90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxfbl91OAorICByZXR1cm4gdnFzaGxfbl91OChhLCAwKTsKKyAgLy8gQ0hFQ0s6IHVxc2hsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgIzAKK30KKwordWludDh4MTZfdCB0ZXN0X3Zxc2hscV9uX3U4KHVpbnQ4eDE2X3QgYSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobHFfbl91OAorICByZXR1cm4gdnFzaGxxX25fdTgoYSwgMCk7CisgIC8vIENIRUNLOiB1cXNobCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzAKK30KKwordWludDE2eDRfdCB0ZXN0X3Zxc2hsX25fdTE2KHVpbnQxNng0X3QgYSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobF9uX3UxNgorICByZXR1cm4gdnFzaGxfbl91MTYoYSwgMCk7CisgIC8vIENIRUNLOiB1cXNobCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsICMwCit9CisKK3VpbnQxNng4X3QgdGVzdF92cXNobHFfbl91MTYodWludDE2eDhfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hscV9uX3UxNgorICByZXR1cm4gdnFzaGxxX25fdTE2KGEsIDApOworICAvLyBDSEVDSzogdXFzaGwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCAjMAorfQorCit1aW50MzJ4Ml90IHRlc3RfdnFzaGxfbl91MzIodWludDMyeDJfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsX25fdTMyCisgIHJldHVybiB2cXNobF9uX3UzMihhLCAwKTsKKyAgLy8gQ0hFQ0s6IHVxc2hsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzAKK30KKwordWludDMyeDRfdCB0ZXN0X3Zxc2hscV9uX3UzMih1aW50MzJ4NF90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxxX25fdTMyCisgIHJldHVybiB2cXNobHFfbl91MzIoYSwgMCk7CisgIC8vIENIRUNLOiB1cXNobCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMwCit9CisKK3VpbnQ2NHgyX3QgdGVzdF92cXNobHFfbl91NjQodWludDY0eDJfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hscV9uX3U2NAorICByZXR1cm4gdnFzaGxxX25fdTY0KGEsIDApOworICAvLyBDSEVDSzogdXFzaGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjMAorfQorCiBpbnQ2NHgxX3QgdGVzdF92cXNobF9uX3M2NChpbnQ2NHgxX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdnFzaGxfbl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsX25fczY0CiAvLyBDSEVDSzogc3FzaGwgZHt7WzAtOV0rfX0sIGR7e1swLTldK319LCAjMQogICByZXR1cm4gdnFzaGxfbl9zNjQoYSwgMSk7CiB9CiAKIHVpbnQ4X3QgdGVzdF92cXNobGJfbl91OCh1aW50OF90IGEpIHsKIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsYl9uX3U4Ci0vLyBDSEVDSzogdXFzaGwge3tiWzAtOV0rfX0sIHt7YlswLTldK319LCAjNworLy8gQ0hFQ0s6IHVxc2hsIHt7YlswLTldK3x2WzAtOV0rLjhifX0sIHt7YlswLTldK3x2WzAtOV0rLjhifX0sICM3CiAgIHJldHVybiAodWludDhfdCl2cXNobGJfbl91OChhLCA3KTsKIH0KIAogdWludDE2X3QgdGVzdF92cXNobGhfbl91MTYodWludDE2X3QgYSkgewogLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGxoX25fdTE2Ci0vLyBDSEVDSzogdXFzaGwge3toWzAtOV0rfX0sIHt7aFswLTldK319LCAjMTUKKy8vIENIRUNLOiB1cXNobCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e2hbMC05XSt8dlswLTldKy40aH19LCAjMTUKICAgcmV0dXJuICh1aW50MTZfdCl2cXNobGhfbl91MTYoYSwgMTUpOwogfQogCkBAIC04ODk4LDIwICs4ODE3LDIwIEBACiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92cXNobF9uX3U2NCh1aW50NjR4MV90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3Zxc2hsX25fdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobF9uX3U2NAogLy8gQ0hFQ0s6IHVxc2hsIGR7e1swLTldK319LCBke3tbMC05XSt9fSwgIzEKICAgcmV0dXJuIHZxc2hsX25fdTY0KGEsIDEpOwogfQogCiBpbnQ4X3QgdGVzdF92cXNobHViX25fczgoaW50OF90IGEpIHsKIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hsdWJfbl9zOAotLy8gQ0hFQ0s6IHNxc2hsdSB7e2JbMC05XSt9fSwge3tiWzAtOV0rfX0sICM3CisvLyBDSEVDSzogc3FzaGx1IHt7YlswLTldK3x2WzAtOV0rLjhifX0sIHt7YlswLTldK3x2WzAtOV0rLjhifX0sICM3CiAgIHJldHVybiAoaW50OF90KXZxc2hsdWJfbl9zOChhLCA3KTsKIH0KIAogaW50MTZfdCB0ZXN0X3Zxc2hsdWhfbl9zMTYoaW50MTZfdCBhKSB7CiAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNobHVoX25fczE2Ci0vLyBDSEVDSzogc3FzaGx1IHt7aFswLTldK319LCB7e2hbMC05XSt9fSwgIzE1CisvLyBDSEVDSzogc3FzaGx1IHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0sICMxNQogICByZXR1cm4gKGludDE2X3QpdnFzaGx1aF9uX3MxNihhLCAxNSk7CiB9CiAKQEAgLTg5MjgsNyArODg0Nyw3IEBACiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92cXNobHVfbl9zNjQoaW50NjR4MV90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3Zxc2hsdV9uX3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaGx1X25fczY0CiAvLyBDSEVDSzogc3FzaGx1IGR7e1swLTldK319LCBke3tbMC05XSt9fSwgIzEKICAgcmV0dXJuIHZxc2hsdV9uX3M2NChhLCAxKTsKIH0KQEAgLTg5NDAsNyArODg1OSw3IEBACiB9CiAKIGludDY0eDFfdCB0ZXN0X3Zzcmlfbl9zNjQoaW50NjR4MV90IGEsIGludDY0eDFfdCBiKSB7Ci0vLyBDSEVDSzogdGVzdF92c3JpX25fczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JpX25fczY0CiAvLyBDSEVDSzogc3JpIGR7e1swLTldK319LCBke3tbMC05XSt9fSwgIzEKICAgcmV0dXJuIHZzcmlfbl9zNjQoYSwgYiwgMSk7CiB9CkBAIC04OTUyLDcgKzg4NzEsNyBAQAogfQogCiB1aW50NjR4MV90IHRlc3RfdnNyaV9uX3U2NCh1aW50NjR4MV90IGEsIHVpbnQ2NHgxX3QgYikgewotLy8gQ0hFQ0s6IHRlc3RfdnNyaV9uX3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNyaV9uX3U2NAogLy8gQ0hFQ0s6IHNyaSBke3tbMC05XSt9fSwgZHt7WzAtOV0rfX0sICMxCiAgIHJldHVybiB2c3JpX25fdTY0KGEsIGIsIDEpOwogfQpAQCAtODk2NCw3ICs4ODgzLDcgQEAKIH0KIAogaW50NjR4MV90IHRlc3RfdnNsaV9uX3M2NChpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzbGlfbl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzbGlfbl9zNjQKIC8vIENIRUNLOiBzbGkgZHt7WzAtOV0rfX0sIGR7e1swLTldK319LCAjMQogICByZXR1cm4gdnNsaV9uX3M2NChhLCBiLCAxKTsKIH0KQEAgLTg5NzYsMjAgKzg4OTUsMjAgQEAKIH0KIAogdWludDY0eDFfdCB0ZXN0X3ZzbGlfbl91NjQodWludDY0eDFfdCBhLCB1aW50NjR4MV90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZzbGlfbl91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzbGlfbl91NjQKIC8vIENIRUNLOiBzbGkgZHt7WzAtOV0rfX0sIGR7e1swLTldK319LCAjMQogICByZXR1cm4gdnNsaV9uX3U2NChhLCBiLCAxKTsKIH0KIAogaW50OF90IHRlc3RfdnFzaHJuaF9uX3MxNihpbnQxNl90IGEpIHsKIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hybmhfbl9zMTYKLS8vIENIRUNLOiBzcXNocm4ge3tiWzAtOV0rfX0sIHt7aFswLTldK319LCAjOAorLy8gQ0hFQ0s6IHNxc2hybiB7e2JbMC05XSt8dlswLTldKy44Yn19LCB7e2hbMC05XSt8dlswLTldKy44aH19LCAjOAogICByZXR1cm4gKGludDhfdCl2cXNocm5oX25fczE2KGEsIDgpOwogfQogCiBpbnQxNl90IHRlc3RfdnFzaHJuc19uX3MzMihpbnQzMl90IGEpIHsKIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zxc2hybnNfbl9zMzIKLS8vIENIRUNLOiBzcXNocm4ge3toWzAtOV0rfX0sIHt7c1swLTldK319LCAjMTYKKy8vIENIRUNLOiBzcXNocm4ge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3tzWzAtOV0rfHZbMC05XSsuNHN9fSwgIzE2CiAgIHJldHVybiAoaW50MTZfdCl2cXNocm5zX25fczMyKGEsIDE2KTsKIH0KIApAQCAtOTAwMSwxMyArODkyMCwxMyBAQAogCiB1aW50OF90IHRlc3RfdnFzaHJuaF9uX3UxNih1aW50MTZfdCBhKSB7CiAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNocm5oX25fdTE2Ci0vLyBDSEVDSzogdXFzaHJuIHt7YlswLTldK319LCB7e2hbMC05XSt9fSwgIzgKKy8vIENIRUNLOiB1cXNocm4ge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3toWzAtOV0rfHZbMC05XSsuOGh9fSwgIzgKICAgcmV0dXJuICh1aW50OF90KXZxc2hybmhfbl91MTYoYSwgOCk7CiB9CiAKIHVpbnQxNl90IHRlc3RfdnFzaHJuc19uX3UzMih1aW50MzJfdCBhKSB7CiAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNocm5zX25fdTMyCi0vLyBDSEVDSzogdXFzaHJuIHt7aFswLTldK319LCB7e3NbMC05XSt9fSwgIzE2CisvLyBDSEVDSzogdXFzaHJuIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7c1swLTldK3x2WzAtOV0rLjRzfX0sICMxNgogICByZXR1cm4gKHVpbnQxNl90KXZxc2hybnNfbl91MzIoYSwgMTYpOwogfQogCkBAIC05MDE5LDEzICs4OTM4LDEzIEBACiAKIGludDhfdCB0ZXN0X3ZxcnNocm5oX25fczE2KGludDE2X3QgYSkgewogLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyc2hybmhfbl9zMTYKLS8vIENIRUNLOiBzcXJzaHJuIHt7YlswLTldK319LCB7e2hbMC05XSt9fSwgIzgKKy8vIENIRUNLOiBzcXJzaHJuIHt7YlswLTldK3x2WzAtOV0rLjhifX0sIHt7aFswLTldK3x2WzAtOV0rLjhofX0sICM4CiAgIHJldHVybiAoaW50OF90KXZxcnNocm5oX25fczE2KGEsIDgpOwogfQogCiBpbnQxNl90IHRlc3RfdnFyc2hybnNfbl9zMzIoaW50MzJfdCBhKSB7CiAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaHJuc19uX3MzMgotLy8gQ0hFQ0s6IHNxcnNocm4ge3toWzAtOV0rfX0sIHt7c1swLTldK319LCAjMTYKKy8vIENIRUNLOiBzcXJzaHJuIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7c1swLTldK3x2WzAtOV0rLjRzfX0sICMxNgogICByZXR1cm4gKGludDE2X3QpdnFyc2hybnNfbl9zMzIoYSwgMTYpOwogfQogCkBAIC05MDM3LDEzICs4OTU2LDEzIEBACiAKIHVpbnQ4X3QgdGVzdF92cXJzaHJuaF9uX3UxNih1aW50MTZfdCBhKSB7CiAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaHJuaF9uX3UxNgotLy8gQ0hFQ0s6IHVxcnNocm4ge3tiWzAtOV0rfX0sIHt7aFswLTldK319LCAjOAorLy8gQ0hFQ0s6IHVxcnNocm4ge3tiWzAtOV0rfHZbMC05XSsuOGJ9fSwge3toWzAtOV0rfHZbMC05XSsuOGh9fSwgIzgKICAgcmV0dXJuICh1aW50OF90KXZxcnNocm5oX25fdTE2KGEsIDgpOwogfQogCiB1aW50MTZfdCB0ZXN0X3ZxcnNocm5zX25fdTMyKHVpbnQzMl90IGEpIHsKIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocm5zX25fdTMyCi0vLyBDSEVDSzogdXFyc2hybiB7e2hbMC05XSt9fSwge3tzWzAtOV0rfX0sICMxNgorLy8gQ0hFQ0s6IHVxcnNocm4ge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3tzWzAtOV0rfHZbMC05XSsuNHN9fSwgIzE2CiAgIHJldHVybiAodWludDE2X3QpdnFyc2hybnNfbl91MzIoYSwgMTYpOwogfQogCkBAIC05MDU1LDEzICs4OTc0LDEzIEBACiAKIGludDhfdCB0ZXN0X3Zxc2hydW5oX25fczE2KGludDE2X3QgYSkgewogLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFzaHJ1bmhfbl9zMTYKLS8vIENIRUNLOiBzcXNocnVuIHt7YlswLTldK319LCB7e2hbMC05XSt9fSwgIzgKKy8vIENIRUNLOiBzcXNocnVuIHt7YlswLTldK3x2WzAtOV0rLjhifX0sIHt7aFswLTldK3x2WzAtOV0rLjhofX0sICM4CiAgIHJldHVybiAoaW50OF90KXZxc2hydW5oX25fczE2KGEsIDgpOwogfQogCiBpbnQxNl90IHRlc3RfdnFzaHJ1bnNfbl9zMzIoaW50MzJfdCBhKSB7CiAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXNocnVuc19uX3MzMgotLy8gQ0hFQ0s6IHNxc2hydW4ge3toWzAtOV0rfX0sIHt7c1swLTldK319LCAjMTYKKy8vIENIRUNLOiBzcXNocnVuIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7c1swLTldK3x2WzAtOV0rLjRzfX0sICMxNgogICByZXR1cm4gKGludDE2X3QpdnFzaHJ1bnNfbl9zMzIoYSwgMTYpOwogfQogCkBAIC05MDczLDEzICs4OTkyLDEzIEBACiAKIGludDhfdCB0ZXN0X3ZxcnNocnVuaF9uX3MxNihpbnQxNl90IGEpIHsKIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxcnNocnVuaF9uX3MxNgotLy8gQ0hFQ0s6IHNxcnNocnVuIHt7YlswLTldK319LCB7e2hbMC05XSt9fSwgIzgKKy8vIENIRUNLOiBzcXJzaHJ1biB7e2JbMC05XSt8dlswLTldKy44Yn19LCB7e2hbMC05XSt8dlswLTldKy44aH19LCAjOAogICByZXR1cm4gKGludDhfdCl2cXJzaHJ1bmhfbl9zMTYoYSwgOCk7CiB9CiAKIGludDE2X3QgdGVzdF92cXJzaHJ1bnNfbl9zMzIoaW50MzJfdCBhKSB7CiAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJzaHJ1bnNfbl9zMzIKLS8vIENIRUNLOiBzcXJzaHJ1biB7e2hbMC05XSt9fSwge3tzWzAtOV0rfX0sICMxNgorLy8gQ0hFQ0s6IHNxcnNocnVuIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7c1swLTldK3x2WzAtOV0rLjRzfX0sICMxNgogICByZXR1cm4gKGludDE2X3QpdnFyc2hydW5zX25fczMyKGEsIDE2KTsKIH0KIApAQCAtOTA5MCwyMjMyICs5MDA5LDIyMzIgQEAKIH0KIAogZmxvYXQzMl90IHRlc3RfdmN2dHNfbl9mMzJfczMyKGludDMyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dHNfbl9mMzJfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0c19uX2YzMl9zMzIKIC8vIENIRUNLOiBzY3Z0ZiB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sICMxCiAgIHJldHVybiB2Y3Z0c19uX2YzMl9zMzIoYSwgMSk7CiB9CiAKIGZsb2F0NjRfdCB0ZXN0X3ZjdnRkX25fZjY0X3M2NChpbnQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjdnRkX25fZjY0X3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dGRfbl9mNjRfczY0CiAvLyBDSEVDSzogc2N2dGYge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjMQogICByZXR1cm4gdmN2dGRfbl9mNjRfczY0KGEsIDEpOwogfQogCiBmbG9hdDMyX3QgdGVzdF92Y3Z0c19uX2YzMl91MzIodWludDMyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dHNfbl9mMzJfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0c19uX2YzMl91MzIKIC8vIENIRUNLOiB1Y3Z0ZiB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sICMzMgogICByZXR1cm4gdmN2dHNfbl9mMzJfdTMyKGEsIDMyKTsKIH0KIAogZmxvYXQ2NF90IHRlc3RfdmN2dGRfbl9mNjRfdTY0KHVpbnQ2NF90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjdnRkX25fZjY0X3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dGRfbl9mNjRfdTY0CiAvLyBDSEVDSzogdWN2dGYge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjNjQKICAgcmV0dXJuIHZjdnRkX25fZjY0X3U2NChhLCA2NCk7CiB9CiAKIGludDMyX3QgdGVzdF92Y3Z0c19uX3MzMl9mMzIoZmxvYXQzMl90IGEpIHsKLS8vIENIRUNLOiB0ZXN0X3ZjdnRzX25fczMyX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dHNfbl9zMzJfZjMyCiAvLyBDSEVDSzogZmN2dHpzIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwgIzEKICAgcmV0dXJuIChpbnQzMl90KXZjdnRzX25fczMyX2YzMihhLCAxKTsKIH0KIAogaW50NjRfdCB0ZXN0X3ZjdnRkX25fczY0X2Y2NChmbG9hdDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dGRfbl9zNjRfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0ZF9uX3M2NF9mNjQKIC8vIENIRUNLOiBmY3Z0enMge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjMQogICByZXR1cm4gKGludDY0X3QpdmN2dGRfbl9zNjRfZjY0KGEsIDEpOwogfQogCiB1aW50MzJfdCB0ZXN0X3ZjdnRzX25fdTMyX2YzMihmbG9hdDMyX3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dHNfbl91MzJfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0c19uX3UzMl9mMzIKIC8vIENIRUNLOiBmY3Z0enUge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCAjMzIKICAgcmV0dXJuICh1aW50MzJfdCl2Y3Z0c19uX3UzMl9mMzIoYSwgMzIpOwogfQogCiB1aW50NjRfdCB0ZXN0X3ZjdnRkX25fdTY0X2Y2NChmbG9hdDY0X3QgYSkgewotLy8gQ0hFQ0s6IHRlc3RfdmN2dGRfbl91NjRfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0ZF9uX3U2NF9mNjQKIC8vIENIRUNLOiBmY3Z0enUge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjNjQKICAgcmV0dXJuICh1aW50NjRfdCl2Y3Z0ZF9uX3U2NF9mNjQoYSwgNjQpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczhfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczhfczE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ4eDhfdCB0ZXN0X3ZyZWludGVycHJldF9zOF9zMTYoaW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zOF9zMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zOF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zOF9zMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDh4OF90IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3MzMihpbnQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3M4X3MzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfczhfczY0KGludDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczhfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczhfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zOF91ODoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfczhfdTgodWludDh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zOF91OChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3UxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfczhfdTE2KHVpbnQxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3M4X3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3UzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfczhfdTMyKHVpbnQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3M4X3UzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3U2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfczhfdTY0KHVpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3M4X3U2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M4X2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M4X2YxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfczhfZjE2KGZsb2F0MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zOF9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zOF9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zOF9mMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDh4OF90IHRlc3RfdnJlaW50ZXJwcmV0X3M4X2YzMihmbG9hdDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczhfZjMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczhfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczhfZjY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ4eDhfdCB0ZXN0X3ZyZWludGVycHJldF9zOF9mNjQoZmxvYXQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3M4X2Y2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczhfcDg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDh4OF90IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3A4KHBvbHk4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczhfcDgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zOF9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zOF9wMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDh4OF90IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3AxNihwb2x5MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zOF9wMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zOF9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zOF9wNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDh4OF90IHRlc3RfdnJlaW50ZXJwcmV0X3M4X3A2NChwb2x5NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zOF9wNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMTZfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMTZfczg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9zMTZfczgoaW50OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3MxNl9zOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MxNl9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMTZfczMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfczE2X3MzMihpbnQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3MxNl9zMzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMTZfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3MxNl9zNjQoaW50NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zMTZfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X3U4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfczE2X3U4KHVpbnQ4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczE2X3U4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MxNl91MTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9zMTZfdTE2KHVpbnQxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3MxNl91MTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMTZfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X3UzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3MxNl91MzIodWludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczE2X3UzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MxNl91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMTZfdTY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfczE2X3U2NCh1aW50NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zMTZfdTY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MxNl9mMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9zMTZfZjE2KGZsb2F0MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zMTZfZjE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MxNl9mMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9zMTZfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zMTZfZjMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MxNl9mNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9zMTZfZjY0KGZsb2F0NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zMTZfZjY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X3A4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfczE2X3A4KHBvbHk4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczE2X3A4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X3AxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MxNl9wMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9zMTZfcDE2KHBvbHkxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3MxNl9wMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMTZfcDY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczE2X3A2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3MxNl9wNjQocG9seTY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczE2X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl9zODoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl9zOChpbnQ4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczMyX3M4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczMyX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl9zMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF9zMzJfczE2KGludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczMyX3MxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfczY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQzMngyX3QgdGVzdF92cmVpbnRlcnByZXRfczMyX3M2NChpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3MzMl9zNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF9zMzJfdTgodWludDh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zMzJfdTgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczMyX3UxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl91MTYodWludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczMyX3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfdTMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQzMngyX3QgdGVzdF92cmVpbnRlcnByZXRfczMyX3UzMih1aW50MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zMzJfdTMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczMyX3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl91NjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF9zMzJfdTY0KHVpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3MzMl91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfZjE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczMyX2YxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl9mMTYoZmxvYXQxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3MzMl9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczMyX2YzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl9mMzIoZmxvYXQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3MzMl9mMzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczMyX2Y2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl9mNjQoZmxvYXQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3MzMl9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfcDgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfcDg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF9zMzJfcDgocG9seTh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zMzJfcDgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfcDE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczMyX3AxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl9wMTYocG9seTE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczMyX3AxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3MzMl9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zMzJfcDY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQzMngyX3QgdGVzdF92cmVpbnRlcnByZXRfczMyX3A2NChwb2x5NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zMzJfcDY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczY0X3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczY0X3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfczY0X3M4KGludDh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zNjRfczgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zNjRfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczY0X3MxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF9zMTYoaW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zNjRfczE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczY0X3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF9zMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF9zNjRfczMyKGludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczY0X3MzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF91ODoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF91OCh1aW50OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3M2NF91OChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zNjRfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfczY0X3UxNih1aW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zNjRfdTE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczY0X3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF91MzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF9zNjRfdTMyKHVpbnQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3M2NF91MzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zNjRfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczY0X3U2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF91NjQodWludDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczY0X3U2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF9mMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zNjRfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfczY0X2YxNihmbG9hdDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczY0X2YxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zNjRfZjMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfczY0X2YzMihmbG9hdDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczY0X2YzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zNjRfZjY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfczY0X2Y2NChmbG9hdDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfczY0X2Y2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF9wOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF9wOChwb2x5OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3M2NF9wOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9zNjRfcDE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfczY0X3AxNihwb2x5MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9zNjRfcDE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfczY0X3A2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3M2NF9wNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF9zNjRfcDY0KHBvbHk2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3M2NF9wNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91OF9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U4X3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfdThfczgoaW50OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3U4X3M4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfczE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfdThfczE2KGludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdThfczE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfczMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfdThfczMyKGludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdThfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfczY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfdThfczY0KGludDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdThfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfdThfdTE2KHVpbnQxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3U4X3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U4X3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U4X3UzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDh4OF90IHRlc3RfdnJlaW50ZXJwcmV0X3U4X3UzMih1aW50MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91OF91MzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91OF91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91OF91NjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ4eDhfdCB0ZXN0X3ZyZWludGVycHJldF91OF91NjQodWludDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdThfdTY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfZjE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfdThfZjE2KGZsb2F0MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91OF9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91OF9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91OF9mMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ4eDhfdCB0ZXN0X3ZyZWludGVycHJldF91OF9mMzIoZmxvYXQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3U4X2YzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U4X2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U4X2Y2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDh4OF90IHRlc3RfdnJlaW50ZXJwcmV0X3U4X2Y2NChmbG9hdDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdThfZjY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfcDgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91OF9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDh4OF90IHRlc3RfdnJlaW50ZXJwcmV0X3U4X3A4KHBvbHk4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdThfcDgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91OF9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91OF9wMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ4eDhfdCB0ZXN0X3ZyZWludGVycHJldF91OF9wMTYocG9seTE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdThfcDE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfcDY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdThfcDY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfdThfcDY0KHBvbHk2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3U4X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl9zODoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF91MTZfczgoaW50OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3UxNl9zOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MTZfczE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl9zMTYoaW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91MTZfczE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTE2X3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl9zMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfdTE2X3MzMihpbnQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3UxNl9zMzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MTZfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTE2X3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF91MTZfczY0KGludDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTE2X3M2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl91ODoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF91MTZfdTgodWludDh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91MTZfdTgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MTZfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTE2X3UzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF91MTZfdTMyKHVpbnQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3UxNl91MzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MTZfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTE2X3U2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF91MTZfdTY0KHVpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3UxNl91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MTZfZjE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTE2X2YxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF91MTZfZjE2KGZsb2F0MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91MTZfZjE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTE2X2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl9mMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfdTE2X2YzMihmbG9hdDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTE2X2YzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MTZfZjY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl9mNjQoZmxvYXQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3UxNl9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MTZfcDgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MTZfcDg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfdTE2X3A4KHBvbHk4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTE2X3A4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTE2X3AxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl9wMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfdTE2X3AxNihwb2x5MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91MTZfcDE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTE2X3A2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UxNl9wNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfdTE2X3A2NChwb2x5NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91MTZfcDY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTMyX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTMyX3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl9zOChpbnQ4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTMyX3M4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTMyX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl9zMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQzMngyX3QgdGVzdF92cmVpbnRlcnByZXRfdTMyX3MxNihpbnQxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3UzMl9zMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MzJfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTMyX3MzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF91MzJfczMyKGludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTMyX3MzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MzJfczY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl9zNjQoaW50NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91MzJfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTMyX3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTMyX3U4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl91OCh1aW50OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3UzMl91OChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MzJfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl91MTYodWludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTMyX3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MzJfdTY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl91NjQodWludDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTMyX3U2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl9mMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MzJfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl9mMTYoZmxvYXQxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3UzMl9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MzJfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTMyX2YzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF91MzJfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91MzJfZjMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTMyX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl9mNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQzMngyX3QgdGVzdF92cmVpbnRlcnByZXRfdTMyX2Y2NChmbG9hdDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTMyX2Y2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl9wOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3UzMl9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF91MzJfcDgocG9seTh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91MzJfcDgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MzJfcDE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTMyX3AxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF91MzJfcDE2KHBvbHkxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3UzMl9wMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91MzJfcDY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTMyX3A2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF91MzJfcDY0KHBvbHk2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3UzMl9wNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91NjRfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91NjRfczg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfdTY0X3M4KGludDh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91NjRfczgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91NjRfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTY0X3MxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF91NjRfczE2KGludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTY0X3MxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91NjRfczMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9zMzIoaW50MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91NjRfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTY0X3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9zNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfdTY0X3M2NChpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3U2NF9zNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91NjRfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91NjRfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfdTY0X3U4KHVpbnQ4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTY0X3U4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTY0X3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF91MTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfdTY0X3UxNih1aW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91NjRfdTE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTY0X3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF91MzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfdTY0X3UzMih1aW50MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91NjRfdTMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTY0X2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9mMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfdTY0X2YxNihmbG9hdDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTY0X2YxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91NjRfZjMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9mMzIoZmxvYXQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3U2NF9mMzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91NjRfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTY0X2Y2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF91NjRfZjY0KGZsb2F0NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF91NjRfZjY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTY0X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfdTY0X3A4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9wOChwb2x5OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3U2NF9wOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91NjRfcDE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9wMTYocG9seTE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTY0X3AxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF91NjRfcDY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3U2NF9wNjQocG9seTY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfdTY0X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YxNl9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YxNl9zODoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfZjE2X3M4KGludDh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mMTZfczgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjE2X3MxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfZjE2X3MxNihpbnQxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YxNl9zMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjE2X3MzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfZjE2X3MzMihpbnQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YxNl9zMzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjE2X3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfZjE2X3M2NChpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YxNl9zNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X2YxNl91OCh1aW50OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YxNl91OChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YxNl91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9mMTZfdTE2KHVpbnQxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YxNl91MTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjE2X3UzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfZjE2X3UzMih1aW50MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mMTZfdTMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjE2X3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YxNl91NjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X2YxNl91NjQodWludDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjE2X3U2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YxNl9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfZjMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9mMTZfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mMTZfZjMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjE2X2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YxNl9mNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X2YxNl9mNjQoZmxvYXQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YxNl9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfcDgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfcDg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X2YxNl9wOChwb2x5OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YxNl9wOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YxNl9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfcDE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9mMTZfcDE2KHBvbHkxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YxNl9wMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMTZfcDY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjE2X3A2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfZjE2X3A2NChwb2x5NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mMTZfcDY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjMyX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjMyX3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF9mMzJfczgoaW50OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YzMl9zOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMzJfczE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF9mMzJfczE2KGludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjMyX3MxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMzJfczMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF9mMzJfczMyKGludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjMyX3MzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMzJfczY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF9mMzJfczY0KGludDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjMyX3M2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl91ODoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQzMngyX3QgdGVzdF92cmVpbnRlcnByZXRfZjMyX3U4KHVpbnQ4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjMyX3U4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjMyX3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl91MTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl91MTYodWludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjMyX3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMzJfdTMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF9mMzJfdTMyKHVpbnQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YzMl91MzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMzJfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjMyX3U2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQzMngyX3QgdGVzdF92cmVpbnRlcnByZXRfZjMyX3U2NCh1aW50NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mMzJfdTY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjMyX2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl9mMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl9mMTYoZmxvYXQxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YzMl9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMzJfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjMyX2Y2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQzMngyX3QgdGVzdF92cmVpbnRlcnByZXRfZjMyX2Y2NChmbG9hdDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjMyX2Y2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl9wOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQzMngyX3QgdGVzdF92cmVpbnRlcnByZXRfZjMyX3A4KHBvbHk4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjMyX3A4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjMyX3AxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl9wMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0MzJ4Ml90IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl9wMTYocG9seTE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjMyX3AxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2YzMl9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mMzJfcDY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDJfdCB0ZXN0X3ZyZWludGVycHJldF9mMzJfcDY0KHBvbHk2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2YzMl9wNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mNjRfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mNjRfczg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF9zOChpbnQ4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjY0X3M4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF9zMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF9zMTYoaW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mNjRfczE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF9zMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF9zMzIoaW50MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mNjRfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF9zNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF9zNjQoaW50NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mNjRfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X3U4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF9mNjRfdTgodWludDh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mNjRfdTgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mNjRfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X3UxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfZjY0X3UxNih1aW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mNjRfdTE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF91MzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF91MzIodWludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjY0X3UzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mNjRfdTY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF9mNjRfdTY0KHVpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X2Y2NF91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mNjRfZjE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X2YxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfZjY0X2YxNihmbG9hdDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjY0X2YxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mNjRfZjMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF9mNjRfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mNjRfZjMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X3A4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF9mNjRfcDgocG9seTh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mNjRfcDgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9mNjRfcDE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X3AxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQ2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfZjY0X3AxNihwb2x5MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9mNjRfcDE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfZjY0X3A2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF9wNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X2Y2NF9wNjQocG9seTY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfZjY0X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A4X3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDhfczg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk4eDhfdCB0ZXN0X3ZyZWludGVycHJldF9wOF9zOChpbnQ4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDhfczgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF9zMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk4eDhfdCB0ZXN0X3ZyZWludGVycHJldF9wOF9zMTYoaW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wOF9zMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF9zMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk4eDhfdCB0ZXN0X3ZyZWludGVycHJldF9wOF9zMzIoaW50MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wOF9zMzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF9zNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk4eDhfdCB0ZXN0X3ZyZWludGVycHJldF9wOF9zNjQoaW50NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wOF9zNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A4X3U4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfcDhfdTgodWludDh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wOF91OChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A4X3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A4X3UxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTh4OF90IHRlc3RfdnJlaW50ZXJwcmV0X3A4X3UxNih1aW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wOF91MTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF91MzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk4eDhfdCB0ZXN0X3ZyZWludGVycHJldF9wOF91MzIodWludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDhfdTMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDhfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDhfdTY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfcDhfdTY0KHVpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3A4X3U2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A4X2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A4X2YxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTh4OF90IHRlc3RfdnJlaW50ZXJwcmV0X3A4X2YxNihmbG9hdDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDhfZjE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDhfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDhfZjMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5OHg4X3QgdGVzdF92cmVpbnRlcnByZXRfcDhfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wOF9mMzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF9mNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk4eDhfdCB0ZXN0X3ZyZWludGVycHJldF9wOF9mNjQoZmxvYXQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3A4X2Y2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A4X3AxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A4X3AxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTh4OF90IHRlc3RfdnJlaW50ZXJwcmV0X3A4X3AxNihwb2x5MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wOF9wMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wOF9wNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk4eDhfdCB0ZXN0X3ZyZWludGVycHJldF9wOF9wNjQocG9seTY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDhfcDY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDE2X3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDE2X3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl9zOChpbnQ4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDE2X3M4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDE2X3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl9zMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHkxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfcDE2X3MxNihpbnQxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3AxNl9zMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wMTZfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDE2X3MzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9wMTZfczMyKGludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDE2X3MzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wMTZfczY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl9zNjQoaW50NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wMTZfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDE2X3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDE2X3U4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl91OCh1aW50OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3AxNl91OChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wMTZfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl91MTYodWludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDE2X3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wMTZfdTMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl91MzIodWludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDE2X3UzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wMTZfdTY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl91NjQodWludDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDE2X3U2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl9mMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wMTZfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5MTZ4NF90IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl9mMTYoZmxvYXQxNng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3AxNl9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wMTZfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDE2X2YzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9wMTZfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wMTZfZjMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDE2X2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl9mNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHkxNng0X3QgdGVzdF92cmVpbnRlcnByZXRfcDE2X2Y2NChmbG9hdDY0eDFfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDE2X2Y2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl9wOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3AxNl9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9wMTZfcDgocG9seTh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wMTZfcDgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wMTZfcDY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDE2X3A2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTE2eDRfdCB0ZXN0X3ZyZWludGVycHJldF9wMTZfcDY0KHBvbHk2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3AxNl9wNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wNjRfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wNjRfczg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfcDY0X3M4KGludDh4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wNjRfczgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wNjRfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDY0X3MxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF9wNjRfczE2KGludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDY0X3MxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wNjRfczMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF9zMzIoaW50MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wNjRfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDY0X3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF9zNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfcDY0X3M2NChpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3A2NF9zNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wNjRfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wNjRfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfcDY0X3U4KHVpbnQ4eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDY0X3U4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDY0X3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF91MTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfcDY0X3UxNih1aW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wNjRfdTE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDY0X3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF91MzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfcDY0X3UzMih1aW50MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wNjRfdTMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDY0X3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF91NjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfcDY0X3U2NCh1aW50NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wNjRfdTY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDY0X2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF9mMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk2NHgxX3QgdGVzdF92cmVpbnRlcnByZXRfcDY0X2YxNihmbG9hdDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDY0X2YxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wNjRfZjMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF9mMzIoZmxvYXQzMngyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3A2NF9mMzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wNjRfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDY0X2Y2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTY0eDFfdCB0ZXN0X3ZyZWludGVycHJldF9wNjRfZjY0KGZsb2F0NjR4MV90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldF9wNjRfZjY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDY0X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRfcDY0X3A4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF9wOChwb2x5OHg4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0X3A2NF9wOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldF9wNjRfcDE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5NjR4MV90IHRlc3RfdnJlaW50ZXJwcmV0X3A2NF9wMTYocG9seTE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRfcDY0X3AxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczhfczE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ4eDE2X3QgdGVzdF92cmVpbnRlcnByZXRxX3M4X3MxNihpbnQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zOF9zMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczhfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M4X3MzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF9zMzIoaW50MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczhfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M4X3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF9zNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfczhfczY0KGludDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3M4X3M2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF91ODoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF91OCh1aW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczhfdTgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczhfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M4X3UxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF91MTYodWludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3M4X3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczhfdTMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ4eDE2X3QgdGVzdF92cmVpbnRlcnByZXRxX3M4X3UzMih1aW50MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczhfdTMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M4X3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF91NjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfczhfdTY0KHVpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zOF91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczhfZjE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M4X2YxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF9mMTYoZmxvYXQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zOF9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczhfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M4X2YzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF9mMzIoZmxvYXQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zOF9mMzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczhfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M4X2Y2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF9mNjQoZmxvYXQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zOF9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczhfcDgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczhfcDg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfczhfcDgocG9seTh4MTZfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3M4X3A4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M4X3AxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF9wMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfczhfcDE2KHBvbHkxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zOF9wMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczhfcDY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M4X3A2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF9wNjQocG9seTY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3M4X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczE2X3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3MxNl9zOChpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zMTZfczgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczE2X3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfczMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3MxNl9zMzIoaW50MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczE2X3MzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MxNl9zNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfczE2X3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zMTZfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MxNl91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfczE2X3U4KHVpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zMTZfdTgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczE2X3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3MxNl91MTYodWludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3MxNl91MTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczE2X3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfdTMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3MxNl91MzIodWludDMyeDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3MxNl91MzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczE2X3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfdTY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3MxNl91NjQodWludDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3MxNl91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczE2X2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3MxNl9mMTYoZmxvYXQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zMTZfZjE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MxNl9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczE2X2YzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MTZ4OF90IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfZjMyKGZsb2F0MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczE2X2YzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MxNl9mNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfczE2X2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3MxNl9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczE2X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MxNl9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MTZ4OF90IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfcDgocG9seTh4MTZfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3MxNl9wOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfcDE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MxNl9wMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfczE2X3AxNihwb2x5MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczE2X3AxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfcDY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MxNl9wNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfczE2X3A2NChwb2x5NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczE2X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczMyX3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX3MzMl9zOChpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zMzJfczgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczMyX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfczE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX3MzMl9zMTYoaW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczMyX3MxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MzMl9zNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfczMyX3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zMzJfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MzMl91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfczMyX3U4KHVpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zMzJfdTgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczMyX3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX3MzMl91MTYodWludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3MzMl91MTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczMyX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfdTMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX3MzMl91MzIodWludDMyeDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3MzMl91MzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczMyX3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfdTY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX3MzMl91NjQodWludDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3MzMl91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczMyX2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX3MzMl9mMTYoZmxvYXQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zMzJfZjE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MzMl9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczMyX2YzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MzJ4NF90IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfZjMyKGZsb2F0MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczMyX2YzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MzMl9mNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfczMyX2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3MzMl9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczMyX3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MzMl9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50MzJ4NF90IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfcDgocG9seTh4MTZfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3MzMl9wOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfcDE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MzMl9wMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfczMyX3AxNihwb2x5MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczMyX3AxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMzJfcDY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3MzMl9wNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfczMyX3A2NChwb2x5NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczMyX3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczY0X3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3M2NF9zOChpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zNjRfczgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczY0X3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfczE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3M2NF9zMTYoaW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczY0X3MxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M2NF9zMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfczY0X3MzMihpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zNjRfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M2NF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfczY0X3U4KHVpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zNjRfdTgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczY0X3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3M2NF91MTYodWludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3M2NF91MTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczY0X3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfdTMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3M2NF91MzIodWludDMyeDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3M2NF91MzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczY0X3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfdTY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3M2NF91NjQodWludDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3M2NF91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczY0X2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBpbnQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3M2NF9mMTYoZmxvYXQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zNjRfZjE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M2NF9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczY0X2YzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfZjMyKGZsb2F0MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczY0X2YzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M2NF9mNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfczY0X2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3M2NF9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczY0X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M2NF9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogaW50NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfcDgocG9seTh4MTZfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3M2NF9wOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfcDE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M2NF9wMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfczY0X3AxNihwb2x5MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczY0X3AxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zNjRfcDY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3M2NF9wNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfczY0X3A2NChwb2x5NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfczY0X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9zODoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfdThfczgoaW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdThfczgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdThfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U4X3MxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfdThfczE2KGludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3U4X3MxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdThfczMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9zMzIoaW50MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdThfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U4X3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9zNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ4eDE2X3QgdGVzdF92cmVpbnRlcnByZXRxX3U4X3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91OF9zNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdThfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U4X3UxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfdThfdTE2KHVpbnQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91OF91MTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdThfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U4X3UzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfdThfdTMyKHVpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91OF91MzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdThfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U4X3U2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfdThfdTY0KHVpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91OF91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdThfZjE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U4X2YxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfdThfZjE2KGZsb2F0MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdThfZjE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U4X2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9mMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ4eDE2X3QgdGVzdF92cmVpbnRlcnByZXRxX3U4X2YzMihmbG9hdDMyeDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3U4X2YzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdThfZjY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9mNjQoZmxvYXQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91OF9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdThfcDgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdThfcDg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ4eDE2X3QgdGVzdF92cmVpbnRlcnByZXRxX3U4X3A4KHBvbHk4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91OF9wOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdThfcDE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9wMTYocG9seTE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3U4X3AxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdThfcDY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV91OF9wNjQocG9seTY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3U4X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MTZfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MTZ4OF90IHRlc3RfdnJlaW50ZXJwcmV0cV91MTZfczgoaW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTE2X3M4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UxNl9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3MxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3MxNihpbnQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MTZfczE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UxNl9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3MzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3MzMihpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MTZfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UxNl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MTZfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UxNl91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MTZfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3UxNl91OCh1aW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTE2X3U4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UxNl91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3UzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3UzMih1aW50MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTE2X3UzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MTZfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UxNl91NjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3UxNl91NjQodWludDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3UxNl91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTE2X2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MTZfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MTZ4OF90IHRlc3RfdnJlaW50ZXJwcmV0cV91MTZfZjE2KGZsb2F0MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTE2X2YxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MTZfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UxNl9mMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3UxNl9mMzIoZmxvYXQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MTZfZjMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UxNl9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTE2X2Y2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfdTE2X2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3UxNl9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UxNl9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3A4KHBvbHk4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MTZfcDgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3AxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MTZfcDE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MTZ4OF90IHRlc3RfdnJlaW50ZXJwcmV0cV91MTZfcDE2KHBvbHkxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MTZfcDE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UxNl9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3A2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3A2NChwb2x5NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTE2X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MzJfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MzJ4NF90IHRlc3RfdnJlaW50ZXJwcmV0cV91MzJfczgoaW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTMyX3M4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UzMl9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3MxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3MxNihpbnQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MzJfczE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UzMl9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3MzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3MzMihpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MzJfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UzMl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MzJfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UzMl91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MzJfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX3UzMl91OCh1aW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTMyX3U4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UzMl91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3UxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3UxNih1aW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTMyX3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MzJfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UzMl91NjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX3UzMl91NjQodWludDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3UzMl91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTMyX2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MzJfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MzJ4NF90IHRlc3RfdnJlaW50ZXJwcmV0cV91MzJfZjE2KGZsb2F0MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTMyX2YxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MzJfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UzMl9mMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX3UzMl9mMzIoZmxvYXQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MzJfZjMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UzMl9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTMyX2Y2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfdTMyX2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3UzMl9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UzMl9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3A4KHBvbHk4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MzJfcDgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3AxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MzJfcDE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50MzJ4NF90IHRlc3RfdnJlaW50ZXJwcmV0cV91MzJfcDE2KHBvbHkxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MzJfcDE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3UzMl9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3A2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3A2NChwb2x5NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTMyX3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91NjRfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV91NjRfczgoaW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTY0X3M4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U2NF9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3MxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3MxNihpbnQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91NjRfczE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U2NF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3MzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3MzMihpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91NjRfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U2NF9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91NjRfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U2NF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91NjRfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3U2NF91OCh1aW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTY0X3U4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U2NF91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3UxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3UxNih1aW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTY0X3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91NjRfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U2NF91MzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3U2NF91MzIodWludDMyeDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3U2NF91MzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTY0X2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91NjRfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV91NjRfZjE2KGZsb2F0MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTY0X2YxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91NjRfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U2NF9mMzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHVpbnQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3U2NF9mMzIoZmxvYXQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91NjRfZjMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U2NF9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTY0X2Y2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfdTY0X2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3U2NF9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U2NF9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3A4KHBvbHk4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91NjRfcDgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3AxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91NjRfcDE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiB1aW50NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV91NjRfcDE2KHBvbHkxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV91NjRfcDE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U2NF9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3A2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogdWludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfdTY0X3A2NChwb2x5NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfdTY0X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMTZfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3M4KGludDh4MTZfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YxNl9zOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMTZfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YxNl9zMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0MTZ4OF90IHRlc3RfdnJlaW50ZXJwcmV0cV9mMTZfczE2KGludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YxNl9zMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMTZfczMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3MzMihpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mMTZfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YxNl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX2YxNl9zNjQoaW50NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjE2X3M2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMTZfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3U4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3U4KHVpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mMTZfdTgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMTZfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3UxNih1aW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjE2X3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMTZfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YxNl91MzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0MTZ4OF90IHRlc3RfdnJlaW50ZXJwcmV0cV9mMTZfdTMyKHVpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mMTZfdTMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YxNl91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3U2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX2YxNl91NjQodWludDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YxNl91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjE2X2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMTZfZjMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfZjE2X2YzMihmbG9hdDMyeDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YxNl9mMzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjE2X2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMTZfZjY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfZjE2X2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YxNl9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YxNl9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX2YxNl9wOChwb2x5OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjE2X3A4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YxNl9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3AxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX2YxNl9wMTYocG9seTE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YxNl9wMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3A2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMTZfcDY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfZjE2X3A2NChwb2x5NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjE2X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3M4KGludDh4MTZfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YzMl9zOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YzMl9zMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0MzJ4NF90IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfczE2KGludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YzMl9zMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfczMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3MzMihpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mMzJfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YzMl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX2YzMl9zNjQoaW50NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjMyX3M2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3U4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3U4KHVpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mMzJfdTgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3UxNih1aW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjMyX3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YzMl91MzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0MzJ4NF90IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfdTMyKHVpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mMzJfdTMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YzMl91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3U2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX2YzMl91NjQodWludDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YzMl91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfZjMyX2YxNihmbG9hdDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YzMl9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfZjY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfZjMyX2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YzMl9mNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YzMl9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX2YzMl9wOChwb2x5OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjMyX3A4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2YzMl9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3AxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQzMng0X3QgdGVzdF92cmVpbnRlcnByZXRxX2YzMl9wMTYocG9seTE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2YzMl9wMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3A2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfcDY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3A2NChwb2x5NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjMyX3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3M4KGludDh4MTZfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2Y2NF9zOChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2Y2NF9zMTY6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfczE2KGludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2Y2NF9zMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfczMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3MzMihpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mNjRfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2Y2NF9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX2Y2NF9zNjQoaW50NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjY0X3M2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3U4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3U4KHVpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mNjRfdTgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3UxNih1aW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjY0X3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2Y2NF91MzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIGZsb2F0NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfdTMyKHVpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9mNjRfdTMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2Y2NF91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3U2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX2Y2NF91NjQodWludDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2Y2NF91NjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X2YxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfZjY0X2YxNihmbG9hdDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2Y2NF9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfZjMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfZjY0X2YzMihmbG9hdDMyeDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2Y2NF9mMzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2Y2NF9wODoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX2Y2NF9wOChwb2x5OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjY0X3A4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX2Y2NF9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3AxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogZmxvYXQ2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX2Y2NF9wMTYocG9seTE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX2Y2NF9wMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3A2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfcDY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBmbG9hdDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3A2NChwb2x5NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfZjY0X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9zOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9zODoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfcDhfczgoaW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDhfczgoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A4X3MxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfcDhfczE2KGludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3A4X3MxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfczMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9zMzIoaW50MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDhfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A4X3M2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9zNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk4eDE2X3QgdGVzdF92cmVpbnRlcnByZXRxX3A4X3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wOF9zNjQoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk4eDE2X3QgdGVzdF92cmVpbnRlcnByZXRxX3A4X3U4KHVpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wOF91OChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfdTE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF91MTYodWludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3A4X3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfdTMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF91MzIodWludDMyeDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3A4X3UzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfdTY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF91NjQodWludDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3A4X3U2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9mMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfZjE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9mMTYoZmxvYXQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wOF9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A4X2YzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfcDhfZjMyKGZsb2F0MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDhfZjMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A4X2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9mNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk4eDE2X3QgdGVzdF92cmVpbnRlcnByZXRxX3A4X2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3A4X2Y2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfcDE2OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9wMTYocG9seTE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3A4X3AxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfcDY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5OHgxNl90IHRlc3RfdnJlaW50ZXJwcmV0cV9wOF9wNjQocG9seTY0eDJfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3A4X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTZfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5MTZ4OF90IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTZfczgoaW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDE2X3M4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxNl9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3MxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3MxNihpbnQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wMTZfczE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxNl9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3MzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3MzMihpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wMTZfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxNl9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wMTZfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxNl91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTZfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHkxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3AxNl91OCh1aW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDE2X3U4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxNl91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3UxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3UxNih1aW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDE2X3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTZfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxNl91MzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHkxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3AxNl91MzIodWludDMyeDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3AxNl91MzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTZfdTY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5MTZ4OF90IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTZfdTY0KHVpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wMTZfdTY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxNl9mMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDE2X2YxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDE2X2YxNihmbG9hdDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3AxNl9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDE2X2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTZfZjMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5MTZ4OF90IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTZfZjMyKGZsb2F0MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDE2X2YzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTZfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxNl9mNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHkxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3AxNl9mNjQoZmxvYXQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wMTZfZjY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxNl9wOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTZfcDg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHkxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3AxNl9wOChwb2x5OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDE2X3A4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxNl9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3A2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3A2NChwb2x5NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDE2X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wNjRfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3M4OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV9wNjRfczgoaW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDY0X3M4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A2NF9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3MxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3MxNihpbnQxNng4X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wNjRfczE2KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A2NF9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3MzMjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3MzMihpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wNjRfczMyKGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A2NF9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3M2NDoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wNjRfczY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A2NF91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wNjRfdTg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3A2NF91OCh1aW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDY0X3U4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A2NF91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3UxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3UxNih1aW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDY0X3UxNihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wNjRfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A2NF91MzI6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3A2NF91MzIodWludDMyeDRfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3A2NF91MzIoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3U2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wNjRfdTY0OgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV9wNjRfdTY0KHVpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wNjRfdTY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A2NF9mMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDY0X2YxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfcDY0X2YxNihmbG9hdDE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmVpbnRlcnByZXRxX3A2NF9mMTYoYSk7CiB9CiAKLS8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDY0X2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wNjRfZjMyOgogLy8gQ0hFQ0stTkVYVDogcmV0CiBwb2x5NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV9wNjRfZjMyKGZsb2F0MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDY0X2YzMihhKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wNjRfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A2NF9mNjQ6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3A2NF9mNjQoZmxvYXQ2NHgyX3QgYSkgewogICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wNjRfZjY0KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A2NF9wOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wNjRfcDg6CiAvLyBDSEVDSy1ORVhUOiByZXQKIHBvbHk2NHgyX3QgdGVzdF92cmVpbnRlcnByZXRxX3A2NF9wOChwb2x5OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDY0X3A4KGEpOwogfQogCi0vLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A2NF9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3AxNjoKIC8vIENIRUNLLU5FWFQ6IHJldAogcG9seTY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfcDY0X3AxNihwb2x5MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZWludGVycHJldHFfcDY0X3AxNihhKTsKQEAgLTExMzQ1LDYgKzExMjY0LDQ4IEBACiAgIC8vIENIRUNLOiB1c3FhZGQgZHt7WzAtOV0rfX0sIGR7e1swLTldK319CiB9CiAKK3VpbnQ4eDhfdCB0ZXN0X3ZzcWFkZF91OCh1aW50OHg4X3QgYSwgaW50OHg4X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3FhZGRfdTgKKyAgcmV0dXJuIHZzcWFkZF91OChhLCBiKTsKKyAgLy8gQ0hFQ0s6IHVzcWFkZCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKK30KKwordWludDh4MTZfdCB0ZXN0X3ZzcWFkZHFfdTgodWludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3FhZGRxX3U4CisgIHJldHVybiB2c3FhZGRxX3U4KGEsIGIpOworICAvLyBDSEVDSzogdXNxYWRkIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCit9CisKK3VpbnQxNng0X3QgdGVzdF92c3FhZGRfdTE2KHVpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNxYWRkX3UxNgorICByZXR1cm4gdnNxYWRkX3UxNihhLCBiKTsKKyAgLy8gQ0hFQ0s6IHVzcWFkZCB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKK30KKwordWludDE2eDhfdCB0ZXN0X3ZzcWFkZHFfdTE2KHVpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNxYWRkcV91MTYKKyAgcmV0dXJuIHZzcWFkZHFfdTE2KGEsIGIpOworICAvLyBDSEVDSzogdXNxYWRkIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAorfQorCit1aW50MzJ4Ml90IHRlc3RfdnNxYWRkX3UzMih1aW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzcWFkZF91MzIKKyAgcmV0dXJuIHZzcWFkZF91MzIoYSwgYik7CisgIC8vIENIRUNLOiB1c3FhZGQge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCit9CisKK3VpbnQzMng0X3QgdGVzdF92c3FhZGRxX3UzMih1aW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzcWFkZHFfdTMyCisgIHJldHVybiB2c3FhZGRxX3UzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IHVzcWFkZCB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKK30KKwordWludDY0eDJfdCB0ZXN0X3ZzcWFkZHFfdTY0KHVpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNxYWRkcV91NjQKKyAgcmV0dXJuIHZzcWFkZHFfdTY0KGEsIGIpOworICAvLyBDSEVDSzogdXNxYWRkIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAorfQorCiBpbnQ2NHgxX3QgdGVzdF92YWJzX3M2NChpbnQ2NHgxX3QgYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJzX3M2NAogICByZXR1cm4gdmFic19zNjQoYSk7CkBAIC0xMTU1OSwxMyArMTE1MjAsMTMgQEAKIGludDY0eDFfdCB0ZXN0X3ZjdnRfczY0X2Y2NChmbG9hdDY0eDFfdCBhKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRfczY0X2Y2NAogICByZXR1cm4gdmN2dF9zNjRfZjY0KGEpOwotICAvLyBDSEVDSzogZmN2dHpzIGR7e1swLTldK319LCBke3tbMC05XSt9fQorICAvLyBDSEVDSzogZmN2dHpzIHt7W3hkXVswLTldK319LCBke3tbMC05XSt9fQogfQogCiB1aW50NjR4MV90IHRlc3RfdmN2dF91NjRfZjY0KGZsb2F0NjR4MV90IGEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dF91NjRfZjY0CiAgIHJldHVybiB2Y3Z0X3U2NF9mNjQoYSk7Ci0gIC8vIENIRUNLOiBmY3Z0enUgZHt7WzAtOV0rfX0sIGR7e1swLTldK319CisgIC8vIENIRUNLOiBmY3Z0enUge3tbeGRdWzAtOV0rfX0sIGR7e1swLTldK319CiB9CiAKIGludDY0eDFfdCB0ZXN0X3ZjdnRuX3M2NF9mNjQoZmxvYXQ2NHgxX3QgYSkgewpAQCAtMTE2MTksMTMgKzExNTgwLDEzIEBACiBmbG9hdDY0eDFfdCB0ZXN0X3ZjdnRfZjY0X3M2NChpbnQ2NHgxX3QgYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0X2Y2NF9zNjQKICAgcmV0dXJuIHZjdnRfZjY0X3M2NChhKTsKLSAgLy8gQ0hFQ0s6IHNjdnRmIGR7e1swLTldK319LCBke3tbMC05XSt9fQorICAvLyBDSEVDSzogc2N2dGYgZHt7WzAtOV0rfX0sIHt7W3hkXVswLTldK319CiB9CiAKIGZsb2F0NjR4MV90IHRlc3RfdmN2dF9mNjRfdTY0KHVpbnQ2NHgxX3QgYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0X2Y2NF91NjQKICAgcmV0dXJuIHZjdnRfZjY0X3U2NChhKTsKLSAgLy8gQ0hFQ0s6IHVjdnRmIGR7e1swLTldK319LCBke3tbMC05XSt9fQorICAvLyBDSEVDSzogdWN2dGYgZHt7WzAtOV0rfX0sIHt7W3hkXVswLTldK319CiB9CiAKIGludDY0eDFfdCB0ZXN0X3ZjdnRfbl9zNjRfZjY0KGZsb2F0NjR4MV90IGEpIHsKQEAgLTExNzIzLDMgKzExNjg0LDUxIEBACiAgIHJldHVybiB2cnNxcnRzX2Y2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IGZyc3FydHMgZHt7WzAtOV0rfX0sIGR7e1swLTldK319LCBke3tbMC05XSt9fQogfQorCitpbnQzMl90IHRlc3Rfdm1pbnZfczMyKGludDMyeDJfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtaW52X3MzMgorICByZXR1cm4gdm1pbnZfczMyKGEpOworICAvLyBDSEVDSzogc21pbnAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworfQorCit1aW50MzJfdCB0ZXN0X3ZtaW52X3UzMih1aW50MzJ4Ml90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1pbnZfdTMyCisgIHJldHVybiB2bWludl91MzIoYSk7CisgIC8vIENIRUNLOiB1bWlucCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCit9CisKK2ludDMyX3QgdGVzdF92bWF4dl9zMzIoaW50MzJ4Ml90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1heHZfczMyCisgIHJldHVybiB2bWF4dl9zMzIoYSk7CisgIC8vIENIRUNLOiBzbWF4cCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzCit9CisKK3VpbnQzMl90IHRlc3Rfdm1heHZfdTMyKHVpbnQzMngyX3QgYSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bWF4dl91MzIKKyAgcmV0dXJuIHZtYXh2X3UzMihhKTsKKyAgLy8gQ0hFQ0s6IHVtYXhwIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKK30KKworaW50MzJfdCB0ZXN0X3ZhZGR2X3MzMihpbnQzMngyX3QgYSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkdl9zMzIKKyAgcmV0dXJuIHZhZGR2X3MzMihhKTsKKyAgLy8gQ0hFQ0s6IGFkZHAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycworfQorCit1aW50MzJfdCB0ZXN0X3ZhZGR2X3UzMih1aW50MzJ4Ml90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZHZfdTMyCisgIHJldHVybiB2YWRkdl91MzIoYSk7CisgIC8vIENIRUNLOiBhZGRwIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMKK30KKworaW50NjRfdCB0ZXN0X3ZhZGRsdl9zMzIoaW50MzJ4Ml90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFkZGx2X3MzMgorICByZXR1cm4gdmFkZGx2X3MzMihhKTsKKyAgLy8gQ0hFQ0s6IHNhZGRscCB7e3ZbMC05XSt9fS4xZCwge3t2WzAtOV0rfX0uMnMKK30KKwordWludDY0X3QgdGVzdF92YWRkbHZfdTMyKHVpbnQzMngyX3QgYSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWRkbHZfdTMyCisgIHJldHVybiB2YWRkbHZfdTMyKGEpOworICAvLyBDSEVDSzogdWFkZGxwIHt7dlswLTldK319LjFkLCB7e3ZbMC05XSt9fS4ycworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1sZC1zaWRlZWZmZWN0LmMgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWxkLXNpZGVlZmZlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTYwMTMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1sZC1zaWRlZWZmZWN0LmMKQEAgLTAsMCArMSwxNCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NC1ub25lLWxpbnV4LWdudSAtdGFyZ2V0LWZlYXR1cmUgK25lb24gXAorLy8gUlVOOiAgIC1lbWl0LWxsdm0gLU8wIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK3ZvaWQgKmZvbyh2b2lkKTsKKworZmxvYXQzMngyX3QgYmFyKHZvaWQpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEBiYXIKKyAgcmV0dXJuIHZsZDFfZjMyKGZvbygpKTsKKyAgLy8gQ0hFQ0s6IGNhbGwgaTgqIEBmb28KKyAgLy8gQ0hFQ0stTk9UOiBjYWxsIGk4KiBAZm9vCisgIC8vIENIRUNLOiBjYWxsIDwyIHggZmxvYXQ+IEBsbHZtLmFybS5uZW9uLnZsZDEKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tbGRzdC1vbmUuYyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tbGRzdC1vbmUuYwppbmRleCBmNjI5MjYwLi4yZDYzNjI4IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLWxkc3Qtb25lLmMKKysrIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1sZHN0LW9uZS5jCkBAIC0xLDIwNDcgKzEsMjA1MiBAQAogLy8gUkVRVUlSRVM6IGFhcmNoNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBhcm02NC1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NC1ub25lLWxpbnV4LWdudSAtdGFyZ2V0LWZlYXR1cmUgK25lb24gXAogLy8gUlVOOiAgIC1mZnAtY29udHJhY3Q9ZmFzdCAtUyAtTzMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtbm9uZS1saW51eC1nbnUgXAorLy8gUlVOOiAgIC1mZnAtY29udHJhY3Q9ZmFzdCAtUyAtTzMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiAjaW5jbHVkZSA8YXJtX25lb24uaD4KIAotdWludDh4MTZfdCB0ZXN0X3ZsZDFxX2R1cF91OCh1aW50OF90IGNvbnN0ICphKSB7Cit1aW50OHgxNl90IHRlc3RfdmxkMXFfZHVwX3U4KHVpbnQ4X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2R1cF91OAogICByZXR1cm4gdmxkMXFfZHVwX3U4KGEpOwotICAvLyBDSEVDSzogbGQxciB7dnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxciB7e3sgKnZbMC05XSsuMTZiICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDE2eDhfdCB0ZXN0X3ZsZDFxX2R1cF91MTYodWludDE2X3QgY29uc3QgKmEpIHsKK3VpbnQxNng4X3QgdGVzdF92bGQxcV9kdXBfdTE2KHVpbnQxNl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9kdXBfdTE2CiAgIHJldHVybiB2bGQxcV9kdXBfdTE2KGEpOwotICAvLyBDSEVDSzogbGQxciB7dnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDFyIHt7eyAqdlswLTldKy44aCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQzMng0X3QgdGVzdF92bGQxcV9kdXBfdTMyKHVpbnQzMl90IGNvbnN0ICphKSB7Cit1aW50MzJ4NF90IHRlc3RfdmxkMXFfZHVwX3UzMih1aW50MzJfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZHVwX3UzMgogICByZXR1cm4gdmxkMXFfZHVwX3UzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxciB7e3sgKnZbMC05XSsuNHMgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50NjR4Ml90IHRlc3RfdmxkMXFfZHVwX3U2NCh1aW50NjRfdCBjb25zdCAqYSkgewordWludDY0eDJfdCB0ZXN0X3ZsZDFxX2R1cF91NjQodWludDY0X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2R1cF91NjQKICAgcmV0dXJuIHZsZDFxX2R1cF91NjQoYSk7Ci0gIC8vIENIRUNLOiBsZDFyIHt2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMXIge3t7ICp2WzAtOV0rLjJkICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50OHgxNl90IHRlc3RfdmxkMXFfZHVwX3M4KGludDhfdCBjb25zdCAqYSkgeworaW50OHgxNl90IHRlc3RfdmxkMXFfZHVwX3M4KGludDhfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZHVwX3M4CiAgIHJldHVybiB2bGQxcV9kdXBfczgoYSk7Ci0gIC8vIENIRUNLOiBsZDFyIHt2e3tbMC05XSt9fS4xNmJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDFyIHt7eyAqdlswLTldKy4xNmIgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQxNng4X3QgdGVzdF92bGQxcV9kdXBfczE2KGludDE2X3QgY29uc3QgKmEpIHsKK2ludDE2eDhfdCB0ZXN0X3ZsZDFxX2R1cF9zMTYoaW50MTZfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZHVwX3MxNgogICByZXR1cm4gdmxkMXFfZHVwX3MxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxciB7e3sgKnZbMC05XSsuOGggKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQzMng0X3QgdGVzdF92bGQxcV9kdXBfczMyKGludDMyX3QgY29uc3QgKmEpIHsKK2ludDMyeDRfdCB0ZXN0X3ZsZDFxX2R1cF9zMzIoaW50MzJfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZHVwX3MzMgogICByZXR1cm4gdmxkMXFfZHVwX3MzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxciB7e3sgKnZbMC05XSsuNHMgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ2NHgyX3QgdGVzdF92bGQxcV9kdXBfczY0KGludDY0X3QgY29uc3QgKmEpIHsKK2ludDY0eDJfdCB0ZXN0X3ZsZDFxX2R1cF9zNjQoaW50NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZHVwX3M2NAogICByZXR1cm4gdmxkMXFfZHVwX3M2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxciB7e3sgKnZbMC05XSsuMmQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDE2eDhfdCB0ZXN0X3ZsZDFxX2R1cF9mMTYoZmxvYXQxNl90IGNvbnN0ICphKSB7CitmbG9hdDE2eDhfdCB0ZXN0X3ZsZDFxX2R1cF9mMTYoZmxvYXQxNl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9kdXBfZjE2CiAgIHJldHVybiB2bGQxcV9kdXBfZjE2KGEpOwotICAvLyBDSEVDSzogbGQxciB7dnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDFyIHt7eyAqdlswLTldKy44aCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MzJ4NF90IHRlc3RfdmxkMXFfZHVwX2YzMihmbG9hdDMyX3QgY29uc3QgKmEpIHsKK2Zsb2F0MzJ4NF90IHRlc3RfdmxkMXFfZHVwX2YzMihmbG9hdDMyX3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2R1cF9mMzIKICAgcmV0dXJuIHZsZDFxX2R1cF9mMzIoYSk7Ci0gIC8vIENIRUNLOiBsZDFyIHt2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMXIge3t7ICp2WzAtOV0rLjRzICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotZmxvYXQ2NHgyX3QgdGVzdF92bGQxcV9kdXBfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSkgeworZmxvYXQ2NHgyX3QgdGVzdF92bGQxcV9kdXBfZjY0KGZsb2F0NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZHVwX2Y2NAogICByZXR1cm4gdmxkMXFfZHVwX2Y2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxciB7e3sgKnZbMC05XSsuMmQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5OHgxNl90IHRlc3RfdmxkMXFfZHVwX3A4KHBvbHk4X3QgY29uc3QgKmEpIHsKK3BvbHk4eDE2X3QgdGVzdF92bGQxcV9kdXBfcDgocG9seThfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfZHVwX3A4CiAgIHJldHVybiB2bGQxcV9kdXBfcDgoYSk7Ci0gIC8vIENIRUNLOiBsZDFyIHt2e3tbMC05XSt9fS4xNmJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDFyIHt7eyAqdlswLTldKy4xNmIgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5MTZ4OF90IHRlc3RfdmxkMXFfZHVwX3AxNihwb2x5MTZfdCBjb25zdCAqYSkgeworcG9seTE2eDhfdCB0ZXN0X3ZsZDFxX2R1cF9wMTYocG9seTE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2R1cF9wMTYKICAgcmV0dXJuIHZsZDFxX2R1cF9wMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDFyIHt2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMXIge3t7ICp2WzAtOV0rLjhoICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTY0eDJfdCB0ZXN0X3ZsZDFxX2R1cF9wNjQocG9seTY0X3QgY29uc3QgKmEpIHsKK3BvbHk2NHgyX3QgdGVzdF92bGQxcV9kdXBfcDY0KHBvbHk2NF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9kdXBfcDY0CiAgIHJldHVybiB2bGQxcV9kdXBfcDY0KGEpOwotICAvLyBDSEVDSzogbGQxciB7dnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDFyIHt7eyAqdlswLTldKy4yZCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQ4eDhfdCB0ZXN0X3ZsZDFfZHVwX3U4KHVpbnQ4X3QgY29uc3QgKmEpIHsKK3VpbnQ4eDhfdCB0ZXN0X3ZsZDFfZHVwX3U4KHVpbnQ4X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfZHVwX3U4CiAgIHJldHVybiB2bGQxX2R1cF91OChhKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjhifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxciB7e3sgKnZbMC05XSsuOGIgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MTZ4NF90IHRlc3RfdmxkMV9kdXBfdTE2KHVpbnQxNl90IGNvbnN0ICphKSB7Cit1aW50MTZ4NF90IHRlc3RfdmxkMV9kdXBfdTE2KHVpbnQxNl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2R1cF91MTYKICAgcmV0dXJuIHZsZDFfZHVwX3UxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxciB7e3sgKnZbMC05XSsuNGggKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MzJ4Ml90IHRlc3RfdmxkMV9kdXBfdTMyKHVpbnQzMl90IGNvbnN0ICphKSB7Cit1aW50MzJ4Ml90IHRlc3RfdmxkMV9kdXBfdTMyKHVpbnQzMl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2R1cF91MzIKICAgcmV0dXJuIHZsZDFfZHVwX3UzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxciB7e3sgKnZbMC05XSsuMnMgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50NjR4MV90IHRlc3RfdmxkMV9kdXBfdTY0KHVpbnQ2NF90IGNvbnN0ICphKSB7Cit1aW50NjR4MV90IHRlc3RfdmxkMV9kdXBfdTY0KHVpbnQ2NF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2R1cF91NjQKICAgcmV0dXJuIHZsZDFfZHVwX3U2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDFyIHt2WzAtOV0rLjFkfXxsZHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDh4OF90IHRlc3RfdmxkMV9kdXBfczgoaW50OF90IGNvbnN0ICphKSB7CitpbnQ4eDhfdCB0ZXN0X3ZsZDFfZHVwX3M4KGludDhfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9kdXBfczgKICAgcmV0dXJuIHZsZDFfZHVwX3M4KGEpOwotICAvLyBDSEVDSzogbGQxciB7dnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDFyIHt7eyAqdlswLTldKy44YiAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDE2eDRfdCB0ZXN0X3ZsZDFfZHVwX3MxNihpbnQxNl90IGNvbnN0ICphKSB7CitpbnQxNng0X3QgdGVzdF92bGQxX2R1cF9zMTYoaW50MTZfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9kdXBfczE2CiAgIHJldHVybiB2bGQxX2R1cF9zMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDFyIHt2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMXIge3t7ICp2WzAtOV0rLjRoICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50MzJ4Ml90IHRlc3RfdmxkMV9kdXBfczMyKGludDMyX3QgY29uc3QgKmEpIHsKK2ludDMyeDJfdCB0ZXN0X3ZsZDFfZHVwX3MzMihpbnQzMl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2R1cF9zMzIKICAgcmV0dXJuIHZsZDFfZHVwX3MzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxciB7e3sgKnZbMC05XSsuMnMgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ2NHgxX3QgdGVzdF92bGQxX2R1cF9zNjQoaW50NjRfdCBjb25zdCAqYSkgeworaW50NjR4MV90IHRlc3RfdmxkMV9kdXBfczY0KGludDY0X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfZHVwX3M2NAogICByZXR1cm4gdmxkMV9kdXBfczY0KGEpOwotICAvLyBDSEVDSzogbGQxciB7dnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMXIge3ZbMC05XSsuMWR9fGxkciBkWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotZmxvYXQxNng0X3QgdGVzdF92bGQxX2R1cF9mMTYoZmxvYXQxNl90IGNvbnN0ICphKSB7CitmbG9hdDE2eDRfdCB0ZXN0X3ZsZDFfZHVwX2YxNihmbG9hdDE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfZHVwX2YxNgogICByZXR1cm4gdmxkMV9kdXBfZjE2KGEpOwotICAvLyBDSEVDSzogbGQxciB7dnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDFyIHt7eyAqdlswLTldKy40aCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MzJ4Ml90IHRlc3RfdmxkMV9kdXBfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSkgeworZmxvYXQzMngyX3QgdGVzdF92bGQxX2R1cF9mMzIoZmxvYXQzMl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2R1cF9mMzIKICAgcmV0dXJuIHZsZDFfZHVwX2YzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxciB7e3sgKnZbMC05XSsuMnMgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDY0eDFfdCB0ZXN0X3ZsZDFfZHVwX2Y2NChmbG9hdDY0X3QgY29uc3QgKmEpIHsKK2Zsb2F0NjR4MV90IHRlc3RfdmxkMV9kdXBfZjY0KGZsb2F0NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9kdXBfZjY0CiAgIHJldHVybiB2bGQxX2R1cF9mNjQoYSk7Ci0gIC8vIENIRUNLOiBsZDFyIHt2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxciB7dlswLTldKy4xZH18bGRyIGRbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5OHg4X3QgdGVzdF92bGQxX2R1cF9wOChwb2x5OF90IGNvbnN0ICphKSB7Citwb2x5OHg4X3QgdGVzdF92bGQxX2R1cF9wOChwb2x5OF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2R1cF9wOAogICByZXR1cm4gdmxkMV9kdXBfcDgoYSk7Ci0gIC8vIENIRUNLOiBsZDFyIHt2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMXIge3t7ICp2WzAtOV0rLjhiICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTE2eDRfdCB0ZXN0X3ZsZDFfZHVwX3AxNihwb2x5MTZfdCBjb25zdCAqYSkgeworcG9seTE2eDRfdCB0ZXN0X3ZsZDFfZHVwX3AxNihwb2x5MTZfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9kdXBfcDE2CiAgIHJldHVybiB2bGQxX2R1cF9wMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDFyIHt2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMXIge3t7ICp2WzAtOV0rLjRoICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTY0eDFfdCB0ZXN0X3ZsZDFfZHVwX3A2NChwb2x5NjRfdCBjb25zdCAqYSkgeworcG9seTY0eDFfdCB0ZXN0X3ZsZDFfZHVwX3A2NChwb2x5NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9kdXBfcDY0CiAgIHJldHVybiB2bGQxX2R1cF9wNjQoYSk7Ci0gIC8vIENIRUNLOiBsZDFyIHt2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxciB7dlswLTldKy4xZH18bGRyIGRbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50OHgxNngyX3QgdGVzdF92bGQycV9kdXBfdTgodWludDhfdCBjb25zdCAqYSkgewordWludDh4MTZ4Ml90IHRlc3RfdmxkMnFfZHVwX3U4KHVpbnQ4X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX2R1cF91OAogICByZXR1cm4gdmxkMnFfZHVwX3U4KGEpOwotICAvLyBDSEVDSzogbGQyciB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDJyIHt7eyAqdlswLTldKy4xNmIsIHZbMC05XSsuMTZiICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDE2eDh4Ml90IHRlc3RfdmxkMnFfZHVwX3UxNih1aW50MTZfdCBjb25zdCAqYSkgewordWludDE2eDh4Ml90IHRlc3RfdmxkMnFfZHVwX3UxNih1aW50MTZfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMnFfZHVwX3UxNgogICByZXR1cm4gdmxkMnFfZHVwX3UxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkMnIge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMnIge3t7ICp2WzAtOV0rLjhoLCB2WzAtOV0rLjhoICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDMyeDR4Ml90IHRlc3RfdmxkMnFfZHVwX3UzMih1aW50MzJfdCBjb25zdCAqYSkgewordWludDMyeDR4Ml90IHRlc3RfdmxkMnFfZHVwX3UzMih1aW50MzJfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMnFfZHVwX3UzMgogICByZXR1cm4gdmxkMnFfZHVwX3UzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMnIge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMnIge3t7ICp2WzAtOV0rLjRzLCB2WzAtOV0rLjRzICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDY0eDJ4Ml90IHRlc3RfdmxkMnFfZHVwX3U2NCh1aW50NjRfdCBjb25zdCAqYSkgewordWludDY0eDJ4Ml90IHRlc3RfdmxkMnFfZHVwX3U2NCh1aW50NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMnFfZHVwX3U2NAogICByZXR1cm4gdmxkMnFfZHVwX3U2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMnIge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMnIge3t7ICp2WzAtOV0rLjJkLCB2WzAtOV0rLjJkICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50OHgxNngyX3QgdGVzdF92bGQycV9kdXBfczgoaW50OF90IGNvbnN0ICphKSB7CitpbnQ4eDE2eDJfdCB0ZXN0X3ZsZDJxX2R1cF9zOChpbnQ4X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX2R1cF9zOAogICByZXR1cm4gdmxkMnFfZHVwX3M4KGEpOwotICAvLyBDSEVDSzogbGQyciB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDJyIHt7eyAqdlswLTldKy4xNmIsIHZbMC05XSsuMTZiICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50MTZ4OHgyX3QgdGVzdF92bGQycV9kdXBfczE2KGludDE2X3QgY29uc3QgKmEpIHsKK2ludDE2eDh4Ml90IHRlc3RfdmxkMnFfZHVwX3MxNihpbnQxNl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9kdXBfczE2CiAgIHJldHVybiB2bGQycV9kdXBfczE2KGEpOwotICAvLyBDSEVDSzogbGQyciB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyciB7e3sgKnZbMC05XSsuOGgsIHZbMC05XSsuOGggKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQzMng0eDJfdCB0ZXN0X3ZsZDJxX2R1cF9zMzIoaW50MzJfdCBjb25zdCAqYSkgeworaW50MzJ4NHgyX3QgdGVzdF92bGQycV9kdXBfczMyKGludDMyX3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX2R1cF9zMzIKICAgcmV0dXJuIHZsZDJxX2R1cF9zMzIoYSk7Ci0gIC8vIENIRUNLOiBsZDJyIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDJyIHt7eyAqdlswLTldKy40cywgdlswLTldKy40cyAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDY0eDJ4Ml90IHRlc3RfdmxkMnFfZHVwX3M2NChpbnQ2NF90IGNvbnN0ICphKSB7CitpbnQ2NHgyeDJfdCB0ZXN0X3ZsZDJxX2R1cF9zNjQoaW50NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMnFfZHVwX3M2NAogICByZXR1cm4gdmxkMnFfZHVwX3M2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMnIge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMnIge3t7ICp2WzAtOV0rLjJkLCB2WzAtOV0rLjJkICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotZmxvYXQxNng4eDJfdCB0ZXN0X3ZsZDJxX2R1cF9mMTYoZmxvYXQxNl90IGNvbnN0ICphKSB7CitmbG9hdDE2eDh4Ml90IHRlc3RfdmxkMnFfZHVwX2YxNihmbG9hdDE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX2R1cF9mMTYKICAgcmV0dXJuIHZsZDJxX2R1cF9mMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDJyIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDJyIHt7eyAqdlswLTldKy44aCwgdlswLTldKy44aCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MzJ4NHgyX3QgdGVzdF92bGQycV9kdXBfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSkgeworZmxvYXQzMng0eDJfdCB0ZXN0X3ZsZDJxX2R1cF9mMzIoZmxvYXQzMl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9kdXBfZjMyCiAgIHJldHVybiB2bGQycV9kdXBfZjMyKGEpOwotICAvLyBDSEVDSzogbGQyciB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyciB7e3sgKnZbMC05XSsuNHMsIHZbMC05XSsuNHMgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDY0eDJ4Ml90IHRlc3RfdmxkMnFfZHVwX2Y2NChmbG9hdDY0X3QgY29uc3QgKmEpIHsKK2Zsb2F0NjR4MngyX3QgdGVzdF92bGQycV9kdXBfZjY0KGZsb2F0NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMnFfZHVwX2Y2NAogICByZXR1cm4gdmxkMnFfZHVwX2Y2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMnIge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMnIge3t7ICp2WzAtOV0rLjJkLCB2WzAtOV0rLjJkICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTh4MTZ4Ml90IHRlc3RfdmxkMnFfZHVwX3A4KHBvbHk4X3QgY29uc3QgKmEpIHsKK3BvbHk4eDE2eDJfdCB0ZXN0X3ZsZDJxX2R1cF9wOChwb2x5OF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9kdXBfcDgKICAgcmV0dXJuIHZsZDJxX2R1cF9wOChhKTsKLSAgLy8gQ0hFQ0s6IGxkMnIge3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyciB7e3sgKnZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHkxNng4eDJfdCB0ZXN0X3ZsZDJxX2R1cF9wMTYocG9seTE2X3QgY29uc3QgKmEpIHsKK3BvbHkxNng4eDJfdCB0ZXN0X3ZsZDJxX2R1cF9wMTYocG9seTE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX2R1cF9wMTYKICAgcmV0dXJuIHZsZDJxX2R1cF9wMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDJyIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDJyIHt7eyAqdlswLTldKy44aCwgdlswLTldKy44aCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHk2NHgyeDJfdCB0ZXN0X3ZsZDJxX2R1cF9wNjQocG9seTY0X3QgY29uc3QgKmEpIHsKK3BvbHk2NHgyeDJfdCB0ZXN0X3ZsZDJxX2R1cF9wNjQocG9seTY0X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJxX2R1cF9wNjQKICAgcmV0dXJuIHZsZDJxX2R1cF9wNjQoYSk7Ci0gIC8vIENIRUNLOiBsZDJyIHt2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDJyIHt7eyAqdlswLTldKy4yZCwgdlswLTldKy4yZCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQ4eDh4Ml90IHRlc3RfdmxkMl9kdXBfdTgodWludDhfdCBjb25zdCAqYSkgewordWludDh4OHgyX3QgdGVzdF92bGQyX2R1cF91OCh1aW50OF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX2R1cF91OAogICByZXR1cm4gdmxkMl9kdXBfdTgoYSk7Ci0gIC8vIENIRUNLOiBsZDJyIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDJyIHt7eyAqdlswLTldKy44YiwgdlswLTldKy44YiAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQxNng0eDJfdCB0ZXN0X3ZsZDJfZHVwX3UxNih1aW50MTZfdCBjb25zdCAqYSkgewordWludDE2eDR4Ml90IHRlc3RfdmxkMl9kdXBfdTE2KHVpbnQxNl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX2R1cF91MTYKICAgcmV0dXJuIHZsZDJfZHVwX3UxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkMnIge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMnIge3t7ICp2WzAtOV0rLjRoLCB2WzAtOV0rLjRoICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDMyeDJ4Ml90IHRlc3RfdmxkMl9kdXBfdTMyKHVpbnQzMl90IGNvbnN0ICphKSB7Cit1aW50MzJ4MngyX3QgdGVzdF92bGQyX2R1cF91MzIodWludDMyX3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfZHVwX3UzMgogICByZXR1cm4gdmxkMl9kdXBfdTMyKGEpOwotICAvLyBDSEVDSzogbGQyciB7dnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyciB7e3sgKnZbMC05XSsuMnMsIHZbMC05XSsuMnMgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50NjR4MXgyX3QgdGVzdF92bGQyX2R1cF91NjQodWludDY0X3QgY29uc3QgKmEpIHsKK3VpbnQ2NHgxeDJfdCB0ZXN0X3ZsZDJfZHVwX3U2NCh1aW50NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl9kdXBfdTY0CiAgIHJldHVybiB2bGQyX2R1cF91NjQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxfGxkMnJ9fSB7e3sgKnZbMC05XSsuMWQsIHZbMC05XSsuMWQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ4eDh4Ml90IHRlc3RfdmxkMl9kdXBfczgoaW50OF90IGNvbnN0ICphKSB7CitpbnQ4eDh4Ml90IHRlc3RfdmxkMl9kdXBfczgoaW50OF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX2R1cF9zOAogICByZXR1cm4gdmxkMl9kdXBfczgoYSk7Ci0gIC8vIENIRUNLOiBsZDJyIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDJyIHt7eyAqdlswLTldKy44YiwgdlswLTldKy44YiAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDE2eDR4Ml90IHRlc3RfdmxkMl9kdXBfczE2KGludDE2X3QgY29uc3QgKmEpIHsKK2ludDE2eDR4Ml90IHRlc3RfdmxkMl9kdXBfczE2KGludDE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfZHVwX3MxNgogICByZXR1cm4gdmxkMl9kdXBfczE2KGEpOwotICAvLyBDSEVDSzogbGQyciB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyciB7e3sgKnZbMC05XSsuNGgsIHZbMC05XSsuNGggKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQzMngyeDJfdCB0ZXN0X3ZsZDJfZHVwX3MzMihpbnQzMl90IGNvbnN0ICphKSB7CitpbnQzMngyeDJfdCB0ZXN0X3ZsZDJfZHVwX3MzMihpbnQzMl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX2R1cF9zMzIKICAgcmV0dXJuIHZsZDJfZHVwX3MzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkMnIge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yc30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMnIge3t7ICp2WzAtOV0rLjJzLCB2WzAtOV0rLjJzICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50NjR4MXgyX3QgdGVzdF92bGQyX2R1cF9zNjQoaW50NjRfdCBjb25zdCAqYSkgeworaW50NjR4MXgyX3QgdGVzdF92bGQyX2R1cF9zNjQoaW50NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl9kdXBfczY0CiAgIHJldHVybiB2bGQyX2R1cF9zNjQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxfGxkMnJ9fSB7e3sgKnZbMC05XSsuMWQsIHZbMC05XSsuMWQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDE2eDR4Ml90IHRlc3RfdmxkMl9kdXBfZjE2KGZsb2F0MTZfdCBjb25zdCAqYSkgeworZmxvYXQxNng0eDJfdCB0ZXN0X3ZsZDJfZHVwX2YxNihmbG9hdDE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfZHVwX2YxNgogICByZXR1cm4gdmxkMl9kdXBfZjE2KGEpOwotICAvLyBDSEVDSzogbGQyciB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyciB7e3sgKnZbMC05XSsuNGgsIHZbMC05XSsuNGggKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDMyeDJ4Ml90IHRlc3RfdmxkMl9kdXBfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSkgeworZmxvYXQzMngyeDJfdCB0ZXN0X3ZsZDJfZHVwX2YzMihmbG9hdDMyX3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfZHVwX2YzMgogICByZXR1cm4gdmxkMl9kdXBfZjMyKGEpOwotICAvLyBDSEVDSzogbGQyciB7dnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyciB7e3sgKnZbMC05XSsuMnMsIHZbMC05XSsuMnMgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDY0eDF4Ml90IHRlc3RfdmxkMl9kdXBfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSkgeworZmxvYXQ2NHgxeDJfdCB0ZXN0X3ZsZDJfZHVwX2Y2NChmbG9hdDY0X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfZHVwX2Y2NAogICByZXR1cm4gdmxkMl9kdXBfZjY0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMXxsZDJyfX0ge3t7ICp2WzAtOV0rLjFkLCB2WzAtOV0rLjFkICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTh4OHgyX3QgdGVzdF92bGQyX2R1cF9wOChwb2x5OF90IGNvbnN0ICphKSB7Citwb2x5OHg4eDJfdCB0ZXN0X3ZsZDJfZHVwX3A4KHBvbHk4X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfZHVwX3A4CiAgIHJldHVybiB2bGQyX2R1cF9wOChhKTsKLSAgLy8gQ0hFQ0s6IGxkMnIge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMnIge3t7ICp2WzAtOV0rLjhiLCB2WzAtOV0rLjhiICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTE2eDR4Ml90IHRlc3RfdmxkMl9kdXBfcDE2KHBvbHkxNl90IGNvbnN0ICphKSB7Citwb2x5MTZ4NHgyX3QgdGVzdF92bGQyX2R1cF9wMTYocG9seTE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfZHVwX3AxNgogICByZXR1cm4gdmxkMl9kdXBfcDE2KGEpOwotICAvLyBDSEVDSzogbGQyciB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyciB7e3sgKnZbMC05XSsuNGgsIHZbMC05XSsuNGggKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5NjR4MXgyX3QgdGVzdF92bGQyX2R1cF9wNjQocG9seTY0X3QgY29uc3QgKmEpIHsKK3BvbHk2NHgxeDJfdCB0ZXN0X3ZsZDJfZHVwX3A2NChwb2x5NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl9kdXBfcDY0CiAgIHJldHVybiB2bGQyX2R1cF9wNjQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHt7bGQxfGxkMnJ9fSB7e3sgKnZbMC05XSsuMWQsIHZbMC05XSsuMWQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50OHgxNngzX3QgdGVzdF92bGQzcV9kdXBfdTgodWludDhfdCBjb25zdCAqYSkgewordWludDh4MTZ4M190IHRlc3RfdmxkM3FfZHVwX3U4KHVpbnQ4X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2R1cF91OAogICByZXR1cm4gdmxkM3FfZHVwX3U4KGEpOwotICAvLyBDSEVDSzogbGQzciB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yn0sCisgIC8vIENIRUNLOiBsZDNyIHt7eyAqdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiAqfX19LAogICAvLyBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQxNng4eDNfdCB0ZXN0X3ZsZDNxX2R1cF91MTYodWludDE2X3QgY29uc3QgKmEpIHsKK3VpbnQxNng4eDNfdCB0ZXN0X3ZsZDNxX2R1cF91MTYodWludDE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2R1cF91MTYKICAgcmV0dXJuIHZsZDNxX2R1cF91MTYoYSk7Ci0gIC8vIENIRUNLOiBsZDNyIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhofSwKKyAgLy8gQ0hFQ0s6IGxkM3Ige3t7ICp2WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoICp9fX0sCiAgIC8vIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDMyeDR4M190IHRlc3RfdmxkM3FfZHVwX3UzMih1aW50MzJfdCBjb25zdCAqYSkgewordWludDMyeDR4M190IHRlc3RfdmxkM3FfZHVwX3UzMih1aW50MzJfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfZHVwX3UzMgogICByZXR1cm4gdmxkM3FfZHVwX3UzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkM3Ige3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LAorICAvLyBDSEVDSzogbGQzciB7e3sgKnZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMgKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi11aW50NjR4MngzX3QgdGVzdF92bGQzcV9kdXBfdTY0KHVpbnQ2NF90IGNvbnN0ICphKSB7Cit1aW50NjR4MngzX3QgdGVzdF92bGQzcV9kdXBfdTY0KHVpbnQ2NF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9kdXBfdTY0CiAgIHJldHVybiB2bGQzcV9kdXBfdTY0KGEpOwotICAvLyBDSEVDSzogbGQzciB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZH0sCisgIC8vIENIRUNLOiBsZDNyIHt7eyAqdlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTldKy4yZCAqfX19LAogICAvLyBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDh4MTZ4M190IHRlc3RfdmxkM3FfZHVwX3M4KGludDhfdCBjb25zdCAqYSkgeworaW50OHgxNngzX3QgdGVzdF92bGQzcV9kdXBfczgoaW50OF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9kdXBfczgKICAgcmV0dXJuIHZsZDNxX2R1cF9zOChhKTsKLSAgLy8gQ0hFQ0s6IGxkM3Ige3Z7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmJ9LAorICAvLyBDSEVDSzogbGQzciB7e3sgKnZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQxNng4eDNfdCB0ZXN0X3ZsZDNxX2R1cF9zMTYoaW50MTZfdCBjb25zdCAqYSkgeworaW50MTZ4OHgzX3QgdGVzdF92bGQzcV9kdXBfczE2KGludDE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2R1cF9zMTYKICAgcmV0dXJuIHZsZDNxX2R1cF9zMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDNyIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhofSwKKyAgLy8gQ0hFQ0s6IGxkM3Ige3t7ICp2WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoICp9fX0sCiAgIC8vIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50MzJ4NHgzX3QgdGVzdF92bGQzcV9kdXBfczMyKGludDMyX3QgY29uc3QgKmEpIHsKK2ludDMyeDR4M190IHRlc3RfdmxkM3FfZHVwX3MzMihpbnQzMl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9kdXBfczMyCiAgIHJldHVybiB2bGQzcV9kdXBfczMyKGEpOwotICAvLyBDSEVDSzogbGQzciB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40c30sCisgIC8vIENIRUNLOiBsZDNyIHt7eyAqdlswLTldKy40cywgdlswLTldKy40cywgdlswLTldKy40cyAqfX19LAogICAvLyBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDY0eDJ4M190IHRlc3RfdmxkM3FfZHVwX3M2NChpbnQ2NF90IGNvbnN0ICphKSB7CitpbnQ2NHgyeDNfdCB0ZXN0X3ZsZDNxX2R1cF9zNjQoaW50NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfZHVwX3M2NAogICByZXR1cm4gdmxkM3FfZHVwX3M2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkM3Ige3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LAorICAvLyBDSEVDSzogbGQzciB7e3sgKnZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDE2eDh4M190IHRlc3RfdmxkM3FfZHVwX2YxNihmbG9hdDE2X3QgY29uc3QgKmEpIHsKK2Zsb2F0MTZ4OHgzX3QgdGVzdF92bGQzcV9kdXBfZjE2KGZsb2F0MTZfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfZHVwX2YxNgogICByZXR1cm4gdmxkM3FfZHVwX2YxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkM3Ige3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGh9LAorICAvLyBDSEVDSzogbGQzciB7e3sgKnZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDMyeDR4M190IHRlc3RfdmxkM3FfZHVwX2YzMihmbG9hdDMyX3QgY29uc3QgKmEpIHsKK2Zsb2F0MzJ4NHgzX3QgdGVzdF92bGQzcV9kdXBfZjMyKGZsb2F0MzJfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfZHVwX2YzMgogICByZXR1cm4gdmxkM3FfZHVwX2YzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkM3Ige3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHN9LAorICAvLyBDSEVDSzogbGQzciB7e3sgKnZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMgKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDY0eDJ4M190IHRlc3RfdmxkM3FfZHVwX2Y2NChmbG9hdDY0X3QgY29uc3QgKmEpIHsKK2Zsb2F0NjR4MngzX3QgdGVzdF92bGQzcV9kdXBfZjY0KGZsb2F0NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfZHVwX2Y2NAogICByZXR1cm4gdmxkM3FfZHVwX2Y2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkM3Ige3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LAorICAvLyBDSEVDSzogbGQzciB7e3sgKnZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5OHgxNngzX3QgdGVzdF92bGQzcV9kdXBfcDgocG9seThfdCBjb25zdCAqYSkgeworcG9seTh4MTZ4M190IHRlc3RfdmxkM3FfZHVwX3A4KHBvbHk4X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2R1cF9wOAogICByZXR1cm4gdmxkM3FfZHVwX3A4KGEpOwotICAvLyBDSEVDSzogbGQzciB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yn0sCisgIC8vIENIRUNLOiBsZDNyIHt7eyAqdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiAqfX19LAogICAvLyBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHkxNng4eDNfdCB0ZXN0X3ZsZDNxX2R1cF9wMTYocG9seTE2X3QgY29uc3QgKmEpIHsKK3BvbHkxNng4eDNfdCB0ZXN0X3ZsZDNxX2R1cF9wMTYocG9seTE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2R1cF9wMTYKICAgcmV0dXJuIHZsZDNxX2R1cF9wMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDNyIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhofSwKKyAgLy8gQ0hFQ0s6IGxkM3Ige3t7ICp2WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoICp9fX0sCiAgIC8vIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTY0eDJ4M190IHRlc3RfdmxkM3FfZHVwX3A2NChwb2x5NjRfdCBjb25zdCAqYSkgeworcG9seTY0eDJ4M190IHRlc3RfdmxkM3FfZHVwX3A2NChwb2x5NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfZHVwX3A2NAogICByZXR1cm4gdmxkM3FfZHVwX3A2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkM3Ige3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmR9LAorICAvLyBDSEVDSzogbGQzciB7e3sgKnZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi11aW50OHg4eDNfdCB0ZXN0X3ZsZDNfZHVwX3U4KHVpbnQ4X3QgY29uc3QgKmEpIHsKK3VpbnQ4eDh4M190IHRlc3RfdmxkM19kdXBfdTgodWludDhfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19kdXBfdTgKICAgcmV0dXJuIHZsZDNfZHVwX3U4KGEpOwotICAvLyBDSEVDSzogbGQzciB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yn0sCisgIC8vIENIRUNLOiBsZDNyIHt7eyAqdlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiAqfX19LAogICAvLyBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQxNng0eDNfdCB0ZXN0X3ZsZDNfZHVwX3UxNih1aW50MTZfdCBjb25zdCAqYSkgewordWludDE2eDR4M190IHRlc3RfdmxkM19kdXBfdTE2KHVpbnQxNl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2R1cF91MTYKICAgcmV0dXJuIHZsZDNfZHVwX3UxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkM3Ige3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LAorICAvLyBDSEVDSzogbGQzciB7e3sgKnZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGggKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MzJ4MngzX3QgdGVzdF92bGQzX2R1cF91MzIodWludDMyX3QgY29uc3QgKmEpIHsKK3VpbnQzMngyeDNfdCB0ZXN0X3ZsZDNfZHVwX3UzMih1aW50MzJfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19kdXBfdTMyCiAgIHJldHVybiB2bGQzX2R1cF91MzIoYSk7Ci0gIC8vIENIRUNLOiBsZDNyIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzfSwKKyAgLy8gQ0hFQ0s6IGxkM3Ige3t7ICp2WzAtOV0rLjJzLCB2WzAtOV0rLjJzLCB2WzAtOV0rLjJzICp9fX0sCiAgIC8vIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDY0eDF4M190IHRlc3RfdmxkM19kdXBfdTY0KHVpbnQ2NF90IGNvbnN0ICphKSB7Cit1aW50NjR4MXgzX3QgdGVzdF92bGQzX2R1cF91NjQodWludDY0X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNfZHVwX3U2NAogICByZXR1cm4gdmxkM19kdXBfdTY0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwKKyAgLy8gQ0hFQ0s6IHt7bGQxfGxkM3J9fSB7e3sgKnZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ4eDh4M190IHRlc3RfdmxkM19kdXBfczgoaW50OF90IGNvbnN0ICphKSB7CitpbnQ4eDh4M190IHRlc3RfdmxkM19kdXBfczgoaW50OF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2R1cF9zOAogICByZXR1cm4gdmxkM19kdXBfczgoYSk7Ci0gIC8vIENIRUNLOiBsZDNyIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhifSwKKyAgLy8gQ0hFQ0s6IGxkM3Ige3t7ICp2WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiICp9fX0sCiAgIC8vIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50MTZ4NHgzX3QgdGVzdF92bGQzX2R1cF9zMTYoaW50MTZfdCBjb25zdCAqYSkgeworaW50MTZ4NHgzX3QgdGVzdF92bGQzX2R1cF9zMTYoaW50MTZfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19kdXBfczE2CiAgIHJldHVybiB2bGQzX2R1cF9zMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDNyIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwKKyAgLy8gQ0hFQ0s6IGxkM3Ige3t7ICp2WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoICp9fX0sCiAgIC8vIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50MzJ4MngzX3QgdGVzdF92bGQzX2R1cF9zMzIoaW50MzJfdCBjb25zdCAqYSkgeworaW50MzJ4MngzX3QgdGVzdF92bGQzX2R1cF9zMzIoaW50MzJfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19kdXBfczMyCiAgIHJldHVybiB2bGQzX2R1cF9zMzIoYSk7Ci0gIC8vIENIRUNLOiBsZDNyIHt2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzfSwKKyAgLy8gQ0hFQ0s6IGxkM3Ige3t7ICp2WzAtOV0rLjJzLCB2WzAtOV0rLjJzLCB2WzAtOV0rLjJzICp9fX0sCiAgIC8vIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50NjR4MXgzX3QgdGVzdF92bGQzX2R1cF9zNjQoaW50NjRfdCBjb25zdCAqYSkgeworaW50NjR4MXgzX3QgdGVzdF92bGQzX2R1cF9zNjQoaW50NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19kdXBfczY0CiAgIHJldHVybiB2bGQzX2R1cF9zNjQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWR9LAorICAvLyBDSEVDSzoge3tsZDF8bGQzcn19IHt7eyAqdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCAqfX19LAogICAvLyBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MTZ4NHgzX3QgdGVzdF92bGQzX2R1cF9mMTYoZmxvYXQxNl90IGNvbnN0ICphKSB7CitmbG9hdDE2eDR4M190IHRlc3RfdmxkM19kdXBfZjE2KGZsb2F0MTZfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19kdXBfZjE2CiAgIHJldHVybiB2bGQzX2R1cF9mMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDNyIHt2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRofSwKKyAgLy8gQ0hFQ0s6IGxkM3Ige3t7ICp2WzAtOV0rLjRoLCB2WzAtOV0rLjRoLCB2WzAtOV0rLjRoICp9fX0sCiAgIC8vIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotZmxvYXQzMngyeDNfdCB0ZXN0X3ZsZDNfZHVwX2YzMihmbG9hdDMyX3QgY29uc3QgKmEpIHsKK2Zsb2F0MzJ4MngzX3QgdGVzdF92bGQzX2R1cF9mMzIoZmxvYXQzMl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2R1cF9mMzIKICAgcmV0dXJuIHZsZDNfZHVwX2YzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkM3Ige3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnN9LAorICAvLyBDSEVDSzogbGQzciB7e3sgKnZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDY0eDF4M190IHRlc3RfdmxkM19kdXBfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSkgeworZmxvYXQ2NHgxeDNfdCB0ZXN0X3ZsZDNfZHVwX2Y2NChmbG9hdDY0X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNfZHVwX2Y2NAogICByZXR1cm4gdmxkM19kdXBfZjY0KGEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkfSwKKyAgLy8gQ0hFQ0s6IHt7bGQxfGxkM3J9fSB7e3sgKnZbMC05XSsuMWQsIHZbMC05XSsuMWQsIHZbMC05XSsuMWQgKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5OHg4eDNfdCB0ZXN0X3ZsZDNfZHVwX3A4KHBvbHk4X3QgY29uc3QgKmEpIHsKK3BvbHk4eDh4M190IHRlc3RfdmxkM19kdXBfcDgocG9seThfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19kdXBfcDgKICAgcmV0dXJuIHZsZDNfZHVwX3A4KGEpOwotICAvLyBDSEVDSzogbGQzciB7dnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yn0sCisgIC8vIENIRUNLOiBsZDNyIHt7eyAqdlswLTldKy44YiwgdlswLTldKy44YiwgdlswLTldKy44YiAqfX19LAogICAvLyBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHkxNng0eDNfdCB0ZXN0X3ZsZDNfZHVwX3AxNihwb2x5MTZfdCBjb25zdCAqYSkgeworcG9seTE2eDR4M190IHRlc3RfdmxkM19kdXBfcDE2KHBvbHkxNl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2R1cF9wMTYKICAgcmV0dXJuIHZsZDNfZHVwX3AxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkM3Ige3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGh9LAorICAvLyBDSEVDSzogbGQzciB7e3sgKnZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGggKn19fSwKICAgLy8gW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5NjR4MXgzX3QgdGVzdF92bGQzX2R1cF9wNjQocG9seTY0X3QgY29uc3QgKmEpIHsKK3BvbHk2NHgxeDNfdCB0ZXN0X3ZsZDNfZHVwX3A2NChwb2x5NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19kdXBfcDY0CiAgIHJldHVybiB2bGQzX2R1cF9wNjQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWR9LAorICAvLyBDSEVDSzoge3tsZDF8bGQzcn19IHt7eyAqdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCAqfX19LAogICAvLyBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQ4eDE2eDRfdCB0ZXN0X3ZsZDRxX2R1cF91OCh1aW50OF90IGNvbnN0ICphKSB7Cit1aW50OHgxNng0X3QgdGVzdF92bGQ0cV9kdXBfdTgodWludDhfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfZHVwX3U4CiAgIHJldHVybiB2bGQ0cV9kdXBfdTgoYSk7Ci0gIC8vIENIRUNLOiBsZDRyIHt2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLAotICAvLyB2e3tbMC05XSt9fS4xNmJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDRyIHt7eyAqdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MTZ4OHg0X3QgdGVzdF92bGQ0cV9kdXBfdTE2KHVpbnQxNl90IGNvbnN0ICphKSB7Cit1aW50MTZ4OHg0X3QgdGVzdF92bGQ0cV9kdXBfdTE2KHVpbnQxNl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0cV9kdXBfdTE2CiAgIHJldHVybiB2bGQ0cV9kdXBfdTE2KGEpOwotICAvLyBDSEVDSzogbGQ0ciB7dnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwKLSAgLy8gdnt7WzAtOV0rfX0uOGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDRyIHt7eyAqdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCwgdlswLTldKy44aCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQzMng0eDRfdCB0ZXN0X3ZsZDRxX2R1cF91MzIodWludDMyX3QgY29uc3QgKmEpIHsKK3VpbnQzMng0eDRfdCB0ZXN0X3ZsZDRxX2R1cF91MzIodWludDMyX3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX2R1cF91MzIKICAgcmV0dXJuIHZsZDRxX2R1cF91MzIoYSk7Ci0gIC8vIENIRUNLOiBsZDRyIHt2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLAotICAvLyB2e3tbMC05XSt9fS40c30sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNHIge3t7ICp2WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzLCB2WzAtOV0rLjRzICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDY0eDJ4NF90IHRlc3RfdmxkNHFfZHVwX3U2NCh1aW50NjRfdCBjb25zdCAqYSkgewordWludDY0eDJ4NF90IHRlc3RfdmxkNHFfZHVwX3U2NCh1aW50NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfZHVwX3U2NAogICByZXR1cm4gdmxkNHFfZHVwX3U2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkNHIge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsCi0gIC8vIHZ7e1swLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ4eDE2eDRfdCB0ZXN0X3ZsZDRxX2R1cF9zOChpbnQ4X3QgY29uc3QgKmEpIHsKK2ludDh4MTZ4NF90IHRlc3RfdmxkNHFfZHVwX3M4KGludDhfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfZHVwX3M4CiAgIHJldHVybiB2bGQ0cV9kdXBfczgoYSk7Ci0gIC8vIENIRUNLOiBsZDRyIHt2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiLAotICAvLyB2e3tbMC05XSt9fS4xNmJ9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDRyIHt7eyAqdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQxNng4eDRfdCB0ZXN0X3ZsZDRxX2R1cF9zMTYoaW50MTZfdCBjb25zdCAqYSkgeworaW50MTZ4OHg0X3QgdGVzdF92bGQ0cV9kdXBfczE2KGludDE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX2R1cF9zMTYKICAgcmV0dXJuIHZsZDRxX2R1cF9zMTYoYSk7Ci0gIC8vIENIRUNLOiBsZDRyIHt2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoLAotICAvLyB2e3tbMC05XSt9fS44aH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNHIge3t7ICp2WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoLCB2WzAtOV0rLjhoICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50MzJ4NHg0X3QgdGVzdF92bGQ0cV9kdXBfczMyKGludDMyX3QgY29uc3QgKmEpIHsKK2ludDMyeDR4NF90IHRlc3RfdmxkNHFfZHVwX3MzMihpbnQzMl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0cV9kdXBfczMyCiAgIHJldHVybiB2bGQ0cV9kdXBfczMyKGEpOwotICAvLyBDSEVDSzogbGQ0ciB7dnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywKLSAgLy8gdnt7WzAtOV0rfX0uNHN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDRyIHt7eyAqdlswLTldKy40cywgdlswLTldKy40cywgdlswLTldKy40cywgdlswLTldKy40cyAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDY0eDJ4NF90IHRlc3RfdmxkNHFfZHVwX3M2NChpbnQ2NF90IGNvbnN0ICphKSB7CitpbnQ2NHgyeDRfdCB0ZXN0X3ZsZDRxX2R1cF9zNjQoaW50NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfZHVwX3M2NAogICByZXR1cm4gdmxkNHFfZHVwX3M2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkNHIge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsCi0gIC8vIHZ7e1swLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDE2eDh4NF90IHRlc3RfdmxkNHFfZHVwX2YxNihmbG9hdDE2X3QgY29uc3QgKmEpIHsKK2Zsb2F0MTZ4OHg0X3QgdGVzdF92bGQ0cV9kdXBfZjE2KGZsb2F0MTZfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfZHVwX2YxNgogICByZXR1cm4gdmxkNHFfZHVwX2YxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkNHIge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDMyeDR4NF90IHRlc3RfdmxkNHFfZHVwX2YzMihmbG9hdDMyX3QgY29uc3QgKmEpIHsKK2Zsb2F0MzJ4NHg0X3QgdGVzdF92bGQ0cV9kdXBfZjMyKGZsb2F0MzJfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfZHVwX2YzMgogICByZXR1cm4gdmxkNHFfZHVwX2YzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkNHIge3Z7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMsCi0gIC8vIHZ7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMsIHZbMC05XSsuNHMgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDY0eDJ4NF90IHRlc3RfdmxkNHFfZHVwX2Y2NChmbG9hdDY0X3QgY29uc3QgKmEpIHsKK2Zsb2F0NjR4Mng0X3QgdGVzdF92bGQ0cV9kdXBfZjY0KGZsb2F0NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfZHVwX2Y2NAogICByZXR1cm4gdmxkNHFfZHVwX2Y2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkNHIge3Z7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQsCi0gIC8vIHZ7e1swLTldK319LjRzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5OHgxNng0X3QgdGVzdF92bGQ0cV9kdXBfcDgocG9seThfdCBjb25zdCAqYSkgeworcG9seTh4MTZ4NF90IHRlc3RfdmxkNHFfZHVwX3A4KHBvbHk4X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX2R1cF9wOAogICByZXR1cm4gdmxkNHFfZHVwX3A4KGEpOwotICAvLyBDSEVDSzogbGQ0ciB7dnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YiwKLSAgLy8gdnt7WzAtOV0rfX0uMTZifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTE2eDh4NF90IHRlc3RfdmxkNHFfZHVwX3AxNihwb2x5MTZfdCBjb25zdCAqYSkgeworcG9seTE2eDh4NF90IHRlc3RfdmxkNHFfZHVwX3AxNihwb2x5MTZfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfZHVwX3AxNgogICByZXR1cm4gdmxkNHFfZHVwX3AxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkNHIge3Z7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgsCi0gIC8vIHZ7e1swLTldK319LjhofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGgsIHZbMC05XSsuOGggKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5NjR4Mng0X3QgdGVzdF92bGQ0cV9kdXBfcDY0KHBvbHk2NF90IGNvbnN0ICphKSB7Citwb2x5NjR4Mng0X3QgdGVzdF92bGQ0cV9kdXBfcDY0KHBvbHk2NF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0cV9kdXBfcDY0CiAgIHJldHVybiB2bGQ0cV9kdXBfcDY0KGEpOwotICAvLyBDSEVDSzogbGQ0ciB7dnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZCwKLSAgLy8gdnt7WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDRyIHt7eyAqdlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTldKy4yZCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQ4eDh4NF90IHRlc3RfdmxkNF9kdXBfdTgodWludDhfdCBjb25zdCAqYSkgewordWludDh4OHg0X3QgdGVzdF92bGQ0X2R1cF91OCh1aW50OF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2R1cF91OAogICByZXR1cm4gdmxkNF9kdXBfdTgoYSk7Ci0gIC8vIENIRUNLOiBsZDRyIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLAotICAvLyB2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNHIge3t7ICp2WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDE2eDR4NF90IHRlc3RfdmxkNF9kdXBfdTE2KHVpbnQxNl90IGNvbnN0ICphKSB7Cit1aW50MTZ4NHg0X3QgdGVzdF92bGQ0X2R1cF91MTYodWludDE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfZHVwX3UxNgogICByZXR1cm4gdmxkNF9kdXBfdTE2KGEpOwotICAvLyBDSEVDSzogbGQ0ciB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwKLSAgLy8gdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDRyIHt7eyAqdlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQzMngyeDRfdCB0ZXN0X3ZsZDRfZHVwX3UzMih1aW50MzJfdCBjb25zdCAqYSkgewordWludDMyeDJ4NF90IHRlc3RfdmxkNF9kdXBfdTMyKHVpbnQzMl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2R1cF91MzIKICAgcmV0dXJuIHZsZDRfZHVwX3UzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkNHIge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsCi0gIC8vIHZ7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50NjR4MXg0X3QgdGVzdF92bGQ0X2R1cF91NjQodWludDY0X3QgY29uc3QgKmEpIHsKK3VpbnQ2NHgxeDRfdCB0ZXN0X3ZsZDRfZHVwX3U2NCh1aW50NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9kdXBfdTY0CiAgIHJldHVybiB2bGQ0X2R1cF91NjQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsCi0gIC8vIHZ7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDF8bGQ0cn19IHt7eyAqdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDh4OHg0X3QgdGVzdF92bGQ0X2R1cF9zOChpbnQ4X3QgY29uc3QgKmEpIHsKK2ludDh4OHg0X3QgdGVzdF92bGQ0X2R1cF9zOChpbnQ4X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfZHVwX3M4CiAgIHJldHVybiB2bGQ0X2R1cF9zOChhKTsKLSAgLy8gQ0hFQ0s6IGxkNHIge3Z7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsCi0gIC8vIHZ7e1swLTldK319LjhifSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIsIHZbMC05XSsuOGIgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQxNng0eDRfdCB0ZXN0X3ZsZDRfZHVwX3MxNihpbnQxNl90IGNvbnN0ICphKSB7CitpbnQxNng0eDRfdCB0ZXN0X3ZsZDRfZHVwX3MxNihpbnQxNl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2R1cF9zMTYKICAgcmV0dXJuIHZsZDRfZHVwX3MxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkNHIge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsCi0gIC8vIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGggKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQzMngyeDRfdCB0ZXN0X3ZsZDRfZHVwX3MzMihpbnQzMl90IGNvbnN0ICphKSB7CitpbnQzMngyeDRfdCB0ZXN0X3ZsZDRfZHVwX3MzMihpbnQzMl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2R1cF9zMzIKICAgcmV0dXJuIHZsZDRfZHVwX3MzMihhKTsKLSAgLy8gQ0hFQ0s6IGxkNHIge3Z7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMsCi0gIC8vIHZ7e1swLTldK319LjJzfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMsIHZbMC05XSsuMnMgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ2NHgxeDRfdCB0ZXN0X3ZsZDRfZHVwX3M2NChpbnQ2NF90IGNvbnN0ICphKSB7CitpbnQ2NHgxeDRfdCB0ZXN0X3ZsZDRfZHVwX3M2NChpbnQ2NF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2R1cF9zNjQKICAgcmV0dXJuIHZsZDRfZHVwX3M2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwKLSAgLy8gdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMXxsZDRyfX0ge3t7ICp2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotZmxvYXQxNng0eDRfdCB0ZXN0X3ZsZDRfZHVwX2YxNihmbG9hdDE2X3QgY29uc3QgKmEpIHsKK2Zsb2F0MTZ4NHg0X3QgdGVzdF92bGQ0X2R1cF9mMTYoZmxvYXQxNl90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2R1cF9mMTYKICAgcmV0dXJuIHZsZDRfZHVwX2YxNihhKTsKLSAgLy8gQ0hFQ0s6IGxkNHIge3Z7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgsCi0gIC8vIHZ7e1swLTldK319LjRofSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0ciB7e3sgKnZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGgsIHZbMC05XSsuNGggKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDMyeDJ4NF90IHRlc3RfdmxkNF9kdXBfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSkgeworZmxvYXQzMngyeDRfdCB0ZXN0X3ZsZDRfZHVwX2YzMihmbG9hdDMyX3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfZHVwX2YzMgogICByZXR1cm4gdmxkNF9kdXBfZjMyKGEpOwotICAvLyBDSEVDSzogbGQ0ciB7dnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycywKLSAgLy8gdnt7WzAtOV0rfX0uMnN9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDRyIHt7eyAqdlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycywgdlswLTldKy4ycyAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0NjR4MXg0X3QgdGVzdF92bGQ0X2R1cF9mNjQoZmxvYXQ2NF90IGNvbnN0ICphKSB7CitmbG9hdDY0eDF4NF90IHRlc3RfdmxkNF9kdXBfZjY0KGZsb2F0NjRfdCAgKmEpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9kdXBfZjY0CiAgIHJldHVybiB2bGQ0X2R1cF9mNjQoYSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMWQsCi0gIC8vIHZ7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDF8bGQ0cn19IHt7eyAqdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHk4eDh4NF90IHRlc3RfdmxkNF9kdXBfcDgocG9seThfdCBjb25zdCAqYSkgeworcG9seTh4OHg0X3QgdGVzdF92bGQ0X2R1cF9wOChwb2x5OF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2R1cF9wOAogICByZXR1cm4gdmxkNF9kdXBfcDgoYSk7Ci0gIC8vIENIRUNLOiBsZDRyIHt2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiLAotICAvLyB2e3tbMC05XSt9fS44Yn0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNHIge3t7ICp2WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiLCB2WzAtOV0rLjhiICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTE2eDR4NF90IHRlc3RfdmxkNF9kdXBfcDE2KHBvbHkxNl90IGNvbnN0ICphKSB7Citwb2x5MTZ4NHg0X3QgdGVzdF92bGQ0X2R1cF9wMTYocG9seTE2X3QgICphKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfZHVwX3AxNgogICByZXR1cm4gdmxkNF9kdXBfcDE2KGEpOwotICAvLyBDSEVDSzogbGQ0ciB7dnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aCwKLSAgLy8gdnt7WzAtOV0rfX0uNGh9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDRyIHt7eyAqdlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCwgdlswLTldKy40aCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHk2NHgxeDRfdCB0ZXN0X3ZsZDRfZHVwX3A2NChwb2x5NjRfdCBjb25zdCAqYSkgeworcG9seTY0eDF4NF90IHRlc3RfdmxkNF9kdXBfcDY0KHBvbHk2NF90ICAqYSkgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2R1cF9wNjQKICAgcmV0dXJuIHZsZDRfZHVwX3A2NChhKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4xZCwKLSAgLy8gdnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMXxsZDRyfX0ge3t7ICp2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDh4MTZfdCB0ZXN0X3ZsZDFxX2xhbmVfdTgodWludDhfdCBjb25zdCAqYSwgdWludDh4MTZfdCBiKSB7Cit1aW50OHgxNl90IHRlc3RfdmxkMXFfbGFuZV91OCh1aW50OF90ICAqYSwgdWludDh4MTZfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2xhbmVfdTgKICAgcmV0dXJuIHZsZDFxX2xhbmVfdTgoYSwgYiwgMTUpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS5ifVsxNV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgKnZbMC05XSsuYiAqfX19WzE1XSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MTZ4OF90IHRlc3RfdmxkMXFfbGFuZV91MTYodWludDE2X3QgY29uc3QgKmEsIHVpbnQxNng4X3QgYikgewordWludDE2eDhfdCB0ZXN0X3ZsZDFxX2xhbmVfdTE2KHVpbnQxNl90ICAqYSwgdWludDE2eDhfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2xhbmVfdTE2CiAgIHJldHVybiB2bGQxcV9sYW5lX3UxNihhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uaH1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgKnZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQzMng0X3QgdGVzdF92bGQxcV9sYW5lX3UzMih1aW50MzJfdCBjb25zdCAqYSwgdWludDMyeDRfdCBiKSB7Cit1aW50MzJ4NF90IHRlc3RfdmxkMXFfbGFuZV91MzIodWludDMyX3QgICphLCB1aW50MzJ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfbGFuZV91MzIKICAgcmV0dXJuIHZsZDFxX2xhbmVfdTMyKGEsIGIsIDMpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS5zfVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyAqdlswLTldKy5zICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDY0eDJfdCB0ZXN0X3ZsZDFxX2xhbmVfdTY0KHVpbnQ2NF90IGNvbnN0ICphLCB1aW50NjR4Ml90IGIpIHsKK3VpbnQ2NHgyX3QgdGVzdF92bGQxcV9sYW5lX3U2NCh1aW50NjRfdCAgKmEsIHVpbnQ2NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9sYW5lX3U2NAogICByZXR1cm4gdmxkMXFfbGFuZV91NjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ICp2WzAtOV0rLmQgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ4eDE2X3QgdGVzdF92bGQxcV9sYW5lX3M4KGludDhfdCBjb25zdCAqYSwgaW50OHgxNl90IGIpIHsKK2ludDh4MTZfdCB0ZXN0X3ZsZDFxX2xhbmVfczgoaW50OF90ICAqYSwgaW50OHgxNl90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfbGFuZV9zOAogICByZXR1cm4gdmxkMXFfbGFuZV9zOChhLCBiLCAxNSk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LmJ9WzE1XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyAqdlswLTldKy5iICp9fX1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDE2eDhfdCB0ZXN0X3ZsZDFxX2xhbmVfczE2KGludDE2X3QgY29uc3QgKmEsIGludDE2eDhfdCBiKSB7CitpbnQxNng4X3QgdGVzdF92bGQxcV9sYW5lX3MxNihpbnQxNl90ICAqYSwgaW50MTZ4OF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfbGFuZV9zMTYKICAgcmV0dXJuIHZsZDFxX2xhbmVfczE2KGEsIGIsIDcpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS5ofVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyAqdlswLTldKy5oICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50MzJ4NF90IHRlc3RfdmxkMXFfbGFuZV9zMzIoaW50MzJfdCBjb25zdCAqYSwgaW50MzJ4NF90IGIpIHsKK2ludDMyeDRfdCB0ZXN0X3ZsZDFxX2xhbmVfczMyKGludDMyX3QgICphLCBpbnQzMng0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9sYW5lX3MzMgogICByZXR1cm4gdmxkMXFfbGFuZV9zMzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ICp2WzAtOV0rLnMgKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ2NHgyX3QgdGVzdF92bGQxcV9sYW5lX3M2NChpbnQ2NF90IGNvbnN0ICphLCBpbnQ2NHgyX3QgYikgeworaW50NjR4Ml90IHRlc3RfdmxkMXFfbGFuZV9zNjQoaW50NjRfdCAgKmEsIGludDY0eDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2xhbmVfczY0CiAgIHJldHVybiB2bGQxcV9sYW5lX3M2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgKnZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MTZ4OF90IHRlc3RfdmxkMXFfbGFuZV9mMTYoZmxvYXQxNl90IGNvbnN0ICphLCBmbG9hdDE2eDhfdCBiKSB7CitmbG9hdDE2eDhfdCB0ZXN0X3ZsZDFxX2xhbmVfZjE2KGZsb2F0MTZfdCAgKmEsIGZsb2F0MTZ4OF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfbGFuZV9mMTYKICAgcmV0dXJuIHZsZDFxX2xhbmVfZjE2KGEsIGIsIDcpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS5ofVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyAqdlswLTldKy5oICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotZmxvYXQzMng0X3QgdGVzdF92bGQxcV9sYW5lX2YzMihmbG9hdDMyX3QgY29uc3QgKmEsIGZsb2F0MzJ4NF90IGIpIHsKK2Zsb2F0MzJ4NF90IHRlc3RfdmxkMXFfbGFuZV9mMzIoZmxvYXQzMl90ICAqYSwgZmxvYXQzMng0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9sYW5lX2YzMgogICByZXR1cm4gdmxkMXFfbGFuZV9mMzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ICp2WzAtOV0rLnMgKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDY0eDJfdCB0ZXN0X3ZsZDFxX2xhbmVfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSwgZmxvYXQ2NHgyX3QgYikgeworZmxvYXQ2NHgyX3QgdGVzdF92bGQxcV9sYW5lX2Y2NChmbG9hdDY0X3QgICphLCBmbG9hdDY0eDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2xhbmVfZjY0CiAgIHJldHVybiB2bGQxcV9sYW5lX2Y2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgKnZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHk4eDE2X3QgdGVzdF92bGQxcV9sYW5lX3A4KHBvbHk4X3QgY29uc3QgKmEsIHBvbHk4eDE2X3QgYikgeworcG9seTh4MTZfdCB0ZXN0X3ZsZDFxX2xhbmVfcDgocG9seThfdCAgKmEsIHBvbHk4eDE2X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9sYW5lX3A4CiAgIHJldHVybiB2bGQxcV9sYW5lX3A4KGEsIGIsIDE1KTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uYn1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ICp2WzAtOV0rLmIgKn19fVsxNV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTE2eDhfdCB0ZXN0X3ZsZDFxX2xhbmVfcDE2KHBvbHkxNl90IGNvbnN0ICphLCBwb2x5MTZ4OF90IGIpIHsKK3BvbHkxNng4X3QgdGVzdF92bGQxcV9sYW5lX3AxNihwb2x5MTZfdCAgKmEsIHBvbHkxNng4X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxcV9sYW5lX3AxNgogICByZXR1cm4gdmxkMXFfbGFuZV9wMTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ICp2WzAtOV0rLmggKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5NjR4Ml90IHRlc3RfdmxkMXFfbGFuZV9wNjQocG9seTY0X3QgY29uc3QgKmEsIHBvbHk2NHgyX3QgYikgeworcG9seTY0eDJfdCB0ZXN0X3ZsZDFxX2xhbmVfcDY0KHBvbHk2NF90ICAqYSwgcG9seTY0eDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFxX2xhbmVfcDY0CiAgIHJldHVybiB2bGQxcV9sYW5lX3A2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgKnZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQ4eDhfdCB0ZXN0X3ZsZDFfbGFuZV91OCh1aW50OF90IGNvbnN0ICphLCB1aW50OHg4X3QgYikgewordWludDh4OF90IHRlc3RfdmxkMV9sYW5lX3U4KHVpbnQ4X3QgICphLCB1aW50OHg4X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2xhbmVfdTgKICAgcmV0dXJuIHZsZDFfbGFuZV91OChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgKnZbMC05XSsuYiAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQxNng0X3QgdGVzdF92bGQxX2xhbmVfdTE2KHVpbnQxNl90IGNvbnN0ICphLCB1aW50MTZ4NF90IGIpIHsKK3VpbnQxNng0X3QgdGVzdF92bGQxX2xhbmVfdTE2KHVpbnQxNl90ICAqYSwgdWludDE2eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfbGFuZV91MTYKICAgcmV0dXJuIHZsZDFfbGFuZV91MTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ICp2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MzJ4Ml90IHRlc3RfdmxkMV9sYW5lX3UzMih1aW50MzJfdCBjb25zdCAqYSwgdWludDMyeDJfdCBiKSB7Cit1aW50MzJ4Ml90IHRlc3RfdmxkMV9sYW5lX3UzMih1aW50MzJfdCAgKmEsIHVpbnQzMngyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2xhbmVfdTMyCiAgIHJldHVybiB2bGQxX2xhbmVfdTMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS5zfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyAqdlswLTldKy5zICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDY0eDFfdCB0ZXN0X3ZsZDFfbGFuZV91NjQodWludDY0X3QgY29uc3QgKmEsIHVpbnQ2NHgxX3QgYikgewordWludDY0eDFfdCB0ZXN0X3ZsZDFfbGFuZV91NjQodWludDY0X3QgICphLCB1aW50NjR4MV90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9sYW5lX3U2NAogICByZXR1cm4gdmxkMV9sYW5lX3U2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDFyIHt2WzAtOV0rLjFkfXxsZHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDh4OF90IHRlc3RfdmxkMV9sYW5lX3M4KGludDhfdCBjb25zdCAqYSwgaW50OHg4X3QgYikgeworaW50OHg4X3QgdGVzdF92bGQxX2xhbmVfczgoaW50OF90ICAqYSwgaW50OHg4X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2xhbmVfczgKICAgcmV0dXJuIHZsZDFfbGFuZV9zOChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgKnZbMC05XSsuYiAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDE2eDRfdCB0ZXN0X3ZsZDFfbGFuZV9zMTYoaW50MTZfdCBjb25zdCAqYSwgaW50MTZ4NF90IGIpIHsKK2ludDE2eDRfdCB0ZXN0X3ZsZDFfbGFuZV9zMTYoaW50MTZfdCAgKmEsIGludDE2eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfbGFuZV9zMTYKICAgcmV0dXJuIHZsZDFfbGFuZV9zMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ICp2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQzMngyX3QgdGVzdF92bGQxX2xhbmVfczMyKGludDMyX3QgY29uc3QgKmEsIGludDMyeDJfdCBiKSB7CitpbnQzMngyX3QgdGVzdF92bGQxX2xhbmVfczMyKGludDMyX3QgICphLCBpbnQzMngyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2xhbmVfczMyCiAgIHJldHVybiB2bGQxX2xhbmVfczMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS5zfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyAqdlswLTldKy5zICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50NjR4MV90IHRlc3RfdmxkMV9sYW5lX3M2NChpbnQ2NF90IGNvbnN0ICphLCBpbnQ2NHgxX3QgYikgeworaW50NjR4MV90IHRlc3RfdmxkMV9sYW5lX3M2NChpbnQ2NF90ICAqYSwgaW50NjR4MV90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9sYW5lX3M2NAogICByZXR1cm4gdmxkMV9sYW5lX3M2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDFyIHt2WzAtOV0rLjFkfXxsZHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MTZ4NF90IHRlc3RfdmxkMV9sYW5lX2YxNihmbG9hdDE2X3QgY29uc3QgKmEsIGZsb2F0MTZ4NF90IGIpIHsKK2Zsb2F0MTZ4NF90IHRlc3RfdmxkMV9sYW5lX2YxNihmbG9hdDE2X3QgICphLCBmbG9hdDE2eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfbGFuZV9mMTYKICAgcmV0dXJuIHZsZDFfbGFuZV9mMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ICp2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDMyeDJfdCB0ZXN0X3ZsZDFfbGFuZV9mMzIoZmxvYXQzMl90IGNvbnN0ICphLCBmbG9hdDMyeDJfdCBiKSB7CitmbG9hdDMyeDJfdCB0ZXN0X3ZsZDFfbGFuZV9mMzIoZmxvYXQzMl90ICAqYSwgZmxvYXQzMngyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2xhbmVfZjMyCiAgIHJldHVybiB2bGQxX2xhbmVfZjMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogbGQxIHt2e3tbMC05XSt9fS5zfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyAqdlswLTldKy5zICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotZmxvYXQ2NHgxX3QgdGVzdF92bGQxX2xhbmVfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSwgZmxvYXQ2NHgxX3QgYikgeworZmxvYXQ2NHgxX3QgdGVzdF92bGQxX2xhbmVfZjY0KGZsb2F0NjRfdCAgKmEsIGZsb2F0NjR4MV90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9sYW5lX2Y2NAogICByZXR1cm4gdmxkMV9sYW5lX2Y2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGxkMXIge3Z7e1swLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzoge3tsZDFyIHt2WzAtOV0rLjFkfXxsZHIgZFswLTldK319LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHk4eDhfdCB0ZXN0X3ZsZDFfbGFuZV9wOChwb2x5OF90IGNvbnN0ICphLCBwb2x5OHg4X3QgYikgeworcG9seTh4OF90IHRlc3RfdmxkMV9sYW5lX3A4KHBvbHk4X3QgICphLCBwb2x5OHg4X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2xhbmVfcDgKICAgcmV0dXJuIHZsZDFfbGFuZV9wOChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IGxkMSB7dnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMSB7e3sgKnZbMC05XSsuYiAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHkxNng0X3QgdGVzdF92bGQxX2xhbmVfcDE2KHBvbHkxNl90IGNvbnN0ICphLCBwb2x5MTZ4NF90IGIpIHsKK3BvbHkxNng0X3QgdGVzdF92bGQxX2xhbmVfcDE2KHBvbHkxNl90ICAqYSwgcG9seTE2eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDFfbGFuZV9wMTYKICAgcmV0dXJuIHZsZDFfbGFuZV9wMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDEge3Z7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ICp2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5NjR4MV90IHRlc3RfdmxkMV9sYW5lX3A2NChwb2x5NjRfdCBjb25zdCAqYSwgcG9seTY0eDFfdCBiKSB7Citwb2x5NjR4MV90IHRlc3RfdmxkMV9sYW5lX3A2NChwb2x5NjRfdCAgKmEsIHBvbHk2NHgxX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQxX2xhbmVfcDY0CiAgIHJldHVybiB2bGQxX2xhbmVfcDY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogbGQxciB7dnt7WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e2xkMXIge3ZbMC05XSsuMWR9fGxkciBkWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDE2eDh4Ml90IHRlc3RfdmxkMnFfbGFuZV91MTYodWludDE2X3QgY29uc3QgKmEsIHVpbnQxNng4eDJfdCBiKSB7CitpbnQ4eDE2eDJfdCB0ZXN0X3ZsZDJxX2xhbmVfczgoaW50OF90IGNvbnN0ICogcHRyLCBpbnQ4eDE2eDJfdCBzcmMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMnFfbGFuZV9zOAorICByZXR1cm4gdmxkMnFfbGFuZV9zOChwdHIsIHNyYywgMTUpOworICAvLyBDSEVDSzogbGQyIHt7eyAqdlswLTldKy5iLCAgdlswLTldKy5iICp9fX1bMTVdLCBbeDBdCit9CisKK3VpbnQ4eDE2eDJfdCB0ZXN0X3ZsZDJxX2xhbmVfdTgodWludDhfdCBjb25zdCAqIHB0ciwgdWludDh4MTZ4Ml90IHNyYykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX3U4CisgIHJldHVybiB2bGQycV9sYW5lX3U4KHB0ciwgc3JjLCAxNSk7CisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzE1XSwgW3gwXQorfQorCitwb2x5OHgxNngyX3QgdGVzdF92bGQycV9sYW5lX3A4KHBvbHk4X3QgY29uc3QgKiBwdHIsIHBvbHk4eDE2eDJfdCBzcmMpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMnFfbGFuZV9wOAorICByZXR1cm4gdmxkMnFfbGFuZV9wOChwdHIsIHNyYywgMTUpOworICAvLyBDSEVDSzogbGQyIHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVsxNV0sIFt4MF0KK30KKworaW50OHgxNngzX3QgdGVzdF92bGQzcV9sYW5lX3M4KGludDhfdCBjb25zdCAqIHB0ciwgaW50OHgxNngzX3Qgc3JjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2xhbmVfczgKKyAgcmV0dXJuIHZsZDNxX2xhbmVfczgocHRyLCBzcmMsIDE1KTsKKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVsxNV0sIFt4MF0KK30KKwordWludDh4MTZ4M190IHRlc3RfdmxkM3FfbGFuZV91OCh1aW50OF90IGNvbnN0ICogcHRyLCB1aW50OHgxNngzX3Qgc3JjKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2xhbmVfdTgKKyAgcmV0dXJuIHZsZDNxX2xhbmVfdTgocHRyLCBzcmMsIDE1KTsKKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVsxNV0sIFt4MF0KK30KKwordWludDE2eDh4Ml90IHRlc3RfdmxkMnFfbGFuZV91MTYodWludDE2X3QgICphLCB1aW50MTZ4OHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX3UxNgogICByZXR1cm4gdmxkMnFfbGFuZV91MTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQzMng0eDJfdCB0ZXN0X3ZsZDJxX2xhbmVfdTMyKHVpbnQzMl90IGNvbnN0ICphLCB1aW50MzJ4NHgyX3QgYikgewordWludDMyeDR4Ml90IHRlc3RfdmxkMnFfbGFuZV91MzIodWludDMyX3QgICphLCB1aW50MzJ4NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX3UzMgogICByZXR1cm4gdmxkMnFfbGFuZV91MzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQ2NHgyeDJfdCB0ZXN0X3ZsZDJxX2xhbmVfdTY0KHVpbnQ2NF90IGNvbnN0ICphLCB1aW50NjR4MngyX3QgYikgewordWludDY0eDJ4Ml90IHRlc3RfdmxkMnFfbGFuZV91NjQodWludDY0X3QgICphLCB1aW50NjR4MngyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX3U2NAogICByZXR1cm4gdmxkMnFfbGFuZV91NjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDE2eDh4Ml90IHRlc3RfdmxkMnFfbGFuZV9zMTYoaW50MTZfdCBjb25zdCAqYSwgaW50MTZ4OHgyX3QgYikgeworaW50MTZ4OHgyX3QgdGVzdF92bGQycV9sYW5lX3MxNihpbnQxNl90ICAqYSwgaW50MTZ4OHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX3MxNgogICByZXR1cm4gdmxkMnFfbGFuZV9zMTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDMyeDR4Ml90IHRlc3RfdmxkMnFfbGFuZV9zMzIoaW50MzJfdCBjb25zdCAqYSwgaW50MzJ4NHgyX3QgYikgeworaW50MzJ4NHgyX3QgdGVzdF92bGQycV9sYW5lX3MzMihpbnQzMl90ICAqYSwgaW50MzJ4NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX3MzMgogICByZXR1cm4gdmxkMnFfbGFuZV9zMzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDY0eDJ4Ml90IHRlc3RfdmxkMnFfbGFuZV9zNjQoaW50NjRfdCBjb25zdCAqYSwgaW50NjR4MngyX3QgYikgeworaW50NjR4MngyX3QgdGVzdF92bGQycV9sYW5lX3M2NChpbnQ2NF90ICAqYSwgaW50NjR4MngyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX3M2NAogICByZXR1cm4gdmxkMnFfbGFuZV9zNjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MTZ4OHgyX3QgdGVzdF92bGQycV9sYW5lX2YxNihmbG9hdDE2X3QgY29uc3QgKmEsIGZsb2F0MTZ4OHgyX3QgYikgeworZmxvYXQxNng4eDJfdCB0ZXN0X3ZsZDJxX2xhbmVfZjE2KGZsb2F0MTZfdCAgKmEsIGZsb2F0MTZ4OHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX2YxNgogICByZXR1cm4gdmxkMnFfbGFuZV9mMTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MzJ4NHgyX3QgdGVzdF92bGQycV9sYW5lX2YzMihmbG9hdDMyX3QgY29uc3QgKmEsIGZsb2F0MzJ4NHgyX3QgYikgeworZmxvYXQzMng0eDJfdCB0ZXN0X3ZsZDJxX2xhbmVfZjMyKGZsb2F0MzJfdCAgKmEsIGZsb2F0MzJ4NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX2YzMgogICByZXR1cm4gdmxkMnFfbGFuZV9mMzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0NjR4MngyX3QgdGVzdF92bGQycV9sYW5lX2Y2NChmbG9hdDY0X3QgY29uc3QgKmEsIGZsb2F0NjR4MngyX3QgYikgeworZmxvYXQ2NHgyeDJfdCB0ZXN0X3ZsZDJxX2xhbmVfZjY0KGZsb2F0NjRfdCAgKmEsIGZsb2F0NjR4MngyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX2Y2NAogICByZXR1cm4gdmxkMnFfbGFuZV9mNjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHkxNng4eDJfdCB0ZXN0X3ZsZDJxX2xhbmVfcDE2KHBvbHkxNl90IGNvbnN0ICphLCBwb2x5MTZ4OHgyX3QgYikgeworcG9seTE2eDh4Ml90IHRlc3RfdmxkMnFfbGFuZV9wMTYocG9seTE2X3QgICphLCBwb2x5MTZ4OHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX3AxNgogICByZXR1cm4gdmxkMnFfbGFuZV9wMTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHk2NHgyeDJfdCB0ZXN0X3ZsZDJxX2xhbmVfcDY0KHBvbHk2NF90IGNvbnN0ICphLCBwb2x5NjR4MngyX3QgYikgeworcG9seTY0eDJ4Ml90IHRlc3RfdmxkMnFfbGFuZV9wNjQocG9seTY0X3QgICphLCBwb2x5NjR4MngyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQycV9sYW5lX3A2NAogICByZXR1cm4gdmxkMnFfbGFuZV9wNjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQ4eDh4Ml90IHRlc3RfdmxkMl9sYW5lX3U4KHVpbnQ4X3QgY29uc3QgKmEsIHVpbnQ4eDh4Ml90IGIpIHsKK3VpbnQ4eDh4Ml90IHRlc3RfdmxkMl9sYW5lX3U4KHVpbnQ4X3QgICphLCB1aW50OHg4eDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfbGFuZV91OAogICByZXR1cm4gdmxkMl9sYW5lX3U4KGEsIGIsIDcpOwotICAvLyBDSEVDSzogbGQyIHt2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5ifVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MTZ4NHgyX3QgdGVzdF92bGQyX2xhbmVfdTE2KHVpbnQxNl90IGNvbnN0ICphLCB1aW50MTZ4NHgyX3QgYikgewordWludDE2eDR4Ml90IHRlc3RfdmxkMl9sYW5lX3UxNih1aW50MTZfdCAgKmEsIHVpbnQxNng0eDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfbGFuZV91MTYKICAgcmV0dXJuIHZsZDJfbGFuZV91MTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQzMngyeDJfdCB0ZXN0X3ZsZDJfbGFuZV91MzIodWludDMyX3QgY29uc3QgKmEsIHVpbnQzMngyeDJfdCBiKSB7Cit1aW50MzJ4MngyX3QgdGVzdF92bGQyX2xhbmVfdTMyKHVpbnQzMl90ICAqYSwgdWludDMyeDJ4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl9sYW5lX3UzMgogICByZXR1cm4gdmxkMl9sYW5lX3UzMihhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0uc31bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMiB7e3sgKnZbMC05XSsucywgdlswLTldKy5zICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDY0eDF4Ml90IHRlc3RfdmxkMl9sYW5lX3U2NCh1aW50NjRfdCBjb25zdCAqYSwgdWludDY0eDF4Ml90IGIpIHsKK3VpbnQ2NHgxeDJfdCB0ZXN0X3ZsZDJfbGFuZV91NjQodWludDY0X3QgICphLCB1aW50NjR4MXgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX2xhbmVfdTY0CiAgIHJldHVybiB2bGQyX2xhbmVfdTY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogbGQyIHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVswXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ4eDh4Ml90IHRlc3RfdmxkMl9sYW5lX3M4KGludDhfdCBjb25zdCAqYSwgaW50OHg4eDJfdCBiKSB7CitpbnQ4eDh4Ml90IHRlc3RfdmxkMl9sYW5lX3M4KGludDhfdCAgKmEsIGludDh4OHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX2xhbmVfczgKICAgcmV0dXJuIHZsZDJfbGFuZV9zOChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMiB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50MTZ4NHgyX3QgdGVzdF92bGQyX2xhbmVfczE2KGludDE2X3QgY29uc3QgKmEsIGludDE2eDR4Ml90IGIpIHsKK2ludDE2eDR4Ml90IHRlc3RfdmxkMl9sYW5lX3MxNihpbnQxNl90ICAqYSwgaW50MTZ4NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX2xhbmVfczE2CiAgIHJldHVybiB2bGQyX2xhbmVfczE2KGEsIGIsIDMpOwotICAvLyBDSEVDSzogbGQyIHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQzMngyeDJfdCB0ZXN0X3ZsZDJfbGFuZV9zMzIoaW50MzJfdCBjb25zdCAqYSwgaW50MzJ4MngyX3QgYikgeworaW50MzJ4MngyX3QgdGVzdF92bGQyX2xhbmVfczMyKGludDMyX3QgICphLCBpbnQzMngyeDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfbGFuZV9zMzIKICAgcmV0dXJuIHZsZDJfbGFuZV9zMzIoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDY0eDF4Ml90IHRlc3RfdmxkMl9sYW5lX3M2NChpbnQ2NF90IGNvbnN0ICphLCBpbnQ2NHgxeDJfdCBiKSB7CitpbnQ2NHgxeDJfdCB0ZXN0X3ZsZDJfbGFuZV9zNjQoaW50NjRfdCAgKmEsIGludDY0eDF4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl9sYW5lX3M2NAogICByZXR1cm4gdmxkMl9sYW5lX3M2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMF0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMiB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kICp9fX1bMF0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotZmxvYXQxNng0eDJfdCB0ZXN0X3ZsZDJfbGFuZV9mMTYoZmxvYXQxNl90IGNvbnN0ICphLCBmbG9hdDE2eDR4Ml90IGIpIHsKK2Zsb2F0MTZ4NHgyX3QgdGVzdF92bGQyX2xhbmVfZjE2KGZsb2F0MTZfdCAgKmEsIGZsb2F0MTZ4NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX2xhbmVfZjE2CiAgIHJldHVybiB2bGQyX2xhbmVfZjE2KGEsIGIsIDMpOwotICAvLyBDSEVDSzogbGQyIHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDMyeDJ4Ml90IHRlc3RfdmxkMl9sYW5lX2YzMihmbG9hdDMyX3QgY29uc3QgKmEsIGZsb2F0MzJ4MngyX3QgYikgeworZmxvYXQzMngyeDJfdCB0ZXN0X3ZsZDJfbGFuZV9mMzIoZmxvYXQzMl90ICAqYSwgZmxvYXQzMngyeDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDJfbGFuZV9mMzIKICAgcmV0dXJuIHZsZDJfbGFuZV9mMzIoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0NjR4MXgyX3QgdGVzdF92bGQyX2xhbmVfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSwgZmxvYXQ2NHgxeDJfdCBiKSB7CitmbG9hdDY0eDF4Ml90IHRlc3RfdmxkMl9sYW5lX2Y2NChmbG9hdDY0X3QgICphLCBmbG9hdDY0eDF4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl9sYW5lX2Y2NAogICByZXR1cm4gdmxkMl9sYW5lX2Y2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMF0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMiB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kICp9fX1bMF0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTh4OHgyX3QgdGVzdF92bGQyX2xhbmVfcDgocG9seThfdCBjb25zdCAqYSwgcG9seTh4OHgyX3QgYikgeworcG9seTh4OHgyX3QgdGVzdF92bGQyX2xhbmVfcDgocG9seThfdCAgKmEsIHBvbHk4eDh4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl9sYW5lX3A4CiAgIHJldHVybiB2bGQyX2xhbmVfcDgoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBsZDIge3Z7e1swLTldK319LmIsIHZ7e1swLTldK319LmJ9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDIge3t7ICp2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHkxNng0eDJfdCB0ZXN0X3ZsZDJfbGFuZV9wMTYocG9seTE2X3QgY29uc3QgKmEsIHBvbHkxNng0eDJfdCBiKSB7Citwb2x5MTZ4NHgyX3QgdGVzdF92bGQyX2xhbmVfcDE2KHBvbHkxNl90ICAqYSwgcG9seTE2eDR4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMl9sYW5lX3AxNgogICByZXR1cm4gdmxkMl9sYW5lX3AxNihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMiB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTY0eDF4Ml90IHRlc3RfdmxkMl9sYW5lX3A2NChwb2x5NjRfdCBjb25zdCAqYSwgcG9seTY0eDF4Ml90IGIpIHsKK3BvbHk2NHgxeDJfdCB0ZXN0X3ZsZDJfbGFuZV9wNjQocG9seTY0X3QgICphLCBwb2x5NjR4MXgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX2xhbmVfcDY0CiAgIHJldHVybiB2bGQyX2xhbmVfcDY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogbGQyIHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVswXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MTZ4OHgzX3QgdGVzdF92bGQzcV9sYW5lX3UxNih1aW50MTZfdCBjb25zdCAqYSwgdWludDE2eDh4M190IGIpIHsKK3VpbnQxNng4eDNfdCB0ZXN0X3ZsZDNxX2xhbmVfdTE2KHVpbnQxNl90ICAqYSwgdWludDE2eDh4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfbGFuZV91MTYKICAgcmV0dXJuIHZsZDNxX2xhbmVfdTE2KGEsIGIsIDcpOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQzMng0eDNfdCB0ZXN0X3ZsZDNxX2xhbmVfdTMyKHVpbnQzMl90IGNvbnN0ICphLCB1aW50MzJ4NHgzX3QgYikgewordWludDMyeDR4M190IHRlc3RfdmxkM3FfbGFuZV91MzIodWludDMyX3QgICphLCB1aW50MzJ4NHgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9sYW5lX3UzMgogICByZXR1cm4gdmxkM3FfbGFuZV91MzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDY0eDJ4M190IHRlc3RfdmxkM3FfbGFuZV91NjQodWludDY0X3QgY29uc3QgKmEsIHVpbnQ2NHgyeDNfdCBiKSB7Cit1aW50NjR4MngzX3QgdGVzdF92bGQzcV9sYW5lX3U2NCh1aW50NjRfdCAgKmEsIHVpbnQ2NHgyeDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2xhbmVfdTY0CiAgIHJldHVybiB2bGQzcV9sYW5lX3U2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQxNng4eDNfdCB0ZXN0X3ZsZDNxX2xhbmVfczE2KGludDE2X3QgY29uc3QgKmEsIGludDE2eDh4M190IGIpIHsKK2ludDE2eDh4M190IHRlc3RfdmxkM3FfbGFuZV9zMTYoaW50MTZfdCAgKmEsIGludDE2eDh4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfbGFuZV9zMTYKICAgcmV0dXJuIHZsZDNxX2xhbmVfczE2KGEsIGIsIDcpOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDMyeDR4M190IHRlc3RfdmxkM3FfbGFuZV9zMzIoaW50MzJfdCBjb25zdCAqYSwgaW50MzJ4NHgzX3QgYikgeworaW50MzJ4NHgzX3QgdGVzdF92bGQzcV9sYW5lX3MzMihpbnQzMl90ICAqYSwgaW50MzJ4NHgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9sYW5lX3MzMgogICByZXR1cm4gdmxkM3FfbGFuZV9zMzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50NjR4MngzX3QgdGVzdF92bGQzcV9sYW5lX3M2NChpbnQ2NF90IGNvbnN0ICphLCBpbnQ2NHgyeDNfdCBiKSB7CitpbnQ2NHgyeDNfdCB0ZXN0X3ZsZDNxX2xhbmVfczY0KGludDY0X3QgICphLCBpbnQ2NHgyeDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2xhbmVfczY0CiAgIHJldHVybiB2bGQzcV9sYW5lX3M2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDE2eDh4M190IHRlc3RfdmxkM3FfbGFuZV9mMTYoZmxvYXQxNl90IGNvbnN0ICphLCBmbG9hdDE2eDh4M190IGIpIHsKK2Zsb2F0MTZ4OHgzX3QgdGVzdF92bGQzcV9sYW5lX2YxNihmbG9hdDE2X3QgICphLCBmbG9hdDE2eDh4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfbGFuZV9mMTYKICAgcmV0dXJuIHZsZDNxX2xhbmVfZjE2KGEsIGIsIDcpOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MzJ4NHgzX3QgdGVzdF92bGQzcV9sYW5lX2YzMihmbG9hdDMyX3QgY29uc3QgKmEsIGZsb2F0MzJ4NHgzX3QgYikgeworZmxvYXQzMng0eDNfdCB0ZXN0X3ZsZDNxX2xhbmVfZjMyKGZsb2F0MzJfdCAgKmEsIGZsb2F0MzJ4NHgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9sYW5lX2YzMgogICByZXR1cm4gdmxkM3FfbGFuZV9mMzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotZmxvYXQ2NHgyeDNfdCB0ZXN0X3ZsZDNxX2xhbmVfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSwgZmxvYXQ2NHgyeDNfdCBiKSB7CitmbG9hdDY0eDJ4M190IHRlc3RfdmxkM3FfbGFuZV9mNjQoZmxvYXQ2NF90ICAqYSwgZmxvYXQ2NHgyeDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2xhbmVfZjY0CiAgIHJldHVybiB2bGQzcV9sYW5lX2Y2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5OHgxNngzX3QgdGVzdF92bGQzcV9sYW5lX3A4KHBvbHk4X3QgY29uc3QgKmEsIHBvbHk4eDE2eDNfdCBiKSB7Citwb2x5OHgxNngzX3QgdGVzdF92bGQzcV9sYW5lX3A4KHBvbHk4X3QgICphLCBwb2x5OHgxNngzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9sYW5lX3A4CiAgIHJldHVybiB2bGQzcV9sYW5lX3A4KGEsIGIsIDE1KTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ICp2WzAtOV0rLmIsIHZbMC05XSsuYiwgdlswLTldKy5iICp9fX1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHkxNng4eDNfdCB0ZXN0X3ZsZDNxX2xhbmVfcDE2KHBvbHkxNl90IGNvbnN0ICphLCBwb2x5MTZ4OHgzX3QgYikgeworcG9seTE2eDh4M190IHRlc3RfdmxkM3FfbGFuZV9wMTYocG9seTE2X3QgICphLCBwb2x5MTZ4OHgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzcV9sYW5lX3AxNgogICByZXR1cm4gdmxkM3FfbGFuZV9wMTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTY0eDJ4M190IHRlc3RfdmxkM3FfbGFuZV9wNjQocG9seTY0X3QgY29uc3QgKmEsIHBvbHk2NHgyeDNfdCBiKSB7Citwb2x5NjR4MngzX3QgdGVzdF92bGQzcV9sYW5lX3A2NChwb2x5NjRfdCAgKmEsIHBvbHk2NHgyeDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNxX2xhbmVfcDY0CiAgIHJldHVybiB2bGQzcV9sYW5lX3A2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50OHg4eDNfdCB0ZXN0X3ZsZDNfbGFuZV91OCh1aW50OF90IGNvbnN0ICphLCB1aW50OHg4eDNfdCBiKSB7Cit1aW50OHg4eDNfdCB0ZXN0X3ZsZDNfbGFuZV91OCh1aW50OF90ICAqYSwgdWludDh4OHgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2xhbmVfdTgKICAgcmV0dXJuIHZsZDNfbGFuZV91OChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MTZ4NHgzX3QgdGVzdF92bGQzX2xhbmVfdTE2KHVpbnQxNl90IGNvbnN0ICphLCB1aW50MTZ4NHgzX3QgYikgewordWludDE2eDR4M190IHRlc3RfdmxkM19sYW5lX3UxNih1aW50MTZfdCAgKmEsIHVpbnQxNng0eDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNfbGFuZV91MTYKICAgcmV0dXJuIHZsZDNfbGFuZV91MTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDMyeDJ4M190IHRlc3RfdmxkM19sYW5lX3UzMih1aW50MzJfdCBjb25zdCAqYSwgdWludDMyeDJ4M190IGIpIHsKK3VpbnQzMngyeDNfdCB0ZXN0X3ZsZDNfbGFuZV91MzIodWludDMyX3QgICphLCB1aW50MzJ4MngzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2xhbmVfdTMyCiAgIHJldHVybiB2bGQzX2xhbmVfdTMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyAqdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQ2NHgxeDNfdCB0ZXN0X3ZsZDNfbGFuZV91NjQodWludDY0X3QgY29uc3QgKmEsIHVpbnQ2NHgxeDNfdCBiKSB7Cit1aW50NjR4MXgzX3QgdGVzdF92bGQzX2xhbmVfdTY0KHVpbnQ2NF90ICAqYSwgdWludDY0eDF4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19sYW5lX3U2NAogICByZXR1cm4gdmxkM19sYW5lX3U2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMF0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ4eDh4M190IHRlc3RfdmxkM19sYW5lX3M4KGludDhfdCBjb25zdCAqYSwgaW50OHg4eDNfdCBiKSB7CitpbnQ4eDh4M190IHRlc3RfdmxkM19sYW5lX3M4KGludDhfdCAgKmEsIGludDh4OHgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2xhbmVfczgKICAgcmV0dXJuIHZsZDNfbGFuZV9zOChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQxNng0eDNfdCB0ZXN0X3ZsZDNfbGFuZV9zMTYoaW50MTZfdCBjb25zdCAqYSwgaW50MTZ4NHgzX3QgYikgeworaW50MTZ4NHgzX3QgdGVzdF92bGQzX2xhbmVfczE2KGludDE2X3QgICphLCBpbnQxNng0eDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNfbGFuZV9zMTYKICAgcmV0dXJuIHZsZDNfbGFuZV9zMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50MzJ4MngzX3QgdGVzdF92bGQzX2xhbmVfczMyKGludDMyX3QgY29uc3QgKmEsIGludDMyeDJ4M190IGIpIHsKK2ludDMyeDJ4M190IHRlc3RfdmxkM19sYW5lX3MzMihpbnQzMl90ICAqYSwgaW50MzJ4MngzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2xhbmVfczMyCiAgIHJldHVybiB2bGQzX2xhbmVfczMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyAqdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDY0eDF4M190IHRlc3RfdmxkM19sYW5lX3M2NChpbnQ2NF90IGNvbnN0ICphLCBpbnQ2NHgxeDNfdCBiKSB7CitpbnQ2NHgxeDNfdCB0ZXN0X3ZsZDNfbGFuZV9zNjQoaW50NjRfdCAgKmEsIGludDY0eDF4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19sYW5lX3M2NAogICByZXR1cm4gdmxkM19sYW5lX3M2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMF0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDE2eDR4M190IHRlc3RfdmxkM19sYW5lX2YxNihmbG9hdDE2X3QgY29uc3QgKmEsIGZsb2F0MTZ4NHgzX3QgYikgeworZmxvYXQxNng0eDNfdCB0ZXN0X3ZsZDNfbGFuZV9mMTYoZmxvYXQxNl90ICAqYSwgZmxvYXQxNng0eDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNfbGFuZV9mMTYKICAgcmV0dXJuIHZsZDNfbGFuZV9mMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotZmxvYXQzMngyeDNfdCB0ZXN0X3ZsZDNfbGFuZV9mMzIoZmxvYXQzMl90IGNvbnN0ICphLCBmbG9hdDMyeDJ4M190IGIpIHsKK2Zsb2F0MzJ4MngzX3QgdGVzdF92bGQzX2xhbmVfZjMyKGZsb2F0MzJfdCAgKmEsIGZsb2F0MzJ4MngzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2xhbmVfZjMyCiAgIHJldHVybiB2bGQzX2xhbmVfZjMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyAqdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0NjR4MXgzX3QgdGVzdF92bGQzX2xhbmVfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSwgZmxvYXQ2NHgxeDNfdCBiKSB7CitmbG9hdDY0eDF4M190IHRlc3RfdmxkM19sYW5lX2Y2NChmbG9hdDY0X3QgICphLCBmbG9hdDY0eDF4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM19sYW5lX2Y2NAogICByZXR1cm4gdmxkM19sYW5lX2Y2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMF0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5OHg4eDNfdCB0ZXN0X3ZsZDNfbGFuZV9wOChwb2x5OF90IGNvbnN0ICphLCBwb2x5OHg4eDNfdCBiKSB7Citwb2x5OHg4eDNfdCB0ZXN0X3ZsZDNfbGFuZV9wOChwb2x5OF90ICAqYSwgcG9seTh4OHgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2xhbmVfcDgKICAgcmV0dXJuIHZsZDNfbGFuZV9wOChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IGxkMyB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5MTZ4NHgzX3QgdGVzdF92bGQzX2xhbmVfcDE2KHBvbHkxNl90IGNvbnN0ICphLCBwb2x5MTZ4NHgzX3QgYikgeworcG9seTE2eDR4M190IHRlc3RfdmxkM19sYW5lX3AxNihwb2x5MTZfdCAgKmEsIHBvbHkxNng0eDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNfbGFuZV9wMTYKICAgcmV0dXJuIHZsZDNfbGFuZV9wMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDMge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDMge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTY0eDF4M190IHRlc3RfdmxkM19sYW5lX3A2NChwb2x5NjRfdCBjb25zdCAqYSwgcG9seTY0eDF4M190IGIpIHsKK3BvbHk2NHgxeDNfdCB0ZXN0X3ZsZDNfbGFuZV9wNjQocG9seTY0X3QgICphLCBwb2x5NjR4MXgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQzX2xhbmVfcDY0CiAgIHJldHVybiB2bGQzX2xhbmVfcDY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogbGQzIHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVswXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQzIHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzBdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQ4eDE2eDRfdCB0ZXN0X3ZsZDRxX2xhbmVfdTgodWludDhfdCBjb25zdCAqYSwgdWludDh4MTZ4NF90IGIpIHsKK3VpbnQ4eDE2eDRfdCB0ZXN0X3ZsZDRxX2xhbmVfdTgodWludDhfdCAgKmEsIHVpbnQ4eDE2eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX2xhbmVfdTgKICAgcmV0dXJuIHZsZDRxX2xhbmVfdTgoYSwgYiwgMTUpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5ifVsxNV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzE1XSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MTZ4OHg0X3QgdGVzdF92bGQ0cV9sYW5lX3UxNih1aW50MTZfdCBjb25zdCAqYSwgdWludDE2eDh4NF90IGIpIHsKK3VpbnQxNng4eDRfdCB0ZXN0X3ZsZDRxX2xhbmVfdTE2KHVpbnQxNl90ICAqYSwgdWludDE2eDh4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfbGFuZV91MTYKICAgcmV0dXJuIHZsZDRxX2xhbmVfdTE2KGEsIGIsIDcpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDMyeDR4NF90IHRlc3RfdmxkNHFfbGFuZV91MzIodWludDMyX3QgY29uc3QgKmEsIHVpbnQzMng0eDRfdCBiKSB7Cit1aW50MzJ4NHg0X3QgdGVzdF92bGQ0cV9sYW5lX3UzMih1aW50MzJfdCAgKmEsIHVpbnQzMng0eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX2xhbmVfdTMyCiAgIHJldHVybiB2bGQ0cV9sYW5lX3UzMihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0uc31bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsucywgdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXVpbnQ2NHgyeDRfdCB0ZXN0X3ZsZDRxX2xhbmVfdTY0KHVpbnQ2NF90IGNvbnN0ICphLCB1aW50NjR4Mng0X3QgYikgewordWludDY0eDJ4NF90IHRlc3RfdmxkNHFfbGFuZV91NjQodWludDY0X3QgICphLCB1aW50NjR4Mng0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0cV9sYW5lX3U2NAogICByZXR1cm4gdmxkNHFfbGFuZV91NjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ4eDE2eDRfdCB0ZXN0X3ZsZDRxX2xhbmVfczgoaW50OF90IGNvbnN0ICphLCBpbnQ4eDE2eDRfdCBiKSB7CitpbnQ4eDE2eDRfdCB0ZXN0X3ZsZDRxX2xhbmVfczgoaW50OF90ICAqYSwgaW50OHgxNng0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0cV9sYW5lX3M4CiAgIHJldHVybiB2bGQ0cV9sYW5lX3M4KGEsIGIsIDE1KTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ICp2WzAtOV0rLmIsIHZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVsxNV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotaW50MTZ4OHg0X3QgdGVzdF92bGQ0cV9sYW5lX3MxNihpbnQxNl90IGNvbnN0ICphLCBpbnQxNng4eDRfdCBiKSB7CitpbnQxNng4eDRfdCB0ZXN0X3ZsZDRxX2xhbmVfczE2KGludDE2X3QgICphLCBpbnQxNng4eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX2xhbmVfczE2CiAgIHJldHVybiB2bGQ0cV9sYW5lX3MxNihhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDMyeDR4NF90IHRlc3RfdmxkNHFfbGFuZV9zMzIoaW50MzJfdCBjb25zdCAqYSwgaW50MzJ4NHg0X3QgYikgeworaW50MzJ4NHg0X3QgdGVzdF92bGQ0cV9sYW5lX3MzMihpbnQzMl90ICAqYSwgaW50MzJ4NHg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0cV9sYW5lX3MzMgogICByZXR1cm4gdmxkNHFfbGFuZV9zMzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zLCB2WzAtOV0rLnMgKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ2NHgyeDRfdCB0ZXN0X3ZsZDRxX2xhbmVfczY0KGludDY0X3QgY29uc3QgKmEsIGludDY0eDJ4NF90IGIpIHsKK2ludDY0eDJ4NF90IHRlc3RfdmxkNHFfbGFuZV9zNjQoaW50NjRfdCAgKmEsIGludDY0eDJ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfbGFuZV9zNjQKICAgcmV0dXJuIHZsZDRxX2xhbmVfczY0KGEsIGIsIDEpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotZmxvYXQxNng4eDRfdCB0ZXN0X3ZsZDRxX2xhbmVfZjE2KGZsb2F0MTZfdCBjb25zdCAqYSwgZmxvYXQxNng4eDRfdCBiKSB7CitmbG9hdDE2eDh4NF90IHRlc3RfdmxkNHFfbGFuZV9mMTYoZmxvYXQxNl90ICAqYSwgZmxvYXQxNng4eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRxX2xhbmVfZjE2CiAgIHJldHVybiB2bGQ0cV9sYW5lX2YxNihhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MzJ4NHg0X3QgdGVzdF92bGQ0cV9sYW5lX2YzMihmbG9hdDMyX3QgY29uc3QgKmEsIGZsb2F0MzJ4NHg0X3QgYikgeworZmxvYXQzMng0eDRfdCB0ZXN0X3ZsZDRxX2xhbmVfZjMyKGZsb2F0MzJfdCAgKmEsIGZsb2F0MzJ4NHg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0cV9sYW5lX2YzMgogICByZXR1cm4gdmxkNHFfbGFuZV9mMzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zLCB2WzAtOV0rLnMgKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1mbG9hdDY0eDJ4NF90IHRlc3RfdmxkNHFfbGFuZV9mNjQoZmxvYXQ2NF90IGNvbnN0ICphLCBmbG9hdDY0eDJ4NF90IGIpIHsKK2Zsb2F0NjR4Mng0X3QgdGVzdF92bGQ0cV9sYW5lX2Y2NChmbG9hdDY0X3QgICphLCBmbG9hdDY0eDJ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfbGFuZV9mNjQKICAgcmV0dXJuIHZsZDRxX2xhbmVfZjY0KGEsIGIsIDEpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTh4MTZ4NF90IHRlc3RfdmxkNHFfbGFuZV9wOChwb2x5OF90IGNvbnN0ICphLCBwb2x5OHgxNng0X3QgYikgeworcG9seTh4MTZ4NF90IHRlc3RfdmxkNHFfbGFuZV9wOChwb2x5OF90ICAqYSwgcG9seTh4MTZ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfbGFuZV9wOAogICByZXR1cm4gdmxkNHFfbGFuZV9wOChhLCBiLCAxNSk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmJ9WzE1XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiwgdlswLTldKy5iICp9fX1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHkxNng4eDRfdCB0ZXN0X3ZsZDRxX2xhbmVfcDE2KHBvbHkxNl90IGNvbnN0ICphLCBwb2x5MTZ4OHg0X3QgYikgeworcG9seTE2eDh4NF90IHRlc3RfdmxkNHFfbGFuZV9wMTYocG9seTE2X3QgICphLCBwb2x5MTZ4OHg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0cV9sYW5lX3AxNgogICByZXR1cm4gdmxkNHFfbGFuZV9wMTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi1wb2x5NjR4Mng0X3QgdGVzdF92bGQ0cV9sYW5lX3A2NChwb2x5NjRfdCBjb25zdCAqYSwgcG9seTY0eDJ4NF90IGIpIHsKK3BvbHk2NHgyeDRfdCB0ZXN0X3ZsZDRxX2xhbmVfcDY0KHBvbHk2NF90ICAqYSwgcG9seTY0eDJ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNHFfbGFuZV9wNjQKICAgcmV0dXJuIHZsZDRxX2xhbmVfcDY0KGEsIGIsIDEpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdWludDh4OHg0X3QgdGVzdF92bGQ0X2xhbmVfdTgodWludDhfdCBjb25zdCAqYSwgdWludDh4OHg0X3QgYikgewordWludDh4OHg0X3QgdGVzdF92bGQ0X2xhbmVfdTgodWludDhfdCAgKmEsIHVpbnQ4eDh4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9sYW5lX3U4CiAgIHJldHVybiB2bGQ0X2xhbmVfdTgoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmJ9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ICp2WzAtOV0rLmIsIHZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MTZ4NHg0X3QgdGVzdF92bGQ0X2xhbmVfdTE2KHVpbnQxNl90IGNvbnN0ICphLCB1aW50MTZ4NHg0X3QgYikgewordWludDE2eDR4NF90IHRlc3RfdmxkNF9sYW5lX3UxNih1aW50MTZfdCAgKmEsIHVpbnQxNng0eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfbGFuZV91MTYKICAgcmV0dXJuIHZsZDRfbGFuZV91MTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50MzJ4Mng0X3QgdGVzdF92bGQ0X2xhbmVfdTMyKHVpbnQzMl90IGNvbnN0ICphLCB1aW50MzJ4Mng0X3QgYikgewordWludDMyeDJ4NF90IHRlc3RfdmxkNF9sYW5lX3UzMih1aW50MzJfdCAgKmEsIHVpbnQzMngyeDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfbGFuZV91MzIKICAgcmV0dXJuIHZsZDRfbGFuZV91MzIoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zLCB2WzAtOV0rLnMgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi11aW50NjR4MXg0X3QgdGVzdF92bGQ0X2xhbmVfdTY0KHVpbnQ2NF90IGNvbnN0ICphLCB1aW50NjR4MXg0X3QgYikgewordWludDY0eDF4NF90IHRlc3RfdmxkNF9sYW5lX3U2NCh1aW50NjRfdCAgKmEsIHVpbnQ2NHgxeDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfbGFuZV91NjQKICAgcmV0dXJuIHZsZDRfbGFuZV91NjQoYSwgYiwgMCk7Ci0gIC8vIENIRUNLOiBsZDQge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzBdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDQge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi1pbnQ4eDh4NF90IHRlc3RfdmxkNF9sYW5lX3M4KGludDhfdCBjb25zdCAqYSwgaW50OHg4eDRfdCBiKSB7CitpbnQ4eDh4NF90IHRlc3RfdmxkNF9sYW5lX3M4KGludDhfdCAgKmEsIGludDh4OHg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2xhbmVfczgKICAgcmV0dXJuIHZsZDRfbGFuZV9zOChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDE2eDR4NF90IHRlc3RfdmxkNF9sYW5lX3MxNihpbnQxNl90IGNvbnN0ICphLCBpbnQxNng0eDRfdCBiKSB7CitpbnQxNng0eDRfdCB0ZXN0X3ZsZDRfbGFuZV9zMTYoaW50MTZfdCAgKmEsIGludDE2eDR4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9sYW5lX3MxNgogICByZXR1cm4gdmxkNF9sYW5lX3MxNihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDMyeDJ4NF90IHRlc3RfdmxkNF9sYW5lX3MzMihpbnQzMl90IGNvbnN0ICphLCBpbnQzMngyeDRfdCBiKSB7CitpbnQzMngyeDRfdCB0ZXN0X3ZsZDRfbGFuZV9zMzIoaW50MzJfdCAgKmEsIGludDMyeDJ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9sYW5lX3MzMgogICByZXR1cm4gdmxkNF9sYW5lX3MzMihhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0uc31bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsucywgdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWludDY0eDF4NF90IHRlc3RfdmxkNF9sYW5lX3M2NChpbnQ2NF90IGNvbnN0ICphLCBpbnQ2NHgxeDRfdCBiKSB7CitpbnQ2NHgxeDRfdCB0ZXN0X3ZsZDRfbGFuZV9zNjQoaW50NjRfdCAgKmEsIGludDY0eDF4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9sYW5lX3M2NAogICByZXR1cm4gdmxkNF9sYW5lX3M2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMF0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzBdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MTZ4NHg0X3QgdGVzdF92bGQ0X2xhbmVfZjE2KGZsb2F0MTZfdCBjb25zdCAqYSwgZmxvYXQxNng0eDRfdCBiKSB7CitmbG9hdDE2eDR4NF90IHRlc3RfdmxkNF9sYW5lX2YxNihmbG9hdDE2X3QgICphLCBmbG9hdDE2eDR4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9sYW5lX2YxNgogICByZXR1cm4gdmxkNF9sYW5lX2YxNihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0MzJ4Mng0X3QgdGVzdF92bGQ0X2xhbmVfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSwgZmxvYXQzMngyeDRfdCBiKSB7CitmbG9hdDMyeDJ4NF90IHRlc3RfdmxkNF9sYW5lX2YzMihmbG9hdDMyX3QgICphLCBmbG9hdDMyeDJ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9sYW5lX2YzMgogICByZXR1cm4gdmxkNF9sYW5lX2YzMihhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0uc31bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsucywgdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLWZsb2F0NjR4MXg0X3QgdGVzdF92bGQ0X2xhbmVfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSwgZmxvYXQ2NHgxeDRfdCBiKSB7CitmbG9hdDY0eDF4NF90IHRlc3RfdmxkNF9sYW5lX2Y2NChmbG9hdDY0X3QgICphLCBmbG9hdDY0eDF4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkNF9sYW5lX2Y2NAogICByZXR1cm4gdmxkNF9sYW5lX2Y2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGxkNCB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMF0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzBdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHk4eDh4NF90IHRlc3RfdmxkNF9sYW5lX3A4KHBvbHk4X3QgY29uc3QgKmEsIHBvbHk4eDh4NF90IGIpIHsKK3BvbHk4eDh4NF90IHRlc3RfdmxkNF9sYW5lX3A4KHBvbHk4X3QgICphLCBwb2x5OHg4eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDRfbGFuZV9wOAogICByZXR1cm4gdmxkNF9sYW5lX3A4KGEsIGIsIDcpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5ifVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiwgdlswLTldKy5iICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTE2eDR4NF90IHRlc3RfdmxkNF9sYW5lX3AxNihwb2x5MTZfdCBjb25zdCAqYSwgcG9seTE2eDR4NF90IGIpIHsKK3BvbHkxNng0eDRfdCB0ZXN0X3ZsZDRfbGFuZV9wMTYocG9seTE2X3QgICphLCBwb2x5MTZ4NHg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2xhbmVfcDE2CiAgIHJldHVybiB2bGQ0X2xhbmVfcDE2KGEsIGIsIDMpOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotcG9seTY0eDF4NF90IHRlc3RfdmxkNF9sYW5lX3A2NChwb2x5NjRfdCBjb25zdCAqYSwgcG9seTY0eDF4NF90IGIpIHsKK3BvbHk2NHgxeDRfdCB0ZXN0X3ZsZDRfbGFuZV9wNjQocG9seTY0X3QgICphLCBwb2x5NjR4MXg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X2xhbmVfcDY0CiAgIHJldHVybiB2bGQ0X2xhbmVfcDY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogbGQ0IHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVswXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQ0IHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kICp9fX1bMF0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDFxX2xhbmVfdTgodWludDhfdCBjb25zdCAqYSwgdWludDh4MTZfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MXFfbGFuZV91OCh1aW50OF90ICAqYSwgdWludDh4MTZfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX2xhbmVfdTgKICAgdnN0MXFfbGFuZV91OChhLCBiLCAxNSk7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LmJ9WzE1XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyAqdlswLTldKy5iICp9fX1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QxcV9sYW5lX3UxNih1aW50MTZfdCBjb25zdCAqYSwgdWludDE2eDhfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MXFfbGFuZV91MTYodWludDE2X3QgICphLCB1aW50MTZ4OF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfbGFuZV91MTYKICAgdnN0MXFfbGFuZV91MTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ICp2WzAtOV0rLmggKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MXFfbGFuZV91MzIodWludDMyX3QgY29uc3QgKmEsIHVpbnQzMng0X3QgYikgewordm9pZCB0ZXN0X3ZzdDFxX2xhbmVfdTMyKHVpbnQzMl90ICAqYSwgdWludDMyeDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX2xhbmVfdTMyCiAgIHZzdDFxX2xhbmVfdTMyKGEsIGIsIDMpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS5zfVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyAqdlswLTldKy5zICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDFxX2xhbmVfdTY0KHVpbnQ2NF90IGNvbnN0ICphLCB1aW50NjR4Ml90IGIpIHsKK3ZvaWQgdGVzdF92c3QxcV9sYW5lX3U2NCh1aW50NjRfdCAgKmEsIHVpbnQ2NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9sYW5lX3U2NAogICB2c3QxcV9sYW5lX3U2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgKnZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QxcV9sYW5lX3M4KGludDhfdCBjb25zdCAqYSwgaW50OHgxNl90IGIpIHsKK3ZvaWQgdGVzdF92c3QxcV9sYW5lX3M4KGludDhfdCAgKmEsIGludDh4MTZfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX2xhbmVfczgKICAgdnN0MXFfbGFuZV9zOChhLCBiLCAxNSk7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LmJ9WzE1XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyAqdlswLTldKy5iICp9fX1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QxcV9sYW5lX3MxNihpbnQxNl90IGNvbnN0ICphLCBpbnQxNng4X3QgYikgewordm9pZCB0ZXN0X3ZzdDFxX2xhbmVfczE2KGludDE2X3QgICphLCBpbnQxNng4X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9sYW5lX3MxNgogICB2c3QxcV9sYW5lX3MxNihhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uaH1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgKnZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QxcV9sYW5lX3MzMihpbnQzMl90IGNvbnN0ICphLCBpbnQzMng0X3QgYikgewordm9pZCB0ZXN0X3ZzdDFxX2xhbmVfczMyKGludDMyX3QgICphLCBpbnQzMng0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9sYW5lX3MzMgogICB2c3QxcV9sYW5lX3MzMihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uc31bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgKnZbMC05XSsucyAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QxcV9sYW5lX3M2NChpbnQ2NF90IGNvbnN0ICphLCBpbnQ2NHgyX3QgYikgewordm9pZCB0ZXN0X3ZzdDFxX2xhbmVfczY0KGludDY0X3QgICphLCBpbnQ2NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9sYW5lX3M2NAogICB2c3QxcV9sYW5lX3M2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgKnZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QxcV9sYW5lX2YxNihmbG9hdDE2X3QgY29uc3QgKmEsIGZsb2F0MTZ4OF90IGIpIHsKK3ZvaWQgdGVzdF92c3QxcV9sYW5lX2YxNihmbG9hdDE2X3QgICphLCBmbG9hdDE2eDhfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX2xhbmVfZjE2CiAgIHZzdDFxX2xhbmVfZjE2KGEsIGIsIDcpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS5ofVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyAqdlswLTldKy5oICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDFxX2xhbmVfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSwgZmxvYXQzMng0X3QgYikgewordm9pZCB0ZXN0X3ZzdDFxX2xhbmVfZjMyKGZsb2F0MzJfdCAgKmEsIGZsb2F0MzJ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MXFfbGFuZV9mMzIKICAgdnN0MXFfbGFuZV9mMzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ICp2WzAtOV0rLnMgKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MXFfbGFuZV9mNjQoZmxvYXQ2NF90IGNvbnN0ICphLCBmbG9hdDY0eDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MXFfbGFuZV9mNjQoZmxvYXQ2NF90ICAqYSwgZmxvYXQ2NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9sYW5lX2Y2NAogICB2c3QxcV9sYW5lX2Y2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgKnZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXBvbHk4eDE2X3QgdGVzdF92c3QxcV9sYW5lX3A4KHBvbHk4X3QgY29uc3QgKmEsIHBvbHk4eDE2X3QgYikgewordm9pZCB0ZXN0X3ZzdDFxX2xhbmVfcDgocG9seThfdCAgKmEsIHBvbHk4eDE2X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9sYW5lX3A4CiAgIHZzdDFxX2xhbmVfcDgoYSwgYiwgMTUpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS5ifVsxNV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgKnZbMC05XSsuYiAqfX19WzE1XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MXFfbGFuZV9wMTYocG9seTE2X3QgY29uc3QgKmEsIHBvbHkxNng4X3QgYikgewordm9pZCB0ZXN0X3ZzdDFxX2xhbmVfcDE2KHBvbHkxNl90ICAqYSwgcG9seTE2eDhfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX2xhbmVfcDE2CiAgIHZzdDFxX2xhbmVfcDE2KGEsIGIsIDcpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS5ofVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyAqdlswLTldKy5oICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDFxX2xhbmVfcDY0KHBvbHk2NF90IGNvbnN0ICphLCBwb2x5NjR4Ml90IGIpIHsKK3ZvaWQgdGVzdF92c3QxcV9sYW5lX3A2NChwb2x5NjRfdCAgKmEsIHBvbHk2NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxcV9sYW5lX3A2NAogICB2c3QxcV9sYW5lX3A2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgKnZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QxX2xhbmVfdTgodWludDhfdCBjb25zdCAqYSwgdWludDh4OF90IGIpIHsKK3ZvaWQgdGVzdF92c3QxX2xhbmVfdTgodWludDhfdCAgKmEsIHVpbnQ4eDhfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfbGFuZV91OAogICB2c3QxX2xhbmVfdTgoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LmJ9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ICp2WzAtOV0rLmIgKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MV9sYW5lX3UxNih1aW50MTZfdCBjb25zdCAqYSwgdWludDE2eDRfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MV9sYW5lX3UxNih1aW50MTZfdCAgKmEsIHVpbnQxNng0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX2xhbmVfdTE2CiAgIHZzdDFfbGFuZV91MTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ICp2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MV9sYW5lX3UzMih1aW50MzJfdCBjb25zdCAqYSwgdWludDMyeDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MV9sYW5lX3UzMih1aW50MzJfdCAgKmEsIHVpbnQzMngyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX2xhbmVfdTMyCiAgIHZzdDFfbGFuZV91MzIoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LnN9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ICp2WzAtOV0rLnMgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MV9sYW5lX3U2NCh1aW50NjRfdCBjb25zdCAqYSwgdWludDY0eDFfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MV9sYW5lX3U2NCh1aW50NjRfdCAgKmEsIHVpbnQ2NHgxX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX2xhbmVfdTY0CiAgIHZzdDFfbGFuZV91NjQoYSwgYiwgMCk7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LmR9WzBdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ICp2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MV9sYW5lX3M4KGludDhfdCBjb25zdCAqYSwgaW50OHg4X3QgYikgewordm9pZCB0ZXN0X3ZzdDFfbGFuZV9zOChpbnQ4X3QgICphLCBpbnQ4eDhfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfbGFuZV9zOAogICB2c3QxX2xhbmVfczgoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LmJ9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ICp2WzAtOV0rLmIgKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MV9sYW5lX3MxNihpbnQxNl90IGNvbnN0ICphLCBpbnQxNng0X3QgYikgewordm9pZCB0ZXN0X3ZzdDFfbGFuZV9zMTYoaW50MTZfdCAgKmEsIGludDE2eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfbGFuZV9zMTYKICAgdnN0MV9sYW5lX3MxNihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uaH1bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgKnZbMC05XSsuaCAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QxX2xhbmVfczMyKGludDMyX3QgY29uc3QgKmEsIGludDMyeDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MV9sYW5lX3MzMihpbnQzMl90ICAqYSwgaW50MzJ4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9sYW5lX3MzMgogICB2c3QxX2xhbmVfczMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS5zfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyAqdlswLTldKy5zICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDFfbGFuZV9zNjQoaW50NjRfdCBjb25zdCAqYSwgaW50NjR4MV90IGIpIHsKK3ZvaWQgdGVzdF92c3QxX2xhbmVfczY0KGludDY0X3QgICphLCBpbnQ2NHgxX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX2xhbmVfczY0CiAgIHZzdDFfbGFuZV9zNjQoYSwgYiwgMCk7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LmR9WzBdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDEge3t7ICp2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MV9sYW5lX2YxNihmbG9hdDE2X3QgY29uc3QgKmEsIGZsb2F0MTZ4NF90IGIpIHsKK3ZvaWQgdGVzdF92c3QxX2xhbmVfZjE2KGZsb2F0MTZfdCAgKmEsIGZsb2F0MTZ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9sYW5lX2YxNgogICB2c3QxX2xhbmVfZjE2KGEsIGIsIDMpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS5ofVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyAqdlswLTldKy5oICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDFfbGFuZV9mMzIoZmxvYXQzMl90IGNvbnN0ICphLCBmbG9hdDMyeDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MV9sYW5lX2YzMihmbG9hdDMyX3QgICphLCBmbG9hdDMyeDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfbGFuZV9mMzIKICAgdnN0MV9sYW5lX2YzMihhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IHN0MSB7dnt7WzAtOV0rfX0uc31bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MSB7e3sgKnZbMC05XSsucyAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QxX2xhbmVfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSwgZmxvYXQ2NHgxX3QgYikgewordm9pZCB0ZXN0X3ZzdDFfbGFuZV9mNjQoZmxvYXQ2NF90ICAqYSwgZmxvYXQ2NHgxX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX2xhbmVfZjY0CiAgIHZzdDFfbGFuZV9mNjQoYSwgYiwgMCk7Ci0gIC8vIENIRUNLOiBzdDEge3Z7e1swLTldK319LmR9WzBdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiB7e3N0MSB7dlswLTldKy5kfVxbMF18c3RyIGRbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MV9sYW5lX3A4KHBvbHk4X3QgY29uc3QgKmEsIHBvbHk4eDhfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MV9sYW5lX3A4KHBvbHk4X3QgICphLCBwb2x5OHg4X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QxX2xhbmVfcDgKICAgdnN0MV9sYW5lX3A4KGEsIGIsIDcpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS5ifVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyAqdlswLTldKy5iICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDFfbGFuZV9wMTYocG9seTE2X3QgY29uc3QgKmEsIHBvbHkxNng0X3QgYikgewordm9pZCB0ZXN0X3ZzdDFfbGFuZV9wMTYocG9seTE2X3QgICphLCBwb2x5MTZ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9sYW5lX3AxNgogICB2c3QxX2xhbmVfcDE2KGEsIGIsIDMpOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS5ofVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyAqdlswLTldKy5oICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDFfbGFuZV9wNjQocG9seTY0X3QgY29uc3QgKmEsIHBvbHk2NHgxX3QgYikgewordm9pZCB0ZXN0X3ZzdDFfbGFuZV9wNjQocG9seTY0X3QgICphLCBwb2x5NjR4MV90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MV9sYW5lX3A2NAogICB2c3QxX2xhbmVfcDY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogc3QxIHt2e3tbMC05XSt9fS5kfVswXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QxIHt7eyAqdlswLTldKy5kICp9fX1bMF0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDJxX2xhbmVfdTgodWludDhfdCBjb25zdCAqYSwgdWludDh4MTZ4Ml90IGIpIHsKK3ZvaWQgdGVzdF92c3QycV9sYW5lX3U4KHVpbnQ4X3QgICphLCB1aW50OHgxNngyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QycV9sYW5lX3U4CiAgIHZzdDJxX2xhbmVfdTgoYSwgYiwgMTUpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5ifVsxNV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iICp9fX1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QycV9sYW5lX3UxNih1aW50MTZfdCBjb25zdCAqYSwgdWludDE2eDh4Ml90IGIpIHsKK3ZvaWQgdGVzdF92c3QycV9sYW5lX3UxNih1aW50MTZfdCAgKmEsIHVpbnQxNng4eDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJxX2xhbmVfdTE2CiAgIHZzdDJxX2xhbmVfdTE2KGEsIGIsIDcpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MnFfbGFuZV91MzIodWludDMyX3QgY29uc3QgKmEsIHVpbnQzMng0eDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MnFfbGFuZV91MzIodWludDMyX3QgICphLCB1aW50MzJ4NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QycV9sYW5lX3UzMgogICB2c3QycV9sYW5lX3UzMihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0uc31bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgKnZbMC05XSsucywgdlswLTldKy5zICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDJxX2xhbmVfdTY0KHVpbnQ2NF90IGNvbnN0ICphLCB1aW50NjR4MngyX3QgYikgewordm9pZCB0ZXN0X3ZzdDJxX2xhbmVfdTY0KHVpbnQ2NF90ICAqYSwgdWludDY0eDJ4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfbGFuZV91NjQKICAgdnN0MnFfbGFuZV91NjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QycV9sYW5lX3M4KGludDhfdCBjb25zdCAqYSwgaW50OHgxNngyX3QgYikgewordm9pZCB0ZXN0X3ZzdDJxX2xhbmVfczgoaW50OF90ICAqYSwgaW50OHgxNngyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QycV9sYW5lX3M4CiAgIHZzdDJxX2xhbmVfczgoYSwgYiwgMTUpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5ifVsxNV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iICp9fX1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QycV9sYW5lX3MxNihpbnQxNl90IGNvbnN0ICphLCBpbnQxNng4eDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MnFfbGFuZV9zMTYoaW50MTZfdCAgKmEsIGludDE2eDh4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfbGFuZV9zMTYKICAgdnN0MnFfbGFuZV9zMTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QycV9sYW5lX3MzMihpbnQzMl90IGNvbnN0ICphLCBpbnQzMng0eDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MnFfbGFuZV9zMzIoaW50MzJfdCAgKmEsIGludDMyeDR4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfbGFuZV9zMzIKICAgdnN0MnFfbGFuZV9zMzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QycV9sYW5lX3M2NChpbnQ2NF90IGNvbnN0ICphLCBpbnQ2NHgyeDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MnFfbGFuZV9zNjQoaW50NjRfdCAgKmEsIGludDY0eDJ4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfbGFuZV9zNjQKICAgdnN0MnFfbGFuZV9zNjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QycV9sYW5lX2YxNihmbG9hdDE2X3QgY29uc3QgKmEsIGZsb2F0MTZ4OHgyX3QgYikgewordm9pZCB0ZXN0X3ZzdDJxX2xhbmVfZjE2KGZsb2F0MTZfdCAgKmEsIGZsb2F0MTZ4OHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QycV9sYW5lX2YxNgogICB2c3QycV9sYW5lX2YxNihhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDJxX2xhbmVfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSwgZmxvYXQzMng0eDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MnFfbGFuZV9mMzIoZmxvYXQzMl90ICAqYSwgZmxvYXQzMng0eDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJxX2xhbmVfZjMyCiAgIHZzdDJxX2xhbmVfZjMyKGEsIGIsIDMpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zfVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyAqdlswLTldKy5zLCB2WzAtOV0rLnMgKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MnFfbGFuZV9mNjQoZmxvYXQ2NF90IGNvbnN0ICphLCBmbG9hdDY0eDJ4Ml90IGIpIHsKK3ZvaWQgdGVzdF92c3QycV9sYW5lX2Y2NChmbG9hdDY0X3QgICphLCBmbG9hdDY0eDJ4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfbGFuZV9mNjQKICAgdnN0MnFfbGFuZV9mNjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QycV9sYW5lX3A4KHBvbHk4X3QgY29uc3QgKmEsIHBvbHk4eDE2eDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MnFfbGFuZV9wOChwb2x5OF90ICAqYSwgcG9seTh4MTZ4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfbGFuZV9wOAogICB2c3QycV9sYW5lX3A4KGEsIGIsIDE1KTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ICp2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzE1XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0MnFfbGFuZV9wMTYocG9seTE2X3QgY29uc3QgKmEsIHBvbHkxNng4eDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0MnFfbGFuZV9wMTYocG9seTE2X3QgICphLCBwb2x5MTZ4OHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QycV9sYW5lX3AxNgogICB2c3QycV9sYW5lX3AxNihhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDJxX2xhbmVfcDY0KHBvbHk2NF90IGNvbnN0ICphLCBwb2x5NjR4MngyX3QgYikgewordm9pZCB0ZXN0X3ZzdDJxX2xhbmVfcDY0KHBvbHk2NF90ICAqYSwgcG9seTY0eDJ4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfbGFuZV9wNjQKICAgdnN0MnFfbGFuZV9wNjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QyX2xhbmVfdTgodWludDhfdCBjb25zdCAqYSwgdWludDh4OHgyX3QgYikgewordm9pZCB0ZXN0X3ZzdDJfbGFuZV91OCh1aW50OF90ICAqYSwgdWludDh4OHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QyX2xhbmVfdTgKICAgdnN0Ml9sYW5lX3U4KGEsIGIsIDcpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5ifVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0Ml9sYW5lX3UxNih1aW50MTZfdCBjb25zdCAqYSwgdWludDE2eDR4Ml90IGIpIHsKK3ZvaWQgdGVzdF92c3QyX2xhbmVfdTE2KHVpbnQxNl90ICAqYSwgdWludDE2eDR4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0Ml9sYW5lX3UxNgogICB2c3QyX2xhbmVfdTE2KGEsIGIsIDMpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0Ml9sYW5lX3UzMih1aW50MzJfdCBjb25zdCAqYSwgdWludDMyeDJ4Ml90IGIpIHsKK3ZvaWQgdGVzdF92c3QyX2xhbmVfdTMyKHVpbnQzMl90ICAqYSwgdWludDMyeDJ4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0Ml9sYW5lX3UzMgogICB2c3QyX2xhbmVfdTMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyAqdlswLTldKy5zLCB2WzAtOV0rLnMgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0Ml9sYW5lX3U2NCh1aW50NjRfdCBjb25zdCAqYSwgdWludDY0eDF4Ml90IGIpIHsKK3ZvaWQgdGVzdF92c3QyX2xhbmVfdTY0KHVpbnQ2NF90ICAqYSwgdWludDY0eDF4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0Ml9sYW5lX3U2NAogICB2c3QyX2xhbmVfdTY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVswXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0Ml9sYW5lX3M4KGludDhfdCBjb25zdCAqYSwgaW50OHg4eDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0Ml9sYW5lX3M4KGludDhfdCAgKmEsIGludDh4OHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QyX2xhbmVfczgKICAgdnN0Ml9sYW5lX3M4KGEsIGIsIDcpOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5ifVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0Ml9sYW5lX3MxNihpbnQxNl90IGNvbnN0ICphLCBpbnQxNng0eDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0Ml9sYW5lX3MxNihpbnQxNl90ICAqYSwgaW50MTZ4NHgyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QyX2xhbmVfczE2CiAgIHZzdDJfbGFuZV9zMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QyX2xhbmVfczMyKGludDMyX3QgY29uc3QgKmEsIGludDMyeDJ4Ml90IGIpIHsKK3ZvaWQgdGVzdF92c3QyX2xhbmVfczMyKGludDMyX3QgICphLCBpbnQzMngyeDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJfbGFuZV9zMzIKICAgdnN0Ml9sYW5lX3MzMihhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0uc31bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgKnZbMC05XSsucywgdlswLTldKy5zICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDJfbGFuZV9zNjQoaW50NjRfdCBjb25zdCAqYSwgaW50NjR4MXgyX3QgYikgewordm9pZCB0ZXN0X3ZzdDJfbGFuZV9zNjQoaW50NjRfdCAgKmEsIGludDY0eDF4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0Ml9sYW5lX3M2NAogICB2c3QyX2xhbmVfczY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVswXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0Ml9sYW5lX2YxNihmbG9hdDE2X3QgY29uc3QgKmEsIGZsb2F0MTZ4NHgyX3QgYikgewordm9pZCB0ZXN0X3ZzdDJfbGFuZV9mMTYoZmxvYXQxNl90ICAqYSwgZmxvYXQxNng0eDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJfbGFuZV9mMTYKICAgdnN0Ml9sYW5lX2YxNihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDJfbGFuZV9mMzIoZmxvYXQzMl90IGNvbnN0ICphLCBmbG9hdDMyeDJ4Ml90IGIpIHsKK3ZvaWQgdGVzdF92c3QyX2xhbmVfZjMyKGZsb2F0MzJfdCAgKmEsIGZsb2F0MzJ4MngyX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QyX2xhbmVfZjMyCiAgIHZzdDJfbGFuZV9mMzIoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDIge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDIge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QyX2xhbmVfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSwgZmxvYXQ2NHgxeDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0Ml9sYW5lX2Y2NChmbG9hdDY0X3QgICphLCBmbG9hdDY0eDF4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0Ml9sYW5lX2Y2NAogICB2c3QyX2xhbmVfZjY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogc3QyIHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVswXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QyIHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0Ml9sYW5lX3A4KHBvbHk4X3QgY29uc3QgKmEsIHBvbHk4eDh4Ml90IGIpIHsKK3ZvaWQgdGVzdF92c3QyX2xhbmVfcDgocG9seThfdCAgKmEsIHBvbHk4eDh4Ml90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0Ml9sYW5lX3A4CiAgIHZzdDJfbGFuZV9wOChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDJfbGFuZV9wMTYocG9seTE2X3QgY29uc3QgKmEsIHBvbHkxNng0eDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0Ml9sYW5lX3AxNihwb2x5MTZfdCAgKmEsIHBvbHkxNng0eDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJfbGFuZV9wMTYKICAgdnN0Ml9sYW5lX3AxNihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDJfbGFuZV9wNjQocG9seTY0X3QgY29uc3QgKmEsIHBvbHk2NHgxeDJfdCBiKSB7Cit2b2lkIHRlc3RfdnN0Ml9sYW5lX3A2NChwb2x5NjRfdCAgKmEsIHBvbHk2NHgxeDJfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDJfbGFuZV9wNjQKICAgdnN0Ml9sYW5lX3A2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IHN0MiB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMF0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MiB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kICp9fX1bMF0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDNxX2xhbmVfdTgodWludDhfdCBjb25zdCAqYSwgdWludDh4MTZ4M190IGIpIHsKK3ZvaWQgdGVzdF92c3QzcV9sYW5lX3U4KHVpbnQ4X3QgICphLCB1aW50OHgxNngzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzcV9sYW5lX3U4CiAgIHZzdDNxX2xhbmVfdTgoYSwgYiwgMTUpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5ifVsxNV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVsxNV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDNxX2xhbmVfdTE2KHVpbnQxNl90IGNvbnN0ICphLCB1aW50MTZ4OHgzX3QgYikgewordm9pZCB0ZXN0X3ZzdDNxX2xhbmVfdTE2KHVpbnQxNl90ICAqYSwgdWludDE2eDh4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M3FfbGFuZV91MTYKICAgdnN0M3FfbGFuZV91MTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDNxX2xhbmVfdTMyKHVpbnQzMl90IGNvbnN0ICphLCB1aW50MzJ4NHgzX3QgYikgewordm9pZCB0ZXN0X3ZzdDNxX2xhbmVfdTMyKHVpbnQzMl90ICAqYSwgdWludDMyeDR4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M3FfbGFuZV91MzIKICAgdnN0M3FfbGFuZV91MzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDNxX2xhbmVfdTY0KHVpbnQ2NF90IGNvbnN0ICphLCB1aW50NjR4MngzX3QgYikgewordm9pZCB0ZXN0X3ZzdDNxX2xhbmVfdTY0KHVpbnQ2NF90ICAqYSwgdWludDY0eDJ4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M3FfbGFuZV91NjQKICAgdnN0M3FfbGFuZV91NjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDNxX2xhbmVfczgoaW50OF90IGNvbnN0ICphLCBpbnQ4eDE2eDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M3FfbGFuZV9zOChpbnQ4X3QgICphLCBpbnQ4eDE2eDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNxX2xhbmVfczgKICAgdnN0M3FfbGFuZV9zOChhLCBiLCAxNSk7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmJ9WzE1XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzE1XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0M3FfbGFuZV9zMTYoaW50MTZfdCBjb25zdCAqYSwgaW50MTZ4OHgzX3QgYikgewordm9pZCB0ZXN0X3ZzdDNxX2xhbmVfczE2KGludDE2X3QgICphLCBpbnQxNng4eDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNxX2xhbmVfczE2CiAgIHZzdDNxX2xhbmVfczE2KGEsIGIsIDcpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QzcV9sYW5lX3MzMihpbnQzMl90IGNvbnN0ICphLCBpbnQzMng0eDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M3FfbGFuZV9zMzIoaW50MzJfdCAgKmEsIGludDMyeDR4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M3FfbGFuZV9zMzIKICAgdnN0M3FfbGFuZV9zMzIoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDNxX2xhbmVfczY0KGludDY0X3QgY29uc3QgKmEsIGludDY0eDJ4M190IGIpIHsKK3ZvaWQgdGVzdF92c3QzcV9sYW5lX3M2NChpbnQ2NF90ICAqYSwgaW50NjR4MngzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzcV9sYW5lX3M2NAogICB2c3QzcV9sYW5lX3M2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0M3FfbGFuZV9mMTYoZmxvYXQxNl90IGNvbnN0ICphLCBmbG9hdDE2eDh4M190IGIpIHsKK3ZvaWQgdGVzdF92c3QzcV9sYW5lX2YxNihmbG9hdDE2X3QgICphLCBmbG9hdDE2eDh4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M3FfbGFuZV9mMTYKICAgdnN0M3FfbGFuZV9mMTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDNxX2xhbmVfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSwgZmxvYXQzMng0eDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M3FfbGFuZV9mMzIoZmxvYXQzMl90ICAqYSwgZmxvYXQzMng0eDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNxX2xhbmVfZjMyCiAgIHZzdDNxX2xhbmVfZjMyKGEsIGIsIDMpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zfVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyAqdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QzcV9sYW5lX2Y2NChmbG9hdDY0X3QgY29uc3QgKmEsIGZsb2F0NjR4MngzX3QgYikgewordm9pZCB0ZXN0X3ZzdDNxX2xhbmVfZjY0KGZsb2F0NjRfdCAgKmEsIGZsb2F0NjR4MngzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzcV9sYW5lX2Y2NAogICB2c3QzcV9sYW5lX2Y2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0M3FfbGFuZV9wOChwb2x5OF90IGNvbnN0ICphLCBwb2x5OHgxNngzX3QgYikgewordm9pZCB0ZXN0X3ZzdDNxX2xhbmVfcDgocG9seThfdCAgKmEsIHBvbHk4eDE2eDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNxX2xhbmVfcDgKICAgdnN0M3FfbGFuZV9wOChhLCBiLCAxNSk7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmJ9WzE1XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzE1XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0M3FfbGFuZV9wMTYocG9seTE2X3QgY29uc3QgKmEsIHBvbHkxNng4eDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M3FfbGFuZV9wMTYocG9seTE2X3QgICphLCBwb2x5MTZ4OHgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzcV9sYW5lX3AxNgogICB2c3QzcV9sYW5lX3AxNihhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0M3FfbGFuZV9wNjQocG9seTY0X3QgY29uc3QgKmEsIHBvbHk2NHgyeDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M3FfbGFuZV9wNjQocG9seTY0X3QgICphLCBwb2x5NjR4MngzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzcV9sYW5lX3A2NAogICB2c3QzcV9sYW5lX3A2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0M19sYW5lX3U4KHVpbnQ4X3QgY29uc3QgKmEsIHVpbnQ4eDh4M190IGIpIHsKK3ZvaWQgdGVzdF92c3QzX2xhbmVfdTgodWludDhfdCAgKmEsIHVpbnQ4eDh4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M19sYW5lX3U4CiAgIHZzdDNfbGFuZV91OChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0M19sYW5lX3UxNih1aW50MTZfdCBjb25zdCAqYSwgdWludDE2eDR4M190IGIpIHsKK3ZvaWQgdGVzdF92c3QzX2xhbmVfdTE2KHVpbnQxNl90ICAqYSwgdWludDE2eDR4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M19sYW5lX3UxNgogICB2c3QzX2xhbmVfdTE2KGEsIGIsIDMpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QzX2xhbmVfdTMyKHVpbnQzMl90IGNvbnN0ICphLCB1aW50MzJ4MngzX3QgYikgewordm9pZCB0ZXN0X3ZzdDNfbGFuZV91MzIodWludDMyX3QgICphLCB1aW50MzJ4MngzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzX2xhbmVfdTMyCiAgIHZzdDNfbGFuZV91MzIoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDNfbGFuZV91NjQodWludDY0X3QgY29uc3QgKmEsIHVpbnQ2NHgxeDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M19sYW5lX3U2NCh1aW50NjRfdCAgKmEsIHVpbnQ2NHgxeDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNfbGFuZV91NjQKICAgdnN0M19sYW5lX3U2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMF0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0M19sYW5lX3M4KGludDhfdCBjb25zdCAqYSwgaW50OHg4eDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M19sYW5lX3M4KGludDhfdCAgKmEsIGludDh4OHgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzX2xhbmVfczgKICAgdnN0M19sYW5lX3M4KGEsIGIsIDcpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5ifVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QzX2xhbmVfczE2KGludDE2X3QgY29uc3QgKmEsIGludDE2eDR4M190IGIpIHsKK3ZvaWQgdGVzdF92c3QzX2xhbmVfczE2KGludDE2X3QgICphLCBpbnQxNng0eDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNfbGFuZV9zMTYKICAgdnN0M19sYW5lX3MxNihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0M19sYW5lX3MzMihpbnQzMl90IGNvbnN0ICphLCBpbnQzMngyeDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M19sYW5lX3MzMihpbnQzMl90ICAqYSwgaW50MzJ4MngzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzX2xhbmVfczMyCiAgIHZzdDNfbGFuZV9zMzIoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDNfbGFuZV9zNjQoaW50NjRfdCBjb25zdCAqYSwgaW50NjR4MXgzX3QgYikgewordm9pZCB0ZXN0X3ZzdDNfbGFuZV9zNjQoaW50NjRfdCAgKmEsIGludDY0eDF4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M19sYW5lX3M2NAogICB2c3QzX2xhbmVfczY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVswXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzBdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QzX2xhbmVfZjE2KGZsb2F0MTZfdCBjb25zdCAqYSwgZmxvYXQxNng0eDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M19sYW5lX2YxNihmbG9hdDE2X3QgICphLCBmbG9hdDE2eDR4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M19sYW5lX2YxNgogICB2c3QzX2xhbmVfZjE2KGEsIGIsIDMpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QzX2xhbmVfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSwgZmxvYXQzMngyeDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M19sYW5lX2YzMihmbG9hdDMyX3QgICphLCBmbG9hdDMyeDJ4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M19sYW5lX2YzMgogICB2c3QzX2xhbmVfZjMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyAqdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QzX2xhbmVfZjY0KGZsb2F0NjRfdCBjb25zdCAqYSwgZmxvYXQ2NHgxeDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M19sYW5lX2Y2NChmbG9hdDY0X3QgICphLCBmbG9hdDY0eDF4M190IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M19sYW5lX2Y2NAogICB2c3QzX2xhbmVfZjY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVswXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzBdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QzX2xhbmVfcDgocG9seThfdCBjb25zdCAqYSwgcG9seTh4OHgzX3QgYikgewordm9pZCB0ZXN0X3ZzdDNfbGFuZV9wOChwb2x5OF90ICAqYSwgcG9seTh4OHgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzX2xhbmVfcDgKICAgdnN0M19sYW5lX3A4KGEsIGIsIDcpOwotICAvLyBDSEVDSzogc3QzIHt2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5ifVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3QzIHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3QzX2xhbmVfcDE2KHBvbHkxNl90IGNvbnN0ICphLCBwb2x5MTZ4NHgzX3QgYikgewordm9pZCB0ZXN0X3ZzdDNfbGFuZV9wMTYocG9seTE2X3QgICphLCBwb2x5MTZ4NHgzX3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3QzX2xhbmVfcDE2CiAgIHZzdDNfbGFuZV9wMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBzdDMge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDMge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDNfbGFuZV9wNjQocG9seTY0X3QgY29uc3QgKmEsIHBvbHk2NHgxeDNfdCBiKSB7Cit2b2lkIHRlc3RfdnN0M19sYW5lX3A2NChwb2x5NjRfdCAgKmEsIHBvbHk2NHgxeDNfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNfbGFuZV9wNjQKICAgdnN0M19sYW5lX3A2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IHN0MyB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMF0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0MyB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NHFfbGFuZV91OCh1aW50MTZfdCBjb25zdCAqYSwgdWludDh4MTZ4NF90IGIpIHsKK3ZvaWQgdGVzdF92c3Q0cV9sYW5lX3U4KHVpbnQ4X3QgICphLCB1aW50OHgxNng0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV9sYW5lX3U4CiAgIHZzdDRxX2xhbmVfdTgoYSwgYiwgMTUpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5iLCB2e3tbMC05XSt9fS5ifVsxNV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzE1XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NHFfbGFuZV91MTYodWludDE2X3QgY29uc3QgKmEsIHVpbnQxNng4eDRfdCBiKSB7Cit2b2lkIHRlc3RfdnN0NHFfbGFuZV91MTYodWludDE2X3QgICphLCB1aW50MTZ4OHg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV9sYW5lX3UxNgogICB2c3Q0cV9sYW5lX3UxNihhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3Q0cV9sYW5lX3UzMih1aW50MzJfdCBjb25zdCAqYSwgdWludDMyeDR4NF90IGIpIHsKK3ZvaWQgdGVzdF92c3Q0cV9sYW5lX3UzMih1aW50MzJfdCAgKmEsIHVpbnQzMng0eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRxX2xhbmVfdTMyCiAgIHZzdDRxX2xhbmVfdTMyKGEsIGIsIDMpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zfVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyAqdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDRxX2xhbmVfdTY0KHVpbnQ2NF90IGNvbnN0ICphLCB1aW50NjR4Mng0X3QgYikgewordm9pZCB0ZXN0X3ZzdDRxX2xhbmVfdTY0KHVpbnQ2NF90ICAqYSwgdWludDY0eDJ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NHFfbGFuZV91NjQKICAgdnN0NHFfbGFuZV91NjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NHFfbGFuZV9zOChpbnQxNl90IGNvbnN0ICphLCBpbnQ4eDE2eDRfdCBiKSB7Cit2b2lkIHRlc3RfdnN0NHFfbGFuZV9zOChpbnQ4X3QgICphLCBpbnQ4eDE2eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRxX2xhbmVfczgKICAgdnN0NHFfbGFuZV9zOChhLCBiLCAxNSk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmJ9WzE1XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiwgdlswLTldKy5iICp9fX1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3Q0cV9sYW5lX3MxNihpbnQxNl90IGNvbnN0ICphLCBpbnQxNng4eDRfdCBiKSB7Cit2b2lkIHRlc3RfdnN0NHFfbGFuZV9zMTYoaW50MTZfdCAgKmEsIGludDE2eDh4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NHFfbGFuZV9zMTYKICAgdnN0NHFfbGFuZV9zMTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NHFfbGFuZV9zMzIoaW50MzJfdCBjb25zdCAqYSwgaW50MzJ4NHg0X3QgYikgewordm9pZCB0ZXN0X3ZzdDRxX2xhbmVfczMyKGludDMyX3QgICphLCBpbnQzMng0eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRxX2xhbmVfczMyCiAgIHZzdDRxX2xhbmVfczMyKGEsIGIsIDMpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zfVszXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyAqdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zICp9fX1bM10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDRxX2xhbmVfczY0KGludDY0X3QgY29uc3QgKmEsIGludDY0eDJ4NF90IGIpIHsKK3ZvaWQgdGVzdF92c3Q0cV9sYW5lX3M2NChpbnQ2NF90ICAqYSwgaW50NjR4Mng0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV9sYW5lX3M2NAogICB2c3Q0cV9sYW5lX3M2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3Q0cV9sYW5lX2YxNihmbG9hdDE2X3QgY29uc3QgKmEsIGZsb2F0MTZ4OHg0X3QgYikgewordm9pZCB0ZXN0X3ZzdDRxX2xhbmVfZjE2KGZsb2F0MTZfdCAgKmEsIGZsb2F0MTZ4OHg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV9sYW5lX2YxNgogICB2c3Q0cV9sYW5lX2YxNihhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3Q0cV9sYW5lX2YzMihmbG9hdDMyX3QgY29uc3QgKmEsIGZsb2F0MzJ4NHg0X3QgYikgewordm9pZCB0ZXN0X3ZzdDRxX2xhbmVfZjMyKGZsb2F0MzJfdCAgKmEsIGZsb2F0MzJ4NHg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV9sYW5lX2YzMgogICB2c3Q0cV9sYW5lX2YzMihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0ucywgdnt7WzAtOV0rfX0uc31bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgKnZbMC05XSsucywgdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucyAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3Q0cV9sYW5lX2Y2NChmbG9hdDY0X3QgY29uc3QgKmEsIGZsb2F0NjR4Mng0X3QgYikgewordm9pZCB0ZXN0X3ZzdDRxX2xhbmVfZjY0KGZsb2F0NjRfdCAgKmEsIGZsb2F0NjR4Mng0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0cV9sYW5lX2Y2NAogICB2c3Q0cV9sYW5lX2Y2NChhLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMV0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzFdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3Q0cV9sYW5lX3A4KHBvbHkxNl90IGNvbnN0ICphLCBwb2x5OHgxNng0X3QgYikgewordm9pZCB0ZXN0X3ZzdDRxX2xhbmVfcDgocG9seThfdCAgKmEsIHBvbHk4eDE2eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRxX2xhbmVfcDgKICAgdnN0NHFfbGFuZV9wOChhLCBiLCAxNSk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmJ9WzE1XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyAqdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiwgdlswLTldKy5iICp9fX1bMTVdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3Q0cV9sYW5lX3AxNihwb2x5MTZfdCBjb25zdCAqYSwgcG9seTE2eDh4NF90IGIpIHsKK3ZvaWQgdGVzdF92c3Q0cV9sYW5lX3AxNihwb2x5MTZfdCAgKmEsIHBvbHkxNng4eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRxX2xhbmVfcDE2CiAgIHZzdDRxX2xhbmVfcDE2KGEsIGIsIDcpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5oLCB2e3tbMC05XSt9fS5ofVs3XSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyAqdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oICp9fX1bN10sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDRxX2xhbmVfcDY0KHBvbHk2NF90IGNvbnN0ICphLCBwb2x5NjR4Mng0X3QgYikgewordm9pZCB0ZXN0X3ZzdDRxX2xhbmVfcDY0KHBvbHk2NF90ICAqYSwgcG9seTY0eDJ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NHFfbGFuZV9wNjQKICAgdnN0NHFfbGFuZV9wNjQoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NF9sYW5lX3U4KHVpbnQ4X3QgY29uc3QgKmEsIHVpbnQ4eDh4NF90IGIpIHsKK3ZvaWQgdGVzdF92c3Q0X2xhbmVfdTgodWludDhfdCAgKmEsIHVpbnQ4eDh4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NF9sYW5lX3U4CiAgIHZzdDRfbGFuZV91OChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3Q0X2xhbmVfdTE2KHVpbnQxNl90IGNvbnN0ICphLCB1aW50MTZ4NHg0X3QgYikgewordm9pZCB0ZXN0X3ZzdDRfbGFuZV91MTYodWludDE2X3QgICphLCB1aW50MTZ4NHg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X2xhbmVfdTE2CiAgIHZzdDRfbGFuZV91MTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NF9sYW5lX3UzMih1aW50MzJfdCBjb25zdCAqYSwgdWludDMyeDJ4NF90IGIpIHsKK3ZvaWQgdGVzdF92c3Q0X2xhbmVfdTMyKHVpbnQzMl90ICAqYSwgdWludDMyeDJ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NF9sYW5lX3UzMgogICB2c3Q0X2xhbmVfdTMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyAqdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDRfbGFuZV91NjQodWludDY0X3QgY29uc3QgKmEsIHVpbnQ2NHgxeDRfdCBiKSB7Cit2b2lkIHRlc3RfdnN0NF9sYW5lX3U2NCh1aW50NjRfdCAgKmEsIHVpbnQ2NHgxeDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRfbGFuZV91NjQKICAgdnN0NF9sYW5lX3U2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZCwgdnt7WzAtOV0rfX0uZH1bMF0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgKnZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCAqfX19WzBdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3Q0X2xhbmVfczgoaW50OF90IGNvbnN0ICphLCBpbnQ4eDh4NF90IGIpIHsKK3ZvaWQgdGVzdF92c3Q0X2xhbmVfczgoaW50OF90ICAqYSwgaW50OHg4eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRfbGFuZV9zOAogICB2c3Q0X2xhbmVfczgoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmIsIHZ7e1swLTldK319LmJ9WzddLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ICp2WzAtOV0rLmIsIHZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIgKn19fVs3XSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NF9sYW5lX3MxNihpbnQxNl90IGNvbnN0ICphLCBpbnQxNng0eDRfdCBiKSB7Cit2b2lkIHRlc3RfdnN0NF9sYW5lX3MxNihpbnQxNl90ICAqYSwgaW50MTZ4NHg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X2xhbmVfczE2CiAgIHZzdDRfbGFuZV9zMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NF9sYW5lX3MzMihpbnQzMl90IGNvbnN0ICphLCBpbnQzMngyeDRfdCBiKSB7Cit2b2lkIHRlc3RfdnN0NF9sYW5lX3MzMihpbnQzMl90ICAqYSwgaW50MzJ4Mng0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X2xhbmVfczMyCiAgIHZzdDRfbGFuZV9zMzIoYSwgYiwgMSk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnMsIHZ7e1swLTldK319LnN9WzFdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ICp2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zLCB2WzAtOV0rLnMgKn19fVsxXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NF9sYW5lX3M2NChpbnQ2NF90IGNvbnN0ICphLCBpbnQ2NHgxeDRfdCBiKSB7Cit2b2lkIHRlc3RfdnN0NF9sYW5lX3M2NChpbnQ2NF90ICAqYSwgaW50NjR4MXg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X2xhbmVfczY0CiAgIHZzdDRfbGFuZV9zNjQoYSwgYiwgMCk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzBdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NF9sYW5lX2YxNihmbG9hdDE2X3QgY29uc3QgKmEsIGZsb2F0MTZ4NHg0X3QgYikgewordm9pZCB0ZXN0X3ZzdDRfbGFuZV9mMTYoZmxvYXQxNl90ICAqYSwgZmxvYXQxNng0eDRfdCBiKSB7CiAgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRfbGFuZV9mMTYKICAgdnN0NF9sYW5lX2YxNihhLCBiLCAzKTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaCwgdnt7WzAtOV0rfX0uaH1bM10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgKnZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmgsIHZbMC05XSsuaCAqfX19WzNdLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3Q0X2xhbmVfZjMyKGZsb2F0MzJfdCBjb25zdCAqYSwgZmxvYXQzMngyeDRfdCBiKSB7Cit2b2lkIHRlc3RfdnN0NF9sYW5lX2YzMihmbG9hdDMyX3QgICphLCBmbG9hdDMyeDJ4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NF9sYW5lX2YzMgogICB2c3Q0X2xhbmVfZjMyKGEsIGIsIDEpOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zLCB2e3tbMC05XSt9fS5zfVsxXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyAqdlswLTldKy5zLCB2WzAtOV0rLnMsIHZbMC05XSsucywgdlswLTldKy5zICp9fX1bMV0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAotdm9pZCB0ZXN0X3ZzdDRfbGFuZV9mNjQoZmxvYXQ2NF90IGNvbnN0ICphLCBmbG9hdDY0eDF4NF90IGIpIHsKK3ZvaWQgdGVzdF92c3Q0X2xhbmVfZjY0KGZsb2F0NjRfdCAgKmEsIGZsb2F0NjR4MXg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X2xhbmVfZjY0CiAgIHZzdDRfbGFuZV9mNjQoYSwgYiwgMCk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmQsIHZ7e1swLTldK319LmR9WzBdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ICp2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kLCB2WzAtOV0rLmQgKn19fVswXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NF9sYW5lX3A4KHBvbHk4X3QgY29uc3QgKmEsIHBvbHk4eDh4NF90IGIpIHsKK3ZvaWQgdGVzdF92c3Q0X2xhbmVfcDgocG9seThfdCAgKmEsIHBvbHk4eDh4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NF9sYW5lX3A4CiAgIHZzdDRfbGFuZV9wOChhLCBiLCA3KTsKLSAgLy8gQ0hFQ0s6IHN0NCB7dnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYiwgdnt7WzAtOV0rfX0uYn1bN10sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IHN0NCB7e3sgKnZbMC05XSsuYiwgdlswLTldKy5iLCB2WzAtOV0rLmIsIHZbMC05XSsuYiAqfX19WzddLCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKLXZvaWQgdGVzdF92c3Q0X2xhbmVfcDE2KHBvbHkxNl90IGNvbnN0ICphLCBwb2x5MTZ4NHg0X3QgYikgewordm9pZCB0ZXN0X3ZzdDRfbGFuZV9wMTYocG9seTE2X3QgICphLCBwb2x5MTZ4NHg0X3QgYikgewogICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X2xhbmVfcDE2CiAgIHZzdDRfbGFuZV9wMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBzdDQge3Z7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319LmgsIHZ7e1swLTldK319Lmh9WzNdLCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBzdDQge3t7ICp2WzAtOV0rLmgsIHZbMC05XSsuaCwgdlswLTldKy5oLCB2WzAtOV0rLmggKn19fVszXSwgW3t7eFswLTldK3xzcH19XQogfQogCi12b2lkIHRlc3RfdnN0NF9sYW5lX3A2NChwb2x5NjRfdCBjb25zdCAqYSwgcG9seTY0eDF4NF90IGIpIHsKK3ZvaWQgdGVzdF92c3Q0X2xhbmVfcDY0KHBvbHk2NF90ICAqYSwgcG9seTY0eDF4NF90IGIpIHsKICAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0NF9sYW5lX3A2NAogICB2c3Q0X2xhbmVfcDY0KGEsIGIsIDApOwotICAvLyBDSEVDSzogc3Q0IHt2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kLCB2e3tbMC05XSt9fS5kfVswXSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogc3Q0IHt7eyAqdlswLTldKy5kLCB2WzAtOV0rLmQsIHZbMC05XSsuZCwgdlswLTldKy5kICp9fX1bMF0sIFt7e3hbMC05XSt8c3B9fV0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tbWlzYy5jIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1taXNjLmMKaW5kZXggMDgxNzRkOS4uZGNlMDBmMyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1taXNjLmMKKysrIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1taXNjLmMKQEAgLTEsMjAwNSArMSwyMDQ0IEBACiAvLyBSRVFVSVJFUzogYWFyY2g2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCiAvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1ub25lLWxpbnV4LWdudSBcCisvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIC8vIFRlc3QgbmV3IGFhcmNoNjQgaW50cmluc2ljcyBhbmQgdHlwZXMKIAogI2luY2x1ZGUgPGFybV9uZW9uLmg+CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6X3M4Ci0vLyBDSEVDSzogY21lcSAge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2Vxel9zOAorLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgI3t7MHgwfDB9fQogdWludDh4OF90IHRlc3RfdmNlcXpfczgoaW50OHg4X3QgYSkgewogICByZXR1cm4gdmNlcXpfczgoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6X3MxNgotLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXpfczE2CisvLyBDSEVDSzogY21lcSAge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAje3sweDB8MH19CiB1aW50MTZ4NF90IHRlc3RfdmNlcXpfczE2KGludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2Y2Vxel9zMTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6X3MzMgotLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXpfczMyCisvLyBDSEVDSzogY21lcSAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAje3sweDB8MH19CiB1aW50MzJ4Ml90IHRlc3RfdmNlcXpfczMyKGludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2Y2Vxel9zMzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6X3M2NAotLy8gQ0hFQ0s6IGNtZXEge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2Vxel9zNjQKKy8vIENIRUNLOiBjbWVxIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgI3t7MHgwfDB9fQogdWludDY0eDFfdCB0ZXN0X3ZjZXF6X3M2NChpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdmNlcXpfczY0KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2Vxel91NjQKLS8vIENIRUNLOiBjbWVxIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXpfdTY0CisvLyBDSEVDSzogY21lcSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICN7ezB4MHwwfX0KIHVpbnQ2NHgxX3QgdGVzdF92Y2Vxel91NjQodWludDY0eDFfdCBhKSB7CiAgIHJldHVybiB2Y2Vxel91NjQoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6X3A2NAotLy8gQ0hFQ0s6IGNtZXEge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2Vxel9wNjQKKy8vIENIRUNLOiBjbWVxIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgI3t7MHgwfDB9fQogdWludDY0eDFfdCB0ZXN0X3ZjZXF6X3A2NChwb2x5NjR4MV90IGEpIHsKICAgcmV0dXJuIHZjZXF6X3A2NChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNlcXpxX3M4Ci0vLyBDSEVDSzogY21lcSAge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICMweDAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXF6cV9zOAorLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAje3sweDB8MH19CiB1aW50OHgxNl90IHRlc3RfdmNlcXpxX3M4KGludDh4MTZfdCBhKSB7CiAgIHJldHVybiB2Y2VxenFfczgoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6cV9zMTYKLS8vIENIRUNLOiBjbWVxICB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsICMweDAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXF6cV9zMTYKKy8vIENIRUNLOiBjbWVxICB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsICN7ezB4MHwwfX0KIHVpbnQxNng4X3QgdGVzdF92Y2VxenFfczE2KGludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2Y2VxenFfczE2KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2VxenFfczMyCi0vLyBDSEVDSzogY21lcSAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxenFfczMyCisvLyBDSEVDSzogY21lcSAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCAje3sweDB8MH19CiB1aW50MzJ4NF90IHRlc3RfdmNlcXpxX3MzMihpbnQzMng0X3QgYSkgewogICByZXR1cm4gdmNlcXpxX3MzMihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNlcXpxX3M2NAotLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXpxX3M2NAorLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgI3t7MHgwfDB9fQogdWludDY0eDJfdCB0ZXN0X3ZjZXF6cV9zNjQoaW50NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZjZXF6cV9zNjQoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6X3U4Ci0vLyBDSEVDSzogY21lcSAge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2Vxel91OAorLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgI3t7MHgwfDB9fQogdWludDh4OF90IHRlc3RfdmNlcXpfdTgodWludDh4OF90IGEpIHsKICAgcmV0dXJuIHZjZXF6X3U4KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2Vxel91MTYKLS8vIENIRUNLOiBjbWVxICB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgsICMweDAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXF6X3UxNgorLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgI3t7MHgwfDB9fQogdWludDE2eDRfdCB0ZXN0X3ZjZXF6X3UxNih1aW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZjZXF6X3UxNihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNlcXpfdTMyCi0vLyBDSEVDSzogY21lcSAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2Vxel91MzIKKy8vIENIRUNLOiBjbWVxICB7e3ZbMC05XSt9fS4ycywge3t2WzAtOV0rfX0uMnMsICN7ezB4MHwwfX0KIHVpbnQzMngyX3QgdGVzdF92Y2Vxel91MzIodWludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2Y2Vxel91MzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6cV91OAotLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxenFfdTgKKy8vIENIRUNLOiBjbWVxICB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgI3t7MHgwfDB9fQogdWludDh4MTZfdCB0ZXN0X3ZjZXF6cV91OCh1aW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZjZXF6cV91OChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNlcXpxX3UxNgotLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXpxX3UxNgorLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgI3t7MHgwfDB9fQogdWludDE2eDhfdCB0ZXN0X3ZjZXF6cV91MTYodWludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2Y2VxenFfdTE2KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2VxenFfdTMyCi0vLyBDSEVDSzogY21lcSAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxenFfdTMyCisvLyBDSEVDSzogY21lcSAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCAje3sweDB8MH19CiB1aW50MzJ4NF90IHRlc3RfdmNlcXpxX3UzMih1aW50MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZjZXF6cV91MzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6cV91NjQKLS8vIENIRUNLOiBjbWVxICB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICMweDAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXF6cV91NjQKKy8vIENIRUNLOiBjbWVxICB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICN7ezB4MHwwfX0KIHVpbnQ2NHgyX3QgdGVzdF92Y2VxenFfdTY0KHVpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdmNlcXpxX3U2NChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNlcXpfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2Vxel9mMzIKIC8vIENIRUNLOiBmY21lcSAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMAogdWludDMyeDJfdCB0ZXN0X3ZjZXF6X2YzMihmbG9hdDMyeDJfdCBhKSB7CiAgIHJldHVybiB2Y2Vxel9mMzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6X2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXpfZjY0CiAvLyBDSEVDSzogZmNtZXEgIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzAKIHVpbnQ2NHgxX3QgdGVzdF92Y2Vxel9mNjQoZmxvYXQ2NHgxX3QgYSkgewogICByZXR1cm4gdmNlcXpfZjY0KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2VxenFfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxenFfZjMyCiAvLyBDSEVDSzogZmNtZXEgIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywgIzAKIHVpbnQzMng0X3QgdGVzdF92Y2VxenFfZjMyKGZsb2F0MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZjZXF6cV9mMzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6X3AxNgotLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXpfcDgKKy8vIENIRUNLOiBjbWVxICB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICN7ezB4MHwwfX0KK3VpbnQ4eDhfdCB0ZXN0X3ZjZXF6X3A4KHBvbHk4eDhfdCBhKSB7CisgIHJldHVybiB2Y2Vxel9wOChhKTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXpxX3A4CisvLyBDSEVDSzogY21lcSAge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICN7ezB4MHwwfX0KK3VpbnQ4eDE2X3QgdGVzdF92Y2VxenFfcDgocG9seTh4MTZfdCBhKSB7CisgIHJldHVybiB2Y2VxenFfcDgoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXF6X3AxNgorLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgI3t7MHgwfDB9fQogdWludDE2eDRfdCB0ZXN0X3ZjZXF6X3AxNihwb2x5MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZjZXF6X3AxNihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNlcXpxX3AxNgotLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNlcXpxX3AxNgorLy8gQ0hFQ0s6IGNtZXEgIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgI3t7MHgwfDB9fQogdWludDE2eDhfdCB0ZXN0X3ZjZXF6cV9wMTYocG9seTE2eDhfdCBhKSB7CiAgIHJldHVybiB2Y2VxenFfcDE2KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2VxenFfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxenFfZjY0CiAvLyBDSEVDSzogZmNtZXEgIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzAKIHVpbnQ2NHgyX3QgdGVzdF92Y2VxenFfZjY0KGZsb2F0NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZjZXF6cV9mNjQoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZXF6cV9wNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXF6cV9wNjQKIC8vIENIRUNLOiBjbWVxICB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICMwCiB1aW50NjR4Ml90IHRlc3RfdmNlcXpxX3A2NChwb2x5NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZjZXF6cV9wNjQoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ2V6X3M4Ci0vLyBDSEVDSzogY21nZSAge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2dlel9zOAorLy8gQ0hFQ0s6IGNtZ2UgIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgI3t7MHgwfDB9fQogdWludDh4OF90IHRlc3RfdmNnZXpfczgoaW50OHg4X3QgYSkgewogICByZXR1cm4gdmNnZXpfczgoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ2V6X3MxNgotLy8gQ0hFQ0s6IGNtZ2UgIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNnZXpfczE2CisvLyBDSEVDSzogY21nZSAge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAje3sweDB8MH19CiB1aW50MTZ4NF90IHRlc3RfdmNnZXpfczE2KGludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2Y2dlel9zMTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ2V6X3MzMgotLy8gQ0hFQ0s6IGNtZ2UgIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNnZXpfczMyCisvLyBDSEVDSzogY21nZSAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAje3sweDB8MH19CiB1aW50MzJ4Ml90IHRlc3RfdmNnZXpfczMyKGludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2Y2dlel9zMzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ2V6X3M2NAotLy8gQ0hFQ0s6IGNtZ2Uge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2dlel9zNjQKKy8vIENIRUNLOiBjbWdlIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgI3t7MHgwfDB9fQogdWludDY0eDFfdCB0ZXN0X3ZjZ2V6X3M2NChpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdmNnZXpfczY0KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2dlenFfczgKLS8vIENIRUNLOiBjbWdlICB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNnZXpxX3M4CisvLyBDSEVDSzogY21nZSAge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICN7ezB4MHwwfX0KIHVpbnQ4eDE2X3QgdGVzdF92Y2dlenFfczgoaW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZjZ2V6cV9zOChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNnZXpxX3MxNgotLy8gQ0hFQ0s6IGNtZ2UgIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNnZXpxX3MxNgorLy8gQ0hFQ0s6IGNtZ2UgIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgI3t7MHgwfDB9fQogdWludDE2eDhfdCB0ZXN0X3ZjZ2V6cV9zMTYoaW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZjZ2V6cV9zMTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ2V6cV9zMzIKLS8vIENIRUNLOiBjbWdlICB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMweDAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2V6cV9zMzIKKy8vIENIRUNLOiBjbWdlICB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICN7ezB4MHwwfX0KIHVpbnQzMng0X3QgdGVzdF92Y2dlenFfczMyKGludDMyeDRfdCBhKSB7CiAgIHJldHVybiB2Y2dlenFfczMyKGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2dlenFfczY0Ci0vLyBDSEVDSzogY21nZSAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2dlenFfczY0CisvLyBDSEVDSzogY21nZSAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAje3sweDB8MH19CiB1aW50NjR4Ml90IHRlc3RfdmNnZXpxX3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdmNnZXpxX3M2NChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNnZXpfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2dlel9mMzIKIC8vIENIRUNLOiBmY21nZSAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMAogdWludDMyeDJfdCB0ZXN0X3ZjZ2V6X2YzMihmbG9hdDMyeDJfdCBhKSB7CiAgIHJldHVybiB2Y2dlel9mMzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ2V6cV9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ2V6X2Y2NAorLy8gQ0hFQ0s6IGZjbWdlICB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMwCit1aW50NjR4MV90IHRlc3RfdmNnZXpfZjY0KGZsb2F0NjR4MV90IGEpIHsKKyAgcmV0dXJuIHZjZ2V6X2Y2NChhKTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNnZXpxX2YzMgogLy8gQ0hFQ0s6IGZjbWdlICB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMwCiB1aW50MzJ4NF90IHRlc3RfdmNnZXpxX2YzMihmbG9hdDMyeDRfdCBhKSB7CiAgIHJldHVybiB2Y2dlenFfZjMyKGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2dlenFfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2dlenFfZjY0CiAvLyBDSEVDSzogZmNtZ2UgIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzAKIHVpbnQ2NHgyX3QgdGVzdF92Y2dlenFfZjY0KGZsb2F0NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZjZ2V6cV9mNjQoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjbGV6X3M4Ci0vLyBDSEVDSzogY21sZSAge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2xlel9zOAorLy8gQ0hFQ0s6IGNtbGUgIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgI3t7MHgwfDB9fQogdWludDh4OF90IHRlc3RfdmNsZXpfczgoaW50OHg4X3QgYSkgewogICByZXR1cm4gdmNsZXpfczgoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjbGV6X3MxNgotLy8gQ0hFQ0s6IGNtbGUgIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZXpfczE2CisvLyBDSEVDSzogY21sZSAge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAje3sweDB8MH19CiB1aW50MTZ4NF90IHRlc3RfdmNsZXpfczE2KGludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2Y2xlel9zMTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjbGV6X3MzMgotLy8gQ0hFQ0s6IGNtbGUgIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZXpfczMyCisvLyBDSEVDSzogY21sZSAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAje3sweDB8MH19CiB1aW50MzJ4Ml90IHRlc3RfdmNsZXpfczMyKGludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2Y2xlel9zMzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjbGV6X3M2NAotLy8gQ0hFQ0s6IGNtbGUge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2xlel9zNjQKKy8vIENIRUNLOiBjbWxlIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgI3t7MHgwfDB9fQogdWludDY0eDFfdCB0ZXN0X3ZjbGV6X3M2NChpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdmNsZXpfczY0KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2xlenFfczgKLS8vIENIRUNLOiBjbWxlICB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZXpxX3M4CisvLyBDSEVDSzogY21sZSAge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICN7ezB4MHwwfX0KIHVpbnQ4eDE2X3QgdGVzdF92Y2xlenFfczgoaW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZjbGV6cV9zOChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNsZXpxX3MxNgotLy8gQ0hFQ0s6IGNtbGUgIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZXpxX3MxNgorLy8gQ0hFQ0s6IGNtbGUgIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgI3t7MHgwfDB9fQogdWludDE2eDhfdCB0ZXN0X3ZjbGV6cV9zMTYoaW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZjbGV6cV9zMTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjbGV6cV9zMzIKLS8vIENIRUNLOiBjbWxlICB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMweDAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGV6cV9zMzIKKy8vIENIRUNLOiBjbWxlICB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICN7ezB4MHwwfX0KIHVpbnQzMng0X3QgdGVzdF92Y2xlenFfczMyKGludDMyeDRfdCBhKSB7CiAgIHJldHVybiB2Y2xlenFfczMyKGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2xlenFfczY0Ci0vLyBDSEVDSzogY21sZSAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2xlenFfczY0CisvLyBDSEVDSzogY21sZSAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAje3sweDB8MH19CiB1aW50NjR4Ml90IHRlc3RfdmNsZXpxX3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdmNsZXpxX3M2NChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNsZXpfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2xlel9mMzIKIC8vIENIRUNLOiBmY21sZSAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMAogdWludDMyeDJfdCB0ZXN0X3ZjbGV6X2YzMihmbG9hdDMyeDJfdCBhKSB7CiAgIHJldHVybiB2Y2xlel9mMzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjbGV6cV9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbGV6X2Y2NAorLy8gQ0hFQ0s6IGZjbWxlICB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMwCit1aW50NjR4MV90IHRlc3RfdmNsZXpfZjY0KGZsb2F0NjR4MV90IGEpIHsKKyAgcmV0dXJuIHZjbGV6X2Y2NChhKTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsZXpxX2YzMgogLy8gQ0hFQ0s6IGZjbWxlICB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMwCiB1aW50MzJ4NF90IHRlc3RfdmNsZXpxX2YzMihmbG9hdDMyeDRfdCBhKSB7CiAgIHJldHVybiB2Y2xlenFfZjMyKGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2xlenFfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2xlenFfZjY0CiAvLyBDSEVDSzogZmNtbGUgIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzAKIHVpbnQ2NHgyX3QgdGVzdF92Y2xlenFfZjY0KGZsb2F0NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZjbGV6cV9mNjQoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ3R6X3M4Ci0vLyBDSEVDSzogY21ndCAge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0el9zOAorLy8gQ0hFQ0s6IGNtZ3QgIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YiwgI3t7MHgwfDB9fQogdWludDh4OF90IHRlc3RfdmNndHpfczgoaW50OHg4X3QgYSkgewogICByZXR1cm4gdmNndHpfczgoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ3R6X3MxNgotLy8gQ0hFQ0s6IGNtZ3QgIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aCwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndHpfczE2CisvLyBDSEVDSzogY21ndCAge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAje3sweDB8MH19CiB1aW50MTZ4NF90IHRlc3RfdmNndHpfczE2KGludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2Y2d0el9zMTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ3R6X3MzMgotLy8gQ0hFQ0s6IGNtZ3QgIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndHpfczMyCisvLyBDSEVDSzogY21ndCAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAje3sweDB8MH19CiB1aW50MzJ4Ml90IHRlc3RfdmNndHpfczMyKGludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2Y2d0el9zMzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ3R6X3M2NAotLy8gQ0hFQ0s6IGNtZ3Qge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0el9zNjQKKy8vIENIRUNLOiBjbWd0IHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgI3t7MHgwfDB9fQogdWludDY0eDFfdCB0ZXN0X3ZjZ3R6X3M2NChpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdmNndHpfczY0KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2d0enFfczgKLS8vIENIRUNLOiBjbWd0ICB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YiwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndHpxX3M4CisvLyBDSEVDSzogY21ndCAge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICN7ezB4MHwwfX0KIHVpbnQ4eDE2X3QgdGVzdF92Y2d0enFfczgoaW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZjZ3R6cV9zOChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNndHpxX3MxNgotLy8gQ0hFQ0s6IGNtZ3QgIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgIzB4MAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndHpxX3MxNgorLy8gQ0hFQ0s6IGNtZ3QgIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aCwgI3t7MHgwfDB9fQogdWludDE2eDhfdCB0ZXN0X3ZjZ3R6cV9zMTYoaW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZjZ3R6cV9zMTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ3R6cV9zMzIKLS8vIENIRUNLOiBjbWd0ICB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMweDAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3R6cV9zMzIKKy8vIENIRUNLOiBjbWd0ICB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICN7ezB4MHwwfX0KIHVpbnQzMng0X3QgdGVzdF92Y2d0enFfczMyKGludDMyeDRfdCBhKSB7CiAgIHJldHVybiB2Y2d0enFfczMyKGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2d0enFfczY0Ci0vLyBDSEVDSzogY21ndCAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjMHgwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0enFfczY0CisvLyBDSEVDSzogY21ndCAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAje3sweDB8MH19CiB1aW50NjR4Ml90IHRlc3RfdmNndHpxX3M2NChpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdmNndHpxX3M2NChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNndHpfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0el9mMzIKIC8vIENIRUNLOiBmY21ndCAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMAogdWludDMyeDJfdCB0ZXN0X3ZjZ3R6X2YzMihmbG9hdDMyeDJfdCBhKSB7CiAgIHJldHVybiB2Y2d0el9mMzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjZ3R6cV9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZ3R6X2Y2NAorLy8gQ0hFQ0s6IGZjbWd0ICB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMwCit1aW50NjR4MV90IHRlc3RfdmNndHpfZjY0KGZsb2F0NjR4MV90IGEpIHsKKyAgcmV0dXJuIHZjZ3R6X2Y2NChhKTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNndHpxX2YzMgogLy8gQ0hFQ0s6IGZjbWd0ICB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMsICMwCiB1aW50MzJ4NF90IHRlc3RfdmNndHpxX2YzMihmbG9hdDMyeDRfdCBhKSB7CiAgIHJldHVybiB2Y2d0enFfZjMyKGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2d0enFfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2d0enFfZjY0CiAvLyBDSEVDSzogZmNtZ3QgIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzAKIHVpbnQ2NHgyX3QgdGVzdF92Y2d0enFfZjY0KGZsb2F0NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZjZ3R6cV9mNjQoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjbHR6X3M4Ci0vLyBDSEVDSzogY21sdCAge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCAjMAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdHpfczgKKy8vIENIRUNLOiBzc2hyICB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsICM3CiB1aW50OHg4X3QgdGVzdF92Y2x0el9zOChpbnQ4eDhfdCBhKSB7CiAgIHJldHVybiB2Y2x0el9zOChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNsdHpfczE2Ci0vLyBDSEVDSzogY21sdCAge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAjMAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdHpfczE2CisvLyBDSEVDSzogc3NociAge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoLCAjMTUKIHVpbnQxNng0X3QgdGVzdF92Y2x0el9zMTYoaW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZjbHR6X3MxNihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNsdHpfczMyCi0vLyBDSEVDSzogY21sdCAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdHpfczMyCisvLyBDSEVDSzogc3NociAge3t2WzAtOV0rfX0uMnMsIHt7dlswLTldK319LjJzLCAjMzEKIHVpbnQzMngyX3QgdGVzdF92Y2x0el9zMzIoaW50MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZjbHR6X3MzMihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNsdHpfczY0Ci0vLyBDSEVDSzogY21sdCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x0el9zNjQKKy8vIENIRUNLOiBzc2hyIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzYzCiB1aW50NjR4MV90IHRlc3RfdmNsdHpfczY0KGludDY0eDFfdCBhKSB7CiAgIHJldHVybiB2Y2x0el9zNjQoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjbHR6cV9zOAotLy8gQ0hFQ0s6IGNtbHQgIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCAjMAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdHpxX3M4CisvLyBDSEVDSzogc3NociAge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICM3CiB1aW50OHgxNl90IHRlc3RfdmNsdHpxX3M4KGludDh4MTZfdCBhKSB7CiAgIHJldHVybiB2Y2x0enFfczgoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjbHR6cV9zMTYKLS8vIENIRUNLOiBjbWx0ICB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgsICMwCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x0enFfczE2CisvLyBDSEVDSzogc3NociAge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoLCAjMTUKIHVpbnQxNng4X3QgdGVzdF92Y2x0enFfczE2KGludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2Y2x0enFfczE2KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92Y2x0enFfczMyCi0vLyBDSEVDSzogY21sdCAge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzLCAjMAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdHpxX3MzMgorLy8gQ0hFQ0s6IHNzaHIgIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywgIzMxCiB1aW50MzJ4NF90IHRlc3RfdmNsdHpxX3MzMihpbnQzMng0X3QgYSkgewogICByZXR1cm4gdmNsdHpxX3MzMihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmNsdHpxX3M2NAotLy8gQ0hFQ0s6IGNtbHQgIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHR6cV9zNjQKKy8vIENIRUNLOiBzc2hyICB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsICM2MwogdWludDY0eDJfdCB0ZXN0X3ZjbHR6cV9zNjQoaW50NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZjbHR6cV9zNjQoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjbHR6X2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdHpfZjMyCiAvLyBDSEVDSzogZmNtbHQgIHt7dlswLTldK319LjJzLCB7e3ZbMC05XSt9fS4ycywgIzAKIHVpbnQzMngyX3QgdGVzdF92Y2x0el9mMzIoZmxvYXQzMngyX3QgYSkgewogICByZXR1cm4gdmNsdHpfZjMyKGEpOwogfQorIAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsdHpfZjY0CisvLyBDSEVDSzogZmNtbHQgIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzAKK3VpbnQ2NHgxX3QgdGVzdF92Y2x0el9mNjQoZmxvYXQ2NHgxX3QgYSkgeworICByZXR1cm4gdmNsdHpfZjY0KGEpOworfQogCi0vLyBDSEVDSzogdGVzdF92Y2x0enFfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x0enFfZjMyCiAvLyBDSEVDSzogZmNtbHQgIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cywgIzAKIHVpbnQzMng0X3QgdGVzdF92Y2x0enFfZjMyKGZsb2F0MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZjbHR6cV9mMzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZjbHR6cV9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHR6cV9mNjQKIC8vIENIRUNLOiBmY21sdCAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCAjMAogdWludDY0eDJfdCB0ZXN0X3ZjbHR6cV9mNjQoZmxvYXQ2NHgyX3QgYSkgewogICByZXR1cm4gdmNsdHpxX2Y2NChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjE2X3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2MTZfczgKIC8vIENIRUNLOiByZXYxNiB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIGludDh4OF90IHRlc3RfdnJldjE2X3M4KGludDh4OF90IGEpIHsKICAgcmV0dXJuIHZyZXYxNl9zOChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjE2X3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2MTZfdTgKIC8vIENIRUNLOiByZXYxNiB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIHVpbnQ4eDhfdCB0ZXN0X3ZyZXYxNl91OCh1aW50OHg4X3QgYSkgewogICByZXR1cm4gdnJldjE2X3U4KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2MTZfcDgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXYxNl9wOAogLy8gQ0hFQ0s6IHJldjE2IHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YgogcG9seTh4OF90IHRlc3RfdnJldjE2X3A4KHBvbHk4eDhfdCBhKSB7CiAgIHJldHVybiB2cmV2MTZfcDgoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZyZXYxNnFfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXYxNnFfczgKIC8vIENIRUNLOiByZXYxNiB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogaW50OHgxNl90IHRlc3RfdnJldjE2cV9zOChpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJldjE2cV9zOChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjE2cV91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJldjE2cV91OAogLy8gQ0hFQ0s6IHJldjE2IHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiCiB1aW50OHgxNl90IHRlc3RfdnJldjE2cV91OCh1aW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZXYxNnFfdTgoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZyZXYxNnFfcDgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXYxNnFfcDgKIC8vIENIRUNLOiByZXYxNiB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogcG9seTh4MTZfdCB0ZXN0X3ZyZXYxNnFfcDgocG9seTh4MTZfdCBhKSB7CiAgIHJldHVybiB2cmV2MTZxX3A4KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2MzJfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXYzMl9zOAogLy8gQ0hFQ0s6IHJldjMyIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YgogaW50OHg4X3QgdGVzdF92cmV2MzJfczgoaW50OHg4X3QgYSkgewogICByZXR1cm4gdnJldjMyX3M4KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2MzJfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2MzJfczE2CiAvLyBDSEVDSzogcmV2MzIgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoCiBpbnQxNng0X3QgdGVzdF92cmV2MzJfczE2KGludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2cmV2MzJfczE2KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2MzJfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXYzMl91OAogLy8gQ0hFQ0s6IHJldjMyIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YgogdWludDh4OF90IHRlc3RfdnJldjMyX3U4KHVpbnQ4eDhfdCBhKSB7CiAgIHJldHVybiB2cmV2MzJfdTgoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZyZXYzMl91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXYzMl91MTYKIC8vIENIRUNLOiByZXYzMiB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgKIHVpbnQxNng0X3QgdGVzdF92cmV2MzJfdTE2KHVpbnQxNng0X3QgYSkgewogICByZXR1cm4gdnJldjMyX3UxNihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjMyX3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2MzJfcDgKIC8vIENIRUNLOiByZXYzMiB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIHBvbHk4eDhfdCB0ZXN0X3ZyZXYzMl9wOChwb2x5OHg4X3QgYSkgewogICByZXR1cm4gdnJldjMyX3A4KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2MzJfcDE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2MzJfcDE2CiAvLyBDSEVDSzogcmV2MzIgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoCiBwb2x5MTZ4NF90IHRlc3RfdnJldjMyX3AxNihwb2x5MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZXYzMl9wMTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZyZXYzMnFfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXYzMnFfczgKIC8vIENIRUNLOiByZXYzMiB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogaW50OHgxNl90IHRlc3RfdnJldjMycV9zOChpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdnJldjMycV9zOChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjMycV9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXYzMnFfczE2CiAvLyBDSEVDSzogcmV2MzIgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoCiBpbnQxNng4X3QgdGVzdF92cmV2MzJxX3MxNihpbnQxNng4X3QgYSkgewogICByZXR1cm4gdnJldjMycV9zMTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZyZXYzMnFfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXYzMnFfdTgKIC8vIENIRUNLOiByZXYzMiB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogdWludDh4MTZfdCB0ZXN0X3ZyZXYzMnFfdTgodWludDh4MTZfdCBhKSB7CiAgIHJldHVybiB2cmV2MzJxX3U4KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2MzJxX3UxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJldjMycV91MTYKIC8vIENIRUNLOiByZXYzMiB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgKIHVpbnQxNng4X3QgdGVzdF92cmV2MzJxX3UxNih1aW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZXYzMnFfdTE2KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2MzJxX3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2MzJxX3A4CiAvLyBDSEVDSzogcmV2MzIgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIKIHBvbHk4eDE2X3QgdGVzdF92cmV2MzJxX3A4KHBvbHk4eDE2X3QgYSkgewogICByZXR1cm4gdnJldjMycV9wOChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjMycV9wMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXYzMnFfcDE2CiAvLyBDSEVDSzogcmV2MzIgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoCiBwb2x5MTZ4OF90IHRlc3RfdnJldjMycV9wMTYocG9seTE2eDhfdCBhKSB7CiAgIHJldHVybiB2cmV2MzJxX3AxNihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjY0X3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2NjRfczgKIC8vIENIRUNLOiByZXY2NCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIGludDh4OF90IHRlc3RfdnJldjY0X3M4KGludDh4OF90IGEpIHsKICAgcmV0dXJuIHZyZXY2NF9zOChhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjY0X3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJldjY0X3MxNgogLy8gQ0hFQ0s6IHJldjY0IHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aAogaW50MTZ4NF90IHRlc3RfdnJldjY0X3MxNihpbnQxNng0X3QgYSkgewogICByZXR1cm4gdnJldjY0X3MxNihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjY0X3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJldjY0X3MzMgogLy8gQ0hFQ0s6IHJldjY0IHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogaW50MzJ4Ml90IHRlc3RfdnJldjY0X3MzMihpbnQzMngyX3QgYSkgewogICByZXR1cm4gdnJldjY0X3MzMihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjY0X3U4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2NjRfdTgKIC8vIENIRUNLOiByZXY2NCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIHVpbnQ4eDhfdCB0ZXN0X3ZyZXY2NF91OCh1aW50OHg4X3QgYSkgewogICByZXR1cm4gdnJldjY0X3U4KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2NjRfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2NjRfdTE2CiAvLyBDSEVDSzogcmV2NjQgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoCiB1aW50MTZ4NF90IHRlc3RfdnJldjY0X3UxNih1aW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZXY2NF91MTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZyZXY2NF91MzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXY2NF91MzIKIC8vIENIRUNLOiByZXY2NCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIHVpbnQzMngyX3QgdGVzdF92cmV2NjRfdTMyKHVpbnQzMngyX3QgYSkgewogICByZXR1cm4gdnJldjY0X3UzMihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjY0X3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2NjRfcDgKIC8vIENIRUNLOiByZXY2NCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIHBvbHk4eDhfdCB0ZXN0X3ZyZXY2NF9wOChwb2x5OHg4X3QgYSkgewogICByZXR1cm4gdnJldjY0X3A4KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2NjRfcDE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2NjRfcDE2CiAvLyBDSEVDSzogcmV2NjQgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoCiBwb2x5MTZ4NF90IHRlc3RfdnJldjY0X3AxNihwb2x5MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZyZXY2NF9wMTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZyZXY2NF9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXY2NF9mMzIKIC8vIENIRUNLOiByZXY2NCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIGZsb2F0MzJ4Ml90IHRlc3RfdnJldjY0X2YzMihmbG9hdDMyeDJfdCBhKSB7CiAgIHJldHVybiB2cmV2NjRfZjMyKGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2NjRxX3M4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2NjRxX3M4CiAvLyBDSEVDSzogcmV2NjQgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIKIGludDh4MTZfdCB0ZXN0X3ZyZXY2NHFfczgoaW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZXY2NHFfczgoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZyZXY2NHFfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2NjRxX3MxNgogLy8gQ0hFQ0s6IHJldjY0IHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aAogaW50MTZ4OF90IHRlc3RfdnJldjY0cV9zMTYoaW50MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZXY2NHFfczE2KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2NjRxX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJldjY0cV9zMzIKIC8vIENIRUNLOiByZXY2NCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMKIGludDMyeDRfdCB0ZXN0X3ZyZXY2NHFfczMyKGludDMyeDRfdCBhKSB7CiAgIHJldHVybiB2cmV2NjRxX3MzMihhKTsKIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnJldjY0cV91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJldjY0cV91OAogLy8gQ0hFQ0s6IHJldjY0IHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiCiB1aW50OHgxNl90IHRlc3RfdnJldjY0cV91OCh1aW50OHgxNl90IGEpIHsKICAgcmV0dXJuIHZyZXY2NHFfdTgoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZyZXY2NHFfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2NjRxX3UxNgogLy8gQ0hFQ0s6IHJldjY0IHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aAogdWludDE2eDhfdCB0ZXN0X3ZyZXY2NHFfdTE2KHVpbnQxNng4X3QgYSkgewogICByZXR1cm4gdnJldjY0cV91MTYoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZyZXY2NHFfdTMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmV2NjRxX3UzMgogLy8gQ0hFQ0s6IHJldjY0IHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogdWludDMyeDRfdCB0ZXN0X3ZyZXY2NHFfdTMyKHVpbnQzMng0X3QgYSkgewogICByZXR1cm4gdnJldjY0cV91MzIoYSk7CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZyZXY2NHFfcDgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZXY2NHFfcDgKIC8vIENIRUNLOiByZXY2NCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogcG9seTh4MTZfdCB0ZXN0X3ZyZXY2NHFfcDgocG9seTh4MTZfdCBhKSB7CiAgIHJldHVybiB2cmV2NjRxX3A4KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2NjRxX3AxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJldjY0cV9wMTYKIC8vIENIRUNLOiByZXY2NCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgKIHBvbHkxNng4X3QgdGVzdF92cmV2NjRxX3AxNihwb2x5MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZyZXY2NHFfcDE2KGEpOwogfQogCi0vLyBDSEVDSzogdGVzdF92cmV2NjRxX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJldjY0cV9mMzIKIC8vIENIRUNLOiByZXY2NCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMKIGZsb2F0MzJ4NF90IHRlc3RfdnJldjY0cV9mMzIoZmxvYXQzMng0X3QgYSkgewogICByZXR1cm4gdnJldjY0cV9mMzIoYSk7CiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZwYWRkbF9zOChpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZwYWRkbF9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkZGxfczgKICAgcmV0dXJuIHZwYWRkbF9zOChhKTsKICAgLy8gQ0hFQ0s6IHNhZGRscCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uOGIKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnBhZGRsX3MxNihpbnQxNng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cGFkZGxfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkbF9zMTYKICAgcmV0dXJuIHZwYWRkbF9zMTYoYSk7CiAgIC8vIENIRUNLOiBzYWRkbHAgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjRoCiB9CiAKIGludDY0eDFfdCB0ZXN0X3ZwYWRkbF9zMzIoaW50MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnBhZGRsX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkZGxfczMyCiAgIHJldHVybiB2cGFkZGxfczMyKGEpOwogICAvLyBDSEVDSzogc2FkZGxwIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4ycwogfQogCiB1aW50MTZ4NF90IHRlc3RfdnBhZGRsX3U4KHVpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZwYWRkbF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkZGxfdTgKICAgcmV0dXJuIHZwYWRkbF91OChhKTsKICAgLy8gQ0hFQ0s6IHVhZGRscCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uOGIKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZwYWRkbF91MTYodWludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZwYWRkbF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGRsX3UxNgogICByZXR1cm4gdnBhZGRsX3UxNihhKTsKICAgLy8gQ0hFQ0s6IHVhZGRscCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uNGgKIH0KIAogdWludDY0eDFfdCB0ZXN0X3ZwYWRkbF91MzIodWludDMyeDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZwYWRkbF91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGRsX3UzMgogICByZXR1cm4gdnBhZGRsX3UzMihhKTsKICAgLy8gQ0hFQ0s6IHVhZGRscCB2e3tbMC05XSt9fS4xZCwgdnt7WzAtOV0rfX0uMnMKIH0KIAogaW50MTZ4OF90IHRlc3RfdnBhZGRscV9zOChpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cGFkZGxxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkbHFfczgKICAgcmV0dXJuIHZwYWRkbHFfczgoYSk7CiAgIC8vIENIRUNLOiBzYWRkbHAgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjE2YgogfQogCiBpbnQzMng0X3QgdGVzdF92cGFkZGxxX3MxNihpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cGFkZGxxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkZGxxX3MxNgogICByZXR1cm4gdnBhZGRscV9zMTYoYSk7CiAgIC8vIENIRUNLOiBzYWRkbHAgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjhoCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZwYWRkbHFfczMyKGludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZwYWRkbHFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkbHFfczMyCiAgIHJldHVybiB2cGFkZGxxX3MzMihhKTsKICAgLy8gQ0hFQ0s6IHNhZGRscCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uNHMKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZwYWRkbHFfdTgodWludDh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZwYWRkbHFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGRscV91OAogICByZXR1cm4gdnBhZGRscV91OChhKTsKICAgLy8gQ0hFQ0s6IHVhZGRscCB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92cGFkZGxxX3UxNih1aW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnBhZGRscV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGRscV91MTYKICAgcmV0dXJuIHZwYWRkbHFfdTE2KGEpOwogICAvLyBDSEVDSzogdWFkZGxwIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS44aAogfQogCiB1aW50NjR4Ml90IHRlc3RfdnBhZGRscV91MzIodWludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZwYWRkbHFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRkbHFfdTMyCiAgIHJldHVybiB2cGFkZGxxX3UzMihhKTsKICAgLy8gQ0hFQ0s6IHVhZGRscCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uNHMKIH0KIAogaW50MTZ4NF90IHRlc3RfdnBhZGFsX3M4KGludDE2eDRfdCBhLCBpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZwYWRhbF9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkYWxfczgKICAgcmV0dXJuIHZwYWRhbF9zOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHNhZGFscCB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uOGIKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnBhZGFsX3MxNihpbnQzMngyX3QgYSwgaW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnBhZGFsX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkYWxfczE2CiAgIHJldHVybiB2cGFkYWxfczE2KGEsIGIpOwogICAvLyBDSEVDSzogc2FkYWxwIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS40aAogfQogCiBpbnQ2NHgxX3QgdGVzdF92cGFkYWxfczMyKGludDY0eDFfdCBhLCBpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cGFkYWxfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRhbF9zMzIKICAgcmV0dXJuIHZwYWRhbF9zMzIoYSwgYik7CiAgIC8vIENIRUNLOiBzYWRhbHAgdnt7WzAtOV0rfX0uMWQsIHZ7e1swLTldK319LjJzCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92cGFkYWxfdTgodWludDE2eDRfdCBhLCB1aW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cGFkYWxfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGFsX3U4CiAgIHJldHVybiB2cGFkYWxfdTgoYSwgYik7CiAgIC8vIENIRUNLOiB1YWRhbHAgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjhiCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92cGFkYWxfdTE2KHVpbnQzMngyX3QgYSwgdWludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZwYWRhbF91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGFsX3UxNgogICByZXR1cm4gdnBhZGFsX3UxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHVhZGFscCB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uNGgKIH0KIAogdWludDY0eDFfdCB0ZXN0X3ZwYWRhbF91MzIodWludDY0eDFfdCBhLCB1aW50MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnBhZGFsX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cGFkYWxfdTMyCiAgIHJldHVybiB2cGFkYWxfdTMyKGEsIGIpOwogICAvLyBDSEVDSzogdWFkYWxwIHZ7e1swLTldK319LjFkLCB2e3tbMC05XSt9fS4ycwogfQogCiBpbnQxNng4X3QgdGVzdF92cGFkYWxxX3M4KGludDE2eDhfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cGFkYWxxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRhbHFfczgKICAgcmV0dXJuIHZwYWRhbHFfczgoYSwgYik7CiAgIC8vIENIRUNLOiBzYWRhbHAgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjE2YgogfQogCiBpbnQzMng0X3QgdGVzdF92cGFkYWxxX3MxNihpbnQzMng0X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnBhZGFscV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGFscV9zMTYKICAgcmV0dXJuIHZwYWRhbHFfczE2KGEsIGIpOwogICAvLyBDSEVDSzogc2FkYWxwIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS44aAogfQogCiBpbnQ2NHgyX3QgdGVzdF92cGFkYWxxX3MzMihpbnQ2NHgyX3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnBhZGFscV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGFscV9zMzIKICAgcmV0dXJuIHZwYWRhbHFfczMyKGEsIGIpOwogICAvLyBDSEVDSzogc2FkYWxwIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS40cwogfQogCiB1aW50MTZ4OF90IHRlc3RfdnBhZGFscV91OCh1aW50MTZ4OF90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cGFkYWxxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZwYWRhbHFfdTgKICAgcmV0dXJuIHZwYWRhbHFfdTgoYSwgYik7CiAgIC8vIENIRUNLOiB1YWRhbHAgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjE2YgogfQogCiB1aW50MzJ4NF90IHRlc3RfdnBhZGFscV91MTYodWludDMyeDRfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnBhZGFscV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGFscV91MTYKICAgcmV0dXJuIHZwYWRhbHFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdWFkYWxwIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS44aAogfQogCiB1aW50NjR4Ml90IHRlc3RfdnBhZGFscV91MzIodWludDY0eDJfdCBhLCB1aW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnBhZGFscV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnBhZGFscV91MzIKICAgcmV0dXJuIHZwYWRhbHFfdTMyKGEsIGIpOwogICAvLyBDSEVDSzogdWFkYWxwIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS40cwogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZxYWJzX3M4KGludDh4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFhYnNfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhYnNfczgKICAgcmV0dXJuIHZxYWJzX3M4KGEpOwogICAvLyBDSEVDSzogc3FhYnMgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiCiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZxYWJzcV9zOChpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cWFic3FfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhYnNxX3M4CiAgIHJldHVybiB2cWFic3FfczgoYSk7CiAgIC8vIENIRUNLOiBzcWFicyB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogfQogCiBpbnQxNng0X3QgdGVzdF92cWFic19zMTYoaW50MTZ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFhYnNfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxYWJzX3MxNgogICByZXR1cm4gdnFhYnNfczE2KGEpOwogICAvLyBDSEVDSzogc3FhYnMgdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZxYWJzcV9zMTYoaW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFhYnNxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cWFic3FfczE2CiAgIHJldHVybiB2cWFic3FfczE2KGEpOwogICAvLyBDSEVDSzogc3FhYnMgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZxYWJzX3MzMihpbnQzMngyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cWFic19zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFhYnNfczMyCiAgIHJldHVybiB2cWFic19zMzIoYSk7CiAgIC8vIENIRUNLOiBzcWFicyB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogaW50MzJ4NF90IHRlc3RfdnFhYnNxX3MzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cWFic3FfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxYWJzcV9zMzIKICAgcmV0dXJuIHZxYWJzcV9zMzIoYSk7CiAgIC8vIENIRUNLOiBzcWFicyB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnFhYnNxX3M2NChpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cWFic3FfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxYWJzcV9zNjQKICAgcmV0dXJuIHZxYWJzcV9zNjQoYSk7CiAgIC8vIENIRUNLOiBzcWFicyB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQKIH0KIAogaW50OHg4X3QgdGVzdF92cW5lZ19zOChpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxbmVnX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxbmVnX3M4CiAgIHJldHVybiB2cW5lZ19zOChhKTsKICAgLy8gQ0hFQ0s6IHNxbmVnIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92cW5lZ3FfczgoaW50OHgxNl90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFuZWdxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxbmVncV9zOAogICByZXR1cm4gdnFuZWdxX3M4KGEpOwogICAvLyBDSEVDSzogc3FuZWcgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnFuZWdfczE2KGludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxbmVnX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cW5lZ19zMTYKICAgcmV0dXJuIHZxbmVnX3MxNihhKTsKICAgLy8gQ0hFQ0s6IHNxbmVnIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aAogfQogCiBpbnQxNng4X3QgdGVzdF92cW5lZ3FfczE2KGludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxbmVncV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFuZWdxX3MxNgogICByZXR1cm4gdnFuZWdxX3MxNihhKTsKICAgLy8gQ0hFQ0s6IHNxbmVnIHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aAogfQogCiBpbnQzMngyX3QgdGVzdF92cW5lZ19zMzIoaW50MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFuZWdfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxbmVnX3MzMgogICByZXR1cm4gdnFuZWdfczMyKGEpOwogICAvLyBDSEVDSzogc3FuZWcgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxbmVncV9zMzIoaW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFuZWdxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cW5lZ3FfczMyCiAgIHJldHVybiB2cW5lZ3FfczMyKGEpOwogICAvLyBDSEVDSzogc3FuZWcgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZxbmVncV9zNjQoaW50NjR4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFuZWdxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cW5lZ3FfczY0CiAgIHJldHVybiB2cW5lZ3FfczY0KGEpOwogICAvLyBDSEVDSzogc3FuZWcgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkCiB9CiAKIGludDh4OF90IHRlc3Rfdm5lZ19zOChpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZuZWdfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm5lZ19zOAogICByZXR1cm4gdm5lZ19zOChhKTsKICAgLy8gQ0hFQ0s6IG5lZyB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIH0KIAogaW50OHgxNl90IHRlc3Rfdm5lZ3FfczgoaW50OHgxNl90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm5lZ3FfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm5lZ3FfczgKICAgcmV0dXJuIHZuZWdxX3M4KGEpOwogICAvLyBDSEVDSzogbmVnIHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZuZWdfczE2KGludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZuZWdfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZuZWdfczE2CiAgIHJldHVybiB2bmVnX3MxNihhKTsKICAgLy8gQ0hFQ0s6IG5lZyB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgKIH0KIAogaW50MTZ4OF90IHRlc3Rfdm5lZ3FfczE2KGludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZuZWdxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bmVncV9zMTYKICAgcmV0dXJuIHZuZWdxX3MxNihhKTsKICAgLy8gQ0hFQ0s6IG5lZyB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgKIH0KIAogaW50MzJ4Ml90IHRlc3Rfdm5lZ19zMzIoaW50MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm5lZ19zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm5lZ19zMzIKICAgcmV0dXJuIHZuZWdfczMyKGEpOwogICAvLyBDSEVDSzogbmVnIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogfQogCiBpbnQzMng0X3QgdGVzdF92bmVncV9zMzIoaW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm5lZ3FfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZuZWdxX3MzMgogICByZXR1cm4gdm5lZ3FfczMyKGEpOwogICAvLyBDSEVDSzogbmVnIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiBpbnQ2NHgyX3QgdGVzdF92bmVncV9zNjQoaW50NjR4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm5lZ3FfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZuZWdxX3M2NAogICByZXR1cm4gdm5lZ3FfczY0KGEpOwogICAvLyBDSEVDSzogbmVnIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZAogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZuZWdfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm5lZ19mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm5lZ19mMzIKICAgcmV0dXJuIHZuZWdfZjMyKGEpOwogICAvLyBDSEVDSzogZm5lZyB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92bmVncV9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bmVncV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm5lZ3FfZjMyCiAgIHJldHVybiB2bmVncV9mMzIoYSk7CiAgIC8vIENIRUNLOiBmbmVnIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZuZWdxX2Y2NChmbG9hdDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZuZWdxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bmVncV9mNjQKICAgcmV0dXJuIHZuZWdxX2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZuZWcgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkCiB9CiAKIGludDh4OF90IHRlc3RfdmFic19zOChpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYnNfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFic19zOAogICByZXR1cm4gdmFic19zOChhKTsKICAgLy8gQ0hFQ0s6IGFicyB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIH0KIAogaW50OHgxNl90IHRlc3RfdmFic3FfczgoaW50OHgxNl90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFic3FfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFic3FfczgKICAgcmV0dXJuIHZhYnNxX3M4KGEpOwogICAvLyBDSEVDSzogYWJzIHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZhYnNfczE2KGludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYnNfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYnNfczE2CiAgIHJldHVybiB2YWJzX3MxNihhKTsKICAgLy8gQ0hFQ0s6IGFicyB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgKIH0KIAogaW50MTZ4OF90IHRlc3RfdmFic3FfczE2KGludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYnNxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJzcV9zMTYKICAgcmV0dXJuIHZhYnNxX3MxNihhKTsKICAgLy8gQ0hFQ0s6IGFicyB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgKIH0KIAogaW50MzJ4Ml90IHRlc3RfdmFic19zMzIoaW50MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFic19zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFic19zMzIKICAgcmV0dXJuIHZhYnNfczMyKGEpOwogICAvLyBDSEVDSzogYWJzIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogfQogCiBpbnQzMng0X3QgdGVzdF92YWJzcV9zMzIoaW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFic3FfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYnNxX3MzMgogICByZXR1cm4gdmFic3FfczMyKGEpOwogICAvLyBDSEVDSzogYWJzIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiBpbnQ2NHgyX3QgdGVzdF92YWJzcV9zNjQoaW50NjR4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFic3FfczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZhYnNxX3M2NAogICByZXR1cm4gdmFic3FfczY0KGEpOwogICAvLyBDSEVDSzogYWJzIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZAogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZhYnNfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmFic19mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFic19mMzIKICAgcmV0dXJuIHZhYnNfZjMyKGEpOwogICAvLyBDSEVDSzogZmFicyB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92YWJzcV9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92YWJzcV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmFic3FfZjMyCiAgIHJldHVybiB2YWJzcV9mMzIoYSk7CiAgIC8vIENIRUNLOiBmYWJzIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZhYnNxX2Y2NChmbG9hdDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZhYnNxX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YWJzcV9mNjQKICAgcmV0dXJuIHZhYnNxX2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZhYnMgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkCiB9CiAKIGludDh4OF90IHRlc3RfdnVxYWRkX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnVxYWRkX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1cWFkZF9zOAogICByZXR1cm4gdnVxYWRkX3M4KGEsIGIpOwogICAvLyBDSEVDSzogc3VxYWRkIHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92dXFhZGRxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXFhZGRxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1cWFkZHFfczgKICAgcmV0dXJuIHZ1cWFkZHFfczgoYSwgYik7CiAgIC8vIENIRUNLOiBzdXFhZGQgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnVxYWRkX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnVxYWRkX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXFhZGRfczE2CiAgIHJldHVybiB2dXFhZGRfczE2KGEsIGIpOwogICAvLyBDSEVDSzogc3VxYWRkIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aAogfQogCiBpbnQxNng4X3QgdGVzdF92dXFhZGRxX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnVxYWRkcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnVxYWRkcV9zMTYKICAgcmV0dXJuIHZ1cWFkZHFfczE2KGEsIGIpOwogICAvLyBDSEVDSzogc3VxYWRkIHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS44aAogfQogCiBpbnQzMngyX3QgdGVzdF92dXFhZGRfczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXFhZGRfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1cWFkZF9zMzIKICAgcmV0dXJuIHZ1cWFkZF9zMzIoYSwgYik7CiAgIC8vIENIRUNLOiBzdXFhZGQgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3Z1cWFkZHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXFhZGRxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXFhZGRxX3MzMgogICByZXR1cm4gdnVxYWRkcV9zMzIoYSwgYik7CiAgIC8vIENIRUNLOiBzdXFhZGQgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzCiB9CiAKIGludDY0eDJfdCB0ZXN0X3Z1cWFkZHFfczY0KGludDY0eDJfdCBhLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXFhZGRxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXFhZGRxX3M2NAogICByZXR1cm4gdnVxYWRkcV9zNjQoYSwgYik7CiAgIC8vIENIRUNLOiBzdXFhZGQgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkCiB9CiAKIGludDh4OF90IHRlc3RfdmNsc19zOChpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHNfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsc19zOAogICByZXR1cm4gdmNsc19zOChhKTsKICAgLy8gQ0hFQ0s6IGNscyB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIH0KIAogaW50OHgxNl90IHRlc3RfdmNsc3FfczgoaW50OHgxNl90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsc3FfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsc3FfczgKICAgcmV0dXJuIHZjbHNxX3M4KGEpOwogICAvLyBDSEVDSzogY2xzIHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiCiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZjbHNfczE2KGludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHNfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHNfczE2CiAgIHJldHVybiB2Y2xzX3MxNihhKTsKICAgLy8gQ0hFQ0s6IGNscyB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNGgKIH0KIAogaW50MTZ4OF90IHRlc3RfdmNsc3FfczE2KGludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHNxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2xzcV9zMTYKICAgcmV0dXJuIHZjbHNxX3MxNihhKTsKICAgLy8gQ0hFQ0s6IGNscyB2e3tbMC05XSt9fS44aCwgdnt7WzAtOV0rfX0uOGgKIH0KIAogaW50MzJ4Ml90IHRlc3RfdmNsc19zMzIoaW50MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsc19zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsc19zMzIKICAgcmV0dXJuIHZjbHNfczMyKGEpOwogICAvLyBDSEVDSzogY2xzIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogfQogCiBpbnQzMng0X3QgdGVzdF92Y2xzcV9zMzIoaW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsc3FfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHNxX3MzMgogICByZXR1cm4gdmNsc3FfczMyKGEpOwogICAvLyBDSEVDSzogY2xzIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZjbHpfczgoaW50OHg4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92Y2x6X3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHpfczgKICAgcmV0dXJuIHZjbHpfczgoYSk7CiAgIC8vIENIRUNLOiBjbHogdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiCiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZjbHpxX3M4KGludDh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHpxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHpxX3M4CiAgIHJldHVybiB2Y2x6cV9zOChhKTsKICAgLy8gQ0hFQ0s6IGNseiB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogfQogCiBpbnQxNng0X3QgdGVzdF92Y2x6X3MxNihpbnQxNng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92Y2x6X3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x6X3MxNgogICByZXR1cm4gdmNsel9zMTYoYSk7CiAgIC8vIENIRUNLOiBjbHogdnt7WzAtOV0rfX0uNGgsIHZ7e1swLTldK319LjRoCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZjbHpxX3MxNihpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92Y2x6cV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsenFfczE2CiAgIHJldHVybiB2Y2x6cV9zMTYoYSk7CiAgIC8vIENIRUNLOiBjbHogdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZjbHpfczMyKGludDMyeDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHpfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHpfczMyCiAgIHJldHVybiB2Y2x6X3MzMihhKTsKICAgLy8gQ0hFQ0s6IGNseiB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogaW50MzJ4NF90IHRlc3RfdmNsenFfczMyKGludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbHpxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2x6cV9zMzIKICAgcmV0dXJuIHZjbHpxX3MzMihhKTsKICAgLy8gQ0hFQ0s6IGNseiB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMKIH0KIAogdWludDh4OF90IHRlc3RfdmNsel91OCh1aW50OHg4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92Y2x6X3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbHpfdTgKICAgcmV0dXJuIHZjbHpfdTgoYSk7CiAgIC8vIENIRUNLOiBjbHogdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92Y2x6cV91OCh1aW50OHgxNl90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsenFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsenFfdTgKICAgcmV0dXJuIHZjbHpxX3U4KGEpOwogICAvLyBDSEVDSzogY2x6IHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92Y2x6X3UxNih1aW50MTZ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsel91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsel91MTYKICAgcmV0dXJuIHZjbHpfdTE2KGEpOwogICAvLyBDSEVDSzogY2x6IHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40aAogfQogCiB1aW50MTZ4OF90IHRlc3RfdmNsenFfdTE2KHVpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92Y2x6cV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsenFfdTE2CiAgIHJldHVybiB2Y2x6cV91MTYoYSk7CiAgIC8vIENIRUNLOiBjbHogdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjhoCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92Y2x6X3UzMih1aW50MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNsel91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsel91MzIKICAgcmV0dXJuIHZjbHpfdTMyKGEpOwogICAvLyBDSEVDSzogY2x6IHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogfQogCiB1aW50MzJ4NF90IHRlc3RfdmNsenFfdTMyKHVpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92Y2x6cV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNsenFfdTMyCiAgIHJldHVybiB2Y2x6cV91MzIoYSk7CiAgIC8vIENIRUNLOiBjbHogdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzCiB9CiAKIGludDh4OF90IHRlc3RfdmNudF9zOChpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbnRfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNudF9zOAogICByZXR1cm4gdmNudF9zOChhKTsKICAgLy8gQ0hFQ0s6IGNudCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIH0KIAogaW50OHgxNl90IHRlc3RfdmNudHFfczgoaW50OHgxNl90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNudHFfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNudHFfczgKICAgcmV0dXJuIHZjbnRxX3M4KGEpOwogICAvLyBDSEVDSzogY250IHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZjbnRfdTgodWludDh4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNudF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y250X3U4CiAgIHJldHVybiB2Y250X3U4KGEpOwogICAvLyBDSEVDSzogY250IHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YgogfQogCiB1aW50OHgxNl90IHRlc3RfdmNudHFfdTgodWludDh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbnRxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjbnRxX3U4CiAgIHJldHVybiB2Y250cV91OChhKTsKICAgLy8gQ0hFQ0s6IGNudCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogfQogCiBwb2x5OHg4X3QgdGVzdF92Y250X3A4KHBvbHk4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjbnRfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNudF9wOAogICByZXR1cm4gdmNudF9wOChhKTsKICAgLy8gQ0hFQ0s6IGNudCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIH0KIAogcG9seTh4MTZfdCB0ZXN0X3ZjbnRxX3A4KHBvbHk4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92Y250cV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y250cV9wOAogICByZXR1cm4gdmNudHFfcDgoYSk7CiAgIC8vIENIRUNLOiBjbnQgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIKIH0KIAogaW50OHg4X3QgdGVzdF92bXZuX3M4KGludDh4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm12bl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXZuX3M4CiAgIHJldHVybiB2bXZuX3M4KGEpOwogICAvLyBDSEVDSzogbm90IHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92bXZucV9zOChpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bXZucV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXZucV9zOAogICByZXR1cm4gdm12bnFfczgoYSk7CiAgIC8vIENIRUNLOiBub3Qgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4NF90IHRlc3Rfdm12bl9zMTYoaW50MTZ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm12bl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm12bl9zMTYKICAgcmV0dXJuIHZtdm5fczE2KGEpOwogICAvLyBDSEVDSzogbm90IHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YgogfQogCiBpbnQxNng4X3QgdGVzdF92bXZucV9zMTYoaW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm12bnFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztdm5xX3MxNgogICByZXR1cm4gdm12bnFfczE2KGEpOwogICAvLyBDSEVDSzogbm90IHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiCiB9CiAKIGludDMyeDJfdCB0ZXN0X3Ztdm5fczMyKGludDMyeDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztdm5fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztdm5fczMyCiAgIHJldHVybiB2bXZuX3MzMihhKTsKICAgLy8gQ0hFQ0s6IG5vdCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIH0KIAogaW50MzJ4NF90IHRlc3Rfdm12bnFfczMyKGludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztdm5xX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXZucV9zMzIKICAgcmV0dXJuIHZtdm5xX3MzMihhKTsKICAgLy8gQ0hFQ0s6IG5vdCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogfQogCiB1aW50OHg4X3QgdGVzdF92bXZuX3U4KHVpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztdm5fdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm12bl91OAogICByZXR1cm4gdm12bl91OChhKTsKICAgLy8gQ0hFQ0s6IG5vdCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIH0KIAogdWludDh4MTZfdCB0ZXN0X3Ztdm5xX3U4KHVpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bXZucV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXZucV91OAogICByZXR1cm4gdm12bnFfdTgoYSk7CiAgIC8vIENIRUNLOiBub3Qgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIKIH0KIAogdWludDE2eDRfdCB0ZXN0X3Ztdm5fdTE2KHVpbnQxNng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bXZuX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXZuX3UxNgogICByZXR1cm4gdm12bl91MTYoYSk7CiAgIC8vIENIRUNLOiBub3Qgdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhiCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92bXZucV91MTYodWludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztdm5xX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXZucV91MTYKICAgcmV0dXJuIHZtdm5xX3UxNihhKTsKICAgLy8gQ0hFQ0s6IG5vdCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogfQogCiB1aW50MzJ4Ml90IHRlc3Rfdm12bl91MzIodWludDMyeDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztdm5fdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztdm5fdTMyCiAgIHJldHVybiB2bXZuX3UzMihhKTsKICAgLy8gQ0hFQ0s6IG5vdCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIH0KIAogdWludDMyeDRfdCB0ZXN0X3Ztdm5xX3UzMih1aW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm12bnFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztdm5xX3UzMgogICByZXR1cm4gdm12bnFfdTMyKGEpOwogICAvLyBDSEVDSzogbm90IHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiCiB9CiAKIHBvbHk4eDhfdCB0ZXN0X3Ztdm5fcDgocG9seTh4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm12bl9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXZuX3A4CiAgIHJldHVybiB2bXZuX3A4KGEpOwogICAvLyBDSEVDSzogbm90IHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YgogfQogCiBwb2x5OHgxNl90IHRlc3Rfdm12bnFfcDgocG9seTh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztdm5xX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztdm5xX3A4CiAgIHJldHVybiB2bXZucV9wOChhKTsKICAgLy8gQ0hFQ0s6IG5vdCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZyYml0X3M4KGludDh4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJiaXRfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJiaXRfczgKICAgcmV0dXJuIHZyYml0X3M4KGEpOwogICAvLyBDSEVDSzogcmJpdCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIH0KIAogaW50OHgxNl90IHRlc3RfdnJiaXRxX3M4KGludDh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZyYml0cV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cmJpdHFfczgKICAgcmV0dXJuIHZyYml0cV9zOChhKTsKICAgLy8gQ0hFQ0s6IHJiaXQgdnt7WzAtOV0rfX0uMTZiLCB2e3tbMC05XSt9fS4xNmIKIH0KIAogdWludDh4OF90IHRlc3RfdnJiaXRfdTgodWludDh4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJiaXRfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJiaXRfdTgKICAgcmV0dXJuIHZyYml0X3U4KGEpOwogICAvLyBDSEVDSzogcmJpdCB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGIKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZyYml0cV91OCh1aW50OHgxNl90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnJiaXRxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyYml0cV91OAogICByZXR1cm4gdnJiaXRxX3U4KGEpOwogICAvLyBDSEVDSzogcmJpdCB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjE2YgogfQogCiBwb2x5OHg4X3QgdGVzdF92cmJpdF9wOChwb2x5OHg4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cmJpdF9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cmJpdF9wOAogICByZXR1cm4gdnJiaXRfcDgoYSk7CiAgIC8vIENIRUNLOiByYml0IHZ7e1swLTldK319LjhiLCB2e3tbMC05XSt9fS44YgogfQogCiBwb2x5OHgxNl90IHRlc3RfdnJiaXRxX3A4KHBvbHk4eDE2X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cmJpdHFfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJiaXRxX3A4CiAgIHJldHVybiB2cmJpdHFfcDgoYSk7CiAgIC8vIENIRUNLOiByYml0IHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uMTZiCiB9CiAKIGludDh4OF90IHRlc3Rfdm1vdm5fczE2KGludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3ZuX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92bl9zMTYKICAgcmV0dXJuIHZtb3ZuX3MxNihhKTsKICAgLy8gQ0hFQ0s6IHh0biB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGgKIH0KIAogaW50MTZ4NF90IHRlc3Rfdm1vdm5fczMyKGludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3ZuX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92bl9zMzIKICAgcmV0dXJuIHZtb3ZuX3MzMihhKTsKICAgLy8gQ0hFQ0s6IHh0biB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNHMKIH0KIAogaW50MzJ4Ml90IHRlc3Rfdm1vdm5fczY0KGludDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3ZuX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92bl9zNjQKICAgcmV0dXJuIHZtb3ZuX3M2NChhKTsKICAgLy8gQ0hFQ0s6IHh0biB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMmQKIH0KIAogdWludDh4OF90IHRlc3Rfdm1vdm5fdTE2KHVpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92bW92bl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm1vdm5fdTE2CiAgIHJldHVybiB2bW92bl91MTYoYSk7CiAgIC8vIENIRUNLOiB4dG4gdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhoCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92bW92bl91MzIodWludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3ZuX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92bl91MzIKICAgcmV0dXJuIHZtb3ZuX3UzMihhKTsKICAgLy8gQ0hFQ0s6IHh0biB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNHMKIH0KIAogdWludDMyeDJfdCB0ZXN0X3Ztb3ZuX3U2NCh1aW50NjR4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm1vdm5fdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3ZuX3U2NAogICByZXR1cm4gdm1vdm5fdTY0KGEpOwogICAvLyBDSEVDSzogeHRuIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yZAogfQogCiBpbnQ4eDE2X3QgdGVzdF92bW92bl9oaWdoX3MxNihpbnQ4eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92bW92bl9oaWdoX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92bl9oaWdoX3MxNgogICByZXR1cm4gdm1vdm5faGlnaF9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB4dG4yIHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uOGgKIH0KIAogaW50MTZ4OF90IHRlc3Rfdm1vdm5faGlnaF9zMzIoaW50MTZ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3ZuX2hpZ2hfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3ZuX2hpZ2hfczMyCiAgIHJldHVybiB2bW92bl9oaWdoX3MzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHh0bjIgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjRzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3Ztb3ZuX2hpZ2hfczY0KGludDMyeDJfdCBhLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92bW92bl9oaWdoX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92bl9oaWdoX3M2NAogICByZXR1cm4gdm1vdm5faGlnaF9zNjQoYSwgYik7CiAgIC8vIENIRUNLOiB4dG4yIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS4yZAogfQogCiBpbnQ4eDE2X3QgdGVzdF92bW92bl9oaWdoX3UxNihpbnQ4eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92bW92bl9oaWdoX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92bl9oaWdoX3UxNgogICByZXR1cm4gdm1vdm5faGlnaF91MTYoYSwgYik7CiAgIC8vIENIRUNLOiB4dG4yIHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uOGgKIH0KIAogaW50MTZ4OF90IHRlc3Rfdm1vdm5faGlnaF91MzIoaW50MTZ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Ztb3ZuX2hpZ2hfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Ztb3ZuX2hpZ2hfdTMyCiAgIHJldHVybiB2bW92bl9oaWdoX3UzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHh0bjIgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjRzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3Ztb3ZuX2hpZ2hfdTY0KGludDMyeDJfdCBhLCBpbnQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92bW92bl9oaWdoX3U2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92bl9oaWdoX3U2NAogICByZXR1cm4gdm1vdm5faGlnaF91NjQoYSwgYik7CiAgIC8vIENIRUNLOiB4dG4yIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS4yZAogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZxbW92dW5fczE2KGludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxbW92dW5fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxbW92dW5fczE2CiAgIHJldHVybiB2cW1vdnVuX3MxNihhKTsKICAgLy8gQ0hFQ0s6IHNxeHR1biB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGgKIH0KIAogaW50MTZ4NF90IHRlc3RfdnFtb3Z1bl9zMzIoaW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3Z1bl9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFtb3Z1bl9zMzIKICAgcmV0dXJuIHZxbW92dW5fczMyKGEpOwogICAvLyBDSEVDSzogc3F4dHVuIHZ7e1swLTldK319LjRoLCB2e3tbMC05XSt9fS40cwogfQogCiBpbnQzMngyX3QgdGVzdF92cW1vdnVuX3M2NChpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cW1vdnVuX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cW1vdnVuX3M2NAogICByZXR1cm4gdnFtb3Z1bl9zNjQoYSk7CiAgIC8vIENIRUNLOiBzcXh0dW4gdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJkCiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZxbW92dW5faGlnaF9zMTYoaW50OHg4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3Z1bl9oaWdoX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cW1vdnVuX2hpZ2hfczE2CiAgIHJldHVybiB2cW1vdnVuX2hpZ2hfczE2KGEsIGIpOwogICAvLyBDSEVDSzogc3F4dHVuMiB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjhoCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZxbW92dW5faGlnaF9zMzIoaW50MTZ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxbW92dW5faGlnaF9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFtb3Z1bl9oaWdoX3MzMgogICByZXR1cm4gdnFtb3Z1bl9oaWdoX3MzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHNxeHR1bjIgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjRzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZxbW92dW5faGlnaF9zNjQoaW50MzJ4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxbW92dW5faGlnaF9zNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFtb3Z1bl9oaWdoX3M2NAogICByZXR1cm4gdnFtb3Z1bl9oaWdoX3M2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IHNxeHR1bjIgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjJkCiB9CiAKIGludDh4OF90IHRlc3RfdnFtb3ZuX3MxNihpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cW1vdm5fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxbW92bl9zMTYKICAgcmV0dXJuIHZxbW92bl9zMTYoYSk7CiAgIC8vIENIRUNLOiBzcXh0biB2e3tbMC05XSt9fS44Yiwgdnt7WzAtOV0rfX0uOGgKIH0KIAogaW50MTZ4NF90IHRlc3RfdnFtb3ZuX3MzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cW1vdm5fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxbW92bl9zMzIKICAgcmV0dXJuIHZxbW92bl9zMzIoYSk7CiAgIC8vIENIRUNLOiBzcXh0biB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNHMKIH0KIAogaW50MzJ4Ml90IHRlc3RfdnFtb3ZuX3M2NChpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cW1vdm5fczY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxbW92bl9zNjQKICAgcmV0dXJuIHZxbW92bl9zNjQoYSk7CiAgIC8vIENIRUNLOiBzcXh0biB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMmQKIH0KIAogaW50OHgxNl90IHRlc3RfdnFtb3ZuX2hpZ2hfczE2KGludDh4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxbW92bl9oaWdoX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cW1vdm5faGlnaF9zMTYKICAgcmV0dXJuIHZxbW92bl9oaWdoX3MxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHNxeHRuMiB2e3tbMC05XSt9fS4xNmIsIHZ7e1swLTldK319LjhoCiB9CiAKIGludDE2eDhfdCB0ZXN0X3ZxbW92bl9oaWdoX3MzMihpbnQxNng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3ZuX2hpZ2hfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxbW92bl9oaWdoX3MzMgogICByZXR1cm4gdnFtb3ZuX2hpZ2hfczMyKGEsIGIpOwogICAvLyBDSEVDSzogc3F4dG4yIHZ7e1swLTldK319LjhoLCB2e3tbMC05XSt9fS40cwogfQogCiBpbnQzMng0X3QgdGVzdF92cW1vdm5faGlnaF9zNjQoaW50MzJ4Ml90IGEsIGludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxbW92bl9oaWdoX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cW1vdm5faGlnaF9zNjQKICAgcmV0dXJuIHZxbW92bl9oaWdoX3M2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IHNxeHRuMiB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uMmQKIH0KIAogdWludDh4OF90IHRlc3RfdnFtb3ZuX3UxNih1aW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3ZuX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cW1vdm5fdTE2CiAgIHJldHVybiB2cW1vdm5fdTE2KGEpOwogICAvLyBDSEVDSzogdXF4dG4gdnt7WzAtOV0rfX0uOGIsIHZ7e1swLTldK319LjhoCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92cW1vdm5fdTMyKHVpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92cW1vdm5fdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxbW92bl91MzIKICAgcmV0dXJuIHZxbW92bl91MzIoYSk7CiAgIC8vIENIRUNLOiB1cXh0biB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNHMKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZxbW92bl91NjQodWludDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxbW92bl91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFtb3ZuX3U2NAogICByZXR1cm4gdnFtb3ZuX3U2NChhKTsKICAgLy8gQ0hFQ0s6IHVxeHRuIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yZAogfQogCiB1aW50OHgxNl90IHRlc3RfdnFtb3ZuX2hpZ2hfdTE2KHVpbnQ4eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3ZuX2hpZ2hfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxbW92bl9oaWdoX3UxNgogICByZXR1cm4gdnFtb3ZuX2hpZ2hfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdXF4dG4yIHZ7e1swLTldK319LjE2Yiwgdnt7WzAtOV0rfX0uOGgKIH0KIAogdWludDE2eDhfdCB0ZXN0X3ZxbW92bl9oaWdoX3UzMih1aW50MTZ4NF90IGEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cW1vdm5faGlnaF91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFtb3ZuX2hpZ2hfdTMyCiAgIHJldHVybiB2cW1vdm5faGlnaF91MzIoYSwgYik7CiAgIC8vIENIRUNLOiB1cXh0bjIgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjRzCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92cW1vdm5faGlnaF91NjQodWludDMyeDJfdCBhLCB1aW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3ZuX2hpZ2hfdTY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxbW92bl9oaWdoX3U2NAogICByZXR1cm4gdnFtb3ZuX2hpZ2hfdTY0KGEsIGIpOwogICAvLyBDSEVDSzogdXF4dG4yIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS4yZAogfQogCiBpbnQxNng4X3QgdGVzdF92c2hsbF9uX3M4KGludDh4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNobGxfbl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsbF9uX3M4CiAgIHJldHVybiB2c2hsbF9uX3M4KGEsIDgpOwogICAvLyBDSEVDSzogc2hsbCB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGIsICM4CiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZzaGxsX25fczE2KGludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaGxsX25fczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxsX25fczE2CiAgIHJldHVybiB2c2hsbF9uX3MxNihhLCAxNik7CiAgIC8vIENIRUNLOiBzaGxsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwgIzE2CiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZzaGxsX25fczMyKGludDMyeDJfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaGxsX25fczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxsX25fczMyCiAgIHJldHVybiB2c2hsbF9uX3MzMihhLCAzMik7CiAgIC8vIENIRUNLOiBzaGxsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4ycywgIzMyCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92c2hsbF9uX3U4KHVpbnQ4eDhfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaGxsX25fdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobGxfbl91OAogICByZXR1cm4gdnNobGxfbl91OChhLCA4KTsKICAgLy8gQ0hFQ0s6IHNobGwge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhiLCAjOAogfQogCiB1aW50MzJ4NF90IHRlc3RfdnNobGxfbl91MTYodWludDE2eDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaGxsX25fdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxsX25fdTE2CiAgIHJldHVybiB2c2hsbF9uX3UxNihhLCAxNik7CiAgIC8vIENIRUNLOiBzaGxsIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40aCwgIzE2CiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92c2hsbF9uX3UzMih1aW50MzJ4Ml90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNobGxfbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobGxfbl91MzIKICAgcmV0dXJuIHZzaGxsX25fdTMyKGEsIDMyKTsKICAgLy8gQ0hFQ0s6IHNobGwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJzLCAjMzIKIH0KIAogaW50MTZ4OF90IHRlc3RfdnNobGxfaGlnaF9uX3M4KGludDh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaGxsX2hpZ2hfbl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsbF9oaWdoX25fczgKICAgcmV0dXJuIHZzaGxsX2hpZ2hfbl9zOChhLCA4KTsKICAgLy8gQ0hFQ0s6IHNobGwyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS4xNmIsICM4CiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZzaGxsX2hpZ2hfbl9zMTYoaW50MTZ4OF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNobGxfaGlnaF9uX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsbF9oaWdoX25fczE2CiAgIHJldHVybiB2c2hsbF9oaWdoX25fczE2KGEsIDE2KTsKICAgLy8gQ0hFQ0s6IHNobGwyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS44aCwgIzE2CiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZzaGxsX2hpZ2hfbl9zMzIoaW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnNobGxfaGlnaF9uX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsbF9oaWdoX25fczMyCiAgIHJldHVybiB2c2hsbF9oaWdoX25fczMyKGEsIDMyKTsKICAgLy8gQ0hFQ0s6IHNobGwyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS40cywgIzMyCiB9CiAKIHVpbnQxNng4X3QgdGVzdF92c2hsbF9oaWdoX25fdTgodWludDh4MTZfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaGxsX2hpZ2hfbl91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2hsbF9oaWdoX25fdTgKICAgcmV0dXJuIHZzaGxsX2hpZ2hfbl91OChhLCA4KTsKICAgLy8gQ0hFQ0s6IHNobGwyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS4xNmIsICM4CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92c2hsbF9oaWdoX25fdTE2KHVpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSzogdGVzdF92c2hsbF9oaWdoX25fdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzaGxsX2hpZ2hfbl91MTYKICAgcmV0dXJuIHZzaGxsX2hpZ2hfbl91MTYoYSwgMTYpOwogICAvLyBDSEVDSzogc2hsbDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjhoLCAjMTYKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZzaGxsX2hpZ2hfbl91MzIodWludDMyeDRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzaGxsX2hpZ2hfbl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNobGxfaGlnaF9uX3UzMgogICByZXR1cm4gdnNobGxfaGlnaF9uX3UzMihhLCAzMik7CiAgIC8vIENIRUNLOiBzaGxsMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uNHMsICMzMgogfQogCiBmbG9hdDE2eDRfdCB0ZXN0X3ZjdnRfZjE2X2YzMihmbG9hdDMyeDRfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dF9mMTZfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dF9mMTZfZjMyCiAgIHJldHVybiB2Y3Z0X2YxNl9mMzIoYSk7CiAgIC8vIENIRUNLOiBmY3Z0biB2e3tbMC05XSt9fS40aCwgdnt7WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQxNng4X3QgdGVzdF92Y3Z0X2hpZ2hfZjE2X2YzMihmbG9hdDE2eDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dF9oaWdoX2YxNl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0X2hpZ2hfZjE2X2YzMgogICByZXR1cm4gdmN2dF9oaWdoX2YxNl9mMzIoYSwgYik7CiAgIC8vIENIRUNLOiBmY3Z0bjIgdnt7WzAtOV0rfX0uOGgsIHZ7e1swLTldK319LjRzCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdmN2dF9mMzJfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0X2YzMl9mNjQKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0X2YzMl9mNjQKICAgcmV0dXJuIHZjdnRfZjMyX2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZjdnRuIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4yZAogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZjdnRfaGlnaF9mMzJfZjY0KGZsb2F0MzJ4Ml90IGEsIGZsb2F0NjR4Ml90IGIpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0X2hpZ2hfZjMyX2Y2NAorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRfaGlnaF9mMzJfZjY0CiAgIHJldHVybiB2Y3Z0X2hpZ2hfZjMyX2Y2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IGZjdnRuMiB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uMmQKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92Y3Z0eF9mMzJfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0eF9mMzJfZjY0CisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dHhfZjMyX2Y2NAogICByZXR1cm4gdmN2dHhfZjMyX2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZjdnR4biB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMmQKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92Y3Z0eF9oaWdoX2YzMl9mNjQoZmxvYXQzMngyX3QgYSwgZmxvYXQ2NHgyX3QgYikgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnR4X2hpZ2hfZjMyX2Y2NAorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnR4X2hpZ2hfZjMyX2Y2NAogICByZXR1cm4gdmN2dHhfaGlnaF9mMzJfZjY0KGEsIGIpOwogICAvLyBDSEVDSzogZmN2dHhuMiB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uMmQKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92Y3Z0X2YzMl9mMTYoZmxvYXQxNng0X3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRfZjMyX2YxNgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRfZjMyX2YxNgogICByZXR1cm4gdmN2dF9mMzJfZjE2KGEpOwogICAvLyBDSEVDSzogZmN2dGwgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRoCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdmN2dF9oaWdoX2YzMl9mMTYoZmxvYXQxNng4X3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRfaGlnaF9mMzJfZjE2CisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dF9oaWdoX2YzMl9mMTYKICAgcmV0dXJuIHZjdnRfaGlnaF9mMzJfZjE2KGEpOwogICAvLyBDSEVDSzogZmN2dGwyIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS44aAogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZjdnRfZjY0X2YzMihmbG9hdDMyeDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dF9mNjRfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dF9mNjRfZjMyCiAgIHJldHVybiB2Y3Z0X2Y2NF9mMzIoYSk7CiAgIC8vIENIRUNLOiBmY3Z0bCB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92Y3Z0X2hpZ2hfZjY0X2YzMihmbG9hdDMyeDRfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dF9oaWdoX2Y2NF9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0X2hpZ2hfZjY0X2YzMgogICByZXR1cm4gdmN2dF9oaWdoX2Y2NF9mMzIoYSk7CiAgIC8vIENIRUNLOiBmY3Z0bDIgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjRzCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdnJuZG5fZjMyKGZsb2F0MzJ4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cm5kbl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92cm5kbl9mMzIKICAgcmV0dXJuIHZybmRuX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZyaW50biB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92cm5kbnFfZjMyKGZsb2F0MzJ4NF90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cm5kbnFfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdnJuZG5xX2YzMgogICByZXR1cm4gdnJuZG5xX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZyaW50biB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92cm5kbnFfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cm5kbnFfZjY0CisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdnJuZG5xX2Y2NAogICByZXR1cm4gdnJuZG5xX2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZyaW50biB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92cm5kYV9mMzIoZmxvYXQzMngyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZybmRhX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZybmRhX2YzMgogICByZXR1cm4gdnJuZGFfZjMyKGEpOwogICAvLyBDSEVDSzogZnJpbnRhIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZybmRhcV9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZybmRhcV9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92cm5kYXFfZjMyCiAgIHJldHVybiB2cm5kYXFfZjMyKGEpOwogICAvLyBDSEVDSzogZnJpbnRhIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZybmRhcV9mNjQoZmxvYXQ2NHgyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZybmRhcV9mNjQKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92cm5kYXFfZjY0CiAgIHJldHVybiB2cm5kYXFfZjY0KGEpOwogICAvLyBDSEVDSzogZnJpbnRhIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZAogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZybmRwX2YzMihmbG9hdDMyeDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdnJuZHBfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdnJuZHBfZjMyCiAgIHJldHVybiB2cm5kcF9mMzIoYSk7CiAgIC8vIENIRUNLOiBmcmludHAgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnJuZHBxX2YzMihmbG9hdDMyeDRfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdnJuZHBxX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZybmRwcV9mMzIKICAgcmV0dXJuIHZybmRwcV9mMzIoYSk7CiAgIC8vIENIRUNLOiBmcmludHAgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdnJuZHBxX2Y2NChmbG9hdDY0eDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdnJuZHBxX2Y2NAorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZybmRwcV9mNjQKICAgcmV0dXJuIHZybmRwcV9mNjQoYSk7CiAgIC8vIENIRUNLOiBmcmludHAgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdnJuZG1fZjMyKGZsb2F0MzJ4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cm5kbV9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92cm5kbV9mMzIKICAgcmV0dXJuIHZybmRtX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZyaW50bSB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92cm5kbXFfZjMyKGZsb2F0MzJ4NF90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cm5kbXFfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdnJuZG1xX2YzMgogICByZXR1cm4gdnJuZG1xX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZyaW50bSB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92cm5kbXFfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cm5kbXFfZjY0CisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdnJuZG1xX2Y2NAogICByZXR1cm4gdnJuZG1xX2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZyaW50bSB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92cm5keF9mMzIoZmxvYXQzMngyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZybmR4X2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZybmR4X2YzMgogICByZXR1cm4gdnJuZHhfZjMyKGEpOwogICAvLyBDSEVDSzogZnJpbnR4IHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZybmR4cV9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZybmR4cV9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92cm5keHFfZjMyCiAgIHJldHVybiB2cm5keHFfZjMyKGEpOwogICAvLyBDSEVDSzogZnJpbnR4IHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZybmR4cV9mNjQoZmxvYXQ2NHgyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZybmR4cV9mNjQKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92cm5keHFfZjY0CiAgIHJldHVybiB2cm5keHFfZjY0KGEpOwogICAvLyBDSEVDSzogZnJpbnR4IHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZAogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZybmRfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cm5kX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZybmRfZjMyCiAgIHJldHVybiB2cm5kX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZyaW50eiB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92cm5kcV9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZybmRxX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZybmRxX2YzMgogICByZXR1cm4gdnJuZHFfZjMyKGEpOwogICAvLyBDSEVDSzogZnJpbnR6IHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZybmRxX2Y2NChmbG9hdDY0eDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdnJuZHFfZjY0CisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdnJuZHFfZjY0CiAgIHJldHVybiB2cm5kcV9mNjQoYSk7CiAgIC8vIENIRUNLOiBmcmludHogdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdnJuZGlfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cm5kaV9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92cm5kaV9mMzIKICAgcmV0dXJuIHZybmRpX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZyaW50aSB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMng0X3QgdGVzdF92cm5kaXFfZjMyKGZsb2F0MzJ4NF90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cm5kaXFfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdnJuZGlxX2YzMgogICByZXR1cm4gdnJuZGlxX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZyaW50aSB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92cm5kaXFfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cm5kaXFfZjY0CisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdnJuZGlxX2Y2NAogICByZXR1cm4gdnJuZGlxX2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZyaW50aSB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQKIH0KIAogaW50MzJ4Ml90IHRlc3RfdmN2dF9zMzJfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0X3MzMl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0X3MzMl9mMzIKICAgcmV0dXJuIHZjdnRfczMyX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZjdnR6cyB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogaW50MzJ4NF90IHRlc3RfdmN2dHFfczMyX2YzMihmbG9hdDMyeDRfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dHFfczMyX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRxX3MzMl9mMzIKICAgcmV0dXJuIHZjdnRxX3MzMl9mMzIoYSk7CiAgIC8vIENIRUNLOiBmY3Z0enMgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZjdnRxX3M2NF9mNjQoZmxvYXQ2NHgyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRxX3M2NF9mNjQKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0cV9zNjRfZjY0CiAgIHJldHVybiB2Y3Z0cV9zNjRfZjY0KGEpOwogICAvLyBDSEVDSzogZmN2dHpzIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmN2dF91MzJfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0X3UzMl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0X3UzMl9mMzIKICAgcmV0dXJuIHZjdnRfdTMyX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZjdnR6dSB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZjdnRxX3UzMl9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRxX3UzMl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0cV91MzJfZjMyCiAgIHJldHVybiB2Y3Z0cV91MzJfZjMyKGEpOwogICAvLyBDSEVDSzogZmN2dHp1IHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiB1aW50NjR4Ml90IHRlc3RfdmN2dHFfdTY0X2Y2NChmbG9hdDY0eDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dHFfdTY0X2Y2NAorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRxX3U2NF9mNjQKICAgcmV0dXJuIHZjdnRxX3U2NF9mNjQoYSk7CiAgIC8vIENIRUNLOiBmY3Z0enUgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZjdnRuX3MzMl9mMzIoZmxvYXQzMngyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRuX3MzMl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0bl9zMzJfZjMyCiAgIHJldHVybiB2Y3Z0bl9zMzJfZjMyKGEpOwogICAvLyBDSEVDSzogZmN2dG5zIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogfQogCiBpbnQzMng0X3QgdGVzdF92Y3Z0bnFfczMyX2YzMihmbG9hdDMyeDRfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dG5xX3MzMl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0bnFfczMyX2YzMgogICByZXR1cm4gdmN2dG5xX3MzMl9mMzIoYSk7CiAgIC8vIENIRUNLOiBmY3Z0bnMgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZjdnRucV9zNjRfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0bnFfczY0X2Y2NAorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRucV9zNjRfZjY0CiAgIHJldHVybiB2Y3Z0bnFfczY0X2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZjdnRucyB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZjdnRuX3UzMl9mMzIoZmxvYXQzMngyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRuX3UzMl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0bl91MzJfZjMyCiAgIHJldHVybiB2Y3Z0bl91MzJfZjMyKGEpOwogICAvLyBDSEVDSzogZmN2dG51IHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogfQogCiB1aW50MzJ4NF90IHRlc3RfdmN2dG5xX3UzMl9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRucV91MzJfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dG5xX3UzMl9mMzIKICAgcmV0dXJuIHZjdnRucV91MzJfZjMyKGEpOwogICAvLyBDSEVDSzogZmN2dG51IHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiB1aW50NjR4Ml90IHRlc3RfdmN2dG5xX3U2NF9mNjQoZmxvYXQ2NHgyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRucV91NjRfZjY0CisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dG5xX3U2NF9mNjQKICAgcmV0dXJuIHZjdnRucV91NjRfZjY0KGEpOwogICAvLyBDSEVDSzogZmN2dG51IHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZAogfQogCiBpbnQzMngyX3QgdGVzdF92Y3Z0cF9zMzJfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0cF9zMzJfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dHBfczMyX2YzMgogICByZXR1cm4gdmN2dHBfczMyX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZjdnRwcyB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogaW50MzJ4NF90IHRlc3RfdmN2dHBxX3MzMl9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRwcV9zMzJfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dHBxX3MzMl9mMzIKICAgcmV0dXJuIHZjdnRwcV9zMzJfZjMyKGEpOwogICAvLyBDSEVDSzogZmN2dHBzIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiBpbnQ2NHgyX3QgdGVzdF92Y3Z0cHFfczY0X2Y2NChmbG9hdDY0eDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dHBxX3M2NF9mNjQKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0cHFfczY0X2Y2NAogICByZXR1cm4gdmN2dHBxX3M2NF9mNjQoYSk7CiAgIC8vIENIRUNLOiBmY3Z0cHMgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkCiB9CiAKIHVpbnQzMngyX3QgdGVzdF92Y3Z0cF91MzJfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0cF91MzJfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dHBfdTMyX2YzMgogICByZXR1cm4gdmN2dHBfdTMyX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZjdnRwdSB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogdWludDMyeDRfdCB0ZXN0X3ZjdnRwcV91MzJfZjMyKGZsb2F0MzJ4NF90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0cHFfdTMyX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRwcV91MzJfZjMyCiAgIHJldHVybiB2Y3Z0cHFfdTMyX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZjdnRwdSB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMKIH0KIAogdWludDY0eDJfdCB0ZXN0X3ZjdnRwcV91NjRfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0cHFfdTY0X2Y2NAorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRwcV91NjRfZjY0CiAgIHJldHVybiB2Y3Z0cHFfdTY0X2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZjdnRwdSB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQKIH0KIAogaW50MzJ4Ml90IHRlc3RfdmN2dG1fczMyX2YzMihmbG9hdDMyeDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dG1fczMyX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRtX3MzMl9mMzIKICAgcmV0dXJuIHZjdnRtX3MzMl9mMzIoYSk7CiAgIC8vIENIRUNLOiBmY3Z0bXMgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzCiB9CiAKIGludDMyeDRfdCB0ZXN0X3ZjdnRtcV9zMzJfZjMyKGZsb2F0MzJ4NF90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0bXFfczMyX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRtcV9zMzJfZjMyCiAgIHJldHVybiB2Y3Z0bXFfczMyX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZjdnRtcyB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdmN2dG1xX3M2NF9mNjQoZmxvYXQ2NHgyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRtcV9zNjRfZjY0CisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dG1xX3M2NF9mNjQKICAgcmV0dXJuIHZjdnRtcV9zNjRfZjY0KGEpOwogICAvLyBDSEVDSzogZmN2dG1zIHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmN2dG1fdTMyX2YzMihmbG9hdDMyeDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dG1fdTMyX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRtX3UzMl9mMzIKICAgcmV0dXJuIHZjdnRtX3UzMl9mMzIoYSk7CiAgIC8vIENIRUNLOiBmY3Z0bXUgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92Y3Z0bXFfdTMyX2YzMihmbG9hdDMyeDRfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dG1xX3UzMl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0bXFfdTMyX2YzMgogICByZXR1cm4gdmN2dG1xX3UzMl9mMzIoYSk7CiAgIC8vIENIRUNLOiBmY3Z0bXUgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92Y3Z0bXFfdTY0X2Y2NChmbG9hdDY0eDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dG1xX3U2NF9mNjQKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0bXFfdTY0X2Y2NAogICByZXR1cm4gdmN2dG1xX3U2NF9mNjQoYSk7CiAgIC8vIENIRUNLOiBmY3Z0bXUgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkCiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZjdnRhX3MzMl9mMzIoZmxvYXQzMngyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRhX3MzMl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0YV9zMzJfZjMyCiAgIHJldHVybiB2Y3Z0YV9zMzJfZjMyKGEpOwogICAvLyBDSEVDSzogZmN2dGFzIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogfQogCiBpbnQzMng0X3QgdGVzdF92Y3Z0YXFfczMyX2YzMihmbG9hdDMyeDRfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dGFxX3MzMl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0YXFfczMyX2YzMgogICByZXR1cm4gdmN2dGFxX3MzMl9mMzIoYSk7CiAgIC8vIENIRUNLOiBmY3Z0YXMgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzCiB9CiAKIGludDY0eDJfdCB0ZXN0X3ZjdnRhcV9zNjRfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0YXFfczY0X2Y2NAorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRhcV9zNjRfZjY0CiAgIHJldHVybiB2Y3Z0YXFfczY0X2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZjdnRhcyB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZjdnRhX3UzMl9mMzIoZmxvYXQzMngyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRhX3UzMl9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0YV91MzJfZjMyCiAgIHJldHVybiB2Y3Z0YV91MzJfZjMyKGEpOwogICAvLyBDSEVDSzogZmN2dGF1IHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogfQogCiB1aW50MzJ4NF90IHRlc3RfdmN2dGFxX3UzMl9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRhcV91MzJfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dGFxX3UzMl9mMzIKICAgcmV0dXJuIHZjdnRhcV91MzJfZjMyKGEpOwogICAvLyBDSEVDSzogZmN2dGF1IHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiB1aW50NjR4Ml90IHRlc3RfdmN2dGFxX3U2NF9mNjQoZmxvYXQ2NHgyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRhcV91NjRfZjY0CisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dGFxX3U2NF9mNjQKICAgcmV0dXJuIHZjdnRhcV91NjRfZjY0KGEpOwogICAvLyBDSEVDSzogZmN2dGF1IHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZAogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3Zyc3FydGVfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cnNxcnRlX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3Zyc3FydGVfZjMyCiAgIHJldHVybiB2cnNxcnRlX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZyc3FydGUgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnJzcXJ0ZXFfZjMyKGZsb2F0MzJ4NF90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cnNxcnRlcV9mMzIKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92cnNxcnRlcV9mMzIKICAgcmV0dXJuIHZyc3FydGVxX2YzMihhKTsKICAgLy8gQ0hFQ0s6IGZyc3FydGUgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdnJzcXJ0ZXFfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cnNxcnRlcV9mNjQKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92cnNxcnRlcV9mNjQKICAgcmV0dXJuIHZyc3FydGVxX2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZyc3FydGUgdnt7WzAtOV0rfX0uMmQsIHZ7e1swLTldK319LjJkCiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdnJlY3BlX2YzMihmbG9hdDMyeDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdnJlY3BlX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZyZWNwZV9mMzIKICAgcmV0dXJuIHZyZWNwZV9mMzIoYSk7CiAgIC8vIENIRUNLOiBmcmVjcGUgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnJlY3BlcV9mMzIoZmxvYXQzMng0X3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZyZWNwZXFfZjMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdnJlY3BlcV9mMzIKICAgcmV0dXJuIHZyZWNwZXFfZjMyKGEpOwogICAvLyBDSEVDSzogZnJlY3BlIHZ7e1swLTldK319LjRzLCB2e3tbMC05XSt9fS40cwogfQogCiBmbG9hdDY0eDJfdCB0ZXN0X3ZyZWNwZXFfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cmVjcGVxX2Y2NAorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZyZWNwZXFfZjY0CiAgIHJldHVybiB2cmVjcGVxX2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZyZWNwZSB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZyZWNwZV91MzIodWludDMyeDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdnJlY3BlX3UzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZyZWNwZV91MzIKICAgcmV0dXJuIHZyZWNwZV91MzIoYSk7CiAgIC8vIENIRUNLOiB1cmVjcGUgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzCiB9CiAKIHVpbnQzMng0X3QgdGVzdF92cmVjcGVxX3UzMih1aW50MzJ4NF90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92cmVjcGVxX3UzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZyZWNwZXFfdTMyCiAgIHJldHVybiB2cmVjcGVxX3UzMihhKTsKICAgLy8gQ0hFQ0s6IHVyZWNwZSB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92c3FydF9mMzIoZmxvYXQzMngyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZzcXJ0X2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZzcXJ0X2YzMgogICByZXR1cm4gdnNxcnRfZjMyKGEpOwogICAvLyBDSEVDSzogZnNxcnQgdnt7WzAtOV0rfX0uMnMsIHZ7e1swLTldK319LjJzCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnNxcnRxX2YzMihmbG9hdDMyeDRfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdnNxcnRxX2YzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZzcXJ0cV9mMzIKICAgcmV0dXJuIHZzcXJ0cV9mMzIoYSk7CiAgIC8vIENIRUNLOiBmc3FydCB2e3tbMC05XSt9fS40cywgdnt7WzAtOV0rfX0uNHMKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92c3FydHFfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92c3FydHFfZjY0CisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdnNxcnRxX2Y2NAogICByZXR1cm4gdnNxcnRxX2Y2NChhKTsKICAgLy8gQ0hFQ0s6IGZzcXJ0IHZ7e1swLTldK319LjJkLCB2e3tbMC05XSt9fS4yZAogfQogCiBmbG9hdDMyeDJfdCB0ZXN0X3ZjdnRfZjMyX3MzMihpbnQzMngyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRfZjMyX3MzMgorICAvL0NIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRfZjMyX3MzMgogICByZXR1cm4gdmN2dF9mMzJfczMyKGEpOwogICAvL0NIRUNLOiBzY3Z0ZiB2e3tbMC05XSt9fS4ycywgdnt7WzAtOV0rfX0uMnMKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92Y3Z0X2YzMl91MzIodWludDMyeDJfdCBhKSB7Ci0gIC8vQ0hFQ0s6IHRlc3RfdmN2dF9mMzJfdTMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dF9mMzJfdTMyCiAgIHJldHVybiB2Y3Z0X2YzMl91MzIoYSk7CiAgIC8vQ0hFQ0s6IHVjdnRmIHZ7e1swLTldK319LjJzLCB2e3tbMC05XSt9fS4ycwogfQogCiBmbG9hdDMyeDRfdCB0ZXN0X3ZjdnRxX2YzMl9zMzIoaW50MzJ4NF90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0cV9mMzJfczMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dHFfZjMyX3MzMgogICByZXR1cm4gdmN2dHFfZjMyX3MzMihhKTsKICAgLy9DSEVDSzogc2N2dGYgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzCiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdmN2dHFfZjMyX3UzMih1aW50MzJ4NF90IGEpIHsKLSAgLy9DSEVDSzogdGVzdF92Y3Z0cV9mMzJfdTMyCisgIC8vQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dHFfZjMyX3UzMgogICByZXR1cm4gdmN2dHFfZjMyX3UzMihhKTsKICAgLy9DSEVDSzogdWN2dGYgdnt7WzAtOV0rfX0uNHMsIHZ7e1swLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdmN2dHFfZjY0X3M2NChpbnQ2NHgyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRxX2Y2NF9zNjQKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0cV9mNjRfczY0CiAgIHJldHVybiB2Y3Z0cV9mNjRfczY0KGEpOwogICAvL0NIRUNLOiBzY3Z0ZiB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQKIH0KIAogZmxvYXQ2NHgyX3QgdGVzdF92Y3Z0cV9mNjRfdTY0KHVpbnQ2NHgyX3QgYSkgewotICAvL0NIRUNLOiB0ZXN0X3ZjdnRxX2Y2NF91NjQKKyAgLy9DSEVDSy1MQUJFTDogdGVzdF92Y3Z0cV9mNjRfdTY0CiAgIHJldHVybiB2Y3Z0cV9mNjRfdTY0KGEpOwogICAvL0NIRUNLOiB1Y3Z0ZiB2e3tbMC05XSt9fS4yZCwgdnt7WzAtOV0rfX0uMmQKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tcGVybS5jIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1wZXJtLmMKaW5kZXggOTAzNTcwYi4uYzlhM2Q2MCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1wZXJtLmMKKysrIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1wZXJtLmMKQEAgLTEsMTA5MiArMSwxMDk0IEBACiAvLyBSRVFVSVJFUzogYWFyY2g2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCiAvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1ub25lLWxpbnV4LWdudSBcCisvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIC8vIFRlc3QgbmV3IGFhcmNoNjQgaW50cmluc2ljcyBhbmQgdHlwZXMKLQogI2luY2x1ZGUgPGFybV9uZW9uLmg+CiAKIGludDh4OF90IHRlc3RfdnV6cDFfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMV9zOAogICByZXR1cm4gdnV6cDFfczgoYSwgYik7CiAgIC8vIENIRUNLOiB1enAxIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92dXpwMXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAxcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMXFfczgKICAgcmV0dXJuIHZ1enAxcV9zOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnV6cDFfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDFfczE2CiAgIHJldHVybiB2dXpwMV9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB1enAxIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQxNng4X3QgdGVzdF92dXpwMXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enAxcV9zMTYKICAgcmV0dXJuIHZ1enAxcV9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB1enAxIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQzMngyX3QgdGVzdF92dXpwMV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMV9zMzIKICAgcmV0dXJuIHZ1enAxX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzFdLCB7e3ZbMC05XSt9fS5zWzBdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzFcXSwgdlswLTldKy5zXFswXF18emlwMSB2MC4ycywgdjAuMnMsIHYxLjJzfX0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnV6cDFxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDFxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMXFfczMyCiAgIHJldHVybiB2dXpwMXFfczMyKGEsIGIpOwogICAvLyBDSEVDSzogdXpwMSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnV6cDFxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDFxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMXFfczY0CiAgIHJldHVybiB2dXpwMXFfczY0KGEsIGIpOwotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmRbMV0sIHt7dlswLTldK319LmRbMF0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuZFxbMVxdLCB2WzAtOV0rLmRcWzBcXXx6aXAxIHYwLjJkLCB2MC4yZCwgdjEuMmR9fQogfQogCiB1aW50OHg4X3QgdGVzdF92dXpwMV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDFfdTgKICAgcmV0dXJuIHZ1enAxX3U4KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDh4MTZfdCB0ZXN0X3Z1enAxcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMXFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDFxX3U4CiAgIHJldHVybiB2dXpwMXFfdTgoYSwgYik7CiAgIC8vIENIRUNLOiB1enAxIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92dXpwMV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enAxX3UxNgogICByZXR1cm4gdnV6cDFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDE2eDhfdCB0ZXN0X3Z1enAxcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDFxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMXFfdTE2CiAgIHJldHVybiB2dXpwMXFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3Z1enAxX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDFfdTMyCiAgIHJldHVybiB2dXpwMV91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t2WzAtOV0rfX0uc1swXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFsxXF0sIHZbMC05XSsuc1xbMFxdfHppcDEgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92dXpwMXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAxcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDFxX3UzMgogICByZXR1cm4gdnV6cDFxX3UzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92dXpwMXFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAxcV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDFxX3U2NAogICByZXR1cm4gdnV6cDFxX3U2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzFcXSwgdlswLTldKy5kXFswXF18emlwMSB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92dXpwMV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDFfZjMyCiAgIHJldHVybiB2dXpwMV9mMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t2WzAtOV0rfX0uc1swXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFsxXF0sIHZbMC05XSsuc1xbMFxdfHppcDEgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnV6cDFxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAxcV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDFxX2YzMgogICByZXR1cm4gdnV6cDFxX2YzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdnV6cDFxX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAxcV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDFxX2Y2NAogICByZXR1cm4gdnV6cDFxX2Y2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzFcXSwgdlswLTldKy5kXFswXF18emlwMSB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogcG9seTh4OF90IHRlc3RfdnV6cDFfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enAxX3A4CiAgIHJldHVybiB2dXpwMV9wOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDE2X3QgdGVzdF92dXpwMXFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDFxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enAxcV9wOAogICByZXR1cm4gdnV6cDFxX3A4KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMSB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBwb2x5MTZ4NF90IHRlc3RfdnV6cDFfcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAxX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMV9wMTYKICAgcmV0dXJuIHZ1enAxX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHBvbHkxNng4X3QgdGVzdF92dXpwMXFfcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAxcV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDFxX3AxNgogICByZXR1cm4gdnV6cDFxX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDh4OF90IHRlc3RfdnV6cDJfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMl9zOAogICByZXR1cm4gdnV6cDJfczgoYSwgYik7CiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92dXpwMnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAycV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMnFfczgKICAgcmV0dXJuIHZ1enAycV9zOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnV6cDJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDJfczE2CiAgIHJldHVybiB2dXpwMl9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQxNng4X3QgdGVzdF92dXpwMnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMnFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enAycV9zMTYKICAgcmV0dXJuIHZ1enAycV9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQzMngyX3QgdGVzdF92dXpwMl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAyX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMl9zMzIKICAgcmV0dXJuIHZ1enAyX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzBdLCB7e3ZbMC05XSt9fS5zWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzBcXSwgdlswLTldKy5zXFsxXF18emlwMiB2MC4ycywgdjAuMnMsIHYxLjJzfX0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnV6cDJxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDJxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMnFfczMyCiAgIHJldHVybiB2dXpwMnFfczMyKGEsIGIpOwogICAvLyBDSEVDSzogdXpwMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnV6cDJxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDJxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMnFfczY0CiAgIHJldHVybiB2dXpwMnFfczY0KGEsIGIpOwotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmRbMF0sIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuZFxbMFxdLCB2WzAtOV0rLmRcWzFcXXx6aXAyIHYwLjJkLCB2MC4yZCwgdjEuMmR9fQogfQogCiB1aW50OHg4X3QgdGVzdF92dXpwMl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDJfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDJfdTgKICAgcmV0dXJuIHZ1enAyX3U4KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDh4MTZfdCB0ZXN0X3Z1enAycV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMnFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDJxX3U4CiAgIHJldHVybiB2dXpwMnFfdTgoYSwgYik7CiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92dXpwMl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDJfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enAyX3UxNgogICByZXR1cm4gdnV6cDJfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDE2eDhfdCB0ZXN0X3Z1enAycV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDJxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMnFfdTE2CiAgIHJldHVybiB2dXpwMnFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3Z1enAyX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDJfdTMyCiAgIHJldHVybiB2dXpwMl91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFswXF0sIHZbMC05XSsuc1xbMVxdfHppcDIgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92dXpwMnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAycV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDJxX3UzMgogICByZXR1cm4gdnV6cDJxX3UzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92dXpwMnFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAycV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDJxX3U2NAogICByZXR1cm4gdnV6cDJxX3U2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzBdLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzBcXSwgdlswLTldKy5kXFsxXF18emlwMiB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92dXpwMl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDJfZjMyCiAgIHJldHVybiB2dXpwMl9mMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFswXF0sIHZbMC05XSsuc1xbMVxdfHppcDIgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnV6cDJxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAycV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDJxX2YzMgogICByZXR1cm4gdnV6cDJxX2YzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdnV6cDJxX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAycV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDJxX2Y2NAogICByZXR1cm4gdnV6cDJxX2Y2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzBdLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzBcXSwgdlswLTldKy5kXFsxXF18emlwMiB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogcG9seTh4OF90IHRlc3RfdnV6cDJfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAyX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enAyX3A4CiAgIHJldHVybiB2dXpwMl9wOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDE2X3QgdGVzdF92dXpwMnFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDJxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enAycV9wOAogICByZXR1cm4gdnV6cDJxX3A4KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBwb2x5MTZ4NF90IHRlc3RfdnV6cDJfcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAyX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMl9wMTYKICAgcmV0dXJuIHZ1enAyX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDIge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHBvbHkxNng4X3QgdGVzdF92dXpwMnFfcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enAycV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cDJxX3AxNgogICByZXR1cm4gdnV6cDJxX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDh4OF90IHRlc3RfdnppcDFfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMV9zOAogICByZXR1cm4gdnppcDFfczgoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92emlwMXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAxcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMXFfczgKICAgcmV0dXJuIHZ6aXAxcV9zOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDEge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnppcDFfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDFfczE2CiAgIHJldHVybiB2emlwMV9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQxNng4X3QgdGVzdF92emlwMXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXAxcV9zMTYKICAgcmV0dXJuIHZ6aXAxcV9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQzMngyX3QgdGVzdF92emlwMV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMV9zMzIKICAgcmV0dXJuIHZ6aXAxX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzFdLCB7e3ZbMC05XSt9fS5zWzBdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzFcXSwgdlswLTldKy5zXFswXF18emlwMSB2MC4ycywgdjAuMnMsIHYxLjJzfX0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnppcDFxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDFxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMXFfczMyCiAgIHJldHVybiB2emlwMXFfczMyKGEsIGIpOwogICAvLyBDSEVDSzogemlwMSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnppcDFxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDFxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMXFfczY0CiAgIHJldHVybiB2emlwMXFfczY0KGEsIGIpOwotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmRbMV0sIHt7dlswLTldK319LmRbMF0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuZFxbMVxdLCB2WzAtOV0rLmRcWzBcXXx6aXAxIHYwLjJkLCB2MC4yZCwgdjEuMmR9fQogfQogCiB1aW50OHg4X3QgdGVzdF92emlwMV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDFfdTgKICAgcmV0dXJuIHZ6aXAxX3U4KGEsIGIpOwogICAvLyBDSEVDSzogemlwMSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDh4MTZfdCB0ZXN0X3Z6aXAxcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMXFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDFxX3U4CiAgIHJldHVybiB2emlwMXFfdTgoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92emlwMV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXAxX3UxNgogICByZXR1cm4gdnppcDFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogemlwMSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDE2eDhfdCB0ZXN0X3Z6aXAxcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDFxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMXFfdTE2CiAgIHJldHVybiB2emlwMXFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogemlwMSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3Z6aXAxX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDFfdTMyCiAgIHJldHVybiB2emlwMV91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t2WzAtOV0rfX0uc1swXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFsxXF0sIHZbMC05XSsuc1xbMFxdfHppcDEgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92emlwMXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAxcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDFxX3UzMgogICByZXR1cm4gdnppcDFxX3UzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92emlwMXFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAxcV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDFxX3U2NAogICByZXR1cm4gdnppcDFxX3U2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzFcXSwgdlswLTldKy5kXFswXF18emlwMSB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92emlwMV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDFfZjMyCiAgIHJldHVybiB2emlwMV9mMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t2WzAtOV0rfX0uc1swXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFsxXF0sIHZbMC05XSsuc1xbMFxdfHppcDEgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnppcDFxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAxcV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDFxX2YzMgogICByZXR1cm4gdnppcDFxX2YzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdnppcDFxX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAxcV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDFxX2Y2NAogICByZXR1cm4gdnppcDFxX2Y2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzFcXSwgdlswLTldKy5kXFswXF18emlwMSB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogcG9seTh4OF90IHRlc3RfdnppcDFfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXAxX3A4CiAgIHJldHVybiB2emlwMV9wOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDEge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDE2X3QgdGVzdF92emlwMXFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDFxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXAxcV9wOAogICByZXR1cm4gdnppcDFxX3A4KGEsIGIpOwogICAvLyBDSEVDSzogemlwMSB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBwb2x5MTZ4NF90IHRlc3RfdnppcDFfcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAxX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMV9wMTYKICAgcmV0dXJuIHZ6aXAxX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHBvbHkxNng4X3QgdGVzdF92emlwMXFfcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAxcV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDFxX3AxNgogICByZXR1cm4gdnppcDFxX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDEge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDh4OF90IHRlc3RfdnppcDJfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMl9zOAogICByZXR1cm4gdnppcDJfczgoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAyIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92emlwMnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAycV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMnFfczgKICAgcmV0dXJuIHZ6aXAycV9zOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnppcDJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDJfczE2CiAgIHJldHVybiB2emlwMl9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAyIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQxNng4X3QgdGVzdF92emlwMnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMnFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXAycV9zMTYKICAgcmV0dXJuIHZ6aXAycV9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQzMngyX3QgdGVzdF92emlwMl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAyX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMl9zMzIKICAgcmV0dXJuIHZ6aXAyX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzBdLCB7e3ZbMC05XSt9fS5zWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzBcXSwgdlswLTldKy5zXFsxXF18emlwMiB2MC4ycywgdjAuMnMsIHYxLjJzfX0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnppcDJxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDJxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMnFfczMyCiAgIHJldHVybiB2emlwMnFfczMyKGEsIGIpOwogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnppcDJxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDJxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMnFfczY0CiAgIHJldHVybiB2emlwMnFfczY0KGEsIGIpOwotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmRbMF0sIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuZFxbMFxdLCB2WzAtOV0rLmRcWzFcXXx6aXAyIHYwLjJkLCB2MC4yZCwgdjEuMmR9fQogfQogCiB1aW50OHg4X3QgdGVzdF92emlwMl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDJfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDJfdTgKICAgcmV0dXJuIHZ6aXAyX3U4KGEsIGIpOwogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDh4MTZfdCB0ZXN0X3Z6aXAycV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMnFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDJxX3U4CiAgIHJldHVybiB2emlwMnFfdTgoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAyIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92emlwMl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDJfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXAyX3UxNgogICByZXR1cm4gdnppcDJfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDE2eDhfdCB0ZXN0X3Z6aXAycV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDJxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMnFfdTE2CiAgIHJldHVybiB2emlwMnFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3Z6aXAyX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDJfdTMyCiAgIHJldHVybiB2emlwMl91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFswXF0sIHZbMC05XSsuc1xbMVxdfHppcDIgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92emlwMnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAycV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDJxX3UzMgogICByZXR1cm4gdnppcDJxX3UzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92emlwMnFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAycV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDJxX3U2NAogICByZXR1cm4gdnppcDJxX3U2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzBdLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzBcXSwgdlswLTldKy5kXFsxXF18emlwMiB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92emlwMl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDJfZjMyCiAgIHJldHVybiB2emlwMl9mMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFswXF0sIHZbMC05XSsuc1xbMVxdfHppcDIgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnppcDJxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAycV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDJxX2YzMgogICByZXR1cm4gdnppcDJxX2YzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdnppcDJxX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAycV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDJxX2Y2NAogICByZXR1cm4gdnppcDJxX2Y2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzBdLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzBcXSwgdlswLTldKy5kXFsxXF18emlwMiB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogcG9seTh4OF90IHRlc3RfdnppcDJfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAyX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXAyX3A4CiAgIHJldHVybiB2emlwMl9wOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDE2X3QgdGVzdF92emlwMnFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcDJxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXAycV9wOAogICByZXR1cm4gdnppcDJxX3A4KGEsIGIpOwogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBwb2x5MTZ4NF90IHRlc3RfdnppcDJfcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAyX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwMl9wMTYKICAgcmV0dXJuIHZ6aXAyX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDIge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHBvbHkxNng4X3QgdGVzdF92emlwMnFfcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAycV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDJxX3AxNgogICByZXR1cm4gdnppcDJxX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDh4OF90IHRlc3RfdnRybjFfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMV9zOAogICByZXR1cm4gdnRybjFfczgoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4xIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92dHJuMXFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4xcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMXFfczgKICAgcmV0dXJuIHZ0cm4xcV9zOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjEge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnRybjFfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjFfczE2CiAgIHJldHVybiB2dHJuMV9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4xIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQxNng4X3QgdGVzdF92dHJuMXFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMXFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm4xcV9zMTYKICAgcmV0dXJuIHZ0cm4xcV9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4xIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQzMngyX3QgdGVzdF92dHJuMV9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4xX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMV9zMzIKICAgcmV0dXJuIHZ0cm4xX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzFdLCB7e3ZbMC05XSt9fS5zWzBdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzFcXSwgdlswLTldKy5zXFswXF18emlwMSB2MC4ycywgdjAuMnMsIHYxLjJzfX0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnRybjFxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjFxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMXFfczMyCiAgIHJldHVybiB2dHJuMXFfczMyKGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnRybjFxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjFxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMXFfczY0CiAgIHJldHVybiB2dHJuMXFfczY0KGEsIGIpOwotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmRbMV0sIHt7dlswLTldK319LmRbMF0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuZFxbMVxdLCB2WzAtOV0rLmRcWzBcXXx6aXAxIHYwLjJkLCB2MC4yZCwgdjEuMmR9fQogfQogCiB1aW50OHg4X3QgdGVzdF92dHJuMV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjFfdTgKICAgcmV0dXJuIHZ0cm4xX3U4KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDh4MTZfdCB0ZXN0X3Z0cm4xcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMXFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjFxX3U4CiAgIHJldHVybiB2dHJuMXFfdTgoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4xIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92dHJuMV91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm4xX3UxNgogICByZXR1cm4gdnRybjFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDE2eDhfdCB0ZXN0X3Z0cm4xcV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjFxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMXFfdTE2CiAgIHJldHVybiB2dHJuMXFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3Z0cm4xX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjFfdTMyCiAgIHJldHVybiB2dHJuMV91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t2WzAtOV0rfX0uc1swXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFsxXF0sIHZbMC05XSsuc1xbMFxdfHppcDEgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92dHJuMXFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4xcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjFxX3UzMgogICByZXR1cm4gdnRybjFxX3UzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92dHJuMXFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4xcV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjFxX3U2NAogICByZXR1cm4gdnRybjFxX3U2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzFcXSwgdlswLTldKy5kXFswXF18emlwMSB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92dHJuMV9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjFfZjMyCiAgIHJldHVybiB2dHJuMV9mMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t2WzAtOV0rfX0uc1swXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFsxXF0sIHZbMC05XSsuc1xbMFxdfHppcDEgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnRybjFxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4xcV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjFxX2YzMgogICByZXR1cm4gdnRybjFxX2YzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdnRybjFxX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4xcV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjFxX2Y2NAogICByZXR1cm4gdnRybjFxX2Y2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzFcXSwgdlswLTldKy5kXFswXF18emlwMSB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogcG9seTh4OF90IHRlc3RfdnRybjFfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4xX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm4xX3A4CiAgIHJldHVybiB2dHJuMV9wOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjEge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDE2X3QgdGVzdF92dHJuMXFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjFxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm4xcV9wOAogICByZXR1cm4gdnRybjFxX3A4KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBwb2x5MTZ4NF90IHRlc3RfdnRybjFfcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4xX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMV9wMTYKICAgcmV0dXJuIHZ0cm4xX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHBvbHkxNng4X3QgdGVzdF92dHJuMXFfcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4xcV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjFxX3AxNgogICByZXR1cm4gdnRybjFxX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjEge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDh4OF90IHRlc3RfdnRybjJfczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMl9zOAogICByZXR1cm4gdnRybjJfczgoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4yIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92dHJuMnFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4ycV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMnFfczgKICAgcmV0dXJuIHZ0cm4ycV9zOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50MTZ4NF90IHRlc3RfdnRybjJfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjJfczE2CiAgIHJldHVybiB2dHJuMl9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4yIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogCiBpbnQxNng4X3QgdGVzdF92dHJuMnFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMnFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm4ycV9zMTYKICAgcmV0dXJuIHZ0cm4ycV9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4yIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQzMngyX3QgdGVzdF92dHJuMl9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4yX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMl9zMzIKICAgcmV0dXJuIHZ0cm4yX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzBdLCB7e3ZbMC05XSt9fS5zWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzBcXSwgdlswLTldKy5zXFsxXF18emlwMiB2MC4ycywgdjAuMnMsIHYxLjJzfX0KIH0KIAogaW50MzJ4NF90IHRlc3RfdnRybjJxX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjJxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMnFfczMyCiAgIHJldHVybiB2dHJuMnFfczMyKGEsIGIpOwogICAvLyBDSEVDSzogdHJuMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIAogaW50NjR4Ml90IHRlc3RfdnRybjJxX3M2NChpbnQ2NHgyX3QgYSwgaW50NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjJxX3M2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMnFfczY0CiAgIHJldHVybiB2dHJuMnFfczY0KGEsIGIpOwotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmRbMF0sIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuZFxbMFxdLCB2WzAtOV0rLmRcWzFcXXx6aXAyIHYwLjJkLCB2MC4yZCwgdjEuMmR9fQogfQogCiB1aW50OHg4X3QgdGVzdF92dHJuMl91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjJfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjJfdTgKICAgcmV0dXJuIHZ0cm4yX3U4KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDh4MTZfdCB0ZXN0X3Z0cm4ycV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMnFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjJxX3U4CiAgIHJldHVybiB2dHJuMnFfdTgoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQxNng0X3QgdGVzdF92dHJuMl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjJfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm4yX3UxNgogICByZXR1cm4gdnRybjJfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIAogdWludDE2eDhfdCB0ZXN0X3Z0cm4ycV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjJxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMnFfdTE2CiAgIHJldHVybiB2dHJuMnFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogdWludDMyeDJfdCB0ZXN0X3Z0cm4yX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMl91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjJfdTMyCiAgIHJldHVybiB2dHJuMl91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFswXF0sIHZbMC05XSsuc1xbMVxdfHppcDIgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIHVpbnQzMng0X3QgdGVzdF92dHJuMnFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4ycV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjJxX3UzMgogICByZXR1cm4gdnRybjJxX3UzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIHVpbnQ2NHgyX3QgdGVzdF92dHJuMnFfdTY0KHVpbnQ2NHgyX3QgYSwgdWludDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4ycV91NjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjJxX3U2NAogICByZXR1cm4gdnRybjJxX3U2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzBdLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzBcXSwgdlswLTldKy5kXFsxXF18emlwMiB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogZmxvYXQzMngyX3QgdGVzdF92dHJuMl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuMl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjJfZjMyCiAgIHJldHVybiB2dHJuMl9mMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFswXF0sIHZbMC05XSsuc1xbMVxdfHppcDIgdjAuMnMsIHYwLjJzLCB2MS4yc319CiB9CiAKIGZsb2F0MzJ4NF90IHRlc3RfdnRybjJxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4ycV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjJxX2YzMgogICByZXR1cm4gdnRybjJxX2YzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiAKIGZsb2F0NjR4Ml90IHRlc3RfdnRybjJxX2Y2NChmbG9hdDY0eDJfdCBhLCBmbG9hdDY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4ycV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjJxX2Y2NAogICByZXR1cm4gdnRybjJxX2Y2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzBdLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLmRcWzBcXSwgdlswLTldKy5kXFsxXF18emlwMiB2MC4yZCwgdjAuMmQsIHYxLjJkfX0KIH0KIAogcG9seTh4OF90IHRlc3RfdnRybjJfcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4yX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm4yX3A4CiAgIHJldHVybiB2dHJuMl9wOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDE2X3QgdGVzdF92dHJuMnFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjJxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm4ycV9wOAogICByZXR1cm4gdnRybjJxX3A4KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogCiBwb2x5MTZ4NF90IHRlc3RfdnRybjJfcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4yX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMl9wMTYKICAgcmV0dXJuIHZ0cm4yX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiAKIHBvbHkxNng4X3QgdGVzdF92dHJuMnFfcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4ycV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjJxX3AxNgogICByZXR1cm4gdnRybjJxX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiAKIGludDh4OHgyX3QgdGVzdF92dXpwX3M4KGludDh4OF90IGEsIGludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cF9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwX3M4CiAgIHJldHVybiB2dXpwX3M4KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKICAgLy8gQ0hFQ0s6IHV6cDIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIGludDE2eDR4Ml90IHRlc3RfdnV6cF9zMTYoaW50MTZ4NF90IGEsIGludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enBfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enBfczE2CiAgIHJldHVybiB2dXpwX3MxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogaW50MzJ4MngyX3QgdGVzdF92dXpwX3MzMihpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cF9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cF9zMzIKICAgcmV0dXJuIHZ1enBfczMyKGEsIGIpOwotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LnNbMV0sIHt7dlswLTldK319LnNbMF0KLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzBdLCB7e3ZbMC05XSt9fS5zWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzFcXSwgdlswLTldKy5zXFswXF18emlwMSB2Mi4ycywgdjAuMnMsIHYxLjJzfX0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuc1xbMFxdLCB2WzAtOV0rLnNcWzFcXXx6aXAyIHYxLjJzLCB2MC4ycywgdjEuMnN9fQogfQogdWludDh4OHgyX3QgdGVzdF92dXpwX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enBfdTgKICAgcmV0dXJuIHZ1enBfdTgoYSwgYik7CiAgIC8vIENIRUNLOiB1enAxIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogICAvLyBDSEVDSzogdXpwMiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIHVpbnQxNng0eDJfdCB0ZXN0X3Z1enBfdTE2KHVpbnQxNng0X3QgYSwgdWludDE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enBfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enBfdTE2CiAgIHJldHVybiB2dXpwX3UxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogdWludDMyeDJ4Ml90IHRlc3RfdnV6cF91MzIodWludDMyeDJfdCBhLCB1aW50MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cF91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cF91MzIKICAgcmV0dXJuIHZ1enBfdTMyKGEsIGIpOwotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LnNbMV0sIHt7dlswLTldK319LnNbMF0KLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzBdLCB7e3ZbMC05XSt9fS5zWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzFcXSwgdlswLTldKy5zXFswXF18emlwMSB2Mi4ycywgdjAuMnMsIHYxLjJzfX0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuc1xbMFxdLCB2WzAtOV0rLnNcWzFcXXx6aXAyIHYxLjJzLCB2MC4ycywgdjEuMnN9fQogfQogZmxvYXQzMngyeDJfdCB0ZXN0X3Z1enBfZjMyKGZsb2F0MzJ4Ml90IGEsIGZsb2F0MzJ4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cF9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cF9mMzIKICAgcmV0dXJuIHZ1enBfZjMyKGEsIGIpOwotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LnNbMV0sIHt7dlswLTldK319LnNbMF0KLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzBdLCB7e3ZbMC05XSt9fS5zWzFdCisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzFcXSwgdlswLTldKy5zXFswXF18emlwMSB2Mi4ycywgdjAuMnMsIHYxLjJzfX0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuc1xbMFxdLCB2WzAtOV0rLnNcWzFcXXx6aXAyIHYxLjJzLCB2MC4ycywgdjEuMnN9fQogfQogcG9seTh4OHgyX3QgdGVzdF92dXpwX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enBfcDgKICAgcmV0dXJuIHZ1enBfcDgoYSwgYik7CiAgIC8vIENIRUNLOiB1enAxIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogICAvLyBDSEVDSzogdXpwMiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIHBvbHkxNng0eDJfdCB0ZXN0X3Z1enBfcDE2KHBvbHkxNng0X3QgYSwgcG9seTE2eDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enBfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enBfcDE2CiAgIHJldHVybiB2dXpwX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogfQogaW50OHgxNngyX3QgdGVzdF92dXpwcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cHFfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cHFfczgKICAgcmV0dXJuIHZ1enBxX3M4KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMSB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogICAvLyBDSEVDSzogdXpwMiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogaW50MTZ4OHgyX3QgdGVzdF92dXpwcV9zMTYoaW50MTZ4OF90IGEsIGludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enBxX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwcV9zMTYKICAgcmV0dXJuIHZ1enBxX3MxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogaW50MzJ4NHgyX3QgdGVzdF92dXpwcV9zMzIoaW50MzJ4NF90IGEsIGludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enBxX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwcV9zMzIKICAgcmV0dXJuIHZ1enBxX3MzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogdWludDh4MTZ4Ml90IHRlc3RfdnV6cHFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cHFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cHFfdTgKICAgcmV0dXJuIHZ1enBxX3U4KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMSB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogICAvLyBDSEVDSzogdXpwMiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogdWludDE2eDh4Ml90IHRlc3RfdnV6cHFfdTE2KHVpbnQxNng4X3QgYSwgdWludDE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enBxX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwcV91MTYKICAgcmV0dXJuIHZ1enBxX3UxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogdWludDMyeDR4Ml90IHRlc3RfdnV6cHFfdTMyKHVpbnQzMng0X3QgYSwgdWludDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enBxX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwcV91MzIKICAgcmV0dXJuIHZ1enBxX3UzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogZmxvYXQzMng0eDJfdCB0ZXN0X3Z1enBxX2YzMihmbG9hdDMyeDRfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enBxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwcV9mMzIKICAgcmV0dXJuIHZ1enBxX2YzMihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogfQogcG9seTh4MTZ4Ml90IHRlc3RfdnV6cHFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cHFfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnV6cHFfcDgKICAgcmV0dXJuIHZ1enBxX3A4KGEsIGIpOwogICAvLyBDSEVDSzogdXpwMSB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogICAvLyBDSEVDSzogdXpwMiB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2YgogfQogcG9seTE2eDh4Ml90IHRlc3RfdnV6cHFfcDE2KHBvbHkxNng4X3QgYSwgcG9seTE2eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z1enBxX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwcV9wMTYKICAgcmV0dXJuIHZ1enBxX3AxNihhLCBiKTsKICAgLy8gQ0hFQ0s6IHV6cDEge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiAgIC8vIENIRUNLOiB1enAyIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogfQogCiBpbnQ4eDh4Ml90IHRlc3RfdnppcF9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXBfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcF9zOAogICByZXR1cm4gdnppcF9zOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDEge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiAgIC8vIENIRUNLOiB6aXAyIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQxNng0eDJfdCB0ZXN0X3Z6aXBfczE2KGludDE2eDRfdCBhLCBpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwX3MxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwX3MxNgogICByZXR1cm4gdnppcF9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIGludDMyeDJ4Ml90IHRlc3RfdnppcF9zMzIoaW50MzJ4Ml90IGEsIGludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXBfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXBfczMyCiAgIHJldHVybiB2emlwX3MzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzFdLCB7e3ZbMC05XSt9fS5zWzBdCi0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFsxXF0sIHZbMC05XSsuc1xbMFxdfHppcDEgdjIuMnMsIHYwLjJzLCB2MS4yc319CisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzBcXSwgdlswLTldKy5zXFsxXF18emlwMiB2MS4ycywgdjAuMnMsIHYxLjJzfX0KIH0KIHVpbnQ4eDh4Ml90IHRlc3RfdnppcF91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwX3U4CiAgIHJldHVybiB2emlwX3U4KGEsIGIpOwogICAvLyBDSEVDSzogemlwMSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKICAgLy8gQ0hFQ0s6IHppcDIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiB1aW50MTZ4NHgyX3QgdGVzdF92emlwX3UxNih1aW50MTZ4NF90IGEsIHVpbnQxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwX3UxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwX3UxNgogICByZXR1cm4gdnppcF91MTYoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIHVpbnQzMngyeDJfdCB0ZXN0X3Z6aXBfdTMyKHVpbnQzMngyX3QgYSwgdWludDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXBfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXBfdTMyCiAgIHJldHVybiB2emlwX3UzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzFdLCB7e3ZbMC05XSt9fS5zWzBdCi0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFsxXF0sIHZbMC05XSsuc1xbMFxdfHppcDEgdjIuMnMsIHYwLjJzLCB2MS4yc319CisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzBcXSwgdlswLTldKy5zXFsxXF18emlwMiB2MS4ycywgdjAuMnMsIHYxLjJzfX0KIH0KIGZsb2F0MzJ4MngyX3QgdGVzdF92emlwX2YzMihmbG9hdDMyeDJfdCBhLCBmbG9hdDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXBfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXBfZjMyCiAgIHJldHVybiB2emlwX2YzMihhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5zWzFdLCB7e3ZbMC05XSt9fS5zWzBdCi0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1swXSwge3t2WzAtOV0rfX0uc1sxXQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFsxXF0sIHZbMC05XSsuc1xbMFxdfHppcDEgdjIuMnMsIHYwLjJzLCB2MS4yc319CisgIC8vIENIRUNLOiB7e2lucyB2WzAtOV0rLnNcWzBcXSwgdlswLTldKy5zXFsxXF18emlwMiB2MS4ycywgdjAuMnMsIHYxLjJzfX0KIH0KIHBvbHk4eDh4Ml90IHRlc3RfdnppcF9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnppcF9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwX3A4CiAgIHJldHVybiB2emlwX3A4KGEsIGIpOwogICAvLyBDSEVDSzogemlwMSB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKICAgLy8gQ0hFQ0s6IHppcDIge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiBwb2x5MTZ4NHgyX3QgdGVzdF92emlwX3AxNihwb2x5MTZ4NF90IGEsIHBvbHkxNng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwX3AxNgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92emlwX3AxNgogICByZXR1cm4gdnppcF9wMTYoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjRoLCB7e3ZbMC05XSt9fS40aAogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKIH0KIGludDh4MTZ4Ml90IHRlc3RfdnppcHFfczgoaW50OHgxNl90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXBxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXBxX3M4CiAgIHJldHVybiB2emlwcV9zOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDEge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKICAgLy8gQ0hFQ0s6IHppcDIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIGludDE2eDh4Ml90IHRlc3RfdnppcHFfczE2KGludDE2eDhfdCBhLCBpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwcV9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcHFfczE2CiAgIHJldHVybiB2emlwcV9zMTYoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIGludDMyeDR4Ml90IHRlc3RfdnppcHFfczMyKGludDMyeDRfdCBhLCBpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwcV9zMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcHFfczMyCiAgIHJldHVybiB2emlwcV9zMzIoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIHVpbnQ4eDE2eDJfdCB0ZXN0X3Z6aXBxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXBxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXBxX3U4CiAgIHJldHVybiB2emlwcV91OChhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDEge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKICAgLy8gQ0hFQ0s6IHppcDIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIHVpbnQxNng4eDJfdCB0ZXN0X3Z6aXBxX3UxNih1aW50MTZ4OF90IGEsIHVpbnQxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwcV91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcHFfdTE2CiAgIHJldHVybiB2emlwcV91MTYoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIHVpbnQzMng0eDJfdCB0ZXN0X3Z6aXBxX3UzMih1aW50MzJ4NF90IGEsIHVpbnQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwcV91MzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcHFfdTMyCiAgIHJldHVybiB2emlwcV91MzIoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIGZsb2F0MzJ4NHgyX3QgdGVzdF92emlwcV9mMzIoZmxvYXQzMng0X3QgYSwgZmxvYXQzMng0X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwcV9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcHFfZjMyCiAgIHJldHVybiB2emlwcV9mMzIoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjRzLCB7e3ZbMC05XSt9fS40cwogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKIH0KIHBvbHk4eDE2eDJfdCB0ZXN0X3Z6aXBxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXBxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXBxX3A4CiAgIHJldHVybiB2emlwcV9wOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHppcDEge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKICAgLy8gQ0hFQ0s6IHppcDIge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIKIH0KIHBvbHkxNng4eDJfdCB0ZXN0X3Z6aXBxX3AxNihwb2x5MTZ4OF90IGEsIHBvbHkxNng4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwcV9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcHFfcDE2CiAgIHJldHVybiB2emlwcV9wMTYoYSwgYik7CiAgIC8vIENIRUNLOiB6aXAxIHt7dlswLTldK319LjhoLCB7e3ZbMC05XSt9fS44aAogICAvLyBDSEVDSzogemlwMiB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKIH0KIAogaW50OHg4eDJfdCB0ZXN0X3Z0cm5fczgoaW50OHg4X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm5fczgKICAgcmV0dXJuIHZ0cm5fczgoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4xIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogICAvLyBDSEVDSzogdHJuMiB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50MTZ4NHgyX3QgdGVzdF92dHJuX3MxNihpbnQxNng0X3QgYSwgaW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybl9zMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybl9zMTYKICAgcmV0dXJuIHZ0cm5fczE2KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiBpbnQzMngyeDJfdCB0ZXN0X3Z0cm5fczMyKGludDMyeDJfdCBhLCBpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuX3MzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuX3MzMgogICByZXR1cm4gdnRybl9zMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t2WzAtOV0rfX0uc1swXQotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LnNbMF0sIHt7dlswLTldK319LnNbMV0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuc1xbMVxdLCB2WzAtOV0rLnNcWzBcXXx6aXAxIHYyLjJzLCB2MC4ycywgdjEuMnN9fQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFswXF0sIHZbMC05XSsuc1xbMVxdfHppcDIgdjEuMnMsIHYwLjJzLCB2MS4yc319CiB9CiB1aW50OHg4eDJfdCB0ZXN0X3Z0cm5fdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm5fdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybl91OAogICByZXR1cm4gdnRybl91OChhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjEge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiAgIC8vIENIRUNLOiB0cm4yIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogdWludDE2eDR4Ml90IHRlc3RfdnRybl91MTYodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybl91MTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybl91MTYKICAgcmV0dXJuIHZ0cm5fdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiB1aW50MzJ4MngyX3QgdGVzdF92dHJuX3UzMih1aW50MzJ4Ml90IGEsIHVpbnQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuX3UzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuX3UzMgogICByZXR1cm4gdnRybl91MzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t2WzAtOV0rfX0uc1swXQotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LnNbMF0sIHt7dlswLTldK319LnNbMV0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuc1xbMVxdLCB2WzAtOV0rLnNcWzBcXXx6aXAxIHYyLjJzLCB2MC4ycywgdjEuMnN9fQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFswXF0sIHZbMC05XSsuc1xbMVxdfHppcDIgdjEuMnMsIHYwLjJzLCB2MS4yc319CiB9CiBmbG9hdDMyeDJ4Ml90IHRlc3RfdnRybl9mMzIoZmxvYXQzMngyX3QgYSwgZmxvYXQzMngyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJuX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuX2YzMgogICByZXR1cm4gdnRybl9mMzIoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uc1sxXSwge3t2WzAtOV0rfX0uc1swXQotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LnNbMF0sIHt7dlswLTldK319LnNbMV0KKyAgLy8gQ0hFQ0s6IHt7aW5zIHZbMC05XSsuc1xbMVxdLCB2WzAtOV0rLnNcWzBcXXx6aXAxIHYyLjJzLCB2MC4ycywgdjEuMnN9fQorICAvLyBDSEVDSzoge3tpbnMgdlswLTldKy5zXFswXF0sIHZbMC05XSsuc1xbMVxdfHppcDIgdjEuMnMsIHYwLjJzLCB2MS4yc319CiB9CiBwb2x5OHg4eDJfdCB0ZXN0X3Z0cm5fcDgocG9seTh4OF90IGEsIHBvbHk4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm5fcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybl9wOAogICByZXR1cm4gdnRybl9wOChhLCBiKTsKICAgLy8gQ0hFQ0s6IHRybjEge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiAgIC8vIENIRUNLOiB0cm4yIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogcG9seTE2eDR4Ml90IHRlc3RfdnRybl9wMTYocG9seTE2eDRfdCBhLCBwb2x5MTZ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybl9wMTYKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybl9wMTYKICAgcmV0dXJuIHZ0cm5fcDE2KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS40aCwge3t2WzAtOV0rfX0uNGgKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uNGgsIHt7dlswLTldK319LjRoCiB9CiBpbnQ4eDE2eDJfdCB0ZXN0X3Z0cm5xX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJucV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJucV9zOAogICByZXR1cm4gdnRybnFfczgoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4xIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiAgIC8vIENIRUNLOiB0cm4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiBpbnQxNng4eDJfdCB0ZXN0X3Z0cm5xX3MxNihpbnQxNng4X3QgYSwgaW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybnFfczE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm5xX3MxNgogICByZXR1cm4gdnRybnFfczE2KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiBpbnQzMng0eDJfdCB0ZXN0X3Z0cm5xX3MzMihpbnQzMng0X3QgYSwgaW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybnFfczMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm5xX3MzMgogICByZXR1cm4gdnRybnFfczMyKGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiB1aW50OHgxNngyX3QgdGVzdF92dHJucV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJucV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJucV91OAogICByZXR1cm4gdnRybnFfdTgoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4xIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiAgIC8vIENIRUNLOiB0cm4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiB1aW50MTZ4OHgyX3QgdGVzdF92dHJucV91MTYodWludDE2eDhfdCBhLCB1aW50MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybnFfdTE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm5xX3UxNgogICByZXR1cm4gdnRybnFfdTE2KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCiB9CiB1aW50MzJ4NHgyX3QgdGVzdF92dHJucV91MzIodWludDMyeDRfdCBhLCB1aW50MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybnFfdTMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm5xX3UzMgogICByZXR1cm4gdnRybnFfdTMyKGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiBmbG9hdDMyeDR4Ml90IHRlc3RfdnRybnFfZjMyKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybnFfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm5xX2YzMgogICByZXR1cm4gdnRybnFfZjMyKGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS40cywge3t2WzAtOV0rfX0uNHMKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uNHMsIHt7dlswLTldK319LjRzCiB9CiBwb2x5OHgxNngyX3QgdGVzdF92dHJucV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dHJucV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJucV9wOAogICByZXR1cm4gdnRybnFfcDgoYSwgYik7CiAgIC8vIENIRUNLOiB0cm4xIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiAgIC8vIENIRUNLOiB0cm4yIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiBwb2x5MTZ4OHgyX3QgdGVzdF92dHJucV9wMTYocG9seTE2eDhfdCBhLCBwb2x5MTZ4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybnFfcDE2CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0cm5xX3AxNgogICByZXR1cm4gdnRybnFfcDE2KGEsIGIpOwogICAvLyBDSEVDSzogdHJuMSB7e3ZbMC05XSt9fS44aCwge3t2WzAtOV0rfX0uOGgKICAgLy8gQ0hFQ0s6IHRybjIge3t2WzAtOV0rfX0uOGgsIHt7dlswLTldK319LjhoCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLXNjYWxhci1jb3B5LmMgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLXNjYWxhci1jb3B5LmMKaW5kZXggMzNlOTdjNy4uMjI3YzZlMCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1zY2FsYXItY29weS5jCisrKyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tc2NhbGFyLWNvcHkuYwpAQCAtMSwxMSArMSwxNCBAQAogLy8gUkVRVUlSRVM6IGFhcmNoNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBhcm02NC1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NC1ub25lLWxpbnV4LWdudSAtdGFyZ2V0LWZlYXR1cmUgK25lb24gXAogLy8gUlVOOiAgIC1mZnAtY29udHJhY3Q9ZmFzdCAtUyAtTzMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtbm9uZS1saW51eC1nbnUgXAorLy8gUlVOOiAgIC1mZnAtY29udHJhY3Q9ZmFzdCAtUyAtTzMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiAKICNpbmNsdWRlIDxhcm1fbmVvbi5oPgogCi0vLyBDSEVDSzogdGVzdF92ZHVwc19sYW5lX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHNfbGFuZV9mMzIKIGZsb2F0MzJfdCB0ZXN0X3ZkdXBzX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKICAgcmV0dXJuIHZkdXBzX2xhbmVfZjMyKGEsIDEpOwogLy8gQ0hFQ0s6IHJldApAQCAtMTMsNyArMTYsNyBAQAogfQogCiAKLS8vIENIRUNLOiB0ZXN0X3ZkdXBkX2xhbmVfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwZF9sYW5lX2Y2NAogZmxvYXQ2NF90IHRlc3RfdmR1cGRfbGFuZV9mNjQoZmxvYXQ2NHgxX3QgYSkgewogICByZXR1cm4gdmR1cGRfbGFuZV9mNjQoYSwgMCk7CiAvLyBDSEVDSzogcmV0CkBAIC0yMSw3ICsyNCw3IEBACiB9CiAKIAotLy8gQ0hFQ0s6IHRlc3RfdmR1cHNfbGFuZXFfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwc19sYW5lcV9mMzIKIGZsb2F0MzJfdCB0ZXN0X3ZkdXBzX2xhbmVxX2YzMihmbG9hdDMyeDRfdCBhKSB7CiAgIHJldHVybiB2ZHVwc19sYW5lcV9mMzIoYSwgMyk7CiAvLyBDSEVDSzogcmV0CkBAIC0yOSw3ICszMiw3IEBACiB9CiAKIAotLy8gQ0hFQ0s6IHRlc3RfdmR1cGRfbGFuZXFfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwZF9sYW5lcV9mNjQKIGZsb2F0NjRfdCB0ZXN0X3ZkdXBkX2xhbmVxX2Y2NChmbG9hdDY0eDJfdCBhKSB7CiAgIHJldHVybiB2ZHVwZF9sYW5lcV9mNjQoYSwgMSk7CiAvLyBDSEVDSzogcmV0CkBAIC0zNywxMzUgKzQwLDEzNSBAQAogfQogCiAKLS8vIENIRUNLOiB0ZXN0X3ZkdXBiX2xhbmVfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBiX2xhbmVfczgKIGludDhfdCB0ZXN0X3ZkdXBiX2xhbmVfczgoaW50OHg4X3QgYSkgewogICByZXR1cm4gdmR1cGJfbGFuZV9zOChhLCA3KTsKLS8vIENIRUNLOiB1bW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5iWzddCisvLyBDSEVDSzoge3t1bW92fHNtb3Z9fSB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uYls3XQogfQogCiAKLS8vIENIRUNLOiB0ZXN0X3ZkdXBoX2xhbmVfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwaF9sYW5lX3MxNgogaW50MTZfdCB0ZXN0X3ZkdXBoX2xhbmVfczE2KGludDE2eDRfdCBhKSB7CiAgIHJldHVybiB2ZHVwaF9sYW5lX3MxNihhLCAzKTsKLS8vIENIRUNLOiB1bW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5oWzNdCisvLyBDSEVDSzoge3t1bW92fHNtb3Z9fSB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uaFszXQogfQogCiAKLS8vIENIRUNLOiB0ZXN0X3ZkdXBzX2xhbmVfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwc19sYW5lX3MzMgogaW50MzJfdCB0ZXN0X3ZkdXBzX2xhbmVfczMyKGludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2ZHVwc19sYW5lX3MzMihhLCAxKTsKIC8vIENIRUNLOiB1bW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIAotLy8gQ0hFQ0s6IHRlc3RfdmR1cGRfbGFuZV9zNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBkX2xhbmVfczY0CiBpbnQ2NF90IHRlc3RfdmR1cGRfbGFuZV9zNjQoaW50NjR4MV90IGEpIHsKICAgcmV0dXJuIHZkdXBkX2xhbmVfczY0KGEsIDApOwogLy8gQ0hFQ0s6IGZtb3Yge3t4WzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIAotLy8gQ0hFQ0s6IHRlc3RfdmR1cGJfbGFuZV91OAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cGJfbGFuZV91OAogdWludDhfdCB0ZXN0X3ZkdXBiX2xhbmVfdTgodWludDh4OF90IGEpIHsKICAgcmV0dXJuIHZkdXBiX2xhbmVfdTgoYSwgNyk7CiAvLyBDSEVDSzogdW1vdiB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uYls3XQogfQogCiAKLS8vIENIRUNLOiB0ZXN0X3ZkdXBoX2xhbmVfdTE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwaF9sYW5lX3UxNgogdWludDE2X3QgdGVzdF92ZHVwaF9sYW5lX3UxNih1aW50MTZ4NF90IGEpIHsKICAgcmV0dXJuIHZkdXBoX2xhbmVfdTE2KGEsIDMpOwogLy8gQ0hFQ0s6IHVtb3Yge3t3WzAtOV0rfX0sIHt7dlswLTldK319LmhbM10KIH0KIAogCi0vLyBDSEVDSzogdGVzdF92ZHVwc19sYW5lX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHNfbGFuZV91MzIKIHVpbnQzMl90IHRlc3RfdmR1cHNfbGFuZV91MzIodWludDMyeDJfdCBhKSB7CiAgIHJldHVybiB2ZHVwc19sYW5lX3UzMihhLCAxKTsKIC8vIENIRUNLOiB1bW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIAotLy8gQ0hFQ0s6IHRlc3RfdmR1cGRfbGFuZV91NjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBkX2xhbmVfdTY0CiB1aW50NjRfdCB0ZXN0X3ZkdXBkX2xhbmVfdTY0KHVpbnQ2NHgxX3QgYSkgewogICByZXR1cm4gdmR1cGRfbGFuZV91NjQoYSwgMCk7CiAvLyBDSEVDSzogZm1vdiB7e3hbMC05XSt9fSwge3tkWzAtOV0rfX0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmR1cGJfbGFuZXFfczgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBiX2xhbmVxX3M4CiBpbnQ4X3QgdGVzdF92ZHVwYl9sYW5lcV9zOChpbnQ4eDE2X3QgYSkgewogICByZXR1cm4gdmR1cGJfbGFuZXFfczgoYSwgMTUpOwotLy8gQ0hFQ0s6IHVtb3Yge3t3WzAtOV0rfX0sIHt7dlswLTldK319LmJbMTVdCisvLyBDSEVDSzoge3t1bW92fHNtb3Z9fSB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uYlsxNV0KIH0KIAogCi0vLyBDSEVDSzogdGVzdF92ZHVwaF9sYW5lcV9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBoX2xhbmVxX3MxNgogaW50MTZfdCB0ZXN0X3ZkdXBoX2xhbmVxX3MxNihpbnQxNng4X3QgYSkgewogICByZXR1cm4gdmR1cGhfbGFuZXFfczE2KGEsIDcpOwotLy8gQ0hFQ0s6IHVtb3Yge3t3WzAtOV0rfX0sIHt7dlswLTldK319LmhbN10KKy8vIENIRUNLOiB7e3Vtb3Z8c21vdn19IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKIAotLy8gQ0hFQ0s6IHRlc3RfdmR1cHNfbGFuZXFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwc19sYW5lcV9zMzIKIGludDMyX3QgdGVzdF92ZHVwc19sYW5lcV9zMzIoaW50MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZkdXBzX2xhbmVxX3MzMihhLCAzKTsKIC8vIENIRUNLOiB1bW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIAotLy8gQ0hFQ0s6IHRlc3RfdmR1cGRfbGFuZXFfczY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwZF9sYW5lcV9zNjQKIGludDY0X3QgdGVzdF92ZHVwZF9sYW5lcV9zNjQoaW50NjR4Ml90IGEpIHsKICAgcmV0dXJuIHZkdXBkX2xhbmVxX3M2NChhLCAxKTsKIC8vIENIRUNLOiB1bW92IHt7eFswLTldK319LCB7e3ZbMC05XSt9fS5kWzFdCiB9CiAKIAotLy8gQ0hFQ0s6IHRlc3RfdmR1cGJfbGFuZXFfdTgKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBiX2xhbmVxX3U4CiB1aW50OF90IHRlc3RfdmR1cGJfbGFuZXFfdTgodWludDh4MTZfdCBhKSB7CiAgIHJldHVybiB2ZHVwYl9sYW5lcV91OChhLCAxNSk7CiAvLyBDSEVDSzogdW1vdiB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uYlsxNV0KIH0KIAogCi0vLyBDSEVDSzogdGVzdF92ZHVwaF9sYW5lcV91MTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBoX2xhbmVxX3UxNgogdWludDE2X3QgdGVzdF92ZHVwaF9sYW5lcV91MTYodWludDE2eDhfdCBhKSB7CiAgIHJldHVybiB2ZHVwaF9sYW5lcV91MTYoYSwgNyk7CiAvLyBDSEVDSzogdW1vdiB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uaFs3XQogfQogCiAKLS8vIENIRUNLOiB0ZXN0X3ZkdXBzX2xhbmVxX3UzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHNfbGFuZXFfdTMyCiB1aW50MzJfdCB0ZXN0X3ZkdXBzX2xhbmVxX3UzMih1aW50MzJ4NF90IGEpIHsKICAgcmV0dXJuIHZkdXBzX2xhbmVxX3UzMihhLCAzKTsKIC8vIENIRUNLOiB1bW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIAotLy8gQ0hFQ0s6IHRlc3RfdmR1cGRfbGFuZXFfdTY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwZF9sYW5lcV91NjQKIHVpbnQ2NF90IHRlc3RfdmR1cGRfbGFuZXFfdTY0KHVpbnQ2NHgyX3QgYSkgewogICByZXR1cm4gdmR1cGRfbGFuZXFfdTY0KGEsIDEpOwogLy8gQ0hFQ0s6IHVtb3Yge3t4WzAtOV0rfX0sIHt7dlswLTldK319LmRbMV0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmR1cGJfbGFuZV9wOAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cGJfbGFuZV9wOAogcG9seThfdCB0ZXN0X3ZkdXBiX2xhbmVfcDgocG9seTh4OF90IGEpIHsKICAgcmV0dXJuIHZkdXBiX2xhbmVfcDgoYSwgNyk7CiAvLyBDSEVDSzogdW1vdiB7e3dbMC05XSt9fSwge3t2WzAtOV0rfX0uYls3XQogfQogCi0vLyBDSEVDSzogdGVzdF92ZHVwaF9sYW5lX3AxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cGhfbGFuZV9wMTYKIHBvbHkxNl90IHRlc3RfdmR1cGhfbGFuZV9wMTYocG9seTE2eDRfdCBhKSB7CiAgIHJldHVybiB2ZHVwaF9sYW5lX3AxNihhLCAzKTsKIC8vIENIRUNLOiB1bW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZkdXBiX2xhbmVxX3A4CisvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwYl9sYW5lcV9wOAogcG9seThfdCB0ZXN0X3ZkdXBiX2xhbmVxX3A4KHBvbHk4eDE2X3QgYSkgewogICByZXR1cm4gdmR1cGJfbGFuZXFfcDgoYSwgMTUpOwogLy8gQ0hFQ0s6IHVtb3Yge3t3WzAtOV0rfX0sIHt7dlswLTldK319LmJbMTVdCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZkdXBoX2xhbmVxX3AxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cGhfbGFuZXFfcDE2CiBwb2x5MTZfdCB0ZXN0X3ZkdXBoX2xhbmVxX3AxNihwb2x5MTZ4OF90IGEpIHsKICAgcmV0dXJuIHZkdXBoX2xhbmVxX3AxNihhLCA3KTsKIC8vIENIRUNLOiB1bW92IHt7d1swLTldK319LCB7e3ZbMC05XSt9fS5oWzddCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLXNjYWxhci14LWluZGV4ZWQtZWxlbS5jIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1zY2FsYXIteC1pbmRleGVkLWVsZW0uYwppbmRleCA0ZjA3NzFhLi4wMjkzZTk4IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLXNjYWxhci14LWluZGV4ZWQtZWxlbS5jCisrKyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tc2NhbGFyLXgtaW5kZXhlZC1lbGVtLmMKQEAgLTEsNiArMSw5IEBACiAvLyBSRVFVSVJFUzogYWFyY2g2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCiAvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1ub25lLWxpbnV4LWdudSBcCisvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIC8vIFRlc3QgbmV3IGFhcmNoNjQgaW50cmluc2ljcyBhbmQgdHlwZXMKIApAQCAtOCwyNDggKzExLDI4MyBAQAogCiAKIGZsb2F0MzJfdCB0ZXN0X3ZtdWxzX2xhbmVfZjMyKGZsb2F0MzJfdCBhLCBmbG9hdDMyeDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxzX2xhbmVfZjMyCisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxzX2xhbmVfZjMyCiAgIHJldHVybiB2bXVsc19sYW5lX2YzMihhLCBiLCAxKTsKICAgLy8gQ0hFQ0s6IGZtdWwge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGZsb2F0NjRfdCB0ZXN0X3ZtdWxkX2xhbmVfZjY0KGZsb2F0NjRfdCBhLCBmbG9hdDY0eDFfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxkX2xhbmVfZjY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxkX2xhbmVfZjY0CiAgIHJldHVybiB2bXVsZF9sYW5lX2Y2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGZtdWwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLOiBmbXVsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3t2WzAtOV0rLmRcWzBcXXxkWzAtOV0rfX0KIH0KIAogZmxvYXQzMl90IHRlc3Rfdm11bHNfbGFuZXFfZjMyKGZsb2F0MzJfdCBhLCBmbG9hdDMyeDRfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZtdWxzX2xhbmVxX2YzMgorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsc19sYW5lcV9mMzIKICAgcmV0dXJuIHZtdWxzX2xhbmVxX2YzMihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IGZtdWwge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGZsb2F0NjRfdCB0ZXN0X3ZtdWxkX2xhbmVxX2Y2NChmbG9hdDY0X3QgYSwgZmxvYXQ2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92bXVsZF9sYW5lcV9mNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGRfbGFuZXFfZjY0CiAgIHJldHVybiB2bXVsZF9sYW5lcV9mNjQoYSwgYiwgMSk7CiAgIC8vIENIRUNLOiBmbXVsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3t2WzAtOV0rfX0uZFsxXQogfQogCiBmbG9hdDY0eDFfdCB0ZXN0X3ZtdWxfbl9mNjQoZmxvYXQ2NHgxX3QgYSwgZmxvYXQ2NF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3Rfdm11bF9uX2Y2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVsX25fZjY0CiAgIHJldHVybiB2bXVsX25fZjY0KGEsIGIpOwotICAvLyBDSEVDSzogZm11bCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMF0KKyAgLy8gQ0hFQ0s6IGZtdWwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e3ZbMC05XSsuZFxbMFxdfGRbMC05XSt9fQogfQogCiBmbG9hdDMyX3QgdGVzdF92bXVseHNfbGFuZV9mMzIoZmxvYXQzMl90IGEsIGZsb2F0MzJ4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtdWx4c19sYW5lX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHhzX2xhbmVfZjMyCiAgIHJldHVybiB2bXVseHNfbGFuZV9mMzIoYSwgYiwgMSk7CiAvLyBDSEVDSzogZm11bHgge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIGZsb2F0MzJfdCB0ZXN0X3ZtdWx4c19sYW5lcV9mMzIoZmxvYXQzMl90IGEsIGZsb2F0MzJ4NF90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtdWx4c19sYW5lcV9mMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWx4c19sYW5lcV9mMzIKICAgcmV0dXJuIHZtdWx4c19sYW5lcV9mMzIoYSwgYiwgMyk7CiAvLyBDSEVDSzogZm11bHgge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKIGZsb2F0NjRfdCB0ZXN0X3ZtdWx4ZF9sYW5lX2Y2NChmbG9hdDY0X3QgYSwgZmxvYXQ2NHgxX3QgYikgewotLy8gQ0hFQ0s6IHRlc3Rfdm11bHhkX2xhbmVfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseGRfbGFuZV9mNjQKICAgcmV0dXJuIHZtdWx4ZF9sYW5lX2Y2NChhLCBiLCAwKTsKLS8vIENIRUNLOiBmbXVseCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMF0KKy8vIENIRUNLOiBmbXVseCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7dlswLTldKy5kXFswXF18ZFswLTldK319CiB9CiAKIGZsb2F0NjRfdCB0ZXN0X3ZtdWx4ZF9sYW5lcV9mNjQoZmxvYXQ2NF90IGEsIGZsb2F0NjR4Ml90IGIpIHsKLS8vIENIRUNLOiB0ZXN0X3ZtdWx4ZF9sYW5lcV9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWx4ZF9sYW5lcV9mNjQKICAgcmV0dXJuIHZtdWx4ZF9sYW5lcV9mNjQoYSwgYiwgMSk7CiAvLyBDSEVDSzogZm11bHgge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e3ZbMC05XSt9fS5kWzFdCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZtdWx4X2xhbmVfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseF9sYW5lX2Y2NAogZmxvYXQ2NHgxX3QgdGVzdF92bXVseF9sYW5lX2Y2NChmbG9hdDY0eDFfdCBhLCBmbG9hdDY0eDFfdCBiKSB7CiAgIHJldHVybiB2bXVseF9sYW5lX2Y2NChhLCBiLCAwKTsKLSAgLy8gQ0hFQ0s6IGZtdWx4IHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3t2WzAtOV0rfX0uZFswXQorICAvLyBDSEVDSzogZm11bHgge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e3ZbMC05XSsuZFxbMFxdfGRbMC05XSt9fQogfQogCiAKLS8vIENIRUNLOiB0ZXN0X3ZtdWx4X2xhbmVxX2Y2NF8wCisvLyBDSEVDSy1MQUJFTDogdGVzdF92bXVseF9sYW5lcV9mNjRfMAogZmxvYXQ2NHgxX3QgdGVzdF92bXVseF9sYW5lcV9mNjRfMChmbG9hdDY0eDFfdCBhLCBmbG9hdDY0eDJfdCBiKSB7CiAgIHJldHVybiB2bXVseF9sYW5lcV9mNjQoYSwgYiwgMCk7CiAgIC8vIENIRUNLOiBmbXVseCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMF0KIH0KIAotLy8gQ0hFQ0s6IHRlc3Rfdm11bHhfbGFuZXFfZjY0XzEKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWx4X2xhbmVxX2Y2NF8xCiBmbG9hdDY0eDFfdCB0ZXN0X3ZtdWx4X2xhbmVxX2Y2NF8xKGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4Ml90IGIpIHsKICAgcmV0dXJuIHZtdWx4X2xhbmVxX2Y2NChhLCBiLCAxKTsKICAgLy8gQ0hFQ0s6IGZtdWx4IHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3t2WzAtOV0rfX0uZFsxXQogfQogCiAKLS8vIENIRUNLOiB0ZXN0X3ZmbWFzX2xhbmVfZjMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hc19sYW5lX2YzMgogZmxvYXQzMl90IHRlc3RfdmZtYXNfbGFuZV9mMzIoZmxvYXQzMl90IGEsIGZsb2F0MzJfdCBiLCBmbG9hdDMyeDJfdCBjKSB7CiAgIHJldHVybiB2Zm1hc19sYW5lX2YzMihhLCBiLCBjLCAxKTsKICAgLy8gQ0hFQ0s6IGZtbGEge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZmbWFkX2xhbmVfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hZF9sYW5lX2Y2NAogZmxvYXQ2NF90IHRlc3RfdmZtYWRfbGFuZV9mNjQoZmxvYXQ2NF90IGEsIGZsb2F0NjRfdCBiLCBmbG9hdDY0eDFfdCBjKSB7CiAgIHJldHVybiB2Zm1hZF9sYW5lX2Y2NChhLCBiLCBjLCAwKTsKLSAgLy8gQ0hFQ0s6IGZtbGEge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLOiB7e2ZtbGF8Zm1hZGR9fSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7dlswLTldKy5kXFswXF18ZFswLTldK319CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZmbWFkX2xhbmVxX2Y2NAorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtYWRfbGFuZXFfZjY0CiBmbG9hdDY0X3QgdGVzdF92Zm1hZF9sYW5lcV9mNjQoZmxvYXQ2NF90IGEsIGZsb2F0NjRfdCBiLCBmbG9hdDY0eDJfdCBjKSB7CiAgIHJldHVybiB2Zm1hZF9sYW5lcV9mNjQoYSwgYiwgYywgMSk7CiAgIC8vIENIRUNLOiBmbWxhIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3t2WzAtOV0rfX0uZFsxXQogfQogCi0vLyBDSEVDSzogdGVzdF92Zm1zc19sYW5lX2YzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmZtc3NfbGFuZV9mMzIKIGZsb2F0MzJfdCB0ZXN0X3ZmbXNzX2xhbmVfZjMyKGZsb2F0MzJfdCBhLCBmbG9hdDMyX3QgYiwgZmxvYXQzMngyX3QgYykgewogICByZXR1cm4gdmZtc3NfbGFuZV9mMzIoYSwgYiwgYywgMSk7CiAgIC8vIENIRUNLOiBmbWxzIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uc1sxXQogfQogCi0vLyBDSEVDSzogdGVzdF92Zm1hX2xhbmVfZjY0CisvLyBDSEVDSy1MQUJFTDogdGVzdF92Zm1hX2xhbmVfZjY0CiBmbG9hdDY0eDFfdCB0ZXN0X3ZmbWFfbGFuZV9mNjQoZmxvYXQ2NHgxX3QgYSwgZmxvYXQ2NHgxX3QgYiwgZmxvYXQ2NHgxX3QgdikgewogICByZXR1cm4gdmZtYV9sYW5lX2Y2NChhLCBiLCB2LCAwKTsKLSAgLy8gQ0hFQ0s6IGZtbGEge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLOiB7e2ZtbGF8Zm1hZGR9fSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7dlswLTldKy5kXFswXF18ZFswLTldK319CiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZmbXNfbGFuZV9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZmbXNfbGFuZV9mNjQKIGZsb2F0NjR4MV90IHRlc3RfdmZtc19sYW5lX2Y2NChmbG9hdDY0eDFfdCBhLCBmbG9hdDY0eDFfdCBiLCBmbG9hdDY0eDFfdCB2KSB7CiAgIHJldHVybiB2Zm1zX2xhbmVfZjY0KGEsIGIsIHYsIDApOwotICAvLyBDSEVDSzogZm1scyB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMF0KKyAgLy8gQ0hFQ0s6IHt7Zm1sc3xmbXN1Yn19IHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3t2WzAtOV0rLmRcWzBcXXxkWzAtOV0rfX0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmZtYV9sYW5lcV9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZmbWFfbGFuZXFfZjY0CiBmbG9hdDY0eDFfdCB0ZXN0X3ZmbWFfbGFuZXFfZjY0KGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4MV90IGIsIGZsb2F0NjR4Ml90IHYpIHsKICAgcmV0dXJuIHZmbWFfbGFuZXFfZjY0KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogZm1sYSB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMF0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdmZtc19sYW5lcV9mNjQKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZmbXNfbGFuZXFfZjY0CiBmbG9hdDY0eDFfdCB0ZXN0X3ZmbXNfbGFuZXFfZjY0KGZsb2F0NjR4MV90IGEsIGZsb2F0NjR4MV90IGIsIGZsb2F0NjR4Ml90IHYpIHsKICAgcmV0dXJuIHZmbXNfbGFuZXFfZjY0KGEsIGIsIHYsIDApOwogICAvLyBDSEVDSzogZm1scyB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7dlswLTldK319LmRbMF0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbGhfbGFuZV9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGxoX2xhbmVfczE2CiBpbnQzMl90IHRlc3RfdnFkbXVsbGhfbGFuZV9zMTYoaW50MTZfdCBhLCBpbnQxNng0X3QgYikgewogICByZXR1cm4gdnFkbXVsbGhfbGFuZV9zMTYoYSwgYiwgMyk7Ci0gIC8vIENIRUNLOiBzcWRtdWxsIHt7c1swLTldK319LCB7e2hbMC05XSt9fSwge3t2WzAtOV0rfX0uaFszXQorICAvLyBDSEVDSzogc3FkbXVsbCB7e3NbMC05XSt8dlswLTldKy40c319LCB7e2hbMC05XSt8dlswLTldLjRofX0sIHt7dlswLTldK319LmhbM10KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsbHNfbGFuZV9zMzIKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGxzX2xhbmVfczMyCiBpbnQ2NF90IHRlc3RfdnFkbXVsbHNfbGFuZV9zMzIoaW50MzJfdCBhLCBpbnQzMngyX3QgYikgewogICByZXR1cm4gdnFkbXVsbHNfbGFuZV9zMzIoYSwgYiwgMSk7CiAgIC8vIENIRUNLOiBzcWRtdWxsIHt7ZFswLTldK319LCB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uc1sxXQogfQogCi0vLyBDSEVDSzogdGVzdF92cWRtdWxsaF9sYW5lcV9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG11bGxoX2xhbmVxX3MxNgogaW50MzJfdCB0ZXN0X3ZxZG11bGxoX2xhbmVxX3MxNihpbnQxNl90IGEsIGludDE2eDhfdCBiKSB7CiAgIHJldHVybiB2cWRtdWxsaF9sYW5lcV9zMTYoYSwgYiwgNyk7Ci0gIC8vIENIRUNLOiBzcWRtdWxsIHt7c1swLTldK319LCB7e2hbMC05XSt9fSwge3t2WzAtOV0rfX0uaFs3XQorICAvLyBDSEVDSzogc3FkbXVsbCB7e3NbMC05XSt8dlswLTldKy40c319LCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZxZG11bGxzX2xhbmVxX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbXVsbHNfbGFuZXFfczMyCiBpbnQ2NF90IHRlc3RfdnFkbXVsbHNfbGFuZXFfczMyKGludDMyX3QgYSwgaW50MzJ4NF90IGIpIHsKICAgcmV0dXJuIHZxZG11bGxzX2xhbmVxX3MzMihhLCBiLCAzKTsKICAgLy8gQ0hFQ0s6IHNxZG11bGwge3tkWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZxZG11bGhoX2xhbmVfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxoaF9sYW5lX3MxNgogaW50MTZfdCB0ZXN0X3ZxZG11bGhoX2xhbmVfczE2KGludDE2X3QgYSwgaW50MTZ4NF90IGIpIHsKICAgcmV0dXJuIHZxZG11bGhoX2xhbmVfczE2KGEsIGIsIDMpOwotLy8gQ0hFQ0s6IHNxZG11bGgge3toWzAtOV0rfX0sIHt7aFswLTldK319LCB7e3ZbMC05XSt9fS5oWzNdCisvLyBDSEVDSzogc3FkbXVsaCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZxZG11bGhzX2xhbmVfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxoc19sYW5lX3MzMgogaW50MzJfdCB0ZXN0X3ZxZG11bGhzX2xhbmVfczMyKGludDMyX3QgYSwgaW50MzJ4Ml90IGIpIHsKICAgcmV0dXJuIHZxZG11bGhzX2xhbmVfczMyKGEsIGIsIDEpOwogLy8gQ0hFQ0s6IHNxZG11bGgge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKIAotLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsaGhfbGFuZXFfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxoaF9sYW5lcV9zMTYKIGludDE2X3QgdGVzdF92cWRtdWxoaF9sYW5lcV9zMTYoaW50MTZfdCBhLCBpbnQxNng4X3QgYikgewogICByZXR1cm4gdnFkbXVsaGhfbGFuZXFfczE2KGEsIGIsIDcpOwotLy8gQ0hFQ0s6IHNxZG11bGgge3toWzAtOV0rfX0sIHt7aFswLTldK319LCB7e3ZbMC05XSt9fS5oWzddCisvLyBDSEVDSzogc3FkbXVsaCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKIAotLy8gQ0hFQ0s6IHRlc3RfdnFkbXVsaHNfbGFuZXFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtdWxoc19sYW5lcV9zMzIKIGludDMyX3QgdGVzdF92cWRtdWxoc19sYW5lcV9zMzIoaW50MzJfdCBhLCBpbnQzMng0X3QgYikgewogICByZXR1cm4gdnFkbXVsaHNfbGFuZXFfczMyKGEsIGIsIDMpOwogLy8gQ0hFQ0s6IHNxZG11bGgge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZxcmRtdWxoaF9sYW5lX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhoX2xhbmVfczE2CiBpbnQxNl90IHRlc3RfdnFyZG11bGhoX2xhbmVfczE2KGludDE2X3QgYSwgaW50MTZ4NF90IGIpIHsKICAgcmV0dXJuIHZxcmRtdWxoaF9sYW5lX3MxNihhLCBiLCAzKTsKLS8vIENIRUNLOiBzcXJkbXVsaCB7e2hbMC05XSt9fSwge3toWzAtOV0rfX0sIHt7dlswLTldK319LmhbM10KKy8vIENIRUNLOiBzcXJkbXVsaCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZxcmRtdWxoc19sYW5lX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFyZG11bGhzX2xhbmVfczMyCiBpbnQzMl90IHRlc3RfdnFyZG11bGhzX2xhbmVfczMyKGludDMyX3QgYSwgaW50MzJ4Ml90IGIpIHsKICAgcmV0dXJuIHZxcmRtdWxoc19sYW5lX3MzMihhLCBiLCAxKTsKIC8vIENIRUNLOiBzcXJkbXVsaCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7dlswLTldK319LnNbMV0KIH0KIAogCi0vLyBDSEVDSzogdGVzdF92cXJkbXVsaGhfbGFuZXFfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJkbXVsaGhfbGFuZXFfczE2CiBpbnQxNl90IHRlc3RfdnFyZG11bGhoX2xhbmVxX3MxNihpbnQxNl90IGEsIGludDE2eDhfdCBiKSB7CiAgIHJldHVybiB2cXJkbXVsaGhfbGFuZXFfczE2KGEsIGIsIDcpOwotLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7aFswLTldK319LCB7e2hbMC05XSt9fSwge3t2WzAtOV0rfX0uaFs3XQorLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7dlswLTldK319LmhbN10KIH0KIAogCi0vLyBDSEVDSzogdGVzdF92cXJkbXVsaHNfbGFuZXFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cXJkbXVsaHNfbGFuZXFfczMyCiBpbnQzMl90IHRlc3RfdnFyZG11bGhzX2xhbmVxX3MzMihpbnQzMl90IGEsIGludDMyeDRfdCBiKSB7CiAgIHJldHVybiB2cXJkbXVsaHNfbGFuZXFfczMyKGEsIGIsIDMpOwogLy8gQ0hFQ0s6IHNxcmRtdWxoIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3t2WzAtOV0rfX0uc1szXQogfQogCi0vLyBDSEVDSzogdGVzdF92cWRtbGFsaF9sYW5lX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxhbGhfbGFuZV9zMTYKIGludDMyX3QgdGVzdF92cWRtbGFsaF9sYW5lX3MxNihpbnQzMl90IGEsIGludDE2X3QgYiwgaW50MTZ4NF90IGMpIHsKICAgcmV0dXJuIHZxZG1sYWxoX2xhbmVfczE2KGEsIGIsIGMsIDMpOwotLy8gQ0hFQ0s6IHNxZG1sYWwge3tzWzAtOV0rfX0sIHt7aFswLTldK319LCB7e3ZbMC05XSt9fS5oWzNdCisvLyBDSEVDSzogc3FkbWxhbCB7e3NbMC05XSt8dlswLTldKy40c319LCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e3ZbMC05XSt9fS5oWzNdCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZxZG1sYWxzX2xhbmVfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsc19sYW5lX3MzMgogaW50NjRfdCB0ZXN0X3ZxZG1sYWxzX2xhbmVfczMyKGludDY0X3QgYSwgaW50MzJfdCBiLCBpbnQzMngyX3QgYykgewogICByZXR1cm4gdnFkbWxhbHNfbGFuZV9zMzIoYSwgYiwgYywgMSk7CiAvLyBDSEVDSzogc3FkbWxhbCB7e2RbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7dlswLTldK319LnNbMV0KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnFkbWxhbGhfbGFuZXFfczE2CisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsaF9sYW5lcV9zMTYKIGludDMyX3QgdGVzdF92cWRtbGFsaF9sYW5lcV9zMTYoaW50MzJfdCBhLCBpbnQxNl90IGIsIGludDE2eDhfdCBjKSB7CiAgIHJldHVybiB2cWRtbGFsaF9sYW5lcV9zMTYoYSwgYiwgYywgNyk7Ci0vLyBDSEVDSzogc3FkbWxhbCB7e3NbMC05XSt9fSwge3toWzAtOV0rfX0sIHt7dlswLTldK319LmhbN10KKy8vIENIRUNLOiBzcWRtbGFsIHt7c1swLTldK3x2WzAtOV0rLjRzfX0sIHt7aFswLTldK3x2WzAtOV0rLjRofX0sIHt7dlswLTldK319LmhbN10KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnFkbWxhbHNfbGFuZXFfczMyCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cWRtbGFsc19sYW5lcV9zMzIKIGludDY0X3QgdGVzdF92cWRtbGFsc19sYW5lcV9zMzIoaW50NjRfdCBhLCBpbnQzMl90IGIsIGludDMyeDRfdCBjKSB7CiAgIHJldHVybiB2cWRtbGFsc19sYW5lcV9zMzIoYSwgYiwgYywgMyk7CiAvLyBDSEVDSzogc3FkbWxhbCB7e2RbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7dlswLTldK319LnNbM10KIH0KIAotLy8gQ0hFQ0s6IHRlc3RfdnFkbWxzbGhfbGFuZV9zMTYKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxZG1sc2xoX2xhbmVfczE2CiBpbnQzMl90IHRlc3RfdnFkbWxzbGhfbGFuZV9zMTYoaW50MzJfdCBhLCBpbnQxNl90IGIsIGludDE2eDRfdCBjKSB7CiAgIHJldHVybiB2cWRtbHNsaF9sYW5lX3MxNihhLCBiLCBjLCAzKTsKLS8vIENIRUNLOiBzcWRtbHNsIHt7c1swLTldK319LCB7e2hbMC05XSt9fSwge3t2WzAtOV0rfX0uaFszXQorLy8gQ0hFQ0s6IHNxZG1sc2wge3tzWzAtOV0rfHZbMC05XSsuNHN9fSwge3toWzAtOV0rfHZbMC05XSsuNGh9fSwge3t2WzAtOV0rfX0uaFszXQogfQogCi0vLyBDSEVDSzogdGVzdF92cWRtbHNsc19sYW5lX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxzbHNfbGFuZV9zMzIKIGludDY0X3QgdGVzdF92cWRtbHNsc19sYW5lX3MzMihpbnQ2NF90IGEsIGludDMyX3QgYiwgaW50MzJ4Ml90IGMpIHsKICAgcmV0dXJuIHZxZG1sc2xzX2xhbmVfczMyKGEsIGIsIGMsIDEpOwogLy8gQ0hFQ0s6IHNxZG1sc2wge3tkWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzFdCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZxZG1sc2xoX2xhbmVxX3MxNgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxzbGhfbGFuZXFfczE2CiBpbnQzMl90IHRlc3RfdnFkbWxzbGhfbGFuZXFfczE2KGludDMyX3QgYSwgaW50MTZfdCBiLCBpbnQxNng4X3QgYykgewogICByZXR1cm4gdnFkbWxzbGhfbGFuZXFfczE2KGEsIGIsIGMsIDcpOwotLy8gQ0hFQ0s6IHNxZG1sc2wge3tzWzAtOV0rfX0sIHt7aFswLTldK319LCB7e3ZbMC05XSt9fS5oWzddCisvLyBDSEVDSzogc3FkbWxzbCB7e3NbMC05XSt8dlswLTldKy40c319LCB7e2hbMC05XSt8dlswLTldKy40aH19LCB7e3ZbMC05XSt9fS5oWzddCiB9CiAKLS8vIENIRUNLOiB0ZXN0X3ZxZG1sc2xzX2xhbmVxX3MzMgorLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnFkbWxzbHNfbGFuZXFfczMyCiBpbnQ2NF90IHRlc3RfdnFkbWxzbHNfbGFuZXFfczMyKGludDY0X3QgYSwgaW50MzJfdCBiLCBpbnQzMng0X3QgYykgewogICByZXR1cm4gdnFkbWxzbHNfbGFuZXFfczMyKGEsIGIsIGMsIDMpOwogLy8gQ0hFQ0s6IHNxZG1sc2wge3tkWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3ZbMC05XSt9fS5zWzNdCiB9CiAKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWx4X2xhbmVfZjY0XzA6CitmbG9hdDY0eDFfdCB0ZXN0X3ZtdWx4X2xhbmVfZjY0XzAoKSB7CisgICAgICBmbG9hdDY0eDFfdCBhcmcxOworICAgICAgZmxvYXQ2NHgxX3QgYXJnMjsKKyAgICAgIGZsb2F0NjR4MV90IHJlc3VsdDsKKyAgICAgIGZsb2F0NjRfdCBzYXJnMSwgc2FyZzIsIHNyZXM7CisgICAgICBhcmcxID0gdmNyZWF0ZV9mNjQoVUlOVDY0X0MoMHgzZmQ2MzA0YmM0M2FiNWMyKSk7CisgICAgICBhcmcyID0gdmNyZWF0ZV9mNjQoVUlOVDY0X0MoMHgzZmVlMjExZTIxNWFlZWYzKSk7CisgICAgICByZXN1bHQgPSB2bXVseF9sYW5lX2Y2NChhcmcxLCBhcmcyLCAwKTsKKy8vIENIRUNLOiBhZHJwIHhbW0FERFJMTzpbMC05XStdXQorLy8gQ0hFQ0s6IGxkciBkMCwgW3hbW0FERFJMT11dLAorLy8gQ0hFQ0s6IGFkcnAgeFtbQUREUkxPOlswLTldK11dCisvLyBDSEVDSzogbGRyIGQxLCBbeFtbQUREUkxPXV0sCisvLyBDSEVDSzogZm11bHggZDAsIGQxLCBkMAorICAgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bHhfbGFuZXFfZjY0XzI6CitmbG9hdDY0eDFfdCB0ZXN0X3ZtdWx4X2xhbmVxX2Y2NF8yKCkgeworICAgICAgZmxvYXQ2NHgxX3QgYXJnMTsKKyAgICAgIGZsb2F0NjR4MV90IGFyZzI7CisgICAgICBmbG9hdDY0eDJfdCBhcmczOworICAgICAgZmxvYXQ2NHgxX3QgcmVzdWx0OworICAgICAgZmxvYXQ2NF90IHNhcmcxLCBzYXJnMiwgc3JlczsKKyAgICAgIGFyZzEgPSB2Y3JlYXRlX2Y2NChVSU5UNjRfQygweDNmZDYzMDRiYzQzYWI1YzIpKTsKKyAgICAgIGFyZzIgPSB2Y3JlYXRlX2Y2NChVSU5UNjRfQygweDNmZWUyMTFlMjE1YWVlZjMpKTsKKyAgICAgIGFyZzMgPSB2Y29tYmluZV9mNjQoYXJnMSwgYXJnMik7CisgICAgICByZXN1bHQgPSB2bXVseF9sYW5lcV9mNjQoYXJnMSwgYXJnMywgMSk7CisvLyBDSEVDSzogYWRycCB4W1tBRERSTE86WzAtOV0rXV0KKy8vIENIRUNLOiBsZHIgZDAsIFt4W1tBRERSTE9dXSwKKy8vIENIRUNLOiBhZHJwIHhbW0FERFJMTzpbMC05XStdXQorLy8gQ0hFQ0s6IGxkciBkMSwgW3hbW0FERFJMT11dLAorLy8gQ0hFQ0s6IGZtdWx4IGQwLCBkMSwgZDAKKyAgICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLXNoaWZ0cy5jIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi1zaGlmdHMuYwppbmRleCA0Nzc3ZjE4Li45OWFkZmYxIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLXNoaWZ0cy5jCisrKyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tc2hpZnRzLmMKQEAgLTEsNiArMSw5IEBACiAvLyBSRVFVSVJFUzogYWFyY2g2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCiAvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1lbWl0LWxsdm0gLU8xIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LW5vbmUtbGludXgtZ251IFwKKy8vIFJVTjogICAtZmZwLWNvbnRyYWN0PWZhc3QgLVMgLWVtaXQtbGx2bSAtTzEgLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiAjaW5jbHVkZSA8YXJtX25lb24uaD4KIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi10YmwuYyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tdGJsLmMKaW5kZXggZGI3OGE3YS4uOTNjYmExZCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi10YmwuYworKysgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLXRibC5jCkBAIC0xLDQ2MyArMSw0NjYgQEAKIC8vIFJFUVVJUkVTOiBhYXJjaDY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogYXJtNjQtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFhcmNoNjQtbm9uZS1saW51eC1nbnUgLXRhcmdldC1mZWF0dXJlICtuZW9uIFwKIC8vIFJVTjogICAtZmZwLWNvbnRyYWN0PWZhc3QgLVMgLU8zIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LW5vbmUtbGludXgtZ251IFwKKy8vIFJVTjogICAtZmZwLWNvbnRyYWN0PWZhc3QgLVMgLU8zIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAogLy8gVGVzdCBuZXcgYWFyY2g2NCBpbnRyaW5zaWNzIGFuZCB0eXBlcwogCiAjaW5jbHVkZSA8YXJtX25lb24uaD4KIAogaW50OHg4X3QgdGVzdF92dGJsMV9zOChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0YmwxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0YmwxX3M4CiAgIHJldHVybiB2dGJsMV9zOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS44Yiwge3t7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50OHg4X3QgdGVzdF92cXRibDFfczgoaW50OHgxNl90IGEsIGludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsMV9zOAogICByZXR1cm4gdnF0YmwxX3M4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDhfdCB0ZXN0X3Z0YmwyX3M4KGludDh4OHgyX3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dGJsMl9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dGJsMl9zOAogICByZXR1cm4gdnRibDJfczgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS44YgorICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3sgP3ZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIGludDh4OF90IHRlc3RfdnF0YmwyX3M4KGludDh4MTZ4Ml90IGEsIGludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwyX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsMl9zOAogICByZXR1cm4gdnF0YmwyX3M4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS44YgorICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDhfdCB0ZXN0X3Z0YmwzX3M4KGludDh4OHgzX3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dGJsM19zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dGJsM19zOAogICByZXR1cm4gdnRibDNfczgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIGludDh4OF90IHRlc3RfdnF0YmwzX3M4KGludDh4MTZ4M190IGEsIGludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwzX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsM19zOAogICByZXR1cm4gdnF0YmwzX3M4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDhfdCB0ZXN0X3Z0Ymw0X3M4KGludDh4OHg0X3QgYSwgaW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dGJsNF9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dGJsNF9zOAogICByZXR1cm4gdnRibDRfczgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIGludDh4OF90IHRlc3RfdnF0Ymw0X3M4KGludDh4MTZ4NF90IGEsIGludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0Ymw0X3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsNF9zOAogICByZXR1cm4gdnF0Ymw0X3M4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92cXRibDFxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXRibDFxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsMXFfczgKICAgcmV0dXJuIHZxdGJsMXFfczgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uMTZiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3sgP3ZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjE2YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92cXRibDJxX3M4KGludDh4MTZ4Ml90IGEsIGludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxdGJsMnFfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnF0YmwycV9zOAogICByZXR1cm4gdnF0YmwycV9zOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS4xNmIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIGludDh4MTZfdCB0ZXN0X3ZxdGJsM3FfczgoaW50OHgxNngzX3QgYSwgaW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwzcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRibDNxX3M4CiAgIHJldHVybiB2cXRibDNxX3M4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjE2Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS4xNmIKKyAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS4xNmIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50OHgxNl90IHRlc3RfdnF0Ymw0cV9zOChpbnQ4eDE2eDRfdCBhLCBpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXRibDRxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsNHFfczgKICAgcmV0dXJuIHZxdGJsNHFfczgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uMTZiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjE2YgogfQogCiBpbnQ4eDhfdCB0ZXN0X3Z0YngxX3M4KGludDh4OF90IGEsIGludDh4OF90IGIsIGludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRieDFfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRieDFfczgKICAgcmV0dXJuIHZ0YngxX3M4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogbW92aSB7e3ZbMC05XSt9fS44YiwgIzAKKyAgLy8gQ0hFQ0s6IG1vdmkge3t2WzAtOV0rLjhifGRbMC05XSt9fSwgIzAKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCi0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS44YgorICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3sgP3ZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiAgIC8vIENIRUNLOiBjbWhzIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIGludDh4OF90IHRlc3RfdnRieDJfczgoaW50OHg4X3QgYSwgaW50OHg4eDJfdCBiLCBpbnQ4eDhfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0YngyX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0YngyX3M4CiAgIHJldHVybiB2dGJ4Ml9zOChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50OHg4X3QgdGVzdF92dGJ4M19zOChpbnQ4eDhfdCBhLCBpbnQ4eDh4M190IGIsIGludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRieDNfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRieDNfczgKICAgcmV0dXJuIHZ0YngzX3M4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogbW92aSB7e3ZbMC05XSt9fS44YiwgIzAKKyAgLy8gQ0hFQ0s6IG1vdmkge3t2WzAtOV0rLjhifGRbMC05XSt9fSwgIzAKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCi0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiAgIC8vIENIRUNLOiBjbWhzIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIGludDh4OF90IHRlc3RfdnRieDRfczgoaW50OHg4X3QgYSwgaW50OHg4eDRfdCBiLCBpbnQ4eDhfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0Yng0X3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0Yng0X3M4CiAgIHJldHVybiB2dGJ4NF9zOChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50OHg4X3QgdGVzdF92cXRieDFfczgoaW50OHg4X3QgYSwgaW50OHgxNl90IGIsIGludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YngxX3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJ4MV9zOAogICByZXR1cm4gdnF0YngxX3M4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDhfdCB0ZXN0X3ZxdGJ4Ml9zOChpbnQ4eDhfdCBhLCBpbnQ4eDE2eDJfdCBiLCBpbnQ4eDhfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxdGJ4Ml9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRieDJfczgKICAgcmV0dXJuIHZxdGJ4Ml9zOChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uOGIKIH0KIAogaW50OHg4X3QgdGVzdF92cXRieDNfczgoaW50OHg4X3QgYSwgaW50OHgxNngzX3QgYiwgaW50OHg4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cXRieDNfczgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnF0YngzX3M4CiAgIHJldHVybiB2cXRieDNfczgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIGludDh4OF90IHRlc3RfdnF0Yng0X3M4KGludDh4OF90IGEsIGludDh4MTZ4NF90IGIsIGludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0Yng0X3M4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJ4NF9zOAogICByZXR1cm4gdnF0Yng0X3M4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBpbnQ4eDE2X3QgdGVzdF92cXRieDFxX3M4KGludDh4MTZfdCBhLCBpbnQ4eDE2X3QgYiwgaW50OHgxNl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YngxcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRieDFxX3M4CiAgIHJldHVybiB2cXRieDFxX3M4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50OHgxNl90IHRlc3RfdnF0YngycV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNngyX3QgYiwgaW50OHgxNl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YngycV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRieDJxX3M4CiAgIHJldHVybiB2cXRieDJxX3M4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uMTZiCisgIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uMTZiLCB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50OHgxNl90IHRlc3RfdnF0YngzcV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNngzX3QgYiwgaW50OHgxNl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YngzcV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRieDNxX3M4CiAgIHJldHVybiB2cXRieDNxX3M4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS4xNmIKKyAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS4xNmIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogaW50OHgxNl90IHRlc3RfdnF0Yng0cV9zOChpbnQ4eDE2X3QgYSwgaW50OHgxNng0X3QgYiwgaW50OHgxNl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0Yng0cV9zOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRieDRxX3M4CiAgIHJldHVybiB2cXRieDRxX3M4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDh4OF90IHRlc3RfdnRibDFfdTgodWludDh4OF90IGEsIHVpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0YmwxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0YmwxX3U4CiAgIHJldHVybiB2dGJsMV91OChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS44Yiwge3t7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDh4OF90IHRlc3RfdnF0YmwxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsMV91OAogICByZXR1cm4gdnF0YmwxX3U4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50OHg4X3QgdGVzdF92dGJsMl91OCh1aW50OHg4eDJfdCBhLCB1aW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dGJsMl91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dGJsMl91OAogICByZXR1cm4gdnRibDJfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS44YgorICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3sgP3ZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZxdGJsMl91OCh1aW50OHgxNngyX3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwyX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsMl91OAogICByZXR1cm4gdnF0YmwyX3U4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS44YgorICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50OHg4X3QgdGVzdF92dGJsM191OCh1aW50OHg4eDNfdCBhLCB1aW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dGJsM191OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dGJsM191OAogICByZXR1cm4gdnRibDNfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZxdGJsM191OCh1aW50OHgxNngzX3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwzX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsM191OAogICByZXR1cm4gdnF0YmwzX3U4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50OHg4X3QgdGVzdF92dGJsNF91OCh1aW50OHg4eDRfdCBhLCB1aW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dGJsNF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dGJsNF91OAogICByZXR1cm4gdnRibDRfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZxdGJsNF91OCh1aW50OHgxNng0X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0Ymw0X3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsNF91OAogICByZXR1cm4gdnF0Ymw0X3U4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50OHgxNl90IHRlc3RfdnF0YmwxcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXRibDFxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsMXFfdTgKICAgcmV0dXJuIHZxdGJsMXFfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uMTZiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3sgP3ZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjE2YgogfQogCiB1aW50OHgxNl90IHRlc3RfdnF0YmwycV91OCh1aW50OHgxNngyX3QgYSwgdWludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxdGJsMnFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnF0YmwycV91OAogICByZXR1cm4gdnF0YmwycV91OChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS4xNmIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92cXRibDNxX3U4KHVpbnQ4eDE2eDNfdCBhLCB1aW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwzcV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRibDNxX3U4CiAgIHJldHVybiB2cXRibDNxX3U4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjE2Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS4xNmIKKyAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS4xNmIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZxdGJsNHFfdTgodWludDh4MTZ4NF90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXRibDRxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsNHFfdTgKICAgcmV0dXJuIHZxdGJsNHFfdTgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uMTZiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjE2YgogfQogCiB1aW50OHg4X3QgdGVzdF92dGJ4MV91OCh1aW50OHg4X3QgYSwgdWludDh4OF90IGIsIHVpbnQ4eDhfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0YngxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0YngxX3U4CiAgIHJldHVybiB2dGJ4MV91OChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IG1vdmkge3t2WzAtOV0rfX0uOGIsICMwCisgIC8vIENIRUNLOiBtb3ZpIHt7dlswLTldKy44YnxkWzAtOV0rfX0sICMwCiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uZFsxXSwge3t2WzAtOV0rfX0uZFswXQotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogICAvLyBDSEVDSzogY21ocyB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiAgIC8vIENIRUNLOiBic2wge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50OHg4X3QgdGVzdF92dGJ4Ml91OCh1aW50OHg4X3QgYSwgdWludDh4OHgyX3QgYiwgdWludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRieDJfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRieDJfdTgKICAgcmV0dXJuIHZ0YngyX3U4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50OHg4X3QgdGVzdF92dGJ4M191OCh1aW50OHg4X3QgYSwgdWludDh4OHgzX3QgYiwgdWludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRieDNfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRieDNfdTgKICAgcmV0dXJuIHZ0YngzX3U4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogbW92aSB7e3ZbMC05XSt9fS44YiwgIzAKKyAgLy8gQ0hFQ0s6IG1vdmkge3t2WzAtOV0rLjhifGRbMC05XSt9fSwgIzAKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCi0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiAgIC8vIENIRUNLOiBjbWhzIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3Z0Yng0X3U4KHVpbnQ4eDhfdCBhLCB1aW50OHg4eDRfdCBiLCB1aW50OHg4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92dGJ4NF91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dGJ4NF91OAogICByZXR1cm4gdnRieDRfdTgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZxdGJ4MV91OCh1aW50OHg4X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHg4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cXRieDFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnF0YngxX3U4CiAgIHJldHVybiB2cXRieDFfdTgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS44YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjhiLCB7e3sgP3ZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZxdGJ4Ml91OCh1aW50OHg4X3QgYSwgdWludDh4MTZ4Ml90IGIsIHVpbnQ4eDhfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxdGJ4Ml91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRieDJfdTgKICAgcmV0dXJuIHZxdGJ4Ml91OChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uOGIKIH0KIAogdWludDh4OF90IHRlc3RfdnF0YngzX3U4KHVpbnQ4eDhfdCBhLCB1aW50OHgxNngzX3QgYiwgdWludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YngzX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJ4M191OAogICByZXR1cm4gdnF0YngzX3U4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiB1aW50OHg4X3QgdGVzdF92cXRieDRfdTgodWludDh4OF90IGEsIHVpbnQ4eDE2eDRfdCBiLCB1aW50OHg4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cXRieDRfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnF0Yng0X3U4CiAgIHJldHVybiB2cXRieDRfdTgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS44YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjhiLCB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92cXRieDFxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHgxNl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YngxcV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRieDFxX3U4CiAgIHJldHVybiB2cXRieDFxX3U4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogdWludDh4MTZfdCB0ZXN0X3ZxdGJ4MnFfdTgodWludDh4MTZfdCBhLCB1aW50OHgxNngyX3QgYiwgdWludDh4MTZfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxdGJ4MnFfdTgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnF0YngycV91OAogICByZXR1cm4gdnF0YngycV91OChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS4xNmIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHVpbnQ4eDE2X3QgdGVzdF92cXRieDNxX3U4KHVpbnQ4eDE2X3QgYSwgdWludDh4MTZ4M190IGIsIHVpbnQ4eDE2X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cXRieDNxX3U4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJ4M3FfdTgKICAgcmV0dXJuIHZxdGJ4M3FfdTgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uMTZiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjE2YgogfQogCiB1aW50OHgxNl90IHRlc3RfdnF0Yng0cV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2eDRfdCBiLCB1aW50OHgxNl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0Yng0cV91OAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRieDRxX3U4CiAgIHJldHVybiB2cXRieDRxX3U4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogcG9seTh4OF90IHRlc3RfdnRibDFfcDgocG9seTh4OF90IGEsIHVpbnQ4eDhfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0YmwxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0YmwxX3A4CiAgIHJldHVybiB2dGJsMV9wOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS44Yiwge3t7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uOGIKIH0KIAogcG9seTh4OF90IHRlc3RfdnF0YmwxX3A4KHBvbHk4eDE2X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsMV9wOAogICByZXR1cm4gdnF0YmwxX3A4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBwb2x5OHg4X3QgdGVzdF92dGJsMl9wOChwb2x5OHg4eDJfdCBhLCB1aW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dGJsMl9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dGJsMl9wOAogICByZXR1cm4gdnRibDJfcDgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS44YgorICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3sgP3ZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDhfdCB0ZXN0X3ZxdGJsMl9wOChwb2x5OHgxNngyX3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwyX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsMl9wOAogICByZXR1cm4gdnF0YmwyX3A4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS44YgorICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBwb2x5OHg4X3QgdGVzdF92dGJsM19wOChwb2x5OHg4eDNfdCBhLCB1aW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dGJsM19wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dGJsM19wOAogICByZXR1cm4gdnRibDNfcDgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDhfdCB0ZXN0X3ZxdGJsM19wOChwb2x5OHgxNngzX3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwzX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsM19wOAogICByZXR1cm4gdnF0YmwzX3A4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBwb2x5OHg4X3QgdGVzdF92dGJsNF9wOChwb2x5OHg4eDRfdCBhLCB1aW50OHg4X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dGJsNF9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dGJsNF9wOAogICByZXR1cm4gdnRibDRfcDgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDhfdCB0ZXN0X3ZxdGJsNF9wOChwb2x5OHgxNng0X3QgYSwgdWludDh4OF90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0Ymw0X3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsNF9wOAogICByZXR1cm4gdnF0Ymw0X3A4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBwb2x5OHgxNl90IHRlc3RfdnF0YmwxcV9wOChwb2x5OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXRibDFxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsMXFfcDgKICAgcmV0dXJuIHZxdGJsMXFfcDgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uMTZiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3sgP3ZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjE2YgogfQogCiBwb2x5OHgxNl90IHRlc3RfdnF0YmwycV9wOChwb2x5OHgxNngyX3QgYSwgdWludDh4MTZfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxdGJsMnFfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnF0YmwycV9wOAogICByZXR1cm4gdnF0YmwycV9wOChhLCBiKTsKLSAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS4xNmIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHBvbHk4eDE2X3QgdGVzdF92cXRibDNxX3A4KHBvbHk4eDE2eDNfdCBhLCB1aW50OHgxNl90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YmwzcV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRibDNxX3A4CiAgIHJldHVybiB2cXRibDNxX3A4KGEsIGIpOwotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjE2Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS4xNmIKKyAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS4xNmIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogcG9seTh4MTZfdCB0ZXN0X3ZxdGJsNHFfcDgocG9seTh4MTZ4NF90IGEsIHVpbnQ4eDE2X3QgYikgewotICAvLyBDSEVDSzogdGVzdF92cXRibDRxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJsNHFfcDgKICAgcmV0dXJuIHZxdGJsNHFfcDgoYSwgYik7Ci0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uMTZiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uMTZiLCB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjE2YgogfQogCiBwb2x5OHg4X3QgdGVzdF92dGJ4MV9wOChwb2x5OHg4X3QgYSwgcG9seTh4OF90IGIsIHVpbnQ4eDhfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0YngxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z0YngxX3A4CiAgIHJldHVybiB2dGJ4MV9wOChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IG1vdmkge3t2WzAtOV0rfX0uOGIsICMwCisgIC8vIENIRUNLOiBtb3ZpIHt7dlswLTldKy44YnxkWzAtOV0rfX0sICMwCiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uZFsxXSwge3t2WzAtOV0rfX0uZFswXQotICAvLyBDSEVDSzogdGJsIHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRibCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogICAvLyBDSEVDSzogY21ocyB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiAgIC8vIENIRUNLOiBic2wge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44YgogfQogCiBwb2x5OHg4X3QgdGVzdF92dGJ4Ml9wOChwb2x5OHg4X3QgYSwgcG9seTh4OHgyX3QgYiwgdWludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRieDJfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRieDJfcDgKICAgcmV0dXJuIHZ0YngyX3A4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBwb2x5OHg4X3QgdGVzdF92dGJ4M19wOChwb2x5OHg4X3QgYSwgcG9seTh4OHgzX3QgYiwgdWludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRieDNfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRieDNfcDgKICAgcmV0dXJuIHZ0YngzX3A4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogbW92aSB7e3ZbMC05XSt9fS44YiwgIzAKKyAgLy8gQ0hFQ0s6IG1vdmkge3t2WzAtOV0rLjhifGRbMC05XSt9fSwgIzAKICAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCi0gIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Ymwge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiAgIC8vIENIRUNLOiBjbWhzIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIsIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDhfdCB0ZXN0X3Z0Yng0X3A4KHBvbHk4eDhfdCBhLCBwb2x5OHg4eDRfdCBiLCB1aW50OHg4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92dGJ4NF9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dGJ4NF9wOAogICByZXR1cm4gdnRieDRfcDgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDhfdCB0ZXN0X3ZxdGJ4MV9wOChwb2x5OHg4X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHg4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cXRieDFfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnF0YngxX3A4CiAgIHJldHVybiB2cXRieDFfcDgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS44YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjhiLCB7e3sgP3ZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDhfdCB0ZXN0X3ZxdGJ4Ml9wOChwb2x5OHg4X3QgYSwgcG9seTh4MTZ4Ml90IGIsIHVpbnQ4eDhfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxdGJ4Ml9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRieDJfcDgKICAgcmV0dXJuIHZxdGJ4Ml9wOChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZifSwge3t2WzAtOV0rfX0uOGIKKyAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS44Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uOGIKIH0KIAogcG9seTh4OF90IHRlc3RfdnF0YngzX3A4KHBvbHk4eDhfdCBhLCBwb2x5OHgxNngzX3QgYiwgdWludDh4OF90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YngzX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJ4M19wOAogICByZXR1cm4gdnF0YngzX3A4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjhiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjhiCisgIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7eyA/dlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS44YgogfQogCiBwb2x5OHg4X3QgdGVzdF92cXRieDRfcDgocG9seTh4OF90IGEsIHBvbHk4eDE2eDRfdCBiLCB1aW50OHg4X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cXRieDRfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnF0Yng0X3A4CiAgIHJldHVybiB2cXRieDRfcDgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uOGIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmJ9LCB7e3ZbMC05XSt9fS44YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjhiLCB7e3sgP3ZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjhiCiB9CiAKIHBvbHk4eDE2X3QgdGVzdF92cXRieDFxX3A4KHBvbHk4eDE2X3QgYSwgdWludDh4MTZfdCBiLCB1aW50OHgxNl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0YngxcV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRieDFxX3A4CiAgIHJldHVybiB2cXRieDFxX3A4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS4xNmIKIH0KIAogcG9seTh4MTZfdCB0ZXN0X3ZxdGJ4MnFfcDgocG9seTh4MTZfdCBhLCBwb2x5OHgxNngyX3QgYiwgdWludDh4MTZfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZxdGJ4MnFfcDgKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnF0YngycV9wOAogICByZXR1cm4gdnF0YngycV9wOChhLCBiLCBjKTsKLSAgLy8gQ0hFQ0s6IHRieCB7e3ZbMC05XSt9fS4xNmIsIHt7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIgP319fSwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHBvbHk4eDE2X3QgdGVzdF92cXRieDNxX3A4KHBvbHk4eDE2X3QgYSwgcG9seTh4MTZ4M190IGIsIHVpbnQ4eDE2X3QgYykgewotICAvLyBDSEVDSzogdGVzdF92cXRieDNxX3A4CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZxdGJ4M3FfcDgKICAgcmV0dXJuIHZxdGJ4M3FfcDgoYSwgYiwgYyk7Ci0gIC8vIENIRUNLOiB0Yngge3t2WzAtOV0rfX0uMTZiLCB7e3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiID99fX0sIHt7dlswLTldK319LjE2YgogfQogCiBwb2x5OHgxNl90IHRlc3RfdnF0Yng0cV9wOChwb2x5OHgxNl90IGEsIHBvbHk4eDE2eDRfdCBiLCB1aW50OHgxNl90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnF0Yng0cV9wOAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92cXRieDRxX3A4CiAgIHJldHVybiB2cXRieDRxX3A4KGEsIGIsIGMpOwotICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yn0sIHt7dlswLTldK319LjE2YgorICAvLyBDSEVDSzogdGJ4IHt7dlswLTldK319LjE2Yiwge3t7ID92WzAtOV0rLjE2YiwgdlswLTldKy4xNmIsIHZbMC05XSsuMTZiLCB2WzAtOV0rLjE2YiA/fX19LCB7e3ZbMC05XSt9fS4xNmIKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tdmNvbWJpbmUuYyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tdmNvbWJpbmUuYwppbmRleCAzZTE3MGM4Li4zODFiMDUyIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLXZjb21iaW5lLmMKKysrIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi12Y29tYmluZS5jCkBAIC0xLDYgKzEsOCBAQAogLy8gUkVRVUlSRVM6IGFhcmNoNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBhcm02NC1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NC1ub25lLWxpbnV4LWdudSAtdGFyZ2V0LWZlYXR1cmUgK25lb24gXAogLy8gUlVOOiAgIC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1ub25lLWxpbnV4LWdudSAtUyAtTzMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiAvLyBUZXN0IG5ldyBhYXJjaDY0IGludHJpbnNpY3MgYW5kIHR5cGVzCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tdmdldC1oaWxvLmMgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1uZW9uLXZnZXQtaGlsby5jCmluZGV4IDAxMmIwYmIuLjRkODBkNDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LW5lb24tdmdldC1oaWxvLmMKKysrIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtbmVvbi12Z2V0LWhpbG8uYwpAQCAtMSwxNzYgKzEsMTkzIEBACiAvLyBSRVFVSVJFUzogYWFyY2g2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCi0vLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4IENIRUNLLUNPTU1PTiAtLWNoZWNrLXByZWZpeCBDSEVDSy1BQVJDSDY0CisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1ub25lLWxpbnV4LWdudSBcCisvLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4IENIRUNLLUNPTU1PTiAtLWNoZWNrLXByZWZpeCBDSEVDSy1BUk02NAogCiAvLyBUZXN0IG5ldyBhYXJjaDY0IGludHJpbnNpY3MgYW5kIHR5cGVzCiAKICNpbmNsdWRlIDxhcm1fbmVvbi5oPgogCiBpbnQ4eDhfdCB0ZXN0X3ZnZXRfaGlnaF9zOChpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfczg6CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfczg6CiAgIHJldHVybiB2Z2V0X2hpZ2hfczgoYSk7Ci0gIC8vIENIRUNLOiBkdXAgZDAsIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFSTTY0OiBleHQgdjAuMTZiLCB2MC4xNmIsIHYwLjE2YiwgIzgKIH0KIAogaW50MTZ4NF90IHRlc3RfdmdldF9oaWdoX3MxNihpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfczE2OgorICAvLyBDSEVDSy1DT01NT04tTEFCRUw6IHRlc3RfdmdldF9oaWdoX3MxNjoKICAgcmV0dXJuIHZnZXRfaGlnaF9zMTYoYSk7Ci0gIC8vIENIRUNLOiBkdXAgZDAsIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFSTTY0OiBleHQgdjAuMTZiLCB2MC4xNmIsIHYwLjE2YiwgIzgKIH0KIAogaW50MzJ4Ml90IHRlc3RfdmdldF9oaWdoX3MzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfczMyOgorICAvLyBDSEVDSy1DT01NT04tTEFCRUw6IHRlc3RfdmdldF9oaWdoX3MzMjoKICAgcmV0dXJuIHZnZXRfaGlnaF9zMzIoYSk7Ci0gIC8vIENIRUNLOiBkdXAgZDAsIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFSTTY0OiBleHQgdjAuMTZiLCB2MC4xNmIsIHYwLjE2YiwgIzgKIH0KIAogaW50NjR4MV90IHRlc3RfdmdldF9oaWdoX3M2NChpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfczY0OgorICAvLyBDSEVDSy1DT01NT04tTEFCRUw6IHRlc3RfdmdldF9oaWdoX3M2NDoKICAgcmV0dXJuIHZnZXRfaGlnaF9zNjQoYSk7Ci0gIC8vIENIRUNLOiBkdXAgZDAsIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFSTTY0OiBleHQgdjAuMTZiLCB2MC4xNmIsIHYwLjE2YiwgIzgKIH0KIAogdWludDh4OF90IHRlc3RfdmdldF9oaWdoX3U4KHVpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfdTg6CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfdTg6CiAgIHJldHVybiB2Z2V0X2hpZ2hfdTgoYSk7Ci0gIC8vIENIRUNLOiBkdXAgZDAsIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFSTTY0OiBleHQgdjAuMTZiLCB2MC4xNmIsIHYwLjE2YiwgIzgKIH0KIAogdWludDE2eDRfdCB0ZXN0X3ZnZXRfaGlnaF91MTYodWludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfaGlnaF91MTY6CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfdTE2OgogICByZXR1cm4gdmdldF9oaWdoX3UxNihhKTsKLSAgLy8gQ0hFQ0s6IGR1cCBkMCwge3t2WzAtOV0rfX0uZFsxXQorICAvLyBDSEVDSy1BQVJDSDY0OiBkdXAgZDAsIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQVJNNjQ6IGV4dCB2MC4xNmIsIHYwLjE2YiwgdjAuMTZiLCAjOAogfQogCiB1aW50MzJ4Ml90IHRlc3RfdmdldF9oaWdoX3UzMih1aW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9oaWdoX3UzMjoKKyAgLy8gQ0hFQ0stQ09NTU9OLUxBQkVMOiB0ZXN0X3ZnZXRfaGlnaF91MzI6CiAgIHJldHVybiB2Z2V0X2hpZ2hfdTMyKGEpOwotICAvLyBDSEVDSzogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFBUkNINjQ6IGR1cCBkMCwge3t2WzAtOV0rfX0uZFsxXQorICAvLyBDSEVDSy1BUk02NDogZXh0IHYwLjE2YiwgdjAuMTZiLCB2MC4xNmIsICM4CiB9CiAKIHVpbnQ2NHgxX3QgdGVzdF92Z2V0X2hpZ2hfdTY0KHVpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfdTY0OgorICAvLyBDSEVDSy1DT01NT04tTEFCRUw6IHRlc3RfdmdldF9oaWdoX3U2NDoKICAgcmV0dXJuIHZnZXRfaGlnaF91NjQoYSk7Ci0gIC8vIENIRUNLOiBkdXAgZDAsIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFSTTY0OiBleHQgdjAuMTZiLCB2MC4xNmIsIHYwLjE2YiwgIzgKIH0KIAogcG9seTY0eDFfdCB0ZXN0X3ZnZXRfaGlnaF9wNjQocG9seTY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfaGlnaF9wNjQ6CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfcDY0OgogICByZXR1cm4gdmdldF9oaWdoX3A2NChhKTsKLSAgLy8gQ0hFQ0s6IGR1cCBkMCwge3t2WzAtOV0rfX0uZFsxXQorICAvLyBDSEVDSy1BQVJDSDY0OiBkdXAgZDAsIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQVJNNjQ6IGV4dCB2MC4xNmIsIHYwLjE2YiwgdjAuMTZiLCAjOAogfQogCiBmbG9hdDE2eDRfdCB0ZXN0X3ZnZXRfaGlnaF9mMTYoZmxvYXQxNng4X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfZjE2OgorICAvLyBDSEVDSy1DT01NT04tTEFCRUw6IHRlc3RfdmdldF9oaWdoX2YxNjoKICAgcmV0dXJuIHZnZXRfaGlnaF9mMTYoYSk7Ci0gIC8vIENIRUNLOiBkdXAgZDAsIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFSTTY0OiBleHQgdjAuMTZiLCB2MC4xNmIsIHYwLjE2YiwgIzgKIH0KIAogZmxvYXQzMngyX3QgdGVzdF92Z2V0X2hpZ2hfZjMyKGZsb2F0MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9oaWdoX2YzMjoKKyAgLy8gQ0hFQ0stQ09NTU9OLUxBQkVMOiB0ZXN0X3ZnZXRfaGlnaF9mMzI6CiAgIHJldHVybiB2Z2V0X2hpZ2hfZjMyKGEpOwotICAvLyBDSEVDSzogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFBUkNINjQ6IGR1cCBkMCwge3t2WzAtOV0rfX0uZFsxXQorICAvLyBDSEVDSy1BUk02NDogZXh0IHYwLjE2YiwgdjAuMTZiLCB2MC4xNmIsICM4CiB9CiAKIHBvbHk4eDhfdCB0ZXN0X3ZnZXRfaGlnaF9wOChwb2x5OHgxNl90IGEpIHsKLSAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9oaWdoX3A4OgorICAvLyBDSEVDSy1DT01NT04tTEFCRUw6IHRlc3RfdmdldF9oaWdoX3A4OgogICByZXR1cm4gdmdldF9oaWdoX3A4KGEpOwotICAvLyBDSEVDSzogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFBUkNINjQ6IGR1cCBkMCwge3t2WzAtOV0rfX0uZFsxXQorICAvLyBDSEVDSy1BUk02NDogZXh0IHYwLjE2YiwgdjAuMTZiLCB2MC4xNmIsICM4CiB9CiAKIHBvbHkxNng0X3QgdGVzdF92Z2V0X2hpZ2hfcDE2KHBvbHkxNng4X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfcDE2CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2hpZ2hfcDE2CiAgIHJldHVybiB2Z2V0X2hpZ2hfcDE2KGEpOwotICAvLyBDSEVDSzogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFBUkNINjQ6IGR1cCBkMCwge3t2WzAtOV0rfX0uZFsxXQorICAvLyBDSEVDSy1BUk02NDogZXh0IHYwLjE2YiwgdjAuMTZiLCB2MC4xNmIsICM4CiB9CiAKIGZsb2F0NjR4MV90IHRlc3RfdmdldF9oaWdoX2Y2NChmbG9hdDY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfaGlnaF9mNjQKKyAgLy8gQ0hFQ0stQ09NTU9OLUxBQkVMOiB0ZXN0X3ZnZXRfaGlnaF9mNjQKICAgcmV0dXJuIHZnZXRfaGlnaF9mNjQoYSk7Ci0gIC8vIENIRUNLOiBkdXAgZDAsIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogZHVwIGQwLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFSTTY0OiBleHQgdjAuMTZiLCB2MC4xNmIsIHYwLjE2YiwgIzgKIH0KIAogaW50OHg4X3QgdGVzdF92Z2V0X2xvd19zOChpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2xvd19zODoKKyAgLy8gQ0hFQ0stQ09NTU9OLUxBQkVMOiB0ZXN0X3ZnZXRfbG93X3M4OgogICByZXR1cm4gdmdldF9sb3dfczgoYSk7Ci0gIC8vIENIRUNLLU5FWFQ6IHJldAorICAvLyBDSEVDSy1DT01NT04tTkVYVDogcmV0CiB9CiAKIGludDE2eDRfdCB0ZXN0X3ZnZXRfbG93X3MxNihpbnQxNng4X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2xvd19zMTY6CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2xvd19zMTY6CiAgIHJldHVybiB2Z2V0X2xvd19zMTYoYSk7Ci0gIC8vIENIRUNLLU5FWFQ6IHJldAorICAvLyBDSEVDSy1DT01NT04tTkVYVDogcmV0CiB9CiAKIGludDMyeDJfdCB0ZXN0X3ZnZXRfbG93X3MzMihpbnQzMng0X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2xvd19zMzI6CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2xvd19zMzI6CiAgIHJldHVybiB2Z2V0X2xvd19zMzIoYSk7Ci0gIC8vIENIRUNLLU5FWFQ6IHJldAorICAvLyBDSEVDSy1DT01NT04tTkVYVDogcmV0CiB9CiAKIGludDY0eDFfdCB0ZXN0X3ZnZXRfbG93X3M2NChpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2xvd19zNjQ6CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2xvd19zNjQ6CiAgIHJldHVybiB2Z2V0X2xvd19zNjQoYSk7Ci0gIC8vIENIRUNLLU5FWFQ6IHJldAorICAvLyBDSEVDSy1DT01NT04tTkVYVDogcmV0CiB9CiAKIHVpbnQ4eDhfdCB0ZXN0X3ZnZXRfbG93X3U4KHVpbnQ4eDE2X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2xvd191ODoKKyAgLy8gQ0hFQ0stQ09NTU9OLUxBQkVMOiB0ZXN0X3ZnZXRfbG93X3U4OgogICByZXR1cm4gdmdldF9sb3dfdTgoYSk7Ci0gIC8vIENIRUNLLU5FWFQ6IHJldAorICAvLyBDSEVDSy1DT01NT04tTkVYVDogcmV0CiB9CiAKIHVpbnQxNng0X3QgdGVzdF92Z2V0X2xvd191MTYodWludDE2eDhfdCBhKSB7Ci0gIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfbG93X3UxNjoKKyAgLy8gQ0hFQ0stQ09NTU9OLUxBQkVMOiB0ZXN0X3ZnZXRfbG93X3UxNjoKICAgcmV0dXJuIHZnZXRfbG93X3UxNihhKTsKLSAgLy8gQ0hFQ0stTkVYVDogcmV0CisgIC8vIENIRUNLLUNPTU1PTi1ORVhUOiByZXQKIH0KIAogdWludDMyeDJfdCB0ZXN0X3ZnZXRfbG93X3UzMih1aW50MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9sb3dfdTMyOgorICAvLyBDSEVDSy1DT01NT04tTEFCRUw6IHRlc3RfdmdldF9sb3dfdTMyOgogICByZXR1cm4gdmdldF9sb3dfdTMyKGEpOwotICAvLyBDSEVDSy1ORVhUOiByZXQKKyAgLy8gQ0hFQ0stQ09NTU9OLU5FWFQ6IHJldAogfQogCiB1aW50NjR4MV90IHRlc3RfdmdldF9sb3dfdTY0KHVpbnQ2NHgyX3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2xvd191NjQ6CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2xvd191NjQ6CiAgIHJldHVybiB2Z2V0X2xvd191NjQoYSk7Ci0gIC8vIENIRUNLLU5FWFQ6IHJldAorICAvLyBDSEVDSy1DT01NT04tTkVYVDogcmV0CiB9CiAKIHBvbHk2NHgxX3QgdGVzdF92Z2V0X2xvd19wNjQocG9seTY0eDJfdCBhKSB7Ci0gIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRfbG93X3A2NDoKKyAgLy8gQ0hFQ0stQ09NTU9OLUxBQkVMOiB0ZXN0X3ZnZXRfbG93X3A2NDoKICAgcmV0dXJuIHZnZXRfbG93X3A2NChhKTsKLSAgLy8gQ0hFQ0stTkVYVDogcmV0CisgIC8vIENIRUNLLUNPTU1PTi1ORVhUOiByZXQKIH0KIAogZmxvYXQxNng0X3QgdGVzdF92Z2V0X2xvd19mMTYoZmxvYXQxNng4X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2xvd19mMTY6CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2xvd19mMTY6CiAgIHJldHVybiB2Z2V0X2xvd19mMTYoYSk7Ci0gIC8vIENIRUNLLU5FWFQ6IHJldAorICAvLyBDSEVDSy1DT01NT04tTkVYVDogcmV0CiB9CiAKIGZsb2F0MzJ4Ml90IHRlc3RfdmdldF9sb3dfZjMyKGZsb2F0MzJ4NF90IGEpIHsKLSAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9sb3dfZjMyOgorICAvLyBDSEVDSy1DT01NT04tTEFCRUw6IHRlc3RfdmdldF9sb3dfZjMyOgogICByZXR1cm4gdmdldF9sb3dfZjMyKGEpOwotICAvLyBDSEVDSy1ORVhUOiByZXQKKyAgLy8gQ0hFQ0stQ09NTU9OLU5FWFQ6IHJldAogfQogCiBwb2x5OHg4X3QgdGVzdF92Z2V0X2xvd19wOChwb2x5OHgxNl90IGEpIHsKLSAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9sb3dfcDg6CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2xvd19wODoKICAgcmV0dXJuIHZnZXRfbG93X3A4KGEpOwotICAvLyBDSEVDSy1ORVhUOiByZXQKKyAgLy8gQ0hFQ0stQ09NTU9OLU5FWFQ6IHJldAogfQogCiBwb2x5MTZ4NF90IHRlc3RfdmdldF9sb3dfcDE2KHBvbHkxNng4X3QgYSkgewotICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2xvd19wMTY6CisgIC8vIENIRUNLLUNPTU1PTi1MQUJFTDogdGVzdF92Z2V0X2xvd19wMTY6CiAgIHJldHVybiB2Z2V0X2xvd19wMTYoYSk7Ci0gIC8vIENIRUNLLU5FWFQ6IHJldAorICAvLyBDSEVDSy1DT01NT04tTkVYVDogcmV0CiB9CiAKIGZsb2F0NjR4MV90IHRlc3RfdmdldF9sb3dfZjY0KGZsb2F0NjR4Ml90IGEpIHsKLSAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmdldF9sb3dfZjY0OgorICAvLyBDSEVDSy1DT01NT04tTEFCRUw6IHRlc3RfdmdldF9sb3dfZjY0OgogICByZXR1cm4gdmdldF9sb3dfZjY0KGEpOwotICAvLyBDSEVDSy1ORVhUOiByZXQKKyAgLy8gQ0hFQ0stQ09NTU9OLU5FWFQ6IHJldAogfQogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1wb2x5MTI4LmMgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1wb2x5MTI4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5ZTU5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LXBvbHkxMjguYwpAQCAtMCwwICsxLDIxNSBAQAorLy8gUkVRVUlSRVM6IGFhcmNoNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBhcm02NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NC1ub25lLWxpbnV4LWdudSAtdGFyZ2V0LWZlYXR1cmUgK25lb24gXAorLy8gUlVOOiAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLIFwKKy8vIFJVTjogIC0tY2hlY2stcHJlZml4PUNIRUNLLUFBUkNINjQKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LW5vbmUtbGludXgtZ251IFwKKy8vIFJVTjogIC1mZnAtY29udHJhY3Q9ZmFzdCAtUyAtTzMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSyBcCisvLyBSVU46ICAtLWNoZWNrLXByZWZpeD1DSEVDSy1BUk02NAorCisvLyBUZXN0IG5ldyBhYXJjaDY0IGludHJpbnNpY3Mgd2l0aCBwb2x5MTI4CisvLyBGSVhNRTogQ3VycmVudGx5LCBwb2x5MTI4X3QgZXF1YWxzIHRvIHVpbnQxMjgsIHdoaWNoIHdpbGwgYmUgc3BpbHQgaW50bworLy8gdHdvIDY0LWJpdCBHUFIoZWcgWDAsIFgxKS4gTm93IG1vdmluZyBkYXRhIGZyb20gWDAsIFgxIHRvIEZQUjEyOCB3aWxsCisvLyBpbnRyb2R1Y2UgMiBzdG9yZSBhbmQgMSBsb2FkIGluc3RydWN0aW9ucyhzdG9yZSBYMCwgWDEgdG8gbWVtb3J5IGFuZAorLy8gdGhlbiBsb2FkIGJhY2sgdG8gUTApLiBJZiB0YXJnZXQgaGFzIE5FT04sIHRoaXMgaXMgYmV0dGVyIHJlcGxhY2VkIGJ5CisvLyBGTU9WIG9yIElOUy4KKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK3ZvaWQgdGVzdF92c3RycV9wMTI4KHBvbHkxMjhfdCAqIHB0ciwgcG9seTEyOF90IHZhbCkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3RycV9wMTI4CisgIHZzdHJxX3AxMjgocHRyLCB2YWwpOworLy8gQ0hFQ0stQUFSQ0g2NDogc3RyIHt7eFswLTldK319LCBbe3t4WzAtOV0rfX0sICM4XQorLy8gQ0hFQ0stQUFSQ0g2NC1ORVhUOiBzdHIgIHt7eFswLTldK319LCBbe3t4WzAtOV0rfX1dCisKKyAgLy8gQ0hFQ0stQVJNNjQ6IHN0cCB7e3hbMC05XSt9fSwge3t4WzAtOV0rfX0sIFt4MF0KK30KKworcG9seTEyOF90IHRlc3RfdmxkcnFfcDEyOChwb2x5MTI4X3QgKiBwdHIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkcnFfcDEyOAorICByZXR1cm4gdmxkcnFfcDEyOChwdHIpOworICAvLyBDSEVDSy1BQVJDSDY0OiBsZHIge3t4WzAtOV0rfX0sIFt7e3hbMC05XSt9fV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NC1ORVhUOiBsZHIge3t4WzAtOV0rfX0sIFt7e3hbMC05XSt9fSwgIzhdCisKKyAgLy8gQ0hFQ0stQVJNNjQ6IGxkcCB7e3hbMC05XSt9fSwge3t4WzAtOV0rfX0sIFt4MF0KK30KKwordm9pZCB0ZXN0X2xkX3N0X3AxMjgocG9seTEyOF90ICogcHRyKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X2xkX3N0X3AxMjgKKyAgIHZzdHJxX3AxMjgocHRyKzEsIHZsZHJxX3AxMjgocHRyKSk7CisgLy8gQ0hFQ0stQUFSQ0g2NDogbGRyIHt7cVswLTldK319LCBbe3t4WzAtOV0rfX1dCisgLy8gQ0hFQ0stQUFSQ0g2NC1ORVhUOiBzdHIge3txWzAtOV0rfX0sIFt7e3hbMC05XSt9fSwgIzE2XQorCisgLy8gQ0hFQ0stQVJNNjQ6IGxkcCBbW1BMTzp4WzAtOV0rXV0sIFtbUEhJOnhbMC05XStdXSwgW3t7eFswLTldK319XQorIC8vIENIRUNLLUFSTTY0LU5FWFQ6IHN0cCBbW1BMT11dLCBbW1BISV1dLCBbe3t4WzAtOV0rfX0sICMxNl0KK30KKworcG9seTEyOF90IHRlc3Rfdm11bGxfcDY0KHBvbHk2NF90IGEsIHBvbHk2NF90IGIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfdm11bGxfcDY0CisgIHJldHVybiB2bXVsbF9wNjQoYSwgYik7CisgIC8vIENIRUNLOiBwbXVsbCB7e3ZbMC05XSt9fS4xcSwge3t2WzAtOV0rfX0uMWQsIHt7dlswLTldK319LjFkCit9CisKK3BvbHkxMjhfdCB0ZXN0X3ZtdWxsX2hpZ2hfcDY0KHBvbHk2NHgyX3QgYSwgcG9seTY0eDJfdCBiKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZtdWxsX2hpZ2hfcDY0CisgIHJldHVybiB2bXVsbF9oaWdoX3A2NChhLCBiKTsKKyAgLy8gQ0hFQ0s6IHBtdWxsMiB7e3ZbMC05XSt9fS4xcSwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF9zOAorLy8gQ0hFQ0s6IHJldAorcG9seTEyOF90IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTI4X3M4KGludDh4MTZfdCBhKSB7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3AxMjhfczgoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF9zMTYKKy8vIENIRUNLOiByZXQKK3BvbHkxMjhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF9zMTYoaW50MTZ4OF90IGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfcDEyOF9zMTYoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF9zMzIKKy8vIENIRUNLOiByZXQKK3BvbHkxMjhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF9zMzIoaW50MzJ4NF90IGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfcDEyOF9zMzIoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF9zNjQKKy8vIENIRUNLOiByZXQKK3BvbHkxMjhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF9zNjQoaW50NjR4Ml90IGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfcDEyOF9zNjQoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF91OAorLy8gQ0hFQ0s6IHJldAorcG9seTEyOF90IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTI4X3U4KHVpbnQ4eDE2X3QgYSkgeworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wMTI4X3U4KGEpOworfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxMjhfdTE2CisvLyBDSEVDSzogcmV0Citwb2x5MTI4X3QgdGVzdF92cmVpbnRlcnByZXRxX3AxMjhfdTE2KHVpbnQxNng4X3QgYSkgeworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wMTI4X3UxNihhKTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTI4X3UzMgorLy8gQ0hFQ0s6IHJldAorcG9seTEyOF90IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTI4X3UzMih1aW50MzJ4NF90IGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfcDEyOF91MzIoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF91NjQKKy8vIENIRUNLOiByZXQKK3BvbHkxMjhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF91NjQodWludDY0eDJfdCBhKSB7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3AxMjhfdTY0KGEpOworfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxMjhfZjMyCisvLyBDSEVDSzogcmV0Citwb2x5MTI4X3QgdGVzdF92cmVpbnRlcnByZXRxX3AxMjhfZjMyKGZsb2F0MzJ4NF90IGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfcDEyOF9mMzIoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF9mNjQKKy8vIENIRUNLOiByZXQKK3BvbHkxMjhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF9mNjQoZmxvYXQ2NHgyX3QgYSkgeworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wMTI4X2Y2NChhKTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTI4X3A4CisvLyBDSEVDSzogcmV0Citwb2x5MTI4X3QgdGVzdF92cmVpbnRlcnByZXRxX3AxMjhfcDgocG9seTh4MTZfdCBhKSB7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3AxMjhfcDgoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF9wMTYKKy8vIENIRUNLOiByZXQKK3BvbHkxMjhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDEyOF9wMTYocG9seTE2eDhfdCBhKSB7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3AxMjhfcDE2KGEpOworfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3AxMjhfcDY0CisvLyBDSEVDSzogcmV0Citwb2x5MTI4X3QgdGVzdF92cmVpbnRlcnByZXRxX3AxMjhfcDY0KHBvbHk2NHgyX3QgYSkgeworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9wMTI4X3A2NChhKTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zOF9wMTI4CisvLyBDSEVDSzogcmV0CitpbnQ4eDE2X3QgdGVzdF92cmVpbnRlcnByZXRxX3M4X3AxMjgocG9seTEyOF90IGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfczhfcDEyOChhKTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfcDEyOAorLy8gQ0hFQ0s6IHJldAoraW50MTZ4OF90IHRlc3RfdnJlaW50ZXJwcmV0cV9zMTZfcDEyOChwb2x5MTI4X3QgIGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfczE2X3AxMjgoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczMyX3AxMjgKKy8vIENIRUNLOiByZXQKK2ludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfczMyX3AxMjgocG9seTEyOF90IGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfczMyX3AxMjgoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfczY0X3AxMjgKKy8vIENIRUNLOiByZXQKK2ludDY0eDJfdCB0ZXN0X3ZyZWludGVycHJldHFfczY0X3AxMjgocG9seTEyOF90ICBhKSB7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3M2NF9wMTI4KGEpOworfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U4X3AxMjgKKy8vIENIRUNLOiByZXQKK3VpbnQ4eDE2X3QgdGVzdF92cmVpbnRlcnByZXRxX3U4X3AxMjgocG9seTEyOF90ICBhKSB7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3U4X3AxMjgoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfdTE2X3AxMjgKKy8vIENIRUNLOiByZXQKK3VpbnQxNng4X3QgdGVzdF92cmVpbnRlcnByZXRxX3UxNl9wMTI4KHBvbHkxMjhfdCAgYSkgeworICByZXR1cm4gdnJlaW50ZXJwcmV0cV91MTZfcDEyOChhKTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV91MzJfcDEyOAorLy8gQ0hFQ0s6IHJldAordWludDMyeDRfdCB0ZXN0X3ZyZWludGVycHJldHFfdTMyX3AxMjgocG9seTEyOF90ICBhKSB7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3UzMl9wMTI4KGEpOworfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3U2NF9wMTI4CisvLyBDSEVDSzogcmV0Cit1aW50NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV91NjRfcDEyOChwb2x5MTI4X3QgIGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfdTY0X3AxMjgoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjMyX3AxMjgKKy8vIENIRUNLOiByZXQKK2Zsb2F0MzJ4NF90IHRlc3RfdnJlaW50ZXJwcmV0cV9mMzJfcDEyOChwb2x5MTI4X3QgIGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfZjMyX3AxMjgoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfZjY0X3AxMjgKKy8vIENIRUNLOiByZXQKK2Zsb2F0NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV9mNjRfcDEyOChwb2x5MTI4X3QgIGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfZjY0X3AxMjgoYSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZyZWludGVycHJldHFfcDhfcDEyOAorLy8gQ0hFQ0s6IHJldAorcG9seTh4MTZfdCB0ZXN0X3ZyZWludGVycHJldHFfcDhfcDEyOChwb2x5MTI4X3QgIGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfcDhfcDEyOChhKTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnJlaW50ZXJwcmV0cV9wMTZfcDEyOAorLy8gQ0hFQ0s6IHJldAorcG9seTE2eDhfdCB0ZXN0X3ZyZWludGVycHJldHFfcDE2X3AxMjgocG9seTEyOF90ICBhKSB7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3AxNl9wMTI4KGEpOworfQorCisvLyBDSEVDSy1MQUJFTDogdGVzdF92cmVpbnRlcnByZXRxX3A2NF9wMTI4CisvLyBDSEVDSzogcmV0Citwb2x5NjR4Ml90IHRlc3RfdnJlaW50ZXJwcmV0cV9wNjRfcDEyOChwb2x5MTI4X3QgIGEpIHsKKyAgcmV0dXJuIHZyZWludGVycHJldHFfcDY0X3AxMjgoYSk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtcG9seTY0LmMgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1wb2x5NjQuYwppbmRleCAzZTE5NTAxLi5jMDcxMTQ3IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC1wb2x5NjQuYworKysgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC1wb2x5NjQuYwpAQCAtMSwyODIgKzEsMjk5IEBACiAvLyBSRVFVSVJFUzogYWFyY2g2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCi0vLyBSVU46ICAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICAtZmZwLWNvbnRyYWN0PWZhc3QgLVMgLU8zIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0sgXAorLy8gUlVOOiAgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQUFSQ0g2NAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtbm9uZS1saW51eC1nbnUgXAorLy8gUlVOOiAgLWZmcC1jb250cmFjdD1mYXN0IC1TIC1PMyAtbyAtICVzIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLIFwKKy8vIFJVTjogIC0tY2hlY2stcHJlZml4PUNIRUNLLUFSTTY0CiAKIC8vIFRlc3QgbmV3IGFhcmNoNjQgaW50cmluc2ljcyB3aXRoIHBvbHk2NAogCiAjaW5jbHVkZSA8YXJtX25lb24uaD4KIAogdWludDY0eDFfdCB0ZXN0X3ZjZXFfcDY0KHBvbHk2NHgxX3QgYSwgcG9seTY0eDFfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZXFfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjZXFfcDY0CiAgIHJldHVybiB2Y2VxX3A2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IGNtZXEge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiB1aW50NjR4Ml90IHRlc3RfdmNlcXFfcDY0KHBvbHk2NHgyX3QgYSwgcG9seTY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZjZXFxX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y2VxcV9wNjQKICAgcmV0dXJuIHZjZXFxX3A2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IGNtZXEge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiB1aW50NjR4MV90IHRlc3RfdnRzdF9wNjQocG9seTY0eDFfdCBhLCBwb2x5NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRzdF9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRzdF9wNjQKICAgcmV0dXJuIHZ0c3RfcDY0KGEsIGIpOwogICAvLyBDSEVDSzogY210c3Qge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQogfQogCiB1aW50NjR4Ml90IHRlc3RfdnRzdHFfcDY0KHBvbHk2NHgyX3QgYSwgcG9seTY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0c3RxX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHN0cV9wNjQKICAgcmV0dXJuIHZ0c3RxX3A2NChhLCBiKTsKICAgLy8gQ0hFQ0s6IGNtdHN0IHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogcG9seTY0eDFfdCB0ZXN0X3Zic2xfcDY0KHBvbHk2NHgxX3QgYSwgcG9seTY0eDFfdCBiLCBwb2x5NjR4MV90IGMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmJzbF9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmJzbF9wNjQKICAgcmV0dXJuIHZic2xfcDY0KGEsIGIsIGMpOwogICAvLyBDSEVDSzogYnNsIHt7dlswLTldK319LjhiLCB7e3ZbMC05XSt9fS44Yiwge3t2WzAtOV0rfX0uOGIKIH0KIAogcG9seTY0eDJfdCB0ZXN0X3Zic2xxX3A2NChwb2x5NjR4Ml90IGEsIHBvbHk2NHgyX3QgYiwgcG9seTY0eDJfdCBjKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zic2xxX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92YnNscV9wNjQKICAgcmV0dXJuIHZic2xxX3A2NChhLCBiLCBjKTsKICAgLy8gQ0hFQ0s6IGJzbCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiCiB9CiAKIHBvbHk2NF90IHRlc3RfdmdldF9sYW5lX3A2NChwb2x5NjR4MV90IHYpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmdldF9sYW5lX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Z2V0X2xhbmVfcDY0CiAgIHJldHVybiB2Z2V0X2xhbmVfcDY0KHYsIDApOwogICAvLyBDSEVDSzogZm1vdiAge3t4WzAtOV0rfX0sIHt7ZFswLTldK319CiB9CiAKIHBvbHk2NF90IHRlc3RfdmdldHFfbGFuZV9wNjQocG9seTY0eDJfdCB2KSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZnZXRxX2xhbmVfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZnZXRxX2xhbmVfcDY0CiAgIHJldHVybiB2Z2V0cV9sYW5lX3A2NCh2LCAxKTsKICAgLy8gQ0hFQ0s6IHVtb3YgIHt7eFswLTldK319LCB7e3ZbMC05XSt9fS5kWzFdCiB9CiAKIHBvbHk2NHgxX3QgdGVzdF92c2V0X2xhbmVfcDY0KHBvbHk2NF90IGEsIHBvbHk2NHgxX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92c2V0X2xhbmVfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzZXRfbGFuZV9wNjQKICAgcmV0dXJuIHZzZXRfbGFuZV9wNjQoYSwgdiwgMCk7CiAgIC8vIENIRUNLOiBmbW92ICB7e2RbMC05XSt9fSwge3t4WzAtOV0rfX0KIH0KIAogcG9seTY0eDJfdCB0ZXN0X3ZzZXRxX2xhbmVfcDY0KHBvbHk2NF90IGEsIHBvbHk2NHgyX3QgdikgewotICAvLyBDSEVDSzogdGVzdF92c2V0cV9sYW5lX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0cV9sYW5lX3A2NAogICByZXR1cm4gdnNldHFfbGFuZV9wNjQoYSwgdiwgMSk7CiAgIC8vIENIRUNLOiBpbnMgIHt7dlswLTldK319LmRbMV0sIHt7eFswLTldK319CiB9CiAKIHBvbHk2NHgxX3QgdGVzdF92Y29weV9sYW5lX3A2NChwb2x5NjR4MV90IGEsIHBvbHk2NHgxX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92Y29weV9sYW5lX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weV9sYW5lX3A2NAogICByZXR1cm4gdmNvcHlfbGFuZV9wNjQoYSwgMCwgYiwgMCk7Ci0gIC8vIENIRUNLOiBmbW92ICB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogZm1vdiAge3tkWzAtOV0rfX0sIHt7ZFswLTldK319CisKKyAgLy8gQ0hFQ0stQVJNNjQ6IG9yciB2MC4xNmIsIHYxLjE2YiwgdjEuMTZiCiB9CiAKIHBvbHk2NHgyX3QgdGVzdF92Y29weXFfbGFuZV9wNjQocG9seTY0eDJfdCBhLCBwb2x5NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvcHlxX2xhbmVfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lX3A2NAogICByZXR1cm4gdmNvcHlxX2xhbmVfcDY0KGEsIDEsIGIsIDApOwogICAvLyBDSEVDSzogaW5zICB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCiB9CiAKIHBvbHk2NHgyX3QgdGVzdF92Y29weXFfbGFuZXFfcDY0KHBvbHk2NHgyX3QgYSwgcG9seTY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Zjb3B5cV9sYW5lcV9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVxX3A2NAogICByZXR1cm4gdmNvcHlxX2xhbmVxX3A2NChhLCAxLCBiLCAxKTsKLSAgLy8gQ0hFQ0s6IGlucyAge3t2WzAtOV0rfX0uZFsxXSwge3t2WzAtOV0rfX0uZFsxXQorICAvLyBDSEVDSy1BQVJDSDY0OiBpbnMgIHt7dlswLTldK319LmRbMV0sIHt7dlswLTldK319LmRbMV0KIH0KIAogcG9seTY0eDFfdCB0ZXN0X3ZjcmVhdGVfcDY0KHVpbnQ2NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNyZWF0ZV9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNyZWF0ZV9wNjQKICAgcmV0dXJuIHZjcmVhdGVfcDY0KGEpOwogICAvLyBDSEVDSzogZm1vdiAge3tkWzAtOV0rfX0sIHt7eFswLTldK319CiB9CiAKIHBvbHk2NHgxX3QgdGVzdF92ZHVwX25fcDY0KHBvbHk2NF90IGEpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cF9uX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwX25fcDY0CiAgIHJldHVybiB2ZHVwX25fcDY0KGEpOwogICAvLyBDSEVDSzogZm1vdiB7e2RbMC05XSt9fSwge3t4WzAtOV0rfX0KIH0KIHBvbHk2NHgyX3QgdGVzdF92ZHVwcV9uX3A2NChwb2x5NjRfdCBhKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZkdXBfbl9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbl9wNjQKICAgcmV0dXJuIHZkdXBxX25fcDY0KGEpOwogICAvLyBDSEVDSzogZHVwIHt7dlswLTldK319LjJkLCB7e3hbMC05XSt9fQogfQogCiBwb2x5NjR4MV90IHRlc3RfdmR1cF9sYW5lX3A2NChwb2x5NjR4MV90IHZlYykgewotICAvLyBDSEVDSzogdGVzdF92ZHVwX2xhbmVfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbGFuZV9wNjQKICAgcmV0dXJuIHZkdXBfbGFuZV9wNjQodmVjLCAwKTsKICAgLy8gQ0hFQ0s6IHJldAogfQogCiBwb2x5NjR4Ml90IHRlc3RfdmR1cHFfbGFuZV9wNjQocG9seTY0eDFfdCB2ZWMpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmR1cHFfbGFuZV9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZV9wNjQKICAgcmV0dXJuIHZkdXBxX2xhbmVfcDY0KHZlYywgMCk7CiAgIC8vIENIRUNLOiBkdXAge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LmRbMF0KIH0KIAogcG9seTY0eDJfdCB0ZXN0X3ZkdXBxX2xhbmVxX3A2NChwb2x5NjR4Ml90IHZlYykgewotICAvLyBDSEVDSzogdGVzdF92ZHVwcV9sYW5lcV9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbGFuZXFfcDY0CiAgIHJldHVybiB2ZHVwcV9sYW5lcV9wNjQodmVjLCAxKTsKICAgLy8gQ0hFQ0s6IGR1cCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uZFsxXQogfQogCiBwb2x5NjR4Ml90IHRlc3RfdmNvbWJpbmVfcDY0KHBvbHk2NHgxX3QgbG93LCBwb2x5NjR4MV90IGhpZ2gpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmNvbWJpbmVfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb21iaW5lX3A2NAogICByZXR1cm4gdmNvbWJpbmVfcDY0KGxvdywgaGlnaCk7CiAgIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uZFsxXSwge3t2WzAtOV0rfX0uZFswXQogfQogCiBwb2x5NjR4MV90IHRlc3RfdmxkMV9wNjQocG9seTY0X3QgY29uc3QgKiBwdHIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmxkMV9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMV9wNjQKICAgcmV0dXJuIHZsZDFfcDY0KHB0cik7Ci0gIC8vIENIRUNLOiAgbGQxIHt7e3ZbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogIGxkMSB7e3t2WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLLUFSTTY0OiBsZHIge3tkWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTY0eDJfdCB0ZXN0X3ZsZDFxX3A2NChwb2x5NjRfdCBjb25zdCAqIHB0cikgewotICAvLyBDSEVDSzogdGVzdF92bGQxcV9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMXFfcDY0CiAgIHJldHVybiB2bGQxcV9wNjQocHRyKTsKLSAgLy8gQ0hFQ0s6ICBsZDEge3t7dlswLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSy1BQVJDSDY0OiAgbGQxIHt7e3ZbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0stQVJNNjQ6IGxkciB7e3FbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0MV9wNjQocG9seTY0X3QgKiBwdHIsIHBvbHk2NHgxX3QgdmFsKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZzdDFfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFfcDY0CiAgIHJldHVybiB2c3QxX3A2NChwdHIsIHZhbCk7Ci0gIC8vIENIRUNLOiAgc3QxIHt7e3ZbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogIHN0MSB7e3t2WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLLUFSTTY0OiBzdHIge3tkWzAtOV0rfX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDFxX3A2NChwb2x5NjRfdCAqIHB0ciwgcG9seTY0eDJfdCB2YWwpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0MXFfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDFxX3A2NAogICByZXR1cm4gdnN0MXFfcDY0KHB0ciwgdmFsKTsKLSAgLy8gQ0hFQ0s6ICBzdDEge3t7dlswLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSy1BQVJDSDY0OiAgc3QxIHt7e3ZbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0stQVJNNjQ6IHN0ciB7e3FbMC05XSt9fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5NjR4MXgyX3QgdGVzdF92bGQyX3A2NChwb2x5NjRfdCBjb25zdCAqIHB0cikgewotICAvLyBDSEVDSzogdGVzdF92bGQyX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQyX3A2NAogICByZXR1cm4gdmxkMl9wNjQocHRyKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7e3t2WzAtOV0rfX0uMWQsIHt7dlswLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyAqdlswLTldKy4xZCwgdlswLTldKy4xZCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk2NHgyeDJfdCB0ZXN0X3ZsZDJxX3A2NChwb2x5NjRfdCBjb25zdCAqIHB0cikgewotICAvLyBDSEVDSzogdGVzdF92bGQycV9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkMnFfcDY0CiAgIHJldHVybiB2bGQycV9wNjQocHRyKTsKLSAgLy8gQ0hFQ0s6IGxkMiB7e3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQyIHt7eyAqdlswLTldKy4yZCwgdlswLTldKy4yZCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk2NHgxeDNfdCB0ZXN0X3ZsZDNfcDY0KHBvbHk2NF90IGNvbnN0ICogcHRyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDNfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZsZDNfcDY0CiAgIHJldHVybiB2bGQzX3A2NChwdHIpOwotICAvLyBDSEVDSzogbGQxIHt7e3ZbMC05XSt9fS4xZCwge3t2WzAtOV0rfX0uMWQsIHt7dlswLTldK319LjFkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogbGQxIHt7eyAqdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHBvbHk2NHgyeDNfdCB0ZXN0X3ZsZDNxX3A2NChwb2x5NjRfdCBjb25zdCAqIHB0cikgewotICAvLyBDSEVDSzogdGVzdF92bGQzcV9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmxkM3FfcDY0CiAgIHJldHVybiB2bGQzcV9wNjQocHRyKTsKLSAgLy8gQ0hFQ0s6IGxkMyB7e3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkMyB7e3sgKnZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5NjR4MXg0X3QgdGVzdF92bGQ0X3A2NChwb2x5NjRfdCBjb25zdCAqIHB0cikgewotICAvLyBDSEVDSzogdGVzdF92bGQ0X3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0X3A2NAogICByZXR1cm4gdmxkNF9wNjQocHRyKTsKLSAgLy8gQ0hFQ0s6IGxkMSB7e3t2WzAtOV0rfX0uMWQsIHt7dlswLTldK319LjFkLCB7e3ZbMC05XSt9fS4xZCwge3t2WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiBsZDEge3t7ICp2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkLCB2WzAtOV0rLjFkICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogcG9seTY0eDJ4NF90IHRlc3RfdmxkNHFfcDY0KHBvbHk2NF90IGNvbnN0ICogcHRyKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3ZsZDRxX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bGQ0cV9wNjQKICAgcmV0dXJuIHZsZDRxX3A2NChwdHIpOwotICAvLyBDSEVDSzogbGQ0IHt7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6IGxkNCB7e3sgKnZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0Ml9wNjQocG9seTY0X3QgKiBwdHIsIHBvbHk2NHgxeDJfdCB2YWwpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0Ml9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0Ml9wNjQKICAgcmV0dXJuIHZzdDJfcDY0KHB0ciwgdmFsKTsKLSAgLy8gQ0hFQ0s6ICBzdDEge3t7dlswLTldK319LjFkLCB7e3ZbMC05XSt9fS4xZH0sIFt7e3hbMC05XSt8c3B9fV0KKyAgLy8gQ0hFQ0s6ICBzdDEge3t7ICp2WzAtOV0rLjFkLCB2WzAtOV0rLjFkICp9fX0sIFt7e3hbMC05XSt8c3B9fV0KIH0KIAogdm9pZCB0ZXN0X3ZzdDJxX3A2NChwb2x5NjRfdCAqIHB0ciwgcG9seTY0eDJ4Ml90IHZhbCkgewotICAvLyBDSEVDSzogdGVzdF92c3QycV9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0MnFfcDY0CiAgIHJldHVybiB2c3QycV9wNjQocHRyLCB2YWwpOwotICAvLyBDSEVDSzogIHN0MiB7e3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogIHN0MiB7e3sgKnZbMC05XSsuMmQsIHZbMC05XSsuMmQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCiB2b2lkIHRlc3RfdnN0M19wNjQocG9seTY0X3QgKiBwdHIsIHBvbHk2NHgxeDNfdCB2YWwpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0M19wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnN0M19wNjQKICAgcmV0dXJuIHZzdDNfcDY0KHB0ciwgdmFsKTsKLSAgLy8gQ0hFQ0s6ICBzdDEge3t7dlswLTldK319LjFkLCB7e3ZbMC05XSt9fS4xZCwge3t2WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiAgc3QxIHt7eyAqdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3QzcV9wNjQocG9seTY0X3QgKiBwdHIsIHBvbHk2NHgyeDNfdCB2YWwpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0M3FfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDNxX3A2NAogICByZXR1cm4gdnN0M3FfcDY0KHB0ciwgdmFsKTsKLSAgLy8gQ0hFQ0s6ICBzdDMge3t7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiAgc3QzIHt7eyAqdlswLTldKy4yZCwgdlswLTldKy4yZCwgdlswLTldKy4yZCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3Q0X3A2NChwb2x5NjRfdCAqIHB0ciwgcG9seTY0eDF4NF90IHZhbCkgewotICAvLyBDSEVDSzogdGVzdF92c3Q0X3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3Q0X3A2NAogICByZXR1cm4gdnN0NF9wNjQocHRyLCB2YWwpOwotICAvLyBDSEVDSzogIHN0MSB7e3t2WzAtOV0rfX0uMWQsIHt7dlswLTldK319LjFkLCB7e3ZbMC05XSt9fS4xZCwge3t2WzAtOV0rfX0uMWR9LCBbe3t4WzAtOV0rfHNwfX1dCisgIC8vIENIRUNLOiAgc3QxIHt7eyAqdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCwgdlswLTldKy4xZCAqfX19LCBbe3t4WzAtOV0rfHNwfX1dCiB9CiAKIHZvaWQgdGVzdF92c3Q0cV9wNjQocG9seTY0X3QgKiBwdHIsIHBvbHk2NHgyeDRfdCB2YWwpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnN0NHFfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzdDRxX3A2NAogICByZXR1cm4gdnN0NHFfcDY0KHB0ciwgdmFsKTsKLSAgLy8gQ0hFQ0s6ICBzdDQge3t7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkfSwgW3t7eFswLTldK3xzcH19XQorICAvLyBDSEVDSzogIHN0NCB7e3sgKnZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQsIHZbMC05XSsuMmQgKn19fSwgW3t7eFswLTldK3xzcH19XQogfQogCiBwb2x5NjR4MV90IHRlc3RfdmV4dF9wNjQocG9seTY0eDFfdCBhLCBwb2x5NjR4MV90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmV4dF9wNjQKICAgcmV0dXJuIHZleHRfdTY0KGEsIGIsIDApOwogCiB9CiAKIHBvbHk2NHgyX3QgdGVzdF92ZXh0cV9wNjQocG9seTY0eDJfdCBhLCBwb2x5NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdmV4dHFfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZleHRxX3A2NAogICByZXR1cm4gdmV4dHFfcDY0KGEsIGIsIDEpOwotICAvLyBDSEVDSzogZXh0IHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7e3ZbMC05XSt9fS4xNmIsICMweDgKKyAgLy8gQ0hFQ0s6IGV4dCB7e3ZbMC05XSt9fS4xNmIsIHt7dlswLTldK319LjE2Yiwge3t2WzAtOV0rfX0uMTZiLCB7eyMweDh8Izh9fQogfQogCiBwb2x5NjR4Ml90IHRlc3RfdnppcDFxX3A2NChwb2x5NjR4Ml90IGEsIHBvbHk2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92emlwMXFfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z6aXAxcV9wNjQKICAgcmV0dXJuIHZ6aXAxcV9wNjQoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uZFsxXSwge3t2WzAtOV0rfX0uZFswXQorICAvLyBDSEVDSy1BQVJDSDY0OiBpbnMge3t2WzAtOV0rfX0uZFsxXSwge3t2WzAtOV0rfX0uZFswXQorICAvLyBDSEVDSy1BUk02NDogemlwMSB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIHBvbHk2NHgyX3QgdGVzdF92emlwMnFfcDY0KHBvbHk2NHgyX3QgYSwgcG9seTY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z6aXAycV9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnppcDJxX3A2NAogICByZXR1cm4gdnppcDJxX3U2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzBdLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFBUkNINjQ6IGlucyB7e3ZbMC05XSt9fS5kWzBdLCB7e3ZbMC05XSt9fS5kWzFdCisgIC8vIENIRUNLLUFSTTY0OiB6aXAyIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogcG9seTY0eDJfdCB0ZXN0X3Z1enAxcV9wNjQocG9seTY0eDJfdCBhLCBwb2x5NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnV6cDFxX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dXpwMXFfcDY0CiAgIHJldHVybiB2dXpwMXFfcDY0KGEsIGIpOwotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmRbMV0sIHt7dlswLTldK319LmRbMF0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogaW5zIHt7dlswLTldK319LmRbMV0sIHt7dlswLTldK319LmRbMF0KKyAgLy8gQ0hFQ0stQVJNNjQ6IHppcDEge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBwb2x5NjR4Ml90IHRlc3RfdnV6cDJxX3A2NChwb2x5NjR4Ml90IGEsIHBvbHk2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92dXpwMnFfcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Z1enAycV9wNjQKICAgcmV0dXJuIHZ1enAycV91NjQoYSwgYik7Ci0gIC8vIENIRUNLOiBpbnMge3t2WzAtOV0rfX0uZFswXSwge3t2WzAtOV0rfX0uZFsxXQorICAvLyBDSEVDSy1BQVJDSDY0OiBpbnMge3t2WzAtOV0rfX0uZFswXSwge3t2WzAtOV0rfX0uZFsxXQorICAvLyBDSEVDSy1BUk02NDogemlwMiB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkCiB9CiAKIHBvbHk2NHgyX3QgdGVzdF92dHJuMXFfcDY0KHBvbHk2NHgyX3QgYSwgcG9seTY0eDJfdCBiKSB7Ci0gIC8vIENIRUNLOiB0ZXN0X3Z0cm4xcV9wNjQKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnRybjFxX3A2NAogICByZXR1cm4gdnRybjFxX3A2NChhLCBiKTsKLSAgLy8gQ0hFQ0s6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLLUFBUkNINjQ6IGlucyB7e3ZbMC05XSt9fS5kWzFdLCB7e3ZbMC05XSt9fS5kWzBdCisgIC8vIENIRUNLLUFSTTY0OiB6aXAxIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwge3t2WzAtOV0rfX0uMmQKIH0KIAogcG9seTY0eDJfdCB0ZXN0X3Z0cm4ycV9wNjQocG9seTY0eDJfdCBhLCBwb2x5NjR4Ml90IGIpIHsKLSAgLy8gQ0hFQ0s6IHRlc3RfdnRybjJxX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92dHJuMnFfcDY0CiAgIHJldHVybiB2dHJuMnFfdTY0KGEsIGIpOwotICAvLyBDSEVDSzogaW5zIHt7dlswLTldK319LmRbMF0sIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQUFSQ0g2NDogaW5zIHt7dlswLTldK319LmRbMF0sIHt7dlswLTldK319LmRbMV0KKyAgLy8gQ0hFQ0stQVJNNjQ6IHppcDIge3t2WzAtOV0rfX0uMmQsIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZAogfQogCiBwb2x5NjR4MV90IHRlc3RfdnNyaV9uX3A2NChwb2x5NjR4MV90IGEsIHBvbHk2NHgxX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JpX25fcDY0CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zzcmlfbl9wNjQKICAgcmV0dXJuIHZzcmlfbl9wNjQoYSwgYiwgMzMpOwogICAvLyBDSEVDSzogc3JpIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzMzCiB9CiAKIHBvbHk2NHgyX3QgdGVzdF92c3JpcV9uX3A2NChwb2x5NjR4Ml90IGEsIHBvbHk2NHgyX3QgYikgewotICAvLyBDSEVDSzogdGVzdF92c3JpcV9uX3A2NAorICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c3JpcV9uX3A2NAogICByZXR1cm4gdnNyaXFfbl9wNjQoYSwgYiwgNjQpOwogICAvLyBDSEVDSzogc3JpIHt7dlswLTldK319LjJkLCB7e3ZbMC05XSt9fS4yZCwgIzY0CiB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYWFyY2g2NC10eXBlLXNpemVzLmMgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC10eXBlLXNpemVzLmMKaW5kZXggM2I5YzlmYy4uZjllNTVmNyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtdHlwZS1zaXplcy5jCisrKyBiL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LXR5cGUtc2l6ZXMuYwpAQCAtMSw3ICsxLDExIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC1lbWl0LWxsdm0gLXcgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NC1ub25lLWxpbnV4LWdudSAtZW1pdC1sbHZtIC13IC1vIC0gJXMgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTEUgJXMKIAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NF9iZS1ub25lLWxpbnV4LWdudSAtZW1pdC1sbHZtIC13IC1vIC0gJXMgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQkUgJXMKIC8vIGNoYXIgYnkgZGVmaW5pdGlvbiBoYXMgc2l6ZSAxCiAKKy8vIENIRUNLLUxFOiB0YXJnZXQgZGF0YWxheW91dCA9ICJlLW06ZS1pNjQ6NjQtaTEyODoxMjgtbjMyOjY0LVMxMjgiCisvLyBDSEVDSy1CRTogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiRS1tOmUtaTY0OjY0LWkxMjg6MTI4LW4zMjo2NC1TMTI4IgorCiBpbnQgY2hlY2tfc2hvcnQoKSB7CiAgIHJldHVybiBzaXplb2Yoc2hvcnQpOwogLy8gQ0hFQ0s6IHJldCBpMzIgMgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FhcmNoNjQtdmFyYXJncy5jIGIvdGVzdC9Db2RlR2VuL2FhcmNoNjQtdmFyYXJncy5jCmluZGV4IDNkOWNkODYuLjA1Mzk4MmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9hYXJjaDY0LXZhcmFyZ3MuYworKysgYi90ZXN0L0NvZGVHZW4vYWFyY2g2NC12YXJhcmdzLmMKQEAgLTEsNCArMSw3IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0IC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NCAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSyAtLWNoZWNrLXByZWZpeD1DSEVDSy1MRSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NF9iZSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQkUgJXMgCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1saW51eC1nbnUgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLIC0tY2hlY2stcHJlZml4PUNIRUNLLUxFICVzCisKICNpbmNsdWRlIDxzdGRhcmcuaD4KIAogLy8gT2J2aW91c2x5IHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSB3YXkgdG8gaW1wbGVtZW50IHZhX2FyZy4gVGhpcyB0ZXN0IHNob3VsZCBhdApAQCAtMjIsNiArMjUsOSBAQAogLy8gQ0hFQ0s6IFtbVkFBUkdfSU5fUkVHXV0KIC8vIENIRUNLOiBbW1JFR19UT1A6JVthLXpfMC05XStdXSA9IGxvYWQgaTgqKiBnZXRlbGVtZW50cHRyIGluYm91bmRzICglc3RydWN0Ll9fdmFfbGlzdCogQHRoZV9saXN0LCBpMzIgMCwgaTMyIDEpCiAvLyBDSEVDSzogW1tSRUdfQUREUjolW2Etel8wLTldK11dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tSRUdfVE9QXV0sIGkzMiBbW0dSX09GRlNdXQorLy8gQ0hFQ0stQkU6IFtbUkVHX0FERFJfVkFMOiVbMC05XStdXSA9IHB0cnRvaW50IGk4KiBbW1JFR19BRERSXV0gdG8gaTY0CisvLyBDSEVDSy1CRTogW1tSRUdfQUREUl9WQUxfQUxJR05FRDolW2Etel8wLTldKl1dID0gYWRkIGk2NCBbW1JFR19BRERSX1ZBTF1dLCA0CisvLyBDSEVDSy1CRTogW1tSRUdfQUREUjolWzAtOV0rXV0gPSBpbnR0b3B0ciBpNjQgW1tSRUdfQUREUl9WQUxfQUxJR05FRF1dIHRvIGk4KgogLy8gQ0hFQ0s6IFtbRlJPTVJFR19BRERSOiVbYS16XzAtOV0rXV0gPSBiaXRjYXN0IGk4KiBbW1JFR19BRERSXV0gdG8gaTMyKgogLy8gQ0hFQ0s6IGJyIGxhYmVsICVbW1ZBQVJHX0VORDpbYS16Ll8wLTldK11dCiAKQEAgLTI5LDYgKzM1LDkgQEAKIC8vIENIRUNLOiBbW1NUQUNLOiVbYS16XzAtOV0rXV0gPSBsb2FkIGk4KiogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoJXN0cnVjdC5fX3ZhX2xpc3QqIEB0aGVfbGlzdCwgaTMyIDAsIGkzMiAwKQogLy8gQ0hFQ0s6IFtbTkVXX1NUQUNLOiVbYS16XzAtOV0rXV0gPSBnZXRlbGVtZW50cHRyIGk4KiBbW1NUQUNLXV0sIGkzMiA4CiAvLyBDSEVDSzogc3RvcmUgaTgqIFtbTkVXX1NUQUNLXV0sIGk4KiogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoJXN0cnVjdC5fX3ZhX2xpc3QqIEB0aGVfbGlzdCwgaTMyIDAsIGkzMiAwKQorLy8gQ0hFQ0stQkU6IFtbU1RBQ0tfVkFMOiVbMC05XStdXSA9IHB0cnRvaW50IGk4KiBbW1NUQUNLXV0gdG8gaTY0CisvLyBDSEVDSy1CRTogW1tTVEFDS19WQUxfQUxJR05FRDolW2Etel8wLTldKl1dID0gYWRkIGk2NCBbW1NUQUNLX1ZBTF1dLCA0CisvLyBDSEVDSy1CRTogW1tTVEFDSzolWzAtOV0rXV0gPSBpbnR0b3B0ciBpNjQgW1tTVEFDS19WQUxfQUxJR05FRF1dIHRvIGk4KgogLy8gQ0hFQ0s6IFtbRlJPTVNUQUNLX0FERFI6JVthLXpfMC05XStdXSA9IGJpdGNhc3QgaTgqIFtbU1RBQ0tdXSB0byBpMzIqCiAvLyBDSEVDSzogYnIgbGFiZWwgJVtbVkFBUkdfRU5EXV0KIApAQCAtMTU0LDcgKzE2Myw3IEBACiAgIHJldHVybiB2YV9hcmcodGhlX2xpc3QsIGRvdWJsZSk7CiAvLyBDSEVDSzogW1tWUl9PRkZTOiVbYS16XzAtOV0rXV0gPSBsb2FkIGkzMiogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoJXN0cnVjdC5fX3ZhX2xpc3QqIEB0aGVfbGlzdCwgaTMyIDAsIGkzMiA0KQogLy8gQ0hFQ0s6IFtbRUFSTFlfT05TVEFDSzolW2Etel8wLTldK11dID0gaWNtcCBzZ2UgaTMyIFtbVlJfT0ZGU11dLCAwCi0vLyBDSEVDSzogYnIgaTEgW1tFQVJMWV9PTlNUQUNLXV0sIGxhYmVsICVbW1ZBQVJHX09OX1NUQUNLXV0sIGxhYmVsICVbW1ZBQVJHX01BWUJFX1JFR11dCisvLyBDSEVDSzogYnIgaTEgW1tFQVJMWV9PTlNUQUNLXV0sIGxhYmVsICVbW1ZBQVJHX09OX1NUQUNLOlthLXpfLjAtOV0rXV0sIGxhYmVsICVbW1ZBQVJHX01BWUJFX1JFR11dCiAKIC8vIENIRUNLOiBbW1ZBQVJHX01BWUJFX1JFR11dCiAvLyBDSEVDSzogW1tORVdfUkVHX09GRlM6JVthLXpfMC05XStdXSA9IGFkZCBpMzIgW1tWUl9PRkZTXV0sIDE2CkBAIC0xNjUsOCArMTc0LDExIEBACiAvLyBDSEVDSzogW1tWQUFSR19JTl9SRUddXQogLy8gQ0hFQ0s6IFtbUkVHX1RPUDolW2Etel8wLTldK11dID0gbG9hZCBpOCoqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKCVzdHJ1Y3QuX192YV9saXN0KiBAdGhlX2xpc3QsIGkzMiAwLCBpMzIgMikKIC8vIENIRUNLOiBbW1JFR19BRERSOiVbYS16XzAtOV0rXV0gPSBnZXRlbGVtZW50cHRyIGk4KiBbW1JFR19UT1BdXSwgaTMyIFtbVlJfT0ZGU11dCisvLyBDSEVDSy1CRTogW1tSRUdfQUREUl9WQUw6JVswLTldK11dID0gcHRydG9pbnQgaTgqIFtbUkVHX0FERFJdXSB0byBpNjQKKy8vIENIRUNLLUJFOiBbW1JFR19BRERSX1ZBTF9BTElHTkVEOiVbYS16XzAtOV0qXV0gPSBhZGQgaTY0IFtbUkVHX0FERFJfVkFMXV0sIDgKKy8vIENIRUNLLUJFOiBbW1JFR19BRERSOiVbMC05XStdXSA9IGludHRvcHRyIGk2NCBbW1JFR19BRERSX1ZBTF9BTElHTkVEXV0gdG8gaTgqCiAvLyBDSEVDSzogW1tGUk9NUkVHX0FERFI6JVthLXpfMC05XStdXSA9IGJpdGNhc3QgaTgqIFtbUkVHX0FERFJdXSB0byBkb3VibGUqCi0vLyBDSEVDSzogYnIgbGFiZWwgJVtbVkFBUkdfRU5EXV0KKy8vIENIRUNLOiBiciBsYWJlbCAlW1tWQUFSR19FTkQ6W2Etei5fMC05XStdXQogCiAvLyBDSEVDSzogW1tWQUFSR19PTl9TVEFDS11dCiAvLyBDSEVDSzogW1tTVEFDSzolW2Etel8wLTldK11dID0gbG9hZCBpOCoqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKCVzdHJ1Y3QuX192YV9saXN0KiBAdGhlX2xpc3QsIGkzMiAwLCBpMzIgMCkKQEAgLTIwMSwxMiArMjEzLDE0IEBACiAvLyBDSEVDSzogW1tWQUFSR19JTl9SRUddXQogLy8gQ0hFQ0s6IFtbUkVHX1RPUDolW2Etel8wLTldK11dID0gbG9hZCBpOCoqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKCVzdHJ1Y3QuX192YV9saXN0KiBAdGhlX2xpc3QsIGkzMiAwLCBpMzIgMikKIC8vIENIRUNLOiBbW0ZJUlNUX1JFRzolW2Etel8wLTldK11dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tSRUdfVE9QXV0sIGkzMiBbW1ZSX09GRlNdXQotLy8gQ0hFQ0s6IFtbRUxfQUREUjolW2Etel8wLTldK11dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tGSVJTVF9SRUddXSwgaTMyIDAKKy8vIENIRUNLLUxFOiBbW0VMX0FERFI6JVthLXpfMC05XStdXSA9IGdldGVsZW1lbnRwdHIgaTgqIFtbRklSU1RfUkVHXV0sIGkzMiAwCisvLyBDSEVDSy1CRTogW1tFTF9BRERSOiVbYS16XzAtOV0rXV0gPSBnZXRlbGVtZW50cHRyIGk4KiBbW0ZJUlNUX1JFR11dLCBpMzIgMTIKIC8vIENIRUNLOiBbW0VMX1RZUEVEOiVbYS16XzAtOV0rXV0gPSBiaXRjYXN0IGk4KiBbW0VMX0FERFJdXSB0byBmbG9hdCoKIC8vIENIRUNLOiBbW0VMX1RNUEFERFI6JVthLXpfMC05XStdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgWzIgeCBmbG9hdF0qICVbW1RNUF9IRkE6W2Etel8uMC05XStdXSwgaTMyIDAsIGkzMiAwCiAvLyBDSEVDSzogW1tFTDolW2Etel8wLTldK11dID0gbG9hZCBmbG9hdCogW1tFTF9UWVBFRF1dCiAvLyBDSEVDSzogc3RvcmUgZmxvYXQgW1tFTF1dLCBmbG9hdCogW1tFTF9UTVBBRERSXV0KLS8vIENIRUNLOiBbW0VMX0FERFI6JVthLXpfMC05XStdXSA9IGdldGVsZW1lbnRwdHIgaTgqIFtbRklSU1RfUkVHXV0sIGkzMiAxNgorLy8gQ0hFQ0stTEU6IFtbRUxfQUREUjolW2Etel8wLTldK11dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tGSVJTVF9SRUddXSwgaTMyIDE2CisvLyBDSEVDSy1CRTogW1tFTF9BRERSOiVbYS16XzAtOV0rXV0gPSBnZXRlbGVtZW50cHRyIGk4KiBbW0ZJUlNUX1JFR11dLCBpMzIgMjgKIC8vIENIRUNLOiBbW0VMX1RZUEVEOiVbYS16XzAtOV0rXV0gPSBiaXRjYXN0IGk4KiBbW0VMX0FERFJdXSB0byBmbG9hdCoKIC8vIENIRUNLOiBbW0VMX1RNUEFERFI6JVthLXpfMC05XStdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgWzIgeCBmbG9hdF0qICVbW1RNUF9IRkFdXSwgaTMyIDAsIGkzMiAxCiAvLyBDSEVDSzogW1tFTDolW2Etel8wLTldK11dID0gbG9hZCBmbG9hdCogW1tFTF9UWVBFRF1dCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYWxpYXMuYyBiL3Rlc3QvQ29kZUdlbi9hbGlhcy5jCmluZGV4IGVmYTk0YjMuLjRhODliMTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9hbGlhcy5jCisrKyBiL3Rlc3QvQ29kZUdlbi9hbGlhcy5jCkBAIC0xNCw2ICsxNCw4IEBACiBleHRlcm4gdm9pZCBmMSh2b2lkKTsKIGV4dGVybiB2b2lkIGYxKHZvaWQpIF9fYXR0cmlidXRlKChhbGlhcygiZjAiKSkpOwogLy8gQ0hFQ0tCQVNJQy1EQUc6IEBmMSA9IGFsaWFzIHZvaWQgKCkqIEBmMAorLy8gQ0hFQ0tCQVNJQy1EQUc6IEB0ZXN0OF9mb28gPSBhbGlhcyB3ZWFrIGJpdGNhc3QgKHZvaWQgKCkqIEB0ZXN0OF9iYXIgdG8gdm9pZCAoLi4uKSopCisvLyBDSEVDS0JBU0lDLURBRzogQHRlc3Q4X3plZCA9IGFsaWFzIGJpdGNhc3QgKHZvaWQgKCkqIEB0ZXN0OF9iYXIgdG8gdm9pZCAoLi4uKSopCiAvLyBDSEVDS0JBU0lDOiBkZWZpbmUgdm9pZCBAZjAoKSBbW05VVzojWzAtOV0rXV0gewogCiAvLyBNYWtlIHN1cmUgdGhhdCBhbGlhc2VzIGNhdXNlIHJlZmVyZW5jZWQgdmFsdWVzIHRvIGJlIGVtaXR0ZWQuCkBAIC00OCwzICs1MCw3IEBACiAvLyBDSEVDS0JBU0lDOiBhdHRyaWJ1dGVzIFtbTlVXXV0gPSB7IG5vdW53aW5ke3suKn19IH0KIAogLy8gQ0hFQ0tDQzogYXR0cmlidXRlcyBbW05VV11dID0geyBub3Vud2luZHt7Lip9fSB9CisKK3ZvaWQgdGVzdDhfYmFyKCkge30KK3ZvaWQgdGVzdDhfZm9vKCkgX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoInRlc3Q4X2JhciIpKSk7Cit2b2lkIHRlc3Q4X3plZCgpIF9fYXR0cmlidXRlX18oKGFsaWFzKCJ0ZXN0OF9mb28iKSkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FsdGl2ZWMuYyBiL3Rlc3QvQ29kZUdlbi9hbHRpdmVjLmMKaW5kZXggNmM5MjRhNy4uYzI1ZDlmNCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FsdGl2ZWMuYworKysgYi90ZXN0L0NvZGVHZW4vYWx0aXZlYy5jCkBAIC0xLDQgKzEsNCBAQAotLy8gUkVRVUlSRVM6IHBwYzMyLXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogcG93ZXJwYy1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mYWx0aXZlYyAtdHJpcGxlIHBvd2VycGMtdW5rbm93bi11bmtub3duIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBDaGVjayBpbml0aWFsaXphdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybS1hYXBjcy12ZnAuYyBiL3Rlc3QvQ29kZUdlbi9hcm0tYWFwY3MtdmZwLmMKaW5kZXggMGUxMDJmMy4uY2Q5YWFhNCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FybS1hYXBjcy12ZnAuYworKysgYi90ZXN0L0NvZGVHZW4vYXJtLWFhcGNzLXZmcC5jCkBAIC0xMiw3ICsxMiwxNSBAQAogLy8gUlVOOiAgLWZmcmVlc3RhbmRpbmcgXAogLy8gUlVOOiAgLWVtaXQtbGx2bSAtdyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LWFwcGxlLWRhcndpbjkgXAorLy8gUlVOOiAgIC1mZnJlZXN0YW5kaW5nIFwKKy8vIFJVTjogICAtZW1pdC1sbHZtIC13IC1vIC0gJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSzY0ICVzCisKKyNpZmRlZiBfX2FybTY0X18KICNpbmNsdWRlIDxhcm1fbmVvbi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorI2VuZGlmCiAKIHN0cnVjdCBob21vZ2VuZW91c19zdHJ1Y3QgewogICBmbG9hdCBmWzJdOwpAQCAtMjAsMTUgKzI4LDIyIEBACiAgIGZsb2F0IGY0OwogfTsKIC8vIENIRUNLOiBkZWZpbmUgYXJtX2FhcGNzX3ZmcGNjICVzdHJ1Y3QuaG9tb2dlbmVvdXNfc3RydWN0IEB0ZXN0X3N0cnVjdChmbG9hdCAle3suKn19LCBmbG9hdCAle3suKn19LCBmbG9hdCAle3suKn19LCBmbG9hdCAle3suKn19KQorLy8gQ0hFQ0s2NDogZGVmaW5lICVzdHJ1Y3QuaG9tb2dlbmVvdXNfc3RydWN0IEB0ZXN0X3N0cnVjdChmbG9hdCAle3suKn19LCBmbG9hdCAle3suKn19LCBmbG9hdCAle3suKn19LCBmbG9hdCAle3suKn19KQogZXh0ZXJuIHN0cnVjdCBob21vZ2VuZW91c19zdHJ1Y3Qgc3RydWN0X2NhbGxlZShzdHJ1Y3QgaG9tb2dlbmVvdXNfc3RydWN0KTsKIHN0cnVjdCBob21vZ2VuZW91c19zdHJ1Y3QgdGVzdF9zdHJ1Y3Qoc3RydWN0IGhvbW9nZW5lb3VzX3N0cnVjdCBhcmcpIHsKICAgcmV0dXJuIHN0cnVjdF9jYWxsZWUoYXJnKTsKIH0KIAorLy8gQ0hFQ0s6IGRlZmluZSBhcm1fYWFwY3NfdmZwY2Mgdm9pZCBAdGVzdF9zdHJ1Y3RfdmFyaWFkaWMoJXN0cnVjdC5ob21vZ2VuZW91c19zdHJ1Y3QqIHt7Lip9fSwgWzQgeCBpMzJdICV7ey4qfX0sIC4uLikKK3N0cnVjdCBob21vZ2VuZW91c19zdHJ1Y3QgdGVzdF9zdHJ1Y3RfdmFyaWFkaWMoc3RydWN0IGhvbW9nZW5lb3VzX3N0cnVjdCBhcmcsIC4uLikgeworICByZXR1cm4gc3RydWN0X2NhbGxlZShhcmcpOworfQorCiBzdHJ1Y3QgbmVzdGVkX2FycmF5IHsKICAgZG91YmxlIGRbNF07CiB9OwogLy8gQ0hFQ0s6IGRlZmluZSBhcm1fYWFwY3NfdmZwY2Mgdm9pZCBAdGVzdF9hcnJheShkb3VibGUgJXt7Lip9fSwgZG91YmxlICV7ey4qfX0sIGRvdWJsZSAle3suKn19LCBkb3VibGUgJXt7Lip9fSkKKy8vIENIRUNLNjQ6IGRlZmluZSB2b2lkIEB0ZXN0X2FycmF5KGRvdWJsZSAle3suKn19LCBkb3VibGUgJXt7Lip9fSwgZG91YmxlICV7ey4qfX0sIGRvdWJsZSAle3suKn19KQogZXh0ZXJuIHZvaWQgYXJyYXlfY2FsbGVlKHN0cnVjdCBuZXN0ZWRfYXJyYXkpOwogdm9pZCB0ZXN0X2FycmF5KHN0cnVjdCBuZXN0ZWRfYXJyYXkgYXJnKSB7CiAgIGFycmF5X2NhbGxlZShhcmcpOwpAQCAtMzYsNiArNTEsNyBAQAogCiBleHRlcm4gdm9pZCBjb21wbGV4X2NhbGxlZShfX2NvbXBsZXhfXyBkb3VibGUpOwogLy8gQ0hFQ0s6IGRlZmluZSBhcm1fYWFwY3NfdmZwY2Mgdm9pZCBAdGVzdF9jb21wbGV4KGRvdWJsZSAle3suKn19LCBkb3VibGUgJXt7Lip9fSkKKy8vIENIRUNLNjQ6IGRlZmluZSB2b2lkIEB0ZXN0X2NvbXBsZXgoZG91YmxlICV7ey4qfX0sIGRvdWJsZSAle3suKn19KQogdm9pZCB0ZXN0X2NvbXBsZXgoX19jb21wbGV4X18gZG91YmxlIGNkKSB7CiAgIGNvbXBsZXhfY2FsbGVlKGNkKTsKIH0KQEAgLTU3LDYgKzczLDkgQEAKICAgZmxvYXQgZjQ7CiB9OwogLy8gQ0hFQ0s6IGRlZmluZSBhcm1fYWFwY3NfdmZwY2Mgdm9pZCBAdGVzdF9iaWcoWzUgeCBpMzJdICV7ey4qfX0pCisvLyBDSEVDSzY0OiBkZWZpbmUgdm9pZCBAdGVzdF9iaWcoJXN0cnVjdC5iaWdfc3RydWN0KiAle3suKn19KQorLy8gQ0hFQ0s2NDogY2FsbCB2b2lkIEBsbHZtLm1lbWNweQorLy8gQ0hFQ0s2NDogY2FsbCB2b2lkIEBiaWdfY2FsbGVlKCVzdHJ1Y3QuYmlnX3N0cnVjdCoKIGV4dGVybiB2b2lkIGJpZ19jYWxsZWUoc3RydWN0IGJpZ19zdHJ1Y3QpOwogdm9pZCB0ZXN0X2JpZyhzdHJ1Y3QgYmlnX3N0cnVjdCBhcmcpIHsKICAgYmlnX2NhbGxlZShhcmcpOwpAQCAtNzAsNiArODksNyBAQAogICBpbnQgaTI7CiB9OwogLy8gQ0hFQ0s6IGRlZmluZSBhcm1fYWFwY3NfdmZwY2Mgdm9pZCBAdGVzdF9oZXRlcm8oWzIgeCBpMzJdICV7ey4qfX0pCisvLyBDSEVDSzY0OiBkZWZpbmUgdm9pZCBAdGVzdF9oZXRlcm8oaTY0ICV7ey4qfX0pCiBleHRlcm4gdm9pZCBoZXRlcm9fY2FsbGVlKHN0cnVjdCBoZXRlcm9nZW5lb3VzX3N0cnVjdCk7CiB2b2lkIHRlc3RfaGV0ZXJvKHN0cnVjdCBoZXRlcm9nZW5lb3VzX3N0cnVjdCBhcmcpIHsKICAgaGV0ZXJvX2NhbGxlZShhcmcpOwpAQCAtNzcsNiArOTcsNyBAQAogCiAvLyBOZW9uIG11bHRpLXZlY3RvciB0eXBlcyBhcmUgaG9tb2dlbmVvdXMgYWdncmVnYXRlcy4KIC8vIENIRUNLOiBkZWZpbmUgYXJtX2FhcGNzX3ZmcGNjIDwxNiB4IGk4PiBAZjAoPDE2IHggaTg+ICV7ey4qfX0sIDwxNiB4IGk4PiAle3suKn19LCA8MTYgeCBpOD4gJXt7Lip9fSwgPDE2IHggaTg+ICV7ey4qfX0pCisvLyBDSEVDSzY0OiBkZWZpbmUgPDE2IHggaTg+IEBmMCg8MTYgeCBpOD4gJXt7Lip9fSwgPDE2IHggaTg+ICV7ey4qfX0sIDwxNiB4IGk4PiAle3suKn19LCA8MTYgeCBpOD4gJXt7Lip9fSkKIGludDh4MTZfdCBmMChpbnQ4eDE2eDRfdCB2NCkgewogICByZXR1cm4gdmFkZHFfczgodjQudmFsWzBdLCB2NC52YWxbM10pOwogfQpAQCAtOTAsMTEgKzExMSwyMiBAQAogICBpbnQxNng0X3QgdjQ7CiB9OwogLy8gQ0hFQ0s6IGRlZmluZSBhcm1fYWFwY3NfdmZwY2Mgdm9pZCBAdGVzdF9uZW9uKDw4IHggaTg+ICV7ey4qfX0sIDw4IHggaTg+ICV7ey4qfX0sIDwyIHggaTMyPiAle3suKn19LCA8NCB4IGkxNj4gJXt7Lip9fSkKKy8vIENIRUNLNjQ6IGRlZmluZSB2b2lkIEB0ZXN0X25lb24oPDggeCBpOD4gJXt7Lip9fSwgPDggeCBpOD4gJXt7Lip9fSwgPDIgeCBpMzI+ICV7ey4qfX0sIDw0IHggaTE2PiAle3suKn19KQogZXh0ZXJuIHZvaWQgbmVvbl9jYWxsZWUoc3RydWN0IG5lb25fc3RydWN0KTsKIHZvaWQgdGVzdF9uZW9uKHN0cnVjdCBuZW9uX3N0cnVjdCBhcmcpIHsKICAgbmVvbl9jYWxsZWUoYXJnKTsKIH0KIAotLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBhcm1fYWFwY3NfdmZwY2Mgdm9pZCBAZjMzKCVzdHJ1Y3QuczMzKiBieXZhbCAlcykKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgYXJtX2FhcGNzX3ZmcGNjIHZvaWQgQGYzMyglc3RydWN0LnMzMyogYnl2YWwgYWxpZ24gMSAlcykKIHN0cnVjdCBzMzMgeyBjaGFyIGJ1ZlszMiozMl07IH07CiB2b2lkIGYzMyhzdHJ1Y3QgczMzIHMpIHsgfQorCit0eXBlZGVmIHN0cnVjdCB7IGxvbmcgbG9uZyB4OyBpbnQgeTsgfSBzdHJ1Y3RfbG9uZ19sb25nX2ludDsKKy8vIENIRUNLOiBkZWZpbmUgYXJtX2FhcGNzX3ZmcGNjIHZvaWQgQHRlc3RfdmZwX3N0YWNrX2dwcl9zcGxpdF8xKGRvdWJsZSAlYSwgZG91YmxlICViLCBkb3VibGUgJWMsIGRvdWJsZSAlZCwgZG91YmxlICVlLCBkb3VibGUgJWYsIGRvdWJsZSAlZywgZG91YmxlICVoLCBkb3VibGUgJWksIGkzMiAlaiwgaTY0ICVrLCBpMzIgJWwpCit2b2lkIHRlc3RfdmZwX3N0YWNrX2dwcl9zcGxpdF8xKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRvdWJsZSBkLCBkb3VibGUgZSwgZG91YmxlIGYsIGRvdWJsZSBnLCBkb3VibGUgaCwgZG91YmxlIGksIGludCBqLCBsb25nIGxvbmcgaywgaW50IGwpIHt9CisKKy8vIENIRUNLOiBkZWZpbmUgYXJtX2FhcGNzX3ZmcGNjIHZvaWQgQHRlc3RfdmZwX3N0YWNrX2dwcl9zcGxpdF8yKGRvdWJsZSAlYSwgZG91YmxlICViLCBkb3VibGUgJWMsIGRvdWJsZSAlZCwgZG91YmxlICVlLCBkb3VibGUgJWYsIGRvdWJsZSAlZywgZG91YmxlICVoLCBkb3VibGUgJWksIGkzMiAlaiwgWzMgeCBpMzJdLCBpNjQgJWsuMCwgaTMyICVrLjEpCit2b2lkIHRlc3RfdmZwX3N0YWNrX2dwcl9zcGxpdF8yKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRvdWJsZSBkLCBkb3VibGUgZSwgZG91YmxlIGYsIGRvdWJsZSBnLCBkb3VibGUgaCwgZG91YmxlIGksIGludCBqLCBzdHJ1Y3RfbG9uZ19sb25nX2ludCBrKSB7fQorCisvLyBDSEVDSzogZGVmaW5lIGFybV9hYXBjc192ZnBjYyB2b2lkIEB0ZXN0X3ZmcF9zdGFja19ncHJfc3BsaXRfMyglc3RydWN0LnN0cnVjdF9sb25nX2xvbmdfaW50KiBub2FsaWFzIHNyZXQgJWFnZy5yZXN1bHQsIGRvdWJsZSAlYSwgZG91YmxlICViLCBkb3VibGUgJWMsIGRvdWJsZSAlZCwgZG91YmxlICVlLCBkb3VibGUgJWYsIGRvdWJsZSAlZywgZG91YmxlICVoLCBkb3VibGUgJWksIFszIHggaTMyXSwgaTY0ICVrLjAsIGkzMiAlay4xKQorc3RydWN0X2xvbmdfbG9uZ19pbnQgdGVzdF92ZnBfc3RhY2tfZ3ByX3NwbGl0XzMoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsIGRvdWJsZSBlLCBkb3VibGUgZiwgZG91YmxlIGcsIGRvdWJsZSBoLCBkb3VibGUgaSwgc3RydWN0X2xvbmdfbG9uZ19pbnQgaykge30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm0tYXJndW1lbnRzLmMgYi90ZXN0L0NvZGVHZW4vYXJtLWFyZ3VtZW50cy5jCmluZGV4IGI2YmFjOWEuLjJjNWRmOTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9hcm0tYXJndW1lbnRzLmMKKysrIGIvdGVzdC9Db2RlR2VuL2FybS1hcmd1bWVudHMuYwpAQCAtMTc2LDggKzE3Niw4IEBACiAvLyBQUjEzMzUwCiBzdHJ1Y3QgczMzIHsgY2hhciBidWZbMzIqMzJdOyB9Owogdm9pZCBmMzMoc3RydWN0IHMzMyBzKSB7IH0KLS8vIEFQQ1MtR05VLUxBQkVMOiBkZWZpbmUgdm9pZCBAZjMzKCVzdHJ1Y3QuczMzKiBieXZhbCAlcykKLS8vIEFBUENTLUxBQkVMOiBkZWZpbmUgYXJtX2FhcGNzY2Mgdm9pZCBAZjMzKCVzdHJ1Y3QuczMzKiBieXZhbCAlcykKKy8vIEFQQ1MtR05VLUxBQkVMOiBkZWZpbmUgdm9pZCBAZjMzKCVzdHJ1Y3QuczMzKiBieXZhbCBhbGlnbiAxICVzKQorLy8gQUFQQ1MtTEFCRUw6IGRlZmluZSBhcm1fYWFwY3NjYyB2b2lkIEBmMzMoJXN0cnVjdC5zMzMqIGJ5dmFsIGFsaWduIDEgJXMpCiAKIC8vIFBSMTQwNDgKIHN0cnVjdCBzMzQgeyBjaGFyIGM7IH07CkBAIC0yMDksMTQgKzIwOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICooZmxvYXQzMng0X3QgKikmczIpOwogICByZXR1cm4gdjsKIH0KLS8vIEFQQ1MtR05VLUxBQkVMOiBkZWZpbmUgPDQgeCBmbG9hdD4gQGYzNShpMzIgJWksICVzdHJ1Y3QuczM1KiBieXZhbCwgJXN0cnVjdC5zMzUqIGJ5dmFsKQorLy8gQVBDUy1HTlUtTEFCRUw6IGRlZmluZSA8NCB4IGZsb2F0PiBAZjM1KGkzMiAlaSwgJXN0cnVjdC5zMzUqIGJ5dmFsIGFsaWduIDE2LCAlc3RydWN0LnMzNSogYnl2YWwgYWxpZ24gMTYpCiAvLyBBUENTLUdOVTogJVtbYTouKl1dID0gYWxsb2NhICVzdHJ1Y3QuczM1LCBhbGlnbiAxNgogLy8gQVBDUy1HTlU6ICVbW2I6LipdXSA9IGJpdGNhc3QgJXN0cnVjdC5zMzUqICVbW2FdXSB0byBpOCoKIC8vIEFQQ1MtR05VOiAlW1tjOi4qXV0gPSBiaXRjYXN0ICVzdHJ1Y3QuczM1KiAlMCB0byBpOCoKIC8vIEFQQ1MtR05VOiBjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LnAwaTgucDBpOC5pMzIoaTgqICVbW2JdXSwgaTgqICVbW2NdXQogLy8gQVBDUy1HTlU6ICVbW2Q6LipdXSA9IGJpdGNhc3QgJXN0cnVjdC5zMzUqICVbW2FdXSB0byA8NCB4IGZsb2F0PioKIC8vIEFQQ1MtR05VOiBsb2FkIDw0IHggZmxvYXQ+KiAlW1tkXV0sIGFsaWduIDE2Ci0vLyBBQVBDUy1MQUJFTDogZGVmaW5lIGFybV9hYXBjc2NjIDw0IHggZmxvYXQ+IEBmMzUoaTMyICVpLCAlc3RydWN0LnMzNSogYnl2YWwsICVzdHJ1Y3QuczM1KiBieXZhbCkKKy8vIEFBUENTLUxBQkVMOiBkZWZpbmUgYXJtX2FhcGNzY2MgPDQgeCBmbG9hdD4gQGYzNShpMzIgJWksICVzdHJ1Y3QuczM1KiBieXZhbCBhbGlnbiAxNiwgJXN0cnVjdC5zMzUqIGJ5dmFsIGFsaWduIDE2KQogLy8gQUFQQ1M6ICVbW2E6LipdXSA9IGFsbG9jYSAlc3RydWN0LnMzNSwgYWxpZ24gMTYKIC8vIEFBUENTOiAlW1tiOi4qXV0gPSBiaXRjYXN0ICVzdHJ1Y3QuczM1KiAlW1thXV0gdG8gaTgqCiAvLyBBQVBDUzogJVtbYzouKl1dID0gYml0Y2FzdCAlc3RydWN0LnMzNSogJTAgdG8gaTgqCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYXJtLWJ5dmFsLWFsaWduLmMgYi90ZXN0L0NvZGVHZW4vYXJtLWJ5dmFsLWFsaWduLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyMjUwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm0tYnl2YWwtYWxpZ24uYwpAQCAtMCwwICsxLDE0IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZT1hcm12Ny1ub25lLWVhYmkgPCAlcyAtUyAtZW1pdC1sbHZtIHwgRmlsZUNoZWNrICVzCisKK3N0cnVjdCBmb28geworICBsb25nIGxvbmcgYTsKKyAgY2hhciBiOworICBpbnQgYzoxNjsKKyAgaW50IGRbMTZdOworfTsKKworLy8gQ0hFQ0s6ICVzdHJ1Y3QuZm9vKiBieXZhbCBhbGlnbiA4ICV6Citsb25nIGxvbmcgYmFyKGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkLCBpbnQgZSwKKyAgICAgICAgICAgICAgc3RydWN0IGZvbyB6KSB7CisgIHJldHVybiB6LmE7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYXJtLWNvcnRleC1jcHVzLmMgYi90ZXN0L0NvZGVHZW4vYXJtLWNvcnRleC1jcHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkOTgzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm0tY29ydGV4LWNwdXMuYwpAQCAtMCwwICsxLDExIEBACisvLyBSRVFVSVJFUzogYXJtLXJlZ2lzdGVyZWQtdGFyZ2V0CisKKy8vIENoZWNrIHRoYXQgQ29ydGV4LU0gY29yZXMgZG9uJ3QgZW5hYmxlIGh3ZGl2LWFybSAoYW5kIGRvbid0IGVtaXQgVGFnX0RJVl91c2UpCisvLworLy8gVGhpcyB0YXJnZXQgZmVhdHVyZSBkb2Vzbid0IGFmZmVjdCBDIHByZWRlZmluZXMsIG5vciB0aGUgZ2VuZXJhdGVkIElSOworLy8gb25seSB0aGUgYnVpbGQgYXR0cmlidXRlcyBpbiBnZW5lcmF0ZWQgYXNzZW1ibHkgYW5kIG9iamVjdCBmaWxlcyBhcmUgYWZmZWN0ZWQuCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LW0zIC1TICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LW00IC1TICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIENIRUNLLU5PVDogLmVhYmlfYXR0cmlidXRlCTQ0CisKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm0taG9tb2dlbm91cy5jIGIvdGVzdC9Db2RlR2VuL2FybS1ob21vZ2Vub3VzLmMKaW5kZXggNWQyMTA4OC4uYWQyMTQ0NCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FybS1ob21vZ2Vub3VzLmMKKysrIGIvdGVzdC9Db2RlR2VuL2FybS1ob21vZ2Vub3VzLmMKQEAgLTEsNiArMSwxMSBAQAogLy8gUkVRVUlSRVM6IGFybS1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtdjctLS1lYWJpIC10YXJnZXQtYWJpIGFhcGNzIC1tZmxvYXQtYWJpIGhhcmQgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LWFwcGxlLWRhcndpbjkgLXRhcmdldC1hYmkgZGFyd2lucGNzIFwKKy8vIFJVTjogIC1mZnJlZXN0YW5kaW5nIC1lbWl0LWxsdm0gLXcgLW8gLSAlcyB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLNjQgJXMKKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtbGludXgtZ251IC1mZnJlZXN0YW5kaW5nIC1lbWl0LWxsdm0gLXcgLW8gLSAlcyBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0s2NC1BQVBDUyAlcwogdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMl90OwogCkBAIC0xNzAsOSArMTc1LDIxIEBACiB2b2lkIHRlc3Rfc3RydWN0X29mX2ZvdXJfZG91Ymxlcyh2b2lkKSB7CiAvLyBDSEVDSzogdGVzdF9zdHJ1Y3Rfb2ZfZm91cl9kb3VibGVzCiAvLyBDSEVDSzogY2FsbCBhcm1fYWFwY3NfdmZwY2Mgdm9pZCBAdGFrZXNfc3RydWN0X29mX2ZvdXJfZG91Ymxlcyhkb3VibGUge3suKn19LCBkb3VibGUge3suKn19LCBkb3VibGUge3suKn19LCBkb3VibGUge3suKn19LCBkb3VibGUge3suKn19LCBbNiB4IGZsb2F0XSB1bmRlZiwgZG91YmxlIHt7Lip9fSwgZG91YmxlIHt7Lip9fSwgZG91YmxlIHt7Lip9fSwgZG91YmxlIHt7Lip9fSwgZG91YmxlIHt7Lip9fSkKKy8vIENIRUNLNjQ6IHRlc3Rfc3RydWN0X29mX2ZvdXJfZG91YmxlcworLy8gQ0hFQ0s2NDogY2FsbCB2b2lkIEB0YWtlc19zdHJ1Y3Rfb2ZfZm91cl9kb3VibGVzKGRvdWJsZSB7ey4qfX0sIGRvdWJsZSB7ey4qfX0sIGRvdWJsZSB7ey4qfX0sIGRvdWJsZSB7ey4qfX0sIGRvdWJsZSB7ey4qfX0sIFszIHggZmxvYXRdIHVuZGVmLCBkb3VibGUge3suKn19LCBkb3VibGUge3suKn19LCBkb3VibGUge3suKn19LCBkb3VibGUge3suKn19LCBkb3VibGUge3suKn19KQorLy8gQ0hFQ0s2NC1BQVBDUzogdGVzdF9zdHJ1Y3Rfb2ZfZm91cl9kb3VibGVzCisvLyBDSEVDSzY0LUFBUENTOiBjYWxsIHZvaWQgQHRha2VzX3N0cnVjdF9vZl9mb3VyX2RvdWJsZXMoZG91YmxlIHt7Lip9fSwgZG91YmxlIHt7Lip9fSwgZG91YmxlIHt7Lip9fSwgZG91YmxlIHt7Lip9fSwgZG91YmxlIHt7Lip9fSwgWzMgeCBmbG9hdF0gdW5kZWYsIFs0IHggZG91YmxlXSB7ey4qfX0sIGRvdWJsZSB7ey4qfX0pCiAgIHRha2VzX3N0cnVjdF9vZl9mb3VyX2RvdWJsZXMoMy4wLCBnX3M0ZCwgZ19zNGQsIDQuMCk7CiB9CiAKK2V4dGVybiB2b2lkIHRha2VzX3N0cnVjdF9vZl9mb3VyX2RvdWJsZXNfdmFyaWFkaWMoZG91YmxlIGEsIHN0cnVjdF9vZl9mb3VyX2RvdWJsZXMgYiwgc3RydWN0X29mX2ZvdXJfZG91YmxlcyBjLCBkb3VibGUgZCwgLi4uKTsKKwordm9pZCB0ZXN0X3N0cnVjdF9vZl9mb3VyX2RvdWJsZXNfdmFyaWFkaWModm9pZCkgeworLy8gQ0hFQ0s6IHRlc3Rfc3RydWN0X29mX2ZvdXJfZG91Ymxlc192YXJpYWRpYworLy8gQ0hFQ0s6IGNhbGwgYXJtX2FhcGNzX3ZmcGNjIHZvaWQgKGRvdWJsZSwgWzQgeCBpNjRdLCBbNCB4IGk2NF0sIGRvdWJsZSwgLi4uKSogQHRha2VzX3N0cnVjdF9vZl9mb3VyX2RvdWJsZXNfdmFyaWFkaWMoZG91YmxlIHt7Lip9fSwgWzQgeCBpNjRdIHt7Lip9fSwgWzQgeCBpNjRdIHt7Lip9fSwgZG91YmxlIHt7Lip9fSkKKyAgdGFrZXNfc3RydWN0X29mX2ZvdXJfZG91Ymxlc192YXJpYWRpYygzLjAsIGdfczRkLCBnX3M0ZCwgNC4wKTsKK30KKwogZXh0ZXJuIHZvaWQgdGFrZXNfc3RydWN0X3dpdGhfYmFja2ZpbGwoZmxvYXQgZjEsIGRvdWJsZSBhLCBmbG9hdCBmMiwgc3RydWN0X29mX2ZvdXJfZG91YmxlcyBiLCBzdHJ1Y3Rfb2ZfZm91cl9kb3VibGVzIGMsIGRvdWJsZSBkKTsKIHZvaWQgdGVzdF9zdHJ1Y3Rfd2l0aF9iYWNrZmlsbCh2b2lkKSB7CiAvLyBDSEVDSzogdGVzdF9zdHJ1Y3Rfd2l0aF9iYWNrZmlsbApAQCAtMTk0LDkgKzIxMSwyNCBAQAogdm9pZCB0ZXN0X3N0cnVjdF9vZl92ZWNzKHZvaWQpIHsKIC8vIENIRUNLOiB0ZXN0X3N0cnVjdF9vZl92ZWNzCiAvLyBDSEVDSzogY2FsbCBhcm1fYWFwY3NfdmZwY2Mgdm9pZCBAdGFrZXNfc3RydWN0X29mX3ZlY3MoZG91YmxlIHt7Lip9fSwgPDggeCBpOD4ge3suKn19LCA8NCB4IGkxNj4ge3suKn19LCA8OCB4IGk4PiB7ey4qfX0sIDw0IHggaTE2PiB7ey4qfX0sIFs2IHggZmxvYXRdIHVuZGVmLCA8OCB4IGk4PiB7ey4qfX0sIDw0IHggaTE2PiB7ey4qfX0sIDw4IHggaTg+IHt7Lip9fSwgPDQgeCBpMTY+IHt7Lip9fSwgZG91YmxlIHt7Lip9fSkKKy8vIENIRUNLNjQ6IHRlc3Rfc3RydWN0X29mX3ZlY3MKKy8vIENIRUNLNjQ6IGNhbGwgdm9pZCBAdGFrZXNfc3RydWN0X29mX3ZlY3MoZG91YmxlIHt7Lip9fSwgPDggeCBpOD4ge3suKn19LCA8NCB4IGkxNj4ge3suKn19LCA8OCB4IGk4PiB7ey4qfX0sIDw0IHggaTE2PiB7ey4qfX0sIFszIHggZmxvYXRdIHVuZGVmLCA8OCB4IGk4PiB7ey4qfX0sIDw0IHggaTE2PiB7ey4qfX0sIDw4IHggaTg+IHt7Lip9fSwgPDQgeCBpMTY+IHt7Lip9fSwgZG91YmxlIHt7Lip9fSkKKy8vIENIRUNLNjQtQUFQQ1M6IHRlc3Rfc3RydWN0X29mX3ZlY3MKKy8vIENIRUNLNjQtQUFQQ1M6IGNhbGwgdm9pZCBAdGFrZXNfc3RydWN0X29mX3ZlY3MoZG91YmxlIHt7Lip9fSwgPDggeCBpOD4ge3suKn19LCA8NCB4IGkxNj4ge3suKn19LCA8OCB4IGk4PiB7ey4qfX0sIDw0IHggaTE2PiB7ey4qfX0sIFszIHggZmxvYXRdIHVuZGVmLCBbNCB4IGRvdWJsZV0ge3suKn19KQogICB0YWtlc19zdHJ1Y3Rfb2ZfdmVjcygzLjAsIGdfdmVjLCBnX3ZlYywgNC4wKTsKIH0KIAordHlwZWRlZiBzdHJ1Y3QgeworICBkb3VibGUgYTsKKyAgbG9uZyBkb3VibGUgYjsKK30gc3RydWN0X29mX2RvdWJsZV9hbmRfbG9uZ19kb3VibGU7CitzdHJ1Y3Rfb2ZfZG91YmxlX2FuZF9sb25nX2RvdWJsZSBnX2RsZDsKKworc3RydWN0X29mX2RvdWJsZV9hbmRfbG9uZ19kb3VibGUgdGVzdF9zdHJ1Y3Rfb2ZfZG91YmxlX2FuZF9sb25nX2RvdWJsZSh2b2lkKSB7CisgIHJldHVybiBnX2RsZDsKK30KKy8vIENIRUNLOiBkZWZpbmUgYXJtX2FhcGNzX3ZmcGNjICVzdHJ1Y3Quc3RydWN0X29mX2RvdWJsZV9hbmRfbG9uZ19kb3VibGUgQHRlc3Rfc3RydWN0X29mX2RvdWJsZV9hbmRfbG9uZ19kb3VibGUoKQorCiAvLyBGSVhNRTogVGVzdHMgbmVjZXNzYXJ5OgogLy8gICAgICAgICAtIFZlY3RvcnMKIC8vICAgICAgICAgLSBDKysgc3R1ZmYKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm0tbmVvbi12Y3Z0WC5jIGIvdGVzdC9Db2RlR2VuL2FybS1uZW9uLXZjdnRYLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4Y2U3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm0tbmVvbi12Y3Z0WC5jCkBAIC0wLDAgKzEsOTkgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHRodW1idjgtbGludXgtZ251ZWFiaWhmIC10YXJnZXQtY3B1IGNvcnRleC1hNTcgLWZmcmVlc3RhbmRpbmcgLU8xIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcworCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworaW50MzJ4Ml90IHRlc3RfdmN2dGFfczMyX2YzMihmbG9hdDMyeDJfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRhX3MzMl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IGNhbGwgPDIgeCBpMzI+IEBsbHZtLmFybS5uZW9uLnZjdnRhcy52MmkzMi52MmYzMig8MiB4IGZsb2F0PiAlYSkKKyAgcmV0dXJuIHZjdnRhX3MzMl9mMzIoYSk7Cit9CisKK3VpbnQzMngyX3QgdGVzdF92Y3Z0YV91MzJfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dGFfdTMyX2YzMgorICAvLyBDSEVDSy1MQUJFTDogY2FsbCA8MiB4IGkzMj4gQGxsdm0uYXJtLm5lb24udmN2dGF1LnYyaTMyLnYyZjMyKDwyIHggZmxvYXQ+ICVhKQorICByZXR1cm4gdmN2dGFfdTMyX2YzMihhKTsKK30KKworaW50MzJ4NF90IHRlc3RfdmN2dGFxX3MzMl9mMzIoZmxvYXQzMng0X3QgYSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0YXFfczMyX2YzMgorICAvLyBDSEVDSy1MQUJFTDogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtLm5lb24udmN2dGFzLnY0aTMyLnY0ZjMyKDw0IHggZmxvYXQ+ICVhKQorICByZXR1cm4gdmN2dGFxX3MzMl9mMzIoYSk7Cit9CisKK3VpbnQzMng0X3QgdGVzdF92Y3Z0YXFfdTMyX2YzMihmbG9hdDMyeDRfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRhcV91MzJfZjMyCisgIC8vIENIRUNLLUxBQkVMOiBjYWxsIDw0IHggaTMyPiBAbGx2bS5hcm0ubmVvbi52Y3Z0YXUudjRpMzIudjRmMzIoPDQgeCBmbG9hdD4gJWEpCisgIHJldHVybiB2Y3Z0YXFfdTMyX2YzMihhKTsKK30KKworaW50MzJ4Ml90IHRlc3RfdmN2dG5fczMyX2YzMihmbG9hdDMyeDJfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRuX3MzMl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IGNhbGwgPDIgeCBpMzI+IEBsbHZtLmFybS5uZW9uLnZjdnRucy52MmkzMi52MmYzMig8MiB4IGZsb2F0PiAlYSkKKyAgcmV0dXJuIHZjdnRuX3MzMl9mMzIoYSk7Cit9CisKK3VpbnQzMngyX3QgdGVzdF92Y3Z0bl91MzJfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dG5fdTMyX2YzMgorICAvLyBDSEVDSy1MQUJFTDogY2FsbCA8MiB4IGkzMj4gQGxsdm0uYXJtLm5lb24udmN2dG51LnYyaTMyLnYyZjMyKDwyIHggZmxvYXQ+ICVhKQorICByZXR1cm4gdmN2dG5fdTMyX2YzMihhKTsKK30KKworaW50MzJ4NF90IHRlc3RfdmN2dG5xX3MzMl9mMzIoZmxvYXQzMng0X3QgYSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0bnFfczMyX2YzMgorICAvLyBDSEVDSy1MQUJFTDogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtLm5lb24udmN2dG5zLnY0aTMyLnY0ZjMyKDw0IHggZmxvYXQ+ICVhKQorICByZXR1cm4gdmN2dG5xX3MzMl9mMzIoYSk7Cit9CisKK3VpbnQzMng0X3QgdGVzdF92Y3Z0bnFfdTMyX2YzMihmbG9hdDMyeDRfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRucV91MzJfZjMyCisgIC8vIENIRUNLLUxBQkVMOiBjYWxsIDw0IHggaTMyPiBAbGx2bS5hcm0ubmVvbi52Y3Z0bnUudjRpMzIudjRmMzIoPDQgeCBmbG9hdD4gJWEpCisgIHJldHVybiB2Y3Z0bnFfdTMyX2YzMihhKTsKK30KKworaW50MzJ4Ml90IHRlc3RfdmN2dHBfczMyX2YzMihmbG9hdDMyeDJfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRwX3MzMl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IGNhbGwgPDIgeCBpMzI+IEBsbHZtLmFybS5uZW9uLnZjdnRwcy52MmkzMi52MmYzMig8MiB4IGZsb2F0PiAlYSkKKyAgcmV0dXJuIHZjdnRwX3MzMl9mMzIoYSk7Cit9CisKK3VpbnQzMngyX3QgdGVzdF92Y3Z0cF91MzJfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dHBfdTMyX2YzMgorICAvLyBDSEVDSy1MQUJFTDogY2FsbCA8MiB4IGkzMj4gQGxsdm0uYXJtLm5lb24udmN2dHB1LnYyaTMyLnYyZjMyKDwyIHggZmxvYXQ+ICVhKQorICByZXR1cm4gdmN2dHBfdTMyX2YzMihhKTsKK30KKworaW50MzJ4NF90IHRlc3RfdmN2dHBxX3MzMl9mMzIoZmxvYXQzMng0X3QgYSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0cHFfczMyX2YzMgorICAvLyBDSEVDSy1MQUJFTDogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtLm5lb24udmN2dHBzLnY0aTMyLnY0ZjMyKDw0IHggZmxvYXQ+ICVhKQorICByZXR1cm4gdmN2dHBxX3MzMl9mMzIoYSk7Cit9CisKK3VpbnQzMng0X3QgdGVzdF92Y3Z0cHFfdTMyX2YzMihmbG9hdDMyeDRfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRwcV91MzJfZjMyCisgIC8vIENIRUNLLUxBQkVMOiBjYWxsIDw0IHggaTMyPiBAbGx2bS5hcm0ubmVvbi52Y3Z0cHUudjRpMzIudjRmMzIoPDQgeCBmbG9hdD4gJWEpCisgIHJldHVybiB2Y3Z0cHFfdTMyX2YzMihhKTsKK30KKworaW50MzJ4Ml90IHRlc3RfdmN2dG1fczMyX2YzMihmbG9hdDMyeDJfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRtX3MzMl9mMzIKKyAgLy8gQ0hFQ0stTEFCRUw6IGNhbGwgPDIgeCBpMzI+IEBsbHZtLmFybS5uZW9uLnZjdnRtcy52MmkzMi52MmYzMig8MiB4IGZsb2F0PiAlYSkKKyAgcmV0dXJuIHZjdnRtX3MzMl9mMzIoYSk7Cit9CisKK3VpbnQzMngyX3QgdGVzdF92Y3Z0bV91MzJfZjMyKGZsb2F0MzJ4Ml90IGEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmN2dG1fdTMyX2YzMgorICAvLyBDSEVDSy1MQUJFTDogY2FsbCA8MiB4IGkzMj4gQGxsdm0uYXJtLm5lb24udmN2dG11LnYyaTMyLnYyZjMyKDwyIHggZmxvYXQ+ICVhKQorICByZXR1cm4gdmN2dG1fdTMyX2YzMihhKTsKK30KKworaW50MzJ4NF90IHRlc3RfdmN2dG1xX3MzMl9mMzIoZmxvYXQzMng0X3QgYSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0bXFfczMyX2YzMgorICAvLyBDSEVDSy1MQUJFTDogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtLm5lb24udmN2dG1zLnY0aTMyLnY0ZjMyKDw0IHggZmxvYXQ+ICVhKQorICByZXR1cm4gdmN2dG1xX3MzMl9mMzIoYSk7Cit9CisKK3VpbnQzMng0X3QgdGVzdF92Y3Z0bXFfdTMyX2YzMihmbG9hdDMyeDRfdCBhKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRtcV91MzJfZjMyCisgIC8vIENIRUNLLUxBQkVMOiBjYWxsIDw0IHggaTMyPiBAbGx2bS5hcm0ubmVvbi52Y3Z0bXUudjRpMzIudjRmMzIoPDQgeCBmbG9hdD4gJWEpCisgIHJldHVybiB2Y3Z0bXFfdTMyX2YzMihhKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm02NC1hYmktdmVjdG9yLmMgYi90ZXN0L0NvZGVHZW4vYXJtNjQtYWJpLXZlY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmZiMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjQtYWJpLXZlY3Rvci5jCkBAIC0wLDAgKzEsNDMwIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1hcHBsZS1pb3M3IC10YXJnZXQtYWJpIGRhcndpbnBjcyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCit0eXBlZGVmIF9fYXR0cmlidXRlX18oKCBleHRfdmVjdG9yX3R5cGUoMykgKSkgIGNoYXIgX19jaGFyMzsKK3R5cGVkZWYgX19hdHRyaWJ1dGVfXygoIGV4dF92ZWN0b3JfdHlwZSg0KSApKSAgY2hhciBfX2NoYXI0OwordHlwZWRlZiBfX2F0dHJpYnV0ZV9fKCggZXh0X3ZlY3Rvcl90eXBlKDUpICkpICBjaGFyIF9fY2hhcjU7Cit0eXBlZGVmIF9fYXR0cmlidXRlX18oKCBleHRfdmVjdG9yX3R5cGUoOSkgKSkgIGNoYXIgX19jaGFyOTsKK3R5cGVkZWYgX19hdHRyaWJ1dGVfXygoIGV4dF92ZWN0b3JfdHlwZSgxOSkgKSkgY2hhciBfX2NoYXIxOTsKK3R5cGVkZWYgX19hdHRyaWJ1dGVfXygoIGV4dF92ZWN0b3JfdHlwZSgzKSApKSAgc2hvcnQgX19zaG9ydDM7Cit0eXBlZGVmIF9fYXR0cmlidXRlX18oKCBleHRfdmVjdG9yX3R5cGUoNSkgKSkgIHNob3J0IF9fc2hvcnQ1OwordHlwZWRlZiBfX2F0dHJpYnV0ZV9fKCggZXh0X3ZlY3Rvcl90eXBlKDMpICkpICBpbnQgX19pbnQzOwordHlwZWRlZiBfX2F0dHJpYnV0ZV9fKCggZXh0X3ZlY3Rvcl90eXBlKDUpICkpICBpbnQgX19pbnQ1OwordHlwZWRlZiBfX2F0dHJpYnV0ZV9fKCggZXh0X3ZlY3Rvcl90eXBlKDMpICkpICBkb3VibGUgX19kb3VibGUzOworCitkb3VibGUgdmFyYXJnc192ZWNfM2MoaW50IGZpeGVkLCAuLi4pIHsKKy8vIENIRUNLOiB2YXJhcmdzX3ZlY18zYworLy8gQ0hFQ0s6IGFsbG9jYSA8MyB4IGk4PiwgYWxpZ24gNAorLy8gQ0hFQ0s6IFtbQVBfTkVYVDolLipdXSA9IGdldGVsZW1lbnRwdHIgaTgqIFtbQVBfQ1VSOiUuKl1dLCBpMzIgOAorLy8gQ0hFQ0s6IGJpdGNhc3QgaTgqIFtbQVBfQ1VSXV0gdG8gPDMgeCBpOD4qCisgIHZhX2xpc3QgYXA7CisgIGRvdWJsZSBzdW0gPSBmaXhlZDsKKyAgdmFfc3RhcnQoYXAsIGZpeGVkKTsKKyAgX19jaGFyMyBjMyA9IHZhX2FyZyhhcCwgX19jaGFyMyk7CisgIHN1bSA9IHN1bSArIGMzLnggKyBjMy55OworICB2YV9lbmQoYXApOworICByZXR1cm4gc3VtOworfQorCitkb3VibGUgdGVzdF8zYyhfX2NoYXIzICppbikgeworLy8gQ0hFQ0s6IHRlc3RfM2MKKy8vIENIRUNLOiBjYWxsIGRvdWJsZSAoaTMyLCAuLi4pKiBAdmFyYXJnc192ZWNfM2MoaTMyIDMsIGkzMiB7eyUuKn19KQorICByZXR1cm4gdmFyYXJnc192ZWNfM2MoMywgKmluKTsKK30KKworZG91YmxlIHZhcmFyZ3NfdmVjXzRjKGludCBmaXhlZCwgLi4uKSB7CisvLyBDSEVDSzogdmFyYXJnc192ZWNfNGMKKy8vIENIRUNLOiBhbGxvY2EgPDQgeCBpOD4sIGFsaWduIDQKKy8vIENIRUNLOiBbW0FQX05FWFQ6JS4qXV0gPSBnZXRlbGVtZW50cHRyIGk4KiBbW0FQX0NVUjolLipdXSwgaTMyIDgKKy8vIENIRUNLOiBiaXRjYXN0IGk4KiBbW0FQX0NVUl1dIHRvIDw0IHggaTg+KgorICB2YV9saXN0IGFwOworICBkb3VibGUgc3VtID0gZml4ZWQ7CisgIHZhX3N0YXJ0KGFwLCBmaXhlZCk7CisgIF9fY2hhcjQgYzQgPSB2YV9hcmcoYXAsIF9fY2hhcjQpOworICBzdW0gPSBzdW0gKyBjNC54ICsgYzQueTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuIHN1bTsKK30KKworZG91YmxlIHRlc3RfNGMoX19jaGFyNCAqaW4pIHsKKy8vIENIRUNLOiB0ZXN0XzRjCisvLyBDSEVDSzogY2FsbCBkb3VibGUgKGkzMiwgLi4uKSogQHZhcmFyZ3NfdmVjXzRjKGkzMiA0LCBpMzIge3slLip9fSkKKyAgcmV0dXJuIHZhcmFyZ3NfdmVjXzRjKDQsICppbik7Cit9CisKK2RvdWJsZSB2YXJhcmdzX3ZlY181YyhpbnQgZml4ZWQsIC4uLikgeworLy8gQ0hFQ0s6IHZhcmFyZ3NfdmVjXzVjCisvLyBDSEVDSzogYWxsb2NhIDw1IHggaTg+LCBhbGlnbiA4CisvLyBDSEVDSzogW1tBUF9ORVhUOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tBUF9DVVI6JS4qXV0sIGkzMiA4CisvLyBDSEVDSzogYml0Y2FzdCBpOCogW1tBUF9DVVJdXSB0byA8NSB4IGk4PioKKyAgdmFfbGlzdCBhcDsKKyAgZG91YmxlIHN1bSA9IGZpeGVkOworICB2YV9zdGFydChhcCwgZml4ZWQpOworICBfX2NoYXI1IGM1ID0gdmFfYXJnKGFwLCBfX2NoYXI1KTsKKyAgc3VtID0gc3VtICsgYzUueCArIGM1Lnk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiBzdW07Cit9CisKK2RvdWJsZSB0ZXN0XzVjKF9fY2hhcjUgKmluKSB7CisvLyBDSEVDSzogdGVzdF81YworLy8gQ0hFQ0s6IGNhbGwgZG91YmxlIChpMzIsIC4uLikqIEB2YXJhcmdzX3ZlY181YyhpMzIgNSwgPDIgeCBpMzI+IHt7JS4qfX0pCisgIHJldHVybiB2YXJhcmdzX3ZlY181Yyg1LCAqaW4pOworfQorCitkb3VibGUgdmFyYXJnc192ZWNfOWMoaW50IGZpeGVkLCAuLi4pIHsKKy8vIENIRUNLOiB2YXJhcmdzX3ZlY185YworLy8gQ0hFQ0s6IGFsbG9jYSA8OSB4IGk4PiwgYWxpZ24gMTYKKy8vIENIRUNLOiBbW0FMSUdOOiUuKl1dID0gYW5kIGk2NCB7eyUuKn19LCAtMTYKKy8vIENIRUNLOiBbW0FQX0FMSUdOOiUuKl1dID0gaW50dG9wdHIgaTY0IFtbQUxJR05dXSB0byBpOCoKKy8vIENIRUNLOiBbW0FQX05FWFQ6JS4qXV0gPSBnZXRlbGVtZW50cHRyIGk4KiBbW0FQX0FMSUdOXV0sIGkzMiAxNgorLy8gQ0hFQ0s6IGJpdGNhc3QgaTgqIFtbQVBfQUxJR05dXSB0byA8OSB4IGk4PioKKyAgdmFfbGlzdCBhcDsKKyAgZG91YmxlIHN1bSA9IGZpeGVkOworICB2YV9zdGFydChhcCwgZml4ZWQpOworICBfX2NoYXI5IGM5ID0gdmFfYXJnKGFwLCBfX2NoYXI5KTsKKyAgc3VtID0gc3VtICsgYzkueCArIGM5Lnk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiBzdW07Cit9CisKK2RvdWJsZSB0ZXN0XzljKF9fY2hhcjkgKmluKSB7CisvLyBDSEVDSzogdGVzdF85YworLy8gQ0hFQ0s6IGNhbGwgZG91YmxlIChpMzIsIC4uLikqIEB2YXJhcmdzX3ZlY185YyhpMzIgOSwgPDQgeCBpMzI+IHt7JS4qfX0pCisgIHJldHVybiB2YXJhcmdzX3ZlY185Yyg5LCAqaW4pOworfQorCitkb3VibGUgdmFyYXJnc192ZWNfMTljKGludCBmaXhlZCwgLi4uKSB7CisvLyBDSEVDSzogdmFyYXJnc192ZWNfMTljCisvLyBDSEVDSzogW1tBUF9ORVhUOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tBUF9DVVI6JS4qXV0sIGkzMiA4CisvLyBDSEVDSzogW1tWQVI6JS4qXV0gPSBiaXRjYXN0IGk4KiBbW0FQX0NVUl1dIHRvIGk4KioKKy8vIENIRUNLOiBbW1ZBUjI6JS4qXV0gPSBsb2FkIGk4KiogW1tWQVJdXQorLy8gQ0hFQ0s6IGJpdGNhc3QgaTgqIFtbVkFSMl1dIHRvIDwxOSB4IGk4PioKKyAgdmFfbGlzdCBhcDsKKyAgZG91YmxlIHN1bSA9IGZpeGVkOworICB2YV9zdGFydChhcCwgZml4ZWQpOworICBfX2NoYXIxOSBjMTkgPSB2YV9hcmcoYXAsIF9fY2hhcjE5KTsKKyAgc3VtID0gc3VtICsgYzE5LnggKyBjMTkueTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuIHN1bTsKK30KKworZG91YmxlIHRlc3RfMTljKF9fY2hhcjE5ICppbikgeworLy8gQ0hFQ0s6IHRlc3RfMTljCisvLyBDSEVDSzogY2FsbCBkb3VibGUgKGkzMiwgLi4uKSogQHZhcmFyZ3NfdmVjXzE5YyhpMzIgMTksIDwxOSB4IGk4Pioge3slLip9fSkKKyAgcmV0dXJuIHZhcmFyZ3NfdmVjXzE5YygxOSwgKmluKTsKK30KKworZG91YmxlIHZhcmFyZ3NfdmVjXzNzKGludCBmaXhlZCwgLi4uKSB7CisvLyBDSEVDSzogdmFyYXJnc192ZWNfM3MKKy8vIENIRUNLOiBhbGxvY2EgPDMgeCBpMTY+LCBhbGlnbiA4CisvLyBDSEVDSzogW1tBUF9ORVhUOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tBUF9DVVI6JS4qXV0sIGkzMiA4CisvLyBDSEVDSzogYml0Y2FzdCBpOCogW1tBUF9DVVJdXSB0byA8MyB4IGkxNj4qCisgIHZhX2xpc3QgYXA7CisgIGRvdWJsZSBzdW0gPSBmaXhlZDsKKyAgdmFfc3RhcnQoYXAsIGZpeGVkKTsKKyAgX19zaG9ydDMgYzMgPSB2YV9hcmcoYXAsIF9fc2hvcnQzKTsKKyAgc3VtID0gc3VtICsgYzMueCArIGMzLnk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiBzdW07Cit9CisKK2RvdWJsZSB0ZXN0XzNzKF9fc2hvcnQzICppbikgeworLy8gQ0hFQ0s6IHRlc3RfM3MKKy8vIENIRUNLOiBjYWxsIGRvdWJsZSAoaTMyLCAuLi4pKiBAdmFyYXJnc192ZWNfM3MoaTMyIDMsIDwyIHggaTMyPiB7eyUuKn19KQorICByZXR1cm4gdmFyYXJnc192ZWNfM3MoMywgKmluKTsKK30KKworZG91YmxlIHZhcmFyZ3NfdmVjXzVzKGludCBmaXhlZCwgLi4uKSB7CisvLyBDSEVDSzogdmFyYXJnc192ZWNfNXMKKy8vIENIRUNLOiBhbGxvY2EgPDUgeCBpMTY+LCBhbGlnbiAxNgorLy8gQ0hFQ0s6IFtbQUxJR046JS4qXV0gPSBhbmQgaTY0IHt7JS4qfX0sIC0xNgorLy8gQ0hFQ0s6IFtbQVBfQUxJR046JS4qXV0gPSBpbnR0b3B0ciBpNjQgW1tBTElHTl1dIHRvIGk4KgorLy8gQ0hFQ0s6IFtbQVBfTkVYVDolLipdXSA9IGdldGVsZW1lbnRwdHIgaTgqIFtbQVBfQUxJR05dXSwgaTMyIDE2CisvLyBDSEVDSzogYml0Y2FzdCBpOCogW1tBUF9BTElHTl1dIHRvIDw1IHggaTE2PioKKyAgdmFfbGlzdCBhcDsKKyAgZG91YmxlIHN1bSA9IGZpeGVkOworICB2YV9zdGFydChhcCwgZml4ZWQpOworICBfX3Nob3J0NSBjNSA9IHZhX2FyZyhhcCwgX19zaG9ydDUpOworICBzdW0gPSBzdW0gKyBjNS54ICsgYzUueTsKKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuIHN1bTsKK30KKworZG91YmxlIHRlc3RfNXMoX19zaG9ydDUgKmluKSB7CisvLyBDSEVDSzogdGVzdF81cworLy8gQ0hFQ0s6IGNhbGwgZG91YmxlIChpMzIsIC4uLikqIEB2YXJhcmdzX3ZlY181cyhpMzIgNSwgPDQgeCBpMzI+IHt7JS4qfX0pCisgIHJldHVybiB2YXJhcmdzX3ZlY181cyg1LCAqaW4pOworfQorCitkb3VibGUgdmFyYXJnc192ZWNfM2koaW50IGZpeGVkLCAuLi4pIHsKKy8vIENIRUNLOiB2YXJhcmdzX3ZlY18zaQorLy8gQ0hFQ0s6IGFsbG9jYSA8MyB4IGkzMj4sIGFsaWduIDE2CisvLyBDSEVDSzogW1tBTElHTjolLipdXSA9IGFuZCBpNjQge3slLip9fSwgLTE2CisvLyBDSEVDSzogW1tBUF9BTElHTjolLipdXSA9IGludHRvcHRyIGk2NCBbW0FMSUdOXV0gdG8gaTgqCisvLyBDSEVDSzogW1tBUF9ORVhUOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tBUF9BTElHTl1dLCBpMzIgMTYKKy8vIENIRUNLOiBiaXRjYXN0IGk4KiBbW0FQX0FMSUdOXV0gdG8gPDMgeCBpMzI+KgorICB2YV9saXN0IGFwOworICBkb3VibGUgc3VtID0gZml4ZWQ7CisgIHZhX3N0YXJ0KGFwLCBmaXhlZCk7CisgIF9faW50MyBjMyA9IHZhX2FyZyhhcCwgX19pbnQzKTsKKyAgc3VtID0gc3VtICsgYzMueCArIGMzLnk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiBzdW07Cit9CisKK2RvdWJsZSB0ZXN0XzNpKF9faW50MyAqaW4pIHsKKy8vIENIRUNLOiB0ZXN0XzNpCisvLyBDSEVDSzogY2FsbCBkb3VibGUgKGkzMiwgLi4uKSogQHZhcmFyZ3NfdmVjXzNpKGkzMiAzLCA8NCB4IGkzMj4ge3slLip9fSkKKyAgcmV0dXJuIHZhcmFyZ3NfdmVjXzNpKDMsICppbik7Cit9CisKK2RvdWJsZSB2YXJhcmdzX3ZlY181aShpbnQgZml4ZWQsIC4uLikgeworLy8gQ0hFQ0s6IHZhcmFyZ3NfdmVjXzVpCisvLyBDSEVDSzogYWxsb2NhIDw1IHggaTMyPiwgYWxpZ24gMTYKKy8vIENIRUNLOiBbW0FQX05FWFQ6JS4qXV0gPSBnZXRlbGVtZW50cHRyIGk4KiBbW0FQX0NVUjolLipdXSwgaTMyIDgKKy8vIENIRUNLOiBbW1ZBUjolLipdXSA9IGJpdGNhc3QgaTgqIFtbQVBfQ1VSXV0gdG8gaTgqKgorLy8gQ0hFQ0s6IFtbVkFSMjolLipdXSA9IGxvYWQgaTgqKiBbW1ZBUl1dCisvLyBDSEVDSzogYml0Y2FzdCBpOCogW1tWQVIyXV0gdG8gPDUgeCBpMzI+KgorICB2YV9saXN0IGFwOworICBkb3VibGUgc3VtID0gZml4ZWQ7CisgIHZhX3N0YXJ0KGFwLCBmaXhlZCk7CisgIF9faW50NSBjNSA9IHZhX2FyZyhhcCwgX19pbnQ1KTsKKyAgc3VtID0gc3VtICsgYzUueCArIGM1Lnk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiBzdW07Cit9CisKK2RvdWJsZSB0ZXN0XzVpKF9faW50NSAqaW4pIHsKKy8vIENIRUNLOiB0ZXN0XzVpCisvLyBDSEVDSzogY2FsbCBkb3VibGUgKGkzMiwgLi4uKSogQHZhcmFyZ3NfdmVjXzVpKGkzMiA1LCA8NSB4IGkzMj4qIHt7JS4qfX0pCisgIHJldHVybiB2YXJhcmdzX3ZlY181aSg1LCAqaW4pOworfQorCitkb3VibGUgdmFyYXJnc192ZWNfM2QoaW50IGZpeGVkLCAuLi4pIHsKKy8vIENIRUNLOiB2YXJhcmdzX3ZlY18zZAorLy8gQ0hFQ0s6IGFsbG9jYSA8MyB4IGRvdWJsZT4sIGFsaWduIDE2CisvLyBDSEVDSzogW1tBUF9ORVhUOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tBUF9DVVI6JS4qXV0sIGkzMiA4CisvLyBDSEVDSzogW1tWQVI6JS4qXV0gPSBiaXRjYXN0IGk4KiBbW0FQX0NVUl1dIHRvIGk4KioKKy8vIENIRUNLOiBbW1ZBUjI6JS4qXV0gPSBsb2FkIGk4KiogW1tWQVJdXQorLy8gQ0hFQ0s6IGJpdGNhc3QgaTgqIFtbVkFSMl1dIHRvIDwzIHggZG91YmxlPioKKyAgdmFfbGlzdCBhcDsKKyAgZG91YmxlIHN1bSA9IGZpeGVkOworICB2YV9zdGFydChhcCwgZml4ZWQpOworICBfX2RvdWJsZTMgYzMgPSB2YV9hcmcoYXAsIF9fZG91YmxlMyk7CisgIHN1bSA9IHN1bSArIGMzLnggKyBjMy55OworICB2YV9lbmQoYXApOworICByZXR1cm4gc3VtOworfQorCitkb3VibGUgdGVzdF8zZChfX2RvdWJsZTMgKmluKSB7CisvLyBDSEVDSzogdGVzdF8zZAorLy8gQ0hFQ0s6IGNhbGwgZG91YmxlIChpMzIsIC4uLikqIEB2YXJhcmdzX3ZlY18zZChpMzIgMywgPDMgeCBkb3VibGU+KiB7eyUuKn19KQorICByZXR1cm4gdmFyYXJnc192ZWNfM2QoMywgKmluKTsKK30KKworZG91YmxlIHZhcmFyZ3NfdmVjKGludCBmaXhlZCwgLi4uKSB7CisvLyBDSEVDSzogdmFyYXJnc192ZWMKKyAgdmFfbGlzdCBhcDsKKyAgZG91YmxlIHN1bSA9IGZpeGVkOworICB2YV9zdGFydChhcCwgZml4ZWQpOworICBfX2NoYXIzIGMzID0gdmFfYXJnKGFwLCBfX2NoYXIzKTsKKy8vIENIRUNLOiBbW0FQX05FWFQ6JS4qXV0gPSBnZXRlbGVtZW50cHRyIGk4KiBbW0FQX0NVUjolLipdXSwgaTMyIDgKKy8vIENIRUNLOiBiaXRjYXN0IGk4KiBbW0FQX0NVUl1dIHRvIDwzIHggaTg+KgorICBzdW0gPSBzdW0gKyBjMy54ICsgYzMueTsKKyAgX19jaGFyNSBjNSA9IHZhX2FyZyhhcCwgX19jaGFyNSk7CisvLyBDSEVDSzogW1tBUF9ORVhUOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tBUF9DVVI6JS4qXV0sIGkzMiA4CisvLyBDSEVDSzogYml0Y2FzdCBpOCogW1tBUF9DVVJdXSB0byA8NSB4IGk4PioKKyAgc3VtID0gc3VtICsgYzUueCArIGM1Lnk7CisgIF9fY2hhcjkgYzkgPSB2YV9hcmcoYXAsIF9fY2hhcjkpOworLy8gQ0hFQ0s6IFtbQUxJR046JS4qXV0gPSBhbmQgaTY0IHt7JS4qfX0sIC0xNgorLy8gQ0hFQ0s6IFtbQVBfQUxJR046JS4qXV0gPSBpbnR0b3B0ciBpNjQgW1tBTElHTl1dIHRvIGk4KgorLy8gQ0hFQ0s6IFtbQVBfTkVYVDolLipdXSA9IGdldGVsZW1lbnRwdHIgaTgqIFtbQVBfQUxJR05dXSwgaTMyIDE2CisvLyBDSEVDSzogYml0Y2FzdCBpOCogW1tBUF9BTElHTl1dIHRvIDw5IHggaTg+KgorICBzdW0gPSBzdW0gKyBjOS54ICsgYzkueTsKKyAgX19jaGFyMTkgYzE5ID0gdmFfYXJnKGFwLCBfX2NoYXIxOSk7CisvLyBDSEVDSzogW1tBUF9ORVhUOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tBUF9DVVI6JS4qXV0sIGkzMiA4CisvLyBDSEVDSzogW1tWQVI6JS4qXV0gPSBiaXRjYXN0IGk4KiBbW0FQX0NVUl1dIHRvIGk4KioKKy8vIENIRUNLOiBbW1ZBUjI6JS4qXV0gPSBsb2FkIGk4KiogW1tWQVJdXQorLy8gQ0hFQ0s6IGJpdGNhc3QgaTgqIFtbVkFSMl1dIHRvIDwxOSB4IGk4PioKKyAgc3VtID0gc3VtICsgYzE5LnggKyBjMTkueTsKKyAgX19zaG9ydDMgczMgPSB2YV9hcmcoYXAsIF9fc2hvcnQzKTsKKy8vIENIRUNLOiBbW0FQX05FWFQ6JS4qXV0gPSBnZXRlbGVtZW50cHRyIGk4KiBbW0FQX0NVUjolLipdXSwgaTMyIDgKKy8vIENIRUNLOiBiaXRjYXN0IGk4KiBbW0FQX0NVUl1dIHRvIDwzIHggaTE2PioKKyAgc3VtID0gc3VtICsgczMueCArIHMzLnk7CisgIF9fc2hvcnQ1IHM1ID0gdmFfYXJnKGFwLCBfX3Nob3J0NSk7CisvLyBDSEVDSzogW1tBTElHTjolLipdXSA9IGFuZCBpNjQge3slLip9fSwgLTE2CisvLyBDSEVDSzogW1tBUF9BTElHTjolLipdXSA9IGludHRvcHRyIGk2NCBbW0FMSUdOXV0gdG8gaTgqCisvLyBDSEVDSzogW1tBUF9ORVhUOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tBUF9BTElHTl1dLCBpMzIgMTYKKy8vIENIRUNLOiBiaXRjYXN0IGk4KiBbW0FQX0FMSUdOXV0gdG8gPDUgeCBpMTY+KgorICBzdW0gPSBzdW0gKyBzNS54ICsgczUueTsKKyAgX19pbnQzIGkzID0gdmFfYXJnKGFwLCBfX2ludDMpOworLy8gQ0hFQ0s6IFtbQUxJR046JS4qXV0gPSBhbmQgaTY0IHt7JS4qfX0sIC0xNgorLy8gQ0hFQ0s6IFtbQVBfQUxJR046JS4qXV0gPSBpbnR0b3B0ciBpNjQgW1tBTElHTl1dIHRvIGk4KgorLy8gQ0hFQ0s6IFtbQVBfTkVYVDolLipdXSA9IGdldGVsZW1lbnRwdHIgaTgqIFtbQVBfQUxJR05dXSwgaTMyIDE2CisvLyBDSEVDSzogYml0Y2FzdCBpOCogW1tBUF9BTElHTl1dIHRvIDwzIHggaTMyPioKKyAgc3VtID0gc3VtICsgaTMueCArIGkzLnk7CisgIF9faW50NSBpNSA9IHZhX2FyZyhhcCwgX19pbnQ1KTsKKy8vIENIRUNLOiBbW0FQX05FWFQ6JS4qXV0gPSBnZXRlbGVtZW50cHRyIGk4KiBbW0FQX0NVUjolLipdXSwgaTMyIDgKKy8vIENIRUNLOiBbW1ZBUjolLipdXSA9IGJpdGNhc3QgaTgqIFtbQVBfQ1VSXV0gdG8gaTgqKgorLy8gQ0hFQ0s6IFtbVkFSMjolLipdXSA9IGxvYWQgaTgqKiBbW1ZBUl1dCisvLyBDSEVDSzogYml0Y2FzdCBpOCogW1tWQVIyXV0gdG8gPDUgeCBpMzI+KgorICBzdW0gPSBzdW0gKyBpNS54ICsgaTUueTsKKyAgX19kb3VibGUzIGQzID0gdmFfYXJnKGFwLCBfX2RvdWJsZTMpOworLy8gQ0hFQ0s6IFtbQVBfTkVYVDolLipdXSA9IGdldGVsZW1lbnRwdHIgaTgqIFtbQVBfQ1VSOiUuKl1dLCBpMzIgOAorLy8gQ0hFQ0s6IFtbVkFSOiUuKl1dID0gYml0Y2FzdCBpOCogW1tBUF9DVVJdXSB0byBpOCoqCisvLyBDSEVDSzogW1tWQVIyOiUuKl1dID0gbG9hZCBpOCoqIFtbVkFSXV0KKy8vIENIRUNLOiBiaXRjYXN0IGk4KiBbW1ZBUjJdXSB0byA8MyB4IGRvdWJsZT4qCisgIHN1bSA9IHN1bSArIGQzLnggKyBkMy55OworICB2YV9lbmQoYXApOworICByZXR1cm4gc3VtOworfQorCitkb3VibGUgdGVzdChfX2NoYXIzICpjMywgX19jaGFyNSAqYzUsIF9fY2hhcjkgKmM5LCBfX2NoYXIxOSAqYzE5LAorICAgICAgICAgICAgX19zaG9ydDMgKnMzLCBfX3Nob3J0NSAqczUsIF9faW50MyAqaTMsIF9faW50NSAqaTUsCisgICAgICAgICAgICBfX2RvdWJsZTMgKmQzKSB7CisgIGRvdWJsZSByZXQgPSB2YXJhcmdzX3ZlYygzLCAqYzMsICpjNSwgKmM5LCAqYzE5LCAqczMsICpzNSwgKmkzLCAqaTUsICpkMyk7CisvLyBDSEVDSzogY2FsbCBkb3VibGUgKGkzMiwgLi4uKSogQHZhcmFyZ3NfdmVjKGkzMiAzLCBpMzIge3slLip9fSwgPDIgeCBpMzI+IHt7JS4qfX0sIDw0IHggaTMyPiB7eyUuKn19LCA8MTkgeCBpOD4qIHt7JS4qfX0sIDwyIHggaTMyPiB7eyUuKn19LCA8NCB4IGkzMj4ge3slLip9fSwgPDQgeCBpMzI+IHt7JS4qfX0sIDw1IHggaTMyPioge3slLip9fSwgPDMgeCBkb3VibGU+KiB7eyUuKn19KQorICByZXR1cm4gcmV0OworfQorCitfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpIGRvdWJsZSBhcmdzX3ZlY18zYyhpbnQgZml4ZWQsIF9fY2hhcjMgYzMpIHsKKy8vIENIRUNLOiBhcmdzX3ZlY18zYworLy8gQ0hFQ0s6IFtbQzM6JS4qXV0gPSBhbGxvY2EgPDMgeCBpOD4sIGFsaWduIDQKKy8vIENIRUNLOiBbW1RNUDolLipdXSA9IGJpdGNhc3QgPDMgeCBpOD4qIFtbQzNdXSB0byBpMzIqCisvLyBDSEVDSzogc3RvcmUgaTMyIHt7JS4qfX0sIGkzMiogW1tUTVBdXQorICBkb3VibGUgc3VtID0gZml4ZWQ7CisgIHN1bSA9IHN1bSArIGMzLnggKyBjMy55OworICByZXR1cm4gc3VtOworfQorCitkb3VibGUgZml4ZWRfM2MoX19jaGFyMyAqaW4pIHsKKy8vIENIRUNLOiBmaXhlZF8zYworLy8gQ0hFQ0s6IGNhbGwgZG91YmxlIEBhcmdzX3ZlY18zYyhpMzIgMywgaTMyIHt7JS4qfX0pCisgIHJldHVybiBhcmdzX3ZlY18zYygzLCAqaW4pOworfQorCitfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpIGRvdWJsZSBhcmdzX3ZlY181YyhpbnQgZml4ZWQsIF9fY2hhcjUgYzUpIHsKKy8vIENIRUNLOiBhcmdzX3ZlY181YworLy8gQ0hFQ0s6IFtbQzU6JS4qXV0gPSBhbGxvY2EgPDUgeCBpOD4sIGFsaWduIDgKKy8vIENIRUNLOiBbW1RNUDolLipdXSA9IGJpdGNhc3QgPDUgeCBpOD4qIFtbQzVdXSB0byA8MiB4IGkzMj4qCisvLyBDSEVDSzogc3RvcmUgPDIgeCBpMzI+IHt7JS4qfX0sIDwyIHggaTMyPiogW1tUTVBdXSwgYWxpZ24gMQorICBkb3VibGUgc3VtID0gZml4ZWQ7CisgIHN1bSA9IHN1bSArIGM1LnggKyBjNS55OworICByZXR1cm4gc3VtOworfQorCitkb3VibGUgZml4ZWRfNWMoX19jaGFyNSAqaW4pIHsKKy8vIENIRUNLOiBmaXhlZF81YworLy8gQ0hFQ0s6IGNhbGwgZG91YmxlIEBhcmdzX3ZlY181YyhpMzIgNSwgPDIgeCBpMzI+IHt7JS4qfX0pCisgIHJldHVybiBhcmdzX3ZlY181Yyg1LCAqaW4pOworfQorCitfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpIGRvdWJsZSBhcmdzX3ZlY185YyhpbnQgZml4ZWQsIF9fY2hhcjkgYzkpIHsKKy8vIENIRUNLOiBhcmdzX3ZlY185YworLy8gQ0hFQ0s6IFtbQzk6JS4qXV0gPSBhbGxvY2EgPDkgeCBpOD4sIGFsaWduIDE2CisvLyBDSEVDSzogW1tUTVA6JS4qXV0gPSBiaXRjYXN0IDw5IHggaTg+KiBbW0M5XV0gdG8gPDQgeCBpMzI+KgorLy8gQ0hFQ0s6IHN0b3JlIDw0IHggaTMyPiB7eyUuKn19LCA8NCB4IGkzMj4qIFtbVE1QXV0sIGFsaWduIDEKKyAgZG91YmxlIHN1bSA9IGZpeGVkOworICBzdW0gPSBzdW0gKyBjOS54ICsgYzkueTsKKyAgcmV0dXJuIHN1bTsKK30KKworZG91YmxlIGZpeGVkXzljKF9fY2hhcjkgKmluKSB7CisvLyBDSEVDSzogZml4ZWRfOWMKKy8vIENIRUNLOiBjYWxsIGRvdWJsZSBAYXJnc192ZWNfOWMoaTMyIDksIDw0IHggaTMyPiB7eyUuKn19KQorICByZXR1cm4gYXJnc192ZWNfOWMoOSwgKmluKTsKK30KKworX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSBkb3VibGUgYXJnc192ZWNfMTljKGludCBmaXhlZCwgX19jaGFyMTkgYzE5KSB7CisvLyBDSEVDSzogYXJnc192ZWNfMTljCisvLyBDSEVDSzogW1tDMTk6JS4qXV0gPSBsb2FkIDwxOSB4IGk4Pioge3suKn19LCBhbGlnbiAxNgorICBkb3VibGUgc3VtID0gZml4ZWQ7CisgIHN1bSA9IHN1bSArIGMxOS54ICsgYzE5Lnk7CisgIHJldHVybiBzdW07Cit9CisKK2RvdWJsZSBmaXhlZF8xOWMoX19jaGFyMTkgKmluKSB7CisvLyBDSEVDSzogZml4ZWRfMTljCisvLyBDSEVDSzogY2FsbCBkb3VibGUgQGFyZ3NfdmVjXzE5YyhpMzIgMTksIDwxOSB4IGk4Pioge3slLip9fSkKKyAgcmV0dXJuIGFyZ3NfdmVjXzE5YygxOSwgKmluKTsKK30KKworX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSBkb3VibGUgYXJnc192ZWNfM3MoaW50IGZpeGVkLCBfX3Nob3J0MyBjMykgeworLy8gQ0hFQ0s6IGFyZ3NfdmVjXzNzCisvLyBDSEVDSzogW1tDMzolLipdXSA9IGFsbG9jYSA8MyB4IGkxNj4sIGFsaWduIDgKKy8vIENIRUNLOiBbW1RNUDolLipdXSA9IGJpdGNhc3QgPDMgeCBpMTY+KiBbW0MzXV0gdG8gPDIgeCBpMzI+KgorLy8gQ0hFQ0s6IHN0b3JlIDwyIHggaTMyPiB7eyUuKn19LCA8MiB4IGkzMj4qIFtbVE1QXV0sIGFsaWduIDEKKyAgZG91YmxlIHN1bSA9IGZpeGVkOworICBzdW0gPSBzdW0gKyBjMy54ICsgYzMueTsKKyAgcmV0dXJuIHN1bTsKK30KKworZG91YmxlIGZpeGVkXzNzKF9fc2hvcnQzICppbikgeworLy8gQ0hFQ0s6IGZpeGVkXzNzCisvLyBDSEVDSzogY2FsbCBkb3VibGUgQGFyZ3NfdmVjXzNzKGkzMiAzLCA8MiB4IGkzMj4ge3slLip9fSkKKyAgcmV0dXJuIGFyZ3NfdmVjXzNzKDMsICppbik7Cit9CisKK19fYXR0cmlidXRlX18oKG5vaW5saW5lKSkgZG91YmxlIGFyZ3NfdmVjXzVzKGludCBmaXhlZCwgX19zaG9ydDUgYzUpIHsKKy8vIENIRUNLOiBhcmdzX3ZlY181cworLy8gQ0hFQ0s6IFtbQzU6JS4qXV0gPSBhbGxvY2EgPDUgeCBpMTY+LCBhbGlnbiAxNgorLy8gQ0hFQ0s6IFtbVE1QOiUuKl1dID0gYml0Y2FzdCA8NSB4IGkxNj4qIFtbQzVdXSB0byA8NCB4IGkzMj4qCisvLyBDSEVDSzogc3RvcmUgPDQgeCBpMzI+IHt7JS4qfX0sIDw0IHggaTMyPiogW1tUTVBdXSwgYWxpZ24gMQorICBkb3VibGUgc3VtID0gZml4ZWQ7CisgIHN1bSA9IHN1bSArIGM1LnggKyBjNS55OworICByZXR1cm4gc3VtOworfQorCitkb3VibGUgZml4ZWRfNXMoX19zaG9ydDUgKmluKSB7CisvLyBDSEVDSzogZml4ZWRfNXMKKy8vIENIRUNLOiBjYWxsIGRvdWJsZSBAYXJnc192ZWNfNXMoaTMyIDUsIDw0IHggaTMyPiB7eyUuKn19KQorICByZXR1cm4gYXJnc192ZWNfNXMoNSwgKmluKTsKK30KKworX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKSBkb3VibGUgYXJnc192ZWNfM2koaW50IGZpeGVkLCBfX2ludDMgYzMpIHsKKy8vIENIRUNLOiBhcmdzX3ZlY18zaQorLy8gQ0hFQ0s6IFtbQzM6JS4qXV0gPSBhbGxvY2EgPDMgeCBpMzI+LCBhbGlnbiAxNgorLy8gQ0hFQ0s6IFtbVE1QOiUuKl1dID0gYml0Y2FzdCA8MyB4IGkzMj4qIFtbQzNdXSB0byA8NCB4IGkzMj4qCisvLyBDSEVDSzogc3RvcmUgPDQgeCBpMzI+IHt7JS4qfX0sIDw0IHggaTMyPiogW1tUTVBdXSwgYWxpZ24gMQorICBkb3VibGUgc3VtID0gZml4ZWQ7CisgIHN1bSA9IHN1bSArIGMzLnggKyBjMy55OworICByZXR1cm4gc3VtOworfQorCitkb3VibGUgZml4ZWRfM2koX19pbnQzICppbikgeworLy8gQ0hFQ0s6IGZpeGVkXzNpCisvLyBDSEVDSzogY2FsbCBkb3VibGUgQGFyZ3NfdmVjXzNpKGkzMiAzLCA8NCB4IGkzMj4ge3slLip9fSkKKyAgcmV0dXJuIGFyZ3NfdmVjXzNpKDMsICppbik7Cit9CisKK19fYXR0cmlidXRlX18oKG5vaW5saW5lKSkgZG91YmxlIGFyZ3NfdmVjXzVpKGludCBmaXhlZCwgX19pbnQ1IGM1KSB7CisvLyBDSEVDSzogYXJnc192ZWNfNWkKKy8vIENIRUNLOiBbW0M1OiUuKl1dID0gbG9hZCA8NSB4IGkzMj4qIHt7JS4qfX0sIGFsaWduIDE2CisgIGRvdWJsZSBzdW0gPSBmaXhlZDsKKyAgc3VtID0gc3VtICsgYzUueCArIGM1Lnk7CisgIHJldHVybiBzdW07Cit9CisKK2RvdWJsZSBmaXhlZF81aShfX2ludDUgKmluKSB7CisvLyBDSEVDSzogZml4ZWRfNWkKKy8vIENIRUNLOiBjYWxsIGRvdWJsZSBAYXJnc192ZWNfNWkoaTMyIDUsIDw1IHggaTMyPioge3slLip9fSkKKyAgcmV0dXJuIGFyZ3NfdmVjXzVpKDUsICppbik7Cit9CisKK19fYXR0cmlidXRlX18oKG5vaW5saW5lKSkgZG91YmxlIGFyZ3NfdmVjXzNkKGludCBmaXhlZCwgX19kb3VibGUzIGMzKSB7CisvLyBDSEVDSzogYXJnc192ZWNfM2QKKy8vIENIRUNLOiBbW0NBU1Q6JS4qXV0gPSBiaXRjYXN0IDwzIHggZG91YmxlPioge3slLip9fSB0byA8NCB4IGRvdWJsZT4qCisvLyBDSEVDSzogW1tMT0FEOiUuKl1dID0gbG9hZCA8NCB4IGRvdWJsZT4qIFtbQ0FTVF1dCisvLyBDSEVDSzogc2h1ZmZsZXZlY3RvciA8NCB4IGRvdWJsZT4gW1tMT0FEXV0sIDw0IHggZG91YmxlPiB1bmRlZiwgPDMgeCBpMzI+IDxpMzIgMCwgaTMyIDEsIGkzMiAyPgorICBkb3VibGUgc3VtID0gZml4ZWQ7CisgIHN1bSA9IHN1bSArIGMzLnggKyBjMy55OworICByZXR1cm4gc3VtOworfQorCitkb3VibGUgZml4ZWRfM2QoX19kb3VibGUzICppbikgeworLy8gQ0hFQ0s6IGZpeGVkXzNkCisvLyBDSEVDSzogY2FsbCBkb3VibGUgQGFyZ3NfdmVjXzNkKGkzMiAzLCA8MyB4IGRvdWJsZT4qIHt7JS4qfX0pCisgIHJldHVybiBhcmdzX3ZlY18zZCgzLCAqaW4pOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0LWFyZ3VtZW50cy5jIGIvdGVzdC9Db2RlR2VuL2FybTY0LWFyZ3VtZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZmI2MjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjQtYXJndW1lbnRzLmMKQEAgLTAsMCArMSw3MTMgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLXRhcmdldC1hYmkgZGFyd2lucGNzIC1mZnJlZXN0YW5kaW5nIC1lbWl0LWxsdm0gLXcgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworCisvLyBDSEVDSzogZGVmaW5lIHNpZ25leHQgaTggQGYwKCkKK2NoYXIgZjAodm9pZCkgeworICByZXR1cm4gMDsKK30KKworLy8gU3RydWN0IGFzIHJldHVybiB0eXBlLiBBZ2dyZWdhdGVzIDw9IDE2IGJ5dGVzIGFyZSBwYXNzZWQgZGlyZWN0bHkgYW5kIHJvdW5kCisvLyB1cCB0byBtdWx0aXBsZSBvZiA4IGJ5dGVzLgorLy8gQ0hFQ0s6IGRlZmluZSBpNjQgQGYxKCkKK3N0cnVjdCBzMSB7IGNoYXIgZjA7IH07CitzdHJ1Y3QgczEgZjEodm9pZCkge30KKworLy8gQ0hFQ0s6IGRlZmluZSBpNjQgQGYyKCkKK3N0cnVjdCBzMiB7IHNob3J0IGYwOyB9Oworc3RydWN0IHMyIGYyKHZvaWQpIHt9CisKKy8vIENIRUNLOiBkZWZpbmUgaTY0IEBmMygpCitzdHJ1Y3QgczMgeyBpbnQgZjA7IH07CitzdHJ1Y3QgczMgZjModm9pZCkge30KKworLy8gQ0hFQ0s6IGRlZmluZSBpNjQgQGY0KCkKK3N0cnVjdCBzNCB7IHN0cnVjdCBzNF8wIHsgaW50IGYwOyB9IGYwOyB9Oworc3RydWN0IHM0IGY0KHZvaWQpIHt9CisKKy8vIENIRUNLOiBkZWZpbmUgaTY0IEBmNSgpCitzdHJ1Y3QgczUgeyBzdHJ1Y3QgeyB9IGYwOyBpbnQgZjE7IH07CitzdHJ1Y3QgczUgZjUodm9pZCkge30KKworLy8gQ0hFQ0s6IGRlZmluZSBpNjQgQGY2KCkKK3N0cnVjdCBzNiB7IGludCBmMFsxXTsgfTsKK3N0cnVjdCBzNiBmNih2b2lkKSB7fQorCisvLyBDSEVDSzogZGVmaW5lIHZvaWQgQGY3KCkKK3N0cnVjdCBzNyB7IHN0cnVjdCB7IGludCA6IDA7IH0gZjA7IH07CitzdHJ1Y3QgczcgZjcodm9pZCkge30KKworLy8gQ0hFQ0s6IGRlZmluZSB2b2lkIEBmOCgpCitzdHJ1Y3QgczggeyBzdHJ1Y3QgeyBpbnQgOiAwOyB9IGYwWzFdOyB9Oworc3RydWN0IHM4IGY4KHZvaWQpIHt9CisKKy8vIENIRUNLOiBkZWZpbmUgaTY0IEBmOSgpCitzdHJ1Y3QgczkgeyBpbnQgZjA7IGludCA6IDA7IH07CitzdHJ1Y3QgczkgZjkodm9pZCkge30KKworLy8gQ0hFQ0s6IGRlZmluZSBpNjQgQGYxMCgpCitzdHJ1Y3QgczEwIHsgaW50IGYwOyBpbnQgOiAwOyBpbnQgOiAwOyB9Oworc3RydWN0IHMxMCBmMTAodm9pZCkge30KKworLy8gQ0hFQ0s6IGRlZmluZSBpNjQgQGYxMSgpCitzdHJ1Y3QgczExIHsgaW50IDogMDsgaW50IGYwOyB9Oworc3RydWN0IHMxMSBmMTEodm9pZCkge30KKworLy8gQ0hFQ0s6IGRlZmluZSBpNjQgQGYxMigpCit1bmlvbiB1MTIgeyBjaGFyIGYwOyBzaG9ydCBmMTsgaW50IGYyOyB9OwordW5pb24gdTEyIGYxMih2b2lkKSB7fQorCisvLyBIb21vZ2VuZW91cyBBZ2dyZWdhdGUgYXMgcmV0dXJuIHR5cGUgd2lsbCBiZSBwYXNzZWQgZGlyZWN0bHkuCisvLyBDSEVDSzogZGVmaW5lICVzdHJ1Y3QuczEzIEBmMTMoKQorc3RydWN0IHMxMyB7IGZsb2F0IGYwOyB9Oworc3RydWN0IHMxMyBmMTModm9pZCkge30KKy8vIENIRUNLOiBkZWZpbmUgJXVuaW9uLnUxNCBAZjE0KCkKK3VuaW9uIHUxNCB7IGZsb2F0IGYwOyB9OwordW5pb24gdTE0IGYxNCh2b2lkKSB7fQorCisvLyBDSEVDSzogZGVmaW5lIHZvaWQgQGYxNSgpCit2b2lkIGYxNShzdHJ1Y3QgczcgYTApIHt9CisKKy8vIENIRUNLOiBkZWZpbmUgdm9pZCBAZjE2KCkKK3ZvaWQgZjE2KHN0cnVjdCBzOCBhMCkge30KKworLy8gQ0hFQ0s6IGRlZmluZSBpNjQgQGYxNygpCitzdHJ1Y3QgczE3IHsgc2hvcnQgZjAgOiAxMzsgY2hhciBmMSA6IDQ7IH07CitzdHJ1Y3QgczE3IGYxNyh2b2lkKSB7fQorCisvLyBDSEVDSzogZGVmaW5lIGk2NCBAZjE4KCkKK3N0cnVjdCBzMTggeyBzaG9ydCBmMDsgY2hhciBmMSA6IDQ7IH07CitzdHJ1Y3QgczE4IGYxOCh2b2lkKSB7fQorCisvLyBDSEVDSzogZGVmaW5lIGk2NCBAZjE5KCkKK3N0cnVjdCBzMTkgeyBpbnQgZjA7IHN0cnVjdCBzOCBmMTsgfTsKK3N0cnVjdCBzMTkgZjE5KHZvaWQpIHt9CisKKy8vIENIRUNLOiBkZWZpbmUgaTY0IEBmMjAoKQorc3RydWN0IHMyMCB7IHN0cnVjdCBzOCBmMTsgaW50IGYwOyB9Oworc3RydWN0IHMyMCBmMjAodm9pZCkge30KKworLy8gQ0hFQ0s6IGRlZmluZSBpNjQgQGYyMSgpCitzdHJ1Y3QgczIxIHsgc3RydWN0IHt9IGYxOyBpbnQgZjAgOiA0OyB9Oworc3RydWN0IHMyMSBmMjEodm9pZCkge30KKworLy8gQ0hFQ0s6IGRlZmluZSBpNjQgQGYyMigpCisvLyBDSEVDSzogZGVmaW5lIGk2NCBAZjIzKCkKKy8vIENIRUNLOiBkZWZpbmUgaTY0IEBmMjQoKQorLy8gQ0hFQ0s6IGRlZmluZSBpMTI4IEBmMjUoKQorLy8gQ0hFQ0s6IGRlZmluZSB7IGZsb2F0LCBmbG9hdCB9IEBmMjYoKQorLy8gQ0hFQ0s6IGRlZmluZSB7IGRvdWJsZSwgZG91YmxlIH0gQGYyNygpCitfQ29tcGxleCBjaGFyICAgICAgIGYyMih2b2lkKSB7fQorX0NvbXBsZXggc2hvcnQgICAgICBmMjModm9pZCkge30KK19Db21wbGV4IGludCAgICAgICAgZjI0KHZvaWQpIHt9CitfQ29tcGxleCBsb25nIGxvbmcgIGYyNSh2b2lkKSB7fQorX0NvbXBsZXggZmxvYXQgICAgICBmMjYodm9pZCkge30KK19Db21wbGV4IGRvdWJsZSAgICAgZjI3KHZvaWQpIHt9CisKKy8vIENIRUNLOiBkZWZpbmUgaTY0IEBmMjgoKQorc3RydWN0IHMyOCB7IF9Db21wbGV4IGNoYXIgZjA7IH07CitzdHJ1Y3QgczI4IGYyOCgpIHt9CisKKy8vIENIRUNLOiBkZWZpbmUgaTY0IEBmMjkoKQorc3RydWN0IHMyOSB7IF9Db21wbGV4IHNob3J0IGYwOyB9Oworc3RydWN0IHMyOSBmMjkoKSB7fQorCisvLyBDSEVDSzogZGVmaW5lIGk2NCBAZjMwKCkKK3N0cnVjdCBzMzAgeyBfQ29tcGxleCBpbnQgZjA7IH07CitzdHJ1Y3QgczMwIGYzMCgpIHt9CisKK3N0cnVjdCBzMzEgeyBjaGFyIHg7IH07Cit2b2lkIGYzMShzdHJ1Y3QgczMxIHMpIHsgfQorLy8gQ0hFQ0s6IGRlZmluZSB2b2lkIEBmMzEoaTY0ICVzLmNvZXJjZSkKKy8vIENIRUNLOiAlcyA9IGFsbG9jYSAlc3RydWN0LnMzMSwgYWxpZ24gOAorLy8gQ0hFQ0s6IHRydW5jIGk2NCAlcy5jb2VyY2UgdG8gaTgKKy8vIENIRUNLOiBzdG9yZSBpOCAle3suKn19LAorCitzdHJ1Y3QgczMyIHsgZG91YmxlIHg7IH07Cit2b2lkIGYzMihzdHJ1Y3QgczMyIHMpIHsgfQorLy8gRXhwYW5kIEhvbW9nZW5lb3VzIEFnZ3JlZ2F0ZS4KKy8vIENIRUNLOiBAZjMyKGRvdWJsZSAle3suKn19KQorCisvLyBBIGNvbXBvc2l0ZSB0eXBlIGxhcmdlciB0aGFuIDE2IGJ5dGVzIHNob3VsZCBiZSBwYXNzZWQgaW5kaXJlY3RseS4KK3N0cnVjdCBzMzMgeyBjaGFyIGJ1ZlszMiozMl07IH07Cit2b2lkIGYzMyhzdHJ1Y3QgczMzIHMpIHsgfQorLy8gQ0hFQ0s6IGRlZmluZSB2b2lkIEBmMzMoJXN0cnVjdC5zMzMqICVzKQorCitzdHJ1Y3QgczM0IHsgY2hhciBjOyB9Owordm9pZCBmMzQoc3RydWN0IHMzNCBzKTsKK3ZvaWQgZzM0KHN0cnVjdCBzMzQgKnMpIHsgZjM0KCpzKTsgfQorLy8gQ0hFQ0s6IEBnMzQoJXN0cnVjdC5zMzQqICVzKQorLy8gQ0hFQ0s6ICVbW2E6LipdXSA9IGxvYWQgaTgqICV7ey4qfX0KKy8vIENIRUNLOiB6ZXh0IGk4ICVbW2FdXSB0byBpNjQKKy8vIENIRUNLOiBjYWxsIHZvaWQgQGYzNChpNjQgJXt7Lip9fSkKKworLyoKKyAqIENoZWNrIHRoYXQgdmFfYXJnIGFjY2Vzc2VzIHN0YWNrIGFjY29yZGluZyB0byBBQkkgYWxpZ25tZW50CisgKi8KK2xvbmcgbG9uZyB0MShpbnQgaSwgLi4uKSB7CisgICAgLy8gQ0hFQ0s6IHQxCisgICAgX19idWlsdGluX3ZhX2xpc3QgYXA7CisgICAgX19idWlsdGluX3ZhX3N0YXJ0KGFwLCBpKTsKKyAgICAvLyBDSEVDSy1OT1Q6IGFkZCBpMzIgJXt7Lip9fSA3CisgICAgLy8gQ0hFQ0stTk9UOiBhbmQgaTMyICV7ey4qfX0gLTgKKyAgICBsb25nIGxvbmcgbGwgPSBfX2J1aWx0aW5fdmFfYXJnKGFwLCBsb25nIGxvbmcpOworICAgIF9fYnVpbHRpbl92YV9lbmQoYXApOworICAgIHJldHVybiBsbDsKK30KK2RvdWJsZSB0MihpbnQgaSwgLi4uKSB7CisgICAgLy8gQ0hFQ0s6IHQyCisgICAgX19idWlsdGluX3ZhX2xpc3QgYXA7CisgICAgX19idWlsdGluX3ZhX3N0YXJ0KGFwLCBpKTsKKyAgICAvLyBDSEVDSy1OT1Q6IGFkZCBpMzIgJXt7Lip9fSA3CisgICAgLy8gQ0hFQ0stTk9UOiBhbmQgaTMyICV7ey4qfX0gLTgKKyAgICBkb3VibGUgbGwgPSBfX2J1aWx0aW5fdmFfYXJnKGFwLCBkb3VibGUpOworICAgIF9fYnVpbHRpbl92YV9lbmQoYXApOworICAgIHJldHVybiBsbDsKK30KKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKKy8vIEhvbW9nZW5lb3VzIFZlY3RvciBBZ2dyZWdhdGUgYXMgcmV0dXJuIHR5cGUgYW5kIGFyZ3VtZW50IHR5cGUuCisvLyBDSEVDSzogZGVmaW5lICVzdHJ1Y3QuaW50OHgxNngyX3QgQGYwXzAoPDE2IHggaTg+ICV7ey4qfX0sIDwxNiB4IGk4PiAle3suKn19KQoraW50OHgxNngyX3QgZjBfMChpbnQ4eDE2X3QgYTAsIGludDh4MTZfdCBhMSkgeworICByZXR1cm4gdnppcHFfczgoYTAsIGExKTsKK30KKworLy8gVGVzdCBkaXJlY3QgdmVjdG9yIHBhc3NpbmcuCit0eXBlZGVmIGZsb2F0IFRfZmxvYXQzMngyIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDgpKSk7Cit0eXBlZGVmIGZsb2F0IFRfZmxvYXQzMng0IF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSkpOwordHlwZWRlZiBmbG9hdCBUX2Zsb2F0MzJ4OCBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgzMikpKTsKK3R5cGVkZWYgZmxvYXQgVF9mbG9hdDMyeDE2IF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDY0KSkpOworCisvLyBDSEVDSzogZGVmaW5lIDwyIHggZmxvYXQ+IEBmMV8wKDwyIHggZmxvYXQ+ICV7ey4qfX0pCitUX2Zsb2F0MzJ4MiBmMV8wKFRfZmxvYXQzMngyIGEwKSB7IHJldHVybiBhMDsgfQorLy8gQ0hFQ0s6IGRlZmluZSA8NCB4IGZsb2F0PiBAZjFfMSg8NCB4IGZsb2F0PiAle3suKn19KQorVF9mbG9hdDMyeDQgZjFfMShUX2Zsb2F0MzJ4NCBhMCkgeyByZXR1cm4gYTA7IH0KKy8vIFZlY3RvciB3aXRoIGxlbmd0aCBiaWdnZXIgdGhhbiAxNi1ieXRlIGlzIGlsbGVnYWwgYW5kIGlzIHBhc3NlZCBpbmRpcmVjdGx5LgorLy8gQ0hFQ0s6IGRlZmluZSB2b2lkIEBmMV8yKDw4IHggZmxvYXQ+KiBub2FsaWFzIHNyZXQgICV7ey4qfX0sIDw4IHggZmxvYXQ+KikKK1RfZmxvYXQzMng4IGYxXzIoVF9mbG9hdDMyeDggYTApIHsgcmV0dXJuIGEwOyB9CisvLyBDSEVDSzogZGVmaW5lIHZvaWQgQGYxXzMoPDE2IHggZmxvYXQ+KiBub2FsaWFzIHNyZXQgJXt7Lip9fSwgPDE2IHggZmxvYXQ+KikKK1RfZmxvYXQzMngxNiBmMV8zKFRfZmxvYXQzMngxNiBhMCkgeyByZXR1cm4gYTA7IH0KKworLy8gVGVzdGluZyBhbGlnbm1lbnQgd2l0aCBhZ2dyZWdhdGVzOiBIRkEsIGFnZ3JlZ2F0ZXMgd2l0aCBzaXplIDw9IDE2IGJ5dGVzIGFuZAorLy8gYWdncmVnYXRlcyB3aXRoIHNpemUgPiAxNiBieXRlcy4KK3N0cnVjdCBzMzUKK3sKKyAgIGZsb2F0IHZbNF07IC8vVGVzdGluZyBIRkEuCit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSk7Cit0eXBlZGVmIHN0cnVjdCBzMzUgczM1X3dpdGhfYWxpZ247CisKK3R5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSg0KSkpIGZsb2F0IGZsb2F0MzJ4NF90OworZmxvYXQzMng0X3QgZjM1KGludCBpLCBzMzVfd2l0aF9hbGlnbiBzMSwgczM1X3dpdGhfYWxpZ24gczIpIHsKKy8vIENIRUNLOiBkZWZpbmUgPDQgeCBmbG9hdD4gQGYzNShpMzIgJWksIGZsb2F0ICVzMS4wLCBmbG9hdCAlczEuMSwgZmxvYXQgJXMxLjIsIGZsb2F0ICVzMS4zLCBmbG9hdCAlczIuMCwgZmxvYXQgJXMyLjEsIGZsb2F0ICVzMi4yLCBmbG9hdCAlczIuMykKKy8vIENIRUNLOiAlczEgPSBhbGxvY2EgJXN0cnVjdC5zMzUsIGFsaWduIDE2CisvLyBDSEVDSzogJXMyID0gYWxsb2NhICVzdHJ1Y3QuczM1LCBhbGlnbiAxNgorLy8gQ0hFQ0s6ICVbW2E6LipdXSA9IGJpdGNhc3QgJXN0cnVjdC5zMzUqICVzMSB0byA8NCB4IGZsb2F0PioKKy8vIENIRUNLOiBsb2FkIDw0IHggZmxvYXQ+KiAlW1thXV0sIGFsaWduIDE2CisvLyBDSEVDSzogJVtbYjouKl1dID0gYml0Y2FzdCAlc3RydWN0LnMzNSogJXMyIHRvIDw0IHggZmxvYXQ+KgorLy8gQ0hFQ0s6IGxvYWQgPDQgeCBmbG9hdD4qICVbW2JdXSwgYWxpZ24gMTYKKyAgZmxvYXQzMng0X3QgdiA9IHZhZGRxX2YzMigqKGZsb2F0MzJ4NF90ICopJnMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICooZmxvYXQzMng0X3QgKikmczIpOworICByZXR1cm4gdjsKK30KKworc3RydWN0IHMzNgoreworICAgaW50IHZbNF07IC8vVGVzdGluZyAxNi1ieXRlIGFnZ3JlZ2F0ZS4KK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKK3R5cGVkZWYgc3RydWN0IHMzNiBzMzZfd2l0aF9hbGlnbjsKKwordHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDQpKSkgaW50IGludDMyeDRfdDsKK2ludDMyeDRfdCBmMzYoaW50IGksIHMzNl93aXRoX2FsaWduIHMxLCBzMzZfd2l0aF9hbGlnbiBzMikgeworLy8gQ0hFQ0s6IGRlZmluZSA8NCB4IGkzMj4gQGYzNihpMzIgJWksIGkxMjggJXMxLmNvZXJjZSwgaTEyOCAlczIuY29lcmNlKQorLy8gQ0hFQ0s6ICVzMSA9IGFsbG9jYSAlc3RydWN0LnMzNiwgYWxpZ24gMTYKKy8vIENIRUNLOiAlczIgPSBhbGxvY2EgJXN0cnVjdC5zMzYsIGFsaWduIDE2CisvLyBDSEVDSzogc3RvcmUgaTEyOCAlczEuY29lcmNlLCBpMTI4KiAle3suKn19LCBhbGlnbiAxCisvLyBDSEVDSzogc3RvcmUgaTEyOCAlczIuY29lcmNlLCBpMTI4KiAle3suKn19LCBhbGlnbiAxCisvLyBDSEVDSzogJVtbYTouKl1dID0gYml0Y2FzdCAlc3RydWN0LnMzNiogJXMxIHRvIDw0IHggaTMyPioKKy8vIENIRUNLOiBsb2FkIDw0IHggaTMyPiogJVtbYV1dLCBhbGlnbiAxNgorLy8gQ0hFQ0s6ICVbW2I6LipdXSA9IGJpdGNhc3QgJXN0cnVjdC5zMzYqICVzMiB0byA8NCB4IGkzMj4qCisvLyBDSEVDSzogbG9hZCA8NCB4IGkzMj4qICVbW2JdXSwgYWxpZ24gMTYKKyAgaW50MzJ4NF90IHYgPSB2YWRkcV9zMzIoKihpbnQzMng0X3QgKikmczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJ4NF90ICopJnMyKTsKKyAgcmV0dXJuIHY7Cit9CisKK3N0cnVjdCBzMzcKK3sKKyAgIGludCB2WzE4XTsgLy9UZXN0aW5nIGxhcmdlIGFnZ3JlZ2F0ZS4KK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKK3R5cGVkZWYgc3RydWN0IHMzNyBzMzdfd2l0aF9hbGlnbjsKKworaW50MzJ4NF90IGYzNyhpbnQgaSwgczM3X3dpdGhfYWxpZ24gczEsIHMzN193aXRoX2FsaWduIHMyKSB7CisvLyBDSEVDSzogZGVmaW5lIDw0IHggaTMyPiBAZjM3KGkzMiAlaSwgJXN0cnVjdC5zMzcqICVzMSwgJXN0cnVjdC5zMzcqICVzMikKKy8vIENIRUNLOiAlW1thOi4qXV0gPSBiaXRjYXN0ICVzdHJ1Y3QuczM3KiAlczEgdG8gPDQgeCBpMzI+KgorLy8gQ0hFQ0s6IGxvYWQgPDQgeCBpMzI+KiAlW1thXV0sIGFsaWduIDE2CisvLyBDSEVDSzogJVtbYjouKl1dID0gYml0Y2FzdCAlc3RydWN0LnMzNyogJXMyIHRvIDw0IHggaTMyPioKKy8vIENIRUNLOiBsb2FkIDw0IHggaTMyPiogJVtbYl1dLCBhbGlnbiAxNgorICBpbnQzMng0X3QgdiA9IHZhZGRxX3MzMigqKGludDMyeDRfdCAqKSZzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMng0X3QgKikmczIpOworICByZXR1cm4gdjsKK30KK3MzN193aXRoX2FsaWduIGczNzsKK2ludDMyeDRfdCBjYWxsZXIzNygpIHsKKy8vIENIRUNLOiBjYWxsZXIzNworLy8gQ0hFQ0s6ICVbW2E6LipdXSA9IGFsbG9jYSAlc3RydWN0LnMzNywgYWxpZ24gMTYKKy8vIENIRUNLOiAlW1tiOi4qXV0gPSBhbGxvY2EgJXN0cnVjdC5zMzcsIGFsaWduIDE2CisvLyBDSEVDSzogY2FsbCB2b2lkIEBsbHZtLm1lbWNweQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAbGx2bS5tZW1jcHkKKy8vIENIRUNLOiBjYWxsIDw0IHggaTMyPiBAZjM3KGkzMiAzLCAlc3RydWN0LnMzNyogJVtbYV1dLCAlc3RydWN0LnMzNyogJVtbYl1dKQorICByZXR1cm4gZjM3KDMsIGczNywgZzM3KTsKK30KKworLy8gcmRhcjovL3Byb2JsZW0vMTI2NDg0NDEKKy8vIFRlc3QgcGFzc2luZyBzdHJ1Y3RzIHdpdGggc2l6ZSA8IDgsIDwgMTYgYW5kID4gMTYKKy8vIHdpdGggYWxpZ25tZW50IG9mIDE2IGFuZCB3aXRob3V0CisKKy8vIHN0cnVjdHMgd2l0aCBzaXplIDw9IDggYnl0ZXMsIHdpdGhvdXQgYWxpZ25tZW50IGF0dHJpYnV0ZQorLy8gcGFzc2VkIGFzIGk2NCByZWdhcmRsZXNzIG9mIHRoZSBhbGlnbiBhdHRyaWJ1dGUKK3N0cnVjdCBzMzgKK3sKKyAgaW50IGk7CisgIHNob3J0IHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgczM4IHMzOF9ub19hbGlnbjsKKy8vIHBhc3Npbmcgc3RydWN0cyBpbiByZWdpc3RlcnMKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpCitpbnQgZjM4KGludCBpLCBzMzhfbm9fYWxpZ24gczEsIHMzOF9ub19hbGlnbiBzMikgeworLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQGYzOChpMzIgJWksIGk2NCAlczEuY29lcmNlLCBpNjQgJXMyLmNvZXJjZSkKKy8vIENIRUNLOiAlczEgPSBhbGxvY2EgJXN0cnVjdC5zMzgsIGFsaWduIDgKKy8vIENIRUNLOiAlczIgPSBhbGxvY2EgJXN0cnVjdC5zMzgsIGFsaWduIDgKKy8vIENIRUNLOiBzdG9yZSBpNjQgJXMxLmNvZXJjZSwgaTY0KiAle3suKn19LCBhbGlnbiAxCisvLyBDSEVDSzogc3RvcmUgaTY0ICVzMi5jb2VyY2UsIGk2NCogJXt7Lip9fSwgYWxpZ24gMQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zMzgqICVzMSwgaTMyIDAsIGkzMiAwCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnMzOCogJXMyLCBpMzIgMCwgaTMyIDAKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczM4KiAlczEsIGkzMiAwLCBpMzIgMQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zMzgqICVzMiwgaTMyIDAsIGkzMiAxCisgIHJldHVybiBzMS5pICsgczIuaSArIGkgKyBzMS5zICsgczIuczsKK30KK3MzOF9ub19hbGlnbiBnMzg7CitzMzhfbm9fYWxpZ24gZzM4XzI7CitpbnQgY2FsbGVyMzgoKSB7CisvLyBDSEVDSzogZGVmaW5lIGkzMiBAY2FsbGVyMzgoKQorLy8gQ0hFQ0s6ICVbW2E6LipdXSA9IGxvYWQgaTY0KiBiaXRjYXN0ICglc3RydWN0LnMzOCogQGczOCB0byBpNjQqKSwgYWxpZ24gMQorLy8gQ0hFQ0s6ICVbW2I6LipdXSA9IGxvYWQgaTY0KiBiaXRjYXN0ICglc3RydWN0LnMzOCogQGczOF8yIHRvIGk2NCopLCBhbGlnbiAxCisvLyBDSEVDSzogY2FsbCBpMzIgQGYzOChpMzIgMywgaTY0ICVbW2FdXSwgaTY0ICVbW2JdXSkKKyAgcmV0dXJuIGYzOCgzLCBnMzgsIGczOF8yKTsKK30KKy8vIHBhc3Npbmcgc3RydWN0cyBvbiBzdGFjaworX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkKK2ludCBmMzhfc3RhY2soaW50IGksIGludCBpMiwgaW50IGkzLCBpbnQgaTQsIGludCBpNSwgaW50IGk2LCBpbnQgaTcsIGludCBpOCwKKyAgICAgICAgICAgICAgaW50IGk5LCBzMzhfbm9fYWxpZ24gczEsIHMzOF9ub19hbGlnbiBzMikgeworLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQGYzOF9zdGFjayhpMzIgJWksIGkzMiAlaTIsIGkzMiAlaTMsIGkzMiAlaTQsIGkzMiAlaTUsIGkzMiAlaTYsIGkzMiAlaTcsIGkzMiAlaTgsIGkzMiAlaTksIGk2NCAlczEuY29lcmNlLCBpNjQgJXMyLmNvZXJjZSkKKy8vIENIRUNLOiAlczEgPSBhbGxvY2EgJXN0cnVjdC5zMzgsIGFsaWduIDgKKy8vIENIRUNLOiAlczIgPSBhbGxvY2EgJXN0cnVjdC5zMzgsIGFsaWduIDgKKy8vIENIRUNLOiBzdG9yZSBpNjQgJXMxLmNvZXJjZSwgaTY0KiAle3suKn19LCBhbGlnbiAxCisvLyBDSEVDSzogc3RvcmUgaTY0ICVzMi5jb2VyY2UsIGk2NCogJXt7Lip9fSwgYWxpZ24gMQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zMzgqICVzMSwgaTMyIDAsIGkzMiAwCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnMzOCogJXMyLCBpMzIgMCwgaTMyIDAKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczM4KiAlczEsIGkzMiAwLCBpMzIgMQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zMzgqICVzMiwgaTMyIDAsIGkzMiAxCisgIHJldHVybiBzMS5pICsgczIuaSArIGkgKyBpMiArIGkzICsgaTQgKyBpNSArIGk2ICsgaTcgKyBpOCArIGk5ICsgczEucyArIHMyLnM7Cit9CitpbnQgY2FsbGVyMzhfc3RhY2soKSB7CisvLyBDSEVDSzogZGVmaW5lIGkzMiBAY2FsbGVyMzhfc3RhY2soKQorLy8gQ0hFQ0s6ICVbW2E6LipdXSA9IGxvYWQgaTY0KiBiaXRjYXN0ICglc3RydWN0LnMzOCogQGczOCB0byBpNjQqKSwgYWxpZ24gMQorLy8gQ0hFQ0s6ICVbW2I6LipdXSA9IGxvYWQgaTY0KiBiaXRjYXN0ICglc3RydWN0LnMzOCogQGczOF8yIHRvIGk2NCopLCBhbGlnbiAxCisvLyBDSEVDSzogY2FsbCBpMzIgQGYzOF9zdGFjayhpMzIgMSwgaTMyIDIsIGkzMiAzLCBpMzIgNCwgaTMyIDUsIGkzMiA2LCBpMzIgNywgaTMyIDgsIGkzMiA5LCBpNjQgJVtbYV1dLCBpNjQgJVtbYl1dKQorICByZXR1cm4gZjM4X3N0YWNrKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIGczOCwgZzM4XzIpOworfQorCisvLyBzdHJ1Y3RzIHdpdGggc2l6ZSA8PSA4IGJ5dGVzLCB3aXRoIGFsaWdubWVudCBhdHRyaWJ1dGUKK3N0cnVjdCBzMzkKK3sKKyAgaW50IGk7CisgIHNob3J0IHM7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSk7Cit0eXBlZGVmIHN0cnVjdCBzMzkgczM5X3dpdGhfYWxpZ247CisvLyBwYXNzaW5nIGFsaWduZWQgc3RydWN0cyBpbiByZWdpc3RlcnMKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpCitpbnQgZjM5KGludCBpLCBzMzlfd2l0aF9hbGlnbiBzMSwgczM5X3dpdGhfYWxpZ24gczIpIHsKKy8vIENIRUNLOiBkZWZpbmUgaTMyIEBmMzkoaTMyICVpLCBpMTI4ICVzMS5jb2VyY2UsIGkxMjggJXMyLmNvZXJjZSkKKy8vIENIRUNLOiAlczEgPSBhbGxvY2EgJXN0cnVjdC5zMzksIGFsaWduIDE2CisvLyBDSEVDSzogJXMyID0gYWxsb2NhICVzdHJ1Y3QuczM5LCBhbGlnbiAxNgorLy8gQ0hFQ0s6IHN0b3JlIGkxMjggJXMxLmNvZXJjZSwgaTEyOCogJXt7Lip9fSwgYWxpZ24gMQorLy8gQ0hFQ0s6IHN0b3JlIGkxMjggJXMyLmNvZXJjZSwgaTEyOCogJXt7Lip9fSwgYWxpZ24gMQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zMzkqICVzMSwgaTMyIDAsIGkzMiAwCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnMzOSogJXMyLCBpMzIgMCwgaTMyIDAKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczM5KiAlczEsIGkzMiAwLCBpMzIgMQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zMzkqICVzMiwgaTMyIDAsIGkzMiAxCisgIHJldHVybiBzMS5pICsgczIuaSArIGkgKyBzMS5zICsgczIuczsKK30KK3MzOV93aXRoX2FsaWduIGczOTsKK3MzOV93aXRoX2FsaWduIGczOV8yOworaW50IGNhbGxlcjM5KCkgeworLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQGNhbGxlcjM5KCkKKy8vIENIRUNLOiAlW1thOi4qXV0gPSBsb2FkIGkxMjgqIGJpdGNhc3QgKCVzdHJ1Y3QuczM5KiBAZzM5IHRvIGkxMjgqKSwgYWxpZ24gMQorLy8gQ0hFQ0s6ICVbW2I6LipdXSA9IGxvYWQgaTEyOCogYml0Y2FzdCAoJXN0cnVjdC5zMzkqIEBnMzlfMiB0byBpMTI4KiksIGFsaWduIDEKKy8vIENIRUNLOiBjYWxsIGkzMiBAZjM5KGkzMiAzLCBpMTI4ICVbW2FdXSwgaTEyOCAlW1tiXV0pCisgIHJldHVybiBmMzkoMywgZzM5LCBnMzlfMik7Cit9CisvLyBwYXNzaW5nIGFsaWduZWQgc3RydWN0cyBvbiBzdGFjaworX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkKK2ludCBmMzlfc3RhY2soaW50IGksIGludCBpMiwgaW50IGkzLCBpbnQgaTQsIGludCBpNSwgaW50IGk2LCBpbnQgaTcsIGludCBpOCwKKyAgICAgICAgICAgICAgaW50IGk5LCBzMzlfd2l0aF9hbGlnbiBzMSwgczM5X3dpdGhfYWxpZ24gczIpIHsKKy8vIENIRUNLOiBkZWZpbmUgaTMyIEBmMzlfc3RhY2soaTMyICVpLCBpMzIgJWkyLCBpMzIgJWkzLCBpMzIgJWk0LCBpMzIgJWk1LCBpMzIgJWk2LCBpMzIgJWk3LCBpMzIgJWk4LCBpMzIgJWk5LCBpMTI4ICVzMS5jb2VyY2UsIGkxMjggJXMyLmNvZXJjZSkKKy8vIENIRUNLOiAlczEgPSBhbGxvY2EgJXN0cnVjdC5zMzksIGFsaWduIDE2CisvLyBDSEVDSzogJXMyID0gYWxsb2NhICVzdHJ1Y3QuczM5LCBhbGlnbiAxNgorLy8gQ0hFQ0s6IHN0b3JlIGkxMjggJXMxLmNvZXJjZSwgaTEyOCogJXt7Lip9fSwgYWxpZ24gMQorLy8gQ0hFQ0s6IHN0b3JlIGkxMjggJXMyLmNvZXJjZSwgaTEyOCogJXt7Lip9fSwgYWxpZ24gMQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zMzkqICVzMSwgaTMyIDAsIGkzMiAwCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnMzOSogJXMyLCBpMzIgMCwgaTMyIDAKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczM5KiAlczEsIGkzMiAwLCBpMzIgMQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zMzkqICVzMiwgaTMyIDAsIGkzMiAxCisgIHJldHVybiBzMS5pICsgczIuaSArIGkgKyBpMiArIGkzICsgaTQgKyBpNSArIGk2ICsgaTcgKyBpOCArIGk5ICsgczEucyArIHMyLnM7Cit9CitpbnQgY2FsbGVyMzlfc3RhY2soKSB7CisvLyBDSEVDSzogZGVmaW5lIGkzMiBAY2FsbGVyMzlfc3RhY2soKQorLy8gQ0hFQ0s6ICVbW2E6LipdXSA9IGxvYWQgaTEyOCogYml0Y2FzdCAoJXN0cnVjdC5zMzkqIEBnMzkgdG8gaTEyOCopLCBhbGlnbiAxCisvLyBDSEVDSzogJVtbYjouKl1dID0gbG9hZCBpMTI4KiBiaXRjYXN0ICglc3RydWN0LnMzOSogQGczOV8yIHRvIGkxMjgqKSwgYWxpZ24gMQorLy8gQ0hFQ0s6IGNhbGwgaTMyIEBmMzlfc3RhY2soaTMyIDEsIGkzMiAyLCBpMzIgMywgaTMyIDQsIGkzMiA1LCBpMzIgNiwgaTMyIDcsIGkzMiA4LCBpMzIgOSwgaTEyOCAlW1thXV0sIGkxMjggJVtbYl1dKQorICByZXR1cm4gZjM5X3N0YWNrKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIGczOSwgZzM5XzIpOworfQorCisvLyBzdHJ1Y3RzIHdpdGggc2l6ZSA8PSAxNiBieXRlcywgd2l0aG91dCBhbGlnbm1lbnQgYXR0cmlidXRlCitzdHJ1Y3QgczQwCit7CisgIGludCBpOworICBzaG9ydCBzOworICBpbnQgaTI7CisgIHNob3J0IHMyOworfTsKK3R5cGVkZWYgc3RydWN0IHM0MCBzNDBfbm9fYWxpZ247CisvLyBwYXNzaW5nIHN0cnVjdHMgaW4gcmVnaXN0ZXJzCitfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQoraW50IGY0MChpbnQgaSwgczQwX25vX2FsaWduIHMxLCBzNDBfbm9fYWxpZ24gczIpIHsKKy8vIENIRUNLOiBkZWZpbmUgaTMyIEBmNDAoaTMyICVpLCBbMiB4IGk2NF0gJXMxLmNvZXJjZSwgWzIgeCBpNjRdICVzMi5jb2VyY2UpCisvLyBDSEVDSzogJXMxID0gYWxsb2NhICVzdHJ1Y3QuczQwLCBhbGlnbiA4CisvLyBDSEVDSzogJXMyID0gYWxsb2NhICVzdHJ1Y3QuczQwLCBhbGlnbiA4CisvLyBDSEVDSzogc3RvcmUgWzIgeCBpNjRdICVzMS5jb2VyY2UsIFsyIHggaTY0XSogJXt7Lip9fSwgYWxpZ24gMQorLy8gQ0hFQ0s6IHN0b3JlIFsyIHggaTY0XSAlczIuY29lcmNlLCBbMiB4IGk2NF0qICV7ey4qfX0sIGFsaWduIDEKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczQwKiAlczEsIGkzMiAwLCBpMzIgMAorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zNDAqICVzMiwgaTMyIDAsIGkzMiAwCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnM0MCogJXMxLCBpMzIgMCwgaTMyIDEKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczQwKiAlczIsIGkzMiAwLCBpMzIgMQorICByZXR1cm4gczEuaSArIHMyLmkgKyBpICsgczEucyArIHMyLnM7Cit9CitzNDBfbm9fYWxpZ24gZzQwOworczQwX25vX2FsaWduIGc0MF8yOworaW50IGNhbGxlcjQwKCkgeworLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQGNhbGxlcjQwKCkKKy8vIENIRUNLOiAlW1thOi4qXV0gPSBsb2FkIFsyIHggaTY0XSogYml0Y2FzdCAoJXN0cnVjdC5zNDAqIEBnNDAgdG8gWzIgeCBpNjRdKiksIGFsaWduIDEKKy8vIENIRUNLOiAlW1tiOi4qXV0gPSBsb2FkIFsyIHggaTY0XSogYml0Y2FzdCAoJXN0cnVjdC5zNDAqIEBnNDBfMiB0byBbMiB4IGk2NF0qKSwgYWxpZ24gMQorLy8gQ0hFQ0s6IGNhbGwgaTMyIEBmNDAoaTMyIDMsIFsyIHggaTY0XSAlW1thXV0sIFsyIHggaTY0XSAlW1tiXV0pCisgIHJldHVybiBmNDAoMywgZzQwLCBnNDBfMik7Cit9CisvLyBwYXNzaW5nIHN0cnVjdHMgb24gc3RhY2sKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpCitpbnQgZjQwX3N0YWNrKGludCBpLCBpbnQgaTIsIGludCBpMywgaW50IGk0LCBpbnQgaTUsIGludCBpNiwgaW50IGk3LCBpbnQgaTgsCisgICAgICAgICAgICAgIGludCBpOSwgczQwX25vX2FsaWduIHMxLCBzNDBfbm9fYWxpZ24gczIpIHsKKy8vIENIRUNLOiBkZWZpbmUgaTMyIEBmNDBfc3RhY2soaTMyICVpLCBpMzIgJWkyLCBpMzIgJWkzLCBpMzIgJWk0LCBpMzIgJWk1LCBpMzIgJWk2LCBpMzIgJWk3LCBpMzIgJWk4LCBpMzIgJWk5LCBbMiB4IGk2NF0gJXMxLmNvZXJjZSwgWzIgeCBpNjRdICVzMi5jb2VyY2UpCisvLyBDSEVDSzogJXMxID0gYWxsb2NhICVzdHJ1Y3QuczQwLCBhbGlnbiA4CisvLyBDSEVDSzogJXMyID0gYWxsb2NhICVzdHJ1Y3QuczQwLCBhbGlnbiA4CisvLyBDSEVDSzogc3RvcmUgWzIgeCBpNjRdICVzMS5jb2VyY2UsIFsyIHggaTY0XSogJXt7Lip9fSwgYWxpZ24gMQorLy8gQ0hFQ0s6IHN0b3JlIFsyIHggaTY0XSAlczIuY29lcmNlLCBbMiB4IGk2NF0qICV7ey4qfX0sIGFsaWduIDEKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczQwKiAlczEsIGkzMiAwLCBpMzIgMAorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zNDAqICVzMiwgaTMyIDAsIGkzMiAwCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnM0MCogJXMxLCBpMzIgMCwgaTMyIDEKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczQwKiAlczIsIGkzMiAwLCBpMzIgMQorICByZXR1cm4gczEuaSArIHMyLmkgKyBpICsgaTIgKyBpMyArIGk0ICsgaTUgKyBpNiArIGk3ICsgaTggKyBpOSArIHMxLnMgKyBzMi5zOworfQoraW50IGNhbGxlcjQwX3N0YWNrKCkgeworLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQGNhbGxlcjQwX3N0YWNrKCkKKy8vIENIRUNLOiAlW1thOi4qXV0gPSBsb2FkIFsyIHggaTY0XSogYml0Y2FzdCAoJXN0cnVjdC5zNDAqIEBnNDAgdG8gWzIgeCBpNjRdKiksIGFsaWduIDEKKy8vIENIRUNLOiAlW1tiOi4qXV0gPSBsb2FkIFsyIHggaTY0XSogYml0Y2FzdCAoJXN0cnVjdC5zNDAqIEBnNDBfMiB0byBbMiB4IGk2NF0qKSwgYWxpZ24gMQorLy8gQ0hFQ0s6IGNhbGwgaTMyIEBmNDBfc3RhY2soaTMyIDEsIGkzMiAyLCBpMzIgMywgaTMyIDQsIGkzMiA1LCBpMzIgNiwgaTMyIDcsIGkzMiA4LCBpMzIgOSwgWzIgeCBpNjRdICVbW2FdXSwgWzIgeCBpNjRdICVbW2JdXSkKKyAgcmV0dXJuIGY0MF9zdGFjaygxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCBnNDAsIGc0MF8yKTsKK30KKworLy8gc3RydWN0cyB3aXRoIHNpemUgPD0gMTYgYnl0ZXMsIHdpdGggYWxpZ25tZW50IGF0dHJpYnV0ZQorc3RydWN0IHM0MQoreworICBpbnQgaTsKKyAgc2hvcnQgczsKKyAgaW50IGkyOworICBzaG9ydCBzMjsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKK3R5cGVkZWYgc3RydWN0IHM0MSBzNDFfd2l0aF9hbGlnbjsKKy8vIHBhc3NpbmcgYWxpZ25lZCBzdHJ1Y3RzIGluIHJlZ2lzdGVycworX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkKK2ludCBmNDEoaW50IGksIHM0MV93aXRoX2FsaWduIHMxLCBzNDFfd2l0aF9hbGlnbiBzMikgeworLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQGY0MShpMzIgJWksIGkxMjggJXMxLmNvZXJjZSwgaTEyOCAlczIuY29lcmNlKQorLy8gQ0hFQ0s6ICVzMSA9IGFsbG9jYSAlc3RydWN0LnM0MSwgYWxpZ24gMTYKKy8vIENIRUNLOiAlczIgPSBhbGxvY2EgJXN0cnVjdC5zNDEsIGFsaWduIDE2CisvLyBDSEVDSzogc3RvcmUgaTEyOCAlczEuY29lcmNlLCBpMTI4KiAle3suKn19LCBhbGlnbiAxCisvLyBDSEVDSzogc3RvcmUgaTEyOCAlczIuY29lcmNlLCBpMTI4KiAle3suKn19LCBhbGlnbiAxCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnM0MSogJXMxLCBpMzIgMCwgaTMyIDAKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczQxKiAlczIsIGkzMiAwLCBpMzIgMAorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zNDEqICVzMSwgaTMyIDAsIGkzMiAxCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnM0MSogJXMyLCBpMzIgMCwgaTMyIDEKKyAgcmV0dXJuIHMxLmkgKyBzMi5pICsgaSArIHMxLnMgKyBzMi5zOworfQorczQxX3dpdGhfYWxpZ24gZzQxOworczQxX3dpdGhfYWxpZ24gZzQxXzI7CitpbnQgY2FsbGVyNDEoKSB7CisvLyBDSEVDSzogZGVmaW5lIGkzMiBAY2FsbGVyNDEoKQorLy8gQ0hFQ0s6ICVbW2E6LipdXSA9IGxvYWQgaTEyOCogYml0Y2FzdCAoJXN0cnVjdC5zNDEqIEBnNDEgdG8gaTEyOCopLCBhbGlnbiAxCisvLyBDSEVDSzogJVtbYjouKl1dID0gbG9hZCBpMTI4KiBiaXRjYXN0ICglc3RydWN0LnM0MSogQGc0MV8yIHRvIGkxMjgqKSwgYWxpZ24gMQorLy8gQ0hFQ0s6IGNhbGwgaTMyIEBmNDEoaTMyIDMsIGkxMjggJVtbYV1dLCBpMTI4ICVbW2JdXSkKKyAgcmV0dXJuIGY0MSgzLCBnNDEsIGc0MV8yKTsKK30KKy8vIHBhc3NpbmcgYWxpZ25lZCBzdHJ1Y3RzIG9uIHN0YWNrCitfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQoraW50IGY0MV9zdGFjayhpbnQgaSwgaW50IGkyLCBpbnQgaTMsIGludCBpNCwgaW50IGk1LCBpbnQgaTYsIGludCBpNywgaW50IGk4LAorICAgICAgICAgICAgICBpbnQgaTksIHM0MV93aXRoX2FsaWduIHMxLCBzNDFfd2l0aF9hbGlnbiBzMikgeworLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQGY0MV9zdGFjayhpMzIgJWksIGkzMiAlaTIsIGkzMiAlaTMsIGkzMiAlaTQsIGkzMiAlaTUsIGkzMiAlaTYsIGkzMiAlaTcsIGkzMiAlaTgsIGkzMiAlaTksIGkxMjggJXMxLmNvZXJjZSwgaTEyOCAlczIuY29lcmNlKQorLy8gQ0hFQ0s6ICVzMSA9IGFsbG9jYSAlc3RydWN0LnM0MSwgYWxpZ24gMTYKKy8vIENIRUNLOiAlczIgPSBhbGxvY2EgJXN0cnVjdC5zNDEsIGFsaWduIDE2CisvLyBDSEVDSzogc3RvcmUgaTEyOCAlczEuY29lcmNlLCBpMTI4KiAle3suKn19LCBhbGlnbiAxCisvLyBDSEVDSzogc3RvcmUgaTEyOCAlczIuY29lcmNlLCBpMTI4KiAle3suKn19LCBhbGlnbiAxCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnM0MSogJXMxLCBpMzIgMCwgaTMyIDAKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczQxKiAlczIsIGkzMiAwLCBpMzIgMAorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zNDEqICVzMSwgaTMyIDAsIGkzMiAxCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnM0MSogJXMyLCBpMzIgMCwgaTMyIDEKKyAgcmV0dXJuIHMxLmkgKyBzMi5pICsgaSArIGkyICsgaTMgKyBpNCArIGk1ICsgaTYgKyBpNyArIGk4ICsgaTkgKyBzMS5zICsgczIuczsKK30KK2ludCBjYWxsZXI0MV9zdGFjaygpIHsKKy8vIENIRUNLOiBkZWZpbmUgaTMyIEBjYWxsZXI0MV9zdGFjaygpCisvLyBDSEVDSzogJVtbYTouKl1dID0gbG9hZCBpMTI4KiBiaXRjYXN0ICglc3RydWN0LnM0MSogQGc0MSB0byBpMTI4KiksIGFsaWduIDEKKy8vIENIRUNLOiAlW1tiOi4qXV0gPSBsb2FkIGkxMjgqIGJpdGNhc3QgKCVzdHJ1Y3QuczQxKiBAZzQxXzIgdG8gaTEyOCopLCBhbGlnbiAxCisvLyBDSEVDSzogY2FsbCBpMzIgQGY0MV9zdGFjayhpMzIgMSwgaTMyIDIsIGkzMiAzLCBpMzIgNCwgaTMyIDUsIGkzMiA2LCBpMzIgNywgaTMyIDgsIGkzMiA5LCBpMTI4ICVbW2FdXSwgaTEyOCAlW1tiXV0pCisgIHJldHVybiBmNDFfc3RhY2soMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgZzQxLCBnNDFfMik7Cit9CisKKy8vIHN0cnVjdHMgd2l0aCBzaXplID4gMTYgYnl0ZXMsIHdpdGhvdXQgYWxpZ25tZW50IGF0dHJpYnV0ZQorc3RydWN0IHM0MgoreworICBpbnQgaTsKKyAgc2hvcnQgczsKKyAgaW50IGkyOworICBzaG9ydCBzMjsKKyAgaW50IGkzOworICBzaG9ydCBzMzsKK307Cit0eXBlZGVmIHN0cnVjdCBzNDIgczQyX25vX2FsaWduOworLy8gcGFzc2luZyBzdHJ1Y3RzIGluIHJlZ2lzdGVycworX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkKK2ludCBmNDIoaW50IGksIHM0Ml9ub19hbGlnbiBzMSwgczQyX25vX2FsaWduIHMyKSB7CisvLyBDSEVDSzogZGVmaW5lIGkzMiBAZjQyKGkzMiAlaSwgJXN0cnVjdC5zNDIqICVzMSwgJXN0cnVjdC5zNDIqICVzMikKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczQyKiAlczEsIGkzMiAwLCBpMzIgMAorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zNDIqICVzMiwgaTMyIDAsIGkzMiAwCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnM0MiogJXMxLCBpMzIgMCwgaTMyIDEKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczQyKiAlczIsIGkzMiAwLCBpMzIgMQorICByZXR1cm4gczEuaSArIHMyLmkgKyBpICsgczEucyArIHMyLnM7Cit9CitzNDJfbm9fYWxpZ24gZzQyOworczQyX25vX2FsaWduIGc0Ml8yOworaW50IGNhbGxlcjQyKCkgeworLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQGNhbGxlcjQyKCkKKy8vIENIRUNLOiAlW1thOi4qXV0gPSBhbGxvY2EgJXN0cnVjdC5zNDIsIGFsaWduIDQKKy8vIENIRUNLOiAlW1tiOi4qXV0gPSBhbGxvY2EgJXN0cnVjdC5zNDIsIGFsaWduIDQKKy8vIENIRUNLOiAlW1tjOi4qXV0gPSBiaXRjYXN0ICVzdHJ1Y3QuczQyKiAlW1thXV0gdG8gaTgqCisvLyBDSEVDSzogY2FsbCB2b2lkIEBsbHZtLm1lbWNweS5wMGk4LnAwaTguaTY0CisvLyBDSEVDSzogJVtbZDouKl1dID0gYml0Y2FzdCAlc3RydWN0LnM0MiogJVtbYl1dIHRvIGk4KgorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAbGx2bS5tZW1jcHkucDBpOC5wMGk4Lmk2NAorLy8gQ0hFQ0s6IGNhbGwgaTMyIEBmNDIoaTMyIDMsICVzdHJ1Y3QuczQyKiAlW1thXV0sICVzdHJ1Y3QuczQyKiAlW1tiXV0pCisgIHJldHVybiBmNDIoMywgZzQyLCBnNDJfMik7Cit9CisvLyBwYXNzaW5nIHN0cnVjdHMgb24gc3RhY2sKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpCitpbnQgZjQyX3N0YWNrKGludCBpLCBpbnQgaTIsIGludCBpMywgaW50IGk0LCBpbnQgaTUsIGludCBpNiwgaW50IGk3LCBpbnQgaTgsCisgICAgICAgICAgICAgIGludCBpOSwgczQyX25vX2FsaWduIHMxLCBzNDJfbm9fYWxpZ24gczIpIHsKKy8vIENIRUNLOiBkZWZpbmUgaTMyIEBmNDJfc3RhY2soaTMyICVpLCBpMzIgJWkyLCBpMzIgJWkzLCBpMzIgJWk0LCBpMzIgJWk1LCBpMzIgJWk2LCBpMzIgJWk3LCBpMzIgJWk4LCBpMzIgJWk5LCAlc3RydWN0LnM0MiogJXMxLCAlc3RydWN0LnM0MiogJXMyKQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zNDIqICVzMSwgaTMyIDAsIGkzMiAwCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnM0MiogJXMyLCBpMzIgMCwgaTMyIDAKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczQyKiAlczEsIGkzMiAwLCBpMzIgMQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zNDIqICVzMiwgaTMyIDAsIGkzMiAxCisgIHJldHVybiBzMS5pICsgczIuaSArIGkgKyBpMiArIGkzICsgaTQgKyBpNSArIGk2ICsgaTcgKyBpOCArIGk5ICsgczEucyArIHMyLnM7Cit9CitpbnQgY2FsbGVyNDJfc3RhY2soKSB7CisvLyBDSEVDSzogZGVmaW5lIGkzMiBAY2FsbGVyNDJfc3RhY2soKQorLy8gQ0hFQ0s6ICVbW2E6LipdXSA9IGFsbG9jYSAlc3RydWN0LnM0MiwgYWxpZ24gNAorLy8gQ0hFQ0s6ICVbW2I6LipdXSA9IGFsbG9jYSAlc3RydWN0LnM0MiwgYWxpZ24gNAorLy8gQ0hFQ0s6ICVbW2M6LipdXSA9IGJpdGNhc3QgJXN0cnVjdC5zNDIqICVbW2FdXSB0byBpOCoKKy8vIENIRUNLOiBjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LnAwaTgucDBpOC5pNjQKKy8vIENIRUNLOiAlW1tkOi4qXV0gPSBiaXRjYXN0ICVzdHJ1Y3QuczQyKiAlW1tiXV0gdG8gaTgqCisvLyBDSEVDSzogY2FsbCB2b2lkIEBsbHZtLm1lbWNweS5wMGk4LnAwaTguaTY0CisvLyBDSEVDSzogY2FsbCBpMzIgQGY0Ml9zdGFjayhpMzIgMSwgaTMyIDIsIGkzMiAzLCBpMzIgNCwgaTMyIDUsIGkzMiA2LCBpMzIgNywgaTMyIDgsIGkzMiA5LCAlc3RydWN0LnM0MiogJVtbYV1dLCAlc3RydWN0LnM0MiogJVtbYl1dKQorICByZXR1cm4gZjQyX3N0YWNrKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIGc0MiwgZzQyXzIpOworfQorCisvLyBzdHJ1Y3RzIHdpdGggc2l6ZSA+IDE2IGJ5dGVzLCB3aXRoIGFsaWdubWVudCBhdHRyaWJ1dGUKK3N0cnVjdCBzNDMKK3sKKyAgaW50IGk7CisgIHNob3J0IHM7CisgIGludCBpMjsKKyAgc2hvcnQgczI7CisgIGludCBpMzsKKyAgc2hvcnQgczM7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSk7Cit0eXBlZGVmIHN0cnVjdCBzNDMgczQzX3dpdGhfYWxpZ247CisvLyBwYXNzaW5nIGFsaWduZWQgc3RydWN0cyBpbiByZWdpc3RlcnMKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpCitpbnQgZjQzKGludCBpLCBzNDNfd2l0aF9hbGlnbiBzMSwgczQzX3dpdGhfYWxpZ24gczIpIHsKKy8vIENIRUNLOiBkZWZpbmUgaTMyIEBmNDMoaTMyICVpLCAlc3RydWN0LnM0MyogJXMxLCAlc3RydWN0LnM0MyogJXMyKQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zNDMqICVzMSwgaTMyIDAsIGkzMiAwCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnM0MyogJXMyLCBpMzIgMCwgaTMyIDAKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczQzKiAlczEsIGkzMiAwLCBpMzIgMQorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zNDMqICVzMiwgaTMyIDAsIGkzMiAxCisgIHJldHVybiBzMS5pICsgczIuaSArIGkgKyBzMS5zICsgczIuczsKK30KK3M0M193aXRoX2FsaWduIGc0MzsKK3M0M193aXRoX2FsaWduIGc0M18yOworaW50IGNhbGxlcjQzKCkgeworLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQGNhbGxlcjQzKCkKKy8vIENIRUNLOiAlW1thOi4qXV0gPSBhbGxvY2EgJXN0cnVjdC5zNDMsIGFsaWduIDE2CisvLyBDSEVDSzogJVtbYjouKl1dID0gYWxsb2NhICVzdHJ1Y3QuczQzLCBhbGlnbiAxNgorLy8gQ0hFQ0s6ICVbW2M6LipdXSA9IGJpdGNhc3QgJXN0cnVjdC5zNDMqICVbW2FdXSB0byBpOCoKKy8vIENIRUNLOiBjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LnAwaTgucDBpOC5pNjQKKy8vIENIRUNLOiAlW1tkOi4qXV0gPSBiaXRjYXN0ICVzdHJ1Y3QuczQzKiAlW1tiXV0gdG8gaTgqCisvLyBDSEVDSzogY2FsbCB2b2lkIEBsbHZtLm1lbWNweS5wMGk4LnAwaTguaTY0CisvLyBDSEVDSzogY2FsbCBpMzIgQGY0MyhpMzIgMywgJXN0cnVjdC5zNDMqICVbW2FdXSwgJXN0cnVjdC5zNDMqICVbW2JdXSkKKyAgcmV0dXJuIGY0MygzLCBnNDMsIGc0M18yKTsKK30KKy8vIHBhc3NpbmcgYWxpZ25lZCBzdHJ1Y3RzIG9uIHN0YWNrCitfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQoraW50IGY0M19zdGFjayhpbnQgaSwgaW50IGkyLCBpbnQgaTMsIGludCBpNCwgaW50IGk1LCBpbnQgaTYsIGludCBpNywgaW50IGk4LAorICAgICAgICAgICAgICBpbnQgaTksIHM0M193aXRoX2FsaWduIHMxLCBzNDNfd2l0aF9hbGlnbiBzMikgeworLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQGY0M19zdGFjayhpMzIgJWksIGkzMiAlaTIsIGkzMiAlaTMsIGkzMiAlaTQsIGkzMiAlaTUsIGkzMiAlaTYsIGkzMiAlaTcsIGkzMiAlaTgsIGkzMiAlaTksICVzdHJ1Y3QuczQzKiAlczEsICVzdHJ1Y3QuczQzKiAlczIpCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnM0MyogJXMxLCBpMzIgMCwgaTMyIDAKKy8vIENIRUNLOiBnZXRlbGVtZW50cHRyIGluYm91bmRzICVzdHJ1Y3QuczQzKiAlczIsIGkzMiAwLCBpMzIgMAorLy8gQ0hFQ0s6IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgJXN0cnVjdC5zNDMqICVzMSwgaTMyIDAsIGkzMiAxCisvLyBDSEVDSzogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0LnM0MyogJXMyLCBpMzIgMCwgaTMyIDEKKyAgcmV0dXJuIHMxLmkgKyBzMi5pICsgaSArIGkyICsgaTMgKyBpNCArIGk1ICsgaTYgKyBpNyArIGk4ICsgaTkgKyBzMS5zICsgczIuczsKK30KK2ludCBjYWxsZXI0M19zdGFjaygpIHsKKy8vIENIRUNLOiBkZWZpbmUgaTMyIEBjYWxsZXI0M19zdGFjaygpCisvLyBDSEVDSzogJVtbYTouKl1dID0gYWxsb2NhICVzdHJ1Y3QuczQzLCBhbGlnbiAxNgorLy8gQ0hFQ0s6ICVbW2I6LipdXSA9IGFsbG9jYSAlc3RydWN0LnM0MywgYWxpZ24gMTYKKy8vIENIRUNLOiAlW1tjOi4qXV0gPSBiaXRjYXN0ICVzdHJ1Y3QuczQzKiAlW1thXV0gdG8gaTgqCisvLyBDSEVDSzogY2FsbCB2b2lkIEBsbHZtLm1lbWNweS5wMGk4LnAwaTguaTY0CisvLyBDSEVDSzogJVtbZDouKl1dID0gYml0Y2FzdCAlc3RydWN0LnM0MyogJVtbYl1dIHRvIGk4KgorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAbGx2bS5tZW1jcHkucDBpOC5wMGk4Lmk2NAorLy8gQ0hFQ0s6IGNhbGwgaTMyIEBmNDNfc3RhY2soaTMyIDEsIGkzMiAyLCBpMzIgMywgaTMyIDQsIGkzMiA1LCBpMzIgNiwgaTMyIDcsIGkzMiA4LCBpMzIgOSwgJXN0cnVjdC5zNDMqICVbW2FdXSwgJXN0cnVjdC5zNDMqICVbW2JdXSkKKyAgcmV0dXJuIGY0M19zdGFjaygxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCBnNDMsIGc0M18yKTsKK30KKworLy8gcmRhcjovLzEzNjY4OTI3CisvLyBXZSBzaG91bGQgbm90IHNwbGl0IGFyZ3VtZW50IHMxIGJldHdlZW4gcmVnaXN0ZXJzIGFuZCBzdGFjay4KK19fYXR0cmlidXRlX18gKChub2lubGluZSkpCitpbnQgZjQwX3NwbGl0KGludCBpLCBpbnQgaTIsIGludCBpMywgaW50IGk0LCBpbnQgaTUsIGludCBpNiwgaW50IGk3LAorICAgICAgICAgICAgICBzNDBfbm9fYWxpZ24gczEsIHM0MF9ub19hbGlnbiBzMikgeworLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQGY0MF9zcGxpdChpMzIgJWksIGkzMiAlaTIsIGkzMiAlaTMsIGkzMiAlaTQsIGkzMiAlaTUsIGkzMiAlaTYsIGkzMiAlaTcsIFsxIHggaTMyXSwgWzIgeCBpNjRdICVzMS5jb2VyY2UsIFsyIHggaTY0XSAlczIuY29lcmNlKQorICByZXR1cm4gczEuaSArIHMyLmkgKyBpICsgaTIgKyBpMyArIGk0ICsgaTUgKyBpNiArIGk3ICsgczEucyArIHMyLnM7Cit9CitpbnQgY2FsbGVyNDBfc3BsaXQoKSB7CisvLyBDSEVDSzogZGVmaW5lIGkzMiBAY2FsbGVyNDBfc3BsaXQoKQorLy8gQ0hFQ0s6IGNhbGwgaTMyIEBmNDBfc3BsaXQoaTMyIDEsIGkzMiAyLCBpMzIgMywgaTMyIDQsIGkzMiA1LCBpMzIgNiwgaTMyIDcsIFsxIHggaTMyXSB1bmRlZiwgWzIgeCBpNjRdICV7ey4qfX0gWzIgeCBpNjRdICV7ey4qfX0pCisgIHJldHVybiBmNDBfc3BsaXQoMSwgMiwgMywgNCwgNSwgNiwgNywgZzQwLCBnNDBfMik7Cit9CisKK19fYXR0cmlidXRlX18gKChub2lubGluZSkpCitpbnQgZjQxX3NwbGl0KGludCBpLCBpbnQgaTIsIGludCBpMywgaW50IGk0LCBpbnQgaTUsIGludCBpNiwgaW50IGk3LAorICAgICAgICAgICAgICBzNDFfd2l0aF9hbGlnbiBzMSwgczQxX3dpdGhfYWxpZ24gczIpIHsKKy8vIENIRUNLOiBkZWZpbmUgaTMyIEBmNDFfc3BsaXQoaTMyICVpLCBpMzIgJWkyLCBpMzIgJWkzLCBpMzIgJWk0LCBpMzIgJWk1LCBpMzIgJWk2LCBpMzIgJWk3LCBbMSB4IGkzMl0sIGkxMjggJXMxLmNvZXJjZSwgaTEyOCAlczIuY29lcmNlKQorICByZXR1cm4gczEuaSArIHMyLmkgKyBpICsgaTIgKyBpMyArIGk0ICsgaTUgKyBpNiArIGk3ICsgczEucyArIHMyLnM7Cit9CitpbnQgY2FsbGVyNDFfc3BsaXQoKSB7CisvLyBDSEVDSzogZGVmaW5lIGkzMiBAY2FsbGVyNDFfc3BsaXQoKQorLy8gQ0hFQ0s6IGNhbGwgaTMyIEBmNDFfc3BsaXQoaTMyIDEsIGkzMiAyLCBpMzIgMywgaTMyIDQsIGkzMiA1LCBpMzIgNiwgaTMyIDcsIFsxIHggaTMyXSB1bmRlZiwgaTEyOCAle3suKn19LCBpMTI4ICV7ey4qfX0pCisgIHJldHVybiBmNDFfc3BsaXQoMSwgMiwgMywgNCwgNSwgNiwgNywgZzQxLCBnNDFfMik7Cit9CisKKy8vIEhhbmRsZSBob21vZ2VuZW91cyBhZ2dyZWdhdGVzIHByb3Blcmx5IGluIHZhcmlhZGljIGZ1bmN0aW9ucy4KK3N0cnVjdCBIRkEgeworICBmbG9hdCBhLCBiLCBjLCBkOworfTsKKworZmxvYXQgdGVzdF9oZmEoaW50IG4sIC4uLikgeworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBmbG9hdCBAdGVzdF9oZmEoaTMyICVuLCAuLi4pCisvLyBDSEVDSzogW1tUSEVMSVNUOiUuKl1dID0gYWxsb2NhIGk4KgorLy8gQ0hFQ0s6IFtbQ1VSTElTVDolLipdXSA9IGxvYWQgaTgqKiBbW1RIRUxJU1RdXQorCisgIC8vIEhGQSBpcyBub3QgaW5kaXJlY3QsIHNvIG9jY3VwaWVzIGl0cyBmdWxsIDE2IGJ5dGVzIG9uIHRoZSBzdGFjay4KKy8vIENIRUNLOiBbW05FWFRMSVNUOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tDVVJMSVNUXV0sIGkzMiAxNgorLy8gQ0hFQ0s6IHN0b3JlIGk4KiBbW05FWFRMSVNUXV0sIGk4KiogW1tUSEVMSVNUXV0KKworLy8gQ0hFQ0s6IGJpdGNhc3QgaTgqIFtbQ1VSTElTVF1dIHRvICVzdHJ1Y3QuSEZBKgorICBfX2J1aWx0aW5fdmFfbGlzdCB0aGVsaXN0OworICBfX2J1aWx0aW5fdmFfc3RhcnQodGhlbGlzdCwgbik7CisgIHN0cnVjdCBIRkEgaCA9IF9fYnVpbHRpbl92YV9hcmcodGhlbGlzdCwgc3RydWN0IEhGQSk7CisgIHJldHVybiBoLmQ7Cit9CisKK3N0cnVjdCBUb29CaWdIRkEgeworICBmbG9hdCBhLCBiLCBjLCBkLCBlOworfTsKKworZmxvYXQgdGVzdF90b29iaWdfaGZhKGludCBuLCAuLi4pIHsKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgZmxvYXQgQHRlc3RfdG9vYmlnX2hmYShpMzIgJW4sIC4uLikKKy8vIENIRUNLOiBbW1RIRUxJU1Q6JS4qXV0gPSBhbGxvY2EgaTgqCisvLyBDSEVDSzogW1tDVVJMSVNUOiUuKl1dID0gbG9hZCBpOCoqIFtbVEhFTElTVF1dCisKKyAgLy8gVG9vQmlnSEZBIGlzIG5vdCBhY3R1YWxseSBhbiBIRkEsIHNvIGdldHMgcGFzc2VkIGluZGlyZWN0bHkuIE9ubHkgOCBieXRlcworICAvLyBvZiBzdGFjayBjb25zdW1lZC4KKy8vIENIRUNLOiBbW05FWFRMSVNUOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tDVVJMSVNUXV0sIGkzMiA4CisvLyBDSEVDSzogc3RvcmUgaTgqIFtbTkVYVExJU1RdXSwgaTgqKiBbW1RIRUxJU1RdXQorCisvLyBDSEVDSzogW1tIRkFQVFJQVFI6JS4qXV0gPSBiaXRjYXN0IGk4KiBbW0NVUkxJU1RdXSB0byBpOCoqCisvLyBDSEVDSzogW1tIRkFQVFI6JS4qXV0gPSBsb2FkIGk4KiogW1tIRkFQVFJQVFJdXQorLy8gQ0hFQ0s6IGJpdGNhc3QgaTgqIFtbSEZBUFRSXV0gdG8gJXN0cnVjdC5Ub29CaWdIRkEqCisgIF9fYnVpbHRpbl92YV9saXN0IHRoZWxpc3Q7CisgIF9fYnVpbHRpbl92YV9zdGFydCh0aGVsaXN0LCBuKTsKKyAgc3RydWN0IFRvb0JpZ0hGQSBoID0gX19idWlsdGluX3ZhX2FyZyh0aGVsaXN0LCBzdHJ1Y3QgVG9vQmlnSEZBKTsKKyAgcmV0dXJuIGguZDsKK30KKworc3RydWN0IEhWQSB7CisgIGludDMyeDRfdCBhLCBiOworfTsKKworaW50MzJ4NF90IHRlc3RfaHZhKGludCBuLCAuLi4pIHsKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgPDQgeCBpMzI+IEB0ZXN0X2h2YShpMzIgJW4sIC4uLikKKy8vIENIRUNLOiBbW1RIRUxJU1Q6JS4qXV0gPSBhbGxvY2EgaTgqCisvLyBDSEVDSzogW1tDVVJMSVNUOiUuKl1dID0gbG9hZCBpOCoqIFtbVEhFTElTVF1dCisKKyAgLy8gSFZBIGlzIG5vdCBpbmRpcmVjdCwgc28gb2NjdXBpZXMgaXRzIGZ1bGwgMTYgYnl0ZXMgb24gdGhlIHN0YWNrLiBidXQgaXQKKyAgLy8gbXVzdCBiZSBwcm9wZXJseSBhbGlnbmVkLgorLy8gQ0hFQ0s6IFtbQUxJR04wOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tDVVJMSVNUXV0sIGkzMiAxNQorLy8gQ0hFQ0s6IFtbQUxJR04xOiUuKl1dID0gcHRydG9pbnQgaTgqIFtbQUxJR04wXV0gdG8gaTY0CisvLyBDSEVDSzogW1tBTElHTjI6JS4qXV0gPSBhbmQgaTY0IFtbQUxJR04xXV0sIC0xNgorLy8gQ0hFQ0s6IFtbQUxJR05FRF9MSVNUOiUuKl1dID0gaW50dG9wdHIgaTY0IFtbQUxJR04yXV0gdG8gaTgqCisKKy8vIENIRUNLOiBbW05FWFRMSVNUOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogW1tBTElHTkVEX0xJU1RdXSwgaTMyIDMyCisvLyBDSEVDSzogc3RvcmUgaTgqIFtbTkVYVExJU1RdXSwgaTgqKiBbW1RIRUxJU1RdXQorCisvLyBDSEVDSzogYml0Y2FzdCBpOCogW1tBTElHTkVEX0xJU1RdXSB0byAlc3RydWN0LkhWQSoKKyAgX19idWlsdGluX3ZhX2xpc3QgdGhlbGlzdDsKKyAgX19idWlsdGluX3ZhX3N0YXJ0KHRoZWxpc3QsIG4pOworICBzdHJ1Y3QgSFZBIGggPSBfX2J1aWx0aW5fdmFfYXJnKHRoZWxpc3QsIHN0cnVjdCBIVkEpOworICByZXR1cm4gaC5iOworfQorCitzdHJ1Y3QgVG9vQmlnSFZBIHsKKyAgaW50MzJ4NF90IGEsIGIsIGMsIGQsIGU7Cit9OworCitpbnQzMng0X3QgdGVzdF90b29iaWdfaHZhKGludCBuLCAuLi4pIHsKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgPDQgeCBpMzI+IEB0ZXN0X3Rvb2JpZ19odmEoaTMyICVuLCAuLi4pCisvLyBDSEVDSzogW1tUSEVMSVNUOiUuKl1dID0gYWxsb2NhIGk4KgorLy8gQ0hFQ0s6IFtbQ1VSTElTVDolLipdXSA9IGxvYWQgaTgqKiBbW1RIRUxJU1RdXQorCisgIC8vIFRvb0JpZ0hWQSBpcyBub3QgYWN0dWFsbHkgYW4gSFZBLCBzbyBnZXRzIHBhc3NlZCBpbmRpcmVjdGx5LiBPbmx5IDggYnl0ZXMKKyAgLy8gb2Ygc3RhY2sgY29uc3VtZWQuCisvLyBDSEVDSzogW1tORVhUTElTVDolLipdXSA9IGdldGVsZW1lbnRwdHIgaTgqIFtbQ1VSTElTVF1dLCBpMzIgOAorLy8gQ0hFQ0s6IHN0b3JlIGk4KiBbW05FWFRMSVNUXV0sIGk4KiogW1tUSEVMSVNUXV0KKworLy8gQ0hFQ0s6IFtbSFZBUFRSUFRSOiUuKl1dID0gYml0Y2FzdCBpOCogW1tDVVJMSVNUXV0gdG8gaTgqKgorLy8gQ0hFQ0s6IFtbSFZBUFRSOiUuKl1dID0gbG9hZCBpOCoqIFtbSFZBUFRSUFRSXV0KKy8vIENIRUNLOiBiaXRjYXN0IGk4KiBbW0hWQVBUUl1dIHRvICVzdHJ1Y3QuVG9vQmlnSFZBKgorICBfX2J1aWx0aW5fdmFfbGlzdCB0aGVsaXN0OworICBfX2J1aWx0aW5fdmFfc3RhcnQodGhlbGlzdCwgbik7CisgIHN0cnVjdCBUb29CaWdIVkEgaCA9IF9fYnVpbHRpbl92YV9hcmcodGhlbGlzdCwgc3RydWN0IFRvb0JpZ0hWQSk7CisgIHJldHVybiBoLmQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYXJtNjQtY3JjMzIuYyBiL3Rlc3QvQ29kZUdlbi9hcm02NC1jcmMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMzFhNzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjQtY3JjMzIuYwpAQCAtMCwwICsxLDU1IEBACisvLyBSRVFVSVJFUzogYXJtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LW5vbmUtbGludXgtZ251IFwKKy8vIFJVTjogICAtTzMgLVMgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisKK2ludCBjcmMzMmIoaW50IGEsIGNoYXIgYikKK3sKKyAgICAgICAgcmV0dXJuIF9fYnVpbHRpbl9hcm1fY3JjMzJiKGEsYik7CisvLyBDSEVDSzogW1tUMDolWzAtOV0rXV0gPSB6ZXh0IGk4ICViIHRvIGkzMgorLy8gQ0hFQ0s6IGNhbGwgaTMyIEBsbHZtLmFybTY0LmNyYzMyYihpMzIgJWEsIGkzMiBbW1QwXV0pCit9CisKK2ludCBjcmMzMmNiKGludCBhLCBjaGFyIGIpCit7CisgICAgICAgIHJldHVybiBfX2J1aWx0aW5fYXJtX2NyYzMyY2IoYSxiKTsKKy8vIENIRUNLOiBbW1QwOiVbMC05XStdXSA9IHpleHQgaTggJWIgdG8gaTMyCisvLyBDSEVDSzogY2FsbCBpMzIgQGxsdm0uYXJtNjQuY3JjMzJjYihpMzIgJWEsIGkzMiBbW1QwXV0pCit9CisKK2ludCBjcmMzMmgoaW50IGEsIHNob3J0IGIpCit7CisgICAgICAgIHJldHVybiBfX2J1aWx0aW5fYXJtX2NyYzMyaChhLGIpOworLy8gQ0hFQ0s6IFtbVDA6JVswLTldK11dID0gemV4dCBpMTYgJWIgdG8gaTMyCisvLyBDSEVDSzogY2FsbCBpMzIgQGxsdm0uYXJtNjQuY3JjMzJoKGkzMiAlYSwgaTMyIFtbVDBdXSkKK30KKworaW50IGNyYzMyY2goaW50IGEsIHNob3J0IGIpCit7CisgICAgICAgIHJldHVybiBfX2J1aWx0aW5fYXJtX2NyYzMyY2goYSxiKTsKKy8vIENIRUNLOiBbW1QwOiVbMC05XStdXSA9IHpleHQgaTE2ICViIHRvIGkzMgorLy8gQ0hFQ0s6IGNhbGwgaTMyIEBsbHZtLmFybTY0LmNyYzMyY2goaTMyICVhLCBpMzIgW1tUMF1dKQorfQorCitpbnQgY3JjMzJ3KGludCBhLCBpbnQgYikKK3sKKyAgICAgICAgcmV0dXJuIF9fYnVpbHRpbl9hcm1fY3JjMzJ3KGEsYik7CisvLyBDSEVDSzogY2FsbCBpMzIgQGxsdm0uYXJtNjQuY3JjMzJ3KGkzMiAlYSwgaTMyICViKQorfQorCitpbnQgY3JjMzJjdyhpbnQgYSwgaW50IGIpCit7CisgICAgICAgIHJldHVybiBfX2J1aWx0aW5fYXJtX2NyYzMyY3coYSxiKTsKKy8vIENIRUNLOiBjYWxsIGkzMiBAbGx2bS5hcm02NC5jcmMzMmN3KGkzMiAlYSwgaTMyICViKQorfQorCitpbnQgY3JjMzJkKGludCBhLCBsb25nIGIpCit7CisgICAgICAgIHJldHVybiBfX2J1aWx0aW5fYXJtX2NyYzMyZChhLGIpOworLy8gQ0hFQ0s6IGNhbGwgaTMyIEBsbHZtLmFybTY0LmNyYzMyeChpMzIgJWEsIGk2NCAlYikKK30KKworaW50IGNyYzMyY2QoaW50IGEsIGxvbmcgYikKK3sKKyAgICAgICAgcmV0dXJuIF9fYnVpbHRpbl9hcm1fY3JjMzJjZChhLGIpOworLy8gQ0hFQ0s6IGNhbGwgaTMyIEBsbHZtLmFybTY0LmNyYzMyY3goaTMyICVhLCBpNjQgJWIpCit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYXJtNjQtbGFuZXMuYyBiL3Rlc3QvQ29kZUdlbi9hcm02NC1sYW5lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZDdkMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjQtbGFuZXMuYwpAQCAtMCwwICsxLDYzIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLU8zIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zNyAtZmZyZWVzdGFuZGluZyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKKy8vIENIRUNLLUxBQkVMOiBAdGVzdF92ZHVwYl9sYW5lX3M4CitpbnQ4X3QgdGVzdF92ZHVwYl9sYW5lX3M4KGludDh4OF90IHNyYykgeworICByZXR1cm4gdmR1cGJfbGFuZV9zOChzcmMsIDIpOworICAvLyBDSEVDSzogZXh0cmFjdGVsZW1lbnQgPDggeCBpOD4gJXNyYywgaTMyIDIKK30KKworLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3ZkdXBiX2xhbmVfdTgKK3VpbnQ4X3QgdGVzdF92ZHVwYl9sYW5lX3U4KHVpbnQ4eDhfdCBzcmMpIHsKKyAgcmV0dXJuIHZkdXBiX2xhbmVfdTgoc3JjLCAyKTsKKyAgLy8gQ0hFQ0s6IGV4dHJhY3RlbGVtZW50IDw4IHggaTg+ICVzcmMsIGkzMiAyCit9CisKKy8vIENIRUNLLUxBQkVMOiBAdGVzdF92ZHVwaF9sYW5lX3MxNgoraW50MTZfdCB0ZXN0X3ZkdXBoX2xhbmVfczE2KGludDE2eDRfdCBzcmMpIHsKKyAgcmV0dXJuIHZkdXBoX2xhbmVfczE2KHNyYywgMik7CisgIC8vIENIRUNLOiBleHRyYWN0ZWxlbWVudCA8NCB4IGkxNj4gJXNyYywgaTMyIDIKK30KKworLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3ZkdXBoX2xhbmVfdTE2Cit1aW50MTZfdCB0ZXN0X3ZkdXBoX2xhbmVfdTE2KHVpbnQxNng0X3Qgc3JjKSB7CisgIHJldHVybiB2ZHVwaF9sYW5lX3UxNihzcmMsIDIpOworICAvLyBDSEVDSzogZXh0cmFjdGVsZW1lbnQgPDQgeCBpMTY+ICVzcmMsIGkzMiAyCit9CisKKy8vIENIRUNLLUxBQkVMOiBAdGVzdF92ZHVwc19sYW5lX3MzMgoraW50MzJfdCB0ZXN0X3ZkdXBzX2xhbmVfczMyKGludDMyeDJfdCBzcmMpIHsKKyAgcmV0dXJuIHZkdXBzX2xhbmVfczMyKHNyYywgMCk7CisgIC8vIENIRUNLOiBleHRyYWN0ZWxlbWVudCA8MiB4IGkzMj4gJXNyYywgaTMyIDAKK30KKworLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3ZkdXBzX2xhbmVfdTMyCit1aW50MzJfdCB0ZXN0X3ZkdXBzX2xhbmVfdTMyKHVpbnQzMngyX3Qgc3JjKSB7CisgIHJldHVybiB2ZHVwc19sYW5lX3UzMihzcmMsIDApOworICAvLyBDSEVDSzogZXh0cmFjdGVsZW1lbnQgPDIgeCBpMzI+ICVzcmMsIGkzMiAwCit9CisKKy8vIENIRUNLLUxBQkVMOiBAdGVzdF92ZHVwc19sYW5lX2YzMgorZmxvYXQzMl90IHRlc3RfdmR1cHNfbGFuZV9mMzIoZmxvYXQzMngyX3Qgc3JjKSB7CisgIHJldHVybiB2ZHVwc19sYW5lX2YzMihzcmMsIDApOworICAvLyBDSEVDSzogZXh0cmFjdGVsZW1lbnQgPDIgeCBmbG9hdD4gJXNyYywgaTMyIDAKK30KKworLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3ZkdXBkX2xhbmVfczY0CitpbnQ2NF90IHRlc3RfdmR1cGRfbGFuZV9zNjQoaW50NjR4MV90IHNyYykgeworICByZXR1cm4gdmR1cGRfbGFuZV9zNjQoc3JjLCAwKTsKKyAgLy8gQ0hFQ0s6IGV4dHJhY3RlbGVtZW50IDwxIHggaTY0PiAlc3JjLCBpMzIgMAorfQorCisvLyBDSEVDSy1MQUJFTDogQHRlc3RfdmR1cGRfbGFuZV91NjQKK3VpbnQ2NF90IHRlc3RfdmR1cGRfbGFuZV91NjQodWludDY0eDFfdCBzcmMpIHsKKyAgcmV0dXJuIHZkdXBkX2xhbmVfdTY0KHNyYywgMCk7CisgIC8vIENIRUNLOiBleHRyYWN0ZWxlbWVudCA8MSB4IGk2ND4gJXNyYywgaTMyIDAKK30KKworLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3ZkdXBkX2xhbmVfZjY0CitmbG9hdDY0X3QgdGVzdF92ZHVwZF9sYW5lX2Y2NChmbG9hdDY0eDFfdCBzcmMpIHsKKyAgcmV0dXJuIHZkdXBkX2xhbmVfZjY0KHNyYywgMCk7CisgIC8vIENIRUNLOiBleHRyYWN0ZWxlbWVudCA8MSB4IGRvdWJsZT4gJXNyYywgaTMyIDAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm02NC1zY2FsYXItdGVzdC5jIGIvdGVzdC9Db2RlR2VuL2FybTY0LXNjYWxhci10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxMDg3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NC1zY2FsYXItdGVzdC5jCkBAIC0wLDAgKzEsNTM1IEBACisvLyBSRVFVSVJFUzogYXJtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcuMCAgXAorLy8gUlVOOiAgIC1TIC1PMSAtbyAtIC1mZnJlZXN0YW5kaW5nICVzIHwgRmlsZUNoZWNrICVzCisKKy8vIFdlJ3JlIGV4cGxpY2l0bHkgdXNpbmcgYXJtX25lb24uaCBoZXJlOiBzb21lIHR5cGVzIHByb2JhYmx5IGRvbid0IG1hdGNoCisvLyB0aGUgQUNMRSBkZWZpbml0aW9ucywgYnV0IHdlIHdhbnQgdG8gY2hlY2sgY3VycmVudCBjb2RlZ2VuLgorI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK2Zsb2F0IHRlc3RfdnJzcXJ0c3NfZjMyKGZsb2F0IGEsIGZsb2F0IGIpIHsKKy8vIENIRUNLOiB0ZXN0X3Zyc3FydHNzX2YzMgorICByZXR1cm4gdnJzcXJ0c3NfZjMyKGEsIGIpOworLy8gQ0hFQ0s6IGZyc3FydHMge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3NbMC05XSt9fQorfQorCitkb3VibGUgdGVzdF92cnNxcnRzZF9mNjQoZG91YmxlIGEsIGRvdWJsZSBiKSB7CisvLyBDSEVDSzogdGVzdF92cnNxcnRzZF9mNjQKKyAgcmV0dXJuIHZyc3FydHNkX2Y2NChhLCBiKTsKKy8vIENIRUNLOiBmcnNxcnRzIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KK30KKworaW50NjR4MV90IHRlc3RfdnJzaGxfczY0KGludDY0eDFfdCBhLCBpbnQ2NHgxX3QgYikgeworLy8gQ0hFQ0s6IHRlc3RfdnJzaGxfczY0CisgIHJldHVybiB2cnNobF9zNjQoYSwgYik7CisvLyBDSEVDSzogc3JzaGwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQorCit1aW50NjR4MV90IHRlc3RfdnJzaGxfdTY0KHVpbnQ2NHgxX3QgYSwgaW50NjR4MV90IGIpIHsKKy8vIENIRUNLOiB0ZXN0X3Zyc2hsX3U2NAorICByZXR1cm4gdnJzaGxfdTY0KGEsIGIpOworLy8gQ0hFQ0s6IHVyc2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnJzaGxkX3M2NAoraW50NjRfdCB0ZXN0X3Zyc2hsZF9zNjQoaW50NjRfdCBhLCBpbnQ2NF90IGIpIHsKKyAgcmV0dXJuIHZyc2hsZF9zNjQoYSwgYik7CisvLyBDSEVDSzogc3JzaGwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cnNobGRfdTY0Cit1aW50NjRfdCB0ZXN0X3Zyc2hsZF91NjQodWludDY0X3QgYSwgdWludDY0X3QgYikgeworICByZXR1cm4gdnJzaGxkX3U2NChhLCBiKTsKKy8vIENIRUNLOiB1cnNobCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxcnNobGJfczgKK2ludDhfdCB0ZXN0X3ZxcnNobGJfczgoaW50OF90IGEsIGludDhfdCBiKSB7CisgIHJldHVybiB2cXJzaGxiX3M4KGEsIGIpOworLy8gQ0hFQ0s6IHNxcnNobC44YiB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0sIHt7dlswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxcnNobGhfczE2CitpbnQxNl90IHRlc3RfdnFyc2hsaF9zMTYoaW50MTZfdCBhLCBpbnQxNl90IGIpIHsKKyAgcmV0dXJuIHZxcnNobGhfczE2KGEsIGIpOworLy8gQ0hFQ0s6IHNxcnNobC40aCB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0sIHt7dlswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxcnNobHNfczMyCitpbnQzMl90IHRlc3RfdnFyc2hsc19zMzIoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsKKyAgcmV0dXJuIHZxcnNobHNfczMyKGEsIGIpOworLy8gQ0hFQ0s6IHNxcnNobCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7c1swLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxcnNobGRfczY0CitpbnQ2NF90IHRlc3RfdnFyc2hsZF9zNjQoaW50NjRfdCBhLCBpbnQ2NF90IGIpIHsKKyAgcmV0dXJuIHZxcnNobGRfczY0KGEsIGIpOworLy8gQ0hFQ0s6IHNxcnNobCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxcnNobGJfdTgKK3VpbnQ4X3QgdGVzdF92cXJzaGxiX3U4KHVpbnQ4X3QgYSwgdWludDhfdCBiKSB7CisgIHJldHVybiB2cXJzaGxiX3U4KGEsIGIpOworLy8gQ0hFQ0s6IHVxcnNobC44YiB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0sIHt7dlswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxcnNobGhfdTE2Cit1aW50MTZfdCB0ZXN0X3ZxcnNobGhfdTE2KHVpbnQxNl90IGEsIHVpbnQxNl90IGIpIHsKKyAgcmV0dXJuIHZxcnNobGhfdTE2KGEsIGIpOworLy8gQ0hFQ0s6IHVxcnNobC40aCB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0sIHt7dlswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxcnNobHNfdTMyCit1aW50MzJfdCB0ZXN0X3ZxcnNobHNfdTMyKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpIHsKKyAgcmV0dXJuIHZxcnNobHNfdTMyKGEsIGIpOworLy8gQ0hFQ0s6IHVxcnNobCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7c1swLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxcnNobGRfdTY0Cit1aW50NjRfdCB0ZXN0X3ZxcnNobGRfdTY0KHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpIHsKKyAgcmV0dXJuIHZxcnNobGRfdTY0KGEsIGIpOworLy8gQ0hFQ0s6IHVxcnNobCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3Zxc2hsYl9zOAoraW50OF90IHRlc3RfdnFzaGxiX3M4KGludDhfdCBhLCBpbnQ4X3QgYikgeworICByZXR1cm4gdnFzaGxiX3M4KGEsIGIpOworLy8gQ0hFQ0s6IHNxc2hsLjhiIHt7dlswLTldK319LCB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFzaGxoX3MxNgoraW50MTZfdCB0ZXN0X3Zxc2hsaF9zMTYoaW50MTZfdCBhLCBpbnQxNl90IGIpIHsKKyAgcmV0dXJuIHZxc2hsaF9zMTYoYSwgYik7CisvLyBDSEVDSzogc3FzaGwuNGgge3t2WzAtOV0rfX0sIHt7dlswLTldK319LCB7e3ZbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cXNobHNfczMyCitpbnQzMl90IHRlc3RfdnFzaGxzX3MzMihpbnQzMl90IGEsIGludDMyX3QgYikgeworICByZXR1cm4gdnFzaGxzX3MzMihhLCBiKTsKKy8vIENIRUNLOiBzcXNobCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7c1swLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3Zxc2hsZF9zNjQKK2ludDY0X3QgdGVzdF92cXNobGRfczY0KGludDY0X3QgYSwgaW50NjRfdCBiKSB7CisgIHJldHVybiB2cXNobGRfczY0KGEsIGIpOworLy8gQ0hFQ0s6IHNxc2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFzaGxiX3U4Cit1aW50OF90IHRlc3RfdnFzaGxiX3U4KHVpbnQ4X3QgYSwgdWludDhfdCBiKSB7CisgIHJldHVybiB2cXNobGJfdTgoYSwgYik7CisvLyBDSEVDSzogdXFzaGwuOGIge3t2WzAtOV0rfX0sIHt7dlswLTldK319LCB7e3ZbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cXNobGhfdTE2Cit1aW50MTZfdCB0ZXN0X3Zxc2hsaF91MTYodWludDE2X3QgYSwgdWludDE2X3QgYikgeworICByZXR1cm4gdnFzaGxoX3UxNihhLCBiKTsKKy8vIENIRUNLOiB1cXNobC40aCB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0sIHt7dlswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3Zxc2hsc191MzIKK3VpbnQzMl90IHRlc3RfdnFzaGxzX3UzMih1aW50MzJfdCBhLCB1aW50MzJfdCBiKSB7CisgIHJldHVybiB2cXNobHNfdTMyKGEsIGIpOworLy8gQ0hFQ0s6IHVxc2hsIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFzaGxkX3U2NAordWludDY0X3QgdGVzdF92cXNobGRfdTY0KHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpIHsKKyAgcmV0dXJuIHZxc2hsZF91NjQoYSwgYik7CisvLyBDSEVDSzogdXFzaGwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92c2hsZF91NjQKK3VpbnQ2NF90IHRlc3RfdnNobGRfdTY0KHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpIHsKKyAgcmV0dXJuIHZzaGxkX3U2NChhLCBiKTsKKy8vIENIRUNLOiB1c2hsIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnNobGRfczY0CitpbnQ2NF90IHRlc3RfdnNobGRfczY0KGludDY0X3QgYSwgaW50NjRfdCBiKSB7CisgIHJldHVybiB2c2hsZF9zNjQoYSwgYik7CisvLyBDSEVDSzogc3NobCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxZG11bGxoX3MxNgoraW50MzJfdCB0ZXN0X3ZxZG11bGxoX3MxNihpbnQxNl90IGEsIGludDE2X3QgYikgeworICByZXR1cm4gdnFkbXVsbGhfczE2KGEsIGIpOworLy8gQ0hFQ0s6IHNxZG11bGwuNHMge3t2WzAtOV0rfX0sIHt7dlswLTldK319LCB7e3ZbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cWRtdWxsc19zMzIKK2ludDY0X3QgdGVzdF92cWRtdWxsc19zMzIoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsKKyAgcmV0dXJuIHZxZG11bGxzX3MzMihhLCBiKTsKKy8vIENIRUNLOiBzcWRtdWxsIHt7ZFswLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFhZGRiX3M4CitpbnQ4X3QgdGVzdF92cWFkZGJfczgoaW50OF90IGEsIGludDhfdCBiKSB7CisgIHJldHVybiB2cWFkZGJfczgoYSwgYik7CisvLyBDSEVDSzogc3FhZGQuOGIge3t2WzAtOV0rfX0sIHt7dlswLTldK319LCB7e3ZbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cWFkZGhfczE2CitpbnQxNl90IHRlc3RfdnFhZGRoX3MxNihpbnQxNl90IGEsIGludDE2X3QgYikgeworICByZXR1cm4gdnFhZGRoX3MxNihhLCBiKTsKKy8vIENIRUNLOiBzcWFkZC40aCB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0sIHt7dlswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxYWRkc19zMzIKK2ludDMyX3QgdGVzdF92cWFkZHNfczMyKGludDMyX3QgYSwgaW50MzJfdCBiKSB7CisgIHJldHVybiB2cWFkZHNfczMyKGEsIGIpOworLy8gQ0hFQ0s6IHNxYWRkIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFhZGRkX3M2NAoraW50NjRfdCB0ZXN0X3ZxYWRkZF9zNjQoaW50NjRfdCBhLCBpbnQ2NF90IGIpIHsKKyAgcmV0dXJuIHZxYWRkZF9zNjQoYSwgYik7CisvLyBDSEVDSzogc3FhZGQge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cWFkZGJfdTgKK3VpbnQ4X3QgdGVzdF92cWFkZGJfdTgodWludDhfdCBhLCB1aW50OF90IGIpIHsKKyAgcmV0dXJuIHZxYWRkYl91OChhLCBiKTsKKy8vIENIRUNLOiB1cWFkZC44YiB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0sIHt7dlswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxYWRkaF91MTYKK3VpbnQxNl90IHRlc3RfdnFhZGRoX3UxNih1aW50MTZfdCBhLCB1aW50MTZfdCBiKSB7CisgIHJldHVybiB2cWFkZGhfdTE2KGEsIGIpOworLy8gQ0hFQ0s6IHVxYWRkLjRoIHt7dlswLTldK319LCB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFhZGRzX3UzMgordWludDMyX3QgdGVzdF92cWFkZHNfdTMyKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpIHsKKyAgcmV0dXJuIHZxYWRkc191MzIoYSwgYik7CisvLyBDSEVDSzogdXFhZGQge3tzWzAtOV0rfX0sIHt7c1swLTldK319LCB7e3NbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cWFkZGRfdTY0Cit1aW50NjRfdCB0ZXN0X3ZxYWRkZF91NjQodWludDY0X3QgYSwgdWludDY0X3QgYikgeworICByZXR1cm4gdnFhZGRkX3U2NChhLCBiKTsKKy8vIENIRUNLOiB1cWFkZCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sIHt7ZFswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3Zxc3ViYl9zOAoraW50OF90IHRlc3RfdnFzdWJiX3M4KGludDhfdCBhLCBpbnQ4X3QgYikgeworICByZXR1cm4gdnFzdWJiX3M4KGEsIGIpOworLy8gQ0hFQ0s6IHNxc3ViLjhiIHt7dlswLTldK319LCB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFzdWJoX3MxNgoraW50MTZfdCB0ZXN0X3Zxc3ViaF9zMTYoaW50MTZfdCBhLCBpbnQxNl90IGIpIHsKKyAgcmV0dXJuIHZxc3ViaF9zMTYoYSwgYik7CisvLyBDSEVDSzogc3FzdWIuNGgge3t2WzAtOV0rfX0sIHt7dlswLTldK319LCB7e3ZbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cXN1YnNfczMyCitpbnQzMl90IHRlc3RfdnFzdWJzX3MzMihpbnQzMl90IGEsIGludDMyX3QgYikgeworICByZXR1cm4gdnFzdWJzX3MzMihhLCBiKTsKKy8vIENIRUNLOiBzcXN1YiB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sIHt7c1swLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3Zxc3ViZF9zNjQKK2ludDY0X3QgdGVzdF92cXN1YmRfczY0KGludDY0X3QgYSwgaW50NjRfdCBiKSB7CisgIHJldHVybiB2cXN1YmRfczY0KGEsIGIpOworLy8gQ0hFQ0s6IHNxc3ViIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFzdWJiX3U4Cit1aW50OF90IHRlc3RfdnFzdWJiX3U4KHVpbnQ4X3QgYSwgdWludDhfdCBiKSB7CisgIHJldHVybiB2cXN1YmJfdTgoYSwgYik7CisvLyBDSEVDSzogdXFzdWIuOGIge3t2WzAtOV0rfX0sIHt7dlswLTldK319LCB7e3ZbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cXN1YmhfdTE2Cit1aW50MTZfdCB0ZXN0X3Zxc3ViaF91MTYodWludDE2X3QgYSwgdWludDE2X3QgYikgeworICByZXR1cm4gdnFzdWJoX3UxNihhLCBiKTsKKy8vIENIRUNLOiB1cXN1Yi40aCB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0sIHt7dlswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3Zxc3Vic191MzIKK3VpbnQzMl90IHRlc3RfdnFzdWJzX3UzMih1aW50MzJfdCBhLCB1aW50MzJfdCBiKSB7CisgIHJldHVybiB2cXN1YnNfdTMyKGEsIGIpOworLy8gQ0hFQ0s6IHVxc3ViIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFzdWJkX3U2NAordWludDY0X3QgdGVzdF92cXN1YmRfdTY0KHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpIHsKKyAgcmV0dXJuIHZxc3ViZF91NjQoYSwgYik7CisvLyBDSEVDSzogdXFzdWIge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cW1vdm5oX3MxNgoraW50OF90IHRlc3RfdnFtb3ZuaF9zMTYoaW50MTZfdCBhKSB7CisgIHJldHVybiB2cW1vdm5oX3MxNihhKTsKKy8vIENIRUNLOiBzcXh0bi44YiB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFtb3ZuaF91MTYKK3VpbnQ4X3QgdGVzdF92cW1vdm5oX3UxNih1aW50MTZfdCBhKSB7CisgIHJldHVybiB2cW1vdm5oX3UxNihhKTsKKy8vIENIRUNLOiB1cXh0bi44YiB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFtb3Zuc19zMzIKK2ludDE2X3QgdGVzdF92cW1vdm5zX3MzMihpbnQzMl90IGEpIHsKKyAgcmV0dXJuIHZxbW92bnNfczMyKGEpOworLy8gQ0hFQ0s6IHNxeHRuLjRoIHt7dlswLTldK319LCB7e3ZbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cW1vdm5zX3UzMgordWludDE2X3QgdGVzdF92cW1vdm5zX3UzMih1aW50MzJfdCBhKSB7CisgIHJldHVybiB2cW1vdm5zX3UzMihhKTsKKy8vIENIRUNLOiB1cXh0bi40aCB7e3ZbMC05XSt9fSwge3t2WzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFtb3ZuZF9zNjQKK2ludDMyX3QgdGVzdF92cW1vdm5kX3M2NChpbnQ2NF90IGEpIHsKKyAgcmV0dXJuIHZxbW92bmRfczY0KGEpOworLy8gQ0hFQ0s6IHNxeHRuIHt7c1swLTldK319LCB7e2RbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cW1vdm5kX3U2NAordWludDMyX3QgdGVzdF92cW1vdm5kX3U2NCh1aW50NjRfdCBhKSB7CisgIHJldHVybiB2cW1vdm5kX3U2NChhKTsKKy8vIENIRUNLOiB1cXh0biB7e3NbMC05XSt9fSwge3tkWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFtb3Z1bmhfczE2CitpbnQ4X3QgdGVzdF92cW1vdnVuaF9zMTYoaW50MTZfdCBhKSB7CisgIHJldHVybiB2cW1vdnVuaF9zMTYoYSk7CisvLyBDSEVDSzogc3F4dHVuLjhiIHt7dlswLTldK319LCB7e3ZbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cW1vdnVuc19zMzIKK2ludDE2X3QgdGVzdF92cW1vdnVuc19zMzIoaW50MzJfdCBhKSB7CisgIHJldHVybiB2cW1vdnVuc19zMzIoYSk7CisvLyBDSEVDSzogc3F4dHVuLjRoIHt7dlswLTldK319LCB7e3ZbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cW1vdnVuZF9zNjQKK2ludDMyX3QgdGVzdF92cW1vdnVuZF9zNjQoaW50NjRfdCBhKSB7CisgIHJldHVybiB2cW1vdnVuZF9zNjQoYSk7CisvLyBDSEVDSzogc3F4dHVuIHt7c1swLTldK319LCB7e2RbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cWFic2JfczgKK2ludDhfdCB0ZXN0X3ZxYWJzYl9zOChpbnQ4X3QgYSkgeworICByZXR1cm4gdnFhYnNiX3M4KGEpOworLy8gQ0hFQ0s6IHNxYWJzLjhiIHt7dlswLTldK319LCB7e3ZbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cWFic2hfczE2CitpbnQxNl90IHRlc3RfdnFhYnNoX3MxNihpbnQxNl90IGEpIHsKKyAgcmV0dXJuIHZxYWJzaF9zMTYoYSk7CisvLyBDSEVDSzogc3FhYnMuNGgge3t2WzAtOV0rfX0sIHt7dlswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxYWJzc19zMzIKK2ludDMyX3QgdGVzdF92cWFic3NfczMyKGludDMyX3QgYSkgeworICByZXR1cm4gdnFhYnNzX3MzMihhKTsKKy8vIENIRUNLOiBzcWFicyB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFhYnNkX3M2NAoraW50NjRfdCB0ZXN0X3ZxYWJzZF9zNjQoaW50NjRfdCBhKSB7CisgIHJldHVybiB2cWFic2RfczY0KGEpOworLy8gQ0hFQ0s6IHNxYWJzIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cW5lZ2JfczgKK2ludDhfdCB0ZXN0X3ZxbmVnYl9zOChpbnQ4X3QgYSkgeworICByZXR1cm4gdnFuZWdiX3M4KGEpOworLy8gQ0hFQ0s6IHNxbmVnLjhiIHt7dlswLTldK319LCB7e3ZbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92cW5lZ2hfczE2CitpbnQxNl90IHRlc3RfdnFuZWdoX3MxNihpbnQxNl90IGEpIHsKKyAgcmV0dXJuIHZxbmVnaF9zMTYoYSk7CisvLyBDSEVDSzogc3FuZWcuNGgge3t2WzAtOV0rfX0sIHt7dlswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZxbmVnc19zMzIKK2ludDMyX3QgdGVzdF92cW5lZ3NfczMyKGludDMyX3QgYSkgeworICByZXR1cm4gdnFuZWdzX3MzMihhKTsKKy8vIENIRUNLOiBzcW5lZyB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdnFuZWdkX3M2NAoraW50NjRfdCB0ZXN0X3ZxbmVnZF9zNjQoaW50NjRfdCBhKSB7CisgIHJldHVybiB2cW5lZ2RfczY0KGEpOworLy8gQ0hFQ0s6IHNxbmVnIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92Y3Z0c19uX2YzMl9zMzIKK2Zsb2F0MzJfdCB0ZXN0X3ZjdnRzX25fZjMyX3MzMihpbnQzMl90IGEpIHsKKyAgcmV0dXJuIHZjdnRzX25fZjMyX3MzMihhLCAzKTsKKy8vIENIRUNLOiBzY3Z0ZiB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sICMzCit9CisKKy8vIENIRUNLOiB0ZXN0X3ZjdnRzX25fZjMyX3UzMgorZmxvYXQzMl90IHRlc3RfdmN2dHNfbl9mMzJfdTMyKHVpbnQzMl90IGEpIHsKKyAgcmV0dXJuIHZjdnRzX25fZjMyX3UzMihhLCAzKTsKKy8vIENIRUNLOiB1Y3Z0ZiB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sICMzCit9CisKKy8vIENIRUNLOiB0ZXN0X3ZjdnRkX25fZjY0X3M2NAorZmxvYXQ2NF90IHRlc3RfdmN2dGRfbl9mNjRfczY0KGludDY0X3QgYSkgeworICByZXR1cm4gdmN2dGRfbl9mNjRfczY0KGEsIDMpOworLy8gQ0hFQ0s6IHNjdnRmIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzMKK30KKworLy8gQ0hFQ0s6IHRlc3RfdmN2dGRfbl9mNjRfdTY0CitmbG9hdDY0X3QgdGVzdF92Y3Z0ZF9uX2Y2NF91NjQodWludDY0X3QgYSkgeworICByZXR1cm4gdmN2dGRfbl9mNjRfdTY0KGEsIDMpOworLy8gQ0hFQ0s6IHVjdnRmIHt7ZFswLTldK319LCB7e2RbMC05XSt9fSwgIzMKK30KKworLy8gQ0hFQ0s6IHRlc3RfdmN2dHNfbl9zMzJfZjMyCitpbnQzMl90IHRlc3RfdmN2dHNfbl9zMzJfZjMyKGZsb2F0MzJfdCBhKSB7CisgIHJldHVybiB2Y3Z0c19uX3MzMl9mMzIoYSwgMyk7CisvLyBDSEVDSzogZmN2dHpzIHt7c1swLTldK319LCB7e3NbMC05XSt9fSwgIzMKK30KKworLy8gQ0hFQ0s6IHRlc3RfdmN2dHNfbl91MzJfZjMyCit1aW50MzJfdCB0ZXN0X3ZjdnRzX25fdTMyX2YzMihmbG9hdDMyX3QgYSkgeworICByZXR1cm4gdmN2dHNfbl91MzJfZjMyKGEsIDMpOworLy8gQ0hFQ0s6IGZjdnR6dSB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0sICMzCit9CisKKy8vIENIRUNLOiB0ZXN0X3ZjdnRkX25fczY0X2Y2NAoraW50NjRfdCB0ZXN0X3ZjdnRkX25fczY0X2Y2NChmbG9hdDY0X3QgYSkgeworICByZXR1cm4gdmN2dGRfbl9zNjRfZjY0KGEsIDMpOworLy8gQ0hFQ0s6IGZjdnR6cyB7e2RbMC05XSt9fSwge3tkWzAtOV0rfX0sICMzCit9CisKKy8vIENIRUNLOiB0ZXN0X3ZjdnRkX25fdTY0X2Y2NAordWludDY0X3QgdGVzdF92Y3Z0ZF9uX3U2NF9mNjQoZmxvYXQ2NF90IGEpIHsKKyAgcmV0dXJuIHZjdnRkX25fdTY0X2Y2NChhLCAzKTsKKy8vIENIRUNLOiBmY3Z0enUge3tkWzAtOV0rfX0sIHt7ZFswLTldK319LCAjMworfQorCisvLyBDSEVDSzogdGVzdF92Y3Z0YXNfczMyX2YzMgoraW50MzJfdCB0ZXN0X3ZjdnRhc19zMzJfZjMyKGZsb2F0MzJfdCBhKSB7CisgIHJldHVybiB2Y3Z0YXNfczMyX2YzMihhKTsKKy8vIENIRUNLOiBmY3Z0YXMge3t3WzAtOV0rfX0sIHt7c1swLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZjdnRhc191MzJfZjMyCit1aW50MzJfdCB0ZXN0X3ZjdnRhc191MzJfZjMyKGZsb2F0MzJfdCBhKSB7CisgIHJldHVybiB2Y3Z0YXNfdTMyX2YzMihhKTsKKy8vIENIRUNLOiBmY3Z0YXUge3t3WzAtOV0rfX0sIHt7c1swLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZjdnRhZF9zNjRfZjY0CitpbnQ2NF90IHRlc3RfdmN2dGFkX3M2NF9mNjQoZmxvYXQ2NF90IGEpIHsKKyAgcmV0dXJuIHZjdnRhZF9zNjRfZjY0KGEpOworLy8gQ0hFQ0s6IGZjdnRhcyB7e3hbMC05XSt9fSwge3tkWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdmN2dGFkX3U2NF9mNjQKK3VpbnQ2NF90IHRlc3RfdmN2dGFkX3U2NF9mNjQoZmxvYXQ2NF90IGEpIHsKKyAgcmV0dXJuIHZjdnRhZF91NjRfZjY0KGEpOworLy8gQ0hFQ0s6IGZjdnRhdSB7e3hbMC05XSt9fSwge3tkWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdmN2dG1zX3MzMl9mMzIKK2ludDMyX3QgdGVzdF92Y3Z0bXNfczMyX2YzMihmbG9hdDMyX3QgYSkgeworICByZXR1cm4gdmN2dG1zX3MzMl9mMzIoYSk7CisvLyBDSEVDSzogZmN2dG1zIHt7d1swLTldK319LCB7e3NbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92Y3Z0bXNfdTMyX2YzMgordWludDMyX3QgdGVzdF92Y3Z0bXNfdTMyX2YzMihmbG9hdDMyX3QgYSkgeworICByZXR1cm4gdmN2dG1zX3UzMl9mMzIoYSk7CisvLyBDSEVDSzogZmN2dG11IHt7d1swLTldK319LCB7e3NbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92Y3Z0bWRfczY0X2Y2NAoraW50NjRfdCB0ZXN0X3ZjdnRtZF9zNjRfZjY0KGZsb2F0NjRfdCBhKSB7CisgIHJldHVybiB2Y3Z0bWRfczY0X2Y2NChhKTsKKy8vIENIRUNLOiBmY3Z0bXMge3t4WzAtOV0rfX0sIHt7ZFswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZjdnRtZF91NjRfZjY0Cit1aW50NjRfdCB0ZXN0X3ZjdnRtZF91NjRfZjY0KGZsb2F0NjRfdCBhKSB7CisgIHJldHVybiB2Y3Z0bWRfdTY0X2Y2NChhKTsKKy8vIENIRUNLOiBmY3Z0bXUge3t4WzAtOV0rfX0sIHt7ZFswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZjdnRuc19zMzJfZjMyCitpbnQzMl90IHRlc3RfdmN2dG5zX3MzMl9mMzIoZmxvYXQzMl90IGEpIHsKKyAgcmV0dXJuIHZjdnRuc19zMzJfZjMyKGEpOworLy8gQ0hFQ0s6IGZjdnRucyB7e3dbMC05XSt9fSwge3tzWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdmN2dG5zX3UzMl9mMzIKK3VpbnQzMl90IHRlc3RfdmN2dG5zX3UzMl9mMzIoZmxvYXQzMl90IGEpIHsKKyAgcmV0dXJuIHZjdnRuc191MzJfZjMyKGEpOworLy8gQ0hFQ0s6IGZjdnRudSB7e3dbMC05XSt9fSwge3tzWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdmN2dG5kX3M2NF9mNjQKK2ludDY0X3QgdGVzdF92Y3Z0bmRfczY0X2Y2NChmbG9hdDY0X3QgYSkgeworICByZXR1cm4gdmN2dG5kX3M2NF9mNjQoYSk7CisvLyBDSEVDSzogZmN2dG5zIHt7eFswLTldK319LCB7e2RbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92Y3Z0bmRfdTY0X2Y2NAordWludDY0X3QgdGVzdF92Y3Z0bmRfdTY0X2Y2NChmbG9hdDY0X3QgYSkgeworICByZXR1cm4gdmN2dG5kX3U2NF9mNjQoYSk7CisvLyBDSEVDSzogZmN2dG51IHt7eFswLTldK319LCB7e2RbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92Y3Z0cHNfczMyX2YzMgoraW50MzJfdCB0ZXN0X3ZjdnRwc19zMzJfZjMyKGZsb2F0MzJfdCBhKSB7CisgIHJldHVybiB2Y3Z0cHNfczMyX2YzMihhKTsKKy8vIENIRUNLOiBmY3Z0cHMge3t3WzAtOV0rfX0sIHt7c1swLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZjdnRwc191MzJfZjMyCit1aW50MzJfdCB0ZXN0X3ZjdnRwc191MzJfZjMyKGZsb2F0MzJfdCBhKSB7CisgIHJldHVybiB2Y3Z0cHNfdTMyX2YzMihhKTsKKy8vIENIRUNLOiBmY3Z0cHUge3t3WzAtOV0rfX0sIHt7c1swLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZjdnRwZF9zNjRfZjY0CitpbnQ2NF90IHRlc3RfdmN2dHBkX3M2NF9mNjQoZmxvYXQ2NF90IGEpIHsKKyAgcmV0dXJuIHZjdnRwZF9zNjRfZjY0KGEpOworLy8gQ0hFQ0s6IGZjdnRwcyB7e3hbMC05XSt9fSwge3tkWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdmN2dHBkX3U2NF9mNjQKK3VpbnQ2NF90IHRlc3RfdmN2dHBkX3U2NF9mNjQoZmxvYXQ2NF90IGEpIHsKKyAgcmV0dXJuIHZjdnRwZF91NjRfZjY0KGEpOworLy8gQ0hFQ0s6IGZjdnRwdSB7e3hbMC05XSt9fSwge3tkWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdmN2dHhkX2YzMl9mNjQKK2Zsb2F0MzJfdCB0ZXN0X3ZjdnR4ZF9mMzJfZjY0KGZsb2F0NjRfdCBhKSB7CisgIHJldHVybiB2Y3Z0eGRfZjMyX2Y2NChhKTsKKy8vIENIRUNLOiBmY3Z0eG4ge3tzWzAtOV0rfX0sIHt7ZFswLTldK319Cit9CisKKy8vIENIRUNLOiB0ZXN0X3ZhYmRzX2YzMgorZmxvYXQzMl90IHRlc3RfdmFiZHNfZjMyKGZsb2F0MzJfdCBhLCBmbG9hdDMyX3QgYikgeworICByZXR1cm4gdmFiZHNfZjMyKGEsIGIpOworICAvLyBDSEVDSzogZmFiZCB7e3NbMC05XSt9fSwge3tzWzAtOV0rfX0KK30KKworLy8gQ0hFQ0s6IHRlc3RfdmFiZGRfZjY0CitmbG9hdDY0X3QgdGVzdF92YWJkZF9mNjQoZmxvYXQ2NF90IGEsIGZsb2F0NjRfdCBiKSB7CisgIHJldHVybiB2YWJkZF9mNjQoYSwgYik7CisgIC8vIENIRUNLOiBmYWJkIHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92bXVseHNfZjMyCitmbG9hdDMyX3QgdGVzdF92bXVseHNfZjMyKGZsb2F0MzJfdCBhLCBmbG9hdDMyX3QgYikgeworICByZXR1cm4gdm11bHhzX2YzMihhLCBiKTsKKyAgLy8gQ0hFQ0s6IGZtdWx4IHt7c1swLTldK319LCB7e3NbMC05XSt9fQorfQorCisvLyBDSEVDSzogdGVzdF92bXVseGRfZjY0CitmbG9hdDY0X3QgdGVzdF92bXVseGRfZjY0KGZsb2F0NjRfdCBhLCBmbG9hdDY0X3QgYikgeworICByZXR1cm4gdm11bHhkX2Y2NChhLCBiKTsKKyAgLy8gQ0hFQ0s6IGZtdWx4IHt7ZFswLTldK319LCB7e2RbMC05XSt9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0LXZybmQuYyBiL3Rlc3QvQ29kZUdlbi9hcm02NC12cm5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlMmVjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NC12cm5kLmMKQEAgLTAsMCArMSw1MSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zNyAtZmZyZWVzdGFuZGluZyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK2ludDMyeDJfdCBybmQxKGZsb2F0MzJ4Ml90IGEpIHsgcmV0dXJuIHZybmRfZjMyKGEpOyB9CisvLyBDSEVDSzogY2FsbCA8MiB4IGZsb2F0PiBAbGx2bS50cnVuYy52MmYzMig8MiB4IGZsb2F0PgoraW50MzJ4NF90IHJuZDMoZmxvYXQzMng0X3QgYSkgeyByZXR1cm4gdnJuZHFfZjMyKGEpOyB9CisvLyBDSEVDSzogY2FsbCA8NCB4IGZsb2F0PiBAbGx2bS50cnVuYy52NGYzMig8NCB4IGZsb2F0PgoraW50NjR4Ml90IHJuZDUoZmxvYXQ2NHgyX3QgYSkgeyByZXR1cm4gdnJuZHFfZjY0KGEpOyB9CisvLyBDSEVDSzogY2FsbCA8MiB4IGRvdWJsZT4gQGxsdm0udHJ1bmMudjJmNjQoPDIgeCBkb3VibGU+CisKKworaW50MzJ4Ml90IHJuZDcoZmxvYXQzMngyX3QgYSkgeyByZXR1cm4gdnJuZG5fZjMyKGEpOyB9CisvLyBDSEVDSzogY2FsbCA8MiB4IGZsb2F0PiBAbGx2bS5hcm02NC5uZW9uLmZyaW50bi52MmYzMig8MiB4IGZsb2F0PgoraW50MzJ4NF90IHJuZDgoZmxvYXQzMng0X3QgYSkgeyByZXR1cm4gdnJuZG5xX2YzMihhKTsgfQorLy8gQ0hFQ0s6IGNhbGwgPDQgeCBmbG9hdD4gQGxsdm0uYXJtNjQubmVvbi5mcmludG4udjRmMzIoPDQgeCBmbG9hdD4KK2ludDY0eDJfdCBybmQ5KGZsb2F0NjR4Ml90IGEpIHsgcmV0dXJuIHZybmRucV9mNjQoYSk7IH0KKy8vIENIRUNLOiBjYWxsIDwyIHggZG91YmxlPiBAbGx2bS5hcm02NC5uZW9uLmZyaW50bi52MmY2NCg8MiB4IGRvdWJsZT4KK2ludDY0eDJfdCBybmQxMChmbG9hdDY0eDJfdCBhKSB7IHJldHVybiB2cm5kbnFfZjY0KGEpOyB9CisvLyBDSEVDSzogY2FsbCA8MiB4IGRvdWJsZT4gQGxsdm0uYXJtNjQubmVvbi5mcmludG4udjJmNjQoPDIgeCBkb3VibGU+CisKK2ludDMyeDJfdCBybmQxMShmbG9hdDMyeDJfdCBhKSB7IHJldHVybiB2cm5kbV9mMzIoYSk7IH0KKy8vIENIRUNLOiBjYWxsIDwyIHggZmxvYXQ+IEBsbHZtLmZsb29yLnYyZjMyKDwyIHggZmxvYXQ+CitpbnQzMng0X3Qgcm5kMTIoZmxvYXQzMng0X3QgYSkgeyByZXR1cm4gdnJuZG1xX2YzMihhKTsgfQorLy8gQ0hFQ0s6IGNhbGwgPDQgeCBmbG9hdD4gQGxsdm0uZmxvb3IudjRmMzIoPDQgeCBmbG9hdD4KK2ludDY0eDJfdCBybmQxMyhmbG9hdDY0eDJfdCBhKSB7IHJldHVybiB2cm5kbXFfZjY0KGEpOyB9CisvLyBDSEVDSzogY2FsbCA8MiB4IGRvdWJsZT4gQGxsdm0uZmxvb3IudjJmNjQoPDIgeCBkb3VibGU+CitpbnQ2NHgyX3Qgcm5kMTQoZmxvYXQ2NHgyX3QgYSkgeyByZXR1cm4gdnJuZG1xX2Y2NChhKTsgfQorLy8gQ0hFQ0s6IGNhbGwgPDIgeCBkb3VibGU+IEBsbHZtLmZsb29yLnYyZjY0KDwyIHggZG91YmxlPgorCitpbnQzMngyX3Qgcm5kMTUoZmxvYXQzMngyX3QgYSkgeyByZXR1cm4gdnJuZHBfZjMyKGEpOyB9CisvLyBDSEVDSzogY2FsbCA8MiB4IGZsb2F0PiBAbGx2bS5jZWlsLnYyZjMyKDwyIHggZmxvYXQ+CitpbnQzMng0X3Qgcm5kMTYoZmxvYXQzMng0X3QgYSkgeyByZXR1cm4gdnJuZHBxX2YzMihhKTsgfQorLy8gQ0hFQ0s6IGNhbGwgPDQgeCBmbG9hdD4gQGxsdm0uY2VpbC52NGYzMig8NCB4IGZsb2F0PgoraW50NjR4Ml90IHJuZDE4KGZsb2F0NjR4Ml90IGEpIHsgcmV0dXJuIHZybmRwcV9mNjQoYSk7IH0KKy8vIENIRUNLOiBjYWxsIDwyIHggZG91YmxlPiBAbGx2bS5jZWlsLnYyZjY0KDwyIHggZG91YmxlPgorCitpbnQzMngyX3Qgcm5kMTkoZmxvYXQzMngyX3QgYSkgeyByZXR1cm4gdnJuZGFfZjMyKGEpOyB9CisvLyBDSEVDSzogY2FsbCA8MiB4IGZsb2F0PiBAbGx2bS5yb3VuZC52MmYzMig8MiB4IGZsb2F0PgoraW50MzJ4NF90IHJuZDIwKGZsb2F0MzJ4NF90IGEpIHsgcmV0dXJuIHZybmRhcV9mMzIoYSk7IH0KKy8vIENIRUNLOiBjYWxsIDw0IHggZmxvYXQ+IEBsbHZtLnJvdW5kLnY0ZjMyKDw0IHggZmxvYXQ+CitpbnQ2NHgyX3Qgcm5kMjIoZmxvYXQ2NHgyX3QgYSkgeyByZXR1cm4gdnJuZGFxX2Y2NChhKTsgfQorLy8gQ0hFQ0s6IGNhbGwgPDIgeCBkb3VibGU+IEBsbHZtLnJvdW5kLnYyZjY0KDwyIHggZG91YmxlPgorCitpbnQzMngyX3Qgcm5kMjMoZmxvYXQzMngyX3QgYSkgeyByZXR1cm4gdnJuZHhfZjMyKGEpOyB9CisvLyBDSEVDSzogY2FsbCA8MiB4IGZsb2F0PiBAbGx2bS5yaW50LnYyZjMyKDwyIHggZmxvYXQ+CitpbnQzMng0X3Qgcm5kMjQoZmxvYXQzMng0X3QgYSkgeyByZXR1cm4gdnJuZHhxX2YzMihhKTsgfQorLy8gQ0hFQ0s6IGNhbGwgPDQgeCBmbG9hdD4gQGxsdm0ucmludC52NGYzMig8NCB4IGZsb2F0PgoraW50NjR4Ml90IHJuZDI1KGZsb2F0NjR4Ml90IGEpIHsgcmV0dXJuIHZybmR4cV9mNjQoYSk7IH0KKy8vIENIRUNLOiBjYWxsIDwyIHggZG91YmxlPiBAbGx2bS5yaW50LnYyZjY0KDwyIHggZG91YmxlPgorCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYXJtNjQtdnJzcXJ0LmMgYi90ZXN0L0NvZGVHZW4vYXJtNjQtdnJzcXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhNTM2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NC12cnNxcnQuYwpAQCAtMCwwICsxLDQzIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1hcHBsZS1pb3M3LjAgLWZmcmVlc3RhbmRpbmcgLWVtaXQtbGx2bSAtTzEgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKwordWludDMyeDJfdCB0ZXN0X3Zyc3FydGVfdTMyKHVpbnQzMngyX3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc3FydGVfdTMyCisgIC8vIENIRUNLOiBjYWxsIDwyIHggaTMyPiBAbGx2bS5hcm02NC5uZW9uLnVyc3FydGUudjJpMzIoPDIgeCBpMzI+ICVpbikKKyAgcmV0dXJuIHZyc3FydGVfdTMyKGluKTsKK30KKworZmxvYXQzMngyX3QgdGVzdF92cnNxcnRlX2YzMihmbG9hdDMyeDJfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzcXJ0ZV9mMzIKKyAgLy8gQ0hFQ0s6IGNhbGwgPDIgeCBmbG9hdD4gQGxsdm0uYXJtNjQubmVvbi5mcnNxcnRlLnYyZjMyKDwyIHggZmxvYXQ+ICVpbikKKyAgcmV0dXJuIHZyc3FydGVfZjMyKGluKTsKK30KKworCit1aW50MzJ4NF90IHRlc3RfdnJzcXJ0ZXFfdTMyKHVpbnQzMng0X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc3FydGVxX3UzMgorICAvLyBDSEVDSzogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtNjQubmVvbi51cnNxcnRlLnY0aTMyKDw0IHggaTMyPiAlaW4pCisgIHJldHVybiB2cnNxcnRlcV91MzIoaW4pOworfQorCitmbG9hdDMyeDRfdCB0ZXN0X3Zyc3FydGVxX2YzMihmbG9hdDMyeDRfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzcXJ0ZXFfZjMyCisgIC8vIENIRUNLOiBjYWxsIDw0IHggZmxvYXQ+IEBsbHZtLmFybTY0Lm5lb24uZnJzcXJ0ZS52NGYzMig8NCB4IGZsb2F0PiAlaW4pCisgIHJldHVybiB2cnNxcnRlcV9mMzIoaW4pOworfQorCisKK2Zsb2F0MzJ4Ml90IHRlc3RfdnJzcXJ0c19mMzIoZmxvYXQzMngyX3QgZXN0LCBmbG9hdDMyeDJfdCB2YWwpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc3FydHNfZjMyCisgIC8vIENIRUNLOiBjYWxsIDwyIHggZmxvYXQ+IEBsbHZtLmFybTY0Lm5lb24uZnJzcXJ0cy52MmYzMig8MiB4IGZsb2F0PiAlZXN0LCA8MiB4IGZsb2F0PiAldmFsKQorICByZXR1cm4gdnJzcXJ0c19mMzIoZXN0LCB2YWwpOworfQorCisKK2Zsb2F0MzJ4NF90IHRlc3RfdnJzcXJ0c3FfZjMyKGZsb2F0MzJ4NF90IGVzdCwgZmxvYXQzMng0X3QgdmFsKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNxcnRzcV9mMzIKKyAgLy8gQ0hFQ0s6IGNhbGwgPDQgeCBmbG9hdD4gQGxsdm0uYXJtNjQubmVvbi5mcnNxcnRzLnY0ZjMyKDw0IHggZmxvYXQ+ICVlc3QsIDw0IHggZmxvYXQ+ICV2YWwpCisgIHJldHVybiB2cnNxcnRzcV9mMzIoZXN0LCB2YWwpOworfQorCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYXJtNjRfY3J5cHRvLmMgYi90ZXN0L0NvZGVHZW4vYXJtNjRfY3J5cHRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1MGM1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NF9jcnlwdG8uYwpAQCAtMCwwICsxLDkzIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1hcHBsZS1pb3M3LjAgLWZmcmVlc3RhbmRpbmcgLU9zIC1TIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJFUVVJUkVTOiBhcm02NC1yZWdpc3RlcmVkLXRhcmdldAorCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKwordWludDh4MTZfdCB0ZXN0X2Flc2UodWludDh4MTZfdCBkYXRhLCB1aW50OHgxNl90IGtleSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF9hZXNlOgorICAvLyBDSEVDSzogYWVzZS4xNmIgdjAsIHYxCisgIHJldHVybiB2YWVzZXFfdTgoZGF0YSwga2V5KTsKK30KKwordWludDh4MTZfdCB0ZXN0X2Flc2QodWludDh4MTZfdCBkYXRhLCB1aW50OHgxNl90IGtleSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF9hZXNkOgorICAvLyBDSEVDSzogYWVzZC4xNmIgdjAsIHYxCisgIHJldHVybiB2YWVzZHFfdTgoZGF0YSwga2V5KTsKK30KKwordWludDh4MTZfdCB0ZXN0X2Flc21jKHVpbnQ4eDE2X3QgZGF0YSwgdWludDh4MTZfdCBrZXkpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfYWVzbWM6CisgIC8vIENIRUNLOiBhZXNtYy4xNmIgdjAsIHYwCisgIHJldHVybiB2YWVzbWNxX3U4KGRhdGEpOworfQorCit1aW50OHgxNl90IHRlc3RfYWVzaW1jKHVpbnQ4eDE2X3QgZGF0YSwgdWludDh4MTZfdCBrZXkpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfYWVzaW1jOgorICAvLyBDSEVDSzogYWVzaW1jLjE2YiB2MCwgdjAKKyAgcmV0dXJuIHZhZXNpbWNxX3U4KGRhdGEpOworfQorCit1aW50MzJ4NF90IHRlc3Rfc2hhMWModWludDMyeDRfdCBoYXNoX2FiY2QsIHVpbnQzMl90IGhhc2hfZSwgdWludDMyeDRfdCB3aykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF9zaGExYzoKKyAgLy8gQ0hFQ0s6IGZtb3YgW1tIQVNIX0U6c1swLTldK11dLCB3MAorICAvLyBDSEVDSzogc2hhMWMuNHMgcTAsIFtbSEFTSF9FXV0sIHYxCisgIHJldHVybiB2c2hhMWNxX3UzMihoYXNoX2FiY2QsIGhhc2hfZSwgd2spOworfQorCit1aW50MzJ4NF90IHRlc3Rfc2hhMXAodWludDMyeDRfdCBoYXNoX2FiY2QsIHVpbnQzMl90IGhhc2hfZSwgdWludDMyeDRfdCB3aykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF9zaGExcDoKKyAgLy8gQ0hFQ0s6IGZtb3YgW1tIQVNIX0U6c1swLTldK11dLCB3MAorICAvLyBDSEVDSzogc2hhMXAuNHMgcTAsIFtbSEFTSF9FXV0sIHYxCisgIHJldHVybiB2c2hhMXBxX3UzMihoYXNoX2FiY2QsIGhhc2hfZSwgd2spOworfQorCit1aW50MzJ4NF90IHRlc3Rfc2hhMW0odWludDMyeDRfdCBoYXNoX2FiY2QsIHVpbnQzMl90IGhhc2hfZSwgdWludDMyeDRfdCB3aykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF9zaGExbToKKyAgLy8gQ0hFQ0s6IGZtb3YgW1tIQVNIX0U6c1swLTldK11dLCB3MAorICAvLyBDSEVDSzogc2hhMW0uNHMgcTAsIFtbSEFTSF9FXV0sIHYxCisgIHJldHVybiB2c2hhMW1xX3UzMihoYXNoX2FiY2QsIGhhc2hfZSwgd2spOworfQorCit1aW50MzJfdCB0ZXN0X3NoYTFoKHVpbnQzMl90IGhhc2hfZSkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF9zaGExaDoKKyAgLy8gQ0hFQ0s6IGZtb3YgW1tIQVNIX0U6c1swLTldK11dLCB3MAorICAvLyBDSEVDSzogc2hhMWggW1tSRVM6c1swLTldK11dLCBbW0hBU0hfRV1dCisgIC8vIENIRUNLOiBmbW92IHcwLCBbW1JFU11dCisgIHJldHVybiB2c2hhMWhfdTMyKGhhc2hfZSk7Cit9CisKK3VpbnQzMng0X3QgdGVzdF9zaGExc3UwKHVpbnQzMng0X3Qgd2swXzMsIHVpbnQzMng0X3Qgd2s0XzcsIHVpbnQzMng0X3Qgd2s4XzExKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3NoYTFzdTA6CisgIC8vIENIRUNLOiBzaGExc3UwLjRzIHYwLCB2MSwgdjIKKyAgcmV0dXJuIHZzaGExc3UwcV91MzIod2swXzMsIHdrNF83LCB3azhfMTEpOworfQorCit1aW50MzJ4NF90IHRlc3Rfc2hhMXN1MSh1aW50MzJ4NF90IHdrMF8zLCB1aW50MzJ4NF90IHdrMTJfMTUpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfc2hhMXN1MToKKyAgLy8gQ0hFQ0s6IHNoYTFzdTEuNHMgdjAsIHYxCisgIHJldHVybiB2c2hhMXN1MXFfdTMyKHdrMF8zLCB3azEyXzE1KTsKK30KKwordWludDMyeDRfdCB0ZXN0X3NoYTI1NmgodWludDMyeDRfdCBoYXNoX2FiY2QsIHVpbnQzMng0X3QgaGFzaF9lZmdoLCB1aW50MzJ4NF90IHdrKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3NoYTI1Nmg6CisgIC8vIENIRUNLOiBzaGEyNTZoLjRzIHEwLCBxMSwgdjIKKyAgcmV0dXJuIHZzaGEyNTZocV91MzIoaGFzaF9hYmNkLCBoYXNoX2VmZ2gsIHdrKTsKK30KKwordWludDMyeDRfdCB0ZXN0X3NoYTI1NmgyKHVpbnQzMng0X3QgaGFzaF9lZmdoLCB1aW50MzJ4NF90IGhhc2hfYWJjZCwgdWludDMyeDRfdCB3aykgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF9zaGEyNTZoMjoKKyAgLy8gQ0hFQ0s6IHNoYTI1NmgyLjRzIHEwLCBxMSwgdjIKKyAgcmV0dXJuIHZzaGEyNTZoMnFfdTMyKGhhc2hfZWZnaCwgaGFzaF9hYmNkLCB3ayk7Cit9CisKK3VpbnQzMng0X3QgdGVzdF9zaGEyNTZzdTAodWludDMyeDRfdCB3MF8zLCB1aW50MzJ4NF90IHc0XzcpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfc2hhMjU2c3UwOgorICAvLyBDSEVDSzogc2hhMjU2c3UwLjRzIHYwLCB2MQorICByZXR1cm4gdnNoYTI1NnN1MHFfdTMyKHcwXzMsIHc0XzcpOworfQorCit1aW50MzJ4NF90IHRlc3Rfc2hhMjU2c3UxKHVpbnQzMng0X3QgdzBfMywgdWludDMyeDRfdCB3OF8xMSwgdWludDMyeDRfdCB3MTJfMTUpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3Rfc2hhMjU2c3UxOgorICAvLyBDSEVDSzogc2hhMjU2c3UxLjRzIHYwLCB2MSwgdjIKKyAgcmV0dXJuIHZzaGEyNTZzdTFxX3UzMih3MF8zLCB3OF8xMSwgdzEyXzE1KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm02NF9uZW9uX2hpZ2hfaGFsZi5jIGIvdGVzdC9Db2RlR2VuL2FybTY0X25lb25faGlnaF9oYWxmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwZGRlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NF9uZW9uX2hpZ2hfaGFsZi5jCkBAIC0wLDAgKzEsNTU5IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1hcHBsZS1pb3M3LjAgLWZmcmVlc3RhbmRpbmcgLU9zIC1TIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJFUVVJUkVTOiBhcm02NC1yZWdpc3RlcmVkLXRhcmdldAorCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworaW50MTZ4OF90IHRlc3RfdmFkZHdfaGlnaF9zOChpbnQxNng4X3QgbGhzLCBpbnQ4eDE2X3QgcmhzKSB7CisgIC8vIENIRUNLOiBzYWRkdzIuOGgKKyAgcmV0dXJuIHZhZGR3X2hpZ2hfczgobGhzLCByaHMpOworfQorCitpbnQzMng0X3QgdGVzdF92YWRkd19oaWdoX3MxNihpbnQzMng0X3QgbGhzLCBpbnQxNng4X3QgcmhzKSB7CisgIC8vIENIRUNLOiBzYWRkdzIuNHMKKyAgcmV0dXJuIHZhZGR3X2hpZ2hfczE2KGxocywgcmhzKTsKK30KKworaW50NjR4Ml90IHRlc3RfdmFkZHdfaGlnaF9zMzIoaW50NjR4Ml90IGxocywgaW50MzJ4NF90IHJocykgeworICAvLyBDSEVDSzogc2FkZHcyLjJkCisgIHJldHVybiB2YWRkd19oaWdoX3MzMihsaHMsIHJocyk7Cit9CisKK3VpbnQxNng4X3QgdGVzdF92YWRkd19oaWdoX3U4KHVpbnQxNng4X3QgbGhzLCB1aW50OHgxNl90IHJocykgeworICAvLyBDSEVDSzogdWFkZHcyLjhoCisgIHJldHVybiB2YWRkd19oaWdoX3U4KGxocywgcmhzKTsKK30KKwordWludDMyeDRfdCB0ZXN0X3ZhZGR3X2hpZ2hfdTE2KHVpbnQzMng0X3QgbGhzLCB1aW50MTZ4OF90IHJocykgeworICAvLyBDSEVDSzogdWFkZHcyLjRzCisgIHJldHVybiB2YWRkd19oaWdoX3UxNihsaHMsIHJocyk7Cit9CisKK3VpbnQ2NHgyX3QgdGVzdF92YWRkd19oaWdoX3UzMih1aW50NjR4Ml90IGxocywgdWludDMyeDRfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHVhZGR3Mi4yZAorICByZXR1cm4gdmFkZHdfaGlnaF91MzIobGhzLCByaHMpOworfQorCitpbnQxNng4X3QgdGVzdF92c3Vid19oaWdoX3M4KGludDE2eDhfdCBsaHMsIGludDh4MTZfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHNzdWJ3Mi44aAorICByZXR1cm4gdnN1YndfaGlnaF9zOChsaHMsIHJocyk7Cit9CisKK2ludDMyeDRfdCB0ZXN0X3ZzdWJ3X2hpZ2hfczE2KGludDMyeDRfdCBsaHMsIGludDE2eDhfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHNzdWJ3Mi40cworICByZXR1cm4gdnN1YndfaGlnaF9zMTYobGhzLCByaHMpOworfQorCitpbnQ2NHgyX3QgdGVzdF92c3Vid19oaWdoX3MzMihpbnQ2NHgyX3QgbGhzLCBpbnQzMng0X3QgcmhzKSB7CisgIC8vIENIRUNLOiBzc3VidzIuMmQKKyAgcmV0dXJuIHZzdWJ3X2hpZ2hfczMyKGxocywgcmhzKTsKK30KKwordWludDE2eDhfdCB0ZXN0X3ZzdWJ3X2hpZ2hfdTgodWludDE2eDhfdCBsaHMsIHVpbnQ4eDE2X3QgcmhzKSB7CisgIC8vIENIRUNLOiB1c3VidzIuOGgKKyAgcmV0dXJuIHZzdWJ3X2hpZ2hfdTgobGhzLCByaHMpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnN1YndfaGlnaF91MTYodWludDMyeDRfdCBsaHMsIHVpbnQxNng4X3QgcmhzKSB7CisgIC8vIENIRUNLOiB1c3VidzIuNHMKKyAgcmV0dXJuIHZzdWJ3X2hpZ2hfdTE2KGxocywgcmhzKTsKK30KKwordWludDY0eDJfdCB0ZXN0X3ZzdWJ3X2hpZ2hfdTMyKHVpbnQ2NHgyX3QgbGhzLCB1aW50MzJ4NF90IHJocykgeworICAvLyBDSEVDSzogdXN1YncyLjJkCisgIHJldHVybiB2c3Vid19oaWdoX3UzMihsaHMsIHJocyk7Cit9CisKK2ludDE2eDhfdCB0ZXN0X3ZhYmRsX2hpZ2hfczgoaW50OHgxNl90IGxocywgaW50OHgxNl90IHJocykgeworICAvLyBDSEVDSzogc2FiZGwyLjhoCisgIHJldHVybiB2YWJkbF9oaWdoX3M4KGxocywgcmhzKTsKK30KKworaW50MzJ4NF90IHRlc3RfdmFiZGxfaGlnaF9zMTYoaW50MTZ4OF90IGxocywgaW50MTZ4OF90IHJocykgeworICAvLyBDSEVDSzogc2FiZGwyLjRzCisgIHJldHVybiB2YWJkbF9oaWdoX3MxNihsaHMsIHJocyk7Cit9CisKK2ludDY0eDJfdCB0ZXN0X3ZhYmRsX2hpZ2hfczMyKGludDMyeDRfdCBsaHMsIGludDMyeDRfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHNhYmRsMi4yZAorICByZXR1cm4gdmFiZGxfaGlnaF9zMzIobGhzLCByaHMpOworfQorCit1aW50MTZ4OF90IHRlc3RfdmFiZGxfaGlnaF91OCh1aW50OHgxNl90IGxocywgdWludDh4MTZfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHVhYmRsMi44aAorICByZXR1cm4gdmFiZGxfaGlnaF91OChsaHMsIHJocyk7Cit9CisKK3VpbnQzMng0X3QgdGVzdF92YWJkbF9oaWdoX3UxNih1aW50MTZ4OF90IGxocywgdWludDE2eDhfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHVhYmRsMi40cworICByZXR1cm4gdmFiZGxfaGlnaF91MTYobGhzLCByaHMpOworfQorCit1aW50NjR4Ml90IHRlc3RfdmFiZGxfaGlnaF91MzIodWludDMyeDRfdCBsaHMsIHVpbnQzMng0X3QgcmhzKSB7CisgIC8vIENIRUNLOiB1YWJkbDIuMmQKKyAgcmV0dXJuIHZhYmRsX2hpZ2hfdTMyKGxocywgcmhzKTsKK30KKworaW50MTZ4OF90IHRlc3RfdmFiYWxfaGlnaF9zOChpbnQxNng4X3QgYWNjdW0sIGludDh4MTZfdCBsaHMsIGludDh4MTZfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHNhYmFsMi44aAorICByZXR1cm4gdmFiYWxfaGlnaF9zOChhY2N1bSwgbGhzLCByaHMpOworfQorCitpbnQzMng0X3QgdGVzdF92YWJhbF9oaWdoX3MxNihpbnQzMng0X3QgYWNjdW0sIGludDE2eDhfdCBsaHMsIGludDE2eDhfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHNhYmFsMi40cworICByZXR1cm4gdmFiYWxfaGlnaF9zMTYoYWNjdW0sIGxocywgcmhzKTsKK30KKworaW50NjR4Ml90IHRlc3RfdmFiYWxfaGlnaF9zMzIoaW50NjR4Ml90IGFjY3VtLCBpbnQzMng0X3QgbGhzLCBpbnQzMng0X3QgcmhzKSB7CisgIC8vIENIRUNLOiBzYWJhbDIuMmQKKyAgcmV0dXJuIHZhYmFsX2hpZ2hfczMyKGFjY3VtLCBsaHMsIHJocyk7Cit9CisKK3VpbnQxNng4X3QgdGVzdF92YWJhbF9oaWdoX3U4KHVpbnQxNng4X3QgYWNjdW0sIHVpbnQ4eDE2X3QgbGhzLCB1aW50OHgxNl90IHJocykgeworICAvLyBDSEVDSzogdWFiYWwyLjhoCisgIHJldHVybiB2YWJhbF9oaWdoX3U4KGFjY3VtLCBsaHMsIHJocyk7Cit9CisKK3VpbnQzMng0X3QgdGVzdF92YWJhbF9oaWdoX3UxNih1aW50MzJ4NF90IGFjY3VtLCB1aW50MTZ4OF90IGxocywgdWludDE2eDhfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHVhYmFsMi40cworICByZXR1cm4gdmFiYWxfaGlnaF91MTYoYWNjdW0sIGxocywgcmhzKTsKK30KKwordWludDY0eDJfdCB0ZXN0X3ZhYmFsX2hpZ2hfdTMyKHVpbnQ2NHgyX3QgYWNjdW0sIHVpbnQzMng0X3QgbGhzLCB1aW50MzJ4NF90IHJocykgeworICAvLyBDSEVDSzogdWFiYWwyLjJkCisgIHJldHVybiB2YWJhbF9oaWdoX3UzMihhY2N1bSwgbGhzLCByaHMpOworfQorCitpbnQzMng0X3QgdGVzdF92cWRtbGFsX2hpZ2hfczE2KGludDMyeDRfdCBhY2N1bSwgaW50MTZ4OF90IGxocywgaW50MTZ4OF90IHJocykgeworICAvLyBDSEVDSzogc3FkbWxhbDIuNHMKKyAgcmV0dXJuIHZxZG1sYWxfaGlnaF9zMTYoYWNjdW0sIGxocywgcmhzKTsKK30KKworaW50NjR4Ml90IHRlc3RfdnFkbWxhbF9oaWdoX3MzMihpbnQ2NHgyX3QgYWNjdW0sIGludDMyeDRfdCBsaHMsIGludDMyeDRfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHNxZG1sYWwyLjJkCisgIHJldHVybiB2cWRtbGFsX2hpZ2hfczMyKGFjY3VtLCBsaHMsIHJocyk7Cit9CisKK2ludDMyeDRfdCB0ZXN0X3ZxZG1sc2xfaGlnaF9zMTYoaW50MzJ4NF90IGFjY3VtLCBpbnQxNng4X3QgbGhzLCBpbnQxNng4X3QgcmhzKSB7CisgIC8vIENIRUNLOiBzcWRtbHNsMi40cworICByZXR1cm4gdnFkbWxzbF9oaWdoX3MxNihhY2N1bSwgbGhzLCByaHMpOworfQorCitpbnQ2NHgyX3QgdGVzdF92cWRtbHNsX2hpZ2hfczMyKGludDY0eDJfdCBhY2N1bSwgaW50MzJ4NF90IGxocywgaW50MzJ4NF90IHJocykgeworICAvLyBDSEVDSzogc3FkbWxzbDIuMmQKKyAgcmV0dXJuIHZxZG1sc2xfaGlnaF9zMzIoYWNjdW0sIGxocywgcmhzKTsKK30KKworaW50MzJ4NF90IHRlc3RfdnFkbXVsbF9oaWdoX3MxNihpbnQxNng4X3QgbGhzLCBpbnQxNng4X3QgcmhzKSB7CisgIC8vIENIRUNLOiBzcWRtdWxsMi40cworICByZXR1cm4gdnFkbXVsbF9oaWdoX3MxNihsaHMsIHJocyk7Cit9CisKK2ludDY0eDJfdCB0ZXN0X3ZxZG11bGxfaGlnaF9zMzIoaW50MzJ4NF90IGxocywgaW50MzJ4NF90IHJocykgeworICAvLyBDSEVDSzogc3FkbXVsbDIuMmQKKyAgcmV0dXJuIHZxZG11bGxfaGlnaF9zMzIobGhzLCByaHMpOworfQorCitpbnQxNng4X3QgdGVzdF92c2hsbF9oaWdoX25fczgoaW50OHgxNl90IGluKSB7CisgIC8vIENIRUNLOiBzc2hsbDIuOGgKKyAgcmV0dXJuIHZzaGxsX2hpZ2hfbl9zOChpbiwgNyk7Cit9CisKK2ludDMyeDRfdCB0ZXN0X3ZzaGxsX2hpZ2hfbl9zMTYoaW50MTZ4OF90IGluKSB7CisgIC8vIENIRUNLOiBzc2hsbDIuNHMKKyAgcmV0dXJuIHZzaGxsX2hpZ2hfbl9zMTYoaW4sIDE1KTsKK30KKworaW50NjR4Ml90IHRlc3RfdnNobGxfaGlnaF9uX3MzMihpbnQzMng0X3QgaW4pIHsKKyAgLy8gQ0hFQ0s6IHNzaGxsMi4yZAorICByZXR1cm4gdnNobGxfaGlnaF9uX3MzMihpbiwgMzEpOworfQorCitpbnQxNng4X3QgdGVzdF92c2hsbF9oaWdoX25fdTgoaW50OHgxNl90IGluKSB7CisgIC8vIENIRUNLOiB1c2hsbDIuOGgKKyAgcmV0dXJuIHZzaGxsX2hpZ2hfbl91OChpbiwgNyk7Cit9CisKK2ludDMyeDRfdCB0ZXN0X3ZzaGxsX2hpZ2hfbl91MTYoaW50MTZ4OF90IGluKSB7CisgIC8vIENIRUNLOiB1c2hsbDIuNHMKKyAgcmV0dXJuIHZzaGxsX2hpZ2hfbl91MTYoaW4sIDE1KTsKK30KKworaW50NjR4Ml90IHRlc3RfdnNobGxfaGlnaF9uX3UzMihpbnQzMng0X3QgaW4pIHsKKyAgLy8gQ0hFQ0s6IHVzaGxsMi4yZAorICByZXR1cm4gdnNobGxfaGlnaF9uX3UzMihpbiwgMzEpOworfQorCitpbnQxNng4X3QgdGVzdF92c2hsbF9oaWdoX25fczhfbWF4KGludDh4MTZfdCBpbikgeworICAvLyBDSEVDSzogc2hsbDIuOGgKKyAgcmV0dXJuIHZzaGxsX2hpZ2hfbl9zOChpbiwgOCk7Cit9CisKK2ludDMyeDRfdCB0ZXN0X3ZzaGxsX2hpZ2hfbl9zMTZfbWF4KGludDE2eDhfdCBpbikgeworICAvLyBDSEVDSzogc2hsbDIuNHMKKyAgcmV0dXJuIHZzaGxsX2hpZ2hfbl9zMTYoaW4sIDE2KTsKK30KKworaW50NjR4Ml90IHRlc3RfdnNobGxfaGlnaF9uX3MzMl9tYXgoaW50MzJ4NF90IGluKSB7CisgIC8vIENIRUNLOiBzaGxsMi4yZAorICByZXR1cm4gdnNobGxfaGlnaF9uX3MzMihpbiwgMzIpOworfQorCitpbnQxNng4X3QgdGVzdF92c2hsbF9oaWdoX25fdThfbWF4KGludDh4MTZfdCBpbikgeworICAvLyBDSEVDSzogc2hsbDIuOGgKKyAgcmV0dXJuIHZzaGxsX2hpZ2hfbl91OChpbiwgOCk7Cit9CisKK2ludDMyeDRfdCB0ZXN0X3ZzaGxsX2hpZ2hfbl91MTZfbWF4KGludDE2eDhfdCBpbikgeworICAvLyBDSEVDSzogc2hsbDIuNHMKKyAgcmV0dXJuIHZzaGxsX2hpZ2hfbl91MTYoaW4sIDE2KTsKK30KKworaW50NjR4Ml90IHRlc3RfdnNobGxfaGlnaF9uX3UzMl9tYXgoaW50MzJ4NF90IGluKSB7CisgIC8vIENIRUNLOiBzaGxsMi4yZAorICByZXR1cm4gdnNobGxfaGlnaF9uX3UzMihpbiwgMzIpOworfQorCitpbnQxNng4X3QgdGVzdF92c3VibF9oaWdoX3M4KGludDh4MTZfdCBsaHMsIGludDh4MTZfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHNzdWJsMi44aAorICByZXR1cm4gdnN1YmxfaGlnaF9zOChsaHMsIHJocyk7Cit9CisKK2ludDMyeDRfdCB0ZXN0X3ZzdWJsX2hpZ2hfczE2KGludDE2eDhfdCBsaHMsIGludDE2eDhfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IHNzdWJsMi40cworICByZXR1cm4gdnN1YmxfaGlnaF9zMTYobGhzLCByaHMpOworfQorCitpbnQ2NHgyX3QgdGVzdF92c3VibF9oaWdoX3MzMihpbnQzMng0X3QgbGhzLCBpbnQzMng0X3QgcmhzKSB7CisgIC8vIENIRUNLOiBzc3VibDIuMmQKKyAgcmV0dXJuIHZzdWJsX2hpZ2hfczMyKGxocywgcmhzKTsKK30KKwordWludDE2eDhfdCB0ZXN0X3ZzdWJsX2hpZ2hfdTgodWludDh4MTZfdCBsaHMsIHVpbnQ4eDE2X3QgcmhzKSB7CisgIC8vIENIRUNLOiB1c3VibDIuOGgKKyAgcmV0dXJuIHZzdWJsX2hpZ2hfdTgobGhzLCByaHMpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnN1YmxfaGlnaF91MTYodWludDE2eDhfdCBsaHMsIHVpbnQxNng4X3QgcmhzKSB7CisgIC8vIENIRUNLOiB1c3VibDIuNHMKKyAgcmV0dXJuIHZzdWJsX2hpZ2hfdTE2KGxocywgcmhzKTsKK30KKwordWludDY0eDJfdCB0ZXN0X3ZzdWJsX2hpZ2hfdTMyKHVpbnQzMng0X3QgbGhzLCB1aW50MzJ4NF90IHJocykgeworICAvLyBDSEVDSzogdXN1YmwyLjJkCisgIHJldHVybiB2c3VibF9oaWdoX3UzMihsaHMsIHJocyk7Cit9CisKK2ludDh4MTZfdCB0ZXN0X3Zyc2hybl9oaWdoX25fczE2KGludDh4OF90IGxvd3BhcnQsIGludDE2eDhfdCBpbnB1dCkgeworICAvLyBDSEVDSzogcnNocm4yLjE2YgorICByZXR1cm4gdnJzaHJuX2hpZ2hfbl9zMTYobG93cGFydCwgaW5wdXQsIDIpOworfQorCitpbnQxNng4X3QgdGVzdF92cnNocm5faGlnaF9uX3MzMihpbnQxNng0X3QgbG93cGFydCwgaW50MzJ4NF90IGlucHV0KSB7CisgIC8vIENIRUNLOiByc2hybjIuOGgKKyAgcmV0dXJuIHZyc2hybl9oaWdoX25fczMyKGxvd3BhcnQsIGlucHV0LCAyKTsKK30KKworaW50MzJ4NF90IHRlc3RfdnJzaHJuX2hpZ2hfbl9zNjQoaW50MzJ4Ml90IGxvd3BhcnQsIGludDY0eDJfdCBpbnB1dCkgeworICAvLyBDSEVDSzogc2hybjIuNHMKKyAgcmV0dXJuIHZyc2hybl9oaWdoX25fczY0KGxvd3BhcnQsIGlucHV0LCAyKTsKK30KKwordWludDh4MTZfdCB0ZXN0X3Zyc2hybl9oaWdoX25fdTE2KHVpbnQ4eDhfdCBsb3dwYXJ0LCB1aW50MTZ4OF90IGlucHV0KSB7CisgIC8vIENIRUNLOiByc2hybjIuMTZiCisgIHJldHVybiB2cnNocm5faGlnaF9uX3UxNihsb3dwYXJ0LCBpbnB1dCwgMik7Cit9CisKK3VpbnQxNng4X3QgdGVzdF92cnNocm5faGlnaF9uX3UzMih1aW50MTZ4NF90IGxvd3BhcnQsIHVpbnQzMng0X3QgaW5wdXQpIHsKKyAgLy8gQ0hFQ0s6IHJzaHJuMi44aAorICByZXR1cm4gdnJzaHJuX2hpZ2hfbl91MzIobG93cGFydCwgaW5wdXQsIDIpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnJzaHJuX2hpZ2hfbl91NjQodWludDMyeDJfdCBsb3dwYXJ0LCB1aW50NjR4Ml90IGlucHV0KSB7CisgIC8vIENIRUNLOiByc2hybjIuNHMKKyAgcmV0dXJuIHZyc2hybl9oaWdoX25fdTY0KGxvd3BhcnQsIGlucHV0LCAyKTsKK30KKworaW50OHgxNl90IHRlc3RfdnNocm5faGlnaF9uX3MxNihpbnQ4eDhfdCBsb3dwYXJ0LCBpbnQxNng4X3QgaW5wdXQpIHsKKyAgLy8gQ0hFQ0s6IHNocm4yLjE2YgorICByZXR1cm4gdnNocm5faGlnaF9uX3MxNihsb3dwYXJ0LCBpbnB1dCwgMik7Cit9CisKK2ludDE2eDhfdCB0ZXN0X3ZzaHJuX2hpZ2hfbl9zMzIoaW50MTZ4NF90IGxvd3BhcnQsIGludDMyeDRfdCBpbnB1dCkgeworICAvLyBDSEVDSzogc2hybjIuOGgKKyAgcmV0dXJuIHZzaHJuX2hpZ2hfbl9zMzIobG93cGFydCwgaW5wdXQsIDIpOworfQorCitpbnQzMng0X3QgdGVzdF92c2hybl9oaWdoX25fczY0KGludDMyeDJfdCBsb3dwYXJ0LCBpbnQ2NHgyX3QgaW5wdXQpIHsKKyAgLy8gQ0hFQ0s6IHNocm4yLjRzCisgIHJldHVybiB2c2hybl9oaWdoX25fczY0KGxvd3BhcnQsIGlucHV0LCAyKTsKK30KKwordWludDh4MTZfdCB0ZXN0X3ZzaHJuX2hpZ2hfbl91MTYodWludDh4OF90IGxvd3BhcnQsIHVpbnQxNng4X3QgaW5wdXQpIHsKKyAgLy8gQ0hFQ0s6IHNocm4yLjE2YgorICByZXR1cm4gdnNocm5faGlnaF9uX3UxNihsb3dwYXJ0LCBpbnB1dCwgMik7Cit9CisKK3VpbnQxNng4X3QgdGVzdF92c2hybl9oaWdoX25fdTMyKHVpbnQxNng0X3QgbG93cGFydCwgdWludDMyeDRfdCBpbnB1dCkgeworICAvLyBDSEVDSzogc2hybjIuOGgKKyAgcmV0dXJuIHZzaHJuX2hpZ2hfbl91MzIobG93cGFydCwgaW5wdXQsIDIpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnNocm5faGlnaF9uX3U2NCh1aW50MzJ4Ml90IGxvd3BhcnQsIHVpbnQ2NHgyX3QgaW5wdXQpIHsKKyAgLy8gQ0hFQ0s6IHNocm4yLjRzCisgIHJldHVybiB2c2hybl9oaWdoX25fdTY0KGxvd3BhcnQsIGlucHV0LCAyKTsKK30KKwordWludDh4MTZfdCB0ZXN0X3Zxc2hydW5faGlnaF9uX3MxNih1aW50OHg4X3QgbG93cGFydCwgaW50MTZ4OF90IGlucHV0KSB7CisgIC8vIENIRUNLOiBzcXNocnVuMi4xNmIKKyAgcmV0dXJuIHZxc2hydW5faGlnaF9uX3MxNihsb3dwYXJ0LCBpbnB1dCwgMik7Cit9CisKK3VpbnQxNng4X3QgdGVzdF92cXNocnVuX2hpZ2hfbl9zMzIodWludDE2eDRfdCBsb3dwYXJ0LCBpbnQzMng0X3QgaW5wdXQpIHsKKyAgLy8gQ0hFQ0s6IHNxc2hydW4yLjhoCisgIHJldHVybiB2cXNocnVuX2hpZ2hfbl9zMzIobG93cGFydCwgaW5wdXQsIDIpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnFzaHJ1bl9oaWdoX25fczY0KHVpbnQzMngyX3QgbG93cGFydCwgaW50NjR4Ml90IGlucHV0KSB7CisgIC8vIENIRUNLOiBzcXNocnVuMi40cworICByZXR1cm4gdnFzaHJ1bl9oaWdoX25fczY0KGxvd3BhcnQsIGlucHV0LCAyKTsKK30KKwordWludDh4MTZfdCB0ZXN0X3ZxcnNocnVuX2hpZ2hfbl9zMTYodWludDh4OF90IGxvd3BhcnQsIGludDE2eDhfdCBpbnB1dCkgeworICAvLyBDSEVDSzogc3Fyc2hydW4yLjE2YgorICByZXR1cm4gdnFyc2hydW5faGlnaF9uX3MxNihsb3dwYXJ0LCBpbnB1dCwgMik7Cit9CisKK3VpbnQxNng4X3QgdGVzdF92cXJzaHJ1bl9oaWdoX25fczMyKHVpbnQxNng0X3QgbG93cGFydCwgaW50MzJ4NF90IGlucHV0KSB7CisgIC8vIENIRUNLOiBzcXJzaHJ1bjIuOGgKKyAgcmV0dXJuIHZxcnNocnVuX2hpZ2hfbl9zMzIobG93cGFydCwgaW5wdXQsIDIpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnFyc2hydW5faGlnaF9uX3M2NCh1aW50MzJ4Ml90IGxvd3BhcnQsIGludDY0eDJfdCBpbnB1dCkgeworICAvLyBDSEVDSzogc3Fyc2hydW4yLjRzCisgIHJldHVybiB2cXJzaHJ1bl9oaWdoX25fczY0KGxvd3BhcnQsIGlucHV0LCAyKTsKK30KKworaW50OHgxNl90IHRlc3RfdnFzaHJuX2hpZ2hfbl9zMTYoaW50OHg4X3QgbG93cGFydCwgaW50MTZ4OF90IGlucHV0KSB7CisgIC8vIENIRUNLOiBzcXNocm4yLjE2YgorICByZXR1cm4gdnFzaHJuX2hpZ2hfbl9zMTYobG93cGFydCwgaW5wdXQsIDIpOworfQorCitpbnQxNng4X3QgdGVzdF92cXNocm5faGlnaF9uX3MzMihpbnQxNng0X3QgbG93cGFydCwgaW50MzJ4NF90IGlucHV0KSB7CisgIC8vIENIRUNLOiBzcXNocm4yLjhoCisgIHJldHVybiB2cXNocm5faGlnaF9uX3MzMihsb3dwYXJ0LCBpbnB1dCwgMik7Cit9CisKK2ludDMyeDRfdCB0ZXN0X3Zxc2hybl9oaWdoX25fczY0KGludDMyeDJfdCBsb3dwYXJ0LCBpbnQ2NHgyX3QgaW5wdXQpIHsKKyAgLy8gQ0hFQ0s6IHNxc2hybjIuNHMKKyAgcmV0dXJuIHZxc2hybl9oaWdoX25fczY0KGxvd3BhcnQsIGlucHV0LCAyKTsKK30KKwordWludDh4MTZfdCB0ZXN0X3Zxc2hybl9oaWdoX25fdTE2KHVpbnQ4eDhfdCBsb3dwYXJ0LCB1aW50MTZ4OF90IGlucHV0KSB7CisgIC8vIENIRUNLOiB1cXNocm4yLjE2YgorICByZXR1cm4gdnFzaHJuX2hpZ2hfbl91MTYobG93cGFydCwgaW5wdXQsIDIpOworfQorCit1aW50MTZ4OF90IHRlc3RfdnFzaHJuX2hpZ2hfbl91MzIodWludDE2eDRfdCBsb3dwYXJ0LCB1aW50MzJ4NF90IGlucHV0KSB7CisgIC8vIENIRUNLOiB1cXNocm4yLjhoCisgIHJldHVybiB2cXNocm5faGlnaF9uX3UzMihsb3dwYXJ0LCBpbnB1dCwgMik7Cit9CisKK3VpbnQzMng0X3QgdGVzdF92cXNocm5faGlnaF9uX3U2NCh1aW50MzJ4Ml90IGxvd3BhcnQsIHVpbnQ2NHgyX3QgaW5wdXQpIHsKKyAgLy8gQ0hFQ0s6IHVxc2hybjIuNHMKKyAgcmV0dXJuIHZxc2hybl9oaWdoX25fdTY0KGxvd3BhcnQsIGlucHV0LCAyKTsKK30KKworaW50OHgxNl90IHRlc3RfdnFyc2hybl9oaWdoX25fczE2KGludDh4OF90IGxvd3BhcnQsIGludDE2eDhfdCBpbnB1dCkgeworICAvLyBDSEVDSzogc3Fyc2hybjIuMTZiCisgIHJldHVybiB2cXJzaHJuX2hpZ2hfbl9zMTYobG93cGFydCwgaW5wdXQsIDIpOworfQorCitpbnQxNng4X3QgdGVzdF92cXJzaHJuX2hpZ2hfbl9zMzIoaW50MTZ4NF90IGxvd3BhcnQsIGludDMyeDRfdCBpbnB1dCkgeworICAvLyBDSEVDSzogc3Fyc2hybjIuOGgKKyAgcmV0dXJuIHZxcnNocm5faGlnaF9uX3MzMihsb3dwYXJ0LCBpbnB1dCwgMik7Cit9CisKK2ludDMyeDRfdCB0ZXN0X3ZxcnNocm5faGlnaF9uX3M2NChpbnQzMngyX3QgbG93cGFydCwgaW50NjR4Ml90IGlucHV0KSB7CisgIC8vIENIRUNLOiBzcXJzaHJuMi40cworICByZXR1cm4gdnFyc2hybl9oaWdoX25fczY0KGxvd3BhcnQsIGlucHV0LCAyKTsKK30KKwordWludDh4MTZfdCB0ZXN0X3ZxcnNocm5faGlnaF9uX3UxNih1aW50OHg4X3QgbG93cGFydCwgdWludDE2eDhfdCBpbnB1dCkgeworICAvLyBDSEVDSzogdXFyc2hybjIuMTZiCisgIHJldHVybiB2cXJzaHJuX2hpZ2hfbl91MTYobG93cGFydCwgaW5wdXQsIDIpOworfQorCit1aW50MTZ4OF90IHRlc3RfdnFyc2hybl9oaWdoX25fdTMyKHVpbnQxNng0X3QgbG93cGFydCwgdWludDMyeDRfdCBpbnB1dCkgeworICAvLyBDSEVDSzogdXFyc2hybjIuOGgKKyAgcmV0dXJuIHZxcnNocm5faGlnaF9uX3UzMihsb3dwYXJ0LCBpbnB1dCwgMik7Cit9CisKK3VpbnQzMng0X3QgdGVzdF92cXJzaHJuX2hpZ2hfbl91NjQodWludDMyeDJfdCBsb3dwYXJ0LCB1aW50NjR4Ml90IGlucHV0KSB7CisgIC8vIENIRUNLOiB1cXJzaHJuMi40cworICByZXR1cm4gdnFyc2hybl9oaWdoX25fdTY0KGxvd3BhcnQsIGlucHV0LCAyKTsKK30KKworaW50OHgxNl90IHRlc3RfdmFkZGhuX2hpZ2hfczE2KGludDh4OF90IGxvd3BhcnQsIGludDE2eDhfdCBsaHMsIGludDE2eDhfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IGFkZGhuMi4xNmIgdjAsIHYxLCB2MgorICByZXR1cm4gdmFkZGhuX2hpZ2hfczE2KGxvd3BhcnQsIGxocywgcmhzKTsKK30KKworaW50MTZ4OF90IHRlc3RfdmFkZGhuX2hpZ2hfczMyKGludDE2eDRfdCBsb3dwYXJ0LCBpbnQzMng0X3QgbGhzLCBpbnQzMng0X3QgcmhzKSB7CisgIC8vIENIRUNLOiBhZGRobjIuOGggdjAsIHYxLCB2MgorICByZXR1cm4gdmFkZGhuX2hpZ2hfczMyKGxvd3BhcnQsIGxocywgcmhzKTsKK30KKworaW50MzJ4NF90IHRlc3RfdmFkZGhuX2hpZ2hfczY0KGludDMyeDJfdCBsb3dwYXJ0LCBpbnQ2NHgyX3QgbGhzLCBpbnQ2NHgyX3QgcmhzKSB7CisgIC8vIENIRUNLOiBhZGRobjIuNHMgdjAsIHYxLCB2MgorICByZXR1cm4gdmFkZGhuX2hpZ2hfczY0KGxvd3BhcnQsIGxocywgcmhzKTsKK30KKwordWludDh4MTZfdCB0ZXN0X3ZhZGRobl9oaWdoX3UxNih1aW50OHg4X3QgbG93cGFydCwgdWludDE2eDhfdCBsaHMsIHVpbnQxNng4X3QgcmhzKSB7CisgIC8vIENIRUNLOiBhZGRobjIuMTZiIHYwLCB2MSwgdjIKKyAgcmV0dXJuIHZhZGRobl9oaWdoX3MxNihsb3dwYXJ0LCBsaHMsIHJocyk7Cit9CisKK3VpbnQxNng4X3QgdGVzdF92YWRkaG5faGlnaF91MzIodWludDE2eDRfdCBsb3dwYXJ0LCB1aW50MzJ4NF90IGxocywgdWludDMyeDRfdCByaHMpIHsKKyAgLy8gQ0hFQ0s6IGFkZGhuMi44aCB2MCwgdjEsIHYyCisgIHJldHVybiB2YWRkaG5faGlnaF9zMzIobG93cGFydCwgbGhzLCByaHMpOworfQorCit1aW50MzJ4NF90IHRlc3RfdmFkZGhuX2hpZ2hfdTY0KHVpbnQzMngyX3QgbG93cGFydCwgdWludDY0eDJfdCBsaHMsIHVpbnQ2NHgyX3QgcmhzKSB7CisgIC8vIENIRUNLOiBhZGRobjIuNHMgdjAsIHYxLCB2MgorICByZXR1cm4gdmFkZGhuX2hpZ2hfczY0KGxvd3BhcnQsIGxocywgcmhzKTsKK30KKworaW50OHgxNl90IHRlc3RfdnJhZGRobl9oaWdoX3MxNihpbnQ4eDhfdCBsb3dwYXJ0LCBpbnQxNng4X3QgbGhzLCBpbnQxNng4X3QgcmhzKSB7CisgIC8vIENIRUNLOiByYWRkaG4yLjE2YiB2MCwgdjEsIHYyCisgIHJldHVybiB2cmFkZGhuX2hpZ2hfczE2KGxvd3BhcnQsIGxocywgcmhzKTsKK30KKworaW50MTZ4OF90IHRlc3RfdnJhZGRobl9oaWdoX3MzMihpbnQxNng0X3QgbG93cGFydCwgaW50MzJ4NF90IGxocywgaW50MzJ4NF90IHJocykgeworICAvLyBDSEVDSzogcmFkZGhuMi44aCB2MCwgdjEsIHYyCisgIHJldHVybiB2cmFkZGhuX2hpZ2hfczMyKGxvd3BhcnQsIGxocywgcmhzKTsKK30KKworaW50MzJ4NF90IHRlc3RfdnJhZGRobl9oaWdoX3M2NChpbnQzMngyX3QgbG93cGFydCwgaW50NjR4Ml90IGxocywgaW50NjR4Ml90IHJocykgeworICAvLyBDSEVDSzogcmFkZGhuMi40cyB2MCwgdjEsIHYyCisgIHJldHVybiB2cmFkZGhuX2hpZ2hfczY0KGxvd3BhcnQsIGxocywgcmhzKTsKK30KKwordWludDh4MTZfdCB0ZXN0X3ZyYWRkaG5faGlnaF91MTYodWludDh4OF90IGxvd3BhcnQsIHVpbnQxNng4X3QgbGhzLCB1aW50MTZ4OF90IHJocykgeworICAvLyBDSEVDSzogcmFkZGhuMi4xNmIgdjAsIHYxLCB2MgorICByZXR1cm4gdnJhZGRobl9oaWdoX3MxNihsb3dwYXJ0LCBsaHMsIHJocyk7Cit9CisKK3VpbnQxNng4X3QgdGVzdF92cmFkZGhuX2hpZ2hfdTMyKHVpbnQxNng0X3QgbG93cGFydCwgdWludDMyeDRfdCBsaHMsIHVpbnQzMng0X3QgcmhzKSB7CisgIC8vIENIRUNLOiByYWRkaG4yLjhoIHYwLCB2MSwgdjIKKyAgcmV0dXJuIHZyYWRkaG5faGlnaF9zMzIobG93cGFydCwgbGhzLCByaHMpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnJhZGRobl9oaWdoX3U2NCh1aW50MzJ4Ml90IGxvd3BhcnQsIHVpbnQ2NHgyX3QgbGhzLCB1aW50NjR4Ml90IHJocykgeworICAvLyBDSEVDSzogcmFkZGhuMi40cyB2MCwgdjEsIHYyCisgIHJldHVybiB2cmFkZGhuX2hpZ2hfczY0KGxvd3BhcnQsIGxocywgcmhzKTsKK30KKworaW50OHgxNl90IHRlc3Rfdm1vdm5faGlnaF9zMTYoaW50OHg4X3QgbG93cGFydCwgaW50MTZ4OF90IHdpZGUpIHsKKyAgLy8gQ0hFQ0s6IHh0bjIuMTZiIHYwLCB2MQorICByZXR1cm4gdm1vdm5faGlnaF9zMTYobG93cGFydCwgd2lkZSk7Cit9CisKK2ludDE2eDhfdCB0ZXN0X3Ztb3ZuX2hpZ2hfczMyKGludDE2eDRfdCBsb3dwYXJ0LCBpbnQzMng0X3Qgd2lkZSkgeworICAvLyBDSEVDSzogeHRuMi44aCB2MCwgdjEKKyAgcmV0dXJuIHZtb3ZuX2hpZ2hfczMyKGxvd3BhcnQsIHdpZGUpOworfQorCitpbnQzMng0X3QgdGVzdF92bW92bl9oaWdoX3M2NChpbnQzMngyX3QgbG93cGFydCwgaW50NjR4Ml90IHdpZGUpIHsKKyAgLy8gQ0hFQ0s6IHh0bjIuNHMgdjAsIHYxCisgIHJldHVybiB2bW92bl9oaWdoX3M2NChsb3dwYXJ0LCB3aWRlKTsKK30KKwordWludDh4MTZfdCB0ZXN0X3Ztb3ZuX2hpZ2hfdTE2KHVpbnQ4eDhfdCBsb3dwYXJ0LCB1aW50MTZ4OF90IHdpZGUpIHsKKyAgLy8gQ0hFQ0s6IHh0bjIuMTZiIHYwLCB2MQorICByZXR1cm4gdm1vdm5faGlnaF91MTYobG93cGFydCwgd2lkZSk7Cit9CisKK3VpbnQxNng4X3QgdGVzdF92bW92bl9oaWdoX3UzMih1aW50MTZ4NF90IGxvd3BhcnQsIHVpbnQzMng0X3Qgd2lkZSkgeworICAvLyBDSEVDSzogeHRuMi44aCB2MCwgdjEKKyAgcmV0dXJuIHZtb3ZuX2hpZ2hfdTMyKGxvd3BhcnQsIHdpZGUpOworfQorCit1aW50MzJ4NF90IHRlc3Rfdm1vdm5faGlnaF91NjQodWludDMyeDJfdCBsb3dwYXJ0LCB1aW50NjR4Ml90IHdpZGUpIHsKKyAgLy8gQ0hFQ0s6IHh0bjIuNHMgdjAsIHYxCisgIHJldHVybiB2bW92bl9oaWdoX3U2NChsb3dwYXJ0LCB3aWRlKTsKK30KKworaW50OHgxNl90IHRlc3RfdnFtb3ZuX2hpZ2hfczE2KGludDh4OF90IGxvd3BhcnQsIGludDE2eDhfdCB3aWRlKSB7CisgIC8vIENIRUNLOiBzcXh0bjIuMTZiIHYwLCB2MQorICByZXR1cm4gdnFtb3ZuX2hpZ2hfczE2KGxvd3BhcnQsIHdpZGUpOworfQorCitpbnQxNng4X3QgdGVzdF92cW1vdm5faGlnaF9zMzIoaW50MTZ4NF90IGxvd3BhcnQsIGludDMyeDRfdCB3aWRlKSB7CisgIC8vIENIRUNLOiBzcXh0bjIuOGggdjAsIHYxCisgIHJldHVybiB2cW1vdm5faGlnaF9zMzIobG93cGFydCwgd2lkZSk7Cit9CisKK2ludDMyeDRfdCB0ZXN0X3ZxbW92bl9oaWdoX3M2NChpbnQzMngyX3QgbG93cGFydCwgaW50NjR4Ml90IHdpZGUpIHsKKyAgLy8gQ0hFQ0s6IHNxeHRuMi40cyB2MCwgdjEKKyAgcmV0dXJuIHZxbW92bl9oaWdoX3M2NChsb3dwYXJ0LCB3aWRlKTsKK30KKwordWludDh4MTZfdCB0ZXN0X3ZxbW92bl9oaWdoX3UxNih1aW50OHg4X3QgbG93cGFydCwgaW50MTZ4OF90IHdpZGUpIHsKKyAgLy8gQ0hFQ0s6IHVxeHRuMi4xNmIgdjAsIHYxCisgIHJldHVybiB2cW1vdm5faGlnaF91MTYobG93cGFydCwgd2lkZSk7Cit9CisKK3VpbnQxNng4X3QgdGVzdF92cW1vdm5faGlnaF91MzIodWludDE2eDRfdCBsb3dwYXJ0LCBpbnQzMng0X3Qgd2lkZSkgeworICAvLyBDSEVDSzogdXF4dG4yLjhoIHYwLCB2MQorICByZXR1cm4gdnFtb3ZuX2hpZ2hfdTMyKGxvd3BhcnQsIHdpZGUpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnFtb3ZuX2hpZ2hfdTY0KHVpbnQzMngyX3QgbG93cGFydCwgaW50NjR4Ml90IHdpZGUpIHsKKyAgLy8gQ0hFQ0s6IHVxeHRuMi40cyB2MCwgdjEKKyAgcmV0dXJuIHZxbW92bl9oaWdoX3U2NChsb3dwYXJ0LCB3aWRlKTsKK30KKwordWludDh4MTZfdCB0ZXN0X3ZxbW92dW5faGlnaF9zMTYodWludDh4OF90IGxvd3BhcnQsIGludDE2eDhfdCB3aWRlKSB7CisgIC8vIENIRUNLOiBzcXh0dW4yLjE2YiB2MCwgdjEKKyAgcmV0dXJuIHZxbW92dW5faGlnaF9zMTYobG93cGFydCwgd2lkZSk7Cit9CisKK3VpbnQxNng4X3QgdGVzdF92cW1vdnVuX2hpZ2hfczMyKHVpbnQxNng0X3QgbG93cGFydCwgaW50MzJ4NF90IHdpZGUpIHsKKyAgLy8gQ0hFQ0s6IHNxeHR1bjIuOGggdjAsIHYxCisgIHJldHVybiB2cW1vdnVuX2hpZ2hfczMyKGxvd3BhcnQsIHdpZGUpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnFtb3Z1bl9oaWdoX3M2NCh1aW50MzJ4Ml90IGxvd3BhcnQsIGludDY0eDJfdCB3aWRlKSB7CisgIC8vIENIRUNLOiBzcXh0dW4yLjRzIHYwLCB2MQorICByZXR1cm4gdnFtb3Z1bl9oaWdoX3M2NChsb3dwYXJ0LCB3aWRlKTsKK30KKworZmxvYXQzMng0X3QgdGVzdF92Y3Z0eF9oaWdoX2YzMl9mNjQoZmxvYXQzMngyX3QgbG93cGFydCwgZmxvYXQ2NHgyX3Qgd2lkZSkgeworICAvLyBDSEVDSzogZmN2dHhuMiB2MC40cywgdjEuMmQKKyAgcmV0dXJuIHZjdnR4X2hpZ2hfZjMyX2Y2NChsb3dwYXJ0LCB3aWRlKTsKK30KKworZmxvYXQ2NHgyX3QgdGVzdF92Y3Z0X2Y2NF9mMzIoZmxvYXQzMngyX3QgeCkgeworICAvLyBDSEVDSzogZmN2dGwgdjAuMmQsIHYwLjJzCisgIHJldHVybiB2Y3Z0X2Y2NF9mMzIoeCk7Cit9CisKK2Zsb2F0NjR4Ml90IHRlc3RfdmN2dF9oaWdoX2Y2NF9mMzIoZmxvYXQzMng0X3QgeCkgeworICAvLyBDSEVDSzogZmN2dGwyIHYwLjJkLCB2MC40cworICByZXR1cm4gdmN2dF9oaWdoX2Y2NF9mMzIoeCk7Cit9CisKK2Zsb2F0MzJ4Ml90IHRlc3RfdmN2dF9mMzJfZjY0KGZsb2F0NjR4Ml90IHYpIHsKKyAgLy8gQ0hFQ0s6IGZjdnRuIHYwLjJzLCB2MC4yZAorICByZXR1cm4gdmN2dF9mMzJfZjY0KHYpOworfQorCitmbG9hdDMyeDRfdCB0ZXN0X3ZjdnRfaGlnaF9mMzJfZjY0KGZsb2F0MzJ4Ml90IHgsIGZsb2F0NjR4Ml90IHYpIHsKKyAgLy8gQ0hFQ0s6IGZjdnRuMiB2MC40cywgdjEuMmQKKyAgcmV0dXJuIHZjdnRfaGlnaF9mMzJfZjY0KHgsIHYpOworfQorCitmbG9hdDMyeDJfdCB0ZXN0X3ZjdnR4X2YzMl9mNjQoZmxvYXQ2NHgyX3QgdikgeworICAvLyBDSEVDSzogZmN2dHhuIHYwLjJzLCB2MC4yZAorICByZXR1cm4gdmN2dHhfZjMyX2Y2NCh2KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm02NF92Q01QLmMgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdkNNUC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjFkNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdkNNUC5jCkBAIC0wLDAgKzEsMTA4IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLU8xIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zNyAtZmZyZWVzdGFuZGluZyAtUyAtbyAtIC1lbWl0LWxsdm0gJXMgfCBGaWxlQ2hlY2sgJXMKKworLy8gVGVzdCBBUk02NCBTSU1EIGZ1c2VkIG11bHRpcGx5IGFkZCBpbnRyaW5zaWNzCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCitpbnQ2NHgyX3QgdGVzdF92YWJzcV9zNjQoaW50NjR4Ml90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZhYnNxX3M2NAorICByZXR1cm4gdmFic3FfczY0KGExKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5hYnMudjJpNjQKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2ludDY0X3QgdGVzdF92Y2VxZF9zNjQoaW50NjRfdCBhMSwgaW50NjRfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92Y2VxZF9zNjQKKyAgcmV0dXJuIHZjZXFkX3M2NChhMSwgYTIpOworICAvLyBDSEVDSzogW1tCSVQ6JVswLTlhLXpBLVouXStdXSA9IGljbXAgZXEgaTY0ICVhMSwgJWEyCisgIC8vIENIRUNLOiBzZXh0IGkxIFtbQklUXV0gdG8gaTY0Cit9CisKK2ludDY0X3QgdGVzdF92Y2VxZF9mNjQoZmxvYXQ2NF90IGExLCBmbG9hdDY0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNlcWRfZjY0CisgIHJldHVybiB2Y2VxZF9mNjQoYTEsIGEyKTsKKyAgLy8gQ0hFQ0s6IFtbQklUOiVbMC05YS16QS1aLl0rXV0gPSBmY21wIG9lcSBkb3VibGUgJWExLCAlYTIKKyAgLy8gQ0hFQ0s6IHNleHQgaTEgW1tCSVRdXSB0byBpNjQKK30KKwordWludDY0X3QgdGVzdF92Y2d0ZF91NjQodWludDY0X3QgYTEsIHVpbnQ2NF90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZjZ3RkX3U2NAorICByZXR1cm4gdmNndGRfdTY0KGExLCBhMik7CisgIC8vIENIRUNLOiBbW0JJVDolWzAtOWEtekEtWi5dK11dID0gaWNtcCB1Z3QgaTY0ICVhMSwgJWEyCisgIC8vIENIRUNLOiBzZXh0IGkxIFtbQklUXV0gdG8gaTY0Cit9CisKK3VpbnQ2NF90IHRlc3RfdmNsZWRfdTY0KHVpbnQ2NF90IGExLCB1aW50NjRfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92Y2xlZF91NjQKKyAgcmV0dXJuIHZjbGVkX3U2NChhMSwgYTIpOworICAvLyBDSEVDSzogW1tCSVQ6JVswLTlhLXpBLVouXStdXSA9IGljbXAgdWxlIGk2NCAlYTEsICVhMgorICAvLyBDSEVDSzogc2V4dCBpMSBbW0JJVF1dIHRvIGk2NAorfQorCitpbnQ2NF90IHRlc3RfdmNlcXpkX3M2NChpbnQ2NF90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZjZXF6ZF9zNjQKKyAgcmV0dXJuIHZjZXF6ZF9zNjQoYTEpOworICAvLyBDSEVDSzogW1tCSVQ6JVswLTlhLXpBLVouXStdXSA9IGljbXAgZXEgaTY0ICVhMSwgMAorICAvLyBDSEVDSzogc2V4dCBpMSBbW0JJVF1dIHRvIGk2NAorfQorCit1aW50NjR4Ml90IHRlc3RfdmNlcXFfdTY0KHVpbnQ2NHgyX3QgYTEsIHVpbnQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNlcXFfdTY0CisgIHJldHVybiB2Y2VxcV91NjQoYTEsIGEyKTsKKyAgLy8gQ0hFQ0s6ICBpY21wIGVxIDwyIHggaTY0PiAlYTEsICVhMgorfQorCit1aW50NjR4Ml90IHRlc3RfdmNnZXFfczY0KGludDY0eDJfdCBhMSwgaW50NjR4Ml90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZjZ2VxX3M2NAorICByZXR1cm4gdmNnZXFfczY0KGExLCBhMik7CisgIC8vIENIRUNLOiAgaWNtcCBzZ2UgPDIgeCBpNjQ+ICVhMSwgJWEyCit9CisKK3VpbnQ2NHgyX3QgdGVzdF92Y2dlcV91NjQodWludDY0eDJfdCBhMSwgdWludDY0eDJfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92Y2dlcV91NjQKKyAgcmV0dXJuIHZjZ2VxX3U2NChhMSwgYTIpOworICAvLyBDSEVDSzogIGljbXAgdWdlIDwyIHggaTY0PiAlYTEsICVhMgorfQorCit1aW50NjR4Ml90IHRlc3RfdmNndHFfczY0KGludDY0eDJfdCBhMSwgaW50NjR4Ml90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZjZ3RxX3M2NAorICByZXR1cm4gdmNndHFfczY0KGExLCBhMik7CisgIC8vIENIRUNLOiBpY21wIHNndCA8MiB4IGk2ND4gJWExLCAlYTIKK30KKwordWludDY0eDJfdCB0ZXN0X3ZjZ3RxX3U2NCh1aW50NjR4Ml90IGExLCB1aW50NjR4Ml90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZjZ3RxX3U2NAorICByZXR1cm4gdmNndHFfdTY0KGExLCBhMik7CisgIC8vIENIRUNLOiBpY21wIHVndCA8MiB4IGk2ND4gJWExLCAlYTIKK30KKwordWludDY0eDJfdCB0ZXN0X3ZjbGVxX3M2NChpbnQ2NHgyX3QgYTEsIGludDY0eDJfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92Y2xlcV9zNjQKKyAgcmV0dXJuIHZjbGVxX3M2NChhMSwgYTIpOworICAvLyBDSEVDSzogaWNtcCBzbGUgPDIgeCBpNjQ+ICVhMSwgJWEyCit9CisKK3VpbnQ2NHgyX3QgdGVzdF92Y2xlcV91NjQodWludDY0eDJfdCBhMSwgdWludDY0eDJfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92Y2xlcV91NjQKKyAgcmV0dXJuIHZjbGVxX3U2NChhMSwgYTIpOworICAvLyBDSEVDSzogaWNtcCB1bGUgPDIgeCBpNjQ+ICVhMSwgJWEyCit9CisKK3VpbnQ2NHgyX3QgdGVzdF92Y2x0cV9zNjQoaW50NjR4Ml90IGExLCBpbnQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNsdHFfczY0CisgIHJldHVybiB2Y2x0cV9zNjQoYTEsIGEyKTsKKyAgLy8gQ0hFQ0s6IGljbXAgc2x0IDwyIHggaTY0PiAlYTEsICVhMgorfQorCit1aW50NjR4Ml90IHRlc3RfdmNsdHFfdTY0KHVpbnQ2NHgyX3QgYTEsIHVpbnQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNsdHFfdTY0CisgIHJldHVybiB2Y2x0cV91NjQoYTEsIGEyKTsKKyAgLy8gQ0hFQ0s6IGljbXAgdWx0IDwyIHggaTY0PiAlYTEsICVhMgorfQorCitpbnQ2NHgyX3QgdGVzdF92cWFic3FfczY0KGludDY0eDJfdCBhMSkgeworICAvLyBDSEVDSzogdGVzdF92cWFic3FfczY0CisgIHJldHVybiB2cWFic3FfczY0KGExKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5zcWFicy52Mmk2NCg8MiB4IGk2ND4gJWExKQorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm02NF92TGRTdE51bV9sYW5lLmMgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdkxkU3ROdW1fbGFuZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNmNkODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdkxkU3ROdW1fbGFuZS5jCkBAIC0wLDAgKzEsMTQxIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLU8xIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zNyAtZmZyZWVzdGFuZGluZyAtUyAtbyAtIC1lbWl0LWxsdm0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFRlc3QgQVJNNjQgU0lNRCBsb2FkIGFuZCBzdG9yZXMgb2YgYW4gTi1lbGVtZW50IHN0cnVjdHVyZSAgaW50cmluc2ljcworCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworaW50NjR4MngyX3QgdGVzdF92bGQycV9sYW5lX3M2NChjb25zdCB2b2lkICogYTEsIGludDY0eDJ4Ml90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZsZDJxX2xhbmVfczY0CisgIHJldHVybiB2bGQycV9sYW5lX3M2NChhMSwgYTIsIDEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmxkMmxhbmUudjJpNjQucDBpOAorfQorCit1aW50NjR4MngyX3QgdGVzdF92bGQycV9sYW5lX3U2NChjb25zdCB2b2lkICogYTEsIHVpbnQ2NHgyeDJfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92bGQycV9sYW5lX3U2NAorICByZXR1cm4gdmxkMnFfbGFuZV91NjQoYTEsIGEyLCAxKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5sZDJsYW5lLnYyaTY0LnAwaTgKK30KKworaW50NjR4MXgyX3QgdGVzdF92bGQyX2xhbmVfczY0KGNvbnN0IHZvaWQgKiBhMSwgaW50NjR4MXgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmxkMl9sYW5lX3M2NAorICByZXR1cm4gdmxkMl9sYW5lX3M2NChhMSwgYTIsIDApOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmxkMmxhbmUudjFpNjQucDBpOAorfQorCit1aW50NjR4MXgyX3QgdGVzdF92bGQyX2xhbmVfdTY0KGNvbnN0IHZvaWQgKiBhMSwgdWludDY0eDF4Ml90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZsZDJfbGFuZV91NjQKKyAgcmV0dXJuIHZsZDJfbGFuZV91NjQoYTEsIGEyLCAwKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5sZDJsYW5lLnYxaTY0LnAwaTgKK30KKworcG9seTh4MTZ4Ml90IHRlc3RfdmxkMnFfbGFuZV9wOChjb25zdCB2b2lkICogYTEsIHBvbHk4eDE2eDJfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92bGQycV9sYW5lX3A4CisgIHJldHVybiB2bGQycV9sYW5lX3A4KGExLCBhMiwgMCk7CisgIC8vIENIRUNLOiBleHRyYWN0dmFsdWUge3suKn19IDB7eyAqJH19CisgIC8vIENIRUNLOiBleHRyYWN0dmFsdWUge3suKn19IDF7eyAqJH19Cit9CisKK3VpbnQ4eDE2eDJfdCB0ZXN0X3ZsZDJxX2xhbmVfdTgoY29uc3Qgdm9pZCAqIGExLCB1aW50OHgxNngyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmxkMnFfbGFuZV91OAorICByZXR1cm4gdmxkMnFfbGFuZV91OChhMSwgYTIsIDApOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmxkMmxhbmUudjE2aTgucDBpOAorfQorCitpbnQ2NHgyeDNfdCB0ZXN0X3ZsZDNxX2xhbmVfczY0KGNvbnN0IHZvaWQgKiBhMSwgaW50NjR4MngzX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmxkM3FfbGFuZV9zNjQKKyAgcmV0dXJuIHZsZDNxX2xhbmVfczY0KGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24ubGQzbGFuZS52Mmk2NC5wMGk4Cit9CisKK3VpbnQ2NHgyeDNfdCB0ZXN0X3ZsZDNxX2xhbmVfdTY0KGNvbnN0IHZvaWQgKiBhMSwgdWludDY0eDJ4M190IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZsZDNxX2xhbmVfdTY0CisgIHJldHVybiB2bGQzcV9sYW5lX3U2NChhMSwgYTIsIDEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmxkM2xhbmUudjJpNjQucDBpOAorfQorCitpbnQ2NHgxeDNfdCB0ZXN0X3ZsZDNfbGFuZV9zNjQoY29uc3Qgdm9pZCAqIGExLCBpbnQ2NHgxeDNfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92bGQzX2xhbmVfczY0CisgIHJldHVybiB2bGQzX2xhbmVfczY0KGExLCBhMiwgMCk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24ubGQzbGFuZS52MWk2NC5wMGk4Cit9CisKK3VpbnQ2NHgxeDNfdCB0ZXN0X3ZsZDNfbGFuZV91NjQoY29uc3Qgdm9pZCAqIGExLCB1aW50NjR4MXgzX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmxkM19sYW5lX3U2NAorICByZXR1cm4gdmxkM19sYW5lX3U2NChhMSwgYTIsIDApOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmxkM2xhbmUudjFpNjQucDBpOAorfQorCitpbnQ4eDh4M190IHRlc3RfdmxkM19sYW5lX3M4KGNvbnN0IHZvaWQgKiBhMSwgaW50OHg4eDNfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92bGQzX2xhbmVfczgKKyAgcmV0dXJuIHZsZDNfbGFuZV9zOChhMSwgYTIsIDApOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmxkM2xhbmUudjhpOC5wMGk4Cit9CisKK3BvbHk4eDE2eDNfdCB0ZXN0X3ZsZDNxX2xhbmVfcDgoY29uc3Qgdm9pZCAqIGExLCBwb2x5OHgxNngzX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmxkM3FfbGFuZV9wOAorICByZXR1cm4gdmxkM3FfbGFuZV9wOChhMSwgYTIsIDApOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmxkM2xhbmUudjE2aTgucDBpOAorfQorCit1aW50OHgxNngzX3QgdGVzdF92bGQzcV9sYW5lX3U4KGNvbnN0IHZvaWQgKiBhMSwgdWludDh4MTZ4M190IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZsZDNxX2xhbmVfdTgKKyAgcmV0dXJuIHZsZDNxX2xhbmVfdTgoYTEsIGEyLCAwKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5sZDNsYW5lLnYxNmk4LnAwaTgKK30KKworaW50NjR4Mng0X3QgdGVzdF92bGQ0cV9sYW5lX3M2NChjb25zdCB2b2lkICogYTEsIGludDY0eDJ4NF90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZsZDRxX2xhbmVfczY0CisgIHJldHVybiB2bGQ0cV9sYW5lX3M2NChhMSwgYTIsIDApOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmxkNGxhbmUudjJpNjQucDBpOAorfQorCit1aW50NjR4Mng0X3QgdGVzdF92bGQ0cV9sYW5lX3U2NChjb25zdCB2b2lkICogYTEsIHVpbnQ2NHgyeDRfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92bGQ0cV9sYW5lX3U2NAorICByZXR1cm4gdmxkNHFfbGFuZV91NjQoYTEsIGEyLCAwKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5sZDRsYW5lLnYyaTY0LnAwaTgKK30KKworaW50NjR4MXg0X3QgdGVzdF92bGQ0X2xhbmVfczY0KGNvbnN0IHZvaWQgKiBhMSwgaW50NjR4MXg0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmxkNF9sYW5lX3M2NAorICByZXR1cm4gdmxkNF9sYW5lX3M2NChhMSwgYTIsIDApOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmxkNGxhbmUudjFpNjQucDBpOAorfQorCit1aW50NjR4MXg0X3QgdGVzdF92bGQ0X2xhbmVfdTY0KGNvbnN0IHZvaWQgKiBhMSwgdWludDY0eDF4NF90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZsZDRfbGFuZV91NjQKKyAgcmV0dXJuIHZsZDRfbGFuZV91NjQoYTEsIGEyLCAwKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5sZDRsYW5lLnYxaTY0LnAwaTgKK30KKworaW50OHg4eDRfdCB0ZXN0X3ZsZDRfbGFuZV9zOChjb25zdCB2b2lkICogYTEsIGludDh4OHg0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmxkNF9sYW5lX3M4CisgIHJldHVybiB2bGQ0X2xhbmVfczgoYTEsIGEyLCAwKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5sZDRsYW5lLnY4aTgucDBpOAorfQorCit1aW50OHg4eDRfdCB0ZXN0X3ZsZDRfbGFuZV91OChjb25zdCB2b2lkICogYTEsIHVpbnQ4eDh4NF90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZsZDRfbGFuZV91OAorICByZXR1cm4gdmxkNF9sYW5lX3U4KGExLCBhMiwgMCk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24ubGQ0bGFuZS52OGk4LnAwaTgKK30KKworcG9seTh4MTZ4NF90IHRlc3RfdmxkNHFfbGFuZV9wOChjb25zdCB2b2lkICogYTEsIHBvbHk4eDE2eDRfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92bGQ0cV9sYW5lX3A4CisgIHJldHVybiB2bGQ0cV9sYW5lX3A4KGExLCBhMiwgMCk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24ubGQ0bGFuZS52MTZpOC5wMGk4Cit9CisKK2ludDh4MTZ4NF90IHRlc3RfdmxkNHFfbGFuZV9zOChjb25zdCB2b2lkICogYTEsIGludDh4MTZ4NF90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZsZDRxX2xhbmVfczgKKyAgcmV0dXJuIHZsZDRxX2xhbmVfczgoYTEsIGEyLCAwKTsKKyAgLy8gQ0hFQ0s6IGV4dHJhY3R2YWx1ZSB7ey4qfX0gMHt7ICokfX0KKyAgLy8gQ0hFQ0s6IGV4dHJhY3R2YWx1ZSB7ey4qfX0gMXt7ICokfX0KKyAgLy8gQ0hFQ0s6IGV4dHJhY3R2YWx1ZSB7ey4qfX0gMnt7ICokfX0KKyAgLy8gQ0hFQ0s6IGV4dHJhY3R2YWx1ZSB7ey4qfX0gM3t7ICokfX0KK30KKwordWludDh4MTZ4NF90IHRlc3RfdmxkNHFfbGFuZV91OChjb25zdCB2b2lkICogYTEsIHVpbnQ4eDE2eDRfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92bGQ0cV9sYW5lX3U4CisgIHJldHVybiB2bGQ0cV9sYW5lX3U4KGExLCBhMiwgMCk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24ubGQ0bGFuZS52MTZpOC5wMGk4Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm02NF92TWF4TWluLmMgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdk1heE1pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1M2MwYmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdk1heE1pbi5jCkBAIC0wLDAgKzEsMjA3IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLU8xIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zNyAtZmZyZWVzdGFuZGluZyAtUyAtbyAtIC1lbWl0LWxsdm0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtTzEgLXRyaXBsZSBhcm02NC1hcHBsZS1pb3M3IC1mZnJlZXN0YW5kaW5nIC1TIC1vIC0gJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DT0RFR0VOICVzCisvLyBSRVFVSVJFUzogYXJtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFRlc3QgQVJNNjQgU0lNRCBtYXgvbWluIGludHJpbnNpY3MKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKKy8vIFRlc3QgYSByZXByZXNudGF0aXZlIHNhbXBsZSBvZiA4IGFuZCAxNiwgc2lnbmVkIGFuZCB1bnNpZ25lZCwgNjQgYW5kIDEyOCBiaXQgcmVkdWN0aW9uCitpbnQ4X3QgdGVzdF92bWF4dl9zOChpbnQ4eDhfdCBhMSkgeworICAvLyBDSEVDSzogdGVzdF92bWF4dl9zOAorICByZXR1cm4gdm1heHZfczgoYTEpOworICAvLyBDSEVDSyBAbGx2bS5hcm02NC5uZW9uLnNtYXh2LmkzMi52OGk4Cit9CisKK3VpbnQxNl90IHRlc3Rfdm1pbnZxX3UxNih1aW50MTZ4OF90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZtaW52cV91MTYKKyAgcmV0dXJuIHZtaW52cV91MTYoYTEpOworICAvLyBDSEVDSyBsbHZtLmFybTY0Lm5lb24udW1pbnYuaTE2LnY4aTE2Cit9CisKKy8vIFRlc3QgYSByZXByZXNudGF0aXZlIHNhbXBsZSBvZiA4IGFuZCAxNiwgc2lnbmVkIGFuZCB1bnNpZ25lZCwgNjQgYW5kIDEyOCBiaXQgcGFpcndpc2UKK3VpbnQ4eDhfdCB0ZXN0X3ZtaW5fdTgodWludDh4OF90IGExLCB1aW50OHg4X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3Rfdm1pbl91OAorICByZXR1cm4gdm1pbl91OChhMSwgYTIpOworICAvLyBDSEVDSyBsbHZtLmFybTY0Lm5lb24udW1pbi52OGk4Cit9CisKK3VpbnQ4eDE2X3QgdGVzdF92bWlucV91OCh1aW50OHgxNl90IGExLCB1aW50OHgxNl90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZtaW5xX3U4CisgIHJldHVybiB2bWlucV91OChhMSwgYTIpOworICAvLyBDSEVDSyBsbHZtLmFybTY0Lm5lb24udW1pbi52MTZpOAorfQorCitpbnQxNng4X3QgdGVzdF92bWF4cV9zMTYoaW50MTZ4OF90IGExLCBpbnQxNng4X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3Rfdm1heHFfczE2CisgIHJldHVybiB2bWF4cV9zMTYoYTEsIGEyKTsKKyAgLy8gQ0hFQ0sgbGx2bS5hcm02NC5uZW9uLnNtYXgudjhpMTYKK30KKworLy8gVGVzdCB0aGUgbW9yZSBjb21wbGljYXRlZCBjYXNlcyBvZiBbc3VmXTMyIGFuZCBmNjQKK2Zsb2F0NjR4Ml90IHRlc3Rfdm1heHFfZjY0KGZsb2F0NjR4Ml90IGExLCBmbG9hdDY0eDJfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92bWF4cV9mNjQKKyAgcmV0dXJuIHZtYXhxX2Y2NChhMSwgYTIpOworICAvLyBDSEVDSyBsbHZtLmFybTY0Lm5lb24uZm1heC52MmY2NAorfQorCitmbG9hdDMyeDRfdCB0ZXN0X3ZtYXhxX2YzMihmbG9hdDMyeDRfdCBhMSwgZmxvYXQzMng0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3Rfdm1heHFfZjMyCisgIHJldHVybiB2bWF4cV9mMzIoYTEsIGEyKTsKKyAgLy8gQ0hFQ0sgbGx2bS5hcm02NC5uZW9uLmZtYXgudjRmMzIKK30KKworZmxvYXQ2NHgyX3QgdGVzdF92bWlucV9mNjQoZmxvYXQ2NHgyX3QgYTEsIGZsb2F0NjR4Ml90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZtaW5xX2Y2NAorICByZXR1cm4gdm1pbnFfZjY0KGExLCBhMik7CisgIC8vIENIRUNLIGxsdm0uYXJtNjQubmVvbi5mbWluLnYyZjY0Cit9CisKK2Zsb2F0MzJ4Ml90IHRlc3Rfdm1heF9mMzIoZmxvYXQzMngyX3QgYTEsIGZsb2F0MzJ4Ml90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZtYXhfZjMyCisgIHJldHVybiB2bWF4X2YzMihhMSwgYTIpOworICAvLyBDSEVDSyBsbHZtLmFybTY0Lm5lb24uZm1heC52MmYzMgorfQorCitpbnQzMngyX3QgdGVzdF92bWF4X3MzMihpbnQzMngyX3QgYTEsIGludDMyeDJfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92bWF4X3MzMgorICByZXR1cm4gdm1heF9zMzIoYTEsIGEyKTsKKyAgLy8gQ0hFQ0sgbGx2bS5hcm02NC5uZW9uLnNtYXgudjJpMzIKK30KKwordWludDMyeDJfdCB0ZXN0X3ZtaW5fdTMyKHVpbnQzMngyX3QgYTEsIHVpbnQzMngyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3Rfdm1pbl91MzIKKyAgcmV0dXJuIHZtaW5fdTMyKGExLCBhMik7CisgIC8vIENIRUNLIGxsdm0uYXJtNjQubmVvbi51bWluLnYyaTMyCit9CisKK2Zsb2F0MzJfdCB0ZXN0X3ZtYXhubXZfZjMyKGZsb2F0MzJ4Ml90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZtYXhubXZfZjMyCisgIHJldHVybiB2bWF4bm12X2YzMihhMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24uZm1heG5tdi5mMzIudjJmMzIKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKKy8vIHRoaXMgZG9lc24ndCB0cmFuc2xhdGUgaW50byBhIHZhbGlkIGluc3RydWN0aW9uLCByZWdhcmRsZXNzIG9mIHdoYXQgdGhlCisvLyBBUk0gZG9jIHNheXMuCisjaWYgMAorZmxvYXQ2NF90IHRlc3Rfdm1heG5tdnFfZjY0KGZsb2F0NjR4Ml90IGExKSB7CisgIC8vIENIRUNLQCB0ZXN0X3ZtYXhubXZxX2Y2NAorICByZXR1cm4gdm1heG5tdnFfZjY0KGExKTsKKyAgLy8gQ0hFQ0tAIGxsdm0uYXJtNjQubmVvbi5zYWRkbHYuaTY0LnYyaTMyCisgIC8vIENIRUNLLU5FWFRAIHJldAorfQorI2VuZGlmCisKK2Zsb2F0MzJfdCB0ZXN0X3ZtYXhubXZxX2YzMihmbG9hdDMyeDRfdCBhMSkgeworICAvLyBDSEVDSzogdGVzdF92bWF4bm12cV9mMzIKKyAgcmV0dXJuIHZtYXhubXZxX2YzMihhMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24uZm1heG5tdi5mMzIudjRmMzIKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2Zsb2F0MzJfdCB0ZXN0X3ZtYXh2X2YzMihmbG9hdDMyeDJfdCBhMSkgeworICAvLyBDSEVDSzogdGVzdF92bWF4dl9mMzIKKyAgcmV0dXJuIHZtYXh2X2YzMihhMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24uZm1heHYuZjMyLnYyZjMyCisgIC8vIEZJWE1FIGNoZWNrIHRoYXQgdGhlIDJuZCBhbmQgM3JkIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgViByZWdpc3RlciBiZWxvdworICAvLyBDSEVDSy1DT0RFR0VOOiBmbWF4cC4ycworICAvLyBDSEVDSy1ORVhUOiByZXQKK30KKworaW50MzJfdCB0ZXN0X3ZtYXh2X3MzMihpbnQzMngyX3QgYTEpIHsKKyAgLy8gQ0hFQ0s6IHRlc3Rfdm1heHZfczMyCisgIHJldHVybiB2bWF4dl9zMzIoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnNtYXh2LmkzMi52MmkzMgorICAvLyBGSVhNRSBjaGVjayB0aGF0IHRoZSAybmQgYW5kIDNyZCBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIFYgcmVnaXN0ZXIgYmVsb3cKKyAgLy8gQ0hFQ0stQ09ERUdFTjogc21heHAuMnMKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK3VpbnQzMl90IHRlc3Rfdm1heHZfdTMyKHVpbnQzMngyX3QgYTEpIHsKKyAgLy8gQ0hFQ0s6IHRlc3Rfdm1heHZfdTMyCisgIHJldHVybiB2bWF4dl91MzIoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnVtYXh2LmkzMi52MmkzMgorICAvLyBGSVhNRSBjaGVjayB0aGF0IHRoZSAybmQgYW5kIDNyZCBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIFYgcmVnaXN0ZXIgYmVsb3cKKyAgLy8gQ0hFQ0stQ09ERUdFTjogdW1heHAuMnMKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKKy8vIEZJWE1FIHB1bnQgb24gdGhpcyBmb3Igbm93OyBkb24ndCBmb3JnZXQgdG8gZml4IENIRUNLcworI2lmIDAKK2Zsb2F0NjRfdCB0ZXN0X3ZtYXh2cV9mNjQoZmxvYXQ2NHgyX3QgYTEpIHsKKyAgLy8gQ0hFQ0tAIHRlc3Rfdm1heHZxX2Y2NAorICByZXR1cm4gdm1heHZxX2Y2NChhMSk7CisgIC8vIENIRUNLQCBsbHZtLmFybTY0Lm5lb24uZm1heHYuaTY0LnYyZjY0CisgIC8vIENIRUNLLU5FWFRAIHJldAorfQorI2VuZGlmCisKK2Zsb2F0MzJfdCB0ZXN0X3ZtYXh2cV9mMzIoZmxvYXQzMng0X3QgYTEpIHsKKyAgLy8gQ0hFQ0s6IHRlc3Rfdm1heHZxX2YzMgorICByZXR1cm4gdm1heHZxX2YzMihhMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24uZm1heHYuZjMyLnY0ZjMyCisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCitmbG9hdDMyX3QgdGVzdF92bWlubm12X2YzMihmbG9hdDMyeDJfdCBhMSkgeworICAvLyBDSEVDSzogdGVzdF92bWlubm12X2YzMgorICByZXR1cm4gdm1pbm5tdl9mMzIoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmZtaW5ubXYuZjMyLnYyZjMyCisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCitmbG9hdDMyX3QgdGVzdF92bWludnFfZjMyKGZsb2F0MzJ4NF90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZtaW52cV9mMzIKKyAgcmV0dXJuIHZtaW52cV9mMzIoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmZtaW52LmYzMi52NGYzMgorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KKworLy8gdGhpcyBkb2Vzbid0IHRyYW5zbGF0ZSBpbnRvIGEgdmFsaWQgaW5zdHJ1Y3Rpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgQVJNCisvLyBkb2Mgc2F5cy4KKyNpZiAwCitmbG9hdDY0X3QgdGVzdF92bWlubm12cV9mNjQoZmxvYXQ2NHgyX3QgYTEpIHsKKyAgLy8gQ0hFQ0tAIHRlc3Rfdm1pbm5tdnFfZjY0CisgIHJldHVybiB2bWlubm12cV9mNjQoYTEpOworICAvLyBDSEVDS0AgbGx2bS5hcm02NC5uZW9uLnNhZGRsdi5pNjQudjJpMzIKKyAgLy8gQ0hFQ0stTkVYVEAgcmV0Cit9CisjZW5kaWYKKworZmxvYXQzMl90IHRlc3Rfdm1pbm5tdnFfZjMyKGZsb2F0MzJ4NF90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZtaW5ubXZxX2YzMgorICByZXR1cm4gdm1pbm5tdnFfZjMyKGExKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5mbWlubm12LmYzMi52NGYzMgorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KKworZmxvYXQzMl90IHRlc3Rfdm1pbnZfZjMyKGZsb2F0MzJ4Ml90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZtaW52X2YzMgorICByZXR1cm4gdm1pbnZfZjMyKGExKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5mbWludi5mMzIudjJmMzIKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2ludDMyX3QgdGVzdF92bWludl9zMzIoaW50MzJ4Ml90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZtaW52X3MzMgorICByZXR1cm4gdm1pbnZfczMyKGExKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5zbWludi5pMzIudjJpMzIKKyAgLy8gQ0hFQ0stQ09ERUdFTjogc21pbnAuMnMKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK3VpbnQzMl90IHRlc3Rfdm1pbnZfdTMyKHVpbnQzMngyX3QgYTEpIHsKKyAgLy8gQ0hFQ0s6IHRlc3Rfdm1pbnZfdTMyCisgIHJldHVybiB2bWludl91MzIoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmZtaW52LmYzMi52MmYzMgorfQorCisvLyBGSVhNRSBwdW50IG9uIHRoaXMgZm9yIG5vdzsgZG9uJ3QgZm9yZ2V0IHRvIGZpeCBDSEVDS3MKKyNpZiAwCitmbG9hdDY0X3QgdGVzdF92bWludnFfZjY0KGZsb2F0NjR4Ml90IGExKSB7CisgIC8vIENIRUNLQCB0ZXN0X3ZtaW52cV9mNjQKKyAgcmV0dXJuIHZtaW52cV9mNjQoYTEpOworICAvLyBDSEVDS0AgbGx2bS5hcm02NC5uZW9uLnNhZGRsdi5pNjQudjJpMzIKKyAgLy8gQ0hFQ0stTkVYVEAgcmV0Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm02NF92YWRkLmMgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdmFkZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZmIzZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdmFkZC5jCkBAIC0wLDAgKzEsMTAyIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLU8xIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zNyAtZmZyZWVzdGFuZGluZyAtUyAtbyAtIC1lbWl0LWxsdm0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFRlc3QgQVJNNjQgU0lNRCBhZGQgaW50cmluc2ljcworCisjaW5jbHVkZSA8YXJtX25lb24uaD4KK2ludDY0X3QgdGVzdF92YWRkbHZfczMyKGludDMyeDJfdCBhMSkgeworICAvLyBDSEVDSzogdGVzdF92YWRkbHZfczMyCisgIHJldHVybiB2YWRkbHZfczMyKGExKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5zYWRkbHYuaTY0LnYyaTMyCisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCit1aW50NjRfdCB0ZXN0X3ZhZGRsdl91MzIodWludDMyeDJfdCBhMSkgeworICAvLyBDSEVDSzogdGVzdF92YWRkbHZfdTMyCisgIHJldHVybiB2YWRkbHZfdTMyKGExKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi51YWRkbHYuaTY0LnYyaTMyCisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCitpbnQ4X3QgdGVzdF92YWRkdl9zOChpbnQ4eDhfdCBhMSkgeworICAvLyBDSEVDSzogdGVzdF92YWRkdl9zOAorICByZXR1cm4gdmFkZHZfczgoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnNhZGR2LmkzMi52OGk4CisgIC8vIGRvbid0IGNoZWNrIGZvciByZXR1cm4gaGVyZSAodGhlcmUncyBhIHRydW5jPykKK30KKworaW50MTZfdCB0ZXN0X3ZhZGR2X3MxNihpbnQxNng0X3QgYTEpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmFkZHZfczE2CisgIHJldHVybiB2YWRkdl9zMTYoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnNhZGR2LmkzMi52NGkxNgorICAvLyBkb24ndCBjaGVjayBmb3IgcmV0dXJuIGhlcmUgKHRoZXJlJ3MgYSB0cnVuYz8pCit9CisKK2ludDMyX3QgdGVzdF92YWRkdl9zMzIoaW50MzJ4Ml90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZhZGR2X3MzMgorICByZXR1cm4gdmFkZHZfczMyKGExKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5zYWRkdi5pMzIudjJpMzIKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK3VpbnQ4X3QgdGVzdF92YWRkdl91OChpbnQ4eDhfdCBhMSkgeworICAvLyBDSEVDSzogdGVzdF92YWRkdl91OAorICByZXR1cm4gdmFkZHZfdTgoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnVhZGR2LmkzMi52OGk4CisgIC8vIGRvbid0IGNoZWNrIGZvciByZXR1cm4gaGVyZSAodGhlcmUncyBhIHRydW5jPykKK30KKwordWludDE2X3QgdGVzdF92YWRkdl91MTYoaW50MTZ4NF90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZhZGR2X3UxNgorICByZXR1cm4gdmFkZHZfdTE2KGExKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi51YWRkdi5pMzIudjRpMTYKKyAgLy8gZG9uJ3QgY2hlY2sgZm9yIHJldHVybiBoZXJlICh0aGVyZSdzIGEgdHJ1bmM/KQorfQorCit1aW50MzJfdCB0ZXN0X3ZhZGR2X3UzMihpbnQzMngyX3QgYTEpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmFkZHZfdTMyCisgIHJldHVybiB2YWRkdl91MzIoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnVhZGR2LmkzMi52MmkzMgorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KKworaW50OF90IHRlc3RfdmFkZHZxX3M4KGludDh4MTZfdCBhMSkgeworICAvLyBDSEVDSzogdGVzdF92YWRkdnFfczgKKyAgcmV0dXJuIHZhZGR2cV9zOChhMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24uc2FkZHYuaTMyLnYxNmk4CisgIC8vIGRvbid0IGNoZWNrIGZvciByZXR1cm4gaGVyZSAodGhlcmUncyBhIHRydW5jPykKK30KKworaW50MTZfdCB0ZXN0X3ZhZGR2cV9zMTYoaW50MTZ4OF90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZhZGR2cV9zMTYKKyAgcmV0dXJuIHZhZGR2cV9zMTYoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnNhZGR2LmkzMi52OGkxNgorICAvLyBkb24ndCBjaGVjayBmb3IgcmV0dXJuIGhlcmUgKHRoZXJlJ3MgYSB0cnVuYz8pCit9CisKK2ludDMyX3QgdGVzdF92YWRkdnFfczMyKGludDMyeDRfdCBhMSkgeworICAvLyBDSEVDSzogdGVzdF92YWRkdnFfczMyCisgIHJldHVybiB2YWRkdnFfczMyKGExKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5zYWRkdi5pMzIudjRpMzIKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK3VpbnQ4X3QgdGVzdF92YWRkdnFfdTgoaW50OHgxNl90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZhZGR2cV91OAorICByZXR1cm4gdmFkZHZxX3U4KGExKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi51YWRkdi5pMzIudjE2aTgKKyAgLy8gZG9uJ3QgY2hlY2sgZm9yIHJldHVybiBoZXJlICh0aGVyZSdzIGEgdHJ1bmM/KQorfQorCit1aW50MTZfdCB0ZXN0X3ZhZGR2cV91MTYoaW50MTZ4OF90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZhZGR2cV91MTYKKyAgcmV0dXJuIHZhZGR2cV91MTYoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnVhZGR2LmkzMi52OGkxNgorICAvLyBkb24ndCBjaGVjayBmb3IgcmV0dXJuIGhlcmUgKHRoZXJlJ3MgYSB0cnVuYz8pCit9CisKK3VpbnQzMl90IHRlc3RfdmFkZHZxX3UzMihpbnQzMng0X3QgYTEpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmFkZHZxX3UzMgorICByZXR1cm4gdmFkZHZxX3UzMihhMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udWFkZHYuaTMyLnY0aTMyCisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYXJtNjRfdmNhLmMgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdmNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjYmU0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92Y2EuYwpAQCAtMCwwICsxLDU5IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLU8xIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zNyAtZmZyZWVzdGFuZGluZyAtUyAtbyAtIC1lbWl0LWxsdm0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFRlc3QgQVJNNjQgdmVjdG9yIGNvbXBhcmUgYWJzb2x1dGUgaW50cmluc2ljcworCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKwordWludDMyeDJfdCB0ZXN0X3ZjYWxlX2YzMihmbG9hdDMyeDJfdCBhMSwgZmxvYXQzMngyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNhbGVfZjMyCisgIHJldHVybiB2Y2FsZV9mMzIoYTEsIGEyKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi5mYWNnZS52MmkzMi52MmYzMgorICAvLyBubyBjaGVjayBmb3IgcmV0IGhlcmUsIGFzIHRoZXJlIGlzIGEgYml0Y2FzdAorfQorCit1aW50MzJ4NF90IHRlc3RfdmNhbGVxX2YzMihmbG9hdDMyeDRfdCBhMSwgZmxvYXQzMng0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNhbGVxX2YzMgorICByZXR1cm4gdmNhbGVxX2YzMihhMSwgYTIpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmZhY2dlLnY0aTMyLnY0ZjMye3suKmEyLC4qYTF9fQorICAvLyBubyBjaGVjayBmb3IgcmV0IGhlcmUsIGFzIHRoZXJlIGlzIGEgYml0Y2FzdAorfQorCit1aW50MzJ4Ml90IHRlc3RfdmNhbHRfZjMyKGZsb2F0MzJ4Ml90IGExLCBmbG9hdDMyeDJfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92Y2FsdF9mMzIKKyAgcmV0dXJuIHZjYWx0X2YzMihhMSwgYTIpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmZhY2d0LnYyaTMyLnYyZjMye3suKmEyLC4qYTF9fQorICAvLyBubyBjaGVjayBmb3IgcmV0IGhlcmUsIGFzIHRoZXJlIGlzIGEgYml0Y2FzdAorfQorCit1aW50MzJ4NF90IHRlc3RfdmNhbHRxX2YzMihmbG9hdDMyeDRfdCBhMSwgZmxvYXQzMng0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNhbHRxX2YzMgorICByZXR1cm4gdmNhbHRxX2YzMihhMSwgYTIpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmZhY2d0LnY0aTMyLnY0ZjMye3suKmEyLC4qYTF9fQorfQorCit1aW50NjR4Ml90IHRlc3RfdmNhZ3RxX2Y2NChmbG9hdDY0eDJfdCBhMSwgZmxvYXQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNhZ3RxX2Y2NAorICByZXR1cm4gdmNhZ3RxX2Y2NChhMSwgYTIpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmZhY2d0LnYyaTY0LnYyZjY0e3suKmExLC4qYTJ9fQorICAvLyBubyBjaGVjayBmb3IgcmV0IGhlcmUsIGFzIHRoZXJlIGlzIGEgYml0Y2FzdAorfQorCit1aW50NjR4Ml90IHRlc3RfdmNhbHRxX2Y2NChmbG9hdDY0eDJfdCBhMSwgZmxvYXQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNhbHRxX2Y2NAorICByZXR1cm4gdmNhbHRxX2Y2NChhMSwgYTIpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmZhY2d0LnYyaTY0LnYyZjY0e3suKmEyLC4qYTF9fQorICAvLyBubyBjaGVjayBmb3IgcmV0IGhlcmUsIGFzIHRoZXJlIGlzIGEgYml0Y2FzdAorfQorCit1aW50NjR4Ml90IHRlc3RfdmNhZ2VxX2Y2NChmbG9hdDY0eDJfdCBhMSwgZmxvYXQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNhZ2VxX2Y2NAorICByZXR1cm4gdmNhZ2VxX2Y2NChhMSwgYTIpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmZhY2dlLnYyaTY0LnYyZjY0e3suKmExLC4qYTJ9fQorICAvLyBubyBjaGVjayBmb3IgcmV0IGhlcmUsIGFzIHRoZXJlIGlzIGEgYml0Y2FzdAorfQorCit1aW50NjR4Ml90IHRlc3RfdmNhbGVxX2Y2NChmbG9hdDY0eDJfdCBhMSwgZmxvYXQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNhbGVxX2Y2NAorICByZXR1cm4gdmNhbGVxX2Y2NChhMSwgYTIpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmZhY2dlLnYyaTY0LnYyZjY0e3suKmEyLC4qYTF9fQorICAvLyBubyBjaGVjayBmb3IgcmV0IGhlcmUsIGFzIHRoZXJlIGlzIGEgYml0Y2FzdAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0X3Zjb3B5LmMgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdmNvcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjgzOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuL2FybTY0X3Zjb3B5LmMKQEAgLTAsMCArMSw2OSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1PMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisKKy8vIFRlc3QgQVJNNjQgU0lNRCBjb3B5IHZlY3RvciBlbGVtZW50IHRvIHZlY3RvciBlbGVtZW50OiB2Y29weXFfbGFuZSoKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK2ludDh4MTZfdCB0ZXN0X3Zjb3B5cV9sYW5lcV9zOChpbnQ4eDE2X3QgYTEsIGludDh4MTZfdCBhMikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weXFfbGFuZXFfczgKKyAgcmV0dXJuIHZjb3B5cV9sYW5lcV9zOChhMSwgKGludDY0X3QpIDMsIGEyLCAoaW50NjRfdCkgMTMpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvciA8MTYgeCBpOD4gJWExLCA8MTYgeCBpOD4gJWEyLCA8MTYgeCBpMzI+IDxpMzIgMCwgaTMyIDEsIGkzMiAyLCBpMzIgMjksIGkzMiA0LCBpMzIgNSwgaTMyIDYsIGkzMiA3LCBpMzIgOCwgaTMyIDksIGkzMiAxMCwgaTMyIDExLCBpMzIgMTIsIGkzMiAxMywgaTMyIDE0LCBpMzIgMTU+Cit9CisKK3VpbnQ4eDE2X3QgdGVzdF92Y29weXFfbGFuZXFfdTgodWludDh4MTZfdCBhMSwgdWludDh4MTZfdCBhMikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weXFfbGFuZXFfdTgKKyAgcmV0dXJuIHZjb3B5cV9sYW5lcV91OChhMSwgKGludDY0X3QpIDMsIGEyLCAoaW50NjRfdCkgMTMpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvciA8MTYgeCBpOD4gJWExLCA8MTYgeCBpOD4gJWEyLCA8MTYgeCBpMzI+IDxpMzIgMCwgaTMyIDEsIGkzMiAyLCBpMzIgMjksIGkzMiA0LCBpMzIgNSwgaTMyIDYsIGkzMiA3LCBpMzIgOCwgaTMyIDksIGkzMiAxMCwgaTMyIDExLCBpMzIgMTIsIGkzMiAxMywgaTMyIDE0LCBpMzIgMTU+CisKK30KKworaW50MTZ4OF90IHRlc3RfdmNvcHlxX2xhbmVxX3MxNihpbnQxNng4X3QgYTEsIGludDE2eDhfdCBhMikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weXFfbGFuZXFfczE2CisgIHJldHVybiB2Y29weXFfbGFuZXFfczE2KGExLCAoaW50NjRfdCkgMywgYTIsIChpbnQ2NF90KSA3KTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IgPDggeCBpMTY+ICVhMSwgPDggeCBpMTY+ICVhMiwgPDggeCBpMzI+IDxpMzIgMCwgaTMyIDEsIGkzMiAyLCBpMzIgMTUsIGkzMiA0LCBpMzIgNSwgaTMyIDYsIGkzMiA3PgorCit9CisKK3VpbnQxNng4X3QgdGVzdF92Y29weXFfbGFuZXFfdTE2KHVpbnQxNng4X3QgYTEsIHVpbnQxNng4X3QgYTIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVxX3UxNgorICByZXR1cm4gdmNvcHlxX2xhbmVxX3UxNihhMSwgKGludDY0X3QpIDMsIGEyLCAoaW50NjRfdCkgNyk7CisgIC8vIENIRUNLOiBzaHVmZmxldmVjdG9yIDw4IHggaTE2PiAlYTEsIDw4IHggaTE2PiAlYTIsIDw4IHggaTMyPiA8aTMyIDAsIGkzMiAxLCBpMzIgMiwgaTMyIDE1LCBpMzIgNCwgaTMyIDUsIGkzMiA2LCBpMzIgNz4KKworfQorCitpbnQzMng0X3QgdGVzdF92Y29weXFfbGFuZXFfczMyKGludDMyeDRfdCBhMSwgaW50MzJ4NF90IGEyKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lcV9zMzIKKyAgcmV0dXJuIHZjb3B5cV9sYW5lcV9zMzIoYTEsIChpbnQ2NF90KSAzLCBhMiwgKGludDY0X3QpIDMpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvciA8NCB4IGkzMj4gJWExLCA8NCB4IGkzMj4gJWEyLCA8NCB4IGkzMj4gPGkzMiAwLCBpMzIgMSwgaTMyIDIsIGkzMiA3PgorfQorCit1aW50MzJ4NF90IHRlc3RfdmNvcHlxX2xhbmVxX3UzMih1aW50MzJ4NF90IGExLCB1aW50MzJ4NF90IGEyKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lcV91MzIKKyAgcmV0dXJuIHZjb3B5cV9sYW5lcV91MzIoYTEsIChpbnQ2NF90KSAzLCBhMiwgKGludDY0X3QpIDMpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvciA8NCB4IGkzMj4gJWExLCA8NCB4IGkzMj4gJWEyLCA8NCB4IGkzMj4gPGkzMiAwLCBpMzIgMSwgaTMyIDIsIGkzMiA3PgorfQorCitpbnQ2NHgyX3QgdGVzdF92Y29weXFfbGFuZXFfczY0KGludDY0eDJfdCBhMSwgaW50NjR4Ml90IGEyKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3Zjb3B5cV9sYW5lcV9zNjQKKyAgcmV0dXJuIHZjb3B5cV9sYW5lcV9zNjQoYTEsIChpbnQ2NF90KSAwLCBhMiwgKGludDY0X3QpIDEpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvciA8MiB4IGk2ND4gJWExLCA8MiB4IGk2ND4gJWEyLCA8MiB4IGkzMj4gPGkzMiAzLCBpMzIgMT4KK30KKwordWludDY0eDJfdCB0ZXN0X3Zjb3B5cV9sYW5lcV91NjQodWludDY0eDJfdCBhMSwgdWludDY0eDJfdCBhMikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weXFfbGFuZXFfdTY0CisgIHJldHVybiB2Y29weXFfbGFuZXFfdTY0KGExLCAoaW50NjRfdCkgMCwgYTIsIChpbnQ2NF90KSAxKTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IgPDIgeCBpNjQ+ICVhMSwgPDIgeCBpNjQ+ICVhMiwgPDIgeCBpMzI+IDxpMzIgMywgaTMyIDE+Cit9CisKK2Zsb2F0MzJ4NF90IHRlc3RfdmNvcHlxX2xhbmVxX2YzMihmbG9hdDMyeDRfdCBhMSwgZmxvYXQzMng0X3QgYTIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmNvcHlxX2xhbmVxX2YzMgorICByZXR1cm4gdmNvcHlxX2xhbmVxX2YzMihhMSwgMCwgYTIsIDMpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvciA8NCB4IGZsb2F0PiAlYTEsIDw0IHggZmxvYXQ+ICVhMiwgPDQgeCBpMzI+IDxpMzIgNywgaTMyIDEsIGkzMiAyLCBpMzIgMz4KK30KKworZmxvYXQ2NHgyX3QgdGVzdF92Y29weXFfbGFuZXFfZjY0KGZsb2F0NjR4Ml90IGExLCBmbG9hdDY0eDJfdCBhMikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y29weXFfbGFuZXFfZjY0CisgIHJldHVybiB2Y29weXFfbGFuZXFfZjY0KGExLCAwLCBhMiwgMSk7CisgIC8vIENIRUNLOiBzaHVmZmxldmVjdG9yIDwyIHggZG91YmxlPiAlYTEsIDwyIHggZG91YmxlPiAlYTIsIDwyIHggaTMyPiA8aTMyIDMsIGkzMiAxPgorfQorCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYXJtNjRfdmNyZWF0ZS5jIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZjcmVhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTFlNDMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZjcmVhdGUuYwpAQCAtMCwwICsxLDIzIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLU8xIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zNyAtZmZyZWVzdGFuZGluZyAtUyAtbyAtIC1lbWl0LWxsdm0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFRlc3QgQVJNNjQgU0lNRCB2Y3JlYXRlIGludHJpbnNpY3MKKworLyojaW5jbHVkZSA8YXJtX25lb24uaD4qLworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK2Zsb2F0MzJ4Ml90IHRlc3RfdmNyZWF0ZV9mMzIodWludDY0X3QgYTEpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmNyZWF0ZV9mMzIKKyAgcmV0dXJuIHZjcmVhdGVfZjMyKGExKTsKKyAgLy8gQ0hFQ0s6IGJpdGNhc3Qge3suKn19IHRvIDwyIHggZmxvYXQ+CisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCisvLyBGSVhNRSBlbmFibGUgd2hlbiBzY2FsYXJfdG9fdmVjdG9yIGluIGJhY2tlbmQgaXMgZml4ZWQuICBBbHNvLCBjaGFuZ2UKKy8vIENIRUNLQCB0byBDSEVDSzxjb2xvbj4gYW5kIENIRUNLLU5FWFRAIHRvIENIRUNLLU5FWFQ8Y29sb24+CisvKgorZmxvYXQ2NHgxX3QgdGVzdF92Y3JlYXRlX2Y2NCh1aW50NjRfdCBhMSkgeworICAvLyBDSEVDS0AgdGVzdF92Y3JlYXRlX2Y2NAorICByZXR1cm4gdmNyZWF0ZV9mNjQoYTEpOworICAvLyBDSEVDS0AgbGx2bS5hcm02NC5uZW9uLnNhZGRsdi5pNjQudjJpMzIKKyAgLy8gQ0hFQ0stTkVYVEAgcmV0Cit9CisqLwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0X3ZjdnRmcC5jIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZjdnRmcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OGExNzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdmN2dGZwLmMKQEAgLTAsMCArMSw0OCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1PMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCitmbG9hdDY0eDJfdCB0ZXN0X3ZjdnRfZjY0X2YzMihmbG9hdDMyeDJfdCB4KSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZjdnRfZjY0X2YzMgorICByZXR1cm4gdmN2dF9mNjRfZjMyKHgpOworICAvLyBDSEVDSzogZnBleHQgPDIgeCBmbG9hdD4ge3slLip9fSB0byA8MiB4IGRvdWJsZT4KKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2Zsb2F0NjR4Ml90IHRlc3RfdmN2dF9oaWdoX2Y2NF9mMzIoZmxvYXQzMng0X3QgeCkgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92Y3Z0X2hpZ2hfZjY0X2YzMgorICByZXR1cm4gdmN2dF9oaWdoX2Y2NF9mMzIoeCk7CisgIC8vIENIRUNLOiBbW0hJR0g6JS4qXV0gPSBzaHVmZmxldmVjdG9yIDw0IHggZmxvYXQ+IHt7JS4qfX0sIDw0IHggZmxvYXQ+IHVuZGVmLCA8MiB4IGkzMj4gPGkzMiAyLCBpMzIgMz4KKyAgLy8gQ0hFQ0stTkVYVDogZnBleHQgPDIgeCBmbG9hdD4gW1tISUdIXV0gdG8gPDIgeCBkb3VibGU+CisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCitmbG9hdDMyeDJfdCB0ZXN0X3ZjdnRfZjMyX2Y2NChmbG9hdDY0eDJfdCB2KSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZjdnRfZjMyX2Y2NAorICByZXR1cm4gdmN2dF9mMzJfZjY0KHYpOworICAvLyBDSEVDSzogZnB0cnVuYyA8MiB4IGRvdWJsZT4ge3slLip9fSB0byA8MiB4IGZsb2F0PgorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KKworZmxvYXQzMng0X3QgdGVzdF92Y3Z0X2hpZ2hfZjMyX2Y2NChmbG9hdDMyeDJfdCB4LCBmbG9hdDY0eDJfdCB2KSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZjdnRfaGlnaF9mMzJfZjY0CisgIHJldHVybiB2Y3Z0X2hpZ2hfZjMyX2Y2NCh4LCB2KTsKKyAgLy8gQ0hFQ0s6IFtbVFJVTkM6JS4qXV0gPSBmcHRydW5jIDwyIHggZG91YmxlPiB7ey4qfX0gdG8gPDIgeCBmbG9hdD4KKyAgLy8gQ0hFQ0stTkVYVDogc2h1ZmZsZXZlY3RvciA8MiB4IGZsb2F0PiB7ey4qfX0sIDwyIHggZmxvYXQ+IFtbVFJVTkNdXSwgPDQgeCBpMzI+IDxpMzIgMCwgaTMyIDEsIGkzMiAyLCBpMzIgMz4KKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2Zsb2F0MzJ4Ml90IHRlc3RfdmN2dHhfZjMyX2Y2NChmbG9hdDY0eDJfdCB2KSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZjdnR4X2YzMl9mNjQKKyAgcmV0dXJuIHZjdnR4X2YzMl9mNjQodik7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24uZmN2dHhuLnYyZjMyLnYyZjY0CisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCitmbG9hdDMyeDRfdCB0ZXN0X3ZjdnR4X2hpZ2hfZjMyX2Y2NChmbG9hdDMyeDJfdCB4LCBmbG9hdDY0eDJfdCB2KSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZjdnR4X2hpZ2hfZjMyX2Y2NAorICByZXR1cm4gdmN2dHhfaGlnaF9mMzJfZjY0KHgsIHYpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLmZjdnR4bi52MmYzMi52MmY2NAorICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvcgorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm02NF92ZHVwLmMgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdmR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzZhZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdmR1cC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisvLyBUZXN0IEFSTTY0IFNJTUQgZHVwbGljYXRlIGxhbmUgYW5kIG4gaW50cmluc2ljcworCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKwordm9pZCB0ZXN0X3ZkdXBfbGFuZV9zNjQoaW50NjR4MV90IGExKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZkdXBfbGFuZV9zNjQKKyAgdmR1cF9sYW5lX3M2NChhMSwgMCk7CisgIC8vIENIRUNLOiBzaHVmZmxldmVjdG9yCit9CisKK3ZvaWQgdGVzdF92ZHVwX2xhbmVfdTY0KHVpbnQ2NHgxX3QgYTEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cF9sYW5lX3U2NAorICB2ZHVwX2xhbmVfdTY0KGExLCAwKTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IKK30KKworLy8gdW5jb21tZW50IG91dCB0aGUgZm9sbG93aW5nIGNvZGUgb25jZSBzY2FsYXJfdG9fdmVjdG9yIGluIHRoZSBiYWNrZW5kCisvLyB3b3JrcyAoZm9yIDY0IGJpdD8pLiAgQ2hhbmdlIHRoZSAiQ0hFQ0tAIiB0byAiQ0hFQ0s8Y29sb24+IgorLyoKK2Zsb2F0NjR4MV90IHRlc3RfdmR1cF9uX2Y2NChmbG9hdDY0X3QgYTEpIHsKKyAgLy8gQ0hFQ0stTEFCRUxAIHRlc3RfdmR1cF9uX2Y2NAorICByZXR1cm4gdmR1cF9uX2Y2NChhMSk7CisgIC8vIG1hdGNoIHRoYXQgYW4gZWxlbWVudCBpcyBpbnNlcnRlZCBpbnRvIHBhcnQgMAorICAvLyBDSEVDS0AgaW5zZXJ0ZWxlbWVudCB7ey4qLCBpMzIgMCAqJH19Cit9CisqLworCitmbG9hdDE2eDhfdCB0ZXN0X3ZkdXBxX25fZjE2KGZsb2F0MTZfdCAqYTEpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbl9mMTYKKyAgcmV0dXJuIHZkdXBxX25fZjE2KCphMSk7CisgIC8vIG1hdGNoIHRoYXQgYW4gZWxlbWVudCBpcyBpbnNlcnRlZCBpbnRvIHBhcnRzIDAtNy4gIFRoZSBiYWNrZW5kIGJldHRlcgorICAvLyB0dXJuIHRoYXQgaW50byBhIHNpbmdsZSBkdXAgaW50cnVjdGlvbgorICAvLyBDSEVDSzogaW5zZXJ0ZWxlbWVudCB7ey4qLCBpMzIgMCAqJH19CisgIC8vIENIRUNLOiBpbnNlcnRlbGVtZW50IHt7LiosIGkzMiAxICokfX0KKyAgLy8gQ0hFQ0s6IGluc2VydGVsZW1lbnQge3suKiwgaTMyIDIgKiR9fQorICAvLyBDSEVDSzogaW5zZXJ0ZWxlbWVudCB7ey4qLCBpMzIgMyAqJH19CisgIC8vIENIRUNLOiBpbnNlcnRlbGVtZW50IHt7LiosIGkzMiA0ICokfX0KKyAgLy8gQ0hFQ0s6IGluc2VydGVsZW1lbnQge3suKiwgaTMyIDUgKiR9fQorICAvLyBDSEVDSzogaW5zZXJ0ZWxlbWVudCB7ey4qLCBpMzIgNiAqJH19CisgIC8vIENIRUNLOiBpbnNlcnRlbGVtZW50IHt7LiosIGkzMiA3ICokfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm02NF92ZHVwcV9uX2Y2NC5jIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZkdXBxX25fZjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU4ODM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92ZHVwcV9uX2Y2NC5jCkBAIC0wLDAgKzEsODggQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtTzMgLXRyaXBsZSBhcm02NC1hcHBsZS1pb3M3IC1mZnJlZXN0YW5kaW5nIC1TIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtTzMgLXRyaXBsZSBhcm02NC1hcHBsZS1pb3M3IC1mZnJlZXN0YW5kaW5nIC1TIC1vIC0gLWVtaXQtbGx2bSAlcyB8IFwKKy8vIFJVTjogICBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1JUiAlcworLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisKKy8vLyBUZXN0IHZkdXBxX25fZjY0IGFuZCB2bW92cV9uZjY0IEFSTTY0IGludHJpbnNpY3MKKy8vIDxyZGFyOi8vcHJvYmxlbS8xMTc3ODQwNT4gQVJNNjQ6IHZkdXBxX25fZjY0IGFuZCB2ZHVwcV9sYW5lX2Y2NCBpbnRyaW5zaWNzCisvLyBtaXNzaW5nCisKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKKy8vIHZkdXBxX25fZjY0IC0+IGR1cC4yZCB2MCwgdjBbMF0KKy8vCitmbG9hdDY0eDJfdCB0ZXN0X3ZkdXBxX25fZjY0KGZsb2F0NjRfdCB3KQoreworICAgIHJldHVybiB2ZHVwcV9uX2Y2NCh3KTsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbl9mNjQ6CisgIC8vIENIRUNLOiBkdXAuMmQgdjAsIHYwWzBdCisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCisvLyBtaWdodCBhcyB3ZWxsIHRlc3QgdGhpcyB3aGlsZSB3ZSdyZSBoZXJlCisvLyB2ZHVwcV9uX2YzMiAtPiBkdXAuNHMgdjAsIHYwWzBdCitmbG9hdDMyeDRfdCB0ZXN0X3ZkdXBxX25fZjMyKGZsb2F0MzJfdCB3KQoreworICAgIHJldHVybiB2ZHVwcV9uX2YzMih3KTsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdmR1cHFfbl9mMzI6CisgIC8vIENIRUNLOiBkdXAuNHMgdjAsIHYwWzBdCisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCisvLyB2ZHVwcV9sYW5lX2Y2NCAtPiBkdXAuMmQgdjAsIHYwWzBdCisvLyB0aGlzIHdhcyBpbiA8cmRhcjovL3Byb2JsZW0vMTE3Nzg0MDU+LCBidXQgaGFkIGFscmVhZHkgYmVlbiBpbXBsZW1lbnRlZCwKKy8vIHRlc3QgYW55d2F5CitmbG9hdDY0eDJfdCB0ZXN0X3ZkdXBxX2xhbmVfZjY0KGZsb2F0NjR4MV90IFYpCit7CisgICAgcmV0dXJuIHZkdXBxX2xhbmVfZjY0KFYsIDApOworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92ZHVwcV9sYW5lX2Y2NDoKKyAgLy8gQ0hFQ0s6IGR1cC4yZCB2MCwgdjBbMF0KKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKKy8vIHZtb3ZxX25fZjY0IC0+IGR1cCBWZC4yZCxYMAorLy8gdGhpcyB3YXNuJ3QgaW4gPHJkYXI6Ly9wcm9ibGVtLzExNzc4NDA1PiwgYnV0IGl0IHdhcyBiZXR3ZWVuIHRoZSB2ZHVwcworZmxvYXQ2NHgyX3QgdGVzdF92bW92cV9uX2Y2NChmbG9hdDY0X3QgdykKK3sKKyAgcmV0dXJuIHZtb3ZxX25fZjY0KHcpOworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92bW92cV9uX2Y2NDoKKyAgLy8gQ0hFQ0s6IGR1cC4yZCB2MCwgdjBbMF0KKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2Zsb2F0MTZ4NF90IHRlc3Rfdm1vdl9uX2YxNihmbG9hdDE2X3QgKmExKQoreworICAvLyBDSEVDSy1JUi1MQUJFTDogdGVzdF92bW92X25fZjE2CisgIHJldHVybiB2bW92X25fZjE2KCphMSk7CisgIC8vIENIRUNLLUlSOiBpbnNlcnRlbGVtZW50IHt7Lip9fSBpMzIgMHt7ICokfX0KKyAgLy8gQ0hFQ0stSVI6IGluc2VydGVsZW1lbnQge3suKn19IGkzMiAxe3sgKiR9fQorICAvLyBDSEVDSy1JUjogaW5zZXJ0ZWxlbWVudCB7ey4qfX0gaTMyIDJ7eyAqJH19CisgIC8vIENIRUNLLUlSOiBpbnNlcnRlbGVtZW50IHt7Lip9fSBpMzIgM3t7ICokfX0KK30KKworLy8gRGlzYWJsZSB1bnRpbCBzY2FsYXIgcHJvYmxlbSBpbiBiYWNrZW5kIGlzIGZpeGVkLiBDaGFuZ2UgQ0hFQ0stSVJAIHRvCisvLyBDSEVDSy1JUjxjb2xvbj4KKy8qCitmbG9hdDY0eDFfdCB0ZXN0X3Ztb3Zfbl9mNjQoZmxvYXQ2NF90IGExKQoreworICAvLyBDSEVDSy1JUkAgdGVzdF92bW92X25fZjY0CisgIHJldHVybiB2bW92X25fZjY0KGExKTsKKyAgLy8gQ0hFQ0stSVJAIGluc2VydGVsZW1lbnQge3suKn19IGkzMiAwe3sgKiR9fQorfQorKi8KKworZmxvYXQxNng4X3QgdGVzdF92bW92cV9uX2YxNihmbG9hdDE2X3QgKmExKQoreworICAvLyBDSEVDSy1JUi1MQUJFTDogdGVzdF92bW92cV9uX2YxNgorICByZXR1cm4gdm1vdnFfbl9mMTYoKmExKTsKKyAgLy8gQ0hFQ0stSVI6IGluc2VydGVsZW1lbnQge3suKn19IGkzMiAwe3sgKiR9fQorICAvLyBDSEVDSy1JUjogaW5zZXJ0ZWxlbWVudCB7ey4qfX0gaTMyIDF7eyAqJH19CisgIC8vIENIRUNLLUlSOiBpbnNlcnRlbGVtZW50IHt7Lip9fSBpMzIgMnt7ICokfX0KKyAgLy8gQ0hFQ0stSVI6IGluc2VydGVsZW1lbnQge3suKn19IGkzMiAze3sgKiR9fQorICAvLyBDSEVDSy1JUjogaW5zZXJ0ZWxlbWVudCB7ey4qfX0gaTMyIDR7eyAqJH19CisgIC8vIENIRUNLLUlSOiBpbnNlcnRlbGVtZW50IHt7Lip9fSBpMzIgNXt7ICokfX0KKyAgLy8gQ0hFQ0stSVI6IGluc2VydGVsZW1lbnQge3suKn19IGkzMiA2e3sgKiR9fQorICAvLyBDSEVDSy1JUjogaW5zZXJ0ZWxlbWVudCB7ey4qfX0gaTMyIDd7eyAqJH19Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hcm02NF92ZWNDbXBCci5jIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZlY0NtcEJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2NzQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92ZWNDbXBCci5jCkBAIC0wLDAgKzEsMTExIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLU8zIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zNyAtUyAtZmZyZWVzdGFuZGluZyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSRVFVSVJFUzogYXJtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIHRlc3QgY29kZSBnZW5lcmF0aW9uIGZvciA8cmRhcjovL3Byb2JsZW0vMTE0ODc3NTc+CisjaW5jbHVkZSA8YXJtX25lb24uaD4KKwordW5zaWduZWQgYmFyKCk7CisKKy8vIEJyYW5jaCBpZiBhbnkgbGFuZSBvZiBWMCBpcyB6ZXJvOyA2NCBiaXQgPT4gIW1pbgordW5zaWduZWQgYW55WmVybzY0KHVpbnQxNng0X3QgYSkgeworLy8gQ0hFQ0s6IGFueVplcm82NDoKKy8vIENIRUNLOiB1bWludi44YiBiW1tSRUdOTzE6WzAtOV0rXV0sIHYwCisvLyBDSEVDSy1ORVhUOiBmbW92IHdbW1JFR05PMjpbMC05XStdXSwgc1tbUkVHTk8xXV0KKy8vIENIRUNLLU5FWFQ6IGNieiB3W1tSRUdOTzJdXSwgW1tMQUJFTDpbLkEtWl8wLTldK11dCisvLyBDSEVDSzogW1tMQUJFTF1dOgorLy8gQ0hFQ0stTkVYVDogYiB7e19iYXJ8YmFyfX0KKyAgaWYgKCF2bWludl91OChhKSkKKyAgICByZXR1cm4gYmFyKCk7CisgIHJldHVybiAwOworfQorCisvLyBCcmFuY2ggaWYgYW55IGxhbmUgb2YgVjAgaXMgemVybzsgMTI4IGJpdCA9PiAhbWluCit1bnNpZ25lZCBhbnlaZXJvMTI4KHVpbnQxNng4X3QgYSkgeworLy8gQ0hFQ0s6IGFueVplcm8xMjg6CisvLyBDSEVDSzogdW1pbnYuMTZiIGJbW1JFR05PMTpbMC05XStdXSwgdjAKKy8vIENIRUNLLU5FWFQ6IGZtb3Ygd1tbUkVHTk8yOlswLTldK11dLCBzW1tSRUdOTzFdXQorLy8gQ0hFQ0stTkVYVDogY2J6IHdbW1JFR05PMl1dLCBbW0xBQkVMOlsuQS1aXzAtOV0rXV0KKy8vIENIRUNLOiBbW0xBQkVMXV06CisvLyBDSEVDSy1ORVhUOiBiIHt7X2JhcnxiYXJ9fQorICBpZiAoIXZtaW52cV91OChhKSkKKyAgICByZXR1cm4gYmFyKCk7CisgIHJldHVybiAwOworfQorCisvLyBCcmFuY2ggaWYgYW55IGxhbmUgb2YgVjAgaXMgbm9uLXplcm87IDY0IGJpdCA9PiBtYXgKK3Vuc2lnbmVkIGFueU5vblplcm82NCh1aW50MTZ4NF90IGEpIHsKKy8vIENIRUNLOiBhbnlOb25aZXJvNjQ6CisvLyBDSEVDSzogdW1heHYuOGIgYltbUkVHTk8xOlswLTldK11dLCB2MAorLy8gQ0hFQ0stTkVYVDogZm1vdiB3W1tSRUdOTzI6WzAtOV0rXV0sIHNbW1JFR05PMV1dCisvLyBDSEVDSy1ORVhUOiBjYnogd1tbUkVHTk8yXV0sIFtbTEFCRUw6Wy5BLVpfMC05XStdXQorLy8gQ0hFQ0s6IFtbTEFCRUxdXToKKy8vIENIRUNLLU5FWFQ6IG1vdnogdzAsICMwCisgIGlmICh2bWF4dl91OChhKSkKKyAgICByZXR1cm4gYmFyKCk7CisgIHJldHVybiAwOworfQorCisvLyBCcmFuY2ggaWYgYW55IGxhbmUgb2YgVjAgaXMgbm9uLXplcm87IDEyOCBiaXQgPT4gbWF4Cit1bnNpZ25lZCBhbnlOb25aZXJvMTI4KHVpbnQxNng4X3QgYSkgeworLy8gQ0hFQ0s6IGFueU5vblplcm8xMjg6CisvLyBDSEVDSzogdW1heHYuMTZiIGJbW1JFR05PMTpbMC05XStdXSwgdjAKKy8vIENIRUNLLU5FWFQ6IGZtb3Ygd1tbUkVHTk8yOlswLTldK11dLCBzW1tSRUdOTzFdXQorLy8gQ0hFQ0stTkVYVDogY2J6IHdbW1JFR05PMl1dLCBbW0xBQkVMOlsuQS1aXzAtOV0rXV0KKy8vIENIRUNLOiBbW0xBQkVMXV06CisvLyBDSEVDSy1ORVhUOiBtb3Z6IHcwLCAjMAorICBpZiAodm1heHZxX3U4KGEpKQorICAgIHJldHVybiBiYXIoKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIEJyYW5jaCBpZiBhbGwgbGFuZXMgb2YgVjAgYXJlIHplcm87IDY0IGJpdCA9PiAhbWF4Cit1bnNpZ25lZCBhbGxaZXJvNjQodWludDE2eDRfdCBhKSB7CisvLyBDSEVDSzogYWxsWmVybzY0OgorLy8gQ0hFQ0s6IHVtYXh2LjhiIGJbW1JFR05PMTpbMC05XStdXSwgdjAKKy8vIENIRUNLLU5FWFQ6IGZtb3Ygd1tbUkVHTk8yOlswLTldK11dLCBzW1tSRUdOTzFdXQorLy8gQ0hFQ0stTkVYVDogY2J6IHdbW1JFR05PMl1dLCBbW0xBQkVMOlsuQS1aXzAtOV0rXV0KKy8vIENIRUNLOiBbW0xBQkVMXV06CisvLyBDSEVDSy1ORVhUOiBiIHt7X2JhcnxiYXJ9fQorICBpZiAoIXZtYXh2X3U4KGEpKQorICAgIHJldHVybiBiYXIoKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIEJyYW5jaCBpZiBhbGwgbGFuZXMgb2YgVjAgYXJlIHplcm87IDEyOCBiaXQgPT4gIW1heAordW5zaWduZWQgYWxsWmVybzEyOCh1aW50MTZ4OF90IGEpIHsKKy8vIENIRUNLOiBhbGxaZXJvMTI4OgorLy8gQ0hFQ0s6IHVtYXh2LjE2YiBiW1tSRUdOTzE6WzAtOV0rXV0sIHYwCisvLyBDSEVDSy1ORVhUOiBmbW92IHdbW1JFR05PMjpbMC05XStdXSwgc1tbUkVHTk8xXV0KKy8vIENIRUNLLU5FWFQ6IGNieiB3W1tSRUdOTzJdXSwgW1tMQUJFTDpbLkEtWl8wLTldK11dCisvLyBDSEVDSzogW1tMQUJFTF1dOgorLy8gQ0hFQ0stTkVYVDogYiB7e19iYXJ8YmFyfX0KKyAgaWYgKCF2bWF4dnFfdTgoYSkpCisgICAgcmV0dXJuIGJhcigpOworICByZXR1cm4gMDsKK30KKworLy8gQnJhbmNoIGlmIGFsbCBsYW5lcyBvZiBWMCBhcmUgbm9uLXplcm87IDY0IGJpdCA9PiBtaW4KK3Vuc2lnbmVkIGFsbE5vblplcm82NCh1aW50MTZ4NF90IGEpIHsKKy8vIENIRUNLOiBhbGxOb25aZXJvNjQ6CisvLyBDSEVDSzogdW1pbnYuOGIgYltbUkVHTk8xOlswLTldK11dLCB2MAorLy8gQ0hFQ0stTkVYVDogZm1vdiB3W1tSRUdOTzI6WzAtOV0rXV0sIHNbW1JFR05PMV1dCisvLyBDSEVDSy1ORVhUOiBjYnogd1tbUkVHTk8yXV0sIFtbTEFCRUw6Wy5BLVpfMC05XStdXQorLy8gQ0hFQ0s6IFtbTEFCRUxdXToKKy8vIENIRUNLLU5FWFQ6IG1vdnogdzAsICMwCisgIGlmICh2bWludl91OChhKSkKKyAgICByZXR1cm4gYmFyKCk7CisgIHJldHVybiAwOworfQorCisvLyBCcmFuY2ggaWYgYWxsIGxhbmVzIG9mIFYwIGFyZSBub24temVybzsgMTI4IGJpdCA9PiBtaW4KK3Vuc2lnbmVkIGFsbE5vblplcm8xMjgodWludDE2eDhfdCBhKSB7CisvLyBDSEVDSzogYWxsTm9uWmVybzEyODoKKy8vIENIRUNLOiB1bWludi4xNmIgYltbUkVHTk8xOlswLTldK11dLCB2MAorLy8gQ0hFQ0stTkVYVDogZm1vdiB3W1tSRUdOTzI6WzAtOV0rXV0sIHNbW1JFR05PMV1dCisvLyBDSEVDSy1ORVhUOiBjYnogd1tbUkVHTk8yXV0sIFtbTEFCRUw6Wy5BLVpfMC05XStdXQorLy8gQ0hFQ0s6IFtbTEFCRUxdXToKKy8vIENIRUNLLU5FWFQ6IG1vdnogdzAsICMwCisgIGlmICh2bWludnFfdTgoYSkpCisgICAgcmV0dXJuIGJhcigpOworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0X3ZleHQuYyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmZjQ4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92ZXh0LmMKQEAgLTAsMCArMSwyMzkgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisKKy8vIFRlc3QgQVJNNjQgZXh0cmFjdCBpbnRyaW5zaWNzCisvLyBjYW4gdXNlIGFzIGJhY2sgZW5kIHRlc3QgYnkgYWRkaW5nIGEgcnVuIGxpbmUgd2l0aAorLy8gLWNoZWNrLXByZWZpeD1DSEVDSy1DT0RFR0VOIG9uIHRoZSBGaWxlQ2hlY2sKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK3ZvaWQgdGVzdF92ZXh0X3M4KCkKK3sKKyAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF9zOAorICBpbnQ4eDhfdCB4Uzh4ODsKKyAgeFM4eDggPSB2ZXh0X3M4KHhTOHg4LCB4Uzh4OCwgMSk7CisgIC8vIENIRUNLOiBzaHVmZmxldmVjdG9yCisgIC8vIENIRUNLLUNPREVHRU46IHRlc3RfdmV4dF9zODoKKyAgLy8gQ0hFQ0stQ09ERUdFTjoge3tleHQuOC4qIzF9fQorfQorCit2b2lkIHRlc3RfdmV4dF91OCgpCit7CisgIC8vIENIRUNLOiB0ZXN0X3ZleHRfdTgKKyAgdWludDh4OF90IHhVOHg4OworICB4VTh4OCA9IHZleHRfdTgoeFU4eDgsIHhVOHg4LCAyKTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IKKyAgLy8gQ0hFQ0stQ09ERUdFTjogdGVzdF92ZXh0X3U4OgorICAvLyBDSEVDSy1DT0RFR0VOOiB7e2V4dC44LiojMn19Cit9CisKK3ZvaWQgdGVzdF92ZXh0X3A4KCkKK3sKKyAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF9wOAorICBwb2x5OHg4X3QgeFA4eDg7CisgIHhQOHg4ID0gdmV4dF9wOCh4UDh4OCwgeFA4eDgsIDMpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvcgorICAvLyBDSEVDSy1DT0RFR0VOOiB0ZXN0X3ZleHRfcDg6CisgIC8vIENIRUNLLUNPREVHRU46IHt7ZXh0LjguKiMzfX0KK30KKwordm9pZCB0ZXN0X3ZleHRfczE2KCkKK3sKKyAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF9zMTYKKyAgaW50MTZ4NF90IHhTMTZ4NDsKKyAgeFMxNng0ID0gdmV4dF9zMTYoeFMxNng0LCB4UzE2eDQsIDEpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvcgorICAvLyBDSEVDSy1DT0RFR0VOOiB0ZXN0X3ZleHRfczE2OgorICAvLyBDSEVDSy1DT0RFR0VOOiB7e2V4dC44LiojMn19Cit9CisKK3ZvaWQgdGVzdF92ZXh0X3UxNigpCit7CisgIC8vIENIRUNLOiB0ZXN0X3ZleHRfdTE2CisgIHVpbnQxNng0X3QgeFUxNng0OworICB4VTE2eDQgPSB2ZXh0X3UxNih4VTE2eDQsIHhVMTZ4NCwgMik7CisgIC8vIENIRUNLOiBzaHVmZmxldmVjdG9yCisgIC8vIENIRUNLLUNPREVHRU46IHRlc3RfdmV4dF91MTY6CisgIC8vIENIRUNLLUNPREVHRU46IHt7ZXh0LjguKiM0fX0KK30KKwordm9pZCB0ZXN0X3ZleHRfcDE2KCkKK3sKKyAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF9wMTYKKyAgcG9seTE2eDRfdCB4UDE2eDQ7CisgIHhQMTZ4NCA9IHZleHRfcDE2KHhQMTZ4NCwgeFAxNng0LCAzKTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IKKyAgLy8gQ0hFQ0stQ09ERUdFTjogdGVzdF92ZXh0X3AxNjoKKyAgLy8gQ0hFQ0stQ09ERUdFTjoge3tleHQuOC4qIzZ9fQorfQorCit2b2lkIHRlc3RfdmV4dF9zMzIoKQoreworICAvLyBDSEVDSzogdGVzdF92ZXh0X3MzMgorICBpbnQzMngyX3QgeFMzMngyOworICB4UzMyeDIgPSB2ZXh0X3MzMih4UzMyeDIsIHhTMzJ4MiwgMSk7CisgIC8vIENIRUNLOiBzaHVmZmxldmVjdG9yCisgIC8vIENIRUNLLUNPREVHRU46IHRlc3RfdmV4dF9zMzI6CisgIC8vIENIRUNLLUNPREVHRU46IHt7ZXh0LjguKiM0fX0KK30KKwordm9pZCB0ZXN0X3ZleHRfdTMyKCkKK3sKKyAgLy8gQ0hFQ0s6IHRlc3RfdmV4dF91MzIKKyAgdWludDMyeDJfdCB4VTMyeDI7CisgIHhVMzJ4MiA9IHZleHRfdTMyKHhVMzJ4MiwgeFUzMngyLCAxKTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IKKyAgLy8gQ0hFQ0stQ09ERUdFTjogdGVzdF92ZXh0X3UzMjoKKyAgLy8gQ0hFQ0stQ09ERUdFTjoge3tleHQuOC4qIzR9fQorfQorCit2b2lkIHRlc3RfdmV4dF9mMzIoKQoreworICAvLyBDSEVDSzogdGVzdF92ZXh0X2YzMgorICBmbG9hdDMyeDJfdCB4RjMyeDI7CisgIHhGMzJ4MiA9IHZleHRfZjMyKHhGMzJ4MiwgeEYzMngyLCAxKTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IKKyAgLy8gQ0hFQ0stQ09ERUdFTjogdGVzdF92ZXh0X2YzMjoKKyAgLy8gQ0hFQ0stQ09ERUdFTjoge3tleHQuOC4qIzR9fQorfQorCit2b2lkIHRlc3RfdmV4dF9zNjQoKQoreworICAvLyBDSEVDSzogdGVzdF92ZXh0X3M2NAorICBpbnQ2NHgxX3QgeFM2NHgxOworICAvLyBGSVhNRSBkb24ndCB1c2UgMSBhcyBpbmRleCBvciBjaGVjayBmb3Igbm93LCBjbGFuZyBoYXMgYSBidWc/CisgIHhTNjR4MSA9IHZleHRfczY0KHhTNjR4MSwgeFM2NHgxLCAvKjEqLzApOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvcgorICAvLyBDSEVDSy1DT0RFR0VOOiB0ZXN0X3ZleHRfczY0OgorICAvLyBDSEVDS19GSVhNRToge3tleHQuOC4qIzB9fQorfQorCit2b2lkIHRlc3RfdmV4dF91NjQoKQoreworICAvLyBDSEVDSzogdGVzdF92ZXh0X3U2NAorICB1aW50NjR4MV90IHhVNjR4MTsKKyAgLy8gRklYTUUgZG9uJ3QgdXNlIDEgYXMgaW5kZXggb3IgY2hlY2sgZm9yIG5vdywgY2xhbmcgaGFzIGEgYnVnPworICB4VTY0eDEgPSB2ZXh0X3U2NCh4VTY0eDEsIHhVNjR4MSwgLyoxKi8wKTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IKKyAgLy8gQ0hFQ0stQ09ERUdFTjogdGVzdF92ZXh0X3U2NDoKKyAgLy8gQ0hFQ0tfRklYTUU6IHt7ZXh0LjguKiMwfX0KK30KKwordm9pZCB0ZXN0X3ZleHRxX3M4KCkKK3sKKyAgLy8gQ0hFQ0s6IHRlc3RfdmV4dHFfczgKKyAgaW50OHgxNl90IHhTOHgxNjsKKyAgeFM4eDE2ID0gdmV4dHFfczgoeFM4eDE2LCB4Uzh4MTYsIDQpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvcgorICAvLyBDSEVDSy1DT0RFR0VOOiB0ZXN0X3ZleHRxX3M4OgorICAvLyBDSEVDSy1DT0RFR0VOOiB7e2V4dC4xNi4qIzR9fQorfQorCit2b2lkIHRlc3RfdmV4dHFfdTgoKQoreworICAvLyBDSEVDSzogdGVzdF92ZXh0cV91OAorICB1aW50OHgxNl90IHhVOHgxNjsKKyAgeFU4eDE2ID0gdmV4dHFfdTgoeFU4eDE2LCB4VTh4MTYsIDUpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvcgorICAvLyBDSEVDSy1DT0RFR0VOOiB0ZXN0X3ZleHRxX3U4OgorICAvLyBDSEVDSy1DT0RFR0VOOiB7e2V4dC4xNi4qIzV9fQorfQorCit2b2lkIHRlc3RfdmV4dHFfcDgoKQoreworICAvLyBDSEVDSzogdGVzdF92ZXh0cV9wOAorICBwb2x5OHgxNl90IHhQOHgxNjsKKyAgeFA4eDE2ID0gdmV4dHFfcDgoeFA4eDE2LCB4UDh4MTYsIDYpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvcgorICAvLyBDSEVDSy1DT0RFR0VOOiB0ZXN0X3ZleHRxX3A4OgorICAvLyBDSEVDSy1DT0RFR0VOOiB7e2V4dC4xNi4qIzZ9fQorfQorCit2b2lkIHRlc3RfdmV4dHFfczE2KCkKK3sKKyAgLy8gQ0hFQ0s6IHRlc3RfdmV4dHFfczE2CisgIGludDE2eDhfdCB4UzE2eDg7CisgIHhTMTZ4OCA9IHZleHRxX3MxNih4UzE2eDgsIHhTMTZ4OCwgNyk7CisgIC8vIENIRUNLOiBzaHVmZmxldmVjdG9yCisgIC8vIENIRUNLLUNPREVHRU46IHRlc3RfdmV4dHFfczE2OgorICAvLyBDSEVDSy1DT0RFR0VOOiB7e2V4dC4xNi4qIzE0fX0KK30KKwordm9pZCB0ZXN0X3ZleHRxX3UxNigpCit7CisgIC8vIENIRUNLOiB0ZXN0X3ZleHRxX3UxNgorICB1aW50MTZ4OF90IHhVMTZ4ODsKKyAgeFUxNng4ID0gdmV4dHFfdTE2KHhVMTZ4OCwgeFUxNng4LCA0KTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IKKyAgLy8gQ0hFQ0stQ09ERUdFTjogdGVzdF92ZXh0cV91MTY6CisgIC8vIENIRUNLLUNPREVHRU46IHt7ZXh0LjE2LiojOH19Cit9CisKK3ZvaWQgdGVzdF92ZXh0cV9wMTYoKQoreworICAvLyBDSEVDSzogdGVzdF92ZXh0cV9wMTYKKyAgcG9seTE2eDhfdCB4UDE2eDg7CisgIHhQMTZ4OCA9IHZleHRxX3AxNih4UDE2eDgsIHhQMTZ4OCwgNSk7CisgIC8vIENIRUNLOiBzaHVmZmxldmVjdG9yCisgIC8vIENIRUNLLUNPREVHRU46IHRlc3RfdmV4dHFfcDE2OgorICAvLyBDSEVDSy1DT0RFR0VOOiB7e2V4dC4xNi4qIzEwfX0KK30KKwordm9pZCB0ZXN0X3ZleHRxX3MzMigpCit7CisgIC8vIENIRUNLOiB0ZXN0X3ZleHRxX3MzMgorICBpbnQzMng0X3QgeFMzMng0OworICB4UzMyeDQgPSB2ZXh0cV9zMzIoeFMzMng0LCB4UzMyeDQsIDEpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvcgorICAvLyBDSEVDSy1DT0RFR0VOOiB0ZXN0X3ZleHRxX3MzMjoKKyAgLy8gQ0hFQ0stQ09ERUdFTjoge3tleHQuMTYuKiM0fX0KK30KKwordm9pZCB0ZXN0X3ZleHRxX3UzMigpCit7CisgIC8vIENIRUNLOiB0ZXN0X3ZleHRxX3UzMgorICB1aW50MzJ4NF90IHhVMzJ4NDsKKyAgeFUzMng0ID0gdmV4dHFfdTMyKHhVMzJ4NCwgeFUzMng0LCAyKTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IKKyAgLy8gQ0hFQ0stQ09ERUdFTjogdGVzdF92ZXh0cV91MzI6CisgIC8vIENIRUNLLUNPREVHRU46IHt7ZXh0LjE2LiojOH19Cit9CisKK3ZvaWQgdGVzdF92ZXh0cV9mMzIoKQoreworICAvLyBDSEVDSzogdGVzdF92ZXh0cV9mMzIKKyAgZmxvYXQzMng0X3QgeEYzMng0OworICB4RjMyeDQgPSB2ZXh0cV9mMzIoeEYzMng0LCB4RjMyeDQsIDMpOworICAvLyBDSEVDSzogc2h1ZmZsZXZlY3RvcgorICAvLyBDSEVDSy1DT0RFR0VOOiB0ZXN0X3ZleHRxX2YzMjoKKyAgLy8gQ0hFQ0stQ09ERUdFTjoge3tleHQuMTYuKiMxMn19Cit9CisKK3ZvaWQgdGVzdF92ZXh0cV9zNjQoKQoreworICAvLyBDSEVDSzogdGVzdF92ZXh0cV9zNjQKKyAgaW50NjR4Ml90IHhTNjR4MjsKKyAgeFM2NHgyID0gdmV4dHFfczY0KHhTNjR4MiwgeFM2NHgyLCAxKTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IKKyAgLy8gQ0hFQ0stQ09ERUdFTjogdGVzdF92ZXh0cV9zNjQ6CisgIC8vIENIRUNLLUNPREVHRU46IHt7ZXh0LjE2LiojOH19Cit9CisKK3ZvaWQgdGVzdF92ZXh0cV91NjQoKQoreworICAvLyBDSEVDSzogdGVzdF92ZXh0cV91NjQKKyAgdWludDY0eDJfdCB4VTY0eDI7CisgIHhVNjR4MiA9IHZleHRxX3U2NCh4VTY0eDIsIHhVNjR4MiwgMSk7CisgIC8vIENIRUNLOiBzaHVmZmxldmVjdG9yCisgIC8vIENIRUNLLUNPREVHRU46IHRlc3RfdmV4dHFfdTY0OgorICAvLyBDSEVDSy1DT0RFR0VOOiB7e2V4dC4xNi4qIzh9fQorfQorCit2b2lkIHRlc3RfdmV4dHFfZjY0KCkKK3sKKyAgLy8gQ0hFQ0s6IHRlc3RfdmV4dHFfZjY0CisgIGZsb2F0NjR4Ml90IHhGNjR4MjsKKyAgeEY2NHgyID0gdmV4dHFfZjY0KHhGNjR4MiwgeEY2NHgyLCAxKTsKKyAgLy8gQ0hFQ0s6IHNodWZmbGV2ZWN0b3IKKyAgLy8gQ0hFQ0stQ09ERUdFTjogdGVzdF92ZXh0cV91NjQ6CisgIC8vIENIRUNLLUNPREVHRU46IHt7ZXh0LjE2LiojOH19Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYXJtNjRfdmZtYS5jIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZmbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTcxNjFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZmbWEuYwpAQCAtMCwwICsxLDEzNiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1PMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisvLyBUZXN0IEFSTTY0IFNJTUQgZnVzZWQgbXVsdGlwbHkgYWRkIGludHJpbnNpY3MKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK2Zsb2F0MzJ4Ml90IHRlc3RfdmZtYV9mMzIoZmxvYXQzMngyX3QgYTEsIGZsb2F0MzJ4Ml90IGEyLCBmbG9hdDMyeDJfdCBhMykgeworICAvLyBDSEVDSzogdGVzdF92Zm1hX2YzMgorICByZXR1cm4gdmZtYV9mMzIoYTEsIGEyLCBhMyk7CisgIC8vIENIRUNLOiBsbHZtLmZtYS52MmYzMih7ey4qYTIsIC4qYTMsIC4qYTF9fSkKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2Zsb2F0MzJ4NF90IHRlc3RfdmZtYXFfZjMyKGZsb2F0MzJ4NF90IGExLCBmbG9hdDMyeDRfdCBhMiwgZmxvYXQzMng0X3QgYTMpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmZtYXFfZjMyCisgIHJldHVybiB2Zm1hcV9mMzIoYTEsIGEyLCBhMyk7CisgIC8vIENIRUNLOiBsbHZtLmZtYS52NGYzMih7ey4qYTIsIC4qYTMsIC4qYTF9fSkKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2Zsb2F0NjR4Ml90IHRlc3RfdmZtYXFfZjY0KGZsb2F0NjR4Ml90IGExLCBmbG9hdDY0eDJfdCBhMiwgZmxvYXQ2NHgyX3QgYTMpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmZtYXFfZjY0CisgIHJldHVybiB2Zm1hcV9mNjQoYTEsIGEyLCBhMyk7CisgIC8vIENIRUNLOiBsbHZtLmZtYS52MmY2NCh7ey4qYTIsIC4qYTMsIC4qYTF9fSkKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2Zsb2F0MzJ4Ml90IHRlc3RfdmZtYV9sYW5lX2YzMihmbG9hdDMyeDJfdCBhMSwgZmxvYXQzMngyX3QgYTIsIGZsb2F0MzJ4Ml90IGEzKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZmbWFfbGFuZV9mMzIKKyAgcmV0dXJuIHZmbWFfbGFuZV9mMzIoYTEsIGEyLCBhMywgMSk7CisgIC8vIE5COiB0aGUgdGVzdCBiZWxvdyBpcyBkZWxpYmVyYXRlbHkgbG9zZSwgc28gdGhhdCB3ZSBkb24ndCBkZXBlbmQgdG9vIG11Y2gKKyAgLy8gdXBvbiB0aGUgZXhhY3QgSVIgdXNlZCB0byBzZWxlY3QgbGFuZSAxICh1c3VhbGx5IGEgc2h1ZmZsZXZlY3RvcikKKyAgLy8gQ0hFQ0s6IGxsdm0uZm1hLnYyZjMyKDwyIHggZmxvYXQ+ICVhMiwgPDIgeCBmbG9hdD4ge3suKn19LCA8MiB4IGZsb2F0PiAlYTEpCisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCitmbG9hdDMyeDRfdCB0ZXN0X3ZmbWFxX2xhbmVfZjMyKGZsb2F0MzJ4NF90IGExLCBmbG9hdDMyeDRfdCBhMiwgZmxvYXQzMngyX3QgYTMpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmZtYXFfbGFuZV9mMzIKKyAgcmV0dXJuIHZmbWFxX2xhbmVfZjMyKGExLCBhMiwgYTMsIDEpOworICAvLyBOQjogdGhlIHRlc3QgYmVsb3cgaXMgZGVsaWJlcmF0ZWx5IGxvc2UsIHNvIHRoYXQgd2UgZG9uJ3QgZGVwZW5kIHRvbyBtdWNoCisgIC8vIHVwb24gdGhlIGV4YWN0IElSIHVzZWQgdG8gc2VsZWN0IGxhbmUgMSAodXN1YWxseSBhIHNodWZmbGV2ZWN0b3IpCisgIC8vIENIRUNLOiBsbHZtLmZtYS52NGYzMig8NCB4IGZsb2F0PiAlYTIsIDw0IHggZmxvYXQ+IHt7Lip9fSwgPDQgeCBmbG9hdD4gJWExKQorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KKworZmxvYXQ2NHgyX3QgdGVzdF92Zm1hcV9sYW5lX2Y2NChmbG9hdDY0eDJfdCBhMSwgZmxvYXQ2NHgyX3QgYTIsIGZsb2F0NjR4MV90IGEzKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZmbWFxX2xhbmVfZjY0CisgIHJldHVybiB2Zm1hcV9sYW5lX2Y2NChhMSwgYTIsIGEzLCAwKTsKKyAgLy8gTkI6IHRoZSB0ZXN0IGJlbG93IGlzIGRlbGliZXJhdGVseSBsb3NlLCBzbyB0aGF0IHdlIGRvbid0IGRlcGVuZCB0b28gbXVjaAorICAvLyB1cG9uIHRoZSBleGFjdCBJUiB1c2VkIHRvIHNlbGVjdCBsYW5lIDEgKHVzdWFsbHkgYSBzaHVmZmxldmVjdG9yKQorICAvLyBDSEVDSzogbGx2bS5mbWEudjJmNjQoPDIgeCBkb3VibGU+ICVhMiwgPDIgeCBkb3VibGU+IHt7Lip9fSwgPDIgeCBkb3VibGU+ICVhMSkKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2Zsb2F0MzJ4Ml90IHRlc3RfdmZtYV9uX2YzMihmbG9hdDMyeDJfdCBhMSwgZmxvYXQzMngyX3QgYTIsIGZsb2F0MzJfdCBhMykgeworICAvLyBDSEVDSzogdGVzdF92Zm1hX25fZjMyCisgIHJldHVybiB2Zm1hX25fZjMyKGExLCBhMiwgYTMpOworICAvLyBOQjogdGhlIHRlc3QgYmVsb3cgaXMgZGVsaWJlcmF0ZWx5IGxvc2UsIHNvIHRoYXQgd2UgZG9uJ3QgZGVwZW5kIHRvbyBtdWNoCisgIC8vIHVwb24gdGhlIGV4YWN0IElSIHVzZWQgdG8gc2VsZWN0IGxhbmUgMCAodXN1YWxseSB0d28gaW5zZXJ0ZWxlbWVudHMpCisgIC8vIENIRUNLOiBsbHZtLmZtYS52MmYzMgorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KKworZmxvYXQzMng0X3QgdGVzdF92Zm1hcV9uX2YzMihmbG9hdDMyeDRfdCBhMSwgZmxvYXQzMng0X3QgYTIsIGZsb2F0MzJfdCBhMykgeworICAvLyBDSEVDSzogdGVzdF92Zm1hcV9uX2YzMgorICByZXR1cm4gdmZtYXFfbl9mMzIoYTEsIGEyLCBhMyk7CisgIC8vIE5COiB0aGUgdGVzdCBiZWxvdyBpcyBkZWxpYmVyYXRlbHkgbG9zZSwgc28gdGhhdCB3ZSBkb24ndCBkZXBlbmQgdG9vIG11Y2gKKyAgLy8gdXBvbiB0aGUgZXhhY3QgSVIgdXNlZCB0byBzZWxlY3QgbGFuZSAwICh1c3VhbGx5IGZvdXIgaW5zZXJ0ZWxlbWVudHMpCisgIC8vIENIRUNLOiBsbHZtLmZtYS52NGYzMgorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KKworZmxvYXQ2NHgyX3QgdGVzdF92Zm1hcV9uX2Y2NChmbG9hdDY0eDJfdCBhMSwgZmxvYXQ2NHgyX3QgYTIsIGZsb2F0NjRfdCBhMykgeworICAvLyBDSEVDSzogdGVzdF92Zm1hcV9uX2Y2NAorICByZXR1cm4gdmZtYXFfbl9mNjQoYTEsIGEyLCBhMyk7CisgIC8vIE5COiB0aGUgdGVzdCBiZWxvdyBpcyBkZWxpYmVyYXRlbHkgbG9zZSwgc28gdGhhdCB3ZSBkb24ndCBkZXBlbmQgdG9vIG11Y2gKKyAgLy8gdXBvbiB0aGUgZXhhY3QgSVIgdXNlZCB0byBzZWxlY3QgbGFuZSAwICh1c3VhbGx5IHR3byBpbnNlcnRlbGVtZW50cykKKyAgLy8gQ0hFQ0s6IGxsdm0uZm1hLnYyZjY0CisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCitmbG9hdDMyeDJfdCB0ZXN0X3ZmbXNfZjMyKGZsb2F0MzJ4Ml90IGExLCBmbG9hdDMyeDJfdCBhMiwgZmxvYXQzMngyX3QgYTMpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmZtc19mMzIKKyAgcmV0dXJuIHZmbXNfZjMyKGExLCBhMiwgYTMpOworICAvLyBDSEVDSzogW1tORUc6JS4qXV0gPSBmc3ViIDwyIHggZmxvYXQ+IHt7Lip9fSwgJWEyCisgIC8vIENIRUNLOiBsbHZtLmZtYS52MmYzMig8MiB4IGZsb2F0PiAlYTMsIDwyIHggZmxvYXQ+IFtbTkVHXV0sIDwyIHggZmxvYXQ+ICVhMSkKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2Zsb2F0MzJ4NF90IHRlc3RfdmZtc3FfZjMyKGZsb2F0MzJ4NF90IGExLCBmbG9hdDMyeDRfdCBhMiwgZmxvYXQzMng0X3QgYTMpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmZtc3FfZjMyCisgIHJldHVybiB2Zm1zcV9mMzIoYTEsIGEyLCBhMyk7CisgIC8vIENIRUNLOiBbW05FRzolLipdXSA9IGZzdWIgPDQgeCBmbG9hdD4ge3suKn19LCAlYTIKKyAgLy8gQ0hFQ0s6IGxsdm0uZm1hLnY0ZjMyKDw0IHggZmxvYXQ+ICVhMywgPDQgeCBmbG9hdD4gW1tORUddXSwgPDQgeCBmbG9hdD4gJWExKQorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KKworZmxvYXQ2NHgyX3QgdGVzdF92Zm1zcV9mNjQoZmxvYXQ2NHgyX3QgYTEsIGZsb2F0NjR4Ml90IGEyLCBmbG9hdDY0eDJfdCBhMykgeworICAvLyBDSEVDSzogdGVzdF92Zm1zcV9mNjQKKyAgcmV0dXJuIHZmbXNxX2Y2NChhMSwgYTIsIGEzKTsKKyAgLy8gQ0hFQ0s6IFtbTkVHOiUuKl1dID0gZnN1YiA8MiB4IGRvdWJsZT4ge3suKn19LCAlYTIKKyAgLy8gQ0hFQ0s6IGxsdm0uZm1hLnYyZjY0KDwyIHggZG91YmxlPiAlYTMsIDwyIHggZG91YmxlPiBbW05FR11dLCA8MiB4IGRvdWJsZT4gJWExKQorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KKworZmxvYXQzMngyX3QgdGVzdF92Zm1zX2xhbmVfZjMyKGZsb2F0MzJ4Ml90IGExLCBmbG9hdDMyeDJfdCBhMiwgZmxvYXQzMngyX3QgYTMpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmZtc19sYW5lX2YzMgorICByZXR1cm4gdmZtc19sYW5lX2YzMihhMSwgYTIsIGEzLCAxKTsKKyAgLy8gTkI6IHRoZSB0ZXN0IGJlbG93IGlzIGRlbGliZXJhdGVseSBsb3NlLCBzbyB0aGF0IHdlIGRvbid0IGRlcGVuZCB0b28gbXVjaAorICAvLyB1cG9uIHRoZSBleGFjdCBJUiB1c2VkIHRvIHNlbGVjdCBsYW5lIDEgKHVzdWFsbHkgYSBzaHVmZmxldmVjdG9yKQorICAvLyBDSEVDSzogW1tORUc6JS4qXV0gPSBmc3ViIDwyIHggZmxvYXQ+IHt7Lip9fSwgJWEzCisgIC8vIENIRUNLOiBbW0xBTkU6JS4qXV0gPSBzaHVmZmxldmVjdG9yIDwyIHggZmxvYXQ+IFtbTkVHXV0KKyAgLy8gQ0hFQ0s6IGxsdm0uZm1hLnYyZjMyKDwyIHggZmxvYXQ+IHt7Lip9fSwgPDIgeCBmbG9hdD4gW1tMQU5FXV0sIDwyIHggZmxvYXQ+ICVhMSkKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2Zsb2F0MzJ4NF90IHRlc3RfdmZtc3FfbGFuZV9mMzIoZmxvYXQzMng0X3QgYTEsIGZsb2F0MzJ4NF90IGEyLCBmbG9hdDMyeDJfdCBhMykgeworICAvLyBDSEVDSzogdGVzdF92Zm1zcV9sYW5lX2YzMgorICByZXR1cm4gdmZtc3FfbGFuZV9mMzIoYTEsIGEyLCBhMywgMSk7CisgIC8vIE5COiB0aGUgdGVzdCBiZWxvdyBpcyBkZWxpYmVyYXRlbHkgbG9zZSwgc28gdGhhdCB3ZSBkb24ndCBkZXBlbmQgdG9vIG11Y2gKKyAgLy8gdXBvbiB0aGUgZXhhY3QgSVIgdXNlZCB0byBzZWxlY3QgbGFuZSAxICh1c3VhbGx5IGEgc2h1ZmZsZXZlY3RvcikKKyAgLy8gQ0hFQ0s6IFtbTkVHOiUuKl1dID0gZnN1YiA8MiB4IGZsb2F0PiB7ey4qfX0sICVhMworICAvLyBDSEVDSzogW1tMQU5FOiUuKl1dID0gc2h1ZmZsZXZlY3RvciA8MiB4IGZsb2F0PiBbW05FR11dCisgIC8vIENIRUNLOiBsbHZtLmZtYS52NGYzMig8NCB4IGZsb2F0PiB7ey4qfX0sIDw0IHggZmxvYXQ+IFtbTEFORV1dLCA8NCB4IGZsb2F0PiAlYTEpCisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQorCitmbG9hdDY0eDJfdCB0ZXN0X3ZmbXNxX2xhbmVfZjY0KGZsb2F0NjR4Ml90IGExLCBmbG9hdDY0eDJfdCBhMiwgZmxvYXQ2NHgxX3QgYTMpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdmZtc3FfbGFuZV9mNjQKKyAgcmV0dXJuIHZmbXNxX2xhbmVfZjY0KGExLCBhMiwgYTMsIDApOworICAvLyBOQjogdGhlIHRlc3QgYmVsb3cgaXMgZGVsaWJlcmF0ZWx5IGxvc2UsIHNvIHRoYXQgd2UgZG9uJ3QgZGVwZW5kIHRvbyBtdWNoCisgIC8vIHVwb24gdGhlIGV4YWN0IElSIHVzZWQgdG8gc2VsZWN0IGxhbmUgMSAodXN1YWxseSBhIHNodWZmbGV2ZWN0b3IpCisgIC8vIENIRUNLOiBbW05FRzolLipdXSA9IGZzdWIgPDEgeCBkb3VibGU+IHt7Lip9fSwgJWEzCisgIC8vIENIRUNLOiBbW0xBTkU6JS4qXV0gPSBzaHVmZmxldmVjdG9yIDwxIHggZG91YmxlPiBbW05FR11dCisgIC8vIENIRUNLOiBsbHZtLmZtYS52MmY2NCg8MiB4IGRvdWJsZT4ge3suKn19LCA8MiB4IGRvdWJsZT4gW1tMQU5FXV0sIDwyIHggZG91YmxlPiAlYTEpCisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0X3ZnZXQuYyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92Z2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjN2RhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92Z2V0LmMKQEAgLTAsMCArMSwxMyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1PMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisvLyBUZXN0IEFSTTY0IFNJTUQgdmdldCBpbnRyaW5zaWNzCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCitmbG9hdDY0X3QgdGVzdF92Z2V0X2xhbmVfZjY0KGZsb2F0NjR4MV90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZnZXRfbGFuZV9mNjQKKyAgLy8gd2h5IGlzbid0IDEgYWxsb3dlZCBhcyBzZWNvbmQgYXJndW1lbnQ/CisgIHJldHVybiB2Z2V0X2xhbmVfZjY0KGExLCAwKTsKKyAgLy8gQ0hFQ0s6IGV4dHJhY3RlbGVtZW50IHt7Lip9fSBpMzIgMAorICAvLyBDSEVDSy1ORVhUOiByZXQKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0X3ZuZWcuYyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92bmVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiOWUxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92bmVnLmMKQEAgLTAsMCArMSwxOCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1PMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisvLyBUZXN0IEFSTTY0IFNJTUQgbmVnYXRlIGFuZCBzYXR1cmF0aW5nIG5lZ2F0ZSBpbnRyaW5zaWNzCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCitpbnQ2NHgyX3QgdGVzdF92bmVncV9zNjQoaW50NjR4Ml90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZuZWdxX3M2NAorICByZXR1cm4gdm5lZ3FfczY0KGExKTsKKyAgLy8gQ0hFQ0s6IHN1YiA8MiB4IGk2ND4gemVyb2luaXRpYWxpemVyLCAlYTEKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKK2ludDY0eDJfdCB0ZXN0X3ZxbmVncV9zNjQoaW50NjR4Ml90IGExKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZxbmVncV9zNjQKKyAgcmV0dXJuIHZxbmVncV9zNjQoYTEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnNxbmVnLnYyaTY0CisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0X3ZxbW92LmMgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdnFtb3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGMwNjA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZxbW92LmMKQEAgLTAsMCArMSw3NyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1PMyAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLy8gVGVzdCB2cW1vdlt1XW5faGlnaF88c3U+ezE2LDMyLDY0KSBBUk02NCBpbnRyaW5zaWNzCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCisvLyB2cW1vdm5faGlnaF9zMTYgLT4gVVFYVE4yIFZkLjE2YixWbi44aAoraW50OHgxNl90IHRlc3RfdnFtb3ZuX2hpZ2hfczE2KGludDh4OF90IFZkbG93LCBpbnQxNng4X3QgVm4pCit7CisgICAgcmV0dXJuIHZxbW92bl9oaWdoX3MxNihWZGxvdywgVm4pOworICAvLyBDSEVDSzogdGVzdF92cW1vdm5faGlnaF9zMTY6CisgIC8vIENIRUNLOiBzcXh0bjIuMTZiIHt7dlswLTldWzAtOV0qfX0sIHt7dlswLTldWzAtOV0qfX0KK30KKworLy8gdnFtb3Z1bl9oaWdoX3MxNiAtPiBVUVhUTjIgVmQuMTZiLFZuLjhoCit1aW50OHgxNl90IHRlc3RfdnFtb3Z1bl9oaWdoX3MxNih1aW50OHg4X3QgVmRsb3csIHVpbnQxNng4X3QgVm4pCit7CisgICAgcmV0dXJuIHZxbW92dW5faGlnaF9zMTYoVmRsb3csIFZuKTsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3Z1bl9oaWdoX3MxNjoKKyAgLy8gQ0hFQ0s6IHNxeHR1bjIuMTZiIHt7dlswLTldWzAtOV0qfX0sIHt7dlswLTldWzAtOV0qfX0KK30KKworLy8gdnFtb3ZuX2hpZ2hfczMyIC0+IFNRWFROMiBWZC44aCxWbi40cworaW50MTZ4OF90IHRlc3RfdnFtb3ZuX2hpZ2hfczMyKGludDE2eDRfdCBWZGxvdywgaW50MzJ4NF90IFZuKQoreworICAgIHJldHVybiB2cW1vdm5faGlnaF9zMzIoVmRsb3csIFZuKTsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3ZuX2hpZ2hfczMyOgorICAvLyBDSEVDSzogc3F4dG4yLjhoIHt7dlswLTldWzAtOV0qfX0sIHt7dlswLTldWzAtOV0qfX0KK30KKworLy8gdnFtb3ZuX2hpZ2hfdTMyIC0+IFVRWFROMiBWZC44aCxWbi40cwordWludDE2eDhfdCB0ZXN0X3ZxbW92bl9oaWdoX3UzMih1aW50MTZ4NF90IFZkbG93LCB1aW50MzJ4NF90IFZuKQoreworICAgIHJldHVybiB2cW1vdm5faGlnaF91MzIoVmRsb3csIFZuKTsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3ZuX2hpZ2hfdTMyOgorICAvLyBDSEVDSzogdXF4dG4yLjhoIHt7dlswLTldWzAtOV0qfX0sIHt7dlswLTldWzAtOV0qfX0KK30KKworLy8gdnFtb3ZuX2hpZ2hfczY0IC0+IFNRWFROMiBWZC40cyxWbi4yZAoraW50MzJ4NF90IHRlc3RfdnFtb3ZuX2hpZ2hfczY0KGludDMyeDJfdCBWZGxvdywgaW50NjR4Ml90IFZuKQoreworICAgIHJldHVybiB2cW1vdm5faGlnaF9zNjQoVmRsb3csIFZuKTsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3ZuX2hpZ2hfczY0OgorICAvLyBDSEVDSzogc3F4dG4yLjRzIHt7dlswLTldWzAtOV0qfX0sIHt7dlswLTldWzAtOV0qfX0KK30KKworLy8gdnFtb3ZuX2hpZ2hfdTY0IC0+IFVRWFROMiBWZC40cyxWbi4yZAordWludDMyeDRfdCB0ZXN0X3ZxbW92bl9oaWdoX3U2NCh1aW50MzJ4Ml90IFZkbG93LCB1aW50NjR4Ml90IFZuKQoreworICAgIHJldHVybiB2cW1vdm5faGlnaF91NjQoVmRsb3csIFZuKTsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3ZuX2hpZ2hfdTY0OgorICAvLyBDSEVDSzogdXF4dG4yLjRzIHt7dlswLTldWzAtOV0qfX0sIHt7dlswLTldWzAtOV0qfX0KK30KKworLy8gdnFtb3ZuX2hpZ2hfdTE2IC0+IFVRWFROMiBWZC4xNmIsVm4uOGgKK3VpbnQ4eDE2X3QgdGVzdF92cW1vdm5faGlnaF91MTYodWludDh4OF90IFZkbG93LCB1aW50MTZ4OF90IFZuKQoreworICAgIHJldHVybiB2cW1vdm5faGlnaF91MTYoVmRsb3csIFZuKTsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3ZuX2hpZ2hfdTE2OgorICAvLyBDSEVDSzogdXF4dG4yLjE2YiB7e3ZbMC05XVswLTldKn19LCB7e3ZbMC05XVswLTldKn19Cit9CisKKy8vIHZxbW92dW5faGlnaF9zMzIgLT4gU1FYVFVOMiBWZC44aCxWbi40cwordWludDE2eDhfdCB0ZXN0X3ZxbW92dW5faGlnaF9zMzIodWludDE2eDRfdCBWZGxvdywgdWludDMyeDRfdCBWbikKK3sKKyAgICByZXR1cm4gdnFtb3Z1bl9oaWdoX3MzMihWZGxvdywgVm4pOworICAvLyBDSEVDSzogdGVzdF92cW1vdnVuX2hpZ2hfczMyOgorICAvLyBDSEVDSzogc3F4dHVuMi44aCB7e3ZbMC05XVswLTldKn19LCB7e3ZbMC05XVswLTldKn19Cit9CisKKy8vIHZxbW92dW5faGlnaF9zNjQgLT4gU1FYVFVOMiAgVmQuNHMsVm4uMmQKK3VpbnQzMng0X3QgdGVzdF92cW1vdnVuX2hpZ2hfczY0KHVpbnQzMngyX3QgVmRsb3csIHVpbnQ2NHgyX3QgVm4pCit7CisgICAgcmV0dXJuIHZxbW92dW5faGlnaF9zNjQoVmRsb3csIFZuKTsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnFtb3Z1bl9oaWdoX3M2NDoKKyAgLy8gQ0hFQ0s6IHNxeHR1bjIuNHMge3t2WzAtOV1bMC05XSp9fSwge3t2WzAtOV1bMC05XSp9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0X3ZyZWNwcy5jIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZyZWNwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjA2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdnJlY3BzLmMKQEAgLTAsMCArMSwyNiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1PMyAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUkVRVUlSRVM6IGFybTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLy8gVGVzdCB2cmVjcHNzX2YzMiwgdnJlY3BzZF9mNjQgQVJNNjQgaW50cmluc2ljcworCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCisvLyB2cmVjcHNzX2YzMiAtPiBGUkVDUFMgU2QsU2EsU2IKKy8vCitmbG9hdDMyX3QgdGVzdF92cmVjcHNzX2YzMihmbG9hdDMyX3QgVmRsb3csIGZsb2F0MzJfdCBWbikKK3sKKyAgICByZXR1cm4gdnJlY3Bzc19mMzIoVmRsb3csIFZuKTsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnJlY3Bzc19mMzI6CisgIC8vIENIRUNLOiBmcmVjcHMgIHMwLCBzMCwgczEKKyAgLy8gQ0hFQ0stTkVYVDogcmV0Cit9CisKKy8vIHZyZWNwc2RfZjY0IC0+IEZSRUNQUyBEZCxEYSxEYgorLy8KK2Zsb2F0NjRfdCB0ZXN0X3ZyZWNwc2RfZjY0KGZsb2F0NjRfdCBWZGxvdywgZmxvYXQ2NF90IFZuKQoreworICAgIHJldHVybiB2cmVjcHNkX2Y2NChWZGxvdywgVm4pOworICAvLyBDSEVDSzogdGVzdF92cmVjcHNkX2Y2NDoKKyAgLy8gQ0hFQ0s6IGZyZWNwcyBkMCwgZDAsIGQxCisgIC8vIENIRUNLLU5FWFQ6IHJldAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0X3ZzZXRfbGFuZS5jIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZzZXRfbGFuZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTdlYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdnNldF9sYW5lLmMKQEAgLTAsMCArMSwzMSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1PMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisvLyBUZXN0IEFSTTY0IFNJTUQgc2V0IGxhbmUgaW50cmluc2ljcyBJTkNPTVBMRVRFCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCitmbG9hdDE2eDRfdCB0ZXN0X3ZzZXRfbGFuZV9mMTYoZmxvYXQxNl90ICphMSwgZmxvYXQxNng0X3QgYTIpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IHRlc3RfdnNldF9sYW5lX2YxNgorICByZXR1cm4gdnNldF9sYW5lX2YxNigqYTEsIGEyLCAxKTsKKyAgLy8gQ0hFQ0sgaW5zZXJ0ZWxlbWVudCA8NCB4IGkxNj4gJWEyLCBpMTYgJWExLCBpMzIgMQorfQorCitmbG9hdDE2eDhfdCB0ZXN0X3ZzZXRxX2xhbmVfZjE2KGZsb2F0MTZfdCAqYTEsIGZsb2F0MTZ4OF90IGEyKSB7CisgIC8vIENIRUNLLUxBQkVMOiB0ZXN0X3ZzZXRxX2xhbmVfZjE2CisgIHJldHVybiB2c2V0cV9sYW5lX2YxNigqYTEsIGEyLCA0KTsKKyAgLy8gQ0hFQ0sgaW5zZXJ0ZWxlbWVudCA8OCB4IGkxNj4gJWEyLCBpMTYgJWExLCBpMzIgNAorfQorCisvLyBwcm9ibGVtIHdpdGggc2NhbGFyX3RvX3ZlY3RvciBpbiBiYWNrZW5kLiAgUHVudCBmb3Igbm93CisjaWYgMAorZmxvYXQ2NHgxX3QgdGVzdF92c2V0X2xhbmVfZjY0KGZsb2F0NjRfdCBhMSwgZmxvYXQ2NHgxX3QgYTIpIHsKKyAgLy8gQ0hFQ0stTEFCRUxAIHRlc3RfdnNldF9sYW5lX2Y2NAorICByZXR1cm4gdnNldF9sYW5lX2Y2NChhMSwgYTIsIDApOworICAvLyBDSEVDS0AgQGxsdm0uYXJtNjQubmVvbi5zbWF4di5pMzIudjhpOAorfQorI2VuZGlmCisKK2Zsb2F0NjR4Ml90IHRlc3RfdnNldHFfbGFuZV9mNjQoZmxvYXQ2NF90IGExLCBmbG9hdDY0eDJfdCBhMikgeworICAvLyBDSEVDSy1MQUJFTDogdGVzdF92c2V0cV9sYW5lX2Y2NAorICByZXR1cm4gdnNldHFfbGFuZV9mNjQoYTEsIGEyLCAwKTsKKyAgLy8gQ0hFQ0sgaW5zZXJ0ZWxlbWVudCA8MiB4IGRvdWJsZT4gJWEyLCBkb3VibGUgJWExLCBpMzIgMAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0X3ZzaGlmdC5jIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZzaGlmdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzRkMTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXJtNjRfdnNoaWZ0LmMKQEAgLTAsMCArMSwzNTcgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcuMCAtZmZyZWVzdGFuZGluZyAtZW1pdC1sbHZtIC1vIC0gLU8xICVzIHwgRmlsZUNoZWNrICVzCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworaW50OHg4X3QgdGVzdF92cXNobF9uX3M4KGludDh4OF90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cXNobF9uX3M4CisgIC8vIENIRUNLOiBjYWxsIDw4IHggaTg+IEBsbHZtLmFybTY0Lm5lb24uc3FzaGwudjhpOCg8OCB4IGk4PiAlaW4sIDw4IHggaTg+IDxpOCAxLCBpOCAxLCBpOCAxLCBpOCAxLCBpOCAxLCBpOCAxLCBpOCAxLCBpOCAxPikKKyAgcmV0dXJuIHZxc2hsX25fczgoaW4sIDEpOworfQorCitpbnQxNng0X3QgdGVzdF92cXNobF9uX3MxNihpbnQxNng0X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zxc2hsX25fczE2CisgIC8vIENIRUNLOiBjYWxsIDw0IHggaTE2PiBAbGx2bS5hcm02NC5uZW9uLnNxc2hsLnY0aTE2KDw0IHggaTE2PiAlaW4sIDw0IHggaTE2PiA8aTE2IDEsIGkxNiAxLCBpMTYgMSwgaTE2IDE+KQorICByZXR1cm4gdnFzaGxfbl9zMTYoaW4sIDEpOworfQorCitpbnQzMngyX3QgdGVzdF92cXNobF9uX3MzMihpbnQzMngyX3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zxc2hsX25fczMyCisgIC8vIENIRUNLOiBjYWxsIDwyIHggaTMyPiBAbGx2bS5hcm02NC5uZW9uLnNxc2hsLnYyaTMyKDwyIHggaTMyPiAlaW4sIDwyIHggaTMyPiA8aTMyIDEsIGkzMiAxPikKKyAgcmV0dXJuIHZxc2hsX25fczMyKGluLCAxKTsKK30KKworaW50NjR4MV90IHRlc3RfdnFzaGxfbl9zNjQoaW50NjR4MV90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cXNobF9uX3M2NAorICAvLyBDSEVDSzogY2FsbCA8MSB4IGk2ND4gQGxsdm0uYXJtNjQubmVvbi5zcXNobC52MWk2NCg8MSB4IGk2ND4gJWluLCA8MSB4IGk2ND4gPGk2NCAxPikKKyAgcmV0dXJuIHZxc2hsX25fczY0KGluLCAxKTsKK30KKworCitpbnQ4eDE2X3QgdGVzdF92cXNobHFfbl9zOChpbnQ4eDE2X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zxc2hscV9uX3M4CisgIC8vIENIRUNLOiBjYWxsIDwxNiB4IGk4PiBAbGx2bS5hcm02NC5uZW9uLnNxc2hsLnYxNmk4KDwxNiB4IGk4PiAlaW4sIDwxNiB4IGk4PiA8aTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMT4pCisgIHJldHVybiB2cXNobHFfbl9zOChpbiwgMSk7Cit9CisKK2ludDE2eDhfdCB0ZXN0X3Zxc2hscV9uX3MxNihpbnQxNng4X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zxc2hscV9uX3MxNgorICAvLyBDSEVDSzogY2FsbCA8OCB4IGkxNj4gQGxsdm0uYXJtNjQubmVvbi5zcXNobC52OGkxNig8OCB4IGkxNj4gJWluLCA8OCB4IGkxNj4gPGkxNiAxLCBpMTYgMSwgaTE2IDEsIGkxNiAxLCBpMTYgMSwgaTE2IDEsIGkxNiAxLCBpMTYgMT4pCisgIHJldHVybiB2cXNobHFfbl9zMTYoaW4sIDEpOworfQorCitpbnQzMng0X3QgdGVzdF92cXNobHFfbl9zMzIoaW50MzJ4NF90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cXNobHFfbl9zMzIKKyAgLy8gQ0hFQ0s6IGNhbGwgPDQgeCBpMzI+IEBsbHZtLmFybTY0Lm5lb24uc3FzaGwudjRpMzIoPDQgeCBpMzI+ICVpbiwgPDQgeCBpMzI+IDxpMzIgMSwgaTMyIDEsIGkzMiAxLCBpMzIgMT4pCisgIHJldHVybiB2cXNobHFfbl9zMzIoaW4sIDEpOworfQorCitpbnQ2NHgyX3QgdGVzdF92cXNobHFfbl9zNjQoaW50NjR4Ml90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cXNobHFfbl9zNjQKKyAgLy8gQ0hFQ0s6IGNhbGwgPDIgeCBpNjQ+IEBsbHZtLmFybTY0Lm5lb24uc3FzaGwudjJpNjQoPDIgeCBpNjQ+ICVpbiwgPDIgeCBpNjQ+IDxpNjQgMSwgaTY0IDE+CisgIHJldHVybiB2cXNobHFfbl9zNjQoaW4sIDEpOworfQorCit1aW50OHg4X3QgdGVzdF92cXNobF9uX3U4KHVpbnQ4eDhfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnFzaGxfbl91OAorICAvLyBDSEVDSzogY2FsbCA8OCB4IGk4PiBAbGx2bS5hcm02NC5uZW9uLnVxc2hsLnY4aTgoPDggeCBpOD4gJWluLCA8OCB4IGk4PiA8aTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMSwgaTggMT4pCisgIHJldHVybiB2cXNobF9uX3U4KGluLCAxKTsKK30KKwordWludDE2eDRfdCB0ZXN0X3Zxc2hsX25fdTE2KHVpbnQxNng0X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zxc2hsX25fdTE2CisgIC8vIENIRUNLOiBjYWxsIDw0IHggaTE2PiBAbGx2bS5hcm02NC5uZW9uLnVxc2hsLnY0aTE2KDw0IHggaTE2PiAlaW4sIDw0IHggaTE2PiA8aTE2IDEsIGkxNiAxLCBpMTYgMSwgaTE2IDE+KQorICByZXR1cm4gdnFzaGxfbl91MTYoaW4sIDEpOworfQorCit1aW50MzJ4Ml90IHRlc3RfdnFzaGxfbl91MzIodWludDMyeDJfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnFzaGxfbl91MzIKKyAgLy8gQ0hFQ0s6IGNhbGwgPDIgeCBpMzI+IEBsbHZtLmFybTY0Lm5lb24udXFzaGwudjJpMzIoPDIgeCBpMzI+ICVpbiwgPDIgeCBpMzI+IDxpMzIgMSwgaTMyIDE+KQorICByZXR1cm4gdnFzaGxfbl91MzIoaW4sIDEpOworfQorCit1aW50NjR4MV90IHRlc3RfdnFzaGxfbl91NjQodWludDY0eDFfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnFzaGxfbl91NjQKKyAgLy8gQ0hFQ0s6IGNhbGwgPDEgeCBpNjQ+IEBsbHZtLmFybTY0Lm5lb24udXFzaGwudjFpNjQoPDEgeCBpNjQ+ICVpbiwgPDEgeCBpNjQ+IDxpNjQgMT4pCisgIHJldHVybiB2cXNobF9uX3U2NChpbiwgMSk7Cit9CisKK3VpbnQ4eDE2X3QgdGVzdF92cXNobHFfbl91OCh1aW50OHgxNl90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cXNobHFfbl91OAorICAvLyBDSEVDSzogY2FsbCA8MTYgeCBpOD4gQGxsdm0uYXJtNjQubmVvbi51cXNobC52MTZpOCg8MTYgeCBpOD4gJWluLCA8MTYgeCBpOD4gPGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDE+KQorICByZXR1cm4gdnFzaGxxX25fdTgoaW4sIDEpOworfQorCit1aW50MTZ4OF90IHRlc3RfdnFzaGxxX25fdTE2KHVpbnQxNng4X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zxc2hscV9uX3UxNgorICAvLyBDSEVDSzogY2FsbCA8OCB4IGkxNj4gQGxsdm0uYXJtNjQubmVvbi51cXNobC52OGkxNig8OCB4IGkxNj4gJWluLCA8OCB4IGkxNj4gPGkxNiAxLCBpMTYgMSwgaTE2IDEsIGkxNiAxLCBpMTYgMSwgaTE2IDEsIGkxNiAxLCBpMTYgMT4pCisgIHJldHVybiB2cXNobHFfbl91MTYoaW4sIDEpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnFzaGxxX25fdTMyKHVpbnQzMng0X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zxc2hscV9uX3UzMgorICAvLyBDSEVDSzogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtNjQubmVvbi51cXNobC52NGkzMig8NCB4IGkzMj4gJWluLCA8NCB4IGkzMj4gPGkzMiAxLCBpMzIgMSwgaTMyIDEsIGkzMiAxPikKKyAgcmV0dXJuIHZxc2hscV9uX3UzMihpbiwgMSk7Cit9CisKK3VpbnQ2NHgyX3QgdGVzdF92cXNobHFfbl91NjQodWludDY0eDJfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnFzaGxxX25fdTY0CisgIC8vIENIRUNLOiBjYWxsIDwyIHggaTY0PiBAbGx2bS5hcm02NC5uZW9uLnVxc2hsLnYyaTY0KDwyIHggaTY0PiAlaW4sIDwyIHggaTY0PiA8aTY0IDEsIGk2NCAxPgorICByZXR1cm4gdnFzaGxxX25fdTY0KGluLCAxKTsKK30KKworaW50OHg4X3QgdGVzdF92cnNocl9uX3M4KGludDh4OF90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNocl9uX3M4CisgIC8vIENIRUNLOiBjYWxsIDw4IHggaTg+IEBsbHZtLmFybTY0Lm5lb24uc3JzaGwudjhpOCg8OCB4IGk4PiAlaW4sIDw4IHggaTg+IDxpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTE+KQorICByZXR1cm4gdnJzaHJfbl9zOChpbiwgMSk7Cit9CisKK2ludDE2eDRfdCB0ZXN0X3Zyc2hyX25fczE2KGludDE2eDRfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzaHJfbl9zMTYKKyAgLy8gQ0hFQ0s6IGNhbGwgPDQgeCBpMTY+IEBsbHZtLmFybTY0Lm5lb24uc3JzaGwudjRpMTYoPDQgeCBpMTY+ICVpbiwgPDQgeCBpMTY+IDxpMTYgLTEsIGkxNiAtMSwgaTE2IC0xLCBpMTYgLTE+KQorICByZXR1cm4gdnJzaHJfbl9zMTYoaW4sIDEpOworfQorCitpbnQzMngyX3QgdGVzdF92cnNocl9uX3MzMihpbnQzMngyX3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc2hyX25fczMyCisgIC8vIENIRUNLOiBjYWxsIDwyIHggaTMyPiBAbGx2bS5hcm02NC5uZW9uLnNyc2hsLnYyaTMyKDwyIHggaTMyPiAlaW4sIDwyIHggaTMyPiA8aTMyIC0xLCBpMzIgLTE+KQorICByZXR1cm4gdnJzaHJfbl9zMzIoaW4sIDEpOworfQorCitpbnQ2NHgxX3QgdGVzdF92cnNocl9uX3M2NChpbnQ2NHgxX3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc2hyX25fczY0CisgIC8vIENIRUNLOiBjYWxsIDwxIHggaTY0PiBAbGx2bS5hcm02NC5uZW9uLnNyc2hsLnYxaTY0KDwxIHggaTY0PiAlaW4sIDwxIHggaTY0PiA8aTY0IC0xPikKKyAgcmV0dXJuIHZyc2hyX25fczY0KGluLCAxKTsKK30KKworCitpbnQ4eDE2X3QgdGVzdF92cnNocnFfbl9zOChpbnQ4eDE2X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc2hycV9uX3M4CisgIC8vIENIRUNLOiBjYWxsIDwxNiB4IGk4PiBAbGx2bS5hcm02NC5uZW9uLnNyc2hsLnYxNmk4KDwxNiB4IGk4PiAlaW4sIDwxNiB4IGk4PiA8aTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTE+KQorICByZXR1cm4gdnJzaHJxX25fczgoaW4sIDEpOworfQorCitpbnQxNng4X3QgdGVzdF92cnNocnFfbl9zMTYoaW50MTZ4OF90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNocnFfbl9zMTYKKyAgLy8gQ0hFQ0s6IGNhbGwgPDggeCBpMTY+IEBsbHZtLmFybTY0Lm5lb24uc3JzaGwudjhpMTYoPDggeCBpMTY+ICVpbiwgPDggeCBpMTY+IDxpMTYgLTEsIGkxNiAtMSwgaTE2IC0xLCBpMTYgLTEsIGkxNiAtMSwgaTE2IC0xLCBpMTYgLTEsIGkxNiAtMT4pCisgIHJldHVybiB2cnNocnFfbl9zMTYoaW4sIDEpOworfQorCitpbnQzMng0X3QgdGVzdF92cnNocnFfbl9zMzIoaW50MzJ4NF90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNocnFfbl9zMzIKKyAgLy8gQ0hFQ0s6IGNhbGwgPDQgeCBpMzI+IEBsbHZtLmFybTY0Lm5lb24uc3JzaGwudjRpMzIoPDQgeCBpMzI+ICVpbiwgPDQgeCBpMzI+IDxpMzIgLTEsIGkzMiAtMSwgaTMyIC0xLCBpMzIgLTE+KQorICByZXR1cm4gdnJzaHJxX25fczMyKGluLCAxKTsKK30KKworaW50NjR4Ml90IHRlc3RfdnJzaHJxX25fczY0KGludDY0eDJfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzaHJxX25fczY0CisgIC8vIENIRUNLOiBjYWxsIDwyIHggaTY0PiBAbGx2bS5hcm02NC5uZW9uLnNyc2hsLnYyaTY0KDwyIHggaTY0PiAlaW4sIDwyIHggaTY0PiA8aTY0IC0xLCBpNjQgLTE+CisgIHJldHVybiB2cnNocnFfbl9zNjQoaW4sIDEpOworfQorCit1aW50OHg4X3QgdGVzdF92cnNocl9uX3U4KHVpbnQ4eDhfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzaHJfbl91OAorICAvLyBDSEVDSzogY2FsbCA8OCB4IGk4PiBAbGx2bS5hcm02NC5uZW9uLnVyc2hsLnY4aTgoPDggeCBpOD4gJWluLCA8OCB4IGk4PiA8aTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xPikKKyAgcmV0dXJuIHZyc2hyX25fdTgoaW4sIDEpOworfQorCit1aW50MTZ4NF90IHRlc3RfdnJzaHJfbl91MTYodWludDE2eDRfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzaHJfbl91MTYKKyAgLy8gQ0hFQ0s6IGNhbGwgPDQgeCBpMTY+IEBsbHZtLmFybTY0Lm5lb24udXJzaGwudjRpMTYoPDQgeCBpMTY+ICVpbiwgPDQgeCBpMTY+IDxpMTYgLTEsIGkxNiAtMSwgaTE2IC0xLCBpMTYgLTE+KQorICByZXR1cm4gdnJzaHJfbl91MTYoaW4sIDEpOworfQorCit1aW50MzJ4Ml90IHRlc3RfdnJzaHJfbl91MzIodWludDMyeDJfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzaHJfbl91MzIKKyAgLy8gQ0hFQ0s6IGNhbGwgPDIgeCBpMzI+IEBsbHZtLmFybTY0Lm5lb24udXJzaGwudjJpMzIoPDIgeCBpMzI+ICVpbiwgPDIgeCBpMzI+IDxpMzIgLTEsIGkzMiAtMT4pCisgIHJldHVybiB2cnNocl9uX3UzMihpbiwgMSk7Cit9CisKK3VpbnQ2NHgxX3QgdGVzdF92cnNocl9uX3U2NCh1aW50NjR4MV90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNocl9uX3U2NAorICAvLyBDSEVDSzogY2FsbCA8MSB4IGk2ND4gQGxsdm0uYXJtNjQubmVvbi51cnNobC52MWk2NCg8MSB4IGk2ND4gJWluLCA8MSB4IGk2ND4gPGk2NCAtMT4pCisgIHJldHVybiB2cnNocl9uX3U2NChpbiwgMSk7Cit9CisKK3VpbnQ4eDE2X3QgdGVzdF92cnNocnFfbl91OCh1aW50OHgxNl90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNocnFfbl91OAorICAvLyBDSEVDSzogY2FsbCA8MTYgeCBpOD4gQGxsdm0uYXJtNjQubmVvbi51cnNobC52MTZpOCg8MTYgeCBpOD4gJWluLCA8MTYgeCBpOD4gPGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xPikKKyAgcmV0dXJuIHZyc2hycV9uX3U4KGluLCAxKTsKK30KKwordWludDE2eDhfdCB0ZXN0X3Zyc2hycV9uX3UxNih1aW50MTZ4OF90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNocnFfbl91MTYKKyAgLy8gQ0hFQ0s6IGNhbGwgPDggeCBpMTY+IEBsbHZtLmFybTY0Lm5lb24udXJzaGwudjhpMTYoPDggeCBpMTY+ICVpbiwgPDggeCBpMTY+IDxpMTYgLTEsIGkxNiAtMSwgaTE2IC0xLCBpMTYgLTEsIGkxNiAtMSwgaTE2IC0xLCBpMTYgLTEsIGkxNiAtMT4pCisgIHJldHVybiB2cnNocnFfbl91MTYoaW4sIDEpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnJzaHJxX25fdTMyKHVpbnQzMng0X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc2hycV9uX3UzMgorICAvLyBDSEVDSzogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtNjQubmVvbi51cnNobC52NGkzMig8NCB4IGkzMj4gJWluLCA8NCB4IGkzMj4gPGkzMiAtMSwgaTMyIC0xLCBpMzIgLTEsIGkzMiAtMT4pCisgIHJldHVybiB2cnNocnFfbl91MzIoaW4sIDEpOworfQorCit1aW50NjR4Ml90IHRlc3RfdnJzaHJxX25fdTY0KHVpbnQ2NHgyX3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc2hycV9uX3U2NAorICAvLyBDSEVDSzogY2FsbCA8MiB4IGk2ND4gQGxsdm0uYXJtNjQubmVvbi51cnNobC52Mmk2NCg8MiB4IGk2ND4gJWluLCA8MiB4IGk2ND4gPGk2NCAtMSwgaTY0IC0xPgorICByZXR1cm4gdnJzaHJxX25fdTY0KGluLCAxKTsKK30KKworaW50OHg4X3QgdGVzdF92cXNobHVfbl9zOChpbnQ4eDhfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnFzaGx1X25fczgKKyAgLy8gQ0hFQ0s6IGNhbGwgPDggeCBpOD4gQGxsdm0uYXJtNjQubmVvbi5zcXNobHUudjhpOCg8OCB4IGk4PiAlaW4sIDw4IHggaTg+IDxpOCAxLCBpOCAxLCBpOCAxLCBpOCAxLCBpOCAxLCBpOCAxLCBpOCAxLCBpOCAxPikKKyAgcmV0dXJuIHZxc2hsdV9uX3M4KGluLCAxKTsKK30KKworaW50MTZ4NF90IHRlc3RfdnFzaGx1X25fczE2KGludDE2eDRfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnFzaGx1X25fczE2CisgIC8vIENIRUNLOiBjYWxsIDw0IHggaTE2PiBAbGx2bS5hcm02NC5uZW9uLnNxc2hsdS52NGkxNig8NCB4IGkxNj4gJWluLCA8NCB4IGkxNj4gPGkxNiAxLCBpMTYgMSwgaTE2IDEsIGkxNiAxPikKKyAgcmV0dXJuIHZxc2hsdV9uX3MxNihpbiwgMSk7Cit9CisKK2ludDMyeDJfdCB0ZXN0X3Zxc2hsdV9uX3MzMihpbnQzMngyX3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zxc2hsdV9uX3MzMgorICAvLyBDSEVDSzogY2FsbCA8MiB4IGkzMj4gQGxsdm0uYXJtNjQubmVvbi5zcXNobHUudjJpMzIoPDIgeCBpMzI+ICVpbiwgPDIgeCBpMzI+IDxpMzIgMSwgaTMyIDE+KQorICByZXR1cm4gdnFzaGx1X25fczMyKGluLCAxKTsKK30KKworaW50NjR4MV90IHRlc3RfdnFzaGx1X25fczY0KGludDY0eDFfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnFzaGx1X25fczY0CisgIC8vIENIRUNLOiBjYWxsIDwxIHggaTY0PiBAbGx2bS5hcm02NC5uZW9uLnNxc2hsdS52MWk2NCg8MSB4IGk2ND4gJWluLCA8MSB4IGk2ND4gPGk2NCAxPikKKyAgcmV0dXJuIHZxc2hsdV9uX3M2NChpbiwgMSk7Cit9CisKKworaW50OHgxNl90IHRlc3RfdnFzaGx1cV9uX3M4KGludDh4MTZfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnFzaGx1cV9uX3M4CisgIC8vIENIRUNLOiBjYWxsIDwxNiB4IGk4PiBAbGx2bS5hcm02NC5uZW9uLnNxc2hsdS52MTZpOCg8MTYgeCBpOD4gJWluLCA8MTYgeCBpOD4gPGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDEsIGk4IDE+KQorICByZXR1cm4gdnFzaGx1cV9uX3M4KGluLCAxKTsKK30KKworaW50MTZ4OF90IHRlc3RfdnFzaGx1cV9uX3MxNihpbnQxNng4X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zxc2hsdXFfbl9zMTYKKyAgLy8gQ0hFQ0s6IGNhbGwgPDggeCBpMTY+IEBsbHZtLmFybTY0Lm5lb24uc3FzaGx1LnY4aTE2KDw4IHggaTE2PiAlaW4sIDw4IHggaTE2PiA8aTE2IDEsIGkxNiAxLCBpMTYgMSwgaTE2IDEsIGkxNiAxLCBpMTYgMSwgaTE2IDEsIGkxNiAxPikKKyAgcmV0dXJuIHZxc2hsdXFfbl9zMTYoaW4sIDEpOworfQorCitpbnQzMng0X3QgdGVzdF92cXNobHVxX25fczMyKGludDMyeDRfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnFzaGx1cV9uX3MzMgorICAvLyBDSEVDSzogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtNjQubmVvbi5zcXNobHUudjRpMzIoPDQgeCBpMzI+ICVpbiwgPDQgeCBpMzI+IDxpMzIgMSwgaTMyIDEsIGkzMiAxLCBpMzIgMT4pCisgIHJldHVybiB2cXNobHVxX25fczMyKGluLCAxKTsKK30KKworaW50NjR4Ml90IHRlc3RfdnFzaGx1cV9uX3M2NChpbnQ2NHgyX3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zxc2hsdXFfbl9zNjQKKyAgLy8gQ0hFQ0s6IGNhbGwgPDIgeCBpNjQ+IEBsbHZtLmFybTY0Lm5lb24uc3FzaGx1LnYyaTY0KDwyIHggaTY0PiAlaW4sIDwyIHggaTY0PiA8aTY0IDEsIGk2NCAxPgorICByZXR1cm4gdnFzaGx1cV9uX3M2NChpbiwgMSk7Cit9CisKK2ludDh4OF90IHRlc3RfdnJzcmFfbl9zOChpbnQ4eDhfdCBhY2MsIGludDh4OF90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNyYV9uX3M4CisgIC8vIENIRUNLOiBbW1RNUDolWzAtOWEtekEtWi5fXStdXSA9IHRhaWwgY2FsbCA8OCB4IGk4PiBAbGx2bS5hcm02NC5uZW9uLnNyc2hsLnY4aTgoPDggeCBpOD4gJWluLCA8OCB4IGk4PiA8aTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xPikKKyAgLy8gQ0hFQ0s6IGFkZCA8OCB4IGk4PiBbW1RNUF1dLCAlYWNjCisgIHJldHVybiB2cnNyYV9uX3M4KGFjYywgaW4sIDEpOworfQorCitpbnQxNng0X3QgdGVzdF92cnNyYV9uX3MxNihpbnQxNng0X3QgYWNjLCBpbnQxNng0X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc3JhX25fczE2CisgIC8vIENIRUNLOiBbW1RNUDolWzAtOWEtekEtWi5fXStdXSA9IHRhaWwgY2FsbCA8NCB4IGkxNj4gQGxsdm0uYXJtNjQubmVvbi5zcnNobC52NGkxNig8NCB4IGkxNj4gJWluLCA8NCB4IGkxNj4gPGkxNiAtMSwgaTE2IC0xLCBpMTYgLTEsIGkxNiAtMT4pCisgIC8vIENIRUNLOiBhZGQgPDQgeCBpMTY+IFtbVE1QXV0sICVhY2MKKyAgcmV0dXJuIHZyc3JhX25fczE2KGFjYywgaW4sIDEpOworfQorCitpbnQzMngyX3QgdGVzdF92cnNyYV9uX3MzMihpbnQzMngyX3QgYWNjLCBpbnQzMngyX3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc3JhX25fczMyCisgIC8vIENIRUNLOiBbW1RNUDolWzAtOWEtekEtWi5fXStdXSA9IHRhaWwgY2FsbCA8MiB4IGkzMj4gQGxsdm0uYXJtNjQubmVvbi5zcnNobC52MmkzMig8MiB4IGkzMj4gJWluLCA8MiB4IGkzMj4gPGkzMiAtMSwgaTMyIC0xPikKKyAgLy8gQ0hFQ0s6IGFkZCA8MiB4IGkzMj4gW1tUTVBdXSwgJWFjYworICByZXR1cm4gdnJzcmFfbl9zMzIoYWNjLCBpbiwgMSk7Cit9CisKK2ludDY0eDFfdCB0ZXN0X3Zyc3JhX25fczY0KGludDY0eDFfdCBhY2MsIGludDY0eDFfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzcmFfbl9zNjQKKyAgLy8gQ0hFQ0s6IFtbVE1QOiVbMC05YS16QS1aLl9dK11dID0gdGFpbCBjYWxsIDwxIHggaTY0PiBAbGx2bS5hcm02NC5uZW9uLnNyc2hsLnYxaTY0KDwxIHggaTY0PiAlaW4sIDwxIHggaTY0PiA8aTY0IC0xPikKKyAgLy8gQ0hFQ0s6IGFkZCA8MSB4IGk2ND4gW1tUTVBdXSwgJWFjYworICByZXR1cm4gdnJzcmFfbl9zNjQoYWNjLCBpbiwgMSk7Cit9CisKK2ludDh4MTZfdCB0ZXN0X3Zyc3JhcV9uX3M4KGludDh4MTZfdCBhY2MsIGludDh4MTZfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzcmFxX25fczgKKyAgLy8gQ0hFQ0s6IFtbVE1QOiVbMC05YS16QS1aLl9dK11dID0gdGFpbCBjYWxsIDwxNiB4IGk4PiBAbGx2bS5hcm02NC5uZW9uLnNyc2hsLnYxNmk4KDwxNiB4IGk4PiAlaW4sIDwxNiB4IGk4PiA8aTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTE+KQorICAvLyBDSEVDSzogYWRkIDwxNiB4IGk4PiBbW1RNUF1dLCAlYWNjCisgIHJldHVybiB2cnNyYXFfbl9zOChhY2MsIGluLCAxKTsKK30KKworaW50MTZ4OF90IHRlc3RfdnJzcmFxX25fczE2KGludDE2eDhfdCBhY2MsIGludDE2eDhfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzcmFxX25fczE2CisgIC8vIENIRUNLOiBbW1RNUDolWzAtOWEtekEtWi5fXStdXSA9IHRhaWwgY2FsbCA8OCB4IGkxNj4gQGxsdm0uYXJtNjQubmVvbi5zcnNobC52OGkxNig8OCB4IGkxNj4gJWluLCA8OCB4IGkxNj4gPGkxNiAtMSwgaTE2IC0xLCBpMTYgLTEsIGkxNiAtMSwgaTE2IC0xLCBpMTYgLTEsIGkxNiAtMSwgaTE2IC0xPikKKyAgLy8gQ0hFQ0s6IGFkZCA8OCB4IGkxNj4gW1tUTVBdXSwgJWFjYworICByZXR1cm4gdnJzcmFxX25fczE2KGFjYywgaW4sIDEpOworfQorCitpbnQzMng0X3QgdGVzdF92cnNyYXFfbl9zMzIoaW50MzJ4NF90IGFjYywgaW50MzJ4NF90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNyYXFfbl9zMzIKKyAgLy8gQ0hFQ0s6IFtbVE1QOiVbMC05YS16QS1aLl9dK11dID0gdGFpbCBjYWxsIDw0IHggaTMyPiBAbGx2bS5hcm02NC5uZW9uLnNyc2hsLnY0aTMyKDw0IHggaTMyPiAlaW4sIDw0IHggaTMyPiA8aTMyIC0xLCBpMzIgLTEsIGkzMiAtMSwgaTMyIC0xPikKKyAgLy8gQ0hFQ0s6IGFkZCA8NCB4IGkzMj4gW1tUTVBdXSwgJWFjYworICByZXR1cm4gdnJzcmFxX25fczMyKGFjYywgaW4sIDEpOworfQorCitpbnQ2NHgyX3QgdGVzdF92cnNyYXFfbl9zNjQoaW50NjR4Ml90IGFjYywgaW50NjR4Ml90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNyYXFfbl9zNjQKKyAgLy8gQ0hFQ0s6IFtbVE1QOiVbMC05YS16QS1aLl9dK11dID0gdGFpbCBjYWxsIDwyIHggaTY0PiBAbGx2bS5hcm02NC5uZW9uLnNyc2hsLnYyaTY0KDwyIHggaTY0PiAlaW4sIDwyIHggaTY0PiA8aTY0IC0xLCBpNjQgLTE+KQorICAvLyBDSEVDSzogYWRkIDwyIHggaTY0PiBbW1RNUF1dLCAlYWNjCisgIHJldHVybiB2cnNyYXFfbl9zNjQoYWNjLCBpbiwgMSk7Cit9CisKK3VpbnQ4eDhfdCB0ZXN0X3Zyc3JhX25fdTgodWludDh4OF90IGFjYywgdWludDh4OF90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNyYV9uX3U4CisgIC8vIENIRUNLOiBbW1RNUDolWzAtOWEtekEtWi5fXStdXSA9IHRhaWwgY2FsbCA8OCB4IGk4PiBAbGx2bS5hcm02NC5uZW9uLnVyc2hsLnY4aTgoPDggeCBpOD4gJWluLCA8OCB4IGk4PiA8aTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xPikKKyAgLy8gQ0hFQ0s6IGFkZCA8OCB4IGk4PiBbW1RNUF1dLCAlYWNjCisgIHJldHVybiB2cnNyYV9uX3U4KGFjYywgaW4sIDEpOworfQorCit1aW50MTZ4NF90IHRlc3RfdnJzcmFfbl91MTYodWludDE2eDRfdCBhY2MsIHVpbnQxNng0X3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc3JhX25fdTE2CisgIC8vIENIRUNLOiBbW1RNUDolWzAtOWEtekEtWi5fXStdXSA9IHRhaWwgY2FsbCA8NCB4IGkxNj4gQGxsdm0uYXJtNjQubmVvbi51cnNobC52NGkxNig8NCB4IGkxNj4gJWluLCA8NCB4IGkxNj4gPGkxNiAtMSwgaTE2IC0xLCBpMTYgLTEsIGkxNiAtMT4pCisgIC8vIENIRUNLOiBhZGQgPDQgeCBpMTY+IFtbVE1QXV0sICVhY2MKKyAgcmV0dXJuIHZyc3JhX25fdTE2KGFjYywgaW4sIDEpOworfQorCit1aW50MzJ4Ml90IHRlc3RfdnJzcmFfbl91MzIodWludDMyeDJfdCBhY2MsIHVpbnQzMngyX3QgaW4pIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3Zyc3JhX25fdTMyCisgIC8vIENIRUNLOiBbW1RNUDolWzAtOWEtekEtWi5fXStdXSA9IHRhaWwgY2FsbCA8MiB4IGkzMj4gQGxsdm0uYXJtNjQubmVvbi51cnNobC52MmkzMig8MiB4IGkzMj4gJWluLCA8MiB4IGkzMj4gPGkzMiAtMSwgaTMyIC0xPikKKyAgLy8gQ0hFQ0s6IGFkZCA8MiB4IGkzMj4gW1tUTVBdXSwgJWFjYworICByZXR1cm4gdnJzcmFfbl91MzIoYWNjLCBpbiwgMSk7Cit9CisKK3VpbnQ2NHgxX3QgdGVzdF92cnNyYV9uX3U2NCh1aW50NjR4MV90IGFjYywgdWludDY0eDFfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzcmFfbl91NjQKKyAgLy8gQ0hFQ0s6IFtbVE1QOiVbMC05YS16QS1aLl9dK11dID0gdGFpbCBjYWxsIDwxIHggaTY0PiBAbGx2bS5hcm02NC5uZW9uLnVyc2hsLnYxaTY0KDwxIHggaTY0PiAlaW4sIDwxIHggaTY0PiA8aTY0IC0xPikKKyAgLy8gQ0hFQ0s6IGFkZCA8MSB4IGk2ND4gW1tUTVBdXSwgJWFjYworICByZXR1cm4gdnJzcmFfbl91NjQoYWNjLCBpbiwgMSk7Cit9CisKK3VpbnQ4eDE2X3QgdGVzdF92cnNyYXFfbl91OCh1aW50OHgxNl90IGFjYywgdWludDh4MTZfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzcmFxX25fdTgKKyAgLy8gQ0hFQ0s6IFtbVE1QOiVbMC05YS16QS1aLl9dK11dID0gdGFpbCBjYWxsIDwxNiB4IGk4PiBAbGx2bS5hcm02NC5uZW9uLnVyc2hsLnYxNmk4KDwxNiB4IGk4PiAlaW4sIDwxNiB4IGk4PiA8aTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTEsIGk4IC0xLCBpOCAtMSwgaTggLTE+KQorICAvLyBDSEVDSzogYWRkIDwxNiB4IGk4PiBbW1RNUF1dLCAlYWNjCisgIHJldHVybiB2cnNyYXFfbl91OChhY2MsIGluLCAxKTsKK30KKwordWludDE2eDhfdCB0ZXN0X3Zyc3JhcV9uX3UxNih1aW50MTZ4OF90IGFjYywgdWludDE2eDhfdCBpbikgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnJzcmFxX25fdTE2CisgIC8vIENIRUNLOiBbW1RNUDolWzAtOWEtekEtWi5fXStdXSA9IHRhaWwgY2FsbCA8OCB4IGkxNj4gQGxsdm0uYXJtNjQubmVvbi51cnNobC52OGkxNig8OCB4IGkxNj4gJWluLCA8OCB4IGkxNj4gPGkxNiAtMSwgaTE2IC0xLCBpMTYgLTEsIGkxNiAtMSwgaTE2IC0xLCBpMTYgLTEsIGkxNiAtMSwgaTE2IC0xPikKKyAgLy8gQ0hFQ0s6IGFkZCA8OCB4IGkxNj4gW1tUTVBdXSwgJWFjYworICByZXR1cm4gdnJzcmFxX25fdTE2KGFjYywgaW4sIDEpOworfQorCit1aW50MzJ4NF90IHRlc3RfdnJzcmFxX25fdTMyKHVpbnQzMng0X3QgYWNjLCB1aW50MzJ4NF90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNyYXFfbl91MzIKKyAgLy8gQ0hFQ0s6IFtbVE1QOiVbMC05YS16QS1aLl9dK11dID0gdGFpbCBjYWxsIDw0IHggaTMyPiBAbGx2bS5hcm02NC5uZW9uLnVyc2hsLnY0aTMyKDw0IHggaTMyPiAlaW4sIDw0IHggaTMyPiA8aTMyIC0xLCBpMzIgLTEsIGkzMiAtMSwgaTMyIC0xPikKKyAgLy8gQ0hFQ0s6IGFkZCA8NCB4IGkzMj4gW1tUTVBdXSwgJWFjYworICByZXR1cm4gdnJzcmFxX25fdTMyKGFjYywgaW4sIDEpOworfQorCit1aW50NjR4Ml90IHRlc3RfdnJzcmFxX25fdTY0KHVpbnQ2NHgyX3QgYWNjLCB1aW50NjR4Ml90IGluKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92cnNyYXFfbl91NjQKKyAgLy8gQ0hFQ0s6IFtbVE1QOiVbMC05YS16QS1aLl9dK11dID0gdGFpbCBjYWxsIDwyIHggaTY0PiBAbGx2bS5hcm02NC5uZW9uLnVyc2hsLnYyaTY0KDwyIHggaTY0PiAlaW4sIDwyIHggaTY0PiA8aTY0IC0xLCBpNjQgLTE+KQorICAvLyBDSEVDSzogYWRkIDwyIHggaTY0PiBbW1RNUF1dLCAlYWNjCisgIHJldHVybiB2cnNyYXFfbl91NjQoYWNjLCBpbiwgMSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYXJtNjRfdnNsaS5jIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZzbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2UxNDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuL2FybTY0X3ZzbGkuYwpAQCAtMCwwICsxLDE0OCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1PMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLU8xIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zNyAtZmZyZWVzdGFuZGluZyAtUyAtbyAtICVzIHwgXAorLy8gUlVOOiAgIEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLX0NPREVHRU4gJXMKKy8vIFJFUVVJUkVTOiBhcm02NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gVGVzdAorCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworaW50OHg4X3QgdGVzdF92c2xpX25fczgoaW50OHg4X3QgYTEsIGludDh4OF90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZzbGlfbl9zOAorICByZXR1cm4gdnNsaV9uX3M4KGExLCBhMiwgMyk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52OGk4CisgIC8vIENIRUNLX0NPREVHRU46IHNsaS44YiAgdjAsIHYxLCAjMworfQorCitpbnQxNng0X3QgdGVzdF92c2xpX25fczE2KGludDE2eDRfdCBhMSwgaW50MTZ4NF90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZzbGlfbl9zMTYKKyAgcmV0dXJuIHZzbGlfbl9zMTYoYTEsIGEyLCAzKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi52c2xpLnY0aTE2CisgIC8vIENIRUNLX0NPREVHRU46IHNsaS40aCAgdjAsIHYxLCAjMworfQorCitpbnQzMngyX3QgdGVzdF92c2xpX25fczMyKGludDMyeDJfdCBhMSwgaW50MzJ4Ml90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZzbGlfbl9zMzIKKyAgcmV0dXJuIHZzbGlfbl9zMzIoYTEsIGEyLCAxKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi52c2xpLnYyaTMyCisgIC8vIENIRUNLX0NPREVHRU46IHNsaS4ycyAgdjAsIHYxLCAjMQorfQorCitpbnQ2NHgxX3QgdGVzdF92c2xpX25fczY0KGludDY0eDFfdCBhMSwgaW50NjR4MV90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3ZzbGlfbl9zNjQKKyAgcmV0dXJuIHZzbGlfbl9zNjQoYTEsIGEyLCAxKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi52c2xpLnYxaTY0CisgIC8vIENIRUNLX0NPREVHRU46IHNsaSAgICAgZDAsIGQxLCAjMQorfQorCit1aW50OHg4X3QgdGVzdF92c2xpX25fdTgodWludDh4OF90IGExLCB1aW50OHg4X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNsaV9uX3U4CisgIHJldHVybiB2c2xpX25fdTgoYTEsIGEyLCAzKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi52c2xpLnY4aTgKKyAgLy8gQ0hFQ0tfQ09ERUdFTjogc2xpLjhiICB2MCwgdjEsICMzCit9CisKK3VpbnQxNng0X3QgdGVzdF92c2xpX25fdTE2KHVpbnQxNng0X3QgYTEsIHVpbnQxNng0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNsaV9uX3UxNgorICByZXR1cm4gdnNsaV9uX3UxNihhMSwgYTIsIDMpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnZzbGkudjRpMTYKKyAgLy8gQ0hFQ0tfQ09ERUdFTjogc2xpLjRoICB2MCwgdjEsICMzCit9CisKK3VpbnQzMngyX3QgdGVzdF92c2xpX25fdTMyKHVpbnQzMngyX3QgYTEsIHVpbnQzMngyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNsaV9uX3UzMgorICByZXR1cm4gdnNsaV9uX3UzMihhMSwgYTIsIDEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnZzbGkudjJpMzIKKyAgLy8gQ0hFQ0tfQ09ERUdFTjogc2xpLjJzICB2MCwgdjEsICMxCit9CisKK3VpbnQ2NHgxX3QgdGVzdF92c2xpX25fdTY0KHVpbnQ2NHgxX3QgYTEsIHVpbnQ2NHgxX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNsaV9uX3U2NAorICByZXR1cm4gdnNsaV9uX3U2NChhMSwgYTIsIDEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnZzbGkudjFpNjQKKyAgLy8gQ0hFQ0tfQ09ERUdFTjogc2xpICAgICBkMCwgZDEsICMxCit9CisKK3BvbHk4eDhfdCB0ZXN0X3ZzbGlfbl9wOChwb2x5OHg4X3QgYTEsIHBvbHk4eDhfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92c2xpX25fcDgKKyAgcmV0dXJuIHZzbGlfbl9wOChhMSwgYTIsIDEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnZzbGkudjhpOAorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuOGIgIHYwLCB2MSwgIzEKK30KKworcG9seTE2eDRfdCB0ZXN0X3ZzbGlfbl9wMTYocG9seTE2eDRfdCBhMSwgcG9seTE2eDRfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92c2xpX25fcDE2CisgIHJldHVybiB2c2xpX25fcDE2KGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52NGkxNgorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuNGggIHYwLCB2MSwgIzEKK30KKworaW50OHgxNl90IHRlc3RfdnNsaXFfbl9zOChpbnQ4eDE2X3QgYTEsIGludDh4MTZfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92c2xpcV9uX3M4CisgIHJldHVybiB2c2xpcV9uX3M4KGExLCBhMiwgMyk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52MTZpOAorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuMTZiIHYwLCB2MSwgIzMKK30KKworaW50MTZ4OF90IHRlc3RfdnNsaXFfbl9zMTYoaW50MTZ4OF90IGExLCBpbnQxNng4X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNsaXFfbl9zMTYKKyAgcmV0dXJuIHZzbGlxX25fczE2KGExLCBhMiwgMyk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52OGkxNgorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuOGggIHYwLCB2MSwgIzMKK30KKworaW50MzJ4NF90IHRlc3RfdnNsaXFfbl9zMzIoaW50MzJ4NF90IGExLCBpbnQzMng0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNsaXFfbl9zMzIKKyAgcmV0dXJuIHZzbGlxX25fczMyKGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52NGkzMgorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuNHMgIHYwLCB2MSwgIzEKK30KKworaW50NjR4Ml90IHRlc3RfdnNsaXFfbl9zNjQoaW50NjR4Ml90IGExLCBpbnQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNsaXFfbl9zNjQKKyAgcmV0dXJuIHZzbGlxX25fczY0KGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52Mmk2NAorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuMmQgIHYwLCB2MSwgIzEKK30KKwordWludDh4MTZfdCB0ZXN0X3ZzbGlxX25fdTgodWludDh4MTZfdCBhMSwgdWludDh4MTZfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92c2xpcV9uX3U4CisgIHJldHVybiB2c2xpcV9uX3U4KGExLCBhMiwgMyk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52MTZpOAorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuMTZiIHYwLCB2MSwgIzMKK30KKwordWludDE2eDhfdCB0ZXN0X3ZzbGlxX25fdTE2KHVpbnQxNng4X3QgYTEsIHVpbnQxNng4X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNsaXFfbl91MTYKKyAgcmV0dXJuIHZzbGlxX25fdTE2KGExLCBhMiwgMyk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52OGkxNgorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuOGggIHYwLCB2MSwgIzMKK30KKwordWludDMyeDRfdCB0ZXN0X3ZzbGlxX25fdTMyKHVpbnQzMng0X3QgYTEsIHVpbnQzMng0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNsaXFfbl91MzIKKyAgcmV0dXJuIHZzbGlxX25fdTMyKGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52NGkzMgorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuNHMgIHYwLCB2MSwgIzEKK30KKwordWludDY0eDJfdCB0ZXN0X3ZzbGlxX25fdTY0KHVpbnQ2NHgyX3QgYTEsIHVpbnQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNsaXFfbl91NjQKKyAgcmV0dXJuIHZzbGlxX25fdTY0KGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52Mmk2NAorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuMmQgIHYwLCB2MSwgIzEKK30KKworcG9seTh4MTZfdCB0ZXN0X3ZzbGlxX25fcDgocG9seTh4MTZfdCBhMSwgcG9seTh4MTZfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92c2xpcV9uX3A4CisgIHJldHVybiB2c2xpcV9uX3A4KGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52MTZpOAorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuMTZiIHYwLCB2MSwgIzEKK30KKworcG9seTE2eDhfdCB0ZXN0X3ZzbGlxX25fcDE2KHBvbHkxNng4X3QgYTEsIHBvbHkxNng4X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNsaXFfbl9wMTYKKyAgcmV0dXJuIHZzbGlxX25fcDE2KGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNsaS52OGkxNgorICAvLyBDSEVDS19DT0RFR0VOOiBzbGkuOGggIHYwLCB2MSwgIzEKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0X3ZzcmkuYyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92c3JpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2MTMzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92c3JpLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtTzEgLXRyaXBsZSBhcm02NC1hcHBsZS1pb3M3IC1mZnJlZXN0YW5kaW5nIC1TIC1vIC0gLWVtaXQtbGx2bSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1PMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAlcyB8IFwKKy8vIFJVTjogICBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDS19DT0RFR0VOICVzCisvLyBSRVFVSVJFUzogYXJtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKworLy8gVGVzdCBBUk02NCBTSU1EIHZlY3RvciBzaGlmdCByaWdodCBhbmQgaW5zZXJ0OiB2c3JpW3FdX25fKgorCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworaW50OHg4X3QgdGVzdF92c3JpX25fczgoaW50OHg4X3QgYTEsIGludDh4OF90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3Zzcmlfbl9zOAorICByZXR1cm4gdnNyaV9uX3M4KGExLCBhMiwgMyk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52OGk4CisgIC8vIENIRUNLX0NPREVHRU46IHNyaS44YiAgdjAsIHYxLCAjMworfQorCitpbnQxNng0X3QgdGVzdF92c3JpX25fczE2KGludDE2eDRfdCBhMSwgaW50MTZ4NF90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3Zzcmlfbl9zMTYKKyAgcmV0dXJuIHZzcmlfbl9zMTYoYTEsIGEyLCAzKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi52c3JpLnY0aTE2CisgIC8vIENIRUNLX0NPREVHRU46IHNyaS40aCAgdjAsIHYxLCAjMworfQorCitpbnQzMngyX3QgdGVzdF92c3JpX25fczMyKGludDMyeDJfdCBhMSwgaW50MzJ4Ml90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3Zzcmlfbl9zMzIKKyAgcmV0dXJuIHZzcmlfbl9zMzIoYTEsIGEyLCAxKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi52c3JpLnYyaTMyCisgIC8vIENIRUNLX0NPREVHRU46IHNyaS4ycyAgdjAsIHYxLCAjMQorfQorCitpbnQ2NHgxX3QgdGVzdF92c3JpX25fczY0KGludDY0eDFfdCBhMSwgaW50NjR4MV90IGEyKSB7CisgIC8vIENIRUNLOiB0ZXN0X3Zzcmlfbl9zNjQKKyAgcmV0dXJuIHZzcmlfbl9zNjQoYTEsIGEyLCAxKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi52c3JpLnYxaTY0CisgIC8vIENIRUNLX0NPREVHRU46IHNyaSAgICAgZDAsIGQxLCAjMQorfQorCit1aW50OHg4X3QgdGVzdF92c3JpX25fdTgodWludDh4OF90IGExLCB1aW50OHg4X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNyaV9uX3U4CisgIHJldHVybiB2c3JpX25fdTgoYTEsIGEyLCAzKTsKKyAgLy8gQ0hFQ0s6IGxsdm0uYXJtNjQubmVvbi52c3JpLnY4aTgKKyAgLy8gQ0hFQ0tfQ09ERUdFTjogc3JpLjhiICB2MCwgdjEsICMzCit9CisKK3VpbnQxNng0X3QgdGVzdF92c3JpX25fdTE2KHVpbnQxNng0X3QgYTEsIHVpbnQxNng0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNyaV9uX3UxNgorICByZXR1cm4gdnNyaV9uX3UxNihhMSwgYTIsIDMpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnZzcmkudjRpMTYKKyAgLy8gQ0hFQ0tfQ09ERUdFTjogc3JpLjRoICB2MCwgdjEsICMzCit9CisKK3VpbnQzMngyX3QgdGVzdF92c3JpX25fdTMyKHVpbnQzMngyX3QgYTEsIHVpbnQzMngyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNyaV9uX3UzMgorICByZXR1cm4gdnNyaV9uX3UzMihhMSwgYTIsIDEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnZzcmkudjJpMzIKKyAgLy8gQ0hFQ0tfQ09ERUdFTjogc3JpLjJzICB2MCwgdjEsICMxCit9CisKK3VpbnQ2NHgxX3QgdGVzdF92c3JpX25fdTY0KHVpbnQ2NHgxX3QgYTEsIHVpbnQ2NHgxX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNyaV9uX3U2NAorICByZXR1cm4gdnNyaV9uX3U2NChhMSwgYTIsIDEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnZzcmkudjFpNjQKKyAgLy8gQ0hFQ0tfQ09ERUdFTjogc3JpICAgICBkMCwgZDEsICMxCit9CisKK3BvbHk4eDhfdCB0ZXN0X3Zzcmlfbl9wOChwb2x5OHg4X3QgYTEsIHBvbHk4eDhfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92c3JpX25fcDgKKyAgcmV0dXJuIHZzcmlfbl9wOChhMSwgYTIsIDEpOworICAvLyBDSEVDSzogbGx2bS5hcm02NC5uZW9uLnZzcmkudjhpOAorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuOGIgIHYwLCB2MSwgIzEKK30KKworcG9seTE2eDRfdCB0ZXN0X3Zzcmlfbl9wMTYocG9seTE2eDRfdCBhMSwgcG9seTE2eDRfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92c3JpX25fcDE2CisgIHJldHVybiB2c3JpX25fcDE2KGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52NGkxNgorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuNGggIHYwLCB2MSwgIzEKK30KKworaW50OHgxNl90IHRlc3RfdnNyaXFfbl9zOChpbnQ4eDE2X3QgYTEsIGludDh4MTZfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92c3JpcV9uX3M4CisgIHJldHVybiB2c3JpcV9uX3M4KGExLCBhMiwgMyk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52MTZpOAorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuMTZiIHYwLCB2MSwgIzMKK30KKworaW50MTZ4OF90IHRlc3RfdnNyaXFfbl9zMTYoaW50MTZ4OF90IGExLCBpbnQxNng4X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl9zMTYKKyAgcmV0dXJuIHZzcmlxX25fczE2KGExLCBhMiwgMyk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52OGkxNgorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuOGggIHYwLCB2MSwgIzMKK30KKworaW50MzJ4NF90IHRlc3RfdnNyaXFfbl9zMzIoaW50MzJ4NF90IGExLCBpbnQzMng0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl9zMzIKKyAgcmV0dXJuIHZzcmlxX25fczMyKGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52NGkzMgorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuNHMgIHYwLCB2MSwgIzEKK30KKworaW50NjR4Ml90IHRlc3RfdnNyaXFfbl9zNjQoaW50NjR4Ml90IGExLCBpbnQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl9zNjQKKyAgcmV0dXJuIHZzcmlxX25fczY0KGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52Mmk2NAorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuMmQgIHYwLCB2MSwgIzEKK30KKwordWludDh4MTZfdCB0ZXN0X3ZzcmlxX25fdTgodWludDh4MTZfdCBhMSwgdWludDh4MTZfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92c3JpcV9uX3U4CisgIHJldHVybiB2c3JpcV9uX3U4KGExLCBhMiwgMyk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52MTZpOAorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuMTZiIHYwLCB2MSwgIzMKK30KKwordWludDE2eDhfdCB0ZXN0X3ZzcmlxX25fdTE2KHVpbnQxNng4X3QgYTEsIHVpbnQxNng4X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl91MTYKKyAgcmV0dXJuIHZzcmlxX25fdTE2KGExLCBhMiwgMyk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52OGkxNgorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuOGggIHYwLCB2MSwgIzMKK30KKwordWludDMyeDRfdCB0ZXN0X3ZzcmlxX25fdTMyKHVpbnQzMng0X3QgYTEsIHVpbnQzMng0X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl91MzIKKyAgcmV0dXJuIHZzcmlxX25fdTMyKGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52NGkzMgorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuNHMgIHYwLCB2MSwgIzEKK30KKwordWludDY0eDJfdCB0ZXN0X3ZzcmlxX25fdTY0KHVpbnQ2NHgyX3QgYTEsIHVpbnQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl91NjQKKyAgcmV0dXJuIHZzcmlxX25fdTY0KGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52Mmk2NAorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuMmQgIHYwLCB2MSwgIzEKK30KKworcG9seTh4MTZfdCB0ZXN0X3ZzcmlxX25fcDgocG9seTh4MTZfdCBhMSwgcG9seTh4MTZfdCBhMikgeworICAvLyBDSEVDSzogdGVzdF92c3JpcV9uX3A4CisgIHJldHVybiB2c3JpcV9uX3A4KGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52MTZpOAorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuMTZiIHYwLCB2MSwgIzEKK30KKworcG9seTE2eDhfdCB0ZXN0X3ZzcmlxX25fcDE2KHBvbHkxNng4X3QgYTEsIHBvbHkxNng4X3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnNyaXFfbl9wMTYKKyAgcmV0dXJuIHZzcmlxX25fcDE2KGExLCBhMiwgMSk7CisgIC8vIENIRUNLOiBsbHZtLmFybTY0Lm5lb24udnNyaS52OGkxNgorICAvLyBDSEVDS19DT0RFR0VOOiBzcmkuOGggIHYwLCB2MSwgIzEKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybTY0X3Z0c3QuYyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92dHN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwYjM5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9hcm02NF92dHN0LmMKQEAgLTAsMCArMSwyMiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1PMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisvLyBUZXN0IEFSTTY0IFNJTUQgY29tcGFyaXNvbiB0ZXN0IGludHJpbnNpY3MKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK3VpbnQ2NHgyX3QgdGVzdF92dHN0cV9zNjQoaW50NjR4Ml90IGExLCBpbnQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnRzdHFfczY0CisgIHJldHVybiB2dHN0cV9zNjQoYTEsIGEyKTsKKyAgLy8gQ0hFQ0s6IFtbQ09NTU9OQklUUzolW0EtWmEtejAtOS5dK11dID0gYW5kIDwyIHggaTY0PiAlYTEsICVhMgorICAvLyBDSEVDSzogW1tNQVNLOiVbQS1aYS16MC05Ll0rXV0gPSBpY21wIG5lIDwyIHggaTY0PiBbW0NPTU1PTkJJVFNdXSwgemVyb2luaXRpYWxpemVyCisgIC8vIENIRUNLOiBbW1JFUzolW0EtWmEtejAtOS5dK11dID0gc2V4dCA8MiB4IGkxPiBbW01BU0tdXSB0byA8MiB4IGk2ND4KKyAgLy8gQ0hFQ0s6IHJldCA8MiB4IGk2ND4gW1tSRVNdXQorfQorCit1aW50NjR4Ml90IHRlc3RfdnRzdHFfdTY0KHVpbnQ2NHgyX3QgYTEsIHVpbnQ2NHgyX3QgYTIpIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfdnRzdHFfdTY0CisgIHJldHVybiB2dHN0cV91NjQoYTEsIGEyKTsKKyAgLy8gQ0hFQ0s6IFtbQ09NTU9OQklUUzolW0EtWmEtejAtOS5dK11dID0gYW5kIDwyIHggaTY0PiAlYTEsICVhMgorICAvLyBDSEVDSzogW1tNQVNLOiVbQS1aYS16MC05Ll0rXV0gPSBpY21wIG5lIDwyIHggaTY0PiBbW0NPTU1PTkJJVFNdXSwgemVyb2luaXRpYWxpemVyCisgIC8vIENIRUNLOiBbW1JFUzolW0EtWmEtejAtOS5dK11dID0gc2V4dCA8MiB4IGkxPiBbW01BU0tdXSB0byA8MiB4IGk2ND4KKyAgLy8gQ0hFQ0s6IHJldCA8MiB4IGk2ND4gW1tSRVNdXQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FybV9uZW9uX2ludHJpbnNpY3MuYyBiL3Rlc3QvQ29kZUdlbi9hcm1fbmVvbl9pbnRyaW5zaWNzLmMKaW5kZXggMWQ3NmU4YS4uOWVjMzQ1MSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2FybV9uZW9uX2ludHJpbnNpY3MuYworKysgYi90ZXN0L0NvZGVHZW4vYXJtX25lb25faW50cmluc2ljcy5jCkBAIC0xODg3LDYgKzE4ODcsMTIgQEAKICAgcmV0dXJuIHZkdXBfbl9wMTYoYSk7CiB9CiAKKy8vIENIRUNLOiB0ZXN0X3ZkdXBfbl9mMTYKKy8vIENIRUNLOiB2bGQxLjE2IHt7e2RbMC05XStcW1xdfX19CitmbG9hdDE2eDRfdCB0ZXN0X3ZkdXBfbl9mMTYoZmxvYXQxNl90ICphKSB7CisgIHJldHVybiB2ZHVwX25fZjE2KCphKTsKK30KKwogLy8gQ0hFQ0s6IHRlc3RfdmR1cF9uX2YzMgogLy8gQ0hFQ0s6IHZtb3YgCiBmbG9hdDMyeDJfdCB0ZXN0X3ZkdXBfbl9mMzIoZmxvYXQzMl90IGEpIHsKQEAgLTE5NDEsNiArMTk0NywxMiBAQAogICByZXR1cm4gdmR1cHFfbl9wMTYoYSk7CiB9CiAKKy8vIENIRUNLOiB0ZXN0X3ZkdXBxX25fZjE2CisvLyBDSEVDSzogdmxkMS4xNiB7e3tkWzAtOV0rXFtcXSwgZFswLTldK1xbXF19fX0KK2Zsb2F0MTZ4OF90IHRlc3RfdmR1cHFfbl9mMTYoZmxvYXQxNl90ICphKSB7CisgIHJldHVybiB2ZHVwcV9uX2YxNigqYSk7Cit9CisKIC8vIENIRUNLOiB0ZXN0X3ZkdXBxX25fZjMyCiAvLyBDSEVDSzogdm1vdiAKIGZsb2F0MzJ4NF90IHRlc3RfdmR1cHFfbl9mMzIoZmxvYXQzMl90IGEpIHsKQEAgLTQ4NjgsNiArNDg4MCwxMiBAQAogICByZXR1cm4gdm1vdl9uX3AxNihhKTsKIH0KIAorLy8gQ0hFQ0s6IHRlc3Rfdm1vdl9uX2YxNgorLy8gQ0hFQ0s6IHZsZDEuMTYge3t7ZFswLTldK1xbXF19fX0KK2Zsb2F0MTZ4NF90IHRlc3Rfdm1vdl9uX2YxNihmbG9hdDE2X3QgKmEpIHsKKyAgcmV0dXJuIHZtb3Zfbl9mMTYoKmEpOworfQorCiAvLyBDSEVDSzogdGVzdF92bW92X25fZjMyCiAvLyBDSEVDSzogdm1vdiAKIGZsb2F0MzJ4Ml90IHRlc3Rfdm1vdl9uX2YzMihmbG9hdDMyX3QgYSkgewpAQCAtNDkyMiw2ICs0OTQwLDEyIEBACiAgIHJldHVybiB2bW92cV9uX3AxNihhKTsKIH0KIAorLy8gQ0hFQ0s6IHRlc3Rfdm1vdnFfbl9mMTYKKy8vIENIRUNLOiB2bGQxLjE2IHt7e2RbMC05XStcW1xdLCBkWzAtOV0rXFtcXX19fQorZmxvYXQxNng4X3QgdGVzdF92bW92cV9uX2YxNihmbG9hdDE2X3QgKmEpIHsKKyAgcmV0dXJuIHZtb3ZxX25fZjE2KCphKTsKK30KKwogLy8gQ0hFQ0s6IHRlc3Rfdm1vdnFfbl9mMzIKIC8vIENIRUNLOiB2bW92IAogZmxvYXQzMng0X3QgdGVzdF92bW92cV9uX2YzMihmbG9hdDMyX3QgYSkgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2FzbV9hcm02NC5jIGIvdGVzdC9Db2RlR2VuL2FzbV9hcm02NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYWEzNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXNtX2FybTY0LmMKQEAgLTAsMCArMSw0NSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworCisvLyByZGFyOi8vOTE2NzI3NQorCitpbnQgdDEoKQoreworICBpbnQgeDsKKyAgX19hc21fXygibW92ICUwLCA3IiA6ICI9ciIgKHgpKTsKKyAgcmV0dXJuIHg7Cit9CisKK2xvbmcgdDIoKQoreworICBsb25nIHg7CisgIF9fYXNtX18oIm1vdiAlMCwgNyIgOiAiPXIiICh4KSk7CisgIHJldHVybiB4OworfQorCitsb25nIHQzKCkKK3sKKyAgbG9uZyB4OworICBfX2FzbV9fKCJtb3YgJXcwLCA3IiA6ICI9ciIgKHgpKTsKKyAgcmV0dXJuIHg7Cit9CisKKy8vIHJkYXI6Ly85MjgxMjA2CisKK3ZvaWQgdDQobG9uZyBvcCkgeworICBsb25nIHgxOworICBhc20gKCJtb3YgeDAsICUxOyBzdmMgIzA7IiA6ICI9ciIoeDEpIDoiciIob3ApLCJyIih4MSkgOiJ4MCIgKTsKK30KKworLy8gcmRhcjovLzkzOTQyOTAKKworZmxvYXQgdDUoZmxvYXQgeCkgeworICBfX2FzbV9fKCJmYWRkICUwLCAlMCwgJTAiIDogIit3IiAoeCkpOworICByZXR1cm4geDsKK30KKworLy8gcmRhcjovLzk4NjU3MTIKK3ZvaWQgdDYgKHZvaWQgKmYsIGludCBnKSB7CisgIC8vIENIRUNLOiB0NgorICAvLyBDSEVDSzogY2FsbCB2b2lkIGFzbSAic3RyICQxLCAkMCIsICI9KlEsciIKKyAgYXNtKCJzdHIgJTEsICUwIiA6ICI9USIoZikgOiAiciIoZykpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2F0b21pYy1hcm02NC5jIGIvdGVzdC9Db2RlR2VuL2F0b21pYy1hcm02NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2I1NzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vYXRvbWljLWFybTY0LmMKQEAgLTAsMCArMSw3MyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSAtdHJpcGxlPWFybTY0LWFwcGxlLWlvczcgfCBGaWxlQ2hlY2sgJXMKKworLy8gTWVtb3J5IG9yZGVyaW5nIHZhbHVlcy4KK2VudW0geworICBtZW1vcnlfb3JkZXJfcmVsYXhlZCA9IDAsCisgIG1lbW9yeV9vcmRlcl9jb25zdW1lID0gMSwKKyAgbWVtb3J5X29yZGVyX2FjcXVpcmUgPSAyLAorICBtZW1vcnlfb3JkZXJfcmVsZWFzZSA9IDMsCisgIG1lbW9yeV9vcmRlcl9hY3FfcmVsID0gNCwKKyAgbWVtb3J5X29yZGVyX3NlcV9jc3QgPSA1Cit9OworCit0eXBlZGVmIHN0cnVjdCB7IHZvaWQgKmEsICpiOyB9IHBvaW50ZXJfcGFpcl90OwordHlwZWRlZiBzdHJ1Y3QgeyB2b2lkICphLCAqYiwgKmMsICpkOyB9IHBvaW50ZXJfcXVhZF90OworCisvLyByZGFyOi8vMTM0ODk2NzkKKworZXh0ZXJuIF9BdG9taWMoX0Jvb2wpIGFfYm9vbDsKK2V4dGVybiBfQXRvbWljKGZsb2F0KSBhX2Zsb2F0OworZXh0ZXJuIF9BdG9taWModm9pZCopIGFfcG9pbnRlcjsKK2V4dGVybiBfQXRvbWljKHBvaW50ZXJfcGFpcl90KSBhX3BvaW50ZXJfcGFpcjsKK2V4dGVybiBfQXRvbWljKHBvaW50ZXJfcXVhZF90KSBhX3BvaW50ZXJfcXVhZDsKKworLy8gQ0hFQ0s6ICAgIGRlZmluZSB2b2lkIEB0ZXN0MCgpCisvLyBDSEVDSzogICAgICBbW1RFTVA6JS4qXV0gPSBhbGxvY2EgaTgsIGFsaWduIDEKKy8vIENIRUNLLU5FWFQ6IHN0b3JlIGk4IDEsIGk4KiBbW1RFTVBdXQorLy8gQ0hFQ0stTkVYVDogW1tUMDolLipdXSA9IGxvYWQgaTgqIFtbVEVNUF1dLCBhbGlnbiAxCisvLyBDSEVDSy1ORVhUOiBzdG9yZSBhdG9taWMgaTggW1tUMF1dLCBpOCogQGFfYm9vbCBzZXFfY3N0LCBhbGlnbiAxCit2b2lkIHRlc3QwKCkgeworICBfX2MxMV9hdG9taWNfc3RvcmUoJmFfYm9vbCwgMSwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworfQorCisvLyBDSEVDSzogICAgZGVmaW5lIHZvaWQgQHRlc3QxKCkKKy8vIENIRUNLOiAgICAgIFtbVEVNUDolLipdXSA9IGFsbG9jYSBmbG9hdCwgYWxpZ24gNAorLy8gQ0hFQ0stTkVYVDogc3RvcmUgZmxvYXQgMy4wMDAwMDBlKzAwLCBmbG9hdCogW1tURU1QXV0KKy8vIENIRUNLLU5FWFQ6IFtbVDA6JS4qXV0gPSBiaXRjYXN0IGZsb2F0KiBbW1RFTVBdXSB0byBpMzIqCisvLyBDSEVDSy1ORVhUOiBbW1QxOiUuKl1dID0gbG9hZCBpMzIqIFtbVDBdXSwgYWxpZ24gNAorLy8gQ0hFQ0stTkVYVDogc3RvcmUgYXRvbWljIGkzMiBbW1QxXV0sIGkzMiogYml0Y2FzdCAoZmxvYXQqIEBhX2Zsb2F0IHRvIGkzMiopIHNlcV9jc3QsIGFsaWduIDQKK3ZvaWQgdGVzdDEoKSB7CisgIF9fYzExX2F0b21pY19zdG9yZSgmYV9mbG9hdCwgMywgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworfQorCisvLyBDSEVDSzogICAgZGVmaW5lIHZvaWQgQHRlc3QyKCkKKy8vIENIRUNLOiAgICAgIFtbVEVNUDolLipdXSA9IGFsbG9jYSBpOCosIGFsaWduIDgKKy8vIENIRUNLLU5FWFQ6IHN0b3JlIGk4KiBAYV9ib29sLCBpOCoqIFtbVEVNUF1dCisvLyBDSEVDSy1ORVhUOiBbW1QwOiUuKl1dID0gYml0Y2FzdCBpOCoqIFtbVEVNUF1dIHRvIGk2NCoKKy8vIENIRUNLLU5FWFQ6IFtbVDE6JS4qXV0gPSBsb2FkIGk2NCogW1tUMF1dLCBhbGlnbiA4CisvLyBDSEVDSy1ORVhUOiBzdG9yZSBhdG9taWMgaTY0IFtbVDFdXSwgaTY0KiBiaXRjYXN0IChpOCoqIEBhX3BvaW50ZXIgdG8gaTY0Kikgc2VxX2NzdCwgYWxpZ24gOAordm9pZCB0ZXN0MigpIHsKKyAgX19jMTFfYXRvbWljX3N0b3JlKCZhX3BvaW50ZXIsICZhX2Jvb2wsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKK30KKworLy8gQ0hFQ0s6ICAgIGRlZmluZSB2b2lkIEB0ZXN0MygKKy8vIENIRUNLOiAgICAgIFtbUEFJUjolLipdXSA9IGFsbG9jYSBbW1BBSVJfVDolLipdXSwgYWxpZ24gOAorLy8gQ0hFQ0stTkVYVDogW1tURU1QOiUuKl1dID0gYWxsb2NhIFtbUEFJUl9UXV0sIGFsaWduIDgKKy8vIENIRUNLOiAgICAgIGxsdm0ubWVtY3B5CisvLyBDSEVDSy1ORVhUOiBbW1QwOiUuKl1dID0gYml0Y2FzdCBbW1BBSVJfVF1dKiBbW1RFTVBdXSB0byBpMTI4KgorLy8gQ0hFQ0stTkVYVDogW1tUMTolLipdXSA9IGxvYWQgaTEyOCogW1tUMF1dLCBhbGlnbiAxNgorLy8gQ0hFQ0stTkVYVDogc3RvcmUgYXRvbWljIGkxMjggW1tUMV1dLCBpMTI4KiBiaXRjYXN0IChbW1BBSVJfVF1dKiBAYV9wb2ludGVyX3BhaXIgdG8gaTEyOCopIHNlcV9jc3QsIGFsaWduIDE2Cit2b2lkIHRlc3QzKHBvaW50ZXJfcGFpcl90IHBhaXIpIHsKKyAgX19jMTFfYXRvbWljX3N0b3JlKCZhX3BvaW50ZXJfcGFpciwgcGFpciwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworfQorCisvLyBDSEVDSzogICAgZGVmaW5lIHZvaWQgQHRlc3Q0KFtbUVVBRF9UOiUuKl1dKgorLy8gQ0hFQ0s6ICAgICAgW1tURU1QOiUuKl1dID0gYWxsb2NhIFtbUVVBRF9UOiUuKl1dLCBhbGlnbiA4CisvLyBDSEVDSy1ORVhUOiBbW1QwOiUuKl1dID0gYml0Y2FzdCBbW1FVQURfVF1dKiBbW1RFTVBdXSB0byBpOCoKKy8vIENIRUNLLU5FWFQ6IFtbVDE6JS4qXV0gPSBiaXRjYXN0IFtbUVVBRF9UXV0qIHt7JS4qfX0gdG8gaTgqCisvLyBDSEVDSy1ORVhUOiBjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LnAwaTgucDBpOC5pNjQoaTgqIFtbVDBdXSwgaTgqIFtbVDFdXSwgaTY0IDMyLCBpMzIgOCwgaTEgZmFsc2UpCisvLyBDSEVDSy1ORVhUOiBbW1QwOiUuKl1dID0gYml0Y2FzdCBbW1FVQURfVF1dKiBbW1RFTVBdXSB0byBpOCoKKy8vIENIRUNLLU5FWFQ6IGNhbGwgdm9pZCBAX19hdG9taWNfc3RvcmUoaTY0IDMyLCBpOCogYml0Y2FzdCAoW1tRVUFEX1RdXSogQGFfcG9pbnRlcl9xdWFkIHRvIGk4KiksIGk4KiBbW1QwXV0sIGkzMiA1KQordm9pZCB0ZXN0NChwb2ludGVyX3F1YWRfdCBxdWFkKSB7CisgIF9fYzExX2F0b21pY19zdG9yZSgmYV9wb2ludGVyX3F1YWQsIHF1YWQsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hdG9taWMtb3BzLWxpYmNhbGwuYyBiL3Rlc3QvQ29kZUdlbi9hdG9taWMtb3BzLWxpYmNhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTJmZjVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuL2F0b21pYy1vcHMtbGliY2FsbC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSA8ICVzIC10cmlwbGUgYXJtdjVlLW5vbmUtbGludXgtZ251ZWFiaSAtZW1pdC1sbHZtIC1PMSB8IEZpbGVDaGVjayAlcworCitlbnVtIG1lbW9yeV9vcmRlciB7CisgIG1lbW9yeV9vcmRlcl9yZWxheGVkLCBtZW1vcnlfb3JkZXJfY29uc3VtZSwgbWVtb3J5X29yZGVyX2FjcXVpcmUsCisgIG1lbW9yeV9vcmRlcl9yZWxlYXNlLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCwgbWVtb3J5X29yZGVyX3NlcV9jc3QKK307CisKK2ludCAqdGVzdF9jMTFfYXRvbWljX2ZldGNoX2FkZF9pbnRfcHRyKF9BdG9taWMoaW50ICopICpwKSB7CisgIC8vIENIRUNLOiB0ZXN0X2MxMV9hdG9taWNfZmV0Y2hfYWRkX2ludF9wdHIKKyAgLy8gQ0hFQ0s6IHt7JVteIF0qfX0gPSB0YWlsIGNhbGwgaTMyKiBAX19hdG9taWNfZmV0Y2hfYWRkXzQoaTgqIHt7JVswLTldK319LCBpMzIgMTIsIGkzMiA1KQorICByZXR1cm4gX19jMTFfYXRvbWljX2ZldGNoX2FkZChwLCAzLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7Cit9CisKK2ludCAqdGVzdF9jMTFfYXRvbWljX2ZldGNoX3N1Yl9pbnRfcHRyKF9BdG9taWMoaW50ICopICpwKSB7CisgIC8vIENIRUNLOiB0ZXN0X2MxMV9hdG9taWNfZmV0Y2hfc3ViX2ludF9wdHIKKyAgLy8gQ0hFQ0s6IHt7JVteIF0qfX0gPSB0YWlsIGNhbGwgaTMyKiBAX19hdG9taWNfZmV0Y2hfc3ViXzQoaTgqIHt7JVswLTldK319LCBpMzIgMjAsIGkzMiA1KQorICByZXR1cm4gX19jMTFfYXRvbWljX2ZldGNoX3N1YihwLCA1LCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7Cit9CisKK2ludCB0ZXN0X2MxMV9hdG9taWNfZmV0Y2hfYWRkX2ludChfQXRvbWljKGludCkgKnApIHsKKyAgLy8gQ0hFQ0s6IHRlc3RfYzExX2F0b21pY19mZXRjaF9hZGRfaW50CisgIC8vIENIRUNLOiB7eyVbXiBdKn19ID0gdGFpbCBjYWxsIGkzMiBiaXRjYXN0IChpMzIqIChpOCosIGkzMiwgaTMyKSogQF9fYXRvbWljX2ZldGNoX2FkZF80IHRvIGkzMiAoaTgqLCBpMzIsIGkzMikqKShpOCoge3slWzAtOV0rfX0sIGkzMiAzLCBpMzIgNSkKKyAgcmV0dXJuIF9fYzExX2F0b21pY19mZXRjaF9hZGQocCwgMywgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworfQorCitpbnQgdGVzdF9jMTFfYXRvbWljX2ZldGNoX3N1Yl9pbnQoX0F0b21pYyhpbnQpICpwKSB7CisgIC8vIENIRUNLOiB0ZXN0X2MxMV9hdG9taWNfZmV0Y2hfc3ViX2ludAorICAvLyBDSEVDSzoge3slW14gXSp9fSA9IHRhaWwgY2FsbCBpMzIgYml0Y2FzdCAoaTMyKiAoaTgqLCBpMzIsIGkzMikqIEBfX2F0b21pY19mZXRjaF9zdWJfNCB0byBpMzIgKGk4KiwgaTMyLCBpMzIpKikoaTgqIHt7JVswLTldK319LCBpMzIgNSwgaTMyIDUpCisgIHJldHVybiBfX2MxMV9hdG9taWNfZmV0Y2hfc3ViKHAsIDUsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKK30KKworaW50ICpmcDJhKGludCAqKnApIHsKKyAgLy8gQ0hFQ0s6IEBmcDJhCisgIC8vIENIRUNLOiB7eyVbXiBdKn19ID0gdGFpbCBjYWxsIGkzMiogQF9fYXRvbWljX2ZldGNoX3N1Yl80KGk4KiB7eyVbMC05XSt9fSwgaTMyIDQsIGkzMiAwKQorICAvLyBOb3RlLCB0aGUgR05VIGJ1aWx0aW5zIGRvIG5vdCBtdWx0aXBseSBieSBzaXplb2YoVCkhCisgIHJldHVybiBfX2F0b21pY19mZXRjaF9zdWIocCwgNCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2F0b21pYy1vcHMuYyBiL3Rlc3QvQ29kZUdlbi9hdG9taWMtb3BzLmMKaW5kZXggODMwZjIxYS4uMjUxN2I2NyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2F0b21pYy1vcHMuYworKysgYi90ZXN0L0NvZGVHZW4vYXRvbWljLW9wcy5jCkBAIC05MSwxNCArOTEsMjAgQEAKIAogX0Jvb2wgZmk0KF9BdG9taWMoaW50KSAqaSkgewogICAvLyBDSEVDSzogQGZpNAotICAvLyBDSEVDSzogY21weGNoZyBpMzIqCisgIC8vIENIRUNLOiBbW09MRDolWy4wLTlBLVpfYS16XStdXSA9IGNtcHhjaGcgaTMyKiBbW1BUUjolWy4wLTlBLVpfYS16XStdXSwgaTMyIFtbRVhQRUNURUQ6JVsuMC05QS1aX2Etel0rXV0sIGkzMiBbW0RFU0lSRUQ6JVsuMC05QS1aX2Etel0rXV0KKyAgLy8gQ0hFQ0s6IFtbQ01QOiVbLjAtOUEtWl9hLXpdK11dID0gaWNtcCBlcSBpMzIgW1tPTERdXSwgW1tFWFBFQ1RFRF1dCisgIC8vIENIRUNLOiBiciBpMSBbW0NNUF1dLCBsYWJlbCAlW1tTVE9SRV9FWFBFQ1RFRDpbLjAtOUEtWl9hLXpdK11dLCBsYWJlbCAlW1tDT05USU5VRTpbLjAtOUEtWl9hLXpdK11dCisgIC8vIENIRUNLOiBzdG9yZSBpMzIgW1tPTERdXQogICBpbnQgY21wID0gMDsKICAgcmV0dXJuIF9fYzExX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhpLCAmY21wLCAxLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOwogfQogCiBfQm9vbCBmaTRhKGludCAqaSkgewogICAvLyBDSEVDSzogQGZpNAotICAvLyBDSEVDSzogY21weGNoZyBpMzIqCisgIC8vIENIRUNLOiBbW09MRDolWy4wLTlBLVpfYS16XStdXSA9IGNtcHhjaGcgaTMyKiBbW1BUUjolWy4wLTlBLVpfYS16XStdXSwgaTMyIFtbRVhQRUNURUQ6JVsuMC05QS1aX2Etel0rXV0sIGkzMiBbW0RFU0lSRUQ6JVsuMC05QS1aX2Etel0rXV0KKyAgLy8gQ0hFQ0s6IFtbQ01QOiVbLjAtOUEtWl9hLXpdK11dID0gaWNtcCBlcSBpMzIgW1tPTERdXSwgW1tFWFBFQ1RFRF1dCisgIC8vIENIRUNLOiBiciBpMSBbW0NNUF1dLCBsYWJlbCAlW1tTVE9SRV9FWFBFQ1RFRDpbLjAtOUEtWl9hLXpdK11dLCBsYWJlbCAlW1tDT05USU5VRTpbLjAtOUEtWl9hLXpdK11dCisgIC8vIENIRUNLOiBzdG9yZSBpMzIgW1tPTERdXQogICBpbnQgY21wID0gMDsKICAgaW50IGRlc2lyZWQgPSAxOwogICByZXR1cm4gX19hdG9taWNfY29tcGFyZV9leGNoYW5nZShpLCAmY21wLCAmZGVzaXJlZCwgMCwgbWVtb3J5X29yZGVyX2FjcXVpcmUsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKQEAgLTEwNiw3ICsxMTIsMTAgQEAKIAogX0Jvb2wgZmk0YihpbnQgKmkpIHsKICAgLy8gQ0hFQ0s6IEBmaTQKLSAgLy8gQ0hFQ0s6IGNtcHhjaGcgaTMyKgorICAvLyBDSEVDSzogW1tPTEQ6JVsuMC05QS1aX2Etel0rXV0gPSBjbXB4Y2hnIGkzMiogW1tQVFI6JVsuMC05QS1aX2Etel0rXV0sIGkzMiBbW0VYUEVDVEVEOiVbLjAtOUEtWl9hLXpdK11dLCBpMzIgW1tERVNJUkVEOiVbLjAtOUEtWl9hLXpdK11dCisgIC8vIENIRUNLOiBbW0NNUDolWy4wLTlBLVpfYS16XStdXSA9IGljbXAgZXEgaTMyIFtbT0xEXV0sIFtbRVhQRUNURURdXQorICAvLyBDSEVDSzogYnIgaTEgW1tDTVBdXSwgbGFiZWwgJVtbU1RPUkVfRVhQRUNURUQ6Wy4wLTlBLVpfYS16XStdXSwgbGFiZWwgJVtbQ09OVElOVUU6Wy4wLTlBLVpfYS16XStdXQorICAvLyBDSEVDSzogc3RvcmUgaTMyIFtbT0xEXV0KICAgaW50IGNtcCA9IDA7CiAgIHJldHVybiBfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24oaSwgJmNtcCwgMSwgMSwgbWVtb3J5X29yZGVyX2FjcXVpcmUsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKIH0KQEAgLTMwNiwxMyArMzE1LDkyIEBACiAgIC8vIENIRUNLOiB9CiB9CiAKLS8vIENIRUNLOiBAaW52YWxpZF9hdG9taWMKLXZvaWQgaW52YWxpZF9hdG9taWMoX0F0b21pYyhpbnQpICppKSB7Ci0gIF9fYzExX2F0b21pY19zdG9yZShpLCAxLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7Ci0gIF9fYzExX2F0b21pY19zdG9yZShpLCAxLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7Ci0gIF9fYzExX2F0b21pY19zdG9yZShpLCAxLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7Ci0gIF9fYzExX2F0b21pY19sb2FkKGksIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKLSAgX19jMTFfYXRvbWljX2xvYWQoaSwgbWVtb3J5X29yZGVyX2FjcV9yZWwpOworLy8gQ0hFQ0stTEFCRUw6IEBmYWlsdXJlT3JkZXIKK3ZvaWQgZmFpbHVyZU9yZGVyKF9BdG9taWMoaW50KSAqcHRyLCBpbnQgKnB0cjIpIHsKKyAgX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKHB0ciwgcHRyMiwgNDMsIG1lbW9yeV9vcmRlcl9hY3F1aXJlLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIC8vIENIRUNLOiBjbXB4Y2hnIGkzMioge3slWzAtOUEtWmEtei5fXSt9fSwgaTMyIHt7JVswLTlBLVphLXouX10rfX0sIGkzMiB7eyVbMC05QS1aYS16Xy5dK319IGFjcXVpcmUgbW9ub3RvbmljCisKKyAgX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhwdHIsIHB0cjIsIDQzLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAvLyBDSEVDSzogY21weGNoZyBpMzIqIHt7JVswLTlBLVphLXouX10rfX0sIGkzMiB7eyVbMC05QS1aYS16Ll9dK319LCBpMzIge3slWzAtOUEtWmEtel8uXSt9fSBzZXFfY3N0IGFjcXVpcmUKKworICAvLyBVbmtub3duIG9yZGVyaW5nOiBjb25zZXJ2YXRpdmVseSBwaWNrIHN0cm9uZ2VzdCB2YWxpZCBvcHRpb24gKGZvciBub3chKS4KKyAgX19hdG9taWNfY29tcGFyZV9leGNoYW5nZShwdHIyLCBwdHIyLCBwdHIyLCAwLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCwgKnB0cjIpOworICAvLyBDSEVDSzogY21weGNoZyBpMzIqIHt7JVswLTlBLVphLXouX10rfX0sIGkzMiB7eyVbMC05QS1aYS16Ll9dK319LCBpMzIge3slWzAtOUEtWmEtel8uXSt9fSBhY3FfcmVsIGFjcXVpcmUKKworICAvLyBVbmRlZmluZWQgYmVoYXZpb3VyOiBkb24ndCByZWFsbHkgY2FyZSB3aGF0IHRoYXQgbGFzdCBvcmRlcmluZyBpcyBzbyBsZWF2ZQorICAvLyBpdCBvdXQ6CisgIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbihwdHIyLCBwdHIyLCA0MywgMSwgbWVtb3J5X29yZGVyX3NlcV9jc3QsIDQyKTsKKyAgLy8gQ0hFQ0s6IGNtcHhjaGcgaTMyKiB7eyVbMC05QS1aYS16Ll9dK319LCBpMzIge3slWzAtOUEtWmEtei5fXSt9fSwgaTMyIHt7JVswLTlBLVphLXpfLl0rfX0gc2VxX2NzdAorfQorCisvLyBDSEVDSy1MQUJFTDogQGdlbmVyYWxGYWlsdXJlT3JkZXIKK3ZvaWQgZ2VuZXJhbEZhaWx1cmVPcmRlcihfQXRvbWljKGludCkgKnB0ciwgaW50ICpwdHIyLCBpbnQgc3VjY2VzcywgaW50IGZhaWwpIHsKKyAgX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKHB0ciwgcHRyMiwgNDIsIHN1Y2Nlc3MsIGZhaWwpOworICAvLyBDSEVDSzogc3dpdGNoIGkzMiB7ey4qfX0sIGxhYmVsICVbW01PTk9UT05JQzpbMC05YS16QS1aLl9dK11dIFsKKyAgLy8gQ0hFQ0stTkVYVDogaTMyIDEsIGxhYmVsICVbW0FDUVVJUkU6WzAtOWEtekEtWi5fXStdXQorICAvLyBDSEVDSy1ORVhUOiBpMzIgMiwgbGFiZWwgJVtbQUNRVUlSRV1dCisgIC8vIENIRUNLLU5FWFQ6IGkzMiAzLCBsYWJlbCAlW1tSRUxFQVNFOlswLTlhLXpBLVouX10rXV0KKyAgLy8gQ0hFQ0stTkVYVDogaTMyIDQsIGxhYmVsICVbW0FDUVJFTDpbMC05YS16QS1aLl9dK11dCisgIC8vIENIRUNLLU5FWFQ6IGkzMiA1LCBsYWJlbCAlW1tTRVFDU1Q6WzAtOWEtekEtWi5fXStdXQorCisgIC8vIENIRUNLOiBbW01PTk9UT05JQ11dCisgIC8vIENIRUNLOiBzd2l0Y2gge3suKn19LCBsYWJlbCAlW1tNT05PVE9OSUNfTU9OT1RPTklDOlswLTlhLXpBLVouX10rXV0gWworICAvLyBDSEVDSy1ORVhUOiBdCisKKyAgLy8gQ0hFQ0s6IFtbQUNRVUlSRV1dCisgIC8vIENIRUNLOiBzd2l0Y2gge3suKn19LCBsYWJlbCAlW1tBQ1FVSVJFX01PTk9UT05JQzpbMC05YS16QS1aLl9dK11dIFsKKyAgLy8gQ0hFQ0stTkVYVDogaTMyIDEsIGxhYmVsICVbW0FDUVVJUkVfQUNRVUlSRTpbMC05YS16QS1aLl9dK11dCisgIC8vIENIRUNLLU5FWFQ6IGkzMiAyLCBsYWJlbCAlW1tBQ1FVSVJFX0FDUVVJUkU6WzAtOWEtekEtWi5fXStdXQorICAvLyBDSEVDSy1ORVhUOiBdCisKKyAgLy8gQ0hFQ0s6IFtbUkVMRUFTRV1dCisgIC8vIENIRUNLOiBzd2l0Y2gge3suKn19LCBsYWJlbCAlW1tSRUxFQVNFX01PTk9UT05JQzpbMC05YS16QS1aLl9dK11dIFsKKyAgLy8gQ0hFQ0stTkVYVDogXQorCisgIC8vIENIRUNLOiBbW0FDUVJFTF1dCisgIC8vIENIRUNLOiBzd2l0Y2gge3suKn19LCBsYWJlbCAlW1tBQ1FSRUxfTU9OT1RPTklDOlswLTlhLXpBLVouX10rXV0gWworICAvLyBDSEVDSy1ORVhUOiBpMzIgMSwgbGFiZWwgJVtbQUNRUkVMX0FDUVVJUkU6WzAtOWEtekEtWi5fXStdXQorICAvLyBDSEVDSy1ORVhUOiBpMzIgMiwgbGFiZWwgJVtbQUNRUkVMX0FDUVVJUkU6WzAtOWEtekEtWi5fXStdXQorICAvLyBDSEVDSy1ORVhUOiBdCisKKyAgLy8gQ0hFQ0s6IFtbU0VRQ1NUXV0KKyAgLy8gQ0hFQ0s6IHN3aXRjaCB7ey4qfX0sIGxhYmVsICVbW1NFUUNTVF9NT05PVE9OSUM6WzAtOWEtekEtWi5fXStdXSBbCisgIC8vIENIRUNLLU5FWFQ6IGkzMiAxLCBsYWJlbCAlW1tTRVFDU1RfQUNRVUlSRTpbMC05YS16QS1aLl9dK11dCisgIC8vIENIRUNLLU5FWFQ6IGkzMiAyLCBsYWJlbCAlW1tTRVFDU1RfQUNRVUlSRTpbMC05YS16QS1aLl9dK11dCisgIC8vIENIRUNLLU5FWFQ6IGkzMiA1LCBsYWJlbCAlW1tTRVFDU1RfU0VRQ1NUOlswLTlhLXpBLVouX10rXV0KKyAgLy8gQ0hFQ0stTkVYVDogXQorCisgIC8vIENIRUNLOiBbW01PTk9UT05JQ19NT05PVE9OSUNdXQorICAvLyBDSEVDSzogY21weGNoZyB7ey4qfX0gbW9ub3RvbmljIG1vbm90b25pYworICAvLyBDSEVDSzogYnIKKworICAvLyBDSEVDSzogW1tBQ1FVSVJFX01PTk9UT05JQ11dCisgIC8vIENIRUNLOiBjbXB4Y2hnIHt7Lip9fSBhY3F1aXJlIG1vbm90b25pYworICAvLyBDSEVDSzogYnIKKworICAvLyBDSEVDSzogW1tBQ1FVSVJFX0FDUVVJUkVdXQorICAvLyBDSEVDSzogY21weGNoZyB7ey4qfX0gYWNxdWlyZSBhY3F1aXJlCisgIC8vIENIRUNLOiBicgorCisgIC8vIENIRUNLOiBbW0FDUVJFTF9NT05PVE9OSUNdXQorICAvLyBDSEVDSzogY21weGNoZyB7ey4qfX0gYWNxX3JlbCBtb25vdG9uaWMKKyAgLy8gQ0hFQ0s6IGJyCisKKyAgLy8gQ0hFQ0s6IFtbQUNRUkVMX0FDUVVJUkVdXQorICAvLyBDSEVDSzogY21weGNoZyB7ey4qfX0gYWNxX3JlbCBhY3F1aXJlCisgIC8vIENIRUNLOiBicgorCisgIC8vIENIRUNLOiBbW1NFUUNTVF9NT05PVE9OSUNdXQorICAvLyBDSEVDSzogY21weGNoZyB7ey4qfX0gc2VxX2NzdCBtb25vdG9uaWMKKyAgLy8gQ0hFQ0s6IGJyCisKKyAgLy8gQ0hFQ0s6IFtbU0VRQ1NUX0FDUVVJUkVdXQorICAvLyBDSEVDSzogY21weGNoZyB7ey4qfX0gc2VxX2NzdCBhY3F1aXJlCisgIC8vIENIRUNLOiBicgorCisgIC8vIENIRUNLOiBbW1NFUUNTVF9TRVFDU1RdXQorICAvLyBDSEVDSzogY21weGNoZyB7ey4qfX0gc2VxX2NzdCBzZXFfY3N0CisgIC8vIENIRUNLOiBicgogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9hdHRyLW9wdG5vbmUuYyBiL3Rlc3QvQ29kZUdlbi9hdHRyLW9wdG5vbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQ4NzNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuL2F0dHItb3B0bm9uZS5jCkBAIC0wLDAgKzEsMjUgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIDwgJXMgPiAldAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9UFJFU0VOVCA8ICV0CisvLyBSVU46IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1BQlNFTlQgIDwgJXQKKworX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCitpbnQgdGVzdDIoKSB7IHJldHVybiAwOyB9CisvLyBQUkVTRU5ULURBRzogQHRlc3Qye3suKn19W1tBVFRSMjojWzAtOV0rXV0KKworX19hdHRyaWJ1dGVfXygob3B0bm9uZSkpIF9fYXR0cmlidXRlX18oKG1pbnNpemUpKQoraW50IHRlc3QzKCkgeyByZXR1cm4gMDsgfQorLy8gUFJFU0VOVC1EQUc6IEB0ZXN0M3t7Lip9fVtbQVRUUjM6I1swLTldK11dCisKK19fYXR0cmlidXRlX18oKG9wdG5vbmUpKSBfX2F0dHJpYnV0ZV9fKChjb2xkKSkKK2ludCB0ZXN0NCgpIHsgcmV0dXJuIHRlc3QyKCk7IH0KKy8vIFBSRVNFTlQtREFHOiBAdGVzdDR7ey4qfX1bW0FUVFI0OiNbMC05XStdXQorLy8gQWxzbyBjaGVjayB0aGF0IHRlc3QyIGlzIGlubGluZWQgaW50byB0ZXN0NCAoYWx3YXlzX2lubGluZSBzdGlsbCB3b3JrcykuCisvLyBQUkVTRU5ULURBRy1OT1Q6IGNhbGwgaTMyIEB0ZXN0MgorCisvLyBDaGVjayBmb3IgYm90aCBub2lubGluZSBhbmQgb3B0bm9uZSBvbiBlYWNoIG9wdG5vbmUgZnVuY3Rpb24uCisvLyBQUkVTRU5ULURBRzogYXR0cmlidXRlcyBbW0FUVFIzXV0gPSB7IHt7Lip9fW5vaW5saW5le3suKn19b3B0bm9uZXt7Lip9fSB9CisvLyBQUkVTRU5ULURBRzogYXR0cmlidXRlcyBbW0FUVFI0XV0gPSB7IHt7Lip9fW5vaW5saW5le3suKn19b3B0bm9uZXt7Lip9fSB9CisKKy8vIENoZWNrIHRoYXQgbm8gJ29wdHNpemUnIG9yICdtaW5zaXplJyBhdHRyaWJ1dGVzIGFwcGVhci4KKy8vIEFCU0VOVC1OT1Q6IG9wdHNpemUKKy8vIEFCU0VOVC1OT1Q6IG1pbnNpemUKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9iaWctYXRvbWljLW9wcy5jIGIvdGVzdC9Db2RlR2VuL2JpZy1hdG9taWMtb3BzLmMKaW5kZXggYjA5YWVkZS4uMDFhMjgwMSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2JpZy1hdG9taWMtb3BzLmMKKysrIGIvdGVzdC9Db2RlR2VuL2JpZy1hdG9taWMtb3BzLmMKQEAgLTMxMSwxMyArMzExLDQgQEAKICAgLy8gQ0hFQ0s6IH0KIH0KIAotLy8gQ0hFQ0s6IEBpbnZhbGlkX2F0b21pYwotdm9pZCBpbnZhbGlkX2F0b21pYyhfQXRvbWljKGludCkgKmkpIHsKLSAgX19jMTFfYXRvbWljX3N0b3JlKGksIDEsIG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKLSAgX19jMTFfYXRvbWljX3N0b3JlKGksIDEsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKLSAgX19jMTFfYXRvbWljX3N0b3JlKGksIDEsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKLSAgX19jMTFfYXRvbWljX2xvYWQoaSwgbWVtb3J5X29yZGVyX3JlbGVhc2UpOwotICBfX2MxMV9hdG9taWNfbG9hZChpLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7Ci19Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2JpdGZpZWxkLTIuYyBiL3Rlc3QvQ29kZUdlbi9iaXRmaWVsZC0yLmMKaW5kZXggNThiMTdmMS4uYzUxNTRmYyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2JpdGZpZWxkLTIuYworKysgYi90ZXN0L0NvZGVHZW4vYml0ZmllbGQtMi5jCkBAIC0xMSw3ICsxMSw3IEBACiAvLyBDSEVDSy1SRUNPUkQ6ICoqKiBEdW1waW5nIElSZ2VuIFJlY29yZCBMYXlvdXQKIC8vIENIRUNLLVJFQ09SRDogUmVjb3JkOiBSZWNvcmREZWNse3suKn19czAKIC8vIENIRUNLLVJFQ09SRDogTGF5b3V0OiA8Q0dSZWNvcmRMYXlvdXQKLS8vIENIRUNLLVJFQ09SRDogICBMTFZNVHlwZTolc3RydWN0LnMwID0gdHlwZSA8eyBbMyB4IGk4XSB9PgorLy8gQ0hFQ0stUkVDT1JEOiAgIExMVk1UeXBlOiVzdHJ1Y3QuczAgPSB0eXBlIHsgWzMgeCBpOF0gfQogLy8gQ0hFQ0stUkVDT1JEOiAgIElzWmVyb0luaXRpYWxpemFibGU6MQogLy8gQ0hFQ0stUkVDT1JEOiAgIEJpdEZpZWxkczpbCiAvLyBDSEVDSy1SRUNPUkQ6ICAgICA8Q0dCaXRGaWVsZEluZm8gT2Zmc2V0OjAgU2l6ZToyNCBJc1NpZ25lZDoxIFN0b3JhZ2VTaXplOjI0IFN0b3JhZ2VBbGlnbm1lbnQ6MT4KQEAgLTUxLDcgKzUxLDcgQEAKIC8vIENIRUNLLVJFQ09SRDogKioqIER1bXBpbmcgSVJnZW4gUmVjb3JkIExheW91dAogLy8gQ0hFQ0stUkVDT1JEOiBSZWNvcmQ6IFJlY29yZERlY2x7ey4qfX1zMQogLy8gQ0hFQ0stUkVDT1JEOiBMYXlvdXQ6IDxDR1JlY29yZExheW91dAotLy8gQ0hFQ0stUkVDT1JEOiAgIExMVk1UeXBlOiVzdHJ1Y3QuczEgPSB0eXBlIDx7IFszIHggaThdIH0+CisvLyBDSEVDSy1SRUNPUkQ6ICAgTExWTVR5cGU6JXN0cnVjdC5zMSA9IHR5cGUgeyBbMyB4IGk4XSB9CiAvLyBDSEVDSy1SRUNPUkQ6ICAgSXNaZXJvSW5pdGlhbGl6YWJsZToxCiAvLyBDSEVDSy1SRUNPUkQ6ICAgQml0RmllbGRzOlsKIC8vIENIRUNLLVJFQ09SRDogICAgIDxDR0JpdEZpZWxkSW5mbyBPZmZzZXQ6MCBTaXplOjEwIElzU2lnbmVkOjEgU3RvcmFnZVNpemU6MjQgU3RvcmFnZUFsaWdubWVudDoxPgpAQCAtOTksNyArOTksNyBAQAogLy8gQ0hFQ0stUkVDT1JEOiAqKiogRHVtcGluZyBJUmdlbiBSZWNvcmQgTGF5b3V0CiAvLyBDSEVDSy1SRUNPUkQ6IFJlY29yZDogUmVjb3JkRGVjbHt7Lip9fXUyCiAvLyBDSEVDSy1SRUNPUkQ6IExheW91dDogPENHUmVjb3JkTGF5b3V0Ci0vLyBDSEVDSy1SRUNPUkQ6ICAgTExWTVR5cGU6JXVuaW9uLnUyID0gdHlwZSA8eyBpOCB9PgorLy8gQ0hFQ0stUkVDT1JEOiAgIExMVk1UeXBlOiV1bmlvbi51MiA9IHR5cGUgeyBpOCB9CiAvLyBDSEVDSy1SRUNPUkQ6ICAgSXNaZXJvSW5pdGlhbGl6YWJsZToxCiAvLyBDSEVDSy1SRUNPUkQ6ICAgQml0RmllbGRzOlsKIC8vIENIRUNLLVJFQ09SRDogICAgIDxDR0JpdEZpZWxkSW5mbyBPZmZzZXQ6MCBTaXplOjMgSXNTaWduZWQ6MCBTdG9yYWdlU2l6ZTo4IFN0b3JhZ2VBbGlnbm1lbnQ6MT4KQEAgLTI3MSw3ICsyNzEsNyBAQAogLy8gQ0hFQ0stUkVDT1JEOiAqKiogRHVtcGluZyBJUmdlbiBSZWNvcmQgTGF5b3V0CiAvLyBDSEVDSy1SRUNPUkQ6IFJlY29yZDogUmVjb3JkRGVjbHt7Lip9fXM3CiAvLyBDSEVDSy1SRUNPUkQ6IExheW91dDogPENHUmVjb3JkTGF5b3V0Ci0vLyBDSEVDSy1SRUNPUkQ6ICAgTExWTVR5cGU6JXN0cnVjdC5zNyA9IHR5cGUgeyBpMzIsIGkzMiwgaTMyLCBpOCwgWzMgeCBpOF0sIFs0IHggaThdLCBbMTIgeCBpOF0gfQorLy8gQ0hFQ0stUkVDT1JEOiAgIExMVk1UeXBlOiVzdHJ1Y3QuczcgPSB0eXBlIHsgaTMyLCBpMzIsIGkzMiwgaTgsIGkzMiwgWzEyIHggaThdIH0KIC8vIENIRUNLLVJFQ09SRDogICBJc1plcm9Jbml0aWFsaXphYmxlOjEKIC8vIENIRUNLLVJFQ09SRDogICBCaXRGaWVsZHM6WwogLy8gQ0hFQ0stUkVDT1JEOiAgICAgPENHQml0RmllbGRJbmZvIE9mZnNldDowIFNpemU6NSBJc1NpZ25lZDoxIFN0b3JhZ2VTaXplOjggU3RvcmFnZUFsaWdubWVudDo0PgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2Jsb2Nrc3RyZXQuYyBiL3Rlc3QvQ29kZUdlbi9ibG9ja3N0cmV0LmMKaW5kZXggZDVkYWU2Zi4uZWRkMTIxOCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2Jsb2Nrc3RyZXQuYworKysgYi90ZXN0L0NvZGVHZW4vYmxvY2tzdHJldC5jCkBAIC0xLDEzICsxLDIwIEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZibG9ja3MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luOSAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1YNjQKIC8vIFJVTjogJWNsYW5nX2NjMSAtZmJsb2NrcyAtdHJpcGxlIGk2ODYtYXBwbGUtZGFyd2luOSAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1YMzIKKy8vIFJVTjogJWNsYW5nX2NjMSAtZmJsb2NrcyAtdHJpcGxlIGFybTY0LWFwcGxlLWRhcndpbiAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1BUk02NAogCiAvLyBYNjQ6ICAgaW50ZXJuYWwgY29uc3RhbnQge3suKn19IHsgaTgqKiBAX05TQ29uY3JldGVHbG9iYWxCbG9jaywgaTMyIDE4NzkwNDgxOTIKLS8vIFg2NDogICAgIHN0b3JlIGkzMiAxNjEwNjEyNzM2LCBpMzIqICV3YW50CisvLyBYNjQ6ICAgc3RvcmUgaTMyIDE2MTA2MTI3MzYsIGkzMiogJXdhbnQKIAogLy8gWDMyOiAgIEBfTlNDb25jcmV0ZUdsb2JhbEJsb2NrLCBpMzIgMTg3OTA0ODE5MiwgaTMyIDAsCiAvLyBYMzI6ICAgc3RvcmUgaTMyIDE2MTA2MTI3MzYsIGkzMiogJXdhbnQKIAogLy8gcmRhcjovLzc2Nzc1MzcKKworLy8gQVJNNjQ6IEBfTlNDb25jcmV0ZUdsb2JhbEJsb2NrLCBpMzIgMTM0MjE3NzI4MCwgaTMyIDAsCisvLyBBUk02NDogc3RvcmUgaTMyIDE2MTA2MTI3MzYsIGkzMiogJXdhbnQKKworLy8gcmRhcjovLzk3NTcxMjYKKwogaW50IHByaW50Zihjb25zdCBjaGFyICosIC4uLik7CiB2b2lkICptYWxsb2MoX19TSVpFX1RZUEVfXyBzaXplKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2Jvb2wtY29udmVydC5jIGIvdGVzdC9Db2RlR2VuL2Jvb2wtY29udmVydC5jCmluZGV4IDhiZGU4MzcuLjM0NGZiNmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9ib29sLWNvbnZlcnQuYworKysgYi90ZXN0L0NvZGVHZW4vYm9vbC1jb252ZXJ0LmMKQEAgLTEsMTAgKzEsMjQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIDwgJXMgfCBncmVwIGkxIHwgY291bnQgMQorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1wYy1saW51eCAtZW1pdC1sbHZtIDwgJXMgfCBGaWxlQ2hlY2sgJXMKIC8vIEFsbCBvZiB0aGVzZSBzaG91bGQgdXNlcyB0aGUgbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIF9Cb29sCisKKy8vIENIRUNLLUxBQkVMOiAlc3RydWN0LnRlc3RzdHJ1Y3QxID0gdHlwZSB7IGk4LCBpOCB9CisvLyBDSEVDSy1MQUJFTDogQHRlc3QxID0gY29tbW9uIGdsb2JhbCAlc3RydWN0LnRlc3RzdHJ1Y3QxCiBzdHJ1Y3QgdGVzdHN0cnVjdDEge19Cb29sIGEsIGI7fSB0ZXN0MTsKKworLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0MiA9IGNvbW1vbiBnbG9iYWwgaTgqIG51bGwKIF9Cb29sKiB0ZXN0MjsKKworLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0MyA9IGNvbW1vbiBnbG9iYWwgWzEwIHggaThdCiBfQm9vbCB0ZXN0M1sxMF07CisKKy8vIENIRUNLLUxBQkVMOiBAdGVzdDQgPSBjb21tb24gZ2xvYmFsIFswIHggaThdKiBudWxsCiBfQm9vbCAoKnRlc3Q0KVtdOworCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQGYoaTMyICV4KQogdm9pZCBmKGludCB4KSB7CisgIC8vIENIRUNLOiBhbGxvY2EgaTgsIGFsaWduIDEKICAgX0Jvb2wgdGVzdDU7CisKKyAgLy8gQ0hFQ0s6IGFsbG9jYSBpOCwgaTMyICV7ey4qfX0sIGFsaWduIDEKICAgX0Jvb2wgdGVzdDZbeF07CiB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYm9vbC1pbml0LmMgYi90ZXN0L0NvZGVHZW4vYm9vbC1pbml0LmMKaW5kZXggMWE4ZjEyNy4uMDliNGE4NyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2Jvb2wtaW5pdC5jCisrKyBiL3Rlc3QvQ29kZUdlbi9ib29sLWluaXQuYwpAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIDwgJXMgfCBncmVwIGkxIHwgY291bnQgMQorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LXBjLWxpbnV4IC1lbWl0LWxsdm0gPCAlcyB8IEZpbGVDaGVjayAlcwogCiAvLyBDaGVjayB0aGF0IHRoZSB0eXBlIG9mIHRoaXMgZ2xvYmFsIGlzbid0IGkxCisvLyBDSEVDSzogQHRlc3QgPSBnbG9iYWwgaTggMQogX0Jvb2wgdGVzdCA9ICZ0ZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2Jvb2xfdGVzdC5jIGIvdGVzdC9Db2RlR2VuL2Jvb2xfdGVzdC5jCmluZGV4IGE0YWE2NjkuLmM4MzZiOTggMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9ib29sX3Rlc3QuYworKysgYi90ZXN0L0NvZGVHZW4vYm9vbF90ZXN0LmMKQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogcHBjMzItcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBwb3dlcnBjLXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjLWFwcGxlLW1hY29zeDEwLjQuMCAtZW1pdC1sbHZtIC1vIC0gJXMgLU8yIC1kaXNhYmxlLWxsdm0tb3B0em5zIHwgRmlsZUNoZWNrICVzCiAKIGludCBib29sc2l6ZSA9IHNpemVvZihfQm9vbCk7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYnJhbmNoLW9uLWJvb2wuYyBiL3Rlc3QvQ29kZUdlbi9icmFuY2gtb24tYm9vbC5jCmluZGV4IDc4ZGFlMWIuLjk4YTM4NDUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9icmFuY2gtb24tYm9vbC5jCisrKyBiL3Rlc3QvQ29kZUdlbi9icmFuY2gtb24tYm9vbC5jCkBAIC0xMiwxMSArMTIsMyBAQAogICBlbHNlCiAgICAgYmFyKCk7CiB9Ci0KLXZvaWQgZm9sZF9mb3IoaW50IGEsIGludCBiKSB7Ci0gIC8vIENIRUNLOiBkZWZpbmUge3suKn19IEBmb2xkX2ZvcigKLSAgLy8gQ0hFQ0stTk9UOiA9IHBoaQotICAvLyBDSEVDSzogfQotICBmb3IgKGludCBpID0gMDsgYSAmJiBpIDwgYjsgKytpKSBmb28oKTsKLSAgZm9yIChpbnQgaSA9IDA7IGEgfHwgaSA8IGI7ICsraSkgYmFyKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYnVpbHRpbi1tcy1ub29wLmNwcCBiL3Rlc3QvQ29kZUdlbi9idWlsdGluLW1zLW5vb3AuY3BwCmluZGV4IDdjNTA2OGQuLmI1NzllMmQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9idWlsdGluLW1zLW5vb3AuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbi9idWlsdGluLW1zLW5vb3AuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbXMtZXh0ZW5zaW9ucyAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZtcy1leHRlbnNpb25zIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogY2xhc3MgQSB7CiAgcHVibGljOgpAQCAtMTEsNCArMTEsMyBAQAogLy8gQ0hFQ0s6IHJldCB2b2lkCiAgIF9fbm9vcChBKCkpOwogfTsKLQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2J1aWx0aW5zLWFybS1leGNsdXNpdmUuYyBiL3Rlc3QvQ29kZUdlbi9idWlsdGlucy1hcm0tZXhjbHVzaXZlLmMKaW5kZXggN2VjY2I5ZS4uM2Q2Y2M1NCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2J1aWx0aW5zLWFybS1leGNsdXNpdmUuYworKysgYi90ZXN0L0NvZGVHZW4vYnVpbHRpbnMtYXJtLWV4Y2x1c2l2ZS5jCkBAIC0xLDUgKzEsNiBAQAogLy8gUkVRVUlSRVM6IGFybS1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC1XYWxsIC1XZXJyb3IgLXRyaXBsZSB0aHVtYnY3LWxpbnV4LWdudWVhYmkgLWZuby1zaWduZWQtY2hhciAtTzMgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLVdhbGwgLVdlcnJvciAtdHJpcGxlIGFybTY0LWFwcGxlLWlvczcuMCAtTzMgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLUFSTTY0CiAKIC8vIE1ha2Ugc3VyZSB0aGUgY2Fub25pY2FsIHVzZSB3b3JrcyBiZWZvcmUgZ29pbmcgaW50byBzbWFsbGVyIGRldGFpbHM6CiBpbnQgYXRvbWljX2luYyhpbnQgKmFkZHIpIHsKQEAgLTEyLDQ2ICsxMyw4MCBAQAogICByZXR1cm4gT2xkVmFsOwogfQogCi0vLyBDSEVDSzogQGF0b21pY19pbmMKKy8vIENIRUNLLUxBQkVMOiBAYXRvbWljX2luYwogLy8gQ0hFQ0s6ICAgW1tPTERWQUw6JS4qXV0gPSB0YWlsIGNhbGwgaTMyIEBsbHZtLmFybS5sZHJleC5wMGkzMihpMzIqICVhZGRyKQogLy8gQ0hFQ0s6ICAgW1tJTkM6JS4qXV0gPSBhZGQgbnN3IGkzMiBbW09MRFZBTF1dLCAxCiAvLyBDSEVDSzogICBbW0ZBSUxVUkU6JS4qXV0gPSB0YWlsIGNhbGwgaTMyIEBsbHZtLmFybS5zdHJleC5wMGkzMihpMzIgW1tJTkNdXSwgaTMyKiAlYWRkcikKIC8vIENIRUNLOiAgIFtbVFNUOiUuKl1dID0gaWNtcCBlcSBpMzIgW1tGQUlMVVJFXV0sIDAKIC8vIENIRUNLOiAgIGJyIGkxIFtbVFNUXV0sIGxhYmVsIHt7JVthLXpBLVowLTkuXSt9fSwgbGFiZWwge3slW2EtekEtWjAtOS5dK319CiAKKy8vIENIRUNLLUFSTTY0LUxBQkVMOiBAYXRvbWljX2luYworLy8gQ0hFQ0stQVJNNjQ6ICAgW1tPTERWQUw6JS4qXV0gPSB0YWlsIGNhbGwgaTY0IEBsbHZtLmFybTY0LmxkeHIucDBpMzIoaTMyKiAlYWRkcikKKy8vIENIRUNLLUFSTTY0OiAgIFtbSU5DOiUuKl1dID0gYWRkIGk2NCBbW09MRFZBTF1dLCAxCisvLyBDSEVDSy1BUk02NDogICBbW1RSVU5DOiUuKl1dID0gYW5kIGk2NCBbW0lOQ11dLCA0Mjk0OTY3Mjk1CisvLyBDSEVDSy1BUk02NDogICBbW0ZBSUxVUkU6JS4qXV0gPSB0YWlsIGNhbGwgaTMyIEBsbHZtLmFybTY0LnN0eHIucDBpMzIoaTY0IFtbVFJVTkNdXSwgaTMyKiAlYWRkcikKKy8vIENIRUNLLUFSTTY0OiAgIFtbVFNUOiUuKl1dID0gaWNtcCBlcSBpMzIgW1tGQUlMVVJFXV0sIDAKKy8vIENIRUNLLUFSTTY0OiAgIGJyIGkxIFtbVFNUXV0sIGxhYmVsIHt7JVthLXpBLVowLTkuXSt9fSwgbGFiZWwge3slW2EtekEtWjAtOS5dK319CisKIHN0cnVjdCBTaW1wbGUgewogICBjaGFyIGEsIGI7CiB9OwogCiBpbnQgdGVzdF9sZHJleChjaGFyICphZGRyLCBsb25nIGxvbmcgKmFkZHI2NCwgZmxvYXQgKmFkZHJmbG9hdCkgewotLy8gQ0hFQ0s6IEB0ZXN0X2xkcmV4CisvLyBDSEVDSy1MQUJFTDogQHRlc3RfbGRyZXgKKy8vIENIRUNLLUFSTTY0LUxBQkVMOiBAdGVzdF9sZHJleAogICBpbnQgc3VtID0gMDsKICAgc3VtICs9IF9fYnVpbHRpbl9hcm1fbGRyZXgoYWRkcik7CiAvLyBDSEVDSzogW1tJTlRSRVM6JS4qXV0gPSB0YWlsIGNhbGwgaTMyIEBsbHZtLmFybS5sZHJleC5wMGk4KGk4KiAlYWRkcikKIC8vIENIRUNLOiBhbmQgaTMyIFtbSU5UUkVTXV0sIDI1NQogCisvLyBDSEVDSy1BUk02NDogW1tJTlRSRVM6JS4qXV0gPSB0YWlsIGNhbGwgaTY0IEBsbHZtLmFybTY0LmxkeHIucDBpOChpOCogJWFkZHIpCisvLyBDSEVDSy1BUk02NDogW1tUUlVOQ1JFUzolLipdXSA9IHRydW5jIGk2NCBbW0lOVFJFU11dIHRvIGkzMgorLy8gQ0hFQ0stQVJNNjQ6IFtbU0VYVFRNUDolLipdXSA9IHNobCBpMzIgW1tUUlVOQ1JFU11dLCAyNAorLy8gQ0hFQ0stQVJNNjQ6IGFzaHIgZXhhY3QgaTMyIFtbU0VYVFRNUF1dLCAyNAorCiAgIHN1bSArPSBfX2J1aWx0aW5fYXJtX2xkcmV4KChzaG9ydCAqKWFkZHIpOwogLy8gQ0hFQ0s6IFtbQUREUjE2OiUuKl1dID0gYml0Y2FzdCBpOCogJWFkZHIgdG8gaTE2KgogLy8gQ0hFQ0s6IFtbSU5UUkVTOiUuKl1dID0gdGFpbCBjYWxsIGkzMiBAbGx2bS5hcm0ubGRyZXgucDBpMTYoaTE2KiBbW0FERFIxNl1dKQogLy8gQ0hFQ0s6IFtbVE1QU0VYVDolLipdXSA9IHNobCBpMzIgW1tJTlRSRVNdXSwgMTYKIC8vIENIRUNLOiBhc2hyIGV4YWN0IGkzMiBbW1RNUFNFWFRdXSwgMTYKIAorLy8gQ0hFQ0stQVJNNjQ6IFtbQUREUjE2OiUuKl1dID0gYml0Y2FzdCBpOCogJWFkZHIgdG8gaTE2KgorLy8gQ0hFQ0stQVJNNjQ6IFtbSU5UUkVTOiUuKl1dID0gdGFpbCBjYWxsIGk2NCBAbGx2bS5hcm02NC5sZHhyLnAwaTE2KGkxNiogW1tBRERSMTZdXSkKKy8vIENIRUNLLUFSTTY0OiBbW1RSVU5DUkVTOiUuKl1dID0gdHJ1bmMgaTY0IFtbSU5UUkVTXV0gdG8gaTMyCisvLyBDSEVDSy1BUk02NDogW1tUTVBTRVhUOiUuKl1dID0gc2hsIGkzMiBbW1RSVU5DUkVTXV0sIDE2CisvLyBDSEVDSy1BUk02NDogYXNociBleGFjdCBpMzIgW1tUTVBTRVhUXV0sIDE2CisKICAgc3VtICs9IF9fYnVpbHRpbl9hcm1fbGRyZXgoKGludCAqKWFkZHIpOwogLy8gQ0hFQ0s6IFtbQUREUjMyOiUuKl1dID0gYml0Y2FzdCBpOCogJWFkZHIgdG8gaTMyKgogLy8gQ0hFQ0s6ICBjYWxsIGkzMiBAbGx2bS5hcm0ubGRyZXgucDBpMzIoaTMyKiBbW0FERFIzMl1dKQogCisvLyBDSEVDSy1BUk02NDogW1tBRERSMzI6JS4qXV0gPSBiaXRjYXN0IGk4KiAlYWRkciB0byBpMzIqCisvLyBDSEVDSy1BUk02NDogW1tJTlRSRVM6JS4qXV0gPSB0YWlsIGNhbGwgaTY0IEBsbHZtLmFybTY0LmxkeHIucDBpMzIoaTMyKiBbW0FERFIzMl1dKQorLy8gQ0hFQ0stQVJNNjQ6IHRydW5jIGk2NCBbW0lOVFJFU11dIHRvIGkzMgorCiAgIHN1bSArPSBfX2J1aWx0aW5fYXJtX2xkcmV4KChsb25nIGxvbmcgKilhZGRyKTsKIC8vIENIRUNLOiBjYWxsIHsgaTMyLCBpMzIgfSBAbGx2bS5hcm0ubGRyZXhkKGk4KiAlYWRkcikKIAorLy8gQ0hFQ0stQVJNNjQ6IFtbQUREUjY0OiUuKl1dID0gYml0Y2FzdCBpOCogJWFkZHIgdG8gaTY0KgorLy8gQ0hFQ0stQVJNNjQ6IGNhbGwgaTY0IEBsbHZtLmFybTY0LmxkeHIucDBpNjQoaTY0KiBbW0FERFI2NF1dKQorCiAgIHN1bSArPSBfX2J1aWx0aW5fYXJtX2xkcmV4KGFkZHI2NCk7CiAvLyBDSEVDSzogW1tBRERSNjRfQVM4OiUuKl1dID0gYml0Y2FzdCBpNjQqICVhZGRyNjQgdG8gaTgqCiAvLyBDSEVDSzogY2FsbCB7IGkzMiwgaTMyIH0gQGxsdm0uYXJtLmxkcmV4ZChpOCogW1tBRERSNjRfQVM4XV0pCiAKKy8vIENIRUNLLUFSTTY0OiBjYWxsIGk2NCBAbGx2bS5hcm02NC5sZHhyLnAwaTY0KGk2NCogJWFkZHI2NCkKKwogICBzdW0gKz0gX19idWlsdGluX2FybV9sZHJleChhZGRyZmxvYXQpOwogLy8gQ0hFQ0s6IFtbSU5UQUREUjolLipdXSA9IGJpdGNhc3QgZmxvYXQqICVhZGRyZmxvYXQgdG8gaTMyKgogLy8gQ0hFQ0s6IFtbSU5UUkVTOiUuKl1dID0gdGFpbCBjYWxsIGkzMiBAbGx2bS5hcm0ubGRyZXgucDBpMzIoaTMyKiBbW0lOVEFERFJdXSkKIC8vIENIRUNLOiBiaXRjYXN0IGkzMiBbW0lOVFJFU11dIHRvIGZsb2F0CiAKKy8vIENIRUNLLUFSTTY0OiBbW0lOVEFERFI6JS4qXV0gPSBiaXRjYXN0IGZsb2F0KiAlYWRkcmZsb2F0IHRvIGkzMioKKy8vIENIRUNLLUFSTTY0OiBbW0lOVFJFUzolLipdXSA9IHRhaWwgY2FsbCBpNjQgQGxsdm0uYXJtNjQubGR4ci5wMGkzMihpMzIqIFtbSU5UQUREUl1dKQorLy8gQ0hFQ0stQVJNNjQ6IFtbVFJVTkNSRVM6JS4qXV0gPSB0cnVuYyBpNjQgW1tJTlRSRVNdXSB0byBpMzIKKy8vIENIRUNLLUFSTTY0OiBiaXRjYXN0IGkzMiBbW1RSVU5DUkVTXV0gdG8gZmxvYXQKKwogICBzdW0gKz0gX19idWlsdGluX2FybV9sZHJleCgoZG91YmxlICopYWRkcik7CiAvLyBDSEVDSzogW1tTVFJVQ1RSRVM6JS4qXV0gPSB0YWlsIGNhbGwgeyBpMzIsIGkzMiB9IEBsbHZtLmFybS5sZHJleGQoaTgqICVhZGRyKQogLy8gQ0hFQ0s6IFtbUkVTSEk6JS4qXV0gPSBleHRyYWN0dmFsdWUgeyBpMzIsIGkzMiB9IFtbU1RSVUNUUkVTXV0sIDEKQEAgLTYyLDUxICs5NywxMTAgQEAKIC8vIENIRUNLOiBbW0lOVFJFUzolLipdXSA9IG9yIGk2NCBbW1JFU0hJSEldXSwgW1tSRVNMTzY0XV0KIC8vIENIRUNLOiBiaXRjYXN0IGk2NCBbW0lOVFJFU11dIHRvIGRvdWJsZQogCisvLyBDSEVDSy1BUk02NDogW1tJTlRSRVM6JS4qXV0gPSB0YWlsIGNhbGwgaTY0IEBsbHZtLmFybTY0LmxkeHIucDBpNjQoaTY0KiBbW0FERFI2NF1dKQorLy8gQ0hFQ0stQVJNNjQ6IGJpdGNhc3QgaTY0IFtbSU5UUkVTXV0gdG8gZG91YmxlCisKICAgc3VtICs9ICpfX2J1aWx0aW5fYXJtX2xkcmV4KChpbnQgKiopYWRkcik7CiAvLyBDSEVDSzogW1tJTlRSRVM6JS4qXV0gPSB0YWlsIGNhbGwgaTMyIEBsbHZtLmFybS5sZHJleC5wMGkzMihpMzIqIFtbQUREUjMyXV0pCiAvLyBDSEVDSzogaW50dG9wdHIgaTMyIFtbSU5UUkVTXV0gdG8gaTMyKgogCisvLyBDSEVDSy1BUk02NDogW1tJTlRSRVM6JS4qXV0gPSB0YWlsIGNhbGwgaTY0IEBsbHZtLmFybTY0LmxkeHIucDBpNjQoaTY0KiBbW0FERFI2NF1dKQorLy8gQ0hFQ0stQVJNNjQ6IGludHRvcHRyIGk2NCBbW0lOVFJFU11dIHRvIGkzMioKKwogICBzdW0gKz0gX19idWlsdGluX2FybV9sZHJleCgoc3RydWN0IFNpbXBsZSAqKilhZGRyKS0+YTsKIC8vIENIRUNLOiBbW0lOVFJFUzolLipdXSA9IHRhaWwgY2FsbCBpMzIgQGxsdm0uYXJtLmxkcmV4LnAwaTMyKGkzMiogW1tBRERSMzJdXSkKIC8vIENIRUNLOiBpbnR0b3B0ciBpMzIgW1tJTlRSRVNdXSB0byAlc3RydWN0LlNpbXBsZSoKIAorLy8gQ0hFQ0stQVJNNjQ6IFtbSU5UUkVTOiUuKl1dID0gdGFpbCBjYWxsIGk2NCBAbGx2bS5hcm02NC5sZHhyLnAwaTY0KGk2NCogW1tBRERSNjRdXSkKKy8vIENIRUNLLUFSTTY0OiBpbnR0b3B0ciBpNjQgW1tJTlRSRVNdXSB0byAlc3RydWN0LlNpbXBsZSoKICAgcmV0dXJuIHN1bTsKIH0KIAogaW50IHRlc3Rfc3RyZXgoY2hhciAqYWRkcikgewotLy8gQ0hFQ0s6IEB0ZXN0X3N0cmV4CisvLyBDSEVDSy1MQUJFTDogQHRlc3Rfc3RyZXgKKy8vIENIRUNLLUFSTTY0LUxBQkVMOiBAdGVzdF9zdHJleAogICBpbnQgcmVzID0gMDsKICAgc3RydWN0IFNpbXBsZSB2YXIgPSB7MH07CiAgIHJlcyB8PSBfX2J1aWx0aW5fYXJtX3N0cmV4KDQsIGFkZHIpOwogLy8gQ0hFQ0s6IGNhbGwgaTMyIEBsbHZtLmFybS5zdHJleC5wMGk4KGkzMiA0LCBpOCogJWFkZHIpCiAKKy8vIENIRUNLLUFSTTY0OiBjYWxsIGkzMiBAbGx2bS5hcm02NC5zdHhyLnAwaTgoaTY0IDQsIGk4KiAlYWRkcikKKwogICByZXMgfD0gX19idWlsdGluX2FybV9zdHJleCg0MiwgKHNob3J0ICopYWRkcik7CiAvLyBDSEVDSzogW1tBRERSMTY6JS4qXV0gPSBiaXRjYXN0IGk4KiAlYWRkciB0byBpMTYqCiAvLyBDSEVDSzogIGNhbGwgaTMyIEBsbHZtLmFybS5zdHJleC5wMGkxNihpMzIgNDIsIGkxNiogW1tBRERSMTZdXSkKIAorLy8gQ0hFQ0stQVJNNjQ6IFtbQUREUjE2OiUuKl1dID0gYml0Y2FzdCBpOCogJWFkZHIgdG8gaTE2KgorLy8gQ0hFQ0stQVJNNjQ6ICBjYWxsIGkzMiBAbGx2bS5hcm02NC5zdHhyLnAwaTE2KGk2NCA0MiwgaTE2KiBbW0FERFIxNl1dKQorCiAgIHJlcyB8PSBfX2J1aWx0aW5fYXJtX3N0cmV4KDQyLCAoaW50ICopYWRkcik7CiAvLyBDSEVDSzogW1tBRERSMzI6JS4qXV0gPSBiaXRjYXN0IGk4KiAlYWRkciB0byBpMzIqCiAvLyBDSEVDSzogY2FsbCBpMzIgQGxsdm0uYXJtLnN0cmV4LnAwaTMyKGkzMiA0MiwgaTMyKiBbW0FERFIzMl1dKQogCisvLyBDSEVDSy1BUk02NDogW1tBRERSMzI6JS4qXV0gPSBiaXRjYXN0IGk4KiAlYWRkciB0byBpMzIqCisvLyBDSEVDSy1BUk02NDogY2FsbCBpMzIgQGxsdm0uYXJtNjQuc3R4ci5wMGkzMihpNjQgNDIsIGkzMiogW1tBRERSMzJdXSkKKwogICByZXMgfD0gX19idWlsdGluX2FybV9zdHJleCg0MiwgKGxvbmcgbG9uZyAqKWFkZHIpOwogLy8gQ0hFQ0s6IGNhbGwgaTMyIEBsbHZtLmFybS5zdHJleGQoaTMyIDQyLCBpMzIgMCwgaTgqICVhZGRyKQogCisvLyBDSEVDSy1BUk02NDogW1tBRERSNjQ6JS4qXV0gPSBiaXRjYXN0IGk4KiAlYWRkciB0byBpNjQqCisvLyBDSEVDSy1BUk02NDogY2FsbCBpMzIgQGxsdm0uYXJtNjQuc3R4ci5wMGk2NChpNjQgNDIsIGk2NCogW1tBRERSNjRdXSkKKwogICByZXMgfD0gX19idWlsdGluX2FybV9zdHJleCgyLjcxODI4ZiwgKGZsb2F0ICopYWRkcik7CiAvLyBDSEVDSzogY2FsbCBpMzIgQGxsdm0uYXJtLnN0cmV4LnAwaTMyKGkzMiAxMDc2NzU0NTA5LCBpMzIqIFtbQUREUjMyXV0pCiAKKy8vIENIRUNLLUFSTTY0OiBjYWxsIGkzMiBAbGx2bS5hcm02NC5zdHhyLnAwaTMyKGk2NCAxMDc2NzU0NTA5LCBpMzIqIFtbQUREUjMyXV0pCisKICAgcmVzIHw9IF9fYnVpbHRpbl9hcm1fc3RyZXgoMy4xNDE1OSwgKGRvdWJsZSAqKWFkZHIpOwogLy8gQ0hFQ0s6IGNhbGwgaTMyIEBsbHZtLmFybS5zdHJleGQoaTMyIC0yNjY2MzE1NzAsIGkzMiAxMDc0MzQwMzQ1LCBpOCogJWFkZHIpCiAKKy8vIENIRUNLLUFSTTY0OiBjYWxsIGkzMiBAbGx2bS5hcm02NC5zdHhyLnAwaTY0KGk2NCA0NjE0MjU2NjUwNTc2NjkyODQ2LCBpNjQqIFtbQUREUjY0XV0pCisKICAgcmVzIHw9IF9fYnVpbHRpbl9hcm1fc3RyZXgoJnZhciwgKHN0cnVjdCBTaW1wbGUgKiopYWRkcik7CiAvLyBDSEVDSzogW1tJTlRWQUw6JS4qXV0gPSBwdHJ0b2ludCBpMTYqICV2YXIgdG8gaTMyCiAvLyBDSEVDSzogY2FsbCBpMzIgQGxsdm0uYXJtLnN0cmV4LnAwaTMyKGkzMiBbW0lOVFZBTF1dLCBpMzIqIFtbQUREUjMyXV0pCiAKKy8vIENIRUNLLUFSTTY0OiBbW0lOVFZBTDolLipdXSA9IHB0cnRvaW50IGkxNiogJXZhciB0byBpNjQKKy8vIENIRUNLLUFSTTY0OiBjYWxsIGkzMiBAbGx2bS5hcm02NC5zdHhyLnAwaTY0KGk2NCBbW0lOVFZBTF1dLCBpNjQqIFtbQUREUjY0XV0pCisKICAgcmV0dXJuIHJlczsKIH0KIAogdm9pZCB0ZXN0X2NscmV4KCkgewotLy8gQ0hFQ0s6IEB0ZXN0X2NscmV4CisvLyBDSEVDSy1MQUJFTDogQHRlc3RfY2xyZXgKKy8vIENIRUNLLUFSTTY0LUxBQkVMOiBAdGVzdF9jbHJleAogCiAgIF9fYnVpbHRpbl9hcm1fY2xyZXgoKTsKIC8vIENIRUNLOiBjYWxsIHZvaWQgQGxsdm0uYXJtLmNscmV4KCkKKy8vIENIRUNLLUFSTTY0OiBjYWxsIHZvaWQgQGxsdm0uYXJtNjQuY2xyZXgoKQogfQorCisjaWZkZWYgX19hYXJjaDY0X18KKy8vIDEyOC1iaXQgdGVzdHMKKworX19pbnQxMjggdGVzdF9sZHJleF8xMjgoX19pbnQxMjggKmFkZHIpIHsKKy8vIENIRUNLLUFSTTY0LUxBQkVMOiBAdGVzdF9sZHJleF8xMjgKKworICByZXR1cm4gX19idWlsdGluX2FybV9sZHJleChhZGRyKTsKKy8vIENIRUNLLUFSTTY0OiBbW0FERFI4OiUuKl1dID0gYml0Y2FzdCBpMTI4KiAlYWRkciB0byBpOCoKKy8vIENIRUNLLUFSTTY0OiBbW1NUUlVDVFJFUzolLipdXSA9IHRhaWwgY2FsbCB7IGk2NCwgaTY0IH0gQGxsdm0uYXJtNjQubGR4cChpOCogW1tBRERSOF1dKQorLy8gQ0hFQ0stQVJNNjQ6IFtbUkVTSEk6JS4qXV0gPSBleHRyYWN0dmFsdWUgeyBpNjQsIGk2NCB9IFtbU1RSVUNUUkVTXV0sIDEKKy8vIENIRUNLLUFSTTY0OiBbW1JFU0xPOiUuKl1dID0gZXh0cmFjdHZhbHVlIHsgaTY0LCBpNjQgfSBbW1NUUlVDVFJFU11dLCAwCisvLyBDSEVDSy1BUk02NDogW1tSRVNISTY0OiUuKl1dID0gemV4dCBpNjQgW1tSRVNISV1dIHRvIGkxMjgKKy8vIENIRUNLLUFSTTY0OiBbW1JFU0xPNjQ6JS4qXV0gPSB6ZXh0IGk2NCBbW1JFU0xPXV0gdG8gaTEyOAorLy8gQ0hFQ0stQVJNNjQ6IFtbUkVTSElISTolLipdXSA9IHNobCBudXcgaTEyOCBbW1JFU0hJNjRdXSwgNjQKKy8vIENIRUNLLUFSTTY0OiBbW0lOVFJFUzolLipdXSA9IG9yIGkxMjggW1tSRVNISUhJXV0sIFtbUkVTTE82NF1dCisvLyBDSEVDSy1BUk02NDogcmV0IGkxMjggW1tJTlRSRVNdXQorfQorCitpbnQgdGVzdF9zdHJleF8xMjgoX19pbnQxMjggKmFkZHIsIF9faW50MTI4IHZhbCkgeworLy8gQ0hFQ0stQVJNNjQtTEFCRUw6IEB0ZXN0X3N0cmV4XzEyOAorCisgIHJldHVybiBfX2J1aWx0aW5fYXJtX3N0cmV4KHZhbCwgYWRkcik7CisvLyBDSEVDSy1BUk02NDogW1tWQUxMTzolLipdXSA9IHRydW5jIGkxMjggJXZhbCB0byBpNjQKKy8vIENIRUNLLUFSTTY0OiBbW1ZBTEhJMTI4OiUuKl1dID0gbHNociBpMTI4ICV2YWwsIDY0CisvLyBDSEVDSy1BUk02NDogW1tWQUxISTolLipdXSA9IHRydW5jIGkxMjggW1tWQUxISTEyOF1dIHRvIGk2NAorLy8gQ0hFQ0stQVJNNjQ6IFtbQUREUjg6JS4qXV0gPSBiaXRjYXN0IGkxMjgqICVhZGRyIHRvIGk4KgorLy8gQ0hFQ0stQVJNNjQ6IFtbUkVTOiUuKl1dID0gdGFpbCBjYWxsIGkzMiBAbGx2bS5hcm02NC5zdHhwKGk2NCBbW1ZBTExPXV0sIGk2NCBbW1ZBTEhJXV0sIGk4KiBbW0FERFI4XV0pCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9idWlsdGlucy1hcm02NC5jIGIvdGVzdC9Db2RlR2VuL2J1aWx0aW5zLWFybTY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkYTkyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9idWlsdGlucy1hcm02NC5jCkBAIC0wLDAgKzEsNiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zIC1PMyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKwordm9pZCBmMCh2b2lkICphLCB2b2lkICpiKSB7CisJX19jbGVhcl9jYWNoZShhLGIpOworLy8gQ0hFQ0s6IGNhbGwge3suKn19IEBfX2NsZWFyX2NhY2hlCit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYnVpbHRpbnMtbWlwcy1tc2EuYyBiL3Rlc3QvQ29kZUdlbi9idWlsdGlucy1taXBzLW1zYS5jCmluZGV4IDY5Y2I4ZTIuLjM4YWVhMDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9idWlsdGlucy1taXBzLW1zYS5jCisrKyBiL3Rlc3QvQ29kZUdlbi9idWlsdGlucy1taXBzLW1zYS5jCkBAIC03MDEsMTUgKzcwMSwxNSBAQAogICB2OGkxNl9yID0gX19idWlsdGluX21zYV9zaGZfaCh2OGkxNl9hLCAzKTsgLy8gQ0hFQ0s6IGNhbGwgPDggIHggaTE2PiBAbGx2bS5taXBzLnNoZi5oKAogICB2NGkzMl9yID0gX19idWlsdGluX21zYV9zaGZfdyh2NGkzMl9hLCAzKTsgLy8gQ0hFQ0s6IGNhbGwgPDQgIHggaTMyPiBAbGx2bS5taXBzLnNoZi53KAogCi0gIHYxNmk4X3IgPSBfX2J1aWx0aW5fbXNhX3NsZF9iKHYxNmk4X2EsIDEwKTsgLy8gQ0hFQ0s6IGNhbGwgPDE2IHggaTg+ICBAbGx2bS5taXBzLnNsZC5iKAotICB2OGkxNl9yID0gX19idWlsdGluX21zYV9zbGRfaCh2OGkxNl9hLCAxMCk7IC8vIENIRUNLOiBjYWxsIDw4ICB4IGkxNj4gQGxsdm0ubWlwcy5zbGQuaCgKLSAgdjRpMzJfciA9IF9fYnVpbHRpbl9tc2Ffc2xkX3codjRpMzJfYSwgMTApOyAvLyBDSEVDSzogY2FsbCA8NCAgeCBpMzI+IEBsbHZtLm1pcHMuc2xkLncoCi0gIHYyaTY0X3IgPSBfX2J1aWx0aW5fbXNhX3NsZF9kKHYyaTY0X2EsIDEwKTsgLy8gQ0hFQ0s6IGNhbGwgPDIgIHggaTY0PiBAbGx2bS5taXBzLnNsZC5kKAorICB2MTZpOF9yID0gX19idWlsdGluX21zYV9zbGRfYih2MTZpOF9yLCB2MTZpOF9hLCAxMCk7IC8vIENIRUNLOiBjYWxsIDwxNiB4IGk4PiAgQGxsdm0ubWlwcy5zbGQuYigKKyAgdjhpMTZfciA9IF9fYnVpbHRpbl9tc2Ffc2xkX2godjhpMTZfciwgdjhpMTZfYSwgMTApOyAvLyBDSEVDSzogY2FsbCA8OCAgeCBpMTY+IEBsbHZtLm1pcHMuc2xkLmgoCisgIHY0aTMyX3IgPSBfX2J1aWx0aW5fbXNhX3NsZF93KHY0aTMyX3IsIHY0aTMyX2EsIDEwKTsgLy8gQ0hFQ0s6IGNhbGwgPDQgIHggaTMyPiBAbGx2bS5taXBzLnNsZC53KAorICB2Mmk2NF9yID0gX19idWlsdGluX21zYV9zbGRfZCh2Mmk2NF9yLCB2Mmk2NF9hLCAxMCk7IC8vIENIRUNLOiBjYWxsIDwyICB4IGk2ND4gQGxsdm0ubWlwcy5zbGQuZCgKIAotICB2MTZpOF9yID0gX19idWlsdGluX21zYV9zbGRpX2IodjE2aThfYSwgMyk7IC8vIENIRUNLOiBjYWxsIDwxNiB4IGk4PiAgQGxsdm0ubWlwcy5zbGRpLmIoCi0gIHY4aTE2X3IgPSBfX2J1aWx0aW5fbXNhX3NsZGlfaCh2OGkxNl9hLCAzKTsgLy8gQ0hFQ0s6IGNhbGwgPDggIHggaTE2PiBAbGx2bS5taXBzLnNsZGkuaCgKLSAgdjRpMzJfciA9IF9fYnVpbHRpbl9tc2Ffc2xkaV93KHY0aTMyX2EsIDMpOyAvLyBDSEVDSzogY2FsbCA8NCAgeCBpMzI+IEBsbHZtLm1pcHMuc2xkaS53KAotICB2Mmk2NF9yID0gX19idWlsdGluX21zYV9zbGRpX2QodjJpNjRfYSwgMyk7IC8vIENIRUNLOiBjYWxsIDwyICB4IGk2ND4gQGxsdm0ubWlwcy5zbGRpLmQoCisgIHYxNmk4X3IgPSBfX2J1aWx0aW5fbXNhX3NsZGlfYih2MTZpOF9yLCB2MTZpOF9hLCAzKTsgLy8gQ0hFQ0s6IGNhbGwgPDE2IHggaTg+ICBAbGx2bS5taXBzLnNsZGkuYigKKyAgdjhpMTZfciA9IF9fYnVpbHRpbl9tc2Ffc2xkaV9oKHY4aTE2X3IsIHY4aTE2X2EsIDMpOyAvLyBDSEVDSzogY2FsbCA8OCAgeCBpMTY+IEBsbHZtLm1pcHMuc2xkaS5oKAorICB2NGkzMl9yID0gX19idWlsdGluX21zYV9zbGRpX3codjRpMzJfciwgdjRpMzJfYSwgMyk7IC8vIENIRUNLOiBjYWxsIDw0ICB4IGkzMj4gQGxsdm0ubWlwcy5zbGRpLncoCisgIHYyaTY0X3IgPSBfX2J1aWx0aW5fbXNhX3NsZGlfZCh2Mmk2NF9yLCB2Mmk2NF9hLCAzKTsgLy8gQ0hFQ0s6IGNhbGwgPDIgIHggaTY0PiBAbGx2bS5taXBzLnNsZGkuZCgKIAogICB2MTZpOF9yID0gX19idWlsdGluX21zYV9zbGxfYih2MTZpOF9hLCB2MTZpOF9iKTsgLy8gQ0hFQ0s6IGNhbGwgPDE2IHggaTg+ICBAbGx2bS5taXBzLnNsbC5iKAogICB2OGkxNl9yID0gX19idWlsdGluX21zYV9zbGxfaCh2OGkxNl9hLCB2OGkxNl9iKTsgLy8gQ0hFQ0s6IGNhbGwgPDggIHggaTE2PiBAbGx2bS5taXBzLnNsbC5oKApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2J1aWx0aW5zLW52cHR4LmMgYi90ZXN0L0NvZGVHZW4vYnVpbHRpbnMtbnZwdHguYwppbmRleCA3ZGVlZThlLi5jZWU5MDYxIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vYnVpbHRpbnMtbnZwdHguYworKysgYi90ZXN0L0NvZGVHZW4vYnVpbHRpbnMtbnZwdHguYwpAQCAtMSw1ICsxLDQgQEAKIC8vIFJFUVVJUkVTOiBudnB0eC1yZWdpc3RlcmVkLXRhcmdldAotLy8gUkVRVUlSRVM6IG52cHR4NjQtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG52cHR4LXVua25vd24tdW5rbm93biAtUyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG52cHR4NjQtdW5rbm93bi11bmtub3duIC1TIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vYnVpbHRpbnMtcHBjLWFsdGl2ZWMuYyBiL3Rlc3QvQ29kZUdlbi9idWlsdGlucy1wcGMtYWx0aXZlYy5jCmluZGV4IDQ3YTE5OGYuLjVjZDhkMzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9idWlsdGlucy1wcGMtYWx0aXZlYy5jCisrKyBiL3Rlc3QvQ29kZUdlbi9idWlsdGlucy1wcGMtYWx0aXZlYy5jCkBAIC0xLDQgKzEsNCBAQAotLy8gUkVRVUlSRVM6IHBwYzMyLXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogcG93ZXJwYy1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mYWx0aXZlYyAtdHJpcGxlIHBvd2VycGMtdW5rbm93bi11bmtub3duIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiB2ZWN0b3IgYm9vbCBjaGFyIHZiYyA9IHsgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2J1aWx0aW5zLXBwYy5jIGIvdGVzdC9Db2RlR2VuL2J1aWx0aW5zLXBwYy5jCmluZGV4IGVlMjdhNGMuLjllZjVlMzcgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9idWlsdGlucy1wcGMuYworKysgYi90ZXN0L0NvZGVHZW4vYnVpbHRpbnMtcHBjLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogcHBjMzItcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBwb3dlcnBjLXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjLXVua25vd24tdW5rbm93biAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogdm9pZCB0ZXN0X2VoX3JldHVybl9kYXRhX3JlZ25vKCkKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9jLXN0cmluZ3MuYyBiL3Rlc3QvQ29kZUdlbi9jLXN0cmluZ3MuYwppbmRleCBmZjg2NjE5Li5kODJiYzI1IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vYy1zdHJpbmdzLmMKKysrIGIvdGVzdC9Db2RlR2VuL2Mtc3RyaW5ncy5jCkBAIC0xLDE0ICsxLDE4IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSyAtLWNoZWNrLXByZWZpeD1JVEFOSVVNCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlbXNfYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0sgLS1jaGVjay1wcmVmaXg9TVNBQkkKIAogLy8gU2hvdWxkIGJlIDMgaGVsbG8gc3RyaW5ncywgdHdvIGdsb2JhbCAob2YgZGlmZmVyZW50IHNpemVzKSwgdGhlIHJlc3QgYXJlCiAvLyBzaGFyZWQuCiAKIC8vIENIRUNLOiBAYWxpZ24gPSBnbG9iYWwgaTggW1tBTElHTjpbMC05XStdXQotLy8gQ0hFQ0s6IEAuc3RyID0gcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzYgeCBpOF0gYyJoZWxsb1wwMCIKLS8vIENIRUNLOiBAZjEueCA9IGludGVybmFsIGdsb2JhbCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzYgeCBpOF0qIEAuc3RyLCBpMzIgMCwgaTMyIDApCisvLyBJVEFOSVVNOiBALnN0ciA9IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs2IHggaThdIGMiaGVsbG9cMDAiCisvLyBNU0FCSTogQCJcMDE/P19DQF8wNUNKQkFDR01CQGhlbGxvPyRBQUAiID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCBbNiB4IGk4XSBjImhlbGxvXDAwIiwgYWxpZ24gMQorLy8gSVRBTklVTTogQGYxLnggPSBpbnRlcm5hbCBnbG9iYWwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFs2IHggaThdKiBALnN0ciwgaTMyIDAsIGkzMiAwKQorLy8gTVNBQkk6IEBmMS54ID0gaW50ZXJuYWwgZ2xvYmFsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbNiB4IGk4XSogQCJcMDE/P19DQF8wNUNKQkFDR01CQGhlbGxvPyRBQUAiLCBpMzIgMCwgaTMyIDApCiAvLyBDSEVDSzogQGYyLnggPSBpbnRlcm5hbCBnbG9iYWwgWzYgeCBpOF0gYyJoZWxsb1wwMCIsIGFsaWduIFtbQUxJR05dXQogLy8gQ0hFQ0s6IEBmMy54ID0gaW50ZXJuYWwgZ2xvYmFsIFs4IHggaThdIGMiaGVsbG9cMDBcMDBcMDAiLCBhbGlnbiBbW0FMSUdOXV0KLS8vIENIRUNLOiBAZjQueCA9IGludGVybmFsIGdsb2JhbCAlc3RydWN0LnMgeyBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzYgeCBpOF0qIEAuc3RyLCBpMzIgMCwgaTMyIDApIH0KKy8vIElUQU5JVU06IEBmNC54ID0gaW50ZXJuYWwgZ2xvYmFsICVzdHJ1Y3QucyB7IGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbNiB4IGk4XSogQC5zdHIsIGkzMiAwLCBpMzIgMCkgfQorLy8gTVNBQkk6IEBmNC54ID0gaW50ZXJuYWwgZ2xvYmFsICVzdHJ1Y3QucyB7IGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbNiB4IGk4XSogQCJcMDE/P19DQF8wNUNKQkFDR01CQGhlbGxvPyRBQUAiLCBpMzIgMCwgaTMyIDApIH0KIC8vIENIRUNLOiBAeCA9IGdsb2JhbCBbMyB4IGk4XSBjIm9sYSIsIGFsaWduIFtbQUxJR05dXQogCiAjaWYgZGVmaW5lZChfX3MzOTB4X18pCkBAIC0yMiw3ICsyNiw4IEBACiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQGYwKCkKIHZvaWQgZjAoKSB7CiAgIGJhcigiaGVsbG8iKTsKLSAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAYmFyKHt7Lip9fSBALnN0cgorICAvLyBJVEFOSVVNOiBjYWxsIHZvaWQgQGJhcih7ey4qfX0gQC5zdHIKKyAgLy8gTVNBQkk6IGNhbGwgdm9pZCBAYmFyKHt7Lip9fSBAIlwwMT8/X0NAXzA1Q0pCQUNHTUJAaGVsbG8/JEFBQCIKIH0KIAogLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBmMSgpCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vY2FwdHVyZWQtc3RhdGVtZW50cy5jIGIvdGVzdC9Db2RlR2VuL2NhcHR1cmVkLXN0YXRlbWVudHMuYwppbmRleCBjODdjMTg3Li5iNTJkMTE1IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vY2FwdHVyZWQtc3RhdGVtZW50cy5jCisrKyBiL3Rlc3QvQ29kZUdlbi9jYXB0dXJlZC1zdGF0ZW1lbnRzLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtICVzIC1vICV0CiAvLyBSVU46IEZpbGVDaGVjayAlcyAtaW5wdXQtZmlsZT0ldCAtY2hlY2stcHJlZml4PUNIRUNLLUdMT0JBTFMKIC8vIFJVTjogRmlsZUNoZWNrICVzIC1pbnB1dC1maWxlPSV0IC1jaGVjay1wcmVmaXg9Q0hFQ0stMQogLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWlucHV0LWZpbGU9JXQgLWNoZWNrLXByZWZpeD1DSEVDSy0yCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vY2ZzdHJpbmcuYyBiL3Rlc3QvQ29kZUdlbi9jZnN0cmluZy5jCmluZGV4IDlkOThiNTYuLmZjODZlNDIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9jZnN0cmluZy5jCisrKyBiL3Rlc3QvQ29kZUdlbi9jZnN0cmluZy5jCkBAIC01LDkgKzUsOSBAQAogLy8KIC8vIFJVTjogJWNsYW5nX2NjMSAtZndyaXRhYmxlLXN0cmluZ3MgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAvLwotLy8gQ0hFQ0s6IEAuc3RyID0gbGlua2VyX3ByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFsxNCB4IGk4XSBjIkhlbGxvLCBXb3JsZCFcMDAiLCBhbGlnbiAxCi0vLyBDSEVDSzogQC5zdHIxID0gbGlua2VyX3ByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs3IHggaThdIGMieW8gam9lXDAwIiwgYWxpZ24gMQotLy8gQ0hFQ0s6IEAuc3RyMyA9IGxpbmtlcl9wcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbMTYgeCBpOF0gYyJHb29kYnllLCBXb3JsZCFcMDAiLCBhbGlnbiAxCisvLyBDSEVDSzogQC5zdHIgPSBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbMTQgeCBpOF0gYyJIZWxsbywgV29ybGQhXDAwIiwgc2VjdGlvbiAiX19URVhULF9fY3N0cmluZyxjc3RyaW5nX2xpdGVyYWxzIiwgYWxpZ24gMQorLy8gQ0hFQ0s6IEAuc3RyMSA9IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs3IHggaThdIGMieW8gam9lXDAwIiwgc2VjdGlvbiAiX19URVhULF9fY3N0cmluZyxjc3RyaW5nX2xpdGVyYWxzIiwgYWxpZ24gMQorLy8gQ0hFQ0s6IEAuc3RyMyA9IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFsxNiB4IGk4XSBjIkdvb2RieWUsIFdvcmxkIVwwMCIsIHNlY3Rpb24gIl9fVEVYVCxfX2NzdHJpbmcsY3N0cmluZ19saXRlcmFscyIsIGFsaWduIDEKIAogI2RlZmluZSBDRlNUUiBfX2J1aWx0aW5fX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZwogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vY2xlYXJfY2FjaGUuYyBiL3Rlc3QvQ29kZUdlbi9jbGVhcl9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTlkN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vY2xlYXJfY2FjaGUuYwpAQCAtMCwwICsxLDEyIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisKK2NoYXIgYnVmZmVyWzMyXSA9ICJUaGlzIGlzIGEgbGFyZ2VseSB1bnVzZWQgYnVmZmVyIjsKKworLy8gX19idWlsdGluX19fY2xlYXJfY2FjaGUgYWx3YXlzIG1hcHMgdG8gQGxsdm0uY2xlYXJfY2FjaGUsIGJ1dCB3aGF0CisvLyBlYWNoIGJhY2stZW5kIHByb2R1Y2VzIGlzIGRpZmZlcmVudCwgYW5kIHRoaXMgaXMgdGVzdGVkIGluIExMVk0KKworaW50IG1haW4oKSB7CisgIF9fYnVpbHRpbl9fX2NsZWFyX2NhY2hlKGJ1ZmZlciwgYnVmZmVyKzMyKTsKKy8vIENIRUNLOiBAbGx2bS5jbGVhcl9jYWNoZShpOCogZ2V0ZWxlbWVudHB0ciB7ey4qfX0sIGk4KiBnZXRlbGVtZW50cHRyIHt7Lip9fSAoaTgqIGdldGVsZW1lbnRwdHIge3suKn19IDMyKSkKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vY29tcGxleC1jb252ZXJ0LmMgYi90ZXN0L0NvZGVHZW4vY29tcGxleC1jb252ZXJ0LmMKaW5kZXggZTM1YmU5Yy4uNmVjYjg4NCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2NvbXBsZXgtY29udmVydC5jCisrKyBiL3Rlc3QvQ29kZUdlbi9jb21wbGV4LWNvbnZlcnQuYwpAQCAtMjIsOSArMjIsMTQgQEAKICAgX0NvbXBsZXggc2lnbmVkIGxvbmcgbG9uZyBjc2xsMTsKICAgX0NvbXBsZXggdW5zaWduZWQgbG9uZyBsb25nIGN1bGwxOwogICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQGZvbygKLSAgLy8gQ0hFQ0s6IGFsbG9jYSBpW1tDSFNJWkU6WzAtOV0rXV0sIGFsaWduIFtbQ0hBTElHTjpbMC05XStdXQotICAvLyBDSEVDSy1ORVhUOiBhbGxvY2EgaVtbQ0hTSVpFXV0sIGFsaWduIFtbQ0hBTElHTl1dCi0gIC8vIENIRUNLLU5FWFQ6IGFsbG9jYSBpW1tMTFNJWkU6WzAtOV0rXV0sIGFsaWduIFtbTExBTElHTjpbMC05XStdXQorICAvLyBNYXRjaCB0aGUgcHJvdG90eXBlIHRvIHBpY2sgdXAgdGhlIHNpemUgb2Ygc2MgYW5kIHNsbC4KKyAgLy8gQ0hFQ0s6IGlbW0NIU0laRTpbMC05XStdXXt7W14sXSp9fSwKKyAgLy8gQ0hFQ0s6IGlbW0NIU0laRV1de3tbXixdKn19LAorICAvLyBDSEVDSzogaVtbTExTSVpFOlswLTldK11dCisKKyAgLy8gTWF0Y2ggYWdhaW5zdCB0aGUgYWxsb2NhcyB0byBwaWNrIHVwIHRoZSBhbGlnbm1lbnRzLgorICAvLyBDSEVDSzogYWxsb2NhIGlbW0NIU0laRV1dLCBhbGlnbiBbW0NIQUxJR046WzAtOV0rXV0KKyAgLy8gQ0hFQ0s6IGFsbG9jYSBpW1tMTFNJWkVdXSwgYWxpZ24gW1tMTEFMSUdOOlswLTldK11dCiAKICAgc2MxID0gY3NjOwogICAvLyBDSEVDSzogJVtbVkFSMTpbQS1aYS16MC05Ll0rXV0gPSBnZXRlbGVtZW50cHRyIGluYm91bmRzIHsgaVtbQ0hTSVpFXV0sIGlbW0NIU0laRV1dICB9KiAlW1tDU0M6W0EtWmEtejAtOS5dK11dLCBpe3tbMC05XSt9fSAwLCBpe3tbMC05XSt9fSAwCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vY3h4LWRlZmF1bHQtYXJnLmNwcCBiL3Rlc3QvQ29kZUdlbi9jeHgtZGVmYXVsdC1hcmcuY3BwCmluZGV4IDEyZTI2NjYuLjc2ODhlNzkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9jeHgtZGVmYXVsdC1hcmcuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbi9jeHgtZGVmYXVsdC1hcmcuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gJXQKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAlcyAtbyAldAogCiAvLyBOb3RlLUxBQkVMOiBkZWZpbmUgQ0xBTkdfR0VORVJBVEVfS05PV05fR09PRCBhbmQgY29tcGlsZSB0byBnZW5lcmF0ZSBjb2RlCiAvLyB0aGF0IG1ha2VzIGFsbCBvZiB0aGUgZGVmYXVsdGVkIGFyZ3VtZW50cyBleHBsaWNpdC4gVGhlIHJlc3VsdGluZwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2Rhcndpbi1zdHJpbmctbGl0ZXJhbHMuYyBiL3Rlc3QvQ29kZUdlbi9kYXJ3aW4tc3RyaW5nLWxpdGVyYWxzLmMKaW5kZXggYzdkOWZmOS4uNDFlNTljYiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2Rhcndpbi1zdHJpbmctbGl0ZXJhbHMuYworKysgYi90ZXN0L0NvZGVHZW4vZGFyd2luLXN0cmluZy1saXRlcmFscy5jCkBAIC0xLDE3ICsxLDE3IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbjkgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFNCICVzCiAKIC8vIENIRUNLLUxTQjogQC5zdHIgPSBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbOCB4IGk4XSBjInN0cmluZzBcMDAiCi0vLyBDSEVDSy1MU0I6IEAuc3RyMSA9IGxpbmtlcl9wcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbOCB4IGk4XSBjInN0cmluZzFcMDAiCi0vLyBDSEVDSy1MU0I6IEAuc3RyMiA9IGludGVybmFsIHVubmFtZWRfYWRkciBjb25zdGFudCBbMTggeCBpMTZdIFtpMTYgMTA0LCBpMTYgMTAxLCBpMTYgMTA4LCBpMTYgMTA4LCBpMTYgMTExLCBpMTYgMzIsIGkxNiA4NTk0LCBpMTYgMzIsIGkxNiA5NzMxLCBpMTYgMzIsIGkxNiA4NTkyLCBpMTYgMzIsIGkxNiAxMTksIGkxNiAxMTEsIGkxNiAxMTQsIGkxNiAxMDgsIGkxNiAxMDAsIGkxNiAwXSwgYWxpZ24gMgotLy8gQ0hFQ0stTFNCOiBALnN0cjQgPSBpbnRlcm5hbCB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzYgeCBpMTZdIFtpMTYgMTE2LCBpMTYgMTAxLCBpMTYgMTE1LCBpMTYgMTE2LCBpMTYgODQ4MiwgaTE2IDBdLCBhbGlnbiAyCisvLyBDSEVDSy1MU0I6IEAuc3RyMSA9IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs4IHggaThdIGMic3RyaW5nMVwwMCIKKy8vIENIRUNLLUxTQjogQC5zdHIyID0gcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzE4IHggaTE2XSBbaTE2IDEwNCwgaTE2IDEwMSwgaTE2IDEwOCwgaTE2IDEwOCwgaTE2IDExMSwgaTE2IDMyLCBpMTYgODU5NCwgaTE2IDMyLCBpMTYgOTczMSwgaTE2IDMyLCBpMTYgODU5MiwgaTE2IDMyLCBpMTYgMTE5LCBpMTYgMTExLCBpMTYgMTE0LCBpMTYgMTA4LCBpMTYgMTAwLCBpMTYgMF0sIHNlY3Rpb24gIl9fVEVYVCxfX3VzdHJpbmciLCBhbGlnbiAyCisvLyBDSEVDSy1MU0I6IEAuc3RyNCA9IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs2IHggaTE2XSBbaTE2IDExNiwgaTE2IDEwMSwgaTE2IDExNSwgaTE2IDExNiwgaTE2IDg0ODIsIGkxNiAwXSwgc2VjdGlvbiAiX19URVhULF9fdXN0cmluZyIsIGFsaWduIDIKIAogCiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjLWFwcGxlLWRhcndpbjkgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTVNCICVzCiAKIC8vIENIRUNLLU1TQjogQC5zdHIgPSBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbOCB4IGk4XSBjInN0cmluZzBcMDAiCi0vLyBDSEVDSy1NU0I6IEAuc3RyMSA9IGxpbmtlcl9wcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbOCB4IGk4XSBjInN0cmluZzFcMDAiCi0vLyBDSEVDSy1NU0I6IEAuc3RyMiA9IGludGVybmFsIHVubmFtZWRfYWRkciBjb25zdGFudCBbMTggeCBpMTZdIFtpMTYgMTA0LCBpMTYgMTAxLCBpMTYgMTA4LCBpMTYgMTA4LCBpMTYgMTExLCBpMTYgMzIsIGkxNiA4NTk0LCBpMTYgMzIsIGkxNiA5NzMxLCBpMTYgMzIsIGkxNiA4NTkyLCBpMTYgMzIsIGkxNiAxMTksIGkxNiAxMTEsIGkxNiAxMTQsIGkxNiAxMDgsIGkxNiAxMDAsIGkxNiAwXSwgYWxpZ24gMgotLy8gQ0hFQ0stTVNCOiBALnN0cjQgPSBpbnRlcm5hbCB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzYgeCBpMTZdIFtpMTYgMTE2LCBpMTYgMTAxLCBpMTYgMTE1LCBpMTYgMTE2LCBpMTYgODQ4MiwgaTE2IDBdLCBhbGlnbiAyCisvLyBDSEVDSy1NU0I6IEAuc3RyMSA9IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs4IHggaThdIGMic3RyaW5nMVwwMCIKKy8vIENIRUNLLU1TQjogQC5zdHIyID0gcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzE4IHggaTE2XSBbaTE2IDEwNCwgaTE2IDEwMSwgaTE2IDEwOCwgaTE2IDEwOCwgaTE2IDExMSwgaTE2IDMyLCBpMTYgODU5NCwgaTE2IDMyLCBpMTYgOTczMSwgaTE2IDMyLCBpMTYgODU5MiwgaTE2IDMyLCBpMTYgMTE5LCBpMTYgMTExLCBpMTYgMTE0LCBpMTYgMTA4LCBpMTYgMTAwLCBpMTYgMF0sIHNlY3Rpb24gIl9fVEVYVCxfX3VzdHJpbmciLCBhbGlnbiAyCisvLyBDSEVDSy1NU0I6IEAuc3RyNCA9IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs2IHggaTE2XSBbaTE2IDExNiwgaTE2IDEwMSwgaTE2IDExNSwgaTE2IDExNiwgaTE2IDg0ODIsIGkxNiAwXSwgc2VjdGlvbiAiX19URVhULF9fdXN0cmluZyIsIGFsaWduIDIKIAogY29uc3QgY2hhciAqZzAgPSAic3RyaW5nMCI7CiBjb25zdCB2b2lkICpnMSA9IF9fYnVpbHRpbl9fX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKCJzdHJpbmcxIik7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vZGVidWctZGVhZC1sb2NhbC12YXIuYyBiL3Rlc3QvQ29kZUdlbi9kZWJ1Zy1kZWFkLWxvY2FsLXZhci5jCmluZGV4IGY5Y2E4ZjIuLjE5Y2Q2ZmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9kZWJ1Zy1kZWFkLWxvY2FsLXZhci5jCisrKyBiL3Rlc3QvQ29kZUdlbi9kZWJ1Zy1kZWFkLWxvY2FsLXZhci5jCkBAIC0xLDQgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1tbGx2bSAtYXNtLXZlcmJvc2UgLVMgLU8yIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIEZJWE1FOiBDaGVjayBJUiByYXRoZXIgdGhhbiBhc20sIHRoZW4gdHJpcGxlIGlzIG5vdCBuZWVkZWQuCisvLyBSVU46ICVjbGFuZ19jYzEgLW1sbHZtIC1hc20tdmVyYm9zZSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLVMgLU8yIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIC8vIFJhZGFyIDgxMjI4NjQKIAogLy8gQ29kZSBpcyBub3QgZ2VuZXJhdGVkIGZvciBmdW5jdGlvbiBmb28sIGJ1dCBwcmVzZXJ2ZSB0eXBlIGluZm9ybWF0aW9uIG9mCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vZGVidWctaW5mby1ibG9jay5jIGIvdGVzdC9Db2RlR2VuL2RlYnVnLWluZm8tYmxvY2suYwppbmRleCA0MDNlNGFhLi4zNWVlMGRkIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vZGVidWctaW5mby1ibG9jay5jCisrKyBiL3Rlc3QvQ29kZUdlbi9kZWJ1Zy1pbmZvLWJsb2NrLmMKQEAgLTEsNSArMSw0IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZibG9ja3MgLWcgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCi0vLyBBUFBMRSBMT0NBTCBmaWxlIDU5Mzk4OTQgKi8KIC8vIFZlcmlmeSB0aGF0IHRoZSBkZXNpcmVkIGRlYnVnZ2luZyB0eXBlIGlzIGdlbmVyYXRlZCBmb3IgYSBzdHJ1Y3R1cmUKIC8vICBtZW1iZXIgdGhhdCBpcyBhIHBvaW50ZXIgdG8gYSBibG9jay4gCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9kZWJ1Zy1pbmZvLWl2LmMgYi90ZXN0L0NvZGVHZW4vZGVidWctaW5mby1pdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWZkNzFkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvQ29kZUdlbi9kZWJ1Zy1pbmZvLWl2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1PcyAtUyAtZyAgLW8gLSAlcyB8IEZpbGVDaGVjayAlcwotLy8gUkVRVUlSRVM6IHg4Ni1yZWdpc3RlcmVkLXRhcmdldAotCi1pbnQgY2FsY3VsYXRlKGludCk7Ci1zdGF0aWMgdm9pZCB0ZXN0X2luZHZhcnMoaW50ICpBcnJheTEsIGludCBBcnJheTJbMTAwXVsyMDBdKSB7Ci0gIHVuc2lnbmVkIGksIGo7Ci0gIEFycmF5MVsxXSA9IEFycmF5MlszXVs2XSA9IDEyMzQ1OwotCi0gIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrPTIpCi0gICAgQXJyYXkxW2ldID0gaTsgICAgICAgICAgIC8qIFN0ZXAgYnkgbm9uIHVuaXQgYW1vdW50ICovCi0KLSAgZm9yIChpID0gMzsgaSA8IDEwMzsgaSsrKQotICAgIEFycmF5MVtpXSA9IGkrNDsgICAgICAgICAvKiBTdGVwIHdpdGggYW4gb2Zmc2V0ICovCi0KLSAgZm9yIChpID0gMTM7IGkgPCAxMDA7IGkrKykKLSAgICBmb3IgKGogPSAwOyBqIDwgMTAwOyBqKz0zKSAgICAgICAvKiAyZCBhcnJheSBhY2Nlc3MgKi8KLSAgICAgIEFycmF5MltpXVtqLzNdID0gQXJyYXkyW2ldW2ldOwotfQotCi0KLWludCBtYWluKCkgewotICBpbnQgQXJyYXlbMTAwXVsyMDBdLCBpLCBqOwotICBkb3VibGUgc3VtID0gMC4wOwotCi0gIGZvciAoaT0wOyBpIDwgMTAwOyBpKz0yKQotICAgIGZvciAoaj0wOyBqIDwgMjAwOyBqKyspCi0gICAgICBBcnJheVtpXVtqXSA9IDA7Ci0gIHRlc3RfaW5kdmFycyhBcnJheVswXSwgQXJyYXkpOwotCi0vL0NIRUNLOgkubG9jCTIgMzEKLSAgZm9yIChpPTA7IGkgPCAxMDA7IGkrPTIpCi0gICAgZm9yIChqPTA7IGogPCAyMDA7IGorKykKLSAgICAgIHN1bSArPSBBcnJheVtpXVtqXTsKLQotICByZXR1cm4gY2FsY3VsYXRlKHN1bSk7Ci19CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vZGVidWctaW5mby10eXBlZGVmLmMgYi90ZXN0L0NvZGVHZW4vZGVidWctaW5mby10eXBlZGVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlYmNjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9kZWJ1Zy1pbmZvLXR5cGVkZWYuYwpAQCAtMCwwICsxLDExIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtZyAtSSVwICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFRlc3QgdGhhdCB0aGUgbG9jYXRpb24gb2YgdGhlIHR5cGVkZWYgcG9pbnRzIHRvIHRoZSBoZWFkZXIgZmlsZS4KKyNsaW5lIDEgImEuYyIKKyNsaW5lIDIgImIuaCIKK3R5cGVkZWYgaW50IE15VHlwZTsKKyNsaW5lIDIgImEuYyIKKworTXlUeXBlIGE7CisKKy8vIENIRUNLOiBtZXRhZGF0YSAhW1tIRUFERVI6WzAtOV0rXV0sIG51bGwsIG1ldGFkYXRhICEiTXlUeXBlInt7Lip9fSA7IFsgRFdfVEFHX3R5cGVkZWYgXSBbTXlUeXBlXSBbbGluZSAyLCBzaXplIDAsIGFsaWduIDAsIG9mZnNldCAwXSBbZnJvbSBpbnRdCisvLyBDSEVDSzogIVtbSEVBREVSXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYi5oIiwKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9kZWJ1Zy1pbmZvLXZhci1sb2NhdGlvbi5jIGIvdGVzdC9Db2RlR2VuL2RlYnVnLWluZm8tdmFyLWxvY2F0aW9uLmMKaW5kZXggMTJlZGIwOC4uNDFkYTdkMyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2RlYnVnLWluZm8tdmFyLWxvY2F0aW9uLmMKKysrIGIvdGVzdC9Db2RlR2VuL2RlYnVnLWluZm8tdmFyLWxvY2F0aW9uLmMKQEAgLTEsNCArMSw1IEBACi0vLyBSVU46ICVjbGFuZyAtUyAtZyAtZnZlcmJvc2UtYXNtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIEZJWE1FOiBDaGVjayBJUiByYXRoZXIgdGhhbiBhc20sIHRoZW4gdHJpcGxlIGlzIG5vdCBuZWVkZWQuCisvLyBSVU46ICVjbGFuZyAtWGNsYW5nIC10cmlwbGU9JWl0YW5pdW1fYWJpX3RyaXBsZSAtUyAtZyAtZnZlcmJvc2UtYXNtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIC8vIFJhZGFyIDg0NjEwMzIKIC8vIENIRUNLOiBEV19BVF9sb2NhdGlvbgogLy8gQ0hFQ0stTkVYVDogYnl0ZSAxNDUKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9kbGxpbXBvcnQtZGxsZXhwb3J0LmMgYi90ZXN0L0NvZGVHZW4vZGxsaW1wb3J0LWRsbGV4cG9ydC5jCmluZGV4IGU3MGFjMDMuLmIwMDVlMzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9kbGxpbXBvcnQtZGxsZXhwb3J0LmMKKysrIGIvdGVzdC9Db2RlR2VuL2RsbGltcG9ydC1kbGxleHBvcnQuYwpAQCAtMSw1ICsxLDEwIEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LW1pbmd3MzIgLWVtaXQtbGx2bSA8ICVzIHwgRmlsZUNoZWNrICVzCiAKK19fYXR0cmlidXRlX18oKGRsbGV4cG9ydCkpIGludCBiYXIxID0gMjsKKy8vIENIRUNLLUxBQkVMOiBAYmFyMSA9IGRsbGV4cG9ydCBnbG9iYWwgaTMyIDIKK19fYXR0cmlidXRlX18oKGRsbGltcG9ydCkpIGV4dGVybiBpbnQgYmFyMjsKKy8vIENIRUNLLUxBQkVMOiBAYmFyMiA9IGV4dGVybmFsIGRsbGltcG9ydCBnbG9iYWwgaTMyCisKIHZvaWQgX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0KSkgZm9vMSgpOwogdm9pZCBfX2F0dHJpYnV0ZV9fKChkbGxleHBvcnQpKSBmb28xKCl7fQogLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBkbGxleHBvcnQgdm9pZCBAZm9vMQpAQCAtMTAsMyArMTUsOCBAQAogX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgZm9vMygpe30KIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgZGxsZXhwb3J0IHZvaWQgQGZvbzMKIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGZvbzQoKTsKKworX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgZm9vNSgpOworLy8gQ0hFQ0stTEFCRUw6IGRlY2xhcmUgZGxsaW1wb3J0IHZvaWQgQGZvbzUKKworaW50IHVzZSgpIHsgZm9vNSgpOyByZXR1cm4gYmFyMjsgfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2V4Y2VwdGlvbnMtc2VoLmMgYi90ZXN0L0NvZGVHZW4vZXhjZXB0aW9ucy1zZWguYwppbmRleCBlYWRiZTE1Li5mN2QyNGJkIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vZXhjZXB0aW9ucy1zZWguYworKysgYi90ZXN0L0NvZGVHZW4vZXhjZXB0aW9ucy1zZWguYwpAQCAtMTMsNiArMTMsNiBAQAogICAqcmVzID0gbXlyZXM7CiAgIHJldHVybiAxOwogfQotLy8gQ0hFQ0stTk9UIGVycm9yCisvLyBDSEVDSy1OT1Q6IGVycm9yOgogLy8gQ0hFQ0s6IGVycm9yOiBjYW5ub3QgY29tcGlsZSB0aGlzIFNFSCBfX3RyeSB5ZXQKLS8vIENIRUNLLU5PVCBlcnJvcgorLy8gQ0hFQ0stTk9UOiBlcnJvcjoKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9mZnAtY29udHJhY3Qtb3B0aW9uLmMgYi90ZXN0L0NvZGVHZW4vZmZwLWNvbnRyYWN0LW9wdGlvbi5jCmluZGV4IGViOTVmMWUuLjYxOTEzYjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9mZnAtY29udHJhY3Qtb3B0aW9uLmMKKysrIGIvdGVzdC9Db2RlR2VuL2ZmcC1jb250cmFjdC1vcHRpb24uYwpAQCAtMSw1ICsxLDUgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtTzMgLWZmcC1jb250cmFjdD1mYXN0IC10cmlwbGU9cG93ZXJwYy1hcHBsZS1kYXJ3aW4xMCAtUyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCi0vLyBSRVFVSVJFUzogcHBjMzItcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBwb3dlcnBjLXJlZ2lzdGVyZWQtdGFyZ2V0CiAKIGZsb2F0IGZtYV90ZXN0MShmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjKSB7CiAvLyBDSEVDSzogZm1hZGRzCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vZnAtY29udHJhY3QtcHJhZ21hLmNwcCBiL3Rlc3QvQ29kZUdlbi9mcC1jb250cmFjdC1wcmFnbWEuY3BwCmluZGV4IGFmZDhjNDMuLmI0ZTI0YjkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9mcC1jb250cmFjdC1wcmFnbWEuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbi9mcC1jb250cmFjdC1wcmFnbWEuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1PMyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtTzMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiAvLyBJcyBGUF9DT05UUkFDVCBpcyBob25vcmVkIGluIGEgc2ltcGxlIGNhc2U/CiBmbG9hdCBmcF9jb250cmFjdF8xKGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMpIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9pbmxpbmUuYyBiL3Rlc3QvQ29kZUdlbi9pbmxpbmUuYwppbmRleCA3MGFiNjk2Li45NmM5YTg2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vaW5saW5lLmMKKysrIGIvdGVzdC9Db2RlR2VuL2lubGluZS5jCkBAIC01MywxMiArNTMsMTMgQEAKIAogLy8gUlVOOiBlY2hvICJNUyBDIE1vZGUgdGVzdHM6IgogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC10cmlwbGUgaTM4Ni11bmtub3duLXVua25vd24gLU8xIC1kaXNhYmxlLWxsdm0tb3B0em5zIC1lbWl0LWxsdm0gLW8gLSAtc3RkPWM5OSAtZm1zLWNvbXBhdGliaWxpdHkgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0s0CisvLyBDSEVDSzQtTEFCRUw6IGRlZmluZSB3ZWFrX29kciBpMzIgQGVpKCkKIC8vIENIRUNLNC1MQUJFTDogZGVmaW5lIGkzMiBAYmFyKCkKKy8vIENIRUNLNC1OT1Q6IHVucmVmZXJlbmNlZDEKKy8vIENIRUNLNC1MQUJFTDogZGVmaW5lIHdlYWtfb2RyIHZvaWQgQHVucmVmZXJlbmNlZDIoKQogLy8gQ0hFQ0s0LUxBQkVMOiBkZWZpbmUgdm9pZCBAZ251X2lubGluZSgpCiAvLyBDSEVDSzQtTEFCRUw6IGRlZmluZSBhdmFpbGFibGVfZXh0ZXJuYWxseSB2b2lkIEBnbnVfZWlfaW5saW5lKCkKIC8vIENIRUNLNC1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciBpMzIgQGZvbygpCi0vLyBDSEVDSzQtTk9UOiB1bnJlZmVyZW5jZWQKLS8vIENIRUNLNC1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciBpMzIgQGVpKCkKIAogZXh0ZXJuIF9faW5saW5lIGludCBlaSgpIHsgcmV0dXJuIDEyMzsgfQogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vaW5saW5lMi5jIGIvdGVzdC9Db2RlR2VuL2lubGluZTIuYwppbmRleCA2NzBhZTIwLi44NGNkNGRiIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vaW5saW5lMi5jCisrKyBiL3Rlc3QvQ29kZUdlbi9pbmxpbmUyLmMKQEAgLTM5LDYgKzM5LDkgQEAKIC8vIENIRUNLLUdOVTg5LUxBQkVMOiBkZWZpbmUgaTMyIEBmQSgpCiBpbmxpbmUgaW50IGZBKHZvaWQpIHsgcmV0dXJuIDA7IH0KIAorLy8gQ0hFQ0stR05VODktTEFCRUw6IGRlZmluZSBpMzIgQGZCKCkKK2lubGluZSBpbnQgZkIoKSB7IHJldHVybiAwOyB9CisKIC8vIENIRUNLLUdOVTg5LUxBQkVMOiBkZWZpbmUgYXZhaWxhYmxlX2V4dGVybmFsbHkgaTMyIEBmNCgpCiAvLyBDSEVDSy1DOTktTEFCRUw6IGRlZmluZSBpMzIgQGY0KCkKIGludCBmNCh2b2lkKTsKQEAgLTU2LDcgKzU5LDExIEBACiAKIC8vIENIRUNLLUM5OS1MQUJFTDogZGVmaW5lIGF2YWlsYWJsZV9leHRlcm5hbGx5IGkzMiBAZkEoKQogCisvLyBDSEVDSy1DOTktTEFCRUw6IGRlZmluZSBpMzIgQGZCKCkKKwogaW50IHRlc3RfYWxsKCkgeyAKICAgcmV0dXJuIGYwKCkgKyBmMSgpICsgZjIoKSArIGYzKCkgKyBmNCgpICsgZjUoKSArIGY2KCkgKyBmNygpICsgZjgoKSArIGY5KCkgCi0gICAgKyBmQSgpOworICAgICsgZkEoKSArIGZCKCk7CiB9CisKK2ludCBmQih2b2lkKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9sZTMyLXZhYXJnLmMgYi90ZXN0L0NvZGVHZW4vbGUzMi12YWFyZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmJiMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vbGUzMi12YWFyZy5jCkBAIC0wLDAgKzEsMjggQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGxlMzItdW5rbm93bi1uYWNsIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitpbnQgZ2V0X2ludCh2YV9saXN0ICphcmdzKSB7CisgIHJldHVybiB2YV9hcmcoKmFyZ3MsIGludCk7Cit9CisvLyBDSEVDSzogZGVmaW5lIGkzMiBAZ2V0X2ludAorLy8gQ0hFQ0s6IFtbUkVTVUxUOiVbYS16XzAtOV0rXV0gPSB2YV9hcmcge3suKn19LCBpMzJ7eyR9fQorLy8gQ0hFQ0s6IHJldCBpMzIgW1tSRVNVTFRdXQorCitzdHJ1Y3QgRm9vIHsKKyAgaW50IHg7Cit9OworCitzdHJ1Y3QgRm9vIGRlc3Q7CisKK3ZvaWQgZ2V0X3N0cnVjdCh2YV9saXN0ICphcmdzKSB7CisgIGRlc3QgPSB2YV9hcmcoKmFyZ3MsIHN0cnVjdCBGb28pOworfQorLy8gQ0hFQ0s6IGRlZmluZSB2b2lkIEBnZXRfc3RydWN0CisvLyBDSEVDSzogW1tSRVNVTFQ6JVthLXpfMC05XStdXSA9IHZhX2FyZyB7ey4qfX0sICVzdHJ1Y3QuRm9ve3skfX0KKy8vIENIRUNLOiBzdG9yZSAlc3RydWN0LkZvbyBbW1JFU1VMVF1dLCAlc3RydWN0LkZvbyogQGRlc3QKKwordm9pZCBza2lwX3N0cnVjdCh2YV9saXN0ICphcmdzKSB7CisgIHZhX2FyZygqYXJncywgc3RydWN0IEZvbyk7Cit9CisvLyBDSEVDSzogZGVmaW5lIHZvaWQgQHNraXBfc3RydWN0CisvLyBDSEVDSzogdmFfYXJnIHt7Lip9fSwgJXN0cnVjdC5Gb297eyR9fQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL2xpYmNhbGwtZGVjbGFyYXRpb25zLmMgYi90ZXN0L0NvZGVHZW4vbGliY2FsbC1kZWNsYXJhdGlvbnMuYwppbmRleCA2NDQyZTI5Li4zNDViNzRmIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vbGliY2FsbC1kZWNsYXJhdGlvbnMuYworKysgYi90ZXN0L0NvZGVHZW4vbGliY2FsbC1kZWNsYXJhdGlvbnMuYwpAQCAtMjQ0LDYgKzI0NCwxNiBAQAogZG91YmxlIF9Db21wbGV4IGN0YW5oKGRvdWJsZSBfQ29tcGxleCk7CiBmbG9hdCBfQ29tcGxleCBjdGFuaGYoZmxvYXQgX0NvbXBsZXgpOwogbG9uZyBkb3VibGUgX0NvbXBsZXggY3RhbmhsKGxvbmcgZG91YmxlIF9Db21wbGV4KTsKKworZG91YmxlIF9fc2lucGkoZG91YmxlKTsKK2Zsb2F0IF9fc2lucGlmKGZsb2F0KTsKK2RvdWJsZSBfX2Nvc3BpKGRvdWJsZSk7CitmbG9hdCBfX2Nvc3BpZihmbG9hdCk7Citkb3VibGUgX190YW5waShkb3VibGUpOworZmxvYXQgX190YW5waWYoZmxvYXQpOworCitkb3VibGUgX19leHAxMChkb3VibGUpOworZmxvYXQgX19leHAxMGYoZmxvYXQpOwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKQEAgLTI5OCw3ICszMDgsOCBAQAogICBGKGNyZWFsZiksICAgICBGKGNyZWFsbCksICAgICBGKGNzaW4pLCAgICAgICBGKGNzaW5mKSwgICAgICAgRihjc2lubCksCiAgIEYoY3NpbmgpLCAgICAgIEYoY3NpbmhmKSwgICAgIEYoY3NpbmhsKSwgICAgIEYoY3NxcnQpLCAgICAgICBGKGNzcXJ0ZiksCiAgIEYoY3NxcnRsKSwgICAgIEYoY3RhbiksICAgICAgIEYoY3RhbmYpLCAgICAgIEYoY3RhbmwpLCAgICAgICBGKGN0YW5oKSwKLSAgRihjdGFuaGYpLCAgICAgRihjdGFuaGwpCisgIEYoY3RhbmhmKSwgICAgIEYoY3RhbmhsKSwgICAgIEYoX19zaW5waSksICAgIEYoX19zaW5waWYpLCAgICBGKF9fY29zcGkpLAorICBGKF9fY29zcGlmKSwgICBGKF9fdGFucGkpLCAgICBGKF9fdGFucGlmKSwgICBGKF9fZXhwMTApLCAgICAgRihfX2V4cDEwZikKIH07CiAKIC8vIENIRUNLLU5PRVJSTk86IGRlY2xhcmUgZG91YmxlIEBhdGFuMihkb3VibGUsIGRvdWJsZSkgW1tOVVc6I1swLTldK11dCkBAIC01MTAsNiArNTIxLDE0IEBACiAvLyBDSEVDSy1OT0VSUk5POiBkZWNsYXJlIDwyIHggZmxvYXQ+IEBjdGFuZig8MiB4IGZsb2F0PikgW1tOVVddXQogLy8gQ0hFQ0stTk9FUlJOTzogZGVjbGFyZSB7IGRvdWJsZSwgZG91YmxlIH0gQGN0YW5oKGRvdWJsZSwgZG91YmxlKSBbW05VV11dCiAvLyBDSEVDSy1OT0VSUk5POiBkZWNsYXJlIDwyIHggZmxvYXQ+IEBjdGFuaGYoPDIgeCBmbG9hdD4pIFtbTlVXXV0KKy8vIENIRUNLLU5PRVJSTk86IGRlY2xhcmUgZG91YmxlIEBfX3NpbnBpKGRvdWJsZSkgW1tOVVddXQorLy8gQ0hFQ0stTk9FUlJOTzogZGVjbGFyZSBmbG9hdCBAX19zaW5waWYoZmxvYXQpIFtbTlVXXV0KKy8vIENIRUNLLU5PRVJSTk86IGRlY2xhcmUgZG91YmxlIEBfX2Nvc3BpKGRvdWJsZSkgW1tOVVddXQorLy8gQ0hFQ0stTk9FUlJOTzogZGVjbGFyZSBmbG9hdCBAX19jb3NwaWYoZmxvYXQpIFtbTlVXXV0KKy8vIENIRUNLLU5PRVJSTk86IGRlY2xhcmUgZG91YmxlIEBfX3RhbnBpKGRvdWJsZSkgW1tOVVddXQorLy8gQ0hFQ0stTk9FUlJOTzogZGVjbGFyZSBmbG9hdCBAX190YW5waWYoZmxvYXQpIFtbTlVXXV0KKy8vIENIRUNLLU5PRVJSTk86IGRlY2xhcmUgZG91YmxlIEBfX2V4cDEwKGRvdWJsZSkgW1tOVVddXQorLy8gQ0hFQ0stTk9FUlJOTzogZGVjbGFyZSBmbG9hdCBAX19leHAxMGYoZmxvYXQpIFtbTlVXXV0KIAogLy8gQ0hFQ0stRVJSTk86IGRlY2xhcmUgaTMyIEBhYnMoaTMyKSBbW05VVzojWzAtOV0rXV0KIC8vIENIRUNLLUVSUk5POiBkZWNsYXJlIGk2NCBAbGFicyhpNjQpIFtbTlVXXV0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9saWJjYWxscy5jIGIvdGVzdC9Db2RlR2VuL2xpYmNhbGxzLmMKaW5kZXggMzExMmM4Ny4uODEyMGI3NSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL2xpYmNhbGxzLmMKKysrIGIvdGVzdC9Db2RlR2VuL2xpYmNhbGxzLmMKQEAgLTUyLDkgKzUyLDkgQEAKIC8vIENIRUNLLVlFUzogZGVjbGFyZSBmbG9hdCBAcG93ZihmbG9hdCwgZmxvYXQpCiAvLyBDSEVDSy1ZRVM6IGRlY2xhcmUgZG91YmxlIEBwb3coZG91YmxlLCBkb3VibGUpCiAvLyBDSEVDSy1ZRVM6IGRlY2xhcmUgeDg2X2ZwODAgQHBvd2woeDg2X2ZwODAsIHg4Nl9mcDgwKQotLy8gQ0hFQ0stTk86IGRlY2xhcmUgZmxvYXQgQGxsdm0ucG93LmYzMihmbG9hdCwgZmxvYXQpIFtbTlVXX1JPOiNbMC05XStdXQotLy8gQ0hFQ0stTk86IGRlY2xhcmUgZG91YmxlIEBsbHZtLnBvdy5mNjQoZG91YmxlLCBkb3VibGUpIFtbTlVXX1JPXV0KLS8vIENIRUNLLU5POiBkZWNsYXJlIHg4Nl9mcDgwIEBsbHZtLnBvdy5mODAoeDg2X2ZwODAsIHg4Nl9mcDgwKSBbW05VV19ST11dCisvLyBDSEVDSy1OTzogZGVjbGFyZSBmbG9hdCBAbGx2bS5wb3cuZjMyKGZsb2F0LCBmbG9hdCkgW1tOVVdfUk5JOiNbMC05XStdXQorLy8gQ0hFQ0stTk86IGRlY2xhcmUgZG91YmxlIEBsbHZtLnBvdy5mNjQoZG91YmxlLCBkb3VibGUpIFtbTlVXX1JOSV1dCisvLyBDSEVDSy1OTzogZGVjbGFyZSB4ODZfZnA4MCBAbGx2bS5wb3cuZjgwKHg4Nl9mcDgwLCB4ODZfZnA4MCkgW1tOVVdfUk5JXV0KIAogLy8gQ0hFQ0stWUVTLUxBQkVMOiBkZWZpbmUgdm9pZCBAdGVzdF9mbWEKIC8vIENIRUNLLU5PLUxBQkVMOiBkZWZpbmUgdm9pZCBAdGVzdF9mbWEKQEAgLTgxLDggKzgxLDggQEAKIAogLy8gSnVzdCBjaGVja2luZyB0byBtYWtlIHN1cmUgdGhlc2UgbGlicmFyeSBmdW5jdGlvbnMgYXJlIG1hcmtlZCByZWFkbm9uZQogdm9pZCB0ZXN0X2J1aWx0aW5zKGRvdWJsZSBkLCBmbG9hdCBmLCBsb25nIGRvdWJsZSBsZCkgewotLy8gQ0hFQy1OTzogQHRlc3RfYnVpbHRpbnMKLS8vIENIRUMtWUVTOiBAdGVzdF9idWlsdGlucworLy8gQ0hFQ0stTk86IEB0ZXN0X2J1aWx0aW5zCisvLyBDSEVDSy1ZRVM6IEB0ZXN0X2J1aWx0aW5zCiAgIGRvdWJsZSBhdGFuXyA9IGF0YW4oZCk7CiAgIGxvbmcgZG91YmxlIGF0YW5sXyA9IGF0YW5sKGxkKTsKICAgZmxvYXQgYXRhbmZfID0gYXRhbmYoZik7CkBAIC0xMjcsNCArMTI3LDQgQEAKIC8vIENIRUNLLVlFUzogYXR0cmlidXRlcyBbW05VV19STl1dID0geyBub3Vud2luZCByZWFkbm9uZSB9CiAKIC8vIENIRUNLLU5POiBhdHRyaWJ1dGVzIFtbTlVXX1JOXV0gPSB7IG5vdW53aW5kIHJlYWRub25le3suKn19IH0KLS8vIENIRUNLLU5POiBhdHRyaWJ1dGVzIFtbTlVXX1JPXV0gPSB7IG5vdW53aW5kIHJlYWRvbmx5IH0KKy8vIENIRUNLLU5POiBhdHRyaWJ1dGVzIFtbTlVXX1JOSV1dID0geyBub3Vud2luZCByZWFkbm9uZSB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vbGluZW5vLWRiZ2luZm8uYyBiL3Rlc3QvQ29kZUdlbi9saW5lbm8tZGJnaW5mby5jCmluZGV4IDcyZmEzMzcuLjFmOWI3YTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9saW5lbm8tZGJnaW5mby5jCisrKyBiL3Rlc3QvQ29kZUdlbi9saW5lbm8tZGJnaW5mby5jCkBAIC0xLDUgKzEsNSBAQAogLy8gUlVOOiBlY2hvICIjaW5jbHVkZSA8c3RkZGVmLmg+IiA+ICV0LmgKLS8vIFJVTjogJWNsYW5nIC1TIC1nIC1pbmNsdWRlICV0LmggJXMgLWVtaXQtbGx2bSAtbyAldC5sbAorLy8gUlVOOiAlY2xhbmdfY2MxIC1TIC1nIC1pbmNsdWRlICV0LmggJXMgLWVtaXQtbGx2bSAtbyAldC5sbAogLy8gUlVOOiBncmVwICJpMzIgNSIgJXQubGwKIC8vIG91dGVyIGlzIGF0IGxpbmUgbnVtYmVyIDUuCiBpbnQgb3V0ZXIgPSA0MjsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9sb25nLWRvdWJsZS14ODYtbmFjbC5jIGIvdGVzdC9Db2RlR2VuL2xvbmctZG91YmxlLXg4Ni1uYWNsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzM4MWEuLjAwMDAwMDAKLS0tIGEvdGVzdC9Db2RlR2VuL2xvbmctZG91YmxlLXg4Ni1uYWNsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC1vIC0gLXRyaXBsZT1pNjg2LXVua25vd24tbmFjbCB8IEZpbGVDaGVjayAlcwotCi1sb25nIGRvdWJsZSB4ID0gMDsKLWludCBjaGVja3NpemVbc2l6ZW9mKHgpID09IDggPyAxIDogLTFdOwotCi0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQHMxKGRvdWJsZSAlYSkKLXZvaWQgczEobG9uZyBkb3VibGUgYSkge30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9tYWxpZ24tZG91YmxlLXg4Ni1uYWNsLmMgYi90ZXN0L0NvZGVHZW4vbWFsaWduLWRvdWJsZS14ODYtbmFjbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NzMxNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vbWFsaWduLWRvdWJsZS14ODYtbmFjbC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC1vIC0gLXRyaXBsZT1pNjg2LXVua25vd24tbmFjbCB8IEZpbGVDaGVjayAlcworLy8gQ2hlY2sgdGhhdCBpNjg2LW5hY2wgZXNzZW50aWFsbHkgaGFzIC1tYWxpZ24tZG91YmxlLCB3aGljaCBhbGlnbnMKKy8vIGRvdWJsZSwgbG9uZyBkb3VibGUsIGFuZCBsb25nIGxvbmcgdG8gNjQtYml0cy4KKworaW50IGNoZWNrc2l6ZVtzaXplb2YobG9uZyBkb3VibGUpID09IDggPyAxIDogLTFdOworaW50IGNoZWNrYWxpZ25bX19hbGlnbm9mKGxvbmcgZG91YmxlKSA9PSA4ID8gMSA6IC0xXTsKKworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBzMShkb3VibGUgJWEpCit2b2lkIHMxKGxvbmcgZG91YmxlIGEpIHt9CisKK3N0cnVjdCBzdF9sZCB7CisgIGNoYXIgYzsKKyAgbG9uZyBkb3VibGUgbGQ7Cit9OworaW50IGNoZWNrc2l6ZTJbc2l6ZW9mKHN0cnVjdCBzdF9sZCkgPT0gMTYgPyAxIDogLTFdOworaW50IGNoZWNrYWxpZ24yW19fYWxpZ25vZihzdHJ1Y3Qgc3RfbGQpID09IDggPyAxIDogLTFdOworCitpbnQgY2hlY2tzaXplM1tzaXplb2YoZG91YmxlKSA9PSA4ID8gMSA6IC0xXTsKK2ludCBjaGVja2FsaWduM1tfX2FsaWdub2YoZG91YmxlKSA9PSA4ID8gMSA6IC0xXTsKKworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBzMihkb3VibGUgJWEpCit2b2lkIHMyKGRvdWJsZSBhKSB7fQorCitzdHJ1Y3Qgc3RfZCB7CisgIGNoYXIgYzsKKyAgZG91YmxlIGQ7Cit9OworaW50IGNoZWNrc2l6ZTRbc2l6ZW9mKHN0cnVjdCBzdF9kKSA9PSAxNiA/IDEgOiAtMV07CitpbnQgY2hlY2thbGlnbjRbX19hbGlnbm9mKHN0cnVjdCBzdF9kKSA9PSA4ID8gMSA6IC0xXTsKKworCitpbnQgY2hlY2tzaXplNVtzaXplb2YobG9uZyBsb25nKSA9PSA4ID8gMSA6IC0xXTsKK2ludCBjaGVja2FsaWduNVtfX2FsaWdub2YobG9uZyBsb25nKSA9PSA4ID8gMSA6IC0xXTsKKworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBzMyhpNjQgJWEpCit2b2lkIHMzKGxvbmcgbG9uZyBhKSB7fQorCitzdHJ1Y3Qgc3RfbGwgeworICBjaGFyIGM7CisgIGxvbmcgbG9uZyBsbDsKK307CitpbnQgY2hlY2tzaXplNltzaXplb2Yoc3RydWN0IHN0X2xsKSA9PSAxNiA/IDEgOiAtMV07CitpbnQgY2hlY2thbGlnbjZbX19hbGlnbm9mKHN0cnVjdCBzdF9sbCkgPT0gOCA/IDEgOiAtMV07CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vbWFuZ2xlLXdpbmRvd3MuYyBiL3Rlc3QvQ29kZUdlbi9tYW5nbGUtd2luZG93cy5jCmluZGV4IDY3MDY0OTIuLjM3ZDEwMTggMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9tYW5nbGUtd2luZG93cy5jCisrKyBiL3Rlc3QvQ29kZUdlbi9tYW5nbGUtd2luZG93cy5jCkBAIC0xLDUgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtY3h4LWFiaSBtaWNyb3NvZnQgXAotLy8gUlVOOiAgICAgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiB8IEZpbGVDaGVjayAlcwogLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPWkzODYtbWluZ3czMiB8IEZpbGVDaGVjayAlcwogCiB2b2lkIF9fc3RkY2FsbCBmMSh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL21jb3VudC5jIGIvdGVzdC9Db2RlR2VuL21jb3VudC5jCmluZGV4IDFjZjNkNmEuLjVjNjA4YmMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9tY291bnQuYworKysgYi90ZXN0L0NvZGVHZW4vbWNvdW50LmMKQEAgLTEsNCArMSw4IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXBnIC10cmlwbGUgaTM4Ni11bmtub3duLXVua25vd24gLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXBnIC10cmlwbGUgcG93ZXJwYy11bmtub3duLWdudS1saW51eCAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1QUEMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtcGcgLXRyaXBsZSBwb3dlcnBjNjQtdW5rbm93bi1nbnUtbGludXggLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stUFBDICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXBnIC10cmlwbGUgcG93ZXJwYzY0bGUtdW5rbm93bi1nbnUtbGludXggLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stUFBDICVzCiB2b2lkIGZvbyh2b2lkKSB7CiAvLyBDSEVDSzogY2FsbCB2b2lkIEBtY291bnQoKQorLy8gQ0hFQ0stUFBDOiBjYWxsIHZvaWQgQF9tY291bnQoKQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL21pcHMtdGFyZ2V0LWRhdGEuYyBiL3Rlc3QvQ29kZUdlbi9taXBzLXRhcmdldC1kYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NzVjY2IuLjAwMDAwMDAKLS0tIGEvdGVzdC9Db2RlR2VuL21pcHMtdGFyZ2V0LWRhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwc2VsLWxpbnV4LWdudSAtbyAtIC1lbWl0LWxsdm0gLVMgJXMgfFwKLS8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9MzJFTAotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzLWxpbnV4LWdudSAtbyAtIC1lbWl0LWxsdm0gLVMgJXMgfFwKLS8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9MzJFQgotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzNjRlbC1saW51eC1nbnUgLW8gLSAtZW1pdC1sbHZtIC1TICVzIHxcCi0vLyBSVU46IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PTY0RUwKLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwczY0LWxpbnV4LWdudSAtbyAtIC1lbWl0LWxsdm0gLVMgJXMgfFwKLS8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9NjRFQgotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzZWwtbGludXgtZ251IC1vIC0gLWVtaXQtbGx2bSAtUyAtbWZwNjQgJXMgfFwKLS8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9MzJFTAotCi0vLyAzMkVMOiBlLXA6MzI6MzI6MzItaTE6ODo4LWk4Ojg6MzItaTE2OjE2OjMyLWkzMjozMjozMi1pNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC12NjQ6NjQ6NjQtbjMyLVM2NAotLy8gMzJFQjogRS1wOjMyOjMyOjMyLWkxOjg6OC1pODo4OjMyLWkxNjoxNjozMi1pMzI6MzI6MzItaTY0OjY0OjY0LWYzMjozMjozMi1mNjQ6NjQ6NjQtdjY0OjY0OjY0LW4zMi1TNjQKLS8vIDY0RUw6IGUtcDo2NDo2NDo2NC1pMTo4OjgtaTg6ODozMi1pMTY6MTY6MzItaTMyOjMyOjMyLWk2NDo2NDo2NC1mMzI6MzI6MzItZjY0OjY0OjY0LWYxMjg6MTI4OjEyOC12NjQ6NjQ6NjQtbjMyOjY0LVMxMjgKLS8vIDY0RUI6IEUtcDo2NDo2NDo2NC1pMTo4OjgtaTg6ODozMi1pMTY6MTY6MzItaTMyOjMyOjMyLWk2NDo2NDo2NC1mMzI6MzI6MzItZjY0OjY0OjY0LWYxMjg6MTI4OjEyOC12NjQ6NjQ6NjQtbjMyOjY0LVMxMjgKLQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL21teC1idWlsdGlucy5jIGIvdGVzdC9Db2RlR2VuL21teC1idWlsdGlucy5jCmluZGV4IGIxNDI2ODQuLjM0NjY3NmMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9tbXgtYnVpbHRpbnMuYworKysgYi90ZXN0L0NvZGVHZW4vbW14LWJ1aWx0aW5zLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogeDg2LTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgJXMgLU8zIC10cmlwbGU9eDg2XzY0LWFwcGxlLWRhcndpbiAtdGFyZ2V0LWZlYXR1cmUgK3Nzc2UzIC1TIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gRklYTUU6IERpc2FibGUgaW5jbHVzaW9uIG9mIG1tX21hbGxvYy5oLCBvdXIgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBicm9rZW4KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9tcy1pbmxpbmUtYXNtLTY0LmMgYi90ZXN0L0NvZGVHZW4vbXMtaW5saW5lLWFzbS02NC5jCmluZGV4IGY2Njc3MDguLjY5MDY2YWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9tcy1pbmxpbmUtYXNtLTY0LmMKKysrIGIvdGVzdC9Db2RlR2VuL21zLWlubGluZS1hc20tNjQuYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiB4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZmFzbS1ibG9ja3MgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIHZvaWQgdDEoKSB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vbXMtaW5saW5lLWFzbS5jIGIvdGVzdC9Db2RlR2VuL21zLWlubGluZS1hc20uYwppbmRleCBjNDQ4NmY2Li42Mzk1ZTQyIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vbXMtaW5saW5lLWFzbS5jCisrKyBiL3Rlc3QvQ29kZUdlbi9tcy1pbmxpbmUtYXNtLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogeDg2LTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbjEwIC1mYXNtLWJsb2NrcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogdm9pZCB0MSgpIHsKQEAgLTc3LDcgKzc3LDcgQEAKICAgICBwb3AgZWJ4CiAgIH0KIC8vIENIRUNLOiB0OQotLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgInB1c2ggZWJ4XDBBXDA5bW92IGVieCwgJCQweDA3XDBBXDA5cG9wIGVieCIsICJ+e2VieH0sfntkaXJmbGFnfSx+e2Zwc3J9LH57ZmxhZ3N9IigpCisvLyBDSEVDSzogY2FsbCB2b2lkIGFzbSBzaWRlZWZmZWN0IGludGVsZGlhbGVjdCAicHVzaCBlYnhcMEFcMDltb3YgZWJ4LCAkJDB4MDdcMEFcMDlwb3AgZWJ4IiwgIn57ZWJ4fSx+e2VzcH0sfntkaXJmbGFnfSx+e2Zwc3J9LH57ZmxhZ3N9IigpCiB9CiAKIHVuc2lnbmVkIHQxMCh2b2lkKSB7CkBAIC0yMTEsNyArMjExLDcgQEAKICAgICBfX2FzbSBwb3AgZWJ4CiAgIH0KIC8vIENIRUNLOiB0MjEKLS8vIENIRUNLOiBjYWxsIHZvaWQgYXNtIHNpZGVlZmZlY3QgaW50ZWxkaWFsZWN0ICJwdXNoIGVieFwwQVwwOW1vdiBlYngsICQkMHgwN1wwQVwwOXBvcCBlYngiLCAifntlYnh9LH57ZGlyZmxhZ30sfntmcHNyfSx+e2ZsYWdzfSIoKQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgInB1c2ggZWJ4XDBBXDA5bW92IGVieCwgJCQweDA3XDBBXDA5cG9wIGVieCIsICJ+e2VieH0sfntlc3B9LH57ZGlyZmxhZ30sfntmcHNyfSx+e2ZsYWdzfSIoKQogfQogCiBleHRlcm4gdm9pZCB0MjJfaGVscGVyKGludCB4KTsKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgIF9fYXNtIHBvcCBlYngKICAgfQogLy8gQ0hFQ0s6IHQyMgotLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgInB1c2ggZWJ4XDBBXDA5bW92IGVieCwgZXNwIiwgIn57ZWJ4fSx+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKCkKKy8vIENIRUNLOiBjYWxsIHZvaWQgYXNtIHNpZGVlZmZlY3QgaW50ZWxkaWFsZWN0ICJwdXNoIGVieFwwQVwwOW1vdiBlYngsIGVzcCIsICJ+e2VieH0sfntlc3B9LH57ZGlyZmxhZ30sfntmcHNyfSx+e2ZsYWdzfSIoKQogLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAdDIyX2hlbHBlcgogLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgIm1vdiBlc3AsIGVieFwwQVwwOXBvcCBlYngiLCAifntlYnh9LH57ZXNwfSx+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKCkKIH0KQEAgLTI2OCwxMyArMjY4LDE0IEBACiAgIF9fYXNtIF9fZW1pdCAwYTJoCiAgIF9fYXNtIF9fRU1JVCAwYTJoCiAgIF9fYXNtIHBvcGFkCisvLyBGSVhNRTogVGhlc2UgYWxsIG5lZWQgdG8gYmUgbWVyZ2VkIGludG8gdGhlIHNhbWUgYXNtIGJsb2IuCiAvLyBDSEVDSzogdDI2Ci0vLyBDSEVDSzogY2FsbCB2b2lkIGFzbSBzaWRlZWZmZWN0IGludGVsZGlhbGVjdCAicHVzaGFkIiwgIn57ZGlyZmxhZ30sfntmcHNyfSx+e2ZsYWdzfSIoKQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgInB1c2hhZCIsICJ+e2VzcH0sfntkaXJmbGFnfSx+e2Zwc3J9LH57ZmxhZ3N9IigpCiAvLyBDSEVDSzogY2FsbCB2b2lkIGFzbSBzaWRlZWZmZWN0IGludGVsZGlhbGVjdCAibW92IGVheCwgJCQwIiwgIn57ZWF4fSx+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKCkKIC8vIENIRUNLOiBjYWxsIHZvaWQgYXNtIHNpZGVlZmZlY3QgaW50ZWxkaWFsZWN0ICIuYnl0ZSAwZmgiLCAifntkaXJmbGFnfSx+e2Zwc3J9LH57ZmxhZ3N9IigpCiAvLyBDSEVDSzogY2FsbCB2b2lkIGFzbSBzaWRlZWZmZWN0IGludGVsZGlhbGVjdCAiLmJ5dGUgMGEyaCIsICJ+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKCkKIC8vIENIRUNLOiBjYWxsIHZvaWQgYXNtIHNpZGVlZmZlY3QgaW50ZWxkaWFsZWN0ICIuYnl0ZSAwYTJoIiwgIn57ZGlyZmxhZ30sfntmcHNyfSx+e2ZsYWdzfSIoKQotLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgInBvcGFkIiwgIn57ZGlyZmxhZ30sfntmcHNyfSx+e2ZsYWdzfSIoKQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgInBvcGFkIiwgIn57ZWF4fSx+e2VicH0sfntlYnh9LH57ZWN4fSx+e2VkaX0sfntlZHh9LH57ZXNpfSx+e2VzcH0sfntkaXJmbGFnfSx+e2Zwc3J9LH57ZmxhZ3N9IigpCiB9CiAKIHZvaWQgdDI3KCkgewpAQCAtMzIzLDggKzMyNCw4IEBACiAgIF9fYXNtIHB1c2hhZAogICBfX2FzbSBwb3BhZAogLy8gQ0hFQ0s6IHQzMQotLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgInB1c2hhZCIsICJ+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKCkKLS8vIENIRUNLOiBjYWxsIHZvaWQgYXNtIHNpZGVlZmZlY3QgaW50ZWxkaWFsZWN0ICJwb3BhZCIsICJ+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKCkKKy8vIENIRUNLOiBjYWxsIHZvaWQgYXNtIHNpZGVlZmZlY3QgaW50ZWxkaWFsZWN0ICJwdXNoYWQiLCAifntlc3B9LH57ZGlyZmxhZ30sfntmcHNyfSx+e2ZsYWdzfSIoKQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgInBvcGFkIiwgIn57ZWF4fSx+e2VicH0sfntlYnh9LH57ZWN4fSx+e2VkaX0sfntlZHh9LH57ZXNpfSx+e2VzcH0sfntkaXJmbGFnfSx+e2Zwc3J9LH57ZmxhZ3N9IigpCiB9CiAKIHZvaWQgdDMyKCkgewpAQCAtNDM4LDMgKzQzOSwzMyBAQAogLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgIm1vdiBlYXgsIGR3b3JkIHB0ciAkJDgkMCIsICIqbSx+e2VheH0sfntkaXJmbGFnfSx+e2Zwc3J9LH57ZmxhZ3N9IihbNCB4IGkzMl0qICV7ey4qfX0pCiAvLyBDSEVDSzogY2FsbCB2b2lkIGFzbSBzaWRlZWZmZWN0IGludGVsZGlhbGVjdCAibW92IGVheCwgZHdvcmQgcHRyICQkMCQwIiwgIiptLH57ZWF4fSx+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKFs0IHggaTMyXSogJXt7Lip9fSkKIH0KKwordm9pZCBjcHVpZCgpIHsKKyAgX19hc20gY3B1aWQKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAY3B1aWQKKy8vIENIRUNLOiBjYWxsIHZvaWQgYXNtIHNpZGVlZmZlY3QgaW50ZWxkaWFsZWN0ICJjcHVpZCIsICJ+e2VheH0sfntlYnh9LH57ZWN4fSx+e2VkeH0sfntkaXJmbGFnfSx+e2Zwc3J9LH57ZmxhZ3N9IigpCit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGE7CisgIGludCBiOworfSBBOworCit2b2lkIHQzOSgpIHsKKyAgX19hc20gbW92IGVheCwgW2VheF0uQS5iCisgIF9fYXNtIG1vdiBlYXgsIFtlYXhdIEEuYgorICBfX2FzbSBtb3YgZWF4LCBmczpbMF0gQS5iCisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAdDM5CisgIC8vIENIRUNLOiBjYWxsIHZvaWQgYXNtIHNpZGVlZmZlY3QgaW50ZWxkaWFsZWN0ICJtb3YgZWF4LCBbZWF4XS40IiwgIn57ZWF4fSx+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKCkKKyAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgIm1vdiBlYXgsIFtlYXhdIC40IiwgIn57ZWF4fSx+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKCkKKyAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgIm1vdiBlYXgsIGZzOlskJDBdIC40IiwgIn57ZWF4fSx+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKCkKK30KKwordm9pZCB0NDAoZmxvYXQgYSkgeworICBpbnQgaTsKKyAgX19hc20gZmxkIGEKKyAgX19hc20gZmlzdHAgaQorICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQHQ0MAorICAvLyBDSEVDSzogY2FsbCB2b2lkIGFzbSBzaWRlZWZmZWN0IGludGVsZGlhbGVjdCAiZmxkIGR3b3JkIHB0ciAkMCIsICIqbSx+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKGZsb2F0KiB7ey4qfX0pCisgIC8vIENIRUNLOiBjYWxsIHZvaWQgYXNtIHNpZGVlZmZlY3QgaW50ZWxkaWFsZWN0ICJmaXN0cCBkd29yZCBwdHIgJDAiLCAiPSptLH57ZGlyZmxhZ30sfntmcHNyfSx+e2ZsYWdzfSIoaTMyKiB7ey4qfX0pCit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vbXMtaW5saW5lLWFzbS5jcHAgYi90ZXN0L0NvZGVHZW4vbXMtaW5saW5lLWFzbS5jcHAKaW5kZXggNjRiODU1OC4uYjFjMTNlNSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL21zLWlubGluZS1hc20uY3BwCisrKyBiL3Rlc3QvQ29kZUdlbi9tcy1pbmxpbmUtYXNtLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiB4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAteCBjKysgJXMgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbjEwIC1mYXNtLWJsb2NrcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gcmRhcjovLzEzNjQ1OTMwCkBAIC05Nyw3ICs5Nyw3IEBACiAgIC8vIENIRUNLOiBbW1k6JS4qXV0gPSBhbGxvY2EgaTMyCiAgIGludCB4LCB5OwogICBfX2FzbSBwdXNoIHkKLSAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCBpbnRlbGRpYWxlY3QgInB1c2ggZHdvcmQgcHRyICQwIiwgIj0qbSx+e2RpcmZsYWd9LH57ZnBzcn0sfntmbGFnc30iKGkzMiogW1tZXV0pCisgIC8vIENIRUNLOiBjYWxsIHZvaWQgYXNtIHNpZGVlZmZlY3QgaW50ZWxkaWFsZWN0ICJwdXNoIGR3b3JkIHB0ciAkMCIsICI9Km0sfntlc3B9LH57ZGlyZmxhZ30sfntmcHNyfSx+e2ZsYWdzfSIoaTMyKiBbW1ldXSkKICAgX19hc20gY2FsbCBUNTxpbnQ+OjpjcmVhdGU8ZmxvYXQ+CiAgIC8vIENIRUNLOiBjYWxsIHZvaWQgYXNtIHNpZGVlZmZlY3QgaW50ZWxkaWFsZWN0ICJjYWxsICQwIiwgInIsfntkaXJmbGFnfSx+e2Zwc3J9LH57ZmxhZ3N9IihpMzIgKGZsb2F0KSogQF9aTjJUNUlpRTZjcmVhdGVJZkVFaVRfKQogICBfX2FzbSBtb3YgeCwgZWF4CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vbXNfc3RydWN0LWJpdGZpZWxkLmMgYi90ZXN0L0NvZGVHZW4vbXNfc3RydWN0LWJpdGZpZWxkLmMKaW5kZXggYThmNGM5MS4uMDhmMmE1YiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL21zX3N0cnVjdC1iaXRmaWVsZC5jCisrKyBiL3Rlc3QvQ29kZUdlbi9tc19zdHJ1Y3QtYml0ZmllbGQuYwpAQCAtMSw2ICsxLDExIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bS1vbmx5ICAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW45ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAtIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjkgJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1vIC0gLXRyaXBsZSB0aHVtYnY3LWFwcGxlLWlvcyAtdGFyZ2V0LWFiaSBhcGNzLWdudSAlcyB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PUNIRUNLLUFSTQorCiAvLyByZGFyOi8vODgyMzI2NQogCisvLyBOb3RlIHRoYXQgd2UncmUgZGVjbGFyaW5nIGdsb2JhbCB2YXJpYWJsZXMgd2l0aCB0aGVzZSB0eXBlcywKKy8vIHRyaWdnZXJpbmcgYm90aCBTZW1hIGFuZCBJUkdlbiBzdHJ1Y3QgbGF5b3V0LgorCiAjZGVmaW5lIEFUVFIgX19hdHRyaWJ1dGVfXygoX19tc19zdHJ1Y3RfXykpCiAKIHN0cnVjdApAQCAtOSw2ICsxNCw5IEBACiAgICBsb25nIDogMDsKICAgIGNoYXIgYmFyOwogfSBBVFRSIHQxOworaW50IHMxID0gc2l6ZW9mKHQxKTsKKy8vIENIRUNLOiBAczEgPSBnbG9iYWwgaTMyIDIKKy8vIENIRUNLLUFSTTogQHMxID0gZ2xvYmFsIGkzMiAyCiAKIHN0cnVjdAogewpAQCAtMTgsNiArMjYsOSBAQAogICAgaW50IDogMDsKICAgIGNoYXIgYmFyOwogfSBBVFRSIHQyOworaW50IHMyID0gc2l6ZW9mKHQyKTsKKy8vIENIRUNLOiBAczIgPSBnbG9iYWwgaTMyIDIKKy8vIENIRUNLLUFSTTogQHMyID0gZ2xvYmFsIGkzMiAyCiAKIHN0cnVjdAogewpAQCAtMjksMTIgKzQwLDE4IEBACiAgICBsb25nIDogMDsKICAgIGNoYXIgOiAwOwogfSBBVFRSIHQzOworaW50IHMzID0gc2l6ZW9mKHQzKTsKKy8vIENIRUNLOiBAczMgPSBnbG9iYWwgaTMyIDIKKy8vIENIRUNLLUFSTTogQHMzID0gZ2xvYmFsIGkzMiAyCiAKIHN0cnVjdAogewogICAgbG9uZyA6IDA7CiAgICBjaGFyIGJhcjsKIH0gQVRUUiB0NDsKK2ludCBzNCA9IHNpemVvZih0NCk7CisvLyBDSEVDSzogQHM0ID0gZ2xvYmFsIGkzMiAxCisvLyBDSEVDSy1BUk06IEBzNCA9IGdsb2JhbCBpMzIgMQogCiBzdHJ1Y3QKIHsKQEAgLTQzLDYgKzYwLDkgQEAKICAgIGNoYXIgOiAwOwogICAgY2hhciBiYXI7CiB9IEFUVFIgdDU7CitpbnQgczUgPSBzaXplb2YodDUpOworLy8gQ0hFQ0s6IEBzNSA9IGdsb2JhbCBpMzIgMQorLy8gQ0hFQ0stQVJNOiBAczUgPSBnbG9iYWwgaTMyIDEKIAogc3RydWN0CiB7CkBAIC01MSw2ICs3MSw5IEBACiAgICBjaGFyIDogMDsKICAgIGNoYXIgYmFyOwogfSBBVFRSIHQ2OworaW50IHM2ID0gc2l6ZW9mKHQ2KTsKKy8vIENIRUNLOiBAczYgPSBnbG9iYWwgaTMyIDEKKy8vIENIRUNLLUFSTTogQHM2ID0gZ2xvYmFsIGkzMiAxCiAKIHN0cnVjdAogewpAQCAtNjksNiArOTIsOSBAQAogICAgY2hhciBiYXI2OwogICAgY2hhciBiYXI3OwogfSBBVFRSIHQ3OworaW50IHM3ID0gc2l6ZW9mKHQ3KTsKKy8vIENIRUNLOiBAczcgPSBnbG9iYWwgaTMyIDkKKy8vIENIRUNLLUFSTTogQHM3ID0gZ2xvYmFsIGkzMiA5CiAKIHN0cnVjdAogewpAQCAtNzYsNiArMTAyLDkgQEAKICAgIGxvbmcgOiAwOwogICAgY2hhciA6IDA7CiB9IEFUVFIgdDg7CitpbnQgczggPSBzaXplb2YodDgpOworLy8gQ0hFQ0s6IEBzOCA9IGdsb2JhbCBpMzIgMAorLy8gQ0hFQ0stQVJNOiBAczggPSBnbG9iYWwgaTMyIDAKIAogc3RydWN0CiB7CkBAIC0xMDYsNiArMTM1LDkgQEAKICAgIGxvbmcgOiAwOwogICAgY2hhciA6NDsKIH0gQVRUUiB0OTsKK2ludCBzOSA9IHNpemVvZih0OSk7CisvLyBDSEVDSzogQHM5ID0gZ2xvYmFsIGkzMiAyOAorLy8gQ0hFQ0stQVJNOiBAczkgPSBnbG9iYWwgaTMyIDI4CiAKIHN0cnVjdAogewpAQCAtMTEzLDE5ICsxNDUsMzUgQEAKICAgIGxvbmcgOiAwOwogICAgY2hhciBiYXI7CiB9IEFUVFIgdDEwOworaW50IHMxMCA9IHNpemVvZih0MTApOworLy8gQ0hFQ0s6IEBzMTAgPSBnbG9iYWwgaTMyIDE2CisvLyBDSEVDSy1BUk06IEBzMTAgPSBnbG9iYWwgaTMyIDgKIAotc3RhdGljIGludCBhcnIxWyhzaXplb2YodDEpID09IDIpIC0xXTsKLXN0YXRpYyBpbnQgYXJyMlsoc2l6ZW9mKHQyKSA9PSAyKSAtMV07Ci1zdGF0aWMgaW50IGFycjNbKHNpemVvZih0MykgPT0gMikgLTFdOwotc3RhdGljIGludCBhcnI0WyhzaXplb2YodDQpID09IDEpIC0xXTsKLXN0YXRpYyBpbnQgYXJyNVsoc2l6ZW9mKHQ1KSA9PSAxKSAtMV07Ci1zdGF0aWMgaW50IGFycjZbKHNpemVvZih0NikgPT0gMSkgLTFdOwotc3RhdGljIGludCBhcnI3WyhzaXplb2YodDcpID09IDkpIC0xXTsKLXN0YXRpYyBpbnQgYXJyOFsoc2l6ZW9mKHQ4KSA9PSAwKSAtMV07Ci1zdGF0aWMgaW50IGFycjlbKHNpemVvZih0OSkgPT0gMjgpIC0xXTsKLXN0YXRpYyBpbnQgYXJyMTBbKHNpemVvZih0MTApID09IDE2KSAtMV07CisvLyByZGFyOi8vMTYwNDE4MjYgLSBlbnN1cmUgdGhhdCBtc19zdHJ1Y3RzIHdvcmsgY29ycmVjdGx5IG9uIGEKKy8vICF1c2VCaXRGaWVsZFR5cGVBbGlnbm1lbnQoKSB0YXJnZXQKK3N0cnVjdCB7CisgIHVuc2lnbmVkIGludCBhIDogMzE7CisgIHVuc2lnbmVkIGludCBiIDogMjsKKyAgdW5zaWduZWQgaW50IGM7Cit9IEFUVFIgdDExOworaW50IHMxMSA9IHNpemVvZih0MTEpOworLy8gQ0hFQ0s6IEBzMTEgPSBnbG9iYWwgaTMyIDEyCisvLyBDSEVDSy1BUk06IEBzMTEgPSBnbG9iYWwgaTMyIDEyCiAKLWludCBtYWluKCkgewotICByZXR1cm4gMDsKLX0KK3N0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIgYSA6IDM7CisgIHVuc2lnbmVkIGNoYXIgYiA6IDQ7CisgIHVuc2lnbmVkIHNob3J0IGMgOiA2OworfSBBVFRSIHQxMjsKK2ludCBzMTIgPSBzaXplb2YodDEyKTsKKy8vIENIRUNLOiBAczEyID0gZ2xvYmFsIGkzMiA0CisvLyBDSEVDSy1BUk06IEBzMTIgPSBnbG9iYWwgaTMyIDQKIAorc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciBhIDogMzsKKyAgdW5zaWduZWQgY2hhciBiIDogNDsKKyAgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdW5zaWduZWQgc2hvcnQgYyA6IDY7Cit9IEFUVFIgdDEzOworaW50IHMxMyA9IHNpemVvZih0MTMpOworLy8gQ0hFQ0s6IEBzMTMgPSBnbG9iYWwgaTMyIDQKKy8vIENIRUNLLUFSTTogQHMxMyA9IGdsb2JhbCBpMzIgNApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL21zX3N0cnVjdC1wYWNrLmMgYi90ZXN0L0NvZGVHZW4vbXNfc3RydWN0LXBhY2suYwppbmRleCBkYTk0ZjU0Li42NDg2ZjI5IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vbXNfc3RydWN0LXBhY2suYworKysgYi90ZXN0L0NvZGVHZW4vbXNfc3RydWN0LXBhY2suYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtLW9ubHkgIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW45ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bS1vbmx5ICAtdHJpcGxlIGkzODYtYXBwbGUtZGFyd2luOSAtZmR1bXAtcmVjb3JkLWxheW91dHMgJXMgfCBGaWxlQ2hlY2sgJXMKIC8vIHJkYXI6Ly84ODIzMjY1CiAKICNwcmFnbWEgcGFjaygxKQpAQCAtMTIzLDMgKzEyMywyMiBAQAogCiBzdGF0aWMgaW50IGE4WyhzaXplb2YoZWlnaHRfbXMpID09IDQ4KSAtIDFdOwogCisvLyByZGFyOi8vMTU5MjY5OTAKKyNwcmFnbWEgcGFjaygyKQorc3RydWN0IHRlc3QwIHsKKyAgdW5zaWduZWQgbG9uZyBhIDogODsKKyAgdW5zaWduZWQgbG9uZyBiIDogODsKKyAgdW5zaWduZWQgbG9uZyBjIDogODsKKyAgdW5zaWduZWQgbG9uZyBkIDogMTA7CisgIHVuc2lnbmVkIGxvbmcgZSA6IDE7Cit9IF9fYXR0cmlidXRlX18oKF9fbXNfc3RydWN0X18pKTsKKworLy8gQ0hFQ0s6ICAgICAgVHlwZTogc3RydWN0IHRlc3QwCisvLyBDSEVDSy1ORVhUOiBSZWNvcmQ6CisvLyBDSEVDSy1ORVhUOiBMYXlvdXQ6CisvLyBDSEVDSy1ORVhUOiAgIFNpemU6NjQKKy8vIENIRUNLLU5FWFQ6ICAgRGF0YVNpemU6NjQKKy8vIENIRUNLLU5FWFQ6ICAgQWxpZ25tZW50OjE2CisvLyBDSEVDSy1ORVhUOiAgIEZpZWxkT2Zmc2V0czogWzAsIDgsIDE2LCAzMiwgNDJdPgorCitzdGF0aWMgaW50IHRlc3QwWyhzaXplb2Yoc3RydWN0IHRlc3QwKSA9PSA4KSA/IDEgOiAtMV07CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vbmVvbi1jcnlwdG8uYyBiL3Rlc3QvQ29kZUdlbi9uZW9uLWNyeXB0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkY2VmNGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vbmVvbi1jcnlwdG8uYwpAQCAtMCwwICsxLDk1IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiBcCisvLyBSVU46ICAgLXRhcmdldC1mZWF0dXJlICtjcnlwdG8gLWVtaXQtbGx2bSAtTzEgLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtLW5vbmUtbGludXgtZ251ZWFiaSAtdGFyZ2V0LWZlYXR1cmUgK25lb24gXAorLy8gUlVOOiAgLXRhcmdldC1mZWF0dXJlICtjcnlwdG8gLXRhcmdldC1jcHUgY29ydGV4LWE1NyAtZW1pdC1sbHZtIC1PMSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46IG5vdCAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NC1ub25lLWxpbnV4LWdudSAtdGFyZ2V0LWZlYXR1cmUgK25lb24gXAorLy8gUlVOOiAgIC1TIC1PMyAtbyAtICVzIDI+JjEgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTk8tQ1JZUFRPICVzCisKKy8vIFRlc3QgbmV3IGFhcmNoNjQgaW50cmluc2ljcyBhbmQgdHlwZXMKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK3VpbnQ4eDE2X3QgdGVzdF92YWVzZXFfdTgodWludDh4MTZfdCBkYXRhLCB1aW50OHgxNl90IGtleSkgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdmFlc2VxX3U4CisgIC8vIENIRUNLLU5PLUNSWVBUTzogd2FybmluZzogaW1wbGljaXQgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gJ3ZhZXNlcV91OCcgaXMgaW52YWxpZCBpbiBDOTkKKyAgcmV0dXJuIHZhZXNlcV91OChkYXRhLCBrZXkpOworICAvLyBDSEVDSzogY2FsbCA8MTYgeCBpOD4gQGxsdm0uYXJtLm5lb24uYWVzZSg8MTYgeCBpOD4gJWRhdGEsIDwxNiB4IGk4PiAla2V5KQorfQorCit1aW50OHgxNl90IHRlc3RfdmFlc2RxX3U4KHVpbnQ4eDE2X3QgZGF0YSwgdWludDh4MTZfdCBrZXkpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3ZhZXNkcV91OAorICByZXR1cm4gdmFlc2RxX3U4KGRhdGEsIGtleSk7CisgIC8vIENIRUNLOiBjYWxsIDwxNiB4IGk4PiBAbGx2bS5hcm0ubmVvbi5hZXNkKDwxNiB4IGk4PiAlZGF0YSwgPDE2IHggaTg+ICVrZXkpCit9CisKK3VpbnQ4eDE2X3QgdGVzdF92YWVzbWNxX3U4KHVpbnQ4eDE2X3QgZGF0YSkgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdmFlc21jcV91OAorICByZXR1cm4gdmFlc21jcV91OChkYXRhKTsKKyAgLy8gQ0hFQ0s6IGNhbGwgPDE2IHggaTg+IEBsbHZtLmFybS5uZW9uLmFlc21jKDwxNiB4IGk4PiAlZGF0YSkKK30KKwordWludDh4MTZfdCB0ZXN0X3ZhZXNpbWNxX3U4KHVpbnQ4eDE2X3QgZGF0YSkgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdmFlc2ltY3FfdTgKKyAgcmV0dXJuIHZhZXNpbWNxX3U4KGRhdGEpOworICAvLyBDSEVDSzogY2FsbCA8MTYgeCBpOD4gQGxsdm0uYXJtLm5lb24uYWVzaW1jKDwxNiB4IGk4PiAlZGF0YSkKK30KKwordWludDMyX3QgdGVzdF92c2hhMWhfdTMyKHVpbnQzMl90IGhhc2hfZSkgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnNoYTFoX3UzMgorICByZXR1cm4gdnNoYTFoX3UzMihoYXNoX2UpOworICAvLyBDSEVDSzogY2FsbCBpMzIgQGxsdm0uYXJtLm5lb24uc2hhMWgoaTMyICVoYXNoX2UpCit9CisKK3VpbnQzMng0X3QgdGVzdF92c2hhMXN1MXFfdTMyKHVpbnQzMng0X3QgdzBfMywgdWludDMyeDRfdCB3MTJfMTUpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3ZzaGExc3UxcV91MzIKKyAgcmV0dXJuIHZzaGExc3UxcV91MzIodzBfMywgdzEyXzE1KTsKKyAgLy8gQ0hFQ0s6IGNhbGwgPDQgeCBpMzI+IEBsbHZtLmFybS5uZW9uLnNoYTFzdTEoPDQgeCBpMzI+ICV3MF8zLCA8NCB4IGkzMj4gJXcxMl8xNSkKK30KKwordWludDMyeDRfdCB0ZXN0X3ZzaGEyNTZzdTBxX3UzMih1aW50MzJ4NF90IHcwXzMsIHVpbnQzMng0X3QgdzRfNykgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnNoYTI1NnN1MHFfdTMyCisgIHJldHVybiB2c2hhMjU2c3UwcV91MzIodzBfMywgdzRfNyk7CisgIC8vIENIRUNLOiBjYWxsIDw0IHggaTMyPiBAbGx2bS5hcm0ubmVvbi5zaGEyNTZzdTAoPDQgeCBpMzI+ICV3MF8zLCA8NCB4IGkzMj4gJXc0XzcpCit9CisKK3VpbnQzMng0X3QgdGVzdF92c2hhMWNxX3UzMih1aW50MzJ4NF90IGhhc2hfYWJjZCwgdWludDMyX3QgaGFzaF9lLCB1aW50MzJ4NF90IHdrKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92c2hhMWNxX3UzMgorICByZXR1cm4gdnNoYTFjcV91MzIoaGFzaF9hYmNkLCBoYXNoX2UsIHdrKTsKKyAgLy8gQ0hFQ0s6IGNhbGwgPDQgeCBpMzI+IEBsbHZtLmFybS5uZW9uLnNoYTFjKDw0IHggaTMyPiAlaGFzaF9hYmNkLCBpMzIgJWhhc2hfZSwgPDQgeCBpMzI+ICV3aykKK30KKwordWludDMyeDRfdCB0ZXN0X3ZzaGExcHFfdTMyKHVpbnQzMng0X3QgaGFzaF9hYmNkLCB1aW50MzJfdCBoYXNoX2UsIHVpbnQzMng0X3Qgd2spIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3ZzaGExcHFfdTMyCisgIHJldHVybiB2c2hhMXBxX3UzMihoYXNoX2FiY2QsIGhhc2hfZSwgd2spOworICAvLyBDSEVDSzogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtLm5lb24uc2hhMXAoPDQgeCBpMzI+ICVoYXNoX2FiY2QsIGkzMiAlaGFzaF9lLCA8NCB4IGkzMj4gJXdrKQorfQorCit1aW50MzJ4NF90IHRlc3RfdnNoYTFtcV91MzIodWludDMyeDRfdCBoYXNoX2FiY2QsIHVpbnQzMl90IGhhc2hfZSwgdWludDMyeDRfdCB3aykgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnNoYTFtcV91MzIKKyAgcmV0dXJuIHZzaGExbXFfdTMyKGhhc2hfYWJjZCwgaGFzaF9lLCB3ayk7CisgIC8vIENIRUNLOiBjYWxsIDw0IHggaTMyPiBAbGx2bS5hcm0ubmVvbi5zaGExbSg8NCB4IGkzMj4gJWhhc2hfYWJjZCwgaTMyICVoYXNoX2UsIDw0IHggaTMyPiAld2spCit9CisKK3VpbnQzMng0X3QgdGVzdF92c2hhMXN1MHFfdTMyKHVpbnQzMng0X3QgdzBfMywgdWludDMyeDRfdCB3NF83LCB1aW50MzJ4NF90IHc4XzExKSB7CisgIC8vIENIRUNLLUxBQkVMOiBAdGVzdF92c2hhMXN1MHFfdTMyCisgIHJldHVybiB2c2hhMXN1MHFfdTMyKHcwXzMsIHc0XzcsIHc4XzExKTsKKyAgLy8gQ0hFQ0s6IGNhbGwgPDQgeCBpMzI+IEBsbHZtLmFybS5uZW9uLnNoYTFzdTAoPDQgeCBpMzI+ICV3MF8zLCA8NCB4IGkzMj4gJXc0XzcsIDw0IHggaTMyPiAldzhfMTEpCit9CisKK3VpbnQzMng0X3QgdGVzdF92c2hhMjU2aHFfdTMyKHVpbnQzMng0X3QgaGFzaF9hYmNkLCB1aW50MzJ4NF90IGhhc2hfZWZnaCwgdWludDMyeDRfdCB3aykgeworICAvLyBDSEVDSy1MQUJFTDogQHRlc3RfdnNoYTI1NmhxX3UzMgorICByZXR1cm4gdnNoYTI1NmhxX3UzMihoYXNoX2FiY2QsIGhhc2hfZWZnaCwgd2spOworICAvLyBDSEVDSzogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtLm5lb24uc2hhMjU2aCg8NCB4IGkzMj4gJWhhc2hfYWJjZCwgPDQgeCBpMzI+ICVoYXNoX2VmZ2gsIDw0IHggaTMyPiAld2spCit9CisKK3VpbnQzMng0X3QgdGVzdF92c2hhMjU2aDJxX3UzMih1aW50MzJ4NF90IGhhc2hfZWZnaCwgdWludDMyeDRfdCBoYXNoX2FiY2QsIHVpbnQzMng0X3Qgd2spIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3ZzaGEyNTZoMnFfdTMyCisgIHJldHVybiB2c2hhMjU2aDJxX3UzMihoYXNoX2VmZ2gsIGhhc2hfYWJjZCwgd2spOworICAvLyBDSEVDSzogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtLm5lb24uc2hhMjU2aDIoPDQgeCBpMzI+ICVoYXNoX2VmZ2gsIDw0IHggaTMyPiAlaGFzaF9hYmNkLCA8NCB4IGkzMj4gJXdrKQorfQorCit1aW50MzJ4NF90IHRlc3RfdnNoYTI1NnN1MXFfdTMyKHVpbnQzMng0X3QgdzBfMywgdWludDMyeDRfdCB3OF8xMSwgdWludDMyeDRfdCB3MTJfMTUpIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IEB0ZXN0X3ZzaGEyNTZzdTFxX3UzMgorICByZXR1cm4gdnNoYTI1NnN1MXFfdTMyKHcwXzMsIHc4XzExLCB3MTJfMTUpOworICAvLyBDSEVDSzogY2FsbCA8NCB4IGkzMj4gQGxsdm0uYXJtLm5lb24uc2hhMjU2c3UxKDw0IHggaTMyPiAldzBfMywgPDQgeCBpMzI+ICV3OF8xMSwgPDQgeCBpMzI+ICV3MTJfMTUpCit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vbm9kdXBsaWNhdGUtY3h4MTEtdGVzdC5jcHAgYi90ZXN0L0NvZGVHZW4vbm9kdXBsaWNhdGUtY3h4MTEtdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyNzg2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbi9ub2R1cGxpY2F0ZS1jeHgxMS10ZXN0LmNwcApAQCAtMCwwICsxLDIwIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZT1pNjg2LXBjLXVua25vd24gLXN0ZD1jKysxMSAlcyAgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisKKy8vIFRoaXMgd2FzIGEgcHJvYmxlbSBpbiBTZW1hLCBidXQgb25seSBzaG93cyB1cCBhcyBub2lubGluZSBtaXNzaW5nCisvLyBpbiBDb2RlR2VuLgorCisvLyBDSEVDSzogZGVmaW5lIGkzMiBAX1oxNW5vZHVwbGljYXRlZGZ1bmkoaTMyICVhKSBbW05JOiNbMC05XStdXQorCitpbnQgbm9kdXBsaWNhdGVkZnVuIFtbY2xhbmc6Om5vZHVwbGljYXRlXV0gKGludCBhKSB7CisKKyAgcmV0dXJuIGErMTsKKworfQorCitpbnQgbWFpbigpIHsKKworICByZXR1cm4gbm9kdXBsaWNhdGVkZnVuKDUpOworCit9CisKKy8vIENIRUNLOiBhdHRyaWJ1dGVzIFtbTkldXSA9IHsgbm9kdXBsaWNhdGUgbm91bndpbmR7ey4qfX0gfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL25vaW5saW5lLmMgYi90ZXN0L0NvZGVHZW4vbm9pbmxpbmUuYwppbmRleCBlNjRhMWE1Li5iZDVhOWQ4IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vbm9pbmxpbmUuYworKysgYi90ZXN0L0NvZGVHZW4vbm9pbmxpbmUuYwpAQCAtNSwxMCArNSwxNyBAQAogCiBpbmxpbmUgaW50IGRvbnRfaW5saW5lX21lKGludCBhLCBpbnQgYikgeyByZXR1cm4oYStiKTsgfQogCitpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkgaW50IGlubGluZV9tZShpbnQgYSwgaW50IGIpIHsgcmV0dXJuKGEqYik7IH0KKwogdm9sYXRpbGUgaW50ICpwYSA9IChpbnQqKSAweDEwMDA7CiB2b2lkIGZvbygpIHsKIC8vIE5PSU5MSU5FOiBAZm9vCiAvLyBOT0lOTElORTogZG9udF9pbmxpbmVfbWUKIC8vIE5PSU5MSU5FLU5PVDogaW5saW5laGludAogICAgIHBhWzBdID0gZG9udF9pbmxpbmVfbWUocGFbMV0scGFbMl0pOwkKKy8vIE5PSU5MSU5FLU5PVDogaW5saW5lX21lCisgICAgcGFbM10gPSBpbmxpbmVfbWUocGFbNF0scGFbNV0pOwogfQorCisvLyBOT0lOTElORTogRnVuY3Rpb24gQXR0cnM6IG5vaW5saW5lCisvLyBOT0lOTElORTogQGRvbnRfaW5saW5lX21lCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vb3ZlcmxvYWRhYmxlLmMgYi90ZXN0L0NvZGVHZW4vb3ZlcmxvYWRhYmxlLmMKaW5kZXggMWVkNzJiMS4uOGI0MGU0ZCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL292ZXJsb2FkYWJsZS5jCisrKyBiL3Rlc3QvQ29kZUdlbi9vdmVybG9hZGFibGUuYwpAQCAtMSw0ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBncmVwIF9aMWZQQTEwXzFYCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gQ0hFQ0s6IF9aMWZQQTEwXzFYCisKIGludCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmKGludCB4KSB7IHJldHVybiB4OyB9CiBmbG9hdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmKGZsb2F0IHgpIHsgcmV0dXJuIHg7IH0KIGRvdWJsZSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmKGRvdWJsZSB4KSB7IHJldHVybiB4OyB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vcGFja2VkLW5lc3QtdW5wYWNrZWQuYyBiL3Rlc3QvQ29kZUdlbi9wYWNrZWQtbmVzdC11bnBhY2tlZC5jCmluZGV4IDM5MzE3NDEuLmVhNDU2NjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9wYWNrZWQtbmVzdC11bnBhY2tlZC5jCisrKyBiL3Rlc3QvQ29kZUdlbi9wYWNrZWQtbmVzdC11bnBhY2tlZC5jCkBAIC02MCw2ICs2MCw2IEBACiAKIHVuc2lnbmVkIHRlc3Q3KCkgewogICAvLyBDSEVDSzogQHRlc3Q3Ci0gIC8vIENIRUNLOiBsb2FkIGkzMiogYml0Y2FzdCAoJXN0cnVjdC5YQml0ZmllbGQqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKCVzdHJ1Y3QuWUJpdGZpZWxkKiBAZ2JpdGZpZWxkLCBpMzIgMCwgaTMyIDEpIHRvIGkzMiopLCBhbGlnbiA0CisgIC8vIENIRUNLOiBsb2FkIGkzMiogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoJXN0cnVjdC5ZQml0ZmllbGQqIEBnYml0ZmllbGQsIGkzMiAwLCBpMzIgMSwgaTMyIDApLCBhbGlnbiA0CiAgIHJldHVybiBnYml0ZmllbGQueS5iMjsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9wYWNrZWQtdW5pb24uYyBiL3Rlc3QvQ29kZUdlbi9wYWNrZWQtdW5pb24uYwppbmRleCAzMWNlNjE0Li5jYjQ5OTk5IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vcGFja2VkLXVuaW9uLmMKKysrIGIvdGVzdC9Db2RlR2VuL3BhY2tlZC11bmlvbi5jCkBAIC0xLDExICsxLDExIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWVtaXQtbGx2bSAlcyAtbyAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiB0eXBlZGVmIHN0cnVjdCBfYXR0cnMgewogICAgICAgICB1bnNpZ25lZCBmaWxlX2F0dHJpYnV0ZXM7CiAgICAgICAgIHVuc2lnbmVkIGNoYXIgZmlsZW5hbWVfbGVuZ3RoOwogfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSkgYXR0cnM7CiAKLS8vIFJVTjogZ3JlcCAidW5pb24uX2F0dHJfdW5pb24gPSB0eXBlIDx7IGkzMiwgaTggfT4iICV0CisvLyBDSEVDSzogJXVuaW9uLl9hdHRyX3VuaW9uID0gdHlwZSA8eyBpMzIsIGk4IH0+CiB0eXBlZGVmIHVuaW9uIF9hdHRyX3VuaW9uIHsKICAgYXR0cnMgZmlsZV9hdHRyczsKICAgdW5zaWduZWQgb3duZXJfaWQ7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vcG93ZXJwY190eXBlcy5jIGIvdGVzdC9Db2RlR2VuL3Bvd2VycGNfdHlwZXMuYwppbmRleCBiNGRlMzE4Li44YjJiMTU2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vcG93ZXJwY190eXBlcy5jCisrKyBiL3Rlc3QvQ29kZUdlbi9wb3dlcnBjX3R5cGVzLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogcHBjMzItcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBwb3dlcnBjLXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjLXVua25vd24tZnJlZWJzZCAtZW1pdC1sbHZtIC1vIC0gJXN8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVNWUjQtQ0hFQ0sgJXMKIAogI2luY2x1ZGUgPHN0ZGFyZy5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL3BwYzY0LWFsaWduLWxvbmctZG91YmxlLmMgYi90ZXN0L0NvZGVHZW4vcHBjNjQtYWxpZ24tbG9uZy1kb3VibGUuYwppbmRleCBjNGRjZmEwLi42ZDA3ZjcwIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vcHBjNjQtYWxpZ24tbG9uZy1kb3VibGUuYworKysgYi90ZXN0L0NvZGVHZW4vcHBjNjQtYWxpZ24tbG9uZy1kb3VibGUuYwpAQCAtMSw4ICsxLDYgQEAKLS8vIFJFUVVJUkVTOiBwcGM2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IHBvd2VycGMtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAotLy8gQ0hFQ0s6IC1mMTI4OjEyODoxMjgtCi0KIHN0cnVjdCBTIHsKICAgZG91YmxlIGE7CiAgIGxvbmcgZG91YmxlIGI7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vcHBjNjQtY29tcGxleC1wYXJtcy5jIGIvdGVzdC9Db2RlR2VuL3BwYzY0LWNvbXBsZXgtcGFybXMuYwppbmRleCA5MmE2ZmE1Li5lYzU2ZjlmIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vcHBjNjQtY29tcGxleC1wYXJtcy5jCisrKyBiL3Rlc3QvQ29kZUdlbi9wcGM2NC1jb21wbGV4LXBhcm1zLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogcHBjNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBwb3dlcnBjLXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIGZsb2F0IGNyZWFsZihfQ29tcGxleCBmbG9hdCk7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vcHBjNjQtY29tcGxleC1yZXR1cm4uYyBiL3Rlc3QvQ29kZUdlbi9wcGM2NC1jb21wbGV4LXJldHVybi5jCmluZGV4IGIzZmQ1NDkuLmNkYjBlZDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9wcGM2NC1jb21wbGV4LXJldHVybi5jCisrKyBiL3Rlc3QvQ29kZUdlbi9wcGM2NC1jb21wbGV4LXJldHVybi5jCkBAIC0xLDQgKzEsNCBAQAotLy8gUkVRVUlSRVM6IHBwYzY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogcG93ZXJwYy1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgcG93ZXJwYzY0LXVua25vd24tbGludXgtZ251IC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiBmbG9hdCBjcmVhbGYoX0NvbXBsZXggZmxvYXQpOwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL3BwYzY0LWV4dGVuZC5jIGIvdGVzdC9Db2RlR2VuL3BwYzY0LWV4dGVuZC5jCmluZGV4IGQ0NmI2NTEuLjUyZTVmMTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9wcGM2NC1leHRlbmQuYworKysgYi90ZXN0L0NvZGVHZW4vcHBjNjQtZXh0ZW5kLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogcHBjNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBwb3dlcnBjLXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIHZvaWQgZjEoaW50IHgpIHsgcmV0dXJuOyB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vcHBjNjQtaW5saW5lLWFzbS5jIGIvdGVzdC9Db2RlR2VuL3BwYzY0LWlubGluZS1hc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTJmZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuL3BwYzY0LWlubGluZS1hc20uYwpAQCAtMCwwICsxLDI2IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUgLU8yIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworCitfQm9vbCB0ZXN0X3djX2kxKF9Cb29sIGIxLCBfQm9vbCBiMikgeworICBfQm9vbCBvOworICBhc20oImNyYW5kICUwLCAlMSwgJTIiIDogIj13YyIobykgOiAid2MiKGIxKSwgIndjIihiMikgOiApOworICByZXR1cm4gbzsKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgemVyb2V4dCBpMSBAdGVzdF93Y19pMShpMSB6ZXJvZXh0ICViMSwgaTEgemVyb2V4dCAlYjIpCisvLyBDSEVDSzogY2FsbCBpOCBhc20gImNyYW5kICQwLCAkMSwgJDIiLCAiPV53Yyxed2MsXndjIihpMSAlYjEsIGkxICViMikKK30KKworaW50IHRlc3Rfd2NfaTMyKGludCBiMSwgaW50IGIyKSB7CisgIGludCBvOworICBhc20oImNyYW5kICUwLCAlMSwgJTIiIDogIj13YyIobykgOiAid2MiKGIxKSwgIndjIihiMikgOiApOworICByZXR1cm4gbzsKKy8vIENIRUNLLUxBQkVMOiBzaWduZXh0IGkzMiBAdGVzdF93Y19pMzIoaTMyIHNpZ25leHQgJWIxLCBpMzIgc2lnbmV4dCAlYjIpCisvLyBDSEVDSzogY2FsbCBpMzIgYXNtICJjcmFuZCAkMCwgJDEsICQyIiwgIj1ed2MsXndjLF53YyIoaTMyICViMSwgaTMyICViMikKK30KKwordW5zaWduZWQgY2hhciB0ZXN0X3djX2k4KHVuc2lnbmVkIGNoYXIgYjEsIHVuc2lnbmVkIGNoYXIgYjIpIHsKKyAgdW5zaWduZWQgY2hhciBvOworICBhc20oImNyYW5kICUwLCAlMSwgJTIiIDogIj13YyIobykgOiAid2MiKGIxKSwgIndjIihiMikgOiApOworICByZXR1cm4gbzsKKy8vIENIRUNLLUxBQkVMOiB6ZXJvZXh0IGk4IEB0ZXN0X3djX2k4KGk4IHplcm9leHQgJWIxLCBpOCB6ZXJvZXh0ICViMikKKy8vIENIRUNLOiBjYWxsIGk4IGFzbSAiY3JhbmQgJDAsICQxLCAkMiIsICI9XndjLF53Yyxed2MiKGk4ICViMSwgaTggJWIyKQorfQorCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vcHBjNjQtc3RydWN0LW9uZWZsb2F0LmMgYi90ZXN0L0NvZGVHZW4vcHBjNjQtc3RydWN0LW9uZWZsb2F0LmMKaW5kZXggZTI2OTg3Zi4uMTFiMTZhNCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL3BwYzY0LXN0cnVjdC1vbmVmbG9hdC5jCisrKyBiL3Rlc3QvQ29kZUdlbi9wcGM2NC1zdHJ1Y3Qtb25lZmxvYXQuYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiBwcGM2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IHBvd2VycGMtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAogdHlwZWRlZiBzdHJ1Y3QgczEgeyBmbG9hdCBmOyB9IFNmOwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL3BwYzY0LXN0cnVjdC1vbmV2ZWN0LmMgYi90ZXN0L0NvZGVHZW4vcHBjNjQtc3RydWN0LW9uZXZlY3QuYwppbmRleCBhNWExMjMyLi4zNGY0Y2MwIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vcHBjNjQtc3RydWN0LW9uZXZlY3QuYworKysgYi90ZXN0L0NvZGVHZW4vcHBjNjQtc3RydWN0LW9uZXZlY3QuYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiBwcGM2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IHBvd2VycGMtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtTzIgLXRyaXBsZSBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIHR5cGVkZWYgZmxvYXQgdjRzZiBfX2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDE2KSkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL3BwYzY0LXZhcmFyZ3MtY29tcGxleC5jIGIvdGVzdC9Db2RlR2VuL3BwYzY0LXZhcmFyZ3MtY29tcGxleC5jCmluZGV4IGI2NWE3NzMuLjhmYzg4MzkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9wcGM2NC12YXJhcmdzLWNvbXBsZXguYworKysgYi90ZXN0L0NvZGVHZW4vcHBjNjQtdmFyYXJncy1jb21wbGV4LmMKQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogcHBjNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBwb3dlcnBjLXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKICNpbmNsdWRlIDxzdGRhcmcuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9wcGM2NC12YXJhcmdzLXN0cnVjdC5jIGIvdGVzdC9Db2RlR2VuL3BwYzY0LXZhcmFyZ3Mtc3RydWN0LmMKaW5kZXggNjFjMzNiMC4uNzBiMjQyYyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL3BwYzY0LXZhcmFyZ3Mtc3RydWN0LmMKKysrIGIvdGVzdC9Db2RlR2VuL3BwYzY0LXZhcmFyZ3Mtc3RydWN0LmMKQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogcHBjNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiBwb3dlcnBjLXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKICNpbmNsdWRlIDxzdGRhcmcuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9wcjE4MjM1LmMgYi90ZXN0L0NvZGVHZW4vcHIxODIzNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjEyZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW4vcHIxODIzNS5jCkBAIC0wLDAgKzEsMyBAQAorLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtdHJpcGxlIGxlMzItdW5rbm93bi1uYWNsICVzIC1TIC1vIC0gMj4mMSB8IEZpbGVDaGVjayAlcworCisvLyBDSEVDSzogZXJyb3I6IHVuYWJsZSB0byBjcmVhdGUgdGFyZ2V0OiAnTm8gYXZhaWxhYmxlIHRhcmdldHMgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIHRyaXBsZSwgc2VlIC12ZXJzaW9uIGZvciB0aGUgYXZhaWxhYmxlIHRhcmdldHMuJwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL3ByYWdtYS1wYWNrLTEuYyBiL3Rlc3QvQ29kZUdlbi9wcmFnbWEtcGFjay0xLmMKaW5kZXggMmE3MWM4Zi4uNzczMzE4YyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL3ByYWdtYS1wYWNrLTEuYworKysgYi90ZXN0L0NvZGVHZW4vcHJhZ21hLXBhY2stMS5jCkBAIC01MywxMiArNTMsMTIgQEAKICAgaW50IGU7CiB9IHM0OwogCi0vLyBDSEVDSzogW1tzdHJ1Y3RfcmVmOiVbYS16QS1aMC05Xy5dK11dID0gdHlwZSA8eyBbW3N0cnVjdF9yZWZdXSogfT4KKy8vIENIRUNLOiBbW3N0cnVjdF9yZWY6JVthLXpBLVowLTlfLl0rXV0gPSB0eXBlIHsgW1tzdHJ1Y3RfcmVmXV0qIH0KIC8vIENIRUNLOiBbW3N0cnVjdF9TOiVbYS16QS1aMC05Xy5dK11dID0gdHlwZSB7IFszIHggaThdLCBbW3N0cnVjdF9UOiVbYS16QS1aMC05Xy5dK11dLCBbW3N0cnVjdF9UMjolW2EtekEtWjAtOV8uXStdXSB9CiAvLyBDSEVDSzogW1tzdHJ1Y3RfVF1dID0gdHlwZSA8eyBpOCwgaTMyIH0+CiAvLyBDSEVDSzogW1tzdHJ1Y3RfVDJdXSA9IHR5cGUgeyBpOCwgaTMyIH0KIAotLy8gQ0hFQ0s6ICVzdHJ1Y3QuUzMgPSB0eXBlIDx7IFszIHggaThdLCBpOCwgJXN0cnVjdC5UMywgWzIgeCBpOF0sICVzdHJ1Y3QuVDMyIH0+CisvLyBDSEVDSzogJXN0cnVjdC5TMyA9IHR5cGUgeyBbMyB4IGk4XSwgaTgsICVzdHJ1Y3QuVDMsICVzdHJ1Y3QuVDMyIH0KIC8vIENIRUNLOiAlc3RydWN0LlQzID0gdHlwZSA8eyBpOCwgaTgsIGkzMiB9PgogLy8gQ0hFQ0s6ICVzdHJ1Y3QuVDMyID0gdHlwZSB7IGk4LCBpMzIgfQogLy8gQ0hFQ0s6ICVzdHJ1Y3QuUzQgPSB0eXBlIHsgWzMgeCBpOF0sICVzdHJ1Y3QuVDQsIGkzMiB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vcHJhZ21hLXBhY2stMi5jIGIvdGVzdC9Db2RlR2VuL3ByYWdtYS1wYWNrLTIuYwppbmRleCAxY2EzYmRmLi44YTc3MjgwIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vcHJhZ21hLXBhY2stMi5jCisrKyBiL3Rlc3QvQ29kZUdlbi9wcmFnbWEtcGFjay0yLmMKQEAgLTQsNyArNCw3IEBACiAKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW45ICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLVg2NCAlcwogLy8gQ0hFQ0stWDY0OiAlc3RydWN0LnMwID0gdHlwZSA8eyBpNjQsIGk2NCwgaTMyLCBbMTIgeCBpMzJdIH0+Ci0vLyBDSEVDSy1YNjQ6ICVzdHJ1Y3QuczEgPSB0eXBlIDx7IFsxNSB4IGkzMl0sICVzdHJ1Y3QuczAgfT4KKy8vIENIRUNLLVg2NDogJXN0cnVjdC5zMSA9IHR5cGUgeyBbMTUgeCBpMzJdLCAlc3RydWN0LnMwIH0KIAogLy8gcmRhcjovL3Byb2JsZW0vNzA5NTQzNgogI3ByYWdtYSBwYWNrKDQpCkBAIC0yMCw0ICsyMCwzIEBACiAgIGludCBhWzE1XTsKICAgc3RydWN0IHMwIGI7CiB9IGI7Ci0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9yNS5jIGIvdGVzdC9Db2RlR2VuL3I1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTBjMGQuLjAwMDAwMDAKLS0tIGEvdGVzdC9Db2RlR2VuL3I1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjctbm9uZS1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1yNSAtZW1pdC1sbHZtIC1TICVzICAtbyAvZGV2L251bGwKLQotaW50IG1haW4oKSB7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL3NwYXJjLXRhcmdldC1kYXRhLmMgYi90ZXN0L0NvZGVHZW4vc3BhcmMtdGFyZ2V0LWRhdGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzMmEyMS4uMDAwMDAwMAotLS0gYS90ZXN0L0NvZGVHZW4vc3BhcmMtdGFyZ2V0LWRhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBzcGFyYy1zdW4tc29sYXJpcyAgIC1vIC0gLWVtaXQtbGx2bSAtUyAlcyB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVY4Ci0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHNwYXJjdjktc3VuLXNvbGFyaXMgLW8gLSAtZW1pdC1sbHZtIC1TICVzIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9VjkKLQotLy8gVjg6IEUtcDozMjozMjozMi1pMTo4OjgtaTg6ODo4LWkxNjoxNjoxNi1pMzI6MzI6MzItaTY0OjY0OjY0LWYzMjozMjozMi1mNjQ6NjQ6NjQtdjY0OjY0OjY0LW4zMi1TNjQKLS8vIFY5OiBFLXA6NjQ6NjQ6NjQtaTE6ODo4LWk4Ojg6OC1pMTY6MTY6MTYtaTMyOjMyOjMyLWk2NDo2NDo2NC1mMzI6MzI6MzItZjY0OjY0OjY0LXY2NDo2NDo2NC1uMzI6NjQtUzEyOApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL3NwYXJjdjktYWJpLmMgYi90ZXN0L0NvZGVHZW4vc3BhcmN2OS1hYmkuYwppbmRleCA0YmE0YmU4Li5kNGZmZjgxIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vc3BhcmN2OS1hYmkuYworKysgYi90ZXN0L0NvZGVHZW4vc3BhcmN2OS1hYmkuYwpAQCAtMTgsNiArMTgsOSBAQAogLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBzaWduZXh0IGk4IEBmX2ludF80KGk4IHNpZ25leHQgJXgpCiBjaGFyIGZfaW50XzQoY2hhciB4KSB7IHJldHVybiB4OyB9CiAKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgZnAxMjggQGZfbGQoZnAxMjggJXgpCitsb25nIGRvdWJsZSBmX2xkKGxvbmcgZG91YmxlIHgpIHsgcmV0dXJuIHg7IH0KKwogLy8gU21hbGwgc3RydWN0cyBhcmUgcGFzc2VkIGluIHJlZ2lzdGVycy4KIHN0cnVjdCBzbWFsbCB7CiAgIGludCAqYSwgKmI7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vc3BhcmN2OS1kd2FyZi5jIGIvdGVzdC9Db2RlR2VuL3NwYXJjdjktZHdhcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWFjMjhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuL3NwYXJjdjktZHdhcmYuYwpAQCAtMCwwICsxLDk5IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBzcGFyY3Y5LXVua25vd24tdW5rbm93biAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGR3YXJmX3JlZ19zaXplX3RhYmxlWzEwMisxXTsKKworaW50IHRlc3QoKSB7CisgIF9fYnVpbHRpbl9pbml0X2R3YXJmX3JlZ19zaXplX3RhYmxlKGR3YXJmX3JlZ19zaXplX3RhYmxlKTsKKworICByZXR1cm4gX19idWlsdGluX2R3YXJmX3NwX2NvbHVtbigpOworfQorCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHNpZ25leHQgaTMyIEB0ZXN0KCkKKy8vIENIRUNLOiAgICAgICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDApCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiAxKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgMikKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDMpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA0KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNSkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDYpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA3KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgOCkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDkpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiAxMCkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDExKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgMTIpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiAxMykKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDE0KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgMTUpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiAxNikKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDE3KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgMTgpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiAxOSkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDIwKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgMjEpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiAyMikKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDIzKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgMjQpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiAyNSkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDI2KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgMjcpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiAyOCkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDI5KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgMzApCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiAzMSkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA0LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDMyKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDQsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgMzMpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggNCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiAzNCkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA0LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDM1KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDQsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgMzYpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggNCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiAzNykKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA0LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDM4KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDQsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgMzkpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggNCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA0MCkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA0LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDQxKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDQsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNDIpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggNCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA0MykKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA0LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDQ0KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDQsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNDUpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggNCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA0NikKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA0LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDQ3KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDQsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNDgpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggNCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA0OSkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA0LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDUwKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDQsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNTEpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggNCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA1MikKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA0LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDUzKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDQsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNTQpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggNCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA1NSkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA0LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDU2KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDQsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNTcpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggNCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA1OCkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA0LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDU5KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDQsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNjApCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggNCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA2MSkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA0LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDYyKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDQsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNjMpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA2NCkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDY1KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNjYpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA2NykKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDY4KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNjkpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA3MCkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDcxKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNzIpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA3MykKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDc0KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNzUpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA3NikKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDc3KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgNzgpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA3OSkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDgwKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgODEpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA4MikKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDgzKQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgODQpCisvLyBDSEVDSy1ORVhUOiAgc3RvcmUgaTggOCwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxMDMgeCBpOF0qIEBkd2FyZl9yZWdfc2l6ZV90YWJsZSwgaTMyIDAsIGkzMiA4NSkKKy8vIENIRUNLLU5FWFQ6ICBzdG9yZSBpOCA4LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEwMyB4IGk4XSogQGR3YXJmX3JlZ19zaXplX3RhYmxlLCBpMzIgMCwgaTMyIDg2KQorLy8gQ0hFQ0stTkVYVDogIHN0b3JlIGk4IDgsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTAzIHggaThdKiBAZHdhcmZfcmVnX3NpemVfdGFibGUsIGkzMiAwLCBpMzIgODcpCisvLyBDSEVDSy1ORVhUOiAgcmV0IGkzMiAxNApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL3NyZXQuYyBiL3Rlc3QvQ29kZUdlbi9zcmV0LmMKaW5kZXggODI4YmY5Yi4uNWYwZDA3NCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL3NyZXQuYworKysgYi90ZXN0L0NvZGVHZW4vc3JldC5jCkBAIC00LDYgKzQsOCBAQAogIGxvbmcgYTsKICBsb25nIGI7CiAgbG9uZyBjOworIGxvbmcgZDsKKyBsb25nIGU7CiB9OwogIAogc3RydWN0IGFiYyBmb28xKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL3NyZXQyLmMgYi90ZXN0L0NvZGVHZW4vc3JldDIuYwppbmRleCAzNzU3NDYyLi5kMTAzZDg3IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vc3JldDIuYworKysgYi90ZXN0L0NvZGVHZW4vc3JldDIuYwpAQCAtNCw2ICs0LDggQEAKICBsb25nIGE7CiAgbG9uZyBiOwogIGxvbmcgYzsKKyBsb25nIGQ7CisgbG9uZyBlOwogfTsKICAKIHN0cnVjdCBhYmMgZm9vMigpe30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9zdGFjay1wcm90ZWN0b3IuYyBiL3Rlc3QvQ29kZUdlbi9zdGFjay1wcm90ZWN0b3IuYwppbmRleCBlNDdlNWIzLi4yZmI5YjJjIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vc3RhY2stcHJvdGVjdG9yLmMKKysrIGIvdGVzdC9Db2RlR2VuL3N0YWNrLXByb3RlY3Rvci5jCkBAIC0yLDcgKzIsOSBAQAogLy8gTk9TU1A6IGRlZmluZSB2b2lkIEB0ZXN0MShpOCogJW1zZykgIzAgewogLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAlcyAtc3RhY2stcHJvdGVjdG9yIDEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1XSVRIU1NQICVzCiAvLyBXSVRIU1NQOiBkZWZpbmUgdm9pZCBAdGVzdDEoaTgqICVtc2cpICMwIHsKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1vIC0gJXMgLXN0YWNrLXByb3RlY3RvciAyIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9U1NQUkVRICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAtICVzIC1zdGFjay1wcm90ZWN0b3IgMiB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVNTUFNUUk9ORyAlcworLy8gU1NQU1RST05HOiBkZWZpbmUgdm9pZCBAdGVzdDEoaTgqICVtc2cpICMwIHsKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1vIC0gJXMgLXN0YWNrLXByb3RlY3RvciAzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9U1NQUkVRICVzCiAvLyBTU1BSRVE6IGRlZmluZSB2b2lkIEB0ZXN0MShpOCogJW1zZykgIzAgewogCiB0eXBlZGVmIF9fU0laRV9UWVBFX18gc2l6ZV90OwpAQCAtMjEsNCArMjMsNiBAQAogCiAvLyBXSVRIU1NQOiBhdHRyaWJ1dGVzICN7ey4qfX0gPSB7IG5vdW53aW5kIHNzcHt7Lip9fSB9CiAKKy8vIFNTUFNUUk9ORzogYXR0cmlidXRlcyAje3suKn19ID0geyBub3Vud2luZCBzc3BzdHJvbmd7ey4qfX0gfQorCiAvLyBTU1BSRVE6IGF0dHJpYnV0ZXMgI3t7Lip9fSA9IHsgbm91bndpbmQgc3NwcmVxe3suKn19IH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi9zdHJpbmctbGl0ZXJhbC1zaG9ydC13c3RyaW5nLmMgYi90ZXN0L0NvZGVHZW4vc3RyaW5nLWxpdGVyYWwtc2hvcnQtd3N0cmluZy5jCmluZGV4IDg4ZTRhMWUuLjg5YWE2ZjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi9zdHJpbmctbGl0ZXJhbC1zaG9ydC13c3RyaW5nLmMKKysrIGIvdGVzdC9Db2RlR2VuL3N0cmluZy1saXRlcmFsLXNob3J0LXdzdHJpbmcuYwpAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAteCBjKysgLWVtaXQtbGx2bSAtZnNob3J0LXdjaGFyICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAteCBjKysgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLWZzaG9ydC13Y2hhciAlcyAtbyAtIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLIC0tY2hlY2stcHJlZml4PUlUQU5JVU0KKy8vIFJVTjogJWNsYW5nX2NjMSAteCBjKysgLXRyaXBsZSAlbXNfYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1mc2hvcnQtd2NoYXIgJXMgLW8gLSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSyAtLWNoZWNrLXByZWZpeD1NU0FCSQogLy8gUnVucyBpbiBjKysgbW9kZSBzbyB0aGF0IHdjaGFyX3QgaXMgYXZhaWxhYmxlLgogCiBpbnQgbWFpbigpIHsKQEAgLTYsMTEgKzcsMTMgQEAKICAgLy8gQ0hFQ0s6IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFsxMCB4IGk4XSBjIlxFMVw4NFxBMFxDOFxBMFxGNFw4Mlw4MFxCMFwwMCIsIGFsaWduIDEKICAgY2hhciBiWzEwXSA9ICJcdTExMjBcdTAyMjBcVTAwMTAyMDMwIjsKIAotICAvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzMgeCBpMTZdIFtpMTYgNjUsIGkxNiA2NiwgaTE2IDBdCisgIC8vIElUQU5JVU06IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFszIHggaTE2XSBbaTE2IDY1LCBpMTYgNjYsIGkxNiAwXQorICAvLyBNU0FCSTogbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCBbMyB4IGkxNl0gW2kxNiA2NSwgaTE2IDY2LCBpMTYgMF0KICAgY29uc3Qgd2NoYXJfdCAqZm9vID0gTCJBQiI7CiAKICAgLy8gVGhpcyBzaG91bGQgY29udmVydCB0byB1dGYxNi4KLSAgLy8gQ0hFQ0s6IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs1IHggaTE2XSBbaTE2IDQzODQsIGkxNiA1NDQsIGkxNiAtOTI3MiwgaTE2IC05MTY4LCBpMTYgMF0KKyAgLy8gSVRBTklVTTogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzUgeCBpMTZdIFtpMTYgNDM4NCwgaTE2IDU0NCwgaTE2IC05MjcyLCBpMTYgLTkxNjgsIGkxNiAwXQorICAvLyBNU0FCSTogbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCBbNSB4IGkxNl0gW2kxNiA0Mzg0LCBpMTYgNTQ0LCBpMTYgLTkyNzIsIGkxNiAtOTE2OCwgaTE2IDBdCiAgIGNvbnN0IHdjaGFyX3QgKmJhciA9IEwiXHUxMTIwXHUwMjIwXFUwMDEwMjAzMCI7CiAKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL3N0cnVjdC14ODYtZGFyd2luLmMgYi90ZXN0L0NvZGVHZW4vc3RydWN0LXg4Ni1kYXJ3aW4uYwppbmRleCBhZmRjYjhhLi41MTkxNDQxIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vc3RydWN0LXg4Ni1kYXJ3aW4uYworKysgYi90ZXN0L0NvZGVHZW4vc3RydWN0LXg4Ni1kYXJ3aW4uYwpAQCAtMSwxMyArMSwxMyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIDwgJXMgLWVtaXQtbGx2bSA+ICV0MSAtdHJpcGxlPWk2ODYtYXBwbGUtZGFyd2luOQotLy8gUlVOOiBncmVwICJTVGVzdDEgPSB0eXBlIHsgaTMyLCBcWzQgeCBpMTZcXSwgZG91YmxlIH0iICV0MQotLy8gUlVOOiBncmVwICJTVGVzdDIgPSB0eXBlIHsgaTE2LCBpMTYsIGkzMiwgaTMyIH0iICV0MQotLy8gUlVOOiBncmVwICJTVGVzdDMgPSB0eXBlIHsgaTgsIGkxNiwgaTMyIH0iICV0MQotLy8gUlVOOiBncmVwICJTVGVzdEIxID0gdHlwZSB7IGk4LCBpOCB9IiAldDEKLS8vIFJVTjogZ3JlcCAiU1Rlc3RCMiA9IHR5cGUgeyBpOCwgaTgsIGk4IH0iICV0MQotLy8gUlVOOiBncmVwICJTVGVzdEIzID0gdHlwZSB7IGk4LCBpOCB9IiAldDEKLS8vIFJVTjogZ3JlcCAiU1Rlc3RCNCA9IHR5cGUgeyBpOCwgaTgsIGk4LCBpOCB9IiAldDEKLS8vIFJVTjogZ3JlcCAiU1Rlc3RCNSA9IHR5cGUgeyBpOCwgaTgsIFxbMiB4IGk4XF0sIGk4LCBpOCB9IiAldDEKLS8vIFJVTjogZ3JlcCAiU1Rlc3RCNiA9IHR5cGUgeyBpOCwgaTgsIFxbMiB4IGk4XF0gfSIgJXQxCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtdHJpcGxlPWk2ODYtYXBwbGUtZGFyd2luOSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBDSEVDSzogU1Rlc3QxID0gdHlwZSB7IGkzMiwgWzQgeCBpMTZdLCBkb3VibGUgfQorLy8gQ0hFQ0s6IFNUZXN0MiA9IHR5cGUgeyBpMTYsIGkxNiwgaTMyLCBpMzIgfQorLy8gQ0hFQ0s6IFNUZXN0MyA9IHR5cGUgeyBpOCwgaTE2LCBpMzIgfQorLy8gQ0hFQ0s6IFNUZXN0QjEgPSB0eXBlIHsgaTgsIGk4IH0KKy8vIENIRUNLOiBTVGVzdEIyID0gdHlwZSB7IGk4LCBpOCwgaTggfQorLy8gQ0hFQ0s6IFNUZXN0QjMgPSB0eXBlIHsgaTgsIGk4IH0KKy8vIENIRUNLOiBTVGVzdEI0ID0gdHlwZSB7IGk4LCBpOCwgaTgsIGk4IH0KKy8vIENIRUNLOiBTVGVzdEI1ID0gdHlwZSB7IGk4LCBpMTYsIGk4IH0KKy8vIENIRUNLOiBTVGVzdEI2ID0gdHlwZSB7IGk4LCBpOCwgaTE2IH0KIC8vIFRlc3Qgc3RydWN0IGxheW91dCBmb3IgeDg2LWRhcndpbiB0YXJnZXQKIAogc3RydWN0IFNUZXN0MSB7aW50IHg7IHNob3J0IHlbNF07IGRvdWJsZSB6OyB9IHN0MTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi90YXJnZXQtZGF0YS5jIGIvdGVzdC9Db2RlR2VuL3RhcmdldC1kYXRhLmMKaW5kZXggZmM4Zjc1OC4uMGNjNDZiOCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL3RhcmdldC1kYXRhLmMKKysrIGIvdGVzdC9Db2RlR2VuL3RhcmdldC1kYXRhLmMKQEAgLTEsNiArMSwxNjcgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtdW5rbm93bi11bmtub3duIC1lbWl0LWxsdm0gLW8gJXQgJXMKLS8vIFJVTjogZ3JlcCAndGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1wOjMyOjMyOjMyLWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi1pNjQ6MzI6NjQtZjMyOjMyOjMyLWY2NDozMjo2NC12NjQ6NjQ6NjQtdjEyODoxMjg6MTI4LWEwOjA6NjQtZjgwOjMyOjMyLW44OjE2OjMyLVMxMjgiJyAldAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1hcHBsZS1kYXJ3aW45IC1lbWl0LWxsdm0gLW8gJXQgJXMKLS8vIFJVTjogZ3JlcCAndGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1wOjMyOjMyOjMyLWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi1pNjQ6MzI6NjQtZjMyOjMyOjMyLWY2NDozMjo2NC12NjQ6NjQ6NjQtdjEyODoxMjg6MTI4LWEwOjA6NjQtZjgwOjEyODoxMjgtbjg6MTY6MzItUzEyOCInICV0Ci0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtdW5rbm93bi11bmtub3duIC1lbWl0LWxsdm0gLW8gJXQgJXMKLS8vIFJVTjogZ3JlcCAndGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1wOjY0OjY0OjY0LWkxOjg6OC1pODo4OjgtaTE2OjE2OjE2LWkzMjozMjozMi1pNjQ6NjQ6NjQtZjMyOjMyOjMyLWY2NDo2NDo2NC12NjQ6NjQ6NjQtdjEyODoxMjg6MTI4LWEwOjA6NjQtczA6NjQ6NjQtZjgwOjEyODoxMjgtbjg6MTY6MzI6NjQtUzEyOCInICV0CisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXVua25vd24tdW5rbm93biAtZW1pdC1sbHZtIC1vIC0gJXMgfCBcCisvLyBSVU46ICAgICBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9STY4Ni1VTktOT1dOICVzCisvLyBJNjg2LVVOS05PV046IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtbTplLXA6MzI6MzItZjY0OjMyOjY0LWY4MDozMi1uODoxNjozMi1TMTI4IgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LWFwcGxlLWRhcndpbjkgLWVtaXQtbGx2bSAtbyAtICVzIHwgXAorLy8gUlVOOiAgICAgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUk2ODYtREFSV0lOICVzCisvLyBJNjg2LURBUldJTjogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1tOm8tcDozMjozMi1mNjQ6MzI6NjQtZjgwOjEyOC1uODoxNjozMi1TMTI4IgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXVua25vd24td2luMzIgLWVtaXQtbGx2bSAtbyAtICVzIHwgXAorLy8gUlVOOiAgICAgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUk2ODYtV0lOMzIgJXMKKy8vIEk2ODYtV0lOMzI6IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtbTp3LXA6MzI6MzItaTY0OjY0LWY4MDozMi1uODoxNjozMi1TMzIiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtdW5rbm93bi1jeWd3aW4gLWVtaXQtbGx2bSAtbyAtICVzIHwgXAorLy8gUlVOOiAgICAgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUk2ODYtQ1lHV0lOICVzCisvLyBJNjg2LUNZR1dJTjogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1tOnctcDozMjozMi1pNjQ6NjQtZjgwOjMyLW44OjE2OjMyLVMzMiIKKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LXVua25vd24tdW5rbm93biAtZW1pdC1sbHZtIC1vIC0gJXMgfCBcCisvLyBSVU46ICAgICBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9WDg2XzY0ICVzCisvLyBYODZfNjQ6IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtbTplLWk2NDo2NC1mODA6MTI4LW44OjE2OjMyOjY0LVMxMjgiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHhjb3JlLXVua25vd24tdW5rbm93biAtZW1pdC1sbHZtIC1vIC0gJXMgfCBcCisvLyBSVU46ICAgICBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9WENPUkUgJXMKKy8vIFhDT1JFOiB0YXJnZXQgZGF0YWxheW91dCA9ICJlLW06ZS1wOjMyOjMyLWkxOjg6MzItaTg6ODozMi1pMTY6MTY6MzItaTY0OjMyLWY2NDozMi1hOjA6MzItbjMyIgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBzcGFyYy1zdW4tc29sYXJpcyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBcCisvLyBSVU46ICAgICBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9U1BBUkMtVjgKKy8vIFNQQVJDLVY4OiB0YXJnZXQgZGF0YWxheW91dCA9ICJFLW06ZS1wOjMyOjMyLWk2NDo2NC1mMTI4OjY0LW4zMi1TNjQiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHNwYXJjdjktc3VuLXNvbGFyaXMgLWVtaXQtbGx2bSAtbyAtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9U1BBUkMtVjkKKy8vIFNQQVJDLVY5OiB0YXJnZXQgZGF0YWxheW91dCA9ICJFLW06ZS1pNjQ6NjQtbjMyOjY0LVMxMjgiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG1pcHNlbC1saW51eC1nbnUgLW8gLSAtZW1pdC1sbHZtICVzIHwgICAgIFwKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9TUlQUy0zMkVMCisvLyBNSVBTLTMyRUw6IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtbTptLXA6MzI6MzItaTg6ODozMi1pMTY6MTY6MzItaTY0OjY0LW4zMi1TNjQiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG1pcHMtbGludXgtZ251IC1vIC0gLWVtaXQtbGx2bSAlcyB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9TUlQUy0zMkVCCisvLyBNSVBTLTMyRUI6IHRhcmdldCBkYXRhbGF5b3V0ID0gIkUtbTptLXA6MzI6MzItaTg6ODozMi1pMTY6MTY6MzItaTY0OjY0LW4zMi1TNjQiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG1pcHM2NGVsLWxpbnV4LWdudSAtbyAtIC1lbWl0LWxsdm0gJXMgfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PU1JUFMtNjRFTAorLy8gTUlQUy02NEVMOiB0YXJnZXQgZGF0YWxheW91dCA9ICJlLW06bS1pODo4OjMyLWkxNjoxNjozMi1pNjQ6NjQtbjMyOjY0LVMxMjgiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG1pcHM2NGVsLWxpbnV4LWdudSAtbyAtIC1lbWl0LWxsdm0gLXRhcmdldC1hYmkgbjMyIFwKKy8vIFJVTjogJXMgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1NSVBTLTY0RUwtTjMyCisvLyBNSVBTLTY0RUwtTjMyOiB0YXJnZXQgZGF0YWxheW91dCA9ICJlLW06bS1wOjMyOjMyLWk4Ojg6MzItaTE2OjE2OjMyLWk2NDo2NC1uMzI6NjQtUzEyOCIKKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgbWlwczY0LWxpbnV4LWdudSAtbyAtIC1lbWl0LWxsdm0gJXMgfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PU1JUFMtNjRFQgorLy8gTUlQUy02NEVCOiB0YXJnZXQgZGF0YWxheW91dCA9ICJFLW06bS1pODo4OjMyLWkxNjoxNjozMi1pNjQ6NjQtbjMyOjY0LVMxMjgiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG1pcHM2NC1saW51eC1nbnUgLW8gLSAtZW1pdC1sbHZtICVzIC10YXJnZXQtYWJpIG4zMiBcCisvLyBSVU46IHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9TUlQUy02NEVCLU4zMgorLy8gTUlQUy02NEVCLU4zMjogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiRS1tOm0tcDozMjozMi1pODo4OjMyLWkxNjoxNjozMi1pNjQ6NjQtbjMyOjY0LVMxMjgiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHBvd2VycGM2NC1sdjIgLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1QUzMKKy8vIFBTMzogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiRS1tOmUtcDozMjozMi1pNjQ6NjQtbjMyOjY0IgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LW5hY2wgLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1JNjg2LU5BQ0wKKy8vIEk2ODYtTkFDTDogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1tOmUtcDozMjozMi1pNjQ6NjQtbjg6MTY6MzItUzEyOCIKKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LW5hY2wgLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1YODZfNjQtTkFDTAorLy8gWDg2XzY0LU5BQ0w6IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtbTplLXA6MzI6MzItaTY0OjY0LW44OjE2OjMyOjY0LVMxMjgiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybS1uYWNsLWdudWVhYmkgLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1BUk0tTkFDTAorLy8gQVJNLU5BQ0w6IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtbTplLXA6MzI6MzItaTY0OjY0LXYxMjg6NjQ6MTI4LW4zMi1TMTI4IgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBtaXBzZWwtbmFjbCAtbyAtIC1lbWl0LWxsdm0gJXMgfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PU1JUFMtTkFDTAorLy8gTUlQUy1OQUNMOiB0YXJnZXQgZGF0YWxheW91dCA9ICJlLW06bS1wOjMyOjMyLWk4Ojg6MzItaTE2OjE2OjMyLWk2NDo2NC1uMzItUzY0IgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBsZTMyLW5hY2wgLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1MRTMyLU5BQ0wKKy8vIExFMzItTkFDTDogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1wOjMyOjMyLWk2NDo2NCIKKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgcG93ZXJwYy11bmtub3duIC1vIC0gLWVtaXQtbGx2bSAlcyB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UFBDCisvLyBQUEM6IHRhcmdldCBkYXRhbGF5b3V0ID0gIkUtbTplLXA6MzI6MzItaTY0OjY0LW4zMiIKKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgcG93ZXJwYzY0LWZyZWVic2QgLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1QUEM2NC1GUkVFQlNECisvLyBQUEM2NC1GUkVFQlNEOiB0YXJnZXQgZGF0YWxheW91dCA9ICJFLW06ZS1pNjQ6NjQtbjMyOjY0IgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjNjQtbGludXggLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1QUEM2NC1MSU5VWAorLy8gUFBDNjQtTElOVVg6IHRhcmdldCBkYXRhbGF5b3V0ID0gIkUtbTplLWk2NDo2NC1uMzI6NjQiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHBvd2VycGM2NGxlLWxpbnV4IC1vIC0gLWVtaXQtbGx2bSAlcyB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UFBDNjRMRS1MSU5VWAorLy8gUFBDNjRMRS1MSU5VWDogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1tOmUtaTY0OjY0LW4zMjo2NCIKKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgcG93ZXJwYy1kYXJ3aW4gLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1QUEMzMi1EQVJXSU4KKy8vIFBQQzMyLURBUldJTjogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiRS1tOm8tcDozMjozMi1mNjQ6MzI6NjQtbjMyIgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjNjQtZGFyd2luIC1vIC0gLWVtaXQtbGx2bSAlcyB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9UFBDNjQtREFSV0lOCisvLyBQUEM2NC1EQVJXSU46IHRhcmdldCBkYXRhbGF5b3V0ID0gIkUtbTpvLWk2NDo2NC1uMzI6NjQiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG52cHR4LXVua25vd24gLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1OVlBUWAorLy8gTlZQVFg6IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtcDozMjozMi1pNjQ6NjQtdjE2OjE2LXYzMjozMi1uMTY6MzI6NjQiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG52cHR4NjQtdW5rbm93biAtbyAtIC1lbWl0LWxsdm0gJXMgfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PU5WUFRYNjQKKy8vIE5WUFRYNjQ6IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtaTY0OjY0LXYxNjoxNi12MzI6MzItbjE2OjMyOjY0IgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSByNjAwLXVua25vd24gLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1SNjAwCisvLyBSNjAwOiB0YXJnZXQgZGF0YWxheW91dCA9ICJlLXA6MzI6MzItaTY0OjY0LXYxNjoxNi12MjQ6MzItdjMyOjMyLXY0ODo2NC12OTY6MTI4LXYxOTI6MjU2LXYyNTY6MjU2LXY1MTI6NTEyLXYxMDI0OjEwMjQtdjIwNDg6MjA0OC1uMzI6NjQiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHI2MDAtdW5rbm93biAtdGFyZ2V0LWNwdSBjYXltYW4gLW8gLSAtZW1pdC1sbHZtICVzIFwKKy8vIFJVTjogfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1SNjAwRAorLy8gUjYwMEQ6IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtcDozMjozMi1pNjQ6NjQtdjE2OjE2LXYyNDozMi12MzI6MzItdjQ4OjY0LXY5NjoxMjgtdjE5MjoyNTYtdjI1NjoyNTYtdjUxMjo1MTItdjEwMjQ6MTAyNC12MjA0ODoyMDQ4LW4zMjo2NCIKKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgcjYwMC11bmtub3duIC10YXJnZXQtY3B1IGhhd2FpaSAtbyAtIC1lbWl0LWxsdm0gJXMgXAorLy8gUlVOOiB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVI2MDBTSQorLy8gUjYwMFNJOiB0YXJnZXQgZGF0YWxheW91dCA9ICJlLXA6MzI6MzItcDE6NjQ6NjQtcDI6NjQ6NjQtcDM6MzI6MzItcDQ6MzI6MzItcDU6NjQ6NjQtaTY0OjY0LXYxNjoxNi12MjQ6MzItdjMyOjMyLXY0ODo2NC12OTY6MTI4LXYxOTI6MjU2LXYyNTY6MjU2LXY1MTI6NTEyLXYxMDI0OjEwMjQtdjIwNDg6MjA0OC1uMzI6NjQiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFhcmNoNjQtdW5rbm93biAtbyAtIC1lbWl0LWxsdm0gJXMgfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PUFBUkNINjQKKy8vIEFBUkNINjQ6IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtbTplLWk2NDo2NC1pMTI4OjEyOC1uMzI6NjQtUzEyOCIKKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgdGh1bWItdW5rbm93bi1nbnVlYWJpIC1vIC0gLWVtaXQtbGx2bSAlcyB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9VEhVTUIKKy8vIFRIVU1COiB0YXJnZXQgZGF0YWxheW91dCA9ICJlLW06ZS1wOjMyOjMyLWkxOjg6MzItaTg6ODozMi1pMTY6MTY6MzItaTY0OjY0LXYxMjg6NjQ6MTI4LWE6MDozMi1uMzItUzY0IgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm0tdW5rbm93bi1nbnVlYWJpIC1vIC0gLWVtaXQtbGx2bSAlcyB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9QVJNCisvLyBBUk06IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtbTplLXA6MzI6MzItaTY0OjY0LXYxMjg6NjQ6MTI4LW4zMi1TNjQiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHRodW1iLXVua25vd24gLW8gLSAtZW1pdC1sbHZtIC10YXJnZXQtYWJpIGFwY3MtZ251IFwKKy8vIFJVTjogJXMgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1USFVNQi1HTlUKKy8vIFRIVU1CLUdOVTogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1tOmUtcDozMjozMi1pMTo4OjMyLWk4Ojg6MzItaTE2OjE2OjMyLWY2NDozMjo2NC12NjQ6MzI6NjQtdjEyODozMjoxMjgtYTowOjMyLW4zMi1TMzIiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybS11bmtub3duIC1vIC0gLWVtaXQtbGx2bSAtdGFyZ2V0LWFiaSBhcGNzLWdudSBcCisvLyBSVU46ICVzIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9QVJNLUdOVQorLy8gQVJNLUdOVTogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1tOmUtcDozMjozMi1mNjQ6MzI6NjQtdjY0OjMyOjY0LXYxMjg6MzI6MTI4LWE6MDozMi1uMzItUzMyIgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBoZXhhZ29uLXVua25vd24gLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1IRVhBR09OCisvLyBIRVhBR09OOiB0YXJnZXQgZGF0YWxheW91dCA9ICJlLW06ZS1wOjMyOjMyLWkxOjMyLWk2NDo2NC1hOjAtbjMyIgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBzMzkweC11bmtub3duIC1vIC0gLWVtaXQtbGx2bSAlcyB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9U1lTVEVNWgorLy8gU1lTVEVNWjogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiRS1tOmUtaTE6ODoxNi1pODo4OjE2LWk2NDo2NC1mMTI4OjY0LWE6ODoxNi1uMzI6NjQiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG1zcDQzMC11bmtub3duIC1vIC0gLWVtaXQtbGx2bSAlcyB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9TVNQNDMwCisvLyBNU1A0MzA6IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtbTplLXA6MTY6MTYtaTMyOjE2OjMyLW44OjE2IgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB0Y2UtdW5rbm93biAtbyAtIC1lbWl0LWxsdm0gJXMgfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVRDRQorLy8gVENFOiB0YXJnZXQgZGF0YWxheW91dCA9ICJFLXA6MzI6MzItaTg6ODozMi1pMTY6MTY6MzItaTY0OjMyLWY2NDozMi12NjQ6MzItdjEyODozMi1hOjA6MzItbjMyIgorCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBzcGlyLXVua25vd24gLW8gLSAtZW1pdC1sbHZtICVzIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1TUElSCisvLyBTUElSOiB0YXJnZXQgZGF0YWxheW91dCA9ICJlLXA6MzI6MzItaTY0OjY0LXYxNjoxNi12MjQ6MzItdjMyOjMyLXY0ODo2NC12OTY6MTI4LXYxOTI6MjU2LXYyNTY6MjU2LXY1MTI6NTEyLXYxMDI0OjEwMjQiCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHNwaXI2NC11bmtub3duIC1vIC0gLWVtaXQtbGx2bSAlcyB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9U1BJUjY0CisvLyBTUElSNjQ6IHRhcmdldCBkYXRhbGF5b3V0ID0gImUtaTY0OjY0LXYxNjoxNi12MjQ6MzItdjMyOjMyLXY0ODo2NC12OTY6MTI4LXYxOTI6MjU2LXYyNTY6MjU2LXY1MTI6NTEyLXYxMDI0OjEwMjQiCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vdGJhYS1mb3ItdnB0ci5jcHAgYi90ZXN0L0NvZGVHZW4vdGJhYS1mb3ItdnB0ci5jcHAKaW5kZXggN2JhMDU4Yi4uZGVkNTc0ZSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL3RiYWEtZm9yLXZwdHIuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbi90YmFhLWZvci12cHRyLmNwcApAQCAtMSwxMiArMSwxMiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAtZnNhbml0aXplPXRocmVhZCAlcyB8IEZpbGVDaGVjayAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAtTzEgJXMgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1vIC0gLU8xICAtcmVsYXhlZC1hbGlhc2luZyAtZnNhbml0aXplPXRocmVhZCAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gLWZzYW5pdGl6ZT10aHJlYWQgJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtbyAtIC1PMSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gLU8xICAtcmVsYXhlZC1hbGlhc2luZyAtZnNhbml0aXplPXRocmVhZCAlcyB8IEZpbGVDaGVjayAlcwogLy8KLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Tk9UQkFBCi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAtIC1PMiAgLXJlbGF4ZWQtYWxpYXNpbmcgJXMgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Tk9UQkFBCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1OT1RCQUEKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtbyAtIC1PMiAgLXJlbGF4ZWQtYWxpYXNpbmcgJXMgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Tk9UQkFBCiAvLwogLy8gQ2hlY2sgdGhhdCB3ZSBnZW5lcmF0ZSBUQkFBIGZvciB2dGFibGUgcG9pbnRlciBsb2FkcyBhbmQgc3RvcmVzLgotLy8gV2hlbiAtZnRocmVhZC1zYW5pdGl6ZXIgaXMgdXNlZCBUQkFBIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXQgYWxsIG9wdCBsZXZlbHMKKy8vIFdoZW4gLWZzYW5pdGl6ZT10aHJlYWQgaXMgdXNlZCBUQkFBIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXQgYWxsIG9wdCBsZXZlbHMKIC8vIGV2ZW4gaWYgLXJlbGF4ZWQtYWxpYXNpbmcgaXMgcHJlc2VudC4KIHN0cnVjdCBBIHsKICAgdmlydHVhbCBpbnQgZm9vKCkgY29uc3QgOwpAQCAtMTcsMTIgKzE3LDE5IEBACiAgIG5ldyBBOwogfQogCi12b2lkIENhbGxGb28oQSAqYSkgewordm9pZCBDYWxsRm9vKEEgKmEsIGludCAoQTo6KmZwKSgpIGNvbnN0KSB7CiAgIGEtPmZvbygpOworICAoYS0+KmZwKSgpOwogfQogCisvLyBDSEVDSy1MQUJFTDogQF9aN0NhbGxGb28KIC8vIENIRUNLOiAle3suKn19ID0gbG9hZCB7ey4qfX0gIXRiYWEgIVtbTlVNOlswLTldK11dCisvLyBDSEVDSzogYnIgaTEKKy8vIENIRUNLOiBsb2FkIHt7Lip9fSwgIXRiYWEgIVtbTlVNXV0KKy8vCisvLyBDSEVDSy1MQUJFTDogQF9aTjFBQzJFdgogLy8gQ0hFQ0s6IHN0b3JlIHt7Lip9fSAhdGJhYSAhW1tOVU1dXQorLy8KIC8vIENIRUNLOiBbW05VTV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSBbW1RZUEU6IS4qXV0sIG1ldGFkYXRhIFtbVFlQRV1dLCBpNjQgMH0KIC8vIENIRUNLOiBbW1RZUEVdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJ2dGFibGUgcG9pbnRlciIsIG1ldGFkYXRhICF7ey4qfX0KIC8vIE5PVEJBQS1OT1Q6ID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhIlNpbXBsZSBDL0MrKyBUQkFBIn0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi90YmFhLW1zLWFiaS5jcHAgYi90ZXN0L0NvZGVHZW4vdGJhYS1tcy1hYmkuY3BwCmluZGV4IDY3MzkwYjEuLjJhOWU0N2UgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi90YmFhLW1zLWFiaS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuL3RiYWEtbXMtYWJpLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1kaXNhYmxlLWxsdm0tb3B0em5zIC1lbWl0LWxsdm0gLW8gLSAtTzEgJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWRpc2FibGUtbGx2bS1vcHR6bnMgLWVtaXQtbGx2bSAtbyAtIC1PMSAlcyB8IEZpbGVDaGVjayAlcwogLy8KIC8vIFRlc3QgdGhhdCBUQkFBIHdvcmtzIGluIHRoZSBNaWNyb3NvZnQgQysrIEFCSS4gIFdlIHVzZWQgdG8gZXJyb3Igb3V0IHdoaWxlCiAvLyBhdHRlbXB0aW5nIHRvIG1hbmdsZSBSVFRJLgpAQCAtMTYsNyArMTYsNyBAQAogLy8gQ0hFQ0s6IHN0b3JlIGkzMiA0MiwgaTMyKiB7ey4qfX0sICF0YmFhIFtbVEFHX0FfaTMyOiEuKl1dCiB9CiAKLS8vIENIRUNLOiBbW1RZUEVfQ0hBUjohLipdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJvbW5pcG90ZW50IGNoYXIiLCBtZXRhZGF0YQotLy8gQ0hFQ0s6IFtbVFlQRV9JTlQ6IS4qXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiaW50IiwgbWV0YWRhdGEgW1tUWVBFX0NIQVJdXSwgaTY0IDB9CisvLyBDSEVDSzogW1tUWVBFX0lOVDohLipdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJpbnQiLCBtZXRhZGF0YSBbW1RZUEVfQ0hBUjohLipdXSwgaTY0IDB9CisvLyBDSEVDSzogW1tUWVBFX0NIQVJdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJvbW5pcG90ZW50IGNoYXIiLCBtZXRhZGF0YQogLy8gQ0hFQ0s6IFtbVEFHX0FfaTMyXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhIFtbVFlQRV9BOiEuKl1dLCBtZXRhZGF0YSBbW1RZUEVfSU5UXV0sIGk2NCAwfQogLy8gQ0hFQ0s6IFtbVFlQRV9BXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiP0FVU3RydWN0QUBAIiwgbWV0YWRhdGEgW1tUWVBFX0lOVF1dLCBpNjQgMH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi90YmFhLXN0cnVjdC5jcHAgYi90ZXN0L0NvZGVHZW4vdGJhYS1zdHJ1Y3QuY3BwCmluZGV4IGY4YmQxMjQuLjcxZDNlZDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi90YmFhLXN0cnVjdC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuL3RiYWEtc3RydWN0LmNwcApAQCAtMTIsOCArMTIsNyBAQAogICAqYSA9ICpiOwogfQogCi0vLyBDSEVDSzogdGFyZ2V0IGRhdGFsYXlvdXQgPSAie3suKn19cDpbW1A6NjR8MzJdXQotLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAbGx2bS5tZW1jcHkucDBpOC5wMGk4LmlbW1BdXShpOCogJXt7Lip9fSwgaTgqICV7ey4qfX0sIGlbW1BdXSAxNiwgaTMyIDQsIGkxIGZhbHNlKSwgIXRiYWEuc3RydWN0IFtbVFM6IS4qXV0KKy8vIENIRUNLOiBjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LnAwaTgucDBpOC5pNjQoaTgqICV7ey4qfX0sIGk4KiAle3suKn19LCBpNjQgMTYsIGkzMiA0LCBpMSBmYWxzZSksICF0YmFhLnN0cnVjdCBbW1RTOiEuKl1dCiAKIHN0cnVjdCBCIHsKICAgY2hhciBjMTsKQEAgLTI1LDcgKzI0LDcgQEAKICAgKmEgPSAqYjsKIH0KIAotLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAbGx2bS5tZW1jcHkucDBpOC5wMGk4LmlbW1BdXShpOCogJXt7Lip9fSwgaTgqICV7ey4qfX0sIGlbW1BdXSAyNCwgaTMyIDQsIGkxIGZhbHNlKSwgIXRiYWEuc3RydWN0IFtbVFMyOiEuKl1dCisvLyBDSEVDSzogY2FsbCB2b2lkIEBsbHZtLm1lbWNweS5wMGk4LnAwaTguaTY0KGk4KiAle3suKn19LCBpOCogJXt7Lip9fSwgaTY0IDI0LCBpMzIgNCwgaTEgZmFsc2UpLCAhdGJhYS5zdHJ1Y3QgW1tUUzI6IS4qXV0KIAogdHlwZWRlZiBfQ29tcGxleCBpbnQgVDI7CiB0eXBlZGVmIF9Db21wbGV4IGNoYXIgVDU7CkBAIC0zNyw3ICszNiw3IEBACiAgICphID0gKmI7CiB9CiAKLS8vIENIRUNLOiBjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LnAwaTgucDBpOC5pW1tQXV0oaTgqICV7ey4qfX0sIGk4KiAle3suKn19LCBpW1tQXV0gMTIsIGkzMiA0LCBpMSBmYWxzZSksICF0YmFhLnN0cnVjdCBbW1RTMzohLipdXQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAbGx2bS5tZW1jcHkucDBpOC5wMGk4Lmk2NChpOCogJXt7Lip9fSwgaTgqICV7ey4qfX0sIGk2NCAxMiwgaTMyIDQsIGkxIGZhbHNlKSwgIXRiYWEuc3RydWN0IFtbVFMzOiEuKl1dCiAKIC8vIE1ha2Ugc3VyZSB0aGF0IHplcm8tbGVuZ3RoIGJpdGZpZWxkIHdvcmtzLgogI2RlZmluZSBBVFRSIF9fYXR0cmlidXRlX18gKChtc19zdHJ1Y3QpKQpAQCAtNTAsNyArNDksNyBAQAogdm9pZCBjb3B5NChzdHJ1Y3QgZml2ZSAqYSwgc3RydWN0IGZpdmUgKmIpIHsKICAgKmEgPSAqYjsKIH0KLS8vIENIRUNLOiBjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LnAwaTgucDBpOC5pW1tQXV0oaTgqICV7ey4qfX0sIGk4KiAle3suKn19LCBpW1tQXV0gMywgaTMyIDEsIGkxIGZhbHNlKSwgIXRiYWEuc3RydWN0IFtbVFM0OiEuKl1dCisvLyBDSEVDSzogY2FsbCB2b2lkIEBsbHZtLm1lbWNweS5wMGk4LnAwaTguaTY0KGk4KiAle3suKn19LCBpOCogJXt7Lip9fSwgaTY0IDMsIGkzMiAxLCBpMSBmYWxzZSksICF0YmFhLnN0cnVjdCBbW1RTNDohLipdXQogCiBzdHJ1Y3Qgc2l4IHsKICAgY2hhciBhOwpAQCAtNjEsNyArNjAsNyBAQAogdm9pZCBjb3B5NShzdHJ1Y3Qgc2l4ICphLCBzdHJ1Y3Qgc2l4ICpiKSB7CiAgICphID0gKmI7CiB9Ci0vLyBDSEVDSzogY2FsbCB2b2lkIEBsbHZtLm1lbWNweS5wMGk4LnAwaTguaVtbUF1dKGk4KiAle3suKn19LCBpOCogJXt7Lip9fSwgaVtbUF1dIDYsIGkzMiAxLCBpMSBmYWxzZSksICF0YmFhLnN0cnVjdCBbW1RTNTohLipdXQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAbGx2bS5tZW1jcHkucDBpOC5wMGk4Lmk2NChpOCogJXt7Lip9fSwgaTgqICV7ey4qfX0sIGk2NCA2LCBpMzIgMSwgaTEgZmFsc2UpLCAhdGJhYS5zdHJ1Y3QgW1tUUzU6IS4qXV0KIAogLy8gQ0hFQ0s6IFtbVFNdXSA9IG1ldGFkYXRhICF7aTY0IDAsIGk2NCAyLCBtZXRhZGF0YSAhe3suKn19LCBpNjQgNCwgaTY0IDQsIG1ldGFkYXRhICF7ey4qfX0sIGk2NCA4LCBpNjQgMSwgbWV0YWRhdGEgIXt7Lip9fSwgaTY0IDEyLCBpNjQgNCwgbWV0YWRhdGEgIXt7Lip9fX0KIC8vIENIRUNLOiBbW0NIQVI6IS4qXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEib21uaXBvdGVudCBjaGFyIiwgbWV0YWRhdGEgIXt7Lip9fX0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi91bmlvbi5jIGIvdGVzdC9Db2RlR2VuL3VuaW9uLmMKaW5kZXggNWM4OWUyZC4uNzMwMjE4MiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL3VuaW9uLmMKKysrIGIvdGVzdC9Db2RlR2VuL3VuaW9uLmMKQEAgLTQ0LDMgKzQ0LDE2IEBACiBUMCB0MDsKIAogdW5pb24geyBpbnQgbGFyZ2VfYml0ZmllbGQ6IDMxOyBjaGFyIGMgfSB1MjsKKworc3RydWN0IGR0X3RfcyB7CisgIHVuaW9uIHsKKyAgICBsb25nIGxvbmcgdSA6IDU2OworICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfTsKK3N0cnVjdCB7CisgIHN0cnVjdCB7CisgICAgc3RydWN0IHsKKyAgICAgIHN0cnVjdCBkdF90X3MgdDsKKyAgICB9OworICB9OworfSBhOwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuL3V0ZjE2LWNmc3RyaW5ncy5jIGIvdGVzdC9Db2RlR2VuL3V0ZjE2LWNmc3RyaW5ncy5jCmluZGV4IGQ0ZjIxNGIuLmRiZTliZGEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi91dGYxNi1jZnN0cmluZ3MuYworKysgYi90ZXN0L0NvZGVHZW4vdXRmMTYtY2ZzdHJpbmdzLmMKQEAgLTEsNyArMSw3IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogLy8gPHJkYXI6Ly9wcm9ibGVtLzEwNjU1OTQ5PgogCi0vLyBDSEVDSzogQC5zdHIgPSBpbnRlcm5hbCB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzkgeCBpMTZdIFtpMTYgMjUyLCBpMTYgOTgsIGkxNiAxMDEsIGkxNiAxMTQsIGkxNiAxMDQsIGkxNiAxMTcsIGkxNiAxMTAsIGkxNiAxMDAsIGkxNiAwXSwgYWxpZ24gMgorLy8gQ0hFQ0s6IEAuc3RyID0gcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzkgeCBpMTZdIFtpMTYgMjUyLCBpMTYgOTgsIGkxNiAxMDEsIGkxNiAxMTQsIGkxNiAxMDQsIGkxNiAxMTcsIGkxNiAxMTAsIGkxNiAxMDAsIGkxNiAwXSwgc2VjdGlvbiAiX19URVhULF9fdXN0cmluZyIsIGFsaWduIDIKIAogI2RlZmluZSBDRlNUUiBfX2J1aWx0aW5fX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZwogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vdm9sYXRpbGUtY29tcGxleC5jIGIvdGVzdC9Db2RlR2VuL3ZvbGF0aWxlLWNvbXBsZXguYwppbmRleCA3MWU1ZGI2Li5mZDVlNTJiIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW4vdm9sYXRpbGUtY29tcGxleC5jCisrKyBiL3Rlc3QvQ29kZUdlbi92b2xhdGlsZS1jb21wbGV4LmMKQEAgLTUsMTYgKzUsMTQgQEAKIC8vCiAvLyBUaGlzIHRlc3QgYXNzdW1lcyB0aGF0IGZsb2F0cyBhcmUgMzItYml0IGFsaWduZWQgYW5kIGRvdWJsZXMgYXJlCiAvLyA2NC1iaXQgYWxpZ25lZCwgYW5kIHVzZXMgeDg2LTY0IGFzIGEgdGFyZ2V0IHRoYXQgc2hvdWxkIGhhdmUgdGhpcwotLy8gZGF0YWxheW91dC4KLQotLy8gQ0hFQ0s6IHRhcmdldCBkYXRhbGF5b3V0ID0gInt7Lip9fWYzMjozMjozMi1mNjQ6NjQ6NjR7ey4qfX0iCisvLyBwcm9wZXJ0eS4KIAogdm9sYXRpbGUgX0NvbXBsZXggZmxvYXQgY2Y7CiB2b2xhdGlsZSBfQ29tcGxleCBkb3VibGUgY2Q7CiB2b2xhdGlsZSBfQ29tcGxleCBmbG9hdCBjZjMyIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CiB2b2xhdGlsZSBfQ29tcGxleCBkb3VibGUgY2QzMiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwogCi0vLyBDSEVDSy1MQUJFTC1MQUJFTDogZGVmaW5lIHZvaWQgQHRlc3RfY2YoKQorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEB0ZXN0X2NmKCkKIHZvaWQgdGVzdF9jZigpIHsKICAgLy8gQ0hFQ0s6ICAgICAgbG9hZCB2b2xhdGlsZSBmbG9hdCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoeyBmbG9hdCwgZmxvYXQgfSogQGNmLCBpMzIgMCwgaTMyIDApLCBhbGlnbiA0CiAgIC8vIENIRUNLLU5FWFQ6IGxvYWQgdm9sYXRpbGUgZmxvYXQqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKHsgZmxvYXQsIGZsb2F0IH0qIEBjZiwgaTMyIDAsIGkzMiAxKSwgYWxpZ24gNApAQCAtMjcsNyArMjUsNyBAQAogICAvLyBDSEVDSy1ORVhUOiByZXQgdm9pZAogfQogCi0vLyBDSEVDSy1MQUJFTC1MQUJFTDogZGVmaW5lIHZvaWQgQHRlc3RfY2QoKQorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEB0ZXN0X2NkKCkKIHZvaWQgdGVzdF9jZCgpIHsKICAgLy8gQ0hFQ0s6ICAgICAgbG9hZCB2b2xhdGlsZSBkb3VibGUqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKHsgZG91YmxlLCBkb3VibGUgfSogQGNkLCBpMzIgMCwgaTMyIDApLCBhbGlnbiA4CiAgIC8vIENIRUNLLU5FWFQ6IGxvYWQgdm9sYXRpbGUgZG91YmxlKiBnZXRlbGVtZW50cHRyIGluYm91bmRzICh7IGRvdWJsZSwgZG91YmxlIH0qIEBjZCwgaTMyIDAsIGkzMiAxKSwgYWxpZ24gOApAQCAtNDAsNyArMzgsNyBAQAogICAvLyBDSEVDSy1ORVhUOiByZXQgdm9pZAogfQogCi0vLyBDSEVDSy1MQUJFTC1MQUJFTDogZGVmaW5lIHZvaWQgQHRlc3RfY2YzMigpCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQHRlc3RfY2YzMigpCiB2b2lkIHRlc3RfY2YzMigpIHsKICAgLy8gQ0hFQ0s6ICAgICAgbG9hZCB2b2xhdGlsZSBmbG9hdCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoeyBmbG9hdCwgZmxvYXQgfSogQGNmMzIsIGkzMiAwLCBpMzIgMCksIGFsaWduIDMyCiAgIC8vIENIRUNLLU5FWFQ6IGxvYWQgdm9sYXRpbGUgZmxvYXQqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKHsgZmxvYXQsIGZsb2F0IH0qIEBjZjMyLCBpMzIgMCwgaTMyIDEpLCBhbGlnbiA0CkBAIC01Myw3ICs1MSw3IEBACiAgIC8vIENIRUNLLU5FWFQ6IHJldCB2b2lkCiB9CiAKLS8vIENIRUNLLUxBQkVMLUxBQkVMOiBkZWZpbmUgdm9pZCBAdGVzdF9jZDMyKCkKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAdGVzdF9jZDMyKCkKIHZvaWQgdGVzdF9jZDMyKCkgewogICAvLyBDSEVDSzogICAgICBsb2FkIHZvbGF0aWxlIGRvdWJsZSogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoeyBkb3VibGUsIGRvdWJsZSB9KiBAY2QzMiwgaTMyIDAsIGkzMiAwKSwgYWxpZ24gMzIKICAgLy8gQ0hFQ0stTkVYVDogbG9hZCB2b2xhdGlsZSBkb3VibGUqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKHsgZG91YmxlLCBkb3VibGUgfSogQGNkMzIsIGkzMiAwLCBpMzIgMSksIGFsaWduIDgKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbi92b2xhdGlsZS5jIGIvdGVzdC9Db2RlR2VuL3ZvbGF0aWxlLmMKaW5kZXggMGRjZGMxNS4uM2U4OTFhYSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL3ZvbGF0aWxlLmMKKysrIGIvdGVzdC9Db2RlR2VuL3ZvbGF0aWxlLmMKQEAgLTEsNCArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSA8ICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZT0laXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gPCAlcyB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IENIRUNLIC1jaGVjay1wcmVmaXggQ0hFQ0stSVQKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlPSVtc19hYmlfdHJpcGxlIC1lbWl0LWxsdm0gPCAlcyB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IENIRUNLIC1jaGVjay1wcmVmaXggQ0hFQ0stTVMKIAogaW50IFM7CiB2b2xhdGlsZSBpbnQgdlM7CkBAIC04MywxMCArODQsMTIgQEAKIC8vIENIRUNLOiBsb2FkIHZvbGF0aWxlIGkzMiogZ2V0ZWxlbWVudHB0ciB7ey4qfX0gQHZGMwogLy8gQ0hFQ0s6IHN0b3JlIGkzMiB7ey4qfX0sIGkzMiogW1tJXV0KICAgaT1CRi54OwotLy8gQ0hFQ0s6IGxvYWQgaTgqIGdldGVsZW1lbnRwdHIge3suKn19IEBCRgorLy8gQ0hFQ0stSVQ6IGxvYWQgaTgqIGdldGVsZW1lbnRwdHIge3suKn19IEBCRgorLy8gQ0hFQ0stTVM6IGxvYWQgaTMyKiBnZXRlbGVtZW50cHRyIHt7Lip9fSBAQkYKIC8vIENIRUNLOiBzdG9yZSBpMzIge3suKn19LCBpMzIqIFtbSV1dCiAgIGk9dkJGLng7Ci0vLyBDSEVDSzogbG9hZCB2b2xhdGlsZSBpOCogZ2V0ZWxlbWVudHB0ciB7ey4qfX0gQHZCRgorLy8gQ0hFQ0stSVQ6IGxvYWQgdm9sYXRpbGUgaTgqIGdldGVsZW1lbnRwdHIge3suKn19IEB2QkYKKy8vIENIRUNLLU1TOiBsb2FkIHZvbGF0aWxlIGkzMiogZ2V0ZWxlbWVudHB0ciB7ey4qfX0gQHZCRgogLy8gQ0hFQ0s6IHN0b3JlIGkzMiB7ey4qfX0sIGkzMiogW1tJXV0KICAgaT1WWzNdOwogLy8gQ0hFQ0s6IGxvYWQgPDQgeCBpMzI+KiBAVgpAQCAtMTU0LDEyICsxNTcsMTYgQEAKIC8vIENIRUNLOiBzdG9yZSB2b2xhdGlsZSBpMzIge3suKn19LCBpMzIqIGdldGVsZW1lbnRwdHIge3suKn19IEB2RjMKICAgQkYueD1pOwogLy8gQ0hFQ0s6IGxvYWQgaTMyKiBbW0ldXQotLy8gQ0hFQ0s6IGxvYWQgaTgqIGdldGVsZW1lbnRwdHIge3suKn19IEBCRgotLy8gQ0hFQ0s6IHN0b3JlIGk4IHt7Lip9fSwgaTgqIGdldGVsZW1lbnRwdHIge3suKn19IEBCRgorLy8gQ0hFQ0stSVQ6IGxvYWQgaTgqIGdldGVsZW1lbnRwdHIge3suKn19IEBCRgorLy8gQ0hFQ0stTVM6IGxvYWQgaTMyKiBnZXRlbGVtZW50cHRyIHt7Lip9fSBAQkYKKy8vIENIRUNLLUlUOiBzdG9yZSBpOCB7ey4qfX0sIGk4KiBnZXRlbGVtZW50cHRyIHt7Lip9fSBAQkYKKy8vIENIRUNLLU1TOiBzdG9yZSBpMzIge3suKn19LCBpMzIqIGdldGVsZW1lbnRwdHIge3suKn19IEBCRgogICB2QkYueD1pOwogLy8gQ0hFQ0s6IGxvYWQgaTMyKiBbW0ldXQotLy8gQ0hFQ0s6IGxvYWQgdm9sYXRpbGUgaTgqIGdldGVsZW1lbnRwdHIge3suKn19IEB2QkYKLS8vIENIRUNLOiBzdG9yZSB2b2xhdGlsZSBpOCB7ey4qfX0sIGk4KiBnZXRlbGVtZW50cHRyIHt7Lip9fSBAdkJGCisvLyBDSEVDSy1JVDogbG9hZCB2b2xhdGlsZSBpOCogZ2V0ZWxlbWVudHB0ciB7ey4qfX0gQHZCRgorLy8gQ0hFQ0stTVM6IGxvYWQgdm9sYXRpbGUgaTMyKiBnZXRlbGVtZW50cHRyIHt7Lip9fSBAdkJGCisvLyBDSEVDSy1JVDogc3RvcmUgdm9sYXRpbGUgaTgge3suKn19LCBpOCogZ2V0ZWxlbWVudHB0ciB7ey4qfX0gQHZCRgorLy8gQ0hFQ0stTVM6IHN0b3JlIHZvbGF0aWxlIGkzMiB7ey4qfX0sIGkzMiogZ2V0ZWxlbWVudHB0ciB7ey4qfX0gQHZCRgogICBWWzNdPWk7CiAvLyBDSEVDSzogbG9hZCBpMzIqIFtbSV1dCiAvLyBDSEVDSzogbG9hZCA8NCB4IGkzMj4qIEBWCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4vd2NoYXItY29uc3QuYyBiL3Rlc3QvQ29kZUdlbi93Y2hhci1jb25zdC5jCmluZGV4IDJlOWFmNTMuLjM0ZGEyNDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbi93Y2hhci1jb25zdC5jCisrKyBiL3Rlc3QvQ29kZUdlbi93Y2hhci1jb25zdC5jCkBAIC0xNSw3ICsxNSw3IEBACiAKIAogLy8gQ0hFQ0stREFSOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbMTggeCBpMzJdIFtpMzIgODQsCi0vLyBDSEVDSy1XSU46IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFsxOCB4IGkxNl0gW2kxNiA4NCwKKy8vIENIRUNLLVdJTjogbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCBbMTggeCBpMTZdIFtpMTYgODQsCiBleHRlcm4gdm9pZCBmb28oY29uc3Qgd2NoYXJfdCogcCk7CiBpbnQgbWFpbiAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2W10pCiB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW4veGNvcmUtYWJpLmMgYi90ZXN0L0NvZGVHZW4veGNvcmUtYWJpLmMKaW5kZXggMTA4ODFkZS4uNmRiYzQ0YiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuL3hjb3JlLWFiaS5jCisrKyBiL3Rlc3QvQ29kZUdlbi94Y29yZS1hYmkuYwpAQCAtMSwzICsxLDQgQEAKKy8vIFJFUVVJUkVTOiB4Y29yZS1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeGNvcmUgLXZlcmlmeSAlcwogX1N0YXRpY19hc3NlcnQoc2l6ZW9mKGxvbmcgbG9uZykgPT0gOCwgInNpemVvZiBsb25nIGxvbmcgaXMgd3JvbmciKTsKIF9TdGF0aWNfYXNzZXJ0KF9BbGlnbm9mKGxvbmcgbG9uZykgPT0gNCwgImFsaWdub2YgbG9uZyBsb25nIGlzIHdyb25nIik7CkBAIC03LDExICs4LDE1IEBACiAKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHhjb3JlLXVua25vd24tdW5rbm93biAtZm5vLXNpZ25lZC1jaGFyIC1mbm8tY29tbW9uIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCi0vLyBDSEVDSzogdGFyZ2V0IGRhdGFsYXlvdXQgPSAiZS1wOjMyOjMyOjMyLWEwOjA6MzItbjMyLWkxOjg6MzItaTg6ODozMi1pMTY6MTY6MzItaTMyOjMyOjMyLWk2NDozMjozMi1mMTY6MTY6MzItZjMyOjMyOjMyLWY2NDozMjozMiIKIC8vIENIRUNLOiB0YXJnZXQgdHJpcGxlID0gInhjb3JlLXVua25vd24tdW5rbm93biIKIAorLy8gQ0hFQ0s6IEBjZ3ggPSBleHRlcm5hbCBjb25zdGFudCBpMzIsIHNlY3Rpb24gIi5jcC5yb2RhdGEiCitleHRlcm4gY29uc3QgaW50IGNneDsKK2ludCBmY2d4KCkgeyByZXR1cm4gY2d4O30KIC8vIENIRUNLOiBAZzEgPSBnbG9iYWwgaTMyIDAsIGFsaWduIDQKIGludCBnMTsKKy8vIENIRUNLOiBAY2cxID0gY29uc3RhbnQgaTMyIDAsIHNlY3Rpb24gIi5jcC5yb2RhdGEiLCBhbGlnbiA0Citjb25zdCBpbnQgY2cxOwogCiAjaW5jbHVkZSA8c3RkYXJnLmg+CiBzdHJ1Y3QgeCB7IGludCBhWzVdOyB9OwpAQCAtNjYsNyArNzEsNyBAQAogICAvLyBDSEVDSzpbW1YyOiVbYS16MC05XStdXSA9IGJpdGNhc3QgaTY0KiBbW1ZdXSB0byBpOCoKICAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAZihpOCogW1tWMl1dKQogCi0gIHN0cnVjdCB4IHY1ID0gdmFfYXJnIChhcCwgc3RydWN0IHgpOyAgLy8gdHlwaWNhbCBhZ3JlZ2F0ZSB0eXBlCisgIHN0cnVjdCB4IHY1ID0gdmFfYXJnIChhcCwgc3RydWN0IHgpOyAgLy8gdHlwaWNhbCBhZ2dyZWdhdGUgdHlwZQogICBmKCZ2NSk7CiAgIC8vIENIRUNLOiBbW0k6JVthLXowLTldK11dID0gbG9hZCBpOCoqIFtbQVBdXQogICAvLyBDSEVDSzogW1tJMjolW2EtejAtOV0rXV0gPSBiaXRjYXN0IGk4KiBbW0ldXSB0byAlc3RydWN0LngqKgpAQCAtNzksNyArODQsNyBAQAogICAvLyBDSEVDSzogW1tWMjolW2EtejAtOV0rXV0gPSBiaXRjYXN0ICVzdHJ1Y3QueCogW1tWXV0gdG8gaTgqCiAgIC8vIENIRUNLOiBjYWxsIHZvaWQgQGYoaTgqIFtbVjJdXSkKIAotICBpbnQqIHY2ID0gdmFfYXJnIChhcCwgaW50WzRdKTsgIC8vIGFuIHVudXN1YWwgYWdyZWdhdGUgdHlwZQorICBpbnQqIHY2ID0gdmFfYXJnIChhcCwgaW50WzRdKTsgIC8vIGFuIHVudXN1YWwgYWdncmVnYXRlIHR5cGUKICAgZih2Nik7CiAgIC8vIENIRUNLOiBbW0k6JVthLXowLTldK11dID0gbG9hZCBpOCoqIFtbQVBdXQogICAvLyBDSEVDSzogW1tJMjolW2EtejAtOV0rXV0gPSBiaXRjYXN0IGk4KiBbW0ldXSB0byBbNCB4IGkzMl0qKgpAQCAtMTEzLDEwICsxMTgsMTggQEAKICAgLy8gQ0hFQ0s6IGNhbGwgaTMyIEBsbHZtLnhjb3JlLmdldHBzKGkzMiB7eyVbYS16MC05XSt9fSkKICAgLy8gQ0hFQ0s6IGNhbGwgaTMyIEBsbHZtLnhjb3JlLmJpdHJldihpMzIge3slW2EtejAtOV0rfX0pCiAgIC8vIENIRUNLOiBjYWxsIHZvaWQgQGxsdm0ueGNvcmUuc2V0cHMoaTMyIHt7JVthLXowLTldK319LCBpMzIge3slW2EtejAtOV0rfX0pCi0gIGludCBpID0gX19idWlsdGluX2dldGlkKCk7Ci0gIHVuc2lnbmVkIGludCB1aSA9IF9fYnVpbHRpbl9nZXRwcyhpKTsKKyAgdm9sYXRpbGUgaW50IGkgPSBfX2J1aWx0aW5fZ2V0aWQoKTsKKyAgdm9sYXRpbGUgdW5zaWduZWQgaW50IHVpID0gX19idWlsdGluX2dldHBzKGkpOwogICB1aSA9IF9fYnVpbHRpbl9iaXRyZXYodWkpOwogICBfX2J1aWx0aW5fc2V0cHMoaSx1aSk7CisKKyAgLy8gQ0hFQ0s6IHN0b3JlIHZvbGF0aWxlIGkzMiAwLCBpMzIqIHt7JVthLXowLTldK319LCBhbGlnbiA0CisgIC8vIENIRUNLOiBzdG9yZSB2b2xhdGlsZSBpMzIgMSwgaTMyKiB7eyVbYS16MC05XSt9fSwgYWxpZ24gNAorICAvLyBDSEVDSzogc3RvcmUgdm9sYXRpbGUgaTMyIC0xLCBpMzIqIHt7JVthLXowLTldK319LCBhbGlnbiA0CisgIHZvbGF0aWxlIGludCByZXM7CisgIHJlcyA9IF9fYnVpbHRpbl9laF9yZXR1cm5fZGF0YV9yZWdubygwKTsKKyAgcmVzID0gX19idWlsdGluX2VoX3JldHVybl9kYXRhX3JlZ25vKDEpOworICByZXMgPSBfX2J1aWx0aW5fZWhfcmV0dXJuX2RhdGFfcmVnbm8oMik7CiB9CiAKIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgemVyb2V4dCBpOCBAdGVzdGNoYXIoKQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1VEQS9hZGRyZXNzLXNwYWNlcy5jdSBiL3Rlc3QvQ29kZUdlbkNVREEvYWRkcmVzcy1zcGFjZXMuY3UKaW5kZXggMDQzNDQ1Mi4uYTI4ODg2ZiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1VEQS9hZGRyZXNzLXNwYWNlcy5jdQorKysgYi90ZXN0L0NvZGVHZW5DVURBL2FkZHJlc3Mtc3BhY2VzLmN1CkBAIC0xLDUgKzEsOCBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtZmN1ZGEtaXMtZGV2aWNlIC10cmlwbGUgbnZwdHgtdW5rbm93bi11bmtub3duIHwgRmlsZUNoZWNrICVzCiAKKy8vIFZlcmlmaWVzIENsYW5nIGVtaXRzIGNvcnJlY3QgYWRkcmVzcyBzcGFjZXMgYW5kIGFkZHJzcGFjZWNhc3QgaW5zdHJ1Y3Rpb25zCisvLyBmb3IgQ1VEQSBjb2RlLgorCiAjaW5jbHVkZSAiLi4vU2VtYUNVREEvY3VkYS5oIgogCiAvLyBDSEVDSzogQGkgPSBhZGRyc3BhY2UoMSkgZ2xvYmFsCkBAIC0xMSw2ICsxNCwxOCBAQAogLy8gQ0hFQ0s6IEBrID0gYWRkcnNwYWNlKDMpIGdsb2JhbAogX19zaGFyZWRfXyBpbnQgazsKIAorc3RydWN0IE15U3RydWN0IHsKKyAgaW50IGRhdGExOworICBpbnQgZGF0YTI7Cit9OworCisvLyBDSEVDSzogQF9aWjVmdW5jMHZFMWEgPSBpbnRlcm5hbCBhZGRyc3BhY2UoMykgZ2xvYmFsICVzdHJ1Y3QuTXlTdHJ1Y3QgemVyb2luaXRpYWxpemVyCisvLyBDSEVDSzogQF9aWjVmdW5jMXZFMWEgPSBpbnRlcm5hbCBhZGRyc3BhY2UoMykgZ2xvYmFsIGZsb2F0IDAuMDAwMDAwZSswMAorLy8gQ0hFQ0s6IEBfWlo1ZnVuYzJ2RTFhID0gaW50ZXJuYWwgYWRkcnNwYWNlKDMpIGdsb2JhbCBbMjU2IHggZmxvYXRdIHplcm9pbml0aWFsaXplcgorLy8gQ0hFQ0s6IEBfWlo1ZnVuYzN2RTFhID0gaW50ZXJuYWwgYWRkcnNwYWNlKDMpIGdsb2JhbCBmbG9hdCAwLjAwMDAwMGUrMDAKKy8vIENIRUNLOiBAX1paNWZ1bmM0dkUxYSA9IGludGVybmFsIGFkZHJzcGFjZSgzKSBnbG9iYWwgZmxvYXQgMC4wMDAwMDBlKzAwCisvLyBDSEVDSzogQGIgPSBhZGRyc3BhY2UoMykgZ2xvYmFsIGZsb2F0IDAuMDAwMDAwZSswMAorCiBfX2RldmljZV9fIHZvaWQgZm9vKCkgewogICAvLyBDSEVDSzogbG9hZCBpMzIqIGFkZHJzcGFjZWNhc3QgKGkzMiBhZGRyc3BhY2UoMSkqIEBpIHRvIGkzMiopCiAgIGkrKzsKQEAgLTIyLDE1ICszNyw2NiBAQAogICBrKys7CiAKICAgc3RhdGljIGludCBsaTsKLSAgLy8gQ0hFQ0s6IGxvYWQgaTMyIGFkZHJzcGFjZSgxKSogQF9aWjNmb292RTJsaQorICAvLyBDSEVDSzogbG9hZCBpMzIqIGFkZHJzcGFjZWNhc3QgKGkzMiBhZGRyc3BhY2UoMSkqIEBfWlozZm9vdkUybGkgdG8gaTMyKikKICAgbGkrKzsKIAogICBfX2NvbnN0YW50X18gaW50IGxqOwotICAvLyBDSEVDSzogbG9hZCBpMzIgYWRkcnNwYWNlKDQpKiBAX1paM2Zvb3ZFMmxqCisgIC8vIENIRUNLOiBsb2FkIGkzMiogYWRkcnNwYWNlY2FzdCAoaTMyIGFkZHJzcGFjZSg0KSogQF9aWjNmb292RTJsaiB0byBpMzIqKQogICBsaisrOwogCiAgIF9fc2hhcmVkX18gaW50IGxrOwotICAvLyBDSEVDSzogbG9hZCBpMzIgYWRkcnNwYWNlKDMpKiBAX1paM2Zvb3ZFMmxrCisgIC8vIENIRUNLOiBsb2FkIGkzMiogYWRkcnNwYWNlY2FzdCAoaTMyIGFkZHJzcGFjZSgzKSogQF9aWjNmb292RTJsayB0byBpMzIqKQogICBsaysrOwogfQogCitfX2RldmljZV9fIHZvaWQgZnVuYzAoKSB7CisgIF9fc2hhcmVkX18gTXlTdHJ1Y3QgYTsKKyAgTXlTdHJ1Y3QgKmFwID0gJmE7IC8vIGNvbXBvc2l0ZSB0eXBlCisgIGFwLT5kYXRhMSA9IDE7CisgIGFwLT5kYXRhMiA9IDI7Cit9CisvLyBDSEVDSzogZGVmaW5lIHZvaWQgQF9aNWZ1bmMwdigpCisvLyBDSEVDSzogc3RvcmUgJXN0cnVjdC5NeVN0cnVjdCogYWRkcnNwYWNlY2FzdCAoJXN0cnVjdC5NeVN0cnVjdCBhZGRyc3BhY2UoMykqIEBfWlo1ZnVuYzB2RTFhIHRvICVzdHJ1Y3QuTXlTdHJ1Y3QqKSwgJXN0cnVjdC5NeVN0cnVjdCoqICVhcAorCitfX2RldmljZV9fIHZvaWQgY2FsbGVlKGZsb2F0ICphcCkgeworICAqYXAgPSAxLjBmOworfQorCitfX2RldmljZV9fIHZvaWQgZnVuYzEoKSB7CisgIF9fc2hhcmVkX18gZmxvYXQgYTsKKyAgY2FsbGVlKCZhKTsgLy8gaW1wbGljaXQgY2FzdCBmcm9tIHBhcmFtZXRlcnMKK30KKy8vIENIRUNLOiBkZWZpbmUgdm9pZCBAX1o1ZnVuYzF2KCkKKy8vIENIRUNLOiBjYWxsIHZvaWQgQF9aNmNhbGxlZVBmKGZsb2F0KiBhZGRyc3BhY2VjYXN0IChmbG9hdCBhZGRyc3BhY2UoMykqIEBfWlo1ZnVuYzF2RTFhIHRvIGZsb2F0KikpCisKK19fZGV2aWNlX18gdm9pZCBmdW5jMigpIHsKKyAgX19zaGFyZWRfXyBmbG9hdCBhWzI1Nl07CisgIGZsb2F0ICphcCA9ICZhWzEyOF07IC8vIGltcGxpY2l0IGNhc3QgZnJvbSBhIGRlY2F5ZWQgYXJyYXkKKyAgKmFwID0gMS4wZjsKK30KKy8vIENIRUNLOiBkZWZpbmUgdm9pZCBAX1o1ZnVuYzJ2KCkKKy8vIENIRUNLOiBzdG9yZSBmbG9hdCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzI1NiB4IGZsb2F0XSogYWRkcnNwYWNlY2FzdCAoWzI1NiB4IGZsb2F0XSBhZGRyc3BhY2UoMykqIEBfWlo1ZnVuYzJ2RTFhIHRvIFsyNTYgeCBmbG9hdF0qKSwgaTMyIDAsIGkzMiAxMjgpLCBmbG9hdCoqICVhcAorCitfX2RldmljZV9fIHZvaWQgZnVuYzMoKSB7CisgIF9fc2hhcmVkX18gZmxvYXQgYTsKKyAgZmxvYXQgKmFwID0gcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigmYSk7IC8vIGV4cGxpY2l0IGNhc3QKKyAgKmFwID0gMS4wZjsKK30KKy8vIENIRUNLOiBkZWZpbmUgdm9pZCBAX1o1ZnVuYzN2KCkKKy8vIENIRUNLOiBzdG9yZSBmbG9hdCogYWRkcnNwYWNlY2FzdCAoZmxvYXQgYWRkcnNwYWNlKDMpKiBAX1paNWZ1bmMzdkUxYSB0byBmbG9hdCopLCBmbG9hdCoqICVhcAorCitfX2RldmljZV9fIHZvaWQgZnVuYzQoKSB7CisgIF9fc2hhcmVkX18gZmxvYXQgYTsKKyAgZmxvYXQgKmFwID0gKGZsb2F0ICopJmE7IC8vIGV4cGxpY2l0IGMtc3R5bGUgY2FzdAorICAqYXAgPSAxLjBmOworfQorLy8gQ0hFQ0s6IGRlZmluZSB2b2lkIEBfWjVmdW5jNHYoKQorLy8gQ0hFQ0s6IHN0b3JlIGZsb2F0KiBhZGRyc3BhY2VjYXN0IChmbG9hdCBhZGRyc3BhY2UoMykqIEBfWlo1ZnVuYzR2RTFhIHRvIGZsb2F0KiksIGZsb2F0KiogJWFwCisKK19fc2hhcmVkX18gZmxvYXQgYjsKKworX19kZXZpY2VfXyBmbG9hdCAqZnVuYzUoKSB7CisgIHJldHVybiAmYjsgLy8gaW1wbGljaXQgY2FzdCBmcm9tIGEgcmV0dXJuIHZhbHVlCit9CisvLyBDSEVDSzogZGVmaW5lIGZsb2F0KiBAX1o1ZnVuYzV2KCkKKy8vIENIRUNLOiByZXQgZmxvYXQqIGFkZHJzcGFjZWNhc3QgKGZsb2F0IGFkZHJzcGFjZSgzKSogQGIgdG8gZmxvYXQqKQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1VEQS9maWx0ZXItZGVjbC5jdSBiL3Rlc3QvQ29kZUdlbkNVREEvZmlsdGVyLWRlY2wuY3UKaW5kZXggYjc1ODYzMi4uMDA4ZWFhZSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1VEQS9maWx0ZXItZGVjbC5jdQorKysgYi90ZXN0L0NvZGVHZW5DVURBL2ZpbHRlci1kZWNsLmN1CkBAIC0xLDUgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUhPU1QgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLWZjdWRhLWlzLWRldmljZSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLURFVklDRSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1IT1NUICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gJXMgLW8gLSAtZmN1ZGEtaXMtZGV2aWNlIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stREVWSUNFICVzCiAKICNpbmNsdWRlICIuLi9TZW1hQ1VEQS9jdWRhLmgiCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC8yMDAzLTExLTI3LU11bHRpcGxlSW5oZXJpdGFuY2VUaHVuay5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvMjAwMy0xMS0yNy1NdWx0aXBsZUluaGVyaXRhbmNlVGh1bmsuY3BwCmluZGV4IDNlNTMzOTcuLmE3MGY2ZTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC8yMDAzLTExLTI3LU11bHRpcGxlSW5oZXJpdGFuY2VUaHVuay5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYLzIwMDMtMTEtMjctTXVsdGlwbGVJbmhlcml0YW5jZVRodW5rLmNwcApAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0KKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAlcyAtbyAtCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlbXNfYWJpX3RyaXBsZSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAlcyAtbyAtCiAKIAogc3RydWN0IENhbGxTaXRlIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC8yMDA0LTAzLTA4LVJlaW50ZXJwcmV0Q2FzdENvcHkuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYLzIwMDQtMDMtMDgtUmVpbnRlcnByZXRDYXN0Q29weS5jcHAKaW5kZXggYTZlMmUzMC4uYTQ0MTFmYyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYLzIwMDQtMDMtMDgtUmVpbnRlcnByZXRDYXN0Q29weS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYLzIwMDQtMDMtMDgtUmVpbnRlcnByZXRDYXN0Q29weS5jcHAKQEAgLTEsNCArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gJXMgLW8gLQorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJW1zX2FiaV90cmlwbGUgLWZuby1ydHRpIC1lbWl0LWxsdm0gJXMgLW8gLQogCiBzdHJ1Y3QgQSB7CiAgIHZpcnR1YWwgdm9pZCBNZXRob2QoKSA9IDA7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvMjAwNC0wMy0wOS1Vbm1hbmdsZWRCdWlsdGluTWV0aG9kcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvMjAwNC0wMy0wOS1Vbm1hbmdsZWRCdWlsdGluTWV0aG9kcy5jcHAKaW5kZXggNWQ4YzhiMC4uMDNjNGVkNiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYLzIwMDQtMDMtMDktVW5tYW5nbGVkQnVpbHRpbk1ldGhvZHMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC8yMDA0LTAzLTA5LVVubWFuZ2xlZEJ1aWx0aW5NZXRob2RzLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIC8vIENIRUNLOiBfWk4xMUFjY2Vzc0ZsYWdzNnN0cmxlbkV2CiBzdHJ1Y3QgQWNjZXNzRmxhZ3MgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYLzIwMDYtMDktMTItT3BhcXVlU3RydWN0Q3Jhc2guY3BwIGIvdGVzdC9Db2RlR2VuQ1hYLzIwMDYtMDktMTItT3BhcXVlU3RydWN0Q3Jhc2guY3BwCmluZGV4IGJkMjcwZGQuLmM1YTJkNWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC8yMDA2LTA5LTEyLU9wYXF1ZVN0cnVjdENyYXNoLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvMjAwNi0wOS0xMi1PcGFxdWVTdHJ1Y3RDcmFzaC5jcHAKQEAgLTEsNCArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAtICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJW1zX2FiaV90cmlwbGUgLWZuby1ydHRpIC1lbWl0LWxsdm0gLW8gLSAlcwogCiBzdHJ1Y3QgQSB7CiAgICB2aXJ0dWFsIH5BKCk7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvMjAxMC0wNS0xMS1hbHdheXNpbmxpbmVpbnN0YW50aWF0aW9uLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC8yMDEwLTA1LTExLWFsd2F5c2lubGluZWluc3RhbnRpYXRpb24uY3BwCmluZGV4IGZlMDc0MGIuLmJmMDBjMGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC8yMDEwLTA1LTExLWFsd2F5c2lubGluZWluc3RhbnRpYXRpb24uY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC8yMDEwLTA1LTExLWFsd2F5c2lubGluZWluc3RhbnRpYXRpb24uY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0stTk9UOiBaTjEyYmFzaWNfc3RyaW5nSWNFQzFFdgogLy8gQ0hFQ0s6IFpOMTJiYXNpY19zdHJpbmdJY0VEMUV2CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvUFI1MDUwLWNvbnN0cnVjdG9yLWNvbnZlcnNpb24uY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL1BSNTA1MC1jb25zdHJ1Y3Rvci1jb252ZXJzaW9uLmNwcAppbmRleCBhMWIwNWViLi5jZTZjYzBlIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvUFI1MDUwLWNvbnN0cnVjdG9yLWNvbnZlcnNpb24uY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9QUjUwNTAtY29uc3RydWN0b3ItY29udmVyc2lvbi5jcHAKQEAgLTEsOCArMSw3IEBACi0vLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0LHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1TICVzIC1vICV0LTY0LnMKLS8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFA2NCAtLWlucHV0LWZpbGU9JXQtNjQucyAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtUyAlcyAtbyAldC0zMi5zCi0vLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQMzIgLS1pbnB1dC1maWxlPSV0LTMyLnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcwogCiBzdHJ1Y3QgQSB7IEEoY29uc3QgQSYsIGludCBpMSA9IDEpOyB9OwogCkBAIC0xMiw4ICsxMSw0IEBACiAgIHJldHVybiBiOwogfQogCi0vLyBDSEVDSy1MUDY0OiBjYWxscSAgICBfX1pOMUFDMUVSS1NfaQotCi0vLyBDSEVDSy1MUDMyOiBjYWxsbCAgICAgTF9fWk4xQUMxRVJLU19pCi0KLQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMUFDMUVSS1NfaQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL1BSNTA5My1zdGF0aWMtbWVtYmVyLWZ1bmN0aW9uLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9QUjUwOTMtc3RhdGljLW1lbWJlci1mdW5jdGlvbi5jcHAKaW5kZXggY2VhYjg1Mi4uZDYxYTg3YSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL1BSNTA5My1zdGF0aWMtbWVtYmVyLWZ1bmN0aW9uLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvUFI1MDkzLXN0YXRpYy1tZW1iZXItZnVuY3Rpb24uY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIHN0cnVjdCBhIHsKICAgc3RhdGljIHZvaWQgZigpOwogfTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9QUjU4NjMtdW5yZWFjaGFibGUtYmxvY2suY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL1BSNTg2My11bnJlYWNoYWJsZS1ibG9jay5jcHAKaW5kZXggM2YzMmQ3NS4uNTBkMTczMSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL1BSNTg2My11bnJlYWNoYWJsZS1ibG9jay5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL1BSNTg2My11bnJlYWNoYWJsZS1ibG9jay5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgLWVtaXQtbGx2bS1vbmx5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1mY3h4LWV4Y2VwdGlvbnMgLWZleGNlcHRpb25zIC1lbWl0LWxsdm0tb25seSAlcwogCiAvLyBQUjU4NjMKIGNsYXNzIEUgeyB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2FhcmNoNjQtbWFuZ2xlLW5lb24tdmVjdG9ycy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvYWFyY2g2NC1tYW5nbGUtbmVvbi12ZWN0b3JzLmNwcAppbmRleCAyNTE0NzA0Li5lNTQ5NzVkIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvYWFyY2g2NC1tYW5nbGUtbmVvbi12ZWN0b3JzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvYWFyY2g2NC1tYW5nbGUtbmVvbi12ZWN0b3JzLmNwcApAQCAtNSw4ICs1LDggQEAKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7CiB0eXBlZGVmIHNpZ25lZCBjaGFyIGludDhfdDsKIHR5cGVkZWYgc2lnbmVkIHNob3J0IGludDE2X3Q7Ci10eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OwordHlwZWRlZiBzaWduZWQgbG9uZyBpbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQ2NF90OwogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHBvbHk4X3Q7CiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHBvbHkxNl90OwogdHlwZWRlZiBfX2ZwMTYgZmxvYXQxNl90OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2Fic3RyYWN0LWNsYXNzLWN0b3JzLWR0b3JzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9hYnN0cmFjdC1jbGFzcy1jdG9ycy1kdG9ycy5jcHAKaW5kZXggNzkzYmJkZS4uZjM2OTIyNCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2Fic3RyYWN0LWNsYXNzLWN0b3JzLWR0b3JzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvYWJzdHJhY3QtY2xhc3MtY3RvcnMtZHRvcnMuY3BwCkBAIC03LDEwICs3LDEwIEBACiAgIH5BKCk7CiB9OwogCi0vLyBDSEVDSy1OT1QtTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQUMxRXYKKy8vIENIRUNLLU5PVDogZGVmaW5lIHZvaWQgQF9aTjFBQzFFdgogLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQUMyRXYKLS8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUFEMUV2CiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFBRDJFdgorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQUQxRXYKIEE6OkEoKSB7IH0KIAogQTo6fkEoKSB7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9hZGRyZXNzLW9mLWZudGVtcGxhdGUuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2FkZHJlc3Mtb2YtZm50ZW1wbGF0ZS5jcHAKaW5kZXggNzE3OTQ1Mi4uNGZmNTk3YSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2FkZHJlc3Mtb2YtZm50ZW1wbGF0ZS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2FkZHJlc3Mtb2YtZm50ZW1wbGF0ZS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSB8IEZpbGVDaGVjayAlcwogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgZihUKSB7fQogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgZigpIHsgfQogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvYXJtLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9hcm0uY3BwCmluZGV4IDJmYjljNDkuLjI3OTAxOTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9hcm0uY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9hcm0uY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC10cmlwbGU9dGh1bWJ2Ny1hcHBsZS1pb3MzLjAgLWZuby11c2UtY3hhLWF0ZXhpdCAtdGFyZ2V0LWFiaSBhcGNzLWdudSAtZW1pdC1sbHZtIC1vIC0gLWZleGNlcHRpb25zIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZT10aHVtYnY3LWFwcGxlLWlvczYuMCAtZm5vLXVzZS1jeGEtYXRleGl0IC10YXJnZXQtYWJpIGFwY3MtZ251IC1lbWl0LWxsdm0gLW8gLSAtZmV4Y2VwdGlvbnMgfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0s6IEBfWlpONXRlc3Q3NHRlc3RFdkUxeCA9IGludGVybmFsIGdsb2JhbCBpMzIgMCwgYWxpZ24gNAogLy8gQ0hFQ0s6IEBfWkdWWk41dGVzdDc0dGVzdEV2RTF4ID0gaW50ZXJuYWwgZ2xvYmFsIGkzMiAwCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvYXJtNjQtY29uc3RydWN0b3ItcmV0dXJuLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9hcm02NC1jb25zdHJ1Y3Rvci1yZXR1cm4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNWIzYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW5DWFgvYXJtNjQtY29uc3RydWN0b3ItcmV0dXJuLmNwcApAQCAtMCwwICsxLDE5IEBACisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZT1hcm02NC1hcHBsZS1pb3M3LjAuMCAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIHJkYXI6Ly8xMjE2MjkwNQorCitzdHJ1Y3QgUyB7CisgIFMoKTsKKyAgaW50IGlGaWVsZDsKK307CisKK1M6OlMoKSB7CisgIGlGaWVsZCA9IDE7Cit9OworCisvLyBDSEVDSzogJXN0cnVjdC5TKiBAX1pOMVNDMkV2KCVzdHJ1Y3QuUyogcmV0dXJuZWQgJXRoaXMpCisKKy8vIENIRUNLOiAlc3RydWN0LlMqIEBfWk4xU0MxRXYoJXN0cnVjdC5TKiByZXR1cm5lZCAldGhpcykKKy8vIENIRUNLOiBbW1RISVNBRERSOiVbYS16QS16MC05Ll0rXV0gPSBhbGxvY2EgJXN0cnVjdC5TKgorLy8gQ0hFQ0s6IHN0b3JlICVzdHJ1Y3QuUyogJXRoaXMsICVzdHJ1Y3QuUyoqIFtbVEhJU0FERFJdXQorLy8gQ0hFQ0s6IFtbVEhJUzE6JS4qXV0gPSBsb2FkICVzdHJ1Y3QuUyoqIFtbVEhJU0FERFJdXQorLy8gQ0hFQ0s6IHJldCAlc3RydWN0LlMqIFtbVEhJUzFdXQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2FybTY0LWRhcndpbnBjcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvYXJtNjQtZGFyd2lucGNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTBlYzNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2FybTY0LWRhcndpbnBjcy5jcHAKQEAgLTAsMCArMSwxNSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtbGludXgtZ251IC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtbGludXgtZ251IC1lbWl0LWxsdm0gLW8gLSAlcyAtdGFyZ2V0LWFiaSBkYXJ3aW5wY3MgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stREFSV0lOCisKK3ZvaWQgdGVzdF9leHRlbnNpb25zKGJvb2wgYSwgY2hhciBiLCBzaG9ydCBjKSB7fQorLy8gQ0hFQ0s6IGRlZmluZSB2b2lkIEBfWjE1dGVzdF9leHRlbnNpb25zYmNzKGkxICVhLCBpOCAlYiwgaTE2ICVjKQorLy8gQ0hFQ0stREFSV0lOOiBkZWZpbmUgdm9pZCBAX1oxNXRlc3RfZXh0ZW5zaW9uc2JjcyhpMSB6ZXJvZXh0ICVhLCBpOCBzaWduZXh0ICViLCBpMTYgc2lnbmV4dCAlYykKKworc3RydWN0IEVtcHR5IHt9Owordm9pZCB0ZXN0X2VtcHR5KEVtcHR5IGUpIHt9CisvLyBDSEVDSzogZGVmaW5lIHZvaWQgQF9aMTB0ZXN0X2VtcHR5NUVtcHR5KGk4CisvLyBDSEVDSy1EQVJXSU46IGRlZmluZSB2b2lkIEBfWjEwdGVzdF9lbXB0eTVFbXB0eSgpCisKK3N0cnVjdCBIRkEgeworICBmbG9hdCBhWzNdOworfTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9hcm02NC1lbXB0eS1zdHJ1Y3QuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2FybTY0LWVtcHR5LXN0cnVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhNGU5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9hcm02NC1lbXB0eS1zdHJ1Y3QuY3BwCkBAIC0wLDAgKzEsMjcgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvcyAtdGFyZ2V0LWFiaSBkYXJ3aW5wY3MgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCitzdHJ1Y3QgRW1wdHkge307CisKK0VtcHR5IGVtcHR5dmFyOworCitpbnQgdGFrZV9hcmdzKGludCBhLCAuLi4pIHsKKyAgX19idWlsdGluX3ZhX2xpc3QgbDsKKyAgX19idWlsdGluX3ZhX3N0YXJ0KGwsIGEpOworLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAbGx2bS52YV9zdGFydAorCisgIGVtcHR5dmFyID0gX19idWlsdGluX3ZhX2FyZyhsLCBFbXB0eSk7CisvLyBDSEVDSzogbG9hZCBpOCoqCisvLyBDSEVDSy1OT1Q6IGdldGVsZW1lbnRwdHIKKy8vIENIRUNLOiBbW0VNUFRZX1BUUjolW2EtekEtWjAtOS5fXStdXSA9IGJpdGNhc3QgaTgqIHt7JVthLXpBLVowLTkuX10rfX0gdG8gJXN0cnVjdC5FbXB0eSoKKworICAvLyBJdCdzIGNvbmNlaXZhYmxlIHRoYXQgRU1QVFlfUFRSIG1heSBub3QgYWN0dWFsbHkgYmUgYSB2YWxpZCBwb2ludGVyCisgIC8vIChlLmcuIGl0J3MgYXQgdGhlIHZlcnkgYm90dG9tIG9mIHRoZSBzdGFjayBhbmQgdGhlIG5leHQgcGFnZSBpcworICAvLyBpbnZhbGlkKS4gVGhpcyBkb2Vzbid0IG1hdHRlciBwcm92aWRlZCBpdCdzIG5ldmVyIGxvYWRlZCAodGhlcmUncyBubworICAvLyB3ZWxsLWRlZmluZWQgd2F5IHRvIHRlbGwpLCBidXQgaXQgYmVjb21lcyBhIHByb2JsZW0gaWYgd2UgZG8gdHJ5IHRvIHVzZSBpdC4KKy8vIENIRUNLLU5PVDogbG9hZCAlc3RydWN0LkVtcHR5KiBbW0VNUFRZX1BUUl1dCisKKyAgaW50IGkgPSBfX2J1aWx0aW5fdmFfYXJnKGwsIGludCk7CisvLyBDSEVDSzogdmFfYXJnIGk4Kioge3slW2EtekEtWjAtOS5fXSt9fSwgaTMyCisKKyAgX19idWlsdGluX3ZhX2VuZChsKTsKKyAgcmV0dXJuIGk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvYXJtNjQuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2FybTY0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGQ0ZjRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2FybTY0LmNwcApAQCAtMCwwICsxLDg4IEBACisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZT1hcm02NC1hcHBsZS1pb3MgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZT1hcm02NC1hcHBsZS1pb3MgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stR0xPQkFMUyAlcworCisvLyBfX2N4YV9ndWFyZF9hY3F1aXJlIGFyZ3VtZW50IGlzIDY0LWJpdAorLy8gcmRhcjovLzExNTQwMTIyCitzdHJ1Y3QgQSB7CisgIEEoKTsKK307CisKK3ZvaWQgZigpIHsKKyAgLy8gQ0hFQ0s6IGNhbGwgaTMyIEBfX2N4YV9ndWFyZF9hY3F1aXJlKGk2NCoKKyAgc3RhdGljIEEgYTsKK30KKworLy8gQVJNNjQgdXNlcyB0aGUgQysrMTEgZGVmaW5pdGlvbiBvZiBQT0QuCisvLyByZGFyOi8vMTI2NTA1MTQKK25hbWVzcGFjZSB0ZXN0MSB7CisgIC8vIFRoaXMgY2xhc3MgaXMgUE9EIGluIEMrKzExIGFuZCBjYW5ub3QgaGF2ZSBvYmplY3RzIGFsbG9jYXRlZCBpbgorICAvLyBpdHMgdGFpbC1wYWRkaW5nLgorICBzdHJ1Y3QgQUJhc2Uge307CisgIHN0cnVjdCBBIDogQUJhc2UgeworICAgIGludCB4OworICAgIGNoYXIgYzsKKyAgfTsKKworICBzdHJ1Y3QgQiA6IEEgeworICAgIGNoYXIgZDsKKyAgfTsKKworICBpbnQgdGVzdCgpIHsKKyAgICByZXR1cm4gc2l6ZW9mKEIpOworICB9CisgIC8vIENIRUNLOiBkZWZpbmUgaTMyIEBfWk41dGVzdDE0dGVzdEV2KCkKKyAgLy8gQ0hFQ0s6IHJldCBpMzIgMTIKK30KKworbmFtZXNwYWNlIHN0ZCB7CisgIGNsYXNzIHR5cGVfaW5mbzsKK30KKworLy8gQVJNNjQgdXNlcyBzdHJpbmcgY29tcGFyaXNvbnMgZm9yIHdoYXQgd291bGQgb3RoZXJ3aXNlIGJlCisvLyBkZWZhdWx0LXZpc2liaWxpdHkgd2VhayBSVFRJLiAgcmRhcjovLzEyNjUwNTY4CituYW1lc3BhY2UgdGVzdDIgeworICBzdHJ1Y3QgQSB7CisgICAgdmlydHVhbCB2b2lkIGZvbygpOworICB9OworICB2b2lkIEE6OmZvbygpIHt9CisgIC8vIFRlc3RlZCBiZWxvdyBiZWNhdXNlIHRoZXNlIGdsb2JhbHMgZ2V0IGtpbmRvZiBvZGRseSByZWFycmFuZ2VkLgorCisgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpIEIge307CisgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvICZiMCA9IHR5cGVpZChCKTsKKyAgLy8gQ0hFQ0stR0xPQkFMUzogQF9aVFNONXRlc3QyMUJFID0gbGlua29uY2Vfb2RyIGhpZGRlbiBjb25zdGFudAorICAvLyBDSEVDSy1HTE9CQUxTOiBAX1pUSU41dGVzdDIxQkUgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50IHsge3suKn19LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzExIHggaThdKiBAX1pUU041dGVzdDIxQkUsIGkzMiAwLCBpMzIgMCkgfQorCisgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvICZiMSA9IHR5cGVpZChCKik7CisgIC8vIENIRUNLLUdMT0JBTFM6IEBfWlRTUE41dGVzdDIxQkUgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50CisgIC8vIENIRUNLLUdMT0JBTFM6IEBfWlRJUE41dGVzdDIxQkUgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50IHsge3suKn19LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEyIHggaThdKiBAX1pUU1BONXRlc3QyMUJFLCBpMzIgMCwgaTMyIDApLCBpMzIgMCwgaTgqIGJpdGNhc3QKKworICBzdHJ1Y3QgQyB7fTsKKyAgY29uc3Qgc3RkOjp0eXBlX2luZm8gJmMwID0gdHlwZWlkKEMpOworICAvLyBDSEVDSy1HTE9CQUxTOiBAX1pUU041dGVzdDIxQ0UgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50CisgIC8vIENIRUNLLUdMT0JBTFM6IEBfWlRJTjV0ZXN0MjFDRSA9IGxpbmtvbmNlX29kciBoaWRkZW4gY29uc3RhbnQgeyB7ey4qfX0sIGk4KiBpbnR0b3B0ciAoaTY0IGFkZCAoaTY0IHB0cnRvaW50IChbMTEgeCBpOF0qIEBfWlRTTjV0ZXN0MjFDRSB0byBpNjQpLCBpNjQgLTkyMjMzNzIwMzY4NTQ3NzU4MDgpIHRvIGk4KikgfQorCisgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvICZjMSA9IHR5cGVpZChDKik7CisgIC8vIENIRUNLLUdMT0JBTFM6IEBfWlRTUE41dGVzdDIxQ0UgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50CisgIC8vIENIRUNLLUdMT0JBTFM6IEBfWlRJUE41dGVzdDIxQ0UgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50IHsge3suKn19LCBpOCogaW50dG9wdHIgKGk2NCBhZGQgKGk2NCBwdHJ0b2ludCAoWzEyIHggaThdKiBAX1pUU1BONXRlc3QyMUNFIHRvIGk2NCksIGk2NCAtOTIyMzM3MjAzNjg1NDc3NTgwOCkgdG8gaTgqKSwgaTMyIDAsIGk4KiBiaXRjYXN0CisKKyAgLy8gVGhpcyBjbGFzcyBpcyBleHBsaWNpdGx5LWluc3RhbnRpYXRlZCwgYnV0IHRoYXQgaW5zdGFudGlhdGlvbgorICAvLyBkb2Vzbid0IGd1YXJhbnRlZSB0byBlbWl0IFJUVEksIHNvIHdlIGNhbiBzdGlsbCBkZW1vdGUgdGhlIHZpc2liaWxpdHkuCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBEIHt9OworICB0ZW1wbGF0ZSBjbGFzcyBEPGludD47CisgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvICZkMCA9IHR5cGVpZChEPGludD4pOworICAvLyBDSEVDSy1HTE9CQUxTOiBAX1pUU041dGVzdDIxRElpRUUgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50CisgIC8vIENIRUNLLUdMT0JBTFM6IEBfWlRJTjV0ZXN0MjFESWlFRSA9IGxpbmtvbmNlX29kciBoaWRkZW4gY29uc3RhbnQgeyB7ey4qfX0sIGk4KiBpbnR0b3B0ciAoaTY0IGFkZCAoaTY0IHB0cnRvaW50IChbMTQgeCBpOF0qIEBfWlRTTjV0ZXN0MjFESWlFRSB0byBpNjQpLCBpNjQgLTkyMjMzNzIwMzY4NTQ3NzU4MDgpIHRvIGk4KikgfQorCisgIC8vIFRoaXMgY2xhc3MgaXMgZXhwbGljaXRseS1pbnN0YW50aWF0ZWQgYW5kICpkb2VzKiBndWFyYW50ZWUgdG8KKyAgLy8gZW1pdCBSVFRJLCBzbyB3ZSdyZSBzdHVjayB3aXRoIGhhdmluZyB0byB1c2UgZGVmYXVsdCB2aXNpYmlsaXR5LgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgRSB7CisgICAgdmlydHVhbCB2b2lkIGZvbygpIHt9CisgIH07CisgIHRlbXBsYXRlIGNsYXNzIEU8aW50PjsKKyAgLy8gQ0hFQ0stR0xPQkFMUzogQF9aVFNONXRlc3QyMUVJaUVFID0gd2Vha19vZHIgY29uc3RhbnQgWzE0IHggaThdCisgIC8vIENIRUNLLUdMT0JBTFM6IEBfWlRJTjV0ZXN0MjFFSWlFRSA9IHdlYWtfb2RyIGNvbnN0YW50IHsge3suKn19LCBpOCogaW50dG9wdHIgKGk2NCBhZGQgKGk2NCBwdHJ0b2ludCAoWzE0IHggaThdKiBAX1pUU041dGVzdDIxRUlpRUUgdG8gaTY0KSwgaTY0IC05MjIzMzcyMDM2ODU0Nzc1ODA4KSB0byBpOCopIH0KKworICAvLyBDSEVDSy1HTE9CQUxTOiBAX1pUU041dGVzdDIxQUUgPSBjb25zdGFudCBbMTEgeCBpOF0KKyAgLy8gQ0hFQ0stR0xPQkFMUzogQF9aVElONXRlc3QyMUFFID0gY29uc3RhbnQgeyB7ey4qfX0sIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTEgeCBpOF0qIEBfWlRTTjV0ZXN0MjFBRSwgaTMyIDAsIGkzMiAwKSB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9hcnJheS1jb25zdHJ1Y3Rpb24uY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2FycmF5LWNvbnN0cnVjdGlvbi5jcHAKaW5kZXggNjQ1YWQxZC4uNTNiODFmMiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2FycmF5LWNvbnN0cnVjdGlvbi5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2FycmF5LWNvbnN0cnVjdGlvbi5jcHAKQEAgLTEsOCArMSw3IEBACi0vLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0LHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1TICVzIC1vICV0LTY0LnMKLS8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFA2NCAtLWlucHV0LWZpbGU9JXQtNjQucyAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtUyAlcyAtbyAldC0zMi5zCi0vLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQMzIgLS1pbnB1dC1maWxlPSV0LTMyLnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcwogCiBleHRlcm4gIkMiIGludCBwcmludGYoLi4uKTsKIApAQCAtMzEsNyArMzAsNCBAQAogICAgICAgICAgICAgICBoLCBpLCBqLCBhcnJheVtoXVtpXVtqXS5pLCBhcnJheVtoXVtpXVtqXS5mKTsKIH0KIAotLy8gQ0hFQ0stTFA2NDogY2FsbHEgICAgX19aTjR4cHRvQzFFdgotCi0vLyBDSEVDSy1MUDMyOiBjYWxsbCAgICAgTF9fWk40eHB0b0MxRXYKLQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pONHhwdG9DMUV2CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvYXJyYXktb3BlcmF0b3ItZGVsZXRlLWNhbGwuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2FycmF5LW9wZXJhdG9yLWRlbGV0ZS1jYWxsLmNwcAppbmRleCA4ZDZmNTBmLi44OTBiMTQyIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvYXJyYXktb3BlcmF0b3ItZGVsZXRlLWNhbGwuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9hcnJheS1vcGVyYXRvci1kZWxldGUtY2FsbC5jcHAKQEAgLTEsOCArMSw3IEBACi0vLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0LHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1TICVzIC1vICV0LTY0LnMKLS8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFA2NCAtLWlucHV0LWZpbGU9JXQtNjQucyAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtUyAlcyAtbyAldC0zMi5zCi0vLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQMzIgLS1pbnB1dC1maWxlPSV0LTMyLnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcwogCiBleHRlcm4gIkMiIGludCBwcmludGYoLi4uKTsKIApAQCAtNTgsNyArNTcsNSBAQAogfQogQ09TVCBjMjsKIAotLy8gQ0hFQ0stTFA2NDogY2FsbHEgICAgX19aZGFQdgotCi0vLyBDSEVDSy1MUDMyOiBjYWxsbCAgICAgTF9fWmRhUHYKKy8vIENIRUNLOiBjYWxsIHZvaWQgQF9aZGFQdgogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvYXR0ci1jbGVhbnVwLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9hdHRyLWNsZWFudXAuY3BwCmluZGV4IGZmMTViMDMuLjE4YTc3OTggMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9hdHRyLWNsZWFudXAuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9hdHRyLWNsZWFudXAuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAogbmFtZXNwYWNlIE4gewogICB2b2lkIGZyZWUodm9pZCAqaSkge30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9hdHRyLXVzZWQuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2F0dHItdXNlZC5jcHAKaW5kZXggMmM4MjE4NC4uODZkZDZiOSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2F0dHItdXNlZC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2F0dHItdXNlZC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiAvLyA8cmRhcjovL3Byb2JsZW0vODY4NDM2Mz46IGNsYW5nKysgbm90IHJlc3BlY3RpbmcgX19hdHRyaWJ1dGVfXygodXNlZCkpIG9uIGRlc3RydWN0b3JzCiBzdHJ1Y3QgWDAgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2JpdGZpZWxkLWxheW91dC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvYml0ZmllbGQtbGF5b3V0LmNwcAppbmRleCA2NDYzMDBhLi40NmY0MTExIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvYml0ZmllbGQtbGF5b3V0LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvYml0ZmllbGQtbGF5b3V0LmNwcApAQCAtMTIsNyArMTIsNyBAQAogICBpbnQgOiA2OwogfSB0MjsKIAotLy8gQ0hFQ0stTFA2NDogJXVuaW9uLlRlc3QzID0gdHlwZSB7IFsyIHggaThdIH0KKy8vIENIRUNLLUxQNjQ6ICV1bmlvbi5UZXN0MyA9IHR5cGUgeyBpMTYgfQogdW5pb24gVGVzdDMgewogICBpbnQgOiA5OwogfSB0MzsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9iaXRmaWVsZC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvYml0ZmllbGQuY3BwCmluZGV4IDJjNDU0YjAuLmZhZmVmZmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9iaXRmaWVsZC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2JpdGZpZWxkLmNwcApAQCAtMjk4LDcgKzI5OCw3IEBACiAjZW5kaWYKICAgdW5zaWduZWQgcmVhZChCYXNlKiBzKSB7CiAgICAgLy8gRklYTUU6IFdlIHNob3VsZCB3aWRlbiB0aGlzIGxvYWQgYXMgbG9uZyBhcyB0aGUgZnVuY3Rpb24gaXNuJ3QgYmVpbmcKLSAgICAvLyBpbnN0cnVtZW50ZWQgYnkgdGhyZWFkLXNhbml0aXplci4KKyAgICAvLyBpbnN0cnVtZW50ZWQgYnkgVGhyZWFkU2FuaXRpemVyLgogICAgIC8vCiAgICAgLy8gQ0hFQ0stWDg2LTY0LUxBQkVMOiBkZWZpbmUgaTMyIEBfWk4yTjQ0cmVhZAogICAgIC8vIENIRUNLLVg4Ni02NDogICAlW1tnZXA6LipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMge3suKn19KiAle3suKn19LCBpMzIgMCwgaTMyIDEKQEAgLTM3OCw4ICszNzgsOCBAQAogICAvLyBaZXJvLWxlbmd0aCBiaXRmaWVsZHMgcGFydGl0aW9uIHRoZSBtZW1vcnkgbG9jYXRpb25zIG9mIGJpdGZpZWxkcyBmb3IgdGhlCiAgIC8vIHB1cnBvc2VzIG9mIHRoZSBtZW1vcnkgbW9kZWwuIFRoYXQgbWVhbnMgc3RvcmVzIG11c3Qgbm90IHNwYW4gemVyby1sZW5ndGgKICAgLy8gYml0ZmllbGRzIGFuZCBsb2FkcyBtYXkgb25seSBzcGFuIHRoZW0gd2hlbiB3ZSBhcmUgbm90IGluc3RydW1lbnRpbmcgd2l0aAotICAvLyB0aHJlYWQgc2FuaXRpemVyLgotICAvLyBGSVhNRTogV2UgY3VycmVudGx5IGRvbid0IHdpZGVuIGxvYWRzIGV2ZW4gd2l0aG91dCB0aHJlYWQgc2FuaXRpemVyLCBldmVuCisgIC8vIFRocmVhZFNhbml0aXplci4KKyAgLy8gRklYTUU6IFdlIGN1cnJlbnRseSBkb24ndCB3aWRlbiBsb2FkcyBldmVuIHdpdGhvdXQgVGhyZWFkU2FuaXRpemVyLCBldmVuCiAgIC8vIHRob3VnaCB3ZSBjb3VsZC4KICAgc3RydWN0IFMgewogICAgIHVuc2lnbmVkIGIxIDogMjQ7CkBAIC00MjYsMyArNDI2LDU1IEBACiAgICAgcy0+YjIgPSB4OwogICB9CiB9CisKK25hbWVzcGFjZSBONyB7CisgIC8vIFNpbWlsYXIgdG8gTjQgZXhjZXB0IHRoYXQgdGhpcyBhZGRzIGEgdmlydHVhbCBiYXNlIHRvIHRoZSBwaWN0dXJlLiAoUFIxODQzMCkKKyAgLy8gRG8gTk9UIHdpZGVuIGxvYWRzIGFuZCBzdG9yZXMgdG8gYml0ZmllbGRzIGludG8gcGFkZGluZyBhdCB0aGUgZW5kIG9mCisgIC8vIGEgY2xhc3Mgd2hpY2ggbWlnaHQgZW5kIHVwIHdpdGggbWVtYmVycyBpbnNpZGUgb2YgaXQgd2hlbiBpbnNpZGUgYSBkZXJpdmVkCisgIC8vIGNsYXNzLgorICBzdHJ1Y3QgQjEgeworICAgIHZpcnR1YWwgdm9pZCBmKCk7CisgICAgdW5zaWduZWQgYjEgOiAyNDsKKyAgfTsKKyAgc3RydWN0IEIyIDogdmlydHVhbCBCMSB7CisgICAgdmlydHVhbCB+QjIoKTsKKyAgICB1bnNpZ25lZCBiIDogMjQ7CisgIH07CisgIC8vIEltYWdpbmUgc29tZSBvdGhlciB0cmFuc2xhdGlvbiB1bml0IGludHJvZHVjZXM6CisjaWYgMAorICBzdHJ1Y3QgRGVyaXZlZCA6IHB1YmxpYyBCMiB7CisgICAgY2hhciBjOworICB9OworI2VuZGlmCisgIHVuc2lnbmVkIHJlYWQoQjIqIHMpIHsKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHdpZGVuIHRoaXMgbG9hZCBhcyBsb25nIGFzIHRoZSBmdW5jdGlvbiBpc24ndCBiZWluZworICAgIC8vIGluc3RydW1lbnRlZCBieSBUaHJlYWRTYW5pdGl6ZXIuCisgICAgLy8KKyAgICAvLyBDSEVDSy1YODYtNjQtTEFCRUw6IGRlZmluZSBpMzIgQF9aTjJONzRyZWFkCisgICAgLy8gQ0hFQ0stWDg2LTY0OiAgICVbW2dlcDouKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyB7ey4qfX0qICV7ey4qfX0sIGkzMiAwLCBpMzIgMQorICAgIC8vIENIRUNLLVg4Ni02NDogICAlW1twdHI6LipdXSA9IGJpdGNhc3QgWzMgeCBpOF0qICVbW2dlcF1dIHRvIGkyNCoKKyAgICAvLyBDSEVDSy1YODYtNjQ6ICAgJVtbdmFsOi4qXV0gPSBsb2FkIGkyNCogJVtbcHRyXV0KKyAgICAvLyBDSEVDSy1YODYtNjQ6ICAgJVtbZXh0Oi4qXV0gPSB6ZXh0IGkyNCAlW1t2YWxdXSB0byBpMzIKKyAgICAvLyBDSEVDSy1YODYtNjQ6ICAgICAgICAgICAgICAgICByZXQgaTMyICVbW2V4dF1dCisgICAgLy8gQ0hFQ0stUFBDNjQtTEFCRUw6IGRlZmluZSB6ZXJvZXh0IGkzMiBAX1pOMk43NHJlYWQKKyAgICAvLyBDSEVDSy1QUEM2NDogICAlW1tnZXA6LipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMge3suKn19KiAle3suKn19LCBpMzIgMCwgaTMyIDEKKyAgICAvLyBDSEVDSy1QUEM2NDogICAlW1twdHI6LipdXSA9IGJpdGNhc3QgWzMgeCBpOF0qICVbW2dlcF1dIHRvIGkyNCoKKyAgICAvLyBDSEVDSy1QUEM2NDogICAlW1t2YWw6LipdXSA9IGxvYWQgaTI0KiAlW1twdHJdXQorICAgIC8vIENIRUNLLVBQQzY0OiAgICVbW2V4dDouKl1dID0gemV4dCBpMjQgJVtbdmFsXV0gdG8gaTMyCisgICAgLy8gQ0hFQ0stUFBDNjQ6ICAgICAgICAgICAgICAgICByZXQgaTMyICVbW2V4dF1dCisgICAgcmV0dXJuIHMtPmI7CisgIH0KKyAgdm9pZCB3cml0ZShCMiogcywgdW5zaWduZWQgeCkgeworICAgIC8vIENIRUNLLVg4Ni02NC1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjJONzV3cml0ZQorICAgIC8vIENIRUNLLVg4Ni02NDogICAlW1tnZXA6LipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMge3suKn19KiAle3suKn19LCBpMzIgMCwgaTMyIDEKKyAgICAvLyBDSEVDSy1YODYtNjQ6ICAgJVtbcHRyOi4qXV0gPSBiaXRjYXN0IFszIHggaThdKiAlW1tnZXBdXSB0byBpMjQqCisgICAgLy8gQ0hFQ0stWDg2LTY0OiAgICVbW25ldzouKl1dID0gdHJ1bmMgaTMyICV7ey4qfX0gdG8gaTI0CisgICAgLy8gQ0hFQ0stWDg2LTY0OiAgICAgICAgICAgICAgICAgc3RvcmUgaTI0ICVbW25ld11dLCBpMjQqICVbW3B0cl1dCisgICAgLy8gQ0hFQ0stUFBDNjQtTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4yTjc1d3JpdGUKKyAgICAvLyBDSEVDSy1QUEM2NDogICAlW1tnZXA6LipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMge3suKn19KiAle3suKn19LCBpMzIgMCwgaTMyIDEKKyAgICAvLyBDSEVDSy1QUEM2NDogICAlW1twdHI6LipdXSA9IGJpdGNhc3QgWzMgeCBpOF0qICVbW2dlcF1dIHRvIGkyNCoKKyAgICAvLyBDSEVDSy1QUEM2NDogICAlW1tuZXc6LipdXSA9IHRydW5jIGkzMiAle3suKn19IHRvIGkyNAorICAgIC8vIENIRUNLLVBQQzY0OiAgICAgICAgICAgICAgICAgc3RvcmUgaTI0ICVbW25ld11dLCBpMjQqICVbW3B0cl1dCisgICAgcy0+YiA9IHg7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9ibG9jay1ieXJlZi1jeHgtb2JqYy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvYmxvY2stYnlyZWYtY3h4LW9iamMuY3BwCmluZGV4IDYxNmZkNjcuLjVjMzVhZDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9ibG9jay1ieXJlZi1jeHgtb2JqYy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2Jsb2NrLWJ5cmVmLWN4eC1vYmpjLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC1vIC0gLWZibG9ja3MgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtbyAtIC1mYmxvY2tzIHwgRmlsZUNoZWNrICVzCiAvLyByZGFyOi8vODU5NDc5MAogCiBzdHJ1Y3QgQSB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvYmxvY2staW4tY3Rvci1kdG9yLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9ibG9jay1pbi1jdG9yLWR0b3IuY3BwCmluZGV4IGJkMzdkNDQuLjBkYzBhYjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9ibG9jay1pbi1jdG9yLWR0b3IuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9ibG9jay1pbi1jdG9yLWR0b3IuY3BwCkBAIC00MCw5ICs0MCw5IEBACiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGludGVybmFsIHZvaWQgQF9fX1pONFpvbmVDMkV2X2Jsb2NrX2ludm9rZV8KIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgaW50ZXJuYWwgdm9pZCBAX19fWk40Wm9uZUQyRXZfYmxvY2tfaW52b2tlCiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGludGVybmFsIHZvaWQgQF9fX1pONFpvbmVEMkV2X2Jsb2NrX2ludm9rZV8KLS8vIENIRUNLLUxBQkVMOiBkZWZpbmUgaW50ZXJuYWwgdm9pZCBAX19fWk4xWEMxRXZfYmxvY2tfaW52b2tlCi0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIGludGVybmFsIHZvaWQgQF9fX1pOMVhDMUV2X2Jsb2NrX2ludm9rZV8KIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgaW50ZXJuYWwgdm9pZCBAX19fWk4xWEMyRXZfYmxvY2tfaW52b2tlCiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGludGVybmFsIHZvaWQgQF9fX1pOMVhDMkV2X2Jsb2NrX2ludm9rZV8KKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgaW50ZXJuYWwgdm9pZCBAX19fWk4xWEMxRXZfYmxvY2tfaW52b2tlCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGludGVybmFsIHZvaWQgQF9fX1pOMVhDMUV2X2Jsb2NrX2ludm9rZV8KIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgaW50ZXJuYWwgdm9pZCBAX19fWk4xWEQyRXZfYmxvY2tfaW52b2tlCiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGludGVybmFsIHZvaWQgQF9fX1pOMVhEMkV2X2Jsb2NrX2ludm9rZV8KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9ibG9jay5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvYmxvY2suY3BwCmluZGV4IDYxOWQ4YjAuLmFhMzU2NjggMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9ibG9jay5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2Jsb2NrLmNwcApAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC1vIC0gLWZibG9ja3MgCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAtZmJsb2NrcyAKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlICVtc19hYmlfdHJpcGxlIC1mbm8tcnR0aSAtZW1pdC1sbHZtIC1vIC0gLWZibG9ja3MgCiAvLyBKdXN0IHRlc3QgdGhhdCB0aGlzIGRvZXNuJ3QgY3Jhc2ggdGhlIGNvbXBpbGVyLi4uCiAKIHZvaWQgZnVuYyh2b2lkKik7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvYy1saW5rYWdlLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9jLWxpbmthZ2UuY3BwCmluZGV4IDE2MDc2MjMuLjJmODcyOWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9jLWxpbmthZ2UuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9jLWxpbmthZ2UuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIC8vIHByNjY0NAogCiBleHRlcm4gIkMiIHsKQEAgLTEwLDcgKzEwLDcgQEAKICAgfQogfQogCi0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFOMVgxZkV2CisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHt7Lip9fXZvaWQgQF9aTjFOMVgxZkV2CiAKIGV4dGVybiAiQyIgewogICBzdGF0aWMgdm9pZCB0ZXN0Ml9mKCkgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2NhbGwtYXJnLXplcm8tdGVtcC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvY2FsbC1hcmctemVyby10ZW1wLmNwcAppbmRleCAxNDIzOGYyLi5iZWVmMmZkIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvY2FsbC1hcmctemVyby10ZW1wLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvY2FsbC1hcmctemVyby10ZW1wLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQseDg2LTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1TICVzIC1vICV0LTY0LnMKIC8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFA2NCAtLWlucHV0LWZpbGU9JXQtNjQucyAlcwogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLVMgJXMgLW8gJXQtMzIucwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2NhcHR1cmVkLXN0YXRlbWVudHMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2NhcHR1cmVkLXN0YXRlbWVudHMuY3BwCmluZGV4IDI4NDNjMmI2Li5mYjM1NDQ2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvY2FwdHVyZWQtc3RhdGVtZW50cy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NhcHR1cmVkLXN0YXRlbWVudHMuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAlcyAtbyAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gJXMgLW8gJXQKIC8vIFJVTjogRmlsZUNoZWNrICVzIC1pbnB1dC1maWxlPSV0IC1jaGVjay1wcmVmaXg9Q0hFQ0stMQogLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWlucHV0LWZpbGU9JXQgLWNoZWNrLXByZWZpeD1DSEVDSy0yCiAvLyBSVU46IEZpbGVDaGVjayAlcyAtaW5wdXQtZmlsZT0ldCAtY2hlY2stcHJlZml4PUNIRUNLLTMKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jYXN0LWNvbnZlcnNpb24uY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2Nhc3QtY29udmVyc2lvbi5jcHAKaW5kZXggNTU2NWY2NS4uY2U4ZjgyMCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2Nhc3QtY29udmVyc2lvbi5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2Nhc3QtY29udmVyc2lvbi5jcHAKQEAgLTEsOCArMSw3IEBACi0vLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0LHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1TICVzIC1vICV0LTY0LnMKLS8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFA2NCAtLWlucHV0LWZpbGU9JXQtNjQucyAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtUyAlcyAtbyAldC0zMi5zCi0vLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQMzIgLS1pbnB1dC1maWxlPSV0LTMyLnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCAgIFwKKy8vIFJVTjogRmlsZUNoZWNrICVzCiAKIHN0cnVjdCBBIHsKICAgQShpbnQpOwpAQCAtMTgsMTYgKzE3LDkgQEAKICAgc3RhdGljX2Nhc3Q8Qj4oMTApOwogfQogCi0vLyBDSEVDSy1MUDY0OiBjYWxscSAgICBfX1pOMUFDMUVpCi0vLyBDSEVDSy1MUDY0OiBjYWxscSAgICBfX1pOMUJDMUUxQQotLy8gQ0hFQ0stTFA2NDogY2FsbHEgICAgX19aTjFBQzFFaQotLy8gQ0hFQ0stTFA2NDogY2FsbHEgICAgX19aTjFCQzFFMUEKLS8vIENIRUNLLUxQNjQ6IGNhbGxxICAgIF9fWk4xQUMxRWkKLS8vIENIRUNLLUxQNjQ6IGNhbGxxICAgIF9fWk4xQkMxRTFBCi0KLS8vIENIRUNLLUxQMzI6IGNhbGxsICAgICBMX19aTjFBQzFFaQotLy8gQ0hFQ0stTFAzMjogY2FsbGwgICAgIExfX1pOMUJDMUUxQQotLy8gQ0hFQ0stTFAzMjogY2FsbGwgICAgIExfX1pOMUFDMUVpCi0vLyBDSEVDSy1MUDMyOiBjYWxsbCAgICAgTF9fWk4xQkMxRTFBCi0vLyBDSEVDSy1MUDMyOiBjYWxsbCAgICAgTF9fWk4xQUMxRWkKLS8vIENIRUNLLUxQMzI6IGNhbGxsICAgICBMX19aTjFCQzFFMUEKKy8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjFBQzFFaQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMUJDMUUxQQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMUFDMUVpCisvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQkMxRTFBCisvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQUMxRWkKKy8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjFCQzFFMUEKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jbGFzcy1sYXlvdXQuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2NsYXNzLWxheW91dC5jcHAKaW5kZXggMjFlMWEyYi4uMWY2MjEyOSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2NsYXNzLWxheW91dC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NsYXNzLWxheW91dC5jcHAKQEAgLTM5LDcgKzM5LDcgQEAKICAgICBjaGFyIGE7CiAgIH07CiAKLSAgLy8gQ0hFQ0s6ICUic3RydWN0LlRlc3Q1OjpCIiA9IHR5cGUgeyBbOSB4IGk4XSwgaTgsIGk4LCBbNSB4IGk4XSB9CisgIC8vIENIRUNLOiAlInN0cnVjdC5UZXN0NTo6QiIgPSB0eXBlIHsgICUic3RydWN0LlRlc3Q1OjpBLmJhc2UiLCBpOCwgaTgsIFs1IHggaThdIH0KICAgc3RydWN0IEIgOiBBIHsKICAgICBjaGFyIGIgOiAxOwogICAgIGNoYXIgYzsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb25zdC1iYXNlLWNhc3QuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0LWJhc2UtY2FzdC5jcHAKaW5kZXggMzIwYzc5MC4uZGQ5ODBkNSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0LWJhc2UtY2FzdC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0LWJhc2UtY2FzdC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBDaGVjayB0aGF0IHRoZSBmb2xsb3dpbmcgY29uc3RydWN0LCB3aGljaCBpcyBzaW1pbGFyIHRvIG9uZSB3aGljaCBvY2N1cnMKIC8vIGluIEZpcmVmb3gsIGlzIGZvbGRlZCBjb3JyZWN0bHkuCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvY29uc3QtZ2xvYmFsLWxpbmthZ2UuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0LWdsb2JhbC1saW5rYWdlLmNwcAppbmRleCBkZjc4ZmRkLi5lMWU5MzIxIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvY29uc3QtZ2xvYmFsLWxpbmthZ2UuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9jb25zdC1nbG9iYWwtbGlua2FnZS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiBjb25zdCBpbnQgeCA9IDEwOwogY29uc3QgaW50IHkgPSAyMDsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb25zdC1pbml0LWN4eDF5LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9jb25zdC1pbml0LWN4eDF5LmNwcAppbmRleCA5NzhjNDI4Li41ZGQxNWEzIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvY29uc3QtaW5pdC1jeHgxeS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0LWluaXQtY3h4MXkuY3BwCkBAIC0xLDQgKzEsNSBAQAotLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtdmVyaWZ5IC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtZW1pdC1sbHZtIC1vIC0gJXMgLXN0ZD1jKysxeSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1lbWl0LWxsdm0gLW8gLSAlcyAtc3RkPWMrKzF5IHwgRmlsZUNoZWNrICVzCisvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwogCiBzdHJ1Y3QgQSB7CiAgIGNvbnN0ZXhwciBBKCkgOiBuKDEpIHt9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvY29uc3RydWN0b3ItYXR0ci5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvY29uc3RydWN0b3ItYXR0ci5jcHAKaW5kZXggNGY2ZDYzNS4uNDY4Y2UzNiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9yLWF0dHIuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci1hdHRyLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIC8vIENIRUNLOiBAbGx2bS5nbG9iYWxfY3RvcnMKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9yLWNvbnZlcnNpb24uY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9yLWNvbnZlcnNpb24uY3BwCmluZGV4IGViYjQxNGQuLmJhY2U1NGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci1jb252ZXJzaW9uLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvY29uc3RydWN0b3ItY29udmVyc2lvbi5jcHAKQEAgLTEsOCArMSw3IEBACi0vLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0LHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1TICVzIC1vICV0LTY0LnMKLS8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFA2NCAtLWlucHV0LWZpbGU9JXQtNjQucyAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtUyAlcyAtbyAldC0zMi5zCi0vLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQMzIgLS1pbnB1dC1maWxlPSV0LTMyLnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcwogCiBleHRlcm4gIkMiIGludCBwcmludGYoLi4uKTsKIApAQCAtNDYsMTAgKzQ1LDYgQEAKICAgZygzKTsgICAgICAgICAgIC8vIGcoWCgzKSkKIH0KIAotLy8gQ0hFQ0stTFA2NDogY2FsbHEgICAgX19aTjFYQzFFaQotLy8gQ0hFQ0stTFA2NDogY2FsbHEgICAgX19aTjFYQzFFUEtjaQotLy8gQ0hFQ0stTFA2NDogY2FsbHEgICAgX19aTjFYQzFFdgotCi0vLyBDSEVDSy1MUDMyOiBjYWxsbCAgICAgTF9fWk4xWEMxRWkKLS8vIENIRUNLLUxQMzI6IGNhbGxsICAgICBMX19aTjFYQzFFUEtjaQotLy8gQ0hFQ0stTFAzMjogY2FsbGwgICAgIExfX1pOMVhDMUV2CisvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xWEMxRWkKKy8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjFYQzFFUEtjaQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMVhDMUV2CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvY29uc3RydWN0b3ItZGVmYXVsdC1hcmcuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9yLWRlZmF1bHQtYXJnLmNwcAppbmRleCBjMmNmNDRjLi45OGE1ODY0IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvY29uc3RydWN0b3ItZGVmYXVsdC1hcmcuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci1kZWZhdWx0LWFyZy5jcHAKQEAgLTEsOCArMSw3IEBACi0vLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0LHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1TICVzIC1vICV0LTY0LnMKLS8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFA2NCAtLWlucHV0LWZpbGU9JXQtNjQucyAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtUyAlcyAtbyAldC0zMi5zCi0vLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQMzIgLS1pbnB1dC1maWxlPSV0LTMyLnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcwogCiBleHRlcm4gIkMiIGludCBwcmludGYoLi4uKTsKIApAQCAtMzEsMTAgKzMwLDYgQEAKICAgWCBkKGEsIDUsIDYpOwogfQogCi0vLyBDSEVDSy1MUDY0OiBjYWxscSBfX1pOMVhDMUVSS1NfaWlpCi0vLyBDSEVDSy1MUDY0OiBjYWxscSBfX1pOMVhDMUVSS1NfaWlpCi0vLyBDSEVDSy1MUDY0OiBjYWxscSBfX1pOMVhDMUVSS1NfaWlpCi0KLS8vIENIRUNLLUxQMzI6IGNhbGxsIExfX1pOMVhDMUVSS1NfaWlpCi0vLyBDSEVDSy1MUDMyOiBjYWxsbCBMX19aTjFYQzFFUktTX2lpaQotLy8gQ0hFQ0stTFAzMjogY2FsbGwgTF9fWk4xWEMxRVJLU19paWkKKy8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjFYQzFFUktTX2lpaQorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMVhDMUVSS1NfaWlpCisvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xWEMxRVJLU19paWkKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci1kZXN0cnVjdG9yLXJldHVybi10aGlzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci1kZXN0cnVjdG9yLXJldHVybi10aGlzLmNwcAppbmRleCBlYTJlYTQ1Li5jZTZkZGQyIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvY29uc3RydWN0b3ItZGVzdHJ1Y3Rvci1yZXR1cm4tdGhpcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9yLWRlc3RydWN0b3ItcmV0dXJuLXRoaXMuY3BwCkBAIC0xLDYgKzEsNyBAQAogLy9SVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtbyAtIC10cmlwbGU9aTY4Ni11bmtub3duLWxpbnV4IHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLR0VOICVzCi0vL1JVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC1vIC0gLXRyaXBsZT10aHVtYnY3LWFwcGxlLWlvczMuMCAtdGFyZ2V0LWFiaSBhcGNzLWdudSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDS0FSTSAlcwotLy9SVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtbyAtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiAtY3h4LWFiaSBtaWNyb3NvZnQgLWZuby1ydHRpIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLTVMgJXMKKy8vUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSAtdHJpcGxlPXRodW1idjctYXBwbGUtaW9zNi4wIC10YXJnZXQtYWJpIGFwY3MtZ251IHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLQVJNICVzCisvL1JVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC1vIC0gLXRyaXBsZT10aHVtYnY3LWFwcGxlLWlvczUuMCAtdGFyZ2V0LWFiaSBhcGNzLWdudSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDS0lPUzUgJXMKKy8vUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSAtdHJpcGxlPWkzODYtcGMtd2luMzIgLWZuby1ydHRpIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLTVMgJXMKIC8vIEZJWE1FOiB0aGVzZSB0ZXN0cyBjcmFzaCBvbiB0aGUgYm90cyB3aGVuIHJ1biB3aXRoIC10cmlwbGU9eDg2XzY0LXBjLXdpbjMyCiAKIC8vIE1ha2Ugc3VyZSB3ZSBhdHRhY2ggdGhlICdyZXR1cm5lZCcgYXR0cmlidXRlIHRvIHRoZSAndGhpcycgcGFyYW1ldGVyIG9mCkBAIC0yNywxNSArMjgsMjAgQEAKIEI6OkIoaW50ICppKSA6IGlfKGkpIHsgfQogQjo6fkIoKSB7IH0KIAotLy8gQ0hFQ0tHRU4tTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQkMxRVBpKCVjbGFzcy5CKiAldGhpcywgaTMyKiAlaSkKIC8vIENIRUNLR0VOLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUJDMkVQaSglY2xhc3MuQiogJXRoaXMsIGkzMiogJWkpCi0vLyBDSEVDS0dFTi1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFCRDFFdiglY2xhc3MuQiogJXRoaXMpCisvLyBDSEVDS0dFTi1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFCQzFFUGkoJWNsYXNzLkIqICV0aGlzLCBpMzIqICVpKQogLy8gQ0hFQ0tHRU4tTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQkQyRXYoJWNsYXNzLkIqICV0aGlzKQorLy8gQ0hFQ0tHRU4tTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQkQxRXYoJWNsYXNzLkIqICV0aGlzKQogCi0vLyBDSEVDS0FSTS1MQUJFTDogZGVmaW5lICVjbGFzcy5CKiBAX1pOMUJDMUVQaSglY2xhc3MuQiogcmV0dXJuZWQgJXRoaXMsIGkzMiogJWkpCiAvLyBDSEVDS0FSTS1MQUJFTDogZGVmaW5lICVjbGFzcy5CKiBAX1pOMUJDMkVQaSglY2xhc3MuQiogcmV0dXJuZWQgJXRoaXMsIGkzMiogJWkpCi0vLyBDSEVDS0FSTS1MQUJFTDogZGVmaW5lICVjbGFzcy5CKiBAX1pOMUJEMUV2KCVjbGFzcy5CKiByZXR1cm5lZCAldGhpcykKKy8vIENIRUNLQVJNLUxBQkVMOiBkZWZpbmUgJWNsYXNzLkIqIEBfWk4xQkMxRVBpKCVjbGFzcy5CKiByZXR1cm5lZCAldGhpcywgaTMyKiAlaSkKIC8vIENIRUNLQVJNLUxBQkVMOiBkZWZpbmUgJWNsYXNzLkIqIEBfWk4xQkQyRXYoJWNsYXNzLkIqIHJldHVybmVkICV0aGlzKQorLy8gQ0hFQ0tBUk0tTEFCRUw6IGRlZmluZSAlY2xhc3MuQiogQF9aTjFCRDFFdiglY2xhc3MuQiogcmV0dXJuZWQgJXRoaXMpCisKKy8vIENIRUNLSU9TNS1MQUJFTDogZGVmaW5lICVjbGFzcy5CKiBAX1pOMUJDMkVQaSglY2xhc3MuQiogJXRoaXMsIGkzMiogJWkpCisvLyBDSEVDS0lPUzUtTEFCRUw6IGRlZmluZSAlY2xhc3MuQiogQF9aTjFCQzFFUGkoJWNsYXNzLkIqICV0aGlzLCBpMzIqICVpKQorLy8gQ0hFQ0tJT1M1LUxBQkVMOiBkZWZpbmUgJWNsYXNzLkIqIEBfWk4xQkQyRXYoJWNsYXNzLkIqICV0aGlzKQorLy8gQ0hFQ0tJT1M1LUxBQkVMOiBkZWZpbmUgJWNsYXNzLkIqIEBfWk4xQkQxRXYoJWNsYXNzLkIqICV0aGlzKQogCiAvLyBDSEVDS01TLUxBQkVMOiBkZWZpbmUgeDg2X3RoaXNjYWxsY2MgJWNsYXNzLkIqIEAiXDAxPz8wQkBAUUFFQFBBSEBaIiglY2xhc3MuQiogcmV0dXJuZWQgJXRoaXMsIGkzMiogJWkpCiAvLyBDSEVDS01TLUxBQkVMOiBkZWZpbmUgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUJAQFFBRUBYWiIoJWNsYXNzLkIqICV0aGlzKQpAQCAtNTEsMTcgKzU3LDIzIEBACiBDOjpDKGludCAqaSwgY2hhciAqYykgOiBCKGkpLCBjXyhjKSB7IH0KIEM6On5DKCkgeyB9CiAKLS8vIENIRUNLR0VOLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUNDMUVQaVBjKCVjbGFzcy5DKiAldGhpcywgaTMyKiAlaSwgaTgqICVjKQogLy8gQ0hFQ0tHRU4tTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQ0MyRVBpUGMoJWNsYXNzLkMqICV0aGlzLCBpMzIqICVpLCBpOCogJWMpCi0vLyBDSEVDS0dFTi1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFDRDBFdiglY2xhc3MuQyogJXRoaXMpCi0vLyBDSEVDS0dFTi1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFDRDFFdiglY2xhc3MuQyogJXRoaXMpCisvLyBDSEVDS0dFTi1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFDQzFFUGlQYyglY2xhc3MuQyogJXRoaXMsIGkzMiogJWksIGk4KiAlYykKIC8vIENIRUNLR0VOLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUNEMkV2KCVjbGFzcy5DKiAldGhpcykKKy8vIENIRUNLR0VOLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUNEMUV2KCVjbGFzcy5DKiAldGhpcykKKy8vIENIRUNLR0VOLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUNEMEV2KCVjbGFzcy5DKiAldGhpcykKIAotLy8gQ0hFQ0tBUk0tTEFCRUw6IGRlZmluZSAlY2xhc3MuQyogQF9aTjFDQzFFUGlQYyglY2xhc3MuQyogcmV0dXJuZWQgJXRoaXMsIGkzMiogJWksIGk4KiAlYykKIC8vIENIRUNLQVJNLUxBQkVMOiBkZWZpbmUgJWNsYXNzLkMqIEBfWk4xQ0MyRVBpUGMoJWNsYXNzLkMqIHJldHVybmVkICV0aGlzLCBpMzIqICVpLCBpOCogJWMpCi0vLyBDSEVDS0FSTS1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFDRDBFdiglY2xhc3MuQyogJXRoaXMpCi0vLyBDSEVDS0FSTS1MQUJFTDogZGVmaW5lICVjbGFzcy5DKiBAX1pOMUNEMUV2KCVjbGFzcy5DKiByZXR1cm5lZCAldGhpcykKKy8vIENIRUNLQVJNLUxBQkVMOiBkZWZpbmUgJWNsYXNzLkMqIEBfWk4xQ0MxRVBpUGMoJWNsYXNzLkMqIHJldHVybmVkICV0aGlzLCBpMzIqICVpLCBpOCogJWMpCiAvLyBDSEVDS0FSTS1MQUJFTDogZGVmaW5lICVjbGFzcy5DKiBAX1pOMUNEMkV2KCVjbGFzcy5DKiByZXR1cm5lZCAldGhpcykKKy8vIENIRUNLQVJNLUxBQkVMOiBkZWZpbmUgJWNsYXNzLkMqIEBfWk4xQ0QxRXYoJWNsYXNzLkMqIHJldHVybmVkICV0aGlzKQorLy8gQ0hFQ0tBUk0tTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQ0QwRXYoJWNsYXNzLkMqICV0aGlzKQorCisvLyBDSEVDS0lPUzUtTEFCRUw6IGRlZmluZSAlY2xhc3MuQyogQF9aTjFDQzJFUGlQYyglY2xhc3MuQyogJXRoaXMsIGkzMiogJWksIGk4KiAlYykKKy8vIENIRUNLSU9TNS1MQUJFTDogZGVmaW5lICVjbGFzcy5DKiBAX1pOMUNDMUVQaVBjKCVjbGFzcy5DKiAldGhpcywgaTMyKiAlaSwgaTgqICVjKQorLy8gQ0hFQ0tJT1M1LUxBQkVMOiBkZWZpbmUgJWNsYXNzLkMqIEBfWk4xQ0QyRXYoJWNsYXNzLkMqICV0aGlzKQorLy8gQ0hFQ0tJT1M1LUxBQkVMOiBkZWZpbmUgJWNsYXNzLkMqIEBfWk4xQ0QxRXYoJWNsYXNzLkMqICV0aGlzKQorLy8gQ0hFQ0tJT1M1LUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUNEMEV2KCVjbGFzcy5DKiAldGhpcykKIAogLy8gQ0hFQ0tNUy1MQUJFTDogZGVmaW5lIHg4Nl90aGlzY2FsbGNjICVjbGFzcy5DKiBAIlwwMT8/MENAQFFBRUBQQUhQQURAWiIoJWNsYXNzLkMqIHJldHVybmVkICV0aGlzLCBpMzIqICVpLCBpOCogJWMpCiAvLyBDSEVDS01TLUxBQkVMOiBkZWZpbmUgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUNAQFVBRUBYWiIoJWNsYXNzLkMqICV0aGlzKQpAQCAtNzUsMTUgKzg3LDIwIEBACiBEOjpEKCkgeyB9CiBEOjp+RCgpIHsgfQogCi0vLyBDSEVDS0dFTi1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFEQzFFdiglY2xhc3MuRCogJXRoaXMpCiAvLyBDSEVDS0dFTi1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFEQzJFdiglY2xhc3MuRCogJXRoaXMsIGk4KiogJXZ0dCkKLS8vIENIRUNLR0VOLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUREMUV2KCVjbGFzcy5EKiAldGhpcykKKy8vIENIRUNLR0VOLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMURDMUV2KCVjbGFzcy5EKiAldGhpcykKIC8vIENIRUNLR0VOLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUREMkV2KCVjbGFzcy5EKiAldGhpcywgaTgqKiAldnR0KQorLy8gQ0hFQ0tHRU4tTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xREQxRXYoJWNsYXNzLkQqICV0aGlzKQogCi0vLyBDSEVDS0FSTS1MQUJFTDogZGVmaW5lICVjbGFzcy5EKiBAX1pOMURDMUV2KCVjbGFzcy5EKiByZXR1cm5lZCAldGhpcykKIC8vIENIRUNLQVJNLUxBQkVMOiBkZWZpbmUgJWNsYXNzLkQqIEBfWk4xREMyRXYoJWNsYXNzLkQqIHJldHVybmVkICV0aGlzLCBpOCoqICV2dHQpCi0vLyBDSEVDS0FSTS1MQUJFTDogZGVmaW5lICVjbGFzcy5EKiBAX1pOMUREMUV2KCVjbGFzcy5EKiByZXR1cm5lZCAldGhpcykKKy8vIENIRUNLQVJNLUxBQkVMOiBkZWZpbmUgJWNsYXNzLkQqIEBfWk4xREMxRXYoJWNsYXNzLkQqIHJldHVybmVkICV0aGlzKQogLy8gQ0hFQ0tBUk0tTEFCRUw6IGRlZmluZSAlY2xhc3MuRCogQF9aTjFERDJFdiglY2xhc3MuRCogcmV0dXJuZWQgJXRoaXMsIGk4KiogJXZ0dCkKKy8vIENIRUNLQVJNLUxBQkVMOiBkZWZpbmUgJWNsYXNzLkQqIEBfWk4xREQxRXYoJWNsYXNzLkQqIHJldHVybmVkICV0aGlzKQorCisvLyBDSEVDS0lPUzUtTEFCRUw6IGRlZmluZSAlY2xhc3MuRCogQF9aTjFEQzJFdiglY2xhc3MuRCogJXRoaXMsIGk4KiogJXZ0dCkKKy8vIENIRUNLSU9TNS1MQUJFTDogZGVmaW5lICVjbGFzcy5EKiBAX1pOMURDMUV2KCVjbGFzcy5EKiAldGhpcykKKy8vIENIRUNLSU9TNS1MQUJFTDogZGVmaW5lICVjbGFzcy5EKiBAX1pOMUREMkV2KCVjbGFzcy5EKiAldGhpcywgaTgqKiAldnR0KQorLy8gQ0hFQ0tJT1M1LUxBQkVMOiBkZWZpbmUgJWNsYXNzLkQqIEBfWk4xREQxRXYoJWNsYXNzLkQqICV0aGlzKQogCiAvLyBDSEVDS01TLUxBQkVMOiBkZWZpbmUgeDg2X3RoaXNjYWxsY2MgJWNsYXNzLkQqIEAiXDAxPz8wREBAUUFFQFhaIiglY2xhc3MuRCogcmV0dXJuZWQgJXRoaXMsIGkzMiAlaXNfbW9zdF9kZXJpdmVkKQogLy8gQ0hFQ0tNUy1MQUJFTDogZGVmaW5lIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzFEQEBRQUVAWFoiKCVjbGFzcy5EKiAldGhpcykKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci1kaXJlY3QtY2FsbC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvY29uc3RydWN0b3ItZGlyZWN0LWNhbGwuY3BwCmluZGV4IDc1ZTZmMjEuLjdhMmE2MDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci1kaXJlY3QtY2FsbC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9yLWRpcmVjdC1jYWxsLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZtcy1leHRlbnNpb25zIC1XbWljcm9zb2Z0ICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1wYy1taW5ndzMyIC1mbXMtZXh0ZW5zaW9ucyAtV21pY3Jvc29mdCAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogY2xhc3MgVGVzdDEgewogcHVibGljOgpAQCAtMjIsMTAgKzIyLDEwIEBACiAKIHZvaWQgZjIoKSB7CiAgIC8vIENIRUNLOiAgJXZhciA9IGFsbG9jYSAlY2xhc3MuVGVzdDIsIGFsaWduIDQKLSAgLy8gQ0hFQ0stTkVYVDogIGNhbGwgdm9pZCBAX1pONVRlc3QyQzFFdiglY2xhc3MuVGVzdDIqICV2YXIpCisgIC8vIENIRUNLLU5FWFQ6ICBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQF9aTjVUZXN0MkMxRXYoJWNsYXNzLlRlc3QyKiAldmFyKQogICBUZXN0MiB2YXI7CiAKLSAgLy8gQ0hFQ0stTkVYVDogIGNhbGwgdm9pZCBAX1pONVRlc3QyQzFFdiglY2xhc3MuVGVzdDIqICV2YXIpCisgIC8vIENIRUNLLU5FWFQ6ICBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQF9aTjVUZXN0MkMxRXYoJWNsYXNzLlRlc3QyKiAldmFyKQogICB2YXIuVGVzdDI6OlRlc3QyKCk7CiAKICAgLy8gQ0hFQ0s6ICBjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LnAwaTgucDBpOC5pMzIoaTgqICV7ey4qfX0sIGk4KiAle3suKn19LCBpMzIgOCwgaTMyIDQsIGkxIGZhbHNlKQpAQCAtNDUsMTYgKzQ1LDE2IEBACiB9OwogCiB2b2lkIGYzKCkgewotICAvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk41VGVzdDNDMUV2KCVjbGFzcy5UZXN0MyogJXZhcikKKyAgLy8gQ0hFQ0s6IGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAX1pONVRlc3QzQzFFdiglY2xhc3MuVGVzdDMqICV2YXIpCiAgIFRlc3QzIHZhcjsKIAotICAvLyBDSEVDSy1ORVhUOiBjYWxsIHZvaWQgQF9aTjVUZXN0M0MxRXYoJWNsYXNzLlRlc3QzKiAldmFyMikKKyAgLy8gQ0hFQ0stTkVYVDogY2FsbCB4ODZfdGhpc2NhbGxjYyB2b2lkIEBfWk41VGVzdDNDMUV2KCVjbGFzcy5UZXN0MyogJXZhcjIpCiAgIFRlc3QzIHZhcjI7CiAKLSAgLy8gQ0hFQ0stTkVYVDogY2FsbCB2b2lkIEBfWk41VGVzdDNDMUV2KCVjbGFzcy5UZXN0MyogJXZhcikKKyAgLy8gQ0hFQ0stTkVYVDogY2FsbCB4ODZfdGhpc2NhbGxjYyB2b2lkIEBfWk41VGVzdDNDMUV2KCVjbGFzcy5UZXN0MyogJXZhcikKICAgdmFyLlRlc3QzOjpUZXN0MygpOwogCi0gIC8vIENIRUNLLU5FWFQ6IGNhbGwgdm9pZCBAX1pONVRlc3QzQzFFUktTXyglY2xhc3MuVGVzdDMqICV2YXIsICVjbGFzcy5UZXN0MyogJXZhcjIpCisgIC8vIENIRUNLLU5FWFQ6IGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAX1pONVRlc3QzQzFFUktTXyglY2xhc3MuVGVzdDMqICV2YXIsICVjbGFzcy5UZXN0MyogJXZhcjIpCiAgIHZhci5UZXN0Mzo6VGVzdDModmFyMik7CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci1mb3ItYXJyYXktbWVtYmVycy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvY29uc3RydWN0b3ItZm9yLWFycmF5LW1lbWJlcnMuY3BwCmluZGV4IDc4NDJkOWMuLjhlYTdlYWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci1mb3ItYXJyYXktbWVtYmVycy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9yLWZvci1hcnJheS1tZW1iZXJzLmNwcApAQCAtMSw4ICsxLDcgQEAKLS8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQseDg2LTY0LXJlZ2lzdGVyZWQtdGFyZ2V0Ci0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1zdGQ9YysrMTEgLVMgJXMgLW8gJXQtNjQucwotLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBDSEVDSy1MUDY0IC0taW5wdXQtZmlsZT0ldC02NC5zICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1TICVzIC1vICV0LTMyLnMKLS8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFAzMiAtLWlucHV0LWZpbGU9JXQtMzIucyAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1lbWl0LWxsdm0gJXMgLW8gLSB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1lbWl0LWxsdm0gJXMgLW8gLSB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzCiAKIGV4dGVybiAiQyIgaW50IHByaW50ZiguLi4pOwogCkBAIC0zOSw2ICszOCw0IEBACiAgIG0xLnByKCk7CiB9CiAKLS8vIENIRUNLLUxQNjQ6IGNhbGxxIF9fWk4xU0MxRXYKLQotLy8gQ0hFQ0stTFAzMjogY2FsbGwgTF9fWk4xU0MxRXYKKy8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjFTQzFFdgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9yLWluaXQtcmVmZXJlbmNlLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci1pbml0LXJlZmVyZW5jZS5jcHAKaW5kZXggNWU3NTE1OS4uNjFmNDI2ZCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9yLWluaXQtcmVmZXJlbmNlLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvY29uc3RydWN0b3ItaW5pdC1yZWZlcmVuY2UuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAlcyB8IGdyZXAgInN0b3JlIGkzMlwqIEB4LCBpMzJcKlwqIgorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAogaW50IHg7CiBzdHJ1Y3QgQSB7CkBAIC02LDQgKzYsNCBAQAogICBBKCkgOiB5KHgpIHt9CiB9OwogQSB6OwotCisvLyBDSEVDSzogc3RvcmUgaTMyKiBAeCwgaTMyKioKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci10ZW1wbGF0ZS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvY29uc3RydWN0b3ItdGVtcGxhdGUuY3BwCmluZGV4IDBkMzhkMTAuLjY3NWUzY2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3Rvci10ZW1wbGF0ZS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9yLXRlbXBsYXRlLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQseDg2LTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1zdGQ9YysrMTEgLVMgJXMgLW8gJXQtNjQucwogLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBDSEVDSy1MUDY0IC0taW5wdXQtZmlsZT0ldC02NC5zICVzCiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1TICVzIC1vICV0LTMyLnMKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb25zdHJ1Y3RvcnMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9ycy5jcHAKaW5kZXggZjczMGI5ZS4uMDJjMjhjNyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9ycy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnN0cnVjdG9ycy5jcHAKQEAgLTIxLDIwICsyMSwxOSBAQAogQTo6QShzdHJ1Y3QgVW5kZWNsYXJlZCAmcmVmKSA6IG1lbSgwKSB7fQogCiAvLyBDaGVjayB0aGF0IGRlbGVnYXRpb24gd29ya3MuCi0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFBQzFFUjEwVW5kZWNsYXJlZCglc3RydWN0LkEqICV0aGlzLCAlc3RydWN0LlVuZGVjbGFyZWQqICVyZWYpIHVubmFtZWRfYWRkcgotLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMUFDMkVSMTBVbmRlY2xhcmVkKAotCiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFBQzJFUjEwVW5kZWNsYXJlZCglc3RydWN0LkEqICV0aGlzLCAlc3RydWN0LlVuZGVjbGFyZWQqICVyZWYpIHVubmFtZWRfYWRkcgogLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pONk1lbWJlckMxRWkoCiAKLUE6OkEoVmFsdWVDbGFzcyB2KSA6IG1lbSh2LnkgLSB2LngpIHt9CisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFBQzFFUjEwVW5kZWNsYXJlZCglc3RydWN0LkEqICV0aGlzLCAlc3RydWN0LlVuZGVjbGFyZWQqICVyZWYpIHVubmFtZWRfYWRkcgorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMUFDMkVSMTBVbmRlY2xhcmVkKAogCi0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFBQzFFMTBWYWx1ZUNsYXNzKCVzdHJ1Y3QuQSogJXRoaXMsIGk2NCAldi5jb2VyY2UpIHVubmFtZWRfYWRkcgotLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMUFDMkUxMFZhbHVlQ2xhc3MoCitBOjpBKFZhbHVlQ2xhc3MgdikgOiBtZW0odi55IC0gdi54KSB7fQogCiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFBQzJFMTBWYWx1ZUNsYXNzKCVzdHJ1Y3QuQSogJXRoaXMsIGk2NCAldi5jb2VyY2UpIHVubmFtZWRfYWRkcgogLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pONk1lbWJlckMxRWkoCiAKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUFDMUUxMFZhbHVlQ2xhc3MoJXN0cnVjdC5BKiAldGhpcywgaTY0ICV2LmNvZXJjZSkgdW5uYW1lZF9hZGRyCisvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQUMyRTEwVmFsdWVDbGFzcygKIAogLyogVGVzdCB0aGF0IHRoaW5ncyB3b3JrIGZvciBpbmhlcml0YW5jZS4gKi8KIHN0cnVjdCBCIDogQSB7CkBAIC00NCwxMyArNDMsMTIgQEAKIAogQjo6QihzdHJ1Y3QgVW5kZWNsYXJlZCAmcmVmKSA6IEEocmVmKSwgbWVtKDEpIHt9CiAKLS8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUJDMUVSMTBVbmRlY2xhcmVkKCVzdHJ1Y3QuQiogJXRoaXMsICVzdHJ1Y3QuVW5kZWNsYXJlZCogJXJlZikgdW5uYW1lZF9hZGRyCi0vLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQkMyRVIxMFVuZGVjbGFyZWQoCi0KIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUJDMkVSMTBVbmRlY2xhcmVkKCVzdHJ1Y3QuQiogJXRoaXMsICVzdHJ1Y3QuVW5kZWNsYXJlZCogJXJlZikgdW5uYW1lZF9hZGRyCiAvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQUMyRVIxMFVuZGVjbGFyZWQoCiAvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk42TWVtYmVyQzFFaSgKIAorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQkMxRVIxMFVuZGVjbGFyZWQoJXN0cnVjdC5CKiAldGhpcywgJXN0cnVjdC5VbmRlY2xhcmVkKiAlcmVmKSB1bm5hbWVkX2FkZHIKKy8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjFCQzJFUjEwVW5kZWNsYXJlZCgKIAogCiAvKiBUZXN0IHRoYXQgdGhlIGRlbGVnYXRpb24gb3B0aW1pemF0aW9uIGlzIGRpc2FibGVkIGZvciBjbGFzc2VzIHdpdGgKQEAgLTY0LDE1ICs2MiwxNCBAQAogfTsKIEM6OkMoaW50IHgpIDogQShWYWx1ZUNsYXNzKHgsIHgrMSkpLCBtZW0oeCAqIHgpIHt9CiAKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUNDMkVpKCVzdHJ1Y3QuQyogJXRoaXMsIGk4KiogJXZ0dCwgaTMyICV4KSB1bm5hbWVkX2FkZHIKKy8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjZNZW1iZXJDMUVpKAorCiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFDQzFFaSglc3RydWN0LkMqICV0aGlzLCBpMzIgJXgpIHVubmFtZWRfYWRkcgogLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMTBWYWx1ZUNsYXNzQzFFaWkoCiAvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQUMyRTEwVmFsdWVDbGFzcygKIC8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjZNZW1iZXJDMUVpKAogCi0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFDQzJFaSglc3RydWN0LkMqICV0aGlzLCBpOCoqICV2dHQsIGkzMiAleCkgdW5uYW1lZF9hZGRyCi0vLyBDSEVDSzogY2FsbCB2b2lkIEBfWk42TWVtYmVyQzFFaSgKLQotCiAKIC8qIFRlc3QgdGhhdCB0aGUgZGVsZWdhdGlvbiBvcHRpbWl6YXRpb24gaXMgZGlzYWJsZWQgZm9yIHZhcmFyZ3MKICAgIGNvbnN0cnVjdG9ycy4gKi8KQEAgLTgzLDE2ICs4MCwxNSBAQAogCiBEOjpEKGludCB4LCAuLi4pIDogQShWYWx1ZUNsYXNzKHgsIHgrMSkpLCBtZW0oeCp4KSB7fQogCi0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFEQzFFaXooJXN0cnVjdC5EKiAldGhpcywgaTMyICV4LCAuLi4pIHVubmFtZWRfYWRkcgotLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMTBWYWx1ZUNsYXNzQzFFaWkoCi0vLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQUMyRTEwVmFsdWVDbGFzcygKLS8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjZNZW1iZXJDMUVpKAotCiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFEQzJFaXooJXN0cnVjdC5EKiAldGhpcywgaTMyICV4LCAuLi4pIHVubmFtZWRfYWRkcgogLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMTBWYWx1ZUNsYXNzQzFFaWkoCiAvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQUMyRTEwVmFsdWVDbGFzcygKIC8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjZNZW1iZXJDMUVpKAogCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFEQzFFaXooJXN0cnVjdC5EKiAldGhpcywgaTMyICV4LCAuLi4pIHVubmFtZWRfYWRkcgorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMTBWYWx1ZUNsYXNzQzFFaWkoCisvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQUMyRTEwVmFsdWVDbGFzcygKKy8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjZNZW1iZXJDMUVpKAogCiAvLyBQUjY2MjI6ICB0aGlzIHNob3VsZG4ndCBjcmFzaAogbmFtZXNwYWNlIHRlc3QwIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb252ZXJ0LXRvLWZwdHIuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnZlcnQtdG8tZnB0ci5jcHAKaW5kZXggZTQ5N2FjZi4uYzNiZTk2MiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2NvbnZlcnQtdG8tZnB0ci5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvbnZlcnQtdG8tZnB0ci5jcHAKQEAgLTEsOCArMSw3IEBACi0vLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0LHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1TICVzIC1vICV0LTY0LnMKLS8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFA2NCAtLWlucHV0LWZpbGU9JXQtNjQucyAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtUyAlcyAtbyAldC0zMi5zCi0vLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQMzIgLS1pbnB1dC1maWxlPSV0LTMyLnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcwogCiBleHRlcm4gIkMiIGludCBwcmludGYoLi4uKTsKIApAQCAtMzksOSArMzgsNSBAQAogIHJldHVybiAwOwogfQogCi0vLyBDSEVDSy1MUDY0OiBjYWxscSBfX1pOMUFjdlBGaWlFRXYKLS8vIENIRUNLLUxQNjQ6IGNhbGxxIF9fWk4xQmN2UkZpaUVFdgotCi0vLyBDSEVDSy1MUDMyOiBjYWxsbCBMX19aTjFBY3ZQRmlpRUV2Ci0vLyBDSEVDSy1MUDMyOiBjYWxsbCBMX19aTjFCY3ZSRmlpRUV2Ci0KKy8vIENIRUNLOiBjYWxsIGkzMiAoaTMyKSogKCVzdHJ1Y3QuQSopKiBAX1pOMUFjdlBGaWlFRXYKKy8vIENIRUNLOiBjYWxsIGkzMiAoaTMyKSogKCVzdHJ1Y3QuQiopKiBAX1pOMUJjdlJGaWlFRXYKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb3B5LWFzc2lnbi1zeW50aGVzaXMtMS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvY29weS1hc3NpZ24tc3ludGhlc2lzLTEuY3BwCmluZGV4IDJmZmM3YmMuLmFlMjExNDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9jb3B5LWFzc2lnbi1zeW50aGVzaXMtMS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvcHktYXNzaWduLXN5bnRoZXNpcy0xLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQseDg2LTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAlcyAtbyAtIHwgXAogLy8gUlVOOiBGaWxlQ2hlY2sgJXMKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGkzODYtYXBwbGUtZGFyd2luIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAlcyAtbyAtIHwgXApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2NvcHktYXNzaWduLXN5bnRoZXNpcy0yLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9jb3B5LWFzc2lnbi1zeW50aGVzaXMtMi5jcHAKaW5kZXggMThlOTJmOS4uMGJjN2QzZCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2NvcHktYXNzaWduLXN5bnRoZXNpcy0yLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvY29weS1hc3NpZ24tc3ludGhlc2lzLTIuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIHN0cnVjdCBBIHt9OwogQSYgKEE6Oip4KShjb25zdCBBJikgPSAmQTo6b3BlcmF0b3I9OwotLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgJXN0cnVjdC5BKiBAX1pOMUFhU0VSS1NfCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciB7ey4qfX0lc3RydWN0LkEqIEBfWk4xQWFTRVJLU18KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb3B5LWNvbnN0cnVjdG9yLWVsaW0uY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2NvcHktY29uc3RydWN0b3ItZWxpbS5jcHAKaW5kZXggYWQzYTg3Yi4uOGU5YmVlOSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2NvcHktY29uc3RydWN0b3ItZWxpbS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvcHktY29uc3RydWN0b3ItZWxpbS5jcHAKQEAgLTEsNiArMSw5IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAldCAlcwotLy8gUlVOOiBub3QgZ3JlcCAiX1pOMUNDMUVSSzFDIiAldAotLy8gUlVOOiBub3QgZ3JlcCAiX1pOMVNDMUVSSzFTIiAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1DSEVDSworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJW1zX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXggTVMKKy8vIENIRUNLLU5PVDogX1pOMUNDMUVSSzFDCisvLyBDSEVDSy1OT1Q6IF9aTjFTQzFFUksxUworLy8gTVMtTk9UOiA/MENAQFFBRUBBQlYwCisvLyBNUy1OT1Q6ID8wU0BAUUFFQEFCVjAKIAogZXh0ZXJuICJDIiBpbnQgcHJpbnRmKC4uLik7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb3B5LWNvbnN0cnVjdG9yLXN5bnRoZXNpcy0yLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9jb3B5LWNvbnN0cnVjdG9yLXN5bnRoZXNpcy0yLmNwcAppbmRleCAwM2M2NjMzLi40N2MzNGNhIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvY29weS1jb25zdHJ1Y3Rvci1zeW50aGVzaXMtMi5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvcHktY29uc3RydWN0b3Itc3ludGhlc2lzLTIuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAogc3RydWN0IEEgeyB2aXJ0dWFsIHZvaWQgYSgpOyB9OwogQSB4KEEmIHkpIHsgcmV0dXJuIHk7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb3B5LWNvbnN0cnVjdG9yLXN5bnRoZXNpcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvY29weS1jb25zdHJ1Y3Rvci1zeW50aGVzaXMuY3BwCmluZGV4IGM4YjI2NWMuLmFiMzYxNTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9jb3B5LWNvbnN0cnVjdG9yLXN5bnRoZXNpcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvcHktY29uc3RydWN0b3Itc3ludGhlc2lzLmNwcApAQCAtMTM5LDEyICsxMzksMTAgQEAKIC8vIENIRUNLOiAgICBkZWZpbmUgbGlua29uY2Vfb2RyIFtbQTolLipdXSogQF9aTjEycmRhcjEzODE2OTQwMUFhU0VSS1MwXygKIC8vIENIRUNLOiAgICAgIFtbVEhJUzolLipdXSA9IGxvYWQgW1tBXV0qKgogLy8gQ0hFQ0stTkVYVDogW1tUMDolLipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgW1tBXV0qIFtbVEhJU11dLCBpMzIgMCwgaTMyIDEKLS8vIENIRUNLLU5FWFQ6IFtbVDE6JS4qXV0gPSBiaXRjYXN0IFsyIHggaThdKiBbW1QwXV0gdG8gaTE2KgogLy8gQ0hFQ0stTkVYVDogW1tPVEhFUjolLipdXSA9IGxvYWQgW1tBXV0qKgogLy8gQ0hFQ0stTkVYVDogW1tUMjolLipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgW1tBXV0qIFtbT1RIRVJdXSwgaTMyIDAsIGkzMiAxCi0vLyBDSEVDSy1ORVhUOiBbW1QzOiUuKl1dID0gYml0Y2FzdCBbMiB4IGk4XSogW1tUMl1dIHRvIGkxNioKLS8vIENIRUNLLU5FWFQ6IFtbVDQ6JS4qXV0gPSBiaXRjYXN0IGkxNiogW1tUMV1dIHRvIGk4KgotLy8gQ0hFQ0stTkVYVDogW1tUNTolLipdXSA9IGJpdGNhc3QgaTE2KiBbW1QzXV0gdG8gaTgqCisvLyBDSEVDSy1ORVhUOiBbW1Q0OiUuKl1dID0gYml0Y2FzdCBpMTYqIFtbVDBdXSB0byBpOCoKKy8vIENIRUNLLU5FWFQ6IFtbVDU6JS4qXV0gPSBiaXRjYXN0IGkxNiogW1tUMl1dIHRvIGk4KgogLy8gQ0hFQ0stTkVYVDogY2FsbCB2b2lkIEBsbHZtLm1lbWNweS5wMGk4LnAwaTguaTY0KGk4KiBbW1Q0XV0sIGk4KiBbW1Q1XV0sIGk2NCA4LCBpMzIgOCwgaTEgZmFsc2UpCiAvLyBDSEVDSy1ORVhUOiByZXQgW1tBXV0qIFtbVEhJU11dCiAKQEAgLTE1MywxMiArMTUxLDEwIEBACiAvLyBDSEVDSy1ORVhUOiBbW1QwOiUuKl1dID0gYml0Y2FzdCBbW0FdXSogW1tUSElTXV0gdG8gaTgqKioKIC8vIENIRUNLLU5FWFQ6IHN0b3JlIGk4KiogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzQgeCBpOCpdKiBAX1pUVk4xMnJkYXIxMzgxNjk0MDFBRSwgaTY0IDAsIGk2NCAyKSwgaTgqKiogW1tUMF1dCiAvLyBDSEVDSy1ORVhUOiBbW1QwOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBbW0FdXSogW1tUSElTXV0sIGkzMiAwLCBpMzIgMQotLy8gQ0hFQ0stTkVYVDogW1tUMTolLipdXSA9IGJpdGNhc3QgWzIgeCBpOF0qIFtbVDBdXSB0byBpMTYqCiAvLyBDSEVDSy1ORVhUOiBbW09USEVSOiUuKl1dID0gbG9hZCBbW0FdXSoqCiAvLyBDSEVDSy1ORVhUOiBbW1QyOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBbW0FdXSogW1tPVEhFUl1dLCBpMzIgMCwgaTMyIDEKLS8vIENIRUNLLU5FWFQ6IFtbVDM6JS4qXV0gPSBiaXRjYXN0IFsyIHggaThdKiBbW1QyXV0gdG8gaTE2KgotLy8gQ0hFQ0stTkVYVDogW1tUNDolLipdXSA9IGJpdGNhc3QgaTE2KiBbW1QxXV0gdG8gaTgqCi0vLyBDSEVDSy1ORVhUOiBbW1Q1OiUuKl1dID0gYml0Y2FzdCBpMTYqIFtbVDNdXSB0byBpOCoKKy8vIENIRUNLLU5FWFQ6IFtbVDQ6JS4qXV0gPSBiaXRjYXN0IGkxNiogW1tUMF1dIHRvIGk4KgorLy8gQ0hFQ0stTkVYVDogW1tUNTolLipdXSA9IGJpdGNhc3QgaTE2KiBbW1QyXV0gdG8gaTgqCiAvLyBDSEVDSy1ORVhUOiBjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LnAwaTgucDBpOC5pNjQoaTgqIFtbVDRdXSwgaTgqIFtbVDVdXSwgaTY0IDgsIGkzMiA4LCBpMSBmYWxzZSkKIC8vIENIRUNLLU5FWFQ6IHJldCB2b2lkCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jb3ZlcmFnZS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvY292ZXJhZ2UuY3BwCmluZGV4IDFmMTYxMWIuLjg4Zjc0MDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9jb3ZlcmFnZS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2NvdmVyYWdlLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC1vIC0gLXRlc3QtY292ZXJhZ2UgLWZlbWl0LWNvdmVyYWdlLW5vdGVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAtdGVzdC1jb3ZlcmFnZSAtZmVtaXQtY292ZXJhZ2Utbm90ZXMgfCBGaWxlQ2hlY2sgJXMKIAogZXh0ZXJuICJDIiB2b2lkIHRlc3RfbmFtZTEoKSB7fQogdm9pZCB0ZXN0X25hbWUyKCkge30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jdG9yLWR0b3ItYWxpYXMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2N0b3ItZHRvci1hbGlhcy5jcHAKaW5kZXggMjM1ZDE2NS4uZDg2OWEyYiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2N0b3ItZHRvci1hbGlhcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2N0b3ItZHRvci1hbGlhcy5jcHAKQEAgLTEsNyArMSw3IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSB4ODZfNjQtbGludXggLWVtaXQtbGx2bSAtbyAtIC1tY29uc3RydWN0b3ItYWxpYXNlcyAtTzEgLWRpc2FibGUtbGx2bS1vcHR6bnMgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlIHg4Nl82NC1saW51eCAtZW1pdC1sbHZtIC1vIC0gLW1jb25zdHJ1Y3Rvci1hbGlhc2VzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU5PT1BUICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSBpNjg2LWxpbnV4IC1lbWl0LWxsdm0gLW8gLSAtbWNvbnN0cnVjdG9yLWFsaWFzZXMgLU8xIC1kaXNhYmxlLWxsdm0tb3B0em5zIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSBpNjg2LWxpbnV4IC1lbWl0LWxsdm0gLW8gLSAtbWNvbnN0cnVjdG9yLWFsaWFzZXMgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Tk9PUFQgJXMKIAotLy8gUlVOOiAlY2xhbmdfY2MxIC1jYzEgLXRyaXBsZSB4ODZfNjQtLW5ldGJzZCAtZW1pdC1sbHZtIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC0tbmV0YnNkIC1lbWl0LWxsdm0gXAogLy8gUlVOOiAtbWNvbnN0cnVjdG9yLWFsaWFzZXMgLU8yICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stUkFVVyAlcwogCiBuYW1lc3BhY2UgdGVzdDEgewpAQCAtNjEsNyArNjEsNyBAQAogICAvLyB0ZXN0IHRoYXQgd2UgZG9uJ3QgZG8gdGhpcyBvcHRpbWl6YXRpb24gYXQgLU8wIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIGNhbgogICAvLyBzZWUgYm90aCBkZXN0cnVjdG9ycy4KICAgLy8gTk9PUFQtREFHOiBjYWxsIGkzMiBAX19jeGFfYXRleGl0e3suKn19QF9aTjV0ZXN0NDFCRDJFdgotICAvLyBOT09PUFQtREFHOiBkZWZpbmUgbGlua29uY2Vfb2RyIHZvaWQgQF9aTjV0ZXN0NDFCRDJFdgorICAvLyBOT09QVC1EQUc6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONXRlc3Q0MUJEMkV2CiAgIHN0cnVjdCBBIHsKICAgICB2aXJ0dWFsIH5BKCkge30KICAgfTsKQEAgLTEzMyw2ICsxMzMsMjIgQEAKICAgemVkIGZvbzsKIH0KIAorbmFtZXNwYWNlIHRlc3Q5IHsKK3N0cnVjdCBmb28geworICBfX2F0dHJpYnV0ZV9fKChzdGRjYWxsKSkgfmZvbygpIHsKKyAgfQorfTsKKworc3RydWN0IGJhciA6IHB1YmxpYyBmb28ge307CisKK3ZvaWQgemVkKCkgeworICAvLyBUZXN0IHRoYXQgd2UgcHJvZHVjZSBhIGNhbGwgdG8gYmFyJ3MgZGVzdHJ1Y3Rvci4gV2UgdXNlZCB0byBjYWxsIGZvbydzLCBidXQKKyAgLy8gaXQgaGFzIGEgZGlmZmVyZW50IGNhbGxpbmcgY29udmVyc2lvbi4KKyAgLy8gQ0hFQ0stREFHOiBjYWxsIHZvaWQgQF9aTjV0ZXN0OTNiYXJEMkV2CisgIGJhciBwdHI7Cit9Cit9CisKIC8vIENIRUNLLVJBVVc6IEBfWlRWMUMgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs0IHggaTgqXSBbe3tbXkBdKn19QF9aVEkxQyB7e1teQF0qfX1AX1pOMUNEMkV2IHt7W15AXSp9fUBfWk4xQ0QwRXYge3tbXkBdKn19XQogLy8gcjE5NDI5NiByZXBsYWNlZCBDOjp+QyB3aXRoIEI6On5CIHdpdGhvdXQgZW1pdHRpbmcgdGhlIGxhdGVyLgogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvY3h4MHgtZGVmYXVsdGVkLXRlbXBsYXRlcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvY3h4MHgtZGVmYXVsdGVkLXRlbXBsYXRlcy5jcHAKaW5kZXggZjRkNWNjYy4uNmY0YzUzMyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2N4eDB4LWRlZmF1bHRlZC10ZW1wbGF0ZXMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9jeHgweC1kZWZhdWx0ZWQtdGVtcGxhdGVzLmNwcApAQCAtMSwxNiArMSwxNiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IFggewogICBYKCk7CiB9OwogCi0vLyBDSEVDSzogZGVmaW5lIHt7Lip9fSBAX1pOMVhJYkVDMUV2CiAvLyBDSEVDSzogZGVmaW5lIHt7Lip9fSBAX1pOMVhJYkVDMkV2CisvLyBDSEVDSzogZGVmaW5lIHt7Lip9fSBAX1pOMVhJYkVDMUV2CiB0ZW1wbGF0ZSA8PiBYPGJvb2w+OjpYKCkgPSBkZWZhdWx0OwogCi0vLyBDSEVDSzogZGVmaW5lIHdlYWtfb2RyIHt7Lip9fSBAX1pOMVhJaUVDMUV2CiAvLyBDSEVDSzogZGVmaW5lIHdlYWtfb2RyIHt7Lip9fSBAX1pOMVhJaUVDMkV2CisvLyBDSEVDSzogZGVmaW5lIHdlYWtfb2RyIHt7Lip9fSBAX1pOMVhJaUVDMUV2CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gWDxUPjo6WCgpID0gZGVmYXVsdDsKIHRlbXBsYXRlIFg8aW50Pjo6WCgpOwogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvY3h4MHgtZGVsZWdhdGluZy1jdG9ycy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvY3h4MHgtZGVsZWdhdGluZy1jdG9ycy5jcHAKaW5kZXggYzQ4ZTYxZi4uZGNjMDU1NiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2N4eDB4LWRlbGVnYXRpbmctY3RvcnMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9jeHgweC1kZWxlZ2F0aW5nLWN0b3JzLmNwcApAQCAtMjYsMjggKzI2LDMwIEBACiBkZWxlZ2F0b3I6OmRlbGVnYXRvcihib29sKQoge30KIAotLy8gQ0hFQ0s6IGRlZmluZSB7ey4qfX0gQF9aTjlkZWxlZ2F0b3JDMUVjCi0vLyBDSEVDSzoge3suKn19IEBfWk45ZGVsZWdhdG9yQzFFYgotLy8gQ0hFQ0s6IHZvaWQgQF9fY3hhX3Rocm93Ci0vLyBDSEVDSzogdm9pZCBAX19jbGFuZ19jYWxsX3Rlcm1pbmF0ZQotLy8gQ0hFQ0s6IHt7Lip9fSBAX1pOOWRlbGVnYXRvckQxRXYKLS8vIENIRUNLOiBkZWZpbmUge3suKn19IEBfWk45ZGVsZWdhdG9yQzJFYworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB7ey4qfX0gQF9aTjlkZWxlZ2F0b3JDMkVjCiAvLyBDSEVDSzoge3suKn19IEBfWk45ZGVsZWdhdG9yQzJFYgogLy8gQ0hFQ0s6IHZvaWQgQF9fY3hhX3Rocm93CiAvLyBDSEVDSzogdm9pZCBAX19jbGFuZ19jYWxsX3Rlcm1pbmF0ZQogLy8gQ0hFQ0s6IHt7Lip9fSBAX1pOOWRlbGVnYXRvckQyRXYKKworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB7ey4qfX0gQF9aTjlkZWxlZ2F0b3JDMUVjCisvLyBDSEVDSzoge3suKn19IEBfWk45ZGVsZWdhdG9yQzFFYgorLy8gQ0hFQ0s6IHZvaWQgQF9fY3hhX3Rocm93CisvLyBDSEVDSzogdm9pZCBAX19jbGFuZ19jYWxsX3Rlcm1pbmF0ZQorLy8gQ0hFQ0s6IHt7Lip9fSBAX1pOOWRlbGVnYXRvckQxRXYKIGRlbGVnYXRvcjo6ZGVsZWdhdG9yKGNoYXIpCiAgIDogZGVsZWdhdG9yKHRydWUpIHsKICAgdGhyb3cgMDsKIH0KIAotLy8gQ0hFQ0s6IGRlZmluZSB7ey4qfX0gQF9aTjlkZWxlZ2F0b3JDMUVpCi0vLyBDSEVDSzoge3suKn19IEBfWk45ZGVsZWdhdG9yQzFFdgorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB7ey4qfX0gQF9aTjlkZWxlZ2F0b3JDMkVpCisvLyBDSEVDSzoge3suKn19IEBfWk45ZGVsZWdhdG9yQzJFdgogLy8gQ0hFQ0stTk9UOiB2b2lkIEBfWlN0OXRlcm1pbmF0ZXYKIC8vIENIRUNLOiByZXQKIC8vIENIRUNLLU5PVDogdm9pZCBAX1pTdDl0ZXJtaW5hdGV2Ci0vLyBDSEVDSzogZGVmaW5lIHt7Lip9fSBAX1pOOWRlbGVnYXRvckMyRWkKLS8vIENIRUNLOiB7ey4qfX0gQF9aTjlkZWxlZ2F0b3JDMkV2CisKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUge3suKn19IEBfWk45ZGVsZWdhdG9yQzFFaQorLy8gQ0hFQ0s6IHt7Lip9fSBAX1pOOWRlbGVnYXRvckMxRXYKIC8vIENIRUNLLU5PVDogdm9pZCBAX1pTdDl0ZXJtaW5hdGV2CiAvLyBDSEVDSzogcmV0CiAvLyBDSEVDSy1OT1Q6IHZvaWQgQF9aU3Q5dGVybWluYXRldgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2N4eDB4LWluaXRpYWxpemVyLXN0ZGluaXRpYWxpemVybGlzdC1wcjEyMDg2LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9jeHgweC1pbml0aWFsaXplci1zdGRpbml0aWFsaXplcmxpc3QtcHIxMjA4Ni5jcHAKaW5kZXggMDkxZDdiNy4uZDM2ZmUxYyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2N4eDB4LWluaXRpYWxpemVyLXN0ZGluaXRpYWxpemVybGlzdC1wcjEyMDg2LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvY3h4MHgtaW5pdGlhbGl6ZXItc3RkaW5pdGlhbGl6ZXJsaXN0LXByMTIwODYuY3BwCkBAIC03Myw3ICs3Myw3IEBACiAvLyBDSEVDSy1EWU5BTUlDLUJMOiBzdG9yZSBpMzIgMSwgaTMyKiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMiB4IGkzMl0qIEBfWkdSNm5lc3RlZDEsIGk2NCAwLCBpNjQgMCkKIC8vIENIRUNLLURZTkFNSUMtQkw6IHN0b3JlIGkzMiB7ey4qfX0sIGkzMiogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzIgeCBpMzJdKiBAX1pHUjZuZXN0ZWQxLCBpNjQgMCwgaTY0IDEpCiAvLyBDSEVDSy1EWU5BTUlDLUJMOiBzdG9yZSBpMzIqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsyIHggaTMyXSogQF9aR1I2bmVzdGVkMSwgaTY0IDAsIGk2NCAwKSwKLS8vIENIRUNLLURZTUFNSUMtQkw6ICAgICAgIGkzMioqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFszIHgge3suKn19XSogQF9aR1I2bmVzdGVkLCBpNjQgMCwgaTY0IDAsIGkzMiAwKSwgYWxpZ24gOAorLy8gQ0hFQ0stRFlOQU1JQy1CTDogICAgICAgaTMyKiogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzMgeCB7ey4qfX1dKiBAX1pHUjZuZXN0ZWQsIGk2NCAwLCBpNjQgMCwgaTMyIDApLCBhbGlnbiA4CiAvLyBDSEVDSy1EWU5BTUlDLUJMOiBzdG9yZSBpNjQgMiwgaTY0KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMyB4IHt7Lip9fV0qIEBfWkdSNm5lc3RlZCwgaTY0IDAsIGk2NCAwLCBpMzIgMSksIGFsaWduIDgKIC8vIENIRUNLLURZTkFNSUMtQkw6IHN0b3JlIGkzMiAzLCBpMzIqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsyIHggaTMyXSogQF9aR1I2bmVzdGVkMiwgaTY0IDAsIGk2NCAwKQogLy8gQ0hFQ0stRFlOQU1JQy1CTDogc3RvcmUgaTMyIHt7Lip9fSwgaTMyKiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMiB4IGkzMl0qIEBfWkdSNm5lc3RlZDIsIGk2NCAwLCBpNjQgMSkKQEAgLTExMSw5ICsxMTEsOSBAQAogLy8gQ0hFQ0stRFlOQU1JQy1CRTogc3RvcmUgaTMyIDEsIGkzMiogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzIgeCBpMzJdKiBAX1pHUjZuZXN0ZWQxLCBpNjQgMCwgaTY0IDApCiAvLyBDSEVDSy1EWU5BTUlDLUJFOiBzdG9yZSBpMzIge3suKn19LCBpMzIqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsyIHggaTMyXSogQF9aR1I2bmVzdGVkMSwgaTY0IDAsIGk2NCAxKQogLy8gQ0hFQ0stRFlOQU1JQy1CRTogc3RvcmUgaTMyKiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMiB4IGkzMl0qIEBfWkdSNm5lc3RlZDEsIGk2NCAwLCBpNjQgMCksCi0vLyBDSEVDSy1EWU1BTUlDLUJFOiAgICAgICBpMzIqKiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMyB4IHt7Lip9fV0qIEBfWkdSNm5lc3RlZCwgaTY0IDAsIGk2NCAwLCBpMzIgMCksIGFsaWduIDgKKy8vIENIRUNLLURZTkFNSUMtQkU6ICAgICAgIGkzMioqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFszIHgge3suKn19XSogQF9aR1I2bmVzdGVkLCBpNjQgMCwgaTY0IDAsIGkzMiAwKSwgYWxpZ24gOAogLy8gQ0hFQ0stRFlOQU1JQy1CRTogc3RvcmUgaTMyKiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMiB4IGkzMl0qIEBfWkdSNm5lc3RlZDEsIGk2NCAxLCBpNjQgMCksCi0vLyBDSEVDSy1EWU1BTUlDLUJFOiAgICAgICBpMzIqKiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMyB4IHt7Lip9fV0qIEBfWkdSNm5lc3RlZCwgaTY0IDAsIGk2NCAwLCBpMzIgMSksIGFsaWduIDgKKy8vIENIRUNLLURZTkFNSUMtQkU6ICAgICAgIGkzMioqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFszIHgge3suKn19XSogQF9aR1I2bmVzdGVkLCBpNjQgMCwgaTY0IDAsIGkzMiAxKSwgYWxpZ24gOAogLy8gQ0hFQ0stRFlOQU1JQy1CRTogc3RvcmUgaTMyIDMsIGkzMiogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzIgeCBpMzJdKiBAX1pHUjZuZXN0ZWQyLCBpNjQgMCwgaTY0IDApCiAvLyBDSEVDSy1EWU5BTUlDLUJFOiBzdG9yZSBpMzIge3suKn19LCBpMzIqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsyIHggaTMyXSogQF9aR1I2bmVzdGVkMiwgaTY0IDAsIGk2NCAxKQogLy8gQ0hFQ0stRFlOQU1JQy1CRTogc3RvcmUgaTMyKiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMiB4IGkzMl0qIEBfWkdSNm5lc3RlZDIsIGk2NCAwLCBpNjQgMCksCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvY3h4MTEtZXhjZXB0aW9uLXNwZWMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2N4eDExLWV4Y2VwdGlvbi1zcGVjLmNwcAppbmRleCA5NmVhMWQ3Li4zYjE1MTZiIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvY3h4MTEtZXhjZXB0aW9uLXNwZWMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9jeHgxMS1leGNlcHRpb24tc3BlYy5jcHAKQEAgLTEsNCArMSw1IEBACi0vLyBSVU46IG5vdCAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAlcyAtbyAtIC12ZXJpZnkgLWZleGNlcHRpb25zIC1mY3h4LWV4Y2VwdGlvbnMgLXRyaXBsZSB4ODZfNjQtbGludXgtZ251IHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gLXZlcmlmeSAtZmV4Y2VwdGlvbnMgLWZjeHgtZXhjZXB0aW9ucyAtdHJpcGxlIHg4Nl82NC1saW51eC1nbnUgfCBGaWxlQ2hlY2sgJXMKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCiAKIHZvaWQgaCgpOwogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvY3h4MTEtaW5pdGlhbGl6ZXItYXJyYXktbmV3LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9jeHgxMS1pbml0aWFsaXplci1hcnJheS1uZXcuY3BwCmluZGV4IDIzNTc3YmUuLjhkZTg4ZGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9jeHgxMS1pbml0aWFsaXplci1hcnJheS1uZXcuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9jeHgxMS1pbml0aWFsaXplci1hcnJheS1uZXcuY3BwCkBAIC05OSw4ICs5OSw5IEBACiAvLyAgIENIRUNLOiBpY21wIGVxICVbW1NdXSogJVtbTkVYVF9JTk5FUl1dLCAlW1tFTkRfSU5ORVJdXQogLy8gICBDSEVDSzogYnIgaTEKIC8vCi0vLyBDSEVDSzogJVtbTkVYVF9PVVRFUjouKl1dID0gZ2V0ZWxlbWVudHB0ciAlW1tTXV0qICV7ey4qfX0sIGkzMiAxCi0vLyBDSEVDSzogaWNtcCBlcSAlW1tTXV0qICVbW05FWFRfT1VURVJdXSwgJVtbRU5EX0FTX1NdXQorLy8gQ0hFQ0s6ICVbW05FWFRfT1VURVI6LipdXSA9IGdldGVsZW1lbnRwdHIgWzMgeCAlW1tTXV1dKiAle3suKn19LCBpMzIgMQorLy8gQ0hFQ0s6ICVbW05FWFRfT1VURVJfQVNfUzouKl1dID0gYml0Y2FzdCBbMyB4ICVbW1NdXV0qICVbW05FWFRfT1VURVJdXSB0byAlW1tTXV0qCisvLyBDSEVDSzogaWNtcCBlcSAlW1tTXV0qICVbW05FWFRfT1VURVJfQVNfU11dLCAlW1tFTkRfQVNfU11dCiAvLyBDSEVDSzogYnIgaTEKIC8vCiAvLyBDSEVDSzogfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2N4eDExLW5vcmV0dXJuLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9jeHgxMS1ub3JldHVybi5jcHAKaW5kZXggMzFjNjUxZC4uYjg3NmJiOSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2N4eDExLW5vcmV0dXJuLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvY3h4MTEtbm9yZXR1cm4uY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXN0ZD1jKysxMSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLXN0ZD1jKysxMSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIGludCBnKCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9jeHgxMS10aHJlYWQtbG9jYWwuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2N4eDExLXRocmVhZC1sb2NhbC5jcHAKaW5kZXggNTA5NTYyZC4uODY3MzRjZCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2N4eDExLXRocmVhZC1sb2NhbC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2N4eDExLXRocmVhZC1sb2NhbC5jcHAKQEAgLTEzNSw2ICsxMzUsMTYgQEAKICAgcmV0dXJuIGwoKTsKIH0KIAorc3RydWN0IFBSMTkyNTQgeworICBzdGF0aWMgdGhyZWFkX2xvY2FsIGludCBuOworICBpbnQgZigpOworfTsKKy8vIENIRUNLOiBkZWZpbmUge3suKn19IEBfWk43UFIxOTI1NDFmRXYoCitpbnQgUFIxOTI1NDo6ZigpIHsKKyAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pUSE43UFIxOTI1NDFuRSgKKyAgcmV0dXJuIHRoaXMtPm47Cit9CisKIC8vIENIRUNLOiBkZWZpbmUge3suKn19IEBbW1ZfTV9JTklUOi4qXV0oKQogLy8gQ0hFQ0s6IGxvYWQgaTgqIGJpdGNhc3QgKGk2NCogQF9aR1ZOMVZJaUUxbUUgdG8gaTgqKQogLy8gQ0hFQ0s6ICVbW1ZfTV9JTklUSUFMSVpFRDouKl1dID0gaWNtcCBlcSBpOCAle3suKn19LCAwCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvY3h4MTEtdW5yZXN0cmljdGVkLXVuaW9uLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9jeHgxMS11bnJlc3RyaWN0ZWQtdW5pb24uY3BwCmluZGV4IDAzOTc3NzUuLjJmMjJhZDIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9jeHgxMS11bnJlc3RyaWN0ZWQtdW5pb24uY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9jeHgxMS11bnJlc3RyaWN0ZWQtdW5pb24uY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIHN0cnVjdCBBIHsKICAgQSgpOyBBKGNvbnN0IEEmKTsgQShBJiYpOyBBICZvcGVyYXRvcj0oY29uc3QgQSYpOyBBICZvcGVyYXRvcj0oQSYmKTsgfkEoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWJ5dmFsLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWJ5dmFsLmNwcAppbmRleCBlNjMxN2ZjLi41YjA4NTBiIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1ieXZhbC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tYnl2YWwuY3BwCkBAIC0xLDQgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmcgLWcgLVMgJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gRklYTUU6IENoZWNrIElSIHJhdGhlciB0aGFuIGFzbSwgdGhlbiB0cmlwbGUgaXMgbm90IG5lZWRlZC4KKy8vIFJVTjogJWNsYW5nIC1YY2xhbmcgLXRyaXBsZT0laXRhbml1bV9hYmlfdHJpcGxlIC1nIC1TICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIC8vIFRlc3QgdG8gY2hlY2sgcHJlc2VuY2Ugb2YgZGVidWcgaW5mbyBmb3IgYnl2YWwgcGFyYW1ldGVyLgogLy8gUmFkYXIgODM1MDQzNi4KIGNsYXNzIERBRyB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1jaGFyMTYuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tY2hhcjE2LmNwcAppbmRleCAwNmEwNWIzLi5lNmUyZjE1IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1jaGFyMTYuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWNoYXIxNi5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtc3RkPWMrKzExIC1nICVzIC1vIC18IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1zdGQ9YysrMTEgLWcgJXMgLW8gLXwgRmlsZUNoZWNrICVzCiAKIC8vIDE2IGlzIERXX0FURV9VVEYgKDB4MTApIGVuY29kaW5nIGF0dHJpYnV0ZS4KIGNoYXIxNl90IGNoYXJfYSA9IHUnaCc7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1jbGFzcy1saW1pdGVkLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWNsYXNzLWxpbWl0ZWQuY3BwCmluZGV4IGE0YjlmNDYuLjMwYWJkMmQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWNsYXNzLWxpbWl0ZWQuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWNsYXNzLWxpbWl0ZWQuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmcgLWVtaXQtbGx2bSAtZyAtUyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZyAtZW1pdC1sbHZtIC1mbm8tc3RhbmRhbG9uZS1kZWJ1ZyAtZyAtUyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIG5hbWVzcGFjZSBQUjE2MjE0XzEgewogLy8gQ0hFQ0stREFHOiBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtmb29dIFtsaW5lIFtbQExJTkUrMV1dLCB7ey4qfX0gW2RlZl0KQEAgLTI0LDcgKzI0LDcgQEAKIH0KIAogbmFtZXNwYWNlIHRlc3QxIHsKLS8vIENIRUNLLURBRzogWyBEV19UQUdfc3RydWN0dXJlX3R5cGUgXSBbZm9vXSBbbGluZSBbW0BMSU5FKzFdXSwge3suKn19IFtkZWNsXQorLy8gQ0hFQ0stREFHOiBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtmb29dIFtsaW5lIFtbQExJTkUrMV1dLCB7ey4qfX0gW2RlZl0KIHN0cnVjdCBmb28gewogfTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tY2xhc3Mtbm9saW1pdC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1jbGFzcy1ub2xpbWl0LmNwcAppbmRleCBjZTcyYmQzLi43YTZlZTRkIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1jbGFzcy1ub2xpbWl0LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1jbGFzcy1ub2xpbWl0LmNwcApAQCAtMSw0ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC11bmstdW5rIC1mbm8tbGltaXQtZGVidWctaW5mbyAtbyAtIC1lbWl0LWxsdm0gLWcgJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC11bmstdW5rIC1mc3RhbmRhbG9uZS1kZWJ1ZyAtbyAtIC1lbWl0LWxsdm0gLWcgJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIE9uIERhcndpbiwgdGhpcyBzaG91bGQgYmUgdGhlIGRlZmF1bHQ6CisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1vIC0gLWVtaXQtbGx2bSAtZyAlcyB8IEZpbGVDaGVjayAlcwogCiBuYW1lc3BhY2UgcmRhcjE0MTAxMDk3XzEgeyAvLyBzZWUgYWxzbyBQUjE2MjE0CiAvLyBDaGVjayB0aGF0IHdlIGVtaXQgZGVidWcgaW5mbyBmb3IgdGhlIGRlZmluaXRpb24gb2YgYSBzdHJ1Y3QgaWYgdGhlCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1jbGFzcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1jbGFzcy5jcHAKaW5kZXggZTE0MDJjOS4uN2MyMmJlMSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tY2xhc3MuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWNsYXNzLmNwcApAQCAtMTAyLDEzICsxMDIsOSBAQAogLy8gQ0hFQ0s6IFtbQ19TXV0gPSB7ey4qfX0gOyBbIERXX1RBR19tZW1iZXIgXSBbc10ge3suKn19IFtzdGF0aWNdIFtmcm9tIGludF0KIC8vIENIRUNLOiBbW0NfRFRPUl1dID0ge3suKn19IDsgWyBEV19UQUdfc3VicHJvZ3JhbSBdIHt7Lip9fSBbfkNdCiAKLS8vIENIRUNLOiBtZXRhZGF0YSBbW0RfTUVNOiFbMC05XSpdXSwgaTMyIDAsIG51bGwsIG51bGwsIG1ldGFkYXRhICEiX1pUUzFEIn0gOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtEXSB7ey4qfX0gW2RlY2xdCi0vLyBDSEVDSzogW1tEX01FTV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSBbW0RfRlVOQzohWzAtOV0qXV19Ci0vLyBDSEVDSzogW1tEX0ZVTkNdXSA9IHt7Lip9fSA7IFsgRFdfVEFHX3N1YnByb2dyYW0gXSB7ey4qfX0gW2Z1bmNdCisvLyBDSEVDSzogbnVsbCwgaTMyIDAsIG51bGwsIG51bGwsIG1ldGFkYXRhICEiX1pUUzFEIn0gOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtEXSB7ey4qfX0gW2RlY2xdCiAvLyBDSEVDSzogbnVsbCwgaTMyIDAsIG51bGwsIG51bGwsIG1ldGFkYXRhICEiX1pUUzFFIn0gOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtFXSB7ey4qfX0gW2RlY2xdCi0vLyBDSEVDSzogW1tGOiFbMC05XSpdXSA9IHt7Lip9fSBtZXRhZGF0YSBbW0ZfTUVNOiFbMC05XSpdXSwgaTMyIDAsIG51bGwsIG51bGwsIG1ldGFkYXRhICEiX1pUUzFGIn0gOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtGXSB7ey4qfX0gW2RlY2xdCi0vLyBDSEVDSzogW1tGX01FTV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSBbW0ZfSTohWzAtOV0qXV19Ci0vLyBDSEVDSzogW1tGX0ldXSA9IHt7Lip9fSA7IFsgRFdfVEFHX21lbWJlciBdIFtpXQorLy8gQ0hFQ0s6IFtbRjohWzAtOV0qXV0gPSB7ey4qfX0gbnVsbCwgaTMyIDAsIG51bGwsIG51bGwsIG1ldGFkYXRhICEiX1pUUzFGIn0gOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtGXSB7ey4qfX0gW2RlY2xdCiAKIC8vIENIRUNLOiBudWxsLCBpMzIgMCwgbnVsbCwgbnVsbCwgbWV0YWRhdGEgISJfWlRTMUcifSA7IFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW0ddIHt7Lip9fSBbZGVjbF0KIC8vIENIRUNLOiBtZXRhZGF0YSBbW0dfSU5ORVJfTUVNOiFbMC05XSpdXSwgaTMyIDAsIG51bGwsIG51bGwsIG1ldGFkYXRhICEiX1pUU04xRzVpbm5lckUifSA7IFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW2lubmVyXSBbbGluZSA1MCwge3suKn19IFtkZWZdCkBAIC0xMTgsOCArMTE0LDEzIEBACiAvLyBDSEVDSzogOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtBXQogLy8gQ0hFQ0s6IEhkclNpemUKIC8vIENIRUNLOiA7IFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW0ldIHt7Lip9fSBbZGVmXQorLy8KKy8vIENIRUNLOiBtZXRhZGF0YSAhIl9aVFMxRCIsIHt7Lip9fSwgbWV0YWRhdGEgW1tEX0ZVTkNfREVDTDohWzAtOV0qXV0sIG1ldGFkYXRhIHt7IVswLTldKn19LCBpMzIge3tbMC05XSp9fX0gOyBbIERXX1RBR19zdWJwcm9ncmFtIF0ge3suKn19IFtkZWZdIFtmdW5jXQorLy8gQ0hFQ0s6IFtbRF9GVU5DX0RFQ0xdXSA9IHt7Lip9fSwgbWV0YWRhdGEgISJfWlRTMUQiLCB7ey4qfX0sIGkzMiAwLCBtZXRhZGF0YSB7eyFbMC05XSp9fSwgaTMyIHt7WzAtOV0qfX19IDsgWyBEV19UQUdfc3VicHJvZ3JhbSBdIHt7Lip9fSBbZnVuY10KIAotLy8gQ0hFQ0s6IFtbRl9JX0RFRjohWzAtOV0qXV0gPSB7ey4qfX0sIG1ldGFkYXRhIFtbRl9JXV19IDsgWyBEV19UQUdfdmFyaWFibGUgXSBbaV0KKy8vIENIRUNLOiBbW0ZfSV9ERUY6IVswLTldKl1dID0ge3suKn19LCBtZXRhZGF0YSBbW0ZfSTohWzAtOV0qXV19IDsgWyBEV19UQUdfdmFyaWFibGUgXSBbaV0KKworLy8gQ0hFQ0s6IFtbRl9JXV0gPSB7ey4qfX0sIG1ldGFkYXRhICEiX1pUUzFGIiwge3suKn19IDsgWyBEV19UQUdfbWVtYmVyIF0gW2ldCiAKIC8vIENIRUNLOiAhW1tFWENFUFRMT0NdXSA9IG1ldGFkYXRhICF7aTMyIDg0LAogLy8gQ0hFQ0s6ICFbW1JFVExPQ11dID0gbWV0YWRhdGEgIXtpMzIgODMsCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1jdG9yMi5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1jdG9yMi5jcHAKaW5kZXggMTliZDY0Yi4uM2JjOTMxZSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tY3RvcjIuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWN0b3IyLmNwcApAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nIC1mdmVyYm9zZS1hc20gLWcgLVMgJXMgLW8gLSB8IGdyZXAgQVRfZXhwbGljaXQKKy8vIEZJWE1FOiBDaGVjayBJUiByYXRoZXIgdGhhbiBhc20sIHRoZW4gdHJpcGxlIGlzIG5vdCBuZWVkZWQuCisvLyBSVU46ICVjbGFuZyAtWGNsYW5nIC10cmlwbGU9JWl0YW5pdW1fYWJpX3RyaXBsZSAtZnZlcmJvc2UtYXNtIC1nIC1TICVzIC1vIC0gfCBncmVwIEFUX2V4cGxpY2l0CiAKIAogY2xhc3MgTXlDbGFzcwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tZHVwLWZ3ZC1kZWNsLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWR1cC1md2QtZGVjbC5jcHAKaW5kZXggMDRmZTdhMC4uMWI5YTA1NSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tZHVwLWZ3ZC1kZWNsLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1kdXAtZndkLWRlY2wuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLWcgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1mbm8tbGltaXQtZGVidWctaW5mbyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtZyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLWZzdGFuZGFsb25lLWRlYnVnICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogY2xhc3MgVGVzdAogewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tZW51bS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1lbnVtLmNwcAppbmRleCBmMGUyNjA4Li43ZTAyZWRlIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1lbnVtLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1lbnVtLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtZyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIC8vIENIRUNLOiBbW0VOVU1TOiFbMC05XSpdXSwge3tbXixdKn19LCB7e1teLF0qfX0sIHt7W14sXSp9fSwge3tbXixdKn19LCB7e1teLF0qfX19IDsgWyBEV19UQUdfY29tcGlsZV91bml0IF0KIC8vIENIRUNLOiBbW0VOVU1TXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhIFtbRTE6IVswLTldKl1dLCBtZXRhZGF0YSBbW0UyOiFbMC05XSpdXSwgbWV0YWRhdGEgW1tFMzohWzAtOV0qXV19CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1nbGluZS10YWJsZXMtb25seS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1nbGluZS10YWJsZXMtb25seS5jcHAKaW5kZXggN2VjZGViMi4uYjc2NmM3MyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tZ2xpbmUtdGFibGVzLW9ubHkuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWdsaW5lLXRhYmxlcy1vbmx5LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZ2xpbmUtdGFibGVzLW9ubHkgLVMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWZuby1ydHRpIC1nbGluZS10YWJsZXMtb25seSAtUyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIC8vIENoZWNrcyB0aGF0IGNsYW5nIHdpdGggIi1nbGluZS10YWJsZXMtb25seSIgZG9lc24ndCBlbWl0IGRlYnVnIGluZm8KIC8vIGZvciB2YXJpYWJsZXMgYW5kIHR5cGVzLgogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1nbG9iYWwtY3Rvci1kdG9yLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWdsb2JhbC1jdG9yLWR0b3IuY3BwCmluZGV4IGFmYTc3MDcuLjI4YjFmYWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWdsb2JhbC1jdG9yLWR0b3IuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWdsb2JhbC1jdG9yLWR0b3IuY3BwCkBAIC0xLDYgKzEsNiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1nIC1mbm8tdXNlLWN4YS1hdGV4aXQgLVMgLWVtaXQtbGx2bSAtbyAtIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWZuby11c2UtY3hhLWF0ZXhpdCAtUyAtZW1pdC1sbHZtIC1vIC0gXAogLy8gUlVOOiAgICAgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTk9LRVhUCi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLWcgLWZuby11c2UtY3hhLWF0ZXhpdCAtZmFwcGxlLWtleHQgLVMgLWVtaXQtbGx2bSAtbyAtIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWZuby11c2UtY3hhLWF0ZXhpdCAtZmFwcGxlLWtleHQgLVMgLWVtaXQtbGx2bSAtbyAtIFwKIC8vIFJVTjogICAgIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLUtFWFQKIAogY2xhc3MgQSB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1pbmRpcmVjdC1maWVsZC1kZWNsLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWluZGlyZWN0LWZpZWxkLWRlY2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWNlYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1pbmRpcmVjdC1maWVsZC1kZWNsLmNwcApAQCAtMCwwICsxLDE3IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtZyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8KKy8vIFRlc3QgdGhhdCBpbmRpcmVjdCBmaWVsZCBkZWNscyBhcmUgaGFuZGxlZCBncmFjZWZ1bGx5LgorLy8gcmRhcjovL3Byb2JsZW0vMTYzNDg1NzUKKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgaW50IFQ6OipwdHI+IGNsYXNzIEZvbyB7ICB9OworCitzdHJ1Y3QgQmFyIHsKKyAgaW50IGkxOworICAvLyBDSEVDSzogWyBEV19UQUdfbWVtYmVyIF0gW2xpbmUgW1tATElORSsxXV0sIHNpemUgMzIsIGFsaWduIDMyLCBvZmZzZXQgMzJdIFtmcm9tIF9aVFNOM0JhclV0X0VdCisgIHVuaW9uIHsKKyAgICAvLyBDSEVDSzogWyBEV19UQUdfbWVtYmVyIF0gW2kyXSBbbGluZSBbW0BMSU5FKzFdXSwgc2l6ZSAzMiwgYWxpZ24gMzIsIG9mZnNldCAwXSBbZnJvbSBpbnRdCisgICAgaW50IGkyOworICB9OworfTsKKworRm9vPEJhciwgJkJhcjo6aTI+IHRoZV9mb287CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1saW1pdGVkLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWxpbWl0ZWQuY3BwCmluZGV4IDU0YTI0MjQuLjI5NGQxZjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWxpbWl0ZWQuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLWxpbWl0ZWQuY3BwCkBAIC0xMSw4ICsxMSw3IEBACiAgIHJldHVybiBhOwogfQogCi0vLyBWZXJpZnkgdGhhdCB3ZSdyZSBub3QgZW1pdHRpbmcgYSBmdWxsIGRlZmluaXRpb24gb2YgQiBpbiBsaW1pdCBkZWJ1ZyBtb2RlLgotLy8gQ0hFQ0s6IDsgWyBEV19UQUdfY2xhc3NfdHlwZSBdIFtCXSB7ey4qfX0gW2RlY2xdCisvLyBDSEVDSzogOyBbIERXX1RBR19jbGFzc190eXBlIF0gW0JdIHt7Lip9fSBbZGVmXQogCiBjbGFzcyBCIHsKIHB1YmxpYzoKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLW1lbWJlci5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1tZW1iZXIuY3BwCmluZGV4IDhjMmUzZWIuLjdiYTk3YjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLW1lbWJlci5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tbWVtYmVyLmNwcApAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nIC1mdmVyYm9zZS1hc20gLWcgLVMgJXMgLW8gLSB8IGdyZXAgRFdfQUNDRVNTX3B1YmxpYworLy8gRklYTUU6IENoZWNrIElSIHJhdGhlciB0aGFuIGFzbSwgdGhlbiB0cmlwbGUgaXMgbm90IG5lZWRlZC4KKy8vIFJVTjogJWNsYW5nIC1YY2xhbmcgLXRyaXBsZT0laXRhbml1bV9hYmlfdHJpcGxlIC1mdmVyYm9zZS1hc20gLWcgLVMgJXMgLW8gLSB8IGdyZXAgRFdfQUNDRVNTX3B1YmxpYwogY2xhc3MgQSB7CiBwdWJsaWM6CiAgIGludCB4OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tbWV0aG9kLXNwZWMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tbWV0aG9kLXNwZWMuY3BwCmluZGV4IDIwNjhjNWMuLmMwMGRhMDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLW1ldGhvZC1zcGVjLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1tZXRob2Qtc3BlYy5jcHAKQEAgLTEsNCArMSw1IEBACi0vLyBSVU46ICVjbGFuZyAtZnZlcmJvc2UtYXNtIC1nIC1TICVzIC1vIC0gfCBncmVwIERXX0FUX3NwZWNpZmljYXRpb24KKy8vIEZJWE1FOiBDaGVjayBJUiByYXRoZXIgdGhhbiBhc20sIHRoZW4gdHJpcGxlIGlzIG5vdCBuZWVkZWQuCisvLyBSVU46ICVjbGFuZyAtWGNsYW5nIC10cmlwbGU9JWl0YW5pdW1fYWJpX3RyaXBsZSAtZnZlcmJvc2UtYXNtIC1nIC1TICVzIC1vIC0gfCBncmVwIERXX0FUX3NwZWNpZmljYXRpb24KIC8vIFJhZGFyIDkyNTQ0OTEKIGNsYXNzIEEgewogcHVibGljOgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tbWV0aG9kLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLW1ldGhvZC5jcHAKaW5kZXggNTBiM2Y2Ni4uNDliOGRjNCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tbWV0aG9kLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1tZXRob2QuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXN0ZD1jKysxMSAtZyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLXN0ZD1jKysxMSAtZyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAvLyBDSEVDSzogbWV0YWRhdGEgISJfWlRTMUEifSA7IFsgRFdfVEFHX2NsYXNzX3R5cGUgXSBbQV0KIC8vIENIRUNLOiBtZXRhZGF0YSAhIl9aTjFBM2Zvb0VpU18zJF8wIiwge3suKn19IFtwcm90ZWN0ZWRdCiAvLyBDSEVDSzogIVtbVEhJU1RZUEU6WzAtOV0rXV0gPSB7ey4qfX0gOyBbIERXX1RBR19wb2ludGVyX3R5cGUgXSB7ey4qfX0gW2FydGlmaWNpYWxdIFtmcm9tIF9aVFMxQV0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLW1ldGhvZDIuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tbWV0aG9kMi5jcHAKaW5kZXggYTkyN2M0OS4uYTM2NTMxMiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tbWV0aG9kMi5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tbWV0aG9kMi5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZsaW1pdC1kZWJ1Zy1pbmZvIC14IGMrKyAtZyAtUyAtZW1pdC1sbHZtIDwgJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXN0YW5kYWxvbmUtZGVidWcgLXggYysrIC1nIC1TIC1lbWl0LWxsdm0gPCAlcyB8IEZpbGVDaGVjayAlcwogLy8gcmRhcjovLzEwMzM2ODQ1CiAvLyBQcmVzZXJ2ZSB0eXBlIHF1YWxpZmllcnMgaW4gLWZsaW1pdC1kZWJ1Zy1pbmZvIG1vZGUuCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLW5hbWVzcGFjZS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1uYW1lc3BhY2UuY3BwCmluZGV4IGEyZDdlZGUuLjQ3MzAzNGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLW5hbWVzcGFjZS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tbmFtZXNwYWNlLmNwcApAQCAtMSw2ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nIC1nIC1TIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcwotLy8gUlVOOiAlY2xhbmcgLWcgLWdsaW5lLXRhYmxlcy1vbmx5IC1TIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUdNTFQgJXMKLS8vIFJVTjogJWNsYW5nIC1nIC1mbm8tbGltaXQtZGVidWctaW5mbyAtUyAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1OT0xJTUlUICVzCisvLyBSVU46ICVjbGFuZyAtZyAtZm5vLXN0YW5kYWxvbmUtZGVidWcgLVMgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZyAtZyAtZ2xpbmUtdGFibGVzLW9ubHkgICAgLVMgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stR01MVCAlcworLy8gUlVOOiAlY2xhbmcgLWcgLWZzdGFuZGFsb25lLWRlYnVnICAgIC1TIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLU5PTElNSVQgJXMKIAogbmFtZXNwYWNlIEEgewogI2xpbmUgMSAiZm9vLmNwcCIKQEAgLTM2LDEwICszNiwxNCBAQAogICByZXR1cm4gaSArIFg6OkI6OmkgKyBZOjpCOjppOwogfQogCituYW1lc3BhY2UgQSB7Cit1c2luZyBCOjppOworfQorCiAvLyBUaGlzIHNob3VsZCB3b3JrIGV2ZW4gaWYgJ2knIGFuZCAnZnVuYycgd2VyZSBkZWNsYXJhdGlvbnMgJiBub3QgZGVmaW5pdGlvbnMsCiAvLyBidXQgaXQgZG9lc24ndCB5ZXQuCiAKLS8vIENIRUNLOiBbW0NVOiFbMC05XSpdXSA9IHt7Lip9fVtbTU9EVUxFUzohWzAtOV0qXV0sIG1ldGFkYXRhICEiIn0gOyBbIERXX1RBR19jb21waWxlX3VuaXQgXQorLy8gQ0hFQ0s6IFtbQ1U6IVswLTldKl1dID0ge3suKn19W1tNT0RVTEVTOiFbMC05XSpdXSwgbWV0YWRhdGEgISIiLCBpMzIgMX0gOyBbIERXX1RBR19jb21waWxlX3VuaXQgXQogLy8gQ0hFQ0s6IFtbRklMRTohWzAtOV0qXV0ge3suKn19ZGVidWctaW5mby1uYW1lc3BhY2UuY3BwIgogLy8gQ0hFQ0s6IFtbRk9POiFbMC05XSpdXSB7ey4qfX0gOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtmb29dIFtsaW5lIDUsIHNpemUgMCwgYWxpZ24gMCwgb2Zmc2V0IDBdIFtkZWNsXSBbZnJvbSBdCiAvLyBDSEVDSzogW1tGT09DUFA6IVswLTldKl1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImZvby5jcHAiLCB7ey4qfX0KQEAgLTUwLDcgKzU0LDcgQEAKIC8vIENIRUNLOiBbW0ZVTkM6IVswLTldKl1dIHt7Lip9fSA7IFsgRFdfVEFHX3N1YnByb2dyYW0gXSB7ey4qfX0gW2RlZl0gW2Z1bmNdCiAvLyBDSEVDSzogW1tGSUxFMl1dfSA7IFsgRFdfVEFHX2ZpbGVfdHlwZSBdIFt7ey4qfX1mb28uY3BwXQogLy8gQ0hFQ0s6IFtbSTohWzAtOV0qXV0gPSB7ey4qfX0sIG1ldGFkYXRhIFtbTlNdXSwgbWV0YWRhdGEgISJpIiwge3suKn19IDsgWyBEV19UQUdfdmFyaWFibGUgXSBbaV0KLS8vIENIRUNLOiBbW01PRFVMRVNdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgW1tNMTohWzAtOV0qXV0sIG1ldGFkYXRhIFtbTTI6IVswLTldKl1dLCBtZXRhZGF0YSBbW00zOiFbMC05XSpdXSwgbWV0YWRhdGEgW1tNNDohWzAtOV0qXV0sIG1ldGFkYXRhIFtbTTU6IVswLTldKl1dLCBtZXRhZGF0YSBbW002OiFbMC05XSpdXSwgbWV0YWRhdGEgW1tNNzohWzAtOV0qXV0sIG1ldGFkYXRhIFtbTTg6IVswLTldKl1dLCBtZXRhZGF0YSBbW005OiFbMC05XSpdXSwgbWV0YWRhdGEgW1tNMTA6IVswLTldKl1dLCBtZXRhZGF0YSBbW00xMTohWzAtOV0qXV0sIG1ldGFkYXRhIFtbTTEyOiFbMC05XSpdXX0KKy8vIENIRUNLOiBbW01PRFVMRVNdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgW1tNMTohWzAtOV0qXV0sIG1ldGFkYXRhIFtbTTI6IVswLTldKl1dLCBtZXRhZGF0YSBbW00zOiFbMC05XSpdXSwgbWV0YWRhdGEgW1tNNDohWzAtOV0qXV0sIG1ldGFkYXRhIFtbTTU6IVswLTldKl1dLCBtZXRhZGF0YSBbW002OiFbMC05XSpdXSwgbWV0YWRhdGEgW1tNNzohWzAtOV0qXV0sIG1ldGFkYXRhIFtbTTg6IVswLTldKl1dLCBtZXRhZGF0YSBbW005OiFbMC05XSpdXSwgbWV0YWRhdGEgW1tNMTA6IVswLTldKl1dLCBtZXRhZGF0YSBbW00xMTohWzAtOV0qXV0sIG1ldGFkYXRhIFtbTTEyOiFbMC05XSpdXSwgbWV0YWRhdGEgW1tNMTM6IVswLTldKl1dfQogLy8gQ0hFQ0s6IFtbTTFdXSA9IG1ldGFkYXRhICF7aTMyIHt7WzAtOV0qfX0sIG1ldGFkYXRhIFtbQ1RYVF1dLCBtZXRhZGF0YSBbW05TXV0sIGkzMiAxMX0gOyBbIERXX1RBR19pbXBvcnRlZF9tb2R1bGUgXQogLy8gQ0hFQ0s6IFtbTTJdXSA9IG1ldGFkYXRhICF7aTMyIHt7WzAtOV0qfX0sIG1ldGFkYXRhIFtbQ1VdXSwgbWV0YWRhdGEgW1tDVFhUXV0sIGkzMiB7e1swLTldKn19fSA7IFsgRFdfVEFHX2ltcG9ydGVkX21vZHVsZSBdCiAvLyBDSEVDSzogW1tNM11dID0gbWV0YWRhdGEgIXtpMzIge3tbMC05XSp9fSwgbWV0YWRhdGEgW1tDVV1dLCBtZXRhZGF0YSBbW0NUWFRdXSwgaTMyIDE1LCBtZXRhZGF0YSAhIkUifSA7IFsgRFdfVEFHX2ltcG9ydGVkX21vZHVsZSBdCkBAIC01OCwyMCArNjIsMjIgQEAKIC8vIENIRUNLOiBbW0xFWDJdXSA9IG1ldGFkYXRhICF7aTMyIHt7WzAtOV0qfX0sIG1ldGFkYXRhIFtbRklMRTJdXSwgbWV0YWRhdGEgW1tMRVgxOiFbMC05XStdXSwgaTMyIHt7WzAtOV0qfX0sIGkzMiAwLCBpMzIge3suKn19fSA7IFsgRFdfVEFHX2xleGljYWxfYmxvY2sgXQogLy8gQ0hFQ0s6IFtbTEVYMV1dID0gbWV0YWRhdGEgIXtpMzIge3tbMC05XSp9fSwgbWV0YWRhdGEgW1tGSUxFMl1dLCBtZXRhZGF0YSBbW0ZVTkNdXSwgaTMyIHt7WzAtOV0qfX0sIGkzMiAwLCBpMzIge3suKn19fSA7IFsgRFdfVEFHX2xleGljYWxfYmxvY2sgXQogLy8gQ0hFQ0s6IFtbTTVdXSA9IG1ldGFkYXRhICF7aTMyIHt7WzAtOV0qfX0sIG1ldGFkYXRhIFtbRlVOQ11dLCBtZXRhZGF0YSBbW0NUWFRdXSwgaTMyIHt7WzAtOV0qfX19IDsgWyBEV19UQUdfaW1wb3J0ZWRfbW9kdWxlIF0KLS8vIENIRUNLOiBbW002XV0gPSBtZXRhZGF0YSAhe2kzMiB7e1swLTldKn19LCBtZXRhZGF0YSBbW0ZVTkNdXSwgbWV0YWRhdGEgW1tGT086IVswLTldKl1dLCBpMzIgMjN9IDsgWyBEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb24gXQotLy8gQ0hFQ0s6IFtbTTddXSA9IG1ldGFkYXRhICF7aTMyIHt7WzAtOV0qfX0sIG1ldGFkYXRhIFtbRlVOQ11dLCBtZXRhZGF0YSBbW0JBUjohWzAtOV0qXV0sIGkzMiB7e1swLTldKn19fSA7IFsgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uIF0KKy8vIENIRUNLOiBbW002XV0gPSBtZXRhZGF0YSAhe2kzMiB7e1swLTldKn19LCBtZXRhZGF0YSBbW0ZVTkNdXSwgbWV0YWRhdGEgW1tGT086ISJfWlRTTjFBMUIzZm9vRSJdXSwgaTMyIDIzfSA7IFsgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uIF0KKy8vIENIRUNLOiBbW003XV0gPSBtZXRhZGF0YSAhe2kzMiB7e1swLTldKn19LCBtZXRhZGF0YSBbW0ZVTkNdXSwgbWV0YWRhdGEgW1tCQVI6ISJfWlRTTjFBMUIzYmFyRSJdXSwgaTMyIHt7WzAtOV0qfX19IDsgWyBEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb24gXQogLy8gQ0hFQ0s6IFtbTThdXSA9IG1ldGFkYXRhICF7aTMyIHt7WzAtOV0qfX0sIG1ldGFkYXRhIFtbRlVOQ11dLCBtZXRhZGF0YSBbW0YxXV0sIGkzMiB7e1swLTldKn19fSA7IFsgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uIF0KIC8vIENIRUNLOiBbW005XV0gPSBtZXRhZGF0YSAhe2kzMiB7e1swLTldKn19LCBtZXRhZGF0YSBbW0ZVTkNdXSwgbWV0YWRhdGEgW1tJXV0sIGkzMiB7e1swLTldKn19fSA7IFsgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uIF0KIC8vIENIRUNLOiBbW00xMF1dID0gbWV0YWRhdGEgIXtpMzIge3tbMC05XSp9fSwgbWV0YWRhdGEgW1tGVU5DXV0sIG1ldGFkYXRhIFtbQkFaOiFbMC05XSpdXSwgaTMyIHt7WzAtOV0qfX19IDsgWyBEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb24gXQogLy8gQ0hFQ0s6IFtbQkFaXV0gPSBtZXRhZGF0YSAhe2kzMiB7e1swLTldKn19LCBtZXRhZGF0YSBbW0ZPT0NQUF1dLCBtZXRhZGF0YSBbW05TXV0sIHt7Lip9fSwgbWV0YWRhdGEgISJfWlRTTjFBMUIzYmFyRSJ9IDsgWyBEV19UQUdfdHlwZWRlZiBdIFtiYXpdIHt7Lip9fSBbZnJvbSBfWlRTTjFBMUIzYmFyRV0KIC8vIENIRUNLOiBbW00xMV1dID0gbWV0YWRhdGEgIXtpMzIge3tbMC05XSp9fSwgbWV0YWRhdGEgW1tGVU5DXV0sIG1ldGFkYXRhIFtbQ1RYVF1dLCBpMzIge3tbMC05XSp9fSwgbWV0YWRhdGEgISJYIn0gOyBbIERXX1RBR19pbXBvcnRlZF9tb2R1bGUgXQogLy8gQ0hFQ0s6IFtbTTEyXV0gPSBtZXRhZGF0YSAhe2kzMiB7e1swLTldKn19LCBtZXRhZGF0YSBbW0ZVTkNdXSwgbWV0YWRhdGEgW1tNMTFdXSwgaTMyIHt7WzAtOV0qfX0sIG1ldGFkYXRhICEiWSJ9IDsgWyBEV19UQUdfaW1wb3J0ZWRfbW9kdWxlIF0KKy8vIENIRUNLOiBbW00xM11dID0gbWV0YWRhdGEgIXtpMzIge3tbMC05XSp9fSwgbWV0YWRhdGEgW1tDVFhUXV0sIG1ldGFkYXRhIFtbSV1dLCBpMzIge3tbMC05XSp9fX0gOyBbIERXX1RBR19pbXBvcnRlZF9kZWNsYXJhdGlvbiBdCiAKLS8vIENIRUNLLUdNTFQ6IFtbQ1U6IVswLTldKl1dID0ge3suKn19W1tNT0RVTEVTOiFbMC05XSpdXSwgbWV0YWRhdGEgISIifSA7IFsgRFdfVEFHX2NvbXBpbGVfdW5pdCBdCi0vLyBDSEVDSy1HTUxUOiBbW01PRFVMRVNdXSA9IG1ldGFkYXRhICF7aTMyIDB9CisvLyBDSEVDSy1HTUxUOiBbW0NVOiFbMC05XSpdXSA9IHt7Lip9fVtbTU9EVUxFUzohWzAtOV0qXV0sIG1ldGFkYXRhICEiIiwgaTMyIDJ9IDsgWyBEV19UQUdfY29tcGlsZV91bml0IF0KKy8vIENIRUNLLUdNTFQ6IFtbTU9EVUxFU11dID0gbWV0YWRhdGEgIXt9CiAKIC8vIENIRUNLLU5PTElNSVQ6IDsgWyBEV19UQUdfc3RydWN0dXJlX3R5cGUgXSBbYmFyXSBbbGluZSA2LCB7ey4qfX1dIFtkZWZdIFtmcm9tIF0KIAogLy8gRklYTUU6IEl0IGlzIGNvbmZ1c2VkIG9uIHdpbjMyIHRvIGdlbmVyYXRlIGZpbGUgZW50cnkgd2hlbiBkb3Npc2ggZmlsZW5hbWUgaXMgZ2l2ZW4uCiAvLyBSRVFVSVJFUzogc2hlbGwKIC8vIFJFUVVJUkVTOiBzaGVsbC1wcmVzZXJ2ZXMtcm9vdAorLy8gUkVRVUlSRVM6IGR3MgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tcHVidHlwZXMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tcHVidHlwZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzkzY2RkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXB1YnR5cGVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8vIFJFUVVJUkVTOiB4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAgLWcgLWZuby1saW1pdC1kZWJ1Zy1pbmZvIC1TIC1tbGx2bSAtZ2VuZXJhdGUtZHdhcmYtcHViLXNlY3Rpb25zPUVuYWJsZSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCi0KLS8vIEZJWE1FOiBUaGlzIHRlc3RjYXNlIHNob3VsZG4ndCByZWx5IG9uIGFzc2VtYmx5IGVtaXNzaW9uLgotLy9DSEVDSzogTHB1YnR5cGVzX2JlZ2luW1tTRUNOVU06WzAtOV06XV0KLS8vQ0hFQ0s6ICAgICAgICAgLmFzY2l6ICAgIkciCi0vL0NIRUNLLU5FWFQ6ICAgIC5sb25nICAgMAotLy9DSEVDSy1ORVhUOiBMcHVidHlwZXNfZW5kW1tTRUNOVU1dXQotCi1jbGFzcyBHIHsKLXB1YmxpYzoKLSAgdm9pZCBmb28oKTsKLX07Ci0KLXZvaWQgRzo6Zm9vKCkgewotfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tcXVhbGlmaWVycy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1xdWFsaWZpZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI5MzVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tcXVhbGlmaWVycy5jcHAKQEAgLTAsMCArMSwyNiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAtZyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gVGVzdCAocil2YWx1ZSBhbmQgQ1ZSIHF1YWxpZmllcnMgb24gQysrMTEgbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zLgorY2xhc3MgQSB7CitwdWJsaWM6CisgIC8vIENIRUNLOiBpMzIgW1tATElORSsyXV0sIG1ldGFkYXRhICFbW1BMU1I6WzAtOV0rXV0sIHt7Lip9fVsgRFdfVEFHX3N1YnByb2dyYW0gXSBbbGluZSBbW0BMSU5FKzJdXV0gW3JlZmVyZW5jZV0gW2xdCisgIC8vIENIRUNLOiAhW1tQTFNSXV0gPXt7Lip9fVsgRFdfVEFHX3N1YnJvdXRpbmVfdHlwZSBde3suKn19W3JlZmVyZW5jZV0KKyAgdm9pZCBsKCkgY29uc3QgJjsKKyAgLy8gQ0hFQ0s6ICFbW0FSR1M6WzAtOV0rXV0gPSBtZXRhZGF0YSAhe251bGwsIG1ldGFkYXRhICFbW1RISVM6WzAtOV0rXV19CisgIC8vIENIRUNLOiAhW1tUSElTXV0gPSB7ey4qfX0gbWV0YWRhdGEgIVtbQ09OU1RfQTouKl1dfSA7IFsgRFdfVEFHX3BvaW50ZXJfdHlwZSBdCisgIC8vIENIRUNLOiAhW1tDT05TVF9BXV0gPSB7ey4qfX0gWyBEV19UQUdfY29uc3RfdHlwZSBdCisgIC8vIENIRUNLOiBpMzIgW1tATElORSsyXV0sIG1ldGFkYXRhICFbW1BSU1I6WzAtOV0rXV0sIHt7Lip9fVsgRFdfVEFHX3N1YnByb2dyYW0gXSBbbGluZSBbW0BMSU5FKzJdXV0gW3J2YWx1ZSByZWZlcmVuY2VdIFtyXQorICAvLyBDSEVDSzogIVtbUFJTUl1dID17ey4qfX1tZXRhZGF0YSAhW1tBUkdTXV0sIGkzMiAwLCBudWxsLCBudWxsLCBudWxsfXt7Lip9fVsgRFdfVEFHX3N1YnJvdXRpbmVfdHlwZSBde3suKn19W3J2YWx1ZSByZWZlcmVuY2VdCisgIHZvaWQgcigpIGNvbnN0ICYmOworfTsKKwordm9pZCBnKCkgeworICBBIGE7CisgIC8vIFRoZSB0eXBlIG9mIHBsIGlzICJ2b2lkIChBOjoqKSgpIGNvbnN0ICYiLgorICAvLyBDSEVDSzogbWV0YWRhdGEgIVtbUEw6WzAtOV0rXV0sIGkzMiAwLCBpMzIgMH0gOyBbIERXX1RBR19hdXRvX3ZhcmlhYmxlIF0gW3BsXSBbbGluZSBbW0BMSU5FKzJdXV0KKyAgLy8gQ0hFQ0s6IG1ldGFkYXRhICFbW1BMU1JdXSwgbWV0YWRhdGEgISJ7ey4qfX0ifSA7IFsgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSBdCisgIGF1dG8gcGwgPSAmQTo6bDsKKworICAvLyBDSEVDSzogbWV0YWRhdGEgIVtbUFI6WzAtOV0rXV0sIGkzMiAwLCBpMzIgMH0gOyBbIERXX1RBR19hdXRvX3ZhcmlhYmxlIF0gW3ByXSBbbGluZSBbW0BMSU5FKzJdXV0KKyAgLy8gQ0hFQ0s6IG1ldGFkYXRhICFbW1BSU1JdXSwgbWV0YWRhdGEgISJ7ey4qfX0ifSA7IFsgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSBdCisgIGF1dG8gcHIgPSAmQTo6cjsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXNhbWUtbGluZS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1zYW1lLWxpbmUuY3BwCmluZGV4IDUxOWU5ZWUuLjA1YjQyNmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXNhbWUtbGluZS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tc2FtZS1saW5lLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIC8vIE1ha2Ugc3VyZSB0aGF0IGNsYW5nIG91dHB1dHMgZGlzdGluY3QgZGVidWcgaW5mbyBmb3IgYSBmdW5jdGlvbgogLy8gdGhhdCBpcyBpbmxpbmVkIHR3aWNlIG9uIHRoZSBzYW1lIGxpbmUuIE90aGVyd2lzZSBpdCB3b3VsZCBhcHBlYXIKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXNjb3BlLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXNjb3BlLmNwcAppbmRleCA1NTdlZTMxLi4wNDQ3ZGMwIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby1zY29wZS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tc2NvcGUuY3BwCkBAIC0xNywxMiArMTcsMTIgQEAKIAogaW50IG1haW4yKCkgewogLy8gQ0hFQ0s6IFsgRFdfVEFHX2F1dG9fdmFyaWFibGUgXSBbcHRyXSBbbGluZSBbW0BMSU5FKzJdXV0KLS8vIENIRUNLIG1ldGFkYXRhICF7aTMyIHt7Lip9fSwgbWV0YWRhdGEgIXt7Lip9fSwgaTMyIFtbQExJTkUrMV1dLCB7ey4qfX19IDsgWyBEV19UQUdfbGV4aWNhbF9ibG9jayBdCisvLyBDSEVDSzogbWV0YWRhdGEgIXtpMzIge3suKn19LCBtZXRhZGF0YSAhe3suKn19LCBpMzIgW1tATElORSsxXV0sIHt7Lip9fX0gOyBbIERXX1RBR19sZXhpY2FsX2Jsb2NrIF0KICAgaWYgKGNoYXIgKnB0ciA9IHJldHVybl9jaGFyKDEpKSB7CiAgICAgcHJpbnRmICgiJXMiLCBwdHIpOwogICB9CiAvLyBDSEVDSzogWyBEV19UQUdfYXV0b192YXJpYWJsZSBdIFtwdHJdIFtsaW5lIFtbQExJTkUrMl1dXQotLy8gQ0hFQ0sgbWV0YWRhdGEgIXtpMzIge3suKn19LCBtZXRhZGF0YSAhe3suKn19LCBpMzIgW1tATElORSsxXV0sIHt7Lip9fX0gOyBbIERXX1RBR19sZXhpY2FsX2Jsb2NrIF0KKy8vIENIRUNLOiBtZXRhZGF0YSAhe2kzMiB7ey4qfX0sIG1ldGFkYXRhICF7ey4qfX0sIGkzMiBbW0BMSU5FKzFdXSwge3suKn19fSA7IFsgRFdfVEFHX2xleGljYWxfYmxvY2sgXQogICBpZiAoY2hhciAqcHRyID0gcmV0dXJuX2NoYXIoMikpIHsKICAgICBwcmludGYgKCIlcyIsIHB0cik7CiAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXRlbXBsYXRlLWV4cGxpY2l0LXNwZWNpYWxpemF0aW9uLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXRlbXBsYXRlLWV4cGxpY2l0LXNwZWNpYWxpemF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDZjMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdGVtcGxhdGUtZXhwbGljaXQtc3BlY2lhbGl6YXRpb24uY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZyAlcyAtbyAtIC1mbm8tc3RhbmRhbG9uZS1kZWJ1ZyB8IEZpbGVDaGVjayAlcworCisvLyBSdW4gYWdhaW4gd2l0aCAtZ2xpbmUtdGFibGVzLW9ubHkgYW5kIHZlcmlmeSB3ZSBkb24ndCBjcmFzaC4gIFdlIHdvbid0IG91dHB1dAorLy8gdHlwZSBpbmZvIGF0IGFsbC4KKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZyAlcyAtbyAtIC1nbGluZS10YWJsZXMtb25seSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IExJTkVTLU9OTFkKKworLy8gTElORVMtT05MWS1OT1Q6IERXX1RBR19zdHJ1Y3R1cmVfdHlwZQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBhIHsKK307CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgYTxpbnQ+OworLy8gQ0hFQ0stTk9UOiA7IFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW2E8aW50Pl0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgYiB7Cit9OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGI8aW50PjsKK2I8aW50PiBiaTsKKy8vIENIRUNLOiA7IFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW2I8aW50Pl0ge3suKn19IFtkZWZdCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGMgeworICB2b2lkIGYoKSB7fQorfTsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBjPGludD47CitjPGludD4gY2k7CisvLyBDSEVDSzogOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtjPGludD5dIHt7Lip9fSBbZGVjbF0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZCB7CisgIHZvaWQgZigpOworfTsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBkPGludD47CitkPGludD4gZGk7CisvLyBDSEVDSzogOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtkPGludD5dIHt7Lip9fSBbZGVmXQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBlIHsKKyAgdm9pZCBmKCk7Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIGU8VD46OmYoKSB7Cit9CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgZTxpbnQ+OworZTxpbnQ+IGVpOworLy8gVGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCB0aGUgb3V0IG9mIGxpbmUgZGVmaW5pdGlvbiB3aWxsIGFwcGVhciBiZWZvcmUgdGhlCisvLyBleHBsaWNpdCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGRlZmluaXRpb24sIHNvIGNvbnNlcnZhdGl2ZWx5IGVtaXQgdGhlIHR5cGUKKy8vIGRlZmluaXRpb24gaGVyZS4KKy8vIENIRUNLOiA7IFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW2U8aW50Pl0ge3suKn19IFtkZWZdCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGYgeworICB2b2lkIGcoKTsKK307CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgZjxpbnQ+OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIGY8VD46OmcoKSB7Cit9CitmPGludD4gZmk7CisvLyBDSEVDSzogOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtmPGludD5dIHt7Lip9fSBbZGVmXQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBnIHsKKyAgdm9pZCBmKCk7Cit9OwordGVtcGxhdGUgPD4KK3ZvaWQgZzxpbnQ+OjpmKCk7CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgZzxpbnQ+OworZzxpbnQ+IGdpOworLy8gQ0hFQ0s6IDsgWyBEV19UQUdfc3RydWN0dXJlX3R5cGUgXSBbZzxpbnQ+XSB7ey4qfX0gW2RlZl0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaCB7Cit9OwordGVtcGxhdGUgY2xhc3MgaDxpbnQ+OworLy8gQ0hFQ0s6IDsgWyBEV19UQUdfc3RydWN0dXJlX3R5cGUgXSBbaDxpbnQ+XSB7ey4qfX0gW2RlZl0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaSB7CisgIHZvaWQgZigpIHt9Cit9OwordGVtcGxhdGU8PiB2b2lkIGk8aW50Pjo6ZigpOworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGk8aW50PjsKK2k8aW50PiBpaTsKKy8vIENIRUNLOiA7IFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW2k8aW50Pl0ge3suKn19IFtkZWZdCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIgPSBUMT4KK3N0cnVjdCBqIHsKK307CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgajxpbnQ+OworajxpbnQ+IGpqOworLy8gQ0hFQ0s6IDsgWyBEV19UQUdfc3RydWN0dXJlX3R5cGUgXSBbajxpbnQsIGludD5dCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby10ZW1wbGF0ZS1md2QuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdGVtcGxhdGUtZndkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmI3MDczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdGVtcGxhdGUtZndkLmNwcApAQCAtMCwwICsxLDI3IEBACisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZT14ODZfNjQtYXBwbGUtZGFyd2luIC1nIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gVGhpcyB0ZXN0IGlzIGZvciBhIGNyYXNoIHdoZW4gZW1pdHRpbmcgZGVidWcgaW5mbyBmb3Igbm90LXlldC1jb21wbGV0ZWQKKy8vIHR5cGVzLgorLy8gVGVzdCB0aGF0IHdlIGRvbid0IGFjdHVhbGx5IGVtaXQgYSBmb3J3YXJkIGRlY2wgZm9yIHRoZSBvZmZlbmRpbmcgY2xhc3M6CisvLyBDSEVDSzogIFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW0Rlcml2ZWQ8aW50Pl0ge3suKn19IFtkZWZdCisvLyByZGFyOi8vcHJvYmxlbS8xNTkzMTM1NAordGVtcGxhdGUgPGNsYXNzIEE+IGNsYXNzIERlcml2ZWQ7CisKK3RlbXBsYXRlIDxjbGFzcyBBPiBjbGFzcyBCYXNlIHsKKyAgc3RhdGljIERlcml2ZWQ8QT4gKmNyZWF0ZSgpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIEE+IHN0cnVjdCBEZXJpdmVkIDogQmFzZTxBPiB7Cit9OworCitCYXNlPGludD4gKmY7CisKKy8vIER1cmluZyB0aGUgaW5zdGFudGlhdGlvbiBvZiBEZXJpdmVkPGludD4sIEJhc2U8aW50PiBiZWNvbWVzIHJlcXVpcmVkIHRvIGJlCisvLyBjb21wbGV0ZSAtIHNpbmNlIHRoZSBkZWNsYXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGVtaXR0ZWQgKGR1ZSB0byAnZicsCisvLyBhYm92ZSksIHdlIGltbWVkaWF0ZWx5IHRyeSB0byBidWlsZCBkZWJ1ZyBpbmZvIGZvciBCYXNlPGludD4gd2hpY2ggdGhlbgorLy8gcmVxdWlyZXMgdGhlIChpbmNvbXBsZXRlIGRlZmluaXRpb24pIG9mIERlcml2ZWQ8aW50PiB3aGljaCBpcyBwcm9ibGVtYXRpYy4KKy8vCisvLyAoaWYgJ2YnIGlzIG5vdCBwcmVzZW50LCB0aGUgcG9pbnQgYXQgd2hpY2ggQmFzZTxpbnQ+IGJlY29tZXMgcmVxdWlyZWQgdG8gYmUKKy8vIGNvbXBsZXRlIGR1cmluZyB0aGUgaW5zdGFudGlhdGlvbiBvZiBEZXJpdmVkPGludD4gaXMgYSBuby1vcCBiZWNhdXNlCisvLyBCYXNlPGludD4gd2FzIG5ldmVyIGVtaXR0ZWQgc28gd2UgaWdub3JlIGl0IGFuZCBjYXJyeSBvbiB1bnRpbCB3ZQorLy8gd2lyZSB1cCB0aGUgYmFzZSBjbGFzcyBvZiBEZXJpdmVkPGludD4gaW4gdGhlIGRlYnVnIGluZm8gbGF0ZXIgb24pCitEZXJpdmVkPGludD4gZDsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXRlbXBsYXRlLWxpbWl0LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXRlbXBsYXRlLWxpbWl0LmNwcAppbmRleCBjM2UyNDFlLi5lMWYyM2FkIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby10ZW1wbGF0ZS1saW1pdC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdGVtcGxhdGUtbGltaXQuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmcgLWZsaW1pdC1kZWJ1Zy1pbmZvIC1lbWl0LWxsdm0gLWcgLVMgJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLWZuby1zdGFuZGFsb25lLWRlYnVnIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIC8vIENoZWNrIHRoYXQgdGhpcyBwb2ludGVyIHR5cGUgaXMgVEM8aW50PgogLy8gQ0hFQ0s6ICFbW0xJTkU6WzAtOV0rXV0gPSB7ey4qfX0iVEM8aW50PiIsIHt7Lip9fSBtZXRhZGF0YSAhIl9aVFMyVENJaUUifSA7IFsgRFdfVEFHX2NsYXNzX3R5cGUgXQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdGVtcGxhdGUtbWVtYmVyLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXRlbXBsYXRlLW1lbWJlci5jcHAKaW5kZXggOWFjMWJlZi4uYzlhM2Q5YiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdGVtcGxhdGUtbWVtYmVyLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby10ZW1wbGF0ZS1tZW1iZXIuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLWcgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1nIC1mbm8tc3RhbmRhbG9uZS1kZWJ1ZyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiBzdHJ1Y3QgTXlDbGFzcyB7CiAgIHRlbXBsYXRlIDxpbnQgaT4gaW50IGFkZChpbnQgaikgewpAQCAtMjEsNyArMjEsNyBAQAogLy8gQ0hFQ0s6IFtbRk9PX0ZVTkNdXSA9IHt7Lip9fSwgbWV0YWRhdGEgISJfWk4zZm9vNGZ1bmNFTjVvdXRlcklTX0U1aW5uZXJFIiwgaTMyIHt7WzAtOV0qfX0sIG1ldGFkYXRhIFtbRk9PX0ZVTkNfVFlQRTohWzAtOV0qXV0sIHt7Lip9fSA7IFsgRFdfVEFHX3N1YnByb2dyYW0gXSB7ey4qfX0gW2Z1bmNdCiAvLyBDSEVDSzogW1tGT09fRlVOQ19UWVBFXV0gPSB7ey4qfX0sIG1ldGFkYXRhIFtbRk9PX0ZVTkNfUEFSQU1TOiFbMC05XSpdXSwgaTMyIDAsIG51bGwsIG51bGwsIG51bGx9IDsgWyBEV19UQUdfc3Vicm91dGluZV90eXBlIF0KIC8vIENIRUNLOiBbW0ZPT19GVU5DX1BBUkFNU11dID0gbWV0YWRhdGEgIXtudWxsLCBtZXRhZGF0YSAhe3tbMC05XSp9fSwgbWV0YWRhdGEgW1tPVVRFUl9GT09fSU5ORVI6IVswLTldKl1dfQotLy8gQ0hFQ0s6IFtbT1VURVJfRk9PX0lOTkVSXV0gPSB7ey4qfX0gOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtpbm5lcl0KKy8vIENIRUNLOiBbW09VVEVSX0ZPT19JTk5FUl1dID0ge3suKn19LCBudWxsLCBtZXRhZGF0YSAhIltbT1VURVJfRk9PX0lOTkVSX0lEOi4qXV0ifSA7IFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW2lubmVyXQogCiAvLyBDSEVDSzogbWV0YWRhdGEgW1tWSVJUX01FTTohWzAtOV0qXV0sIGkzMiAwLCBtZXRhZGF0YSAhIl9aVFM0dmlydEk0ZWxlbUUiLCBtZXRhZGF0YSBbW1ZJUlRfVEVNUF9QQVJBTTohWzAtOV0qXV0sIG1ldGFkYXRhICEiX1pUUzR2aXJ0STRlbGVtRSJ9IDsgWyBEV19UQUdfc3RydWN0dXJlX3R5cGUgXSBbdmlydDxlbGVtPl0ge3suKn19IFtkZWZdCiAvLyBDSEVDSzogW1tWSVJUX1RFTVBfUEFSQU1dXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgW1tWSVJUX1Q6IVswLTldKl1dfQpAQCAtNTksNyArNTksNyBAQAogCiBvdXRlcjxmb28+Ojppbm5lciB4OwogCi0vLyBDSEVDSzogbWV0YWRhdGEgW1tPVVRFUl9GT09fSU5ORVJdXSwgaTMyIHt7WzAtOV0qfX0sIGkzMiB7e1swLTldKn19LCAlInN0cnVjdC5vdXRlcjxmb28+Ojppbm5lciIqIEB4LCB7ey4qfX0gOyBbIERXX1RBR192YXJpYWJsZSBdIFt4XQorLy8gQ0hFQ0s6IG1ldGFkYXRhICEiW1tPVVRFUl9GT09fSU5ORVJfSURdXSIsIGkzMiB7e1swLTldKn19LCBpMzIge3tbMC05XSp9fSwgJSJzdHJ1Y3Qub3V0ZXI8Zm9vPjo6aW5uZXIiKiBAeCwge3suKn19IDsgWyBEV19UQUdfdmFyaWFibGUgXSBbeF0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdHJ1Y3QgdmlydCB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby10ZW1wbGF0ZS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby10ZW1wbGF0ZS5jcHAKaW5kZXggZjU4OTczYi4uZDA3MTgzMCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdGVtcGxhdGUuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXRlbXBsYXRlLmNwcApAQCAtMSw3ICsxLDcgQEAKIC8vIFJVTjogJWNsYW5nIC1TIC1lbWl0LWxsdm0gLXRhcmdldCB4ODZfNjQtdW5rbm93bl91bmtub3duIC1nICVzIC1vIC0gLXN0ZD1jKysxMSB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSzoge3suKn19LCBpMSBmYWxzZSwgbWV0YWRhdGEgISIiLCBpMzIgMCwgbWV0YWRhdGEgIXt7WzAtOV1dKn19LCBtZXRhZGF0YSBbW1JFVEFJTjohWzAtOV0qXV0sIHt7Lip9fSA7IFsgRFdfVEFHX2NvbXBpbGVfdW5pdCBdCi0vLyBDSEVDSzogW1tFTVBUWTohWzAtOV0qXV0gPSBtZXRhZGF0YSAhe2kzMiAwfQorLy8gQ0hFQ0s6IFtbRU1QVFk6IVswLTldKl1dID0gbWV0YWRhdGEgIXt9CiAvLyBDSEVDSzogW1tSRVRBSU5dXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgIXt7WzAtOV1dKn19LCBtZXRhZGF0YSBbW0ZPTzohWzAtOV0qXV0sCiAKIApAQCAtNTAsOCArNTAsOCBAQAogLy8KIAogCi0vLyBDSEVDSzogW1tUQ05FU1RFRDohWzAtOV0qXV0gPSBtZXRhZGF0YSAhe2kzMiB7e1swLTldKn19LCBtZXRhZGF0YSAhe3tbMC05XSp9fSwgbWV0YWRhdGEgISJfWlRTMlRDSWpMajJFWGFkTF9aM2dsYkVFWGFkTF9aTjNmb28xZUVFRVhhZExfWk5TMF8xZkV2RUVYYWRMX1o0ZnVuY3ZFRTl0bXBsX2ltcGxKTGkxRUxpMkVMaTNFRUUiLCB7ey4qfX0gOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtuZXN0ZWRdCi0vLyBDSEVDSzogW1tUQ05UOiFbMC05XSpdXSA9IHt7Lip9fSwgbWV0YWRhdGEgW1tUQ05BUkdTOiFbMC05XSpdXSwgbWV0YWRhdGEgISJ7ey4qfX0ifSA7IFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW1RDPGludCwgLTMsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIHRtcGxfaW1wbD5dCisvLyBDSEVDSzogbWV0YWRhdGEgIXtpMzIge3tbMC05XSp9fSwgbWV0YWRhdGEgIXt7WzAtOV0qfX0sIG1ldGFkYXRhICEiX1pUUzJUQ0lqTGoyRVhhZExfWjNnbGJFRVhhZExfWk4zZm9vMWVFRUVYYWRMX1pOUzBfMWZFdkVFWGFkTF9aNGZ1bmN2RUU5dG1wbF9pbXBsSkxpMUVMaTJFTGkzRUVFIiwge3suKn19LCBtZXRhZGF0YSAhIltbVENORVNURUQ6LipdXSJ9IDsgWyBEV19UQUdfc3RydWN0dXJlX3R5cGUgXSBbbmVzdGVkXQorLy8gQ0hFQ0s6IG1ldGFkYXRhIFtbVENOQVJHUzohWzAtOV0qXV0sIG1ldGFkYXRhICEiW1tUQ05UOi4qXV0ifSA7IFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW1RDPGludCwgLTMsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIHRtcGxfaW1wbD5dCiAvLyBDSEVDSzogW1tUQ05BUkdTXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhIFtbVENOQVJHMTohWzAtOV0qXV0sIG1ldGFkYXRhIFtbVENOQVJHMjohWzAtOV0qXV0sIG1ldGFkYXRhIFtbVENOQVJHMzohWzAtOV0qXV0sIG1ldGFkYXRhIFtbVENOQVJHNDohWzAtOV0qXV0sIG1ldGFkYXRhIFtbVENOQVJHNTohWzAtOV0qXV0sIG1ldGFkYXRhIFtbVENOQVJHNjohWzAtOV0qXV0sIG1ldGFkYXRhIFtbVENBUkc3OiFbMC05XSpdXSwgbWV0YWRhdGEgW1tUQ05BUkc4OiFbMC05XSpdXX0KIC8vIENIRUNLOiBbW1RDTkFSRzFdXSA9IHt7Lip9fW1ldGFkYXRhICEiVCIsIG1ldGFkYXRhIFtbSU5UXV0sIHt7Lip9fSA7IFsgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW1ldGVyIF0KIC8vIENIRUNLOiBbW1RDTkFSRzJdXSA9IHt7Lip9fW1ldGFkYXRhICEiIiwgbWV0YWRhdGEgW1tJTlRdXSwgaTMyIC0zLCB7ey4qfX0gOyBbIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbWV0ZXIgXQpAQCAtNzcsOSArNzcsOSBAQAogLy8gQ0hFQ0s6IFtbUFRPQVJHMV1dID0ge3suKn19bWV0YWRhdGEgISIiLCBtZXRhZGF0YSBbW0NPTlNUX1BBRERJTkdBVEVORF9QVFI6IVswLTldKl1dLCB7IGkzMiwgaTgsIFszIHggaThdIH0qIEBQYWRkZWRPYmosIHt7Lip9fSA7IFsgRFdfVEFHX3RlbXBsYXRlX3ZhbHVlX3BhcmFtZXRlciBdCiAvLyBDSEVDSzogW1tDT05TVF9QQURESU5HQVRFTkRfUFRSXV0gPSB7ey4qfX0gOyBbIERXX1RBR19wb2ludGVyX3R5cGUgXSBbbGluZSAwLCBzaXplIDY0LCBhbGlnbiA2NCwgb2Zmc2V0IDBdIFtmcm9tIF9aVFMxMlBhZGRpbmdBdEVuZF0KIAotLy8gQ0hFQ0s6IG1ldGFkYXRhIFtbVENORVNURURdXSwgaTMyIDAsIGkzMiAxLCAlInN0cnVjdC5UQzx1bnNpZ25lZCBpbnQsIDIsICZnbGIsICZmb286OmUsICZmb286OmYsICZmdW5jLCB0bXBsX2ltcGwsIDEsIDIsIDM+OjpuZXN0ZWQiKiBAdGNpLCBudWxsfSA7IFsgRFdfVEFHX3ZhcmlhYmxlIF0gW3RjaV0KKy8vIENIRUNLOiBtZXRhZGF0YSAhIltbVENORVNURURdXSIsIGkzMiAwLCBpMzIgMSwgJSJzdHJ1Y3QuVEM8dW5zaWduZWQgaW50LCAyLCAmZ2xiLCAmZm9vOjplLCAmZm9vOjpmLCAmZnVuYywgdG1wbF9pbXBsLCAxLCAyLCAzPjo6bmVzdGVkIiogQHRjaSwgbnVsbH0gOyBbIERXX1RBR192YXJpYWJsZSBdIFt0Y2ldCiAKLS8vIENIRUNLOiBtZXRhZGF0YSBbW1RDTlQ6IVswLTldKl1dLCBpMzIgMCwgaTMyIDEsICVzdHJ1Y3QuVEMqIEB0Y24sIG51bGx9IDsgWyBEV19UQUdfdmFyaWFibGUgXSBbdGNuXQorLy8gQ0hFQ0s6IG1ldGFkYXRhICEiW1tUQ05UXV0iLCBpMzIgMCwgaTMyIDEsICVzdHJ1Y3QuVEMqIEB0Y24sIG51bGx9IDsgWyBEV19UQUdfdmFyaWFibGUgXSBbdGNuXQogc3RydWN0IGZvbyB7CiAgIGNoYXIgcGFkWzhdOyAvLyBtYWtlIHRoZSBtZW1iZXIgcG9pbnRlciB0byAnZScgYSBiaXQgbW9yZSBpbnRlcmVzdGluZyAobm9uemVybykKICAgaW50IGU7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby10aHVuay5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby10aHVuay5jcHAKaW5kZXggMmE1MDg5NS4uMWQ2ZjFhNyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdGh1bmsuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXRodW5rLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZyAtUyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWcgLVMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIHN0cnVjdCBBIHsKICAgdmlydHVhbCB2b2lkIGYoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXVzZS1hZnRlci1mcmVlLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXVzZS1hZnRlci1mcmVlLmNwcAppbmRleCA4NTJlMTQ4Li4wZjI4YTkwIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby11c2UtYWZ0ZXItZnJlZS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdXNlLWFmdGVyLWZyZWUuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1nIC1lbWl0LWxsdm0tb25seSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1nIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtLW9ubHkgJXMKIC8vIENoZWNrIHRoYXQgd2UgZG9uJ3QgY3Jhc2guCiAvLyBQUjEyMzA1LCBQUjEyMzE1CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXV1aWQuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdXVpZC5jcHAKaW5kZXggYTU3ZTJmMC4uNjEzNzQwMCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdXVpZC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdXVpZC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtZm1zLWV4dGVuc2lvbnMgLXRyaXBsZT14ODZfNjQtcGMtd2luMzIgLWN4eC1hYmkgbWljcm9zb2Z0IC1nICVzIC1vIC0gLXN0ZD1jKysxMSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLWZtcy1leHRlbnNpb25zIC10cmlwbGU9eDg2XzY0LXBjLXdpbjMyIC1nICVzIC1vIC0gLXN0ZD1jKysxMSB8IEZpbGVDaGVjayAlcwogLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1mbXMtZXh0ZW5zaW9ucyAtdHJpcGxlPXg4Nl82NC11bmtub3duLXVua25vd24gLWcgJXMgLW8gLSAtc3RkPWMrKzExIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stSVRBTklVTQogCiAvLyBDSEVDSzogbWV0YWRhdGEgW1tUR0lBUkdTOiFbMC05XSpdXSwgbnVsbH0gOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFt0bXBsX2d1aWQ8Jl9fdXVpZG9mKHV1aWQpPl0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXZhcmFyZ3MuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdmFyYXJncy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5MjQ3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLXZhcmFyZ3MuY3BwCkBAIC0wLDAgKzEsMjIgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtZyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisKK3N0cnVjdCBBCit7CisgIC8vIENIRUNLLURBRzogIiwgaTMyIFtbQExJTkUrMV1dLCBtZXRhZGF0YSAhW1tBVFk6WzAtOV0rXV17ey4qfX1bIERXX1RBR19zdWJwcm9ncmFtIF17ey4qfX1bYV0KKyAgdm9pZCBhKGludCBjLCAuLi4pIHt9CisgIC8vIENIRUNLOiAhW1tBVFldXSA9e3suKn19IG1ldGFkYXRhICFbW0FBUkdTOlswLTldK11dLCBpMzIgMCwgbnVsbCwgbnVsbCwgbnVsbH0gOyBbIERXX1RBR19zdWJyb3V0aW5lX3R5cGUgXQorICAvLyBDSEVDSzogIVtbQUFSR1NdXSA9IHt7Lip9fSBtZXRhZGF0YSAhW1tVTlNQRUM6WzAtOV0rXV19CisgIC8vIENIRUNLOiAhW1tVTlNQRUNdXSA9IHt7Lip9fSBbIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzIF0KK307CisKKyAgLy8gQ0hFQ0s6ICIsIGkzMiBbW0BMSU5FKzFdXSwgbWV0YWRhdGEgIVtbQlRZOlswLTldK11de3suKn19WyBEV19UQUdfc3VicHJvZ3JhbSBde3suKn19W2JdCit2b2lkIGIoaW50IGMsIC4uLikgeworICAvLyBDSEVDSzogIVtbQlRZXV0gPXt7Lip9fSBtZXRhZGF0YSAhW1tCQVJHUzpbMC05XStdXSwgaTMyIDAsIG51bGwsIG51bGwsIG51bGx9IDsgWyBEV19UQUdfc3Vicm91dGluZV90eXBlIF0KKyAgLy8gQ0hFQ0s6ICFbW0JBUkdTXV0gPSB7ey4qfX0gbWV0YWRhdGEgIVtbVU5TUEVDOlswLTldK11dfQorCisgIEEgYTsKKworICAvLyBDSEVDSzogbWV0YWRhdGEgIVtbUFNUOlswLTldK11dLCBpMzIgMCwgaTMyIDB9IDsgWyBEV19UQUdfYXV0b192YXJpYWJsZSBdIFtmcHRyXSBbbGluZSBbW0BMSU5FKzFdXV0KKyAgdm9pZCAoKmZwdHIpKGludCwgLi4uKSA9IGI7CisgIC8vIENIRUNLOiAhW1tQU1RdXSA9e3suKn19IG1ldGFkYXRhICFbW0JUWV1dfSA7IFsgRFdfVEFHX3BvaW50ZXJfdHlwZSBdCit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby12dGFibGUtb3B0em4uY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdnRhYmxlLW9wdHpuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTZkNGZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8tdnRhYmxlLW9wdHpuLmNwcApAQCAtMCwwICsxLDIxIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtZyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8KKy8vIFRoaXMgdGVzdHMgdGhhdCB0aGUgImVtaXQgZGVidWcgaW5mbyBmb3IgYSBDKysgY2xhc3Mgb25seSBpbiB0aGUKKy8vIG1vZHVsZSB0aGF0IGhhcyBpdHMgdnRhYmxlIiBvcHRpbWl6YXRpb24gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBvbgorLy8gRGFyd2luLgorLy8KKy8vIENIRUNLOiBbIERXX1RBR19tZW1iZXIgXSBbbG9zdF0KK2NsYXNzIEEKK3sKKyAgdmlydHVhbCBib29sIGYoKSA9IDA7CisgIGludCBsb3N0OworfTsKKworY2xhc3MgQiA6IHB1YmxpYyBBCit7CisgIEIgKmcoKTsKK307CisKK0IgKkI6OmcoKSB7CisgIHJldHVybiB0aGlzOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8uY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2RlYnVnLWluZm8uY3BwCmluZGV4IDkzYTRmZTMuLjJlNzIyNmQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWJ1Zy1pbmZvLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZGVidWctaW5mby5jcHAKQEAgLTc3LDcgKzc3LDcgQEAKICAgcmV0dXJuIGY7IC8vIHJlZmVyZW5jZSAnZicgZm9yIG5vdyBiZWNhdXNlIG90aGVyd2lzZSB3ZSBoaXQgYW5vdGhlciBidWcKIH0KIAotLy8gQ0hFQ0s6IFtbRk9POiFbMC05XSpdXSA9IG1ldGFkYXRhICF7aTMyIHt7WzAtOV0qfX0sIG1ldGFkYXRhICF7e1swLTldKn19LCBtZXRhZGF0YSBbW1BSMTQ3NjM6IVswLTldKl1dLCB7ey4qfX0gOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtmb29dCisvLyBDSEVDSzogbWV0YWRhdGEgIXtpMzIge3tbMC05XSp9fSwgbWV0YWRhdGEgIXt7WzAtOV0qfX0sIG1ldGFkYXRhIFtbUFIxNDc2MzohWzAtOV0qXV0sIHt7Lip9fSwgbWV0YWRhdGEgISJbW0ZPTzouKl1dIn0gOyBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtmb29dCiAvLyBDSEVDSzogW1tQUjE0NzYzXV0gPSB7ey4qfX0gOyBbIERXX1RBR19uYW1lc3BhY2UgXSBbcHIxNDc2M10KIC8vIENIRUNLOiBbW0lOQ1RZUEU6IVswLTldKl1dID0ge3suKn19IDsgWyBEV19UQUdfc3RydWN0dXJlX3R5cGUgXSBbaW5jb21wbGV0ZV17ey4qfX0gW2RlY2xdCiAvLyBDSEVDSzogbWV0YWRhdGEgW1tBX01FTTohWzAtOV0qXV0sIGkzMiAwLCBudWxsLCBudWxsLCBtZXRhZGF0YSAhIl9aVFNON3ByMTYyMTQxYUUifSA7IFsgRFdfVEFHX3N0cnVjdHVyZV90eXBlIF0gW2FdCkBAIC05Nyw3ICs5Nyw3IEBACiB9CiAKIC8vIEZvciBzb21lIHJlYXNvbiB0aGUgYXJndW1lbnQgZm9yIFBSMTQ3NjMgZW5kZWQgdXAgYWxsIHRoZSB3YXkgZG93biBoZXJlCi0vLyBDSEVDSzogPSBtZXRhZGF0YSAhe2kzMiB7e1swLTldKn19LCBtZXRhZGF0YSBbW0ZVTkNdXSwge3suKn19LCBtZXRhZGF0YSBbW0ZPT11dLCBpMzIgODE5MiwgaTMyIDB9IDsgWyBEV19UQUdfYXJnX3ZhcmlhYmxlIF0gW2ZdCisvLyBDSEVDSzogPSBtZXRhZGF0YSAhe2kzMiB7e1swLTldKn19LCBtZXRhZGF0YSBbW0ZVTkNdXSwge3suKn19LCBtZXRhZGF0YSAhIltbRk9PXV0iLCBpMzIgODE5MiwgaTMyIDB9IDsgWyBEV19UQUdfYXJnX3ZhcmlhYmxlIF0gW2ZdCiAKIG5hbWVzcGFjZSBwcjE2MjE0IHsKIHN0cnVjdCBhIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWNsLXJlZi1pbml0LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWNsLXJlZi1pbml0LmNwcAppbmRleCAxYTgyZWUyLi5kYmJiZTk3IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZGVjbC1yZWYtaW5pdC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlY2wtcmVmLWluaXQuY3BwCkBAIC0xLDggKzEsNyBAQAotLy8gUkVRVUlSRVM6IHg4Ni1yZWdpc3RlcmVkLXRhcmdldCx4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLVMgJXMgLW8gJXQtNjQucwotLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBDSEVDSy1MUDY0IC0taW5wdXQtZmlsZT0ldC02NC5zICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbiAtUyAlcyAtbyAldC0zMi5zCi0vLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQMzIgLS1pbnB1dC1maWxlPSV0LTMyLnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLWVtaXQtbGx2bSAlcyAtbyAtIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGkzODYtYXBwbGUtZGFyd2luIC1lbWl0LWxsdm0gJXMgLW8gLSB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzCiAKIHN0cnVjdCBBIHt9OwogCkBAIC0yNCw4ICsyMyw1IEBACiAJY29uc3QgQSYgcmNhMiA9IGQoKTsKIH0KIAotLy8gQ0hFQ0stTFA2NDogY2FsbHEgICAgX19aTjFCY3ZSMUFFdgotLy8gQ0hFQ0stTFA2NDogY2FsbHEgICAgX19aTjFCY3ZSMUFFdgotCi0vLyBDSEVDSy1MUDMyOiBjYWxsbCAgICAgTF9fWk4xQmN2UjFBRXYKLS8vIENIRUNLLUxQMzI6IGNhbGxsICAgICBMX19aTjFCY3ZSMUFFdgorLy8gQ0hFQ0s6IGNhbGwgJXN0cnVjdC5BKiBAX1pOMUJjdlIxQUV2CisvLyBDSEVDSzogY2FsbCAlc3RydWN0LkEqIEBfWk4xQmN2UjFBRXYKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWZhdWx0LWFyZ3VtZW50cy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVmYXVsdC1hcmd1bWVudHMuY3BwCmluZGV4IDgzY2FlM2EuLmQzNjQ4MzUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWZhdWx0LWFyZ3VtZW50cy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlZmF1bHQtYXJndW1lbnRzLmNwcApAQCAtNDIsMTUgKzQyLDE1IEBACiAgQygpOwogfTsKIAotLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQ0MxRXYoJXN0cnVjdC5DKiAldGhpcykgdW5uYW1lZF9hZGRyCi0vLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQ0MyRXYoCi0KIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUNDMkV2KCVzdHJ1Y3QuQyogJXRoaXMpIHVubmFtZWRfYWRkcgogLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMkExQzFFdigKIC8vIENIRUNLOiBjYWxsIHZvaWQgQF9aTjJBMkMxRXYoCiAvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQkMxRVJLMkExUksyQTIoCiAvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4yQTJEMUV2CiAvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4yQTFEMUV2CisKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUNDMUV2KCVzdHJ1Y3QuQyogJXRoaXMpIHVubmFtZWRfYWRkcgorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMUNDMkV2KAogQzo6QygpIHsgfQogCiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aMmYzdigpCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVmYXVsdC1jb25zdHJ1Y3Rvci1kZWZhdWx0LWFyZ3VtZW50LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWZhdWx0LWNvbnN0cnVjdG9yLWRlZmF1bHQtYXJndW1lbnQuY3BwCmluZGV4IDM3NGE5NjcuLjE3ZWNjMzUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWZhdWx0LWNvbnN0cnVjdG9yLWRlZmF1bHQtYXJndW1lbnQuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWZhdWx0LWNvbnN0cnVjdG9yLWRlZmF1bHQtYXJndW1lbnQuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ2hlY2sgdGhhdCBjYWxsIHRvIGNvbnN0cnVjdG9yIGZvciBzdHJ1Y3QgQSBpcyBnZW5lcmF0ZWQgY29ycmVjdGx5Lgogc3RydWN0IEEgeyBBKGludCB4ID0gMik7IH07CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVmYXVsdC1jb25zdHJ1Y3Rvci1mb3ItbWVtYmVycy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVmYXVsdC1jb25zdHJ1Y3Rvci1mb3ItbWVtYmVycy5jcHAKaW5kZXggNjA2NWI0OS4uNWViOGNkMSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlZmF1bHQtY29uc3RydWN0b3ItZm9yLW1lbWJlcnMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWZhdWx0LWNvbnN0cnVjdG9yLWZvci1tZW1iZXJzLmNwcApAQCAtMSw4ICsxLDcgQEAKLS8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQseDg2LTY0LXJlZ2lzdGVyZWQtdGFyZ2V0Ci0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1TICVzIC1vICV0LTY0LnMKLS8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFA2NCAtLWlucHV0LWZpbGU9JXQtNjQucyAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLVMgJXMgLW8gJXQtMzIucwotLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBDSEVDSy1MUDMyIC0taW5wdXQtZmlsZT0ldC0zMi5zICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1lbWl0LWxsdm0gJXMgLW8gLSB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbiAtZW1pdC1sbHZtICVzIC1vIC0gfCBcCisvLyBSVU46IEZpbGVDaGVjayAlcwogCiBleHRlcm4gIkMiIGludCBwcmludGYoLi4uKTsKIApAQCAtMTksNiArMTgsNCBAQAogICBNIG0xOwogfQogCi0vLyBDSEVDSy1MUDY0OiBjYWxscSBfX1pOMVNDMUV2Ci0KLS8vIENIRUNLLUxQMzI6IGNhbGxsIExfX1pOMVNDMUV2CisvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xU0MxRXYKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWZhdWx0LWNvbnN0cnVjdG9yLXRlbXBsYXRlLW1lbWJlci5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVmYXVsdC1jb25zdHJ1Y3Rvci10ZW1wbGF0ZS1tZW1iZXIuY3BwCmluZGV4IDIxNTY5NjQuLjkzZGY4MTggMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWZhdWx0LWNvbnN0cnVjdG9yLXRlbXBsYXRlLW1lbWJlci5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlZmF1bHQtY29uc3RydWN0b3ItdGVtcGxhdGUtbWVtYmVyLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgQSB7IEEoKTsgfTsKIHN0cnVjdCBCIHsgQTxpbnQ+IHg7IH07CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVmYXVsdC1kZXN0cnVjdG9yLW5lc3RlZC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVmYXVsdC1kZXN0cnVjdG9yLW5lc3RlZC5jcHAKaW5kZXggNTY1YTcyNy4uNzdiMDZkNiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2RlZmF1bHQtZGVzdHJ1Y3Rvci1uZXN0ZWQuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWZhdWx0LWRlc3RydWN0b3ItbmVzdGVkLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtLW9ubHkKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bS1vbmx5CiAvLyBQUjYyOTQKIAogY2xhc3MgQSB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVmZXJyZWQtZ2xvYmFsLWluaXQuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2RlZmVycmVkLWdsb2JhbC1pbml0LmNwcAppbmRleCBkZWI0NThmLi5jNjgzYWQyIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZGVmZXJyZWQtZ2xvYmFsLWluaXQuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWZlcnJlZC1nbG9iYWwtaW5pdC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcwogLy8gUFI1OTY3CiAKIGV4dGVybiB2b2lkKiBmb287CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZGVsYXllZC10ZW1wbGF0ZS1wYXJzaW5nLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZWxheWVkLXRlbXBsYXRlLXBhcnNpbmcuY3BwCmluZGV4IGZhMTc3ZDQuLmM1ZjQ0ODYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWxheWVkLXRlbXBsYXRlLXBhcnNpbmcuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9kZWxheWVkLXRlbXBsYXRlLXBhcnNpbmcuY3BwCkBAIC0xLDUgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAlcyAtbyAtIC1jeHgtYWJpIG1pY3Jvc29mdCAtZm1zLWV4dGVuc2lvbnMgLWZkZWxheWVkLXRlbXBsYXRlLXBhcnNpbmcgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gLWN4eC1hYmkgbWljcm9zb2Z0IC1mbXMtZXh0ZW5zaW9ucyAtZmRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IFg2NCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAlcyAtbyAtIC1mbXMtZXh0ZW5zaW9ucyAtZmRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyAtdHJpcGxlPWkzODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1lbWl0LWxsdm0gJXMgLW8gLSAtZm1zLWV4dGVuc2lvbnMgLWZkZWxheWVkLXRlbXBsYXRlLXBhcnNpbmcgLXRyaXBsZT14ODZfNjQtcGMtd2luMzIgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBYNjQgJXMKIAogbmFtZXNwYWNlIENsYXNzU2NvcGVTcGVjaWFsaXphdGlvbiB7CiAgIHN0cnVjdCBUeXBlIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kZWxldGUtdHdvLWFyZy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZGVsZXRlLXR3by1hcmcuY3BwCmluZGV4IGY4ZTZiZmYuLmJlM2NmMWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZWxldGUtdHdvLWFyZy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2RlbGV0ZS10d28tYXJnLmNwcApAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogbm90ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXBjLWxpbnV4LWdudSAlcyAtbyAtIC1lbWl0LWxsdm0gLXZlcmlmeSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1wYy1saW51eC1nbnUgJXMgLW8gLSAtZW1pdC1sbHZtIC12ZXJpZnkgfCBGaWxlQ2hlY2sgJXMKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCiAKIHR5cGVkZWYgX190eXBlb2Yoc2l6ZW9mKGludCkpIHNpemVfdDsKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2Rlcml2ZWQtdG8tdmlydHVhbC1iYXNlLWNsYXNzLWNhbGxzLWZpbmFsLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZXJpdmVkLXRvLXZpcnR1YWwtYmFzZS1jbGFzcy1jYWxscy1maW5hbC5jcHAKaW5kZXggZjJlY2ZjMS4uYjdhNTU1NCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2Rlcml2ZWQtdG8tdmlydHVhbC1iYXNlLWNsYXNzLWNhbGxzLWZpbmFsLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZGVyaXZlZC10by12aXJ0dWFsLWJhc2UtY2xhc3MtY2FsbHMtZmluYWwuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogc3RydWN0IEEgeyBpbnQgaTsgfTsKIHN0cnVjdCBCIHsgY2hhciBqOyB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2Rlc3RydWN0b3ItZXhjZXB0aW9uLXNwZWMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2Rlc3RydWN0b3ItZXhjZXB0aW9uLXNwZWMuY3BwCmluZGV4IGUxMTFiYTAuLjUwYzE3ZWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9kZXN0cnVjdG9yLWV4Y2VwdGlvbi1zcGVjLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZGVzdHJ1Y3Rvci1leGNlcHRpb24tc3BlYy5jcHAKQEAgLTEsNiArMSw2IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bS1vbmx5ICVzIC1zdGQ9YysrMTEKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtLW9ubHkgLWZuby11c2UtY3hhLWF0ZXhpdCAlcyAtc3RkPWMrKzExCi0vLyBSVU46ICVjbGFuZ19jYzEgLWN4eC1hYmkgbWljcm9zb2Z0IC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgJXMgLXN0ZD1jKysxMQorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtLW9ubHkgJXMgLXN0ZD1jKysxMQorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtLW9ubHkgLWZuby11c2UtY3hhLWF0ZXhpdCAlcyAtc3RkPWMrKzExCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlbXNfYWJpX3RyaXBsZSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5ICVzIC1zdGQ9YysrMTEKIAogLy8gUFIxMzQ3OTogZG9uJ3QgY3Jhc2ggd2l0aCAtZm5vLWV4Y2VwdGlvbnMuCiBuYW1lc3BhY2UgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2Rlc3RydWN0b3JzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kZXN0cnVjdG9ycy5jcHAKaW5kZXggNzk5Y2NhMi4uNWM0MzA0OCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2Rlc3RydWN0b3JzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZGVzdHJ1Y3RvcnMuY3BwCkBAIC02LDYgKzYsMTMgQEAKIC8vIENIRUNLLURBRzogQF9aTjV0ZXN0MTFPRDJFdiA9IGFsaWFzIHt7Lip9fSBAX1pONXRlc3QxMUFEMkV2CiAvLyBDSEVDSy1EQUc6IEBfWk41dGVzdDExU0QyRXYgPSBhbGlhcyBiaXRjYXN0IHt7Lip9fSBAX1pONXRlc3QxMUFEMkV2CiAKKy8vIFdJTjMyLURBRzogQF9aTjV0ZXN0MDFBRDFFdiA9IGFsaWFzIHt7Lip9fSBAX1pONXRlc3QwMUFEMkV2CisvLyBXSU4zMi1EQUc6IEBfWk41dGVzdDExTUQyRXYgPSBhbGlhcyB7ey4qfX0gQF9aTjV0ZXN0MTFBRDJFdgorLy8gV0lOMzItREFHOiBAX1pONXRlc3QxMU5EMkV2ID0gYWxpYXMge3suKn19IEBfWk41dGVzdDExQUQyRXYKKy8vIFdJTjMyLURBRzogQF9aTjV0ZXN0MTFPRDJFdiA9IGFsaWFzIHt7Lip9fSBAX1pONXRlc3QxMUFEMkV2CisvLyBXSU4zMi1EQUc6IEBfWk41dGVzdDExU0QyRXYgPSBhbGlhcyBiaXRjYXN0IHt7Lip9fSBAX1pONXRlc3QxMUFEMkV2CisKKwogc3RydWN0IEEgewogICBpbnQgYTsKICAgCkBAIC0xMDIsNiArMTA5LDEyIEBACiAgIEI6On5CKCkgdHJ5IHsgfSBjYXRjaCAoaW50IGkpIHt9CiAgIC8vIEl0IHdpbGwgc3VwcHJlc3MgdGhlIGRlbGVnYXRpb24gb3B0aW1pemF0aW9uIGhlcmUsIHRob3VnaC4KIAorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dGVzdDAxQkQyRXYoJSJzdHJ1Y3QudGVzdDA6OkIiKiAldGhpcywgaTgqKiAldnR0KSB1bm5hbWVkX2FkZHIKKy8vIENIRUNLOiBpbnZva2Ugdm9pZCBAX1pONXRlc3QwNk1lbWJlckQxRXYKKy8vIENIRUNLOiAgIHVud2luZCBsYWJlbCBbW01FTV9VTldJTkQ6JVthLXpBLVowLTkuXStdXQorLy8gQ0hFQ0s6IGludm9rZSB2b2lkIEBfWk41dGVzdDA0QmFzZUQyRXYKKy8vIENIRUNLOiAgIHVud2luZCBsYWJlbCBbW0JBU0VfVU5XSU5EOiVbYS16QS1aMC05Ll0rXV0KKwogLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dGVzdDAxQkQxRXYoJSJzdHJ1Y3QudGVzdDA6OkIiKiAldGhpcykgdW5uYW1lZF9hZGRyCiAvLyBDSEVDSzogaW52b2tlIHZvaWQgQF9aTjV0ZXN0MDZNZW1iZXJEMUV2CiAvLyBDSEVDSzogICB1bndpbmQgbGFiZWwgW1tNRU1fVU5XSU5EOiVbYS16QS1aMC05Ll0rXV0KQEAgLTEwOSwxMiArMTIyLDYgQEAKIC8vIENIRUNLOiAgIHVud2luZCBsYWJlbCBbW0JBU0VfVU5XSU5EOiVbYS16QS1aMC05Ll0rXV0KIC8vIENIRUNLOiBpbnZva2Ugdm9pZCBAX1pONXRlc3QwNVZCYXNlRDJFdgogLy8gQ0hFQ0s6ICAgdW53aW5kIGxhYmVsIFtbVkJBU0VfVU5XSU5EOiVbYS16QS1aMC05Ll0rXV0KLQotLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dGVzdDAxQkQyRXYoJSJzdHJ1Y3QudGVzdDA6OkIiKiAldGhpcywgaTgqKiAldnR0KSB1bm5hbWVkX2FkZHIKLS8vIENIRUNLOiBpbnZva2Ugdm9pZCBAX1pONXRlc3QwNk1lbWJlckQxRXYKLS8vIENIRUNLOiAgIHVud2luZCBsYWJlbCBbW01FTV9VTldJTkQ6JVthLXpBLVowLTkuXStdXQotLy8gQ0hFQ0s6IGludm9rZSB2b2lkIEBfWk41dGVzdDA0QmFzZUQyRXYKLS8vIENIRUNLOiAgIHVud2luZCBsYWJlbCBbW0JBU0VfVU5XSU5EOiVbYS16QS1aMC05Ll0rXV0KIH0KIAogLy8gVGVzdCBiYXNlLWNsYXNzIGFsaWFzaW5nLgpAQCAtMjcyLDE0ICsyNzksNiBAQAogICAvLyBGSVhNRTogd2F5IHRvbyBtdWNoIEVIIGNsZWFudXAgY29kZSBmb2xsb3dzCiAKICAgQzo6fkMoKSB7IG9wYXF1ZSgpOyB9Ci0gIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pONXRlc3Q2MUNEMUV2KCUic3RydWN0LnRlc3Q2OjpDIiogJXRoaXMpIHVubmFtZWRfYWRkcgotICAvLyBDSEVDSzogICBpbnZva2Ugdm9pZCBAX1pONXRlc3Q2MUNEMkV2Ci0gIC8vIENIRUNLOiAgIGludm9rZSB2b2lkIEBfWk41dGVzdDYxQklMajNFRUQyRXYKLSAgLy8gQ0hFQ0s6ICAgY2FsbCB2b2lkIEBfWk41dGVzdDYxQklMajJFRUQyRXYKLSAgLy8gQ0hFQ0s6ICAgcmV0IHZvaWQKLSAgLy8gQ0hFQ0s6ICAgaW52b2tlIHZvaWQgQF9aTjV0ZXN0NjFCSUxqM0VFRDJFdgotICAvLyBDSEVDSzogICBpbnZva2Ugdm9pZCBAX1pONXRlc3Q2MUJJTGoyRUVEMkV2Ci0KICAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dGVzdDYxQ0QyRXYoJSJzdHJ1Y3QudGVzdDY6OkMiKiAldGhpcywgaTgqKiAldnR0KSB1bm5hbWVkX2FkZHIKICAgLy8gQ0hFQ0s6ICAgaW52b2tlIHZvaWQgQF9aTjV0ZXN0NjZvcGFxdWVFdgogICAvLyBDSEVDSzogICBpbnZva2Ugdm9pZCBAX1pONXRlc3Q2MUFEMUV2CkBAIC0yOTMsNiArMjkyLDE0IEBACiAgIC8vIENIRUNLOiAgIGludm9rZSB2b2lkIEBfWk41dGVzdDYxQUQxRXYKICAgLy8gQ0hFQ0s6ICAgaW52b2tlIHZvaWQgQF9aTjV0ZXN0NjFCSUxqMUVFRDJFdgogICAvLyBDSEVDSzogICBpbnZva2Ugdm9pZCBAX1pONXRlc3Q2MUJJTGowRUVEMkV2CisKKyAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dGVzdDYxQ0QxRXYoJSJzdHJ1Y3QudGVzdDY6OkMiKiAldGhpcykgdW5uYW1lZF9hZGRyCisgIC8vIENIRUNLOiAgIGludm9rZSB2b2lkIEBfWk41dGVzdDYxQ0QyRXYKKyAgLy8gQ0hFQ0s6ICAgaW52b2tlIHZvaWQgQF9aTjV0ZXN0NjFCSUxqM0VFRDJFdgorICAvLyBDSEVDSzogICBjYWxsIHZvaWQgQF9aTjV0ZXN0NjFCSUxqMkVFRDJFdgorICAvLyBDSEVDSzogICByZXQgdm9pZAorICAvLyBDSEVDSzogICBpbnZva2Ugdm9pZCBAX1pONXRlc3Q2MUJJTGozRUVEMkV2CisgIC8vIENIRUNLOiAgIGludm9rZSB2b2lkIEBfWk41dGVzdDYxQklMajJFRUQyRXYKIH0KIAogLy8gUFIgOTE5NwpAQCAtMzc0LDcgKzM4MSw3IEBACiAKIC8vIENoZWNrcyBmcm9tIHRlc3QzOgogCi0gIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgaW50ZXJuYWwgdm9pZCBAX1pONXRlc3QzMTJfR0xPQkFMX19OXzExREQwRXYoJSJzdHJ1Y3QudGVzdDM6Ojxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6RCIqICV0aGlzKSB1bm5hbWVkX2FkZHIKKyAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBpbnRlcm5hbCB2b2lkIEBfWk41dGVzdDMxMl9HTE9CQUxfX05fMTFERDBFdiglInN0cnVjdC50ZXN0Mzo6KGFub255bW91cyBuYW1lc3BhY2UpOjpEIiogJXRoaXMpIHVubmFtZWRfYWRkcgogICAvLyBDSEVDSzogaW52b2tlIHZvaWQge3suKn19IEBfWk41dGVzdDMxMl9HTE9CQUxfX05fMTFDRDJFdgogICAvLyBDSEVDSzogY2FsbCB2b2lkIEBfWmRsUHYoe3suKn19KSBbW05VVzojWzAtOV0rXV0KICAgLy8gQ0hFQ0s6IHJldCB2b2lkCkBAIC0zOTgsNyArNDA1LDcgQEAKICAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pONXRlc3QzMTJfR0xPQkFMX19OXzExQ0QyRXYoCiAgIC8vIENIRUNLOiByZXQgdm9pZAogCi0gIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgaW50ZXJuYWwgdm9pZCBAX1pONXRlc3QzMTJfR0xPQkFMX19OXzExQ0QyRXYoJSJzdHJ1Y3QudGVzdDM6Ojxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6QyIqICV0aGlzKSB1bm5hbWVkX2FkZHIKKyAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBpbnRlcm5hbCB2b2lkIEBfWk41dGVzdDMxMl9HTE9CQUxfX05fMTFDRDJFdiglInN0cnVjdC50ZXN0Mzo6KGFub255bW91cyBuYW1lc3BhY2UpOjpDIiogJXRoaXMpIHVubmFtZWRfYWRkcgogICAvLyBDSEVDSzogaW52b2tlIHZvaWQgQF9aTjV0ZXN0MzFCRDJFdigKICAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pONXRlc3QzMUFEMkV2KAogICAvLyBDSEVDSzogcmV0IHZvaWQKQEAgLTQwNiw3ICs0MTMsNyBAQAogICAvLyBDSEVDSzogZGVjbGFyZSB2b2lkIEBfWk41dGVzdDMxQkQyRXYoCiAgIC8vIENIRUNLOiBkZWNsYXJlIHZvaWQgQF9aTjV0ZXN0MzFBRDJFdigKIAotICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGludGVybmFsIHZvaWQgQF9aTjV0ZXN0MzEyX0dMT0JBTF9fTl8xMUNEMEV2KCUic3RydWN0LnRlc3QzOjo8YW5vbnltb3VzIG5hbWVzcGFjZT46OkMiKiAldGhpcykgdW5uYW1lZF9hZGRyCisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgaW50ZXJuYWwgdm9pZCBAX1pONXRlc3QzMTJfR0xPQkFMX19OXzExQ0QwRXYoJSJzdHJ1Y3QudGVzdDM6Oihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6QyIqICV0aGlzKSB1bm5hbWVkX2FkZHIKICAgLy8gQ0hFQ0s6IGludm9rZSB2b2lkIEBfWk41dGVzdDMxMl9HTE9CQUxfX05fMTFDRDJFdigKICAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pkbFB2KHt7Lip9fSkgW1tOVVddXQogICAvLyBDSEVDSzogcmV0IHZvaWQKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9kdXBsaWNhdGUtbWFuZ2xlZC1uYW1lLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9kdXBsaWNhdGUtbWFuZ2xlZC1uYW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWJmYTIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2R1cGxpY2F0ZS1tYW5nbGVkLW5hbWUuY3BwCkBAIC0wLDAgKzEsMTAgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bS1vbmx5ICVzIC12ZXJpZnkKKworLy8gcmRhcjovLzE1NTIyNjAxCitjbGFzcyBNeUNsYXNzIHsKKyBzdGF0aWMgdm9pZCBtZXRoKCk7Cit9Owordm9pZCBNeUNsYXNzOjptZXRoKCkgeyB9CitleHRlcm4gIkMiIHsKKyAgdm9pZCBfWk43TXlDbGFzczRtZXRoRXYoKSB7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3tkZWZpbml0aW9uIHdpdGggc2FtZSBtYW5nbGVkIG5hbWUgYXMgYW5vdGhlciBkZWZpbml0aW9ufX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9keW5hbWljX2Nhc3Qtbm8tcnR0aS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZHluYW1pY19jYXN0LW5vLXJ0dGkuY3BwCmluZGV4IDBlMjZkZTUuLmNkZTAzYTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9keW5hbWljX2Nhc3Qtbm8tcnR0aS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2R5bmFtaWNfY2FzdC1uby1ydHRpLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC12ZXJpZnkgLWZuby1ydHRpIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC12ZXJpZnkgLWZuby1ydHRpIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtbyAtIHwgRmlsZUNoZWNrICVzCiAvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwogCiBzdHJ1Y3QgQSB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZWguY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2VoLmNwcAppbmRleCAyYTYxZTYxLi5jNGVjOWRkIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZWguY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9laC5jcHAKQEAgLTE4NCw5ICsxODQsNiBAQAogCiAgIHN0cnVjdCBBIHsgQSgpOyB9OwogCi0gIC8vIENIRUNLLUxBQkVMOiAgICAgIGRlZmluZSB2b2lkIEBfWk41dGVzdDkxQUMxRXYoJSJzdHJ1Y3QudGVzdDk6OkEiKiAldGhpcykgdW5uYW1lZF9hZGRyCi0gIC8vIENIRUNLOiAgICAgIGNhbGwgdm9pZCBAX1pONXRlc3Q5MUFDMkV2Ci0gIC8vIENIRUNLLU5FWFQ6IHJldCB2b2lkCiAKICAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dGVzdDkxQUMyRXYoJSJzdHJ1Y3QudGVzdDk6OkEiKiAldGhpcykgdW5uYW1lZF9hZGRyCiAgIEE6OkEoKSB0cnkgewpAQCAtMTk5LDYgKzE5NiwxMCBAQAogICAvLyBDSEVDSzogICAgICBjYWxsIGk4KiBAX19jeGFfYmVnaW5fY2F0Y2gKICAgLy8gQ0hFQ0s6ICAgICAgaW52b2tlIHZvaWQgQF9aTjV0ZXN0OTZvcGFxdWVFdigpCiAgIC8vIENIRUNLOiAgICAgIGludm9rZSB2b2lkIEBfX2N4YV9yZXRocm93KCkKKworICAvLyBDSEVDSy1MQUJFTDogICAgICBkZWZpbmUgdm9pZCBAX1pONXRlc3Q5MUFDMUV2KCUic3RydWN0LnRlc3Q5OjpBIiogJXRoaXMpIHVubmFtZWRfYWRkcgorICAvLyBDSEVDSzogICAgICBjYWxsIHZvaWQgQF9aTjV0ZXN0OTFBQzJFdgorICAvLyBDSEVDSy1ORVhUOiByZXQgdm9pZAogICAgIG9wYXF1ZSgpOwogICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZWxpZGUtY2FsbC1yZWZlcmVuY2UuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2VsaWRlLWNhbGwtcmVmZXJlbmNlLmNwcAppbmRleCA1NWQzMGUyLi4wY2U4NTZmIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZWxpZGUtY2FsbC1yZWZlcmVuY2UuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9lbGlkZS1jYWxsLXJlZmVyZW5jZS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSB8IEZpbGVDaGVjayAlcwogLy8gUFI1Njk1CiAKIHN0cnVjdCBBIHsgQShjb25zdCBBJik7IH5BKCk7IH07CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZW1wdHktbm9udHJpdmlhbGx5LWNvcHlhYmxlLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9lbXB0eS1ub250cml2aWFsbHktY29weWFibGUuY3BwCmluZGV4IDllZTMyODEuLjk0NTcyOTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9lbXB0eS1ub250cml2aWFsbHktY29weWFibGUuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9lbXB0eS1ub250cml2aWFsbHktY29weWFibGUuY3BwCkBAIC0xLDQgKzEsNSBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtdjctYXBwbGUtaW9zIC14IGMrKyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvcyAteCBjKysgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIC8vIEFjY29yZGluZyB0byB0aGUgSXRhbml1bSBBQkkgKDMuMS4xKSwgdHlwZXMgd2l0aCBub24tdHJpdmlhbCBjb3B5CiAvLyBjb25zdHJ1Y3RvcnMgcGFzc2VkIGJ5IHZhbHVlIHNob3VsZCBiZSBwYXNzZWQgaW5kaXJlY3RseSwgd2l0aCB0aGUgY2FsbGVyCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZXhjZXB0aW9ucy1uby1ydHRpLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9leGNlcHRpb25zLW5vLXJ0dGkuY3BwCmluZGV4IDkwMmQ2YWMuLmUxZWY0ZjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9leGNlcHRpb25zLW5vLXJ0dGkuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9leGNlcHRpb25zLW5vLXJ0dGkuY3BwCkBAIC0xLDEwICsxLDEwIEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1mY3h4LWV4Y2VwdGlvbnMgLWZleGNlcHRpb25zICVzIC10cmlwbGU9eDg2XzY0LWFwcGxlLWRhcndpbjEwIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcwogCi0vLyBDSEVDSzogQF9aVElONXRlc3QxMUFFID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJTjV0ZXN0MTFCRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSU41dGVzdDExQ0UgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVElONXRlc3QxMURFID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUE41dGVzdDExREUgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50IHt7Lip9fSBAX1pUSU41dGVzdDExREUKKy8vIENIRUNLOiBAX1pUSU41dGVzdDExQUUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSU41dGVzdDExQkUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSU41dGVzdDExQ0UgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSU41dGVzdDExREUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVBONXRlc3QxMURFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50IHt7Lip9fSBAX1pUSU41dGVzdDExREUKIAogLy8gUFI2OTc0OiB0aGlzIHNob3VsZG4ndCBjcmFzaAogbmFtZXNwYWNlIHRlc3QwIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9leHRlcm4tYy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZXh0ZXJuLWMuY3BwCmluZGV4IDU4OTliOTMuLjYzYmIxNzcgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9leHRlcm4tYy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2V4dGVybi1jLmNwcApAQCAtMSwxOCArMSwyMSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIG5hbWVzcGFjZSBmb28gewogCi0vLyBDSEVDSy1OT1Q6IEBhID0gZ2xvYmFsIGkzMgorLy8gQ0hFQ0stTk9UOiBAYSA9IGdsb2JhbAogZXh0ZXJuICJDIiBpbnQgYTsKIAotLy8gQ0hFQ0stTk9UOiBAX1pOM2ZvbzFiRSA9IGdsb2JhbCBpMzIKKy8vIENIRUNLLU5PVDogQF9aTjNmb28xYkUgPSBnbG9iYWwKIGV4dGVybiBpbnQgYjsKIAotLy8gQ0hFQ0s6IEBfWk4zZm9vMWNFID0gZ2xvYmFsIGkzMgorLy8gQ0hFQ0s6IEBfWk4zZm9vMWNFID0gZ2xvYmFsCiBpbnQgYyA9IDU7CiAKIC8vIENIRUNLLU5PVDogQF9aTjNmb28xZEUKIGV4dGVybiAiQyIgc3RydWN0IGQ7CiAKKy8vIENIRUNLLU5PVDogc2hvdWxkX25vdF9hcHBlYXIKK2V4dGVybiAiQysrIiBpbnQgc2hvdWxkX25vdF9hcHBlYXI7CisKIH0KIAogbmFtZXNwYWNlIHRlc3QxIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9maWVsZC1hY2Nlc3MtZGVidWctaW5mby5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvZmllbGQtYWNjZXNzLWRlYnVnLWluZm8uY3BwCmluZGV4IGZkODk5ZWQuLmFlZDRlZTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9maWVsZC1hY2Nlc3MtZGVidWctaW5mby5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2ZpZWxkLWFjY2Vzcy1kZWJ1Zy1pbmZvLmNwcApAQCAtMSw4ICsxLDcgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZyAtUyAtbWFzbS12ZXJib3NlIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nIC1nIC1TIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCi0vLyBDSEVDSzogYWJicmV2X2JlZ2luOgotLy8gQ0hFQ0s6IERXX0FUX2FjY2Vzc2liaWxpdHkKLS8vIENIRUNLLU5FWFQ6IERXX0ZPUk1fZGF0YTEKKy8vIENIRUNLOiBbIERXX1RBR19tZW1iZXIgXSBbcF0gW3t7W15dXSp9fV0gW2Zyb20gaW50XQorLy8gQ0hFQ0s6IFsgRFdfVEFHX21lbWJlciBdIFtwcl0gW3t7W15dXSp9fV0gW3ByaXZhdGVdIFtmcm9tIGludF0KIAogY2xhc3MgQSB7CiBwdWJsaWM6CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZnVuY3Rpb24tdGVtcGxhdGUtZXhwbGljaXQtc3BlY2lhbGl6YXRpb24uY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2Z1bmN0aW9uLXRlbXBsYXRlLWV4cGxpY2l0LXNwZWNpYWxpemF0aW9uLmNwcAppbmRleCA1ZDI2ZGNkLi44ZmYwNjU1IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZnVuY3Rpb24tdGVtcGxhdGUtZXhwbGljaXQtc3BlY2lhbGl6YXRpb24uY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9mdW5jdGlvbi10ZW1wbGF0ZS1leHBsaWNpdC1zcGVjaWFsaXphdGlvbi5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGEoVCk7CiB0ZW1wbGF0ZTw+IHZvaWQgYShpbnQpIHt9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvZnVuY3Rpb24tdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24uY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2Z1bmN0aW9uLXRlbXBsYXRlLXNwZWNpYWxpemF0aW9uLmNwcAppbmRleCA0YTc5ZmIxLi5lYjA5OWRmIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvZnVuY3Rpb24tdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24uY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9mdW5jdGlvbi10ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KIFQqIG5leHQoVCogcHRyLCBjb25zdCBVJiBkaWZmKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2dsb2JhbC1sbHZtLWNvbnN0YW50LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9nbG9iYWwtbGx2bS1jb25zdGFudC5jcHAKaW5kZXggMmJkNDNiOS4uNTU5MzNlZSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2dsb2JhbC1sbHZtLWNvbnN0YW50LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvZ2xvYmFsLWxsdm0tY29uc3RhbnQuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAogc3RydWN0IEEgewogICBBKCkgeyB4ID0gMTA7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9pbXBsaWNpdC1pbnN0YW50aWF0aW9uLTEuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2ltcGxpY2l0LWluc3RhbnRpYXRpb24tMS5jcHAKaW5kZXggYmY2YTE0MS4uYzNjNDljMyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2ltcGxpY2l0LWluc3RhbnRpYXRpb24tMS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2ltcGxpY2l0LWluc3RhbnRpYXRpb24tMS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlICVzIC1vICV0CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBzdHJ1Y3QgWCB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvaW5oZXJpdGluZy1jb25zdHJ1Y3Rvci5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvaW5oZXJpdGluZy1jb25zdHJ1Y3Rvci5jcHAKaW5kZXggYzk5YTIwYy4uOTM5NDEzNyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2luaGVyaXRpbmctY29uc3RydWN0b3IuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9pbmhlcml0aW5nLWNvbnN0cnVjdG9yLmNwcApAQCAtMTEsOSArMTEsOSBAQAogc3RydWN0IEQgOiBDIHsgdXNpbmcgQzo6QzsgfTsKIEQgZCgxMjMpOwogCi0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFCRDBFdgotLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQkQxRXYKIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUJEMkV2CisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFCRDFFdgorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQkQwRXYKIAogLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pOMUJDMUVpKAogLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMUJDMkVpKApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2luaXQtcHJpb3JpdHktYXR0ci5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvaW5pdC1wcmlvcml0eS1hdHRyLmNwcAppbmRleCBlZjkzNDNjLi5iMDljNjVlIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvaW5pdC1wcmlvcml0eS1hdHRyLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvaW5pdC1wcmlvcml0eS1hdHRyLmNwcApAQCAtMSw1ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKLS8vIFBSCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLU8yIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUFIxMTQ4MAogCiB2b2lkIGZvbyhpbnQpOwogCkBAIC0zMCwxNSArMzAsMTggQEAKIC8vIENIRUNLOiBAbGx2bS5nbG9iYWxfY3RvcnMgPSBhcHBlbmRpbmcgZ2xvYmFsIFszIHggeyBpMzIsIHZvaWQgKCkqIH1dIFt7IGkzMiwgdm9pZCAoKSogfSB7IGkzMiAyMDAsIHZvaWQgKCkqIEBfR0xPQkFMX19JXzAwMDIwMCB9LCB7IGkzMiwgdm9pZCAoKSogfSB7IGkzMiAzMDAsIHZvaWQgKCkqIEBfR0xPQkFMX19JXzAwMDMwMCB9LCB7IGkzMiwgdm9pZCAoKSogfSB7IGkzMiA2NTUzNSwgdm9pZCAoKSogQF9HTE9CQUxfX0lfYSB9XQogCiAvLyBDSEVDSzogX0dMT0JBTF9fSV8wMDAyMDAoKQotLy8gQ0hFQ0tfTkVYVDogX1ozZm9vaShpMzIgMykKKy8vIENIRUNLOiBfWjNmb29pKGkzMiAzKQorLy8gQ0hFQ0stTkVYVDogcmV0IHZvaWQKIAogLy8gQ0hFQ0s6IF9HTE9CQUxfX0lfMDAwMzAwKCkKLS8vIENIRUNLX05FWFQ6IF9aM2Zvb2koaTMyIDIpCi0vLyBDSEVDS19ORVhUOiBfWjNmb29pKGkzMiAxKQorLy8gQ0hFQ0s6IF9aM2Zvb2koaTMyIDIpCisvLyBDSEVDSy1ORVhUOiBfWjNmb29pKGkzMiAxKQorLy8gQ0hFQ0stTkVYVDogcmV0IHZvaWQKIAogLy8gQ0hFQ0s6IF9HTE9CQUxfX0lfYSgpCi0vLyBDSEVDS19ORVhUOiBfWjNmb29pKGkzMiAxKQotLy8gQ0hFQ0tfTkVYVDogX1ozZm9vaShpMzIgNCkKKy8vIENIRUNLOiBfWjNmb29pKGkzMiAxKQorLy8gQ0hFQ0stTkVYVDogX1ozZm9vaShpMzIgNCkKKy8vIENIRUNLLU5FWFQ6IHJldCB2b2lkCiAKIEMgYzsKIEExIGExIF9fYXR0cmlidXRlX18oKGluaXRfcHJpb3JpdHkgKDMwMCkpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9pbmxpbmUtZnVuY3Rpb25zLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9pbmxpbmUtZnVuY3Rpb25zLmNwcAppbmRleCA5ZjhlNTM2Li42MjJjZmE5IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvaW5saW5lLWZ1bmN0aW9ucy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2lubGluZS1mdW5jdGlvbnMuY3BwCkBAIC0xLDExICsxLDEyIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZT14ODZfNjQtYXBwbGUtZGFyd2luMTAgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXN0ZD1jKysxMSAtdHJpcGxlPXg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0sgLS1jaGVjay1wcmVmaXg9Tk9STUFMCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXN0ZD1jKysxMSAtZm1zLWNvbXBhdGliaWxpdHkgLXRyaXBsZT14ODZfNjQtYXBwbGUtZGFyd2luMTAgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLIC0tY2hlY2stcHJlZml4PU1TVkNDT01QQVQKIC8vIENIRUNLOiA7IE1vZHVsZUlEIAogCiBzdHJ1Y3QgQSB7CiAgICAgaW5saW5lIHZvaWQgZigpOwogfTsKIAotLy8gQ0hFQ0stTk9ULUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUExZkV2CisvLyBDSEVDSy1OT1Q6IGRlZmluZSB2b2lkIEBfWk4xQTFmRXYKIHZvaWQgQTo6ZigpIHsgfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZT4gc3RydWN0IEIgeyB9OwpAQCAtNjcsMyArNjgsNTYgQEAKICAgfQogICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciB2b2lkIEBfWk41dGVzdDIxZkVSS05TXzFBRQogfQorCisvLyBNU1ZDQ09NUEFULUxBQkVMOiBkZWZpbmUgd2Vha19vZHIgdm9pZCBAX1oxN0V4dGVybkFuZElubGluZUZudgorLy8gTk9STUFMLU5PVDogX1oxN0V4dGVybkFuZElubGluZUZudgorZXh0ZXJuIGlubGluZSB2b2lkIEV4dGVybkFuZElubGluZUZuKCkge30KKworLy8gTVNWQ0NPTVBBVC1MQUJFTDogZGVmaW5lIHdlYWtfb2RyIHZvaWQgQF9aMThJbmxpbmVUaGVuRXh0ZXJuRm52CisvLyBOT1JNQUwtTk9UOiBfWjE4SW5saW5lVGhlbkV4dGVybkZudgoraW5saW5lIHZvaWQgSW5saW5lVGhlbkV4dGVybkZuKCkge30KK2V4dGVybiB2b2lkIElubGluZVRoZW5FeHRlcm5GbigpOworCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aMThFeHRlcm5UaGVuSW5saW5lRm52CitleHRlcm4gdm9pZCBFeHRlcm5UaGVuSW5saW5lRm4oKSB7fQorCisvLyBNU1ZDQ09NUEFULUxBQkVMOiBkZWZpbmUgd2Vha19vZHIgdm9pZCBAX1oyNUV4dGVyblRoZW5JbmxpbmVUaGVuRGVmRm52CisvLyBOT1JNQUwtTk9UOiBfWjI1RXh0ZXJuVGhlbklubGluZVRoZW5EZWZGbnYKK2V4dGVybiB2b2lkIEV4dGVyblRoZW5JbmxpbmVUaGVuRGVmRm4oKTsKK2lubGluZSB2b2lkIEV4dGVyblRoZW5JbmxpbmVUaGVuRGVmRm4oKTsKK3ZvaWQgRXh0ZXJuVGhlbklubGluZVRoZW5EZWZGbigpIHt9CisKKy8vIE1TVkNDT01QQVQtTEFCRUw6IGRlZmluZSB3ZWFrX29kciB2b2lkIEBfWjI1SW5saW5lVGhlbkV4dGVyblRoZW5EZWZGbnYKKy8vIE5PUk1BTC1OT1Q6IF9aMjVJbmxpbmVUaGVuRXh0ZXJuVGhlbkRlZkZudgoraW5saW5lIHZvaWQgSW5saW5lVGhlbkV4dGVyblRoZW5EZWZGbigpOworZXh0ZXJuIHZvaWQgSW5saW5lVGhlbkV4dGVyblRoZW5EZWZGbigpOwordm9pZCBJbmxpbmVUaGVuRXh0ZXJuVGhlbkRlZkZuKCkge30KKworLy8gTVNWQ0NPTVBBVC1MQUJFTDogZGVmaW5lIHdlYWtfb2RyIGkzMiBAX1oyMEV4dGVybkFuZENvbnN0ZXhwckZudgorLy8gTk9STUFMLU5PVDogX1oxN0V4dGVybkFuZENvbnN0ZXhwckZudgorZXh0ZXJuIGNvbnN0ZXhwciBpbnQgRXh0ZXJuQW5kQ29uc3RleHByRm4oKSB7IHJldHVybiAwOyB9CisKKy8vIENIRUNLLU5PVDogX1oxMUNvbnN0ZXhwckZudgorY29uc3RleHByIGludCBDb25zdGV4cHJGbigpIHsgcmV0dXJuIDA7IH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitleHRlcm4gaW5saW5lIHZvaWQgRXh0ZXJuSW5saW5lT25QcmltYXJ5VGVtcGxhdGUoVCk7CisKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1oyOUV4dGVybklubGluZU9uUHJpbWFyeVRlbXBsYXRlSWlFdlRfCit0ZW1wbGF0ZSA8Pgordm9pZCBFeHRlcm5JbmxpbmVPblByaW1hcnlUZW1wbGF0ZShpbnQpIHt9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorZXh0ZXJuIGlubGluZSB2b2lkIEV4dGVybklubGluZU9uUHJpbWFyeVRlbXBsYXRlQW5kU3BlY2lhbGl6YXRpb24oVCk7CisKKy8vIE1TVkNDT01QQVQtTEFCRUw6IGRlZmluZSB3ZWFrX29kciB2b2lkIEBfWjQ2RXh0ZXJuSW5saW5lT25QcmltYXJ5VGVtcGxhdGVBbmRTcGVjaWFsaXphdGlvbklpRXZUXworLy8gTk9STUFMLU5PVDogX1o0NkV4dGVybklubGluZU9uUHJpbWFyeVRlbXBsYXRlQW5kU3BlY2lhbGl6YXRpb25JaUV2VF8KK3RlbXBsYXRlIDw+CitleHRlcm4gaW5saW5lIHZvaWQgRXh0ZXJuSW5saW5lT25QcmltYXJ5VGVtcGxhdGVBbmRTcGVjaWFsaXphdGlvbihpbnQpIHt9CisKK3N0cnVjdCBUeXBlV2l0aElubGluZU1ldGhvZHMgeworICAvLyBDSEVDSy1OT1Q6IF9aTjIxVHlwZVdpdGhJbmxpbmVNZXRob2RzOVN0YXRpY0Z1bkV2CisgIHN0YXRpYyB2b2lkIFN0YXRpY0Z1bigpIHt9CisgIC8vIENIRUNLLU5PVDogX1pOMjFUeXBlV2l0aElubGluZU1ldGhvZHMxMk5vblN0YXRpY0Z1bkV2CisgIHZvaWQgTm9uU3RhdGljRnVuKCkgeyBTdGF0aWNGdW4oKTsgfQorfTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9pbnN0cnVtZW50LWZ1bmN0aW9ucy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvaW5zdHJ1bWVudC1mdW5jdGlvbnMuY3BwCmluZGV4IDI1M2UwOTYuLjU4N2I2MzggMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9pbnN0cnVtZW50LWZ1bmN0aW9ucy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL2luc3RydW1lbnQtZnVuY3Rpb25zLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtUyAtZW1pdC1sbHZtIC1vIC0gJXMgLWZpbnN0cnVtZW50LWZ1bmN0aW9ucyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1TIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1vIC0gJXMgLWZpbnN0cnVtZW50LWZ1bmN0aW9ucyB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSzogQF9aNXRlc3QxaQogaW50IHRlc3QxKGludCB4KSB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvaW50NjRfdWludDY0LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9pbnQ2NF91aW50NjQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYzk3NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW5DWFgvaW50NjRfdWludDY0LmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBSRVFVSVJFUzogYXJtLXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm0tbGludXgtZ3VuZWFiaSBcCisvLyBSVU46ICAgLXRhcmdldC1jcHUgY29ydGV4LWE4IFwKKy8vIFJVTjogICAtZW1pdC1sbHZtIC13IC1PMSAtbyAtICVzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFSTSAlcworCisvLyBSRVFVSVJFUzogYWFyY2g2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NC1saW51eC1nbnVlYWJpIFwKKy8vIFJVTjogICAtdGFyZ2V0LWZlYXR1cmUgK25lb24gXAorLy8gUlVOOiAgIC1lbWl0LWxsdm0gLXcgLU8xIC1vIC0gJXMgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQUFSQ0g2NCAlcworCisvLyBUZXN0IGlmIGludDY0X3QgYW5kIHVpbnQ2NF90IGNhbiBiZSBjb3JyZWN0bHkgbWFuZ2xlZC4KKworI2luY2x1ZGUgImFybV9uZW9uLmgiCisvLyBDSEVDSy1BUk06IGYxeCgKKy8vIENIRUNLLUFBUkNINjQ6IGYxbCgKK3ZvaWQgZjEoaW50NjRfdCBhKSB7fQorLy8gQ0hFQ0stQVJNOiBmMnkoCisvLyBDSEVDSy1BQVJDSDY0OiBmMm0oCit2b2lkIGYyKHVpbnQ2NF90IGEpIHt9CisvLyBDSEVDSy1BUk06IGYzUHgoCisvLyBDSEVDSy1BQVJDSDY0OiBmM1BsKAordm9pZCBmMyhpbnQ2NF90ICpwdHIpIHt9CisvLyBDSEVDSy1BUk06IGY0UHkoCisvLyBDSEVDSy1BQVJDSDY0OiBmNFBtKAordm9pZCBmNCh1aW50NjRfdCAqcHRyKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2ludGVybmFsLWxpbmthZ2UuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2ludGVybmFsLWxpbmthZ2UuY3BwCmluZGV4IDU2Y2I4MTAuLjc3YjE2NzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9pbnRlcm5hbC1saW5rYWdlLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvaW50ZXJuYWwtbGlua2FnZS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiBzdHJ1Y3QgR2xvYmFsIHsgR2xvYmFsKCk7IH07CiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7IFgoKSB7fSB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2xpbmV0YWJsZS1jbGVhbnVwLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9saW5ldGFibGUtY2xlYW51cC5jcHAKaW5kZXggOTZiODU3Mi4uY2U3ZjJjNiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL2xpbmV0YWJsZS1jbGVhbnVwLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbGluZXRhYmxlLWNsZWFudXAuY3BwCkBAIC00NiwxMiArNDYsMTQgQEAKIHZvaWQgYmF6KCkKIHsKICAgaWYgKCFmb28oKSkKLSAgICAvLyBDSEVDSzoge3suKn19ID0gbWV0YWRhdGEgIXtpMzIgW1tATElORSsxXV0sIGkzMiAwLCBtZXRhZGF0YSAhe3suKn19LCBudWxsfQorICAgIC8vIENIRUNLOiAhW1tTQ09QRTE6LipdXSA9IG1ldGFkYXRhICF7e3suKn19LCBpMzIgW1tATElORS0xXV0sIHt7Lip9fX0gOyBbIERXX1RBR19sZXhpY2FsX2Jsb2NrIF0KKyAgICAvLyBDSEVDSzoge3suKn19ID0gbWV0YWRhdGEgIXtpMzIgW1tATElORSsxXV0sIGkzMiAwLCBtZXRhZGF0YSAhW1tTQ09QRTFdXSwgbnVsbH0KICAgICByZXR1cm47CiAKICAgaWYgKGZvbygpKSB7CiAgICAgLy8gbm8gY2xlYW51cAotICAgIC8vIENIRUNLOiB7ey4qfX0gPSBtZXRhZGF0YSAhe2kzMiBbW0BMSU5FKzFdXSwgaTMyIDAsIG1ldGFkYXRhICF7ey4qfX0sIG51bGx9CisgICAgLy8gQ0hFQ0s6IHt7Lip9fSA9IG1ldGFkYXRhICF7aTMyIFtbQExJTkUrMl1dLCBpMzIgMCwgbWV0YWRhdGEgIVtbU0NPUEUyOi4qXV0sIG51bGx9CisgICAgLy8gQ0hFQ0s6ICFbW1NDT1BFMl1dID0gbWV0YWRhdGEgIXt7ey4qfX0sIGkzMiBbW0BMSU5FLTNdXSwge3suKn19fSA7IFsgRFdfVEFHX2xleGljYWxfYmxvY2sgXQogICAgIHJldHVybjsKICAgfQogICAvLyBDSEVDSzogIVtbUkVUQkFaXV0gPSBtZXRhZGF0YSAhe2kzMiBbW0BMSU5FKzFdXSwgaTMyIDAsIG1ldGFkYXRhICF7ey4qfX0sIG51bGx9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbGluZXRhYmxlLWVoLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9saW5ldGFibGUtZWguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTUwNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbGluZXRhYmxlLWVoLmNwcApAQCAtMCwwICsxLDQ0IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtZyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1tYWNvc3gxMC45LjAgLW11bndpbmQtdGFibGVzIC1zdGQ9YysrMTEgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgJXMgLW8gLSB8IEZpbGVDaGVjayAlcworCisvLyBUZXN0IHRoYXQgZW1pdHRpbmcgYSBsYW5kaW5nIHBhZCBkb2VzIG5vdCBhZmZlY3QgdGhlIGxpbmUgdGFibGUKKy8vIGVudHJpZXMgZm9yIHRoZSBjb2RlIHRoYXQgdHJpZ2dlcmVkIGl0LgorCisvLyBDSEVDSzogY2FsbCB2b2lkIEBsbHZtLmRiZy5kZWNsYXJlCisvLyBDSEVDSzogY2FsbCB2b2lkIEBsbHZtLmRiZy5kZWNsYXJlKG1ldGFkYXRhICF7e3suKn19fSwgbWV0YWRhdGEgIVtbQ1VSUkVOVF9BRERSOi4qXV0pLCAhZGJnICFbW0RCRzE6LipdXQorLy8gQ0hFQ0s6IHVud2luZCBsYWJlbCAle3suKn19LCAhZGJnICFbW0RCRzFdXQorLy8gQ0hFQ0s6IHN0b3JlIGk2NCAle3suKn19LCBpNjQqICVjdXJyZW50X2FkZHJlc3MsIGFsaWduIDgsICFkYmcgIVtbREJHNDouKl1dCisvLyBDSEVDSy1ORVhUOiBjYWxsIHZvaWQgQGxsdm0uZGJnLmRlY2xhcmUobWV0YWRhdGEgIXt7ey4qfX19LCBtZXRhZGF0YSAhW1tGT1VORF9JVDouKl1dKSwgIWRiZyAhW1tEQkcyOi4qXV0KKy8vIENIRUNLOiA9IGxhbmRpbmdwYWQKKy8vIENIRUNLLU5FWFQ6IGNsZWFudXAsICFkYmcgIVtbREJHMzouKl1dCisvLyBDSEVDSy1EQUc6ICFbW0NVUlJFTlRfQUREUl1dID0ge3suKn19IFtjdXJyZW50X2FkZHJlc3NdCisvLyBDSEVDSy1EQUc6ICFbW0ZPVU5EX0lUXV0gPSB7ey4qfX0gW2ZvdW5kX2l0XQorLy8gQ0hFQ0stREFHOiAhW1tEQkcxXV0gPSBtZXRhZGF0YSAhe2kzMiAyNTYsCisvLyBDSEVDSy1EQUc6ICFbW0RCRzJdXSA9IG1ldGFkYXRhICF7aTMyIDI1NywKKy8vIENIRUNLLURBRzogIVtbREJHM11dID0gbWV0YWRhdGEgIXtpMzIgMjY4LAorLy8gQ0hFQ0stREFHOiAhW1tEQkc0XV0gPSBtZXRhZGF0YSAhe2kzMiAyNTYsCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKK3RlbXBsYXRlPGNsYXNzIF9UcD4gY2xhc3Mgc2hhcmVkX3B0ciB7CitwdWJsaWM6CisgIHR5cGVkZWYgX1RwIGVsZW1lbnRfdHlwZTsKKyAgZWxlbWVudF90eXBlKiBfX3B0cl87CisgIH5zaGFyZWRfcHRyKCk7CisgIGVsZW1lbnRfdHlwZSogb3BlcmF0b3ItPigpIGNvbnN0IG5vZXhjZXB0IHtyZXR1cm4gX19wdHJfO30KK307CitjbGFzcyBDb250ZXh0IHsKK3B1YmxpYzoKKyAgICB1aW50NjRfdCBHZXRJdCgpOworfTsKK2NsYXNzIEZvbworeworICAgIGJvb2wgYmFyKCk7CisgICAgdmlydHVhbCBzaGFyZWRfcHRyPENvbnRleHQ+IEdldENvbnRleHQgKCkgPSAwOworfTsKKyMgMjUzICJGb28uY3BwIiAzCitib29sCitGb286OmJhciAoKQoreworICB1aW50NjRfdCBjdXJyZW50X2FkZHJlc3MgPSBHZXRDb250ZXh0KCktPkdldEl0KCk7CisgIGJvb2wgZm91bmRfaXQgPSBmYWxzZTsKKyMgMjY3ICJGb28uY3BwIiAzCisgIHJldHVybiBmb3VuZF9pdDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9saW5ldGFibGUtZm5iZWdpbi5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbGluZXRhYmxlLWZuYmVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDYzMDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbGluZXRhYmxlLWZuYmVnaW4uY3BwCkBAIC0wLDAgKzEsMjggQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFRlc3QgdGhhdCB0aGUgbGluZSB0YWJsZSBpbmZvIGZvciBGb288VD46OmJhcigpIGlzIHBvaW50aW5nIHRvIHRoZQorLy8gcmlnaHQgaGVhZGVyIGZpbGUuCisvLyBDSEVDSzogZGVmaW5le3suKn19YmFyCisvLyBDSEVDSy1OT1Q6IGRlZmluZQorLy8gQ0hFQ0s6IHJldCB7ey4qfX0sICFkYmcgW1tEQkc6LipdXQorLy8gQ0hFQ0s6IFtbSFBQOi4qXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiLi90ZW1wbGF0ZS5ocHAiLAorLy8gQ0hFQ0s6IFtbU1A6LipdXSA9IG1ldGFkYXRhICF7aTMyIDc4NjQ3OCwgbWV0YWRhdGEgW1tIUFBdXSx7ey4qfX1bIERXX1RBR19zdWJwcm9ncmFtIF0gW2xpbmUgMjJdIFtkZWZdIFtiYXJdCisvLyBXZSBzaG91bGRuJ3QgbmVlZCBhIGxleGljYWwgYmxvY2sgZm9yIHRoaXMgZnVuY3Rpb24uCisvLyBDSEVDSzogW1tEQkddXSA9IG1ldGFkYXRhICF7aTMyIDIzLCBpMzIgMCwgbWV0YWRhdGEgW1tTUF1dLCBudWxsfQorCisKKyMgMSAiLi90ZW1wbGF0ZS5oIiAxCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEZvbyB7CitwdWJsaWM6CisgIGludCBiYXIoKTsKK307CisjIDIxICIuL3RlbXBsYXRlLmhwcCIKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW50IEZvbzxUPjo6YmFyKCkgeworICByZXR1cm4gMjM7Cit9CitpbnQgbWFpbiAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2W10pCit7CisgIEZvbzxpbnQ+IGY7CisgIHJldHVybiBmLmJhcigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL2xpbmthZ2UuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL2xpbmthZ2UuY3BwCmluZGV4IDE5ZjFiMjAuLjYwZTUzYzYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9saW5rYWdlLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbGlua2FnZS5jcHAKQEAgLTEsNyArMSw3IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWVtaXQtbGx2bSAtc3RkPWMrKzExIC1PMSAtZGlzYWJsZS1sbHZtLW9wdHpucyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIG5hbWVzcGFjZSB0ZXN0MSB7Ci0gIC8vIENIRUNLLURBRy1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciB2b2lkIEBfWk41dGVzdDExZklaTlNfMWdFdkUxU0VFdlRfKAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONXRlc3QxMWZJWk5TXzFnRXZFMVNFRXZUXygKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgZihUKSB7fQogICBpbmxpbmUgdm9pZCAqZygpIHsKICAgICBzdHJ1Y3QgUyB7CkBAIC0xMiw3ICsxMiw3IEBACiB9CiAKIG5hbWVzcGFjZSB0ZXN0MiB7Ci0gIC8vIENIRUNLLURBRy1MQUJFTDogZGVmaW5lIGludGVybmFsIHZvaWQgQF9aTjV0ZXN0MjFmSVpOU19MMWdFdkUxU0VFdlRfKAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBpbnRlcm5hbCB2b2lkIEBfWk41dGVzdDIxZklaTlNfTDFnRXZFMVNFRXZUXygKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgZihUKSB7fQogICBzdGF0aWMgaW5saW5lIHZvaWQgKmcoKSB7CiAgICAgc3RydWN0IFMgewpAQCAtMjMsNyArMjMsNyBAQAogfQogCiBuYW1lc3BhY2UgdGVzdDMgewotICAvLyBDSEVDSy1EQUctTEFCRUw6IGRlZmluZSBpbnRlcm5hbCB2b2lkIEBfWk41dGVzdDMxZklaTlNfMWdFdkUxU0VFdlRfKAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBpbnRlcm5hbCB2b2lkIEBfWk41dGVzdDMxZklaTlNfMWdFdkUxU0VFdlRfKAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBmKFQpIHt9CiAgIHZvaWQgKmcoKSB7CiAgICAgc3RydWN0IFMgewpAQCAtMzQsNyArMzQsNyBAQAogfQogCiBuYW1lc3BhY2UgdGVzdDQgewotICAvLyBDSEVDSy1EQUctTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONXRlc3Q0MWZJWk5TXzFnSUxpMUVFRVB2dkUxU0VFdlRfKAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONXRlc3Q0MWZJWk5TXzFnSUxpMUVFRVB2dkUxU0VFdlRfKAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBmKFQpIHt9CiAgIHRlbXBsYXRlIDxpbnQgTj4gaW5saW5lIHZvaWQgKmcoKSB7CiAgICAgc3RydWN0IFMgewpAQCAtNDYsNyArNDYsNyBAQAogfQogCiBuYW1lc3BhY2UgdGVzdDUgewotICAvLyBDSEVDSy1EQUctTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONXRlc3Q1MWZJWk5TXzFnSUxpMUVFRVB2dkUxU0VFdlRfKAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONXRlc3Q1MWZJWk5TXzFnSUxpMUVFRVB2dkUxU0VFdlRfKAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBmKFQpIHt9CiAgIHRlbXBsYXRlIDxpbnQgTj4gaW5saW5lIHZvaWQgKmcoKSB7CiAgICAgc3RydWN0IFMgewpAQCAtNTgsNyArNTgsNyBAQAogfQogCiBuYW1lc3BhY2UgdGVzdDYgewotICAvLyBDSEVDSy1EQUctTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONXRlc3Q2MWZJWlpOU18xZ0V2RU4xUzFoRXZFMVRFRXZ2KAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONXRlc3Q2MWZJWlpOU18xZ0V2RU4xUzFoRXZFMVRFRXZ2KAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBmKCkge30KIAogICBpbmxpbmUgdm9pZCAqZygpIHsKQEAgLTc2LDcgKzc2LDcgQEAKIH0KIAogbmFtZXNwYWNlIHRlc3Q3IHsKLSAgLy8gQ0hFQ0stREFHLUxBQkVMOiBkZWZpbmUgaW50ZXJuYWwgdm9pZCBAX1pONXRlc3Q3MWZJWlpOU18xZ0V2RU4xUzFoRXZFMVRFRXZ2KAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBpbnRlcm5hbCB2b2lkIEBfWk41dGVzdDcxZklaWk5TXzFnRXZFTjFTMWhFdkUxVEVFdnYoCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGYoKSB7fQogCiAgIHZvaWQgKmcoKSB7CkBAIC05NCw3ICs5NCw3IEBACiB9CiAKIG5hbWVzcGFjZSB0ZXN0OCB7Ci0gIC8vIENIRUNLLURBRy1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciB2b2lkIEBfWk41dGVzdDgxZklaTlNfMWdFdkUxU0VFdlRfKAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONXRlc3Q4MWZJWk5TXzFnRXZFMVNFRXZUXygKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgZihUKSB7fQogICBpbmxpbmUgdm9pZCAqZygpIHsKICAgICBlbnVtIFMgewpAQCAtMTA1LDcgKzEwNSw3IEBACiB9CiAKIG5hbWVzcGFjZSB0ZXN0OSB7Ci0gIC8vIENIRUNLLURBRy1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciB2b2lkIEBfWk41dGVzdDkxZklQWk5TXzFnRXZFMVNFRXZUXygKKyAgLy8gQ0hFQ0stREFHOiBkZWZpbmUgbGlua29uY2Vfb2RyIHZvaWQgQF9aTjV0ZXN0OTFmSVBaTlNfMWdFdkUxU0VFdlRfKAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBmKFQpIHt9CiAgIGlubGluZSB2b2lkICpnKCkgewogICAgIHN0cnVjdCBTIHsKQEAgLTExNiw3ICsxMTYsNyBAQAogfQogCiBuYW1lc3BhY2UgdGVzdDEwIHsKLSAgLy8gQ0hFQ0stREFHLUxBQkVMOiBkZWZpbmUgbGlua29uY2Vfb2RyIHZvaWQgQF9aTjZ0ZXN0MTAxZklQRlpOU18xZ0V2RTFTdkVFRXZUXygKKyAgLy8gQ0hFQ0stREFHOiBkZWZpbmUgbGlua29uY2Vfb2RyIHZvaWQgQF9aTjZ0ZXN0MTAxZklQRlpOU18xZ0V2RTFTdkVFRXZUXygKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgZihUKSB7fQogICBpbmxpbmUgdm9pZCAqZygpIHsKICAgICBzdHJ1Y3QgUyB7CkBAIC0xMjgsNyArMTI4LDcgQEAKIH0KIAogbmFtZXNwYWNlIHRlc3QxMSB7Ci0gIC8vIENIRUNLLURBRy1MQUJFTDogZGVmaW5lIGludGVybmFsIHZvaWQgQF9aTjZ0ZXN0MTExZklQRlpOU18xZ0V2RTFTUE5TXzEyX0dMT0JBTF9fTl8xMUlFRUVFdlRfKAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBpbnRlcm5hbCB2b2lkIEBfWk42dGVzdDExMWZJUEZaTlNfMWdFdkUxU1BOU18xMl9HTE9CQUxfX05fMTFJRUVFRXZUXygKICAgbmFtZXNwYWNlIHsKICAgICBzdHJ1Y3QgSSB7CiAgICAgfTsKQEAgLTE0NSw3ICsxNDUsNyBAQAogfQogCiBuYW1lc3BhY2UgdGVzdDEyIHsKLSAgLy8gQ0hFQ0stREFHLUxBQkVMOiBkZWZpbmUgbGlua29uY2Vfb2RyIHZvaWQgQF9aTjZ0ZXN0MTIzZm9vSVpOU18zYmFySVpOU18zemVkRXZFMlMyRUVQdnZFMlMxRUV2dgorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONnRlc3QxMjNmb29JWk5TXzNiYXJJWk5TXzN6ZWRFdkUyUzJFRVB2dkUyUzFFRXZ2CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGZvbygpIHt9CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbmxpbmUgdm9pZCAqYmFyKCkgewogICAgIGVudW0gUzEgewpAQCAtMTYxLDcgKzE2MSw3IEBACiB9CiAKIG5hbWVzcGFjZSB0ZXN0MTMgewotICAvLyBDSEVDSy1EQUctTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1paTjZ0ZXN0MTMzZm9vRXZFTjFTM2JhckV2KAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1paTjZ0ZXN0MTMzZm9vRXZFTjFTM2JhckV2KAogICBpbmxpbmUgdm9pZCAqZm9vKCkgewogICAgIHN0cnVjdCBTIHsKICAgICAgIHN0YXRpYyB2b2lkIGJhcigpIHt9CkBAIC0xNzIsNyArMTcyLDcgQEAKIH0KIAogbmFtZXNwYWNlIHRlc3QxNCB7Ci0gIC8vIENIRUNLLURBRy1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciB2b2lkIEBfWk42dGVzdDE0M2Zvb0laTlNfMWZFdkUxU0UzYmFySUxQUzFfMEVFRXZ2KAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONnRlc3QxNDNmb29JWk5TXzFmRXZFMVNFM2JhcklMUFMxXzBFRUV2digKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBmb28gewogICAgIHRlbXBsYXRlIDxUICpQPiBzdGF0aWMgdm9pZCBiYXIoKSB7fQogICAgIHN0YXRpYyB2b2lkICpnKCkgeyByZXR1cm4gKHZvaWQgKiliYXI8bnVsbHB0cj47IH0KQEAgLTE4Niw3ICsxODYsNyBAQAogfQogCiBuYW1lc3BhY2UgdGVzdDE1IHsKLSAgLy8gQ0hFQ0stREFHLUxBQkVMOiBkZWZpbmUgbGlua29uY2Vfb2RyIHZvaWQgQF9aTjZ0ZXN0MTUzemVkSVpOU18zZm9vSWlFRVB2dkUzYmFyRUV2digKKyAgLy8gQ0hFQ0stREFHOiBkZWZpbmUgbGlua29uY2Vfb2RyIHZvaWQgQF9aTjZ0ZXN0MTUzemVkSVpOU18zZm9vSWlFRVB2dkUzYmFyRUV2digKICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgemVkKCkge30KICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgKmZvbygpIHsKICAgICBjbGFzcyBiYXIgewpAQCAtMTk3LDcgKzE5Nyw3IEBACiB9CiAKIG5hbWVzcGFjZSB0ZXN0MTYgewotICAvLyBDSEVDSy1EQUctTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONnRlc3QxNjN6ZWRJWk5TXzNmb29JaUUzYmFyRXZFMVNFRXZ2KAorICAvLyBDSEVDSy1EQUc6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONnRlc3QxNjN6ZWRJWk5TXzNmb29JaUUzYmFyRXZFMVNFRXZ2KAogICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCB6ZWQoKSB7fQogICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGZvbyB7CiAgICAgc3RhdGljIHZvaWQgKmJhcigpOwpAQCAtMjEyLDcgKzIxMiw3IEBACiAKIG5hbWVzcGFjZSB0ZXN0MTcgewogICAvLyBDSEVDSy1EQUc6IEBfWlpONnRlc3QxNzNmb29JTGk0MkVFRVBpdkUzYmFyID0gbGlua29uY2Vfb2RyCi0gIC8vIENIRUNLLURBRy1MQUJFTDogZGVmaW5lIHdlYWtfb2RyIGkzMiogQF9aTjZ0ZXN0MTczZm9vSUxpNDJFRUVQaXYoCisgIC8vIENIRUNLLURBRzogZGVmaW5lIHdlYWtfb2RyIGkzMiogQF9aTjZ0ZXN0MTczZm9vSUxpNDJFRUVQaXYoCiAgIHRlbXBsYXRlPGludCBJPgogICBpbnQgKmZvbygpIHsKICAgICBzdGF0aWMgaW50IGJhcjsKQEAgLTIyMCwzICsyMjAsMTEgQEAKICAgfQogICB0ZW1wbGF0ZSBpbnQgKmZvbzw0Mj4oKTsKIH0KKworLy8gUFIxODQwOAorbmFtZXNwYWNlIHRlc3QxOCB7CisgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcz4gc3RydWN0IEEge307CisgIHN0cnVjdCBCIHsgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBDOyB9OworICB2b2lkIGYoQTxCOjpDPikge30KKyAgLy8gQ0hFQ0stREFHOiBkZWZpbmUgdm9pZCBAX1pONnRlc3QxODFmRU5TXzFBSU5TXzFCMUNFRUUoCit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLWFiaS1leGFtcGxlcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLWFiaS1leGFtcGxlcy5jcHAKaW5kZXggNzEyNDA3OC4uNmZiODJjZiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1hYmktZXhhbXBsZXMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtYWJpLWV4YW1wbGVzLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIC8vIENIRUNLOiBAX1pUVlozZm9vdkVOMUMxREUgPQogLy8gQ0hFQ0s6IEBfWlRWWk4xQTNmb29FaUUxQiA9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLWFkZHJlc3Mtc3BhY2UuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1hZGRyZXNzLXNwYWNlLmNwcAppbmRleCA0YTRhMWYzLi5hMGIzYzFhIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLWFkZHJlc3Mtc3BhY2UuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtYWRkcmVzcy1zcGFjZS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aMmYwUGMKIHZvaWQgZjAoY2hhciAqcCkgeyB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLWFsaWFzLXRlbXBsYXRlLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtYWxpYXMtdGVtcGxhdGUuY3BwCmluZGV4IGI2NzE5YzUuLjFkYmIzZWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtYWxpYXMtdGVtcGxhdGUuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtYWxpYXMtdGVtcGxhdGUuY3BwCkBAIC0xMSwxMCArMTEsNiBAQAogCiB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgRj4gdm9pZCBoKEY8aW50Pik7CiAKLXRlbXBsYXRlPHR5cGVuYW1lLHR5cGVuYW1lLHR5cGVuYW1lPiBzdHJ1Y3QgUyB7fTsKLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHVzaW5nIFUgPSBTPFQsIGludCwgVT47Ci10ZW1wbGF0ZTx0eXBlbmFtZS4uLlRzPiB2b2lkIGgoVTxUcy4uLj4sIFRzLi4uKTsKLQogLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWjF6digKIHZvaWQgeigpIHsKICAgdmVjdG9yPGludD4gVkk7CkBAIC00Miw3ICszOCw0IEBACiAgIFZlYzxWZWM8aW50Pj4gVlZJOwogICBnKFZWSSk7CiAgIC8vIENIRUNLOiBjYWxsIHZvaWQgQF9aMWdJNnZlY3RvcklTMF9JaTVhbGxvY0lpRUVTMV9JUzNfRUVFdlRfKAotCi0gIC8vIENIRUNLOiBjYWxsIHZvaWQgQF9aMWhJSmlkRUV2MVVJRHBUX0VTMl8KLSAgaCh7fSwgMCwgMC4wKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbG9jYWwtY2xhc3MtbmFtZXMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1sb2NhbC1jbGFzcy1uYW1lcy5jcHAKaW5kZXggOGI5NTBmYy4uODQ4ZTQ2MCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1sb2NhbC1jbGFzcy1uYW1lcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1sb2NhbC1jbGFzcy1uYW1lcy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSzogIEBfWlo0RlVOQ3ZFTjRTU1NTQzFFUktmCiAvLyBDSEVDSzogQF9aWjRGVU5DdkVONFNTU1NDMkVfMFJLZgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1sb2NhbC1jbGFzcy12dGFibGVzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbG9jYWwtY2xhc3MtdnRhYmxlcy5jcHAKaW5kZXggZDlkM2FmZS4uMDc4ZDczNSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1sb2NhbC1jbGFzcy12dGFibGVzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLWxvY2FsLWNsYXNzLXZ0YWJsZXMuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0s6IEBfWlRWWk4xSjFLRXZFMUMgPSB7ey4qfX0gQF9aVElaTjFKMUtFdkUxQyB7ey4qfX0gQF9aWk4xSjFLRXZFTksxQzFGRXYgCiAvLyBDSEVDSzogQF9aVElaTjFKMUtFdkUxQyA9IHt7Lip9fSBAX1pUU1pOMUoxS0V2RTFDCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLWxvY2FsLWNsYXNzZXMtbmVzdGVkLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbG9jYWwtY2xhc3Nlcy1uZXN0ZWQuY3BwCmluZGV4IGZhZmE1ZDQuLmNlZTU0MWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbG9jYWwtY2xhc3Nlcy1uZXN0ZWQuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbG9jYWwtY2xhc3Nlcy1uZXN0ZWQuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0s6IEBfWlRWWloxSHZFTjFTMUlFdkUxUyA9IAogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLWFiaS1leGFtcGxlcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLWFiaS1leGFtcGxlcy5jcHAKaW5kZXggZDY3MjZjYS4uNWRjOWQyZSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy1hYmktZXhhbXBsZXMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtYWJpLWV4YW1wbGVzLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm1zLWV4dGVuc2lvbnMgLWZuby1ydHRpIC1lbWl0LWxsdm0gJXMgLW8gLSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZtcy1leHRlbnNpb25zIC1mbm8tcnR0aSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCiAKIC8vIENIRUNLOiBAIlwwMT8/XzdEQENAPzE/P2Zvb0BAWUFYWFpANkJAIiA9CiAvLyBDSEVDSzogQCJcMDE/P183QkA/MT8/Zm9vQEFAQFFBRVhIQFpANkJAIiA9CkBAIC0xMSw3ICsxMSw3IEBACiAgICAgQigpOwogICB9CiB9Owotdm9pZCBmb28gKCkgeworaW5saW5lIHZvaWQgZm9vICgpIHsKICAgc3RydWN0IEMgewogICAgIHN0cnVjdCBEIHsgdmlydHVhbCB+RCgpIHt9IH07CiAgICAgdm9pZCBiYXIgKCkgewpAQCAtMjUsNCArMjUsNiBAQAogICBDOjpEKCk7CiAgIEMoKS5iYXIoKTsKIH0KLQordm9pZCBjYWxsICgpIHsKKyAgZm9vKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLWFyZy1xdWFsaWZpZXJzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtYXJnLXF1YWxpZmllcnMuY3BwCmluZGV4IDUwYTIzODMuLmZhZTJlMWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtYXJnLXF1YWxpZmllcnMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtYXJnLXF1YWxpZmllcnMuY3BwCkBAIC0xLDUgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVg2NCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPWkzODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT14ODZfNjQtcGMtd2luMzIgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1YNjQgJXMKIAogdm9pZCBmb28oY29uc3QgdW5zaWduZWQgaW50KSB7fQogLy8gQ0hFQ0s6ICJcMDE/Zm9vQEBZQVhJQFoiCkBAIC0zNyw2ICszNywyMiBAQAogLy8gQ0hFQ0s6ICJcMDE/Zm9vX3NhZEBAWUFYU0FEQFoiCiAvLyBYNjQ6ICJcMDE/Zm9vX3NhZEBAWUFYU0VBREBaIgogCit2b2lkIGZvb19waWFkKGNoYXIgKiBfX3Jlc3RyaWN0IHgpIHt9CisvLyBDSEVDSzogIlwwMT9mb29fcGlhZEBAWUFYUElBREBaIgorLy8gWDY0OiAiXDAxP2Zvb19waWFkQEBZQVhQRUlBREBaIgorCit2b2lkIGZvb19xaWFkKGNoYXIgKiBjb25zdCBfX3Jlc3RyaWN0IHgpIHt9CisvLyBDSEVDSzogIlwwMT9mb29fcWlhZEBAWUFYUUlBREBaIgorLy8gWDY0OiAiXDAxP2Zvb19xaWFkQEBZQVhRRUlBREBaIgorCit2b2lkIGZvb19yaWFkKGNoYXIgKiB2b2xhdGlsZSBfX3Jlc3RyaWN0IHgpIHt9CisvLyBDSEVDSzogIlwwMT9mb29fcmlhZEBAWUFYUklBREBaIgorLy8gWDY0OiAiXDAxP2Zvb19yaWFkQEBZQVhSRUlBREBaIgorCit2b2lkIGZvb19zaWFkKGNoYXIgKiBjb25zdCB2b2xhdGlsZSBfX3Jlc3RyaWN0IHgpIHt9CisvLyBDSEVDSzogIlwwMT9mb29fc2lhZEBAWUFYU0lBREBaIgorLy8gWDY0OiAiXDAxP2Zvb19zaWFkQEBZQVhTRUlBREBaIgorCiB2b2lkIGZvb19wYXBhZChjaGFyICoqIHgpIHt9CiAvLyBDSEVDSzogIlwwMT9mb29fcGFwYWRAQFlBWFBBUEFEQFoiCiAvLyBYNjQ6ICJcMDE/Zm9vX3BhcGFkQEBZQVhQRUFQRUFEQFoiCkBAIC0yMzgsMyArMjU0LDcgQEAKIHZvaWQgbWFuZ2xlX3llc19iYWNrcmVmMyhwdHJfdG9fZnVuX3R5cGUgKmNvbnN0LCB2b2lkICgqKmNvbnN0KSh2b2lkKSkge30KIC8vIENIRUNLOiAiXDAxP21hbmdsZV95ZXNfYmFja3JlZjNAQFlBWFFBUDZBWFhaMEBaIgogLy8gWDY0OiAgICJcMDE/bWFuZ2xlX3llc19iYWNrcmVmM0BAWUFYUUVBUDZBWFhaMEBaIgorCit2b2lkIG1hbmdsZV95ZXNfYmFja3JlZjQoaW50ICpjb25zdCBfX3Jlc3RyaWN0LCBpbnQgKmNvbnN0IF9fcmVzdHJpY3QpIHt9CisvLyBDSEVDSzogIlwwMT9tYW5nbGVfeWVzX2JhY2tyZWY0QEBZQVhRSUFIMEBaIgorLy8gWDY0OiAgICJcMDE/bWFuZ2xlX3llc19iYWNrcmVmNEBAWUFYUUVJQUgwQFoiCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLWJhY2stcmVmZXJlbmNlcy1wcjEzMjA3LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtYmFjay1yZWZlcmVuY2VzLXByMTMyMDcuY3BwCmluZGV4IGUxMGNjOGUuLjVkNGI2NzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtYmFjay1yZWZlcmVuY2VzLXByMTMyMDcuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtYmFjay1yZWZlcmVuY2VzLXByMTMyMDcuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiB8IEZpbGVDaGVjayAlcwogCiB0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZLCBjbGFzcyBaPgogY2xhc3MgQSB7fTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtYmFjay1yZWZlcmVuY2VzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtYmFjay1yZWZlcmVuY2VzLmNwcAppbmRleCA0ZjE3MzI2Li4yNWEwNThhIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLWJhY2stcmVmZXJlbmNlcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy1iYWNrLXJlZmVyZW5jZXMuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbXMtZXh0ZW5zaW9ucyAtZmJsb2NrcyAtZW1pdC1sbHZtICVzIC1vIC0gLWN4eC1hYmkgbWljcm9zb2Z0IC10cmlwbGU9aTM4Ni1wYy13aW4zMiB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mbXMtZXh0ZW5zaW9ucyAtZmJsb2NrcyAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCiAKIHZvaWQgZjEoY29uc3QgY2hhciogYSwgY29uc3QgY2hhciogYikge30KIC8vIENIRUNLOiAiXDAxP2YxQEBZQVhQQkQwQFoiCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLWN4eDExLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtY3h4MTEuY3BwCmluZGV4IDY5NDdhNTMuLjNhY2Q3YTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtY3h4MTEuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtY3h4MTEuY3BwCkBAIC0xLDQgKzEsNyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWZtcy1leHRlbnNpb25zIC1lbWl0LWxsdm0gJXMgLW8gLSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZm1zLWV4dGVuc2lvbnMgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiB8IEZpbGVDaGVjayAlcworCisvLyBDSEVDSzogIlwwMT9EZWR1Y2VkVHlwZUBAM0hBIgorYXV0byBEZWR1Y2VkVHlwZSA9IDMwOwogCiAvLyBDSEVDSzogIlwwMT9MUmVmQEBZQVhBQUhAWiIKIHZvaWQgTFJlZihpbnQmIGEpIHsgfQpAQCAtOSwzICsxMiwxMTAgQEAKIC8vIENIRUNLOiAiXDAxP051bGxAQFlBWCQkVEBaIgogbmFtZXNwYWNlIHN0ZCB7IHR5cGVkZWYgZGVjbHR5cGUoX19udWxscHRyKSBudWxscHRyX3Q7IH0KIHZvaWQgTnVsbChzdGQ6Om51bGxwdHJfdCkge30KKworbmFtZXNwYWNlIEVudW1NYW5nbGluZyB7CisgIGV4dGVybiBlbnVtIEVudW0wMSB7IH0gRW51bTsKKyAgZXh0ZXJuIGVudW0gRW51bTAyIDogYm9vbCB7IH0gQm9vbEVudW07CisgIGV4dGVybiBlbnVtIEVudW0wMyA6IGNoYXIgeyB9IENoYXJFbnVtOworICBleHRlcm4gZW51bSBFbnVtMDQgOiBzaWduZWQgY2hhciB7IH0gU0NoYXJFbnVtOworICBleHRlcm4gZW51bSBFbnVtMDUgOiB1bnNpZ25lZCBjaGFyIHsgfSBVQ2hhckVudW07CisgIGV4dGVybiBlbnVtIEVudW0wNiA6IHNob3J0IHsgfSBTU2hvcnRFbnVtOworICBleHRlcm4gZW51bSBFbnVtMDcgOiB1bnNpZ25lZCBzaG9ydCB7IH0gVVNob3J0RW51bTsKKyAgZXh0ZXJuIGVudW0gRW51bTA4IDogaW50IHsgfSBTSW50RW51bTsKKyAgZXh0ZXJuIGVudW0gRW51bTA5IDogdW5zaWduZWQgaW50IHsgfSBVSW50RW51bTsKKyAgZXh0ZXJuIGVudW0gRW51bTEwIDogbG9uZyB7IH0gU0xvbmdFbnVtOworICBleHRlcm4gZW51bSBFbnVtMTEgOiB1bnNpZ25lZCBsb25nIHsgfSBVTG9uZ0VudW07CisgIGV4dGVybiBlbnVtIEVudW0xMiA6IGxvbmcgbG9uZyB7IH0gU0xvbmdMb25nRW51bTsKKyAgZXh0ZXJuIGVudW0gRW51bTEzIDogdW5zaWduZWQgbG9uZyBsb25nIHsgfSBVTG9uZ0xvbmdFbnVtOworLy8gQ0hFQ0stREFHOiBAIlwwMT9FbnVtQEVudW1NYW5nbGluZ0BAM1c0RW51bTAxQDFAQSIKKy8vIENIRUNLLURBRzogQCJcMDE/Qm9vbEVudW1ARW51bU1hbmdsaW5nQEAzVzRFbnVtMDJAMUBBCisvLyBDSEVDSy1EQUc6IEAiXDAxP0NoYXJFbnVtQEVudW1NYW5nbGluZ0BAM1c0RW51bTAzQDFAQQorLy8gQ0hFQ0stREFHOiBAIlwwMT9TQ2hhckVudW1ARW51bU1hbmdsaW5nQEAzVzRFbnVtMDRAMUBBCisvLyBDSEVDSy1EQUc6IEAiXDAxP1VDaGFyRW51bUBFbnVtTWFuZ2xpbmdAQDNXNEVudW0wNUAxQEEKKy8vIENIRUNLLURBRzogQCJcMDE/U1Nob3J0RW51bUBFbnVtTWFuZ2xpbmdAQDNXNEVudW0wNkAxQEEiCisvLyBDSEVDSy1EQUc6IEAiXDAxP1VTaG9ydEVudW1ARW51bU1hbmdsaW5nQEAzVzRFbnVtMDdAMUBBIgorLy8gQ0hFQ0stREFHOiBAIlwwMT9TSW50RW51bUBFbnVtTWFuZ2xpbmdAQDNXNEVudW0wOEAxQEEiCisvLyBDSEVDSy1EQUc6IEAiXDAxP1VJbnRFbnVtQEVudW1NYW5nbGluZ0BAM1c0RW51bTA5QDFAQSIKKy8vIENIRUNLLURBRzogQCJcMDE/U0xvbmdFbnVtQEVudW1NYW5nbGluZ0BAM1c0RW51bTEwQDFAQSIKKy8vIENIRUNLLURBRzogQCJcMDE/VUxvbmdFbnVtQEVudW1NYW5nbGluZ0BAM1c0RW51bTExQDFAQSIKKy8vIENIRUNLLURBRzogQCJcMDE/U0xvbmdMb25nRW51bUBFbnVtTWFuZ2xpbmdAQDNXNEVudW0xMkAxQEEiCisvLyBDSEVDSy1EQUc6IEAiXDAxP1VMb25nTG9uZ0VudW1ARW51bU1hbmdsaW5nQEAzVzRFbnVtMTNAMUBBIgorICBkZWNsdHlwZShFbnVtKSAqVXNlRW51bSgpIHsgcmV0dXJuICZFbnVtOyB9CisgIGRlY2x0eXBlKEJvb2xFbnVtKSAqVXNlQm9vbEVudW0oKSB7IHJldHVybiAmQm9vbEVudW07IH0KKyAgZGVjbHR5cGUoQ2hhckVudW0pICpVc2VDaGFyRW51bSgpIHsgcmV0dXJuICZDaGFyRW51bTsgfQorICBkZWNsdHlwZShTQ2hhckVudW0pICpVc2VTQ2hhckVudW0oKSB7IHJldHVybiAmU0NoYXJFbnVtOyB9CisgIGRlY2x0eXBlKFVDaGFyRW51bSkgKlVzZVVDaGFyRW51bSgpIHsgcmV0dXJuICZVQ2hhckVudW07IH0KKyAgZGVjbHR5cGUoU1Nob3J0RW51bSkgKlVzZVNTaG9ydEVudW0oKSB7IHJldHVybiAmU1Nob3J0RW51bTsgfQorICBkZWNsdHlwZShVU2hvcnRFbnVtKSAqVXNlVVNob3J0RW51bSgpIHsgcmV0dXJuICZVU2hvcnRFbnVtOyB9CisgIGRlY2x0eXBlKFNJbnRFbnVtKSAqVXNlU0ludEVudW0oKSB7IHJldHVybiAmU0ludEVudW07IH0KKyAgZGVjbHR5cGUoVUludEVudW0pICpVc2VVSW50RW51bSgpIHsgcmV0dXJuICZVSW50RW51bTsgfQorICBkZWNsdHlwZShTTG9uZ0VudW0pICpVc2VTTG9uZ0VudW0oKSB7IHJldHVybiAmU0xvbmdFbnVtOyB9CisgIGRlY2x0eXBlKFVMb25nRW51bSkgKlVzZVVMb25nRW51bSgpIHsgcmV0dXJuICZVTG9uZ0VudW07IH0KKyAgZGVjbHR5cGUoU0xvbmdMb25nRW51bSkgKlVzZVNMb25nTG9uZ0VudW0oKSB7IHJldHVybiAmU0xvbmdMb25nRW51bTsgfQorICBkZWNsdHlwZShVTG9uZ0xvbmdFbnVtKSAqVXNlVUxvbmdMb25nRW51bSgpIHsgcmV0dXJuICZVTG9uZ0xvbmdFbnVtOyB9CisgIGV4dGVybiBlbnVtIGNsYXNzIEVudW1DbGFzczAxIHsgfSBFbnVtQ2xhc3M7CisgIGV4dGVybiBlbnVtIGNsYXNzIEVudW1DbGFzczAyIDogYm9vbCB7IH0gQm9vbEVudW1DbGFzczsKKyAgZXh0ZXJuIGVudW0gY2xhc3MgRW51bUNsYXNzMDMgOiBjaGFyIHsgfSBDaGFyRW51bUNsYXNzOworICBleHRlcm4gZW51bSBjbGFzcyBFbnVtQ2xhc3MwNCA6IHNpZ25lZCBjaGFyIHsgfSBTQ2hhckVudW1DbGFzczsKKyAgZXh0ZXJuIGVudW0gY2xhc3MgRW51bUNsYXNzMDUgOiB1bnNpZ25lZCBjaGFyIHsgfSBVQ2hhckVudW1DbGFzczsKKyAgZXh0ZXJuIGVudW0gY2xhc3MgRW51bUNsYXNzMDYgOiBzaG9ydCB7IH0gU1Nob3J0RW51bUNsYXNzOworICBleHRlcm4gZW51bSBjbGFzcyBFbnVtQ2xhc3MwNyA6IHVuc2lnbmVkIHNob3J0IHsgfSBVU2hvcnRFbnVtQ2xhc3M7CisgIGV4dGVybiBlbnVtIGNsYXNzIEVudW1DbGFzczA4IDogaW50IHsgfSBTSW50RW51bUNsYXNzOworICBleHRlcm4gZW51bSBjbGFzcyBFbnVtQ2xhc3MwOSA6IHVuc2lnbmVkIGludCB7IH0gVUludEVudW1DbGFzczsKKyAgZXh0ZXJuIGVudW0gY2xhc3MgRW51bUNsYXNzMTAgOiBsb25nIHsgfSBTTG9uZ0VudW1DbGFzczsKKyAgZXh0ZXJuIGVudW0gY2xhc3MgRW51bUNsYXNzMTEgOiB1bnNpZ25lZCBsb25nIHsgfSBVTG9uZ0VudW1DbGFzczsKKyAgZXh0ZXJuIGVudW0gY2xhc3MgRW51bUNsYXNzMTIgOiBsb25nIGxvbmcgeyB9IFNMb25nTG9uZ0VudW1DbGFzczsKKyAgZXh0ZXJuIGVudW0gY2xhc3MgRW51bUNsYXNzMTMgOiB1bnNpZ25lZCBsb25nIGxvbmcgeyB9IFVMb25nTG9uZ0VudW1DbGFzczsKKy8vIENIRUNLLURBRzogQCJcMDE/RW51bUNsYXNzQEVudW1NYW5nbGluZ0BAM1c0RW51bUNsYXNzMDFAMUBBIgorLy8gQ0hFQ0stREFHOiBAIlwwMT9Cb29sRW51bUNsYXNzQEVudW1NYW5nbGluZ0BAM1c0RW51bUNsYXNzMDJAMUBBCisvLyBDSEVDSy1EQUc6IEAiXDAxP0NoYXJFbnVtQ2xhc3NARW51bU1hbmdsaW5nQEAzVzRFbnVtQ2xhc3MwM0AxQEEKKy8vIENIRUNLLURBRzogQCJcMDE/U0NoYXJFbnVtQ2xhc3NARW51bU1hbmdsaW5nQEAzVzRFbnVtQ2xhc3MwNEAxQEEKKy8vIENIRUNLLURBRzogQCJcMDE/VUNoYXJFbnVtQ2xhc3NARW51bU1hbmdsaW5nQEAzVzRFbnVtQ2xhc3MwNUAxQEEKKy8vIENIRUNLLURBRzogQCJcMDE/U1Nob3J0RW51bUNsYXNzQEVudW1NYW5nbGluZ0BAM1c0RW51bUNsYXNzMDZAMUBBIgorLy8gQ0hFQ0stREFHOiBAIlwwMT9VU2hvcnRFbnVtQ2xhc3NARW51bU1hbmdsaW5nQEAzVzRFbnVtQ2xhc3MwN0AxQEEiCisvLyBDSEVDSy1EQUc6IEAiXDAxP1NJbnRFbnVtQ2xhc3NARW51bU1hbmdsaW5nQEAzVzRFbnVtQ2xhc3MwOEAxQEEiCisvLyBDSEVDSy1EQUc6IEAiXDAxP1VJbnRFbnVtQ2xhc3NARW51bU1hbmdsaW5nQEAzVzRFbnVtQ2xhc3MwOUAxQEEiCisvLyBDSEVDSy1EQUc6IEAiXDAxP1NMb25nRW51bUNsYXNzQEVudW1NYW5nbGluZ0BAM1c0RW51bUNsYXNzMTBAMUBBIgorLy8gQ0hFQ0stREFHOiBAIlwwMT9VTG9uZ0VudW1DbGFzc0BFbnVtTWFuZ2xpbmdAQDNXNEVudW1DbGFzczExQDFAQSIKKy8vIENIRUNLLURBRzogQCJcMDE/U0xvbmdMb25nRW51bUNsYXNzQEVudW1NYW5nbGluZ0BAM1c0RW51bUNsYXNzMTJAMUBBIgorLy8gQ0hFQ0stREFHOiBAIlwwMT9VTG9uZ0xvbmdFbnVtQ2xhc3NARW51bU1hbmdsaW5nQEAzVzRFbnVtQ2xhc3MxM0AxQEEiCisgIGRlY2x0eXBlKEVudW1DbGFzcykgKlVzZUVudW1DbGFzcygpIHsgcmV0dXJuICZFbnVtQ2xhc3M7IH0KKyAgZGVjbHR5cGUoQm9vbEVudW1DbGFzcykgKlVzZUJvb2xFbnVtQ2xhc3MoKSB7IHJldHVybiAmQm9vbEVudW1DbGFzczsgfQorICBkZWNsdHlwZShDaGFyRW51bUNsYXNzKSAqVXNlQ2hhckVudW1DbGFzcygpIHsgcmV0dXJuICZDaGFyRW51bUNsYXNzOyB9CisgIGRlY2x0eXBlKFNDaGFyRW51bUNsYXNzKSAqVXNlU0NoYXJFbnVtQ2xhc3MoKSB7IHJldHVybiAmU0NoYXJFbnVtQ2xhc3M7IH0KKyAgZGVjbHR5cGUoVUNoYXJFbnVtQ2xhc3MpICpVc2VVQ2hhckVudW1DbGFzcygpIHsgcmV0dXJuICZVQ2hhckVudW1DbGFzczsgfQorICBkZWNsdHlwZShTU2hvcnRFbnVtQ2xhc3MpICpVc2VTU2hvcnRFbnVtQ2xhc3MoKSB7IHJldHVybiAmU1Nob3J0RW51bUNsYXNzOyB9CisgIGRlY2x0eXBlKFVTaG9ydEVudW1DbGFzcykgKlVzZVVTaG9ydEVudW1DbGFzcygpIHsgcmV0dXJuICZVU2hvcnRFbnVtQ2xhc3M7IH0KKyAgZGVjbHR5cGUoU0ludEVudW1DbGFzcykgKlVzZVNJbnRFbnVtQ2xhc3MoKSB7IHJldHVybiAmU0ludEVudW1DbGFzczsgfQorICBkZWNsdHlwZShVSW50RW51bUNsYXNzKSAqVXNlVUludEVudW1DbGFzcygpIHsgcmV0dXJuICZVSW50RW51bUNsYXNzOyB9CisgIGRlY2x0eXBlKFNMb25nRW51bUNsYXNzKSAqVXNlU0xvbmdFbnVtQ2xhc3MoKSB7IHJldHVybiAmU0xvbmdFbnVtQ2xhc3M7IH0KKyAgZGVjbHR5cGUoVUxvbmdFbnVtQ2xhc3MpICpVc2VVTG9uZ0VudW1DbGFzcygpIHsgcmV0dXJuICZVTG9uZ0VudW1DbGFzczsgfQorICBkZWNsdHlwZShTTG9uZ0xvbmdFbnVtQ2xhc3MpICpVc2VTTG9uZ0xvbmdFbnVtQ2xhc3MoKSB7IHJldHVybiAmU0xvbmdMb25nRW51bUNsYXNzOyB9CisgIGRlY2x0eXBlKFVMb25nTG9uZ0VudW1DbGFzcykgKlVzZVVMb25nTG9uZ0VudW1DbGFzcygpIHsgcmV0dXJuICZVTG9uZ0xvbmdFbnVtQ2xhc3M7IH0KK30KKworbmFtZXNwYWNlIFBSMTgwMjIgeworCitzdHJ1Y3QgeyB9IGE7CitkZWNsdHlwZShhKSBmdW4oZGVjbHR5cGUoYSkgeCwgZGVjbHR5cGUoYSkpIHsgcmV0dXJuIHg7IH0KKy8vIENIRUNLLURBRzogP2Z1bkBQUjE4MDIyQEBZQT9BVTx1bm5hbWVkLXR5cGUtYT5AMUBVMjFAMEBaCisKK30KKworaW5saW5lIGludCBkZWZpbmVfbGFtYmRhKCkgeworICBzdGF0aWMgYXV0byBsYW1iZGEgPSBbXSB7IHN0YXRpYyBpbnQgbG9jYWw7ICsrbG9jYWw7IHJldHVybiBsb2NhbDsgfTsKKy8vIEZpcnN0LCB3ZSBoYXZlIHRoZSBzdGF0aWMgbG9jYWwgdmFyaWFibGUgb2YgdHlwZSAiPGxhbWJkYV8xPiIgaW5zaWRlIG9mCisvLyAiZGVmaW5lX2xhbWJkYSIuCisvLyBDSEVDSy1EQUc6ID9sYW1iZGFAPzE/P2RlZmluZV9sYW1iZGFAQFlBSFhaQDRWPGxhbWJkYV8xPkBAQQorLy8gTmV4dCwgd2UgaGF2ZSB0aGUgIm9wZXJhdG9yKCkiIGZvciAiPGxhbWJkYV8xPiIgd2hpY2ggaXMgaW5zaWRlIG9mCisvLyAiZGVmaW5lX2xhbWJkYSIuCisvLyBDSEVDSy1EQUc6ID8/UjxsYW1iZGFfMT5AP2RlZmluZV9sYW1iZGFAQFlBSFhaQFFCRUhYWgorLy8gRmluYWxseSwgd2UgaGF2ZSB0aGUgbG9jYWwgd2hpY2ggaXMgaW5zaWRlIG9mICI8bGFtYmRhXzE+IiB3aGljaCBpcyBpbnNpZGUgb2YKKy8vICJkZWZpbmVfbGFtYmRhIi4gSG9vcmF5LgorLy8gQ0hFQ0stREFHOiA/bG9jYWxAPzI/Pz9SPGxhbWJkYV8xPkA/ZGVmaW5lX2xhbWJkYUBAWUFIWFpAUUJFSFhaQDRIQQorICByZXR1cm4gbGFtYmRhKCk7Cit9CisKK2ludCBjYWxsX2xhbWJkYSgpIHsKKyAgcmV0dXJuIGRlZmluZV9sYW1iZGEoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtY3h4MTQuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy1jeHgxNC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5OTU2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtY3h4MTQuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzF5IC1mbXMtZXh0ZW5zaW9ucyAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCisKK3RlbXBsYXRlIDx0eXBlbmFtZT4gaW50IHggPSAwOworCisvLyBDSEVDSzogIlwwMT8/JHhAWEBAM0hBIgordGVtcGxhdGUgPD4gaW50IHg8dm9pZD47CisvLyBDSEVDSzogIlwwMT8/JHhASEBAM0hBIgordGVtcGxhdGUgPD4gaW50IHg8aW50PjsKKworLy8gQ0hFQ0s6ICJcMDE/RnVuY3Rpb25XaXRoTG9jYWxUeXBlQEBZQT9BPzxhdXRvPkBAWFoiCithdXRvIEZ1bmN0aW9uV2l0aExvY2FsVHlwZSgpIHsKKyAgc3RydWN0IExvY2FsVHlwZSB7fTsKKyAgcmV0dXJuIExvY2FsVHlwZXt9OworfQorCisvLyBDSEVDSzogIlwwMT9WYWx1ZUZyb21GdW5jdGlvbldpdGhMb2NhbFR5cGVAQDNVTG9jYWxUeXBlQD8wPz9GdW5jdGlvbldpdGhMb2NhbFR5cGVAQFlBP0E/PGF1dG8+QEBYWkBBIgorYXV0byBWYWx1ZUZyb21GdW5jdGlvbldpdGhMb2NhbFR5cGUgPSBGdW5jdGlvbldpdGhMb2NhbFR5cGUoKTsKKworLy8gQ0hFQ0s6ICJcMDE/P1I8bGFtYmRhXzA+QEBRQkU/QT88YXV0bz5AQFhaIgorYXV0byBMYW1iZGFXaXRoTG9jYWxUeXBlID0gW10geworICBzdHJ1Y3QgTG9jYWxUeXBlIHt9OworICByZXR1cm4gTG9jYWxUeXBle307Cit9OworCisvLyBDSEVDSzogIlwwMT9WYWx1ZUZyb21MYW1iZGFXaXRoTG9jYWxUeXBlQEAzVUxvY2FsVHlwZUA/MD8/P1I8bGFtYmRhXzA+QEBRQkU/QT88YXV0bz5AQFhaQEEiCithdXRvIFZhbHVlRnJvbUxhbWJkYVdpdGhMb2NhbFR5cGUgPSBMYW1iZGFXaXRoTG9jYWxUeXBlKCk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYXV0byBUZW1wbGF0ZUZ1bmNpb25XaXRoTG9jYWxMYW1iZGEoVCkgeworICBhdXRvIExvY2FsTGFtYmRhV2l0aExvY2FsVHlwZSA9IFtdKCkgeworICAgIHN0cnVjdCBMb2NhbFR5cGUge307CisgICAgcmV0dXJuIExvY2FsVHlwZXt9OworICB9OworICByZXR1cm4gTG9jYWxMYW1iZGFXaXRoTG9jYWxUeXBlKCk7Cit9CisKKy8vIENIRUNLOiAiXDAxP1ZhbHVlRnJvbVRlbXBsYXRlRnVuY2lvbldpdGhMb2NhbExhbWJkYUBAM1VMb2NhbFR5cGVAPzI/Pz9SPGxhbWJkYV8xPkA/PyRUZW1wbGF0ZUZ1bmNpb25XaXRoTG9jYWxMYW1iZGFASEBAWUE/QT88YXV0bz5AQEhAWkBRQkE/QT8zQFhaQEEiCisvLyBDSEVDSzogIlwwMT8/JFRlbXBsYXRlRnVuY2lvbldpdGhMb2NhbExhbWJkYUBIQEBZQT9BPzxhdXRvPkBASEBaIgorLy8gQ0hFQ0s6ICJcMDE/P1I8bGFtYmRhXzE+QD8/JFRlbXBsYXRlRnVuY2lvbldpdGhMb2NhbExhbWJkYUBIQEBZQT9BPzxhdXRvPkBASEBaQFFCQT9BPzFAWFoiCithdXRvIFZhbHVlRnJvbVRlbXBsYXRlRnVuY2lvbldpdGhMb2NhbExhbWJkYSA9IFRlbXBsYXRlRnVuY2lvbldpdGhMb2NhbExhbWJkYSgwKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtcmV0dXJuLXF1YWxpZmllcnMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy1yZXR1cm4tcXVhbGlmaWVycy5jcHAKaW5kZXggODdlMDRjNi4uMzdiYmYwOSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy1yZXR1cm4tcXVhbGlmaWVycy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy1yZXR1cm4tcXVhbGlmaWVycy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPWkzODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCiAKIHZvaWQgYTEoKSB7fQogLy8gQ0hFQ0s6ICJcMDE/YTFAQFlBWFhaIgpAQCAtMTY0LDYgKzE2NCwxMiBAQAogaW50IFM6OiogY29uc3QgZjkoKSB7IHJldHVybiAwOyB9CiAvLyBDSEVDSzogIlwwMT9mOUBAWUFRUVNAQEhYWiIKIAoraW50IFM6OiogX19yZXN0cmljdCBmMTAoKSB7IHJldHVybiAwOyB9CisvLyBDSEVDSzogIlwwMT9mMTBAQFlBUElRU0BASFhaIgorCitpbnQgUzo6KiBjb25zdCBfX3Jlc3RyaWN0IGYxMSgpIHsgcmV0dXJuIDA7IH0KKy8vIENIRUNLOiAiXDAxP2YxMUBAWUFRSVFTQEBIWFoiCisKIHR5cGVkZWYgaW50ICgqZnVuY3Rpb25fcG9pbnRlcikoaW50KTsKIAogZnVuY3Rpb25fcG9pbnRlciBnMSgpIHsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtc3RyaW5nLWxpdGVyYWxzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtc3RyaW5nLWxpdGVyYWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdhMDRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy1zdHJpbmctbGl0ZXJhbHMuY3BwCkBAIC0wLDAgKzEsNzIxIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXggYysrIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC14IGMrKyAtc3RkPWMrKzExIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiB8IEZpbGVDaGVjayAlcworCitjb25zdCBjaGFyICpsMjU1ID0gIlx4ZmYiOworY29uc3QgY2hhciAqbDI1NCA9ICJceGZlIjsKK2NvbnN0IGNoYXIgKmwyNTMgPSAiXHhmZCI7Citjb25zdCBjaGFyICpsMjUyID0gIlx4ZmMiOworY29uc3QgY2hhciAqbDI1MSA9ICJceGZiIjsKK2NvbnN0IGNoYXIgKmwyNTAgPSAiXHhmYSI7Citjb25zdCBjaGFyICpsMjQ5ID0gIlx4ZjkiOworY29uc3QgY2hhciAqbDI0OCA9ICJceGY4IjsKK2NvbnN0IGNoYXIgKmwyNDcgPSAiXHhmNyI7Citjb25zdCBjaGFyICpsMjQ2ID0gIlx4ZjYiOworY29uc3QgY2hhciAqbDI0NSA9ICJceGY1IjsKK2NvbnN0IGNoYXIgKmwyNDQgPSAiXHhmNCI7Citjb25zdCBjaGFyICpsMjQzID0gIlx4ZjMiOworY29uc3QgY2hhciAqbDI0MiA9ICJceGYyIjsKK2NvbnN0IGNoYXIgKmwyNDEgPSAiXHhmMSI7Citjb25zdCBjaGFyICpsMjQwID0gIlx4ZjAiOworY29uc3QgY2hhciAqbDIzOSA9ICJceGVmIjsKK2NvbnN0IGNoYXIgKmwyMzggPSAiXHhlZSI7Citjb25zdCBjaGFyICpsMjM3ID0gIlx4ZWQiOworY29uc3QgY2hhciAqbDIzNiA9ICJceGVjIjsKK2NvbnN0IGNoYXIgKmwyMzUgPSAiXHhlYiI7Citjb25zdCBjaGFyICpsMjM0ID0gIlx4ZWEiOworY29uc3QgY2hhciAqbDIzMyA9ICJceGU5IjsKK2NvbnN0IGNoYXIgKmwyMzIgPSAiXHhlOCI7Citjb25zdCBjaGFyICpsMjMxID0gIlx4ZTciOworY29uc3QgY2hhciAqbDIzMCA9ICJceGU2IjsKK2NvbnN0IGNoYXIgKmwyMjkgPSAiXHhlNSI7Citjb25zdCBjaGFyICpsMjI4ID0gIlx4ZTQiOworY29uc3QgY2hhciAqbDIyNyA9ICJceGUzIjsKK2NvbnN0IGNoYXIgKmwyMjYgPSAiXHhlMiI7Citjb25zdCBjaGFyICpsMjI1ID0gIlx4ZTEiOworY29uc3QgY2hhciAqbDIyNCA9ICJceGUwIjsKK2NvbnN0IGNoYXIgKmwyMjMgPSAiXHhkZiI7Citjb25zdCBjaGFyICpsMjIyID0gIlx4ZGUiOworY29uc3QgY2hhciAqbDIyMSA9ICJceGRkIjsKK2NvbnN0IGNoYXIgKmwyMjAgPSAiXHhkYyI7Citjb25zdCBjaGFyICpsMjE5ID0gIlx4ZGIiOworY29uc3QgY2hhciAqbDIxOCA9ICJceGRhIjsKK2NvbnN0IGNoYXIgKmwyMTcgPSAiXHhkOSI7Citjb25zdCBjaGFyICpsMjE2ID0gIlx4ZDgiOworY29uc3QgY2hhciAqbDIxNSA9ICJceGQ3IjsKK2NvbnN0IGNoYXIgKmwyMTQgPSAiXHhkNiI7Citjb25zdCBjaGFyICpsMjEzID0gIlx4ZDUiOworY29uc3QgY2hhciAqbDIxMiA9ICJceGQ0IjsKK2NvbnN0IGNoYXIgKmwyMTEgPSAiXHhkMyI7Citjb25zdCBjaGFyICpsMjEwID0gIlx4ZDIiOworY29uc3QgY2hhciAqbDIwOSA9ICJceGQxIjsKK2NvbnN0IGNoYXIgKmwyMDggPSAiXHhkMCI7Citjb25zdCBjaGFyICpsMjA3ID0gIlx4Y2YiOworY29uc3QgY2hhciAqbDIwNiA9ICJceGNlIjsKK2NvbnN0IGNoYXIgKmwyMDUgPSAiXHhjZCI7Citjb25zdCBjaGFyICpsMjA0ID0gIlx4Y2MiOworY29uc3QgY2hhciAqbDIwMyA9ICJceGNiIjsKK2NvbnN0IGNoYXIgKmwyMDIgPSAiXHhjYSI7Citjb25zdCBjaGFyICpsMjAxID0gIlx4YzkiOworY29uc3QgY2hhciAqbDIwMCA9ICJceGM4IjsKK2NvbnN0IGNoYXIgKmwxOTkgPSAiXHhjNyI7Citjb25zdCBjaGFyICpsMTk4ID0gIlx4YzYiOworY29uc3QgY2hhciAqbDE5NyA9ICJceGM1IjsKK2NvbnN0IGNoYXIgKmwxOTYgPSAiXHhjNCI7Citjb25zdCBjaGFyICpsMTk1ID0gIlx4YzMiOworY29uc3QgY2hhciAqbDE5NCA9ICJceGMyIjsKK2NvbnN0IGNoYXIgKmwxOTMgPSAiXHhjMSI7Citjb25zdCBjaGFyICpsMTkyID0gIlx4YzAiOworY29uc3QgY2hhciAqbDE5MSA9ICJceGJmIjsKK2NvbnN0IGNoYXIgKmwxOTAgPSAiXHhiZSI7Citjb25zdCBjaGFyICpsMTg5ID0gIlx4YmQiOworY29uc3QgY2hhciAqbDE4OCA9ICJceGJjIjsKK2NvbnN0IGNoYXIgKmwxODcgPSAiXHhiYiI7Citjb25zdCBjaGFyICpsMTg2ID0gIlx4YmEiOworY29uc3QgY2hhciAqbDE4NSA9ICJceGI5IjsKK2NvbnN0IGNoYXIgKmwxODQgPSAiXHhiOCI7Citjb25zdCBjaGFyICpsMTgzID0gIlx4YjciOworY29uc3QgY2hhciAqbDE4MiA9ICJceGI2IjsKK2NvbnN0IGNoYXIgKmwxODEgPSAiXHhiNSI7Citjb25zdCBjaGFyICpsMTgwID0gIlx4YjQiOworY29uc3QgY2hhciAqbDE3OSA9ICJceGIzIjsKK2NvbnN0IGNoYXIgKmwxNzggPSAiXHhiMiI7Citjb25zdCBjaGFyICpsMTc3ID0gIlx4YjEiOworY29uc3QgY2hhciAqbDE3NiA9ICJceGIwIjsKK2NvbnN0IGNoYXIgKmwxNzUgPSAiXHhhZiI7Citjb25zdCBjaGFyICpsMTc0ID0gIlx4YWUiOworY29uc3QgY2hhciAqbDE3MyA9ICJceGFkIjsKK2NvbnN0IGNoYXIgKmwxNzIgPSAiXHhhYyI7Citjb25zdCBjaGFyICpsMTcxID0gIlx4YWIiOworY29uc3QgY2hhciAqbDE3MCA9ICJceGFhIjsKK2NvbnN0IGNoYXIgKmwxNjkgPSAiXHhhOSI7Citjb25zdCBjaGFyICpsMTY4ID0gIlx4YTgiOworY29uc3QgY2hhciAqbDE2NyA9ICJceGE3IjsKK2NvbnN0IGNoYXIgKmwxNjYgPSAiXHhhNiI7Citjb25zdCBjaGFyICpsMTY1ID0gIlx4YTUiOworY29uc3QgY2hhciAqbDE2NCA9ICJceGE0IjsKK2NvbnN0IGNoYXIgKmwxNjMgPSAiXHhhMyI7Citjb25zdCBjaGFyICpsMTYyID0gIlx4YTIiOworY29uc3QgY2hhciAqbDE2MSA9ICJceGExIjsKK2NvbnN0IGNoYXIgKmwxNjAgPSAiXHhhMCI7Citjb25zdCBjaGFyICpsMTU5ID0gIlx4OWYiOworY29uc3QgY2hhciAqbDE1OCA9ICJceDllIjsKK2NvbnN0IGNoYXIgKmwxNTcgPSAiXHg5ZCI7Citjb25zdCBjaGFyICpsMTU2ID0gIlx4OWMiOworY29uc3QgY2hhciAqbDE1NSA9ICJceDliIjsKK2NvbnN0IGNoYXIgKmwxNTQgPSAiXHg5YSI7Citjb25zdCBjaGFyICpsMTUzID0gIlx4OTkiOworY29uc3QgY2hhciAqbDE1MiA9ICJceDk4IjsKK2NvbnN0IGNoYXIgKmwxNTEgPSAiXHg5NyI7Citjb25zdCBjaGFyICpsMTUwID0gIlx4OTYiOworY29uc3QgY2hhciAqbDE0OSA9ICJceDk1IjsKK2NvbnN0IGNoYXIgKmwxNDggPSAiXHg5NCI7Citjb25zdCBjaGFyICpsMTQ3ID0gIlx4OTMiOworY29uc3QgY2hhciAqbDE0NiA9ICJceDkyIjsKK2NvbnN0IGNoYXIgKmwxNDUgPSAiXHg5MSI7Citjb25zdCBjaGFyICpsMTQ0ID0gIlx4OTAiOworY29uc3QgY2hhciAqbDE0MyA9ICJceDhmIjsKK2NvbnN0IGNoYXIgKmwxNDIgPSAiXHg4ZSI7Citjb25zdCBjaGFyICpsMTQxID0gIlx4OGQiOworY29uc3QgY2hhciAqbDE0MCA9ICJceDhjIjsKK2NvbnN0IGNoYXIgKmwxMzkgPSAiXHg4YiI7Citjb25zdCBjaGFyICpsMTM4ID0gIlx4OGEiOworY29uc3QgY2hhciAqbDEzNyA9ICJceDg5IjsKK2NvbnN0IGNoYXIgKmwxMzYgPSAiXHg4OCI7Citjb25zdCBjaGFyICpsMTM1ID0gIlx4ODciOworY29uc3QgY2hhciAqbDEzNCA9ICJceDg2IjsKK2NvbnN0IGNoYXIgKmwxMzMgPSAiXHg4NSI7Citjb25zdCBjaGFyICpsMTMyID0gIlx4ODQiOworY29uc3QgY2hhciAqbDEzMSA9ICJceDgzIjsKK2NvbnN0IGNoYXIgKmwxMzAgPSAiXHg4MiI7Citjb25zdCBjaGFyICpsMTI5ID0gIlx4ODEiOworY29uc3QgY2hhciAqbDEyOCA9ICJceDgwIjsKK2NvbnN0IGNoYXIgKmwxMjcgPSAiXHg3ZiI7Citjb25zdCBjaGFyICpsMTI2ID0gIlx4N2UiOworY29uc3QgY2hhciAqbDEyNSA9ICJceDdkIjsKK2NvbnN0IGNoYXIgKmwxMjQgPSAiXHg3YyI7Citjb25zdCBjaGFyICpsMTIzID0gIlx4N2IiOworY29uc3QgY2hhciAqbDEyMiA9ICJceDdhIjsKK2NvbnN0IGNoYXIgKmwxMjEgPSAiXHg3OSI7Citjb25zdCBjaGFyICpsMTIwID0gIlx4NzgiOworY29uc3QgY2hhciAqbDExOSA9ICJceDc3IjsKK2NvbnN0IGNoYXIgKmwxMTggPSAiXHg3NiI7Citjb25zdCBjaGFyICpsMTE3ID0gIlx4NzUiOworY29uc3QgY2hhciAqbDExNiA9ICJceDc0IjsKK2NvbnN0IGNoYXIgKmwxMTUgPSAiXHg3MyI7Citjb25zdCBjaGFyICpsMTE0ID0gIlx4NzIiOworY29uc3QgY2hhciAqbDExMyA9ICJceDcxIjsKK2NvbnN0IGNoYXIgKmwxMTIgPSAiXHg3MCI7Citjb25zdCBjaGFyICpsMTExID0gIlx4NmYiOworY29uc3QgY2hhciAqbDExMCA9ICJceDZlIjsKK2NvbnN0IGNoYXIgKmwxMDkgPSAiXHg2ZCI7Citjb25zdCBjaGFyICpsMTA4ID0gIlx4NmMiOworY29uc3QgY2hhciAqbDEwNyA9ICJceDZiIjsKK2NvbnN0IGNoYXIgKmwxMDYgPSAiXHg2YSI7Citjb25zdCBjaGFyICpsMTA1ID0gIlx4NjkiOworY29uc3QgY2hhciAqbDEwNCA9ICJceDY4IjsKK2NvbnN0IGNoYXIgKmwxMDMgPSAiXHg2NyI7Citjb25zdCBjaGFyICpsMTAyID0gIlx4NjYiOworY29uc3QgY2hhciAqbDEwMSA9ICJceDY1IjsKK2NvbnN0IGNoYXIgKmwxMDAgPSAiXHg2NCI7Citjb25zdCBjaGFyICpsOTkgPSAiXHg2MyI7Citjb25zdCBjaGFyICpsOTggPSAiXHg2MiI7Citjb25zdCBjaGFyICpsOTcgPSAiXHg2MSI7Citjb25zdCBjaGFyICpsOTYgPSAiXHg2MCI7Citjb25zdCBjaGFyICpsOTUgPSAiXHg1ZiI7Citjb25zdCBjaGFyICpsOTQgPSAiXHg1ZSI7Citjb25zdCBjaGFyICpsOTMgPSAiXHg1ZCI7Citjb25zdCBjaGFyICpsOTIgPSAiXHg1YyI7Citjb25zdCBjaGFyICpsOTEgPSAiXHg1YiI7Citjb25zdCBjaGFyICpsOTAgPSAiXHg1YSI7Citjb25zdCBjaGFyICpsODkgPSAiXHg1OSI7Citjb25zdCBjaGFyICpsODggPSAiXHg1OCI7Citjb25zdCBjaGFyICpsODcgPSAiXHg1NyI7Citjb25zdCBjaGFyICpsODYgPSAiXHg1NiI7Citjb25zdCBjaGFyICpsODUgPSAiXHg1NSI7Citjb25zdCBjaGFyICpsODQgPSAiXHg1NCI7Citjb25zdCBjaGFyICpsODMgPSAiXHg1MyI7Citjb25zdCBjaGFyICpsODIgPSAiXHg1MiI7Citjb25zdCBjaGFyICpsODEgPSAiXHg1MSI7Citjb25zdCBjaGFyICpsODAgPSAiXHg1MCI7Citjb25zdCBjaGFyICpsNzkgPSAiXHg0ZiI7Citjb25zdCBjaGFyICpsNzggPSAiXHg0ZSI7Citjb25zdCBjaGFyICpsNzcgPSAiXHg0ZCI7Citjb25zdCBjaGFyICpsNzYgPSAiXHg0YyI7Citjb25zdCBjaGFyICpsNzUgPSAiXHg0YiI7Citjb25zdCBjaGFyICpsNzQgPSAiXHg0YSI7Citjb25zdCBjaGFyICpsNzMgPSAiXHg0OSI7Citjb25zdCBjaGFyICpsNzIgPSAiXHg0OCI7Citjb25zdCBjaGFyICpsNzEgPSAiXHg0NyI7Citjb25zdCBjaGFyICpsNzAgPSAiXHg0NiI7Citjb25zdCBjaGFyICpsNjkgPSAiXHg0NSI7Citjb25zdCBjaGFyICpsNjggPSAiXHg0NCI7Citjb25zdCBjaGFyICpsNjcgPSAiXHg0MyI7Citjb25zdCBjaGFyICpsNjYgPSAiXHg0MiI7Citjb25zdCBjaGFyICpsNjUgPSAiXHg0MSI7Citjb25zdCBjaGFyICpsNjQgPSAiXHg0MCI7Citjb25zdCBjaGFyICpsNjMgPSAiXHgzZiI7Citjb25zdCBjaGFyICpsNjIgPSAiXHgzZSI7Citjb25zdCBjaGFyICpsNjEgPSAiXHgzZCI7Citjb25zdCBjaGFyICpsNjAgPSAiXHgzYyI7Citjb25zdCBjaGFyICpsNTkgPSAiXHgzYiI7Citjb25zdCBjaGFyICpsNTggPSAiXHgzYSI7Citjb25zdCBjaGFyICpsNTcgPSAiXHgzOSI7Citjb25zdCBjaGFyICpsNTYgPSAiXHgzOCI7Citjb25zdCBjaGFyICpsNTUgPSAiXHgzNyI7Citjb25zdCBjaGFyICpsNTQgPSAiXHgzNiI7Citjb25zdCBjaGFyICpsNTMgPSAiXHgzNSI7Citjb25zdCBjaGFyICpsNTIgPSAiXHgzNCI7Citjb25zdCBjaGFyICpsNTEgPSAiXHgzMyI7Citjb25zdCBjaGFyICpsNTAgPSAiXHgzMiI7Citjb25zdCBjaGFyICpsNDkgPSAiXHgzMSI7Citjb25zdCBjaGFyICpsNDggPSAiXHgzMCI7Citjb25zdCBjaGFyICpsNDcgPSAiXHgyZiI7Citjb25zdCBjaGFyICpsNDYgPSAiXHgyZSI7Citjb25zdCBjaGFyICpsNDUgPSAiXHgyZCI7Citjb25zdCBjaGFyICpsNDQgPSAiXHgyYyI7Citjb25zdCBjaGFyICpsNDMgPSAiXHgyYiI7Citjb25zdCBjaGFyICpsNDIgPSAiXHgyYSI7Citjb25zdCBjaGFyICpsNDEgPSAiXHgyOSI7Citjb25zdCBjaGFyICpsNDAgPSAiXHgyOCI7Citjb25zdCBjaGFyICpsMzkgPSAiXHgyNyI7Citjb25zdCBjaGFyICpsMzggPSAiXHgyNiI7Citjb25zdCBjaGFyICpsMzcgPSAiXHgyNSI7Citjb25zdCBjaGFyICpsMzYgPSAiXHgyNCI7Citjb25zdCBjaGFyICpsMzUgPSAiXHgyMyI7Citjb25zdCBjaGFyICpsMzQgPSAiXHgyMiI7Citjb25zdCBjaGFyICpsMzMgPSAiXHgyMSI7Citjb25zdCBjaGFyICpsMzIgPSAiXHgyMCI7Citjb25zdCBjaGFyICpsMzEgPSAiXHgxZiI7Citjb25zdCBjaGFyICpsMzAgPSAiXHgxZSI7Citjb25zdCBjaGFyICpsMjkgPSAiXHgxZCI7Citjb25zdCBjaGFyICpsMjggPSAiXHgxYyI7Citjb25zdCBjaGFyICpsMjcgPSAiXHgxYiI7Citjb25zdCBjaGFyICpsMjYgPSAiXHgxYSI7Citjb25zdCBjaGFyICpsMjUgPSAiXHgxOSI7Citjb25zdCBjaGFyICpsMjQgPSAiXHgxOCI7Citjb25zdCBjaGFyICpsMjMgPSAiXHgxNyI7Citjb25zdCBjaGFyICpsMjIgPSAiXHgxNiI7Citjb25zdCBjaGFyICpsMjEgPSAiXHgxNSI7Citjb25zdCBjaGFyICpsMjAgPSAiXHgxNCI7Citjb25zdCBjaGFyICpsMTkgPSAiXHgxMyI7Citjb25zdCBjaGFyICpsMTggPSAiXHgxMiI7Citjb25zdCBjaGFyICpsMTcgPSAiXHgxMSI7Citjb25zdCBjaGFyICpsMTYgPSAiXHgxMCI7Citjb25zdCBjaGFyICpsMTUgPSAiXHhmIjsKK2NvbnN0IGNoYXIgKmwxNCA9ICJceGUiOworY29uc3QgY2hhciAqbDEzID0gIlx4ZCI7Citjb25zdCBjaGFyICpsMTIgPSAiXHhjIjsKK2NvbnN0IGNoYXIgKmwxMSA9ICJceGIiOworY29uc3QgY2hhciAqbDEwID0gIlx4YSI7Citjb25zdCBjaGFyICpsOSA9ICJceDkiOworY29uc3QgY2hhciAqbDggPSAiXHg4IjsKK2NvbnN0IGNoYXIgKmw3ID0gIlx4NyI7Citjb25zdCBjaGFyICpsNiA9ICJceDYiOworY29uc3QgY2hhciAqbDUgPSAiXHg1IjsKK2NvbnN0IGNoYXIgKmw0ID0gIlx4NCI7Citjb25zdCBjaGFyICpsMyA9ICJceDMiOworY29uc3QgY2hhciAqbDIgPSAiXHgyIjsKK2NvbnN0IGNoYXIgKmwxID0gIlx4MSI7Citjb25zdCBjaGFyICpsMCA9ICJceDAiOworCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUNOQUNCQUhDQD8kUFA/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxREVCSkNCRERAPyRQTz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFCUERFSENQQUA/JFBOPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUdDUEVETEJAPyRQTT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFFSkdPTkZIR0A/JFBMPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUZBSEZPRURIQD96PyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUhMRklMSFBFQD95PyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUdDRURJR0xGQD94PyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU9GTkxKS0hLQD93PyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMVBNTUFLTERMQD92PyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU5IT05QSVBJQD91PyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU1PUEdNSkxKQD90PyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUlCTEhGUEhPQD9zPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUpJS01HT0RQQD9yPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUxESUJETlBNQD9xPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUtLSktBTUxOQD9wPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUdITUFBQ0NEQD9vPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUhPTkxEREdDQD9uPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUZGUEdHQUtCQD9tPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUVNT05GQk9BQD9sPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMURLTU1IQ0hAP2s/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxQktMSFBHR0dAP2o/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxREJKS0tGS0ZAP2k/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxQ0lJQkpFT0VAP2g/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxS1BCSklJQ0xAP2c/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTEdBQ0xKR0tAP2Y/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSk5DUE9LS0pAP2U/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSUVERU5MT0lAP2Q/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTUxIRkVOQ1BAP2M/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTkNHT0hNR09AP2I/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxUEpFRENQS05AP2E/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxT0FGSUJPT01APyRPQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFMSUlHREVOQUA/JE5QPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUtCSk5BRkpCQD8kTk8/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSUtMQUZHRkNAPyROTj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFKREtMR0hCREA/JE5NPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU5NT0tQQk5FQD8kTkw/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTUZQQk1BSkZAP1o/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxT09OTUpERkdAP1k/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxUEhNSEtDQkhAP1g/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSEFGUExPTklAP1c/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxR0pFRUlQSkpAP1Y/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRUNHSk5NRktAP1U/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRkxIQ09OQkxAP1Q/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxQkVEREhMTk1AP1M/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTkNJRUtKTkA/Uj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFDR0FGQkpGT0A/UT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFEUEJPQ0lCUEA/UD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFQQ0VFQ0dJQkA/Tz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFPTEZQQkhNQUA/Tj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFNQUhDRUVBREA/TT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFOSkdKSEZFQ0A/TD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFKR0NJT0RJRkA/Sz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFJUERETkNNRUA/Sj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFLRUJPSUJBSEA/ST8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFMTkFGTEFFR0A/SD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFES0pOS01JSkA/Rz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFDRElHSk5NSUA/Rj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFJS0xNT0FMQD9FPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUJCTEFQUEVLQD9EPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUZPUEJHSklOQD9DPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUVIT0tGSU1NQD9CPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUdNTUhBTEFQQD9BPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUhGTk1ES0VPQD8kTUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTk5ITEZQSEhAPyRMUD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFNRUdBR09ER0A/JExPPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU9QRU5ETlBGQD8kTE4/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxUEdGR0FNTEVAPyRMTT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFMSkJISktIREA/JExMPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUtBQU1LTERDQD8kTEs/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSUxDQlBJUEJAPyRMSj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFKQ0RLTUpMQUA/JExJPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUJGS0NORkhQQD8kTEg/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTUxKT0VET0A/JExHPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUNISkVMSFBOQD8kTEY/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRE9JUElHTE1APyRMRT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFIQk1PQkFITEA/JExEPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUdJTkZDQkRLQD8kTEM/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRURQSUhDUEpAPyRMQj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFGS09ERURMSUA/JExBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUpITEpFTkNHQD8kS1A/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSU9LQ0hNR0hAPyRLTz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFLRklQQ1BLRUA/JEtOPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUxNSkVCT09GQD8kS00/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxUERORklJQ0NAPyRLTD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFPS01PTEpHREA/JEtLPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU1CT0RPS0tBQD8kS0o/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTklQSU5MT0JAPyRLST8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFGUEdBTUhDT0A/JEtIPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUVHSExQR0dQQD8kS0c/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxR05GR0tGS01APyRLRj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFIRUVOSkVPTkA/JEtFPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMURMQU1BQ0NLQD8kS0Q/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxQ0NCSERER0xAPyRLQz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFKREtHQUtJQD8kS0I/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxQkFDQkZCT0pAPyRLQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFFSVBQSExORkA/JEpQPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUZCT0VFS0pFQD8kSk8/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSEtNSkJKRkhAPyRKTj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFHRE5DQ0lCR0A/JEpNPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUNNSkRMT05CQD8kSkw/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxREZJSUlQSkFAPyRKSz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFCT0tGTk1GREA/JEpKPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUhMT09OQkNAPyRKST8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFJQUNHUEJOTkA/JEpIPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUpKRE5NQUpNQD8kSkc/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTENCQUpERlBAPyRKRj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFLTEFMS0NCT0A/JEpFPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU9FRUtERU5KQD8kSkQ/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxUE5GQkFGSklAPyRKQz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFOR0hNRkdGTEA/JEpCPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU1QR0hHSEJLQD8kSkE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxQ0ROR0pJRUA/JElQPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUJMQ0dGSU1GQD8kSU8/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxREFBTEFMQUdAPyRJTj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFDSkJBREtFSEA/JElNPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUdHRkJLTUlBQD8kSUw/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSFBFS0pOTUJAPyRJSz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFGRUdITU9BQ0A/JElKPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUVOSE1QUEVEQD8kSUk/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTUtPRU9ESU1APyRJSD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFORFBQTkNNTkA/JElHPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMVBJTkNJQkFPQD8kSUY/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxT0JNSkxBRVBAPyRJRT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFLT0lJQ0dJSUA/JElEPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUxISkRCSE1KQD8kSUM/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSk1MT0VFQUtAPyRJQj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFJRktGSEZFTEA/JElBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUJHSUJJSURKQD8kSFA/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxUEpLTEpISUA/JEhPPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUNFTEhPS0xMQD8kSE4/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRE5LTU5MUEtAPyRITT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFIQ09ORU5ETkA/JEhMPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUdMUEdITUhNQHo/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRUFOTENQTFBAeT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFGSk1BQk9QT0B4PyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU5PRklBQ0RCQHc/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTUhFRERESEFAdj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFPTUdPR0FMREB1PyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMVBGSEZGQlBDQHQ/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTEtERU1IREZAcz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFLRENQUEdIRUByPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUlJQUNLRkxIQHE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSkJCSkpFUEdAcD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFGTUVESktHSUBvPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUVGRklLTENKQG4/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxR09IRlBJT0tAbT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFISEdPTUpLTEBsPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMURJQ1BGUEdNQGs/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxQ0JERUdPQ05Aaj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFLQkpETk9PQGk/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxQkRBQ0FNS1BAaD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFKRUpLQkFHQUBnPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUlOSUJDQkNCQGY/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxS0dLTUhDT0NAZT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFMUExIRURLREBkPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMVBBUEdORkdFQGM/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxT0pPTk9FQ0ZAYj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFNQ01BTEhPR0BhPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU5MTkxJR0tIQD8kR0E/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSURBRktNSkxAXz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFKS0JPSk5OS0A/JEZPPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUxCRERNT0JKQD8kRk4/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxS0lDSVBQRklAPzI/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxT0hHSkdKSlBAPyRGTD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFQT0hDRklOT0BaPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU5GRlBBTEJOQFk/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTU1FRURLRk1AWD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFFTE5NQ0dKREBXPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUZDTUhCSE5DQFY/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSEpPS0VFQkJAVT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFHQVBCSEZGQUBUPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUNQTEFPREpIQFM/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxREdLTE5DTkdAUj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFCTklHSUJCRkBRPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUVKTkxBRkVAUD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFNSk1ITE9NS0BPPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU5BTk1JUElMQE4/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxUExQQk5NRUlATT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFPQ09LT05BSkBMPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUtOS0xITE1PQEs/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTEVMQUVLSVBASj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFKUEpOQkpFTUBJPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUlHSUdDSUFOQEg/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxQkJPREVNQ0BHPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUJJQUZBRklEQEY/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRERDSUZHRUFART8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFDS0RER0hBQkBEPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUdGSENQQk1HQEM/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSE1HSk1BSUhAQj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFGSEVFSkRFRUBBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUVPRlBLQ0FGQD8kRUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxT0dQSU1IRE1APyREUD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFQUE9EUEdITkA/JERPPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU5FTU9LRkxPQD8kRE4/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTU5ORkpFUFBAPyRETT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFJQ0pFQUNESUA/JERMPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUpMSVBEREhKQD8zPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUxBS0NHQUxLQDk/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxS0pMSkZCUExAOD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFDT0NCRU5ERUA3PyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMURIREtITUhGQDY/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxQk1CSENQTEdANT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFGQU1CT1BIQDQ/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRUtFTklJREFAMz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFGREZHTEpIQkAyPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUhJSExPS0xDQDE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxR0JHQU5MUERAMD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFLTURLTkZHTkA/MT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFMRkNCT0VDTUA/ND8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFKT0FNTEhPUEA/OT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFJSEJISUdLT0A/MD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFNSUZHQkFHSkA/JENMPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU5CRU5DQkNJQD8kQ0s/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxUEtHQUhDT0xAPyRDSj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFPREhMRURLS0A/JENJPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUdFT0RGUEdGQD84PyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUhOUElHT0NFQD8kQ0c/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRkdORkROT0hAPyRDRj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFFUE1PQU1LR0AkPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUlQSktHQkA/JENEPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUJKSkVLTENBQD8kQ0M/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRENMSlBJT0RAPyRDQj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFDTEtDTUpLQ0A/NT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFIREhNT0RKT0A/JEJQPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUdLR0hOQ05QQD8kQk8/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRUJFS0lCQk1APyRCTj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFGSUZCTEFGTkA/JEJNPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUJIQkFDR0pLQD8kQkw/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxT0FMQkhOTEA/JEJLPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUNGQ0dFRUJJQD8kQko/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRE1ETkhGRkpAPyRCST8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFMTEtGR0pKR0A/JEJIPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUtDTE9GSU5IQD8kQkc/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSUpKREFMQkVAPyRCRj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFKQUlJREtGRkA/JEJFPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU5QTUpLTUpDQD8kQkQ/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTUdOQ0pOTkRAPyRCQz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFPTlBQTU9CQUA/JEJCPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMVBFT0VQUEZCQD8kQkE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxREpMT1BCTVBAPyRBUD8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFDQUtGTUFJT0A/JEFPPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUxJSUpERU5APyRBTj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFCQ0pES0NBTUA/JEFNPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUZOTkNERU1MQD8kQUw/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxRUVNSkFGSUtAPzY/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxR1BPRUZHRUpAPzc/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSEdQUEdIQUlAPyRBST8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFQQkdISExNSEA/JEFIPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMU9JSE1FS0lHQD8kQUc/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxTURGQkJKRUZAPyRBRj8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFOS0VLQ0lBRUA/JEFFPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUpGQUxMT01EQD8kQUQ/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzAxSU1CQUlQSUNAPyRBQz8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMDFLSEROTk1FQkA/JEFCPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8wMUxPQ0dPTkFBQD8kQUE/JEFBQCIKKworY29uc3Qgd2NoYXJfdCAqd2w5ID0gTCJcdCI7Citjb25zdCB3Y2hhcl90ICp3bDEwID0gTCJcbiI7Citjb25zdCB3Y2hhcl90ICp3bDExID0gTCJcdiI7Citjb25zdCB3Y2hhcl90ICp3bDMyID0gTCIgIjsKK2NvbnN0IHdjaGFyX3QgKndsMzMgPSBMIiEiOworY29uc3Qgd2NoYXJfdCAqd2wzNCA9IEwiXCIiOworY29uc3Qgd2NoYXJfdCAqd2wzNSA9IEwiIyI7Citjb25zdCB3Y2hhcl90ICp3bDM2ID0gTCIkIjsKK2NvbnN0IHdjaGFyX3QgKndsMzcgPSBMIiUiOworY29uc3Qgd2NoYXJfdCAqd2wzOCA9IEwiJiI7Citjb25zdCB3Y2hhcl90ICp3bDM5ID0gTCInIjsKK2NvbnN0IHdjaGFyX3QgKndsNDAgPSBMIigiOworY29uc3Qgd2NoYXJfdCAqd2w0MSA9IEwiKSI7Citjb25zdCB3Y2hhcl90ICp3bDQyID0gTCIqIjsKK2NvbnN0IHdjaGFyX3QgKndsNDMgPSBMIisiOworY29uc3Qgd2NoYXJfdCAqd2w0NCA9IEwiLCI7Citjb25zdCB3Y2hhcl90ICp3bDQ1ID0gTCItIjsKK2NvbnN0IHdjaGFyX3QgKndsNDYgPSBMIi4iOworY29uc3Qgd2NoYXJfdCAqd2w0NyA9IEwiLyI7Citjb25zdCB3Y2hhcl90ICp3bDQ4ID0gTCIwIjsKK2NvbnN0IHdjaGFyX3QgKndsNDkgPSBMIjEiOworY29uc3Qgd2NoYXJfdCAqd2w1MCA9IEwiMiI7Citjb25zdCB3Y2hhcl90ICp3bDUxID0gTCIzIjsKK2NvbnN0IHdjaGFyX3QgKndsNTIgPSBMIjQiOworY29uc3Qgd2NoYXJfdCAqd2w1MyA9IEwiNSI7Citjb25zdCB3Y2hhcl90ICp3bDU0ID0gTCI2IjsKK2NvbnN0IHdjaGFyX3QgKndsNTUgPSBMIjciOworY29uc3Qgd2NoYXJfdCAqd2w1NiA9IEwiOCI7Citjb25zdCB3Y2hhcl90ICp3bDU3ID0gTCI5IjsKK2NvbnN0IHdjaGFyX3QgKndsNTggPSBMIjoiOworY29uc3Qgd2NoYXJfdCAqd2w1OSA9IEwiOyI7Citjb25zdCB3Y2hhcl90ICp3bDYwID0gTCI8IjsKK2NvbnN0IHdjaGFyX3QgKndsNjEgPSBMIj0iOworY29uc3Qgd2NoYXJfdCAqd2w2MiA9IEwiPiI7Citjb25zdCB3Y2hhcl90ICp3bDYzID0gTCI/IjsKK2NvbnN0IHdjaGFyX3QgKndsNjQgPSBMIkAiOworY29uc3Qgd2NoYXJfdCAqd2w2NSA9IEwiQSI7Citjb25zdCB3Y2hhcl90ICp3bDY2ID0gTCJCIjsKK2NvbnN0IHdjaGFyX3QgKndsNjcgPSBMIkMiOworY29uc3Qgd2NoYXJfdCAqd2w2OCA9IEwiRCI7Citjb25zdCB3Y2hhcl90ICp3bDY5ID0gTCJFIjsKK2NvbnN0IHdjaGFyX3QgKndsNzAgPSBMIkYiOworY29uc3Qgd2NoYXJfdCAqd2w3MSA9IEwiRyI7Citjb25zdCB3Y2hhcl90ICp3bDcyID0gTCJIIjsKK2NvbnN0IHdjaGFyX3QgKndsNzMgPSBMIkkiOworY29uc3Qgd2NoYXJfdCAqd2w3NCA9IEwiSiI7Citjb25zdCB3Y2hhcl90ICp3bDc1ID0gTCJLIjsKK2NvbnN0IHdjaGFyX3QgKndsNzYgPSBMIkwiOworY29uc3Qgd2NoYXJfdCAqd2w3NyA9IEwiTSI7Citjb25zdCB3Y2hhcl90ICp3bDc4ID0gTCJOIjsKK2NvbnN0IHdjaGFyX3QgKndsNzkgPSBMIk8iOworY29uc3Qgd2NoYXJfdCAqd2w4MCA9IEwiUCI7Citjb25zdCB3Y2hhcl90ICp3bDgxID0gTCJRIjsKK2NvbnN0IHdjaGFyX3QgKndsODIgPSBMIlIiOworY29uc3Qgd2NoYXJfdCAqd2w4MyA9IEwiUyI7Citjb25zdCB3Y2hhcl90ICp3bDg0ID0gTCJUIjsKK2NvbnN0IHdjaGFyX3QgKndsODUgPSBMIlUiOworY29uc3Qgd2NoYXJfdCAqd2w4NiA9IEwiViI7Citjb25zdCB3Y2hhcl90ICp3bDg3ID0gTCJXIjsKK2NvbnN0IHdjaGFyX3QgKndsODggPSBMIlgiOworY29uc3Qgd2NoYXJfdCAqd2w4OSA9IEwiWSI7Citjb25zdCB3Y2hhcl90ICp3bDkwID0gTCJaIjsKK2NvbnN0IHdjaGFyX3QgKndsOTEgPSBMIlsiOworY29uc3Qgd2NoYXJfdCAqd2w5MiA9IEwiXFwiOworY29uc3Qgd2NoYXJfdCAqd2w5MyA9IEwiXSI7Citjb25zdCB3Y2hhcl90ICp3bDk0ID0gTCJeIjsKK2NvbnN0IHdjaGFyX3QgKndsOTUgPSBMIl8iOworY29uc3Qgd2NoYXJfdCAqd2w5NiA9IEwiYCI7Citjb25zdCB3Y2hhcl90ICp3bDk3ID0gTCJhIjsKK2NvbnN0IHdjaGFyX3QgKndsOTggPSBMImIiOworY29uc3Qgd2NoYXJfdCAqd2w5OSA9IEwiYyI7Citjb25zdCB3Y2hhcl90ICp3bDEwMCA9IEwiZCI7Citjb25zdCB3Y2hhcl90ICp3bDEwMSA9IEwiZSI7Citjb25zdCB3Y2hhcl90ICp3bDEwMiA9IEwiZiI7Citjb25zdCB3Y2hhcl90ICp3bDEwMyA9IEwiZyI7Citjb25zdCB3Y2hhcl90ICp3bDEwNCA9IEwiaCI7Citjb25zdCB3Y2hhcl90ICp3bDEwNSA9IEwiaSI7Citjb25zdCB3Y2hhcl90ICp3bDEwNiA9IEwiaiI7Citjb25zdCB3Y2hhcl90ICp3bDEwNyA9IEwiayI7Citjb25zdCB3Y2hhcl90ICp3bDEwOCA9IEwibCI7Citjb25zdCB3Y2hhcl90ICp3bDEwOSA9IEwibSI7Citjb25zdCB3Y2hhcl90ICp3bDExMCA9IEwibiI7Citjb25zdCB3Y2hhcl90ICp3bDExMSA9IEwibyI7Citjb25zdCB3Y2hhcl90ICp3bDExMiA9IEwicCI7Citjb25zdCB3Y2hhcl90ICp3bDExMyA9IEwicSI7Citjb25zdCB3Y2hhcl90ICp3bDExNCA9IEwiciI7Citjb25zdCB3Y2hhcl90ICp3bDExNSA9IEwicyI7Citjb25zdCB3Y2hhcl90ICp3bDExNiA9IEwidCI7Citjb25zdCB3Y2hhcl90ICp3bDExNyA9IEwidSI7Citjb25zdCB3Y2hhcl90ICp3bDExOCA9IEwidiI7Citjb25zdCB3Y2hhcl90ICp3bDExOSA9IEwidyI7Citjb25zdCB3Y2hhcl90ICp3bDEyMCA9IEwieCI7Citjb25zdCB3Y2hhcl90ICp3bDEyMSA9IEwieSI7Citjb25zdCB3Y2hhcl90ICp3bDEyMiA9IEwieiI7Citjb25zdCB3Y2hhcl90ICp3bDEyMyA9IEwieyI7Citjb25zdCB3Y2hhcl90ICp3bDEyNCA9IEwifCI7Citjb25zdCB3Y2hhcl90ICp3bDEyNSA9IEwifSI7Citjb25zdCB3Y2hhcl90ICp3bDEyNiA9IEwifiI7CisKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzS0RMREdQR0pAPyRBQT83PyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNMQkFHTUFJSEA/JEFBPzY/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0pMS0tIT0NAPyRBQT8kQUw/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0hPSUpJUE5OQD8kQUE/NT8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzTUdERk9JTElAPyRBQT8kQ0I/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM05FSUFFSEZHQD8kQUE/JENDPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNHTURNQ0FEREA/JEFBPyRDRD8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzUEJPTEJJSUtAPyRBQSQ/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0VKRkhIUE9QQD8kQUE/JENGPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNGTE9DTkFBQkA/JEFBPyRDRz8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzT0RGT0xIR0VAPyRBQT84PyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNMTEROS0hEQ0A/JEFBPyRDST8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzRElCTUFGSEA/JEFBPyRDSj8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzQkJERUdQTEpAPyRBQT8kQ0s/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0tKSUlBSU5NQD8kQUE/JENMPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNERUZQREFHRkA/JEFBPzA/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0lNT0RGSEFBQD8kQUE/OT8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzSk9GR1BJT09APyRBQT80PyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNDR09LSlBJTEA/JEFBPzE/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0NPSkFOSUVDQD8kQUEwPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNKR0NNTFBDSEA/JEFBMT8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzSUVKSkJBTUpAPyRBQTI/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0RNQ0ZISEtNQD8kQUEzPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNLQlBDRVBCRkA/JEFBND8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzQkpFT0NJSEFAPyRBQTU/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0xQTElISk9APyRBQTY/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0xERUhPQVBMQD8kQUE3PyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNPTENFUEFLTkA/JEFBOD8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzRkRKSUpITUlAPyRBQTk/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0VCQ05ESUNHQD8kQUE/Mz8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzUEpKQkZQRURAPyRBQT8kREw/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0dFRUdHSFBLQD8kQUE/JERNPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNOTVBLQUFKUEA/JEFBPyRETj8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzTU9FUEtQSEJAPyRBQT8kRE8/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0hHUERNSUJFQD8kQUE/JERQPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNFRktQSElOT0A/JEFBPyRFQT8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzUE5CREJQTExAPyRBQUE/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM09QS0dMQUZGQD8kQUFCPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNGSEJLTkhEQUA/JEFBQz8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzTUtNTk9QSUpAPyRBQUQ/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0hDSEJJSU9NQD8kQUFFPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNHQU1FQ0hBQ0A/JEFBRj8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzTklISUVBR0hAPyRBQUc/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0lBQkxGQURCQD8kQUFIPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNESUtIREhGRUA/JEFBST8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzQ0tCQ0pJTEtAPyRBQUo/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0pDS09QUE5QQD8kQUFLPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNQSEpNSEdHQD8kQUFMPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNMSE1GS0FBREA/JEFBTT8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzS0ZIQUFQT05APyRBQU4/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0JOTU1HSUlJQD8kQUFPPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNCRkxHQ1BFQkA/JEFBUD8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzS05BS0VJQ0VAPyRBQVE/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0xQTFBPSE1LQD8kQUFSPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNIQURJQUtQQD8kQUFTPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNKS05FTElCR0A/JEFBVD8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzQ0NHSU5QSERAPyRBQVU/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0RBTk5IQUpOQD8kQUFWPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNJSUdCQkhQSUA/JEFBVz8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzTkFBQ0FIS09APyRBQVg/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0dJTE9HQU1MQD8kQUFZPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNIS0FMTVBDRkA/JEFBWj8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzTUNMSEtJRUFAPyRBQT8kRkw/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0ZQR0FKQVBKQD8kQUE/Mj8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzT0hOTVBISk1APyRBQT8kRk4/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM1BGR0pGSUhDQD8kQUE/JEZPPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNFTk5GRFBCSEA/JEFBXz8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzT0ZKTk5IT0FAPyRBQT8kR0E/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0ZOQ0JMQUlGQD8kQUFhPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNFUEpFQlBHTEA/JEFBYj8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzUEhDSUhJQU9APyRBQWM/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0dLUFBFQUxIQD8kQUFkPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNOQ0VEQ0hOQ0A/JEFBZT8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzTUFQR0lJRE1APyRBQWY/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0hJRUtPUEZKQD8kQUFnPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNDQUNKUFBBUEA/JEFBaD8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzSklKRkpJR0tAPyRBQWk/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0lLQ0FESElFQD8kQUFqPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNEQ0pNRkFPQkA/JEFBaz8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzS1BFTEdJRklAPyRBQWw/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0JIUEhBUEROQD8kQUFtPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNGRUNLQU5EQD8kQUFuPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNMTlBPTUhMR0A/JEFBbz8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzTEZJRUlBSFBAPyRBQXA/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM05ESU9IQktAPyRBQXE/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0JQSU5FSVBFQD8kQUFyPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNLSERCQ1BKQkA/JEFBcz8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzREtPR0JIQ0lAPyRBQXQ/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0lDRktIQUVOQD8kQUF1PyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNKQU9QTlBLREA/JEFBdj8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzQ0lGRExJTUdAPyRBQXc/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0hBREFLSUpBQD8kQUF4PyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNNSUlNTVBQRkA/JEFBeT8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzTktESkdBQkxAPyRBQXo/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0dDSUZBSEhPQD8kQUE/JEhMPyRBQT8kQUFAIgorLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNQUEZDRFBNSEA/JEFBPyRITT8kQUE/JEFBQCIKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzEzRUhPT0ZJS0NAPyRBQT8kSE4/JEFBPyRBQUAiCisvLyBDSEVDSzogQCJcMDE/P19DQF8xM0ZGRkxQSEVNQD8kQUE/JEhPPyRBQT8kQUFAIgorCitjb25zdCBjaGFyICpMb25nQVNDSUlTdHJpbmcgPSAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5QUJDREVGIjsKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzBDRkBMQUJCSUlNT0AwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlBQkAiCitjb25zdCB3Y2hhcl90ICpMb25nV2lkZVN0cmluZyA9IEwiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5QUJDREVGIjsKKy8vIENIRUNLOiBAIlwwMT8/X0NAXzFFS0BLRlBFQkxQS0A/JEFBMD8kQUExPyRBQTI/JEFBMz8kQUE0PyRBQTU/JEFBNj8kQUE3PyRBQTg/JEFBOT8kQUEwPyRBQTE/JEFBMj8kQUEzPyRBQTQ/JEFBNT8kQUE2PyRBQTc/JEFBOD8kQUE5PyRBQTA/JEFBMT8kQUEyPyRBQTM/JEFBND8kQUE1PyRBQTY/JEFBNz8kQUE4PyRBQTk/JEFBQT8kQUFCQCIKK2NvbnN0IHdjaGFyX3QgKlVuaWNvZGVMaXRlcmFsID0gTCJcdWQ3ZmYiOworLy8gQ0hFQ0s6IEAiXDAxPz9fQ0BfMTNJSUhJQUZLSEA/Vz8kUFA/JEFBPyRBQUAiCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLXRlbXBsYXRlLWNhbGxiYWNrLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtdGVtcGxhdGUtY2FsbGJhY2suY3BwCmluZGV4IDY4NzgxNDguLjFhOGY4MmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtdGVtcGxhdGUtY2FsbGJhY2suY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtdGVtcGxhdGUtY2FsbGJhY2suY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mYmxvY2tzIC1lbWl0LWxsdm0gJXMgLW8gLSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZibG9ja3MgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiB8IEZpbGVDaGVjayAlcwogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBTaWduYXR1cmU+CiBjbGFzcyBDOwpAQCAtNzAsMyArNzAsMjAgQEAKIC8vIENIRUNLOiAiXDAxPz8kYmFyQFBfRUFISEBaQEBZQVhQX0VBSEhAWkBaIgogLy8gRllJIGJsb2NrcyBhcmUgbm90IHByZXNlbnQgaW4gTVNWUywgc28gd2UncmUgZnJlZSB0byBjaG9vc2UgdGhlIHNwZWMuCiB9CisKK3RlbXBsYXRlIDx2b2lkICgqRm4pKCk+IHZvaWQgV3JhcEZuUHRyKCkgeyBGbigpOyB9Cit0ZW1wbGF0ZSA8dm9pZCAoJkZuKSgpPiB2b2lkIFdyYXBGblJlZigpIHsgRm4oKTsgfQorc3RydWN0IFRoaW5nIHsKKyAgc3RhdGljIHZvaWQgVm9pZFN0YXRpY01ldGhvZCgpOworfTsKK3ZvaWQgVm9pZEZuKCk7Cit2b2lkIENhbGxXcmFwcGVyKCkgeworICBXcmFwRm5QdHI8Vm9pZEZuPigpOworICBXcmFwRm5SZWY8Vm9pZEZuPigpOworICBXcmFwRm5QdHI8VGhpbmc6OlZvaWRTdGF0aWNNZXRob2Q+KCk7CisgIFdyYXBGblJlZjxUaGluZzo6Vm9pZFN0YXRpY01ldGhvZD4oKTsKK30KKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JFdyYXBGblB0ckAkMT9Wb2lkRm5AQFlBWFhaQEBZQVhYWiIKKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JFdyYXBGblJlZkAkMT9Wb2lkRm5AQFlBWFhaQEBZQVhYWiIKKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JFdyYXBGblB0ckAkMT9Wb2lkU3RhdGljTWV0aG9kQFRoaW5nQEBTQVhYWkBAWUFYWFoiCisvLyBDSEVDSzogY2FsbCB7ey4qfX0gQCJcMDE/PyRXcmFwRm5SZWZAJDE/Vm9pZFN0YXRpY01ldGhvZEBUaGluZ0BAU0FYWFpAQFlBWFhaIgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy10ZW1wbGF0ZXMtbWVtcHRycy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLXRlbXBsYXRlcy1tZW1wdHJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDNjYWMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy10ZW1wbGF0ZXMtbWVtcHRycy5jcHAKQEAgLTAsMCArMSwxNDMgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtV25vLW1pY3Jvc29mdCAtZm5vLXJ0dGkgLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCisKK3N0cnVjdCBVOworc3RhdGljX2Fzc2VydChzaXplb2Yodm9pZCAoVTo6KikoKSkgPT0gMiAqIHNpemVvZih2b2lkKikgKyAyICogc2l6ZW9mKGludCksICIiKTsKKworc3RydWN0IEEgeyBpbnQgYTsgfTsKK3N0cnVjdCBCIHsgaW50IGI7IH07CitzdHJ1Y3QgSSB7IHVuaW9uIHsgc3RydWN0IHsgaW50IGEsIGI7IH07IH07IH07CisKK3N0cnVjdCBTICAgICAgICAgICAgIHsgaW50IGEsIGI7IHZvaWQgZigpOyB2aXJ0dWFsIHZvaWQgZygpOyB9Oworc3RydWN0IE0gOiBBLCBCICAgICAgeyBpbnQgYSwgYjsgdm9pZCBmKCk7IHZpcnR1YWwgdm9pZCBnKCk7IH07CitzdHJ1Y3QgViA6IHZpcnR1YWwgQSB7IGludCBhLCBiOyB2b2lkIGYoKTsgdmlydHVhbCB2b2lkIGcoKTsgfTsKK3N0cnVjdCBVICAgICAgICAgICAgIHsgaW50IGEsIGI7IHZvaWQgZigpOyB2aXJ0dWFsIHZvaWQgZygpOyB9OworCitzdHJ1Y3QgQyAgICAgICAgeyB2aXJ0dWFsIHZvaWQgZigpOyB9Oworc3RydWN0IEQgICAgICAgIHsgdmlydHVhbCB2b2lkIGcoKTsgfTsKK3N0cnVjdCBPIDogQywgRCB7IHZpcnR1YWwgdm9pZCBnKCk7IH07IC8vIG92ZXJyaWRlIG9mIG5vbi1wcmltYXJ5CisKKy8vIFRlc3QgZGF0YSBtZW1iZXIgcG9pbnRlcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IFQ6OipGPgoraW50IFJlYWRGaWVsZChUICZvKSB7CisgIHJldHVybiBGID8gby4qRiA6IDA7Cit9CisKKy8vIFJlZGVjbGFyZSBzb21lIG9mIHRoZSBjbGFzc2VzIHNvIHRoYXQgdGhlIGltcGxpY2l0IGF0dHJpYnV0ZSBnb2VzIG9uIHRoZSBtb3N0CisvLyByZWNlbnQgcmVkZWNsYXJhdGlvbiByYXRoZXIgdGhhbiB0aGUgZGVmaW5pdGlvbi4KK3N0cnVjdCBWOworCit2b2lkIFJlYWRGaWVsZHMoKSB7CisgIEEgYTsKKyAgSSBpOworICBTIHM7CisgIE0gbTsKKyAgViB2OworICBVIHU7CisgIFJlYWRGaWVsZDxTLCAmUzo6YT4ocyk7CisgIFJlYWRGaWVsZDxNLCAmTTo6YT4obSk7CisgIFJlYWRGaWVsZDxWLCAmVjo6YT4odik7CisgIFJlYWRGaWVsZDxVLCAmVTo6YT4odSk7CisgIFJlYWRGaWVsZDxTLCAmUzo6Yj4ocyk7CisgIFJlYWRGaWVsZDxNLCAmTTo6Yj4obSk7CisgIFJlYWRGaWVsZDxWLCAmVjo6Yj4odik7CisgIFJlYWRGaWVsZDxVLCAmVTo6Yj4odSk7CisgIFJlYWRGaWVsZDxTLCBudWxscHRyPihzKTsKKyAgUmVhZEZpZWxkPE0sIG51bGxwdHI+KG0pOworICBSZWFkRmllbGQ8ViwgbnVsbHB0cj4odik7CisgIFJlYWRGaWVsZDxVLCBudWxscHRyPih1KTsKKworICAvLyBOb24tcG9seW1vcnBoaWMgbnVsbCBkYXRhIG1lbXB0ciB2cyBmaXJzdCBmaWVsZCBtZW1wdHIuCisgIFJlYWRGaWVsZDxBLCAmQTo6YT4oYSk7CisgIFJlYWRGaWVsZDxBLCBudWxscHRyPihhKTsKKworICAvLyBJbmRpcmVjdCBmaWVsZHMgaW5qZWN0ZWQgZnJvbSBhbm9ueW1vdXMgdW5pb25zIGFuZCBzdHJ1Y3RzCisgIFJlYWRGaWVsZDxJLCAmSTo6YT4oaSk7CisgIFJlYWRGaWVsZDxJLCAmSTo6Yj4oaSk7Cit9CisKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUge3suKn19UmVhZEZpZWxkcworLy8gQ0hFQ0s6IGNhbGwge3suKn19IEAiXDAxPz8kUmVhZEZpZWxkQFVTQEAkMDNAQFlBSEFBVVNAQEBaIgorLy8gQ0hFQ0s6IGNhbGwge3suKn19IEAiXDAxPz8kUmVhZEZpZWxkQFVNQEAkME1AQEBZQUhBQVVNQEBAWiIKKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JFJlYWRGaWVsZEBVVkBAJEY3QUBAQFlBSEFBVVZAQEBaIgorLy8gQ0hFQ0s6IGNhbGwge3suKn19IEAiXDAxPz8kUmVhZEZpZWxkQFVVQEAkRzNBQEFAQEBZQUhBQVVVQEBAWiIKKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JFJlYWRGaWVsZEBVU0BAJDA3QEBZQUhBQVVTQEBAWiIKKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JFJlYWRGaWVsZEBVTUBAJDBCQUBAQFlBSEFBVU1AQEBaIgorLy8gQ0hFQ0s6IGNhbGwge3suKn19IEAiXDAxPz8kUmVhZEZpZWxkQFVWQEAkRk1AQUBAQFlBSEFBVVZAQEBaIgorLy8gQ0hFQ0s6IGNhbGwge3suKn19IEAiXDAxPz8kUmVhZEZpZWxkQFVVQEAkRzdBQEFAQEBZQUhBQVVVQEBAWiIKKworLy8gTVNWQyBtYW5nbGVzIG51bGwgbWVtYmVyIHBvaW50ZXJzIGluIGZ1bmN0aW9uIHRlbXBsYXRlcyB3cm9uZywgYnV0IGl0IGdldHMKKy8vIHRoZW0gcmlnaHQgaW4gY2xhc3MgdGVtcGxhdGVzLgorLy8gQ0hFQ0s6IGNhbGwge3suKn19IEAiXDAxPz8kUmVhZEZpZWxkQFVTQEAkMEFAQEBZQUhBQVVTQEBAWiIKKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JFJlYWRGaWVsZEBVTUBAJDBBQEBAWUFIQUFVTUBAQFoiCisvLyBDSEVDSzogY2FsbCB7ey4qfX0gQCJcMDE/PyRSZWFkRmllbGRAVVZAQCRGQUA/MEBAWUFIQUFVVkBAQFoiCisvLyBDSEVDSzogY2FsbCB7ey4qfX0gQCJcMDE/PyRSZWFkRmllbGRAVVVAQCRHQUBBQD8wQEBZQUhBQVVVQEBAWiIKKworLy8gTm9uLXBvbHltb3JwaGljIG51bGwgZGF0YSBtZW1wdHIgdnMgZmlyc3QgZmllbGQgbWVtcHRyLiAgTVNWQyBtYW5nbGVzIHRoZXNlCisvLyB0aGUgc2FtZS4KKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JFJlYWRGaWVsZEBVQUBAJDBBQEBAWUFIQUFVQUBAQFoiCisvLyBDSEVDSzogY2FsbCB7ey4qfX0gQCJcMDE/PyRSZWFkRmllbGRAVUFAQCQwPzBAQFlBSEFBVUFAQEBaIgorCisvLyBJbmRpcmVjdCBmaWVsZHMgYXJlIGhhbmRsZWQgYXMtaWYgdGhleSB3ZXJlIHNpbXBseSBtZW1iZXJzIG9mIHRoZWlyIGVuY2xvc2luZworLy8gcmVjb3JkLgorLy8gQ0hFQ0s6IGNhbGwge3suKn19IEAiXDAxPz8kUmVhZEZpZWxkQFVJQEAkMEFAQEBZQUhBQVVJQEBAWiIKKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JFJlYWRGaWVsZEBVSUBAJDAzQEBZQUhBQVVJQEBAWiIKKworLy8gVGVzdCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdm9pZCAoVDo6Kk1GUCkoKT4KK3ZvaWQgQ2FsbE1ldGhvZChUICZvKSB7CisgIChvLipNRlApKCk7Cit9CisKK3ZvaWQgQ2FsbE1ldGhvZHMoKSB7CisgIFMgczsKKyAgTSBtOworICBWIHY7CisgIFUgdTsKKyAgTyBvOworCisgIC8vIE5vbi12aXJ0dWFsIG1ldGhvZHMuCisgIENhbGxNZXRob2Q8UywgJlM6OmY+KHMpOworICBDYWxsTWV0aG9kPE0sICZNOjpmPihtKTsKKyAgQ2FsbE1ldGhvZDxWLCAmVjo6Zj4odik7CisgIENhbGxNZXRob2Q8VSwgJlU6OmY+KHUpOworCisgIC8vIFZpcnR1YWwgbWV0aG9kcyByZXF1aXJpbmcgdGh1bmsgbWFuZ2xpbmcuCisgIENhbGxNZXRob2Q8UywgJlM6Omc+KHMpOworICBDYWxsTWV0aG9kPE0sICZNOjpnPihtKTsKKyAgQ2FsbE1ldGhvZDxWLCAmVjo6Zz4odik7CisgIENhbGxNZXRob2Q8VSwgJlU6Omc+KHUpOworCisgIC8vIEEgbWVtYmVyIHBvaW50ZXIgZm9yIGEgbm9uLXByaW1hcnkgdmJhc2Ugd2lsbCBoYXZlIGEgbm9uLXplcm8gdGhpcworICAvLyBhZGp1c3RtZW50LgorICBDYWxsTWV0aG9kPE8sICZPOjpnPihvKTsKKworICAvLyBOdWxsIG1lbWJlciBwb2ludGVycy4KKyAgQ2FsbE1ldGhvZDxTLCBudWxscHRyPihzKTsKKyAgQ2FsbE1ldGhvZDxNLCBudWxscHRyPihtKTsKKyAgQ2FsbE1ldGhvZDxWLCBudWxscHRyPih2KTsKKyAgQ2FsbE1ldGhvZDxVLCBudWxscHRyPih1KTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB7ey4qfX1DYWxsTWV0aG9kcworLy8gQ0hFQ0s6IGNhbGwge3suKn19IEAiXDAxPz8kQ2FsbE1ldGhvZEBVU0BAJDE/ZkAxQFFBRVhYWkBAWUFYQUFVU0BAQFoiCisvLyBDSEVDSzogY2FsbCB7ey4qfX0gQCJcMDE/PyRDYWxsTWV0aG9kQFVNQEAkSD9mQDFAUUFFWFhaQUBAQFlBWEFBVU1AQEBaIgorLy8gQ0hFQ0s6IGNhbGwge3suKn19IEAiXDAxPz8kQ2FsbE1ldGhvZEBVVkBAJEk/ZkAxQFFBRVhYWkFAQUBAQFlBWEFBVVZAQEBaIgorLy8gQ0hFQ0s6IGNhbGwge3suKn19IEAiXDAxPz8kQ2FsbE1ldGhvZEBVVUBAJEo/ZkAxQFFBRVhYWkFAQUBBQEBAWUFYQUFVVUBAQFoiCisKKy8vIFBSMTcwMzQ6IE1TVkMgcmV1c2VzIHRoZSBzYW1lIHRodW5rIGZvciBldmVyeSB2aXJ0dWFsIGcgbWV0aG9kIGJlY2F1c2UgdGhleQorLy8gYXJlIGFsbCBhdCB2ZnRhYmxlIG9mZnNldCB6ZXJvLiAgVGhleSB0aGVuIG1hbmdsZSB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgdGh1bmsKKy8vIGNyZWF0ZWQgaW50byB0aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiwgd2hpY2ggaXMgZGVmaW5pdGVseSBhCisvLyBidWcuICBXZSBkb24ndCBmb2xsb3cgdGhlbSBoZXJlLiAgSW5zdGVhZCBvZiA/XzkxQCBiYWNrcmVmIGJlbG93LCB0aGV5IHdvdWxkCisvLyBnZXQgP185U0BAIGluIGV2ZXJ5IGluc3RhbnRpYXRpb24gYWZ0ZXIgdGhlIGZpcnN0LgorCisvLyBDSEVDSzogY2FsbCB7ey4qfX0gQCJcMDE/PyRDYWxsTWV0aG9kQFVTQEAkMT8/XzkxQCRCQUBBRUBAWUFYQUFVU0BAQFoiCisvLyBDSEVDSzogY2FsbCB7ey4qfX0gQCJcMDE/PyRDYWxsTWV0aG9kQFVNQEAkSD8/XzkxQCRCQUBBRUFAQEBZQVhBQVVNQEBAWiIKKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JENhbGxNZXRob2RAVVZAQCRJPz9fOTFAJEJBQEFFQUBBQEBAWUFYQUFVVkBAQFoiCisvLyBDSEVDSzogY2FsbCB7ey4qfX0gQCJcMDE/PyRDYWxsTWV0aG9kQFVVQEAkSj8/XzkxQCRCQUBBRUFAQUBBQEBAWUFYQUFVVUBAQFoiCisKKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JENhbGxNZXRob2RAVU9AQCRIPz9fOTFAJEJBQEFFM0BAWUFYQUFVT0BAQFoiCisKKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JENhbGxNZXRob2RAVVNAQCQwQUBAQFlBWEFBVVNAQEBaIgorLy8gQ0hFQ0s6IGNhbGwge3suKn19IEAiXDAxPz8kQ2FsbE1ldGhvZEBVTUBAJDBBQEBAWUFYQUFVTUBAQFoiCisvLyBDSEVDSzogY2FsbCB7ey4qfX0gQCJcMDE/PyRDYWxsTWV0aG9kQFVWQEAkMEFAQEBZQVhBQVVWQEBAWiIKKy8vIENIRUNLOiBjYWxsIHt7Lip9fSBAIlwwMT8/JENhbGxNZXRob2RAVVVAQCQwQUBAQFlBWEFBVVVAQEBaIgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy10ZW1wbGF0ZXMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy10ZW1wbGF0ZXMuY3BwCmluZGV4IDUxNGY1NzMuLjI0ZTRmNGEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtdGVtcGxhdGVzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLXRlbXBsYXRlcy5jcHAKQEAgLTEsNSArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gLWN4eC1hYmkgbWljcm9zb2Z0IC1mbXMtZXh0ZW5zaW9ucyAtZmRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyAtdHJpcGxlPWkzODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1lbWl0LWxsdm0gJXMgLW8gLSAtY3h4LWFiaSBtaWNyb3NvZnQgLWZtcy1leHRlbnNpb25zIC1mZGVsYXllZC10ZW1wbGF0ZS1wYXJzaW5nIC10cmlwbGU9eDg2XzY0LXBjLXdpbjMyIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggWDY0ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZW1pdC1sbHZtICVzIC1vIC0gLWZtcy1leHRlbnNpb25zIC1mZGVsYXllZC10ZW1wbGF0ZS1wYXJzaW5nIC10cmlwbGU9aTM4Ni1wYy13aW4zMiB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAlcyAtbyAtIC1mbXMtZXh0ZW5zaW9ucyAtZmRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IFg2NCAlcwogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogY2xhc3MgQ2xhc3MgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy12ZWN0b3ItdHlwZXMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy12ZWN0b3ItdHlwZXMuY3BwCmluZGV4IDY0Y2I3MjUuLmFjYTQ5MjkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbXMtdmVjdG9yLXR5cGVzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLXZlY3Rvci10eXBlcy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZtcy1leHRlbnNpb25zIC1mZnJlZXN0YW5kaW5nIC10YXJnZXQtZmVhdHVyZSArYXZ4IC1lbWl0LWxsdm0gJXMgLW8gLSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pNjg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZtcy1leHRlbnNpb25zIC1mZnJlZXN0YW5kaW5nIC10YXJnZXQtZmVhdHVyZSArYXZ4IC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPWk2ODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgJXMKIAogI2luY2x1ZGUgPHhtbWludHJpbi5oPgogI2luY2x1ZGUgPGVtbWludHJpbi5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1tcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLmNwcAppbmRleCA2OGVjMmIzLi4zMjg1Yzk4IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW1zLmNwcApAQCAtMSw1ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZmJsb2NrcyAtZW1pdC1sbHZtICVzIC1vIC0gLWN4eC1hYmkgbWljcm9zb2Z0IC10cmlwbGU9aTM4Ni1wYy13aW4zMiAtc3RkPWMrKzExIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZibG9ja3MgLWVtaXQtbGx2bSAlcyAtbyAtIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiAtc3RkPWMrKzExfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBYNjQgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZmJsb2NrcyAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1zdGQ9YysrOTggfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZmJsb2NrcyAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT14ODZfNjQtcGMtd2luMzIgLXN0ZD1jKys5OHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggWDY0ICVzCiAKIGludCBhOwogLy8gQ0hFQ0stREFHOiBAIlwwMT9hQEAzSEEiCkBAIC05NSwxMCArOTUsMTggQEAKIC8vIENIRUNLLURBRzogQCJcMDE/aDFAQDNRQUhBIgogZXh0ZXJuIGNvbnN0IGludCAqIGNvbnN0IGgyID0gJmE7CiAvLyBDSEVDSy1EQUc6IEAiXDAxP2gyQEAzUUJIQiIKK2V4dGVybiBpbnQgKiBjb25zdCBfX3Jlc3RyaWN0IGgzID0gJmE7CisvLyBDSEVDSy1EQUc6IEAiXDAxP2gzQEAzUUlBSElBIgorLy8gWDY0LURBRzogQCJcMDE/aDNAQDNRRUlBSEVJQSIKIAogaW50IGlbMTBdWzIwXTsKIC8vIENIRUNLLURBRzogQCJcMDE/aUBAM1BBWTBCRUBIQSIKIAordHlwZWRlZiBpbnQgKCpGdW5UKShpbnQsIGludCk7CitGdW5UIEZ1bkFyclsxMF1bMjBdOworLy8gQ0hFQ0stREFHOiBAIlwwMT9GdW5BcnJAQDNQQVkwQkVAUDZBSEhIQFpBIgorLy8gWDY0LURBRzogQCJcMDE/RnVuQXJyQEAzUEFZMEJFQFA2QUhISEBaQSIKKwogaW50IChfX3N0ZGNhbGwgKmopKHNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyKTsKIC8vIENIRUNLLURBRzogQCJcMDE/akBAM1A2R0hDRUBaQSIKIApAQCAtMzU3LDEwICszNjUsMyBAQAogLy8gQ0hFQ0stREFHOiA/PzNUeXBlZGVmTmV3RGVsZXRlQEBTQVhQQVhAWgogLy8gQ0hFQ0stREFHOiA/P19WVHlwZWRlZk5ld0RlbGV0ZUBAU0FYUEFYQFoKIAotbmFtZXNwYWNlIFBSMTgwMjIgewotCi1zdHJ1Y3QgeyB9IGE7Ci1kZWNsdHlwZShhKSBmdW4oZGVjbHR5cGUoYSkgeCwgZGVjbHR5cGUoYSkpIHsgcmV0dXJuIHg7IH0KLS8vIENIRUNLLURBRzogP2Z1bkBQUjE4MDIyQEBZQT9BVTx1bm5hbWVkLXR5cGUtYT5AMUBVMjFAMEBaCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbmVvbi12ZWN0b3JzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtbmVvbi12ZWN0b3JzLmNwcAppbmRleCAyNDllYzJlLi5hOWQwYjhkIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW5lb24tdmVjdG9ycy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1uZW9uLXZlY3RvcnMuY3BwCkBAIC0xLDEwICsxLDE4IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm0tbm9uZS1saW51eC1nbnVlYWJpIC10YXJnZXQtZmVhdHVyZSArbmVvbiAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybXY3LWFwcGxlLWlvcyAtdGFyZ2V0LWZlYXR1cmUgK25lb24gICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtbGludXgtZ251ICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1BQVJDSDY0CiAKIHR5cGVkZWYgZmxvYXQgZmxvYXQzMl90OwordHlwZWRlZiBkb3VibGUgZmxvYXQ2NF90OwogdHlwZWRlZiBfX2ZwMTYgZmxvYXQxNl90OworI2lmIGRlZmluZWQoX19hYXJjaDY0X18pCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgcG9seThfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgcG9seTE2X3Q7CisjZWxzZQogdHlwZWRlZiBzaWduZWQgY2hhciBwb2x5OF90OwogdHlwZWRlZiBzaG9ydCBwb2x5MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NF90OworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIF9fSU5UNjRfVFlQRV9fIHVpbnQ2NF90OwogCiB0eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fdmVjdG9yX3R5cGUoMikpKSBpbnQgaW50MzJ4Ml90OwogdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDQpKSkgaW50IGludDMyeDRfdDsKQEAgLTE0LDI2ICsyMiw1MyBAQAogdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDQpKSkgZmxvYXQzMl90IGZsb2F0MzJ4NF90OwogdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDQpKSkgZmxvYXQxNl90IGZsb2F0MTZ4NF90OwogdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDgpKSkgZmxvYXQxNl90IGZsb2F0MTZ4OF90OwotdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3BvbHl2ZWN0b3JfdHlwZSgxNikpKSBwb2x5OF90IHBvbHk4eDE2X3Q7Ci10eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fcG9seXZlY3Rvcl90eXBlKDgpKSkgcG9seTE2X3QgcG9seTE2eDhfdDsKKyNpZmRlZiBfX2FhcmNoNjRfXwordHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDIpKSkgZmxvYXQ2NF90IGZsb2F0NjR4Ml90OworI2VuZGlmCit0eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fcG9seXZlY3Rvcl90eXBlKDE2KSkpIHBvbHk4X3QgIHBvbHk4eDE2X3Q7Cit0eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fcG9seXZlY3Rvcl90eXBlKDgpKSkgIHBvbHkxNl90IHBvbHkxNng4X3Q7CiAKIC8vIENIRUNLOiAxNl9fc2ltZDY0X2ludDMyX3QKKy8vIENIRUNLLUFBUkNINjQ6IDExX19JbnQzMngyX3QKIHZvaWQgZjEoaW50MzJ4Ml90IHYpIHsgfQorCiAvLyBDSEVDSzogMTdfX3NpbWQxMjhfaW50MzJfdAorLy8gQ0hFQ0stQUFSQ0g2NDogMTFfX0ludDMyeDRfdAogdm9pZCBmMihpbnQzMng0X3QgdikgeyB9CisKIC8vIENIRUNLOiAxN19fc2ltZDY0X3VpbnQ2NF90CisvLyBDSEVDSy1BQVJDSDY0OiAxMl9fVWludDY0eDFfdAogdm9pZCBmMyh1aW50NjR4MV90IHYpIHsgfQorCiAvLyBDSEVDSzogMThfX3NpbWQxMjhfdWludDY0X3QKKy8vIENIRUNLLUFBUkNINjQ6IDEyX19VaW50NjR4Ml90CiB2b2lkIGY0KHVpbnQ2NHgyX3QgdikgeyB9CisKIC8vIENIRUNLOiAxOF9fc2ltZDY0X2Zsb2F0MzJfdAorLy8gQ0hFQ0stQUFSQ0g2NDogMTNfX0Zsb2F0MzJ4Ml90CiB2b2lkIGY1KGZsb2F0MzJ4Ml90IHYpIHsgfQorCiAvLyBDSEVDSzogMTlfX3NpbWQxMjhfZmxvYXQzMl90CisvLyBDSEVDSy1BQVJDSDY0OiAxM19fRmxvYXQzMng0X3QKIHZvaWQgZjYoZmxvYXQzMng0X3QgdikgeyB9CisKIC8vIENIRUNLOiAxOF9fc2ltZDY0X2Zsb2F0MTZfdAorLy8gQ0hFQ0stQUFSQ0g2NDogMTNfX0Zsb2F0MTZ4NF90CiB2b2lkIGY3KGZsb2F0MTZ4NF90IHYpIHt9CisKIC8vIENIRUNLOiAxOV9fc2ltZDEyOF9mbG9hdDE2X3QKKy8vIENIRUNLLUFBUkNINjQ6IDEzX19GbG9hdDE2eDhfdAogdm9pZCBmOChmbG9hdDE2eDhfdCB2KSB7fQorCiAvLyBDSEVDSzogMTdfX3NpbWQxMjhfcG9seThfdAorLy8gQ0hFQ0stQUFSQ0g2NDogMTJfX1BvbHk4eDE2X3QKIHZvaWQgZjkocG9seTh4MTZfdCB2KSB7fQorCiAvLyBDSEVDSzogMThfX3NpbWQxMjhfcG9seTE2X3QKKy8vIENIRUNLLUFBUkNINjQ6IDEyX19Qb2x5MTZ4OF90CiB2b2lkIGYxMChwb2x5MTZ4OF90IHYpIHt9CisKKyNpZmRlZiBfX2FhcmNoNjRfXworLy8gQ0hFQ0stQUFSQ0g2NDogMTNfX0Zsb2F0NjR4Ml90Cit2b2lkIGYxMShmbG9hdDY0eDJfdCB2KSB7IH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1udWxscHRyLWFyZy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW51bGxwdHItYXJnLmNwcAppbmRleCBiNTVlYTZkLi42NmVkN2U1IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW51bGxwdHItYXJnLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLW51bGxwdHItYXJnLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiB0ZW1wbGF0ZTxpbnQgKmlwPiBzdHJ1Y3QgSVAge307CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtc3RkLWV4dGVybmMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1zdGQtZXh0ZXJuYy5jcHAKaW5kZXggYTQ3OGRlZS4uZjBjN2Q2OSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1zdGQtZXh0ZXJuYy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1zdGQtZXh0ZXJuYy5jcHAKQEAgLTEsNSArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLUROUz1zdGQgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLVNURAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1ETlM9biAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTgorLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1ETlM9c3RkIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stU1RECisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLUROUz1uIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTgogCiAvLyBfWk5TdDFESVN0MUNFMWlFID0gc3RkOjpEPHN0ZDo6Qz46OmkKIC8vIENIRUNLLVNURDogQF9aTlN0MURJU3QxQ0UxaUUgPSAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtc3Vic3Qtc3RkLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtc3Vic3Qtc3RkLmNwcAppbmRleCA2Mjc3YzdhLi42Nzg5NTZlIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLXN1YnN0LXN0ZC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS1zdWJzdC1zdGQuY3BwCkBAIC0xNSw4ICsxNSw4IEBACiBuYW1lc3BhY2Ugc3RkIHsKICAgc3RydWN0IEEgeyBBKCk7IH07CiAgIAotICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTlN0MUFDMUV2KCUic3RydWN0LnN0ZDo6QSIqICV0aGlzKSB1bm5hbWVkX2FkZHIKICAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk5TdDFBQzJFdiglInN0cnVjdC5zdGQ6OkEiKiAldGhpcykgdW5uYW1lZF9hZGRyCisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOU3QxQUMxRXYoJSJzdHJ1Y3Quc3RkOjpBIiogJXRoaXMpIHVubmFtZWRfYWRkcgogICBBOjpBKCkgeyB9CiB9OwogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLXRlbXBsYXRlLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtdGVtcGxhdGUuY3BwCmluZGV4IDNiN2YzMDIuLjhmZDI3YjggMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtdGVtcGxhdGUuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtdGVtcGxhdGUuY3BwCkBAIC0xLDQgKzEsNiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLVduby1yZXR1cm4tdHlwZSAtV25vLW1haW4gLXN0ZD1jKysxMSAtZW1pdC1sbHZtIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcworCiBuYW1lc3BhY2UgdGVzdDEgewogaW50IHg7CiB0ZW1wbGF0ZSA8aW50JiBEPiBjbGFzcyBUIHsgfTsKQEAgLTE1Niw3ICsxNTgsNyBAQAogCiBuYW1lc3BhY2UgdGVzdDEyIHsKICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBtYW5nbGUgbm9uLXR5cGUgdGVtcGxhdGUgYXJncyB3aXRoIGludGVybmFsIGxpbmthZ2UuCi0gIHN0YXRpYyBpbnQgZigpOworICBzdGF0aWMgaW50IGYoKSB7fQogICBjb25zdCBpbnQgbiA9IDEwOwogICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBUIHY+IHZvaWQgdGVzdCgpIHt9CiAgIHZvaWQgdXNlKCkgewpAQCAtMTgyLDMgKzE4NCwyNSBAQAogICB0ZW1wbGF0ZSBzaG9ydCByZXR1cm5TaG9ydDwtMzI3Njg+KCk7CiAgIC8vIENIRUNLOiBAX1pONnRlc3QxMzExcmV0dXJuU2hvcnRJTHNuMzI3NjhFRUVzdigpCiB9CisKK25hbWVzcGFjZSB0ZXN0MTQgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWU+IGlubGluZSBpbnQgaW5sKGJvb2wgYikgeworICAgIGlmIChiKSB7CisgICAgICBzdGF0aWMgc3RydWN0IHsKKyAgICAgICAgaW50IGZpZWxkOworICAgICAgfSBhOworICAgICAgLy8gQ0hFQ0s6IEBfWlpONnRlc3QxNDNpbmxJdkVFaWJFMWEKKworICAgICAgcmV0dXJuIGEuZmllbGQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXRpYyBzdHJ1Y3QgeworICAgICAgICBpbnQgZmllbGQ7CisgICAgICB9IGE7CisgICAgICAvLyBDSEVDSzogQF9aWk42dGVzdDE0M2lubEl2RUVpYkUxYV8wCisKKyAgICAgIHJldHVybiBhLmZpZWxkOworICAgIH0KKyAgfQorCisgIGludCBjYWxsKGJvb2wgYikgeyByZXR1cm4gaW5sPHZvaWQ+KGIpOyB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLXdpbmRvd3MuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS13aW5kb3dzLmNwcAppbmRleCBjMDg3NjE2Li44NTY0NDQ3IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWFuZ2xlLXdpbmRvd3MuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUtd2luZG93cy5jcHAKQEAgLTEsNSArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC1jeHgtYWJpIG1pY3Jvc29mdCBcCi0vLyBSVU46ICAgICAtdHJpcGxlPWkzODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9V0lOICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiB8IFwKKy8vIFJVTjogICAgIEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1XSU4gJXMKIC8vCiAvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9aTM4Ni1taW5ndzMyIHwgXAogLy8gUlVOOiAgICAgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUlUQU5JVU0gJXMKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9tYW5nbGUuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS5jcHAKaW5kZXggZDgzNmYzNi4uZmZiNjYzNiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21hbmdsZS5jcHAKQEAgLTIxNiw5ICsyMTYsOSBAQAogfTsKIAogLy8gUFI1MTM5Ci0vLyBDSEVDSzogQF9aTjJTN0MxRXYKIC8vIENIRUNLOiBAX1pOMlM3QzJFdgogLy8gQ0hFQ0s6IEBfWk4yUzdVdF9DMUV2CisvLyBDSEVDSzogQF9aTjJTN0MxRXYKIFM3OjpTNygpIHt9CiAKIC8vIFBSNTA2MwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21lbWJlci1hbGlnbm1lbnQuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21lbWJlci1hbGlnbm1lbnQuY3BwCmluZGV4IDc4MDI2ZDQuLjQzZWQ1ZTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9tZW1iZXItYWxpZ25tZW50LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWVtYmVyLWFsaWdubWVudC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyByZGFyOi8vNzI2ODI4OQogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWVtYmVyLWluaXQtYW5vbi11bmlvbi5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWVtYmVyLWluaXQtYW5vbi11bmlvbi5jcHAKaW5kZXggYmZlMTY2Ny4uYjQ4OGZhNyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21lbWJlci1pbml0LWFub24tdW5pb24uY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tZW1iZXItaW5pdC1hbm9uLXVuaW9uLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtc3RkPWMrKzExIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1zdGQ9YysrMTEgLXRyaXBsZSB4ODZfNjQtbGludXgtZ251IC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBQUjEwNTMxLgogCkBAIC0yMSwxMiArMjEsNDIgQEAKICAgICBpbnQgYTsKICAgICBpbnQgYiA9IDgxOwogICB9OwotICAvLyBDSEVDSzogZGVmaW5lIHt7Lip9fV9aMWd2CisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUge3suKn19X1oxZ3YKICAgLy8gQ0hFQ0stTk9UOiB9CiAgIC8vIENIRUNLOiBjYWxsIHt7Lip9fUAiW1tDT05TVFJVQ1RfTE9DQUw6LipdXUMxRXYiCiAgIHJldHVybiBiOwogfQogCitzdHJ1Y3QgQSB7CisgIEEoKTsKK307Cit1bmlvbiBCIHsKKyAgaW50IGs7CisgIHN0cnVjdCB7CisgICAgQSB4OworICAgIGludCB5ID0gMTIzOworICB9OworICBCKCkge30KKyAgQihpbnQgbikgOiBrKG4pIHt9Cit9OworCitCIGIxOworQiBiMigwKTsKKworCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHt7Lip9fSBAX1pOMUJDMkVpKAorLy8gQ0hFQ0stTk9UOiBjYWxsIHZvaWQgQF9aTjFBQzFFdigKKy8vIENIRUNLLU5PVDogc3RvcmUgaTMyIDEyMywKKy8vIENIRUNLOiBzdG9yZSBpMzIgJQorLy8gQ0hFQ0stTk9UOiBjYWxsIHZvaWQgQF9aTjFBQzFFdigKKy8vIENIRUNLLU5PVDogc3RvcmUgaTMyIDEyMywKKy8vIENIRUNLOiB9CisKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUge3suKn19IEBfWk4xQkMyRXYoCisvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk4xQUMxRXYoCisvLyBDSEVDSzogc3RvcmUgaTMyIDEyMywKKy8vIENIRUNLOiB9CisKIAogLy8gQ0hFQ0s6IGRlZmluZSB7ey4qfX1AIltbQ09OU1RSVUNUX0xPQ0FMXV1DMkV2IgogLy8gQ0hFQ0stTk9UOiB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWVtYmVyLXRlbXBsYXRlcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWVtYmVyLXRlbXBsYXRlcy5jcHAKaW5kZXggYzcyZGQ2ZS4uOTNkMzZmZiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21lbWJlci10ZW1wbGF0ZXMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tZW1iZXItdGVtcGxhdGVzLmNwcApAQCAtMTUsOCArMTUsOCBAQAogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBCOjpCKFQpIHt9CiAKLS8vIENIRUNLLUxBQkVMOiBkZWZpbmUgd2Vha19vZHIgdm9pZCBAX1pOMUJDMUlpRUVUXyglc3RydWN0LkIqICV0aGlzLCBpMzIpIHVubmFtZWRfYWRkcgogLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB3ZWFrX29kciB2b2lkIEBfWk4xQkMySWlFRVRfKCVzdHJ1Y3QuQiogJXRoaXMsIGkzMikgdW5uYW1lZF9hZGRyCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHdlYWtfb2RyIHZvaWQgQF9aTjFCQzFJaUVFVF8oJXN0cnVjdC5CKiAldGhpcywgaTMyKSB1bm5hbWVkX2FkZHIKIHRlbXBsYXRlIEI6OkIoaW50KTsKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLWFsaWdubWVudC1mYWlsLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLWFsaWdubWVudC1mYWlsLmNwcAppbmRleCA3NDA3ZWZlLi5jODQ3N2Y0IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1hbGlnbm1lbnQtZmFpbC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktYWxpZ25tZW50LWZhaWwuY3BwCkBAIC0xLDEwICsxLDEwIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0gLWN4eC1hYmkgbWljcm9zb2Z0IC10cmlwbGU9aTY4Ni1wYy13aW4zMiAtbyAtICVzICAyPi9kZXYvbnVsbCB8IEZpbGVDaGVjayAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiAtbyAtICVzICAyPi9kZXYvbnVsbCB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IENIRUNLLVg2NAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtIC10cmlwbGU9aTY4Ni1wYy13aW4zMiAtbyAtICVzICAyPi9kZXYvbnVsbCB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtIC10cmlwbGU9eDg2XzY0LXBjLXdpbjMyIC1vIC0gJXMgIDI+L2Rldi9udWxsIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXggQ0hFQ0stWDY0CiAKIHN0cnVjdCBCIHsgY2hhciBhOyB9Owogc3RydWN0IEEgOiB2aXJ0dWFsIEIge30gYTsKIAogLy8gVGhlIDw+IGluZGljYXRlIHRoYXQgdGhlIHBvaW50ZXIgaXMgcGFja2VkLCB3aGljaCBpcyByZXF1aXJlZCB0byBzdXBwb3J0CiAvLyBtaWNyb3NvZnQgbGF5b3V0IGluIDMyIGJpdCBtb2RlLCBidXQgbm90IDY0IGJpdCBtb2RlLgotLy8gQ0hFQ0s6ICVzdHJ1Y3QuQSA9IHR5cGUgPHsgaTMyKiwgJXN0cnVjdC5CIH0+DQotLy8gQ0hFQ0stWDY0OiAlc3RydWN0LkEgPSB0eXBlIHsgaTMyKiwgJXN0cnVjdC5CIH0NCisvLyBDSEVDSzogJXN0cnVjdC5BID0gdHlwZSA8eyBpMzIqLCAlc3RydWN0LkIgfT4KKy8vIENIRUNLLVg2NDogJXN0cnVjdC5BID0gdHlwZSB7IGkzMiosICVzdHJ1Y3QuQiB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1hcmctb3JkZXIuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktYXJnLW9yZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWY2ZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktYXJnLW9yZGVyLmNwcApAQCAtMCwwICsxLDUwIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLW1jb25zdHJ1Y3Rvci1hbGlhc2VzIC1zdGQ9YysrMTEgLWZleGNlcHRpb25zIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPWkzODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgJXMKKworc3RydWN0IEEgeworICBBKGludCBhKTsKKyAgfkEoKTsKKyAgaW50IGE7Cit9OworCit2b2lkIGZvbyhBIGEsIEEgYiwgQSBjKSB7Cit9CisKKy8vIE9yZGVyIG9mIGRlc3RydWN0aW9uIHNob3VsZCBiZSBsZWZ0IHRvIHJpZ2h0LgorLy8KKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAIlwwMT9mb29AQFlBWFVBQEAwMEBaIgorLy8gQ0hFQ0s6ICAgICAgICAgIChbW2FyZ21lbV90eTo8eyAlc3RydWN0LkEsICVzdHJ1Y3QuQSwgJXN0cnVjdC5BIH0+XV0qIGluYWxsb2NhKQorLy8gQ0hFQ0s6ICVbW2E6W14gXSpdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgW1thcmdtZW1fdHldXSogJTAsIGkzMiAwLCBpMzIgMAorLy8gQ0hFQ0s6ICVbW2I6W14gXSpdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgW1thcmdtZW1fdHldXSogJTAsIGkzMiAwLCBpMzIgMQorLy8gQ0hFQ0s6ICVbW2M6W14gXSpdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgW1thcmdtZW1fdHldXSogJTAsIGkzMiAwLCBpMzIgMgorLy8gQ0hFQ0s6IGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUFAQFFBRUBYWiIoJXN0cnVjdC5BKiAlW1thXV0pCisvLyBDSEVDSzogY2FsbCB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxPz8xQUBAUUFFQFhaIiglc3RydWN0LkEqICVbW2JdXSkKKy8vIENIRUNLOiBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzFBQEBRQUVAWFoiKCVzdHJ1Y3QuQSogJVtbY11dKQorLy8gQ0hFQ0s6IHJldCB2b2lkCisKKwordm9pZCBjYWxsX2ZvbygpIHsKKyAgZm9vKEEoMSksIEEoMiksIEEoMykpOworfQorCisvLyBPcmRlciBvZiBldmFsdWF0aW9uIHNob3VsZCBiZSByaWdodCB0byBsZWZ0LCBhbmQgd2Ugc2hvdWxkIGNsZWFuIHVwIHRoZSByaWdodAorLy8gdGhpbmdzIGFzIHdlIHVud2luZC4KKy8vCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQCJcMDE/Y2FsbF9mb29AQFlBWFhaIigpCisvLyBDSEVDSzogY2FsbCBpOCogQGxsdm0uc3RhY2tzYXZlKCkKKy8vIENIRUNLOiAlW1thcmdtZW06W14gXSpdXSA9IGFsbG9jYSBpbmFsbG9jYSBbW2FyZ21lbV90eV1dCisvLyBDSEVDSzogJVtbYXJnMzpbXiBdKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBbW2FyZ21lbV90eV1dKiAlW1thcmdtZW1dXSwgaTMyIDAsIGkzMiAyCisvLyBDSEVDSzogaW52b2tlIHg4Nl90aGlzY2FsbGNjICVzdHJ1Y3QuQSogQCJcMDE/PzBBQEBRQUVASEBaIiglc3RydWN0LkEqICVbW2FyZzNdXSwgaTMyIDMpCisvLyBDSEVDSzogJVtbYXJnMjpbXiBdKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBbW2FyZ21lbV90eV1dKiAlW1thcmdtZW1dXSwgaTMyIDAsIGkzMiAxCisvLyBDSEVDSzogaW52b2tlIHg4Nl90aGlzY2FsbGNjICVzdHJ1Y3QuQSogQCJcMDE/PzBBQEBRQUVASEBaIiglc3RydWN0LkEqICVbW2FyZzJdXSwgaTMyIDIpCisvLyBDSEVDSzogJVtbYXJnMTpbXiBdKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBbW2FyZ21lbV90eV1dKiAlW1thcmdtZW1dXSwgaTMyIDAsIGkzMiAwCisvLyBDSEVDSzogaW52b2tlIHg4Nl90aGlzY2FsbGNjICVzdHJ1Y3QuQSogQCJcMDE/PzBBQEBRQUVASEBaIiglc3RydWN0LkEqICVbW2FyZzFdXSwgaTMyIDEpCisvLyBDSEVDSzogaW52b2tlIHZvaWQgQCJcMDE/Zm9vQEBZQVhVQUBAMDBAWiIoW1thcmdtZW1fdHldXSogaW5hbGxvY2EgJVtbYXJnbWVtXV0pCisvLyBDSEVDSzogY2FsbCB2b2lkIEBsbHZtLnN0YWNrcmVzdG9yZQorLy8gQ0hFQ0s6IHJldCB2b2lkCisvLworLy8gICBscGFkMjoKKy8vIENIRUNLOiBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzFBQEBRQUVAWFoiKCVzdHJ1Y3QuQSogJVtbYXJnMl1dKQorLy8gQ0hFQ0s6IGJyIGxhYmVsCisvLworLy8gICBlaGNsZWFudXA6CisvLyBDSEVDSzogY2FsbCB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxPz8xQUBAUUFFQFhaIiglc3RydWN0LkEqICVbW2FyZzNdXSkKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLWFycmF5LWNvb2tpZXMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktYXJyYXktY29va2llcy5jcHAKaW5kZXggMWJhMWY2YS4uOGRhNGZjZiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktYXJyYXktY29va2llcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktYXJyYXktY29va2llcy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPWkzODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCiAKIHN0cnVjdCBDbGFzc1dpdGhvdXREdG9yIHsKICAgY2hhciB4OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktYnl2YWwtc3JldC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1ieXZhbC1zcmV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODViMWNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktYnl2YWwtc3JldC5jcHAKQEAgLTAsMCArMSwyOSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPWk2ODYtcGMtd2luMzIgLW1jb25zdHJ1Y3Rvci1hbGlhc2VzIC1mbm8tcnR0aSB8IEZpbGVDaGVjayAlcworCitzdHJ1Y3QgQSB7CisgIEEoKSA6IGEoNDIpIHt9CisgIEEoY29uc3QgQSAmbykgOiBhKG8uYSkge30KKyAgfkEoKSB7fQorICBpbnQgYTsKKyAgQSBmb28oQSBvKTsKK307CisKK0EgQTo6Zm9vKEEgeCkgeworICBBIHkoKnRoaXMpOworICB5LmEgKz0geC5hOworICByZXR1cm4geTsKK30KKworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB4ODZfdGhpc2NhbGxjYyAlc3RydWN0LkEqIEAiXDAxP2Zvb0BBQEBRQUU/QVUxQFUxQEBaIgorLy8gQ0hFQ0s6ICAgICAgICglc3RydWN0LkEqICV0aGlzLCA8eyAlc3RydWN0LkEqLCAlc3RydWN0LkEgfT4qIGluYWxsb2NhKQorLy8gQ0hFQ0s6ICAgZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyA8eyAlc3RydWN0LkEqLCAlc3RydWN0LkEgfT4qICV7ey4qfX0sIGkzMiAwLCBpMzIgMAorLy8gQ0hFQ0s6ICAgbG9hZCAlc3RydWN0LkEqKgorLy8gQ0hFQ0s6ICAgcmV0ICVzdHJ1Y3QuQSoKKworaW50IG1haW4oKSB7CisgIEEgeDsKKyAgQSB5ID0geC5mb28oeCk7Cit9CisKKy8vIENIRUNLOiBjYWxsIHg4Nl90aGlzY2FsbGNjICVzdHJ1Y3QuQSogQCJcMDE/Zm9vQEFAQFFBRT9BVTFAVTFAQFoiCisvLyBDSEVDSzogICAgICAgKCVzdHJ1Y3QuQSogJXt7W14sXSp9fSwgPHsgJXN0cnVjdC5BKiwgJXN0cnVjdC5BIH0+KiBpbmFsbG9jYSAle3tbXixdKn19KQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktYnl2YWwtdmFyYXJnLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLWJ5dmFsLXZhcmFyZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2MTkyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLWJ5dmFsLXZhcmFyZy5jcHAKQEAgLTAsMCArMSwyNyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPWk2ODYtcGMtd2luMzIgLW1jb25zdHJ1Y3Rvci1hbGlhc2VzIC1mbm8tcnR0aSB8IEZpbGVDaGVjayAlcworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK3N0cnVjdCBBIHsKKyAgQShpbnQgYSkgOiBhKGEpIHt9CisgIEEoY29uc3QgQSAmbykgOiBhKG8uYSkge30KKyAgfkEoKSB7fQorICBpbnQgYTsKK307CisKK2ludCBmb28oQSBhLCAuLi4pIHsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGEpOworICBpbnQgc3VtID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmE7ICsraSkKKyAgICBzdW0gKz0gdmFfYXJnKGFwLCBpbnQpOworICB2YV9lbmQoYXApOworICByZXR1cm4gc3VtOworfQorCitpbnQgbWFpbigpIHsKKyAgcmV0dXJuIGZvbyhBKDMpLCAxLCAyLCAzKTsKK30KKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgaTMyIEBtYWluKCkKKy8vIENIRUNLOiAlW1thcmdtZW1fY2FzdDpbXiBdKl1dID0gYml0Y2FzdCA8eyAlc3RydWN0LkEsIGkzMiwgaTMyLCBpMzIgfT4qICVhcmdtZW0gdG8gPHsgJXN0cnVjdC5BIH0+KgorLy8gQ0hFQ0s6IGNhbGwgaTMyICg8eyAlc3RydWN0LkEgfT4qLCAuLi4pKiBAIlwwMT9mb29AQFlBSFVBQEBaWiIoPHsgJXN0cnVjdC5BIH0+KiBpbmFsbG9jYSAlW1thcmdtZW1fY2FzdF1dKQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktY2RlY2wtbWV0aG9kLXNyZXQuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktY2RlY2wtbWV0aG9kLXNyZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjM2UyY2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1jZGVjbC1tZXRob2Qtc3JldC5jcHAKQEAgLTAsMCArMSwzNSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1wYy13aW4zMiAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKworLy8gUFIxNTc2OAorCisvLyBBIHRyaXZpYWwgMTIgYnl0ZSBzdHJ1Y3QgaXMgcmV0dXJuZWQgaW5kaXJlY3RseS4KK3N0cnVjdCBTIHsKKyAgUygpOworICBpbnQgYSwgYiwgYzsKK307CisKK3N0cnVjdCBDIHsKKyAgUyB2YXJpYWRpY19zcmV0KGNvbnN0IGNoYXIgKmYsIC4uLik7CisgIFMgX19jZGVjbCBjZGVjbF9zcmV0KCk7CisgIFMgX19jZGVjbCBieXZhbF9hbmRfc3JldChTIGEpOworICBpbnQgYzsKK307CisKK1MgQzo6dmFyaWFkaWNfc3JldChjb25zdCBjaGFyICpmLCAuLi4pIHsgcmV0dXJuIFMoKTsgfQorUyBDOjpjZGVjbF9zcmV0KCkgeyByZXR1cm4gUygpOyB9CitTIEM6OmJ5dmFsX2FuZF9zcmV0KFMgYSkgeyByZXR1cm4gUygpOyB9CisKKy8vIENIRUNLOiBkZWZpbmUgeDg2X2NkZWNsbWV0aG9kY2Mgdm9pZCBAIlwwMT92YXJpYWRpY19zcmV0QENAQFFBQT9BVVNAQFBCRFpaIiglc3RydWN0LlMqIG5vYWxpYXMgc3JldCAlYWdnLnJlc3VsdCwgJXN0cnVjdC5DKiAldGhpcywgaTgqICVmLCAuLi4pCisvLyBDSEVDSzogZGVmaW5lIHg4Nl9jZGVjbG1ldGhvZGNjIHZvaWQgQCJcMDE/Y2RlY2xfc3JldEBDQEBRQUE/QVVTQEBYWiIoJXN0cnVjdC5TKiBub2FsaWFzIHNyZXQgJWFnZy5yZXN1bHQsICVzdHJ1Y3QuQyogJXRoaXMpCisvLyBDSEVDSzogZGVmaW5lIHg4Nl9jZGVjbG1ldGhvZGNjIHZvaWQgQCJcMDE/Ynl2YWxfYW5kX3NyZXRAQ0BAUUFBP0FVU0BAVTJAQFoiKCVzdHJ1Y3QuUyogbm9hbGlhcyBzcmV0ICVhZ2cucmVzdWx0LCAlc3RydWN0LkMqICV0aGlzLCAlc3RydWN0LlMqIGJ5dmFsIGFsaWduIDQgJWEpCisKK2ludCBtYWluKCkgeworICBDIGM7CisgIGMudmFyaWFkaWNfc3JldCgiYXNkZiIpOworICBjLmNkZWNsX3NyZXQoKTsKKyAgYy5ieXZhbF9hbmRfc3JldChTKCkpOworfQorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBpMzIgQG1haW4oKQorLy8gQ0hFQ0s6IGNhbGwgeDg2X2NkZWNsbWV0aG9kY2Mgdm9pZCB7ey4qfX0gQCJcMDE/dmFyaWFkaWNfc3JldEBDQEBRQUE/QVVTQEBQQkRaWiIKKy8vIENIRUNLOiBjYWxsIHg4Nl9jZGVjbG1ldGhvZGNjIHZvaWQgQCJcMDE/Y2RlY2xfc3JldEBDQEBRQUE/QVVTQEBYWiIKKy8vIENIRUNLOiBjYWxsIHg4Nl9jZGVjbG1ldGhvZGNjIHZvaWQgQCJcMDE/Ynl2YWxfYW5kX3NyZXRAQ0BAUUFBP0FVU0BAVTJAQFoiCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1jb25zdGV4cHItdnMtaW5oZXJpdGFuY2UuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktY29uc3RleHByLXZzLWluaGVyaXRhbmNlLmNwcAppbmRleCA5MmRiOWE3Li4zMTlmMzljIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1jb25zdGV4cHItdnMtaW5oZXJpdGFuY2UuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLWNvbnN0ZXhwci12cy1pbmhlcml0YW5jZS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAlcyAtbyAtIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPWkzODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1mbm8tcnR0aSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCiAKIHN0cnVjdCBBIHsKICAgY29uc3RleHByIEEoaW50IHgpIDogeCh4KSB7fQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktZGVmYXVsdC1jYy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1kZWZhdWx0LWNjLmNwcAppbmRleCBkN2ZiYTk5Li5lM2NhMzkyIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1kZWZhdWx0LWNjLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1kZWZhdWx0LWNjLmNwcApAQCAtMSw1ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBHQ0FCSSAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtRE1TX0FCSSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggTVNBQkkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGkzODYtcGMtbGludXggLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggR0NBQkkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLURNU19BQkkgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggTVNBQkkgJXMKIAogI2lmZGVmIE1TX0FCSQogIyBkZWZpbmUgTUVUSE9EX0NDIF9fdGhpc2NhbGwKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLWV4Y2VwdGlvbnMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktZXhjZXB0aW9ucy5jcHAKaW5kZXggNzc1N2VhMC4uNjBhMzUxNCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktZXhjZXB0aW9ucy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktZXhjZXB0aW9ucy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiAtbWNvbnN0cnVjdG9yLWFsaWFzZXMgLWN4eC1hYmkgbWljcm9zb2Z0IC1mZXhjZXB0aW9ucyAtZm5vLXJ0dGkgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBXSU4zMiAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPWkzODYtcGMtd2luMzIgLW1jb25zdHJ1Y3Rvci1hbGlhc2VzIC1mZXhjZXB0aW9ucyAtZm5vLXJ0dGkgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBXSU4zMiAlcwogCiBzdHJ1Y3QgQSB7CiAgIEEoKTsKQEAgLTE0LDE3ICsxNCwyMSBAQAogfQogCiAvLyBXaXRoIGV4Y2VwdGlvbnMsIHdlIG5lZWQgdG8gY2xlYW4gdXAgYXQgbGVhc3Qgb25lIG9mIHRoZXNlIHRlbXBvcmFyaWVzLgotLy8gV0lOMzI6IGRlZmluZSB2b2lkIEAiXDAxP0hhc0VIQ2xlYW51cEBAWUFYWFoiKCkge3suKn19IHsKLS8vICAgIEZpcnN0IG9uZSBkb2Vzbid0IGhhdmUgYW55IGNsZWFudXBzLCBubyBuZWVkIGZvciBpbnZva2UuCi0vLyBXSU4zMjogICBjYWxsIHZvaWQgQCJcMDE/Z2V0QUBAWUE/QVVBQEBYWiIoJXN0cnVjdC5BKiBzcmV0ICV7ey4qfX0pCisvLyBXSU4zMi1MQUJFTDogZGVmaW5lIHZvaWQgQCJcMDE/SGFzRUhDbGVhbnVwQEBZQVhYWiIoKSB7ey4qfX0geworLy8gV0lOMzI6ICAgJVtbYmFzZTouKl1dID0gY2FsbCBpOCogQGxsdm0uc3RhY2tzYXZlKCkKKy8vICAgIElmIHRoaXMgY2FsbCB0aHJvd3MsIHdlIGhhdmUgdG8gcmVzdG9yZSB0aGUgc3RhY2suCisvLyBXSU4zMjogICBpbnZva2Ugdm9pZCBAIlwwMT9nZXRBQEBZQT9BVUFAQFhaIiglc3RydWN0LkEqIHNyZXQgJXt7Lip9fSkKIC8vICAgIElmIHRoaXMgY2FsbCB0aHJvd3MsIHdlIGhhdmUgdG8gY2xlYW51cCB0aGUgZmlyc3QgdGVtcG9yYXJ5LgogLy8gV0lOMzI6ICAgaW52b2tlIHZvaWQgQCJcMDE/Z2V0QUBAWUE/QVVBQEBYWiIoJXN0cnVjdC5BKiBzcmV0ICV7ey4qfX0pCi0vLyAgICBJZiB0aGlzIGNhbGwgdGhyb3dzLCB3ZSBhbHJlYWR5IHBvcHBlZCBvdXIgY2xlYW51cHMKLS8vIFdJTjMyOiAgIGNhbGwgaTMyIEAiXDAxP1Rha2VzVHdvQEBZQUhVQUBAMEBaIgorLy8gICAgSWYgdGhpcyBjYWxsIHRocm93cywgd2UgaGF2ZSB0byBjbGVhbnVwIHRoZSBzdGFja3NhdmUuCisvLyBXSU4zMjogICBpbnZva2UgaTMyIEAiXDAxP1Rha2VzVHdvQEBZQUhVQUBAMEBaIgorLy8gV0lOMzI6ICAgY2FsbCB2b2lkIEBsbHZtLnN0YWNrcmVzdG9yZShpOCogJVtbYmFzZV1dKQogLy8gV0lOMzI6ICAgcmV0IHZvaWQKIC8vCiAvLyAgICBUaGVyZSBzaG91bGQgYmUgb25lIGR0b3IgY2FsbCBmb3IgdW53aW5kaW5nIGZyb20gdGhlIHNlY29uZCBnZXRBLgogLy8gV0lOMzI6ICAgaW52b2tlIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzFBQEBRQUVAWFoiCisvLyBXSU4zMi1OT1Q6IEAiXDAxPz8xQUBAUUFFQFhaIgorLy8gV0lOMzI6ICAgY2FsbCB2b2lkIEBsbHZtLnN0YWNrcmVzdG9yZQogLy8gV0lOMzI6IH0KIAogdm9pZCBUYWtlUmVmKGNvbnN0IEEgJmEpOwpAQCAtMzIsMjAgKzM2LDI4IEBACiAgIHJldHVybiBUYWtlc1R3bygoVGFrZVJlZihBKCkpLCBBKCkpLCAoVGFrZVJlZihBKCkpLCBBKCkpKTsKIH0KIAotLy8gV0lOMzI6IGRlZmluZSBpMzIgQCJcMDE/SGFzRGVhY3RpdmF0ZWRDbGVhbnVwc0BAWUFIWFoiKCkge3suKn19IHsKKy8vIFdJTjMyLUxBQkVMOiBkZWZpbmUgaTMyIEAiXDAxP0hhc0RlYWN0aXZhdGVkQ2xlYW51cHNAQFlBSFhaIigpIHt7Lip9fSB7CiAvLyBXSU4zMjogICAlW1tpc2FjdGl2ZTouKl1dID0gYWxsb2NhIGkxCi0vLyBXSU4zMjogICBjYWxsIHg4Nl90aGlzY2FsbGNjICVzdHJ1Y3QuQSogQCJcMDE/PzBBQEBRQUVAWFoiCisvLyBXSU4zMjogICBjYWxsIGk4KiBAbGx2bS5zdGFja3NhdmUoKQorLy8gV0lOMzI6ICAgJVtbYXJnbWVtOi4qXV0gPSBhbGxvY2EgaW5hbGxvY2EgW1thcmdtZW1fdHk6PHsgJXN0cnVjdC5BLCAlc3RydWN0LkEgfT5dXQorLy8gV0lOMzI6ICAgJVtbYXJnMTouKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBbW2FyZ21lbV90eV1dKiAlW1thcmdtZW1dXSwgaTMyIDAsIGkzMiAxCisvLyBXSU4zMjogICBpbnZva2UgeDg2X3RoaXNjYWxsY2MgJXN0cnVjdC5BKiBAIlwwMT8/MEFAQFFBRUBYWiIKIC8vIFdJTjMyOiAgIGludm9rZSB2b2lkIEAiXDAxP1Rha2VSZWZAQFlBWEFCVUFAQEBaIgotLy8gV0lOMzI6ICAgaW52b2tlIHg4Nl90aGlzY2FsbGNjICVzdHJ1Y3QuQSogQCJcMDE/PzBBQEBRQUVAWFoiKCVzdHJ1Y3QuQSogJVtbYXJnMTouKl1dKQorLy8KKy8vIFdJTjMyOiAgIGludm9rZSB4ODZfdGhpc2NhbGxjYyAlc3RydWN0LkEqIEAiXDAxPz8wQUBAUUFFQFhaIiglc3RydWN0LkEqICVbW2FyZzFdXSkKIC8vIFdJTjMyOiAgIHN0b3JlIGkxIHRydWUsIGkxKiAlW1tpc2FjdGl2ZV1dCisvLworLy8gV0lOMzI6ICAgJVtbYXJnMDouKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBbW2FyZ21lbV90eV1dKiAlW1thcmdtZW1dXSwgaTMyIDAsIGkzMiAwCiAvLyBXSU4zMjogICBpbnZva2UgeDg2X3RoaXNjYWxsY2MgJXN0cnVjdC5BKiBAIlwwMT8/MEFAQFFBRUBYWiIKIC8vIFdJTjMyOiAgIGludm9rZSB2b2lkIEAiXDAxP1Rha2VSZWZAQFlBWEFCVUFAQEBaIgogLy8gV0lOMzI6ICAgaW52b2tlIHg4Nl90aGlzY2FsbGNjICVzdHJ1Y3QuQSogQCJcMDE/PzBBQEBRQUVAWFoiCiAvLyBXSU4zMjogICBzdG9yZSBpMSBmYWxzZSwgaTEqICVbW2lzYWN0aXZlXV0KLS8vIFdJTjMyOiAgIGludm9rZSBpMzIgQCJcMDE/VGFrZXNUd29AQFlBSFVBQEAwQFoiCisvLworLy8gV0lOMzI6ICAgaW52b2tlIGkzMiBAIlwwMT9UYWtlc1R3b0BAWUFIVUFAQDBAWiIoW1thcmdtZW1fdHldXSogaW5hbGxvY2EgJVtbYXJnbWVtXV0pCisvLyBXSU4zMjogICBjYWxsIHZvaWQgQGxsdm0uc3RhY2tyZXN0b3JlCiAvLyAgICAgICAgRGVzdHJveSB0aGUgdHdvIGNvbnN0IHJlZiB0ZW1wb3Jhcmllcy4KIC8vIFdJTjMyOiAgIGludm9rZSB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxPz8xQUBAUUFFQFhaIgotLy8gV0lOMzI6ICAgY2FsbCB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxPz8xQUBAUUFFQFhaIgorLy8gV0lOMzI6ICAgaW52b2tlIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzFBQEBRQUVAWFoiCiAvLyBXSU4zMjogICByZXQgaTMyCiAvLwogLy8gICAgICAgIENvbmRpdGlvbmFsbHkgZGVzdHJveSBhcmcxLgpAQCAtNjAsMjAgKzcyLDIyIEBACiAgIHJldHVybiAoY29uZCA/IFRha2VzVHdvKEEoKSwgQSgpKSA6IENvdWxkVGhyb3coKSk7CiB9CiAKLS8vIFdJTjMyOiBkZWZpbmUgaTMyIEAiXDAxP0hhc0NvbmRpdGlvbmFsQ2xlYW51cEBAWUFIX05AWiIoaTEgemVyb2V4dCAle3suKn19KSB7ey4qfX0geworLy8gV0lOMzItTEFCRUw6IGRlZmluZSBpMzIgQCJcMDE/SGFzQ29uZGl0aW9uYWxDbGVhbnVwQEBZQUhfTkBaIihpMSB6ZXJvZXh0ICV7ey4qfX0pIHt7Lip9fSB7CiAvLyBXSU4zMjogICBzdG9yZSBpMSBmYWxzZQogLy8gV0lOMzI6ICAgYnIgaTEKLS8vICAgICAgICBObyBjbGVhbnVwcywgc28gd2UgY2FsbCBhbmQgdGhlbiBhY3RpdmF0ZSBhIGNsZWFudXAgaWYgaXQgc3VjY2VlZHMuCi0vLyBXSU4zMjogICBjYWxsIHg4Nl90aGlzY2FsbGNjICVzdHJ1Y3QuQSogQCJcMDE/PzBBQEBRQUVAWFoiKCVzdHJ1Y3QuQSogJVtbYXJnMTouKl1dKQotLy8gV0lOMzI6ICAgc3RvcmUgaTEgdHJ1ZQotLy8gICAgICAgIE5vdyB3ZSBoYXZlIGEgY2xlYW51cCBmb3IgdGhlIGZpcnN0IGFnZ3JlZ2F0ZSwgc28gd2UgaW52b2tlLgorLy8gV0lOMzI6ICAgY2FsbCBpOCogQGxsdm0uc3RhY2tzYXZlKCkKIC8vIFdJTjMyOiAgIGludm9rZSB4ODZfdGhpc2NhbGxjYyAlc3RydWN0LkEqIEAiXDAxPz8wQUBAUUFFQFhaIiglc3RydWN0LkEqICV7ey4qfX0pCi0vLyAgICAgICAgTm93IHdlIGhhdmUgbm8gY2xlYW51cHMgYmVjYXVzZSBUYWtlVHdvIHdpbGwgZGVzdHJ1Y3QgYm90aCBhcmdzLgotLy8gV0lOMzI6ICAgY2FsbCBpMzIgQCJcMDE/VGFrZXNUd29AQFlBSFVBQEAwQFoiCi0vLyAgICAgICAgU3RpbGwgbm8gY2xlYW51cHMsIHNvIGNhbGwuCisvLyBXSU4zMjogICBzdG9yZSBpMSB0cnVlCisvLyBXSU4zMjogICBpbnZva2UgeDg2X3RoaXNjYWxsY2MgJXN0cnVjdC5BKiBAIlwwMT8/MEFAQFFBRUBYWiIoJXN0cnVjdC5BKiAle3suKn19KQorLy8gV0lOMzI6ICAgaW52b2tlIGkzMiBAIlwwMT9UYWtlc1R3b0BAWUFIVUFAQDBAWiIKKy8vIFdJTjMyOiAgIGNhbGwgdm9pZCBAbGx2bS5zdGFja3Jlc3RvcmUKKy8vCiAvLyBXSU4zMjogICBjYWxsIGkzMiBAIlwwMT9Db3VsZFRocm93QEBZQUhYWiIoKQotLy8gICAgICAgIFNvbWV3aGVyZSBpbiB0aGUgbGFuZGluZyBwYWQgZm9yIG91ciBzaW5nbGUgaW52b2tlLCBjYWxsIHRoZSBkdG9yLgotLy8gV0lOMzI6ICAgaW52b2tlIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzFBQEBRQUVAWFoiKCVzdHJ1Y3QuQSogJVtbYXJnMV1dKQorLy8KKy8vICAgICAgICBPbmx5IG9uZSBkdG9yIGluIHRoZSBpbnZva2UgZm9yIGFyZzEKKy8vIFdJTjMyOiAgIGludm9rZSB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxPz8xQUBAUUFFQFhaIih7ey4qfX0pCisvLyBXSU4zMi1OT1Q6IGludm9rZSB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxPz8xQUBAUUFFQFhaIgorLy8gV0lOMzI6ICAgY2FsbCB2b2lkIEBsbHZtLnN0YWNrcmVzdG9yZQogLy8gV0lOMzI6IH0KIAogLy8gTm93IHRlc3QgYm90aC4KQEAgLTgxLDggKzk1LDcgQEAKICAgcmV0dXJuIChjb25kID8gVGFrZXNUd28oKFRha2VSZWYoQSgpKSwgQSgpKSwgKFRha2VSZWYoQSgpKSwgQSgpKSkgOiBDb3VsZFRocm93KCkpOwogfQogCi0vLyBXSU4zMjogZGVmaW5lIGkzMiBAIlwwMT9IYXNDb25kaXRpb25hbERlYWN0aXZhdGVkQ2xlYW51cHNAQFlBSF9OQFoie3suKn19IHsKLS8vIFdJTjMyOiAgICVbW2FyZzE6LipdXSA9IGFsbG9jYSAlc3RydWN0LkEsIGFsaWduIDQKKy8vIFdJTjMyLUxBQkVMOiBkZWZpbmUgaTMyIEAiXDAxP0hhc0NvbmRpdGlvbmFsRGVhY3RpdmF0ZWRDbGVhbnVwc0BAWUFIX05AWiJ7ey4qfX0gewogLy8gV0lOMzI6ICAgYWxsb2NhIGkxCiAvLyBXSU4zMjogICAlW1thcmcxX2NvbmQ6LipdXSA9IGFsbG9jYSBpMQogLy8gICAgICAgIFN0YXJ0IGFsbCBmb3VyIGNsZWFudXBzIGFzIGRlYWN0aXZhdGVkLgpAQCAtOTIsMTAgKzEwNSwxMCBAQAogLy8gV0lOMzI6ICAgc3RvcmUgaTEgZmFsc2UKIC8vIFdJTjMyOiAgIGJyIGkxCiAvLyAgICAgICAgVHJ1ZSBjb25kaXRpb24uCi0vLyBXSU4zMjogICBjYWxsIHg4Nl90aGlzY2FsbGNjICVzdHJ1Y3QuQSogQCJcMDE/PzBBQEBRQUVAWFoiCisvLyBXSU4zMjogICBpbnZva2UgeDg2X3RoaXNjYWxsY2MgJXN0cnVjdC5BKiBAIlwwMT8/MEFAQFFBRUBYWiIKIC8vIFdJTjMyOiAgIHN0b3JlIGkxIHRydWUKIC8vIFdJTjMyOiAgIGludm9rZSB2b2lkIEAiXDAxP1Rha2VSZWZAQFlBWEFCVUFAQEBaIgotLy8gV0lOMzI6ICAgaW52b2tlIHg4Nl90aGlzY2FsbGNjICVzdHJ1Y3QuQSogQCJcMDE/PzBBQEBRQUVAWFoiKCVzdHJ1Y3QuQSogJVtbYXJnMV1dKQorLy8gV0lOMzI6ICAgaW52b2tlIHg4Nl90aGlzY2FsbGNjICVzdHJ1Y3QuQSogQCJcMDE/PzBBQEBRQUVAWFoiCiAvLyBXSU4zMjogICBzdG9yZSBpMSB0cnVlLCBpMSogJVtbYXJnMV9jb25kXV0KIC8vIFdJTjMyOiAgIGludm9rZSB4ODZfdGhpc2NhbGxjYyAlc3RydWN0LkEqIEAiXDAxPz8wQUBAUUFFQFhaIgogLy8gV0lOMzI6ICAgc3RvcmUgaTEgdHJ1ZQpAQCAtMTA4LDEzICsxMjEsMTMgQEAKIC8vIFdJTjMyOiAgIGludm9rZSBpMzIgQCJcMDE/Q291bGRUaHJvd0BAWUFIWFoiKCkKIC8vICAgICAgICBUd28gbm9ybWFsIGNsZWFudXBzIGZvciBUYWtlUmVmIGFyZ3MuCiAvLyBXSU4zMjogICBpbnZva2UgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUFAQFFBRUBYWiIKLS8vIFdJTjMyOiAgIGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUFAQFFBRUBYWiIKKy8vIFdJTjMyOiAgIGludm9rZSB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxPz8xQUBAUUFFQFhaIgogLy8gV0lOMzI6ICAgcmV0IGkzMgogLy8KIC8vICAgICAgICBTb21ld2hlcmUgaW4gdGhlIGxhbmRpbmcgcGFkIHNvdXAsIHdlIGNvbmRpdGlvbmFsbHkgZGVzdHJveSBhcmcxLgogLy8gV0lOMzI6ICAgJVtbaXNhY3RpdmU6LipdXSA9IGxvYWQgaTEqICVbW2FyZzFfY29uZF1dCiAvLyBXSU4zMjogICBiciBpMSAlW1tpc2FjdGl2ZV1dCi0vLyBXSU4zMjogICBpbnZva2UgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUFAQFFBRUBYWiIoJXN0cnVjdC5BKiAlW1thcmcxXV0pCisvLyBXSU4zMjogICBpbnZva2UgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUFAQFFBRUBYWiIKIC8vIFdJTjMyOiB9CiAKIG5hbWVzcGFjZSBjcmFzaF9vbl9wYXJ0aWFsX2Rlc3Ryb3kgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktbWVtYmVyLXBvaW50ZXJzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLW1lbWJlci1wb2ludGVycy5jcHAKaW5kZXggYzBkY2QzYy4uOGQ5YTg0OCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktbWVtYmVyLXBvaW50ZXJzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1tZW1iZXItcG9pbnRlcnMuY3BwCkBAIC0xLDcgKzEsMTAgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAlcyAtbyAtIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPWkzODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1ESU5DT01QTEVURV9WSVJUVUFMIC1mbXMtZXh0ZW5zaW9ucyAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPWkzODYtcGMtd2luMzIgLURJTkNPTVBMRVRFX1ZJUlRVQUwgLURNRU1GVU4gLWZtcy1leHRlbnNpb25zIC12ZXJpZnkKIC8vIEZJWE1FOiBUZXN0IHg4Nl82NCBtZW1iZXIgcG9pbnRlcnMgd2hlbiBjb2RlZ2VuIG5vIGxvbmdlciBhc3NlcnRzIG9uIHJlY29yZHMKIC8vIHdpdGggdmlydHVhbCBiYXNlcy4KIAorI2lmbmRlZiBJTkNPTVBMRVRFX1ZJUlRVQUwKIHN0cnVjdCBCMSB7CiAgIHZvaWQgZm9vKCk7CiAgIGludCBiOwpAQCAtNTYsMjAgKzU5LDIwIEBACiAvLyBDSEVDSzogQCJcMDE/cF9kX21lbXB0ckBAM1BRUG9seW1vcnBoaWNAQEhRMUAiID0gZ2xvYmFsIGkzMiAwLCBhbGlnbiA0CiAvLyBDSEVDSzogQCJcMDE/bV9kX21lbXB0ckBAM1BRTXVsdGlwbGVAQEhRMUAiID0gZ2xvYmFsIGkzMiAtMSwgYWxpZ24gNAogLy8gQ0hFQ0s6IEAiXDAxP3ZfZF9tZW1wdHJAQDNQUVZpcnR1YWxAQEhRMUAiID0gZ2xvYmFsIHsgaTMyLCBpMzIgfQotLy8gQ0hFQ0s6ICAgeyBpMzIgMCwgaTMyIC0xIH0sIGFsaWduIDQKKy8vIENIRUNLOiAgIHsgaTMyIDAsIGkzMiAtMSB9LCBhbGlnbiA4CiAvLyBDSEVDSzogQCJcMDE/bl9kX21lbXB0ckBAM1BRTm9uWmVyb1ZCUHRyQEBIUTFAIiA9IGdsb2JhbCB7IGkzMiwgaTMyIH0KLS8vIENIRUNLOiAgIHsgaTMyIDAsIGkzMiAtMSB9LCBhbGlnbiA0CisvLyBDSEVDSzogICB7IGkzMiAwLCBpMzIgLTEgfSwgYWxpZ24gOAogLy8gQ0hFQ0s6IEAiXDAxP3VfZF9tZW1wdHJAQDNQUVVuc3BlY2lmaWVkQEBIUTFAIiA9IGdsb2JhbCB7IGkzMiwgaTMyLCBpMzIgfQotLy8gQ0hFQ0s6ICAgeyBpMzIgMCwgaTMyIDAsIGkzMiAtMSB9LCBhbGlnbiA0CisvLyBDSEVDSzogICB7IGkzMiAwLCBpMzIgMCwgaTMyIC0xIH0sIGFsaWduIDgKIC8vIENIRUNLOiBAIlwwMT91c19kX21lbXB0ckBAM1BRVW5zcGVjU2luZ2xlQEBIUTFAIiA9IGdsb2JhbCB7IGkzMiwgaTMyLCBpMzIgfQotLy8gQ0hFQ0s6ICAgeyBpMzIgMCwgaTMyIDAsIGkzMiAtMSB9LCBhbGlnbiA0CisvLyBDSEVDSzogICB7IGkzMiAwLCBpMzIgMCwgaTMyIC0xIH0sIGFsaWduIDgKIAogdm9pZCAoU2luZ2xlICA6OipzX2ZfbWVtcHRyKSgpOwogdm9pZCAoTXVsdGlwbGU6OiptX2ZfbWVtcHRyKSgpOwogdm9pZCAoVmlydHVhbCA6Oip2X2ZfbWVtcHRyKSgpOwogLy8gQ0hFQ0s6IEAiXDAxP3NfZl9tZW1wdHJAQDNQOFNpbmdsZUBAQUVYWFpRMUAiID0gZ2xvYmFsIGk4KiBudWxsLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDE/bV9mX21lbXB0ckBAM1A4TXVsdGlwbGVAQEFFWFhaUTFAIiA9IGdsb2JhbCB7IGk4KiwgaTMyIH0gemVyb2luaXRpYWxpemVyLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDE/dl9mX21lbXB0ckBAM1A4VmlydHVhbEBAQUVYWFpRMUAiID0gZ2xvYmFsIHsgaTgqLCBpMzIsIGkzMiB9IHplcm9pbml0aWFsaXplciwgYWxpZ24gNAorLy8gQ0hFQ0s6IEAiXDAxP21fZl9tZW1wdHJAQDNQOE11bHRpcGxlQEBBRVhYWlExQCIgPSBnbG9iYWwgeyBpOCosIGkzMiB9IHplcm9pbml0aWFsaXplciwgYWxpZ24gOAorLy8gQ0hFQ0s6IEAiXDAxP3ZfZl9tZW1wdHJAQDNQOFZpcnR1YWxAQEFFWFhaUTFAIiA9IGdsb2JhbCB7IGk4KiwgaTMyLCBpMzIgfSB6ZXJvaW5pdGlhbGl6ZXIsIGFsaWduIDgKIAogLy8gV2UgY2FuIGRlZmluZSBVbnNwZWNpZmllZCBhZnRlciBsb2NraW5nIGluIHRoZSBpbmhlcml0YW5jZSBtb2RlbC4KIHN0cnVjdCBVbnNwZWNpZmllZCA6IE11bHRpcGxlLCBWaXJ0dWFsIHsKQEAgLTkxLDEzICs5NCwxMyBAQAogLy8gQ0hFQ0s6IEAiXDAxP3NfZl9tcEBDb25zdEBAM1A4U2luZ2xlQEBBRVhYWlEyQCIgPQogLy8gQ0hFQ0s6ICAgZ2xvYmFsIGk4KiBiaXRjYXN0ICh7ey4qfX0gQCJcMDE/Zm9vQFNpbmdsZUBAUUFFWFhaIiB0byBpOCopLCBhbGlnbiA0CiAvLyBDSEVDSzogQCJcMDE/bV9mX21wQENvbnN0QEAzUDhNdWx0aXBsZUBAQUVYWFpRMkAiID0KLS8vIENIRUNLOiAgIGdsb2JhbCB7IGk4KiwgaTMyIH0geyBpOCogYml0Y2FzdCAoe3suKn19IEAiXDAxP2Zvb0BCMkBAUUFFWFhaIiB0byBpOCopLCBpMzIgNCB9LCBhbGlnbiA0CisvLyBDSEVDSzogICBnbG9iYWwgeyBpOCosIGkzMiB9IHsgaTgqIGJpdGNhc3QgKHt7Lip9fSBAIlwwMT9mb29AQjJAQFFBRVhYWiIgdG8gaTgqKSwgaTMyIDQgfSwgYWxpZ24gOAogLy8gQ0hFQ0s6IEAiXDAxP3ZfZl9tcEBDb25zdEBAM1A4VmlydHVhbEBAQUVYWFpRMkAiID0KLS8vIENIRUNLOiAgIGdsb2JhbCB7IGk4KiwgaTMyLCBpMzIgfSB7IGk4KiBiaXRjYXN0ICh7ey4qfX0gQCJcMDE/Zm9vQFZpcnR1YWxAQFFBRVhYWiIgdG8gaTgqKSwgaTMyIDAsIGkzMiAwIH0sIGFsaWduIDQKKy8vIENIRUNLOiAgIGdsb2JhbCB7IGk4KiwgaTMyLCBpMzIgfSB7IGk4KiBiaXRjYXN0ICh7ey4qfX0gQCJcMDE/Zm9vQFZpcnR1YWxAQFFBRVhYWiIgdG8gaTgqKSwgaTMyIDAsIGkzMiAwIH0sIGFsaWduIDgKIC8vIENIRUNLOiBAIlwwMT91X2ZfbXBAQ29uc3RAQDNQOFVuc3BlY2lmaWVkQEBBRVhYWlEyQCIgPQotLy8gQ0hFQ0s6ICAgZ2xvYmFsIHsgaTgqLCBpMzIsIGkzMiwgaTMyIH0geyBpOCogYml0Y2FzdCAoe3suKn19IEAiXDAxP2Zvb0BVbnNwZWNpZmllZEBAUUFFWFhaIiB0byBpOCopLCBpMzIgMCwgaTMyIDEyLCBpMzIgMCB9LCBhbGlnbiA0CisvLyBDSEVDSzogICBnbG9iYWwgeyBpOCosIGkzMiwgaTMyLCBpMzIgfSB7IGk4KiBiaXRjYXN0ICh7ey4qfX0gQCJcMDE/Zm9vQFVuc3BlY2lmaWVkQEBRQUVYWFoiIHRvIGk4KiksIGkzMiAwLCBpMzIgMTIsIGkzMiAwIH0sIGFsaWduIDgKIC8vIENIRUNLOiBAIlwwMT91c19mX21wQENvbnN0QEAzUDhVbnNwZWNTaW5nbGVAQEFFWFhaUTJAIiA9Ci0vLyBDSEVDSzogICBnbG9iYWwgeyBpOCosIGkzMiwgaTMyLCBpMzIgfSB7IGk4KiBiaXRjYXN0ICh7ey4qfX0gQCJcMDE/Zm9vQFVuc3BlY1NpbmdsZUBAUUFFWFhaIiB0byBpOCopLCBpMzIgMCwgaTMyIDAsIGkzMiAwIH0sIGFsaWduIDQKKy8vIENIRUNLOiAgIGdsb2JhbCB7IGk4KiwgaTMyLCBpMzIsIGkzMiB9IHsgaTgqIGJpdGNhc3QgKHt7Lip9fSBAIlwwMT9mb29AVW5zcGVjU2luZ2xlQEBRQUVYWFoiIHRvIGk4KiksIGkzMiAwLCBpMzIgMCwgaTMyIDAgfSwgYWxpZ24gOAogfQogCiBuYW1lc3BhY2UgQ2FzdFBhcmFtIHsKQEAgLTExOSwxMSArMTIyLDExIEBACiAvLyBUcnkgYSByZWludGVycHJldF9jYXN0IGZvbGxvd2VkIGJ5IGEgbWVtcHRyIGNvbnZlcnNpb24uCiB2b2lkIChDOjoqcHRyMikodm9pZCAqKSA9ICh2b2lkIChDOjoqKSh2b2lkICopKSAodm9pZCAoQTo6Kikodm9pZCAqKSkgJkE6OmZvbzsKIC8vIENIRUNLOiBAIlwwMT9wdHIyQENhc3RQYXJhbUBAM1A4Q0AxQEFFWFBBWEBaUTIxQCIgPQotLy8gQ0hFQ0s6ICAgZ2xvYmFsIHsgaTgqLCBpMzIgfSB7IGk4KiBiaXRjYXN0ICh2b2lkICh7ey4qfX0pKiBAIlwwMT9mb29AQUBDYXN0UGFyYW1AQFFBRVhQQVUxMkBAWiIgdG8gaTgqKSwgaTMyIDQgfSwgYWxpZ24gNAorLy8gQ0hFQ0s6ICAgZ2xvYmFsIHsgaTgqLCBpMzIgfSB7IGk4KiBiaXRjYXN0ICh2b2lkICh7ey4qfX0pKiBAIlwwMT9mb29AQUBDYXN0UGFyYW1AQFFBRVhQQVUxMkBAWiIgdG8gaTgqKSwgaTMyIDQgfSwgYWxpZ24gOAogCiB2b2lkIChDOjoqcHRyMykodm9pZCAqKSA9ICh2b2lkIChDOjoqKSh2b2lkICopKSAodm9pZCAoQTo6Kikodm9pZCAqKSkgKHZvaWQgKEE6OiopKEEgKikpIDA7CiAvLyBDSEVDSzogQCJcMDE/cHRyM0BDYXN0UGFyYW1AQDNQOENAMUBBRVhQQVhAWlEyMUAiID0KLS8vIENIRUNLOiAgIGdsb2JhbCB7IGk4KiwgaTMyIH0gemVyb2luaXRpYWxpemVyLCBhbGlnbiA0CisvLyBDSEVDSzogICBnbG9iYWwgeyBpOCosIGkzMiB9IHplcm9pbml0aWFsaXplciwgYWxpZ24gOAogCiBzdHJ1Y3QgRCA6IEMgewogICB2aXJ0dWFsIHZvaWQgaXNQb2x5bW9ycGhpYygpOwpAQCAtMTU2LDIzICsxNTksMjMgQEAKICAgdm9pZCAoVW5zcGVjV2l0aFZCUHRyOjoqdTJfZl9tZW1wdHIpKCkgPSAmVW5zcGVjV2l0aFZCUHRyOjpmb287CiAvLyBDSEVDSzogZGVmaW5lIHZvaWQgQCJcMDE/RW1pdE5vblZpcnR1YWxNZW1iZXJQb2ludGVyc0BAWUFYWFoiKCkge3suKn19IHsKIC8vIENIRUNLOiAgIGFsbG9jYSBpOCosIGFsaWduIDQKLS8vIENIRUNLOiAgIGFsbG9jYSB7IGk4KiwgaTMyIH0sIGFsaWduIDQKLS8vIENIRUNLOiAgIGFsbG9jYSB7IGk4KiwgaTMyLCBpMzIgfSwgYWxpZ24gNAotLy8gQ0hFQ0s6ICAgYWxsb2NhIHsgaTgqLCBpMzIsIGkzMiwgaTMyIH0sIGFsaWduIDQKKy8vIENIRUNLOiAgIGFsbG9jYSB7IGk4KiwgaTMyIH0sIGFsaWduIDgKKy8vIENIRUNLOiAgIGFsbG9jYSB7IGk4KiwgaTMyLCBpMzIgfSwgYWxpZ24gOAorLy8gQ0hFQ0s6ICAgYWxsb2NhIHsgaTgqLCBpMzIsIGkzMiwgaTMyIH0sIGFsaWduIDgKIC8vIENIRUNLOiAgIHN0b3JlIGk4KiBiaXRjYXN0ICh2b2lkICgle3suKn19KikqIEAiXDAxP2Zvb0BTaW5nbGVAQFFBRVhYWiIgdG8gaTgqKSwgaTgqKiAle3suKn19LCBhbGlnbiA0CiAvLyBDSEVDSzogICBzdG9yZSB7IGk4KiwgaTMyIH0KIC8vIENIRUNLOiAgICAgeyBpOCogYml0Y2FzdCAodm9pZCAoJXt7Lip9fSopKiBAIlwwMT9mb29ATXVsdGlwbGVAQFFBRVhYWiIgdG8gaTgqKSwgaTMyIDAgfSwKLS8vIENIRUNLOiAgICAgeyBpOCosIGkzMiB9KiAle3suKn19LCBhbGlnbiA0CisvLyBDSEVDSzogICAgIHsgaTgqLCBpMzIgfSogJXt7Lip9fSwgYWxpZ24gOAogLy8gQ0hFQ0s6ICAgc3RvcmUgeyBpOCosIGkzMiwgaTMyIH0KIC8vIENIRUNLOiAgICAgeyBpOCogYml0Y2FzdCAodm9pZCAoJXt7Lip9fSopKiBAIlwwMT9mb29AVmlydHVhbEBAUUFFWFhaIiB0byBpOCopLCBpMzIgMCwgaTMyIDAgfSwKLS8vIENIRUNLOiAgICAgeyBpOCosIGkzMiwgaTMyIH0qICV7ey4qfX0sIGFsaWduIDQKKy8vIENIRUNLOiAgICAgeyBpOCosIGkzMiwgaTMyIH0qICV7ey4qfX0sIGFsaWduIDgKIC8vIENIRUNLOiAgIHN0b3JlIHsgaTgqLCBpMzIsIGkzMiwgaTMyIH0KIC8vIENIRUNLOiAgICAgeyBpOCogYml0Y2FzdCAodm9pZCAoJXt7Lip9fSopKiBAIlwwMT9mb29AVW5zcGVjaWZpZWRAQFFBRVhYWiIgdG8gaTgqKSwgaTMyIDAsIGkzMiAxMiwgaTMyIDAgfSwKLS8vIENIRUNLOiAgICAgeyBpOCosIGkzMiwgaTMyLCBpMzIgfSogJXt7Lip9fSwgYWxpZ24gNAorLy8gQ0hFQ0s6ICAgICB7IGk4KiwgaTMyLCBpMzIsIGkzMiB9KiAle3suKn19LCBhbGlnbiA4CiAvLyBDSEVDSzogICBzdG9yZSB7IGk4KiwgaTMyLCBpMzIsIGkzMiB9CiAvLyBDSEVDSzogICAgIHsgaTgqIGJpdGNhc3QgKHZvaWQgKCV7ey4qfX0qKSogQCJcMDE/Zm9vQFVuc3BlY1dpdGhWQlB0ckBAUUFFWFhaIiB0byBpOCopLAogLy8gQ0hFQ0s6ICAgICAgIGkzMiAwLCBpMzIgNCwgaTMyIDAgfSwKLS8vIENIRUNLOiAgICAgeyBpOCosIGkzMiwgaTMyLCBpMzIgfSogJXt7Lip9fSwgYWxpZ24gNAorLy8gQ0hFQ0s6ICAgICB7IGk4KiwgaTMyLCBpMzIsIGkzMiB9KiAle3suKn19LCBhbGlnbiA4CiAvLyBDSEVDSzogICByZXQgdm9pZAogLy8gQ0hFQ0s6IH0KIH0KQEAgLTIxOSw5ICsyMjIsOSBAQAogYm9vbCBudWxsVGVzdERhdGFVbnNwZWNpZmllZChpbnQgVW5zcGVjaWZpZWQ6OiptcCkgewogICByZXR1cm4gbXA7CiAvLyBDSEVDSzogZGVmaW5lIHplcm9leHQgaTEgQCJcMDE/bnVsbFRlc3REYXRhVW5zcGVjaWZpZWRAQFlBX05QUVVuc3BlY2lmaWVkQEBIQFoie3suKn19IHsKLS8vIENIRUNLOiAgICV7ey4qfX0gPSBsb2FkIHsgaTMyLCBpMzIsIGkzMiB9KiAle3suKn19LCBhbGlnbiA0Ci0vLyBDSEVDSzogICBzdG9yZSB7IGkzMiwgaTMyLCBpMzIgfSB7ey4qfX0gYWxpZ24gNAotLy8gQ0hFQ0s6ICAgJVtbbXA6LipdXSA9IGxvYWQgeyBpMzIsIGkzMiwgaTMyIH0qICV7ey4qfX0sIGFsaWduIDQKKy8vIENIRUNLOiAgICV7ey4qfX0gPSBsb2FkIHsgaTMyLCBpMzIsIGkzMiB9KiAle3suKn19LCBhbGlnbiA4CisvLyBDSEVDSzogICBzdG9yZSB7IGkzMiwgaTMyLCBpMzIgfSB7ey4qfX0gYWxpZ24gOAorLy8gQ0hFQ0s6ICAgJVtbbXA6LipdXSA9IGxvYWQgeyBpMzIsIGkzMiwgaTMyIH0qICV7ey4qfX0sIGFsaWduIDgKIC8vIENIRUNLOiAgICVbW21wMDouKl1dID0gZXh0cmFjdHZhbHVlIHsgaTMyLCBpMzIsIGkzMiB9ICVbW21wXV0sIDAKIC8vIENIRUNLOiAgICVbW2NtcDA6LipdXSA9IGljbXAgbmUgaTMyICVbW21wMF1dLCAwCiAvLyBDSEVDSzogICAlW1ttcDE6LipdXSA9IGV4dHJhY3R2YWx1ZSB7IGkzMiwgaTMyLCBpMzIgfSAlW1ttcF1dLCAxCkBAIC0yMzcsOSArMjQwLDkgQEAKIGJvb2wgbnVsbFRlc3RGdW5jdGlvblVuc3BlY2lmaWVkKHZvaWQgKFVuc3BlY2lmaWVkOjoqbXApKCkpIHsKICAgcmV0dXJuIG1wOwogLy8gQ0hFQ0s6IGRlZmluZSB6ZXJvZXh0IGkxIEAiXDAxP251bGxUZXN0RnVuY3Rpb25VbnNwZWNpZmllZEBAWUFfTlA4VW5zcGVjaWZpZWRAQEFFWFhaQFoie3suKn19IHsKLS8vIENIRUNLOiAgICV7ey4qfX0gPSBsb2FkIHsgaTgqLCBpMzIsIGkzMiwgaTMyIH0qICV7ey4qfX0sIGFsaWduIDQKLS8vIENIRUNLOiAgIHN0b3JlIHsgaTgqLCBpMzIsIGkzMiwgaTMyIH0ge3suKn19IGFsaWduIDQKLS8vIENIRUNLOiAgICVbW21wOi4qXV0gPSBsb2FkIHsgaTgqLCBpMzIsIGkzMiwgaTMyIH0qICV7ey4qfX0sIGFsaWduIDQKKy8vIENIRUNLOiAgICV7ey4qfX0gPSBsb2FkIHsgaTgqLCBpMzIsIGkzMiwgaTMyIH0qICV7ey4qfX0sIGFsaWduIDgKKy8vIENIRUNLOiAgIHN0b3JlIHsgaTgqLCBpMzIsIGkzMiwgaTMyIH0ge3suKn19IGFsaWduIDgKKy8vIENIRUNLOiAgICVbW21wOi4qXV0gPSBsb2FkIHsgaTgqLCBpMzIsIGkzMiwgaTMyIH0qICV7ey4qfX0sIGFsaWduIDgKIC8vIENIRUNLOiAgICVbW21wMDouKl1dID0gZXh0cmFjdHZhbHVlIHsgaTgqLCBpMzIsIGkzMiwgaTMyIH0gJVtbbXBdXSwgMAogLy8gQ0hFQ0s6ICAgJVtbY21wMDouKl1dID0gaWNtcCBuZSBpOCogJVtbbXAwXV0sIG51bGwKIC8vIENIRUNLOiAgIHJldCBpMSAlW1tjbXAwXV0KQEAgLTI1Miw3ICsyNTUsNyBAQAogLy8gZGF0YSBwb2ludGVyLgogLy8gQ0hFQ0s6IGRlZmluZSBpMzIgQCJcMDE/bG9hZERhdGFNZW1iZXJQb2ludGVyVmlydHVhbEBAWUFIUEFVVmlydHVhbEBAUFExQEhAWiJ7ey4qfX0gewogLy8gQ0hFQ0s6ICAgJVtbbzouKl1dID0gbG9hZCAle3suKn19KiogJXt7Lip9fSwgYWxpZ24gNAotLy8gQ0hFQ0s6ICAgJVtbbWVtcHRyOi4qXV0gPSBsb2FkIHsgaTMyLCBpMzIgfSogJXt7Lip9fSwgYWxpZ24gNAorLy8gQ0hFQ0s6ICAgJVtbbWVtcHRyOi4qXV0gPSBsb2FkIHsgaTMyLCBpMzIgfSogJXt7Lip9fSwgYWxpZ24gOAogLy8gQ0hFQ0s6ICAgJVtbbWVtcHRyMDouKl1dID0gZXh0cmFjdHZhbHVlIHsgaTMyLCBpMzIgfSAlW1ttZW1wdHI6LipdXSwgMAogLy8gQ0hFQ0s6ICAgJVtbbWVtcHRyMTouKl1dID0gZXh0cmFjdHZhbHVlIHsgaTMyLCBpMzIgfSAlW1ttZW1wdHI6LipdXSwgMQogLy8gQ0hFQ0s6ICAgJVtbdjY6LipdXSA9IGJpdGNhc3QgJXt7Lip9fSogJVtbb11dIHRvIGk4KgpAQCAtMjc2LDcgKzI3OSw3IEBACiAvLyBkYXRhIHBvaW50ZXIuCiAvLyBDSEVDSzogZGVmaW5lIGkzMiBAIlwwMT9sb2FkRGF0YU1lbWJlclBvaW50ZXJVbnNwZWNpZmllZEBAWUFIUEFVVW5zcGVjaWZpZWRAQFBRMUBIQFoie3suKn19IHsKIC8vIENIRUNLOiAgICVbW286LipdXSA9IGxvYWQgJXt7Lip9fSoqICV7ey4qfX0sIGFsaWduIDQKLS8vIENIRUNLOiAgICVbW21lbXB0cjouKl1dID0gbG9hZCB7IGkzMiwgaTMyLCBpMzIgfSogJXt7Lip9fSwgYWxpZ24gNAorLy8gQ0hFQ0s6ICAgJVtbbWVtcHRyOi4qXV0gPSBsb2FkIHsgaTMyLCBpMzIsIGkzMiB9KiAle3suKn19LCBhbGlnbiA4CiAvLyBDSEVDSzogICAlW1ttZW1wdHIwOi4qXV0gPSBleHRyYWN0dmFsdWUgeyBpMzIsIGkzMiwgaTMyIH0gJVtbbWVtcHRyOi4qXV0sIDAKIC8vIENIRUNLOiAgICVbW21lbXB0cjE6LipdXSA9IGV4dHJhY3R2YWx1ZSB7IGkzMiwgaTMyLCBpMzIgfSAlW1ttZW1wdHI6LipdXSwgMQogLy8gQ0hFQ0s6ICAgJVtbbWVtcHRyMjouKl1dID0gZXh0cmFjdHZhbHVlIHsgaTMyLCBpMzIsIGkzMiB9ICVbW21lbXB0cjouKl1dLCAyCkBAIC00NjIsNyArNDY1LDcgQEAKIC8vCiAvLyBDSEVDSzogZGVmaW5lIGkzMiBAIlwwMT9jb252ZXJ0TXVsdGlwbGVGdW5jVG9CMkBAWUFQOEIyQEBBRVhYWlA4TXVsdGlwbGVAQEFFWFhaQFoie3suKn19IHsKIC8vIENIRUNLOiAgIHN0b3JlCi0vLyBDSEVDSzogICAlW1tzcmM6LipdXSA9IGxvYWQgeyBpOCosIGkzMiB9KiAle3suKn19LCBhbGlnbiA0CisvLyBDSEVDSzogICAlW1tzcmM6LipdXSA9IGxvYWQgeyBpOCosIGkzMiB9KiAle3suKn19LCBhbGlnbiA4CiAvLyBDSEVDSzogICBleHRyYWN0dmFsdWUgeyBpOCosIGkzMiB9ICVbW3NyY11dLCAwCiAvLyBDSEVDSzogICBpY21wIG5lIGk4KiAle3suKn19LCBudWxsCiAvLyBDSEVDSzogICBiciBpMSAle3suKn19LCBsYWJlbCAle3suKn19LCBsYWJlbCAle3suKn19CkBAIC00ODcsNyArNDkwLDcgQEAKICAgcmV0dXJuIG1wOwogLy8gQ0hFQ0s6IGRlZmluZSB2b2lkIEAiXDAxP2NvbnZlcnRDVG9EQFRlc3QxQEBZQVA4REAxQEFFWFhaUDhDQDFAQUVYWFpAWiJ7ey4qfX0gewogLy8gQ0hFQ0s6ICAgc3RvcmUKLS8vIENIRUNLOiAgIGxvYWQgeyBpOCosIGkzMiwgaTMyIH0qICV7ey4qfX0sIGFsaWduIDQKKy8vIENIRUNLOiAgIGxvYWQgeyBpOCosIGkzMiwgaTMyIH0qICV7ey4qfX0sIGFsaWduIDgKIC8vIENIRUNLOiAgIGV4dHJhY3R2YWx1ZSB7IGk4KiwgaTMyLCBpMzIgfSAle3suKn19LCAwCiAvLyBDSEVDSzogICBpY21wIG5lIGk4KiAle3suKn19LCBudWxsCiAvLyBDSEVDSzogICBiciBpMSAle3suKn19LCBsYWJlbCAle3suKn19LCBsYWJlbCAle3suKn19CkBAIC01MzcsMyArNTQwLDU4IEBACiB9CiAKIH0KKworbmFtZXNwYWNlIFRlc3QzIHsKKy8vIE1ha2Ugc3VyZSB3ZSBjYXN0ICd0aGlzJyB0byBpOCogYmVmb3JlIHVzaW5nIEdFUC4KKworc3RydWN0IEEgeworICBpbnQgYTsKKyAgaW50IGI7Cit9OworCitpbnQgKmxvYWRfZGF0YShBICphLCBpbnQgQTo6Km1wKSB7CisgIHJldHVybiAmKGEtPiptcCk7CisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGkzMiogQCJcMDE/bG9hZF9kYXRhQFRlc3QzQEBZQVBBSFBBVUFAMUBQUTIxQEhAWiJ7ey4qfX0gIHsKKy8vIENIRUNLOiAgICAlW1thOi4qXV0gPSBsb2FkICUic3RydWN0LlRlc3QzOjpBIioqICV7ey4qfX0sIGFsaWduIDQKKy8vIENIRUNLOiAgICAlW1ttcDouKl1dID0gbG9hZCBpMzIqICV7ey4qfX0sIGFsaWduIDQKKy8vIENIRUNLOiAgICAlW1thX2k4Oi4qXV0gPSBiaXRjYXN0ICUic3RydWN0LlRlc3QzOjpBIiogJVtbYV1dIHRvIGk4KgorLy8gQ0hFQ0s6ICAgIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgaTgqICVbW2FfaThdXSwgaTMyICVbW21wXV0KKy8vIENIRUNLOiB9Cit9CisKK30KKworbmFtZXNwYWNlIFRlc3Q0IHsKKworc3RydWN0IEEgICAgICAgIHsgdmlydHVhbCB2b2lkIGYoKTsgfTsKK3N0cnVjdCBCICAgICAgICB7IHZpcnR1YWwgdm9pZCBnKCk7IH07CitzdHJ1Y3QgQyA6IEEsIEIgeyB2aXJ0dWFsIHZvaWQgZygpOyB9OworCit2b2lkIChDOjoqZ2V0bXAoKSkoKSB7CisgIHJldHVybiAmQzo6ZzsKK30KKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgaTY0IEAiXDAxP2dldG1wQFRlc3Q0QEBZQVA4Q0AxQEFFWFhaWFoiKCkKKy8vIENIRUNLOiBzdG9yZSB7IGk4KiwgaTMyIH0geyBpOCogYml0Y2FzdCAodm9pZCAoaTgqKSogQCJcMDE/P185Q0BUZXN0NEBAJEJBQEFFIiB0byBpOCopLCBpMzIgNCB9LCB7IGk4KiwgaTMyIH0qICV7ey4qfX0KKy8vCisKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgbGlua29uY2Vfb2RyIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/P185Q0BUZXN0NEBAJEJBQEFFIihpOCopCisvLyBDSEVDSy1OT1Q6ICBnZXRlbGVtZW50cHRyCisvLyBDSEVDSzogIGxvYWQgdm9pZCAoaTgqKSoqKiAle3suKn19CisvLyBDSEVDSzogIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgdm9pZCAoaTgqKSoqICV7ey4qfX0sIGk2NCAwCisvLyBDSEVDSy1OT1Q6ICBnZXRlbGVtZW50cHRyCisvLyBDSEVDSzogIGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCAlCisKK30KKworI2Vsc2UKK3N0cnVjdCBfX3ZpcnR1YWxfaW5oZXJpdGFuY2UgQTsKKyNpZmRlZiBNRU1GVU4KK2ludCBmb28oQSAqYSwgaW50IChBOjoqbXApKCkpIHsKKyAgICByZXR1cm4gKGEtPiptcCkoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlcXVpcmVzIGEgY29tcGxldGUgY2xhc3MgdHlwZX19Cit9CisjZWxzZQoraW50IGZvbyhBICphLCBpbnQgQTo6Km1wKSB7CisgICAgcmV0dXJuIGEtPiptcDsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlcXVpcmVzIGEgY29tcGxldGUgY2xhc3MgdHlwZX19Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktbWV0aG9kcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1tZXRob2RzLmNwcAppbmRleCBjOTk2YmE1Li41NzllNTQ5IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1tZXRob2RzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1tZXRob2RzLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLWN4eC1hYmkgbWljcm9zb2Z0IC10cmlwbGU9aTM4Ni1wYy13aW4zMiB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPWkzODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgJXMKIAogY2xhc3MgQyB7CiAgcHVibGljOgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktbXVsdGlwbGUtbm9udmlydHVhbC1pbmhlcml0YW5jZS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1tdWx0aXBsZS1ub252aXJ0dWFsLWluaGVyaXRhbmNlLmNwcAppbmRleCA4MDJmMGNhLi5iMWMxNDgyIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1tdWx0aXBsZS1ub252aXJ0dWFsLWluaGVyaXRhbmNlLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1tdWx0aXBsZS1ub252aXJ0dWFsLWluaGVyaXRhbmNlLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAlcyAtbyAtIC1tY29uc3RydWN0b3ItYWxpYXNlcyAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0gJXMgLW8gLSAtbWNvbnN0cnVjdG9yLWFsaWFzZXMgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrICVzCiAKIHN0cnVjdCBMZWZ0IHsKICAgdmlydHVhbCB2b2lkIGxlZnQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLW5vbi12aXJ0dWFsLWJhc2Utb3JkZXJpbmcuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktbm9uLXZpcnR1YWwtYmFzZS1vcmRlcmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGM4MmFjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLW5vbi12aXJ0dWFsLWJhc2Utb3JkZXJpbmcuY3BwCkBAIC0wLDAgKzEsMTAgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAtdHJpcGxlPWk2ODYtcGMtd2luMzIgLW8gLSAlcyAgMj4vZGV2L251bGwgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiAtbyAtICVzICAyPi9kZXYvbnVsbCB8IEZpbGVDaGVjayAlcworCitzdHJ1Y3QgQzAgeyBpbnQgYTsgfTsKK3N0cnVjdCBDMSB7IGludCBhOyB2aXJ0dWFsIHZvaWQgQzFNKCkge30gfTsKK3N0cnVjdCBDMiB7IGludCBhOyB2aXJ0dWFsIHZvaWQgQzJNKCkge30gfTsKK3N0cnVjdCBDMyA6IEMwLCBDMSwgQzIge30gYTsKKworLy8gQ2hlY2sgdG8gc2VlIHRoYXQgYm90aCBDMSBhbmQgQzIgZ2V0IGxhaWQgb3V0IGJlZm9yZSBDMCBkb2VzLgorLy8gQ0hFQ0s6ICVzdHJ1Y3QuQzMgPSB0eXBlIHsgJXN0cnVjdC5DMSwgJXN0cnVjdC5DMiwgJXN0cnVjdC5DMCB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1zcmV0LWFuZC1ieXZhbC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1zcmV0LWFuZC1ieXZhbC5jcHAKaW5kZXggZDA3NTBlNi4uM2Q1ZmU5YyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktc3JldC1hbmQtYnl2YWwuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXNyZXQtYW5kLWJ5dmFsLmNwcApAQCAtMSw2ICsxLDYgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLWxpbnV4IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggTElOVVggJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1tY29uc3RydWN0b3ItYWxpYXNlcyAtY3h4LWFiaSBtaWNyb3NvZnQgLWZuby1ydHRpIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggV0lOMzIgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT14ODZfNjQtcGMtd2luMzIgLW1jb25zdHJ1Y3Rvci1hbGlhc2VzIC1jeHgtYWJpIG1pY3Jvc29mdCAtZm5vLXJ0dGkgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBXSU42NCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPWkzODYtcGMtd2luMzIgLW1jb25zdHJ1Y3Rvci1hbGlhc2VzIC1mbm8tcnR0aSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IFdJTjMyICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9eDg2XzY0LXBjLXdpbjMyIC1tY29uc3RydWN0b3ItYWxpYXNlcyAtZm5vLXJ0dGkgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBXSU42NCAlcwogCiBzdHJ1Y3QgRW1wdHkge307CiAKQEAgLTQ3LDYgKzQ3LDE0IEBACiAgIGludCBhLCBiLCBjLCBkLCBlLCBmOwogfTsKIAorLy8gV0lOMzI6IGRlY2xhcmUgdm9pZCBAInt7Lip0YWtlX2Jvb2xzX2FuZF9jaGFycy4qfX0iCisvLyBXSU4zMjogICAgICAgKDx7IGk4LCBbMyB4IGk4XSwgaTgsIFszIHggaThdLCAlc3RydWN0LlNtYWxsV2l0aER0b3IsCisvLyBXSU4zMjogICAgICAgICAgIGk4LCBbMyB4IGk4XSwgaTgsIFszIHggaThdLCBpMzIsIGk4IH0+KiBpbmFsbG9jYSkKK3ZvaWQgdGFrZV9ib29sc19hbmRfY2hhcnMoY2hhciBhLCBjaGFyIGIsIFNtYWxsV2l0aER0b3IgYywgY2hhciBkLCBib29sIGUsIGludCBmLCBib29sIGcpOwordm9pZCBjYWxsX2Jvb2xzX2FuZF9jaGFycygpIHsKKyAgdGFrZV9ib29sc19hbmRfY2hhcnMoJ0EnLCAnQicsIFNtYWxsV2l0aER0b3IoKSwgJ0QnLCB0cnVlLCAxMywgZmFsc2UpOworfQorCiAvLyBSZXR1cm5pbmcgc3RydWN0cyB0aGF0IGZpdCBpbnRvIGEgcmVnaXN0ZXIuCiBTbWFsbCBzbWFsbF9yZXR1cm4oKSB7IHJldHVybiBTbWFsbCgpOyB9CiAvLyBMSU5VWC1MQUJFTDogZGVmaW5lIHZvaWQgQF9aMTJzbWFsbF9yZXR1cm52KCVzdHJ1Y3QuU21hbGwqIG5vYWxpYXMgc3JldCAlYWdnLnJlc3VsdCkKQEAgLTEwMywxMSArMTExLDExIEBACiAKIC8vIFRlc3QgdGhhdCBkdG9ycyBhcmUgaW52b2tlZCBpbiB0aGUgY2FsbGVlLgogdm9pZCBzbWFsbF9hcmdfd2l0aF9kdG9yKFNtYWxsV2l0aER0b3Igcykge30KLS8vIFdJTjMyOiBkZWZpbmUgdm9pZCBAIlwwMT9zbWFsbF9hcmdfd2l0aF9kdG9yQEBZQVhVU21hbGxXaXRoRHRvckBAQFoiKCVzdHJ1Y3QuU21hbGxXaXRoRHRvciogYnl2YWwgYWxpZ24gNCAlcykge3suKn19IHsKLS8vIFdJTjMyOiAgIGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MVNtYWxsV2l0aER0b3JAQFFBRUBYWiIoJXN0cnVjdC5TbWFsbFdpdGhEdG9yKiAlcykKKy8vIFdJTjMyOiBkZWZpbmUgdm9pZCBAIlwwMT9zbWFsbF9hcmdfd2l0aF9kdG9yQEBZQVhVU21hbGxXaXRoRHRvckBAQFoiKDx7ICVzdHJ1Y3QuU21hbGxXaXRoRHRvciB9PiogaW5hbGxvY2EpIHt7Lip9fSB7CisvLyBXSU4zMjogICBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzFTbWFsbFdpdGhEdG9yQEBRQUVAWFoiCiAvLyBXSU4zMjogfQotLy8gV0lONjQ6IGRlZmluZSB2b2lkIEAiXDAxP3NtYWxsX2FyZ193aXRoX2R0b3JAQFlBWFVTbWFsbFdpdGhEdG9yQEBAWiIoJXN0cnVjdC5TbWFsbFdpdGhEdG9yKiBieXZhbCAlcykge3suKn19IHsKLS8vIFdJTjY0OiAgIGNhbGwgdm9pZCBAIlwwMT8/MVNtYWxsV2l0aER0b3JAQFFFQUFAWFoiKCVzdHJ1Y3QuU21hbGxXaXRoRHRvciogJXMpCisvLyBXSU42NDogZGVmaW5lIHZvaWQgQCJcMDE/c21hbGxfYXJnX3dpdGhfZHRvckBAWUFYVVNtYWxsV2l0aER0b3JAQEBaIiglc3RydWN0LlNtYWxsV2l0aER0b3IqICVzKSB7ey4qfX0geworLy8gV0lONjQ6ICAgY2FsbCB2b2lkIEAiXDAxPz8xU21hbGxXaXRoRHRvckBAUUVBQUBYWiIKIC8vIFdJTjY0OiB9CiAKIC8vIFRlc3QgdGhhdCByZWZlcmVuY2VzIGFyZW4ndCBkZXN0cm95ZWQgaW4gdGhlIGNhbGxlZS4KQEAgLTE0MSwxMyArMTQ5LDEzIEBACiAKIHZvaWQgc21hbGxfYXJnX3dpdGhfdmZ0YWJsZShTbWFsbFdpdGhWZnRhYmxlIHMpIHt9CiAvLyBMSU5VWC1MQUJFTDogZGVmaW5lIHZvaWQgQF9aMjJzbWFsbF9hcmdfd2l0aF92ZnRhYmxlMTZTbWFsbFdpdGhWZnRhYmxlKCVzdHJ1Y3QuU21hbGxXaXRoVmZ0YWJsZSogJXMpCi0vLyBXSU4zMjogZGVmaW5lIHZvaWQgQCJcMDE/c21hbGxfYXJnX3dpdGhfdmZ0YWJsZUBAWUFYVVNtYWxsV2l0aFZmdGFibGVAQEBaIiglc3RydWN0LlNtYWxsV2l0aFZmdGFibGUqIGJ5dmFsIGFsaWduIDQgJXMpCi0vLyBXSU42NDogZGVmaW5lIHZvaWQgQCJcMDE/c21hbGxfYXJnX3dpdGhfdmZ0YWJsZUBAWUFYVVNtYWxsV2l0aFZmdGFibGVAQEBaIiglc3RydWN0LlNtYWxsV2l0aFZmdGFibGUqIGJ5dmFsICVzKQorLy8gV0lOMzI6IGRlZmluZSB2b2lkIEAiXDAxP3NtYWxsX2FyZ193aXRoX3ZmdGFibGVAQFlBWFVTbWFsbFdpdGhWZnRhYmxlQEBAWiIoPHsgJXN0cnVjdC5TbWFsbFdpdGhWZnRhYmxlIH0+KiBpbmFsbG9jYSkKKy8vIFdJTjY0OiBkZWZpbmUgdm9pZCBAIlwwMT9zbWFsbF9hcmdfd2l0aF92ZnRhYmxlQEBZQVhVU21hbGxXaXRoVmZ0YWJsZUBAQFoiKCVzdHJ1Y3QuU21hbGxXaXRoVmZ0YWJsZSogJXMpCiAKIHZvaWQgbWVkaXVtX2FyZ193aXRoX2NvcHlfY3RvcihNZWRpdW1XaXRoQ29weUN0b3Igcykge30KIC8vIExJTlVYLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1oyNW1lZGl1bV9hcmdfd2l0aF9jb3B5X2N0b3IxOE1lZGl1bVdpdGhDb3B5Q3Rvciglc3RydWN0Lk1lZGl1bVdpdGhDb3B5Q3RvciogJXMpCi0vLyBXSU4zMjogZGVmaW5lIHZvaWQgQCJcMDE/bWVkaXVtX2FyZ193aXRoX2NvcHlfY3RvckBAWUFYVU1lZGl1bVdpdGhDb3B5Q3RvckBAQFoiKCVzdHJ1Y3QuTWVkaXVtV2l0aENvcHlDdG9yKiBieXZhbCBhbGlnbiA0ICVzKQotLy8gV0lONjQ6IGRlZmluZSB2b2lkIEAiXDAxP21lZGl1bV9hcmdfd2l0aF9jb3B5X2N0b3JAQFlBWFVNZWRpdW1XaXRoQ29weUN0b3JAQEBaIiglc3RydWN0Lk1lZGl1bVdpdGhDb3B5Q3RvciogYnl2YWwgJXMpCisvLyBXSU4zMjogZGVmaW5lIHZvaWQgQCJcMDE/bWVkaXVtX2FyZ193aXRoX2NvcHlfY3RvckBAWUFYVU1lZGl1bVdpdGhDb3B5Q3RvckBAQFoiKDx7ICVzdHJ1Y3QuTWVkaXVtV2l0aENvcHlDdG9yIH0+KiBpbmFsbG9jYSkKKy8vIFdJTjY0OiBkZWZpbmUgdm9pZCBAIlwwMT9tZWRpdW1fYXJnX3dpdGhfY29weV9jdG9yQEBZQVhVTWVkaXVtV2l0aENvcHlDdG9yQEBAWiIoJXN0cnVjdC5NZWRpdW1XaXRoQ29weUN0b3IqICVzKQogCiB2b2lkIGJpZ19hcmcoQmlnIHMpIHt9CiAvLyBMSU5VWC1MQUJFTDogZGVmaW5lIHZvaWQgQF9aN2JpZ19hcmczQmlnKCVzdHJ1Y3QuQmlnKiBieXZhbCBhbGlnbiA0ICVzKQpAQCAtMTY3LDEwICsxNzUsNyBAQAogCiAgIFNtYWxsIF9fY2RlY2wgY2RlY2xfbWV0aG9kX3NtYWxsKCkgeyByZXR1cm4gU21hbGwoKTsgfQogICAvLyBMSU5VWDogZGVmaW5lIHt7Lip9fSB2b2lkIEBfWk41Q2xhc3MxOGNkZWNsX21ldGhvZF9zbWFsbEV2KCVzdHJ1Y3QuU21hbGwqIG5vYWxpYXMgc3JldCAlYWdnLnJlc3VsdCwgJWNsYXNzLkNsYXNzKiAldGhpcykKLSAgLy8gRklYTUU6IEludGVyZXN0aW5nLCBjZGVjbCByZXR1cm5zIHN0cnVjdHVyZXMgZGlmZmVyZW50bHkgZm9yIGluc3RhbmNlCi0gIC8vIG1ldGhvZHMgYW5kIGdsb2JhbCBmdW5jdGlvbnMuIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBDbGFuZyB5ZXQuLi4KLSAgLy8gRklYTUU6IFJlcGxhY2UgV0lOMzItTk9UIHdpdGggV0lOMzIgd2hlbiB0aGlzIGlzIGZpeGVkLgotICAvLyBXSU4zMi1OT1Q6IGRlZmluZSB7ey4qfX0gdm9pZCBAIlwwMT9jZGVjbF9tZXRob2Rfc21hbGxAQ2xhc3NAQFFBQT9BVVNtYWxsQEBYWiIoJXN0cnVjdC5TbWFsbCogbm9hbGlhcyBzcmV0ICVhZ2cucmVzdWx0LCAlY2xhc3MuQ2xhc3MqICV0aGlzKQorICAvLyBXSU4zMjogZGVmaW5lIHt7Lip9fSB2b2lkIEAiXDAxP2NkZWNsX21ldGhvZF9zbWFsbEBDbGFzc0BAUUFBP0FVU21hbGxAQFhaIiglc3RydWN0LlNtYWxsKiBub2FsaWFzIHNyZXQgJWFnZy5yZXN1bHQsICVjbGFzcy5DbGFzcyogJXRoaXMpCiAKICAgQmlnIF9fY2RlY2wgY2RlY2xfbWV0aG9kX2JpZygpIHsgcmV0dXJuIEJpZygpOyB9CiAgIC8vIExJTlVYOiBkZWZpbmUge3suKn19IHZvaWQgQF9aTjVDbGFzczE2Y2RlY2xfbWV0aG9kX2JpZ0V2KCVzdHJ1Y3QuQmlnKiBub2FsaWFzIHNyZXQgJWFnZy5yZXN1bHQsICVjbGFzcy5DbGFzcyogJXRoaXMpCkBAIC0yMTgsOCArMjIzLDggQEAKIH07CiB2b2lkIGcoWCkgewogfQotLy8gV0lOMzI6IGRlZmluZSB2b2lkIEAiXDAxP2dAQFlBWFVYQEBAWiIoJXN0cnVjdC5YKiBieXZhbCBhbGlnbiA0KSB7ey4qfX0gewotLy8gV0lOMzI6ICAgY2FsbCB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxPz8xWEBAUUFFQFhaIiglc3RydWN0LlgqICUwKQorLy8gV0lOMzI6IGRlZmluZSB2b2lkIEAiXDAxP2dAQFlBWFVYQEBAWiIoPHsgJXN0cnVjdC5YIH0+KiBpbmFsbG9jYSkge3suKn19IHsKKy8vIFdJTjMyOiAgIGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MVhAQFFBRUBYWiIoJXN0cnVjdC5YKiB7ey4qfX0pCiAvLyBXSU4zMjogfQogdm9pZCBmKCkgewogICBnKFgoKSk7CkBAIC0yMjcsMyArMjMyLDU4IEBACiAvLyBXSU4zMjogZGVmaW5lIHZvaWQgQCJcMDE/ZkBAWUFYWFoiKCkge3suKn19IHsKIC8vIFdJTjMyLU5PVDogY2FsbCB7ey4qfX0gQCJcMDE/PzFYQEBRQUVAWFoiCiAvLyBXSU4zMjogfQorCisKK25hbWVzcGFjZSB0ZXN0MiB7CisvLyBXZSB1c2VkIHRvIGNyYXNoIG9uIHRoaXMgZHVlIHRvIHRoZSBtaXh0dXJlIG9mIFBPRCBieXZhbCBhbmQgbm9uLXRyaXZpYWwKKy8vIGJ5dmFsLgorCitzdHJ1Y3QgTm9uVHJpdmlhbCB7CisgIE5vblRyaXZpYWwoKTsKKyAgTm9uVHJpdmlhbChjb25zdCBOb25Ucml2aWFsICZvKTsKKyAgfk5vblRyaXZpYWwoKTsKKyAgaW50IGE7Cit9Oworc3RydWN0IFBPRCB7IGludCBiOyB9OworCitpbnQgZm9vKE5vblRyaXZpYWwgYSwgUE9EIGIpOwordm9pZCBiYXIoKSB7CisgIFBPRCBiOworICBiLmIgPSAxMzsKKyAgaW50IGMgPSBmb28oTm9uVHJpdmlhbCgpLCBiKTsKK30KKy8vIFdJTjMyLUxBQkVMOiBkZWZpbmUgdm9pZCBAIlwwMT9iYXJAdGVzdDJAQFlBWFhaIigpIHt7Lip9fSB7CisvLyBXSU4zMjogICAlW1thcmdtZW06W14gXSpdXSA9IGFsbG9jYSBpbmFsbG9jYSBbW2FyZ21lbV90eTo8eyAlInN0cnVjdC50ZXN0Mjo6Tm9uVHJpdmlhbCIsICUic3RydWN0LnRlc3QyOjpQT0QiIH0+XV0KKy8vIFdJTjMyOiAgIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgW1thcmdtZW1fdHldXSogJVtbYXJnbWVtXV0sIGkzMiAwLCBpMzIgMQorLy8gV0lOMzI6ICAgY2FsbCB2b2lkIEBsbHZtLm1lbWNweQorLy8gV0lOMzI6ICAgZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBbW2FyZ21lbV90eV1dKiAlW1thcmdtZW1dXSwgaTMyIDAsIGkzMiAwCisvLyBXSU4zMjogICBjYWxsIHg4Nl90aGlzY2FsbGNjICUic3RydWN0LnRlc3QyOjpOb25Ucml2aWFsIiogQCJcMDE/PzBOb25Ucml2aWFsQHRlc3QyQEBRQUVAWFoiCisvLyBXSU4zMjogICBjYWxsIGkzMiBAIlwwMT9mb29AdGVzdDJAQFlBSFVOb25Ucml2aWFsQDFAVVBPREAxQEBaIihbW2FyZ21lbV90eV1dKiBpbmFsbG9jYSAlYXJnbWVtKQorLy8gV0lOMzI6ICAgcmV0IHZvaWQKKy8vIFdJTjMyOiB9CisKK30KKworLy8gV2Ugd291bGQgY3Jhc2ggaGVyZSBiZWNhdXNlIHRoZSBsYXRlciBkZWZpbml0aW9uIG9mIEZvcndhcmREZWNsYXJlMSByZXN1bHRzCisvLyBpbiBhIGRpZmZlcmVudCBJUiB0eXBlIGZvciB0aGUgdmFsdWUgd2Ugd2FudCB0byBzdG9yZS4gIEhvd2V2ZXIsIHRoZSBhbGxvY2EncworLy8gdHlwZSB3aWxsIHVzZSB0aGUgYXJndW1lbnQgdHlwZSBzZWxlY3RlZCBieSBmbjEuCitzdHJ1Y3QgRm9yd2FyZERlY2xhcmUxOworCit0eXBlZGVmIHZvaWQgKCpGblB0cjEpKEZvcndhcmREZWNsYXJlMSk7Cit2b2lkIGZuMShGblB0cjEgYSwgU21hbGxXaXRoRHRvciBiKSB7IH0KKworc3RydWN0IEZvcndhcmREZWNsYXJlMSB7fTsKKwordm9pZCBmbjIoRm5QdHIxIGEsIFNtYWxsV2l0aER0b3IgYikgeyBmbjEoYSwgYik7IH07CisvLyBXSU4zMi1MQUJFTDogZGVmaW5lIHZvaWQgQCJcMDE/Zm4yQEBZQVhQNkFYVUZvcndhcmREZWNsYXJlMUBAQFpVU21hbGxXaXRoRHRvckBAQFoiCisvLyBXSU4zMjogICAlW1thOlteIF0qXV0gPSBnZXRlbGVtZW50cHRyIGluYm91bmRzIFtbYXJnbWVtX3R5Ojx7IHt9XCosICVzdHJ1Y3QuU21hbGxXaXRoRHRvciB9Pl1dKiAle3suKn19LCBpMzIgMCwgaTMyIDAKKy8vIFdJTjMyOiAgICVbW2ExOlteIF0qXV0gPSBiaXRjYXN0IHt9KiogJVtbYV1dIHRvIHZvaWQgW1tkc3RfdHk6XCglc3RydWN0LkZvcndhcmREZWNsYXJlMVwqXClcKl1dKgorLy8gV0lOMzI6ICAgJVtbYXJnbWVtOlteIF0qXV0gPSBhbGxvY2EgaW5hbGxvY2EgW1thcmdtZW1fdHldXQorLy8gV0lOMzI6ICAgJVtbZ2VwMTpbXiBdKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBbW2FyZ21lbV90eV1dKiAlW1thcmdtZW1dXSwgaTMyIDAsIGkzMiAxCisvLyBXSU4zMjogICAlW1tiYzE6W14gXSpdXSA9IGJpdGNhc3QgJXN0cnVjdC5TbWFsbFdpdGhEdG9yKiAlW1tnZXAxXV0gdG8gaTgqCisvLyBXSU4zMjogICBjYWxsIHZvaWQgQGxsdm0ubWVtY3B5LnAwaTgucDBpOC5pMzIoaTgqICVbW2JjMV1dLCBpOCoge3suKn19LCBpMzIgNCwgaTMyIDQsIGkxIGZhbHNlKQorLy8gV0lOMzI6ICAgJVtbYTI6W14gXSpdXSA9IGxvYWQgdm9pZCBbW2RzdF90eV1dKiAlW1thMV1dLCBhbGlnbiA0CisvLyBXSU4zMjogICAlW1tnZXAyOlteIF0qXV0gPSBnZXRlbGVtZW50cHRyIGluYm91bmRzIFtbYXJnbWVtX3R5XV0qICVbW2FyZ21lbV1dLCBpMzIgMCwgaTMyIDAKKy8vIFdJTjMyOiAgICVbW2FkZHI6W14gXSpdXSA9IGJpdGNhc3Qge30qKiAlW1tnZXAyXV0gdG8gdm9pZCBbW2RzdF90eV1dKgorLy8gV0lOMzI6ICAgc3RvcmUgdm9pZCBbW2RzdF90eV1dICVbW2EyXV0sIHZvaWQgW1tkc3RfdHldXSogJVtbYWRkcl1dLCBhbGlnbiA0CisvLyBXSU4zMjogICBjYWxsIHZvaWQgQCJcMDE/Zm4xQEBZQVhQNkFYVUZvcndhcmREZWNsYXJlMUBAQFpVU21hbGxXaXRoRHRvckBAQFoiKFtbYXJnbWVtX3R5XV0qIGluYWxsb2NhICVbW2FyZ21lbV1dKQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktc3RhdGljLWluaXRpYWxpemVycy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1zdGF0aWMtaW5pdGlhbGl6ZXJzLmNwcAppbmRleCBjMGI5NzIyLi4wMjEzNTZlIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1zdGF0aWMtaW5pdGlhbGl6ZXJzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1zdGF0aWMtaW5pdGlhbGl6ZXJzLmNwcApAQCAtMSw3ICsxLDcgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLW1jb25zdHJ1Y3Rvci1hbGlhc2VzIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPWkzODYtcGMtd2luMzIgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLW1jb25zdHJ1Y3Rvci1hbGlhc2VzIC10cmlwbGU9aTM4Ni1wYy13aW4zMiB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSzogQGxsdm0uZ2xvYmFsX2N0b3JzID0gYXBwZW5kaW5nIGdsb2JhbCBbMiB4IHsgaTMyLCB2b2lkICgpKiB9XQotLy8gQ0hFQ0s6IFt7IGkzMiwgdm9pZCAoKSogfSB7IGkzMiA2NTUzNSwgdm9pZCAoKSogQCJcMDE/P19fRWZvb0A/JEJASEBAWUFYWFoiIH0sCisvLyBDSEVDSzogW3sgaTMyLCB2b2lkICgpKiB9IHsgaTMyIDY1NTM1LCB2b2lkICgpKiBAIlwwMT8/X19FZm9vQD8kQkBIQEAyVkFAQEFAWUFYWFoiCiAvLyBDSEVDSzogIHsgaTMyLCB2b2lkICgpKiB9IHsgaTMyIDY1NTM1LCB2b2lkICgpKiBAX0dMT0JBTF9fSV9hIH1dCiAKIHN0cnVjdCBTIHsKQEAgLTI0LDggKzI0LDggQEAKICAgc3RhdGljIFMgVGhlUzsKIH0KIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAIlwwMT9TdGF0aWNMb2NhbEBAWUFYWFoiKCkKLS8vIENIRUNLOiBsb2FkIGkzMiogQCJcMDE/JFMxQD8xPz9TdGF0aWNMb2NhbEBAWUFYWFpANElBIgotLy8gQ0hFQ0s6IHN0b3JlIGkzMiB7ey4qfX0sIGkzMiogQCJcMDE/JFMxQD8xPz9TdGF0aWNMb2NhbEBAWUFYWFpANElBIgorLy8gQ0hFQ0s6IGxvYWQgaTMyKiBAIlwwMT8kUzFAPzA/P1N0YXRpY0xvY2FsQEBZQVhYWkA0SUEiCisvLyBDSEVDSzogc3RvcmUgaTMyIHt7Lip9fSwgaTMyKiBAIlwwMT8kUzFAPzA/P1N0YXRpY0xvY2FsQEBZQVhYWkA0SUEiCiAvLyBDSEVDSzogcmV0CiAKIHZvaWQgTXVsdGlwbGVTdGF0aWNzKCkgewpAQCAtNjYsNyArNjYsNyBAQAogICBzdGF0aWMgUyBTMzU7CiB9CiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQCJcMDE/TXVsdGlwbGVTdGF0aWNzQEBZQVhYWiIoKQotLy8gQ0hFQ0s6IGxvYWQgaTMyKiBAIlwwMT8kUzFAPzE/P011bHRpcGxlU3RhdGljc0BAWUFYWFpANElBIgorLy8gQ0hFQ0s6IGxvYWQgaTMyKiBAIlwwMT8kUzFAPzA/P011bHRpcGxlU3RhdGljc0BAWUFYWFpANElBIgogLy8gQ0hFQ0s6IGFuZCBpMzIge3suKn19LCAxCiAvLyBDSEVDSzogYW5kIGkzMiB7ey4qfX0sIDIKIC8vIENIRUNLOiBhbmQgaTMyIHt7Lip9fSwgNApAQCAtNzQsNyArNzQsNyBAQAogLy8gQ0hFQ0s6IGFuZCBpMzIge3suKn19LCAxNgogLy8gICAuLi4KIC8vIENIRUNLOiBhbmQgaTMyIHt7Lip9fSwgLTIxNDc0ODM2NDgKLS8vIENIRUNLOiBsb2FkIGkzMiogQCJcMDE/JFMxQD8xPz9NdWx0aXBsZVN0YXRpY3NAQFlBWFhaQDRJQTEiCisvLyBDSEVDSzogbG9hZCBpMzIqIEAiXDAxPyRTMUA/MD8/TXVsdGlwbGVTdGF0aWNzQEBZQVhYWkA0SUExIgogLy8gQ0hFQ0s6IGFuZCBpMzIge3suKn19LCAxCiAvLyBDSEVDSzogYW5kIGkzMiB7ey4qfX0sIDIKIC8vIENIRUNLOiBhbmQgaTMyIHt7Lip9fSwgNApAQCAtMTM0LDE2ICsxMzQsMTggQEAKICAgKHZvaWQpQjxpbnQ+Ojpmb287ICAvLyAodm9pZCkgLSBmb3JjZSB1c2FnZQogfQogCi0vLyBDSEVDSzogZGVmaW5lIGludGVybmFsIHZvaWQgQCJcMDE/P19fRWZvb0A/JEJASEBAWUFYWFoiKCkgW1tOVVddXQorLy8gQ0hFQ0s6IGRlZmluZSBpbnRlcm5hbCB2b2lkIEAiXDAxPz9fX0Vmb29APyRCQEhAQDJWQUBAQUBZQVhYWiIoKSBbW05VV11dCisvLyBDSEVDSzogbG9hZCBpMzIqIEAiXDAxPz9fQmZvb0A/JEJASEBAMlZBQEBBQDUiCisvLyBDSEVDSzogc3RvcmUgaTMyIHt7Lip9fSwgaTMyKiBAIlwwMT8/X0Jmb29APyRCQEhAQDJWQUBAQUA1IgogLy8gQ0hFQ0s6ICV7e1suMC05QS1aX2Etel0rfX0gPSBjYWxsIHg4Nl90aGlzY2FsbGNjICVjbGFzcy5BKiBAIlwwMT8/MEFAQFFBRUBYWiIKLS8vIENIRUNLOiBjYWxsIGkzMiBAYXRleGl0KHZvaWQgKCkqIEAiXDAxPz9fX0Zmb29APyRCQEhAQFlBWFhaIikKKy8vIENIRUNLOiBjYWxsIGkzMiBAYXRleGl0KHZvaWQgKCkqIEAiXDAxPz9fX0Zmb29APyRCQEhAQDJWQUBAQUBZQVhYWiIpCiAvLyBDSEVDSzogcmV0IHZvaWQKIAogLy8gQ0hFQ0s6IGRlZmluZSBsaW5rb25jZV9vZHIgeDg2X3RoaXNjYWxsY2MgJWNsYXNzLkEqIEAiXDAxPz8wQUBAUUFFQFhaIgogCiAvLyBDSEVDSzogZGVmaW5lIGxpbmtvbmNlX29kciB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxPz8xQUBAUUFFQFhaIgogCi0vLyBDSEVDSzogZGVmaW5lIGludGVybmFsIHZvaWQgQCJcMDE/P19fRmZvb0A/JEJASEBAWUFYWFoiCisvLyBDSEVDSzogZGVmaW5lIGludGVybmFsIHZvaWQgQCJcMDE/P19fRmZvb0A/JEJASEBAMlZBQEBBQFlBWFhaIgogLy8gQ0hFQ0s6IGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUFAQFFBRUBYWiJ7ey4qfX1mb28KIC8vIENIRUNLOiByZXQgdm9pZAogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1zdHJ1Y3RvcnMtYWxpYXMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktc3RydWN0b3JzLWFsaWFzLmNwcAppbmRleCBkNTQ1MjBmLi5mOTc3NTU2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1zdHJ1Y3RvcnMtYWxpYXMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXN0cnVjdG9ycy1hbGlhcy5jcHAKQEAgLTEsOSArMSwyNiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1mbm8tcnR0aSAtbWNvbnN0cnVjdG9yLWFsaWFzZXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1mbm8tcnR0aSAtbWNvbnN0cnVjdG9yLWFsaWFzZXMgLU8xIC1kaXNhYmxlLWxsdm0tb3B0em5zIHwgRmlsZUNoZWNrICVzCiAKIG5hbWVzcGFjZSB0ZXN0MSB7CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQSB7CiAgIH5BKCkge30KIH07CiB0ZW1wbGF0ZSBjbGFzcyBBPGNoYXI+OwotLy8gQ0hFQ0s6IGRlZmluZSB3ZWFrX29kciB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxPz8xPyRBQERAdGVzdDFAQEFBRUBYWiIKKy8vIENIRUNLLURBRzogZGVmaW5lIHdlYWtfb2RyIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzE/JEFAREB0ZXN0MUBAQUFFQFhaIgorfQorCituYW1lc3BhY2UgdGVzdDIgeworc3RydWN0IEEgeworICB2aXJ0dWFsIH5BKCk7Cit9Oworc3RydWN0IEIgOiBBIHsKKyAgQigpOworICB2aXJ0dWFsIH5CKCk7Cit9OworCitBOjp+QSgpIHt9CitCOjp+QigpIHt9Cit2b2lkIGZvbygpIHsKKyAgQiBiOworfQorLy8gQ0hFQ0stREFHOiBAIlwwMT8/MUJAdGVzdDJAQFVBRUBYWiIgPSBhbGlhcyBiaXRjYXN0ICh2b2lkICglInN0cnVjdC50ZXN0Mjo6QSIqKSogQCJcMDE/PzFBQHRlc3QyQEBVQUVAWFoiIHRvIHZvaWQgKCUic3RydWN0LnRlc3QyOjpCIiopKikKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXN0cnVjdG9ycy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS1zdHJ1Y3RvcnMuY3BwCmluZGV4IGMyZjEzOTUuLmI3OWRhOGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXN0cnVjdG9ycy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktc3RydWN0b3JzLmNwcApAQCAtMSwxMCArMSwxMiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtbWNvbnN0cnVjdG9yLWFsaWFzZXMgLWN4eC1hYmkgbWljcm9zb2Z0IC10cmlwbGU9aTM4Ni1wYy13aW4zMiAtZm5vLXJ0dGkgPiAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtbWNvbnN0cnVjdG9yLWFsaWFzZXMgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1mbm8tcnR0aSA+ICV0CiAvLyBSVU46IEZpbGVDaGVjayAlcyA8ICV0CiAvLyB2ZnRhYmxlcyBhcmUgZW1pdHRlZCB2ZXJ5IGxhdGUsIHNvIGRvIGFub3RoZXIgcGFzcyB0byB0cnkgdG8ga2VlcCB0aGUgY2hlY2tzCiAvLyBpbiBzb3VyY2Ugb3JkZXIuCiAvLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeCBEVE9SUyAlcyA8ICV0CisvLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeCBEVE9SUzIgJXMgPCAldAorLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXggRFRPUlMzICVzIDwgJXQKIC8vCi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC1tY29uc3RydWN0b3ItYWxpYXNlcyAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT14ODZfNjQtcGMtd2luMzIgLWZuby1ydHRpIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4IERUT1JTLVg2NCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtbWNvbnN0cnVjdG9yLWFsaWFzZXMgLXRyaXBsZT14ODZfNjQtcGMtd2luMzIgLWZuby1ydHRpIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4IERUT1JTLVg2NCAlcwogCiBuYW1lc3BhY2UgYmFzaWMgewogCkBAIC0xMjEsNiArMTIzLDc5IEBACiAKIH0gLy8gZW5kIG5hbWVzcGFjZSBiYXNpYwogCituYW1lc3BhY2UgZHRvcl9pbl9zZWNvbmRfbnZiYXNlIHsKKworc3RydWN0IEEgeworICB2aXJ0dWFsIHZvaWQgZigpOyAgLy8gQSBuZWVkcyB2ZnRhYmxlIHRvIGJlIHByaW1hcnkuCit9Oworc3RydWN0IEIgeworICB2aXJ0dWFsIH5CKCk7Cit9Oworc3RydWN0IEMgOiBBLCBCIHsKKyAgdmlydHVhbCB+QygpOworfTsKKworQzo6fkMoKSB7CisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzFDQGR0b3JfaW5fc2Vjb25kX252YmFzZUBAVUFFQFhaIgorLy8gQ0hFQ0s6ICAgICAgICglInN0cnVjdC5kdG9yX2luX3NlY29uZF9udmJhc2U6OkMiKiAldGhpcykKKy8vICAgICAgTm8gdGhpcyBhZGp1c3RtZW50IQorLy8gQ0hFQ0stTk9UOiBnZXRlbGVtZW50cHRyCisvLyBDSEVDSzogICBsb2FkICUic3RydWN0LmR0b3JfaW5fc2Vjb25kX252YmFzZTo6QyIqKiAle3suKn19CisvLyAgICAgIE5vdyB3ZSB0aGlzLWFkanVzdCBiZWZvcmUgY2FsbGluZyB+Qi4KKy8vIENIRUNLOiAgIGJpdGNhc3QgJSJzdHJ1Y3QuZHRvcl9pbl9zZWNvbmRfbnZiYXNlOjpDIiogJXt7Lip9fSB0byBpOCoKKy8vIENIRUNLOiAgIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgaTgqICV7ey4qfX0sIGk2NCA0CisvLyBDSEVDSzogICBiaXRjYXN0IGk4KiAle3suKn19IHRvICUic3RydWN0LmR0b3JfaW5fc2Vjb25kX252YmFzZTo6QiIqCisvLyBDSEVDSzogICBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzFCQGR0b3JfaW5fc2Vjb25kX252YmFzZUBAVUFFQFhaIgorLy8gQ0hFQ0s6ICAgICAgICglInN0cnVjdC5kdG9yX2luX3NlY29uZF9udmJhc2U6OkIiKiAle3suKn19KQorLy8gQ0hFQ0s6ICAgcmV0IHZvaWQKK30KKwordm9pZCBmb28oKSB7CisgIEMgYzsKK30KKy8vIERUT1JTMi1MQUJFTDogZGVmaW5lIHdlYWsgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/X0VDQGR0b3JfaW5fc2Vjb25kX252YmFzZUBAVzNBRVBBWElAWiIKKy8vIERUT1JTMjogICAgICAgKCUic3RydWN0LmR0b3JfaW5fc2Vjb25kX252YmFzZTo6QyIqICV0aGlzLCBpMzIgJXNob3VsZF9jYWxsX2RlbGV0ZSkKKy8vICAgICAgRG8gYW4gYWRqdXN0bWVudCBmcm9tIEIqIHRvIEMqLgorLy8gRFRPUlMyOiAgIGdldGVsZW1lbnRwdHIgaTgqICV7ey4qfX0sIGkzMiAtNAorLy8gRFRPUlMyOiAgIGJpdGNhc3QgaTgqICV7ey4qfX0gdG8gJSJzdHJ1Y3QuZHRvcl9pbl9zZWNvbmRfbnZiYXNlOjpDIioKKy8vIERUT1JTMjogICBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/P19HQ0BkdG9yX2luX3NlY29uZF9udmJhc2VAQFVBRVBBWElAWiIKKy8vIERUT1JTMjogICByZXQgdm9pZAorCit9CisKK25hbWVzcGFjZSB0ZXN0MiB7CisvLyBKdXN0IGxpa2UgZHRvcl9pbl9zZWNvbmRfbnZiYXNlLCBleGNlcHQgcHV0IHRoYXQgaW4gYSB2YmFzZSBvZiBhIGRpYW1vbmQuCisKKy8vIEMncyBkdG9yIGlzIGluIHRoZSBub24tcHJpbWFyeSBiYXNlLgorc3RydWN0IEEgeyB2aXJ0dWFsIHZvaWQgZigpOyB9Oworc3RydWN0IEIgeyB2aXJ0dWFsIH5CKCk7IH07CitzdHJ1Y3QgQyA6IEEsIEIgeyB2aXJ0dWFsIH5DKCk7IGludCBjOyB9OworCisvLyBEaWFtb25kIGhpZXJhcmNoeSwgd2l0aCBDIGFzIHRoZSBzaGFyZWQgdmJhc2UuCitzdHJ1Y3QgRCA6IHZpcnR1YWwgQyB7IGludCBkOyB9Oworc3RydWN0IEUgOiB2aXJ0dWFsIEMgeyBpbnQgZTsgfTsKK3N0cnVjdCBGIDogRCwgRSB7IH5GKCk7IGludCBmOyB9OworCitGOjp+RigpIHsKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUZAdGVzdDJAQFVBRUBYWiIoJSJzdHJ1Y3QudGVzdDI6OkYiKikKKy8vICAgICAgRG8gYW4gYWRqdXN0bWVudCBmcm9tIEMgdmJhc2Ugc3Vib2JqZWN0IHRvIEYgYXMgdGhvdWdoIEYgd2FzIHRoZQorLy8gICAgICBjb21wbGV0ZSB0eXBlLgorLy8gQ0hFQ0s6ICAgZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBpOCogJXt7Lip9fSwgaTMyIC0yMAorLy8gQ0hFQ0s6ICAgYml0Y2FzdCBpOCogJXt7Lip9fSB0byAlInN0cnVjdC50ZXN0Mjo6RiIqCisvLyBDSEVDSzogICBzdG9yZSAlInN0cnVjdC50ZXN0Mjo6RiIqCit9CisKK3ZvaWQgZm9vKCkgeworICBGIGY7Cit9CisvLyBEVE9SUzMtTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/X0RGQHRlc3QyQEBVQUVAWFoiCisvLyAgICAgIERvIGFuIGFkanVzdG1lbnQgZnJvbSBDKiB0byBGKi4KKy8vIERUT1JTMzogICBnZXRlbGVtZW50cHRyIGk4KiAle3suKn19LCBpMzIgMjAKKy8vIERUT1JTMzogICBiaXRjYXN0IGk4KiAle3suKn19IHRvICUic3RydWN0LnRlc3QyOjpGIioKKy8vIERUT1JTMzogICBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzFGQHRlc3QyQEBVQUVAWFoiCisvLyBEVE9SUzM6ICAgcmV0IHZvaWQKKworfQogCiBuYW1lc3BhY2UgY29uc3RydWN0b3JzIHsKIApAQCAtMjk5LDMgKzM3NCw0OSBAQAogfQogCiB9CisKK25hbWVzcGFjZSB0ZXN0MSB7CitzdHJ1Y3QgQSB7IH07CitzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7CisgIEIoaW50ICphKTsKKyAgQihjb25zdCBjaGFyICphLCAuLi4pOworICBfX2NkZWNsIEIoc2hvcnQgKmEpOworfTsKK0I6OkIoaW50ICphKSB7fQorQjo6Qihjb25zdCBjaGFyICphLCAuLi4pIHt9CitCOjpCKHNob3J0ICphKSB7fQorLy8gQ0hFQ0s6IGRlZmluZSB4ODZfdGhpc2NhbGxjYyAlInN0cnVjdC50ZXN0MTo6QiIqIEAiXDAxPz8wQkB0ZXN0MUBAUUFFQFBBSEBaIgorLy8gQ0hFQ0s6ICAgICAgICAgICAgICAgKCUic3RydWN0LnRlc3QxOjpCIiogcmV0dXJuZWQgJXRoaXMsIGkzMiogJWEsIGkzMiAlaXNfbW9zdF9kZXJpdmVkKQorLy8gQ0hFQ0s6IGRlZmluZSAlInN0cnVjdC50ZXN0MTo6QiIqIEAiXDAxPz8wQkB0ZXN0MUBAUUFBQFBCRFpaIgorLy8gQ0hFQ0s6ICAgICAgICAgICAgICAgKCUic3RydWN0LnRlc3QxOjpCIiogcmV0dXJuZWQgJXRoaXMsIGkzMiAlaXNfbW9zdF9kZXJpdmVkLCBpOCogJWEsIC4uLikKKworLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIHg4Nl90aGlzY2FsbGNjLiAgTVNWQyBpZ25vcmVzIGV4cGxpY2l0IENDcyBvbiBzdHJ1Y3RvcnMuCisvLyBDSEVDSzogZGVmaW5lICUic3RydWN0LnRlc3QxOjpCIiogQCJcMDE/PzBCQHRlc3QxQEBRQUFAUEFGQFoiCisvLyBDSEVDSzogICAgICAgICAgICAgICAoJSJzdHJ1Y3QudGVzdDE6OkIiKiByZXR1cm5lZCAldGhpcywgaTE2KiAlYSwgaTMyICVpc19tb3N0X2Rlcml2ZWQpCisKK3ZvaWQgY29uc3RydWN0X2IoKSB7CisgIGludCBhOworICBCIGIxKCZhKTsKKyAgQiBiMigiJWQgJWQiLCAxLCAyKTsKK30KKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAIlwwMT9jb25zdHJ1Y3RfYkB0ZXN0MUBAWUFYWFoiKCkKKy8vIENIRUNLOiBjYWxsIHg4Nl90aGlzY2FsbGNjICUic3RydWN0LnRlc3QxOjpCIiogQCJcMDE/PzBCQHRlc3QxQEBRQUVAUEFIQFoiCisvLyBDSEVDSzogICAgICAgICAgICAgICAoJSJzdHJ1Y3QudGVzdDE6OkIiKiB7ey4qfX0sIGkzMioge3suKn19LCBpMzIgMSkKKy8vIENIRUNLOiBjYWxsICUic3RydWN0LnRlc3QxOjpCIiogKCUic3RydWN0LnRlc3QxOjpCIiosIGkzMiwgaTgqLCAuLi4pKiBAIlwwMT8/MEJAdGVzdDFAQFFBQUBQQkRaWiIKKy8vIENIRUNLOiAgICAgICAgICAgICAgICglInN0cnVjdC50ZXN0MTo6QiIqIHt7Lip9fSwgaTMyIDEsIGk4KiB7ey4qfX0sIGkzMiAxLCBpMzIgMikKK30KKworLy8gRHRvciB0aHVua3MgZm9yIGNsYXNzZXMgaW4gYW5vbnltb3VzIG5hbWVzcGFjZXMgc2hvdWxkIGJlIGludGVybmFsLCBub3QKKy8vIGxpbmtvbmNlX29kci4KK25hbWVzcGFjZSB7CitzdHJ1Y3QgQSB7CisgIHZpcnR1YWwgfkEoKSB7IH0KK307Cit9Cit2b2lkICpnZXRBKCkgeworICByZXR1cm4gKHZvaWQqKW5ldyBBKCk7Cit9CisvLyBDSEVDSzogZGVmaW5lIGludGVybmFsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/P19HQUA/QUBAVUFFUEFYSUBaIgorLy8gQ0hFQ0s6ICAgICAgICAgICAgICAgKCUic3RydWN0Lihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6QSIqICV0aGlzLCBpMzIgJXNob3VsZF9jYWxsX2RlbGV0ZSkKKy8vIENIRUNLOiBkZWZpbmUgaW50ZXJuYWwgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUFAP0FAQFVBRUBYWiIKKy8vIENIRUNLOiAgICAgICAgICAgICAgICglInN0cnVjdC4oYW5vbnltb3VzIG5hbWVzcGFjZSk6OkEiKiAldGhpcykKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXRodW5rcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS10aHVua3MuY3BwCmluZGV4IGYxYmMzODUuLjJiZTY0MmMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXRodW5rcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktdGh1bmtzLmNwcApAQCAtMSw4ICsxLDggQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAlcyAtbyAtIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPWkzODYtcGMtd2luMzIgPiV0IDI+JjEKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiA+JXQgMj4mMQogLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9TUFOR0xJTkcgJXMgPCAldAogLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9WE1BTkdMSU5HICVzIDwgJXQKIC8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNPREVHRU4gJXMgPCAldAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtICVzIC1vIC0gLWN4eC1hYmkgbWljcm9zb2Z0IC10cmlwbGU9eDg2XzY0LXBjLXdpbjMyIDI+JjEgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9TUFOR0xJTkctWDY0ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiAyPiYxIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU1BTkdMSU5HLVg2NCAlcwogCiB2b2lkIGZvbyh2b2lkICopOwogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12YnRhYmxlcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12YnRhYmxlcy5jcHAKaW5kZXggNmRlNTU2Yi4uYjk1MGQwYyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktdmJ0YWJsZXMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZidGFibGVzLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZm5vLXJ0dGkgLWN4eC1hYmkgbWljcm9zb2Z0IC10cmlwbGU9aTM4Ni1wYy13aW4zMiAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZm5vLXJ0dGkgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBTZWUgbWljcm9zb2Z0LWFiaS1zdHJ1Y3RvcnMuY3BwIGZvciBjb25zdHJ1Y3RvciBjb2RlZ2VuIHRlc3RzLgogCkBAIC00NzcsMyArNDc3LDQ0IEBACiAvLyBDSEVDSy1EQUc6IEAiXDAxPz9fOEZAVGVzdDI2QEA3QkRAMUBAIiA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzQgeCBpMzJdIFtpMzIgMCwgaTMyIDE2LCBpMzIgMTIsIGkzMiAyMF0KIC8vIENIRUNLLURBRzogQCJcMDE/P184RkBUZXN0MjZAQDdCRUAxQEAiID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCBbMiB4IGkzMl0gW2kzMiAtNCwgaTMyIDI4XQogfQorCituYW1lc3BhY2UgVGVzdDI3IHsKKy8vIFBSMTc3NDgKK3N0cnVjdCBBIHt9Oworc3RydWN0IEIgOiB2aXJ0dWFsIEEge307CitzdHJ1Y3QgQyA6IHZpcnR1YWwgQiB7fTsKK3N0cnVjdCBEIDogQywgQiB7fTsKK3N0cnVjdCBFIDogRCB7fTsKK3N0cnVjdCBGIDogQywgRSB7fTsKK3N0cnVjdCBHIDogRiwgRCwgQywgQiB7fTsKK0cgeDsKKworLy8gQ0hFQ0stREFHOiBAIlwwMT8/XzhHQFRlc3QyN0BAN0JCQDFAQCIgPQorLy8gQ0hFQ0stREFHOiBAIlwwMT8/XzhHQFRlc3QyN0BAN0JCQDFARkAxQEAiID0KKy8vIENIRUNLLURBRzogQCJcMDE/P184R0BUZXN0MjdAQDdCQ0AxQEAiID0KKy8vIENIRUNLLURBRzogQCJcMDE/P184R0BUZXN0MjdAQDdCQ0AxQERAMUBAIiA9CisvLyBDSEVDSy1EQUc6IEAiXDAxPz9fOEdAVGVzdDI3QEA3QkNAMUBFQDFAQCIgPQorLy8gQ0hFQ0stREFHOiBAIlwwMT8/XzhHQFRlc3QyN0BAN0JDQDFARkAxQEAiID0KKy8vIENIRUNLLURBRzogQCJcMDE/P184R0BUZXN0MjdAQDdCREAxQEAiID0KKy8vIENIRUNLLURBRzogQCJcMDE/P184R0BUZXN0MjdAQDdCRkAxQEAiID0KK30KKworbmFtZXNwYWNlIFRlc3QyOCB7CisvLyBQUjE3NzQ4CitzdHJ1Y3QgQSB7fTsKK3N0cnVjdCBCIDogdmlydHVhbCBBIHt9Oworc3RydWN0IEMgOiB2aXJ0dWFsIEIge307CitzdHJ1Y3QgRCA6IEMsIEIge307CitzdHJ1Y3QgRSA6IEMsIEQge307CitzdHJ1Y3QgRiA6IHZpcnR1YWwgRSwgdmlydHVhbCBELCB2aXJ0dWFsIEMge307CitGIHg7CisKKy8vIENIRUNLLURBRzogQCJcMDE/P184RkBUZXN0MjhAQDdCMDFAQCIgPQorLy8gQ0hFQ0stREFHOiBAIlwwMT8/XzhGQFRlc3QyOEBAN0JCQDFAQCIgPQorLy8gQ0hFQ0stREFHOiBAIlwwMT8/XzhGQFRlc3QyOEBAN0JDQDFAQCIgPQorLy8gQ0hFQ0stREFHOiBAIlwwMT8/XzhGQFRlc3QyOEBAN0JDQDFAREAxQEAiID0KKy8vIENIRUNLLURBRzogQCJcMDE/P184RkBUZXN0MjhAQDdCQ0AxQERAMUBFQDFAQCIgPQorLy8gQ0hFQ0stREFHOiBAIlwwMT8/XzhGQFRlc3QyOEBAN0JDQDFARUAxQEAiID0KKy8vIENIRUNLLURBRzogQCJcMDE/P184RkBUZXN0MjhAQDdCREAxQEAiID0KKy8vIENIRUNLLURBRzogQCJcMDE/P184RkBUZXN0MjhAQDdCRUAxQEAiID0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZpcnR1YWwtaW5oZXJpdGFuY2UtdnRvcmRpc3BzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZpcnR1YWwtaW5oZXJpdGFuY2UtdnRvcmRpc3BzLmNwcAppbmRleCA4ZTIzYWRlLi41ZDExODk2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12aXJ0dWFsLWluaGVyaXRhbmNlLXZ0b3JkaXNwcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktdmlydHVhbC1pbmhlcml0YW5jZS12dG9yZGlzcHMuY3BwCkBAIC0xLDcgKzEsNyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mbm8tcnR0aSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mbm8tcnR0aSAtdHJpcGxlPWkzODYtcGMtd2luMzIgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIC8vIEZvciBub3csIGp1c3QgbWFrZSBzdXJlIHg4Nl82NCBkb2Vzbid0IGNyYXNoLgotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mbm8tcnR0aSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT14ODZfNjQtcGMtd2luMzIgLWVtaXQtbGx2bSAtbyAldAorLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mbm8tcnR0aSAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiAtZW1pdC1sbHZtIC1vICV0CiAKIHN0cnVjdCBBIHsKICAgdmlydHVhbCB2b2lkIGYoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZpcnR1YWwtaW5oZXJpdGFuY2UuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktdmlydHVhbC1pbmhlcml0YW5jZS5jcHAKaW5kZXggN2MyMjNjYS4uMmYwZmZmZWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZpcnR1YWwtaW5oZXJpdGFuY2UuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZpcnR1YWwtaW5oZXJpdGFuY2UuY3BwCkBAIC0xLDkgKzEsOSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mbm8tcnR0aSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1lbWl0LWxsdm0gLW8gJXQKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZm5vLXJ0dGkgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1lbWl0LWxsdm0gLW8gJXQKIC8vIFJVTjogRmlsZUNoZWNrICVzIDwgJXQKIC8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLMiAlcyA8ICV0CiAKIC8vIEZvciBub3csIGp1c3QgbWFrZSBzdXJlIHg4Nl82NCBkb2Vzbid0IGNyYXNoLgotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mbm8tcnR0aSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT14ODZfNjQtcGMtd2luMzIgLWVtaXQtbGx2bSAtbyAldAorLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mbm8tcnR0aSAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiAtZW1pdC1sbHZtIC1vICV0CiAKIHN0cnVjdCBWQmFzZSB7CiAgIHZpcnR1YWwgflZCYXNlKCk7CkBAIC0zMTIsMyArMzEyLDE1MSBAQAogfQogCiB9CisKK25hbWVzcGFjZSB0ZXN0MiB7CitzdHJ1Y3QgQSB7IEEoKTsgfTsKK3N0cnVjdCBCIDogdmlydHVhbCBBIHsgQigpIHt9IH07CitzdHJ1Y3QgQyA6IEIsIEEgeyBDKCkge30gfTsKKworLy8gUFIxODQzNTogT3JkZXIgbWF0dGVyZWQgaGVyZS4gIFdlIHdlcmUgZ2VuZXJhdGluZyBjb2RlIGZvciB0aGUgZGVsZWdhdGluZworLy8gY2FsbCB0byBCKCkgZnJvbSBDKCkuCit2b2lkIGNhbGxDKCkgeyBDIHg7IH0KKworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgeDg2X3RoaXNjYWxsY2MgJSJzdHJ1Y3QudGVzdDI6OkMiKiBAIlwwMT8/MENAdGVzdDJAQFFBRUBYWiIKKy8vIENIRUNLOiAgICAgICAgICAgKCUic3RydWN0LnRlc3QyOjpDIiogcmV0dXJuZWQgJXRoaXMsIGkzMiAlaXNfbW9zdF9kZXJpdmVkKQorLy8gQ0hFQ0s6IGJyIGkxCisvLyAgIFZpcnR1YWwgYmFzZXMKKy8vIENIRUNLOiBjYWxsIHg4Nl90aGlzY2FsbGNjICUic3RydWN0LnRlc3QyOjpBIiogQCJcMDE/PzBBQHRlc3QyQEBRQUVAWFoiKCUic3RydWN0LnRlc3QyOjpBIiogJXt7Lip9fSkKKy8vIENIRUNLOiBiciBsYWJlbAorLy8gICBOb24tdmlydHVhbCBiYXNlcworLy8gQ0hFQ0s6IGNhbGwgeDg2X3RoaXNjYWxsY2MgJSJzdHJ1Y3QudGVzdDI6OkIiKiBAIlwwMT8/MEJAdGVzdDJAQFFBRUBYWiIoJSJzdHJ1Y3QudGVzdDI6OkIiKiAle3suKn19LCBpMzIgMCkKKy8vIENIRUNLOiBjYWxsIHg4Nl90aGlzY2FsbGNjICUic3RydWN0LnRlc3QyOjpBIiogQCJcMDE/PzBBQHRlc3QyQEBRQUVAWFoiKCUic3RydWN0LnRlc3QyOjpBIiogJXt7Lip9fSkKKy8vIENIRUNLOiByZXQKKworLy8gQ0hFQ0syLUxBQkVMOiBkZWZpbmUgbGlua29uY2Vfb2RyIHg4Nl90aGlzY2FsbGNjICUic3RydWN0LnRlc3QyOjpCIiogQCJcMDE/PzBCQHRlc3QyQEBRQUVAWFoiCisvLyBDSEVDSzI6ICAgICAgICAgICAoJSJzdHJ1Y3QudGVzdDI6OkIiKiByZXR1cm5lZCAldGhpcywgaTMyICVpc19tb3N0X2Rlcml2ZWQpCisvLyBDSEVDSzI6IGNhbGwgeDg2X3RoaXNjYWxsY2MgJSJzdHJ1Y3QudGVzdDI6OkEiKiBAIlwwMT8/MEFAdGVzdDJAQFFBRUBYWiIoJSJzdHJ1Y3QudGVzdDI6OkEiKiAle3suKn19KQorLy8gQ0hFQ0syOiByZXQKKworfQorCituYW1lc3BhY2UgdGVzdDMgeworLy8gUFIxOTEwNDogQSBub24tdmlydHVhbCBjYWxsIG9mIGEgdmlydHVhbCBtZXRob2QgZG9lc24ndCB1c2UgdmZ0YWJsZSB0aHVua3MsCisvLyBzbyByZXF1aXJlcyBvbmx5IHN0YXRpYyBhZGp1c3RtZW50IHdoaWNoIGlzIGRpZmZlcmVudCB0byB0aGUgb25lIHVzZWQKKy8vIGZvciB2aXJ0dWFsIGNhbGxzLgorc3RydWN0IEEgeworICB2aXJ0dWFsIHZvaWQgZm9vKCk7Cit9OworCitzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7CisgIHZpcnR1YWwgdm9pZCBiYXIoKTsKK307CisKK3N0cnVjdCBDIDogdmlydHVhbCBBIHsKKyAgdmlydHVhbCB2b2lkIGZvbygpOworfTsKKworc3RydWN0IEQgOiBCLCBDIHsKKyAgdmlydHVhbCB2b2lkIGJhcigpOworICBpbnQgZmllbGQ7ICAvLyBMYWlkIG91dCBiZXR3ZWVuIEMgYW5kIEEgc3Vib2JqZWN0cyBpbiBELgorfTsKKwordm9pZCBEOjpiYXIoKSB7CisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT9iYXJAREB0ZXN0M0BAVUFFWFhaIiglInN0cnVjdC50ZXN0Mzo6RCIqICV0aGlzKQorCisgIEM6OmZvbygpOworICAvLyBTaG91bGRuJ3QgbmVlZCBhbnkgdmJ0YWJsZSBsb29rdXBzLiAgQWxsIHdlIGhhdmUgdG8gZG8gaXMgYWRqdXN0IHRvIEMqLAorICAvLyB0aGVuIGNvbXBlbnNhdGUgZm9yIHRoZSBhZGp1c3RtZW50IHBlcmZvcm1lZCBpbiB0aGUgQzo6Zm9vKCkgcHJvbG9ndWUuCisgIC8vIENIRUNLLU5PVDogbG9hZCBpOCoqCisgIC8vIENIRUNLOiAlW1tPQkpfaTg6LipdXSA9IGJpdGNhc3QgJSJzdHJ1Y3QudGVzdDM6OkQiKiAle3suKn19IHRvIGk4KgorICAvLyBDSEVDSzogJVtbQ19pODouKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBpOCogJVtbT0JKX2k4XV0sIGkzMiA4CisgIC8vIENIRUNLOiAlW1tDOi4qXV0gPSBiaXRjYXN0IGk4KiAlW1tDX2k4XV0gdG8gJSJzdHJ1Y3QudGVzdDM6OkMiKgorICAvLyBDSEVDSzogJVtbQ19pODouKl1dID0gYml0Y2FzdCAlInN0cnVjdC50ZXN0Mzo6QyIqICVbW0NdXSB0byBpOCoKKyAgLy8gQ0hFQ0s6ICVbW0FSRzouKl1dID0gZ2V0ZWxlbWVudHB0ciBpOCogJVtbQ19pOF1dLCBpMzIgNAorICAvLyBDSEVDSzogY2FsbCB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxP2Zvb0BDQHRlc3QzQEBVQUVYWFoiKGk4KiAlW1tBUkddXSkKKyAgLy8gQ0hFQ0s6IHJldAorfQorfQorCituYW1lc3BhY2UgdGVzdDR7CisvLyBQUjE5MTcyOiBXZSB1c2VkIHRvIG1lcmdlIG1ldGhvZCB2ZnRhYmxlIGxvY2F0aW9ucyB3cm9uZy4KKworc3RydWN0IEEgeworICB2aXJ0dWFsIH5BKCkge30KK307CisKK3N0cnVjdCBCIHsKKyAgdmlydHVhbCB+QigpIHt9Cit9OworCitzdHJ1Y3QgQyA6IHZpcnR1YWwgQSwgQiB7CisgIHZpcnR1YWwgfkMoKTsKK307CisKK3ZvaWQgZm9vKHZvaWQqKTsKKworQzo6fkMoKSB7CisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUNAdGVzdDRAQFVBRUBYWiIoJSJzdHJ1Y3QudGVzdDQ6OkMiKiAldGhpcykKKworICAvLyBJbiB0aGlzIGNhc2UgInRoaXMiIHBvaW50cyB0byB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzLCBzbyBubyBHRVBzIG5lZWRlZC4KKyAgLy8gQ0hFQ0stTk9UOiBnZXRlbGVtZW50cHRyCisgIC8vIENIRUNLLU5PVDogYml0Y2FzdAorICAvLyBDSEVDSzogJVtbVkZQVFJfaTg6LipdXSA9IGJpdGNhc3QgJSJzdHJ1Y3QudGVzdDQ6OkMiKiAle3suKn19IHRvIFsxIHggaTgqXSoqCisgIC8vIENIRUNLOiBzdG9yZSBbMSB4IGk4Kl0qIEAiXDAxPz9fN0NAdGVzdDRAQDZCQkAxQEAiLCBbMSB4IGk4Kl0qKiAlW1tWRlBUUl9pOF1dCisKKyAgZm9vKHRoaXMpOworICAvLyBDSEVDSzogcmV0Cit9CisKK3ZvaWQgZGVzdHJveShDICpvYmopIHsKKyAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEAiXDAxP2Rlc3Ryb3lAdGVzdDRAQFlBWFBBVUNAMUBAWiIoJSJzdHJ1Y3QudGVzdDQ6OkMiKiAlb2JqKQorCisgIGRlbGV0ZSBvYmo7CisgIC8vIENIRUNLOiAlW1tWUFRSOi4qXV0gPSBiaXRjYXN0ICUic3RydWN0LnRlc3Q0OjpDIiogJVtbT0JKOi4qXV0gdG8gdm9pZCAoJSJzdHJ1Y3QudGVzdDQ6OkMiKiwgaTMyKSoqKgorICAvLyBDSEVDSzogJVtbVkZUQUJMRTouKl1dID0gbG9hZCB2b2lkICglInN0cnVjdC50ZXN0NDo6QyIqLCBpMzIpKioqICVbW1ZQVFJdXQorICAvLyBDSEVDSzogJVtbVkZURU5UUlk6LipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgdm9pZCAoJSJzdHJ1Y3QudGVzdDQ6OkMiKiwgaTMyKSoqICVbW1ZGVEFCTEVdXSwgaTY0IDAKKyAgLy8gQ0hFQ0s6ICVbW1ZGVU46LipdXSA9IGxvYWQgdm9pZCAoJSJzdHJ1Y3QudGVzdDQ6OkMiKiwgaTMyKSoqICVbW1ZGVEVOVFJZXV0KKyAgLy8gQ0hFQ0s6IGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCAlW1tWRlVOXV0oJSJzdHJ1Y3QudGVzdDQ6OkMiKiAlW1tPQkpdXSwgaTMyIDEpCisgIC8vIENIRUNLOiByZXQKK30KKworc3RydWN0IEQgeworICB2aXJ0dWFsIHZvaWQgZCgpOworfTsKKworLy8gVGhlIGZpcnN0IG5vbi12aXJ0dWFsIGJhc2UgZG9lc24ndCBoYXZlIGEgdmR0b3IsCisvLyBidXQgInRoaXMgYWRqdXN0bWVudCIgaXMgbm90IG5lZWRlZC4KK3N0cnVjdCBFIDogRCwgQiwgdmlydHVhbCBBIHsKKyAgdmlydHVhbCB+RSgpOworfTsKKworRTo6fkUoKSB7CisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUVAdGVzdDRAQFVBRUBYWiIoJSJzdHJ1Y3QudGVzdDQ6OkUiKiAldGhpcykKKworICAvLyBJbiB0aGlzIGNhc2UgInRoaXMiIHBvaW50cyB0byB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzLCBzbyBubyBHRVBzIG5lZWRlZC4KKyAgLy8gQ0hFQ0stTk9UOiBnZXRlbGVtZW50cHRyCisgIC8vIENIRUNLLU5PVDogYml0Y2FzdAorICAvLyBDSEVDSzogJVtbVkZQVFJfaTg6LipdXSA9IGJpdGNhc3QgJSJzdHJ1Y3QudGVzdDQ6OkUiKiAle3suKn19IHRvIFsxIHggaTgqXSoqCisgIC8vIENIRUNLOiBzdG9yZSBbMSB4IGk4Kl0qIEAiXDAxPz9fN0VAdGVzdDRAQDZCREAxQEAiLCBbMSB4IGk4Kl0qKiAlW1tWRlBUUl9pOF1dCisgIGZvbyh0aGlzKTsKK30KKwordm9pZCBkZXN0cm95KEUgKm9iaikgeworICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQCJcMDE/ZGVzdHJveUB0ZXN0NEBAWUFYUEFVRUAxQEBaIiglInN0cnVjdC50ZXN0NDo6RSIqICVvYmopCisKKyAgLy8gQ0hFQ0stTk9UOiBnZXRlbGVtZW50cHRyCisgIC8vIENIRUNLOiAlW1tPQkpfaTg6LipdXSA9IGJpdGNhc3QgJSJzdHJ1Y3QudGVzdDQ6OkUiKiAlW1tPQko6LipdXSB0byBpOCoKKyAgLy8gQ0hFQ0s6ICVbW0JfaTg6LipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgaTgqICVbW09CSl9pOF1dLCBpMzIgNAorICAvLyBDSEVDSzogJVtbVlBUUjouKl1dID0gYml0Y2FzdCBpOCogJVtbQl9pOF1dIHRvIHZvaWQgKCUic3RydWN0LnRlc3Q0OjpFIiosIGkzMikqKioKKyAgLy8gQ0hFQ0s6ICVbW1ZGVEFCTEU6LipdXSA9IGxvYWQgdm9pZCAoJSJzdHJ1Y3QudGVzdDQ6OkUiKiwgaTMyKSoqKiAlW1tWUFRSXV0KKyAgLy8gQ0hFQ0s6ICVbW1ZGVEVOVFJZOi4qXV0gPSBnZXRlbGVtZW50cHRyIGluYm91bmRzIHZvaWQgKCUic3RydWN0LnRlc3Q0OjpFIiosIGkzMikqKiAlW1tWRlRBQkxFXV0sIGk2NCAwCisgIC8vIENIRUNLOiAlW1tWRlVOOi4qXV0gPSBsb2FkIHZvaWQgKCUic3RydWN0LnRlc3Q0OjpFIiosIGkzMikqKiAlW1tWRlRFTlRSWV1dCisgIC8vIENIRUNLOiAlW1tPQkpfaTg6LipdXSA9IGJpdGNhc3QgJSJzdHJ1Y3QudGVzdDQ6OkUiKiAlW1tPQkpdXSB0byBpOCoKKyAgLy8gQ0hFQ0s6ICVbW0JfaTg6LipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgaTgqICVbW09CSl9pOF1dLCBpMzIgNAorICAvLyBGSVhNRTogaW4gZmFjdCwgdGhlIGNhbGwgc2hvdWxkIHRha2UgaTgqIGFuZCB0aGUgYml0Y2FzdCBpcyByZWR1bmRhbnQuCisgIC8vIENIRUNLOiAlW1tCX2FzX0U6LipdXSA9IGJpdGNhc3QgaTgqICVbW0JfaThdXSB0byAlInN0cnVjdC50ZXN0NDo6RSIqCisgIC8vIENIRUNLOiBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgJVtbVkZVTl1dKCUic3RydWN0LnRlc3Q0OjpFIiogJVtbQl9hc19FXV0sIGkzMiAxKQorICBkZWxldGUgb2JqOworfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12aXJ0dWFsLW1lbWJlci1wb2ludGVycy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12aXJ0dWFsLW1lbWJlci1wb2ludGVycy5jcHAKaW5kZXggNTFhMDRjOC4uMTU0NmU2YyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktdmlydHVhbC1tZW1iZXItcG9pbnRlcnMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZpcnR1YWwtbWVtYmVyLXBvaW50ZXJzLmNwcApAQCAtMSw1ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0szMgotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiAlcyAtbyAtIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLNjQKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAtdHJpcGxlPWkzODYtcGMtd2luMzIgJXMgLW8gLSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSzMyCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0gLXRyaXBsZT14ODZfNjQtcGMtd2luMzIgJXMgLW8gLSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSzY0CiAKIHN0cnVjdCBTIHsKICAgaW50IHgsIHksIHo7CkBAIC0zNSwxNCArMzUsMTQgQEAKIC8vIENIRUNLMzI6IHN0b3JlIGk4KiBiaXRjYXN0ICh2b2lkICglc3RydWN0LkMqKSogQCJcMDE/P185Q0BAJEJBQEFFIiB0byBpOCopLCBpOCoqICVwdHIKIC8vIENIRUNLMzI6IHN0b3JlIGk4KiBiaXRjYXN0IChpMzIgKCVzdHJ1Y3QuQyosIGkzMiwgZG91YmxlKSogQCJcMDE/P185Q0BAJEIzQUUiIHRvIGk4KiksIGk4KiogJXB0cjIKIC8vIENIRUNLMzI6IHN0b3JlIGk4KiBiaXRjYXN0ICh2b2lkICglc3RydWN0LlMqLCAlc3RydWN0LkMqLCBpMzIpKiBAIlwwMT8/XzlDQEAkQjdBRSIgdG8gaTgqKSwgaTgqKiAlcHRyMwotLy8gQ0hFQ0szMjogc3RvcmUgaTgqIGJpdGNhc3QgKHZvaWQgKCUic3RydWN0Ljxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6RCIqKSogQCJcMDE/P185REA/QUBAJEJBQEFFIiB0byBpOCopLCBpOCoqICVwdHI0CisvLyBDSEVDSzMyOiBzdG9yZSBpOCogYml0Y2FzdCAodm9pZCAoJSJzdHJ1Y3QuKGFub255bW91cyBuYW1lc3BhY2UpOjpEIiopKiBAIlwwMT8/XzlEQD9BQEAkQkFAQUUiIHRvIGk4KiksIGk4KiogJXB0cjQKIC8vIENIRUNLMzI6IH0KIC8vCiAvLyBDSEVDSzY0LUxBQkVMOiBkZWZpbmUgdm9pZCBAIlwwMT9mQEBZQVhYWiIoKQogLy8gQ0hFQ0s2NDogc3RvcmUgaTgqIGJpdGNhc3QgKHZvaWQgKCVzdHJ1Y3QuQyopKiBAIlwwMT8/XzlDQEAkQkFAQUEiIHRvIGk4KiksIGk4KiogJXB0cgogLy8gQ0hFQ0s2NDogc3RvcmUgaTgqIGJpdGNhc3QgKGkzMiAoJXN0cnVjdC5DKiwgaTMyLCBkb3VibGUpKiBAIlwwMT8/XzlDQEAkQjdBQSIgdG8gaTgqKSwgaTgqKiAlcHRyMgogLy8gQ0hFQ0s2NDogc3RvcmUgaTgqIGJpdGNhc3QgKHZvaWQgKCVzdHJ1Y3QuUyosICVzdHJ1Y3QuQyosIGkzMikqIEAiXDAxPz9fOUNAQCRCQkFAQUEiIHRvIGk4KiksIGk4KiogJXB0cjMKLS8vIENIRUNLNjQ6IHN0b3JlIGk4KiBiaXRjYXN0ICh2b2lkICglInN0cnVjdC48YW5vbnltb3VzIG5hbWVzcGFjZT46OkQiKikqIEAiXDAxPz9fOURAP0FAQCRCQUBBQSIgdG8gaTgqKSwgaTgqKiAlcHRyCisvLyBDSEVDSzY0OiBzdG9yZSBpOCogYml0Y2FzdCAodm9pZCAoJSJzdHJ1Y3QuKGFub255bW91cyBuYW1lc3BhY2UpOjpEIiopKiBAIlwwMT8/XzlEQD9BQEAkQkFAQUEiIHRvIGk4KiksIGk4KiogJXB0cgogLy8gQ0hFQ0s2NDogfQogfQogCkBAIC05MywxNiArOTMsMTYgQEAKIC8vIENIRUNLNjQ6IH0KIAogLy8gVGh1bmsgZm9yIGNhbGxpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gaW4gaW50ZXJuYWwgY2xhc3MgRC4KLS8vIENIRUNLMzItTEFCRUw6IGRlZmluZSBpbnRlcm5hbCB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxPz9fOURAP0FAQCRCQUBBRSIoJSJzdHJ1Y3QuPGFub255bW91cyBuYW1lc3BhY2U+OjpEIiogJXRoaXMpIHVubmFtZWRfYWRkcgotLy8gQ0hFQ0szMjogW1tWUFRSOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyB2b2lkICglInN0cnVjdC48YW5vbnltb3VzIG5hbWVzcGFjZT46OkQiKikqKiAle3suKn19LCBpNjQgMAotLy8gQ0hFQ0szMjogW1tDQUxMRUU6JS4qXV0gPSBsb2FkIHZvaWQgKCUic3RydWN0Ljxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6RCIqKSoqIFtbVlBUUl1dCi0vLyBDSEVDSzMyOiBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgW1tDQUxMRUVdXSglInN0cnVjdC48YW5vbnltb3VzIG5hbWVzcGFjZT46OkQiKiAle3suKn19KQorLy8gQ0hFQ0szMi1MQUJFTDogZGVmaW5lIGludGVybmFsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/P185REA/QUBAJEJBQEFFIiglInN0cnVjdC4oYW5vbnltb3VzIG5hbWVzcGFjZSk6OkQiKiAldGhpcykgdW5uYW1lZF9hZGRyCisvLyBDSEVDSzMyOiBbW1ZQVFI6JS4qXV0gPSBnZXRlbGVtZW50cHRyIGluYm91bmRzIHZvaWQgKCUic3RydWN0Lihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6RCIqKSoqICV7ey4qfX0sIGk2NCAwCisvLyBDSEVDSzMyOiBbW0NBTExFRTolLipdXSA9IGxvYWQgdm9pZCAoJSJzdHJ1Y3QuKGFub255bW91cyBuYW1lc3BhY2UpOjpEIiopKiogW1tWUFRSXV0KKy8vIENIRUNLMzI6IGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCBbW0NBTExFRV1dKCUic3RydWN0Lihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6RCIqICV7ey4qfX0pCiAvLyBDSEVDSzMyOiByZXQgdm9pZAogLy8gQ0hFQ0szMjogfQogLy8KLS8vIENIRUNLNjQtTEFCRUw6IGRlZmluZSBpbnRlcm5hbCB2b2lkIEAiXDAxPz9fOURAP0FAQCRCQUBBQSIoJSJzdHJ1Y3QuPGFub255bW91cyBuYW1lc3BhY2U+OjpEIiogJXRoaXMpIHVubmFtZWRfYWRkcgotLy8gQ0hFQ0s2NDogW1tWUFRSOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyB2b2lkICglInN0cnVjdC48YW5vbnltb3VzIG5hbWVzcGFjZT46OkQiKikqKiAle3suKn19LCBpNjQgMAotLy8gQ0hFQ0s2NDogW1tDQUxMRUU6JS4qXV0gPSBsb2FkIHZvaWQgKCUic3RydWN0Ljxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6RCIqKSoqIFtbVlBUUl1dCi0vLyBDSEVDSzY0OiBjYWxsIHZvaWQgW1tDQUxMRUVdXSglInN0cnVjdC48YW5vbnltb3VzIG5hbWVzcGFjZT46OkQiKiAle3suKn19KQorLy8gQ0hFQ0s2NC1MQUJFTDogZGVmaW5lIGludGVybmFsIHZvaWQgQCJcMDE/P185REA/QUBAJEJBQEFBIiglInN0cnVjdC4oYW5vbnltb3VzIG5hbWVzcGFjZSk6OkQiKiAldGhpcykgdW5uYW1lZF9hZGRyCisvLyBDSEVDSzY0OiBbW1ZQVFI6JS4qXV0gPSBnZXRlbGVtZW50cHRyIGluYm91bmRzIHZvaWQgKCUic3RydWN0Lihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6RCIqKSoqICV7ey4qfX0sIGk2NCAwCisvLyBDSEVDSzY0OiBbW0NBTExFRTolLipdXSA9IGxvYWQgdm9pZCAoJSJzdHJ1Y3QuKGFub255bW91cyBuYW1lc3BhY2UpOjpEIiopKiogW1tWUFRSXV0KKy8vIENIRUNLNjQ6IGNhbGwgdm9pZCBbW0NBTExFRV1dKCUic3RydWN0Lihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6RCIqICV7ey4qfX0pCiAvLyBDSEVDSzY0OiByZXQgdm9pZAogLy8gQ0hFQ0s2NDogfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktdnRhYmxlcy1tdWx0aXBsZS1ub252aXJ0dWFsLWluaGVyaXRhbmNlLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZ0YWJsZXMtbXVsdGlwbGUtbm9udmlydHVhbC1pbmhlcml0YW5jZS5jcHAKaW5kZXggZDkzZGVlMS4uMzlmMjA3OSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktdnRhYmxlcy1tdWx0aXBsZS1ub252aXJ0dWFsLWluaGVyaXRhbmNlLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12dGFibGVzLW11bHRpcGxlLW5vbnZpcnR1YWwtaW5oZXJpdGFuY2UuY3BwCkBAIC0xLDI5ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZm5vLXJ0dGkgLWN4eC1hYmkgbWljcm9zb2Z0IC10cmlwbGU9aTM4Ni1wYy13aW4zMiAtZW1pdC1sbHZtIC1vICV0LmxsIC1mZHVtcC12dGFibGUtbGF5b3V0cyA+JXQKLQotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Tk8tVEhVTktTLVRlc3QxICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU5PLVRIVU5LUy1UZXN0MiAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1OTy1USFVOS1MtVGVzdDMgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Tk8tVEhVTktTLVRlc3Q0ICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU5PLVRIVU5LUy1UZXN0NSAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1OTy1USFVOS1MtVGVzdDYgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Tk8tVEhVTktTLVRlc3Q3ICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU5PLVRIVU5LUy1UZXN0OCAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1OTy1USFVOS1MtVGVzdDkgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9UFVSRS1WSVJUVUFMLVRlc3QxICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVRISVMtVEhVTktTLVRlc3QxICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVRISVMtVEhVTktTLVRlc3QyICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVRISVMtVEhVTktTLVRlc3QzICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZEVE9SLVRIVU5LUy1UZXN0MyAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1WRFRPUi1USFVOS1MtVGVzdDUgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9VkRUT1ItVEhVTktTLVRlc3Q2ICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZEVE9SLVRIVU5LUy1UZXN0NyAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1SRVQtVEhVTktTLVRlc3QxICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVJFVC1USFVOS1MtVGVzdDIgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9UkVULVRIVU5LUy1UZXN0MyAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1SRVQtVEhVTktTLVRlc3Q0ICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVJFVC1USFVOS1MtVGVzdDUgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9UkVULVRIVU5LUy1UZXN0NiAlcyA8ICV0Ci0KKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZm5vLXJ0dGkgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1lbWl0LWxsdm0gLW8gJXQubGwgLWZkdW1wLXZ0YWJsZS1sYXlvdXRzID4ldAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgPCAldAogLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9TUFOR0xJTkcgJXMgPCAldC5sbAogCiBzdHJ1Y3QgRW1wdHkgewpAQCAtNDgsMTUgKzI0LDE1IEBACiBuYW1lc3BhY2Ugbm9fdGh1bmtzIHsKIAogc3RydWN0IFRlc3QxOiBBLCBCIHsKLSAgLy8gTk8tVEhVTktTLVRlc3QxOiBWRlRhYmxlIGZvciAnQScgaW4gJ25vX3RodW5rczo6VGVzdDEnICgxIGVudHJpZXMpCi0gIC8vIE5PLVRIVU5LUy1UZXN0MS1ORVhUOiAwIHwgdm9pZCBub190aHVua3M6OlRlc3QxOjpmKCkKKyAgLy8gQ0hFQ0stTEFCRUw6VGVzdDEnICgxIGVudHJ5KQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBub190aHVua3M6OlRlc3QxOjpmKCkKIAotICAvLyBOTy1USFVOS1MtVGVzdDE6IFZGVGFibGUgZm9yICdCJyBpbiAnbm9fdGh1bmtzOjpUZXN0MScgKDIgZW50cmllcykKLSAgLy8gTk8tVEhVTktTLVRlc3QxLU5FWFQ6IDAgfCB2b2lkIEI6OmcoKQotICAvLyBOTy1USFVOS1MtVGVzdDEtTkVYVDogMSB8IHZvaWQgQjo6aCgpCisgIC8vIENIRUNLLUxBQkVMOlRlc3QxJyAoMiBlbnRyaWVzKQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBCOjpnKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQjo6aCgpCiAKLSAgLy8gTk8tVEhVTktTLVRlc3QxOiBWRlRhYmxlIGluZGljZXMgZm9yICdub190aHVua3M6OlRlc3QxJyAoMSBlbnRyaWVzKQotICAvLyBOTy1USFVOS1MtVGVzdDEtTkVYVDogMCB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0MTo6ZigpCisgIC8vIENIRUNLLUxBQkVMOlRlc3QxJyAoMSBlbnRyeSkKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0MTo6ZigpCiAKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdUZXN0MUBub190aHVua3NAQDZCQUBAQCIKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdUZXN0MUBub190aHVua3NAQDZCQkBAQCIKQEAgLTY2LDE4ICs0MiwxOSBAQAogfTsKIAogVGVzdDEgdDE7Cit2b2lkIHVzZShUZXN0MSAqb2JqKSB7IG9iai0+ZigpOyB9CiAKIHN0cnVjdCBUZXN0MjogQSwgQiB7Ci0gIC8vIE5PLVRIVU5LUy1UZXN0MjogVkZUYWJsZSBmb3IgJ0EnIGluICdub190aHVua3M6OlRlc3QyJyAoMSBlbnRyaWVzKQotICAvLyBOTy1USFVOS1MtVGVzdDItTkVYVDogMCB8IHZvaWQgQTo6ZigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ25vX3RodW5rczo6VGVzdDInICgxIGVudHJ5KQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKIAotICAvLyBOTy1USFVOS1MtVGVzdDI6IFZGVGFibGUgZm9yICdCJyBpbiAnbm9fdGh1bmtzOjpUZXN0MicgKDIgZW50cmllcykKLSAgLy8gTk8tVEhVTktTLVRlc3QyLU5FWFQ6IDAgfCB2b2lkIG5vX3RodW5rczo6VGVzdDI6OmcoKQotICAvLyBOTy1USFVOS1MtVGVzdDItTkVYVDogMSB8IHZvaWQgQjo6aCgpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQicgaW4gJ25vX3RodW5rczo6VGVzdDInICgyIGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIG5vX3RodW5rczo6VGVzdDI6OmcoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKIAotICAvLyBOTy1USFVOS1MtVGVzdDI6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ25vX3RodW5rczo6VGVzdDInICgxIGVudHJpZXMpLgotICAvLyBOTy1USFVOS1MtVGVzdDItTkVYVDogdmlhIHZmcHRyIGF0IG9mZnNldCA0Ci0gIC8vIE5PLVRIVU5LUy1UZXN0Mi1ORVhUOiAwIHwgdm9pZCBub190aHVua3M6OlRlc3QyOjpnKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ25vX3RodW5rczo6VGVzdDInICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogdmlhIHZmcHRyIGF0IG9mZnNldCA0CisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIG5vX3RodW5rczo6VGVzdDI6OmcoKQogCiAgIC8vIE92ZXJyaWRlcyBvbmx5IHRoZSByaWdodCBjaGlsZCdzIG1ldGhvZCAoQjo6ZyksIG5lZWRzIHRoaXMgYWRqdXN0bWVudCBidXQKICAgLy8gbm90IHRodW5rcy4KQEAgLTg1LDMyICs2MiwzNCBAQAogfTsKIAogVGVzdDIgdDI7Cit2b2lkIHVzZShUZXN0MiAqb2JqKSB7IG9iai0+ZygpOyB9CiAKIHN0cnVjdCBUZXN0MzogQSwgQiB7Ci0gIC8vIE5PLVRIVU5LUy1UZXN0MzogVkZUYWJsZSBmb3IgJ0EnIGluICdub190aHVua3M6OlRlc3QzJyAoMiBlbnRyaWVzKQotICAvLyBOTy1USFVOS1MtVGVzdDMtTkVYVDogMCB8IHZvaWQgQTo6ZigpCi0gIC8vIE5PLVRIVU5LUy1UZXN0My1ORVhUOiAxIHwgdm9pZCBub190aHVua3M6OlRlc3QzOjppKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdBJyBpbiAnbm9fdGh1bmtzOjpUZXN0MycgKDIgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgQTo6ZigpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIG5vX3RodW5rczo6VGVzdDM6OmkoKQogCi0gIC8vIE5PLVRIVU5LUy1UZXN0MzogVkZUYWJsZSBmb3IgJ0InIGluICdub190aHVua3M6OlRlc3QzJyAoMiBlbnRyaWVzKQotICAvLyBOTy1USFVOS1MtVGVzdDMtTkVYVDogMCB8IHZvaWQgQjo6ZygpCi0gIC8vIE5PLVRIVU5LUy1UZXN0My1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdCJyBpbiAnbm9fdGh1bmtzOjpUZXN0MycgKDIgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgQjo6ZygpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEI6OmgoKQogCi0gIC8vIE5PLVRIVU5LUy1UZXN0MzogVkZUYWJsZSBpbmRpY2VzIGZvciAnbm9fdGh1bmtzOjpUZXN0MycgKDEgZW50cmllcykuCi0gIC8vIE5PLVRIVU5LUy1UZXN0My1ORVhUOiAxIHwgdm9pZCBub190aHVua3M6OlRlc3QzOjppKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ25vX3RodW5rczo6VGVzdDMnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0Mzo6aSgpCiAKICAgLy8gT25seSBhZGRzIGEgbmV3IG1ldGhvZC4KICAgdmlydHVhbCB2b2lkIGkoKTsKIH07CiAKIFRlc3QzIHQzOwordm9pZCB1c2UoVGVzdDMgKm9iaikgeyBvYmotPmkoKTsgfQogCiAvLyBPbmx5IHRoZSByaWdodCBiYXNlIGhhcyBhIHZmdGFibGUsIHNvIGl0J3MgbGFpZCBvdXQgYmVmb3JlIHRoZSBsZWZ0IG9uZSEKIHN0cnVjdCBUZXN0NCA6IEVtcHR5LCBBIHsKLSAgLy8gTk8tVEhVTktTLVRlc3Q0OiBWRlRhYmxlIGZvciAnQScgaW4gJ25vX3RodW5rczo6VGVzdDQnICgxIGVudHJpZXMpCi0gIC8vIE5PLVRIVU5LUy1UZXN0NC1ORVhUOiAwIHwgdm9pZCBub190aHVua3M6OlRlc3Q0OjpmKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdBJyBpbiAnbm9fdGh1bmtzOjpUZXN0NCcgKDEgZW50cnkpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIG5vX3RodW5rczo6VGVzdDQ6OmYoKQogCi0gIC8vIE5PLVRIVU5LUy1UZXN0NDogVkZUYWJsZSBpbmRpY2VzIGZvciAnbm9fdGh1bmtzOjpUZXN0NCcgKDEgZW50cmllcykuCi0gIC8vIE5PLVRIVU5LUy1UZXN0NC1ORVhUOiAwIHwgdm9pZCBub190aHVua3M6OlRlc3Q0OjpmKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ25vX3RodW5rczo6VGVzdDQnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0NDo6ZigpCiAKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdUZXN0NEBub190aHVua3NAQDZCQCIKIApAQCAtMTE4LDI2ICs5NywyNyBAQAogfTsKIAogVGVzdDQgdDQ7Cit2b2lkIHVzZShUZXN0NCAqb2JqKSB7IG9iai0+ZigpOyB9CiAKIC8vIDItbGV2ZWwgc3RydWN0dXJlIHdpdGggcmVwZWF0aW5nIHN1Ym9iamVjdCB0eXBlcywgYnV0IG5vIHRodW5rcyBuZWVkZWQuCiBzdHJ1Y3QgVGVzdDU6IFRlc3QxLCBUZXN0MiB7Ci0gIC8vIE5PLVRIVU5LUy1UZXN0NTogVkZUYWJsZSBmb3IgJ0EnIGluICdub190aHVua3M6OlRlc3QxJyBpbiAnbm9fdGh1bmtzOjpUZXN0NScgKDIgZW50cmllcykKLSAgLy8gTk8tVEhVTktTLVRlc3Q1LU5FWFQ6IDAgfCB2b2lkIG5vX3RodW5rczo6VGVzdDE6OmYoKQotICAvLyBOTy1USFVOS1MtVGVzdDUtTkVYVDogMSB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0NTo6eigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ25vX3RodW5rczo6VGVzdDEnIGluICdub190aHVua3M6OlRlc3Q1JyAoMiBlbnRyaWVzKQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBub190aHVua3M6OlRlc3QxOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0NTo6eigpCiAKLSAgLy8gTk8tVEhVTktTLVRlc3Q1OiBWRlRhYmxlIGZvciAnQicgaW4gJ25vX3RodW5rczo6VGVzdDEnIGluICdub190aHVua3M6OlRlc3Q1JyAoMiBlbnRyaWVzKQotICAvLyBOTy1USFVOS1MtVGVzdDUtTkVYVDogMCB8IHZvaWQgQjo6ZygpCi0gIC8vIE5PLVRIVU5LUy1UZXN0NS1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdCJyBpbiAnbm9fdGh1bmtzOjpUZXN0MScgaW4gJ25vX3RodW5rczo6VGVzdDUnICgyIGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEI6OmcoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKIAotICAvLyBOTy1USFVOS1MtVGVzdDU6IFZGVGFibGUgZm9yICdBJyBpbiAnbm9fdGh1bmtzOjpUZXN0MicgaW4gJ25vX3RodW5rczo6VGVzdDUnICgxIGVudHJpZXMpCi0gIC8vIE5PLVRIVU5LUy1UZXN0NS1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdBJyBpbiAnbm9fdGh1bmtzOjpUZXN0MicgaW4gJ25vX3RodW5rczo6VGVzdDUnICgxIGVudHJ5KQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKIAotICAvLyBOTy1USFVOS1MtVGVzdDU6IFZGVGFibGUgZm9yICdCJyBpbiAnbm9fdGh1bmtzOjpUZXN0MicgaW4gJ25vX3RodW5rczo6VGVzdDUnICgyIGVudHJpZXMpCi0gIC8vIE5PLVRIVU5LUy1UZXN0NS1ORVhUOiAwIHwgdm9pZCBub190aHVua3M6OlRlc3QyOjpnKCkKLSAgLy8gTk8tVEhVTktTLVRlc3Q1LU5FWFQ6IDEgfCB2b2lkIEI6OmgoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0InIGluICdub190aHVua3M6OlRlc3QyJyBpbiAnbm9fdGh1bmtzOjpUZXN0NScgKDIgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0Mjo6ZygpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEI6OmgoKQogCi0gIC8vIE5PLVRIVU5LUy1UZXN0NTogVkZUYWJsZSBpbmRpY2VzIGZvciAnbm9fdGh1bmtzOjpUZXN0NScgKDEgZW50cmllcykuCi0gIC8vIE5PLVRIVU5LUy1UZXN0NS1ORVhUOiAxIHwgdm9pZCBub190aHVua3M6OlRlc3Q1Ojp6KCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ25vX3RodW5rczo6VGVzdDUnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0NTo6eigpCiAKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdUZXN0NUBub190aHVua3NAQDZCQUBAVGVzdDFAMUBAIgogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1Rlc3Q1QG5vX3RodW5rc0BANkJBQEBUZXN0MkAxQEAiCkBAIC0xNDgsMTcgKzEyOCwxOCBAQAogfTsKIAogVGVzdDUgdDU7Cit2b2lkIHVzZShUZXN0NSAqb2JqKSB7IG9iai0+eigpOyB9CiAKIHN0cnVjdCBUZXN0NjogVGVzdDEgewotICAvLyBOTy1USFVOS1MtVGVzdDY6IFZGVGFibGUgZm9yICdBJyBpbiAnbm9fdGh1bmtzOjpUZXN0MScgaW4gJ25vX3RodW5rczo6VGVzdDYnICgxIGVudHJpZXMpLgotICAvLyBOTy1USFVOS1MtVGVzdDYtTkVYVDogMCB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0Njo6ZigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ25vX3RodW5rczo6VGVzdDEnIGluICdub190aHVua3M6OlRlc3Q2JyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIG5vX3RodW5rczo6VGVzdDY6OmYoKQogCi0gIC8vIE5PLVRIVU5LUy1UZXN0NjogVkZUYWJsZSBmb3IgJ0InIGluICdub190aHVua3M6OlRlc3QxJyBpbiAnbm9fdGh1bmtzOjpUZXN0NicgKDIgZW50cmllcykuCi0gIC8vIE5PLVRIVU5LUy1UZXN0Ni1ORVhUOiAwIHwgdm9pZCBCOjpnKCkKLSAgLy8gTk8tVEhVTktTLVRlc3Q2LU5FWFQ6IDEgfCB2b2lkIEI6OmgoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0InIGluICdub190aHVua3M6OlRlc3QxJyBpbiAnbm9fdGh1bmtzOjpUZXN0NicgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEI6OmcoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKIAotICAvLyBOTy1USFVOS1MtVGVzdDY6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ25vX3RodW5rczo6VGVzdDYnICgxIGVudHJpZXMpLgotICAvLyBOTy1USFVOS1MtVGVzdDYtTkVYVDogMCB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0Njo6ZigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICdub190aHVua3M6OlRlc3Q2JyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIG5vX3RodW5rczo6VGVzdDY6OmYoKQogCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183VGVzdDZAbm9fdGh1bmtzQEA2QkFAQEAiCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183VGVzdDZAbm9fdGh1bmtzQEA2QkJAQEAiCkBAIC0xNjgsNDMgKzE0OSw0NiBAQAogfTsKIAogVGVzdDYgdDY7Cit2b2lkIHVzZShUZXN0NiAqb2JqKSB7IG9iai0+ZigpOyB9CiAKIHN0cnVjdCBUZXN0NzogVGVzdDIgewotICAvLyBOTy1USFVOS1MtVGVzdDc6IFZGVGFibGUgZm9yICdBJyBpbiAnbm9fdGh1bmtzOjpUZXN0MicgaW4gJ25vX3RodW5rczo6VGVzdDcnICgxIGVudHJpZXMpLgotICAvLyBOTy1USFVOS1MtVGVzdDctTkVYVDogMCB8IHZvaWQgQTo6ZigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ25vX3RodW5rczo6VGVzdDInIGluICdub190aHVua3M6OlRlc3Q3JyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEE6OmYoKQogCi0gIC8vIE5PLVRIVU5LUy1UZXN0NzogVkZUYWJsZSBmb3IgJ0InIGluICdub190aHVua3M6OlRlc3QyJyBpbiAnbm9fdGh1bmtzOjpUZXN0NycgKDIgZW50cmllcykuCi0gIC8vIE5PLVRIVU5LUy1UZXN0Ny1ORVhUOiAwIHwgdm9pZCBub190aHVua3M6OlRlc3Q3OjpnKCkKLSAgLy8gTk8tVEhVTktTLVRlc3Q3LU5FWFQ6IDEgfCB2b2lkIEI6OmgoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0InIGluICdub190aHVua3M6OlRlc3QyJyBpbiAnbm9fdGh1bmtzOjpUZXN0NycgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIG5vX3RodW5rczo6VGVzdDc6OmcoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKIAotICAvLyBOTy1USFVOS1MtVGVzdDc6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ25vX3RodW5rczo6VGVzdDcnICgxIGVudHJpZXMpLgotICAvLyBOTy1USFVOS1MtVGVzdDctTkVYVDogdmlhIHZmcHRyIGF0IG9mZnNldCA0Ci0gIC8vIE5PLVRIVU5LUy1UZXN0Ny1ORVhUOiAwIHwgdm9pZCBub190aHVua3M6OlRlc3Q3OjpnKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ25vX3RodW5rczo6VGVzdDcnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogdmlhIHZmcHRyIGF0IG9mZnNldCA0CisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIG5vX3RodW5rczo6VGVzdDc6OmcoKQogCiAgIC8vIE92ZXJyaWRlcyBib3RoIG5vX3RodW5rczo6VGVzdDI6OmcgYW5kIEI6OmcuCiAgIHZpcnR1YWwgdm9pZCBnKCk7CiB9OwogCiBUZXN0NyB0NzsKK3ZvaWQgdXNlKFRlc3Q3ICpvYmopIHsgb2JqLT5nKCk7IH0KIAogc3RydWN0IFRlc3Q4OiBUZXN0MyB7Ci0gIC8vIE5PLVRIVU5LUy1UZXN0ODogVkZUYWJsZSBmb3IgJ0EnIGluICdub190aHVua3M6OlRlc3QzJyBpbiAnbm9fdGh1bmtzOjpUZXN0OCcgKDIgZW50cmllcykuCi0gIC8vIE5PLVRIVU5LUy1UZXN0OC1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKLSAgLy8gTk8tVEhVTktTLVRlc3Q4LU5FWFQ6IDEgfCB2b2lkIG5vX3RodW5rczo6VGVzdDM6OmkoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdub190aHVua3M6OlRlc3QzJyBpbiAnbm9fdGh1bmtzOjpUZXN0OCcgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEE6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBub190aHVua3M6OlRlc3QzOjppKCkKIAotICAvLyBOTy1USFVOS1MtVGVzdDg6IFZGVGFibGUgZm9yICdCJyBpbiAnbm9fdGh1bmtzOjpUZXN0MycgaW4gJ25vX3RodW5rczo6VGVzdDgnICgyIGVudHJpZXMpLgotICAvLyBOTy1USFVOS1MtVGVzdDgtTkVYVDogMCB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0ODo6ZygpCi0gIC8vIE5PLVRIVU5LUy1UZXN0OC1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdCJyBpbiAnbm9fdGh1bmtzOjpUZXN0MycgaW4gJ25vX3RodW5rczo6VGVzdDgnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBub190aHVua3M6OlRlc3Q4OjpnKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQjo6aCgpCiAKLSAgLy8gTk8tVEhVTktTLVRlc3Q4OiBWRlRhYmxlIGluZGljZXMgZm9yICdub190aHVua3M6OlRlc3Q4JyAoMSBlbnRyaWVzKS4KLSAgLy8gTk8tVEhVTktTLVRlc3Q4LU5FWFQ6IHZpYSB2ZnB0ciBhdCBvZmZzZXQgNAotICAvLyBOTy1USFVOS1MtVGVzdDgtTkVYVDogMCB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0ODo6ZygpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICdub190aHVua3M6OlRlc3Q4JyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IHZpYSB2ZnB0ciBhdCBvZmZzZXQgNAorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBub190aHVua3M6OlRlc3Q4OjpnKCkKIAogICAvLyBPdmVycmlkZXMgZ3JhbmRwYXJlbnQncyBCOjpnLgogICB2aXJ0dWFsIHZvaWQgZygpOwogfTsKIAogVGVzdDggdDg7Cit2b2lkIHVzZShUZXN0OCAqb2JqKSB7IG9iai0+ZygpOyB9CiAKIHN0cnVjdCBEIDogQSB7CiAgIHZpcnR1YWwgdm9pZCBnKCk7CkBAIC0yMTIsMTYgKzE5NiwxNiBAQAogCiAvLyBSZXBlYXRpbmcgc3Vib2JqZWN0Lgogc3RydWN0IFRlc3Q5OiBBLCBEIHsKLSAgLy8gTk8tVEhVTktTLVRlc3Q5OiBWRlRhYmxlIGZvciAnQScgaW4gJ25vX3RodW5rczo6VGVzdDknICgyIGVudHJpZXMpLgotICAvLyBOTy1USFVOS1MtVGVzdDktTkVYVDogMCB8IHZvaWQgQTo6ZigpCi0gIC8vIE5PLVRIVU5LUy1UZXN0OS1ORVhUOiAxIHwgdm9pZCBub190aHVua3M6OlRlc3Q5OjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdBJyBpbiAnbm9fdGh1bmtzOjpUZXN0OScgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEE6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBub190aHVua3M6OlRlc3Q5OjpoKCkKIAotICAvLyBOTy1USFVOS1MtVGVzdDk6IFZGVGFibGUgZm9yICdBJyBpbiAnbm9fdGh1bmtzOjpEJyBpbiAnbm9fdGh1bmtzOjpUZXN0OScgKDIgZW50cmllcykuCi0gIC8vIE5PLVRIVU5LUy1UZXN0OS1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKLSAgLy8gTk8tVEhVTktTLVRlc3Q5LU5FWFQ6IDEgfCB2b2lkIG5vX3RodW5rczo6RDo6ZygpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ25vX3RodW5rczo6RCcgaW4gJ25vX3RodW5rczo6VGVzdDknICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgbm9fdGh1bmtzOjpEOjpnKCkKIAotICAvLyBOTy1USFVOS1MtVGVzdDk6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ25vX3RodW5rczo6VGVzdDknICgxIGVudHJpZXMpLgotICAvLyBOTy1USFVOS1MtVGVzdDktTkVYVDogMSB8IHZvaWQgbm9fdGh1bmtzOjpUZXN0OTo6aCgpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICdub190aHVua3M6OlRlc3Q5JyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIG5vX3RodW5rczo6VGVzdDk6OmgoKQogCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183VGVzdDlAbm9fdGh1bmtzQEA2QkFAQEAiCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183VGVzdDlAbm9fdGh1bmtzQEA2QkRAMUBAIgpAQCAtMjMwLDYgKzIxNCw3IEBACiB9OwogCiBUZXN0OSB0OTsKK3ZvaWQgdXNlKFRlc3Q5ICpvYmopIHsgb2JqLT5oKCk7IH0KIH0KIAogbmFtZXNwYWNlIHB1cmVfdmlydHVhbCB7CkBAIC0yNDAsMTYgKzIyNSwxNiBAQAogCiAKIHN0cnVjdCBUZXN0MTogQSwgRCB7Ci0gIC8vIFBVUkUtVklSVFVBTC1UZXN0MTogVkZUYWJsZSBmb3IgJ0EnIGluICdwdXJlX3ZpcnR1YWw6OlRlc3QxJyAoMSBlbnRyaWVzKQotICAvLyBQVVJFLVZJUlRVQUwtVGVzdDEtTkVYVDogMCB8IHZvaWQgQTo6ZigpCisgIC8vIENIRUNLOiBWRlRhYmxlIGZvciAnQScgaW4gJ3B1cmVfdmlydHVhbDo6VGVzdDEnICgxIGVudHJ5KQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKIAotICAvLyBQVVJFLVZJUlRVQUwtVGVzdDE6IFZGVGFibGUgZm9yICdwdXJlX3ZpcnR1YWw6OkQnIGluICdwdXJlX3ZpcnR1YWw6OlRlc3QxJyAoMiBlbnRyaWVzKQotICAvLyBQVVJFLVZJUlRVQUwtVGVzdDEtTkVYVDogMCB8IHZvaWQgcHVyZV92aXJ0dWFsOjpUZXN0MTo6ZygpCi0gIC8vIFBVUkUtVklSVFVBTC1UZXN0MS1ORVhUOiAxIHwgdm9pZCBwdXJlX3ZpcnR1YWw6OkQ6OmgoKQorICAvLyBDSEVDSzogVkZUYWJsZSBmb3IgJ3B1cmVfdmlydHVhbDo6RCcgaW4gJ3B1cmVfdmlydHVhbDo6VGVzdDEnICgyIGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIHB1cmVfdmlydHVhbDo6VGVzdDE6OmcoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBwdXJlX3ZpcnR1YWw6OkQ6OmgoKQogCi0gIC8vIFBVUkUtVklSVFVBTC1UZXN0MTogVkZUYWJsZSBpbmRpY2VzIGZvciAncHVyZV92aXJ0dWFsOjpUZXN0MScgKDEgZW50cmllcykuCi0gIC8vIFBVUkUtVklSVFVBTC1UZXN0MS1ORVhUOiB2aWEgdmZwdHIgYXQgb2Zmc2V0IDQKLSAgLy8gUFVSRS1WSVJUVUFMLVRlc3QxLU5FWFQ6IDAgfCB2b2lkIHB1cmVfdmlydHVhbDo6VGVzdDE6OmcoKQorICAvLyBDSEVDSzogVkZUYWJsZSBpbmRpY2VzIGZvciAncHVyZV92aXJ0dWFsOjpUZXN0MScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiB2aWEgdmZwdHIgYXQgb2Zmc2V0IDQKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgcHVyZV92aXJ0dWFsOjpUZXN0MTo6ZygpCiAKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdUZXN0MUBwdXJlX3ZpcnR1YWxAQDZCQUBAQCIKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdUZXN0MUBwdXJlX3ZpcnR1YWxAQDZCREAxQEAiCkBAIC0yNjAsMjUgKzI0NSwyNiBAQAogfTsKIAogVGVzdDEgdDE7Cit2b2lkIHVzZShUZXN0MSAqb2JqKSB7IG9iai0+ZygpOyB9CiB9CiAKIG5hbWVzcGFjZSB0aGlzX2FkanVzdG1lbnQgewogCiAvLyBPdmVycmlkZXMgbWV0aG9kcyBvZiB0d28gYmFzZXMgYXQgdGhlIHNhbWUgdGltZSwgdGh1cyBuZWVkaW5nIHRodW5rcy4KIHN0cnVjdCBUZXN0MSA6IEIsIEMgewotICAvLyBUSElTLVRIVU5LUy1UZXN0MTogVkZUYWJsZSBmb3IgJ0InIGluICd0aGlzX2FkanVzdG1lbnQ6OlRlc3QxJyAoMiBlbnRyaWVzKS4KLSAgLy8gVEhJUy1USFVOS1MtVGVzdDEtTkVYVDogMCB8IHZvaWQgdGhpc19hZGp1c3RtZW50OjpUZXN0MTo6ZygpCi0gIC8vIFRISVMtVEhVTktTLVRlc3QxLU5FWFQ6IDEgfCB2b2lkIEI6OmgoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0InIGluICd0aGlzX2FkanVzdG1lbnQ6OlRlc3QxJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgdGhpc19hZGp1c3RtZW50OjpUZXN0MTo6ZygpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEI6OmgoKQogCi0gIC8vIFRISVMtVEhVTktTLVRlc3QxOiBWRlRhYmxlIGZvciAnQycgaW4gJ3RoaXNfYWRqdXN0bWVudDo6VGVzdDEnICgxIGVudHJpZXMpLgotICAvLyBUSElTLVRIVU5LUy1UZXN0MS1ORVhUOiAwIHwgdm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QxOjpnKCkKLSAgLy8gVEhJUy1USFVOS1MtVGVzdDEtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0MnIGluICd0aGlzX2FkanVzdG1lbnQ6OlRlc3QxJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIHRoaXNfYWRqdXN0bWVudDo6VGVzdDE6OmcoKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCiAKLSAgLy8gVEhJUy1USFVOS1MtVGVzdDE6IFRodW5rcyBmb3IgJ3ZvaWQgdGhpc19hZGp1c3RtZW50OjpUZXN0MTo6ZygpJyAoMSBlbnRyeSkuCi0gIC8vIFRISVMtVEhVTktTLVRlc3QxLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTEFCRUw6IFRodW5rcyBmb3IgJ3ZvaWQgdGhpc19hZGp1c3RtZW50OjpUZXN0MTo6ZygpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KIAotICAvLyBUSElTLVRIVU5LUy1UZXN0MTogVkZUYWJsZSBpbmRpY2VzIGZvciAndGhpc19hZGp1c3RtZW50OjpUZXN0MScgKDEgZW50cmllcykuCi0gIC8vIFRISVMtVEhVTktTLVRlc3QxLU5FWFQ6IDAgfCB2b2lkIHRoaXNfYWRqdXN0bWVudDo6VGVzdDE6OmcoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBpbmRpY2VzIGZvciAndGhpc19hZGp1c3RtZW50OjpUZXN0MScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QxOjpnKCkKIAogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1Rlc3QxQHRoaXNfYWRqdXN0bWVudEBANkJCQEBAIgogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1Rlc3QxQHRoaXNfYWRqdXN0bWVudEBANkJDQEBAIgpAQCAtMjg3LDI1ICsyNzMsMjYgQEAKIH07CiAKIFRlc3QxIHQxOwordm9pZCB1c2UoVGVzdDEgKm9iaikgeyBvYmotPmcoKTsgfQogCiBzdHJ1Y3QgVGVzdDIgOiBBLCBCLCBDIHsKLSAgLy8gVEhJUy1USFVOS1MtVGVzdDI6IFZGVGFibGUgZm9yICdBJyBpbiAndGhpc19hZGp1c3RtZW50OjpUZXN0MicgKDEgZW50cmllcykuCi0gIC8vIFRISVMtVEhVTktTLVRlc3QyLU5FWFQ6IDAgfCB2b2lkIEE6OmYoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICd0aGlzX2FkanVzdG1lbnQ6OlRlc3QyJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEE6OmYoKQogCi0gIC8vIFRISVMtVEhVTktTLVRlc3QyOiBWRlRhYmxlIGZvciAnQicgaW4gJ3RoaXNfYWRqdXN0bWVudDo6VGVzdDInICgyIGVudHJpZXMpLgotICAvLyBUSElTLVRIVU5LUy1UZXN0Mi1ORVhUOiAwIHwgdm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QyOjpnKCkKLSAgLy8gVEhJUy1USFVOS1MtVGVzdDItTkVYVDogMSB8IHZvaWQgQjo6aCgpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQicgaW4gJ3RoaXNfYWRqdXN0bWVudDo6VGVzdDInICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QyOjpnKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQjo6aCgpCiAKLSAgLy8gVEhJUy1USFVOS1MtVGVzdDI6IFZGVGFibGUgZm9yICdDJyBpbiAndGhpc19hZGp1c3RtZW50OjpUZXN0MicgKDEgZW50cmllcykuCi0gIC8vIFRISVMtVEhVTktTLVRlc3QyLU5FWFQ6IDAgfCB2b2lkIHRoaXNfYWRqdXN0bWVudDo6VGVzdDI6OmcoKQotICAvLyBUSElTLVRIVU5LUy1UZXN0Mi1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQycgaW4gJ3RoaXNfYWRqdXN0bWVudDo6VGVzdDInICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgdGhpc19hZGp1c3RtZW50OjpUZXN0Mjo6ZygpCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KIAotICAvLyBUSElTLVRIVU5LUy1UZXN0MjogVGh1bmtzIGZvciAndm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QyOjpnKCknICgxIGVudHJ5KS4KLSAgLy8gVEhJUy1USFVOS1MtVGVzdDItTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QyOjpnKCknICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQogCi0gIC8vIFRISVMtVEhVTktTLVRlc3QyOiBWRlRhYmxlIGluZGljZXMgZm9yICd0aGlzX2FkanVzdG1lbnQ6OlRlc3QyJyAoMSBlbnRyaWVzKS4KLSAgLy8gVEhJUy1USFVOS1MtVGVzdDItTkVYVDogdmlhIHZmcHRyIGF0IG9mZnNldCA0Ci0gIC8vIFRISVMtVEhVTktTLVRlc3QyLU5FWFQ6IDAgfCB2b2lkIHRoaXNfYWRqdXN0bWVudDo6VGVzdDI6OmcoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBpbmRpY2VzIGZvciAndGhpc19hZGp1c3RtZW50OjpUZXN0MicgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiB2aWEgdmZwdHIgYXQgb2Zmc2V0IDQKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgdGhpc19hZGp1c3RtZW50OjpUZXN0Mjo6ZygpCiAKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdUZXN0MkB0aGlzX2FkanVzdG1lbnRAQDZCQUBAQCIKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdUZXN0MkB0aGlzX2FkanVzdG1lbnRAQDZCQkBAQCIKQEAgLTMxNSw0MiArMzAyLDQ0IEBACiB9OwogCiBUZXN0MiB0MjsKK3ZvaWQgdXNlKFRlc3QyICpvYmopIHsgb2JqLT5nKCk7IH0KIAogLy8gT3ZlcnJpZGVzIG1ldGhvZHMgb2YgdHdvIGJhc2VzIGF0IHRoZSBzYW1lIHRpbWUsIHRodXMgbmVlZGluZyB0aHVua3MuCiBzdHJ1Y3QgVGVzdDM6IG5vX3RodW5rczo6VGVzdDEsIG5vX3RodW5rczo6VGVzdDIgewotICAvLyBUSElTLVRIVU5LUy1UZXN0MzogVkZUYWJsZSBmb3IgJ0EnIGluICdub190aHVua3M6OlRlc3QxJyBpbiAndGhpc19hZGp1c3RtZW50OjpUZXN0MycgKDEgZW50cmllcykuCi0gIC8vIFRISVMtVEhVTktTLVRlc3QzLU5FWFQ6IDAgfCB2b2lkIHRoaXNfYWRqdXN0bWVudDo6VGVzdDM6OmYoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdub190aHVua3M6OlRlc3QxJyBpbiAndGhpc19hZGp1c3RtZW50OjpUZXN0MycgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QzOjpmKCkKIAotICAvLyBUSElTLVRIVU5LUy1UZXN0MzogVkZUYWJsZSBmb3IgJ0InIGluICdub190aHVua3M6OlRlc3QxJyBpbiAndGhpc19hZGp1c3RtZW50OjpUZXN0MycgKDIgZW50cmllcykuCi0gIC8vIFRISVMtVEhVTktTLVRlc3QzLU5FWFQ6IDAgfCB2b2lkIHRoaXNfYWRqdXN0bWVudDo6VGVzdDM6OmcoKQotICAvLyBUSElTLVRIVU5LUy1UZXN0My1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdCJyBpbiAnbm9fdGh1bmtzOjpUZXN0MScgaW4gJ3RoaXNfYWRqdXN0bWVudDo6VGVzdDMnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QzOjpnKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQjo6aCgpCiAKLSAgLy8gVEhJUy1USFVOS1MtVGVzdDM6IFZGVGFibGUgZm9yICdBJyBpbiAnbm9fdGh1bmtzOjpUZXN0MicgaW4gJ3RoaXNfYWRqdXN0bWVudDo6VGVzdDMnICgxIGVudHJpZXMpLgotICAvLyBUSElTLVRIVU5LUy1UZXN0My1ORVhUOiAwIHwgdm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QzOjpmKCkKLSAgLy8gVEhJUy1USFVOS1MtVGVzdDMtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdub190aHVua3M6OlRlc3QyJyBpbiAndGhpc19hZGp1c3RtZW50OjpUZXN0MycgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QzOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQogCi0gIC8vIFRISVMtVEhVTktTLVRlc3QzOiBUaHVua3MgZm9yICd2b2lkIHRoaXNfYWRqdXN0bWVudDo6VGVzdDM6OmYoKScgKDEgZW50cnkpLgotICAvLyBUSElTLVRIVU5LUy1UZXN0My1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogLTggbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2b2lkIHRoaXNfYWRqdXN0bWVudDo6VGVzdDM6OmYoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogLTggbm9uLXZpcnR1YWxdCiAKLSAgLy8gVEhJUy1USFVOS1MtVGVzdDM6IFZGVGFibGUgZm9yICdCJyBpbiAnbm9fdGh1bmtzOjpUZXN0MicgaW4gJ3RoaXNfYWRqdXN0bWVudDo6VGVzdDMnICgyIGVudHJpZXMpLgotICAvLyBUSElTLVRIVU5LUy1UZXN0My1ORVhUOiAwIHwgdm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QzOjpnKCkKLSAgLy8gVEhJUy1USFVOS1MtVGVzdDMtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQotICAvLyBUSElTLVRIVU5LUy1UZXN0My1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdCJyBpbiAnbm9fdGh1bmtzOjpUZXN0MicgaW4gJ3RoaXNfYWRqdXN0bWVudDo6VGVzdDMnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QzOjpnKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKIAotICAvLyBUSElTLVRIVU5LUy1UZXN0MzogVGh1bmtzIGZvciAndm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QzOjpnKCknICgxIGVudHJ5KS4KLSAgLy8gVEhJUy1USFVOS1MtVGVzdDMtTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndm9pZCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QzOjpnKCknICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQogCi0gIC8vIFRISVMtVEhVTktTLVRlc3QzOiBWRlRhYmxlIGluZGljZXMgZm9yICd0aGlzX2FkanVzdG1lbnQ6OlRlc3QzJyAoMiBlbnRyaWVzKS4KLSAgLy8gVEhJUy1USFVOS1MtVGVzdDMtTkVYVDogdmlhIHZmcHRyIGF0IG9mZnNldCAwCi0gIC8vIFRISVMtVEhVTktTLVRlc3QzLU5FWFQ6IDAgfCB2b2lkIHRoaXNfYWRqdXN0bWVudDo6VGVzdDM6OmYoKQotICAvLyBUSElTLVRIVU5LUy1UZXN0My1ORVhUOiB2aWEgdmZwdHIgYXQgb2Zmc2V0IDQKLSAgLy8gVEhJUy1USFVOS1MtVGVzdDMtTkVYVDogMCB8IHZvaWQgdGhpc19hZGp1c3RtZW50OjpUZXN0Mzo6ZygpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICd0aGlzX2FkanVzdG1lbnQ6OlRlc3QzJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogdmlhIHZmcHRyIGF0IG9mZnNldCAwCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIHRoaXNfYWRqdXN0bWVudDo6VGVzdDM6OmYoKQorICAvLyBDSEVDSy1ORVhUOiB2aWEgdmZwdHIgYXQgb2Zmc2V0IDQKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgdGhpc19hZGp1c3RtZW50OjpUZXN0Mzo6ZygpCiAKICAgdmlydHVhbCB2b2lkIGYoKTsKICAgdmlydHVhbCB2b2lkIGcoKTsKIH07CiAKIFRlc3QzIHQzOwordm9pZCB1c2UoVGVzdDMgKm9iaikgeyBvYmotPmcoKTsgfQogfQogCiBuYW1lc3BhY2UgdmR0b3IgewpAQCAtMzY0LDIzICszNTMsMjQgQEAKIH07CiAKIHN0cnVjdCBUZXN0MyA6IFRlc3QxLCBUZXN0MiB7Ci0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0MzogVkZUYWJsZSBmb3IgJ3ZkdG9yOjpUZXN0MScgaW4gJ3ZkdG9yOjpUZXN0MycgKDIgZW50cmllcykuCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0My1ORVhUOiAwIHwgdmR0b3I6OlRlc3QzOjp+VGVzdDMoKSBbc2NhbGFyIGRlbGV0aW5nXQotICAvLyBWRFRPUi1USFVOS1MtVGVzdDMtTkVYVDogMSB8IHZvaWQgdmR0b3I6OlRlc3QxOjp6MSgpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAndmR0b3I6OlRlc3QxJyBpbiAndmR0b3I6OlRlc3QzJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZkdG9yOjpUZXN0Mzo6flRlc3QzKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgdmR0b3I6OlRlc3QxOjp6MSgpCiAKLSAgLy8gVkRUT1ItVEhVTktTLVRlc3QzOiBWRlRhYmxlIGZvciAndmR0b3I6OlRlc3QyJyBpbiAndmR0b3I6OlRlc3QzJyAoMSBlbnRyaWVzKS4KLSAgLy8gVkRUT1ItVEhVTktTLVRlc3QzLU5FWFQ6IDAgfCB2ZHRvcjo6VGVzdDM6On5UZXN0MygpIFtzY2FsYXIgZGVsZXRpbmddCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0My1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAndmR0b3I6OlRlc3QyJyBpbiAndmR0b3I6OlRlc3QzJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2ZHRvcjo6VGVzdDM6On5UZXN0MygpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KIAotICAvLyBWRFRPUi1USFVOS1MtVGVzdDM6IFRodW5rcyBmb3IgJ3ZkdG9yOjpUZXN0Mzo6flRlc3QzKCknICgxIGVudHJ5KS4KLSAgLy8gVkRUT1ItVEhVTktTLVRlc3QzLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTEFCRUw6IFRodW5rcyBmb3IgJ3ZkdG9yOjpUZXN0Mzo6flRlc3QzKCknICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQogCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0MzogVkZUYWJsZSBpbmRpY2VzIGZvciAndmR0b3I6OlRlc3QzJyAoMSBlbnRyaWVzKS4KLSAgLy8gVkRUT1ItVEhVTktTLVRlc3QzLU5FWFQ6IDAgfCB2ZHRvcjo6VGVzdDM6On5UZXN0MygpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICd2ZHRvcjo6VGVzdDMnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZkdG9yOjpUZXN0Mzo6flRlc3QzKCkgW3NjYWxhciBkZWxldGluZ10KICAgdmlydHVhbCB+VGVzdDMoKTsKIH07CiAKIFRlc3QzIHQzOwordm9pZCB1c2UoVGVzdDMgKm9iaikgeyBkZWxldGUgb2JqOyB9CiAKIHN0cnVjdCBUZXN0NCB7CiAgIC8vIE5vIHZpcnR1YWwgZGVzdHJ1Y3RvciBoZXJlIQpAQCAtMzkwLDYxICszODAsNjQgQEAKIHN0cnVjdCBUZXN0NSA6IFRlc3Q0LCBUZXN0MiB7CiAgIC8vIEltcGxpY2l0IHZpcnR1YWwgZHRvciBoZXJlIQogCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0NTogVkZUYWJsZSBmb3IgJ3ZkdG9yOjpUZXN0NCcgaW4gJ3ZkdG9yOjpUZXN0NScgKDEgZW50cmllcykuCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0NS1ORVhUOiAwIHwgdm9pZCB2ZHRvcjo6VGVzdDQ6Ono0KCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICd2ZHRvcjo6VGVzdDQnIGluICd2ZHRvcjo6VGVzdDUnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgdmR0b3I6OlRlc3Q0Ojp6NCgpCiAKLSAgLy8gVkRUT1ItVEhVTktTLVRlc3Q1OiBWRlRhYmxlIGZvciAndmR0b3I6OlRlc3QyJyBpbiAndmR0b3I6OlRlc3Q1JyAoMSBlbnRyaWVzKS4KLSAgLy8gVkRUT1ItVEhVTktTLVRlc3Q1LU5FWFQ6IDAgfCB2ZHRvcjo6VGVzdDU6On5UZXN0NSgpIFtzY2FsYXIgZGVsZXRpbmddCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0NS1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAndmR0b3I6OlRlc3QyJyBpbiAndmR0b3I6OlRlc3Q1JyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2ZHRvcjo6VGVzdDU6On5UZXN0NSgpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KIAotICAvLyBWRFRPUi1USFVOS1MtVGVzdDU6IFRodW5rcyBmb3IgJ3ZkdG9yOjpUZXN0NTo6flRlc3Q1KCknICgxIGVudHJ5KS4KLSAgLy8gVkRUT1ItVEhVTktTLVRlc3Q1LU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTEFCRUw6IFRodW5rcyBmb3IgJ3ZkdG9yOjpUZXN0NTo6flRlc3Q1KCknICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQogCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0NTogVkZUYWJsZSBpbmRpY2VzIGZvciAndmR0b3I6OlRlc3Q1JyAoMSBlbnRyaWVzKS4KLSAgLy8gVkRUT1ItVEhVTktTLVRlc3Q1LU5FWFQ6IC0tIGFjY2Vzc2libGUgdmlhIHZmcHRyIGF0IG9mZnNldCA0IC0tCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0NS1ORVhUOiAwIHwgdmR0b3I6OlRlc3Q1Ojp+VGVzdDUoKSBbc2NhbGFyIGRlbGV0aW5nXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBpbmRpY2VzIGZvciAndmR0b3I6OlRlc3Q1JyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IC0tIGFjY2Vzc2libGUgdmlhIHZmcHRyIGF0IG9mZnNldCA0IC0tCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2ZHRvcjo6VGVzdDU6On5UZXN0NSgpIFtzY2FsYXIgZGVsZXRpbmddCiB9OwogCiBUZXN0NSB0NTsKK3ZvaWQgdXNlKFRlc3Q1ICpvYmopIHsgZGVsZXRlIG9iajsgfQogCiBzdHJ1Y3QgVGVzdDYgOiBUZXN0NCwgVGVzdDIgewogICAvLyBJbXBsaWNpdCB2aXJ0dWFsIGR0b3IgaGVyZSEKIAotICAvLyBWRFRPUi1USFVOS1MtVGVzdDY6IFZGVGFibGUgZm9yICd2ZHRvcjo6VGVzdDQnIGluICd2ZHRvcjo6VGVzdDYnICgxIGVudHJpZXMpLgotICAvLyBWRFRPUi1USFVOS1MtVGVzdDYtTkVYVDogMCB8IHZvaWQgdmR0b3I6OlRlc3Q0Ojp6NCgpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAndmR0b3I6OlRlc3Q0JyBpbiAndmR0b3I6OlRlc3Q2JyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIHZkdG9yOjpUZXN0NDo6ejQoKQogCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0NjogVkZUYWJsZSBmb3IgJ3ZkdG9yOjpUZXN0MicgaW4gJ3ZkdG9yOjpUZXN0NicgKDEgZW50cmllcykuCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0Ni1ORVhUOiAwIHwgdmR0b3I6OlRlc3Q2Ojp+VGVzdDYoKSBbc2NhbGFyIGRlbGV0aW5nXQotICAvLyBWRFRPUi1USFVOS1MtVGVzdDYtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ3ZkdG9yOjpUZXN0MicgaW4gJ3ZkdG9yOjpUZXN0NicgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdmR0b3I6OlRlc3Q2Ojp+VGVzdDYoKSBbc2NhbGFyIGRlbGV0aW5nXQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCiAKLSAgLy8gVkRUT1ItVEhVTktTLVRlc3Q2OiBUaHVua3MgZm9yICd2ZHRvcjo6VGVzdDY6On5UZXN0NigpJyAoMSBlbnRyeSkuCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0Ni1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2ZHRvcjo6VGVzdDY6On5UZXN0NigpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KIAotICAvLyBWRFRPUi1USFVOS1MtVGVzdDY6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3ZkdG9yOjpUZXN0NicgKDEgZW50cmllcykuCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0Ni1ORVhUOiAtLSBhY2Nlc3NpYmxlIHZpYSB2ZnB0ciBhdCBvZmZzZXQgNCAtLQotICAvLyBWRFRPUi1USFVOS1MtVGVzdDYtTkVYVDogMCB8IHZkdG9yOjpUZXN0Njo6flRlc3Q2KCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3ZkdG9yOjpUZXN0NicgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAtLSBhY2Nlc3NpYmxlIHZpYSB2ZnB0ciBhdCBvZmZzZXQgNCAtLQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdmR0b3I6OlRlc3Q2Ojp+VGVzdDYoKSBbc2NhbGFyIGRlbGV0aW5nXQogfTsKIAogVGVzdDYgdDY7Cit2b2lkIHVzZShUZXN0NiAqb2JqKSB7IGRlbGV0ZSBvYmo7IH0KIAogc3RydWN0IFRlc3Q3IDogVGVzdDUgewotICAvLyBWRFRPUi1USFVOS1MtVGVzdDc6IFZGVGFibGUgZm9yICd2ZHRvcjo6VGVzdDQnIGluICd2ZHRvcjo6VGVzdDUnIGluICd2ZHRvcjo6VGVzdDcnICgxIGVudHJpZXMpLgotICAvLyBWRFRPUi1USFVOS1MtVGVzdDctTkVYVDogMCB8IHZvaWQgdmR0b3I6OlRlc3Q0Ojp6NCgpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAndmR0b3I6OlRlc3Q0JyBpbiAndmR0b3I6OlRlc3Q1JyBpbiAndmR0b3I6OlRlc3Q3JyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIHZkdG9yOjpUZXN0NDo6ejQoKQogCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0NzogVkZUYWJsZSBmb3IgJ3ZkdG9yOjpUZXN0MicgaW4gJ3ZkdG9yOjpUZXN0NScgaW4gJ3ZkdG9yOjpUZXN0NycgKDEgZW50cmllcykuCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0Ny1ORVhUOiAwIHwgdmR0b3I6OlRlc3Q3Ojp+VGVzdDcoKSBbc2NhbGFyIGRlbGV0aW5nXQotICAvLyBWRFRPUi1USFVOS1MtVGVzdDctTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ3ZkdG9yOjpUZXN0MicgaW4gJ3ZkdG9yOjpUZXN0NScgaW4gJ3ZkdG9yOjpUZXN0NycgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdmR0b3I6OlRlc3Q3Ojp+VGVzdDcoKSBbc2NhbGFyIGRlbGV0aW5nXQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCiAKLSAgLy8gVkRUT1ItVEhVTktTLVRlc3Q3OiBUaHVua3MgZm9yICd2ZHRvcjo6VGVzdDc6On5UZXN0NygpJyAoMSBlbnRyeSkuCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0Ny1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2ZHRvcjo6VGVzdDc6On5UZXN0NygpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KIAotICAvLyBWRFRPUi1USFVOS1MtVGVzdDc6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3ZkdG9yOjpUZXN0NycgKDEgZW50cmllcykuCi0gIC8vIFZEVE9SLVRIVU5LUy1UZXN0Ny1ORVhUOiAtLSBhY2Nlc3NpYmxlIHZpYSB2ZnB0ciBhdCBvZmZzZXQgNCAtLQotICAvLyBWRFRPUi1USFVOS1MtVGVzdDctTkVYVDogMCB8IHZkdG9yOjpUZXN0Nzo6flRlc3Q3KCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3ZkdG9yOjpUZXN0NycgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAtLSBhY2Nlc3NpYmxlIHZpYSB2ZnB0ciBhdCBvZmZzZXQgNCAtLQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdmR0b3I6OlRlc3Q3Ojp+VGVzdDcoKSBbc2NhbGFyIGRlbGV0aW5nXQogICB2aXJ0dWFsIH5UZXN0NygpOwogfTsKIAogVGVzdDcgdDc7Cit2b2lkIHVzZShUZXN0NyAqb2JqKSB7IGRlbGV0ZSBvYmo7IH0KIAogfQogCkBAIC00NTYsMTQgKzQ0OSwxNyBAQAogfTsKIAogc3RydWN0IFRlc3QxIDogUmV0MSB7Ci0gIC8vIFJFVC1USFVOS1MtVGVzdDE6IFZGVGFibGUgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6UmV0MScgaW4gJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0MScgKDMgZW50cmllcykuCi0gIC8vIFJFVC1USFVOS1MtVGVzdDEtTkVYVDogMCB8IHRoaXNfYWRqdXN0bWVudDo6VGVzdDEgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0MTo6Zm9vKCkKLSAgLy8gUkVULVRIVU5LUy1UZXN0MS1ORVhUOiAgICAgW3JldHVybiBhZGp1c3RtZW50OiA0IG5vbi12aXJ0dWFsXQotICAvLyBSRVQtVEhVTktTLVRlc3QxLU5FWFQ6IDEgfCB2b2lkIHJldHVybl9hZGp1c3RtZW50OjpSZXQxOjp6KCkKLSAgLy8gUkVULVRIVU5LUy1UZXN0MS1ORVhUOiAyIHwgdGhpc19hZGp1c3RtZW50OjpUZXN0MSAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QxOjpmb28oKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpSZXQxJyBpbiAncmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QxJyAoMyBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHRoaXNfYWRqdXN0bWVudDo6VGVzdDEgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0MTo6Zm9vKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IEMgKicpOiA0IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MTo6eigpCisgIC8vIENIRUNLLU5FWFQ6IDIgfCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QxICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDE6OmZvbygpCiAKLSAgLy8gUkVULVRIVU5LUy1UZXN0MTogVkZUYWJsZSBpbmRpY2VzIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QxJyAoMSBlbnRyaWVzKS4KLSAgLy8gUkVULVRIVU5LUy1UZXN0MS1ORVhUOiAyIHwgdGhpc19hZGp1c3RtZW50OjpUZXN0MSAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QxOjpmb28oKQorICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndGhpc19hZGp1c3RtZW50OjpUZXN0MSAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QxOjpmb28oKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgQyAqJyk6IDQgbm9uLXZpcnR1YWxdCisKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0MScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAyIHwgdGhpc19hZGp1c3RtZW50OjpUZXN0MSAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QxOjpmb28oKQogCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183VGVzdDFAcmV0dXJuX2FkanVzdG1lbnRAQDZCQCIKIApAQCAtNDcxLDEwOSArNDY3LDE0MyBAQAogfTsKIAogVGVzdDEgdDE7Cit2b2lkIHVzZShUZXN0MSAqb2JqKSB7IG9iai0+Zm9vKCk7IH0KIAogc3RydWN0IFJldDIgOiBCLCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QxIHsgfTsKIAogc3RydWN0IFRlc3QyIDogVGVzdDEgewotICAvLyBSRVQtVEhVTktTLVRlc3QyOiBWRlRhYmxlIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlJldDEnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDEnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDInICg0IGVudHJpZXMpLgotICAvLyBSRVQtVEhVTktTLVRlc3QyLU5FWFQ6IDAgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QyOjpmb28oKQotICAvLyBSRVQtVEhVTktTLVRlc3QyLU5FWFQ6ICAgICBbcmV0dXJuIGFkanVzdG1lbnQ6IDggbm9uLXZpcnR1YWxdCi0gIC8vIFJFVC1USFVOS1MtVGVzdDItTkVYVDogMSB8IHZvaWQgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDE6OnooKQotICAvLyBSRVQtVEhVTktTLVRlc3QyLU5FWFQ6IDIgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QyOjpmb28oKQotICAvLyBSRVQtVEhVTktTLVRlc3QyLU5FWFQ6ICAgICBbcmV0dXJuIGFkanVzdG1lbnQ6IDQgbm9uLXZpcnR1YWxdCi0gIC8vIFJFVC1USFVOS1MtVGVzdDItTkVYVDogMyB8IHJldHVybl9hZGp1c3RtZW50OjpSZXQyICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDI6OmZvbygpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlJldDEnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDEnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDInICg0IGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDIgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0Mjo6Zm9vKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IEMgKicpOiA4IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MTo6eigpCisgIC8vIENIRUNLLU5FWFQ6IDIgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QyOjpmb28oKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgdGhpc19hZGp1c3RtZW50OjpUZXN0MSAqJyk6IDQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6IDMgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QyOjpmb28oKQogCi0gIC8vIFJFVC1USFVOS1MtVGVzdDI6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0MicgKDEgZW50cmllcykuCi0gIC8vIFJFVC1USFVOS1MtVGVzdDItTkVYVDogMyB8IHJldHVybl9hZGp1c3RtZW50OjpSZXQyICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDI6OmZvbygpCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QyOjpmb28oKScgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbcmV0dXJuIGFkanVzdG1lbnQgKHRvIHR5cGUgJ3N0cnVjdCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QxIConKTogNCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IEMgKicpOiA4IG5vbi12aXJ0dWFsXQorCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDInICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMyB8IHJldHVybl9hZGp1c3RtZW50OjpSZXQyICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDI6OmZvbygpCiAKICAgdmlydHVhbCBSZXQyKiBmb28oKTsKIH07CiAKIFRlc3QyIHQyOwordm9pZCB1c2UoVGVzdDIgKm9iaikgeyBvYmotPmZvbygpOyB9CiAKIHN0cnVjdCBUZXN0MzogQiwgUmV0MSB7Ci0gIC8vIFJFVC1USFVOS1MtVGVzdDM6IFZGVGFibGUgZm9yICdCJyBpbiAncmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QzJyAoMiBlbnRyaWVzKS4KLSAgLy8gUkVULVRIVU5LUy1UZXN0My1ORVhUOiAwIHwgdm9pZCBCOjpnKCkKLSAgLy8gUkVULVRIVU5LUy1UZXN0My1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdCJyBpbiAncmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QzJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgQjo6ZygpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEI6OmgoKQogCi0gIC8vIFJFVC1USFVOS1MtVGVzdDM6IFZGVGFibGUgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6UmV0MScgaW4gJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0MycgKDMgZW50cmllcykuCi0gIC8vIFJFVC1USFVOS1MtVGVzdDMtTkVYVDogMCB8IHRoaXNfYWRqdXN0bWVudDo6VGVzdDEgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0Mzo6Zm9vKCkKLSAgLy8gUkVULVRIVU5LUy1UZXN0My1ORVhUOiAgICAgW3JldHVybiBhZGp1c3RtZW50OiA0IG5vbi12aXJ0dWFsXQotICAvLyBSRVQtVEhVTktTLVRlc3QzLU5FWFQ6IDEgfCB2b2lkIHJldHVybl9hZGp1c3RtZW50OjpSZXQxOjp6KCkKLSAgLy8gUkVULVRIVU5LUy1UZXN0My1ORVhUOiAyIHwgdGhpc19hZGp1c3RtZW50OjpUZXN0MSAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QzOjpmb28oKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpSZXQxJyBpbiAncmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QzJyAoMyBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHRoaXNfYWRqdXN0bWVudDo6VGVzdDEgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0Mzo6Zm9vKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IEMgKicpOiA0IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MTo6eigpCisgIC8vIENIRUNLLU5FWFQ6IDIgfCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QxICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDM6OmZvbygpCiAKLSAgLy8gUkVULVRIVU5LUy1UZXN0MzogVkZUYWJsZSBpbmRpY2VzIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QzJyAoMSBlbnRyaWVzKS4KLSAgLy8gUkVULVRIVU5LUy1UZXN0My1ORVhUOiB2aWEgdmZwdHIgYXQgb2Zmc2V0IDQKLSAgLy8gUkVULVRIVU5LUy1UZXN0My1ORVhUOiAyIHwgdGhpc19hZGp1c3RtZW50OjpUZXN0MSAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QzOjpmb28oKQorICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndGhpc19hZGp1c3RtZW50OjpUZXN0MSAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QzOjpmb28oKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgQyAqJyk6IDQgbm9uLXZpcnR1YWxdCisKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0MycgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiB2aWEgdmZwdHIgYXQgb2Zmc2V0IDQKKyAgLy8gQ0hFQ0stTkVYVDogMiB8IHRoaXNfYWRqdXN0bWVudDo6VGVzdDEgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0Mzo6Zm9vKCkKIAogICB2aXJ0dWFsIHRoaXNfYWRqdXN0bWVudDo6VGVzdDEqIGZvbygpOwogfTsKIAogVGVzdDMgdDM7Cit2b2lkIHVzZShUZXN0MyAqb2JqKSB7IG9iai0+Zm9vKCk7IH0KIAogc3RydWN0IFRlc3Q0IDogVGVzdDMgewotICAvLyBSRVQtVEhVTktTLVRlc3Q0OiBWRlRhYmxlIGZvciAnQicgaW4gJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0MycgaW4gJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0NCcgKDIgZW50cmllcykuCi0gIC8vIFJFVC1USFVOS1MtVGVzdDQtTkVYVDogMCB8IHZvaWQgQjo6ZygpCi0gIC8vIFJFVC1USFVOS1MtVGVzdDQtTkVYVDogMSB8IHZvaWQgQjo6aCgpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQicgaW4gJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0MycgaW4gJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0NCcgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEI6OmcoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBCOjpoKCkKIAotICAvLyBSRVQtVEhVTktTLVRlc3Q0OiBWRlRhYmxlIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlJldDEnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDMnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDQnICg0IGVudHJpZXMpLgotICAvLyBSRVQtVEhVTktTLVRlc3Q0LU5FWFQ6IDAgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q0Ojpmb28oKQotICAvLyBSRVQtVEhVTktTLVRlc3Q0LU5FWFQ6ICAgICBbcmV0dXJuIGFkanVzdG1lbnQ6IDggbm9uLXZpcnR1YWxdCi0gIC8vIFJFVC1USFVOS1MtVGVzdDQtTkVYVDogMSB8IHZvaWQgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDE6OnooKQotICAvLyBSRVQtVEhVTktTLVRlc3Q0LU5FWFQ6IDIgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q0Ojpmb28oKQotICAvLyBSRVQtVEhVTktTLVRlc3Q0LU5FWFQ6ICAgICBbcmV0dXJuIGFkanVzdG1lbnQ6IDQgbm9uLXZpcnR1YWxdCi0gIC8vIFJFVC1USFVOS1MtVGVzdDQtTkVYVDogMyB8IHJldHVybl9hZGp1c3RtZW50OjpSZXQyICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDQ6OmZvbygpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlJldDEnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDMnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDQnICg0IGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDIgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0NDo6Zm9vKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IEMgKicpOiA4IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MTo6eigpCisgIC8vIENIRUNLLU5FWFQ6IDIgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q0Ojpmb28oKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgdGhpc19hZGp1c3RtZW50OjpUZXN0MSAqJyk6IDQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6IDMgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q0Ojpmb28oKQogCi0gIC8vIFJFVC1USFVOS1MtVGVzdDQ6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0NCcgKDEgZW50cmllcykuCi0gIC8vIFJFVC1USFVOS1MtVGVzdDQtTkVYVDogLS0gYWNjZXNzaWJsZSB2aWEgdmZwdHIgYXQgb2Zmc2V0IDQgLS0KLSAgLy8gUkVULVRIVU5LUy1UZXN0NC1ORVhUOiAgIDMgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q0Ojpmb28oKQorICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlJldDIgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0NDo6Zm9vKCknICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgdGhpc19hZGp1c3RtZW50OjpUZXN0MSAqJyk6IDQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6IDEgfCBbcmV0dXJuIGFkanVzdG1lbnQgKHRvIHR5cGUgJ3N0cnVjdCBDIConKTogOCBub24tdmlydHVhbF0KKworICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBpbmRpY2VzIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q0JyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IC0tIGFjY2Vzc2libGUgdmlhIHZmcHRyIGF0IG9mZnNldCA0IC0tCisgIC8vIENIRUNLLU5FWFQ6IDMgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q0Ojpmb28oKQogCiAgIHZpcnR1YWwgUmV0MiogZm9vKCk7CiB9OwogCiBUZXN0NCB0NDsKK3ZvaWQgdXNlKFRlc3Q0ICpvYmopIHsgb2JqLT5mb28oKTsgfQogCiBzdHJ1Y3QgVGVzdDUgOiBSZXQxLCBUZXN0MSB7Ci0gIC8vIFJFVC1USFVOS1MtVGVzdDU6IFZGVGFibGUgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6UmV0MScgaW4gJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0NScgKDMgZW50cmllcykuCi0gIC8vIFJFVC1USFVOS1MtVGVzdDUtTkVYVDogMCB8IHJldHVybl9hZGp1c3RtZW50OjpSZXQyICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDU6OmZvbygpCi0gIC8vIFJFVC1USFVOS1MtVGVzdDUtTkVYVDogICAgIFtyZXR1cm4gYWRqdXN0bWVudDogOCBub24tdmlydHVhbF0KLSAgLy8gUkVULVRIVU5LUy1UZXN0NS1ORVhUOiAxIHwgdm9pZCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MTo6eigpCi0gIC8vIFJFVC1USFVOS1MtVGVzdDUtTkVYVDogMiB8IHJldHVybl9hZGp1c3RtZW50OjpSZXQyICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDU6OmZvbygpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlJldDEnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDUnICgzIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDIgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0NTo6Zm9vKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IEMgKicpOiA4IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MTo6eigpCisgIC8vIENIRUNLLU5FWFQ6IDIgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q1Ojpmb28oKQogCi0gIC8vIFJFVC1USFVOS1MtVGVzdDU6IFZGVGFibGUgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6UmV0MScgaW4gICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDEnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDUnICg0IGVudHJpZXMpLgotICAvLyBSRVQtVEhVTktTLVRlc3Q1LU5FWFQ6IDAgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q1Ojpmb28oKQotICAvLyBSRVQtVEhVTktTLVRlc3Q1LU5FWFQ6ICAgICBbcmV0dXJuIGFkanVzdG1lbnQ6IDggbm9uLXZpcnR1YWxdCi0gIC8vIFJFVC1USFVOS1MtVGVzdDUtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQotICAvLyBSRVQtVEhVTktTLVRlc3Q1LU5FWFQ6IDEgfCB2b2lkIHJldHVybl9hZGp1c3RtZW50OjpSZXQxOjp6KCkKLSAgLy8gUkVULVRIVU5LUy1UZXN0NS1ORVhUOiAyIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDIgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0NTo6Zm9vKCkKLSAgLy8gUkVULVRIVU5LUy1UZXN0NS1ORVhUOiAgICAgW3JldHVybiBhZGp1c3RtZW50OiA0IG5vbi12aXJ0dWFsXQotICAvLyBSRVQtVEhVTktTLVRlc3Q1LU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KLSAgLy8gUkVULVRIVU5LUy1UZXN0NS1ORVhUOiAzIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDIgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0NTo6Zm9vKCkKLSAgLy8gUkVULVRIVU5LUy1UZXN0NS1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q1Ojpmb28oKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgQyAqJyk6IDggbm9uLXZpcnR1YWxdCiAKLSAgLy8gUkVULVRIVU5LUy1UZXN0NTogVkZUYWJsZSBpbmRpY2VzIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q1JyAoMSBlbnRyaWVzKS4KLSAgLy8gUkVULVRIVU5LUy1UZXN0NS1ORVhUOiAyIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDIgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0NTo6Zm9vKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6UmV0MScgaW4gICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDEnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDUnICg0IGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDIgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0NTo6Zm9vKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IEMgKicpOiA4IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIHJldHVybl9hZGp1c3RtZW50OjpSZXQxOjp6KCkKKyAgLy8gQ0hFQ0stTkVYVDogMiB8IHJldHVybl9hZGp1c3RtZW50OjpSZXQyICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDU6OmZvbygpCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbcmV0dXJuIGFkanVzdG1lbnQgKHRvIHR5cGUgJ3N0cnVjdCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QxIConKTogNCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAzIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDIgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0NTo6Zm9vKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IHJldHVybl9hZGp1c3RtZW50OjpSZXQyIConKTogMCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQorCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q1Ojpmb28oKScgKDMgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbcmV0dXJuIGFkanVzdG1lbnQgKHRvIHR5cGUgJ3N0cnVjdCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MiAqJyk6IDAgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IHRoaXNfYWRqdXN0bWVudDo6VGVzdDEgKicpOiA0IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6IDIgfCBbcmV0dXJuIGFkanVzdG1lbnQgKHRvIHR5cGUgJ3N0cnVjdCBDIConKTogOCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQorCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDUnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMiB8IHJldHVybl9hZGp1c3RtZW50OjpSZXQyICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDU6OmZvbygpCiAKICAgdmlydHVhbCBSZXQyKiBmb28oKTsKIH07CiAKIFRlc3Q1IHQ1Owordm9pZCB1c2UoVGVzdDUgKm9iaikgeyBvYmotPmZvbygpOyB9CiAKIHN0cnVjdCBSZXQzIDogdGhpc19hZGp1c3RtZW50OjpUZXN0MSB7IH07CiAKIHN0cnVjdCBUZXN0NiA6IFRlc3QxIHsKICAgdmlydHVhbCBSZXQzKiBmb28oKTsKLSAgLy8gUkVULVRIVU5LUy1UZXN0NjogVkZUYWJsZSBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpSZXQxJyBpbiAncmV0dXJuX2FkanVzdG1lbnQ6OlRlc3QxJyBpbiAncmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q2JyAoNCBlbnRyaWVzKS4KLSAgLy8gUkVULVRIVU5LUy1UZXN0Ni1ORVhUOiAwIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDMgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0Njo6Zm9vKCkKLSAgLy8gUkVULVRIVU5LUy1UZXN0Ni1ORVhUOiAgICAgW3JldHVybiBhZGp1c3RtZW50OiA0IG5vbi12aXJ0dWFsXQotICAvLyBSRVQtVEhVTktTLVRlc3Q2LU5FWFQ6IDEgfCB2b2lkIHJldHVybl9hZGp1c3RtZW50OjpSZXQxOjp6KCkKLSAgLy8gUkVULVRIVU5LUy1UZXN0Ni1ORVhUOiAyIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDMgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0Njo6Zm9vKCkKLSAgLy8gUkVULVRIVU5LUy1UZXN0Ni1ORVhUOiAzIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDMgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0Njo6Zm9vKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6UmV0MScgaW4gJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0MScgaW4gJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0NicgKDQgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCByZXR1cm5fYWRqdXN0bWVudDo6UmV0MyAqcmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q2Ojpmb28oKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgQyAqJyk6IDQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIHJldHVybl9hZGp1c3RtZW50OjpSZXQxOjp6KCkKKyAgLy8gQ0hFQ0stTkVYVDogMiB8IHJldHVybl9hZGp1c3RtZW50OjpSZXQzICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDY6OmZvbygpCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbcmV0dXJuIGFkanVzdG1lbnQgKHRvIHR5cGUgJ3N0cnVjdCB0aGlzX2FkanVzdG1lbnQ6OlRlc3QxIConKTogMCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogMyB8IHJldHVybl9hZGp1c3RtZW50OjpSZXQzICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDY6OmZvbygpCiAKLSAgLy8gUkVULVRIVU5LUy1UZXN0NjogVkZUYWJsZSBpbmRpY2VzIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlRlc3Q2JyAoMSBlbnRyaWVzKS4KLSAgLy8gUkVULVRIVU5LUy1UZXN0Ni1ORVhUOiAzIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDMgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0Njo6Zm9vKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFRodW5rcyBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpSZXQzICpyZXR1cm5fYWRqdXN0bWVudDo6VGVzdDY6OmZvbygpJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IHRoaXNfYWRqdXN0bWVudDo6VGVzdDEgKicpOiAwIG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgQyAqJyk6IDQgbm9uLXZpcnR1YWxdCisKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpUZXN0NicgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAzIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlJldDMgKnJldHVybl9hZGp1c3RtZW50OjpUZXN0Njo6Zm9vKCkKIH07CiAKIFRlc3Q2IHQ2Owordm9pZCB1c2UoVGVzdDYgKm9iaikgeyBvYmotPmZvbygpOyB9CiAKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZ0YWJsZXMtcmV0dXJuLXRodW5rcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12dGFibGVzLXJldHVybi10aHVua3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTIxMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12dGFibGVzLXJldHVybi10aHVua3MuY3BwCkBAIC0wLDAgKzEsMTA2IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpICVzIC1lbWl0LWxsdm0gLW8gJXQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1mZHVtcC12dGFibGUtbGF5b3V0cyAyPiYxIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZGVEFCTEVTICVzCisvLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1HTE9CQUxTICVzIDwgJXQKKy8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNPREVHRU4gJXMgPCAldAorCituYW1lc3BhY2UgdGVzdDEgeworCisvLyBTb21lIGNvdmFyaWFudCB0eXBlcy4KK3N0cnVjdCBBIHsgaW50IGE7IH07CitzdHJ1Y3QgQiB7IGludCBiOyB9Oworc3RydWN0IEMgOiBBLCBCIHsgaW50IGM7IH07CitzdHJ1Y3QgRCA6IEMgeyBpbnQgZDsgfTsKK3N0cnVjdCBFIDogRCB7IGludCBlOyB9OworCisvLyBPbmUgYmFzZSBjbGFzcyBhbmQgdHdvIG92ZXJyaWRlcywgYWxsIHdpdGggY292YXJpYW50IHJldHVybiB0eXBlcy4KK3N0cnVjdCBIICAgICB7IHZpcnR1YWwgQiAqZm9vKCk7IH07CitzdHJ1Y3QgSSA6IEggeyB2aXJ0dWFsIEMgKmZvbygpOyB9Oworc3RydWN0IEogOiBJIHsgdmlydHVhbCBEICpmb28oKTsgSigpOyB9Oworc3RydWN0IEsgOiBKIHsgdmlydHVhbCBFICpmb28oKTsgSygpOyB9OworCitKOjpKKCkge30KKworLy8gVkZUQUJMRVMtTEFCRUw6IFZGVGFibGUgZm9yICd0ZXN0MTo6SCcgaW4gJ3Rlc3QxOjpJJyBpbiAndGVzdDE6OkonICgzIGVudHJpZXMpLgorLy8gVkZUQUJMRVMtTkVYVDogICAwIHwgdGVzdDE6OkQgKnRlc3QxOjpKOjpmb28oKQorLy8gVkZUQUJMRVMtTkVYVDogICAgICAgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgdGVzdDE6OkIgKicpOiA0IG5vbi12aXJ0dWFsXQorLy8gVkZUQUJMRVMtTkVYVDogICAxIHwgdGVzdDE6OkQgKnRlc3QxOjpKOjpmb28oKQorLy8gVkZUQUJMRVMtTkVYVDogICAgICAgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgdGVzdDE6OkMgKicpOiAwIG5vbi12aXJ0dWFsXQorLy8gVkZUQUJMRVMtTkVYVDogICAyIHwgdGVzdDE6OkQgKnRlc3QxOjpKOjpmb28oKQorCisvLyBHTE9CQUxTLUxBQkVMOiBAIlwwMT8/XzdKQHRlc3QxQEA2QkAiID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCBbMyB4IGk4Kl0KKy8vIEdMT0JBTFM6IEAiXDAxP2Zvb0BKQHRlc3QxQEBRQUVQQVVCQDJAWFoiCisvLyBHTE9CQUxTOiBAIlwwMT9mb29ASkB0ZXN0MUBAUUFFUEFVQ0AyQFhaIgorLy8gR0xPQkFMUzogQCJcMDE/Zm9vQEpAdGVzdDFAQFVBRVBBVURAMkBYWiIKKworSzo6SygpIHt9CisKKy8vIFZGVEFCTEVTLUxBQkVMOiBWRlRhYmxlIGZvciAndGVzdDE6OkgnIGluICd0ZXN0MTo6SScgaW4gJ3Rlc3QxOjpKJyBpbiAndGVzdDE6OksnICg0IGVudHJpZXMpLgorLy8gVkZUQUJMRVMtTkVYVDogICAwIHwgdGVzdDE6OkUgKnRlc3QxOjpLOjpmb28oKQorLy8gVkZUQUJMRVMtTkVYVDogICAgICAgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgdGVzdDE6OkIgKicpOiA0IG5vbi12aXJ0dWFsXQorLy8gVkZUQUJMRVMtTkVYVDogICAxIHwgdGVzdDE6OkUgKnRlc3QxOjpLOjpmb28oKQorLy8gVkZUQUJMRVMtTkVYVDogICAgICAgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgdGVzdDE6OkMgKicpOiAwIG5vbi12aXJ0dWFsXQorLy8gVkZUQUJMRVMtTkVYVDogICAyIHwgdGVzdDE6OkUgKnRlc3QxOjpLOjpmb28oKQorLy8gVkZUQUJMRVMtTkVYVDogICAgICAgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgdGVzdDE6OkQgKicpOiAwIG5vbi12aXJ0dWFsXQorLy8gVkZUQUJMRVMtTkVYVDogICAzIHwgdGVzdDE6OkUgKnRlc3QxOjpLOjpmb28oKQorCisvLyBPbmx5IEIgdG8gQyByZXF1aXJlcyBhZGp1c3RtZW50LCBidXQgd2UgZ2V0IDMgdGh1bmtzIGluIEsncyB2ZnRhYmxlLCB0d28gb2YKKy8vIHdoaWNoIGFyZSB0cml2aWFsLgorLy8gR0xPQkFMUy1MQUJFTDogQCJcMDE/P183S0B0ZXN0MUBANkJAIiA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzQgeCBpOCpdCisvLyBHTE9CQUxTOiBAIlwwMT9mb29AS0B0ZXN0MUBAUUFFUEFVQkAyQFhaIgorLy8gR0xPQkFMUzogQCJcMDE/Zm9vQEtAdGVzdDFAQFFBRVBBVUNAMkBYWiIKKy8vIEdMT0JBTFM6IEAiXDAxP2Zvb0BLQHRlc3QxQEBRQUVQQVVEQDJAWFoiCisvLyBHTE9CQUxTOiBAIlwwMT9mb29AS0B0ZXN0MUBAVUFFUEFVRUAyQFhaIgorCisvLyAgVGhpcyB0aHVuayBoYXMgYSByZXR1cm4gYWRqdXN0bWVudC4KKy8vIENPREVHRU4tTEFCRUw6IGRlZmluZSB7ey4qfX0gQCJcMDE/Zm9vQEtAdGVzdDFAQFFBRVBBVUJAMkBYWiIKKy8vIENPREVHRU46IGNhbGwge3suKn19IEAiXDAxP2Zvb0BLQHRlc3QxQEBVQUVQQVVFQDJAWFoiCisvLyBDT0RFR0VOOiBpY21wIHt7Lip9fSwgbnVsbAorLy8gQ09ERUdFTjogZ2V0ZWxlbWVudHB0cgorLy8gQ09ERUdFTjogcmV0CisKKy8vICBUaGVzZSB0d28gZG9uJ3QuCisvLyBDT0RFR0VOLUxBQkVMOiBkZWZpbmUge3suKn19IEAiXDAxP2Zvb0BLQHRlc3QxQEBRQUVQQVVDQDJAWFoiCisvLyBDT0RFR0VOOiBjYWxsIHt7Lip9fSBAIlwwMT9mb29AS0B0ZXN0MUBAVUFFUEFVRUAyQFhaIgorLy8gQ09ERUdFTi1ORVhUOiByZXQKKworLy8gQ09ERUdFTi1MQUJFTDogZGVmaW5lIHt7Lip9fSBAIlwwMT9mb29AS0B0ZXN0MUBAUUFFUEFVREAyQFhaIgorLy8gQ09ERUdFTjogY2FsbCB7ey4qfX0gQCJcMDE/Zm9vQEtAdGVzdDFAQFVBRVBBVUVAMkBYWiIKKy8vIENPREVHRU4tTkVYVDogcmV0CisKK30KKworbmFtZXNwYWNlIHRlc3QyIHsKKworLy8gQ292YXJpYW50IHR5cGVzLiAgRCogaXMgbm90IHRyaXZpYWxseSBjb252ZXJ0aWJsZSB0byBDKi4KK3N0cnVjdCBBIHsgaW50IGE7IH07CitzdHJ1Y3QgQiB7IGludCBiOyB9Oworc3RydWN0IEMgOiBCIHsgaW50IGM7IH07CitzdHJ1Y3QgRCA6IEEsIEMgeyBpbnQgZDsgfTsKK3N0cnVjdCBFIDogRCB7IGludCBlOyB9OworCisvLyBKJ3MgZm9vIHdpbGwgcmVxdWlyZSBhbiBhZGp1c3RpbmcgdGh1bmssIGFuZCBLIHdpbGwgcmVxdWlyZSBhIHRyaXZpYWwgdGh1bmsuCitzdHJ1Y3QgSCAgICAgeyB2aXJ0dWFsIEIgKmZvbygpOyB9Oworc3RydWN0IEkgOiBIIHsgdmlydHVhbCBDICpmb28oKTsgfTsKK3N0cnVjdCBKIDogSSB7IHZpcnR1YWwgRCAqZm9vKCk7IEooKTsgfTsKK3N0cnVjdCBLIDogSiB7IHZpcnR1YWwgRSAqZm9vKCk7IEsoKTsgfTsKKworSjo6SigpIHt9CisKKy8vIFZGVEFCTEVTLUxBQkVMOiBWRlRhYmxlIGZvciAndGVzdDI6OkgnIGluICd0ZXN0Mjo6SScgaW4gJ3Rlc3QyOjpKJyAoMiBlbnRyaWVzKS4KKy8vIFZGVEFCTEVTLU5FWFQ6ICAgIDAgfCB0ZXN0Mjo6RCAqdGVzdDI6Oko6OmZvbygpCisvLyBWRlRBQkxFUy1ORVhUOiAgICAgICAgIFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IHRlc3QyOjpCIConKTogNCBub24tdmlydHVhbF0KKy8vIFZGVEFCTEVTLU5FWFQ6ICAgIDEgfCB0ZXN0Mjo6RCAqdGVzdDI6Oko6OmZvbygpCisKKy8vIEdMT0JBTFMtTEFCRUw6IEAiXDAxPz9fN0pAdGVzdDJAQDZCQCIgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFsyIHggaTgqXQorCitLOjpLKCkge30KKworLy8gVkZUQUJMRVMtTEFCRUw6IFZGVGFibGUgZm9yICd0ZXN0Mjo6SCcgaW4gJ3Rlc3QyOjpJJyBpbiAndGVzdDI6OkonIGluICd0ZXN0Mjo6SycgKDMgZW50cmllcykuCisvLyBWRlRBQkxFUy1ORVhUOiAgICAwIHwgdGVzdDI6OkUgKnRlc3QyOjpLOjpmb28oKQorLy8gVkZUQUJMRVMtTkVYVDogICAgICAgICBbcmV0dXJuIGFkanVzdG1lbnQgKHRvIHR5cGUgJ3N0cnVjdCB0ZXN0Mjo6QiAqJyk6IDQgbm9uLXZpcnR1YWxdCisvLyBWRlRBQkxFUy1ORVhUOiAgICAxIHwgdGVzdDI6OkUgKnRlc3QyOjpLOjpmb28oKQorLy8gVkZUQUJMRVMtTkVYVDogICAgICAgICBbcmV0dXJuIGFkanVzdG1lbnQgKHRvIHR5cGUgJ3N0cnVjdCB0ZXN0Mjo6RCAqJyk6IDAgbm9uLXZpcnR1YWxdCisvLyBWRlRBQkxFUy1ORVhUOiAgICAyIHwgdGVzdDI6OkUgKnRlc3QyOjpLOjpmb28oKQorCisvLyBHTE9CQUxTLUxBQkVMOiBAIlwwMT8/XzdLQHRlc3QyQEA2QkAiID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCBbMyB4IGk4Kl0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktdnRhYmxlcy1zaW5nbGUtaW5oZXJpdGFuY2UuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktdnRhYmxlcy1zaW5nbGUtaW5oZXJpdGFuY2UuY3BwCmluZGV4IDZmZTEyYjAuLmQ0NTNmNWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZ0YWJsZXMtc2luZ2xlLWluaGVyaXRhbmNlLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12dGFibGVzLXNpbmdsZS1pbmhlcml0YW5jZS5jcHAKQEAgLTEsMjkgKzEsMTcgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZm5vLXJ0dGkgLWN4eC1hYmkgbWljcm9zb2Z0IC10cmlwbGU9aTM4Ni1wYy13aW4zMiAtZW1pdC1sbHZtIC1mZHVtcC12dGFibGUtbGF5b3V0cyAtbyAldC5sbCA+ICV0CisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWZuby1ydHRpIC10cmlwbGU9aTM4Ni1wYy13aW4zMiAtZW1pdC1sbHZtIC1mZHVtcC12dGFibGUtbGF5b3V0cyAtbyAldC5sbCA+ICV0CiAvLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1FTUlUUy1WRlRBQkxFICVzIDwgJXQubGwKIC8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU5PLVZGVEFCTEUgJXMgPCAldC5sbAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQSAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1CICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUMgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRCAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1FICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUYgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRyAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1JICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUogJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stSyAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1MICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLU0gJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTiAlcyA8ICV0CisvLyBSVU46IEZpbGVDaGVjayAlcyA8ICV0CiAKIHN0cnVjdCBBIHsKLSAgLy8gQ0hFQ0stQTogVkZUYWJsZSBmb3IgJ0EnICgzIGVudHJpZXMpCi0gIC8vIENIRUNLLUEtTkVYVDogMCB8IHZvaWQgQTo6ZigpCi0gIC8vIENIRUNLLUEtTkVYVDogMSB8IHZvaWQgQTo6ZygpCi0gIC8vIENIRUNLLUEtTkVYVDogMiB8IHZvaWQgQTo6aCgpCi0gIC8vIENIRUNLLUE6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ0EnICgzIGVudHJpZXMpCi0gIC8vIENIRUNLLUEtTkVYVDogMCB8IHZvaWQgQTo6ZigpCi0gIC8vIENIRUNLLUEtTkVYVDogMSB8IHZvaWQgQTo6ZygpCi0gIC8vIENIRUNLLUEtTkVYVDogMiB8IHZvaWQgQTo6aCgpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgKDMgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgQTo6ZigpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEE6OmcoKQorICAvLyBDSEVDSy1ORVhUOiAyIHwgdm9pZCBBOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ0EnICgzIGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEE6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBBOjpnKCkKKyAgLy8gQ0hFQ0stTkVYVDogMiB8IHZvaWQgQTo6aCgpCiAKICAgdmlydHVhbCB2b2lkIGYoKTsKICAgdmlydHVhbCB2b2lkIGcoKTsKQEAgLTMyLDE4ICsyMCwxOSBAQAogfTsKIEEgYTsKIC8vIEVNSVRTLVZGVEFCTEUtREFHOiBAIlwwMT8/XzdBQEA2QkAiID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCBbMyB4IGk4Kl0KK3ZvaWQgdXNlKEEgKm9iaikgeyBvYmotPmYoKTsgfQogCiBzdHJ1Y3QgQiA6IEEgewotICAvLyBDSEVDSy1COiBWRlRhYmxlIGZvciAnQScgaW4gJ0InICg1IGVudHJpZXMpCi0gIC8vIENIRUNLLUItTkVYVDogMCB8IHZvaWQgQjo6ZigpCi0gIC8vIENIRUNLLUItTkVYVDogMSB8IHZvaWQgQTo6ZygpCi0gIC8vIENIRUNLLUItTkVYVDogMiB8IHZvaWQgQTo6aCgpCi0gIC8vIENIRUNLLUItTkVYVDogMyB8IHZvaWQgQjo6aSgpCi0gIC8vIENIRUNLLUItTkVYVDogNCB8IHZvaWQgQjo6aigpCi0gIC8vIENIRUNLLUI6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ0InICgzIGVudHJpZXMpCi0gIC8vIENIRUNLLUItTkVYVDogMCB8IHZvaWQgQjo6ZigpCi0gIC8vIENIRUNLLUItTkVYVDogMyB8IHZvaWQgQjo6aSgpCi0gIC8vIENIRUNLLUItTkVYVDogNCB8IHZvaWQgQjo6aigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ0InICg1IGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEI6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBBOjpnKCkKKyAgLy8gQ0hFQ0stTkVYVDogMiB8IHZvaWQgQTo6aCgpCisgIC8vIENIRUNLLU5FWFQ6IDMgfCB2b2lkIEI6OmkoKQorICAvLyBDSEVDSy1ORVhUOiA0IHwgdm9pZCBCOjpqKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ0InICgzIGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEI6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAzIHwgdm9pZCBCOjppKCkKKyAgLy8gQ0hFQ0stTkVYVDogNCB8IHZvaWQgQjo6aigpCiAKICAgdmlydHVhbCB2b2lkIGYoKTsgIC8vIG92ZXJyaWRlcyBBOjpmKCkKICAgdmlydHVhbCB2b2lkIGkoKTsKQEAgLTUxLDQ1ICs0MCw0OCBAQAogfTsKIEIgYjsKIC8vIEVNSVRTLVZGVEFCTEUtREFHOiBAIlwwMT8/XzdCQEA2QkAiID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCBbNSB4IGk4Kl0KK3ZvaWQgdXNlKEIgKm9iaikgeyBvYmotPmYoKTsgfQogCiBzdHJ1Y3QgQyB7Ci0gIC8vIENIRUNLLUM6IFZGVGFibGUgZm9yICdDJyAoMiBlbnRyaWVzKQotICAvLyBDSEVDSy1DLU5FWFQ6IDAgfCBDOjp+QygpIFtzY2FsYXIgZGVsZXRpbmddCi0gIC8vIENIRUNLLUMtTkVYVDogMSB8IHZvaWQgQzo6ZigpCi0gIC8vIENIRUNLLUM6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ0MnICgyIGVudHJpZXMpLgotICAvLyBDSEVDSy1DLU5FWFQ6IDAgfCBDOjp+QygpIFtzY2FsYXIgZGVsZXRpbmddCi0gIC8vIENIRUNLLUMtTkVYVDogMSB8IHZvaWQgQzo6ZigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQycgKDIgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IEM6On5DKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQzo6ZigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICdDJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IEM6On5DKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQzo6ZigpCiAKICAgdmlydHVhbCB+QygpOwogICB2aXJ0dWFsIHZvaWQgZigpOwogfTsKIHZvaWQgQzo6ZigpIHt9CiAvLyBOTy1WRlRBQkxFLU5PVDogQCJcMDE/P183Q0BANkJAIgordm9pZCB1c2UoQyAqb2JqKSB7IG9iai0+ZigpOyB9CiAKIHN0cnVjdCBEIHsKLSAgLy8gQ0hFQ0stRDogVkZUYWJsZSBmb3IgJ0QnICgyIGVudHJpZXMpCi0gIC8vIENIRUNLLUQtTkVYVDogMCB8IHZvaWQgRDo6ZigpCi0gIC8vIENIRUNLLUQtTkVYVDogMSB8IEQ6On5EKCkgW3NjYWxhciBkZWxldGluZ10KLSAgLy8gQ0hFQ0stRDogVkZUYWJsZSBpbmRpY2VzIGZvciAnRCcgKDIgZW50cmllcykKLSAgLy8gQ0hFQ0stRC1ORVhUOiAwIHwgdm9pZCBEOjpmKCkKLSAgLy8gQ0hFQ0stRC1ORVhUOiAxIHwgRDo6fkQoKSBbc2NhbGFyIGRlbGV0aW5nXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0QnICgyIGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEQ6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgRDo6fkQoKSBbc2NhbGFyIGRlbGV0aW5nXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBpbmRpY2VzIGZvciAnRCcgKDIgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgRDo6ZigpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCBEOjp+RCgpIFtzY2FsYXIgZGVsZXRpbmddCiAKICAgdmlydHVhbCB2b2lkIGYoKTsKICAgdmlydHVhbCB+RCgpOwogfTsKIEQgZDsKIC8vIEVNSVRTLVZGVEFCTEUtREFHOiBAIlwwMT8/XzdEQEA2QkAiID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCBbMiB4IGk4Kl0KK3ZvaWQgdXNlKEQgKm9iaikgeyBvYmotPmYoKTsgfQogCiBzdHJ1Y3QgRSA6IEEgewotICAvLyBDSEVDSy1FOiBWRlRhYmxlIGZvciAnQScgaW4gJ0UnICg1IGVudHJpZXMpCi0gIC8vIENIRUNLLUUtTkVYVDogMCB8IHZvaWQgQTo6ZigpCi0gIC8vIENIRUNLLUUtTkVYVDogMSB8IHZvaWQgQTo6ZygpCi0gIC8vIENIRUNLLUUtTkVYVDogMiB8IHZvaWQgQTo6aCgpCi0gIC8vIENIRUNLLUUtTkVYVDogMyB8IEU6On5FKCkgW3NjYWxhciBkZWxldGluZ10KLSAgLy8gQ0hFQ0stRS1ORVhUOiA0IHwgdm9pZCBFOjppKCkKLSAgLy8gQ0hFQ0stRTogVkZUYWJsZSBpbmRpY2VzIGZvciAnRScgKDIgZW50cmllcykuCi0gIC8vIENIRUNLLUUtTkVYVDogMyB8IEU6On5FKCkgW3NjYWxhciBkZWxldGluZ10KLSAgLy8gQ0hFQ0stRS1ORVhUOiA0IHwgdm9pZCBFOjppKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdBJyBpbiAnRScgKDUgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgQTo6ZigpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEE6OmcoKQorICAvLyBDSEVDSy1ORVhUOiAyIHwgdm9pZCBBOjpoKCkKKyAgLy8gQ0hFQ0stTkVYVDogMyB8IEU6On5FKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTkVYVDogNCB8IHZvaWQgRTo6aSgpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICdFJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMyB8IEU6On5FKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTkVYVDogNCB8IHZvaWQgRTo6aSgpCiAKICAgLy8gfkUgd291bGQgYmUgdGhlIGtleSBtZXRob2QsIGJ1dCBpdCBpc24ndCB1c2VkLCBhbmQgTVMgQUJJIGhhcyBubyBrZXkKICAgLy8gbWV0aG9kcy4KQEAgLTk4LDM2ICs5MCwzOCBAQAogfTsKIHZvaWQgRTo6aSgpIHt9CiAvLyBOTy1WRlRBQkxFLU5PVDogQCJcMDE/P183RUBANkJAIgordm9pZCB1c2UoRSAqb2JqKSB7IG9iai0+aSgpOyB9CiAKIHN0cnVjdCBGIDogQSB7Ci0gIC8vIENIRUNLLUY6IFZGVGFibGUgZm9yICdBJyBpbiAnRicgKDUgZW50cmllcykKLSAgLy8gQ0hFQ0stRi1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKLSAgLy8gQ0hFQ0stRi1ORVhUOiAxIHwgdm9pZCBBOjpnKCkKLSAgLy8gQ0hFQ0stRi1ORVhUOiAyIHwgdm9pZCBBOjpoKCkKLSAgLy8gQ0hFQ0stRi1ORVhUOiAzIHwgdm9pZCBGOjppKCkKLSAgLy8gQ0hFQ0stRi1ORVhUOiA0IHwgRjo6fkYoKSBbc2NhbGFyIGRlbGV0aW5nXQotICAvLyBDSEVDSy1GOiBWRlRhYmxlIGluZGljZXMgZm9yICdGJyAoMiBlbnRyaWVzKS4KLSAgLy8gQ0hFQ0stRi1ORVhUOiAzIHwgdm9pZCBGOjppKCkKLSAgLy8gQ0hFQ0stRi1ORVhUOiA0IHwgRjo6fkYoKSBbc2NhbGFyIGRlbGV0aW5nXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdGJyAoNSBlbnRyaWVzKQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQTo6ZygpCisgIC8vIENIRUNLLU5FWFQ6IDIgfCB2b2lkIEE6OmgoKQorICAvLyBDSEVDSy1ORVhUOiAzIHwgdm9pZCBGOjppKCkKKyAgLy8gQ0hFQ0stTkVYVDogNCB8IEY6On5GKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ0YnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAzIHwgdm9pZCBGOjppKCkKKyAgLy8gQ0hFQ0stTkVYVDogNCB8IEY6On5GKCkgW3NjYWxhciBkZWxldGluZ10KIAogICB2aXJ0dWFsIHZvaWQgaSgpOwogICB2aXJ0dWFsIH5GKCk7CiB9OwogRiBmOwogLy8gRU1JVFMtVkZUQUJMRS1EQUc6IEAiXDAxPz9fN0ZAQDZCQCIgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs1IHggaTgqXQordm9pZCB1c2UoRiAqb2JqKSB7IG9iai0+aSgpOyB9CiAKIHN0cnVjdCBHIDogRSB7Ci0gIC8vIENIRUNLLUc6IFZGVGFibGUgZm9yICdBJyBpbiAnRScgaW4gJ0cnICg2IGVudHJpZXMpCi0gIC8vIENIRUNLLUctTkVYVDogMCB8IHZvaWQgRzo6ZigpCi0gIC8vIENIRUNLLUctTkVYVDogMSB8IHZvaWQgQTo6ZygpCi0gIC8vIENIRUNLLUctTkVYVDogMiB8IHZvaWQgQTo6aCgpCi0gIC8vIENIRUNLLUctTkVYVDogMyB8IEc6On5HKCkgW3NjYWxhciBkZWxldGluZ10KLSAgLy8gQ0hFQ0stRy1ORVhUOiA0IHwgdm9pZCBFOjppKCkKLSAgLy8gQ0hFQ0stRy1ORVhUOiA1IHwgdm9pZCBHOjpqKCkKLSAgLy8gQ0hFQ0stRzogVkZUYWJsZSBpbmRpY2VzIGZvciAnRycgKDMgZW50cmllcykuCi0gIC8vIENIRUNLLUctTkVYVDogMCB8IHZvaWQgRzo6ZigpCi0gIC8vIENIRUNLLUctTkVYVDogMyB8IEc6On5HKCkgW3NjYWxhciBkZWxldGluZ10KLSAgLy8gQ0hFQ0stRy1ORVhUOiA1IHwgdm9pZCBHOjpqKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdBJyBpbiAnRScgaW4gJ0cnICg2IGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEc6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBBOjpnKCkKKyAgLy8gQ0hFQ0stTkVYVDogMiB8IHZvaWQgQTo6aCgpCisgIC8vIENIRUNLLU5FWFQ6IDMgfCBHOjp+RygpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLU5FWFQ6IDQgfCB2b2lkIEU6OmkoKQorICAvLyBDSEVDSy1ORVhUOiA1IHwgdm9pZCBHOjpqKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ0cnICgzIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBHOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogMyB8IEc6On5HKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTkVYVDogNSB8IHZvaWQgRzo6aigpCiAKICAgdmlydHVhbCB2b2lkIGYoKTsgIC8vIG92ZXJyaWRlcyBBOjpmKCkKICAgdmlydHVhbCB+RygpOwpAQCAtMTM1LDYgKzEyOSw3IEBACiB9Owogdm9pZCBHOjpqKCkge30KIC8vIE5PLVZGVEFCTEUtTk9UOiBAIlwwMT8/XzdHQEA2QkAiCit2b2lkIHVzZShHICpvYmopIHsgb2JqLT5qKCk7IH0KIAogLy8gVGVzdCB0aGF0IHRoZSB1c3VhbCBJdGFuaXVtLXN0eWxlIGtleSBtZXRob2QgZG9lcyBub3QgZW1pdCBhIHZ0YWJsZS4KIHN0cnVjdCBIIHsKQEAgLTE0NiwyMyArMTQxLDI0IEBACiBzdHJ1Y3QgRW1wdHkgeyB9OwogCiBzdHJ1Y3QgSSA6IEVtcHR5IHsKLSAgLy8gQ0hFQ0stSTogVkZUYWJsZSBmb3IgJ0knICgyIGVudHJpZXMpCi0gIC8vIENIRUNLLUktTkVYVDogMCB8IHZvaWQgSTo6ZigpCi0gIC8vIENIRUNLLUktTkVYVDogMSB8IHZvaWQgSTo6ZygpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnSScgKDIgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgSTo6ZigpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEk6OmcoKQogICB2aXJ0dWFsIHZvaWQgZigpOwogICB2aXJ0dWFsIHZvaWQgZygpOwogfTsKIAogSSBpOwordm9pZCB1c2UoSSAqb2JqKSB7IG9iai0+ZigpOyB9CiAKIHN0cnVjdCBKIHsKLSAgLy8gQ0hFQ0stSjogVkZUYWJsZSBmb3IgJ0onICg2IGVudHJpZXMpCi0gIC8vIENIRUNLLUotTkVYVDogMCB8IHZvaWQgSjo6Zm9vKGxvbmcpCi0gIC8vIENIRUNLLUotTkVYVDogMSB8IHZvaWQgSjo6Zm9vKGludCkKLSAgLy8gQ0hFQ0stSi1ORVhUOiAyIHwgdm9pZCBKOjpmb28oc2hvcnQpCi0gIC8vIENIRUNLLUotTkVYVDogMyB8IHZvaWQgSjo6YmFyKGxvbmcpCi0gIC8vIENIRUNLLUotTkVYVDogNCB8IHZvaWQgSjo6YmFyKGludCkKLSAgLy8gQ0hFQ0stSi1ORVhUOiA1IHwgdm9pZCBKOjpiYXIoc2hvcnQpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnSicgKDYgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgSjo6Zm9vKGxvbmcpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEo6OmZvbyhpbnQpCisgIC8vIENIRUNLLU5FWFQ6IDIgfCB2b2lkIEo6OmZvbyhzaG9ydCkKKyAgLy8gQ0hFQ0stTkVYVDogMyB8IHZvaWQgSjo6YmFyKGxvbmcpCisgIC8vIENIRUNLLU5FWFQ6IDQgfCB2b2lkIEo6OmJhcihpbnQpCisgIC8vIENIRUNLLU5FWFQ6IDUgfCB2b2lkIEo6OmJhcihzaG9ydCkKICAgdmlydHVhbCB2b2lkIGZvbyhzaG9ydCk7CiAgIHZpcnR1YWwgdm9pZCBiYXIoc2hvcnQpOwogICB2aXJ0dWFsIHZvaWQgZm9vKGludCk7CkBAIC0xNzIsMzYgKzE2OCwzOCBAQAogfTsKIAogSiBqOwordm9pZCB1c2UoSiAqb2JqKSB7IG9iai0+Zm9vKDQyKTsgfQogCiBzdHJ1Y3QgSyA6IEogewotICAvLyBDSEVDSy1LOiBWRlRhYmxlIGZvciAnSicgaW4gJ0snICg5IGVudHJpZXMpCi0gIC8vIENIRUNLLUstTkVYVDogMCB8IHZvaWQgSjo6Zm9vKGxvbmcpCi0gIC8vIENIRUNLLUstTkVYVDogMSB8IHZvaWQgSjo6Zm9vKGludCkKLSAgLy8gQ0hFQ0stSy1ORVhUOiAyIHwgdm9pZCBKOjpmb28oc2hvcnQpCi0gIC8vIENIRUNLLUstTkVYVDogMyB8IHZvaWQgSjo6YmFyKGxvbmcpCi0gIC8vIENIRUNLLUstTkVYVDogNCB8IHZvaWQgSjo6YmFyKGludCkKLSAgLy8gQ0hFQ0stSy1ORVhUOiA1IHwgdm9pZCBKOjpiYXIoc2hvcnQpCi0gIC8vIENIRUNLLUstTkVYVDogNiB8IHZvaWQgSzo6YmFyKGRvdWJsZSkKLSAgLy8gQ0hFQ0stSy1ORVhUOiA3IHwgdm9pZCBLOjpiYXIoZmxvYXQpCi0gIC8vIENIRUNLLUstTkVYVDogOCB8IHZvaWQgSzo6Zm9vKGZsb2F0KQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0onIGluICdLJyAoOSBlbnRyaWVzKQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBKOjpmb28obG9uZykKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgSjo6Zm9vKGludCkKKyAgLy8gQ0hFQ0stTkVYVDogMiB8IHZvaWQgSjo6Zm9vKHNob3J0KQorICAvLyBDSEVDSy1ORVhUOiAzIHwgdm9pZCBKOjpiYXIobG9uZykKKyAgLy8gQ0hFQ0stTkVYVDogNCB8IHZvaWQgSjo6YmFyKGludCkKKyAgLy8gQ0hFQ0stTkVYVDogNSB8IHZvaWQgSjo6YmFyKHNob3J0KQorICAvLyBDSEVDSy1ORVhUOiA2IHwgdm9pZCBLOjpiYXIoZG91YmxlKQorICAvLyBDSEVDSy1ORVhUOiA3IHwgdm9pZCBLOjpiYXIoZmxvYXQpCisgIC8vIENIRUNLLU5FWFQ6IDggfCB2b2lkIEs6OmZvbyhmbG9hdCkKICAgdmlydHVhbCB2b2lkIGJhcihmbG9hdCk7CiAgIHZpcnR1YWwgdm9pZCBmb28oZmxvYXQpOwogICB2aXJ0dWFsIHZvaWQgYmFyKGRvdWJsZSk7CiB9OwogCiBLIGs7Cit2b2lkIHVzZShLICpvYmopIHsgb2JqLT5mb28oNDIuMGYpOyB9CiAKIHN0cnVjdCBMIDogSiB7Ci0gIC8vIENIRUNLLUw6IFZGVGFibGUgZm9yICdKJyBpbiAnTCcgKDkgZW50cmllcykKLSAgLy8gQ0hFQ0stTC1ORVhUOiAwIHwgdm9pZCBKOjpmb28obG9uZykKLSAgLy8gQ0hFQ0stTC1ORVhUOiAxIHwgdm9pZCBMOjpmb28oaW50KQotICAvLyBDSEVDSy1MLU5FWFQ6IDIgfCB2b2lkIEo6OmZvbyhzaG9ydCkKLSAgLy8gQ0hFQ0stTC1ORVhUOiAzIHwgdm9pZCBKOjpiYXIobG9uZykKLSAgLy8gQ0hFQ0stTC1ORVhUOiA0IHwgdm9pZCBKOjpiYXIoaW50KQotICAvLyBDSEVDSy1MLU5FWFQ6IDUgfCB2b2lkIEo6OmJhcihzaG9ydCkKLSAgLy8gQ0hFQ0stTC1ORVhUOiA2IHwgdm9pZCBMOjpmb28oZmxvYXQpCi0gIC8vIENIRUNLLUwtTkVYVDogNyB8IHZvaWQgTDo6YmFyKGRvdWJsZSkKLSAgLy8gQ0hFQ0stTC1ORVhUOiA4IHwgdm9pZCBMOjpiYXIoZmxvYXQpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnSicgaW4gJ0wnICg5IGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEo6OmZvbyhsb25nKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBMOjpmb28oaW50KQorICAvLyBDSEVDSy1ORVhUOiAyIHwgdm9pZCBKOjpmb28oc2hvcnQpCisgIC8vIENIRUNLLU5FWFQ6IDMgfCB2b2lkIEo6OmJhcihsb25nKQorICAvLyBDSEVDSy1ORVhUOiA0IHwgdm9pZCBKOjpiYXIoaW50KQorICAvLyBDSEVDSy1ORVhUOiA1IHwgdm9pZCBKOjpiYXIoc2hvcnQpCisgIC8vIENIRUNLLU5FWFQ6IDYgfCB2b2lkIEw6OmZvbyhmbG9hdCkKKyAgLy8gQ0hFQ0stTkVYVDogNyB8IHZvaWQgTDo6YmFyKGRvdWJsZSkKKyAgLy8gQ0hFQ0stTkVYVDogOCB8IHZvaWQgTDo6YmFyKGZsb2F0KQogCiAgIC8vIFRoaXMgY2FzZSBpcyBpbnRlcmVzdGluZy4gU2luY2UgdGhlIEo6OmZvbyhpbnQpIG92ZXJyaWRlIGlzIHRoZSBmaXJzdCBtZXRob2QgaW4KICAgLy8gdGhlIGNsYXNzLCBmb28oZmxvYXQpIHByZWNlZGVzIHRoZSBiYXIoZG91YmxlKSBhbmQgYmFyKGZsb2F0KSBpbiB0aGUgdmZ0YWJsZS4KQEAgLTIxMiwyMCArMjEwLDIxIEBACiB9OwogCiBMIGw7Cit2b2lkIHVzZShMICpvYmopIHsgb2JqLT5mb28oNDIuMGYpOyB9CiAKIHN0cnVjdCBNIDogSiB7Ci0gIC8vIENIRUNLLU06IFZGVGFibGUgZm9yICdKJyBpbiAnTScgKDExIGVudHJpZXMpCi0gIC8vIENIRUNLLU0tTkVYVDogIDAgfCB2b2lkIEo6OmZvbyhsb25nKQotICAvLyBDSEVDSy1NLU5FWFQ6ICAxIHwgdm9pZCBNOjpmb28oaW50KQotICAvLyBDSEVDSy1NLU5FWFQ6ICAyIHwgdm9pZCBKOjpmb28oc2hvcnQpCi0gIC8vIENIRUNLLU0tTkVYVDogIDMgfCB2b2lkIEo6OmJhcihsb25nKQotICAvLyBDSEVDSy1NLU5FWFQ6ICA0IHwgdm9pZCBKOjpiYXIoaW50KQotICAvLyBDSEVDSy1NLU5FWFQ6ICA1IHwgdm9pZCBKOjpiYXIoc2hvcnQpCi0gIC8vIENIRUNLLU0tTkVYVDogIDYgfCB2b2lkIE06OmZvbyhmbG9hdCkKLSAgLy8gQ0hFQ0stTS1ORVhUOiAgNyB8IHZvaWQgTTo6c3BhbShsb25nKQotICAvLyBDSEVDSy1NLU5FWFQ6ICA4IHwgdm9pZCBNOjpzcGFtKGludCkKLSAgLy8gQ0hFQ0stTS1ORVhUOiAgOSB8IHZvaWQgTTo6YmFyKGRvdWJsZSkKLSAgLy8gQ0hFQ0stTS1ORVhUOiAxMCB8IHZvaWQgTTo6YmFyKGZsb2F0KQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0onIGluICdNJyAoMTEgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogIDAgfCB2b2lkIEo6OmZvbyhsb25nKQorICAvLyBDSEVDSy1ORVhUOiAgMSB8IHZvaWQgTTo6Zm9vKGludCkKKyAgLy8gQ0hFQ0stTkVYVDogIDIgfCB2b2lkIEo6OmZvbyhzaG9ydCkKKyAgLy8gQ0hFQ0stTkVYVDogIDMgfCB2b2lkIEo6OmJhcihsb25nKQorICAvLyBDSEVDSy1ORVhUOiAgNCB8IHZvaWQgSjo6YmFyKGludCkKKyAgLy8gQ0hFQ0stTkVYVDogIDUgfCB2b2lkIEo6OmJhcihzaG9ydCkKKyAgLy8gQ0hFQ0stTkVYVDogIDYgfCB2b2lkIE06OmZvbyhmbG9hdCkKKyAgLy8gQ0hFQ0stTkVYVDogIDcgfCB2b2lkIE06OnNwYW0obG9uZykKKyAgLy8gQ0hFQ0stTkVYVDogIDggfCB2b2lkIE06OnNwYW0oaW50KQorICAvLyBDSEVDSy1ORVhUOiAgOSB8IHZvaWQgTTo6YmFyKGRvdWJsZSkKKyAgLy8gQ0hFQ0stTkVYVDogMTAgfCB2b2lkIE06OmJhcihmbG9hdCkKIAogICB2aXJ0dWFsIHZvaWQgZm9vKGludCk7CiAgIHZpcnR1YWwgdm9pZCBzcGFtKGludCk7CkBAIC0yMzYsMTMgKzIzNSwxNCBAQAogfTsKIAogTSBtOwordm9pZCB1c2UoTSAqb2JqKSB7IG9iai0+Zm9vKDQyLjBmKTsgfQogCiBzdHJ1Y3QgTiB7Ci0gIC8vIENIRUNLLU46IFZGVGFibGUgZm9yICdOJyAoNCBlbnRyaWVzKQotICAvLyBDSEVDSy1OLU5FWFQ6IDAgfCB2b2lkIE46Om9wZXJhdG9yKyhpbnQpCi0gIC8vIENIRUNLLU4tTkVYVDogMSB8IHZvaWQgTjo6b3BlcmF0b3IrKHNob3J0KQotICAvLyBDSEVDSy1OLU5FWFQ6IDIgfCB2b2lkIE46Om9wZXJhdG9yKihpbnQpCi0gIC8vIENIRUNLLU4tTkVYVDogMyB8IHZvaWQgTjo6b3BlcmF0b3IqKHNob3J0KQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ04nICg0IGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIE46Om9wZXJhdG9yKyhpbnQpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIE46Om9wZXJhdG9yKyhzaG9ydCkKKyAgLy8gQ0hFQ0stTkVYVDogMiB8IHZvaWQgTjo6b3BlcmF0b3IqKGludCkKKyAgLy8gQ0hFQ0stTkVYVDogMyB8IHZvaWQgTjo6b3BlcmF0b3IqKHNob3J0KQogICB2aXJ0dWFsIHZvaWQgb3BlcmF0b3IrKHNob3J0KTsKICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKihzaG9ydCk7CiAgIHZpcnR1YWwgdm9pZCBvcGVyYXRvcisoaW50KTsKQEAgLTI1MCwzICsyNTAsNDIgQEAKIH07CiAKIE4gbjsKK3ZvaWQgdXNlKE4gKm9iaikgeyBvYmotPm9wZXJhdG9yKyg0Mik7IH0KKworc3RydWN0IE8geyB2aXJ0dWFsIEEgKmYoKTsgfTsKK3N0cnVjdCBQIDogTyB7IHZpcnR1YWwgQiAqZigpOyB9OworUCBwOwordm9pZCB1c2UoTyAqb2JqKSB7IG9iai0+ZigpOyB9Cit2b2lkIHVzZShQICpvYmopIHsgb2JqLT5mKCk7IH0KKy8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnTycgKDEgZW50cnkpCisvLyBDSEVDSy1ORVhUOiAwIHwgQSAqTzo6ZigpCisKKy8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnTycgaW4gJ1AnICgxIGVudHJ5KQorLy8gQ0hFQ0stTkVYVDogMCB8IEIgKlA6OmYoKQorCitzdHJ1Y3QgUSB7CisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnUScgKDIgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgUTo6Zm9vKGludCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgUTo6YmFyKGludCkKKyAgdm9pZCBmb28oc2hvcnQpOworICB2b2lkIGJhcihzaG9ydCk7CisgIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKKyAgdmlydHVhbCB2b2lkIGZvbyhpbnQpOworfTsKKworUSBxOwordm9pZCB1c2UoUSAqb2JqKSB7IG9iai0+Zm9vKDQyKTsgfQorCisvLyBJbmhlcml0ZWQgbm9uLXZpcnR1YWwgb3ZlcmxvYWRzIGRvbid0IHBhcnRpY2lwYXRlIGluIHRoZSBvcmRlcmluZy4KK3N0cnVjdCBSIDogUSB7CisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnUScgaW4gJ1InICg0IGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIFE6OmZvbyhpbnQpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIFE6OmJhcihpbnQpCisgIC8vIENIRUNLLU5FWFQ6IDIgfCB2b2lkIFI6OmJhcihsb25nKQorICAvLyBDSEVDSy1ORVhUOiAzIHwgdm9pZCBSOjpmb28obG9uZykKKyAgdmlydHVhbCB2b2lkIGJhcihsb25nKTsKKyAgdmlydHVhbCB2b2lkIGZvbyhsb25nKTsKK307CisKK1IgcjsKK3ZvaWQgdXNlKFIgKm9iaikgeyBvYmotPmZvbyg0MmwpOyB9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12dGFibGVzLXZpcnR1YWwtaW5oZXJpdGFuY2UtdnRvcmRpc3BzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZ0YWJsZXMtdmlydHVhbC1pbmhlcml0YW5jZS12dG9yZGlzcHMuY3BwCmluZGV4IDNmZWYwZTQuLjZkYWMzMGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZ0YWJsZXMtdmlydHVhbC1pbmhlcml0YW5jZS12dG9yZGlzcHMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZ0YWJsZXMtdmlydHVhbC1pbmhlcml0YW5jZS12dG9yZGlzcHMuY3BwCkBAIC0xLDE5ICsxLDkgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bSAtZmR1bXAtdnRhYmxlLWxheW91dHMgJXMgLW8gJXQubGwgLWN4eC1hYmkgbWljcm9zb2Z0IC10cmlwbGU9aTM4Ni1wYy13aW4zMiA+JXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZUQUJMRS1TSU1QTEUtQSAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1WVEFCTEUtU0lNUExFLUIgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9VlRBQkxFLVNJTVBMRS1DICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZUQUJMRS1FWFRFTkRFRC1BICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZUQUJMRS1FWFRFTkRFRC1CICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZUQUJMRS1FWFRFTkRFRC1DICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZUQUJMRS1FWFRFTkRFRC1FICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZUQUJMRS1FWFRFTkRFRC1GICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZUQUJMRS1FWFRFTkRFRC1HICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZUQUJMRS1FWFRFTkRFRC1IICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVZUQUJMRS1QUjE3NzM4LUEgJXMgPCAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtIC1mZHVtcC12dGFibGUtbGF5b3V0cyAlcyAtbyAldC5sbCAtdHJpcGxlPWkzODYtcGMtd2luMzIgPiAldAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgPCAldAogLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9TUFOR0xJTkcgJXMgPCAldC5sbAogCiAvLyBGb3Igbm93LCBqdXN0IG1ha2Ugc3VyZSB4ODZfNjQgZG9lc24ndCBjcmFzaC4KLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC1mZHVtcC12dGFibGUtbGF5b3V0cyAlcyAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT14ODZfNjQtcGMtd2luMzIgPi9kZXYvbnVsbAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLWZkdW1wLXZ0YWJsZS1sYXlvdXRzICVzIC10cmlwbGU9eDg2XzY0LXBjLXdpbjMyID4gL2Rldi9udWxsCiAKIHN0cnVjdCBWMSB7CiAgIHZpcnR1YWwgdm9pZCBmKCk7CkBAIC02NCwxMSArNTQsMTcgQEAKIC8vICAgam1wIE1ldGhvZEBDbGFzcwogCiBzdHJ1Y3QgQSA6IHZpcnR1YWwgVjEgewotICAvLyBWVEFCTEUtU0lNUExFLUE6IFZGVGFibGUgZm9yICdWMScgaW4gJ3NpbXBsZTo6QScgKDIgZW50cmllcykuCi0gIC8vIFZUQUJMRS1TSU1QTEUtQS1ORVhUOiAwIHwgdm9pZCBzaW1wbGU6OkE6OmYoKQotICAvLyBWVEFCTEUtU0lNUExFLUEtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCAwIG5vbi12aXJ0dWFsXQotICAvLyBWVEFCTEUtU0lNUExFLUEtTkVYVDogMSB8IHNpbXBsZTo6QTo6fkEoKSBbc2NhbGFyIGRlbGV0aW5nXQotICAvLyBWVEFCTEUtU0lNUExFLUEtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCAwIG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ1YxJyBpbiAnc2ltcGxlOjpBJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgc2ltcGxlOjpBOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCAwIG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgc2ltcGxlOjpBOjp+QSgpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtNCwgMCBub24tdmlydHVhbF0KKworICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAnc2ltcGxlOjpBOjp+QSgpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtNCwgMCBub24tdmlydHVhbF0KKworICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndm9pZCBzaW1wbGU6OkE6OmYoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIDAgbm9uLXZpcnR1YWxdCiAKICAgdmlydHVhbCB2b2lkIGYoKTsKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT9mQEFAc2ltcGxlQEAkNFBQUFBQUFBNQEFAQUVYWFoiCkBAIC03OCwxOCArNzQsMjggQEAKIH07CiAKIEEgYTsKK3ZvaWQgdXNlKEEgKm9iaikgeyBvYmotPmYoKTsgfQogCiBzdHJ1Y3QgQiA6IHZpcnR1YWwgVjMgewotICAvLyBWVEFCTEUtU0lNUExFLUI6IFZGVGFibGUgZm9yICdaJyBpbiAnVjMnIGluICdzaW1wbGU6OkInICgyIGVudHJpZXMpLgotICAvLyBWVEFCTEUtU0lNUExFLUItTkVYVDogMCB8IHZvaWQgWjo6ZygpCi0gIC8vIFZUQUJMRS1TSU1QTEUtQi1ORVhUOiAxIHwgc2ltcGxlOjpCOjp+QigpIFtzY2FsYXIgZGVsZXRpbmddCi0gIC8vIFZUQUJMRS1TSU1QTEUtQi1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIDAgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnWicgaW4gJ1YzJyBpbiAnc2ltcGxlOjpCJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgWjo6ZygpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCBzaW1wbGU6OkI6On5CKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCAwIG5vbi12aXJ0dWFsXQogCi0gIC8vIFZUQUJMRS1TSU1QTEUtQjogVkZUYWJsZSBmb3IgJ1YyJyBpbiAnVjMnIGluICdzaW1wbGU6OkInICgyIGVudHJpZXMpLgotICAvLyBWVEFCTEUtU0lNUExFLUItTkVYVDogMCB8IHZvaWQgc2ltcGxlOjpCOjpmKCkKLSAgLy8gVlRBQkxFLVNJTVBMRS1CLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtMTIsIDAgbm9uLXZpcnR1YWxdCi0gIC8vIFZUQUJMRS1TSU1QTEUtQi1ORVhUOiAxIHwgc2ltcGxlOjpCOjp+QigpIFtzY2FsYXIgZGVsZXRpbmddCi0gIC8vIFZUQUJMRS1TSU1QTEUtQi1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTEyLCAtOCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTEFCRUw6IFRodW5rcyBmb3IgJ3NpbXBsZTo6Qjo6fkIoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIDAgbm9uLXZpcnR1YWxdCisKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdWMicgaW4gJ1YzJyBpbiAnc2ltcGxlOjpCJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgc2ltcGxlOjpCOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC0xMiwgMCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHNpbXBsZTo6Qjo6fkIoKSBbc2NhbGFyIGRlbGV0aW5nXQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTEyLCAtOCBub24tdmlydHVhbF0KKworICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAnc2ltcGxlOjpCOjp+QigpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtMTIsIC04IG5vbi12aXJ0dWFsXQorCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2b2lkIHNpbXBsZTo6Qjo6ZigpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtMTIsIDAgbm9uLXZpcnR1YWxdCiAKICAgLy8gRklYTUU6IFRoZSB2dG9yZGlzcCB0aHVuayBzaG91bGQgb25seSBnZXQgZW1pdHRlZCBmb3IgYSBjb25zdHJ1Y3RvcgogICAvLyBpZiAidGhpcyIgbGVhdmVzIHNjb3BlLgpAQCAtMTA0LDI0ICsxMTAsNDAgQEAKIH07CiAKIEIgYjsKK3ZvaWQgdXNlKEIgKm9iaikgeyBvYmotPmYoKTsgfQogCiBzdHJ1Y3QgQyA6IHZpcnR1YWwgVjQgewotICAvLyBWVEFCTEUtU0lNUExFLUM6IFZGVGFibGUgZm9yICdaJyBpbiAnVjQnIGluICdzaW1wbGU6OkMnICgyIGVudHJpZXMpLgotICAvLyBWVEFCTEUtU0lNUExFLUMtTkVYVDogMCB8IHZvaWQgWjo6ZygpCi0gIC8vIFZUQUJMRS1TSU1QTEUtQy1ORVhUOiAxIHwgc2ltcGxlOjpDOjp+QygpIFtzY2FsYXIgZGVsZXRpbmddCi0gIC8vIFZUQUJMRS1TSU1QTEUtQy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIDAgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnWicgaW4gJ1Y0JyBpbiAnc2ltcGxlOjpDJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgWjo6ZygpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCBzaW1wbGU6OkM6On5DKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCAwIG5vbi12aXJ0dWFsXQogCi0gIC8vIFZUQUJMRS1TSU1QTEUtQzogVkZUYWJsZSBmb3IgJ1YxJyBpbiAnVjQnIGluICdzaW1wbGU6OkMnICgyIGVudHJpZXMpLgotICAvLyBWVEFCTEUtU0lNUExFLUMtTkVYVDogMCB8IHZvaWQgc2ltcGxlOjpDOjpmKCkKLSAgLy8gVlRBQkxFLVNJTVBMRS1DLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtMTIsIDAgbm9uLXZpcnR1YWxdCi0gIC8vIFZUQUJMRS1TSU1QTEUtQy1ORVhUOiAxIHwgc2ltcGxlOjpDOjp+QygpIFtzY2FsYXIgZGVsZXRpbmddCi0gIC8vIFZUQUJMRS1TSU1QTEUtQy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTEyLCAtOCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTEFCRUw6IFRodW5rcyBmb3IgJ3NpbXBsZTo6Qzo6fkMoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIDAgbm9uLXZpcnR1YWxdCiAKLSAgLy8gVlRBQkxFLVNJTVBMRS1DOiBWRlRhYmxlIGZvciAnVjInIGluICdWNCcgaW4gJ3NpbXBsZTo6QycgKDIgZW50cmllcykuCi0gIC8vIFZUQUJMRS1TSU1QTEUtQy1ORVhUOiAwIHwgdm9pZCBzaW1wbGU6OkM6OmYoKQotICAvLyBWVEFCTEUtU0lNUExFLUMtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC0xNiwgLTQgbm9uLXZpcnR1YWxdCi0gIC8vIFZUQUJMRS1TSU1QTEUtQy1ORVhUOiAxIHwgc2ltcGxlOjpDOjp+QygpIFtzY2FsYXIgZGVsZXRpbmddCi0gIC8vIFZUQUJMRS1TSU1QTEUtQy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTE2LCAtMTIgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnVjEnIGluICdWNCcgaW4gJ3NpbXBsZTo6QycgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIHNpbXBsZTo6Qzo6ZigpCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtMTIsIDAgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6IDEgfCBzaW1wbGU6OkM6On5DKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC0xMiwgLTggbm9uLXZpcnR1YWxdCisKKyAgLy8gQ0hFQ0stTEFCRUw6IFRodW5rcyBmb3IgJ3NpbXBsZTo6Qzo6fkMoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTEyLCAtOCBub24tdmlydHVhbF0KKworICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndm9pZCBzaW1wbGU6OkM6OmYoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTEyLCAwIG5vbi12aXJ0dWFsXQorCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnVjInIGluICdWNCcgaW4gJ3NpbXBsZTo6QycgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIHNpbXBsZTo6Qzo6ZigpCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtMTYsIC00IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgc2ltcGxlOjpDOjp+QygpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtMTYsIC0xMiBub24tdmlydHVhbF0KKworICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAnc2ltcGxlOjpDOjp+QygpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtMTYsIC0xMiBub24tdmlydHVhbF0KKworICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndm9pZCBzaW1wbGU6OkM6OmYoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTE2LCAtNCBub24tdmlydHVhbF0KIAogICBpbnQgeDsKICAgdmlydHVhbCB2b2lkIGYoKTsKQEAgLTEzNCw2ICsxNTYsNyBAQAogfTsKIAogQyBjOwordm9pZCB1c2UoQyAqb2JqKSB7IG9iai0+ZigpOyB9CiB9CiAKIG5hbWVzcGFjZSBleHRlbmRlZCB7CkBAIC0xNTIsMTIgKzE3NSwxNiBAQAogLy8gICBqbXAgTWV0aG9kQENsYXNzCiAKIHN0cnVjdCBBIDogdmlydHVhbCBzaW1wbGU6OkEgewotICAvLyBWVEFCTEUtRVhURU5ERUQtQTogVkZUYWJsZSBmb3IgJ1YxJyBpbiAnc2ltcGxlOjpBJyBpbiAnZXh0ZW5kZWQ6OkEnICgyIGVudHJpZXMpLgotICAvLyBWVEFCTEUtRVhURU5ERUQtQS1ORVhUOiAwIHwgdm9pZCBzaW1wbGU6OkE6OmYoKQotICAvLyBWVEFCTEUtRVhURU5ERUQtQS1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIHZicHRyIGF0IDggdG8gdGhlIGxlZnQsCi0gIC8vIFZUQUJMRS1FWFRFTkRFRC1BLU5FWFQ6ICAgICAgdmJvZmZzZXQgYXQgOCBpbiB0aGUgdmJ0YWJsZSwgOCBub24tdmlydHVhbF0KLSAgLy8gVlRBQkxFLUVYVEVOREVELUEtTkVYVDogMSB8IGV4dGVuZGVkOjpBOjp+QSgpIFtzY2FsYXIgZGVsZXRpbmddCi0gIC8vIFZUQUJMRS1FWFRFTkRFRC1BLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtNCwgMCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdWMScgaW4gJ3NpbXBsZTo6QScgaW4gJ2V4dGVuZGVkOjpBJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgc2ltcGxlOjpBOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCB2YnB0ciBhdCA4IHRvIHRoZSBsZWZ0LAorICAvLyBDSEVDSy1ORVhUOiAgICAgIHZib2Zmc2V0IGF0IDggaW4gdGhlIHZidGFibGUsIDggbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6IDEgfCBleHRlbmRlZDo6QTo6fkEoKSBbc2NhbGFyIGRlbGV0aW5nXQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIDAgbm9uLXZpcnR1YWxdCisKKyAgLy8gQ0hFQ0stTEFCRUw6IFRodW5rcyBmb3IgJ3ZvaWQgc2ltcGxlOjpBOjpmKCknICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCB2YnB0ciBhdCA4IHRvIHRoZSBsZWZ0LAorICAvLyBDSEVDSy1ORVhUOiAgICAgIHZib2Zmc2V0IGF0IDggaW4gdGhlIHZidGFibGUsIDggbm9uLXZpcnR1YWxdCiAKICAgLy8gYHZ0b3JkaXNwZXh7OCw4LDQyOTQ5NjcyOTIsOH0nCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/ZkBBQHNpbXBsZUBAJFI0NzdQUFBQUFBQTUA3QUVYWFoiCkBAIC0xNjgsMjggKzE5NSwzOCBAQAogfTsKIAogQSBhOwordm9pZCB1c2UoQSAqb2JqKSB7IGRlbGV0ZSBvYmo7IH0KIAogc3RydWN0IEIgOiB2aXJ0dWFsIHNpbXBsZTo6QSB7CiAgIC8vIFRoaXMgY2xhc3MgaGFzIGFuIGltcGxpY2l0IGR0b3IuICBWZHRvcnMgZG9uJ3QgcmVxdWlyZSB2dG9yZGlzcGV4IHRodW5rcwogICAvLyBhcyB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzIGFsd2F5cyBoYXMgYW4gaW1wbGljaXQgZHRvciwKICAgLy8gd2hpY2ggaXMgYSBmaW5hbCBvdmVycmlkZXIuCiAKLSAgLy8gVlRBQkxFLUVYVEVOREVELUI6IFZGVGFibGUgZm9yICdWMScgaW4gJ3NpbXBsZTo6QScgaW4gJ2V4dGVuZGVkOjpCJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdWMScgaW4gJ3NpbXBsZTo6QScgaW4gJ2V4dGVuZGVkOjpCJyAoMiBlbnRyaWVzKS4KICAgLy8gIC4uLgotICAvLyBWVEFCTEUtRVhURU5ERUQtQjogMSB8IGV4dGVuZGVkOjpCOjp+QigpIFtzY2FsYXIgZGVsZXRpbmddCi0gIC8vIFZUQUJMRS1FWFRFTkRFRC1CLU5FWFQ6IFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCAwIG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSzogMSB8IGV4dGVuZGVkOjpCOjp+QigpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLU5FWFQ6IFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCAwIG5vbi12aXJ0dWFsXQorCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2b2lkIHNpbXBsZTo6QTo6ZigpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtNCwgdmJwdHIgYXQgOCB0byB0aGUgbGVmdCwKKyAgLy8gQ0hFQ0stTkVYVDogICAgICB2Ym9mZnNldCBhdCA4IGluIHRoZSB2YnRhYmxlLCA4IG5vbi12aXJ0dWFsXQogCiAgIC8vIHZ0b3JkaXNwezQyOTQ5NjcyOTIsMH0KICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/X0VCQGV4dGVuZGVkQEAkNFBQUFBQUFBNQEFAQUVQQVhJQFoiCiB9OwogCiBCIGI7Cit2b2lkIHVzZShCICpvYmopIHsgZGVsZXRlIG9iajsgfQogCiBzdHJ1Y3QgQyA6IHZpcnR1YWwgc2ltcGxlOjpBIHsKLSAgLy8gVlRBQkxFLUVYVEVOREVELUM6IFZGVGFibGUgZm9yICdWMScgaW4gJ3NpbXBsZTo6QScgaW4gJ2V4dGVuZGVkOjpDJyAoMiBlbnRyaWVzKS4KLSAgLy8gVlRBQkxFLUVYVEVOREVELUMtTkVYVDogMCB8IHZvaWQgc2ltcGxlOjpBOjpmKCkKLSAgLy8gVlRBQkxFLUVYVEVOREVELUMtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCB2YnB0ciBhdCAxMiB0byB0aGUgbGVmdCwKLSAgLy8gVlRBQkxFLUVYVEVOREVELUMtTkVYVDogICAgICB2Ym9mZnNldCBhdCA4IGluIHRoZSB2YnRhYmxlLCA4IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ1YxJyBpbiAnc2ltcGxlOjpBJyBpbiAnZXh0ZW5kZWQ6OkMnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBzaW1wbGU6OkE6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIHZicHRyIGF0IDEyIHRvIHRoZSBsZWZ0LAorICAvLyBDSEVDSy1ORVhUOiAgICAgIHZib2Zmc2V0IGF0IDggaW4gdGhlIHZidGFibGUsIDggbm9uLXZpcnR1YWxdCisKKyAgLy8gQ0hFQ0stTEFCRUw6IFRodW5rcyBmb3IgJ3ZvaWQgc2ltcGxlOjpBOjpmKCknICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCB2YnB0ciBhdCAxMiB0byB0aGUgbGVmdCwKKyAgLy8gQ0hFQ0stTkVYVDogICAgICB2Ym9mZnNldCBhdCA4IGluIHRoZSB2YnRhYmxlLCA4IG5vbi12aXJ0dWFsXQogCiAgIC8vIGB2dG9yZGlzcGV4ezEyLDgsNDI5NDk2NzI5Miw4fScKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT9mQEFAc2ltcGxlQEAkUjRNQDdQUFBQUFBQTUA3QUVYWFoiCkBAIC0xOTksNiArMjM2LDcgQEAKIH07CiAKIEMgYzsKK3ZvaWQgdXNlKEMgKm9iaikgeyBkZWxldGUgb2JqOyB9CiAKIHN0cnVjdCBEIDogdmlydHVhbCBWMiB7CiAgIHZpcnR1YWwgdm9pZCBmKCk7CkBAIC0yMDcsMTAgKzI0NSwxNCBAQAogfTsKIAogc3RydWN0IEUgOiB2aXJ0dWFsIEQgewotICAvLyBWVEFCTEUtRVhURU5ERUQtRTogVkZUYWJsZSBmb3IgJ1YyJyBpbiAnZXh0ZW5kZWQ6OkQnIGluICdleHRlbmRlZDo6RScgKDIgZW50cmllcykuCi0gIC8vIFZUQUJMRS1FWFRFTkRFRC1FLU5FWFQ6IDAgfCB2b2lkIGV4dGVuZGVkOjpEOjpmKCkKLSAgLy8gVlRBQkxFLUVYVEVOREVELUUtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCB2YnB0ciBhdCA4IHRvIHRoZSBsZWZ0LAotICAvLyBWVEFCTEUtRVhURU5ERUQtRS1ORVhUOiAgICAgIHZib2Zmc2V0IGF0IDggaW4gdGhlIHZidGFibGUsIDEyIG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ1YyJyBpbiAnZXh0ZW5kZWQ6OkQnIGluICdleHRlbmRlZDo6RScgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIGV4dGVuZGVkOjpEOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCB2YnB0ciBhdCA4IHRvIHRoZSBsZWZ0LAorICAvLyBDSEVDSy1ORVhUOiAgICAgIHZib2Zmc2V0IGF0IDggaW4gdGhlIHZidGFibGUsIDEyIG5vbi12aXJ0dWFsXQorCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2b2lkIGV4dGVuZGVkOjpEOjpmKCknICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCB2YnB0ciBhdCA4IHRvIHRoZSBsZWZ0LAorICAvLyBDSEVDSy1ORVhUOiAgICAgIHZib2Zmc2V0IGF0IDggaW4gdGhlIHZidGFibGUsIDEyIG5vbi12aXJ0dWFsXQogCiAgIC8vIGB2dG9yZGlzcGV4ezgsOCw0Mjk0OTY3MjkyLDEyfScKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT9mQERAZXh0ZW5kZWRAQCRSNDc3UFBQUFBQUE1ATUBBRVhYWiIKQEAgLTIyMCwxMiArMjYyLDE3IEBACiB9OwogCiBFIGU7Cit2b2lkIHVzZShFICpvYmopIHsgZGVsZXRlIG9iajsgfSAKIAogc3RydWN0IEYgOiB2aXJ0dWFsIFosIHZpcnR1YWwgRCB7Ci0gIC8vIFZUQUJMRS1FWFRFTkRFRC1GOiBWRlRhYmxlIGZvciAnVjInIGluICdleHRlbmRlZDo6RCcgaW4gJ2V4dGVuZGVkOjpGJyAoMiBlbnRyaWVzKS4KLSAgLy8gVlRBQkxFLUVYVEVOREVELUYtTkVYVDogMCB8IHZvaWQgZXh0ZW5kZWQ6OkQ6OmYoKQotICAvLyBWVEFCTEUtRVhURU5ERUQtRi1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIHZicHRyIGF0IDIwIHRvIHRoZSBsZWZ0LAotICAvLyBWVEFCTEUtRVhURU5ERUQtRi1ORVhUOiAgICAgIHZib2Zmc2V0IGF0IDEyIGluIHRoZSB2YnRhYmxlLCAxMiBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdWMicgaW4gJ2V4dGVuZGVkOjpEJyBpbiAnZXh0ZW5kZWQ6OkYnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBleHRlbmRlZDo6RDo6ZigpCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtNCwgdmJwdHIgYXQgMjAgdG8gdGhlIGxlZnQsCisgIC8vIENIRUNLLU5FWFQ6ICAgICAgdmJvZmZzZXQgYXQgMTIgaW4gdGhlIHZidGFibGUsIDEyIG5vbi12aXJ0dWFsXQorCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2b2lkIGV4dGVuZGVkOjpEOjpmKCknICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCB2YnB0ciBhdCAyMCB0byB0aGUgbGVmdCwKKyAgLy8gQ0hFQ0stTkVYVDogICAgICB2Ym9mZnNldCBhdCAxMiBpbiB0aGUgdmJ0YWJsZSwgMTIgbm9uLXZpcnR1YWxdCiAKICAgLy8gYHZ0b3JkaXNwZXh7MjAsMTIsNDI5NDk2NzI5MiwxMn0nCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/ZkBEQGV4dGVuZGVkQEAkUjRCRUBNQFBQUFBQUFBNQE1AQUVYWFoiCkBAIC0yMzUsMTcgKzI4MiwyMiBAQAogfTsKIAogRiBmOwordm9pZCB1c2UoRiAqb2JqKSB7IGRlbGV0ZSBvYmo7IH0KIAogc3RydWN0IEcgOiB2aXJ0dWFsIHNpbXBsZTo6QSB7Ci0gIC8vIFZUQUJMRS1FWFRFTkRFRC1HOiBWRlRhYmxlIGZvciAnZXh0ZW5kZWQ6OkcnICgxIGVudHJpZXMpLgotICAvLyBWVEFCTEUtRVhURU5ERUQtRy1ORVhUOiAwIHwgdm9pZCBleHRlbmRlZDo6Rzo6ZygpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnZXh0ZW5kZWQ6OkcnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgZXh0ZW5kZWQ6Okc6OmcoKQogCi0gIC8vIFZUQUJMRS1FWFRFTkRFRC1HOiBWRlRhYmxlIGZvciAnVjEnIGluICdzaW1wbGU6OkEnIGluICdleHRlbmRlZDo6RycgKDIgZW50cmllcykuCi0gIC8vIFZUQUJMRS1FWFRFTkRFRC1HLU5FWFQ6IDAgfCB2b2lkIHNpbXBsZTo6QTo6ZigpCi0gIC8vIFZUQUJMRS1FWFRFTkRFRC1HLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtNCwgdmJwdHIgYXQgOCB0byB0aGUgbGVmdCwKLSAgLy8gVlRBQkxFLUVYVEVOREVELUctTkVYVDogICAgICB2Ym9mZnNldCBhdCA4IGluIHRoZSB2YnRhYmxlLCA4IG5vbi12aXJ0dWFsXQotICAvLyBWVEFCTEUtRVhURU5ERUQtRy1ORVhUOiAxIHwgZXh0ZW5kZWQ6Okc6On5HKCkgW3NjYWxhciBkZWxldGluZ10KLSAgLy8gVlRBQkxFLUVYVEVOREVELUctTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC00LCAwIG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ1YxJyBpbiAnc2ltcGxlOjpBJyBpbiAnZXh0ZW5kZWQ6OkcnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBzaW1wbGU6OkE6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIHZicHRyIGF0IDggdG8gdGhlIGxlZnQsCisgIC8vIENIRUNLLU5FWFQ6ICAgICAgdmJvZmZzZXQgYXQgOCBpbiB0aGUgdmJ0YWJsZSwgOCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IGV4dGVuZGVkOjpHOjp+RygpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtNCwgMCBub24tdmlydHVhbF0KKworICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndm9pZCBzaW1wbGU6OkE6OmYoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIHZicHRyIGF0IDggdG8gdGhlIGxlZnQsCisgIC8vIENIRUNLLU5FWFQ6ICAgICAgdmJvZmZzZXQgYXQgOCBpbiB0aGUgdmJ0YWJsZSwgOCBub24tdmlydHVhbF0KIAogICAvLyBFbWl0cyBhIEcncyBvd24gdmZwdHIsIHRodXMgbW92aW5nIHRoZSB2YnB0ciBpbiB0aGUgbGF5b3V0LgogICB2aXJ0dWFsIHZvaWQgZygpOwpAQCAtMjU2LDIyICszMDgsMjggQEAKIH07CiAKIEcgZzsKK3ZvaWQgdXNlKEcgKm9iaikgeyBvYmotPmcoKTsgfQogCiBzdHJ1Y3QgSCA6IFosIEEgewotICAvLyBWVEFCTEUtRVhURU5ERUQtSDogVkZUYWJsZSBmb3IgJ1onIGluICdleHRlbmRlZDo6SCcgKDIgZW50cmllcykuCi0gIC8vIFZUQUJMRS1FWFRFTkRFRC1ILU5FWFQ6IDAgfCB2b2lkIFo6OmcoKQotICAvLyBWVEFCTEUtRVhURU5ERUQtSC1ORVhUOiAxIHwgZXh0ZW5kZWQ6Okg6On5IKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdaJyBpbiAnZXh0ZW5kZWQ6OkgnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBaOjpnKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IGV4dGVuZGVkOjpIOjp+SCgpIFtzY2FsYXIgZGVsZXRpbmddCiAKLSAgLy8gVlRBQkxFLUVYVEVOREVELUg6IFZGVGFibGUgZm9yICdWMScgaW4gJ3NpbXBsZTo6QScgaW4gJ2V4dGVuZGVkOjpBJyBpbiAnZXh0ZW5kZWQ6OkgnICgyIGVudHJpZXMpLgotICAvLyBWVEFCTEUtRVhURU5ERUQtSC1ORVhUOiAwIHwgdm9pZCBzaW1wbGU6OkE6OmYoKQotICAvLyBWVEFCTEUtRVhURU5ERUQtSC1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIHZicHRyIGF0IDggdG8gdGhlIGxlZnQsCi0gIC8vIFZUQUJMRS1FWFRFTkRFRC1ILU5FWFQ6ICAgICAgdmJvZmZzZXQgYXQgOCBpbiB0aGUgdmJ0YWJsZSwgOCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdWMScgaW4gJ3NpbXBsZTo6QScgaW4gJ2V4dGVuZGVkOjpBJyBpbiAnZXh0ZW5kZWQ6OkgnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBzaW1wbGU6OkE6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIHZicHRyIGF0IDggdG8gdGhlIGxlZnQsCisgIC8vIENIRUNLLU5FWFQ6ICAgICAgdmJvZmZzZXQgYXQgOCBpbiB0aGUgdmJ0YWJsZSwgOCBub24tdmlydHVhbF0KKworICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndm9pZCBzaW1wbGU6OkE6OmYoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogdnRvcmRpc3AgYXQgLTQsIHZicHRyIGF0IDggdG8gdGhlIGxlZnQsCisgIC8vIENIRUNLLU5FWFQ6ICAgICAgdmJvZmZzZXQgYXQgOCBpbiB0aGUgdmJ0YWJsZSwgOCBub24tdmlydHVhbF0KIAogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxP2ZAQUBzaW1wbGVAQCRSNDc3UFBQUFBQUE1AN0FFWFhaIgogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fRUhAZXh0ZW5kZWRAQCQ0UFBQUFBQUE1AQkFAQUVQQVhJQFoiCiB9OwogCiBIIGg7Cit2b2lkIHVzZShIICpvYmopIHsgZGVsZXRlIG9iajsgfQogfQogCiBuYW1lc3BhY2UgcHIxNzczOCB7CkBAIC0yNzksMTAgKzMzNywxNCBAQAogLy8gSnVzdCBkbyB0aGUgcmlnaHQgdGhpbmcuCiAKIHN0cnVjdCBBIDogdmlydHVhbCBzaW1wbGU6OkIgewotICAvLyBWVEFCTEUtUFIxNzczOC1BOiBWRlRhYmxlIGZvciAnVjInIGluICdWMycgaW4gJ3NpbXBsZTo6QicgaW4gJ3ByMTc3Mzg6OkEnICgyIGVudHJpZXMpLgotICAvLyBWVEFCTEUtUFIxNzczOC1BLU5FWFQ6IDAgfCB2b2lkIHNpbXBsZTo6Qjo6ZigpCi0gIC8vIFZUQUJMRS1QUjE3NzM4LUEtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IHZ0b3JkaXNwIGF0IC0xMiwgdmJwdHIgYXQgMjAgdG8gdGhlIGxlZnQsCi0gIC8vIFZUQUJMRS1QUjE3NzM4LUEtTkVYVDogICAgICB2Ym9mZnNldCBhdCA4IGluIHRoZSB2YnRhYmxlLCAxNiBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdWMicgaW4gJ1YzJyBpbiAnc2ltcGxlOjpCJyBpbiAncHIxNzczODo6QScgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIHNpbXBsZTo6Qjo6ZigpCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtMTIsIHZicHRyIGF0IDIwIHRvIHRoZSBsZWZ0LAorICAvLyBDSEVDSy1ORVhUOiAgICAgIHZib2Zmc2V0IGF0IDggaW4gdGhlIHZidGFibGUsIDE2IG5vbi12aXJ0dWFsXQorCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2b2lkIHNpbXBsZTo6Qjo6ZigpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiB2dG9yZGlzcCBhdCAtMTIsIHZicHRyIGF0IDIwIHRvIHRoZSBsZWZ0LAorICAvLyBDSEVDSy1ORVhUOiAgICAgIHZib2Zmc2V0IGF0IDggaW4gdGhlIHZidGFibGUsIDE2IG5vbi12aXJ0dWFsXQogCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/ZkBCQHNpbXBsZUBAJFI0QkVAN1BQUFBQUFBFQEJBQEFFWFhaIgogICBpbnQgYTsKQEAgLTI5MCw2ICszNTIsNyBAQAogfTsKIAogQSBhOwordm9pZCB1c2UoQSAqb2JqKSB7IGRlbGV0ZSBvYmo7IH0KIH0KIAogbmFtZXNwYWNlIGFjY2VzcyB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12dGFibGVzLXZpcnR1YWwtaW5oZXJpdGFuY2UuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1hYmktdnRhYmxlcy12aXJ0dWFsLWluaGVyaXRhbmNlLmNwcAppbmRleCBiNThhMGIxLi4xOTQ3YjU5IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWFiaS12dGFibGVzLXZpcnR1YWwtaW5oZXJpdGFuY2UuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtYWJpLXZ0YWJsZXMtdmlydHVhbC1pbmhlcml0YW5jZS5jcHAKQEAgLTEsMjkgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtIC1vICV0LmxsIC1mZHVtcC12dGFibGUtbGF5b3V0cyAlcyAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyID4ldAotCi0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1WVEFCTEUtQyAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1WVEFCTEUtRCAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1URVNUMSAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1URVNUMiAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1URVNUMyAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1URVNUNCAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1URVNUNSAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1URVNUNiAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1URVNUNyAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1URVNUOC1YICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVRFU1Q4LVogJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9VEVTVDktWSAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1URVNUOS1aICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVRFU1Q5LVcgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9VEVTVDktVCAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1URVNUMTAgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9VkRUT1JTLVkgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9VkRUT1JTLVUgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9VkRUT1JTLVYgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9VkRUT1JTLVAgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9UkVULVcgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9UkVULVQgJXMgPCAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9UkVULVYgJXMgPCAldAotCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0gLW8gJXQubGwgLWZkdW1wLXZ0YWJsZS1sYXlvdXRzICVzIC10cmlwbGU9aTM4Ni1wYy13aW4zMiA+JXQKKy8vIFJVTjogRmlsZUNoZWNrICVzIDwgJXQKIC8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU1BTkdMSU5HICVzIDwgJXQubGwKIAogc3RydWN0IEVtcHR5IHsgfTsKQEAgLTM4LDM0ICsxNCwzNSBAQAogfTsKIAogc3RydWN0IEM6IHZpcnR1YWwgQSB7Ci0gIC8vIFZUQUJMRS1DOiBWRlRhYmxlIGZvciAnQScgaW4gJ0MnICgyIGVudHJpZXMpCi0gIC8vIFZUQUJMRS1DLU5FWFQ6IDAgfCB2b2lkIEM6OmYoKQotICAvLyBWVEFCTEUtQy1ORVhUOiAxIHwgdm9pZCBBOjp6KCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdBJyBpbiAnQycgKDIgZW50cmllcykKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgQzo6ZigpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEE6OnooKQogCi0gIC8vIFZUQUJMRS1DOiBWRlRhYmxlIGluZGljZXMgZm9yICdDJyAoMSBlbnRyaWVzKQotICAvLyBWVEFCTEUtQy1ORVhUOiB2YnRhYmxlIGluZGV4IDEsIHZmcHRyIGF0IG9mZnNldCAwCi0gIC8vIFZUQUJMRS1DLU5FWFQ6IDAgfCB2b2lkIEM6OmYoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBpbmRpY2VzIGZvciAnQycgKDEgZW50cnkpCisgIC8vIENIRUNLLU5FWFQ6IHZidGFibGUgaW5kZXggMSwgdmZwdHIgYXQgb2Zmc2V0IDAKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgQzo6ZigpCiAKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdDQEA2QkAiCiAKLSAgdmlydHVhbCB2b2lkIGYoKTsKKyAgdmlydHVhbCB2b2lkIGYoKSB7fQogfTsKIAogQyBjOwordm9pZCB1c2UoQyAqb2JqKSB7IG9iai0+ZigpOyB9CiAKIHN0cnVjdCBEOiB2aXJ0dWFsIEEgewotICAvLyBWVEFCTEUtRDogVkZUYWJsZSBmb3IgJ0QnICgxIGVudHJpZXMpLgotICAvLyBWVEFCTEUtRC1ORVhUOiAwIHwgdm9pZCBEOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdEJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEQ6OmgoKQogCi0gIC8vIFZUQUJMRS1EOiBWRlRhYmxlIGZvciAnQScgaW4gJ0QnICgyIGVudHJpZXMpLgotICAvLyBWVEFCTEUtRC1ORVhUOiAwIHwgdm9pZCBEOjpmKCkKLSAgLy8gVlRBQkxFLUQtTkVYVDogMSB8IHZvaWQgQTo6eigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ0QnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBEOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQTo6eigpCiAKLSAgLy8gVlRBQkxFLUQ6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ0QnICgyIGVudHJpZXMpLgotICAvLyBWVEFCTEUtRC1ORVhUOiB2aWEgdmZwdHIgYXQgb2Zmc2V0IDAKLSAgLy8gVlRBQkxFLUQtTkVYVDogMCB8IHZvaWQgRDo6aCgpCi0gIC8vIFZUQUJMRS1ELU5FWFQ6IHZpYSB2YnRhYmxlIGluZGV4IDEsIHZmcHRyIGF0IG9mZnNldCAwCi0gIC8vIFZUQUJMRS1ELU5FWFQ6IDAgfCB2b2lkIEQ6OmYoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBpbmRpY2VzIGZvciAnRCcgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IHZpYSB2ZnB0ciBhdCBvZmZzZXQgMAorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBEOjpoKCkKKyAgLy8gQ0hFQ0stTkVYVDogdmlhIHZidGFibGUgaW5kZXggMSwgdmZwdHIgYXQgb2Zmc2V0IDAKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgRDo6ZigpCiAKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdEQEA2QjBAQCIKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdEQEA2QkFAQEAiCkBAIC03NCw4ICs1MSw4IEBACiAgIHZpcnR1YWwgdm9pZCBoKCk7CiB9OwogCi12b2lkIEQ6OmgoKSB7fQogRCBkOwordm9pZCB1c2UoRCAqb2JqKSB7IG9iai0+aCgpOyB9CiAKIG5hbWVzcGFjZSBUZXN0MSB7CiAKQEAgLTg2LDMzICs2MywzNCBAQAogLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdZQFRlc3QxQEA2QkAiCiAKIHN0cnVjdCBaIDogdmlydHVhbCBZIHsKLSAgLy8gVEVTVDE6IFZGVGFibGUgZm9yICdBJyBpbiAnVGVzdDE6OlknIGluICdUZXN0MTo6WicgKDIgZW50cmllcykuCi0gIC8vIFRFU1QxLU5FWFQ6IDAgfCB2b2lkIEE6OmYoKQotICAvLyBURVNUMS1ORVhUOiAxIHwgdm9pZCBBOjp6KCkKKyAgWigpOworICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdUZXN0MTo6WScgaW4gJ1Rlc3QxOjpaJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgQTo6ZigpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEE6OnooKQogCi0gIC8vIFRFU1QxLU5PVDogVkZUYWJsZSBpbmRpY2VzIGZvciAnVGVzdDE6OlonCisgIC8vIENIRUNLLU5PVDogVkZUYWJsZSBpbmRpY2VzIGZvciAnVGVzdDE6OlonCiAKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdaQFRlc3QxQEA2QkAiCiB9OwogCi1aIHo7CitaOjpaKCkge30KIH0KIAogbmFtZXNwYWNlIFRlc3QyIHsKIAogc3RydWN0IFg6IHZpcnR1YWwgQSwgdmlydHVhbCBCIHsKLSAgLy8gVEVTVDI6IFZGVGFibGUgZm9yICdUZXN0Mjo6WCcgKDEgZW50cmllcykuCi0gIC8vIFRFU1QyLU5FWFQ6IDAgfCB2b2lkIFRlc3QyOjpYOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdUZXN0Mjo6WCcgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBUZXN0Mjo6WDo6aCgpCiAKLSAgLy8gVEVTVDI6IFZGVGFibGUgZm9yICdBJyBpbiAnVGVzdDI6OlgnICgyIGVudHJpZXMpLgotICAvLyBURVNUMi1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKLSAgLy8gVEVTVDItTkVYVDogMSB8IHZvaWQgQTo6eigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ1Rlc3QyOjpYJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgQTo6ZigpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEE6OnooKQogCi0gIC8vIFRFU1QyOiBWRlRhYmxlIGZvciAnQicgaW4gJ1Rlc3QyOjpYJyAoMSBlbnRyaWVzKS4KLSAgLy8gVEVTVDItTkVYVDogMCB8IHZvaWQgQjo6ZygpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQicgaW4gJ1Rlc3QyOjpYJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEI6OmcoKQogCi0gIC8vIFRFU1QyOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0Mjo6WCcgKDEgZW50cmllcykuCi0gIC8vIFRFU1QyLU5FWFQ6IDAgfCB2b2lkIFRlc3QyOjpYOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ1Rlc3QyOjpYJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIFRlc3QyOjpYOjpoKCkKIAogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1hAVGVzdDJAQDZCMDFAQCIKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdYQFRlc3QyQEA2QkFAQEAiCkBAIC0xMjIsNiArMTAwLDcgQEAKIH07CiAKIFggeDsKK3ZvaWQgdXNlKFggKm9iaikgeyBvYmotPmgoKTsgfQogfQogCiBuYW1lc3BhY2UgVGVzdDMgewpAQCAtMTMxLDMyICsxMTAsMzcgQEAKIH07CiAKIHN0cnVjdCBZOiB2aXJ0dWFsIFggewotICAvLyBURVNUMzogVkZUYWJsZSBmb3IgJ0EnIGluICdUZXN0Mzo6WCcgaW4gJ1Rlc3QzOjpZJyAoMiBlbnRyaWVzKS4KLSAgLy8gVEVTVDMtTkVYVDogMCB8IHZvaWQgQTo6ZigpCi0gIC8vIFRFU1QzLU5FWFQ6IDEgfCB2b2lkIEE6OnooKQorICBZKCk7CisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ1Rlc3QzOjpYJyBpbiAnVGVzdDM6OlknICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQTo6eigpCiAKLSAgLy8gVEVTVDMtTk9UOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0Mzo6WScKKyAgLy8gQ0hFQ0stTk9UOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0Mzo6WScKIAogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1lAVGVzdDNAQDZCQCIKIH07CiAKLVkgeTsKK1k6OlkoKSB7fQogfQogCiBuYW1lc3BhY2UgVGVzdDQgewogCiBzdHJ1Y3QgWDogdmlydHVhbCBDIHsKKyAgWCgpOwogICAvLyBUaGlzIG9uZSdzIGludGVyZXN0aW5nLiBDOjpmIGV4cGVjdHMgKEEqKSB0byBiZSBwYXNzZWQgYXMgJ3RoaXMnIGFuZCBkb2VzCiAgIC8vIEVDWC09NCB0byBjYXN0IHRvIChDKikuIEluIFgsIEMgYW5kIEEgdmJhc2VzIGFyZSByZW9yZGVyZWQsIHNvIHRoZSB0aHVuawogICAvLyBzaG91bGQgcGFzcyBhIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiBYIGluIG9yZGVyCiAgIC8vIGZvciBFQ1gtPTQgdG8gcG9pbnQgYXQgdGhlIEMgcGFydC4KIAotICAvLyBURVNUNDogVkZUYWJsZSBmb3IgJ0EnIGluICdDJyBpbiAnVGVzdDQ6OlgnICgyIGVudHJpZXMpLgotICAvLyBURVNUNC1ORVhUOiAwIHwgdm9pZCBDOjpmKCkKLSAgLy8gVEVTVDQtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IDggbm9uLXZpcnR1YWxdCi0gIC8vIFRFU1Q0LU5FWFQ6IDEgfCB2b2lkIEE6OnooKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdDJyBpbiAnVGVzdDQ6OlgnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBDOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IDggbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEE6OnooKQogCi0gIC8vIFRFU1Q0LU5PVDogVkZUYWJsZSBpbmRpY2VzIGZvciAnVGVzdDQ6OlgnCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2b2lkIEM6OmYoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogOCBub24tdmlydHVhbF0KKworICAvLyBDSEVDSy1OT1Q6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ1Rlc3Q0OjpYJwogCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183WEBUZXN0NEBANkJAIgogCkBAIC0xNjQsNyArMTQ4LDcgQEAKICAgLy8gTUFOR0xJTkctREFHOiBkZWZpbmUgd2VhayB4ODZfdGhpc2NhbGxjYyB2b2lkIEAiXDAxP2ZAQ0BAV1BQUFBQUFBJQEFFWFhaIgogfTsKIAotWCB4OworWDo6WCgpIHt9CiB9CiAKIG5hbWVzcGFjZSBUZXN0NSB7CkBAIC0xNzYsMTYgKzE2MCwxNiBAQAogfTsKIAogc3RydWN0IFkgOiB2aXJ0dWFsIFggewotICAvLyBURVNUNTogVkZUYWJsZSBmb3IgJ1Rlc3Q1OjpZJyAoMSBlbnRyaWVzKS4KLSAgLy8gVEVTVDUtTkVYVDogMCB8IHZvaWQgVGVzdDU6Olk6OmgoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ1Rlc3Q1OjpZJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIFRlc3Q1OjpZOjpoKCkKIAotICAvLyBURVNUNTogVkZUYWJsZSBmb3IgJ0EnIGluICdUZXN0NTo6WCcgaW4gJ1Rlc3Q1OjpZJyAoMyBlbnRyaWVzKS4KLSAgLy8gVEVTVDUtTkVYVDogMCB8IHZvaWQgQTo6ZigpCi0gIC8vIFRFU1Q1LU5FWFQ6IDEgfCB2b2lkIEE6OnooKQotICAvLyBURVNUNS1ORVhUOiAyIHwgdm9pZCBUZXN0NTo6WDo6ZygpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ1Rlc3Q1OjpYJyBpbiAnVGVzdDU6OlknICgzIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQTo6eigpCisgIC8vIENIRUNLLU5FWFQ6IDIgfCB2b2lkIFRlc3Q1OjpYOjpnKCkKIAotICAvLyBURVNUNTogVkZUYWJsZSBpbmRpY2VzIGZvciAnVGVzdDU6OlknICgxIGVudHJpZXMpLgotICAvLyBURVNUNS1ORVhUOiAwIHwgdm9pZCBUZXN0NTo6WTo6aCgpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0NTo6WScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBUZXN0NTo6WTo6aCgpCiAKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdZQFRlc3Q1QEA2QjAxQEAiCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183WUBUZXN0NUBANkJYQDFAQCIKQEAgLTE5NCwyMSArMTc4LDIzIEBACiB9OwogCiBZIHk7Cit2b2lkIHVzZShZICpvYmopIHsgb2JqLT5oKCk7IH0KIH0KIAogbmFtZXNwYWNlIFRlc3Q2IHsKIAogc3RydWN0IFggOiBBLCB2aXJ0dWFsIEVtcHR5IHsKLSAgLy8gVEVTVDY6IFZGVGFibGUgZm9yICdBJyBpbiAnVGVzdDY6OlgnICgyIGVudHJpZXMpLgotICAvLyBURVNUNi1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKLSAgLy8gVEVTVDYtTkVYVDogMSB8IHZvaWQgQTo6eigpCisgIFgoKTsKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdBJyBpbiAnVGVzdDY6OlgnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQTo6eigpCiAKLSAgLy8gVEVTVDYtTk9UOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0Njo6WCcKKyAgLy8gQ0hFQ0stTk9UOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0Njo6WCcKIAogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1hAVGVzdDZAQDZCQCIKIH07CiAKLVggeDsKK1g6OlgoKSB7fQogfQogCiBuYW1lc3BhY2UgVGVzdDcgewpAQCAtMjE4LDM2ICsyMDQsMzcgQEAKIH07CiAKIHN0cnVjdCBZIDogdmlydHVhbCBYIHsKLSAgLy8gVEVTVDc6IFZGVGFibGUgZm9yICdBJyBpbiAnQycgaW4gJ1Rlc3Q3OjpYJyBpbiAnVGVzdDc6OlknICgyIGVudHJpZXMpLgotICAvLyBURVNUNy1ORVhUOiAwIHwgdm9pZCBDOjpmKCkKLSAgLy8gVEVTVDctTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IDggbm9uLXZpcnR1YWxdCi0gIC8vIFRFU1Q3LU5FWFQ6IDEgfCB2b2lkIEE6OnooKQorICBZKCk7CisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ0MnIGluICdUZXN0Nzo6WCcgaW4gJ1Rlc3Q3OjpZJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgQzo6ZigpCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiA4IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBBOjp6KCkKIAotICAvLyBURVNUNzogVGh1bmtzIGZvciAndm9pZCBDOjpmKCknICgxIGVudHJ5KS4KLSAgLy8gVEVTVDctTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IDggbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2b2lkIEM6OmYoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogOCBub24tdmlydHVhbF0KIAotICAvLyBURVNUNy1OT1Q6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ1Rlc3Q3OjpZJworICAvLyBDSEVDSy1OT1Q6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ1Rlc3Q3OjpZJwogCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183WUBUZXN0N0BANkJAIgogfTsKIAotWSB5OworWTo6WSgpIHt9CiB9CiAKIG5hbWVzcGFjZSBUZXN0OCB7CiAKIC8vIFRoaXMgaXMgYSB0eXBpY2FsIGRpYW1vbmQgaW5oZXJpdGFuY2Ugd2l0aCBhIHNoYXJlZCAnQScgdmJhc2UuCiBzdHJ1Y3QgWCA6IEQsIEMgewotICAvLyBURVNUOC1YOiBWRlRhYmxlIGZvciAnRCcgaW4gJ1Rlc3Q4OjpYJyAoMSBlbnRyaWVzKS4KLSAgLy8gVEVTVDgtWC1ORVhUOiAwIHwgdm9pZCBEOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdEJyBpbiAnVGVzdDg6OlgnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgRDo6aCgpCiAKLSAgLy8gVEVTVDgtWDogVkZUYWJsZSBmb3IgJ0EnIGluICdEJyBpbiAnVGVzdDg6OlgnICgyIGVudHJpZXMpLgotICAvLyBURVNUOC1YLU5FWFQ6IDAgfCB2b2lkIFRlc3Q4OjpYOjpmKCkKLSAgLy8gVEVTVDgtWC1ORVhUOiAxIHwgdm9pZCBBOjp6KCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdBJyBpbiAnRCcgaW4gJ1Rlc3Q4OjpYJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgVGVzdDg6Olg6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBBOjp6KCkKIAotICAvLyBURVNUOC1YOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0ODo6WCcgKDEgZW50cmllcykuCi0gIC8vIFRFU1Q4LVgtTkVYVDogdmlhIHZidGFibGUgaW5kZXggMSwgdmZwdHIgYXQgb2Zmc2V0IDAKLSAgLy8gVEVTVDgtWC1ORVhUOiAwIHwgdm9pZCBUZXN0ODo6WDo6ZigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0ODo6WCcgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiB2aWEgdmJ0YWJsZSBpbmRleCAxLCB2ZnB0ciBhdCBvZmZzZXQgMAorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBUZXN0ODo6WDo6ZigpCiAKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdYQFRlc3Q4QEA2QkFAQEAiCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183WEBUZXN0OEBANkJEQEBAIgpAQCAtMjU2LDIxICsyNDMsNDUgQEAKIH07CiAKIFggeDsKK3ZvaWQgdXNlKFggKm9iaikgeyBvYmotPmYoKTsgfQogCiAvLyBBbm90aGVyIGRpYW1vbmQgaW5oZXJpdGFuY2Ugd2hpY2ggbGVkIHRvIEFTVCBjcmFzaGVzLgogc3RydWN0IFkgOiB2aXJ0dWFsIEEge307CiAKLWNsYXNzIFogOiBZLCBDIHsKLSAgLy8gVEVTVDgtWjogVkZUYWJsZSBmb3IgJ0EnIGluICdUZXN0ODo6WScgaW4gJ1Rlc3Q4OjpaJyAoMiBlbnRyaWVzKS4KLSAgLy8gVEVTVDgtWi1ORVhUOiAwIHwgdm9pZCBUZXN0ODo6Wjo6ZigpCi0gIC8vIFRFU1Q4LVotTkVYVDogMSB8IHZvaWQgQTo6eigpCitzdHJ1Y3QgWiA6IFksIEMgeworICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdUZXN0ODo6WScgaW4gJ1Rlc3Q4OjpaJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgVGVzdDg6Olo6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBBOjp6KCkKIAotICAvLyBURVNUOC1aOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0ODo6WicgKDEgZW50cmllcykuCi0gIC8vIFRFU1Q4LVotTkVYVDogdmlhIHZidGFibGUgaW5kZXggMSwgdmZwdHIgYXQgb2Zmc2V0IDAKLSAgLy8gVEVTVDgtWi1ORVhUOiAwIHwgdm9pZCBUZXN0ODo6Wjo6ZigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0ODo6WicgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiB2aWEgdmJ0YWJsZSBpbmRleCAxLCB2ZnB0ciBhdCBvZmZzZXQgMAorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBUZXN0ODo6Wjo6ZigpCiAgIHZpcnR1YWwgdm9pZCBmKCk7CiB9OwogWiB6Owordm9pZCB1c2UoWiAqb2JqKSB7IG9iai0+ZigpOyB9CisKKy8vIEFub3RoZXIgZGlhbW9uZCBpbmhlcml0YW5jZSB3aGljaCB3ZSBtaXNjb21waWxlZCAoUFIxODk2NykuCitzdHJ1Y3QgVyA6IHZpcnR1YWwgQSB7CisgIHZpcnR1YWwgdm9pZCBiYXIoKTsKK307CisKK3N0cnVjdCBUIDogVywgQyB7CisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnVGVzdDg6OlcnIGluICdUZXN0ODo6VCcgKDEgZW50cnkpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIFRlc3Q4OjpUOjpiYXIoKQorCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQScgaW4gJ1Rlc3Q4OjpXJyBpbiAnVGVzdDg6OlQnICgyIGVudHJpZXMpCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEM6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIEE6OnooKQorCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2b2lkIEM6OmYoKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCisgIHZpcnR1YWwgdm9pZCBiYXIoKTsKKyAgaW50IGZpZWxkOworfTsKK1QgdDsKK3ZvaWQgdXNlKFQgKm9iaikgeyBvYmotPmJhcigpOyB9CiB9CiAKIG5hbWVzcGFjZSBUZXN0OSB7CkBAIC0yNzgsMTUgKzI4OSwxNSBAQAogc3RydWN0IFggOiBBIHsgfTsKIAogc3RydWN0IFkgOiB2aXJ0dWFsIFggewotICAvLyBURVNUOS1ZOiBWRlRhYmxlIGZvciAnVGVzdDk6OlknICgxIGVudHJpZXMpLgotICAvLyBURVNUOS1ZLU5FWFQ6IDAgfCB2b2lkIFRlc3Q5OjpZOjpoKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdUZXN0OTo6WScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBUZXN0OTo6WTo6aCgpCiAKLSAgLy8gVEVTVDktWTogVkZUYWJsZSBmb3IgJ0EnIGluICdUZXN0OTo6WCcgaW4gJ1Rlc3Q5OjpZJyAoMiBlbnRyaWVzKS4KLSAgLy8gVEVTVDktWS1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKLSAgLy8gVEVTVDktWS1ORVhUOiAxIHwgdm9pZCBBOjp6KCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdBJyBpbiAnVGVzdDk6OlgnIGluICdUZXN0OTo6WScgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEE6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBBOjp6KCkKIAotICAvLyBURVNUOS1ZOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0OTo6WScgKDEgZW50cmllcykuCi0gIC8vIFRFU1Q5LVktTkVYVDogMCB8IHZvaWQgVGVzdDk6Olk6OmgoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBpbmRpY2VzIGZvciAnVGVzdDk6OlknICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgVGVzdDk6Olk6OmgoKQogCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183WUBUZXN0OUBANkIwMUBAIgogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1lAVGVzdDlAQDZCWEAxQEAiCkBAIC0yOTUsMTE1ICszMDYsMTEwIEBACiB9OwogCiBZIHk7Cit2b2lkIHVzZShZICpvYmopIHsgb2JqLT5oKCk7IH0KIAogc3RydWN0IFogOiBZLCB2aXJ0dWFsIEIgewotICAvLyBURVNUOS1aOiBWRlRhYmxlIGZvciAnVGVzdDk6OlknIGluICdUZXN0OTo6WicgKDEgZW50cmllcykuCi0gIC8vIFRFU1Q5LVotTkVYVDogMCB8IHZvaWQgVGVzdDk6Olk6OmgoKQorICBaKCk7CisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnVGVzdDk6OlknIGluICdUZXN0OTo6WicgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBUZXN0OTo6WTo6aCgpCiAKLSAgLy8gVEVTVDktWjogVkZUYWJsZSBmb3IgJ0EnIGluICdUZXN0OTo6WCcgaW4gJ1Rlc3Q5OjpZJyBpbiAnVGVzdDk6OlonICgyIGVudHJpZXMpLgotICAvLyBURVNUOS1aLU5FWFQ6IDAgfCB2b2lkIEE6OmYoKQotICAvLyBURVNUOS1aLU5FWFQ6IDEgfCB2b2lkIEE6OnooKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdUZXN0OTo6WCcgaW4gJ1Rlc3Q5OjpZJyBpbiAnVGVzdDk6OlonICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBBOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQTo6eigpCiAKLSAgLy8gVEVTVDktWjogVkZUYWJsZSBmb3IgJ0InIGluICdUZXN0OTo6WicgKDEgZW50cmllcykuCi0gIC8vIFRFU1Q5LVotTkVYVDogMCB8IHZvaWQgQjo6ZygpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAnQicgaW4gJ1Rlc3Q5OjpaJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEI6OmcoKQogCi0gIC8vIFRFU1Q5LVotTk9UOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0OTo6WicKKyAgLy8gQ0hFQ0stTk9UOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0OTo6WicKIAogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1pAVGVzdDlAQDZCWEAxQEAiCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183WkBUZXN0OUBANkJZQDFAQCIKIAotICAvLyBGSVhNRSB0aGlzIG9uZSBpcyB3cm9uZzoKLSAgLy8gSU5DT1JSRUNUIE1BTkdMSU5HLURBRzogQCJcMDE/P183WkBUZXN0OUBANkJCQEBAIgotICAvLyBNQU5HTElORy1EQUctU0hPVUxELUJFOiBAIlwwMT8/XzdaQFRlc3Q5QEA2QkAiCisgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183WkBUZXN0OUBANkJAIgogfTsKIAotWiB6OworWjo6WigpIHt9CiAKIHN0cnVjdCBXIDogWiwgRCwgdmlydHVhbCBBLCB2aXJ0dWFsIEIgewotICAvLyBURVNUOS1XOiBWRlRhYmxlIGZvciAnVGVzdDk6OlknIGluICdUZXN0OTo6WicgaW4gJ1Rlc3Q5OjpXJyAoMSBlbnRyaWVzKS4KLSAgLy8gVEVTVDktVy1ORVhUOiAwIHwgdm9pZCBUZXN0OTo6WTo6aCgpCisgIFcoKTsKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdUZXN0OTo6WScgaW4gJ1Rlc3Q5OjpaJyBpbiAnVGVzdDk6OlcnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgVGVzdDk6Olk6OmgoKQogCi0gIC8vIFRFU1Q5LVc6IFZGVGFibGUgZm9yICdBJyBpbiAnVGVzdDk6OlgnIGluICdUZXN0OTo6WScgaW4gJ1Rlc3Q5OjpaJyBpbiAnVGVzdDk6OlcnICgyIGVudHJpZXMpLgotICAvLyBURVNUOS1XLU5FWFQ6IDAgfCB2b2lkIEE6OmYoKQotICAvLyBURVNUOS1XLU5FWFQ6IDEgfCB2b2lkIEE6OnooKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdUZXN0OTo6WCcgaW4gJ1Rlc3Q5OjpZJyBpbiAnVGVzdDk6OlonIGluICdUZXN0OTo6VycgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEE6OmYoKQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBBOjp6KCkKIAotICAvLyBURVNUOS1XOiBWRlRhYmxlIGZvciAnQicgaW4gJ1Rlc3Q5OjpaJyBpbiAnVGVzdDk6OlcnICgxIGVudHJpZXMpLgotICAvLyBURVNUOS1XLU5FWFQ6IDAgfCB2b2lkIEI6OmcoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0InIGluICdUZXN0OTo6WicgaW4gJ1Rlc3Q5OjpXJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2b2lkIEI6OmcoKQogCi0gIC8vIFRFU1Q5LVc6IFZGVGFibGUgZm9yICdEJyBpbiAnVGVzdDk6OlcnICgxIGVudHJpZXMpLgotICAvLyBURVNUOS1XLU5FWFQ6IDAgfCB2b2lkIEQ6OmgoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0QnIGluICdUZXN0OTo6VycgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBEOjpoKCkKIAotICAvLyBURVNUOS1XOiBWRlRhYmxlIGZvciAnQScgaW4gJ0QnIGluICdUZXN0OTo6VycgKDIgZW50cmllcykuCi0gIC8vIFRFU1Q5LVctTkVYVDogMCB8IHZvaWQgRDo6ZigpCi0gIC8vIFRFU1Q5LVctTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQotICAvLyBURVNUOS1XLU5FWFQ6IDEgfCB2b2lkIEE6OnooKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdEJyBpbiAnVGVzdDk6OlcnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBEOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCBBOjp6KCkKIAotICAvLyBURVNUOS1XOiBUaHVua3MgZm9yICd2b2lkIEQ6OmYoKScgKDEgZW50cnkpLgotICAvLyBURVNUOS1XLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtOCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTEFCRUw6IFRodW5rcyBmb3IgJ3ZvaWQgRDo6ZigpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtOCBub24tdmlydHVhbF0KIAotICAvLyBURVNUOS1XLU5PVDogVkZUYWJsZSBpbmRpY2VzIGZvciAnVGVzdDk6OlcnCisgIC8vIENIRUNLLU5PVDogVkZUYWJsZSBpbmRpY2VzIGZvciAnVGVzdDk6OlcnCiAKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdXQFRlc3Q5QEA2QkFAQEAiCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183V0BUZXN0OUBANkJEQEBAIgogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1dAVGVzdDlAQDZCWEAxQEAiCiAKLSAgLy8gRklYTUU6IHRoZXNlIHR3byBhcmUgd3Jvbmc6Ci0gIC8vIElOQ09SUkVDVCBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1dAVGVzdDlAQDZCQkBAQCIKLSAgLy8gTUFOR0xJTkctREFHLVNIT1VMRC1CRTogQCJcMDE/P183V0BUZXN0OUBANkJAIgotICAvLyBJTkNPUlJFQ1QgTUFOR0xJTkctREFHOiBAIlwwMT8/XzdXQFRlc3Q5QEA2QllAMUBaQDFAQCIKLSAgLy8gTUFOR0xJTkctREFHLVNIT1VMRC1CRTogQCJcMDE/P183V0BUZXN0OUBANkJZQDFAQCIKKyAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdXQFRlc3Q5QEA2QkAiCisgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183V0BUZXN0OUBANkJZQDFAQCIKIH07CiAKLVcgdzsKK1c6OlcoKSB7fQogCiBzdHJ1Y3QgVCA6IFosIEQsIHZpcnR1YWwgQSwgdmlydHVhbCBCIHsKLSAgLy8gVEVTVDktVDogVkZUYWJsZSBmb3IgJ1Rlc3Q5OjpZJyBpbiAnVGVzdDk6OlonIGluICdUZXN0OTo6VCcgKDEgZW50cmllcykuCi0gIC8vIFRFU1Q5LVQtTkVYVDogMCB8IHZvaWQgVGVzdDk6OlQ6OmgoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ1Rlc3Q5OjpZJyBpbiAnVGVzdDk6OlonIGluICdUZXN0OTo6VCcgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBUZXN0OTo6VDo6aCgpCiAKLSAgLy8gVEVTVDktVDogVkZUYWJsZSBmb3IgJ0EnIGluICdUZXN0OTo6WCcgaW4gJ1Rlc3Q5OjpZJyBpbiAnVGVzdDk6OlonIGluICdUZXN0OTo6VCcgKDIgZW50cmllcykuCi0gIC8vIFRFU1Q5LVQtTkVYVDogMCB8IHZvaWQgVGVzdDk6OlQ6OmYoKQotICAvLyBURVNUOS1ULU5FWFQ6IDEgfCB2b2lkIFRlc3Q5OjpUOjp6KCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdBJyBpbiAnVGVzdDk6OlgnIGluICdUZXN0OTo6WScgaW4gJ1Rlc3Q5OjpaJyBpbiAnVGVzdDk6OlQnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBUZXN0OTo6VDo6ZigpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIFRlc3Q5OjpUOjp6KCkKIAotICAvLyBURVNUOS1UOiBWRlRhYmxlIGZvciAnQicgaW4gJ1Rlc3Q5OjpaJyBpbiAnVGVzdDk6OlQnICgxIGVudHJpZXMpLgotICAvLyBURVNUOS1ULU5FWFQ6IDAgfCB2b2lkIFRlc3Q5OjpUOjpnKCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdCJyBpbiAnVGVzdDk6OlonIGluICdUZXN0OTo6VCcgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBUZXN0OTo6VDo6ZygpCiAKLSAgLy8gVEVTVDktVDogVkZUYWJsZSBmb3IgJ0QnIGluICdUZXN0OTo6VCcgKDEgZW50cmllcykuCi0gIC8vIFRFU1Q5LVQtTkVYVDogMCB8IHZvaWQgVGVzdDk6OlQ6OmgoKQotICAvLyBURVNUOS1ULU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiAtOCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdEJyBpbiAnVGVzdDk6OlQnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgVGVzdDk6OlQ6OmgoKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTggbm9uLXZpcnR1YWxdCiAKLSAgLy8gVEVTVDktVDogVGh1bmtzIGZvciAndm9pZCBUZXN0OTo6VDo6aCgpJyAoMSBlbnRyeSkuCi0gIC8vIFRFU1Q5LVQtTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndm9pZCBUZXN0OTo6VDo6aCgpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtOCBub24tdmlydHVhbF0KIAotICAvLyBURVNUOS1UOiBWRlRhYmxlIGZvciAnQScgaW4gJ0QnIGluICdUZXN0OTo6VCcgKDIgZW50cmllcykuCi0gIC8vIFRFU1Q5LVQtTkVYVDogMCB8IHZvaWQgVGVzdDk6OlQ6OmYoKQotICAvLyBURVNUOS1ULU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiAtOCBub24tdmlydHVhbF0KLSAgLy8gVEVTVDktVC1ORVhUOiAxIHwgdm9pZCBUZXN0OTo6VDo6eigpCi0gIC8vIFRFU1Q5LVQtTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdEJyBpbiAnVGVzdDk6OlQnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBUZXN0OTo6VDo6ZigpCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiAtOCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgVGVzdDk6OlQ6OnooKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTggbm9uLXZpcnR1YWxdCiAKLSAgLy8gVEVTVDktVDogVGh1bmtzIGZvciAndm9pZCBUZXN0OTo6VDo6ZigpJyAoMSBlbnRyeSkuCi0gIC8vIFRFU1Q5LVQtTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndm9pZCBUZXN0OTo6VDo6ZigpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtOCBub24tdmlydHVhbF0KIAotICAvLyBURVNUOS1UOiBUaHVua3MgZm9yICd2b2lkIFRlc3Q5OjpUOjp6KCknICgxIGVudHJ5KS4KLSAgLy8gVEVTVDktVC1ORVhUOiAwIHwgW3RoaXMgYWRqdXN0bWVudDogLTggbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2b2lkIFRlc3Q5OjpUOjp6KCknICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQogCi0gIC8vIFRFU1Q5LVQ6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ1Rlc3Q5OjpUJyAoNCBlbnRyaWVzKS4KLSAgLy8gVEVTVDktVC1ORVhUOiB2aWEgdmZwdHIgYXQgb2Zmc2V0IDAKLSAgLy8gVEVTVDktVC1ORVhUOiAwIHwgdm9pZCBUZXN0OTo6VDo6aCgpCi0gIC8vIFRFU1Q5LVQtTkVYVDogdmlhIHZidGFibGUgaW5kZXggMSwgdmZwdHIgYXQgb2Zmc2V0IDAKLSAgLy8gVEVTVDktVC1ORVhUOiAwIHwgdm9pZCBUZXN0OTo6VDo6ZigpCi0gIC8vIFRFU1Q5LVQtTkVYVDogMSB8IHZvaWQgVGVzdDk6OlQ6OnooKQotICAvLyBURVNUOS1ULU5FWFQ6IHZpYSB2YnRhYmxlIGluZGV4IDIsIHZmcHRyIGF0IG9mZnNldCAwCi0gIC8vIFRFU1Q5LVQtTkVYVDogMCB8IHZvaWQgVGVzdDk6OlQ6OmcoKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBpbmRpY2VzIGZvciAnVGVzdDk6OlQnICg0IGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiB2aWEgdmZwdHIgYXQgb2Zmc2V0IDAKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgVGVzdDk6OlQ6OmgoKQorICAvLyBDSEVDSy1ORVhUOiB2aWEgdmJ0YWJsZSBpbmRleCAxLCB2ZnB0ciBhdCBvZmZzZXQgMAorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCBUZXN0OTo6VDo6ZigpCisgIC8vIENIRUNLLU5FWFQ6IDEgfCB2b2lkIFRlc3Q5OjpUOjp6KCkKKyAgLy8gQ0hFQ0stTkVYVDogdmlhIHZidGFibGUgaW5kZXggMiwgdmZwdHIgYXQgb2Zmc2V0IDAKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgVGVzdDk6OlQ6OmcoKQogCiAgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183VEBUZXN0OUBANkJBQEBAIgogICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1RAVGVzdDlAQDZCREBAQCIKICAgLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdUQFRlc3Q5QEA2QlhAMUBAIgogCi0gIC8vIEZJWE1FOiB0aGVzZSB0d28gYXJlIHdyb25nOgotICAvLyBJTkNPUlJFQ1QgTUFOR0xJTkctREFHOiBAIlwwMT8/XzdUQFRlc3Q5QEA2QkJAQEAiCi0gIC8vIE1BTkdMSU5HLURBRy1TSE9VTEQtQkU6IEAiXDAxPz9fN1RAVGVzdDlAQDZCQCIKLSAgLy8gSU5DT1JSRUNUIE1BTkdMSU5HLURBRzogQCJcMDE/P183VEBUZXN0OUBANkJZQDFAWkAxQEAiCi0gIC8vIE1BTkdMSU5HLURBRy1TSE9VTEQtQkU6IEAiXDAxPz9fN1RAVGVzdDlAQDZCWUAxQEAiCisgIC8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183VEBUZXN0OUBANkJAIgorICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1RAVGVzdDlAQDZCWUAxQEAiCiAKICAgdmlydHVhbCB2b2lkIGYoKTsKICAgdmlydHVhbCB2b2lkIGcoKTsKQEAgLTQxMiwyMiArNDE4LDQxIEBACiB9OwogCiBUIHQ7Cit2b2lkIHVzZShUICpvYmopIHsgb2JqLT5mKCk7IH0KIH0KIAogbmFtZXNwYWNlIFRlc3QxMCB7CiBzdHJ1Y3QgWCA6IHZpcnR1YWwgQywgdmlydHVhbCBBIHsKLSAgLy8gVEVTVDEwOiBWRlRhYmxlIGZvciAnQScgaW4gJ0MnIGluICdUZXN0MTA6OlgnICgyIGVudHJpZXMpLgotICAvLyBURVNUMTAtTkVYVDogMCB8IHZvaWQgVGVzdDEwOjpYOjpmKCkKLSAgLy8gVEVTVDEwLU5FWFQ6IDEgfCB2b2lkIEE6OnooKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0EnIGluICdDJyBpbiAnVGVzdDEwOjpYJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgVGVzdDEwOjpYOjpmKCkKKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgQTo6eigpCiAKLSAgLy8gVEVTVDEwOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0MTA6OlgnICgxIGVudHJpZXMpLgotICAvLyBURVNUMTAtTkVYVDogdmlhIHZidGFibGUgaW5kZXggMSwgdmZwdHIgYXQgb2Zmc2V0IDAKLSAgLy8gVEVTVDEwLU5FWFQ6IDAgfCB2b2lkIFRlc3QxMDo6WDo6ZigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICdUZXN0MTA6OlgnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogdmlhIHZidGFibGUgaW5kZXggMSwgdmZwdHIgYXQgb2Zmc2V0IDAKKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZvaWQgVGVzdDEwOjpYOjpmKCkKICAgdmlydHVhbCB2b2lkIGYoKTsKIH07CiAKIHZvaWQgWDo6ZigpIHt9CiBYIHg7Cit2b2lkIHVzZShYICpvYmopIHsgb2JqLT5mKCk7IH0KK30KKworbmFtZXNwYWNlIFRlc3QxMSB7CitzdHJ1Y3QgWCA6IHZpcnR1YWwgQSB7fTsKK3N0cnVjdCBZIHsgdmlydHVhbCB2b2lkIGcoKTsgfTsKKworc3RydWN0IFogOiB2aXJ0dWFsIFgsIFkgeworICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1pAVGVzdDExQEA2QllAMUBAIgorICAvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN1pAVGVzdDExQEA2QlhAMUBAIgorfTsKKworWiB6OworCitzdHJ1Y3QgVyA6IHZpcnR1YWwgWCwgQSB7fTsKKworLy8gVXNlZCB0byBjcmFzaCwgUFIxNzc0OC4KK1cgdzsKIH0KIAogbmFtZXNwYWNlIHZkdG9ycyB7CkBAIC00MzcsMTUgKzQ2MiwxNiBAQAogfTsKIAogc3RydWN0IFkgOiB2aXJ0dWFsIFggewotICAvLyBWRFRPUlMtWTogVkZUYWJsZSBmb3IgJ3ZkdG9yczo6WCcgaW4gJ3ZkdG9yczo6WScgKDIgZW50cmllcykuCi0gIC8vIFZEVE9SUy1ZLU5FWFQ6IDAgfCB2ZHRvcnM6Olk6On5ZKCkgW3NjYWxhciBkZWxldGluZ10KLSAgLy8gVkRUT1JTLVktTkVYVDogMSB8IHZvaWQgdmR0b3JzOjpYOjp6enooKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ3ZkdG9yczo6WCcgaW4gJ3ZkdG9yczo6WScgKDIgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2ZHRvcnM6Olk6On5ZKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgdmR0b3JzOjpYOjp6enooKQogCi0gIC8vIFZEVE9SUy1ZLU5PVDogVGh1bmtzIGZvciAndmR0b3JzOjpZOjp+WSgpJworICAvLyBDSEVDSy1OT1Q6IFRodW5rcyBmb3IgJ3ZkdG9yczo6WTo6flkoKScKICAgdmlydHVhbCB+WSgpOwogfTsKIAogWSB5Owordm9pZCB1c2UoWSAqb2JqKSB7IGRlbGV0ZSBvYmo7IH0KIAogc3RydWN0IFogewogICB2aXJ0dWFsIHZvaWQgeigpOwpAQCAtNDU2LDU5ICs0ODIsODYgQEAKIH07CiAKIHN0cnVjdCBVIDogdmlydHVhbCBXIHsKLSAgLy8gVkRUT1JTLVU6IFZGVGFibGUgZm9yICd2ZHRvcnM6OlonIGluICd2ZHRvcnM6OlcnIGluICd2ZHRvcnM6OlUnICgxIGVudHJpZXMpLgotICAvLyBWRFRPUlMtVS1ORVhUOiAwIHwgdm9pZCB2ZHRvcnM6Olo6OnooKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ3ZkdG9yczo6WicgaW4gJ3ZkdG9yczo6VycgaW4gJ3ZkdG9yczo6VScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCB2ZHRvcnM6Olo6OnooKQogCi0gIC8vIFZEVE9SUy1VOiBWRlRhYmxlIGZvciAndmR0b3JzOjpYJyBpbiAndmR0b3JzOjpXJyBpbiAndmR0b3JzOjpVJyAoMiBlbnRyaWVzKS4KLSAgLy8gVkRUT1JTLVUtTkVYVDogMCB8IHZkdG9yczo6VTo6flUoKSBbc2NhbGFyIGRlbGV0aW5nXQotICAvLyBWRFRPUlMtVS1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCi0gIC8vIFZEVE9SUy1VLU5FWFQ6IDEgfCB2b2lkIHZkdG9yczo6WDo6enp6KCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICd2ZHRvcnM6OlgnIGluICd2ZHRvcnM6OlcnIGluICd2ZHRvcnM6OlUnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdmR0b3JzOjpVOjp+VSgpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgdmR0b3JzOjpYOjp6enooKQogCi0gIC8vIFZEVE9SUy1VOiBUaHVua3MgZm9yICd2ZHRvcnM6Olc6On5XKCknICgxIGVudHJ5KS4KLSAgLy8gVkRUT1JTLVUtTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndmR0b3JzOjpVOjp+VSgpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KIAotICAvLyBWRFRPUlMtVTogVkZUYWJsZSBpbmRpY2VzIGZvciAndmR0b3JzOjpVJyAoMSBlbnRyaWVzKS4KLSAgLy8gVkRUT1JTLVUtTkVYVDogLS0gYWNjZXNzaWJsZSB2aWEgdmJ0YWJsZSBpbmRleCAxLCB2ZnB0ciBhdCBvZmZzZXQgNCAtLQotICAvLyBWRFRPUlMtVS1ORVhUOiAwIHwgdmR0b3JzOjpVOjp+VSgpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICd2ZHRvcnM6OlUnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogLS0gYWNjZXNzaWJsZSB2aWEgdmJ0YWJsZSBpbmRleCAxLCB2ZnB0ciBhdCBvZmZzZXQgNCAtLQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdmR0b3JzOjpVOjp+VSgpIFtzY2FsYXIgZGVsZXRpbmddCiAgIHZpcnR1YWwgflUoKTsKIH07CiAKIFUgdTsKK3ZvaWQgdXNlKFUgKm9iaikgeyBkZWxldGUgb2JqOyB9CiAKIHN0cnVjdCBWIDogdmlydHVhbCBXIHsKLSAgLy8gVkRUT1JTLVY6IFZGVGFibGUgZm9yICd2ZHRvcnM6OlonIGluICd2ZHRvcnM6OlcnIGluICd2ZHRvcnM6OlYnICgxIGVudHJpZXMpLgotICAvLyBWRFRPUlMtVi1ORVhUOiAwIHwgdm9pZCB2ZHRvcnM6Olo6OnooKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ3ZkdG9yczo6WicgaW4gJ3ZkdG9yczo6VycgaW4gJ3ZkdG9yczo6VicgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdm9pZCB2ZHRvcnM6Olo6OnooKQogCi0gIC8vIFZEVE9SUy1WOiBWRlRhYmxlIGZvciAndmR0b3JzOjpYJyBpbiAndmR0b3JzOjpXJyBpbiAndmR0b3JzOjpWJyAoMiBlbnRyaWVzKS4KLSAgLy8gVkRUT1JTLVYtTkVYVDogMCB8IHZkdG9yczo6Vjo6flYoKSBbc2NhbGFyIGRlbGV0aW5nXQotICAvLyBWRFRPUlMtVi1ORVhUOiAgICAgW3RoaXMgYWRqdXN0bWVudDogLTQgbm9uLXZpcnR1YWxdCi0gIC8vIFZEVE9SUy1WLU5FWFQ6IDEgfCB2b2lkIHZkdG9yczo6WDo6enp6KCkKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICd2ZHRvcnM6OlgnIGluICd2ZHRvcnM6OlcnIGluICd2ZHRvcnM6OlYnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdmR0b3JzOjpWOjp+VigpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHZvaWQgdmR0b3JzOjpYOjp6enooKQogCi0gIC8vIFZEVE9SUy1WOiBUaHVua3MgZm9yICd2ZHRvcnM6Olc6On5XKCknICgxIGVudHJ5KS4KLSAgLy8gVkRUT1JTLVYtTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC00IG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAndmR0b3JzOjpWOjp+VigpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbdGhpcyBhZGp1c3RtZW50OiAtNCBub24tdmlydHVhbF0KIAotICAvLyBWRFRPUlMtVjogVkZUYWJsZSBpbmRpY2VzIGZvciAndmR0b3JzOjpWJyAoMSBlbnRyaWVzKS4KLSAgLy8gVkRUT1JTLVYtTkVYVDogLS0gYWNjZXNzaWJsZSB2aWEgdmJ0YWJsZSBpbmRleCAxLCB2ZnB0ciBhdCBvZmZzZXQgNCAtLQotICAvLyBWRFRPUlMtVi1ORVhUOiAwIHwgdmR0b3JzOjpWOjp+VigpIFtzY2FsYXIgZGVsZXRpbmddCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGluZGljZXMgZm9yICd2ZHRvcnM6OlYnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogLS0gYWNjZXNzaWJsZSB2aWEgdmJ0YWJsZSBpbmRleCAxLCB2ZnB0ciBhdCBvZmZzZXQgNCAtLQorICAvLyBDSEVDSy1ORVhUOiAwIHwgdmR0b3JzOjpWOjp+VigpIFtzY2FsYXIgZGVsZXRpbmddCiB9OwogCiBWIHY7Cit2b2lkIHVzZShWICpvYmopIHsgZGVsZXRlIG9iajsgfQogCiBzdHJ1Y3QgVCA6IHZpcnR1YWwgWCB7CiAgIHZpcnR1YWwgflQoKTsKIH07CiAKIHN0cnVjdCBQIDogVCwgWSB7Ci0gIC8vIFZEVE9SUy1QOiBWRlRhYmxlIGZvciAndmR0b3JzOjpYJyBpbiAndmR0b3JzOjpUJyBpbiAndmR0b3JzOjpQJyAoMiBlbnRyaWVzKS4KLSAgLy8gVkRUT1JTLVAtTkVYVDogMCB8IHZkdG9yczo6UDo6flAoKSBbc2NhbGFyIGRlbGV0aW5nXQotICAvLyBWRFRPUlMtUC1ORVhUOiAxIHwgdm9pZCB2ZHRvcnM6Olg6Onp6eigpCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAndmR0b3JzOjpYJyBpbiAndmR0b3JzOjpUJyBpbiAndmR0b3JzOjpQJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZkdG9yczo6UDo6flAoKSBbc2NhbGFyIGRlbGV0aW5nXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCB2ZHRvcnM6Olg6Onp6eigpCiAKLSAgLy8gVkRUT1JTLVAtTk9UOiBUaHVua3MgZm9yICd2ZHRvcnM6OlA6On5QKCknCisgIC8vIENIRUNLLU5PVDogVGh1bmtzIGZvciAndmR0b3JzOjpQOjp+UCgpJwogICB2aXJ0dWFsIH5QKCk7CiB9OwogCiBQIHA7Cit2b2lkIHVzZShQICpvYmopIHsgZGVsZXRlIG9iajsgfQogCitzdHJ1Y3QgUSB7CisgIHZpcnR1YWwgflEoKTsKK307CisKKy8vIFBSMTkxNzI6IFlldCBhbm90aGVyIGRpYW1vbmQgd2UgbWlzY29tcGlsZWQuCitzdHJ1Y3QgUiA6IHZpcnR1YWwgUSwgWCB7CisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAndmR0b3JzOjpRJyBpbiAndmR0b3JzOjpSJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCB2ZHRvcnM6OlI6On5SKCkgW3NjYWxhciBkZWxldGluZ10KKyAgLy8gQ0hFQ0stTkVYVDogICAgIFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQorCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICd2ZHRvcnM6OlI6On5SKCknICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFt0aGlzIGFkanVzdG1lbnQ6IC04IG5vbi12aXJ0dWFsXQorCisgIC8vIENIRUNLLUxBQkVMOiBWRlRhYmxlIGZvciAndmR0b3JzOjpYJyBpbiAndmR0b3JzOjpSJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IHZkdG9yczo6Ujo6flIoKSBbc2NhbGFyIGRlbGV0aW5nXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgdm9pZCB2ZHRvcnM6Olg6Onp6eigpCisKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3ZkdG9yczo6UicgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgdmR0b3JzOjpSOjp+UigpIFtzY2FsYXIgZGVsZXRpbmddCisgIHZpcnR1YWwgflIoKTsKK307CisKK1IgcjsKK3ZvaWQgdXNlKFIgKm9iaikgeyBkZWxldGUgb2JqOyB9CiB9CiAKIG5hbWVzcGFjZSByZXR1cm5fYWRqdXN0bWVudCB7CkBAIC01MjYsNTAgKzU3OSwxMjEgQEAKIH07CiAKIHN0cnVjdCBXIDogWiB7Ci0gIC8vIFJFVC1XOiBWRlRhYmxlIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlonIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VycgKDIgZW50cmllcykuCi0gIC8vIFJFVC1XLU5FWFQ6IDAgfCByZXR1cm5fYWRqdXN0bWVudDo6WCAqcmV0dXJuX2FkanVzdG1lbnQ6Olc6OmZvbygpCi0gIC8vIFJFVC1XLU5FWFQ6ICAgICBbcmV0dXJuIGFkanVzdG1lbnQ6IHZiYXNlICMxLCAwIG5vbi12aXJ0dWFsXQotICAvLyBSRVQtVy1ORVhUOiAxIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlggKnJldHVybl9hZGp1c3RtZW50OjpXOjpmb28oKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpaJyBpbiAncmV0dXJuX2FkanVzdG1lbnQ6OlcnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlggKnJldHVybl9hZGp1c3RtZW50OjpXOjpmb28oKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgQSAqJyk6IHZiYXNlICMxLCAwIG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAxIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlggKnJldHVybl9hZGp1c3RtZW50OjpXOjpmb28oKQogCi0gIC8vIFJFVC1XOiBWRlRhYmxlIGluZGljZXMgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6VycgKDEgZW50cmllcykuCi0gIC8vIFJFVC1XLU5FWFQ6IDEgfCByZXR1cm5fYWRqdXN0bWVudDo6WCAqcmV0dXJuX2FkanVzdG1lbnQ6Olc6OmZvbygpCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6WCAqcmV0dXJuX2FkanVzdG1lbnQ6Olc6OmZvbygpJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCBbcmV0dXJuIGFkanVzdG1lbnQgKHRvIHR5cGUgJ3N0cnVjdCBBIConKTogdmJhc2UgIzEsIDAgbm9uLXZpcnR1YWxdCisKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpXJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDEgfCByZXR1cm5fYWRqdXN0bWVudDo6WCAqcmV0dXJuX2FkanVzdG1lbnQ6Olc6OmZvbygpCiAKICAgdmlydHVhbCBYKiBmb28oKTsKIH07CiAKLVcgeTsKK1cgdzsKK3ZvaWQgdXNlKFcgKm9iaikgeyBvYmotPmZvbygpOyB9CiAKIHN0cnVjdCBUIDogVyB7Ci0gIC8vIFJFVC1UOiBWRlRhYmxlIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlonIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VycgaW4gJ3JldHVybl9hZGp1c3RtZW50OjpUJyAoMyBlbnRyaWVzKS4KLSAgLy8gUkVULVQtTkVYVDogMCB8IHJldHVybl9hZGp1c3RtZW50OjpZICpyZXR1cm5fYWRqdXN0bWVudDo6VDo6Zm9vKCkKLSAgLy8gUkVULVQtTkVYVDogICAgIFtyZXR1cm4gYWRqdXN0bWVudDogdmJhc2UgIzEsIDAgbm9uLXZpcnR1YWxdCi0gIC8vIFJFVC1ULU5FWFQ6IDEgfCByZXR1cm5fYWRqdXN0bWVudDo6WSAqcmV0dXJuX2FkanVzdG1lbnQ6OlQ6OmZvbygpCi0gIC8vIFJFVC1ULU5FWFQ6ICAgICBbcmV0dXJuIGFkanVzdG1lbnQ6IHZiYXNlICMyLCAwIG5vbi12aXJ0dWFsXQotICAvLyBSRVQtVC1ORVhUOiAyIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlkgKnJldHVybl9hZGp1c3RtZW50OjpUOjpmb28oKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpaJyBpbiAncmV0dXJuX2FkanVzdG1lbnQ6OlcnIGluICdyZXR1cm5fYWRqdXN0bWVudDo6VCcgKDMgZW50cmllcykuCisgIC8vIENIRUNLLU5FWFQ6IDAgfCByZXR1cm5fYWRqdXN0bWVudDo6WSAqcmV0dXJuX2FkanVzdG1lbnQ6OlQ6OmZvbygpCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbcmV0dXJuIGFkanVzdG1lbnQgKHRvIHR5cGUgJ3N0cnVjdCBBIConKTogdmJhc2UgIzEsIDAgbm9uLXZpcnR1YWxdCisgIC8vIENIRUNLLU5FWFQ6IDEgfCByZXR1cm5fYWRqdXN0bWVudDo6WSAqcmV0dXJuX2FkanVzdG1lbnQ6OlQ6OmZvbygpCisgIC8vIENIRUNLLU5FWFQ6ICAgICBbcmV0dXJuIGFkanVzdG1lbnQgKHRvIHR5cGUgJ3N0cnVjdCByZXR1cm5fYWRqdXN0bWVudDo6WCAqJyk6IHZiYXNlICMyLCAwIG5vbi12aXJ0dWFsXQorICAvLyBDSEVDSy1ORVhUOiAyIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlkgKnJldHVybl9hZGp1c3RtZW50OjpUOjpmb28oKQogCi0gIC8vIFJFVC1UOiBWRlRhYmxlIGluZGljZXMgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6VCcgKDEgZW50cmllcykuCi0gIC8vIFJFVC1ULU5FWFQ6IDIgfCByZXR1cm5fYWRqdXN0bWVudDo6WSAqcmV0dXJuX2FkanVzdG1lbnQ6OlQ6OmZvbygpCisgIC8vIENIRUNLLUxBQkVMOiBUaHVua3MgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6WSAqcmV0dXJuX2FkanVzdG1lbnQ6OlQ6OmZvbygpJyAoMiBlbnRyaWVzKS4KKyAgLy8gQ0hFQ0stTkVYVDogMCB8IFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IEEgKicpOiB2YmFzZSAjMSwgMCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IFtyZXR1cm4gYWRqdXN0bWVudCAodG8gdHlwZSAnc3RydWN0IHJldHVybl9hZGp1c3RtZW50OjpYIConKTogdmJhc2UgIzIsIDAgbm9uLXZpcnR1YWxdCisKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgaW5kaWNlcyBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpUJyAoMSBlbnRyeSkuCisgIC8vIENIRUNLLU5FWFQ6IDIgfCByZXR1cm5fYWRqdXN0bWVudDo6WSAqcmV0dXJuX2FkanVzdG1lbnQ6OlQ6OmZvbygpCiAKICAgdmlydHVhbCBZKiBmb28oKTsKIH07CiAKIFQgdDsKK3ZvaWQgdXNlKFQgKm9iaikgeyBvYmotPmZvbygpOyB9CiAKIHN0cnVjdCBVIDogdmlydHVhbCBBIHsKICAgdmlydHVhbCB2b2lkIGcoKTsgIC8vIGFkZHMgYSB2ZnB0cgogfTsKIAogc3RydWN0IFYgOiBaIHsKLSAgLy8gUkVULVY6IFZGVGFibGUgZm9yICdyZXR1cm5fYWRqdXN0bWVudDo6WicgaW4gJ3JldHVybl9hZGp1c3RtZW50OjpWJyAoMiBlbnRyaWVzKS4KLSAgLy8gUkVULVYtTkVYVDogMCB8IHJldHVybl9hZGp1c3RtZW50OjpVICpyZXR1cm5fYWRqdXN0bWVudDo6Vjo6Zm9vKCkKLSAgLy8gUkVULVYtTkVYVDogICAgIFtyZXR1cm4gYWRqdXN0bWVudDogdmJwdHIgYXQgb2Zmc2V0IDQsIHZiYXNlICMxLCAwIG5vbi12aXJ0dWFsXQotICAvLyBSRVQtVi1ORVhUOiAxIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlUgKnJldHVybl9hZGp1c3RtZW50OjpWOjpmb28oKQorICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ3JldHVybl9hZGp1c3RtZW50OjpaJyBpbiAncmV0dXJuX2FkanVzdG1lbnQ6OlYnICgyIGVudHJpZXMpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlUgKnJldHVybl9hZGp1c3RtZW50OjpWOjpmb28oKQorICAvLyBDSEVDSy1ORVhUOiAgICAgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgQSAqJyk6IHZicHRyIGF0IG9mZnNldCA0LCB2YmFzZSAjMSwgMCBub24tdmlydHVhbF0KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHJldHVybl9hZGp1c3RtZW50OjpVICpyZXR1cm5fYWRqdXN0bWVudDo6Vjo6Zm9vKCkKIAotICAvLyBSRVQtVjogVkZUYWJsZSBpbmRpY2VzIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlYnICgxIGVudHJpZXMpLgotICAvLyBSRVQtVi1ORVhUOiAxIHwgcmV0dXJuX2FkanVzdG1lbnQ6OlUgKnJldHVybl9hZGp1c3RtZW50OjpWOjpmb28oKQorICAvLyBDSEVDSy1MQUJFTDogVGh1bmtzIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlUgKnJldHVybl9hZGp1c3RtZW50OjpWOjpmb28oKScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAwIHwgW3JldHVybiBhZGp1c3RtZW50ICh0byB0eXBlICdzdHJ1Y3QgQSAqJyk6IHZicHRyIGF0IG9mZnNldCA0LCB2YmFzZSAjMSwgMCBub24tdmlydHVhbF0KKworICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBpbmRpY2VzIGZvciAncmV0dXJuX2FkanVzdG1lbnQ6OlYnICgxIGVudHJ5KS4KKyAgLy8gQ0hFQ0stTkVYVDogMSB8IHJldHVybl9hZGp1c3RtZW50OjpVICpyZXR1cm5fYWRqdXN0bWVudDo6Vjo6Zm9vKCkKIAogICB2aXJ0dWFsIFUqIGZvbygpOwogfTsKIAogViB2Owordm9pZCB1c2UoViAqb2JqKSB7IG9iai0+Zm9vKCk7IH0KK30KKworbmFtZXNwYWNlIHByMTc3NDggeworc3RydWN0IEEgeworICB2aXJ0dWFsIHZvaWQgZigpIHt9Cit9OworCitzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7CisgIEIoKSB7fQorfTsKKworc3RydWN0IEMgOiB2aXJ0dWFsIEIsIEEgeworICBDKCkge30KK307CitDIGM7CisKKy8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183QUBwcjE3NzQ4QEA2QkAiCisvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN0JAcHIxNzc0OEBANkJAIgorLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdDQHByMTc3NDhAQDZCQUAxQEAiCisvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN0NAcHIxNzc0OEBANkJCQDFAQCIKK30KKworbmFtZXNwYWNlIHByMTkwNjYgeworc3RydWN0IFggOiB2aXJ0dWFsIEIge307CisKK3N0cnVjdCBZIDogdmlydHVhbCBYLCBCIHsKKyAgWSgpOworICAvLyBDSEVDSy1MQUJFTDogVkZUYWJsZSBmb3IgJ0InIGluICdwcjE5MDY2OjpYJyBpbiAncHIxOTA2Njo6WScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAgMCB8IHZvaWQgQjo6ZygpCisKKyAgLy8gQ0hFQ0stTEFCRUw6IFZGVGFibGUgZm9yICdCJyBpbiAncHIxOTA2Njo6WScgKDEgZW50cnkpLgorICAvLyBDSEVDSy1ORVhUOiAgMCB8IHZvaWQgQjo6ZygpCit9OworCitZOjpZKCkge30KK30KKworbmFtZXNwYWNlIHByMTkyNDAgeworc3RydWN0IEEgeworICB2aXJ0dWFsIHZvaWQgYygpOworfTsKKworc3RydWN0IEIgOiB2aXJ0dWFsIEEgeworICB2aXJ0dWFsIHZvaWQgYygpOworfTsKKworc3RydWN0IEMgeyB9OworCitzdHJ1Y3QgRCA6IHZpcnR1YWwgQSwgdmlydHVhbCBDLCBCIHt9OworCitEIG9iajsKKworLy8gRWFjaCBNREMgb25seSBoYXMgb25lIHZmdGFibGUuCisKKy8vIE1BTkdMSU5HLURBRzogQCJcMDE/P183REBwcjE5MjQwQEA2QkAiCisvLyBNQU5HTElORy1EQUc6IEAiXDAxPz9fN0FAcHIxOTI0MEBANkJAIgorLy8gTUFOR0xJTkctREFHOiBAIlwwMT8/XzdCQHByMTkyNDBAQDZCQCIKKwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1pbnRlcmZhY2UuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1pbnRlcmZhY2UuY3BwCmluZGV4IDQxOTA3NWEuLmMwMzBkMWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtaW50ZXJmYWNlLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LWludGVyZmFjZS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZm1zLWV4dGVuc2lvbnMgLVduby1taWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWZtcy1leHRlbnNpb25zIC1Xbm8tbWljcm9zb2Z0IC10cmlwbGU9aTM4Ni1wYy13aW5kb3dzLWdudSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogX19pbnRlcmZhY2UgSSB7CiAgIGludCB0ZXN0KCkgewpAQCAtMjAsMjQgKzIwLDIxIEBACiAvLyBDSEVDSzogQF9aVFYxUyA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzMgeCBpOCpdIFtpOCogbnVsbCwgaTgqIGJpdGNhc3QgKHsgaTgqLCBpOCosIGk4KiB9KiBAX1pUSTFTIHRvIGk4KiksIGk4KiBiaXRjYXN0IChpMzIgKCVzdHJ1Y3QuUyopKiBAX1pOMVM0dGVzdEV2IHRvIGk4KildCiAKIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgaTMyIEBfWjJmbnYoKQotLy8gQ0hFQ0s6ICAgY2FsbCB2b2lkIEBfWk4xU0MxRXYoJXN0cnVjdC5TKiAlcykKLS8vIENIRUNLOiAgICV7e1suMC05QS1aX2Etel0rfX0gPSBjYWxsIGkzMiBAX1pOMVM0dGVzdEV2KCVzdHJ1Y3QuUyogJXMpCisvLyBDSEVDSzogICBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQF9aTjFTQzFFdiglc3RydWN0LlMqICVzKQorLy8gQ0hFQ0s6ICAgJXt7Wy4wLTlBLVpfYS16XSt9fSA9IGNhbGwgeDg2X3RoaXNjYWxsY2MgaTMyIEBfWk4xUzR0ZXN0RXYoJXN0cnVjdC5TKiAlcykKIAotLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pOMVNDMUV2KCVzdHJ1Y3QuUyogJXRoaXMpCi0vLyBDSEVDSzogICBjYWxsIHZvaWQgQF9aTjFTQzJFdiglc3RydWN0LlMqICV7e1suMC05QS1aX2Etel0rfX0pCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciB4ODZfdGhpc2NhbGxjYyB2b2lkIEBfWk4xU0MxRXYoJXN0cnVjdC5TKiAldGhpcykKKy8vIENIRUNLOiAgIGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAX1pOMVNDMkV2KCVzdHJ1Y3QuUyogJXt7Wy4wLTlBLVpfYS16XSt9fSkKIAotLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgaTMyIEBfWk4xUzR0ZXN0RXYoJXN0cnVjdC5TKiAldGhpcykKLS8vIENIRUNLOiAgICV7e1suMC05QS1aX2Etel0rfX0gPSBjYWxsIGkzMiBAX1pOMUk0dGVzdEV2KCVfX2ludGVyZmFjZS5JKiAle3tbLjAtOUEtWl9hLXpdK319KQorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgeDg2X3RoaXNjYWxsY2MgaTMyIEBfWk4xUzR0ZXN0RXYoJXN0cnVjdC5TKiAldGhpcykKKy8vIENIRUNLOiAgICV7e1suMC05QS1aX2Etel0rfX0gPSBjYWxsIHg4Nl90aGlzY2FsbGNjIGkzMiBAX1pOMUk0dGVzdEV2KCVfX2ludGVyZmFjZS5JKiAle3tbLjAtOUEtWl9hLXpdK319KQogCi0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciBpMzIgQF9aTjFJNHRlc3RFdiglX19pbnRlcmZhY2UuSSogJXRoaXMpCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciB4ODZfdGhpc2NhbGxjYyBpMzIgQF9aTjFJNHRlc3RFdiglX19pbnRlcmZhY2UuSSogJXRoaXMpCiAvLyBDSEVDSzogICByZXQgaTMyIDEKIAotLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pOMVNDMkV2KCVzdHJ1Y3QuUyogJXRoaXMpCi0vLyBDSEVDSzogICBjYWxsIHZvaWQgQF9aTjFJQzJFdiglX19pbnRlcmZhY2UuSSogJXt7Wy4wLTlBLVpfYS16XSt9fSkKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgbGlua29uY2Vfb2RyIHg4Nl90aGlzY2FsbGNjIHZvaWQgQF9aTjFTQzJFdiglc3RydWN0LlMqICV0aGlzKQorLy8gQ0hFQ0s6ICAgY2FsbCB4ODZfdGhpc2NhbGxjYyB2b2lkIEBfWk4xSUMyRXYoJV9faW50ZXJmYWNlLkkqICV7e1suMC05QS1aX2Etel0rfX0pCiAvLyBDSEVDSzogICBzdG9yZSBpOCoqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFszIHggaTgqXSogQF9aVFYxUywgaTY0IDAsIGk2NCAyKSwgaTgqKiogJXt7Wy4wLTlBLVpfYS16XSt9fQogCi0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciB2b2lkIEBfWk4xSUMyRXYoJV9faW50ZXJmYWNlLkkqICV0aGlzKQorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAX1pOMUlDMkV2KCVfX2ludGVyZmFjZS5JKiAldGhpcykKIC8vIENIRUNLOiAgIHN0b3JlIGk4KiogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzMgeCBpOCpdKiBAX1pUVjFJLCBpNjQgMCwgaTY0IDIpLCBpOCoqKiAle3tbLjAtOUEtWl9hLXpdK319Ci0KLS8vIENIRUNLLU5PVC1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciAlX19pbnRlcmZhY2UuSSogQF9aTjFJYVNFUktTXyglX19pbnRlcmZhY2UuSSogJXRoaXMsICVfX2ludGVyZmFjZS5JKikKLS8vIENIRUNLLU5PVC1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciAlX19pbnRlcmZhY2UuSSogQF9aTjFJYVNFT1NfKCVfX2ludGVyZmFjZS5JKiAldGhpcywgJV9faW50ZXJmYWNlLkkqKQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1uZXcuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC1uZXcuY3BwCmluZGV4IDQ4ZTkzZDQuLjc4NTdlNDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtbmV3LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LW5ldy5jcHAKQEAgLTEsMzkgKzEsMzkgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZtcy1jb21wYXRpYmlsaXR5ICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcw0KLQ0KLSNpbmNsdWRlIDxzdGRkZWYuaD4NCi0NCi1zdHJ1Y3QgYXJiaXRyYXJ5X3Qge30gYXJiaXRyYXJ5Ow0KLXZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgYXJiaXRyYXJ5X3QpOw0KLQ0KLXN0cnVjdCBhcmJpdHJhcnkyX3Qge30gYXJiaXRyYXJ5MjsNCi12b2lkICpvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSwgYXJiaXRyYXJ5Ml90KTsNCi0NCi1uYW1lc3BhY2UgUFIxMzE2NCB7DQotICB2b2lkIGYoKSB7DQotCS8vIE1TVkMgd2lsbCBmYWxsIGJhY2sgb24gdGhlIG5vbi1hcnJheSBvcGVyYXRvciBuZXcuDQotICAgIHZvaWQgKmE7DQotICAgIGludCAqcCA9IG5ldyhhcmJpdHJhcnkpIGludFs0XTsNCi0gICAgLy8gQ0hFQ0s6IGNhbGwgaTgqIEBfWm53ajExYXJiaXRyYXJ5X3QoaTMyIDE2LCAlc3RydWN0LmFyYml0cmFyeV90Kg0KLSAgfQ0KLQ0KLSAgc3RydWN0IFMgew0KLSAgICB2b2lkICpvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSwgYXJiaXRyYXJ5X3QpOw0KLSAgfTsNCi0NCi0gIHZvaWQgZygpIHsNCi0gICAgUyAqcyA9IG5ldyhhcmJpdHJhcnkpIFNbMl07DQotICAgIC8vIENIRUNLOiBjYWxsIGk4KiBAX1pON1BSMTMxNjQxU25hRWoxMWFyYml0cmFyeV90KGkzMiAyLCAlc3RydWN0LmFyYml0cmFyeV90Kg0KLSAgICBTICpzMSA9IG5ldyhhcmJpdHJhcnkpIFM7DQotICAgIC8vIENIRUNLOiBjYWxsIGk4KiBAX1pud2oxMWFyYml0cmFyeV90KGkzMiAxLCAlc3RydWN0LmFyYml0cmFyeV90Kg0KLSAgfQ0KLQ0KLSAgc3RydWN0IFQgew0KLSAgICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIGFyYml0cmFyeTJfdCk7DQotICB9Ow0KLQ0KLSAgdm9pZCBoKCkgew0KLSAgICAvLyBUaGlzIHNob3VsZCBzdGlsbCBjYWxsIHRoZSBnbG9iYWwgb3BlcmF0b3IgbmV3W10uDQotICAgIFQgKnQgPSBuZXcoYXJiaXRyYXJ5MikgVFsyXTsNCi0gICAgLy8gQ0hFQ0s6IGNhbGwgaTgqIEBfWm5hajEyYXJiaXRyYXJ5Ml90KGkzMiAyLCAlc3RydWN0LmFyYml0cmFyeTJfdCoNCi0gIH0NCi19DQorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZm1zLWNvbXBhdGliaWxpdHkgJXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworc3RydWN0IGFyYml0cmFyeV90IHt9IGFyYml0cmFyeTsKK3ZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgYXJiaXRyYXJ5X3QpOworCitzdHJ1Y3QgYXJiaXRyYXJ5Ml90IHt9IGFyYml0cmFyeTI7Cit2b2lkICpvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSwgYXJiaXRyYXJ5Ml90KTsKKworbmFtZXNwYWNlIFBSMTMxNjQgeworICB2b2lkIGYoKSB7CisJLy8gTVNWQyB3aWxsIGZhbGwgYmFjayBvbiB0aGUgbm9uLWFycmF5IG9wZXJhdG9yIG5ldy4KKyAgICB2b2lkICphOworICAgIGludCAqcCA9IG5ldyhhcmJpdHJhcnkpIGludFs0XTsKKyAgICAvLyBDSEVDSzogY2FsbCBpOCogQCJcMDE/PzJAWUFQQVhJVWFyYml0cmFyeV90QEBAWiIoaTMyIDE2LCAlc3RydWN0LmFyYml0cmFyeV90KgorICB9CisKKyAgc3RydWN0IFMgeworICAgIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCBzaXplLCBhcmJpdHJhcnlfdCk7CisgIH07CisKKyAgdm9pZCBnKCkgeworICAgIFMgKnMgPSBuZXcoYXJiaXRyYXJ5KSBTWzJdOworICAgIC8vIENIRUNLOiBjYWxsIGk4KiBAIlwwMT8/X1VTQFBSMTMxNjRAQFNBUEFYSVVhcmJpdHJhcnlfdEBAQFoiKGkzMiAyLCAlc3RydWN0LmFyYml0cmFyeV90KgorICAgIFMgKnMxID0gbmV3KGFyYml0cmFyeSkgUzsKKyAgICAvLyBDSEVDSzogY2FsbCBpOCogQCJcMDE/PzJAWUFQQVhJVWFyYml0cmFyeV90QEBAWiIoaTMyIDEsICVzdHJ1Y3QuYXJiaXRyYXJ5X3QqCisgIH0KKworICBzdHJ1Y3QgVCB7CisgICAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBhcmJpdHJhcnkyX3QpOworICB9OworCisgIHZvaWQgaCgpIHsKKyAgICAvLyBUaGlzIHNob3VsZCBzdGlsbCBjYWxsIHRoZSBnbG9iYWwgb3BlcmF0b3IgbmV3W10uCisgICAgVCAqdCA9IG5ldyhhcmJpdHJhcnkyKSBUWzJdOworICAgIC8vIENIRUNLOiBjYWxsIGk4KiBAIlwwMT8/X1VAWUFQQVhJVWFyYml0cmFyeTJfdEBAQFoiKGkzMiAyLCAlc3RydWN0LmFyYml0cmFyeTJfdCoKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC11dWlkb2YuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21pY3Jvc29mdC11dWlkb2YuY3BwCmluZGV4IGFiM2Q5YjYuLmQ1N2NhODMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9taWNyb3NvZnQtdXVpZG9mLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbWljcm9zb2Z0LXV1aWRvZi5jcHAKQEAgLTEsNiArMSw2IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC1EREVGSU5FX0dVSUQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyIC1mbXMtZXh0ZW5zaW9ucyB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1ERUZJTkUtR1VJRAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtdHJpcGxlPWkzODYtcGMtd2luMzIgLWZtcy1leHRlbnNpb25zIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC1EREVGSU5FX0dVSUQgLURXUk9OR19HVUlEIC10cmlwbGU9aTM4Ni1wYy13aW4zMiAtZm1zLWV4dGVuc2lvbnMgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stREVGSU5FLVdST05HLUdVSUQKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLURERUZJTkVfR1VJRCAtdHJpcGxlPWkzODYtcGMtbGludXggLWZtcy1leHRlbnNpb25zIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLURFRklORS1HVUlECisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGU9aTM4Ni1wYy1saW51eCAtZm1zLWV4dGVuc2lvbnMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLURERUZJTkVfR1VJRCAtRFdST05HX0dVSUQgLXRyaXBsZT1pMzg2LXBjLWxpbnV4IC1mbXMtZXh0ZW5zaW9ucyB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1ERUZJTkUtV1JPTkctR1VJRAogCiAjaWZkZWYgREVGSU5FX0dVSUQKIHN0cnVjdCBfR1VJRCB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbWluZ3ctbmV3LWFiaS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbWluZ3ctbmV3LWFiaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwNTI1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9taW5ndy1uZXctYWJpLmNwcApAQCAtMCwwICsxLDEzIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlIGkzODYtcGMtbWluZ3czMiAlcyAtbyAtIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU1JTkdXICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlIGkzODYtcGMtY3lnd2luICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q1lHV0lOICVzCisKK25hbWVzcGFjZSB0ZXN0MSB7CisgIHN0cnVjdCBmb28geworICAgIC8vICBNSU5HVzogZGVjbGFyZSB4ODZfdGhpc2NhbGxjYyB2b2lkIEBfWk41dGVzdDEzZm9vMWZFdgorICAgIC8vICBDWUdXSU46IGRlY2xhcmUgdm9pZCBAX1pONXRlc3QxM2ZvbzFmRXYKKyAgICB2b2lkIGYoKTsKKyAgfTsKKyAgdm9pZCBnKGZvbyAqeCkgeworICAgIHgtPmYoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL21zLWludGVnZXItc3RhdGljLWRhdGEtbWVtYmVycy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbXMtaW50ZWdlci1zdGF0aWMtZGF0YS1tZW1iZXJzLmNwcAppbmRleCAwMGJlYWE2Li41NTA1ZGIxIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbXMtaW50ZWdlci1zdGF0aWMtZGF0YS1tZW1iZXJzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbXMtaW50ZWdlci1zdGF0aWMtZGF0YS1tZW1iZXJzLmNwcApAQCAtMSw3ICsxLDcgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPWkzODYtcGMtd2luMzIgJXMgLW8gLSB8IEZpbGVDaGVjayAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1ESU5MSU5FX0lOSVQgLWVtaXQtbGx2bSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stSU5MSU5FCi0vLyBSVU46ICVjbGFuZ19jYzEgLURSRUFMX0RFRklOSVRJT04gLWVtaXQtbGx2bSAtY3h4LWFiaSBtaWNyb3NvZnQgLXRyaXBsZT1pMzg2LXBjLXdpbjMyICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stT1VUT0ZMSU5FCi0vLyBSVU46ICVjbGFuZ19jYzEgLURJTkxJTkVfSU5JVCAtRFJFQUxfREVGSU5JVElPTiAtZW1pdC1sbHZtIC1jeHgtYWJpIG1pY3Jvc29mdCAtdHJpcGxlPWkzODYtcGMtd2luMzIgJXMgLW8gLSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1JTkxJTkUKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLURJTkxJTkVfSU5JVCAtZW1pdC1sbHZtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiAlcyAtbyAtIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLUlOTElORQorLy8gUlVOOiAlY2xhbmdfY2MxIC1EUkVBTF9ERUZJTklUSU9OIC1lbWl0LWxsdm0gLXRyaXBsZT1pMzg2LXBjLXdpbjMyICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stT1VUT0ZMSU5FCisvLyBSVU46ICVjbGFuZ19jYzEgLURJTkxJTkVfSU5JVCAtRFJFQUxfREVGSU5JVElPTiAtZW1pdC1sbHZtIC10cmlwbGU9aTM4Ni1wYy13aW4zMiAlcyAtbyAtIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLUlOTElORQogCiBzdHJ1Y3QgUyB7CiAgIC8vIEZvciBNUyBBQkksIHdlIGVtaXQgYSBsaW5rb25jZV9vZHIgZGVmaW5pdGlvbiBoZXJlLCBldmVuIHRob3VnaCBpdCdzIHJlYWxseSBqdXN0IGEgZGVjbGFyYXRpb24uCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbXNfd2lkZV9wcmVkZWZpbmVkX2V4cHIuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL21zX3dpZGVfcHJlZGVmaW5lZF9leHByLmNwcAppbmRleCA1ZjBiY2RlLi5iNmFmNTE5IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvbXNfd2lkZV9wcmVkZWZpbmVkX2V4cHIuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9tc193aWRlX3ByZWRlZmluZWRfZXhwci5jcHAKQEAgLTEsNiArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWZtcy1leHRlbnNpb25zIC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAotLy8gQ0hFQ0s6IEBMX19GVU5DVElPTl9fLl9aNGZ1bmN2ID0gcHJpdmF0ZSBjb25zdGFudCBbNSB4IGkxNl0gW2kxNiAxMDIsIGkxNiAxMTcsIGkxNiAxMTAsIGkxNiA5OSwgaTE2IDBdLCBhbGlnbiAyCisvLyBDSEVDSzogQCJMX19GVU5DVElPTl9fLj9mdW5jQEBZQVhYWiIgPSBwcml2YXRlIGNvbnN0YW50IFs1IHggaTE2XSBbaTE2IDEwMiwgaTE2IDExNywgaTE2IDExMCwgaTE2IDk5LCBpMTYgMF0sIGFsaWduIDIKIAogdm9pZCB3cHJpbnQoY29uc3Qgd2NoYXJfdCopOwogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbmV3LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9uZXcuY3BwCmluZGV4IDkxZGE3N2EuLjI2ZGI4NDIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9uZXcuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9uZXcuY3BwCkBAIC0yODUsNyArMjg1LDcgQEAKIG5hbWVzcGFjZSBOMzY2NCB7CiAgIHN0cnVjdCBTIHsgUygpIHRocm93KGludCk7IH07CiAKLSAgLy8gQ0hFQ0stTEFCRUwtTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41TjM2NjQxZkV2CisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pONU4zNjY0MWZFdgogICB2b2lkIGYoKSB7CiAgICAgLy8gQ0hFQ0s6IGNhbGwgbm9hbGlhcyBpOCogQF9abndtKGk2NCA0KSBbW0FUVFJfQlVJTFRJTl9ORVc6I1teIF0qXV0KICAgICBpbnQgKnAgPSBuZXcgaW50OwpAQCAtMzA3LDcgKzMwNyw3IEBACiAgIC8vIEZJWE1FOiBDYW4gd2UgbWFyayB0aGlzIG5vYWxpYXM/CiAgIC8vIENIRUNLOiBkZWNsYXJlIGk4KiBAX1puYW1SS1N0OW5vdGhyb3dfdChpNjQsIHt7Lip9fSkgW1tBVFRSX05PQlVJTFRJTl9OT1VOV0lORF1dCiAKLSAgLy8gQ0hFQ0stTEFCRUwtTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41TjM2NjQxZ0V2CisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pONU4zNjY0MWdFdgogICB2b2lkIGcoKSB7CiAgICAgLy8gSXQncyBPSyBmb3IgdGhlcmUgdG8gYmUgYXR0cmlidXRlcyBoZXJlLCBzbyBsb25nIGFzIHdlIGRvbid0IGhhdmUgYQogICAgIC8vICdidWlsdGluJyBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvbm8tZWxpZGUtY29uc3RydWN0b3JzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9uby1lbGlkZS1jb25zdHJ1Y3RvcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYjM1MGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW5DWFgvbm8tZWxpZGUtY29uc3RydWN0b3JzLmNwcApAQCAtMCwwICsxLDM1IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKys5OCAtdHJpcGxlIGkzODYtdW5rbm93bi11bmtub3duIC1mbm8tZWxpZGUtY29uc3RydWN0b3JzIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSyAtLWNoZWNrLXByZWZpeD1DSEVDSy1DWFg5OAorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLXRyaXBsZSBpMzg2LXVua25vd24tdW5rbm93biAtZm5vLWVsaWRlLWNvbnN0cnVjdG9ycyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQ1hYMTEKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzk4IC10cmlwbGUgaTM4Ni11bmtub3duLXVua25vd24gLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLIC0tY2hlY2stcHJlZml4PUNIRUNLLUNYWDk4LUVMSURFCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtdHJpcGxlIGkzODYtdW5rbm93bi11bmtub3duIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSyAtLWNoZWNrLXByZWZpeD1DSEVDSy1DWFgxMS1FTElERQorCisvLyBSZWR1Y2VkIGZyb20gUFIxMjIwOAorY2xhc3MgWCB7CitwdWJsaWM6CisgIFgoKTsKKyAgWChjb25zdCBYJik7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICBYKFgmJik7CisjZW5kaWYKKyAgflgoKTsKK307CisKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1o0VGVzdHYoCitYIFRlc3QoKQoreworICBYIHg7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgY29weSBjb25zdHJ1Y3RvciBmb3IgWCBpcyBjYWxsZWQgd2l0aCByZXN1bHQgdmFyaWFibGUgYXMKKyAgLy8gc3JldCBhcmd1bWVudC4KKyAgLy8gQ0hFQ0stQ1hYOTg6IGNhbGwgdm9pZCBAX1pOMVhDMUVSS1NfKAorICAvLyBDSEVDSy1DWFgxMTogY2FsbCB2b2lkIEBfWk4xWEMxRU9TXygKKyAgLy8gQ0hFQ0stQ1hYOTgtRUxJREUtTk9UOiBjYWxsIHZvaWQgQF9aTjFYQzFFUktTXygKKyAgLy8gQ0hFQ0stQ1hYMTEtRUxJREUtTk9UOiBjYWxsIHZvaWQgQF9aTjFYQzFFT1NfKAorCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0cnVjdG9yIGZvciBYIGlzIGNhbGxlZC4KKyAgLy8gRklYTUU6IFRoaXMgY2FsbCBpcyBwcmVzZW50IGV2ZW4gaW4gdGhlIC1FTElERSBydW5zLCBidXQgaXMgZ3VhcmRlZCBieSBhCisgIC8vIGJyYW5jaCB0aGF0IGlzIG5ldmVyIHRha2VuIGluIHRob3NlIGNhc2VzLiBXZSBjb3VsZCBnZW5lcmF0ZSBiZXR0ZXIgSVIKKyAgLy8gaGVyZS4KKyAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMVhEMUV2KAorICByZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9ub2lubGluZS10ZW1wbGF0ZS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvbm9pbmxpbmUtdGVtcGxhdGUuY3BwCmluZGV4IDUxYTg0ZjcuLjNkZDQzNjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9ub2lubGluZS10ZW1wbGF0ZS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL25vaW5saW5lLXRlbXBsYXRlLmNwcApAQCAtMSw5ICsxLDkgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBUaGlzIHdhcyBhIHByb2JsZW0gaW4gU2VtYSwgYnV0IG9ubHkgc2hvd3MgdXAgYXMgbm9pbmxpbmUgbWlzc2luZwogLy8gaW4gQ29kZUdlbi4KIAotLy8gQ0hFQ0s6IGRlZmluZSBsaW5rb25jZV9vZHIgdm9pZCBAX1pONlZlY3RvcklpRTEzZ3Jvd1N0b3JhZ2VCeUV2KCVzdHJ1Y3QuVmVjdG9yKiAldGhpcykgW1tOSTojWzAtOV0rXV0KKy8vIENIRUNLOiBkZWZpbmUgbGlua29uY2Vfb2RyIHt7Lip9fXZvaWQgQF9aTjZWZWN0b3JJaUUxM2dyb3dTdG9yYWdlQnlFdiglc3RydWN0LlZlY3RvciogJXRoaXMpIFtbTkk6I1swLTldK11dCiAKIHRlbXBsYXRlIDxjbGFzcyBUeT4gc3RydWN0IFZlY3RvciAgewogICB2b2lkIGdyb3dTdG9yYWdlQnkoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9wb2x5LXVuc2lnbmVkLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9wb2x5LXVuc2lnbmVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODUxYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3BvbHktdW5zaWduZWQuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybTY0LWFwcGxlLWlvcyAtZmZyZWVzdGFuZGluZyAtUyAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stVU5TSUdORUQtUE9MWSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtbGludXgtZ251IC1mZnJlZXN0YW5kaW5nIC1TIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1VTlNJR05FRC1QT0xZICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm12Ny1hcHBsZS1pb3MgLWZmcmVlc3RhbmRpbmcgLXRhcmdldC1jcHUgY29ydGV4LWE4IC1TIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1TSUdORUQtUE9MWSAlcworCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworLy8gUG9seW5vbWlhbCB0eXBlcyByZWFsbHkgc2hvdWxkIGJlIHVuaXZlcnNhbGx5IHVuc2lnbmVkLCBvdGhlcndpc2UgY2FzdGluZworLy8gKHNheSkgcG9seThfdCAieF43IiB0byBwb2x5MTZfdCB3b3VsZCBjaGFuZ2UgaXQgdG8gInheMTUgKyB4XjE0ICsgLi4uICsKKy8vIHheNyIuIFVuZm9ydHVuYXRlbHkgMzItYml0IEFSTSBlbmRlZCB1cCBpbiBhIHNsaWdodGx5IGRlbGljYXRlIEFCSSBzaXR1YXRpb24KKy8vIHNvIGZvciBub3cgaXQgZ290IHRoYXQgd3JvbmcuCisKK3BvbHkxNl90IHRlc3RfcG9seTgocG9seThfdCBwSW4pIHsKKy8vIENIRUNLLVVOU0lHTkVELVBPTFk6IEBfWjEwdGVzdF9wb2x5OGgKKy8vIENIRUNLLVVOU0lHTkVELVBPTFk6IHpleHQgaTgge3suKn19IHRvIGkxNgorCisvLyBDSEVDSy1TSUdORUQtUE9MWTogQF9aMTB0ZXN0X3BvbHk4YQorLy8gQ0hFQ0stU0lHTkVELVBPTFk6IHNleHQgaTgge3suKn19IHRvIGkxNgorCisgIHJldHVybiBwSW47Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvcHIxMTc5Ny5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvcHIxMTc5Ny5jcHAKaW5kZXggMTA5ODM3Mi4uMmEzMTA5MCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3ByMTE3OTcuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9wcjExNzk3LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZnZpc2liaWxpdHkgaGlkZGVuIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mdmlzaWJpbGl0eSBoaWRkZW4gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcwogCiBuYW1lc3BhY2Ugc3RkIF9fYXR0cmlidXRlX18gKChfX3Zpc2liaWxpdHlfXyAoImRlZmF1bHQiKSkpIHt9CiAjcHJhZ21hIEdDQyB2aXNpYmlsaXR5IHB1c2goZGVmYXVsdCkKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9wcjEyMTA0LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9wcjEyMTA0LmNwcAppbmRleCBhNjJmMDRiLi41NjBmZmJlIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvcHIxMjEwNC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3ByMTIxMDQuY3BwCkBAIC0xLDYgKzEsNiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1pbmNsdWRlICVTL3ByMTIxMDQuaCAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAteCBjKysgLWVtaXQtcGNoIC1vICV0ICVTL3ByMTIxMDQuaAotLy8gUlVOOiAlY2xhbmdfY2MxIC1pbmNsdWRlLXBjaCAldCAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtaW5jbHVkZSAlUy9wcjEyMTA0LmggJXMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC14IGMrKyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtcGNoIC1vICV0ICVTL3ByMTIxMDQuaAorLy8gUlVOOiAlY2xhbmdfY2MxIC1pbmNsdWRlLXBjaCAldCAlcyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIHRlbXBsYXRlIHN0cnVjdCBQYXRjaDwxPjsKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3ByMTMzOTYuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3ByMTMzOTYuY3BwCmluZGV4IDNkNTgyYzUuLmU0MWRkMzkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9wcjEzMzk2LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvcHIxMzM5Ni5jcHAKQEAgLTcsMTMgKzcsMTMgQEAKIH07CiAKIGZvbzo6Zm9vKCkgewotICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjNmb29DMUV2KCVzdHJ1Y3QuZm9vKiBpbnJlZyAldGhpcykKICAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4zZm9vQzJFdiglc3RydWN0LmZvbyogaW5yZWcgJXRoaXMpCisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOM2Zvb0MxRXYoJXN0cnVjdC5mb28qIGlucmVnICV0aGlzKQogfQogCiBmb286On5mb28oKSB7Ci0gIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOM2Zvb0QxRXYoJXN0cnVjdC5mb28qIGlucmVnICV0aGlzKQogICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjNmb29EMkV2KCVzdHJ1Y3QuZm9vKiBpbnJlZyAldGhpcykKKyAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4zZm9vRDFFdiglc3RydWN0LmZvbyogaW5yZWcgJXRoaXMpCiB9CiAKIHZvaWQgZHVtbXkoKSB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvcHIxODY2MS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvcHIxODY2MS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1ODY3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9wcjE4NjYxLmNwcApAQCAtMCwwICsxLDE0IEBACisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1mY3h4LWV4Y2VwdGlvbnMgLWZtcy1leHRlbnNpb25zIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworCitleHRlcm4gIkMiIHsKKyAgdm9pZCBmKCk7CisKKyAgLy8gSW4gTVMgbW9kZSB3ZSBkb24ndCB2YWxpZGF0ZSB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uCisgIHZvaWQgZigpIHRocm93KCkgeworICB9Cit9CisKKy8vIFBSMTg2NjE6IENsYW5nIHdvdWxkIGZhaWwgdG8gZW1pdCBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGggbWlzbWF0Y2hpbmcKKy8vIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLCBldmVuIHRob3VnaCBpdCB3YXMganVzdCB0cmVhdGVkIGFzIGEgd2FybmluZy4KKworLy8gQ0hFQ0s6IGRlZmluZSB2b2lkIEBmKCkKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9wcjE4OTYyLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9wcjE4OTYyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjUzN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3ByMTg5NjIuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtbGludXgtZ251ICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworCitjbGFzcyBBIHsKKyAgLy8gYXBwZW5kIGhhcyB0byBoYXZlIHRoZSBzYW1lIHByb3RvdHlwZSBhcyBmbjEgdG8gdGlja2xlIHRoZSBidWcuCisgIHZvaWQgKCphcHBlbmQpKEEgKik7Cit9OworCitjbGFzcyBCIHt9OworY2xhc3MgRDsKKworLy8gQyBoYXMgdG8gYmUgbm9uLUMrKzk4IFBPRCB3aXRoIGF2YWlsYWJsZSB0YWlsIHBhZGRpbmcsIG1ha2luZyB0aGUgTExWTSBiYXNlCisvLyB0eXBlIGRpZmZlciBmcm9tIHRoZSBjb21wbGV0ZSBMTFZNIHR5cGUuCitjbGFzcyBDIHsKKyAgLy8gVGhpcyBtZW1iZXIgY3JlYXRlcyBhIGNpcmN1bGFyIExMVk0gdHlwZSByZWZlcmVuY2UgdG8gJWNsYXNzLkQuCisgIEQgKm1fZ3JvdXA7CisgIEIgY2hhbmdlTGlzdGVuZXJzOworfTsKK2NsYXNzIEQgOiBDIHt9OworCit2b2lkIGZuMShBICpwMSkgeworfQorCit2b2lkCitmbjIoQyAqKSB7Cit9CisKKy8vIFdlIGVuZCB1cCB1c2luZyBhbiBvcGFxdWUgdHlwZSBmb3IgJ2FwcGVuZCcgdG8gYXZvaWQgY2lyY3VsYXIgcmVmZXJlbmNlcy4KKy8vIENIRUNLOiAlY2xhc3MuQSA9IHR5cGUgeyB7fSogfQorLy8gQ0hFQ0s6ICVjbGFzcy5DID0gdHlwZSB7ICVjbGFzcy5EKiwgJWNsYXNzLkIgfQorLy8gQ0hFQ0s6ICVjbGFzcy5EID0gdHlwZSB7ICVjbGFzcy5DLmJhc2UsIFszIHggaThdIH0KKy8vIENIRUNLOiAlY2xhc3MuQy5iYXNlID0gdHlwZSA8eyAlY2xhc3MuRCosICVjbGFzcy5CIH0+CisvLyBDSEVDSzogJWNsYXNzLkIgPSB0eXBlIHsgaTggfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3ByOTk2NS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvcHI5OTY1LmNwcAppbmRleCBjMmQ1NGUxLi40NmZkNjA5IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvcHI5OTY1LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvcHI5OTY1LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogc3RydWN0IEEgeyBBKCk7IH07CiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogc3RydWN0IFggOiBBIC8vIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm90IHRyaXZpYWwKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9wcmFnbWEtcGFjay0zLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9wcmFnbWEtcGFjay0zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTUwOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3ByYWdtYS1wYWNrLTMuY3BwCkBAIC0wLDAgKzEsMTggQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlPWk2ODYtYXBwbGUtZGFyd2luMTAgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisKK3N0cnVjdCBCYXNlIHsKKyAgY2hhciBhOworfTsKKworc3RydWN0IERlcml2ZWRfMSA6IHZpcnR1YWwgQmFzZQoreworICBjaGFyIGI7Cit9OworCisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBEZXJpdmVkXzIgOiBEZXJpdmVkXzEgeworICAvLyBDSEVDSzogJXN0cnVjdC5EZXJpdmVkXzIgPSB0eXBlIHsgJXN0cnVjdC5EZXJpdmVkXzEuYmFzZSwgJXN0cnVjdC5CYXNlIH0KKyAgLy8gQ0hFQ0s6ICVzdHJ1Y3QuRGVyaXZlZF8xLmJhc2UgPSB0eXBlIDx7IGkzMiAoLi4uKSoqLCBpOCB9PgorfTsKKworRGVyaXZlZF8yIHg7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvcHJhZ21hLXdlYWsuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3ByYWdtYS13ZWFrLmNwcAppbmRleCBjMDMzMDc5Li5lMmQ0NjQ4IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvcHJhZ21hLXdlYWsuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9wcmFnbWEtd2Vhay5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiAjcHJhZ21hIHdlYWsgemV4CiBpbnQgemV4OwpAQCAtMTAsNyArMTAsNyBAQAogI3ByYWdtYSB3ZWFrIGZvbwogc3RydWN0IFMgeyAgdm9pZCBmb28oKTsgfTsKIHZvaWQgUzo6Zm9vKCkge30KLS8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMVMzZm9vRXYoCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHt7Lip9fXZvaWQgQF9aTjFTM2Zvb0V2KAogCiAjcHJhZ21hIHdlYWsgemVkCiBuYW1lc3BhY2UgYmFyIHsgIHZvaWQgemVkKCkge30gfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3ByZWRlZmluZWQtZXhwci5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvcHJlZGVmaW5lZC1leHByLmNwcAppbmRleCA5MDYyZWUwLi5mOTAxNDY3IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvcHJlZGVmaW5lZC1leHByLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvcHJlZGVmaW5lZC1leHByLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgJXMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzE1IHggaThdIGMiZXh0ZXJuRnVuY3Rpb25cMDAiCiAvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzI2IHggaThdIGMidm9pZCBOUzo6ZXh0ZXJuRnVuY3Rpb24oKVwwMCIKQEAgLTEwLDcgKzEwLDcgQEAKIC8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbMTIyIHggaThdIGMic3RhdGljIHZvaWQgQ2xhc3NXaXRoVGVtcGxhdGVUZW1wbGF0ZVBhcmFtPGNoYXIsIE5TOjpDbGFzc1RlbXBsYXRlPjo6c3RhdGljTWVtYmVyKCkgW1QgPSBjaGFyLCBQYXJhbSA9IE5TOjpDbGFzc1RlbXBsYXRlXVwwMCIKIC8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbMTA2IHggaThdIGMidm9pZCBPdXRlckNsYXNzPGludCAqPjo6TWlkZGxlQ2xhc3M6OklubmVyQ2xhc3M8ZmxvYXQ+OjptZW1iZXJGdW5jdGlvbihULCBVKSBjb25zdCBbVCA9IGludCAqLCBVID0gZmxvYXRdXDAwIgogLy8gQ0hFQ0s6IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs1MSB4IGk4XSBjInZvaWQgZnVuY3Rpb25UZW1wbGF0ZVdpdGhDYXB0dXJlZFN0bXQoVCkgW1QgPSBpbnRdXDAwIgotLy8gQ0hFQ0s6IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs3NiB4IGk4XSBjImF1dG8gZnVuY3Rpb25UZW1wbGF0ZVdpdGhMYW1iZGEoaW50KTo6PGFub255bW91cyBjbGFzcz46Om9wZXJhdG9yKCkoKSBjb25zdFwwMCIKKy8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbNzYgeCBpOF0gYyJhdXRvIGZ1bmN0aW9uVGVtcGxhdGVXaXRoTGFtYmRhKGludCk6Oihhbm9ueW1vdXMgY2xhc3MpOjpvcGVyYXRvcigpKCkgY29uc3RcMDAiCiAvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzY1IHggaThdIGMidm9pZCBmdW5jdGlvblRlbXBsYXRlV2l0aFVubmFtZWRUZW1wbGF0ZVBhcmFtZXRlcihUKSBbVCA9IGZsb2F0XVwwMCIKIAogLy8gQ0hFQ0s6IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs2MCB4IGk4XSBjInZvaWQgZnVuY3Rpb25UZW1wbGF0ZUV4cGxpY2l0U3BlY2lhbGl6YXRpb24oVCkgW1QgPSBkb3VibGVdXDAwIgpAQCAtMjgsMTMgKzI4LDEzIEBACiAvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzQ2IHggaThdIGMidm9pZCBOUzo6QmFzZTo6ZnVuY3Rpb25UZW1wbGF0ZTEoVCkgW1QgPSBpbnRdXDAwIgogCiAvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzIzIHggaThdIGMiYW5vbnltb3VzVW5pb25GdW5jdGlvblwwMCIKLS8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbODMgeCBpOF0gYyJ2b2lkIE5TOjpDb250YWluZXJGb3JBbm9ueW1vdXNSZWNvcmRzOjo8YW5vbnltb3VzIHVuaW9uPjo6YW5vbnltb3VzVW5pb25GdW5jdGlvbigpXDAwIgorLy8gQ0hFQ0s6IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs4MyB4IGk4XSBjInZvaWQgTlM6OkNvbnRhaW5lckZvckFub255bW91c1JlY29yZHM6Oihhbm9ueW1vdXMgdW5pb24pOjphbm9ueW1vdXNVbmlvbkZ1bmN0aW9uKClcMDAiCiAKIC8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbMjQgeCBpOF0gYyJhbm9ueW1vdXNTdHJ1Y3RGdW5jdGlvblwwMCIKLS8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbODUgeCBpOF0gYyJ2b2lkIE5TOjpDb250YWluZXJGb3JBbm9ueW1vdXNSZWNvcmRzOjo8YW5vbnltb3VzIHN0cnVjdD46OmFub255bW91c1N0cnVjdEZ1bmN0aW9uKClcMDAiCisvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzg1IHggaThdIGMidm9pZCBOUzo6Q29udGFpbmVyRm9yQW5vbnltb3VzUmVjb3Jkczo6KGFub255bW91cyBzdHJ1Y3QpOjphbm9ueW1vdXNTdHJ1Y3RGdW5jdGlvbigpXDAwIgogCiAvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzIzIHggaThdIGMiYW5vbnltb3VzQ2xhc3NGdW5jdGlvblwwMCIKLS8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbODMgeCBpOF0gYyJ2b2lkIE5TOjpDb250YWluZXJGb3JBbm9ueW1vdXNSZWNvcmRzOjo8YW5vbnltb3VzIGNsYXNzPjo6YW5vbnltb3VzQ2xhc3NGdW5jdGlvbigpXDAwIgorLy8gQ0hFQ0s6IHByaXZhdGUgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs4MyB4IGk4XSBjInZvaWQgTlM6OkNvbnRhaW5lckZvckFub255bW91c1JlY29yZHM6Oihhbm9ueW1vdXMgY2xhc3MpOjphbm9ueW1vdXNDbGFzc0Z1bmN0aW9uKClcMDAiCiAKIC8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbMTIgeCBpOF0gYyJ+RGVzdHJ1Y3RvclwwMCIKIC8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbMzAgeCBpOF0gYyJOUzo6RGVzdHJ1Y3Rvcjo6fkRlc3RydWN0b3IoKVwwMCIKQEAgLTkzLDcgKzkzLDcgQEAKIC8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbNTkgeCBpOF0gYyJ2b2lkIENsYXNzSW5Ub3BMZXZlbE5hbWVzcGFjZTo6dG9wTGV2ZWxOYW1lc3BhY2VGdW5jdGlvbigpXDAwIgogCiAvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzI3IHggaThdIGMiYW5vbnltb3VzTmFtZXNwYWNlRnVuY3Rpb25cMDAiCi0vLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzg0IHggaThdIGMidm9pZCA8YW5vbnltb3VzIG5hbWVzcGFjZT46OkNsYXNzSW5Bbm9ueW1vdXNOYW1lc3BhY2U6OmFub255bW91c05hbWVzcGFjZUZ1bmN0aW9uKClcMDAiCisvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzg0IHggaThdIGMidm9pZCAoYW5vbnltb3VzIG5hbWVzcGFjZSk6OkNsYXNzSW5Bbm9ueW1vdXNOYW1lc3BhY2U6OmFub255bW91c05hbWVzcGFjZUZ1bmN0aW9uKClcMDAiCiAKIC8vIENIRUNLOiBwcml2YXRlIHVubmFtZWRfYWRkciBjb25zdGFudCBbMTkgeCBpOF0gYyJsb2NhbENsYXNzRnVuY3Rpb25cMDAiCiAvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzU5IHggaThdIGMidm9pZCBOUzo6bG9jYWxDbGFzcyhpbnQpOjpMb2NhbENsYXNzOjpsb2NhbENsYXNzRnVuY3Rpb24oKVwwMCIKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9wdHItdG8tbWVtYmVyLWZ1bmN0aW9uLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9wdHItdG8tbWVtYmVyLWZ1bmN0aW9uLmNwcAppbmRleCA5MTRhOTBhLi5lMDJiMjA5IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvcHRyLXRvLW1lbWJlci1mdW5jdGlvbi5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3B0ci10by1tZW1iZXItZnVuY3Rpb24uY3BwCkBAIC0xLDggKzEsNyBAQAotLy8gUkVRVUlSRVM6IHg4Ni1yZWdpc3RlcmVkLXRhcmdldCx4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLXN0ZD1jKysxMSAtUyAlcyAtbyAldC02NC5zCi0vLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQNjQgLS1pbnB1dC1maWxlPSV0LTY0LnMgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGkzODYtYXBwbGUtZGFyd2luIC1zdGQ9YysrMTEgLVMgJXMgLW8gJXQtMzIucwotLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBDSEVDSy1MUDMyIC0taW5wdXQtZmlsZT0ldC0zMi5zICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1zdGQ9YysrMTEgLWVtaXQtbGx2bSAlcyAtbyAtIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBDSEVDSy1MUDY0ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbiAtc3RkPWMrKzExIC1lbWl0LWxsdm0gJXMgLW8gLSB8IFwKKy8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFAzMiAlcwogLy8gMTMuMy4zLjIgUmFua2luZyBpbXBsaWNpdCBjb252ZXJzaW9uIHNlcXVlbmNlcwogCiBleHRlcm4gIkMiIGludCBwcmludGYoLi4uKTsKQEAgLTY0LDggKzYzLDggQEAKICAgCUIxIGMgPSBCMSgyKTsKIH0KIAotLy8gQ0hFQ0stTFA2NDogY2FsbHEJX19aTjFYY3ZNMUJGdnZFRXYKLS8vIENIRUNLLUxQNjQ6IGNhbGxxCV9fWjFnTTFDRnZ2RQorLy8gQ0hFQ0stTFA2NDogY2FsbCB7IGk2NCwgaTY0IH0gQF9aTjFYY3ZNMUJGdnZFRXYKKy8vIENIRUNLLUxQNjQ6IGNhbGwgdm9pZCBAX1oxZ00xQ0Z2dkUKIAotLy8gQ0hFQ0stTFAzMjogY2FsbGwJTF9fWk4xWGN2TTFCRnZ2RUV2Ci0vLyBDSEVDSy1MUDMyOiBjYWxsbAlfX1oxZ00xQ0Z2dkUKKy8vIENIRUNLLUxQMzI6IGNhbGwgaTY0IEBfWk4xWGN2TTFCRnZ2RUV2CisvLyBDSEVDSy1MUDMyOiBjYWxsIHZvaWQgQF9aMWdNMUNGdnZFCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvcmVmZXJlbmNlLWZpZWxkLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9yZWZlcmVuY2UtZmllbGQuY3BwCmluZGV4IDAzMTIwMjkuLjU0ZTkxNGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9yZWZlcmVuY2UtZmllbGQuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9yZWZlcmVuY2UtZmllbGQuY3BwCkBAIC0xLDYgKzEsOCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAlcyAtTzIgfCBncmVwICJAX1oxYnYiCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSAlcyAtTzIgfCBGaWxlQ2hlY2sgJXMKIAogLy8gTWFrZSBzdXJlIHRoZSBjYWxsIHRvIGIoKSBkb2Vzbid0IGdldCBvcHRpbWl6ZWQgb3V0LgogZXh0ZXJuIHN0cnVjdCB4IHtjaGFyJiB4LHk7fXk7CiBpbnQgYigpOyAgICAgIAogaW50IGEoKSB7IGlmICghJnkueCkgYigpOyB9CisKKy8vIENIRUNLOiBAX1oxYnYKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9yZWZlcmVuY2UtaW5pdC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvcmVmZXJlbmNlLWluaXQuY3BwCmluZGV4IGQ0N2IxZjMuLjNhM2VhZWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9yZWZlcmVuY2UtaW5pdC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3JlZmVyZW5jZS1pbml0LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtLW9ubHkgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLXZlcmlmeSAlcwogLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKIAogc3RydWN0IFhQVFBhcmFtRGVzY3JpcHRvciB7fTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9yZXR1cm4uY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3JldHVybi5jcHAKaW5kZXggMTk3NTA1NS4uNWMxY2ZkYSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3JldHVybi5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3JldHVybi5jcHAKQEAgLTEsNSArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtTyAtbyAtICVzIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLU9QVAorLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtTyAtbyAtICVzIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLU9QVAogCiAvLyBDSEVDSzogICAgIEBfWjlub19yZXR1cm4KIC8vIENIRUNLLU9QVDogQF9aOW5vX3JldHVybgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3J0dGktZnVuZGFtZW50YWwuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3J0dGktZnVuZGFtZW50YWwuY3BwCmluZGV4IDI0OTVlOTYuLjE0Mjk3YjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9ydHRpLWZ1bmRhbWVudGFsLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvcnR0aS1mdW5kYW1lbnRhbC5jcHAKQEAgLTE1LDEwMiArMTUsMTAyIEBACiB9CiAKIC8vIHZvaWQKLS8vIENIRUNLOiBAX1pUSXYgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVB2ID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVElQS3YgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSXYgPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUHYgPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUEt2ID0gY29uc3RhbnQKIAogLy8gc3RkOjpudWxscHRyX3QKLS8vIENIRUNLOiBAX1pUSURuID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVElQRG4gPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBLRG4gPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSURuID0gY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVBEbiA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQS0RuID0gY29uc3RhbnQKIAogLy8gYm9vbAotLy8gQ0hFQ0s6IEBfWlRJYiA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUGIgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBLYiA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJYiA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQYiA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQS2IgPSBjb25zdGFudAogCiAvLyB3Y2hhcl90Ci0vLyBDSEVDSzogQF9aVEl3ID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVElQdyA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUEt3ID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogQF9aVEl3ID0gY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVB3ID0gY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVBLdyA9IGNvbnN0YW50CiAKIC8vIGNoYXIKLS8vIENIRUNLOiBAX1pUSWMgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBjID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVElQS2MgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSWMgPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUGMgPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUEtjID0gY29uc3RhbnQKIAogLy8gdW5zaWduZWQgY2hhcgotLy8gQ0hFQ0s6IEBfWlRJaCA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUGggPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBLaCA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJaCA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQaCA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQS2ggPSBjb25zdGFudAogCiAvLyBzaWduZWQgY2hhcgotLy8gQ0hFQ0s6IEBfWlRJYSA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUGEgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBLYSA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJYSA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQYSA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQS2EgPSBjb25zdGFudAogCiAvLyBzaG9ydAotLy8gQ0hFQ0s6IEBfWlRJcyA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUHMgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBLcyA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJcyA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQcyA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQS3MgPSBjb25zdGFudAogCiAvLyB1bnNpZ25lZCBzaG9ydAotLy8gQ0hFQ0s6IEBfWlRJdCA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUHQgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBLdCA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJdCA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQdCA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQS3QgPSBjb25zdGFudAogCiAvLyBpbnQKLS8vIENIRUNLOiBAX1pUSWkgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBpID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVElQS2kgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSWkgPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUGkgPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUEtpID0gY29uc3RhbnQKIAogLy8gdW5zaWduZWQgaW50Ci0vLyBDSEVDSzogQF9aVElqID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVElQaiA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUEtqID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElqID0gY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVBqID0gY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVBLaiA9IGNvbnN0YW50CiAKIC8vIGxvbmcKLS8vIENIRUNLOiBAX1pUSWwgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBsID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVElQS2wgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSWwgPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUGwgPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUEtsID0gY29uc3RhbnQKIAogLy8gdW5zaWduZWQgbG9uZwotLy8gQ0hFQ0s6IEBfWlRJbSA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUG0gPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBLbSA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJbSA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQbSA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQS20gPSBjb25zdGFudAogCiAvLyBsb25nIGxvbmcKLS8vIENIRUNLOiBAX1pUSXggPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVB4ID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVElQS3ggPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSXggPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUHggPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUEt4ID0gY29uc3RhbnQKIAogLy8gdW5zaWduZWQgbG9uZyBsb25nCi0vLyBDSEVDSzogQF9aVEl5ID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVElQeSA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUEt5ID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogQF9aVEl5ID0gY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVB5ID0gY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVBLeSA9IGNvbnN0YW50CiAKIC8vIGZsb2F0Ci0vLyBDSEVDSzogQF9aVElmID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVElQZiA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUEtmID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElmID0gY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVBmID0gY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVBLZiA9IGNvbnN0YW50CiAKIC8vIGRvdWJsZQotLy8gQ0hFQ0s6IEBfWlRJZCA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUGQgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBLZCA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJZCA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQZCA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQS2QgPSBjb25zdGFudAogCiAvLyBsb25nIGRvdWJsZQotLy8gQ0hFQ0s6IEBfWlRJZSA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUGUgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBLZSA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJZSA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQZSA9IGNvbnN0YW50CisvLyBDSEVDSzogQF9aVElQS2UgPSBjb25zdGFudAogCiAvLyBjaGFyMTZfdAotLy8gQ0hFQ0s6IEBfWlRJRHMgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBEcyA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUEtEcyA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJRHMgPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUERzID0gY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVBLRHMgPSBjb25zdGFudAogCiAvLyBjaGFyMzJfdAotLy8gQ0hFQ0s6IEBfWlRJRGkgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSVBEaSA9IHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJUEtEaSA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJRGkgPSBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJUERpID0gY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSVBLRGkgPSBjb25zdGFudAogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvcnR0aS1saW5rYWdlLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9ydHRpLWxpbmthZ2UuY3BwCmluZGV4IDQyZmU0MzUuLjE0ODRiOTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9ydHRpLWxpbmthZ2UuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9ydHRpLWxpbmthZ2UuY3BwCkBAIC0xLDU2ICsxLDcyIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLUklUyAtdHJpcGxlPXg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZmhpZGRlbi13ZWFrLXZ0YWJsZXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLUklUyAtdHJpcGxlPXg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnZpc2liaWxpdHkgaGlkZGVuIC1maGlkZGVuLXdlYWstdnRhYmxlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1XSVRILUhJRERFTiAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1JJVMgLXRyaXBsZT14ODZfNjQtYXBwbGUtZGFyd2luMTAgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLUklUyAtdHJpcGxlPXg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZnZpc2liaWxpdHkgaGlkZGVuIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVdJVEgtSElEREVOICVzCiAKICNpbmNsdWRlIDx0eXBlaW5mbz4KIAogLy8gQ0hFQ0stV0lUSC1ISURERU46IF9aVFNGTjEyX0dMT0JBTF9fTl8xMURFdkUgPSBpbnRlcm5hbCBjb25zdGFudAogLy8gQ0hFQ0stV0lUSC1ISURERU46IEBfWlRTUEsyVDQgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50IAogLy8gQ0hFQ0stV0lUSC1ISURERU46IEBfWlRTMlQ0ID0gbGlua29uY2Vfb2RyIGhpZGRlbiBjb25zdGFudCAKLS8vIENIRUNLLVdJVEgtSElEREVOOiBAX1pUSTJUNCA9IGxpbmtvbmNlX29kciBoaWRkZW4gdW5uYW1lZF9hZGRyIGNvbnN0YW50IAotLy8gQ0hFQ0stV0lUSC1ISURERU46IEBfWlRJUEsyVDQgPSBsaW5rb25jZV9vZHIgaGlkZGVuIHVubmFtZWRfYWRkciBjb25zdGFudCAKKy8vIENIRUNLLVdJVEgtSElEREVOOiBAX1pUSTJUNCA9IGxpbmtvbmNlX29kciBoaWRkZW4gY29uc3RhbnQgCisvLyBDSEVDSy1XSVRILUhJRERFTjogQF9aVElQSzJUNCA9IGxpbmtvbmNlX29kciBoaWRkZW4gY29uc3RhbnQgCisvLyBDSEVDSy1XSVRILUhJRERFTjogQF9aVFNaMnQ1dkUxQSA9IGludGVybmFsIGNvbnN0YW50CisvLyBDSEVDSy1XSVRILUhJRERFTjogQF9aVElaMnQ1dkUxQSA9IGludGVybmFsIGNvbnN0YW50CisvLyBDSEVDSy1XSVRILUhJRERFTjogQF9aVFNQWjJ0N3ZFMUEgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50CisvLyBDSEVDSy1XSVRILUhJRERFTjogQF9aVFNaMnQ3dkUxQSA9IGxpbmtvbmNlX29kciBoaWRkZW4gY29uc3RhbnQKKy8vIENIRUNLLVdJVEgtSElEREVOOiBAX1pUSVoydDd2RTFBID0gbGlua29uY2Vfb2RyIGhpZGRlbiBjb25zdGFudAorLy8gQ0hFQ0stV0lUSC1ISURERU46IEBfWlRJUFoydDd2RTFBID0gbGlua29uY2Vfb2RyIGhpZGRlbiBjb25zdGFudAorLy8gQ0hFQ0stV0lUSC1ISURERU46IEBfWlRTWjJ0NnZFMUEgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50CisvLyBDSEVDSy1XSVRILUhJRERFTjogQF9aVElaMnQ2dkUxQSA9IGxpbmtvbmNlX29kciBoaWRkZW4gY29uc3RhbnQKIAogLy8gQ0hFQ0s6IF9aVFNQMUMgPSBpbnRlcm5hbCBjb25zdGFudAogLy8gQ0hFQ0s6IF9aVFMxQyA9IGludGVybmFsIGNvbnN0YW50Ci0vLyBDSEVDSzogX1pUSTFDID0gaW50ZXJuYWwgdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogX1pUSVAxQyA9IGludGVybmFsIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IF9aVEkxQyA9IGludGVybmFsIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSVAxQyA9IGludGVybmFsIGNvbnN0YW50CiAvLyBDSEVDSzogX1pUU1BQMUMgPSBpbnRlcm5hbCBjb25zdGFudAotLy8gQ0hFQ0s6IF9aVElQUDFDID0gaW50ZXJuYWwgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSVBQMUMgPSBpbnRlcm5hbCBjb25zdGFudAogLy8gQ0hFQ0s6IF9aVFNNMUNpID0gaW50ZXJuYWwgY29uc3RhbnQKLS8vIENIRUNLOiBfWlRJTTFDaSA9IGludGVybmFsIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IF9aVElNMUNpID0gaW50ZXJuYWwgY29uc3RhbnQKIC8vIENIRUNLOiBfWlRTUE0xQ2kgPSBpbnRlcm5hbCBjb25zdGFudAotLy8gQ0hFQ0s6IF9aVElQTTFDaSA9IGludGVybmFsIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IF9aVElQTTFDaSA9IGludGVybmFsIGNvbnN0YW50CiAvLyBDSEVDSzogX1pUU00xQ1NfID0gaW50ZXJuYWwgY29uc3RhbnQKLS8vIENIRUNLOiBfWlRJTTFDU18gPSBpbnRlcm5hbCB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBfWlRJTTFDU18gPSBpbnRlcm5hbCBjb25zdGFudAogLy8gQ0hFQ0s6IF9aVFNNMUNQU18gPSBpbnRlcm5hbCBjb25zdGFudAotLy8gQ0hFQ0s6IF9aVElNMUNQU18gPSBpbnRlcm5hbCB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBfWlRJTTFDUFNfID0gaW50ZXJuYWwgY29uc3RhbnQKIC8vIENIRUNLOiBfWlRTTTFBMUMgPSBpbnRlcm5hbCBjb25zdGFudAogLy8gQ0hFQ0s6IF9aVFMxQSA9IGxpbmtvbmNlX29kciBjb25zdGFudAotLy8gQ0hFQ0s6IF9aVEkxQSA9IGxpbmtvbmNlX29kciBoaWRkZW4gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogX1pUSU0xQTFDID0gaW50ZXJuYWwgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSTFBID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSU0xQTFDID0gaW50ZXJuYWwgY29uc3RhbnQKIC8vIENIRUNLOiBfWlRTTTFBUDFDID0gaW50ZXJuYWwgY29uc3RhbnQKLS8vIENIRUNLOiBfWlRJTTFBUDFDID0gaW50ZXJuYWwgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSU0xQVAxQyA9IGludGVybmFsIGNvbnN0YW50CiAvLyBDSEVDSzogX1pUU04xMl9HTE9CQUxfX05fMTFERSA9IGludGVybmFsIGNvbnN0YW50Ci0vLyBDSEVDSzogX1pUSU4xMl9HTE9CQUxfX05fMTFERSA9IGludGVybmFsIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IF9aVElOMTJfR0xPQkFMX19OXzExREUgPSBpbnRlcm5hbCBjb25zdGFudAogLy8gQ0hFQ0s6IF9aVFNQTjEyX0dMT0JBTF9fTl8xMURFID0gaW50ZXJuYWwgY29uc3RhbnQKLS8vIENIRUNLOiBfWlRJUE4xMl9HTE9CQUxfX05fMTFERSA9IGludGVybmFsIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IF9aVElQTjEyX0dMT0JBTF9fTl8xMURFID0gaW50ZXJuYWwgY29uc3RhbnQKIC8vIENIRUNLOiBfWlRTRk4xMl9HTE9CQUxfX05fMTFERXZFID0gaW50ZXJuYWwgY29uc3RhbnQKLS8vIENIRUNLOiBfWlRJRk4xMl9HTE9CQUxfX05fMTFERXZFID0gaW50ZXJuYWwgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSUZOMTJfR0xPQkFMX19OXzExREV2RSA9IGludGVybmFsIGNvbnN0YW50CiAvLyBDSEVDSzogX1pUU0Z2TjEyX0dMT0JBTF9fTl8xMURFRSA9IGludGVybmFsIGNvbnN0YW50Ci0vLyBDSEVDSzogX1pUSUZ2TjEyX0dMT0JBTF9fTl8xMURFRSA9IGludGVybmFsIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IF9aVElGdk4xMl9HTE9CQUxfX05fMTFERUUgPSBpbnRlcm5hbCBjb25zdGFudAogLy8gQ0hFQ0s6IF9aVFNQRnZ2RSA9IGxpbmtvbmNlX29kciBjb25zdGFudAogLy8gQ0hFQ0s6IF9aVFNGdnZFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSzogX1pUSUZ2dkUgPSBsaW5rb25jZV9vZHIgaGlkZGVuIHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0s6IF9aVElQRnZ2RSA9IGxpbmtvbmNlX29kciBoaWRkZW4gdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSUZ2dkUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKKy8vIENIRUNLOiBfWlRJUEZ2dkUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKIC8vIENIRUNLOiBfWlRTTjEyX0dMT0JBTF9fTl8xMUVFID0gaW50ZXJuYWwgY29uc3RhbnQKLS8vIENIRUNLOiBfWlRJTjEyX0dMT0JBTF9fTl8xMUVFID0gaW50ZXJuYWwgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSU4xMl9HTE9CQUxfX05fMTFFRSA9IGludGVybmFsIGNvbnN0YW50CiAvLyBDSEVDSzogX1pUU0ExMF9pID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSzogX1pUSUExMF9pID0gbGlua29uY2Vfb2RyIGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBfWlRJMVRJTGowRUUgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSzogX1pUSTFUSUxqMUVFID0gd2Vha19vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSUExMF9pID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSTFUSUxqMEVFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSTFUSUxqMUVFID0gd2Vha19vZHIgY29uc3RhbnQKIC8vIENIRUNLOiBfWlRJMVRJTGoyRUUgPSBleHRlcm5hbCBjb25zdGFudAorLy8gQ0hFQ0s6IF9aVFNaMnQ1dkUxQSA9IGludGVybmFsIGNvbnN0YW50CisvLyBDSEVDSzogX1pUSVoydDV2RTFBID0gaW50ZXJuYWwgY29uc3RhbnQKIC8vIENIRUNLOiBfWlRTMUIgPSBjb25zdGFudAotLy8gQ0hFQ0s6IF9aVEkxQiA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IF9aVEkxQiA9IGNvbnN0YW50CiAvLyBDSEVDSzogX1pUUzFGID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CisvLyBDSEVDSzogX1pUU1BaMnQ3dkUxQSA9IGxpbmtvbmNlX29kciBjb25zdGFudAorLy8gQ0hFQ0s6IF9aVFNaMnQ3dkUxQSA9IGxpbmtvbmNlX29kciBjb25zdGFudAorLy8gQ0hFQ0s6IF9aVElaMnQ3dkUxQSA9IGxpbmtvbmNlX29kciBjb25zdGFudAorLy8gQ0hFQ0s6IF9aVElQWjJ0N3ZFMUEgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKKy8vIENIRUNLOiBfWlRTWjJ0NnZFMUEgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKKy8vIENIRUNLOiBfWlRJWjJ0NnZFMUEgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKIAogLy8gQ0hFQ0s6IF9aVElOMTJfR0xPQkFMX19OXzExREUgdG8KIApAQCAtMTM4LDMgKzE1NCwyNSBAQAogdm9pZCB0NChjb25zdCBUNCAqcHRyKSB7CiAgIGNvbnN0IHZvaWQgKnZhbHVlID0gJnR5cGVpZChwdHIpOwogfQorCisvLyByZGFyOi8vMTYyNjUwODQKK3ZvaWQgdDUoKSB7CisgIHN0cnVjdCBBIHt9OworICBjb25zdCB2b2lkICp2YWx1ZSA9ICZ0eXBlaWQoQSk7Cit9CisKK2lubGluZSB2b2lkIHQ2KCkgeworICBzdHJ1Y3QgQSB7fTsKKyAgY29uc3Qgdm9pZCAqdmFsdWUgPSAmdHlwZWlkKEEpOworfQordm9pZCB0Nl9oZWxwZXIoKSB7CisgIHQ2KCk7Cit9CisKK2lubGluZSB2b2lkIHQ3KCkgeworICBzdHJ1Y3QgQSB7fTsKKyAgY29uc3Qgdm9pZCAqdmFsdWUgPSAmdHlwZWlkKEEqKTsKK30KK3ZvaWQgdDdfaGVscGVyKCkgeworICB0NygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3J0dGktdmlzaWJpbGl0eS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvcnR0aS12aXNpYmlsaXR5LmNwcAppbmRleCA0MGNlZTA2Li41OTQ1YmU1IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvcnR0aS12aXNpYmlsaXR5LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvcnR0aS12aXNpYmlsaXR5LmNwcApAQCAtMSwxNyArMSwxNSBAQAogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1JJVMgLXRyaXBsZT14ODZfNjQtYXBwbGUtZGFyd2luMTAgLWVtaXQtbGx2bSAtbyAldAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1JJVMgLXRyaXBsZT14ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZoaWRkZW4td2Vhay12dGFibGVzIC1lbWl0LWxsdm0gLW8gJXQuaGlkZGVuCiAvLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1URVNUMSAlcyA8ICV0CiAvLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1URVNUMiAlcyA8ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1URVNUMi1ISURERU4gJXMgPCAldC5oaWRkZW4KIAogI2luY2x1ZGUgPHR5cGVpbmZvPgogCiBuYW1lc3BhY2UgVGVzdDEgewogICAvLyBBIGlzIGV4cGxpY2l0bHkgbWFya2VkIGhpZGRlbiwgc28gYWxsIFJUVEkgZGF0YSBzaG91bGQgYWxzbyBiZSBtYXJrZWQgaGlkZGVuLgogICAvLyBDSEVDSy1URVNUMTogQF9aVFNONVRlc3QxMUFFID0gbGlua29uY2Vfb2RyIGhpZGRlbiBjb25zdGFudAotICAvLyBDSEVDSy1URVNUMTogQF9aVElONVRlc3QxMUFFID0gbGlua29uY2Vfb2RyIGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKyAgLy8gQ0hFQ0stVEVTVDE6IEBfWlRJTjVUZXN0MTFBRSA9IGxpbmtvbmNlX29kciBoaWRkZW4gY29uc3RhbnQKICAgLy8gQ0hFQ0stVEVTVDE6IEBfWlRTUE41VGVzdDExQUUgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50Ci0gIC8vIENIRUNLLVRFU1QxOiBAX1pUSVBONVRlc3QxMUFFID0gbGlua29uY2Vfb2RyIGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKyAgLy8gQ0hFQ0stVEVTVDE6IEBfWlRJUE41VGVzdDExQUUgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50CiAgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpIEEgeyB9OwogCiAgIHZvaWQgZigpIHsKQEAgLTIzLDEyICsyMSw4IEBACiBuYW1lc3BhY2UgVGVzdDIgewogICAvLyBBIGlzIHdlYWssIHNvIGl0cyBsaW5rYWdlIHNob3VsZCBiZSBsaW5rb2NlX29kciwgYnV0IG5vdCBtYXJrZWQgaGlkZGVuLgogICAvLyBDSEVDSy1URVNUMjogQF9aVFNONVRlc3QyMUFFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0gIC8vIENIRUNLLVRFU1QyOiBAX1pUSU41VGVzdDIxQUUgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisgIC8vIENIRUNLLVRFU1QyOiBAX1pUSU41VGVzdDIxQUUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKICAgc3RydWN0IEEgeyB9OwotCi0gIC8vIFdpdGggLWZoaWRkZW4td2Vhay12dGFibGVzLCB0aGUgdHlwZWluZm8gZm9yIEEgaXMgbWFya2VkIGhpZGRlbiwgYnV0IG5vdCBpdHMgbmFtZS4KLSAgLy8gQ0hFQ0stVEVTVDItSElEREVOOiBfWlRTTjVUZXN0MjFBRSA9IGxpbmtvbmNlX29kciBjb25zdGFudAotICAvLyBDSEVDSy1URVNUMi1ISURERU46IEBfWlRJTjVUZXN0MjFBRSA9IGxpbmtvbmNlX29kciBoaWRkZW4gdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAgIHZvaWQgZigpIHsKICAgICAodm9pZCl0eXBlaWQoQSk7CiAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9zY29wZWQtZW51bXMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3Njb3BlZC1lbnVtcy5jcHAKaW5kZXggMTU5MTcyZC4uMjE4MDEzYSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3Njb3BlZC1lbnVtcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3Njb3BlZC1lbnVtcy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAogLy8gUFI5OTIzCiBlbnVtIGNsYXNzIENvbG9yIHsgcmVkLCBibHVlLCBncmVlbiB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3NwYXJjdjktYWJpLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9zcGFyY3Y5LWFiaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4ZDY0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9zcGFyY3Y5LWFiaS5jcHAKQEAgLTAsMCArMSwyNiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgc3BhcmN2OS11bmtub3duLXVua25vd24gLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisKK3N0cnVjdCBwb2QgeworICBpbnQgYSwgYjsKK307CisKK3ZvaWQgZjAoKTsKK3ZvaWQgZjEoc3RydWN0IHBvZCk7CisKK3N0cnVjdCBub3Rwb2QgeworICBpbnQgYSwgYjsKKyAgfm5vdHBvZCgpIHsgZjAoKTsgfQorfTsKKwordm9pZCBmMihzdHJ1Y3Qgbm90cG9kKTsKKworLy8gQ0hFQ0stTEFCRUw6IGNhbGxlcgorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1oyZjEzcG9kKGk2NAorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1oyZjI2bm90cG9kKCVzdHJ1Y3Qubm90cG9kKgordm9pZCBjYWxsZXIoKQoreworICBwb2QgcDE7CisgIG5vdHBvZCBwMjsKKyAgZjEocDEpOworICBmMihwMik7Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvc3BlY2lhbGl6ZWQtc3RhdGljLWRhdGEtbWVtLWluaXQuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3NwZWNpYWxpemVkLXN0YXRpYy1kYXRhLW1lbS1pbml0LmNwcAppbmRleCBjMmEyZGRiLi4yMWJjMTIzIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvc3BlY2lhbGl6ZWQtc3RhdGljLWRhdGEtbWVtLWluaXQuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC9zcGVjaWFsaXplZC1zdGF0aWMtZGF0YS1tZW0taW5pdC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSB8IEZpbGVDaGVjayAlcwogLy8gcmRhcjogLy8gODU2Mjk2NgogLy8gcHI4NDA5CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC9zdGF0aWMtaW5pdC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvc3RhdGljLWluaXQuY3BwCmluZGV4IGY1MjI3NzUuLmQyM2VhZDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC9zdGF0aWMtaW5pdC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3N0YXRpYy1pbml0LmNwcApAQCAtMTAzLDE0ICsxMDMsMTQgQEAKICAgQjo6QigpIHsKICAgICBzdGF0aWMgaW50IHggPSBmb28oKTsKICAgfQotICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjV0ZXN0MjFCQzFFdgorICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjV0ZXN0MjFCQzJFdgogICAvLyBDSEVDSzogICBsb2FkIGF0b21pYyBpOCogYml0Y2FzdCAoaTY0KiBAX1pHVlpONXRlc3QyMUJDMUV2RTF4IHRvIGk4KikgYWNxdWlyZSwKICAgLy8gQ0hFQ0s6ICAgY2FsbCBpMzIgQF9fY3hhX2d1YXJkX2FjcXVpcmUoaTY0KiBAX1pHVlpONXRlc3QyMUJDMUV2RTF4KQogICAvLyBDSEVDSzogICBbW1QwOiUuKl1dID0gY2FsbCBpMzIgQF9aTjV0ZXN0MjNmb29FdigpCiAgIC8vIENIRUNLOiAgIHN0b3JlIGkzMiBbW1QwXV0sIGkzMiogQF9aWk41dGVzdDIxQkMxRXZFMXgsCiAgIC8vIENIRUNLOiAgIGNhbGwgdm9pZCBAX19jeGFfZ3VhcmRfcmVsZWFzZShpNjQqIEBfWkdWWk41dGVzdDIxQkMxRXZFMXgpCiAKLSAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dGVzdDIxQkMyRXYKKyAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dGVzdDIxQkMxRXYKICAgLy8gQ0hFQ0s6ICAgbG9hZCBhdG9taWMgaTgqIGJpdGNhc3QgKGk2NCogQF9aR1ZaTjV0ZXN0MjFCQzFFdkUxeCB0byBpOCopIGFjcXVpcmUsCiAgIC8vIENIRUNLOiAgIGNhbGwgaTMyIEBfX2N4YV9ndWFyZF9hY3F1aXJlKGk2NCogQF9aR1ZaTjV0ZXN0MjFCQzFFdkUxeCkKICAgLy8gQ0hFQ0s6ICAgW1tUMDolLipdXSA9IGNhbGwgaTMyIEBfWk41dGVzdDIzZm9vRXYoKQpAQCAtMTIyLDE1ICsxMjIsMTUgQEAKICAgQjo6fkIoKSB7CiAgICAgc3RhdGljIGludCB5ID0gZm9vKCk7CiAgIH0KLSAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dGVzdDIxQkQxRXYoCi0gIC8vIENIRUNLOiAgIGNhbGwgdm9pZCBAX1pONXRlc3QyMUJEMkV2KAotCiAgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pONXRlc3QyMUJEMkV2KAogICAvLyBDSEVDSzogICBsb2FkIGF0b21pYyBpOCogYml0Y2FzdCAoaTY0KiBAX1pHVlpONXRlc3QyMUJEMUV2RTF5IHRvIGk4KikgYWNxdWlyZSwKICAgLy8gQ0hFQ0s6ICAgY2FsbCBpMzIgQF9fY3hhX2d1YXJkX2FjcXVpcmUoaTY0KiBAX1pHVlpONXRlc3QyMUJEMUV2RTF5KQogICAvLyBDSEVDSzogICBbW1QwOiUuKl1dID0gY2FsbCBpMzIgQF9aTjV0ZXN0MjNmb29FdigpCiAgIC8vIENIRUNLOiAgIHN0b3JlIGkzMiBbW1QwXV0sIGkzMiogQF9aWk41dGVzdDIxQkQxRXZFMXksCiAgIC8vIENIRUNLOiAgIGNhbGwgdm9pZCBAX19jeGFfZ3VhcmRfcmVsZWFzZShpNjQqIEBfWkdWWk41dGVzdDIxQkQxRXZFMXkpCisKKyAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dGVzdDIxQkQxRXYoCisgIC8vIENIRUNLOiAgIGNhbGwgdm9pZCBAX1pONXRlc3QyMUJEMkV2KAogfQogCiAvLyBUaGlzIHNob3VsZG4ndCBlcnJvciBvdXQuCkBAIC0xNDksNiArMTQ5LDYgQEAKICAgICB1bmlvbiBVIHsgY2hhciB4OyBpbnQgaTsgfTsKICAgICBzdGF0aWMgVSB1ID0geyAnYScgfTsKICAgfQotICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjV0ZXN0MzFCQzFFdigKICAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dGVzdDMxQkMyRXYoCisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pONXRlc3QzMUJDMUV2KAogfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3N0bXRleHByLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC9zdG10ZXhwci5jcHAKaW5kZXggNWQ0ZDZiYy4uN2JmMTliYiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3N0bXRleHByLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvc3RtdGV4cHIuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1Xbm8tdW51c2VkLXZhbHVlIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1Xbm8tdW51c2VkLXZhbHVlIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIC8vIHJkYXI6IC8vODU0MDUwMQogZXh0ZXJuICJDIiBpbnQgcHJpbnRmKC4uLik7CiBleHRlcm4gIkMiIHZvaWQgYWJvcnQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC90ZW1wbGF0ZS1kZXBlbmRlbnQtYmluZC10ZW1wb3JhcnkuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3RlbXBsYXRlLWRlcGVuZGVudC1iaW5kLXRlbXBvcmFyeS5jcHAKaW5kZXggY2E5ODBjMy4uNDdkODI3OSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3RlbXBsYXRlLWRlcGVuZGVudC1iaW5kLXRlbXBvcmFyeS5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3RlbXBsYXRlLWRlcGVuZGVudC1iaW5kLXRlbXBvcmFyeS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSB8IEZpbGVDaGVjayAlcwogLy8gcmRhcjogLy84NjIwNTI0CiAvLyBQUjc4NTEKIHN0cnVjdCBzdHJpbmcgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3RlbXBsYXRlLWlubmVyLXN0cnVjdC12aXNpYmlsaXR5LWhpZGRlbi5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdGVtcGxhdGUtaW5uZXItc3RydWN0LXZpc2liaWxpdHktaGlkZGVuLmNwcAppbmRleCBkZTg2ZjEwLi4xMzc3OTJiIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdGVtcGxhdGUtaW5uZXItc3RydWN0LXZpc2liaWxpdHktaGlkZGVuLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdGVtcGxhdGUtaW5uZXItc3RydWN0LXZpc2liaWxpdHktaGlkZGVuLmNwcApAQCAtMSw5ICsxLDkgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnZpc2liaWxpdHkgaGlkZGVuIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mdmlzaWJpbGl0eSBoaWRkZW4gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiAvLyBWZXJpZnkgdGhhdCBzeW1ib2xzIGFyZSBoaWRkZW4uCiAvLyBDSEVDSzogQF9aTjFDSWlFNUlubmVyNklubmVyMjZTdGF0aWNFID0gd2Vha19vZHIgaGlkZGVuIGdsb2JhbAotLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB3ZWFrX29kciBoaWRkZW4gdm9pZCBAX1pOMUNJaUU1SW5uZXIxZkV2Ci0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIHdlYWtfb2RyIGhpZGRlbiB2b2lkIEBfWk4xQ0lpRTVJbm5lcjZJbm5lcjIxZ0V2CisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHdlYWtfb2RyIGhpZGRlbiB7ey4qfX12b2lkIEBfWk4xQ0lpRTVJbm5lcjFmRXYKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgd2Vha19vZHIgaGlkZGVuIHt7Lip9fXZvaWQgQF9aTjFDSWlFNUlubmVyNklubmVyMjFnRXYKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIHN0cnVjdCBDIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC90ZW1wbGF0ZS1pbnN0YW50aWF0aW9uLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC90ZW1wbGF0ZS1pbnN0YW50aWF0aW9uLmNwcAppbmRleCA4MDI4M2ExLi4zYmFhOTQ2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdGVtcGxhdGUtaW5zdGFudGlhdGlvbi5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3RlbXBsYXRlLWluc3RhbnRpYXRpb24uY3BwCkBAIC01LDExICs1LDE1IEBACiAvLwogLy8gQ0hFQ0stTk9UOiBAX1pUVk41dGVzdDExOHN0ZGlvX3N5bmNfZmlsZWJ1Zkl3RUUgPSBjb25zdGFudAogLy8gQ0hFQ0stTk9UOiBfWlRWTjV0ZXN0MzE1YmFzaWNfZnN0cmVhbVhYSWNFRQotLy8gQ0hFQ0s6IEBfWlRWTjV0ZXN0MDE4c3RkaW9fc3luY19maWxlYnVmSXdFRSA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0stTk9UOiBAX1pUVk41dGVzdDAxOHN0ZGlvX3N5bmNfZmlsZWJ1ZklBMV9pRUUKKy8vIENIRUNLLU5PVDogQF9aVFZONXRlc3QwMThzdGRpb19zeW5jX2ZpbGVidWZJQTJfaUVFCisvLyBDSEVDSzogICAgIEBfWlRWTjV0ZXN0MDE4c3RkaW9fc3luY19maWxlYnVmSUEzX2lFRSA9IHdlYWtfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAogCiAvLyBDSEVDSzogQF9aTjdQUjEwMDAxMVNJaUUzYXJyRSA9IHdlYWtfb2RyIGdsb2JhbCBbMyB4IGkzMl0KIC8vIENIRUNLLU5PVDogQF9aTjdQUjEwMDAxMVNJaUUzYXJyMkUgPSB3ZWFrX29kciBnbG9iYWwgWzMgeCBpMzJdQQogCisvLyBDSEVDSzogICAgIEBfWlRWTjV0ZXN0MDE4c3RkaW9fc3luY19maWxlYnVmSUE0X2lFRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKwogLy8gQ0hFQ0stTk9UOiBfWlRWTjV0ZXN0MzFTSWlFRQogLy8gQ0hFQ0stTk9UOiBfWlRTTjV0ZXN0MzFTSWlFRQogCkBAIC0zOSwxMSArNDMsMjEgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICB4c2dldG4oKTsKICAgfTsKIAotICAvLyBUaGlzIHNwZWNpYWxpemF0aW9uIHNob3VsZCBjYXVzZSB0aGUgdnRhYmxlIHRvIGJlIGVtaXR0ZWQsIGV2ZW4gd2l0aAotICAvLyB0aGUgZm9sbG93aW5nIGV4dGVybiB0ZW1wbGF0ZSBkZWNsYXJhdGlvbi4KLSAgdGVtcGxhdGU8PiB2b2lkIHN0ZGlvX3N5bmNfZmlsZWJ1Zjx3Y2hhcl90Pjo6eHNnZXRuKCkgIHsKKyAgLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBpcyBub3QgYSBrZXkgZnVuY3Rpb24sIHNvIGRvZXNuJ3QgY2F1c2UgdGhlIHZ0YWJsZSB0bworICAvLyBiZSBpbnN0YW50aWF0ZWQgdW5sZXNzIHdlJ3JlIGluc3RhbnRpYXRpbmcgYSBjbGFzcyBkZWZpbml0aW9uIGFueXdheS4KKyAgdGVtcGxhdGU8PiB2b2lkIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxpbnRbMV0+Ojp4c2dldG4oKSAgewogICB9Ci0gIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBzdGRpb19zeW5jX2ZpbGVidWY8d2NoYXJfdD47CisgIHRlbXBsYXRlPD4gdm9pZCBzdGRpb19zeW5jX2ZpbGVidWY8aW50WzJdPjo6eHNnZXRuKCkgIHsKKyAgfQorICB0ZW1wbGF0ZTw+IHZvaWQgc3RkaW9fc3luY19maWxlYnVmPGludFszXT46OnhzZ2V0bigpICB7CisgIH0KKyAgdGVtcGxhdGU8PiB2b2lkIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxpbnRbNF0+Ojp4c2dldG4oKSAgeworICB9CisgIGV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBzdGRpb19zeW5jX2ZpbGVidWY8aW50WzJdPjsKKworICAvLyBUaGVzZSB0d28gYm90aCBjYXVzZSB2dGFibGVzIHRvIGJlIGVtaXR0ZWQuCisgIHRlbXBsYXRlIGNsYXNzIHN0ZGlvX3N5bmNfZmlsZWJ1ZjxpbnRbM10+OworICBzdGRpb19zeW5jX2ZpbGVidWY8aW50WzRdPiBpbXBsaWNpdF9pbnN0YW50aWF0aW9uOwogfQogCiBuYW1lc3BhY2UgdGVzdDEgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3Rocm93LWV4cHJlc3Npb24tZHRvci5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdGhyb3ctZXhwcmVzc2lvbi1kdG9yLmNwcAppbmRleCBjYjRhNmM2Li5iODgzYjg1IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdGhyb3ctZXhwcmVzc2lvbi1kdG9yLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdGhyb3ctZXhwcmVzc2lvbi1kdG9yLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtLW9ubHkgLXZlcmlmeSAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0tb25seSAtdmVyaWZ5IC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucwogLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKIC8vIFBSNzI4MQogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvdGhyb3ctZXhwcmVzc2lvbnMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3Rocm93LWV4cHJlc3Npb25zLmNwcAppbmRleCBkOWJmOGZkLi43ZTgxMTQxIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdGhyb3ctZXhwcmVzc2lvbnMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC90aHJvdy1leHByZXNzaW9ucy5jcHAKQEAgLTY3LDMgKzY3LDE2IEBACiAvLwogLy8gZW5kOgogLy8gQ0hFQ0s6IHJldCBpMzIKKworbmFtZXNwYWNlIERSMTU2MCB7CisgIHN0cnVjdCBBIHsKKyAgICB+QSgpOworICB9OworICBleHRlcm4gYm9vbCBiOworICBBIGdldCgpOworICAvLyBDSEVDSy1MQUJFTDogQF9aTjZEUjE1NjAxYkUKKyAgY29uc3QgQSAmciA9IGIgPyBnZXQoKSA6IHRocm93IDA7CisgIC8vIENIRUNLLU5PVDogY2FsbCB7ey4qfX1AX1pONkRSMTU2MDFBRDFFdgorICAvLyBDSEVDSzogY2FsbCB7ey4qfX0gQF9fY3hhX2F0ZXhpdCh7ey4qfX0gQF9aTjZEUjE1NjAxQUQxRXYge3suKn19IEBfWkdSTjZEUjE1NjAxckUKKyAgLy8gQ0hFQ0stTk9UOiBjYWxsIHt7Lip9fUBfWk42RFIxNTYwMUFEMUV2Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvdGh1bmstdXNlLWFmdGVyLWZyZWUuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3RodW5rLXVzZS1hZnRlci1mcmVlLmNwcAppbmRleCBkNzBlOTAyLi4xNGYyMzU2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdGh1bmstdXNlLWFmdGVyLWZyZWUuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC90aHVuay11c2UtYWZ0ZXItZnJlZS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bS1vbmx5IC1PMSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLU8xICVzCiAvLyBUaGlzIHVzZWQgdG8gY3Jhc2ggdW5kZXIgYXNhbiBhbmQgdmFsZ3JpbmQuCiAvLyBQUjEyMjg0CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC90aHVua3MuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3RodW5rcy5jcHAKaW5kZXggZGVmYjcwNi4uODllNGRiMyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3RodW5rcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3RodW5rcy5jcHAKQEAgLTEsNiArMSw1IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZT14ODZfNjQtcGMtbGludXgtZ251IC1tdW53aW5kLXRhYmxlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIC8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlPXg4Nl82NC1wYy1saW51eC1nbnUgLW11bndpbmQtdGFibGVzIC1lbWl0LWxsdm0gLW8gLSAtTzEgLWRpc2FibGUtbGx2bS1vcHR6bnMgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlPXg4Nl82NC1wYy1saW51eC1nbnUgLW11bndpbmQtdGFibGVzIC1maGlkZGVuLXdlYWstdnRhYmxlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1ISURERU4gJXMKIAogbmFtZXNwYWNlIFRlc3QxIHsKIApAQCAtMjUxLDkgKzI1MCw3IEBACiAgIHN0cnVjdCBCIHsgdmlydHVhbCB2b2lkIGZvbygpOyB9OwogICBzdHJ1Y3QgQyA6IEEsIEIgeyB2b2lkIGZvbygpIHt9IH07CiAKLSAgLy8gQ0hFQ0stSElEREVOLUxBQkVMOiBkZWZpbmUgbGlua29uY2Vfb2RyIHZvaWQgQF9aTjZUZXN0MTAxQzNmb29FdgotICAvLyBDSEVDSy1ISURERU4tTEFCRUw6IGRlZmluZSBsaW5rb25jZV9vZHIgaGlkZGVuIHZvaWQgQF9aVGhuOF9ONlRlc3QxMDFDM2Zvb0V2Ci0KKyAgLy8gVGVzdCBsYXRlci4KICAgdm9pZCB0ZXN0KCkgewogICAgIEMgYzsKICAgfQpAQCAtMzY2LDYgKzM2MywxMCBAQAogCiAvKioqKiBUaGUgZm9sbG93aW5nIGhhcyB0byBnbyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlICoqKiovCiAKKy8vIFRoaXMgaXMgZnJvbSBUZXN0MTA6CisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGxpbmtvbmNlX29kciB2b2lkIEBfWk42VGVzdDEwMUMzZm9vRXYKKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgbGlua29uY2Vfb2RyIHZvaWQgQF9aVGhuOF9ONlRlc3QxMDFDM2Zvb0V2CisKIC8vIFRoaXMgaXMgZnJvbSBUZXN0NToKIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgbGlua29uY2Vfb2RyIHZvaWQgQF9aVHYwX24yNF9ONVRlc3Q1MUIxZkV2CiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIGludGVybmFsIHZvaWQgQF9aVGhuOF9ONlRlc3Q0QjEyX0dMT0JBTF9fTl8xMUMxZkV2KApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3RyaXZpYWwtY29uc3RydWN0b3ItaW5pdC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdHJpdmlhbC1jb25zdHJ1Y3Rvci1pbml0LmNwcAppbmRleCA2NWVkNDVlLi45MTMwZTRlIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdHJpdmlhbC1jb25zdHJ1Y3Rvci1pbml0LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdHJpdmlhbC1jb25zdHJ1Y3Rvci1pbml0LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLXN0ZD1jKysxMSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSAtc3RkPWMrKzExIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSB8IEZpbGVDaGVjayAlcwogCiBleHRlcm4gIkMiIGludCBwcmludGYoLi4uKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3R5cGUtdHJhaXRzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC90eXBlLXRyYWl0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjYzZiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC90eXBlLXRyYWl0cy5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bS1vbmx5IC12ZXJpZnkgJXMKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisKK2Jvb2wgYSgpIHsgcmV0dXJuIF9faXNfcG9kKGludCk7IH0KKworYm9vbCBiKCkgeyByZXR1cm4gX19pc190cml2aWFsbHlfY29uc3RydWN0aWJsZShpbnQsIGludCwgaW50KTsgfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3R5cGVfdmlzaWJpbGl0eS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdHlwZV92aXNpYmlsaXR5LmNwcAppbmRleCAxMWU1MDkxLi5hN2I3MTk4IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdHlwZV92aXNpYmlsaXR5LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdHlwZV92aXNpYmlsaXR5LmNwcApAQCAtMjksMTEgKzI5LDExIEBACiAgIC8vIEZVTlMtTEFCRUw6ICAgICAgICBkZWZpbmUgd2Vha19vZHIgdm9pZCBAX1pONXRlbXAwMUJJTlNfMUFFRTNmb29FdigKICAgLy8gVkFSUzogICAgICAgIEBfWlRWTjV0ZW1wMDFCSU5TXzFBRUVFID0gd2Vha19vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAgIC8vIFZBUlM6ICAgICAgICBAX1pUU041dGVtcDAxQklOU18xQUVFRSA9IHdlYWtfb2RyIGNvbnN0YW50Ci0gIC8vIFZBUlM6ICAgICAgICBAX1pUSU41dGVtcDAxQklOU18xQUVFRSA9IHdlYWtfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBWQVJTOiAgICAgICAgQF9aVElONXRlbXAwMUJJTlNfMUFFRUUgPSB3ZWFrX29kciBjb25zdGFudAogICAvLyBGVU5TLUhJRERFTi1MQUJFTDogZGVmaW5lIHdlYWtfb2RyIGhpZGRlbiB2b2lkIEBfWk41dGVtcDAxQklOU18xQUVFM2Zvb0V2KAogICAvLyBWQVJTLUhJRERFTjogQF9aVFZONXRlbXAwMUJJTlNfMUFFRUUgPSB3ZWFrX29kciBoaWRkZW4gdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAgIC8vIFZBUlMtSElEREVOOiBAX1pUU041dGVtcDAxQklOU18xQUVFRSA9IHdlYWtfb2RyIGhpZGRlbiBjb25zdGFudAotICAvLyBWQVJTLUhJRERFTjogQF9aVElONXRlbXAwMUJJTlNfMUFFRUUgPSB3ZWFrX29kciBoaWRkZW4gdW5uYW1lZF9hZGRyIGNvbnN0YW50CisgIC8vIFZBUlMtSElEREVOOiBAX1pUSU41dGVtcDAxQklOU18xQUVFRSA9IHdlYWtfb2RyIGhpZGRlbiBjb25zdGFudAogfQogCiBuYW1lc3BhY2UgdGVtcDEgewpAQCAtNDYsMTEgKzQ2LDExIEBACiAgIC8vIEZVTlMtTEFCRUw6ICAgICAgICBkZWZpbmUgd2Vha19vZHIgdm9pZCBAX1pONXRlbXAxMUJJTlNfMUFFRTNmb29FdigKICAgLy8gVkFSUzogICAgICAgIEBfWlRWTjV0ZW1wMTFCSU5TXzFBRUVFID0gd2Vha19vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAgIC8vIFZBUlM6ICAgICAgICBAX1pUU041dGVtcDExQklOU18xQUVFRSA9IHdlYWtfb2RyIGNvbnN0YW50Ci0gIC8vIFZBUlM6ICAgICAgICBAX1pUSU41dGVtcDExQklOU18xQUVFRSA9IHdlYWtfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBWQVJTOiAgICAgICAgQF9aVElONXRlbXAxMUJJTlNfMUFFRUUgPSB3ZWFrX29kciBjb25zdGFudAogICAvLyBGVU5TLUhJRERFTi1MQUJFTDogZGVmaW5lIHdlYWtfb2RyIGhpZGRlbiB2b2lkIEBfWk41dGVtcDExQklOU18xQUVFM2Zvb0V2KAogICAvLyBWQVJTLUhJRERFTjogQF9aVFZONXRlbXAxMUJJTlNfMUFFRUUgPSB3ZWFrX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKICAgLy8gVkFSUy1ISURERU46IEBfWlRTTjV0ZW1wMTFCSU5TXzFBRUVFID0gd2Vha19vZHIgY29uc3RhbnQKLSAgLy8gVkFSUy1ISURERU46IEBfWlRJTjV0ZW1wMTFCSU5TXzFBRUVFID0gd2Vha19vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisgIC8vIFZBUlMtSElEREVOOiBAX1pUSU41dGVtcDExQklOU18xQUVFRSA9IHdlYWtfb2RyIGNvbnN0YW50CiB9CiAKIG5hbWVzcGFjZSB0ZW1wMiB7CkBAIC02MywxMSArNjMsMTEgQEAKICAgLy8gRlVOUy1MQUJFTDogICAgICAgIGRlZmluZSB3ZWFrX29kciB2b2lkIEBfWk41dGVtcDIxQklOU18xQUVFM2Zvb0V2KAogICAvLyBWQVJTOiAgICAgICAgQF9aVFZONXRlbXAyMUJJTlNfMUFFRUUgPSB3ZWFrX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKICAgLy8gVkFSUzogICAgICAgIEBfWlRTTjV0ZW1wMjFCSU5TXzFBRUVFID0gd2Vha19vZHIgY29uc3RhbnQKLSAgLy8gVkFSUzogICAgICAgIEBfWlRJTjV0ZW1wMjFCSU5TXzFBRUVFID0gd2Vha19vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisgIC8vIFZBUlM6ICAgICAgICBAX1pUSU41dGVtcDIxQklOU18xQUVFRSA9IHdlYWtfb2RyIGNvbnN0YW50CiAgIC8vIEZVTlMtSElEREVOLUxBQkVMOiBkZWZpbmUgd2Vha19vZHIgaGlkZGVuIHZvaWQgQF9aTjV0ZW1wMjFCSU5TXzFBRUUzZm9vRXYoCiAgIC8vIFZBUlMtSElEREVOOiBAX1pUVk41dGVtcDIxQklOU18xQUVFRSA9IHdlYWtfb2RyIGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKICAgLy8gVkFSUy1ISURERU46IEBfWlRTTjV0ZW1wMjFCSU5TXzFBRUVFID0gd2Vha19vZHIgaGlkZGVuIGNvbnN0YW50Ci0gIC8vIFZBUlMtSElEREVOOiBAX1pUSU41dGVtcDIxQklOU18xQUVFRSA9IHdlYWtfb2RyIGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKyAgLy8gVkFSUy1ISURERU46IEBfWlRJTjV0ZW1wMjFCSU5TXzFBRUVFID0gd2Vha19vZHIgaGlkZGVuIGNvbnN0YW50CiB9CiAKIG5hbWVzcGFjZSB0ZW1wMyB7CkBAIC04MCwxMSArODAsMTEgQEAKICAgLy8gRlVOUy1MQUJFTDogICAgICAgIGRlZmluZSB3ZWFrX29kciBoaWRkZW4gdm9pZCBAX1pONXRlbXAzMUJJTlNfMUFFRTNmb29FdigKICAgLy8gVkFSUzogICAgICAgIEBfWlRWTjV0ZW1wMzFCSU5TXzFBRUVFID0gd2Vha19vZHIgaGlkZGVuIHVubmFtZWRfYWRkciBjb25zdGFudAogICAvLyBWQVJTOiAgICAgICAgQF9aVFNONXRlbXAzMUJJTlNfMUFFRUUgPSB3ZWFrX29kciBoaWRkZW4gY29uc3RhbnQKLSAgLy8gVkFSUzogICAgICAgIEBfWlRJTjV0ZW1wMzFCSU5TXzFBRUVFID0gd2Vha19vZHIgaGlkZGVuIHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBWQVJTOiAgICAgICAgQF9aVElONXRlbXAzMUJJTlNfMUFFRUUgPSB3ZWFrX29kciBoaWRkZW4gY29uc3RhbnQKICAgLy8gRlVOUy1ISURERU4tTEFCRUw6IGRlZmluZSB3ZWFrX29kciBoaWRkZW4gdm9pZCBAX1pONXRlbXAzMUJJTlNfMUFFRTNmb29FdigKICAgLy8gVkFSUy1ISURERU46IEBfWlRWTjV0ZW1wMzFCSU5TXzFBRUVFID0gd2Vha19vZHIgaGlkZGVuIHVubmFtZWRfYWRkciBjb25zdGFudAogICAvLyBWQVJTLUhJRERFTjogQF9aVFNONXRlbXAzMUJJTlNfMUFFRUUgPSB3ZWFrX29kciBoaWRkZW4gY29uc3RhbnQKLSAgLy8gVkFSUy1ISURERU46IEBfWlRJTjV0ZW1wMzFCSU5TXzFBRUVFID0gd2Vha19vZHIgaGlkZGVuIHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBWQVJTLUhJRERFTjogQF9aVElONXRlbXAzMUJJTlNfMUFFRUUgPSB3ZWFrX29kciBoaWRkZW4gY29uc3RhbnQKIH0KIAogbmFtZXNwYWNlIHRlbXA0IHsKQEAgLTk3LDExICs5NywxMSBAQAogICAvLyBGVU5TLUxBQkVMOiAgICAgICAgZGVmaW5lIHdlYWtfb2RyIHZvaWQgQF9aTjV0ZW1wNDFCSU5TXzFBRUUzZm9vRXYoCiAgIC8vIFZBUlM6ICAgICAgICBAX1pUVk41dGVtcDQxQklOU18xQUVFRSA9IHdlYWtfb2RyIGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKICAgLy8gVkFSUzogICAgICAgIEBfWlRTTjV0ZW1wNDFCSU5TXzFBRUVFID0gd2Vha19vZHIgaGlkZGVuIGNvbnN0YW50Ci0gIC8vIFZBUlM6ICAgICAgICBAX1pUSU41dGVtcDQxQklOU18xQUVFRSA9IHdlYWtfb2RyIGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKyAgLy8gVkFSUzogICAgICAgIEBfWlRJTjV0ZW1wNDFCSU5TXzFBRUVFID0gd2Vha19vZHIgaGlkZGVuIGNvbnN0YW50CiAgIC8vIEZVTlMtSElEREVOLUxBQkVMOiBkZWZpbmUgd2Vha19vZHIgaGlkZGVuIHZvaWQgQF9aTjV0ZW1wNDFCSU5TXzFBRUUzZm9vRXYoCiAgIC8vIFZBUlMtSElEREVOOiBAX1pUVk41dGVtcDQxQklOU18xQUVFRSA9IHdlYWtfb2RyIGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKICAgLy8gVkFSUy1ISURERU46IEBfWlRTTjV0ZW1wNDFCSU5TXzFBRUVFID0gd2Vha19vZHIgaGlkZGVuIGNvbnN0YW50Ci0gIC8vIFZBUlMtSElEREVOOiBAX1pUSU41dGVtcDQxQklOU18xQUVFRSA9IHdlYWtfb2RyIGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKyAgLy8gVkFSUy1ISURERU46IEBfWlRJTjV0ZW1wNDFCSU5TXzFBRUVFID0gd2Vha19vZHIgaGlkZGVuIGNvbnN0YW50CiB9CiAKIG5hbWVzcGFjZSB0eXBlMCB7CkBAIC0xMTMsMTEgKzExMywxMSBAQAogICAvLyBGVU5TLUxBQkVMOiAgICAgICAgZGVmaW5lIHZvaWQgQF9aTjV0eXBlMDFBM2Zvb0V2KAogICAvLyBWQVJTOiAgICAgICAgQF9aVFZONXR5cGUwMUFFID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAgIC8vIFZBUlM6ICAgICAgICBAX1pUU041dHlwZTAxQUUgPSBjb25zdGFudAotICAvLyBWQVJTOiAgICAgICAgQF9aVElONXR5cGUwMUFFID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50CisgIC8vIFZBUlM6ICAgICAgICBAX1pUSU41dHlwZTAxQUUgPSBjb25zdGFudAogICAvLyBGVU5TLUhJRERFTi1MQUJFTDogZGVmaW5lIGhpZGRlbiB2b2lkIEBfWk41dHlwZTAxQTNmb29FdigKICAgLy8gVkFSUy1ISURERU46IEBfWlRWTjV0eXBlMDFBRSA9IHVubmFtZWRfYWRkciBjb25zdGFudAogICAvLyBWQVJTLUhJRERFTjogQF9aVFNONXR5cGUwMUFFID0gY29uc3RhbnQKLSAgLy8gVkFSUy1ISURERU46IEBfWlRJTjV0eXBlMDFBRSA9IHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBWQVJTLUhJRERFTjogQF9aVElONXR5cGUwMUFFID0gY29uc3RhbnQKIH0KIAogbmFtZXNwYWNlIHR5cGUxIHsKQEAgLTEyOSwxMSArMTI5LDExIEBACiAgIC8vIEZVTlMtTEFCRUw6ICAgICAgICBkZWZpbmUgaGlkZGVuIHZvaWQgQF9aTjV0eXBlMTFBM2Zvb0V2KAogICAvLyBWQVJTOiAgICAgICAgQF9aVFZONXR5cGUxMUFFID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAgIC8vIFZBUlM6ICAgICAgICBAX1pUU041dHlwZTExQUUgPSBjb25zdGFudAotICAvLyBWQVJTOiAgICAgICAgQF9aVElONXR5cGUxMUFFID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50CisgIC8vIFZBUlM6ICAgICAgICBAX1pUSU41dHlwZTExQUUgPSBjb25zdGFudAogICAvLyBGVU5TLUhJRERFTi1MQUJFTDogZGVmaW5lIGhpZGRlbiB2b2lkIEBfWk41dHlwZTExQTNmb29FdigKICAgLy8gVkFSUy1ISURERU46IEBfWlRWTjV0eXBlMTFBRSA9IHVubmFtZWRfYWRkciBjb25zdGFudAogICAvLyBWQVJTLUhJRERFTjogQF9aVFNONXR5cGUxMUFFID0gY29uc3RhbnQKLSAgLy8gVkFSUy1ISURERU46IEBfWlRJTjV0eXBlMTFBRSA9IHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBWQVJTLUhJRERFTjogQF9aVElONXR5cGUxMUFFID0gY29uc3RhbnQKIH0KIAogbmFtZXNwYWNlIHR5cGUyIHsKQEAgLTE0NSwxMSArMTQ1LDExIEBACiAgIC8vIEZVTlMtTEFCRUw6ICAgICAgICBkZWZpbmUgdm9pZCBAX1pONXR5cGUyMUEzZm9vRXYoCiAgIC8vIFZBUlM6ICAgICAgICBAX1pUVk41dHlwZTIxQUUgPSBoaWRkZW4gdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAgIC8vIFZBUlM6ICAgICAgICBAX1pUU041dHlwZTIxQUUgPSBoaWRkZW4gY29uc3RhbnQKLSAgLy8gVkFSUzogICAgICAgIEBfWlRJTjV0eXBlMjFBRSA9IGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKyAgLy8gVkFSUzogICAgICAgIEBfWlRJTjV0eXBlMjFBRSA9IGhpZGRlbiBjb25zdGFudAogICAvLyBGVU5TLUhJRERFTi1MQUJFTDogZGVmaW5lIGhpZGRlbiB2b2lkIEBfWk41dHlwZTIxQTNmb29FdigKICAgLy8gVkFSUy1ISURERU46IEBfWlRWTjV0eXBlMjFBRSA9IGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKICAgLy8gVkFSUy1ISURERU46IEBfWlRTTjV0eXBlMjFBRSA9IGhpZGRlbiBjb25zdGFudAotICAvLyBWQVJTLUhJRERFTjogQF9aVElONXR5cGUyMUFFID0gaGlkZGVuIHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBWQVJTLUhJRERFTjogQF9aVElONXR5cGUyMUFFID0gaGlkZGVuIGNvbnN0YW50CiB9CiAKIG5hbWVzcGFjZSB0eXBlMyB7CkBAIC0xNjEsMTAgKzE2MSwxMCBAQAogICAvLyBGVU5TLUxBQkVMOiAgICAgICAgZGVmaW5lIHZvaWQgQF9aTjV0eXBlMzFBM2Zvb0V2KAogICAvLyBWQVJTOiAgICAgICAgQF9aVFZONXR5cGUzMUFFID0gaGlkZGVuIHVubmFtZWRfYWRkciBjb25zdGFudAogICAvLyBWQVJTOiAgICAgICAgQF9aVFNONXR5cGUzMUFFID0gaGlkZGVuIGNvbnN0YW50Ci0gIC8vIFZBUlM6ICAgICAgICBAX1pUSU41dHlwZTMxQUUgPSBoaWRkZW4gdW5uYW1lZF9hZGRyIGNvbnN0YW50CisgIC8vIFZBUlM6ICAgICAgICBAX1pUSU41dHlwZTMxQUUgPSBoaWRkZW4gY29uc3RhbnQKICAgLy8gRlVOUy1ISURERU4tTEFCRUw6IGRlZmluZSB2b2lkIEBfWk41dHlwZTMxQTNmb29FdigKICAgLy8gVkFSUy1ISURERU46IEBfWlRWTjV0eXBlMzFBRSA9IGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKICAgLy8gVkFSUy1ISURERU46IEBfWlRTTjV0eXBlMzFBRSA9IGhpZGRlbiBjb25zdGFudAotICAvLyBWQVJTLUhJRERFTjogQF9aVElONXR5cGUzMUFFID0gaGlkZGVuIHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBWQVJTLUhJRERFTjogQF9aVElONXR5cGUzMUFFID0gaGlkZGVuIGNvbnN0YW50CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC91bmFyeS10eXBlLXRyYWl0LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC91bmFyeS10eXBlLXRyYWl0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2ZjljMC4uMDAwMDAwMAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdW5hcnktdHlwZS10cmFpdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtLW9ubHkgLXZlcmlmeSAlcwotLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKLQotYm9vbCBhKCkgeyByZXR1cm4gX19pc19wb2QoaW50KTsgfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3ZhcmFyZy1ub24tcG9kLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC92YXJhcmctbm9uLXBvZC5jcHAKaW5kZXggOTQ5NzE3OS4uNjEzYjI4YyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3ZhcmFyZy1ub24tcG9kLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdmFyYXJnLW5vbi1wb2QuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1Xbm8tZXJyb3I9bm9uLXBvZC12YXJhcmdzIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1Xbm8tZXJyb3I9bm9uLXBvZC12YXJhcmdzIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIAogc3RydWN0IFggewogICBYKCk7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvdmlydC1kdG9yLWdlbi5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdmlydC1kdG9yLWdlbi5jcHAKaW5kZXggNzhhMGI4MS4uYmE4MzY4OSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3ZpcnQtZHRvci1nZW4uY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC92aXJ0LWR0b3ItZ2VuLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtbyAtIC1lbWl0LWxsdm0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtbyAtIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCiAvLyBQUjU0ODMKIAogLy8gTWFrZSBzdXJlIHdlIGdlbmVyYXRlIGFsbCB0aHJlZSBmb3JtcyBvZiB0aGUgZGVzdHJ1Y3RvciB3aGVuIGl0IGlzIHZpcnR1YWwuCkBAIC03LDQgKzcsNCBAQAogfTsKIEZvbzo6fkZvbygpIHt9CiAKLS8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOM0Zvb0QwRXYoJWNsYXNzLkZvbyogJXRoaXMpIHVubmFtZWRfYWRkcgorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB7ey4qfX12b2lkIEBfWk4zRm9vRDBFdiglY2xhc3MuRm9vKiAldGhpcykgdW5uYW1lZF9hZGRyCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvdmlydC1kdG9yLWtleS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdmlydC1kdG9yLWtleS5jcHAKaW5kZXggYThmYTM3MS4uNDBjNWE1MyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3ZpcnQtZHRvci1rZXkuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC92aXJ0LWR0b3Ita2V5LmNwcApAQCAtMSw1ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKLS8vIENIRUNLOiBAX1pUSTNmb28gPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBDSEVDSzogQF9aVEkzZm9vID0gY29uc3RhbnQKIGNsYXNzIGZvbyB7CiAgICBmb28oKTsKICAgIHZpcnR1YWwgfmZvbygpOwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3ZpcnQtdGVtcGxhdGUtdnRhYmxlLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC92aXJ0LXRlbXBsYXRlLXZ0YWJsZS5jcHAKaW5kZXggYTYwNjdkNi4uYTcxZGI0OCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3ZpcnQtdGVtcGxhdGUtdnRhYmxlLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdmlydC10ZW1wbGF0ZS12dGFibGUuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgQSB7CiBwdWJsaWM6CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvdmlydHVhbC1iYXNlLWNhc3QuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtYmFzZS1jYXN0LmNwcAppbmRleCA0MGU2OGY2Li42YTQ4OTRiIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdmlydHVhbC1iYXNlLWNhc3QuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWJhc2UtY2FzdC5jcHAKQEAgLTEsNSArMSw1IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGUgaTY4Ni1wYy1saW51eC1nbnUgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtY3h4LWFiaSBtaWNyb3NvZnQgLWVtaXQtbGx2bSAlcyAtbyAtIC10cmlwbGUgaTY4Ni1wYy13aW4zMiB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IE1TVkMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0gLXRyaXBsZSBpNjg2LXBjLXdpbjMyIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggTVNWQyAlcwogCiBzdHJ1Y3QgQSB7IGludCBhOyB2aXJ0dWFsIGludCBhYSgpOyB9Owogc3RydWN0IEIgeyBpbnQgYjsgdmlydHVhbCBpbnQgYmIoKTsgfTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWJhc2UtY3Rvci5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdmlydHVhbC1iYXNlLWN0b3IuY3BwCmluZGV4IDJkODFlYmQuLjhjMjg5NjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWJhc2UtY3Rvci5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtYmFzZS1jdG9yLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC1vIC0gLU8yIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW8gLSAtTzIgfCBGaWxlQ2hlY2sgJXMKIAogc3RydWN0IEI7CiBleHRlcm4gQiB4OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtYmFzZS1kZXN0cnVjdG9yLWNhbGwuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtYmFzZS1kZXN0cnVjdG9yLWNhbGwuY3BwCmluZGV4IDUwMTRlYWYuLjNkNzkwNzEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWJhc2UtZGVzdHJ1Y3Rvci1jYWxsLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdmlydHVhbC1iYXNlLWRlc3RydWN0b3ItY2FsbC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcwogCiBzdHJ1Y3QgYmFzaWNfaW9ze35iYXNpY19pb3MoKTsgfTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtYmFzZXMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtYmFzZXMuY3BwCmluZGV4IDI4NzhlOTUuLmU5YzU2OGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWJhc2VzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdmlydHVhbC1iYXNlcy5jcHAKQEAgLTEyLDE2ICsxMiwxNiBAQAogICBCKCk7CiB9OwogCi0vLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFCQzFFdiglc3RydWN0LkIqICV0aGlzKSB1bm5hbWVkX2FkZHIKIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUJDMkV2KCVzdHJ1Y3QuQiogJXRoaXMsIGk4KiogJXZ0dCkgdW5uYW1lZF9hZGRyCisvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFCQzFFdiglc3RydWN0LkIqICV0aGlzKSB1bm5hbWVkX2FkZHIKIEI6OkIoKSB7IH0KIAogc3RydWN0IEMgOiB2aXJ0dWFsIEEgewogICBDKGJvb2wpOwogfTsKIAotLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQ0MxRWIoJXN0cnVjdC5DKiAldGhpcywgaTEgemVyb2V4dCkgdW5uYW1lZF9hZGRyCiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aTjFDQzJFYiglc3RydWN0LkMqICV0aGlzLCBpOCoqICV2dHQsIGkxIHplcm9leHQpIHVubmFtZWRfYWRkcgorLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQ0MxRWIoJXN0cnVjdC5DKiAldGhpcywgaTEgemVyb2V4dCkgdW5uYW1lZF9hZGRyCiBDOjpDKGJvb2wpIHsgfQogCiAvLyBQUjYyNTEKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWRlc3RydWN0b3ItY2FsbHMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtZGVzdHJ1Y3Rvci1jYWxscy5jcHAKaW5kZXggYWUzNzA0Zi4uM2U3ZmE4MiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtZGVzdHJ1Y3Rvci1jYWxscy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtZGVzdHJ1Y3Rvci1jYWxscy5jcHAKQEAgLTIwLDE2ICsyMCwxNiBAQAogLy8gQ0hFQ0s6IEBfWk4xQ0QxRXYgPSBhbGlhcyB7ey4qfX0gQF9aTjFDRDJFdgogLy8gQ0hFQ0s6IEBfWk4xQ0QyRXYgPSBhbGlhcyBiaXRjYXN0IHt7Lip9fSBAX1pOMUJEMkV2CiAKLS8vIERlbGV0aW5nIGR0b3I6IGRlZmVycyB0byB0aGUgY29tcGxldGUgZHRvci4KLS8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUJEMEV2KCVzdHJ1Y3QuQiogJXRoaXMpIHVubmFtZWRfYWRkcgotLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMUJEMUV2Ci0vLyBDSEVDSzogY2FsbCB2b2lkIEBfWmRsUHYKLQogLy8gQmFzZSBkdG9yOiBhY3R1YWxseSBjYWxscyBBJ3MgYmFzZSBkdG9yLgogLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWk4xQkQyRXYoJXN0cnVjdC5CKiAldGhpcykgdW5uYW1lZF9hZGRyCiAvLyBDSEVDSzogY2FsbCB2b2lkIEBfWk42TWVtYmVyRDFFdgogLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMUFEMkV2CiAKKy8vIERlbGV0aW5nIGR0b3I6IGRlZmVycyB0byB0aGUgY29tcGxldGUgZHRvci4KKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAX1pOMUJEMEV2KCVzdHJ1Y3QuQiogJXRoaXMpIHVubmFtZWRfYWRkcgorLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAX1pOMUJEMUV2CisvLyBDSEVDSzogY2FsbCB2b2lkIEBfWmRsUHYKKwogQjo6fkIoKSB7IH0KIAogc3RydWN0IEMgOiBCIHsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWRlc3RydWN0b3Itc3ludGhlc2lzLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWRlc3RydWN0b3Itc3ludGhlc2lzLmNwcAppbmRleCA5MGY2NmE4Li44MGQxYjFlIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdmlydHVhbC1kZXN0cnVjdG9yLXN5bnRoZXNpcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtZGVzdHJ1Y3Rvci1zeW50aGVzaXMuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogc3RydWN0IGJveCB7CiAgIHZpcnR1YWwgfmJveCgpOwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtZnVuY3Rpb24tY2FsbHMuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtZnVuY3Rpb24tY2FsbHMuY3BwCmluZGV4IGUxYjM4MGYuLjBhNmZjNmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWZ1bmN0aW9uLWNhbGxzLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdmlydHVhbC1mdW5jdGlvbi1jYWxscy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLXN0ZD1jKysxMSAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLXN0ZD1jKysxMSAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gUFI1MDIxCiBuYW1lc3BhY2UgUFI1MDIxIHsKQEAgLTgsNyArOCw3IEBACiB9OwogCiB2b2lkIGYoQSAqYSkgewotICAvLyBDSEVDSzogY2FsbCB2b2lkICUKKyAgLy8gQ0hFQ0s6IGNhbGwge3suKn19dm9pZCAlCiAgIGEtPmYoJ2MnKTsKIH0KIApAQCAtNDUsNyArNDUsNyBAQAogICAvLyBDSEVDSzogQF9aTjE1VmlydHVhbE5vcmV0dXJuMWYKICAgdm9pZCBmKEEgKnApIHsKICAgICBwLT5mKCk7Ci0gICAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCAle3tbXiNdKiR9fQorICAgIC8vIENIRUNLOiBjYWxsIHt7Lip9fXZvaWQgJXt7W14jXSokfX0KICAgICAvLyBDSEVDSy1OT1Q6IHVucmVhY2hhYmxlCiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWltcGxpY2l0LWNvcHktYXNzaWdubWVudC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdmlydHVhbC1pbXBsaWNpdC1jb3B5LWFzc2lnbm1lbnQuY3BwCmluZGV4IDcwYmM2ZmMuLjAzMTA0NjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWltcGxpY2l0LWNvcHktYXNzaWdubWVudC5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtaW1wbGljaXQtY29weS1hc3NpZ25tZW50LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIHN0cnVjdCBEOwogc3RydWN0IEIgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtaW1wbGljaXQtbW92ZS1hc3NpZ25tZW50LmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWltcGxpY2l0LW1vdmUtYXNzaWdubWVudC5jcHAKaW5kZXggZDhhYzFlZC4uN2MyOGZiMSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtaW1wbGljaXQtbW92ZS1hc3NpZ25tZW50LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdmlydHVhbC1pbXBsaWNpdC1tb3ZlLWFzc2lnbm1lbnQuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXN0ZD1jKysxMSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLXN0ZD1jKysxMSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAKIHN0cnVjdCBEOwogc3RydWN0IEIgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtaW5oZXJpdGVkLWRlc3RydWN0b3IuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3ZpcnR1YWwtaW5oZXJpdGVkLWRlc3RydWN0b3IuY3BwCmluZGV4IDUwOWQ0MGEuLjNjYTdiNmQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLWluaGVyaXRlZC1kZXN0cnVjdG9yLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdmlydHVhbC1pbmhlcml0ZWQtZGVzdHJ1Y3Rvci5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtbGx2bS1vbmx5CisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0tb25seQogCiBzdHJ1Y3QgQSB7IHZpcnR1YWwgfkEoKTsgfTsKIHN0cnVjdCBCIDogQSB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvdmlydHVhbC1wc2V1ZG8tZGVzdHJ1Y3Rvci1jYWxsLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLXBzZXVkby1kZXN0cnVjdG9yLWNhbGwuY3BwCmluZGV4IDBkMzU3NGUuLmIxNGEzNGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLXBzZXVkby1kZXN0cnVjdG9yLWNhbGwuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC92aXJ0dWFsLXBzZXVkby1kZXN0cnVjdG9yLWNhbGwuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogc3RydWN0IEEgewogICB2aXJ0dWFsIH5BKCk7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvdmlzaWJpbGl0eS1oaWRkZW4tZXh0ZXJuLXRlbXBsYXRlcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdmlzaWJpbGl0eS1oaWRkZW4tZXh0ZXJuLXRlbXBsYXRlcy5jcHAKaW5kZXggNTQ5ZTY3NC4uOTVlOGUwOCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3Zpc2liaWxpdHktaGlkZGVuLWV4dGVybi10ZW1wbGF0ZXMuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC92aXNpYmlsaXR5LWhpZGRlbi1leHRlcm4tdGVtcGxhdGVzLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtTzEgLWVtaXQtbGx2bSAtbyAtIC1mdmlzaWJpbGl0eSBoaWRkZW4gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtTzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAtZnZpc2liaWxpdHkgaGlkZGVuICVzIHwgRmlsZUNoZWNrICVzCiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBzdHJ1Y3QgWCB7CkBAIC0xNCwxMyArMTQsMTMgQEAKIAogLy8gPHJkYXI6Ly9wcm9ibGVtLzgxMDk3NjM+CiB2b2lkIHRlc3RfWChYPGludD4geGksIFg8Y2hhcj4geGMpIHsKLSAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB3ZWFrX29kciBoaWRkZW4gdm9pZCBAX1pOMVhJaUUxZkV2CisgIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgd2Vha19vZHIgaGlkZGVuIHt7Lip9fXZvaWQgQF9aTjFYSWlFMWZFdgogICB4aS5mKCk7Ci0gIC8vIENIRUNLLUxBQkVMOiBkZWZpbmUgd2Vha19vZHIgaGlkZGVuIHZvaWQgQF9aTjFYSWlFMWdFdgorICAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHdlYWtfb2RyIGhpZGRlbiB7ey4qfX12b2lkIEBfWk4xWElpRTFnRXYKICAgeGkuZygpOwotICAvLyBDSEVDSzogZGVjbGFyZSB2b2lkIEBfWk4xWEljRTFmRXYKKyAgLy8gQ0hFQ0s6IGRlY2xhcmUge3suKn19dm9pZCBAX1pOMVhJY0UxZkV2CiAgIHhjLmYoKTsKLSAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBhdmFpbGFibGVfZXh0ZXJuYWxseSB2b2lkIEBfWk4xWEljRTFnRXYKKyAgLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSBhdmFpbGFibGVfZXh0ZXJuYWxseSB7ey4qfX12b2lkIEBfWk4xWEljRTFnRXYKICAgeGMuZygpOwogfQogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvdmlzaWJpbGl0eS1tcy1jb21wYXQuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3Zpc2liaWxpdHktbXMtY29tcGF0LmNwcAppbmRleCAyNTQ0NmNkLi45NjNiMmE0IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdmlzaWJpbGl0eS1tcy1jb21wYXQuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC92aXNpYmlsaXR5LW1zLWNvbXBhdC5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIAogICBjb25zdCBzdGQ6OnR5cGVfaW5mbyAmdGkgPSB0eXBlaWQoQSk7CiAgIC8vIENIRUNLLUdMT0JBTDogQF9aVFNONXRlc3QwMUFFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0gIC8vIENIRUNLLUdMT0JBTDogQF9aVElONXRlc3QwMUFFID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBDSEVDSy1HTE9CQUw6IEBfWlRJTjV0ZXN0MDFBRSA9IGxpbmtvbmNlX29kciBjb25zdGFudAogICAvLyBDSEVDSy1HTE9CQUw6IEBfWk41dGVzdDAydGlFID0gaGlkZGVuIGNvbnN0YW50CiB9CiAKQEAgLTQzLDcgKzQzLDcgQEAKIAogICBjb25zdCBzdGQ6OnR5cGVfaW5mbyAmdGkgPSB0eXBlaWQoQSk7CiAgIC8vIENIRUNLLUdMT0JBTDogQF9aVFNONXRlc3QxMUFFID0gbGlua29uY2Vfb2RyIGhpZGRlbiBjb25zdGFudAotICAvLyBDSEVDSy1HTE9CQUw6IEBfWlRJTjV0ZXN0MTFBRSA9IGxpbmtvbmNlX29kciBoaWRkZW4gdW5uYW1lZF9hZGRyIGNvbnN0YW50CisgIC8vIENIRUNLLUdMT0JBTDogQF9aVElONXRlc3QxMUFFID0gbGlua29uY2Vfb2RyIGhpZGRlbiBjb25zdGFudAogICAvLyBDSEVDSy1HTE9CQUw6IEBfWk41dGVzdDEydGlFID0gaGlkZGVuIGNvbnN0YW50CiB9CiAKQEAgLTU5LDcgKzU5LDcgQEAKIAogICBjb25zdCBzdGQ6OnR5cGVfaW5mbyAmdGkgPSB0eXBlaWQoQSk7CiAgIC8vIENIRUNLLUdMT0JBTDogQF9aVFNONXRlc3QyMUFFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0gIC8vIENIRUNLLUdMT0JBTDogQF9aVElONXRlc3QyMUFFID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBDSEVDSy1HTE9CQUw6IEBfWlRJTjV0ZXN0MjFBRSA9IGxpbmtvbmNlX29kciBjb25zdGFudAogICAvLyBDSEVDSy1HTE9CQUw6IEBfWk41dGVzdDIydGlFID0gaGlkZGVuIGNvbnN0YW50CiB9CiAKQEAgLTc2LDcgKzc2LDcgQEAKIAogICBjb25zdCBzdGQ6OnR5cGVfaW5mbyAmdGkgPSB0eXBlaWQoQjxBPik7CiAgIC8vIENIRUNLLUdMT0JBTDogQF9aVFNONXRlc3QzMUJJTlNfMUFFRUUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKLSAgLy8gQ0hFQ0stR0xPQkFMOiBAX1pUSU41dGVzdDMxQklOU18xQUVFRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKyAgLy8gQ0hFQ0stR0xPQkFMOiBAX1pUSU41dGVzdDMxQklOU18xQUVFRSA9IGxpbmtvbmNlX29kciBjb25zdGFudAogfQogCiBuYW1lc3BhY2UgdGVzdDQgewpAQCAtOTIsNyArOTIsNyBAQAogCiAgIGNvbnN0IHN0ZDo6dHlwZV9pbmZvICZ0aSA9IHR5cGVpZChCPEE+KTsKICAgLy8gQ0hFQ0stR0xPQkFMOiBAX1pUU041dGVzdDQxQklOU18xQUVFRSA9IGxpbmtvbmNlX29kciBjb25zdGFudAotICAvLyBDSEVDSy1HTE9CQUw6IEBfWlRJTjV0ZXN0NDFCSU5TXzFBRUVFID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBDSEVDSy1HTE9CQUw6IEBfWlRJTjV0ZXN0NDFCSU5TXzFBRUVFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CiB9CiAKIG5hbWVzcGFjZSB0ZXN0NSB7CkBAIC0xMDgsNSArMTA4LDUgQEAKIAogICBjb25zdCBzdGQ6OnR5cGVfaW5mbyAmdGkgPSB0eXBlaWQoQjxBPik7CiAgIC8vIENIRUNLLUdMT0JBTDogQF9aVFNONXRlc3Q1MUJJTlNfMUFFRUUgPSBsaW5rb25jZV9vZHIgaGlkZGVuIGNvbnN0YW50Ci0gIC8vIENIRUNLLUdMT0JBTDogQF9aVElONXRlc3Q1MUJJTlNfMUFFRUUgPSBsaW5rb25jZV9vZHIgaGlkZGVuIHVubmFtZWRfYWRkciBjb25zdGFudAorICAvLyBDSEVDSy1HTE9CQUw6IEBfWlRJTjV0ZXN0NTFCSU5TXzFBRUVFID0gbGlua29uY2Vfb2RyIGhpZGRlbiBjb25zdGFudAogfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3ZvbGF0aWxlLTEuY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3ZvbGF0aWxlLTEuY3BwCmluZGV4IDcxZmYxZWQuLjIwMzg5MzYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC92b2xhdGlsZS0xLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdm9sYXRpbGUtMS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLVduby11bnVzZWQtdmFsdWUgLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLVduby11bnVzZWQtdmFsdWUgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSzogQGkgPSBnbG9iYWwgW1tJTlQ6aVswLTldK11dIDAKIHZvbGF0aWxlIGludCBpLCBqLCBrOwpAQCAtMjQ4LDExICsyNDgsMTEgQEAKICAgLy8gZ2NjLgogCiAgIC8vIE5vdCBhIHVzZS4gIGdjYyBmb3JnZXRzIHRvIGRvIHRoZSBhc3NpZ25tZW50LgotICAvLyBDSEVDSy1ORVhUOiBjYWxsCisgIC8vIENIRUNLLU5FWFQ6IGNhbGwge3suKn19dm9pZAogICAoKGE9YSksYSk7CiAKICAgLy8gTm90IGEgdXNlLiAgZ2NjIGdldHMgdGhpcyB3cm9uZywgaXQgZG9lc24ndCBlbWl0IHRoZSBjb3B5ISAgCi0gIC8vIENIRUNLLU5FWFQ6IGNhbGwKKyAgLy8gQ0hFQ0stTkVYVDogY2FsbCB7ey4qfX12b2lkCiAgICh2b2lkKShhPWEpOwogCiAgIC8vIE5vdCBhIHVzZS4gIGdjYyBnb3QgdGhpcyB3cm9uZyBpbiA0LjIgYW5kIG9taXR0ZWQgdGhlIHNpZGUgZWZmZWN0cwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3Z0YWJsZS1hdmFpbGFibGUtZXh0ZXJuYWxseS5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdnRhYmxlLWF2YWlsYWJsZS1leHRlcm5hbGx5LmNwcAppbmRleCAyODJiZDJhLi5lMDdkNDg0IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdnRhYmxlLWF2YWlsYWJsZS1leHRlcm5hbGx5LmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdnRhYmxlLWF2YWlsYWJsZS1leHRlcm5hbGx5LmNwcApAQCAtMzUsNyArMzUsNyBAQAogLy8gdXBkYXRlZCBjb3JyZWN0bHkuCiAKIC8vIENIRUNLLVRFU1QyOiBAX1pUU041VGVzdDIxQUUgPSBjb25zdGFudAotLy8gQ0hFQ0stVEVTVDI6IEBfWlRJTjVUZXN0MjFBRSA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0stVEVTVDI6IEBfWlRJTjVUZXN0MjFBRSA9IGNvbnN0YW50CiAvLyBDSEVDSy1URVNUMjogQF9aVFZONVRlc3QyMUFFID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50CiBuYW1lc3BhY2UgVGVzdDIgewogICBzdHJ1Y3QgQSB7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvdnRhYmxlLWNhc3QtY3Jhc2guY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3Z0YWJsZS1jYXN0LWNyYXNoLmNwcAppbmRleCBjYzQxOWZkLi41OGY5ZTBiIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdnRhYmxlLWNhc3QtY3Jhc2guY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC92dGFibGUtY2FzdC1jcmFzaC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bS1vbmx5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAlcwogc3RydWN0IEEKIHsKIEEoKTsgICAgCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvdnRhYmxlLWtleS1mdW5jdGlvbi1hcm0uY3BwIGIvdGVzdC9Db2RlR2VuQ1hYL3Z0YWJsZS1rZXktZnVuY3Rpb24tYXJtLmNwcAppbmRleCAwOGVmZThhLi42ZjEyNjViIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5DWFgvdnRhYmxlLWtleS1mdW5jdGlvbi1hcm0uY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC92dGFibGUta2V5LWZ1bmN0aW9uLWFybS5jcHAKQEAgLTQsNyArNCw3IEBACiAvLyBUaGUgJ2EnIHZhcmlhbnRzIGFzayBmb3IgdGhlIHYtdGFibGUgZmlyc3QuCiAvLyBUaGUgJ2InIHZhcmlhbnRzIGFzayBmb3IgdGhlIHYtdGFibGUgc2Vjb25kLgogLy8gVGhlICdjJyB2YXJpYW50cyBhc2sgZm9yIHRoZSB2LXRhYmxlIHRoaXJkLgotLy8gV2UgZG8gYSBzZXBhcmF0ZSBDSEVDSy1MQVRFIHBhc3MgYmVjYXVzZSB0aGUgUlRUSSBkZWZpbnRpb24gZ2V0cworLy8gV2UgZG8gYSBzZXBhcmF0ZSBDSEVDSy1MQVRFIHBhc3MgYmVjYXVzZSB0aGUgUlRUSSBkZWZpbml0aW9uIGdldHMKIC8vIGNoYW5nZWQgYWZ0ZXIgdGhlIGZhY3QsIHdoaWNoIGNhdXNlcyByZW9yZGVyaW5nIG9mIHRoZSBnbG9iYWxzLgogCiAvLyBUaGVzZSBhcmUgbm90IHNlcGFyYXRlZCBpbnRvIG5hbWVzcGFjZXMgYmVjYXVzZSB0aGUgd2F5IHRoYXQgU2VtYQpAQCAtOTEsNyArOTEsNyBAQAogVGVzdDJhOjpUZXN0MmEoKSB7IHVzZSh0eXBlaWQoVGVzdDJhKSk7IH0KIC8vIENIRUNLOiAgICAgIEBfWlRWNlRlc3QyYSA9IHVubmFtZWRfYWRkciBjb25zdGFudAogLy8gQ0hFQ0stTEFURTogQF9aVFM2VGVzdDJhID0gY29uc3RhbnQKLS8vIENIRUNLLUxBVEU6IEBfWlRJNlRlc3QyYSA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0stTEFURTogQF9aVEk2VGVzdDJhID0gY29uc3RhbnQKIAogLy8gJ2JhcicgYmVjb21lcyB0aGUga2V5IGZ1bmN0aW9uIHdoZW4gJ2ZvbycgaXMgZGVmaW5lZCBpbmxpbmUuCiB2b2lkIFRlc3QyYTo6YmFyKCkge30KQEAgLTExMiw3ICsxMTIsNyBAQAogVGVzdDJiOjpUZXN0MmIoKSB7IHVzZSh0eXBlaWQoVGVzdDJiKSk7IH0KIC8vIENIRUNLOiAgICAgIEBfWlRWNlRlc3QyYiA9IHVubmFtZWRfYWRkciBjb25zdGFudAogLy8gQ0hFQ0stTEFURTogQF9aVFM2VGVzdDJiID0gY29uc3RhbnQKLS8vIENIRUNLLUxBVEU6IEBfWlRJNlRlc3QyYiA9IHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0stTEFURTogQF9aVEk2VGVzdDJiID0gY29uc3RhbnQKIAogaW5saW5lIHZvaWQgVGVzdDJiOjpmb28oKSB7fQogCkBAIC0xMzIsNyArMTMyLDcgQEAKIFRlc3QyYzo6VGVzdDJjKCkgeyB1c2UodHlwZWlkKFRlc3QyYykpOyB9CiAvLyBDSEVDSzogQF9aVFY2VGVzdDJjID0gdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAvLyBDSEVDSzogQF9aVFM2VGVzdDJjID0gY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSTZUZXN0MmMgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSTZUZXN0MmMgPSBjb25zdGFudAogCiAvKioqIFRlc3QzYSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE0Niw3ICsxNDYsNyBAQAogVGVzdDNhOjpUZXN0M2EoKSB7IHVzZSh0eXBlaWQoVGVzdDNhKSk7IH0KIC8vIENIRUNLOiAgICAgIEBfWlRWNlRlc3QzYSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLLUxBVEU6IEBfWlRTNlRlc3QzYSA9IGxpbmtvbmNlX29kciBjb25zdGFudAotLy8gQ0hFQ0stTEFURTogQF9aVEk2VGVzdDNhID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0stTEFURTogQF9aVEk2VGVzdDNhID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CiAKIC8vIFRoZXJlIGNlYXNlcyB0byBiZSBhIGtleSBmdW5jdGlvbiBhZnRlciB0aGVzZSBkZWNsYXJhdGlvbnMuCiBpbmxpbmUgdm9pZCBUZXN0M2E6OmJhcigpIHt9CkBAIC0xNjcsNyArMTY3LDcgQEAKIFRlc3QzYjo6VGVzdDNiKCkgeyB1c2UodHlwZWlkKFRlc3QzYikpOyB9CiAvLyBDSEVDSzogICAgICBAX1pUVjZUZXN0M2IgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAvLyBDSEVDSy1MQVRFOiBAX1pUUzZUZXN0M2IgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKLS8vIENIRUNLLUxBVEU6IEBfWlRJNlRlc3QzYiA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLLUxBVEU6IEBfWlRJNlRlc3QzYiA9IGxpbmtvbmNlX29kciBjb25zdGFudAogCiBpbmxpbmUgdm9pZCBUZXN0M2I6OmZvbygpIHt9CiAKQEAgLTE4Nyw3ICsxODcsNyBAQAogVGVzdDNjOjpUZXN0M2MoKSB7IHVzZSh0eXBlaWQoVGVzdDNjKSk7IH0KIC8vIENIRUNLOiBAX1pUVjZUZXN0M2MgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAvLyBDSEVDSzogQF9aVFM2VGVzdDNjID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVEk2VGVzdDNjID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJNlRlc3QzYyA9IGxpbmtvbmNlX29kciBjb25zdGFudAogCiAvKioqIFRlc3Q0YSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTIwMSw3ICsyMDEsNyBAQAogdGVtcGxhdGUgPD4gVGVzdDRhPGludD46OlRlc3Q0YSgpIHsgdXNlKHR5cGVpZChUZXN0NGEpKTsgfQogLy8gQ0hFQ0s6IEBfWlRWNlRlc3Q0YUlpRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLOiBAX1pUUzZUZXN0NGFJaUUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSTZUZXN0NGFJaUUgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogQF9aVEk2VGVzdDRhSWlFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CiAKIC8vIFRoZXJlIGNlYXNlcyB0byBiZSBhIGtleSBmdW5jdGlvbiBhZnRlciB0aGVzZSBkZWNsYXJhdGlvbnMuCiB0ZW1wbGF0ZSA8PiBpbmxpbmUgdm9pZCBUZXN0NGE8aW50Pjo6YmFyKCkge30KQEAgLTIyMiw3ICsyMjIsNyBAQAogdGVtcGxhdGUgPD4gVGVzdDRiPGludD46OlRlc3Q0YigpIHsgdXNlKHR5cGVpZChUZXN0NGIpKTsgfQogLy8gQ0hFQ0s6IEBfWlRWNlRlc3Q0YklpRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLOiBAX1pUUzZUZXN0NGJJaUUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSTZUZXN0NGJJaUUgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogQF9aVEk2VGVzdDRiSWlFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CiAKIHRlbXBsYXRlIDw+IGlubGluZSB2b2lkIFRlc3Q0YjxpbnQ+Ojpmb28oKSB7fQogCkBAIC0yNDIsNyArMjQyLDcgQEAKIHRlbXBsYXRlIDw+IFRlc3Q0YzxpbnQ+OjpUZXN0NGMoKSB7IHVzZSh0eXBlaWQoVGVzdDRjKSk7IH0KIC8vIENIRUNLOiBAX1pUVjZUZXN0NGNJaUUgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAvLyBDSEVDSzogQF9aVFM2VGVzdDRjSWlFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVEk2VGVzdDRjSWlFID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJNlRlc3Q0Y0lpRSA9IGxpbmtvbmNlX29kciBjb25zdGFudAogCiAvKioqIFRlc3Q1YSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTI1OSw3ICsyNTksNyBAQAogdGVtcGxhdGUgPD4gVGVzdDVhPGludD46OlRlc3Q1YSgpIHsgdXNlKHR5cGVpZChUZXN0NWEpKTsgfQogLy8gQ0hFQ0s6IEBfWlRWNlRlc3Q1YUlpRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLOiBAX1pUUzZUZXN0NWFJaUUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSTZUZXN0NWFJaUUgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogQF9aVEk2VGVzdDVhSWlFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CiAKIC8vIFRoZXJlIGNlYXNlcyB0byBiZSBhIGtleSBmdW5jdGlvbiBhZnRlciB0aGVzZSBkZWNsYXJhdGlvbnMuCiB0ZW1wbGF0ZSA8PiBpbmxpbmUgdm9pZCBUZXN0NWE8aW50Pjo6YmFyKCkge30KQEAgLTI4MSw3ICsyODEsNyBAQAogdGVtcGxhdGUgPD4gVGVzdDViPGludD46OlRlc3Q1YigpIHsgdXNlKHR5cGVpZChUZXN0NWIpKTsgfQogLy8gQ0hFQ0s6IEBfWlRWNlRlc3Q1YklpRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLOiBAX1pUUzZUZXN0NWJJaUUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSTZUZXN0NWJJaUUgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogQF9aVEk2VGVzdDViSWlFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CiAKIHRlbXBsYXRlIDw+IGlubGluZSB2b2lkIFRlc3Q1YTxpbnQ+Ojpmb28oKTsKIHRlbXBsYXRlIDw+IGlubGluZSB2b2lkIFRlc3Q1YjxpbnQ+Ojpmb28oKSB7fQpAQCAtMzA0LDQgKzMwNCw0IEBACiB0ZW1wbGF0ZSA8PiBUZXN0NWM8aW50Pjo6VGVzdDVjKCkgeyB1c2UodHlwZWlkKFRlc3Q1YykpOyB9CiAvLyBDSEVDSzogQF9aVFY2VGVzdDVjSWlFID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAogLy8gQ0hFQ0s6IEBfWlRTNlRlc3Q1Y0lpRSA9IGxpbmtvbmNlX29kciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJNlRlc3Q1Y0lpRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSTZUZXN0NWNJaUUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC92dGFibGUta2V5LWZ1bmN0aW9uLWlvcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdnRhYmxlLWtleS1mdW5jdGlvbi1pb3MuY3BwCmluZGV4IGJjZDNlODguLmJmMmUxZjkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC92dGFibGUta2V5LWZ1bmN0aW9uLWlvcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3Z0YWJsZS1rZXktZnVuY3Rpb24taW9zLmNwcApAQCAtNCw3ICs0LDcgQEAKIC8vIFRoZSAnYScgdmFyaWFudHMgYXNrIGZvciB0aGUgdi10YWJsZSBmaXJzdC4KIC8vIFRoZSAnYicgdmFyaWFudHMgYXNrIGZvciB0aGUgdi10YWJsZSBzZWNvbmQuCiAvLyBUaGUgJ2MnIHZhcmlhbnRzIGFzayBmb3IgdGhlIHYtdGFibGUgdGhpcmQuCi0vLyBXZSBkbyBhIHNlcGFyYXRlIENIRUNLLUxBVEUgcGFzcyBiZWNhdXNlIHRoZSBSVFRJIGRlZmludGlvbiBnZXRzCisvLyBXZSBkbyBhIHNlcGFyYXRlIENIRUNLLUxBVEUgcGFzcyBiZWNhdXNlIHRoZSBSVFRJIGRlZmluaXRpb24gZ2V0cwogLy8gY2hhbmdlZCBhZnRlciB0aGUgZmFjdCwgd2hpY2ggY2F1c2VzIHJlb3JkZXJpbmcgb2YgdGhlIGdsb2JhbHMuCiAKIC8vIFRoZXNlIGFyZSBub3Qgc2VwYXJhdGVkIGludG8gbmFtZXNwYWNlcyBiZWNhdXNlIHRoZSB3YXkgdGhhdCBTZW1hCkBAIC01OSw3ICs1OSw3IEBACiBUZXN0MWE6OlRlc3QxYSgpIHsgdXNlKHR5cGVpZChUZXN0MWEpKTsgfQogLy8gQ0hFQ0s6ICAgICAgQF9aVFY2VGVzdDFhID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCAKIC8vIENIRUNLLUxBVEU6IEBfWlRTNlRlc3QxYSA9IGxpbmtvbmNlX29kciBjb25zdGFudAotLy8gQ0hFQ0stTEFURTogQF9aVEk2VGVzdDFhID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0stTEFURTogQF9aVEk2VGVzdDFhID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CiAKIC8vIFRoaXMgZGVmaW5lcyB0aGUga2V5IGZ1bmN0aW9uLgogaW5saW5lIHZvaWQgVGVzdDFhOjpmb28oKSB7fQpAQCAtNzksNyArNzksNyBAQAogVGVzdDFiOjpUZXN0MWIoKSB7IHVzZSh0eXBlaWQoVGVzdDFiKSk7IH0KIC8vIENIRUNLOiBAX1pUVjZUZXN0MWIgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50IAogLy8gQ0hFQ0s6IEBfWlRTNlRlc3QxYiA9IGxpbmtvbmNlX29kciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJNlRlc3QxYiA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSTZUZXN0MWIgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKIAogLyoqKiBUZXN0MmEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC05Myw3ICs5Myw3IEBACiBUZXN0MmE6OlRlc3QyYSgpIHsgdXNlKHR5cGVpZChUZXN0MmEpKTsgfQogLy8gQ0hFQ0s6ICAgICAgQF9aVFY2VGVzdDJhID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAogLy8gQ0hFQ0stTEFURTogQF9aVFM2VGVzdDJhID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSy1MQVRFOiBAX1pUSTZUZXN0MmEgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSy1MQVRFOiBAX1pUSTZUZXN0MmEgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKIAogdm9pZCBUZXN0MmE6OmJhcigpIHt9CiBpbmxpbmUgdm9pZCBUZXN0MmE6OmZvbygpIHt9CkBAIC0xMTIsNyArMTEyLDcgQEAKIFRlc3QyYjo6VGVzdDJiKCkgeyB1c2UodHlwZWlkKFRlc3QyYikpOyB9CiAvLyBDSEVDSzogICAgICBAX1pUVjZUZXN0MmIgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAvLyBDSEVDSy1MQVRFOiBAX1pUUzZUZXN0MmIgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKLS8vIENIRUNLLUxBVEU6IEBfWlRJNlRlc3QyYiA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLLUxBVEU6IEBfWlRJNlRlc3QyYiA9IGxpbmtvbmNlX29kciBjb25zdGFudAogCiBpbmxpbmUgdm9pZCBUZXN0MmI6OmZvbygpIHt9CiAKQEAgLTEzMSw3ICsxMzEsNyBAQAogVGVzdDJjOjpUZXN0MmMoKSB7IHVzZSh0eXBlaWQoVGVzdDJjKSk7IH0KIC8vIENIRUNLOiBAX1pUVjZUZXN0MmMgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAvLyBDSEVDSzogQF9aVFM2VGVzdDJjID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVEk2VGVzdDJjID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJNlRlc3QyYyA9IGxpbmtvbmNlX29kciBjb25zdGFudAogCiAvKioqIFRlc3QzYSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE0NSw3ICsxNDUsNyBAQAogVGVzdDNhOjpUZXN0M2EoKSB7IHVzZSh0eXBlaWQoVGVzdDNhKSk7IH0KIC8vIENIRUNLOiAgICAgIEBfWlRWNlRlc3QzYSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLLUxBVEU6IEBfWlRTNlRlc3QzYSA9IGxpbmtvbmNlX29kciBjb25zdGFudAotLy8gQ0hFQ0stTEFURTogQF9aVEk2VGVzdDNhID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0stTEFURTogQF9aVEk2VGVzdDNhID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CiAKIC8vIFRoaXMgZGVmaW5lcyB0aGUga2V5IGZ1bmN0aW9uLgogaW5saW5lIHZvaWQgVGVzdDNhOjpiYXIoKSB7fQpAQCAtMTY1LDcgKzE2NSw3IEBACiBUZXN0M2I6OlRlc3QzYigpIHsgdXNlKHR5cGVpZChUZXN0M2IpKTsgfQogLy8gQ0hFQ0s6ICAgICAgQF9aVFY2VGVzdDNiID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAogLy8gQ0hFQ0stTEFURTogQF9aVFM2VGVzdDNiID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSy1MQVRFOiBAX1pUSTZUZXN0M2IgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSy1MQVRFOiBAX1pUSTZUZXN0M2IgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKIAogLy8gVGhpcyBkZWZpbmVzIHRoZSBrZXkgZnVuY3Rpb24uCiBpbmxpbmUgdm9pZCBUZXN0M2I6OmZvbygpIHt9CkBAIC0xODYsNCArMTg2LDQgQEAKIFRlc3QzYzo6VGVzdDNjKCkgeyB1c2UodHlwZWlkKFRlc3QzYykpOyB9CiAvLyBDSEVDSzogQF9aVFY2VGVzdDNjID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAogLy8gQ0hFQ0s6IEBfWlRTNlRlc3QzYyA9IGxpbmtvbmNlX29kciBjb25zdGFudAotLy8gQ0hFQ0s6IEBfWlRJNlRlc3QzYyA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSTZUZXN0M2MgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbkNYWC92dGFibGUtbGF5b3V0LWFiaS1leGFtcGxlcy5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvdnRhYmxlLWxheW91dC1hYmktZXhhbXBsZXMuY3BwCmluZGV4IDhmMDg0YTkuLmI4YWM2ZjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbkNYWC92dGFibGUtbGF5b3V0LWFiaS1leGFtcGxlcy5jcHAKKysrIGIvdGVzdC9Db2RlR2VuQ1hYL3Z0YWJsZS1sYXlvdXQtYWJpLWV4YW1wbGVzLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlPXg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZW1pdC1sbHZtLW9ubHkgLWZkdW1wLXZ0YWJsZS1sYXlvdXRzID4gJXQgMj4mMQorLy8gUlVOOiAlY2xhbmdfY2MxICVzIC10cmlwbGU9eDg2XzY0LWFwcGxlLWRhcndpbjEwIC1lbWl0LWxsdm0tb25seSAtZmR1bXAtdnRhYmxlLWxheW91dHMgPiAldCAyPi9kZXYvbnVsbAogLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stMSAlcyA8ICV0CiAvLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy0yICVzIDwgJXQKIC8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLTMgJXMgPCAldApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3Z0YWJsZS1saW5rYWdlLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC92dGFibGUtbGlua2FnZS5jcHAKaW5kZXggYzE3ZTMzMy4uOWMwOGIzMCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3Z0YWJsZS1saW5rYWdlLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvdnRhYmxlLWxpbmthZ2UuY3BwCkBAIC0xLDggKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC10cmlwbGU9eDg2XzY0LWFwcGxlLWRhcndpbjEwIC1lbWl0LWxsdm0gLW8gJXQKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlPXg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZmhpZGRlbi13ZWFrLXZ0YWJsZXMgLWVtaXQtbGx2bSAtbyAldC5oaWRkZW4KIC8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlPXg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZGlzYWJsZS1sbHZtLW9wdHpucyAtTzMgLWVtaXQtbGx2bSAtbyAldC5vcHQKIC8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLICVzIDwgJXQKLS8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUhJRERFTiAlcyA8ICV0LmhpZGRlbgogLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stT1BUICVzIDwgJXQub3B0CiAKIG5hbWVzcGFjZSB7CkBAIC05Myw1NyArOTEsNDcgQEAKIC8vIGFuZCBoaWRkZW4gdmlzaWJpbGl0eSAocmRhcjovL3Byb2JsZW0vNzUyMzIyOSkuCiAvLyBDSEVDSy1EQUc6IEBfWlRWMUMgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAvLyBDSEVDSy1EQUc6IEBfWlRTMUMgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKLS8vIENIRUNLLURBRzogQF9aVEkxQyA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLLURBRzogQF9aVEkxQyA9IGxpbmtvbmNlX29kciBjb25zdGFudAogLy8gQ0hFQ0stREFHOiBAX1pUVDFDID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAotLy8gQ0hFQ0stSElEREVOLURBRzogQF9aVFYxQyA9IGxpbmtvbmNlX29kciBoaWRkZW4gdW5uYW1lZF9hZGRyIGNvbnN0YW50Ci0vLyBDSEVDSy1ISURERU4tREFHOiBAX1pUUzFDID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSy1ISURERU4tREFHOiBAX1pUSTFDID0gbGlua29uY2Vfb2RyIGhpZGRlbiB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLLUhJRERFTi1EQUc6IEBfWlRUMUMgPSBsaW5rb25jZV9vZHIgaGlkZGVuIHVubmFtZWRfYWRkciBjb25zdGFudAogCiAvLyBEIGhhcyBhIGtleSBmdW5jdGlvbiB0aGF0IGlzIGRlZmluZWQgaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0IHNvIGl0cyB2dGFibGUgaXMKIC8vIGRlZmluZWQgaW4gdGhlIHRyYW5zbGF0aW9uIHVuaXQuCiAvLyBDSEVDSy1EQUc6IEBfWlRWMUQgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLLURBRzogQF9aVFMxRCA9IGNvbnN0YW50Ci0vLyBDSEVDSy1EQUc6IEBfWlRJMUQgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLLURBRzogQF9aVEkxRCA9IGNvbnN0YW50CiAKIC8vIEU8Y2hhcj4gaXMgYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gd2l0aCBhIGtleSBmdW5jdGlvbiBkZWZpbmVkCiAvLyBpbiB0aGlzIHRyYW5zbGF0aW9uIHVuaXQsIHNvIGl0cyB2dGFibGUgc2hvdWxkIGhhdmUgZXh0ZXJuYWwKIC8vIGxpbmthZ2UuCiAvLyBDSEVDSy1EQUc6IEBfWlRWMUVJY0UgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLLURBRzogQF9aVFMxRUljRSA9IGNvbnN0YW50Ci0vLyBDSEVDSy1EQUc6IEBfWlRJMUVJY0UgPSB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLLURBRzogQF9aVEkxRUljRSA9IGNvbnN0YW50CiAKIC8vIEU8c2hvcnQ+IGlzIGFuIGV4cGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gd2l0aCBhIGtleSBmdW5jdGlvbgogLy8gZGVmaW5lZCBpbiB0aGlzIHRyYW5zbGF0aW9uIHVuaXQsIHNvIGl0cyB2dGFibGUgc2hvdWxkIGhhdmUKIC8vIHdlYWtfb2RyIGxpbmthZ2UuCiAvLyBDSEVDSy1EQUc6IEBfWlRWMUVJc0UgPSB3ZWFrX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLLURBRzogQF9aVFMxRUlzRSA9IHdlYWtfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSy1EQUc6IEBfWlRJMUVJc0UgPSB3ZWFrX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLLUhJRERFTi1EQUc6IEBfWlRWMUVJc0UgPSB3ZWFrX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLLUhJRERFTi1EQUc6IEBfWlRTMUVJc0UgPSB3ZWFrX29kciBjb25zdGFudAotLy8gQ0hFQ0stSElEREVOLURBRzogQF9aVEkxRUlzRSA9IHdlYWtfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0stREFHOiBAX1pUSTFFSXNFID0gd2Vha19vZHIgY29uc3RhbnQKIAogLy8gRjxzaG9ydD4gaXMgYW4gZXhwbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiB3aXRob3V0IGEga2V5CiAvLyBmdW5jdGlvbiwgc28gaXRzIHZ0YWJsZSBzaG91bGQgaGF2ZSB3ZWFrX29kciBsaW5rYWdlCiAvLyBDSEVDSy1EQUc6IEBfWlRWMUZJc0UgPSB3ZWFrX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLLURBRzogQF9aVFMxRklzRSA9IHdlYWtfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSy1EQUc6IEBfWlRJMUZJc0UgPSB3ZWFrX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLLUhJRERFTi1EQUc6IEBfWlRWMUZJc0UgPSB3ZWFrX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLLUhJRERFTi1EQUc6IEBfWlRTMUZJc0UgPSB3ZWFrX29kciBjb25zdGFudAotLy8gQ0hFQ0stSElEREVOLURBRzogQF9aVEkxRklzRSA9IHdlYWtfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0stREFHOiBAX1pUSTFGSXNFID0gd2Vha19vZHIgY29uc3RhbnQKIAogLy8gRTxsb25nPiBpcyBhbiBpbXBsaWNpdCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHdpdGggYSBrZXkgZnVuY3Rpb24KIC8vIGRlZmluZWQgaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0LCBzbyBpdHMgdnRhYmxlIHNob3VsZCBoYXZlCiAvLyBsaW5rb25jZV9vZHIgbGlua2FnZS4KIC8vIENIRUNLLURBRzogQF9aVFYxRUlsRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLLURBRzogQF9aVFMxRUlsRSA9IGxpbmtvbmNlX29kciBjb25zdGFudAotLy8gQ0hFQ0stREFHOiBAX1pUSTFFSWxFID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0stREFHOiBAX1pUSTFFSWxFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CiAKIC8vIEY8bG9uZz4gaXMgYW4gaW1wbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiB3aXRoIG5vIGtleSBmdW5jdGlvbiwKIC8vIHNvIGl0cyB2dGFibGUgc2hvdWxkIGhhdmUgbGlua29uY2Vfb2RyIGxpbmthZ2UuCiAvLyBDSEVDSy1EQUc6IEBfWlRWMUZJbEUgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAvLyBDSEVDSy1EQUc6IEBfWlRTMUZJbEUgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKLS8vIENIRUNLLURBRzogQF9aVEkxRklsRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLLURBRzogQF9aVEkxRklsRSA9IGxpbmtvbmNlX29kciBjb25zdGFudAogCiAvLyBGPGludD4gaXMgYW4gZXhwbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBkZWNsYXJhdGlvbiB3aXRob3V0IGEKIC8vIGtleSBmdW5jdGlvbiwgc28gaXRzIHZ0YWJsZSBzaG91bGQgaGF2ZSBleHRlcm5hbCBsaW5rYWdlLgpAQCAtMTYwLDE5ICsxNDgsMTkgQEAKIC8vIGludGVybmFsIGxpbmthZ2UuCiAvLyBDSEVDSy1EQUc6IEAiX1pUVjMkXzAiID0gaW50ZXJuYWwgdW5uYW1lZF9hZGRyIGNvbnN0YW50CiAvLyBDSEVDSy1EQUc6IEAiX1pUUzMkXzAiID0gaW50ZXJuYWwgY29uc3RhbnQKLS8vIENIRUNLLURBRzogQCJfWlRJMyRfMCIgPSBpbnRlcm5hbCB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLLURBRzogQCJfWlRJMyRfMCIgPSBpbnRlcm5hbCBjb25zdGFudAogCiAvLyBUaGUgQSB2dGFibGUgc2hvdWxkIGhhdmUgaW50ZXJuYWwgbGlua2FnZSBzaW5jZSBpdCBpcyBpbnNpZGUgYW4gYW5vbnltb3VzIAogLy8gbmFtZXNwYWNlLgogLy8gQ0hFQ0stREFHOiBAX1pUVk4xMl9HTE9CQUxfX05fMTFBRSA9IGludGVybmFsIHVubmFtZWRfYWRkciBjb25zdGFudAogLy8gQ0hFQ0stREFHOiBAX1pUU04xMl9HTE9CQUxfX05fMTFBRSA9IGludGVybmFsIGNvbnN0YW50Ci0vLyBDSEVDSy1EQUc6IEBfWlRJTjEyX0dMT0JBTF9fTl8xMUFFID0gaW50ZXJuYWwgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSy1EQUc6IEBfWlRJTjEyX0dMT0JBTF9fTl8xMUFFID0gaW50ZXJuYWwgY29uc3RhbnQKIAogLy8gRjxjaGFyPiBpcyBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiB3aXRob3V0IGEga2V5IGZ1bmN0aW9uLCBzbwogLy8gaXRzIHZ0YWJsZSBzaG91bGQgaGF2ZSBsaW5rb25jZV9vZHIgbGlua2FnZS4KIC8vIENIRUNLLURBRzogQF9aVFYxRkljRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIC8vIENIRUNLLURBRzogQF9aVFMxRkljRSA9IGxpbmtvbmNlX29kciBjb25zdGFudAotLy8gQ0hFQ0stREFHOiBAX1pUSTFGSWNFID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0stREFHOiBAX1pUSTFGSWNFID0gbGlua29uY2Vfb2RyIGNvbnN0YW50CiAKIC8vIENIRUNLLURBRzogQF9aVFYxR0lpRSA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuQ1hYL3dlYWstZXh0ZXJuLXR5cGVpbmZvLmNwcCBiL3Rlc3QvQ29kZUdlbkNYWC93ZWFrLWV4dGVybi10eXBlaW5mby5jcHAKaW5kZXggM2MzNDA2ZS4uMzhmNmEzZSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3dlYWstZXh0ZXJuLXR5cGVpbmZvLmNwcAorKysgYi90ZXN0L0NvZGVHZW5DWFgvd2Vhay1leHRlcm4tdHlwZWluZm8uY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIC8vIHJkYXI6Ly8xMDI0NjM5NQogCiAjZGVmaW5lIFdFQUsgX19hdHRyaWJ1dGVfXyAoKHdlYWspKSAKQEAgLTMyLDE2ICszMiwxNiBAQAogdm9pZCBWMjo6Zm9vKCkgeyB9CiAKIC8vIENIRUNLOiBAX1pUUzFBID0gd2Vha19vZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSTFBID0gd2Vha19vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogQF9aVEkxQSA9IHdlYWtfb2RyIGNvbnN0YW50CiAvLyBDSEVDSzogQF9aVFMxQiA9IHdlYWtfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVEkxQiA9IHdlYWtfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJMUIgPSB3ZWFrX29kciBjb25zdGFudAogLy8gQ0hFQ0s6IEBfWlRTMUMgPSB3ZWFrX29kciBjb25zdGFudAogLy8gQ0hFQ0s6IEBfWlRTMlQxID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVEkyVDEgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogQF9aVEkyVDEgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQKIC8vIENIRUNLOiBAX1pUUzFUID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVEkxVCA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSTFDID0gd2Vha19vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50CisvLyBDSEVDSzogQF9aVEkxVCA9IGxpbmtvbmNlX29kciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJMUMgPSB3ZWFrX29kciBjb25zdGFudAogLy8gQ0hFQ0s6IEBfWlRTMlYxID0gd2Vha19vZHIgY29uc3RhbnQKLS8vIENIRUNLOiBAX1pUSTJWMSA9IHdlYWtfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudAorLy8gQ0hFQ0s6IEBfWlRJMlYxID0gd2Vha19vZHIgY29uc3RhbnQKIC8vIENIRUNLOiBAX1pUUzJWMiA9IHdlYWtfb2RyIGNvbnN0YW50Ci0vLyBDSEVDSzogQF9aVEkyVjIgPSB3ZWFrX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQKKy8vIENIRUNLOiBAX1pUSTJWMiA9IHdlYWtfb2RyIGNvbnN0YW50CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5DWFgvd2Vhay1leHRlcm5hbC5jcHAgYi90ZXN0L0NvZGVHZW5DWFgvd2Vhay1leHRlcm5hbC5jcHAKaW5kZXggZGFkNTRmNi4uYTJjNTNhNSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuQ1hYL3dlYWstZXh0ZXJuYWwuY3BwCisrKyBiL3Rlc3QvQ29kZUdlbkNYWC93ZWFrLWV4dGVybmFsLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nIC1mZXhjZXB0aW9ucyAlcyAtUyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgJXMgLVMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCiAvLyBQUjQyNjIKIAogLy8gQ0hFQ0stTk9UOiBfWk5TczEyX1NfY29uc3RydWN0SVBLY0VFUGNUX1MzX1JLU2FJY0VTdDIwZm9yd2FyZF9pdGVyYXRvcl90YWcKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvMjAwOS0wOC0wNS11dGYxNi5tIGIvdGVzdC9Db2RlR2VuT2JqQy8yMDA5LTA4LTA1LXV0ZjE2Lm0KaW5kZXggMDY0NThlNy4uMThhYzFkYiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy8yMDA5LTA4LTA1LXV0ZjE2Lm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy8yMDA5LTA4LTA1LXV0ZjE2Lm0KQEAgLTEsNSArMSw1IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtdyAteCBvYmplY3RpdmUtYyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAvLyByZGFyOi8vNzA5NTg1NSByZGFyOi8vNzExNTc0OQogCi0vLyBDSEVDSzogaW50ZXJuYWwgdW5uYW1lZF9hZGRyIGNvbnN0YW50IFs2IHggaTE2XSBbaTE2IDEwNSwgaTE2IDgwLCBpMTYgMTExLCBpMTYgMTAwLCBpMTYgODQ4MiwgaTE2IDBdLCBhbGlnbiAyCisvLyBDSEVDSzogcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzYgeCBpMTZdIFtpMTYgMTA1LCBpMTYgODAsIGkxNiAxMTEsIGkxNiAxMDAsIGkxNiA4NDgyLCBpMTYgMF0sIHNlY3Rpb24gIl9fVEVYVCxfX3VzdHJpbmciLCBhbGlnbiAyCiB2b2lkICpQID0gQCJpUG9k4oSiIjsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvMjAxMC0wMi0wMS11dGYxNi13aXRoLW51bGwubSBiL3Rlc3QvQ29kZUdlbk9iakMvMjAxMC0wMi0wMS11dGYxNi13aXRoLW51bGwubQppbmRleCAxODYzOTg0Li4zN2ZiOWNkIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDLzIwMTAtMDItMDEtdXRmMTYtd2l0aC1udWxsLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy8yMDEwLTAyLTAxLXV0ZjE2LXdpdGgtbnVsbC5tCkBAIC0xLDUgKzEsNyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1hcHBsZS1kYXJ3aW4gLWVtaXQtbGx2bSAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAvLyByZGFyOi8vNzU4OTg1MAogCi0vLyBDSEVDSy1OT1Q6IF9fdXN0cmluZworLy8gQ0hFQ0s6IEAuc3RyID0gcHJpdmF0ZSB1bm5hbWVkX2FkZHIgY29uc3RhbnQgWzkgeCBpMTZdIFtpMTYgMTAzLCBpMTYgMTExLCBpMTYgMTExLCBpMTYgMTAwLCBpMTYgMCwgaTE2IDk4LCBpMTYgMTIxLCBpMTYgMTAxLCBpMTYgMF0sIHNlY3Rpb24gIl9fVEVYVCxfX3VzdHJpbmciLCBhbGlnbiAyCisvLyBDSEVDSzogQF91bm5hbWVkX2Nmc3RyaW5nXyA9IHByaXZhdGUgY29uc3RhbnQgJXN0cnVjdC5OU0NvbnN0YW50U3RyaW5nIHsgaTMyKiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMCB4IGkzMl0qIEBfX0NGQ29uc3RhbnRTdHJpbmdDbGFzc1JlZmVyZW5jZSwgaTMyIDAsIGkzMiAwKSwgaTMyIDIwMDAsIGk4KiBiaXRjYXN0IChbOSB4IGkxNl0qIEAuc3RyIHRvIGk4KiksIGkzMiA4IH0sIHNlY3Rpb24gIl9fREFUQSxfX2Nmc3RyaW5nIgorLy8gQ0hFQ0s6IEBQID0gZ2xvYmFsIGk4KiBiaXRjYXN0ICglc3RydWN0Lk5TQ29uc3RhbnRTdHJpbmcqIEBfdW5uYW1lZF9jZnN0cmluZ18gdG8gaTgqKSwgYWxpZ24gNAogdm9pZCAqUCA9IEAiZ29vZFwwYnllIjsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvYXJjLWFybS5tIGIvdGVzdC9Db2RlR2VuT2JqQy9hcmMtYXJtLm0KaW5kZXggMzk4OWY1Ni4uOGQ1ZjBkNSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9hcmMtYXJtLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9hcmMtYXJtLm0KQEAgLTEsMTkgKzEsMjIgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybXY3LWFwcGxlLWRhcndpbjEwIC1lbWl0LWxsdm0gLWZibG9ja3MgLWZvYmpjLWFyYyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1hcHBsZS1pb3MgLWVtaXQtbGx2bSAtZmJsb2NrcyAtZm9iamMtYXJjIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKworLy8gPHJkYXI6Ly8xMjQzODU5OD46IHVzZSBhbiBhdXRvcmVsZWFzZSBtYXJrZXIgb24gQVJNNjQuCiAKIGlkIHRlc3QwKHZvaWQpIHsKICAgZXh0ZXJuIGlkIHRlc3QwX2hlbHBlcih2b2lkKTsKLSAgLy8gQ0hFQ0s6ICAgICAgW1tUMDolLipdXSA9IGNhbGwgYXJtX2FhcGNzY2MgaTgqIEB0ZXN0MF9oZWxwZXIoKQorICAvLyBDSEVDSzogICAgICBbW1QwOiUuKl1dID0gY2FsbCBbW0NDOihhcm1fYWFwY3NjYyApP11daTgqIEB0ZXN0MF9oZWxwZXIoKQogICAvLyBDSEVDSy1ORVhUOiByZXQgaTgqIFtbVDBdXQogICByZXR1cm4gdGVzdDBfaGVscGVyKCk7CiB9CiAKIHZvaWQgdGVzdDEodm9pZCkgewogICBleHRlcm4gaWQgdGVzdDFfaGVscGVyKHZvaWQpOwotICAvLyBDSEVDSzogICAgICBbW1QwOiUuKl1dID0gY2FsbCBhcm1fYWFwY3NjYyBpOCogQHRlc3QxX2hlbHBlcigpCi0gIC8vIENIRUNLLU5FWFQ6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCAibW92XDA5cjcsIHI3Ci0gIC8vIENIRUNLLU5FWFQ6IFtbVDE6JS4qXV0gPSBjYWxsIGFybV9hYXBjc2NjIGk4KiBAb2JqY19yZXRhaW5BdXRvcmVsZWFzZWRSZXR1cm5WYWx1ZShpOCogW1tUMF1dKQorICAvLyBDSEVDSzogICAgICBbW1QwOiUuKl1dID0gY2FsbCBbW0NDXV1pOCogQHRlc3QxX2hlbHBlcigpCisgIC8vIENIRUNLLU5FWFQ6IGNhbGwgdm9pZCBhc20gc2lkZWVmZmVjdCAibW92CisgIC8vIENIRUNLLU5FWFQ6IFtbVDE6JS4qXV0gPSBjYWxsIFtbQ0NdXWk4KiBAb2JqY19yZXRhaW5BdXRvcmVsZWFzZWRSZXR1cm5WYWx1ZShpOCogW1tUMF1dKQogICAvLyBDSEVDSy1ORVhUOiBzdG9yZSBpOCogW1tUMV1dLAotICAvLyBDSEVDSy1ORVhUOiBjYWxsIGFybV9hYXBjc2NjIHZvaWQgQG9iamNfc3RvcmVTdHJvbmcoCisgIC8vIENIRUNLLU5FWFQ6IGNhbGwgW1tDQ11ddm9pZCBAb2JqY19zdG9yZVN0cm9uZygKICAgLy8gQ0hFQ0stTkVYVDogcmV0IHZvaWQKICAgaWQgeCA9IHRlc3QxX2hlbHBlcigpOwogfQpAQCAtMjIsMTQgKzI1LDE0IEBACiBAY2xhc3MgQTsKIEEgKnRlc3QyKHZvaWQpIHsKICAgZXh0ZXJuIEEgKnRlc3QyX2hlbHBlcih2b2lkKTsKLSAgLy8gQ0hFQ0s6ICAgICAgW1tUMDolLipdXSA9IGNhbGwgYXJtX2FhcGNzY2MgW1tBOiUuKl1dKiBAdGVzdDJfaGVscGVyKCkKKyAgLy8gQ0hFQ0s6ICAgICAgW1tUMDolLipdXSA9IGNhbGwgW1tDQ11dW1tBOiUuKl1dKiBAdGVzdDJfaGVscGVyKCkKICAgLy8gQ0hFQ0stTkVYVDogcmV0IFtbQV1dKiBbW1QwXV0KICAgcmV0dXJuIHRlc3QyX2hlbHBlcigpOwogfQogCiBpZCB0ZXN0Myh2b2lkKSB7CiAgIGV4dGVybiBBICp0ZXN0M19oZWxwZXIodm9pZCk7Ci0gIC8vIENIRUNLOiAgICAgIFtbVDA6JS4qXV0gPSBjYWxsIGFybV9hYXBjc2NjIFtbQTolLipdXSogQHRlc3QzX2hlbHBlcigpCisgIC8vIENIRUNLOiAgICAgIFtbVDA6JS4qXV0gPSBjYWxsIFtbQ0NdXVtbQTolLipdXSogQHRlc3QzX2hlbHBlcigpCiAgIC8vIENIRUNLLU5FWFQ6IFtbVDE6JS4qXV0gPSBiaXRjYXN0IFtbQV1dKiBbW1QwXV0gdG8gaTgqCiAgIC8vIENIRUNLLU5FWFQ6IHJldCBpOCogW1tUMV1dCiAgIHJldHVybiB0ZXN0M19oZWxwZXIoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvYXJjLWZvcmVhY2gubSBiL3Rlc3QvQ29kZUdlbk9iakMvYXJjLWZvcmVhY2gubQppbmRleCA0NDU2MTgxLi5lYzc2N2QzIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2FyYy1mb3JlYWNoLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9hcmMtZm9yZWFjaC5tCkBAIC0xNzIsNCArMTcyLDQgQEAKICAgLy8gQ0hFQ0stTFA2NC1ORVhUOiBiciBsYWJlbCBbW0xdXQogfQogCi0vLyBDSEVDSzogYXR0cmlidXRlcyBbW05VV11dID0geyBub3Vud2luZCB9CisvLyBDSEVDSy1MUDY0OiBhdHRyaWJ1dGVzIFtbTlVXXV0gPSB7IG5vdW53aW5kIH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvYXJjLWl2YXItbGF5b3V0Lm0gYi90ZXN0L0NvZGVHZW5PYmpDL2FyYy1pdmFyLWxheW91dC5tCmluZGV4IDYyNDI4ZjUuLjA2ZTM4N2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvYXJjLWl2YXItbGF5b3V0Lm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9hcmMtaXZhci1sYXlvdXQubQpAQCAtMSw2ICsxLDYgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm9iamMtYXJjIC1mb2JqYy1ydW50aW1lLWhhcy13ZWFrIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtUyAlcyAtbyAldC02NC5zCiAvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQNjQgLS1pbnB1dC1maWxlPSV0LTY0LnMgJXMKLS8vIFJFUVVJUkVTOiB4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIHJkYXI6Ly84OTkxNzI5CiAKIEBpbnRlcmZhY2UgTlNPYmplY3QgewpAQCAtNTQsMyArNTQsMTIgQEAKIEBpbXBsZW1lbnRhdGlvbiBVbnNhZmVQZXJzb24gQGVuZAogLy8gQ0hFQ0stTFA2NDogTF9PQkpDX0NMQVNTX05BTUVfMjA6CiAvLyBDSEVDSy1MUDY0LU5FWFQ6IC5hc2NpeiAgICAgICIhIgorCisvLyByZGFyOi8vMTYxMzY0MzkKK0BpbnRlcmZhY2UgcmRhcjE2MTM2NDM5CisgICAgQHByb3BlcnR5IChub25hdG9taWMsIHJlYWRvbmx5LCB3ZWFrKSBpZCBmaXJzdDsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIHJkYXIxNjEzNjQzOSBAZW5kCisvLyBDSEVDSy1MUDY0OiBMX09CSkNfUFJPUF9OQU1FX0FUVFJfMjk6CisvLyBDSEVDSy1MUDY0LU5FWFQ6IC5hc2NpeiAgIlRALFIsVyxOLFZfZmlyc3QiCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL2FyYy1saW5ldGFibGUtYXV0b3JlbGVhc2UubSBiL3Rlc3QvQ29kZUdlbk9iakMvYXJjLWxpbmV0YWJsZS1hdXRvcmVsZWFzZS5tCmluZGV4IGJlMDVlYzIuLmZhMTA5MTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvYXJjLWxpbmV0YWJsZS1hdXRvcmVsZWFzZS5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvYXJjLWxpbmV0YWJsZS1hdXRvcmVsZWFzZS5tCkBAIC0yOSwxMiArMjksMTEgQEAKICAgQ0dGbG9hdCBwYXR0ZXJuWzJdOwogICAvLyBDSEVDSzogZGVmaW5lIHt7Lip9fV9jcmVhdGVCZXppZXJQYXRoV2l0aFdpZHRoCiAgIC8vIENIRUNLOiBsb2FkIHt7Lip9fSAlcGF0aCwgYWxpZ24ge3suKn19LCAhZGJnICFbW1JFVDpbMC05XStdXQotICAvLyBDSEVDSzogY2FsbCB2b2lkIEBvYmpjX3N0b3JlU3Ryb25ne3suKn19ICFkYmcgIVtbQVJDMTpbMC05XStdXQotICAvLyBDSEVDSzogY2FsbCB7ey4qfX0gQG9iamNfYXV0b3JlbGVhc2VSZXR1cm5WYWx1ZXt7Lip9fSAhZGJnICFbW0FSQzI6WzAtOV0rXV0KLSAgLy8gQ0hFQ0s6IHJldCB7ey4qfX0gIWRiZyAhW1tBUkMyXV0KKyAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAb2JqY19zdG9yZVN0cm9uZ3t7Lip9fSAhZGJnICFbW0FSQzpbMC05XStdXQorICAvLyBDSEVDSzogY2FsbCB7ey4qfX0gQG9iamNfYXV0b3JlbGVhc2VSZXR1cm5WYWx1ZXt7Lip9fSAhZGJnICFbW0FSQ11dCisgIC8vIENIRUNLOiByZXQge3suKn19ICFkYmcgIVtbQVJDXV0KICAgLy8gQ0hFQ0s6ICFbW1JFVF1dID0gbWV0YWRhdGEgIXtpMzIgW1tATElORSsxXV0sIGkzMiAwLCBtZXRhZGF0YSAhe3suKn19LCBudWxsfQogICByZXR1cm4gcGF0aDsKLSAgLy8gQ0hFQ0s6ICFbW0FSQzFdXSA9IG1ldGFkYXRhICF7aTMyIFtbQExJTkUrMl1dLCBpMzIgMCwgbWV0YWRhdGEgIXt7Lip9fSwgbnVsbH0KLSAgLy8gQ0hFQ0s6ICFbW0FSQzJdXSA9IG1ldGFkYXRhICF7aTMyIFtbQExJTkUrMV1dLCBpMzIgMCwgbWV0YWRhdGEgIXt7Lip9fSwgbnVsbH0KKyAgLy8gQ0hFQ0s6ICFbW0FSQ11dID0gbWV0YWRhdGEgIXtpMzIgW1tATElORSsxXV0sIGkzMiAwLCBtZXRhZGF0YSAhe3suKn19LCBudWxsfQogfQogQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9hcmMtbGluZXRhYmxlLm0gYi90ZXN0L0NvZGVHZW5PYmpDL2FyYy1saW5ldGFibGUubQppbmRleCBlYWM5MWYxLi43YWYwMmVkIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2FyYy1saW5ldGFibGUubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2FyYy1saW5ldGFibGUubQpAQCAtNDcsOCArNDcsMTAgQEAKIAogQGltcGxlbWVudGF0aW9uIEFwcERlbGVnYXRlIDogTlNPYmplY3QKIAorLy8gQ0hFQ0s6ICFbW1RFU1ROT1NJREVFRkZFQ1Q6LipdXSA9IHt7Lip9fVsgRFdfVEFHX3N1YnByb2dyYW0gXSBbbGluZSBbW0BMSU5FKzFdXV0gW2xvY2FsXSBbZGVmXSBbLVtBcHBEZWxlZ2F0ZSB0ZXN0Tm9TaWRlRWZmZWN0Ol1dCiAtIChpbnQpdGVzdE5vU2lkZUVmZmVjdDooTlNTdHJpbmcgKilmb28gewotICAvLyBDSEVDSzogIVtbQVJDMV1dID0gbWV0YWRhdGEgIXtpMzIgW1tATElORSsxXV0sIGkzMiAwLCBtZXRhZGF0YSAhe3suKn19LCBudWxsfQorICBpbnQgeCA9IDE7CisgIC8vIENIRUNLOiAhW1tBUkMxXV0gPSBtZXRhZGF0YSAhe2kzMiBbW0BMSU5FKzFdXSwgaTMyIDAsIG1ldGFkYXRhICFbW1RFU1ROT1NJREVFRkZFQ1RdXSwgbnVsbH0KICAgcmV0dXJuIDE7IC8vIFJldHVybiBleHByZXNzaW9uCiAgIC8vIENIRUNLOiAhW1tSRVQxXV0gPSBtZXRhZGF0YSAhe2kzMiBbW0BMSU5FKzFdXSwgaTMyIDAsIG1ldGFkYXRhICF7ey4qfX0sIG51bGx9CiB9ICAgICAgICAgICAvLyBDbGVhbnVwICsgUmV0CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL2FyYy1wcm9wZXJ0eS5tIGIvdGVzdC9Db2RlR2VuT2JqQy9hcmMtcHJvcGVydHkubQppbmRleCBjM2M3ZTJiLi44Mzk4YTFiIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2FyYy1wcm9wZXJ0eS5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvYXJjLXByb3BlcnR5Lm0KQEAgLTY3LDcgKzY3LDcgQEAKIAogLy8gQ0hFQ0s6ICAgIGRlZmluZSBpbnRlcm5hbCBpOCogQCJcMDEtW1Rlc3QyIHRoZUNsYXNzXSIoCiAvLyBDSEVDSzogICAgICBbW09GRlNFVDolLipdXSA9IGxvYWQgaTY0KiBAIk9CSkNfSVZBUl8kX1Rlc3QyLl90aGVDbGFzcyIKLS8vIENIRUNLLU5FWFQ6IFtbVDA6JS4qXV0gPSBjYWxsIGk4KiBAb2JqY19nZXRQcm9wZXJ0eShpOCoge3suKn19LCBpOCoge3suKn19LCBpNjQgW1tPRkZTRVRdXSwgaTEgemVyb2V4dCB0cnVlKQorLy8gQ0hFQ0stTkVYVDogW1tUMDolLipdXSA9IHRhaWwgY2FsbCBpOCogQG9iamNfZ2V0UHJvcGVydHkoaTgqIHt7Lip9fSwgaTgqIHt7Lip9fSwgaTY0IFtbT0ZGU0VUXV0sIGkxIHplcm9leHQgdHJ1ZSkKIC8vIENIRUNLLU5FWFQ6IHJldCBpOCogW1tUMF1dCiAKIC8vIENIRUNLOiAgICBkZWZpbmUgaW50ZXJuYWwgdm9pZCBAIlwwMS1bVGVzdDIgc2V0VGhlQ2xhc3M6XSIoCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL2FyYy5tIGIvdGVzdC9Db2RlR2VuT2JqQy9hcmMubQppbmRleCAwMGNkYjZmLi44ZmM2OGNhIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2FyYy5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvYXJjLm0KQEAgLTE4MCw3ICsxODAsNyBAQAogICAvLyBDSEVDSy1ORVhUOiBbW0FMTE9DOiUuKl1dID0gYml0Y2FzdAogICAvLyBDSEVDSy1ORVhUOiBbW0lOSVQ6JS4qXV0gPSBjYWxsIGk4KiBiaXRjYXN0IChpOCogKGk4KiwgaTgqLCAuLi4pKiBAb2JqY19tc2dTZW5kIHRvIGk4KiAoaTgqLCBpOCosIGkzMikqKShpOCogW1tBTExPQ11dLAogCi0gIC8vIEluaXRpYWxpemF0aW9uIG9mIHJldHVybiB2YWx1ZSwgb2NjdXJpbmcgd2l0aGluIGZ1bGwtZXhwcmVzc2lvbi4KKyAgLy8gSW5pdGlhbGl6YXRpb24gb2YgcmV0dXJuIHZhbHVlLCBvY2N1cnJpbmcgd2l0aGluIGZ1bGwtZXhwcmVzc2lvbi4KICAgLy8gUmV0YWluL3JlbGVhc2UgZWxpZGVkLgogICAvLyBDSEVDSy1ORVhUOiBiaXRjYXN0CiAgIC8vIENIRUNLLU5FWFQ6IFtbSU5JVDolLipdXSA9IGJpdGNhc3QKQEAgLTU4MSwxMSArNTgxLDExIEBACiAvLyByZGFyOi8vcHJvYmxlbS8xMjQ5MjQzNAogLy8gICBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBmbGFnIHNheWluZyB0aGF0IHdlIG5lZWQgZGVzdHJ1Y3Rpb24gKmFuZCoKIC8vICAgdGhlIGZsYWcgc2F5aW5nIHRoYXQgd2UgZG9uJ3QgYWxzbyBuZWVkIGNvbnN0cnVjdGlvbi4KLS8vIENIRUNLLUdMT0JBTFM6IEAiXDAxbF9PQkpDX0NMQVNTX1JPXyRfVGVzdDIzIiA9IGludGVybmFsIGdsb2JhbCBbW1JPX1Q6JS4qXV0geyBpMzIgMzkwLAorLy8gQ0hFQ0stR0xPQkFMUzogQCJcMDFsX09CSkNfQ0xBU1NfUk9fJF9UZXN0MjMiID0gcHJpdmF0ZSBnbG9iYWwgW1tST19UOiUuKl1dIHsgaTMyIDM5MCwKIEBpbnRlcmZhY2UgVGVzdDIzIHsgaWQgeDsgfSBAZW5kCiBAaW1wbGVtZW50YXRpb24gVGVzdDIzIEBlbmQKIAotLy8gQ0hFQ0stR0xPQkFMUzogQCJcMDFsX09CSkNfQ0xBU1NfUk9fJF9UZXN0MjQiID0gaW50ZXJuYWwgZ2xvYmFsIFtbUk9fVDolLipdXSB7IGkzMiAxMzAsCisvLyBDSEVDSy1HTE9CQUxTOiBAIlwwMWxfT0JKQ19DTEFTU19ST18kX1Rlc3QyNCIgPSBwcml2YXRlIGdsb2JhbCBbW1JPX1Q6JS4qXV0geyBpMzIgMTMwLAogQGludGVyZmFjZSBUZXN0MjQge30gQGVuZAogQGltcGxlbWVudGF0aW9uIFRlc3QyNCBAZW5kCiAKQEAgLTEwMDQsNyArMTAwNCw3IEBACiBAc3ludGhlc2l6ZSB4OwogQGVuZAogLy8gQ0hFQ0s6ICAgIGRlZmluZSBpbnRlcm5hbCBpOCogQCJcMDEtW1Rlc3Q0NSB4XSIoCi0vLyBDSEVDSzogICAgICBbW0NBTEw6JS4qXV0gPSBjYWxsIGk4KiBAb2JqY19nZXRQcm9wZXJ0eSgKKy8vIENIRUNLOiAgICAgIFtbQ0FMTDolLipdXSA9IHRhaWwgY2FsbCBpOCogQG9iamNfZ2V0UHJvcGVydHkoCiAvLyBDSEVDSy1ORVhUOiByZXQgaTgqIFtbQ0FMTF1dCiAKIC8vIHJkYXI6Ly9wcm9ibGVtLzkzMTU1NTIKQEAgLTEzNTIsNyArMTM1Miw3IEBACiBAaW1wbGVtZW50YXRpb24gUGVyc29uCiBAc3ludGhlc2l6ZSBhZGRyZXNzOwogQGVuZAotLy8gQ0hFQ0s6IGNhbGwgaTgqIEBvYmpjX2dldFByb3BlcnR5CisvLyBDSEVDSzogdGFpbCBjYWxsIGk4KiBAb2JqY19nZXRQcm9wZXJ0eQogLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAb2JqY19zZXRQcm9wZXJ0eSAKIAogLy8gVmVyaWZ5IHRoYXQgd2Ugc3VjY2Vzc2Z1bGx5IHBhcnNlIGFuZCBwcmVzZXJ2ZSB0aGlzIGF0dHJpYnV0ZSBpbgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9hcm02NC1pbnQzMi1pdmFyLm0gYi90ZXN0L0NvZGVHZW5PYmpDL2FybTY0LWludDMyLWl2YXIubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjhjMzRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9hcm02NC1pbnQzMi1pdmFyLm0KQEAgLTAsMCArMSwxNyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zIC1lbWl0LWxsdm0gIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIHJkYXI6Ly8xMjYxNzc2NAorCisvLyBDSEVDSzogQCJPQkpDX0lWQVJfJF9JLklWQVIyIiA9IGdsb2JhbCBpMzIgOAorLy8gQ0hFQ0s6IEAiT0JKQ19JVkFSXyRfSS5JVkFSMSIgPSBnbG9iYWwgaTMyIDAKK0BpbnRlcmZhY2UgSQoreworCWlkIElWQVIxOworCWlkIElWQVIyOworfQorQGVuZAorCitAaW1wbGVtZW50YXRpb24gSQorLy8gQ0hFQ0s6IFtbSVZBUjolLipdXSA9IGxvYWQgaTMyKiBAIk9CSkNfSVZBUl8kX0kuSVZBUjIiCisvLyBDSEVDSzogW1tDT05WOiUuKl1dID0gc2V4dCBpMzIgW1tJVkFSXV0gdG8gaTY0CistIChpZCkgTUVUSCB7IHJldHVybiBJVkFSMjsgfQorQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9hdHRyLWNhbGxjb252Lm0gYi90ZXN0L0NvZGVHZW5PYmpDL2F0dHItY2FsbGNvbnYubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGE0MWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9hdHRyLWNhbGxjb252Lm0KQEAgLTAsMCArMSwxMyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni11bmtub3duLXVua25vd24gLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisKK0BpbnRlcmZhY2UgVGVzdAorLSAodm9pZCl0ZXN0OworQGVuZAorCitAaW1wbGVtZW50YXRpb24gVGVzdAorLSAodm9pZCl0ZXN0IF9fYXR0cmlidXRlX18oKHN0ZGNhbGwpKSB7fQorICAgIC8vIENIRUNLOiBkZWZpbmV7ey4qfX14ODZfc3RkY2FsbGNje3suKn19VGVzdCB0ZXN0CisgICAgCistICh2b2lkKXRlc3QyIF9fYXR0cmlidXRlX18oKG1zX2FiaSkpIHt9CisgICAgLy8gQ0hFQ0s6IGRlZmluZXt7Lip9fXg4Nl82NF93aW42NGNje3suKn19VGVzdCB0ZXN0MgorQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9ibG9jay12YXItbGF5b3V0Lm0gYi90ZXN0L0NvZGVHZW5PYmpDL2Jsb2NrLXZhci1sYXlvdXQubQppbmRleCAwYWQ0NGRhLi4xNzFkZjdiIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2Jsb2NrLXZhci1sYXlvdXQubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2Jsb2NrLXZhci1sYXlvdXQubQpAQCAtMTY0LDMgKzE2NCwxMSBAQAogICB9OwogIHdyYXBwZXJCbG9jaygpOwogfQorCisvLyByZGFyOi8vMTYxMTE4MzkKK3R5cGVkZWYgdW5pb24geyBjaGFyIGNoWzhdOyAgfSBTUzsKK3R5cGVkZWYgc3RydWN0IHsgU1Mgc1s0XTsgfSBDUzsKK3ZvaWQgdGVzdF91bmlvbl9pbl9sYXlvdXQoKSB7CisgIENTIGNzOworICBeeyBjczsgfTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvYmxvY2tzLm0gYi90ZXN0L0NvZGVHZW5PYmpDL2Jsb2Nrcy5tCmluZGV4IDUyNDU2NzkuLjZhZTNlOWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvYmxvY2tzLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9ibG9ja3MubQpAQCAtNjUsNyArNjUsNyBAQAogICAvLyBDSEVDSy1ORVhUOiBbW1QzOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBbW1dFQUtfVF1dKiBbW1dFQUtYXV0sIGkzMiAwLCBpMzIgMwogICAvLyBDSEVDSy1ORVhUOiBzdG9yZSBpMzIgMjgsIGkzMiogW1tUM11dCiAKLSAgLy8gQ29weSBhbmQgZGlwb3NlIGhlbHBlcnMuCisgIC8vIENvcHkgYW5kIGRpc3Bvc2UgaGVscGVycy4KICAgLy8gQ0hFQ0stTkVYVDogW1tUNDolLipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgW1tXRUFLX1RdXSogW1tXRUFLWF1dLCBpMzIgMCwgaTMyIDQKICAgLy8gQ0hFQ0stTkVYVDogc3RvcmUgaTgqIGJpdGNhc3QgKHZvaWQgKGk4KiwgaTgqKSogQF9fQmxvY2tfYnlyZWZfb2JqZWN0X2NvcHlfe3suKn19IHRvIGk4KiksIGk4KiogW1tUNF1dCiAgIC8vIENIRUNLLU5FWFQ6IFtbVDU6JS4qXV0gPSBnZXRlbGVtZW50cHRyIGluYm91bmRzIFtbV0VBS19UXV0qIFtbV0VBS1hdXSwgaTMyIDAsIGkzMiA1CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL2JveGluZy5tIGIvdGVzdC9Db2RlR2VuT2JqQy9ib3hpbmcubQppbmRleCA4N2ZmMGU3Li5lZmQyYjE2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2JveGluZy5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvYm94aW5nLm0KQEAgLTUzLDE4ICs1MywxOCBAQAogKyAoaWQpc3RyaW5nV2l0aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIgKiludWxsVGVybWluYXRlZENTdHJpbmc7CiBAZW5kCiAKLS8vIENIRUNLOiBbW1dpdGhJbnRNZXRoOkAiLioiXV0gPSBpbnRlcm5hbCBnbG9iYWwgWzE1IHggaThdIGMibnVtYmVyV2l0aEludDpcMDAiCi0vLyBDSEVDSzogW1tXaXRoSW50U0VMOkAiLioiXV0gPSBpbnRlcm5hbCBleHRlcm5hbGx5X2luaXRpYWxpemVkIGdsb2JhbCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzE1IHggaThdKiBbW1dpdGhJbnRNZXRoXV0KLS8vIENIRUNLOiBbW1dpdGhDaGFyTWV0aDpAIi4qIl1dID0gaW50ZXJuYWwgZ2xvYmFsIFsxNiB4IGk4XSBjIm51bWJlcldpdGhDaGFyOlwwMCIKLS8vIENIRUNLOiBbW1dpdGhDaGFyU0VMOkAiLioiXV0gPSBpbnRlcm5hbCBleHRlcm5hbGx5X2luaXRpYWxpemVkIGdsb2JhbCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzE2IHggaThdKiBbW1dpdGhDaGFyTWV0aF1dCi0vLyBDSEVDSzogW1tXaXRoQm9vbE1ldGg6QCIuKiJdXSA9IGludGVybmFsIGdsb2JhbCBbMTYgeCBpOF0gYyJudW1iZXJXaXRoQm9vbDpcMDAiCi0vLyBDSEVDSzogW1tXaXRoQm9vbFNFTDpAIi4qIl1dID0gaW50ZXJuYWwgZXh0ZXJuYWxseV9pbml0aWFsaXplZCBnbG9iYWwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxNiB4IGk4XSogW1tXaXRoQm9vbE1ldGhdXQotLy8gQ0hFQ0s6IFtbV2l0aEludGVnZXJNZXRoOkAiLioiXV0gPSBpbnRlcm5hbCBnbG9iYWwgWzE5IHggaThdIGMibnVtYmVyV2l0aEludGVnZXI6XDAwIgotLy8gQ0hFQ0s6IFtbV2l0aEludGVnZXJTRUw6QCIuKiJdXSA9IGludGVybmFsIGV4dGVybmFsbHlfaW5pdGlhbGl6ZWQgZ2xvYmFsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTkgeCBpOF0qIFtbV2l0aEludGVnZXJNZXRoXV0KLS8vIENIRUNLOiBbW1dpdGhVbnNpZ25lZEludGVnZXJNZXRoOkAiLioiXV0gPSBpbnRlcm5hbCBnbG9iYWwgWzI3IHggaThdIGMibnVtYmVyV2l0aFVuc2lnbmVkSW50ZWdlcjpcMDAiCi0vLyBDSEVDSzogW1tXaXRoVW5zaWduZWRJbnRlZ2VyU0VMOkAiLioiXV0gPSBpbnRlcm5hbCBleHRlcm5hbGx5X2luaXRpYWxpemVkIGdsb2JhbCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzI3IHggaThdKiBbW1dpdGhVbnNpZ25lZEludGVnZXJNZXRoXV0KLS8vIENIRUNLOiBbW3N0cmluZ1dpdGhVVEY4U3RyaW5nTWV0aDpAIi4qIl1dID0gaW50ZXJuYWwgZ2xvYmFsIFsyMiB4IGk4XSBjInN0cmluZ1dpdGhVVEY4U3RyaW5nOlwwMCIKLS8vIENIRUNLOiBbW3N0cmluZ1dpdGhVVEY4U3RyaW5nU0VMOkAiLioiXV0gPSBpbnRlcm5hbCBleHRlcm5hbGx5X2luaXRpYWxpemVkIGdsb2JhbCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzIyIHggaThdKiBbW3N0cmluZ1dpdGhVVEY4U3RyaW5nTWV0aF1dCisvLyBDSEVDSzogW1tXaXRoSW50TWV0aDpAIi4qIl1dID0gcHJpdmF0ZSBnbG9iYWwgWzE1IHggaThdIGMibnVtYmVyV2l0aEludDpcMDAiCisvLyBDSEVDSzogW1tXaXRoSW50U0VMOkAiLioiXV0gPSBwcml2YXRlIGV4dGVybmFsbHlfaW5pdGlhbGl6ZWQgZ2xvYmFsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTUgeCBpOF0qIFtbV2l0aEludE1ldGhdXQorLy8gQ0hFQ0s6IFtbV2l0aENoYXJNZXRoOkAiLioiXV0gPSBwcml2YXRlIGdsb2JhbCBbMTYgeCBpOF0gYyJudW1iZXJXaXRoQ2hhcjpcMDAiCisvLyBDSEVDSzogW1tXaXRoQ2hhclNFTDpAIi4qIl1dID0gcHJpdmF0ZSBleHRlcm5hbGx5X2luaXRpYWxpemVkIGdsb2JhbCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzE2IHggaThdKiBbW1dpdGhDaGFyTWV0aF1dCisvLyBDSEVDSzogW1tXaXRoQm9vbE1ldGg6QCIuKiJdXSA9IHByaXZhdGUgZ2xvYmFsIFsxNiB4IGk4XSBjIm51bWJlcldpdGhCb29sOlwwMCIKKy8vIENIRUNLOiBbW1dpdGhCb29sU0VMOkAiLioiXV0gPSBwcml2YXRlIGV4dGVybmFsbHlfaW5pdGlhbGl6ZWQgZ2xvYmFsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTYgeCBpOF0qIFtbV2l0aEJvb2xNZXRoXV0KKy8vIENIRUNLOiBbW1dpdGhJbnRlZ2VyTWV0aDpAIi4qIl1dID0gcHJpdmF0ZSBnbG9iYWwgWzE5IHggaThdIGMibnVtYmVyV2l0aEludGVnZXI6XDAwIgorLy8gQ0hFQ0s6IFtbV2l0aEludGVnZXJTRUw6QCIuKiJdXSA9IHByaXZhdGUgZXh0ZXJuYWxseV9pbml0aWFsaXplZCBnbG9iYWwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxOSB4IGk4XSogW1tXaXRoSW50ZWdlck1ldGhdXQorLy8gQ0hFQ0s6IFtbV2l0aFVuc2lnbmVkSW50ZWdlck1ldGg6QCIuKiJdXSA9IHByaXZhdGUgZ2xvYmFsIFsyNyB4IGk4XSBjIm51bWJlcldpdGhVbnNpZ25lZEludGVnZXI6XDAwIgorLy8gQ0hFQ0s6IFtbV2l0aFVuc2lnbmVkSW50ZWdlclNFTDpAIi4qIl1dID0gcHJpdmF0ZSBleHRlcm5hbGx5X2luaXRpYWxpemVkIGdsb2JhbCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzI3IHggaThdKiBbW1dpdGhVbnNpZ25lZEludGVnZXJNZXRoXV0KKy8vIENIRUNLOiBbW3N0cmluZ1dpdGhVVEY4U3RyaW5nTWV0aDpAIi4qIl1dID0gcHJpdmF0ZSBnbG9iYWwgWzIyIHggaThdIGMic3RyaW5nV2l0aFVURjhTdHJpbmc6XDAwIgorLy8gQ0hFQ0s6IFtbc3RyaW5nV2l0aFVURjhTdHJpbmdTRUw6QCIuKiJdXSA9IHByaXZhdGUgZXh0ZXJuYWxseV9pbml0aWFsaXplZCBnbG9iYWwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsyMiB4IGk4XSogW1tzdHJpbmdXaXRoVVRGOFN0cmluZ01ldGhdXQogCiBpbnQgbWFpbigpIHsKICAgLy8gQ0hFQ0s6IGxvYWQgaTgqKiBbW1dpdGhJbnRTRUxdXQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9jb21wbGV4LXByb3BlcnR5Lm0gYi90ZXN0L0NvZGVHZW5PYmpDL2NvbXBsZXgtcHJvcGVydHkubQppbmRleCBkNjVkNzJmLi5iZWQwY2E2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2NvbXBsZXgtcHJvcGVydHkubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2NvbXBsZXgtcHJvcGVydHkubQpAQCAtMTMsOCArMTMsOCBAQAogICBhLnkgKz0gYTE7CiB9CiAKLS8vIENIRUNLLUxQNjQ6IGludGVybmFsIGdsb2JhbCBbMTMgeCBpOF0gYyJDT01QTEVYX1BST1AKLS8vIENIRUNLLUxQNjQ6IGludGVybmFsIGdsb2JhbCBbMTcgeCBpOF0gYyJzZXRDT01QTEVYX1BST1AKKy8vIENIRUNLLUxQNjQ6IHByaXZhdGUgZ2xvYmFsIFsxMyB4IGk4XSBjIkNPTVBMRVhfUFJPUAorLy8gQ0hFQ0stTFA2NDogcHJpdmF0ZSBnbG9iYWwgWzE3IHggaThdIGMic2V0Q09NUExFWF9QUk9QCiAKIC8vIHJkYXI6IC8vIDczNTExNDcKIEBpbnRlcmZhY2UgQgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9jb25zdGFudC1zdHJpbmdzLm0gYi90ZXN0L0NvZGVHZW5PYmpDL2NvbnN0YW50LXN0cmluZ3MubQppbmRleCBjYWQ2MzRhLi4wYTY1NDk2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2NvbnN0YW50LXN0cmluZ3MubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2NvbnN0YW50LXN0cmluZ3MubQpAQCAtMyw3ICszLDcgQEAKIAogLy8gQ2hlY2sgdGhhdCB3ZSBzZXQgYWxpZ25tZW50IDEgb24gdGhlIHN0cmluZy4KIC8vCi0vLyBDSEVDSy1ORVhUOiBALnN0ciA9IHt7Lip9fWNvbnN0YW50IFsxMyB4IGk4XSBjIkhlbGxvIFdvcmxkIVwwMCIsIGFsaWduIDEKKy8vIENIRUNLLU5FWFQ6IEAuc3RyID0ge3suKn19Y29uc3RhbnQgWzEzIHggaThdIGMiSGVsbG8gV29ybGQhXDAwIiwgc2VjdGlvbiAiX19URVhULF9fY3N0cmluZyxjc3RyaW5nX2xpdGVyYWxzIiwgYWxpZ24gMQogCiAvLyBSVU46ICVjbGFuZ19jYzEgLWZvYmpjLXJ1bnRpbWU9Z2NjIC1lbWl0LWxsdm0gLW8gJXQgJXMKIC8vIFJVTjogRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUdOVSA8ICV0ICVzCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tYmxvY2staGVscGVyLm0gYi90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tYmxvY2staGVscGVyLm0KaW5kZXggNDljOGM1ZC4uMTQwMzMyNyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLWJsb2NrLWhlbHBlci5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1ibG9jay1oZWxwZXIubQpAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiB4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1mYmxvY2tzIC1nIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1mb2JqYy1ydW50aW1lPW1hY29zeC1mcmFnaWxlLTEwLjUgJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogZXh0ZXJuIHZvaWQgZm9vKHZvaWQoXikodm9pZCkpOwogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tYmxvY2stbGluZS5tIGIvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLWJsb2NrLWxpbmUubQppbmRleCAxOTY1ZTFkLi45YmEyMmJjIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tYmxvY2stbGluZS5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1ibG9jay1saW5lLm0KQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogeDg2LTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtZmJsb2NrcyAtZm9iamMtYXJjIC1nIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gcmRhcjovLzExNTYyMTE3CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tY2xhc3MtZXh0ZW5zaW9uLm0gYi90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tY2xhc3MtZXh0ZW5zaW9uLm0KaW5kZXggZTE1NzNmMC4uMGQxYjcyMCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLWNsYXNzLWV4dGVuc2lvbi5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1jbGFzcy1leHRlbnNpb24ubQpAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtbWFzbS12ZXJib3NlIC1TIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIEZJWE1FOiBDaGVjayBJUiByYXRoZXIgdGhhbiBhc20sIHRoZW4gdHJpcGxlIGlzIG5vdCBuZWVkZWQuCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1tYXNtLXZlcmJvc2UgLVMgLWcgJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSzogQVRfQVBQTEVfb2JqY19jb21wbGV0ZV90eXBlCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1jbGFzcy1leHRlbnNpb24yLm0gYi90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tY2xhc3MtZXh0ZW5zaW9uMi5tCmluZGV4IGJhZTEyZGMuLjM4MzM5MGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1jbGFzcy1leHRlbnNpb24yLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLWNsYXNzLWV4dGVuc2lvbjIubQpAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAgLW1hc20tdmVyYm9zZSAtUyAtZyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBGSVhNRTogQ2hlY2sgSVIgcmF0aGVyIHRoYW4gYXNtLCB0aGVuIHRyaXBsZSBpcyBub3QgbmVlZGVkLgorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtbWFzbS12ZXJib3NlIC1TIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIC8vIENIRUNLOiBBVF9BUFBMRV9vYmpjX2NvbXBsZXRlX3R5cGUKIAogQGludGVyZmFjZSBGb28ge30gQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLWNyYXNoLTIubSBiL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1jcmFzaC0yLm0KaW5kZXggN2QwNWY1My4uOWU4MDU4MCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLWNyYXNoLTIubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tY3Jhc2gtMi5tCkBAIC0xLDUgKzEsNSBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjExIC1nIC1TICVzIC1vIC0KLS8vIFJFUVVJUkVTOiB4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQKIAogQGNsYXNzIEJhcjsKIEBpbnRlcmZhY2UgRm9vCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tZ2V0dGVyLW5hbWUubSBiL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1nZXR0ZXItbmFtZS5tCmluZGV4IDM5MzlmMzUuLjcwZDk5MzYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1nZXR0ZXItbmFtZS5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1nZXR0ZXItbmFtZS5tCkBAIC0xLDQgKzEsNCBAQAotLy8gUkVRVUlSRVM6IHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IHg4Ni1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZleGNlcHRpb25zIC1mb2JqYy1leGNlcHRpb25zIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0s6IHt7Lip9fSwgbWV0YWRhdGEgISItW0luc3RhbmNlVmFyaWFibGVzRXZlcnl3aGVyZUJ1dFRoZUludGVyZmFjZSBzb21lU3RyaW5nXSIsIHt7Lip9fX0gOyBbIERXX1RBR19zdWJwcm9ncmFtIF0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1saWZldGltZS1jcmFzaC5tIGIvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLWxpZmV0aW1lLWNyYXNoLm0KaW5kZXggOTAzODIwMS4uODFjN2ZiYyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLWxpZmV0aW1lLWNyYXNoLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLWxpZmV0aW1lLWNyYXNoLm0KQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWNjMSAtdHJpcGxlIGFybS1hcHBsZS1pb3MgLWVtaXQtbGx2bSAtZyAtZmJsb2NrcyAtZm9iamMtcnVudGltZT1pb3MtNy4wLjAgLWZvYmpjLWFyYyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm0tYXBwbGUtaW9zIC1lbWl0LWxsdm0gLWcgLWZibG9ja3MgLWZvYmpjLXJ1bnRpbWU9aW9zLTcuMC4wIC1mb2JqYy1hcmMgJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogLy8gcmRhcjovL3Byb2JsZW0vMTQ5OTA2NTYKIEBwcm90b2NvbCBOU09iamVjdAogLSAoaWQpY29weTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1wcm9wZXJ0eS5tIGIvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLXByb3BlcnR5Lm0KaW5kZXggZGQxMDVhNS4uNmUyZGNkYSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLXByb3BlcnR5Lm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLXByb3BlcnR5Lm0KQEAgLTEsNCArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLW1hc20tdmVyYm9zZSAtUyAtZyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBGSVhNRTogQ2hlY2sgSVIgcmF0aGVyIHRoYW4gYXNtLCB0aGVuIHRyaXBsZSBpcyBub3QgbmVlZGVkLgorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtbWFzbS12ZXJib3NlIC1TIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0s6IEFUX0FQUExFX3Byb3BlcnR5X25hbWUKIC8vIENIRUNLOiBBVF9BUFBMRV9wcm9wZXJ0eV9hdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1wcm9wZXJ0eTIubSBiL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1wcm9wZXJ0eTIubQppbmRleCA0Y2Q3NmMxLi40MTE0MGRjIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tcHJvcGVydHkyLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLXByb3BlcnR5Mi5tCkBAIC0xLDQgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1tYXNtLXZlcmJvc2UgLVMgLWcgJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gRklYTUU6IENoZWNrIElSIHJhdGhlciB0aGFuIGFzbSwgdGhlbiB0cmlwbGUgaXMgbm90IG5lZWRlZC4KKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLW1hc20tdmVyYm9zZSAtUyAtZyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIC8vIENIRUNLOiBBVF9BUFBMRV9wcm9wZXJ0eV9uYW1lCiBAaW50ZXJmYWNlIEMgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLXByb3BlcnR5NC5tIGIvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLXByb3BlcnR5NC5tCmluZGV4IDcxODYzYTYuLjIwNTdkNGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1wcm9wZXJ0eTQubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tcHJvcGVydHk0Lm0KQEAgLTEsNCArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLW1hc20tdmVyYm9zZSAtUyAtZyAlcyAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBGSVhNRTogQ2hlY2sgSVIgcmF0aGVyIHRoYW4gYXNtLCB0aGVuIHRyaXBsZSBpcyBub3QgbmVlZGVkLgorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtbWFzbS12ZXJib3NlIC1TIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0s6IEFUX0FQUExFX3Byb3BlcnR5X25hbWUKIC8vIENIRUNLLU5PVDogQVRfQVBQTEVfcHJvcGVydHlfZ2V0dGVyCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tcHJvcGVydHk1Lm0gYi90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tcHJvcGVydHk1Lm0KaW5kZXggMjcyYWE1ZC4uMTI2ZDBhMiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLXByb3BlcnR5NS5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1wcm9wZXJ0eTUubQpAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtbWFzbS12ZXJib3NlIC1TIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIEZJWE1FOiBDaGVjayBJUiByYXRoZXIgdGhhbiBhc20sIHRoZW4gdHJpcGxlIGlzIG5vdCBuZWVkZWQuCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1tYXNtLXZlcmJvc2UgLVMgLWcgJXMgLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSzogQVRfQVBQTEVfcHJvcGVydHlfbmFtZQogLy8gQ0hFQ0s6IEFUX0FQUExFX3Byb3BlcnR5X2dldHRlcgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLXB1YnR5cGVzLm0gYi90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tcHVidHlwZXMubQppbmRleCA4YjdkZmFkLi44NDViOTQ2IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tcHVidHlwZXMubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tcHVidHlwZXMubQpAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiB4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZyAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0s6IHt7Lip9fSBbIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSBdIFtIXSBbbGluZSA2LApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLXNlbGYubSBiL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctaW5mby1zZWxmLm0KaW5kZXggOGNiYzAyOS4uN2E0ODRkOCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1pbmZvLXNlbGYubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLWluZm8tc2VsZi5tCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLWcgJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIC8vIHNlbGYgYW5kIF9jbWQgYXJlIG1hcmtlZCBhcyBEV19BVF9hcnRpZmljaWFsLiAKIC8vIG15YXJnIGlzIG5vdCBtYXJrZWQgYXMgRFdfQVRfYXJ0aWZpY2lhbC4KIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1wcm9wZXJ0eS1zeW50aC5tIGIvdGVzdC9Db2RlR2VuT2JqQy9kZWJ1Zy1wcm9wZXJ0eS1zeW50aC5tCmluZGV4IDk1NDYyMGEuLjY4ZmI5NTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvZGVidWctcHJvcGVydHktc3ludGgubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2RlYnVnLXByb3BlcnR5LXN5bnRoLm0KQEAgLTEsOCArMSwyNyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1tYXNtLXZlcmJvc2UgLVMgLWcgJXMgLW8gLSB8IEZpbGVDaGVjayAlcwotLy8gUmFkYXIgOTQ2ODUyNgorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1nICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIHJkYXI6Ly9wcm9ibGVtLzk0Njg1MjYKKy8vCisvLyBTZXR0aW5nIGEgYnJlYWtwb2ludCBvbiBhIHByb3BlcnR5IHNob3VsZCBjcmVhdGUgYnJlYWtwb2ludHMgaW4KKy8vIHN5bnRoZXNpemVkIGdldHRlcnMvc2V0dGVycy4KKy8vCiBAaW50ZXJmYWNlIEkgewogICBpbnQgX3AxOwogfQorLy8gVGVzdCB0aGF0IHRoZSBsaW5ldGFibGUgZW50cmllcyBmb3IgdGhlIHN5bnRoZXNpemVkIGdldHRlciBhbmQKKy8vIHNldHRlciBhcmUgY29ycmVjdC4KKy8vCisvLyBDSEVDSzogZGVmaW5lIHt7Lip9fVtJIHAxXQorLy8gQ0hFQ0stTk9UOiByZXQKKy8vIENIRUNLOiBsb2FkIHt7Lip9fSwgIWRiZyAhW1tEQkcxOlswLTldK11dCisvLworLy8gQ0hFQ0s6IGRlZmluZSB7ey4qfX1bSSBzZXRQMTpdCisvLyBDSEVDSy1OT1Q6IHJldAorLy8gQ0hFQ0s6IGxvYWQge3suKn19LCAhZGJnICFbW0RCRzI6WzAtOV0rXV0KKy8vCisvLyBDSEVDSzogWyBEV19UQUdfc3VicHJvZ3JhbSBdIFtsaW5lIFtbQExJTkUrNF1dXSBbbG9jYWxdIFtkZWZdIFstW0kgcDFdXQorLy8gQ0hFQ0s6IFsgRFdfVEFHX3N1YnByb2dyYW0gXSBbbGluZSBbW0BMSU5FKzNdXV0gW2xvY2FsXSBbZGVmXSBbLVtJIHNldFAxOl1dCisvLyBDSEVDSzogIVtbREJHMV1dID0gbWV0YWRhdGEgIXtpMzIgW1tATElORSsyXV0sCisvLyBDSEVDSzogIVtbREJHMl1dID0gbWV0YWRhdGEgIXtpMzIgW1tATElORSsxXV0sCiBAcHJvcGVydHkgaW50IHAxOwogQGVuZAogCkBAIC0xMyw4ICszMiw1IEBACiBpbnQgbWFpbigpIHsKICAgSSAqbXlpOwogICBteWkucDEgPSAyOwotICByZXR1cm4gMDsKKyAgcmV0dXJuIG15aS5wMTsKIH0KLQotLy8gRklYTUU6IE1ha2UgdGhpcyB0ZXN0IGlyIGZpbGVzLgotLy8gQ0hFQ0s6ICAgICAgIC5sb2MgICAgMiA2IDAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvZW5jb2RlLWNzdHlsZS1tZXRob2QubSBiL3Rlc3QvQ29kZUdlbk9iakMvZW5jb2RlLWNzdHlsZS1tZXRob2QubQppbmRleCAzMDkwODliLi5kMGE5OTIxIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2VuY29kZS1jc3R5bGUtbWV0aG9kLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9lbmNvZGUtY3N0eWxlLW1ldGhvZC5tCkBAIC04LDQgKzgsNCBAQAogQGltcGxlbWVudGF0aW9uIEZvbwogLSAoaWQpdGVzdDooaWQgKW9uZSwgaWQgdHdvIHtyZXR1cm4gdHdvOyB9IEBlbmQKIAotLy8gQ0hFQ0stTFA2NDogaW50ZXJuYWwgZ2xvYmFsIFsxMSB4IGk4XSBjIkAyNEAwOjhAMTYKKy8vIENIRUNLLUxQNjQ6IHByaXZhdGUgZ2xvYmFsIFsxMSB4IGk4XSBjIkAyNEAwOjhAMTYKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvZW5jb2RlLXRlc3QtNi5tIGIvdGVzdC9Db2RlR2VuT2JqQy9lbmNvZGUtdGVzdC02Lm0KaW5kZXggYjdiMzc5OS4uNTRhNGViMCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9lbmNvZGUtdGVzdC02Lm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9lbmNvZGUtdGVzdC02Lm0KQEAgLTE0LDggKzE0LDggQEAKIC0odm9pZClmb286KFopYTogKGNoYXIqKWIgOiAoWiljIDogKGRvdWJsZSkgZCB7fQogQGVuZAogCi0vLyBDSEVDSzogaW50ZXJuYWwgZ2xvYmFsIFsxNCB4IGk4XSBjInYxNkAwOjh7Pz19MTYKLS8vIENIRUNLOiBpbnRlcm5hbCBnbG9iYWwgWzI2IHggaThdIGMidjMyQDA6OHs/PX0xNioxNns/PX0yNGQyNAorLy8gQ0hFQ0s6IHByaXZhdGUgZ2xvYmFsIFsxNCB4IGk4XSBjInYxNkAwOjh7Pz19MTYKKy8vIENIRUNLOiBwcml2YXRlIGdsb2JhbCBbMjYgeCBpOF0gYyJ2MzJAMDo4ez89fTE2KjE2ez89fTI0ZDI0CiAKIAogLy8gcmRhcjovLzEzMTkwMDk1CkBAIC0zNCw3ICszNCw3IEBACiBAc3ludGhlc2l6ZSBwcm9wZXJ0eSA9IF9wcm9wZXJ0eTsKIEBlbmQKIAotLy8gQ0hFQ0s6IGludGVybmFsIGdsb2JhbCBbMjQgeCBpOF0gYyJee0JBQnVnRXhhbXBsZT1AfTE2CisvLyBDSEVDSzogcHJpdmF0ZSBnbG9iYWwgWzI0IHggaThdIGMiXntCQUJ1Z0V4YW1wbGU9QH0xNgogCiAvLyByZGFyOi8vMTQ0MDgyNDQKIEBjbGFzcyBTQ05DYW1lcmE7CkBAIC01Miw0ICs1Miw0IEBACiAgICAgQzNEQ2FtZXJhU3RvcmFnZSBfc3RvcmFnZTsKIH0KIEBlbmQKLS8vIENIRUNLOiBpbnRlcm5hbCBnbG9iYWwgWzM5IHggaThdIGMiez89XDIycHJlc2VudGF0aW9uSW5zdGFuY2VcMjJee1NDTkNhbWVyYX19XDAwIgorLy8gQ0hFQ0s6IHByaXZhdGUgZ2xvYmFsIFszOSB4IGk4XSBjIns/PVwyMnByZXNlbnRhdGlvbkluc3RhbmNlXDIyXntTQ05DYW1lcmF9fVwwMCIKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvZW5jb2RlLXRlc3QubSBiL3Rlc3QvQ29kZUdlbk9iakMvZW5jb2RlLXRlc3QubQppbmRleCBkNmU3YjZkLi42ZjI0MjNiIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2VuY29kZS10ZXN0Lm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9lbmNvZGUtdGVzdC5tCkBAIC0xLDcgKzEsNyBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1hcHBsZS1kYXJ3aW45IC1mb2JqYy1ydW50aW1lPW1hY29zeC1mcmFnaWxlLTEwLjUgLWVtaXQtbGx2bSAtbyAldCAlcwogLy8gUlVOOiBGaWxlQ2hlY2sgPCAldCAlcwogLy8KLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19NRVRIX1ZBUl9UWVBFXzM0IiA9IGludGVybmFsIGdsb2JhbCBbMTYgeCBpOF0gYyJ2MTJAMDo0WzNbNEBdXThcMDAiCisvLyBDSEVDSzogQCJcMDFMX09CSkNfTUVUSF9WQVJfVFlQRV8zNCIgPSBwcml2YXRlIGdsb2JhbCBbMTYgeCBpOF0gYyJ2MTJAMDo0WzNbNEBdXThcMDAiCiAKIEBjbGFzcyBJbnQxOwogCkBAIC0xNjksMyArMTY5LDExIEBACiAvLyBQUjE0NjI4CiAvLyBDSEVDSzogQGcxMiA9IGNvbnN0YW50IFszIHggaThdIGMiQWlcMDAiCiBjb25zdCBjaGFyIGcxMltdID0gQGVuY29kZShfQXRvbWljKGludCkpOworCisvLyByZGFyOi8vMTU4MjQ3NjkKK2lkIHRlc3RfaWQgPSAwOworQ2xhc3MgdGVzdF9jbGFzcyA9IDA7Citjb25zdCBjaGFyIGcxM1tdID0gQGVuY29kZShfX3R5cGVvZl9fKCp0ZXN0X2NsYXNzKSk7Citjb25zdCBjaGFyIGcxNFtdID0gQGVuY29kZShfX3R5cGVvZl9fKCp0ZXN0X2lkKSk7CisvLyBDSEVDSzogY29uc3RhbnQgWzE0IHggaThdIGMie29iamNfY2xhc3M9fVwwMCIKKy8vIENIRUNLOiBjb25zdGFudCBbMTUgeCBpOF0gYyJ7b2JqY19vYmplY3Q9fVwwMCIKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvZXh0ZXJuYWxseS1pbml0aWFsaXplZC1zZWxlY3RvcnMubSBiL3Rlc3QvQ29kZUdlbk9iakMvZXh0ZXJuYWxseS1pbml0aWFsaXplZC1zZWxlY3RvcnMubQppbmRleCA4N2E3YzA0Li4wYjdjMjRlIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2V4dGVybmFsbHktaW5pdGlhbGl6ZWQtc2VsZWN0b3JzLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9leHRlcm5hbGx5LWluaXRpYWxpemVkLXNlbGVjdG9ycy5tCkBAIC0xLDcgKzEsNyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1jYzEgLWZvYmpjLXJ1bnRpbWU9bWFjb3N4LWZyYWdpbGUtMTAuNSAtbyAtIC1lbWl0LWxsdm0gJXMgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtY2MxIC1vIC0gLWVtaXQtbGx2bSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mb2JqYy1ydW50aW1lPW1hY29zeC1mcmFnaWxlLTEwLjUgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCiAKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19TRUxFQ1RPUl9SRUZFUkVOQ0VTXyIgPSBpbnRlcm5hbCBleHRlcm5hbGx5X2luaXRpYWxpemVkIGdsb2JhbAorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX1NFTEVDVE9SX1JFRkVSRU5DRVNfIiA9IHByaXZhdGUgZXh0ZXJuYWxseV9pbml0aWFsaXplZCBnbG9iYWwKIAogdm9pZCB0ZXN0KGlkIHgpIHsKICAgW3ggZG9Tb21ldGhpbmddOwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9mb3J3YXJkLXByb3RvY29sLW1ldGFkYXRhLXN5bWJvbHMubSBiL3Rlc3QvQ29kZUdlbk9iakMvZm9yd2FyZC1wcm90b2NvbC1tZXRhZGF0YS1zeW1ib2xzLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2ODdkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvZm9yd2FyZC1wcm90b2NvbC1tZXRhZGF0YS1zeW1ib2xzLm0KQEAgLTAsMCArMSwyNiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLXggb2JqZWN0aXZlLWMgJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gcmRhcjovLzE2MjAzMTE1CisKK0BpbnRlcmZhY2UgTlNPYmplY3QgQGVuZAorCitAcHJvdG9jb2wgUDA7CisKK0BpbnRlcmZhY2UgQSA6IE5TT2JqZWN0IDxQMD4KKysoQ2xhc3MpIGdldENsYXNzOworQGVuZAorCitAaW1wbGVtZW50YXRpb24gQQorKyhDbGFzcykgZ2V0Q2xhc3MgeyByZXR1cm4gc2VsZjsgfQorQGVuZAorCitpbnQgbWFpbigpIHsKKyAgUHJvdG9jb2wgKlAwID0gQHByb3RvY29sKFAwKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIENIRUNLOiBAIlwwMWxfT0JKQ19QUk9UT0NPTF8kX1AwIiA9IHdlYWsgaGlkZGVuIGdsb2JhbAorLy8gQ0hFQ0s6IEAiXDAxbF9PQkpDX0NMQVNTX1BST1RPQ09MU18kX0EiID0gcHJpdmF0ZSBnbG9iYWwKKy8vIENIRUNLOiBAIlwwMWxfT0JKQ19MQUJFTF9QUk9UT0NPTF8kX1AwIiA9IHdlYWsgaGlkZGVuIGdsb2JhbAorLy8gQ0hFQ0s6IEAiXDAxbF9PQkpDX1BST1RPQ09MX1JFRkVSRU5DRV8kX1AwIiA9IHdlYWsgaGlkZGVuIGdsb2JhbAorCisvLyBDSEVDSzogbGx2bS5jb21waWxlci51c2VkID0gYXBwZW5kaW5nIGdsb2JhbCBbMTAgeCBpOCpdIHt7W14iXSp9fSJcMDFMX09CSkNfQ0xBU1NfTkFNRV8ie3tbXiJdKn19IlwwMUxfT0JKQ19NRVRIX1ZBUl9OQU1FXyJ7e1teIl0qfX0iXDAxTF9PQkpDX01FVEhfVkFSX1RZUEVfInt7W14iXSp9fSJcMDFsX09CSkNfJF9DTEFTU19NRVRIT0RTX0Eie3tbXiJdKn19IlwwMWxfT0JKQ19DTEFTU19QUk9UT0NPTFNfJF9BInt7W14iXSp9fSJcMDFMX09CSkNfQ0xBU1NfTkFNRV8xInt7W14iXSp9fSJcMDFsX09CSkNfUFJPVE9DT0xfJF9QMCJ7e1teIl0qfX0iXDAxbF9PQkpDX0xBQkVMX1BST1RPQ09MXyRfUDAie3tbXiJdKn19IlwwMWxfT0JKQ19QUk9UT0NPTF9SRUZFUkVOQ0VfJF9QMCJ7e1teIl0qfX0iXDAxTF9PQkpDX0xBQkVMX0NMQVNTXyQie3tbXiJdKn19IHNlY3Rpb24gImxsdm0ubWV0YWRhdGEiCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL2dldHRlci1wcm9wZXJ0eS1taXNtYXRjaC5tIGIvdGVzdC9Db2RlR2VuT2JqQy9nZXR0ZXItcHJvcGVydHktbWlzbWF0Y2gubQppbmRleCAyMWVkNmVlLi5mZTQxNWQ1IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2dldHRlci1wcm9wZXJ0eS1taXNtYXRjaC5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvZ2V0dGVyLXByb3BlcnR5LW1pc21hdGNoLm0KQEAgLTEzLDcgKzEzLDcgQEAKIEBzeW50aGVzaXplIGZpbGVuYW1lc1RvU2VydmVyTG9jYXRpb249X2ZpbGVuYW1lc1RvU2VydmVyTG9jYXRpb247CiBAZW5kCiAKLS8vIENIRUNLOiAgW1tDQUxMOiUuKl1dID0gY2FsbCBpOCogQG9iamNfZ2V0UHJvcGVydHkKKy8vIENIRUNLOiAgW1tDQUxMOiUuKl1dID0gdGFpbCBjYWxsIGk4KiBAb2JqY19nZXRQcm9wZXJ0eQogLy8gQ0hFQ0s6ICBbW09ORTolLipdXSA9IGJpdGNhc3QgaTgqIFtbQ0FMTDolLipdXSB0byBbW1QxOiUuKl1dKgogLy8gQ0hFQ0s6ICBbW1RXTzolLipdXSA9IGJpdGNhc3QgW1tUMV1dKiBbW09ORV1dIHRvIFtbVDI6JS4qXV0qCiAvLyBDSEVDSzogIHJldCBbW1QyXV0qIFtbVFdPXV0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvaW5zdGFuY2UtbWV0aG9kLW1ldGFkYXRhLm0gYi90ZXN0L0NvZGVHZW5PYmpDL2luc3RhbmNlLW1ldGhvZC1tZXRhZGF0YS5tCmluZGV4IDBkOGMwZTAuLjU5YmU0NDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvaW5zdGFuY2UtbWV0aG9kLW1ldGFkYXRhLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9pbnN0YW5jZS1tZXRob2QtbWV0YWRhdGEubQpAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiB4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtUyAtbyAldCAlcyAKIC8vIFJVTjogRmlsZUNoZWNrIDwgJXQgJXMKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9pbnRlcmZhY2UtbGF5b3V0LTY0Lm0gYi90ZXN0L0NvZGVHZW5PYmpDL2ludGVyZmFjZS1sYXlvdXQtNjQubQppbmRleCA0YjQxY2Y4Li40NTAzMDBkIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL2ludGVyZmFjZS1sYXlvdXQtNjQubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2ludGVyZmFjZS1sYXlvdXQtNjQubQpAQCAtMiwyNCArMiwyNCBAQAogCiAvLyBDSEVDSzogQCJPQkpDX0lWQVJfJF9JMy5faXYyIiA9IGdsb2JhbCBpNjQgOCwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfaXZhciIsIGFsaWduIDgKIC8vIENIRUNLOiBAIk9CSkNfSVZBUl8kX0kzLl9pdjMiID0gZ2xvYmFsIGk2NCAxMiwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfaXZhciIsIGFsaWduIDgKLS8vIENIRUNLOiBfT0JKQ19DTEFTU19ST18kX0kzIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0geyBpMzIgMCwgaTMyIDgsIGkzMiAxMworLy8gQ0hFQ0s6IF9PQkpDX0NMQVNTX1JPXyRfSTMiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IHsgaTMyIDAsIGkzMiA4LCBpMzIgMTMKIC8vIENIRUNLOiBAIk9CSkNfSVZBUl8kX0k0Ll9pdjQiID0gZ2xvYmFsIGk2NCAxMywgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfaXZhciIsIGFsaWduIDgKLS8vIENIRUNLOiBfT0JKQ19DTEFTU19ST18kX0k0IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0geyBpMzIgMCwgaTMyIDEzLCBpMzIgMTQsIHt7Lip9fQorLy8gQ0hFQ0s6IF9PQkpDX0NMQVNTX1JPXyRfSTQiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IHsgaTMyIDAsIGkzMiAxMywgaTMyIDE0LCB7ey4qfX0KIC8vIENIRUNLOiBAIk9CSkNfSVZBUl8kX0k1Ll9pdjZfc3ludGgiID0gaGlkZGVuIGdsb2JhbCBpNjQgMTYsIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2l2YXIiLCBhbGlnbiA4CiAvLyBDSEVDSzogQCJPQkpDX0lWQVJfJF9JNS5faXY3X3N5bnRoIiA9IGhpZGRlbiBnbG9iYWwgaTY0IDIwLCBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19pdmFyIiwgYWxpZ24gOAogLy8gQ0hFQ0s6IEAiT0JKQ19JVkFSXyRfSTUuX2l2NSIgPSBnbG9iYWwgaTY0IDE0LCBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19pdmFyIiwgYWxpZ24gOAotLy8gQ0hFQ0s6IF9PQkpDX0NMQVNTX1JPXyRfSTUiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSB7IGkzMiAwLCBpMzIgMTQsIGkzMiAyNCwge3suKn19CisvLyBDSEVDSzogX09CSkNfQ0xBU1NfUk9fJF9JNSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0geyBpMzIgMCwgaTMyIDE0LCBpMzIgMjQsIHt7Lip9fQogLy8gQ0hFQ0s6IEAiT0JKQ19JVkFSXyRfSTYuaXYwIiA9IGdsb2JhbCBpNjQgMCwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfaXZhciIsIGFsaWduIDgKLS8vIENIRUNLOiBfT0JKQ19DTEFTU19ST18kX0k2IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0geyBpMzIgMiwgaTMyIDAsIGkzMiAxLCB7ey4qfX0KKy8vIENIRUNLOiBfT0JKQ19DTEFTU19ST18kX0k2IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSB7IGkzMiAyLCBpMzIgMCwgaTMyIDEsIHt7Lip9fQogLy8gQ0hFQ0s6IEAiT0JKQ19JVkFSXyRfSTguYiIgPSBnbG9iYWwgaTY0IDgsIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2l2YXIiLCBhbGlnbiA4Ci0vLyBDSEVDSzogX09CSkNfQ0xBU1NfUk9fJF9JOCIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IHsgaTMyIDAsIGkzMiA4LCBpMzIgMTYsIHt7Lip9fQorLy8gQ0hFQ0s6IF9PQkpDX0NMQVNTX1JPXyRfSTgiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IHsgaTMyIDAsIGkzMiA4LCBpMzIgMTYsIHt7Lip9fQogLy8gQ0hFQ0s6IEAiT0JKQ19JVkFSXyRfSTkuaXYwIiA9IGdsb2JhbCBpNjQgMCwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfaXZhciIsIGFsaWduIDgKLS8vIENIRUNLOiBfT0JKQ19DTEFTU19ST18kX0k5IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0geyBpMzIgMiwgaTMyIDAsIGkzMiA0LCB7ey4qfX0KKy8vIENIRUNLOiBfT0JKQ19DTEFTU19ST18kX0k5IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSB7IGkzMiAyLCBpMzIgMCwgaTMyIDQsIHt7Lip9fQogLy8gQ0hFQ0s6IEAiT0JKQ19JVkFSXyRfSTEwLml2MSIgPSBnbG9iYWwgaTY0IDQsIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2l2YXIiLCBhbGlnbiA4Ci0vLyBDSEVDSzogX09CSkNfQ0xBU1NfUk9fJF9JMTAiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSB7IGkzMiAwLCBpMzIgNCwgaTMyIDUsIHt7Lip9fQotLy8gQ0hFQ0s6IF9PQkpDX0NMQVNTX1JPXyRfSTExIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0geyBpMzIgMCwgaTMyIDUsIGkzMiA1LCB7ey4qfX0KKy8vIENIRUNLOiBfT0JKQ19DTEFTU19ST18kX0kxMCIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0geyBpMzIgMCwgaTMyIDQsIGkzMiA1LCB7ey4qfX0KKy8vIENIRUNLOiBfT0JKQ19DTEFTU19ST18kX0kxMSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0geyBpMzIgMCwgaTMyIDUsIGkzMiA1LCB7ey4qfX0KIC8vIENIRUNLOiBAIk9CSkNfSVZBUl8kX0kxMi5pdjIiID0gZ2xvYmFsIGk2NCA4LCBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19pdmFyIiwgYWxpZ24gOAotLy8gQ0hFQ0s6IF9PQkpDX0NMQVNTX1JPXyRfSTEyIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0geyBpMzIgMCwgaTMyIDgsIGkzMiAxMiwge3suKn19CisvLyBDSEVDSzogX09CSkNfQ0xBU1NfUk9fJF9JMTIiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IHsgaTMyIDAsIGkzMiA4LCBpMzIgMTIsIHt7Lip9fQogCiAvKgogICBDb21wYXJlIHRvOgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9pdmFyLWxheW91dC02NC5tIGIvdGVzdC9Db2RlR2VuT2JqQy9pdmFyLWxheW91dC02NC5tCmluZGV4IDkxYTgzNzUuLjA2OGQxMDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvaXZhci1sYXlvdXQtNjQubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2l2YXItbGF5b3V0LTY0Lm0KQEAgLTMzLDkgKzMzLDkgQEAKIEBwcm9wZXJ0eSBpbnQgcDM7CiBAZW5kCiAKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19OQU1FX3t7Lip9fSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IGMiQ1wwMCIKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19OQU1FX3t7Lip9fSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IGMiXDExcFwwMCIKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19OQU1FX3t7Lip9fSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IGMiIWBcMDAiCisvLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfTkFNRV97ey4qfX0iID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IGMiQ1wwMCIKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19OQU1FX3t7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0gYyJcMTFwXDAwIgorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX05BTUVfe3suKn19IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBjIiFgXDAwIgogCiAKIEBpbXBsZW1lbnRhdGlvbiBDCkBAIC00OCw5ICs0OCw5IEBACiBAcHJvcGVydHkgKGFzc2lnbikgX193ZWFrIGlkIHAyOwogQGVuZAogCi0vLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfTkFNRV97ey4qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSBjIkFcMDAiCi0vLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfTkFNRV97ey4qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSBjIlwxMXFcMTBcMDAiCi0vLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfTkFNRV97ey4qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSBjIiFxXDAwIgorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX05BTUVfe3suKn19IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBjIkFcMDAiCisvLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfTkFNRV97ey4qfX0iID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IGMiXDExcVwxMFwwMCIKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19OQU1FX3t7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0gYyIhcVwwMCIKIAogQGltcGxlbWVudGF0aW9uIEEKIEBzeW50aGVzaXplIHAwID0gX3AwOwpAQCAtNjIsOSArNjIsOSBAQAogQHByb3BlcnR5IGludCBwMzsKIEBlbmQKIAotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX05BTUVfe3suKn19IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0gYyJEXDAwIgotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX05BTUVfe3suKn19IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0gYyJcMTFwXDAwIgotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX05BTUVfe3suKn19IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0gYyIhYFwwMCIKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19OQU1FX3t7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0gYyJEXDAwIgorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX05BTUVfe3suKn19IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBjIlwxMXBcMDAiCisvLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfTkFNRV97ey4qfX0iID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IGMiIWBcMDAiCiAKIEBpbXBsZW1lbnRhdGlvbiBECiBAc3ludGhlc2l6ZSBwMyA9IF9wMzsKQEAgLTg5LDggKzg5LDggQEAKIH0KIEBlbmQKIAotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX05BTUVfe3suKn19IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0gYyJOU0ZpbGVMb2NhdGlvbkNvbXBvbmVudFwwMCIKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19OQU1FX3t7Lip9fSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IGMiXDAxXDE0XDAwIgorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX05BTUVfe3suKn19IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBjIk5TRmlsZUxvY2F0aW9uQ29tcG9uZW50XDAwIgorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX05BTUVfe3suKn19IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBjIlwwMVwxNFwwMCIKIAogQGltcGxlbWVudGF0aW9uIE5TRmlsZUxvY2F0aW9uQ29tcG9uZW50IEBlbmQKIApAQCAtMTA4LDcgKzEwOCw3IEBACiB9CiBAZW5kCiAKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19OQU1FX3t7Lip9fSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IGMiRm9vXDAwIgotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX05BTUVfe3suKn19IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0gYyJcMDJcMTBcMDAiCisvLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfTkFNRV97ey4qfX0iID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IGMiRm9vXDAwIgorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX05BTUVfe3suKn19IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBjIlwwMlwxMFwwMCIKIAogQGltcGxlbWVudGF0aW9uIEZvbyBAZW5kCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL2l2YXItbGF5b3V0LWFycmF5MC1zdHJ1Y3QubSBiL3Rlc3QvQ29kZUdlbk9iakMvaXZhci1sYXlvdXQtYXJyYXkwLXN0cnVjdC5tCmluZGV4IDQ3MzczMDMuLjhlMjc3MTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvaXZhci1sYXlvdXQtYXJyYXkwLXN0cnVjdC5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvaXZhci1sYXlvdXQtYXJyYXkwLXN0cnVjdC5tCkBAIC0xLDQgKzEsNCBAQAotLy8gUkVRVUlSRVM6IHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IHg4Ni1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mb2JqYy1nYyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLWZvYmpjLXJ1bnRpbWU9bWFjb3N4LWZyYWdpbGUtMTAuNSAtUyAlcyAtbyAldC02NC5zCiAvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQNjQgLS1pbnB1dC1maWxlPSV0LTY0LnMgJXMKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9pdmFyLWxheW91dC1uby1vcHRpbWl6ZS5tIGIvdGVzdC9Db2RlR2VuT2JqQy9pdmFyLWxheW91dC1uby1vcHRpbWl6ZS5tCmluZGV4IDE3YjUxOTUuLjU1NDAzOGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvaXZhci1sYXlvdXQtbm8tb3B0aW1pemUubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL2l2YXItbGF5b3V0LW5vLW9wdGltaXplLm0KQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogeDg2LTY0LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZ19jYzEgLWZvYmpjLWdjIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtZm9iamMtcnVudGltZT1tYWNvc3gtZnJhZ2lsZS0xMC41IC1TICVzIC1vICV0LTY0LnMKIC8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFA2NCAtLWlucHV0LWZpbGU9JXQtNjQucyAlcwogLy8gUlVOOiAlY2xhbmdfY2MxIC14IG9iamVjdGl2ZS1jKysgLWZvYmpjLWdjIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtZm9iamMtcnVudGltZT1tYWNvc3gtZnJhZ2lsZS0xMC41IC1TICVzIC1vICV0LTY0LnMKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvbWV0YWRhdGEtc3ltYm9scy0zMi5tIGIvdGVzdC9Db2RlR2VuT2JqQy9tZXRhZGF0YS1zeW1ib2xzLTMyLm0KaW5kZXggZmRhOTA5Yy4uNjEyNzllMSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9tZXRhZGF0YS1zeW1ib2xzLTMyLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9tZXRhZGF0YS1zeW1ib2xzLTMyLm0KQEAgLTIsMzEgKzIsMzMgQEAKIAogLy8gQ0hFQ0s6IC5sYXp5X3JlZmVyZW5jZSAub2JqY19jbGFzc19uYW1lX0owCiAKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19NRVRIX1ZBUl9OQU1FX3t7WzAtOV0qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fVEVYVCxfX2NzdHJpbmcsY3N0cmluZ19saXRlcmFscyIsIGFsaWduIDEKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19NRVRIX1ZBUl9UWVBFX3t7WzAtOV0qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fVEVYVCxfX2NzdHJpbmcsY3N0cmluZ19saXRlcmFscyIsIGFsaWduIDEKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19OQU1FX3t7WzAtOV0qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fVEVYVCxfX2NzdHJpbmcsY3N0cmluZ19saXRlcmFscyIsIGFsaWduIDEKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19QUk9UT0NPTF9JTlNUQU5DRV9NRVRIT0RTX1AiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX2NhdF9pbnN0X21ldGgscmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX1BST1RPQ09MX0NMQVNTX01FVEhPRFNfUCIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19c2VjdGlvbiAiX19PQkpDLF9fY2F0X2Nsc19tZXRoLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19QUk9UT0NPTF9QIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19wcm90b2NvbCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfUFJPVE9DT0xTX0EiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX2NhdF9jbHNfbWV0aCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfTUVUSE9EU19BIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jbHNfbWV0aCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDFMX09CSkNfTUVUQUNMQVNTX0EiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX21ldGFfY2xhc3MscmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0lOU1RBTkNFX1ZBUklBQkxFU19BIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19pbnN0YW5jZV92YXJzLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19JTlNUQU5DRV9NRVRIT0RTX0EiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX2luc3RfbWV0aCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDFMX09CSkNfUFJPUF9OQU1FX0FUVFJfe3tbMC05XSp9fSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19c2VjdGlvbiAiX19URVhULF9fY3N0cmluZyxjc3RyaW5nX2xpdGVyYWxzIiwgYWxpZ24gMQotLy8gQ0hFQ0s6IEAiXDAxbF9PQkpDXyRfUFJPUF9MSVNUX0EiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX3Byb3BlcnR5LHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU0VYVF9BIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jbGFzc19leHQscmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX0EiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX2NsYXNzLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DQVRFR09SWV9JTlNUQU5DRV9NRVRIT0RTX0FfQ2F0IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jYXRfaW5zdF9tZXRoLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DQVRFR09SWV9DTEFTU19NRVRIT0RTX0FfQ2F0IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jYXRfY2xzX21ldGgscmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NBVEVHT1JZX0FfQ2F0IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jYXRlZ29yeSxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfUkVGRVJFTkNFU197e1swLTldKn19IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jbHNfcmVmcyxsaXRlcmFsX3BvaW50ZXJzLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDFMX09CSkNfU0VMRUNUT1JfUkVGRVJFTkNFU197e1swLTldKn19IiA9IGludGVybmFsIGV4dGVybmFsbHlfaW5pdGlhbGl6ZWQgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX21lc3NhZ2VfcmVmcyxsaXRlcmFsX3BvaW50ZXJzLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDFMX09CSkNfU1lNQk9MUyIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19c2VjdGlvbiAiX19PQkpDLF9fc3ltYm9scyxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDFMX09CSkNfTU9EVUxFUyIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19c2VjdGlvbiAiX19PQkpDLF9fbW9kdWxlX2luZm8scmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX01FVEhfVkFSX05BTUVfe3tbMC05XSp9fSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX1RFWFQsX19jc3RyaW5nLGNzdHJpbmdfbGl0ZXJhbHMiLCBhbGlnbiAxCisvLyBDSEVDSzogQCJcMDFMX09CSkNfTUVUSF9WQVJfVFlQRV97e1swLTldKn19IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fVEVYVCxfX2NzdHJpbmcsY3N0cmluZ19saXRlcmFscyIsIGFsaWduIDEKKy8vIENIRUNLOiBAIlwwMWxfT0JKQ19QUk9UT0NPTEVYVF9QIiA9IHByaXZhdGUgZ2xvYmFsCisvLyBDSEVDSy1OT1Q6IHNlY3Rpb24KKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19OQU1FX3t7WzAtOV0qfX0iID0gcHJpdmF0ZSBnbG9iYWwge3suKn19c2VjdGlvbiAiX19URVhULF9fY3N0cmluZyxjc3RyaW5nX2xpdGVyYWxzIiwgYWxpZ24gMQorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX1BST1RPQ09MX0lOU1RBTkNFX01FVEhPRFNfUCIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jYXRfaW5zdF9tZXRoLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19QUk9UT0NPTF9DTEFTU19NRVRIT0RTX1AiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19c2VjdGlvbiAiX19PQkpDLF9fY2F0X2Nsc19tZXRoLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19QUk9UT0NPTF9QIiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX3Byb3RvY29sLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19QUk9UT0NPTFNfQSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jYXRfY2xzX21ldGgscmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX01FVEhPRFNfQSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jbHNfbWV0aCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0CisvLyBDSEVDSzogQCJcMDFMX09CSkNfTUVUQUNMQVNTX0EiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19c2VjdGlvbiAiX19PQkpDLF9fbWV0YV9jbGFzcyxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0CisvLyBDSEVDSzogQCJcMDFMX09CSkNfSU5TVEFOQ0VfVkFSSUFCTEVTX0EiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19c2VjdGlvbiAiX19PQkpDLF9faW5zdGFuY2VfdmFycyxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0CisvLyBDSEVDSzogQCJcMDFMX09CSkNfSU5TVEFOQ0VfTUVUSE9EU19BIiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX2luc3RfbWV0aCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0CisvLyBDSEVDSzogQCJcMDFMX09CSkNfUFJPUF9OQU1FX0FUVFJfe3tbMC05XSp9fSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX1RFWFQsX19jc3RyaW5nLGNzdHJpbmdfbGl0ZXJhbHMiLCBhbGlnbiAxCisvLyBDSEVDSzogQCJcMDFsX09CSkNfJF9QUk9QX0xJU1RfQSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19wcm9wZXJ0eSxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0CisvLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NFWFRfQSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jbGFzc19leHQscmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX0EiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19c2VjdGlvbiAiX19PQkpDLF9fY2xhc3MscmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NBVEVHT1JZX0lOU1RBTkNFX01FVEhPRFNfQV9DYXQiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19c2VjdGlvbiAiX19PQkpDLF9fY2F0X2luc3RfbWV0aCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0CisvLyBDSEVDSzogQCJcMDFMX09CSkNfQ0FURUdPUllfQ0xBU1NfTUVUSE9EU19BX0NhdCIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jYXRfY2xzX21ldGgscmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NBVEVHT1JZX0FfQ2F0IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX2NhdGVnb3J5LHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19SRUZFUkVOQ0VTX3t7WzAtOV0qfX0iID0gcHJpdmF0ZSBnbG9iYWwge3suKn19c2VjdGlvbiAiX19PQkpDLF9fY2xzX3JlZnMsbGl0ZXJhbF9wb2ludGVycyxub19kZWFkX3N0cmlwIiwgYWxpZ24gNAorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX1NFTEVDVE9SX1JFRkVSRU5DRVNfe3tbMC05XSp9fSIgPSBwcml2YXRlIGV4dGVybmFsbHlfaW5pdGlhbGl6ZWQgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX21lc3NhZ2VfcmVmcyxsaXRlcmFsX3BvaW50ZXJzLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0CisvLyBDSEVDSzogQCJcMDFMX09CSkNfU1lNQk9MUyIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19zeW1ib2xzLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19NT0RVTEVTIiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX21vZHVsZV9pbmZvLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKIAogLy8gQ2xhbmcncyBPYmotQyAzMi1iaXQgZG9lc24ndCBlbWl0IGl2YXJzIGZvciB0aGUgcm9vdCBjbGFzcy4KLS8vIENIRUNLWDogQCJcMDFMX09CSkNfQ0xBU1NfVkFSSUFCTEVTX0EiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fXNlY3Rpb24gIl9fT0JKQyxfX2NsYXNzX3ZhcnMscmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAorLy8gQ0hFQ0tYOiBAIlwwMUxfT0JKQ19DTEFTU19WQVJJQUJMRVNfQSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX1zZWN0aW9uICJfX09CSkMsX19jbGFzc192YXJzLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKIAogCiAvKgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9tZXRhZGF0YS1zeW1ib2xzLTY0Lm0gYi90ZXN0L0NvZGVHZW5PYmpDL21ldGFkYXRhLXN5bWJvbHMtNjQubQppbmRleCBhODlmZWM1Li43Yjk2MDkzIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL21ldGFkYXRhLXN5bWJvbHMtNjQubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL21ldGFkYXRhLXN5bWJvbHMtNjQubQpAQCAtNSwzMiArNSwzMiBAQAogLy8gQ0hFQ0s6IEBfb2JqY19lbXB0eV92dGFibGUgPSBleHRlcm5hbCBnbG9iYWwKIC8vIENIRUNLOiBAIk9CSkNfQ0xBU1NfJF9BIiA9IGdsb2JhbAogLy8gQ0hFQ0s6IEAiT0JKQ19NRVRBQ0xBU1NfJF9BIiA9IGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfZGF0YSIsIGFsaWduIDgKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19OQU1FX3t7WzAtOV0qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX1RFWFQsX19vYmpjX2NsYXNzbmFtZSxjc3RyaW5nX2xpdGVyYWxzIiwgYWxpZ24gMQotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX01FVEhfVkFSX05BTUVfe3tbMC05XSp9fSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fVEVYVCxfX29iamNfbWV0aG5hbWUsY3N0cmluZ19saXRlcmFscyIsIGFsaWduIDEKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19NRVRIX1ZBUl9UWVBFX3t7WzAtOV0qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX1RFWFQsX19vYmpjX21ldGh0eXBlLGNzdHJpbmdfbGl0ZXJhbHMiLCBhbGlnbiAxCi0vLyBDSEVDSzogQCJcMDFsX09CSkNfJF9DTEFTU19NRVRIT0RTX0EiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jb25zdCIsIGFsaWduIDgKLS8vIENIRUNLOiBAIlwwMWxfT0JKQ18kX1BST1RPQ09MX0lOU1RBTkNFX01FVEhPRFNfUCIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOAotLy8gQ0hFQ0s6IEAiXDAxbF9PQkpDXyRfUFJPVE9DT0xfQ0xBU1NfTUVUSE9EU19QIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4CisvLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfTkFNRV97e1swLTldKn19IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX1RFWFQsX19vYmpjX2NsYXNzbmFtZSxjc3RyaW5nX2xpdGVyYWxzIiwgYWxpZ24gMQorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX01FVEhfVkFSX05BTUVfe3tbMC05XSp9fSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19URVhULF9fb2JqY19tZXRobmFtZSxjc3RyaW5nX2xpdGVyYWxzIiwgYWxpZ24gMQorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX01FVEhfVkFSX1RZUEVfe3tbMC05XSp9fSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19URVhULF9fb2JqY19tZXRodHlwZSxjc3RyaW5nX2xpdGVyYWxzIiwgYWxpZ24gMQorLy8gQ0hFQ0s6IEAiXDAxbF9PQkpDXyRfQ0xBU1NfTUVUSE9EU19BIiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jb25zdCIsIGFsaWduIDgKKy8vIENIRUNLOiBAIlwwMWxfT0JKQ18kX1BST1RPQ09MX0lOU1RBTkNFX01FVEhPRFNfUCIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4CisvLyBDSEVDSzogQCJcMDFsX09CSkNfJF9QUk9UT0NPTF9DTEFTU19NRVRIT0RTX1AiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOAogLy8gQ0hFQ0s6IEAiXDAxbF9PQkpDX1BST1RPQ09MXyRfUCIgPSB3ZWFrIGhpZGRlbiBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSxfX2RhdGFjb2FsX250LGNvYWxlc2NlZCIsIGFsaWduIDgKIC8vIENIRUNLOiBAIlwwMWxfT0JKQ19MQUJFTF9QUk9UT0NPTF8kX1AiID0gd2VhayBoaWRkZW4gZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19wcm90b2xpc3QsIGNvYWxlc2NlZCwgbm9fZGVhZF9zdHJpcCIsIGFsaWduIDgKLS8vIENIRUNLOiBAIlwwMWxfT0JKQ19DTEFTU19QUk9UT0NPTFNfJF9BIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4Ci0vLyBDSEVDSzogQCJcMDFsX09CSkNfTUVUQUNMQVNTX1JPXyRfQSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOAotLy8gQ0hFQ0s6IEAiXDAxbF9PQkpDXyRfSU5TVEFOQ0VfTUVUSE9EU19BIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4Ci0vLyBDSEVDSzogQCJcMDFsX09CSkNfJF9JTlNUQU5DRV9WQVJJQUJMRVNfQSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOAotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX1BST1BfTkFNRV9BVFRSX3t7WzAtOV0qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX1RFWFQsX19jc3RyaW5nLGNzdHJpbmdfbGl0ZXJhbHMiLCBhbGlnbiAxCi0vLyBDSEVDSzogQCJcMDFsX09CSkNfJF9QUk9QX0xJU1RfQSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOAotLy8gQ0hFQ0s6IEAiXDAxbF9PQkpDX0NMQVNTX1JPXyRfQSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOAotLy8gQ0hFQ0s6IEAiXDAxbF9PQkpDXyRfQ0FURUdPUllfSU5TVEFOQ0VfTUVUSE9EU19BXyRfQ2F0IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4Ci0vLyBDSEVDSzogQCJcMDFsX09CSkNfJF9DQVRFR09SWV9DTEFTU19NRVRIT0RTX0FfJF9DYXQiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jb25zdCIsIGFsaWduIDgKLS8vIENIRUNLOiBAIlwwMWxfT0JKQ18kX0NBVEVHT1JZX0FfJF9DYXQiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jb25zdCIsIGFsaWduIDgKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU0xJU1RfU1VQX1JFRlNfJF97e1swLTldKn19IiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfc3VwZXJyZWZzLCByZWd1bGFyLCBub19kZWFkX3N0cmlwIiwgYWxpZ24gOAotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX1NFTEVDVE9SX1JFRkVSRU5DRVNfIiA9IGludGVybmFsIGV4dGVybmFsbHlfaW5pdGlhbGl6ZWQgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19zZWxyZWZzLCBsaXRlcmFsX3BvaW50ZXJzLCBub19kZWFkX3N0cmlwIgotLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTTElTVF9TVVBfUkVGU18kX3t7WzAtOV0qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19zdXBlcnJlZnMsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4CisvLyBDSEVDSzogQCJcMDFsX09CSkNfQ0xBU1NfUFJPVE9DT0xTXyRfQSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4CisvLyBDSEVDSzogQCJcMDFsX09CSkNfTUVUQUNMQVNTX1JPXyRfQSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4CisvLyBDSEVDSzogQCJcMDFsX09CSkNfJF9JTlNUQU5DRV9NRVRIT0RTX0EiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOAorLy8gQ0hFQ0s6IEAiXDAxbF9PQkpDXyRfSU5TVEFOQ0VfVkFSSUFCTEVTX0EiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOAorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX1BST1BfTkFNRV9BVFRSX3t7WzAtOV0qfX0iID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fVEVYVCxfX2NzdHJpbmcsY3N0cmluZ19saXRlcmFscyIsIGFsaWduIDEKKy8vIENIRUNLOiBAIlwwMWxfT0JKQ18kX1BST1BfTElTVF9BIiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jb25zdCIsIGFsaWduIDgKKy8vIENIRUNLOiBAIlwwMWxfT0JKQ19DTEFTU19ST18kX0EiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOAorLy8gQ0hFQ0s6IEAiXDAxbF9PQkpDXyRfQ0FURUdPUllfSU5TVEFOQ0VfTUVUSE9EU19BXyRfQ2F0IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jb25zdCIsIGFsaWduIDgKKy8vIENIRUNLOiBAIlwwMWxfT0JKQ18kX0NBVEVHT1JZX0NMQVNTX01FVEhPRFNfQV8kX0NhdCIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4CisvLyBDSEVDSzogQCJcMDFsX09CSkNfJF9DQVRFR09SWV9BXyRfQ2F0IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jb25zdCIsIGFsaWduIDgKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU0xJU1RfU1VQX1JFRlNfJF97e1swLTldKn19IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19zdXBlcnJlZnMsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4CisvLyBDSEVDSzogQCJcMDFMX09CSkNfU0VMRUNUT1JfUkVGRVJFTkNFU18iID0gcHJpdmF0ZSBleHRlcm5hbGx5X2luaXRpYWxpemVkIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfc2VscmVmcywgbGl0ZXJhbF9wb2ludGVycywgbm9fZGVhZF9zdHJpcCIKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU0xJU1RfU1VQX1JFRlNfJF97e1swLTldKn19IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19zdXBlcnJlZnMsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4CiAvLyBDSEVDSzogQCJPQkpDX0NMQVNTXyRfQiIgPSBleHRlcm5hbCBnbG9iYWwKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU0xJU1RfUkVGRVJFTkNFU18kX3t7WzAtOV0qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jbGFzc3JlZnMsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4CisvLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NMSVNUX1JFRkVSRU5DRVNfJF97e1swLTldKn19IiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jbGFzc3JlZnMsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4CiAvLyBDSEVDSzogQCJcMDFsX29iamNfbXNnU2VuZF9maXh1cF9hbGxvYyIgPSB3ZWFrIGhpZGRlbiBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX21zZ3JlZnMsIGNvYWxlc2NlZCIsIGFsaWduIDE2Ci0vLyBDSEVDSzogQCJcMDFMX09CSkNfTEFCRUxfQ0xBU1NfJCIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19IHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NsYXNzbGlzdCwgcmVndWxhciwgbm9fZGVhZF9zdHJpcCIsIGFsaWduIDgKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19MQUJFTF9DQVRFR09SWV8kIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY2F0bGlzdCwgcmVndWxhciwgbm9fZGVhZF9zdHJpcCIsIGFsaWduIDgKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19MQUJFTF9DTEFTU18kIiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jbGFzc2xpc3QsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4CisvLyBDSEVDSzogQCJcMDFMX09CSkNfTEFCRUxfQ0FURUdPUllfJCIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0gc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY2F0bGlzdCwgcmVndWxhciwgbm9fZGVhZF9zdHJpcCIsIGFsaWduIDgKIC8vIENIRUNLOiBAb2JqY19tc2dTZW5kX2ZwcmV0KAogLy8gQ0hFQ0s6IEBvYmpjX21zZ1NlbmRfZml4dXAoCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvbWV0YWRhdGFfc3ltYm9scy5tIGIvdGVzdC9Db2RlR2VuT2JqQy9tZXRhZGF0YV9zeW1ib2xzLm0KaW5kZXggZWVkY2YxNi4uMmI2MWM1ZCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9tZXRhZGF0YV9zeW1ib2xzLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9tZXRhZGF0YV9zeW1ib2xzLm0KQEAgLTE0LDcgKzE0LDcgQEAKIC8vIENIRUNLLVg4Nl82NDogQCJPQkpDX0VIVFlQRV8kX0VIMSIgPSB3ZWFrIGdsb2JhbCB7ey4qfX0sIHNlY3Rpb24gIl9fREFUQSxfX2RhdGFjb2FsX250LGNvYWxlc2NlZCIsIGFsaWduIDgKIC8vIENIRUNLLVg4Nl82NDogQCJPQkpDX0VIVFlQRV8kX0VIMiIgPSBleHRlcm5hbCBnbG9iYWwKIC8vIENIRUNLLVg4Nl82NDogQCJPQkpDX0VIVFlQRV8kX0VIMyIgPSBnbG9iYWwge3suKn19LCBzZWN0aW9uICJfX0RBVEEsX19vYmpjX2NvbnN0IiwgYWxpZ24gOAotLy8gQ0hFQ0stWDg2XzY0OiBAIlwwMUxfT0JKQ19MQUJFTF9DTEFTU18kIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0sIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NsYXNzbGlzdCwgcmVndWxhciwgbm9fZGVhZF9zdHJpcCIsIGFsaWduIDgKKy8vIENIRUNLLVg4Nl82NDogQCJcMDFMX09CSkNfTEFCRUxfQ0xBU1NfJCIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0sIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NsYXNzbGlzdCwgcmVndWxhciwgbm9fZGVhZF9zdHJpcCIsIGFsaWduIDgKIC8vIENIRUNLLVg4Nl82NDogZGVmaW5lIGludGVybmFsIHZvaWQgQCJcMDEtW0EgaW0wXSIKIC8vIENIRUNLLVg4Nl82NDogZGVmaW5lIGludGVybmFsIHZvaWQgQCJcMDEtW0EoQ2F0KSBpbTFdIgogCkBAIC0zOCw3ICszOCw3IEBACiAvLyBDSEVDSy1BUk1WNjogQCJPQkpDX0VIVFlQRV8kX0VIMSIgPSB3ZWFrIGdsb2JhbCB7ey4qfX0sIHNlY3Rpb24gIl9fREFUQSxfX2RhdGFjb2FsX250LGNvYWxlc2NlZCIsIGFsaWduIDQKIC8vIENIRUNLLUFSTVY2OiBAIk9CSkNfRUhUWVBFXyRfRUgyIiA9IGV4dGVybmFsIGdsb2JhbAogLy8gQ0hFQ0stQVJNVjY6IEAiT0JKQ19FSFRZUEVfJF9FSDMiID0gZ2xvYmFsIHt7Lip9fSwgc2VjdGlvbiAiX19EQVRBLF9fb2JqY19jb25zdCIsIGFsaWduIDQKLS8vIENIRUNLLUFSTVY2OiBAIlwwMUxfT0JKQ19MQUJFTF9DTEFTU18kIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0sIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NsYXNzbGlzdCwgcmVndWxhciwgbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKKy8vIENIRUNLLUFSTVY2OiBAIlwwMUxfT0JKQ19MQUJFTF9DTEFTU18kIiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY2xhc3NsaXN0LCByZWd1bGFyLCBub19kZWFkX3N0cmlwIiwgYWxpZ24gNAogLy8gQ0hFQ0stQVJNVjY6IGRlZmluZSBpbnRlcm5hbCB2b2lkIEAiXDAxLVtBIGltMF0iCiAvLyBDSEVDSy1BUk1WNjogZGVmaW5lIGludGVybmFsIHZvaWQgQCJcMDEtW0EoQ2F0KSBpbTFdIgogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL25vLXZhcmFyZy1tZXNzYWdpbmcubSBiL3Rlc3QvQ29kZUdlbk9iakMvbm8tdmFyYXJnLW1lc3NhZ2luZy5tCmluZGV4IDNmOWQ5MzQuLjAwOTUyMDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvbm8tdmFyYXJnLW1lc3NhZ2luZy5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvbm8tdmFyYXJnLW1lc3NhZ2luZy5tCkBAIC0xLDQgKzEsNCBAQAotLy8gUkVRVUlSRVM6IHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IHg4Ni1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwICAtUyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAvLyByZGFyOi8vOTA0ODAzMAogCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL25vbi1sYXp5LWNsYXNzZXMubSBiL3Rlc3QvQ29kZUdlbk9iakMvbm9uLWxhenktY2xhc3Nlcy5tCmluZGV4IGQ5NWNiNzguLjc2MGRkYWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvbm9uLWxhenktY2xhc3Nlcy5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvbm9uLWxhenktY2xhc3Nlcy5tCkBAIC0xLDYgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1lbWl0LWxsdm0gLW8gJXQgJXMKLS8vIFJVTjogZ3JlcCAnQCIuMDFMX09CSkNfTEFCRUxfTk9OTEFaWV9DTEFTU18kIiA9IGludGVybmFsIGdsb2JhbCBcWzEgeCAuKlxdIC4qQCJPQkpDX0NMQVNTXyRfQSIuKiwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfbmxjbHNsaXN0LCByZWd1bGFyLCBub19kZWFkX3N0cmlwIiwgYWxpZ24gOCcgJXQKLS8vIFJVTjogZ3JlcCAnQCIuMDFMX09CSkNfTEFCRUxfTk9OTEFaWV9DQVRFR09SWV8kIiA9IGludGVybmFsIGdsb2JhbCBcWzEgeCAuKlxdIC4qQCIuMDFsX09CSkNfJF9DQVRFR09SWV9BXyRfQ2F0Ii4qLCBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19ubGNhdGxpc3QsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4JyAldAorLy8gUlVOOiBncmVwICdAIi4wMUxfT0JKQ19MQUJFTF9OT05MQVpZX0NMQVNTXyQiID0gcHJpdmF0ZSBnbG9iYWwgXFsxIHggLipcXSAuKkAiT0JKQ19DTEFTU18kX0EiLiosIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX25sY2xzbGlzdCwgcmVndWxhciwgbm9fZGVhZF9zdHJpcCIsIGFsaWduIDgnICV0CisvLyBSVU46IGdyZXAgJ0AiLjAxTF9PQkpDX0xBQkVMX05PTkxBWllfQ0FURUdPUllfJCIgPSBwcml2YXRlIGdsb2JhbCBcWzEgeCAuKlxdIC4qQCIuMDFsX09CSkNfJF9DQVRFR09SWV9BXyRfQ2F0Ii4qLCBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19ubGNhdGxpc3QsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4JyAldAogCiBAaW50ZXJmYWNlIEEgQGVuZAogQGltcGxlbWVudGF0aW9uIEEKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvb2JqYy1hbGlnbi5tIGIvdGVzdC9Db2RlR2VuT2JqQy9vYmpjLWFsaWduLm0KaW5kZXggMWE5NmYzNC4uMmIyMTMzZSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9vYmpjLWFsaWduLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9vYmpjLWFsaWduLm0KQEAgLTEsMTQgKzEsMTQgQEAKIC8vIDMyLWJpdAogCiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbjkgLWZvYmpjLXJ1bnRpbWU9bWFjb3N4LWZyYWdpbGUtMTAuNSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19NRVRBQ0xBU1NfQSIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19LCBzZWN0aW9uICJfX09CSkMsX19tZXRhX2NsYXNzLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19BIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0sIHNlY3Rpb24gIl9fT0JKQyxfX2NsYXNzLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DQVRFR09SWV9BX0NhdCIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19LCBzZWN0aW9uICJfX09CSkMsX19jYXRlZ29yeSxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDFMX09CSkNfUFJPVE9DT0xfUCIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19LCBzZWN0aW9uICJfX09CSkMsX19wcm90b2NvbCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0Ci0vLyBDSEVDSzogQCJcMDFMX09CSkNfQ0xBU1NfUFJPVE9DT0xTX0MiID0gaW50ZXJuYWwgZ2xvYmFsIHt7Lip9fSwgc2VjdGlvbiAiX19PQkpDLF9fY2F0X2Nsc19tZXRoLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19NRVRBQ0xBU1NfQyIgPSBpbnRlcm5hbCBnbG9iYWwge3suKn19LCBzZWN0aW9uICJfX09CSkMsX19tZXRhX2NsYXNzLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19DIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0sIHNlY3Rpb24gIl9fT0JKQyxfX2NsYXNzLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19NT0RVTEVTIiA9IGludGVybmFsIGdsb2JhbCB7ey4qfX0sIHNlY3Rpb24gIl9fT0JKQyxfX21vZHVsZV9pbmZvLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19NRVRBQ0xBU1NfQSIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0sIHNlY3Rpb24gIl9fT0JKQyxfX21ldGFfY2xhc3MscmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX0NMQVNTX0EiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19LCBzZWN0aW9uICJfX09CSkMsX19jbGFzcyxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0CisvLyBDSEVDSzogQCJcMDFMX09CSkNfQ0FURUdPUllfQV9DYXQiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19LCBzZWN0aW9uICJfX09CSkMsX19jYXRlZ29yeSxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0CisvLyBDSEVDSzogQCJcMDFMX09CSkNfUFJPVE9DT0xfUCIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0sIHNlY3Rpb24gIl9fT0JKQyxfX3Byb3RvY29sLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19QUk9UT0NPTFNfQyIgPSBwcml2YXRlIGdsb2JhbCB7ey4qfX0sIHNlY3Rpb24gIl9fT0JKQyxfX2NhdF9jbHNfbWV0aCxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0CisvLyBDSEVDSzogQCJcMDFMX09CSkNfTUVUQUNMQVNTX0MiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19LCBzZWN0aW9uICJfX09CSkMsX19tZXRhX2NsYXNzLHJlZ3VsYXIsbm9fZGVhZF9zdHJpcCIsIGFsaWduIDQKKy8vIENIRUNLOiBAIlwwMUxfT0JKQ19DTEFTU19DIiA9IHByaXZhdGUgZ2xvYmFsIHt7Lip9fSwgc2VjdGlvbiAiX19PQkpDLF9fY2xhc3MscmVndWxhcixub19kZWFkX3N0cmlwIiwgYWxpZ24gNAorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX01PRFVMRVMiID0gcHJpdmF0ZSBnbG9iYWwge3suKn19LCBzZWN0aW9uICJfX09CSkMsX19tb2R1bGVfaW5mbyxyZWd1bGFyLG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA0CiAKIC8vIDY0LWJpdAogCkBAIC0xNywxNiArMTcsMTYgQEAKIC8vIFJVTlg6IGdyZXAgJ0AiT0JKQ19DTEFTU18kX0MiID0gZ2xvYmFsJyAldCAmJgogLy8gUlVOWDogZ3JlcCAnQCJPQkpDX01FVEFDTEFTU18kX0EiID0gZ2xvYmFsJyAldCAmJgogLy8gUlVOWDogZ3JlcCAnQCJPQkpDX01FVEFDTEFTU18kX0MiID0gZ2xvYmFsJyAldCAmJgotLy8gUlVOWDogZ3JlcCAnQCJcXDAxTF9PQkpDX0NMQVNTTElTVF9SRUZFUkVOQ0VTXyRfMCIgPSBpbnRlcm5hbCBnbG9iYWwgLiosIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NsYXNzcmVmcywgcmVndWxhciwgbm9fZGVhZF9zdHJpcCIsIGFsaWduIDgnICV0ICYmCi0vLyBSVU5YOiBncmVwICdAIlxcMDFMX09CSkNfTEFCRUxfQ0FURUdPUllfJCIgPSBpbnRlcm5hbCBnbG9iYWwgLiosIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NhdGxpc3QsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4JyAldCAmJgotLy8gUlVOWDogZ3JlcCAnQCJcXDAxTF9PQkpDX0xBQkVMX0NMQVNTXyQiID0gaW50ZXJuYWwgZ2xvYmFsIC4qLCBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jbGFzc2xpc3QsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4JyAldCAmJgotLy8gUlVOWDogZ3JlcCAnQCJcXDAxbF9PQkpDXyRfQ0FURUdPUllfQV8kX0NhdCIgPSBpbnRlcm5hbCBnbG9iYWwgLiosIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOCcgJXQgJiYKLS8vIFJVTlg6IGdyZXAgJ0AiXFwwMWxfT0JKQ19DTEFTU19QUk9UT0NPTFNfJF9DIiA9IGludGVybmFsIGdsb2JhbCAuKiwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4JyAldCAmJgotLy8gUlVOWDogZ3JlcCAnQCJcXDAxbF9PQkpDX0NMQVNTX1JPXyRfQSIgPSBpbnRlcm5hbCBnbG9iYWwgLiosIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOCcgJXQgJiYKLS8vIFJVTlg6IGdyZXAgJ0AiXFwwMWxfT0JKQ19DTEFTU19ST18kX0MiID0gaW50ZXJuYWwgZ2xvYmFsIC4qLCBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jb25zdCIsIGFsaWduIDgnICV0ICYmCisvLyBSVU5YOiBncmVwICdAIlxcMDFMX09CSkNfQ0xBU1NMSVNUX1JFRkVSRU5DRVNfJF8wIiA9IHByaXZhdGUgZ2xvYmFsIC4qLCBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jbGFzc3JlZnMsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4JyAldCAmJgorLy8gUlVOWDogZ3JlcCAnQCJcXDAxTF9PQkpDX0xBQkVMX0NBVEVHT1JZXyQiID0gcHJpdmF0ZSBnbG9iYWwgLiosIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NhdGxpc3QsIHJlZ3VsYXIsIG5vX2RlYWRfc3RyaXAiLCBhbGlnbiA4JyAldCAmJgorLy8gUlVOWDogZ3JlcCAnQCJcXDAxTF9PQkpDX0xBQkVMX0NMQVNTXyQiID0gcHJpdmF0ZSBnbG9iYWwgLiosIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NsYXNzbGlzdCwgcmVndWxhciwgbm9fZGVhZF9zdHJpcCIsIGFsaWduIDgnICV0ICYmCisvLyBSVU5YOiBncmVwICdAIlxcMDFsX09CSkNfJF9DQVRFR09SWV9BXyRfQ2F0IiA9IHByaXZhdGUgZ2xvYmFsIC4qLCBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jb25zdCIsIGFsaWduIDgnICV0ICYmCisvLyBSVU5YOiBncmVwICdAIlxcMDFsX09CSkNfQ0xBU1NfUFJPVE9DT0xTXyRfQyIgPSBwcml2YXRlIGdsb2JhbCAuKiwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4JyAldCAmJgorLy8gUlVOWDogZ3JlcCAnQCJcXDAxbF9PQkpDX0NMQVNTX1JPXyRfQSIgPSBwcml2YXRlIGdsb2JhbCAuKiwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4JyAldCAmJgorLy8gUlVOWDogZ3JlcCAnQCJcXDAxbF9PQkpDX0NMQVNTX1JPXyRfQyIgPSBwcml2YXRlIGdsb2JhbCAuKiwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4JyAldCAmJgogLy8gUlVOWDogZ3JlcCAnQCJcXDAxbF9PQkpDX0xBQkVMX1BST1RPQ09MXyRfUCIgPSB3ZWFrIGhpZGRlbiBnbG9iYWwgLiosIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX3Byb3RvbGlzdCwgY29hbGVzY2VkLCBub19kZWFkX3N0cmlwIiwgYWxpZ24gOCcgJXQgJiYKLS8vIFJVTlg6IGdyZXAgJ0AiXFwwMWxfT0JKQ19NRVRBQ0xBU1NfUk9fJF9BIiA9IGludGVybmFsIGdsb2JhbCAuKiwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4JyAldCAmJgotLy8gUlVOWDogZ3JlcCAnQCJcXDAxbF9PQkpDX01FVEFDTEFTU19ST18kX0MiID0gaW50ZXJuYWwgZ2xvYmFsIC4qLCBzZWN0aW9uICJfX0RBVEEsIF9fb2JqY19jb25zdCIsIGFsaWduIDgnICV0ICYmCisvLyBSVU5YOiBncmVwICdAIlxcMDFsX09CSkNfTUVUQUNMQVNTX1JPXyRfQSIgPSBwcml2YXRlIGdsb2JhbCAuKiwgc2VjdGlvbiAiX19EQVRBLCBfX29iamNfY29uc3QiLCBhbGlnbiA4JyAldCAmJgorLy8gUlVOWDogZ3JlcCAnQCJcXDAxbF9PQkpDX01FVEFDTEFTU19ST18kX0MiID0gcHJpdmF0ZSBnbG9iYWwgLiosIHNlY3Rpb24gIl9fREFUQSwgX19vYmpjX2NvbnN0IiwgYWxpZ24gOCcgJXQgJiYKIC8vIFJVTlg6IGdyZXAgJ0AiXFwwMWxfT0JKQ19QUk9UT0NPTF8kX1AiID0gd2VhayBoaWRkZW4gZ2xvYmFsIC4qLCBzZWN0aW9uICJfX0RBVEEsX19kYXRhY29hbF9udCxjb2FsZXNjZWQiLCBhbGlnbiA4JyAldCAmJgogCiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvb2JqYy1yZWFkLXdlYWstYnlyZWYubSBiL3Rlc3QvQ29kZUdlbk9iakMvb2JqYy1yZWFkLXdlYWstYnlyZWYubQppbmRleCAzNWI0ZGUxLi4yMjhmNDc3IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL29iamMtcmVhZC13ZWFrLWJ5cmVmLm0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9vYmpjLXJlYWQtd2Vhay1ieXJlZi5tCkBAIC0xLDggKzEsNyBAQAotLy8gUkVRVUlSRVM6IHg4Ni1yZWdpc3RlcmVkLXRhcmdldCx4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKLS8vIFJVTjogJWNsYW5nX2NjMSAtZmJsb2NrcyAtZm9iamMtZ2MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1mb2JqYy1ydW50aW1lPW1hY29zeC1mcmFnaWxlLTEwLjUgLVMgJXMgLW8gJXQtNjQucwotLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBDSEVDSy1MUDY0IC0taW5wdXQtZmlsZT0ldC02NC5zICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZibG9ja3MgLWZvYmpjLWdjIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLWZvYmpjLXJ1bnRpbWU9bWFjb3N4LWZyYWdpbGUtMTAuNSAtUyAlcyAtbyAldC0zMi5zCi0vLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUxQMzIgLS1pbnB1dC1maWxlPSV0LTMyLnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZmJsb2NrcyAtZm9iamMtZ2MgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luIC1mb2JqYy1ydW50aW1lPW1hY29zeC1mcmFnaWxlLTEwLjUgLWVtaXQtbGx2bSAlcyAtbyAtIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZmJsb2NrcyAtZm9iamMtZ2MgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbiAtZm9iamMtcnVudGltZT1tYWNvc3gtZnJhZ2lsZS0xMC41IC1lbWl0LWxsdm0gJXMgLW8gLSB8IFwKKy8vIFJVTjogRmlsZUNoZWNrICVzCiAKIEBpbnRlcmZhY2UgTlNPYmplY3QgCiAtIGNvcHk7CkBAIC0xOSw4ICsxOCw1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8vIENIRUNLLUxQNjQ6IGNhbGxxICAgIF9vYmpjX3JlYWRfd2VhawotLy8gQ0hFQ0stTFA2NDogY2FsbHEgICAgX29iamNfcmVhZF93ZWFrCi0KLS8vIENIRUNLLUxQMzI6IGNhbGxsICAgICBMX29iamNfcmVhZF93ZWFrCi0vLyBDSEVDSy1MUDMyOiBjYWxsbCAgICAgTF9vYmpjX3JlYWRfd2VhaworLy8gQ0hFQ0s6IGNhbGwgaTgqIEBvYmpjX3JlYWRfd2VhaworLy8gQ0hFQ0s6IGNhbGwgaTgqIEBvYmpjX3JlYWRfd2VhawpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9vYmpjMi13ZWFrLWJsb2NrLWNhbGwubSBiL3Rlc3QvQ29kZUdlbk9iakMvb2JqYzItd2Vhay1ibG9jay1jYWxsLm0KaW5kZXggN2M2ODgxNy4uZTEzY2M3ZCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9vYmpjMi13ZWFrLWJsb2NrLWNhbGwubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL29iamMyLXdlYWstYmxvY2stY2FsbC5tCkBAIC0xLDUgKzEsNSBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mYmxvY2tzIC1mb2JqYy1nYyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4gLWZvYmpjLXJ1bnRpbWU9bWFjb3N4LWZyYWdpbGUtMTAuNSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBDSEVDSy1MUDY0ICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZibG9ja3MgLWZvYmpjLWdjIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLWZvYmpjLXJ1bnRpbWU9bWFjb3N4LWZyYWdpbGUtMTAuNSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBDSEVDSy1MUDY0ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZibG9ja3MgLWZvYmpjLWdjIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLWZvYmpjLXJ1bnRpbWU9bWFjb3N4LWZyYWdpbGUtMTAuNSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBDSEVDSy1MUDMyICVzCiAKIEBpbnRlcmZhY2UgTXlWaWV3CiAtICh2b2lkKU15Vmlld19zaGFyZWRJbml0OwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9vYmpjMi13ZWFrLWltcG9ydC1hdHRyaWJ1dGUubSBiL3Rlc3QvQ29kZUdlbk9iakMvb2JqYzItd2Vhay1pbXBvcnQtYXR0cmlidXRlLm0KaW5kZXggMjAxZTI0Yi4uNmVlNTc0NiAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9vYmpjMi13ZWFrLWltcG9ydC1hdHRyaWJ1dGUubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL29iamMyLXdlYWstaW1wb3J0LWF0dHJpYnV0ZS5tCkBAIC00NSw0ICs0NSw0IEBACiAKIEBpbXBsZW1lbnRhdGlvbiBSb290IEBlbmQKIAotLy8gQ0hFQ0stTk9ULVg4Ni02NDogT0JKQ19NRVRBQ0xBU1NfJF9Sb290IiA9IGV4dGVybl93ZWFrIGdsb2JhbAorLy8gQ0hFQ0stWDg2LTY0LU5PVDogT0JKQ19NRVRBQ0xBU1NfJF9Sb290IiA9IGV4dGVybl93ZWFrIGdsb2JhbApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9vcHRpbWl6ZS1pdmFyLW9mZnNldC1sb2FkLm0gYi90ZXN0L0NvZGVHZW5PYmpDL29wdGltaXplLWl2YXItb2Zmc2V0LWxvYWQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzRhYzEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9vcHRpbWl6ZS1pdmFyLW9mZnNldC1sb2FkLm0KQEAgLTAsMCArMSw2NCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwICAtT3MgLWVtaXQtbGx2bSAlcyAtbyAtICB8IEZpbGVDaGVjayAlcworLy8gcmRhcjovLzE2MDk1NzQ4CisKK0BpbnRlcmZhY2UgTlNPYmplY3QgCitAZW5kCisKK0BpbnRlcmZhY2UgU2FtcGxlQ2xhc3MgOiBOU09iamVjdCB7CisgICAgQHB1YmxpYworICAgIGludCBfdmFsdWU7Cit9CisrIChTYW1wbGVDbGFzcyopIG5ldzsKK0BlbmQKKworQGludGVyZmFjZSBBcHBEZWxlZ2F0ZSAgOiBOU09iamVjdAorQGVuZAorCitleHRlcm4gdm9pZCBmb28oaW50KTsKKworQGltcGxlbWVudGF0aW9uIEFwcERlbGVnYXRlCistICh2b2lkKWFwcGxpY2F0aW9uCit7CisgICAgLy8gQ3JlYXRlIHNldCBvZiBvYmplY3RzIGluIGxvb3AKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIFNhbXBsZUNsYXNzICpzYW1wbGUgPSBbU2FtcGxlQ2xhc3MgbmV3XTsKKyAgICAgICAgZm9vIChzYW1wbGUtPl92YWx1ZSk7CisgICAgfQorfQorQGVuZAorLy8gQ0hFQ0s6IFtbSVZBUjolLipdXSAgPSBsb2FkIGk2NCogQCJPQkpDX0lWQVJfJF9TYW1wbGVDbGFzcy5fdmFsdWUiLCBhbGlnbiA4CisvLyBDSEVDSzogW1tUSFJFRTolLipdXSA9IGJpdGNhc3QgW1tPTkU6JS4qXV0qIFtbQ0FMTDolLipdXSB0byBpOCoKKy8vIENIRUNLOiBbW0FERFBUUjolLipdXSA9IGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgaTgqIFtbVEhSRUVdXSwgaTY0IFtbSVZBUl1dCisvLyBDSEVDSzogW1tGT1VSOiUuKl1dID0gYml0Y2FzdCBpOCogW1tBRERQVFJdXSB0byBpMzIqCisvLyBDSEVDSzogW1tGSVZFOiUuKl1dID0gbG9hZCBpMzIqIFtbRk9VUl1dLCBhbGlnbiA0CisvLyBDSEVDSzogICB0YWlsIGNhbGwgdm9pZCBAZm9vKGkzMiBbW0ZJVkVdXSkKKworQGltcGxlbWVudGF0aW9uIFNhbXBsZUNsYXNzCisrIChTYW1wbGVDbGFzcyopIG5ldyB7IHJldHVybiAwOyB9CistICh2b2lkKSBTYW1wbGVDbGFzc0FwcGxpY2F0aW9uCit7CisgICAgLy8gQ3JlYXRlIHNldCBvZiBvYmplY3RzIGluIGxvb3AKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIFNhbXBsZUNsYXNzICpzYW1wbGUgPSBbU2FtcGxlQ2xhc3MgbmV3XTsKKyAgICAgICAgZm9vIChzYW1wbGUtPl92YWx1ZSk7CisgICAgfQorfQorQGVuZAorLy8gQ0hFQ0s6IFtbWkVSTzolLipdXSA9IGxvYWQgaTgqKiBAIlwwMUxfT0JKQ19TRUxFQ1RPUl9SRUZFUkVOQ0VTXyIsIGFsaWduIDgsICFpbnZhcmlhbnQubG9hZAorLy8gQ0hFQ0s6IFtbSVZBUjolLipdXSA9IGxvYWQgaTY0KiBAIk9CSkNfSVZBUl8kX1NhbXBsZUNsYXNzLl92YWx1ZSIsIGFsaWduIDgsICFpbnZhcmlhbnQubG9hZAorCitAaW50ZXJmYWNlIFNhbXBsZSA6IFNhbXBsZUNsYXNzIEBlbmQKKworQGltcGxlbWVudGF0aW9uIFNhbXBsZQorLSAodm9pZCkgU2FtcGxlQXBwbGljYXRpb24KK3sKKyAgICAvLyBDcmVhdGUgc2V0IG9mIG9iamVjdHMgaW4gbG9vcAorICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgU2FtcGxlQ2xhc3MgKnNhbXBsZSA9IFtTYW1wbGVDbGFzcyBuZXddOworICAgICAgICBmb28gKHNhbXBsZS0+X3ZhbHVlKTsKKyAgICB9Cit9CitAZW5kCisvLyBDSEVDSzogW1taRVJPOiUuKl1dID0gbG9hZCBpOCoqIEAiXDAxTF9PQkpDX1NFTEVDVE9SX1JFRkVSRU5DRVNfIiwgYWxpZ24gOCwgIWludmFyaWFudC5sb2FkIAorLy8gQ0hFQ0s6IFtbSVZBUjolLipdXSA9IGxvYWQgaTY0KiBAIk9CSkNfSVZBUl8kX1NhbXBsZUNsYXNzLl92YWx1ZSIsIGFsaWduIDgsICFpbnZhcmlhbnQubG9hZAorCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL292ZXJsb2FkYWJsZS5tIGIvdGVzdC9Db2RlR2VuT2JqQy9vdmVybG9hZGFibGUubQppbmRleCA0ZmQxNDI5Li4wZDU1Y2QzIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL292ZXJsb2FkYWJsZS5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvb3ZlcmxvYWRhYmxlLm0KQEAgLTEsMTAgKzEsMTIgQEAKIC8vIHJkYXI6Ly82NjU3NjEzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAlcyAtbyAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogQGNsYXNzIEM7CiAKLS8vIFJVTjogZ3JlcCBfWjFmUDExb2JqY19vYmplY3QgJXQgfCBjb3VudCAxCisvLyBDSEVDSzogX1oxZlAxMW9iamNfb2JqZWN0CisvLyBDSEVDSy1OT1Q6IF9aMWZQMTFvYmpjX29iamVjdAogdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSBmKGlkIGMpIHsgfQogCi0vLyBSVU46IGdyZXAgX1oxZlAxQyAldCB8IGNvdW50IDEKKy8vIENIRUNLOiBfWjFmUDFDCisvLyBDSEVDSy1OT1Q6IF9aMWZQMUMKIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkgZihDICpjKSB7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvcHJvcGVydHktYXJyYXktdHlwZS5tIGIvdGVzdC9Db2RlR2VuT2JqQy9wcm9wZXJ0eS1hcnJheS10eXBlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwMGZkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvcHJvcGVydHktYXJyYXktdHlwZS5tCkBAIC0wLDAgKzEsMzAgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyByZGFyOi8vMTU2MTA5NDMKKworc3RydWN0IF9HTEtNYXRyaXg0Cit7CisgICAgZmxvYXQgbVsxNl07Cit9OwordHlwZWRlZiBzdHJ1Y3QgX0dMS01hdHJpeDQgR0xLTWF0cml4NDsKKworQGludGVyZmFjZSBOU09iamVjdCBAZW5kCisKK0BpbnRlcmZhY2UgTXlQcm9ncmFtCistICh2b2lkKXNldFRyYW5zZm9ybTooZmxvYXRbMTZdKXRyYW5zZm9ybTsKK0BlbmQKKworQGludGVyZmFjZSBWaWV3Q29udHJvbGxlcgorQHByb3BlcnR5IChub25hdG9taWMsIGFzc2lnbikgR0xLTWF0cml4NCB0cmFuc2Zvcm07CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBWaWV3Q29udHJvbGxlcgorLSAodm9pZCl2aWV3RGlkTG9hZCB7CisgIE15UHJvZ3JhbSAqcHJvZ3JhbTsKKyAgcHJvZ3JhbS50cmFuc2Zvcm0gPSBzZWxmLnRyYW5zZm9ybS5tOworfQorQGVuZAorCisvLyBDSEVDSzogW1tNOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAlc3RydWN0Ll9HTEtNYXRyaXg0KiBbW1RNUDolLipdXSwgaTMyIDAsIGkzMiAwCisvLyBDSEVDSzogW1tBUlJBWURFQ0FZOiUuKl1dID0gZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyBbMTYgeCBmbG9hdF0qIFtbTV1dLCBpMzIgMCwgaTMyIDAKKy8vIENIRUNLOiBbW1NJWDolLipdXSA9IGxvYWQgaTgqKiBAIlwwMUxfT0JKQ19TRUxFQ1RPUl9SRUZFUkVOQ0VTCisvLyBDSEVDSzogIGNhbGwgdm9pZCBiaXRjYXN0IChpOCogKGk4KiwgaTgqLCAuLi4pKiBAb2JqY19tc2dTZW5kIHRvIHZvaWQgKGk4KiwgaTgqLCBmbG9hdCopKikoaTgqIFtbU0VWRU46JS4qXV0sIGk4KiBbW1NJWF1dLCBmbG9hdCogW1tBUlJBWURFQ0FZXV0pCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL3Byb3BlcnR5LWNhdGVnb3J5LWltcGwubSBiL3Rlc3QvQ29kZUdlbk9iakMvcHJvcGVydHktY2F0ZWdvcnktaW1wbC5tCmluZGV4IDczNGY5YTMuLjc2NWYxYWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvcHJvcGVydHktY2F0ZWdvcnktaW1wbC5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvcHJvcGVydHktY2F0ZWdvcnktaW1wbC5tCkBAIC0xNSw2ICsxNSw2IEBACiBAZW5kCiAKIAotLy8gQ0hFQ0s6IGxfT0JKQ18kX1BST1BfTElTVF9Gb29fJF9DYXRlZ29yeSIgPSBpbnRlcm5hbCBnbG9iYWwKLS8vIENIRUNLOiBsX09CSkNfJF9DQVRFR09SWV9Gb29fJF9DYXRlZ29yeSIgPSBpbnRlcm5hbCBnbG9iYWwKKy8vIENIRUNLOiBsX09CSkNfJF9QUk9QX0xJU1RfRm9vXyRfQ2F0ZWdvcnkiID0gcHJpdmF0ZSBnbG9iYWwKKy8vIENIRUNLOiBsX09CSkNfJF9DQVRFR09SWV9Gb29fJF9DYXRlZ29yeSIgPSBwcml2YXRlIGdsb2JhbAogLy8gQ0hFQ0s6IGxfT0JKQ18kX1BST1BfTElTVF9Gb29fJF9DYXRlZ29yeQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9wcm9wZXJ0eS1kYmcubSBiL3Rlc3QvQ29kZUdlbk9iakMvcHJvcGVydHktZGJnLm0KaW5kZXggNDJhYjYxMS4uZTBjYWM5OCAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQy9wcm9wZXJ0eS1kYmcubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL3Byb3BlcnR5LWRiZy5tCkBAIC0xLDQgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1TIC1nIC1tYXNtLXZlcmJvc2UgLXggb2JqZWN0aXZlLWMgPCAlcyB8IGdyZXAgRFdfQVRfbmFtZQorLy8gRklYTUU6IENoZWNrIElSIHJhdGhlciB0aGFuIGFzbSwgdGhlbiB0cmlwbGUgaXMgbm90IG5lZWRlZC4KKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLVMgLWcgLW1hc20tdmVyYm9zZSAteCBvYmplY3RpdmUtYyA8ICVzIHwgZ3JlcCBEV19BVF9uYW1lCiBAaW50ZXJmYWNlIEZvbyB7CiAgIGludCBpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9wcm9wZXJ0eS1saXN0LWluLWNsYXNzLm0gYi90ZXN0L0NvZGVHZW5PYmpDL3Byb3BlcnR5LWxpc3QtaW4tY2xhc3MubQppbmRleCBlODAxNDg1Li4yZjkyY2E3IDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL3Byb3BlcnR5LWxpc3QtaW4tY2xhc3MubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL3Byb3BlcnR5LWxpc3QtaW4tY2xhc3MubQpAQCAtMSw1ICsxLDUgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKLS8vIENIRUNLOiBsX09CSkNfJF9QUk9QX0xJU1RfQzIiID0gaW50ZXJuYWwgZ2xvYmFsIHsgaTMyLCBpMzIsIFszIHggJXN0cnVjdC5fcHJvcF90XSB9IHsgaTMyIDE2LCBpMzIgMworLy8gQ0hFQ0s6IGxfT0JKQ18kX1BST1BfTElTVF9DMiIgPSBwcml2YXRlIGdsb2JhbCB7IGkzMiwgaTMyLCBbMyB4ICVzdHJ1Y3QuX3Byb3BfdF0gfSB7IGkzMiAxNiwgaTMyIDMKIAogQHByb3RvY29sIFAgCiBAcHJvcGVydHkgaW50IGk7CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL3Byb3BlcnR5LXNlY3Rpb24tYXR0cmlidXRlLm0gYi90ZXN0L0NvZGVHZW5PYmpDL3Byb3BlcnR5LXNlY3Rpb24tYXR0cmlidXRlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhMDY0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvcHJvcGVydHktc2VjdGlvbi1hdHRyaWJ1dGUubQpAQCAtMCwwICsxLDEzIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrICVzCisvLyByZGFyOi8vMTU0NTA2MzcuCisKK0BpbnRlcmZhY2UgTlNPYmplY3QgQGVuZAorCitAaW50ZXJmYWNlIEZvbyA6IE5TT2JqZWN0CitAcHJvcGVydHkgaW50IHAgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX19URVhULGZvbyIpKSk7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBGb28gQGVuZAorCisvLyBDSEVDSzogZGVmaW5lIGludGVybmFsIGkzMiBAIlwwMS1bRm9vIHBdIih7ey4qfX0gc2VjdGlvbiAiX19URVhULGZvbyIgeworLy8gQ0hFQ0s6IGRlZmluZSBpbnRlcm5hbCB2b2lkIEAiXDAxLVtGb28gc2V0UDpdIih7ey4qfX0gc2VjdGlvbiAiX19URVhULGZvbyIgewpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy9wcm90b2NvbC1pbi1leHRlbmRlZC1jbGFzcy5tIGIvdGVzdC9Db2RlR2VuT2JqQy9wcm90b2NvbC1pbi1leHRlbmRlZC1jbGFzcy5tCmluZGV4IGE1ZmI4MGUuLjQ5YjI5MDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvcHJvdG9jb2wtaW4tZXh0ZW5kZWQtY2xhc3MubQorKysgYi90ZXN0L0NvZGVHZW5PYmpDL3Byb3RvY29sLWluLWV4dGVuZGVkLWNsYXNzLm0KQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0LHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IHg4Ni1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1TICVzIC1vICV0LTY0LnMKIC8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stTFA2NCAtLWlucHV0LWZpbGU9JXQtNjQucyAlcwogLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTM4Ni1hcHBsZS1kYXJ3aW4gLWZvYmpjLXJ1bnRpbWU9bWFjb3N4LWZyYWdpbGUtMTAuNSAtUyAlcyAtbyAldC0zMi5zCmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL3Jlb3JkZXItc3ludGhlc2l6ZWQtaXZhcnMubSBiL3Rlc3QvQ29kZUdlbk9iakMvcmVvcmRlci1zeW50aGVzaXplZC1pdmFycy5tCmluZGV4IDBmOGNmNmEuLjhmYWFmZmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakMvcmVvcmRlci1zeW50aGVzaXplZC1pdmFycy5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvcmVvcmRlci1zeW50aGVzaXplZC1pdmFycy5tCkBAIC0zOCwyMSArMzgsMjEgQEAKIH0KIEBlbmQKIAotLy8gQ0hFQ0s6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjEKLS8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjIKLS8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjMKLS8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjQKLS8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjUKLS8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjYKLS8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjcKLS8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjgKLS8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjkKLS8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3QxCi0vLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBpbnRlcm5hbCBnbG9iYWwgWzkgeCBpOF0gYyJfb2JqZWN0MgotLy8gQ0hFQ0stTkVYVDogQCJ7ey4qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIFs5IHggaThdIGMiX29iamVjdDMKLS8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3Q0Ci0vLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBpbnRlcm5hbCBnbG9iYWwgWzkgeCBpOF0gYyJfb2JqZWN0NQotLy8gQ0hFQ0stTkVYVDogQCJ7ey4qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIFs5IHggaThdIGMiX29iamVjdDYKLS8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3Q3Ci0vLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBpbnRlcm5hbCBnbG9iYWwgWzkgeCBpOF0gYyJfb2JqZWN0OAotLy8gQ0hFQ0stTkVYVDogQCJ7ey4qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIFs5IHggaThdIGMiX29iamVjdDkKKy8vIENIRUNLOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjEKKy8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IHByaXZhdGUgZ2xvYmFsIFsxMCB4IGk4XSBjIl9ib29sZWFuMgorLy8gQ0hFQ0stTkVYVDogQCJ7ey4qfX0iID0gcHJpdmF0ZSBnbG9iYWwgWzEwIHggaThdIGMiX2Jvb2xlYW4zCisvLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjQKKy8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IHByaXZhdGUgZ2xvYmFsIFsxMCB4IGk4XSBjIl9ib29sZWFuNQorLy8gQ0hFQ0stTkVYVDogQCJ7ey4qfX0iID0gcHJpdmF0ZSBnbG9iYWwgWzEwIHggaThdIGMiX2Jvb2xlYW42CisvLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbMTAgeCBpOF0gYyJfYm9vbGVhbjcKKy8vIENIRUNLLU5FWFQ6IEAie3suKn19IiA9IHByaXZhdGUgZ2xvYmFsIFsxMCB4IGk4XSBjIl9ib29sZWFuOAorLy8gQ0hFQ0stTkVYVDogQCJ7ey4qfX0iID0gcHJpdmF0ZSBnbG9iYWwgWzEwIHggaThdIGMiX2Jvb2xlYW45CisvLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3QxCisvLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3QyCisvLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3QzCisvLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3Q0CisvLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3Q1CisvLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3Q2CisvLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3Q3CisvLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3Q4CisvLyBDSEVDSy1ORVhUOiBAInt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbOSB4IGk4XSBjIl9vYmplY3Q5CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL3N0cmV0LTEubSBiL3Rlc3QvQ29kZUdlbk9iakMvc3RyZXQtMS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NWQxMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW5PYmpDL3N0cmV0LTEubQpAQCAtMCwwICsxLDIwIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZibG9ja3MgLXRyaXBsZSBhcm02NC1hcHBsZS1kYXJ3aW4gJXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9Q0hFQ0stQVJNNjQKKy8vIHJkYXI6Ly8xMjQxNjQzMworCitzdHJ1Y3Qgc3RyZXQgeyBpbnQgeFsxMDBdOyB9Oworc3RydWN0IHN0cmV0IHplcm87CitzdHJ1Y3Qgc3RyZXQgb25lID0ge3sxfX07CisKK0BpbnRlcmZhY2UgVGVzdCAgQGVuZAorCitAaW1wbGVtZW50YXRpb24gVGVzdAorKyhzdHJ1Y3Qgc3RyZXQpIG1ldGhvZCB7IHJldHVybiBvbmU7IH0KK0BlbmQKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworICAgIHN0cnVjdCBzdHJldCBzdDIgPSBvbmU7CisgICAgaWYgKGFyZ2MpIHN0MiA9IFsoaWQpKGFyZ2MmfjI1NSkgbWV0aG9kXTsKK30KKworLy8gQ0hFQ0stQVJNNjQ6IGNhbGwgdm9pZCBAbGx2bS5tZW1zZXQucDBpOC5pNjQoaTgqIFtbVDA6JS4qXV0sIGk4IDAsIGk2NCA0MDAsIGkzMiA0LCBpMSBmYWxzZSkKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakMvc3RyZXQubSBiL3Rlc3QvQ29kZUdlbk9iakMvc3RyZXQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI2ZjMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuT2JqQy9zdHJldC5tCkBAIC0wLDAgKzEsMjIgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZmJsb2NrcyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW45ICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVg4NgorLy8gUlVOOiAlY2xhbmdfY2MxIC1mYmxvY2tzIC10cmlwbGUgYXJtLWFwcGxlLWRhcndpbiAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1BUk0KKy8vIFJVTjogJWNsYW5nX2NjMSAtZmJsb2NrcyAtdHJpcGxlIGFybTY0LWFwcGxlLWRhcndpbiAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1BUk02NAorCisvLyA8cmRhcjovL3Byb2JsZW0vOTc1NzAxNT46IERvbid0IHVzZSAnc3RyZXQnIHZhcmlhbnRzIG9uIEFSTTY0LgorCisvLyBYODY6IEBtYWluCisvLyBYODY6IEBvYmpjX21zZ1NlbmRfc3RyZXQKKworLy8gQVJNOiBAbWFpbgorLy8gQVJNOiBAb2JqY19tc2dTZW5kX3N0cmV0CisKKy8vIEFSTTY0OiAgICAgQG1haW4KKy8vIEFSTTY0LU5PVDogQG9iamNfbXNnU2VuZF9zdHJldAorCitzdHJ1Y3Qgc3QgeyBpbnQgaVsxMDAwXTsgfTsKK0BpbnRlcmZhY2UgVGVzdAorKyhzdHJ1Y3Qgc3QpbWV0aG9kOworQGVuZAoraW50IG1haW4oKSB7CisgIFtUZXN0IG1ldGhvZF07Cit9CmRpZmYgLS1naXQgYS90ZXN0L0NvZGVHZW5PYmpDL3RyeS5tIGIvdGVzdC9Db2RlR2VuT2JqQy90cnkubQppbmRleCA1NmI4ZTY0Li40MTY4Y2IyIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDL3RyeS5tCisrKyBiL3Rlc3QvQ29kZUdlbk9iakMvdHJ5Lm0KQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0LHg4Ni02NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IHg4Ni1yZWdpc3RlcmVkLXRhcmdldAogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mb2JqYy1leGNlcHRpb25zIC1TIC1vIC0gLXRyaXBsZT1pNjg2LWFwcGxlLWRhcndpbjkKIC8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZm9iamMtZXhjZXB0aW9ucyAtUyAtbyAtIC10cmlwbGU9eDg2XzY0LWFwcGxlLWRhcndpbjkKIApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQy93ZWFrLW1ldGFjbGFzcy12aXNpYmlsaXR5Lm0gYi90ZXN0L0NvZGVHZW5PYmpDL3dlYWstbWV0YWNsYXNzLXZpc2liaWxpdHkubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc2MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuT2JqQy93ZWFrLW1ldGFjbGFzcy12aXNpYmlsaXR5Lm0KQEAgLTAsMCArMSwzMyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gcmRhcjovLzE2MjA2NDQzCisKK0BpbnRlcmZhY2UgTlNPYmplY3QgCistICh2b2lkKSBmaW5hbGl6ZTsKK0BlbmQKKworX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTk4NzYuNSkpKQorQGludGVyZmFjZSBNeUNsYXNzIDogTlNPYmplY3QKKysgKHZvaWQpc29tZUNsYXNzTWV0aG9kOworLSAodm9pZClzb21lSW5zdGFuY2VNZXRob2Q7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBNeUNsYXNzCisrICh2b2lkKXNvbWVDbGFzc01ldGhvZCB7Cit9CisKKy0gKHZvaWQpc29tZUluc3RhbmNlTWV0aG9kIHsKKyAgICBbTXlDbGFzcyBzb21lQ2xhc3NNZXRob2RdOworICAgIFtzdXBlciBmaW5hbGl6ZV07Cit9CitAZW5kCisKK3ZvaWQga2l0KCkKK3sKKyAgICBNeUNsYXNzICp3cmFwcGVyID0gW015Q2xhc3MgYWxsb2NdOworfQorCisvLyBDSEVDSzogQCJPQkpDX0NMQVNTXyRfTXlDbGFzcyIgPSBnbG9iYWwgJXN0cnVjdC5fY2xhc3NfdAorLy8gQ0hFQ0s6IEAiT0JKQ19NRVRBQ0xBU1NfJF9OU09iamVjdCIgPSBleHRlcm5hbCBnbG9iYWwgJXN0cnVjdC5fY2xhc3NfdAorLy8gQ0hFQ0s6IEAiT0JKQ19NRVRBQ0xBU1NfJF9NeUNsYXNzIiA9IGdsb2JhbCAlc3RydWN0Ll9jbGFzc190CisvLyBDSEVDSzogQCJPQkpDX0NMQVNTXyRfTlNPYmplY3QiID0gZXh0ZXJuYWwgZ2xvYmFsICVzdHJ1Y3QuX2NsYXNzX3QKKwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQ1hYL2FyYy1ibG9ja3MubW0gYi90ZXN0L0NvZGVHZW5PYmpDWFgvYXJjLWJsb2Nrcy5tbQppbmRleCBlYmI5ZDIxLi5jYzNlODMxIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDWFgvYXJjLWJsb2Nrcy5tbQorKysgYi90ZXN0L0NvZGVHZW5PYmpDWFgvYXJjLWJsb2Nrcy5tbQpAQCAtMiw3ICsyLDcgQEAKIAogLy8gQ0hFQ0s6IFtbQTouKl1dID0gdHlwZSB7IGk2NCwgWzEwIHggaTgqXSB9CiAKLS8vIENIRUNLOiBbW0xBWU9VVDA6QC4qXV0gPSBpbnRlcm5hbCBnbG9iYWwgWzMgeCBpOF0gYyIgOVwwMCIKKy8vIENIRUNLOiBbW0xBWU9VVDA6QC4qXV0gPSBwcml2YXRlIGdsb2JhbCBbMyB4IGk4XSBjIiA5XDAwIgogCiAvLyByZGFyOi8vMTMwNDUyNjkKIC8vIElmIGEgX19ibG9jayB2YXJpYWJsZSByZXF1aXJlcyBleHRlbmRlZCBsYXlvdXQgaW5mb3JtYXRpb24gKmFuZCoKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakNYWC9hcmMtY3h4MTEtbWVtYmVyLWluaXQubW0gYi90ZXN0L0NvZGVHZW5PYmpDWFgvYXJjLWN4eDExLW1lbWJlci1pbml0Lm1tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxM2U3YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW5PYmpDWFgvYXJjLWN4eDExLW1lbWJlci1pbml0Lm1tCkBAIC0wLDAgKzEsMzIgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWZvYmpjLWFyYyAtc3RkPWMrKzExIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gcmRhcjovLzE2Mjk5OTY0CisgIAorQGludGVyZmFjZSBOU09iamVjdAorKyAoaWQpbmV3OworQGVuZAorCitAaW50ZXJmYWNlIE5TTXV0YWJsZURpY3Rpb25hcnkgOiBOU09iamVjdAorQGVuZAorICAKK2NsYXNzIFhDbGlwYm9hcmREYXRhU2V0Cit7IAorICBOU011dGFibGVEaWN0aW9uYXJ5KiBtQ2xpcERhdGEgPSBbTlNNdXRhYmxlRGljdGlvbmFyeSBuZXddOworfTsKKyAgCitAaW50ZXJmYWNlIEFwcERlbGVnYXRlIEBlbmQKKworQGltcGxlbWVudGF0aW9uIEFwcERlbGVnYXRlCistICh2b2lkKWFwcGxpY2F0aW9uRGlkRmluaXNoTGF1bmNoaW5nCit7IAorIFhDbGlwYm9hcmREYXRhU2V0IGNsaXA7IAorfQorQGVuZAorCisvLyBDSEVDSzogW1ttQ2xpcERhdGE6JS4qXV0gPSBnZXRlbGVtZW50cHRyIGluYm91bmRzICVjbGFzcy5YQ2xpcGJvYXJkRGF0YVNldCogCisvLyBDSEVDSzogW1taRVJPOiUuKl1dID0gbG9hZCAlc3RydWN0Ll9jbGFzc190KiogQCJcMDFMX09CSkNfQ0xBU1NMSVNUX1JFRkVSRU5DRVNfJF8iCisvLyBDSEVDSzogW1tPTkU6JS4qXV0gPSBsb2FkIGk4KiogQCJcMDFMX09CSkNfU0VMRUNUT1JfUkVGRVJFTkNFU18iCisvLyBDSEVDSzogW1tUV086JS4qXV0gPSBiaXRjYXN0ICVzdHJ1Y3QuX2NsYXNzX3QqIFtbWkVST11dIHRvIGk4KgorLy8gQ0hFQ0s6IFtbQ0FMTDolLipdXSA9IGNhbGwgaTgqIGJpdGNhc3QgKGk4KiAoaTgqLCBpOCosIC4uLikqIEBvYmpjX21zZ1NlbmQgdG8gaTgqIChpOCosIGk4KikqKShpOCogW1tUV09dXSwgaTgqIFtbT05FXV0pCisvLyBDSEVDSzogW1tUSFJFRTolLipdXSA9IGJpdGNhc3QgaTgqIFtbQ0FMTF1dIHRvIFtbVDolLipdXSoKKy8vIENIRUNLOiBzdG9yZSBbW1RdXSogW1tUSFJFRV1dLCBbW1RdXSoqIFtbbUNsaXBEYXRhXV0sIGFsaWduIDgKKwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQ1hYL2FyYy1tYW5nbGUubW0gYi90ZXN0L0NvZGVHZW5PYmpDWFgvYXJjLW1hbmdsZS5tbQppbmRleCAxMGM0ZjY4Li5iOTIxYTdmIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDWFgvYXJjLW1hbmdsZS5tbQorKysgYi90ZXN0L0NvZGVHZW5PYmpDWFgvYXJjLW1hbmdsZS5tbQpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm9iamMtYXJjIC1mb2JqYy1ydW50aW1lLWhhcy13ZWFrIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mb2JqYy1hcmMgLWZvYmpjLXJ1bnRpbWUtaGFzLXdlYWsgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSy1MQUJFTDogZGVmaW5lIHZvaWQgQF9aMWZQVThfX3N0cm9uZ1AxMW9iamNfb2JqZWN0KGk4KiopCiB2b2lkIGYoX19zdHJvbmcgaWQgKikge30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakNYWC9lbmNvZGUubW0gYi90ZXN0L0NvZGVHZW5PYmpDWFgvZW5jb2RlLm1tCmluZGV4IDA3NWQ3OTAuLmUwMTcxZWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvQ29kZUdlbk9iakNYWC9lbmNvZGUubW0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQ1hYL2VuY29kZS5tbQpAQCAtMjEzLDcgKzIxMyw3IEBACiAgIGR5bmFtaWNfY2xhc3MgZHluYW1pY19jbGFzc19pdmFyOwogfQogQGVuZAotLy8gQ0hFQ0s6IGludGVybmFsIGdsb2JhbCBbNDEgeCBpOF0gYyJ7ZHluYW1pY19jbGFzcz1cMjJfdnB0ciRkeW5hbWljX2NsYXNzXDIyXl4/fVwwMCIKKy8vIENIRUNLOiBwcml2YXRlIGdsb2JhbCBbNDEgeCBpOF0gYyJ7ZHluYW1pY19jbGFzcz1cMjJfdnB0ciRkeW5hbWljX2NsYXNzXDIyXl4/fVwwMCIKIAogbmFtZXNwYWNlIFBSMTcxNDIgewogICBzdHJ1Y3QgQSB7IHZpcnR1YWwgfkEoKTsgfTsKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakNYWC9leHRlcm5hbGx5LWluaXRpYWxpemVkLXNlbGVjdG9ycy5tbSBiL3Rlc3QvQ29kZUdlbk9iakNYWC9leHRlcm5hbGx5LWluaXRpYWxpemVkLXNlbGVjdG9ycy5tbQppbmRleCA4N2E3YzA0Li4wYjdjMjRlIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDWFgvZXh0ZXJuYWxseS1pbml0aWFsaXplZC1zZWxlY3RvcnMubW0KKysrIGIvdGVzdC9Db2RlR2VuT2JqQ1hYL2V4dGVybmFsbHktaW5pdGlhbGl6ZWQtc2VsZWN0b3JzLm1tCkBAIC0xLDcgKzEsNyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1jYzEgLWZvYmpjLXJ1bnRpbWU9bWFjb3N4LWZyYWdpbGUtMTAuNSAtbyAtIC1lbWl0LWxsdm0gJXMgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtY2MxIC1vIC0gLWVtaXQtbGx2bSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mb2JqYy1ydW50aW1lPW1hY29zeC1mcmFnaWxlLTEwLjUgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLW8gLSAtZW1pdC1sbHZtICVzIHwgRmlsZUNoZWNrICVzCiAKLS8vIENIRUNLOiBAIlwwMUxfT0JKQ19TRUxFQ1RPUl9SRUZFUkVOQ0VTXyIgPSBpbnRlcm5hbCBleHRlcm5hbGx5X2luaXRpYWxpemVkIGdsb2JhbAorLy8gQ0hFQ0s6IEAiXDAxTF9PQkpDX1NFTEVDVE9SX1JFRkVSRU5DRVNfIiA9IHByaXZhdGUgZXh0ZXJuYWxseV9pbml0aWFsaXplZCBnbG9iYWwKIAogdm9pZCB0ZXN0KGlkIHgpIHsKICAgW3ggZG9Tb21ldGhpbmddOwpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQ1hYL2xhbWJkYS1leHByZXNzaW9ucy5tbSBiL3Rlc3QvQ29kZUdlbk9iakNYWC9sYW1iZGEtZXhwcmVzc2lvbnMubW0KaW5kZXggMjQ2OGViMS4uNDM1ZjgwNSAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT2JqQ1hYL2xhbWJkYS1leHByZXNzaW9ucy5tbQorKysgYi90ZXN0L0NvZGVHZW5PYmpDWFgvbGFtYmRhLWV4cHJlc3Npb25zLm1tCkBAIC00LDggKzQsOCBAQAogdHlwZWRlZiBpbnQgKF5mcCkoKTsKIGZwIGYoKSB7IGF1dG8geCA9IFtdeyByZXR1cm4gMzsgfTsgcmV0dXJuIHg7IH0KIAotLy8gTVJDOiBAIlwwMUxfT0JKQ19NRVRIX1ZBUl9OQU1Fe3suKn19IiA9IGludGVybmFsIGdsb2JhbCBbNSB4IGk4XSBjImNvcHlcMDAiCi0vLyBNUkM6IEAiXDAxTF9PQkpDX01FVEhfVkFSX05BTUV7ey4qfX0iID0gaW50ZXJuYWwgZ2xvYmFsIFsxMiB4IGk4XSBjImF1dG9yZWxlYXNlXDAwIgorLy8gTVJDOiBAIlwwMUxfT0JKQ19NRVRIX1ZBUl9OQU1Fe3suKn19IiA9IHByaXZhdGUgZ2xvYmFsIFs1IHggaThdIGMiY29weVwwMCIKKy8vIE1SQzogQCJcMDFMX09CSkNfTUVUSF9WQVJfTkFNRXt7Lip9fSIgPSBwcml2YXRlIGdsb2JhbCBbMTIgeCBpOF0gYyJhdXRvcmVsZWFzZVwwMCIKIC8vIE1SQy1MQUJFTDogZGVmaW5lIGkzMiAoKSogQF9aMWZ2KAogLy8gTVJDLUxBQkVMOiBkZWZpbmUgaW50ZXJuYWwgaTMyICgpKiBAIl9aWjFmdkVOSzMkXzBjdlUxM2Jsb2NrX3BvaW50ZXJGaXZFRXYiCiAvLyBNUkM6IHN0b3JlIGk4KiBiaXRjYXN0IChpOCoqIEBfTlNDb25jcmV0ZVN0YWNrQmxvY2sgdG8gaTgqKQpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQ1hYL21pY3Jvc29mdC1hYmktYXJjLXBhcmFtLW9yZGVyLm1tIGIvdGVzdC9Db2RlR2VuT2JqQ1hYL21pY3Jvc29mdC1hYmktYXJjLXBhcmFtLW9yZGVyLm1tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMDFiMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0NvZGVHZW5PYmpDWFgvbWljcm9zb2Z0LWFiaS1hcmMtcGFyYW0tb3JkZXIubW0KQEAgLTAsMCArMSwyMCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1tY29uc3RydWN0b3ItYWxpYXNlcyAtZm9iamMtYXJjIC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKworc3RydWN0IEEgeworICBBKCk7CisgIEEoY29uc3QgQSAmKTsKKyAgfkEoKTsKKyAgaW50IGE7Cit9OworCisvLyBWZXJpZnkgdGhhdCB3ZSBkZXN0cnVjdCB0aGluZ3MgZnJvbSBsZWZ0IHRvIHJpZ2h0IGluIHRoZSBNUyBDKysgQUJJOiBhLCBiLCBjLCBkLgorLy8KKy8vIENIRUNLLUxBQkVMOiBkZWZpbmUgdm9pZCBAIlwwMT90ZXN0X2FyY19vcmRlckBAWUFYVUFAQFBBQUFQQVVvYmpjX29iamVjdEBAMDFAWiIKKy8vIENIRUNLOiAgICAgICAgICAgICAgICAgICAgICAgKDx7ICVzdHJ1Y3QuQSwgaTgqLCAlc3RydWN0LkEsIGk4KiB9PiogaW5hbGxvY2EpCit2b2lkIHRlc3RfYXJjX29yZGVyKEEgYSwgaWQgX19hdHRyaWJ1dGVfXygobnNfY29uc3VtZWQpKSBiICwgQSBjLCBpZCBfX2F0dHJpYnV0ZV9fKChuc19jb25zdW1lZCkpIGQpIHsKKyAgLy8gQ0hFQ0s6IGNhbGwgeDg2X3RoaXNjYWxsY2Mgdm9pZCBAIlwwMT8/MUFAQFFBRUBYWiIoJXN0cnVjdC5BKiAle3suKn19KQorICAvLyBDSEVDSzogY2FsbCB2b2lkIEBvYmpjX3N0b3JlU3Ryb25nKGk4KiogJXt7Lip9fSwgaTgqIG51bGwpCisgIC8vIENIRUNLOiBjYWxsIHg4Nl90aGlzY2FsbGNjIHZvaWQgQCJcMDE/PzFBQEBRQUVAWFoiKCVzdHJ1Y3QuQSogJXt7Lip9fSkKKyAgLy8gQ0hFQ0s6IGNhbGwgdm9pZCBAb2JqY19zdG9yZVN0cm9uZyhpOCoqICV7ey4qfX0sIGk4KiBudWxsKQorICAvLyBDSEVDSzogcmV0IHZvaWQKK30KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9iakNYWC9wcm9wZXJ0eS1sdmFsdWUtY2FwdHVyZS5tbSBiL3Rlc3QvQ29kZUdlbk9iakNYWC9wcm9wZXJ0eS1sdmFsdWUtY2FwdHVyZS5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDAyNGZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Db2RlR2VuT2JqQ1hYL3Byb3BlcnR5LWx2YWx1ZS1jYXB0dXJlLm1tCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIHJkYXI6Ly8xNTExODEyOAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFF1YWQyIHsKKyAgUXVhZDIoKSB7fQorfTsKKwordHlwZWRlZiBRdWFkMjxkb3VibGU+IFF1YWQyZDsKKworQGludGVyZmFjZSBSb290IEBlbmQKKworQGludGVyZmFjZSBQQUdlb21ldHJ5RnJhbWUKKy0gKGNvbnN0IFF1YWQyZCAmKXF1YWQ7CistICh2b2lkKXNldFF1YWQ6KGNvbnN0IFF1YWQyZCAmKXF1YWQ7CitAZW5kCisKK0BpbnRlcmZhY2UgUEEyRFNjYWxlVHJhbnNmb3JtICA6IFJvb3QKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFBBMkRTY2FsZVRyYW5zZm9ybQorLSAodm9pZCl0cmFuc2Zvcm1GcmFtZTooUEFHZW9tZXRyeUZyYW1lICopZnJhbWUgeworIFBBR2VvbWV0cnlGcmFtZSAqcmVzdWx0OworIHJlc3VsdC5xdWFkICA9IGZyYW1lLnF1YWQ7Cit9CitAZW5kCisKKy8vIENIRUNLOiAgIFtbVFdPOiUuKl1dID0gbG9hZCBpOCoqIEAiXDAxTF9PQkpDX1NFTEVDVE9SX1JFRkVSRU5DRVNfIiwgIWludmFyaWFudC5sb2FkICE1CisvLyBDSEVDSzogICBbW1RIUkVFOiUuKl1dID0gYml0Y2FzdCBbW09ORVQ6JS4qXV0qIFtbT05FOiUuKl1dIHRvIGk4KgorLy8gQ0hFQ0s6ICAgW1tDQUxMOiUuKl1dID0gY2FsbCAlc3RydWN0LlF1YWQyKiBiaXRjYXN0IChpOCogKGk4KiwgaTgqLCAuLi4pKiBAb2JqY19tc2dTZW5kIHRvICVzdHJ1Y3QuUXVhZDIqIChpOCosIGk4KikqKShpOCogW1tUSFJFRV1dLCBpOCogW1tUV09dXSkKKy8vIENIRUNLOiAgIFtbRk9VUjolLipdXSA9IGxvYWQgaTgqKiBAIlwwMUxfT0JKQ19TRUxFQ1RPUl9SRUZFUkVOQ0VTXzIiLCAhaW52YXJpYW50LmxvYWQgITUKKy8vIENIRUNLOiAgIFtbRklWRTolLipdXSA9IGJpdGNhc3QgW1tPTkVUXV0qIFtbWkVSTzolLipdXSB0byBpOCoKKy8vIENIRUNLOiAgIGNhbGwgdm9pZCBiaXRjYXN0IChpOCogKGk4KiwgaTgqLCAuLi4pKiBAb2JqY19tc2dTZW5kIHRvIHZvaWQgKGk4KiwgaTgqLCAlc3RydWN0LlF1YWQyKikqKShpOCogW1tGSVZFXV0sIGk4KiBbW0ZPVVJdXSwgJXN0cnVjdC5RdWFkMiogW1tDQUxMXV0pCisKKworc3RydWN0IEEgeworIHZvaWQgKnB0cjsKKyBBKCk7CisgQShjb25zdCBBICYpOworIH5BKCk7Cit9OworCitAaW50ZXJmYWNlIEMKKy0gKHZvaWQpIHNldFByb3A6IChjb25zdCBBJikgdmFsdWU7CitAZW5kCit2b2lkIHRlc3QoQyAqYywgY29uc3QgQSAmYSkgeworIGNvbnN0IEEgJnJlc3VsdCA9IGMucHJvcCA9IGE7Cit9CisKKy8vIENIRUNLOiAgIFtbT05FMTolLipdXSA9IGxvYWQgJXN0cnVjdC5BKiogW1tBQUREUjolLipdXSwgYWxpZ24gOAorLy8gQ0hFQ0s6ICAgW1tUV08xOiUuKl1dID0gbG9hZCBpOCoqIEAiXDAxTF9PQkpDX1NFTEVDVE9SX1JFRkVSRU5DRVNfNSIsICFpbnZhcmlhbnQubG9hZCAhNQorLy8gQ0hFQ0s6ICAgW1tUSFJFRTE6JS4qXV0gPSBiaXRjYXN0IFtbVFdPVDolLipdXSogW1taRVJPMTolLipdXSB0byBpOCoKKy8vIENIRUNLOiAgIGNhbGwgdm9pZCBiaXRjYXN0IChpOCogKGk4KiwgaTgqLCAuLi4pKiBAb2JqY19tc2dTZW5kIHRvIHZvaWQgKGk4KiwgaTgqLCAlc3RydWN0LkEqKSopKGk4KiBbW1RIUkVFMV1dLCBpOCogW1tUV08xXV0sICVzdHJ1Y3QuQSogW1tPTkUxXV0pCisvLyBDSEVDSzogICBzdG9yZSAlc3RydWN0LkEqIFtbT05FMV1dLCAlc3RydWN0LkEqKiBbW1JFU1VMVDolLipdXSwgYWxpZ24gOApkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT2JqQ1hYL3J0dGkubW0gYi90ZXN0L0NvZGVHZW5PYmpDWFgvcnR0aS5tbQppbmRleCBlNDU4ZjA5Li4zMjY3NjBmIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PYmpDWFgvcnR0aS5tbQorKysgYi90ZXN0L0NvZGVHZW5PYmpDWFgvcnR0aS5tbQpAQCAtNCwxOSArNCwxOSBAQAogCiBuYW1lc3BhY2Ugc3RkIHsgY2xhc3MgdHlwZV9pbmZvOyB9CiAKLS8vIENIRUNLOiBAX1pUSTFBID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCB7ey4qfX1AX1pUVk4xMF9fY3h4YWJpdjExN19fY2xhc3NfdHlwZV9pbmZvRXt7Lip9fUBfWlRTMUEKKy8vIENIRUNLOiBAX1pUSTFBID0gbGlua29uY2Vfb2RyIGNvbnN0YW50IHt7Lip9fUBfWlRWTjEwX19jeHhhYml2MTE3X19jbGFzc190eXBlX2luZm9Fe3suKn19QF9aVFMxQQogQGludGVyZmFjZSBBCiBAZW5kCiAKLS8vIENIRUNLOiBAX1pUSTFCID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCB7ey4qfX1AX1pUVk4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRXt7Lip9fUBfWlRTMUJ7ey4qfX1AX1pUSTFBCisvLyBDSEVDSzogQF9aVEkxQiA9IGxpbmtvbmNlX29kciBjb25zdGFudCB7ey4qfX1AX1pUVk4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRXt7Lip9fUBfWlRTMUJ7ey4qfX1AX1pUSTFBCiBAaW50ZXJmYWNlIEIgOiBBCiBAZW5kCiAKLS8vIENIRUNLOiBAX1pUSVAxQiA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQge3suKn19QF9aVFZOMTBfX2N4eGFiaXYxMTlfX3BvaW50ZXJfdHlwZV9pbmZvRXt7Lip9fUBfWlRTUDFCe3suKn19KSwgaTMyIDAsIHt7Lip9fUBfWlRJMUIKLS8vIENIRUNLOiBAX1pUSTExb2JqY19vYmplY3QgPSBsaW5rb25jZV9vZHIgdW5uYW1lZF9hZGRyIGNvbnN0YW50IHt7Lip9fUBfWlRWTjEwX19jeHhhYml2MTE3X19jbGFzc190eXBlX2luZm9Fe3suKn19QF9aVFMxMW9iamNfb2JqZWN0Ci0vLyBDSEVDSzogQF9aVElQMTFvYmpjX29iamVjdCA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQge3suKn19QF9aVFZOMTBfX2N4eGFiaXYxMTlfX3BvaW50ZXJfdHlwZV9pbmZvRXt7Lip9fUBfWlRTUDExb2JqY19vYmplY3R7ey4qfX1AX1pUSTExb2JqY19vYmplY3QKLS8vIENIRUNLOiBAX1pUSTEwb2JqY19jbGFzcyA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQge3suKn19QF9aVFZOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0V7ey4qfX1AX1pUUzEwb2JqY19jbGFzcwotLy8gQ0hFQ0s6IEBfWlRJUDEwb2JqY19jbGFzcyA9IGxpbmtvbmNlX29kciB1bm5hbWVkX2FkZHIgY29uc3RhbnQge3suKn19QF9aVFZOMTBfX2N4eGFiaXYxMTlfX3BvaW50ZXJfdHlwZV9pbmZvRXt7Lip9fUBfWlRTUDEwb2JqY19jbGFzc3t7Lip9fUBfWlRJMTBvYmpjX2NsYXNzCisvLyBDSEVDSzogQF9aVElQMUIgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQge3suKn19QF9aVFZOMTBfX2N4eGFiaXYxMTlfX3BvaW50ZXJfdHlwZV9pbmZvRXt7Lip9fUBfWlRTUDFCe3suKn19KSwgaTMyIDAsIHt7Lip9fUBfWlRJMUIKKy8vIENIRUNLOiBAX1pUSTExb2JqY19vYmplY3QgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQge3suKn19QF9aVFZOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0V7ey4qfX1AX1pUUzExb2JqY19vYmplY3QKKy8vIENIRUNLOiBAX1pUSVAxMW9iamNfb2JqZWN0ID0gbGlua29uY2Vfb2RyIGNvbnN0YW50IHt7Lip9fUBfWlRWTjEwX19jeHhhYml2MTE5X19wb2ludGVyX3R5cGVfaW5mb0V7ey4qfX1AX1pUU1AxMW9iamNfb2JqZWN0e3suKn19QF9aVEkxMW9iamNfb2JqZWN0CisvLyBDSEVDSzogQF9aVEkxMG9iamNfY2xhc3MgPSBsaW5rb25jZV9vZHIgY29uc3RhbnQge3suKn19QF9aVFZOMTBfX2N4eGFiaXYxMTdfX2NsYXNzX3R5cGVfaW5mb0V7ey4qfX1AX1pUUzEwb2JqY19jbGFzcworLy8gQ0hFQ0s6IEBfWlRJUDEwb2JqY19jbGFzcyA9IGxpbmtvbmNlX29kciBjb25zdGFudCB7ey4qfX1AX1pUVk4xMF9fY3h4YWJpdjExOV9fcG9pbnRlcl90eXBlX2luZm9Fe3suKn19QF9aVFNQMTBvYmpjX2NsYXNze3suKn19QF9aVEkxMG9iamNfY2xhc3MKIAogQHByb3RvY29sIFA7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9wZW5DTC9hZGRyZXNzLXNwYWNlcy1tYW5nbGluZy5jbCBiL3Rlc3QvQ29kZUdlbk9wZW5DTC9hZGRyZXNzLXNwYWNlcy1tYW5nbGluZy5jbAppbmRleCAzYzdhNTE4Li5lZGI1M2ZjIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PcGVuQ0wvYWRkcmVzcy1zcGFjZXMtbWFuZ2xpbmcuY2wKKysrIGIvdGVzdC9Db2RlR2VuT3BlbkNML2FkZHJlc3Mtc3BhY2VzLW1hbmdsaW5nLmNsCkBAIC0xLDUgKzEsNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mZmFrZS1hZGRyZXNzLXNwYWNlLW1hcCAtZmFkZHJlc3Mtc3BhY2UtbWFwLW1hbmdsaW5nPXllcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1BU01BTkcgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZmZha2UtYWRkcmVzcy1zcGFjZS1tYXAgLWZhZGRyZXNzLXNwYWNlLW1hcC1tYW5nbGluZz1ubyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1OT0FTTUFORyAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mZmFrZS1hZGRyZXNzLXNwYWNlLW1hcCAtZmFkZHJlc3Mtc3BhY2UtbWFwLW1hbmdsaW5nPXllcyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9QVNNQU5HICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWZmYWtlLWFkZHJlc3Mtc3BhY2UtbWFwIC1mYWRkcmVzcy1zcGFjZS1tYXAtbWFuZ2xpbmc9bm8gLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU5PQVNNQU5HICVzCiAKIC8vIFdlIGNhbid0IG5hbWUgdGhpcyBmIGFzIHByaXZhdGUgaXMgZXF1aXZhbGVudCB0byBkZWZhdWx0CiAvLyBubyBzcGVjaWZpZXIgZ2l2ZW4gYWRkcmVzcyBzcGFjZSBzbyB3ZSBnZXQgbXVsdGlwbGUgZGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC9Db2RlR2VuT3BlbkNML2tlcm5lbC1hcmctaW5mby5jbCBiL3Rlc3QvQ29kZUdlbk9wZW5DTC9rZXJuZWwtYXJnLWluZm8uY2wKaW5kZXggYzdlMjA0OS4uMDEyM2YzNyAxMDA2NDQKLS0tIGEvdGVzdC9Db2RlR2VuT3BlbkNML2tlcm5lbC1hcmctaW5mby5jbAorKysgYi90ZXN0L0NvZGVHZW5PcGVuQ0wva2VybmVsLWFyZy1pbmZvLmNsCkBAIC0xMyw3ICsxMyw3IEBACiAKIGtlcm5lbCB2b2lkIGZvbzIocmVhZF9vbmx5IGltYWdlMWRfdCBpbWcxLCBpbWFnZTJkX3QgaW1nMiwgd3JpdGVfb25seSBpbWFnZTJkX2FycmF5X3QgaW1nMykgewogfQotLy8gQ0hFQ0s6IG1ldGFkYXRhICF7bWV0YWRhdGEgISJrZXJuZWxfYXJnX2FkZHJfc3BhY2UiLCBpMzIgMCwgaTMyIDAsIGkzMiAwfQorLy8gQ0hFQ0s6IG1ldGFkYXRhICF7bWV0YWRhdGEgISJrZXJuZWxfYXJnX2FkZHJfc3BhY2UiLCBpMzIgMSwgaTMyIDEsIGkzMiAxfQogLy8gQ0hFQ0s6IG1ldGFkYXRhICF7bWV0YWRhdGEgISJrZXJuZWxfYXJnX2FjY2Vzc19xdWFsIiwgbWV0YWRhdGEgISJyZWFkX29ubHkiLCBtZXRhZGF0YSAhInJlYWRfb25seSIsIG1ldGFkYXRhICEid3JpdGVfb25seSJ9CiAvLyBDSEVDSzogbWV0YWRhdGEgIXttZXRhZGF0YSAhImtlcm5lbF9hcmdfdHlwZSIsIG1ldGFkYXRhICEiaW1hZ2UxZF90IiwgbWV0YWRhdGEgISJpbWFnZTJkX3QiLCBtZXRhZGF0YSAhImltYWdlMmRfYXJyYXlfdCJ9CiAvLyBDSEVDSzogbWV0YWRhdGEgIXttZXRhZGF0YSAhImtlcm5lbF9hcmdfdHlwZV9xdWFsIiwgbWV0YWRhdGEgISIiLCBtZXRhZGF0YSAhIiIsIG1ldGFkYXRhICEiIn0KZGlmZiAtLWdpdCBhL3Rlc3QvQ29kZUdlbk9wZW5DTC9sb2NhbC5jbCBiL3Rlc3QvQ29kZUdlbk9wZW5DTC9sb2NhbC5jbAppbmRleCBiNWM2N2Q5Li4zMDljMzFhIDEwMDY0NAotLS0gYS90ZXN0L0NvZGVHZW5PcGVuQ0wvbG9jYWwuY2wKKysrIGIvdGVzdC9Db2RlR2VuT3BlbkNML2xvY2FsLmNsCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mZmFrZS1hZGRyZXNzLXNwYWNlLW1hcCAtZmFkZHJlc3Mtc3BhY2UtbWFwLW1hbmdsaW5nPW5vIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mZmFrZS1hZGRyZXNzLXNwYWNlLW1hcCAtZmFkZHJlc3Mtc3BhY2UtbWFwLW1hbmdsaW5nPW5vIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogX19rZXJuZWwgdm9pZCBmb28odm9pZCkgewogICAvLyBDSEVDSzogQGZvby5pID0gaW50ZXJuYWwgYWRkcnNwYWNlKDIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvYmFzaWNfbGludXhfbGliY3h4X3RyZWUvdXNyL2Jpbi8ua2VlcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9iYXNpY19saW51eF9saWJjeHhfdHJlZS91c3IvYmluLy5rZWVwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvYmFzaWNfbGludXhfbGliY3h4X3RyZWUvdXNyL2luY2x1ZGUvYysrL3YxLy5rZWVwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oCmNvcHkgdG8gdGVzdC9Ecml2ZXIvSW5wdXRzL2Jhc2ljX2xpbnV4X2xpYmN4eF90cmVlL3Vzci9pbmNsdWRlL2MrKy92MS8ua2VlcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL2Jhc2ljX2xpbnV4X2xpYmN4eF90cmVlL3Vzci9saWIvLmtlZXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvYmFzaWNfbGludXhfbGliY3h4X3RyZWUvdXNyL2xpYi8ua2VlcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL2RlYmlhbl9yZWR1Y2VkX21pcHNfdHJlZS9saWIvLmtlZXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL2xpYi8ua2VlcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL2RlYmlhbl9yZWR1Y2VkX21pcHNfdHJlZS9saWIvbWlwcy1saW51eC1nbnUvLmtlZXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL2xpYi9taXBzLWxpbnV4LWdudS8ua2VlcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL2RlYmlhbl9yZWR1Y2VkX21pcHNfdHJlZS9saWIvbWlwc2VsLWxpbnV4LWdudS8ua2VlcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9kZWJpYW5fcmVkdWNlZF9taXBzX3RyZWUvbGliL21pcHNlbC1saW51eC1nbnUvLmtlZXAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaCBiL3Rlc3QvRHJpdmVyL0lucHV0cy9kZWJpYW5fcmVkdWNlZF9taXBzX3RyZWUvdXNyL2luY2x1ZGUvLmtlZXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL3Vzci9pbmNsdWRlLy5rZWVwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL3Vzci9pbmNsdWRlL2MrKy80LjcvLmtlZXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL3Vzci9pbmNsdWRlL2MrKy80LjcvLmtlZXAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaCBiL3Rlc3QvRHJpdmVyL0lucHV0cy9kZWJpYW5fcmVkdWNlZF9taXBzX3RyZWUvdXNyL2luY2x1ZGUvYysrLzQuNy9iYWNrd2FyZC8ua2VlcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9kZWJpYW5fcmVkdWNlZF9taXBzX3RyZWUvdXNyL2luY2x1ZGUvYysrLzQuNy9iYWNrd2FyZC8ua2VlcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL2RlYmlhbl9yZWR1Y2VkX21pcHNfdHJlZS91c3IvaW5jbHVkZS9jKysvNC43L21pcHMtbGludXgtZ251Ly5rZWVwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oCmNvcHkgdG8gdGVzdC9Ecml2ZXIvSW5wdXRzL2RlYmlhbl9yZWR1Y2VkX21pcHNfdHJlZS91c3IvaW5jbHVkZS9jKysvNC43L21pcHMtbGludXgtZ251Ly5rZWVwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL3Vzci9pbmNsdWRlL2MrKy80LjcvbWlwc2VsLWxpbnV4LWdudS8ua2VlcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9kZWJpYW5fcmVkdWNlZF9taXBzX3RyZWUvdXNyL2luY2x1ZGUvYysrLzQuNy9taXBzZWwtbGludXgtZ251Ly5rZWVwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL3Vzci9pbmNsdWRlL21pcHMtbGludXgtZ251Ly5rZWVwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oCmNvcHkgdG8gdGVzdC9Ecml2ZXIvSW5wdXRzL2RlYmlhbl9yZWR1Y2VkX21pcHNfdHJlZS91c3IvaW5jbHVkZS9taXBzLWxpbnV4LWdudS8ua2VlcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL2RlYmlhbl9yZWR1Y2VkX21pcHNfdHJlZS91c3IvaW5jbHVkZS9taXBzZWwtbGludXgtZ251Ly5rZWVwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oCmNvcHkgdG8gdGVzdC9Ecml2ZXIvSW5wdXRzL2RlYmlhbl9yZWR1Y2VkX21pcHNfdHJlZS91c3IvaW5jbHVkZS9taXBzZWwtbGludXgtZ251Ly5rZWVwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL3Vzci9saWIvLmtlZXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL3Vzci9saWIvLmtlZXAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaCBiL3Rlc3QvRHJpdmVyL0lucHV0cy9kZWJpYW5fcmVkdWNlZF9taXBzX3RyZWUvdXNyL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC43L2NydGJlZ2luLm8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL3Vzci9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNy9jcnRiZWdpbi5vCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL3Vzci9saWIvZ2NjL21pcHNlbC1saW51eC1nbnUvNC43L2NydGJlZ2luLm8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL3Vzci9saWIvZ2NjL21pcHNlbC1saW51eC1nbnUvNC43L2NydGJlZ2luLm8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaCBiL3Rlc3QvRHJpdmVyL0lucHV0cy9kZWJpYW5fcmVkdWNlZF9taXBzX3RyZWUvdXNyL2xpYi9taXBzLWxpbnV4LWdudS8ua2VlcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9kZWJpYW5fcmVkdWNlZF9taXBzX3RyZWUvdXNyL2xpYi9taXBzLWxpbnV4LWdudS8ua2VlcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL2RlYmlhbl9yZWR1Y2VkX21pcHNfdHJlZS91c3IvbGliL21pcHNlbC1saW51eC1nbnUvLmtlZXAKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvZGViaWFuX3JlZHVjZWRfbWlwc190cmVlL3Vzci9saWIvbWlwc2VsLWxpbnV4LWdudS8ua2VlcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL21pcHNfY3NfdHJlZS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL2luY2x1ZGUtZml4ZWQvbmFuMjAwOC9lbC8ua2VlcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9taXBzX2NzX3RyZWUvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9pbmNsdWRlLWZpeGVkL25hbjIwMDgvZWwvLmtlZXAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaCBiL3Rlc3QvRHJpdmVyL0lucHV0cy9taXBzX2NzX3RyZWUvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9uYW4yMDA4L2NydGJlZ2luLm8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvbWlwc19jc190cmVlL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvbmFuMjAwOC9jcnRiZWdpbi5vCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvbWlwc19jc190cmVlL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvbmFuMjAwOC9jcnRlbmQubwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9taXBzX2NzX3RyZWUvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9uYW4yMDA4L2NydGVuZC5vCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvbWlwc19jc190cmVlL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvbmFuMjAwOC9lbC9jcnRiZWdpbi5vCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oCmNvcHkgdG8gdGVzdC9Ecml2ZXIvSW5wdXRzL21pcHNfY3NfdHJlZS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL25hbjIwMDgvZWwvY3J0YmVnaW4ubwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL21pcHNfY3NfdHJlZS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL25hbjIwMDgvZWwvY3J0ZW5kLm8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvbWlwc19jc190cmVlL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvbmFuMjAwOC9lbC9jcnRlbmQubwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL21pcHNfY3NfdHJlZS9taXBzLWxpbnV4LWdudS9saWIvbmFuMjAwOC9lbC8ua2VlcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9taXBzX2NzX3RyZWUvbWlwcy1saW51eC1nbnUvbGliL25hbjIwMDgvZWwvLmtlZXAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaCBiL3Rlc3QvRHJpdmVyL0lucHV0cy9taXBzX2NzX3RyZWUvbWlwcy1saW51eC1nbnUvbGliYy9uYW4yMDA4L2VsL2xpYi8ua2VlcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9taXBzX2NzX3RyZWUvbWlwcy1saW51eC1nbnUvbGliYy9uYW4yMDA4L2VsL2xpYi8ua2VlcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL21pcHNfY3NfdHJlZS9taXBzLWxpbnV4LWdudS9saWJjL25hbjIwMDgvZWwvdXNyL2xpYi9jcnQxLm8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvbWlwc19jc190cmVlL21pcHMtbGludXgtZ251L2xpYmMvbmFuMjAwOC9lbC91c3IvbGliL2NydDEubwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL21pcHNfY3NfdHJlZS9taXBzLWxpbnV4LWdudS9saWJjL25hbjIwMDgvZWwvdXNyL2xpYi9jcnRpLm8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvbWlwc19jc190cmVlL21pcHMtbGludXgtZ251L2xpYmMvbmFuMjAwOC9lbC91c3IvbGliL2NydGkubwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL21pcHNfY3NfdHJlZS9taXBzLWxpbnV4LWdudS9saWJjL25hbjIwMDgvZWwvdXNyL2xpYi9jcnRuLm8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvbWlwc19jc190cmVlL21pcHMtbGludXgtZ251L2xpYmMvbmFuMjAwOC9lbC91c3IvbGliL2NydG4ubwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL21pcHNfY3NfdHJlZS9taXBzLWxpbnV4LWdudS9saWJjL25hbjIwMDgvbGliLy5rZWVwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oCmNvcHkgdG8gdGVzdC9Ecml2ZXIvSW5wdXRzL21pcHNfY3NfdHJlZS9taXBzLWxpbnV4LWdudS9saWJjL25hbjIwMDgvbGliLy5rZWVwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvbWlwc19jc190cmVlL21pcHMtbGludXgtZ251L2xpYmMvbmFuMjAwOC91c3IvbGliL2NydDEubwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9taXBzX2NzX3RyZWUvbWlwcy1saW51eC1nbnUvbGliYy9uYW4yMDA4L3Vzci9saWIvY3J0MS5vCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvbWlwc19jc190cmVlL21pcHMtbGludXgtZ251L2xpYmMvbmFuMjAwOC91c3IvbGliL2NydGkubwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9taXBzX2NzX3RyZWUvbWlwcy1saW51eC1nbnUvbGliYy9uYW4yMDA4L3Vzci9saWIvY3J0aS5vCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvbWlwc19jc190cmVlL21pcHMtbGludXgtZ251L2xpYmMvbmFuMjAwOC91c3IvbGliL2NydG4ubwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9taXBzX2NzX3RyZWUvbWlwcy1saW51eC1nbnUvbGliYy9uYW4yMDA4L3Vzci9saWIvY3J0bi5vCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvcmVzb3VyY2VfZGlyL2xpYi9tYWNob19lbWJlZGRlZC9saWJjbGFuZ19ydC5oYXJkX3BpYy5hCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oCmNvcHkgdG8gdGVzdC9Ecml2ZXIvSW5wdXRzL3Jlc291cmNlX2Rpci9saWIvbWFjaG9fZW1iZWRkZWQvbGliY2xhbmdfcnQuaGFyZF9waWMuYQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Ecml2ZXIvSW5wdXRzL3Jlc291cmNlX2Rpci9saWIvbWFjaG9fZW1iZWRkZWQvbGliY2xhbmdfcnQuaGFyZF9zdGF0aWMuYQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvRHJpdmVyL0lucHV0cy9yZXNvdXJjZV9kaXIvbGliL21hY2hvX2VtYmVkZGVkL2xpYmNsYW5nX3J0LmhhcmRfc3RhdGljLmEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaCBiL3Rlc3QvRHJpdmVyL0lucHV0cy9yZXNvdXJjZV9kaXIvbGliL21hY2hvX2VtYmVkZGVkL2xpYmNsYW5nX3J0LnNvZnRfcGljLmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L0RyaXZlci9JbnB1dHMvcmVzb3VyY2VfZGlyL2xpYi9tYWNob19lbWJlZGRlZC9saWJjbGFuZ19ydC5zb2Z0X3BpYy5hCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L0RyaXZlci9JbnB1dHMvcmVzb3VyY2VfZGlyL2xpYi9tYWNob19lbWJlZGRlZC9saWJjbGFuZ19ydC5zb2Z0X3N0YXRpYy5hCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oCmNvcHkgdG8gdGVzdC9Ecml2ZXIvSW5wdXRzL3Jlc291cmNlX2Rpci9saWIvbWFjaG9fZW1iZWRkZWQvbGliY2xhbmdfcnQuc29mdF9zdGF0aWMuYQpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvYWFyY2g2NC1jcHVzLmMgYi90ZXN0L0RyaXZlci9hYXJjaDY0LWNwdXMuYwppbmRleCA3OTljZTEwLi40ZTMyYjNmIDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9hYXJjaDY0LWNwdXMuYworKysgYi90ZXN0L0RyaXZlci9hYXJjaDY0LWNwdXMuYwpAQCAtOCwzICs4LDEzIEBACiAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYWFyY2g2NCAtbWNwdT1jb3J0ZXgtYTU3IC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNBNTcgJXMKIC8vIENBNTc6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgImFhcmNoNjR7ey4qfX0iICItdGFyZ2V0LWNwdSIgImNvcnRleC1hNTciCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYWFyY2g2NF9iZSAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1HRU5FUklDLUJFICVzCisvLyBHRU5FUklDLUJFOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJhYXJjaDY0X2Jle3suKn19IiAiLXRhcmdldC1jcHUiICJnZW5lcmljIgorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFhcmNoNjRfYmUgLW1jcHU9Y29ydGV4LWE1MyAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DQTUzLUJFICVzCisvLyBDQTUzLUJFOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJhYXJjaDY0X2Jle3suKn19IiAiLXRhcmdldC1jcHUiICJjb3J0ZXgtYTUzIgorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFhcmNoNjRfYmUgLW1jcHU9Y29ydGV4LWE1NyAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DQTU3LUJFICVzCisvLyBDQTU3LUJFOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJhYXJjaDY0X2Jle3suKn19IiAiLXRhcmdldC1jcHUiICJjb3J0ZXgtYTU3IgorCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9hYXJjaDY0LW1mcHUuYyBiL3Rlc3QvRHJpdmVyL2FhcmNoNjQtbWZwdS5jCmluZGV4IDIzNDQwMWIuLjJlNTVjN2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2FhcmNoNjQtbWZwdS5jCisrKyBiL3Rlc3QvRHJpdmVyL2FhcmNoNjQtbWZwdS5jCkBAIC0yLDYgKzIsOCBAQAogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFhcmNoNjQtbGludXgtZWFiaSAtbWZwdT1uZW9uICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1ORU9OICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFhcmNoNjQtbGludXgtZWFiaSAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTkVPTiAlcwogLy8gQ0hFQ0stTkVPTjogIi10YXJnZXQtZmVhdHVyZSIgIituZW9uIgogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFhcmNoNjQtbGludXgtZWFiaSAtbWZwdT1mcC1hcm12OCAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCkBAIC0xOSw4ICsyMSwzIEBACiAvLyBDSEVDSy1DUllQVE8tTkVPTi1GUC1BUk1WODogIi10YXJnZXQtZmVhdHVyZSIgIituZW9uIgogLy8gQ0hFQ0stQ1JZUFRPLU5FT04tRlAtQVJNVjg6ICItdGFyZ2V0LWZlYXR1cmUiICIrY3J5cHRvIgogCi0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFhcmNoNjQtbGludXgtZWFiaSAtbWZwdT1ub25lICVzIC0jIyMgMj4mMSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTk8tRlAgJXMKLS8vIENIRUNLLU5PLUZQOiAiLXRhcmdldC1mZWF0dXJlIiAiLWZwLWFybXY4IgotLy8gQ0hFQ0stTk8tRlA6ICItdGFyZ2V0LWZlYXR1cmUiICItY3J5cHRvIgotLy8gQ0hFQ0stTk8tRlA6ICItdGFyZ2V0LWZlYXR1cmUiICItbmVvbiIKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL2FhcmNoNjQtbWdlbmVyYWxfcmVnc19vbmx5LmMgYi90ZXN0L0RyaXZlci9hYXJjaDY0LW1nZW5lcmFsX3JlZ3Nfb25seS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4Y2RkMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0RyaXZlci9hYXJjaDY0LW1nZW5lcmFsX3JlZ3Nfb25seS5jCkBAIC0wLDAgKzEsNyBAQAorLy8gVGVzdCB0aGUgLW1nZW5lcmFsLXJlZ3Mtb25seSBvcHRpb24KKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhYXJjaDY0LWxpbnV4LWVhYmkgLW1nZW5lcmFsLXJlZ3Mtb25seSAlcyAtIyMjIDI+JjEgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLU5PLUZQICVzCisvLyBDSEVDSy1OTy1GUDogIi10YXJnZXQtZmVhdHVyZSIgIi1mcC1hcm12OCIKKy8vIENIRUNLLU5PLUZQOiAiLXRhcmdldC1mZWF0dXJlIiAiLWNyeXB0byIKKy8vIENIRUNLLU5PLUZQOiAiLXRhcmdldC1mZWF0dXJlIiAiLW5lb24iCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9hcm0tYXJjaC1kYXJ3aW4uYyBiL3Rlc3QvRHJpdmVyL2FybS1hcmNoLWRhcndpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MDg5NjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0RyaXZlci9hcm0tYXJjaC1kYXJ3aW4uYwpAQCAtMCwwICsxLDYgQEAKKy8vIE9uIERhcndpbiwgYXJjaCBzaG91bGQgb3ZlcnJpZGUgQ1BVIGZvciB0cmlwbGUgcHVycG9zZXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjdtLWFwcGxlLWRhcndpbiAtYXJjaCBhcm12N20gLW1jcHU9Y29ydGV4LW00IC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY3TS1EQVJXSU4gJXMKKy8vIENIRUNLLVY3TS1EQVJXSU46ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjdtLXt7Lip9fSAiLXRhcmdldC1jcHUiICJjb3J0ZXgtbTQiCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3bSAtYXJjaCBhcm12N20gLW1jcHU9Y29ydGV4LW00IC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY3TS1PVkVSUklEREVOICVzCisvLyBDSEVDSy1WN00tT1ZFUlJJRERFTjogIi1jYzEie3suKn19ICItdHJpcGxlIiAidGh1bWJ2N2VtLXt7Lip9fSAiLXRhcmdldC1jcHUiICJjb3J0ZXgtbTQiCisKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL2FybS1jb3J0ZXgtY3B1cy5jIGIvdGVzdC9Ecml2ZXIvYXJtLWNvcnRleC1jcHVzLmMKaW5kZXggYmQ4MzNjYi4uMjQyZmUwZCAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvYXJtLWNvcnRleC1jcHVzLmMKKysrIGIvdGVzdC9Ecml2ZXIvYXJtLWNvcnRleC1jcHVzLmMKQEAgLTEsMjMgKzEsMTM1IEBACi0vLyA9PT09PT09PT09PT09PT09PT0gQ2hlY2sgZGVmYXVsdCBDb3J0ZXggQ1BVIG9uIGVhY2ggbWFqb3IgYXJjaGl0ZWN0dXJlCi0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY2bS1hcHBsZS1kYXJ3aW4gLWFyY2ggYXJtdjZtIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY2TSAlcworLy8gPT09PT09PT09PT09PT09PT09IENoZWNrIGRlZmF1bHQgQ1BVIG9uIGVhY2ggbWFqb3IgYXJjaGl0ZWN0dXJlCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY0dCAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNFQgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtIC1tYXJjaD1hcm12NHQgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjRUICVzCisvLyBDSEVDSy1WNFQ6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgImFybXY0dC17ey4qfX0gIi10YXJnZXQtY3B1IiAiYXJtN3RkbWkiCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjR0IC1tdGh1bWIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjRULVRIVU1CICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybSAtbXRodW1iIC1tYXJjaD1hcm12NHQgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjRULVRIVU1CICVzCisvLyBDSEVDSy1WNFQtVEhVTUI6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjR0LXt7Lip9fSAiLXRhcmdldC1jcHUiICJhcm03dGRtaSIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12NSAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0gLW1hcmNoPWFybXY1IC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY1ICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY1dCAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0gLW1hcmNoPWFybXY1dCAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNSAlcworLy8gQ0hFQ0stVjU6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgImFybXY1LXt7Lip9fSAiLXRhcmdldC1jcHUiICJhcm0xMHRkbWkiCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjUgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNS1USFVNQiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12IC1tYXJjaD1hcm12NSAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY1LVRIVU1CICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY1dCAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY1LVRIVU1CICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybSAtbWFyY2g9YXJtdjUgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNS1USFVNQiAlcworLy8gQ0hFQ0stVjUtVEhVTUI6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjUte3suKn19ICItdGFyZ2V0LWNwdSIgImFybTEwdGRtaSIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12NWUgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjVFICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybSAtbWFyY2g9YXJtdjVlIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY1RSAlcworLy8gQ0hFQ0stVjVFOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJhcm12NWUte3suKn19ICItdGFyZ2V0LWNwdSIgImFybTEwMjJlIgorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY1ZSAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY1RS1USFVNQiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0gLW1hcmNoPWFybXY1ZSAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY1RS1USFVNQiAlcworLy8gQ0hFQ0stVjVFLVRIVU1COiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJ0aHVtYnY1ZS17ey4qfX0gIi10YXJnZXQtY3B1IiAiYXJtMTAyMmUiCisKKy8vIEZJWE1FICVjbGFuZyAtdGFyZ2V0IGFybXY1dGVqIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY1VEVKICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybSAtbWFyY2g9YXJtdjV0ZWogLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjVURUogJXMKKy8vIENIRUNLLVY1VEVKOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJhcm12NWUte3suKn19ICItdGFyZ2V0LWNwdSIgImFybTkyNmVqLXMiCisKKy8vIEZJWE1FICVjbGFuZyAtdGFyZ2V0IGFybXY1dGVqIC1tdGh1bWIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjVURUotVEhVTUIgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtIC1tYXJjaD1hcm12NXRlaiAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY1VEVKLVRIVU1CICVzCisvLyBDSEVDSy1WNVRFSi1USFVNQjogIi1jYzEie3suKn19ICItdHJpcGxlIiAidGh1bWJ2NWUte3suKn19ICItdGFyZ2V0LWNwdSIgImFybTkyNmVqLXMiCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjYgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjYgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtIC1tYXJjaD1hcm12NiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNiAlcworLy8gQ0hFQ0stVjY6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgImFybXY2LXt7Lip9fSAiLXRhcmdldC1jcHUiICJhcm0xMTM2amYtcyIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12NiAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY2LVRIVU1CICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybSAtbWFyY2g9YXJtdjYgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNi1USFVNQiAlcworLy8gQ0hFQ0stVjYtVEhVTUI6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjYte3suKn19ICItdGFyZ2V0LWNwdSIgImFybTExMzZqZi1zIgorCisvLyBGSVhNRSAlY2xhbmcgLXRhcmdldCBhcm12NmogLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjZKICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybSAtbWFyY2g9YXJtdjZqIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY2SiAlcworLy8gQ0hFQ0stVjZKOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJhcm12Ni17ey4qfX0gIi10YXJnZXQtY3B1IiAiYXJtMTEzNmotcyIKKworLy8gRklYTUUgJWNsYW5nIC10YXJnZXQgYXJtdjZqIC1tdGh1bWIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjZKLVRIVU1CICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybSAtbWFyY2g9YXJtdjZqIC1tdGh1bWIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjZKLVRIVU1CICVzCisvLyBDSEVDSy1WNkotVEhVTUI6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjYte3suKn19ICItdGFyZ2V0LWNwdSIgImFybTExMzZqLXMiCisKKy8vIEZJWE1FICVjbGFuZyAtdGFyZ2V0IGFybXY2eiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNlogJXMKKy8vIEZJWE1FICVjbGFuZyAtdGFyZ2V0IGFybSAtbWFyY2g9YXJtdjZ6IC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY2WiAlcworLy8gQ0hFQ0stVjZaOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJhcm12Ni17ey4qfX0gIi10YXJnZXQtY3B1IiAiYXJtMTE3Nmp6Zi1zIgorCisvLyBGSVhNRSAlY2xhbmcgLXRhcmdldCBhcm12NnogLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNlotVEhVTUIgJXMKKy8vIEZJWE1FICVjbGFuZyAtdGFyZ2V0IGFybSBhcmNoPWFybXY2eiAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY2Wi1USFVNQiAlcworLy8gQ0hFQ0stVjZaLVRIVU1COiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJ0aHVtYnY2LXt7Lip9fSAiLXRhcmdldC1jcHUiICJhcm0xMTc2anpmcyIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12NnQyIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY2VDIgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtIC1tYXJjaD1hcm12NnQyIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY2VDIgJXMKKy8vIENIRUNLLVY2VDI6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgImFybXY2dDIte3suKn19ICItdGFyZ2V0LWNwdSIgImFybTExNTZ0Mi1zIgorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY2dDIgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNlQyLVRIVU1CICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybSAtbWFyY2g9YXJtdjZ0MiAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY2VDItVEhVTUIgJXMKKy8vIENIRUNLLVY2VDItVEhVTUI6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjZ0Mi17ey4qfX0gIi10YXJnZXQtY3B1IiAiYXJtMTE1NnQyLXMiCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjZtIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY2TSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0gLW1hcmNoPWFybXY2bSAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WNk0gJXMKIC8vIENIRUNLLVY2TTogIi1jYzEie3suKn19ICItdHJpcGxlIiAidGh1bWJ2Nm0te3suKn19ICItdGFyZ2V0LWNwdSIgImNvcnRleC1tMCIKIAotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12N20tYXBwbGUtZGFyd2luIC1hcmNoIGFybXY3bSAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WN00gJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjdtIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY3TSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0gLW1hcmNoPWFybXY3LW0gLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjdNICVzCiAvLyBDSEVDSy1WN006ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjdtLXt7Lip9fSAiLXRhcmdldC1jcHUiICJjb3J0ZXgtbTMiCiAKLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjdlbS1hcHBsZS1kYXJ3aW4gLWFyY2ggYXJtdjdlbSAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WN0VNICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3ZW0gLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjdFTSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0gLW1hcmNoPWFybXY3ZS1tIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY3RU0gJXMKIC8vIENIRUNLLVY3RU06ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjdlbS17ey4qfX0gIi10YXJnZXQtY3B1IiAiY29ydGV4LW00IgogCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY2bS1hcHBsZS1kYXJ3aW4gLWFyY2ggYXJtdjZtIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY2TS1EQVJXSU4gJXMKKy8vIENIRUNLLVY2TS1EQVJXSU46ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjZtLXt7Lip9fSAiLXRhcmdldC1jcHUiICJjb3J0ZXgtbTAiCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjdtLWFwcGxlLWRhcndpbiAtYXJjaCBhcm12N20gLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjdNLURBUldJTiAlcworLy8gQ0hFQ0stVjdNLURBUldJTjogIi1jYzEie3suKn19ICItdHJpcGxlIiAidGh1bWJ2N20te3suKn19ICItdGFyZ2V0LWNwdSIgImNvcnRleC1tMyIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12N2VtLWFwcGxlLWRhcndpbiAtYXJjaCBhcm12N2VtIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY3RU0tREFSV0lOICVzCisvLyBDSEVDSy1WN0VNLURBUldJTjogIi1jYzEie3suKn19ICItdHJpcGxlIiAidGh1bWJ2N2VtLXt7Lip9fSAiLXRhcmdldC1jcHUiICJjb3J0ZXgtbTQiCisKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjdhLWxpbnV4LWdudWVhYmkgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjdBICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1saW51eC1nbnVlYWJpIC1tYXJjaD1hcm12Ny1hIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY3QSAlcwogLy8gQ0hFQ0stVjdBOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJhcm12Ny17ey4qfX0gIi10YXJnZXQtY3B1IiAiY29ydGV4LWE4IgogCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3YS1saW51eC1nbnVlYWJpIC1tdGh1bWIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjdBLVRIVU1CICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1saW51eC1nbnVlYWJpIC1tYXJjaD1hcm12Ny1hIC1tdGh1bWIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjdBLVRIVU1CICVzCisvLyBDSEVDSy1WN0EtVEhVTUI6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjcte3suKn19ICItdGFyZ2V0LWNwdSIgImNvcnRleC1hOCIKKwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12N3ItbGludXgtZ251ZWFiaSAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WN1IgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWdudWVhYmkgLW1hcmNoPWFybXY3LXIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjdSICVzCiAvLyBDSEVDSy1WN1I6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgImFybXY3ci17ey4qfX0gIi10YXJnZXQtY3B1IiAiY29ydGV4LXI0IgogCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3ci1saW51eC1nbnVlYWJpIC1tdGh1bWIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjdSLVRIVU1CICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1saW51eC1nbnVlYWJpIC1tYXJjaD1hcm12Ny1yIC1tdGh1bWIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjdSLVRIVU1CICVzCisvLyBDSEVDSy1WN1ItVEhVTUI6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjdyLXt7Lip9fSAiLXRhcmdldC1jcHUiICJjb3J0ZXgtcjQiCisKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjggIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY4QSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0gLW1hcmNoPWFybXY4IC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY4QSAlcwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12OGEgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVjhBICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybSAtbWFyY2g9YXJtdjhhIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY4QSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0gLW1hcmNoPWFybXY4LWEgIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY4QSAlcwogLy8gQ0hFQ0stVjhBOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJhcm12OC17ey4qfX0iICItdGFyZ2V0LWNwdSIgImNvcnRleC1hNTMiCiAKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtZWJ2OCAgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtVjhBICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybWViIC1tYXJjaD1hcm1lYnY4IC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLVY4QSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYnY4YSAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1WOEEgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtZWIgLW1hcmNoPWFybWVidjhhIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLVY4QSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYiAtbWFyY2g9YXJtZWJ2OC1hICAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1WOEEgJXMKKy8vIENIRUNLLUJFLVY4QTogIi1jYzEie3suKn19ICItdHJpcGxlIiAiYXJtZWJ2OC17ey4qfX0iICItdGFyZ2V0LWNwdSIgImNvcnRleC1hNTMiCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjggLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WOEEtVEhVTUIgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtIC1tYXJjaD1hcm12OCAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVY4QS1USFVNQiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12OGEgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WOEEtVEhVTUIgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtIC1tYXJjaD1hcm12OGEgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WOEEtVEhVTUIgJXMKKy8vIENIRUNLLVY4QS1USFVNQjogIi1jYzEie3suKn19ICItdHJpcGxlIiAidGh1bWJ2OC17ey4qfX0iICItdGFyZ2V0LWNwdSIgImNvcnRleC1hNTMiCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtZWJ2OCAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLVY4QS1USFVNQiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYiAtbWFyY2g9YXJtZWJ2OCAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLVY4QS1USFVNQiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYnY4YSAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLVY4QS1USFVNQiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYiAtbWFyY2g9YXJtZWJ2OGEgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1WOEEtVEhVTUIgJXMKKy8vIENIRUNLLUJFLVY4QS1USFVNQjogIi1jYzEie3suKn19ICItdHJpcGxlIiAidGh1bWJlYnY4LXt7Lip9fSIgIi10YXJnZXQtY3B1IiAiY29ydGV4LWE1MyIKKwogLy8gPT09PT09PT09PT09PT09PT09IENoZWNrIGRlZmF1bHQgQXJjaGl0ZWN0dXJlIG9uIGVhY2ggQ29ydGV4IENQVQogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTUgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQ1BVVjdBICVzCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1hNyAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DUFVWN0EgJXMKQEAgLTI3LDE5ICsxMzksNzMgQEAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LWExNSAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DUFVWN0EgJXMKIC8vIENIRUNLLUNQVVY3QTogIi1jYzEie3suKn19ICItdHJpcGxlIiAiYXJtdjcte3suKn19CiAKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtZWItbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTUgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtQ1BVVjdBICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybWViLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LWE3IC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLUNQVVY3QSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYi1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1hOCAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1DUFVWN0EgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtZWItbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTkgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtQ1BVVjdBICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybWViLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LWExMiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1DUFVWN0EgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtZWItbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTE1IC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLUNQVVY3QSAlcworLy8gQ0hFQ0stQkUtQ1BVVjdBOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJhcm1lYnY3LXt7Lip9fQorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1hNSAgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DUFVWN0EtVEhVTUIgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LWE3ICAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUNQVVY3QS1USFVNQiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTggIC1tdGh1bWIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQ1BVVjdBLVRIVU1CICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1hOSAgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DUFVWN0EtVEhVTUIgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LWExMiAtbXRodW1iICAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DUFVWN0EtVEhVTUIgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LWExNSAtbXRodW1iICAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DUFVWN0EtVEhVTUIgJXMKKy8vIENIRUNLLUNQVVY3QS1USFVNQjogIi1jYzEie3suKn19ICItdHJpcGxlIiAidGh1bWJ2Ny17ey4qfX0KKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYi1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1hNSAgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1DUFVWN0EtVEhVTUIgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtZWItbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTcgIC1tdGh1bWIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtQ1BVVjdBLVRIVU1CICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybWViLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LWE4ICAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLUNQVVY3QS1USFVNQiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYi1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1hOSAgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1DUFVWN0EtVEhVTUIgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtZWItbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTEyIC1tdGh1bWIgIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLUNQVVY3QS1USFVNQiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYi1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1hMTUgLW10aHVtYiAgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtQ1BVVjdBLVRIVU1CICVzCisvLyBDSEVDSy1CRS1DUFVWN0EtVEhVTUI6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1iZWJ2Ny17ey4qfX0KKwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtbTAgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQ1BVVjZNICVzCiAvLyBDSEVDSy1DUFVWNk06ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjZtLXt7Lip9fQogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1tMyAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DUFVWN00gJXMKLS8vIENIRUNLLUNQVVY3TTogIi1jYzEie3suKn19ICItdHJpcGxlIiAiYXJtdjdtLXt7Lip9fQorLy8gQ0hFQ0stQ1BVVjdNOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJ0aHVtYnY3bS17ey4qfX0KKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYi1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1tMyAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1DUFVWN00gJXMKKy8vIENIRUNLLUJFLUNQVVY3TTogIi1jYzEie3suKn19ICItdHJpcGxlIiAidGh1bWJlYnY3bS17ey4qfX0KIAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtbTQgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQ1BVVjdFTSAlcwotLy8gQ0hFQ0stQ1BVVjdFTTogIi1jYzEie3suKn19ICItdHJpcGxlIiAiYXJtdjdlbS17ey4qfX0KKy8vIENIRUNLLUNQVVY3RU06ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgInRodW1idjdlbS17ey4qfX0KKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYi1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1tNCAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1DUFVWN0VNICVzCisvLyBDSEVDSy1CRS1DUFVWN0VNOiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJ0aHVtYmVidjdlbS17ey4qfX0KIAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtcjQgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQ1BVVjdSICVzCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1yNSAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DUFVWN1IgJXMKIC8vIENIRUNLLUNQVVY3UjogIi1jYzEie3suKn19ICItdHJpcGxlIiAiYXJtdjdyLXt7Lip9fQogCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybWViLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LXI0IC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLUNQVVY3UiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYi1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1yNSAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1DUFVWN1IgJXMKKy8vIENIRUNLLUJFLUNQVVY3UjogIi1jYzEie3suKn19ICItdHJpcGxlIiAiYXJtZWJ2N3Ite3suKn19CisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LXI0IC1tdGh1bWIgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQ1BVVjdSLVRIVU1CICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1yNSAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUNQVVY3Ui1USFVNQiAlcworLy8gQ0hFQ0stQ1BVVjdSLVRIVU1COiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJ0aHVtYnY3ci17ey4qfX0KKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYi1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1yNCAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLUNQVVY3Ui1USFVNQiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm1lYi1saW51eC1nbnVlYWJpIC1tY3B1PWNvcnRleC1yNSAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLUNQVVY3Ui1USFVNQiAlcworLy8gQ0hFQ0stQkUtQ1BVVjdSLVRIVU1COiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJ0aHVtYmVidjdyLXt7Lip9fQorCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybSAtbWNwdT1jb3J0ZXgtYTUzIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUNQVVY4QSAlcwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0gLW1jcHU9Y29ydGV4LWE1NyAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DUFVWOEEgJXMKIC8vIENIRUNLLUNQVVY4QTogIi1jYzEie3suKn19ICItdHJpcGxlIiAiYXJtdjgte3suKn19CisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtZWIgLW1jcHU9Y29ydGV4LWE1MyAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1DUFVWOEEgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtZWIgLW1jcHU9Y29ydGV4LWE1NyAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1DUFVWOEEgJXMKKy8vIENIRUNLLUJFLUNQVVY4QTogIi1jYzEie3suKn19ICItdHJpcGxlIiAiYXJtZWJ2OC17ey4qfX0KKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0gLW1jcHU9Y29ydGV4LWE1MyAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUNQVVY4QS1USFVNQiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0gLW1jcHU9Y29ydGV4LWE1NyAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUNQVVY4QS1USFVNQiAlcworLy8gQ0hFQ0stQ1BVVjhBLVRIVU1COiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJ0aHVtYnY4LXt7Lip9fQorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybWViIC1tY3B1PWNvcnRleC1hNTMgLW10aHVtYiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1DUFVWOEEtVEhVTUIgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtZWIgLW1jcHU9Y29ydGV4LWE1NyAtbXRodW1iIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUJFLUNQVVY4QS1USFVNQiAlcworLy8gQ0hFQ0stQkUtQ1BVVjhBLVRIVU1COiAiLWNjMSJ7ey4qfX0gIi10cmlwbGUiICJ0aHVtYmVidjgte3suKn19CmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9hcm0taHdkaXYuYyBiL3Rlc3QvRHJpdmVyL2FybS1od2Rpdi5jCmluZGV4IGIzNjE3Y2UuLjBiNzU5NDggMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2FybS1od2Rpdi5jCisrKyBiL3Rlc3QvRHJpdmVyL2FybS1od2Rpdi5jCkBAIC0zNywzICszNyw4IEBACiAvLyBDSEVDSy1BTFQ6ICItdGFyZ2V0LWZlYXR1cmUiICIraHdkaXYtYXJtIgogLy8gQ0hFQ0stQUxUOiAiLXRhcmdldC1mZWF0dXJlIiAiLWh3ZGl2IgogCisvLyBSVU46ICVjbGFuZyAtIyMjIC10YXJnZXQgYXJtICVzIC0tbWh3ZGl2PWFybSAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFMVC1FUSAlcworLy8gQ0hFQ0stQUxULUVROiAiLXRhcmdldC1mZWF0dXJlIiAiK2h3ZGl2LWFybSIKKy8vIENIRUNLLUFMVC1FUTogIi10YXJnZXQtZmVhdHVyZSIgIi1od2RpdiIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvYXJtLW1mcHUuYyBiL3Rlc3QvRHJpdmVyL2FybS1tZnB1LmMKaW5kZXggNzY1YjI5OC4uODljMjAzNSAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvYXJtLW1mcHUuYworKysgYi90ZXN0L0RyaXZlci9hcm0tbWZwdS5jCkBAIC0zOSw2ICszOSwzMCBAQAogLy8gQ0hFQ0stVkZQMzogIi10YXJnZXQtZmVhdHVyZSIgIit2ZnAzIgogLy8gQ0hFQ0stVkZQMzogIi10YXJnZXQtZmVhdHVyZSIgIi1uZW9uIgogCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1saW51eC1lYWJpIC1tZnB1PXZmcDQgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLVZGUDQgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWVhYmkgLW1mcHU9dmZwdjQgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLVZGUDQgJXMKKy8vIENIRUNLLVZGUDQ6ICItdGFyZ2V0LWZlYXR1cmUiICIrdmZwNCIKKy8vIENIRUNLLVZGUDQ6ICItdGFyZ2V0LWZlYXR1cmUiICItbmVvbiIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbGludXgtZWFiaSAtbWZwdT12ZnA0LWQxNiAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stVkZQNC1EMTYgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWVhYmkgLW1mcHU9dmZwdjQtZDE2ICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1WRlA0LUQxNiAlcworLy8gQ0hFQ0stVkZQNC1EMTY6ICItdGFyZ2V0LWZlYXR1cmUiICIrdmZwNCIKKy8vIENIRUNLLVZGUDQtRDE2OiAiLXRhcmdldC1mZWF0dXJlIiAiK2QxNiIKKy8vIENIRUNLLVZGUDQtRDE2OiAiLXRhcmdldC1mZWF0dXJlIiAiLW5lb24iCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWVhYmkgLW1mcHU9ZnA0LXNwLWQxNiAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRlA0LVNQLUQxNiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbGludXgtZWFiaSAtbWZwdT1mcHY0LXNwLWQxNiAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRlA0LVNQLUQxNiAlcworLy8gQ0hFQ0stRlA0LVNQLUQxNjogIi10YXJnZXQtZmVhdHVyZSIgIit2ZnA0IgorLy8gQ0hFQ0stRlA0LVNQLUQxNjogIi10YXJnZXQtZmVhdHVyZSIgIitkMTYiCisvLyBDSEVDSy1GUDQtU1AtRDE2OiAiLXRhcmdldC1mZWF0dXJlIiAiK2ZwLW9ubHktc3AiCisvLyBDSEVDSy1GUDQtU1AtRDE2OiAiLXRhcmdldC1mZWF0dXJlIiAiLW5lb24iCisKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWVhYmkgLW1mcHU9bmVvbiAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTkVPTiAlcwogLy8gQ0hFQ0stTkVPTjogIi10YXJnZXQtZmVhdHVyZSIgIituZW9uIgpAQCAtNDcsMTEgKzcxLDE2IEBACiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stU09GVC1GTE9BVCAlcwogLy8gQ0hFQ0stU09GVC1GTE9BVDogIi10YXJnZXQtZmVhdHVyZSIgIi1uZW9uIgogCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY4ICVzIC0jIyMgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQVJNVjgtREVGQVVMVC1TT0ZULUZQICVzCisvLyBDSEVDSy1BUk1WOC1ERUZBVUxULVNPRlQtRlA6ICItdGFyZ2V0LWZlYXR1cmUiICItbmVvbiIKKy8vIENIRUNLLUFSTVY4LURFRkFVTFQtU09GVC1GUDogIi10YXJnZXQtZmVhdHVyZSIgIi1jcnlwdG8iCisKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjggLW1mcHU9ZnAtYXJtdjggJXMgLSMjIyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1BUk1WOC1TT0ZULUZMT0FUICVzCiAvLyBDSEVDSy1BUk1WOC1TT0ZULUZMT0FUOiAiLXRhcmdldC1mZWF0dXJlIiAiK2ZwLWFybXY4IgotLy8gQ0hFQ0stQVJNVjgtU09GVC1GTE9BVDogIi10YXJnZXQtZmVhdHVyZSIgIi1jcnlwdG8iCiAvLyBDSEVDSy1BUk1WOC1TT0ZULUZMT0FUOiAiLXRhcmdldC1mZWF0dXJlIiAiLW5lb24iCisvLyBDSEVDSy1BUk1WOC1TT0ZULUZMT0FUOiAiLXRhcmdldC1mZWF0dXJlIiAiLWNyeXB0byIKIAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12OC1saW51eC1nbnVlYWJpaGYgLW1mcHU9ZnAtYXJtdjggJXMgLSMjIyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1GUC1BUk1WOCAlcwpAQCAtODQsMyArMTEzLDcgQEAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWdudWVhYmloZiAlcyAtIyMjIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUhGICVzCiAvLyBDSEVDSy1IRjogIi10YXJnZXQtY3B1IiAiYXJtMTEzNmpmLXMiCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjctYXBwbGUtZGFyd2luIC14IGFzc2VtYmxlciAlcyAtIyMjIC1jIDI+JjEgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUFTTSAlcworLy8gQVNNLU5PVDogLXRhcmdldC1mZWF0dXJlCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9hcm02NC1kYXJ3aW5wY3MuYyBiL3Rlc3QvRHJpdmVyL2FybTY0LWRhcndpbnBjcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjg1NTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0RyaXZlci9hcm02NC1kYXJ3aW5wY3MuYwpAQCAtMCwwICsxLDMgQEAKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtNjQtYXBwbGUtaW9zNy4wIC0jIyMgJXMgMj4mMSB8IEZpbGVDaGVjayAlcworCisvLyBDSEVDSzogIi10YXJnZXQtYWJpIiAiZGFyd2lucGNzIgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvYXNhbi5jIGIvdGVzdC9Ecml2ZXIvYXNhbi5jCmluZGV4IGM5YjM3OTYuLmYxOTllOTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2FzYW4uYworKysgYi90ZXN0L0RyaXZlci9hc2FuLmMKQEAgLTEsOSArMSw4IEBACi0vLyBSVU46ICVjbGFuZyAgICAgLXRhcmdldCBpMzg2LXVua25vd24tdW5rbm93biAtZmFkZHJlc3Mtc2FuaXRpemVyICVzIC1TIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcwotLy8gUlVOOiAlY2xhbmcgLU8xIC10YXJnZXQgaTM4Ni11bmtub3duLXVua25vd24gLWZhZGRyZXNzLXNhbml0aXplciAlcyAtUyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nIC1PMiAtdGFyZ2V0IGkzODYtdW5rbm93bi11bmtub3duIC1mYWRkcmVzcy1zYW5pdGl6ZXIgJXMgLVMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZyAtTzMgLXRhcmdldCBpMzg2LXVua25vd24tdW5rbm93biAtZmFkZHJlc3Mtc2FuaXRpemVyICVzIC1TIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcwotLy8gUlVOOiAlY2xhbmcgICAgIC10YXJnZXQgaTM4Ni11bmtub3duLXVua25vd24gLWZzYW5pdGl6ZT1hZGRyZXNzICAlcyAtUyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKLS8vIFZlcmlmeSB0aGF0IC1mYWRkcmVzcy1zYW5pdGl6ZXIgaW52b2tlcyBhc2FuIGluc3RydW1lbnRhdGlvbi4KKy8vIFJVTjogJWNsYW5nICAgICAtdGFyZ2V0IGkzODYtdW5rbm93bi11bmtub3duIC1mc2FuaXRpemU9YWRkcmVzcyAlcyAtUyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nIC1PMSAtdGFyZ2V0IGkzODYtdW5rbm93bi11bmtub3duIC1mc2FuaXRpemU9YWRkcmVzcyAlcyAtUyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nIC1PMiAtdGFyZ2V0IGkzODYtdW5rbm93bi11bmtub3duIC1mc2FuaXRpemU9YWRkcmVzcyAlcyAtUyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nIC1PMyAtdGFyZ2V0IGkzODYtdW5rbm93bi11bmtub3duIC1mc2FuaXRpemU9YWRkcmVzcyAlcyAtUyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFZlcmlmeSB0aGF0IC1mc2FuaXRpemU9YWRkcmVzcyBpbnZva2VzIGFzYW4gaW5zdHJ1bWVudGF0aW9uLgogCiBpbnQgZm9vKGludCAqYSkgeyByZXR1cm4gKmE7IH0KIC8vIENIRUNLOiBfX2FzYW5faW5pdApkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvYXRfZmlsZV9taXNzaW5nLmMgYi90ZXN0L0RyaXZlci9hdF9maWxlX21pc3NpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTg5YThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Ecml2ZXIvYXRfZmlsZV9taXNzaW5nLmMKQEAgLTAsMCArMSw3IEBACisvLyBNYWtlIHN1cmUgdGhhdCBhcmd1bWVudHMgdGhhdCBiZWdpbiB3aXRoIEAgYXJlIGxlZnQgYXMgaXMgaW4gdGhlIGFyZ3VtZW50CisvLyBzdHJlYW0sIGFuZCBhbHNvIHRoYXQgQGZpbGUgYXJndW1lbnRzIGNvbnRpbnVlIHRvIGJlIHByb2Nlc3NlZC4KKworLy8gUlVOOiBlY2hvICIlcyAtRCBGT08iID4gJXQuYXJncworLy8gUlVOOiAlY2xhbmcgLXJwYXRoIEBleGVjdXRhYmxlX3BhdGgvLi4vbGliIEAldC5hcmdzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcworLy8gQ0hFQ0s6ICItRCIgIkZPTyIKKy8vIENIRUNLOiAiLXJwYXRoIiAiQGV4ZWN1dGFibGVfcGF0aC8uLi9saWIiCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9iaW5kaW5ncy5jIGIvdGVzdC9Ecml2ZXIvYmluZGluZ3MuYwppbmRleCBkMjVmYzhmLi5kZDhhZDE0IDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9iaW5kaW5ncy5jCisrKyBiL3Rlc3QvRHJpdmVyL2JpbmRpbmdzLmMKQEAgLTEsNyArMSw3IEBACiAvLyBCYXNpYyBiaW5kaW5nLgotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpMzg2LXVua25vd24tdW5rbm93biAtY2NjLXByaW50LWJpbmRpbmdzICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0swMQorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpMzg2LXVua25vd24tdW5rbm93biAtY2NjLXByaW50LWJpbmRpbmdzIC1uby1pbnRlZ3JhdGVkLWFzICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0swMQogLy8gQ0hFQ0swMTogImNsYW5nIiwgaW5wdXRzOiBbInt7Lip9fWJpbmRpbmdzLmMiXSwgb3V0cHV0OiAie3suKn19LnMiCi0vLyBDSEVDSzAxOiAiZ2NjOjpBc3NlbWJsZSIsIGlucHV0czogWyJ7ey4qfX0ucyJdLCBvdXRwdXQ6ICJ7ey4qfX0ubyIKKy8vIENIRUNLMDE6ICJHTlU6OkFzc2VtYmxlIiwgaW5wdXRzOiBbInt7Lip9fS5zIl0sIG91dHB1dDogInt7Lip9fS5vIgogLy8gQ0hFQ0swMTogImdjYzo6TGluayIsIGlucHV0czogWyJ7ey4qfX0ubyJdLCBvdXRwdXQ6ICJhLm91dCIKIAogLy8gQ2xhbmcgY29udHJvbCBvcHRpb25zCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9ib3VuZHMtY2hlY2tpbmcuYyBiL3Rlc3QvRHJpdmVyL2JvdW5kcy1jaGVja2luZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQyMGNhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvRHJpdmVyL2JvdW5kcy1jaGVja2luZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLy8gUlVOOiAlY2xhbmcgLWZzYW5pdGl6ZT1ib3VuZHMgLSMjIyAtZnN5bnRheC1vbmx5ICVzIDI+ICV0Ci0vLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLIDwgJXQgJXMKLS8vIENIRUNLOiAiLWZzYW5pdGl6ZT1hcnJheS1ib3VuZHMsbG9jYWwtYm91bmRzIgotCi0vLyBSVU46ICVjbGFuZyAtZmJvdW5kcy1jaGVja2luZyAtIyMjIC1mc3ludGF4LW9ubHkgJXMgMj4gJXQKLS8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stT0xEIDwgJXQgJXMKLS8vIENIRUNLLU9MRDogIi1mc2FuaXRpemU9bG9jYWwtYm91bmRzIgotCi0vLyBSVU46ICVjbGFuZyAtZmJvdW5kcy1jaGVja2luZz0zIC0jIyMgLWZzeW50YXgtb25seSAlcyAyPiAldAotLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1PTEQyIDwgJXQgJXMKLS8vIENIRUNLLU9MRDI6ICItZnNhbml0aXplPWxvY2FsLWJvdW5kcyIKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL2NsLWZhbGxiYWNrLmMgYi90ZXN0L0RyaXZlci9jbC1mYWxsYmFjay5jCmluZGV4IDI0MzMwNzIuLmQ5MGU1ZmEgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2NsLWZhbGxiYWNrLmMKKysrIGIvdGVzdC9Ecml2ZXIvY2wtZmFsbGJhY2suYwpAQCAtNCw4ICs0LDkgQEAKIC8vIE5vdGU6ICVzIG11c3QgYmUgcHJlY2VkZWQgYnkgLS0sIG90aGVyd2lzZSBpdCBtYXkgYmUgaW50ZXJwcmV0ZWQgYXMgYQogLy8gY29tbWFuZC1saW5lIG9wdGlvbiwgZS5nLiBvbiBNYWMgd2hlcmUgJXMgaXMgY29tbW9ubHkgdW5kZXIgL1VzZXJzLgogCi0vLyBSVU46ICVjbGFuZ19jbCAvZmFsbGJhY2sgL0Rmb289YmFyIC9VYmF6IC9JZm9vIC9PMCAvT3ggL0dSIC9HUi0gL0xEIC9MRGQgXAotLy8gUlVOOiAgICAgL01EIC9NRGQgL01UZCAvTVQgL0ZJbXloZWFkZXIuaCAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NsIC9mYWxsYmFjayAvRGZvbz1iYXIgL1ViYXogL0lmb28gL08wIC9PeCAvR1IgL0dSLSAvR3kgL0d5LSBcCisvLyBSVU46ICAgL0xEIC9MRGQgL01EIC9NRGQgL01UZCAvTVQgL0ZJbXloZWFkZXIuaCAvWmkgLSMjIyAtLSAlcyAyPiYxIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAlcwogLy8gQ0hFQ0s6ICItZmRpYWdub3N0aWNzLWZvcm1hdCIgIm1zdmMtZmFsbGJhY2siCiAvLyBDSEVDSzogfHwKIC8vIENIRUNLOiBjbC5leGUKQEAgLTE3LDYgKzE4LDggQEAKIC8vIENIRUNLOiAiLUkiICJmb28iCiAvLyBDSEVDSzogIi9PeCIKIC8vIENIRUNLOiAiL0dSLSIKKy8vIENIRUNLOiAiL0d5LSIKKy8vIENIRUNLOiAiL1o3IgogLy8gQ0hFQ0s6ICIvRklteWhlYWRlci5oIgogLy8gQ0hFQ0s6ICIvTEQiCiAvLyBDSEVDSzogIi9MRGQiCkBAIC0zOSwzICs0MiwxNCBAQAogLy8gUlVOOiAlY2xhbmdfY2wgL2ZhbGxiYWNrIC9PeCAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1PeCAlcwogLy8gT3g6IGNsLmV4ZQogLy8gT3g6ICIvT3giCisKKy8vIE9ubHkgZmFsbCBiYWNrIHdoZW4gYWN0dWFsbHkgY29tcGlsaW5nLCBub3QgZm9yIGUuZy4gL1AgKHByZXByb2Nlc3MpLgorLy8gUlVOOiAlY2xhbmdfY2wgL2ZhbGxiYWNrIC9QIC0jIyMgLS0gJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVAgJXMKKy8vIFAtTk9UOiB8fAorLy8gUC1OT1Q6ICJjbC5leGUiCisKKy8vIFJVTjogbm90ICVjbGFuZ19jbCAvZmFsbGJhY2sgL2MgLS0gJXMgMj4mMSB8IFwKKy8vIFJVTjogICAgIEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUVycldhcm4gJXMKKy8vIEVycldhcm46IHdhcm5pbmc6IGZhbGxpbmcgYmFjayB0byB7ey4qfX1jbC5leGUKKworI2Vycm9yICJUaGlzIGZhaWxzIHRvIGNvbXBpbGUuIgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvY2wtaW5wdXRzLmMgYi90ZXN0L0RyaXZlci9jbC1pbnB1dHMuYwppbmRleCBkNmVlNTIwLi4wNjZlMGUzIDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9jbC1pbnB1dHMuYworKysgYi90ZXN0L0RyaXZlci9jbC1pbnB1dHMuYwpAQCAtMzMsMyArMzMsMTEgQEAKIC8vIFdBUk46IHdhcm5pbmc6IG92ZXJyaWRpbmcgJy9UQycgb3B0aW9uIHdpdGggJy9UUCcKIC8vIFdBUk46IG5vdGU6IFRoZSBsYXN0IC9UQyBvciAvVFAgb3B0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBlYXJsaWVyIGluc3RhbmNlcwogLy8gV0FSTi1OT1Q6IG5vdGUKKworLy8gUlVOOiBub3QgJWNsYW5nX2NsIC0gMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVNURElOICVzCisvLyBTVERJTjogZXJyb3I6IHVzZSAvVGMgb3IgL1RwCisKKy8vIFJVTjogJWNsYW5nX2NsIC0jIyMgL1RjIC0gMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVNURElOVGMgJXMKKy8vIFNURElOVGM6ICIteCIgImMiCisKK3ZvaWQgZigpOwpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvY2wtb3B0aW9ucy5jIGIvdGVzdC9Ecml2ZXIvY2wtb3B0aW9ucy5jCmluZGV4IDAxMDMyYmIuLmE2NjYxMzEgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2NsLW9wdGlvbnMuYworKysgYi90ZXN0L0RyaXZlci9jbC1vcHRpb25zLmMKQEAgLTE0LDEyICsxNCwyNCBAQAogLy8gUlVOOiAlY2xhbmdfY2wgL0QgZm9vPWJhciAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1EICVzCiAvLyBEOiAiLUQiICJmb289YmFyIgogCisvLyBSVU46ICVjbGFuZ19jbCAvRSAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1FICVzCisvLyBFOiAiLUUiCisvLyBFOiAiLW8iICItIgorCiAvLyBSVFRJIGlzIG9uIGJ5IGRlZmF1bHQ7IGp1c3QgY2hlY2sgdGhhdCB3ZSBkb24ndCBlcnJvci4KIC8vIFJVTjogJWNsYW5nX2NsIC9acyAvR1IgLS0gJXMgMj4mMQogCiAvLyBSVU46ICVjbGFuZ19jbCAvR1ItIC0jIyMgLS0gJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUdSXyAlcwogLy8gR1JfOiAtZm5vLXJ0dGkKIAorLy8gUlVOOiAlY2xhbmdfY2wgL0d5IC0jIyMgLS0gJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUd5ICVzCisvLyBHeTogLWZkYXRhLXNlY3Rpb25zCisvLyBHeTogLWZmdW5jdGlvbi1zZWN0aW9ucworCisvLyBSVU46ICVjbGFuZ19jbCAvR3kgL0d5LSAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1HeV8gJXMKKy8vIEd5Xy1OT1Q6IC1mZGF0YS1zZWN0aW9ucworLy8gR3lfLU5PVDogLWZmdW5jdGlvbi1zZWN0aW9ucworCiAvLyBSVU46ICVjbGFuZ19jbCAvSW15aW5jbHVkZWRpciAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1TTEFTSF9JICVzCiAvLyBSVU46ICVjbGFuZ19jbCAvSSBteWluY2x1ZGVkaXIgLSMjIyAtLSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9U0xBU0hfSSAlcwogLy8gU0xBU0hfSTogIi1JIiAibXlpbmNsdWRlZGlyIgpAQCAtNTYsOSArNjgsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2wgL095LSAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1PeV8gJXMKIC8vIE95XzogLW1kaXNhYmxlLWZwLWVsaW0KIAotLy8gUlVOOiAlY2xhbmdfY2wgL1AgLSMjIyAtLSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9UCAlcwotLy8gUDogLUUKLQogLy8gUlVOOiAlY2xhbmdfY2wgL3Nob3dJbmNsdWRlcyAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1zaG93SW5jbHVkZXMgJXMKIC8vIHNob3dJbmNsdWRlczogLS1zaG93LWluY2x1ZGVzCiAKQEAgLTY2LDYgKzc1LDI3IEBACiAvLyBSVU46ICVjbGFuZ19jbCAvVSBteW1hY3JvIC0jIyMgLS0gJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVUgJXMKIC8vIFU6ICItVSIgIm15bWFjcm8iCiAKKy8vIFJVTjogJWNsYW5nX2NsIC92ZDIgLSMjIyAtLSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9VkQyICVzCisvLyBWRDI6IC12dG9yZGlzcC1tb2RlPTIKKworLy8gUlVOOiAlY2xhbmdfY2wgL3ZtZyAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1WTUcgJXMKKy8vIFZNRzogIi1mbXMtbWVtcHRyLXJlcD12aXJ0dWFsIgorCisvLyBSVU46ICVjbGFuZ19jbCAvdm1nIC92bXMgLSMjIyAtLSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Vk1TICVzCisvLyBWTVM6ICItZm1zLW1lbXB0ci1yZXA9c2luZ2xlIgorCisvLyBSVU46ICVjbGFuZ19jbCAvdm1nIC92bW0gLSMjIyAtLSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Vk1NICVzCisvLyBWTU06ICItZm1zLW1lbXB0ci1yZXA9bXVsdGlwbGUiCisKKy8vIFJVTjogJWNsYW5nX2NsIC92bWcgL3ZtdiAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1WTVYgJXMKKy8vIFZNVjogIi1mbXMtbWVtcHRyLXJlcD12aXJ0dWFsIgorCisvLyBSVU46ICVjbGFuZ19jbCAvdm1nIC92bWIgLSMjIyAtLSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Vk1CICVzCisvLyBWTUI6ICcvdm1nJyBub3QgYWxsb3dlZCB3aXRoICcvdm1iJworCisvLyBSVU46ICVjbGFuZ19jbCAvdm1nIC92bW0gL3ZtcyAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1WTVggJXMKKy8vIFZNWDogJy92bXMnIG5vdCBhbGxvd2VkIHdpdGggJy92bW0nCisKIC8vIFJVTjogJWNsYW5nX2NsIC9XMCAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1XMCAlcwogLy8gVzA6IC13CiAKQEAgLTEwMSw4ICsxMzEsOCBAQAogCiAKIC8vIElnbm9yZWQgb3B0aW9ucy4gQ2hlY2sgdGhhdCB3ZSBkb24ndCBnZXQgInVudXNlZCBkdXJpbmcgY29tcGlsYXRpb24iIGVycm9ycy4KLS8vICgvWnMgaXMgZm9yIHN5bnRheC1vbmx5LCAvV1ggaXMgZm9yIC1XZXJyb3IpCi0vLyBSVU46ICVjbGFuZ19jbCAvWnMgL1dYIFwKKy8vICgvWnMgaXMgZm9yIHN5bnRheC1vbmx5KQorLy8gUlVOOiAlY2xhbmdfY2wgL1pzIFwKIC8vIFJVTjogICAgL2FuYWx5emUtIFwKIC8vIFJVTjogICAgL2Vycm9yUmVwb3J0OmZvbyBcCiAvLyBSVU46ICAgIC9GUyBcCkBAIC0xMjAsNyArMTUwLDggQEAKIC8vIFJVTjogICAgL3dkMTIzNCBcCiAvLyBSVU46ICAgIC9aYzpmb3JTY29wZSBcCiAvLyBSVU46ICAgIC9aYzp3Y2hhcl90IFwKLS8vIFJVTjogICAgLS0gJXMKKy8vIFJVTjogICAgLSMjIyAtLSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9SUdOT1JFRCAlcworLy8gSUdOT1JFRC1OT1Q6IGFyZ3VtZW50IHVudXNlZCBkdXJpbmcgY29tcGlsYXRpb24KIAogLy8gSWdub3JlZCBvcHRpb25zIGFuZCBjb21waWxlLW9ubHkgb3B0aW9ucyBhcmUgaWdub3JlZCBmb3IgbGluayBqb2JzLgogLy8gUlVOOiB0b3VjaCAldC5vYmoKQEAgLTEzMSw3ICsxNjIsNyBAQAogCiAvLyBTdXBwb3J0IGlnbm9yaW5nIHdhcm5pbmdzIGFib3V0IHVudXNlZCBhcmd1bWVudHMuCiAvLyBSVU46ICVjbGFuZ19jbCAvQWJyYWNhZGFicmEgLVF1bnVzZWQtYXJndW1lbnRzIC0jIyMgLS0gJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVVOVVNFRCAlcwotLy8gVU5VU0VELU5PVDogd2FybmluZworLy8gVU5VU0VELU5PVDogYXJndW1lbnQgdW51c2VkIGR1cmluZyBjb21waWxhdGlvbgogCiAvLyBVbnN1cHBvcnRlZCBidXQgcGFyc2VkIG9wdGlvbnMuIENoZWNrIHRoYXQgd2UgZG9uJ3QgZXJyb3Igb24gdGhlbS4KIC8vICgvWnMgaXMgZm9yIHN5bnRheC1vbmx5KQpAQCAtMTQwLDcgKzE3MSw3IEBACiAvLyBSVU46ICAgICAvYXJjaDpzc2UyIFwKIC8vIFJVTjogICAgIC9jbHI6cHVyZSBcCiAvLyBSVU46ICAgICAvZG9jbmFtZSBcCi0vLyBSVU46ICAgICAvRSBcCisvLyBSVU46ICAgICAvZDJaaSsgXAogLy8gUlVOOiAgICAgL0VIc2MgXAogLy8gUlVOOiAgICAgL0VQIFwKIC8vIFJVTjogICAgIC9GIFwKQEAgLTE3Niw4ICsyMDcsNiBAQAogLy8gUlVOOiAgICAgL0dzMTAwMCBcCiAvLyBSVU46ICAgICAvR1QgXAogLy8gUlVOOiAgICAgL0dYIFwKLS8vIFJVTjogICAgIC9HeSBcCi0vLyBSVU46ICAgICAvR3ktIFwKIC8vIFJVTjogICAgIC9HeiBcCiAvLyBSVU46ICAgICAvR1ogXAogLy8gUlVOOiAgICAgL0ggXApAQCAtMTk2LDExICsyMjUsNiBAQAogLy8gUlVOOiAgICAgL1F2ZWMtcmVwb3J0OjIgXAogLy8gUlVOOiAgICAgL3UgXAogLy8gUlVOOiAgICAgL1YgXAotLy8gUlVOOiAgICAgL3ZkMiBcCi0vLyBSVU46ICAgICAvdm1iIFwKLS8vIFJVTjogICAgIC92bW0gXAotLy8gUlVOOiAgICAgL3ZtcyBcCi0vLyBSVU46ICAgICAvdm12IFwKIC8vIFJVTjogICAgIC92b2xhdGlsZSBcCiAvLyBSVU46ICAgICAvd2ZvbyBcCiAvLyBSVU46ICAgICAvV0wgXApAQCAtMjIzLDYgKzI0Nyw3IEBACiAvLyBSVU46ICAgICAvWkkgXAogLy8gUlVOOiAgICAgL1psIFwKIC8vIFJVTjogICAgIC9acCBcCisvLyBSVU46ICAgICAvWnAxIFwKIC8vIFJVTjogICAgIC9aVzpub3N0ZGxpYiBcCiAvLyBSVU46ICAgICAtLSAlcyAyPiYxCiAKQEAgLTIzMiw3ICsyNTcsMTQgQEAKIC8vIFhjbGFuZzogImhlbGxvY2MxIgogCiAvLyBXZSBzdXBwb3J0IC1tMzIgYW5kIC1tNjQuCi0vLyBSVU46ICVjbGFuZ19jbCAvWnMgL1dYIC1tMzIgLW02NCAtLSAlcworLy8gUlVOOiAlY2xhbmdfY2wgL1pzIC9XWCAtbTMyIC1tNjQgLSMjIyAtLSAyPiYxICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUZMQUdTICVzCisvLyBNRkxBR1MtTk9UOiBhcmd1bWVudCB1bnVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uCisKKy8vIFVzZSAtZm5vLXJ0dGkgYnkgZGVmYXVsdC4KKy8vIFJVTjogJWNsYW5nX2NsIC9jIC0jIyMgLS0gJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU5vUlRUSSAlcworLy8gTm9SVFRJOiAiLWZuby1ydHRpIgorLy8gUlVOOiAlY2xhbmdfY2wgL2MgL0dSIC0jIyMgLS0gJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVJUVEkgJXMKKy8vIFJUVEktTk9UOiAiLWZuby1ydHRpIgogCiAKIHZvaWQgZigpIHsgfQpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvY2wtb3V0cHV0cy5jIGIvdGVzdC9Ecml2ZXIvY2wtb3V0cHV0cy5jCmluZGV4IDJjZWFhODUuLmFkNDA1MWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2NsLW91dHB1dHMuYworKysgYi90ZXN0L0RyaXZlci9jbC1vdXRwdXRzLmMKQEAgLTEwNSwzICsxMDUsNyBAQAogLy8gRmFESVJOQU1FRVhUOiAgIi1vIiAiZm9vLmRpcnt7Wy9cXF0rfX1hLmV4dCIKIC8vIFJVTjogJWNsYW5nX2NsIC9GYWEuYXNtIC0jIyMgLS0gJXMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUZhTVVMVElQTEVTT1VSQ0UgJXMKIC8vIEZhTVVMVElQTEVTT1VSQ0U6IGVycm9yOiBjYW5ub3Qgc3BlY2lmeSAnL0ZhYS5hc20nIHdoZW4gY29tcGlsaW5nIG11bHRpcGxlIHNvdXJjZSBmaWxlcworCisvLyBSVU46ICVjbGFuZ19jbCAvUCAtIyMjIC0tICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1QICVzCisvLyBQOiAiLUUiCisvLyBQOiAiLW8iICJjbC1vdXRwdXRzLmkiCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9jbC5jIGIvdGVzdC9Ecml2ZXIvY2wuYwppbmRleCA0ZmQ0MDY0Li44NTVjZGM4IDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9jbC5jCisrKyBiL3Rlc3QvRHJpdmVyL2NsLmMKQEAgLTMxLDUgKzMxLDQgQEAKIC8vIENMLU5PVDogLWZhcHBsZS1rZXh0CiAKIC8vIFJVTjogJWNsYW5nX2NsIC9jIC0jIyMgLS0gJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNPTVBJTEUgJXMKLS8vIENPTVBJTEU6ICItY3h4LWFiaSIgIm1pY3Jvc29mdCIKIC8vIENPTVBJTEU6ICItZmRpYWdub3N0aWNzLWZvcm1hdCIgIm1zdmMiCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9jbGFuZy10cmFuc2xhdGlvbi5jIGIvdGVzdC9Ecml2ZXIvY2xhbmctdHJhbnNsYXRpb24uYwppbmRleCAwOTMwMzg0Li41NGU1YmJlIDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9jbGFuZy10cmFuc2xhdGlvbi5jCisrKyBiL3Rlc3QvRHJpdmVyL2NsYW5nLXRyYW5zbGF0aW9uLmMKQEAgLTIwMywxMSArMjAzLDYxIEBACiAvLyBBTUQ2NC1NSU5HVzogY2xhbmcKIC8vIEFNRDY0LU1JTkdXOiAiLWNjMSIKIC8vIEFNRDY0LU1JTkdXOiAiLXRyaXBsZSIKLS8vIEFNRDY0LU1JTkdXOiAiYW1kNjQtLW1pbmd3MzIiCisvLyBBTUQ2NC1NSU5HVzogImFtZDY0LS13aW5kb3dzLWdudSIKIC8vIEFNRDY0LU1JTkdXOiAiLW11bndpbmQtdGFibGVzIgogCi0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGkzODYtbGludXgtYW5kcm9pZCAtIyMjIC1TICVzIDI+JjEgXAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpNjg2LWxpbnV4LWFuZHJvaWQgLSMjIyAtUyAlcyAyPiYxIFwKIC8vIFJVTjogICAgICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfYW5kcm9pZF90cmVlL3N5c3Jvb3QgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUFORFJPSUQtWDg2ICVzCiAvLyBBTkRST0lELVg4NjogY2xhbmcKLS8vIEFORFJPSUQtWDg2OiAiLXRhcmdldC1jcHUiICJjb3JlMiIKKy8vIEFORFJPSUQtWDg2OiAiLXRhcmdldC1jcHUiICJpNjg2IgorLy8gQU5EUk9JRC1YODY6ICItdGFyZ2V0LWZlYXR1cmUiICIrc3NlMyIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtYW5kcm9pZCAtIyMjIC1TICVzIDI+JjEgXAorLy8gUlVOOiAgICAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19hbmRyb2lkX3RyZWUvc3lzcm9vdCBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9QU5EUk9JRC1YODZfNjQgJXMKKy8vIEFORFJPSUQtWDg2XzY0OiBjbGFuZworLy8gQU5EUk9JRC1YODZfNjQ6ICItdGFyZ2V0LWNwdSIgIng4Ni02NCIKKy8vIEFORFJPSUQtWDg2XzY0OiAiLXRhcmdldC1mZWF0dXJlIiAiK3NzZTMiCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwcy1saW51eC1nbnUgLSMjIyAtUyAlcyAyPiYxIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTICVzCisvLyBNSVBTOiBjbGFuZworLy8gTUlQUzogIi1jYzEiCisvLyBNSVBTOiAiLXRhcmdldC1jcHUiICJtaXBzMzJyMiIKKy8vIE1JUFM6ICItbWZsb2F0LWFiaSIgImhhcmQiCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwc2VsLWxpbnV4LWdudSAtIyMjIC1TICVzIDI+JjEgfCBcCisvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFNFTCAlcworLy8gTUlQU0VMOiBjbGFuZworLy8gTUlQU0VMOiAiLWNjMSIKKy8vIE1JUFNFTDogIi10YXJnZXQtY3B1IiAibWlwczMycjIiCisvLyBNSVBTRUw6ICItbWZsb2F0LWFiaSIgImhhcmQiCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwc2VsLWxpbnV4LWFuZHJvaWQgLSMjIyAtUyAlcyAyPiYxIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTRUwtQU5EUk9JRCAlcworLy8gTUlQU0VMLUFORFJPSUQ6IGNsYW5nCisvLyBNSVBTRUwtQU5EUk9JRDogIi1jYzEiCisvLyBNSVBTRUwtQU5EUk9JRDogIi10YXJnZXQtY3B1IiAibWlwczMycjIiCisvLyBNSVBTRUwtQU5EUk9JRDogIi1tZmxvYXQtYWJpIiAiaGFyZCIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzNjQtbGludXgtZ251IC0jIyMgLVMgJXMgMj4mMSB8IFwKKy8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUzY0ICVzCisvLyBNSVBTNjQ6IGNsYW5nCisvLyBNSVBTNjQ6ICItY2MxIgorLy8gTUlQUzY0OiAiLXRhcmdldC1jcHUiICJtaXBzNjRyMiIKKy8vIE1JUFM2NDogIi1tZmxvYXQtYWJpIiAiaGFyZCIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzNjRlbC1saW51eC1nbnUgLSMjIyAtUyAlcyAyPiYxIHwgXAorLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTNjRFTCAlcworLy8gTUlQUzY0RUw6IGNsYW5nCisvLyBNSVBTNjRFTDogIi1jYzEiCisvLyBNSVBTNjRFTDogIi10YXJnZXQtY3B1IiAibWlwczY0cjIiCisvLyBNSVBTNjRFTDogIi1tZmxvYXQtYWJpIiAiaGFyZCIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzNjRlbC1saW51eC1hbmRyb2lkIC0jIyMgLVMgJXMgMj4mMSB8IFwKKy8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUzY0RUwtQU5EUk9JRCAlcworLy8gTUlQUzY0RUwtQU5EUk9JRDogY2xhbmcKKy8vIE1JUFM2NEVMLUFORFJPSUQ6ICItY2MxIgorLy8gTUlQUzY0RUwtQU5EUk9JRDogIi10YXJnZXQtY3B1IiAibWlwczY0cjIiCisvLyBNSVBTNjRFTC1BTkRST0lEOiAiLW1mbG9hdC1hYmkiICJoYXJkIgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvY2xhbmdfZl9vcHRzLmMgYi90ZXN0L0RyaXZlci9jbGFuZ19mX29wdHMuYwppbmRleCA4YmY1M2U1Li42M2VhZjQxIDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9jbGFuZ19mX29wdHMuYworKysgYi90ZXN0L0RyaXZlci9jbGFuZ19mX29wdHMuYwpAQCAtMSwzICsxLDUgQEAKKy8vIFJFUVVJUkVTOiBjbGFuZy1kcml2ZXIKKwogLy8gUlVOOiAlY2xhbmcgLSMjIyAtUyAtZmFzbSAtZmJsb2NrcyAtZmJ1aWx0aW4gLWZuby1tYXRoLWVycm5vIC1mY29tbW9uIC1mcGFzY2FsLXN0cmluZ3MgLWZuby1ibG9ja3MgLWZuby1idWlsdGluIC1mbWF0aC1lcnJubyAtZm5vLWNvbW1vbiAtZm5vLXBhc2NhbC1zdHJpbmdzIC1mYmxvY2tzIC1mYnVpbHRpbiAtZm1hdGgtZXJybm8gLWZjb21tb24gLWZwYXNjYWwtc3RyaW5ncyAtZnNwbGl0LXN0YWNrICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1PUFRJT05TMSAlcwogLy8gUlVOOiAlY2xhbmcgLSMjIyAtUyAtZmFzbSAtZmJsb2NrcyAtZmJ1aWx0aW4gLWZuby1tYXRoLWVycm5vIC1mY29tbW9uIC1mcGFzY2FsLXN0cmluZ3MgLWZuby1hc20gLWZuby1ibG9ja3MgLWZuby1idWlsdGluIC1mbWF0aC1lcnJubyAtZm5vLWNvbW1vbiAtZm5vLXBhc2NhbC1zdHJpbmdzIC1mbm8tc2hvdy1zb3VyY2UtbG9jYXRpb24gLWZzaG9ydC1lbnVtcyAtZnNob3J0LXdjaGFyICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1PUFRJT05TMiAlcwogCkBAIC02LDggKzgsOCBAQAogLy8gQ0hFQ0stT1BUSU9OUzE6IC1mYmxvY2tzCiAvLyBDSEVDSy1PUFRJT05TMTogLWZwYXNjYWwtc3RyaW5ncwogCi0vLyBDSEVDS19PUFRJT05TMjogLWZuby1nbnUta2V5d29yZHMKIC8vIENIRUNLLU9QVElPTlMyOiAtZm1hdGgtZXJybm8KKy8vIENIRUNLLU9QVElPTlMyOiAtZm5vLWdudS1rZXl3b3JkcwogLy8gQ0hFQ0stT1BUSU9OUzI6IC1mbm8tYnVpbHRpbgogLy8gQ0hFQ0stT1BUSU9OUzI6IC1mc2hvcnQtZW51bXMKIC8vIENIRUNLLU9QVElPTlMyOiAtZnNob3J0LXdjaGFyCkBAIC0xNSwxMSArMTcsMTEgQEAKIC8vIENIRUNLLU9QVElPTlMyOiAtZm5vLXNob3ctc291cmNlLWxvY2F0aW9uCiAKIC8vIFJVTjogJWNsYW5nIC0jIyMgLVMgLVd3cml0ZS1zdHJpbmdzICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1XUklURS1TVFJJTkdTMSAlcwotLy8gUlVOOiAlY2xhbmcgLSMjIyAtUyAtV2V2ZXJ5dGhpbmcgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVdSSVRFLVNUUklOR1MxICVzCiAvLyBXUklURS1TVFJJTkdTMTogLWZjb25zdC1zdHJpbmdzCiAvLyBSVU46ICVjbGFuZyAtIyMjIC1TIC1Xd3JpdGUtc3RyaW5ncyAtV25vLXdyaXRlLXN0cmluZ3MgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVdSSVRFLVNUUklOR1MyICVzCi0vLyBSVU46ICVjbGFuZyAtIyMjIC1TIC1Xd3JpdGUtc3RyaW5ncyAtdyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9V1JJVEUtU1RSSU5HUzIgJXMKIC8vIFdSSVRFLVNUUklOR1MyLU5PVDogLWZjb25zdC1zdHJpbmdzCisvLyBSVU46ICVjbGFuZyAtIyMjIC1TIC1Xd3JpdGUtc3RyaW5ncyAtdyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9V1JJVEUtU1RSSU5HUzMgJXMKKy8vIFdSSVRFLVNUUklOR1MzLU5PVDogLWZjb25zdC1zdHJpbmdzCiAKIC8vIFJVTjogJWNsYW5nIC0jIyMgLXggYysrIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1ERVBSRUNBVEVELU9OLUNIRUNLICVzCiAvLyBSVU46ICVjbGFuZyAtIyMjIC14IGMrKyAtYyAtV2RlcHJlY2F0ZWQgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PURFUFJFQ0FURUQtT04tQ0hFQ0sgJXMKQEAgLTU0LDYgKzU2LDkgQEAKIC8vIFJVTjogJWNsYW5nIC0jIyMgLVMgLWZwcm9maWxlLXNhbXBsZS11c2U9JVMvSW5wdXRzL2ZpbGUucHJvZiAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stU0FNUExFLVBST0ZJTEUgJXMKIC8vIENIRUNLLVNBTVBMRS1QUk9GSUxFOiAiLWZwcm9maWxlLXNhbXBsZS11c2U9e3suKn19L2ZpbGUucHJvZiIKIAorLy8gUlVOOiAlY2xhbmcgLSMjIyAtUyAtZmF1dG8tcHJvZmlsZT0lUy9JbnB1dHMvZmlsZS5wcm9mICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1BVVRPLVBST0ZJTEUgJXMKKy8vIENIRUNLLUFVVE8tUFJPRklMRTogIi1mcHJvZmlsZS1zYW1wbGUtdXNlPXt7Lip9fS9maWxlLnByb2YiCisKIC8vIFJVTjogJWNsYW5nIC0jIyMgLVMgLWZ2ZWN0b3JpemUgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVZFQ1RPUklaRSAlcwogLy8gUlVOOiAlY2xhbmcgLSMjIyAtUyAtZm5vLXZlY3Rvcml6ZSAtZnZlY3Rvcml6ZSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVkVDVE9SSVpFICVzCiAvLyBSVU46ICVjbGFuZyAtIyMjIC1TIC1mbm8tdmVjdG9yaXplICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1OTy1WRUNUT1JJWkUgJXMKQEAgLTE0NSwzICsxNTAsMTAgQEAKIC8vIFJVTjogICAgIC1mc3RyZW5ndGgtcmVkdWNlIC1mbm8tc3RyZW5ndGgtcmVkdWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIC8vIFJVTjogICAgICVzIDI+JjEgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9SUdOT1JFICVzCiAvLyBJR05PUkUtTk9UOiBlcnJvcjogdW5rbm93biBhcmd1bWVudAorCisvLyBSVU46ICVjbGFuZyAtIyMjIC1mc2hvcnQtd2NoYXIgLWZuby1zaG9ydC13Y2hhciAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stV0NIQVIxICVzCisvLyBSVU46ICVjbGFuZyAtIyMjIC1mbm8tc2hvcnQtd2NoYXIgLWZzaG9ydC13Y2hhciAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stV0NIQVIyICVzCisvLyBDSEVDSy1XQ0hBUjE6IC1mbm8tc2hvcnQtd2NoYXIKKy8vIENIRUNLLVdDSEFSMS1OT1Q6IC1mc2hvcnQtd2NoYXIKKy8vIENIRUNLLVdDSEFSMjogLWZzaG9ydC13Y2hhcgorLy8gQ0hFQ0stV0NIQVIyLU5PVDogLWZuby1zaG9ydC13Y2hhcgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvY29tcHJlc3MuYyBiL3Rlc3QvRHJpdmVyL2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkYzZiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRHJpdmVyL2NvbXByZXNzLmMKQEAgLTAsMCArMSw4IEBACisvLyBSVU46ICVjbGFuZyAtIyMjIC1jIC1pbnRlZ3JhdGVkLWFzIC1XYSwtY29tcHJlc3MtZGVidWctc2VjdGlvbnMgJXMgMj4mMSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DT01QUkVTU19ERUJVRyAlcworLy8gUlVOOiAlY2xhbmcgLSMjIyAtYyAtaW50ZWdyYXRlZC1hcyAtV2EsLS1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucyAlcyAyPiYxIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNPTVBSRVNTX0RFQlVHICVzCisvLyBSRVFVSVJFUzogemxpYgorCisvLyBDT01QUkVTU19ERUJVRzogIi1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucyIKKworLy8gUlVOOiAlY2xhbmcgLSMjIyAtYyAtaW50ZWdyYXRlZC1hcyAtV2EsLS1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucyAtV2EsLS1ub2NvbXByZXNzLWRlYnVnLXNlY3Rpb25zICVzIDI+JjEgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Tk9DT01QUkVTU19ERUJVRyAlcworLy8gTk9DT01QUkVTU19ERUJVRy1OT1Q6ICItY29tcHJlc3MtZGVidWctc2VjdGlvbnMiCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9jb25zdHJ1Y3RvcnMuYyBiL3Rlc3QvRHJpdmVyL2NvbnN0cnVjdG9ycy5jCmluZGV4IDllYTkxZDkuLjY4MDcwNWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2NvbnN0cnVjdG9ycy5jCisrKyBiL3Rlc3QvRHJpdmVyL2NvbnN0cnVjdG9ycy5jCkBAIC00NiwzICs0NiwxMiBAQAogLy8gUlVOOiAgICAgLXRhcmdldCBpMzg2LXVua25vd24tbGludXgtYW5kcm9pZCBcCiAvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2FuZHJvaWRfdHJlZS9zeXNyb290IFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1JTklULUFSUkFZICVzCisvLworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1mc3ludGF4LW9ubHkgMj4mMSAgICAgICBcCisvLyBSVU46ICAgICAtdGFyZ2V0IGFhcmNoNjQtbm9uZS1saW51eC1nbnUgXAorLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19saW51eF90cmVlIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1JTklULUFSUkFZICVzCisvLworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1mc3ludGF4LW9ubHkgMj4mMSAgICAgICBcCisvLyBSVU46ICAgICAtdGFyZ2V0IGFhcmNoNjQtbm9uZS1ub25lLWVhYmkgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUlOSVQtQVJSQVkgJXMKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL2NvdmVyYWdlLWxkLmMgYi90ZXN0L0RyaXZlci9jb3ZlcmFnZS1sZC5jCmluZGV4IGNiYjdkZDQuLjBlMzkyNDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2NvdmVyYWdlLWxkLmMKKysrIGIvdGVzdC9Ecml2ZXIvY292ZXJhZ2UtbGQuYwpAQCAtMTcsMyArMTcsMTIgQEAKIC8vCiAvLyBDSEVDSy1MSU5VWC1YODYtNjQ6ICJ7eyguKlteLS4wLTlBLVpfYS16XSk/fX1sZHt7KC5leGUpP319IgogLy8gQ0hFQ0stTElOVVgtWDg2LTY0OiAie3suKn19L0lucHV0cy9yZXNvdXJjZV9kaXJ7ey98XFxcXH19bGlie3svfFxcXFx9fWxpbnV4e3svfFxcXFx9fWxpYmNsYW5nX3J0LnByb2ZpbGUteDg2XzY0LmEiIHt7Lip9fSAiLWxjIgorLy8KKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLXRhcmdldCB4ODZfNjQtdW5rbm93bi1mcmVlYnNkIC0tY292ZXJhZ2UgXAorLy8gUlVOOiAgICAgLXJlc291cmNlLWRpcj0lUy9JbnB1dHMvcmVzb3VyY2VfZGlyIFwKKy8vIFJVTjogICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfZnJlZWJzZDY0X3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUZSRUVCU0QtWDg2LTY0ICVzCisvLworLy8gQ0hFQ0stRlJFRUJTRC1YODYtNjQ6ICJ7eyguKlteLS4wLTlBLVpfYS16XSk/fX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stRlJFRUJTRC1YODYtNjQ6ICJ7ey4qfX0vSW5wdXRzL3Jlc291cmNlX2Rpcnt7L3xcXFxcfX1saWJ7ey98XFxcXH19ZnJlZWJzZHt7L3xcXFxcfX1saWJjbGFuZ19ydC5wcm9maWxlLXg4Nl82NC5hIgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvZGFyd2luLWFzLmMgYi90ZXN0L0RyaXZlci9kYXJ3aW4tYXMuYwppbmRleCA1OGM4NTBlLi5lMzUzOTFlIDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9kYXJ3aW4tYXMuYworKysgYi90ZXN0L0RyaXZlci9kYXJ3aW4tYXMuYwpAQCAtMSwxNiArMSwyMiBAQAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpMzg2LWFwcGxlLWRhcndpbjEwIC0jIyMgLXggYXNzZW1ibGVyIC1jICVzIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtc3RhdGljIC1keW5hbWljIDI+JXQKKy8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stU1RBVElDX0FORF9EWU5BTUlDLTMyLURBUldJTjEwIC0taW5wdXQtZmlsZSAldCAlcworLy8KKy8vIENIRUNLLVNUQVRJQ19BTkRfRFlOQU1JQy0zMi1EQVJXSU4xMDogYXN7eyguZXhlKT99fSIgIi1hcmNoIiAiaTM4NiIgIi1mb3JjZV9jcHVzdWJ0eXBlX0FMTCIgIi1zdGF0aWMiICItbyIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpMzg2LWFwcGxlLWRhcndpbjExIC0jIyMgLXggYXNzZW1ibGVyIC1jICVzIFwKKy8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtc3RhdGljIC1keW5hbWljIDI+JXQKIC8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stU1RBVElDX0FORF9EWU5BTUlDLTMyIC0taW5wdXQtZmlsZSAldCAlcwogLy8KIC8vIENIRUNLLVNUQVRJQ19BTkRfRFlOQU1JQy0zMjogYXN7eyguZXhlKT99fSIgIi1RIiAiLWFyY2giICJpMzg2IiAiLWZvcmNlX2NwdXN1YnR5cGVfQUxMIiAiLXN0YXRpYyIgIi1vIgogCi0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtIyMjIC14IGFzc2VtYmxlciAtYyAlcyBcCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1kYXJ3aW4xMSAtIyMjIC14IGFzc2VtYmxlciAtYyAlcyBcCiAvLyBSVU46ICAgLW5vLWludGVncmF0ZWQtYXMgLXN0YXRpYyAyPiV0CiAvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVNUQVRJQy02NCAtLWlucHV0LWZpbGUgJXQgJXMKIC8vCiAvLyBDSEVDSy1TVEFUSUMtNjQ6IGFze3soLmV4ZSk/fX0iICItUSIgIi1hcmNoIiAieDg2XzY0IiAiLWZvcmNlX2NwdXN1YnR5cGVfQUxMIiAiLW8iCiAKLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC0jIyMgXAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luMTEgLSMjIyBcCiAvLyBSVU46ICAgLWFyY2ggYXJtdjYgLW5vLWludGVncmF0ZWQtYXMgLXggYXNzZW1ibGVyIC1jICVzIDI+JXQKIC8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQVJNVjYgLS1pbnB1dC1maWxlICV0ICVzCiAvLwpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvZGFyd2luLWFzYW4tbm9mb3J0aWZ5LmMgYi90ZXN0L0RyaXZlci9kYXJ3aW4tYXNhbi1ub2ZvcnRpZnkuYwppbmRleCA3ZjMyNWUwLi41OGI1YmU5IDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9kYXJ3aW4tYXNhbi1ub2ZvcnRpZnkuYworKysgYi90ZXN0L0RyaXZlci9kYXJ3aW4tYXNhbi1ub2ZvcnRpZnkuYwpAQCAtMSw2ICsxLDUgQEAKIC8vIE1ha2Ugc3VyZSBBZGRyZXNzU2FuaXRpemVyIGRpc2FibGVzIF9GT1JUSUZZX1NPVVJDRSBvbiBEYXJ3aW4uCiAKLS8vIFJVTjogJWNsYW5nIC1mYWRkcmVzcy1zYW5pdGl6ZXIgJXMgLUUgLWRNIC10YXJnZXQgeDg2XzY0LWRhcndpbiAtIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZyAtZnNhbml0aXplPWFkZHJlc3MgICVzIC1FIC1kTSAtdGFyZ2V0IHg4Nl82NC1kYXJ3aW4gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmcgLWZzYW5pdGl6ZT1hZGRyZXNzICAlcyAtRSAtZE0gLXRhcmdldCB4ODZfNjQtZGFyd2luIHwgRmlsZUNoZWNrICVzCiAKIC8vIENIRUNLOiAjZGVmaW5lIF9GT1JUSUZZX1NPVVJDRSAwCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9kYXJ3aW4tZHN5bXV0aWwuYyBiL3Rlc3QvRHJpdmVyL2Rhcndpbi1kc3ltdXRpbC5jCmluZGV4IGI4YzMwODMuLjU5MDg0YTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2Rhcndpbi1kc3ltdXRpbC5jCisrKyBiL3Rlc3QvRHJpdmVyL2Rhcndpbi1kc3ltdXRpbC5jCkBAIC00MywzICs0Myw2IEBACiAvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUxPQ0FUSU9OIDwgJXQgJXMKIAogLy8gQ0hFQ0stTE9DQVRJT046ICJ4ODZfNjQtYXBwbGUtZGFyd2luMTAiIC0gImRhcndpbjo6RHN5bXV0aWwiLCBpbnB1dHM6IFsiYmFyL2ZvbyJdLCBvdXRwdXQ6ICJiYXIvZm9vLmRTWU0iCisKKy8vIENoZWNrIHRoYXQgd2UgZG9uJ3QgY3Jhc2ggd2hlbiB0cmFuc2xhdGluZyBhcmd1bWVudHMgZm9yIGRzeW11dGlsLgorLy8gUlVOOiAlY2xhbmcgLW0zMiAtYXJjaCB4ODZfNjQgLWcgJXMgLSMjIwpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvZGFyd2luLWVhYmkuYyBiL3Rlc3QvRHJpdmVyL2Rhcndpbi1lYWJpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODhmYTQuLjAwMDAwMDAKLS0tIGEvdGVzdC9Ecml2ZXIvZGFyd2luLWVhYmkuYworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8vIFJVTjogJWNsYW5nIC1hcmNoIGFybXY3IC10YXJnZXQgdGh1bWJ2Ny1hcHBsZS1kYXJ3aW4tZWFiaSAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQUFQQ1MKLS8vIFJVTjogJWNsYW5nIC1hcmNoIGFybXY3cyAtdGFyZ2V0IHRodW1idjctYXBwbGUtaW9zIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1BUENTCi0vLyBSVU46ICVjbGFuZyAtYXJjaCBhcm12N3MgLXRhcmdldCB0aHVtYnY3LWFwcGxlLWRhcndpbiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQVBDUwotLy8gUlVOOiAlY2xhbmcgLWFyY2ggYXJtdjZtIC10YXJnZXQgdGh1bWJ2Ny1hcHBsZS1kYXJ3aW4gLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLURBUldJTi1FQUJJCi0vLyBSVU46ICVjbGFuZyAtYXJjaCBhcm12N20gLXRhcmdldCB0aHVtYnY3LWFwcGxlLWRhcndpbiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stREFSV0lOLUVBQkkKLS8vIFJVTjogJWNsYW5nIC1hcmNoIGFybXY3ZW0gLXRhcmdldCB0aHVtYnY3LWFwcGxlLWRhcndpbiAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stREFSV0lOLUVBQkkKLQotLy8gQ0hFQ0stREFSV0lOLUVBQkk6ICItdHJpcGxlIiAie3t0aHVtYnZbNjddZT9tfX0tYXBwbGUtZGFyd2luLWVhYmkiCi0vLyBDSEVDSy1JT1M6ICItdHJpcGxlIiAidGh1bWJ2NyIgInRodW1idjctYXBwbGUtaW9zCi0KLS8vIENIRUNLLUFBUENTOiAiLXRhcmdldC1hYmkiICJhYXBjcyIKLS8vIENIRUNLLUFQQ1M6ICItdGFyZ2V0LWFiaSIgImFwY3MtZ251IgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvZGFyd2luLWVtYmVkZGVkLmMgYi90ZXN0L0RyaXZlci9kYXJ3aW4tZW1iZWRkZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI3YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Ecml2ZXIvZGFyd2luLWVtYmVkZGVkLmMKQEAgLTAsMCArMSw2MCBAQAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luIC1hcmNoIGFybXY2bSAtcmVzb3VyY2UtZGlyPSVTL0lucHV0cy9yZXNvdXJjZV9kaXIgJXMgLSMjIyAyPiAldAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luIC1hcmNoIGFybXY3ZW0gLXJlc291cmNlLWRpcj0lUy9JbnB1dHMvcmVzb3VyY2VfZGlyICVzIC0jIyMgMj4+ICV0CisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1kYXJ3aW4gLWFyY2ggYXJtdjdlbSAtbWhhcmQtZmxvYXQgLXJlc291cmNlLWRpcj0lUy9JbnB1dHMvcmVzb3VyY2VfZGlyICVzIC0jIyMgMj4+ICV0CisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWFwcGxlLWRhcndpbiAtYXJjaCBhcm12N20gLWZQSUMgLXJlc291cmNlLWRpcj0lUy9JbnB1dHMvcmVzb3VyY2VfZGlyICVzIC0jIyMgMj4+ICV0CisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1kYXJ3aW4gLWFyY2ggYXJtdjdlbSAtZlBJQyAtbWZsb2F0LWFiaT1oYXJkIC1yZXNvdXJjZS1kaXI9JVMvSW5wdXRzL3Jlc291cmNlX2RpciAlcyAtIyMjIDI+PiAldAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luIC1hcmNoIGFybXY3ZW0gLWZQSUMgLW1mbG9hdC1hYmk9c29mdGZwIC1yZXNvdXJjZS1kaXI9JVMvSW5wdXRzL3Jlc291cmNlX2RpciAlcyAtIyMjIDI+PiAldAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtbm9uZS1tYWNobyAtYXJjaCBhcm12NyAtbWhhcmQtZmxvYXQgLXJlc291cmNlLWRpcj0lUy9JbnB1dHMvcmVzb3VyY2VfZGlyICVzIC0jIyMgMj4+ICV0CisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1ub25lLW1hY2hvIC1hcmNoIGFybXY3IC1tc29mdC1mbG9hdCAtZlBJQyAtcmVzb3VyY2UtZGlyPSVTL0lucHV0cy9yZXNvdXJjZV9kaXIgJXMgLSMjIyAyPj4gJXQKKworCisvLyBSVU46IEZpbGVDaGVjayAlcyA8ICV0CisKKy8vIEFSTXY2bSBoYXMgbm8gZmxvYXQKKy8vIENIRUNLLUxBQkVMOiBUYXJnZXQ6CisvLyBDSEVDSy1OT1Q6IHdhcm5pbmc6IHVua25vd24gcGxhdGZvcm0KKy8vIENIRUNLOiAiLW1mbG9hdC1hYmkiICJzb2Z0IgorLy8gQ0hFQ0s6IGxpYmNsYW5nX3J0LnNvZnRfc3RhdGljLmEKKworLy8gQVJNdjdlbSBkb2VzLCBidXQgZGVmYXVsdHMgdG8gc29mdAorLy8gQ0hFQ0stTEFCRUw6IFRhcmdldDoKKy8vIENIRUNLLU5PVDogd2FybmluZzogdW5rbm93biBwbGF0Zm9ybQorLy8gQ0hFQ0s6ICItbWZsb2F0LWFiaSIgInNvZnQiCisvLyBDSEVDSzogbGliY2xhbmdfcnQuc29mdF9zdGF0aWMuYQorCisvLyBXaGljaCBjYW4gYmUgb3ZlcnJpZGRlbgorLy8gQ0hFQ0stTEFCRUw6IFRhcmdldDoKKy8vIENIRUNLLU5PVDogd2FybmluZzogdW5rbm93biBwbGF0Zm9ybQorLy8gQ0hFQ0s6ICItbWZsb2F0LWFiaSIgImhhcmQiCisvLyBDSEVDSzogbGliY2xhbmdfcnQuaGFyZF9zdGF0aWMuYQorCisvLyBBUk12N20gaGFzIG5vIGZsb2F0IGVpdGhlcgorLy8gQ0hFQ0stTEFCRUw6IFRhcmdldDoKKy8vIENIRUNLLU5PVDogd2FybmluZzogdW5rbm93biBwbGF0Zm9ybQorLy8gQ0hFQ0s6ICItbWZsb2F0LWFiaSIgInNvZnQiCisvLyBDSEVDSzogbGliY2xhbmdfcnQuc29mdF9waWMuYQorCisvLyBCdXQgaXQgY2FuIGJlIGVuYWJsZWQgb24gQVJNdjdlbQorLy8gQ0hFQ0stTEFCRUw6IFRhcmdldDoKKy8vIENIRUNLLU5PVDogd2FybmluZzogdW5rbm93biBwbGF0Zm9ybQorLy8gQ0hFQ0s6ICItbWZsb2F0LWFiaSIgImhhcmQiCisvLyBDSEVDSzogbGliY2xhbmdfcnQuaGFyZF9waWMuYQorCisvLyAic29mdGZwIiBtdXN0IGxpbmsgYWdhaW5zdCBhIHNvZnQtZmxvYXQgbGlicmFyeSBzaW5jZSB0aGF0J3Mgd2hhdCB0aGUKKy8vIGNhbGxlcnMgd2UncmUgY29tcGlsaW5nIHdpbGwgZXhwZWN0LgorLy8gQ0hFQ0stTEFCRUw6IFRhcmdldDoKKy8vIENIRUNLLU5PVDogd2FybmluZzogdW5rbm93biBwbGF0Zm9ybQorLy8gQ0hFQ0s6ICItbWZsb2F0LWFiaSIgInNvZnQiCisvLyBDSEVDSzogbGliY2xhbmdfcnQuc29mdF9waWMuYQorCisvLyAtYXJjaCAiYXJtdjciICg9PSBlbWJlZGRlZCB2N2EpIGNhbiBiZSB1c2VkIGluIGEgY291cGxlIG9mIHZhcmlhbnRzOgorLy8gQ0hFQ0stTEFCRUw6IFRhcmdldDoKKy8vIENIRUNLLU5PVDogd2FybmluZzogdW5rbm93biBwbGF0Zm9ybQorLy8gQ0hFQ0s6ICItbWZsb2F0LWFiaSIgImhhcmQiCisvLyBDSEVDSzogbGliY2xhbmdfcnQuaGFyZF9zdGF0aWMuYQorCisvLyBDSEVDSy1MQUJFTDogVGFyZ2V0OgorLy8gQ0hFQ0stTk9UOiB3YXJuaW5nOiB1bmtub3duIHBsYXRmb3JtCisvLyBDSEVDSzogIi1tZmxvYXQtYWJpIiAic29mdCIKKy8vIENIRUNLOiBsaWJjbGFuZ19ydC5zb2Z0X3BpYy5hCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9kYXJ3aW4tbGQuYyBiL3Rlc3QvRHJpdmVyL2Rhcndpbi1sZC5jCmluZGV4IGQ2YzUxNzAuLjJkYTBkMzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2Rhcndpbi1sZC5jCisrKyBiL3Rlc3QvRHJpdmVyL2Rhcndpbi1sZC5jCkBAIC00NSw2ICs0NSwyMiBAQAogLy8gTElOS19JUEhPTkVfM18xLU5PVDogLWxidW5kbGUxLm8KIC8vIExJTktfSVBIT05FXzNfMTogLWxTeXN0ZW0KIAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpMzg2LWFwcGxlLWRhcndpbjkgLSMjIyAtYXJjaCBpMzg2IC1taW9zLXNpbXVsYXRvci12ZXJzaW9uLW1pbj0zLjAgJXQubyAyPiAldC5sb2cKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgaTM4Ni1hcHBsZS1kYXJ3aW45IC0jIyMgLWFyY2ggaTM4NiAtbWlvcy1zaW11bGF0b3ItdmVyc2lvbi1taW49My4wIC1keW5hbWljbGliICV0Lm8gMj4+ICV0LmxvZworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpMzg2LWFwcGxlLWRhcndpbjkgLSMjIyAtYXJjaCBpMzg2IC1taW9zLXNpbXVsYXRvci12ZXJzaW9uLW1pbj0zLjAgLWJ1bmRsZSAldC5vIDI+PiAldC5sb2cKKy8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TElOS19JT1NTSU1fM18wICVzIDwgJXQubG9nCisKKy8vIExJTktfSU9TU0lNXzNfMDoge3tsZCguZXhlKT8ifX0KKy8vIExJTktfSU9TU0lNXzNfMC1OT1Q6IC1sY3J0MS5vCisvLyBMSU5LX0lPU1NJTV8zXzA6IC1sU3lzdGVtCisvLyBMSU5LX0lPU1NJTV8zXzA6IHt7bGQoLmV4ZSk/In19CisvLyBMSU5LX0lPU1NJTV8zXzA6IC1keWxpYgorLy8gTElOS19JT1NTSU1fM18wLU5PVDogLWxkeWxpYjEubworLy8gTElOS19JT1NTSU1fM18wOiAtbFN5c3RlbQorLy8gTElOS19JT1NTSU1fM18wOiB7e2xkKC5leGUpPyJ9fQorLy8gTElOS19JT1NTSU1fM18wLU5PVDogLWxidW5kbGUxLm8KKy8vIExJTktfSU9TU0lNXzNfMDogLWxTeXN0ZW0KKwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpMzg2LWFwcGxlLWRhcndpbjkgLSMjIyAtZnBpZSAldC5vIDI+ICV0LmxvZwogLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1MSU5LX0VYUExJQ0lUX1BJRSAlcyA8ICV0LmxvZwogLy8KQEAgLTEyNiwxMSArMTQyLDI0IEBACiAvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUxJTktfTk9fSU9TX0NSVDEgJXMgPCAldC5sb2cKIC8vIExJTktfTk9fSU9TX0NSVDEtTk9UOiBjcnQKIAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm02NC1hcHBsZS1pb3M1LjAgLW1pcGhvbmVvcy12ZXJzaW9uLW1pbj01LjAgLSMjIyAldC5vIDI+ICV0LmxvZworLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1MSU5LX05PX0lPU19BUk02NF9DUlQxICVzIDwgJXQubG9nCisvLyBMSU5LX05PX0lPU19BUk02NF9DUlQxLU5PVDogY3J0CisKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgaTM4Ni1hcHBsZS1kYXJ3aW4xMiAtcGcgLSMjIyAldC5vIDI+ICV0LmxvZwogLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1MSU5LX1BHICVzIDwgJXQubG9nCiAvLyBMSU5LX1BHOiAtbGdjcnQxLm8KIC8vIExJTktfUEc6IC1ub19uZXdfbWFpbgogCisvLyBDaGVjayB0aGF0IGNsYW5nIGxpbmtzIHdpdGggbGliZ2NjX3MuMSBmb3IgaU9TIDQgYW5kIGVhcmxpZXIsIGJ1dCBub3QgYXJtNjQuCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LWFwcGxlLWlvczQuMCAtbWlwaG9uZW9zLXZlcnNpb24tbWluPTQuMCAtIyMjICV0Lm8gMj4gJXQubG9nCisvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUxJTktfSU9TX0xJQkdDQ19TICVzIDwgJXQubG9nCisvLyBMSU5LX0lPU19MSUJHQ0NfUzogbGdjY19zLjEKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm02NC1hcHBsZS1pb3M0LjAgLW1pcGhvbmVvcy12ZXJzaW9uLW1pbj00LjAgLSMjIyAldC5vIDI+ICV0LmxvZworLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1MSU5LX05PX0lPU19BUk02NF9MSUJHQ0NfUyAlcyA8ICV0LmxvZworLy8gTElOS19OT19JT1NfQVJNNjRfTElCR0NDX1MtTk9UOiBsZ2NjX3MuMQorCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1kYXJ3aW4xMiAtcmR5bmFtaWMgLSMjIyAldC5vIFwKIC8vIFJVTjogICAtbWxpbmtlci12ZXJzaW9uPTEwMCAyPiAldC5sb2cKIC8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TElOS19OT19FWFBPUlRfRFlOQU1JQyAlcyA8ICV0LmxvZwpAQCAtMTQzLDQgKzE3MiwyNSBAQAogLy8gTElOS19FWFBPUlRfRFlOQU1JQzoge3tsZCguZXhlKT8ifX0KIC8vIExJTktfRVhQT1JUX0RZTkFNSUM6ICItZXhwb3J0X2R5bmFtaWMiCiAKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0aC1hcHBsZS1kYXJ3aW4gLSMjIyAldC5vIDI+ICV0LmxvZworLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1MSU5LX1g4Nl82NEhfQVJDSCAlcyA8ICV0LmxvZworLy8KKy8vIExJTktfWDg2XzY0SF9BUkNIOiB7e2xkKC5leGUpPyJ9fQorLy8gTElOS19YODZfNjRIX0FSQ0g6ICJ4ODZfNjRoIgogCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1kYXJ3aW4gLWFyY2ggeDg2XzY0IC1hcmNoIHg4Nl82NGggLSMjIyAldC5vIDI+ICV0LmxvZworLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1MSU5LX1g4Nl82NEhfTVVMVElBUkNIICVzIDwgJXQubG9nCisvLworLy8gTElOS19YODZfNjRIX01VTFRJQVJDSDoge3tsZCguZXhlKT8ifX0KKy8vIExJTktfWDg2XzY0SF9NVUxUSUFSQ0g6ICJ4ODZfNjQiCisvLworLy8gTElOS19YODZfNjRIX01VTFRJQVJDSDoge3tsZCguZXhlKT8ifX0KKy8vIExJTktfWDg2XzY0SF9NVUxUSUFSQ0g6ICJ4ODZfNjRoIgorCisvLyBDaGVjayB0aGF0IGNsYW5nIHBhc3NlcyAtaXBob25lb3NfdmVyc2lvbl9taW4gdG8gdGhlIGxpbmtlciB3aGVuIGJ1aWxkaW5nCisvLyBmb3IgdGhlIGlPUyBzaW11bGF0b3IgYnV0IHdoZW4gLW1pb3Mtc2ltdWxhdG9yLXZlcnNpb24tbWluIGlzIG5vdAorLy8gZXhwbGljaXRseSBzcGVjaWZpZWQgKDxyZGFyOi8vcHJvYmxlbS8xNTk1OTAwOT4pLgorLy8gUlVOOiBlbnYgSVBIT05FT1NfREVQTE9ZTUVOVF9UQVJHRVQ9Ny4wIFwKKy8vIFJVTjogICAlY2xhbmcgLXRhcmdldCBpMzg2LWFwcGxlLWRhcndpbiAtIyMjICV0Lm8gMj4gJXQubG9nCisvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUxJTktfSVBIT05FT1NfVkVSU0lPTl9NSU4gJXMgPCAldC5sb2cKKy8vIExJTktfSVBIT05FT1NfVkVSU0lPTl9NSU46IC1pcGhvbmVvc192ZXJzaW9uX21pbgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvZGFyd2luLW9iamMtZGVmYXVsdHMubSBiL3Rlc3QvRHJpdmVyL2Rhcndpbi1vYmpjLWRlZmF1bHRzLm0KaW5kZXggMTc0MmRlYi4uMWIzZjdhOCAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvZGFyd2luLW9iamMtZGVmYXVsdHMubQorKysgYi90ZXN0L0RyaXZlci9kYXJ3aW4tb2JqYy1kZWZhdWx0cy5tCkBAIC0zMiwxMSArMzIsMjAgQEAKIC8vIHg4Nl82NAogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtUyAtIyMjICVzIFwKKy8vIFJVTjogICAtYXJjaCB4ODZfNjQgLW1tYWNvc3gtdmVyc2lvbi1taW49MTAuNCAyPiAldAorLy8gUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXggQ0hFQ0stQ0hFQ0stWDg2XzY0X09TWDEwXzQgPCAldCAlcworCisvLyBDSEVDSy1DSEVDSy1YODZfNjRfT1NYMTBfNDogIi1jYzEiCisvLyBDSEVDSy1DSEVDSy1YODZfNjRfT1NYMTBfNDogLWZvYmpjLWRpc3BhdGNoLW1ldGhvZD1ub24tbGVnYWN5CisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1TIC0jIyMgJXMgXAogLy8gUlVOOiAgIC1hcmNoIHg4Nl82NCAtbW1hY29zeC12ZXJzaW9uLW1pbj0xMC41IDI+ICV0CiAvLyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeCBDSEVDSy1DSEVDSy1YODZfNjRfT1NYMTBfNSA8ICV0ICVzCiAKKwogLy8gQ0hFQ0stQ0hFQ0stWDg2XzY0X09TWDEwXzU6ICItY2MxIgogLy8gQ0hFQ0stQ0hFQ0stWDg2XzY0X09TWDEwXzU6IC1mb2JqYy1ydW50aW1lPW1hY29zeC0xMC41CisvLyBDSEVDSy1DSEVDSy1YODZfNjRfT1NYMTBfNTogLWZvYmpjLWRpc3BhdGNoLW1ldGhvZD1ub24tbGVnYWN5CiAvLyBDSEVDSy1DSEVDSy1YODZfNjRfT1NYMTBfNTogZGFyd2luLW9iamMtZGVmYXVsdHMKIAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLVMgLSMjIyAlcyBcCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9kYXJ3aW4tb2JqYy1vcHRpb25zLm0gYi90ZXN0L0RyaXZlci9kYXJ3aW4tb2JqYy1vcHRpb25zLm0KaW5kZXggYTkwYTEyZC4uM2UyMWZiMyAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvZGFyd2luLW9iamMtb3B0aW9ucy5tCisrKyBiL3Rlc3QvRHJpdmVyL2Rhcndpbi1vYmpjLW9wdGlvbnMubQpAQCAtMzAsMyArMzAsNiBAQAogLy8gQ0hFQ0stQ0hFQ0stSTM4Nl9JT1M6IC1mZXhjZXB0aW9ucwogLy8gQ0hFQ0stQ0hFQ0stSTM4Nl9JT1MtTk9UOiAtZm9iamMtZGlzcGF0Y2gtbWV0aG9kCiAvLyBDSEVDSy1DSEVDSy1JMzg2X0lPUzogZGFyd2luLW9iamMtb3B0aW9ucworCisvLyBEb24ndCBjcmFzaCB3aXRoIGFuIHVuZXhwZWN0ZWQgdGFyZ2V0IHRyaXBsZS4KKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgaTM4Ni1hcHBsZS1pb3M3IC1TIC0jIyMgJXMKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL2Rhcndpbi12ZXJpZnktZGVidWcuYyBiL3Rlc3QvRHJpdmVyL2Rhcndpbi12ZXJpZnktZGVidWcuYwppbmRleCBjNDE5Y2VmLi40ODc4Yzc0IDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9kYXJ3aW4tdmVyaWZ5LWRlYnVnLmMKKysrIGIvdGVzdC9Ecml2ZXIvZGFyd2luLXZlcmlmeS1kZWJ1Zy5jCkBAIC0yLDE1ICsyLDE1IEBACiAvLwogLy8gUkVRVUlSRVM6IGFzc2VydHMKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1jY2MtcHJpbnQtcGhhc2VzIFwKLS8vIFJVTjogICAtdmVyaWZ5IC1hcmNoIGkzODYgLWFyY2ggeDg2XzY0ICVzIC1nIDI+ICV0CisvLyBSVU46ICAgLS12ZXJpZnktZGVidWctaW5mbyAtYXJjaCBpMzg2IC1hcmNoIHg4Nl82NCAlcyAtZyAyPiAldAogLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1NVUxUSUFSQ0gtQUNUSU9OUyA8ICV0ICVzCiAvLwogLy8gQ0hFQ0stTVVMVElBUkNILUFDVElPTlM6IDA6IGlucHV0LCAie3suKn19ZGFyd2luLXZlcmlmeS1kZWJ1Zy5jIiwgYwogLy8gQ0hFQ0stTVVMVElBUkNILUFDVElPTlM6IDg6IGRzeW11dGlsLCB7N30sIGRTWU0KLS8vIENIRUNLLU1VTFRJQVJDSC1BQ1RJT05TOiA5OiB2ZXJpZnksIHs4fSwgbm9uZQorLy8gQ0hFQ0stTVVMVElBUkNILUFDVElPTlM6IDk6IHZlcmlmeS1kZWJ1Zy1pbmZvLCB7OH0sIG5vbmUKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtY2NjLXByaW50LWJpbmRpbmdzIFwKLS8vIFJVTjogICAtdmVyaWZ5IC1hcmNoIGkzODYgLWFyY2ggeDg2XzY0ICVzIC1nIDI+ICV0CisvLyBSVU46ICAgLS12ZXJpZnktZGVidWctaW5mbyAtYXJjaCBpMzg2IC1hcmNoIHg4Nl82NCAlcyAtZyAyPiAldAogLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1NVUxUSUFSQ0gtQklORElOR1MgPCAldCAlcwogLy8KIC8vIENIRUNLLU1VTFRJQVJDSC1CSU5ESU5HUzogIyAieDg2XzY0LWFwcGxlLWRhcndpbjEwIiAtICJkYXJ3aW46OkRzeW11dGlsIiwgaW5wdXRzOiBbImEub3V0Il0sIG91dHB1dDogImEub3V0LmRTWU0iCkBAIC0xOSw3ICsxOSw3IEBACiAvLyBDaGVjayBvdXRwdXQgbmFtZSBkZXJpdmF0aW9uLgogLy8KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1jY2MtcHJpbnQtYmluZGluZ3MgXAotLy8gUlVOOiAgIC12ZXJpZnkgLW8gZm9vICVzIC1nIDI+ICV0CisvLyBSVU46ICAgLS12ZXJpZnktZGVidWctaW5mbyAtbyBmb28gJXMgLWcgMj4gJXQKIC8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stT1VUUFVULU5BTUUgPCAldCAlcwogLy8KIC8vIENIRUNLLU9VVFBVVC1OQU1FOiAieDg2XzY0LWFwcGxlLWRhcndpbjEwIiAtICJkYXJ3aW46OkxpbmsiLCBpbnB1dHM6IFt7ey4qfX1dLCBvdXRwdXQ6ICJmb28iCkBAIC0zMCw1ICszMCw1IEBACiAvLwogLy8gUlVOOiB0b3VjaCAldC5vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtY2NjLXByaW50LWJpbmRpbmdzIFwKLS8vIFJVTjogICAtdmVyaWZ5IC1vIGZvbyAldC5vIC1nIDI+ICV0CisvLyBSVU46ICAgLS12ZXJpZnktZGVidWctaW5mbyAtbyBmb28gJXQubyAtZyAyPiAldAogLy8gUlVOOiBub3QgZ3JlcCAiVmVyaWZ5IiAldApkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvZGVidWctb3B0aW9ucy5jIGIvdGVzdC9Ecml2ZXIvZGVidWctb3B0aW9ucy5jCmluZGV4IDFmODkwYjIuLjQ4ZjY4NmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2RlYnVnLW9wdGlvbnMuYworKysgYi90ZXN0L0RyaXZlci9kZWJ1Zy1vcHRpb25zLmMKQEAgLTMzLDggKzMzLDEyIEBACiAvLyBSVU46ICVjbGFuZyAtIyMjIC1jIC1nIC1nMCAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9R19OTyAlcwogLy8gUlVOOiAlY2xhbmcgLSMjIyAtYyAtZ2dkYjAgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUdfTk8gJXMKIC8vCisvLyBSVU46ICVjbGFuZyAtIyMjIC1jIC1nbWx0ICVzIDI+JjEgXAorLy8gUlVOOiAgICAgICAgICAgICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUdMVE9fT05MWSAlcwogLy8gUlVOOiAlY2xhbmcgLSMjIyAtYyAtZ2xpbmUtdGFibGVzLW9ubHkgJXMgMj4mMSBcCiAvLyBSVU46ICAgICAgICAgICAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9R0xUT19PTkxZICVzCisvLyBSVU46ICVjbGFuZyAtIyMjIC1jIC1nbGluZS10YWJsZXMtb25seSAlcyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1kYXJ3aW4gMj4mMSBcCisvLyBSVU46ICAgICAgICAgICAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9R0xUT19PTkxZX0RBUldJTiAlcwogLy8gUlVOOiAlY2xhbmcgLSMjIyAtYyAtZ2xpbmUtdGFibGVzLW9ubHkgLWcgJXMgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IDI+JjEgXAogLy8gUlVOOiAgICAgICAgICAgICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUdfT05MWSAlcwogLy8gUlVOOiAlY2xhbmcgLSMjIyAtYyAtZ2xpbmUtdGFibGVzLW9ubHkgLWcgJXMgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luIDI+JjEgXApAQCAtNDMsMTggKzQ3LDI2IEBACiAvLyBSVU46ICAgICAgICAgICAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9R0xUT19OTyAlcwogLy8KIC8vIFJVTjogJWNsYW5nIC0jIyMgLWMgLWdyZWNvcmQtZ2NjLXN3aXRjaGVzIC1nbm8tcmVjb3JkLWdjYy1zd2l0Y2hlcyBcCi0vLyBSVU46ICAgICAgICAtZ3N0cmljdC1kd2FyZiAtZ25vLXN0cmljdC1kd2FyZiAtZmRlYnVnLXR5cGVzLXNlY3Rpb24gXAotLy8gUlVOOiAgICAgICAgLWZuby1kZWJ1Zy10eXBlcy1zZWN0aW9uICVzIDI+JjEgICAgICAgICAgICAgICAgICAgICAgIFwKKy8vIFJVTjogICAgICAgIC1nc3RyaWN0LWR3YXJmIC1nbm8tc3RyaWN0LWR3YXJmICVzIDI+JjEgXAogLy8gUlVOOiAgICAgICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1HSUdOT1JFICVzCiAvLwogLy8gUlVOOiAlY2xhbmcgLSMjIyAtYyAtZ2dudS1wdWJuYW1lcyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9R09QVCAlcwogLy8KKy8vIFJVTjogJWNsYW5nIC0jIyMgLWMgLWdkd2FyZi1hcmFuZ2VzICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1HQVJBTkdFICVzCisvLworLy8gUlVOOiAlY2xhbmcgLSMjIyAtZmRlYnVnLXR5cGVzLXNlY3Rpb24gJXMgMj4mMSBcCisvLyBSVU46ICAgICAgICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUZEVFMgJXMKKy8vCisvLyBSVU46ICVjbGFuZyAtIyMjIC1mZGVidWctdHlwZXMtc2VjdGlvbiAtZm5vLWRlYnVnLXR5cGVzLXNlY3Rpb24gJXMgMj4mMSBcCisvLyBSVU46ICAgICAgICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU5PRkRUUyAlcworLy8KKy8vCiAvLyBHOiAiLWNjMSIKIC8vIEc6ICItZyIKIC8vCiAvLyBHX0RBUldJTjogIi1jYzEiCiAvLyBHX0RBUldJTjogIi1nZHdhcmYtMiIKLS8vIAorLy8KIC8vIEdfRDI6ICItY2MxIgogLy8gR19EMjogIi1nZHdhcmYtMiIKIC8vCkBAIC02Niw2ICs3OCwxMiBAQAogLy8gR0xUT19PTkxZOiAiLWdsaW5lLXRhYmxlcy1vbmx5IgogLy8gR0xUT19PTkxZLU5PVDogIi1nIgogLy8KKy8vIEdMVE9fT05MWV9EQVJXSU46ICItY2MxIgorLy8gR0xUT19PTkxZX0RBUldJTi1OT1Q6ICItZyIKKy8vIEdMVE9fT05MWV9EQVJXSU46ICItZ2xpbmUtdGFibGVzLW9ubHkiCisvLyBHTFRPX09OTFlfREFSV0lOOiAiLWdkd2FyZi0yIgorLy8gR0xUT19PTkxZX0RBUldJTi1OT1Q6ICItZyIKKy8vCiAvLyBHX09OTFk6ICItY2MxIgogLy8gR19PTkxZLU5PVDogIi1nbGluZS10YWJsZXMtb25seSIKIC8vIEdfT05MWTogIi1nIgpAQCAtODIsMyArMTAwLDkgQEAKIC8vIEdJR05PUkUtTk9UOiAiYXJndW1lbnQgdW51c2VkIGR1cmluZyBjb21waWxhdGlvbiIKIC8vCiAvLyBHT1BUOiAtZ2VuZXJhdGUtZ251LWR3YXJmLXB1Yi1zZWN0aW9ucworLy8KKy8vIEdBUkFOR0U6IC1nZW5lcmF0ZS1hcmFuZ2Utc2VjdGlvbgorLy8KKy8vIEZEVFM6ICItYmFja2VuZC1vcHRpb24iICItZ2VuZXJhdGUtdHlwZS11bml0cyIKKy8vCisvLyBOT0ZEVFMtTk9UOiAiLWJhY2tlbmQtb3B0aW9uIiAiLWdlbmVyYXRlLXR5cGUtdW5pdHMiCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9mYXN0LW1hdGguYyBiL3Rlc3QvRHJpdmVyL2Zhc3QtbWF0aC5jCmluZGV4IGViYTI1YzguLjY5MGQ3YTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2Zhc3QtbWF0aC5jCisrKyBiL3Rlc3QvRHJpdmVyL2Zhc3QtbWF0aC5jCkBAIC05LDYgKzksOSBAQAogLy8KIC8vIFJVTjogJWNsYW5nIC0jIyMgLWZuby1ob25vci1pbmZpbml0aWVzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLU5PLUlORlMgJXMKKy8vIGluZmluaXRlcyBbc2ljXSBpcyBhIHN1cHBvcnRlZCBhbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiBpbmZpbml0aWVzLgorLy8gUlVOOiAlY2xhbmcgLSMjIyAtZm5vLWhvbm9yLWluZmluaXRlcyAtYyAlcyAyPiYxIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1OTy1JTkZTICVzCiAvLyBDSEVDSy1OTy1JTkZTOiAiLWNjMSIKIC8vIENIRUNLLU5PLUlORlM6ICItbWVuYWJsZS1uby1pbmZzIgogLy8KZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL2ZyZWVic2QtbWlwcy1hcy5jIGIvdGVzdC9Ecml2ZXIvZnJlZWJzZC1taXBzLWFzLmMKaW5kZXggNTA4ZGViYS4uMTJiOTg3NiAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvZnJlZWJzZC1taXBzLWFzLmMKKysrIGIvdGVzdC9Ecml2ZXIvZnJlZWJzZC1taXBzLWFzLmMKQEAgLTMsNjcgKzMsNjcgQEAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwcy11bmtub3duLWZyZWVic2QgLSMjIyBcCiAvLyBSVU46ICAgLW5vLWludGVncmF0ZWQtYXMgLWMgJXMgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTMzItRUItQVMgJXMKLS8vIE1JUFMzMi1FQi1BUzogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMiIgIi1tYWJpIiAiMzIiICItRUIiCisvLyBNSVBTMzItRUItQVM6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzJyMiIgIi1tYWJpIiAiMzIiICItRUIiCiAvLyBNSVBTMzItRUItQVMtTk9UOiAiLUtQSUMiCiAvLwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzLXVua25vd24tZnJlZWJzZCAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtZlBJQyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMzMi1FQi1QSUMgJXMKLS8vIE1JUFMzMi1FQi1QSUM6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzIiICItbWFiaSIgIjMyIiAiLUVCIgorLy8gTUlQUzMyLUVCLVBJQzogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMnIyIiAiLW1hYmkiICIzMiIgIi1FQiIKIC8vIE1JUFMzMi1FQi1QSUM6ICItS1BJQyIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHMtdW5rbm93bi1mcmVlYnNkIC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1mcGljIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUzMyLUVCLVBJQy1TTUFMTCAlcwotLy8gTUlQUzMyLUVCLVBJQy1TTUFMTDogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMiIgIi1tYWJpIiAiMzIiICItRUIiCisvLyBNSVBTMzItRUItUElDLVNNQUxMOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMycjIiICItbWFiaSIgIjMyIiAiLUVCIgogLy8gTUlQUzMyLUVCLVBJQy1TTUFMTDogIi1LUElDIgogLy8KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwcy11bmtub3duLWZyZWVic2QgLSMjIyBcCiAvLyBSVU46ICAgLW5vLWludGVncmF0ZWQtYXMgLWZQSUUgLWMgJXMgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTMzItRUItUElFICVzCi0vLyBNSVBTMzItRUItUElFOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMyIiAiLW1hYmkiICIzMiIgIi1FQiIKKy8vIE1JUFMzMi1FQi1QSUU6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzJyMiIgIi1tYWJpIiAiMzIiICItRUIiCiAvLyBNSVBTMzItRUItUElFOiAiLUtQSUMiCiAvLwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzLXVua25vd24tZnJlZWJzZCAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtZnBpZSAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMzMi1FQi1QSUUtU01BTEwgJXMKLS8vIE1JUFMzMi1FQi1QSUUtU01BTEw6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzIiICItbWFiaSIgIjMyIiAiLUVCIgorLy8gTUlQUzMyLUVCLVBJRS1TTUFMTDogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMnIyIiAiLW1hYmkiICIzMiIgIi1FQiIKIC8vIE1JUFMzMi1FQi1QSUUtU01BTEw6ICItS1BJQyIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHNlbC11bmtub3duLWZyZWVic2QgLSMjIyBcCiAvLyBSVU46ICAgLW5vLWludGVncmF0ZWQtYXMgLWMgJXMgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTMzItREVGLUVMLUFTICVzCi0vLyBNSVBTMzItREVGLUVMLUFTOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMyIiAiLW1hYmkiICIzMiIgIi1FTCIKKy8vIE1JUFMzMi1ERUYtRUwtQVM6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzJyMiIgIi1tYWJpIiAiMzIiICItRUwiCiAvLwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzNjQtdW5rbm93bi1mcmVlYnNkIC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUzY0LUVCLUFTICVzCi0vLyBNSVBTNjQtRUItQVM6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzNjQiICItbWFiaSIgIjY0IiAiLUVCIgorLy8gTUlQUzY0LUVCLUFTOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczY0cjIiICItbWFiaSIgIjY0IiAiLUVCIgogLy8KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwczY0ZWwtdW5rbm93bi1mcmVlYnNkIC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUzY0LURFRi1FTC1BUyAlcwotLy8gTUlQUzY0LURFRi1FTC1BUzogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHM2NCIgIi1tYWJpIiAiNjQiICItRUwiCisvLyBNSVBTNjQtREVGLUVMLUFTOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczY0cjIiICItbWFiaSIgIjY0IiAiLUVMIgogLy8KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwcy11bmtub3duLWZyZWVic2QgLW1hYmk9ZWFiaSAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMtRUFCSSAlcwotLy8gTUlQUy1FQUJJOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMyIiAiLW1hYmkiICJlYWJpIiAiLUVCIgorLy8gTUlQUy1FQUJJOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMycjIiICItbWFiaSIgImVhYmkiICItRUIiCiAvLwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzNjQtdW5rbm93bi1mcmVlYnNkIC1tYWJpPW4zMiAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMtTjMyICVzCi0vLyBNSVBTLU4zMjogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHM2NCIgIi1tYWJpIiAibjMyIiAiLUVCIgorLy8gTUlQUy1OMzI6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzNjRyMiIgIi1tYWJpIiAibjMyIiAiLUVCIgogLy8KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwc2VsLXVua25vd24tZnJlZWJzZCAtbWFiaT0zMiAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMzMi1FTC1BUyAlcwotLy8gTUlQUzMyLUVMLUFTOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMyIiAiLW1hYmkiICIzMiIgIi1FTCIKKy8vIE1JUFMzMi1FTC1BUzogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMnIyIiAiLW1hYmkiICIzMiIgIi1FTCIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHM2NGVsLXVua25vd24tZnJlZWJzZCAtbWFiaT02NCAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFM2NC1FTC1BUyAlcwotLy8gTUlQUzY0LUVMLUFTOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczY0IiAiLW1hYmkiICI2NCIgIi1FTCIKKy8vIE1JUFM2NC1FTC1BUzogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHM2NHIyIiAiLW1hYmkiICI2NCIgIi1FTCIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHMtbGludXgtZnJlZWJzZCAtbWFyY2g9bWlwczMycjIgLSMjIyBcCiAvLyBSVU46ICAgLW5vLWludGVncmF0ZWQtYXMgLWMgJXMgMj4mMSBcCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9mcmVlYnNkLmMgYi90ZXN0L0RyaXZlci9mcmVlYnNkLmMKaW5kZXggZDFkOWVhOC4uNGI0NWQwNSAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvZnJlZWJzZC5jCisrKyBiL3Rlc3QvRHJpdmVyL2ZyZWVic2QuYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiBwcGMzMi1yZWdpc3RlcmVkLXRhcmdldCxwcGM2NC1yZWdpc3RlcmVkLXRhcmdldCxtaXBzLXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBSRVFVSVJFUzogcG93ZXJwYy1yZWdpc3RlcmVkLXRhcmdldCxtaXBzLXJlZ2lzdGVyZWQtdGFyZ2V0CiAvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzIFwKIC8vIFJVTjogICAtdGFyZ2V0IHBvd2VycGMtcGMtZnJlZWJzZDggJXMgICAgXAogLy8gUlVOOiAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfZnJlZWJzZF90cmVlIC0jIyMgMj4mMSBcCkBAIC01OSwxMyArNTksMTMgQEAKIC8vIENIRUNLLU1JUFNFTDogInt7W14iIF0qfX1sZHt7W14iIF0qfX0iCiAvLyBDSEVDSy1NSVBTRUw6ICItZHluYW1pYy1saW5rZXIiICJ7ey4qfX0vbGliZXhlYy9sZC1lbGYuc28uMSIKIC8vIENIRUNLLU1JUFNFTC1OT1Q6ICItLWhhc2gtc3R5bGU9e3tnbnV8Ym90aH19IgotLy8gUlVOOiAlY2xhbmcgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAlY2xhbmcgJXMgLSMjIyAyPiYxIFwKIC8vIFJVTjogICAgIC10YXJnZXQgbWlwczY0LXVua25vd24tZnJlZWJzZDEwLjAgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLU1JUFM2NCAlcwogLy8gQ0hFQ0stTUlQUzY0OiAie3tbXiIgXSp9fWxke3tbXiIgXSp9fSIKIC8vIENIRUNLLU1JUFM2NDogIi1keW5hbWljLWxpbmtlciIgInt7Lip9fS9saWJleGVjL2xkLWVsZi5zby4xIgogLy8gQ0hFQ0stTUlQUzY0LU5PVDogIi0taGFzaC1zdHlsZT17e2dudXxib3RofX0iCi0vLyBSVU46ICVjbGFuZyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICVjbGFuZyAlcyAtIyMjIDI+JjEgXAogLy8gUlVOOiAgICAgLXRhcmdldCBtaXBzNjRlbC11bmtub3duLWZyZWVic2QxMC4wIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1NSVBTNjRFTCAlcwogLy8gQ0hFQ0stTUlQUzY0RUw6ICJ7e1teIiBdKn19bGR7e1teIiBdKn19IgpAQCAtOTcsMTcgKzk3LDM1IEBACiAvLyBDSEVDSy1OT1JNQUw6IGNydDEubwogLy8gQ0hFQ0stTk9STUFMOiBjcnRiZWdpbi5vCiAKLS8vIFJVTjogJWNsYW5nICVzIC0jIyMgLW8gJXQubyAtdGFyZ2V0IGFybS11bmtub3duLWZyZWVic2QxMC4wIDI+JjEgXAorLy8gUlVOOiAlY2xhbmcgJXMgLSMjIyAtdGFyZ2V0IGFybS11bmtub3duLWZyZWVic2QxMC4wIC1uby1pbnRlZ3JhdGVkLWFzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFSTSAlcwogLy8gQ0hFQ0stQVJNOiBjbGFuZ3t7Lip9fSIgIi1jYzEie3suKn19IiAiLWZzamxqLWV4Y2VwdGlvbnMiCiAvLyBDSEVDSy1BUk06IGFze3suKn19IiAiLW1mcHU9c29mdHZmcCJ7ey4qfX0iLW1hdHBjcyIKKy8vIENIRUNLLUFSTS1FQUJJLU5PVDogYXN7ey4qfX0iICItbWZwdT12ZnAiCiAKLS8vIFJVTjogJWNsYW5nICVzIC0jIyMgLW8gJXQubyAtdGFyZ2V0IGFybS1nbnVlYWJpLWZyZWVic2QxMC4wIDI+JjEgXAorLy8gUlVOOiAlY2xhbmcgJXMgLSMjIyAtdGFyZ2V0IGFybS1nbnVlYWJpLWZyZWVic2QxMC4wIC1uby1pbnRlZ3JhdGVkLWFzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFSTS1FQUJJICVzCiAvLyBDSEVDSy1BUk0tRUFCSS1OT1Q6IGNsYW5ne3suKn19IiAiLWNjMSJ7ey4qfX0iICItZnNqbGotZXhjZXB0aW9ucyIKIC8vIENIRUNLLUFSTS1FQUJJOiBhc3t7Lip9fSIgIi1tZnB1PXNvZnR2ZnAiICItbWVhYmk9NSIKKy8vIENIRUNLLUFSTS1FQUJJLU5PVDogYXN7ey4qfX0iICItbWZwdT12ZnAiCiAvLyBDSEVDSy1BUk0tRUFCSS1OT1Q6IGFze3suKn19IiAiLW1hdHBjcyIKIAotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtcGMtZnJlZWJzZDggJXMgLSMjIyAtZmx0byAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAlY2xhbmcgJXMgLSMjIyAtdGFyZ2V0IGFybS1nbnVlYWJpaGYtZnJlZWJzZDEwLjAgLW5vLWludGVncmF0ZWQtYXMgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQVJNLUVBQklIRiAlcworLy8gQ0hFQ0stQVJNLUVBQklIRi1OT1Q6IGNsYW5ne3suKn19IiAiLWNjMSJ7ey4qfX0iICItZnNqbGotZXhjZXB0aW9ucyIKKy8vIENIRUNLLUFSTS1FQUJJSEY6IGFze3suKn19IiAiLW1mcHU9dmZwIiAiLW1lYWJpPTUiCisvLyBDSEVDSy1BUk0tRUFCSUhGLU5PVDogYXN7ey4qfX0iICItbWZwdT1zb2Z0dmZwIgorLy8gQ0hFQ0stQVJNLUVBQklIRi1OT1Q6IGFze3suKn19IiAiLW1hdHBjcyIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtcGMtZnJlZWJzZDggJXMgLSMjIyAtZmx0byAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1MVE8gJXMKIC8vIENIRUNLLUxUTzogbGR7ey4qfX0iICItcGx1Z2lue3suKn19TExWTWdvbGQuc28KKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBzcGFyYy11bmtub3duLWZyZWVic2Q4ICVzIC0jIyMgLWZwaWMgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stU1BBUkMtUElFICVzCisvLyBDSEVDSy1TUEFSQy1QSUU6IGFze3suKn19IiAiLUtQSUMKKworLy8gUlVOOiAlY2xhbmcgLW1jcHU9dWx0cmFzcGFyYyAtdGFyZ2V0IHNwYXJjNjQtdW5rbm93bi1mcmVlYnNkOCAlcyAtIyMjIDI+JjEgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLVNQQVJDLUNQVSAlcworLy8gQ0hFQ0stU1BBUkMtQ1BVOiBjYzF7ey4qfX0iICItdGFyZ2V0LWNwdSIgInVsdHJhc3BhcmMiCisvLyBDSEVDSy1TUEFSQy1DUFU6IGFze3suKn19IiAiLUF2OWEKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL2ZzYW5pdGl6ZS5jIGIvdGVzdC9Ecml2ZXIvZnNhbml0aXplLmMKaW5kZXggMmQwNzkyMy4uOWM4NDA4NiAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvZnNhbml0aXplLmMKKysrIGIvdGVzdC9Ecml2ZXIvZnNhbml0aXplLmMKQEAgLTEsNCArMSwzIEBACi0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZjYXRjaC11bmRlZmluZWQtYmVoYXZpb3IgJXMgLSMjIyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLVVOREVGSU5FRC1UUkFQCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT11bmRlZmluZWQtdHJhcCAtZnNhbml0aXplLXVuZGVmaW5lZC10cmFwLW9uLWVycm9yICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1VTkRFRklORUQtVFJBUAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mc2FuaXRpemUtdW5kZWZpbmVkLXRyYXAtb24tZXJyb3IgLWZzYW5pdGl6ZT11bmRlZmluZWQtdHJhcCAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stVU5ERUZJTkVELVRSQVAKIC8vIENIRUNLLVVOREVGSU5FRC1UUkFQOiAiLWZzYW5pdGl6ZT17eygoc2lnbmVkLWludGVnZXItb3ZlcmZsb3d8aW50ZWdlci1kaXZpZGUtYnktemVyb3xmbG9hdC1kaXZpZGUtYnktemVyb3xzaGlmdHx1bnJlYWNoYWJsZXxyZXR1cm58dmxhLWJvdW5kfGFsaWdubWVudHxudWxsfG9iamVjdC1zaXplfGZsb2F0LWNhc3Qtb3ZlcmZsb3d8YXJyYXktYm91bmRzfGVudW18Ym9vbCksPyl7MTR9In19CkBAIC0xMyw3ICsxMiwxMCBAQAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mc2FuaXRpemU9aW50ZWdlciAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stSU5URUdFUgogLy8gQ0hFQ0stSU5URUdFUjogIi1mc2FuaXRpemU9e3soKHNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93fHVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3d8aW50ZWdlci1kaXZpZGUtYnktemVyb3xzaGlmdCksPyl7NH0ifX0KIAotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mc2FuaXRpemU9dGhyZWFkLHVuZGVmaW5lZCAtZm5vLXRocmVhZC1zYW5pdGl6ZXIgLWZuby1zYW5pdGl6ZT1mbG9hdC1jYXN0LW92ZXJmbG93LHZwdHIsYm9vbCxlbnVtICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1QQVJUSUFMLVVOREVGSU5FRAorLy8gUlVOOiAlY2xhbmcgLWZzYW5pdGl6ZT1ib3VuZHMgLSMjIyAtZnN5bnRheC1vbmx5ICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQk9VTkRTCisvLyBDSEVDSy1CT1VORFM6ICItZnNhbml0aXplPXt7KChhcnJheS1ib3VuZHN8bG9jYWwtYm91bmRzKSw/KXsyfSJ9fQorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT10aHJlYWQsdW5kZWZpbmVkIC1mbm8tc2FuaXRpemU9dGhyZWFkIC1mbm8tc2FuaXRpemU9ZmxvYXQtY2FzdC1vdmVyZmxvdyx2cHRyLGJvb2wsZW51bSAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stUEFSVElBTC1VTkRFRklORUQKIC8vIENIRUNLLVBBUlRJQUwtVU5ERUZJTkVEOiAiLWZzYW5pdGl6ZT17eygoc2lnbmVkLWludGVnZXItb3ZlcmZsb3d8aW50ZWdlci1kaXZpZGUtYnktemVyb3xmbG9hdC1kaXZpZGUtYnktemVyb3xmdW5jdGlvbnxzaGlmdHx1bnJlYWNoYWJsZXxyZXR1cm58dmxhLWJvdW5kfGFsaWdubWVudHxudWxsfG9iamVjdC1zaXplfGFycmF5LWJvdW5kcyksPyl7MTJ9In19CiAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPWFkZHJlc3MtZnVsbCAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQVNBTi1GVUxMCkBAIC0yOCwxMiArMzAsNiBAQAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mc2FuaXRpemU9YWRkcmVzcyAtZm5vLXNhbml0aXplPXVzZS1hZnRlci1yZXR1cm4gJXMgLSMjIyAyPiYxIHwgIEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1BU0FOLU5PLUlNUExJRUQtVUFSCiAvLyBDSEVDSy1BU0FOLU5PLUlNUExJRUQtVUFSLU5PVDogdXNlLWFmdGVyLXJldHVybgogCi0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZjYXRjaC11bmRlZmluZWQtYmVoYXZpb3IgLWZuby1zYW5pdGl6ZS11bmRlZmluZWQtdHJhcC1vbi1lcnJvciAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stVU5ERUZJTkVELU5PLVRSQVAtRVJST1IKLS8vIENIRUNLLVVOREVGSU5FRC1OTy1UUkFQLUVSUk9SOiAnLWZjYXRjaC11bmRlZmluZWQtYmVoYXZpb3InIG5vdCBhbGxvd2VkIHdpdGggJy1mbm8tc2FuaXRpemUtdW5kZWZpbmVkLXRyYXAtb24tZXJyb3InCi0KLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPXZwdHIgLWZjYXRjaC11bmRlZmluZWQtYmVoYXZpb3IgJXMgLSMjIyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLVZQVFItVU5ERUYtRVJST1IKLS8vIENIRUNLLVZQVFItVU5ERUYtRVJST1I6ICctZnNhbml0aXplPXZwdHInIG5vdCBhbGxvd2VkIHdpdGggJy1mY2F0Y2gtdW5kZWZpbmVkLWJlaGF2aW9yJwotCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT11bmRlZmluZWQgLWZzYW5pdGl6ZS11bmRlZmluZWQtdHJhcC1vbi1lcnJvciAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stVU5ERUZJTkVELVRSQVAtT04tRVJST1ItVU5ERUYKIC8vIENIRUNLLVVOREVGSU5FRC1UUkFQLU9OLUVSUk9SLVVOREVGOiAnLWZzYW5pdGl6ZT11bmRlZmluZWQnIG5vdCBhbGxvd2VkIHdpdGggJy1mc2FuaXRpemUtdW5kZWZpbmVkLXRyYXAtb24tZXJyb3InCiAKQEAgLTYyLDkgKzU4LDYgQEAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPWxlYWssbWVtb3J5IC1waWUgLWZuby1ydHRpICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1TQU5MLVNBTk0KIC8vIENIRUNLLVNBTkwtU0FOTTogJy1mc2FuaXRpemU9bGVhaycgbm90IGFsbG93ZWQgd2l0aCAnLWZzYW5pdGl6ZT1tZW1vcnknCiAKLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZmFkZHJlc3Mtc2FuaXRpemVyIC1mdGhyZWFkLXNhbml0aXplciAtZm5vLXJ0dGkgJXMgLSMjIyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLUFTQU4tVFNBTgotLy8gQ0hFQ0stQVNBTi1UU0FOOiAnLWZhZGRyZXNzLXNhbml0aXplcicgbm90IGFsbG93ZWQgd2l0aCAnLWZ0aHJlYWQtc2FuaXRpemVyJwotCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT1pbml0LW9yZGVyICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1PTkxZLUVYVFJBLUFTQU4KIC8vIENIRUNLLU9OTFktRVhUUkEtQVNBTjogJy1mc2FuaXRpemU9aW5pdC1vcmRlcicgaXMgaWdub3JlZCBpbiBhYnNlbmNlIG9mICctZnNhbml0aXplPWFkZHJlc3MnCiAKQEAgLTgwLDMyICs3MywzNyBAQAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mc2FuaXRpemU9YWRkcmVzcyAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTk8tRVhUUkEtVFJBQ0stT1JJR0lOUwogLy8gQ0hFQ0stTk8tRVhUUkEtVFJBQ0stT1JJR0lOUy1OT1Q6ICItZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zIgogCi0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZS1hZGRyZXNzLXplcm8tYmFzZS1zaGFkb3cgLXBpZSAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stT05MWS1BU0FOLVpFUk8tQkFTRS1TSEFET1cKLS8vIENIRUNLLU9OTFktQVNBTi1aRVJPLUJBU0UtU0hBRE9XOiB3YXJuaW5nOiBhcmd1bWVudCB1bnVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uOiAnLWZzYW5pdGl6ZS1hZGRyZXNzLXplcm8tYmFzZS1zaGFkb3cnCi0KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPWFkZHJlc3MgLWZzYW5pdGl6ZT1hbGlnbm1lbnQgLWZzYW5pdGl6ZT12cHRyIC1mbm8tc2FuaXRpemU9dnB0ciAlcyAtIyMjIDI+JjEKIC8vIE9LCiAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPW1lbW9yeSAtcGllICVzIC0jIyMgMj4mMQogLy8gT0sKIAotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mc2FuaXRpemU9bWVtb3J5IC1mc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnMgLXBpZSAlcyAtIyMjIDI+JjEKLS8vIE9LCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT1tZW1vcnkgLWZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucyAtcGllICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1UUkFDSy1PUklHSU5TLTEKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPW1lbW9yeSAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zPTEgLXBpZSAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stVFJBQ0stT1JJR0lOUy0xCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT1tZW1vcnkgLWZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucz0yIC1mc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnMgLXBpZSAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stVFJBQ0stT1JJR0lOUy0xCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT1tZW1vcnkgLWZuby1zYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucyAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zIC1waWUgJXMgLSMjIyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLVRSQUNLLU9SSUdJTlMtMQorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mc2FuaXRpemU9bWVtb3J5IC1mc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnM9MCAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zIC1waWUgJXMgLSMjIyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLVRSQUNLLU9SSUdJTlMtMQorCisvLyBDSEVDSy1UUkFDSy1PUklHSU5TLTE6IC1mc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnM9MQorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT1tZW1vcnkgLWZuby1zYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucyAtcGllICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1OTy1UUkFDSy1PUklHSU5TCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT1tZW1vcnkgLWZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucz0wIC1waWUgJXMgLSMjIyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLU5PLVRSQUNLLU9SSUdJTlMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPW1lbW9yeSAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zIC1mbm8tc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnMgLXBpZSAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTk8tVFJBQ0stT1JJR0lOUworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mc2FuaXRpemU9bWVtb3J5IC1mc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnMgLWZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucz0wIC1waWUgJXMgLSMjIyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLU5PLVRSQUNLLU9SSUdJTlMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPW1lbW9yeSAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zPTIgLWZuby1zYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucyAtcGllICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1OTy1UUkFDSy1PUklHSU5TCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT1tZW1vcnkgLWZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucz0yIC1mc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnM9MCAtcGllICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1OTy1UUkFDSy1PUklHSU5TCisvLyBDSEVDSy1OTy1UUkFDSy1PUklHSU5TLU5PVDogc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnMKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mc2FuaXRpemU9bWVtb3J5IC1mc2FuaXRpemUtbWVtb3J5LXRyYWNrLW9yaWdpbnM9MiAtcGllICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1UUkFDSy1PUklHSU5TLTIKKy8vIENIRUNLLVRSQUNLLU9SSUdJTlMtMjogLWZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucz0yCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPW1lbW9yeSAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zPTMgLXBpZSAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stVFJBQ0stT1JJR0lOUy0zCisvLyBDSEVDSy1UUkFDSy1PUklHSU5TLTM6IGVycm9yOiBpbnZhbGlkIHZhbHVlICczJyBpbiAnLWZzYW5pdGl6ZS1tZW1vcnktdHJhY2stb3JpZ2lucz0zJwogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT12cHRyIC1mbm8tc2FuaXRpemU9dnB0ciAtZnNhbml0aXplPXVuZGVmaW5lZCxhZGRyZXNzICVzIC0jIyMgMj4mMQogLy8gT0sKIAotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mc2FuaXRpemU9YWRkcmVzcyAtZnNhbml0aXplLWFkZHJlc3MtemVyby1iYXNlLXNoYWRvdyAtcGllICVzIC0jIyMgMj4mMQotLy8gT0sKLQotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mY2F0Y2gtdW5kZWZpbmVkLWJlaGF2aW9yIC1mdGhyZWFkLXNhbml0aXplciAtZm5vLXRocmVhZC1zYW5pdGl6ZXIgLWZhZGRyZXNzLXNhbml0aXplciAtZm5vLWFkZHJlc3Mtc2FuaXRpemVyIC1mYm91bmRzLWNoZWNraW5nIC0jIyMgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1ERVBSRUNBVEVECi0vLyBDSEVDSy1ERVBSRUNBVEVEOiBhcmd1bWVudCAnLWZib3VuZHMtY2hlY2tpbmcnIGlzIGRlcHJlY2F0ZWQsIHVzZSAnLWZzYW5pdGl6ZT1sb2NhbC1ib3VuZHMnIGluc3RlYWQKLS8vIENIRUNLLURFUFJFQ0FURUQ6IGFyZ3VtZW50ICctZm5vLWFkZHJlc3Mtc2FuaXRpemVyJyBpcyBkZXByZWNhdGVkLCB1c2UgJy1mbm8tc2FuaXRpemU9YWRkcmVzcycgaW5zdGVhZAotLy8gQ0hFQ0stREVQUkVDQVRFRDogYXJndW1lbnQgJy1mYWRkcmVzcy1zYW5pdGl6ZXInIGlzIGRlcHJlY2F0ZWQsIHVzZSAnLWZzYW5pdGl6ZT1hZGRyZXNzJyBpbnN0ZWFkCi0vLyBDSEVDSy1ERVBSRUNBVEVEOiBhcmd1bWVudCAnLWZuby10aHJlYWQtc2FuaXRpemVyJyBpcyBkZXByZWNhdGVkLCB1c2UgJy1mbm8tc2FuaXRpemU9dGhyZWFkJyBpbnN0ZWFkCi0vLyBDSEVDSy1ERVBSRUNBVEVEOiBhcmd1bWVudCAnLWZ0aHJlYWQtc2FuaXRpemVyJyBpcyBkZXByZWNhdGVkLCB1c2UgJy1mc2FuaXRpemU9dGhyZWFkJyBpbnN0ZWFkCi0vLyBDSEVDSy1ERVBSRUNBVEVEOiBhcmd1bWVudCAnLWZjYXRjaC11bmRlZmluZWQtYmVoYXZpb3InIGlzIGRlcHJlY2F0ZWQsIHVzZSAnLWZzYW5pdGl6ZT11bmRlZmluZWQtdHJhcCAtZnNhbml0aXplLXVuZGVmaW5lZC10cmFwLW9uLWVycm9yJyBpbnN0ZWFkCi0KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPXRocmVhZCAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stVFNBTi1OTy1QSUUKIC8vIENIRUNLLVRTQU4tTk8tUElFOiAiLW1yZWxvY2F0aW9uLW1vZGVsIiAicGljIiAiLXBpYy1sZXZlbCIgIjIiICItcGllLWxldmVsIiAiMiIKIC8vIENIRUNLLVRTQU4tTk8tUElFOiAiLXBpZSIKQEAgLTExNCwyNiArMTEyLDEyIEBACiAvLyBDSEVDSy1NU0FOLU5PLVBJRTogIi1tcmVsb2NhdGlvbi1tb2RlbCIgInBpYyIgIi1waWMtbGV2ZWwiICIyIiAiLXBpZS1sZXZlbCIgIjIiCiAvLyBDSEVDSy1NU0FOLU5PLVBJRTogIi1waWUiCiAKLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPWFkZHJlc3MgLWZzYW5pdGl6ZS1hZGRyZXNzLXplcm8tYmFzZS1zaGFkb3cgJXMgLSMjIyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLUFTQU4tWkVSTy1CQVNFLVNIQURPVy1OTy1QSUUKLS8vIENIRUNLLUFTQU4tWkVSTy1CQVNFLVNIQURPVy1OTy1QSUU6ICItbXJlbG9jYXRpb24tbW9kZWwiICJwaWMiICItcGljLWxldmVsIiAiMiIgIi1waWUtbGV2ZWwiICIyIgotLy8gQ0hFQ0stQVNBTi1aRVJPLUJBU0UtU0hBRE9XLU5PLVBJRTogIi1waWUiCi0KLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPWFkZHJlc3MgLWZzYW5pdGl6ZS1hZGRyZXNzLXplcm8tYmFzZS1zaGFkb3cgLWZuby1zYW5pdGl6ZS1hZGRyZXNzLXplcm8tYmFzZS1zaGFkb3cgJXMgLSMjIyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLUFTQU4tWkVSTy1CQVNFLVNIQURPVy1DQU5DRUwKLS8vIENIRUNLLUFTQU4tWkVSTy1CQVNFLVNIQURPVy1DQU5DRUwtTk9UOiAiLW1yZWxvY2F0aW9uLW1vZGVsIiAicGljIiAiLXBpYy1sZXZlbCIgIjIiICItcGllLWxldmVsIiAiMiIKLS8vIENIRUNLLUFTQU4tWkVSTy1CQVNFLVNIQURPVy1DQU5DRUwtTk9UOiAiLXBpZSIKLQogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbGludXgtYW5kcm9pZGVhYmkgLWZzYW5pdGl6ZT1hZGRyZXNzICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1BTkRST0lELUFTQU4tTk8tUElFCiAvLyBDSEVDSy1BTkRST0lELUFTQU4tTk8tUElFOiAiLW1yZWxvY2F0aW9uLW1vZGVsIiAicGljIiAiLXBpYy1sZXZlbCIgIjIiICItcGllLWxldmVsIiAiMiIKIC8vIENIRUNLLUFORFJPSUQtQVNBTi1OTy1QSUU6ICItcGllIgogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1saW51eC1hbmRyb2lkZWFiaSAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQU5EUk9JRC1OTy1BU0FOCi0vLyBDSEVDSy1BTkRST0lELU5PLUFTQU46ICItbXJlbG9jYXRpb24tbW9kZWwiICJzdGF0aWMiCi0KLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWFuZHJvaWRlYWJpIC1mc2FuaXRpemU9YWRkcmVzcyAtZnNhbml0aXplLWFkZHJlc3MtemVyby1iYXNlLXNoYWRvdyAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQU5EUk9JRC1BU0FOLVpFUk8tQkFTRQotLy8gQ0hFQ0stQU5EUk9JRC1BU0FOLVpFUk8tQkFTRS1OT1Q6IGFyZ3VtZW50IHVudXNlZCBkdXJpbmcgY29tcGlsYXRpb24KLQotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbGludXgtYW5kcm9pZGVhYmkgLWZzYW5pdGl6ZT1hZGRyZXNzIC1mbm8tc2FuaXRpemUtYWRkcmVzcy16ZXJvLWJhc2Utc2hhZG93ICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1BTkRST0lELUFTQU4tTk8tWkVSTy1CQVNFCi0vLyBDSEVDSy1BTkRST0lELUFTQU4tTk8tWkVSTy1CQVNFOiAnLWZuby1zYW5pdGl6ZS1hZGRyZXNzLXplcm8tYmFzZS1zaGFkb3cnIG5vdCBhbGxvd2VkIHdpdGggJy1mc2FuaXRpemU9YWRkcmVzcycKKy8vIENIRUNLLUFORFJPSUQtTk8tQVNBTjogIi1tcmVsb2NhdGlvbi1tb2RlbCIgInBpYyIKIAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251ICVzIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1SRUNPVkVSCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgJXMgLWZzYW5pdGl6ZS1yZWNvdmVyIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1SRUNPVkVSCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9mdW5jdGlvbi1zZWN0aW9ucy5jIGIvdGVzdC9Ecml2ZXIvZnVuY3Rpb24tc2VjdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTZkMzAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Ecml2ZXIvZnVuY3Rpb24tc2VjdGlvbnMuYwpAQCAtMCwwICsxLDYyIEBACisvLyBUZXN0IGhhbmRsaW5nIG9mIC1mKG5vLSlmdW5jdGlvbi1zZWN0aW9ucyBhbmQgLWYobm8tKWRhdGEtc2VjdGlvbnMKKy8vCisvLyBDSEVDSy1GUzogLWZmdW5jdGlvbi1zZWN0aW9ucworLy8gQ0hFQ0stTk9GUy1OT1Q6IC1mZnVuY3Rpb24tc2VjdGlvbnMKKy8vIENIRUNLLURTOiAtZmRhdGEtc2VjdGlvbnMKKy8vIENIRUNLLU5PRFMtTk9UOiAtZmRhdGEtc2VjdGlvbnMKKworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1mc3ludGF4LW9ubHkgMj4mMSAgICAgICBcCisvLyBSVU46ICAgICAtdGFyZ2V0IGkzODYtdW5rbm93bi1saW51eCBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTk9GUyAtLWNoZWNrLXByZWZpeD1DSEVDSy1OT0RTICVzCisKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtZnN5bnRheC1vbmx5IDI+JjEgICAgICAgXAorLy8gUlVOOiAgICAgLXRhcmdldCBpMzg2LXVua25vd24tbGludXggXAorLy8gUlVOOiAgICAgLWZmdW5jdGlvbi1zZWN0aW9ucyBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRlMgJXMKKworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1mc3ludGF4LW9ubHkgMj4mMSAgICAgICBcCisvLyBSVU46ICAgICAtdGFyZ2V0IGkzODYtdW5rbm93bi1saW51eCBcCisvLyBSVU46ICAgICAtZm5vLWZ1bmN0aW9uLXNlY3Rpb25zIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1OT0ZTICVzCisKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtZnN5bnRheC1vbmx5IDI+JjEgICAgICAgXAorLy8gUlVOOiAgICAgLXRhcmdldCBpMzg2LXVua25vd24tbGludXggXAorLy8gUlVOOiAgICAgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZm5vLWZ1bmN0aW9uLXNlY3Rpb25zIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1OT0ZTICVzCisKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtZnN5bnRheC1vbmx5IDI+JjEgICAgICAgXAorLy8gUlVOOiAgICAgLXRhcmdldCBpMzg2LXVua25vd24tbGludXggXAorLy8gUlVOOiAgICAgLWZuby1mdW5jdGlvbi1zZWN0aW9ucyAtZmZ1bmN0aW9uLXNlY3Rpb25zIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1GUyAlcworCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLWZzeW50YXgtb25seSAyPiYxICAgICAgIFwKKy8vIFJVTjogICAgIC10YXJnZXQgaTM4Ni11bmtub3duLWxpbnV4IFwKKy8vIFJVTjogICAgIC1mZnVuY3Rpb24tc2VjdGlvbnMgLWZuby1mdW5jdGlvbi1zZWN0aW9ucyAtZmZ1bmN0aW9uLXNlY3Rpb25zIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1GUyAlcworCisKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtZnN5bnRheC1vbmx5IDI+JjEgICAgICAgXAorLy8gUlVOOiAgICAgLXRhcmdldCBpMzg2LXVua25vd24tbGludXggXAorLy8gUlVOOiAgICAgLWZkYXRhLXNlY3Rpb25zIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1EUyAlcworCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLWZzeW50YXgtb25seSAyPiYxICAgICAgIFwKKy8vIFJVTjogICAgIC10YXJnZXQgaTM4Ni11bmtub3duLWxpbnV4IFwKKy8vIFJVTjogICAgIC1mbm8tZGF0YS1zZWN0aW9ucyBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTk9EUyAlcworCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLWZzeW50YXgtb25seSAyPiYxICAgICAgIFwKKy8vIFJVTjogICAgIC10YXJnZXQgaTM4Ni11bmtub3duLWxpbnV4IFwKKy8vIFJVTjogICAgIC1mZGF0YS1zZWN0aW9ucyAtZm5vLWRhdGEtc2VjdGlvbnMgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLU5PRFMgJXMKKworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1mc3ludGF4LW9ubHkgMj4mMSAgICAgICBcCisvLyBSVU46ICAgICAtdGFyZ2V0IGkzODYtdW5rbm93bi1saW51eCBcCisvLyBSVU46ICAgICAtZm5vLWRhdGEtc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1EUyAlcworCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLWZzeW50YXgtb25seSAyPiYxICAgICAgIFwKKy8vIFJVTjogICAgIC10YXJnZXQgaTM4Ni11bmtub3duLWxpbnV4IFwKKy8vIFJVTjogICAgIC1mZGF0YS1zZWN0aW9ucyAtZm5vLWRhdGEtc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1EUyAlcworCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9nY2NfZm9yd2FyZC5jIGIvdGVzdC9Ecml2ZXIvZ2NjX2ZvcndhcmQuYwppbmRleCBiOTkzM2Q3Li4zYmM0MTMxIDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9nY2NfZm9yd2FyZC5jCisrKyBiL3Rlc3QvRHJpdmVyL2djY19mb3J3YXJkLmMKQEAgLTEzLDE5ICsxMyw4IEBACiAvLyBDSEVDSzogIi1XYWxsIiAiLVdkb2N1bWVudGF0aW9uIgogLy8gQ0hFQ0s6ICItbyIgInt7W14iXSt9fS5zIgogLy8KLS8vIGdjYy1hcwotLy8gQ0hFQ0s6IGdjY3t7W14iXSp9fSIKLS8vIENIRUNLLU5PVDogIi1tbGlua2VyLXZlcnNpb249MTAiCi0vLyBDSEVDSy1OT1Q6ICItWGNsYW5nIgotLy8gQ0hFQ0stTk9UOiAiZm9vLWJhciIKLS8vIENIRUNLLU5PVDogIi1XYWxsIgotLy8gQ0hFQ0stTk9UOiAiLVdkb2N1bWVudGF0aW9uIgotLy8gQ0hFQ0s6IC1tYXJjaAotLy8gQ0hFQ0stTk9UOiAiLW1saW5rZXItdmVyc2lvbj0xMCIKLS8vIENIRUNLLU5PVDogIi1YY2xhbmciCi0vLyBDSEVDSy1OT1Q6ICJmb28tYmFyIgotLy8gQ0hFQ0stTk9UOiAiLVdhbGwiCi0vLyBDSEVDSy1OT1Q6ICItV2RvY3VtZW50YXRpb24iCisvLyBnbnUtYXMKKy8vIENIRUNLOiBhc3t7W14iXSp9fSIKIC8vIENIRUNLOiAiLW8iICJ7e1teIl0rfX0ubyIKIC8vCiAvLyBnY2MtbGQKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL2ltcGxpY2l0LWZ1bmN0aW9uLWFzLWVycm9yLmMgYi90ZXN0L0RyaXZlci9pbXBsaWNpdC1mdW5jdGlvbi1hcy1lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDllMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0RyaXZlci9pbXBsaWNpdC1mdW5jdGlvbi1hcy1lcnJvci5jCkBAIC0wLDAgKzEsOSBAQAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luIC1taW9zLXNpbXVsYXRvci12ZXJzaW9uLW1pbj03IC1mc3ludGF4LW9ubHkgJXMgLVhjbGFuZyAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1hcHBsZS1kYXJ3aW4gLWFyY2ggYXJtNjQgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luIC1taW9zLXZlcnNpb24tbWluPTcgLWZzeW50YXgtb25seSAlcyAtWGNsYW5nIC12ZXJpZnkKKworLy8gRm9yIDY0LWJpdCBpT1MsIGF1dG9tYXRpY2FsbHkgcHJvbW90ZSAtV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uCisvLyB0byBhbiBlcnJvci4KKwordm9pZCByYWRhcl8xMDg5NDA0NCgpIHsKKyAgcmFkYXJfMTA4OTQwNDRfbm90X2RlY2xhcmVkKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW1wbGljaXQgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gJ3JhZGFyXzEwODk0MDQ0X25vdF9kZWNsYXJlZCcgaXMgaW52YWxpZCBpbiBDOTl9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvaW50ZWdyYXRlZC1hcy5jIGIvdGVzdC9Ecml2ZXIvaW50ZWdyYXRlZC1hcy5jCmluZGV4IGU3MzE3NGUuLmM2NTk3M2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL2ludGVncmF0ZWQtYXMuYworKysgYi90ZXN0L0RyaXZlci9pbnRlZ3JhdGVkLWFzLmMKQEAgLTIsMyArMiwxNCBAQAogCiAvLyBDSEVDSzogY2MxYXMKIC8vIENIRUNLOiAtbXJlbGF4LWFsbAorCisvLyBSVU46ICVjbGFuZyAtIyMjIC1maW50ZWdyYXRlZC1hcyAtYyAtc2F2ZS10ZW1wcyAlcyAyPiYxIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXggRklBUworCisvLyBGSUFTOiBjYzFhcworCisvLyBSVU46ICVjbGFuZyAtIyMjIC1mbm8taW50ZWdyYXRlZC1hcyAtUyAlcyAyPiYxIFwKKy8vIFJVTjogICAgIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXggTk9GSUFTCisKKy8vIE5PRklBUy1OT1Q6IGNjMWFzCisvLyBOT0ZJQVM6IC1jYzEKKy8vIE5PRklBUzogLW5vLWludGVncmF0ZWQtYXMKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL2ludGVncmF0ZWQtYXMucyBiL3Rlc3QvRHJpdmVyL2ludGVncmF0ZWQtYXMucwppbmRleCAwODQzY2Y5Li5lZTJjOGNmIDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9pbnRlZ3JhdGVkLWFzLnMKKysrIGIvdGVzdC9Ecml2ZXIvaW50ZWdyYXRlZC1hcy5zCkBAIC01LDI5ICs1LDI3IEBACiAvLyBSVU46ICVjbGFuZyAtIyMjIC1jIC1pbnRlZ3JhdGVkLWFzIC1XYSwtTCAlcyAyPiYxIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU9QVF9MICVzCiAvLyBPUFRfTDogbXNhdmUtdGVtcC1sYWJlbHMKIAotLy8gUlVOOiBub3QgJWNsYW5nIC1jIC1pbnRlZ3JhdGVkLWFzIC1XYSwtLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zICVzIDI+JjEgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9SU5WQUxJRCAlcwotLy8gSU5WQUxJRDogZXJyb3I6IHVuc3VwcG9ydGVkIGFyZ3VtZW50ICctLWNvbXByZXNzLWRlYnVnLXNlY3Rpb25zJyB0byBvcHRpb24gJ1dhLCcKLQogLy8gUlVOOiAlY2xhbmcgLSMjIyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWMgLWludGVncmF0ZWQtYXMgJXMgLWZzYW5pdGl6ZT1hZGRyZXNzIDI+JjEgJXMgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9U0FOSVRJWkUgJXMKIC8vIFNBTklUSVpFOiBhcmd1bWVudCB1bnVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uOiAnLWZzYW5pdGl6ZT1hZGRyZXNzJwogCiAvLyBUZXN0IHRoYXQgLUkgcGFyYW1zIGluIC1XYSwgYW5kIC1YYXNzZW1ibGVyIGFyZ3MgYXJlIHBhc3NlZCB0byBpbnRlZ3JhdGVkIGFzc2VtYmxlcgotLy8gUlVOOiAlY2xhbmcgLSMjIyAtYyAtaW50ZWdyYXRlZC1hcyAlcyAtV2EsLUksZm9vX2RpciAyPiYxICVzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVdBX0lOQ0xVREUxICVzCisvLyBSVU46ICVjbGFuZyAtIyMjIC1jIC1pbnRlZ3JhdGVkLWFzICVzIC1XYSwtSSxmb29fZGlyIDI+JjEgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9V0FfSU5DTFVERTEgJXMKIC8vIFdBX0lOQ0xVREUxOiBjYzFhcwogLy8gV0FfSU5DTFVERTE6ICItSSIgImZvb19kaXIiCiAKLS8vIFJVTjogJWNsYW5nIC0jIyMgLWMgLWludGVncmF0ZWQtYXMgJXMgLVdhLC1JZm9vX2RpciAyPiYxICVzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVdBX0lOQ0xVREUyICVzCisvLyBSVU46ICVjbGFuZyAtIyMjIC1jIC1pbnRlZ3JhdGVkLWFzICVzIC1XYSwtSWZvb19kaXIgMj4mMSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1XQV9JTkNMVURFMiAlcwogLy8gV0FfSU5DTFVERTI6IGNjMWFzCiAvLyBXQV9JTkNMVURFMjogIi1JZm9vX2RpciIKIAotLy8gUlVOOiAlY2xhbmcgLSMjIyAtYyAtaW50ZWdyYXRlZC1hcyAlcyAtV2EsLUkgLVdhLGZvb19kaXIgMj4mMSAlcyB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1XQV9JTkNMVURFMyAlcworLy8gUlVOOiAlY2xhbmcgLSMjIyAtYyAtaW50ZWdyYXRlZC1hcyAlcyAtV2EsLUkgLVdhLGZvb19kaXIgMj4mMSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1XQV9JTkNMVURFMyAlcwogLy8gV0FfSU5DTFVERTM6IGNjMWFzCiAvLyBXQV9JTkNMVURFMzogIi1JIiAiZm9vX2RpciIKIAotLy8gUlVOOiAlY2xhbmcgLSMjIyAtYyAtaW50ZWdyYXRlZC1hcyAlcyAtWGFzc2VtYmxlciAtSSAtWGFzc2VtYmxlciBmb29fZGlyIDI+JjEgJXMgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9WEFfSU5DTFVERTEgJXMKKy8vIFJVTjogJWNsYW5nIC0jIyMgLWMgLWludGVncmF0ZWQtYXMgJXMgLVhhc3NlbWJsZXIgLUkgLVhhc3NlbWJsZXIgZm9vX2RpciAyPiYxIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVhBX0lOQ0xVREUxICVzCiAvLyBYQV9JTkNMVURFMTogY2MxYXMKIC8vIFhBX0lOQ0xVREUxOiAiLUkiICJmb29fZGlyIgogCi0vLyBSVU46ICVjbGFuZyAtIyMjIC1jIC1pbnRlZ3JhdGVkLWFzICVzIC1YYXNzZW1ibGVyIC1JZm9vX2RpciAyPiYxICVzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVhBX0lOQ0xVREUyICVzCisvLyBSVU46ICVjbGFuZyAtIyMjIC1jIC1pbnRlZ3JhdGVkLWFzICVzIC1YYXNzZW1ibGVyIC1JZm9vX2RpciAyPiYxIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVhBX0lOQ0xVREUyICVzCiAvLyBYQV9JTkNMVURFMjogY2MxYXMKIC8vIFhBX0lOQ0xVREUyOiAiLUlmb29fZGlyIgorCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9rcmFpdC1jcHUuYyBiL3Rlc3QvRHJpdmVyL2tyYWl0LWNwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzI0YjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0RyaXZlci9rcmFpdC1jcHUuYwpAQCAtMCwwICsxLDMgQEAKKy8vID09PT09PT09PT09PT09PT09PSBDaGVjayBkZWZhdWx0IEFyY2hpdGVjdHVyZSBvbiBrcmFpdCBDUFUKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWdudWVhYmkgLW1jcHU9a3JhaXQgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQ1BVVjdBICVzCisvLyBDSEVDSy1DUFVWN0E6ICItY2MxInt7Lip9fSAiLXRyaXBsZSIgImFybXY3LXt7Lip9fQpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvbGlua2VyLW9wdHMuYyBiL3Rlc3QvRHJpdmVyL2xpbmtlci1vcHRzLmMKaW5kZXggNzY2OGE3NS4uM2ZjOTVlYyAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvbGlua2VyLW9wdHMuYworKysgYi90ZXN0L0RyaXZlci9saW5rZXItb3B0cy5jCkBAIC00LDMgKzQsNCBAQAogLy8gR0NDIGRyaXZlciBpcyB1c2VkIGFzIGxpbmtlciBvbiBjeWdtaW5nLiBJdCBzaG91bGQgYmUgYXdhcmUgb2YgTElCUkFSWV9QQVRILgogLy8gWEZBSUw6IHdpbjMyCiAvLyBSRVFVSVJFUzogY2xhbmctZHJpdmVyCisvLyBSRVFVSVJFUzogbmF0aXZlCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9saW51eC1hcy5jIGIvdGVzdC9Ecml2ZXIvbGludXgtYXMuYwppbmRleCBhNDQ5YjdiLi4wNWM3ZmE3IDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9saW51eC1hcy5jCisrKyBiL3Rlc3QvRHJpdmVyL2xpbnV4LWFzLmMKQEAgLTYwLDYgKzYwLDMyIEBACiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1QUEMtTk8tTUNQVSAlcwogLy8gQ0hFQ0stUFBDLU5PLU1DUFUtTk9UOiBhc3t7Lip9fSAiLW1jcHU9aW52YWxpZC1jcHUiCiAvLworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBzcGFyYzY0LWxpbnV4IC1tY3B1PWludmFsaWQtY3B1IC0jIyMgXAorLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stU1BBUkNWOSAlcworLy8gQ0hFQ0stU1BBUkNWOTogYXMKKy8vIENIRUNLLVNQQVJDVjk6IC02NAorLy8gQ0hFQ0stU1BBUkNWOTogLUF2OWEKKy8vIENIRUNLLVNQQVJDVjktTk9UOiAtS1BJQworLy8gQ0hFQ0stU1BBUkNWOTogLW8KKy8vCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHNwYXJjNjQtbGludXggLW1jcHU9aW52YWxpZC1jcHUgLSMjIyBcCisvLyBSVU46ICAgLW5vLWludGVncmF0ZWQtYXMgLWZwaWMgLWMgJXMgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1TUEFSQ1Y5UElDICVzCisvLyBDSEVDSy1TUEFSQ1Y5UElDOiBhcworLy8gQ0hFQ0stU1BBUkNWOVBJQzogLTY0CisvLyBDSEVDSy1TUEFSQ1Y5UElDOiAtQXY5YQorLy8gQ0hFQ0stU1BBUkNWOVBJQzogLUtQSUMKKy8vIENIRUNLLVNQQVJDVjlQSUM6IC1vCisvLworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBzcGFyYy1saW51eCAtbWNwdT1pbnZhbGlkLWNwdSAtIyMjIFwKKy8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVNQQVJDVjggJXMKKy8vIENIRUNLLVNQQVJDVjg6IGFzCisvLyBDSEVDSy1TUEFSQ1Y4OiAtMzIKKy8vIENIRUNLLVNQQVJDVjg6IC1BdjhwbHVzYQorLy8gQ0hFQ0stU1BBUkNWODogLW8KKy8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHMzOTB4LWxpbnV4IC0jIyMgLW5vLWludGVncmF0ZWQtYXMgLWMgJXMgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1aLURFRkFVTFQtQVJDSCAlcwogLy8gQ0hFQ0stWi1ERUZBVUxULUFSQ0g6IGFze3suKn19ICItbWFyY2g9ejEwIgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvbGludXgtaGVhZGVyLXNlYXJjaC5jcHAgYi90ZXN0L0RyaXZlci9saW51eC1oZWFkZXItc2VhcmNoLmNwcAppbmRleCA4OTU1ZWQ3Li45ZDA4ZDZmIDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9saW51eC1oZWFkZXItc2VhcmNoLmNwcAorKysgYi90ZXN0L0RyaXZlci9saW51eC1oZWFkZXItc2VhcmNoLmNwcApAQCAtMSw2ICsxLDI5IEBACiAvLyBHZW5lcmFsIHRlc3RzIHRoYXQgdGhlIGhlYWRlciBzZWFyY2ggcGF0aHMgZGV0ZWN0ZWQgYnkgdGhlIGRyaXZlciBhbmQgcGFzc2VkCiAvLyB0byBDQzEgYXJlIHNhbmUuCiAvLworLy8gVGVzdCBhIHNpbXVsYXRlZCBpbnN0YWxsYXRpb24gb2YgbGliYysrIG9uIExpbnV4LCBib3RoIHRocm91Z2ggc3lzcm9vdCBhbmQKKy8vIHRoZSBpbnN0YWxsYXRpb24gcGF0aCBvZiBDbGFuZy4KKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtZnN5bnRheC1vbmx5IDI+JjEgXAorLy8gUlVOOiAgICAgLXRhcmdldCB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUgXAorLy8gUlVOOiAgICAgLXN0ZGxpYj1saWJjKysgXAorLy8gUlVOOiAgICAgLWNjYy1pbnN0YWxsLWRpciAlUy9JbnB1dHMvYmFzaWNfbGludXhfdHJlZS91c3IvYmluIFwKKy8vIFJVTjogICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbGludXhfbGliY3h4X3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJBU0lDLUxJQkNYWC1TWVNST09UICVzCisvLyBDSEVDSy1CQVNJQy1MSUJDWFgtU1lTUk9PVDogInt7W14iXSp9fWNsYW5ne3tbXiJdKn19IiAiLWNjMSIKKy8vIENIRUNLLUJBU0lDLUxJQkNYWC1TWVNST09UOiAiLWlzeXNyb290IiAiW1tTWVNST09UOlteIl0rXV0iCisvLyBDSEVDSy1CQVNJQy1MSUJDWFgtU1lTUk9PVDogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2luY2x1ZGUvYysrL3YxIgorLy8gQ0hFQ0stQkFTSUMtTElCQ1hYLVNZU1JPT1Q6ICItaW50ZXJuYWwtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9sb2NhbC9pbmNsdWRlIgorLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1mc3ludGF4LW9ubHkgMj4mMSBcCisvLyBSVU46ICAgICAtdGFyZ2V0IHg4Nl82NC11bmtub3duLWxpbnV4LWdudSBcCisvLyBSVU46ICAgICAtc3RkbGliPWxpYmMrKyBcCisvLyBSVU46ICAgICAtY2NjLWluc3RhbGwtZGlyICVTL0lucHV0cy9iYXNpY19saW51eF9saWJjeHhfdHJlZS91c3IvYmluIFwKKy8vIFJVTjogICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbGludXhfbGliY3h4X3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJBU0lDLUxJQkNYWC1JTlNUQUxMICVzCisvLyBDSEVDSy1CQVNJQy1MSUJDWFgtSU5TVEFMTDogInt7W14iXSp9fWNsYW5ne3tbXiJdKn19IiAiLWNjMSIKKy8vIENIRUNLLUJBU0lDLUxJQkNYWC1JTlNUQUxMOiAiLWlzeXNyb290IiAiW1tTWVNST09UOlteIl0rXV0iCisvLyBDSEVDSy1CQVNJQy1MSUJDWFgtSU5TVEFMTDogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2Jpbi8uLi9pbmNsdWRlL2MrKy92MSIKKy8vIENIRUNLLUJBU0lDLUxJQkNYWC1JTlNUQUxMOiAiLWludGVybmFsLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvbG9jYWwvaW5jbHVkZSIKKy8vCiAvLyBUZXN0IGEgdmVyeSBicm9rZW4gdmVyc2lvbiBvZiBtdWx0aWFyY2ggdGhhdCBzaGlwcGVkIGluIFVidW50dSAxMS4wNC4KIC8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtZnN5bnRheC1vbmx5IDI+JjEgXAogLy8gUlVOOiAgICAgLXRhcmdldCBpMzg2LXVua25vd24tbGludXggXApAQCAtMTIsNyArMzUsNyBAQAogLy8gQ0hFQ0stVUJVTlRVLTExLTA0OiAiLWludGVybmFsLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvbGliL2kzODYtbGludXgtZ251L2djYy9pNjg2LWxpbnV4LWdudS80LjUvLi4vLi4vLi4vLi4vLi4vaW5jbHVkZS9jKysvNC41L2k2ODYtbGludXgtZ251IgogLy8gQ0hFQ0stVUJVTlRVLTExLTA0OiAiLWludGVybmFsLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvbGliL2kzODYtbGludXgtZ251L2djYy9pNjg2LWxpbnV4LWdudS80LjUvLi4vLi4vLi4vLi4vLi4vaW5jbHVkZS9jKysvNC41L2JhY2t3YXJkIgogLy8gQ0hFQ0stVUJVTlRVLTExLTA0OiAiLWludGVybmFsLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvbG9jYWwvaW5jbHVkZSIKLS8vIENIRUNLLVVCVU5UVS0xMS0wNDogIi1pbnRlcm5hbC1pc3lzdGVtIiAie3suKn19e3svfFxcXFx9fWxpYnt7KDY0fDMyKT99fXt7L3xcXFxcfX1jbGFuZ3t7L3xcXFxcfX17e1swLTldXC5bMC05XX19e3svfFxcXFx9fWluY2x1ZGUiCisvLyBDSEVDSy1VQlVOVFUtMTEtMDQ6ICItaW50ZXJuYWwtaXN5c3RlbSIgInt7Lip9fXt7L3xcXFxcfX1saWJ7eyg2NHwzMik/fX17ey98XFxcXH19Y2xhbmd7ey98XFxcXH19e3tbMC05XVwuWzAtOV1cLlswLTldfX17ey98XFxcXH19aW5jbHVkZSIKIC8vIENIRUNLLVVCVU5UVS0xMS0wNDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS9pbmNsdWRlIgogLy8gQ0hFQ0stVUJVTlRVLTExLTA0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9pbmNsdWRlIgogLy8KQEAgLTI2LDcgKzQ5LDcgQEAKIC8vIENIRUNLLVVCVU5UVS0xMy0wNDogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjcvLi4vLi4vLi4vLi4vaW5jbHVkZS9jKysvNC43L2JhY2t3YXJkIgogLy8gQ0hFQ0stVUJVTlRVLTEzLTA0OiAiLWludGVybmFsLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvbGliL2djYy94ODZfNjQtbGludXgtZ251LzQuNy8uLi8uLi8uLi8uLi9pbmNsdWRlL3g4Nl82NC1saW51eC1nbnUvYysrLzQuNyIKIC8vIENIRUNLLVVCVU5UVS0xMy0wNDogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2xvY2FsL2luY2x1ZGUiCi0vLyBDSEVDSy1VQlVOVFUtMTMtMDQ6ICItaW50ZXJuYWwtaXN5c3RlbSIgInt7Lip9fXt7L3xcXFxcfX1saWJ7eyg2NHwzMik/fX17ey98XFxcXH19Y2xhbmd7ey98XFxcXH19e3tbMC05XVwuWzAtOV19fXt7L3xcXFxcfX1pbmNsdWRlIgorLy8gQ0hFQ0stVUJVTlRVLTEzLTA0OiAiLWludGVybmFsLWlzeXN0ZW0iICJ7ey4qfX17ey98XFxcXH19bGlie3soNjR8MzIpP319e3svfFxcXFx9fWNsYW5ne3svfFxcXFx9fXt7WzAtOV1cLlswLTldXC5bMC05XX19e3svfFxcXFx9fWluY2x1ZGUiCiAvLyBDSEVDSy1VQlVOVFUtMTMtMDQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudSIKIC8vIENIRUNLLVVCVU5UVS0xMy0wNDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS9pbmNsdWRlIgogLy8gQ0hFQ0stVUJVTlRVLTEzLTA0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9pbmNsdWRlIgpAQCAtNDEsNyArNjQsNyBAQAogLy8gQ0hFQ0stVUJVTlRVLTEzLTA0LUNST1NTOiAiLWludGVybmFsLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvbGliL2djYy1jcm9zcy9hcm0tbGludXgtZ251ZWFiaWhmLzQuNy8uLi8uLi8uLi8uLi9pbmNsdWRlL2MrKy80LjcvYmFja3dhcmQiCiAvLyBDSEVDSy1VQlVOVFUtMTMtMDQtQ1JPU1M6ICItaW50ZXJuYWwtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9saWIvZ2NjLWNyb3NzL2FybS1saW51eC1nbnVlYWJpaGYvNC43Ly4uLy4uLy4uLy4uL2luY2x1ZGUvYXJtLWxpbnV4LWdudWVhYmloZi9jKysvNC43IgogLy8gQ0hFQ0stVUJVTlRVLTEzLTA0LUNST1NTOiAiLWludGVybmFsLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvbG9jYWwvaW5jbHVkZSIKLS8vIENIRUNLLVVCVU5UVS0xMy0wNC1DUk9TUzogIi1pbnRlcm5hbC1pc3lzdGVtIiAie3suKn19e3svfFxcXFx9fWxpYnt7KDY0fDMyKT99fXt7L3xcXFxcfX1jbGFuZ3t7L3xcXFxcfX17e1swLTldXC5bMC05XX19e3svfFxcXFx9fWluY2x1ZGUiCisvLyBDSEVDSy1VQlVOVFUtMTMtMDQtQ1JPU1M6ICItaW50ZXJuYWwtaXN5c3RlbSIgInt7Lip9fXt7L3xcXFxcfX1saWJ7eyg2NHwzMik/fX17ey98XFxcXH19Y2xhbmd7ey98XFxcXH19e3tbMC05XVwuWzAtOV1cLlswLTldfX17ey98XFxcXH19aW5jbHVkZSIKIC8vIENIRUNLLVVCVU5UVS0xMy0wNC1DUk9TUzogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS9pbmNsdWRlIgogLy8gQ0hFQ0stVUJVTlRVLTEzLTA0LUNST1NTOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9pbmNsdWRlIgogLy8KQEAgLTY5LDcgKzkyLDcgQEAKIC8vIENIRUNLLURFQklBTi1YODY6ICItaW50ZXJuYWwtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9saWIvZ2NjL2k2ODYtbGludXgtZ251LzQuNS8uLi8uLi8uLi8uLi9pbmNsdWRlL2MrKy80LjUvaTY4Ni1saW51eC1nbnUiCiAvLyBDSEVDSy1ERUJJQU4tWDg2OiAiLWludGVybmFsLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvbGliL2djYy9pNjg2LWxpbnV4LWdudS80LjUvLi4vLi4vLi4vLi4vaW5jbHVkZS9jKysvNC41L2JhY2t3YXJkIgogLy8gQ0hFQ0stREVCSUFOLVg4NjogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2xvY2FsL2luY2x1ZGUiCi0vLyBDSEVDSy1ERUJJQU4tWDg2OiAiLWludGVybmFsLWlzeXN0ZW0iICJ7ey4qfX17ey98XFxcXH19bGlie3soNjR8MzIpP319e3svfFxcXFx9fWNsYW5ne3svfFxcXFx9fXt7WzAtOV1cLlswLTldfX17ey98XFxcXH19aW5jbHVkZSIKKy8vIENIRUNLLURFQklBTi1YODY6ICItaW50ZXJuYWwtaXN5c3RlbSIgInt7Lip9fXt7L3xcXFxcfX1saWJ7eyg2NHwzMik/fX17ey98XFxcXH19Y2xhbmd7ey98XFxcXH19e3tbMC05XVwuWzAtOV1cLlswLTldfX17ey98XFxcXH19aW5jbHVkZSIKIC8vIENIRUNLLURFQklBTi1YODY6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2luY2x1ZGUvaTM4Ni1saW51eC1nbnUiCiAvLyBDSEVDSy1ERUJJQU4tWDg2OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIgIltbU1lTUk9PVF1dL2luY2x1ZGUiCiAvLyBDSEVDSy1ERUJJQU4tWDg2OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9pbmNsdWRlIgpAQCAtODMsNyArMTA2LDcgQEAKIC8vIENIRUNLLURFQklBTi1YODYtNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9saWIvZ2NjL3g4Nl82NC1saW51eC1nbnUvNC41Ly4uLy4uLy4uLy4uL2luY2x1ZGUvYysrLzQuNS94ODZfNjQtbGludXgtZ251IgogLy8gQ0hFQ0stREVCSUFOLVg4Ni02NDogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2xpYi9nY2MveDg2XzY0LWxpbnV4LWdudS80LjUvLi4vLi4vLi4vLi4vaW5jbHVkZS9jKysvNC41L2JhY2t3YXJkIgogLy8gQ0hFQ0stREVCSUFOLVg4Ni02NDogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2xvY2FsL2luY2x1ZGUiCi0vLyBDSEVDSy1ERUJJQU4tWDg2LTY0OiAiLWludGVybmFsLWlzeXN0ZW0iICJ7ey4qfX17ey98XFxcXH19bGlie3soNjR8MzIpP319e3svfFxcXFx9fWNsYW5ne3svfFxcXFx9fXt7WzAtOV1cLlswLTldfX17ey98XFxcXH19aW5jbHVkZSIKKy8vIENIRUNLLURFQklBTi1YODYtNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIgInt7Lip9fXt7L3xcXFxcfX1saWJ7eyg2NHwzMik/fX17ey98XFxcXH19Y2xhbmd7ey98XFxcXH19e3tbMC05XVwuWzAtOV1cLlswLTldfX17ey98XFxcXH19aW5jbHVkZSIKIC8vIENIRUNLLURFQklBTi1YODYtNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2luY2x1ZGUveDg2XzY0LWxpbnV4LWdudSIKIC8vIENIRUNLLURFQklBTi1YODYtNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIiAiW1tTWVNST09UXV0vaW5jbHVkZSIKIC8vIENIRUNLLURFQklBTi1YODYtNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2luY2x1ZGUiCkBAIC05Nyw3ICsxMjAsNyBAQAogLy8gQ0hFQ0stREVCSUFOLVBQQzogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2xpYi9nY2MvcG93ZXJwYy1saW51eC1nbnUvNC41Ly4uLy4uLy4uLy4uL2luY2x1ZGUvYysrLzQuNS9wb3dlcnBjLWxpbnV4LWdudSIKIC8vIENIRUNLLURFQklBTi1QUEM6ICItaW50ZXJuYWwtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9saWIvZ2NjL3Bvd2VycGMtbGludXgtZ251LzQuNS8uLi8uLi8uLi8uLi9pbmNsdWRlL2MrKy80LjUvYmFja3dhcmQiCiAvLyBDSEVDSy1ERUJJQU4tUFBDOiAiLWludGVybmFsLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvbG9jYWwvaW5jbHVkZSIKLS8vIENIRUNLLURFQklBTi1QUEM6ICItaW50ZXJuYWwtaXN5c3RlbSIgInt7Lip9fXt7L3xcXFxcfX1saWJ7eyg2NHwzMik/fX17ey98XFxcXH19Y2xhbmd7ey98XFxcXH19e3tbMC05XVwuWzAtOV19fXt7L3xcXFxcfX1pbmNsdWRlIgorLy8gQ0hFQ0stREVCSUFOLVBQQzogIi1pbnRlcm5hbC1pc3lzdGVtIiAie3suKn19e3svfFxcXFx9fWxpYnt7KDY0fDMyKT99fXt7L3xcXFxcfX1jbGFuZ3t7L3xcXFxcfX17e1swLTldXC5bMC05XVwuWzAtOV19fXt7L3xcXFxcfX1pbmNsdWRlIgogLy8gQ0hFQ0stREVCSUFOLVBQQzogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvaW5jbHVkZS9wb3dlcnBjLWxpbnV4LWdudSIKIC8vIENIRUNLLURFQklBTi1QUEM6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIiAiW1tTWVNST09UXV0vaW5jbHVkZSIKIC8vIENIRUNLLURFQklBTi1QUEM6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2luY2x1ZGUiCkBAIC0xMTEsNyArMTM0LDcgQEAKIC8vIENIRUNLLURFQklBTi1QUEM2NDogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2xpYi9nY2MvcG93ZXJwYzY0LWxpbnV4LWdudS80LjUvLi4vLi4vLi4vLi4vaW5jbHVkZS9jKysvNC41L3Bvd2VycGM2NC1saW51eC1nbnUiCiAvLyBDSEVDSy1ERUJJQU4tUFBDNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9saWIvZ2NjL3Bvd2VycGM2NC1saW51eC1nbnUvNC41Ly4uLy4uLy4uLy4uL2luY2x1ZGUvYysrLzQuNS9iYWNrd2FyZCIKIC8vIENIRUNLLURFQklBTi1QUEM2NDogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2xvY2FsL2luY2x1ZGUiCi0vLyBDSEVDSy1ERUJJQU4tUFBDNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIgInt7Lip9fXt7L3xcXFxcfX1saWJ7eyg2NHwzMik/fX17ey98XFxcXH19Y2xhbmd7ey98XFxcXH19e3tbMC05XVwuWzAtOV19fXt7L3xcXFxcfX1pbmNsdWRlIgorLy8gQ0hFQ0stREVCSUFOLVBQQzY0OiAiLWludGVybmFsLWlzeXN0ZW0iICJ7ey4qfX17ey98XFxcXH19bGlie3soNjR8MzIpP319e3svfFxcXFx9fWNsYW5ne3svfFxcXFx9fXt7WzAtOV1cLlswLTldXC5bMC05XX19e3svfFxcXFx9fWluY2x1ZGUiCiAvLyBDSEVDSy1ERUJJQU4tUFBDNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2luY2x1ZGUvcG93ZXJwYzY0LWxpbnV4LWdudSIKIC8vIENIRUNLLURFQklBTi1QUEM2NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS9pbmNsdWRlIgogLy8gQ0hFQ0stREVCSUFOLVBQQzY0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9pbmNsdWRlIgpAQCAtMTI4LDcgKzE1MSw3IEBACiAvLyBDSEVDSy1HRU5UT08tNC02LTI6ICItaW50ZXJuYWwtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC42LjIvaW5jbHVkZS9nKystdjQveDg2XzY0LXBjLWxpbnV4LWdudSIKIC8vIENIRUNLLUdFTlRPTy00LTYtMjogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjYuMi9pbmNsdWRlL2crKy12NC9iYWNrd2FyZCIKIC8vIENIRUNLLUdFTlRPTy00LTYtMjogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2xvY2FsL2luY2x1ZGUiCi0vLyBDSEVDSy1HRU5UT08tNC02LTI6ICItaW50ZXJuYWwtaXN5c3RlbSIgInt7Lip9fXt7L3xcXFxcfX1saWJ7eyg2NHwzMik/fX17ey98XFxcXH19Y2xhbmd7ey98XFxcXH19e3tbMC05XVwuWzAtOV19fXt7L3xcXFxcfX1pbmNsdWRlIgorLy8gQ0hFQ0stR0VOVE9PLTQtNi0yOiAiLWludGVybmFsLWlzeXN0ZW0iICJ7ey4qfX17ey98XFxcXH19bGlie3soNjR8MzIpP319e3svfFxcXFx9fWNsYW5ne3svfFxcXFx9fXt7WzAtOV1cLlswLTldXC5bMC05XX19e3svfFxcXFx9fWluY2x1ZGUiCiAvLyBDSEVDSy1HRU5UT08tNC02LTI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIiAiW1tTWVNST09UXV0vaW5jbHVkZSIKIC8vIENIRUNLLUdFTlRPTy00LTYtMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvaW5jbHVkZSIKIC8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtZnN5bnRheC1vbmx5IDI+JjEgXApAQCAtMTQxLDYgKzE2NCw2IEBACiAvLyBDSEVDSy1HRU5UT08tNC02LTQ6ICItaW50ZXJuYWwtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC42LjQvaW5jbHVkZS9nKystdjQuNi94ODZfNjQtcGMtbGludXgtZ251IgogLy8gQ0hFQ0stR0VOVE9PLTQtNi00OiAiLWludGVybmFsLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNi40L2luY2x1ZGUvZysrLXY0LjYvYmFja3dhcmQiCiAvLyBDSEVDSy1HRU5UT08tNC02LTQ6ICItaW50ZXJuYWwtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9sb2NhbC9pbmNsdWRlIgotLy8gQ0hFQ0stR0VOVE9PLTQtNi00OiAiLWludGVybmFsLWlzeXN0ZW0iICJ7ey4qfX17ey98XFxcXH19bGlie3soNjR8MzIpP319e3svfFxcXFx9fWNsYW5ne3svfFxcXFx9fXt7WzAtOV1cLlswLTldfX17ey98XFxcXH19aW5jbHVkZSIKKy8vIENIRUNLLUdFTlRPTy00LTYtNDogIi1pbnRlcm5hbC1pc3lzdGVtIiAie3suKn19e3svfFxcXFx9fWxpYnt7KDY0fDMyKT99fXt7L3xcXFxcfX1jbGFuZ3t7L3xcXFxcfX17e1swLTldXC5bMC05XVwuWzAtOV19fXt7L3xcXFxcfX1pbmNsdWRlIgogLy8gQ0hFQ0stR0VOVE9PLTQtNi00OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIgIltbU1lTUk9PVF1dL2luY2x1ZGUiCiAvLyBDSEVDSy1HRU5UT08tNC02LTQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2luY2x1ZGUiCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9saW51eC1sZC5jIGIvdGVzdC9Ecml2ZXIvbGludXgtbGQuYwppbmRleCA3NTVmYTA0Li5jYTM5MGQ5IDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9saW51eC1sZC5jCisrKyBiL3Rlc3QvRHJpdmVyL2xpbnV4LWxkLmMKQEAgLTM1LDYgKzM1LDQ2IEBACiAvLwogLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCiAvLyBSVU46ICAgICAtLXRhcmdldD14ODZfNjQtdW5rbm93bi1saW51eCBcCisvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2xpbnV4X3RyZWUgXAorLy8gUlVOOiAgICAgLS1ydGxpYj1jb21waWxlci1ydCBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTEQtUlQgJXMKKy8vIENIRUNLLUxELVJULU5PVDogd2FybmluZzoKKy8vIENIRUNLLUxELVJUOiAie3suKn19bGR7eyguZXhlKT99fSIgIi0tc3lzcm9vdD1bW1NZU1JPT1Q6W14iXStdXSIKKy8vIENIRUNLLUxELVJUOiAiLS1laC1mcmFtZS1oZHIiCisvLyBDSEVDSy1MRC1SVDogIi1tIiAiZWxmX3g4Nl82NCIKKy8vIENIRUNLLUxELVJUOiAiLWR5bmFtaWMtbGlua2VyIgorLy8gQ0hFQ0stTEQtUlQ6ICJ7ey4qfX0vdXNyL2xpYi9nY2MveDg2XzY0LXVua25vd24tbGludXgvNC42LjB7ey98XFxcXH19Y3J0YmVnaW4ubyIKKy8vIENIRUNLLUxELVJUOiAiLUxbW1NZU1JPT1RdXS91c3IvbGliL2djYy94ODZfNjQtdW5rbm93bi1saW51eC80LjYuMCIKKy8vIENIRUNLLUxELVJUOiAiLUxbW1NZU1JPT1RdXS91c3IvbGliL2djYy94ODZfNjQtdW5rbm93bi1saW51eC80LjYuMC8uLi8uLi8uLi8uLi94ODZfNjQtdW5rbm93bi1saW51eC9saWIiCisvLyBDSEVDSy1MRC1SVDogIi1MW1tTWVNST09UXV0vdXNyL2xpYi9nY2MveDg2XzY0LXVua25vd24tbGludXgvNC42LjAvLi4vLi4vLi4iCisvLyBDSEVDSy1MRC1SVDogIi1MW1tTWVNST09UXV0vbGliIgorLy8gQ0hFQ0stTEQtUlQ6ICItTFtbU1lTUk9PVF1dL3Vzci9saWIiCisvLyBDSEVDSy1MRC1SVDogbGliY2xhbmdfcnQueDg2XzY0LmEiICItbGdjY19zIgorLy8gQ0hFQ0stTEQtUlQ6ICItbGMiCisvLyBDSEVDSy1MRC1SVDogbGliY2xhbmdfcnQueDg2XzY0LmEiICItbGdjY19zIgorLy8KKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9eDg2XzY0LXVua25vd24tbGludXggXAorLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19saW51eF90cmVlIFwKKy8vIFJVTjogICAgIC0tcnRsaWI9bGliZ2NjIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1MRC1HQ0MgJXMKKy8vIENIRUNLLUxELUdDQy1OT1Q6IHdhcm5pbmc6CisvLyBDSEVDSy1MRC1HQ0M6ICJ7ey4qfX1sZHt7KC5leGUpP319IiAiLS1zeXNyb290PVtbU1lTUk9PVDpbXiJdK11dIgorLy8gQ0hFQ0stTEQtR0NDOiAiLS1laC1mcmFtZS1oZHIiCisvLyBDSEVDSy1MRC1HQ0M6ICItbSIgImVsZl94ODZfNjQiCisvLyBDSEVDSy1MRC1HQ0M6ICItZHluYW1pYy1saW5rZXIiCisvLyBDSEVDSy1MRC1HQ0M6ICJ7ey4qfX0vdXNyL2xpYi9nY2MveDg2XzY0LXVua25vd24tbGludXgvNC42LjB7ey98XFxcXH19Y3J0YmVnaW4ubyIKKy8vIENIRUNLLUxELUdDQzogIi1MW1tTWVNST09UXV0vdXNyL2xpYi9nY2MveDg2XzY0LXVua25vd24tbGludXgvNC42LjAiCisvLyBDSEVDSy1MRC1HQ0M6ICItTFtbU1lTUk9PVF1dL3Vzci9saWIvZ2NjL3g4Nl82NC11bmtub3duLWxpbnV4LzQuNi4wLy4uLy4uLy4uLy4uL3g4Nl82NC11bmtub3duLWxpbnV4L2xpYiIKKy8vIENIRUNLLUxELUdDQzogIi1MW1tTWVNST09UXV0vdXNyL2xpYi9nY2MveDg2XzY0LXVua25vd24tbGludXgvNC42LjAvLi4vLi4vLi4iCisvLyBDSEVDSy1MRC1HQ0M6ICItTFtbU1lTUk9PVF1dL2xpYiIKKy8vIENIRUNLLUxELUdDQzogIi1MW1tTWVNST09UXV0vdXNyL2xpYiIKKy8vIENIRUNLLUxELUdDQyAiLWxnY2MiICItLWFzLW5lZWRlZCIgIi1sZ2NjX3MiICItLW5vLWFzLW5lZWRlZCIKKy8vIENIRUNLLUxELUdDQzogIi1sYyIKKy8vIENIRUNLLUxELUdDQzogIi1sZ2NjIiAiLS1hcy1uZWVkZWQiICItbGdjY19zIiAiLS1uby1hcy1uZWVkZWQiCisvLworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD14ODZfNjQtdW5rbm93bi1saW51eCBcCiAvLyBSVU46ICAgICAtc3RhdGljLWxpYmdjYyBcCiAvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2xpbnV4X3RyZWUgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUxELTY0LVNUQVRJQy1MSUJHQ0MgJXMKQEAgLTIxNCw2ICsyNTQsMzIgQEAKIC8vIENIRUNLLUdDQy1WRVJTSU9ONDogInt7Lip9fS9JbnB1dHMvZ2NjX3ZlcnNpb25fcGFyc2luZzQvYmluLy4uL2xpYi9nY2MvaTM4Ni11bmtub3duLWxpbnV4LzQuNy45OXt7L3xcXFxcfX1jcnRiZWdpbi5vIgogLy8gQ0hFQ0stR0NDLVZFUlNJT040OiAiLUx7ey4qfX0vSW5wdXRzL2djY192ZXJzaW9uX3BhcnNpbmc0L2Jpbi8uLi9saWIvZ2NjL2kzODYtdW5rbm93bi1saW51eC80LjcuOTkiCiAvLworLy8gVGVzdCBhIHNpbXVsYXRlZCBpbnN0YWxsYXRpb24gb2YgbGliYysrIG9uIExpbnV4LCBib3RoIHRocm91Z2ggc3lzcm9vdCBhbmQKKy8vIHRoZSBpbnN0YWxsYXRpb24gcGF0aCBvZiBDbGFuZy4KKy8vIFJVTjogJWNsYW5neHggLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAteCBjKysgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLXRhcmdldCB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUgXAorLy8gUlVOOiAgICAgLXN0ZGxpYj1saWJjKysgXAorLy8gUlVOOiAgICAgLWNjYy1pbnN0YWxsLWRpciAlUy9JbnB1dHMvYmFzaWNfbGludXhfdHJlZS91c3IvYmluIFwKKy8vIFJVTjogICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbGludXhfbGliY3h4X3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJBU0lDLUxJQkNYWC1TWVNST09UICVzCisvLyBDSEVDSy1CQVNJQy1MSUJDWFgtU1lTUk9PVDogInt7W14iXSp9fWNsYW5ne3tbXiJdKn19IiAiLWNjMSIKKy8vIENIRUNLLUJBU0lDLUxJQkNYWC1TWVNST09UOiAiLWlzeXNyb290IiAiW1tTWVNST09UOlteIl0rXV0iCisvLyBDSEVDSy1CQVNJQy1MSUJDWFgtU1lTUk9PVDogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2luY2x1ZGUvYysrL3YxIgorLy8gQ0hFQ0stQkFTSUMtTElCQ1hYLVNZU1JPT1Q6ICItaW50ZXJuYWwtaXN5c3RlbSIgIltbU1lTUk9PVF1dL3Vzci9sb2NhbC9pbmNsdWRlIgorLy8gQ0hFQ0stQkFTSUMtTElCQ1hYLVNZU1JPT1Q6ICItLXN5c3Jvb3Q9W1tTWVNST09UXV0iCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzIC14IGMrKyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtdGFyZ2V0IHg4Nl82NC11bmtub3duLWxpbnV4LWdudSBcCisvLyBSVU46ICAgICAtc3RkbGliPWxpYmMrKyBcCisvLyBSVU46ICAgICAtY2NjLWluc3RhbGwtZGlyICVTL0lucHV0cy9iYXNpY19saW51eF9saWJjeHhfdHJlZS91c3IvYmluIFwKKy8vIFJVTjogICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbGludXhfbGliY3h4X3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJBU0lDLUxJQkNYWC1JTlNUQUxMICVzCisvLyBDSEVDSy1CQVNJQy1MSUJDWFgtSU5TVEFMTDogInt7W14iXSp9fWNsYW5ne3tbXiJdKn19IiAiLWNjMSIKKy8vIENIRUNLLUJBU0lDLUxJQkNYWC1JTlNUQUxMOiAiLWlzeXNyb290IiAiW1tTWVNST09UOlteIl0rXV0iCisvLyBDSEVDSy1CQVNJQy1MSUJDWFgtSU5TVEFMTDogIi1pbnRlcm5hbC1pc3lzdGVtIiAiW1tTWVNST09UXV0vdXNyL2Jpbi8uLi9pbmNsdWRlL2MrKy92MSIKKy8vIENIRUNLLUJBU0lDLUxJQkNYWC1JTlNUQUxMOiAiLWludGVybmFsLWlzeXN0ZW0iICJbW1NZU1JPT1RdXS91c3IvbG9jYWwvaW5jbHVkZSIKKy8vIENIRUNLLUJBU0lDLUxJQkNYWC1JTlNUQUxMOiAiLS1zeXNyb290PVtbU1lTUk9PVF1dIgorLy8gQ0hFQ0stQkFTSUMtTElCQ1hYLUlOU1RBTEw6ICItTFtbU1lTUk9PVF1dL3Vzci9iaW4vLi4vbGliIgorLy8KIC8vIFRlc3QgYSB2ZXJ5IGJyb2tlbiB2ZXJzaW9uIG9mIG11bHRpYXJjaCB0aGF0IHNoaXBwZWQgaW4gVWJ1bnR1IDExLjA0LgogLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCiAvLyBSVU46ICAgICAtLXRhcmdldD1pMzg2LXVua25vd24tbGludXggXApAQCAtMzg0LDYgKzQ1MCwyMCBAQAogLy8gQ0hFQ0stTUlQUzY0RUwtTjMyOiAiLWR5bmFtaWMtbGlua2VyIiAie3suKn19L2xpYjMyL2xkLnNvLjEiCiAvLyBDSEVDSy1NSVBTNjRFTC1OMzItTk9UOiAiLS1oYXNoLXN0eWxlPXt7Z251fGJvdGh9fSIKIC8vCisvLyBSVU46ICVjbGFuZyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1zcGFyYy1saW51eC1nbnUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLVNQQVJDVjggJXMKKy8vIENIRUNLLVNQQVJDVjg6ICJ7ey4qfX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stU1BBUkNWODogIi1tIiAiZWxmMzJfc3BhcmMiCisvLyBDSEVDSy1TUEFSQ1Y4OiAiLWR5bmFtaWMtbGlua2VyIiAiL2xpYi9sZC1saW51eC5zby4yIgorLy8KKy8vIFJVTjogJWNsYW5nICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PXNwYXJjdjktbGludXgtZ251IFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1TUEFSQ1Y5ICVzCisvLyBDSEVDSy1TUEFSQ1Y5OiAie3suKn19bGR7eyguZXhlKT99fSIKKy8vIENIRUNLLVNQQVJDVjk6ICItbSIgImVsZjY0X3NwYXJjIgorLy8gQ0hFQ0stU1BBUkNWOTogIi1keW5hbWljLWxpbmtlciIgIi9saWI2NC9sZC1saW51eC5zby4yIgorLy8KIC8vIFRob3JvdWdobHkgZXhlcmNpc2UgdGhlIERlYmlhbiBtdWx0aWFyY2ggZW52aXJvbm1lbnQuCiAvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKIC8vIFJVTjogICAgIC0tdGFyZ2V0PWk2ODYtbGludXgtZ251IFwKQEAgLTUxNiw3ICs1OTYsMTUgQEAKIC8vIFJVTjogICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfYW5kcm9pZF90cmVlL3N5c3Jvb3QgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFORFJPSUQgJXMKIC8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9aTM4Ni1saW51eC1hbmRyb2lkIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHM2NGVsLWxpbnV4LWFuZHJvaWQgXAorLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19hbmRyb2lkX3RyZWUvc3lzcm9vdCBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQU5EUk9JRCAlcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1pNjg2LWxpbnV4LWFuZHJvaWQgXAorLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19hbmRyb2lkX3RyZWUvc3lzcm9vdCBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQU5EUk9JRCAlcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD14ODZfNjQtbGludXgtYW5kcm9pZCBcCiAvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2FuZHJvaWRfdHJlZS9zeXNyb290IFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1BTkRST0lEICVzCiAvLyBDSEVDSy1BTkRST0lEOiAie3suKn19bGR7eyguZXhlKT99fSIgIi0tc3lzcm9vdD1bW1NZU1JPT1Q6W14iXStdXSIKQEAgLTU0Myw3ICs2MzEsMTcgQEAKIC8vIFJVTjogICAgIC1zaGFyZWQgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFORFJPSUQtU08gJXMKIC8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9aTM4Ni1saW51eC1hbmRyb2lkIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHM2NGVsLWxpbnV4LWFuZHJvaWQgXAorLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19hbmRyb2lkX3RyZWUvc3lzcm9vdCBcCisvLyBSVU46ICAgICAtc2hhcmVkIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1BTkRST0lELVNPICVzCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PWk2ODYtbGludXgtYW5kcm9pZCBcCisvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2FuZHJvaWRfdHJlZS9zeXNyb290IFwKKy8vIFJVTjogICAgIC1zaGFyZWQgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFORFJPSUQtU08gJXMKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9eDg2XzY0LWxpbnV4LWFuZHJvaWQgXAogLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19hbmRyb2lkX3RyZWUvc3lzcm9vdCBcCiAvLyBSVU46ICAgICAtc2hhcmVkIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1BTkRST0lELVNPICVzCkBAIC01NzIsNyArNjcwLDE3IEBACiAvLyBSVU46ICAgICAtc3RhdGljIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1BTkRST0lELVNUQVRJQyAlcwogLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1pMzg2LWxpbnV4LWFuZHJvaWQgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwczY0ZWwtbGludXgtYW5kcm9pZCBcCisvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2FuZHJvaWRfdHJlZS9zeXNyb290IFwKKy8vIFJVTjogICAgIC1zdGF0aWMgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFORFJPSUQtU1RBVElDICVzCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PWk2ODYtbGludXgtYW5kcm9pZCBcCisvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2FuZHJvaWRfdHJlZS9zeXNyb290IFwKKy8vIFJVTjogICAgIC1zdGF0aWMgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFORFJPSUQtU1RBVElDICVzCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PXg4Ni1saW51eC1hbmRyb2lkIFwKIC8vIFJVTjogICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfYW5kcm9pZF90cmVlL3N5c3Jvb3QgXAogLy8gUlVOOiAgICAgLXN0YXRpYyBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQU5EUk9JRC1TVEFUSUMgJXMKQEAgLTYwMCw3ICs3MDgsMTcgQEAKIC8vIFJVTjogICAgIC1waWUgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFORFJPSUQtUElFICVzCiAvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKLS8vIFJVTjogICAgIC0tdGFyZ2V0PWkzODYtbGludXgtYW5kcm9pZCBcCisvLyBSVU46ICAgICAtLXRhcmdldD1taXBzNjRlbC1saW51eC1hbmRyb2lkIFwKKy8vIFJVTjogICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfYW5kcm9pZF90cmVlL3N5c3Jvb3QgXAorLy8gUlVOOiAgICAgLXBpZSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQU5EUk9JRC1QSUUgJXMKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9aTY4Ni1saW51eC1hbmRyb2lkIFwKKy8vIFJVTjogICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfYW5kcm9pZF90cmVlL3N5c3Jvb3QgXAorLy8gUlVOOiAgICAgLXBpZSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQU5EUk9JRC1QSUUgJXMKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9eDg2XzY0LWxpbnV4LWFuZHJvaWQgXAogLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19hbmRyb2lkX3RyZWUvc3lzcm9vdCBcCiAvLyBSVU46ICAgICAtcGllIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1BTkRST0lELVBJRSAlcwpAQCAtNjExLDYgKzcyOSwzMiBAQAogLy8gQ0hFQ0stQU5EUk9JRC1QSUU6ICItbGdjYyIKIC8vIENIRUNLLUFORFJPSUQtUElFLU5PVDogImdjY19zIgogLy8gQ0hFQ0stQU5EUk9JRC1QSUU6ICJ7ey4qfX17ey98XFxcXH19Y3J0ZW5kX2FuZHJvaWQubyIKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9YXJtLWxpbnV4LWFuZHJvaWRlYWJpIFwKKy8vIFJVTjogICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfYW5kcm9pZF90cmVlL3N5c3Jvb3QgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFORFJPSUQtMzIgJXMKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9YXJtLWxpbnV4LWFuZHJvaWQgXAorLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19hbmRyb2lkX3RyZWUvc3lzcm9vdCBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQU5EUk9JRC0zMiAlcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1taXBzZWwtbGludXgtYW5kcm9pZCBcCisvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2FuZHJvaWRfdHJlZS9zeXNyb290IFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1BTkRST0lELTMyICVzCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHM2NGVsLWxpbnV4LWFuZHJvaWQgXAorLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19hbmRyb2lkX3RyZWUvc3lzcm9vdCBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQU5EUk9JRC02NCAlcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1pNjg2LWxpbnV4LWFuZHJvaWQgXAorLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19hbmRyb2lkX3RyZWUvc3lzcm9vdCBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQU5EUk9JRC0zMiAlcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD14ODZfNjQtbGludXgtYW5kcm9pZCBcCisvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2FuZHJvaWRfdHJlZS9zeXNyb290IFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1BTkRST0lELTY0ICVzCisvLyBDSEVDSy1BTkRST0lELTMyOiAiLWR5bmFtaWMtbGlua2VyIiAiL3N5c3RlbS9iaW4vbGlua2VyIgorLy8gQ0hFQ0stQU5EUk9JRC02NDogIi1keW5hbWljLWxpbmtlciIgIi9zeXN0ZW0vYmluL2xpbmtlcjY0IgogLy8KIC8vIENoZWNrIGxpbmtlciBpbnZvY2F0aW9uIG9uIERlYmlhbiA2IE1JUFMgMzIvNjQtYml0LgogLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCkBAIC02ODEsNyArODI1LDcgQEAKIC8vIENIRUNLLUZTTC1QUEM2NDogInt7Lip9fXt7L3xcXFxcfX1jcnRiZWdpbi5vIgogLy8gQ0hFQ0stRlNMLVBQQzY0OiAiLUxbW1NZU1JPT1RdXS91c3IvbGliNjQvcG93ZXJwYzY0LWZzbC1saW51eC80LjYuMi8uLi8uLiIKIC8vCi0vLyBDaGVjayB0aGF0IGNydGZhc3RtYXRoLm8gaXMgbGlua2VkIHdpdGggLWZmYXN0LW1hdGguCisvLyBDaGVjayB0aGF0IGNydGZhc3RtYXRoLm8gaXMgbGlua2VkIHdpdGggLWZmYXN0LW1hdGggYW5kIHdpdGggLU9mYXN0LgogLy8gUlVOOiAlY2xhbmcgLS10YXJnZXQ9eDg2XzY0LXVua25vd24tbGludXggLSMjIyAlcyBcCiAvLyBSVU46ICAgICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2xpbnV4X3RyZWUgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTk9DUlRGQVNUTUFUSCAlcwpAQCAtNjkxLDkgKzgzNSwzMCBAQAogLy8gUlVOOiAlY2xhbmcgLS10YXJnZXQ9eDg2XzY0LXVua25vd24tbGludXggLSMjIyAlcyAtZnVuc2FmZS1tYXRoLW9wdGltaXphdGlvbnNcCiAvLyBSVU46ICAgICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2xpbnV4X3RyZWUgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQ1JURkFTVE1BVEggJXMKKy8vIFJVTjogJWNsYW5nIC0tdGFyZ2V0PXg4Nl82NC11bmtub3duLWxpbnV4IC0jIyMgJXMgLU9mYXN0XAorLy8gUlVOOiAgICAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19saW51eF90cmVlIDI+JjEgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUNSVEZBU1RNQVRIICVzCisvLyBSVU46ICVjbGFuZyAtLXRhcmdldD14ODZfNjQtdW5rbm93bi1saW51eCAtIyMjICVzIC1PZmFzdCAtTzNcCisvLyBSVU46ICAgICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2xpbnV4X3RyZWUgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTk9DUlRGQVNUTUFUSCAlcworLy8gUlVOOiAlY2xhbmcgLS10YXJnZXQ9eDg2XzY0LXVua25vd24tbGludXggLSMjIyAlcyAtTzMgLU9mYXN0XAorLy8gUlVOOiAgICAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19saW51eF90cmVlIDI+JjEgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUNSVEZBU1RNQVRIICVzCiAvLyBSVU46ICVjbGFuZyAtLXRhcmdldD14ODZfNjQtdW5rbm93bi1saW51eCAtIyMjICVzIC1mZmFzdC1tYXRoIC1mbm8tZmFzdC1tYXRoIFwKIC8vIFJVTjogICAgICAgIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbGludXhfdHJlZSAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1OT0NSVEZBU1RNQVRIICVzCisvLyBSVU46ICVjbGFuZyAtLXRhcmdldD14ODZfNjQtdW5rbm93bi1saW51eCAtIyMjICVzIC1PZmFzdCAtZm5vLWZhc3QtbWF0aCBcCisvLyBSVU46ICAgICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2xpbnV4X3RyZWUgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQ1JURkFTVE1BVEggJXMKKy8vIFJVTjogJWNsYW5nIC0tdGFyZ2V0PXg4Nl82NC11bmtub3duLWxpbnV4IC0jIyMgJXMgLU9mYXN0IC1mbm8tdW5zYWZlLW1hdGgtb3B0aW1pemF0aW9ucyBcCisvLyBSVU46ICAgICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2xpbnV4X3RyZWUgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQ1JURkFTVE1BVEggJXMKKy8vIFJVTjogJWNsYW5nIC0tdGFyZ2V0PXg4Nl82NC11bmtub3duLWxpbnV4IC0jIyMgJXMgLWZuby1mYXN0LW1hdGggLU9mYXN0ICBcCisvLyBSVU46ICAgICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2xpbnV4X3RyZWUgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQ1JURkFTVE1BVEggJXMKKy8vIFJVTjogJWNsYW5nIC0tdGFyZ2V0PXg4Nl82NC11bmtub3duLWxpbnV4IC0jIyMgJXMgLWZuby11bnNhZmUtbWF0aC1vcHRpbWl6YXRpb25zIC1PZmFzdCBcCisvLyBSVU46ICAgICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2xpbnV4X3RyZWUgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQ1JURkFTVE1BVEggJXMKIC8vIFdlIGRvbid0IGhhdmUgY3J0ZmFzdG1hdGgubyBpbiB0aGUgaTM4NiB0cmVlLCB1c2UgaXQgdG8gY2hlY2sgdGhhdCBmaWxlCiAvLyBkZXRlY3Rpb24gd29ya3MuCiAvLyBSVU46ICVjbGFuZyAtLXRhcmdldD1pMzg2LXVua25vd24tbGludXggLSMjIyAlcyAtZmZhc3QtbWF0aCBcCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9tYWNoby1lbWJlZGRlZC5jIGIvdGVzdC9Ecml2ZXIvbWFjaG8tZW1iZWRkZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDU1NDdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Ecml2ZXIvbWFjaG8tZW1iZWRkZWQuYwpAQCAtMCwwICsxLDE0IEBACisvLyBSVU46ICVjbGFuZyAtYXJjaCBhcm12NyAtdGFyZ2V0IHRodW1idjctYXBwbGUtZGFyd2luLWVhYmkgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLUFBUENTCisvLyBSVU46ICVjbGFuZyAtYXJjaCBhcm12N3MgLXRhcmdldCB0aHVtYnY3LWFwcGxlLWlvcyAtIyMjIC1jICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQVBDUworLy8gUlVOOiAlY2xhbmcgLWFyY2ggYXJtdjdzIC10YXJnZXQgdGh1bWJ2Ny1hcHBsZS1kYXJ3aW4gLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLUFQQ1MKKy8vIFJVTjogJWNsYW5nIC1hcmNoIGFybXY2bSAtdGFyZ2V0IHRodW1idjctYXBwbGUtZGFyd2luIC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1NQUNITy1FTUJFRERFRAorLy8gUlVOOiAlY2xhbmcgLWFyY2ggYXJtdjdtIC10YXJnZXQgdGh1bWJ2Ny1hcHBsZS1kYXJ3aW4gLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLU1BQ0hPLUVNQkVEREVECisvLyBSVU46ICVjbGFuZyAtYXJjaCBhcm12N2VtIC10YXJnZXQgdGh1bWJ2Ny1hcHBsZS1kYXJ3aW4gLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLU1BQ0hPLUVNQkVEREVECisKKy8vIENIRUNLLUlPUzogIi10cmlwbGUiICJ0aHVtYnY3IiAidGh1bWJ2Ny1hcHBsZS1pb3MKKworLy8gQ0hFQ0stQUFQQ1M6ICItdGFyZ2V0LWFiaSIgImFhcGNzIgorLy8gQ0hFQ0stQVBDUzogIi10YXJnZXQtYWJpIiAiYXBjcy1nbnUiCisKKy8vIENIRUNLLU1BQ0hPLUVNQkVEREVEOiAiLXRyaXBsZSIgInt7dGh1bWJ2WzY3XWU/bX19LWFwcGxlLXVua25vd24tbWFjaG8iCisvLyBDSEVDSy1NQUNITy1FTUJFRERFRDogIi1tcmVsb2NhdGlvbi1tb2RlbCIgInBpYyIKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL21pcHMtYXMuYyBiL3Rlc3QvRHJpdmVyL21pcHMtYXMuYwppbmRleCBkZjkyNWYxLi5jODI1ZWU3IDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9taXBzLWFzLmMKKysrIGIvdGVzdC9Ecml2ZXIvbWlwcy1hcy5jCkBAIC0zLDQ5ICszLDQ5IEBACiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHMtbGludXgtZ251IC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUzMyLUVCLUFTICVzCi0vLyBNSVBTMzItRUItQVM6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzIiICItbWFiaSIgIjMyIiAiLUVCIgotLy8gTUlQUzMyLUVCLUFTLU5PVDogIi1LUElDIgorLy8gTUlQUzMyLUVCLUFTOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMycjIiICItbWFiaSIgIjMyIiAiLUVCIgorLy8gTUlQUzMyLUVCLUFTLU5PVDogInt7WyBBLVphLXpcXFwvXSp9fWFze3soLmV4ZSk/fX17ey4qfX0iLUtQSUMiCiAvLwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzLWxpbnV4LWdudSAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtZlBJQyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMzMi1FQi1QSUMgJXMKLS8vIE1JUFMzMi1FQi1QSUM6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzIiICItbWFiaSIgIjMyIiAiLUVCIgorLy8gTUlQUzMyLUVCLVBJQzogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMnIyIiAiLW1hYmkiICIzMiIgIi1FQiIKIC8vIE1JUFMzMi1FQi1QSUM6ICItS1BJQyIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHNlbC1saW51eC1nbnUgLSMjIyBcCiAvLyBSVU46ICAgLW5vLWludGVncmF0ZWQtYXMgLWMgJXMgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTMzItREVGLUVMLUFTICVzCi0vLyBNSVBTMzItREVGLUVMLUFTOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMyIiAiLW1hYmkiICIzMiIgIi1FTCIKKy8vIE1JUFMzMi1ERUYtRUwtQVM6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzJyMiIgIi1tYWJpIiAiMzIiICItRUwiCiAvLwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzNjQtbGludXgtZ251IC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUzY0LUVCLUFTICVzCi0vLyBNSVBTNjQtRUItQVM6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzNjQiICItbWFiaSIgIjY0IiAiLUVCIgorLy8gTUlQUzY0LUVCLUFTOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczY0cjIiICItbWFiaSIgIjY0IiAiLUVCIgogLy8KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwczY0ZWwtbGludXgtZ251IC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUzY0LURFRi1FTC1BUyAlcwotLy8gTUlQUzY0LURFRi1FTC1BUzogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHM2NCIgIi1tYWJpIiAiNjQiICItRUwiCisvLyBNSVBTNjQtREVGLUVMLUFTOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczY0cjIiICItbWFiaSIgIjY0IiAiLUVMIgogLy8KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwcy1saW51eC1nbnUgLW1hYmk9ZWFiaSAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMtRUFCSSAlcwotLy8gTUlQUy1FQUJJOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMyIiAiLW1hYmkiICJlYWJpIiAiLUVCIgorLy8gTUlQUy1FQUJJOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMycjIiICItbWFiaSIgImVhYmkiICItRUIiCiAvLwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzNjQtbGludXgtZ251IC1tYWJpPW4zMiAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMtTjMyICVzCi0vLyBNSVBTLU4zMjogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHM2NCIgIi1tYWJpIiAibjMyIiAiLUVCIgorLy8gTUlQUy1OMzI6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzNjRyMiIgIi1tYWJpIiAibjMyIiAiLUVCIgogLy8KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwc2VsLWxpbnV4LWdudSAtbWFiaT0zMiAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMzMi1FTC1BUyAlcwotLy8gTUlQUzMyLUVMLUFTOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMyIiAiLW1hYmkiICIzMiIgIi1FTCIKKy8vIE1JUFMzMi1FTC1BUzogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMnIyIiAiLW1hYmkiICIzMiIgIi1FTCIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHM2NGVsLWxpbnV4LWdudSAtbWFiaT02NCAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFM2NC1FTC1BUyAlcwotLy8gTUlQUzY0LUVMLUFTOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczY0IiAiLW1hYmkiICI2NCIgIi1FTCIKKy8vIE1JUFM2NC1FTC1BUzogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHM2NHIyIiAiLW1hYmkiICI2NCIgIi1FTCIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHMtbGludXgtZ251IC1tYXJjaD1taXBzMzJyMiAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKQEAgLTc1LDc1ICs3NSw3NSBAQAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzLWxpbnV4LWdudSAtbW5vLW1pcHMxNiAtbWlwczE2IC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUy0xNiAlcwotLy8gTUlQUy0xNjogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMiIgIi1tYWJpIiAiMzIiICItRUIiICItbWlwczE2IgorLy8gTUlQUy0xNjogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMnIyIiAiLW1hYmkiICIzMiIgIi1FQiIgIi1taXBzMTYiCiAvLwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzLWxpbnV4LWdudSAtbWlwczE2IC1tbm8tbWlwczE2IC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUy1OMTYgJXMKIC8vIE1JUFMtTjE2OiBhc3t7KC5leGUpP319IgotLy8gTUlQUy1OMTYtTk9UOiAiLW1pcHMxNiIKKy8vIE1JUFMtTjE2LU5PVDogInt7WyBBLVphLXpcXFwvXSp9fWFze3soLmV4ZSk/fX17ey4qfX0iLW1pcHMxNiIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHMtbGludXgtZ251IC1tbm8tbWljcm9taXBzIC1tbWljcm9taXBzIC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUy1NSUNSTyAlcwotLy8gTUlQUy1NSUNSTzogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMiIgIi1tYWJpIiAiMzIiICItRUIiICItbW1pY3JvbWlwcyIKKy8vIE1JUFMtTUlDUk86IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzJyMiIgIi1tYWJpIiAiMzIiICItRUIiICItbW1pY3JvbWlwcyIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHMtbGludXgtZ251IC1tbWljcm9taXBzIC1tbm8tbWljcm9taXBzIC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUy1OTUlDUk8gJXMKIC8vIE1JUFMtTk1JQ1JPOiBhc3t7KC5leGUpP319IgotLy8gTUlQUy1OTUlDUk8tTk9UOiAiLW1taWNyb21pcHMiCisvLyBNSVBTLU5NSUNSTy1OT1Q6IHt7W0EtWmEtelxcXC9dKn19YXN7eyguZXhlKT99fXt7Lip9fSItbW1pY3JvbWlwcyIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHMtbGludXgtZ251IC1tbm8tZHNwIC1tZHNwIC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUy1EU1AgJXMKLS8vIE1JUFMtRFNQOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMyIiAiLW1hYmkiICIzMiIgIi1FQiIgIi1tZHNwIgorLy8gTUlQUy1EU1A6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzJyMiIgIi1tYWJpIiAiMzIiICItRUIiICItbWRzcCIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHMtbGludXgtZ251IC1tZHNwIC1tbm8tZHNwIC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUy1ORFNQICVzCiAvLyBNSVBTLU5EU1A6IGFze3soLmV4ZSk/fX0iCi0vLyBNSVBTLU5EU1AtTk9UOiAiLW1kc3AiCisvLyBNSVBTLU5EU1AtTk9UOiAie3tbIEEtWmEtelxcXC9dKn19YXN7eyguZXhlKT99fXt7Lip9fSItbWRzcCIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHMtbGludXgtZ251IC1tbm8tZHNwcjIgLW1kc3ByMiAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMtRFNQUjIgJXMKLS8vIE1JUFMtRFNQUjI6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzIiICItbWFiaSIgIjMyIiAiLUVCIiAiLW1kc3ByMiIKKy8vIE1JUFMtRFNQUjI6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzJyMiIgIi1tYWJpIiAiMzIiICItRUIiICItbWRzcHIyIgogLy8KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwcy1saW51eC1nbnUgLW1kc3ByMiAtbW5vLWRzcHIyIC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUy1ORFNQUjIgJXMKIC8vIE1JUFMtTkRTUFIyOiBhc3t7KC5leGUpP319IgotLy8gTUlQUy1ORFNQUjItTk9UOiAiLW1kc3ByMiIKKy8vIE1JUFMtTkRTUFIyLU5PVDogInt7WyBBLVphLXpcXFwvXSp9fWFze3soLmV4ZSk/fX17ey4qfX0iLW1kc3ByMiIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHMtbGludXgtZ251IC1tbmFuPWxlZ2FjeSAtbW5hbj0yMDA4IC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUy1OQU4yMDA4ICVzCi0vLyBNSVBTLU5BTjIwMDg6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzIiICItbWFiaSIgIjMyIiAiLUVCIiAiLW1uYW49MjAwOCIKKy8vIE1JUFMtTkFOMjAwODogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMnIyIiAiLW1hYmkiICIzMiIgIi1FQiIgIi1tbmFuPTIwMDgiCiAvLwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzLWxpbnV4LWdudSAtbW5hbj0yMDA4IC1tbmFuPWxlZ2FjeSAtIyMjIFwKIC8vIFJVTjogICAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMtTkFOLUxFR0FDWSAlcwogLy8gTUlQUy1OQU4tTEVHQUNZOiBhc3t7KC5leGUpP319IgotLy8gTUlQUy1OQU5fTEVHQUNZLU5PVDogIi1tbmFuPXt7Lip9fSIKKy8vIE1JUFMtTkFOLUxFR0FDWS1OT1Q6ICJ7e1sgQS1aYS16XFxcL10qfX1hc3t7KC5leGUpP319e3suKn19Ii1tbmFuPXt7Lip9fSIKIC8vCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IG1pcHMtbGludXgtZ251IC1tZnA2NCAtbWZwMzIgLSMjIyBcCiAvLyBSVU46ICAgLW5vLWludGVncmF0ZWQtYXMgLWMgJXMgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTLU1GUDMyICVzCi0vLyBNSVBTLU1GUDMyOiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMyIiAiLW1hYmkiICIzMiIgIi1FQiIgIi1tZnAzMiIKKy8vIE1JUFMtTUZQMzI6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzJyMiIgIi1tYWJpIiAiMzIiICItRUIiICItbWZwMzIiCiAvLwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzLWxpbnV4LWdudSAtbWZwMzIgLW1mcDY0IC0jIyMgXAogLy8gUlVOOiAgIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUy1NRlA2NCAlcwotLy8gTUlQUy1NRlA2NDogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMiIgIi1tYWJpIiAiMzIiICItRUIiICItbWZwNjQiCisvLyBNSVBTLU1GUDY0OiBhc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMycjIiICItbWFiaSIgIjMyIiAiLUVCIiAiLW1mcDY0IgogLy8KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwcy1saW51eC1nbnUgLW1uby1tc2EgLW1tc2EgLSMjIyBcCiAvLyBSVU46ICAgLW5vLWludGVncmF0ZWQtYXMgLWMgJXMgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTLU1TQSAlcwotLy8gTUlQUy1NU0E6IGFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzIiICItbWFiaSIgIjMyIiAiLUVCIiAiLW1tc2EiCisvLyBNSVBTLU1TQTogYXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMnIyIiAiLW1hYmkiICIzMiIgIi1FQiIgIi1tbXNhIgogLy8KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwcy1saW51eC1nbnUgLW1tc2EgLW1uby1tc2EgLSMjIyBcCiAvLyBSVU46ICAgLW5vLWludGVncmF0ZWQtYXMgLWMgJXMgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTLU5NU0EgJXMKIC8vIE1JUFMtTk1TQTogYXN7eyguZXhlKT99fSIKLS8vIE1JUFMtTk1TQS1OT1Q6ICItbW1zYSIKKy8vIE1JUFMtTk1TQS1OT1Q6ICJ7e1sgQS1aYS16XFxcL10qfX1hc3t7KC5leGUpP319e3suKn19Ii1tbXNhIgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvbWlwcy1jcy1oZWFkZXItc2VhcmNoLmNwcCBiL3Rlc3QvRHJpdmVyL21pcHMtY3MtaGVhZGVyLXNlYXJjaC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzgwMzEuLjAwMDAwMDAKLS0tIGEvdGVzdC9Ecml2ZXIvbWlwcy1jcy1oZWFkZXItc2VhcmNoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vLyBDaGVjayBmcm9udGVuZCBpbnZvY2F0aW9ucyBvbiBNZW50b3IgR3JhcGhpY3MgTUlQUyB0b29sY2hhaW4uCi0vLwotLy8gPSBCaWctZW5kaWFuLCBoYXJkIGZsb2F0Ci0vLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLWMgLW8gJXQubyAyPiYxIFwKLS8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHMtbGludXgtZ251IFwKLS8vIFJVTjogICAgIC0tZ2NjLXRvb2xjaGFpbj0lUy9JbnB1dHMvbWlwc19jc190cmVlIFwKLS8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1IRi0zMiAlcwotLy8gQ0hFQ0stQkUtSEYtMzI6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUJFLUhGLTMyOiAiW1tUQzpbXiJdKy9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMiCi0vLyBDSEVDSy1CRS1IRi0zMjogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtSEYtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvbWlwcy1saW51eC1nbnUiCi0vLyBDSEVDSy1CRS1IRi0zMjogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtSEYtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvYmFja3dhcmQiCi0vLyBDSEVDSy1CRS1IRi0zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1IRi0zMjogIltbVENdXS9pbmNsdWRlIgotLy8gQ0hFQ0stQkUtSEYtMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtSEYtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvaW5jbHVkZSIKLS8vCi0vLyA9IEJpZy1lbmRpYW4sIGhhcmQgZmxvYXQsIG1pcHMxNgotLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1jIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1taXBzLWxpbnV4LWdudSAtbWlwczE2IFwKLS8vIFJVTjogICAgIC0tZ2NjLXRvb2xjaGFpbj0lUy9JbnB1dHMvbWlwc19jc190cmVlIFwKLS8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1IRi0xNiAlcwotLy8gQ0hFQ0stQkUtSEYtMTY6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUJFLUhGLTE2OiAiW1tUQzpbXiJdKy9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMiCi0vLyBDSEVDSy1CRS1IRi0xNjogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtSEYtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvbWlwcy1saW51eC1nbnUvbWlwczE2IgotLy8gQ0hFQ0stQkUtSEYtMTY6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUJFLUhGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgotLy8gQ0hFQ0stQkUtSEYtMTY6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtSEYtMTY6ICJbW1RDXV0vaW5jbHVkZSIKLS8vIENIRUNLLUJFLUhGLTE2OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUJFLUhGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCi0vLwotLy8gPSBCaWctZW5kaWFuLCBoYXJkIGZsb2F0LCBtaWNyb21pcHMKLS8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtYyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwcy1saW51eC1nbnUgLW1taWNyb21pcHMgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJFLUhGLU1JQ1JPICVzCi0vLyBDSEVDSy1CRS1IRi1NSUNSTzogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKLS8vIENIRUNLLUJFLUhGLU1JQ1JPOiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1IRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9taWNyb21pcHMiCi0vLyBDSEVDSy1CRS1IRi1NSUNSTzogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvYmFja3dhcmQiCi0vLyBDSEVDSy1CRS1IRi1NSUNSTzogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1IRi1NSUNSTzogIltbVENdXS9pbmNsdWRlIgotLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvaW5jbHVkZSIKLS8vCi0vLyA9IEJpZy1lbmRpYW4sIHNvZnQgZmxvYXQKLS8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtYyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwcy1saW51eC1nbnUgLW1zb2Z0LWZsb2F0IFwKLS8vIFJVTjogICAgIC0tZ2NjLXRvb2xjaGFpbj0lUy9JbnB1dHMvbWlwc19jc190cmVlIFwKLS8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1TRi0zMiAlcwotLy8gQ0hFQ0stQkUtU0YtMzI6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUJFLVNGLTMyOiAiW1tUQzpbXiJdKy9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMiCi0vLyBDSEVDSy1CRS1TRi0zMjogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtU0YtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvbWlwcy1saW51eC1nbnUvc29mdC1mbG9hdCIKLS8vIENIRUNLLUJFLVNGLTMyOiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1TRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKLS8vIENIRUNLLUJFLVNGLTMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUJFLVNGLTMyOiAiW1tUQ11dL2luY2x1ZGUiCi0vLyBDSEVDSy1CRS1TRi0zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1TRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgotLy8KLS8vID0gQmlnLWVuZGlhbiwgc29mdCBmbG9hdCwgbWlwczE2Ci0vLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLWMgLW8gJXQubyAyPiYxIFwKLS8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHMtbGludXgtZ251IC1tc29mdC1mbG9hdCAtbWlwczE2IFwKLS8vIFJVTjogICAgIC0tZ2NjLXRvb2xjaGFpbj0lUy9JbnB1dHMvbWlwc19jc190cmVlIFwKLS8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1TRi0xNiAlcwotLy8gQ0hFQ0stQkUtU0YtMTY6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUJFLVNGLTE2OiAiW1tUQzpbXiJdKy9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMiCi0vLyBDSEVDSy1CRS1TRi0xNjogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtU0YtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvbWlwcy1saW51eC1nbnUvbWlwczE2L3NvZnQtZmxvYXQiCi0vLyBDSEVDSy1CRS1TRi0xNjogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtU0YtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvYmFja3dhcmQiCi0vLyBDSEVDSy1CRS1TRi0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1TRi0xNjogIltbVENdXS9pbmNsdWRlIgotLy8gQ0hFQ0stQkUtU0YtMTY6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtU0YtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvaW5jbHVkZSIKLS8vCi0vLyA9IEJpZy1lbmRpYW4sIHNvZnQgZmxvYXQsIG1pY3JvbWlwcwotLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1jIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1taXBzLWxpbnV4LWdudSAtbXNvZnQtZmxvYXQgLW1taWNyb21pcHMgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJFLVNGLU1JQ1JPICVzCi0vLyBDSEVDSy1CRS1TRi1NSUNSTzogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtU0YtTUlDUk86ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKLS8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1TRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9taWNyb21pcHMvc29mdC1mbG9hdCIKLS8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1TRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKLS8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiW1tUQ11dL2luY2x1ZGUiCi0vLyBDSEVDSy1CRS1TRi1NSUNSTzogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1TRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgotLy8KLS8vID0gQmlnLWVuZGlhbiwgaGFyZCBmbG9hdCwgNjQtYml0Ci0vLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLWMgLW8gJXQubyAyPiYxIFwKLS8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHM2NC1saW51eC1nbnUgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJFLUhGLTY0ICVzCi0vLyBDSEVDSy1CRS1IRi02NDogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtSEYtNjQ6ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKLS8vIENIRUNLLUJFLUhGLTY0OiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1IRi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS82NCIKLS8vIENIRUNLLUJFLUhGLTY0OiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1IRi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKLS8vIENIRUNLLUJFLUhGLTY0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUJFLUhGLTY0OiAiW1tUQ11dL2luY2x1ZGUiCi0vLyBDSEVDSy1CRS1IRi02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1IRi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgotLy8KLS8vID0gQmlnLWVuZGlhbiwgc29mdCBmbG9hdCwgNjQtYml0Ci0vLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLWMgLW8gJXQubyAyPiYxIFwKLS8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHM2NC1saW51eC1nbnUgLW1zb2Z0LWZsb2F0IFwKLS8vIFJVTjogICAgIC0tZ2NjLXRvb2xjaGFpbj0lUy9JbnB1dHMvbWlwc19jc190cmVlIFwKLS8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1TRi02NCAlcwotLy8gQ0hFQ0stQkUtU0YtNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUJFLVNGLTY0OiAiW1tUQzpbXiJdKy9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMiCi0vLyBDSEVDSy1CRS1TRi02NDogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stQkUtU0YtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvbWlwcy1saW51eC1nbnUvc29mdC1mbG9hdC82NCIKLS8vIENIRUNLLUJFLVNGLTY0OiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1TRi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKLS8vIENIRUNLLUJFLVNGLTY0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUJFLVNGLTY0OiAiW1tUQ11dL2luY2x1ZGUiCi0vLyBDSEVDSy1CRS1TRi02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCi0vLyBDSEVDSy1CRS1TRi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgotLy8KLS8vID0gTGl0dGxlLWVuZGlhbiwgaGFyZCBmbG9hdAotLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1jIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1taXBzZWwtbGludXgtZ251IC1taGFyZC1mbG9hdCBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRUwtSEYtMzIgJXMKLS8vIENIRUNLLUVMLUhGLTMyOiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1IRi0zMjogIltbVEM6W14iXSsvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zIgotLy8gQ0hFQ0stRUwtSEYtMzI6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUVMLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL21pcHMtbGludXgtZ251L2VsIgotLy8gQ0hFQ0stRUwtSEYtMzI6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUVMLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgotLy8gQ0hFQ0stRUwtSEYtMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgotLy8gQ0hFQ0stRUwtSEYtMzI6ICJbW1RDXV0vaW5jbHVkZSIKLS8vIENIRUNLLUVMLUhGLTMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUVMLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCi0vLwotLy8gPSBMaXR0bGUtZW5kaWFuLCBoYXJkIGZsb2F0LCBtaXBzMTYKLS8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtYyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwc2VsLWxpbnV4LWdudSAtbWlwczE2IFwKLS8vIFJVTjogICAgIC0tZ2NjLXRvb2xjaGFpbj0lUy9JbnB1dHMvbWlwc19jc190cmVlIFwKLS8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1FTC1IRi0xNiAlcwotLy8gQ0hFQ0stRUwtSEYtMTY6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUVMLUhGLTE2OiAiW1tUQzpbXiJdKy9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMiCi0vLyBDSEVDSy1FTC1IRi0xNjogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stRUwtSEYtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvbWlwcy1saW51eC1nbnUvbWlwczE2L2VsIgotLy8gQ0hFQ0stRUwtSEYtMTY6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUVMLUhGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgotLy8gQ0hFQ0stRUwtSEYtMTY6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgotLy8gQ0hFQ0stRUwtSEYtMTY6ICJbW1RDXV0vaW5jbHVkZSIKLS8vIENIRUNLLUVMLUhGLTE2OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUVMLUhGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCi0vLwotLy8gPSBMaXR0bGUtZW5kaWFuLCBoYXJkIGZsb2F0LCBtaWNyb21pcHMKLS8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtYyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwc2VsLWxpbnV4LWdudSAtbW1pY3JvbWlwcyBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRUwtSEYtTUlDUk8gJXMKLS8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1IRi1NSUNSTzogIltbVEM6W14iXSsvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zIgotLy8gQ0hFQ0stRUwtSEYtTUlDUk86ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL21pcHMtbGludXgtZ251L21pY3JvbWlwcy9lbCIKLS8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1IRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKLS8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiW1tUQ11dL2luY2x1ZGUiCi0vLyBDSEVDSy1FTC1IRi1NSUNSTzogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1IRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgotLy8KLS8vID0gTGl0dGxlLWVuZGlhbiwgc29mdCBmbG9hdAotLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1jIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1taXBzZWwtbGludXgtZ251IC1tZmxvYXQtYWJpPXNvZnQgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUVMLVNGLTMyICVzCi0vLyBDSEVDSy1FTC1TRi0zMjogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stRUwtU0YtMzI6ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKLS8vIENIRUNLLUVMLVNGLTMyOiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1TRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9zb2Z0LWZsb2F0L2VsIgotLy8gQ0hFQ0stRUwtU0YtMzI6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUVMLVNGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgotLy8gQ0hFQ0stRUwtU0YtMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgotLy8gQ0hFQ0stRUwtU0YtMzI6ICJbW1RDXV0vaW5jbHVkZSIKLS8vIENIRUNLLUVMLVNGLTMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUVMLVNGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCi0vLwotLy8gPSBMaXR0bGUtZW5kaWFuLCBzb2Z0IGZsb2F0LCBtaXBzMTYKLS8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtYyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwc2VsLWxpbnV4LWdudSAtbWlwczE2IC1tc29mdC1mbG9hdCBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRUwtU0YtMTYgJXMKLS8vIENIRUNLLUVMLVNGLTE2OiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1TRi0xNjogIltbVEM6W14iXSsvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zIgotLy8gQ0hFQ0stRUwtU0YtMTY6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUVMLVNGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL21pcHMtbGludXgtZ251L21pcHMxNi9zb2Z0LWZsb2F0L2VsIgotLy8gQ0hFQ0stRUwtU0YtMTY6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUVMLVNGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgotLy8gQ0hFQ0stRUwtU0YtMTY6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgotLy8gQ0hFQ0stRUwtU0YtMTY6ICJbW1RDXV0vaW5jbHVkZSIKLS8vIENIRUNLLUVMLVNGLTE2OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUVMLVNGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCi0vLwotLy8gPSBMaXR0bGUtZW5kaWFuLCBzb2Z0IGZsb2F0LCBtaWNyb21pcHMKLS8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtYyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwc2VsLWxpbnV4LWdudSAtbW1pY3JvbWlwcyAtbXNvZnQtZmxvYXQgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUVMLVNGLU1JQ1JPICVzCi0vLyBDSEVDSy1FTC1TRi1NSUNSTzogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stRUwtU0YtTUlDUk86ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKLS8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1TRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9taWNyb21pcHMvc29mdC1mbG9hdC9lbCIKLS8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1TRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKLS8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiW1tUQ11dL2luY2x1ZGUiCi0vLyBDSEVDSy1FTC1TRi1NSUNSTzogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1TRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgotLy8KLS8vID0gTGl0dGxlLWVuZGlhbiwgaGFyZCBmbG9hdCwgNjQtYml0Ci0vLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLWMgLW8gJXQubyAyPiYxIFwKLS8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHM2NGVsLWxpbnV4LWdudSBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRUwtSEYtNjQgJXMKLS8vIENIRUNLLUVMLUhGLTY0OiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1IRi02NDogIltbVEM6W14iXSsvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zIgotLy8gQ0hFQ0stRUwtSEYtNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUVMLUhGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL21pcHMtbGludXgtZ251L2VsLzY0IgotLy8gQ0hFQ0stRUwtSEYtNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUVMLUhGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgotLy8gQ0hFQ0stRUwtSEYtNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgotLy8gQ0hFQ0stRUwtSEYtNjQ6ICJbW1RDXV0vaW5jbHVkZSIKLS8vIENIRUNLLUVMLUhGLTY0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKLS8vIENIRUNLLUVMLUhGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCi0vLwotLy8gPSBMaXR0bGUtZW5kaWFuLCBzb2Z0IGZsb2F0LCA2NC1iaXQKLS8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtYyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwczY0ZWwtbGludXgtZ251IC1tc29mdC1mbG9hdCBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRUwtU0YtNjQgJXMKLS8vIENIRUNLLUVMLVNGLTY0OiAiLWludGVybmFsLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1TRi02NDogIltbVEM6W14iXSsvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zIgotLy8gQ0hFQ0stRUwtU0YtNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIKLS8vIENIRUNLLUVMLVNGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL21pcHMtbGludXgtZ251L3NvZnQtZmxvYXQvZWwvNjQiCi0vLyBDSEVDSy1FTC1TRi02NDogIi1pbnRlcm5hbC1pc3lzdGVtIgotLy8gQ0hFQ0stRUwtU0YtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvYmFja3dhcmQiCi0vLyBDSEVDSy1FTC1TRi02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCi0vLyBDSEVDSy1FTC1TRi02NDogIltbVENdXS9pbmNsdWRlIgotLy8gQ0hFQ0stRUwtU0YtNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgotLy8gQ0hFQ0stRUwtU0YtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvaW5jbHVkZSIKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL21pcHMtY3MtbGQuYyBiL3Rlc3QvRHJpdmVyL21pcHMtY3MtbGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiZDVjOC4uMDAwMDAwMAotLS0gYS90ZXN0L0RyaXZlci9taXBzLWNzLWxkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLy8gQ2hlY2sgbGQgaW52b2NhdGlvbnMgb24gTWVudG9yIEdyYXBoaWNzIE1JUFMgdG9vbGNoYWluLgotLy8KLS8vID0gQmlnLWVuZGlhbiwgaGFyZCBmbG9hdAotLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1taXBzLWxpbnV4LWdudSBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtSEYtMzIgJXMKLS8vIENIRUNLLUJFLUhGLTMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLUhGLTMyOiAiLS1zeXNyb290PVtbVEM6W14iXStdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjIgotLy8gQ0hFQ0stQkUtSEYtMzI6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKLS8vIENIRUNLLUJFLUhGLTMyOiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCi0vLyBDSEVDSy1CRS1IRi0zMjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4ze3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1IRi0zMjogIi1MW1tUQ11dIgotLy8gQ0hFQ0stQkUtSEYtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWIvLi4vbGliIgotLy8gQ0hFQ0stQkUtSEYtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2xpYiIKLS8vIENIRUNLLUJFLUhGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvbGliIgotLy8gQ0hFQ0stQkUtSEYtMzI6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM3t7L3xcXFxcfX1jcnRlbmQubyIKLS8vIENIRUNLLUJFLUhGLTMyOiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCi0vLwotLy8gPSBCaWctZW5kaWFuLCBoYXJkIGZsb2F0LCBtaXBzMTYKLS8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwcy1saW51eC1nbnUgLW1pcHMxNiBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtSEYtMTYgJXMKLS8vIENIRUNLLUJFLUhGLTE2OiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLUhGLTE2OiAiLS1zeXNyb290PVtbVEM6W14iXStdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNiIKLS8vIENIRUNLLUJFLUhGLTE2OiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgotLy8gQ0hFQ0stQkUtSEYtMTY6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCi0vLyBDSEVDSy1CRS1IRi0xNjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL21pcHMxNnt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtSEYtMTY6ICItTFtbVENdXS9taXBzMTYiCi0vLyBDSEVDSy1CRS1IRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2IgotLy8gQ0hFQ0stQkUtSEYtMTYtTk9UOiAiLUxbW1RDXV0iCi0vLyBDSEVDSy1CRS1IRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L2xpYi8uLi9saWIiCi0vLyBDSEVDSy1CRS1IRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L3Vzci9saWIvLi4vbGliIgotLy8gQ0hFQ0stQkUtSEYtMTY6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9taXBzMTZ7ey98XFxcXH19Y3J0ZW5kLm8iCi0vLyBDSEVDSy1CRS1IRi0xNjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKLS8vCi0vLyA9IEJpZy1lbmRpYW4sIGhhcmQgZmxvYXQsIG1taWNyb21pcHMKLS8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwcy1saW51eC1nbnUgLW1taWNyb21pcHMgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJFLUhGLU1JQ1JPICVzCi0vLyBDSEVDSy1CRS1IRi1NSUNSTzogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1IRi1NSUNSTzogIi0tc3lzcm9vdD1bW1RDOlteIl0rXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMiCi0vLyBDSEVDSy1CRS1IRi1NSUNSTzogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKLS8vIENIRUNLLUJFLUhGLU1JQ1JPOiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgotLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9taWNyb21pcHN7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLUhGLU1JQ1JPOiAiLUxbW1RDXV0vbWljcm9taXBzIgotLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWIvLi4vbGliL21pY3JvbWlwcyIKLS8vIENIRUNLLUJFLUhGLU1JQ1JPLU5PVDogIi1MW1tUQ11dIgotLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9saWIvLi4vbGliIgotLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy91c3IvbGliLy4uL2xpYiIKLS8vIENIRUNLLUJFLUhGLU1JQ1JPOiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvbWljcm9taXBze3svfFxcXFx9fWNydGVuZC5vIgotLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCi0vLwotLy8gPSBCaWctZW5kaWFuLCBzb2Z0IGZsb2F0Ci0vLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKLS8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHMtbGludXgtZ251IC1tc29mdC1mbG9hdCBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtU0YtMzIgJXMKLS8vIENIRUNLLUJFLVNGLTMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLVNGLTMyOiAiLS1zeXNyb290PVtbVEM6W14iXStdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQiCi0vLyBDSEVDSy1CRS1TRi0zMjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCi0vLyBDSEVDSy1CRS1TRi0zMjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCi0vLyBDSEVDSy1CRS1TRi0zMjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL3NvZnQtZmxvYXR7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLVNGLTMyOiAiLUxbW1RDXV0vc29mdC1mbG9hdCIKLS8vIENIRUNLLUJFLVNGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliLy4uL2xpYi9zb2Z0LWZsb2F0IgotLy8gQ0hFQ0stQkUtU0YtMzItTk9UOiAiLUxbW1RDXV0iCi0vLyBDSEVDSy1CRS1TRi0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC9saWIvLi4vbGliIgotLy8gQ0hFQ0stQkUtU0YtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvdXNyL2xpYi8uLi9saWIiCi0vLyBDSEVDSy1CRS1TRi0zMjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL3NvZnQtZmxvYXR7ey98XFxcXH19Y3J0ZW5kLm8iCi0vLyBDSEVDSy1CRS1TRi0zMjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCi0vLwotLy8gPSBCaWctZW5kaWFuLCBzb2Z0IGZsb2F0LCBtaXBzMTYKLS8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwcy1saW51eC1nbnUgLW1zb2Z0LWZsb2F0IC1taXBzMTYgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJFLVNGLTE2ICVzCi0vLyBDSEVDSy1CRS1TRi0xNjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1TRi0xNjogIi0tc3lzcm9vdD1bW1RDOlteIl0rXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvc29mdC1mbG9hdCIKLS8vIENIRUNLLUJFLVNGLTE2OiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvc29mdC1mbG9hdC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCi0vLyBDSEVDSy1CRS1TRi0xNjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L3NvZnQtZmxvYXQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgotLy8gQ0hFQ0stQkUtU0YtMTY6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9taXBzMTYvc29mdC1mbG9hdHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtU0YtMTY6ICItTFtbVENdXS9taXBzMTYvc29mdC1mbG9hdCIKLS8vIENIRUNLLUJFLVNGLTE2OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMTYvc29mdC1mbG9hdCIKLS8vIENIRUNLLUJFLVNGLTE2LU5PVDogIi1MW1tUQ11dIgotLy8gQ0hFQ0stQkUtU0YtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9zb2Z0LWZsb2F0L2xpYi8uLi9saWIiCi0vLyBDSEVDSy1CRS1TRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L3NvZnQtZmxvYXQvdXNyL2xpYi8uLi9saWIiCi0vLyBDSEVDSy1CRS1TRi0xNjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL21pcHMxNi9zb2Z0LWZsb2F0e3svfFxcXFx9fWNydGVuZC5vIgotLy8gQ0hFQ0stQkUtU0YtMTY6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKLS8vCi0vLyA9IEJpZy1lbmRpYW4sIHNvZnQgZmxvYXQsIG1pY3JvbWlwcwotLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1taXBzLWxpbnV4LWdudSAtbXNvZnQtZmxvYXQgLW1taWNyb21pcHMgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJFLVNGLU1JQ1JPICVzCi0vLyBDSEVDSy1CRS1TRi1NSUNSTzogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1TRi1NSUNSTzogIi0tc3lzcm9vdD1bW1RDOlteIl0rXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvc29mdC1mbG9hdCIKLS8vIENIRUNLLUJFLVNGLU1JQ1JPOiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvc29mdC1mbG9hdC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCi0vLyBDSEVDSy1CRS1TRi1NSUNSTzogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL3NvZnQtZmxvYXQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgotLy8gQ0hFQ0stQkUtU0YtTUlDUk86ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9taWNyb21pcHMvc29mdC1mbG9hdHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtU0YtTUlDUk86ICItTFtbVENdXS9taWNyb21pcHMvc29mdC1mbG9hdCIKLS8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliLy4uL2xpYi9taWNyb21pcHMvc29mdC1mbG9hdCIKLS8vIENIRUNLLUJFLVNGLU1JQ1JPLU5PVDogIi1MW1tUQ11dIgotLy8gQ0hFQ0stQkUtU0YtTUlDUk86ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9zb2Z0LWZsb2F0L2xpYi8uLi9saWIiCi0vLyBDSEVDSy1CRS1TRi1NSUNSTzogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL3NvZnQtZmxvYXQvdXNyL2xpYi8uLi9saWIiCi0vLyBDSEVDSy1CRS1TRi1NSUNSTzogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL21pY3JvbWlwcy9zb2Z0LWZsb2F0e3svfFxcXFx9fWNydGVuZC5vIgotLy8gQ0hFQ0stQkUtU0YtTUlDUk86ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKLS8vCi0vLyA9IEJpZy1lbmRpYW4sIGhhcmQgZmxvYXQsIDY0LWJpdAotLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1taXBzNjQtbGludXgtZ251IFwKLS8vIFJVTjogICAgIC0tZ2NjLXRvb2xjaGFpbj0lUy9JbnB1dHMvbWlwc19jc190cmVlIFwKLS8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1IRi02NCAlcwotLy8gQ0hFQ0stQkUtSEYtNjQ6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtSEYtNjQ6ICItLXN5c3Jvb3Q9W1tUQzpbXiJdK11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMiCi0vLyBDSEVDSy1CRS1IRi02NDogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2xpYi8uLi9saWI2NHt7L3xcXFxcfX1jcnQxLm8iCi0vLyBDSEVDSy1CRS1IRi02NDogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2xpYi8uLi9saWI2NHt7L3xcXFxcfX1jcnRpLm8iCi0vLyBDSEVDSy1CRS1IRi02NDogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLzY0e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1IRi02NDogIi1MW1tUQ11dLzY0IgotLy8gQ0hFQ0stQkUtSEYtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWIvLi4vbGliNjQiCi0vLyBDSEVDSy1CRS1IRi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbGliLy4uL2xpYjY0IgotLy8gQ0hFQ0stQkUtSEYtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9saWIvLi4vbGliNjQiCi0vLyBDSEVDSy1CRS1IRi02NC1OT1Q6ICItTFtbVENdXSIKLS8vIENIRUNLLUJFLUhGLTY0OiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvNjR7ey98XFxcXH19Y3J0ZW5kLm8iCi0vLyBDSEVDSy1CRS1IRi02NDogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2xpYi8uLi9saWI2NHt7L3xcXFxcfX1jcnRuLm8iCi0vLwotLy8gPSBCaWctZW5kaWFuLCBzb2Z0IGZsb2F0LCA2NC1iaXQKLS8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAotLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwczY0LWxpbnV4LWdudSAtbXNvZnQtZmxvYXQgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJFLVNGLTY0ICVzCi0vLyBDSEVDSy1CRS1TRi02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1TRi02NDogIi0tc3lzcm9vdD1bW1RDOlteIl0rXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0IgotLy8gQ0hFQ0stQkUtU0YtNjQ6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvdXNyL2xpYi8uLi9saWI2NHt7L3xcXFxcfX1jcnQxLm8iCi0vLyBDSEVDSy1CRS1TRi02NDogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC91c3IvbGliLy4uL2xpYjY0e3svfFxcXFx9fWNydGkubyIKLS8vIENIRUNLLUJFLVNGLTY0OiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvc29mdC1mbG9hdC82NHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtU0YtNjQ6ICItTFtbVENdXS9zb2Z0LWZsb2F0LzY0IgotLy8gQ0hFQ0stQkUtU0YtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWIvLi4vbGliNjQvc29mdC1mbG9hdCIKLS8vIENIRUNLLUJFLVNGLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2xpYi8uLi9saWI2NCIKLS8vIENIRUNLLUJFLVNGLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGliNjQiCi0vLyBDSEVDSy1CRS1TRi02NC1OT1Q6ICItTFtbVENdXSIKLS8vIENIRUNLLUJFLVNGLTY0OiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvc29mdC1mbG9hdC82NHt7L3xcXFxcfX1jcnRlbmQubyIKLS8vIENIRUNLLUJFLVNGLTY0OiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGliNjR7ey98XFxcXH19Y3J0bi5vIgotLy8KLS8vID0gTGl0dGxlLWVuZGlhbiwgaGFyZCBmbG9hdAotLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1taXBzZWwtbGludXgtZ251IC1taGFyZC1mbG9hdCBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRUwtSEYtMzIgJXMKLS8vIENIRUNLLUVMLUhGLTMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLUhGLTMyOiAiLS1zeXNyb290PVtbVEM6W14iXStdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsIgotLy8gQ0hFQ0stRUwtSEYtMzI6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKLS8vIENIRUNLLUVMLUhGLTMyOiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9lbC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCi0vLyBDSEVDSy1FTC1IRi0zMjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL2Vse3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1IRi0zMjogIi1MW1tUQ11dL2VsIgotLy8gQ0hFQ0stRUwtSEYtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWIvLi4vbGliL2VsIgotLy8gQ0hFQ0stRUwtSEYtMzItTk9UOiAiLUxbW1RDXV0iCi0vLyBDSEVDSy1FTC1IRi0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvZWwvbGliLy4uL2xpYiIKLS8vIENIRUNLLUVMLUhGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9lbC91c3IvbGliLy4uL2xpYiIKLS8vIENIRUNLLUVMLUhGLTMyOiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvZWx7ey98XFxcXH19Y3J0ZW5kLm8iCi0vLyBDSEVDSy1FTC1IRi0zMjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgotLy8KLS8vID0gTGl0dGxlLWVuZGlhbiwgaGFyZCBmbG9hdCwgbWlwczE2Ci0vLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKLS8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHNlbC1saW51eC1nbnUgLW1pcHMxNiBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRUwtSEYtMTYgJXMKLS8vIENIRUNLLUVMLUhGLTE2OiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLUhGLTE2OiAiLS1zeXNyb290PVtbVEM6W14iXStdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9lbCIKLS8vIENIRUNLLUVMLUhGLTE2OiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgotLy8gQ0hFQ0stRUwtSEYtMTY6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9lbC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCi0vLyBDSEVDSy1FTC1IRi0xNjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL21pcHMxNi9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtSEYtMTY6ICItTFtbVENdXS9taXBzMTYvZWwiCi0vLyBDSEVDSy1FTC1IRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2L2VsIgotLy8gQ0hFQ0stRUwtSEYtMTYtTk9UOiAiLUxbW1RDXV0iCi0vLyBDSEVDSy1FTC1IRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L2VsL2xpYi8uLi9saWIiCi0vLyBDSEVDSy1FTC1IRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L2VsL3Vzci9saWIvLi4vbGliIgotLy8gQ0hFQ0stRUwtSEYtMTY6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9taXBzMTYvZWx7ey98XFxcXH19Y3J0ZW5kLm8iCi0vLyBDSEVDSy1FTC1IRi0xNjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKLS8vCi0vLyA9IExpdHRsZS1lbmRpYW4sIGhhcmQgZmxvYXQsIG1pY3JvbWlwcwotLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1taXBzZWwtbGludXgtZ251IC1tbWljcm9taXBzIFwKLS8vIFJVTjogICAgIC0tZ2NjLXRvb2xjaGFpbj0lUy9JbnB1dHMvbWlwc19jc190cmVlIFwKLS8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1FTC1IRi1NSUNSTyAlcwotLy8gQ0hFQ0stRUwtSEYtTUlDUk86ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtSEYtTUlDUk86ICItLXN5c3Jvb3Q9W1tUQzpbXiJdK11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL2VsIgotLy8gQ0hFQ0stRUwtSEYtTUlDUk86ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9lbC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCi0vLyBDSEVDSy1FTC1IRi1NSUNSTzogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKLS8vIENIRUNLLUVMLUhGLU1JQ1JPOiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvbWljcm9taXBzL2Vse3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1IRi1NSUNSTzogIi1MW1tUQ11dL21pY3JvbWlwcy9lbCIKLS8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliLy4uL2xpYi9taWNyb21pcHMvZWwiCi0vLyBDSEVDSy1FTC1IRi1NSUNSTy1OT1Q6ICItTFtbVENdXSIKLS8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvZWwvbGliLy4uL2xpYiIKLS8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvZWwvdXNyL2xpYi8uLi9saWIiCi0vLyBDSEVDSy1FTC1IRi1NSUNSTzogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL21pY3JvbWlwcy9lbHt7L3xcXFxcfX1jcnRlbmQubyIKLS8vIENIRUNLLUVMLUhGLU1JQ1JPOiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgotLy8KLS8vID0gTGl0dGxlLWVuZGlhbiwgc29mdCBmbG9hdAotLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1taXBzZWwtbGludXgtZ251IC1tZmxvYXQtYWJpPXNvZnQgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUVMLVNGLTMyICVzCi0vLyBDSEVDSy1FTC1TRi0zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1TRi0zMjogIi0tc3lzcm9vdD1bW1RDOlteIl0rXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsIgotLy8gQ0hFQ0stRUwtU0YtMzI6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgotLy8gQ0hFQ0stRUwtU0YtMzI6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgotLy8gQ0hFQ0stRUwtU0YtMzI6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9zb2Z0LWZsb2F0L2Vse3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1TRi0zMjogIi1MW1tUQ11dL3NvZnQtZmxvYXQvZWwiCi0vLyBDSEVDSy1FTC1TRi0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWIvc29mdC1mbG9hdC9lbCIKLS8vIENIRUNLLUVMLVNGLTMyLU5PVDogIi1MW1tUQ11dIgotLy8gQ0hFQ0stRUwtU0YtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvZWwvbGliLy4uL2xpYiIKLS8vIENIRUNLLUVMLVNGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsL3Vzci9saWIvLi4vbGliIgotLy8gQ0hFQ0stRUwtU0YtMzI6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9zb2Z0LWZsb2F0L2Vse3svfFxcXFx9fWNydGVuZC5vIgotLy8gQ0hFQ0stRUwtU0YtMzI6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgotLy8KLS8vID0gTGl0dGxlLWVuZGlhbiwgc29mdCBmbG9hdCwgbWlwczE2Ci0vLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKLS8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHNlbC1saW51eC1nbnUgLW1pcHMxNiAtbXNvZnQtZmxvYXQgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUVMLVNGLTE2ICVzCi0vLyBDSEVDSy1FTC1TRi0xNjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1TRi0xNjogIi0tc3lzcm9vdD1bW1RDOlteIl0rXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvc29mdC1mbG9hdC9lbCIKLS8vIENIRUNLLUVMLVNGLTE2OiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvc29mdC1mbG9hdC9lbC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCi0vLyBDSEVDSy1FTC1TRi0xNjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgotLy8gQ0hFQ0stRUwtU0YtMTY6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9taXBzMTYvc29mdC1mbG9hdC9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtU0YtMTY6ICItTFtbVENdXS9taXBzMTYvc29mdC1mbG9hdC9lbCIKLS8vIENIRUNLLUVMLVNGLTE2OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMTYvc29mdC1mbG9hdC9lbCIKLS8vIENIRUNLLUVMLVNGLTE2LU5PVDogIi1MW1tUQ11dIgotLy8gQ0hFQ0stRUwtU0YtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9zb2Z0LWZsb2F0L2VsL2xpYi8uLi9saWIiCi0vLyBDSEVDSy1FTC1TRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWIiCi0vLyBDSEVDSy1FTC1TRi0xNjogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL21pcHMxNi9zb2Z0LWZsb2F0L2Vse3svfFxcXFx9fWNydGVuZC5vIgotLy8gQ0hFQ0stRUwtU0YtMTY6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9zb2Z0LWZsb2F0L2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKLS8vCi0vLyA9IExpdHRsZS1lbmRpYW4sIHNvZnQgZmxvYXQsIG1pY3JvbWlwcwotLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCi0vLyBSVU46ICAgICAtLXRhcmdldD1taXBzZWwtbGludXgtZ251IC1tbWljcm9taXBzIC1tc29mdC1mbG9hdCBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRUwtU0YtTUlDUk8gJXMKLS8vIENIRUNLLUVMLVNGLU1JQ1JPOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiLS1zeXNyb290PVtbVEM6W14iXStdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9zb2Z0LWZsb2F0L2VsIgotLy8gQ0hFQ0stRUwtU0YtTUlDUk86ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9zb2Z0LWZsb2F0L2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKLS8vIENIRUNLLUVMLVNGLU1JQ1JPOiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvc29mdC1mbG9hdC9lbC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCi0vLyBDSEVDSy1FTC1TRi1NSUNSTzogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL21pY3JvbWlwcy9zb2Z0LWZsb2F0L2Vse3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1TRi1NSUNSTzogIi1MW1tUQ11dL21pY3JvbWlwcy9zb2Z0LWZsb2F0L2VsIgotLy8gQ0hFQ0stRUwtU0YtTUlDUk86ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWIvLi4vbGliL21pY3JvbWlwcy9zb2Z0LWZsb2F0L2VsIgotLy8gQ0hFQ0stRUwtU0YtTUlDUk8tTk9UOiAiLUxbW1RDXV0iCi0vLyBDSEVDSy1FTC1TRi1NSUNSTzogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL3NvZnQtZmxvYXQvZWwvbGliLy4uL2xpYiIKLS8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvc29mdC1mbG9hdC9lbC91c3IvbGliLy4uL2xpYiIKLS8vIENIRUNLLUVMLVNGLU1JQ1JPOiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvbWljcm9taXBzL3NvZnQtZmxvYXQvZWx7ey98XFxcXH19Y3J0ZW5kLm8iCi0vLyBDSEVDSy1FTC1TRi1NSUNSTzogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgotLy8KLS8vID0gTGl0dGxlLWVuZGlhbiwgaGFyZCBmbG9hdCwgNjQtYml0Ci0vLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKLS8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHM2NGVsLWxpbnV4LWdudSBcCi0vLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRUwtSEYtNjQgJXMKLS8vIENIRUNLLUVMLUhGLTY0OiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLUhGLTY0OiAiLS1zeXNyb290PVtbVEM6W14iXStdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsIgotLy8gQ0hFQ0stRUwtSEYtNjQ6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsL3Vzci9saWIvLi4vbGliNjR7ey98XFxcXH19Y3J0MS5vIgotLy8gQ0hFQ0stRUwtSEYtNjQ6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsL3Vzci9saWIvLi4vbGliNjR7ey98XFxcXH19Y3J0aS5vIgotLy8gQ0hFQ0stRUwtSEYtNjQ6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy9lbC82NHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtSEYtNjQ6ICItTFtbVENdXS9lbC82NCIKLS8vIENIRUNLLUVMLUhGLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliLy4uL2xpYjY0L2VsIgotLy8gQ0hFQ0stRUwtSEYtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsL2xpYi8uLi9saWI2NCIKLS8vIENIRUNLLUVMLUhGLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9lbC91c3IvbGliLy4uL2xpYjY0IgotLy8gQ0hFQ0stRUwtSEYtNjQtTk9UOiAiLUxbW1RDXV0iCi0vLyBDSEVDSy1FTC1IRi02NDogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zL2VsLzY0e3svfFxcXFx9fWNydGVuZC5vIgotLy8gQ0hFQ0stRUwtSEYtNjQ6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsL3Vzci9saWIvLi4vbGliNjR7ey98XFxcXH19Y3J0bi5vIgotLy8KLS8vID0gTGl0dGxlLWVuZGlhbiwgc29mdCBmbG9hdCwgNjQtYml0Ci0vLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKLS8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHM2NGVsLWxpbnV4LWdudSAtbXNvZnQtZmxvYXQgXAotLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAotLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUVMLVNGLTY0ICVzCi0vLyBDSEVDSy1FTC1TRi02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1TRi02NDogIi0tc3lzcm9vdD1bW1RDOlteIl0rXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsIgotLy8gQ0hFQ0stRUwtU0YtNjQ6ICJ7ey4qfX0vbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuMy8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWI2NHt7L3xcXFxcfX1jcnQxLm8iCi0vLyBDSEVDSy1FTC1TRi02NDogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC9lbC91c3IvbGliLy4uL2xpYjY0e3svfFxcXFx9fWNydGkubyIKLS8vIENIRUNLLUVMLVNGLTY0OiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvc29mdC1mbG9hdC9lbC82NHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtU0YtNjQ6ICItTFtbVENdXS9zb2Z0LWZsb2F0L2VsLzY0IgotLy8gQ0hFQ0stRUwtU0YtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWIvLi4vbGliNjQvc29mdC1mbG9hdC9lbCIKLS8vIENIRUNLLUVMLVNGLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsL2xpYi8uLi9saWI2NCIKLS8vIENIRUNLLUVMLVNGLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsL3Vzci9saWIvLi4vbGliNjQiCi0vLyBDSEVDSy1FTC1TRi02NC1OT1Q6ICItTFtbVENdXSIKLS8vIENIRUNLLUVMLVNGLTY0OiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvc29mdC1mbG9hdC9lbC82NHt7L3xcXFxcfX1jcnRlbmQubyIKLS8vIENIRUNLLUVMLVNGLTY0OiAie3suKn19L2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjMvLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsL3Vzci9saWIvLi4vbGliNjR7ey98XFxcXH19Y3J0bi5vIgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvbWlwcy1jcy5jcHAgYi90ZXN0L0RyaXZlci9taXBzLWNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzVkNjE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Ecml2ZXIvbWlwcy1jcy5jcHAKQEAgLTAsMCArMSw1MDQgQEAKKy8vIENoZWNrIGZyb250ZW5kIGFuZCBsaW5rZXIgaW52b2NhdGlvbnMgb24gTWVudG9yIEdyYXBoaWNzIE1JUFMgdG9vbGNoYWluLgorLy8KKy8vID0gQmlnLWVuZGlhbiwgaGFyZCBmbG9hdAorLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1taXBzLWxpbnV4LWdudSBcCisvLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtSEYtMzIgJXMKKy8vIENIRUNLLUJFLUhGLTMyOiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1IRi0zMjogIltbVEM6W14iXSsvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zIgorLy8gQ0hFQ0stQkUtSEYtMzI6ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL21pcHMtbGludXgtZ251IgorLy8gQ0hFQ0stQkUtSEYtMzI6ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgorLy8gQ0hFQ0stQkUtSEYtMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtSEYtMzI6ICJbW1RDXV0vaW5jbHVkZSIKKy8vIENIRUNLLUJFLUhGLTMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCisvLyBDSEVDSy1CRS1IRi0zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCisvLyBDSEVDSy1CRS1IRi0zMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYyIKKy8vIENIRUNLLUJFLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgorLy8gQ0hFQ0stQkUtSEYtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBDSEVDSy1CRS1IRi0zMjogIltbVENdXXt7L3xcXFxcfX1jcnRiZWdpbi5vIgorLy8gQ0hFQ0stQkUtSEYtMzI6ICItTFtbVENdXSIKKy8vIENIRUNLLUJFLUhGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliLy4uL2xpYiIKKy8vIENIRUNLLUJFLUhGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9saWIiCisvLyBDSEVDSy1CRS1IRi0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2xpYiIKKy8vIENIRUNLLUJFLUhGLTMyOiAiW1tUQ11de3svfFxcXFx9fWNydGVuZC5vIgorLy8gQ0hFQ0stQkUtSEYtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCisvLworLy8gPSBCaWctZW5kaWFuLCBoYXJkIGZsb2F0LCBtaXBzMTYKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwcy1saW51eC1nbnUgLW1pcHMxNiBcCisvLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtSEYtMTYgJXMKKy8vIENIRUNLLUJFLUhGLTE2OiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1IRi0xNjogIltbVEM6W14iXSsvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zIgorLy8gQ0hFQ0stQkUtSEYtMTY6ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL21pcHMtbGludXgtZ251L21pcHMxNiIKKy8vIENIRUNLLUJFLUhGLTE2OiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1IRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKKy8vIENIRUNLLUJFLUhGLTE2OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLTE2OiAiW1tUQ11dL2luY2x1ZGUiCisvLyBDSEVDSy1CRS1IRi0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1IRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgorLy8gQ0hFQ0stQkUtSEYtMTY6ICJ7ey4qfX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stQkUtSEYtMTY6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2IgorLy8gQ0hFQ0stQkUtSEYtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgorLy8gQ0hFQ0stQkUtSEYtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgorLy8gQ0hFQ0stQkUtSEYtMTY6ICJbW1RDXV0vbWlwczE2e3svfFxcXFx9fWNydGJlZ2luLm8iCisvLyBDSEVDSy1CRS1IRi0xNjogIi1MW1tUQ11dL21pcHMxNiIKKy8vIENIRUNLLUJFLUhGLTE2OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMTYiCisvLyBDSEVDSy1CRS1IRi0xNi1OT1Q6ICItTFtbVENdXSIKKy8vIENIRUNLLUJFLUhGLTE2OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvbGliLy4uL2xpYiIKKy8vIENIRUNLLUJFLUhGLTE2OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1IRi0xNjogIltbVENdXS9taXBzMTZ7ey98XFxcXH19Y3J0ZW5kLm8iCisvLyBDSEVDSy1CRS1IRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCisvLworLy8gPSBCaWctZW5kaWFuLCBoYXJkIGZsb2F0LCBtbWljcm9taXBzCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHMtbGludXgtZ251IC1tbWljcm9taXBzIFwKKy8vIFJVTjogICAgIC0tZ2NjLXRvb2xjaGFpbj0lUy9JbnB1dHMvbWlwc19jc190cmVlIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1IRi1NSUNSTyAlcworLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLU1JQ1JPOiAiW1tUQzpbXiJdKy9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMiCisvLyBDSEVDSy1CRS1IRi1NSUNSTzogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvbWlwcy1saW51eC1nbnUvbWljcm9taXBzIgorLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgorLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICJbW1RDXV0vaW5jbHVkZSIKKy8vIENIRUNLLUJFLUhGLU1JQ1JPOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCisvLyBDSEVDSy1CRS1IRi1NSUNSTzogInt7Lip9fWxke3soLmV4ZSk/fX0iCisvLyBDSEVDSy1CRS1IRi1NSUNSTzogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMiCisvLyBDSEVDSy1CRS1IRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCisvLyBDSEVDSy1CRS1IRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBDSEVDSy1CRS1IRi1NSUNSTzogIltbVENdXS9taWNyb21pcHN7ey98XFxcXH19Y3J0YmVnaW4ubyIKKy8vIENIRUNLLUJFLUhGLU1JQ1JPOiAiLUxbW1RDXV0vbWljcm9taXBzIgorLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWIvLi4vbGliL21pY3JvbWlwcyIKKy8vIENIRUNLLUJFLUhGLU1JQ1JPLU5PVDogIi1MW1tUQ11dIgorLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtSEYtTUlDUk86ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy91c3IvbGliLy4uL2xpYiIKKy8vIENIRUNLLUJFLUhGLU1JQ1JPOiAiW1tUQ11dL21pY3JvbWlwc3t7L3xcXFxcfX1jcnRlbmQubyIKKy8vIENIRUNLLUJFLUhGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKKy8vCisvLyA9IEJpZy1lbmRpYW4sIGhhcmQgZmxvYXQsIG5hbjIwMDgKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwcy1saW51eC1nbnUgLW1uYW49MjAwOCBcCisvLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtSEYtTkFOICVzCisvLyBDSEVDSy1CRS1IRi1OQU46ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLU5BTjogIltbVEM6W14iXSsvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zIgorLy8gQ0hFQ0stQkUtSEYtTkFOOiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1IRi1OQU46ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvbWlwcy1saW51eC1nbnUvbmFuMjAwOCIKKy8vIENIRUNLLUJFLUhGLU5BTjogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtSEYtTkFOOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgorLy8gQ0hFQ0stQkUtSEYtTkFOOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLU5BTjogIltbVENdXS9pbmNsdWRlIgorLy8gQ0hFQ0stQkUtSEYtTkFOOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLU5BTjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgorLy8gQ0hFQ0stQkUtSEYtTkFOOiAie3suKn19bGR7eyguZXhlKT99fSIKKy8vIENIRUNLLUJFLUhGLU5BTjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtSEYtTkFOOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCisvLyBDSEVDSy1CRS1IRi1OQU46ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKKy8vIENIRUNLLUJFLUhGLU5BTjogIltbVENdXS9uYW4yMDA4e3svfFxcXFx9fWNydGJlZ2luLm8iCisvLyBDSEVDSy1CRS1IRi1OQU46ICItTFtbVENdXS9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtSEYtTkFOOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliLy4uL2xpYi9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtSEYtTkFOLU5PVDogIi1MW1tUQ11dIgorLy8gQ0hFQ0stQkUtSEYtTkFOOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9uYW4yMDA4L2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1IRi1OQU46ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1IRi1OQU46ICJbW1RDXV0vbmFuMjAwOHt7L3xcXFxcfX1jcnRlbmQubyIKKy8vIENIRUNLLUJFLUhGLU5BTjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgorLy8KKy8vID0gQmlnLWVuZGlhbiwgc29mdCBmbG9hdAorLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1taXBzLWxpbnV4LWdudSAtbXNvZnQtZmxvYXQgXAorLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJFLVNGLTMyICVzCisvLyBDSEVDSy1CRS1TRi0zMjogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtU0YtMzI6ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKKy8vIENIRUNLLUJFLVNGLTMyOiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1TRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9zb2Z0LWZsb2F0IgorLy8gQ0hFQ0stQkUtU0YtMzI6ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUJFLVNGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgorLy8gQ0hFQ0stQkUtU0YtMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtU0YtMzI6ICJbW1RDXV0vaW5jbHVkZSIKKy8vIENIRUNLLUJFLVNGLTMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUJFLVNGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCisvLyBDSEVDSy1CRS1TRi0zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCisvLyBDSEVDSy1CRS1TRi0zMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0IgorLy8gQ0hFQ0stQkUtU0YtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKKy8vIENIRUNLLUJFLVNGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBDSEVDSy1CRS1TRi0zMjogIltbVENdXS9zb2Z0LWZsb2F0e3svfFxcXFx9fWNydGJlZ2luLm8iCisvLyBDSEVDSy1CRS1TRi0zMjogIi1MW1tUQ11dL3NvZnQtZmxvYXQiCisvLyBDSEVDSy1CRS1TRi0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWIvc29mdC1mbG9hdCIKKy8vIENIRUNLLUJFLVNGLTMyLU5PVDogIi1MW1tUQ11dIgorLy8gQ0hFQ0stQkUtU0YtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvbGliLy4uL2xpYiIKKy8vIENIRUNLLUJFLVNGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtU0YtMzI6ICJbW1RDXV0vc29mdC1mbG9hdHt7L3xcXFxcfX1jcnRlbmQubyIKKy8vIENIRUNLLUJFLVNGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCisvLworLy8gPSBCaWctZW5kaWFuLCBzb2Z0IGZsb2F0LCBtaXBzMTYKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwcy1saW51eC1nbnUgLW1zb2Z0LWZsb2F0IC1taXBzMTYgXAorLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJFLVNGLTE2ICVzCisvLyBDSEVDSy1CRS1TRi0xNjogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtU0YtMTY6ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKKy8vIENIRUNLLUJFLVNGLTE2OiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9taXBzMTYvc29mdC1mbG9hdCIKKy8vIENIRUNLLUJFLVNGLTE2OiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKKy8vIENIRUNLLUJFLVNGLTE2OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUJFLVNGLTE2OiAiW1tUQ11dL2luY2x1ZGUiCisvLyBDSEVDSy1CRS1TRi0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgorLy8gQ0hFQ0stQkUtU0YtMTY6ICJ7ey4qfX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stQkUtU0YtMTY6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L3NvZnQtZmxvYXQiCisvLyBDSEVDSy1CRS1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKKy8vIENIRUNLLUJFLVNGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L3NvZnQtZmxvYXQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgorLy8gQ0hFQ0stQkUtU0YtMTY6ICJbW1RDXV0vbWlwczE2L3NvZnQtZmxvYXR7ey98XFxcXH19Y3J0YmVnaW4ubyIKKy8vIENIRUNLLUJFLVNGLTE2OiAiLUxbW1RDXV0vbWlwczE2L3NvZnQtZmxvYXQiCisvLyBDSEVDSy1CRS1TRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2L3NvZnQtZmxvYXQiCisvLyBDSEVDSy1CRS1TRi0xNi1OT1Q6ICItTFtbVENdXSIKKy8vIENIRUNLLUJFLVNGLTE2OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvc29mdC1mbG9hdC9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtU0YtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtU0YtMTY6ICJbW1RDXV0vbWlwczE2L3NvZnQtZmxvYXR7ey98XFxcXH19Y3J0ZW5kLm8iCisvLyBDSEVDSy1CRS1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKKy8vCisvLyA9IEJpZy1lbmRpYW4sIHNvZnQgZmxvYXQsIG1pY3JvbWlwcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1taXBzLWxpbnV4LWdudSAtbXNvZnQtZmxvYXQgLW1taWNyb21pcHMgXAorLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUJFLVNGLU1JQ1JPICVzCisvLyBDSEVDSy1CRS1TRi1NSUNSTzogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtU0YtTUlDUk86ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKKy8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1TRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9taWNyb21pcHMvc29mdC1mbG9hdCIKKy8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1TRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKKy8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiW1tUQ11dL2luY2x1ZGUiCisvLyBDSEVDSy1CRS1TRi1NSUNSTzogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1TRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgorLy8gQ0hFQ0stQkUtU0YtTUlDUk86ICJ7ey4qfX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stQkUtU0YtTUlDUk86ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL3NvZnQtZmxvYXQiCisvLyBDSEVDSy1CRS1TRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKKy8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL3NvZnQtZmxvYXQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgorLy8gQ0hFQ0stQkUtU0YtTUlDUk86ICJbW1RDXV0vbWljcm9taXBzL3NvZnQtZmxvYXR7ey98XFxcXH19Y3J0YmVnaW4ubyIKKy8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiLUxbW1RDXV0vbWljcm9taXBzL3NvZnQtZmxvYXQiCisvLyBDSEVDSy1CRS1TRi1NSUNSTzogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWIvbWljcm9taXBzL3NvZnQtZmxvYXQiCisvLyBDSEVDSy1CRS1TRi1NSUNSTy1OT1Q6ICItTFtbVENdXSIKKy8vIENIRUNLLUJFLVNGLU1JQ1JPOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvc29mdC1mbG9hdC9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtU0YtTUlDUk86ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtU0YtTUlDUk86ICJbW1RDXV0vbWljcm9taXBzL3NvZnQtZmxvYXR7ey98XFxcXH19Y3J0ZW5kLm8iCisvLyBDSEVDSy1CRS1TRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9zb2Z0LWZsb2F0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKKy8vCisvLyA9IEJpZy1lbmRpYW4sIGhhcmQgZmxvYXQsIDY0LWJpdAorLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1taXBzNjQtbGludXgtZ251IFwKKy8vIFJVTjogICAgIC0tZ2NjLXRvb2xjaGFpbj0lUy9JbnB1dHMvbWlwc19jc190cmVlIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1CRS1IRi02NCAlcworLy8gQ0hFQ0stQkUtSEYtNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUJFLUhGLTY0OiAiW1tUQzpbXiJdKy9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMiCisvLyBDSEVDSy1CRS1IRi02NDogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtSEYtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvbWlwcy1saW51eC1nbnUvNjQiCisvLyBDSEVDSy1CRS1IRi02NDogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtSEYtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvYmFja3dhcmQiCisvLyBDSEVDSy1CRS1IRi02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1IRi02NDogIltbVENdXS9pbmNsdWRlIgorLy8gQ0hFQ0stQkUtSEYtNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtSEYtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvaW5jbHVkZSIKKy8vIENIRUNLLUJFLUhGLTY0OiAie3suKn19bGR7eyguZXhlKT99fSIKKy8vIENIRUNLLUJFLUhGLTY0OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjIgorLy8gQ0hFQ0stQkUtSEYtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvbGliLy4uL2xpYjY0e3svfFxcXFx9fWNydDEubyIKKy8vIENIRUNLLUJFLUhGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2xpYi8uLi9saWI2NHt7L3xcXFxcfX1jcnRpLm8iCisvLyBDSEVDSy1CRS1IRi02NDogIltbVENdXS82NHt7L3xcXFxcfX1jcnRiZWdpbi5vIgorLy8gQ0hFQ0stQkUtSEYtNjQ6ICItTFtbVENdXS82NCIKKy8vIENIRUNLLUJFLUhGLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliLy4uL2xpYjY0IgorLy8gQ0hFQ0stQkUtSEYtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2xpYi8uLi9saWI2NCIKKy8vIENIRUNLLUJFLUhGLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvbGliLy4uL2xpYjY0IgorLy8gQ0hFQ0stQkUtSEYtNjQtTk9UOiAiLUxbW1RDXV0iCisvLyBDSEVDSy1CRS1IRi02NDogInt7Lip9fS9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zLzY0e3svfFxcXFx9fWNydGVuZC5vIgorLy8gQ0hFQ0stQkUtSEYtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvbGliLy4uL2xpYjY0e3svfFxcXFx9fWNydG4ubyIKKy8vCisvLyA9IEJpZy1lbmRpYW4sIHNvZnQgZmxvYXQsIDY0LWJpdAorLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1taXBzNjQtbGludXgtZ251IC1tc29mdC1mbG9hdCBcCisvLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQkUtU0YtNjQgJXMKKy8vIENIRUNLLUJFLVNGLTY0OiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1TRi02NDogIltbVEM6W14iXSsvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zIgorLy8gQ0hFQ0stQkUtU0YtNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUJFLVNGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL21pcHMtbGludXgtZ251L3NvZnQtZmxvYXQvNjQiCisvLyBDSEVDSy1CRS1TRi02NDogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtU0YtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvYmFja3dhcmQiCisvLyBDSEVDSy1CRS1TRi02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1CRS1TRi02NDogIltbVENdXS9pbmNsdWRlIgorLy8gQ0hFQ0stQkUtU0YtNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgorLy8gQ0hFQ0stQkUtU0YtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvaW5jbHVkZSIKKy8vIENIRUNLLUJFLVNGLTY0OiAie3suKn19bGR7eyguZXhlKT99fSIKKy8vIENIRUNLLUJFLVNGLTY0OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQiCisvLyBDSEVDSy1CRS1TRi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvdXNyL2xpYi8uLi9saWI2NHt7L3xcXFxcfX1jcnQxLm8iCisvLyBDSEVDSy1CRS1TRi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvdXNyL2xpYi8uLi9saWI2NHt7L3xcXFxcfX1jcnRpLm8iCisvLyBDSEVDSy1CRS1TRi02NDogIltbVENdXS9zb2Z0LWZsb2F0LzY0e3svfFxcXFx9fWNydGJlZ2luLm8iCisvLyBDSEVDSy1CRS1TRi02NDogIi1MW1tUQ11dL3NvZnQtZmxvYXQvNjQiCisvLyBDSEVDSy1CRS1TRi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWI2NC9zb2Z0LWZsb2F0IgorLy8gQ0hFQ0stQkUtU0YtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvbGliLy4uL2xpYjY0IgorLy8gQ0hFQ0stQkUtU0YtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvdXNyL2xpYi8uLi9saWI2NCIKKy8vIENIRUNLLUJFLVNGLTY0LU5PVDogIi1MW1tUQ11dIgorLy8gQ0hFQ0stQkUtU0YtNjQ6ICJbW1RDXV0vc29mdC1mbG9hdC82NHt7L3xcXFxcfX1jcnRlbmQubyIKKy8vIENIRUNLLUJFLVNGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC91c3IvbGliLy4uL2xpYjY0e3svfFxcXFx9fWNydG4ubyIKKy8vCisvLyA9IExpdHRsZS1lbmRpYW4sIGhhcmQgZmxvYXQKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwc2VsLWxpbnV4LWdudSAtbWhhcmQtZmxvYXQgXAorLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUVMLUhGLTMyICVzCisvLyBDSEVDSy1FTC1IRi0zMjogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtSEYtMzI6ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKKy8vIENIRUNLLUVMLUhGLTMyOiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1IRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9lbCIKKy8vIENIRUNLLUVMLUhGLTMyOiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1IRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKKy8vIENIRUNLLUVMLUhGLTMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUVMLUhGLTMyOiAiW1tUQ11dL2luY2x1ZGUiCisvLyBDSEVDSy1FTC1IRi0zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1IRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgorLy8gQ0hFQ0stRUwtSEYtMzI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stRUwtSEYtMzI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvZWwiCisvLyBDSEVDSy1FTC1IRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKKy8vIENIRUNLLUVMLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgorLy8gQ0hFQ0stRUwtSEYtMzI6ICJbW1RDXV0vZWx7ey98XFxcXH19Y3J0YmVnaW4ubyIKKy8vIENIRUNLLUVMLUhGLTMyOiAiLUxbW1RDXV0vZWwiCisvLyBDSEVDSy1FTC1IRi0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWIvZWwiCisvLyBDSEVDSy1FTC1IRi0zMi1OT1Q6ICItTFtbVENdXSIKKy8vIENIRUNLLUVMLUhGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9lbC9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtSEYtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsL3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtSEYtMzI6ICJbW1RDXV0vZWx7ey98XFxcXH19Y3J0ZW5kLm8iCisvLyBDSEVDSy1FTC1IRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKKy8vCisvLyA9IExpdHRsZS1lbmRpYW4sIGhhcmQgZmxvYXQsIG1pcHMxNgorLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1taXBzZWwtbGludXgtZ251IC1taXBzMTYgXAorLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUVMLUhGLTE2ICVzCisvLyBDSEVDSy1FTC1IRi0xNjogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtSEYtMTY6ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKKy8vIENIRUNLLUVMLUhGLTE2OiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1IRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9taXBzMTYvZWwiCisvLyBDSEVDSy1FTC1IRi0xNjogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtSEYtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvYmFja3dhcmQiCisvLyBDSEVDSy1FTC1IRi0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1IRi0xNjogIltbVENdXS9pbmNsdWRlIgorLy8gQ0hFQ0stRUwtSEYtMTY6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtSEYtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvaW5jbHVkZSIKKy8vIENIRUNLLUVMLUhGLTE2OiAie3suKn19bGR7eyguZXhlKT99fSIKKy8vIENIRUNLLUVMLUhGLTE2OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9lbCIKKy8vIENIRUNLLUVMLUhGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKKy8vIENIRUNLLUVMLUhGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKKy8vIENIRUNLLUVMLUhGLTE2OiAiW1tUQ11dL21pcHMxNi9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgorLy8gQ0hFQ0stRUwtSEYtMTY6ICItTFtbVENdXS9taXBzMTYvZWwiCisvLyBDSEVDSy1FTC1IRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2L2VsIgorLy8gQ0hFQ0stRUwtSEYtMTYtTk9UOiAiLUxbW1RDXV0iCisvLyBDSEVDSy1FTC1IRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L2VsL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1IRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L2VsL3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtSEYtMTY6ICJbW1RDXV0vbWlwczE2L2Vse3svfFxcXFx9fWNydGVuZC5vIgorLy8gQ0hFQ0stRUwtSEYtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgorLy8KKy8vID0gTGl0dGxlLWVuZGlhbiwgaGFyZCBmbG9hdCwgbWljcm9taXBzCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHNlbC1saW51eC1nbnUgLW1taWNyb21pcHMgXAorLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUVMLUhGLU1JQ1JPICVzCisvLyBDSEVDSy1FTC1IRi1NSUNSTzogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtSEYtTUlDUk86ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKKy8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1IRi1NSUNSTzogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9taWNyb21pcHMvZWwiCisvLyBDSEVDSy1FTC1IRi1NSUNSTzogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtSEYtTUlDUk86ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvYmFja3dhcmQiCisvLyBDSEVDSy1FTC1IRi1NSUNSTzogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1IRi1NSUNSTzogIltbVENdXS9pbmNsdWRlIgorLy8gQ0hFQ0stRUwtSEYtTUlDUk86ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtSEYtTUlDUk86ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvaW5jbHVkZSIKKy8vIENIRUNLLUVMLUhGLU1JQ1JPOiAie3suKn19bGR7eyguZXhlKT99fSIKKy8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9lbCIKKy8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKKy8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKKy8vIENIRUNLLUVMLUhGLU1JQ1JPOiAiW1tUQ11dL21pY3JvbWlwcy9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgorLy8gQ0hFQ0stRUwtSEYtTUlDUk86ICItTFtbVENdXS9taWNyb21pcHMvZWwiCisvLyBDSEVDSy1FTC1IRi1NSUNSTzogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWIvbWljcm9taXBzL2VsIgorLy8gQ0hFQ0stRUwtSEYtTUlDUk8tTk9UOiAiLUxbW1RDXV0iCisvLyBDSEVDSy1FTC1IRi1NSUNSTzogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL2VsL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1IRi1NSUNSTzogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL2VsL3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtSEYtTUlDUk86ICJbW1RDXV0vbWljcm9taXBzL2Vse3svfFxcXFx9fWNydGVuZC5vIgorLy8gQ0hFQ0stRUwtSEYtTUlDUk86ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgorLy8KKy8vID0gTGl0dGxlLWVuZGlhbiwgaGFyZCBmbG9hdCwgbmFuMjAwOAorLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1taXBzZWwtbGludXgtZ251IC1tbmFuPTIwMDggXAorLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUVMLUhGLU5BTiAlcworLy8gQ0hFQ0stRUwtSEYtTkFOOiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1IRi1OQU46ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKKy8vIENIRUNLLUVMLUhGLU5BTjogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtSEYtTkFOOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL21pcHMtbGludXgtZ251L25hbjIwMDgvZWwiCisvLyBDSEVDSy1FTC1IRi1OQU46ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUVMLUhGLU5BTjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKKy8vIENIRUNLLUVMLUhGLU5BTjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1IRi1OQU46ICJbW1RDXV0vaW5jbHVkZSIKKy8vIENIRUNLLUVMLUhGLU5BTjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1IRi1OQU46ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy91c3IvaW5jbHVkZSIKKy8vIENIRUNLLUVMLUhGLU5BTjogInt7Lip9fWxke3soLmV4ZSk/fX0iCisvLyBDSEVDSy1FTC1IRi1OQU46ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbmFuMjAwOC9lbCIKKy8vIENIRUNLLUVMLUhGLU5BTjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL25hbjIwMDgvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgorLy8gQ0hFQ0stRUwtSEYtTkFOOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbmFuMjAwOC9lbC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBDSEVDSy1FTC1IRi1OQU46ICJbW1RDXV0vbmFuMjAwOC9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgorLy8gQ0hFQ0stRUwtSEYtTkFOOiAiLUxbW1RDXV0vbmFuMjAwOC9lbCIKKy8vIENIRUNLLUVMLUhGLU5BTjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWIvbmFuMjAwOC9lbCIKKy8vIENIRUNLLUVMLUhGLU5BTi1OT1Q6ICItTFtbVENdXSIKKy8vIENIRUNLLUVMLUhGLU5BTjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbmFuMjAwOC9lbC9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtSEYtTkFOOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9uYW4yMDA4L2VsL3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtSEYtTkFOOiAiW1tUQ11dL25hbjIwMDgvZWx7ey98XFxcXH19Y3J0ZW5kLm8iCisvLyBDSEVDSy1FTC1IRi1OQU46ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9uYW4yMDA4L2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKKy8vCisvLyA9IExpdHRsZS1lbmRpYW4sIHNvZnQgZmxvYXQKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwc2VsLWxpbnV4LWdudSAtbWZsb2F0LWFiaT1zb2Z0IFwKKy8vIFJVTjogICAgIC0tZ2NjLXRvb2xjaGFpbj0lUy9JbnB1dHMvbWlwc19jc190cmVlIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1FTC1TRi0zMiAlcworLy8gQ0hFQ0stRUwtU0YtMzI6ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUVMLVNGLTMyOiAiW1tUQzpbXiJdKy9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNi4zXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMiCisvLyBDSEVDSy1FTC1TRi0zMjogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtU0YtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvaW5jbHVkZS9jKysvNC42LjMvbWlwcy1saW51eC1nbnUvc29mdC1mbG9hdC9lbCIKKy8vIENIRUNLLUVMLVNGLTMyOiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1TRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKKy8vIENIRUNLLUVMLVNGLTMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUVMLVNGLTMyOiAiW1tUQ11dL2luY2x1ZGUiCisvLyBDSEVDSy1FTC1TRi0zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1TRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgorLy8gQ0hFQ0stRUwtU0YtMzI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stRUwtU0YtMzI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC9lbCIKKy8vIENIRUNLLUVMLVNGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC9lbC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCisvLyBDSEVDSy1FTC1TRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgorLy8gQ0hFQ0stRUwtU0YtMzI6ICJbW1RDXV0vc29mdC1mbG9hdC9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgorLy8gQ0hFQ0stRUwtU0YtMzI6ICItTFtbVENdXS9zb2Z0LWZsb2F0L2VsIgorLy8gQ0hFQ0stRUwtU0YtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWIvLi4vbGliL3NvZnQtZmxvYXQvZWwiCisvLyBDSEVDSy1FTC1TRi0zMi1OT1Q6ICItTFtbVENdXSIKKy8vIENIRUNLLUVMLVNGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1TRi0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvc29mdC1mbG9hdC9lbC91c3IvbGliLy4uL2xpYiIKKy8vIENIRUNLLUVMLVNGLTMyOiAiW1tUQ11dL3NvZnQtZmxvYXQvZWx7ey98XFxcXH19Y3J0ZW5kLm8iCisvLyBDSEVDSy1FTC1TRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgorLy8KKy8vID0gTGl0dGxlLWVuZGlhbiwgc29mdCBmbG9hdCwgbWlwczE2CisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHNlbC1saW51eC1nbnUgLW1pcHMxNiAtbXNvZnQtZmxvYXQgXAorLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUVMLVNGLTE2ICVzCisvLyBDSEVDSy1FTC1TRi0xNjogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtU0YtMTY6ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKKy8vIENIRUNLLUVMLVNGLTE2OiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9taXBzMTYvc29mdC1mbG9hdC9lbCIKKy8vIENIRUNLLUVMLVNGLTE2OiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9iYWNrd2FyZCIKKy8vIENIRUNLLUVMLVNGLTE2OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUVMLVNGLTE2OiAiW1tUQ11dL2luY2x1ZGUiCisvLyBDSEVDSy1FTC1TRi0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3Vzci9pbmNsdWRlIgorLy8gQ0hFQ0stRUwtU0YtMTY6ICJ7ey4qfX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stRUwtU0YtMTY6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L3NvZnQtZmxvYXQvZWwiCisvLyBDSEVDSy1FTC1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9zb2Z0LWZsb2F0L2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKKy8vIENIRUNLLUVMLVNGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWlwczE2L3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgorLy8gQ0hFQ0stRUwtU0YtMTY6ICJbW1RDXV0vbWlwczE2L3NvZnQtZmxvYXQvZWx7ey98XFxcXH19Y3J0YmVnaW4ubyIKKy8vIENIRUNLLUVMLVNGLTE2OiAiLUxbW1RDXV0vbWlwczE2L3NvZnQtZmxvYXQvZWwiCisvLyBDSEVDSy1FTC1TRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2L3NvZnQtZmxvYXQvZWwiCisvLyBDSEVDSy1FTC1TRi0xNi1OT1Q6ICItTFtbVENdXSIKKy8vIENIRUNLLUVMLVNGLTE2OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taXBzMTYvc29mdC1mbG9hdC9lbC9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtU0YtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9zb2Z0LWZsb2F0L2VsL3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtU0YtMTY6ICJbW1RDXV0vbWlwczE2L3NvZnQtZmxvYXQvZWx7ey98XFxcXH19Y3J0ZW5kLm8iCisvLyBDSEVDSy1FTC1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pcHMxNi9zb2Z0LWZsb2F0L2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKKy8vCisvLyA9IExpdHRsZS1lbmRpYW4sIHNvZnQgZmxvYXQsIG1pY3JvbWlwcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1taXBzZWwtbGludXgtZ251IC1tbWljcm9taXBzIC1tc29mdC1mbG9hdCBcCisvLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRUwtU0YtTUlDUk8gJXMKKy8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1TRi1NSUNSTzogIltbVEM6W14iXSsvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zIgorLy8gQ0hFQ0stRUwtU0YtTUlDUk86ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL21pcHMtbGludXgtZ251L21pY3JvbWlwcy9zb2Z0LWZsb2F0L2VsIgorLy8gQ0hFQ0stRUwtU0YtTUlDUk86ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgorLy8gQ0hFQ0stRUwtU0YtTUlDUk86ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtU0YtTUlDUk86ICJbW1RDXV0vaW5jbHVkZSIKKy8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCisvLyBDSEVDSy1FTC1TRi1NSUNSTzogInt7Lip9fWxke3soLmV4ZSk/fX0iCisvLyBDSEVDSy1FTC1TRi1NSUNSTzogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvc29mdC1mbG9hdC9lbCIKKy8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgorLy8gQ0hFQ0stRUwtU0YtTUlDUk86ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9taWNyb21pcHMvc29mdC1mbG9hdC9lbC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBDSEVDSy1FTC1TRi1NSUNSTzogIltbVENdXS9taWNyb21pcHMvc29mdC1mbG9hdC9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgorLy8gQ0hFQ0stRUwtU0YtTUlDUk86ICItTFtbVENdXS9taWNyb21pcHMvc29mdC1mbG9hdC9lbCIKKy8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliLy4uL2xpYi9taWNyb21pcHMvc29mdC1mbG9hdC9lbCIKKy8vIENIRUNLLUVMLVNGLU1JQ1JPLU5PVDogIi1MW1tUQ11dIgorLy8gQ0hFQ0stRUwtU0YtTUlDUk86ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL21pY3JvbWlwcy9zb2Z0LWZsb2F0L2VsL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1TRi1NSUNSTzogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1TRi1NSUNSTzogIltbVENdXS9taWNyb21pcHMvc29mdC1mbG9hdC9lbHt7L3xcXFxcfX1jcnRlbmQubyIKKy8vIENIRUNLLUVMLVNGLU1JQ1JPOiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvbWljcm9taXBzL3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgorLy8KKy8vID0gTGl0dGxlLWVuZGlhbiwgaGFyZCBmbG9hdCwgNjQtYml0CisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHM2NGVsLWxpbnV4LWdudSBcCisvLyBSVU46ICAgICAtLWdjYy10b29sY2hhaW49JVMvSW5wdXRzL21pcHNfY3NfdHJlZSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stRUwtSEYtNjQgJXMKKy8vIENIRUNLLUVMLUhGLTY0OiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1IRi02NDogIltbVEM6W14iXSsvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjYuM11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zIgorLy8gQ0hFQ0stRUwtSEYtNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUVMLUhGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL21pcHMtbGludXgtZ251L2VsLzY0IgorLy8gQ0hFQ0stRUwtSEYtNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUVMLUhGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgorLy8gQ0hFQ0stRUwtSEYtNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtSEYtNjQ6ICJbW1RDXV0vaW5jbHVkZSIKKy8vIENIRUNLLUVMLUhGLTY0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUVMLUhGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCisvLyBDSEVDSy1FTC1IRi02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCisvLyBDSEVDSy1FTC1IRi02NDogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9lbCIKKy8vIENIRUNLLUVMLUhGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvZWwvdXNyL2xpYi8uLi9saWI2NHt7L3xcXFxcfX1jcnQxLm8iCisvLyBDSEVDSy1FTC1IRi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsL3Vzci9saWIvLi4vbGliNjR7ey98XFxcXH19Y3J0aS5vIgorLy8gQ0hFQ0stRUwtSEYtNjQ6ICJbW1RDXV0vZWwvNjR7ey98XFxcXH19Y3J0YmVnaW4ubyIKKy8vIENIRUNLLUVMLUhGLTY0OiAiLUxbW1RDXV0vZWwvNjQiCisvLyBDSEVDSy1FTC1IRi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYi8uLi9saWI2NC9lbCIKKy8vIENIRUNLLUVMLUhGLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9lbC9saWIvLi4vbGliNjQiCisvLyBDSEVDSy1FTC1IRi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvZWwvdXNyL2xpYi8uLi9saWI2NCIKKy8vIENIRUNLLUVMLUhGLTY0LU5PVDogIi1MW1tUQ11dIgorLy8gQ0hFQ0stRUwtSEYtNjQ6ICJbW1RDXV0vZWwvNjR7ey98XFxcXH19Y3J0ZW5kLm8iCisvLyBDSEVDSy1FTC1IRi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL2VsL3Vzci9saWIvLi4vbGliNjR7ey98XFxcXH19Y3J0bi5vIgorLy8KKy8vID0gTGl0dGxlLWVuZGlhbiwgc29mdCBmbG9hdCwgNjQtYml0CisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC0tdGFyZ2V0PW1pcHM2NGVsLWxpbnV4LWdudSAtbXNvZnQtZmxvYXQgXAorLy8gUlVOOiAgICAgLS1nY2MtdG9vbGNoYWluPSVTL0lucHV0cy9taXBzX2NzX3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUVMLVNGLTY0ICVzCisvLyBDSEVDSy1FTC1TRi02NDogIi1pbnRlcm5hbC1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtU0YtNjQ6ICJbW1RDOlteIl0rL2xpYi9nY2MvbWlwcy1saW51eC1nbnUvNC42LjNdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMyIKKy8vIENIRUNLLUVMLVNGLTY0OiAiLWludGVybmFsLWlzeXN0ZW0iCisvLyBDSEVDSy1FTC1TRi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9pbmNsdWRlL2MrKy80LjYuMy9taXBzLWxpbnV4LWdudS9zb2Z0LWZsb2F0L2VsLzY0IgorLy8gQ0hFQ0stRUwtU0YtNjQ6ICItaW50ZXJuYWwtaXN5c3RlbSIKKy8vIENIRUNLLUVMLVNGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2luY2x1ZGUvYysrLzQuNi4zL2JhY2t3YXJkIgorLy8gQ0hFQ0stRUwtU0YtNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgorLy8gQ0hFQ0stRUwtU0YtNjQ6ICJbW1RDXV0vaW5jbHVkZSIKKy8vIENIRUNLLUVMLVNGLTY0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKKy8vIENIRUNLLUVMLVNGLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbGludXgtZ251L2xpYmMvdXNyL2luY2x1ZGUiCisvLyBDSEVDSy1FTC1TRi02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCisvLyBDSEVDSy1FTC1TRi02NDogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsIgorLy8gQ0hFQ0stRUwtU0YtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsL3Vzci9saWIvLi4vbGliNjR7ey98XFxcXH19Y3J0MS5vIgorLy8gQ0hFQ0stRUwtU0YtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsL3Vzci9saWIvLi4vbGliNjR7ey98XFxcXH19Y3J0aS5vIgorLy8gQ0hFQ0stRUwtU0YtNjQ6ICJbW1RDXV0vc29mdC1mbG9hdC9lbC82NHt7L3xcXFxcfX1jcnRiZWdpbi5vIgorLy8gQ0hFQ0stRUwtU0YtNjQ6ICItTFtbVENdXS9zb2Z0LWZsb2F0L2VsLzY0IgorLy8gQ0hFQ0stRUwtU0YtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWIvLi4vbGliNjQvc29mdC1mbG9hdC9lbCIKKy8vIENIRUNLLUVMLVNGLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsL2xpYi8uLi9saWI2NCIKKy8vIENIRUNLLUVMLVNGLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1saW51eC1nbnUvbGliYy9zb2Z0LWZsb2F0L2VsL3Vzci9saWIvLi4vbGliNjQiCisvLyBDSEVDSy1FTC1TRi02NC1OT1Q6ICItTFtbVENdXSIKKy8vIENIRUNLLUVMLVNGLTY0OiAiW1tUQ11dL3NvZnQtZmxvYXQvZWwvNjR7ey98XFxcXH19Y3J0ZW5kLm8iCisvLyBDSEVDSy1FTC1TRi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9taXBzLWxpbnV4LWdudS9saWJjL3NvZnQtZmxvYXQvZWwvdXNyL2xpYi8uLi9saWI2NHt7L3xcXFxcfX1jcnRuLm8iCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9taXBzLWVsZWIuYyBiL3Rlc3QvRHJpdmVyL21pcHMtZWxlYi5jCmluZGV4IDZlYTQ5YmUuLjBjYzY5NmQgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL21pcHMtZWxlYi5jCisrKyBiL3Rlc3QvRHJpdmVyL21pcHMtZWxlYi5jCkBAIC00LDI2ICs0LDI2IEBACiAvLyBSVU46ICAgICAgICAtRUwgLW5vLWludGVncmF0ZWQtYXMgJXMgMj4mMSBcCiAvLyBSVU46ICAgICAgICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1JUFMzMi1FTCAlcwogLy8gTUlQUzMyLUVMOiAie3suKn19Y2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgIm1pcHNlbC11bmtub3duLWxpbnV4LWdudSIKLS8vIE1JUFMzMi1FTDogInt7Lip9fWFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzMzIiICItbWFiaSIgIjMyIiAiLUVMIgorLy8gTUlQUzMyLUVMOiAie3suKn19YXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMnIyIiAiLW1hYmkiICIzMiIgIi1FTCIKIC8vIE1JUFMzMi1FTDogInt7Lip9fWxke3soLmV4ZSk/fX0iIHt7Lip9fSAiLW0iICJlbGYzMmx0c21pcCIKIC8vCiAvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzIC10YXJnZXQgbWlwczY0LXVua25vd24tbGludXgtZ251IC0jIyMgXAogLy8gUlVOOiAgICAgICAgLUVMIC1uby1pbnRlZ3JhdGVkLWFzICVzIDI+JjEgXAogLy8gUlVOOiAgICAgICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTNjQtRUwgJXMKIC8vIE1JUFM2NC1FTDogInt7Lip9fWNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJtaXBzNjRlbC11bmtub3duLWxpbnV4LWdudSIKLS8vIE1JUFM2NC1FTDogInt7Lip9fWFze3soLmV4ZSk/fX0iICItbWFyY2giICJtaXBzNjQiICItbWFiaSIgIjY0IiAiLUVMIgorLy8gTUlQUzY0LUVMOiAie3suKn19YXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHM2NHIyIiAiLW1hYmkiICI2NCIgIi1FTCIKIC8vIE1JUFM2NC1FTDogInt7Lip9fWxke3soLmV4ZSk/fX0iIHt7Lip9fSAiLW0iICJlbGY2NGx0c21pcCIKIC8vCiAvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzIC10YXJnZXQgbWlwc2VsLXVua25vd24tbGludXgtZ251IC0jIyMgXAogLy8gUlVOOiAgICAgICAgLUVCIC1uby1pbnRlZ3JhdGVkLWFzICVzIDI+JjEgXAogLy8gUlVOOiAgICAgICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NSVBTMzItRUIgJXMKIC8vIE1JUFMzMi1FQjogInt7Lip9fWNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJtaXBzLXVua25vd24tbGludXgtZ251IgotLy8gTUlQUzMyLUVCOiAie3suKn19YXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHMzMiIgIi1tYWJpIiAiMzIiICItRUIiCisvLyBNSVBTMzItRUI6ICJ7ey4qfX1hc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczMycjIiICItbWFiaSIgIjMyIiAiLUVCIgogLy8gTUlQUzMyLUVCOiAie3suKn19bGR7eyguZXhlKT99fSIge3suKn19ICItbSIgImVsZjMyYnRzbWlwIgogLy8KIC8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBtaXBzNjRlbC11bmtub3duLWxpbnV4LWdudSAtIyMjIFwKIC8vIFJVTjogICAgICAgIC1FQiAtbm8taW50ZWdyYXRlZC1hcyAlcyAyPiYxIFwKIC8vIFJVTjogICAgICAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9TUlQUzY0LUVCICVzCiAvLyBNSVBTNjQtRUI6ICJ7ey4qfX1jbGFuZ3t7Lip9fSIgIi1jYzEiICItdHJpcGxlIiAibWlwczY0LXVua25vd24tbGludXgtZ251IgotLy8gTUlQUzY0LUVCOiAie3suKn19YXN7eyguZXhlKT99fSIgIi1tYXJjaCIgIm1pcHM2NCIgIi1tYWJpIiAiNjQiICItRUIiCisvLyBNSVBTNjQtRUI6ICJ7ey4qfX1hc3t7KC5leGUpP319IiAiLW1hcmNoIiAibWlwczY0cjIiICItbWFiaSIgIjY0IiAiLUVCIgogLy8gTUlQUzY0LUVCOiAie3suKn19bGR7eyguZXhlKT99fSIge3suKn19ICItbSIgImVsZjY0YnRzbWlwIgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvbWlwcy1mbG9hdC5jIGIvdGVzdC9Ecml2ZXIvbWlwcy1mbG9hdC5jCmluZGV4IGFkMjEwNmEuLjE2MjEwNzUgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL21pcHMtZmxvYXQuYworKysgYi90ZXN0L0RyaXZlci9taXBzLWZsb2F0LmMKQEAgLTYwLDIzICs2MCwyMiBAQAogLy8gUlVOOiAlY2xhbmcgLWMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAogLy8gUlVOOiAgICAgLXRhcmdldCBtaXBzLWxpbnV4LWdudSAtbWlwczE2IFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1ERUYtTUlQUzE2ICVzCi0vLyBDSEVDSy1ERUYtTUlQUzE2OiAiLW1mbG9hdC1hYmkiICJzb2Z0IgotLy8gQ0hFQ0stREVGLU1JUFMxNjogIi1tbGx2bSIgIi1taXBzMTYtaGFyZC1mbG9hdCIKKy8vIENIRUNLLURFRi1NSVBTMTY6ICItdGFyZ2V0LWZlYXR1cmUiICIrbWlwczE2IgorLy8gQ0hFQ0stREVGLU1JUFMxNjogIi1tZmxvYXQtYWJpIiAiaGFyZCIKIC8vCiAvLyAtbWhhcmQtZmxvYXQgLW1pcHMxNgogLy8gUlVOOiAlY2xhbmcgLWMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAogLy8gUlVOOiAgICAgLXRhcmdldCBtaXBzLWxpbnV4LWdudSAtbWhhcmQtZmxvYXQgLW1pcHMxNiBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stSEFSRC1NSVBTMTYgJXMKLS8vIENIRUNLLUhBUkQtTUlQUzE2OiAiLXRhcmdldC1mZWF0dXJlIiAiK3NvZnQtZmxvYXQiCi0vLyBDSEVDSy1IQVJELU1JUFMxNjogIi1tc29mdC1mbG9hdCIKLS8vIENIRUNLLUhBUkQtTUlQUzE2OiAiLW1mbG9hdC1hYmkiICJzb2Z0IgotLy8gQ0hFQ0stSEFSRC1NSVBTMTY6ICItbWxsdm0iICItbWlwczE2LWhhcmQtZmxvYXQiCisvLyBDSEVDSy1IQVJELU1JUFMxNjogIi10YXJnZXQtZmVhdHVyZSIgIittaXBzMTYiCisvLyBDSEVDSy1IQVJELU1JUFMxNjogIi1tZmxvYXQtYWJpIiAiaGFyZCIKIC8vCiAvLyAtbXNvZnQtZmxvYXQgLW1pcHMxNgogLy8gUlVOOiAlY2xhbmcgLWMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAogLy8gUlVOOiAgICAgLXRhcmdldCBtaXBzLWxpbnV4LWdudSAtbXNvZnQtZmxvYXQgLW1pcHMxNiBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stU09GVC1NSVBTMTYgJXMKIC8vIENIRUNLLVNPRlQtTUlQUzE2OiAiLXRhcmdldC1mZWF0dXJlIiAiK3NvZnQtZmxvYXQiCisvLyBDSEVDSy1TT0ZULU1JUFMxNjogIi10YXJnZXQtZmVhdHVyZSIgIittaXBzMTYiCiAvLyBDSEVDSy1TT0ZULU1JUFMxNjogIi1tc29mdC1mbG9hdCIKIC8vIENIRUNLLVNPRlQtTUlQUzE2OiAiLW1mbG9hdC1hYmkiICJzb2Z0IgogLy8KQEAgLTg0LDE1ICs4MywxNCBAQAogLy8gUlVOOiAlY2xhbmcgLWMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAogLy8gUlVOOiAgICAgLXRhcmdldCBtaXBzLWxpbnV4LWdudSAtbWZsb2F0LWFiaT1oYXJkIC1taXBzMTYgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFCSS1IQVJELU1JUFMxNiAlcwotLy8gQ0hFQ0stQUJJLUhBUkQtTUlQUzE2OiAiLXRhcmdldC1mZWF0dXJlIiAiK3NvZnQtZmxvYXQiCi0vLyBDSEVDSy1BQkktSEFSRC1NSVBTMTY6ICItbXNvZnQtZmxvYXQiCi0vLyBDSEVDSy1BQkktSEFSRC1NSVBTMTY6ICItbWZsb2F0LWFiaSIgInNvZnQiCi0vLyBDSEVDSy1BQkktSEFSRC1NSVBTMTY6ICItbWxsdm0iICItbWlwczE2LWhhcmQtZmxvYXQiCisvLyBDSEVDSy1BQkktSEFSRC1NSVBTMTY6ICItdGFyZ2V0LWZlYXR1cmUiICIrbWlwczE2IgorLy8gQ0hFQ0stQUJJLUhBUkQtTUlQUzE2OiAiLW1mbG9hdC1hYmkiICJoYXJkIgogLy8KIC8vIC1tZmxvYXQtYWJpPXNvZnQgLW1pcHMxNgogLy8gUlVOOiAlY2xhbmcgLWMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAogLy8gUlVOOiAgICAgLXRhcmdldCBtaXBzLWxpbnV4LWdudSAtbWZsb2F0LWFiaT1zb2Z0IC1taXBzMTYgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFCSS1TT0ZULU1JUFMxNiAlcwogLy8gQ0hFQ0stQUJJLVNPRlQtTUlQUzE2OiAiLXRhcmdldC1mZWF0dXJlIiAiK3NvZnQtZmxvYXQiCisvLyBDSEVDSy1BQkktU09GVC1NSVBTMTY6ICItdGFyZ2V0LWZlYXR1cmUiICIrbWlwczE2IgogLy8gQ0hFQ0stQUJJLVNPRlQtTUlQUzE2OiAiLW1zb2Z0LWZsb2F0IgogLy8gQ0hFQ0stQUJJLVNPRlQtTUlQUzE2OiAiLW1mbG9hdC1hYmkiICJzb2Z0IgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvbWlwcy1mc2YuY3BwIGIvdGVzdC9Ecml2ZXIvbWlwcy1mc2YuY3BwCmluZGV4IGI5ZmIxMWYuLmM1NTdiMjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL21pcHMtZnNmLmNwcAorKysgYi90ZXN0L0RyaXZlci9taXBzLWZzZi5jcHAKQEAgLTE2LDEzICsxNiwxMyBAQAogLy8gQ0hFQ0stQkUtSEYtMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtSEYtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLUhGLTMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLUhGLTMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMiIKKy8vIENIRUNLLUJFLUhGLTMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMiIKIC8vIENIRUNLLUJFLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLUhGLTMyOiAiW1tUQ11dL21pcHMzMnt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtSEYtMzI6ICItTFtbU1JdXS9taXBzMzIiCi0vLyBDSEVDSy1CRS1IRi0zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMzMiIKLS8vIENIRUNLLUJFLUhGLTMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1IRi0zMjogIi1MW1tUQ11dL21pcHMzMiIKKy8vIENIRUNLLUJFLUhGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyIgorLy8gQ0hFQ0stQkUtSEYtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUJFLUhGLTMyOiAiW1tUQ11dL21pcHMzMnt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC00MiwxMyArNDIsMTMgQEAKIC8vIENIRUNLLUJFLUhGNjQtMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtSEY2NC0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtSEY2NC0zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1IRjY0LTMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9mcDY0IgorLy8gQ0hFQ0stQkUtSEY2NC0zMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvZnA2NCIKIC8vIENIRUNLLUJFLUhGNjQtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvZnA2NC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1CRS1IRjY0LTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2ZwNjQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtSEY2NC0zMjogIltbVENdXS9taXBzMzIvZnA2NHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtSEY2NC0zMjogIi1MW1tTUl1dL21pcHMzMi9mcDY0IgotLy8gQ0hFQ0stQkUtSEY2NC0zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMzMi9mcDY0IgotLy8gQ0hFQ0stQkUtSEY2NC0zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2ZwNjQvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1IRjY0LTMyOiAiLUxbW1RDXV0vbWlwczMyL2ZwNjQiCisvLyBDSEVDSy1CRS1IRjY0LTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL2ZwNjQiCisvLyBDSEVDSy1CRS1IRjY0LTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvZnA2NC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUJFLUhGNjQtMzI6ICJbW1RDXV0vbWlwczMyL2ZwNjR7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1IRjY0LTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2ZwNjQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTY4LDEzICs2OCwxMyBAQAogLy8gQ0hFQ0stQkUtU0YtMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtU0YtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLVNGLTMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLVNGLTMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9zb2YiCisvLyBDSEVDSy1CRS1TRi0zMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvc29mIgogLy8gQ0hFQ0stQkUtU0YtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLVNGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL3NvZi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1TRi0zMjogIltbVENdXS9taXBzMzIvc29me3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1TRi0zMjogIi1MW1tTUl1dL21pcHMzMi9zb2YiCi0vLyBDSEVDSy1CRS1TRi0zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMzMi9zb2YiCi0vLyBDSEVDSy1CRS1TRi0zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL3NvZi91c3IvbGliLy4uL2xpYiIKKy8vIENIRUNLLUJFLVNGLTMyOiAiLUxbW1RDXV0vbWlwczMyL3NvZiIKKy8vIENIRUNLLUJFLVNGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL3NvZiIKKy8vIENIRUNLLUJFLVNGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvc29mL3Vzci9saWIvLi4vbGliIgogLy8gQ0hFQ0stQkUtU0YtMzI6ICJbW1RDXV0vbWlwczMyL3NvZnt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLVNGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL3NvZi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtOTQsMTMgKzk0LDEzIEBACiAvLyBDSEVDSy1CRS1IRi0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1IRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtSEYtMTY6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtSEYtMTY6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNiIKKy8vIENIRUNLLUJFLUhGLTE2OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYiCiAvLyBDSEVDSy1CRS1IRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtSEYtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLUhGLTE2OiAiW1tUQ11dL21pcHMzMi9taXBzMTZ7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLUhGLTE2OiAiLUxbW1NSXV0vbWlwczMyL21pcHMxNiIKLS8vIENIRUNLLUJFLUhGLTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL21pcHMxNiIKLS8vIENIRUNLLUJFLUhGLTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtSEYtMTY6ICItTFtbVENdXS9taXBzMzIvbWlwczE2IgorLy8gQ0hFQ0stQkUtSEYtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvbWlwczE2IgorLy8gQ0hFQ0stQkUtSEYtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1CRS1IRi0xNjogIltbVENdXS9taXBzMzIvbWlwczE2e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtSEYtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xMjAsMTMgKzEyMCwxMyBAQAogLy8gQ0hFQ0stQkUtSEY2NC0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1IRjY0LTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1CRS1IRjY0LTE2OiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLUhGNjQtMTY6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9mcDY0IgorLy8gQ0hFQ0stQkUtSEY2NC0xNjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2ZwNjQiCiAvLyBDSEVDSy1CRS1IRjY0LTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLUhGNjQtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2ZwNjQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtSEY2NC0xNjogIltbVENdXS9taXBzMzIvbWlwczE2L2ZwNjR7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLUhGNjQtMTY6ICItTFtbU1JdXS9taXBzMzIvbWlwczE2L2ZwNjQiCi0vLyBDSEVDSy1CRS1IRjY0LTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL21pcHMxNi9mcDY0IgotLy8gQ0hFQ0stQkUtSEY2NC0xNjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9mcDY0L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtSEY2NC0xNjogIi1MW1tUQ11dL21pcHMzMi9taXBzMTYvZnA2NCIKKy8vIENIRUNLLUJFLUhGNjQtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvbWlwczE2L2ZwNjQiCisvLyBDSEVDSy1CRS1IRjY0LTE2OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2ZwNjQvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1CRS1IRjY0LTE2OiAiW1tUQ11dL21pcHMzMi9taXBzMTYvZnA2NHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLUhGNjQtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2ZwNjQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTE0NiwxMyArMTQ2LDEzIEBACiAvLyBDSEVDSy1CRS1TRi0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtU0YtMTY6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtU0YtMTY6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9zb2YiCisvLyBDSEVDSy1CRS1TRi0xNjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L3NvZiIKIC8vIENIRUNLLUJFLVNGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9zb2YvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtU0YtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L3NvZi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1TRi0xNjogIltbVENdXS9taXBzMzIvbWlwczE2L3NvZnt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtU0YtMTY6ICItTFtbU1JdXS9taXBzMzIvbWlwczE2L3NvZiIKLS8vIENIRUNLLUJFLVNGLTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL21pcHMxNi9zb2YiCi0vLyBDSEVDSy1CRS1TRi0xNjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9zb2YvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1TRi0xNjogIi1MW1tUQ11dL21pcHMzMi9taXBzMTYvc29mIgorLy8gQ0hFQ0stQkUtU0YtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvbWlwczE2L3NvZiIKKy8vIENIRUNLLUJFLVNGLTE2OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L3NvZi91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUJFLVNGLTE2OiAiW1tUQ11dL21pcHMzMi9taXBzMTYvc29me3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtU0YtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L3NvZi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTcyLDEzICsxNzIsMTMgQEAKIC8vIENIRUNLLUJFLU5BTi0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1OQU4tMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLU5BTi0xNjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1OQU4tMTY6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFOLTE2OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvbmFuMjAwOCIKIC8vIENIRUNLLUJFLU5BTi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1CRS1OQU4tMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtTkFOLTE2OiAiW1tUQ11dL21pcHMzMi9taXBzMTYvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtTkFOLTE2OiAiLUxbW1NSXV0vbWlwczMyL21pcHMxNi9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFOLTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL21pcHMxNi9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFOLTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1OQU4tMTY6ICItTFtbVENdXS9taXBzMzIvbWlwczE2L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU4tMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvbWlwczE2L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU4tMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUJFLU5BTi0xNjogIltbVENdXS9taXBzMzIvbWlwczE2L25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1OQU4tMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTE5OCwxMyArMTk4LDEzIEBACiAvLyBDSEVDSy1CRS1OQU42NC0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1OQU42NC0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtTkFONjQtMTY6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtTkFONjQtMTY6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU42NC0xNjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2ZwNjQvbmFuMjAwOCIKIC8vIENIRUNLLUJFLU5BTjY0LTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtTkFONjQtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1OQU42NC0xNjogIltbVENdXS9taXBzMzIvbWlwczE2L2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtTkFONjQtMTY6ICItTFtbU1JdXS9taXBzMzIvbWlwczE2L2ZwNjQvbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTjY0LTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL21pcHMxNi9mcDY0L25hbjIwMDgiCi0vLyBDSEVDSy1CRS1OQU42NC0xNjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1OQU42NC0xNjogIi1MW1tUQ11dL21pcHMzMi9taXBzMTYvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFONjQtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvbWlwczE2L2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTjY0LTE2OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUJFLU5BTjY0LTE2OiAiW1tUQ11dL21pcHMzMi9taXBzMTYvZnA2NC9uYW4yMDA4e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtTkFONjQtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMjI0LDEzICsyMjQsMTMgQEAKIC8vIENIRUNLLUJFLU5BTi0zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1OQU4tMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLU5BTi0zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1OQU4tMzI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU4tMzI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL25hbjIwMDgiCiAvLyBDSEVDSy1CRS1OQU4tMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1CRS1OQU4tMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1OQU4tMzI6ICJbW1RDXV0vbWlwczMyL25hbjIwMDh7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLU5BTi0zMjogIi1MW1tTUl1dL21pcHMzMi9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFOLTMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL25hbjIwMDgiCi0vLyBDSEVDSy1CRS1OQU4tMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9uYW4yMDA4L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtTkFOLTMyOiAiLUxbW1RDXV0vbWlwczMyL25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU4tMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTi0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1CRS1OQU4tMzI6ICJbW1RDXV0vbWlwczMyL25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1OQU4tMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMjUwLDEzICsyNTAsMTMgQEAKIC8vIENIRUNLLUJFLU5BTjY0LTMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLU5BTjY0LTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1CRS1OQU42NC0zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1OQU42NC0zMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFONjQtMzI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2ZwNjQvbmFuMjAwOCIKIC8vIENIRUNLLUJFLU5BTjY0LTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1CRS1OQU42NC0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtTkFONjQtMzI6ICJbW1RDXV0vbWlwczMyL2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtTkFONjQtMzI6ICItTFtbU1JdXS9taXBzMzIvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFONjQtMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFONjQtMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1OQU42NC0zMjogIi1MW1tUQ11dL21pcHMzMi9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU42NC0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMzMi9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU42NC0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUJFLU5BTjY0LTMyOiAiW1tUQ11dL21pcHMzMi9mcDY0L25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1OQU42NC0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTI3NiwxMyArMjc2LDEzIEBACiAvLyBDSEVDSy1CRS1IRi0zMlIyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLUhGLTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLUhGLTMyUjI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtSEYtMzJSMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdCIKKy8vIENIRUNLLUJFLUhGLTMyUjI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QiCiAvLyBDSEVDSy1CRS1IRi0zMlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtSEYtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLUhGLTMyUjI6ICJbW1RDXV17ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLUhGLTMyUjI6ICItTFtbU1JdXSIKLS8vIENIRUNLLUJFLUhGLTMyUjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYiIKLS8vIENIRUNLLUJFLUhGLTMyUjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtSEYtMzJSMjogIi1MW1tUQ11dIgorLy8gQ0hFQ0stQkUtSEYtMzJSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtSEYtMzJSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1CRS1IRi0zMlIyOiAiW1tUQ11de3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtSEYtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0zMDIsMTMgKzMwMiwxMyBAQAogLy8gQ0hFQ0stQkUtSEY2NC0zMlIyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLUhGNjQtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtSEY2NC0zMlIyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLUhGNjQtMzJSMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9mcDY0IgorLy8gQ0hFQ0stQkUtSEY2NC0zMlIyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2ZwNjQiCiAvLyBDSEVDSy1CRS1IRjY0LTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLUhGNjQtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2ZwNjQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtSEY2NC0zMlIyOiAiW1tUQ11dL2ZwNjR7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLUhGNjQtMzJSMjogIi1MW1tTUl1dL2ZwNjQiCi0vLyBDSEVDSy1CRS1IRjY0LTMyUjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9mcDY0IgotLy8gQ0hFQ0stQkUtSEY2NC0zMlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9mcDY0L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtSEY2NC0zMlIyOiAiLUxbW1RDXV0vZnA2NCIKKy8vIENIRUNLLUJFLUhGNjQtMzJSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL2ZwNjQiCisvLyBDSEVDSy1CRS1IRjY0LTMyUjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2ZwNjQvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1CRS1IRjY0LTMyUjI6ICJbW1RDXV0vZnA2NHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLUhGNjQtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2ZwNjQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTMyOCwxMyArMzI4LDEzIEBACiAvLyBDSEVDSy1CRS1TRi0zMlIyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLVNGLTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLVNGLTMyUjI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtU0YtMzJSMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9zb2YiCisvLyBDSEVDSy1CRS1TRi0zMlIyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3NvZiIKIC8vIENIRUNLLUJFLVNGLTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9zb2YvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtU0YtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3NvZi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1TRi0zMlIyOiAiW1tUQ11dL3NvZnt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtU0YtMzJSMjogIi1MW1tTUl1dL3NvZiIKLS8vIENIRUNLLUJFLVNGLTMyUjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9zb2YiCi0vLyBDSEVDSy1CRS1TRi0zMlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9zb2YvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1TRi0zMlIyOiAiLUxbW1RDXV0vc29mIgorLy8gQ0hFQ0stQkUtU0YtMzJSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL3NvZiIKKy8vIENIRUNLLUJFLVNGLTMyUjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3NvZi91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUJFLVNGLTMyUjI6ICJbW1RDXV0vc29me3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtU0YtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3NvZi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMzU0LDEzICszNTQsMTMgQEAKIC8vIENIRUNLLUJFLUhGLTE2UjI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtSEYtMTZSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtSEYtMTZSMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1IRi0xNlIyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNiIKKy8vIENIRUNLLUJFLUhGLTE2UjI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2IgogLy8gQ0hFQ0stQkUtSEYtMTZSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1CRS1IRi0xNlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLUhGLTE2UjI6ICJbW1RDXV0vbWlwczE2e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1IRi0xNlIyOiAiLUxbW1NSXV0vbWlwczE2IgotLy8gQ0hFQ0stQkUtSEYtMTZSMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMxNiIKLS8vIENIRUNLLUJFLUhGLTE2UjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi91c3IvbGliLy4uL2xpYiIKKy8vIENIRUNLLUJFLUhGLTE2UjI6ICItTFtbVENdXS9taXBzMTYiCisvLyBDSEVDSy1CRS1IRi0xNlIyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2IgorLy8gQ0hFQ0stQkUtSEYtMTZSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L3Vzci9saWIvLi4vbGliIgogLy8gQ0hFQ0stQkUtSEYtMTZSMjogIltbVENdXS9taXBzMTZ7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1IRi0xNlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0zODAsMTMgKzM4MCwxMyBAQAogLy8gQ0hFQ0stQkUtSEY2NC0xNlIyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLUhGNjQtMTZSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtSEY2NC0xNlIyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLUhGNjQtMTZSMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZnA2NCIKKy8vIENIRUNLLUJFLUhGNjQtMTZSMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZnA2NCIKIC8vIENIRUNLLUJFLUhGNjQtMTZSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLUhGNjQtMTZSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLUhGNjQtMTZSMjogIltbVENdXS9taXBzMTYvZnA2NHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtSEY2NC0xNlIyOiAiLUxbW1NSXV0vbWlwczE2L2ZwNjQiCi0vLyBDSEVDSy1CRS1IRjY0LTE2UjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMTYvZnA2NCIKLS8vIENIRUNLLUJFLUhGNjQtMTZSMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2ZwNjQvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1IRjY0LTE2UjI6ICItTFtbVENdXS9taXBzMTYvZnA2NCIKKy8vIENIRUNLLUJFLUhGNjQtMTZSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMxNi9mcDY0IgorLy8gQ0hFQ0stQkUtSEY2NC0xNlIyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZnA2NC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUJFLUhGNjQtMTZSMjogIltbVENdXS9taXBzMTYvZnA2NHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLUhGNjQtMTZSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC00MDYsMTMgKzQwNiwxMyBAQAogLy8gQ0hFQ0stQkUtU0YtMTZSMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1TRi0xNlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1CRS1TRi0xNlIyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLVNGLTE2UjI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L3NvZiIKKy8vIENIRUNLLUJFLVNGLTE2UjI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L3NvZiIKIC8vIENIRUNLLUJFLVNGLTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLVNGLTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLVNGLTE2UjI6ICJbW1RDXV0vbWlwczE2L3NvZnt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtU0YtMTZSMjogIi1MW1tTUl1dL21pcHMxNi9zb2YiCi0vLyBDSEVDSy1CRS1TRi0xNlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2L3NvZiIKLS8vIENIRUNLLUJFLVNGLTE2UjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9zb2YvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1TRi0xNlIyOiAiLUxbW1RDXV0vbWlwczE2L3NvZiIKKy8vIENIRUNLLUJFLVNGLTE2UjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMTYvc29mIgorLy8gQ0hFQ0stQkUtU0YtMTZSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L3NvZi91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUJFLVNGLTE2UjI6ICJbW1RDXV0vbWlwczE2L3NvZnt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLVNGLTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC00MzIsMTMgKzQzMiwxMyBAQAogLy8gQ0hFQ0stQkUtTkFOLTE2UjI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtTkFOLTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLU5BTi0xNlIyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLU5BTi0xNlIyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFOLTE2UjI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L25hbjIwMDgiCiAvLyBDSEVDSy1CRS1OQU4tMTZSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLU5BTi0xNlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtTkFOLTE2UjI6ICJbW1RDXV0vbWlwczE2L25hbjIwMDh7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLU5BTi0xNlIyOiAiLUxbW1NSXV0vbWlwczE2L25hbjIwMDgiCi0vLyBDSEVDSy1CRS1OQU4tMTZSMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMxNi9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFOLTE2UjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9uYW4yMDA4L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtTkFOLTE2UjI6ICItTFtbVENdXS9taXBzMTYvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTi0xNlIyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU4tMTZSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1CRS1OQU4tMTZSMjogIltbVENdXS9taXBzMTYvbmFuMjAwOHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLU5BTi0xNlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTQ1OCwxMyArNDU4LDEzIEBACiAvLyBDSEVDSy1CRS1OQU42NC0xNlIyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLU5BTjY0LTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLU5BTjY0LTE2UjI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtTkFONjQtMTZSMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFONjQtMTZSMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZnA2NC9uYW4yMDA4IgogLy8gQ0hFQ0stQkUtTkFONjQtMTZSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtTkFONjQtMTZSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtTkFONjQtMTZSMjogIltbVENdXS9taXBzMTYvZnA2NC9uYW4yMDA4e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1OQU42NC0xNlIyOiAiLUxbW1NSXV0vbWlwczE2L2ZwNjQvbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTjY0LTE2UjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMTYvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFONjQtMTZSMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKKy8vIENIRUNLLUJFLU5BTjY0LTE2UjI6ICItTFtbVENdXS9taXBzMTYvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFONjQtMTZSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMxNi9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU42NC0xNlIyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZnA2NC9uYW4yMDA4L3Vzci9saWIvLi4vbGliIgogLy8gQ0hFQ0stQkUtTkFONjQtMTZSMjogIltbVENdXS9taXBzMTYvZnA2NC9uYW4yMDA4e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtTkFONjQtMTZSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTQ4NCwxMyArNDg0LDEzIEBACiAvLyBDSEVDSy1CRS1OQU4tMzJSMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1OQU4tMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtTkFOLTMyUjI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtTkFOLTMyUjI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTi0zMlIyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L25hbjIwMDgiCiAvLyBDSEVDSy1CRS1OQU4tMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtTkFOLTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLU5BTi0zMlIyOiAiW1tUQ11dL25hbjIwMDh7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLU5BTi0zMlIyOiAiLUxbW1NSXV0vbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTi0zMlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTi0zMlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9uYW4yMDA4L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtTkFOLTMyUjI6ICItTFtbVENdXS9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFOLTMyUjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFOLTMyUjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1CRS1OQU4tMzJSMjogIltbVENdXS9uYW4yMDA4e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtTkFOLTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC01MTAsMTMgKzUxMCwxMyBAQAogLy8gQ0hFQ0stQkUtTkFONjQtMzJSMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1OQU42NC0zMlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1CRS1OQU42NC0zMlIyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLU5BTjY0LTMyUjI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFONjQtMzJSMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9mcDY0L25hbjIwMDgiCiAvLyBDSEVDSy1CRS1OQU42NC0zMlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvZnA2NC9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLU5BTjY0LTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtTkFONjQtMzJSMjogIltbVENdXS9mcDY0L25hbjIwMDh7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLU5BTjY0LTMyUjI6ICItTFtbU1JdXS9mcDY0L25hbjIwMDgiCi0vLyBDSEVDSy1CRS1OQU42NC0zMlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFONjQtMzJSMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvZnA2NC9uYW4yMDA4L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtTkFONjQtMzJSMjogIi1MW1tUQ11dL2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTjY0LTMyUjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU42NC0zMlIyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1CRS1OQU42NC0zMlIyOiAiW1tUQ11dL2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLU5BTjY0LTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTUzNiwxMyArNTM2LDEzIEBACiAvLyBDSEVDSy1CRS1IRi1NTTogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1IRi1NTTogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtSEYtTU06ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtSEYtTU06ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzIgorLy8gQ0hFQ0stQkUtSEYtTU06ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzIgogLy8gQ0hFQ0stQkUtSEYtTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtSEYtTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtSEYtTU06ICJbW1RDXV0vbWljcm9taXBze3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1IRi1NTTogIi1MW1tTUl1dL21pY3JvbWlwcyIKLS8vIENIRUNLLUJFLUhGLU1NOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWljcm9taXBzIgotLy8gQ0hFQ0stQkUtSEYtTU06ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy91c3IvbGliLy4uL2xpYiIKKy8vIENIRUNLLUJFLUhGLU1NOiAiLUxbW1RDXV0vbWljcm9taXBzIgorLy8gQ0hFQ0stQkUtSEYtTU06ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taWNyb21pcHMiCisvLyBDSEVDSy1CRS1IRi1NTTogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL3Vzci9saWIvLi4vbGliIgogLy8gQ0hFQ0stQkUtSEYtTU06ICJbW1RDXV0vbWljcm9taXBze3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtSEYtTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTU2MiwxMyArNTYyLDEzIEBACiAvLyBDSEVDSy1CRS1IRjY0LU1NOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLUhGNjQtTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLUhGNjQtTU06ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtSEY2NC1NTTogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvZnA2NCIKKy8vIENIRUNLLUJFLUhGNjQtTU06ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2ZwNjQiCiAvLyBDSEVDSy1CRS1IRjY0LU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2ZwNjQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtSEY2NC1NTTogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLUhGNjQtTU06ICJbW1RDXV0vbWljcm9taXBzL2ZwNjR7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLUhGNjQtTU06ICItTFtbU1JdXS9taWNyb21pcHMvZnA2NCIKLS8vIENIRUNLLUJFLUhGNjQtTU06ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taWNyb21pcHMvZnA2NCIKLS8vIENIRUNLLUJFLUhGNjQtTU06ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9mcDY0L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtSEY2NC1NTTogIi1MW1tUQ11dL21pY3JvbWlwcy9mcDY0IgorLy8gQ0hFQ0stQkUtSEY2NC1NTTogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pY3JvbWlwcy9mcDY0IgorLy8gQ0hFQ0stQkUtSEY2NC1NTTogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2ZwNjQvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1CRS1IRjY0LU1NOiAiW1tUQ11dL21pY3JvbWlwcy9mcDY0e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtSEY2NC1NTTogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC01ODgsMTMgKzU4OCwxMyBAQAogLy8gQ0hFQ0stQkUtU0YtTU06ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtU0YtTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLVNGLU1NOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLVNGLU1NOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9zb2YiCisvLyBDSEVDSy1CRS1TRi1NTTogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvc29mIgogLy8gQ0hFQ0stQkUtU0YtTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLVNGLU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL3NvZi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1TRi1NTTogIltbVENdXS9taWNyb21pcHMvc29me3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1TRi1NTTogIi1MW1tTUl1dL21pY3JvbWlwcy9zb2YiCi0vLyBDSEVDSy1CRS1TRi1NTTogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pY3JvbWlwcy9zb2YiCi0vLyBDSEVDSy1CRS1TRi1NTTogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL3NvZi91c3IvbGliLy4uL2xpYiIKKy8vIENIRUNLLUJFLVNGLU1NOiAiLUxbW1RDXV0vbWljcm9taXBzL3NvZiIKKy8vIENIRUNLLUJFLVNGLU1NOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWljcm9taXBzL3NvZiIKKy8vIENIRUNLLUJFLVNGLU1NOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvc29mL3Vzci9saWIvLi4vbGliIgogLy8gQ0hFQ0stQkUtU0YtTU06ICJbW1RDXV0vbWljcm9taXBzL3NvZnt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLVNGLU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL3NvZi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtNjE0LDEzICs2MTQsMTMgQEAKIC8vIENIRUNLLUJFLU5BTi1NTTogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1OQU4tTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLU5BTi1NTTogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1OQU4tTU06ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU4tTU06ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL25hbjIwMDgiCiAvLyBDSEVDSy1CRS1OQU4tTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1CRS1OQU4tTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1OQU4tTU06ICJbW1RDXV0vbWljcm9taXBzL25hbjIwMDh7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLU5BTi1NTTogIi1MW1tTUl1dL21pY3JvbWlwcy9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFOLU1NOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWljcm9taXBzL25hbjIwMDgiCi0vLyBDSEVDSy1CRS1OQU4tTU06ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9uYW4yMDA4L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stQkUtTkFOLU1NOiAiLUxbW1RDXV0vbWljcm9taXBzL25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU4tTU06ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taWNyb21pcHMvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTi1NTTogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1CRS1OQU4tTU06ICJbW1RDXV0vbWljcm9taXBzL25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1OQU4tTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtNjQwLDEzICs2NDAsMTMgQEAKIC8vIENIRUNLLUJFLU5BTjY0LU1NOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLU5BTjY0LU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1CRS1OQU42NC1NTTogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1OQU42NC1NTTogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFONjQtTU06ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2ZwNjQvbmFuMjAwOCIKIC8vIENIRUNLLUJFLU5BTjY0LU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1CRS1OQU42NC1NTTogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtTkFONjQtTU06ICJbW1RDXV0vbWljcm9taXBzL2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtTkFONjQtTU06ICItTFtbU1JdXS9taWNyb21pcHMvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFONjQtTU06ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taWNyb21pcHMvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFONjQtTU06ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1CRS1OQU42NC1NTTogIi1MW1tUQ11dL21pY3JvbWlwcy9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU42NC1NTTogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pY3JvbWlwcy9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU42NC1NTTogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUJFLU5BTjY0LU1NOiAiW1tUQ11dL21pY3JvbWlwcy9mcDY0L25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1OQU42NC1NTTogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTY2NiwxMyArNjY2LDEzIEBACiAvLyBDSEVDSy1CRS1IRi02NC1OMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtSEYtNjQtTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1CRS1IRi02NC1OMzI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtSEYtNjQtTjMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NCIKKy8vIENIRUNLLUJFLUhGLTY0LU4zMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQiCiAvLyBDSEVDSy1CRS1IRi02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvdXNyL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1CRS1IRi02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1IRi02NC1OMzI6ICJbW1RDXV0vbWlwczY0e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1IRi02NC1OMzI6ICItTFtbU1JdXS9taXBzNjQiCi0vLyBDSEVDSy1CRS1IRi02NC1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NCIKLS8vIENIRUNLLUJFLUhGLTY0LU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L3Vzci9saWIiCisvLyBDSEVDSy1CRS1IRi02NC1OMzI6ICItTFtbVENdXS9taXBzNjQiCisvLyBDSEVDSy1CRS1IRi02NC1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NCIKKy8vIENIRUNLLUJFLUhGLTY0LU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L3Vzci9saWIiCiAvLyBDSEVDSy1CRS1IRi02NC1OMzI6ICJbW1RDXV0vbWlwczY0e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtSEYtNjQtTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTY5MiwxMyArNjkyLDEzIEBACiAvLyBDSEVDSy1CRS1IRjY0LTY0LU4zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1IRjY0LTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtSEY2NC02NC1OMzI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtSEY2NC02NC1OMzI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2ZwNjQiCisvLyBDSEVDSy1CRS1IRjY0LTY0LU4zMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZnA2NCIKIC8vIENIRUNLLUJFLUhGNjQtNjQtTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2ZwNjQvdXNyL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1CRS1IRjY0LTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9mcDY0L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtSEY2NC02NC1OMzI6ICJbW1RDXV0vbWlwczY0L2ZwNjR7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLUhGNjQtNjQtTjMyOiAiLUxbW1NSXV0vbWlwczY0L2ZwNjQiCi0vLyBDSEVDSy1CRS1IRjY0LTY0LU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0L2ZwNjQiCi0vLyBDSEVDSy1CRS1IRjY0LTY0LU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2ZwNjQvdXNyL2xpYiIKKy8vIENIRUNLLUJFLUhGNjQtNjQtTjMyOiAiLUxbW1RDXV0vbWlwczY0L2ZwNjQiCisvLyBDSEVDSy1CRS1IRjY0LTY0LU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0L2ZwNjQiCisvLyBDSEVDSy1CRS1IRjY0LTY0LU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2ZwNjQvdXNyL2xpYiIKIC8vIENIRUNLLUJFLUhGNjQtNjQtTjMyOiAiW1tUQ11dL21pcHM2NC9mcDY0e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtSEY2NC02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZnA2NC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC03MTgsMTMgKzcxOCwxMyBAQAogLy8gQ0hFQ0stQkUtU0YtNjQtTjMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLVNGLTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtU0YtNjQtTjMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLVNGLTY0LU4zMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvc29mIgorLy8gQ0hFQ0stQkUtU0YtNjQtTjMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9zb2YiCiAvLyBDSEVDSy1CRS1TRi02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvc29mL3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtU0YtNjQtTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L3NvZi91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLVNGLTY0LU4zMjogIltbVENdXS9taXBzNjQvc29me3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1TRi02NC1OMzI6ICItTFtbU1JdXS9taXBzNjQvc29mIgotLy8gQ0hFQ0stQkUtU0YtNjQtTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjQvc29mIgotLy8gQ0hFQ0stQkUtU0YtNjQtTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvc29mL3Vzci9saWIiCisvLyBDSEVDSy1CRS1TRi02NC1OMzI6ICItTFtbVENdXS9taXBzNjQvc29mIgorLy8gQ0hFQ0stQkUtU0YtNjQtTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjQvc29mIgorLy8gQ0hFQ0stQkUtU0YtNjQtTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvc29mL3Vzci9saWIiCiAvLyBDSEVDSy1CRS1TRi02NC1OMzI6ICJbW1RDXV0vbWlwczY0L3NvZnt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLVNGLTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9zb2YvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtNzQ0LDEzICs3NDQsMTMgQEAKIC8vIENIRUNLLUJFLU5BTi02NC1OMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtTkFOLTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtTkFOLTY0LU4zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1OQU4tNjQtTjMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFOLTY0LU4zMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvbmFuMjAwOCIKIC8vIENIRUNLLUJFLU5BTi02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLU5BTi02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLU5BTi02NC1OMzI6ICJbW1RDXV0vbWlwczY0L25hbjIwMDh7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLU5BTi02NC1OMzI6ICItTFtbU1JdXS9taXBzNjQvbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTi02NC1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NC9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFOLTY0LU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L25hbjIwMDgvdXNyL2xpYiIKKy8vIENIRUNLLUJFLU5BTi02NC1OMzI6ICItTFtbVENdXS9taXBzNjQvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTi02NC1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFOLTY0LU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L25hbjIwMDgvdXNyL2xpYiIKIC8vIENIRUNLLUJFLU5BTi02NC1OMzI6ICJbW1RDXV0vbWlwczY0L25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1OQU4tNjQtTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L25hbjIwMDgvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtNzcwLDEzICs3NzAsMTMgQEAKIC8vIENIRUNLLUJFLU5BTjY0LTY0LU4zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1OQU42NC02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLU5BTjY0LTY0LU4zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1OQU42NC02NC1OMzI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTjY0LTY0LU4zMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZnA2NC9uYW4yMDA4IgogLy8gQ0hFQ0stQkUtTkFONjQtNjQtTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2ZwNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLU5BTjY0LTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9mcDY0L25hbjIwMDgvdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1OQU42NC02NC1OMzI6ICJbW1RDXV0vbWlwczY0L2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtTkFONjQtNjQtTjMyOiAiLUxbW1NSXV0vbWlwczY0L2ZwNjQvbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTjY0LTY0LU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0L2ZwNjQvbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTjY0LTY0LU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2ZwNjQvbmFuMjAwOC91c3IvbGliIgorLy8gQ0hFQ0stQkUtTkFONjQtNjQtTjMyOiAiLUxbW1RDXV0vbWlwczY0L2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTjY0LTY0LU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0L2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTjY0LTY0LU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2ZwNjQvbmFuMjAwOC91c3IvbGliIgogLy8gQ0hFQ0stQkUtTkFONjQtNjQtTjMyOiAiW1tUQ11dL21pcHM2NC9mcDY0L25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1OQU42NC02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZnA2NC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTc5NiwxMyArNzk2LDEzIEBACiAvLyBDSEVDSy1CRS1IRi02NC02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1IRi02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtSEYtNjQtNjQ6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtSEYtNjQtNjQ6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0IgorLy8gQ0hFQ0stQkUtSEYtNjQtNjQ6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0IgogLy8gQ0hFQ0stQkUtSEYtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvdXNyL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1CRS1IRi02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLUhGLTY0LTY0OiAiW1tUQ11dL21pcHM2NC82NHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtSEYtNjQtNjQ6ICItTFtbU1JdXS9taXBzNjQvNjQiCi0vLyBDSEVDSy1CRS1IRi02NC02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0IgotLy8gQ0hFQ0stQkUtSEYtNjQtNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC91c3IvbGliIgorLy8gQ0hFQ0stQkUtSEYtNjQtNjQ6ICItTFtbVENdXS9taXBzNjQvNjQiCisvLyBDSEVDSy1CRS1IRi02NC02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0IgorLy8gQ0hFQ0stQkUtSEYtNjQtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC91c3IvbGliIgogLy8gQ0hFQ0stQkUtSEYtNjQtNjQ6ICJbW1RDXV0vbWlwczY0LzY0e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtSEYtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtODIyLDEzICs4MjIsMTMgQEAKIC8vIENIRUNLLUJFLUhGNjQtNjQtNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtSEY2NC02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtSEY2NC02NC02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1IRjY0LTY0LTY0OiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9mcDY0IgorLy8gQ0hFQ0stQkUtSEY2NC02NC02NDogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZnA2NCIKIC8vIENIRUNLLUJFLUhGNjQtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZnA2NC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLUhGNjQtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZnA2NC91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLUhGNjQtNjQtNjQ6ICJbW1RDXV0vbWlwczY0LzY0L2ZwNjR7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLUhGNjQtNjQtNjQ6ICItTFtbU1JdXS9taXBzNjQvNjQvZnA2NCIKLS8vIENIRUNLLUJFLUhGNjQtNjQtNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NC82NC9mcDY0IgotLy8gQ0hFQ0stQkUtSEY2NC02NC02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2ZwNjQvdXNyL2xpYiIKKy8vIENIRUNLLUJFLUhGNjQtNjQtNjQ6ICItTFtbVENdXS9taXBzNjQvNjQvZnA2NCIKKy8vIENIRUNLLUJFLUhGNjQtNjQtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NC82NC9mcDY0IgorLy8gQ0hFQ0stQkUtSEY2NC02NC02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2ZwNjQvdXNyL2xpYiIKIC8vIENIRUNLLUJFLUhGNjQtNjQtNjQ6ICJbW1RDXV0vbWlwczY0LzY0L2ZwNjR7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1IRjY0LTY0LTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2ZwNjQvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtODQ4LDEzICs4NDgsMTMgQEAKIC8vIENIRUNLLUJFLVNGLTY0LTY0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLVNGLTY0LTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1CRS1TRi02NC02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1TRi02NC02NDogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvc29mIgorLy8gQ0hFQ0stQkUtU0YtNjQtNjQ6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L3NvZiIKIC8vIENIRUNLLUJFLVNGLTY0LTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L3NvZi91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLVNGLTY0LTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L3NvZi91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLVNGLTY0LTY0OiAiW1tUQ11dL21pcHM2NC82NC9zb2Z7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLVNGLTY0LTY0OiAiLUxbW1NSXV0vbWlwczY0LzY0L3NvZiIKLS8vIENIRUNLLUJFLVNGLTY0LTY0OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjQvNjQvc29mIgotLy8gQ0hFQ0stQkUtU0YtNjQtNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9zb2YvdXNyL2xpYiIKKy8vIENIRUNLLUJFLVNGLTY0LTY0OiAiLUxbW1RDXV0vbWlwczY0LzY0L3NvZiIKKy8vIENIRUNLLUJFLVNGLTY0LTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjQvNjQvc29mIgorLy8gQ0hFQ0stQkUtU0YtNjQtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9zb2YvdXNyL2xpYiIKIC8vIENIRUNLLUJFLVNGLTY0LTY0OiAiW1tUQ11dL21pcHM2NC82NC9zb2Z7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1TRi02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9zb2YvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtODc0LDEzICs4NzQsMTMgQEAKIC8vIENIRUNLLUJFLU5BTi02NC02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1OQU4tNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLU5BTi02NC02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1OQU4tNjQtNjQ6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU4tNjQtNjQ6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L25hbjIwMDgiCiAvLyBDSEVDSy1CRS1OQU4tNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLU5BTi02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtTkFOLTY0LTY0OiAiW1tUQ11dL21pcHM2NC82NC9uYW4yMDA4e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1OQU4tNjQtNjQ6ICItTFtbU1JdXS9taXBzNjQvNjQvbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTi02NC02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L25hbjIwMDgiCi0vLyBDSEVDSy1CRS1OQU4tNjQtNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9uYW4yMDA4L3Vzci9saWIiCisvLyBDSEVDSy1CRS1OQU4tNjQtNjQ6ICItTFtbVENdXS9taXBzNjQvNjQvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTi02NC02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU4tNjQtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9uYW4yMDA4L3Vzci9saWIiCiAvLyBDSEVDSy1CRS1OQU4tNjQtNjQ6ICJbW1RDXV0vbWlwczY0LzY0L25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1OQU4tNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC05MDAsMTMgKzkwMCwxMyBAQAogLy8gQ0hFQ0stQkUtTkFONjQtNjQtNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtTkFONjQtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLU5BTjY0LTY0LTY0OiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLU5BTjY0LTY0LTY0OiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU42NC02NC02NDogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZnA2NC9uYW4yMDA4IgogLy8gQ0hFQ0stQkUtTkFONjQtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZnA2NC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtTkFONjQtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZnA2NC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtTkFONjQtNjQtNjQ6ICJbW1RDXV0vbWlwczY0LzY0L2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtTkFONjQtNjQtNjQ6ICItTFtbU1JdXS9taXBzNjQvNjQvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFONjQtNjQtNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NC82NC9mcDY0L25hbjIwMDgiCi0vLyBDSEVDSy1CRS1OQU42NC02NC02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2ZwNjQvbmFuMjAwOC91c3IvbGliIgorLy8gQ0hFQ0stQkUtTkFONjQtNjQtNjQ6ICItTFtbVENdXS9taXBzNjQvNjQvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFONjQtNjQtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NC82NC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU42NC02NC02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2ZwNjQvbmFuMjAwOC91c3IvbGliIgogLy8gQ0hFQ0stQkUtTkFONjQtNjQtNjQ6ICJbW1RDXV0vbWlwczY0LzY0L2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLU5BTjY0LTY0LTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2ZwNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC05MjYsMTMgKzkyNiwxMyBAQAogLy8gQ0hFQ0stQkUtSEYtNjRSMi1OMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtSEYtNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLUhGLTY0UjItTjMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLUhGLTY0UjItTjMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyIgorLy8gQ0hFQ0stQkUtSEYtNjRSMi1OMzI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIiCiAvLyBDSEVDSy1CRS1IRi02NFIyLU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtSEYtNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLUhGLTY0UjItTjMyOiAiW1tUQ11dL21pcHM2NHIye3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1IRi02NFIyLU4zMjogIi1MW1tTUl1dL21pcHM2NHIyIgotLy8gQ0hFQ0stQkUtSEYtNjRSMi1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyIgotLy8gQ0hFQ0stQkUtSEYtNjRSMi1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL3Vzci9saWIiCisvLyBDSEVDSy1CRS1IRi02NFIyLU4zMjogIi1MW1tUQ11dL21pcHM2NHIyIgorLy8gQ0hFQ0stQkUtSEYtNjRSMi1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyIgorLy8gQ0hFQ0stQkUtSEYtNjRSMi1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL3Vzci9saWIiCiAvLyBDSEVDSy1CRS1IRi02NFIyLU4zMjogIltbVENdXS9taXBzNjRyMnt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLUhGLTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtOTUyLDEzICs5NTIsMTMgQEAKIC8vIENIRUNLLUJFLUhGNjQtNjRSMi1OMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtSEY2NC02NFIyLU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtSEY2NC02NFIyLU4zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1IRjY0LTY0UjItTjMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2ZwNjQiCisvLyBDSEVDSy1CRS1IRjY0LTY0UjItTjMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2ZwNjQiCiAvLyBDSEVDSy1CRS1IRjY0LTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZnA2NC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLUhGNjQtNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9mcDY0L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtSEY2NC02NFIyLU4zMjogIltbVENdXS9taXBzNjRyMi9mcDY0e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1IRjY0LTY0UjItTjMyOiAiLUxbW1NSXV0vbWlwczY0cjIvZnA2NCIKLS8vIENIRUNLLUJFLUhGNjQtNjRSMi1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyL2ZwNjQiCi0vLyBDSEVDSy1CRS1IRjY0LTY0UjItTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9mcDY0L3Vzci9saWIiCisvLyBDSEVDSy1CRS1IRjY0LTY0UjItTjMyOiAiLUxbW1RDXV0vbWlwczY0cjIvZnA2NCIKKy8vIENIRUNLLUJFLUhGNjQtNjRSMi1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyL2ZwNjQiCisvLyBDSEVDSy1CRS1IRjY0LTY0UjItTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9mcDY0L3Vzci9saWIiCiAvLyBDSEVDSy1CRS1IRjY0LTY0UjItTjMyOiAiW1tUQ11dL21pcHM2NHIyL2ZwNjR7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1IRjY0LTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZnA2NC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC05NzgsMTMgKzk3OCwxMyBAQAogLy8gQ0hFQ0stQkUtU0YtNjRSMi1OMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtU0YtNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLVNGLTY0UjItTjMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLVNGLTY0UjItTjMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL3NvZiIKKy8vIENIRUNLLUJFLVNGLTY0UjItTjMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL3NvZiIKIC8vIENIRUNLLUJFLVNGLTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvc29mL3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtU0YtNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9zb2YvdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1TRi02NFIyLU4zMjogIltbVENdXS9taXBzNjRyMi9zb2Z7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLVNGLTY0UjItTjMyOiAiLUxbW1NSXV0vbWlwczY0cjIvc29mIgotLy8gQ0hFQ0stQkUtU0YtNjRSMi1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyL3NvZiIKLS8vIENIRUNLLUJFLVNGLTY0UjItTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9zb2YvdXNyL2xpYiIKKy8vIENIRUNLLUJFLVNGLTY0UjItTjMyOiAiLUxbW1RDXV0vbWlwczY0cjIvc29mIgorLy8gQ0hFQ0stQkUtU0YtNjRSMi1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyL3NvZiIKKy8vIENIRUNLLUJFLVNGLTY0UjItTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9zb2YvdXNyL2xpYiIKIC8vIENIRUNLLUJFLVNGLTY0UjItTjMyOiAiW1tUQ11dL21pcHM2NHIyL3NvZnt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLVNGLTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvc29mL3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTEwMDQsMTMgKzEwMDQsMTMgQEAKIC8vIENIRUNLLUJFLU5BTi02NFIyLU4zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1OQU4tNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLU5BTi02NFIyLU4zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1OQU4tNjRSMi1OMzI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTi02NFIyLU4zMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9uYW4yMDA4IgogLy8gQ0hFQ0stQkUtTkFOLTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLU5BTi02NFIyLU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL25hbjIwMDgvdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1OQU4tNjRSMi1OMzI6ICJbW1RDXV0vbWlwczY0cjIvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtTkFOLTY0UjItTjMyOiAiLUxbW1NSXV0vbWlwczY0cjIvbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTi02NFIyLU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0cjIvbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTi02NFIyLU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvbmFuMjAwOC91c3IvbGliIgorLy8gQ0hFQ0stQkUtTkFOLTY0UjItTjMyOiAiLUxbW1RDXV0vbWlwczY0cjIvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTi02NFIyLU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0cjIvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTi02NFIyLU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvbmFuMjAwOC91c3IvbGliIgogLy8gQ0hFQ0stQkUtTkFOLTY0UjItTjMyOiAiW1tUQ11dL21pcHM2NHIyL25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1OQU4tNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTEwMzAsMTMgKzEwMzAsMTMgQEAKIC8vIENIRUNLLUJFLU5BTjY0LTY0UjItTjMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLU5BTjY0LTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1CRS1OQU42NC02NFIyLU4zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1OQU42NC02NFIyLU4zMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU42NC02NFIyLU4zMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9mcDY0L25hbjIwMDgiCiAvLyBDSEVDSy1CRS1OQU42NC02NFIyLU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2ZwNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLU5BTjY0LTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZnA2NC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stQkUtTkFONjQtNjRSMi1OMzI6ICJbW1RDXV0vbWlwczY0cjIvZnA2NC9uYW4yMDA4e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1OQU42NC02NFIyLU4zMjogIi1MW1tTUl1dL21pcHM2NHIyL2ZwNjQvbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTjY0LTY0UjItTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi9mcDY0L25hbjIwMDgiCi0vLyBDSEVDSy1CRS1OQU42NC02NFIyLU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZnA2NC9uYW4yMDA4L3Vzci9saWIiCisvLyBDSEVDSy1CRS1OQU42NC02NFIyLU4zMjogIi1MW1tUQ11dL21pcHM2NHIyL2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTjY0LTY0UjItTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1CRS1OQU42NC02NFIyLU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZnA2NC9uYW4yMDA4L3Vzci9saWIiCiAvLyBDSEVDSy1CRS1OQU42NC02NFIyLU4zMjogIltbVENdXS9taXBzNjRyMi9mcDY0L25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1OQU42NC02NFIyLU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2ZwNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xMDU2LDEzICsxMDU2LDEzIEBACiAvLyBDSEVDSy1CRS1IRi02NFIyLTY0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLUhGLTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLUhGLTY0UjItNjQ6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stQkUtSEYtNjRSMi02NDogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NCIKKy8vIENIRUNLLUJFLUhGLTY0UjItNjQ6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQiCiAvLyBDSEVDSy1CRS1IRi02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvdXNyL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1CRS1IRi02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1IRi02NFIyLTY0OiAiW1tUQ11dL21pcHM2NHIyLzY0e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1IRi02NFIyLTY0OiAiLUxbW1NSXV0vbWlwczY0cjIvNjQiCi0vLyBDSEVDSy1CRS1IRi02NFIyLTY0OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi82NCIKLS8vIENIRUNLLUJFLUhGLTY0UjItNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L3Vzci9saWIiCisvLyBDSEVDSy1CRS1IRi02NFIyLTY0OiAiLUxbW1RDXV0vbWlwczY0cjIvNjQiCisvLyBDSEVDSy1CRS1IRi02NFIyLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi82NCIKKy8vIENIRUNLLUJFLUhGLTY0UjItNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L3Vzci9saWIiCiAvLyBDSEVDSy1CRS1IRi02NFIyLTY0OiAiW1tUQ11dL21pcHM2NHIyLzY0e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stQkUtSEYtNjRSMi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTEwODIsMTMgKzEwODIsMTMgQEAKIC8vIENIRUNLLUJFLUhGNjQtNjRSMi02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1IRjY0LTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUJFLUhGNjQtNjRSMi02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1IRjY0LTY0UjItNjQ6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZnA2NCIKKy8vIENIRUNLLUJFLUhGNjQtNjRSMi02NDogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9mcDY0IgogLy8gQ0hFQ0stQkUtSEY2NC02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZnA2NC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLUhGNjQtNjRSMi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L2ZwNjQvdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1IRjY0LTY0UjItNjQ6ICJbW1RDXV0vbWlwczY0cjIvNjQvZnA2NHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtSEY2NC02NFIyLTY0OiAiLUxbW1NSXV0vbWlwczY0cjIvNjQvZnA2NCIKLS8vIENIRUNLLUJFLUhGNjQtNjRSMi02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0cjIvNjQvZnA2NCIKLS8vIENIRUNLLUJFLUhGNjQtNjRSMi02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZnA2NC91c3IvbGliIgorLy8gQ0hFQ0stQkUtSEY2NC02NFIyLTY0OiAiLUxbW1RDXV0vbWlwczY0cjIvNjQvZnA2NCIKKy8vIENIRUNLLUJFLUhGNjQtNjRSMi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0cjIvNjQvZnA2NCIKKy8vIENIRUNLLUJFLUhGNjQtNjRSMi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZnA2NC91c3IvbGliIgogLy8gQ0hFQ0stQkUtSEY2NC02NFIyLTY0OiAiW1tUQ11dL21pcHM2NHIyLzY0L2ZwNjR7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1IRjY0LTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9mcDY0L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTExMDgsMTMgKzExMDgsMTMgQEAKIC8vIENIRUNLLUJFLVNGLTY0UjItNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stQkUtU0YtNjRSMi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stQkUtU0YtNjRSMi02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1TRi02NFIyLTY0OiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L3NvZiIKKy8vIENIRUNLLUJFLVNGLTY0UjItNjQ6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvc29mIgogLy8gQ0hFQ0stQkUtU0YtNjRSMi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L3NvZi91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLVNGLTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9zb2YvdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1CRS1TRi02NFIyLTY0OiAiW1tUQ11dL21pcHM2NHIyLzY0L3NvZnt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stQkUtU0YtNjRSMi02NDogIi1MW1tTUl1dL21pcHM2NHIyLzY0L3NvZiIKLS8vIENIRUNLLUJFLVNGLTY0UjItNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyLzY0L3NvZiIKLS8vIENIRUNLLUJFLVNGLTY0UjItNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L3NvZi91c3IvbGliIgorLy8gQ0hFQ0stQkUtU0YtNjRSMi02NDogIi1MW1tUQ11dL21pcHM2NHIyLzY0L3NvZiIKKy8vIENIRUNLLUJFLVNGLTY0UjItNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyLzY0L3NvZiIKKy8vIENIRUNLLUJFLVNGLTY0UjItNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L3NvZi91c3IvbGliIgogLy8gQ0hFQ0stQkUtU0YtNjRSMi02NDogIltbVENdXS9taXBzNjRyMi82NC9zb2Z7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1TRi02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvc29mL3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTExMzQsMTMgKzExMzQsMTMgQEAKIC8vIENIRUNLLUJFLU5BTi02NFIyLTY0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUJFLU5BTi02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1CRS1OQU4tNjRSMi02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1CRS1OQU4tNjRSMi02NDogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFOLTY0UjItNjQ6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvbmFuMjAwOCIKIC8vIENIRUNLLUJFLU5BTi02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUJFLU5BTi02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLU5BTi02NFIyLTY0OiAiW1tUQ11dL21pcHM2NHIyLzY0L25hbjIwMDh7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUJFLU5BTi02NFIyLTY0OiAiLUxbW1NSXV0vbWlwczY0cjIvNjQvbmFuMjAwOCIKLS8vIENIRUNLLUJFLU5BTi02NFIyLTY0OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi82NC9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFOLTY0UjItNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L25hbjIwMDgvdXNyL2xpYiIKKy8vIENIRUNLLUJFLU5BTi02NFIyLTY0OiAiLUxbW1RDXV0vbWlwczY0cjIvNjQvbmFuMjAwOCIKKy8vIENIRUNLLUJFLU5BTi02NFIyLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi82NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFOLTY0UjItNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L25hbjIwMDgvdXNyL2xpYiIKIC8vIENIRUNLLUJFLU5BTi02NFIyLTY0OiAiW1tUQ11dL21pcHM2NHIyLzY0L25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1CRS1OQU4tNjRSMi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L25hbjIwMDgvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTE2MCwxMyArMTE2MCwxMyBAQAogLy8gQ0hFQ0stQkUtTkFONjQtNjRSMi02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1CRS1OQU42NC02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1CRS1OQU42NC02NFIyLTY0OiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUJFLU5BTjY0LTY0UjItNjQ6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFONjQtNjRSMi02NDogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9mcDY0L25hbjIwMDgiCiAvLyBDSEVDSy1CRS1OQU42NC02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZnA2NC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stQkUtTkFONjQtNjRSMi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L2ZwNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUJFLU5BTjY0LTY0UjItNjQ6ICJbW1RDXV0vbWlwczY0cjIvNjQvZnA2NC9uYW4yMDA4e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1CRS1OQU42NC02NFIyLTY0OiAiLUxbW1NSXV0vbWlwczY0cjIvNjQvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFONjQtNjRSMi02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0cjIvNjQvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stQkUtTkFONjQtNjRSMi02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZnA2NC9uYW4yMDA4L3Vzci9saWIiCisvLyBDSEVDSy1CRS1OQU42NC02NFIyLTY0OiAiLUxbW1RDXV0vbWlwczY0cjIvNjQvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFONjQtNjRSMi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0cjIvNjQvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stQkUtTkFONjQtNjRSMi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZnA2NC9uYW4yMDA4L3Vzci9saWIiCiAvLyBDSEVDSy1CRS1OQU42NC02NFIyLTY0OiAiW1tUQ11dL21pcHM2NHIyLzY0L2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUJFLU5BTjY0LTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9mcDY0L25hbjIwMDgvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTE4NiwxMyArMTE4NiwxMyBAQAogLy8gQ0hFQ0stRUwtSEYtMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtSEYtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLUhGLTMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLUhGLTMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbCIKKy8vIENIRUNLLUVMLUhGLTMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbCIKIC8vIENIRUNLLUVMLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUVMLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLUhGLTMyOiAiW1tUQ11dL21pcHMzMi9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtSEYtMzI6ICItTFtbU1JdXS9taXBzMzIvZWwiCi0vLyBDSEVDSy1FTC1IRi0zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMzMi9lbCIKLS8vIENIRUNLLUVMLUhGLTMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvZWwvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1IRi0zMjogIi1MW1tUQ11dL21pcHMzMi9lbCIKKy8vIENIRUNLLUVMLUhGLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL2VsIgorLy8gQ0hFQ0stRUwtSEYtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLUhGLTMyOiAiW1tUQ11dL21pcHMzMi9lbHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLUhGLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xMjEyLDEzICsxMjEyLDEzIEBACiAvLyBDSEVDSy1FTC1IRjY0LTMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLUhGNjQtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLUhGNjQtMzI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtSEY2NC0zMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvZWwvZnA2NCIKKy8vIENIRUNLLUVMLUhGNjQtMzI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL2ZwNjQiCiAvLyBDSEVDSy1FTC1IRjY0LTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL2ZwNjQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtSEY2NC0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLUhGNjQtMzI6ICJbW1RDXV0vbWlwczMyL2VsL2ZwNjR7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLUhGNjQtMzI6ICItTFtbU1JdXS9taXBzMzIvZWwvZnA2NCIKLS8vIENIRUNLLUVMLUhGNjQtMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvZWwvZnA2NCIKLS8vIENIRUNLLUVMLUhGNjQtMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9mcDY0L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtSEY2NC0zMjogIi1MW1tUQ11dL21pcHMzMi9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMzMi9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL2ZwNjQvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1FTC1IRjY0LTMyOiAiW1tUQ11dL21pcHMzMi9lbC9mcDY0e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtSEY2NC0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xMjM4LDEzICsxMjM4LDEzIEBACiAvLyBDSEVDSy1FTC1TRi0zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1TRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtU0YtMzI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtU0YtMzI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL3NvZiIKKy8vIENIRUNLLUVMLVNGLTMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9zb2YiCiAvLyBDSEVDSy1FTC1TRi0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9zb2YvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtU0YtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvZWwvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLVNGLTMyOiAiW1tUQ11dL21pcHMzMi9lbC9zb2Z7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLVNGLTMyOiAiLUxbW1NSXV0vbWlwczMyL2VsL3NvZiIKLS8vIENIRUNLLUVMLVNGLTMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL2VsL3NvZiIKLS8vIENIRUNLLUVMLVNGLTMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvZWwvc29mL3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtU0YtMzI6ICItTFtbVENdXS9taXBzMzIvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9zb2YvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1FTC1TRi0zMjogIltbVENdXS9taXBzMzIvZWwvc29me3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtU0YtMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvZWwvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xMjY0LDEzICsxMjY0LDEzIEBACiAvLyBDSEVDSy1FTC1IRi0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1IRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtSEYtMTY6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtSEYtMTY6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9lbCIKKy8vIENIRUNLLUVMLUhGLTE2OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwiCiAvLyBDSEVDSy1FTC1IRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtSEYtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLUhGLTE2OiAiW1tUQ11dL21pcHMzMi9taXBzMTYvZWx7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLUhGLTE2OiAiLUxbW1NSXV0vbWlwczMyL21pcHMxNi9lbCIKLS8vIENIRUNLLUVMLUhGLTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL21pcHMxNi9lbCIKLS8vIENIRUNLLUVMLUhGLTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtSEYtMTY6ICItTFtbVENdXS9taXBzMzIvbWlwczE2L2VsIgorLy8gQ0hFQ0stRUwtSEYtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvbWlwczE2L2VsIgorLy8gQ0hFQ0stRUwtSEYtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1FTC1IRi0xNjogIltbVENdXS9taXBzMzIvbWlwczE2L2Vse3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtSEYtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xMjkwLDEzICsxMjkwLDEzIEBACiAvLyBDSEVDSy1FTC1IRjY0LTE2OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLUhGNjQtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLUhGNjQtMTY6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtSEY2NC0xNjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL2ZwNjQiCisvLyBDSEVDSy1FTC1IRjY0LTE2OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvZnA2NCIKIC8vIENIRUNLLUVMLUhGNjQtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL2ZwNjQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtSEY2NC0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvZnA2NC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1FTC1IRjY0LTE2OiAiW1tUQ11dL21pcHMzMi9taXBzMTYvZWwvZnA2NHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtSEY2NC0xNjogIi1MW1tTUl1dL21pcHMzMi9taXBzMTYvZWwvZnA2NCIKLS8vIENIRUNLLUVMLUhGNjQtMTY6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvbWlwczE2L2VsL2ZwNjQiCi0vLyBDSEVDSy1FTC1IRjY0LTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL2ZwNjQvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1IRjY0LTE2OiAiLUxbW1RDXV0vbWlwczMyL21pcHMxNi9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMzMi9taXBzMTYvZWwvZnA2NCIKKy8vIENIRUNLLUVMLUhGNjQtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvZnA2NC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLUhGNjQtMTY6ICJbW1RDXV0vbWlwczMyL21pcHMxNi9lbC9mcDY0e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtSEY2NC0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvZnA2NC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTMxNiwxMyArMTMxNiwxMyBAQAogLy8gQ0hFQ0stRUwtU0YtMTY6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtU0YtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLVNGLTE2OiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLVNGLTE2OiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtMTY6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9lbC9zb2YiCiAvLyBDSEVDSy1FTC1TRi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUVMLVNGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9lbC9zb2YvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtU0YtMTY6ICJbW1RDXV0vbWlwczMyL21pcHMxNi9lbC9zb2Z7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLVNGLTE2OiAiLUxbW1NSXV0vbWlwczMyL21pcHMxNi9lbC9zb2YiCi0vLyBDSEVDSy1FTC1TRi0xNjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMzMi9taXBzMTYvZWwvc29mIgotLy8gQ0hFQ0stRUwtU0YtMTY6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvc29mL3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtU0YtMTY6ICItTFtbVENdXS9taXBzMzIvbWlwczE2L2VsL3NvZiIKKy8vIENIRUNLLUVMLVNGLTE2OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL21pcHMxNi9lbC9zb2YiCisvLyBDSEVDSy1FTC1TRi0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9lbC9zb2YvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1FTC1TRi0xNjogIltbVENdXS9taXBzMzIvbWlwczE2L2VsL3NvZnt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLVNGLTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9lbC9zb2YvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTEzNDIsMTMgKzEzNDIsMTMgQEAKIC8vIENIRUNLLUVMLU5BTi0xNjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1OQU4tMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLU5BTi0xNjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1OQU4tMTY6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL21pcHMxNi9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLTE2OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvbmFuMjAwOCIKIC8vIENIRUNLLUVMLU5BTi0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1OQU4tMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtTkFOLTE2OiAiW1tUQ11dL21pcHMzMi9taXBzMTYvZWwvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtTkFOLTE2OiAiLUxbW1NSXV0vbWlwczMyL21pcHMxNi9lbC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFOLTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL21pcHMxNi9lbC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFOLTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1OQU4tMTY6ICItTFtbVENdXS9taXBzMzIvbWlwczE2L2VsL25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU4tMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvbWlwczE2L2VsL25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU4tMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLU5BTi0xNjogIltbVENdXS9taXBzMzIvbWlwczE2L2VsL25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1OQU4tMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTEzNjgsMTMgKzEzNjgsMTMgQEAKIC8vIENIRUNLLUVMLU5BTjY0LTE2OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLU5BTjY0LTE2OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1OQU42NC0xNjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1OQU42NC0xNjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUVMLU5BTjY0LTE2OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvZnA2NC9uYW4yMDA4IgogLy8gQ0hFQ0stRUwtTkFONjQtMTY6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1OQU42NC0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLU5BTjY0LTE2OiAiW1tUQ11dL21pcHMzMi9taXBzMTYvZWwvZnA2NC9uYW4yMDA4e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1OQU42NC0xNjogIi1MW1tTUl1dL21pcHMzMi9taXBzMTYvZWwvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFONjQtMTY6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvbWlwczE2L2VsL2ZwNjQvbmFuMjAwOCIKLS8vIENIRUNLLUVMLU5BTjY0LTE2OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvbWlwczE2L2VsL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKKy8vIENIRUNLLUVMLU5BTjY0LTE2OiAiLUxbW1RDXV0vbWlwczMyL21pcHMxNi9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC0xNjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMzMi9taXBzMTYvZWwvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFONjQtMTY6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWIvLi4vbGliIgogLy8gQ0hFQ0stRUwtTkFONjQtMTY6ICJbW1RDXV0vbWlwczMyL21pcHMxNi9lbC9mcDY0L25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1OQU42NC0xNjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9taXBzMTYvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xMzk0LDEzICsxMzk0LDEzIEBACiAvLyBDSEVDSy1FTC1OQU4tMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtTkFOLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1OQU4tMzI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtTkFOLTMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLTMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9uYW4yMDA4IgogLy8gQ0hFQ0stRUwtTkFOLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtTkFOLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtTkFOLTMyOiAiW1tUQ11dL21pcHMzMi9lbC9uYW4yMDA4e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1OQU4tMzI6ICItTFtbU1JdXS9taXBzMzIvZWwvbmFuMjAwOCIKLS8vIENIRUNLLUVMLU5BTi0zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMzMi9lbC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFOLTMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvZWwvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKKy8vIENIRUNLLUVMLU5BTi0zMjogIi1MW1tUQ11dL21pcHMzMi9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLTMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczMyL2VsL25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU4tMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9uYW4yMDA4L3Vzci9saWIvLi4vbGliIgogLy8gQ0hFQ0stRUwtTkFOLTMyOiAiW1tUQ11dL21pcHMzMi9lbC9uYW4yMDA4e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtTkFOLTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTE0MjAsMTMgKzE0MjAsMTMgQEAKIC8vIENIRUNLLUVMLU5BTjY0LTMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLU5BTjY0LTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1OQU42NC0zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1OQU42NC0zMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMzIvZWwvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFONjQtMzI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL2ZwNjQvbmFuMjAwOCIKIC8vIENIRUNLLUVMLU5BTjY0LTMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1OQU42NC0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtTkFONjQtMzI6ICJbW1RDXV0vbWlwczMyL2VsL2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtTkFONjQtMzI6ICItTFtbU1JdXS9taXBzMzIvZWwvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFONjQtMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMzIvZWwvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFONjQtMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1OQU42NC0zMjogIi1MW1tUQ11dL21pcHMzMi9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pcHMzMi9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC0zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczMyL2VsL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLU5BTjY0LTMyOiAiW1tUQ11dL21pcHMzMi9lbC9mcDY0L25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1OQU42NC0zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMzMi9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTE0NDYsMTMgKzE0NDYsMTMgQEAKIC8vIENIRUNLLUVMLUhGLTMyUjI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtSEYtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtSEYtMzJSMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1IRi0zMlIyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsIgorLy8gQ0hFQ0stRUwtSEYtMzJSMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbCIKIC8vIENIRUNLLUVMLUhGLTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1IRi0zMlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtSEYtMzJSMjogIltbVENdXS9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtSEYtMzJSMjogIi1MW1tTUl1dL2VsIgotLy8gQ0hFQ0stRUwtSEYtMzJSMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL2VsIgotLy8gQ0hFQ0stRUwtSEYtMzJSMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvZWwvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1IRi0zMlIyOiAiLUxbW1RDXV0vZWwiCisvLyBDSEVDSy1FTC1IRi0zMlIyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvZWwiCisvLyBDSEVDSy1FTC1IRi0zMlIyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLUhGLTMyUjI6ICJbW1RDXV0vZWx7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1IRi0zMlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTE0NzIsMTMgKzE0NzIsMTMgQEAKIC8vIENIRUNLLUVMLUhGNjQtMzJSMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1IRjY0LTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLUhGNjQtMzJSMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1IRjY0LTMyUjI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvZWwvZnA2NCIKKy8vIENIRUNLLUVMLUhGNjQtMzJSMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9mcDY0IgogLy8gQ0hFQ0stRUwtSEY2NC0zMlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvZWwvZnA2NC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1IRjY0LTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLUhGNjQtMzJSMjogIltbVENdXS9lbC9mcDY0e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1IRjY0LTMyUjI6ICItTFtbU1JdXS9lbC9mcDY0IgotLy8gQ0hFQ0stRUwtSEY2NC0zMlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvZWwvZnA2NCIKLS8vIENIRUNLLUVMLUhGNjQtMzJSMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvZWwvZnA2NC91c3IvbGliLy4uL2xpYiIKKy8vIENIRUNLLUVMLUhGNjQtMzJSMjogIi1MW1tUQ11dL2VsL2ZwNjQiCisvLyBDSEVDSy1FTC1IRjY0LTMyUjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC0zMlIyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9mcDY0L3Vzci9saWIvLi4vbGliIgogLy8gQ0hFQ0stRUwtSEY2NC0zMlIyOiAiW1tUQ11dL2VsL2ZwNjR7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1IRjY0LTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xNDk4LDEzICsxNDk4LDEzIEBACiAvLyBDSEVDSy1FTC1TRi0zMlIyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLVNGLTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLVNGLTMyUjI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtU0YtMzJSMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9zb2YiCisvLyBDSEVDSy1FTC1TRi0zMlIyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsL3NvZiIKIC8vIENIRUNLLUVMLVNGLTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9zb2YvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtU0YtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsL3NvZi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1FTC1TRi0zMlIyOiAiW1tUQ11dL2VsL3NvZnt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtU0YtMzJSMjogIi1MW1tTUl1dL2VsL3NvZiIKLS8vIENIRUNLLUVMLVNGLTMyUjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9lbC9zb2YiCi0vLyBDSEVDSy1FTC1TRi0zMlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9zb2YvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1TRi0zMlIyOiAiLUxbW1RDXV0vZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtMzJSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL2VsL3NvZiIKKy8vIENIRUNLLUVMLVNGLTMyUjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsL3NvZi91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLVNGLTMyUjI6ICJbW1RDXV0vZWwvc29me3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtU0YtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsL3NvZi91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTUyNCwxMyArMTUyNCwxMyBAQAogLy8gQ0hFQ0stRUwtSEYtMTZSMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1IRi0xNlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1IRi0xNlIyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLUhGLTE2UjI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsIgorLy8gQ0hFQ0stRUwtSEYtMTZSMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwiCiAvLyBDSEVDSy1FTC1IRi0xNlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUVMLUhGLTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtSEYtMTZSMjogIltbVENdXS9taXBzMTYvZWx7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLUhGLTE2UjI6ICItTFtbU1JdXS9taXBzMTYvZWwiCi0vLyBDSEVDSy1FTC1IRi0xNlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2L2VsIgotLy8gQ0hFQ0stRUwtSEYtMTZSMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtSEYtMTZSMjogIi1MW1tUQ11dL21pcHMxNi9lbCIKKy8vIENIRUNLLUVMLUhGLTE2UjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMTYvZWwiCisvLyBDSEVDSy1FTC1IRi0xNlIyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1FTC1IRi0xNlIyOiAiW1tUQ11dL21pcHMxNi9lbHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLUhGLTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTE1NTAsMTMgKzE1NTAsMTMgQEAKIC8vIENIRUNLLUVMLUhGNjQtMTZSMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1IRjY0LTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLUhGNjQtMTZSMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1IRjY0LTE2UjI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL2ZwNjQiCisvLyBDSEVDSy1FTC1IRjY0LTE2UjI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL2ZwNjQiCiAvLyBDSEVDSy1FTC1IRjY0LTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvZnA2NC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1IRjY0LTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvZnA2NC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1FTC1IRjY0LTE2UjI6ICJbW1RDXV0vbWlwczE2L2VsL2ZwNjR7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLUhGNjQtMTZSMjogIi1MW1tTUl1dL21pcHMxNi9lbC9mcDY0IgotLy8gQ0hFQ0stRUwtSEY2NC0xNlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2L2VsL2ZwNjQiCi0vLyBDSEVDSy1FTC1IRjY0LTE2UjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9lbC9mcDY0L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtSEY2NC0xNlIyOiAiLUxbW1RDXV0vbWlwczE2L2VsL2ZwNjQiCisvLyBDSEVDSy1FTC1IRjY0LTE2UjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMTYvZWwvZnA2NCIKKy8vIENIRUNLLUVMLUhGNjQtMTZSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL2ZwNjQvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1FTC1IRjY0LTE2UjI6ICJbW1RDXV0vbWlwczE2L2VsL2ZwNjR7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1IRjY0LTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvZnA2NC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTU3NiwxMyArMTU3NiwxMyBAQAogLy8gQ0hFQ0stRUwtU0YtMTZSMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1TRi0xNlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1TRi0xNlIyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLVNGLTE2UjI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL3NvZiIKKy8vIENIRUNLLUVMLVNGLTE2UjI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL3NvZiIKIC8vIENIRUNLLUVMLVNGLTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUVMLVNGLTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLVNGLTE2UjI6ICJbW1RDXV0vbWlwczE2L2VsL3NvZnt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtU0YtMTZSMjogIi1MW1tTUl1dL21pcHMxNi9lbC9zb2YiCi0vLyBDSEVDSy1FTC1TRi0xNlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2L2VsL3NvZiIKLS8vIENIRUNLLUVMLVNGLTE2UjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9lbC9zb2YvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1TRi0xNlIyOiAiLUxbW1RDXV0vbWlwczE2L2VsL3NvZiIKKy8vIENIRUNLLUVMLVNGLTE2UjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMTYvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtMTZSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL3NvZi91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLVNGLTE2UjI6ICJbW1RDXV0vbWlwczE2L2VsL3NvZnt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLVNGLTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xNjAyLDEzICsxNjAyLDEzIEBACiAvLyBDSEVDSy1FTC1OQU4tMTZSMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1OQU4tMTZSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtTkFOLTE2UjI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtTkFOLTE2UjI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU4tMTZSMjogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvbmFuMjAwOCIKIC8vIENIRUNLLUVMLU5BTi0xNlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtTkFOLTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1FTC1OQU4tMTZSMjogIltbVENdXS9taXBzMTYvZWwvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtTkFOLTE2UjI6ICItTFtbU1JdXS9taXBzMTYvZWwvbmFuMjAwOCIKLS8vIENIRUNLLUVMLU5BTi0xNlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2L2VsL25hbjIwMDgiCi0vLyBDSEVDSy1FTC1OQU4tMTZSMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1OQU4tMTZSMjogIi1MW1tUQ11dL21pcHMxNi9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLTE2UjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMTYvZWwvbmFuMjAwOCIKKy8vIENIRUNLLUVMLU5BTi0xNlIyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLU5BTi0xNlIyOiAiW1tUQ11dL21pcHMxNi9lbC9uYW4yMDA4e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtTkFOLTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTYyOCwxMyArMTYyOCwxMyBAQAogLy8gQ0hFQ0stRUwtTkFONjQtMTZSMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1OQU42NC0xNlIyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1OQU42NC0xNlIyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLU5BTjY0LTE2UjI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUVMLU5BTjY0LTE2UjI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL2ZwNjQvbmFuMjAwOCIKIC8vIENIRUNLLUVMLU5BTjY0LTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUVMLU5BTjY0LTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLU5BTjY0LTE2UjI6ICJbW1RDXV0vbWlwczE2L2VsL2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtTkFONjQtMTZSMjogIi1MW1tTUl1dL21pcHMxNi9lbC9mcDY0L25hbjIwMDgiCi0vLyBDSEVDSy1FTC1OQU42NC0xNlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWlwczE2L2VsL2ZwNjQvbmFuMjAwOCIKLS8vIENIRUNLLUVMLU5BTjY0LTE2UjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHMxNi9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1OQU42NC0xNlIyOiAiLUxbW1RDXV0vbWlwczE2L2VsL2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUVMLU5BTjY0LTE2UjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taXBzMTYvZWwvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFONjQtMTZSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczE2L2VsL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLU5BTjY0LTE2UjI6ICJbW1RDXV0vbWlwczE2L2VsL2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLU5BTjY0LTE2UjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzMTYvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xNjU0LDEzICsxNjU0LDEzIEBACiAvLyBDSEVDSy1FTC1OQU4tMzJSMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1OQU4tMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtTkFOLTMyUjI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtTkFOLTMyUjI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvZWwvbmFuMjAwOCIKKy8vIENIRUNLLUVMLU5BTi0zMlIyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsL25hbjIwMDgiCiAvLyBDSEVDSy1FTC1OQU4tMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtTkFOLTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLU5BTi0zMlIyOiAiW1tUQ11dL2VsL25hbjIwMDh7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLU5BTi0zMlIyOiAiLUxbW1NSXV0vZWwvbmFuMjAwOCIKLS8vIENIRUNLLUVMLU5BTi0zMlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvZWwvbmFuMjAwOCIKLS8vIENIRUNLLUVMLU5BTi0zMlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9uYW4yMDA4L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtTkFOLTMyUjI6ICItTFtbVENdXS9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLTMyUjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLTMyUjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1FTC1OQU4tMzJSMjogIltbVENdXS9lbC9uYW4yMDA4e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtTkFOLTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9uYW4yMDA4L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xNjgwLDEzICsxNjgwLDEzIEBACiAvLyBDSEVDSy1FTC1OQU42NC0zMlIyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLU5BTjY0LTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLU5BTjY0LTMyUjI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtTkFONjQtMzJSMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC0zMlIyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsL2ZwNjQvbmFuMjAwOCIKIC8vIENIRUNLLUVMLU5BTjY0LTMyUjI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtTkFONjQtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1FTC1OQU42NC0zMlIyOiAiW1tUQ11dL2VsL2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtTkFONjQtMzJSMjogIi1MW1tTUl1dL2VsL2ZwNjQvbmFuMjAwOCIKLS8vIENIRUNLLUVMLU5BTjY0LTMyUjI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9lbC9mcDY0L25hbjIwMDgiCi0vLyBDSEVDSy1FTC1OQU42NC0zMlIyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1OQU42NC0zMlIyOiAiLUxbW1RDXV0vZWwvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFONjQtMzJSMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL2VsL2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUVMLU5BTjY0LTMyUjI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLU5BTjY0LTMyUjI6ICJbW1RDXV0vZWwvZnA2NC9uYW4yMDA4e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtTkFONjQtMzJSMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L2VsL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTcwNiwxMyArMTcwNiwxMyBAQAogLy8gQ0hFQ0stRUwtSEYtTU06ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtSEYtTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLUhGLU1NOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLUhGLU1NOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbCIKKy8vIENIRUNLLUVMLUhGLU1NOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbCIKIC8vIENIRUNLLUVMLUhGLU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUVMLUhGLU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLUhGLU1NOiAiW1tUQ11dL21pY3JvbWlwcy9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtSEYtTU06ICItTFtbU1JdXS9taWNyb21pcHMvZWwiCi0vLyBDSEVDSy1FTC1IRi1NTTogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pY3JvbWlwcy9lbCIKLS8vIENIRUNLLUVMLUhGLU1NOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvZWwvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1IRi1NTTogIi1MW1tUQ11dL21pY3JvbWlwcy9lbCIKKy8vIENIRUNLLUVMLUhGLU1NOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWljcm9taXBzL2VsIgorLy8gQ0hFQ0stRUwtSEYtTU06ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLUhGLU1NOiAiW1tUQ11dL21pY3JvbWlwcy9lbHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLUhGLU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xNzMyLDEzICsxNzMyLDEzIEBACiAvLyBDSEVDSy1FTC1IRjY0LU1NOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLUhGNjQtTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLUhGNjQtTU06ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtSEY2NC1NTTogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvZWwvZnA2NCIKKy8vIENIRUNLLUVMLUhGNjQtTU06ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL2ZwNjQiCiAvLyBDSEVDSy1FTC1IRjY0LU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL2ZwNjQvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtSEY2NC1NTTogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLUhGNjQtTU06ICJbW1RDXV0vbWljcm9taXBzL2VsL2ZwNjR7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLUhGNjQtTU06ICItTFtbU1JdXS9taWNyb21pcHMvZWwvZnA2NCIKLS8vIENIRUNLLUVMLUhGNjQtTU06ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taWNyb21pcHMvZWwvZnA2NCIKLS8vIENIRUNLLUVMLUhGNjQtTU06ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9mcDY0L3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtSEY2NC1NTTogIi1MW1tUQ11dL21pY3JvbWlwcy9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC1NTTogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pY3JvbWlwcy9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC1NTTogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL2ZwNjQvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1FTC1IRjY0LU1NOiAiW1tUQ11dL21pY3JvbWlwcy9lbC9mcDY0e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtSEY2NC1NTTogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9mcDY0L3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xNzU4LDEzICsxNzU4LDEzIEBACiAvLyBDSEVDSy1FTC1TRi1NTTogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1TRi1NTTogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtU0YtTU06ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtU0YtTU06ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL3NvZiIKKy8vIENIRUNLLUVMLVNGLU1NOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9zb2YiCiAvLyBDSEVDSy1FTC1TRi1NTTogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9zb2YvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtU0YtTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvZWwvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLVNGLU1NOiAiW1tUQ11dL21pY3JvbWlwcy9lbC9zb2Z7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLVNGLU1NOiAiLUxbW1NSXV0vbWljcm9taXBzL2VsL3NvZiIKLS8vIENIRUNLLUVMLVNGLU1NOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWljcm9taXBzL2VsL3NvZiIKLS8vIENIRUNLLUVMLVNGLU1NOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvZWwvc29mL3Vzci9saWIvLi4vbGliIgorLy8gQ0hFQ0stRUwtU0YtTU06ICItTFtbVENdXS9taWNyb21pcHMvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtTU06ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taWNyb21pcHMvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtTU06ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9zb2YvdXNyL2xpYi8uLi9saWIiCiAvLyBDSEVDSy1FTC1TRi1NTTogIltbVENdXS9taWNyb21pcHMvZWwvc29me3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtU0YtTU06ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvZWwvc29mL3Vzci9saWIvLi4vbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xNzg0LDEzICsxNzg0LDEzIEBACiAvLyBDSEVDSy1FTC1OQU4tTU06ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtTkFOLU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1OQU4tTU06ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtTkFOLU1NOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLU1NOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9uYW4yMDA4IgogLy8gQ0hFQ0stRUwtTkFOLU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtTkFOLU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtTkFOLU1NOiAiW1tUQ11dL21pY3JvbWlwcy9lbC9uYW4yMDA4e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1OQU4tTU06ICItTFtbU1JdXS9taWNyb21pcHMvZWwvbmFuMjAwOCIKLS8vIENIRUNLLUVMLU5BTi1NTTogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pY3JvbWlwcy9lbC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFOLU1NOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvZWwvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKKy8vIENIRUNLLUVMLU5BTi1NTTogIi1MW1tUQ11dL21pY3JvbWlwcy9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLU1NOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi8uLi9saWIvbWljcm9taXBzL2VsL25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU4tTU06ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9uYW4yMDA4L3Vzci9saWIvLi4vbGliIgogLy8gQ0hFQ0stRUwtTkFOLU1NOiAiW1tUQ11dL21pY3JvbWlwcy9lbC9uYW4yMDA4e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtTkFOLU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTE4MTAsMTMgKzE4MTAsMTMgQEAKIC8vIENIRUNLLUVMLU5BTjY0LU1NOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLU5BTjY0LU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1OQU42NC1NTTogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1OQU42NC1NTTogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taWNyb21pcHMvZWwvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFONjQtTU06ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL2ZwNjQvbmFuMjAwOCIKIC8vIENIRUNLLUVMLU5BTjY0LU1NOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1OQU42NC1NTTogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtTkFONjQtTU06ICJbW1RDXV0vbWljcm9taXBzL2VsL2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtTkFONjQtTU06ICItTFtbU1JdXS9taWNyb21pcHMvZWwvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFONjQtTU06ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliLy4uL2xpYi9taWNyb21pcHMvZWwvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFONjQtTU06ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWIiCisvLyBDSEVDSy1FTC1OQU42NC1NTTogIi1MW1tUQ11dL21pY3JvbWlwcy9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC1NTTogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvLi4vbGliL21pY3JvbWlwcy9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC1NTTogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWljcm9taXBzL2VsL2ZwNjQvbmFuMjAwOC91c3IvbGliLy4uL2xpYiIKIC8vIENIRUNLLUVMLU5BTjY0LU1NOiAiW1tUQ11dL21pY3JvbWlwcy9lbC9mcDY0L25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1OQU42NC1NTTogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pY3JvbWlwcy9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYi8uLi9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTE4MzYsMTMgKzE4MzYsMTMgQEAKIC8vIENIRUNLLUVMLUhGLTY0LU4zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1IRi02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLUhGLTY0LU4zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1IRi02NC1OMzI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2VsIgorLy8gQ0hFQ0stRUwtSEYtNjQtTjMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbCIKIC8vIENIRUNLLUVMLUhGLTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUVMLUhGLTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLUhGLTY0LU4zMjogIltbVENdXS9taXBzNjQvZWx7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLUhGLTY0LU4zMjogIi1MW1tTUl1dL21pcHM2NC9lbCIKLS8vIENIRUNLLUVMLUhGLTY0LU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0L2VsIgotLy8gQ0hFQ0stRUwtSEYtNjQtTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvdXNyL2xpYiIKKy8vIENIRUNLLUVMLUhGLTY0LU4zMjogIi1MW1tUQ11dL21pcHM2NC9lbCIKKy8vIENIRUNLLUVMLUhGLTY0LU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0L2VsIgorLy8gQ0hFQ0stRUwtSEYtNjQtTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvdXNyL2xpYiIKIC8vIENIRUNLLUVMLUhGLTY0LU4zMjogIltbVENdXS9taXBzNjQvZWx7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1IRi02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTg2MiwxMyArMTg2MiwxMyBAQAogLy8gQ0hFQ0stRUwtSEY2NC02NC1OMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtSEY2NC02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLUhGNjQtNjQtTjMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLUhGNjQtNjQtTjMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC02NC1OMzI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2VsL2ZwNjQiCiAvLyBDSEVDSy1FTC1IRjY0LTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9mcDY0L3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtSEY2NC02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvZnA2NC91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLUhGNjQtNjQtTjMyOiAiW1tUQ11dL21pcHM2NC9lbC9mcDY0e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1IRjY0LTY0LU4zMjogIi1MW1tTUl1dL21pcHM2NC9lbC9mcDY0IgotLy8gQ0hFQ0stRUwtSEY2NC02NC1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NC9lbC9mcDY0IgotLy8gQ0hFQ0stRUwtSEY2NC02NC1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9mcDY0L3Vzci9saWIiCisvLyBDSEVDSy1FTC1IRjY0LTY0LU4zMjogIi1MW1tUQ11dL21pcHM2NC9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC02NC1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NC9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC02NC1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9mcDY0L3Vzci9saWIiCiAvLyBDSEVDSy1FTC1IRjY0LTY0LU4zMjogIltbVENdXS9taXBzNjQvZWwvZnA2NHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLUhGNjQtNjQtTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2VsL2ZwNjQvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTg4OCwxMyArMTg4OCwxMyBAQAogLy8gQ0hFQ0stRUwtU0YtNjQtTjMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLVNGLTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtU0YtNjQtTjMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLVNGLTY0LU4zMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtNjQtTjMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9zb2YiCiAvLyBDSEVDSy1FTC1TRi02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvc29mL3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtU0YtNjQtTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2VsL3NvZi91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLVNGLTY0LU4zMjogIltbVENdXS9taXBzNjQvZWwvc29me3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1TRi02NC1OMzI6ICItTFtbU1JdXS9taXBzNjQvZWwvc29mIgotLy8gQ0hFQ0stRUwtU0YtNjQtTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjQvZWwvc29mIgotLy8gQ0hFQ0stRUwtU0YtNjQtTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvc29mL3Vzci9saWIiCisvLyBDSEVDSy1FTC1TRi02NC1OMzI6ICItTFtbVENdXS9taXBzNjQvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtNjQtTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjQvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtNjQtTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvc29mL3Vzci9saWIiCiAvLyBDSEVDSy1FTC1TRi02NC1OMzI6ICJbW1RDXV0vbWlwczY0L2VsL3NvZnt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLVNGLTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9zb2YvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTkxNCwxMyArMTkxNCwxMyBAQAogLy8gQ0hFQ0stRUwtTkFOLTY0LU4zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1OQU4tNjQtTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1OQU4tNjQtTjMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLU5BTi02NC1OMzI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2VsL25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU4tNjQtTjMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9uYW4yMDA4IgogLy8gQ0hFQ0stRUwtTkFOLTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtTkFOLTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtTkFOLTY0LU4zMjogIltbVENdXS9taXBzNjQvZWwvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtTkFOLTY0LU4zMjogIi1MW1tTUl1dL21pcHM2NC9lbC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFOLTY0LU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0L2VsL25hbjIwMDgiCi0vLyBDSEVDSy1FTC1OQU4tNjQtTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvbmFuMjAwOC91c3IvbGliIgorLy8gQ0hFQ0stRUwtTkFOLTY0LU4zMjogIi1MW1tUQ11dL21pcHM2NC9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLTY0LU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0L2VsL25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU4tNjQtTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvbmFuMjAwOC91c3IvbGliIgogLy8gQ0hFQ0stRUwtTkFOLTY0LU4zMjogIltbVENdXS9taXBzNjQvZWwvbmFuMjAwOHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLU5BTi02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xOTQwLDEzICsxOTQwLDEzIEBACiAvLyBDSEVDSy1FTC1OQU42NC02NC1OMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtTkFONjQtNjQtTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1OQU42NC02NC1OMzI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtTkFONjQtNjQtTjMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC02NC1OMzI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2VsL2ZwNjQvbmFuMjAwOCIKIC8vIENIRUNLLUVMLU5BTjY0LTY0LU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1OQU42NC02NC1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtTkFONjQtNjQtTjMyOiAiW1tUQ11dL21pcHM2NC9lbC9mcDY0L25hbjIwMDh7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLU5BTjY0LTY0LU4zMjogIi1MW1tTUl1dL21pcHM2NC9lbC9mcDY0L25hbjIwMDgiCi0vLyBDSEVDSy1FTC1OQU42NC02NC1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NC9lbC9mcDY0L25hbjIwMDgiCi0vLyBDSEVDSy1FTC1OQU42NC02NC1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYiIKKy8vIENIRUNLLUVMLU5BTjY0LTY0LU4zMjogIi1MW1tUQ11dL21pcHM2NC9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC02NC1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NC9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC02NC1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYiIKIC8vIENIRUNLLUVMLU5BTjY0LTY0LU4zMjogIltbVENdXS9taXBzNjQvZWwvZnA2NC9uYW4yMDA4e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtTkFONjQtNjQtTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0L2VsL2ZwNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0xOTY2LDEzICsxOTY2LDEzIEBACiAvLyBDSEVDSy1FTC1IRi02NC02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1IRi02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtSEYtNjQtNjQ6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtSEYtNjQtNjQ6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2VsIgorLy8gQ0hFQ0stRUwtSEYtNjQtNjQ6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2VsIgogLy8gQ0hFQ0stRUwtSEYtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvdXNyL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1IRi02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLUhGLTY0LTY0OiAiW1tUQ11dL21pcHM2NC82NC9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtSEYtNjQtNjQ6ICItTFtbU1JdXS9taXBzNjQvNjQvZWwiCi0vLyBDSEVDSy1FTC1IRi02NC02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L2VsIgotLy8gQ0hFQ0stRUwtSEYtNjQtNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC91c3IvbGliIgorLy8gQ0hFQ0stRUwtSEYtNjQtNjQ6ICItTFtbVENdXS9taXBzNjQvNjQvZWwiCisvLyBDSEVDSy1FTC1IRi02NC02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L2VsIgorLy8gQ0hFQ0stRUwtSEYtNjQtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC91c3IvbGliIgogLy8gQ0hFQ0stRUwtSEYtNjQtNjQ6ICJbW1RDXV0vbWlwczY0LzY0L2Vse3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtSEYtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMTk5MiwxMyArMTk5MiwxMyBAQAogLy8gQ0hFQ0stRUwtSEY2NC02NC02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1IRjY0LTY0LTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1IRjY0LTY0LTY0OiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLUhGNjQtNjQtNjQ6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2VsL2ZwNjQiCisvLyBDSEVDSy1FTC1IRjY0LTY0LTY0OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9mcDY0IgogLy8gQ0hFQ0stRUwtSEY2NC02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9mcDY0L3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtSEY2NC02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9mcDY0L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtSEY2NC02NC02NDogIltbVENdXS9taXBzNjQvNjQvZWwvZnA2NHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtSEY2NC02NC02NDogIi1MW1tTUl1dL21pcHM2NC82NC9lbC9mcDY0IgotLy8gQ0hFQ0stRUwtSEY2NC02NC02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L2VsL2ZwNjQiCi0vLyBDSEVDSy1FTC1IRjY0LTY0LTY0OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvZnA2NC91c3IvbGliIgorLy8gQ0hFQ0stRUwtSEY2NC02NC02NDogIi1MW1tUQ11dL21pcHM2NC82NC9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC02NC02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L2VsL2ZwNjQiCisvLyBDSEVDSy1FTC1IRjY0LTY0LTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvZnA2NC91c3IvbGliIgogLy8gQ0hFQ0stRUwtSEY2NC02NC02NDogIltbVENdXS9taXBzNjQvNjQvZWwvZnA2NHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLUhGNjQtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvZnA2NC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0yMDE4LDEzICsyMDE4LDEzIEBACiAvLyBDSEVDSy1FTC1TRi02NC02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1TRi02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtU0YtNjQtNjQ6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtU0YtNjQtNjQ6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2VsL3NvZiIKKy8vIENIRUNLLUVMLVNGLTY0LTY0OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9zb2YiCiAvLyBDSEVDSy1FTC1TRi02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9zb2YvdXNyL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1TRi02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9zb2YvdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1FTC1TRi02NC02NDogIltbVENdXS9taXBzNjQvNjQvZWwvc29me3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1TRi02NC02NDogIi1MW1tTUl1dL21pcHM2NC82NC9lbC9zb2YiCi0vLyBDSEVDSy1FTC1TRi02NC02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L2VsL3NvZiIKLS8vIENIRUNLLUVMLVNGLTY0LTY0OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvc29mL3Vzci9saWIiCisvLyBDSEVDSy1FTC1TRi02NC02NDogIi1MW1tUQ11dL21pcHM2NC82NC9lbC9zb2YiCisvLyBDSEVDSy1FTC1TRi02NC02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L2VsL3NvZiIKKy8vIENIRUNLLUVMLVNGLTY0LTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvc29mL3Vzci9saWIiCiAvLyBDSEVDSy1FTC1TRi02NC02NDogIltbVENdXS9taXBzNjQvNjQvZWwvc29me3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtU0YtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvc29mL3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTIwNDQsMTMgKzIwNDQsMTMgQEAKIC8vIENIRUNLLUVMLU5BTi02NC02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1OQU4tNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLU5BTi02NC02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1OQU4tNjQtNjQ6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2VsL25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU4tNjQtNjQ6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2VsL25hbjIwMDgiCiAvLyBDSEVDSy1FTC1OQU4tNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUVMLU5BTi02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtTkFOLTY0LTY0OiAiW1tUQ11dL21pcHM2NC82NC9lbC9uYW4yMDA4e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1OQU4tNjQtNjQ6ICItTFtbU1JdXS9taXBzNjQvNjQvZWwvbmFuMjAwOCIKLS8vIENIRUNLLUVMLU5BTi02NC02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L2VsL25hbjIwMDgiCi0vLyBDSEVDSy1FTC1OQU4tNjQtNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9uYW4yMDA4L3Vzci9saWIiCisvLyBDSEVDSy1FTC1OQU4tNjQtNjQ6ICItTFtbVENdXS9taXBzNjQvNjQvZWwvbmFuMjAwOCIKKy8vIENIRUNLLUVMLU5BTi02NC02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L2VsL25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU4tNjQtNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9uYW4yMDA4L3Vzci9saWIiCiAvLyBDSEVDSy1FTC1OQU4tNjQtNjQ6ICJbW1RDXV0vbWlwczY0LzY0L2VsL25hbjIwMDh7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1OQU4tNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0yMDcwLDEzICsyMDcwLDEzIEBACiAvLyBDSEVDSy1FTC1OQU42NC02NC02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1OQU42NC02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtTkFONjQtNjQtNjQ6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtTkFONjQtNjQtNjQ6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0LzY0L2VsL2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUVMLU5BTjY0LTY0LTY0OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9mcDY0L25hbjIwMDgiCiAvLyBDSEVDSy1FTC1OQU42NC02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1OQU42NC02NC02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NC82NC9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1FTC1OQU42NC02NC02NDogIltbVENdXS9taXBzNjQvNjQvZWwvZnA2NC9uYW4yMDA4e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1OQU42NC02NC02NDogIi1MW1tTUl1dL21pcHM2NC82NC9lbC9mcDY0L25hbjIwMDgiCi0vLyBDSEVDSy1FTC1OQU42NC02NC02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L2VsL2ZwNjQvbmFuMjAwOCIKLS8vIENIRUNLLUVMLU5BTjY0LTY0LTY0OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWIiCisvLyBDSEVDSy1FTC1OQU42NC02NC02NDogIi1MW1tUQ11dL21pcHM2NC82NC9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC02NC02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0LzY0L2VsL2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUVMLU5BTjY0LTY0LTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWIiCiAvLyBDSEVDSy1FTC1OQU42NC02NC02NDogIltbVENdXS9taXBzNjQvNjQvZWwvZnA2NC9uYW4yMDA4e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtTkFONjQtNjQtNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjQvNjQvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTIwOTYsMTMgKzIwOTYsMTMgQEAKIC8vIENIRUNLLUVMLUhGLTY0UjItTjMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLUhGLTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1IRi02NFIyLU4zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1IRi02NFIyLU4zMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbCIKKy8vIENIRUNLLUVMLUhGLTY0UjItTjMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2VsIgogLy8gQ0hFQ0stRUwtSEYtNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUVMLUhGLTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZWwvdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1FTC1IRi02NFIyLU4zMjogIltbVENdXS9taXBzNjRyMi9lbHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtSEYtNjRSMi1OMzI6ICItTFtbU1JdXS9taXBzNjRyMi9lbCIKLS8vIENIRUNLLUVMLUhGLTY0UjItTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi9lbCIKLS8vIENIRUNLLUVMLUhGLTY0UjItTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC91c3IvbGliIgorLy8gQ0hFQ0stRUwtSEYtNjRSMi1OMzI6ICItTFtbVENdXS9taXBzNjRyMi9lbCIKKy8vIENIRUNLLUVMLUhGLTY0UjItTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi9lbCIKKy8vIENIRUNLLUVMLUhGLTY0UjItTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC91c3IvbGliIgogLy8gQ0hFQ0stRUwtSEYtNjRSMi1OMzI6ICJbW1RDXV0vbWlwczY0cjIvZWx7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1IRi02NFIyLU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2VsL3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTIxMjIsMTMgKzIxMjIsMTMgQEAKIC8vIENIRUNLLUVMLUhGNjQtNjRSMi1OMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtSEY2NC02NFIyLU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtSEY2NC02NFIyLU4zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1IRjY0LTY0UjItTjMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2VsL2ZwNjQiCisvLyBDSEVDSy1FTC1IRjY0LTY0UjItTjMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2VsL2ZwNjQiCiAvLyBDSEVDSy1FTC1IRjY0LTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZWwvZnA2NC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUVMLUhGNjQtNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9mcDY0L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtSEY2NC02NFIyLU4zMjogIltbVENdXS9taXBzNjRyMi9lbC9mcDY0e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1IRjY0LTY0UjItTjMyOiAiLUxbW1NSXV0vbWlwczY0cjIvZWwvZnA2NCIKLS8vIENIRUNLLUVMLUhGNjQtNjRSMi1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyL2VsL2ZwNjQiCi0vLyBDSEVDSy1FTC1IRjY0LTY0UjItTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9mcDY0L3Vzci9saWIiCisvLyBDSEVDSy1FTC1IRjY0LTY0UjItTjMyOiAiLUxbW1RDXV0vbWlwczY0cjIvZWwvZnA2NCIKKy8vIENIRUNLLUVMLUhGNjQtNjRSMi1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyL2VsL2ZwNjQiCisvLyBDSEVDSy1FTC1IRjY0LTY0UjItTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9mcDY0L3Vzci9saWIiCiAvLyBDSEVDSy1FTC1IRjY0LTY0UjItTjMyOiAiW1tUQ11dL21pcHM2NHIyL2VsL2ZwNjR7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1IRjY0LTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZWwvZnA2NC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0yMTQ4LDEzICsyMTQ4LDEzIEBACiAvLyBDSEVDSy1FTC1TRi02NFIyLU4zMjogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1TRi02NFIyLU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtU0YtNjRSMi1OMzI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtU0YtNjRSMi1OMzI6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtNjRSMi1OMzI6ICItLXN5c3Jvb3Q9W1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZWwvc29mIgogLy8gQ0hFQ0stRUwtU0YtNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9zb2YvdXNyL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1TRi02NFIyLU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2VsL3NvZi91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLVNGLTY0UjItTjMyOiAiW1tUQ11dL21pcHM2NHIyL2VsL3NvZnt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtU0YtNjRSMi1OMzI6ICItTFtbU1JdXS9taXBzNjRyMi9lbC9zb2YiCi0vLyBDSEVDSy1FTC1TRi02NFIyLU4zMjogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0cjIvZWwvc29mIgotLy8gQ0hFQ0stRUwtU0YtNjRSMi1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2VsL3NvZi91c3IvbGliIgorLy8gQ0hFQ0stRUwtU0YtNjRSMi1OMzI6ICItTFtbVENdXS9taXBzNjRyMi9lbC9zb2YiCisvLyBDSEVDSy1FTC1TRi02NFIyLU4zMjogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0cjIvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtNjRSMi1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2VsL3NvZi91c3IvbGliIgogLy8gQ0hFQ0stRUwtU0YtNjRSMi1OMzI6ICJbW1RDXV0vbWlwczY0cjIvZWwvc29me3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtU0YtNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9zb2YvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMjE3NCwxMyArMjE3NCwxMyBAQAogLy8gQ0hFQ0stRUwtTkFOLTY0UjItTjMyOiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLU5BTi02NFIyLU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtTkFOLTY0UjItTjMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLU5BTi02NFIyLU4zMjogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLTY0UjItTjMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2VsL25hbjIwMDgiCiAvLyBDSEVDSy1FTC1OQU4tNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtTkFOLTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZWwvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLU5BTi02NFIyLU4zMjogIltbVENdXS9taXBzNjRyMi9lbC9uYW4yMDA4e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1OQU4tNjRSMi1OMzI6ICItTFtbU1JdXS9taXBzNjRyMi9lbC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFOLTY0UjItTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi9lbC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFOLTY0UjItTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9uYW4yMDA4L3Vzci9saWIiCisvLyBDSEVDSy1FTC1OQU4tNjRSMi1OMzI6ICItTFtbVENdXS9taXBzNjRyMi9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLTY0UjItTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLTY0UjItTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9uYW4yMDA4L3Vzci9saWIiCiAvLyBDSEVDSy1FTC1OQU4tNjRSMi1OMzI6ICJbW1RDXV0vbWlwczY0cjIvZWwvbmFuMjAwOHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLU5BTi02NFIyLU4zMjogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2VsL25hbjIwMDgvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMjIwMCwxMyArMjIwMCwxMyBAQAogLy8gQ0hFQ0stRUwtTkFONjQtNjRSMi1OMzI6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtTkFONjQtNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLU5BTjY0LTY0UjItTjMyOiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLU5BTjY0LTY0UjItTjMyOiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2VsL2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUVMLU5BTjY0LTY0UjItTjMyOiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyL2VsL2ZwNjQvbmFuMjAwOCIKIC8vIENIRUNLLUVMLU5BTjY0LTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtTkFONjQtNjRSMi1OMzI6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBDSEVDSy1FTC1OQU42NC02NFIyLU4zMjogIltbVENdXS9taXBzNjRyMi9lbC9mcDY0L25hbjIwMDh7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLU5BTjY0LTY0UjItTjMyOiAiLUxbW1NSXV0vbWlwczY0cjIvZWwvZnA2NC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFONjQtNjRSMi1OMzI6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyL2VsL2ZwNjQvbmFuMjAwOCIKLS8vIENIRUNLLUVMLU5BTjY0LTY0UjItTjMyOiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYiIKKy8vIENIRUNLLUVMLU5BTjY0LTY0UjItTjMyOiAiLUxbW1RDXV0vbWlwczY0cjIvZWwvZnA2NC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFONjQtNjRSMi1OMzI6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyL2VsL2ZwNjQvbmFuMjAwOCIKKy8vIENIRUNLLUVMLU5BTjY0LTY0UjItTjMyOiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYiIKIC8vIENIRUNLLUVMLU5BTjY0LTY0UjItTjMyOiAiW1tUQ11dL21pcHM2NHIyL2VsL2ZwNjQvbmFuMjAwOHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLU5BTjY0LTY0UjItTjMyOiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogLy8KQEAgLTIyMjYsMTMgKzIyMjYsMTMgQEAKIC8vIENIRUNLLUVMLUhGLTY0UjItNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtSEYtNjRSMi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtSEYtNjRSMi02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCi0vLyBDSEVDSy1FTC1IRi02NFIyLTY0OiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L2VsIgorLy8gQ0hFQ0stRUwtSEYtNjRSMi02NDogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbCIKIC8vIENIRUNLLUVMLUhGLTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC91c3IvbGlie3svfFxcXFx9fWNydDEubyIKIC8vIENIRUNLLUVMLUhGLTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLUhGLTY0UjItNjQ6ICJbW1RDXV0vbWlwczY0cjIvNjQvZWx7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLUhGLTY0UjItNjQ6ICItTFtbU1JdXS9taXBzNjRyMi82NC9lbCIKLS8vIENIRUNLLUVMLUhGLTY0UjItNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyLzY0L2VsIgotLy8gQ0hFQ0stRUwtSEYtNjRSMi02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvdXNyL2xpYiIKKy8vIENIRUNLLUVMLUhGLTY0UjItNjQ6ICItTFtbVENdXS9taXBzNjRyMi82NC9lbCIKKy8vIENIRUNLLUVMLUhGLTY0UjItNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyLzY0L2VsIgorLy8gQ0hFQ0stRUwtSEYtNjRSMi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvdXNyL2xpYiIKIC8vIENIRUNLLUVMLUhGLTY0UjItNjQ6ICJbW1RDXV0vbWlwczY0cjIvNjQvZWx7ey98XFxcXH19Y3J0ZW5kLm8iCiAvLyBDSEVDSy1FTC1IRi02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMjI1MiwxMyArMjI1MiwxMyBAQAogLy8gQ0hFQ0stRUwtSEY2NC02NFIyLTY0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLUhGNjQtNjRSMi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L3Vzci9pbmNsdWRlIgogLy8gQ0hFQ0stRUwtSEY2NC02NFIyLTY0OiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLUhGNjQtNjRSMi02NDogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC02NFIyLTY0OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L2VsL2ZwNjQiCiAvLyBDSEVDSy1FTC1IRjY0LTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9mcDY0L3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtSEY2NC02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvZnA2NC91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLUhGNjQtNjRSMi02NDogIltbVENdXS9taXBzNjRyMi82NC9lbC9mcDY0e3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1IRjY0LTY0UjItNjQ6ICItTFtbU1JdXS9taXBzNjRyMi82NC9lbC9mcDY0IgotLy8gQ0hFQ0stRUwtSEY2NC02NFIyLTY0OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi82NC9lbC9mcDY0IgotLy8gQ0hFQ0stRUwtSEY2NC02NFIyLTY0OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9mcDY0L3Vzci9saWIiCisvLyBDSEVDSy1FTC1IRjY0LTY0UjItNjQ6ICItTFtbVENdXS9taXBzNjRyMi82NC9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC02NFIyLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi82NC9lbC9mcDY0IgorLy8gQ0hFQ0stRUwtSEY2NC02NFIyLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9mcDY0L3Vzci9saWIiCiAvLyBDSEVDSy1FTC1IRjY0LTY0UjItNjQ6ICJbW1RDXV0vbWlwczY0cjIvNjQvZWwvZnA2NHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLUhGNjQtNjRSMi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L2VsL2ZwNjQvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMjI3OCwxMyArMjI3OCwxMyBAQAogLy8gQ0hFQ0stRUwtU0YtNjRSMi02NDogIi1pbnRlcm5hbC1leHRlcm5jLWlzeXN0ZW0iCiAvLyBDSEVDSy1FTC1TRi02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvdXNyL2luY2x1ZGUiCiAvLyBDSEVDSy1FTC1TRi02NFIyLTY0OiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLVNGLTY0UjItNjQ6ICItLXN5c3Jvb3Q9W1tTUjpbXiJdK11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtNjRSMi02NDogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9zb2YiCiAvLyBDSEVDSy1FTC1TRi02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvc29mL3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtU0YtNjRSMi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L2VsL3NvZi91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIENIRUNLLUVMLVNGLTY0UjItNjQ6ICJbW1RDXV0vbWlwczY0cjIvNjQvZWwvc29me3svfFxcXFx9fWNydGJlZ2luLm8iCi0vLyBDSEVDSy1FTC1TRi02NFIyLTY0OiAiLUxbW1NSXV0vbWlwczY0cjIvNjQvZWwvc29mIgotLy8gQ0hFQ0stRUwtU0YtNjRSMi02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0cjIvNjQvZWwvc29mIgotLy8gQ0hFQ0stRUwtU0YtNjRSMi02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvc29mL3Vzci9saWIiCisvLyBDSEVDSy1FTC1TRi02NFIyLTY0OiAiLUxbW1RDXV0vbWlwczY0cjIvNjQvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtNjRSMi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL21pcHMtbXRpLWxpbnV4LWdudS9saWIvbWlwczY0cjIvNjQvZWwvc29mIgorLy8gQ0hFQ0stRUwtU0YtNjRSMi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvc29mL3Vzci9saWIiCiAvLyBDSEVDSy1FTC1TRi02NFIyLTY0OiAiW1tUQ11dL21pcHM2NHIyLzY0L2VsL3NvZnt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLVNGLTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9zb2YvdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAvLwpAQCAtMjMwNCwxMyArMjMwNCwxMyBAQAogLy8gQ0hFQ0stRUwtTkFOLTY0UjItNjQ6ICItaW50ZXJuYWwtZXh0ZXJuYy1pc3lzdGVtIgogLy8gQ0hFQ0stRUwtTkFOLTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLU5BTi02NFIyLTY0OiAie3suKn19bGR7eyguZXhlKT99fSIKLS8vIENIRUNLLUVMLU5BTi02NFIyLTY0OiAiLS1zeXNyb290PVtbU1I6W14iXStdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L2VsL25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU4tNjRSMi02NDogIi0tc3lzcm9vdD1bW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9uYW4yMDA4IgogLy8gQ0hFQ0stRUwtTkFOLTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0MS5vIgogLy8gQ0hFQ0stRUwtTkFOLTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtTkFOLTY0UjItNjQ6ICJbW1RDXV0vbWlwczY0cjIvNjQvZWwvbmFuMjAwOHt7L3xcXFxcfX1jcnRiZWdpbi5vIgotLy8gQ0hFQ0stRUwtTkFOLTY0UjItNjQ6ICItTFtbU1JdXS9taXBzNjRyMi82NC9lbC9uYW4yMDA4IgotLy8gQ0hFQ0stRUwtTkFOLTY0UjItNjQ6ICItTFtbU1JdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyLzY0L2VsL25hbjIwMDgiCi0vLyBDSEVDSy1FTC1OQU4tNjRSMi02NDogIi1MW1tTUl1dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvbmFuMjAwOC91c3IvbGliIgorLy8gQ0hFQ0stRUwtTkFOLTY0UjItNjQ6ICItTFtbVENdXS9taXBzNjRyMi82NC9lbC9uYW4yMDA4IgorLy8gQ0hFQ0stRUwtTkFOLTY0UjItNjQ6ICItTFtbVENdXS8uLi8uLi8uLi8uLi9taXBzLW10aS1saW51eC1nbnUvbGliL21pcHM2NHIyLzY0L2VsL25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU4tNjRSMi02NDogIi1MW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvbmFuMjAwOC91c3IvbGliIgogLy8gQ0hFQ0stRUwtTkFOLTY0UjItNjQ6ICJbW1RDXV0vbWlwczY0cjIvNjQvZWwvbmFuMjAwOHt7L3xcXFxcfX1jcnRlbmQubyIKIC8vIENIRUNLLUVMLU5BTi02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIC8vCkBAIC0yMzMwLDEyICsyMzMwLDEyIEBACiAvLyBDSEVDSy1FTC1OQU42NC02NFIyLTY0OiAiLWludGVybmFsLWV4dGVybmMtaXN5c3RlbSIKIC8vIENIRUNLLUVMLU5BTjY0LTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC91c3IvaW5jbHVkZSIKIC8vIENIRUNLLUVMLU5BTjY0LTY0UjItNjQ6ICJ7ey4qfX1sZHt7KC5leGUpP319IgotLy8gQ0hFQ0stRUwtTkFONjQtNjRSMi02NDogIi0tc3lzcm9vdD1bW1NSOlteIl0rXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC02NFIyLTY0OiAiLS1zeXNyb290PVtbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L2VsL2ZwNjQvbmFuMjAwOCIKIC8vIENIRUNLLUVMLU5BTjY0LTY0UjItNjQ6ICJbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYnt7L3xcXFxcfX1jcnQxLm8iCiAvLyBDSEVDSy1FTC1OQU42NC02NFIyLTY0OiAiW1tUQ11dLy4uLy4uLy4uLy4uL3N5c3Jvb3QvbWlwczY0cjIvNjQvZWwvZnA2NC9uYW4yMDA4L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gQ0hFQ0stRUwtTkFONjQtNjRSMi02NDogIltbVENdXS9taXBzNjRyMi82NC9lbC9mcDY0L25hbjIwMDh7ey98XFxcXH19Y3J0YmVnaW4ubyIKLS8vIENIRUNLLUVMLU5BTjY0LTY0UjItNjQ6ICItTFtbU1JdXS9taXBzNjRyMi82NC9lbC9mcDY0L25hbjIwMDgiCi0vLyBDSEVDSy1FTC1OQU42NC02NFIyLTY0OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi82NC9lbC9mcDY0L25hbjIwMDgiCi0vLyBDSEVDSy1FTC1OQU42NC02NFIyLTY0OiAiLUxbW1NSXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYiIKKy8vIENIRUNLLUVMLU5BTjY0LTY0UjItNjQ6ICItTFtbVENdXS9taXBzNjRyMi82NC9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC02NFIyLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vbWlwcy1tdGktbGludXgtZ251L2xpYi9taXBzNjRyMi82NC9lbC9mcDY0L25hbjIwMDgiCisvLyBDSEVDSy1FTC1OQU42NC02NFIyLTY0OiAiLUxbW1RDXV0vLi4vLi4vLi4vLi4vc3lzcm9vdC9taXBzNjRyMi82NC9lbC9mcDY0L25hbjIwMDgvdXNyL2xpYiIKIC8vIENIRUNLLUVMLU5BTjY0LTY0UjItNjQ6ICJbW1RDXV0vbWlwczY0cjIvNjQvZWwvZnA2NC9uYW4yMDA4e3svfFxcXFx9fWNydGVuZC5vIgogLy8gQ0hFQ0stRUwtTkFONjQtNjRSMi02NDogIltbVENdXS8uLi8uLi8uLi8uLi9zeXNyb290L21pcHM2NHIyLzY0L2VsL2ZwNjQvbmFuMjAwOC91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL21pcHMtcmVkdWNlZC10b29sY2hhaW4uY3BwIGIvdGVzdC9Ecml2ZXIvbWlwcy1yZWR1Y2VkLXRvb2xjaGFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3ZWQ4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRHJpdmVyL21pcHMtcmVkdWNlZC10b29sY2hhaW4uY3BwCkBAIC0wLDAgKzEsMjggQEAKKy8vIENoZWNrIGZyb250ZW5kIGFuZCBsaW5rZXIgaW52b2NhdGlvbnMgb24gcmVkdWNlZCBEZWJpYW4gTUlQUyB0b29sY2hhaW4uCisvLyBUaGlzIHRvb2xjaGFpbiBpY2x1ZGVzIE8zMiBBQkkgb25seS4KKworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtLXRhcmdldD1taXBzLWxpbnV4LWdudSBcCisvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2RlYmlhbl9yZWR1Y2VkX21pcHNfdHJlZSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stREVCSUFOLU1JUFMgJXMKKy8vIENIRUNLLURFQklBTi1NSVBTOiAie3suKn19bGR7eyguZXhlKT99fSIgIi0tc3lzcm9vdD1bW1NZU1JPT1Q6W14iXStdXSIKKy8vIENIRUNLLURFQklBTi1NSVBTOiAie3suKn19L3Vzci9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuN3t7L3xcXFxcfX1jcnRiZWdpbi5vIgorLy8gQ0hFQ0stREVCSUFOLU1JUFM6ICItTFtbU1lTUk9PVF1dL3Vzci9saWIvZ2NjL21pcHMtbGludXgtZ251LzQuNyIKKy8vIENIRUNLLURFQklBTi1NSVBTOiAiLUxbW1NZU1JPT1RdXS91c3IvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjcvLi4vLi4vLi4vbWlwcy1saW51eC1nbnUiCisvLyBDSEVDSy1ERUJJQU4tTUlQUzogIi1MW1tTWVNST09UXV0vdXNyL2xpYi9taXBzLWxpbnV4LWdudSIKKy8vIENIRUNLLURFQklBTi1NSVBTOiAiLUxbW1NZU1JPT1RdXS91c3IvbGliL2djYy9taXBzLWxpbnV4LWdudS80LjcvLi4vLi4vLi4iCisvLyBDSEVDSy1ERUJJQU4tTUlQUzogIi1MW1tTWVNST09UXV0vbGliIgorLy8gQ0hFQ0stREVCSUFOLU1JUFM6ICItTFtbU1lTUk9PVF1dL3Vzci9saWIiCisKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLS10YXJnZXQ9bWlwc2VsLWxpbnV4LWdudSBcCisvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2RlYmlhbl9yZWR1Y2VkX21pcHNfdHJlZSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stREVCSUFOLU1JUFNFTCAlcworLy8gQ0hFQ0stREVCSUFOLU1JUFNFTDogInt7Lip9fWxke3soLmV4ZSk/fX0iICItLXN5c3Jvb3Q9W1tTWVNST09UOlteIl0rXV0iCisvLyBDSEVDSy1ERUJJQU4tTUlQU0VMOiAie3suKn19L3Vzci9saWIvZ2NjL21pcHNlbC1saW51eC1nbnUvNC43e3svfFxcXFx9fWNydGJlZ2luLm8iCisvLyBDSEVDSy1ERUJJQU4tTUlQU0VMOiAiLUxbW1NZU1JPT1RdXS91c3IvbGliL2djYy9taXBzZWwtbGludXgtZ251LzQuNyIKKy8vIENIRUNLLURFQklBTi1NSVBTRUw6ICItTFtbU1lTUk9PVF1dL3Vzci9saWIvZ2NjL21pcHNlbC1saW51eC1nbnUvNC43Ly4uLy4uLy4uL21pcHNlbC1saW51eC1nbnUiCisvLyBDSEVDSy1ERUJJQU4tTUlQU0VMOiAiLUxbW1NZU1JPT1RdXS91c3IvbGliL21pcHNlbC1saW51eC1nbnUiCisvLyBDSEVDSy1ERUJJQU4tTUlQU0VMOiAiLUxbW1NZU1JPT1RdXS91c3IvbGliL2djYy9taXBzZWwtbGludXgtZ251LzQuNy8uLi8uLi8uLiIKKy8vIENIRUNLLURFQklBTi1NSVBTRUw6ICItTFtbU1lTUk9PVF1dL2xpYiIKKy8vIENIRUNLLURFQklBTi1NSVBTRUw6ICItTFtbU1lTUk9PVF1dL3Vzci9saWIiCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9tb2R1bGVzLm0gYi90ZXN0L0RyaXZlci9tb2R1bGVzLm0KaW5kZXggYjkzMDU0ZC4uZDhlMjBlNCAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvbW9kdWxlcy5tCisrKyBiL3Rlc3QvRHJpdmVyL21vZHVsZXMubQpAQCAtNCwzICs0LDE4IEBACiAvLyBSVU46ICVjbGFuZyAtZm1vZHVsZXMgLWZuby1tb2R1bGVzIC1mbW9kdWxlcyAtIyMjICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1IQVMtTU9EVUxFUyAlcwogLy8gQ0hFQ0stSEFTLU1PRFVMRVM6IC1mbW9kdWxlcwogCisvLyBSVU46ICVjbGFuZyAtZmJ1aWxkLXNlc3Npb24tdGltZXN0YW1wPTEyMyAtIyMjICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1USU1FU1RBTVBfT05MWSAlcworLy8gVElNRVNUQU1QX09OTFk6IC1mYnVpbGQtc2Vzc2lvbi10aW1lc3RhbXA9MTIzCisKKy8vIFJVTjogJWNsYW5nIC1mYnVpbGQtc2Vzc2lvbi10aW1lc3RhbXA9MTIzIC1mbW9kdWxlcy12YWxpZGF0ZS1vbmNlLXBlci1idWlsZC1zZXNzaW9uIC0jIyMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1PRFVMRVNfVkFMSURBVEVfT05DRSAlcworLy8gTU9EVUxFU19WQUxJREFURV9PTkNFOiAtZmJ1aWxkLXNlc3Npb24tdGltZXN0YW1wPTEyMworLy8gTU9EVUxFU19WQUxJREFURV9PTkNFOiAtZm1vZHVsZXMtdmFsaWRhdGUtb25jZS1wZXItYnVpbGQtc2Vzc2lvbgorCisvLyBSVU46ICVjbGFuZyAtZm1vZHVsZXMtdmFsaWRhdGUtb25jZS1wZXItYnVpbGQtc2Vzc2lvbiAtIyMjICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NT0RVTEVTX1ZBTElEQVRFX09OQ0VfRVJSICVzCisvLyBNT0RVTEVTX1ZBTElEQVRFX09OQ0VfRVJSOiBvcHRpb24gJy1mbW9kdWxlcy12YWxpZGF0ZS1vbmNlLXBlci1idWlsZC1zZXNzaW9uJyByZXF1aXJlcyAnLWZidWlsZC1zZXNzaW9uLXRpbWVzdGFtcD08c2Vjb25kcyBzaW5jZSBFcG9jaD4nCisKKy8vIFJVTjogJWNsYW5nIC0jIyMgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PU1PRFVMRVNfVkFMSURBVEVfU1lTVEVNX0hFQURFUlNfREVGQVVMVCAlcworLy8gTU9EVUxFU19WQUxJREFURV9TWVNURU1fSEVBREVSU19ERUZBVUxULU5PVDogLWZtb2R1bGVzLXZhbGlkYXRlLXN5c3RlbS1oZWFkZXJzCisKKy8vIFJVTjogJWNsYW5nIC1mbW9kdWxlcy12YWxpZGF0ZS1zeXN0ZW0taGVhZGVycyAtIyMjICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1NT0RVTEVTX1ZBTElEQVRFX1NZU1RFTV9IRUFERVJTICVzCisvLyBNT0RVTEVTX1ZBTElEQVRFX1NZU1RFTV9IRUFERVJTOiAtZm1vZHVsZXMtdmFsaWRhdGUtc3lzdGVtLWhlYWRlcnMKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL25ldGJzZC5jIGIvdGVzdC9Ecml2ZXIvbmV0YnNkLmMKaW5kZXggMDljMmJkMy4uYjMwMGJmNCAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvbmV0YnNkLmMKKysrIGIvdGVzdC9Ecml2ZXIvbmV0YnNkLmMKQEAgLTcsNiArNywzNiBAQAogLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAtdGFyZ2V0IHg4Nl82NC0tbmV0YnNkNi4wLjAgXAogLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCiAvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9WDg2XzY0LTYgJXMKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBhYXJjaDY0LS1uZXRic2QgXAorLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9QUFSQ0g2NCAlcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAtdGFyZ2V0IGFhcmNoNjQtLW5ldGJzZDcuMC4wIFwKKy8vIFJVTjogLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19uZXRic2RfdHJlZSAlcyAtIyMjIDI+JjEgXAorLy8gUlVOOiB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUFBUkNINjQtNyAlcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAtdGFyZ2V0IGFybS0tbmV0YnNkLWVhYmkgXAorLy8gUlVOOiAtbm8taW50ZWdyYXRlZC1hcyAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9QVJNICVzCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzIC10YXJnZXQgYXJtLS1uZXRic2QgXAorLy8gUlVOOiAtbm8taW50ZWdyYXRlZC1hcyAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9QVJNLUFQQ1MgJXMKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCB0aHVtYi0tbmV0YnNkLWVhYmkgXAorLy8gUlVOOiAtbm8taW50ZWdyYXRlZC1hcyAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9VEhVTUIgJXMKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBhcm0tLW5ldGJzZDcuMC4wLWVhYmkgXAorLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9QVJNLTcgJXMKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBhcm0tLW5ldGJzZDYuMC4wLWVhYmkgXAorLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9QVJNLTYgJXMKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBhcm0tLW5ldGJzZC1lYWJpaGYgXAorLy8gUlVOOiAtbm8taW50ZWdyYXRlZC1hcyAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9QVJNLUhGICVzCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzIC10YXJnZXQgc3BhcmMtLW5ldGJzZCBcCisvLyBSVU46IC1uby1pbnRlZ3JhdGVkLWFzIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbmV0YnNkX3RyZWUgJXMgLSMjIyAyPiYxIFwKKy8vIFJVTjogfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1TUEFSQyAlcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAtdGFyZ2V0IHNwYXJjNjQtLW5ldGJzZCBcCisvLyBSVU46IC1uby1pbnRlZ3JhdGVkLWFzIC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbmV0YnNkX3RyZWUgJXMgLSMjIyAyPiYxIFwKKy8vIFJVTjogfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1TUEFSQzY0ICVzCiAKIC8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCB4ODZfNjQtLW5ldGJzZCAtc3RhdGljIFwKIC8vIFJVTjogLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19uZXRic2RfdHJlZSAlcyAtIyMjIDI+JjEgXApAQCAtMTcsNiArNDcsMjcgQEAKIC8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCB4ODZfNjQtLW5ldGJzZDYuMC4wIC1zdGF0aWMgXAogLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCiAvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Uy1YODZfNjQtNiAlcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAtdGFyZ2V0IGFhcmNoNjQtLW5ldGJzZCAtc3RhdGljIFwKKy8vIFJVTjogLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19uZXRic2RfdHJlZSAlcyAtIyMjIDI+JjEgXAorLy8gUlVOOiB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVMtQUFSQ0g2NCAlcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAtdGFyZ2V0IGFhcmNoNjQtLW5ldGJzZDcuMC4wIC1zdGF0aWMgXAorLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Uy1BQVJDSDY0LTcgJXMKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBhcm0tLW5ldGJzZC1lYWJpIC1zdGF0aWMgXAorLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Uy1BUk0gJXMKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBhcm0tLW5ldGJzZDcuMC4wLWVhYmkgLXN0YXRpYyBcCisvLyBSVU46IC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbmV0YnNkX3RyZWUgJXMgLSMjIyAyPiYxIFwKKy8vIFJVTjogfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1TLUFSTS03ICVzCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzIC10YXJnZXQgYXJtLS1uZXRic2Q2LjAuMC1lYWJpIC1zdGF0aWMgXAorLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Uy1BUk0tNiAlcworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAtdGFyZ2V0IHNwYXJjLS1uZXRic2QgLXN0YXRpYyBcCisvLyBSVU46IC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbmV0YnNkX3RyZWUgJXMgLSMjIyAyPiYxIFwKKy8vIFJVTjogfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1TLVNQQVJDICVzCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzIC10YXJnZXQgc3BhcmM2NC0tbmV0YnNkIC1zdGF0aWMgXAorLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Uy1TUEFSQzY0ICVzCiAKIC8vIFg4Nl82NDogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgIng4Nl82NC0tbmV0YnNkIgogLy8gWDg2XzY0OiBsZHt7Lip9fSIgIi0tZWgtZnJhbWUtaGRyIiAiLWR5bmFtaWMtbGlua2VyIiAiL2xpYmV4ZWMvbGQuZWxmX3NvIgpAQCAtMzQsMjQgKzg1LDE0NyBAQAogLy8gWDg2XzY0LTY6IGxke3suKn19IiAiLS1laC1mcmFtZS1oZHIiICItZHluYW1pYy1saW5rZXIiICIvbGliZXhlYy9sZC5lbGZfc28iCiAvLyBYODZfNjQtNjogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCiAvLyBYODZfNjQtNjogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGJlZ2luLm8iICJ7ey4qfX0ubyIgIi1sYyIKLS8vIFg4Nl82NC02OiAiLWxnY2MiICItLWFzLW5lZWRlZCIgIi1sZ2NjX3MiICItLW5vLWFzLW5lZWRlZCIKIC8vIFg4Nl82NC02OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0ZW5kLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAKKy8vIEFBUkNINjQ6IGNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJhYXJjaDY0LS1uZXRic2QiCisvLyBBQVJDSDY0OiBsZHt7Lip9fSIgIi0tZWgtZnJhbWUtaGRyIiAiLWR5bmFtaWMtbGlua2VyIiAiL2xpYmV4ZWMvbGQuZWxmX3NvIgorLy8gQUFSQ0g2NDogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBBQVJDSDY0OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0YmVnaW4ubyIgInt7Lip9fS5vIiAiLWxjIgorLy8gQUFSQ0g2NDogIi1sZ2NjIiAiLS1hcy1uZWVkZWQiICItbGdjY19zIiAiLS1uby1hcy1uZWVkZWQiCisvLyBBQVJDSDY0OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0ZW5kLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCisKKy8vIEFBUkNINjQtNzogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgImFhcmNoNjQtLW5ldGJzZDcuMC4wIgorLy8gQUFSQ0g2NC03OiBsZHt7Lip9fSIgIi0tZWgtZnJhbWUtaGRyIiAiLWR5bmFtaWMtbGlua2VyIiAiL2xpYmV4ZWMvbGQuZWxmX3NvIgorLy8gQUFSQ0g2NC03OiAiLW8iICJhLm91dCIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydDAubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGkubyIKKy8vIEFBUkNINjQtNzogICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbGMiCisvLyBBQVJDSDY0LTc6ICItbGdjYyIgIi0tYXMtbmVlZGVkIiAiLWxnY2NfcyIgIi0tbm8tYXMtbmVlZGVkIgorLy8gQUFSQ0g2NC03OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0ZW5kLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCisKKy8vIEFSTTogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgImFybXY1ZS0tbmV0YnNkLWVhYmkiCisvLyBBUk06IGFze3suKn19IiAiLW1jcHU9YXJtOTI2ZWotcyIgIi1vIgorLy8gQVJNOiBsZHt7Lip9fSIgIi0tZWgtZnJhbWUtaGRyIiAiLWR5bmFtaWMtbGlua2VyIiAiL2xpYmV4ZWMvbGQuZWxmX3NvIgorLy8gQVJNOiAiLW0iICJhcm1lbGZfbmJzZF9lYWJpIgorLy8gQVJNOiAiLW8iICJhLm91dCIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydDAubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGkubyIKKy8vIEFSTTogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGJlZ2luLm8iICJ7ey4qfX0ubyIgIi1sYyIKKy8vIEFSTTogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCisvLyBBUk0tQVBDUzogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgImFybXY0LS1uZXRic2QiCisvLyBBUk0tQVBDUzogYXN7ey4qfX0iICItbWNwdT1zdHJvbmdhcm0iICItbyIKKy8vIEFSTS1BUENTOiBsZHt7Lip9fSIgIi0tZWgtZnJhbWUtaGRyIiAiLWR5bmFtaWMtbGlua2VyIiAiL2xpYmV4ZWMvbGQuZWxmX3NvIgorLy8gQVJNLUFQQ1M6ICItbSIgImFybWVsZl9uYnNkIgorLy8gQVJNLUFQQ1M6ICItbyIgImEub3V0IiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0MC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgorLy8gQVJNLUFQQ1M6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbGMiCisvLyBBUk0tQVBDUzogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCisvLyBUSFVNQjogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgImFybXY1ZS0tbmV0YnNkLWVhYmkiCisvLyBUSFVNQjogYXN7ey4qfX0iICItbWNwdT1hcm05MjZlai1zIiAiLW8iCisvLyBUSFVNQjogbGR7ey4qfX0iICItLWVoLWZyYW1lLWhkciIgIi1keW5hbWljLWxpbmtlciIgIi9saWJleGVjL2xkLmVsZl9zbyIKKy8vIFRIVU1COiAiLW0iICJhcm1lbGZfbmJzZF9lYWJpIgorLy8gVEhVTUI6ICItbyIgImEub3V0IiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0MC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgorLy8gVEhVTUI6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbGMiCisvLyBUSFVNQjogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCisvLyBBUk0tNzogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgImFybXY1ZS0tbmV0YnNkNy4wLjAtZWFiaSIKKy8vIEFSTS03OiBsZHt7Lip9fSIgIi0tZWgtZnJhbWUtaGRyIiAiLWR5bmFtaWMtbGlua2VyIiAiL2xpYmV4ZWMvbGQuZWxmX3NvIgorLy8gQVJNLTc6ICItbSIgImFybWVsZl9uYnNkX2VhYmkiCisvLyBBUk0tNzogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBBUk0tNzogICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbGMiCisvLyBBUk0tNzogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCisvLyBBUk0tNjogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgImFybXY1ZS0tbmV0YnNkNi4wLjAtZWFiaSIKKy8vIEFSTS02OiBsZHt7Lip9fSIgIi0tZWgtZnJhbWUtaGRyIiAiLWR5bmFtaWMtbGlua2VyIiAiL2xpYmV4ZWMvbGQuZWxmX3NvIgorLy8gQVJNLTY6ICItbSIgImFybWVsZl9uYnNkX2VhYmkiCisvLyBBUk0tNjogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBBUk0tNjogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGJlZ2luLm8iICJ7ey4qfX0ubyIgIi1sYyIKKy8vIEFSTS02OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0ZW5kLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCisKKy8vIEFSTS1IRjogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgImFybXY1ZS0tbmV0YnNkLWVhYmloZiIKKy8vIEFSTS1IRjogbGR7ey4qfX0iICItbSIgImFybWVsZl9uYnNkX2VhYmloZiIKKworLy8gU1BBUkM6IGNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJzcGFyYy0tbmV0YnNkIgorLy8gU1BBUkM6IGFze3suKn19IiAiLTMyIiAiLW8iCisvLyBTUEFSQzogbGR7ey4qfX0iICItLWVoLWZyYW1lLWhkciIgIi1keW5hbWljLWxpbmtlciIgIi9saWJleGVjL2xkLmVsZl9zbyIKKy8vIFNQQVJDOiAiLW0iICJlbGYzMl9zcGFyYyIKKy8vIFNQQVJDOiAiLW8iICJhLm91dCIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydDAubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGkubyIKKy8vIFNQQVJDOiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0YmVnaW4ubyIgInt7Lip9fS5vIiAiLWxjIgorLy8gU1BBUkM6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRlbmQubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKKworLy8gU1BBUkM2NDogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgInNwYXJjNjQtLW5ldGJzZCIKKy8vIFNQQVJDNjQ6IGFze3suKn19IiAiLTY0IiAiLUF2OSIgIi1vIgorLy8gU1BBUkM2NDogbGR7ey4qfX0iICItLWVoLWZyYW1lLWhkciIgIi1keW5hbWljLWxpbmtlciIgIi9saWJleGVjL2xkLmVsZl9zbyIKKy8vIFNQQVJDNjQ6ICItbSIgImVsZjY0X3NwYXJjIgorLy8gU1BBUkM2NDogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBTUEFSQzY0OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0YmVnaW4ubyIgInt7Lip9fS5vIiAiLWxjIgorLy8gU1BBUkM2NDogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCiAvLyBTLVg4Nl82NDogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgIng4Nl82NC0tbmV0YnNkIgotLy8gUy1YODZfNjQ6IGxke3suKn19IiAiLUJzdGF0aWMiCisvLyBTLVg4Nl82NDogbGR7ey4qfX0iICItLWVoLWZyYW1lLWhkciIgIi1Cc3RhdGljIgogLy8gUy1YODZfNjQ6ICItbyIgImEub3V0IiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0MC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gUy1YODZfNjQ6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbGMiCiAvLyBTLVg4Nl82NDogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgogCiAvLyBTLVg4Nl82NC03OiBjbGFuZ3t7Lip9fSIgIi1jYzEiICItdHJpcGxlIiAieDg2XzY0LS1uZXRic2Q3LjAuMCIKLS8vIFMtWDg2XzY0LTc6IGxke3suKn19IiAiLUJzdGF0aWMiCisvLyBTLVg4Nl82NC03OiBsZHt7Lip9fSIgIi0tZWgtZnJhbWUtaGRyIiAiLUJzdGF0aWMiCiAvLyBTLVg4Nl82NC03OiAiLW8iICJhLm91dCIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydDAubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGkubyIKIC8vIFMtWDg2XzY0LTc6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbGMiCiAvLyBTLVg4Nl82NC03OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0ZW5kLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCiAKIC8vIFMtWDg2XzY0LTY6IGNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJ4ODZfNjQtLW5ldGJzZDYuMC4wIgotLy8gUy1YODZfNjQtNjogbGR7ey4qfX0iICItQnN0YXRpYyIKKy8vIFMtWDg2XzY0LTY6IGxke3suKn19IiAiLS1laC1mcmFtZS1oZHIiICItQnN0YXRpYyIKIC8vIFMtWDg2XzY0LTY6ICItbyIgImEub3V0IiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0MC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgogLy8gUy1YODZfNjQtNjogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGJlZ2luLm8iICJ7ey4qfX0ubyIgIi1sYyIKIC8vIFMtWDg2XzY0LTY6ICItbGdjY19laCIgIi1sYyIgIi1sZ2NjIgogLy8gUy1YODZfNjQtNjogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCisvLyBTLUFBUkNINjQ6IGNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJhYXJjaDY0LS1uZXRic2QiCisvLyBTLUFBUkNINjQ6IGxke3suKn19IiAiLS1laC1mcmFtZS1oZHIiICItQnN0YXRpYyIKKy8vIFMtQUFSQ0g2NDogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBTLUFBUkNINjQ6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbGMiCisvLyBTLUFBUkNINjQ6ICItbGdjY19laCIgIi1sYyIgIi1sZ2NjIgorLy8gUy1BQVJDSDY0OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0ZW5kLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCisKKy8vIFMtQUFSQ0g2NC03OiBjbGFuZ3t7Lip9fSIgIi1jYzEiICItdHJpcGxlIiAiYWFyY2g2NC0tbmV0YnNkNy4wLjAiCisvLyBTLUFBUkNINjQtNzogbGR7ey4qfX0iICItLWVoLWZyYW1lLWhkciIgIi1Cc3RhdGljIgorLy8gUy1BQVJDSDY0LTc6ICItbyIgImEub3V0IiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0MC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgorLy8gUy1BQVJDSDY0LTc6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbGMiCisvLyBTLUFBUkNINjQtNzogIi1sZ2NjX2VoIiAiLWxjIiAiLWxnY2MiCisvLyBTLUFBUkNINjQtNzogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCisvLyBTLUFSTTogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgImFybXY1ZS0tbmV0YnNkLWVhYmkiCisvLyBTLUFSTTogbGR7ey4qfX0iICItLWVoLWZyYW1lLWhkciIgIi1Cc3RhdGljIgorLy8gUy1BUk06ICItbSIgImFybWVsZl9uYnNkX2VhYmkiCisvLyBTLUFSTTogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBTLUFSTTogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGJlZ2luLm8iICJ7ey4qfX0ubyIgIi1sYyIKKy8vIFMtQVJNOiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0ZW5kLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCisKKy8vIFMtQVJNLTc6IGNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJhcm12NWUtLW5ldGJzZDcuMC4wLWVhYmkiCisvLyBTLUFSTS03OiBsZHt7Lip9fSIgIi0tZWgtZnJhbWUtaGRyIiAiLUJzdGF0aWMiCisvLyBTLUFSTS03OiAiLW0iICJhcm1lbGZfbmJzZF9lYWJpIgorLy8gUy1BUk0tNzogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBTLUFSTS03OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0YmVnaW4ubyIgInt7Lip9fS5vIiAiLWxjIgorLy8gUy1BUk0tNzogIi1sZ2NjX2VoIiAiLWxjIiAiLWxnY2MiCisvLyBTLUFSTS03OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0ZW5kLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCisKKy8vIFMtQVJNLTY6IGNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJhcm12NWUtLW5ldGJzZDYuMC4wLWVhYmkiCisvLyBTLUFSTS02OiBsZHt7Lip9fSIgIi0tZWgtZnJhbWUtaGRyIiAiLUJzdGF0aWMiCisvLyBTLUFSTS02OiAiLW0iICJhcm1lbGZfbmJzZF9lYWJpIgorLy8gUy1BUk0tNjogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBTLUFSTS02OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0YmVnaW4ubyIgInt7Lip9fS5vIiAiLWxjIgorLy8gUy1BUk0tNjogIi1sZ2NjX2VoIiAiLWxjIiAiLWxnY2MiCisvLyBTLUFSTS02OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0ZW5kLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCisKKy8vIFMtU1BBUkM6IGNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJzcGFyYy0tbmV0YnNkIgorLy8gUy1TUEFSQzogbGR7ey4qfX0iICItLWVoLWZyYW1lLWhkciIgIi1Cc3RhdGljIgorLy8gUy1TUEFSQzogIi1tIiAiZWxmMzJfc3BhcmMiCisvLyBTLVNQQVJDOiAiLW8iICJhLm91dCIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydDAubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGkubyIKKy8vIFMtU1BBUkM6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbGMiCisvLyBTLVNQQVJDOiAiLWxnY2NfZWgiICItbGMiICItbGdjYyIKKy8vIFMtU1BBUkM6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRlbmQubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKKworLy8gUy1TUEFSQzY0OiBjbGFuZ3t7Lip9fSIgIi1jYzEiICItdHJpcGxlIiAic3BhcmM2NC0tbmV0YnNkIgorLy8gUy1TUEFSQzY0OiBsZHt7Lip9fSIgIi0tZWgtZnJhbWUtaGRyIiAiLUJzdGF0aWMiCisvLyBTLVNQQVJDNjQ6ICItbSIgImVsZjY0X3NwYXJjIgorLy8gUy1TUEFSQzY0OiAiLW8iICJhLm91dCIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydDAubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGkubyIKKy8vIFMtU1BBUkM2NDogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGJlZ2luLm8iICJ7ey4qfX0ubyIgIi1sYyIKKy8vIFMtU1BBUkM2NDogIi1sZ2NjX2VoIiAiLWxjIiAiLWxnY2MiCisvLyBTLVNQQVJDNjQ6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRlbmQubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL25ldGJzZC5jcHAgYi90ZXN0L0RyaXZlci9uZXRic2QuY3BwCmluZGV4IDFjMzM4ZDMuLjk3OTcwZGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL25ldGJzZC5jcHAKKysrIGIvdGVzdC9Ecml2ZXIvbmV0YnNkLmNwcApAQCAtNyw2ICs3LDE4IEBACiAvLyBSVU46ICVjbGFuZ3h4IC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCB4ODZfNjQtLW5ldGJzZDYuMC4wIFwKIC8vIFJVTjogLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19uZXRic2RfdHJlZSAlcyAtIyMjIDI+JjEgXAogLy8gUlVOOiB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVg4Nl82NC02ICVzCisvLyBSVU46ICVjbGFuZ3h4IC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBhYXJjaDY0LS1uZXRic2QgXAorLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9QUFSQ0g2NCAlcworLy8gUlVOOiAlY2xhbmd4eCAtbm8tY2Fub25pY2FsLXByZWZpeGVzIC10YXJnZXQgYWFyY2g2NC0tbmV0YnNkNy4wLjAgXAorLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9QUFSQ0g2NC03ICVzCisvLyBSVU46ICVjbGFuZ3h4IC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBzcGFyYy0tbmV0YnNkIFwKKy8vIFJVTjogLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19uZXRic2RfdHJlZSAlcyAtIyMjIDI+JjEgXAorLy8gUlVOOiB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVNQQVJDICVzCisvLyBSVU46ICVjbGFuZ3h4IC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBzcGFyYzY0LS1uZXRic2QgXAorLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9U1BBUkM2NCAlcwogCiAvLyBSVU46ICVjbGFuZ3h4IC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCB4ODZfNjQtLW5ldGJzZCAtc3RhdGljIFwKIC8vIFJVTjogLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19uZXRic2RfdHJlZSAlcyAtIyMjIDI+JjEgXApAQCAtMTcsNiArMjksMTggQEAKIC8vIFJVTjogJWNsYW5neHggLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAtdGFyZ2V0IHg4Nl82NC0tbmV0YnNkNi4wLjAgLXN0YXRpYyBcCiAvLyBSVU46IC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbmV0YnNkX3RyZWUgJXMgLSMjIyAyPiYxIFwKIC8vIFJVTjogfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1TLVg4Nl82NC02ICVzCisvLyBSVU46ICVjbGFuZ3h4IC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBhYXJjaDY0LS1uZXRic2QgLXN0YXRpYyBcCisvLyBSVU46IC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbmV0YnNkX3RyZWUgJXMgLSMjIyAyPiYxIFwKKy8vIFJVTjogfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1TLUFBUkNINjQgJXMKKy8vIFJVTjogJWNsYW5neHggLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAtdGFyZ2V0IGFhcmNoNjQtLW5ldGJzZDcuMC4wIC1zdGF0aWMgXAorLy8gUlVOOiAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX25ldGJzZF90cmVlICVzIC0jIyMgMj4mMSBcCisvLyBSVU46IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Uy1BQVJDSDY0LTcgJXMKKy8vIFJVTjogJWNsYW5neHggLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAtdGFyZ2V0IHNwYXJjLS1uZXRic2QgLXN0YXRpYyBcCisvLyBSVU46IC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbmV0YnNkX3RyZWUgJXMgLSMjIyAyPiYxIFwKKy8vIFJVTjogfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1TLVNQQVJDICVzCisvLyBSVU46ICVjbGFuZ3h4IC1uby1jYW5vbmljYWwtcHJlZml4ZXMgLXRhcmdldCBzcGFyYzY0LS1uZXRic2QgLXN0YXRpYyBcCisvLyBSVU46IC0tc3lzcm9vdD0lUy9JbnB1dHMvYmFzaWNfbmV0YnNkX3RyZWUgJXMgLSMjIyAyPiYxIFwKKy8vIFJVTjogfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1TLVNQQVJDNjQgJXMKIAogLy8gWDg2XzY0OiBjbGFuZ3t7Lip9fSIgIi1jYzEiICItdHJpcGxlIiAieDg2XzY0LS1uZXRic2QiCiAvLyBYODZfNjQ6IGxke3suKn19IiAiLS1laC1mcmFtZS1oZHIiICItZHluYW1pYy1saW5rZXIiICIvbGliZXhlYy9sZC5lbGZfc28iCkBAIC0zNyw2ICs2MSwzNCBAQAogLy8gWDg2XzY0LTY6ICItbG0iICItbGMiICItbGdjYyIgIi0tYXMtbmVlZGVkIiAiLWxnY2NfcyIgIi0tbm8tYXMtbmVlZGVkIgogLy8gWDg2XzY0LTY6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRlbmQubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKIAorLy8gQUFSQ0g2NDogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgImFhcmNoNjQtLW5ldGJzZCIKKy8vIEFBUkNINjQ6IGxke3suKn19IiAiLS1laC1mcmFtZS1oZHIiICItZHluYW1pYy1saW5rZXIiICIvbGliZXhlYy9sZC5lbGZfc28iCisvLyBBQVJDSDY0OiAiLW8iICJhLm91dCIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydDAubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGkubyIKKy8vIEFBUkNINjQ6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbHN0ZGMrKyIKKy8vIEFBUkNINjQ6ICItbG0iICItbGMiICItbGdjYyIgIi0tYXMtbmVlZGVkIiAiLWxnY2NfcyIgIi0tbm8tYXMtbmVlZGVkIgorLy8gQUFSQ0g2NDogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCisvLyBBQVJDSDY0LTc6IGNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJhYXJjaDY0LS1uZXRic2Q3LjAuMCIKKy8vIEFBUkNINjQtNzogbGR7ey4qfX0iICItLWVoLWZyYW1lLWhkciIgIi1keW5hbWljLWxpbmtlciIgIi9saWJleGVjL2xkLmVsZl9zbyIKKy8vIEFBUkNINjQtNzogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBBQVJDSDY0LTc6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbHN0ZGMrKyIKKy8vIEFBUkNINjQtNzogIi1sbSIgIi1sYyIgIi1sZ2NjIiAiLS1hcy1uZWVkZWQiICItbGdjY19zIiAiLS1uby1hcy1uZWVkZWQiCisvLyBBQVJDSDY0LTc6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRlbmQubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKKworLy8gU1BBUkM6IGNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJzcGFyYy0tbmV0YnNkIgorLy8gU1BBUkM6IGxke3suKn19IiAiLS1laC1mcmFtZS1oZHIiICItZHluYW1pYy1saW5rZXIiICIvbGliZXhlYy9sZC5lbGZfc28iCisvLyBTUEFSQzogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCisvLyBTUEFSQzogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGJlZ2luLm8iICJ7ey4qfX0ubyIgIi1sc3RkYysrIgorLy8gU1BBUkM6ICItbG0iICItbGMiICItbGdjYyIgIi0tYXMtbmVlZGVkIiAiLWxnY2NfcyIgIi0tbm8tYXMtbmVlZGVkIgorLy8gU1BBUkM6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRlbmQubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydG4ubyIKKworLy8gU1BBUkM2NDogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgInNwYXJjNjQtLW5ldGJzZCIKKy8vIFNQQVJDNjQ6IGxke3suKn19IiAiLS1laC1mcmFtZS1oZHIiICItZHluYW1pYy1saW5rZXIiICIvbGliZXhlYy9sZC5lbGZfc28iCisvLyBTUEFSQzY0OiAiLW8iICJhLm91dCIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydDAubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGkubyIKKy8vIFNQQVJDNjQ6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbHN0ZGMrKyIKKy8vIFNQQVJDNjQ6ICItbG0iICItbGMiICItbGdjYyIgIi0tYXMtbmVlZGVkIiAiLWxnY2NfcyIgIi0tbm8tYXMtbmVlZGVkIgorLy8gU1BBUkM2NDogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCiAvLyBTLVg4Nl82NDogY2xhbmd7ey4qfX0iICItY2MxIiAiLXRyaXBsZSIgIng4Nl82NC0tbmV0YnNkIgogLy8gUy1YODZfNjQ6IGxke3suKn19IiAiLUJzdGF0aWMiCiAvLyBTLVg4Nl82NDogIi1vIiAiYS5vdXQiICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnQwLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRpLm8iCkBAIC01NSwzICsxMDcsMzEgQEAKIC8vIFMtWDg2XzY0LTY6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbHN0ZGMrKyIKIC8vIFMtWDg2XzY0LTY6ICItbG0iICItbGMiICItbGdjY19laCIgIi1sYyIgIi1sZ2NjIgogLy8gUy1YODZfNjQtNjogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCisvLyBTLUFBUkNINjQ6IGNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJhYXJjaDY0LS1uZXRic2QiCisvLyBTLUFBUkNINjQ6IGxke3suKn19IiAiLUJzdGF0aWMiCisvLyBTLUFBUkNINjQ6ICItbyIgImEub3V0IiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0MC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgorLy8gUy1BQVJDSDY0OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0YmVnaW4ubyIgInt7Lip9fS5vIiAiLWxzdGRjKysiCisvLyBTLUFBUkNINjQ6ICItbG0iICItbGMiICItbGdjY19laCIgIi1sYyIgIi1sZ2NjIgorLy8gUy1BQVJDSDY0OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0ZW5kLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCisKKy8vIFMtQUFSQ0g2NC03OiBjbGFuZ3t7Lip9fSIgIi1jYzEiICItdHJpcGxlIiAiYWFyY2g2NC0tbmV0YnNkNy4wLjAiCisvLyBTLUFBUkNINjQtNzogbGR7ey4qfX0iICItQnN0YXRpYyIKKy8vIFMtQUFSQ0g2NC03OiAiLW8iICJhLm91dCIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydDAubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGkubyIKKy8vIFMtQUFSQ0g2NC03OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0YmVnaW4ubyIgInt7Lip9fS5vIiAiLWxzdGRjKysiCisvLyBTLUFBUkNINjQtNzogIi1sbSIgIi1sYyIgIi1sZ2NjX2VoIiAiLWxjIiAiLWxnY2MiCisvLyBTLUFBUkNINjQtNzogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCisvLyBTLVNQQVJDOiBjbGFuZ3t7Lip9fSIgIi1jYzEiICItdHJpcGxlIiAic3BhcmMtLW5ldGJzZCIKKy8vIFMtU1BBUkM6IGxke3suKn19IiAiLUJzdGF0aWMiCisvLyBTLVNQQVJDOiAiLW8iICJhLm91dCIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydDAubyIgInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGkubyIKKy8vIFMtU1BBUkM6ICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRiZWdpbi5vIiAie3suKn19Lm8iICItbHN0ZGMrKyIKKy8vIFMtU1BBUkM6ICItbG0iICItbGMiICItbGdjY19laCIgIi1sYyIgIi1sZ2NjIgorLy8gUy1TUEFSQzogInt7Lip9fS91c3IvbGlie3svfFxcXFx9fWNydGVuZC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0bi5vIgorCisvLyBTLVNQQVJDNjQ6IGNsYW5ne3suKn19IiAiLWNjMSIgIi10cmlwbGUiICJzcGFyYzY0LS1uZXRic2QiCisvLyBTLVNQQVJDNjQ6IGxke3suKn19IiAiLUJzdGF0aWMiCisvLyBTLVNQQVJDNjQ6ICItbyIgImEub3V0IiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0MC5vIiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0aS5vIgorLy8gUy1TUEFSQzY0OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0YmVnaW4ubyIgInt7Lip9fS5vIiAiLWxzdGRjKysiCisvLyBTLVNQQVJDNjQ6ICItbG0iICItbGMiICItbGdjY19laCIgIi1sYyIgIi1sZ2NjIgorLy8gUy1TUEFSQzY0OiAie3suKn19L3Vzci9saWJ7ey98XFxcXH19Y3J0ZW5kLm8iICJ7ey4qfX0vdXNyL2xpYnt7L3xcXFxcfX1jcnRuLm8iCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9uby1pbnRlZ3JhdGVkLWFzLmMgYi90ZXN0L0RyaXZlci9uby1pbnRlZ3JhdGVkLWFzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyYWIxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRHJpdmVyL25vLWludGVncmF0ZWQtYXMuYwpAQCAtMCwwICsxLDE5IEBACisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGkzODYgLSMjIyAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKKy8vIFJVTjogICAgIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXggTk9JQVMKKworLy8gTk9JQVM6IC1uby1pbnRlZ3JhdGVkLWFzCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgaTM4NiAtIyMjIC1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAorLy8gUlVOOiAgICAgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeCBJQVMKKworLy8gSUFTLU5PVDogLW5vLWludGVncmF0ZWQtYXMKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpMzg2IC0jIyMgLWMgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IERFRkFVTFQKKworLy8gREVGQVVMVC1OT1Q6IC1uby1pbnRlZ3JhdGVkLWFzCisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgbXNwNDMwIC0jIyMgLWMgJXMgMj4mMSBcCisvLyBSVU46ICAgICB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IE5PLUlBUy1ERUZBVUxUCisKKy8vIE5PLUlBUy1ERUZBVUxUOiAtbm8taW50ZWdyYXRlZC1hcworCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9ub3N0ZGluY3h4LmNwcCBiL3Rlc3QvRHJpdmVyL25vc3RkaW5jeHguY3BwCmluZGV4IDFlMWQ4NWYuLjEyNjgyOGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL25vc3RkaW5jeHguY3BwCisrKyBiL3Rlc3QvRHJpdmVyL25vc3RkaW5jeHguY3BwCkBAIC0xLDQgKzEsNiBAQAogLy8gUlVOOiBub3QgJWNsYW5neHggLW5vc3RkaW5jKysgJXMgMj4mMSB8IEZpbGVDaGVjayAlcwotLy8gWEZBSUw6IHdpbjMyCiAvLyBDSEVDSzogZmlsZSBub3QgZm91bmQKICNpbmNsdWRlIDx2ZWN0b3I+IAorCisvLyBNU1ZDIGhhcyBDKysgaGVhZGVycyBpbiBzYW1lIGRpcmVjdG9yeSBhcyBDIGhlYWRlcnMuCisvLyBSRVFVSVJFUzogbm9uLW1zLXNkawpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvbm96bGliY29tcHJlc3MuYyBiL3Rlc3QvRHJpdmVyL25vemxpYmNvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhYzA2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRHJpdmVyL25vemxpYmNvbXByZXNzLmMKQEAgLTAsMCArMSw2IEBACisvLyBSVU46ICVjbGFuZyAtYyAlcyAtV2EsLS1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucyAyPiYxIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZyAtYyAlcyAtV2EsLS1jb21wcmVzcy1kZWJ1Zy1zZWN0aW9ucyAtV2EsLS1ub2NvbXByZXNzLWRlYnVnLXNlY3Rpb25zIDI+JjEgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Tk9XQVJOICVzCisvLyBSRVFVSVJFUzogbm96bGliCisKKy8vIENIRUNLOiB3YXJuaW5nOiBjYW5ub3QgY29tcHJlc3MgZGVidWcgc2VjdGlvbnMgKHpsaWIgbm90IGluc3RhbGxlZCkKKy8vIE5PV0FSTi1OT1Q6IHdhcm5pbmc6IGNhbm5vdCBjb21wcmVzcyBkZWJ1ZyBzZWN0aW9ucyAoemxpYiBub3QgaW5zdGFsbGVkKQpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvb3BlbmJzZC5jIGIvdGVzdC9Ecml2ZXIvb3BlbmJzZC5jCmluZGV4IGVmMDJiMDcuLjVmZTI3ZjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL29wZW5ic2QuYworKysgYi90ZXN0L0RyaXZlci9vcGVuYnNkLmMKQEAgLTM5LDYgKzM5LDEwIEBACiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1BTUQ2NC1NMzIgJXMKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgcG93ZXJwYy11bmtub3duLW9wZW5ic2QgLSMjIyAtbm8taW50ZWdyYXRlZC1hcyAtYyAlcyAyPiYxIFwKIC8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVBPV0VSUEMgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgc3BhcmMtdW5rbm93bi1vcGVuYnNkIC0jIyMgLW5vLWludGVncmF0ZWQtYXMgLWMgJXMgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1TUEFSQyAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBzcGFyYzY0LXVua25vd24tb3BlbmJzZCAtIyMjIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stU1BBUkM2NCAlcwogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBtaXBzNjQtdW5rbm93bi1vcGVuYnNkIC0jIyMgLW5vLWludGVncmF0ZWQtYXMgLWMgJXMgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1NSVBTNjQgJXMKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgbWlwczY0LXVua25vd24tb3BlbmJzZCAtZlBJQyAtIyMjIC1uby1pbnRlZ3JhdGVkLWFzIC1jICVzIDI+JjEgXApAQCAtNDksNiArNTMsOCBAQAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stTUlQUzY0RUwtUElDICVzCiAvLyBDSEVDSy1BTUQ2NC1NMzI6IGFze3suKn19IiAiLS0zMiIKIC8vIENIRUNLLVBPV0VSUEM6IGFze3suKn19IiAiLW1wcGMiICItbWFueSIKKy8vIENIRUNLLVNQQVJDOiBhc3t7Lip9fSIgIi0zMiIKKy8vIENIRUNLLVNQQVJDNjQ6IGFze3suKn19IiAiLTY0IiAiLUF2OWEiCiAvLyBDSEVDSy1NSVBTNjQ6IGFze3suKn19IiAiLW1hYmkiICI2NCIgIi1FQiIKIC8vIENIRUNLLU1JUFM2NC1QSUM6IGFze3suKn19IiAiLW1hYmkiICI2NCIgIi1FQiIgIi1LUElDIgogLy8gQ0hFQ0stTUlQUzY0RUw6IGFze3suKn19IiAiLW1hYmkiICI2NCIgIi1FTCIKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL3BjaC1kZXBzLmMgYi90ZXN0L0RyaXZlci9wY2gtZGVwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDg2MzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0RyaXZlci9wY2gtZGVwcy5jCkBAIC0wLDAgKzEsMTAgQEAKKy8vIFJVTjogJWNsYW5nIC14IGMtaGVhZGVyICVzIC1vICV0LnBjaCAtTU1EIC1NVCBkZXBlbmRlbmNpZXMgLU1GICV0LmQgLSMjIyAyPiAldAorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWlucHV0LWZpbGU9JXQKKy8vIENIRUNLOiAtZW1pdC1wY2gKKy8vIENIRUNLOiAtZGVwZW5kZW5jeS1maWxlCisvLyBDSEVDSzogLW1vZHVsZS1maWxlLWRlcHMKKworLy8gUlVOOiAlY2xhbmcgLWMgJXMgLW8gJXQgLU1NRCAtTVQgZGVwZW5kZW5jaWVzIC1NRiAldC5kIC0jIyMgMj4gJXQKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9Q0hFQ0stTk9QQ0ggLWlucHV0LWZpbGU9JXQKKy8vIENIRUNLLU5PUENIOiAtZGVwZW5kZW5jeS1maWxlCisvLyBDSEVDSy1OT1BDSC1OT1Q6IC1tb2R1bGUtZmlsZS1kZXBzCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9waWMuYyBiL3Rlc3QvRHJpdmVyL3BpYy5jCmluZGV4IDMwZTEwMDUuLjlkNDMzYWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL3BpYy5jCisrKyBiL3Rlc3QvRHJpdmVyL3BpYy5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIC8vIFJVTjogICB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1OTy1QSUUKIC8vCiAvLyBEYXJ3aW4gaXMgYSBiZWF1dGlmdWwgYW5kIHVuaXF1ZSBzbm93Zmxha2Ugd2hlbiBpdCBjb21lcyB0byB0aGVzZSBmbGFncy4KLS8vIFdoZW4gdGFyZ2V0dGluZyBhIDMyLWJpdCBkYXJ3aW4gc3lzdGVtLCB0aGUgLWZuby0qIGZsYWcgdmFyaWFudHMgd29yayBhbmQKKy8vIFdoZW4gdGFyZ2V0aW5nIGEgMzItYml0IGRhcndpbiBzeXN0ZW0sIHRoZSAtZm5vLSogZmxhZyB2YXJpYW50cyB3b3JrIGFuZAogLy8gZGlzYWJsZSBQSUMsIGJ1dCBhbnkgb3RoZXIgZmxhZyBlbmFibGVzIFBJQyAoKm5vdCogUElFKSBldmVuIGlmIHRoZSBmbGFnCiAvLyBzcGVjaWZpZXMgUElFLiBPbiA2NC1iaXQgdGFyZ2V0cywgdGhlcmUgaXMgc2ltcGx5IG5vdGhpbmcgeW91IGNhbiBkbywgdGhlcmUKIC8vIGlzIG5vIFBJRSwgdGhlcmUgaXMgb25seSBQSUMgd2hlbiBpdCBjb21lcyB0byBjb21waWxhdGlvbi4KQEAgLTIwOSwzICsyMDksMTEgQEAKIC8vIE9uIE9wZW5CU0QsIC1ub3BpZSBuZWVkcyB0byBiZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbGlua2VyLgogLy8gUlVOOiAlY2xhbmcgJXMgLXRhcmdldCBpMzg2LXBjLW9wZW5ic2QgLW5vcGllIC0jIyMgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTk9QSUUtTEQKKy8vCisvLyBPbiBBbmRyb2lkIFBJQyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQKKy8vIFJVTjogJWNsYW5nIC1jICVzIC10YXJnZXQgaTY4Ni1saW51eC1hbmRyb2lkIC0jIyMgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stUElDMgorLy8gUlVOOiAlY2xhbmcgLWMgJXMgLXRhcmdldCBhcm0tbGludXgtYW5kcm9pZGVhYmkgLSMjIyAyPiYxIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1QSUMxCisvLyBSVU46ICVjbGFuZyAtYyAlcyAtdGFyZ2V0IG1pcHNlbC1saW51eC1hbmRyb2lkIC0jIyMgMj4mMSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stUElDMQpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvcHBjLWZlYXR1cmVzLmNwcCBiL3Rlc3QvRHJpdmVyL3BwYy1mZWF0dXJlcy5jcHAKaW5kZXggNjk1OWM2Mi4uYTdjY2VkZiAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvcHBjLWZlYXR1cmVzLmNwcAorKysgYi90ZXN0L0RyaXZlci9wcGMtZmVhdHVyZXMuY3BwCkBAIC05MiwzICs5MiwyNyBAQAogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUgJXMgLW1uby12c3ggLW12c3ggLSMjIyAtbyAldC5vIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1WU1ggJXMKIC8vIENIRUNLLVZTWDogIi10YXJnZXQtZmVhdHVyZSIgIit2c3giCiAKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgcG93ZXJwYzY0LXVua25vd24tbGludXgtZ251ICVzIC1tbm8tY3JiaXRzIC0jIyMgLW8gJXQubyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stTk9DUkJJVFMgJXMKKy8vIENIRUNLLU5PQ1JCSVRTOiAiLXRhcmdldC1mZWF0dXJlIiAiLWNyYml0cyIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUgJXMgLW1uby1jcmJpdHMgLW1jcmJpdHMgLSMjIyAtbyAldC5vIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DUkJJVFMgJXMKKy8vIENIRUNLLUNSQklUUzogIi10YXJnZXQtZmVhdHVyZSIgIitjcmJpdHMiCisKKy8vIEFzc2VtYmxlciBmZWF0dXJlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUgJXMgLSMjIyAtbyAldC5vIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDS19CRV9BU19BUkdTICVzCisvLyBDSEVDS19CRV9BU19BUkdTOiAiLW1wcGM2NCIKKy8vIENIRUNLX0JFX0FTX0FSR1M6ICItbWFueSIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LWdudSAlcyAtIyMjIC1vICV0Lm8gMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLX0xFX0FTX0FSR1MgJXMKKy8vIENIRUNLX0xFX0FTX0FSR1M6ICItbXBwYzY0IgorLy8gQ0hFQ0tfTEVfQVNfQVJHUzogIi1tYW55IgorLy8gQ0hFQ0tfTEVfQVNfQVJHUzogIi1tbGl0dGxlLWVuZGlhbiIKKworLy8gbGlua2VyIGZlYXR1cmVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudSAlcyAtIyMjIC1vICV0Lm8gMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLX0JFX0xEX0FSR1MgJXMKKy8vIENIRUNLX0JFX0xEX0FSR1M6ICJlbGY2NHBwYyIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBwb3dlcnBjNjRsZS11bmtub3duLWxpbnV4LWdudSAlcyAtIyMjIC1vICV0Lm8gMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLX0xFX0xEX0FSR1MgJXMKKy8vIENIRUNLX0xFX0xEX0FSR1M6ICJlbGY2NGxwcGMiCisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvcHJlcHJvY2Vzcy1tdWx0aXBsZS5jIGIvdGVzdC9Ecml2ZXIvcHJlcHJvY2Vzcy1tdWx0aXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmODdkM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0RyaXZlci9wcmVwcm9jZXNzLW11bHRpcGxlLmMKQEAgLTAsMCArMSw2IEBACisvLyBSVU46ICVjbGFuZyAtRSAlcyAlcyB8IEZpbGVDaGVjayAlcworLy8gVGVzdCB0aGF0IHRoZSBkcml2ZXIgY2FuIHByZXByb2Nlc3MgbXVsdGlwbGUgZmlsZXMuCisKK1gKKy8vIENIRUNLOiBYCisvLyBDSEVDSzogWApkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvcWFfb3ZlcnJpZGUuYyBiL3Rlc3QvRHJpdmVyL3FhX292ZXJyaWRlLmMKaW5kZXggZTVkOWM5NS4uZDI3NTRjOCAxMDA2NDQKLS0tIGEvdGVzdC9Ecml2ZXIvcWFfb3ZlcnJpZGUuYworKysgYi90ZXN0L0RyaXZlci9xYV9vdmVycmlkZS5jCkBAIC0xLDEyICsxLDEyIEBACi0vLyBSVU46IGVudiBRQV9PVkVSUklERV9HQ0MzX09QVElPTlM9IiMrLU9zICstT3ogKy1PICstTzMgKy1PaWdub3JlICthICtiICtjIHhiIFhhIE9tYWdpYyBeLSMjIyAgIiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luICVzIC1PMiBiIC1PMyAyPiYxIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46IGVudiBRQV9PVkVSUklERV9HQ0MzX09QVElPTlM9IngtV2Vycm9yICstbXNzZSIgJWNsYW5nIC10YXJnZXQgeDg2XzY0LWFwcGxlLWRhcndpbiAtV2Vycm9yICVzIC1jIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVJNLVdFUlJPUgorLy8gUlVOOiBlbnYgQ0NDX09WRVJSSURFX09QVElPTlM9IiMrLU9zICstT3ogKy1PICstTzMgKy1PaWdub3JlICthICtiICtjIHhiIFhhIE9tYWdpYyBeLSMjIyAgIiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luICVzIC1PMiBiIC1PMyAyPiYxIHwgRmlsZUNoZWNrICVzCisvLyBSVU46IGVudiBDQ0NfT1ZFUlJJREVfT1BUSU9OUz0ieC1XZXJyb3IgKy1tc3NlIiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luIC1XZXJyb3IgJXMgLWMgLSMjIyAyPiYxIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9Uk0tV0VSUk9SCiAKIC8vIENIRUNLOiAiLWNjMSIKIC8vIENIRUNLLU5PVDogIi1PaWdub3JlIgogLy8gQ0hFQ0s6ICItT21hZ2ljIgogLy8gQ0hFQ0stTk9UOiAiLU9pZ25vcmUiCiAKLS8vIFJNLVdFUlJPUjogIyMjIFFBX09WRVJSSURFX0dDQzNfT1BUSU9OUzogeC1XZXJyb3IgKy1tc3NlCisvLyBSTS1XRVJST1I6ICMjIyBDQ0NfT1ZFUlJJREVfT1BUSU9OUzogeC1XZXJyb3IgKy1tc3NlCiAvLyBSTS1XRVJST1ItTkVYVDogIyMjIERlbGV0aW5nIGFyZ3VtZW50IC1XZXJyb3IKIC8vIFJNLVdFUlJPUi1ORVhUOiAjIyMgQWRkaW5nIGFyZ3VtZW50IC1tc3NlIGF0IGVuZAogLy8gUk0tV0VSUk9SLU5PVDogIi1XZXJyb3IiCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9zYW5pdGl6ZV91bndpbmRfdGFibGVzLmMgYi90ZXN0L0RyaXZlci9zYW5pdGl6ZV91bndpbmRfdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3ODg5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRHJpdmVyL3Nhbml0aXplX3Vud2luZF90YWJsZXMuYwpAQCAtMCwwICsxLDExIEBACisvLyBTYW5pdGl6ZXJzIG5lZWQgdG8gdW53aW5kIHN0YWNrIGF0IGFueSBjb2RlIGxvY2F0aW9uLgorLy8gVGVzdCB0aGF0IHVud2luZCB0YWJsZXMgYXJlIGVuYWJsZWQgaW4gc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zLgorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT1hZGRyZXNzICVzIC0jIyMgMj4mMSB8ICBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgaTY4Ni1saW51eC1nbnUgLWZzYW5pdGl6ZT1hZGRyZXNzICVzIC0jIyMgMj4mMSB8ICBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtLWxpbnV4LWFuZHJvaWRlYWJpIC1mc2FuaXRpemU9YWRkcmVzcyAlcyAtIyMjIDI+JjEgfCAgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHg4Nl82NC1saW51eC1nbnUgLWZzYW5pdGl6ZT1tZW1vcnkgJXMgLSMjIyAyPiYxIHwgIEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtbGludXgtZ251IC1mc2FuaXRpemU9dGhyZWFkICVzIC0jIyMgMj4mMSB8ICBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWxpbnV4LWdudSAtZnNhbml0aXplPWRhdGFmbG93ICVzIC0jIyMgMj4mMSB8ICBGaWxlQ2hlY2sgJXMKKworLy8gQ0hFQ0s6IC1tdW53aW5kLXRhYmxlcwpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvc2FuaXRpemVyLWxkLmMgYi90ZXN0L0RyaXZlci9zYW5pdGl6ZXItbGQuYwppbmRleCA2OTFiNDRiLi42MDNlNTEwIDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci9zYW5pdGl6ZXItbGQuYworKysgYi90ZXN0L0RyaXZlci9zYW5pdGl6ZXItbGQuYwpAQCAtMTUsNiArMTUsNjMgQEAKIC8vIENIRUNLLUFTQU4tTElOVVgtTk9UOiAiLWV4cG9ydC1keW5hbWljIgogLy8gQ0hFQ0stQVNBTi1MSU5VWDogIi0tZHluYW1pYy1saXN0PXt7Lip9fWxpYmNsYW5nX3J0LmFzYW4taTM4Ni5hLnN5bXMiCiAKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLXRhcmdldCBpMzg2LXVua25vd24tbGludXggLWZzYW5pdGl6ZT1hZGRyZXNzIC1zaGFyZWQtbGliYXNhbiBcCisvLyBSVU46ICAgICAtcmVzb3VyY2UtZGlyPSVTL0lucHV0cy9yZXNvdXJjZV9kaXIgXAorLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19saW51eF90cmVlIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1TSEFSRUQtQVNBTi1MSU5VWCAlcworLy8KKy8vIENIRUNLLVNIQVJFRC1BU0FOLUxJTlVYOiAie3soLipbXi0uMC05QS1aX2Etel0pP319bGR7eyguZXhlKT99fSIKKy8vIENIRUNLLVNIQVJFRC1BU0FOLUxJTlVYLU5PVDogIi1sYyIKKy8vIENIRUNLLVNIQVJFRC1BU0FOLUxJTlVYLU5PVDogbGliY2xhbmdfcnQuYXNhbi1pMzg2LmEiCisvLyBDSEVDSy1TSEFSRUQtQVNBTi1MSU5VWDogIi13aG9sZS1hcmNoaXZlIiAie3suKn19bGliY2xhbmdfcnQuYXNhbi1wcmVpbml0LWkzODYuYSIgIi1uby13aG9sZS1hcmNoaXZlIgorLy8gQ0hFQ0stU0hBUkVELUFTQU4tTElOVVg6IGxpYmNsYW5nX3J0LmFzYW4taTM4Ni5zbyIKKy8vIENIRUNLLVNIQVJFRC1BU0FOLUxJTlVYLU5PVDogIi1scHRocmVhZCIKKy8vIENIRUNLLVNIQVJFRC1BU0FOLUxJTlVYLU5PVDogIi1scnQiCisvLyBDSEVDSy1TSEFSRUQtQVNBTi1MSU5VWC1OT1Q6ICItbGRsIgorLy8gQ0hFQ0stU0hBUkVELUFTQU4tTElOVVgtTk9UOiAiLWV4cG9ydC1keW5hbWljIgorLy8gQ0hFQ0stU0hBUkVELUFTQU4tTElOVVgtTk9UOiAiLS1keW5hbWljLWxpc3QiCisKKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5zbyAtc2hhcmVkIDI+JjEgXAorLy8gUlVOOiAgICAgLXRhcmdldCBpMzg2LXVua25vd24tbGludXggLWZzYW5pdGl6ZT1hZGRyZXNzIC1zaGFyZWQtbGliYXNhbiBcCisvLyBSVU46ICAgICAtcmVzb3VyY2UtZGlyPSVTL0lucHV0cy9yZXNvdXJjZV9kaXIgXAorLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19saW51eF90cmVlIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1EU08tU0hBUkVELUFTQU4tTElOVVggJXMKKy8vCisvLyBDSEVDSy1EU08tU0hBUkVELUFTQU4tTElOVVg6ICJ7eyguKlteLS4wLTlBLVpfYS16XSk/fX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stRFNPLVNIQVJFRC1BU0FOLUxJTlVYLU5PVDogIi1sYyIKKy8vIENIRUNLLURTTy1TSEFSRUQtQVNBTi1MSU5VWC1OT1Q6IGxpYmNsYW5nX3J0LmFzYW4taTM4Ni5hIgorLy8gQ0hFQ0stRFNPLVNIQVJFRC1BU0FOLUxJTlVYLU5PVDogImxpYmNsYW5nX3J0LmFzYW4tcHJlaW5pdC1pMzg2LmEiCisvLyBDSEVDSy1EU08tU0hBUkVELUFTQU4tTElOVVg6IGxpYmNsYW5nX3J0LmFzYW4taTM4Ni5zbyIKKy8vIENIRUNLLURTTy1TSEFSRUQtQVNBTi1MSU5VWC1OT1Q6ICItbHB0aHJlYWQiCisvLyBDSEVDSy1EU08tU0hBUkVELUFTQU4tTElOVVgtTk9UOiAiLWxydCIKKy8vIENIRUNLLURTTy1TSEFSRUQtQVNBTi1MSU5VWC1OT1Q6ICItbGRsIgorLy8gQ0hFQ0stRFNPLVNIQVJFRC1BU0FOLUxJTlVYLU5PVDogIi1leHBvcnQtZHluYW1pYyIKKy8vIENIRUNLLURTTy1TSEFSRUQtQVNBTi1MSU5VWC1OT1Q6ICItLWR5bmFtaWMtbGlzdCIKKworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtdGFyZ2V0IGkzODYtdW5rbm93bi1mcmVlYnNkIC1mc2FuaXRpemU9YWRkcmVzcyBcCisvLyBSVU46ICAgICAtcmVzb3VyY2UtZGlyPSVTL0lucHV0cy9yZXNvdXJjZV9kaXIgXAorLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19mcmVlYnNkX3RyZWUgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFTQU4tRlJFRUJTRCAlcworLy8KKy8vIENIRUNLLUFTQU4tRlJFRUJTRDogInt7KC4qW14tLjAtOUEtWl9hLXpdKT99fWxke3soLmV4ZSk/fX0iCisvLyBDSEVDSy1BU0FOLUZSRUVCU0QtTk9UOiAiLWxjIgorLy8gQ0hFQ0stQVNBTi1GUkVFQlNEOiBmcmVlYnNke3svfFxcK319bGliY2xhbmdfcnQuYXNhbi1pMzg2LmEiCisvLyBDSEVDSy1BU0FOLUZSRUVCU0Q6ICItbHB0aHJlYWQiCisvLyBDSEVDSy1BU0FOLUZSRUVCU0Q6ICItbHJ0IgorLy8gQ0hFQ0stQVNBTi1GUkVFQlNEOiAiLWV4cG9ydC1keW5hbWljIgorLy8gQ0hFQ0stQVNBTi1GUkVFQlNELU5PVDogIi0tZHluYW1pYy1saXN0IgorCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC10YXJnZXQgaTM4Ni11bmtub3duLWZyZWVic2QgLWZzYW5pdGl6ZT1hZGRyZXNzIFwKKy8vIFJVTjogICAgIC1yZXNvdXJjZS1kaXI9JVMvSW5wdXRzL3Jlc291cmNlX2RpciBcCisvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2ZyZWVic2RfdHJlZSBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQVNBTi1GUkVFQlNELUxETCAlcworLy8KKy8vIENIRUNLLUFTQU4tRlJFRUJTRC1MREw6ICJ7eyguKlteLS4wLTlBLVpfYS16XSk/fX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stQVNBTi1GUkVFQlNELUxETC1OT1Q6ICItbGRsIgorCiAvLyBSVU46ICVjbGFuZ3h4IC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAogLy8gUlVOOiAgICAgLXRhcmdldCBpMzg2LXVua25vd24tbGludXggLWZzYW5pdGl6ZT1hZGRyZXNzIFwKIC8vIFJVTjogICAgIC1yZXNvdXJjZS1kaXI9JVMvSW5wdXRzL2VtcHR5X3Jlc291cmNlX2RpciBcCkBAIC00Miw2ICs5OSwyNCBAQAogLy8gQ0hFQ0stQVNBTi1MSU5VWC1DWFgtU1RBVElDOiBzdGRjKysKIAogLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtdGFyZ2V0IGFybS1saW51eC1nbnVlYWJpIC1mc2FuaXRpemU9YWRkcmVzcyBcCisvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2FuZHJvaWRfdHJlZS9zeXNyb290IFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1BU0FOLUFSTSAlcworLy8KKy8vIENIRUNLLUFTQU4tQVJNOiAie3soLipbXi4wLTlBLVpfYS16XSk/fX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stQVNBTi1BUk0tTk9UOiAiLWxjIgorLy8gQ0hFQ0stQVNBTi1BUk06IGxpYmNsYW5nX3J0LmFzYW4tYXJtLmEiCisvLworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtdGFyZ2V0IGFybXY3bC1saW51eC1nbnVlYWJpIC1mc2FuaXRpemU9YWRkcmVzcyBcCisvLyBSVU46ICAgICAtLXN5c3Jvb3Q9JVMvSW5wdXRzL2Jhc2ljX2FuZHJvaWRfdHJlZS9zeXNyb290IFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1BU0FOLUFSTXY3ICVzCisvLworLy8gQ0hFQ0stQVNBTi1BUk12NzogInt7KC4qW14uMC05QS1aX2Etel0pP319bGR7eyguZXhlKT99fSIKKy8vIENIRUNLLUFTQU4tQVJNdjctTk9UOiAiLWxjIgorLy8gQ0hFQ0stQVNBTi1BUk12NzogbGliY2xhbmdfcnQuYXNhbi1hcm0uYSIKKworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCiAvLyBSVU46ICAgICAtdGFyZ2V0IGFybS1saW51eC1hbmRyb2lkZWFiaSAtZnNhbml0aXplPWFkZHJlc3MgXAogLy8gUlVOOiAgICAgLS1zeXNyb290PSVTL0lucHV0cy9iYXNpY19hbmRyb2lkX3RyZWUvc3lzcm9vdCBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQVNBTi1BTkRST0lEICVzCkBAIC01MCw2ICsxMjUsOCBAQAogLy8gQ0hFQ0stQVNBTi1BTkRST0lELU5PVDogIi1sYyIKIC8vIENIRUNLLUFTQU4tQU5EUk9JRDogbGliY2xhbmdfcnQuYXNhbi1hcm0tYW5kcm9pZC5zbyIKIC8vIENIRUNLLUFTQU4tQU5EUk9JRC1OT1Q6ICItbHB0aHJlYWQiCisvLyBDSEVDSy1BU0FOLUFORFJPSUQ6ICItcGllIgorLy8gQ0hFQ0stQVNBTi1BTkRST0lELU5PVDogIi1scHRocmVhZCIKIC8vCiAvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKIC8vIFJVTjogICAgIC10YXJnZXQgYXJtLWxpbnV4LWFuZHJvaWRlYWJpIC1mc2FuaXRpemU9YWRkcmVzcyBcCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci9zdGFjay1wcm90ZWN0b3IuYyBiL3Rlc3QvRHJpdmVyL3N0YWNrLXByb3RlY3Rvci5jCmluZGV4IDJlYjBmNTMuLmU2MjEyYWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL3N0YWNrLXByb3RlY3Rvci5jCisrKyBiL3Rlc3QvRHJpdmVyL3N0YWNrLXByb3RlY3Rvci5jCkBAIC0xNSwzICsxNSwxMSBAQAogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGkzODYtcGMtb3BlbmJzZCAtZm5vLXN0YWNrLXByb3RlY3RvciAtIyMjICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1PUEVOQlNEX09GRgogLy8gT1BFTkJTRF9PRkYtTk9UOiAiLXN0YWNrLXByb3RlY3RvciIKKworLy8gUlVOOiAlY2xhbmcgLWZzdGFjay1wcm90ZWN0b3Itc3Ryb25nIC0jIyMgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVNTUC1TVFJPTkcKKy8vIFNTUC1TVFJPTkc6ICItc3RhY2stcHJvdGVjdG9yIiAiMiIKKy8vIFNTUC1TVFJPTkctTk9UOiAiLXN0YWNrLXByb3RlY3Rvci1idWZmZXItc2l6ZSIgCisKKy8vIFJVTjogJWNsYW5nIC1mc3RhY2stcHJvdGVjdG9yLWFsbCAtIyMjICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1TU1AtQUxMCisvLyBTU1AtQUxMOiAiLXN0YWNrLXByb3RlY3RvciIgIjMiCisvLyBTU1AtQUxMLU5PVDogIi1zdGFjay1wcm90ZWN0b3ItYnVmZmVyLXNpemUiIApkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvdGFyZ2V0LXRyaXBsZS1kZXBsb3ltZW50LmMgYi90ZXN0L0RyaXZlci90YXJnZXQtdHJpcGxlLWRlcGxveW1lbnQuYwppbmRleCA4ZTQ4MjRhLi40ZjVkZTU5IDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci90YXJnZXQtdHJpcGxlLWRlcGxveW1lbnQuYworKysgYi90ZXN0L0RyaXZlci90YXJnZXQtdHJpcGxlLWRlcGxveW1lbnQuYwpAQCAtNyw2ICs3LDggQEAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjctYXBwbGUtaW9zMC4wIC0jIyMgJXQubyAyPj4gJXQubG9nCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LWFwcGxlLWlvczEuMi4zIC0jIyMgJXQubyAyPj4gJXQubG9nCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LWFwcGxlLWlvczUuMCAtIyMjICV0Lm8gMj4+ICV0LmxvZworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12Ny1hcHBsZS1pb3M3LjAgLSMjIyAldC5vIDI+PiAldC5sb2cKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtNjQtYXBwbGUtaW9zIC0jIyMgJXQubyAyPj4gJXQubG9nCiAvLwogLy8gUlVOOiBGaWxlQ2hlY2sgJXMgPCAldC5sb2cKIApAQCAtMjEsMTMgKzIzLDE5IEBACiAvLyBDSEVDSzogMTAuNy4wCiAvLyBDSEVDSzoge3tsZCguZXhlKT8ifX0KIC8vIENIRUNLOiAtaXBob25lb3NfdmVyc2lvbl9taW4KLS8vIENIRUNLOiAzLjAuMAorLy8gQ0hFQ0s6IDUuMC4wCiAvLyBDSEVDSzoge3tsZCguZXhlKT8ifX0KIC8vIENIRUNLOiAtaXBob25lb3NfdmVyc2lvbl9taW4KLS8vIENIRUNLOiAzLjAuMAorLy8gQ0hFQ0s6IDUuMC4wCiAvLyBDSEVDSzoge3tsZCguZXhlKT8ifX0KIC8vIENIRUNLOiAtaXBob25lb3NfdmVyc2lvbl9taW4KIC8vIENIRUNLOiAxLjIuMwogLy8gQ0hFQ0s6IHt7bGQoLmV4ZSk/In19CiAvLyBDSEVDSzogLWlwaG9uZW9zX3ZlcnNpb25fbWluCiAvLyBDSEVDSzogNS4wLjAKKy8vIENIRUNLOiB7e2xkKC5leGUpPyJ9fQorLy8gQ0hFQ0s6IC1pcGhvbmVvc192ZXJzaW9uX21pbgorLy8gQ0hFQ0s6IDcuMC4wCisvLyBDSEVDSzoge3tsZCguZXhlKT8ifX0KKy8vIENIRUNLOiAtaXBob25lb3NfdmVyc2lvbl9taW4KKy8vIENIRUNLOiA3LjAuMApkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvdGFyZ2V0LmMgYi90ZXN0L0RyaXZlci90YXJnZXQuYwppbmRleCBiNDAwZjk5Li5hNDZiYTE2IDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci90YXJnZXQuYworKysgYi90ZXN0L0RyaXZlci90YXJnZXQuYwpAQCAtNCwxMiArNCw2IEBACiAvLyBFbnN1cmUgd2UgZ2V0IGEgY3JhenkgdHJpcGxlIGhlcmUgYXMgd2UgYXNrZWQgZm9yIG9uZS4KIC8vIENIRUNLOiBUYXJnZXQ6IHVua25vd24tdW5rbm93bi11bmtub3duCiAvLwotLy8gQWxzbywgZW5zdXJlIHdlIGRvbid0IGJsaW5kbHkgaGFuZCBvdXIgdGFyZ2V0IHNlbGVjdGlvbiBsb2dpYyBkb3duIHRvIEdDQy4KLS8vIENIRUNLOiAie3suKmdjYyhcLltFZV1bWHhdW0VlXSk/fX0iCi0vLyBDSEVDSy1OT1Q6ICItdGFyZ2V0IgotLy8gQ0hFQ0stTk9UOiAidW5rbm93bi11bmtub3duLXVua25vd24iCi0vLyBDSEVDSzogIi14IiAiYXNzZW1ibGVyIgotLy8KIC8vIEFsc28gY2hlY2sgdGhhdCB0aGUgbGVnYWN5IHNwZWxsaW5nIHdvcmtzLgogLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAtdGFyZ2V0IHVua25vd24tdW5rbm93bi11bmtub3duIC1jICVzIFwKIC8vIFJVTjogICAtbyAldC5vIC0jIyMgMj4mMSB8IEZpbGVDaGVjayAlcwpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvdW5rbm93bi1nY2MtYXJjaC5jIGIvdGVzdC9Ecml2ZXIvdW5rbm93bi1nY2MtYXJjaC5jCmluZGV4IGRjZDE3ZDQuLjYzMTdlMTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL3Vua25vd24tZ2NjLWFyY2guYworKysgYi90ZXN0L0RyaXZlci91bmtub3duLWdjYy1hcmNoLmMKQEAgLTEsMzIgKzEsNDAgQEAKLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LXVua25vd24tdW5rbm93biAtYyAteCBhc3NlbWJsZXIgJXMgLSMjIyAyPiYxIFwKLS8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVg4Nl82NCAlcwotLy8gWDg2XzY0OiB7ey4qZ2NjLiotbTY0fX0KKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LXVua25vd24tdW5rbm93biAtbm8taW50ZWdyYXRlZC1hcyAtYyBcCisvLyBSVU46IC14IGFzc2VtYmxlciAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1YODZfNjQgJXMKKy8vIFg4Nl82NDoge3suKmFzLiotLTY0fX0KIAotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtdW5rbm93bi11bmtub3duIC1jIC14IGFzc2VtYmxlciAlcyAtIyMjIC1tMzIgMj4mMSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1YODZfNjQtTTMyICVzCi0vLyBYODZfNjQtTTMyOiB7ey4qZ2NjLiotbTMyfX0KKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LXVua25vd24tdW5rbm93biAtYyAteCBhc3NlbWJsZXIgJXMgLSMjIyAtbTMyIFwKKy8vIFJVTjogLW5vLWludGVncmF0ZWQtYXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVg4Nl82NC1NMzIgJXMKKy8vIFg4Nl82NC1NMzI6IHt7Liphcy4qLS0zMn19CiAKLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgaTM4Ni11bmtub3duLXVua25vd24gLWMgLXggYXNzZW1ibGVyICVzIC0jIyMgMj4mMSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1JMzg2ICVzCi0vLyBJMzg2OiB7ey4qZ2NjLiotbTMyfX0KKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgaTM4Ni11bmtub3duLXVua25vd24gLWMgLXggYXNzZW1ibGVyICVzIC0jIyMgXAorLy8gUlVOOiAtbm8taW50ZWdyYXRlZC1hcyAyPiYxfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1JMzg2ICVzCisvLyBJMzg2OiB7ey4qYXMuKi0tMzJ9fQogCi0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGkzODYtdW5rbm93bi11bmtub3duIC1jIC14IGFzc2VtYmxlciAlcyAtIyMjIC1tNjQgMj4mMSBcCi0vLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1JMzg2LU02NCAlcwotLy8gSTM4Ni1NNjQ6IHt7LipnY2MuKi1tNjR9fQorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpMzg2LXVua25vd24tdW5rbm93biAtYyAteCBhc3NlbWJsZXIgJXMgLSMjIyAtbTY0IFwKKy8vIFJVTjogLW5vLWludGVncmF0ZWQtYXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUkzODYtTTY0ICVzCisvLyBJMzg2LU02NDoge3suKmFzLiotLTY0fX0KIAogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHBvd2VycGM2NC11bmtub3duLXVua25vd24gLWMgLXggYXNzZW1ibGVyICVzIC0jIyMgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1QUEM2NCAlcwotLy8gUFBDNjQ6IHt7LipnY2MuKi1tNjR9fQorLy8gUFBDNjQ6IHt7Liphcy4qLWE2NH19CiAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgcG93ZXJwYzY0LXVua25vd24tdW5rbm93biAtYyAteCBhc3NlbWJsZXIgJXMgLSMjIyAtbTMyIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9UFBDNjQtTTMyICVzCi0vLyBQUEM2NC1NMzI6IHt7LipnY2MuKi1tMzJ9fQorLy8gUFBDNjQtTTMyOiB7ey4qYXMuKi1hMzJ9fQogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHBvd2VycGMtdW5rbm93bi11bmtub3duIC1jIC14IGFzc2VtYmxlciAlcyAtIyMjIDI+JjEgXAogLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9UFBDICVzCi0vLyBQUEM6IHt7LipnY2MuKi1tMzJ9fQorLy8gUFBDOiB7ey4qYXMuKi1hMzJ9fQogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHBvd2VycGMtdW5rbm93bi11bmtub3duIC1jIC14IGFzc2VtYmxlciAlcyAtIyMjIC1tNjQgMj4mMSBcCiAvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1QUEMtTTY0ICVzCi0vLyBQUEMtTTY0OiB7ey4qZ2NjLiotbTY0fX0KKy8vIFBQQy1NNjQ6IHt7Liphcy4qLWE2NH19CisKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgc3BhcmM2NC11bmtub3duLXVua25vd24gLW5vLWludGVncmF0ZWQtYXMgLWMgLXggYXNzZW1ibGVyICVzIC0jIyMgLW0zMiAyPiYxIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVNQQVJDVjggJXMKKy8vIFNQQVJDVjg6IHt7Liphcy4qLTMyfX0KKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBzcGFyYy11bmtub3duLXVua25vd24gLW5vLWludGVncmF0ZWQtYXMgLWMgLXggYXNzZW1ibGVyICVzIC0jIyMgLW02NCAyPiYxIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVNQQVJDVjkgJXMKKy8vIFNQQVJDVjk6IHt7Liphcy4qLTY0fX0KZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL3ZlcmlmeV9wY2gubSBiL3Rlc3QvRHJpdmVyL3ZlcmlmeV9wY2gubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmVjYTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Ecml2ZXIvdmVyaWZ5X3BjaC5tCkBAIC0wLDAgKzEsMTIgQEAKKy8vIFJVTjogdG91Y2ggJXQucGNoCisvLyBSVU46ICVjbGFuZyAtIyMjIC12ZXJpZnktcGNoICV0LnBjaCAyPiAldC5sb2cuMQorLy8gUlVOOiBGaWxlQ2hlY2sgJXMgPCAldC5sb2cuMQorLy8gQ0hFQ0s6IC12ZXJpZnktcGNoCisKKy8vIEFsc28gZW5zdXJlIHRoYXQgdGhlIGxhbmd1YWdlIHNldHRpbmcgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSAucGNoIGV4dGVuc2lvbgorLy8gQ0hFQ0stTk9UOiAiLXgiICJwcmVjb21waWxlZC1oZWFkZXIiCisKKy8vIFJVTjogJWNsYW5nIC0jIyMgLXZlcmlmeS1wY2ggLXggb2JqZWN0aXZlLWMgJXQucGNoIDI+ICV0LmxvZy4yCisvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLMiAlcyA8ICV0LmxvZy4yCisvLyBDSEVDSzI6ICIteCIgIm9iamVjdGl2ZS1jIgorLy8gQ0hFQ0syLU5PVDogIi14IiAicHJlY29tcGlsZWQtaGVhZGVyIgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvdmZzb3ZlcmxheS5jIGIvdGVzdC9Ecml2ZXIvdmZzb3ZlcmxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTQ5NDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0RyaXZlci92ZnNvdmVybGF5LmMKQEAgLTAsMCArMSw1IEBACisvLyBSVU46ICVjbGFuZyAtaXZmc292ZXJsYXkgZm9vLmggLSMjIyAlcyAyPiYxIHwgRmlsZUNoZWNrICVzCisvLyBDSEVDSzogIi1pdmZzb3ZlcmxheSIgImZvby5oIgorCisvLyBSVU46IG5vdCAlY2xhbmcgLWl2ZnNvdmVybGF5IGZvby5oICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1NSVNTSU5HICVzCisvLyBDSEVDSy1NSVNTSU5HOiB2aXJ0dWFsIGZpbGVzeXN0ZW0gb3ZlcmxheSBmaWxlICdmb28uaCcgbm90IGZvdW5kCmRpZmYgLS1naXQgYS90ZXN0L0RyaXZlci92aWEtZmlsZS1hc20uYyBiL3Rlc3QvRHJpdmVyL3ZpYS1maWxlLWFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTViNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0RyaXZlci92aWEtZmlsZS1hc20uYwpAQCAtMCwwICsxLDEwIEBACisvLyBTaG91bGQgc2F2ZSBhbmQgcmVhZCBiYWNrIHRoZSBhc3NlbWJseSBmcm9tIGEgZmlsZQorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbm9uZS1saW51eC1nbnVlYWJpIC1pbnRlZ3JhdGVkLWFzIC12aWEtZmlsZS1hc20gJXMgLSMjIyAyPiYxIHwgRmlsZUNoZWNrICVzCisvLyBDSEVDSzogIi1jYzEiCisvLyBDSEVDSzogIi1vIiAiW1tUTVA6W14iXSpdXSIKKy8vIENIRUNLOiAtY2MxYXMKKy8vIENIRUNLOiBbW1RNUF1dCisKKy8vIFNob3VsZCBub3QgZm9yY2UgdXNpbmcgdGhlIGludGVncmF0ZWQgYXNzZW1ibGVyCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1ub25lLWxpbnV4LWdudWVhYmkgLW5vLWludGVncmF0ZWQtYXMgLXZpYS1maWxlLWFzbSAlcyAtIyMjIDI+JjEgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Tk9fSUFTICVzCisvLyBOT19JQVMtTk9UOiAiLWNjMWFzIgpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIvdmlzaWJpbGl0eS5jcHAgYi90ZXN0L0RyaXZlci92aXNpYmlsaXR5LmNwcAppbmRleCBjZGJlZjk3Li41YjEzN2M4IDEwMDY0NAotLS0gYS90ZXN0L0RyaXZlci92aXNpYmlsaXR5LmNwcAorKysgYi90ZXN0L0RyaXZlci92aXNpYmlsaXR5LmNwcApAQCAtMSwyNiArMSwyNiBAQAogLy8gUlVOOiAlY2xhbmcgLSMjIyAtUyAtZnZpc2liaWxpdHk9aGlkZGVuIC1mdmlzaWJpbGl0eT1kZWZhdWx0ICVzIDI+ICV0LmxvZwogLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy0xICVzIDwgJXQubG9nCi0vLyBDSEVDSy1OT1Q6ICItZnR5cGUtdmlzaWJpbGl0eSIKKy8vIENIRUNLLTEtTk9UOiAiLWZ0eXBlLXZpc2liaWxpdHkiCiAvLyBDSEVDSy0xOiAiLWZ2aXNpYmlsaXR5IiAiZGVmYXVsdCIKLS8vIENIRUNLLU5PVDogIi1mdHlwZS12aXNpYmlsaXR5IgorLy8gQ0hFQ0stMS1OT1Q6ICItZnR5cGUtdmlzaWJpbGl0eSIKIAogLy8gUlVOOiAlY2xhbmcgLSMjIyAtUyAtZnZpc2liaWxpdHk9ZGVmYXVsdCAtZnZpc2liaWxpdHk9aGlkZGVuICVzIDI+ICV0LmxvZwogLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy0yICVzIDwgJXQubG9nCi0vLyBDSEVDSy1OT1Q6ICItZnR5cGUtdmlzaWJpbGl0eSIKKy8vIENIRUNLLTItTk9UOiAiLWZ0eXBlLXZpc2liaWxpdHkiCiAvLyBDSEVDSy0yOiAiLWZ2aXNpYmlsaXR5IiAiaGlkZGVuIgotLy8gQ0hFQ0stTk9UOiAiLWZ0eXBlLXZpc2liaWxpdHkiCisvLyBDSEVDSy0yLU5PVDogIi1mdHlwZS12aXNpYmlsaXR5IgogCiAvLyBSVU46ICVjbGFuZyAtIyMjIC1TIC1mdmlzaWJpbGl0eS1tcy1jb21wYXQgLWZ2aXNpYmlsaXR5PWhpZGRlbiAlcyAyPiAldC5sb2cKIC8vIFJVTjogRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stMyAlcyA8ICV0LmxvZwotLy8gQ0hFQ0stTk9UOiAiLWZ0eXBlLXZpc2liaWxpdHkiCisvLyBDSEVDSy0zLU5PVDogIi1mdHlwZS12aXNpYmlsaXR5IgogLy8gQ0hFQ0stMzogIi1mdmlzaWJpbGl0eSIgImhpZGRlbiIKLS8vIENIRUNLLU5PVDogIi1mdHlwZS12aXNpYmlsaXR5IgorLy8gQ0hFQ0stMy1OT1Q6ICItZnR5cGUtdmlzaWJpbGl0eSIKIAogLy8gUlVOOiAlY2xhbmcgLSMjIyAtUyAtZnZpc2liaWxpdHktbXMtY29tcGF0IC1mdmlzaWJpbGl0eT1kZWZhdWx0ICVzIDI+ICV0LmxvZwogLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy00ICVzIDwgJXQubG9nCi0vLyBDSEVDSy1OT1Q6ICItZnR5cGUtdmlzaWJpbGl0eSIKKy8vIENIRUNLLTQtTk9UOiAiLWZ0eXBlLXZpc2liaWxpdHkiCiAvLyBDSEVDSy00OiAiLWZ2aXNpYmlsaXR5IiAiZGVmYXVsdCIKLS8vIENIRUNLLU5PVDogIi1mdHlwZS12aXNpYmlsaXR5IgorLy8gQ0hFQ0stNC1OT1Q6ICItZnR5cGUtdmlzaWJpbGl0eSIKIAogLy8gUlVOOiAlY2xhbmcgLSMjIyAtUyAtZnZpc2liaWxpdHk9aGlkZGVuIC1mdmlzaWJpbGl0eS1tcy1jb21wYXQgJXMgMj4gJXQubG9nCiAvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLTUgJXMgPCAldC5sb2cKZGlmZiAtLWdpdCBhL3Rlc3QvRHJpdmVyL3g4Nl9tMTYuYyBiL3Rlc3QvRHJpdmVyL3g4Nl9tMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTE1ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Ecml2ZXIveDg2X20xNi5jCkBAIC0wLDAgKzEsNCBAQAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpMzg2IC1tMTYgLSMjIyAtYyAlcyAyPiYxIHwgRmlsZUNoZWNrICVzCisKKy8vIENIRUNLOiBUYXJnZXQ6IGkzODYte3suKn19LXt7Lip9fS1jb2RlMTYKKwpkaWZmIC0tZ2l0IGEvdGVzdC9Ecml2ZXIveGNvcmUtb3B0cy5jIGIvdGVzdC9Ecml2ZXIveGNvcmUtb3B0cy5jCmluZGV4IDEwZDhkYTEuLjFmYTllZTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvRHJpdmVyL3hjb3JlLW9wdHMuYworKysgYi90ZXN0L0RyaXZlci94Y29yZS1vcHRzLmMKQEAgLTEsMTMgKzEsMjkgQEAKLS8vIFJVTjogJWNsYW5nIC10YXJnZXQgeGNvcmUgJXMgLWcgLVdsLEwxQXJnLEwyQXJnIC1XYSxBMUFyZyxBMkFyZyAtIyMjIC1vICV0Lm8gMj4mMSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4Y29yZSAlcyAtZyAtV2wsTDFBcmcsTDJBcmcgLVdhLEExQXJnLEEyQXJnIC1mdmVyYm9zZS1hc20gLXYgLSMjIyAtbyAldC5vIDI+JjEgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeGNvcmUgLXggYysrICVzIC1nIC1XbCxMMUFyZyxMMkFyZyAtV2EsQTFBcmcsQTJBcmcgLWZ2ZXJib3NlLWFzbSAtdiAtIyMjIC1vICV0Lm8gMj4mMSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4Y29yZSAteCBjKysgJXMgLWZleGNlcHRpb25zIC0jIyMgLW8gJXQubyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stRVhDRVAgJXMKIAogLy8gQ0hFQ0s6ICItbm9zdGRzeXN0ZW1pbmMiCiAvLyBDSEVDSzogIi1tb21pdC1sZWFmLWZyYW1lLXBvaW50ZXIiCiAvLyBDSEVDSy1OT1Q6ICItbWRpc2FibGUtZnAtZWxpbSIKIC8vIENIRUNLOiAiLWZuby1zaWduZWQtY2hhciIKIC8vIENIRUNLOiAiLWZuby11c2UtY3hhLWF0ZXhpdCIKKy8vIENIRUNLLU5PVDogIi1mY3h4LWV4Y2VwdGlvbnMiCisvLyBDSEVDSy1OT1Q6ICItZmV4Y2VwdGlvbnMiCiAvLyBDSEVDSzogIi1mbm8tY29tbW9uIgotLy8gQ0hFQ0g6IHhjYyIgIi1vIgotLy8gQ0hFQ0s6ICItYyIgIi1nIiAiQTFBcmciICJBMkFyZyIKIC8vIENIRUNLOiB4Y2MiICItbyIKKy8vIENIRUNLLUVYQ0VQLU5PVDogIi1mZXhjZXB0aW9ucyIKKy8vIENIRUNLOiAiLWMiICItdiIgIi1nIiAiLWZ2ZXJib3NlLWFzbSIgIkExQXJnIiAiQTJBcmciCisvLyBDSEVDSzogeGNjIiAiLW8iCisvLyBDSEVDSy1FWENFUC1OT1Q6ICItZmV4Y2VwdGlvbnMiCisvLyBDSEVDSzogIi12IgogLy8gQ0hFQ0s6ICJMMUFyZyIgIkwyQXJnIgogCisvLyBDSEVDSy1FWENFUDogIi1mbm8tdXNlLWN4YS1hdGV4aXQiCisvLyBDSEVDSy1FWENFUDogIi1mY3h4LWV4Y2VwdGlvbnMiCisvLyBDSEVDSy1FWENFUDogIi1mZXhjZXB0aW9ucyIKKy8vIENIRUNLLUVYQ0VQOiAiLWZuby1jb21tb24iCisvLyBDSEVDSy1FWENFUDogeGNjIiAiLW8iCisvLyBDSEVDSy1FWENFUC1OT1Q6ICItZmV4Y2VwdGlvbnMiCisvLyBDSEVDSy1FWENFUDogeGNjIiAiLW8iCisvLyBDSEVDSy1FWENFUDogIi1mZXhjZXB0aW9ucyIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9GaXhJdC9maXhpdC1pbmNsdWRlLmggYi90ZXN0L0ZpeEl0L2ZpeGl0LWluY2x1ZGUuaAppbmRleCA2YTIyZDJlLi4zNTg2MDliIDEwMDY0NAotLS0gYS90ZXN0L0ZpeEl0L2ZpeGl0LWluY2x1ZGUuaAorKysgYi90ZXN0L0ZpeEl0L2ZpeGl0LWluY2x1ZGUuaApAQCAtMSArMSBAQAotLy8gVGhpcyBmaWxlIGlzIHB1cnBvc2VmdWxseSBsZWZ0IGVtcHR5DQorLy8gVGhpcyBmaWxlIGlzIHB1cnBvc2VmdWxseSBsZWZ0IGVtcHR5CmRpZmYgLS1naXQgYS90ZXN0L0ZpeEl0L2ZpeGl0LW9iamMtYXJjLm0gYi90ZXN0L0ZpeEl0L2ZpeGl0LW9iamMtYXJjLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlZTgxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRml4SXQvZml4aXQtb2JqYy1hcmMubQpAQCAtMCwwICsxLDI0IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXBlZGFudGljIC12ZXJpZnkgJXMKKy8vIFJVTjogY3AgJXMgJXQKKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgLXBlZGFudGljIC1mb2JqYy1hcmMgLWZpeGl0IC14IG9iamVjdGl2ZS1jICV0CisvLyBSVU46ICVjbGFuZ19jYzEgLXBlZGFudGljIC1mb2JqYy1hcmMgLVdlcnJvciAteCBvYmplY3RpdmUtYyAldAorLy8gcmRhcjovLzE0MTA2MDgzCisKK0BjbGFzcyBBOworQGNsYXNzIE5TU3RyaW5nOworCitAaW50ZXJmYWNlIFRlc3QKKy0gKHZvaWQpdGVzdDooTlNTdHJpbmcgKilzdHJpbmc7CisKK0Bwcm9wZXJ0eSAoY29weSkgTlNTdHJpbmcgKnByb3BlcnR5OworQGVuZAorCit2b2lkIGcoTlNTdHJpbmcgKmEpOwordm9pZCBoKGlkIGEpOworCit2b2lkIGYoVGVzdCAqdCkgeworICBOU1N0cmluZyAqYSA9ICJGb28iOyAvLyBleHBlY3RlZC1lcnJvciB7e3N0cmluZyBsaXRlcmFsIG11c3QgYmUgcHJlZml4ZWQgYnkgJ0AnfX0KKyAgZygiRm9vIik7IC8vIGV4cGVjdGVkLWVycm9yIHt7c3RyaW5nIGxpdGVyYWwgbXVzdCBiZSBwcmVmaXhlZCBieSAnQCd9fQorICBbdCB0ZXN0OiJGb28iXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tzdHJpbmcgbGl0ZXJhbCBtdXN0IGJlIHByZWZpeGVkIGJ5ICdAJ319CisgIHQucHJvcGVydHkgPSAiRm9vIjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tzdHJpbmcgbGl0ZXJhbCBtdXN0IGJlIHByZWZpeGVkIGJ5ICdAJ319Cit9CmRpZmYgLS1naXQgYS90ZXN0L0ZpeEl0L2ZpeGl0LW9iamMtYnJpZGdlLXJlbGF0ZWQtYXR0ci5tIGIvdGVzdC9GaXhJdC9maXhpdC1vYmpjLWJyaWRnZS1yZWxhdGVkLWF0dHIubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTgxZWNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9GaXhJdC9maXhpdC1vYmpjLWJyaWRnZS1yZWxhdGVkLWF0dHIubQpAQCAtMCwwICsxLDM1IEBACisvLyBPYmplY3RpdmUtQyByZWNvdmVyeQorLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgIC1mZGlhZ25vc3RpY3MtcGFyc2VhYmxlLWZpeGl0cyAteCBvYmplY3RpdmUtYyAlcyAyPiYxICB8IEZpbGVDaGVjayAlcworLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgIC1mb2JqYy1hcmMgLWZkaWFnbm9zdGljcy1wYXJzZWFibGUtZml4aXRzIC14IG9iamVjdGl2ZS1jICVzIDI+JjEgIHwgRmlsZUNoZWNrICVzCisvLyBSVU46IG5vdCAlY2xhbmdfY2MxICAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAgLWZkaWFnbm9zdGljcy1wYXJzZWFibGUtZml4aXRzIC14IG9iamVjdGl2ZS1jKysgJXMgMj4mMSAgfCBGaWxlQ2hlY2sgJXMKKy8vIHJkYXI6Ly8xNTQ5OTExMQorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZV9yZWxhdGVkKE5TQ29sb3IsY29sb3JXaXRoQ0dDb2xvcjosQ0dDb2xvcikpKSBDR0NvbG9yICpDR0NvbG9yUmVmOworCitAaW50ZXJmYWNlIE5TQ29sb3IKKysgKE5TQ29sb3IgKiljb2xvcldpdGhDR0NvbG9yOihDR0NvbG9yUmVmKWNnQ29sb3I7CistIChDR0NvbG9yUmVmKUNHQ29sb3I7CitAZW5kCisKK0BpbnRlcmZhY2UgTlNUZXh0RmllbGQKKy0gKHZvaWQpc2V0QmFja2dyb3VuZENvbG9yOihOU0NvbG9yICopY29sb3I7CistIChOU0NvbG9yICopYmFja2dyb3VuZENvbG9yOworQGVuZAorCitOU0NvbG9yICogVGVzdDEoTlNUZXh0RmllbGQgKnRleHRGaWVsZCwgQ0dDb2xvclJlZiBuZXdDb2xvcikgeworIHRleHRGaWVsZC5iYWNrZ3JvdW5kQ29sb3IgPSBuZXdDb2xvcjsKKyByZXR1cm4gbmV3Q29sb3I7Cit9CisKK0NHQ29sb3JSZWYgVGVzdDIoTlNUZXh0RmllbGQgKnRleHRGaWVsZCwgQ0dDb2xvclJlZiBuZXdDb2xvcikgeworIG5ld0NvbG9yID0gdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvcjsgLy8gW3RleHRGaWVsZC5iYWNrZ3JvdW5kQ29sb3IgQ0dDb2xvcl0KKyByZXR1cm4gdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvcjsKK30KKy8vIENIRUNLOiB7MjA6MzAtMjA6MzB9OiJbTlNDb2xvciBjb2xvcldpdGhDR0NvbG9yOiIKKy8vIENIRUNLOiB7MjA6MzgtMjA6Mzh9OiJdIgorLy8gQ0hFQ0s6IHsyMTo5LTIxOjl9OiJbTlNDb2xvciBjb2xvcldpdGhDR0NvbG9yOiIKKy8vIENIRUNLOiB7MjE6MTctMjE6MTd9OiJdIgorLy8gQ0hFQ0s6IHsyNToxMy0yNToxM306IlsiCisvLyBDSEVDSzogezI1OjM4LTI1OjM4fToiIENHQ29sb3JdIgorLy8gQ0hFQ0s6IHsyNjo5LTI2Ojl9OiJbIgorLy8gQ0hFQ0s6IHsyNjozNC0yNjozNH06IiBDR0NvbG9yXSIKZGlmZiAtLWdpdCBhL3Rlc3QvRml4SXQvZml4aXQtb2JqYy1icmlkZ2UtcmVsYXRlZC1wcm9wZXJ0eS5tIGIvdGVzdC9GaXhJdC9maXhpdC1vYmpjLWJyaWRnZS1yZWxhdGVkLXByb3BlcnR5Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxMzY0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRml4SXQvZml4aXQtb2JqYy1icmlkZ2UtcmVsYXRlZC1wcm9wZXJ0eS5tCkBAIC0wLDAgKzEsMjMgQEAKKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwICAtZmRpYWdub3N0aWNzLXBhcnNlYWJsZS1maXhpdHMgLXggb2JqZWN0aXZlLWMgJXMgMj4mMSAgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwICAtZm9iamMtYXJjIC1mZGlhZ25vc3RpY3MtcGFyc2VhYmxlLWZpeGl0cyAteCBvYmplY3RpdmUtYyAlcyAyPiYxICB8IEZpbGVDaGVjayAlcworLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgIC1mZGlhZ25vc3RpY3MtcGFyc2VhYmxlLWZpeGl0cyAteCBvYmplY3RpdmUtYysrICVzIDI+JjEgIHwgRmlsZUNoZWNrICVzCisvLyByZGFyOi8vMTU1MTc4OTkKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2VfcmVsYXRlZChOU0NvbG9yLGNvbG9yV2l0aENHQ29sb3I6LENHQ29sb3IpKSkgQ0dDb2xvciAqQ0dDb2xvclJlZjsKKworQGludGVyZmFjZSBOU0NvbG9yCisrIChOU0NvbG9yICopY29sb3JXaXRoQ0dDb2xvcjooQ0dDb2xvclJlZiljZ0NvbG9yOworQHByb3BlcnR5IENHQ29sb3JSZWYgQ0dDb2xvcjsKK0BlbmQKKworQGludGVyZmFjZSBOU1RleHRGaWVsZAorLSAodm9pZClzZXRCYWNrZ3JvdW5kQ29sb3I6KE5TQ29sb3IgKiljb2xvcjsKKy0gKE5TQ29sb3IgKiliYWNrZ3JvdW5kQ29sb3I7CitAZW5kCisKK0NHQ29sb3JSZWYgVGVzdChOU1RleHRGaWVsZCAqdGV4dEZpZWxkLCBDR0NvbG9yUmVmIG5ld0NvbG9yKSB7CisgbmV3Q29sb3IgPSB0ZXh0RmllbGQuYmFja2dyb3VuZENvbG9yOworIHJldHVybiB0ZXh0RmllbGQuYmFja2dyb3VuZENvbG9yOworfQorLy8gQ0hFQ0s6ezE5OjM4LTE5OjM4fToiLkNHQ29sb3IiCisvLyBDSEVDSzp7MjA6MzQtMjA6MzR9OiIuQ0dDb2xvciIKZGlmZiAtLWdpdCBhL3Rlc3QvRml4SXQvZml4aXQtb2JqYy5tIGIvdGVzdC9GaXhJdC9maXhpdC1vYmpjLm0KaW5kZXggN2M0Nzc2YS4uZjQxZjc1ZiAxMDA2NDQKLS0tIGEvdGVzdC9GaXhJdC9maXhpdC1vYmpjLm0KKysrIGIvdGVzdC9GaXhJdC9maXhpdC1vYmpjLm0KQEAgLTE4LDIyICsxOCwyMiBAQAogQGNsYXNzIE5TU3RyaW5nOwogCiBAaW50ZXJmYWNlIFRlc3QKLS0gKHZvaWQpdGVzdDooTlNTdHJpbmcgKilzdHJpbmc7IC8vIGV4cGVjdGVkLW5vdGV7e3Bhc3NpbmcgYXJndW1lbnQgdG8gcGFyYW1ldGVyICdzdHJpbmcnIGhlcmV9fQorLSAodm9pZCl0ZXN0OihOU1N0cmluZyAqKXN0cmluZzsKIAogQHByb3BlcnR5IChjb3B5KSBOU1N0cmluZyAqcHJvcGVydHk7CiBAZW5kCiAKLXZvaWQgZyhOU1N0cmluZyAqYSk7IC8vIGV4cGVjdGVkLW5vdGV7e3Bhc3NpbmcgYXJndW1lbnQgdG8gcGFyYW1ldGVyICdhJyBoZXJlfX0KLXZvaWQgaChpZCBhKTsgLy8gZXhwZWN0ZWQtbm90ZSAye3twYXNzaW5nIGFyZ3VtZW50IHRvIHBhcmFtZXRlciAnYScgaGVyZX19Cit2b2lkIGcoTlNTdHJpbmcgKmEpOwordm9pZCBoKGlkIGEpOwogCiB2b2lkIGYoVGVzdCAqdCkgewotICBOU1N0cmluZyAqYSA9ICJGb28iOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7c3RyaW5nIGxpdGVyYWwgbXVzdCBiZSBwcmVmaXhlZCBieSAnQCd9fQotICBpZCBiID0gIkZvbyI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcyBpbml0aWFsaXppbmcgJ2lkJyB3aXRoIGFuIGV4cHJlc3Npb24gb2YgdHlwZSAnY2hhciBbNF0nfX0KLSAgZygiRm9vIik7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tzdHJpbmcgbGl0ZXJhbCBtdXN0IGJlIHByZWZpeGVkIGJ5ICdAJ319Ci0gIGgoIkZvbyIpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcyBwYXNzaW5nICdjaGFyIFs0XScgdG8gcGFyYW1ldGVyIG9mIHR5cGUgJ2lkJ319Ci0gIGgoKCJGb28iKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2luY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzIHBhc3NpbmcgJ2NoYXIgWzRdJyB0byBwYXJhbWV0ZXIgb2YgdHlwZSAnaWQnfX0KLSAgW3QgdGVzdDoiRm9vIl07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tzdHJpbmcgbGl0ZXJhbCBtdXN0IGJlIHByZWZpeGVkIGJ5ICdAJ319Ci0gIHQucHJvcGVydHkgPSAiRm9vIjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3N0cmluZyBsaXRlcmFsIG11c3QgYmUgcHJlZml4ZWQgYnkgJ0AnfX0KKyAgTlNTdHJpbmcgKmEgPSAiRm9vIjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tzdHJpbmcgbGl0ZXJhbCBtdXN0IGJlIHByZWZpeGVkIGJ5ICdAJ319CisgIGlkIGIgPSAiRm9vIjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tzdHJpbmcgbGl0ZXJhbCBtdXN0IGJlIHByZWZpeGVkIGJ5ICdAJ319CisgIGcoIkZvbyIpOyAvLyBleHBlY3RlZC1lcnJvciB7e3N0cmluZyBsaXRlcmFsIG11c3QgYmUgcHJlZml4ZWQgYnkgJ0AnfX0KKyAgaCgiRm9vIik7IC8vIGV4cGVjdGVkLWVycm9yIHt7c3RyaW5nIGxpdGVyYWwgbXVzdCBiZSBwcmVmaXhlZCBieSAnQCd9fQorICBoKCgiRm9vIikpOyAvLyBleHBlY3RlZC1lcnJvciB7e3N0cmluZyBsaXRlcmFsIG11c3QgYmUgcHJlZml4ZWQgYnkgJ0AnfX0KKyAgW3QgdGVzdDoiRm9vIl07IC8vIGV4cGVjdGVkLWVycm9yIHt7c3RyaW5nIGxpdGVyYWwgbXVzdCBiZSBwcmVmaXhlZCBieSAnQCd9fQorICB0LnByb3BlcnR5ID0gIkZvbyI7IC8vIGV4cGVjdGVkLWVycm9yIHt7c3RyaW5nIGxpdGVyYWwgbXVzdCBiZSBwcmVmaXhlZCBieSAnQCd9fQogCiAgIC8vIDxyZGFyOi8vcHJvYmxlbS82ODk2NDkzPgogICBbdCB0ZXN0OkAiRm9vIl1dOyAvLyBleHBlY3RlZC1lcnJvcnt7ZXh0cmFuZW91cyAnXScgYmVmb3JlICc7J319CmRpZmYgLS1naXQgYS90ZXN0L0ZpeEl0L2ZpeGl0LXVuaWNvZGUtd2l0aC11dGY4LW91dHB1dC5jIGIvdGVzdC9GaXhJdC9maXhpdC11bmljb2RlLXdpdGgtdXRmOC1vdXRwdXQuYwppbmRleCBhZmY4NTQyLi5hMWE3YmI3IDEwMDY0NAotLS0gYS90ZXN0L0ZpeEl0L2ZpeGl0LXVuaWNvZGUtd2l0aC11dGY4LW91dHB1dC5jCisrKyBiL3Rlc3QvRml4SXQvZml4aXQtdW5pY29kZS13aXRoLXV0Zjgtb3V0cHV0LmMKQEAgLTIsNiArMiw3IEBACiAvLyBzeXN0ZW1zIGNhcGFibGUgb2Ygb3V0cHV0dGluZyBVbmljb2RlIGNoYXJhY3RlcnMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBpbgogLy8gdGhlIFVURi04IGVuY29kaW5nLgogLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5ICVTL2ZpeGl0LXVuaWNvZGUuYyAyPiYxIHwgRmlsZUNoZWNrIC1zdHJpY3Qtd2hpdGVzcGFjZSAlcworLy8gUkVRVUlSRVM6IHV0ZjgtY2FwYWJsZS10ZXJtaW5hbAogCiAvLyBDSEVDSzogd2FybmluZzogZm9ybWF0IHNwZWNpZmllcyB0eXBlICdpbnQnIGJ1dCB0aGUgYXJndW1lbnQgaGFzIHR5cGUgJ2xvbmcnCiAvLyBDSEVDSzoge3teICBwcmludGZcKCLiiIY6ICVkIiwgMUxcKTt9fQpkaWZmIC0tZ2l0IGEvdGVzdC9GaXhJdC9uby1kaWFnbm9zdGljcy1maXhpdC1pbmZvLmMgYi90ZXN0L0ZpeEl0L25vLWRpYWdub3N0aWNzLWZpeGl0LWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njk2YTJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9GaXhJdC9uby1kaWFnbm9zdGljcy1maXhpdC1pbmZvLmMKQEAgLTAsMCArMSwxNiBAQAorLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9V0lUSC1GSVhJVCAlcworLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtZm5vLWRpYWdub3N0aWNzLWZpeGl0LWluZm8gJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVdJVEhPVVQtRklYSVQgJXMKKworc3RydWN0IEZvbyB7CisgIGludCB4OworfQorLy8gV0lUSC1GSVhJVDogZXJyb3I6IGV4cGVjdGVkICc7JyBhZnRlciBzdHJ1Y3QKKy8vIFdJVEgtRklYSVQtTkVYVDogfQorLy8gV0lUSC1GSVhJVC1ORVhUOiAgXgorLy8gV0lUSC1GSVhJVC1ORVhUOiAgOworCisvLyBXSVRIT1VULUZJWElUOiBlcnJvcjogZXhwZWN0ZWQgJzsnIGFmdGVyIHN0cnVjdAorLy8gV0lUSE9VVC1GSVhJVC1ORVhUOiB9CisvLyBXSVRIT1VULUZJWElULU5FWFQ6IF4KKy8vIFdJVEhPVVQtRklYSVQtTk9UOiA7CisKZGlmZiAtLWdpdCBhL3Rlc3QvRml4SXQvdHlwby1sb2NhdGlvbi1idWdzLmNwcCBiL3Rlc3QvRml4SXQvdHlwby1sb2NhdGlvbi1idWdzLmNwcAppbmRleCA5YzM0YTkxLi5lNDQ2NjRkIDEwMDY0NAotLS0gYS90ZXN0L0ZpeEl0L3R5cG8tbG9jYXRpb24tYnVncy5jcHAKKysrIGIvdGVzdC9GaXhJdC90eXBvLWxvY2F0aW9uLWJ1Z3MuY3BwCkBAIC0xOSwzICsxOSwxOCBAQAogICBwYi0+ZigpOyAvLyBleHBlY3RlZC1lcnJvcnt7dG9vIGZldyBhcmd1bWVudHMgdG8gZnVuY3Rpb24gY2FsbCwgZXhwZWN0ZWQgMSwgaGF2ZSAwOyBkaWQgeW91IG1lYW4gJ0E6OmYnP319CiB9CiB9CisKK25hbWVzcGFjZSBQUjE4NjA4IHsKK3N0cnVjdCBBIHsKK3ZpcnR1YWwgdm9pZCBmKCkgY29uc3Q7Cit2aXJ0dWFsIHZvaWQgZihpbnQgeCkgY29uc3Q7ICAvLyBleHBlY3RlZC1ub3Rle3snQTo6ZicgZGVjbGFyZWQgaGVyZX19Cit9OworCitzdHJ1Y3QgQiA6IHB1YmxpYyBBIHsKK3ZpcnR1YWwgdm9pZCBmKCkgY29uc3Q7Cit9OworCit2b2lkIHRlc3QoQiBiKSB7CisgIGIuZigxKTsgIC8vIGV4cGVjdGVkLWVycm9ye3t0b28gbWFueSBhcmd1bWVudHMgdG8gZnVuY3Rpb24gY2FsbCwgZXhwZWN0ZWQgMCwgaGF2ZSAxOyBkaWQgeW91IG1lYW4gJ0E6OmYnP319Cit9Cit9CmRpZmYgLS1naXQgYS90ZXN0L0Zvcm1hdC9sYW5ndWFnZS1kZXRlY3Rpb24uY3BwIGIvdGVzdC9Gb3JtYXQvbGFuZ3VhZ2UtZGV0ZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWM0NDRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Gb3JtYXQvbGFuZ3VhZ2UtZGV0ZWN0aW9uLmNwcApAQCAtMCwwICsxLDcgQEAKKy8vIFJVTjogZ3JlcCAtRXYgIi8vICpbQS1aMC05X10rOiIgJXMgPiAldC5qcworLy8gUlVOOiBncmVwIC1FdiAiLy8gKltBLVowLTlfXSs6IiAlcyA+ICV0LmNwcAorLy8gUlVOOiBjbGFuZy1mb3JtYXQgLXN0eWxlPWxsdm0gJXQuanMgfCBGaWxlQ2hlY2sgLXN0cmljdC13aGl0ZXNwYWNlIC1jaGVjay1wcmVmaXg9Q0hFQ0sxICVzCisvLyBSVU46IGNsYW5nLWZvcm1hdCAtc3R5bGU9bGx2bSAldC5jcHAgfCBGaWxlQ2hlY2sgLXN0cmljdC13aGl0ZXNwYWNlIC1jaGVjay1wcmVmaXg9Q0hFQ0syICVzCisvLyBDSEVDSzE6IHt7XmEgPj4+PSBiOyR9fQorLy8gQ0hFQ0syOiB7e15hID4+ID49IGI7JH19CithID4+Pj0gYjsKZGlmZiAtLWdpdCBhL3Rlc3QvRm9ybWF0L3N0eWxlLW9uLWNvbW1hbmQtbGluZS5jcHAgYi90ZXN0L0Zvcm1hdC9zdHlsZS1vbi1jb21tYW5kLWxpbmUuY3BwCmluZGV4IDIyMTMxYTEuLjE5YWRkODkgMTAwNjQ0Ci0tLSBhL3Rlc3QvRm9ybWF0L3N0eWxlLW9uLWNvbW1hbmQtbGluZS5jcHAKKysrIGIvdGVzdC9Gb3JtYXQvc3R5bGUtb24tY29tbWFuZC1saW5lLmNwcApAQCAtMSwxMyArMSwxMyBAQAogLy8gUlVOOiBncmVwIC1FdiAiLy8gKltBLVowLTlfXSs6IiAlcyA+ICV0LmNwcAogLy8gUlVOOiBjbGFuZy1mb3JtYXQgLXN0eWxlPSJ7QmFzZWRPblN0eWxlOiBHb29nbGUsIEluZGVudFdpZHRoOiA4fSIgJXQuY3BwIHwgRmlsZUNoZWNrIC1zdHJpY3Qtd2hpdGVzcGFjZSAtY2hlY2stcHJlZml4PUNIRUNLMSAlcwogLy8gUlVOOiBjbGFuZy1mb3JtYXQgLXN0eWxlPSJ7QmFzZWRPblN0eWxlOiBMTFZNLCBJbmRlbnRXaWR0aDogN30iICV0LmNwcCB8IEZpbGVDaGVjayAtc3RyaWN0LXdoaXRlc3BhY2UgLWNoZWNrLXByZWZpeD1DSEVDSzIgJXMKLS8vIFJVTjogY2xhbmctZm9ybWF0IC1zdHlsZT0ie0Jhc2VkT25TdHlsZTogaW52YWxpZCwgSW5kZW50V2lkdGg6IDd9IiAldC5jcHAgMj4mMSB8IEZpbGVDaGVjayAtc3RyaWN0LXdoaXRlc3BhY2UgLWNoZWNrLXByZWZpeD1DSEVDSzMgJXMKLS8vIFJVTjogY2xhbmctZm9ybWF0IC1zdHlsZT0ie2xzamR9IiAldC5jcHAgMj4mMSB8IEZpbGVDaGVjayAtc3RyaWN0LXdoaXRlc3BhY2UgLWNoZWNrLXByZWZpeD1DSEVDSzQgJXMKKy8vIFJVTjogY2xhbmctZm9ybWF0IC1zdHlsZT0ie0Jhc2VkT25TdHlsZTogaW52YWxpZCwgSW5kZW50V2lkdGg6IDd9IiAtZmFsbGJhY2stc3R5bGU9TExWTSAldC5jcHAgMj4mMSB8IEZpbGVDaGVjayAtc3RyaWN0LXdoaXRlc3BhY2UgLWNoZWNrLXByZWZpeD1DSEVDSzMgJXMKKy8vIFJVTjogY2xhbmctZm9ybWF0IC1zdHlsZT0ie2xzamR9IiAldC5jcHAgLWZhbGxiYWNrLXN0eWxlPUxMVk0gMj4mMSB8IEZpbGVDaGVjayAtc3RyaWN0LXdoaXRlc3BhY2UgLWNoZWNrLXByZWZpeD1DSEVDSzQgJXMKIC8vIFJVTjogWyAhIC1lICVULy5jbGFuZy1mb3JtYXQgXSB8fCBybSAlVC8uY2xhbmctZm9ybWF0CiAvLyBSVU46IHByaW50ZiAiQmFzZWRPblN0eWxlOiBnb29nbGVcbkluZGVudFdpZHRoOiA1XG4iID4gJVQvLmNsYW5nLWZvcm1hdAogLy8gUlVOOiBjbGFuZy1mb3JtYXQgLXN0eWxlPWZpbGUgJXQuY3BwIDI+JjEgfCBGaWxlQ2hlY2sgLXN0cmljdC13aGl0ZXNwYWNlIC1jaGVjay1wcmVmaXg9Q0hFQ0s1ICVzCiAvLyBSVU46IHByaW50ZiAiXG4iID4gJVQvLmNsYW5nLWZvcm1hdAotLy8gUlVOOiBjbGFuZy1mb3JtYXQgLXN0eWxlPWZpbGUgJXQuY3BwIDI+JjEgfCBGaWxlQ2hlY2sgLXN0cmljdC13aGl0ZXNwYWNlIC1jaGVjay1wcmVmaXg9Q0hFQ0s2ICVzCisvLyBSVU46IGNsYW5nLWZvcm1hdCAtc3R5bGU9ZmlsZSAtZmFsbGJhY2stc3R5bGU9d2Via2l0ICV0LmNwcCAyPiYxIHwgRmlsZUNoZWNrIC1zdHJpY3Qtd2hpdGVzcGFjZSAtY2hlY2stcHJlZml4PUNIRUNLNiAlcwogLy8gUlVOOiBbICEgLWUgJVQvLmNsYW5nLWZvcm1hdCBdIHx8IHJtICVULy5jbGFuZy1mb3JtYXQKIC8vIFJVTjogWyAhIC1lICVUL19jbGFuZy1mb3JtYXQgXSB8fCBybSAlVC9fY2xhbmctZm9ybWF0CiAvLyBSVU46IHByaW50ZiAiQmFzZWRPblN0eWxlOiBnb29nbGVcbkluZGVudFdpZHRoOiA2XG4iID4gJVQvX2NsYW5nLWZvcm1hdApAQCAtMjIsNyArMjIsOCBAQAogLy8gQ0hFQ0s0OiB7e14gIGludCBcKmk7JH19CiAvLyBDSEVDSzU6IHt7XiAgICAgaW50XCogaTskfX0KIC8vIENIRUNLNjoge3teRXJyb3IgcmVhZGluZyAuKlwuY2xhbmctZm9ybWF0OiBJbnZhbGlkIGFyZ3VtZW50fX0KLS8vIFhDSEVDSzZYOiB7e14gIGludCBcKmk7JH19CisvLyBDSEVDSzY6IHt7XkNhbid0IGZpbmQgdXNhYmxlIC5jbGFuZy1mb3JtYXQsIHVzaW5nIHdlYmtpdCBzdHlsZSR9fQorLy8gQ0hFQ0s2OiB7e14gICAgaW50XCogaTskfX0KIC8vIENIRUNLNzoge3teICAgICAgaW50XCogaTskfX0KIGludCppOwogaW50IGo7CmRpZmYgLS1naXQgYS90ZXN0L0Zyb250ZW5kL2JhY2tlbmQtZGlhZ25vc3RpYy5jIGIvdGVzdC9Gcm9udGVuZC9iYWNrZW5kLWRpYWdub3N0aWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjYxYzAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Gcm9udGVuZC9iYWNrZW5kLWRpYWdub3N0aWMuYwpAQCAtMCwwICsxLDM0IEBACisvLyBSRVFVSVJFUzogeDg2LXJlZ2lzdGVyZWQtdGFyZ2V0CisvLyBQbGF5IGFyb3VuZCB3aXRoIGJhY2tlbmQgcmVwb3J0aW5nOgorLy8gX1JFR1VMQVJfOiBSZWd1bGFyIGJlaGF2aW9yLCBubyB3YXJuaW5nIHN3aXRjaCBlbmFibGVkLgorLy8gX1BST01PVEVfOiBQcm9tb3RlIHdhcm5pbmcgdG8gZXJyb3IuCisvLyBfSUdOT1JFXzogRHJvcCBiYWNrZW5kIHdhcm5pbmcuCisvLworLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAlcyAtbWxsdm0gLXdhcm4tc3RhY2stc2l6ZT0wIC1uby1pbnRlZ3JhdGVkLWFzIC1TIC1vIC0gLXRyaXBsZT1pMzg2LWFwcGxlLWRhcndpbiAyPiAldC5lcnIKKy8vIFJVTjogRmlsZUNoZWNrIDwgJXQuZXJyICVzIC0tY2hlY2stcHJlZml4PVJFR1VMQVIgLS1jaGVjay1wcmVmaXg9QVNNCisvLyBSVU46IG5vdCAlY2xhbmdfY2MxICVzIC1tbGx2bSAtd2Fybi1zdGFjay1zaXplPTAgLW5vLWludGVncmF0ZWQtYXMgLVMgLW8gLSAtdHJpcGxlPWkzODYtYXBwbGUtZGFyd2luIC1XZXJyb3I9ZnJhbWUtbGFyZ2VyLXRoYW4gMj4gJXQuZXJyCisvLyBSVU46IEZpbGVDaGVjayA8ICV0LmVyciAlcyAtLWNoZWNrLXByZWZpeD1QUk9NT1RFIC0tY2hlY2stcHJlZml4PUFTTQorLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAlcyAtbWxsdm0gLXdhcm4tc3RhY2stc2l6ZT0wIC1uby1pbnRlZ3JhdGVkLWFzIC1TIC1vIC0gLXRyaXBsZT1pMzg2LWFwcGxlLWRhcndpbiAtV25vLWZyYW1lLWxhcmdlci10aGFuIDI+ICV0LmVycgorLy8gUlVOOiBGaWxlQ2hlY2sgPCAldC5lcnIgJXMgLS1jaGVjay1wcmVmaXg9SUdOT1JFIC0tY2hlY2stcHJlZml4PUFTTQorLy8KKy8vIEN1cnJlbnRseSB0aGUgc3RhY2sgc2l6ZSByZXBvcnRpbmcgY2Fubm90IGJlIGNoZWNrZWQgd2l0aCAtdmVyaWZ5IGJlY2F1c2UKKy8vICBubyBzb3VyY2UgbG9jYXRpb24gaXMgYXR0YWNoZWQgdG8gdGhlIGRpYWdub3N0aWMuIFRoZXJlZm9yZSBkbyBub3QgZW1pdAorLy8gdGhlbSBmb3IgdGhlIC12ZXJpZnkgdGVzdCBmb3Igbm93LgorLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1TIC1vIC0gLXRyaXBsZT1pMzg2LWFwcGxlLWRhcndpbiAtdmVyaWZ5IC1uby1pbnRlZ3JhdGVkLWFzCisKK2V4dGVybiB2b2lkIGRvSXQoY2hhciAqKTsKKworLy8gUkVHVUxBUjogd2FybmluZzogc3RhY2sgc2l6ZSBleGNlZWRlZCAoe3tbMC05XSt9fSkgaW4gc3RhY2tTaXplV2FybmluZworLy8gUFJPTU9URTogZXJyb3I6IHN0YWNrIHNpemUgZXhjZWVkZWQgKHt7WzAtOV0rfX0pIGluIHN0YWNrU2l6ZVdhcm5pbmcKKy8vIElHTk9SRS1OT1Q6IHN0YWNrIHNpemUgZXhjZWVkZWQgKHt7WzAtOV0rfX0pIGluIHN0YWNrU2l6ZVdhcm5pbmcKK3ZvaWQgc3RhY2tTaXplV2FybmluZygpIHsKKyAgY2hhciBidWZmZXJbODBdOworICBkb0l0KGJ1ZmZlcik7Cit9CisKKy8vIEFTTTogaW5saW5lIGFzc2VtYmx5IHJlcXVpcmVzIG1vcmUgcmVnaXN0ZXJzIHRoYW4gYXZhaWxhYmxlCit2b2lkIGlubGluZUFzbUVycm9yKGludCB4MCwgaW50IHgxLCBpbnQgeDIsIGludCB4MywgaW50IHg0LAorICAgICAgICAgICAgICAgICAgICBpbnQgeDUsIGludCB4NiwgaW50IHg3LCBpbnQgeDgsIGludCB4OSkgeworICBfX2FzbV9fKCJoZWxsbyB3b3JsZCI6IDogInIiICh4MCksInIiICh4MSksInIiICh4MiksInIiICh4MyksIC8vIGV4cGVjdGVkLWVycm9yICsge3tpbmxpbmUgYXNzZW1ibHkgcmVxdWlyZXMgbW9yZSByZWdpc3RlcnMgdGhhbiBhdmFpbGFibGV9fQorICAgICAgICAgICJyIiAoeDQpLCJyIiAoeDUpLCJyIiAoeDYpLCJyIiAoeDcpLCJyIiAoeDgpLCJyIiAoeDkpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvRnJvbnRlbmQvZGFyd2luLWVhYmkuYyBiL3Rlc3QvRnJvbnRlbmQvZGFyd2luLWVhYmkuYwppbmRleCBiNGI4MmFhLi4yNzQ3MWU2IDEwMDY0NAotLS0gYS90ZXN0L0Zyb250ZW5kL2Rhcndpbi1lYWJpLmMKKysrIGIvdGVzdC9Gcm9udGVuZC9kYXJ3aW4tZWFiaS5jCkBAIC0xLDcgKzEsNyBAQAogLy8gUlVOOiAlY2xhbmcgLWFyY2ggYXJtdjZtIC1kTSAtRSAlcyB8IEZpbGVDaGVjayAlcwogLy8gUlVOOiAlY2xhbmcgLWFyY2ggYXJtdjdtIC1kTSAtRSAlcyB8IEZpbGVDaGVjayAlcwogLy8gUlVOOiAlY2xhbmcgLWFyY2ggYXJtdjdlbSAtZE0gLUUgJXMgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nIC1hcmNoIGFybXY3IC10YXJnZXQgdGh1bWJ2Ny1hcHBsZS1kYXJ3aW4tZWFiaSAtZE0gLUUgJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHRodW1idjdtLWFwcGxlLXVua25vd24tbWFjaG8gLWRNIC1FICVzIHwgRmlsZUNoZWNrICVzCiAKIC8vIENIRUNLLU5PVDogX19FTlZJUk9OTUVOVF9JUEhPTkVfT1NfVkVSU0lPTl9NSU5fUkVRVUlSRURfXwogLy8gQ0hFQ0stTk9UOiBfX0VOVklST05NRU5UX01BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEX18KZGlmZiAtLWdpdCBhL3Rlc3QvRnJvbnRlbmQvaXItc3VwcG9ydC1jb2RlZ2VuLmxsIGIvdGVzdC9Gcm9udGVuZC9pci1zdXBwb3J0LWNvZGVnZW4ubGwKaW5kZXggZTVlNWI2Mi4uM2RjM2MwYSAxMDA2NDQKLS0tIGEvdGVzdC9Gcm9udGVuZC9pci1zdXBwb3J0LWNvZGVnZW4ubGwKKysrIGIvdGVzdC9Gcm9udGVuZC9pci1zdXBwb3J0LWNvZGVnZW4ubGwKQEAgLTEsOSArMSwxNSBAQAotOyBSRVFVSVJFUzogeDg2LTY0LXJlZ2lzdGVyZWQtdGFyZ2V0Ci07IFJVTjogJWNsYW5nX2NjMSAtUyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCis7IFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQKKzsgUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1TIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKworOyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtcGMtbGludXggLVMgLW8gJXQgJXMgMj4mMSB8IFwKKzsgUlVOOiBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9V0FSTiAlcworOyBXQVJOOiB3YXJuaW5nOiBvdmVycmlkaW5nIHRoZSBtb2R1bGUgdGFyZ2V0IHRyaXBsZSB3aXRoIHg4Nl82NC1wYy1saW51eAorOyBSVU46IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1MSU5VWCAlcyA8ICV0CiAKIHRhcmdldCB0cmlwbGUgPSAieDg2XzY0LWFwcGxlLWRhcndpbjEwIgogCiA7IENIRUNLOiAuZ2xvYmwgX2YwCis7IExJTlVYOiAuZ2xvYmwgZjAKIGRlZmluZSBpMzIgQGYwKCkgbm91bndpbmQgc3NwIHsKICAgICAgICByZXQgaTMyIDAKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvRnJvbnRlbmQvcGx1Z2lucy5jIGIvdGVzdC9Gcm9udGVuZC9wbHVnaW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExN2Y3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRnJvbnRlbmQvcGx1Z2lucy5jCkBAIC0wLDAgKzEsNSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1sb2FkICVsbHZtc2hsaWJkaXIvUHJpbnRGdW5jdGlvbk5hbWVzJXBsdWdpbmV4dCAtcGx1Z2luIHByaW50LWZucyAlcyAyPiYxIHwgRmlsZUNoZWNrICVzCisvLyBSRVFVSVJFUzogcGx1Z2lucywgZXhhbXBsZXMKKworLy8gQ0hFQ0s6IHRvcC1sZXZlbC1kZWNsOiAieCIKK3ZvaWQgeCgpOwpkaWZmIC0tZ2l0IGEvdGVzdC9Gcm9udGVuZC9yZXdyaXRlLWluY2x1ZGVzLWJvbS5jIGIvdGVzdC9Gcm9udGVuZC9yZXdyaXRlLWluY2x1ZGVzLWJvbS5jCmluZGV4IGExYWE0YzkuLmNhYTQzMWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvRnJvbnRlbmQvcmV3cml0ZS1pbmNsdWRlcy1ib20uYworKysgYi90ZXN0L0Zyb250ZW5kL3Jld3JpdGUtaW5jbHVkZXMtYm9tLmMKQEAgLTEsNCArMSw4IEBACi0vLyBSVU46ICVjbGFuZyAtRSAtZnJld3JpdGUtaW5jbHVkZXMgLUkgJVMvSW5wdXRzICVzIC1vIC0gfCAlY2xhbmcgLWZzeW50YXgtb25seSAtWGNsYW5nIC12ZXJpZnkgLXggYyAtCisvLyBSVU46IGdyZXAgLXEgJCdeXHhFRlx4QkJceEJGJyAlUy9JbnB1dHMvcmV3cml0ZS1pbmNsdWRlcy1ib20uaAorLy8gUlVOOiAlY2xhbmdfY2MxIC1FIC1mcmV3cml0ZS1pbmNsdWRlcyAtSSAlUy9JbnB1dHMgJXMgLW8gJXQuYworLy8gUlVOOiAhIGdyZXAgLXEgJCdceEVGXHhCQlx4QkYnICV0LmMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXQuYwogLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKKy8vIFJFUVVJUkVTOiBzaGVsbAogCiAjaW5jbHVkZSAicmV3cml0ZS1pbmNsdWRlcy1ib20uaCIKZGlmZiAtLWdpdCBhL3Rlc3QvRnJvbnRlbmQvcmV3cml0ZS1pbmNsdWRlcy1lb2YuYyBiL3Rlc3QvRnJvbnRlbmQvcmV3cml0ZS1pbmNsdWRlcy1lb2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjdmZDg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Gcm9udGVuZC9yZXdyaXRlLWluY2x1ZGVzLWVvZi5jCkBAIC0wLDAgKzEsNCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1FIC1mcmV3cml0ZS1pbmNsdWRlcyAtSSAlUy9JbnB1dHMgJXMKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisvLyBOb3RlOiB0aGVyZSdzIG5vIG5ld2xpbmUgYXQgdGhlIGVuZCBvZiB0aGlzIEMgZmlsZS4KKyNpbmNsdWRlICJyZXdyaXRlLWluY2x1ZGVzLWJvbS5oIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvRnJvbnRlbmQvc3lzdGVtLWhlYWRlci1wcmVmaXguYyBiL3Rlc3QvRnJvbnRlbmQvc3lzdGVtLWhlYWRlci1wcmVmaXguYwppbmRleCAzMTE5NGQ5Li41NWI5NTRmIDEwMDY0NAotLS0gYS90ZXN0L0Zyb250ZW5kL3N5c3RlbS1oZWFkZXItcHJlZml4LmMKKysrIGIvdGVzdC9Gcm9udGVuZC9zeXN0ZW0taGVhZGVyLXByZWZpeC5jCkBAIC0xLDExICsxLDEyIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWlzeXN0ZW0tcHJlZml4IGxpYnMvIC1pbm8tc3lzdGVtLXByZWZpeCBsaWJzL215bGliLyAtSSVTL0lucHV0cy9TeXN0ZW1IZWFkZXJQcmVmaXggLVd1bmRlZiAtRSAlcyAyPiYxIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZyAtLXN5c3RlbS1oZWFkZXItcHJlZml4PWxpYnMvIC0tbm8tc3lzdGVtLWhlYWRlci1wcmVmaXg9bGlicy9teWxpYi8gLUklUy9JbnB1dHMvU3lzdGVtSGVhZGVyUHJlZml4IC1XdW5kZWYgLUUgJXMgMj4mMSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmcgLS1zeXN0ZW0taGVhZGVyLXByZWZpeCBsaWJzLyAtLW5vLXN5c3RlbS1oZWFkZXItcHJlZml4IGxpYnMvbXlsaWIvIC1JJVMvSW5wdXRzL1N5c3RlbUhlYWRlclByZWZpeCAtV3VuZGVmIC1FICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMKIAogI2luY2x1ZGUgInNyYy9hbGwuaCIKIAogLy8gQ0hFQ0stTk9UOiBCT09TVAotLy8gQ0hFQ0s6IGxpYnMvbXlsaWIvd2Fybi5oOjE6NTogd2FybmluZzogJ01ZTElCJyBpcyBub3QgZGVmaW5lZCwgZXZhbHVhdGVzIHRvIDAKKy8vIENIRUNLOiBsaWJze3svfFxcfX1teWxpYnt7L3xcXH19d2Fybi5oOjE6NTogd2FybmluZzogJ01ZTElCJyBpcyBub3QgZGVmaW5lZCwgZXZhbHVhdGVzIHRvIDAKIC8vIENIRUNLLU5PVDogQk9PU1QKLS8vIENIRUNLOiBsaWJzL215bGliL3dhcm4uaDoxOjU6IHdhcm5pbmc6ICdNWUxJQicgaXMgbm90IGRlZmluZWQsIGV2YWx1YXRlcyB0byAwCisvLyBDSEVDSzogbGlic3t7L3xcXH19bXlsaWJ7ey98XFx9fXdhcm4uaDoxOjU6IHdhcm5pbmc6ICdNWUxJQicgaXMgbm90IGRlZmluZWQsIGV2YWx1YXRlcyB0byAwCiAvLyBDSEVDSy1OT1Q6IEJPT1NUCi0vLyBDSEVDSzogc3JjL3dhcm4uaDoxOjU6IHdhcm5pbmc6ICdTUkMnIGlzIG5vdCBkZWZpbmVkLCBldmFsdWF0ZXMgdG8gMAorLy8gQ0hFQ0s6IHNyY3t7L3xcXH19d2Fybi5oOjE6NTogd2FybmluZzogJ1NSQycgaXMgbm90IGRlZmluZWQsIGV2YWx1YXRlcyB0byAwCiAvLyBDSEVDSy1OT1Q6IEJPT1NUCmRpZmYgLS1naXQgYS90ZXN0L0hlYWRlcnMvSW5wdXRzL2luY2x1ZGUvc2V0am1wLmggYi90ZXN0L0hlYWRlcnMvSW5wdXRzL2luY2x1ZGUvc2V0am1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1ZTkwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSGVhZGVycy9JbnB1dHMvaW5jbHVkZS9zZXRqbXAuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgU0VUSk1QX0gKKyNkZWZpbmUgU0VUSk1QX0gKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgeFs0Ml07Cit9IGptcF9idWY7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9IZWFkZXJzL2FsdGl2ZWMtaGVhZGVyLmMgYi90ZXN0L0hlYWRlcnMvYWx0aXZlYy1oZWFkZXIuYwppbmRleCBiMDFjYzk3Li4zZDg1OTU3IDEwMDY0NAotLS0gYS90ZXN0L0hlYWRlcnMvYWx0aXZlYy1oZWFkZXIuYworKysgYi90ZXN0L0hlYWRlcnMvYWx0aXZlYy1oZWFkZXIuYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiBwcGM2NC1yZWdpc3RlcmVkLXRhcmdldAorLy8gUkVRVUlSRVM6IHBvd2VycGMtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHBvd2VycGM2NC11bmtub3duLXVua25vd24gLWZhbHRpdmVjIC1mZnJlZXN0YW5kaW5nIC1TIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHBvd2VycGM2NC11bmtub3duLXVua25vd24gLWZhbHRpdmVjIC1mZnJlZXN0YW5kaW5nIC1mbm8tbGF4LXZlY3Rvci1jb252ZXJzaW9ucyAtUyAtbyAtICVzIHwgRmlsZUNoZWNrICVzCiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBwb3dlcnBjNjQtdW5rbm93bi11bmtub3duIC1mYWx0aXZlYyAtZmZyZWVzdGFuZGluZyAteCBjKysgLVMgLW8gLSAlcyB8IEZpbGVDaGVjayAlcwpAQCAtOCw1ICs4LDggQEAKIC8vIFZlcmlmeSB0aGF0IHNpbXBseSBpbmNsdWRpbmcgPGFsdGl2ZWMuaD4gZG9lcyBub3QgZ2VuZXJhdGUgYW55IGNvZGUKIC8vIChpLmUuIGFsbCBpbmxpbmUgcm91dGluZXMgaW4gdGhlIGhlYWRlciBhcmUgbWFya2VkICJzdGF0aWMiKQogCi0vLyBDSEVDSy1OT1Q6IC50ZXh0Ci0KKy8vIENIRUNLOiAudGV4dAorLy8gQ0hFQ0stTkVYVDogLmZpbGUKKy8vIENIRUNLLU5FWFQ6IHt7XiR9fQorLy8gQ0hFQ0stTkVYVDogLmlkZW50e3suKiR9fQorLy8gQ0hFQ0stTk9UOiAuCmRpZmYgLS1naXQgYS90ZXN0L0hlYWRlcnMvYzExLmMgYi90ZXN0L0hlYWRlcnMvYzExLmMKaW5kZXggMTFiZWMxOS4uYzE0NTRjOCAxMDA2NDQKLS0tIGEvdGVzdC9IZWFkZXJzL2MxMS5jCisrKyBiL3Rlc3QvSGVhZGVycy9jMTEuYwpAQCAtMSw2ICsxLDggQEAKKy8vIFJVTjogcm0gLXJmICV0CiAvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1zdGQ9YzExICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1zdGQ9YzExIC1mbW9kdWxlcyAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtc3RkPWMxMSAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgJXMKIC8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXN0ZD1jMTEgLWZmcmVlc3RhbmRpbmcgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXN0ZD1jMTEgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1mbXNjLXZlcnNpb249MTcwMCAlcwogCiBub3JldHVybiBpbnQgZigpOyAvLyBleHBlY3RlZC1lcnJvciAxK3t7fX0KIApAQCAtMjIsNiArMjQsMTQgQEAKICNkZWZpbmUgX19TVERDX1dBTlRfTElCX0VYVDFfXyAxCiAjaW5jbHVkZSA8c3RkZGVmLmg+CiByc2l6ZV90IHggPSAwOworX1N0YXRpY19hc3NlcnQoc2l6ZW9mKG1heF9hbGlnbl90KSA+PSBzaXplb2YobG9uZyBsb25nKSwgIiIpOworX1N0YXRpY19hc3NlcnQoYWxpZ25vZihtYXhfYWxpZ25fdCkgPj0gYWxpZ25vZihsb25nIGxvbmcpLCAiIik7CitfU3RhdGljX2Fzc2VydChzaXplb2YobWF4X2FsaWduX3QpID49IHNpemVvZihsb25nIGRvdWJsZSksICIiKTsKK19TdGF0aWNfYXNzZXJ0KGFsaWdub2YobWF4X2FsaWduX3QpID49IGFsaWdub2YobG9uZyBkb3VibGUpLCAiIik7CisKKyNpZmRlZiBfTVNDX1ZFUgorX1N0YXRpY19hc3NlcnQoc2l6ZW9mKG1heF9hbGlnbl90KSA9PSBzaXplb2YoZG91YmxlKSwgIiIpOworI2VuZGlmCiAKIC8vIElmIHdlIGFyZSBmcmVlc3RhbmRpbmcsIHRoZW4gYWxzbyBjaGVjayBSU0laRV9NQVggKGluIGEgaG9zdGVkIGltcGxlbWVudGF0aW9uCiAvLyB3ZSB3aWxsIHVzZSB0aGUgaG9zdCBzdGRpbnQuaCwgd2hpY2ggbWF5IG5vdCB5ZXQgaGF2ZSBDMTEgc3VwcG9ydCkuCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvY2FyYm9uLmMgYi90ZXN0L0hlYWRlcnMvY2FyYm9uLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvU2VtYS9jYXJib24uYwpyZW5hbWUgdG8gdGVzdC9IZWFkZXJzL2NhcmJvbi5jCmRpZmYgLS1naXQgYS90ZXN0L0hlYWRlcnMvY3h4MTEuY3BwIGIvdGVzdC9IZWFkZXJzL2N4eDExLmNwcAppbmRleCAxYTRiNjQwLi44NTc2YzVlIDEwMDY0NAotLS0gYS90ZXN0L0hlYWRlcnMvY3h4MTEuY3BwCisrKyBiL3Rlc3QvSGVhZGVycy9jeHgxMS5jcHAKQEAgLTEsNSArMSw3IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZmcmVlc3RhbmRpbmcgLWZzeW50YXgtb25seSAtc3RkPWMrKzExICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZmcmVlc3RhbmRpbmcgLWZzeW50YXgtb25seSAtc3RkPWMrKzExIC1mbW9kdWxlcyAlcworLy8gRElTQUJMRUQ6ICVjbGFuZ19jYzEgLWZmcmVlc3RhbmRpbmcgLWZzeW50YXgtb25seSAtc3RkPWMrKzExIC1mbW9kdWxlcyAlcworCisvLyBGSVhNRTogVGhpcyB0ZXN0IGZhaWxzIG9uIE9TIFggMTAuOSB3aXRoIGhlYWRlcnMgaW4gL3Vzci9pbmNsdWRlLCBzZWUgUFIxODMyMgogCiAjaW5jbHVkZSA8c3RkYWxpZ24uaD4KIApkaWZmIC0tZ2l0IGEvdGVzdC9IZWFkZXJzL21zLWludHJpbi5jcHAgYi90ZXN0L0hlYWRlcnMvbXMtaW50cmluLmNwcAppbmRleCAxYmYxMzRlLi4wM2Y1N2E1IDEwMDY0NAotLS0gYS90ZXN0L0hlYWRlcnMvbXMtaW50cmluLmNwcAorKysgYi90ZXN0L0hlYWRlcnMvbXMtaW50cmluLmNwcApAQCAtMSw2ICsxLDEyIEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LXBjLXdpbjMyIC10YXJnZXQtY3B1IHBlbnRpdW00IFwKIC8vIFJVTjogICAgIC1mbXMtZXh0ZW5zaW9ucyAtZm1zLWNvbXBhdGliaWxpdHkgLWZtc2MtdmVyc2lvbj0xNzAwIFwKLS8vIFJVTjogICAgIC1mZnJlZXN0YW5kaW5nIC12ZXJpZnkgJXMKKy8vIFJVTjogICAgIC1mZnJlZXN0YW5kaW5nIC1mc3ludGF4LW9ubHkgLVdlcnJvciBcCisvLyBSVU46ICAgICAtaXN5c3RlbSAlUy9JbnB1dHMvaW5jbHVkZSAlcworCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtcGMtd2luMzIgIFwKKy8vIFJVTjogICAgIC1mbXMtZXh0ZW5zaW9ucyAtZm1zLWNvbXBhdGliaWxpdHkgLWZtc2MtdmVyc2lvbj0xNzAwIFwKKy8vIFJVTjogICAgIC1mZnJlZXN0YW5kaW5nIC1mc3ludGF4LW9ubHkgLVdlcnJvciBcCisvLyBSVU46ICAgICAtaXN5c3RlbSAlUy9JbnB1dHMvaW5jbHVkZSAlcwogCiAvLyBJbnRyaW4uaCBuZWVkcyBzaXplX3QsIGJ1dCAtZmZyZWVzdGFuZGluZyBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcgaXQgZnJvbQogLy8gc3RkZGVmLmguICBXb3JrIGFyb3VuZCBpdCB3aXRoIHRoaXMgdHlwZWRlZi4KQEAgLTExLDE0ICsxNywzIEBACiAvLyBVc2Ugc29tZSBDKysgdG8gbWFrZSBzdXJlIHdlIGNsb3NlZCB0aGUgZXh0ZXJuICJDIiBicmFja2V0cy4KIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogdm9pZCBmb28oVCBWKSB7fQotCi12b2lkIGJhcigpIHsKLSAgX1JlYWRXcml0ZUJhcnJpZXIoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpcyBkZXByZWNhdGVkOiB1c2Ugb3RoZXIgaW50cmluc2ljcyBvciBDKysxMSBhdG9taWNzIGluc3RlYWR9fQotICBfUmVhZEJhcnJpZXIoKTsgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lzIGRlcHJlY2F0ZWQ6IHVzZSBvdGhlciBpbnRyaW5zaWNzIG9yIEMrKzExIGF0b21pY3MgaW5zdGVhZH19Ci0gIF9Xcml0ZUJhcnJpZXIoKTsgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7aXMgZGVwcmVjYXRlZDogdXNlIG90aGVyIGludHJpbnNpY3Mgb3IgQysrMTEgYXRvbWljcyBpbnN0ZWFkfX0KLSAgLy8gRklYTUU6IEl0J2QgYmUgaGFuZHkgaWYgd2UgZGlkbid0IGhhdmUgdG8gaGFyZGNvZGUgdGhlIGxpbmUgbnVtYmVyIGluCi0gIC8vIGludHJpbi5oLgotICAvLyBleHBlY3RlZC1ub3RlQEludHJpbi5oOjc1NCB7e2RlY2xhcmVkIGhlcmV9fQotICAvLyBleHBlY3RlZC1ub3RlQEludHJpbi5oOjc1OSB7e2RlY2xhcmVkIGhlcmV9fQotICAvLyBleHBlY3RlZC1ub3RlQEludHJpbi5oOjc2NCB7e2RlY2xhcmVkIGhlcmV9fQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9IZWFkZXJzL3dhcm4tc3lzaGVhZGVyLmNwcCBiL3Rlc3QvSGVhZGVycy93YXJuLXN5c2hlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjMzgyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSGVhZGVycy93YXJuLXN5c2hlYWRlci5jcHAKQEAgLTAsMCArMSwzMyBAQAorLy8gVGVzdCB0aGF0IC1Xc3lzdGVtLWhlYWRlcnMgd29ya3Mgd2l0aCBkZWZhdWx0IGFuZCBjdXN0b20gbWFwcGluZ3MgbGlrZSAtV2Vycm9yLgorLy8gS2VlcCBydW4gbGluZXMgYXQgdGhlIGJvdHRvbSBmb3IgbGluZSBudW1iZXIgc3RhYmlsaXR5LgorCisjaWZkZWYgSVNfU1lTSEVBREVSCisjcHJhZ21hIGNsYW5nIHN5c3RlbV9oZWFkZXIKKworaW50IGYoKSB7IHJldHVybiAoaW50KTA7IH0gLy8gVXNlIHRoZSBvbGQtc3R5bGUtY2FzdCB3YXJuaW5nIGFzIGFuIGFyYml0cmFyeSAib3JkaW5hcnkiIGRpYWdub3N0aWMgZm9yIHRoZSBwdXJwb3NlIG9mIHRlc3RpbmcuCisKKyN3YXJuaW5nICJjdXN0b20gbWVzc2FnZSIKKworI2lmIGRlZmluZWQoQSkgfHwgZGVmaW5lZChCKQorLy8gZXhwZWN0ZWQtd2FybmluZ0A5IHt7ImN1c3RvbSBtZXNzYWdlIn19CisjZWxpZiBkZWZpbmVkKEMpCisvLyBleHBlY3RlZC13YXJuaW5nQDcge3t1c2Ugb2Ygb2xkLXN0eWxlIGNhc3R9fQorLy8gZXhwZWN0ZWQtd2FybmluZ0A5IHt7ImN1c3RvbSBtZXNzYWdlIn19CisjZWxpZiBkZWZpbmVkKEQpCisvLyBleHBlY3RlZC1lcnJvckA3IHt7dXNlIG9mIG9sZC1zdHlsZSBjYXN0fX0KKy8vIGV4cGVjdGVkLWVycm9yQDkge3siY3VzdG9tIG1lc3NhZ2UifX0KKyNlbGlmIGRlZmluZWQoRSkKKy8vIGV4cGVjdGVkLWVycm9yQDcge3t1c2Ugb2Ygb2xkLXN0eWxlIGNhc3R9fQorLy8gZXhwZWN0ZWQtd2FybmluZ0A5IHt7ImN1c3RvbSBtZXNzYWdlIn19CisjZW5kaWYKKworI2Vsc2UKKyNkZWZpbmUgSVNfU1lTSEVBREVSCisjaW5jbHVkZSBfX0ZJTEVfXworI2VuZGlmCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mc3ludGF4LW9ubHkgLURBICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtZnN5bnRheC1vbmx5IC1EQiAtV29sZC1zdHlsZS1jYXN0ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtZnN5bnRheC1vbmx5IC1EQyAtV29sZC1zdHlsZS1jYXN0IC1Xc3lzdGVtLWhlYWRlcnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mc3ludGF4LW9ubHkgLUREIC1Xb2xkLXN0eWxlLWNhc3QgLVdzeXN0ZW0taGVhZGVycyAtV2Vycm9yICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtZnN5bnRheC1vbmx5IC1ERSAtV29sZC1zdHlsZS1jYXN0IC1Xc3lzdGVtLWhlYWRlcnMgLVdlcnJvcj1vbGQtc3R5bGUtY2FzdCAlcwpkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9JbnB1dHMvRnJhbWV3b3Jrcy9Eb2NDb21tZW50c0EuZnJhbWV3b3JrL0hlYWRlcnMvRG9jQ29tbWVudHNBLmggYi90ZXN0L0luZGV4L0lucHV0cy9GcmFtZXdvcmtzL0RvY0NvbW1lbnRzQS5mcmFtZXdvcmsvSGVhZGVycy9Eb2NDb21tZW50c0EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ4ZjgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9JbmRleC9JbnB1dHMvRnJhbWV3b3Jrcy9Eb2NDb21tZW50c0EuZnJhbWV3b3JrL0hlYWRlcnMvRG9jQ29tbWVudHNBLmgKQEAgLTAsMCArMSw4IEBACisvLy8gQ29tbWVudCBmb3IgJ2Z1bmN0aW9uRnJvbURvY0NvbW1lbnRzQTEnLgordm9pZCBmdW5jdGlvbkZyb21Eb2NDb21tZW50c0ExKHZvaWQpOworCisjaW1wb3J0IDxEb2NDb21tZW50c0MvRG9jQ29tbWVudHNDLmg+CisKKy8vLyBDb21tZW50IGZvciAnZnVuY3Rpb25Gcm9tRG9jQ29tbWVudHNBMicuCit2b2lkIGZ1bmN0aW9uRnJvbURvY0NvbW1lbnRzQTIodm9pZCk7CisKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvSW5wdXRzL0ZyYW1ld29ya3MvRG9jQ29tbWVudHNCLmZyYW1ld29yay9IZWFkZXJzL0RvY0NvbW1lbnRzQi5oIGIvdGVzdC9JbmRleC9JbnB1dHMvRnJhbWV3b3Jrcy9Eb2NDb21tZW50c0IuZnJhbWV3b3JrL0hlYWRlcnMvRG9jQ29tbWVudHNCLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyNzllMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSW5kZXgvSW5wdXRzL0ZyYW1ld29ya3MvRG9jQ29tbWVudHNCLmZyYW1ld29yay9IZWFkZXJzL0RvY0NvbW1lbnRzQi5oCkBAIC0wLDAgKzEsNyBAQAorLy8vIENvbW1lbnQgZm9yICdmdW5jdGlvbkZyb21Eb2NDb21tZW50c0IxJy4KK3ZvaWQgZnVuY3Rpb25Gcm9tRG9jQ29tbWVudHNCMSh2b2lkKTsKKworI2ltcG9ydCA8RG9jQ29tbWVudHNDL0RvY0NvbW1lbnRzQy5oPgorCisvLy8gQ29tbWVudCBmb3IgJ2Z1bmN0aW9uRnJvbURvY0NvbW1lbnRzQjInLgordm9pZCBmdW5jdGlvbkZyb21Eb2NDb21tZW50c0IyKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9JbnB1dHMvRnJhbWV3b3Jrcy9Eb2NDb21tZW50c0MuZnJhbWV3b3JrL0hlYWRlcnMvRG9jQ29tbWVudHNDLmggYi90ZXN0L0luZGV4L0lucHV0cy9GcmFtZXdvcmtzL0RvY0NvbW1lbnRzQy5mcmFtZXdvcmsvSGVhZGVycy9Eb2NDb21tZW50c0MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjY5NmEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9JbmRleC9JbnB1dHMvRnJhbWV3b3Jrcy9Eb2NDb21tZW50c0MuZnJhbWV3b3JrL0hlYWRlcnMvRG9jQ29tbWVudHNDLmgKQEAgLTAsMCArMSwyIEBACisvLy8gQ29tbWVudCBmb3IgJ2Z1bmN0aW9uRnJvbURvY0NvbW1lbnRzQycuCit2b2lkIGZ1bmN0aW9uRnJvbURvY0NvbW1lbnRzQyh2b2lkKTsKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvSW5wdXRzL2NyYXNoLXJlY292ZXJ5LWNvZGUtY29tcGxldGUtcmVtYXAuYyBiL3Rlc3QvSW5kZXgvSW5wdXRzL2NyYXNoLXJlY292ZXJ5LWNvZGUtY29tcGxldGUtcmVtYXAuYwppbmRleCA1MGE4NjU4Li5mYzYzYzlmIDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L0lucHV0cy9jcmFzaC1yZWNvdmVyeS1jb2RlLWNvbXBsZXRlLXJlbWFwLmMKKysrIGIvdGVzdC9JbmRleC9JbnB1dHMvY3Jhc2gtcmVjb3ZlcnktY29kZS1jb21wbGV0ZS1yZW1hcC5jCkBAIC0xLDYgKzEsNiBAQAogLy8gUlVOOiBlY2hvIGVudiBDSU5ERVhURVNUX0VESVRJTkc9MSBcCiAvLyBSVU46ICAgbm90IGMtaW5kZXgtdGVzdCAtdGVzdC1sb2FkLXNvdXJjZS1yZXBhcnNlIDEgbG9jYWwgXAotLy8gUlVOOiAgIC1yZW1hcC1maWxlPSIlczslUy9JbnB1dHMvY3Jhc2gtcmVjb3ZlcnktY29kZS1jb21wbGV0ZS1yZW1hcC5jIiBcCisvLyBSVU46ICAgLXJlbWFwLWZpbGU9IiVzLCVTL0lucHV0cy9jcmFzaC1yZWNvdmVyeS1jb2RlLWNvbXBsZXRlLXJlbWFwLmMiIFwKIC8vIFJVTjogICAlcyAyPiAldC5lcnIKIC8vIFJVTjogRmlsZUNoZWNrIDwgJXQuZXJyIC1jaGVjay1wcmVmaXg9Q0hFQ0stQ09ERS1DT01QTEVURS1DUkFTSCAlcwogLy8gQ0hFQ0stQ09ERS1DT01QTEVURS1DUkFTSDogVW5hYmxlIHRvIHJlcGFyc2UgdHJhbnNsYXRpb24gdW5pdApkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9JbnB1dHMvcmV0YWluLWNvbW1lbnRzLWZyb20tc3lzdGVtLWhlYWRlcnMtbW9kdWxlLm1hcCBiL3Rlc3QvSW5kZXgvSW5wdXRzL3JldGFpbi1jb21tZW50cy1mcm9tLXN5c3RlbS1oZWFkZXJzLW1vZHVsZS5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3N2YzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSW5kZXgvSW5wdXRzL3JldGFpbi1jb21tZW50cy1mcm9tLXN5c3RlbS1oZWFkZXJzLW1vZHVsZS5tYXAKQEAgLTAsMCArMSw0IEBACittb2R1bGUgcmV0YWluX2NvbW1lbnRzX2Zyb21fc3lzdGVtX2hlYWRlcnMgeworICBoZWFkZXIgInJldGFpbi1jb21tZW50cy1mcm9tLXN5c3RlbS1oZWFkZXJzLmgiCisgIGV4cG9ydCAqCit9CmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L0lucHV0cy91c3JzLXN5c3RlbS5oIGIvdGVzdC9JbmRleC9JbnB1dHMvdXNycy1zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU0ZDgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9JbmRleC9JbnB1dHMvdXNycy1zeXN0ZW0uaApAQCAtMCwwICsxIEBACisjZGVmaW5lIE1BQ1JPX0ZST01fU1lTVEVNX0hFQURFUl8xIG1lb3cKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvYW5ub3RhdGUtY29tbWVudHMtb2JqYy5tIGIvdGVzdC9JbmRleC9hbm5vdGF0ZS1jb21tZW50cy1vYmpjLm0KaW5kZXggZTc3OGQ2Yy4uYThlYWEwYiAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9hbm5vdGF0ZS1jb21tZW50cy1vYmpjLm0KKysrIGIvdGVzdC9JbmRleC9hbm5vdGF0ZS1jb21tZW50cy1vYmpjLm0KQEAgLTMsNiArMywxMiBAQAogI2lmbmRlZiBIRUFERVIKICNkZWZpbmUgSEVBREVSCiAKKy8vLyBDb21tZW50IGZvciAnZnVuY3Rpb25CZWZvcmVJbXBvcnRzJy4KK3ZvaWQgZnVuY3Rpb25CZWZvcmVJbXBvcnRzKHZvaWQpOworCisjaW1wb3J0IDxEb2NDb21tZW50c0EvRG9jQ29tbWVudHNBLmg+CisjaW1wb3J0IDxEb2NDb21tZW50c0IvRG9jQ29tbWVudHNCLmg+CisKIEBjbGFzcyBOU1N0cmluZzsKIAogLy89PT0tLS0KQEAgLTIxLDI1ICsyNyw1NCBAQAogCiAvLy8gbWV0aG9kMV9pc2RveHkxIElTX0RPWFlHRU5fU0lOR0xFCiAtICh2b2lkKW1ldGhvZDFfaXNkb3h5MTsKLS0gKHZvaWQpbWV0aG9kMV9pc2RveHkyOyAvKiE8IG1ldGhvZDFfaXNkb3h5MiBJU19ET1hZR0VOX1NJTkdMRSAqLwotLSAodm9pZCltZXRob2QxX2lzZG94eTM7IC8qITwgbWV0aG9kMV9pc2RveHkzIElTX0RPWFlHRU5fU0lOR0xFICovCistICh2b2lkKW1ldGhvZDFfaXNkb3h5MjsgLy8vPCBtZXRob2QxX2lzZG94eTIgSVNfRE9YWUdFTl9TSU5HTEUKKy0gKHZvaWQpbWV0aG9kMV9pc2RveHkzOyAvKio8IG1ldGhvZDFfaXNkb3h5MyBJU19ET1hZR0VOX1NJTkdMRSAqLwogLSAodm9pZCltZXRob2QxX2lzZG94eTQ7IC8qITwgbWV0aG9kMV9pc2RveHk0IElTX0RPWFlHRU5fU0lOR0xFICovCiBAZW5kCiAKKy8vPT09LS0tCisvLyByZGFyOi8vMTQzNDg5MTIKKy8vIENoZWNrIHRoYXQgd2UgYXR0YWNoIGNvbW1lbnRzIHRvIGVudW1zIGRlY2xhcmVkIHVzaW5nIHRoZSBOU19FTlVNIG1hY3JvLgorLy89PT0tLS0KKworI2RlZmluZSBOU19FTlVNKF90eXBlLCBfbmFtZSkgZW51bSBfbmFtZSA6IF90eXBlIF9uYW1lOyBlbnVtIF9uYW1lIDogX3R5cGUKKworLy8vIEFuX05TX0VOVU1faXNkb3h5MSBJU19ET1hZR0VOX1NJTkdMRQordHlwZWRlZiBOU19FTlVNKGludCwgQW5fTlNfRU5VTV9pc2RveHkxKSB7IFJlZCwgR3JlZW4sIEJsdWUgfTsKKworLy8gSW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIGF0dGFjaGluZyBjb21tZW50cyB0byBlbnVtcyBkZWNsYXJlZCB1c2luZyB0aGUKKy8vIE5TX0VOVU0gbWFjcm8sIGl0IGlzIHRlbXB0aW5nIHRvIHVzZSB0aGUgZmFjdCB0aGF0IGVudW0gZGVjbCBpcyBlbWJlZGRlZCBpbgorLy8gdGhlIHR5cGVkZWYuICBNYWtlIHN1cmUgdGhhdCB0aGUgaGV1cmlzdGljIGlzIHN0cm9uZyBlbm91Z2ggdGhhdCBpdCBkb2VzIG5vdAorLy8gYXR0YWNoIHVucmVsYXRlZCBjb21tZW50cyBpbiB0aGUgZm9sbG93aW5nIGNhc2VzIHdoZXJlIHRhZyBkZWNscyBhcmUKKy8vIGVtYmVkZGVkIGluIGRlY2xhcmF0b3JzLgorCisjZGVmaW5lIERFQ0xBUkVfRlVOQ1RJT04oKSBcCisgICAgdm9pZCBmdW5jdGlvbkZyb21NYWNybygpIHsgXAorICAgICAgdHlwZWRlZiBzdHJ1Y3QgU3RydWN0X25vdGRveHkgU3RydWN0X25vdGRveHk7IFwKKyAgICB9CisKKy8vLyBJU19ET1hZR0VOX05PVF9BVFRBQ0hFRAorREVDTEFSRV9GVU5DVElPTigpCisKKy8vLyB0eXBlZGVmX2lzZG94eTEgSVNfRE9YWUdFTl9TSU5HTEUKK3R5cGVkZWYgc3RydWN0IFN0cnVjdF9ub3Rkb3h5ICp0eXBlZGVmX2lzZG94eTE7CiAKICNlbmRpZgogCiAvLyBSVU46IHJtIC1yZiAldAogLy8gUlVOOiBta2RpciAldAorLy8gUlVOOiBta2RpciAldC9tb2R1bGUtY2FjaGUKIAogLy8gQ2hlY2sgdGhhdCB3ZSBzZXJpYWxpemUgY29tbWVudCBzb3VyY2UgbG9jYXRpb25zIHByb3Blcmx5LgotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LXBjaCAtbyAldC9vdXQucGNoICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWluY2x1ZGUtcGNoICV0L291dC5wY2ggLWZzeW50YXgtb25seSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LXBjaCAtbyAldC9vdXQucGNoIC1GICVTL0lucHV0cy9GcmFtZXdvcmtzICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWluY2x1ZGUtcGNoICV0L291dC5wY2ggLUYgJVMvSW5wdXRzL0ZyYW1ld29ya3MgLWZzeW50YXgtb25seSAlcwogCi0vLyBSVU46IGMtaW5kZXgtdGVzdCAtdGVzdC1sb2FkLXNvdXJjZSBhbGwgLWNvbW1lbnRzLXhtbC1zY2hlbWE9JVMvLi4vLi4vYmluZGluZ3MveG1sL2NvbW1lbnQteG1sLXNjaGVtYS5ybmcgJXMgPiAldC9vdXQuYy1pbmRleC1kaXJlY3QKLS8vIFJVTjogYy1pbmRleC10ZXN0IC10ZXN0LWxvYWQtdHUgJXQvb3V0LnBjaCBhbGwgPiAldC9vdXQuYy1pbmRleC1wY2gKKy8vIFJVTjogYy1pbmRleC10ZXN0IC10ZXN0LWxvYWQtc291cmNlIGFsbCAtY29tbWVudHMteG1sLXNjaGVtYT0lUy8uLi8uLi9iaW5kaW5ncy94bWwvY29tbWVudC14bWwtc2NoZW1hLnJuZyAlcyAtRiAlUy9JbnB1dHMvRnJhbWV3b3JrcyA+ICV0L291dC5jLWluZGV4LWRpcmVjdAorLy8gUlVOOiBjLWluZGV4LXRlc3QgLXRlc3QtbG9hZC1zb3VyY2UgYWxsIC1jb21tZW50cy14bWwtc2NoZW1hPSVTLy4uLy4uL2JpbmRpbmdzL3htbC9jb21tZW50LXhtbC1zY2hlbWEucm5nICVzIC1GICVTL0lucHV0cy9GcmFtZXdvcmtzIC1mbW9kdWxlcyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldC9tb2R1bGUtY2FjaGUgPiAldC9vdXQuYy1pbmRleC1tb2R1bGVzCisvLyBSVU46IGMtaW5kZXgtdGVzdCAtdGVzdC1sb2FkLXR1ICV0L291dC5wY2ggYWxsIC1GICVTL0lucHV0cy9GcmFtZXdvcmtzID4gJXQvb3V0LmMtaW5kZXgtcGNoCiAKIC8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9V1JPTkcgPCAldC9vdXQuYy1pbmRleC1kaXJlY3QKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9V1JPTkcgPCAldC9vdXQuYy1pbmRleC1tb2R1bGVzCiAvLyBSVU46IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PVdST05HIDwgJXQvb3V0LmMtaW5kZXgtcGNoCiAKIC8vIERlY2xhcmF0aW9ucyB3aXRob3V0IERveHlnZW4gY29tbWVudHMgc2hvdWxkIG5vdCBwaWNrIHVwIHNvbWUgRG94eWdlbiBjb21tZW50cy4KQEAgLTYwLDYgKzk1LDcgQEAKIC8vIFdST05HLU5PVDogQ29tbWVudFhNTEludmFsaWQKIAogLy8gUlVOOiBGaWxlQ2hlY2sgJXMgPCAldC9vdXQuYy1pbmRleC1kaXJlY3QKKy8vIFJVTjogRmlsZUNoZWNrICVzIDwgJXQvb3V0LmMtaW5kZXgtbW9kdWxlcwogLy8gUlVOOiBGaWxlQ2hlY2sgJXMgPCAldC9vdXQuYy1pbmRleC1wY2gKIAogLy8gVGhlc2UgQ0hFQ0sgbGluZXMgYXJlIG5vdCBsb2NhdGVkIG5lYXIgdGhlIGNvZGUgb24gcHVycG9zZS4gIFRoaXMgdGVzdApAQCAtNjcsMTIgKzEwMywyMiBAQAogLy8gQWRkaW5nIGEgbm9uLWRvY3VtZW50YXRpb24gY29tbWVudCB3aXRoIENIRUNLIGxpbmUgYmV0d2VlbiBldmVyeSB0d28KIC8vIGRvY3VtZW50YXRpb24gY29tbWVudHMgd2lsbCBvbmx5IHRlc3QgYSBzaW5nbGUgY29kZSBwYXRoLgogLy8KLS8vIENIRUNLOiBhbm5vdGF0ZS1jb21tZW50cy1vYmpjLm06MTc6NTA6IE9iakNQcm9wZXJ0eURlY2w9cHJvcGVydHkxX2lzZG94eTE6e3suKn19IHByb3BlcnR5MV9pc2RveHkxIElTX0RPWFlHRU5fU0lOR0xFCi0vLyBDSEVDSzogYW5ub3RhdGUtY29tbWVudHMtb2JqYy5tOjE4OjUwOiBPYmpDUHJvcGVydHlEZWNsPXByb3BlcnR5MV9pc2RveHkyOnt7Lip9fSBwcm9wZXJ0eTFfaXNkb3h5MiBJU19ET1hZR0VOX1NJTkdMRQotLy8gQ0hFQ0s6IGFubm90YXRlLWNvbW1lbnRzLW9iamMubToxOTo1MDogT2JqQ1Byb3BlcnR5RGVjbD1wcm9wZXJ0eTFfaXNkb3h5Mzp7ey4qfX0gcHJvcGVydHkxX2lzZG94eTMgSVNfRE9YWUdFTl9TSU5HTEUKLS8vIENIRUNLOiBhbm5vdGF0ZS1jb21tZW50cy1vYmpjLm06MjA6NTA6IE9iakNQcm9wZXJ0eURlY2w9cHJvcGVydHkxX2lzZG94eTQ6e3suKn19IHByb3BlcnR5MV9pc2RveHk0IElTX0RPWFlHRU5fU0lOR0xFCi0vLyBDSEVDSzogYW5ub3RhdGUtY29tbWVudHMtb2JqYy5tOjIzOjk6IE9iakNJbnN0YW5jZU1ldGhvZERlY2w9bWV0aG9kMV9pc2RveHkxOnt7Lip9fSBtZXRob2QxX2lzZG94eTEgSVNfRE9YWUdFTl9TSU5HTEUKLS8vIENIRUNLOiBhbm5vdGF0ZS1jb21tZW50cy1vYmpjLm06MjQ6OTogT2JqQ0luc3RhbmNlTWV0aG9kRGVjbD1tZXRob2QxX2lzZG94eTI6e3suKn19IG1ldGhvZDFfaXNkb3h5MiBJU19ET1hZR0VOX1NJTkdMRQotLy8gQ0hFQ0s6IGFubm90YXRlLWNvbW1lbnRzLW9iamMubToyNTo5OiBPYmpDSW5zdGFuY2VNZXRob2REZWNsPW1ldGhvZDFfaXNkb3h5Mzp7ey4qfX0gbWV0aG9kMV9pc2RveHkzIElTX0RPWFlHRU5fU0lOR0xFCi0vLyBDSEVDSzogYW5ub3RhdGUtY29tbWVudHMtb2JqYy5tOjI2Ojk6IE9iakNJbnN0YW5jZU1ldGhvZERlY2w9bWV0aG9kMV9pc2RveHk0Ont7Lip9fSBtZXRob2QxX2lzZG94eTQgSVNfRE9YWUdFTl9TSU5HTEUKKy8vIENIRUNLLURBRzogYW5ub3RhdGUtY29tbWVudHMtb2JqYy5tOjc6NjogRnVuY3Rpb25EZWNsPWZ1bmN0aW9uQmVmb3JlSW1wb3J0czp7ey4qfX0gQnJpZWZDb21tZW50PVtDb21tZW50IGZvciAnZnVuY3Rpb25CZWZvcmVJbXBvcnRzJy5dCisvLyBDSEVDSy1EQUc6IERvY0NvbW1lbnRzQS5oOjI6NjogRnVuY3Rpb25EZWNsPWZ1bmN0aW9uRnJvbURvY0NvbW1lbnRzQTE6e3suKn19IEJyaWVmQ29tbWVudD1bQ29tbWVudCBmb3IgJ2Z1bmN0aW9uRnJvbURvY0NvbW1lbnRzQTEnLl0KKy8vIENIRUNLLURBRzogRG9jQ29tbWVudHNBLmg6Nzo2OiBGdW5jdGlvbkRlY2w9ZnVuY3Rpb25Gcm9tRG9jQ29tbWVudHNBMjp7ey4qfX0gQnJpZWZDb21tZW50PVtDb21tZW50IGZvciAnZnVuY3Rpb25Gcm9tRG9jQ29tbWVudHNBMicuXQorLy8gQ0hFQ0stREFHOiBEb2NDb21tZW50c0IuaDoyOjY6IEZ1bmN0aW9uRGVjbD1mdW5jdGlvbkZyb21Eb2NDb21tZW50c0IxOnt7Lip9fSBCcmllZkNvbW1lbnQ9W0NvbW1lbnQgZm9yICdmdW5jdGlvbkZyb21Eb2NDb21tZW50c0IxJy5dCisvLyBDSEVDSy1EQUc6IERvY0NvbW1lbnRzQi5oOjc6NjogRnVuY3Rpb25EZWNsPWZ1bmN0aW9uRnJvbURvY0NvbW1lbnRzQjI6e3suKn19IEJyaWVmQ29tbWVudD1bQ29tbWVudCBmb3IgJ2Z1bmN0aW9uRnJvbURvY0NvbW1lbnRzQjInLl0KKy8vIENIRUNLLURBRzogRG9jQ29tbWVudHNDLmg6Mjo2OiBGdW5jdGlvbkRlY2w9ZnVuY3Rpb25Gcm9tRG9jQ29tbWVudHNDOnt7Lip9fSBCcmllZkNvbW1lbnQ9W0NvbW1lbnQgZm9yICdmdW5jdGlvbkZyb21Eb2NDb21tZW50c0MnLl0KKy8vIENIRUNLOiBhbm5vdGF0ZS1jb21tZW50cy1vYmpjLm06MjM6NTA6IE9iakNQcm9wZXJ0eURlY2w9cHJvcGVydHkxX2lzZG94eTE6e3suKn19IHByb3BlcnR5MV9pc2RveHkxIElTX0RPWFlHRU5fU0lOR0xFCisvLyBDSEVDSzogYW5ub3RhdGUtY29tbWVudHMtb2JqYy5tOjI0OjUwOiBPYmpDUHJvcGVydHlEZWNsPXByb3BlcnR5MV9pc2RveHkyOnt7Lip9fSBwcm9wZXJ0eTFfaXNkb3h5MiBJU19ET1hZR0VOX1NJTkdMRQorLy8gQ0hFQ0s6IGFubm90YXRlLWNvbW1lbnRzLW9iamMubToyNTo1MDogT2JqQ1Byb3BlcnR5RGVjbD1wcm9wZXJ0eTFfaXNkb3h5Mzp7ey4qfX0gcHJvcGVydHkxX2lzZG94eTMgSVNfRE9YWUdFTl9TSU5HTEUKKy8vIENIRUNLOiBhbm5vdGF0ZS1jb21tZW50cy1vYmpjLm06MjY6NTA6IE9iakNQcm9wZXJ0eURlY2w9cHJvcGVydHkxX2lzZG94eTQ6e3suKn19IHByb3BlcnR5MV9pc2RveHk0IElTX0RPWFlHRU5fU0lOR0xFCisvLyBDSEVDSzogYW5ub3RhdGUtY29tbWVudHMtb2JqYy5tOjI5Ojk6IE9iakNJbnN0YW5jZU1ldGhvZERlY2w9bWV0aG9kMV9pc2RveHkxOnt7Lip9fSBtZXRob2QxX2lzZG94eTEgSVNfRE9YWUdFTl9TSU5HTEUKKy8vIENIRUNLOiBhbm5vdGF0ZS1jb21tZW50cy1vYmpjLm06MzA6OTogT2JqQ0luc3RhbmNlTWV0aG9kRGVjbD1tZXRob2QxX2lzZG94eTI6e3suKn19IG1ldGhvZDFfaXNkb3h5MiBJU19ET1hZR0VOX1NJTkdMRQorLy8gQ0hFQ0s6IGFubm90YXRlLWNvbW1lbnRzLW9iamMubTozMTo5OiBPYmpDSW5zdGFuY2VNZXRob2REZWNsPW1ldGhvZDFfaXNkb3h5Mzp7ey4qfX0gbWV0aG9kMV9pc2RveHkzIElTX0RPWFlHRU5fU0lOR0xFCisvLyBDSEVDSzogYW5ub3RhdGUtY29tbWVudHMtb2JqYy5tOjMyOjk6IE9iakNJbnN0YW5jZU1ldGhvZERlY2w9bWV0aG9kMV9pc2RveHk0Ont7Lip9fSBtZXRob2QxX2lzZG94eTQgSVNfRE9YWUdFTl9TSU5HTEUKKy8vIENIRUNLOiBhbm5vdGF0ZS1jb21tZW50cy1vYmpjLm06NDM6MjI6IEVudW1EZWNsPUFuX05TX0VOVU1faXNkb3h5MTp7ey4qfX0gQW5fTlNfRU5VTV9pc2RveHkxIElTX0RPWFlHRU5fU0lOR0xFCisvLyBDSEVDSzogYW5ub3RhdGUtY29tbWVudHMtb2JqYy5tOjQzOjIyOiBUeXBlZGVmRGVjbD1Bbl9OU19FTlVNX2lzZG94eTE6e3suKn19IEFuX05TX0VOVU1faXNkb3h5MSBJU19ET1hZR0VOX1NJTkdMRQorLy8gQ0hFQ0s6IGFubm90YXRlLWNvbW1lbnRzLW9iamMubTo0MzoyMjogRW51bURlY2w9QW5fTlNfRU5VTV9pc2RveHkxOnt7Lip9fSBBbl9OU19FTlVNX2lzZG94eTEgSVNfRE9YWUdFTl9TSU5HTEUKKy8vIENIRUNLOiBhbm5vdGF0ZS1jb21tZW50cy1vYmpjLm06NjA6MzI6IFR5cGVkZWZEZWNsPXR5cGVkZWZfaXNkb3h5MTp7ey4qfX0gdHlwZWRlZl9pc2RveHkxIElTX0RPWFlHRU5fU0lOR0xFCiAKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvYW5ub3RhdGUtY29tbWVudHMtdHlwZWRlZi5tIGIvdGVzdC9JbmRleC9hbm5vdGF0ZS1jb21tZW50cy10eXBlZGVmLm0KaW5kZXggYjIzZTUzNS4uNzUxY2ZhYSAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9hbm5vdGF0ZS1jb21tZW50cy10eXBlZGVmLm0KKysrIGIvdGVzdC9JbmRleC9hbm5vdGF0ZS1jb21tZW50cy10eXBlZGVmLm0KQEAgLTQ1LDUgKzQ1LDUgQEAKIC8qKiBBYm91dCBGb28xVCAqLwogdHlwZWRlZiBzdHJ1Y3QgRm9vMSBGb28xVDsKIC8vIEZJWE1FOiB3ZSBkb24ndCBhdHRhY2ggdGhpcyBjb21tZW50IHRvICdzdHJ1Y3QgRm9vMScKLS8vIENIRUNLOiBUeXBlZGVmRGVjbD1Gb28xVDpbW0BMSU5FLTJdXToyMSAoRGVmaW5pdGlvbikge3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8cCBjbGFzcz0icGFyYS1icmllZiI+IEFib3V0IEZvbzFUIDwvcD5dIEZ1bGxDb21tZW50QXNYTUw9WzxUeXBlZGVmIGZpbGU9Int7W14iXSt9fWFubm90YXRlLWNvbW1lbnRzLXR5cGVkZWYubSIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iMjEiPjxOYW1lPkZvbzFUPC9OYW1lPjxVU1I+Yzphbm5vdGF0ZS1jb21tZW50cy10eXBlZGVmLm1Ae3tbMC05XSt9fUBUQEZvbzFUPC9VU1I+PERlY2xhcmF0aW9uPnR5cGVkZWYgc3RydWN0IEZvbzEgRm9vMVQ8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWJvdXQgRm9vMVQgPC9QYXJhPjwvQWJzdHJhY3Q+PC9UeXBlZGVmPl0KKy8vIENIRUNLOiBUeXBlZGVmRGVjbD1Gb28xVDpbW0BMSU5FLTJdXToyMSAoRGVmaW5pdGlvbikge3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8cCBjbGFzcz0icGFyYS1icmllZiI+IEFib3V0IEZvbzFUIDwvcD5dIEZ1bGxDb21tZW50QXNYTUw9WzxUeXBlZGVmIGZpbGU9Int7W14iXSt9fWFubm90YXRlLWNvbW1lbnRzLXR5cGVkZWYubSIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iMjEiPjxOYW1lPkZvbzFUPC9OYW1lPjxVU1I+Yzphbm5vdGF0ZS1jb21tZW50cy10eXBlZGVmLm1AVEBGb28xVDwvVVNSPjxEZWNsYXJhdGlvbj50eXBlZGVmIHN0cnVjdCBGb28xIEZvbzFUPC9EZWNsYXJhdGlvbj48QWJzdHJhY3Q+PFBhcmE+IEFib3V0IEZvbzFUIDwvUGFyYT48L0Fic3RyYWN0PjwvVHlwZWRlZj5dCiAKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvYW5ub3RhdGUtZGVlcC1zdGF0ZW1lbnRzLmNwcCBiL3Rlc3QvSW5kZXgvYW5ub3RhdGUtZGVlcC1zdGF0ZW1lbnRzLmNwcAppbmRleCA3OWYyZDM5Li5jMGE1NWYyIDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L2Fubm90YXRlLWRlZXAtc3RhdGVtZW50cy5jcHAKKysrIGIvdGVzdC9JbmRleC9hbm5vdGF0ZS1kZWVwLXN0YXRlbWVudHMuY3BwCkBAIC00LDEzICs0LDEzIEBACiAvLyBDaGVjayB0aGF0IHdlIGRvbid0IGdldCBzdGFjayBvdmVyZmxvdyB0cnlpbmcgdG8gYW5ub3RhdGUgYW4gZXh0cmVtZWx5IGRlZXAgQVNULgogCiAvLyBBZGRyZXNzU2FuaXRpemVyIGluY3JlYXNlcyBzdGFjayB1c2FnZS4KLS8vIFhGQUlMOiBhc2FuCisvLyBSRVFVSVJFUzogbm90X2FzYW4KIAogc3RydWN0IFMgewogICBTICZvcGVyYXRvcigpKCk7CiB9OwogCi0vLyBDSEVDSzogSWRlbnRpZmllcjogImZvbyIgWzExOjYgLSAxMTo5XSBGdW5jdGlvbkRlY2w9Zm9vOjExOjYgKERlZmluaXRpb24pCisvLyBDSEVDSzogSWRlbnRpZmllcjogImZvbyIge3tcW319W1tATElORSsxXV06NiAtIFtbQExJTkUrMV1dOjldIEZ1bmN0aW9uRGVjbD1mb286W1tATElORSsxXV06NiAoRGVmaW5pdGlvbikKIHZvaWQgZm9vKCkgewogICBTIHM7CiAgIHMoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkoKSgpKCkKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvYW5ub3RhdGUtdG9rZW5zLWN4eDB4LmNwcCBiL3Rlc3QvSW5kZXgvYW5ub3RhdGUtdG9rZW5zLWN4eDB4LmNwcAppbmRleCA0ZTZkMTU2Li44OTkyYWZmIDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L2Fubm90YXRlLXRva2Vucy1jeHgweC5jcHAKKysrIGIvdGVzdC9JbmRleC9hbm5vdGF0ZS10b2tlbnMtY3h4MHguY3BwCkBAIC04MywxNCArODMsMTQgQEAKIC8vIENIRUNLLVdJVEgtT1ZFUlJJREU6IElkZW50aWZpZXI6ICJmb28iIFsxOToxNSAtIDE5OjE4XSBDWFhNZXRob2Q9Zm9vOjE5OjE1ICh2aXJ0dWFsKQogLy8gQ0hFQ0stV0lUSC1PVkVSUklERTogUHVuY3R1YXRpb246ICIoIiBbMTk6MTggLSAxOToxOV0gQ1hYTWV0aG9kPWZvbzoxOToxNSAodmlydHVhbCkKIC8vIENIRUNLLVdJVEgtT1ZFUlJJREU6IElkZW50aWZpZXI6ICJJbnQiIFsxOToxOSAtIDE5OjIyXSBUeXBlUmVmPUludDoxNjoxMwotLy8gQ0hFQ0stV0lUSC1PVkVSUklERTogUHVuY3R1YXRpb246ICIpIiBbMTk6MjIgLSAxOToyM10gUGFybURlY2w9OjE5OjIyIChEZWZpbml0aW9uKQorLy8gQ0hFQ0stV0lUSC1PVkVSUklERTogUHVuY3R1YXRpb246ICIpIiBbMTk6MjIgLSAxOToyM10gQ1hYTWV0aG9kPWZvbzoxOToxNSAodmlydHVhbCkKIC8vIENIRUNLLVdJVEgtT1ZFUlJJREU6IFB1bmN0dWF0aW9uOiAiOyIgWzE5OjIzIC0gMTk6MjRdIENsYXNzRGVjbD1COjE4OjcgKERlZmluaXRpb24pCiAvLyBDSEVDSy1XSVRILU9WRVJSSURFOiBLZXl3b3JkOiAidmlydHVhbCIgWzIzOjMgLSAyMzoxMF0gQ1hYTWV0aG9kPWZvbzoyMzoxNiAodmlydHVhbCkgW092ZXJyaWRlcyBAMTk6MTVdCiAvLyBDSEVDSy1XSVRILU9WRVJSSURFOiBLZXl3b3JkOiAidm9pZCIgWzIzOjExIC0gMjM6MTVdIENYWE1ldGhvZD1mb286MjM6MTYgKHZpcnR1YWwpIFtPdmVycmlkZXMgQDE5OjE1XQogLy8gQ0hFQ0stV0lUSC1PVkVSUklERTogSWRlbnRpZmllcjogImZvbyIgWzIzOjE2IC0gMjM6MTldIENYWE1ldGhvZD1mb286MjM6MTYgKHZpcnR1YWwpIFtPdmVycmlkZXMgQDE5OjE1XQogLy8gQ0hFQ0stV0lUSC1PVkVSUklERTogUHVuY3R1YXRpb246ICIoIiBbMjM6MTkgLSAyMzoyMF0gQ1hYTWV0aG9kPWZvbzoyMzoxNiAodmlydHVhbCkgW092ZXJyaWRlcyBAMTk6MTVdCiAvLyBDSEVDSy1XSVRILU9WRVJSSURFOiBJZGVudGlmaWVyOiAiSW50IiBbMjM6MjAgLSAyMzoyM10gVHlwZVJlZj1JbnQ6MTY6MTMKLS8vIENIRUNLLVdJVEgtT1ZFUlJJREU6IFB1bmN0dWF0aW9uOiAiKSIgWzIzOjIzIC0gMjM6MjRdIFBhcm1EZWNsPToyMzoyMyAoRGVmaW5pdGlvbikKKy8vIENIRUNLLVdJVEgtT1ZFUlJJREU6IFB1bmN0dWF0aW9uOiAiKSIgWzIzOjIzIC0gMjM6MjRdIENYWE1ldGhvZD1mb286MjM6MTYgKHZpcnR1YWwpIFtPdmVycmlkZXMgQDE5OjE1XQogLy8gQ0hFQ0stV0lUSC1PVkVSUklERTogS2V5d29yZDogIm92ZXJyaWRlIiBbMjM6MjUgLSAyMzozM10gYXR0cmlidXRlKG92ZXJyaWRlKT0KIC8vIENIRUNLLVdJVEgtT1ZFUlJJREU6IFB1bmN0dWF0aW9uOiAiOyIgWzIzOjMzIC0gMjM6MzRdIENsYXNzRGVjbD1TOjIyOjcgKERlZmluaXRpb24pCiAKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvYW5ub3RhdGUtdG9rZW5zLmNwcCBiL3Rlc3QvSW5kZXgvYW5ub3RhdGUtdG9rZW5zLmNwcAppbmRleCAxNjcyNjU0Li40NjBhYjUxIDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L2Fubm90YXRlLXRva2Vucy5jcHAKKysrIGIvdGVzdC9JbmRleC9hbm5vdGF0ZS10b2tlbnMuY3BwCkBAIC0yOCw3ICsyOCwxNiBAQAogdGVtcGxhdGUgPGJvb2wgKCp0Zm4pKFgqKT4KIHZvaWQgVFM8dGZuPjo6Zm9vKCkge30KIAotLy8gUlVOOiBjLWluZGV4LXRlc3QgLXRlc3QtYW5ub3RhdGUtdG9rZW5zPSVzOjE6MTozMDoxICVzIC1mbm8tZGVsYXllZC10ZW1wbGF0ZS1wYXJzaW5nIHwgRmlsZUNoZWNrICVzCit2b2lkIHRlc3Q0KCkgeworICBpZiAoaW50IHAgPSAwKQorICAgIHJldHVybjsKK30KKworY2xhc3MgQyB7CisgIH5DKCk7Cit9OworCisvLyBSVU46IGMtaW5kZXgtdGVzdCAtdGVzdC1hbm5vdGF0ZS10b2tlbnM9JXM6MToxOjM4OjEgJXMgLWZuby1kZWxheWVkLXRlbXBsYXRlLXBhcnNpbmcgfCBGaWxlQ2hlY2sgJXMKIC8vIENIRUNLOiBLZXl3b3JkOiAic3RydWN0IiBbMToxIC0gMTo3XSBTdHJ1Y3REZWNsPWJvbms6MTo4IChEZWZpbml0aW9uKQogLy8gQ0hFQ0s6IElkZW50aWZpZXI6ICJib25rIiBbMTo4IC0gMToxMl0gU3RydWN0RGVjbD1ib25rOjE6OCAoRGVmaW5pdGlvbikKIC8vIENIRUNLOiBQdW5jdHVhdGlvbjogInsiIFsxOjEzIC0gMToxNF0gU3RydWN0RGVjbD1ib25rOjE6OCAoRGVmaW5pdGlvbikKQEAgLTY2LDggKzc1LDggQEAKIC8vIENIRUNLOiBLZXl3b3JkOiAib3BlcmF0b3IiIFs5OjUgLSA5OjEzXSBDWFhNZXRob2Q9b3BlcmF0b3IrKzo5OjUKIC8vIENIRUNLOiBQdW5jdHVhdGlvbjogIisrIiBbOToxMyAtIDk6MTVdIENYWE1ldGhvZD1vcGVyYXRvcisrOjk6NQogLy8gQ0hFQ0s6IFB1bmN0dWF0aW9uOiAiKCIgWzk6MTUgLSA5OjE2XSBDWFhNZXRob2Q9b3BlcmF0b3IrKzo5OjUKLS8vIENIRUNLOiBLZXl3b3JkOiAiaW50IiBbOToxNiAtIDk6MTldIFBhcm1EZWNsPTo5OjE5IChEZWZpbml0aW9uKQotLy8gQ0hFQ0s6IFB1bmN0dWF0aW9uOiAiKSIgWzk6MTkgLSA5OjIwXSBQYXJtRGVjbD06OToxOSAoRGVmaW5pdGlvbikKKy8vIENIRUNLOiBLZXl3b3JkOiAiaW50IiBbOToxNiAtIDk6MTldIFBhcm1EZWNsPTo5OjE5IChEZWZpbml0aW9uCisvLyBDSEVDSzogUHVuY3R1YXRpb246ICIpIiBbOToxOSAtIDk6MjBdIENYWE1ldGhvZD1vcGVyYXRvcisrOjk6NQogLy8gQ0hFQ0s6IFB1bmN0dWF0aW9uOiAiOyIgWzk6MjAgLSA5OjIxXSBTdHJ1Y3REZWNsPVg6Nzo4IChEZWZpbml0aW9uKQogLy8gQ0hFQ0s6IFB1bmN0dWF0aW9uOiAifSIgWzEwOjEgLSAxMDoyXSBTdHJ1Y3REZWNsPVg6Nzo4IChEZWZpbml0aW9uKQogLy8gQ0hFQ0s6IFB1bmN0dWF0aW9uOiAiOyIgWzEwOjIgLSAxMDozXQpAQCAtMTM4LDcgKzE0Nyw3IEBACiAvLyBDSEVDSzogUHVuY3R1YXRpb246ICIoIiBbMjM6MjIgLSAyMzoyM10gTm9uVHlwZVRlbXBsYXRlUGFyYW1ldGVyPXRmbjoyMzoxOCAoRGVmaW5pdGlvbikKIC8vIENIRUNLOiBJZGVudGlmaWVyOiAiWCIgWzIzOjIzIC0gMjM6MjRdIFR5cGVSZWY9c3RydWN0IFg6Nzo4CiAvLyBDSEVDSzogUHVuY3R1YXRpb246ICIqIiBbMjM6MjQgLSAyMzoyNV0gUGFybURlY2w9OjIzOjI1IChEZWZpbml0aW9uKQotLy8gQ0hFQ0s6IFB1bmN0dWF0aW9uOiAiKSIgWzIzOjI1IC0gMjM6MjZdIFBhcm1EZWNsPToyMzoyNSAoRGVmaW5pdGlvbikKKy8vIENIRUNLOiBQdW5jdHVhdGlvbjogIikiIFsyMzoyNSAtIDIzOjI2XSBOb25UeXBlVGVtcGxhdGVQYXJhbWV0ZXI9dGZuOjIzOjE4IChEZWZpbml0aW9uKQogLy8gQ0hFQ0s6IFB1bmN0dWF0aW9uOiAiPiIgWzIzOjI2IC0gMjM6MjddIENsYXNzVGVtcGxhdGU9VFM6MjQ6OCAoRGVmaW5pdGlvbikKIC8vIENIRUNLOiBLZXl3b3JkOiAic3RydWN0IiBbMjQ6MSAtIDI0OjddIENsYXNzVGVtcGxhdGU9VFM6MjQ6OCAoRGVmaW5pdGlvbikKIC8vIENIRUNLOiBJZGVudGlmaWVyOiAiVFMiIFsyNDo4IC0gMjQ6MTBdIENsYXNzVGVtcGxhdGU9VFM6MjQ6OCAoRGVmaW5pdGlvbikKQEAgLTE2MCw3ICsxNjksNyBAQAogLy8gQ0hFQ0s6IFB1bmN0dWF0aW9uOiAiKCIgWzI4OjIyIC0gMjg6MjNdIE5vblR5cGVUZW1wbGF0ZVBhcmFtZXRlcj10Zm46Mjg6MTggKERlZmluaXRpb24pCiAvLyBDSEVDSzogSWRlbnRpZmllcjogIlgiIFsyODoyMyAtIDI4OjI0XSBUeXBlUmVmPXN0cnVjdCBYOjc6OAogLy8gQ0hFQ0s6IFB1bmN0dWF0aW9uOiAiKiIgWzI4OjI0IC0gMjg6MjVdIFBhcm1EZWNsPToyODoyNSAoRGVmaW5pdGlvbikKLS8vIENIRUNLOiBQdW5jdHVhdGlvbjogIikiIFsyODoyNSAtIDI4OjI2XSBQYXJtRGVjbD06Mjg6MjUgKERlZmluaXRpb24pCisvLyBDSEVDSzogUHVuY3R1YXRpb246ICIpIiBbMjg6MjUgLSAyODoyNl0gTm9uVHlwZVRlbXBsYXRlUGFyYW1ldGVyPXRmbjoyODoxOCAoRGVmaW5pdGlvbikKIC8vIENIRUNLOiBQdW5jdHVhdGlvbjogIj4iIFsyODoyNiAtIDI4OjI3XSBDWFhNZXRob2Q9Zm9vOjI5OjE1IChEZWZpbml0aW9uKQogLy8gQ0hFQ0s6IEtleXdvcmQ6ICJ2b2lkIiBbMjk6MSAtIDI5OjVdIENYWE1ldGhvZD1mb286Mjk6MTUgKERlZmluaXRpb24pCiAvLyBDSEVDSzogSWRlbnRpZmllcjogIlRTIiBbMjk6NiAtIDI5OjhdIFRlbXBsYXRlUmVmPVRTOjI0OjgKQEAgLTE3MywzICsxODIsMTIgQEAKIC8vIENIRUNLOiBQdW5jdHVhdGlvbjogIikiIFsyOToxOSAtIDI5OjIwXSBDWFhNZXRob2Q9Zm9vOjI5OjE1IChEZWZpbml0aW9uKQogLy8gQ0hFQ0s6IFB1bmN0dWF0aW9uOiAieyIgWzI5OjIxIC0gMjk6MjJdIENvbXBvdW5kU3RtdD0KIC8vIENIRUNLOiBQdW5jdHVhdGlvbjogIn0iIFsyOToyMiAtIDI5OjIzXSBDb21wb3VuZFN0bXQ9CisvLyBDSEVDSzogUHVuY3R1YXRpb246ICJ+IiBbMzc6MyAtIDM3OjRdIENYWERlc3RydWN0b3I9fkM6Mzc6MworLy8gQ0hFQ0s6IElkZW50aWZpZXI6ICJDIiBbMzc6NCAtIDM3OjVdIENYWERlc3RydWN0b3I9fkM6Mzc6MworCisvLyBSVU46IGVudiBMSUJDTEFOR19ESVNBQkxFX0NSQVNIX1JFQ09WRVJZPTEgYy1pbmRleC10ZXN0IC10ZXN0LWFubm90YXRlLXRva2Vucz0lczozMjoxOjMyOjEzICVzIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9Q0hFQ0syCisvLyBDSEVDSzI6IEtleXdvcmQ6ICJpZiIgWzMyOjMgLSAzMjo1XSBJZlN0bXQ9CisvLyBDSEVDSzI6IFB1bmN0dWF0aW9uOiAiKCIgWzMyOjYgLSAzMjo3XSBJZlN0bXQ9CisvLyBDSEVDSzI6IEtleXdvcmQ6ICJpbnQiIFszMjo3IC0gMzI6MTBdIFZhckRlY2w9cDozMjoxMSAoRGVmaW5pdGlvbikKKy8vIENIRUNLMjogSWRlbnRpZmllcjogInAiIFszMjoxMSAtIDMyOjEyXSBWYXJEZWNsPXA6MzI6MTEgKERlZmluaXRpb24pCisvLyBDSEVDSzI6IFB1bmN0dWF0aW9uOiAiPSIgWzMyOjEzIC0gMzI6MTRdIFZhckRlY2w9cDozMjoxMSAoRGVmaW5pdGlvbikKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvY29tbWVudC1jcGx1cy1kZWNscy5jcHAgYi90ZXN0L0luZGV4L2NvbW1lbnQtY3BsdXMtZGVjbHMuY3BwCmluZGV4IGRlMWMyYzUuLjAwMjQ4MmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvSW5kZXgvY29tbWVudC1jcGx1cy1kZWNscy5jcHAKKysrIGIvdGVzdC9JbmRleC9jb21tZW50LWNwbHVzLWRlY2xzLmNwcApAQCAtNDIsNyArNDIsNyBAQAogLy8gQ0hFQ0s6IDxEZWNsYXJhdGlvbj5jbGFzcyBUZXN0IHt9PC9EZWNsYXJhdGlvbj4KIC8vIENIRUNLOiA8RGVjbGFyYXRpb24+VGVzdCgpIDogcmVzZXJ2ZWQobmV3IFRlc3Q6OmRhdGEoKSk8L0RlY2xhcmF0aW9uPgogLy8gQ0hFQ0s6IDxEZWNsYXJhdGlvbj51bnNpZ25lZCBpbnQgZ2V0SUQoKSBjb25zdDwvRGVjbGFyYXRpb24+Ci0vLyBDSEVDSzogPERlY2xhcmF0aW9uPnZvaWQgflRlc3QoKTwvRGVjbGFyYXRpb24+CisvLyBDSEVDSzogPERlY2xhcmF0aW9uPn5UZXN0KCk8L0RlY2xhcmF0aW9uPgogLy8gQ0hFQ0s6IDxEZWNsYXJhdGlvbj5UZXN0OjpkYXRhICpyZXNlcnZlZDwvRGVjbGFyYXRpb24+CiAKIApkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9jb21tZW50LWNwbHVzLXRlbXBsYXRlLWRlY2xzLmNwcCBiL3Rlc3QvSW5kZXgvY29tbWVudC1jcGx1cy10ZW1wbGF0ZS1kZWNscy5jcHAKaW5kZXggMDM5ZjA5Mi4uOTUxMGM3YyAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9jb21tZW50LWNwbHVzLXRlbXBsYXRlLWRlY2xzLmNwcAorKysgYi90ZXN0L0luZGV4L2NvbW1lbnQtY3BsdXMtdGVtcGxhdGUtZGVjbHMuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiB9OwogLy8gQ0hFQ0s6IDxEZWNsYXJhdGlvbj50ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgVCZndDsgc3RydWN0IEEge308L0RlY2xhcmF0aW9uPgogLy8gQ0hFQ0s6IDxEZWNsYXJhdGlvbj5BJmx0O1QmZ3Q7KCk8L0RlY2xhcmF0aW9uPgotLy8gQ0hFQ0s6IDxEZWNsYXJhdGlvbj52b2lkIH5BJmx0O1QmZ3Q7KCk8L0RlY2xhcmF0aW9uPgorLy8gQ0hFQ0s6IDxEZWNsYXJhdGlvbj5+QSZsdDtUJmd0OygpPC9EZWNsYXJhdGlvbj4KIAogLyoqCiAgKiBcQnJpZWYgRWVlCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L2NvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAgYi90ZXN0L0luZGV4L2NvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAKaW5kZXggOGMwZWQyMS4uMzI3ZmE2NCAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwCisrKyBiL3Rlc3QvSW5kZXgvY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcApAQCAtMjUsMTkgKzI1LDIzIEBACiAjaWZuZGVmIEhFQURFUgogI2RlZmluZSBIRUFERVIKIAotLy8vIEFhYS4KLXZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMSgpOworLy89PT0tLS0KKy8vIFRlc3RzIGZvciBcYnJpZWYgYW5kIGl0cyBhbGlhc2VzLgorLy89PT0tLS0KIAotLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPWNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8cCBjbGFzcz0icGFyYS1icmllZiI+IEFhYS48L3A+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTwvTmFtZT48VVNSPmM6QEZAY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMSM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xKCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWFhLjwvUGFyYT48L0Fic3RyYWN0PjwvRnVuY3Rpb24+XQorLy8vIEFhYS4KK3ZvaWQgdGVzdF9jbWRfYnJpZWZfbGlrZV8xKCk7CisKKy8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD10ZXN0X2NtZF9icmllZl9saWtlXzE6e3suKn19IEJyaWVmQ29tbWVudD1bQWFhLl0gRnVsbENvbW1lbnRBc0hUTUw9WzxwIGNsYXNzPSJwYXJhLWJyaWVmIj4gQWFhLjwvcD5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2NtZF9icmllZl9saWtlXzE8L05hbWU+PFVTUj5jOkBGQHRlc3RfY21kX2JyaWVmX2xpa2VfMSM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCB0ZXN0X2NtZF9icmllZl9saWtlXzEoKTwvRGVjbGFyYXRpb24+PEFic3RyYWN0PjxQYXJhPiBBYWEuPC9QYXJhPjwvQWJzdHJhY3Q+PC9GdW5jdGlvbj5dCiAvLyBDSEVDSy1ORVhUOiAgQ29tbWVudEFTVD1bCiAvLyBDSEVDSy1ORVhUOiAgICAoQ1hDb21tZW50X0Z1bGxDb21tZW50CiAvLyBDSEVDSy1ORVhUOiAgICAgICAoQ1hDb21tZW50X1BhcmFncmFwaAogLy8gQ0hFQ0stTkVYVDogICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIEFhYS5dKSkpXQogCiAvLy8gXGJyaWVmIEFhYS4KLXZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMigpOwordm9pZCB0ZXN0X2NtZF9icmllZl9saWtlXzIoKTsKIAotLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPWNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzI6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8cCBjbGFzcz0icGFyYS1icmllZiI+IEFhYS48L3A+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMjwvTmFtZT48VVNSPmM6QEZAY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMiM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8yKCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWFhLjwvUGFyYT48L0Fic3RyYWN0PjwvRnVuY3Rpb24+XQorLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPXRlc3RfY21kX2JyaWVmX2xpa2VfMjp7ey4qfX0gQnJpZWZDb21tZW50PVtBYWEuXSBGdWxsQ29tbWVudEFzSFRNTD1bPHAgY2xhc3M9InBhcmEtYnJpZWYiPiBBYWEuPC9wPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPnRlc3RfY21kX2JyaWVmX2xpa2VfMjwvTmFtZT48VVNSPmM6QEZAdGVzdF9jbWRfYnJpZWZfbGlrZV8yIzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIHRlc3RfY21kX2JyaWVmX2xpa2VfMigpPC9EZWNsYXJhdGlvbj48QWJzdHJhY3Q+PFBhcmE+IEFhYS48L1BhcmE+PC9BYnN0cmFjdD48L0Z1bmN0aW9uPl0KIC8vIENIRUNLLU5FWFQ6ICBDb21tZW50QVNUPVsKIC8vIENIRUNLLU5FWFQ6ICAgIChDWENvbW1lbnRfRnVsbENvbW1lbnQKIC8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoIElzV2hpdGVzcGFjZQpAQCAtNDcsOSArNTEsOSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIChDWENvbW1lbnRfVGV4dCBUZXh0PVsgQWFhLl0pKSkpXQogCiAvLy8gXHNob3J0IEFhYS4KLXZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMygpOwordm9pZCB0ZXN0X2NtZF9icmllZl9saWtlXzMoKTsKIAotLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPWNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzM6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8cCBjbGFzcz0icGFyYS1icmllZiI+IEFhYS48L3A+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMzwvTmFtZT48VVNSPmM6QEZAY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMyM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8zKCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWFhLjwvUGFyYT48L0Fic3RyYWN0PjwvRnVuY3Rpb24+XQorLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPXRlc3RfY21kX2JyaWVmX2xpa2VfMzp7ey4qfX0gQnJpZWZDb21tZW50PVtBYWEuXSBGdWxsQ29tbWVudEFzSFRNTD1bPHAgY2xhc3M9InBhcmEtYnJpZWYiPiBBYWEuPC9wPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPnRlc3RfY21kX2JyaWVmX2xpa2VfMzwvTmFtZT48VVNSPmM6QEZAdGVzdF9jbWRfYnJpZWZfbGlrZV8zIzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIHRlc3RfY21kX2JyaWVmX2xpa2VfMygpPC9EZWNsYXJhdGlvbj48QWJzdHJhY3Q+PFBhcmE+IEFhYS48L1BhcmE+PC9BYnN0cmFjdD48L0Z1bmN0aW9uPl0KIC8vIENIRUNLLU5FWFQ6ICBDb21tZW50QVNUPVsKIC8vIENIRUNLLU5FWFQ6ICAgIChDWENvbW1lbnRfRnVsbENvbW1lbnQKIC8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoIElzV2hpdGVzcGFjZQpAQCAtNjEsOSArNjUsOSBAQAogLy8vIEFhYS4KIC8vLwogLy8vIFxicmllZiBCYmIuCi12b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzQoKTsKK3ZvaWQgdGVzdF9jbWRfYnJpZWZfbGlrZV80KCk7CiAKLS8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD1jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl80Ont7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPHAgY2xhc3M9InBhcmEtYnJpZWYiPiBCYmIuPC9wPjxwPiBBYWEuPC9wPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPmNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzQ8L05hbWU+PFVTUj5jOkBGQGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzQjPC9VU1I+PERlY2xhcmF0aW9uPnZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fNCgpPC9EZWNsYXJhdGlvbj48QWJzdHJhY3Q+PFBhcmE+IEJiYi48L1BhcmE+PC9BYnN0cmFjdD48RGlzY3Vzc2lvbj48UGFyYT4gQWFhLjwvUGFyYT48L0Rpc2N1c3Npb24+PC9GdW5jdGlvbj5dCisvLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9dGVzdF9jbWRfYnJpZWZfbGlrZV80Ont7Lip9fSBCcmllZkNvbW1lbnQ9W0JiYi5dIEZ1bGxDb21tZW50QXNIVE1MPVs8cCBjbGFzcz0icGFyYS1icmllZiI+IEJiYi48L3A+PHA+IEFhYS48L3A+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+dGVzdF9jbWRfYnJpZWZfbGlrZV80PC9OYW1lPjxVU1I+YzpARkB0ZXN0X2NtZF9icmllZl9saWtlXzQjPC9VU1I+PERlY2xhcmF0aW9uPnZvaWQgdGVzdF9jbWRfYnJpZWZfbGlrZV80KCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQmJiLjwvUGFyYT48L0Fic3RyYWN0PjxEaXNjdXNzaW9uPjxQYXJhPiBBYWEuPC9QYXJhPjwvRGlzY3Vzc2lvbj48L0Z1bmN0aW9uPl0KIC8vIENIRUNLLU5FWFQ6ICBDb21tZW50QVNUPVsKIC8vIENIRUNLLU5FWFQ6ICAgIChDWENvbW1lbnRfRnVsbENvbW1lbnQKIC8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoCkBAIC03OSw5ICs4Myw5IEBACiAvLy8gXGJyaWVmIEJiYi4KIC8vLwogLy8vIENjYy4KLXZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fNSgpOwordm9pZCB0ZXN0X2NtZF9icmllZl9saWtlXzUoKTsKIAotLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPWNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzU6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8cCBjbGFzcz0icGFyYS1icmllZiI+IEJiYi48L3A+PHA+IEFhYS48L3A+PHA+IENjYy48L3A+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fNTwvTmFtZT48VVNSPmM6QEZAY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fNSM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl81KCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQmJiLjwvUGFyYT48L0Fic3RyYWN0PjxEaXNjdXNzaW9uPjxQYXJhPiBBYWEuPC9QYXJhPjxQYXJhPiBDY2MuPC9QYXJhPjwvRGlzY3Vzc2lvbj48L0Z1bmN0aW9uPl0KKy8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD10ZXN0X2NtZF9icmllZl9saWtlXzU6e3suKn19IEJyaWVmQ29tbWVudD1bQmJiLl0gRnVsbENvbW1lbnRBc0hUTUw9WzxwIGNsYXNzPSJwYXJhLWJyaWVmIj4gQmJiLjwvcD48cD4gQWFhLjwvcD48cD4gQ2NjLjwvcD5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2NtZF9icmllZl9saWtlXzU8L05hbWU+PFVTUj5jOkBGQHRlc3RfY21kX2JyaWVmX2xpa2VfNSM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCB0ZXN0X2NtZF9icmllZl9saWtlXzUoKTwvRGVjbGFyYXRpb24+PEFic3RyYWN0PjxQYXJhPiBCYmIuPC9QYXJhPjwvQWJzdHJhY3Q+PERpc2N1c3Npb24+PFBhcmE+IEFhYS48L1BhcmE+PFBhcmE+IENjYy48L1BhcmE+PC9EaXNjdXNzaW9uPjwvRnVuY3Rpb24+XQogLy8gQ0hFQ0stTkVYVDogIENvbW1lbnRBU1Q9WwogLy8gQ0hFQ0stTkVYVDogICAgKENYQ29tbWVudF9GdWxsQ29tbWVudAogLy8gQ0hFQ0stTkVYVDogICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGgKQEAgLTk2LDkgKzEwMCw5IEBACiAKIC8vLyBcYnJpZWYgQWFhLgogLy8vIFxicmllZiBCYmIuCi12b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzYoKTsKK3ZvaWQgdGVzdF9jbWRfYnJpZWZfbGlrZV82KCk7CiAKLS8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD1jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl82Ont7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPHAgY2xhc3M9InBhcmEtYnJpZWYiPiBBYWEuIDwvcD48cCBjbGFzcz0icGFyYS1icmllZiI+IEJiYi48L3A+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fNjwvTmFtZT48VVNSPmM6QEZAY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fNiM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl82KCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWFhLiA8L1BhcmE+PC9BYnN0cmFjdD48RGlzY3Vzc2lvbj48UGFyYT4gQmJiLjwvUGFyYT48L0Rpc2N1c3Npb24+PC9GdW5jdGlvbj5dCisvLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9dGVzdF9jbWRfYnJpZWZfbGlrZV82Ont7Lip9fSBCcmllZkNvbW1lbnQ9W0JiYi5dIEZ1bGxDb21tZW50QXNIVE1MPVs8cCBjbGFzcz0icGFyYS1icmllZiI+IEFhYS4gPC9wPjxwIGNsYXNzPSJwYXJhLWJyaWVmIj4gQmJiLjwvcD5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2NtZF9icmllZl9saWtlXzY8L05hbWU+PFVTUj5jOkBGQHRlc3RfY21kX2JyaWVmX2xpa2VfNiM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCB0ZXN0X2NtZF9icmllZl9saWtlXzYoKTwvRGVjbGFyYXRpb24+PEFic3RyYWN0PjxQYXJhPiBBYWEuIDwvUGFyYT48L0Fic3RyYWN0PjxEaXNjdXNzaW9uPjxQYXJhPiBCYmIuPC9QYXJhPjwvRGlzY3Vzc2lvbj48L0Z1bmN0aW9uPl0KIC8vIENIRUNLLU5FWFQ6ICBDb21tZW50QVNUPVsKIC8vIENIRUNLLU5FWFQ6ICAgIChDWENvbW1lbnRfRnVsbENvbW1lbnQKIC8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoIElzV2hpdGVzcGFjZQpAQCAtMTExLDEyICsxMTUsMzIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGgKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIEJiYi5dKSkpKV0KIAorLy8vIFxhYnN0cmFjdCBBYWEuCisvLy8KKy8vLyBCYmIuCit2b2lkIHRlc3RfY21kX2JyaWVmX2xpa2VfNygpOworCisvLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9dGVzdF9jbWRfYnJpZWZfbGlrZV83Ont7Lip9fSBCcmllZkNvbW1lbnQ9W0FhYS5dIEZ1bGxDb21tZW50QXNIVE1MPVs8cCBjbGFzcz0icGFyYS1icmllZiI+IEFhYS48L3A+PHA+IEJiYi48L3A+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+dGVzdF9jbWRfYnJpZWZfbGlrZV83PC9OYW1lPjxVU1I+YzpARkB0ZXN0X2NtZF9icmllZl9saWtlXzcjPC9VU1I+PERlY2xhcmF0aW9uPnZvaWQgdGVzdF9jbWRfYnJpZWZfbGlrZV83KCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWFhLjwvUGFyYT48L0Fic3RyYWN0PjxEaXNjdXNzaW9uPjxQYXJhPiBCYmIuPC9QYXJhPjwvRGlzY3Vzc2lvbj48L0Z1bmN0aW9uPl0KKy8vIENIRUNLLU5FWFQ6ICBDb21tZW50QVNUPVsKKy8vIENIRUNLLU5FWFQ6ICAgIChDWENvbW1lbnRfRnVsbENvbW1lbnQKKy8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoIElzV2hpdGVzcGFjZQorLy8gQ0hFQ0stTkVYVDogICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIF0gSXNXaGl0ZXNwYWNlKSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfQmxvY2tDb21tYW5kIENvbW1hbmROYW1lPVthYnN0cmFjdF0KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGgKKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIEFhYS5dKSkpCisvLyBDSEVDSy1ORVhUOiAgICAgICAoQ1hDb21tZW50X1BhcmFncmFwaAorLy8gQ0hFQ0stTkVYVDogICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIEJiYi5dKSkpXQorCisvLz09PS0tLQorLy8gVGVzdHMgZm9yIFxyZXR1cm5zIGFuZCBpdHMgYWxpYXNlcy4KKy8vPT09LS0tCisKIC8vLyBBYWEuCiAvLy8KIC8vLyBccmV0dXJuIEJiYi4KLXZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fNygpOwordm9pZCB0ZXN0X2NtZF9yZXR1cm5zX2xpa2VfMSgpOwogCi0vLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fNzp7ey4qfX0gRnVsbENvbW1lbnRBc0hUTUw9WzxwIGNsYXNzPSJwYXJhLWJyaWVmIj4gQWFhLjwvcD48ZGl2IGNsYXNzPSJyZXN1bHQtZGlzY3Vzc2lvbiI+PHAgY2xhc3M9InBhcmEtcmV0dXJucyI+PHNwYW4gY2xhc3M9IndvcmQtcmV0dXJucyI+UmV0dXJuczwvc3Bhbj4gIEJiYi48L3A+PC9kaXY+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fNzwvTmFtZT48VVNSPmM6QEZAY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fNyM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl83KCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWFhLjwvUGFyYT48L0Fic3RyYWN0PjxSZXN1bHREaXNjdXNzaW9uPjxQYXJhPiBCYmIuPC9QYXJhPjwvUmVzdWx0RGlzY3Vzc2lvbj48L0Z1bmN0aW9uPl0KKy8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD10ZXN0X2NtZF9yZXR1cm5zX2xpa2VfMTp7ey4qfX0gRnVsbENvbW1lbnRBc0hUTUw9WzxwIGNsYXNzPSJwYXJhLWJyaWVmIj4gQWFhLjwvcD48ZGl2IGNsYXNzPSJyZXN1bHQtZGlzY3Vzc2lvbiI+PHAgY2xhc3M9InBhcmEtcmV0dXJucyI+PHNwYW4gY2xhc3M9IndvcmQtcmV0dXJucyI+UmV0dXJuczwvc3Bhbj4gIEJiYi48L3A+PC9kaXY+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+dGVzdF9jbWRfcmV0dXJuc19saWtlXzE8L05hbWU+PFVTUj5jOkBGQHRlc3RfY21kX3JldHVybnNfbGlrZV8xIzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIHRlc3RfY21kX3JldHVybnNfbGlrZV8xKCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWFhLjwvUGFyYT48L0Fic3RyYWN0PjxSZXN1bHREaXNjdXNzaW9uPjxQYXJhPiBCYmIuPC9QYXJhPjwvUmVzdWx0RGlzY3Vzc2lvbj48L0Z1bmN0aW9uPl0KIAogLy8gQ0hFQ0stTkVYVDogIENvbW1lbnRBU1Q9WwogLy8gQ0hFQ0stTkVYVDogICAgKENYQ29tbWVudF9GdWxsQ29tbWVudApAQCAtMTMxLDkgKzE1NSw5IEBACiAvLy8gQWFhLgogLy8vCiAvLy8gXHJldHVybnMgQmJiLgotdm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl84KCk7Cit2b2lkIHRlc3RfY21kX3JldHVybnNfbGlrZV8yKCk7CiAKLS8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD1jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl84Ont7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPHAgY2xhc3M9InBhcmEtYnJpZWYiPiBBYWEuPC9wPjxkaXYgY2xhc3M9InJlc3VsdC1kaXNjdXNzaW9uIj48cCBjbGFzcz0icGFyYS1yZXR1cm5zIj48c3BhbiBjbGFzcz0id29yZC1yZXR1cm5zIj5SZXR1cm5zPC9zcGFuPiAgQmJiLjwvcD48L2Rpdj5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT5jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl84PC9OYW1lPjxVU1I+YzpARkBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl84IzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzgoKTwvRGVjbGFyYXRpb24+PEFic3RyYWN0PjxQYXJhPiBBYWEuPC9QYXJhPjwvQWJzdHJhY3Q+PFJlc3VsdERpc2N1c3Npb24+PFBhcmE+IEJiYi48L1BhcmE+PC9SZXN1bHREaXNjdXNzaW9uPjwvRnVuY3Rpb24+XQorLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPXRlc3RfY21kX3JldHVybnNfbGlrZV8yOnt7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPHAgY2xhc3M9InBhcmEtYnJpZWYiPiBBYWEuPC9wPjxkaXYgY2xhc3M9InJlc3VsdC1kaXNjdXNzaW9uIj48cCBjbGFzcz0icGFyYS1yZXR1cm5zIj48c3BhbiBjbGFzcz0id29yZC1yZXR1cm5zIj5SZXR1cm5zPC9zcGFuPiAgQmJiLjwvcD48L2Rpdj5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2NtZF9yZXR1cm5zX2xpa2VfMjwvTmFtZT48VVNSPmM6QEZAdGVzdF9jbWRfcmV0dXJuc19saWtlXzIjPC9VU1I+PERlY2xhcmF0aW9uPnZvaWQgdGVzdF9jbWRfcmV0dXJuc19saWtlXzIoKTwvRGVjbGFyYXRpb24+PEFic3RyYWN0PjxQYXJhPiBBYWEuPC9QYXJhPjwvQWJzdHJhY3Q+PFJlc3VsdERpc2N1c3Npb24+PFBhcmE+IEJiYi48L1BhcmE+PC9SZXN1bHREaXNjdXNzaW9uPjwvRnVuY3Rpb24+XQogLy8gQ0hFQ0stTkVYVDogIENvbW1lbnRBU1Q9WwogLy8gQ0hFQ0stTkVYVDogICAgKENYQ29tbWVudF9GdWxsQ29tbWVudAogLy8gQ0hFQ0stTkVYVDogICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGgKQEAgLTE0Nyw5ICsxNzEsOSBAQAogLy8vIEFhYS4KIC8vLwogLy8vIFxyZXN1bHQgQmJiLgotdm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl85KCk7Cit2b2lkIHRlc3RfY21kX3JldHVybnNfbGlrZV8zKCk7CiAKLS8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD1jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl85Ont7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPHAgY2xhc3M9InBhcmEtYnJpZWYiPiBBYWEuPC9wPjxkaXYgY2xhc3M9InJlc3VsdC1kaXNjdXNzaW9uIj48cCBjbGFzcz0icGFyYS1yZXR1cm5zIj48c3BhbiBjbGFzcz0id29yZC1yZXR1cm5zIj5SZXR1cm5zPC9zcGFuPiAgQmJiLjwvcD48L2Rpdj5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT5jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl85PC9OYW1lPjxVU1I+YzpARkBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl85IzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzkoKTwvRGVjbGFyYXRpb24+PEFic3RyYWN0PjxQYXJhPiBBYWEuPC9QYXJhPjwvQWJzdHJhY3Q+PFJlc3VsdERpc2N1c3Npb24+PFBhcmE+IEJiYi48L1BhcmE+PC9SZXN1bHREaXNjdXNzaW9uPjwvRnVuY3Rpb24+XQorLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPXRlc3RfY21kX3JldHVybnNfbGlrZV8zOnt7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPHAgY2xhc3M9InBhcmEtYnJpZWYiPiBBYWEuPC9wPjxkaXYgY2xhc3M9InJlc3VsdC1kaXNjdXNzaW9uIj48cCBjbGFzcz0icGFyYS1yZXR1cm5zIj48c3BhbiBjbGFzcz0id29yZC1yZXR1cm5zIj5SZXR1cm5zPC9zcGFuPiAgQmJiLjwvcD48L2Rpdj5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2NtZF9yZXR1cm5zX2xpa2VfMzwvTmFtZT48VVNSPmM6QEZAdGVzdF9jbWRfcmV0dXJuc19saWtlXzMjPC9VU1I+PERlY2xhcmF0aW9uPnZvaWQgdGVzdF9jbWRfcmV0dXJuc19saWtlXzMoKTwvRGVjbGFyYXRpb24+PEFic3RyYWN0PjxQYXJhPiBBYWEuPC9QYXJhPjwvQWJzdHJhY3Q+PFJlc3VsdERpc2N1c3Npb24+PFBhcmE+IEJiYi48L1BhcmE+PC9SZXN1bHREaXNjdXNzaW9uPjwvRnVuY3Rpb24+XQogLy8gQ0hFQ0stTkVYVDogIENvbW1lbnRBU1Q9WwogLy8gQ0hFQ0stTkVYVDogICAgKENYQ29tbWVudF9GdWxsQ29tbWVudAogLy8gQ0hFQ0stTkVYVDogICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGgKQEAgLTE2Miw5ICsxODYsOSBAQAogCiAvLy8gXHJldHVybnMgQWFhLgogLy8vIFxyZXR1cm5zIEJiYi4KLXZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTAoKTsKK3ZvaWQgdGVzdF9jbWRfcmV0dXJuc19saWtlXzQoKTsKIAotLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPWNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzEwOnt7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPGRpdiBjbGFzcz0icmVzdWx0LWRpc2N1c3Npb24iPjxwIGNsYXNzPSJwYXJhLXJldHVybnMiPjxzcGFuIGNsYXNzPSJ3b3JkLXJldHVybnMiPlJldHVybnM8L3NwYW4+ICBBYWEuIDwvcD48cCBjbGFzcz0icGFyYS1yZXR1cm5zIj48c3BhbiBjbGFzcz0id29yZC1yZXR1cm5zIj5SZXR1cm5zPC9zcGFuPiAgQmJiLjwvcD48L2Rpdj5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT5jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xMDwvTmFtZT48VVNSPmM6QEZAY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTAjPC9VU1I+PERlY2xhcmF0aW9uPnZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTAoKTwvRGVjbGFyYXRpb24+PFJlc3VsdERpc2N1c3Npb24+PFBhcmE+IEFhYS4gPC9QYXJhPjxQYXJhPiBCYmIuPC9QYXJhPjwvUmVzdWx0RGlzY3Vzc2lvbj48L0Z1bmN0aW9uPl0KKy8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD10ZXN0X2NtZF9yZXR1cm5zX2xpa2VfNDp7ey4qfX0gRnVsbENvbW1lbnRBc0hUTUw9WzxkaXYgY2xhc3M9InJlc3VsdC1kaXNjdXNzaW9uIj48cCBjbGFzcz0icGFyYS1yZXR1cm5zIj48c3BhbiBjbGFzcz0id29yZC1yZXR1cm5zIj5SZXR1cm5zPC9zcGFuPiAgQWFhLiA8L3A+PHAgY2xhc3M9InBhcmEtcmV0dXJucyI+PHNwYW4gY2xhc3M9IndvcmQtcmV0dXJucyI+UmV0dXJuczwvc3Bhbj4gIEJiYi48L3A+PC9kaXY+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+dGVzdF9jbWRfcmV0dXJuc19saWtlXzQ8L05hbWU+PFVTUj5jOkBGQHRlc3RfY21kX3JldHVybnNfbGlrZV80IzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIHRlc3RfY21kX3JldHVybnNfbGlrZV80KCk8L0RlY2xhcmF0aW9uPjxSZXN1bHREaXNjdXNzaW9uPjxQYXJhPiBBYWEuIDwvUGFyYT48UGFyYT4gQmJiLjwvUGFyYT48L1Jlc3VsdERpc2N1c3Npb24+PC9GdW5jdGlvbj5dCiAvLyBDSEVDSy1ORVhUOiAgQ29tbWVudEFTVD1bCiAvLyBDSEVDSy1ORVhUOiAgICAoQ1hDb21tZW50X0Z1bGxDb21tZW50CiAvLyBDSEVDSy1ORVhUOiAgICAgICAoQ1hDb21tZW50X1BhcmFncmFwaCBJc1doaXRlc3BhY2UKQEAgLTE4Miw5ICsyMDYsOSBAQAogLy8vIEJiYi4KIC8vLwogLy8vIFxyZXR1cm5zIENjYy4KLXZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTEoKTsKK3ZvaWQgdGVzdF9jbWRfcmV0dXJuc19saWtlXzUoKTsKIAotLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPWNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzExOnt7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPHAgY2xhc3M9InBhcmEtYnJpZWYiPiBBYWEuPC9wPjxwPiBCYmIuPC9wPjxkaXYgY2xhc3M9InJlc3VsdC1kaXNjdXNzaW9uIj48cCBjbGFzcz0icGFyYS1yZXR1cm5zIj48c3BhbiBjbGFzcz0id29yZC1yZXR1cm5zIj5SZXR1cm5zPC9zcGFuPiAgQ2NjLjwvcD48L2Rpdj5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT5jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xMTwvTmFtZT48VVNSPmM6QEZAY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTEjPC9VU1I+PERlY2xhcmF0aW9uPnZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTEoKTwvRGVjbGFyYXRpb24+PEFic3RyYWN0PjxQYXJhPiBBYWEuPC9QYXJhPjwvQWJzdHJhY3Q+PFJlc3VsdERpc2N1c3Npb24+PFBhcmE+IENjYy48L1BhcmE+PC9SZXN1bHREaXNjdXNzaW9uPjxEaXNjdXNzaW9uPjxQYXJhPiBCYmIuPC9QYXJhPjwvRGlzY3Vzc2lvbj48L0Z1bmN0aW9uPl0KKy8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD10ZXN0X2NtZF9yZXR1cm5zX2xpa2VfNTp7ey4qfX0gRnVsbENvbW1lbnRBc0hUTUw9WzxwIGNsYXNzPSJwYXJhLWJyaWVmIj4gQWFhLjwvcD48cD4gQmJiLjwvcD48ZGl2IGNsYXNzPSJyZXN1bHQtZGlzY3Vzc2lvbiI+PHAgY2xhc3M9InBhcmEtcmV0dXJucyI+PHNwYW4gY2xhc3M9IndvcmQtcmV0dXJucyI+UmV0dXJuczwvc3Bhbj4gIENjYy48L3A+PC9kaXY+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+dGVzdF9jbWRfcmV0dXJuc19saWtlXzU8L05hbWU+PFVTUj5jOkBGQHRlc3RfY21kX3JldHVybnNfbGlrZV81IzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIHRlc3RfY21kX3JldHVybnNfbGlrZV81KCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWFhLjwvUGFyYT48L0Fic3RyYWN0PjxSZXN1bHREaXNjdXNzaW9uPjxQYXJhPiBDY2MuPC9QYXJhPjwvUmVzdWx0RGlzY3Vzc2lvbj48RGlzY3Vzc2lvbj48UGFyYT4gQmJiLjwvUGFyYT48L0Rpc2N1c3Npb24+PC9GdW5jdGlvbj5dCiAvLyBDSEVDSy1ORVhUOiAgQ29tbWVudEFTVD1bCiAvLyBDSEVDSy1ORVhUOiAgICAoQ1hDb21tZW50X0Z1bGxDb21tZW50CiAvLyBDSEVDSy1ORVhUOiAgICAgICAoQ1hDb21tZW50X1BhcmFncmFwaApAQCAtMTk3LDEwICsyMjEsMTQgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGgKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIENjYy5dKSkpKV0KIAotLy8vIFxwYXJhbQotdm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xMihpbnQgeDEpOworLy89PT0tLS0KKy8vIFRlc3RzIGZvciBccGFyYW0uCisvLz09PS0tLQogCi0vLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTI6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVtdIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT5jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xMjwvTmFtZT48VVNSPmM6QEZAY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTIjSSM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xMihpbnQgeDEpPC9EZWNsYXJhdGlvbj48L0Z1bmN0aW9uPl0KKy8vLyBccGFyYW0KK3ZvaWQgdGVzdF9jbWRfcGFyYW1fMShpbnQgeDEpOworCisvLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9dGVzdF9jbWRfcGFyYW1fMTp7ey4qfX0gRnVsbENvbW1lbnRBc0hUTUw9W10gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPnRlc3RfY21kX3BhcmFtXzE8L05hbWU+PFVTUj5jOkBGQHRlc3RfY21kX3BhcmFtXzEjSSM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCB0ZXN0X2NtZF9wYXJhbV8xKGludCB4MSk8L0RlY2xhcmF0aW9uPjwvRnVuY3Rpb24+XQogLy8gQ0hFQ0stTkVYVDogIENvbW1lbnRBU1Q9WwogLy8gQ0hFQ0stTkVYVDogICAgKENYQ29tbWVudF9GdWxsQ29tbWVudAogLy8gQ0hFQ0stTkVYVDogICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGggSXNXaGl0ZXNwYWNlCkBAIC0yMDksOSArMjM3LDkgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGggSXNXaGl0ZXNwYWNlKSkpXQogCiAvLy8gXHBhcmFtIHgxIEFhYS4KLXZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTMoaW50IHgxKTsKK3ZvaWQgdGVzdF9jbWRfcGFyYW1fMihpbnQgeDEpOwogCi0vLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTM6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8ZGw+PGR0IGNsYXNzPSJwYXJhbS1uYW1lLWluZGV4LTAiPngxPC9kdD48ZGQgY2xhc3M9InBhcmFtLWRlc2NyLWluZGV4LTAiPiBBYWEuPC9kZD48L2RsPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPmNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzEzPC9OYW1lPjxVU1I+YzpARkBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xMyNJIzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzEzKGludCB4MSk8L0RlY2xhcmF0aW9uPjxQYXJhbWV0ZXJzPjxQYXJhbWV0ZXI+PE5hbWU+eDE8L05hbWU+PEluZGV4PjA8L0luZGV4PjxEaXJlY3Rpb24gaXNFeHBsaWNpdD0iMCI+aW48L0RpcmVjdGlvbj48RGlzY3Vzc2lvbj48UGFyYT4gQWFhLjwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PC9QYXJhbWV0ZXJzPjwvRnVuY3Rpb24+XQorLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPXRlc3RfY21kX3BhcmFtXzI6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8ZGw+PGR0IGNsYXNzPSJwYXJhbS1uYW1lLWluZGV4LTAiPngxPC9kdD48ZGQgY2xhc3M9InBhcmFtLWRlc2NyLWluZGV4LTAiPiBBYWEuPC9kZD48L2RsPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPnRlc3RfY21kX3BhcmFtXzI8L05hbWU+PFVTUj5jOkBGQHRlc3RfY21kX3BhcmFtXzIjSSM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCB0ZXN0X2NtZF9wYXJhbV8yKGludCB4MSk8L0RlY2xhcmF0aW9uPjxQYXJhbWV0ZXJzPjxQYXJhbWV0ZXI+PE5hbWU+eDE8L05hbWU+PEluZGV4PjA8L0luZGV4PjxEaXJlY3Rpb24gaXNFeHBsaWNpdD0iMCI+aW48L0RpcmVjdGlvbj48RGlzY3Vzc2lvbj48UGFyYT4gQWFhLjwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PC9QYXJhbWV0ZXJzPjwvRnVuY3Rpb24+XQogLy8gQ0hFQ0stTkVYVDogIENvbW1lbnRBU1Q9WwogLy8gQ0hFQ0stTkVYVDogICAgKENYQ29tbWVudF9GdWxsQ29tbWVudAogLy8gQ0hFQ0stTkVYVDogICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGggSXNXaGl0ZXNwYWNlCkBAIC0yMjEsOSArMjQ5LDkgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIEFhYS5dKSkpKV0KIAogLy8vIFxwYXJhbSB6enogQWFhLgotdm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xNChpbnQgeDEpOwordm9pZCB0ZXN0X2NtZF9wYXJhbV8zKGludCB4MSk7CiAKLS8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD1jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xNDp7ey4qfX0gRnVsbENvbW1lbnRBc0hUTUw9WzxkbD48ZHQgY2xhc3M9InBhcmFtLW5hbWUtaW5kZXgtaW52YWxpZCI+enp6PC9kdD48ZGQgY2xhc3M9InBhcmFtLWRlc2NyLWluZGV4LWludmFsaWQiPiBBYWEuPC9kZD48L2RsPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPmNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE0PC9OYW1lPjxVU1I+YzpARkBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xNCNJIzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE0KGludCB4MSk8L0RlY2xhcmF0aW9uPjxQYXJhbWV0ZXJzPjxQYXJhbWV0ZXI+PE5hbWU+enp6PC9OYW1lPjxEaXJlY3Rpb24gaXNFeHBsaWNpdD0iMCI+aW48L0RpcmVjdGlvbj48RGlzY3Vzc2lvbj48UGFyYT4gQWFhLjwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PC9QYXJhbWV0ZXJzPjwvRnVuY3Rpb24+XQorLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPXRlc3RfY21kX3BhcmFtXzM6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8ZGw+PGR0IGNsYXNzPSJwYXJhbS1uYW1lLWluZGV4LWludmFsaWQiPnp6ejwvZHQ+PGRkIGNsYXNzPSJwYXJhbS1kZXNjci1pbmRleC1pbnZhbGlkIj4gQWFhLjwvZGQ+PC9kbD5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2NtZF9wYXJhbV8zPC9OYW1lPjxVU1I+YzpARkB0ZXN0X2NtZF9wYXJhbV8zI0kjPC9VU1I+PERlY2xhcmF0aW9uPnZvaWQgdGVzdF9jbWRfcGFyYW1fMyhpbnQgeDEpPC9EZWNsYXJhdGlvbj48UGFyYW1ldGVycz48UGFyYW1ldGVyPjxOYW1lPnp6ejwvTmFtZT48RGlyZWN0aW9uIGlzRXhwbGljaXQ9IjAiPmluPC9EaXJlY3Rpb24+PERpc2N1c3Npb24+PFBhcmE+IEFhYS48L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjwvUGFyYW1ldGVycz48L0Z1bmN0aW9uPl0KIC8vIENIRUNLLU5FWFQ6ICBDb21tZW50QVNUPVsKIC8vIENIRUNLLU5FWFQ6ICAgIChDWENvbW1lbnRfRnVsbENvbW1lbnQKIC8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoIElzV2hpdGVzcGFjZQpAQCAtMjM0LDkgKzI2Miw5IEBACiAKIC8vLyBccGFyYW0geDIgQmJiLgogLy8vIFxwYXJhbSB4MSBBYWEuCi12b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE1KGludCB4MSwgaW50IHgyKTsKK3ZvaWQgdGVzdF9jbWRfcGFyYW1fNChpbnQgeDEsIGludCB4Mik7CiAKLS8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD1jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xNTp7ey4qfX0gRnVsbENvbW1lbnRBc0hUTUw9WzxkbD48ZHQgY2xhc3M9InBhcmFtLW5hbWUtaW5kZXgtMCI+eDE8L2R0PjxkZCBjbGFzcz0icGFyYW0tZGVzY3ItaW5kZXgtMCI+IEFhYS48L2RkPjxkdCBjbGFzcz0icGFyYW0tbmFtZS1pbmRleC0xIj54MjwvZHQ+PGRkIGNsYXNzPSJwYXJhbS1kZXNjci1pbmRleC0xIj4gQmJiLiA8L2RkPjwvZGw+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTU8L05hbWU+PFVTUj5jOkBGQGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE1I0kjSSM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xNShpbnQgeDEsIGludCB4Mik8L0RlY2xhcmF0aW9uPjxQYXJhbWV0ZXJzPjxQYXJhbWV0ZXI+PE5hbWU+eDE8L05hbWU+PEluZGV4PjA8L0luZGV4PjxEaXJlY3Rpb24gaXNFeHBsaWNpdD0iMCI+aW48L0RpcmVjdGlvbj48RGlzY3Vzc2lvbj48UGFyYT4gQWFhLjwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PFBhcmFtZXRlcj48TmFtZT54MjwvTmFtZT48SW5kZXg+MTwvSW5kZXg+PERpcmVjdGlvbiBpc0V4cGxpY2l0PSIwIj5pbjwvRGlyZWN0aW9uPjxEaXNjdXNzaW9uPjxQYXJhPiBCYmIuIDwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PC9QYXJhbWV0ZXJzPjwvRnVuY3Rpb24+XQorLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPXRlc3RfY21kX3BhcmFtXzQ6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8ZGw+PGR0IGNsYXNzPSJwYXJhbS1uYW1lLWluZGV4LTAiPngxPC9kdD48ZGQgY2xhc3M9InBhcmFtLWRlc2NyLWluZGV4LTAiPiBBYWEuPC9kZD48ZHQgY2xhc3M9InBhcmFtLW5hbWUtaW5kZXgtMSI+eDI8L2R0PjxkZCBjbGFzcz0icGFyYW0tZGVzY3ItaW5kZXgtMSI+IEJiYi4gPC9kZD48L2RsPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPnRlc3RfY21kX3BhcmFtXzQ8L05hbWU+PFVTUj5jOkBGQHRlc3RfY21kX3BhcmFtXzQjSSNJIzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIHRlc3RfY21kX3BhcmFtXzQoaW50IHgxLCBpbnQgeDIpPC9EZWNsYXJhdGlvbj48UGFyYW1ldGVycz48UGFyYW1ldGVyPjxOYW1lPngxPC9OYW1lPjxJbmRleD4wPC9JbmRleD48RGlyZWN0aW9uIGlzRXhwbGljaXQ9IjAiPmluPC9EaXJlY3Rpb24+PERpc2N1c3Npb24+PFBhcmE+IEFhYS48L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjxQYXJhbWV0ZXI+PE5hbWU+eDI8L05hbWU+PEluZGV4PjE8L0luZGV4PjxEaXJlY3Rpb24gaXNFeHBsaWNpdD0iMCI+aW48L0RpcmVjdGlvbj48RGlzY3Vzc2lvbj48UGFyYT4gQmJiLiA8L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjwvUGFyYW1ldGVycz48L0Z1bmN0aW9uPl0KIC8vIENIRUNLLU5FWFQ6ICBDb21tZW50QVNUPVsKIC8vIENIRUNLLU5FWFQ6ICAgIChDWENvbW1lbnRfRnVsbENvbW1lbnQKIC8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoIElzV2hpdGVzcGFjZQpAQCAtMjUyLDkgKzI4MCw5IEBACiAvLy8gXHBhcmFtIHgyIEJiYi4KIC8vLyBccGFyYW0genp6IEFhYS4KIC8vLyBccGFyYW0geDEgQWFhLgotdm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xNihpbnQgeDEsIGludCB4Mik7Cit2b2lkIHRlc3RfY21kX3BhcmFtXzUoaW50IHgxLCBpbnQgeDIpOwogCi0vLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTY6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8ZGw+PGR0IGNsYXNzPSJwYXJhbS1uYW1lLWluZGV4LTAiPngxPC9kdD48ZGQgY2xhc3M9InBhcmFtLWRlc2NyLWluZGV4LTAiPiBBYWEuPC9kZD48ZHQgY2xhc3M9InBhcmFtLW5hbWUtaW5kZXgtMSI+eDI8L2R0PjxkZCBjbGFzcz0icGFyYW0tZGVzY3ItaW5kZXgtMSI+IEJiYi4gPC9kZD48ZHQgY2xhc3M9InBhcmFtLW5hbWUtaW5kZXgtaW52YWxpZCI+enp6PC9kdD48ZGQgY2xhc3M9InBhcmFtLWRlc2NyLWluZGV4LWludmFsaWQiPiBBYWEuIDwvZGQ+PC9kbD5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT5jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xNjwvTmFtZT48VVNSPmM6QEZAY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTYjSSNJIzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE2KGludCB4MSwgaW50IHgyKTwvRGVjbGFyYXRpb24+PFBhcmFtZXRlcnM+PFBhcmFtZXRlcj48TmFtZT54MTwvTmFtZT48SW5kZXg+MDwvSW5kZXg+PERpcmVjdGlvbiBpc0V4cGxpY2l0PSIwIj5pbjwvRGlyZWN0aW9uPjxEaXNjdXNzaW9uPjxQYXJhPiBBYWEuPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48UGFyYW1ldGVyPjxOYW1lPngyPC9OYW1lPjxJbmRleD4xPC9JbmRleD48RGlyZWN0aW9uIGlzRXhwbGljaXQ9IjAiPmluPC9EaXJlY3Rpb24+PERpc2N1c3Npb24+PFBhcmE+IEJiYi4gPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48UGFyYW1ldGVyPjxOYW1lPnp6ejwvTmFtZT48RGlyZWN0aW9uIGlzRXhwbGljaXQ9IjAiPmluPC9EaXJlY3Rpb24+PERpc2N1c3Npb24+PFBhcmE+IEFhYS4gPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48L1BhcmFtZXRlcnM+PC9GdW5jdGlvbj5dCisvLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9dGVzdF9jbWRfcGFyYW1fNTp7ey4qfX0gRnVsbENvbW1lbnRBc0hUTUw9WzxkbD48ZHQgY2xhc3M9InBhcmFtLW5hbWUtaW5kZXgtMCI+eDE8L2R0PjxkZCBjbGFzcz0icGFyYW0tZGVzY3ItaW5kZXgtMCI+IEFhYS48L2RkPjxkdCBjbGFzcz0icGFyYW0tbmFtZS1pbmRleC0xIj54MjwvZHQ+PGRkIGNsYXNzPSJwYXJhbS1kZXNjci1pbmRleC0xIj4gQmJiLiA8L2RkPjxkdCBjbGFzcz0icGFyYW0tbmFtZS1pbmRleC1pbnZhbGlkIj56eno8L2R0PjxkZCBjbGFzcz0icGFyYW0tZGVzY3ItaW5kZXgtaW52YWxpZCI+IEFhYS4gPC9kZD48L2RsPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPnRlc3RfY21kX3BhcmFtXzU8L05hbWU+PFVTUj5jOkBGQHRlc3RfY21kX3BhcmFtXzUjSSNJIzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIHRlc3RfY21kX3BhcmFtXzUoaW50IHgxLCBpbnQgeDIpPC9EZWNsYXJhdGlvbj48UGFyYW1ldGVycz48UGFyYW1ldGVyPjxOYW1lPngxPC9OYW1lPjxJbmRleD4wPC9JbmRleD48RGlyZWN0aW9uIGlzRXhwbGljaXQ9IjAiPmluPC9EaXJlY3Rpb24+PERpc2N1c3Npb24+PFBhcmE+IEFhYS48L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjxQYXJhbWV0ZXI+PE5hbWU+eDI8L05hbWU+PEluZGV4PjE8L0luZGV4PjxEaXJlY3Rpb24gaXNFeHBsaWNpdD0iMCI+aW48L0RpcmVjdGlvbj48RGlzY3Vzc2lvbj48UGFyYT4gQmJiLiA8L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjxQYXJhbWV0ZXI+PE5hbWU+enp6PC9OYW1lPjxEaXJlY3Rpb24gaXNFeHBsaWNpdD0iMCI+aW48L0RpcmVjdGlvbj48RGlzY3Vzc2lvbj48UGFyYT4gQWFhLiA8L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjwvUGFyYW1ldGVycz48L0Z1bmN0aW9uPl0KIC8vIENIRUNLLU5FWFQ6ICBDb21tZW50QVNUPVsKIC8vIENIRUNLLU5FWFQ6ICAgIChDWENvbW1lbnRfRnVsbENvbW1lbnQKIC8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoIElzV2hpdGVzcGFjZQpAQCAtMjczLDkgKzMwMSw5IEBACiAKIC8vLyBccGFyYW0geDEgQWFhLgogLy8vIFxwYXJhbSAuLi4gQmJiLgotdm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8xNyhpbnQgeDEsIC4uLik7Cit2b2lkIHRlc3RfY21kX3BhcmFtXzYoaW50IHgxLCAuLi4pOwogCi0vLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTc6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8ZGw+PGR0IGNsYXNzPSJwYXJhbS1uYW1lLWluZGV4LTAiPngxPC9kdD48ZGQgY2xhc3M9InBhcmFtLWRlc2NyLWluZGV4LTAiPiBBYWEuIDwvZGQ+PGR0IGNsYXNzPSJwYXJhbS1uYW1lLWluZGV4LXZhcmFyZyI+Li4uPC9kdD48ZGQgY2xhc3M9InBhcmFtLWRlc2NyLWluZGV4LXZhcmFyZyI+IEJiYi48L2RkPjwvZGw+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTc8L05hbWU+PFVTUj5jOkBGQGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE3I0kuIzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE3KGludCB4MSwgLi4uKTwvRGVjbGFyYXRpb24+PFBhcmFtZXRlcnM+PFBhcmFtZXRlcj48TmFtZT54MTwvTmFtZT48SW5kZXg+MDwvSW5kZXg+PERpcmVjdGlvbiBpc0V4cGxpY2l0PSIwIj5pbjwvRGlyZWN0aW9uPjxEaXNjdXNzaW9uPjxQYXJhPiBBYWEuIDwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PFBhcmFtZXRlcj48TmFtZT4uLi48L05hbWU+PElzVmFyQXJnIC8+PERpcmVjdGlvbiBpc0V4cGxpY2l0PSIwIj5pbjwvRGlyZWN0aW9uPjxEaXNjdXNzaW9uPjxQYXJhPiBCYmIuPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48L1BhcmFtZXRlcnM+PC9GdW5jdGlvbj5dCisvLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9dGVzdF9jbWRfcGFyYW1fNjp7ey4qfX0gRnVsbENvbW1lbnRBc0hUTUw9WzxkbD48ZHQgY2xhc3M9InBhcmFtLW5hbWUtaW5kZXgtMCI+eDE8L2R0PjxkZCBjbGFzcz0icGFyYW0tZGVzY3ItaW5kZXgtMCI+IEFhYS4gPC9kZD48ZHQgY2xhc3M9InBhcmFtLW5hbWUtaW5kZXgtdmFyYXJnIj4uLi48L2R0PjxkZCBjbGFzcz0icGFyYW0tZGVzY3ItaW5kZXgtdmFyYXJnIj4gQmJiLjwvZGQ+PC9kbD5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2NtZF9wYXJhbV82PC9OYW1lPjxVU1I+YzpARkB0ZXN0X2NtZF9wYXJhbV82I0kuIzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIHRlc3RfY21kX3BhcmFtXzYoaW50IHgxLCAuLi4pPC9EZWNsYXJhdGlvbj48UGFyYW1ldGVycz48UGFyYW1ldGVyPjxOYW1lPngxPC9OYW1lPjxJbmRleD4wPC9JbmRleD48RGlyZWN0aW9uIGlzRXhwbGljaXQ9IjAiPmluPC9EaXJlY3Rpb24+PERpc2N1c3Npb24+PFBhcmE+IEFhYS4gPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48UGFyYW1ldGVyPjxOYW1lPi4uLjwvTmFtZT48SXNWYXJBcmcgLz48RGlyZWN0aW9uIGlzRXhwbGljaXQ9IjAiPmluPC9EaXJlY3Rpb24+PERpc2N1c3Npb24+PFBhcmE+IEJiYi48L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjwvUGFyYW1ldGVycz48L0Z1bmN0aW9uPl0KIC8vIENIRUNLLU5FWFQ6ICBDb21tZW50QVNUPVsKIC8vIENIRUNLLU5FWFQ6ICAgIChDWENvbW1lbnRfRnVsbENvbW1lbnQKIC8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoIElzV2hpdGVzcGFjZQpAQCAtMjg2LDE0ICszMTQsMTggQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIF0gSXNXaGl0ZXNwYWNlKSkpCiAvLyBDSEVDSy1ORVhUOiAgICAgICAoQ1hDb21tZW50X1BhcmFtQ29tbWFuZCBpbiBpbXBsaWNpdGx5IFBhcmFtTmFtZT1bLi4uXSBQYXJhbUluZGV4PTQyOTQ5NjcyOTUKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGgKLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIEJiYi5dKSkpKV0gRXh0ZW50PVsyNzY6MSAtIDI3Njo0OF0KKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIEJiYi5dKSkpKV0KKworLy89PT0tLS0KKy8vIFRlc3RzIGZvciBcdHBhcmFtLgorLy89PT0tLS0KIAogLy8vIFx0cGFyYW0KIC8vLyBccGFyYW0gYWFhIEJsYWggYmxhaAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTgoVCBhYWEpOwordm9pZCB0ZXN0X2NtZF90cGFyYW1fMShUIGFhYSk7CiAKLS8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uVGVtcGxhdGU9Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTg6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8ZGw+PGR0IGNsYXNzPSJwYXJhbS1uYW1lLWluZGV4LTAiPmFhYTwvZHQ+PGRkIGNsYXNzPSJwYXJhbS1kZXNjci1pbmRleC0wIj4gQmxhaCBibGFoPC9kZD48L2RsPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIHRlbXBsYXRlS2luZD0idGVtcGxhdGUiIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPmNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE4PC9OYW1lPjxVU1I+YzpARlRAJmd0OzEjVGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE4I3QwLjAjPC9VU1I+PERlY2xhcmF0aW9uPnRlbXBsYXRlICZsdDt0eXBlbmFtZSBUJmd0OyB2b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE4KFQgYWFhKTwvRGVjbGFyYXRpb24+PFBhcmFtZXRlcnM+PFBhcmFtZXRlcj48TmFtZT5hYWE8L05hbWU+PEluZGV4PjA8L0luZGV4PjxEaXJlY3Rpb24gaXNFeHBsaWNpdD0iMCI+aW48L0RpcmVjdGlvbj48RGlzY3Vzc2lvbj48UGFyYT4gQmxhaCBibGFoPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48L1BhcmFtZXRlcnM+PC9GdW5jdGlvbj5dCisvLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvblRlbXBsYXRlPXRlc3RfY21kX3RwYXJhbV8xOnt7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPGRsPjxkdCBjbGFzcz0icGFyYW0tbmFtZS1pbmRleC0wIj5hYWE8L2R0PjxkZCBjbGFzcz0icGFyYW0tZGVzY3ItaW5kZXgtMCI+IEJsYWggYmxhaDwvZGQ+PC9kbD5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiB0ZW1wbGF0ZUtpbmQ9InRlbXBsYXRlIiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2NtZF90cGFyYW1fMTwvTmFtZT48VVNSPmM6QEZUQCZndDsxI1R0ZXN0X2NtZF90cGFyYW1fMSN0MC4wIzwvVVNSPjxEZWNsYXJhdGlvbj50ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgVCZndDsgdm9pZCB0ZXN0X2NtZF90cGFyYW1fMShUIGFhYSk8L0RlY2xhcmF0aW9uPjxQYXJhbWV0ZXJzPjxQYXJhbWV0ZXI+PE5hbWU+YWFhPC9OYW1lPjxJbmRleD4wPC9JbmRleD48RGlyZWN0aW9uIGlzRXhwbGljaXQ9IjAiPmluPC9EaXJlY3Rpb24+PERpc2N1c3Npb24+PFBhcmE+IEJsYWggYmxhaDwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PC9QYXJhbWV0ZXJzPjwvRnVuY3Rpb24+XQogLy8gQ0hFQ0stTkVYVDogIENvbW1lbnRBU1Q9WwogLy8gQ0hFQ0stTkVYVDogICAgKENYQ29tbWVudF9GdWxsQ29tbWVudAogLy8gQ0hFQ0stTkVYVDogICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGggSXNXaGl0ZXNwYWNlCkBAIC0zMDgsOSArMzQwLDkgQEAKIC8vLyBcdHBhcmFtIFQKIC8vLyBccGFyYW0gYWFhIEJsYWggYmxhaAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTkoVCBhYWEpOwordm9pZCB0ZXN0X2NtZF90cGFyYW1fMihUIGFhYSk7CiAKLS8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uVGVtcGxhdGU9Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMTk6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8ZGw+PGR0IGNsYXNzPSJwYXJhbS1uYW1lLWluZGV4LTAiPmFhYTwvZHQ+PGRkIGNsYXNzPSJwYXJhbS1kZXNjci1pbmRleC0wIj4gQmxhaCBibGFoPC9kZD48L2RsPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIHRlbXBsYXRlS2luZD0idGVtcGxhdGUiIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPmNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE5PC9OYW1lPjxVU1I+YzpARlRAJmd0OzEjVGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE5I3QwLjAjPC9VU1I+PERlY2xhcmF0aW9uPnRlbXBsYXRlICZsdDt0eXBlbmFtZSBUJmd0OyB2b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzE5KFQgYWFhKTwvRGVjbGFyYXRpb24+PFBhcmFtZXRlcnM+PFBhcmFtZXRlcj48TmFtZT5hYWE8L05hbWU+PEluZGV4PjA8L0luZGV4PjxEaXJlY3Rpb24gaXNFeHBsaWNpdD0iMCI+aW48L0RpcmVjdGlvbj48RGlzY3Vzc2lvbj48UGFyYT4gQmxhaCBibGFoPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48L1BhcmFtZXRlcnM+PC9GdW5jdGlvbj5dCisvLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvblRlbXBsYXRlPXRlc3RfY21kX3RwYXJhbV8yOnt7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPGRsPjxkdCBjbGFzcz0icGFyYW0tbmFtZS1pbmRleC0wIj5hYWE8L2R0PjxkZCBjbGFzcz0icGFyYW0tZGVzY3ItaW5kZXgtMCI+IEJsYWggYmxhaDwvZGQ+PC9kbD5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiB0ZW1wbGF0ZUtpbmQ9InRlbXBsYXRlIiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2NtZF90cGFyYW1fMjwvTmFtZT48VVNSPmM6QEZUQCZndDsxI1R0ZXN0X2NtZF90cGFyYW1fMiN0MC4wIzwvVVNSPjxEZWNsYXJhdGlvbj50ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgVCZndDsgdm9pZCB0ZXN0X2NtZF90cGFyYW1fMihUIGFhYSk8L0RlY2xhcmF0aW9uPjxQYXJhbWV0ZXJzPjxQYXJhbWV0ZXI+PE5hbWU+YWFhPC9OYW1lPjxJbmRleD4wPC9JbmRleD48RGlyZWN0aW9uIGlzRXhwbGljaXQ9IjAiPmluPC9EaXJlY3Rpb24+PERpc2N1c3Npb24+PFBhcmE+IEJsYWggYmxhaDwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PC9QYXJhbWV0ZXJzPjwvRnVuY3Rpb24+XQogLy8gQ0hFQ0stTkVYVDogIENvbW1lbnRBU1Q9WwogLy8gQ0hFQ0stTkVYVDogICAgKENYQ29tbWVudF9GdWxsQ29tbWVudAogLy8gQ0hFQ0stTkVYVDogICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGggSXNXaGl0ZXNwYWNlCkBAIC0zMjUsOSArMzU3LDkgQEAKIC8vLyBcdHBhcmFtIFQyIEJiYgogLy8vIFx0cGFyYW0gVDEgQWFhCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+Ci12b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzIwKFQxIGFhYSwgVDIgYmJiKTsKK3ZvaWQgdGVzdF9jbWRfdHBhcmFtXzMoVDEgYWFhLCBUMiBiYmIpOwogCi0vLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvblRlbXBsYXRlPWNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzIwOnt7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPGRsPjxkdCBjbGFzcz0idHBhcmFtLW5hbWUtaW5kZXgtMCI+VDE8L2R0PjxkZCBjbGFzcz0idHBhcmFtLWRlc2NyLWluZGV4LTAiPiBBYWE8L2RkPjxkdCBjbGFzcz0idHBhcmFtLW5hbWUtaW5kZXgtMSI+VDI8L2R0PjxkZCBjbGFzcz0idHBhcmFtLWRlc2NyLWluZGV4LTEiPiBCYmIgPC9kZD48L2RsPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIHRlbXBsYXRlS2luZD0idGVtcGxhdGUiIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPmNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzIwPC9OYW1lPjxVU1I+YzpARlRAJmd0OzIjVCNUY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMjAjdDAuMCN0MC4xIzwvVVNSPjxEZWNsYXJhdGlvbj50ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyJmd0O1xudm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8yMChUMSBhYWEsIFQyIGJiYik8L0RlY2xhcmF0aW9uPjxUZW1wbGF0ZVBhcmFtZXRlcnM+PFBhcmFtZXRlcj48TmFtZT5UMTwvTmFtZT48SW5kZXg+MDwvSW5kZXg+PERpc2N1c3Npb24+PFBhcmE+IEFhYTwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PFBhcmFtZXRlcj48TmFtZT5UMjwvTmFtZT48SW5kZXg+MTwvSW5kZXg+PERpc2N1c3Npb24+PFBhcmE+IEJiYiA8L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjwvVGVtcGxhdGVQYXJhbWV0ZXJzPjwvRnVuY3Rpb24+XQorLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25UZW1wbGF0ZT10ZXN0X2NtZF90cGFyYW1fMzp7ey4qfX0gRnVsbENvbW1lbnRBc0hUTUw9WzxkbD48ZHQgY2xhc3M9InRwYXJhbS1uYW1lLWluZGV4LTAiPlQxPC9kdD48ZGQgY2xhc3M9InRwYXJhbS1kZXNjci1pbmRleC0wIj4gQWFhPC9kZD48ZHQgY2xhc3M9InRwYXJhbS1uYW1lLWluZGV4LTEiPlQyPC9kdD48ZGQgY2xhc3M9InRwYXJhbS1kZXNjci1pbmRleC0xIj4gQmJiIDwvZGQ+PC9kbD5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiB0ZW1wbGF0ZUtpbmQ9InRlbXBsYXRlIiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2NtZF90cGFyYW1fMzwvTmFtZT48VVNSPmM6QEZUQCZndDsyI1QjVHRlc3RfY21kX3RwYXJhbV8zI3QwLjAjdDAuMSM8L1VTUj48RGVjbGFyYXRpb24+dGVtcGxhdGUgJmx0O3R5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiZndDsgdm9pZCB0ZXN0X2NtZF90cGFyYW1fMyhUMSBhYWEsIFQyIGJiYik8L0RlY2xhcmF0aW9uPjxUZW1wbGF0ZVBhcmFtZXRlcnM+PFBhcmFtZXRlcj48TmFtZT5UMTwvTmFtZT48SW5kZXg+MDwvSW5kZXg+PERpc2N1c3Npb24+PFBhcmE+IEFhYTwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PFBhcmFtZXRlcj48TmFtZT5UMjwvTmFtZT48SW5kZXg+MTwvSW5kZXg+PERpc2N1c3Npb24+PFBhcmE+IEJiYiA8L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjwvVGVtcGxhdGVQYXJhbWV0ZXJzPjwvRnVuY3Rpb24+XQogLy8gQ0hFQ0stTkVYVDogIENvbW1lbnRBU1Q9WwogLy8gQ0hFQ0stTkVYVDogICAgKENYQ29tbWVudF9GdWxsQ29tbWVudAogLy8gQ0hFQ0stTkVYVDogICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGggSXNXaGl0ZXNwYWNlCkBAIC0zNDUsOSArMzc3LDkgQEAKIC8vLyBcdHBhcmFtIFYgQ2NjCiAvLy8gXHRwYXJhbSBUMSBBYWEKIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgaW50IFY+Ci12b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzIxKFQxIGFhYSwgVDIgYmJiKTsKK3ZvaWQgdGVzdF9jbWRfdHBhcmFtXzQoVDEgYWFhLCBUMiBiYmIpOwogCi0vLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvblRlbXBsYXRlPWNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzIxOnt7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPGRsPjxkdCBjbGFzcz0idHBhcmFtLW5hbWUtaW5kZXgtMCI+VDE8L2R0PjxkZCBjbGFzcz0idHBhcmFtLWRlc2NyLWluZGV4LTAiPiBBYWE8L2RkPjxkdCBjbGFzcz0idHBhcmFtLW5hbWUtaW5kZXgtMSI+VDI8L2R0PjxkZCBjbGFzcz0idHBhcmFtLWRlc2NyLWluZGV4LTEiPiBCYmIgPC9kZD48ZHQgY2xhc3M9InRwYXJhbS1uYW1lLWluZGV4LTIiPlY8L2R0PjxkZCBjbGFzcz0idHBhcmFtLWRlc2NyLWluZGV4LTIiPiBDY2MgPC9kZD48ZHQgY2xhc3M9InRwYXJhbS1uYW1lLWluZGV4LWludmFsaWQiPlU8L2R0PjxkZCBjbGFzcz0idHBhcmFtLWRlc2NyLWluZGV4LWludmFsaWQiPiBaenogPC9kZD48L2RsPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIHRlbXBsYXRlS2luZD0idGVtcGxhdGUiIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPmNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzIxPC9OYW1lPjxVU1I+YzpARlRAJmd0OzMjVCNUI05JY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMjEjdDAuMCN0MC4xIzwvVVNSPjxEZWNsYXJhdGlvbj50ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCBpbnQgViZndDtcbnZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMjEoVDEgYWFhLCBUMiBiYmIpPC9EZWNsYXJhdGlvbj48VGVtcGxhdGVQYXJhbWV0ZXJzPjxQYXJhbWV0ZXI+PE5hbWU+VDE8L05hbWU+PEluZGV4PjA8L0luZGV4PjxEaXNjdXNzaW9uPjxQYXJhPiBBYWE8L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjxQYXJhbWV0ZXI+PE5hbWU+VDI8L05hbWU+PEluZGV4PjE8L0luZGV4PjxEaXNjdXNzaW9uPjxQYXJhPiBCYmIgPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48UGFyYW1ldGVyPjxOYW1lPlY8L05hbWU+PEluZGV4PjI8L0luZGV4PjxEaXNjdXNzaW9uPjxQYXJhPiBDY2MgPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48UGFyYW1ldGVyPjxOYW1lPlU8L05hbWU+PERpc2N1c3Npb24+PFBhcmE+IFp6eiA8L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjwvVGVtcGxhdGVQYXJhbWV0ZXJzPjwvRnVuY3Rpb24+XQorLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25UZW1wbGF0ZT10ZXN0X2NtZF90cGFyYW1fNDp7ey4qfX0gRnVsbENvbW1lbnRBc0hUTUw9WzxkbD48ZHQgY2xhc3M9InRwYXJhbS1uYW1lLWluZGV4LTAiPlQxPC9kdD48ZGQgY2xhc3M9InRwYXJhbS1kZXNjci1pbmRleC0wIj4gQWFhPC9kZD48ZHQgY2xhc3M9InRwYXJhbS1uYW1lLWluZGV4LTEiPlQyPC9kdD48ZGQgY2xhc3M9InRwYXJhbS1kZXNjci1pbmRleC0xIj4gQmJiIDwvZGQ+PGR0IGNsYXNzPSJ0cGFyYW0tbmFtZS1pbmRleC0yIj5WPC9kdD48ZGQgY2xhc3M9InRwYXJhbS1kZXNjci1pbmRleC0yIj4gQ2NjIDwvZGQ+PGR0IGNsYXNzPSJ0cGFyYW0tbmFtZS1pbmRleC1pbnZhbGlkIj5VPC9kdD48ZGQgY2xhc3M9InRwYXJhbS1kZXNjci1pbmRleC1pbnZhbGlkIj4gWnp6IDwvZGQ+PC9kbD5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiB0ZW1wbGF0ZUtpbmQ9InRlbXBsYXRlIiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2NtZF90cGFyYW1fNDwvTmFtZT48VVNSPmM6QEZUQCZndDszI1QjVCNOSXRlc3RfY21kX3RwYXJhbV80I3QwLjAjdDAuMSM8L1VTUj48RGVjbGFyYXRpb24+dGVtcGxhdGUgJmx0O3R5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgaW50IFYmZ3Q7XG52b2lkIHRlc3RfY21kX3RwYXJhbV80KFQxIGFhYSwgVDIgYmJiKTwvRGVjbGFyYXRpb24+PFRlbXBsYXRlUGFyYW1ldGVycz48UGFyYW1ldGVyPjxOYW1lPlQxPC9OYW1lPjxJbmRleD4wPC9JbmRleD48RGlzY3Vzc2lvbj48UGFyYT4gQWFhPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48UGFyYW1ldGVyPjxOYW1lPlQyPC9OYW1lPjxJbmRleD4xPC9JbmRleD48RGlzY3Vzc2lvbj48UGFyYT4gQmJiIDwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PFBhcmFtZXRlcj48TmFtZT5WPC9OYW1lPjxJbmRleD4yPC9JbmRleD48RGlzY3Vzc2lvbj48UGFyYT4gQ2NjIDwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PFBhcmFtZXRlcj48TmFtZT5VPC9OYW1lPjxEaXNjdXNzaW9uPjxQYXJhPiBaenogPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48L1RlbXBsYXRlUGFyYW1ldGVycz48L0Z1bmN0aW9uPl0KIC8vIENIRUNLLU5FWFQ6ICBDb21tZW50QVNUPVsKIC8vIENIRUNLLU5FWFQ6ICAgIChDWENvbW1lbnRfRnVsbENvbW1lbnQKIC8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoIElzV2hpdGVzcGFjZQpAQCAtMzczLDkgKzQwNSw5IEBACiAvLy8gXHRwYXJhbSBUIEFhYQogLy8vIFx0cGFyYW0gVFQgQmJiCiB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUVCwgY2xhc3MgQz4gY2xhc3MgVFRUPgotdm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8yMigpOwordm9pZCB0ZXN0X2NtZF90cGFyYW1fNSgpOwogCi0vLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvblRlbXBsYXRlPWNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzIyOnt7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPGRsPjxkdCBjbGFzcz0idHBhcmFtLW5hbWUtaW5kZXgtMCI+VFRUPC9kdD48ZGQgY2xhc3M9InRwYXJhbS1kZXNjci1pbmRleC0wIj4gRGRkIDwvZGQ+PGR0IGNsYXNzPSJ0cGFyYW0tbmFtZS1pbmRleC1vdGhlciI+QzwvZHQ+PGRkIGNsYXNzPSJ0cGFyYW0tZGVzY3ItaW5kZXgtb3RoZXIiPiBDY2MgPC9kZD48ZHQgY2xhc3M9InRwYXJhbS1uYW1lLWluZGV4LW90aGVyIj5UPC9kdD48ZGQgY2xhc3M9InRwYXJhbS1kZXNjci1pbmRleC1vdGhlciI+IEFhYSA8L2RkPjxkdCBjbGFzcz0idHBhcmFtLW5hbWUtaW5kZXgtb3RoZXIiPlRUPC9kdD48ZGQgY2xhc3M9InRwYXJhbS1kZXNjci1pbmRleC1vdGhlciI+IEJiYjwvZGQ+PC9kbD5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiB0ZW1wbGF0ZUtpbmQ9InRlbXBsYXRlIiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT5jb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8yMjwvTmFtZT48VVNSPmM6QEZUQCZndDsxI3QmZ3Q7MiN0Jmd0OzEjVCNUY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMjIjPC9VU1I+PERlY2xhcmF0aW9uPnRlbXBsYXRlICZsdDt0ZW1wbGF0ZSAmbHQ7dGVtcGxhdGUgJmx0O3R5cGVuYW1lIFQmZ3Q7IGNsYXNzIFRULCBjbGFzcyBDJmd0OyBjbGFzcyBUVFQmZ3Q7XG52b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzIyKCk8L0RlY2xhcmF0aW9uPjxUZW1wbGF0ZVBhcmFtZXRlcnM+PFBhcmFtZXRlcj48TmFtZT5UVFQ8L05hbWU+PEluZGV4PjA8L0luZGV4PjxEaXNjdXNzaW9uPjxQYXJhPiBEZGQgPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48UGFyYW1ldGVyPjxOYW1lPkM8L05hbWU+PERpc2N1c3Npb24+PFBhcmE+IENjYyA8L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjxQYXJhbWV0ZXI+PE5hbWU+VDwvTmFtZT48RGlzY3Vzc2lvbj48UGFyYT4gQWFhIDwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PFBhcmFtZXRlcj48TmFtZT5UVDwvTmFtZT48RGlzY3Vzc2lvbj48UGFyYT4gQmJiPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48L1RlbXBsYXRlUGFyYW1ldGVycz48L0Z1bmN0aW9uPl0KKy8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uVGVtcGxhdGU9dGVzdF9jbWRfdHBhcmFtXzU6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8ZGw+PGR0IGNsYXNzPSJ0cGFyYW0tbmFtZS1pbmRleC0wIj5UVFQ8L2R0PjxkZCBjbGFzcz0idHBhcmFtLWRlc2NyLWluZGV4LTAiPiBEZGQgPC9kZD48ZHQgY2xhc3M9InRwYXJhbS1uYW1lLWluZGV4LW90aGVyIj5DPC9kdD48ZGQgY2xhc3M9InRwYXJhbS1kZXNjci1pbmRleC1vdGhlciI+IENjYyA8L2RkPjxkdCBjbGFzcz0idHBhcmFtLW5hbWUtaW5kZXgtb3RoZXIiPlQ8L2R0PjxkZCBjbGFzcz0idHBhcmFtLWRlc2NyLWluZGV4LW90aGVyIj4gQWFhIDwvZGQ+PGR0IGNsYXNzPSJ0cGFyYW0tbmFtZS1pbmRleC1vdGhlciI+VFQ8L2R0PjxkZCBjbGFzcz0idHBhcmFtLWRlc2NyLWluZGV4LW90aGVyIj4gQmJiPC9kZD48L2RsPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIHRlbXBsYXRlS2luZD0idGVtcGxhdGUiIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPnRlc3RfY21kX3RwYXJhbV81PC9OYW1lPjxVU1I+YzpARlRAJmd0OzEjdCZndDsyI3QmZ3Q7MSNUI1R0ZXN0X2NtZF90cGFyYW1fNSM8L1VTUj48RGVjbGFyYXRpb24+dGVtcGxhdGUgJmx0O3RlbXBsYXRlICZsdDt0ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgVCZndDsgY2xhc3MgVFQsIGNsYXNzIEMmZ3Q7IGNsYXNzIFRUVCZndDtcbnZvaWQgdGVzdF9jbWRfdHBhcmFtXzUoKTwvRGVjbGFyYXRpb24+PFRlbXBsYXRlUGFyYW1ldGVycz48UGFyYW1ldGVyPjxOYW1lPlRUVDwvTmFtZT48SW5kZXg+MDwvSW5kZXg+PERpc2N1c3Npb24+PFBhcmE+IERkZCA8L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjxQYXJhbWV0ZXI+PE5hbWU+QzwvTmFtZT48RGlzY3Vzc2lvbj48UGFyYT4gQ2NjIDwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PFBhcmFtZXRlcj48TmFtZT5UPC9OYW1lPjxEaXNjdXNzaW9uPjxQYXJhPiBBYWEgPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48UGFyYW1ldGVyPjxOYW1lPlRUPC9OYW1lPjxEaXNjdXNzaW9uPjxQYXJhPiBCYmI8L1BhcmE+PC9EaXNjdXNzaW9uPjwvUGFyYW1ldGVyPjwvVGVtcGxhdGVQYXJhbWV0ZXJzPjwvRnVuY3Rpb24+XQogLy8gQ0hFQ0stTkVYVDogIENvbW1lbnRBU1Q9WwogLy8gQ0hFQ0stTkVYVDogICAgKENYQ29tbWVudF9GdWxsQ29tbWVudAogLy8gQ0hFQ0stTkVYVDogICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGggSXNXaGl0ZXNwYWNlCkBAIC0zOTYsNiArNDI4LDEwIEBACiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoCiAvLyBDSEVDSy1ORVhUOiAgICAgICAgICAgKENYQ29tbWVudF9UZXh0IFRleHQ9WyBCYmJdKSkpKV0KIAorLy89PT0tLS0KKy8vIFRlc3RzIGZvciBpbnRlcmFjdGlvbiBiZXR3ZWVuIGNvbW1hbmRzLgorLy89PT0tLS0KKwogLy8vIFxicmllZiBBYWEuCiAvLy8KIC8vLyBCYmIuCkBAIC00MDMsOSArNDM5LDkgQEAKIC8vLyBccGFyYW0geDIgRGRkLgogLy8vIFxwYXJhbSB4MSBDY2MuCiAvLy8gXHJldHVybnMgRWVlLgotdm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8yMyhpbnQgeDEsIGludCB4Mik7Cit2b2lkIHRlc3RfZnVsbF9jb21tZW50XzEoaW50IHgxLCBpbnQgeDIpOwogCi0vLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMjM6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8cCBjbGFzcz0icGFyYS1icmllZiI+IEFhYS48L3A+PHA+IEJiYi48L3A+PGRsPjxkdCBjbGFzcz0icGFyYW0tbmFtZS1pbmRleC0wIj54MTwvZHQ+PGRkIGNsYXNzPSJwYXJhbS1kZXNjci1pbmRleC0wIj4gQ2NjLiA8L2RkPjxkdCBjbGFzcz0icGFyYW0tbmFtZS1pbmRleC0xIj54MjwvZHQ+PGRkIGNsYXNzPSJwYXJhbS1kZXNjci1pbmRleC0xIj4gRGRkLiA8L2RkPjwvZGw+PGRpdiBjbGFzcz0icmVzdWx0LWRpc2N1c3Npb24iPjxwIGNsYXNzPSJwYXJhLXJldHVybnMiPjxzcGFuIGNsYXNzPSJ3b3JkLXJldHVybnMiPlJldHVybnM8L3NwYW4+ICBFZWUuPC9wPjwvZGl2Pl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPmNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzIzPC9OYW1lPjxVU1I+YzpARkBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8yMyNJI0kjPC9VU1I+PERlY2xhcmF0aW9uPnZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMjMoaW50IHgxLCBpbnQgeDIpPC9EZWNsYXJhdGlvbj48QWJzdHJhY3Q+PFBhcmE+IEFhYS48L1BhcmE+PC9BYnN0cmFjdD48UGFyYW1ldGVycz48UGFyYW1ldGVyPjxOYW1lPngxPC9OYW1lPjxJbmRleD4wPC9JbmRleD48RGlyZWN0aW9uIGlzRXhwbGljaXQ9IjAiPmluPC9EaXJlY3Rpb24+PERpc2N1c3Npb24+PFBhcmE+IENjYy4gPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48UGFyYW1ldGVyPjxOYW1lPngyPC9OYW1lPjxJbmRleD4xPC9JbmRleD48RGlyZWN0aW9uIGlzRXhwbGljaXQ9IjAiPmluPC9EaXJlY3Rpb24+PERpc2N1c3Npb24+PFBhcmE+IERkZC4gPC9QYXJhPjwvRGlzY3Vzc2lvbj48L1BhcmFtZXRlcj48L1BhcmFtZXRlcnM+PFJlc3VsdERpc2N1c3Npb24+PFBhcmE+IEVlZS48L1BhcmE+PC9SZXN1bHREaXNjdXNzaW9uPjxEaXNjdXNzaW9uPjxQYXJhPiBCYmIuPC9QYXJhPjwvRGlzY3Vzc2lvbj48L0Z1bmN0aW9uPl0KKy8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjY6IEZ1bmN0aW9uRGVjbD10ZXN0X2Z1bGxfY29tbWVudF8xOnt7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPHAgY2xhc3M9InBhcmEtYnJpZWYiPiBBYWEuPC9wPjxwPiBCYmIuPC9wPjxkbD48ZHQgY2xhc3M9InBhcmFtLW5hbWUtaW5kZXgtMCI+eDE8L2R0PjxkZCBjbGFzcz0icGFyYW0tZGVzY3ItaW5kZXgtMCI+IENjYy4gPC9kZD48ZHQgY2xhc3M9InBhcmFtLW5hbWUtaW5kZXgtMSI+eDI8L2R0PjxkZCBjbGFzcz0icGFyYW0tZGVzY3ItaW5kZXgtMSI+IERkZC4gPC9kZD48L2RsPjxkaXYgY2xhc3M9InJlc3VsdC1kaXNjdXNzaW9uIj48cCBjbGFzcz0icGFyYS1yZXR1cm5zIj48c3BhbiBjbGFzcz0id29yZC1yZXR1cm5zIj5SZXR1cm5zPC9zcGFuPiAgRWVlLjwvcD48L2Rpdj5dIEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSI2Ij48TmFtZT50ZXN0X2Z1bGxfY29tbWVudF8xPC9OYW1lPjxVU1I+YzpARkB0ZXN0X2Z1bGxfY29tbWVudF8xI0kjSSM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCB0ZXN0X2Z1bGxfY29tbWVudF8xKGludCB4MSwgaW50IHgyKTwvRGVjbGFyYXRpb24+PEFic3RyYWN0PjxQYXJhPiBBYWEuPC9QYXJhPjwvQWJzdHJhY3Q+PFBhcmFtZXRlcnM+PFBhcmFtZXRlcj48TmFtZT54MTwvTmFtZT48SW5kZXg+MDwvSW5kZXg+PERpcmVjdGlvbiBpc0V4cGxpY2l0PSIwIj5pbjwvRGlyZWN0aW9uPjxEaXNjdXNzaW9uPjxQYXJhPiBDY2MuIDwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PFBhcmFtZXRlcj48TmFtZT54MjwvTmFtZT48SW5kZXg+MTwvSW5kZXg+PERpcmVjdGlvbiBpc0V4cGxpY2l0PSIwIj5pbjwvRGlyZWN0aW9uPjxEaXNjdXNzaW9uPjxQYXJhPiBEZGQuIDwvUGFyYT48L0Rpc2N1c3Npb24+PC9QYXJhbWV0ZXI+PC9QYXJhbWV0ZXJzPjxSZXN1bHREaXNjdXNzaW9uPjxQYXJhPiBFZWUuPC9QYXJhPjwvUmVzdWx0RGlzY3Vzc2lvbj48RGlzY3Vzc2lvbj48UGFyYT4gQmJiLjwvUGFyYT48L0Rpc2N1c3Npb24+PC9GdW5jdGlvbj5dCiAvLyBDSEVDSy1ORVhUOiAgQ29tbWVudEFTVD1bCiAvLyBDSEVDSy1ORVhUOiAgICAoQ1hDb21tZW50X0Z1bGxDb21tZW50CiAvLyBDSEVDSy1ORVhUOiAgICAgICAoQ1hDb21tZW50X1BhcmFncmFwaCBJc1doaXRlc3BhY2UKQEAgLTQyOSw2ICs0NjUsMTAgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGgKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIEVlZS5dKSkpKV0KIAorLy89PT0tLS0KKy8vIE1pc2MgdGVzdHMuCisvLz09PS0tLQorCiAvLy8gPGJyPjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLmNvbS8iPkFhYTwvYT4KIHZvaWQgY29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMjQoKTsKIApAQCAtNjUzLDEyICs2OTMsMTIgQEAKIC8vLyAmY29weTsgdGhlIGNvcHlyaWdodCBzeW1ib2wKIC8vLyAmdHJhZGU7IHRoZSB0cmFkZSBtYXJrIHN5bWJvbAogLy8vICZyZWc7IHRoZSByZWdpc3RlcmVkIHRyYWRlIG1hcmsgc3ltYm9sCi0vLy8gJm5ic3A7IGEgbm9uIGJyZWFrYWJsZSBzcGFjZS4KKy8vLyAmbmJzcDsgYSBub24tYnJlYWthYmxlIHNwYWNlLgogLy8vICZEZWx0YTsgR3JlZWsgbGV0dGVyIERlbHRhIM6ULgogLy8vICZHYW1tYTsgR3JlZWsgbGV0dGVyIEdhbW1hIM6TLgogdm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8zNSgpOwogCi0vLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTo2OiBGdW5jdGlvbkRlY2w9Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMzU6e3suKn19IEZ1bGxDb21tZW50QXNIVE1MPVs8cCBjbGFzcz0icGFyYS1icmllZiI+IMKpIHRoZSBjb3B5cmlnaHQgc3ltYm9sIOKEoiB0aGUgdHJhZGUgbWFyayBzeW1ib2wgwq4gdGhlIHJlZ2lzdGVyZWQgdHJhZGUgbWFyayBzeW1ib2wgwqAgYSBub24gYnJlYWthYmxlIHNwYWNlLiDOlCBHcmVlayBsZXR0ZXIgRGVsdGEgzpQuIM6TIEdyZWVrIGxldHRlciBHYW1tYSDOky48L3A+XSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iNiI+PE5hbWU+Y29tbWVudF90b19odG1sX2NvbnZlcnNpb25fMzU8L05hbWU+PFVTUj5jOkBGQGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzM1IzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIGNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzM1KCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gwqkgdGhlIGNvcHlyaWdodCBzeW1ib2wg4oSiIHRoZSB0cmFkZSBtYXJrIHN5bWJvbCDCriB0aGUgcmVnaXN0ZXJlZCB0cmFkZSBtYXJrIHN5bWJvbCDCoCBhIG5vbiBicmVha2FibGUgc3BhY2UuIM6UIEdyZWVrIGxldHRlciBEZWx0YSDOlC4gzpMgR3JlZWsgbGV0dGVyIEdhbW1hIM6TLjwvUGFyYT48L0Fic3RyYWN0PjwvRnVuY3Rpb24+XQorLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06NjogRnVuY3Rpb25EZWNsPWNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzM1Ont7Lip9fSBGdWxsQ29tbWVudEFzSFRNTD1bPHAgY2xhc3M9InBhcmEtYnJpZWYiPiDCqSB0aGUgY29weXJpZ2h0IHN5bWJvbCDihKIgdGhlIHRyYWRlIG1hcmsgc3ltYm9sIMKuIHRoZSByZWdpc3RlcmVkIHRyYWRlIG1hcmsgc3ltYm9sIMKgIGEgbm9uLWJyZWFrYWJsZSBzcGFjZS4gzpQgR3JlZWsgbGV0dGVyIERlbHRhIM6ULiDOkyBHcmVlayBsZXR0ZXIgR2FtbWEgzpMuPC9wPl0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjYiPjxOYW1lPmNvbW1lbnRfdG9faHRtbF9jb252ZXJzaW9uXzM1PC9OYW1lPjxVU1I+YzpARkBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8zNSM8L1VTUj48RGVjbGFyYXRpb24+dm9pZCBjb21tZW50X3RvX2h0bWxfY29udmVyc2lvbl8zNSgpPC9EZWNsYXJhdGlvbj48QWJzdHJhY3Q+PFBhcmE+IMKpIHRoZSBjb3B5cmlnaHQgc3ltYm9sIOKEoiB0aGUgdHJhZGUgbWFyayBzeW1ib2wgwq4gdGhlIHJlZ2lzdGVyZWQgdHJhZGUgbWFyayBzeW1ib2wgwqAgYSBub24tYnJlYWthYmxlIHNwYWNlLiDOlCBHcmVlayBsZXR0ZXIgRGVsdGEgzpQuIM6TIEdyZWVrIGxldHRlciBHYW1tYSDOky48L1BhcmE+PC9BYnN0cmFjdD48L0Z1bmN0aW9uPl0KIC8vIENIRUNLLU5FWFQ6ICBDb21tZW50QVNUPVsKIC8vIENIRUNLLU5FWFQ6ICAgIChDWENvbW1lbnRfRnVsbENvbW1lbnQKIC8vIENIRUNLLU5FWFQ6ICAgICAgIChDWENvbW1lbnRfUGFyYWdyYXBoCkBAIC02NzMsNyArNzEzLDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgICAgICAgKENYQ29tbWVudF9UZXh0IFRleHQ9WyB0aGUgcmVnaXN0ZXJlZCB0cmFkZSBtYXJrIHN5bWJvbF0gSGFzVHJhaWxpbmdOZXdsaW5lKQogLy8gQ0hFQ0stTkVYVDogICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIF0gSXNXaGl0ZXNwYWNlKQogLy8gQ0hFQ0stTkVYVDogICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bwqBdKQotLy8gQ0hFQ0stTkVYVDogICAgICAgICAoQ1hDb21tZW50X1RleHQgVGV4dD1bIGEgbm9uIGJyZWFrYWJsZSBzcGFjZS5dIEhhc1RyYWlsaW5nTmV3bGluZSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgICAgKENYQ29tbWVudF9UZXh0IFRleHQ9WyBhIG5vbi1icmVha2FibGUgc3BhY2UuXSBIYXNUcmFpbGluZ05ld2xpbmUpCiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIChDWENvbW1lbnRfVGV4dCBUZXh0PVsgXSBJc1doaXRlc3BhY2UpCiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIChDWENvbW1lbnRfVGV4dCBUZXh0PVvOlF0pCiAvLyBDSEVDSy1ORVhUOiAgICAgICAgIChDWENvbW1lbnRfVGV4dCBUZXh0PVsgR3JlZWsgbGV0dGVyIERlbHRhIM6ULl0gSGFzVHJhaWxpbmdOZXdsaW5lKQpAQCAtNjk0LDcgKzczNCw3IEBACiAgIC8vLyBBYWEuCiAgIH5jb21tZW50X3RvX3htbF9jb252ZXJzaW9uXzAxKCk7CiAKLS8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjM6IENYWERlc3RydWN0b3I9fmNvbW1lbnRfdG9feG1sX2NvbnZlcnNpb25fMDE6e3suKn19IEZ1bGxDb21tZW50QXNYTUw9WzxGdW5jdGlvbiBpc0luc3RhbmNlTWV0aG9kPSIxIiBmaWxlPSJ7e1teIl0rfX1jb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwIiBsaW5lPSJbW0BMSU5FLTJdXSIgY29sdW1uPSIzIj48TmFtZT5+Y29tbWVudF90b194bWxfY29udmVyc2lvbl8wMTwvTmFtZT48VVNSPmM6QENAY29tbWVudF90b194bWxfY29udmVyc2lvbl8wMUBGQH5jb21tZW50X3RvX3htbF9jb252ZXJzaW9uXzAxIzwvVVNSPjxEZWNsYXJhdGlvbj52b2lkIH5jb21tZW50X3RvX3htbF9jb252ZXJzaW9uXzAxKCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWFhLjwvUGFyYT48L0Fic3RyYWN0PjwvRnVuY3Rpb24+XQorLy8gQ0hFQ0s6IGNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHA6W1tATElORS0yXV06MzogQ1hYRGVzdHJ1Y3Rvcj1+Y29tbWVudF90b194bWxfY29udmVyc2lvbl8wMTp7ey4qfX0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGlzSW5zdGFuY2VNZXRob2Q9IjEiIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjMiPjxOYW1lPn5jb21tZW50X3RvX3htbF9jb252ZXJzaW9uXzAxPC9OYW1lPjxVU1I+YzpAQ0Bjb21tZW50X3RvX3htbF9jb252ZXJzaW9uXzAxQEZAfmNvbW1lbnRfdG9feG1sX2NvbnZlcnNpb25fMDEjPC9VU1I+PERlY2xhcmF0aW9uPn5jb21tZW50X3RvX3htbF9jb252ZXJzaW9uXzAxKCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWFhLjwvUGFyYT48L0Fic3RyYWN0PjwvRnVuY3Rpb24+XQogCiAgIC8vLyBccGFyYW0gYWFhIEJsYWggYmxhaC4KICAgaW50IGNvbW1lbnRfdG9feG1sX2NvbnZlcnNpb25fMDIoaW50IGFhYSk7CkBAIC03MjQsNyArNzY0LDcgQEAKICAgLy8vIEFhYS4KICAgb3BlcmF0b3IgYm9vbCgpOwogCi0vLyBDSEVDSzogY29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcDpbW0BMSU5FLTJdXTozOiBDWFhDb252ZXJzaW9uPW9wZXJhdG9yIF9Cb29sOnt7Lip9fSBGdWxsQ29tbWVudEFzWE1MPVs8RnVuY3Rpb24gaXNJbnN0YW5jZU1ldGhvZD0iMSIgZmlsZT0ie3tbXiJdK319Y29tbWVudC10by1odG1sLXhtbC1jb252ZXJzaW9uLmNwcCIgbGluZT0iW1tATElORS0yXV0iIGNvbHVtbj0iMyI+PE5hbWU+b3BlcmF0b3IgX0Jvb2w8L05hbWU+PFVTUj5jOkBDQGNvbW1lbnRfdG9feG1sX2NvbnZlcnNpb25fMDFARkBvcGVyYXRvciBfQm9vbCM8L1VTUj48RGVjbGFyYXRpb24+Ym9vbCBvcGVyYXRvciBfQm9vbCgpPC9EZWNsYXJhdGlvbj48QWJzdHJhY3Q+PFBhcmE+IEFhYS48L1BhcmE+PC9BYnN0cmFjdD48L0Z1bmN0aW9uPl0KKy8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMl1dOjM6IENYWENvbnZlcnNpb249b3BlcmF0b3IgYm9vbDp7ey4qfX0gRnVsbENvbW1lbnRBc1hNTD1bPEZ1bmN0aW9uIGlzSW5zdGFuY2VNZXRob2Q9IjEiIGZpbGU9Int7W14iXSt9fWNvbW1lbnQtdG8taHRtbC14bWwtY29udmVyc2lvbi5jcHAiIGxpbmU9IltbQExJTkUtMl1dIiBjb2x1bW49IjMiPjxOYW1lPm9wZXJhdG9yIGJvb2w8L05hbWU+PFVTUj5jOkBDQGNvbW1lbnRfdG9feG1sX2NvbnZlcnNpb25fMDFARkBvcGVyYXRvciBib29sIzwvVVNSPjxEZWNsYXJhdGlvbj5vcGVyYXRvciBib29sKCk8L0RlY2xhcmF0aW9uPjxBYnN0cmFjdD48UGFyYT4gQWFhLjwvUGFyYT48L0Fic3RyYWN0PjwvRnVuY3Rpb24+XQogCiAgIC8vLyBBYWEuCiAgIHR5cGVkZWYgaW50IGNvbW1lbnRfdG9feG1sX2NvbnZlcnNpb25fMDY7CkBAIC05NzUsMTcgKzEwMTUsNSBAQAogLy8gQ0hFQ0stTkVYVDogICAgICAgICAoQ1hDb21tZW50X1BhcmFncmFwaAogLy8gQ0hFQ0stTkVYVDogICAgICAgICAgIChDWENvbW1lbnRfVGV4dCBUZXh0PVsgQ2NjLl0pKSkpXQogCi0KLS8vIHJkYXI6Ly8xNDM0ODkxMgotI2RlZmluZSBOU19FTlVNKF90eXBlLCBfbmFtZSkgZW51bSBfbmFtZSA6IF90eXBlIF9uYW1lOyBlbnVtIF9uYW1lIDogX3R5cGUKLQotLyoqISBEb2N1bWVudGF0aW9uIGNvbW1lbnQgKi8KLXR5cGVkZWYgTlNfRU5VTShpbnQsIENvbG9yKSB7IFJlZCwgR3JlZW4sIEJsdWUgfTsKLS8vIENIRUNLOiBjb21tZW50LXRvLWh0bWwteG1sLWNvbnZlcnNpb24uY3BwOltbQExJTkUtMV1dOjIyOiBUeXBlZGVmRGVjbD1Db2xvcjpbW0BMSU5FLTFdXToyMgotLy8gQ0hFQ0stTkVYVDogIENvbW1lbnRBU1Q9WwotLy8gQ0hFQ0stTkVYVDogICAgKENYQ29tbWVudF9GdWxsQ29tbWVudAotLy8gQ0hFQ0stTkVYVDogICAgICAgKENYQ29tbWVudF9QYXJhZ3JhcGgKLS8vIENIRUNLLU5FWFQ6ICAgICAgICAgKENYQ29tbWVudF9UZXh0IFRleHQ9WyEgRG9jdW1lbnRhdGlvbiBjb21tZW50IF0pKSldIAotCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9jb21tZW50LXhtbC1zY2hlbWEuYyBiL3Rlc3QvSW5kZXgvY29tbWVudC14bWwtc2NoZW1hLmMKaW5kZXggMmJiZGZjZi4uMzdjYjQ3YyAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9jb21tZW50LXhtbC1zY2hlbWEuYworKysgYi90ZXN0L0luZGV4L2NvbW1lbnQteG1sLXNjaGVtYS5jCkBAIC0xMSw2ICsxMSw3IEBACiAvLyBSVU46IHhtbGxpbnQgLS1ub291dCAtLXJlbGF4bmcgJVMvLi4vLi4vYmluZGluZ3MveG1sL2NvbW1lbnQteG1sLXNjaGVtYS5ybmcgJVMvSW5wdXRzL0NvbW1lbnRYTUwvdmFsaWQtZnVuY3Rpb24tMDcueG1sCiAvLyBSVU46IHhtbGxpbnQgLS1ub291dCAtLXJlbGF4bmcgJVMvLi4vLi4vYmluZGluZ3MveG1sL2NvbW1lbnQteG1sLXNjaGVtYS5ybmcgJVMvSW5wdXRzL0NvbW1lbnRYTUwvdmFsaWQtZnVuY3Rpb24tMDgueG1sCiAvLyBSVU46IHhtbGxpbnQgLS1ub291dCAtLXJlbGF4bmcgJVMvLi4vLi4vYmluZGluZ3MveG1sL2NvbW1lbnQteG1sLXNjaGVtYS5ybmcgJVMvSW5wdXRzL0NvbW1lbnRYTUwvdmFsaWQtZnVuY3Rpb24tMDkueG1sCisvLyBSVU46IHhtbGxpbnQgLS1ub291dCAtLXJlbGF4bmcgJVMvLi4vLi4vYmluZGluZ3MveG1sL2NvbW1lbnQteG1sLXNjaGVtYS5ybmcgJVMvSW5wdXRzL0NvbW1lbnRYTUwvdmFsaWQtZnVuY3Rpb24tMTAueG1sCiAvLwogLy8gUlVOOiB4bWxsaW50IC0tbm9vdXQgLS1yZWxheG5nICVTLy4uLy4uL2JpbmRpbmdzL3htbC9jb21tZW50LXhtbC1zY2hlbWEucm5nICVTL0lucHV0cy9Db21tZW50WE1ML3ZhbGlkLWF2YWlsYWJpbGl0eS1hdHRyLTAxLnhtbAogLy8gUlVOOiB4bWxsaW50IC0tbm9vdXQgLS1yZWxheG5nICVTLy4uLy4uL2JpbmRpbmdzL3htbC9jb21tZW50LXhtbC1zY2hlbWEucm5nICVTL0lucHV0cy9Db21tZW50WE1ML3ZhbGlkLWF2YWlsYWJpbGl0eS1hdHRyLTAyLnhtbApkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9jb21wbGV0ZS1tZXRob2QtZGVjbHMubSBiL3Rlc3QvSW5kZXgvY29tcGxldGUtbWV0aG9kLWRlY2xzLm0KaW5kZXggOWU1MmQ5My4uZWNlYWE4MyAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9jb21wbGV0ZS1tZXRob2QtZGVjbHMubQorKysgYi90ZXN0L0luZGV4L2NvbXBsZXRlLW1ldGhvZC1kZWNscy5tCkBAIC03Miw2ICs3MiwxOSBAQAogLSAob25ld2F5IHZvaWQpbWV0aG9kOihpbiBpZCB4KSB7fQogQGVuZAogCit0eXBlZGVmIEEgTXlPYmplY3Q7Cit0eXBlZGVmIEEgKk15T2JqZWN0UmVmOworCitAaW50ZXJmYWNlIEkxCistKENsYXNzPFAxPiltZXRoOworLShNeU9iamVjdCA8UDE+ICopbWV0aDI7CistKE15T2JqZWN0UmVmKW1ldGgzOworQGVuZAorCitAaW1wbGVtZW50YXRpb24gSTEKKy0KK0BlbmQKKwogLy8gUlVOOiBjLWluZGV4LXRlc3QgLWNvZGUtY29tcGxldGlvbi1hdD0lczoxNzozICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQ0MxICVzCiAvLyBDSEVDSy1DQzE6IE9iakNJbnN0YW5jZU1ldGhvZERlY2w6e0xlZnRQYXJlbiAofXtUZXh0IGlkfXtSaWdodFBhcmVuICl9e1R5cGVkVGV4dCBhYmN9ICg0MCkKIC8vIENIRUNLLUNDMTogT2JqQ0luc3RhbmNlTWV0aG9kRGVjbDp7TGVmdFBhcmVuICh9e1RleHQgaW50fXtSaWdodFBhcmVuICl9e1R5cGVkVGV4dCBnZXRJbnR9ICg0MCkKQEAgLTE4MiwzICsxOTUsOSBAQAogCiAvLyBSVU46IGMtaW5kZXgtdGVzdCAtY29kZS1jb21wbGV0aW9uLWF0PSVzOjcyOjIgJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1PTkVXQVkgJXMKIC8vIENIRUNLLU9ORVdBWTogT2JqQ0luc3RhbmNlTWV0aG9kRGVjbDp7TGVmdFBhcmVuICh9e1RleHQgb25ld2F5IH17VGV4dCB2b2lkfXtSaWdodFBhcmVuICl9e1R5cGVkVGV4dCBtZXRob2R9e1R5cGVkVGV4dCA6fXtMZWZ0UGFyZW4gKH17VGV4dCBpbiB9e1RleHQgaWR9e1JpZ2h0UGFyZW4gKX17VGV4dCB4fSAoNDApCisKKy8vIFJVTjogYy1pbmRleC10ZXN0IC1jb2RlLWNvbXBsZXRpb24tYXQ9JXM6ODU6MiAlcyB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUNMQVNTVFkgJXMKKy8vIENIRUNLLUNMQVNTVFk6IE9iakNJbnN0YW5jZU1ldGhvZERlY2w6e0xlZnRQYXJlbiAofXtUZXh0IENsYXNzPFAxPn17UmlnaHRQYXJlbiApfXtUeXBlZFRleHQgbWV0aH0KKy8vIEZJWE1FOiBJdCBzaG91bGQgYmUgIk15T2JqZWN0IDxQMT4gKiIiCisvLyBDSEVDSy1DTEFTU1RZOiBPYmpDSW5zdGFuY2VNZXRob2REZWNsOntMZWZ0UGFyZW4gKH17VGV4dCBBPFAxPiAqfXtSaWdodFBhcmVuICl9e1R5cGVkVGV4dCBtZXRoMn0KKy8vIENIRUNLLUNMQVNTVFk6IE9iakNJbnN0YW5jZU1ldGhvZERlY2w6e0xlZnRQYXJlbiAofXtUZXh0IE15T2JqZWN0UmVmfXtSaWdodFBhcmVuICl9e1R5cGVkVGV4dCBtZXRoM30KZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvY29tcGxldGUtcHJvcGVydHktZmxhZ3MubSBiL3Rlc3QvSW5kZXgvY29tcGxldGUtcHJvcGVydHktZmxhZ3MubQppbmRleCA4NmVlOGUyLi4xM2VjMWU3IDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L2NvbXBsZXRlLXByb3BlcnR5LWZsYWdzLm0KKysrIGIvdGVzdC9JbmRleC9jb21wbGV0ZS1wcm9wZXJ0eS1mbGFncy5tCkBAIC0xMSwxMiArMTEsMTIgQEAKIC8vIENIRUNLLUNDMToge1R5cGVkVGV4dCBhc3NpZ259CiAvLyBDSEVDSy1DQzEtTkVYVDoge1R5cGVkVGV4dCBhdG9taWN9CiAvLyBDSEVDSy1DQzEtTkVYVDoge1R5cGVkVGV4dCBjb3B5fQotLy8gQ0hFQ0stQ0MxLU5FWFQ6IHtUeXBlZFRleHQgZ2V0dGVyfXtUZXh0ICA9IH17UGxhY2Vob2xkZXIgbWV0aG9kfQorLy8gQ0hFQ0stQ0MxLU5FWFQ6IHtUeXBlZFRleHQgZ2V0dGVyfXtUZXh0ID19e1BsYWNlaG9sZGVyIG1ldGhvZH0KIC8vIENIRUNLLUNDMS1ORVhUOiB7VHlwZWRUZXh0IG5vbmF0b21pY30KIC8vIENIRUNLLUNDMS1ORVhUOiB7VHlwZWRUZXh0IHJlYWRvbmx5fQogLy8gQ0hFQ0stQ0MxLU5FWFQ6IHtUeXBlZFRleHQgcmVhZHdyaXRlfQogLy8gQ0hFQ0stQ0MxLU5FWFQ6IHtUeXBlZFRleHQgcmV0YWlufQotLy8gQ0hFQ0stQ0MxLU5FWFQ6IHtUeXBlZFRleHQgc2V0dGVyfXtUZXh0ICA9IH17UGxhY2Vob2xkZXIgbWV0aG9kfQorLy8gQ0hFQ0stQ0MxLU5FWFQ6IHtUeXBlZFRleHQgc2V0dGVyfXtUZXh0ID19e1BsYWNlaG9sZGVyIG1ldGhvZH0KIC8vIENIRUNLLUNDMS1ORVhUOiB7VHlwZWRUZXh0IHN0cm9uZ30KIC8vIENIRUNLLUNDMS1ORVhUOiB7VHlwZWRUZXh0IHVuc2FmZV91bnJldGFpbmVkfQogLy8gQ0hFQ0stQ0MxLU5PVDoge1R5cGVkVGV4dCB3ZWFrfQpAQCAtMjUsMjAgKzI1LDIwIEBACiAvLyBDSEVDSy1DQzEtQVJDOiB7VHlwZWRUZXh0IGFzc2lnbn0KIC8vIENIRUNLLUNDMS1BUkMtTkVYVDoge1R5cGVkVGV4dCBhdG9taWN9CiAvLyBDSEVDSy1DQzEtQVJDLU5FWFQ6IHtUeXBlZFRleHQgY29weX0KLS8vIENIRUNLLUNDMS1BUkMtTkVYVDoge1R5cGVkVGV4dCBnZXR0ZXJ9e1RleHQgID0gfXtQbGFjZWhvbGRlciBtZXRob2R9CisvLyBDSEVDSy1DQzEtQVJDLU5FWFQ6IHtUeXBlZFRleHQgZ2V0dGVyfXtUZXh0ID19e1BsYWNlaG9sZGVyIG1ldGhvZH0KIC8vIENIRUNLLUNDMS1BUkMtTkVYVDoge1R5cGVkVGV4dCBub25hdG9taWN9CiAvLyBDSEVDSy1DQzEtQVJDLU5FWFQ6IHtUeXBlZFRleHQgcmVhZG9ubHl9CiAvLyBDSEVDSy1DQzEtQVJDLU5FWFQ6IHtUeXBlZFRleHQgcmVhZHdyaXRlfQogLy8gQ0hFQ0stQ0MxLUFSQy1ORVhUOiB7VHlwZWRUZXh0IHJldGFpbn0KLS8vIENIRUNLLUNDMS1BUkMtTkVYVDoge1R5cGVkVGV4dCBzZXR0ZXJ9e1RleHQgID0gfXtQbGFjZWhvbGRlciBtZXRob2R9CisvLyBDSEVDSy1DQzEtQVJDLU5FWFQ6IHtUeXBlZFRleHQgc2V0dGVyfXtUZXh0ID19e1BsYWNlaG9sZGVyIG1ldGhvZH0KIC8vIENIRUNLLUNDMS1BUkMtTkVYVDoge1R5cGVkVGV4dCBzdHJvbmd9CiAvLyBDSEVDSy1DQzEtQVJDLU5FWFQ6IHtUeXBlZFRleHQgdW5zYWZlX3VucmV0YWluZWR9CiAvLyBDSEVDSy1DQzEtQVJDLU5FWFQ6IHtUeXBlZFRleHQgd2Vha30KIAogLy8gUlVOOiBjLWluZGV4LXRlc3QgLWNvZGUtY29tcGxldGlvbi1hdD0lczo4OjE4ICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQ0MyICVzCi0vLyBDSEVDSy1DQzI6IHtUeXBlZFRleHQgZ2V0dGVyfXtUZXh0ICA9IH17UGxhY2Vob2xkZXIgbWV0aG9kfQorLy8gQ0hFQ0stQ0MyOiB7VHlwZWRUZXh0IGdldHRlcn17VGV4dCA9fXtQbGFjZWhvbGRlciBtZXRob2R9CiAvLyBDSEVDSy1DQzItTkVYVDoge1R5cGVkVGV4dCBub25hdG9taWN9CiAvLyBDSEVDSy1DQzItTkVYVDoge1R5cGVkVGV4dCByZWFkb25seX0KIC8vIENIRUNLLUNDMi1ORVhUOiB7VHlwZWRUZXh0IHJlYWR3cml0ZX0KLS8vIENIRUNLLUNDMi1ORVhUOiB7VHlwZWRUZXh0IHNldHRlcn17VGV4dCAgPSB9e1BsYWNlaG9sZGVyIG1ldGhvZH0KKy8vIENIRUNLLUNDMi1ORVhUOiB7VHlwZWRUZXh0IHNldHRlcn17VGV4dCA9fXtQbGFjZWhvbGRlciBtZXRob2R9CiBAZW5kCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L2NvbXBsZXRlLXJlY292ZXJ5Lm0gYi90ZXN0L0luZGV4L2NvbXBsZXRlLXJlY292ZXJ5Lm0KaW5kZXggMTlkZTBmYi4uZWM1YmY4YSAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9jb21wbGV0ZS1yZWNvdmVyeS5tCisrKyBiL3Rlc3QvSW5kZXgvY29tcGxldGUtcmVjb3ZlcnkubQpAQCAtMjMsNyArMjMsNyBAQAogLy8gQ0hFQ0stQ0MxOiBWYXJEZWNsOntSZXN1bHRUeXBlIEEgKn17VHlwZWRUZXh0IGF9CiAvLyBDSEVDSy1DQzE6IE5vdEltcGxlbWVudGVkOntSZXN1bHRUeXBlIHNpemVfdH17VHlwZWRUZXh0IHNpemVvZn17TGVmdFBhcmVuICh9e1BsYWNlaG9sZGVyIGV4cHJlc3Npb24tb3ItdHlwZX17UmlnaHRQYXJlbiApfQogCi0vLyBUZXN0IGNhc2UgZm9yIGZpeCBjb21pdHRlZCBpbiByMTQ1NDQxLiAKKy8vIFRlc3QgY2FzZSBmb3IgZml4IGNvbW1pdHRlZCBpbiByMTQ1NDQxLgogLy8gUlVOOiBlbnYgQ0lOREVYVEVTVF9DT0RFX0NPTVBMRVRFX1BBVFRFUk5TPTEgYy1pbmRleC10ZXN0IC1jb2RlLWNvbXBsZXRpb24tYXQ9JXM6OToyMCAlcyAtZm1zLWNvbXBhdGliaWxpdHkgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DQzEgJXMKIAogLy8gUlVOOiBlbnYgQ0lOREVYVEVTVF9DT0RFX0NPTVBMRVRFX1BBVFRFUk5TPTEgYy1pbmRleC10ZXN0IC1jb2RlLWNvbXBsZXRpb24tYXQ9JXM6MTA6MjQgJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1DQzIgJXMKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvY3Jhc2gtcmVjb3ZlcnktY29kZS1jb21wbGV0ZS5jIGIvdGVzdC9JbmRleC9jcmFzaC1yZWNvdmVyeS1jb2RlLWNvbXBsZXRlLmMKaW5kZXggYzUwMmNlNS4uYjJhMWE5YiAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9jcmFzaC1yZWNvdmVyeS1jb2RlLWNvbXBsZXRlLmMKKysrIGIvdGVzdC9JbmRleC9jcmFzaC1yZWNvdmVyeS1jb2RlLWNvbXBsZXRlLmMKQEAgLTEsNiArMSw2IEBACiAvLyBSVU46IGVudiBDSU5ERVhURVNUX0VESVRJTkc9MSBDSU5ERVhURVNUX1BSRUFNQkxFX0ZJTEU9JXQtcHJlYW1ibGUucGNoIFwKIC8vIFJVTjogICBub3QgYy1pbmRleC10ZXN0IC1jb2RlLWNvbXBsZXRpb24tYXQ9JXM6MjA6MSBcCi0vLyBSVU46ICAgIi1yZW1hcC1maWxlPSVzOyVTL0lucHV0cy9jcmFzaC1yZWNvdmVyeS1jb2RlLWNvbXBsZXRlLXJlbWFwLmMiIFwKKy8vIFJVTjogICAiLXJlbWFwLWZpbGU9JXMsJVMvSW5wdXRzL2NyYXNoLXJlY292ZXJ5LWNvZGUtY29tcGxldGUtcmVtYXAuYyIgXAogLy8gUlVOOiAgICVzIDI+ICV0LmVycgogLy8gUlVOOiBGaWxlQ2hlY2sgPCAldC5lcnIgLWNoZWNrLXByZWZpeD1DSEVDSy1DT0RFLUNPTVBMRVRFLUNSQVNIICVzCiAvLyBSVU46IHRlc3QgISAtZSAldC1wcmVhbWJsZS5wY2gKQEAgLTksNiArOSw2IEBACiAvLyBSRVFVSVJFUzogY3Jhc2gtcmVjb3ZlcnkKIAogLy8gRklYTUU6IFBsZWFzZSBpbnZlc3RpZ2F0ZSBhYm5vcm1hbCBwYXRoIGluIE1lbW9yeUJ1ZmZlci4KLS8vIFhGQUlMOiBtaW5ndzMyLHdpbjMyCisvLyBSRVFVSVJFUzogY2FuLXJlbW92ZS1vcGVuZWQtZmlsZQogCiAjd2FybmluZyBwYXJzaW5nIG9yaWdpbmFsIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvY3Jhc2gtcmVjb3ZlcnktcmVwYXJzZS5jIGIvdGVzdC9JbmRleC9jcmFzaC1yZWNvdmVyeS1yZXBhcnNlLmMKaW5kZXggZTNmNzI2NS4uYmFhNjYwNCAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9jcmFzaC1yZWNvdmVyeS1yZXBhcnNlLmMKKysrIGIvdGVzdC9JbmRleC9jcmFzaC1yZWNvdmVyeS1yZXBhcnNlLmMKQEAgLTEsNiArMSw2IEBACiAvLyBSVU46IGVudiBDSU5ERVhURVNUX0VESVRJTkc9MSBDSU5ERVhURVNUX1BSRUFNQkxFX0ZJTEU9JXQtcHJlYW1ibGUucGNoIFwKIC8vIFJVTjogICBub3QgYy1pbmRleC10ZXN0IC10ZXN0LWxvYWQtc291cmNlLXJlcGFyc2UgMSBsb2NhbCBcCi0vLyBSVU46ICAgLXJlbWFwLWZpbGU9IiVzOyVTL0lucHV0cy9jcmFzaC1yZWNvdmVyeS1yZXBhcnNlLXJlbWFwLmMiIFwKKy8vIFJVTjogICAtcmVtYXAtZmlsZT0iJXMsJVMvSW5wdXRzL2NyYXNoLXJlY292ZXJ5LXJlcGFyc2UtcmVtYXAuYyIgXAogLy8gUlVOOiAgICVzIDI+ICV0LmVycgogLy8gUlVOOiBGaWxlQ2hlY2sgPCAldC5lcnIgLWNoZWNrLXByZWZpeD1DSEVDSy1SRVBBUlNFLVNPVVJDRS1DUkFTSCAlcwogLy8gUlVOOiB0ZXN0ICEgLWUgJHQtcHJlYW1ibGUucGNoCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L2NyYXNoLXJlY292ZXJ5LmMgYi90ZXN0L0luZGV4L2NyYXNoLXJlY292ZXJ5LmMKaW5kZXggYjdmNmUwYi4uZThlODRiYyAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9jcmFzaC1yZWNvdmVyeS5jCisrKyBiL3Rlc3QvSW5kZXgvY3Jhc2gtcmVjb3ZlcnkuYwpAQCAtMSw2ICsxLDcgQEAKIC8vIFJVTjogbm90IGMtaW5kZXgtdGVzdCAtdGVzdC1sb2FkLXNvdXJjZSBhbGwgJXMgMj4gJXQuZXJyCiAvLyBSVU46IEZpbGVDaGVjayA8ICV0LmVyciAtY2hlY2stcHJlZml4PUNIRUNLLUxPQUQtU09VUkNFLUNSQVNIICVzCiAvLyBDSEVDSy1MT0FELVNPVVJDRS1DUkFTSDogVW5hYmxlIHRvIGxvYWQgdHJhbnNsYXRpb24gdW5pdAorLy8gUlVOOiBlbnYgTElCQ0xBTkdfRElTQUJMRV9DUkFTSF9SRUNPVkVSWT0xIG5vdCAtLWNyYXNoIGMtaW5kZXgtdGVzdCAtdGVzdC1sb2FkLXNvdXJjZSBhbGwgJXMKIC8vCiAvLyBSRVFVSVJFUzogY3Jhc2gtcmVjb3ZlcnkKIApkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9jeHgxMS1sYW1iZGFzLmNwcCBiL3Rlc3QvSW5kZXgvY3h4MTEtbGFtYmRhcy5jcHAKaW5kZXggOTNkYjAyMi4uYWZiNTQwYSAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9jeHgxMS1sYW1iZGFzLmNwcAorKysgYi90ZXN0L0luZGV4L2N4eDExLWxhbWJkYXMuY3BwCkBAIC0yNiw4ICsyNiw4IEBACiAvLyBSVU46IGVudiBDSU5ERVhURVNUX0lOREVYTE9DQUxTWU1CT0xTPTEgYy1pbmRleC10ZXN0IC1pbmRleC1maWxlIC1zdGQ9YysrMTEgJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1JTkRFWCAlcwogLy8gQ0hFQ0stSU5ERVg6IFtpbmRleEVudGl0eVJlZmVyZW5jZV06IGtpbmQ6IHZhcmlhYmxlIHwgbmFtZTogbG9jYWxBIHwgVVNSOiBjOmN4eDExLWxhbWJkYXMuY3BwQDEwMEBTQFhARkBmI0Bsb2NhbEEgfCBsYW5nOiBDIHwgY3Vyc29yOiBWYXJpYWJsZVJlZj1sb2NhbEE6Njo5IHwgbG9jOiA3OjIxCiAvLyBDSEVDSy1JTkRFWDogW2luZGV4RW50aXR5UmVmZXJlbmNlXToga2luZDogdmFyaWFibGUgfCBuYW1lOiBsb2NhbEIgfCBVU1I6IGM6Y3h4MTEtbGFtYmRhcy5jcHBAMTAwQFNAWEBGQGYjQGxvY2FsQiB8IGxhbmc6IEMgfCBjdXJzb3I6IFZhcmlhYmxlUmVmPWxvY2FsQjo2OjE3IHwgbG9jOiA3OjI5Ci0vLyBDSEVDSy1JTkRFWDogW2luZGV4RW50aXR5UmVmZXJlbmNlXToga2luZDogdHlwZWRlZiB8IG5hbWU6IEludGVnZXIgfCBVU1I6IGM6Y3h4MTEtbGFtYmRhcy5jcHBANTFAVEBJbnRlZ2VyIHwgbGFuZzogQyB8IGN1cnNvcjogVHlwZVJlZj1JbnRlZ2VyOjM6MTMgfCBsb2M6IDc6NTIKLS8vIENIRUNLLUlOREVYOiBbaW5kZXhFbnRpdHlSZWZlcmVuY2VdOiBraW5kOiB0eXBlZGVmIHwgbmFtZTogSW50ZWdlciB8IFVTUjogYzpjeHgxMS1sYW1iZGFzLmNwcEA1MUBUQEludGVnZXIgfCBsYW5nOiBDIHwgY3Vyc29yOiBUeXBlUmVmPUludGVnZXI6MzoxMyB8IGxvYzogNzozOAorLy8gQ0hFQ0stSU5ERVg6IFtpbmRleEVudGl0eVJlZmVyZW5jZV06IGtpbmQ6IHR5cGVkZWYgfCBuYW1lOiBJbnRlZ2VyIHwgVVNSOiBjOmN4eDExLWxhbWJkYXMuY3BwQFRASW50ZWdlciB8IGxhbmc6IEMgfCBjdXJzb3I6IFR5cGVSZWY9SW50ZWdlcjozOjEzIHwgbG9jOiA3OjUyCisvLyBDSEVDSy1JTkRFWDogW2luZGV4RW50aXR5UmVmZXJlbmNlXToga2luZDogdHlwZWRlZiB8IG5hbWU6IEludGVnZXIgfCBVU1I6IGM6Y3h4MTEtbGFtYmRhcy5jcHBAVEBJbnRlZ2VyIHwgbGFuZzogQyB8IGN1cnNvcjogVHlwZVJlZj1JbnRlZ2VyOjM6MTMgfCBsb2M6IDc6MzgKIC8vIENIRUNLLUlOREVYOiBbaW5kZXhFbnRpdHlSZWZlcmVuY2VdOiBraW5kOiB2YXJpYWJsZSB8IG5hbWU6IGxvY2FsQSB8IFVTUjogYzpjeHgxMS1sYW1iZGFzLmNwcEAxMDBAU0BYQEZAZiNAbG9jYWxBIHwgbGFuZzogQyB8IGN1cnNvcjogRGVjbFJlZkV4cHI9bG9jYWxBOjY6OSB8IGxvYzogODoxNAogLy8gQ0hFQ0stSU5ERVg6IFtpbmRleEVudGl0eVJlZmVyZW5jZV06IGtpbmQ6IHZhcmlhYmxlIHwgbmFtZTogbG9jYWxCIHwgVVNSOiBjOmN4eDExLWxhbWJkYXMuY3BwQDEwMEBTQFhARkBmI0Bsb2NhbEIgfCBsYW5nOiBDIHwgY3Vyc29yOiBEZWNsUmVmRXhwcj1sb2NhbEI6NjoxNyB8IGxvYzogODoyMwogLy8gQ0hFQ0stSU5ERVg6IFtpbmRleEVudGl0eVJlZmVyZW5jZV06IGtpbmQ6IHZhcmlhYmxlIHwgbmFtZTogeCB8IFVTUjogYzpjeHgxMS1sYW1iZGFzLmNwcEAxNTdAU0BYQEZAZiNAQ2FARkBvcGVyYXRvcigpI0kjMUB4IHwgbGFuZzogQyB8IGN1cnNvcjogRGVjbFJlZkV4cHI9eDo3OjQ2IHwgbG9jOiA4OjMyCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L2ZpeC1pdHMubSBiL3Rlc3QvSW5kZXgvZml4LWl0cy5tCmluZGV4IGIzMDdjZjQuLmZhYmNkYjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvSW5kZXgvZml4LWl0cy5tCisrKyBiL3Rlc3QvSW5kZXgvZml4LWl0cy5tCkBAIC0yNCw1ICsyNCwzIEBACiAvLyBDSEVDSzogTnVtYmVyIEZJWC1JVHMgPSAwCiAvLyBDSEVDSzogZml4LWl0cy5tOjc6Nzc6IG5vdGU6IGV4cGFuZGVkIGZyb20gbWFjcm8gJ19yZGFyXzEyNTg0NTU0X0InCiAvLyBDSEVDSzogTnVtYmVyIEZJWC1JVHMgPSAwCi0vLyBDSEVDSzogZml4LWl0cy5tOjU6MTcyOiBub3RlOiBwYXNzaW5nIGFyZ3VtZW50IHRvIHBhcmFtZXRlciAnbXNnRm9ybWF0JyBoZXJlCi0vLyBDSEVDSzogTnVtYmVyIEZJWC1JVHMgPSAwCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L2luZGV4LXJlZnMuY3BwIGIvdGVzdC9JbmRleC9pbmRleC1yZWZzLmNwcAppbmRleCA3N2UyYWY3Li5hZGJmMDJhIDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L2luZGV4LXJlZnMuY3BwCisrKyBiL3Rlc3QvSW5kZXgvaW5kZXgtcmVmcy5jcHAKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiAvLyBDSEVDSzogICAgICBbaW5kZXhEZWNsYXJhdGlvbl06IGtpbmQ6IGMrKy1jbGFzcy10ZW1wbGF0ZSB8IG5hbWU6IFRTIHwge3suKn19IHwgbG9jOiA0Nzo4CiAvLyBDSEVDSy1ORVhUOiBbaW5kZXhEZWNsYXJhdGlvbl06IGtpbmQ6IHN0cnVjdC10ZW1wbGF0ZS1wYXJ0aWFsLXNwZWMgfCBuYW1lOiBUUyB8IFVTUjogYzpAU1A+MSNUQFRTPiN0MC4wI0kgfCB7ey4qfX0gfCBsb2M6IDUwOjgKLS8vIENIRUNLLU5FWFQ6IFtpbmRleERlY2xhcmF0aW9uXToga2luZDogdHlwZWRlZiB8IG5hbWU6IE15SW50IHwgVVNSOiBjOmluZGV4LXJlZnMuY3BwQDU5M0BTUD4xI1RAVFM+I3QwLjAjSUBUQE15SW50IHwge3suKn19IHwgbG9jOiA1MToxNSB8IHNlbWFudGljLWNvbnRhaW5lcjogW1RTOjUwOjhdIHwgbGV4aWNhbC1jb250YWluZXI6IFtUUzo1MDo4XQorLy8gQ0hFQ0stTkVYVDogW2luZGV4RGVjbGFyYXRpb25dOiBraW5kOiB0eXBlZGVmIHwgbmFtZTogTXlJbnQgfCBVU1I6IGM6aW5kZXgtcmVmcy5jcHBAU1A+MSNUQFRTPiN0MC4wI0lAVEBNeUludCB8IHt7Lip9fSB8IGxvYzogNTE6MTUgfCBzZW1hbnRpYy1jb250YWluZXI6IFtUUzo1MDo4XSB8IGxleGljYWwtY29udGFpbmVyOiBbVFM6NTA6OF0KIC8qIHdoZW4gaW5kZXhpbmcgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMKICAgW2luZGV4RGVjbGFyYXRpb25dOiBraW5kOiBzdHJ1Y3QtdGVtcGxhdGUtc3BlYyB8IG5hbWU6IFRTIHwgVVNSOiBjOkBTQFRTPiNJIHwge3suKn19IHwgbG9jOiA1MDo4CiAgIFtpbmRleERlY2xhcmF0aW9uXToga2luZDogdHlwZWRlZiB8IG5hbWU6IE15SW50IHwgVVNSOiBjOmluZGV4LXJlZnMuY3BwQDU5M0BTQFRTPiNJQFRATXlJbnQgfCB7ey4qfX0gfCBsb2M6IDUxOjE1IHwgc2VtYW50aWMtY29udGFpbmVyOiBbVFM6NTA6OF0gfCBsZXhpY2FsLWNvbnRhaW5lcjogW1RTOjUwOjhdCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L2luZGV4LXRlbXBsYXRlcy5jcHAgYi90ZXN0L0luZGV4L2luZGV4LXRlbXBsYXRlcy5jcHAKaW5kZXggMDUwNjhkZi4uNWZjYjY1MiAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9pbmRleC10ZW1wbGF0ZXMuY3BwCisrKyBiL3Rlc3QvSW5kZXgvaW5kZXgtdGVtcGxhdGVzLmNwcApAQCAtMTQzLDcgKzE0Myw3IEBACiAvLyBDSEVDSy1MT0FEOiBpbmRleC10ZW1wbGF0ZXMuY3BwOjQwOjg6IENsYXNzVGVtcGxhdGU9c3RvcmFnZTo0MDo4IChEZWZpbml0aW9uKSBFeHRlbnQ9WzM5OjEgLSA0MDoxOV0KIC8vIENIRUNLLUxPQUQ6IGluZGV4LXRlbXBsYXRlcy5jcHA6Mzk6NDU6IFRlbXBsYXRlVGVtcGxhdGVQYXJhbWV0ZXI9RGF0YVN0cnVjdHVyZTozOTo0NSAoRGVmaW5pdGlvbikgRXh0ZW50PVszOToxMCAtIDM5OjY2XQogLy8gQ0hFQ0stTE9BRDogaW5kZXgtdGVtcGxhdGVzLmNwcDozOToxOTogVGVtcGxhdGVUeXBlUGFyYW1ldGVyPTozOToxOSAoRGVmaW5pdGlvbikgRXh0ZW50PVszOToxOSAtIDM5OjI3XQotLy8gQ0hFQ0stTE9BRDogaW5kZXgtdGVtcGxhdGVzLmNwcDozOTozNzogTm9uVHlwZVRlbXBsYXRlUGFyYW1ldGVyPTozOTozNyAoRGVmaW5pdGlvbikgRXh0ZW50PVszOToyOSAtIDM5OjM4XQorLy8gQ0hFQ0stTE9BRDogaW5kZXgtdGVtcGxhdGVzLmNwcDozOTozNzogTm9uVHlwZVRlbXBsYXRlUGFyYW1ldGVyPTozOTozNyAoRGVmaW5pdGlvbikgRXh0ZW50PVszOToyOSAtIDM5OjM3XQogLy8gQ0hFQ0stTE9BRDogaW5kZXgtdGVtcGxhdGVzLmNwcDozOTo2MTogVGVtcGxhdGVSZWY9YXJyYXk6Mzc6OCBFeHRlbnQ9WzM5OjYxIC0gMzk6NjZdCiAvLyBDSEVDSy1MT0FEOiBpbmRleC10ZW1wbGF0ZXMuY3BwOjQyOjE4OiBUeXBlZGVmRGVjbD1VbnNpZ25lZDo0MjoxOCAoRGVmaW5pdGlvbikgRXh0ZW50PVs0MjoxIC0gNDI6MjZdCiAvLyBDSEVDSy1MT0FEOiBpbmRleC10ZW1wbGF0ZXMuY3BwOjQ1Ojg6IENsYXNzVGVtcGxhdGU9dmFsdWVfYzo0NTo4IEV4dGVudD1bNDQ6MSAtIDQ1OjE1XQpkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9sb2FkLWNsYXNzZXMuY3BwIGIvdGVzdC9JbmRleC9sb2FkLWNsYXNzZXMuY3BwCmluZGV4IGRiN2I0OGYuLjk3OTBkOWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvSW5kZXgvbG9hZC1jbGFzc2VzLmNwcAorKysgYi90ZXN0L0luZGV4L2xvYWQtY2xhc3Nlcy5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKIC8vIENIRUNLOiBsb2FkLWNsYXNzZXMuY3BwOjU6MTE6IFR5cGVSZWY9c3RydWN0IFg6Mzo4IEV4dGVudD1bNToxMSAtIDU6MTJdCiAvLyBDSEVDSzogbG9hZC1jbGFzc2VzLmNwcDo3OjM6IENYWERlc3RydWN0b3I9flg6NzozIEV4dGVudD1bNzozIC0gNzo3XSBbYWNjZXNzPXByb3RlY3RlZF0KIC8vIEZJWE1FOiBtaXNzaW5nIFR5cGVSZWYgaW4gdGhlIGRlc3RydWN0b3IgbmFtZQotLy8gQ0hFQ0s6IGxvYWQtY2xhc3Nlcy5jcHA6OTozOiBDWFhDb252ZXJzaW9uPW9wZXJhdG9yIHN0cnVjdCBYICo6OTozIEV4dGVudD1bOTozIC0gOToxNl0gW2FjY2Vzcz1wcml2YXRlXQorLy8gQ0hFQ0s6IGxvYWQtY2xhc3Nlcy5jcHA6OTozOiBDWFhDb252ZXJzaW9uPW9wZXJhdG9yIFggKjo5OjMgRXh0ZW50PVs5OjMgLSA5OjE2XSBbYWNjZXNzPXByaXZhdGVdCiAvLyBDSEVDSzogbG9hZC1jbGFzc2VzLmNwcDo5OjEyOiBUeXBlUmVmPXN0cnVjdCBYOjM6OCBFeHRlbnQ9Wzk6MTIgLSA5OjEzXQogLy8gQ0hFQ0s6IGxvYWQtY2xhc3Nlcy5jcHA6MTI6NDogQ1hYQ29uc3RydWN0b3I9WDoxMjo0IChEZWZpbml0aW9uKSBFeHRlbnQ9WzEyOjEgLSAxMzoyXSBbYWNjZXNzPXB1YmxpY10KIC8vIENIRUNLOiBsb2FkLWNsYXNzZXMuY3BwOjEyOjE6IFR5cGVSZWY9c3RydWN0IFg6Mzo4IEV4dGVudD1bMTI6MSAtIDEyOjJdCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L2xvYWQtZGVjbHMuYyBiL3Rlc3QvSW5kZXgvbG9hZC1kZWNscy5jCmluZGV4IGUwNjE3YzAuLjhkNTAxMzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvSW5kZXgvbG9hZC1kZWNscy5jCisrKyBiL3Rlc3QvSW5kZXgvbG9hZC1kZWNscy5jCkBAIC02LDYgKzYsOCBAQAogICBSb3VnZSA9IFJlZAogfTsKIAordm9pZCBQUjE3OTcwKHZvaWQgKCopKGludCksIGZsb2F0KTsKKwogLy8gUlVOOiBjLWluZGV4LXRlc3QgLXRlc3QtbG9hZC1zb3VyY2UgYWxsICVzIHwgRmlsZUNoZWNrICVzCiAvLyBDSEVDSzogbG9hZC1kZWNscy5jOjE6NjogRW51bURlY2w9Q29sb3I6MTo2IChEZWZpbml0aW9uKSBFeHRlbnQ9WzE6MSAtIDc6Ml0KIC8vIENIRUNLOiBsb2FkLWRlY2xzLmM6MjozOiBFbnVtQ29uc3RhbnREZWNsPVJlZDoyOjMgKERlZmluaXRpb24pIEV4dGVudD1bMjozIC0gMjo2XQpAQCAtMTMsMyArMTUsOCBAQAogLy8gQ0hFQ0s6IGxvYWQtZGVjbHMuYzo0OjM6IEVudW1Db25zdGFudERlY2w9Qmx1ZTo0OjMgKERlZmluaXRpb24pIEV4dGVudD1bNDozIC0gNDo3XQogLy8gQ0hFQ0s6IGxvYWQtZGVjbHMuYzo2OjM6IEVudW1Db25zdGFudERlY2w9Um91Z2U6NjozIChEZWZpbml0aW9uKSBFeHRlbnQ9WzY6MyAtIDY6MTRdCiAvLyBDSEVDSzogbG9hZC1kZWNscy5jOjY6MTE6IERlY2xSZWZFeHByPVJlZDoyOjMgRXh0ZW50PVs2OjExIC0gNjoxNF0KKy8vCisvLyBDSEVDSzogbG9hZC1kZWNscy5jOjk6NjogRnVuY3Rpb25EZWNsPVBSMTc5NzA6OTo2IEV4dGVudD1bOToxIC0gOTozNV0KKy8vIENIRUNLOiBsb2FkLWRlY2xzLmM6OToyMTogUGFybURlY2w9Ojk6MjEgKERlZmluaXRpb24pIEV4dGVudD1bOToxNCAtIDk6MjddCisvLyBDSEVDSzogbG9hZC1kZWNscy5jOjk6MjY6IFBhcm1EZWNsPTo5OjI2IChEZWZpbml0aW9uKSBFeHRlbnQ9Wzk6MjMgLSA5OjI2XQorLy8gQ0hFQ0s6IGxvYWQtZGVjbHMuYzo5OjM0OiBQYXJtRGVjbD06OTozNCAoRGVmaW5pdGlvbikgRXh0ZW50PVs5OjI5IC0gOTozNF0KZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvbG9hZC1uYW1lc3BhY2VzLmNwcCBiL3Rlc3QvSW5kZXgvbG9hZC1uYW1lc3BhY2VzLmNwcAppbmRleCA0OWRlNjZhLi43ZDgzYWNhIDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L2xvYWQtbmFtZXNwYWNlcy5jcHAKKysrIGIvdGVzdC9JbmRleC9sb2FkLW5hbWVzcGFjZXMuY3BwCkBAIC00MCw3ICs0MCw3IEBACiAvLyBDSEVDSzogbG9hZC1uYW1lc3BhY2VzLmNwcDoxNjoxNzogTmFtZXNwYWNlUmVmPXN0ZDB4OjE0OjExIEV4dGVudD1bMTY6MTcgLSAxNjoyMl0KIC8vIENIRUNLOiBsb2FkLW5hbWVzcGFjZXMuY3BwOjE4OjExOiBOYW1lc3BhY2U9c3RkOjE4OjExIChEZWZpbml0aW9uKSBFeHRlbnQ9WzE4OjEgLSAyMDoyXQogLy8gQ0hFQ0s6IGxvYWQtbmFtZXNwYWNlcy5jcHA6MTk6NzogRnVuY3Rpb25EZWNsPWc6MTk6NyBFeHRlbnQ9WzE5OjMgLSAxOToxM10KLS8vIENIRUNLOiBsb2FkLW5hbWVzcGFjZXMuY3BwOjE5OjEyOiBQYXJtRGVjbD06MTk6MTIgKERlZmluaXRpb24pIEV4dGVudD1bMTk6OSAtIDE5OjEzXQorLy8gQ0hFQ0s6IGxvYWQtbmFtZXNwYWNlcy5jcHA6MTk6MTI6IFBhcm1EZWNsPToxOToxMiAoRGVmaW5pdGlvbikgRXh0ZW50PVsxOTo5IC0gMTk6MTJdCiAvLyBDSEVDSzogbG9hZC1uYW1lc3BhY2VzLmNwcDoyMjoxMjogVXNpbmdEZWNsYXJhdGlvbj1nWzE5OjcsIDEwOjhdIEV4dGVudD1bMjI6MSAtIDIyOjEzXQogLy8gQ0hFQ0s6IGxvYWQtbmFtZXNwYWNlcy5jcHA6MjI6NzogTmFtZXNwYWNlUmVmPXN0ZDoxODoxMSBFeHRlbnQ9WzIyOjcgLSAyMjoxMF0KIC8vIENIRUNLOiBsb2FkLW5hbWVzcGFjZXMuY3BwOjI0OjExOiBGdW5jdGlvbkRlY2w9ZzoyNDoxMSAoRGVmaW5pdGlvbikgRXh0ZW50PVsyNDoxIC0gMjU6Ml0KZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvbG9jYWwtc3ltYm9scy5tIGIvdGVzdC9JbmRleC9sb2NhbC1zeW1ib2xzLm0KaW5kZXggYjRlYjI2Mi4uYzdiOTAzYSAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9sb2NhbC1zeW1ib2xzLm0KKysrIGIvdGVzdC9JbmRleC9sb2NhbC1zeW1ib2xzLm0KQEAgLTI2LDYgKzI2LDEyIEBACiBAaW50ZXJmYWNlIFI4MzgwMDQ2ICgpIDxQcm90ODM4MDA0Nj4KIEBlbmQKIAorQGNsYXNzIE5TU3RyaW5nOworCit2b2lkIHRlc3QoKSB7CisgIE5TU3RyaW5nICpzID0gQCJvYmpjIHN0ciI7Cit9CisKIC8vIENIRUNLOiBsb2NhbC1zeW1ib2xzLm06NjoxMjogT2JqQ0ludGVyZmFjZURlY2w9Rm9vOjY6MTIgRXh0ZW50PVs2OjEgLSAxMDo1XQogLy8gQ0hFQ0s6IGxvY2FsLXN5bWJvbHMubTo3OjY6IE9iakNJdmFyRGVjbD14Ojc6NiAoRGVmaW5pdGlvbikgRXh0ZW50PVs3OjMgLSA3OjddCiAvLyBDSEVDSzogbG9jYWwtc3ltYm9scy5tOjc6MzogVHlwZVJlZj1pZDowOjAgRXh0ZW50PVs3OjMgLSA3OjVdCkBAIC00MiwzICs0OCw0IEBACiAvLyBDSEVDSzogbG9jYWwtc3ltYm9scy5tOjI2OjEyOiBPYmpDQ2xhc3NSZWY9UjgzODAwNDY6MjM6MTIgRXh0ZW50PVsyNjoxMiAtIDI2OjIwXQogLy8gQ0hFQ0s6IGxvY2FsLXN5bWJvbHMubToyNjoyNTogT2JqQ1Byb3RvY29sUmVmPVByb3Q4MzgwMDQ2OjIwOjExIEV4dGVudD1bMjY6MjUgLSAyNjozNl0KIAorLy8gQ0hFQ0s6IGxvY2FsLXN5bWJvbHMubTozMjoxNzogT2JqQ1N0cmluZ0xpdGVyYWw9Im9iamMgc3RyIiBFeHRlbnQ9WzMyOjE3IC0gMzI6MjhdCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L3BjaC1kZXBlbmRpbmctb24tZGVsZXRlZC1tb2R1bGUuYyBiL3Rlc3QvSW5kZXgvcGNoLWRlcGVuZGluZy1vbi1kZWxldGVkLW1vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyM2I2MzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0luZGV4L3BjaC1kZXBlbmRpbmctb24tZGVsZXRlZC1tb2R1bGUuYwpAQCAtMCwwICsxLDE0IEBACisjaW5jbHVkZSAiYS5oIgorCisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiBta2RpciAldAorCisvLyBSVU46ICVjbGFuZ19jYzEgLXggYy1oZWFkZXIgLWZtb2R1bGVzIC1mZGlzYWJsZS1tb2R1bGUtaGFzaCAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldC9tb2R1bGVzLWNhY2hlIC1lbWl0LXBjaCAtSSAlUy9JbnB1dHMvSGVhZGVycyAtbyAldC91c2VfTGliQS5wY2ggJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLWZkaXNhYmxlLW1vZHVsZS1oYXNoIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0L21vZHVsZXMtY2FjaGUgLXZlcmlmeS1wY2ggJXQvdXNlX0xpYkEucGNoCisvLyBSVU46IHJtIC1mICV0L21vZHVsZXMtY2FjaGUvTGliQS5wY20KKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mZGlzYWJsZS1tb2R1bGUtaGFzaCAtZm1vZHVsZXMtY2FjaGUtcGF0aD1tb2R1bGVzLWNhY2hlIC12ZXJpZnktcGNoICV0L3VzZV9MaWJBLnBjaCAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9VkVSSUZZICVzCisvLyBSVU46IG5vdCBjLWluZGV4LXRlc3QgLXRlc3QtbG9hZC1zb3VyY2UgYWxsIC14IGMgLWZtb2R1bGVzIC1mZGlzYWJsZS1tb2R1bGUtaGFzaCAtZm1vZHVsZXMtY2FjaGUtcGF0aD1tb2R1bGVzLWNhY2hlIC1pbmNsdWRlLXBjaCAldC91c2VfTGliQS5wY2ggJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUlOREVYICVzCisKKy8vIFZFUklGWTogZmF0YWwgZXJyb3I6IG1hbGZvcm1lZCBvciBjb3JydXB0ZWQgQVNUIGZpbGU6ICdVbmFibGUgdG8gbG9hZCBtb2R1bGUKKy8vIElOREVYOiB7e159fUZhaWx1cmU6IEFTVCBkZXNlcmlhbGl6YXRpb24gZXJyb3Igb2NjdXJyZWR7eyR9fQorCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L3ByZWFtYmxlLXJlcGFyc2UtY21kLWRlZmluZS5jIGIvdGVzdC9JbmRleC9wcmVhbWJsZS1yZXBhcnNlLWNtZC1kZWZpbmUuYwppbmRleCA2N2ZmZGUxLi4zZmE3NjgzIDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L3ByZWFtYmxlLXJlcGFyc2UtY21kLWRlZmluZS5jCisrKyBiL3Rlc3QvSW5kZXgvcHJlYW1ibGUtcmVwYXJzZS1jbWQtZGVmaW5lLmMKQEAgLTEsNiArMSw2IEBACiAvLyBSVU46IGMtaW5kZXgtdGVzdCAtd3JpdGUtcGNoICV0LmgucGNoICVzLmgKIC8vIFJVTjogZW52IENJTkRFWFRFU1RfRURJVElORz0xIENJTkRFWFRFU1RfUkVNQVBfQUZURVJfVFJJQUw9MSBjLWluZGV4LXRlc3QgLXRlc3QtbG9hZC1zb3VyY2UtcmVwYXJzZSAzIGxvY2FsIFwgCi0vLyBSVU46ICAgICAgICAgICAiLXJlbWFwLWZpbGU9JXM7JXMucmVtYXAiICVzIC1pbmNsdWRlICV0LmggLUQgQ01EX01BQ1JPPTEgMj4mMSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAgICAgICAgICAgIi1yZW1hcC1maWxlPSVzLCVzLnJlbWFwIiAlcyAtaW5jbHVkZSAldC5oIC1EIENNRF9NQUNSTz0xIDI+JjEgfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0stTk9UOiBlcnJvcjoKIApkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9wcmVhbWJsZS1yZXBhcnNlLXdhcm4tZW5kLW9mLWZpbGUuYyBiL3Rlc3QvSW5kZXgvcHJlYW1ibGUtcmVwYXJzZS13YXJuLWVuZC1vZi1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhZTg5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSW5kZXgvcHJlYW1ibGUtcmVwYXJzZS13YXJuLWVuZC1vZi1maWxlLmMKQEAgLTAsMCArMSwxMSBAQAorLy8gUlVOOiBta2RpciAtcCAldAorLy8gUlVOOiB0b3VjaCAldC9oZWFkZXIuaAorLy8gUlVOOiBlbnYgQ0lOREVYVEVTVF9FRElUSU5HPTEgYy1pbmRleC10ZXN0IC10ZXN0LWxvYWQtc291cmNlLXJlcGFyc2UgMiBsb2NhbCAlcyAtSSAldCAyPiYxID4gJXQub3V0LnR4dCB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVNUREVSUiAlcworLy8gUlVOOiBGaWxlQ2hlY2sgLWlucHV0LWZpbGU9JXQub3V0LnR4dCAlcworLy8gQ0hFQ0s6IHByZWFtYmxlLXJlcGFyc2Utd2Fybi1lbmQtb2YtZmlsZS5jOltbQExJTkUrNl1dOjY6IEZ1bmN0aW9uRGVjbD10ZXN0OltbQExJTkUrNl1dOjYKKy8vIFNUREVSUjogcHJlYW1ibGUtcmVwYXJzZS13YXJuLWVuZC1vZi1maWxlLmM6W1tATElORSs1XV06MTQ6IGVycm9yOiBleHBlY3RlZCAnfScKKy8vIFNUREVSUjogcHJlYW1ibGUtcmVwYXJzZS13YXJuLWVuZC1vZi1maWxlLmM6W1tATElORSs0XV06MTQ6IGVycm9yOiBleHBlY3RlZCAnfScKKworI2luY2x1ZGUgImhlYWRlci5oIgorCit2b2lkIHRlc3QoKSB7CmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L3ByZWFtYmxlLXJlcGFyc2Utd2Fybi1tYWNyby5jIGIvdGVzdC9JbmRleC9wcmVhbWJsZS1yZXBhcnNlLXdhcm4tbWFjcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDJmYmRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9JbmRleC9wcmVhbWJsZS1yZXBhcnNlLXdhcm4tbWFjcm8uYwpAQCAtMCwwICsxLDEyIEBACisvLyBSVU46IG1rZGlyIC1wICV0CisvLyBSVU46IHRvdWNoICV0L2hlYWRlci5oCisvLyBSVU46IGVudiBDSU5ERVhURVNUX0VESVRJTkc9MSBjLWluZGV4LXRlc3QgLXRlc3QtbG9hZC1zb3VyY2UtcmVwYXJzZSAyIGxvY2FsICVzIC1JICV0IDI+JjEgPiAldC5vdXQudHh0IHwgRmlsZUNoZWNrICVzCisvLyBDSEVDSzogcHJlYW1ibGUtcmVwYXJzZS13YXJuLW1hY3JvLmM6W1tATElORSs4XV06OTogd2FybmluZzogJ01BQycgbWFjcm8gcmVkZWZpbmVkCisvLyBDSEVDSy1ORVhUOiBOdW1iZXIgRklYLUlUcyA9IDAKKy8vIENIRUNLLU5FWFQ6IHByZWFtYmxlLXJlcGFyc2Utd2Fybi1tYWNyby5jOltbQExJTkUrMl1dOjk6IG5vdGU6IHByZXZpb3VzIGRlZmluaXRpb24gaXMgaGVyZQorCisjZGVmaW5lIE1BQyAxCisjaW5jbHVkZSAiaGVhZGVyLmgiCisKK3ZvaWQgdGVzdCgpOworI2RlZmluZSBNQUMgMgpkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9wcmVhbWJsZS1yZXBhcnNlLmMgYi90ZXN0L0luZGV4L3ByZWFtYmxlLXJlcGFyc2UuYwppbmRleCA1YmQwM2IzLi5hN2M4NzgwIDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L3ByZWFtYmxlLXJlcGFyc2UuYworKysgYi90ZXN0L0luZGV4L3ByZWFtYmxlLXJlcGFyc2UuYwpAQCAtMSwyICsxLDIgQEAKLS8vIFJVTjogZW52IENJTkRFWFRFU1RfRURJVElORz0xIGMtaW5kZXgtdGVzdCAtdGVzdC1sb2FkLXNvdXJjZS1yZXBhcnNlIDUgbG9jYWwgIi1yZW1hcC1maWxlPSVTL0lucHV0cy9wcmVhbWJsZS1yZXBhcnNlLTEuYzslUy9JbnB1dHMvcHJlYW1ibGUtcmVwYXJzZS0yLmMiICVTL0lucHV0cy9wcmVhbWJsZS1yZXBhcnNlLTEuYyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiBlbnYgQ0lOREVYVEVTVF9FRElUSU5HPTEgYy1pbmRleC10ZXN0IC10ZXN0LWxvYWQtc291cmNlLXJlcGFyc2UgNSBsb2NhbCAiLXJlbWFwLWZpbGU9JVMvSW5wdXRzL3ByZWFtYmxlLXJlcGFyc2UtMS5jLCVTL0lucHV0cy9wcmVhbWJsZS1yZXBhcnNlLTIuYyIgJVMvSW5wdXRzL3ByZWFtYmxlLXJlcGFyc2UtMS5jIHwgRmlsZUNoZWNrICVzCiAvLyBDSEVDSzogcHJlYW1ibGUtcmVwYXJzZS0xLmM6MTo1OiBWYXJEZWNsPXg6MTo1IEV4dGVudD1bMToxIC0gMTo2XQpkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9wcmVhbWJsZS5jIGIvdGVzdC9JbmRleC9wcmVhbWJsZS5jCmluZGV4IDkyYTliODQuLmFlOGUxYWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvSW5kZXgvcHJlYW1ibGUuYworKysgYi90ZXN0L0luZGV4L3ByZWFtYmxlLmMKQEAgLTIsMTMgKzIsMTYgQEAKICNpbmNsdWRlICJwcmVhbWJsZS5oIgogI2luY2x1ZGUgInByZWFtYmxlLXdpdGgtZXJyb3IuaCIKIAorI2RlZmluZSBNQUNST19VTlVTRUQgMQorI2RlZmluZSBNQUNST19VU0VEIDIKKwogaW50IHdpYmJsZShpbnQpOwogCiB2b2lkIGYoaW50IHgpIHsKLSAgCisgIHggPSBNQUNST19VU0VECiB9CiAvLyBSVU46IGMtaW5kZXgtdGVzdCAtd3JpdGUtcGNoICV0LnBjaCAteCBjLWhlYWRlciAlUy9JbnB1dHMvcHJlZml4LmgKLS8vIFJVTjogZW52IENJTkRFWFRFU1RfRURJVElORz0xIGMtaW5kZXgtdGVzdCAtdGVzdC1sb2FkLXNvdXJjZS1yZXBhcnNlIDUgbG9jYWwgLUkgJVMvSW5wdXRzIC1pbmNsdWRlICV0ICVzIDI+ICV0LnN0ZGVyci50eHQgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogZW52IENJTkRFWFRFU1RfRURJVElORz0xIGMtaW5kZXgtdGVzdCAtdGVzdC1sb2FkLXNvdXJjZS1yZXBhcnNlIDUgbG9jYWwgLUkgJVMvSW5wdXRzIC1pbmNsdWRlICV0ICVzIC1XdW51c2VkLW1hY3JvcyAyPiAldC5zdGRlcnIudHh0IHwgRmlsZUNoZWNrICVzCiAvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLURJQUcgJXMgPCAldC5zdGRlcnIudHh0CiAvLyBDSEVDSzogcHJlYW1ibGUuaDoxOjEyOiBGdW5jdGlvbkRlY2w9YmFyOjE6MTIgKERlZmluaXRpb24pIEV4dGVudD1bMToxIC0gNjoyXQogLy8gQ0hFQ0s6IHByZWFtYmxlLmg6NDozOiBCaW5hcnlPcGVyYXRvcj0gRXh0ZW50PVs0OjMgLSA0OjEzXQpAQCAtMTYsMTAgKzE5LDEzIEBACiAvLyBDSEVDSzogcHJlYW1ibGUuaDo0Ojk6IFVuZXhwb3NlZEV4cHI9cHRyMTozOjEwIEV4dGVudD1bNDo5IC0gNDoxM10KIC8vIENIRUNLOiBwcmVhbWJsZS5oOjQ6OTogRGVjbFJlZkV4cHI9cHRyMTozOjEwIEV4dGVudD1bNDo5IC0gNDoxM10KIC8vIENIRUNLOiBwcmVhbWJsZS5oOjU6MTA6IEludGVnZXJMaXRlcmFsPSBFeHRlbnQ9WzU6MTAgLSA1OjExXQotLy8gQ0hFQ0s6IHByZWFtYmxlLmM6NTo1OiBGdW5jdGlvbkRlY2w9d2liYmxlOjU6NSBFeHRlbnQ9WzU6MSAtIDU6MTZdCi0vLyBDSEVDSzogcHJlYW1ibGUuYzo1OjE1OiBQYXJtRGVjbD06NToxNSAoRGVmaW5pdGlvbikgRXh0ZW50PVs1OjEyIC0gNToxNl0KKy8vIENIRUNLOiBwcmVhbWJsZS5jOjg6NTogRnVuY3Rpb25EZWNsPXdpYmJsZTo4OjUgRXh0ZW50PVs4OjEgLSA4OjE2XQorLy8gQ0hFQ0s6IHByZWFtYmxlLmM6ODoxNTogUGFybURlY2w9Ojg6MTUgKERlZmluaXRpb24pIEV4dGVudD1bODoxMiAtIDg6MTVdCiAvLyBDSEVDSy1ESUFHOiBwcmVhbWJsZS5oOjQ6Nzp7NDo5LTQ6MTN9OiB3YXJuaW5nOiBpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcyBhc3NpZ25pbmcgdG8gJ2ludCAqJyBmcm9tICdmbG9hdCAqJwotLy8gUlVOOiBlbnYgQ0lOREVYVEVTVF9FRElUSU5HPTEgYy1pbmRleC10ZXN0IC1jb2RlLWNvbXBsZXRpb24tYXQ9JXM6ODoxIC1JICVTL0lucHV0cyAtaW5jbHVkZSAldCAlcyAyPiAldC5zdGRlcnIudHh0IHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stQ0MgJXMKKy8vIEZJWE1FOiBTaG91bGQgc2VlOgorLy8gICAgIHByZWFtYmxlLmM6NTo5OiB3YXJuaW5nOiBtYWNybyBpcyBub3QgdXNlZAorLy8gQ0hFQ0stRElBRy1OT1Q6IHByZWFtYmxlLmM6Njo5OiB3YXJuaW5nOiBtYWNybyBpcyBub3QgdXNlZAorLy8gUlVOOiBlbnYgQ0lOREVYVEVTVF9FRElUSU5HPTEgYy1pbmRleC10ZXN0IC1jb2RlLWNvbXBsZXRpb24tYXQ9JXM6MTE6MSAtSSAlUy9JbnB1dHMgLWluY2x1ZGUgJXQgJXMgMj4gJXQuc3RkZXJyLnR4dCB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLUNDICVzCiAvLyBDSEVDSy1DQzogRnVuY3Rpb25EZWNsOntSZXN1bHRUeXBlIGludH17VHlwZWRUZXh0IGJhcn17TGVmdFBhcmVuICh9e1BsYWNlaG9sZGVyIGludCBpfXtSaWdodFBhcmVuICl9ICg1MCkKIC8vIENIRUNLLUNDOiBGdW5jdGlvbkRlY2w6e1Jlc3VsdFR5cGUgdm9pZH17VHlwZWRUZXh0IGZ9e0xlZnRQYXJlbiAofXtQbGFjZWhvbGRlciBpbnQgeH17UmlnaHRQYXJlbiApfSAoNTApCiAvLyBDSEVDSy1DQzogRnVuY3Rpb25EZWNsOntSZXN1bHRUeXBlIGludH17VHlwZWRUZXh0IGZvb317TGVmdFBhcmVuICh9e1BsYWNlaG9sZGVyIGludH17UmlnaHRQYXJlbiApfSAoNTApCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L3ByaW50LXR5cGUtY3h4MTEuY3BwIGIvdGVzdC9JbmRleC9wcmludC10eXBlLWN4eDExLmNwcAppbmRleCAwYWQ1NDczLi4xZjc1MjJmIDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L3ByaW50LXR5cGUtY3h4MTEuY3BwCisrKyBiL3Rlc3QvSW5kZXgvcHJpbnQtdHlwZS1jeHgxMS5jcHAKQEAgLTQsNSArNCw1IEBACiB9OwogCiAvLyBSVU46IGMtaW5kZXgtdGVzdCAtdGVzdC1wcmludC10eXBlIC1zdGQ9YysrMTEgJXMgfCBGaWxlQ2hlY2sgJXMKLS8vIENIRUNLOiBDWFhNZXRob2Q9ZjoyOjggKERlZmluaXRpb24pIFt0eXBlPXZvaWQgKCkgJl0gW3R5cGVraW5kPUZ1bmN0aW9uUHJvdG9dIGx2YWx1ZS1yZWYtcXVhbGlmaWVyIFtyZXN1bHR0eXBlPXZvaWRdIFtyZXN1bHR0eXBla2luZD1Wb2lkXSBbaXNQT0Q9MF0KLS8vIENIRUNLOiBDWFhNZXRob2Q9ZjozOjggKERlZmluaXRpb24pIFt0eXBlPXZvaWQgKCkgJiZdIFt0eXBla2luZD1GdW5jdGlvblByb3RvXSBydmFsdWUtcmVmLXF1YWxpZmllciBbcmVzdWx0dHlwZT12b2lkXSBbcmVzdWx0dHlwZWtpbmQ9Vm9pZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogQ1hYTWV0aG9kPWY6Mjo4IChEZWZpbml0aW9uKSBbdHlwZT12b2lkICgpIHt7Lip9fSZdIFt0eXBla2luZD1GdW5jdGlvblByb3RvXSBsdmFsdWUtcmVmLXF1YWxpZmllciBbcmVzdWx0dHlwZT12b2lkXSBbcmVzdWx0dHlwZWtpbmQ9Vm9pZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogQ1hYTWV0aG9kPWY6Mzo4IChEZWZpbml0aW9uKSBbdHlwZT12b2lkICgpIHt7Lip9fSYmXSBbdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gcnZhbHVlLXJlZi1xdWFsaWZpZXIgW3Jlc3VsdHR5cGU9dm9pZF0gW3Jlc3VsdHR5cGVraW5kPVZvaWRdIFtpc1BPRD0wXQpkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9wcmludC10eXBlLmNwcCBiL3Rlc3QvSW5kZXgvcHJpbnQtdHlwZS5jcHAKaW5kZXggNjMyNGQ0My4uZWYzNzJhMiAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9wcmludC10eXBlLmNwcAorKysgYi90ZXN0L0luZGV4L3ByaW50LXR5cGUuY3BwCkBAIC01LDEwICs1LDE2IEBACiAgIFQgdDsKIH07CiAKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB1bnNpZ25lZCBVLCB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgVz4KK3N0cnVjdCBCYXogeyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4KK3N0cnVjdCBRdXggeyB9OworCiBuYW1lc3BhY2UgaW5uZXIgewogCiBzdHJ1Y3QgQmFyIHsKLSAgQmFyKG91dGVyOjpGb288Ym9vbD4qIGZvbykgeyB9OworICBCYXIob3V0ZXI6OkZvbzxib29sPiogZm9vKSB7IH0KIAogICB0eXBlZGVmIGludCBGb29UeXBlOwogICBpbnQgKnA7CkBAIC0xOCw2ICsyNCw4IEBACiAgIH0KICAgdHlwZWRlZiBkb3VibGUgT3RoZXJUeXBlOwogICB0eXBlZGVmIGludCBBcnJheVR5cGVbNV07CisgIEJhejxpbnQsIDEsIEZvbz4gYmF6OworICBRdXg8aW50LCBjaGFyKiwgRm9vPGludD4+IHF1eDsKIH07CiAKIH0KQEAgLTM5LDQzICs0Nyw3NCBAQAogfTsKIGludCBCbG9iOjoqbWVtYmVyX3BvaW50ZXI7CiAKLS8vIFJVTjogYy1pbmRleC10ZXN0IC10ZXN0LXByaW50LXR5cGUgJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogYy1pbmRleC10ZXN0IC10ZXN0LXByaW50LXR5cGUgJXMgLXN0ZD1jKysxMSB8IEZpbGVDaGVjayAlcwogLy8gQ0hFQ0s6IE5hbWVzcGFjZT1vdXRlcjoxOjExIChEZWZpbml0aW9uKSBbdHlwZT1dIFt0eXBla2luZD1JbnZhbGlkXSBbaXNQT0Q9MF0KIC8vIENIRUNLOiBDbGFzc1RlbXBsYXRlPUZvbzo0OjggKERlZmluaXRpb24pIFt0eXBlPV0gW3R5cGVraW5kPUludmFsaWRdIFtpc1BPRD0wXQogLy8gQ0hFQ0s6IFRlbXBsYXRlVHlwZVBhcmFtZXRlcj1UOjM6MTkgKERlZmluaXRpb24pIFt0eXBlPVRdIFt0eXBla2luZD1VbmV4cG9zZWRdIFtjYW5vbmljYWx0eXBlPXR5cGUtcGFyYW1ldGVyLTAtMF0gW2Nhbm9uaWNhbHR5cGVraW5kPVVuZXhwb3NlZF0gW2lzUE9EPTBdCiAvLyBDSEVDSzogRmllbGREZWNsPXQ6NTo1IChEZWZpbml0aW9uKSBbdHlwZT1UXSBbdHlwZWtpbmQ9VW5leHBvc2VkXSBbY2Fub25pY2FsdHlwZT10eXBlLXBhcmFtZXRlci0wLTBdIFtjYW5vbmljYWx0eXBla2luZD1VbmV4cG9zZWRdIFtpc1BPRD0wXQogLy8gQ0hFQ0s6IFR5cGVSZWY9VDozOjE5IFt0eXBlPVRdIFt0eXBla2luZD1VbmV4cG9zZWRdIFtjYW5vbmljYWx0eXBlPXR5cGUtcGFyYW1ldGVyLTAtMF0gW2Nhbm9uaWNhbHR5cGVraW5kPVVuZXhwb3NlZF0gW2lzUE9EPTBdCi0vLyBDSEVDSzogTmFtZXNwYWNlPWlubmVyOjg6MTEgKERlZmluaXRpb24pIFt0eXBlPV0gW3R5cGVraW5kPUludmFsaWRdIFtpc1BPRD0wXQotLy8gQ0hFQ0s6IFN0cnVjdERlY2w9QmFyOjEwOjggKERlZmluaXRpb24pIFt0eXBlPW91dGVyOjppbm5lcjo6QmFyXSBbdHlwZWtpbmQ9UmVjb3JkXSBbaXNQT0Q9MF0KLS8vIENIRUNLOiBDWFhDb25zdHJ1Y3Rvcj1CYXI6MTE6MyAoRGVmaW5pdGlvbikgW3R5cGU9dm9pZCAob3V0ZXI6OkZvbzxib29sPiAqKV0gW3R5cGVraW5kPUZ1bmN0aW9uUHJvdG9dIFtjYW5vbmljYWx0eXBlPXZvaWQgKG91dGVyOjpGb288Ym9vbD4gKildIFtjYW5vbmljYWx0eXBla2luZD1GdW5jdGlvblByb3RvXSBbcmVzdWx0dHlwZT12b2lkXSBbcmVzdWx0dHlwZWtpbmQ9Vm9pZF0gW2FyZ3M9IFtvdXRlcjo6Rm9vPGJvb2w+ICpdIFtQb2ludGVyXV0gW2lzUE9EPTBdCi0vLyBDSEVDSzogUGFybURlY2w9Zm9vOjExOjI1IChEZWZpbml0aW9uKSBbdHlwZT1vdXRlcjo6Rm9vPGJvb2w+ICpdIFt0eXBla2luZD1Qb2ludGVyXSBbY2Fub25pY2FsdHlwZT1vdXRlcjo6Rm9vPGJvb2w+ICpdIFtjYW5vbmljYWx0eXBla2luZD1Qb2ludGVyXSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBDbGFzc1RlbXBsYXRlPUJhejo5OjggKERlZmluaXRpb24pIFt0eXBlPV0gW3R5cGVraW5kPUludmFsaWRdIFtpc1BPRD0wXQorLy8gQ0hFQ0s6IFRlbXBsYXRlVHlwZVBhcmFtZXRlcj1UOjg6MjAgKERlZmluaXRpb24pIFt0eXBlPVRdIFt0eXBla2luZD1VbmV4cG9zZWRdIFtjYW5vbmljYWx0eXBlPXR5cGUtcGFyYW1ldGVyLTAtMF0gW2Nhbm9uaWNhbHR5cGVraW5kPVVuZXhwb3NlZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogTm9uVHlwZVRlbXBsYXRlUGFyYW1ldGVyPVU6ODozMiAoRGVmaW5pdGlvbikgW3R5cGU9dW5zaWduZWQgaW50XSBbdHlwZWtpbmQ9VUludF0gW2lzUE9EPTFdCisvLyBDSEVDSzogVGVtcGxhdGVUZW1wbGF0ZVBhcmFtZXRlcj1XOjg6NjAgKERlZmluaXRpb24pIFt0eXBlPV0gW3R5cGVraW5kPUludmFsaWRdIFtpc1BPRD0wXQorLy8gQ0hFQ0s6IE5hbWVzcGFjZT1pbm5lcjoxNDoxMSAoRGVmaW5pdGlvbikgW3R5cGU9XSBbdHlwZWtpbmQ9SW52YWxpZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogU3RydWN0RGVjbD1CYXI6MTY6OCAoRGVmaW5pdGlvbikgW3R5cGU9b3V0ZXI6OmlubmVyOjpCYXJdIFt0eXBla2luZD1SZWNvcmRdIFtpc1BPRD0wXQorLy8gQ0hFQ0s6IENYWENvbnN0cnVjdG9yPUJhcjoxNzozIChEZWZpbml0aW9uKSBbdHlwZT12b2lkIChvdXRlcjo6Rm9vPGJvb2w+ICope3suKn19XSBbdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gW2Nhbm9uaWNhbHR5cGU9dm9pZCAob3V0ZXI6OkZvbzxib29sPiAqKXt7Lip9fV0gW2Nhbm9uaWNhbHR5cGVraW5kPUZ1bmN0aW9uUHJvdG9dIFtyZXN1bHR0eXBlPXZvaWRdIFtyZXN1bHR0eXBla2luZD1Wb2lkXSBbYXJncz0gW291dGVyOjpGb288Ym9vbD4gKl0gW1BvaW50ZXJdXSBbaXNQT0Q9MF0KKy8vIENIRUNLOiBQYXJtRGVjbD1mb286MTc6MjUgKERlZmluaXRpb24pIFt0eXBlPW91dGVyOjpGb288Ym9vbD4gKl0gW3R5cGVraW5kPVBvaW50ZXJdIFtjYW5vbmljYWx0eXBlPW91dGVyOjpGb288Ym9vbD4gKl0gW2Nhbm9uaWNhbHR5cGVraW5kPVBvaW50ZXJdIFtpc1BPRD0xXQogLy8gQ0hFQ0s6IE5hbWVzcGFjZVJlZj1vdXRlcjoxOjExIFt0eXBlPV0gW3R5cGVraW5kPUludmFsaWRdIFtpc1BPRD0wXQogLy8gQ0hFQ0s6IFRlbXBsYXRlUmVmPUZvbzo0OjggW3R5cGU9XSBbdHlwZWtpbmQ9SW52YWxpZF0gW2lzUE9EPTBdCiAvLyBDSEVDSzogQ29tcG91bmRTdG10PSBbdHlwZT1dIFt0eXBla2luZD1JbnZhbGlkXSBbaXNQT0Q9MF0KLS8vIENIRUNLOiBUeXBlZGVmRGVjbD1Gb29UeXBlOjEzOjE1IChEZWZpbml0aW9uKSBbdHlwZT1Gb29UeXBlXSBbdHlwZWtpbmQ9VHlwZWRlZl0gW2Nhbm9uaWNhbHR5cGU9aW50XSBbY2Fub25pY2FsdHlwZWtpbmQ9SW50XSBbaXNQT0Q9MV0KLS8vIENIRUNLOiBGaWVsZERlY2w9cDoxNDo4IChEZWZpbml0aW9uKSBbdHlwZT1pbnQgKl0gW3R5cGVraW5kPVBvaW50ZXJdIFtpc1BPRD0xXQotLy8gQ0hFQ0s6IENYWE1ldGhvZD1mOjE1OjggKERlZmluaXRpb24pIFt0eXBlPWludCAqKGludCAqLCBjaGFyICosIEZvb1R5cGUpXSBbdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gW2Nhbm9uaWNhbHR5cGU9aW50ICooaW50ICosIGNoYXIgKiwgaW50KV0gW2Nhbm9uaWNhbHR5cGVraW5kPUZ1bmN0aW9uUHJvdG9dIFtyZXN1bHR0eXBlPWludCAqXSBbcmVzdWx0dHlwZWtpbmQ9UG9pbnRlcl0gW2FyZ3M9IFtpbnQgKl0gW1BvaW50ZXJdIFtjaGFyICpdIFtQb2ludGVyXSBbRm9vVHlwZV0gW1R5cGVkZWZdXSBbaXNQT0Q9MF0KLS8vIENIRUNLOiBQYXJtRGVjbD1wOjE1OjE1IChEZWZpbml0aW9uKSBbdHlwZT1pbnQgKl0gW3R5cGVraW5kPVBvaW50ZXJdIFtpc1BPRD0xXQotLy8gQ0hFQ0s6IFBhcm1EZWNsPXg6MTU6MjQgKERlZmluaXRpb24pIFt0eXBlPWNoYXIgKl0gW3R5cGVraW5kPVBvaW50ZXJdIFtpc1BPRD0xXQotLy8gQ0hFQ0s6IFBhcm1EZWNsPXo6MTU6MzUgKERlZmluaXRpb24pIFt0eXBlPUZvb1R5cGVdIFt0eXBla2luZD1UeXBlZGVmXSBbY2Fub25pY2FsdHlwZT1pbnRdIFtjYW5vbmljYWx0eXBla2luZD1JbnRdIFtpc1BPRD0xXQotLy8gQ0hFQ0s6IFR5cGVSZWY9Rm9vVHlwZToxMzoxNSBbdHlwZT1Gb29UeXBlXSBbdHlwZWtpbmQ9VHlwZWRlZl0gW2Nhbm9uaWNhbHR5cGU9aW50XSBbY2Fub25pY2FsdHlwZWtpbmQ9SW50XSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBUeXBlZGVmRGVjbD1Gb29UeXBlOjE5OjE1IChEZWZpbml0aW9uKSBbdHlwZT1Gb29UeXBlXSBbdHlwZWtpbmQ9VHlwZWRlZl0gW2Nhbm9uaWNhbHR5cGU9aW50XSBbY2Fub25pY2FsdHlwZWtpbmQ9SW50XSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBGaWVsZERlY2w9cDoyMDo4IChEZWZpbml0aW9uKSBbdHlwZT1pbnQgKl0gW3R5cGVraW5kPVBvaW50ZXJdIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IENYWE1ldGhvZD1mOjIxOjggKERlZmluaXRpb24pIFt0eXBlPWludCAqKGludCAqLCBjaGFyICosIEZvb1R5cGUpe3suKn19XSBbdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gW2Nhbm9uaWNhbHR5cGU9aW50ICooaW50ICosIGNoYXIgKiwgaW50KXt7Lip9fV0gW2Nhbm9uaWNhbHR5cGVraW5kPUZ1bmN0aW9uUHJvdG9dIFtyZXN1bHR0eXBlPWludCAqXSBbcmVzdWx0dHlwZWtpbmQ9UG9pbnRlcl0gW2FyZ3M9IFtpbnQgKl0gW1BvaW50ZXJdIFtjaGFyICpdIFtQb2ludGVyXSBbRm9vVHlwZV0gW1R5cGVkZWZdXSBbaXNQT0Q9MF0KKy8vIENIRUNLOiBQYXJtRGVjbD1wOjIxOjE1IChEZWZpbml0aW9uKSBbdHlwZT1pbnQgKl0gW3R5cGVraW5kPVBvaW50ZXJdIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IFBhcm1EZWNsPXg6MjE6MjQgKERlZmluaXRpb24pIFt0eXBlPWNoYXIgKl0gW3R5cGVraW5kPVBvaW50ZXJdIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IFBhcm1EZWNsPXo6MjE6MzUgKERlZmluaXRpb24pIFt0eXBlPUZvb1R5cGVdIFt0eXBla2luZD1UeXBlZGVmXSBbY2Fub25pY2FsdHlwZT1pbnRdIFtjYW5vbmljYWx0eXBla2luZD1JbnRdIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IFR5cGVSZWY9Rm9vVHlwZToxOToxNSBbdHlwZT1Gb29UeXBlXSBbdHlwZWtpbmQ9VHlwZWRlZl0gW2Nhbm9uaWNhbHR5cGU9aW50XSBbY2Fub25pY2FsdHlwZWtpbmQ9SW50XSBbaXNQT0Q9MV0KIC8vIENIRUNLOiBDb21wb3VuZFN0bXQ9IFt0eXBlPV0gW3R5cGVraW5kPUludmFsaWRdIFtpc1BPRD0wXQogLy8gQ0hFQ0s6IERlY2xTdG10PSBbdHlwZT1dIFt0eXBla2luZD1JbnZhbGlkXSBbaXNQT0Q9MF0KLS8vIENIRUNLOiBWYXJEZWNsPXc6MTY6MTkgKERlZmluaXRpb24pIFt0eXBlPWNvbnN0IEZvb1R5cGVdIFt0eXBla2luZD1UeXBlZGVmXSBjb25zdCBbY2Fub25pY2FsdHlwZT1jb25zdCBpbnRdIFtjYW5vbmljYWx0eXBla2luZD1JbnRdIFtpc1BPRD0xXQotLy8gQ0hFQ0s6IFR5cGVSZWY9Rm9vVHlwZToxMzoxNSBbdHlwZT1Gb29UeXBlXSBbdHlwZWtpbmQ9VHlwZWRlZl0gW2Nhbm9uaWNhbHR5cGU9aW50XSBbY2Fub25pY2FsdHlwZWtpbmQ9SW50XSBbaXNQT0Q9MV0KLS8vIENIRUNLOiBEZWNsUmVmRXhwcj16OjE1OjM1IFt0eXBlPUZvb1R5cGVdIFt0eXBla2luZD1UeXBlZGVmXSBbY2Fub25pY2FsdHlwZT1pbnRdIFtjYW5vbmljYWx0eXBla2luZD1JbnRdIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IFZhckRlY2w9dzoyMjoxOSAoRGVmaW5pdGlvbikgW3R5cGU9Y29uc3QgRm9vVHlwZV0gW3R5cGVraW5kPVR5cGVkZWZdIGNvbnN0IFtjYW5vbmljYWx0eXBlPWNvbnN0IGludF0gW2Nhbm9uaWNhbHR5cGVraW5kPUludF0gW2lzUE9EPTFdCisvLyBDSEVDSzogVHlwZVJlZj1Gb29UeXBlOjE5OjE1IFt0eXBlPUZvb1R5cGVdIFt0eXBla2luZD1UeXBlZGVmXSBbY2Fub25pY2FsdHlwZT1pbnRdIFtjYW5vbmljYWx0eXBla2luZD1JbnRdIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IFVuZXhwb3NlZEV4cHI9ejoyMTozNSBbdHlwZT1Gb29UeXBlXSBbdHlwZWtpbmQ9VHlwZWRlZl0gW2Nhbm9uaWNhbHR5cGU9aW50XSBbY2Fub25pY2FsdHlwZWtpbmQ9SW50XSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBEZWNsUmVmRXhwcj16OjIxOjM1IFt0eXBlPUZvb1R5cGVdIFt0eXBla2luZD1UeXBlZGVmXSBbY2Fub25pY2FsdHlwZT1pbnRdIFtjYW5vbmljYWx0eXBla2luZD1JbnRdIFtpc1BPRD0xXQogLy8gQ0hFQ0s6IFJldHVyblN0bXQ9IFt0eXBlPV0gW3R5cGVraW5kPUludmFsaWRdIFtpc1BPRD0wXQogLy8gQ0hFQ0s6IEJpbmFyeU9wZXJhdG9yPSBbdHlwZT1pbnQgKl0gW3R5cGVraW5kPVBvaW50ZXJdIFtpc1BPRD0xXQotLy8gQ0hFQ0s6IERlY2xSZWZFeHByPXA6MTU6MTUgW3R5cGU9aW50ICpdIFt0eXBla2luZD1Qb2ludGVyXSBbaXNQT0Q9MV0KLS8vIENIRUNLOiBEZWNsUmVmRXhwcj16OjE1OjM1IFt0eXBlPUZvb1R5cGVdIFt0eXBla2luZD1UeXBlZGVmXSBbY2Fub25pY2FsdHlwZT1pbnRdIFtjYW5vbmljYWx0eXBla2luZD1JbnRdIFtpc1BPRD0xXQotLy8gQ0hFQ0s6IFR5cGVkZWZEZWNsPU90aGVyVHlwZToxOToxOCAoRGVmaW5pdGlvbikgW3R5cGU9T3RoZXJUeXBlXSBbdHlwZWtpbmQ9VHlwZWRlZl0gW2Nhbm9uaWNhbHR5cGU9ZG91YmxlXSBbY2Fub25pY2FsdHlwZWtpbmQ9RG91YmxlXSBbaXNQT0Q9MV0KLS8vIENIRUNLOiBUeXBlZGVmRGVjbD1BcnJheVR5cGU6MjA6MTUgKERlZmluaXRpb24pIFt0eXBlPUFycmF5VHlwZV0gW3R5cGVraW5kPVR5cGVkZWZdIFtjYW5vbmljYWx0eXBlPWludCBbNV1dIFtjYW5vbmljYWx0eXBla2luZD1Db25zdGFudEFycmF5XSBbaXNQT0Q9MV0KLS8vIENIRUNLOiBGdW5jdGlvblRlbXBsYXRlPXRiYXI6Mjc6MyBbdHlwZT1UIChpbnQpXSBbdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gW2Nhbm9uaWNhbHR5cGU9dHlwZS1wYXJhbWV0ZXItMC0wIChpbnQpXSBbY2Fub25pY2FsdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gW3Jlc3VsdHR5cGU9VF0gW3Jlc3VsdHR5cGVraW5kPVVuZXhwb3NlZF0gW2lzUE9EPTBdCi0vLyBDSEVDSzogVGVtcGxhdGVUeXBlUGFyYW1ldGVyPVQ6MjY6MjAgKERlZmluaXRpb24pIFt0eXBlPVRdIFt0eXBla2luZD1VbmV4cG9zZWRdIFtjYW5vbmljYWx0eXBlPXR5cGUtcGFyYW1ldGVyLTAtMF0gW2Nhbm9uaWNhbHR5cGVraW5kPVVuZXhwb3NlZF0gW2lzUE9EPTBdCi0vLyBDSEVDSzogRnVuY3Rpb25UZW1wbGF0ZT10YmFyOjMwOjMgW3R5cGU9VCAoaW50ICopXSBbdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gW2Nhbm9uaWNhbHR5cGU9dHlwZS1wYXJhbWV0ZXItMC0wIChpbnQgKildIFtjYW5vbmljYWx0eXBla2luZD1GdW5jdGlvblByb3RvXSBbcmVzdWx0dHlwZT1UXSBbcmVzdWx0dHlwZWtpbmQ9VW5leHBvc2VkXSBbaXNQT0Q9MF0KLS8vIENIRUNLOiBQYXJtRGVjbD06MzA6MTEgKERlZmluaXRpb24pIFt0eXBlPWludCBbNV1dIFt0eXBla2luZD1Db25zdGFudEFycmF5XSBbaXNQT0Q9MV0KLS8vIENIRUNLOiBGdW5jdGlvblRlbXBsYXRlPXRiYXI6MzM6MyBbdHlwZT1UIChpbnQgKildIFt0eXBla2luZD1GdW5jdGlvblByb3RvXSBbY2Fub25pY2FsdHlwZT10eXBlLXBhcmFtZXRlci0wLTAgKGludCAqKV0gW2Nhbm9uaWNhbHR5cGVraW5kPUZ1bmN0aW9uUHJvdG9dIFtyZXN1bHR0eXBlPVRdIFtyZXN1bHR0eXBla2luZD1VbmV4cG9zZWRdIFtpc1BPRD0wXQotLy8gQ0hFQ0s6IFBhcm1EZWNsPTozMzoxMSAoRGVmaW5pdGlvbikgW3R5cGU9aW50IFtzaXplXV0gW3R5cGVraW5kPURlcGVuZGVudFNpemVkQXJyYXldIFtpc1BPRD0wXQotLy8gQ0hFQ0s6IFBhcm1EZWNsPWluY29tcGxldGVfYXJyYXk6MzU6MjEgKERlZmluaXRpb24pIFt0eXBlPWludCBbXV0gW3R5cGVraW5kPUluY29tcGxldGVBcnJheV0gW2lzUE9EPTFdCi0vLyBDSEVDSzogVmFyRGVjbD12YXJpYWJsZV9hcnJheTozNTo0NyAoRGVmaW5pdGlvbikgW3R5cGU9aW50IFtpXV0gW3R5cGVraW5kPVZhcmlhYmxlQXJyYXldIFtpc1BPRD0xXQotLy8gQ0hFQ0s6IFZhckRlY2w9bWVtYmVyX3BvaW50ZXI6NDA6MTIgKERlZmluaXRpb24pIFt0eXBlPWludCBCbG9iOjoqXSBbdHlwZWtpbmQ9TWVtYmVyUG9pbnRlcl0gW2lzUE9EPTFdCisvLyBDSEVDSzogVW5leHBvc2VkRXhwcj1wOjIxOjE1IFt0eXBlPWludCAqXSBbdHlwZWtpbmQ9UG9pbnRlcl0gW2lzUE9EPTFdCisvLyBDSEVDSzogRGVjbFJlZkV4cHI9cDoyMToxNSBbdHlwZT1pbnQgKl0gW3R5cGVraW5kPVBvaW50ZXJdIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IFVuZXhwb3NlZEV4cHI9ejoyMTozNSBbdHlwZT1Gb29UeXBlXSBbdHlwZWtpbmQ9VHlwZWRlZl0gW2Nhbm9uaWNhbHR5cGU9aW50XSBbY2Fub25pY2FsdHlwZWtpbmQ9SW50XSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBEZWNsUmVmRXhwcj16OjIxOjM1IFt0eXBlPUZvb1R5cGVdIFt0eXBla2luZD1UeXBlZGVmXSBbY2Fub25pY2FsdHlwZT1pbnRdIFtjYW5vbmljYWx0eXBla2luZD1JbnRdIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IFR5cGVkZWZEZWNsPU90aGVyVHlwZToyNToxOCAoRGVmaW5pdGlvbikgW3R5cGU9T3RoZXJUeXBlXSBbdHlwZWtpbmQ9VHlwZWRlZl0gW2Nhbm9uaWNhbHR5cGU9ZG91YmxlXSBbY2Fub25pY2FsdHlwZWtpbmQ9RG91YmxlXSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBUeXBlZGVmRGVjbD1BcnJheVR5cGU6MjY6MTUgKERlZmluaXRpb24pIFt0eXBlPUFycmF5VHlwZV0gW3R5cGVraW5kPVR5cGVkZWZdIFtjYW5vbmljYWx0eXBlPWludCBbNV1dIFtjYW5vbmljYWx0eXBla2luZD1Db25zdGFudEFycmF5XSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBJbnRlZ2VyTGl0ZXJhbD0gW3R5cGU9aW50XSBbdHlwZWtpbmQ9SW50XSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBGaWVsZERlY2w9YmF6OjI3OjIwIChEZWZpbml0aW9uKSBbdHlwZT1CYXo8aW50LCAxLCBGb28+XSBbdHlwZWtpbmQ9VW5leHBvc2VkXSBbY2Fub25pY2FsdHlwZT1vdXRlcjo6QmF6PGludCwgMSwgRm9vPl0gW2Nhbm9uaWNhbHR5cGVraW5kPVJlY29yZF0gW3RlbXBsYXRlYXJncy8zPSBbdHlwZT1pbnRdIFt0eXBla2luZD1JbnRdXSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBUZW1wbGF0ZVJlZj1CYXo6OTo4IFt0eXBlPV0gW3R5cGVraW5kPUludmFsaWRdIFtpc1BPRD0wXQorLy8gQ0hFQ0s6IEludGVnZXJMaXRlcmFsPSBbdHlwZT1pbnRdIFt0eXBla2luZD1JbnRdIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IFRlbXBsYXRlUmVmPUZvbzo0OjggW3R5cGU9XSBbdHlwZWtpbmQ9SW52YWxpZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogRmllbGREZWNsPXF1eDoyODoyOSAoRGVmaW5pdGlvbikgW3R5cGU9UXV4PGludCwgY2hhciAqLCBGb288aW50PiA+XSBbdHlwZWtpbmQ9VW5leHBvc2VkXSBbY2Fub25pY2FsdHlwZT1vdXRlcjo6UXV4PGludCwgY2hhciAqLCBvdXRlcjo6Rm9vPGludD4gPl0gW2Nhbm9uaWNhbHR5cGVraW5kPVJlY29yZF0gW3RlbXBsYXRlYXJncy8xPV0gW2lzUE9EPTFdCisvLyBDSEVDSzogVGVtcGxhdGVSZWY9UXV4OjEyOjggW3R5cGU9XSBbdHlwZWtpbmQ9SW52YWxpZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogVGVtcGxhdGVSZWY9Rm9vOjQ6OCBbdHlwZT1dIFt0eXBla2luZD1JbnZhbGlkXSBbaXNQT0Q9MF0KKy8vIENIRUNLOiBGdW5jdGlvblRlbXBsYXRlPXRiYXI6MzU6MyBbdHlwZT1UIChpbnQpXSBbdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gW2Nhbm9uaWNhbHR5cGU9dHlwZS1wYXJhbWV0ZXItMC0wIChpbnQpXSBbY2Fub25pY2FsdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gW3Jlc3VsdHR5cGU9VF0gW3Jlc3VsdHR5cGVraW5kPVVuZXhwb3NlZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogVGVtcGxhdGVUeXBlUGFyYW1ldGVyPVQ6MzQ6MjAgKERlZmluaXRpb24pIFt0eXBlPVRdIFt0eXBla2luZD1VbmV4cG9zZWRdIFtjYW5vbmljYWx0eXBlPXR5cGUtcGFyYW1ldGVyLTAtMF0gW2Nhbm9uaWNhbHR5cGVraW5kPVVuZXhwb3NlZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogVHlwZVJlZj1UOjM0OjIwIFt0eXBlPVRdIFt0eXBla2luZD1VbmV4cG9zZWRdIFtjYW5vbmljYWx0eXBlPXR5cGUtcGFyYW1ldGVyLTAtMF0gW2Nhbm9uaWNhbHR5cGVraW5kPVVuZXhwb3NlZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogUGFybURlY2w9OjM1OjExIChEZWZpbml0aW9uKSBbdHlwZT1pbnRdIFt0eXBla2luZD1JbnRdIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IEZ1bmN0aW9uVGVtcGxhdGU9dGJhcjozODozIFt0eXBlPVQgKGludCAqKV0gW3R5cGVraW5kPUZ1bmN0aW9uUHJvdG9dIFtjYW5vbmljYWx0eXBlPXR5cGUtcGFyYW1ldGVyLTAtMCAoaW50ICopXSBbY2Fub25pY2FsdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gW3Jlc3VsdHR5cGU9VF0gW3Jlc3VsdHR5cGVraW5kPVVuZXhwb3NlZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogVGVtcGxhdGVUeXBlUGFyYW1ldGVyPVQ6Mzc6MjAgKERlZmluaXRpb24pIFt0eXBlPVRdIFt0eXBla2luZD1VbmV4cG9zZWRdIFtjYW5vbmljYWx0eXBlPXR5cGUtcGFyYW1ldGVyLTAtMF0gW2Nhbm9uaWNhbHR5cGVraW5kPVVuZXhwb3NlZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogVHlwZVJlZj1UOjM3OjIwIFt0eXBlPVRdIFt0eXBla2luZD1VbmV4cG9zZWRdIFtjYW5vbmljYWx0eXBlPXR5cGUtcGFyYW1ldGVyLTAtMF0gW2Nhbm9uaWNhbHR5cGVraW5kPVVuZXhwb3NlZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogUGFybURlY2w9OjM4OjExIChEZWZpbml0aW9uKSBbdHlwZT1pbnQgWzVdXSBbdHlwZWtpbmQ9Q29uc3RhbnRBcnJheV0gW2lzUE9EPTFdCisvLyBDSEVDSzogSW50ZWdlckxpdGVyYWw9IFt0eXBlPWludF0gW3R5cGVraW5kPUludF0gW2lzUE9EPTFdCisvLyBDSEVDSzogRnVuY3Rpb25UZW1wbGF0ZT10YmFyOjQxOjMgW3R5cGU9VCAoaW50ICopXSBbdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gW2Nhbm9uaWNhbHR5cGU9dHlwZS1wYXJhbWV0ZXItMC0wIChpbnQgKildIFtjYW5vbmljYWx0eXBla2luZD1GdW5jdGlvblByb3RvXSBbcmVzdWx0dHlwZT1UXSBbcmVzdWx0dHlwZWtpbmQ9VW5leHBvc2VkXSBbaXNQT0Q9MF0KKy8vIENIRUNLOiBUZW1wbGF0ZVR5cGVQYXJhbWV0ZXI9VDo0MDoyMCAoRGVmaW5pdGlvbikgW3R5cGU9VF0gW3R5cGVraW5kPVVuZXhwb3NlZF0gW2Nhbm9uaWNhbHR5cGU9dHlwZS1wYXJhbWV0ZXItMC0wXSBbY2Fub25pY2FsdHlwZWtpbmQ9VW5leHBvc2VkXSBbaXNQT0Q9MF0KKy8vIENIRUNLOiBOb25UeXBlVGVtcGxhdGVQYXJhbWV0ZXI9c2l6ZTo0MDoyNyAoRGVmaW5pdGlvbikgW3R5cGU9aW50XSBbdHlwZWtpbmQ9SW50XSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBUeXBlUmVmPVQ6NDA6MjAgW3R5cGU9VF0gW3R5cGVraW5kPVVuZXhwb3NlZF0gW2Nhbm9uaWNhbHR5cGU9dHlwZS1wYXJhbWV0ZXItMC0wXSBbY2Fub25pY2FsdHlwZWtpbmQ9VW5leHBvc2VkXSBbaXNQT0Q9MF0KKy8vIENIRUNLOiBQYXJtRGVjbD06NDE6MTEgKERlZmluaXRpb24pIFt0eXBlPWludCBbc2l6ZV1dIFt0eXBla2luZD1EZXBlbmRlbnRTaXplZEFycmF5XSBbaXNQT0Q9MF0KKy8vIENIRUNLOiBEZWNsUmVmRXhwcj1zaXplOjQwOjI3IFt0eXBlPWludF0gW3R5cGVraW5kPUludF0gW2lzUE9EPTFdCisvLyBDSEVDSzogRnVuY3Rpb25EZWNsPWZvbzo0Mzo2IChEZWZpbml0aW9uKSBbdHlwZT12b2lkIChpbnQsIGludCAqKV0gW3R5cGVraW5kPUZ1bmN0aW9uUHJvdG9dIFtjYW5vbmljYWx0eXBlPXZvaWQgKGludCwgaW50ICopXSBbY2Fub25pY2FsdHlwZWtpbmQ9RnVuY3Rpb25Qcm90b10gW3Jlc3VsdHR5cGU9dm9pZF0gW3Jlc3VsdHR5cGVraW5kPVZvaWRdIFthcmdzPSBbaW50XSBbSW50XSBbaW50IFtdXSBbSW5jb21wbGV0ZUFycmF5XV0gW2lzUE9EPTBdCisvLyBDSEVDSzogUGFybURlY2w9aTo0MzoxNCAoRGVmaW5pdGlvbikgW3R5cGU9aW50XSBbdHlwZWtpbmQ9SW50XSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBQYXJtRGVjbD1pbmNvbXBsZXRlX2FycmF5OjQzOjIxIChEZWZpbml0aW9uKSBbdHlwZT1pbnQgW11dIFt0eXBla2luZD1JbmNvbXBsZXRlQXJyYXldIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IENvbXBvdW5kU3RtdD0gW3R5cGU9XSBbdHlwZWtpbmQ9SW52YWxpZF0gW2lzUE9EPTBdCisvLyBDSEVDSzogRGVjbFN0bXQ9IFt0eXBlPV0gW3R5cGVraW5kPUludmFsaWRdIFtpc1BPRD0wXQorLy8gQ0hFQ0s6IFZhckRlY2w9dmFyaWFibGVfYXJyYXk6NDM6NDcgKERlZmluaXRpb24pIFt0eXBlPWludCBbaV1dIFt0eXBla2luZD1WYXJpYWJsZUFycmF5XSBbaXNQT0Q9MV0KKy8vIENIRUNLOiBEZWNsUmVmRXhwcj1pOjQzOjE0IFt0eXBlPWludF0gW3R5cGVraW5kPUludF0gW2lzUE9EPTFdCisvLyBDSEVDSzogU3RydWN0RGVjbD1CbG9iOjQ1OjggKERlZmluaXRpb24pIFt0eXBlPUJsb2JdIFt0eXBla2luZD1SZWNvcmRdIFtpc1BPRD0xXQorLy8gQ0hFQ0s6IEZpZWxkRGVjbD1pOjQ2OjcgKERlZmluaXRpb24pIFt0eXBlPWludF0gW3R5cGVraW5kPUludF0gW2lzUE9EPTFdCisvLyBDSEVDSzogVmFyRGVjbD1tZW1iZXJfcG9pbnRlcjo0ODoxMiAoRGVmaW5pdGlvbikgW3R5cGU9aW50IEJsb2I6OipdIFt0eXBla2luZD1NZW1iZXJQb2ludGVyXSBbaXNQT0Q9MV0KZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvcmVjdXJzaXZlLWN4eC1tZW1iZXItY2FsbHMuY3BwIGIvdGVzdC9JbmRleC9yZWN1cnNpdmUtY3h4LW1lbWJlci1jYWxscy5jcHAKaW5kZXggMmNkOGQxMy4uYWIzMGQ0MyAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9yZWN1cnNpdmUtY3h4LW1lbWJlci1jYWxscy5jcHAKKysrIGIvdGVzdC9JbmRleC9yZWN1cnNpdmUtY3h4LW1lbWJlci1jYWxscy5jcHAKQEAgLTE4NSw3ICsxODUsNyBAQAogICAgIC5EZWZhdWx0KFVua25vd25BdHRyaWJ1dGUpOwogfQogCi0vLyBSVU46IGMtaW5kZXgtdGVzdCAtdGVzdC1hbm5vdGF0ZS10b2tlbnM9JXM6MToxOjE4NjoxICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy10b2tlbnMgJXMKKy8vIFJVTjogYy1pbmRleC10ZXN0IC10ZXN0LWFubm90YXRlLXRva2Vucz0lczoxOjE6MTg2OjEgLXRhcmdldCB4ODZfNjQtdW5rbm93bi11bmtub3duICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy10b2tlbnMgJXMKIC8vIENIRUNLLXRva2VuczogS2V5d29yZDogInR5cGVkZWYiIFsxOjEgLSAxOjhdCiAvLyBDSEVDSy10b2tlbnM6IEtleXdvcmQ6ICJsb25nIiBbMTo5IC0gMToxM10KIC8vIENIRUNLLXRva2VuczogS2V5d29yZDogInVuc2lnbmVkIiBbMToxNCAtIDE6MjJdCkBAIC0yMjUsMTMgKzIyNSwxMyBAQAogLy8gQ0hFQ0stdG9rZW5zOiBLZXl3b3JkOiAiY29uc3QiIFs3OjE0IC0gNzoxOV0gUGFybURlY2w9Ojc6MjYgKERlZmluaXRpb24pCiAvLyBDSEVDSy10b2tlbnM6IEtleXdvcmQ6ICJ2b2lkIiBbNzoyMCAtIDc6MjRdIFBhcm1EZWNsPTo3OjI2IChEZWZpbml0aW9uKQogLy8gQ0hFQ0stdG9rZW5zOiBQdW5jdHVhdGlvbjogIioiIFs3OjI1IC0gNzoyNl0gUGFybURlY2w9Ojc6MjYgKERlZmluaXRpb24pCi0vLyBDSEVDSy10b2tlbnM6IFB1bmN0dWF0aW9uOiAiLCIgWzc6MjYgLSA3OjI3XSBQYXJtRGVjbD06NzoyNiAoRGVmaW5pdGlvbikKKy8vIENIRUNLLXRva2VuczogUHVuY3R1YXRpb246ICIsIiBbNzoyNiAtIDc6MjddIEZ1bmN0aW9uRGVjbD1tZW1jbXA6Nzo3CiAvLyBDSEVDSy10b2tlbnM6IEtleXdvcmQ6ICJjb25zdCIgWzc6MjggLSA3OjMzXSBQYXJtRGVjbD06Nzo0MCAoRGVmaW5pdGlvbikKIC8vIENIRUNLLXRva2VuczogS2V5d29yZDogInZvaWQiIFs3OjM0IC0gNzozOF0gUGFybURlY2w9Ojc6NDAgKERlZmluaXRpb24pCiAvLyBDSEVDSy10b2tlbnM6IFB1bmN0dWF0aW9uOiAiKiIgWzc6MzkgLSA3OjQwXSBQYXJtRGVjbD06Nzo0MCAoRGVmaW5pdGlvbikKLS8vIENIRUNLLXRva2VuczogUHVuY3R1YXRpb246ICIsIiBbNzo0MCAtIDc6NDFdIFBhcm1EZWNsPTo3OjQwIChEZWZpbml0aW9uKQorLy8gQ0hFQ0stdG9rZW5zOiBQdW5jdHVhdGlvbjogIiwiIFs3OjQwIC0gNzo0MV0gRnVuY3Rpb25EZWNsPW1lbWNtcDo3OjcKIC8vIENIRUNLLXRva2VuczogSWRlbnRpZmllcjogInNpemVfdCIgWzc6NDIgLSA3OjQ4XSBUeXBlUmVmPXNpemVfdDoyOjI1Ci0vLyBDSEVDSy10b2tlbnM6IFB1bmN0dWF0aW9uOiAiKSIgWzc6NDggLSA3OjQ5XSBQYXJtRGVjbD06Nzo0OCAoRGVmaW5pdGlvbikKKy8vIENIRUNLLXRva2VuczogUHVuY3R1YXRpb246ICIpIiBbNzo0OCAtIDc6NDldIEZ1bmN0aW9uRGVjbD1tZW1jbXA6Nzo3CiAvLyBDSEVDSy10b2tlbnM6IFB1bmN0dWF0aW9uOiAiOyIgWzc6NDkgLSA3OjUwXSBVbmV4cG9zZWREZWNsPTo2OjggKERlZmluaXRpb24pCiAvLyBDSEVDSy10b2tlbnM6IElkZW50aWZpZXI6ICJzaXplX3QiIFs4OjMgLSA4OjldIFR5cGVSZWY9c2l6ZV90OjI6MjUKIC8vIENIRUNLLXRva2VuczogSWRlbnRpZmllcjogInN0cmxlbiIgWzg6MTAgLSA4OjE2XSBGdW5jdGlvbkRlY2w9c3RybGVuOjg6MTAKQEAgLTIzOSw3ICsyMzksNyBAQAogLy8gQ0hFQ0stdG9rZW5zOiBLZXl3b3JkOiAiY29uc3QiIFs4OjE3IC0gODoyMl0gUGFybURlY2w9Ojg6MjkgKERlZmluaXRpb24pCiAvLyBDSEVDSy10b2tlbnM6IEtleXdvcmQ6ICJjaGFyIiBbODoyMyAtIDg6MjddIFBhcm1EZWNsPTo4OjI5IChEZWZpbml0aW9uKQogLy8gQ0hFQ0stdG9rZW5zOiBQdW5jdHVhdGlvbjogIioiIFs4OjI4IC0gODoyOV0gUGFybURlY2w9Ojg6MjkgKERlZmluaXRpb24pCi0vLyBDSEVDSy10b2tlbnM6IFB1bmN0dWF0aW9uOiAiKSIgWzg6MjkgLSA4OjMwXSBQYXJtRGVjbD06ODoyOSAoRGVmaW5pdGlvbikKKy8vIENIRUNLLXRva2VuczogUHVuY3R1YXRpb246ICIpIiBbODoyOSAtIDg6MzBdIEZ1bmN0aW9uRGVjbD1zdHJsZW46ODoxMAogLy8gQ0hFQ0stdG9rZW5zOiBQdW5jdHVhdGlvbjogIjsiIFs4OjMwIC0gODozMV0KIC8vIENIRUNLLXRva2VuczogUHVuY3R1YXRpb246ICJ9IiBbOToxIC0gOToyXQogLy8gQ0hFQ0stdG9rZW5zOiBLZXl3b3JkOiAibmFtZXNwYWNlIiBbMTA6MSAtIDEwOjEwXQpAQCAtMTUyMyw3ICsxNTIzLDcgQEAKIC8vIENIRUNLLXRva2VuczogUHVuY3R1YXRpb246ICI7IiBbMTg1OjMxIC0gMTg1OjMyXSBDb21wb3VuZFN0bXQ9CiAvLyBDSEVDSy10b2tlbnM6IFB1bmN0dWF0aW9uOiAifSIgWzE4NjoxIC0gMTg2OjJdIENvbXBvdW5kU3RtdD0KIAotLy8gUlVOOiBjLWluZGV4LXRlc3QgLXRlc3QtbG9hZC1zb3VyY2UgYWxsICVzIC1zdGQ9YysrOTggMj4mMSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiBjLWluZGV4LXRlc3QgLXRlc3QtbG9hZC1zb3VyY2UgYWxsICVzIC1zdGQ9YysrOTggLXRhcmdldCB4ODZfNjQtdW5rbm93bi11bmtub3duIDI+JjEgfCBGaWxlQ2hlY2sgJXMKIC8vIENIRUNLOiAxOjI3OiBUeXBlZGVmRGVjbD1fX2Rhcndpbl9zaXplX3Q6MToyNyAoRGVmaW5pdGlvbikgRXh0ZW50PVsxOjEgLSAxOjQyXQogLy8gQ0hFQ0s6IDI6MjU6IFR5cGVkZWZEZWNsPXNpemVfdDoyOjI1IChEZWZpbml0aW9uKSBFeHRlbnQ9WzI6MSAtIDI6MzFdCiAvLyBDSEVDSzogMjo5OiBUeXBlUmVmPV9fZGFyd2luX3NpemVfdDoxOjI3IEV4dGVudD1bMjo5IC0gMjoyNF0KQEAgLTE1MzQsMTMgKzE1MzQsMTMgQEAKIC8vIENIRUNLOiA0OjU1OiBGaWVsZERlY2w9c2Vjb25kOjQ6NTUgKERlZmluaXRpb24pIEV4dGVudD1bNDo1MSAtIDQ6NjFdCiAvLyBDSEVDSzogNjo4OiBVbmV4cG9zZWREZWNsPTo2OjggKERlZmluaXRpb24pIEV4dGVudD1bNjoxIC0gOToyXQogLy8gQ0hFQ0s6IDc6NzogRnVuY3Rpb25EZWNsPW1lbWNtcDo3OjcgRXh0ZW50PVs3OjMgLSA3OjQ5XQotLy8gQ0hFQ0s6IDc6MjY6IFBhcm1EZWNsPTo3OjI2IChEZWZpbml0aW9uKSBFeHRlbnQ9Wzc6MTQgLSA3OjI3XQotLy8gQ0hFQ0s6IDc6NDA6IFBhcm1EZWNsPTo3OjQwIChEZWZpbml0aW9uKSBFeHRlbnQ9Wzc6MjggLSA3OjQxXQotLy8gQ0hFQ0s6IDc6NDg6IFBhcm1EZWNsPTo3OjQ4IChEZWZpbml0aW9uKSBFeHRlbnQ9Wzc6NDIgLSA3OjQ5XQorLy8gQ0hFQ0s6IDc6MjY6IFBhcm1EZWNsPTo3OjI2IChEZWZpbml0aW9uKSBFeHRlbnQ9Wzc6MTQgLSA3OjI2XQorLy8gQ0hFQ0s6IDc6NDA6IFBhcm1EZWNsPTo3OjQwIChEZWZpbml0aW9uKSBFeHRlbnQ9Wzc6MjggLSA3OjQwXQorLy8gQ0hFQ0s6IDc6NDg6IFBhcm1EZWNsPTo3OjQ4IChEZWZpbml0aW9uKSBFeHRlbnQ9Wzc6NDIgLSA3OjQ4XQogLy8gQ0hFQ0s6IDc6NDI6IFR5cGVSZWY9c2l6ZV90OjI6MjUgRXh0ZW50PVs3OjQyIC0gNzo0OF0KIC8vIENIRUNLOiA4OjEwOiBGdW5jdGlvbkRlY2w9c3RybGVuOjg6MTAgRXh0ZW50PVs4OjMgLSA4OjMwXQogLy8gQ0hFQ0s6IDg6MzogVHlwZVJlZj1zaXplX3Q6MjoyNSBFeHRlbnQ9Wzg6MyAtIDg6OV0KLS8vIENIRUNLOiA4OjI5OiBQYXJtRGVjbD06ODoyOSAoRGVmaW5pdGlvbikgRXh0ZW50PVs4OjE3IC0gODozMF0KKy8vIENIRUNLOiA4OjI5OiBQYXJtRGVjbD06ODoyOSAoRGVmaW5pdGlvbikgRXh0ZW50PVs4OjE3IC0gODoyOV0KIC8vIENIRUNLOiAxMDoxNzogTmFtZXNwYWNlPWNsYW5nOjEwOjE3IChEZWZpbml0aW9uKSBFeHRlbnQ9WzEwOjEgLSAzNToyXQogLy8gQ0hFQ0s6IDExOjk6IENsYXNzRGVjbD1JZGVudGlmaWVySW5mbzoxMTo5IEV4dGVudD1bMTE6MyAtIDExOjIzXQogLy8gQ0hFQ0s6IDEyOjk6IENsYXNzRGVjbD1BdHRyaWJ1dGVMaXN0OjEyOjkgKERlZmluaXRpb24pIEV4dGVudD1bMTI6MyAtIDM0OjRdCkBAIC0xODg4LDcgKzE4ODgsNyBAQAogLy8gQ0hFQ0s6IDEwMjoyNzogVW5leHBvc2VkRXhwcj1TdHJpbmdSZWY6NDg6MyBFeHRlbnQ9WzEwMjoyNyAtIDEwMjozMV0KIC8vIENIRUNLOiAxMDI6Mjc6IENhbGxFeHByPVN0cmluZ1JlZjo0ODozIEV4dGVudD1bMTAyOjI3IC0gMTAyOjMxXQogLy8gQ0hFQ0s6IDEwMjoyNzogVW5leHBvc2VkRXhwcj0gRXh0ZW50PVsxMDI6MjcgLSAxMDI6MzFdCi0vLyBDSEVDSzogMTAyOjI3OiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzEwMjoyNyAtIDEwMjozMV0KKy8vIENIRUNLOiAxMDI6Mjc6IFN0cmluZ0xpdGVyYWw9Il9fIiBFeHRlbnQ9WzEwMjoyNyAtIDEwMjozMV0KIC8vIENIRUNLOiAxMDI6MzY6IENhbGxFeHByPWVuZHN3aXRoOjU2OjggRXh0ZW50PVsxMDI6MzYgLSAxMDI6NTldCiAvLyBDSEVDSzogMTAyOjQ1OiBNZW1iZXJSZWZFeHByPWVuZHN3aXRoOjU2OjggU2luZ2xlUmVmTmFtZT1bMTAyOjQ1IC0gMTAyOjUzXSBSZWZOYW1lPVsxMDI6NDUgLSAxMDI6NTNdIEV4dGVudD1bMTAyOjM2IC0gMTAyOjUzXQogLy8gQ0hFQ0s6IDEwMjozNjogVW5leHBvc2VkRXhwcj1BdHRyTmFtZToxMDE6MTkgRXh0ZW50PVsxMDI6MzYgLSAxMDI6NDRdCkBAIC0xODk4LDcgKzE4OTgsNyBAQAogLy8gQ0hFQ0s6IDEwMjo1NDogVW5leHBvc2VkRXhwcj1TdHJpbmdSZWY6NDg6MyBFeHRlbnQ9WzEwMjo1NCAtIDEwMjo1OF0KIC8vIENIRUNLOiAxMDI6NTQ6IENhbGxFeHByPVN0cmluZ1JlZjo0ODozIEV4dGVudD1bMTAyOjU0IC0gMTAyOjU4XQogLy8gQ0hFQ0s6IDEwMjo1NDogVW5leHBvc2VkRXhwcj0gRXh0ZW50PVsxMDI6NTQgLSAxMDI6NThdCi0vLyBDSEVDSzogMTAyOjU0OiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzEwMjo1NCAtIDEwMjo1OF0KKy8vIENIRUNLOiAxMDI6NTQ6IFN0cmluZ0xpdGVyYWw9Il9fIiBFeHRlbnQ9WzEwMjo1NCAtIDEwMjo1OF0KIC8vIENIRUNLOiAxMDM6NTogQ2FsbEV4cHI9b3BlcmF0b3I9OjM4OjcgRXh0ZW50PVsxMDM6NSAtIDEwMzo1NV0KIC8vIENIRUNLOiAxMDM6NTogRGVjbFJlZkV4cHI9QXR0ck5hbWU6MTAxOjE5IEV4dGVudD1bMTAzOjUgLSAxMDM6MTNdCiAvLyBDSEVDSzogMTAzOjE0OiBVbmV4cG9zZWRFeHByPW9wZXJhdG9yPTozODo3CkBAIC0yMDg1LDE1OCArMjA4NSwxNTggQEAKIC8vIENIRUNLOiAxMDU6NTQ6IENhbGxFeHByPVN0cmluZ1JlZjozODo3IEV4dGVudD1bMTA1OjU0IC0gMTA1OjYyXQogLy8gQ0hFQ0s6IDEwNTo1NDogVW5leHBvc2VkRXhwcj1BdHRyTmFtZToxMDE6MTkgRXh0ZW50PVsxMDU6NTQgLSAxMDU6NjJdCiAvLyBDSEVDSzogMTA1OjU0OiBEZWNsUmVmRXhwcj1BdHRyTmFtZToxMDE6MTkgRXh0ZW50PVsxMDU6NTQgLSAxMDU6NjJdCi0vLyBDSEVDSzogMTA2OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzEwNjoxMSAtIDEwNjoxN10KKy8vIENIRUNLOiAxMDY6MTE6IFN0cmluZ0xpdGVyYWw9IndlYWsiIEV4dGVudD1bMTA2OjExIC0gMTA2OjE3XQogLy8gQ0hFQ0s6IDEwNjoxOTogRGVjbFJlZkV4cHI9QVRfd2VhazoyOTo0NSBFeHRlbnQ9WzEwNjoxOSAtIDEwNjoyNl0KLS8vIENIRUNLOiAxMDc6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTA3OjExIC0gMTA3OjIwXQorLy8gQ0hFQ0s6IDEwNzoxMTogU3RyaW5nTGl0ZXJhbD0id2Vha3JlZiIgRXh0ZW50PVsxMDc6MTEgLSAxMDc6MjBdCiAvLyBDSEVDSzogMTA3OjIyOiBEZWNsUmVmRXhwcj1BVF93ZWFrcmVmOjI5OjU0IEV4dGVudD1bMTA3OjIyIC0gMTA3OjMyXQotLy8gQ0hFQ0s6IDEwODoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxMDg6MTEgLSAxMDg6MTddCisvLyBDSEVDSzogMTA4OjExOiBTdHJpbmdMaXRlcmFsPSJwdXJlIiBFeHRlbnQ9WzEwODoxMSAtIDEwODoxN10KIC8vIENIRUNLOiAxMDg6MTk6IERlY2xSZWZFeHByPUFUX3B1cmU6MjY6NDkgRXh0ZW50PVsxMDg6MTkgLSAxMDg6MjZdCi0vLyBDSEVDSzogMTA5OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzEwOToxMSAtIDEwOToxN10KKy8vIENIRUNLOiAxMDk6MTE6IFN0cmluZ0xpdGVyYWw9Im1vZGUiIEV4dGVudD1bMTA5OjExIC0gMTA5OjE3XQogLy8gQ0hFQ0s6IDEwOToxOTogRGVjbFJlZkV4cHI9QVRfbW9kZToyMDo0NCBFeHRlbnQ9WzEwOToxOSAtIDEwOToyNl0KLS8vIENIRUNLOiAxMTA6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTEwOjExIC0gMTEwOjE3XQorLy8gQ0hFQ0s6IDExMDoxMTogU3RyaW5nTGl0ZXJhbD0idXNlZCIgRXh0ZW50PVsxMTA6MTEgLSAxMTA6MTddCiAvLyBDSEVDSzogMTEwOjE5OiBEZWNsUmVmRXhwcj1BVF91c2VkOjI4OjM0IEV4dGVudD1bMTEwOjE5IC0gMTEwOjI2XQotLy8gQ0hFQ0s6IDExMToxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxMTE6MTEgLSAxMTE6MThdCisvLyBDSEVDSzogMTExOjExOiBTdHJpbmdMaXRlcmFsPSJhbGlhcyIgRXh0ZW50PVsxMTE6MTEgLSAxMTE6MThdCiAvLyBDSEVDSzogMTExOjIwOiBEZWNsUmVmRXhwcj1BVF9hbGlhczoxNToyNSBFeHRlbnQ9WzExMToyMCAtIDExMToyOF0KLS8vIENIRUNLOiAxMTI6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTEyOjExIC0gMTEyOjE4XQorLy8gQ0hFQ0s6IDExMjoxMTogU3RyaW5nTGl0ZXJhbD0iYWxpZ24iIEV4dGVudD1bMTEyOjExIC0gMTEyOjE4XQogLy8gQ0hFQ0s6IDExMjoyMDogRGVjbFJlZkV4cHI9QVRfYWxpZ25lZDoxNTozNSBFeHRlbnQ9WzExMjoyMCAtIDExMjozMF0KLS8vIENIRUNLOiAxMTM6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTEzOjExIC0gMTEzOjE4XQorLy8gQ0hFQ0s6IDExMzoxMTogU3RyaW5nTGl0ZXJhbD0iZmluYWwiIEV4dGVudD1bMTEzOjExIC0gMTEzOjE4XQogLy8gQ0hFQ0s6IDExMzoyMDogRGVjbFJlZkV4cHI9QVRfZmluYWw6MTk6NDAgRXh0ZW50PVsxMTM6MjAgLSAxMTM6MjhdCi0vLyBDSEVDSzogMTE0OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzExNDoxMSAtIDExNDoxOF0KKy8vIENIRUNLOiAxMTQ6MTE6IFN0cmluZ0xpdGVyYWw9ImNkZWNsIiBFeHRlbnQ9WzExNDoxMSAtIDExNDoxOF0KIC8vIENIRUNLOiAxMTQ6MjA6IERlY2xSZWZFeHByPUFUX2NkZWNsOjE3OjMwIEV4dGVudD1bMTE0OjIwIC0gMTE0OjI4XQotLy8gQ0hFQ0s6IDExNToxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxMTU6MTEgLSAxMTU6MThdCisvLyBDSEVDSzogMTE1OjExOiBTdHJpbmdMaXRlcmFsPSJjb25zdCIgRXh0ZW50PVsxMTU6MTEgLSAxMTU6MThdCiAvLyBDSEVDSzogMTE1OjIwOiBEZWNsUmVmRXhwcj1BVF9jb25zdDoxNzo1MiBFeHRlbnQ9WzExNToyMCAtIDExNToyOF0KLS8vIENIRUNLOiAxMTY6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTE2OjExIC0gMTE2OjIwXQorLy8gQ0hFQ0s6IDExNjoxMTogU3RyaW5nTGl0ZXJhbD0iX19jb25zdCIgRXh0ZW50PVsxMTY6MTEgLSAxMTY6MjBdCiAvLyBDSEVDSzogMTE2OjIyOiBEZWNsUmVmRXhwcj1BVF9jb25zdDoxNzo1MiBFeHRlbnQ9WzExNjoyMiAtIDExNjozMF0KLS8vIENIRUNLOiAxMTc6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTE3OjExIC0gMTE3OjE5XQorLy8gQ0hFQ0s6IDExNzoxMTogU3RyaW5nTGl0ZXJhbD0iYmxvY2tzIiBFeHRlbnQ9WzExNzoxMSAtIDExNzoxOV0KIC8vIENIRUNLOiAxMTc6MjE6IERlY2xSZWZFeHByPUFUX2Jsb2NrczoxNjo1NyBFeHRlbnQ9WzExNzoyMSAtIDExNzozMF0KLS8vIENIRUNLOiAxMTg6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTE4OjExIC0gMTE4OjE5XQorLy8gQ0hFQ0s6IDExODoxMTogU3RyaW5nTGl0ZXJhbD0iZm9ybWF0IiBFeHRlbnQ9WzExODoxMSAtIDExODoxOV0KIC8vIENIRUNLOiAxMTg6MjE6IERlY2xSZWZFeHByPUFUX2Zvcm1hdDoxOTo1MCBFeHRlbnQ9WzExODoyMSAtIDExODozMF0KLS8vIENIRUNLOiAxMTk6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTE5OjExIC0gMTE5OjE5XQorLy8gQ0hFQ0s6IDExOToxMTogU3RyaW5nTGl0ZXJhbD0iaGlkaW5nIiBFeHRlbnQ9WzExOToxMSAtIDExOToxOV0KIC8vIENIRUNLOiAxMTk6MjE6IERlY2xSZWZFeHByPUFUX2hpZGluZzoyMDoyMiBFeHRlbnQ9WzExOToyMSAtIDExOTozMF0KLS8vIENIRUNLOiAxMjA6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTIwOjExIC0gMTIwOjE5XQorLy8gQ0hFQ0s6IDEyMDoxMTogU3RyaW5nTGl0ZXJhbD0ibWFsbG9jIiBFeHRlbnQ9WzEyMDoxMSAtIDEyMDoxOV0KIC8vIENIRUNLOiAxMjA6MjE6IERlY2xSZWZFeHByPUFUX21hbGxvYzoyMDozMyBFeHRlbnQ9WzEyMDoyMSAtIDEyMDozMF0KLS8vIENIRUNLOiAxMjE6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTIxOjExIC0gMTIxOjE5XQorLy8gQ0hFQ0s6IDEyMToxMTogU3RyaW5nTGl0ZXJhbD0icGFja2VkIiBFeHRlbnQ9WzEyMToxMSAtIDEyMToxOV0KIC8vIENIRUNLOiAxMjE6MjE6IERlY2xSZWZFeHByPUFUX3BhY2tlZDoyNjoyNyBFeHRlbnQ9WzEyMToyMSAtIDEyMTozMF0KLS8vIENIRUNLOiAxMjI6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTIyOjExIC0gMTIyOjE5XQorLy8gQ0hFQ0s6IDEyMjoxMTogU3RyaW5nTGl0ZXJhbD0idW51c2VkIiBFeHRlbnQ9WzEyMjoxMSAtIDEyMjoxOV0KIC8vIENIRUNLOiAxMjI6MjE6IERlY2xSZWZFeHByPUFUX3VudXNlZDoyODoyMyBFeHRlbnQ9WzEyMjoyMSAtIDEyMjozMF0KLS8vIENIRUNLOiAxMjM6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTIzOjExIC0gMTIzOjIwXQorLy8gQ0hFQ0s6IDEyMzoxMTogU3RyaW5nTGl0ZXJhbD0iYWxpZ25lZCIgRXh0ZW50PVsxMjM6MTEgLSAxMjM6MjBdCiAvLyBDSEVDSzogMTIzOjIyOiBEZWNsUmVmRXhwcj1BVF9hbGlnbmVkOjE1OjM1IEV4dGVudD1bMTIzOjIyIC0gMTIzOjMyXQotLy8gQ0hFQ0s6IDEyNDoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxMjQ6MTEgLSAxMjQ6MjBdCisvLyBDSEVDSzogMTI0OjExOiBTdHJpbmdMaXRlcmFsPSJjbGVhbnVwIiBFeHRlbnQ9WzEyNDoxMSAtIDEyNDoyMF0KIC8vIENIRUNLOiAxMjQ6MjI6IERlY2xSZWZFeHByPUFUX2NsZWFudXA6MTc6NDAgRXh0ZW50PVsxMjQ6MjIgLSAxMjQ6MzJdCi0vLyBDSEVDSzogMTI1OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzEyNToxMSAtIDEyNToxOF0KKy8vIENIRUNLOiAxMjU6MTE6IFN0cmluZ0xpdGVyYWw9Im5ha2VkIiBFeHRlbnQ9WzEyNToxMSAtIDEyNToxOF0KIC8vIENIRUNLOiAxMjU6MjA6IERlY2xSZWZFeHByPUFUX25ha2VkOjIwOjUzIEV4dGVudD1bMTI1OjIwIC0gMTI1OjI4XQotLy8gQ0hFQ0s6IDEyNjoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxMjY6MTEgLSAxMjY6MjBdCisvLyBDSEVDSzogMTI2OjExOiBTdHJpbmdMaXRlcmFsPSJub2RlYnVnIiBFeHRlbnQ9WzEyNjoxMSAtIDEyNjoyMF0KIC8vIENIRUNLOiAxMjY6MjI6IERlY2xSZWZFeHByPUFUX25vZGVidWc6MjA6NjMgRXh0ZW50PVsxMjY6MjIgLSAxMjY6MzJdCi0vLyBDSEVDSzogMTI3OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzEyNzoxMSAtIDEyNzoyMF0KKy8vIENIRUNLOiAxMjc6MTE6IFN0cmluZ0xpdGVyYWw9Im5vbm51bGwiIEV4dGVudD1bMTI3OjExIC0gMTI3OjIwXQogLy8gQ0hFQ0s6IDEyNzoyMjogRGVjbFJlZkV4cHI9QVRfbm9ubnVsbDoyMTo0NyBFeHRlbnQ9WzEyNzoyMiAtIDEyNzozMl0KLS8vIENIRUNLOiAxMjg6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTI4OjExIC0gMTI4OjIwXQorLy8gQ0hFQ0s6IDEyODoxMTogU3RyaW5nTGl0ZXJhbD0ibm90aHJvdyIgRXh0ZW50PVsxMjg6MTEgLSAxMjg6MjBdCiAvLyBDSEVDSzogMTI4OjIyOiBEZWNsUmVmRXhwcj1BVF9ub3Rocm93OjIyOjcgRXh0ZW50PVsxMjg6MjIgLSAxMjg6MzJdCi0vLyBDSEVDSzogMTI5OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzEyOToxMSAtIDEyOToyMF0KKy8vIENIRUNLOiAxMjk6MTE6IFN0cmluZ0xpdGVyYWw9Im9iamNfZ2MiIEV4dGVudD1bMTI5OjExIC0gMTI5OjIwXQogLy8gQ0hFQ0s6IDEyOToyMjogRGVjbFJlZkV4cHI9QVRfb2JqY19nYzoyNDo1OSBFeHRlbnQ9WzEyOToyMiAtIDEyOTozMl0KLS8vIENIRUNLOiAxMzA6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTMwOjExIC0gMTMwOjIwXQorLy8gQ0hFQ0s6IDEzMDoxMTogU3RyaW5nTGl0ZXJhbD0icmVncGFybSIgRXh0ZW50PVsxMzA6MTEgLSAxMzA6MjBdCiAvLyBDSEVDSzogMTMwOjIyOiBEZWNsUmVmRXhwcj1BVF9yZWdwYXJtOjI2OjU4IEV4dGVudD1bMTMwOjIyIC0gMTMwOjMyXQotLy8gQ0hFQ0s6IDEzMToxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxMzE6MTEgLSAxMzE6MjBdCisvLyBDSEVDSzogMTMxOjExOiBTdHJpbmdMaXRlcmFsPSJzZWN0aW9uIiBFeHRlbnQ9WzEzMToxMSAtIDEzMToyMF0KIC8vIENIRUNLOiAxMzE6MjI6IERlY2xSZWZFeHByPUFUX3NlY3Rpb246Mjc6NyBFeHRlbnQ9WzEzMToyMiAtIDEzMTozMl0KLS8vIENIRUNLOiAxMzI6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTMyOjExIC0gMTMyOjIwXQorLy8gQ0hFQ0s6IDEzMjoxMTogU3RyaW5nTGl0ZXJhbD0ic3RkY2FsbCIgRXh0ZW50PVsxMzI6MTEgLSAxMzI6MjBdCiAvLyBDSEVDSzogMTMyOjIyOiBEZWNsUmVmRXhwcj1BVF9zdGRjYWxsOjI3OjMyIEV4dGVudD1bMTMyOjIyIC0gMTMyOjMyXQotLy8gQ0hFQ0s6IDEzMzoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxMzM6MTEgLSAxMzM6MjFdCisvLyBDSEVDSzogMTMzOjExOiBTdHJpbmdMaXRlcmFsPSJhbm5vdGF0ZSIgRXh0ZW50PVsxMzM6MTEgLSAxMzM6MjFdCiAvLyBDSEVDSzogMTMzOjIzOiBEZWNsUmVmRXhwcj1BVF9hbm5vdGF0ZToxNjoyOSBFeHRlbnQ9WzEzMzoyMyAtIDEzMzozNF0KLS8vIENIRUNLOiAxMzQ6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTM0OjExIC0gMTM0OjIxXQorLy8gQ0hFQ0s6IDEzNDoxMTogU3RyaW5nTGl0ZXJhbD0iZmFzdGNhbGwiIEV4dGVudD1bMTM0OjExIC0gMTM0OjIxXQogLy8gQ0hFQ0s6IDEzNDoyMzogRGVjbFJlZkV4cHI9QVRfZmFzdGNhbGw6MTk6MjcgRXh0ZW50PVsxMzQ6MjMgLSAxMzQ6MzRdCi0vLyBDSEVDSzogMTM1OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzEzNToxMSAtIDEzNToyMV0KKy8vIENIRUNLOiAxMzU6MTE6IFN0cmluZ0xpdGVyYWw9ImliYWN0aW9uIiBFeHRlbnQ9WzEzNToxMSAtIDEzNToyMV0KIC8vIENIRUNLOiAxMzU6MjM6IERlY2xSZWZFeHByPUFUX0lCQWN0aW9uOjE0OjcgRXh0ZW50PVsxMzU6MjMgLSAxMzU6MzRdCi0vLyBDSEVDSzogMTM2OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzEzNjoxMSAtIDEzNjoyMV0KKy8vIENIRUNLOiAxMzY6MTE6IFN0cmluZ0xpdGVyYWw9Imlib3V0bGV0IiBFeHRlbnQ9WzEzNjoxMSAtIDEzNjoyMV0KIC8vIENIRUNLOiAxMzY6MjM6IERlY2xSZWZFeHByPUFUX0lCT3V0bGV0OjE0OjIwIEV4dGVudD1bMTM2OjIzIC0gMTM2OjM0XQotLy8gQ0hFQ0s6IDEzNzoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxMzc6MTEgLSAxMzc6MzFdCisvLyBDSEVDSzogMTM3OjExOiBTdHJpbmdMaXRlcmFsPSJpYm91dGxldGNvbGxlY3Rpb24iIEV4dGVudD1bMTM3OjExIC0gMTM3OjMxXQogLy8gQ0hFQ0s6IDEzNzozMzogRGVjbFJlZkV4cHI9QVRfSUJPdXRsZXRDb2xsZWN0aW9uOjE0OjMzIEV4dGVudD1bMTM3OjMzIC0gMTM3OjU0XQotLy8gQ0hFQ0s6IDEzODoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxMzg6MTEgLSAxMzg6MjFdCisvLyBDSEVDSzogMTM4OjExOiBTdHJpbmdMaXRlcmFsPSJub3JldHVybiIgRXh0ZW50PVsxMzg6MTEgLSAxMzg6MjFdCiAvLyBDSEVDSzogMTM4OjIzOiBEZWNsUmVmRXhwcj1BVF9ub3JldHVybjoyMTo1OSBFeHRlbnQ9WzEzODoyMyAtIDEzODozNF0KLS8vIENIRUNLOiAxMzk6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTM5OjExIC0gMTM5OjIxXQorLy8gQ0hFQ0s6IDEzOToxMTogU3RyaW5nTGl0ZXJhbD0ibm9pbmxpbmUiIEV4dGVudD1bMTM5OjExIC0gMTM5OjIxXQogLy8gQ0hFQ0s6IDEzOToyMzogRGVjbFJlZkV4cHI9QVRfbm9pbmxpbmU6MjE6NyBFeHRlbnQ9WzEzOToyMyAtIDEzOTozNF0KLS8vIENIRUNLOiAxNDA6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTQwOjExIC0gMTQwOjIxXQorLy8gQ0hFQ0s6IDE0MDoxMTogU3RyaW5nTGl0ZXJhbD0ib3ZlcnJpZGUiIEV4dGVudD1bMTQwOjExIC0gMTQwOjIxXQogLy8gQ0hFQ0s6IDE0MDoyMzogRGVjbFJlZkV4cHI9QVRfb3ZlcnJpZGU6MjI6NTEgRXh0ZW50PVsxNDA6MjMgLSAxNDA6MzRdCi0vLyBDSEVDSzogMTQxOjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE0MToxMSAtIDE0MToyMV0KKy8vIENIRUNLOiAxNDE6MTE6IFN0cmluZ0xpdGVyYWw9InNlbnRpbmVsIiBFeHRlbnQ9WzE0MToxMSAtIDE0MToyMV0KIC8vIENIRUNLOiAxNDE6MjM6IERlY2xSZWZFeHByPUFUX3NlbnRpbmVsOjI3OjE5IEV4dGVudD1bMTQxOjIzIC0gMTQxOjM0XQotLy8gQ0hFQ0s6IDE0MjoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNDI6MTEgLSAxNDI6MjFdCisvLyBDSEVDSzogMTQyOjExOiBTdHJpbmdMaXRlcmFsPSJOU09iamVjdCIgRXh0ZW50PVsxNDI6MTEgLSAxNDI6MjFdCiAvLyBDSEVDSzogMTQyOjIzOiBEZWNsUmVmRXhwcj1BVF9uc29iamVjdDoyMjoxOSBFeHRlbnQ9WzE0MjoyMyAtIDE0MjozNF0KLS8vIENIRUNLOiAxNDM6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTQzOjExIC0gMTQzOjIyXQorLy8gQ0hFQ0s6IDE0MzoxMTogU3RyaW5nTGl0ZXJhbD0iZGxsaW1wb3J0IiBFeHRlbnQ9WzE0MzoxMSAtIDE0MzoyMl0KIC8vIENIRUNLOiAxNDM6MjQ6IERlY2xSZWZFeHByPUFUX2RsbGltcG9ydDoxODo1MSBFeHRlbnQ9WzE0MzoyNCAtIDE0MzozNl0KLS8vIENIRUNLOiAxNDQ6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTQ0OjExIC0gMTQ0OjIyXQorLy8gQ0hFQ0s6IDE0NDoxMTogU3RyaW5nTGl0ZXJhbD0iZGxsZXhwb3J0IiBFeHRlbnQ9WzE0NDoxMSAtIDE0NDoyMl0KIC8vIENIRUNLOiAxNDQ6MjQ6IERlY2xSZWZFeHByPUFUX2RsbGV4cG9ydDoxODozNyBFeHRlbnQ9WzE0NDoyNCAtIDE0NDozNl0KLS8vIENIRUNLOiAxNDU6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTQ1OjExIC0gMTQ1OjIyXQotLy8gQ0hFQ0s6IDE0NjoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNDY6MTEgLSAxNDY6MjNdCisvLyBDSEVDSzogMTQ1OjExOiBTdHJpbmdMaXRlcmFsPSJtYXlfYWxpYXMiIEV4dGVudD1bMTQ1OjExIC0gMTQ1OjIyXQorLy8gQ0hFQ0s6IDE0NjoxMTogU3RyaW5nTGl0ZXJhbD0iYmFzZV9jaGVjayIgRXh0ZW50PVsxNDY6MTEgLSAxNDY6MjNdCiAvLyBDSEVDSzogMTQ2OjI1OiBEZWNsUmVmRXhwcj1BVF9iYXNlX2NoZWNrOjE2OjQyIEV4dGVudD1bMTQ2OjI1IC0gMTQ2OjM4XQotLy8gQ0hFQ0s6IDE0NzoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNDc6MTEgLSAxNDc6MjNdCisvLyBDSEVDSzogMTQ3OjExOiBTdHJpbmdMaXRlcmFsPSJkZXByZWNhdGVkIiBFeHRlbnQ9WzE0NzoxMSAtIDE0NzoyM10KIC8vIENIRUNLOiAxNDc6MjU6IERlY2xSZWZFeHByPUFUX2RlcHJlY2F0ZWQ6MTg6NyBFeHRlbnQ9WzE0NzoyNSAtIDE0NzozOF0KLS8vIENIRUNLOiAxNDg6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTQ4OjExIC0gMTQ4OjIzXQorLy8gQ0hFQ0s6IDE0ODoxMTogU3RyaW5nTGl0ZXJhbD0idmlzaWJpbGl0eSIgRXh0ZW50PVsxNDg6MTEgLSAxNDg6MjNdCiAvLyBDSEVDSzogMTQ4OjI1OiBEZWNsUmVmRXhwcj1BVF92aXNpYmlsaXR5OjI5OjcgRXh0ZW50PVsxNDg6MjUgLSAxNDg6MzhdCi0vLyBDSEVDSzogMTQ5OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE0OToxMSAtIDE0OToyM10KKy8vIENIRUNLOiAxNDk6MTE6IFN0cmluZ0xpdGVyYWw9ImRlc3RydWN0b3IiIEV4dGVudD1bMTQ5OjExIC0gMTQ5OjIzXQogLy8gQ0hFQ0s6IDE0OToyNTogRGVjbFJlZkV4cHI9QVRfZGVzdHJ1Y3RvcjoxODoyMiBFeHRlbnQ9WzE0OToyNSAtIDE0OTozOF0KLS8vIENIRUNLOiAxNTA6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTUwOjExIC0gMTUwOjIzXQorLy8gQ0hFQ0s6IDE1MDoxMTogU3RyaW5nTGl0ZXJhbD0iZm9ybWF0X2FyZyIgRXh0ZW50PVsxNTA6MTEgLSAxNTA6MjNdCiAvLyBDSEVDSzogMTUwOjI1OiBEZWNsUmVmRXhwcj1BVF9mb3JtYXRfYXJnOjE5OjYxIEV4dGVudD1bMTUwOjI1IC0gMTUwOjM4XQotLy8gQ0hFQ0s6IDE1MToxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNTE6MTEgLSAxNTE6MjNdCisvLyBDSEVDSzogMTUxOjExOiBTdHJpbmdMaXRlcmFsPSJnbnVfaW5saW5lIiBFeHRlbnQ9WzE1MToxMSAtIDE1MToyM10KIC8vIENIRUNLOiAxNTE6MjU6IERlY2xSZWZFeHByPUFUX2dudV9pbmxpbmU6MjA6NyBFeHRlbnQ9WzE1MToyNSAtIDE1MTozOF0KLS8vIENIRUNLOiAxNTI6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTUyOjExIC0gMTUyOjI0XQorLy8gQ0hFQ0s6IDE1MjoxMTogU3RyaW5nTGl0ZXJhbD0id2Vha19pbXBvcnQiIEV4dGVudD1bMTUyOjExIC0gMTUyOjI0XQogLy8gQ0hFQ0s6IDE1MjoyNjogRGVjbFJlZkV4cHI9QVRfd2Vha19pbXBvcnQ6MzA6NyBFeHRlbnQ9WzE1MjoyNiAtIDE1Mjo0MF0KLS8vIENIRUNLOiAxNTM6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTUzOjExIC0gMTUzOjIyXQorLy8gQ0hFQ0s6IDE1MzoxMTogU3RyaW5nTGl0ZXJhbD0idmVjcmV0dXJuIiBFeHRlbnQ9WzE1MzoxMSAtIDE1MzoyMl0KIC8vIENIRUNLOiAxNTM6MjQ6IERlY2xSZWZFeHByPUFUX3ZlY3JldHVybjoyODo0MyBFeHRlbnQ9WzE1MzoyNCAtIDE1MzozNl0KLS8vIENIRUNLOiAxNTQ6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTU0OjExIC0gMTU0OjI0XQorLy8gQ0hFQ0s6IDE1NDoxMTogU3RyaW5nTGl0ZXJhbD0idmVjdG9yX3NpemUiIEV4dGVudD1bMTU0OjExIC0gMTU0OjI0XQogLy8gQ0hFQ0s6IDE1NDoyNjogRGVjbFJlZkV4cHI9QVRfdmVjdG9yX3NpemU6Mjg6NTcgRXh0ZW50PVsxNTQ6MjYgLSAxNTQ6NDBdCi0vLyBDSEVDSzogMTU1OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE1NToxMSAtIDE1NToyNF0KKy8vIENIRUNLOiAxNTU6MTE6IFN0cmluZ0xpdGVyYWw9ImNvbnN0cnVjdG9yIiBFeHRlbnQ9WzE1NToxMSAtIDE1NToyNF0KIC8vIENIRUNLOiAxNTU6MjY6IERlY2xSZWZFeHByPUFUX2NvbnN0cnVjdG9yOjE3OjYyIEV4dGVudD1bMTU1OjI2IC0gMTU1OjQwXQotLy8gQ0hFQ0s6IDE1NjoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNTY6MTEgLSAxNTY6MjRdCisvLyBDSEVDSzogMTU2OjExOiBTdHJpbmdMaXRlcmFsPSJ1bmF2YWlsYWJsZSIgRXh0ZW50PVsxNTY6MTEgLSAxNTY6MjRdCiAvLyBDSEVDSzogMTU2OjI2OiBEZWNsUmVmRXhwcj1BVF91bmF2YWlsYWJsZToyODo3IEV4dGVudD1bMTU2OjI2IC0gMTU2OjQwXQotLy8gQ0hFQ0s6IDE1NzoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNTc6MTEgLSAxNTc6MjVdCisvLyBDSEVDSzogMTU3OjExOiBTdHJpbmdMaXRlcmFsPSJvdmVybG9hZGFibGUiIEV4dGVudD1bMTU3OjExIC0gMTU3OjI1XQogLy8gQ0hFQ0s6IDE1NzoyNzogRGVjbFJlZkV4cHI9QVRfb3ZlcmxvYWRhYmxlOjI1OjcgRXh0ZW50PVsxNTc6MjcgLSAxNTc6NDJdCi0vLyBDSEVDSzogMTU4OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE1ODoxMSAtIDE1ODoyNl0KKy8vIENIRUNLOiAxNTg6MTE6IFN0cmluZ0xpdGVyYWw9ImFkZHJlc3Nfc3BhY2UiIEV4dGVudD1bMTU4OjExIC0gMTU4OjI2XQogLy8gQ0hFQ0s6IDE1ODoyODogRGVjbFJlZkV4cHI9QVRfYWRkcmVzc19zcGFjZToxNTo3IEV4dGVudD1bMTU4OjI4IC0gMTU4OjQ0XQotLy8gQ0hFQ0s6IDE1OToxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNTk6MTEgLSAxNTk6MjZdCisvLyBDSEVDSzogMTU5OjExOiBTdHJpbmdMaXRlcmFsPSJhbHdheXNfaW5saW5lIiBFeHRlbnQ9WzE1OToxMSAtIDE1OToyNl0KIC8vIENIRUNLOiAxNTk6Mjg6IERlY2xSZWZFeHByPUFUX2Fsd2F5c19pbmxpbmU6MTU6NDcgRXh0ZW50PVsxNTk6MjggLSAxNTk6NDRdCi0vLyBDSEVDSzogMTYwOjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE2MDoxMSAtIDE2MDoyNl0KLS8vIENIRUNLOiAxNjE6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTYxOjExIC0gMTYxOjI2XQotLy8gQ0hFQ0s6IDE2MjoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNjI6MTEgLSAxNjI6MjddCisvLyBDSEVDSzogMTYwOjExOiBTdHJpbmdMaXRlcmFsPSJyZXR1cm5zX3R3aWNlIiBFeHRlbnQ9WzE2MDoxMSAtIDE2MDoyNl0KKy8vIENIRUNLOiAxNjE6MTE6IFN0cmluZ0xpdGVyYWw9InZlY190eXBlX2hpbnQiIEV4dGVudD1bMTYxOjExIC0gMTYxOjI2XQorLy8gQ0hFQ0s6IDE2MjoxMTogU3RyaW5nTGl0ZXJhbD0ib2JqY19leGNlcHRpb24iIEV4dGVudD1bMTYyOjExIC0gMTYyOjI3XQogLy8gQ0hFQ0s6IDE2MjoyOTogRGVjbFJlZkV4cHI9QVRfb2JqY19leGNlcHRpb246MjI6MzIgRXh0ZW50PVsxNjI6MjkgLSAxNjI6NDZdCi0vLyBDSEVDSzogMTYzOjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE2MzoxMSAtIDE2MzoyOF0KKy8vIENIRUNLOiAxNjM6MTE6IFN0cmluZ0xpdGVyYWw9ImV4dF92ZWN0b3JfdHlwZSIgRXh0ZW50PVsxNjM6MTEgLSAxNjM6MjhdCiAvLyBDSEVDSzogMTYzOjMwOiBEZWNsUmVmRXhwcj1BVF9leHRfdmVjdG9yX3R5cGU6MTk6NyBFeHRlbnQ9WzE2MzozMCAtIDE2Mzo0OF0KLS8vIENIRUNLOiAxNjQ6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTY0OjExIC0gMTY0OjMwXQorLy8gQ0hFQ0s6IDE2NDoxMTogU3RyaW5nTGl0ZXJhbD0idHJhbnNwYXJlbnRfdW5pb24iIEV4dGVudD1bMTY0OjExIC0gMTY0OjMwXQogLy8gQ0hFQ0s6IDE2NDozMjogRGVjbFJlZkV4cHI9QVRfdHJhbnNwYXJlbnRfdW5pb246Mjc6NTcgRXh0ZW50PVsxNjQ6MzIgLSAxNjQ6NTJdCi0vLyBDSEVDSzogMTY1OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE2NToxMSAtIDE2NTozMF0KKy8vIENIRUNLOiAxNjU6MTE6IFN0cmluZ0xpdGVyYWw9ImFuYWx5emVyX25vcmV0dXJuIiBFeHRlbnQ9WzE2NToxMSAtIDE2NTozMF0KIC8vIENIRUNLOiAxNjU6MzI6IERlY2xSZWZFeHByPUFUX2FuYWx5emVyX25vcmV0dXJuOjE2OjcgRXh0ZW50PVsxNjU6MzIgLSAxNjU6NTJdCi0vLyBDSEVDSzogMTY2OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE2NjoxMSAtIDE2NjozMV0KKy8vIENIRUNLOiAxNjY6MTE6IFN0cmluZ0xpdGVyYWw9Indhcm5fdW51c2VkX3Jlc3VsdCIgRXh0ZW50PVsxNjY6MTEgLSAxNjY6MzFdCiAvLyBDSEVDSzogMTY2OjMzOiBEZWNsUmVmRXhwcj1BVF93YXJuX3VudXNlZF9yZXN1bHQ6Mjk6MjIgRXh0ZW50PVsxNjY6MzMgLSAxNjY6NTRdCi0vLyBDSEVDSzogMTY3OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE2NzoxMSAtIDE2NzozMV0KKy8vIENIRUNLOiAxNjc6MTE6IFN0cmluZ0xpdGVyYWw9ImNhcnJpZXNfZGVwZW5kZW5jeSIgRXh0ZW50PVsxNjc6MTEgLSAxNjc6MzFdCiAvLyBDSEVDSzogMTY3OjMzOiBEZWNsUmVmRXhwcj1BVF9jYXJyaWVzX2RlcGVuZGVuY3k6MTc6NyBFeHRlbnQ9WzE2NzozMyAtIDE2Nzo1NF0KLS8vIENIRUNLOiAxNjg6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTY4OjExIC0gMTY4OjM2XQorLy8gQ0hFQ0s6IDE2ODoxMTogU3RyaW5nTGl0ZXJhbD0ibnNfcmV0dXJuc19ub3RfcmV0YWluZWQiIEV4dGVudD1bMTY4OjExIC0gMTY4OjM2XQogLy8gQ0hFQ0s6IDE2ODozODogRGVjbFJlZkV4cHI9QVRfbnNfcmV0dXJuc19ub3RfcmV0YWluZWQ6MjQ6NyBFeHRlbnQ9WzE2ODozOCAtIDE2ODo2NF0KLS8vIENIRUNLOiAxNjk6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTY5OjExIC0gMTY5OjMyXQorLy8gQ0hFQ0s6IDE2OToxMTogU3RyaW5nTGl0ZXJhbD0ibnNfcmV0dXJuc19yZXRhaW5lZCIgRXh0ZW50PVsxNjk6MTEgLSAxNjk6MzJdCiAvLyBDSEVDSzogMTY5OjM0OiBEZWNsUmVmRXhwcj1BVF9uc19yZXR1cm5zX3JldGFpbmVkOjI0OjM1IEV4dGVudD1bMTY5OjM0IC0gMTY5OjU2XQotLy8gQ0hFQ0s6IDE3MDoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNzA6MTEgLSAxNzA6MzZdCisvLyBDSEVDSzogMTcwOjExOiBTdHJpbmdMaXRlcmFsPSJjZl9yZXR1cm5zX25vdF9yZXRhaW5lZCIgRXh0ZW50PVsxNzA6MTEgLSAxNzA6MzZdCiAvLyBDSEVDSzogMTcwOjM4OiBEZWNsUmVmRXhwcj1BVF9jZl9yZXR1cm5zX25vdF9yZXRhaW5lZDoyMzo3IEV4dGVudD1bMTcwOjM4IC0gMTcwOjY0XQotLy8gQ0hFQ0s6IDE3MToxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNzE6MTEgLSAxNzE6MzJdCisvLyBDSEVDSzogMTcxOjExOiBTdHJpbmdMaXRlcmFsPSJjZl9yZXR1cm5zX3JldGFpbmVkIiBFeHRlbnQ9WzE3MToxMSAtIDE3MTozMl0KIC8vIENIRUNLOiAxNzE6MzQ6IERlY2xSZWZFeHByPUFUX2NmX3JldHVybnNfcmV0YWluZWQ6MjM6MzUgRXh0ZW50PVsxNzE6MzQgLSAxNzE6NTZdCi0vLyBDSEVDSzogMTcyOjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE3MjoxMSAtIDE3MjozMF0KKy8vIENIRUNLOiAxNzI6MTE6IFN0cmluZ0xpdGVyYWw9Im93bmVyc2hpcF9yZXR1cm5zIiBFeHRlbnQ9WzE3MjoxMSAtIDE3MjozMF0KIC8vIENIRUNLOiAxNzI6MzI6IERlY2xSZWZFeHByPUFUX293bmVyc2hpcF9yZXR1cm5zOjI1OjQ0IEV4dGVudD1bMTcyOjMyIC0gMTcyOjUyXQotLy8gQ0hFQ0s6IDE3MzoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNzM6MTEgLSAxNzM6MjhdCisvLyBDSEVDSzogMTczOjExOiBTdHJpbmdMaXRlcmFsPSJvd25lcnNoaXBfaG9sZHMiIEV4dGVudD1bMTczOjExIC0gMTczOjI4XQogLy8gQ0hFQ0s6IDE3MzozMDogRGVjbFJlZkV4cHI9QVRfb3duZXJzaGlwX2hvbGRzOjI1OjI0IEV4dGVudD1bMTczOjMwIC0gMTczOjQ4XQotLy8gQ0hFQ0s6IDE3NDoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNzQ6MTEgLSAxNzQ6MjhdCisvLyBDSEVDSzogMTc0OjExOiBTdHJpbmdMaXRlcmFsPSJvd25lcnNoaXBfdGFrZXMiIEV4dGVudD1bMTc0OjExIC0gMTc0OjI4XQogLy8gQ0hFQ0s6IDE3NDozMDogRGVjbFJlZkV4cHI9QVRfb3duZXJzaGlwX3Rha2VzOjI2OjcgRXh0ZW50PVsxNzQ6MzAgLSAxNzQ6NDhdCi0vLyBDSEVDSzogMTc1OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE3NToxMSAtIDE3NTozM10KKy8vIENIRUNLOiAxNzU6MTE6IFN0cmluZ0xpdGVyYWw9InJlcWRfd29ya19ncm91cF9zaXplIiBFeHRlbnQ9WzE3NToxMSAtIDE3NTozM10KIC8vIENIRUNLOiAxNzU6MzU6IERlY2xSZWZFeHByPUFUX3JlcWRfd2dfc2l6ZTozMDoyMyBFeHRlbnQ9WzE3NTozNSAtIDE3NTo1MF0KLS8vIENIRUNLOiAxNzY6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTc2OjExIC0gMTc2OjI2XQorLy8gQ0hFQ0s6IDE3NjoxMTogU3RyaW5nTGl0ZXJhbD0iaW5pdF9wcmlvcml0eSIgRXh0ZW50PVsxNzY6MTEgLSAxNzY6MjZdCiAvLyBDSEVDSzogMTc2OjI4OiBEZWNsUmVmRXhwcj1BVF9pbml0X3ByaW9yaXR5OjMwOjQwIEV4dGVudD1bMTc2OjI4IC0gMTc2OjQ0XQotLy8gQ0hFQ0s6IDE3NzoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNzc6MTEgLSAxNzc6MzVdCisvLyBDSEVDSzogMTc3OjExOiBTdHJpbmdMaXRlcmFsPSJub19pbnN0cnVtZW50X2Z1bmN0aW9uIiBFeHRlbnQ9WzE3NzoxMSAtIDE3NzozNV0KIC8vIENIRUNLOiAxNzc6Mzc6IERlY2xSZWZFeHByPUFUX25vX2luc3RydW1lbnRfZnVuY3Rpb246MjE6MjAgRXh0ZW50PVsxNzc6MzcgLSAxNzc6NjJdCi0vLyBDSEVDSzogMTc4OjExOiBTdHJpbmdMaXRlcmFsPSBFeHRlbnQ9WzE3ODoxMSAtIDE3ODoyMV0KKy8vIENIRUNLOiAxNzg6MTE6IFN0cmluZ0xpdGVyYWw9InRoaXNjYWxsIiBFeHRlbnQ9WzE3ODoxMSAtIDE3ODoyMV0KIC8vIENIRUNLOiAxNzg6MjM6IERlY2xSZWZFeHByPUFUX3RoaXNjYWxsOjI3OjQ0IEV4dGVudD1bMTc4OjIzIC0gMTc4OjM0XQotLy8gQ0hFQ0s6IDE3OToxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxNzk6MTEgLSAxNzk6MTldCisvLyBDSEVDSzogMTc5OjExOiBTdHJpbmdMaXRlcmFsPSJwYXNjYWwiIEV4dGVudD1bMTc5OjExIC0gMTc5OjE5XQogLy8gQ0hFQ0s6IDE3OToyMTogRGVjbFJlZkV4cHI9QVRfcGFzY2FsOjI2OjM4IEV4dGVudD1bMTc5OjIxIC0gMTc5OjMwXQotLy8gQ0hFQ0s6IDE4MDoxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxODA6MTEgLSAxODA6MjBdCisvLyBDSEVDSzogMTgwOjExOiBTdHJpbmdMaXRlcmFsPSJfX2NkZWNsIiBFeHRlbnQ9WzE4MDoxMSAtIDE4MDoyMF0KIC8vIENIRUNLOiAxODA6MjI6IERlY2xSZWZFeHByPUFUX2NkZWNsOjE3OjMwIEV4dGVudD1bMTgwOjIyIC0gMTgwOjMwXQotLy8gQ0hFQ0s6IDE4MToxMTogU3RyaW5nTGl0ZXJhbD0gRXh0ZW50PVsxODE6MTEgLSAxODE6MjJdCisvLyBDSEVDSzogMTgxOjExOiBTdHJpbmdMaXRlcmFsPSJfX3N0ZGNhbGwiIEV4dGVudD1bMTgxOjExIC0gMTgxOjIyXQogLy8gQ0hFQ0s6IDE4MToyNDogRGVjbFJlZkV4cHI9QVRfc3RkY2FsbDoyNzozMiBFeHRlbnQ9WzE4MToyNCAtIDE4MTozNF0KLS8vIENIRUNLOiAxODI6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTgyOjExIC0gMTgyOjIzXQorLy8gQ0hFQ0s6IDE4MjoxMTogU3RyaW5nTGl0ZXJhbD0iX19mYXN0Y2FsbCIgRXh0ZW50PVsxODI6MTEgLSAxODI6MjNdCiAvLyBDSEVDSzogMTgyOjI1OiBEZWNsUmVmRXhwcj1BVF9mYXN0Y2FsbDoxOToyNyBFeHRlbnQ9WzE4MjoyNSAtIDE4MjozNl0KLS8vIENIRUNLOiAxODM6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTgzOjExIC0gMTgzOjIzXQorLy8gQ0hFQ0s6IDE4MzoxMTogU3RyaW5nTGl0ZXJhbD0iX190aGlzY2FsbCIgRXh0ZW50PVsxODM6MTEgLSAxODM6MjNdCiAvLyBDSEVDSzogMTgzOjI1OiBEZWNsUmVmRXhwcj1BVF90aGlzY2FsbDoyNzo0NCBFeHRlbnQ9WzE4MzoyNSAtIDE4MzozNl0KLS8vIENIRUNLOiAxODQ6MTE6IFN0cmluZ0xpdGVyYWw9IEV4dGVudD1bMTg0OjExIC0gMTg0OjIxXQorLy8gQ0hFQ0s6IDE4NDoxMTogU3RyaW5nTGl0ZXJhbD0iX19wYXNjYWwiIEV4dGVudD1bMTg0OjExIC0gMTg0OjIxXQogLy8gQ0hFQ0s6IDE4NDoyMzogRGVjbFJlZkV4cHI9QVRfcGFzY2FsOjI2OjM4IEV4dGVudD1bMTg0OjIzIC0gMTg0OjMyXQpkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9yZW1hcC1jb21wbGV0ZS5jIGIvdGVzdC9JbmRleC9yZW1hcC1jb21wbGV0ZS5jCmluZGV4IDkzZmI2MjMuLmZmYzQ2N2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvSW5kZXgvcmVtYXAtY29tcGxldGUuYworKysgYi90ZXN0L0luZGV4L3JlbWFwLWNvbXBsZXRlLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46IGMtaW5kZXgtdGVzdCAtY29kZS1jb21wbGV0aW9uLWF0PSVzOjY6MiAtcmVtYXAtZmlsZT0iJXM7JVMvSW5wdXRzL3JlbWFwLWNvbXBsZXRlLXRvLmMiICVzIHwgRmlsZUNoZWNrICVzCisvLyBSVU46IGMtaW5kZXgtdGVzdCAtY29kZS1jb21wbGV0aW9uLWF0PSVzOjY6MiAtcmVtYXAtZmlsZT0iJXMsJVMvSW5wdXRzL3JlbWFwLWNvbXBsZXRlLXRvLmMiICVzIHwgRmlsZUNoZWNrICVzCiAKIC8vIENIRUNLOiBGdW5jdGlvbkRlY2w6e1Jlc3VsdFR5cGUgaW50fXtUeXBlZFRleHQgZjB9e0xlZnRQYXJlbiAofQogdm9pZCBmKCkgeyB9CmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L3JlbWFwLWN1cnNvci1hdC5jIGIvdGVzdC9JbmRleC9yZW1hcC1jdXJzb3ItYXQuYwppbmRleCBjMmJlZDBlLi43ODJiNmJiIDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L3JlbWFwLWN1cnNvci1hdC5jCisrKyBiL3Rlc3QvSW5kZXgvcmVtYXAtY3Vyc29yLWF0LmMKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46IGMtaW5kZXgtdGVzdCAtY3Vyc29yLWF0PSVzOjE6MTUgLWN1cnNvci1hdD0lczoyOjIxIC1yZW1hcC1maWxlPSIlczslUy9JbnB1dHMvcmVtYXAtbG9hZC10by5jIiAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiBjLWluZGV4LXRlc3QgLWN1cnNvci1hdD0lczoxOjE1IC1jdXJzb3ItYXQ9JXM6MjoyMSAtcmVtYXAtZmlsZT0iJXMsJVMvSW5wdXRzL3JlbWFwLWxvYWQtdG8uYyIgJXMgfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0s6IFBhcm1EZWNsPXBhcm0xOjE6MTMgKERlZmluaXRpb24pCiAvLyBDSEVDSzogRGVjbFJlZkV4cHI9cGFybTI6MToyNgpkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9yZW1hcC1sb2FkLmMgYi90ZXN0L0luZGV4L3JlbWFwLWxvYWQuYwppbmRleCAyNjA4ODc0Li5mNDMzZmE3IDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L3JlbWFwLWxvYWQuYworKysgYi90ZXN0L0luZGV4L3JlbWFwLWxvYWQuYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogYy1pbmRleC10ZXN0IC10ZXN0LWxvYWQtc291cmNlIGFsbCAtcmVtYXAtZmlsZT0iJXM7JVMvSW5wdXRzL3JlbWFwLWxvYWQtdG8uYyIgJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSyAlcworLy8gUlVOOiBjLWluZGV4LXRlc3QgLXRlc3QtbG9hZC1zb3VyY2UgYWxsIC1yZW1hcC1maWxlPSIlcywlUy9JbnB1dHMvcmVtYXAtbG9hZC10by5jIiAlcyB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLICVzCiAKIC8vIENIRUNLOiByZW1hcC1sb2FkLmM6MTo1OiBGdW5jdGlvbkRlY2w9Zm9vOjE6NSAoRGVmaW5pdGlvbikgRXh0ZW50PVsxOjEgLSAzOjJdCiAvLyBDSEVDSzogcmVtYXAtbG9hZC5jOjE6MTM6IFBhcm1EZWNsPXBhcm0xOjE6MTMgKERlZmluaXRpb24pIEV4dGVudD1bMTo5IC0gMToxOF0KZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvcmVwYXJzZS13aXRoLXJlbWFwcy9yZXBhcnNlLmMgYi90ZXN0L0luZGV4L3JlcGFyc2Utd2l0aC1yZW1hcHMvcmVwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNzYyNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0luZGV4L3JlcGFyc2Utd2l0aC1yZW1hcHMvcmVwYXJzZS5jCkBAIC0wLDAgKzEsOCBAQAorLy8gUlVOOiBlbnYgQ0lOREVYVEVTVF9FRElUSU5HPTEgQ0lOREVYVEVTVF9DT01QTEVUSU9OX0JSSUVGX0NPTU1FTlRTPTEgTElCQ0xBTkdfRElTQUJMRV9DUkFTSF9SRUNPVkVSWT0xIFwKKy8vIFJVTjogICBjLWluZGV4LXRlc3QgLXRlc3QtbG9hZC1zb3VyY2UtcmVwYXJzZSAyIGFsbCAtcmVtYXAtZmlsZS0wPSIlUy90ZXN0LmgsJVMvdGVzdC5oLTAiIC1yZW1hcC1maWxlLTE9IiVTL3Rlc3QuaCwlUy90ZXN0LmgtMSIgLS0gJXMKKworI2luY2x1ZGUgInRlc3QuaCIKKwordm9pZCBmb28oKSB7CisgIGJhcigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9yZXBhcnNlLXdpdGgtcmVtYXBzL3Rlc3QuaCBiL3Rlc3QvSW5kZXgvcmVwYXJzZS13aXRoLXJlbWFwcy90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyYWRiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSW5kZXgvcmVwYXJzZS13aXRoLXJlbWFwcy90ZXN0LmgKQEAgLTAsMCArMSwzIEBACisKKy8vLyBDb21tZW50IGZvciBiYXIKK3ZvaWQgYmFyKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdGVzdC9JbmRleC9yZXBhcnNlLXdpdGgtcmVtYXBzL3Rlc3QuaC0wIGIvdGVzdC9JbmRleC9yZXBhcnNlLXdpdGgtcmVtYXBzL3Rlc3QuaC0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjY2YTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0luZGV4L3JlcGFyc2Utd2l0aC1yZW1hcHMvdGVzdC5oLTAKQEAgLTAsMCArMSw2IEBACit2b2lkIHRlc3QxKHZvaWQpOworCisvLy8gQ29tbWVudCBmb3IgYmFyCit2b2lkIGJhcih2b2lkKTsKK3ZvaWQgdGVzdDModm9pZCk7CisKZGlmZiAtLWdpdCBhL3Rlc3QvSW5kZXgvcmVwYXJzZS13aXRoLXJlbWFwcy90ZXN0LmgtMSBiL3Rlc3QvSW5kZXgvcmVwYXJzZS13aXRoLXJlbWFwcy90ZXN0LmgtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWVkMDFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9JbmRleC9yZXBhcnNlLXdpdGgtcmVtYXBzL3Rlc3QuaC0xCkBAIC0wLDAgKzEsNiBAQAorCit2b2lkIHRlc3QxKHZvaWQpOwordm9pZCB0ZXN0Mih2b2lkKTsKKworLy8vIENvbW1lbnQgZm9yIGJhcgordm9pZCBiYXIodm9pZCk7CmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L3JldGFpbi1jb21tZW50cy1mcm9tLXN5c3RlbS1oZWFkZXJzLmMgYi90ZXN0L0luZGV4L3JldGFpbi1jb21tZW50cy1mcm9tLXN5c3RlbS1oZWFkZXJzLmMKaW5kZXggNjdhMGZkMC4uNDkwNjk5ZCAxMDA2NDQKLS0tIGEvdGVzdC9JbmRleC9yZXRhaW4tY29tbWVudHMtZnJvbS1zeXN0ZW0taGVhZGVycy5jCisrKyBiL3Rlc3QvSW5kZXgvcmV0YWluLWNvbW1lbnRzLWZyb20tc3lzdGVtLWhlYWRlcnMuYwpAQCAtOCwxMiArOCwxNiBAQAogICovCiBpbnQgdXNlcl9mdW5jdGlvbihpbnQgYSk7CiAKKy8vIFJVTjogcm0gLXJmICV0L2NhY2hlCiAvLyBSVU46IGMtaW5kZXgtdGVzdCAtdGVzdC1sb2FkLXNvdXJjZSBhbGwgJXMgLUkgJVMvSW5wdXRzIHwgRmlsZUNoZWNrICVzCiAvLyBSVU46IGMtaW5kZXgtdGVzdCAtdGVzdC1sb2FkLXNvdXJjZSBhbGwgJXMgLWZyZXRhaW4tY29tbWVudHMtZnJvbS1zeXN0ZW0taGVhZGVycyAtSSAlUy9JbnB1dHMgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1DSEVDSy1SRVRBSU4KIAorLy8gTW9kdWxlczoKKy8vIFJVTjogYy1pbmRleC10ZXN0IC10ZXN0LWxvYWQtc291cmNlIGFsbCAlcyAtSSAlUy9JbnB1dHMgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0L2NhY2hlIC1mbW9kdWxlLW1hcC1maWxlPSVTL0lucHV0cy9yZXRhaW4tY29tbWVudHMtZnJvbS1zeXN0ZW0taGVhZGVycy1tb2R1bGUubWFwIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9Q0hFQ0sKKy8vIFJVTjogYy1pbmRleC10ZXN0IC10ZXN0LWxvYWQtc291cmNlIGFsbCAlcyAtZnJldGFpbi1jb21tZW50cy1mcm9tLXN5c3RlbS1oZWFkZXJzIC1JICVTL0lucHV0cyAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQvY2FjaGUgLWZtb2R1bGUtbWFwLWZpbGU9JVMvSW5wdXRzL3JldGFpbi1jb21tZW50cy1mcm9tLXN5c3RlbS1oZWFkZXJzLW1vZHVsZS5tYXAgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1DSEVDSy1SRVRBSU4KKwogLy8gQ0hFQ0s6IHJldGFpbi1jb21tZW50cy1mcm9tLXN5c3RlbS1oZWFkZXJzLmg6Nzo1OiBGdW5jdGlvbkRlY2w9c3lzdGVtX2Z1bmN0aW9uOjc6NSBFeHRlbnQ9Wzc6MSAtIDc6MjddCiAvLyBDSEVDSzogcmV0YWluLWNvbW1lbnRzLWZyb20tc3lzdGVtLWhlYWRlcnMuYzo5OjU6IEZ1bmN0aW9uRGVjbD11c2VyX2Z1bmN0aW9uOjk6NSBSYXdDb21tZW50PVsvKipcbiAqIHVzZXJfZnVuY3Rpb25cbiAqIFxwYXJhbSBhIEFhYS5cbiAqL10gUmF3Q29tbWVudFJhbmdlPVs1OjEgLSA4OjRdIEJyaWVmQ29tbWVudD1bdXNlcl9mdW5jdGlvbl0KIAogLy8gQ0hFQ0stUkVUQUlOOiByZXRhaW4tY29tbWVudHMtZnJvbS1zeXN0ZW0taGVhZGVycy5oOjc6NTogRnVuY3Rpb25EZWNsPXN5c3RlbV9mdW5jdGlvbjo3OjUgUmF3Q29tbWVudD1bLyoqXG4gKiBzeXN0ZW1fZnVuY3Rpb25cbiAqIFxwYXJhbSBhIEFhYS5cbiAqL10gUmF3Q29tbWVudFJhbmdlPVszOjEgLSA2OjRdIEJyaWVmQ29tbWVudD1bc3lzdGVtX2Z1bmN0aW9uXQogLy8gQ0hFQ0stUkVUQUlOOiByZXRhaW4tY29tbWVudHMtZnJvbS1zeXN0ZW0taGVhZGVycy5jOjk6NTogRnVuY3Rpb25EZWNsPXVzZXJfZnVuY3Rpb246OTo1IFJhd0NvbW1lbnQ9Wy8qKlxuICogdXNlcl9mdW5jdGlvblxuICogXHBhcmFtIGEgQWFhLlxuICovXSBSYXdDb21tZW50UmFuZ2U9WzU6MSAtIDg6NF0gQnJpZWZDb21tZW50PVt1c2VyX2Z1bmN0aW9uXQotCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L3NraXBwZWQtcmFuZ2VzLmMgYi90ZXN0L0luZGV4L3NraXBwZWQtcmFuZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxNmZiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSW5kZXgvc2tpcHBlZC1yYW5nZXMuYwpAQCAtMCwwICsxLDI1IEBACisjZGVmaW5lIGNvb2wKKworI2lmIGRlZmluZWQoY29vbCkKKworI2lmIGRlZmluZWQocmVhbGx5X2Nvb2wpCisjZW5kaWYgLy8gcmVhbGx5X2Nvb2wKKworI2VsaWYgZGVmaW5lZChob3QpCisvLyBob3QKKworCisjZW5kaWYgLy8gdHJhaWxpbmcgY29tbWVudAorCisjaWZuZGVmIGNvb2wKKyNpZm5kZWYgdW5jb29sCisKK2ludCBwcm9iYWJseV9ob3QgPSAxOworCisjZW5kaWYgLy8gdW5jb29sCisjZW5kaWYgLy8gY29vbAorCisvLyBSVU46IGVudiBDSU5ERVhURVNUX1NIT1dfU0tJUFBFRF9SQU5HRVM9MSBjLWluZGV4LXRlc3QgLXRlc3QtYW5ub3RhdGUtdG9rZW5zPSVzOjE6MToxNjoxICVzIHwgRmlsZUNoZWNrICVzCisvLyBDSEVDSzogU2tpcHBpbmc6IFs1OjIgLSA2OjddCisvLyBDSEVDSzogU2tpcHBpbmc6IFs4OjIgLSAxMjo3XQorLy8gQ0hFQ0s6IFNraXBwaW5nOiBbMTQ6MiAtIDIwOjddCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L3VzcnMuY3BwIGIvdGVzdC9JbmRleC91c3JzLmNwcAppbmRleCBlMzUwZjVjLi45MDljZTc1IDEwMDY0NAotLS0gYS90ZXN0L0luZGV4L3VzcnMuY3BwCisrKyBiL3Rlc3QvSW5kZXgvdXNycy5jcHAKQEAgLTg1LDcgKzg1LDcgQEAKIC8vIENIRUNLOiB1c3JzLmNwcCBjOkBOQGZvb0BGQGJhciNJIyBFeHRlbnQ9WzM6MyAtIDM6MThdCiAvLyBDSEVDSzogdXNycy5jcHAgYzp1c3JzLmNwcEAzNkBOQGZvb0BGQGJhciNJI0B6IEV4dGVudD1bMzoxMiAtIDM6MTddCiAvLyBDSEVDSzogdXNycy5jcHAgYzpATkBiYXIgRXh0ZW50PVs1OjEgLSA4OjJdCi0vLyBDSEVDSzogdXNycy5jcHAgYzp1c3JzLmNwcEA2NEBOQGJhckBUQFFUeXBlIEV4dGVudD1bNjozIC0gNjoyMF0KKy8vIENIRUNLOiB1c3JzLmNwcCBjOnVzcnMuY3BwQE5AYmFyQFRAUVR5cGUgRXh0ZW50PVs2OjMgLSA2OjIwXQogLy8gQ0hFQ0s6IHVzcnMuY3BwIGM6QE5AYmFyQEZAYmFyI0kjIEV4dGVudD1bNzozIC0gNzoyMF0KIC8vIENIRUNLOiB1c3JzLmNwcCBjOnVzcnMuY3BwQDk0QE5AYmFyQEZAYmFyI0kjQHogRXh0ZW50PVs3OjEyIC0gNzoxOV0KIC8vIENIRUNLOiB1c3JzLmNwcCBjOkBDQENsc0EgRXh0ZW50PVsxMDoxIC0gMTQ6Ml0KQEAgLTEwMSwxMyArMTAxLDEzIEBACiAvLyBDSEVDSzogdXNycy5jcHAgYzpATkBmb29AQ0BDbHNCQEZAQ2xzQiMgRXh0ZW50PVsxOTo1IC0gMTk6MjddCiAvLyBDSEVDSzogdXNycy5jcHAgYzpATkBmb29AQ0BDbHNCQEZAcmVzdWx0IzEgRXh0ZW50PVsyMDo1IC0gMjA6MjNdCiAvLyBDSEVDSzogdXNycy5jcHAgYzpATkBmb29AQ0BDbHNCQEZAcmVzdWx0IzEgRXh0ZW50PVsyNDoxIC0gMjY6Ml0KLS8vIENIRUNLOiB1c3JzLmNwcCBjOnVzcnMuY3BwQDM2MEBhTkBDQENsc0MgRXh0ZW50PVsyOTozIC0gMjk6MzVdCi0vLyBDSEVDSzogdXNycy5jcHAgYzp1c3JzLmNwcEAzOTZAYU5AdyBFeHRlbnQ9WzMwOjMgLSAzMDo4XQorLy8gQ0hFQ0s6IHVzcnMuY3BwIGM6dXNycy5jcHBAYU5AQ0BDbHNDIEV4dGVudD1bMjk6MyAtIDI5OjM1XQorLy8gQ0hFQ0s6IHVzcnMuY3BwIGM6dXNycy5jcHBAYU5AdyBFeHRlbnQ9WzMwOjMgLSAzMDo4XQogLy8gQ0hFQ0s6IHVzcnMuY3BwIGM6QHogRXh0ZW50PVszMzoxIC0gMzM6Nl0KIC8vIENIRUNLOiB1c3JzLmNwcCBjOkBOQGZvbyBFeHRlbnQ9WzM1OjEgLSA0MDoyXQogLy8gQ0hFQ0s6IHVzcnMuY3BwIGM6QE5AZm9vQE5AdGF6IEV4dGVudD1bMzU6MTcgLSAzOToyXQogLy8gQ0hFQ0s6IHVzcnMuY3BwIGM6QE5AZm9vQE5AdGF6QHggRXh0ZW50PVszNjozIC0gMzY6OF0KLS8vIENIRUNLOiB1c3JzLmNwcCBjOnVzcnMuY3BwQDQ1N0BOQGZvb0BOQHRhekBGQGFkZCNJI0kjIEV4dGVudD1bMzc6MyAtIDM3OjU2XQorLy8gQ0hFQ0s6IHVzcnMuY3BwIGM6dXNycy5jcHBATkBmb29ATkB0YXpARkBhZGQjSSNJIyBFeHRlbnQ9WzM3OjMgLSAzNzo1Nl0KIC8vIENIRUNLOiB1c3JzLmNwcCBjOnVzcnMuY3BwQDQ3OUBOQGZvb0BOQHRhekBGQGFkZCNJI0kjQGEgRXh0ZW50PVszNzoyNSAtIDM3OjMwXQogLy8gQ0hFQ0s6IHVzcnMuY3BwIGM6dXNycy5jcHBANDg2QE5AZm9vQE5AdGF6QEZAYWRkI0kjSSNAYiBFeHRlbnQ9WzM3OjMyIC0gMzc6MzddCiAvLyBDSEVDSzogdXNycy5jcHAgYzpATkBmb29ATkB0YXpARkBzdWIjSSNJIyBFeHRlbnQ9WzM4OjMgLSAzODoyNV0KQEAgLTEzNywxMCArMTM3LDEwIEBACiAvLyBDSEVDSy1OT1Q6IENsc0IKIC8vIENIRUNLOiB1c3JzLmNwcCBjOkBOQUBmb29fYWxpYXMzCiAvLyBDSEVDSzogdXNycy5jcHAgYzpAYU4gRXh0ZW50PVs2ODoxIC0gNzM6Ml0KLS8vIENIRUNLOiB1c3JzLmNwcCBjOnVzcnMuY3BwQDEwOTdAYU5AQ0BSRGFyOTM3MTc2M19Gb28gRXh0ZW50PVs2OToxIC0gNzI6Ml0KKy8vIENIRUNLOiB1c3JzLmNwcCBjOnVzcnMuY3BwQGFOQENAUkRhcjkzNzE3NjNfRm9vIEV4dGVudD1bNjk6MSAtIDcyOjJdCiAvLyBDSEVDSzogdXNycy5jcHAgYzogRXh0ZW50PVs3MDoxIC0gNzA6OF0KLS8vIENIRUNLOiB1c3JzLmNwcCBjOnVzcnMuY3BwQDExMzFAYU5AQ0BSRGFyOTM3MTc2M19Gb29ARkBiYXIjIEV4dGVudD1bNzE6MyAtIDcxOjEzXQotLy8gQ0hFQ0s6IHVzcnMuY3BwIGM6dXNycy5jcHBAMTEzMUBhTkBDQFJEYXI5MzcxNzYzX0Zvb0BGQGJhciMgRXh0ZW50PVs3NToxIC0gNzU6MzFdCisvLyBDSEVDSzogdXNycy5jcHAgYzp1c3JzLmNwcEBhTkBDQFJEYXI5MzcxNzYzX0Zvb0BGQGJhciMgRXh0ZW50PVs3MTozIC0gNzE6MTNdCisvLyBDSEVDSzogdXNycy5jcHAgYzp1c3JzLmNwcEBhTkBDQFJEYXI5MzcxNzYzX0Zvb0BGQGJhciMgRXh0ZW50PVs3NToxIC0gNzU6MzFdCiAvLyBDSEVDSzogdXNycy5jcHAgYzpARkByZGFyOTM3MTc2MyMgRXh0ZW50PVs3NzoxIC0gODA6Ml0KIC8vIENIRUNLOiB1c3JzLmNwcCBjOnVzcnMuY3BwQDEyMDRARkByZGFyOTM3MTc2MyNAZm9vIEV4dGVudD1bNzg6MyAtIDc4OjIyXQogCmRpZmYgLS1naXQgYS90ZXN0L0luZGV4L3VzcnMubSBiL3Rlc3QvSW5kZXgvdXNycy5tCmluZGV4IGNjMmUwZmQuLmZjM2ZiYzkgMTAwNjQ0Ci0tLSBhL3Rlc3QvSW5kZXgvdXNycy5tCisrKyBiL3Rlc3QvSW5kZXgvdXNycy5tCkBAIC04OSwyMCArODksMzcgQEAKIC0oaW50KW1ldGhvZFdpdGhGbjoodm9pZCAoKikoaW50ICpwKSlmbjsKIEBlbmQKIAotLy8gUlVOOiBjLWluZGV4LXRlc3QgLXRlc3QtbG9hZC1zb3VyY2UtdXNycyBhbGwgLXRhcmdldCB4ODZfNjQtYXBwbGUtbWFjb3N4MTAuNyAlcyB8IEZpbGVDaGVjayAlcwotLy8gQ0hFQ0s6IHVzcnMubSBjOnVzcnMubUA2N0BGQG15X2hlbHBlciBFeHRlbnQ9WzM6MSAtIDM6NjBdCisjaW5jbHVkZSA8dXNycy1zeXN0ZW0uaD4KKworI2RlZmluZSBNQUNSTzEgMTIzCisKKyNkZWZpbmUgTUFDUk8yIDEyMworI3VuZGVmIE1BQ1JPMgorI2RlZmluZSBNQUNSTzIgNzg5CisKKyNkZWZpbmUgTUFDUk8zKFgpIDEyMywgWAorI2RlZmluZSBNQUNSTzMoWCkgNzg5LCBYCisKKy8vIFJVTjogYy1pbmRleC10ZXN0IC10ZXN0LWxvYWQtc291cmNlLXVzcnMgYWxsIC10YXJnZXQgeDg2XzY0LWFwcGxlLW1hY29zeDEwLjcgJXMgLWlzeXN0ZW0gJVMvSW5wdXRzIHwgRmlsZUNoZWNrICVzCisvLyBDSEVDSzogdXNycy1zeXN0ZW0uaCBjOkBtYWNyb0BNQUNST19GUk9NX1NZU1RFTV9IRUFERVJfMSBFeHRlbnQ9WzE6OSAtIDE6NDBdCisvLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQDEyNjVAbWFjcm9ATUFDUk8xIEV4dGVudD1bOTQ6OSAtIDk0OjE5XQorLy8gQ0hFQ0s6IHVzcnMubSBjOnVzcnMubUAxMjg1QG1hY3JvQE1BQ1JPMiBFeHRlbnQ9Wzk2OjkgLSA5NjoxOV0KKy8vIENIRUNLOiB1c3JzLm0gYzp1c3JzLm1AMTMxOEBtYWNyb0BNQUNSTzIgRXh0ZW50PVs5ODo5IC0gOTg6MTldCisvLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQDEzMzhAbWFjcm9ATUFDUk8zIEV4dGVudD1bMTAwOjkgLSAxMDA6MjVdCisvLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQDEzNjNAbWFjcm9ATUFDUk8zIEV4dGVudD1bMTAxOjkgLSAxMDE6MjVdCisvLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQEZAbXlfaGVscGVyIEV4dGVudD1bMzoxIC0gMzo2MF0KIC8vIENIRUNLOiB1c3JzLm0gYzp1c3JzLm1AOTVARkBteV9oZWxwZXJAeCBFeHRlbnQ9WzM6MjkgLSAzOjM0XQogLy8gQ0hFQ0s6IHVzcnMubSBjOnVzcnMubUAxMDJARkBteV9oZWxwZXJAeSBFeHRlbnQ9WzM6MzYgLSAzOjQxXQotLy8gQ0hFQ0s6IHVzcnMubSBjOnVzcnMubUAxMjhARWEgRXh0ZW50PVs1OjEgLSA4OjJdCi0vLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQDEyOEBFYUBBQkEgRXh0ZW50PVs2OjMgLSA2OjZdCi0vLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQDEyOEBFYUBDQURBQkEgRXh0ZW50PVs3OjMgLSA3OjldCi0vLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQDE1NUBFYSBFeHRlbnQ9WzEwOjEgLSAxMzoyXQotLy8gQ0hFQ0s6IHVzcnMubSBjOnVzcnMubUAxNTVARWFARk9PIEV4dGVudD1bMTE6MyAtIDExOjZdCi0vLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQDE1NUBFYUBCQVIgRXh0ZW50PVsxMjozIC0gMTI6Nl0KKy8vIENIRUNLOiB1c3JzLm0gYzp1c3JzLm1ARWEgRXh0ZW50PVs1OjEgLSA4OjJdCisvLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQEVhQEFCQSBFeHRlbnQ9WzY6MyAtIDY6Nl0KKy8vIENIRUNLOiB1c3JzLm0gYzp1c3JzLm1ARWFAQ0FEQUJBIEV4dGVudD1bNzozIC0gNzo5XQorLy8gQ0hFQ0s6IHVzcnMubSBjOnVzcnMubUBFYSBFeHRlbnQ9WzEwOjEgLSAxMzoyXQorLy8gQ0hFQ0s6IHVzcnMubSBjOnVzcnMubUBFYUBGT08gRXh0ZW50PVsxMTozIC0gMTE6Nl0KKy8vIENIRUNLOiB1c3JzLm0gYzp1c3JzLm1ARWFAQkFSIEV4dGVudD1bMTI6MyAtIDEyOjZdCiAvLyBDSEVDSzogdXNycy5tIGM6QFNBQE15U3RydWN0IEV4dGVudD1bMTU6OSAtIDE4OjJdCiAvLyBDSEVDSzogdXNycy5tIGM6QFNBQE15U3RydWN0QEZJQHdhIEV4dGVudD1bMTY6MyAtIDE2OjldCiAvLyBDSEVDSzogdXNycy5tIGM6QFNBQE15U3RydWN0QEZJQG1vbyBFeHRlbnQ9WzE3OjMgLSAxNzoxMF0KLS8vIENIRUNLOiB1c3JzLm0gYzp1c3JzLm1AMTc5QFRATXlTdHJ1Y3QgRXh0ZW50PVsxNToxIC0gMTg6MTFdCisvLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQFRATXlTdHJ1Y3QgRXh0ZW50PVsxNToxIC0gMTg6MTFdCiAvLyBDSEVDSzogdXNycy5tIGM6QEVAUGl6emEgRXh0ZW50PVsyMDoxIC0gMjM6Ml0KIC8vIENIRUNLOiB1c3JzLm0gYzpARUBQaXp6YUBDSEVFU0UgRXh0ZW50PVsyMTozIC0gMjE6OV0KIC8vIENIRUNLOiB1c3JzLm0gYzpARUBQaXp6YUBNVVNIUk9PTVMgRXh0ZW50PVsyMjozIC0gMjI6MTJdCkBAIC0xMjMsNyArMTQwLDcgQEAKIC8vIENIRUNLOiB1c3JzLm0gYzp1c3JzLm1ANDcwb2JqYyhjcylGb28oY20pa2luZ2tvbmdAbG9jYWxfdmFyIEV4dGVudD1bNDE6MyAtIDQxOjE2XQogLy8gQ0hFQ0s6IHVzcnMubSBjOm9iamMoY3MpRm9vKHB5KWQxIEV4dGVudD1bNDQ6MSAtIDQ0OjE1XQogLy8gQ0hFQ0s6IHVzcnMubSBjOkB6IEV4dGVudD1bNDc6MSAtIDQ3OjZdCi0vLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQDUyOUBGQGxvY2FsX2Z1bmMgRXh0ZW50PVs0OToxIC0gNDk6NDNdCisvLyBDSEVDSzogdXNycy5tIGM6dXNycy5tQEZAbG9jYWxfZnVuYyBFeHRlbnQ9WzQ5OjEgLSA0OTo0M10KIC8vIENIRUNLOiB1c3JzLm0gYzp1c3JzLm1ANTUxQEZAbG9jYWxfZnVuY0B4IEV4dGVudD1bNDk6MjMgLSA0OToyOF0KIC8vIENIRUNLOiB1c3JzLm0gYzpvYmpjKGNzKUNXaXRoRXh0IEV4dGVudD1bNTE6MSAtIDUzOjVdCiAvLyBDSEVDSzogdXNycy5tIGM6b2JqYyhjcylDV2l0aEV4dChpbSltZXRoMSBFeHRlbnQ9WzUyOjEgLSA1MjoxNF0KQEAgLTE1Myw3ICsxNzAsMTMgQEAKIC8vIENIRUNLOiB1c3JzLm0gYzpvYmpjKGNzKUNXaXRoRXh0MihpbSlwcm9fZXh0IEV4dGVudD1bODg6MjMgLSA4ODozMF0KIC8vIENIRUNLOiB1c3JzLm0gYzpvYmpjKGNzKUNXaXRoRXh0MihpbSlzZXRQcm9fZXh0OiBFeHRlbnQ9Wzg4OjIzIC0gODg6MzBdCiAKLS8vIFJVTjogYy1pbmRleC10ZXN0IC10ZXN0LWxvYWQtc291cmNlIGFsbCAlcyB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLXNvdXJjZSAlcworLy8gUlVOOiBjLWluZGV4LXRlc3QgLXRlc3QtbG9hZC1zb3VyY2UgYWxsICVzIC1pc3lzdGVtICVTL0lucHV0cyB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLXNvdXJjZSAlcworLy8gQ0hFQ0stc291cmNlOiB1c3JzLXN5c3RlbS5oOjE6OTogbWFjcm8gZGVmaW5pdGlvbj1NQUNST19GUk9NX1NZU1RFTV9IRUFERVJfMSBFeHRlbnQ9WzE6OSAtIDE6NDBdCisvLyBDSEVDSy1zb3VyY2U6IHVzcnMubTo5NDo5OiBtYWNybyBkZWZpbml0aW9uPU1BQ1JPMSBFeHRlbnQ9Wzk0OjkgLSA5NDoxOV0KKy8vIENIRUNLLXNvdXJjZTogdXNycy5tOjk2Ojk6IG1hY3JvIGRlZmluaXRpb249TUFDUk8yIEV4dGVudD1bOTY6OSAtIDk2OjE5XQorLy8gQ0hFQ0stc291cmNlOiB1c3JzLm06OTg6OTogbWFjcm8gZGVmaW5pdGlvbj1NQUNSTzIgRXh0ZW50PVs5ODo5IC0gOTg6MTldCisvLyBDSEVDSy1zb3VyY2U6IHVzcnMubToxMDA6OTogbWFjcm8gZGVmaW5pdGlvbj1NQUNSTzMgRXh0ZW50PVsxMDA6OSAtIDEwMDoyNV0KKy8vIENIRUNLLXNvdXJjZTogdXNycy5tOjEwMTo5OiBtYWNybyBkZWZpbml0aW9uPU1BQ1JPMyBFeHRlbnQ9WzEwMTo5IC0gMTAxOjI1XQogLy8gQ0hFQ0stc291cmNlOiB1c3JzLm06MzoxOTogRnVuY3Rpb25EZWNsPW15X2hlbHBlcjozOjE5IChEZWZpbml0aW9uKSBFeHRlbnQ9WzM6MSAtIDM6NjBdCiAvLyBDSEVDSy1zb3VyY2U6IHVzcnMubTozOjMzOiBQYXJtRGVjbD14OjM6MzMgKERlZmluaXRpb24pIEV4dGVudD1bMzoyOSAtIDM6MzRdCiAvLyBDSEVDSy1zb3VyY2U6IHVzcnMubTozOjQwOiBQYXJtRGVjbD15OjM6NDAgKERlZmluaXRpb24pIEV4dGVudD1bMzozNiAtIDM6NDFdCkBAIC0yNTgsOSArMjgxLDkgQEAKIC8vIENIRUNLLXNvdXJjZTogdXNycy5tOjY5OjIzOiBVbmV4cG9zZWRFeHByPSBFeHRlbnQ9WzY5OjIzIC0gNjk6MjRdCiAvLyBDSEVDSy1zb3VyY2U6IHVzcnMubTo2OToyMzogSW50ZWdlckxpdGVyYWw9IEV4dGVudD1bNjk6MjMgLSA2OToyNF0KIC8vIENIRUNLLXNvdXJjZTogdXNycy5tOjcyOjY6IEZ1bmN0aW9uRGVjbD1hdXhfMTo3Mjo2IEV4dGVudD1bNzI6MSAtIDcyOjI2XQotLy8gQ0hFQ0stc291cmNlOiB1c3JzLm06NzI6MTU6IFBhcm1EZWNsPTo3MjoxNSAoRGVmaW5pdGlvbikgRXh0ZW50PVs3MjoxMiAtIDcyOjE2XQotLy8gQ0hFQ0stc291cmNlOiB1c3JzLm06NzI6MjA6IFBhcm1EZWNsPTo3MjoyMCAoRGVmaW5pdGlvbikgRXh0ZW50PVs3MjoxNyAtIDcyOjIxXQotLy8gQ0hFQ0stc291cmNlOiB1c3JzLm06NzI6MjU6IFBhcm1EZWNsPTo3MjoyNSAoRGVmaW5pdGlvbikgRXh0ZW50PVs3MjoyMiAtIDcyOjI2XQorLy8gQ0hFQ0stc291cmNlOiB1c3JzLm06NzI6MTU6IFBhcm1EZWNsPTo3MjoxNSAoRGVmaW5pdGlvbikgRXh0ZW50PVs3MjoxMiAtIDcyOjE1XQorLy8gQ0hFQ0stc291cmNlOiB1c3JzLm06NzI6MjA6IFBhcm1EZWNsPTo3MjoyMCAoRGVmaW5pdGlvbikgRXh0ZW50PVs3MjoxNyAtIDcyOjIwXQorLy8gQ0hFQ0stc291cmNlOiB1c3JzLm06NzI6MjU6IFBhcm1EZWNsPTo3MjoyNSAoRGVmaW5pdGlvbikgRXh0ZW50PVs3MjoyMiAtIDcyOjI1XQogLy8gQ0hFQ0stc291cmNlOiB1c3JzLm06NzM6NTogRnVuY3Rpb25EZWNsPXRlc3RfbXVsdGlfZGVjbGFyYXRpb246NzM6NSAoRGVmaW5pdGlvbikgRXh0ZW50PVs3MzoxIC0gNzc6Ml0KIC8vIENIRUNLLXNvdXJjZTogdXNycy5tOjczOjM0OiBDb21wb3VuZFN0bXQ9IEV4dGVudD1bNzM6MzQgLSA3NzoyXQogLy8gQ0hFQ0stc291cmNlOiB1c3JzLm06NzQ6MzogRGVjbFN0bXQ9IEV4dGVudD1bNzQ6MyAtIDc0OjMzXQpkaWZmIC0tZ2l0IGEvdGVzdC9MYXlvdXQvbXMteDg2LWFsaWFzLWF2b2lkYW5jZS1wYWRkaW5nLmNwcCBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1hbGlhcy1hdm9pZGFuY2UtcGFkZGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjNjUyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1hbGlhcy1hdm9pZGFuY2UtcGFkZGluZy5jcHAKQEAgLTAsMCArMSwzMDggQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAlcyAyPi9kZXYvbnVsbCBcCisvLyBSVU46ICAgICAgICAgICAgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgeDg2XzY0LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5ICVzIDI+L2Rldi9udWxsIFwKKy8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IENIRUNLLVg2NAorCitleHRlcm4gIkMiIGludCBwcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pOworX19kZWNsc3BlYyhhbGlnbig0MDk2KSkgY2hhciBidWZmZXJbNDA5Nl07CisKK3N0cnVjdCBBVCB7fTsKKworc3RydWN0IFYgOiBBVCB7CisJY2hhciBjOworCVYoKSB7CisJCXByaW50ZigiViAgIC0gdGhpczogJWRcbiIsIChpbnQpKChjaGFyKil0aGlzIC0gYnVmZmVyKSk7CisJfQorfTsKKworc3RydWN0IEFUMCB7CisJdW5pb24geyBzdHJ1Y3QgeyBpbnQgYTsgQVQgdDsgfSB5OyBpbnQgYjsgfSB4OworCWNoYXIgYzsKKwlBVDAoKSB7CisJCXByaW50ZigiQVQwIC0gdGhpczogJWRcbiIsIChpbnQpKChjaGFyKil0aGlzIC0gYnVmZmVyKSk7CisJfQorfTsKKworc3RydWN0IEFUMSA6IFYgeworCWludCBhOworCUFUMSgpIHsKKwkJcHJpbnRmKCJBVDEgLSB0aGlzOiAlZFxuIiwgKGludCkoKGNoYXIqKXRoaXMgLSBidWZmZXIpKTsKKwl9Cit9OworCitzdHJ1Y3QgQVQyIHsKKwlBVDAgdDsKKwljaGFyIEFUMkZpZWxkTmFtZTA7CisJQVQyKCkgeworCQlwcmludGYoIkFUMiAtIHRoaXM6ICVkXG4iLCAoaW50KSgoY2hhciopdGhpcyAtIGJ1ZmZlcikpOworCQlwcmludGYoIkFUMiAtIEZpZWw6ICVkXG4iLCAoaW50KSgoY2hhciopJkFUMkZpZWxkTmFtZTAgLSBidWZmZXIpKTsKKwl9Cit9OworCitzdHJ1Y3QgQVQzIDogQVQyLCBBVDEgeworCUFUMygpIHsKKwkJcHJpbnRmKCJBVDMgLSB0aGlzOiAlZFxuIiwgKGludCkoKGNoYXIqKXRoaXMgLSBidWZmZXIpKTsKKwl9Cit9OworCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBBVDMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBBVDIgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIHN0cnVjdCBBVDAgdAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAgIHVuaW9uIEFUMDo6KGFub255bW91cyBhdCB7ey4qfX0geAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAgICAgc3RydWN0IEFUMDo6KGFub255bW91cyBhdCB7ey4qfX0geQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAgICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICAgICAgICBzdHJ1Y3QgQVQgdCAoZW1wdHkpCisvLyBDSEVDSzogICAgICAgICAwIHwgICAgICAgICBpbnQgYgorLy8gQ0hFQ0s6ICAgICAgICAgOCB8ICAgICAgIGNoYXIgYworLy8gQ0hFQ0s6ICAgICAgICAxMiB8ICAgICBjaGFyIEFUMkZpZWxkTmFtZTAKKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgIHN0cnVjdCBBVDEgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICAgIHN0cnVjdCBWIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgICAgIHN0cnVjdCBBVCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgICAgIGNoYXIgYworLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjgsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTI4LCBudmFsaWduPTRdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBVDMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQVQyIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgc3RydWN0IEFUMCB0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAgIHVuaW9uIEFUMDo6KGFub255bW91cyBhdCB7ey4qfX0geAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgICAgIHN0cnVjdCBBVDA6Oihhbm9ueW1vdXMgYXQge3suKn19IHkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgICAgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgNCB8ICAgICAgICAgICBzdHJ1Y3QgQVQgdCAoZW1wdHkpCisvLyBDSEVDSy1YNjQ6ICAgICAgICAgMCB8ICAgICAgICAgaW50IGIKKy8vIENIRUNLLVg2NDogICAgICAgICA4IHwgICAgICAgY2hhciBjCisvLyBDSEVDSy1YNjQ6ICAgICAgICAxMiB8ICAgICBjaGFyIEFUMkZpZWxkTmFtZTAKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDIwIHwgICBzdHJ1Y3QgQVQxIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjAgfCAgICAgc3RydWN0IFYgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyMCB8ICAgICAgIHN0cnVjdCBBVCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjAgfCAgICAgICBjaGFyIGMKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjgsIGFsaWduPTQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yOCwgbnZhbGlnbj00XQorCitzdHJ1Y3QgQlQwIHsKKwlCVDAoKSB7CisJCXByaW50ZigiQlQwIC0gdGhpczogJWRcbiIsIChpbnQpKChjaGFyKil0aGlzIC0gYnVmZmVyKSk7CisJfQorfTsKKworc3RydWN0IEJUMiA6IEJUMCB7CisJY2hhciBCVDJGaWVsZE5hbWUwOworCUJUMigpIHsKKwkJcHJpbnRmKCJCVDIgLSB0aGlzOiAlZFxuIiwgKGludCkoKGNoYXIqKXRoaXMgLSBidWZmZXIpKTsKKwkJcHJpbnRmKCJCVDIgLSBGaWVsOiAlZFxuIiwgKGludCkoKGNoYXIqKSZCVDJGaWVsZE5hbWUwIC0gYnVmZmVyKSk7CisJfQorfTsKKworc3RydWN0IEJUMyA6IEJUMCwgQlQyIHsKKwlCVDMoKSB7CisJCXByaW50ZigiQlQzIC0gdGhpczogJWRcbiIsIChpbnQpKChjaGFyKil0aGlzIC0gYnVmZmVyKSk7CisJfQorfTsKKworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBCVDMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCVDAgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDEgfCAgIHN0cnVjdCBCVDIgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAxIHwgICAgIHN0cnVjdCBCVDAgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDEgfCAgICAgY2hhciBCVDJGaWVsZE5hbWUwCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0yLCBhbGlnbj0xCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0yLCBudmFsaWduPTFdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBCVDMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQlQwIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMSB8ICAgc3RydWN0IEJUMiAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAxIHwgICAgIHN0cnVjdCBCVDAgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAxIHwgICAgIGNoYXIgQlQyRmllbGROYW1lMAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTIsIGFsaWduPTEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yLCBudmFsaWduPTFdCisKK3N0cnVjdCBUMCA6IEFUIHsKKwlUMCgpIHsKKwkJcHJpbnRmKCJUMCAodGhpcykgOiAlZFxuIiwgKGludCkoKGNoYXIqKXRoaXMgLSBidWZmZXIpKTsKKwl9Cit9OworCitzdHJ1Y3QgVDEgOiBUMCB7CisJY2hhciBhOworCVQxKCkgeworCQlwcmludGYoIlQxICh0aGlzKSA6ICVkXG4iLCAoaW50KSgoY2hhciopdGhpcyAtIGJ1ZmZlcikpOworCQlwcmludGYoIlQxIChmaWVsKSA6ICVkXG4iLCAoaW50KSgoY2hhciopJmEgLSBidWZmZXIpKTsKKwl9Cit9OworCitzdHJ1Y3QgVDIgOiBBVCB7CisJY2hhciBhOworCVQyKCkgeworCQlwcmludGYoIlQyICh0aGlzKSA6ICVkXG4iLCAoaW50KSgoY2hhciopdGhpcyAtIGJ1ZmZlcikpOworCQlwcmludGYoIlQyIChmaWVsKSA6ICVkXG4iLCAoaW50KSgoY2hhciopJmEgLSBidWZmZXIpKTsKKwl9Cit9OworCitzdHJ1Y3QgX19kZWNsc3BlYyhhbGlnbigxKSkgVDMgOiB2aXJ0dWFsIFQxLCB2aXJ0dWFsIFQyIHsKKwlUMygpIHsKKwkJcHJpbnRmKCJUMyAodGhpcykgOiAlZFxuIiwgKGludCkoKGNoYXIqKXRoaXMgLSBidWZmZXIpKTsKKwl9Cit9OworCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVDMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChUMyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBzdHJ1Y3QgVDEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgc3RydWN0IFQwIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgICAgc3RydWN0IEFUIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IFQyICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICAgIHN0cnVjdCBBVCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00LCBudmFsaWduPTRdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBUMworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChUMyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgc3RydWN0IFQxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgICBzdHJ1Y3QgVDAgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgICAgc3RydWN0IEFUIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgVDIgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIHN0cnVjdCBBVCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPThdCisKK3N0cnVjdCBCIHt9Oworc3RydWN0IEMgeyBpbnQgYTsgfTsKK3N0cnVjdCBEIDogQiwgdmlydHVhbCBDIHsgQiBiOyB9Oworc3RydWN0IEUgOiBELCBCIHt9OworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEUKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBEIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICBzdHJ1Y3QgQiAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAoRCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIHN0cnVjdCBCIGIgKGVtcHR5KQorLy8gQ0hFQ0s6ICAgICAgICAgOCB8ICAgc3RydWN0IEIgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBDICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMCB8IHN0cnVjdCBFCisvLyBDSEVDSy1YNjQtTkVYVDogICAwIHwgICBzdHJ1Y3QgRCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDggfCAgICAgc3RydWN0IEIgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDAgfCAgICAgKEQgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgOCB8ICAgICBzdHJ1Y3QgQiBiIChlbXB0eSkKKy8vIENIRUNLLVg2NDogICAgICAgMTYgfCAgIHN0cnVjdCBCIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDE2IHwgICBzdHJ1Y3QgQyAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisKK3N0cnVjdCBGIDogdmlydHVhbCBELCB2aXJ0dWFsIEIge307CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEYgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgc3RydWN0IEMgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBEICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICAgIHN0cnVjdCBCIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAgIChEIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgICAgc3RydWN0IEIgYiAoZW1wdHkpCisvLyBDSEVDSzogICAgICAgIDE2IHwgICBzdHJ1Y3QgQiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NCwgbnZhbGlnbj00XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChGIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQyAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgRCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgICAgc3RydWN0IEIgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIChEIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIHN0cnVjdCBCIGIgKGVtcHR5KQorLy8gQ0hFQ0stWDY0OiAgICAgICAgMzIgfCAgIHN0cnVjdCBCICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249OF0KKworc3RydWN0IEpDMCB7CisJSkMwKCkgeyBwcmludGYoIkpDMCA6ICVkXG4iLCAoaW50KSgoY2hhciopdGhpcyAtIGJ1ZmZlcikpOyB9Cit9Oworc3RydWN0IEpDMSA6IEpDMCB7CisJdmlydHVhbCB2b2lkIGYoKSB7fQorCUpDMSgpIHsgcHJpbnRmKCJKQzEgOiAlZFxuIiwgKGludCkoKGNoYXIqKXRoaXMgLSBidWZmZXIpKTsgfQorfTsKK3N0cnVjdCBKQzIgOiBKQzEgeworCUpDMigpIHsgcHJpbnRmKCJKQzIgOiAlZFxuIiwgKGludCkoKGNoYXIqKXRoaXMgLSBidWZmZXIpKTsgfQorfTsKK3N0cnVjdCBKQzQgOiBKQzEsIEpDMiB7CisJSkM0KCkgeyBwcmludGYoIkpDNCA6ICVkXG4iLCAoaW50KSgoY2hhciopdGhpcyAtIGJ1ZmZlcikpOyB9Cit9OworCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgSkM0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgSkMxIChwcmltYXJ5IGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIChKQzEgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICBzdHJ1Y3QgSkMwIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgSkMyIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBzdHJ1Y3QgSkMxIChwcmltYXJ5IGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAgICAgKEpDMSB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICAgICAgc3RydWN0IEpDMCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTIsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBKQzQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgSkMxIChwcmltYXJ5IGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAoSkMxIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIHN0cnVjdCBKQzAgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgSkMyIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgc3RydWN0IEpDMSAocHJpbWFyeSBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgICAoSkMxIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgICAgc3RydWN0IEpDMCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKworaW50IGFbCitzaXplb2YoQVQzKSArCitzaXplb2YoQlQzKSArCitzaXplb2YoVDMpICsKK3NpemVvZihFKSArCitzaXplb2YoRikgKworc2l6ZW9mKEpDNCkgKworMF07CmRpZmYgLS1naXQgYS90ZXN0L0xheW91dC9tcy14ODYtYWxpZ25lZC10YWlsLXBhZGRpbmcuY3BwIGIvdGVzdC9MYXlvdXQvbXMteDg2LWFsaWduZWQtdGFpbC1wYWRkaW5nLmNwcAppbmRleCBiOTAyMGYzLi5mOTE5NzY2IDEwMDY0NAotLS0gYS90ZXN0L0xheW91dC9tcy14ODYtYWxpZ25lZC10YWlsLXBhZGRpbmcuY3BwCisrKyBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1hbGlnbmVkLXRhaWwtcGFkZGluZy5jcHAKQEAgLTEsNiArMSw2IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+L2Rldi9udWxsIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAlcyAyPi9kZXYvbnVsbCBcCiAvLyBSVU46ICAgICAgICAgICAgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgeDg2XzY0LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5IC1jeHgtYWJpIG1pY3Jvc29mdCAlcyAyPi9kZXYvbnVsbCBcCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIHg4Nl82NC1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAlcyAyPi9kZXYvbnVsbCBcCiAvLyBSVU46ICAgICAgICAgICAgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeCBDSEVDSy1YNjQKIAogZXh0ZXJuICJDIiBpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKQEAgLTc1LDMzICs3NSw0MSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIxIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICA0IHwgICBzdHJ1Y3QgQjAgKGJhc2UpCi0vLyBDSEVDSzogICAgNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBCMiAoYmFzZSkKLS8vIENIRUNLOiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAzMiB8ICAgKEEgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgNDggfCAgIGludCBhCi0vLyBDSEVDSzogICA2NCB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDY0IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEEKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIHN0cnVjdCBCMCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMiAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIChBIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjEgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgNCB8ICAgc3RydWN0IEIwIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICA0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMiAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjEgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDQgfCAgIHN0cnVjdCBCMCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIyIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBCIDogQjIsIEIwLCBCMSwgdmlydHVhbCBWIHsKIAlpbnQgYTsKQEAgLTEwOSwzMyArMTE3LDMzIEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEIKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjIgKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBCMCAoYmFzZSkKLS8vIENIRUNLOiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAzMiB8ICAgc3RydWN0IEIxIChiYXNlKQotLy8gQ0hFQ0s6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDM2IHwgICAoQiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA1MiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDY0IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgY2hhciBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MTZdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEIKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMiAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBCMSAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMzYgfCAgIChCIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgNTIgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQgotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjIgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIwIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIHN0cnVjdCBCMSAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQwIHwgICAoQiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjIgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgc3RydWN0IEIxIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICAoQiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA1MiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBDIDogQjEsIEIwLCB2aXJ0dWFsIFYgewogCWludCBhOwpAQCAtMTQ0LDMxICsxNTIsMzEgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQwotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgNCB8ICAgc3RydWN0IEIwIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICA4IHwgICAoQyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAyNCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICBsb25nIGxvbmcgYTEKLS8vIENIRUNLOiAgIDQ4IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNDggfCAgICAgY2hhciBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIHN0cnVjdCBCMCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIChDIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBsb25nIGxvbmcgYTEKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBDCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICA0IHwgICBzdHJ1Y3QgQjAgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDQgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBsb25nIGxvbmcgYTEKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NDgsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgNCB8ICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDQgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoQyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBsb25nIGxvbmcgYTEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBEIDogQjIsIEIwLCB2aXJ0dWFsIFYgewogCWludCBhOwpAQCAtMTc2LDI5ICsxODQsMjkgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRAotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMiAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEIwIChiYXNlKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDIwIHwgICAoRCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAzNiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDQ4IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNDggfCAgICAgY2hhciBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMiAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgIChEIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMzYgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjIgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIwIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIChEIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMiAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAoRCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzNiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBFIDogQjMsIEIwLCB2aXJ0dWFsIFYgewogCWludCBhOwpAQCAtMjA2LDMxICsyMTQsMzMgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRQotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMyAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGxvbmcgbG9uZyBhMQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMjAgfCAgIChFIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDM2IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNDggfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA0OCB8ICAgICBjaGFyIGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBFCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjMgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGxvbmcgbG9uZyBhMQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgKEUgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAzNiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBFCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMyAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICBsb25nIGxvbmcgYTEKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjAgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgKEUgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBFCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIzIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgbG9uZyBsb25nIGExCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgKEUgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzYgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgRiA6IEIwLCB2aXJ0dWFsIFYxIHsKIAlfX2RlY2xzcGVjKGFsaWduKDE2KSkgaW50IGE7CkBAIC0yMzksMjkgKzI0OSwzMyBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBGCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIwIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICA0IHwgICAoRiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDkyIHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIFYxKQotLy8gQ0hFQ0s6ICAgOTYgfCAgIHN0cnVjdCBWMSAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgOTYgfCAgICAgKFYxIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgMTI4IHwgICAgIHN0cnVjdCBBMTYgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xMjgsIGFsaWduPTMyCi0vLyBDSEVDSzogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBGCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjAgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAoRiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA5MiB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBWMSkKKy8vIENIRUNLLU5FWFQ6ICAgOTYgfCAgIHN0cnVjdCBWMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA5NiB8ICAgICAoVjEgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogIDEyOCB8ICAgICBzdHJ1Y3QgQTE2IChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xMjgsIGFsaWduPTMyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0zMl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBGCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAoRiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNjAgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgVjEpCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgIHN0cnVjdCBWMSAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICAgIChWMSB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgOTYgfCAgICAgc3RydWN0IEExNiAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MzIKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBGCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoRiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDkyIHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIFYxKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgOTYgfCAgIHN0cnVjdCBWMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgOTYgfCAgICAgKFYxIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTI4IHwgICAgIHN0cnVjdCBBMTYgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0xMjgsIGFsaWduPTMyCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MzJdCiAKIHN0cnVjdCBHIDogdmlydHVhbCBWMiwgdmlydHVhbCBWMyB7CiAJaW50IGE7CkBAIC0yNjksMjcgKzI4MywzMSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBHCi0vLyBDSEVDSzogICAgMCB8ICAgKEcgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIGludCBhCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IFYyICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAgOCB8ICAgICBsb25nIGxvbmcgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgaW50IGExCi0vLyBDSEVDSzogICAyNCB8ICAgc3RydWN0IFYzICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAyNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTI4LCBhbGlnbj04Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEcgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBWMiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBsb25nIGxvbmcgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYTEKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBWMyAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjgsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249OF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBHCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChHIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IFYyICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgbG9uZyBsb25nIGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgICBpbnQgYTEKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgc3RydWN0IFYzICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEcKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgVjIgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGxvbmcgbG9uZyBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgICBpbnQgYTEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBzdHJ1Y3QgVjMgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgSCB7CiAJX19kZWNsc3BlYyhhbGlnbigxNikpIGludCBhOwpAQCAtMjk4LDE3ICszMTYsMTcgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgSAotLy8gQ0hFQ0s6ICAgIDAgfCAgIGludCBhCi0vLyBDSEVDSzogICAgNCB8ICAgaW50IGIKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgSAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIGludCBiCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEgKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgNCB8ICAgaW50IGIKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgSAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgNCB8ICAgaW50IGIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj0xNl0KIAogc3RydWN0IEkgewogCUIyIGE7CkBAIC0zMTcsMTkgKzMzNSwxOSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBJCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIyIGEKLS8vIENIRUNLOiAgICAwIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgaW50IGIKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0zMiwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgSQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEIyIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgaW50IGEKKy8vIENIRUNLOiAgICAgICAgMTYgfCAgIGludCBiCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEIyIGEKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBpbnQgYgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBJCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQ6ICAgICAgICAxNiB8ICAgaW50IGIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0zMiwgbnZhbGlnbj0xNl0KIAogc3RydWN0IEFYIDogQjBYLCB2aXJ0dWFsIEIyWCwgdmlydHVhbCBCNlgsIHZpcnR1YWwgQjNYIHsKIAlpbnQgYTsKQEAgLTMzOSw0MSArMzU3LDQ5IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEFYCi0vLyBDSEVDSzogICAgMCB8ICAgKEFYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjBYIChiYXNlKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDIwIHwgICAgIGludCBhMQotLy8gQ0hFQ0s6ICAgMjQgfCAgIChBWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA0MCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDQ4IHwgICBzdHJ1Y3QgQjJYICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA0OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNTIgfCAgIHN0cnVjdCBCNlggKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDUyIHwgICAgIGludCBhCi0vLyBDSEVDSzogICA3NiB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCM1gpCi0vLyBDSEVDSzogICA4MCB8ICAgc3RydWN0IEIzWCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgODAgfCAgICAgKEIzWCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA4NCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEFYCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoQVggdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEIwWCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgICAgaW50IGExCisvLyBDSEVDSy1ORVhUOiAgIDI0IHwgICAoQVggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICA0MCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBCMlggKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNTIgfCAgIHN0cnVjdCBCNlggKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNTIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNzYgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjNYKQorLy8gQ0hFQ0stTkVYVDogICA4MCB8ICAgc3RydWN0IEIzWCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA4MCB8ICAgICAoQjNYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgODQgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQVgKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEFYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIwWCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDIwIHwgICAgIGludCBhMQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAoQVggdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgQjJYICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA1MiB8ICAgc3RydWN0IEI2WCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDUyIHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNzYgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjNYKQotLy8gQ0hFQ0stWDY0OiAgIDgwIHwgICBzdHJ1Y3QgQjNYICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgODAgfCAgICAgKEIzWCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgODggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9OTYsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQVgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoQVggdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMFggKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjAgfCAgICAgaW50IGExCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgKEFYIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBCMlggKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA1MiB8ICAgc3RydWN0IEI2WCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNTIgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDc2IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIzWCkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDgwIHwgICBzdHJ1Y3QgQjNYICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgICAoQjNYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDg4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9OTYsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBCWCA6IEI0WCwgdmlydHVhbCBCMlgsIHZpcnR1YWwgQjZYLCB2aXJ0dWFsIEIzWCB7CiAJaW50IGE7CkBAIC0zODMsNDMgKzQwOSw0NyBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBCWAotLy8gQ0hFQ0s6ICAgIDAgfCAgIChCWCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEI0WCAoYmFzZSkKLS8vIENIRUNLOiAgIDE2IHwgICAgIHN0cnVjdCBBMTZYIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMjAgfCAgICAgaW50IGExCi0vLyBDSEVDSzogICAzMiB8ICAgKEJYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDQ4IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNjQgfCAgIHN0cnVjdCBCMlggKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDY0IHwgICAgIGludCBhCi0vLyBDSEVDSzogICA2OCB8ICAgc3RydWN0IEI2WCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNjggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDkyIHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIzWCkKLS8vIENIRUNLOiAgIDk2IHwgICBzdHJ1Y3QgQjNYICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA5NiB8ICAgICAoQjNYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgMTAwIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTEyLCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQlgKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChCWCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjRYIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBzdHJ1Y3QgQTE2WCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgICBpbnQgYTEKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIChCWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgc3RydWN0IEIyWCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA2OCB8ICAgc3RydWN0IEI2WCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2OCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA5MiB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCM1gpCisvLyBDSEVDSy1ORVhUOiAgIDk2IHwgICBzdHJ1Y3QgQjNYICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDk2IHwgICAgIChCM1ggdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogIDEwMCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTEyLCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQlgKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEJYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEI0WCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBzdHJ1Y3QgQTE2WCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjAgfCAgICAgaW50IGExCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIChCWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIHN0cnVjdCBCMlggKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDUyIHwgICBzdHJ1Y3QgQjZYICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNTIgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA3NiB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCM1gpCi0vLyBDSEVDSy1YNjQ6ICAgODAgfCAgIHN0cnVjdCBCM1ggKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA4MCB8ICAgICAoQjNYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA4OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBCWAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChCWCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEI0WCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIHN0cnVjdCBBMTZYIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjAgfCAgICAgaW50IGExCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgKEJYIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMlggKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA2OCB8ICAgc3RydWN0IEI2WCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDkyIHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIzWCkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDk2IHwgICBzdHJ1Y3QgQjNYICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA5NiB8ICAgICAoQjNYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTA0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTEyLCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgQ1ggOiBCNVgsIHZpcnR1YWwgQjJYLCB2aXJ0dWFsIEI2WCwgdmlydHVhbCBCM1ggewogCWludCBhOwpAQCAtNDI5LDQzICs0NTksNDUgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQ1gKLS8vIENIRUNLOiAgICAwIHwgICAoQ1ggdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBCNVggKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICAoQjVYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDIwIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAyNCB8ICAgICBpbnQgYTEKLS8vIENIRUNLOiAgIDI4IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMzIgfCAgIHN0cnVjdCBBMTZYICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDMyIHwgICBzdHJ1Y3QgQjJYICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAzMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMzYgfCAgIHN0cnVjdCBCNlggKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDM2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICA2MCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCM1gpCi0vLyBDSEVDSzogICA2NCB8ICAgc3RydWN0IEIzWCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgKEIzWCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA2OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IENYCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoQ1ggdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEI1WCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgKEI1WCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDI0IHwgICAgIGludCBhMQorLy8gQ0hFQ0stTkVYVDogICAyOCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBBMTZYICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBCMlggKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMzYgfCAgIHN0cnVjdCBCNlggKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjAgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjNYKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgc3RydWN0IEIzWCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICAoQjNYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgNjggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQ1gKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKENYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEI1WCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICAoQjVYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDI4IHwgICAgIGludCBhMQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgQTE2WCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIHN0cnVjdCBCMlggKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDUyIHwgICBzdHJ1Y3QgQjZYICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNTIgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA3NiB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCM1gpCi0vLyBDSEVDSy1YNjQ6ICAgODAgfCAgIHN0cnVjdCBCM1ggKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA4MCB8ICAgICAoQjNYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA4OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBDWAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChDWCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEI1WCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIChCNVggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI4IHwgICAgIGludCBhMQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgc3RydWN0IEExNlggKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBCMlggKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA1MiB8ICAgc3RydWN0IEI2WCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNTIgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDc2IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIzWCkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDgwIHwgICBzdHJ1Y3QgQjNYICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgICAoQjNYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDg4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9OTYsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBfX2RlY2xzcGVjKGFsaWduKDE2KSkgRFggewogCWludCBhOwpAQCAtNDc0LDE3ICs1MDYsMTcgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRFgKLS8vIENIRUNLOiAgICAwIHwgICAoRFggdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBEWAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKERYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRFgKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKERYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBEWAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChEWCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj0xNl0KIAogaW50IGFbCiBzaXplb2YoQSkrCmRpZmYgLS1naXQgYS90ZXN0L0xheW91dC9tcy14ODYtYmFzaWMtbGF5b3V0LmNwcCBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1iYXNpYy1sYXlvdXQuY3BwCmluZGV4IDg2YjM1NTMuLmI2ZmZlZWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvTGF5b3V0L21zLXg4Ni1iYXNpYy1sYXlvdXQuY3BwCisrKyBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1iYXNpYy1sYXlvdXQuY3BwCkBAIC0xLDYgKzEsNiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5IC1jeHgtYWJpIG1pY3Jvc29mdCAlcyAyPi9kZXYvbnVsbCBcCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgJXMgMj4vZGV2L251bGwgXAogLy8gUlVOOiAgICAgICAgICAgIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIHg4Nl82NC1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAtY3h4LWFiaSBtaWNyb3NvZnQgJXMgMj4vZGV2L251bGwgXAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSB4ODZfNjQtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgJXMgMj4vZGV2L251bGwgXAogLy8gUlVOOiAgICAgICAgICAgIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXggQ0hFQ0stWDY0CiAKIGV4dGVybiAiQyIgaW50IHByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7CkBAIC0zOCwyNSArMzgsMjkgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgVGVzdEYwCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICA0IHwgICAoVGVzdEYwIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA4IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgMTIgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBUZXN0RjAKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIChUZXN0RjAgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgVGVzdEYwCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAoVGVzdEYwIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MzIsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGMAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgKFRlc3RGMCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MzIsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgVGVzdEYxIDogQTQsIHZpcnR1YWwgQTE2IHsKIAlpbnQgYTsKQEAgLTY0LDI1ICs2OCwyNyBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBUZXN0RjEKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDQgfCAgIChUZXN0RjEgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDggfCAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEExNiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGMQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgKFRlc3RGMSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEExNiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MzIsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBUZXN0RjEKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIChUZXN0RjEgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBzdHJ1Y3QgQTE2ICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NDgsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBUZXN0RjEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChUZXN0RjEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgc3RydWN0IEExNiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IFRlc3RGMiA6IEE0LCB2aXJ0dWFsIEM0IHsKIAlpbnQgYTsKQEAgLTkwLDI3ICs5NiwyOSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBUZXN0RjIKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDQgfCAgIChUZXN0RjIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDggfCAgIGludCBhCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IEM0ICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAxMiB8ICAgICAoQzQgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0yMCwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVGVzdEYyCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAoVGVzdEYyIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgQzQgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgICAgKEM0IHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTIwLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IFRlc3RGMgotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKFRlc3RGMiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBDNCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAgIChDNCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGMgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgKFRlc3RGMiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQzQgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIChDNCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KIAogc3RydWN0IFRlc3RGMyA6IEE0LCB2aXJ0dWFsIEMxNiB7CiAJaW50IGE7CkBAIC0xMTgsMjcgKzEyNiwyOSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBUZXN0RjMKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDQgfCAgIChUZXN0RjMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDggfCAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAzMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTQ4LCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVGVzdEYzCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAoVGVzdEYzIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgIChDMTYgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9NDgsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBUZXN0RjMKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIChUZXN0RjMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBUZXN0RjMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChUZXN0RjMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgVGVzdEY0IDogVGVzdEYzLCBBNCB7CiAJaW50IGE7CkBAIC0xNDYsMzUgKzE1NiwzNSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBUZXN0RjQKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgVGVzdEYzIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgKFRlc3RGMyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLOiAgIDEyIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAzMiB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDQ4IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGNAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IFRlc3RGMyAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIChUZXN0RjMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IFRlc3RGNAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgVGVzdEYzIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgICAgKFRlc3RGMyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjggfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBUZXN0RjQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgVGVzdEYzIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgICAgKFRlc3RGMyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyOCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBUZXN0RjUgOiBUZXN0RjMsIEE0IHsKIAlpbnQgYTsKQEAgLTE4MywzNyArMTkzLDM3IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IFRlc3RGNQotLy8gQ0hFQ0s6ICAgIDAgfCAgIChUZXN0RjUgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBUZXN0RjMgKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICAgIGludCBhCi0vLyBDSEVDSzogICAyMCB8ICAgICAoVGVzdEYzIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDI0IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAyOCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgMjggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNDggfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDQ4IHwgICAgIChDMTYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVGVzdEY1CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoVGVzdEY1IHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBUZXN0RjMgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgICAoVGVzdEYzIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMjggfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMjggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgIChDMTYgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBUZXN0RjUKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKFRlc3RGNSB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBUZXN0RjMgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgICAoVGVzdEYzIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0NCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICAgIChDMTYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGNQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChUZXN0RjUgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBUZXN0RjMgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgICAoVGVzdEYzIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA0MCB8ICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDAgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ0IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgIChDMTYgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IFRlc3RGNiA6IFRlc3RGMywgQTQgewogCWludCBhOwpAQCAtMjIyLDM3ICsyMzIsMzcgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgVGVzdEY2Ci0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IFRlc3RGMyAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgICAgaW50IGEKLS8vIENIRUNLOiAgICA0IHwgICAgIChUZXN0RjMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSzogICAxMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSzogICA0NCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBDMTYpCi0vLyBDSEVDSzogICA0OCB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNDggfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA2NCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBUZXN0RjYKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBUZXN0RjMgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICAoVGVzdEYzIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDQ0IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEMxNikKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IFRlc3RGNgotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgVGVzdEYzIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgICAgKFRlc3RGMyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjggfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDQgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQzE2KQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVGVzdEY2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IFRlc3RGMyAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIChUZXN0RjMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjggfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA0NCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBDMTYpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgVGVzdEY3IDogQTQsIHZpcnR1YWwgQzE2IHsKIAlpbnQgYTsKQEAgLTI2MSwyOSArMjcxLDI5IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IFRlc3RGNwotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgNCB8ICAgKFRlc3RGNyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDI4IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEMxNikKLS8vIENIRUNLOiAgIDMyIHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAzMiB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDQ4IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MTIsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVGVzdEY3CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAoVGVzdEY3IHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDI4IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEMxNikKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IFRlc3RGNwotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKFRlc3RGNyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDQgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQzE2KQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBUZXN0RjcKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChUZXN0RjcgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA0NCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBDMTYpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgVGVzdEY4IDogVGVzdEY3LCBBNCB7CiAJaW50IGE7CkBAIC0yOTIsMzcgKzMwMiwzNyBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBUZXN0RjgKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgVGVzdEY3IChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgKFRlc3RGNyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLOiAgIDEyIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDQ0IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEMxNikKLS8vIENIRUNLOiAgIDQ4IHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA0OCB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDY0IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGOAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IFRlc3RGNyAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIChUZXN0RjcgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNDQgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQzE2KQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgVGVzdEY4Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBUZXN0RjcgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICAoVGVzdEY3IHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0NCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBDMTYpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBUZXN0RjgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgVGVzdEY3IChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgICAgKFRlc3RGNyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyOCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ0IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEMxNikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBUZXN0RjkgOiBBNCwgdmlydHVhbCBDMTYgewogCWludCBhOwpAQCAtMzMxLDI5ICszNDEsMjkgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgVGVzdEY5Ci0vLyBDSEVDSzogICAgMCB8ICAgKFRlc3RGOSB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICA4IHwgICAoVGVzdEY5IHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDEyIHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDE2IHwgICAgIChDMTYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBUZXN0RjkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChUZXN0RjkgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKFRlc3RGOSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQ4LCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgVGVzdEY5Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChUZXN0RjkgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgKFRlc3RGOSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGOQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChUZXN0RjkgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgKFRlc3RGOSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBUZXN0RkEgOiBUZXN0RjksIEE0IHsKIAlpbnQgYTsKQEAgLTM2MiwzNyArMzcyLDM3IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IFRlc3RGQQotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBUZXN0RjkgKHByaW1hcnkgYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIChUZXN0RjkgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgKFRlc3RGOSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLOiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAyMCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAzMiB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDQ4IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGQQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IFRlc3RGOSAocHJpbWFyeSBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAoVGVzdEY5IHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAgIChUZXN0RjkgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IFRlc3RGQQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgVGVzdEY5IChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgKFRlc3RGOSB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICAoVGVzdEY5IHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAzNiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICAgIChDMTYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGQQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBUZXN0RjkgKHByaW1hcnkgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIChUZXN0RjkgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgKFRlc3RGOSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzNiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgICAoQzE2IHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBUZXN0RkIgOiBBMTYsIHZpcnR1YWwgQzE2IHsKIAlpbnQgYTsKQEAgLTQwMSwyOSArNDExLDI5IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IFRlc3RGQgotLy8gQ0hFQ0s6ICAgIDAgfCAgIChUZXN0RkIgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBBMTYgKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMzIgfCAgIChUZXN0RkIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgNDggfCAgIGludCBhCi0vLyBDSEVDSzogICA2NCB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA4MCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBUZXN0RkIKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChUZXN0RkIgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEExNiAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIChUZXN0RkIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDgwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IFRlc3RGQgotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoVGVzdEZCIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEExNiAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICAoVGVzdEZCIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA0MCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICAgIChDMTYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGQgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChUZXN0RkIgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBBMTYgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIChUZXN0RkIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgVGVzdEZDIDogVGVzdEZCLCBBNCB7CiAJaW50IGE7CkBAIC00MzIsMzcgKzQ0MiwzNyBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBUZXN0RkMKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgVGVzdEZCIChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICAoVGVzdEZCIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICAgIHN0cnVjdCBBMTYgKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICAgIGludCBhCi0vLyBDSEVDSzogICAzMiB8ICAgICAoVGVzdEZCIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDQ4IHwgICAgIGludCBhCi0vLyBDSEVDSzogICA2NCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDY4IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgODAgfCAgIHN0cnVjdCBDMTYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDgwIHwgICAgIChDMTYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgOTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xMTIsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9ODAsIG52YWxpZ249MTZdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGQworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IFRlc3RGQiAocHJpbWFyeSBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAoVGVzdEZCIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgc3RydWN0IEExNiAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgICAoVGVzdEZCIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjggfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDgwIHwgICBzdHJ1Y3QgQzE2ICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDgwIHwgICAgIChDMTYgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICA5NiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTEyLCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9ODAsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgVGVzdEZDCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBUZXN0RkIgKHByaW1hcnkgYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICAoVGVzdEZCIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBzdHJ1Y3QgQTE2IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICAoVGVzdEZCIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA0MCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA1MiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICAgIChDMTYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDgwIHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IFRlc3RGQworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBUZXN0RkIgKHByaW1hcnkgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIChUZXN0RkIgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgc3RydWN0IEExNiAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICAgIChUZXN0RkIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjggfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgc3RydWN0IEMxNiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgODAgfCAgICAgKEMxNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA5NiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTExMiwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT04MCwgbnZhbGlnbj0xNl0KIAogCiBzdHJ1Y3QgQTE2ZiB7CkBAIC00ODYsNDMgKzQ5Niw1MSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBGMAotLy8gQ0hFQ0s6ICAgIDAgfCAgIChGMCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICBzdHJ1Y3QgQiAoYmFzZSkKLS8vIENIRUNLOiAgIDMyIHwgICAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLOiAgIDMyIHwgICAgICAgaW50IGEKLS8vIENIRUNLOiAgIDM2IHwgICAgIHN0cnVjdCBZIChiYXNlKQotLy8gQ0hFQ0s6ICAgMzYgfCAgICAgICBjaGFyIHkKLS8vIENIRUNLOiAgIDQ4IHwgICAgIHN0cnVjdCBYIChiYXNlKQotLy8gQ0hFQ0s6ICAgNDggfCAgICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA1MiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNjQgfCAgIGludCBhCi0vLyBDSEVDSzogICA4MCB8ICAgc3RydWN0IEExNmYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDgwIHwgICAgIChBMTZmIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDk2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTEyLCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgwLCBudmFsaWduPTE2XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEYwCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoRjAgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgc3RydWN0IEIgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAzNiB8ICAgICBzdHJ1Y3QgWSAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzYgfCAgICAgICBjaGFyIHkKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgICAgc3RydWN0IFggKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgICAgKFggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICA1MiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgODAgfCAgIHN0cnVjdCBBMTZmICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDgwIHwgICAgIChBMTZmIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgOTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTExMiwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgwLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEYwCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChGMCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQiAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDIwIHwgICAgIHN0cnVjdCBZIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDIwIHwgICAgICAgY2hhciB5Ci0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgc3RydWN0IFggKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgc3RydWN0IEExNmYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgODAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9OTYsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRjAKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRjAgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgc3RydWN0IEIgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzNiB8ICAgICBzdHJ1Y3QgWSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDM2IHwgICAgICAgY2hhciB5CisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgICBzdHJ1Y3QgWCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgICAgKFggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNTYgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgODAgfCAgIHN0cnVjdCBBMTZmICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA5NiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTExMiwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT04MCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IEYxIDogQiwgQTQgewogCWludCBhOwpAQCAtNTMxLDQzICs1NDksNDMgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRjEKLS8vIENIRUNLOiAgICAwIHwgICAoRjEgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBCIChiYXNlKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMjAgfCAgICAgc3RydWN0IFkgKGJhc2UpCi0vLyBDSEVDSzogICAyMCB8ICAgICAgIGNoYXIgeQotLy8gQ0hFQ0s6ICAgMzIgfCAgICAgc3RydWN0IFggKGJhc2UpCi0vLyBDSEVDSzogICAzMiB8ICAgICAgIChYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDM2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICA0OCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDUyIHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNjQgfCAgIHN0cnVjdCBBMTZmICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA2NCB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA4MCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBGMQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEYxIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgICAgc3RydWN0IFkgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICAgICAgY2hhciB5CisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICAgIHN0cnVjdCBYIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgICAgIChYIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMzYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNTIgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQTE2ZiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDgwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEYxCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChGMSB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjAgfCAgICAgc3RydWN0IFkgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMjAgfCAgICAgICBjaGFyIHkKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICBzdHJ1Y3QgWCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICAgIChYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA0MCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA1MiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgc3RydWN0IEExNmYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgODAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9OTYsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRjEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRjEgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjAgfCAgICAgc3RydWN0IFkgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyMCB8ICAgICAgIGNoYXIgeQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgICAgc3RydWN0IFggKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICAgIChYIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDUyIHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBBMTZmICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgRjIgOiBBNCwgdmlydHVhbCBBMTZmIHsKIAlpbnQgYTsKQEAgLTU3NiwyOSArNTk0LDI5IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEYyCi0vLyBDSEVDSzogICAgMCB8ICAgKEYyIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSzogICAgNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDggfCAgIChGMiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxMiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQTE2ZiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgKEExNmYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBGMgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEYyIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIChGMiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEExNmYgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgKEExNmYgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9NDgsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBGMgotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoRjIgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgKEYyIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgc3RydWN0IEExNmYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBGMgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChGMiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAoRjIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgc3RydWN0IEExNmYgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICAgIChBMTZmIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBGMyA6IEE0LCB2aXJ0dWFsIEExNmYgewogCV9fZGVjbHNwZWMoYWxpZ24oMTYpKSBpbnQgYTsKQEAgLTYwNywyOSArNjI1LDI5IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEYzCi0vLyBDSEVDSzogICAgMCB8ICAgKEYzIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMjAgfCAgIChGMyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA0OCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDY0IHwgICBzdHJ1Y3QgQTE2ZiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgKEExNmYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgODAgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRjMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChGMyB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICAoRjMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBBMTZmICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICAgIChBMTZmIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgODAgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRjMKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEYzIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIChGMyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIHN0cnVjdCBBMTZmICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgKEExNmYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEYzCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEYzIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIChGMyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQTE2ZiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgICAgKEExNmYgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgODAgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IEY0IDogQTQsIEIgewogCV9fZGVjbHNwZWMoYWxpZ24oMTYpKSBpbnQgYTsKQEAgLTYzOCw0MyArNjU2LDQzIEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEY0Ci0vLyBDSEVDSzogICAgMCB8ICAgKEY0IHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMzIgfCAgIHN0cnVjdCBCIChiYXNlKQotLy8gQ0hFQ0s6ICAgMzIgfCAgICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgMzIgfCAgICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMzYgfCAgICAgc3RydWN0IFkgKGJhc2UpCi0vLyBDSEVDSzogICAzNiB8ICAgICAgIGNoYXIgeQotLy8gQ0hFQ0s6ICAgNDggfCAgICAgc3RydWN0IFggKGJhc2UpCi0vLyBDSEVDSzogICA0OCB8ICAgICAgIChYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDUyIHwgICAgIGludCBhCi0vLyBDSEVDSzogICA2NCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDgwIHwgICBzdHJ1Y3QgQTE2ZiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgODAgfCAgICAgKEExNmYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgOTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xMTIsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9ODAsIG52YWxpZ249MTZdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEY0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoRjQgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgc3RydWN0IEIgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAzNiB8ICAgICBzdHJ1Y3QgWSAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzYgfCAgICAgICBjaGFyIHkKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgICAgc3RydWN0IFggKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgICAgKFggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICA1MiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgODAgfCAgIHN0cnVjdCBBMTZmICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDgwIHwgICAgIChBMTZmIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgOTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTExMiwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgwLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEY0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChGNCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQiAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBzdHJ1Y3QgQTQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDIwIHwgICAgIHN0cnVjdCBZIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDIwIHwgICAgICAgY2hhciB5Ci0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgc3RydWN0IFggKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgc3RydWN0IEExNmYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgODAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9OTYsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRjQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRjQgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgc3RydWN0IEIgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzNiB8ICAgICBzdHJ1Y3QgWSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDM2IHwgICAgICAgY2hhciB5CisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgICBzdHJ1Y3QgWCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgICAgKFggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNTYgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgODAgfCAgIHN0cnVjdCBBMTZmICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA5NiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTExMiwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT04MCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IEY1IDogQTE2ZiwgdmlydHVhbCBBNCB7CiAJaW50IGE7CkBAIC02ODMsMjcgKzcwMSwyNyBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBGNQotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBBMTZmIChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMzIgfCAgIChGNSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA0OCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDY0IHwgICBzdHJ1Y3QgQTQgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDY0IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MTZdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEY1CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQTE2ZiAocHJpbWFyeSBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICAoRjUgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBBNCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBGNQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQTE2ZiAocHJpbWFyeSBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIChBMTZmIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICAoRjUgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDQwIHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgQTQgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBGNQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBBMTZmIChwcmltYXJ5IGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIChGNSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQTQgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBGNiA6IHZpcnR1YWwgQTE2ZiwgQTQsIHZpcnR1YWwgQiB7CiAJaW50IGE7CkBAIC03MTIsNDUgKzczMCw5MSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBGNgotLy8gQ0hFQ0s6ICAgIDAgfCAgIChGNiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICA4IHwgICAoRjYgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTIgfCAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEExNmYgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDE2IHwgICAgIChBMTZmIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDMyIHwgICAgIGludCBhCi0vLyBDSEVDSzogICA0OCB8ICAgc3RydWN0IEIgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDQ4IHwgICAgIHN0cnVjdCBBNCAoYmFzZSkKLS8vIENIRUNLOiAgIDQ4IHwgICAgICAgaW50IGEKLS8vIENIRUNLOiAgIDUyIHwgICAgIHN0cnVjdCBZIChiYXNlKQotLy8gQ0hFQ0s6ICAgNTIgfCAgICAgICBjaGFyIHkKLS8vIENIRUNLOiAgIDY0IHwgICAgIHN0cnVjdCBYIChiYXNlKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA2OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEY2CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoRjYgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgc3RydWN0IEE0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEY2IHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQTE2ZiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgQiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNTIgfCAgICAgc3RydWN0IFkgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDUyIHwgICAgICAgY2hhciB5CisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICAgIHN0cnVjdCBYIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICAgIChYIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgNjggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRjYKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEY2IHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIChGNiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIHN0cnVjdCBBMTZmICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgKEExNmYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgIHN0cnVjdCBCICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgICAgc3RydWN0IEE0IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2OCB8ICAgICBzdHJ1Y3QgWSAoYmFzZSkKLS8vIENIRUNLLVg2NDogICA2OCB8ICAgICAgIGNoYXIgeQotLy8gQ0hFQ0stWDY0OiAgIDgwIHwgICAgIHN0cnVjdCBYIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDgwIHwgICAgICAgKFggdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDg4IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0zMiwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRjYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRjYgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBBNCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgKEY2IHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBBMTZmICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICAoQTE2ZiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgICBzdHJ1Y3QgQTQgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA2OCB8ICAgICBzdHJ1Y3QgWSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY4IHwgICAgICAgY2hhciB5CisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgICBzdHJ1Y3QgWCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDgwIHwgICAgICAgKFggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgODggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0zMiwgbnZhbGlnbj0xNl0KKworc3RydWN0IEFycmF5RmllbGRPZlJlY29yZHMgeworICBBNCBJbmxpbmVFbHRzWzJdOworfTsKKworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEFycmF5RmllbGRPZlJlY29yZHMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBBNCBbMl0gSW5saW5lRWx0cworLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQXJyYXlGaWVsZE9mUmVjb3JkcworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBBNCBbMl0gSW5saW5lRWx0cworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgsIGFsaWduPTQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCisKK3N0cnVjdCBBcnJheU9mQXJyYXlGaWVsZE9mUmVjb3JkcyB7CisgIEE0IElubGluZUVsdHNbMl1bMl07Cit9OworCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQXJyYXlPZkFycmF5RmllbGRPZlJlY29yZHMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBBNCBbMl1bMl0gSW5saW5lRWx0cworLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBcnJheU9mQXJyYXlGaWVsZE9mUmVjb3JkcworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBBNCBbMl1bMl0gSW5saW5lRWx0cworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj00CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249NF0KKworc3RydWN0IFJlY29yZEFycmF5VHlwZWRlZiB7CisgIHR5cGVkZWYgQTQgQXJyYXlUeVsyXTsKKyAgQXJyYXlUeSBJbmxpbmVFbHRzWzJdOworfTsKKworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFJlY29yZEFycmF5VHlwZWRlZgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgQXJyYXlUeSBbMl0gSW5saW5lRWx0cworLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBSZWNvcmRBcnJheVR5cGVkZWYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBBcnJheVR5IFsyXSBJbmxpbmVFbHRzCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQogCiBpbnQgYVsKIHNpemVvZihUZXN0RjApKwpAQCAtNzcyLDQgKzgzNiw4IEBACiBzaXplb2YoRjMpKwogc2l6ZW9mKEY0KSsKIHNpemVvZihGNSkrCi1zaXplb2YoRjYpXTsKK3NpemVvZihGNikrCitzaXplb2YoQXJyYXlGaWVsZE9mUmVjb3JkcykrCitzaXplb2YoQXJyYXlPZkFycmF5RmllbGRPZlJlY29yZHMpKworc2l6ZW9mKFJlY29yZEFycmF5VHlwZWRlZikrCiswXTsKZGlmZiAtLWdpdCBhL3Rlc3QvTGF5b3V0L21zLXg4Ni1iaXRmaWVsZHMtdmJhc2VzLmNwcCBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1iaXRmaWVsZHMtdmJhc2VzLmNwcAppbmRleCBlMTFlZjY3Li43Y2ZmYThjIDEwMDY0NAotLS0gYS90ZXN0L0xheW91dC9tcy14ODYtYml0ZmllbGRzLXZiYXNlcy5jcHAKKysrIGIvdGVzdC9MYXlvdXQvbXMteDg2LWJpdGZpZWxkcy12YmFzZXMuY3BwCkBAIC0xLDg0ICsxLDEyMCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5IC1jeHgtYWJpIG1pY3Jvc29mdCAlcyAyPiYxIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAlcyAyPiYxIFwKIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSB4ODZfNjQtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+L2Rldi9udWxsIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgeDg2XzY0LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5ICVzIDI+L2Rldi9udWxsIFwKIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IENIRUNLLVg2NAogCi1zdHJ1Y3QgQjAgeyB9Ow0KLQ0KLXN0cnVjdCBBIDogdmlydHVhbCBCMCB7IGNoYXIgYSA6IDE7IH07DQorc3RydWN0IEIwIHsgaW50IGE7IH07CitzdHJ1Y3QgQjEgeyBpbnQgYTsgfTsKIAotLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0DQotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQQ0KLS8vIENIRUNLOiAgICAwIHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpDQotLy8gQ0hFQ0s6ICAgIDQgfCAgIGNoYXIgYQ0KLS8vIENIRUNLOiAgICA5IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQ0KLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj05LCBhbGlnbj00DQotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0NCi0vLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQQ0KLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEEgdmJ0YWJsZSBwb2ludGVyKQ0KLS8vIENIRUNLLVg2NDogICAgOCB8ICAgY2hhciBhDQotLy8gQ0hFQ0stWDY0OiAgIDE3IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQ0KLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgNCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdDQotCi1zdHJ1Y3QgQiA6IHZpcnR1YWwgQjAgeyBzaG9ydCBhIDogMTsgfTsNCitzdHJ1Y3QgQSA6IHZpcnR1YWwgQjAgeyBjaGFyIGEgOiAxOyB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEINCi0vLyBDSEVDSzogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQ0KLS8vIENIRUNLOiAgICA0IHwgICBzaG9ydCBhDQotLy8gQ0hFQ0s6ICAgMTAgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpDQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTEwLCBhbGlnbj00DQotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0NCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQg0KLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQ0KLS8vIENIRUNLLVg2NDogICAgOCB8ICAgc2hvcnQgYQ0KLS8vIENIRUNLLVg2NDogICAxOCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkNCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04DQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQ0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyMCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyMCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KIAotc3RydWN0IEMgOiB2aXJ0dWFsIEIwIHsgY2hhciBhIDogMTsgY2hhciA6IDA7IH07DQorc3RydWN0IEIgOiB2aXJ0dWFsIEIwIHsgc2hvcnQgYSA6IDE7IH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQw0KLS8vIENIRUNLOiAgICAwIHwgICAoQyB2YnRhYmxlIHBvaW50ZXIpDQotLy8gQ0hFQ0s6ICAgIDQgfCAgIGNoYXIgYQ0KLS8vIENIRUNLOiAgICA1IHwgICBjaGFyDQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpDQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTgsIGFsaWduPTQNCi0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQ0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgc2hvcnQgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEMNCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChDIHZidGFibGUgcG9pbnRlcikNCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIGNoYXIgYQ0KLS8vIENIRUNLLVg2NDogICAgOSB8ICAgY2hhcg0KLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkNCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04DQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQ0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoQiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgc2hvcnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjAgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjAgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCiAKLXN0cnVjdCBEIDogdmlydHVhbCBCMCB7IGNoYXIgYSA6IDE7IGNoYXIgYjsgfTsNCitzdHJ1Y3QgQyA6IHZpcnR1YWwgQjAgeyBjaGFyIGEgOiAxOyBjaGFyIDogMDsgfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBEDQotLy8gQ0hFQ0s6ICAgIDAgfCAgIChEIHZidGFibGUgcG9pbnRlcikNCi0vLyBDSEVDSzogICAgNCB8ICAgY2hhciBhDQotLy8gQ0hFQ0s6ICAgIDUgfCAgIGNoYXIgYg0KLS8vIENIRUNLOiAgICA4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQ0KLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj04LCBhbGlnbj00DQotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0NCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChDIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgNSB8ICAgY2hhcgorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEQNCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChEIHZidGFibGUgcG9pbnRlcikNCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIGNoYXIgYQ0KLS8vIENIRUNLLVg2NDogICAgOSB8ICAgY2hhciBiDQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQ0KLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTgNCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdDQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChDIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA5IHwgICBjaGFyCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KKworc3RydWN0IEQgOiB2aXJ0dWFsIEIwIHsgY2hhciBhIDogMTsgY2hhciBiOyB9OworCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEQgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICA1IHwgICBjaGFyIGIKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTIsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOSB8ICAgY2hhciBiCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KKworc3RydWN0IEUgOiB2aXJ0dWFsIEIwLCB2aXJ0dWFsIEIxIHsgbG9uZyBsb25nIDogMTsgfTsKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEUKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChFIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIGxvbmcgbG9uZworLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDI0IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDM2IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChFIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICBsb25nIGxvbmcKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzNiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KIAogaW50IGFbCiBzaXplb2YoQSkrCiBzaXplb2YoQikrCiBzaXplb2YoQykrCi1zaXplb2YoRCldOworc2l6ZW9mKEQpKworc2l6ZW9mKEUpXTsKZGlmZiAtLWdpdCBhL3Rlc3QvTGF5b3V0L21zLXg4Ni1lbXB0eS1iYXNlLWFmdGVyLWJhc2Utd2l0aC12YnB0ci5jcHAgYi90ZXN0L0xheW91dC9tcy14ODYtZW1wdHktYmFzZS1hZnRlci1iYXNlLXdpdGgtdmJwdHIuY3BwCmluZGV4IDI5M2E2MWIuLjIyNDU5NGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvTGF5b3V0L21zLXg4Ni1lbXB0eS1iYXNlLWFmdGVyLWJhc2Utd2l0aC12YnB0ci5jcHAKKysrIGIvdGVzdC9MYXlvdXQvbXMteDg2LWVtcHR5LWJhc2UtYWZ0ZXItYmFzZS13aXRoLXZicHRyLmNwcApAQCAtMSw2ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+L2Rldi9udWxsIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgJXMgMj4vZGV2L251bGwgXAogLy8gUlVOOiAgICAgICAgICAgIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIHg4Nl82NC1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+L2Rldi9udWxsIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgeDg2XzY0LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAlcyAyPi9kZXYvbnVsbCBcCiAvLyBSVU46ICAgICAgICAgICAgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeCBDSEVDSy1YNjQKIAogCkBAIC0xNCwxOTcgKzE0LDIwOSBAQAogc3RydWN0IEEgOiBYLCBXICB7IGNoYXIgYTsgfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IFggKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgICBjaGFyIGEKLS8vIENIRUNLOiAgICA5IHwgICBzdHJ1Y3QgVyAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDkgfCAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEEKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBYIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgOSB8ICAgc3RydWN0IFcgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDkgfCAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTIsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgWCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgMTcgfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMTcgfCAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IFggKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE3IHwgICBzdHJ1Y3QgVyAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTcgfCAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKIHN0cnVjdCBCIDogWCwgVSwgVyAgeyBjaGFyIGE7IH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQgotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBYIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgKFggdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgY2hhciBhCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IFUgKGJhc2UpCi0vLyBDSEVDSzogICAgOCB8ICAgICBjaGFyIGEKLS8vIENIRUNLOiAgICA5IHwgICBzdHJ1Y3QgVyAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDkgfCAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IFggKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIChYIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgVSAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICA5IHwgICBzdHJ1Y3QgVyAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOSB8ICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MTIsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBCCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBYIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIChYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IFUgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgMTcgfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMTcgfCAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBCCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IFggKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgVSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTcgfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNyB8ICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KIAogc3RydWN0IEMgOiBYLCBWLCBXICB7IGNoYXIgYTsgfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBDCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IFggKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgICBjaGFyIGEKLS8vIENIRUNLOiAgICA5IHwgICBzdHJ1Y3QgViAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMTAgfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAxMCB8ICAgY2hhciBhCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTEyLCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MTIsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IFggKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIChYIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICA5IHwgICBzdHJ1Y3QgViAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAxMCB8ICAgc3RydWN0IFcgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMTAgfCAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTIsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQwotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgWCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgMTcgfCAgIHN0cnVjdCBWIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMTggfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMTggfCAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBDCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IFggKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE3IHwgICBzdHJ1Y3QgViAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTggfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxOCB8ICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KIAogc3RydWN0IEQgOiBYLCBVLCBWLCBXICB7IGNoYXIgYTsgfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBECi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IFggKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgICBjaGFyIGEKLS8vIENIRUNLOiAgICA4IHwgICBzdHJ1Y3QgVSAoYmFzZSkKLS8vIENIRUNLOiAgICA4IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgIDkgfCAgIHN0cnVjdCBWIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAxMCB8ICAgc3RydWN0IFcgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDEwIHwgICBjaGFyIGEKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTIsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBECisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgWCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgKFggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBVIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDkgfCAgIHN0cnVjdCBWIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDEwIHwgICBzdHJ1Y3QgVyAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAxMCB8ICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MTIsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBECi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBYIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIChYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IFUgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgMTcgfCAgIHN0cnVjdCBWIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMTggfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMTggfCAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBECisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IFggKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgVSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTcgfCAgIHN0cnVjdCBWIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxOCB8ICAgc3RydWN0IFcgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE4IHwgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgRSA6IFgsIFUsIFksIFYsIFcgIHsgY2hhciBhOyB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEUKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgWCAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIChYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBVIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgY2hhciBhCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IFkgKGJhc2UpCi0vLyBDSEVDSzogICAxMiB8ICAgICAoWSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxNiB8ICAgICBjaGFyIGEKLS8vIENIRUNLOiAgIDIxIHwgICBzdHJ1Y3QgViAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMjIgfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAyMiB8ICAgY2hhciBhCi0vLyBDSEVDSzogICAyNCB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249NF0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBFCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgWCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgKFggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBVIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBZIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICAoWSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAyMSB8ICAgc3RydWN0IFYgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMjIgfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDIyIHwgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEUKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IFggKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgKFggdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgVSAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IFkgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgICAgKFkgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgIDQxIHwgICBzdHJ1Y3QgViAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDQyIHwgICBzdHJ1Y3QgVyAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDQyIHwgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBYIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgKFggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IFUgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgWSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIChZIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDEgfCAgIHN0cnVjdCBWIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0MiB8ICAgc3RydWN0IFcgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQyIHwgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NDgsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgRiA6IFosIFcgIHsgY2hhciBhOyB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEYKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgWiAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIHN0cnVjdCBZIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgICAoWSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgICAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgIDkgfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgOSB8ICAgY2hhciBhCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTEyLCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MTIsIG52YWxpZ249NF0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBGCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgWiAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgc3RydWN0IFkgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgICAgKFkgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgOSB8ICAgc3RydWN0IFcgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDkgfCAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTIsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRgotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgWiAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICBzdHJ1Y3QgWSAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICAgIChZIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgIDE3IHwgICBzdHJ1Y3QgVyAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDE3IHwgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBaIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgc3RydWN0IFkgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAgIChZIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNyB8ICAgc3RydWN0IFcgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE3IHwgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgViAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgRyA6IFgsIFcsIFksIFYgIHsgY2hhciBhOyB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEcKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgWCAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIChYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgIDkgfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IFkgKGJhc2UpCi0vLyBDSEVDSzogICAxMiB8ICAgICAoWSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxNiB8ICAgICBjaGFyIGEKLS8vIENIRUNLOiAgIDIxIHwgICBzdHJ1Y3QgViAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMjEgfCAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgMjQgfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEcKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBYIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgOSB8ICAgc3RydWN0IFcgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBZIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICAoWSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAyMSB8ICAgc3RydWN0IFYgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMjEgfCAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgc3RydWN0IFYgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRwotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgWCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICAoWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgMTcgfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBZIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAgIChZIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICA0MSB8ICAgc3RydWN0IFYgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICA0MSB8ICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NDgsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEcKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgWCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIChYIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTcgfCAgIHN0cnVjdCBXIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IFkgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgICAoWSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQxIHwgICBzdHJ1Y3QgViAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDEgfCAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBWICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPThdCiAKIGludCBhWwogc2l6ZW9mKEEpKwpkaWZmIC0tZ2l0IGEvdGVzdC9MYXlvdXQvbXMteDg2LWVtcHR5LW5vbnZpcnR1YWwtYmFzZXMuY3BwIGIvdGVzdC9MYXlvdXQvbXMteDg2LWVtcHR5LW5vbnZpcnR1YWwtYmFzZXMuY3BwCmluZGV4IDAxZDEwYzkuLjZlZjE0OTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvTGF5b3V0L21zLXg4Ni1lbXB0eS1ub252aXJ0dWFsLWJhc2VzLmNwcAorKysgYi90ZXN0L0xheW91dC9tcy14ODYtZW1wdHktbm9udmlydHVhbC1iYXNlcy5jcHAKQEAgLTEsNiArMSw2IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+L2Rldi9udWxsIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAlcyAyPi9kZXYvbnVsbCBcCiAvLyBSVU46ICAgICAgICAgICAgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgeDg2XzY0LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5IC1jeHgtYWJpIG1pY3Jvc29mdCAlcyAyPi9kZXYvbnVsbCBcCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIHg4Nl82NC1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAlcyAyPi9kZXYvbnVsbCBcCiAvLyBSVU46ICAgICAgICAgICAgfCBGaWxlQ2hlY2sgJXMKIAogZXh0ZXJuICJDIiBpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKQEAgLTIzLDExICsyMywxMiBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIwIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgMCB8ICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj04LCBhbGlnbj04Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj04XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEEKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249OF0KIAogc3RydWN0IEIgOiBCMCB7CiAJQjAgYjA7CkBAIC0zNiwxNCArMzcsMTQgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQgotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMCBiMCAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8ICAgW3NpemVvZj04LCBhbGlnbj04Ci0vLyBDSEVDSzogICAgICB8ICAgIG52c2l6ZT0wLCBudmFsaWduPTFdCi0vLyBDSEVDSzogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249OAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEIKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEIwIGIwIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgIFtzaXplb2Y9OCwgYWxpZ249OAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICAgIG52c2l6ZT0wLCBudmFsaWduPThdCisvLyBDSEVDSzogICAgICAgICA4IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCiAKIHN0cnVjdCBDIDogQjAsIEIxLCBCMiwgQjMsIEI0IHsKIAlpbnQgYTsKQEAgLTUxLDE1ICs1MiwxOSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBDCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIwIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEIyIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAyNCB8ICAgc3RydWN0IEIzIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAzMiB8ICAgc3RydWN0IEI0IChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj00MCwgYWxpZ249OAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQwLCBudmFsaWduPThdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEIwIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMiAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgc3RydWN0IEIzIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBzdHJ1Y3QgQjQgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj00MCwgYWxpZ249OAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NDAsIG52YWxpZ249OF0KIAogc3RydWN0IEQgewogCUIwIGIwOwpAQCAtNzIsMjggKzc3LDMxIEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEQKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjAgYjAgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCAgIFtzaXplb2Y9OCwgYWxpZ249OAotLy8gQ0hFQ0s6ICAgICAgfCAgICBudnNpemU9MCwgbnZhbGlnbj0xXQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBDMCBjMAotLy8gQ0hFQ0s6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgICBbc2l6ZW9mPTQsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgICAgbnZzaXplPTQsIG52YWxpZ249NF0KLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQzEgYzEKLS8vIENIRUNLOiAgIDEyIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8ICAgW3NpemVvZj00LCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICAgIG52c2l6ZT00LCBudmFsaWduPTRdCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEMyIGMyCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCAgIFtzaXplb2Y9NCwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgICBudnNpemU9NCwgbnZhbGlnbj00XQotLy8gQ0hFQ0s6ICAgMjQgfCAgIHN0cnVjdCBCMSBiMSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8ICAgW3NpemVvZj04LCBhbGlnbj04Ci0vLyBDSEVDSzogICAgICB8ICAgIG52c2l6ZT0wLCBudmFsaWduPTFdCi0vLyBDSEVDSzogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj00MCwgYWxpZ249OAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQwLCBudmFsaWduPThdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMCBiMCAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgICBbc2l6ZW9mPTgsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgICBudnNpemU9MCwgbnZhbGlnbj04XQorLy8gQ0hFQ0s6ICAgICAgICAgOCB8ICAgc3RydWN0IEMwIGMwCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgICBbc2l6ZW9mPTQsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgICBudnNpemU9NCwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICAgICAgICAxMiB8ICAgc3RydWN0IEMxIGMxCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgICBbc2l6ZW9mPTQsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgICBudnNpemU9NCwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICAgICAgICAxNiB8ICAgc3RydWN0IEMyIGMyCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgICBbc2l6ZW9mPTQsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgICBudnNpemU9NCwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICAgICAgICAyNCB8ICAgc3RydWN0IEIxIGIxIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgIFtzaXplb2Y9OCwgYWxpZ249OAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICAgIG52c2l6ZT0wLCBudmFsaWduPThdCisvLyBDSEVDSzogICAgICAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTQwLCBudmFsaWduPThdCiAKIHN0cnVjdCBFIDogQjAsIEMwLCBDMSwgQzIsIEIxIHsKIAlpbnQgYTsKQEAgLTEwMSwxOCArMTA5LDE4IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEUKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjAgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQzAgKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDQgfCAgIHN0cnVjdCBDMSAoYmFzZSkKLS8vIENIRUNLOiAgICA0IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IEMyIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDE2IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEIwIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQzAgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBzdHJ1Y3QgQzEgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQzIgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KIAogc3RydWN0IEYgOiBDMCwgQjAsIEIxLCBDMSB7CiAJaW50IGE7CkBAIC0xMjAsMTYgKzEyOCwxNiBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBGCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEMwIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICA4IHwgICBzdHJ1Y3QgQjAgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQzEgKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMjAgfCAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBGCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQzAgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjAgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEMxIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgRyA6IEIwLCBCMSwgQjIsIEIzLCBCNCB7CiAJX19kZWNsc3BlYyhhbGlnbigzMikpIGludCBhOwpAQCAtMTM3LDE1ICsxNDUsMTUgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRwotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBCMiAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMjQgfCAgIHN0cnVjdCBCMyAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMzIgfCAgIHN0cnVjdCBCNCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTMyCi0vLyBDSEVDSzogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MzJdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEcKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjIgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBCMyAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgc3RydWN0IEI0IChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTMyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KIAogc3RydWN0IF9fZGVjbHNwZWMoYWxpZ24oMzIpKSBIIDogQjAsIEIxLCBCMiwgQjMsIEI0IHsKIAlpbnQgYTsKQEAgLTE1MywxNSArMTYxLDE1IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEgKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjAgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA4IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjIgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDI0IHwgICBzdHJ1Y3QgQjMgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDMyIHwgICBzdHJ1Y3QgQjQgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0zMgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQwLCBudmFsaWduPThdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEgKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjIgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBCMyAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgc3RydWN0IEI0IChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTMyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00MCwgbnZhbGlnbj0zMl0KIAogaW50IGFbCiBzaXplb2YoQSkrCmRpZmYgLS1naXQgYS90ZXN0L0xheW91dC9tcy14ODYtZW1wdHktdmlydHVhbC1iYXNlLmNwcCBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1lbXB0eS12aXJ0dWFsLWJhc2UuY3BwCmluZGV4IGVmNmYwODEuLjIzZTI4N2EgMTAwNjQ0Ci0tLSBhL3Rlc3QvTGF5b3V0L21zLXg4Ni1lbXB0eS12aXJ0dWFsLWJhc2UuY3BwCisrKyBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1lbXB0eS12aXJ0dWFsLWJhc2UuY3BwCkBAIC0xLDYgKzEsNiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5IC1jeHgtYWJpIG1pY3Jvc29mdCAlcyAyPi9kZXYvbnVsbCBcCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgJXMgMj4vZGV2L251bGwgXAogLy8gUlVOOiAgICAgICAgICAgIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIHg4Nl82NC1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAtY3h4LWFiaSBtaWNyb3NvZnQgJXMgMj4vZGV2L251bGwgXAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSB4ODZfNjQtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgJXMgMj4vZGV2L251bGwgXAogLy8gUlVOOiAgICAgICAgICAgIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXggQ0hFQ0stWDY0CiAKIGV4dGVybiAiQyIgaW50IHByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7CkBAIC0yNywxOSArMjcsMjEgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQQotLy8gQ0hFQ0s6ICAgIDAgfCAgIChBIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249OAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBBCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249OF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBBCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChBIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KIAogc3RydWN0IEIgOiB2aXJ0dWFsIEIwIHsKIAlCMCBiMDsKQEAgLTQ4LDI1ICs1MCwyNSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBCCi0vLyBDSEVDSzogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMCBiMCAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8ICAgW3NpemVvZj04LCBhbGlnbj04Ci0vLyBDSEVDSzogICAgICB8ICAgIG52c2l6ZT0wLCBudmFsaWduPTFdCi0vLyBDSEVDSzogICAxNiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IEIwIGIwIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgIFtzaXplb2Y9OCwgYWxpZ249OAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICAgIG52c2l6ZT0wLCBudmFsaWduPThdCisvLyBDSEVDSzogICAgICAgIDE2IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEIKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICBzdHJ1Y3QgQjAgYjAgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgICBbc2l6ZW9mPTgsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICAgIG52c2l6ZT0wLCBudmFsaWduPTFdCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBCCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBCMCBiMCAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICAgW3NpemVvZj04LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICAgIG52c2l6ZT0wLCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICAgICAgICAxNiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KIAogc3RydWN0IEMgOiB2aXJ0dWFsIEIwLCB2aXJ0dWFsIEIxLCB2aXJ0dWFsIEIyLCB2aXJ0dWFsIEIzLCB2aXJ0dWFsIEI0IHsKIAlpbnQgYTsKQEAgLTc0LDI3ICs3NiwzNSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBDCi0vLyBDSEVDSzogICAgMCB8ICAgKEMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIGludCBhCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMjQgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAzMiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDQwIHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChDIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICA0MCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPThdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQwotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoQyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTQ4LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBDCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0MCB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQ4LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KIAogc3RydWN0IEQgewogCUIwIGIwOwpAQCAtMTA3LDMxICsxMTcsMzcgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRAotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMCBiMCAoZW1wdHkpCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IEMwIGMwCi0vLyBDSEVDSzogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBDMSBjMQotLy8gQ0hFQ0s6ICAgMTIgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQzIgYzIKLS8vIENIRUNLOiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAyNCB8ICAgc3RydWN0IEIxIGIxIChlbXB0eSkKLS8vIENIRUNLOiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9NDAsIG52YWxpZ249OF0KLS8vIENIRUNLLTY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stNjQ6ICAgIDAgfCBzdHJ1Y3QgRAotLy8gQ0hFQ0stNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMCBiMCAoZW1wdHkpCi0vLyBDSEVDSy02NDogICAgOCB8ICAgc3RydWN0IEMwIGMwCi0vLyBDSEVDSy02NDogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stNjQ6ICAgMTIgfCAgIHN0cnVjdCBDMSBjMQotLy8gQ0hFQ0stNjQ6ICAgMTIgfCAgICAgaW50IGEKLS8vIENIRUNLLTY0OiAgIDE2IHwgICBzdHJ1Y3QgQzIgYzIKLS8vIENIRUNLLTY0OiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSy02NDogICAyNCB8ICAgc3RydWN0IEIxIGIxIChlbXB0eSkKLS8vIENIRUNLLTY0OiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0stNjQ6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04Ci0vLyBDSEVDSy02NDogICAgICB8ICBudnNpemU9NDAsIG52YWxpZ249OF0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEIwIGIwIChlbXB0eSkKKy8vIENIRUNLOiAgICAgICAgIDggfCAgIHN0cnVjdCBDMCBjMAorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0s6ICAgICAgICAxMiB8ICAgc3RydWN0IEMxIGMxCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICAgIGludCBhCisvLyBDSEVDSzogICAgICAgIDE2IHwgICBzdHJ1Y3QgQzIgYzIKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLOiAgICAgICAgMjQgfCAgIHN0cnVjdCBCMSBiMSAoZW1wdHkpCisvLyBDSEVDSzogICAgICAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTQwLCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBECisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIwIGIwIChlbXB0eSkKKy8vIENIRUNLLVg2NDogICAgICAgICA4IHwgICBzdHJ1Y3QgQzAgYzAKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQ6ICAgICAgICAxMiB8ICAgc3RydWN0IEMxIGMxCisvLyBDSEVDSy1YNjQtTkVYVDogICAxMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0OiAgICAgICAgMTYgfCAgIHN0cnVjdCBDMiBjMgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NDogICAgICAgIDI0IHwgICBzdHJ1Y3QgQjEgYjEgKGVtcHR5KQorLy8gQ0hFQ0stWDY0OiAgICAgICAgMzIgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT00MCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgRSA6IHZpcnR1YWwgQjAsIHZpcnR1YWwgQzAsIHZpcnR1YWwgQzEsIHZpcnR1YWwgQzIsIHZpcnR1YWwgQjEgewogCWludCBhOwpAQCAtMTM5LDMzICsxNTUsMzMgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRQotLy8gQ0hFQ0s6ICAgIDAgfCAgIChFIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBDMSAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgMTIgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQzIgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAyNCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEUgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBDMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEMyICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249OF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBFCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChFIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyMCB8ICAgc3RydWN0IEMxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMjAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEMyICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MzIsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEUKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDIwIHwgICBzdHJ1Y3QgQzEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDIwIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEMyICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MzIsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgRiA6IHZpcnR1YWwgQzAsIHZpcnR1YWwgQjAsIHZpcnR1YWwgQjEsIHZpcnR1YWwgQzEgewogCWludCBhOwpAQCAtMTczLDI5ICsxODksMjkgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRgotLy8gQ0hFQ0s6ICAgIDAgfCAgIChGIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAyNCB8ICAgc3RydWN0IEMxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAyNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTMyLCBhbGlnbj04Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBGCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoRiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBDMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MzIsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249OF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBGCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChGIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgc3RydWN0IEMxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBDMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj00MCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCiAKIHN0cnVjdCBHIDogdmlydHVhbCBDMCwgdmlydHVhbCBCMCwgdmlydHVhbCBCMSwgRDAsIHZpcnR1YWwgQzEgewogCWludCBhOwpAQCAtMjA0LDMzICsyMjAsMzUgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRwotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBEMCAocHJpbWFyeSBiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgKEQwIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICAoRyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAyMCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDMyIHwgICAgIGludCBhCi0vLyBDSEVDSzogICA0MCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDU2IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgNTYgfCAgIHN0cnVjdCBDMSAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0zMiwgbnZhbGlnbj0xNl0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBHCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgRDAgKHByaW1hcnkgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgKEQwIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIChHIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNDAgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDU2IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICA1NiB8ICAgc3RydWN0IEMxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDU2IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEcKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEQwIChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgKEQwIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEcgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQwIHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDU2IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDU2IHwgICBzdHJ1Y3QgQzEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA1NiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBHCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEQwIChwcmltYXJ5IGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAoRDAgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChHIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNTYgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICA1NiB8ICAgc3RydWN0IEMxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA1NiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgSCA6IHZpcnR1YWwgQzAsIHZpcnR1YWwgQjAsIHZpcnR1YWwgQjEsIHZpcnR1YWwgRDAsIHZpcnR1YWwgQzEgewogCWludCBhOwpAQCAtMjM5LDM1ICsyNTcsMzUgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgSAotLy8gQ0hFQ0s6ICAgIDAgfCAgIChIIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICA0NCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBEMCkKLS8vIENIRUNLOiAgIDQ4IHwgICBzdHJ1Y3QgRDAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDQ4IHwgICAgIChEMCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA1MiB8ICAgc3RydWN0IEMxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA1MiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgSAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDQ0IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEQwKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgc3RydWN0IEQwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgIChEMCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDUyIHwgICBzdHJ1Y3QgQzEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNTIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBICi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChIIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICA0MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICA2MCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBEMCkKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgc3RydWN0IEQwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgICAgKEQwIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA3MiB8ICAgc3RydWN0IEMxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNzIgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBICisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDYwIHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEQwKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBEMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgICAgKEQwIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDcyIHwgICBzdHJ1Y3QgQzEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDcyIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBJIDogdmlydHVhbCBCMCwgdmlydHVhbCBCMSwgdmlydHVhbCBCMiwgdmlydHVhbCBCMywgdmlydHVhbCBCNCB7CiAJX19kZWNsc3BlYyhhbGlnbigzMikpIGludCBhOwpAQCAtMjc1LDI3ICsyOTMsMjcgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgSQotLy8gQ0hFQ0s6ICAgIDAgfCAgIChJIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICA3MiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgMTA0IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxMzYgfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDE2OCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xOTIsIGFsaWduPTMyCi0vLyBDSEVDSzogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MzJdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChJIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICA3MiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAxMDQgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTM2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogIDE2OCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE5MiwgYWxpZ249MzIKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEkgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDcyIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgMTA0IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgMTM2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgMTY4IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0xOTIsIGFsaWduPTMyCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgSQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChJIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICA3MiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTA0IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxMzYgfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDE2OCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0xOTIsIGFsaWduPTMyCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MzJdCiAKIHN0cnVjdCBfX2RlY2xzcGVjKGFsaWduKDMyKSkgSiA6IHZpcnR1YWwgQjAsIHZpcnR1YWwgQjEsIHZpcnR1YWwgQjIsIHZpcnR1YWwgQjMsIHZpcnR1YWwgQjQgewogCWludCBhOwpAQCAtMzAzLDI3ICszMjEsMjcgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgSgotLy8gQ0hFQ0s6ICAgIDAgfCAgIChKIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICA0MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDcyIHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxMDQgfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDEzNiB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xNjAsIGFsaWduPTMyCi0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBKCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoSiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgNDAgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDcyIHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogIDEwNCB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAxMzYgfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xNjAsIGFsaWduPTMyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTMyXQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEoKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEogdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDQwIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDcyIHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgMTA0IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgMTM2IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0xNjAsIGFsaWduPTMyCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBKCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEogdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNzIgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDEwNCB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTM2IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2MCwgYWxpZ249MzIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj0zMl0KIAogc3RydWN0IEsgOiB2aXJ0dWFsIEQxLCB2aXJ0dWFsIEIxLCB2aXJ0dWFsIEIyLCB2aXJ0dWFsIEIzLCB2aXJ0dWFsIEI0IHsKIAlfX2RlY2xzcGVjKGFsaWduKDMyKSkgaW50IGE7CkBAIC0zMzEsMjcgKzM0OSwyOSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBLCi0vLyBDSEVDSzogICAgMCB8ICAgKEsgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSzogICA2NCB8ICAgc3RydWN0IEQxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDcyIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxMDQgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDEzNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgMTY4IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTE5MiwgYWxpZ249MzIKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBLCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoSyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgc3RydWN0IEQxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgNzIgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTA0IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogIDEzNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAxNjggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xOTIsIGFsaWduPTMyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBLCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChLIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgc3RydWN0IEQxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICA3MiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDEwNCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDEzNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDE2OCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTkyLCBhbGlnbj0zMgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEsKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoSyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgRDEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNzIgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDEwNCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTM2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxNjggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTkyLCBhbGlnbj0zMgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQogCiBzdHJ1Y3QgTCA6IHZpcnR1YWwgQjEsIHZpcnR1YWwgRDEsIHZpcnR1YWwgQjIsIHZpcnR1YWwgQjMsIHZpcnR1YWwgQjQgewogCV9fZGVjbHNwZWMoYWxpZ24oMzIpKSBpbnQgYTsKQEAgLTM1OSwyNyArMzc5LDI3IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEwKLS8vIENIRUNLOiAgICAwIHwgICAoTCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDY0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgNjggfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDEwNCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgMTM2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxNjggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTkyLCBhbGlnbj0zMgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBMCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoTCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgNjggfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTA0IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogIDEzNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAxNjggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xOTIsIGFsaWduPTMyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBMCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChMIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICA2OCB8ICAgc3RydWN0IEQxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDEwNCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDEzNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDE2OCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTkyLCBhbGlnbj0zMgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEwKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoTCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjggfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDEwNCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTM2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxNjggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTkyLCBhbGlnbj0zMgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQogCiBzdHJ1Y3QgTSA6IHZpcnR1YWwgQjEsIHZpcnR1YWwgQjIsIHZpcnR1YWwgRDEsIHZpcnR1YWwgQjMsIHZpcnR1YWwgQjQgewogCV9fZGVjbHNwZWMoYWxpZ24oMzIpKSBpbnQgYTsKQEAgLTM4NywyNyArNDA3LDI3IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IE0KLS8vIENIRUNLOiAgICAwIHwgICAoTSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDY0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgNzIgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDEwMCB8ICAgc3RydWN0IEQxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgMTM2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxNjggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTkyLCBhbGlnbj0zMgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBNCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoTSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgNzIgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTAwIHwgICBzdHJ1Y3QgRDEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogIDEzNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAxNjggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xOTIsIGFsaWduPTMyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBNCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChNIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICA3MiB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDEwMCB8ICAgc3RydWN0IEQxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDEzNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDE2OCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTkyLCBhbGlnbj0zMgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IE0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoTSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNzIgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDEwMCB8ICAgc3RydWN0IEQxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTM2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxNjggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTkyLCBhbGlnbj0zMgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQogCiBzdHJ1Y3QgTiA6IHZpcnR1YWwgQzAsIHZpcnR1YWwgQjEsIHZpcnR1YWwgRDEsIHZpcnR1YWwgQjIsIHZpcnR1YWwgQjMsIHZpcnR1YWwgQjQgewogCV9fZGVjbHNwZWMoYWxpZ24oMzIpKSBpbnQgYTsKQEAgLTQxNSwzMSArNDM1LDMxIEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IE4KLS8vIENIRUNLOiAgICAwIHwgICAoTiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDY0IHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDY0IHwgICAgIGludCBhCi0vLyBDSEVDSzogICA3MiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgMTAwIHwgICBzdHJ1Y3QgRDEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxMzYgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDE2OCB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgMjAwIHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTIyNCwgYWxpZ249MzIKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgTgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKE4gdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA3MiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAxMDAgfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTM2IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogIDE2OCB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAyMDAgfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0yMjQsIGFsaWduPTMyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBOCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChOIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA3MiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDEwMCB8ICAgc3RydWN0IEQxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDEzNiB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDE2OCB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDIwMCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MjI0LCBhbGlnbj0zMgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IE4KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoTiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA3MiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTAwIHwgICBzdHJ1Y3QgRDEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxMzYgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDE2OCB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgMjAwIHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTIyNCwgYWxpZ249MzIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KIAogc3RydWN0IE8gOiB2aXJ0dWFsIEMwLCB2aXJ0dWFsIEIxLCB2aXJ0dWFsIEIyLCB2aXJ0dWFsIEQxLCB2aXJ0dWFsIEIzLCB2aXJ0dWFsIEI0IHsKIAlfX2RlY2xzcGVjKGFsaWduKDMyKSkgaW50IGE7CkBAIC00NDcsMzEgKzQ2NywzMSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBPCi0vLyBDSEVDSzogICAgMCB8ICAgKE8gdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSzogICA2NCB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA2NCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNzIgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDEwNCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgMTMyIHwgICBzdHJ1Y3QgRDEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxNjggfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDIwMCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0yMjQsIGFsaWduPTMyCi0vLyBDSEVDSzogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MzJdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IE8KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChPIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNzIgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTA0IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogIDEzMiB8ICAgc3RydWN0IEQxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAxNjggfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMjAwIHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjI0LCBhbGlnbj0zMgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MzJdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgTwotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoTyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNzIgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAxMDQgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAxMzIgfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAxNjggfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAyMDAgfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTIyNCwgYWxpZ249MzIKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MzJdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBPCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKE8gdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNzIgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDEwNCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTMyIHwgICBzdHJ1Y3QgRDEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxNjggfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDIwMCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yMjQsIGFsaWduPTMyCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MzJdCiAKIHN0cnVjdCBQIDogdmlydHVhbCBCMSwgdmlydHVhbCBDMCwgdmlydHVhbCBEMSwgdmlydHVhbCBCMiwgdmlydHVhbCBCMywgdmlydHVhbCBCNCB7CiAJX19kZWNsc3BlYyhhbGlnbigzMikpIGludCBhOwpAQCAtNDc5LDMxICs0OTksMzEgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgUAotLy8gQ0hFQ0s6ICAgIDAgfCAgIChQIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICA2NCB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA2NCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNjggfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDEwNCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgMTM2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxNjggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTkyLCBhbGlnbj0zMgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBQCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoUCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA2OCB8ICAgc3RydWN0IEQxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAxMDQgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTM2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogIDE2OCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE5MiwgYWxpZ249MzIKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IFAKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKFAgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDY4IHwgICBzdHJ1Y3QgRDEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgMTA0IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgMTM2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgMTY4IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0xOTIsIGFsaWduPTMyCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgUAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChQIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjggfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDEwNCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTM2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxNjggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTkyLCBhbGlnbj0zMgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQogCiBzdHJ1Y3QgUSA6IHZpcnR1YWwgQjEsIHZpcnR1YWwgQzAsIHZpcnR1YWwgQjIsIHZpcnR1YWwgRDEsIHZpcnR1YWwgQjMsIHZpcnR1YWwgQjQgewogCV9fZGVjbHNwZWMoYWxpZ24oMzIpKSBpbnQgYTsKQEAgLTUxMSwzMSArNTMxLDMxIEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IFEKLS8vIENIRUNLOiAgICAwIHwgICAoUSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDY0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgNjQgfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDcyIHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxMDAgfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDEzNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgMTY4IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTE5MiwgYWxpZ249MzIKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgUQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKFEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNzIgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTAwIHwgICBzdHJ1Y3QgRDEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogIDEzNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAxNjggfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xOTIsIGFsaWduPTMyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBRCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChRIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA3MiB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDEwMCB8ICAgc3RydWN0IEQxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDEzNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogIDE2OCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTkyLCBhbGlnbj0zMgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IFEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoUSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDcyIHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxMDAgfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDEzNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTY4IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE5MiwgYWxpZ249MzIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KIAogc3RydWN0IFIgOiB2aXJ0dWFsIEIwLCB2aXJ0dWFsIEIxLCB2aXJ0dWFsIEIyLCB2aXJ0dWFsIEMwLCB2aXJ0dWFsIEIzLCB2aXJ0dWFsIEI0IHsKIAlfX2RlY2xzcGVjKGFsaWduKDMyKSkgaW50IGE7CkBAIC01NDMsMzEgKzU2MywzMSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBSCi0vLyBDSEVDSzogICAgMCB8ICAgKFIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSzogICA2NCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDcyIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxMDQgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDEwNCB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogIDEwNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAxMTIgfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogIDEzNiB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xNjAsIGFsaWduPTMyCi0vLyBDSEVDSzogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MzJdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFIKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChSIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICA3MiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAxMDQgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTA0IHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAxMDQgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAxMTIgfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTM2IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYwLCBhbGlnbj0zMgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MzJdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgUgotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoUiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgNzIgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAxMDQgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAxMDQgfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgMTA0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAxMTIgfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAxMzYgfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTE2MCwgYWxpZ249MzIKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MzJdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBSCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKFIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDcyIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxMDQgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDEwNCB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogIDEwNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxMTIgfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDEzNiB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0xNjAsIGFsaWduPTMyCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MzJdCiAKIHN0cnVjdCBTIDogdmlydHVhbCBCMCwgdmlydHVhbCBCMSwgdmlydHVhbCBDMCwgdmlydHVhbCBCMiwgdmlydHVhbCBCMywgdmlydHVhbCBCNCB7CiAJX19kZWNsc3BlYyhhbGlnbigzMikpIGludCBhOwpAQCAtNTc1LDMxICs1OTUsMzEgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgUwotLy8gQ0hFQ0s6ICAgIDAgfCAgIChTIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICA3MiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDcyIHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDcyIHwgICAgIGludCBhCi0vLyBDSEVDSzogICA4MCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgMTA0IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxMzYgfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTYwLCBhbGlnbj0zMgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBTCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoUyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgNzIgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgIDcyIHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNzIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgODAgfCAgIHN0cnVjdCBCMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTA0IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogIDEzNiB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2MCwgYWxpZ249MzIKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IFMKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKFMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDcyIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDcyIHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA3MiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDgwIHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgMTA0IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgMTM2IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0xNjAsIGFsaWduPTMyCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgUworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChTIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICA3MiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDcyIHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDcyIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTA0IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxMzYgfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTYwLCBhbGlnbj0zMgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQogCiBzdHJ1Y3QgVCA6IHZpcnR1YWwgQjAsIHZpcnR1YWwgQjEsIHZpcnR1YWwgQzAsIHZpcnR1YWwgRDIsIHZpcnR1YWwgQjIsIHZpcnR1YWwgQjMsIHZpcnR1YWwgQjQgewogCV9fZGVjbHNwZWMoYWxpZ24oMTYpKSBpbnQgYTsKQEAgLTYwNywzNSArNjI3LDM3IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IFQKLS8vIENIRUNLOiAgICAwIHwgICAoVCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxNiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgNDAgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICA0MCB8ICAgc3RydWN0IEMwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA0MCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNDQgfCAgIHN0cnVjdCBEMiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNDQgfCAgICAgaW50IFs4XSBhCi0vLyBDSEVDSzogICA4MCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDg4IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAxMDQgfCAgIHN0cnVjdCBCNCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTEyLCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChUIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICA0MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgNDAgfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA0MCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA0NCB8ICAgc3RydWN0IEQyICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDQ0IHwgICAgIGludCBbOF0gYQorLy8gQ0hFQ0stTkVYVDogICA4MCB8ICAgc3RydWN0IEIyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgODggfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgMTA0IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTEyLCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgVAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoVCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgIHN0cnVjdCBDMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQwIHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDQgfCAgIHN0cnVjdCBEMiAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQ0IHwgICAgIGludCBbOF0gYQotLy8gQ0hFQ0stWDY0OiAgIDgwIHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDg4IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgMTA0IHwgICBzdHJ1Y3QgQjQgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0xMTIsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChUIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICBzdHJ1Y3QgQzAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA0NCB8ICAgc3RydWN0IEQyICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0NCB8ICAgICBpbnQgWzhdIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDgwIHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgODggfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogIDEwNCB8ICAgc3RydWN0IEI0ICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0xMTIsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBfX2RlY2xzcGVjKGFsaWduKDMyKSkgVSA6IHZpcnR1YWwgQjAsIHZpcnR1YWwgQjEgewogCWludCBhOwpAQCAtNjQzLDIxICs2NjUsMjEgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgVQotLy8gQ0hFQ0s6ICAgIDAgfCAgIChVIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICA0MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MzIKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFUKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChVIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICA0MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0zMgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj0zMl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBVCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChVIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICA0MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTMyCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBVCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKFUgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0zMgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTMyXQogCiBzdHJ1Y3QgX19kZWNsc3BlYyhhbGlnbigzMikpIFYgOiB2aXJ0dWFsIEQxIHsKIAlpbnQgYTsKQEAgLTY2NSwxOSArNjg3LDgyIEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IFYKLS8vIENIRUNLOiAgICAwIHwgICAoViB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgaW50IGEKLS8vIENIRUNLOiAgICA4IHwgICBzdHJ1Y3QgRDEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTMyLCBhbGlnbj0zMgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKFYgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MzIKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249MzJdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgVgotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoViB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTMyLCBhbGlnbj0zMgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChWIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBEMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MzIsIGFsaWduPTMyCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249MzJdCisKK3N0cnVjdCBUMCB7fTsKK3N0cnVjdCBUMSA6IFQwIHsgY2hhciBhOyB9Oworc3RydWN0IFQzIDogdmlydHVhbCBUMSwgdmlydHVhbCBUMCB7IGxvbmcgbG9uZyBhOyB9OworCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFQzCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoVDMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgbG9uZyBsb25nIGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBUMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBzdHJ1Y3QgVDAgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgVDAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBUMworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChUMyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgbG9uZyBsb25nIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgVDEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIHN0cnVjdCBUMCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IFQwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisKK3N0cnVjdCBRMEEge307CitzdHJ1Y3QgUTBCIHsgY2hhciBRMEJGaWVsZDsgfTsKK3N0cnVjdCBRMEMgOiB2aXJ0dWFsIFEwQSwgdmlydHVhbCBRMEIgeyBjaGFyIFEwQ0ZpZWxkOyB9Oworc3RydWN0IFEwRCA6IFEwQywgUTBBIHt9OworCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgUTBECisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgUTBDIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAoUTBDIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgY2hhciBRMENGaWVsZAorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IFEwQSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IFEwQSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgUTBCICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAgIGNoYXIgUTBCRmllbGQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTksIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IFEwRAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBRMEMgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAoUTBDIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIGNoYXIgUTBDRmllbGQKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgUTBBIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IFEwQSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IFEwQiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgY2hhciBRMEJGaWVsZAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KIAogaW50IGFbCiBzaXplb2YoQSkrCkBAIC03MDEsNCArNzg2LDYgQEAKIHNpemVvZihTKSsKIHNpemVvZihUKSsKIHNpemVvZihVKSsKLXNpemVvZihWKV07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorc2l6ZW9mKFYpKworc2l6ZW9mKFQzKSsKK3NpemVvZihRMEQpXTsKZGlmZiAtLWdpdCBhL3Rlc3QvTGF5b3V0L21zLXg4Ni1sYXp5LWVtcHR5LW5vbnZpcnR1YWwtYmFzZS5jcHAgYi90ZXN0L0xheW91dC9tcy14ODYtbGF6eS1lbXB0eS1ub252aXJ0dWFsLWJhc2UuY3BwCmluZGV4IDdkZDNmYWQuLjViZWE4NzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvTGF5b3V0L21zLXg4Ni1sYXp5LWVtcHR5LW5vbnZpcnR1YWwtYmFzZS5jcHAKKysrIGIvdGVzdC9MYXlvdXQvbXMteDg2LWxhenktZW1wdHktbm9udmlydHVhbC1iYXNlLmNwcApAQCAtMSw2ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAtY3h4LWFiaSBtaWNyb3NvZnQgJXMgMj4vZGV2L251bGwgXAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5ICVzIDI+L2Rldi9udWxsIFwKIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSB4ODZfNjQtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+L2Rldi9udWxsIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgeDg2XzY0LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5ICVzIDI+L2Rldi9udWxsIFwKIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IENIRUNLLVg2NAogCiBleHRlcm4gIkMiIGludCBwcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pOwpAQCAtMjQsNjg3ICsyNCw3NDcgQEAKIHN0cnVjdCBCNFggeyBCNFgoKSB7IHByaW50ZigiQjQgPSAlcFxuIiwgdGhpcyk7IH0gfTsKIHN0cnVjdCBCNVggeyBCNVgoKSB7IHByaW50ZigiQjUgPSAlcFxuIiwgdGhpcyk7IH0gfTsKIHN0cnVjdCBCNlggeyBCNlgoKSB7IHByaW50ZigiQjYgPSAlcFxuIiwgdGhpcyk7IH0gfTsKLXN0cnVjdCBCOFggeyBzaG9ydCBhOyBCOFgoKSA6IGEoMHhmMDAwMDBCOCkgeyBwcmludGYoIkI4ID0gJXBcbiIsIHRoaXMpOyB9IH07CitzdHJ1Y3QgQjhYIHsgc2hvcnQgYTsgQjhYKCkgOiBhKDB4MDAwMDAwQjgpIHsgcHJpbnRmKCJCOCA9ICVwXG4iLCB0aGlzKTsgfSB9OwogCiBzdHJ1Y3QgQUEgOiBCOCwgQjEsIHZpcnR1YWwgQjAgewogCWludCBhOwotCUFBKCkgOiBhKDB4ZjAwMDAwQUEpIHsgcHJpbnRmKCJBQSA9ICVwXG4iLCB0aGlzKTsgfQorCUFBKCkgOiBhKDB4MDAwMDAwQUEpIHsgcHJpbnRmKCJBQSA9ICVwXG4iLCB0aGlzKTsgfQogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBQQotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCOCAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGNoYXIgWzVdIGMKLS8vIENIRUNLOiAgIDEzIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA4IHwgICAoQUEgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSzogICAyMCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0yMCwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTIwLCBudmFsaWduPTRdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEFBCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjggKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzVdIGMKKy8vIENIRUNLLU5FWFQ6ICAgMTMgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEFBIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjAsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTIwLCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQUEKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEI4IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIGNoYXIgWzVdIGMKLS8vIENIRUNLLVg2NDogICAxNyB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIChBQSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMjAgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBQQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCOCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzVdIGMKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE3IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoQUEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjAgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKIHN0cnVjdCBBQiA6IEI4LCBCMSwgdmlydHVhbCBCMCB7CiAJc2hvcnQgYTsKLQlBQigpIDogYSgweGYwMDAwMEFCKSB7IHByaW50ZigiQUIgPSAlcFxuIiwgdGhpcyk7IH0KKwlBQigpIDogYSgweDAwMDAwMEFCKSB7IHByaW50ZigiQUIgPSAlcFxuIiwgdGhpcyk7IH0KIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQUIKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjggKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICBjaGFyIFs1XSBjCi0vLyBDSEVDSzogICAxMyB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgOCB8ICAgKEFCIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE0IHwgICBzaG9ydCBhCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEFCCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjggKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzVdIGMKKy8vIENIRUNLLU5FWFQ6ICAgMTMgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEFCIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTQgfCAgIHNob3J0IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBBQgotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjggKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgY2hhciBbNV0gYwotLy8gQ0hFQ0stWDY0OiAgIDE3IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEFCIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxOCB8ICAgc2hvcnQgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQUIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjggKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBjaGFyIFs1XSBjCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNyB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgKEFCIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE4IHwgICBzaG9ydCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKIHN0cnVjdCBBQyA6IEI4LCBCMSwgdmlydHVhbCBCMCB7CiAJY2hhciBhOwotCUFDKCkgOiBhKDB4ZjAwMDAwQUMpIHsgcHJpbnRmKCJBQyA9ICVwXG4iLCB0aGlzKTsgfQorCUFDKCkgOiBhKDB4MDAwMDAwQUMpIHsgcHJpbnRmKCJBQyA9ICVwXG4iLCB0aGlzKTsgfQogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBQwotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCOCAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGNoYXIgWzVdIGMKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA4IHwgICAoQUMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTIgfCAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBBQworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEI4IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICBjaGFyIFs1XSBjCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIChBQyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBBQwotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjggKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgY2hhciBbNV0gYwotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEFDIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBQworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCOCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzVdIGMKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoQUMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgQUQgOiBCOCwgQjEsIHZpcnR1YWwgQjAgewogCUFEKCkgeyBwcmludGYoIkFEID0gJXBcbiIsIHRoaXMpOyB9CiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEFECi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEI4IChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgY2hhciBbNV0gYwotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDggfCAgIChBRCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEFECisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjggKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzVdIGMKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEFEIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MTIsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBBRAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjggKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgY2hhciBbNV0gYwotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEFEIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEFECisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEI4IChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgY2hhciBbNV0gYworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChBRCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCiAKIHN0cnVjdCBBQTEgOiBCOSwgQjEsIHZpcnR1YWwgQjAgewogCWludCBhOwotCUFBMSgpIDogYSgweGYwMDAwQUExKSB7IHByaW50ZigiQUExID0gJXBcbiIsIHRoaXMpOyB9CisJQUExKCkgOiBhKDB4MDAwMDBBQTEpIHsgcHJpbnRmKCJBQTEgPSAlcFxuIiwgdGhpcyk7IH0KIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQUExCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEI5IChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgY2hhciBbNl0gYwotLy8gQ0hFQ0s6ICAgMTQgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDggfCAgIChBQTEgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSzogICAyMCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0yMCwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTIwLCBudmFsaWduPTRdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQUExCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjkgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzZdIGMKKy8vIENIRUNLLU5FWFQ6ICAgMTQgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEFBMSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTIwLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0yMCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEFBMQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjkgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgY2hhciBbNl0gYwotLy8gQ0hFQ0stWDY0OiAgIDE4IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEFBMSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMjAgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBQTEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjkgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBjaGFyIFs2XSBjCisvLyBDSEVDSy1YNjQtTkVYVDogICAxOCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgKEFBMSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyMCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KIAogc3RydWN0IEFCMSA6IEI5LCBCMSwgdmlydHVhbCBCMCB7CiAJc2hvcnQgYTsKLQlBQjEoKSA6IGEoMHhmMDAwMEFCMSkgeyBwcmludGYoIkFCMSA9ICVwXG4iLCB0aGlzKTsgfQorCUFCMSgpIDogYSgweDAwMDAwQUIxKSB7IHByaW50ZigiQUIxID0gJXBcbiIsIHRoaXMpOyB9CiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEFCMQotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCOSAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGNoYXIgWzZdIGMKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA4IHwgICAoQUIxIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDEyIHwgICBzaG9ydCBhCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEFCMQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEI5IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICBjaGFyIFs2XSBjCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIChBQjEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc2hvcnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEFCMQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjkgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgY2hhciBbNl0gYwotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEFCMSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHNob3J0IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEFCMQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCOSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzZdIGMKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoQUIxIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzaG9ydCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKIHN0cnVjdCBBQzEgOiBCOSwgQjEsIHZpcnR1YWwgQjAgewogCWNoYXIgYTsKLQlBQzEoKSA6IGEoMHhmMDAwMEFDMSkgeyBwcmludGYoIkFDMSA9ICVwXG4iLCB0aGlzKTsgfQorCUFDMSgpIDogYSgweDAwMDAwMEMxKSB7IHByaW50ZigiQUMxID0gJXBcbiIsIHRoaXMpOyB9CiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEFDMQotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCOSAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGNoYXIgWzZdIGMKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA4IHwgICAoQUMxIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDEyIHwgICBjaGFyIGEKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQUMxCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjkgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzZdIGMKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEFDMSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBBQzEKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEI5IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIGNoYXIgWzZdIGMKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIChBQzEgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEFDMQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCOSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzZdIGMKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoQUMxIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KIAogc3RydWN0IEFEMSA6IEI5LCBCMSwgdmlydHVhbCBCMCB7CiAJQUQxKCkgeyBwcmludGYoIkFEMSA9ICVwXG4iLCB0aGlzKTsgfQogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBRDEKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjkgKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICBjaGFyIFs2XSBjCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgOCB8ICAgKEFEMSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEFEMQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEI5IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICBjaGFyIFs2XSBjCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIChBRDEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTEyLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEFEMQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjkgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgY2hhciBbNl0gYwotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEFEMSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBRDEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjkgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBjaGFyIFs2XSBjCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgKEFEMSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCiAKIHN0cnVjdCBBQTIgOiBCMTAsIEIxLCB2aXJ0dWFsIEIwIHsKIAlpbnQgYTsKLQlBQTIoKSA6IGEoMHhmMDAwMEFBMikgeyBwcmludGYoIkFBMiA9ICVwXG4iLCB0aGlzKTsgfQorCUFBMigpIDogYSgweDAwMDAwQUEyKSB7IHByaW50ZigiQUEyID0gJXBcbiIsIHRoaXMpOyB9CiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEFBMgotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMTAgKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICBjaGFyIFs3XSBjCi0vLyBDSEVDSzogICAxNSB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgOCB8ICAgKEFBMiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxNiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDIwIHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTIwLCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MjAsIG52YWxpZ249NF0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBBQTIKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMTAgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzddIGMKKy8vIENIRUNLLU5FWFQ6ICAgMTUgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEFBMiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTIwLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0yMCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEFBMgotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjEwIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIGNoYXIgWzddIGMKLS8vIENIRUNLLVg2NDogICAxOSB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIChBQTIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDIwIHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQUEyCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIxMCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzddIGMKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE5IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoQUEyIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDIwIHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgQUIyIDogQjEwLCBCMSwgdmlydHVhbCBCMCB7CiAJc2hvcnQgYTsKLQlBQjIoKSA6IGEoMHhmMDAwMEFCMikgeyBwcmludGYoIkFCMiA9ICVwXG4iLCB0aGlzKTsgfQorCUFCMigpIDogYSgweDAwMDAwQUIyKSB7IHByaW50ZigiQUIyID0gJXBcbiIsIHRoaXMpOyB9CiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEFCMgotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMTAgKGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICBjaGFyIFs3XSBjCi0vLyBDSEVDSzogICAxMyB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgOCB8ICAgKEFCMiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxNCB8ICAgc2hvcnQgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBBQjIKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMTAgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzddIGMKKy8vIENIRUNLLU5FWFQ6ICAgMTMgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEFCMiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDE0IHwgICBzaG9ydCBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQUIyCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMTAgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgY2hhciBbN10gYwotLy8gQ0hFQ0stWDY0OiAgIDE3IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEFCMiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTggfCAgIHNob3J0IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEFCMgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMTAgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBjaGFyIFs3XSBjCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNyB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgKEFCMiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxOCB8ICAgc2hvcnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgQUMyIDogQjEwLCBCMSwgdmlydHVhbCBCMCB7CiAJY2hhciBhOwotCUFDMigpIDogYSgweGYwMDAwQUMyKSB7IHByaW50ZigiQUMyID0gJXBcbiIsIHRoaXMpOyB9CisJQUMyKCkgOiBhKDB4MDAwMDAwQzIpIHsgcHJpbnRmKCJBQzIgPSAlcFxuIiwgdGhpcyk7IH0KIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQUMyCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIxMCAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGNoYXIgWzddIGMKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA4IHwgICAoQUMyIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDEyIHwgICBjaGFyIGEKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQUMyCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjEwIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICBjaGFyIFs3XSBjCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIChBQzIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQUMyCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMTAgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgY2hhciBbN10gYwotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEFDMiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQUMyCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIxMCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzddIGMKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoQUMyIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KIAogc3RydWN0IEFEMiA6IEIxMCwgQjEsIHZpcnR1YWwgQjAgewogCUFEMigpIHsgcHJpbnRmKCJBRDIgPSAlcFxuIiwgdGhpcyk7IH0KIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQUQyCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIxMCAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGNoYXIgWzddIGMKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA4IHwgICAoQUQyIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTEyLCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MTIsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQUQyCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjEwIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICBjaGFyIFs3XSBjCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIChBRDIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTEyLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEFEMgotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjEwIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIGNoYXIgWzddIGMKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIChBRDIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQUQyCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIxMCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzddIGMKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoQUQyIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KIAogc3RydWN0IEFBMyA6IEIxMSwgQjEsIHZpcnR1YWwgQjAgewogCWludCBhOwotCUFBMygpIDogYSgweGYwMDAwQUEzKSB7IHByaW50ZigiQUEzID0gJXBcbiIsIHRoaXMpOyB9CisJQUEzKCkgOiBhKDB4MDAwMDBBQTMpIHsgcHJpbnRmKCJBQTMgPSAlcFxuIiwgdGhpcyk7IH0KIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQUEzCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIxMSAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGNoYXIgWzhdIGMKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA4IHwgICAoQUEzIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDEyIHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEFBMworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEIxMSAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgY2hhciBbOF0gYworLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAoQUEzIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQUEzCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMTEgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgY2hhciBbOF0gYwotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEFBMyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBQTMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjExIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgY2hhciBbOF0gYworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChBQTMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKIHN0cnVjdCBBQjMgOiBCMTEsIEIxLCB2aXJ0dWFsIEIwIHsKIAlzaG9ydCBhOwotCUFCMygpIDogYSgweGYwMDAwQUIzKSB7IHByaW50ZigiQUIzID0gJXBcbiIsIHRoaXMpOyB9CisJQUIzKCkgOiBhKDB4MDAwMDBBQjMpIHsgcHJpbnRmKCJBQjMgPSAlcFxuIiwgdGhpcyk7IH0KIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQUIzCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIxMSAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGNoYXIgWzhdIGMKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA4IHwgICAoQUIzIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDEyIHwgICBzaG9ydCBhCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEFCMworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEIxMSAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgY2hhciBbOF0gYworLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAoQUIzIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHNob3J0IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBBQjMKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEIxMSAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICBjaGFyIFs4XSBjCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAoQUIzIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc2hvcnQgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQUIzCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIxMSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzhdIGMKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoQUIzIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzaG9ydCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKIHN0cnVjdCBBQzMgOiBCMTEsIEIxLCB2aXJ0dWFsIEIwIHsKIAljaGFyIGE7Ci0JQUMzKCkgOiBhKDB4ZjAwMDBBQzMpIHsgcHJpbnRmKCJBQzMgPSAlcFxuIiwgdGhpcyk7IH0KKwlBQzMoKSA6IGEoMHgwMDAwMDBDMykgeyBwcmludGYoIkFDMyA9ICVwXG4iLCB0aGlzKTsgfQogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBQzMKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjExIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgY2hhciBbOF0gYwotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDggfCAgIChBQzMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTIgfCAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBBQzMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMTEgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzhdIGMKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEFDMyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBBQzMKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEIxMSAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICBjaGFyIFs4XSBjCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAoQUMzIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBQzMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjExIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgY2hhciBbOF0gYworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChBQzMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgQUQzIDogQjExLCBCMSwgdmlydHVhbCBCMCB7CiAJQUQzKCkgeyBwcmludGYoIkFEMyA9ICVwXG4iLCB0aGlzKTsgfQogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBRDMKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjExIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgY2hhciBbOF0gYwotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDggfCAgIChBRDMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTIsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBBRDMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMTEgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzhdIGMKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEFEMyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTIsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQUQzCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMTEgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgY2hhciBbOF0gYwotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEFEMyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBRDMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjExIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgY2hhciBbOF0gYworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChBRDMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgQiA6IEIxLCBCMiwgdmlydHVhbCBCMCB7CiAJQigpIHsgcHJpbnRmKCJCID0gJXBcbiIsIHRoaXMpOyB9CiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEIKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA4IHwgICBzdHJ1Y3QgQjIgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA0IHwgICAoQiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj04LCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEIKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IEIyIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAoQiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEIKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMiAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAoQiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBCCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIyIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgQyA6IEIxLCBCMiwgQjMsIHZpcnR1YWwgQjAgewogCWNoYXIgYTsKLQlDKCkgOiBhKDB4ZjAwMDAwMEMpIHsgcHJpbnRmKCJDID0gJXBcbiIsIHRoaXMpOyB9CisJQygpIDogYSgweDAwMDAwMDBDKSB7IHByaW50ZigiQyA9ICVwXG4iLCB0aGlzKTsgfQogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBDCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgMSB8ICAgc3RydWN0IEIyIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IEIzIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgNCB8ICAgKEMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDggfCAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTIsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgMSB8ICAgc3RydWN0IEIyIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjMgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIChDIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTEyLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEMKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgIDEgfCAgIHN0cnVjdCBCMiAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjMgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAxIHwgICBzdHJ1Y3QgQjIgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjMgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoQyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKIHN0cnVjdCBEIDogQjEsIEIyLCBCMywgQjQsIEI1LCB2aXJ0dWFsIEIwIHsKIAlpbnQgYTsKLQlEKCkgOiBhKDB4ZjAwMDAwMEQpIHsgcHJpbnRmKCJEID0gJXBcbiIsIHRoaXMpOyB9CisJRCgpIDogYSgweDAwMDAwMDBEKSB7IHByaW50ZigiRCA9ICVwXG4iLCB0aGlzKTsgfQogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBECi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgMSB8ICAgc3RydWN0IEIyIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgMiB8ICAgc3RydWN0IEIzIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgMyB8ICAgc3RydWN0IEI0IChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IEI1IChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgNCB8ICAgKEQgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDggfCAgIGludCBhCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBECisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDEgfCAgIHN0cnVjdCBCMiAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgMiB8ICAgc3RydWN0IEIzIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAzIHwgICBzdHJ1Y3QgQjQgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBCNSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgKEQgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MTIsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBECi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAxIHwgICBzdHJ1Y3QgQjIgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgMiB8ICAgc3RydWN0IEIzIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgIDMgfCAgIHN0cnVjdCBCNCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjUgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEQgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDEgfCAgIHN0cnVjdCBCMiAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDIgfCAgIHN0cnVjdCBCMyAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDMgfCAgIHN0cnVjdCBCNCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCNSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChEIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgRSA6IEIxLCBCNiwgQjMsIEI0LCBCNSwgdmlydHVhbCBCMCB7CiAJaW50IGE7Ci0JRSgpIDogYSgweGYwMDAwMDBFKSB7IHByaW50ZigiRSA9ICVwXG4iLCB0aGlzKTsgfQorCUUoKSA6IGEoMHgwMDAwMDAwRSkgeyBwcmludGYoIkUgPSAlcFxuIiwgdGhpcyk7IH0KIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRQotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDIgfCAgIHN0cnVjdCBCNiAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDMgfCAgIHN0cnVjdCBCMyAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDQgfCAgIHN0cnVjdCBCNCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMTMgfCAgIHN0cnVjdCBCNSAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDggfCAgIChFIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMjAgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MjAsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0yMCwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEUKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgMiB8ICAgc3RydWN0IEI2IChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAzIHwgICBzdHJ1Y3QgQjMgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIHN0cnVjdCBCNCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAxMyB8ICAgc3RydWN0IEI1IChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAoRSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTIwLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0yMCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEUKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgIDIgfCAgIHN0cnVjdCBCNiAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAzIHwgICBzdHJ1Y3QgQjMgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgNCB8ICAgc3RydWN0IEI0IChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMTcgfCAgIHN0cnVjdCBCNSAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAoRSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMjAgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBFCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMiB8ICAgc3RydWN0IEI2IChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMyB8ICAgc3RydWN0IEIzIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgNCB8ICAgc3RydWN0IEI0IChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNyB8ICAgc3RydWN0IEI1IChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgKEUgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjAgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKIHN0cnVjdCBGIDogQjEsIEI2LCBCNCwgQjgsIEI1LCB2aXJ0dWFsIEIwIHsKIAlpbnQgYTsKLQlGKCkgOiBhKDB4ZjAwMDAwMEYpIHsgcHJpbnRmKCImYSA9ICVwXG4iLCAmYSk7IHByaW50ZigiRiA9ICVwXG4iLCB0aGlzKTsgfQorCUYoKSA6IGEoMHgwMDAwMDAwRikgeyBwcmludGYoIiZhID0gJXBcbiIsICZhKTsgcHJpbnRmKCJGID0gJXBcbiIsIHRoaXMpOyB9CiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEYKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAyIHwgICBzdHJ1Y3QgQjYgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAzIHwgICBzdHJ1Y3QgQjQgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAzIHwgICBzdHJ1Y3QgQjggKGJhc2UpCi0vLyBDSEVDSzogICAgMyB8ICAgICBjaGFyIFs1XSBjCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IEI1IChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgOCB8ICAgKEYgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTIgfCAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEYKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgMiB8ICAgc3RydWN0IEI2IChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAzIHwgICBzdHJ1Y3QgQjQgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDMgfCAgIHN0cnVjdCBCOCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDMgfCAgICAgY2hhciBbNV0gYworLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEI1IChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAoRiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEYKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEIxIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgIDIgfCAgIHN0cnVjdCBCNiAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAzIHwgICBzdHJ1Y3QgQjQgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgMyB8ICAgc3RydWN0IEI4IChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAzIHwgICAgIGNoYXIgWzVdIGMKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEI1IChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIChGIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAyIHwgICBzdHJ1Y3QgQjYgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAzIHwgICBzdHJ1Y3QgQjQgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAzIHwgICBzdHJ1Y3QgQjggKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMyB8ICAgICBjaGFyIFs1XSBjCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEI1IChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgKEYgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKIHN0cnVjdCBHIDogQjgsIEIxLCB2aXJ0dWFsIEIwIHsKIAlpbnQgYTsKIAlfX2RlY2xzcGVjKGFsaWduKDE2KSkgaW50IGExOwotCUcoKSA6IGEoMHhmMDAwMDAxMCksIGExKDB4ZjAwMDAwMTApIHsgcHJpbnRmKCJHID0gJXBcbiIsIHRoaXMpOyB9CisJRygpIDogYSgweDAwMDAwMDEwKSwgYTEoMHhmMDAwMDAxMCkgeyBwcmludGYoIkcgPSAlcFxuIiwgdGhpcyk7IH0KIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRwotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCOCAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGNoYXIgWzVdIGMKLS8vIENIRUNLOiAgIDIxIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA4IHwgICAoRyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAyNCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICBpbnQgYTEKLS8vIENIRUNLOiAgIDQ4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTQ4LCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBHCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjggKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzVdIGMKKy8vIENIRUNLLU5FWFQ6ICAgMjEgfCAgIHN0cnVjdCBCMSAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEcgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIGludCBhMQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQ4LCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRwotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjggKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgY2hhciBbNV0gYwotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEcgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBpbnQgYTEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NDgsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCOCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGNoYXIgWzVdIGMKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDIxIHwgICBzdHJ1Y3QgQjEgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoRyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBpbnQgYTEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQ4LCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgQVggOiBCMVgsIEIyWCwgQjNYLCBCNFgsIHZpcnR1YWwgQjBYIHsKIAlpbnQgYTsKLQlBWCgpIDogYSgweGYwMDAwMDBBKSB7IHByaW50ZigiIEEgPSAlcFxuIiwgdGhpcyk7IH0KKwlBWCgpIDogYSgweDAwMDAwMDBBKSB7IHByaW50ZigiIEEgPSAlcFxuIiwgdGhpcyk7IH0KIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQVgKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjFYIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEIyWCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgMTggfCAgIHN0cnVjdCBCM1ggKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgIDM1IHwgICBzdHJ1Y3QgQjRYIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAyMCB8ICAgKEFYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDM2IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNDggfCAgIHN0cnVjdCBCMFggKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTQ4LCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQVgKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMVggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMlggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMTggfCAgIHN0cnVjdCBCM1ggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMzUgfCAgIHN0cnVjdCBCNFggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgIChBWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDM2IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgc3RydWN0IEIwWCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEFYCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMVggKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIyWCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDE4IHwgICBzdHJ1Y3QgQjNYIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMzMgfCAgIHN0cnVjdCBCNFggKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgKEFYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzNiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgc3RydWN0IEIwWCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTQ4LCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEFYCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIxWCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMlggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE4IHwgICBzdHJ1Y3QgQjNYIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzNSB8ICAgc3RydWN0IEI0WCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIChBWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzNiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgQjBYICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IEJYIDogQjJYLCBCMVgsIEIzWCwgQjRYLCB2aXJ0dWFsIEIwWCB7CiAJaW50IGE7Ci0JQlgoKSA6IGEoMHhmMDAwMDAwQikgeyBwcmludGYoIiBCID0gJXBcbiIsIHRoaXMpOyB9CisJQlgoKSA6IGEoMHgwMDAwMDAwQikgeyBwcmludGYoIiBCID0gJXBcbiIsIHRoaXMpOyB9CiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEJYCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIyWCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDEgfCAgIHN0cnVjdCBCMVggKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAyIHwgICBzdHJ1Y3QgQjNYIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAxOSB8ICAgc3RydWN0IEI0WCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDQgfCAgIChCWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAyMCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICBzdHJ1Y3QgQjBYICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0zMiwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQlgKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMlggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDEgfCAgIHN0cnVjdCBCMVggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDIgfCAgIHN0cnVjdCBCM1ggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMTkgfCAgIHN0cnVjdCBCNFggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIChCWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgc3RydWN0IEIwWCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEJYCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMlggKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgMSB8ICAgc3RydWN0IEIxWCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAyIHwgICBzdHJ1Y3QgQjNYIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgMTcgfCAgIHN0cnVjdCBCNFggKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEJYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAyMCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgc3RydWN0IEIwWCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTMyLCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0zMiwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEJYCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIyWCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDEgfCAgIHN0cnVjdCBCMVggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAyIHwgICBzdHJ1Y3QgQjNYIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxOSB8ICAgc3RydWN0IEI0WCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChCWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyMCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBzdHJ1Y3QgQjBYICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0zMiwgbnZhbGlnbj0xNl0KIAogc3RydWN0IENYIDogQjFYLCBCM1gsIEIyWCwgdmlydHVhbCBCMFggewogCWludCBhOwotCUNYKCkgOiBhKDB4ZjAwMDAwMEMpIHsgcHJpbnRmKCIgQyA9ICVwXG4iLCB0aGlzKTsgfQorCUNYKCkgOiBhKDB4MDAwMDAwMEMpIHsgcHJpbnRmKCIgQyA9ICVwXG4iLCB0aGlzKTsgfQogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBDWAotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMVggKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAyIHwgICBzdHJ1Y3QgQjNYIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAzMiB8ICAgc3RydWN0IEIyWCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0s6ICAgIDQgfCAgIChDWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDQ4IHwgICBzdHJ1Y3QgQjBYICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQ1gKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMVggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDIgfCAgIHN0cnVjdCBCM1ggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgIHN0cnVjdCBCMlggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIChDWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgc3RydWN0IEIwWCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IENYCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMVggKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgMiB8ICAgc3RydWN0IEIzWCAoYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBzdHJ1Y3QgQjJYIChiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIChDWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIHN0cnVjdCBCMFggKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBDWAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMVggKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAyIHwgICBzdHJ1Y3QgQjNYIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgc3RydWN0IEIyWCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIChDWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgQjBYICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IERYIDogQjhYLCBCMVgsIHZpcnR1YWwgQjBYIHsKIAlpbnQgYTsKLQlEWCgpIDogYSgweGYwMDAwMDBEKSB7IHByaW50ZigiIEQgPSAlcFxuIiwgdGhpcyk7IH0KKwlEWCgpIDogYSgweDAwMDAwMDBEKSB7IHByaW50ZigiIEQgPSAlcFxuIiwgdGhpcyk7IH0KIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRFgKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjhYIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgc2hvcnQgYQotLy8gQ0hFQ0s6ICAgMTAgfCAgIHN0cnVjdCBCMVggKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLOiAgICA0IHwgICAoRFggdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTIgfCAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEIwWCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IERYCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjhYIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICBzaG9ydCBhCisvLyBDSEVDSy1ORVhUOiAgIDEwIHwgICBzdHJ1Y3QgQjFYIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAoRFggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMFggKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRFgKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEI4WCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICBzaG9ydCBhCi0vLyBDSEVDSy1YNjQ6ICAgMTggfCAgIHN0cnVjdCBCMVggKGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKERYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAyMCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgc3RydWN0IEIwWCAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBEWAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCOFggKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBzaG9ydCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxOCB8ICAgc3RydWN0IEIxWCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChEWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyMCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQjBYICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisKKworc3RydWN0IEMwIHt9Oworc3RydWN0IEMxIDogcHVibGljIEMwIHsgaW50IEMxRjA7IH07CitzdHJ1Y3QgQzIgOiBwdWJsaWMgQzEsIHB1YmxpYyBDMCB7fTsKKworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBDMgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEMxIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICBzdHJ1Y3QgQzAgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgaW50IEMxRjAKKy8vIENIRUNLLU5FWFQ6ICAgIDUgfCAgIHN0cnVjdCBDMCAoYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQzIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQzEgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBzdHJ1Y3QgQzAgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGludCBDMUYwCisvLyBDSEVDSy1YNjQtTkVYVDogICAgNSB8ICAgc3RydWN0IEMwIChiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249NAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KIAogaW50IGFbCiBzaXplb2YoQUEpKwpAQCAtNzMyLDQgKzc5Miw1IEBACiBzaXplb2YoQVgpKwogc2l6ZW9mKEJYKSsKIHNpemVvZihDWCkrCi1zaXplb2YoRFgpXTsKK3NpemVvZihEWCkrCitzaXplb2YoQzIpXTsKZGlmZiAtLWdpdCBhL3Rlc3QvTGF5b3V0L21zLXg4Ni1tZW1iZXItcG9pbnRlcnMuY3BwIGIvdGVzdC9MYXlvdXQvbXMteDg2LW1lbWJlci1wb2ludGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkZDIxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1tZW1iZXItcG9pbnRlcnMuY3BwCkBAIC0wLDAgKzEsODAgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZtcy1leHRlbnNpb25zIC1mc3ludGF4LW9ubHkgJXMgMj4mMSB8IEZpbGVDaGVjayAlcworCitzdHJ1Y3QgX19zaW5nbGVfaW5oZXJpdGFuY2UgUzsKK3N0cnVjdCBfX211bHRpcGxlX2luaGVyaXRhbmNlIE07CitzdHJ1Y3QgX192aXJ0dWFsX2luaGVyaXRhbmNlIFY7CitzdHJ1Y3QgVTsKKworc3RydWN0IFNEIHsgY2hhciBhOyBpbnQgUzo6Km1wOyB9Oworc3RydWN0IE1EIHsgY2hhciBhOyBpbnQgTTo6Km1wOyB9Oworc3RydWN0IFZEIHsgY2hhciBhOyBpbnQgVjo6Km1wOyB9Oworc3RydWN0IFVEIHsgY2hhciBhOyBpbnQgVTo6Km1wOyB9Oworc3RydWN0IFNGIHsgY2hhciBhOyBpbnQgKFM6OiptcCkoKTsgfTsKK3N0cnVjdCBNRiB7IGNoYXIgYTsgaW50IChNOjoqbXApKCk7IH07CitzdHJ1Y3QgVkYgeyBjaGFyIGE7IGludCAoVjo6Km1wKSgpOyB9Oworc3RydWN0IFVGIHsgY2hhciBhOyBpbnQgKFU6OiptcCkoKTsgfTsKKworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFNECisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIGludCBzdHJ1Y3QgUzo6KiBtcAorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgTUQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgaW50IHN0cnVjdCBNOjoqIG1wCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj04LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCisKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBWRAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBpbnQgc3RydWN0IFY6OiogbXAKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQorCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVUQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgaW50IHN0cnVjdCBVOjoqIG1wCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFNGCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIGludCAoc3RydWN0IFM6OiopKHZvaWQpIF9fYXR0cmlidXRlX18oKHRoaXNjYWxsKSkgbXAKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KKworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IE1GCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIGludCAoc3RydWN0IE06OiopKHZvaWQpIF9fYXR0cmlidXRlX18oKHRoaXNjYWxsKSkgbXAKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQorCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVkYKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgaW50IChzdHJ1Y3QgVjo6Kikodm9pZCkgX19hdHRyaWJ1dGVfXygodGhpc2NhbGwpKSBtcAorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBVRgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBpbnQgKHN0cnVjdCBVOjoqKSh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh0aGlzY2FsbCkpIG1wCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKworY2hhciBhW3NpemVvZihTRCkgKworICAgICAgIHNpemVvZihNRCkgKworICAgICAgIHNpemVvZihWRCkgKworICAgICAgIHNpemVvZihVRCkgKworICAgICAgIHNpemVvZihTRikgKworICAgICAgIHNpemVvZihNRikgKworICAgICAgIHNpemVvZihWRikgKworICAgICAgIHNpemVvZihVRildOwpkaWZmIC0tZ2l0IGEvdGVzdC9MYXlvdXQvbXMteDg2LW1pc2FsaWduZWRhcnJheS5jcHAgYi90ZXN0L0xheW91dC9tcy14ODYtbWlzYWxpZ25lZGFycmF5LmNwcAppbmRleCBmNjg4N2RhLi5kZTViY2M3IDEwMDY0NAotLS0gYS90ZXN0L0xheW91dC9tcy14ODYtbWlzYWxpZ25lZGFycmF5LmNwcAorKysgYi90ZXN0L0xheW91dC9tcy14ODYtbWlzYWxpZ25lZGFycmF5LmNwcApAQCAtMSwyMyArMSwyNyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5IC1jeHgtYWJpIG1pY3Jvc29mdCAlcyAyPiYxIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAlcyAyPiYxIFwKIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSB4ODZfNjQtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+L2Rldi9udWxsIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgeDg2XzY0LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5ICVzIDI+L2Rldi9udWxsIFwKIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IENIRUNLLVg2NAogCi1zdHJ1Y3QgVDAgeyBjaGFyIGM7IH07DQotc3RydWN0IFQyIDogdmlydHVhbCBUMCB7IH07DQotc3RydWN0IFQzIHsgVDIgYVsxXTsgY2hhciBjOyB9Ow0KK3N0cnVjdCBUMCB7IGNoYXIgYzsgfTsKK3N0cnVjdCBUMiA6IHZpcnR1YWwgVDAgeyB9Oworc3RydWN0IFQzIHsgVDIgYVsxXTsgY2hhciBjOyB9OwogCi0vLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQNCi0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBUMw0KLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgVDIgWzFdIGENCi0vLyBDSEVDSzogICAgNSB8ICAgY2hhciBjDQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTgsIGFsaWduPTQNCi0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQ0KLS8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQNCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgVDMNCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBUMiBbMV0gYQ0KLS8vIENIRUNLLVg2NDogICAxNiB8ICAgY2hhciBjDQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OA0KLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0NCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFQzCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgVDIgWzFdIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDUgfCAgIGNoYXIgYworLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgVDMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgVDIgWzFdIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBjaGFyIGMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKIGludCBhW3NpemVvZihUMyldOwpkaWZmIC0tZ2l0IGEvdGVzdC9MYXlvdXQvbXMteDg2LXBhY2stYW5kLWFsaWduLmNwcCBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1wYWNrLWFuZC1hbGlnbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkZTcyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1wYWNrLWFuZC1hbGlnbi5jcHAKQEAgLTAsMCArMSw0MzIgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAlcyAyPiYxIFwKKy8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSB4ODZfNjQtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgJXMgMj4vZGV2L251bGwgXAorLy8gUlVOOiAgICAgICAgICAgIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXggQ0hFQ0stWDY0CisKK2V4dGVybiAiQyIgaW50IHByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7CitjaGFyIGJ1ZmZlcls0MTk0MzA0MDBdOworCitzdHJ1Y3QgQSB7CisJY2hhciBhOworCUEoKSB7CisJCXByaW50ZigiQSAgID0gJWRcbiIsIChpbnQpKChjaGFyKil0aGlzIC0gYnVmZmVyKSk7CisJCXByaW50ZigiQS5hID0gJWRcbiIsIChpbnQpKChjaGFyKikmYSAtIGJ1ZmZlcikpOworCX0KK307CisKK3N0cnVjdCBCIHsKKwlfX2RlY2xzcGVjKGFsaWduKDQpKSBsb25nIGxvbmcgYTsKKwlCKCkgeworCQlwcmludGYoIkIgICA9ICVkXG4iLCAoaW50KSgoY2hhciopdGhpcyAtIGJ1ZmZlcikpOworCQlwcmludGYoIkIuYSA9ICVkXG4iLCAoaW50KSgoY2hhciopJmEgLSBidWZmZXIpKTsKKwl9Cit9OworCisjcHJhZ21hIHBhY2socHVzaCwgMikKK3N0cnVjdCBYIHsKKwlCIGE7CisJY2hhciBiOworCWludCBjOworCVgoKSB7CisJCXByaW50ZigiWCAgID0gJWRcbiIsIChpbnQpKChjaGFyKil0aGlzIC0gYnVmZmVyKSk7CisJCXByaW50ZigiWC5hID0gJWRcbiIsIChpbnQpKChjaGFyKikmYSAtIGJ1ZmZlcikpOworCQlwcmludGYoIlguYiA9ICVkXG4iLCAoaW50KSgoY2hhciopJmIgLSBidWZmZXIpKTsKKwkJcHJpbnRmKCJYLmMgPSAlZFxuIiwgKGludCkoKGNoYXIqKSZjIC0gYnVmZmVyKSk7CisJfQorfTsKKworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgWAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEIgYQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICBsb25nIGxvbmcgYQorLy8gQ0hFQ0s6ICAgICAgICAgOCB8ICAgY2hhciBiCisvLyBDSEVDSy1ORVhUOiAgIDEwIHwgICBpbnQgYworLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE0LCBudmFsaWduPTRdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBYCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgbG9uZyBsb25nIGEKKy8vIENIRUNLLVg2NDogICAgICAgICA4IHwgICBjaGFyIGIKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDEwIHwgICBpbnQgYworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj00CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTQsIG52YWxpZ249NF0KKworc3RydWN0IFkgOiBBLCBCIHsKKwljaGFyIGE7CisJaW50IGI7CisJWSgpIHsKKwkJcHJpbnRmKCJZICAgPSAlZFxuIiwgKGludCkoKGNoYXIqKXRoaXMgLSBidWZmZXIpKTsKKwkJcHJpbnRmKCJZLmEgPSAlZFxuIiwgKGludCkoKGNoYXIqKSZhIC0gYnVmZmVyKSk7CisJCXByaW50ZigiWS5iID0gJWRcbiIsIChpbnQpKChjaGFyKikmYiAtIGJ1ZmZlcikpOworCX0KK307CisKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBBIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIHN0cnVjdCBCIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICBsb25nIGxvbmcgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgIDE0IHwgICBpbnQgYgorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjAsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE4LCBudmFsaWduPTRdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBZCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEEgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA0IHwgICBzdHJ1Y3QgQiAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA0IHwgICAgIGxvbmcgbG9uZyBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxMiB8ICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNCB8ICAgaW50IGIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yMCwgYWxpZ249NAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE4LCBudmFsaWduPTRdCisKK3N0cnVjdCBaIDogdmlydHVhbCBCIHsKKwljaGFyIGE7CisJaW50IGI7CisJWigpIHsKKwkJcHJpbnRmKCJaICAgPSAlZFxuIiwgKGludCkoKGNoYXIqKXRoaXMgLSBidWZmZXIpKTsKKwkJcHJpbnRmKCJaLmEgPSAlZFxuIiwgKGludCkoKGNoYXIqKSZhIC0gYnVmZmVyKSk7CisJCXByaW50ZigiWi5iID0gJWRcbiIsIChpbnQpKChjaGFyKikmYiAtIGJ1ZmZlcikpOworCX0KK307CisKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBaCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoWiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDYgfCAgIGludCBiCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgQiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICBsb25nIGxvbmcgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjAsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTEwLCBudmFsaWduPTRdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBaCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKFogdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTAgfCAgIGludCBiCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGxvbmcgbG9uZyBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNCwgbnZhbGlnbj00XQorCisjcHJhZ21hIHBhY2socG9wKQorCitzdHJ1Y3QgQTEgeyBsb25nIGxvbmcgYTsgfTsKKyNwcmFnbWEgcGFjayhwdXNoLCAxKQorc3RydWN0IEIxIDogdmlydHVhbCBBMSB7IGNoYXIgYTsgfTsKKyNwcmFnbWEgcGFjayhwb3ApCitzdHJ1Y3QgQzEgOiBCMSB7fTsKKworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBDMQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEIxIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAoQjEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBBMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBsb25nIGxvbmcgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTgKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTUsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEMxCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIxIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgKEIxIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBBMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgbG9uZyBsb25nIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTksIG52YWxpZ249OF0KKworc3RydWN0IENBMCB7CisJQ0EwKCkge30KK307CitzdHJ1Y3QgQ0ExIDogdmlydHVhbCBDQTAgeworCUNBMSgpIHt9Cit9OworI3ByYWdtYSBwYWNrKHB1c2gsIDEpCitzdHJ1Y3QgQ0EyIDogcHVibGljIENBMSwgcHVibGljIENBMCB7CisJdmlydHVhbCB2b2lkIENBMk1ldGhvZCgpIHt9CisJQ0EyKCkge30KK307CisjcHJhZ21hIHBhY2socG9wKQorCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IENBMgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKENBMiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBzdHJ1Y3QgQ0ExIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICAoQ0ExIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDkgfCAgIHN0cnVjdCBDQTAgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDkgfCAgIHN0cnVjdCBDQTAgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9OSwgYWxpZ249MQorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OSwgbnZhbGlnbj0xXQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQ0EyCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKENBMiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgc3RydWN0IENBMSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIChDQTEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTcgfCAgIHN0cnVjdCBDQTAgKGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE3IHwgICBzdHJ1Y3QgQ0EwICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0xNywgYWxpZ249MQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE3LCBudmFsaWduPTFdCisKKyNwcmFnbWEgcGFjaygxNikKK3N0cnVjdCBZQSB7CisJX19kZWNsc3BlYyhhbGlnbigzMikpIGNoYXIgOiAxOworfTsKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBZQSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBjaGFyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MzIKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTMyXQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgWUEgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIGNoYXIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MzIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0zMiwgbnZhbGlnbj0zMl0KKworI3ByYWdtYSBwYWNrKDEpCitzdHJ1Y3QgWUIgeworCWNoYXIgYTsKKwlZQSBiOworfTsKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBZQgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICAxIHwgICBzdHJ1Y3QgWUEgYiAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAxIHwgICAgIGNoYXIKKy8vIENIRUNLOiAgICAgICAgICAgfCBbc2l6ZW9mPTMzLCBhbGlnbj0xCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0zMywgbnZhbGlnbj0xXQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgWUIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAxIHwgICBzdHJ1Y3QgWUEgYiAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMSB8ICAgICBjaGFyCisvLyBDSEVDSy1YNjQ6ICAgICAgICAgICB8IFtzaXplb2Y9MzMsIGFsaWduPTEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0zMywgbnZhbGlnbj0xXQorCisjcHJhZ21hIHBhY2soOCkKK3N0cnVjdCBZQyB7CisJX19kZWNsc3BlYyhhbGlnbigzMikpIGNoYXIgOiAxOworfTsKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBZQyAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBjaGFyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249MzIKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTMyXQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgWUMgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIGNoYXIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj04LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj04XQorCisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBZRCB7CisJY2hhciBhOworCVlDIGI7Cit9OworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFlECisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgIDEgfCAgIHN0cnVjdCBZQyBiIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgIDEgfCAgICAgY2hhcgorLy8gQ0hFQ0s6ICAgICAgICAgICB8IFtzaXplb2Y9MzMsIGFsaWduPTEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTMzLCBudmFsaWduPTFdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBZRAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDEgfCAgIHN0cnVjdCBZQyBiIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAxIHwgICAgIGNoYXIKKy8vIENIRUNLLVg2NDogICAgICAgICAgIHwgW3NpemVvZj05LCBhbGlnbj0xCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9OSwgbnZhbGlnbj0xXQorCisjcHJhZ21hIHBhY2soNCkKK3N0cnVjdCBZRSB7CisJX19kZWNsc3BlYyhhbGlnbigzMikpIGNoYXIgOiAxOworfTsKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBZRSAoZW1wdHkpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBjaGFyCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj00LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00LCBudmFsaWduPTRdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBZRSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgY2hhcgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQsIGFsaWduPTQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT00LCBudmFsaWduPTRdCisKKyNwcmFnbWEgcGFjaygxKQorc3RydWN0IFlGIHsKKwljaGFyIGE7CisJWUUgYjsKK307CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgWUYKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgMSB8ICAgc3RydWN0IFlFIGIgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgMSB8ICAgICBjaGFyCisvLyBDSEVDSzogICAgICAgICAgIHwgW3NpemVvZj01LCBhbGlnbj0xCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT01LCBudmFsaWduPTFdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBZRgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDEgfCAgIHN0cnVjdCBZRSBiIChlbXB0eSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAxIHwgICAgIGNoYXIKKy8vIENIRUNLLVg2NDogICAgICAgICAgIHwgW3NpemVvZj01LCBhbGlnbj0xCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NSwgbnZhbGlnbj0xXQorCisjcHJhZ21hIHBhY2soMTYpCitzdHJ1Y3QgX19kZWNsc3BlYyhhbGlnbigxNikpIEQwIHsgY2hhciBhOyB9OworI3ByYWdtYSBwYWNrKDEpCitzdHJ1Y3QgRDEgOiBwdWJsaWMgRDAgeyBjaGFyIGE7IH07CisjcHJhZ21hIHBhY2soMTYpCitzdHJ1Y3QgRDIgOiBEMSB7IGNoYXIgYTsgfTsKKworLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBEMgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEQxIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICBzdHJ1Y3QgRDAgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICAxIHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgMiB8ICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRDIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgRDEgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICBzdHJ1Y3QgRDAgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDEgfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMiB8ICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249MTZdCisKKyNwcmFnbWEgcGFjaygpCitzdHJ1Y3QgSkEgeyBjaGFyIGE7IH07CisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBKQiB7IF9fZGVjbHNwZWMoYWxpZ24oNCkpIGNoYXIgYTsgfTsKKyNwcmFnbWEgcGFjaygpCitzdHJ1Y3QgSkMgOiBKQiwgSkEgeyB9OworCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEpDCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgSkIgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgMSB8ICAgc3RydWN0IEpBIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMSB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTQsIG52YWxpZ249NF0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEpDCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEpCIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMSB8ICAgc3RydWN0IEpBIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDEgfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NCwgYWxpZ249NAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTQsIG52YWxpZ249NF0KKworI3ByYWdtYSBwYWNrKCkKK3N0cnVjdCBLQSB7IGNoYXIgYTsgfTsKKyNwcmFnbWEgcGFjaygxKQorc3RydWN0IEtCIDogS0EgeyBfX2RlY2xzcGVjKGFsaWduKDIpKSBjaGFyIGE7IH07CisKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEtCCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgS0EgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgMiB8ICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj00LCBhbGlnbj0yCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0zLCBudmFsaWduPTJdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBLQgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBLQSAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDIgfCAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQsIGFsaWduPTIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0zLCBudmFsaWduPTJdCisKKyNwcmFnbWEgcGFjaygxKQorc3RydWN0IEwgeworICB2aXJ0dWFsIHZvaWQgZnVuKCkge30KKyAgX19kZWNsc3BlYyhhbGlnbigyNTYpKSBpbnQgRmllbGQ7Cit9OworCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgTAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEwgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogIDI1NiB8ICAgaW50IEZpZWxkCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj01MTIsIGFsaWduPTI1NgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MjYwLCBudmFsaWduPTI1Nl0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEwKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoTCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogIDI1NiB8ICAgaW50IEZpZWxkCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NTEyLCBhbGlnbj0yNTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNjAsIG52YWxpZ249MjU2XQorCisjcHJhZ21hIHBhY2soKQorc3RydWN0IE1BIHt9OworI3ByYWdtYSBwYWNrKDEpCitzdHJ1Y3QgTUIgOiB2aXJ0dWFsIE1BIHsKKyAgX19kZWNsc3BlYyhhbGlnbigyNTYpKSBpbnQgRmllbGQ7Cit9OworCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBNQgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKE1CIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAyNTYgfCAgIGludCBGaWVsZAorLy8gQ0hFQ0stTkVYVDogIDI2MCB8ICAgc3RydWN0IE1BICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTUxMiwgYWxpZ249MjU2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNjAsIG52YWxpZ249MjU2XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgTUIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoTUIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAyNTYgfCAgIGludCBGaWVsZAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAyNjAgfCAgIHN0cnVjdCBNQSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NTEyLCBhbGlnbj0yNTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNjAsIG52YWxpZ249MjU2XQorCitpbnQgYVsKK3NpemVvZihYKSsKK3NpemVvZihZKSsKK3NpemVvZihaKSsKK3NpemVvZihDMSkrCitzaXplb2YoQ0EyKSsKK3NpemVvZihZQSkrCitzaXplb2YoWUIpKworc2l6ZW9mKFlDKSsKK3NpemVvZihZRCkrCitzaXplb2YoWUUpKworc2l6ZW9mKFlGKSsKK3NpemVvZihZRikrCitzaXplb2YoRDIpKworc2l6ZW9mKEpDKSsKK3NpemVvZihLQikrCitzaXplb2YoTCkrCitzaXplb2YoTUIpKworMF07CmRpZmYgLS1naXQgYS90ZXN0L0xheW91dC9tcy14ODYtcHJpbWFyeS1iYXNlcy5jcHAgYi90ZXN0L0xheW91dC9tcy14ODYtcHJpbWFyeS1iYXNlcy5jcHAKaW5kZXggYmM5YjgwMS4uYjViZDA0MSAxMDA2NDQKLS0tIGEvdGVzdC9MYXlvdXQvbXMteDg2LXByaW1hcnktYmFzZXMuY3BwCisrKyBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1wcmltYXJ5LWJhc2VzLmNwcApAQCAtMSw2ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAtY3h4LWFiaSBtaWNyb3NvZnQgJXMgMj4vZGV2L251bGwgXAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5ICVzIDI+L2Rldi9udWxsIFwKIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSB4ODZfNjQtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+L2Rldi9udWxsIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgeDg2XzY0LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5ICVzIDI+L2Rldi9udWxsIFwKIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IENIRUNLLVg2NAogCiBleHRlcm4gIkMiIGludCBwcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pOwpAQCAtMTYsNjUgKzE2LDY3IEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEEKLS8vIENIRUNLOiAgICAwIHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAgNCB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQsIG52YWxpZ249NF0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBBCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgKEIwIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTEyLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00LCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChBIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgQiA6IHZpcnR1YWwgQjAgewogCXZpcnR1YWwgdm9pZCBmKCkgeyBwcmludGYoIkIiKTsgfQogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBCCi0vLyBDSEVDSzogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgKEIwIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA4IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTIsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT00LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEIKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChCIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTIsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTQsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBCCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChCIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgICAgKEIwIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBCCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgICAgKEIwIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPThdCiAKIHN0cnVjdCBDIDogdmlydHVhbCBCMCB7CiAJdmlydHVhbCB2b2lkIGcoKSB7IHByaW50ZigiQSIpOyB9CiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEMKLS8vIENIRUNLOiAgICAwIHwgICAoQyB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgKEMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgKEIwIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDEyIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChDIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIChDIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBDCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChDIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTMyLCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBDCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEMgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChDIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTMyLCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KIAogc3RydWN0IEQgOiB2aXJ0dWFsIEIyLCB2aXJ0dWFsIEIwIHsKIAl2aXJ0dWFsIHZvaWQgZigpIHsgcHJpbnRmKCJEIik7IH0KQEAgLTgyLDI3ICs4NCwyOSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBECi0vLyBDSEVDSzogICAgMCB8ICAgKEQgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIChEIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA4IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgICA4IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAxMiB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0yMCwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBECisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoRCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAoRCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjAsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBECi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChEIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEQgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBECisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEQgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChEIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjIgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj00MCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCiAKIHN0cnVjdCBFIDogQjAsIHZpcnR1YWwgQjEgewogCXZpcnR1YWwgdm9pZCBmKCkgeyBwcmludGYoIkUiKTsgfQpAQCAtMTEwLDE5NyArMTE0LDIwNSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBFCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIwIChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICA4IHwgICAoRSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxMiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAxMiB8ICAgICAoQjEgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0yMCwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEIwIChwcmltYXJ5IGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAoRSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgICAgKEIxIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTIwLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEUKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEIwIChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgKEIwIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAoRSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAgIChCMSB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEUKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjAgKHByaW1hcnkgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIChFIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIChCMSB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KIAogc3RydWN0IEYgOiB2aXJ0dWFsIEIwLCB2aXJ0dWFsIEIxIHsKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRgotLy8gQ0hFQ0s6ICAgIDAgfCAgIChGIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgICA0IHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgMTIgfCAgICAgKEIxIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MjAsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT00LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEYKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChGIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICAgIChCMSB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0yMCwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEYKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEYgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAgIChCMSB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChGIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgICAgKEIxIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPThdCiAKIHN0cnVjdCBBWCA6IEIwWCwgQjFYIHsgaW50IGE7IEFYKCkgOiBhKDB4ZjAwMDAwMEEpIHt9IHZpcnR1YWwgdm9pZCBmKCkgeyBwcmludGYoIkEiKTsgfSB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEFYCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IEIwWCAoYmFzZSkKLS8vIENIRUNLOiAgICA4IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIxWCAocHJpbWFyeSBiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgKEIxWCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTIgfCAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQVgKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMVggKHByaW1hcnkgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgKEIxWCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjBYIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEFYCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMFggKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEIxWCAocHJpbWFyeSBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIChCMVggdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjAgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBWAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMVggKHByaW1hcnkgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIChCMVggdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjBYIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDIwIHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KIAogc3RydWN0IEJYIDogQjBYLCBCMVggeyBpbnQgYTsgQlgoKSA6IGEoMHhmMDAwMDAwQikge30gdmlydHVhbCB2b2lkIGcoKSB7IHByaW50ZigiQiIpOyB9IH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQlgKLS8vIENIRUNLOiAgICA4IHwgICBzdHJ1Y3QgQjBYIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjFYIChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAxMiB8ICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTRdCi0vLyBDSEVDSy14NjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy14NjQ6ICAgIDAgfCBzdHJ1Y3QgQlgKLS8vIENIRUNLLXg2NDogICAxNiB8ICAgc3RydWN0IEIwWCAoYmFzZSkKLS8vIENIRUNLLXg2NDogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0steDY0OiAgICAwIHwgICBzdHJ1Y3QgQjFYIChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSy14NjQ6ICAgIDAgfCAgICAgKEIxWCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy14NjQ6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLLXg2NDogICAyNCB8ICAgaW50IGEKLS8vIENIRUNLLXg2NDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKLS8vIENIRUNLLXg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQlgKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMVggKHByaW1hcnkgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgKEIxWCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjBYIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj00XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQlgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjFYIChwcmltYXJ5IGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIwWCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyMCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKIHN0cnVjdCBDWCA6IEIwWCwgQjJYIHsgaW50IGE7IENYKCkgOiBhKDB4ZjAwMDAwMEMpIHt9IHZpcnR1YWwgdm9pZCBnKCkgeyBwcmludGYoIkMiKTsgfSB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IENYCi0vLyBDSEVDSzogICAgMCB8ICAgKENYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBzdHJ1Y3QgQjBYIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICA4IHwgICBzdHJ1Y3QgQjJYIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgKEIyWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSzogICAyMCB8ICAgc3RydWN0IEIxWCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgMjAgfCAgICAgKEIxWCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAyNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTI4LCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MjAsIG52YWxpZ249NF0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBDWAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKENYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIHN0cnVjdCBCMFggKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjJYIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICAoQjJYIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICBzdHJ1Y3QgQjFYICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICAgIChCMVggdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjgsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTIwLCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQ1gKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKENYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgc3RydWN0IEIwWCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjJYIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgIChCMlggdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgIHN0cnVjdCBCMVggKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA0MCB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj01NiwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT00MCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQ1gKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoQ1ggdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBCMFggKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMlggKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICAoQjJYIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICBzdHJ1Y3QgQjFYICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0MCB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NTYsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT00MCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgRFggOiB2aXJ0dWFsIEIxWCB7IGludCBhOyBEWCgpIDogYSgweGYwMDAwMDBEKSB7fSB2aXJ0dWFsIHZvaWQgZigpIHsgcHJpbnRmKCJEIik7IH0gfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBEWAotLy8gQ0hFQ0s6ICAgIDAgfCAgIChEWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgaW50IGEKLS8vIENIRUNLOiAgICA4IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIxWCkKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQjFYICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAxMiB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MjAsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IERYCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoRFggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjFYKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEIxWCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTIwLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRFgKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKERYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyMCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCMVgpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMVggKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj00MCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRFgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRFggdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAyMCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCMVgpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIxWCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgICAgKEIxWCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KIAogc3RydWN0IEVYIDogdmlydHVhbCBCMVggeyBpbnQgYTsgRVgoKSA6IGEoMHhmMDAwMDAwRSkge30gdmlydHVhbCB2b2lkIGcoKSB7IHByaW50ZigiRSIpOyB9IH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRVgKLS8vIENIRUNLOiAgICAwIHwgICAoRVggdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIChFWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDEyIHwgICBzdHJ1Y3QgQjFYICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAxMiB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MjAsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBFWAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEVYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIChFWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEIxWCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTIwLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEVYCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChFWCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIChFWCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBCMVggKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj00MCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRVgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRVggdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChFWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgQjFYICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgRlggOiB2aXJ0dWFsIEIxWCB7IGludCBhOyBGWCgpIDogYSgweGYwMDAwMDBGKSB7fSB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEZYCi0vLyBDSEVDSzogICAgMCB8ICAgKEZYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMVggKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgICA4IHwgICAgIChCMVggdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTIgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRlgKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChGWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IEIxWCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRlgKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEZYIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIxWCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgIChCMVggdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTMyLCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBGWAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChGWCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjFYICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICAoQjFYIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MzIsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQogCiBpbnQgYVsKIHNpemVvZihBKSsKZGlmZiAtLWdpdCBhL3Rlc3QvTGF5b3V0L21zLXg4Ni1zaXplLWFsaWdubWVudC1mYWlsLmNwcCBiL3Rlc3QvTGF5b3V0L21zLXg4Ni1zaXplLWFsaWdubWVudC1mYWlsLmNwcAppbmRleCBmOTk4ZWUxLi43ZTk3NWIwIDEwMDY0NAotLS0gYS90ZXN0L0xheW91dC9tcy14ODYtc2l6ZS1hbGlnbm1lbnQtZmFpbC5jcHAKKysrIGIvdGVzdC9MYXlvdXQvbXMteDg2LXNpemUtYWxpZ25tZW50LWZhaWwuY3BwCkBAIC0xLDYgKzEsNiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtY3h4LWFiaSBtaWNyb3NvZnQgJXMgMj4vZGV2L251bGwgXAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAlcyAyPi9kZXYvbnVsbCBcCiAvLyBSVU46ICAgICAgICAgICAgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgeDg2XzY0LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtY3h4LWFiaSBtaWNyb3NvZnQgJXMgMj4vZGV2L251bGwgXAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSB4ODZfNjQtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzICVzIDI+L2Rldi9udWxsIFwKIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4IENIRUNLLVg2NAogCiBleHRlcm4gIkMiIGludCBwcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pOwpAQCAtMTEsMTA4ICsxMSwxMTIgQEAKIHN0cnVjdCBBIDogdmlydHVhbCBCMCB7fTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBCi0vLyBDSEVDSzogICAgMCB8ICAgKEEgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgY2hhciBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9NSwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQsIG52YWxpZ249NF0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBBCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj01LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00LCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBBCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPThdCiAKIHN0cnVjdCBfX2RlY2xzcGVjKGFsaWduKDEpKSBCIDogdmlydHVhbCBCMCB7fTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBCCi0vLyBDSEVDSzogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgIDQgfCAgICAgY2hhciBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEIKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChCIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgQyA6IHZpcnR1YWwgQjAgeyBpbnQgYTsgQygpIDogYSgweEMpIHt9IH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQwotLy8gQ0hFQ0s6ICAgIDAgfCAgIChDIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgIDggfCAgICAgY2hhciBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9OSwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTksIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBDCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChDIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTI0LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBDCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCiAKIHN0cnVjdCBEIDogdmlydHVhbCBCMCB7IF9fZGVjbHNwZWMoYWxpZ24oMSkpIGludCBhOyBEKCkgOiBhKDB4RCkge30gfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBECi0vLyBDSEVDSzogICAgMCB8ICAgKEQgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIGludCBhCi0vLyBDSEVDSzogICAgOCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAgOCB8ICAgICBjaGFyIGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0xMiwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEQgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTEyLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoRCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0yNCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChEIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MjQsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQogCiBzdHJ1Y3QgRSA6IHZpcnR1YWwgQjAsIHZpcnR1YWwgQjEge307CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRQotLy8gQ0hFQ0s6ICAgIDAgfCAgIChFIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgICA0IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgIDUgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQsIG52YWxpZ249NF0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBFCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoRSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICA1IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEUKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEUgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAgOSB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChFIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDkgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKSAoZW1wdHkpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTYsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPThdCiAKIHN0cnVjdCBGIHsgY2hhciBhOyB2aXJ0dWFsIH5GKCk7IH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRgotLy8gQ0hFQ0s6ICAgIDAgfCAgIChGIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICBjaGFyIGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj04LCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBGCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoRiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBGCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChGIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBGCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEYgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KIAogaW50IGFbCiBzaXplb2YoQSkrCmRpZmYgLS1naXQgYS90ZXN0L0xheW91dC9tcy14ODYtdmZ2Yi1hbGlnbm1lbnQuY3BwIGIvdGVzdC9MYXlvdXQvbXMteDg2LXZmdmItYWxpZ25tZW50LmNwcAppbmRleCA4ZWVhMjA5Li41NGY3NGFjIDEwMDY0NAotLS0gYS90ZXN0L0xheW91dC9tcy14ODYtdmZ2Yi1hbGlnbm1lbnQuY3BwCisrKyBiL3Rlc3QvTGF5b3V0L21zLXg4Ni12ZnZiLWFsaWdubWVudC5jcHAKQEAgLTEsNiArMSw2IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+JjEgXAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5ICVzIDI+JjEgXAogLy8gUlVOOiAgICAgICAgICAgIHwgRmlsZUNoZWNrICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIHg4Nl82NC1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAtY3h4LWFiaSBtaWNyb3NvZnQgJXMgMj4vZGV2L251bGwgXAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSB4ODZfNjQtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgJXMgMj4vZGV2L251bGwgXAogLy8gUlVOOiAgICAgICAgICAgIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXggQ0hFQ0stWDY0CiAKIGV4dGVybiAiQyIgaW50IHByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7CkBAIC0xNiwzNDkgKzE2LDM2MSBAQAogc3RydWN0IEEgOiBCMCwgdmlydHVhbCBCMSB7IF9fZGVjbHNwZWMoYWxpZ24oMTYpKSBpbnQgYTsgQSgpIDogYSgweGYwMDAwMDBBKSB7fSB2aXJ0dWFsIHZvaWQgZigpIHsgcHJpbnRmKCJBIik7IH0gfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBCi0vLyBDSEVDSzogICAgMCB8ICAgKEEgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBCMCAoYmFzZSkKLS8vIENIRUNLOiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAyMCB8ICAgKEEgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgNDggfCAgIGludCBhCi0vLyBDSEVDSzogICA2NCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA2NCB8ICAgICBjaGFyIGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEEKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChBIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgIChBIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEEKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEEgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICBzdHJ1Y3QgQjAgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgKEEgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChBIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIChBIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NjQsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBCIDogQSwgQjIgeyBpbnQgYTsgQigpIDogYSgweGYwMDAwMDBCKSB7fSB2aXJ0dWFsIHZvaWQgZigpIHsgcHJpbnRmKCJCIik7IH0gfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBCCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEEgKHByaW1hcnkgYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIChBIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICAgIHN0cnVjdCBCMCAoYmFzZSkKLS8vIENIRUNLOiAgIDE2IHwgICAgICAgaW50IGEKLS8vIENIRUNLOiAgIDIwIHwgICAgIChBIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDQ4IHwgICAgIGludCBhCi0vLyBDSEVDSzogICA2NCB8ICAgc3RydWN0IEIyIChiYXNlKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgKEIyIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDY4IHwgICAgIGludCBhCi0vLyBDSEVDSzogICA3MiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDgwIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDgwIHwgICAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTgwLCBudmFsaWduPTE2XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEIKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBBIChwcmltYXJ5IGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIChBIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICAgIChBIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMiAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgICAgKEIyIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgNjggfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNzIgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDgwIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgODAgfCAgICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgwLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEIKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEEgKHByaW1hcnkgYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICAoQSB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgICAgc3RydWN0IEIwIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICAoQSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgc3RydWN0IEIyIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICAgIChCMiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNTYgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA4MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgODAgfCAgICAgY2hhciBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT04MCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQSAocHJpbWFyeSBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgKEEgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgICAgKEEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQjIgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgICAoQjIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNzIgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDgwIHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgOTYgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgOTYgfCAgICAgY2hhciBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9MTEyLCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTk2LCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgQyA6IEI0IHsgaW50IGE7IEMoKSA6IGEoMHhmMDAwMDAwQykge30gdmlydHVhbCB2b2lkIGYoKSB7IHByaW50ZigiQyIpOyB9IH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQwotLy8gQ0hFQ0s6ICAgIDAgfCAgIChDIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjQgKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICAoQjQgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMjAgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDI0IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMzIgfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgMzIgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT0zMiwgbnZhbGlnbj0xNl0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChDIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCNCAoYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgKEI0IHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQ4LCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgQwotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoQyB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCNCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICAoQjQgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoQyB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEI0IChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgKEI0IHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBEIDogQyB7IGludCBhOyBEKCkgOiBhKDB4ZjAwMDAwMEQpIHt9IHZpcnR1YWwgdm9pZCBmKCkgeyBwcmludGYoIkQiKTsgfSB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEQKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQyAocHJpbWFyeSBiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgKEMgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgc3RydWN0IEI0IChiYXNlKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgICAoQjQgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMjAgfCAgICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMjQgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNDggfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEMgKHByaW1hcnkgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgICAgKEMgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBzdHJ1Y3QgQjQgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgICAgKEI0IHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBECi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBDIChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgKEMgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgIHN0cnVjdCBCNCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICAgIChCNCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDY0IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQyAocHJpbWFyeSBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgKEMgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgc3RydWN0IEI0IChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgICAoQjQgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMyAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IEUgOiB2aXJ0dWFsIEMgeyBpbnQgYTsgRSgpIDogYSgweGYwMDAwMDBFKSB7fSB2aXJ0dWFsIHZvaWQgZigpIHsgcHJpbnRmKCJFIik7IH0gfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBFCi0vLyBDSEVDSzogICAgMCB8ICAgKEUgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNDQgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQykKLS8vIENIRUNLOiAgIDQ4IHwgICBzdHJ1Y3QgQyAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNDggfCAgICAgKEMgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgc3RydWN0IEI0IChiYXNlKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgICAoQjQgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgNjggfCAgICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNzIgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEUKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChFIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNDQgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQykKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBDICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgIChDIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgICAgc3RydWN0IEI0IChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICAgIChCNCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDY4IHwgICAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNzIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBFCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChFIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIzICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0NCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBDKQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgQyAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICAgIChDIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA2NCB8ICAgICBzdHJ1Y3QgQjQgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNjQgfCAgICAgICAoQjQgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDcyIHwgICAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA4MCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEUKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjMgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA0NCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBDKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBDICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgICAoQyB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgICBzdHJ1Y3QgQjQgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA2NCB8ICAgICAgIChCNCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA3MiB8ICAgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgRiA6IEIzLCB2aXJ0dWFsIEIwIHsgaW50IGE7IEYoKSA6IGEoMHhmMDAwMDAwRikge30gdmlydHVhbCB2b2lkIGYoKSB7IHByaW50ZigiRiIpOyB9IH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRgotLy8gQ0hFQ0s6ICAgIDAgfCAgIChGIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjMgKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMzIgfCAgIChGIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDQ4IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgNjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNjQgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRgorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEYgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEIzIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgKEYgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBGCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChGIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgc3RydWN0IEIzIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIChGIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA0MCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChGIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjMgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIChGIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IEcgOiBCMiwgQjYsIHZpcnR1YWwgQjEgeyBpbnQgYTsgRygpIDogYSgweGYwMDAwMDEwKSB7fSB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEcKLS8vIENIRUNLOiAgICA4IHwgICBzdHJ1Y3QgQjIgKGJhc2UpCi0vLyBDSEVDSzogICAgOCB8ICAgICAoQjIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTIgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjYgKHByaW1hcnkgYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIChCNiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSzogICAyMCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAyMCB8ICAgICBjaGFyIGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0yMSwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTIwLCBudmFsaWduPTRdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEI2IChwcmltYXJ5IGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIChCNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjIgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAgIChCMiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjEsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTIwLCBudmFsaWduPTRdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgRwotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjIgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgKEIyIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjYgKHByaW1hcnkgYmFzZSkKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgICAoQjYgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQwIHwgICAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT00MCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCNiAocHJpbWFyeSBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgKEI2IHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIyIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgKEIyIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQ4LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NDAsIG52YWxpZ249OF0KIAogc3RydWN0IEggOiBCNiwgQjIsIHZpcnR1YWwgQjEgeyBpbnQgYTsgSCgpIDogYSgweGYwMDAwMDExKSB7fSB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEgKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjYgKHByaW1hcnkgYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIChCNiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMiAoYmFzZSkKLS8vIENIRUNLOiAgICA4IHwgICAgIChCMiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSzogICAyMCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAyMCB8ICAgICBjaGFyIGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj0yMSwgYWxpZ249NAotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTIwLCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEgKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCNiAocHJpbWFyeSBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAoQjYgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgc3RydWN0IEIyIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICAoQjIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTIxLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0yMCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEgKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEI2IChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgKEI2IHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjIgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgKEIyIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAyNCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQwIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA0MCB8ICAgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NDgsIGFsaWduPTgKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9NDAsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjYgKHByaW1hcnkgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIChCNiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMiAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIChCMiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICA0MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0MCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTQwLCBudmFsaWduPThdCiAKIHN0cnVjdCBJIDogQjAsIHZpcnR1YWwgQjEgeyBpbnQgYTsgaW50IGExOyBfX2RlY2xzcGVjKGFsaWduKDE2KSkgaW50IGEyOyBJKCkgOiBhKDB4ZjAwMDAwMTEpLCBhMSgweGYwMDAwMDExKSwgYTIoMHhmMDAwMDAxMSkge30gfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBJCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIwIChiYXNlKQotLy8gQ0hFQ0s6ICAgIDAgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgICA0IHwgICAoSSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAyMCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDI0IHwgICBpbnQgYTEKLS8vIENIRUNLOiAgIDMyIHwgICBpbnQgYTIKLS8vIENIRUNLOiAgIDQ4IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDQ4IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBJCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjAgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAoSSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgaW50IGExCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICBpbnQgYTIKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgICBjaGFyIGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCiAvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSy1YNjQ6ICAgIDAgfCBzdHJ1Y3QgSQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICBzdHJ1Y3QgQjAgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgKEkgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDIwIHwgICBpbnQgYTEKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgaW50IGEyCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBJCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAoSSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyMCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBpbnQgYTEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBpbnQgYTIKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgSiA6IEIwLCBCMywgdmlydHVhbCBCMSB7IGludCBhOyBpbnQgYTE7IEooKSA6IGEoMHhmMDAwMDAxMiksIGExKDB4ZjAwMDAwMTIpIHt9IH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgSgotLy8gQ0hFQ0s6ICAgIDAgfCAgIHN0cnVjdCBCMCAoYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgc3RydWN0IEIzIChiYXNlKQotLy8gQ0hFQ0s6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICAoSiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA0OCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDUyIHwgICBpbnQgYTEKLS8vIENIRUNLOiAgIDY0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDY0IHwgICAgIGNoYXIgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBKCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjAgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjMgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICAoSiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICA1MiB8ICAgaW50IGExCisvLyBDSEVDSy1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgICAgY2hhciBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEoKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEIwIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMyAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICAoSiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDQgfCAgIGludCBhMQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgICBjaGFyIGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgSgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMCAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIzIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICAoSiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDUyIHwgICBpbnQgYTEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDY0IHwgICAgIGNoYXIgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQogCiBzdHJ1Y3QgSyB7IGludCBhOyBLKCkgOiBhKDB4ZjAwMDAwMTMpIHt9IHZpcnR1YWwgdm9pZCBmKCkgeyBwcmludGYoIksiKTsgfSB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEsKLS8vIENIRUNLOiAgICAwIHwgICAoSyB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgaW50IGEKLS8vIENIRUNLOiAgICAgIHwgW3NpemVvZj04LCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBLCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoSyB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9OCwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEsKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEsgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgSworLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChLIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MTYsIG52YWxpZ249OF0KIAogc3RydWN0IEwgOiB2aXJ0dWFsIEsgeyBpbnQgYTsgTCgpIDogYSgweGYwMDAwMDE0KSB7fSB2aXJ0dWFsIHZvaWQgZygpIHsgcHJpbnRmKCJMIik7IH0gfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBMCi0vLyBDSEVDSzogICAgMCB8ICAgKEwgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIChMIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA4IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBLICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAxMiB8ICAgICAoSyB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTIwLCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MTIsIG52YWxpZ249NF0KKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgTAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEwgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgKEwgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgIHN0cnVjdCBLICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICAgIChLIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTIwLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT0xMiwgbnZhbGlnbj00XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEwKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEwgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAoTCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgIHN0cnVjdCBLICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMjQgfCAgICAgKEsgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBMCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEwgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgIChMIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBLICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgICAoSyB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTQwLCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KIAogc3RydWN0IE0gOiB2aXJ0dWFsIEsgeyBpbnQgYTsgTSgpIDogYSgweGYwMDAwMDE1KSB7fSB2aXJ0dWFsIHZvaWQgZigpIHsgcHJpbnRmKCJNIik7IH0gfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBNCi0vLyBDSEVDSzogICAgMCB8ICAgKE0gdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIGludCBhCi0vLyBDSEVDSzogICAgOCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBLKQotLy8gQ0hFQ0s6ICAgMTIgfCAgIHN0cnVjdCBLICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAxMiB8ICAgICAoSyB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTIwLCBhbGlnbj00Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBNCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoTSB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBLKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IEsgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMTIgfCAgICAgKEsgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjAsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBNCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChNIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAyMCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBLKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICBzdHJ1Y3QgSyAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDI0IHwgICAgIChLIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj00MCwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT0xNiwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgTQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChNIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjAgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgSykKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDI0IHwgICBzdHJ1Y3QgSyAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgICAgKEsgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj00MCwgYWxpZ249OAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCAgbnZzaXplPTE2LCBudmFsaWduPThdCiAKIGludCBhWwogc2l6ZW9mKEEpKwpkaWZmIC0tZ2l0IGEvdGVzdC9MYXlvdXQvbXMteDg2LXZmdmItc2hhcmluZy5jcHAgYi90ZXN0L0xheW91dC9tcy14ODYtdmZ2Yi1zaGFyaW5nLmNwcAppbmRleCAyYjNkMDhlLi45MWYxOTRmIDEwMDY0NAotLS0gYS90ZXN0L0xheW91dC9tcy14ODYtdmZ2Yi1zaGFyaW5nLmNwcAorKysgYi90ZXN0L0xheW91dC9tcy14ODYtdmZ2Yi1zaGFyaW5nLmNwcApAQCAtMSw2ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAtY3h4LWFiaSBtaWNyb3NvZnQgJXMgMj4mMSBcCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgJXMgMj4mMSBcCiAvLyBSVU46ICAgICAgICAgICAgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgeDg2XzY0LXBjLXdpbjMyIC1mZHVtcC1yZWNvcmQtbGF5b3V0cyAtZnN5bnRheC1vbmx5IC1jeHgtYWJpIG1pY3Jvc29mdCAlcyAyPi9kZXYvbnVsbCBcCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIHg4Nl82NC1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAlcyAyPi9kZXYvbnVsbCBcCiAvLyBSVU46ICAgICAgICAgICAgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeCBDSEVDSy1YNjQKIAogZXh0ZXJuICJDIiBpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKQEAgLTE4LDI3ICsxOCwzMSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBCi0vLyBDSEVDSzogICAgMCB8ICAgKEEgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMTYgfCAgIHN0cnVjdCBCMCAoYmFzZSkKLS8vIENIRUNLOiAgIDE2IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAyMCB8ICAgKEEgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgNDggfCAgIGludCBhCi0vLyBDSEVDSzogICA2NCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA2NCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTgwLCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTE2XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEEgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgKEEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA2NCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9ODAsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBBCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChBIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgc3RydWN0IEIwIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIChBIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChBIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICBzdHJ1Y3QgQjAgKGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgIChBIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjQgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj04MCwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IEIgOiBCMiwgQjAsIHZpcnR1YWwgQjEgewogCV9fZGVjbHNwZWMoYWxpZ24oMTYpKSBpbnQgYTsKQEAgLTQ3LDI5ICs1MSwzMSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBCCi0vLyBDSEVDSzogICAgMCB8ICAgc3RydWN0IEIyIChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSzogICAgMCB8ICAgICAoQjIgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIHN0cnVjdCBCMCAoYmFzZSkKLS8vIENIRUNLOiAgICA0IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgOCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSzogICA0OCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICA0OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEIKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCMiAocHJpbWFyeSBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgICAoQjIgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKEIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBCCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIHN0cnVjdCBCMiAocHJpbWFyeSBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAgIChCMiB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgIDggfCAgIHN0cnVjdCBCMCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICAoQiB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgICAgfCBbc2l6ZW9mPTY0LCBhbGlnbj0xNgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICBzdHJ1Y3QgQjIgKHByaW1hcnkgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAgIChCMiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAoQiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQ4IHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCiAKIHN0cnVjdCBDIDogQjMsIEIwLCB2aXJ0dWFsIEIxIHsKIAlfX2RlY2xzcGVjKGFsaWduKDE2KSkgaW50IGE7CkBAIC03OCwyOSArODQsMzEgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQwotLy8gQ0hFQ0s6ICAgIDAgfCAgIChDIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDE2IHwgICBzdHJ1Y3QgQjMgKGJhc2UpCi0vLyBDSEVDSzogICAxNiB8ICAgICAoQjMgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMjAgfCAgIHN0cnVjdCBCMCAoYmFzZSkKLS8vIENIRUNLOiAgIDIwIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDQ4IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDQ4IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEMgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IEIzIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICAoQjMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBDCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgIChDIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgc3RydWN0IEIzIChiYXNlKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAgIChCMyB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIHN0cnVjdCBCMCAoYmFzZSkKLS8vIENIRUNLLVg2NDogICAxNiB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgIDQ4IHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9NDgsIG52YWxpZ249MTZdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBDCisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8ICAgKEMgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIHN0cnVjdCBCMyAoYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDE2IHwgICAgIChCMyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAyNCB8ICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IEQgOiBCNCwgQjAsIHZpcnR1YWwgQjEgewogCV9fZGVjbHNwZWMoYWxpZ24oMTYpKSBpbnQgYTsKQEAgLTEwOSwyOSArMTE3LDMxIEBACiB9OwogCiAvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLOiAgICAwIHwgc3RydWN0IEQKLS8vIENIRUNLOiAgICAwIHwgICBzdHJ1Y3QgQjQgKHByaW1hcnkgYmFzZSkKLS8vIENIRUNLOiAgICAwIHwgICAgIChCNCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgICAoQjQgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDggfCAgIHN0cnVjdCBCMCAoYmFzZSkKLS8vIENIRUNLOiAgICA4IHwgICAgIGludCBhCi0vLyBDSEVDSzogICAxNiB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDMyIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9NDgsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MzIsIG52YWxpZ249MTZdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRAorLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgc3RydWN0IEI0IChwcmltYXJ5IGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAgIChCNCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICAgIChCNCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICBzdHJ1Y3QgQjAgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj00OCwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTMyLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEQKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgc3RydWN0IEI0IChwcmltYXJ5IGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgIDAgfCAgICAgKEI0IHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICAoQjQgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDE2IHwgICBzdHJ1Y3QgQjAgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAzMiB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA0OCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSy1YNjQ6ICAgICAgfCAgbnZzaXplPTQ4LCBudmFsaWduPTE2XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgRAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIHN0cnVjdCBCNCAocHJpbWFyeSBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgICAgKEI0IHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgICA4IHwgICAgIChCNCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IEIwIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNDggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT00OCwgbnZhbGlnbj0xNl0KIAogaW50IGFbCiBzaXplb2YoQSkrCmRpZmYgLS1naXQgYS90ZXN0L0xheW91dC9tcy14ODYtdnRvcmRpc3AuY3BwIGIvdGVzdC9MYXlvdXQvbXMteDg2LXZ0b3JkaXNwLmNwcAppbmRleCBiMTZmMDllLi4xZjAzYjRhIDEwMDY0NAotLS0gYS90ZXN0L0xheW91dC9tcy14ODYtdnRvcmRpc3AuY3BwCisrKyBiL3Rlc3QvTGF5b3V0L21zLXg4Ni12dG9yZGlzcC5jcHAKQEAgLTEsNiArMSw2IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+JjEgXAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZm1zLWV4dGVuc2lvbnMgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAlcyAyPiYxIFwKIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbm8tcnR0aSAtZW1pdC1sbHZtLW9ubHkgLXRyaXBsZSB4ODZfNjQtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzIC1mc3ludGF4LW9ubHkgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+L2Rldi9udWxsIFwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWZtcy1leHRlbnNpb25zIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIHg4Nl82NC1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWZzeW50YXgtb25seSAlcyAyPi9kZXYvbnVsbCBcCiAvLyBSVU46ICAgICAgICAgICAgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeCBDSEVDSy1YNjQKIAogZXh0ZXJuICJDIiBpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKQEAgLTMwLDM1ICszMCwzOSBAQAogfTsKIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBBCi0vLyBDSEVDSzogICAgMCB8ICAgKEEgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgIDQgfCAgIChBIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA4IHwgICBpbnQgYQotLy8gQ0hFQ0s6ICAgMTYgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjApCi0vLyBDSEVDSzogICAyMCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAyMCB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMjQgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgIDQ0IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIxKQotLy8gQ0hFQ0s6ICAgNDggfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgNDggfCAgICAgKEIxIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDUyIHwgICAgIGludCBhCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9NjQsIGFsaWduPTE2Ci0vLyBDSEVDSzogICAgICB8ICBudnNpemU9MTIsIG52YWxpZ249NF0KKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEEKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChBIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIChBIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIwKQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDI0IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDQ0IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIxKQorLy8gQ0hFQ0stTkVYVDogICA0OCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDQ4IHwgICAgIChCMSB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDUyIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj02NCwgYWxpZ249MTYKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTE2XQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEEKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEEgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAoQSB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMzYgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjApCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQwIHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA3NiB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCMSkKLS8vIENIRUNLLVg2NDogICA4MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgODAgfCAgICAgKEIxIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA4OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MTYKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoQSB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgKEEgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzNiB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCMCkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNzYgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjEpCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgICAoQjEgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgODggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MTYKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj0xNl0KIAogc3RydWN0IEMgOiB2aXJ0dWFsIEIwLCB2aXJ0dWFsIEIxLCBWQWxpZ24zMiB7CiAJaW50IGE7CkBAIC02OCwzOSArNzIsNDMgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgQwotLy8gQ0hFQ0s6ICAgIDAgfCAgIChDIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDMyIHwgICBzdHJ1Y3QgVkFsaWduMzIgKGJhc2UpCi0vLyBDSEVDSzogICAzMiB8ICAgICAoVkFsaWduMzIgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgMzYgfCAgIGludCBhCi0vLyBDSEVDSzogICA2NCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCMCkKLS8vIENIRUNLOiAgIDY4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDY4IHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA3MiB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAxMDggfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjEpCi0vLyBDSEVDSzogIDExMiB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogIDExMiB8ICAgICAoQjEgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAxMTYgfCAgICAgaW50IGEKLS8vIENIRUNLOiAgMTI4IHwgICBzdHJ1Y3QgQWxpZ24zMiAodmlydHVhbCBiYXNlKSAoZW1wdHkpCi0vLyBDSEVDSzogICAgICB8IFtzaXplb2Y9MTI4LCBhbGlnbj0zMgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEMgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgc3RydWN0IFZBbGlnbjMyIChiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAzMiB8ICAgICAoVkFsaWduMzIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAzNiB8ICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAgNjQgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjApCisvLyBDSEVDSy1ORVhUOiAgIDY4IHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgNjggfCAgICAgKEIwIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgNzIgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAxMDggfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjEpCisvLyBDSEVDSy1ORVhUOiAgMTEyIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAxMTIgfCAgICAgKEIxIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAxMTYgfCAgICAgaW50IGEKKy8vIENIRUNLLU5FWFQ6ICAxMjggfCAgIHN0cnVjdCBBbGlnbjMyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTEyOCwgYWxpZ249MzIKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTY0LCBudmFsaWduPTMyXQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEMKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEMgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgIDMyIHwgICBzdHJ1Y3QgVkFsaWduMzIgKGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgMzIgfCAgICAgKFZBbGlnbjMyIHZidGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA0MCB8ICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA2OCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCMCkKLS8vIENIRUNLLVg2NDogICA3MiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgNzIgfCAgICAgKEIwIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA4MCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgMTA4IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIxKQotLy8gQ0hFQ0stWDY0OiAgMTEyIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogIDExMiB8ICAgICAoQjEgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgMTIwIHwgICAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAxMjggfCAgIHN0cnVjdCBBbGlnbjMyICh2aXJ0dWFsIGJhc2UpIChlbXB0eSkKLS8vIENIRUNLLVg2NDogICAgICB8IFtzaXplb2Y9MTI4LCBhbGlnbj0zMgotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoQyB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAzMiB8ICAgc3RydWN0IFZBbGlnbjMyIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMzIgfCAgICAgKFZBbGlnbjMyIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNjggfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjApCisvLyBDSEVDSy1YNjQtTkVYVDogICA3MiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA3MiB8ICAgICAoQjAgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgODAgfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTA4IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIxKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxMTIgfCAgIHN0cnVjdCBCMSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAxMTIgfCAgICAgKEIxIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLVg2NC1ORVhUOiAgMTIwIHwgICAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogIDEyOCB8ICAgc3RydWN0IEFsaWduMzIgKHZpcnR1YWwgYmFzZSkgKGVtcHR5KQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTEyOCwgYWxpZ249MzIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT02NCwgbnZhbGlnbj0zMl0KIAogc3RydWN0IF9fZGVjbHNwZWMoYWxpZ24oMzIpKSBEIDogdmlydHVhbCBCMCwgdmlydHVhbCBCMSAgewogCWludCBhOwpAQCAtMTEwLDM1ICsxMTgsMzUgQEAKIH07CiAKIC8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0s6ICAgIDAgfCBzdHJ1Y3QgRAotLy8gQ0hFQ0s6ICAgIDAgfCAgIChEIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgICA0IHwgICAoRCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgOCB8ICAgaW50IGEKLS8vIENIRUNLOiAgIDMyIHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIwKQotLy8gQ0hFQ0s6ICAgMzYgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0s6ICAgMzYgfCAgICAgKEIwIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLOiAgIDQwIHwgICAgIGludCBhCi0vLyBDSEVDSzogICA3NiB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCMSkKLS8vIENIRUNLOiAgIDgwIHwgICBzdHJ1Y3QgQjEgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLOiAgIDgwIHwgICAgIChCMSB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICA4NCB8ICAgICBpbnQgYQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTk2LCBhbGlnbj0zMgotLy8gQ0hFQ0s6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTRdCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IEQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChEIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIChEIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIwKQorLy8gQ0hFQ0stTkVYVDogICAzNiB8ICAgc3RydWN0IEIwICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDM2IHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDQwIHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgIDc2IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEIxKQorLy8gQ0hFQ0stTkVYVDogICA4MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDgwIHwgICAgIChCMSB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDg0IHwgICAgIGludCBhCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MzIKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTEyLCBudmFsaWduPTMyXQogLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgc3RydWN0IEQKLS8vIENIRUNLLVg2NDogICAgMCB8ICAgKEQgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICAoRCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgMTYgfCAgIGludCBhCi0vLyBDSEVDSy1YNjQ6ICAgMzYgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjApCi0vLyBDSEVDSy1YNjQ6ICAgNDAgfCAgIHN0cnVjdCBCMCAodmlydHVhbCBiYXNlKQotLy8gQ0hFQ0stWDY0OiAgIDQwIHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSy1YNjQ6ICAgNDggfCAgICAgaW50IGEKLS8vIENIRUNLLVg2NDogICA3NiB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCMSkKLS8vIENIRUNLLVg2NDogICA4MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSy1YNjQ6ICAgODAgfCAgICAgKEIxIHZmdGFibGUgcG9pbnRlcikKLS8vIENIRUNLLVg2NDogICA4OCB8ICAgICBpbnQgYQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MzIKLS8vIENIRUNLLVg2NDogICAgICB8ICBudnNpemU9MjQsIG52YWxpZ249OF0KKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgc3RydWN0IEQKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoRCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgKEQgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTYgfCAgIGludCBhCisvLyBDSEVDSy1YNjQtTkVYVDogICAzNiB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBCMCkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICBzdHJ1Y3QgQjAgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDQwIHwgICAgIChCMCB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICA0OCB8ICAgICBpbnQgYQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgNzYgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQjEpCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgc3RydWN0IEIxICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICA4MCB8ICAgICAoQjEgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgODggfCAgICAgaW50IGEKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgW3NpemVvZj05NiwgYWxpZ249MzIKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT0yNCwgbnZhbGlnbj0zMl0KIAogc3RydWN0IEFUIHsKIAl2aXJ0dWFsIH5BVCgpe30KQEAgLTE0OSwyMiArMTU3LDE4MiBAQAogQ1Q6On5DVCgpe30KIAogLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0Ci0vLyBDSEVDSzogICAgMCB8IHN0cnVjdCBDVAotLy8gQ0hFQ0s6ICAgIDAgfCAgIChDVCB2YnRhYmxlIHBvaW50ZXIpCi0vLyBDSEVDSzogICAgNCB8ICAgc3RydWN0IEFUICh2aXJ0dWFsIGJhc2UpCi0vLyBDSEVDSzogICAgNCB8ICAgICAoQVQgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0s6ICAgICAgfCBbc2l6ZW9mPTgsIGFsaWduPTQKLS8vIENIRUNLOiAgICAgIHwgIG52c2l6ZT00LCBudmFsaWduPTRdCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgQ1QKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChDVCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBzdHJ1Y3QgQVQgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgICAgKEFUIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTgsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTQsIG52YWxpZ249NF0KIC8vIENIRUNLLVg2NDogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKLS8vIENIRUNLLVg2NDogICAgMCB8IHN0cnVjdCBDVAotLy8gQ0hFQ0stWDY0OiAgICAwIHwgICAoQ1QgdmJ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICA4IHwgICBzdHJ1Y3QgQVQgKHZpcnR1YWwgYmFzZSkKLS8vIENIRUNLLVg2NDogICAgOCB8ICAgICAoQVQgdmZ0YWJsZSBwb2ludGVyKQotLy8gQ0hFQ0stWDY0OiAgICAgIHwgW3NpemVvZj0xNiwgYWxpZ249OAotLy8gQ0hFQ0stWDY0OiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPThdCisvLyBDSEVDSy1YNjQ6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1YNjQtTkVYVDogICAgMCB8IHN0cnVjdCBDVAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCAgIChDVCB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgc3RydWN0IEFUICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAgOCB8ICAgICAoQVQgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTE2LCBhbGlnbj04CisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj04XQorCitzdHJ1Y3QgWEEgeworCVhBKCkgeyBwcmludGYoIlhBIik7IH0KKwlsb25nIGxvbmcgbGw7Cit9Oworc3RydWN0IFhCIDogWEEgeworCVhCKCkgeyBwcmludGYoIlhCIik7IH0KKwl2aXJ0dWFsIHZvaWQgZm9vKCkge30KKwlpbnQgYjsKK307CitzdHJ1Y3QgWEMgOiB2aXJ0dWFsIFhCIHsKKwlYQygpIHsgcHJpbnRmKCJYQyIpOyB9CisJdmlydHVhbCB2b2lkIGZvbygpIHt9Cit9OworCisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IFhDCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoWEMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBYQikKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBYQiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgICAoWEIgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICBzdHJ1Y3QgWEEgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgICAgbG9uZyBsb25nIGxsCisvLyBDSEVDSy1ORVhUOiAgIDI0IHwgICAgIGludCBiCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0zMiwgYWxpZ249OAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9NCwgbnZhbGlnbj04XQorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0OiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgWEMKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAwIHwgICAoWEMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMTIgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgWEIpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgc3RydWN0IFhCICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1YNjQtTkVYVDogICAxNiB8ICAgICAoWEIgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgICAgc3RydWN0IFhBIChiYXNlKQorLy8gQ0hFQ0stWDY0LU5FWFQ6ICAgMjQgfCAgICAgICBsb25nIGxvbmcgbGwKKy8vIENIRUNLLVg2NC1ORVhUOiAgIDMyIHwgICAgIGludCBiCisvLyBDSEVDSy1YNjQtTkVYVDogICAgICB8IFtzaXplb2Y9NDAsIGFsaWduPTgKKy8vIENIRUNLLVg2NC1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPThdCisKK25hbWVzcGFjZSBwcmFnbWFfdGVzdDEgeworLy8gTm8gb3ZlcnJpZGVzIG1lYW5zIG5vIHZ0b3JkaXNwcyBieSBkZWZhdWx0Lgorc3RydWN0IEEgeyB2aXJ0dWFsIH5BKCk7IHZpcnR1YWwgdm9pZCBmb28oKTsgaW50IGE7IH07CitzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7IHZpcnR1YWwgfkIoKTsgdmlydHVhbCB2b2lkIGJhcigpOyBpbnQgYjsgfTsKK3N0cnVjdCBDIDogdmlydHVhbCBCIHsgaW50IGM7IH07CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IHByYWdtYV90ZXN0MTo6QworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgaW50IGMKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgIHN0cnVjdCBwcmFnbWFfdGVzdDE6OkEgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgIDggfCAgICAgKEEgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICBpbnQgYQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgc3RydWN0IHByYWdtYV90ZXN0MTo6QiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxNiB8ICAgICAoQiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDIwIHwgICAgIChCIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgICAgaW50IGIKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTI4LCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCit9CisKK25hbWVzcGFjZSBwcmFnbWFfdGVzdDIgeworc3RydWN0IEEgeyB2aXJ0dWFsIH5BKCk7IHZpcnR1YWwgdm9pZCBmb28oKTsgaW50IGE7IH07CisjcHJhZ21hIHZ0b3JkaXNwKHB1c2gsMikKK3N0cnVjdCBCIDogdmlydHVhbCBBIHsgdmlydHVhbCB+QigpOyB2aXJ0dWFsIHZvaWQgYmFyKCk7IGludCBiOyB9Oworc3RydWN0IEMgOiB2aXJ0dWFsIEIgeyBpbnQgYzsgfTsKKyNwcmFnbWEgdnRvcmRpc3AocG9wKQorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0stTkVYVDogICAgMCB8IHN0cnVjdCBwcmFnbWFfdGVzdDI6OkMKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCAgIChDIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgIDQgfCAgIGludCBjCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEEpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgcHJhZ21hX3Rlc3QyOjpBICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICAgIChBIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vICAgQnkgYWRkaW5nIGEgdmlydHVhbCBtZXRob2QgYW5kIHZmdGFibGUgdG8gQiwgbm93IHdlIG5lZWQgYSB2dG9yZGlzcC4KKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQikKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgIHN0cnVjdCBwcmFnbWFfdGVzdDI6OkIgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMjQgfCAgICAgKEIgdmZ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAyOCB8ICAgICAoQiB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDMyIHwgICAgIGludCBiCisvLyBDSEVDSy1ORVhUOiAgICAgIHwgW3NpemVvZj0zNiwgYWxpZ249NAorLy8gQ0hFQ0stTkVYVDogICAgICB8ICBudnNpemU9OCwgbnZhbGlnbj00XQorfQorCituYW1lc3BhY2UgcHJhZ21hX3Rlc3QzIHsKK3N0cnVjdCBBIHsgdmlydHVhbCB+QSgpOyB2aXJ0dWFsIHZvaWQgZm9vKCk7IGludCBhOyB9OworI3ByYWdtYSB2dG9yZGlzcChwdXNoLDIpCitzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7IHZpcnR1YWwgfkIoKTsgdmlydHVhbCB2b2lkIGZvbygpOyBpbnQgYjsgfTsKK3N0cnVjdCBDIDogdmlydHVhbCBCIHsgaW50IGM7IH07CisjcHJhZ21hIHZ0b3JkaXNwKHBvcCkKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLLU5FWFQ6ICAgIDAgfCBzdHJ1Y3QgcHJhZ21hX3Rlc3QzOjpDCisvLyBDSEVDSy1ORVhUOiAgICAwIHwgICAoQyB2YnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgICA0IHwgICBpbnQgYworLy8gQ0hFQ0stTkVYVDogICAgOCB8ICAgKHZ0b3JkaXNwIGZvciB2YmFzZSBBKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgc3RydWN0IHByYWdtYV90ZXN0Mzo6QSAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAxMiB8ICAgICAoQSB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDE2IHwgICAgIGludCBhCisvLyAgIE5vIHZ0b3JkaXNwIGJlZm9yZSBCISAgSXQgZG9lc24ndCBoYXZlIGl0cyBvd24gdmZ0YWJsZS4KKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgIHN0cnVjdCBwcmFnbWFfdGVzdDM6OkIgKHZpcnR1YWwgYmFzZSkKKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgICAgKEIgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAyNCB8ICAgICBpbnQgYgorLy8gQ0hFQ0stTkVYVDogICAgICB8IFtzaXplb2Y9MjgsIGFsaWduPTQKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCAgbnZzaXplPTgsIG52YWxpZ249NF0KK30KKworbmFtZXNwYWNlIHByYWdtYV90ZXN0NCB7CitzdHJ1Y3QgQSB7CisgIEEoKTsKKyAgdmlydHVhbCB2b2lkIGZvbygpOworICBpbnQgYTsKK307CisKKy8vIE1ha2Ugc3VyZSB0aGUgcHJhZ21hIGFwcGxpZXMgdG8gY2xhc3MgdGVtcGxhdGUgZGVjbHMgYmVmb3JlIHRoZXkndmUgYmVlbgorLy8gaW5zdGFudGlhdGVkLgorI3ByYWdtYSB2dG9yZGlzcChwdXNoLDIpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBCIDogdmlydHVhbCBBIHsKKyAgQigpOworICB2aXJ0dWFsIH5CKCk7CisgIHZpcnR1YWwgdm9pZCBiYXIoKTsKKyAgVCBiOworfTsKKyNwcmFnbWEgdnRvcmRpc3AocG9wKQorCitzdHJ1Y3QgQyA6IHZpcnR1YWwgQjxpbnQ+IHsgaW50IGM7IH07CisvLyBDSEVDSzogKioqIER1bXBpbmcgQVNUIFJlY29yZCBMYXlvdXQKKy8vIENIRUNLOiAqKiogRHVtcGluZyBBU1QgUmVjb3JkIExheW91dAorLy8gQ0hFQ0s6ICoqKiBEdW1waW5nIEFTVCBSZWNvcmQgTGF5b3V0CisvLyBDSEVDSy1ORVhUOiAgICAwIHwgc3RydWN0IHByYWdtYV90ZXN0NDo6QworLy8gQ0hFQ0stTkVYVDogICAgMCB8ICAgKEMgdmJ0YWJsZSBwb2ludGVyKQorLy8gQ0hFQ0stTkVYVDogICAgNCB8ICAgaW50IGMKKy8vICAgUHJhZ21hIGFwcGxpZXMgdG8gQiwgd2hpY2ggaGFzIHZiYXNlIEEuCisvLyBDSEVDSy1ORVhUOiAgICA4IHwgICAodnRvcmRpc3AgZm9yIHZiYXNlIEEpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICBzdHJ1Y3QgcHJhZ21hX3Rlc3Q0OjpBICh2aXJ0dWFsIGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgIDEyIHwgICAgIChBIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMTYgfCAgICAgaW50IGEKKy8vICAgUHJhZ21hIGRvZXMgbm90IGFwcGx5IHRvIEMsIGFuZCBCIGRvZXNuJ3QgdXN1YWxseSBuZWVkIGEgdnRvcmRpc3AgaW4gQy4KKy8vIENIRUNLLU5FWFQ6ICAgMjAgfCAgIHN0cnVjdCBwcmFnbWFfdGVzdDQ6OkI8aW50PiAodmlydHVhbCBiYXNlKQorLy8gQ0hFQ0stTkVYVDogICAyMCB8ICAgICAoQiB2ZnRhYmxlIHBvaW50ZXIpCisvLyBDSEVDSy1ORVhUOiAgIDI0IHwgICAgIChCIHZidGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICAgMjggfCAgICAgaW50IGIKKy8vIENIRUNLLU5FWFQ6ICAgICAgfCBbc2l6ZW9mPTMyLCBhbGlnbj00CisvLyBDSEVDSy1ORVhUOiAgICAgIHwgIG52c2l6ZT04LCBudmFsaWduPTRdCit9CiAKIGludCBhWwogc2l6ZW9mKEEpKwogc2l6ZW9mKEMpKwogc2l6ZW9mKEQpKwotc2l6ZW9mKENUKV07CitzaXplb2YoQ1QpKworc2l6ZW9mKFhDKSsKK3NpemVvZihwcmFnbWFfdGVzdDE6OkMpKworc2l6ZW9mKHByYWdtYV90ZXN0Mjo6QykrCitzaXplb2YocHJhZ21hX3Rlc3QzOjpDKSsKK3NpemVvZihwcmFnbWFfdGVzdDQ6OkMpXTsKZGlmZiAtLWdpdCBhL3Rlc3QvTGV4ZXIvSW5wdXRzL3N1Y2Nlc3MuaCBiL3Rlc3QvTGV4ZXIvSW5wdXRzL3N1Y2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmRmNWFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9MZXhlci9JbnB1dHMvc3VjY2Vzcy5oCkBAIC0wLDAgKzEgQEAKKyNlcnJvciBzdWNjZXNzCmRpZmYgLS1naXQgYS90ZXN0L0xleGVyL2JjcGwtZXNjYXBlZC1uZXdsaW5lLmMgYi90ZXN0L0xleGVyL2JjcGwtZXNjYXBlZC1uZXdsaW5lLmMKaW5kZXggZDg3ZWU5Yi4uMDVkNDc3MyAxMDA2NDQKLS0tIGEvdGVzdC9MZXhlci9iY3BsLWVzY2FwZWQtbmV3bGluZS5jCisrKyBiL3Rlc3QvTGV4ZXIvYmNwbC1lc2NhcGVkLW5ld2xpbmUuYwpAQCAtMTEsMyArMTEsNCBAQAogLy8gVHJhaWxpbmcgd2hpdGVzcGFjZSEKIC8vXCAKICNlcnJvciBxdXV4CisvLyBleHBlY3RlZC13YXJuaW5nQC0yIHt7YmFja3NsYXNoIGFuZCBuZXdsaW5lIHNlcGFyYXRlZCBieSBzcGFjZX19CmRpZmYgLS1naXQgYS90ZXN0L0xleGVyL2Nyb3NzLXdpbmRvd3Mtb24tbGludXgtZGVmYXVsdC5jcHAgYi90ZXN0L0xleGVyL2Nyb3NzLXdpbmRvd3Mtb24tbGludXgtZGVmYXVsdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwYjQxOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTGV4ZXIvY3Jvc3Mtd2luZG93cy1vbi1saW51eC1kZWZhdWx0LmNwcApAQCAtMCwwICsxLDYgQEAKKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtZm1zLWNvbXBhdGliaWxpdHkgLXRyaXBsZSBpNjg2LXdpbjMyICVzIDI+JjEgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrICVzCisKKyNpbmNsdWRlICJJbnB1dHNcc3VjY2Vzcy5oIgorCisvLyBDSEVDSzogZXJyb3I6IHN1Y2Nlc3MKZGlmZiAtLWdpdCBhL3Rlc3QvTGV4ZXIvY3Jvc3Mtd2luZG93cy1vbi1saW51eC5jcHAgYi90ZXN0L0xleGVyL2Nyb3NzLXdpbmRvd3Mtb24tbGludXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMDFkNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0xleGVyL2Nyb3NzLXdpbmRvd3Mtb24tbGludXguY3BwCkBAIC0wLDAgKzEsMTUgQEAKKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdHJpcGxlIGk2ODYtd2luMzIgJXMgMj4mMSB8IEZpbGVDaGVjayAlcworCisjaW5jbHVkZSAiSW5wdXRzXHN1Y2Nlc3MuaCIKKworLy8gQ0hFQ0s6IGVycm9yOiAnSW5wdXRzXHN1Y2Nlc3MuaCcgZmlsZSBub3QgZm91bmQKKy8vIENIRUNLOiAjaW5jbHVkZSAiSW5wdXRzXHN1Y2Nlc3MuaCIKKy8vIENIRUNLOiAgICAgICAgICBeCisKKy8vIGV4cGVjdGVkIHRvIGZhaWwgb24gd2luZG93cyBhcyB0aGUgaW5jbHVzaW9uIHdvdWxkIHN1Y2Nlc3MgYW5kIHRoZQorLy8gY29tcGlsYXRpb24gd2lsbCBmYWlsIGR1ZSB0byB0aGUgJyNlcnJvciBzdWNjZXNzJworLy8gWEZBSUw6IHdpbjMyCisKKy8vIFRoaXMgdGVzdCBtYXkgb3IgbWF5IG5vdCBmYWlsIHNpbmNlICdJbnB1dHNcc3VjY2Vzcy5oJyBpcyBwYXNzZWQKKy8vIHRvIFdpbjMyIEFQSSBvbiB3aW4zMi4KKy8vIFJFUVVJUkVTOiBkaXNhYmxlZApkaWZmIC0tZ2l0IGEvdGVzdC9MZXhlci9jeHgxeV9kaWdpdF9zZXBhcmF0b3JzLmNwcCBiL3Rlc3QvTGV4ZXIvY3h4MXlfZGlnaXRfc2VwYXJhdG9ycy5jcHAKaW5kZXggMzllYTNlNy4uZGNmYjZkMCAxMDA2NDQKLS0tIGEvdGVzdC9MZXhlci9jeHgxeV9kaWdpdF9zZXBhcmF0b3JzLmNwcAorKysgYi90ZXN0L0xleGVyL2N4eDF5X2RpZ2l0X3NlcGFyYXRvcnMuY3BwCkBAIC0xOCw2ICsxOCw4IEBACiAgIGludCBlID0gMCdiMTAxMDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkaWdpdCAnYicgaW4gb2N0YWwgY29uc3RhbnR9fQogICBpbnQgZiA9IDBiJzEwMTA7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW52YWxpZCBkaWdpdCAnYicgaW4gb2N0YWx9fQogICBpbnQgZyA9IDEyMydtczsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkaWdpdCBzZXBhcmF0b3IgY2Fubm90IGFwcGVhciBhdCBlbmQgb2YgZGlnaXQgc2VxdWVuY2V9fQorICBpbnQgaCA9IDB4MWUrMTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbnZhbGlkIHN1ZmZpeCAnKzEnIG9uIGludGVnZXIgY29uc3RhbnR9fQorICBpbnQgaSA9IDB4MSdlKzE7IC8vIG9rLCAnZSsnIGlzIG5vdCByZWNvZ25pemVkIGFmdGVyIGEgZGlnaXQgc2VwYXJhdG9yCiAKICAgaW50IHogPSAwJzEyMydfZm9vOyAvLyc7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGFwcGVhciBhdCBlbmQgb2YgZGlnaXQgc2VxfX0KIH0KQEAgLTQxLDMgKzQzLDIzIEBACiAjZGVmaW5lIE0oeCwgLi4uKSBfX1ZBX0FSR1NfXwogY29uc3RleHByIGludCB4ID0geyBNKDEnMiwzJzQpIH07CiBzdGF0aWNfYXNzZXJ0KHggPT0gMzQsICIiKTsKKworbmFtZXNwYWNlIFVDTnMgeworICAvLyBVQ05zIGNhbiBhcHBlYXIgYmVmb3JlIGRpZ2l0IHNlcGFyYXRvcnMgYnV0IG5vdCBhZnRlci4KKyAgaW50IGEgPSAwXHUxMjM0JzU7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW52YWxpZCBzdWZmaXggJ1x1MTIzNCc1JyBvbiBpbnRlZ2VyIGNvbnN0YW50fX0KKyAgaW50IGIgPSAwJ1x1MTIzNDU7IC8vICc7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJzsnfX0KKyAgY29uc3RleHByIGludCBjIHtNKDBcdTEyMzQnMCwwJzEpfTsKKyAgY29uc3RleHByIGludCBkIHtNKDAwJ1x1MTIzNCwwJzEpfTsKKyAgc3RhdGljX2Fzc2VydChjID09IDEsICIiKTsKKyAgc3RhdGljX2Fzc2VydChkID09IDAsICIiKTsKK30KKworbmFtZXNwYWNlIFVURjggeworICAvLyBleHRlbmRlZCBjaGFyYWN0ZXJzIGNhbiBhcHBlYXIgYmVmb3JlIGRpZ2l0IHNlcGFyYXRvcnMgYnV0IG5vdCBhZnRlci4KKyAgaW50IGEgPSAw4Yi0JzU7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW52YWxpZCBzdWZmaXggJ+GItCc1JyBvbiBpbnRlZ2VyIGNvbnN0YW50fX0KKyAgaW50IGIgPSAwJ+GItDU7IC8vICc7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJzsnfX0KKyAgY29uc3RleHByIGludCBjIHtNKDDhiLQnMCwwJzEpfTsKKyAgY29uc3RleHByIGludCBkIHtNKDAwJ+GItCwwJzEpfTsKKyAgc3RhdGljX2Fzc2VydChjID09IDEsICIiKTsKKyAgc3RhdGljX2Fzc2VydChkID09IDAsICIiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTGV4ZXIvaGFzX2ZlYXR1cmVfdHlwZV90cmFpdHMuY3BwIGIvdGVzdC9MZXhlci9oYXNfZmVhdHVyZV90eXBlX3RyYWl0cy5jcHAKaW5kZXggMGMyY2ZhNS4uZjc3MmQ2ZCAxMDA2NDQKLS0tIGEvdGVzdC9MZXhlci9oYXNfZmVhdHVyZV90eXBlX3RyYWl0cy5jcHAKKysrIGIvdGVzdC9MZXhlci9oYXNfZmVhdHVyZV90eXBlX3RyYWl0cy5jcHAKQEAgLTU1LDYgKzU1LDExIEBACiAjZW5kaWYKIC8vIENIRUNLOiBpbnQgaXNfY2xhc3MoKTsKIAorI2lmIF9faGFzX2ZlYXR1cmUoaXNfY29uc3RydWN0aWJsZSkKK2ludCBpc19jb25zdHJ1Y3RpYmxlKCk7CisjZW5kaWYKKy8vIENIRUNLOiBpbnQgaXNfY29uc3RydWN0aWJsZSgpOworCiAjaWYgX19oYXNfZmVhdHVyZShpc19jb252ZXJ0aWJsZV90bykKIGludCBpc19jb252ZXJ0aWJsZV90bygpOwogI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L0xleGVyL2hleGZsb2F0LmNwcCBiL3Rlc3QvTGV4ZXIvaGV4ZmxvYXQuY3BwCmluZGV4IDliZDhmODMuLmJkNTNkNGEgMTAwNjQ0Ci0tLSBhL3Rlc3QvTGV4ZXIvaGV4ZmxvYXQuY3BwCisrKyBiL3Rlc3QvTGV4ZXIvaGV4ZmxvYXQuY3BwCkBAIC0xMiw0ICsxMiw0IEBACiBkb3VibGUgaSA9IDBwKzM7IC8vIGV4cGVjdGVkLWVycm9ye3tpbnZhbGlkIHN1ZmZpeCAncCcgb24gaW50ZWdlciBjb25zdGFudH19CiAjZGVmaW5lIFBSRUZJWCh4KSBmb28gIyMgeAogZG91YmxlIGZvbzBwID0gMSwgaiA9IFBSRUZJWCgwcCszKTsgLy8gb2sKLWRvdWJsZSBrID0gMHg0Ml9hbXArMzsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e2ludmFsaWQgc3VmZml4ICdfYW1wJyBvbiBpbnRlZ2VyIGNvbnN0YW50fG5vIG1hdGNoaW5nIGxpdGVyYWwgb3BlcmF0b3IgZm9yIGNhbGwgdG8gJ29wZXJhdG9yICIiIF9hbXAnfX0KK2RvdWJsZSBrID0gMHg0Ml9hbXArMzsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e3t7aW52YWxpZCBzdWZmaXggJ19hbXAnIG9uIGludGVnZXIgY29uc3RhbnR8bm8gbWF0Y2hpbmcgbGl0ZXJhbCBvcGVyYXRvciBmb3IgY2FsbCB0byAnb3BlcmF0b3IgIiIgX2FtcCd9fX19CmRpZmYgLS1naXQgYS90ZXN0L01ha2VmaWxlIGIvdGVzdC9NYWtlZmlsZQppbmRleCBkYmZhNTIxLi5kYTdiOTY1IDEwMDY0NAotLS0gYS90ZXN0L01ha2VmaWxlCisrKyBiL3Rlc3QvTWFrZWZpbGUKQEAgLTQ0LDEwICs0NCwxMyBAQAogCUAkKEVDSE9QQVRIKSBzPUBMTFZNX0xJQlNfRElSQD0kKExpYkRpcik9ZyA+PiBsaXQudG1wCiAJQCQoRUNIT1BBVEgpIHM9QENMQU5HX1NPVVJDRV9ESVJAPSQoUFJPSl9TUkNfRElSKS8uLj1nID4+IGxpdC50bXAKIAlAJChFQ0hPUEFUSCkgcz1AQ0xBTkdfQklOQVJZX0RJUkA9JChQUk9KX09CSl9ESVIpLy4uPWcgPj4gbGl0LnRtcAorCUAkKEVDSE9QQVRIKSBzPUBDTEFOR19UT09MU19ESVJAPSQoVG9vbERpcik9ZyA+PiBsaXQudG1wCiAJQCQoRUNIT1BBVEgpIHM9QFRBUkdFVF9UUklQTEVAPSQoVEFSR0VUX1RSSVBMRSk9ZyA+PiBsaXQudG1wCiAJQCQoRUNIT1BBVEgpIHM9QEVOQUJMRV9DTEFOR19BUkNNVEA9JChFTkFCTEVfQ0xBTkdfQVJDTVQpPWcgPj4gbGl0LnRtcAogCUAkKEVDSE9QQVRIKSBzPUBFTkFCTEVfQ0xBTkdfUkVXUklURVJAPSQoRU5BQkxFX0NMQU5HX1JFV1JJVEVSKT1nID4+IGxpdC50bXAKIAlAJChFQ0hPUEFUSCkgcz1ARU5BQkxFX0NMQU5HX1NUQVRJQ19BTkFMWVpFUkA9JChFTkFCTEVfQ0xBTkdfU1RBVElDX0FOQUxZWkVSKT1nID4+IGxpdC50bXAKKwlAJChFQ0hPUEFUSCkgcz1ARU5BQkxFX0NMQU5HX0VYQU1QTEVTQD0kKEVOQUJMRV9DTEFOR19FWEFNUExFUyk9ZyA+PiBsaXQudG1wCisJQCQoRUNIT1BBVEgpIHM9QEVOQUJMRV9TSEFSRURAPSQoRU5BQkxFX1NIQVJFRCk9ZyA+PiBsaXQudG1wCiAJQHNlZCAtZiBsaXQudG1wICQoUFJPSl9TUkNfRElSKS9saXQuc2l0ZS5jZmcuaW4gPiAkQAogCUAtcm0gLWYgbGl0LnRtcAogCmRpZmYgLS1naXQgYS90ZXN0L01pc2MvSW5wdXRzL3NlcmlhbGl6ZWQtZGlhZ3Mtc3RhYmxlLmRpYSBiL3Rlc3QvTWlzYy9JbnB1dHMvc2VyaWFsaXplZC1kaWFncy1zdGFibGUuZGlhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZGFhZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01pc2MvSW5wdXRzL3NlcmlhbGl6ZWQtZGlhZ3Mtc3RhYmxlLmRpYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L01pc2MvYXN0LWR1bXAtYXJtLWF0dHIuYyBiL3Rlc3QvTWlzYy9hc3QtZHVtcC1hcm0tYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzM1MzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01pc2MvYXN0LWR1bXAtYXJtLWF0dHIuYwpAQCAtMCwwICsxLDUgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybS1hcHBsZS1kYXJ3aW4gLWFzdC1kdW1wIC1hc3QtZHVtcC1maWx0ZXIgVGVzdCAlcyB8IEZpbGVDaGVjayAtLXN0cmljdC13aGl0ZXNwYWNlICVzDQorDQorX19hdHRyaWJ1dGVfXygoaW50ZXJydXB0KSkgdm9pZCBUZXN0KHZvaWQpOw0KKy8vIENIRUNLOiBGdW5jdGlvbkRlY2x7ey4qfX1UZXN0DQorLy8gQ0hFQ0stTkVYVDogQVJNSW50ZXJydXB0QXR0cg0KZGlmZiAtLWdpdCBhL3Rlc3QvTWlzYy9hc3QtZHVtcC1hdHRyLmNwcCBiL3Rlc3QvTWlzYy9hc3QtZHVtcC1hdHRyLmNwcAppbmRleCA3MjliZTFmLi5kZGU3YmEzIDEwMDY0NAotLS0gYS90ZXN0L01pc2MvYXN0LWR1bXAtYXR0ci5jcHAKKysrIGIvdGVzdC9NaXNjL2FzdC1kdW1wLWF0dHIuY3BwCkBAIC0yOSwxMiArMjksMTIgQEAKIAogaW50IFRlc3RBbGlnbmVkTnVsbCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKSk7CiAvLyBDSEVDSzogICAgICBWYXJEZWNse3suKn19VGVzdEFsaWduZWROdWxsCi0vLyBDSEVDSy1ORVhUOiAgIEFsaWduZWRBdHRyCisvLyBDSEVDSy1ORVhUOiAgIEFsaWduZWRBdHRyIHt7Lip9fSBhbGlnbmVkCiAvLyBDSEVDSy1ORVhUOiAgICAgPDw8TlVMTD4+PgogCiBpbnQgVGVzdEFsaWduZWRFeHByIF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKIC8vIENIRUNLOiAgICAgIFZhckRlY2x7ey4qfX1UZXN0QWxpZ25lZEV4cHIKLS8vIENIRUNLLU5FWFQ6ICAgQWxpZ25lZEF0dHIKKy8vIENIRUNLLU5FWFQ6ICAgQWxpZ25lZEF0dHIge3suKn19IGFsaWduZWQKIC8vIENIRUNLLU5FWFQ6ICAgICBJbnRlZ2VyTGl0ZXJhbAogCiBpbnQgVGVzdEVudW0gX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSk7CkBAIC02MywxNyArNjMsMTcgQEAKIHZvaWQgVGVzdElkZW50aWZpZXIodm9pZCAqLCBpbnQpCiBfX2F0dHJpYnV0ZV9fKChwb2ludGVyX3dpdGhfdHlwZV90YWcoaWRlbnQxLDEsMikpKTsKIC8vIENIRUNLOiBGdW5jdGlvbkRlY2x7ey4qfX1UZXN0SWRlbnRpZmllcgotLy8gQ0hFQ0s6ICAgQXJndW1lbnRXaXRoVHlwZVRhZ0F0dHJ7ey4qfX0gaWRlbnQxCisvLyBDSEVDSzogICBBcmd1bWVudFdpdGhUeXBlVGFnQXR0cnt7Lip9fSBwb2ludGVyX3dpdGhfdHlwZV90YWcgaWRlbnQxCiAKIHZvaWQgVGVzdEJvb2wodm9pZCAqLCBpbnQpCiBfX2F0dHJpYnV0ZV9fKChwb2ludGVyX3dpdGhfdHlwZV90YWcoYm9vbDEsMSwyKSkpOwogLy8gQ0hFQ0s6IEZ1bmN0aW9uRGVjbHt7Lip9fVRlc3RCb29sCi0vLyBDSEVDSzogICBBcmd1bWVudFdpdGhUeXBlVGFnQXR0cnt7Lip9fSBJc1BvaW50ZXIKKy8vIENIRUNLOiAgIEFyZ3VtZW50V2l0aFR5cGVUYWdBdHRye3suKn19cG9pbnRlcl93aXRoX3R5cGVfdGFnIGJvb2wxIDAgMSBJc1BvaW50ZXIKIAogdm9pZCBUZXN0VW5zaWduZWQodm9pZCAqLCBpbnQpCiBfX2F0dHJpYnV0ZV9fKChwb2ludGVyX3dpdGhfdHlwZV90YWcodW5zaWduZWQxLDEsMikpKTsKIC8vIENIRUNLOiBGdW5jdGlvbkRlY2x7ey4qfX1UZXN0VW5zaWduZWQKLS8vIENIRUNLOiAgIEFyZ3VtZW50V2l0aFR5cGVUYWdBdHRye3suKn19IDAgMQorLy8gQ0hFQ0s6ICAgQXJndW1lbnRXaXRoVHlwZVRhZ0F0dHJ7ey4qfX0gcG9pbnRlcl93aXRoX3R5cGVfdGFnIHVuc2lnbmVkMSAwIDEKIAogdm9pZCBUZXN0SW50KHZvaWQpIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKDEyMykpKTsKIC8vIENIRUNLOiAgICAgIEZ1bmN0aW9uRGVjbHt7Lip9fVRlc3RJbnQKQEAgLTg4LDE0ICs4OCw2IEBACiAvLyBDSEVDSzogICAgICBWYXJEZWNse3suKn19VGVzdFR5cGUKIC8vIENIRUNLLU5FWFQ6ICAgVHlwZVRhZ0ZvckRhdGF0eXBlQXR0cnt7Lip9fSBpbnQKIAotdm9pZCAqVGVzdFZhcmlhZGljVW5zaWduZWQxKGludCkgX19hdHRyaWJ1dGVfXygoYWxsb2Nfc2l6ZSgxKSkpOwotLy8gQ0hFQ0s6IEZ1bmN0aW9uRGVjbHt7Lip9fVRlc3RWYXJpYWRpY1Vuc2lnbmVkMQotLy8gQ0hFQ0s6ICAgQWxsb2NTaXplQXR0cnt7Lip9fSAwCi0KLXZvaWQgKlRlc3RWYXJpYWRpY1Vuc2lnbmVkMihpbnQsIGludCkgX19hdHRyaWJ1dGVfXygoYWxsb2Nfc2l6ZSgxLDIpKSk7Ci0vLyBDSEVDSzogRnVuY3Rpb25EZWNse3suKn19VGVzdFZhcmlhZGljVW5zaWduZWQyCi0vLyBDSEVDSzogICBBbGxvY1NpemVBdHRye3suKn19IDAgMQotCiB2b2lkIFRlc3RMYWJlbCgpIHsKIEw6IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGludCBpOwogLy8gQ0hFQ0s6IExhYmVsU3RtdHt7Lip9fSdMJwpAQCAtMTExLDMgKzEwMywyOSBAQAogLy8gQ0hFQ0s6IExhYmVsU3RtdCB7ey4qfX0gJ04nCiAvLyBDSEVDSy1ORVhUOiBOdWxsU3RtdAogfQorCituYW1lc3BhY2UgVGVzdCB7CitleHRlcm4gIkMiIGludCBwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworLy8gQ0hFQ0s6IEZ1bmN0aW9uRGVjbHt7Lip9fXByaW50ZgorLy8gQ0hFQ0stTkVYVDogUGFybVZhckRlY2x7ey4qfX1mb3JtYXR7ey4qfX0nY29uc3QgY2hhciAqJworLy8gQ0hFQ0stTkVYVDogRm9ybWF0QXR0cnt7Lip9fXByaW50ZiAxIDIgSW1wbGljaXQKK30KKworaW50IF9fYXR0cmlidXRlX18oKGNkZWNsKSkgVGVzdE9uZSh2b2lkKSwgVGVzdFR3byh2b2lkKTsKKy8vIENIRUNLOiBGdW5jdGlvbkRlY2x7ey4qfX1UZXN0T25le3suKn19X19hdHRyaWJ1dGVfXygoY2RlY2wpKQorLy8gQ0hFQ0s6IEZ1bmN0aW9uRGVjbHt7Lip9fVRlc3RUd297ey4qfX1fX2F0dHJpYnV0ZV9fKChjZGVjbCkpCisKK3ZvaWQgZnVuYygpIHsKKyAgYXV0byBUZXN0ID0gW10oKSBfX2F0dHJpYnV0ZV9fKChub190aHJlYWRfc2FmZXR5X2FuYWx5c2lzKSkge307CisgIC8vIENIRUNLOiBDWFhNZXRob2REZWNse3suKn19b3BlcmF0b3IoKSAndm9pZCAodm9pZCkgY29uc3QnCisgIC8vIENIRUNLOiBOb1RocmVhZFNhZmV0eUFuYWx5c2lzQXR0cgorCisgIC8vIEJlY2F1c2UgR05VJ3Mgbm9yZXR1cm4gYXBwbGllcyB0byB0aGUgZnVuY3Rpb24gdHlwZSwgYW5kIHRoaXMgbGFtYmRhIGRvZXMKKyAgLy8gbm90IGhhdmUgYSBjYXB0dXJlIGxpc3QsIHRoZSBjYWxsIG9wZXJhdG9yIGFuZCB0aGUgZnVuY3Rpb24gcG9pbnRlcgorICAvLyBjb252ZXJzaW9uIHNob3VsZCBib3RoIGJlIG5vcmV0dXJuLCBidXQgdGhlIG1ldGhvZCBzaG91bGQgbm90IGNvbnRhaW4gYQorICAvLyBOb1JldHVybkF0dHIgYmVjYXVzZSB0aGUgYXR0cmlidXRlIGFwcGxpZWQgdG8gdGhlIHR5cGUuCisgIGF1dG8gVGVzdDIgPSBbXSgpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkgeyB3aGlsZSgxKTsgfTsKKyAgLy8gQ0hFQ0s6IENYWE1ldGhvZERlY2x7ey4qfX1vcGVyYXRvcigpICd2b2lkICh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIGNvbnN0JworICAvLyBDSEVDSy1OT1Q6IE5vUmV0dXJuQXR0cgorICAvLyBDSEVDSzogQ1hYQ29udmVyc2lvbkRlY2x7ey4qfX1vcGVyYXRvciB2b2lkICgqKSgpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTWlzYy9hc3QtZHVtcC1jb2xvci5jcHAgYi90ZXN0L01pc2MvYXN0LWR1bXAtY29sb3IuY3BwCmluZGV4IGE0MWMwYmIuLjNhZGE2ZDIgMTAwNjQ0Ci0tLSBhL3Rlc3QvTWlzYy9hc3QtZHVtcC1jb2xvci5jcHAKKysrIGIvdGVzdC9NaXNjL2FzdC1kdW1wLWNvbG9yLmNwcApAQCAtMjUsMjIgKzI1LDIyIEBACiB9IG11MSwgbXUyOwogaW50IFRlc3RFeHByIF9fYXR0cmlidXRlX18oKGd1YXJkZWRfYnkobXUxKSkpOwogCi0vL0NIRUNLOiB7e159fVtbQmx1ZTouXFswOzM0bV1dW1tSRVNFVDouXFswbV1dW1tHUkVFTjouXFswOzE7MzJtXV1UcmFuc2xhdGlvblVuaXREZWNsW1tSRVNFVF1dW1tZZWxsb3c6LlxbMDszM21dXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV08aW52YWxpZCBzbG9jPltbUkVTRVRdXT57eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwtW1tSRVNFVF1dW1tHUkVFTl1dVHlwZWRlZkRlY2xbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXTxpbnZhbGlkIHNsb2M+W1tSRVNFVF1dPltbQ1lBTjouXFswOzE7MzZtXV0gX19pbnQxMjhfdFtbUkVTRVRdXSBbW0dyZWVuOi5cWzA7MzJtXV0nX19pbnQxMjgnW1tSRVNFVF1de3skfX0KLS8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18LVtbUkVTRVRdXVtbR1JFRU5dXVR5cGVkZWZEZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV08aW52YWxpZCBzbG9jPltbUkVTRVRdXT5bW0NZQU5dXSBfX3VpbnQxMjhfdFtbUkVTRVRdXSBbW0dyZWVuXV0ndW5zaWduZWQgX19pbnQxMjgnW1tSRVNFVF1de3skfX0KLS8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18LVtbUkVTRVRdXVtbR1JFRU5dXVR5cGVkZWZEZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV08aW52YWxpZCBzbG9jPltbUkVTRVRdXT5bW0NZQU5dXSBfX2J1aWx0aW5fdmFfbGlzdFtbUkVTRVRdXSBbW0dyZWVuXV0nX192YV9saXN0X3RhZyBbMV0nW1tSRVNFVF1de3skfX0KLS8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18LVtbUkVTRVRdXVtbR1JFRU5dXVZhckRlY2xbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXXt7Lip9fWFzdC1kdW1wLWNvbG9yLmNwcDo2OjFbW1JFU0VUXV0sIFtbWWVsbG93XV1jb2w6NVtbUkVTRVRdXT5bW0NZQU5dXSBUZXN0W1tSRVNFVF1dIFtbR3JlZW5dXSdpbnQnW1tSRVNFVF1de3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlOi5cWzA7MzRtXV1bW1JFU0VUOi5cWzBtXV1bW0dSRUVOOi5cWzA7MTszMm1dXVRyYW5zbGF0aW9uVW5pdERlY2xbW1JFU0VUXV1bW1llbGxvdzouXFswOzMzbV1dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXTxpbnZhbGlkIHNsb2M+W1tSRVNFVF1dPiBbW1llbGxvd11dPGludmFsaWQgc2xvYz5bW1JFU0VUXV17eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwtW1tSRVNFVF1dW1tHUkVFTl1dVHlwZWRlZkRlY2xbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXTxpbnZhbGlkIHNsb2M+W1tSRVNFVF1dPiBbW1llbGxvd11dPGludmFsaWQgc2xvYz5bW1JFU0VUXV1bW0NZQU46LlxbMDsxOzM2bV1dIF9faW50MTI4X3RbW1JFU0VUXV0gW1tHcmVlbjouXFswOzMybV1dJ19faW50MTI4J1tbUkVTRVRdXXt7JH19CisvL0NIRUNLOiB7e159fVtbQmx1ZV1dfC1bW1JFU0VUXV1bW0dSRUVOXV1UeXBlZGVmRGVjbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dPGludmFsaWQgc2xvYz5bW1JFU0VUXV0+IFtbWWVsbG93XV08aW52YWxpZCBzbG9jPltbUkVTRVRdXVtbQ1lBTl1dIF9fdWludDEyOF90W1tSRVNFVF1dIFtbR3JlZW5dXSd1bnNpZ25lZCBfX2ludDEyOCdbW1JFU0VUXV17eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwtW1tSRVNFVF1dW1tHUkVFTl1dVHlwZWRlZkRlY2xbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXTxpbnZhbGlkIHNsb2M+W1tSRVNFVF1dPiBbW1llbGxvd11dPGludmFsaWQgc2xvYz5bW1JFU0VUXV1bW0NZQU5dXSBfX2J1aWx0aW5fdmFfbGlzdFtbUkVTRVRdXSBbW0dyZWVuXV0nX192YV9saXN0X3RhZyBbMV0nW1tSRVNFVF1de3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18LVtbUkVTRVRdXVtbR1JFRU5dXVZhckRlY2xbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXXt7Lip9fWFzdC1kdW1wLWNvbG9yLmNwcDo2OjFbW1JFU0VUXV0sIFtbWWVsbG93XV1jb2w6NVtbUkVTRVRdXT4gW1tZZWxsb3ddXWNvbDo1W1tSRVNFVF1dW1tDWUFOXV0gVGVzdFtbUkVTRVRdXSBbW0dyZWVuXV0naW50J1tbUkVTRVRdXXt7JH19CiAvL0NIRUNLOiB7e159fVtbQmx1ZV1dfCB8LVtbUkVTRVRdXVtbQkxVRTouXFswOzE7MzRtXV1VbnVzZWRBdHRyW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6MjVbW1JFU0VUXV0+e3skfX0KLS8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IGAtW1tSRVNFVF1dW1tZRUxMT1c6LlxbMDsxOzMzbV1dRnVsbENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6NDo0W1tSRVNFVF1dLCBbW1llbGxvd11dbGluZTo1OjhbW1JFU0VUXV0+e3skfX0KLS8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18ICAgYC1bW1JFU0VUXV1bW1lFTExPV11dUGFyYWdyYXBoQ29tbWVudFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZTo0OjRbW1JFU0VUXV0sIFtbWWVsbG93XV1saW5lOjU6OFtbUkVTRVRdXT57eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgICAgIHwtW1tSRVNFVF1dW1tZRUxMT1ddXVRleHRDb21tZW50W1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1saW5lOjQ6NFtbUkVTRVRdXT4gVGV4dD0iICJ7eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgICAgIHwtW1tSRVNFVF1dW1tZRUxMT1ddXUhUTUxTdGFydFRhZ0NvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo1W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjdbW1JFU0VUXV0+IE5hbWU9ImEie3skfX0KLS8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18ICAgICB8LVtbUkVTRVRdXVtbWUVMTE9XXV1UZXh0Q29tbWVudFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjhbW1JFU0VUXV0sIFtbWWVsbG93XV1jb2w6MTJbW1JFU0VUXV0+IFRleHQ9IkhlbGxvInt7JH19Ci0vL0NIRUNLOiB7e159fVtbQmx1ZV1dfCAgICAgfC1bW1JFU0VUXV1bW1lFTExPV11dSFRNTEVuZFRhZ0NvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDoxM1tbUkVTRVRdXSwgW1tZZWxsb3ddXWNvbDoxNltbUkVTRVRdXT4gTmFtZT0iYSJ7eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgICAgIHwtW1tSRVNFVF1dW1tZRUxMT1ddXVRleHRDb21tZW50W1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1saW5lOjU6NFtbUkVTRVRdXT4gVGV4dD0iICJ7eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgICAgIGAtW1tSRVNFVF1dW1tZRUxMT1ddXUhUTUxTdGFydFRhZ0NvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo1W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjhbW1JFU0VUXV0+IE5hbWU9ImJyIiBTZWxmQ2xvc2luZ3t7JH19Ci0vL0NIRUNLOiB7e159fVtbQmx1ZV1dfC1bW1JFU0VUXV1bW0dSRUVOXV1GdW5jdGlvbkRlY2xbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6OToxW1tSRVNFVF1dLCBbW1llbGxvd11dbGluZToxNjoxW1tSRVNFVF1dPltbQ1lBTl1dIFRlc3RBdHRyaWJ1dGVkU3RtdFtbUkVTRVRdXSBbW0dyZWVuXV0ndm9pZCAodm9pZCknW1tSRVNFVF1de3skfX0KLS8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwtW1tSRVNFVF1dW1tNQUdFTlRBOi5cWzA7MTszNW1dXUNvbXBvdW5kU3RtdFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZTo5OjI3W1tSRVNFVF1dLCBbW1llbGxvd11dbGluZToxNjoxW1tSRVNFVF1dPnt7JH19CisvL0NIRUNLOiB7e159fVtbQmx1ZV1dfCBgLVtbUkVTRVRdXVtbQmx1ZV1dRnVsbENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6NDo0W1tSRVNFVF1dLCBbW1llbGxvd11dbGluZTo1OjhbW1JFU0VUXV0+e3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18ICAgYC1bW1JFU0VUXV1bW0JsdWVdXVBhcmFncmFwaENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6NDo0W1tSRVNFVF1dLCBbW1llbGxvd11dbGluZTo1OjhbW1JFU0VUXV0+e3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18ICAgICB8LVtbUkVTRVRdXVtbQmx1ZV1dVGV4dENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6NDo0W1tSRVNFVF1dPiBUZXh0PSIgInt7JH19CisvL0NIRUNLOiB7e159fVtbQmx1ZV1dfCAgICAgfC1bW1JFU0VUXV1bW0JsdWVdXUhUTUxTdGFydFRhZ0NvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo1W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjdbW1JFU0VUXV0+IE5hbWU9ImEie3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18ICAgICB8LVtbUkVTRVRdXVtbQmx1ZV1dVGV4dENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo4W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjEyW1tSRVNFVF1dPiBUZXh0PSJIZWxsbyJ7eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgICAgIHwtW1tSRVNFVF1dW1tCbHVlXV1IVE1MRW5kVGFnQ29tbWVudFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjEzW1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjE2W1tSRVNFVF1dPiBOYW1lPSJhInt7JH19CisvL0NIRUNLOiB7e159fVtbQmx1ZV1dfCAgICAgfC1bW1JFU0VUXV1bW0JsdWVdXVRleHRDb21tZW50W1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1saW5lOjU6NFtbUkVTRVRdXT4gVGV4dD0iICJ7eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgICAgIGAtW1tSRVNFVF1dW1tCbHVlXV1IVE1MU3RhcnRUYWdDb21tZW50W1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6NVtbUkVTRVRdXSwgW1tZZWxsb3ddXWNvbDo4W1tSRVNFVF1dPiBOYW1lPSJiciIgU2VsZkNsb3Npbmd7eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwtW1tSRVNFVF1dW1tHUkVFTl1dRnVuY3Rpb25EZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1saW5lOjk6MVtbUkVTRVRdXSwgW1tZZWxsb3ddXWxpbmU6MTY6MVtbUkVTRVRdXT4gW1tZZWxsb3ddXWxpbmU6OTo2W1tSRVNFVF1dW1tDWUFOXV0gVGVzdEF0dHJpYnV0ZWRTdG10W1tSRVNFVF1dIFtbR3JlZW5dXSd2b2lkICh2b2lkKSdbW1JFU0VUXV17eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfC1bW1JFU0VUXV1bW01BR0VOVEE6LlxbMDsxOzM1bV1dQ29tcG91bmRTdG10W1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6MjdbW1JFU0VUXV0sIFtbWWVsbG93XV1saW5lOjE2OjFbW1JFU0VUXV0+e3skfX0KIC8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwgYC1bW1JFU0VUXV1bW01BR0VOVEFdXVN3aXRjaFN0bXRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6MTA6M1tbUkVTRVRdXSwgW1tZZWxsb3ddXWxpbmU6MTU6M1tbUkVTRVRdXT57eyR9fQogLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfCAgIHwtW1tSRVNFVF1dW1tCbHVlOi5cWzA7MzRtXV08PDxOVUxMPj4+W1tSRVNFVF1de3skfX0KIC8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwgICB8LVtbUkVTRVRdXVtbTUFHRU5UQV1dSW50ZWdlckxpdGVyYWxbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6MTA6MTFbW1JFU0VUXV0+IFtbR3JlZW5dXSdpbnQnW1tSRVNFVF1dW1tDeWFuOi5cWzA7MzZtXV1bW1JFU0VUXV1bW0N5YW5dXVtbUkVTRVRdXVtbQ1lBTl1dIDFbW1JFU0VUXV17eyR9fQpAQCAtNTUsMzMgKzU1LDMzIEBACiAvL0NIRUNLOiB7e159fVtbQmx1ZV1dfCB8ICAgICAgIHwtW1tSRVNFVF1dW1tNQUdFTlRBXV1JbnRlZ2VyTGl0ZXJhbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZToxMzo4W1tSRVNFVF1dPiBbW0dyZWVuXV0naW50J1tbUkVTRVRdXVtbQ3lhbl1dW1tSRVNFVF1dW1tDeWFuXV1bW1JFU0VUXV1bW0NZQU5dXSAyW1tSRVNFVF1de3skfX0KIC8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwgICAgICAgfC1bW1JFU0VUXV1bW0JsdWVdXTw8PE5VTEw+Pj5bW1JFU0VUXV17eyR9fQogLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfCAgICAgICBgLVtbUkVTRVRdXVtbTUFHRU5UQV1dTnVsbFN0bXRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6MTQ6NVtbUkVTRVRdXT57eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgYC1bW1JFU0VUXV1bW1lFTExPV11dRnVsbENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6ODo0W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjExW1tSRVNFVF1dPnt7JH19Ci0vL0NIRUNLOiB7e159fVtbQmx1ZV1dfCAgIGAtW1tSRVNFVF1dW1tZRUxMT1ddXVBhcmFncmFwaENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo0W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjExW1tSRVNFVF1dPnt7JH19Ci0vL0NIRUNLOiB7e159fVtbQmx1ZV1dfCAgICAgYC1bW1JFU0VUXV1bW1lFTExPV11dVGV4dENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo0W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjExW1tSRVNFVF1dPiBUZXh0PSIgQ29tbWVudCJ7eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwtW1tSRVNFVF1dW1tHUkVFTl1dQ1hYUmVjb3JkRGVjbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZToxODoxW1tSRVNFVF1dLCBbW1llbGxvd11dbGluZToyNToxW1tSRVNFVF1dPiBjbGFzc1tbQ1lBTl1dIE11dGV4W1tSRVNFVF1dIGRlZmluaXRpb257eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfC1bW1JFU0VUXV1bW0JMVUVdXUxvY2thYmxlQXR0cltbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZToxODoyMltbUkVTRVRdXT57eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfC1bW1JFU0VUXV1bW0dSRUVOXV1DWFhSZWNvcmREZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6MVtbUkVTRVRdXSwgW1tZZWxsb3ddXWNvbDozM1tbUkVTRVRdXT4gY2xhc3NbW0NZQU5dXSBNdXRleFtbUkVTRVRdXXt7JH19Ci0vL0NIRUNLOiB7e159fVtbQmx1ZV1dfCB8LVtbUkVTRVRdXVtbR1JFRU5dXUZpZWxkRGVjbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZToyMDozW1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjdbW1JFU0VUXV0+W1tDWUFOXV0gdmFyMVtbUkVTRVRdXSBbW0dyZWVuXV0naW50J1tbUkVTRVRdXXt7JH19Ci0vL0NIRUNLOiB7e159fVtbQmx1ZV1dfCB8IGAtW1tSRVNFVF1dW1tZRUxMT1ddXUZ1bGxDb21tZW50W1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1saW5lOjE5OjZbW1JFU0VUXV0sIFtbWWVsbG93XV1jb2w6MTZbW1JFU0VUXV0+e3skfX0KLS8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwgICBgLVtbUkVTRVRdXVtbWUVMTE9XXV1QYXJhZ3JhcGhDb21tZW50W1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6NltbUkVTRVRdXSwgW1tZZWxsb3ddXWNvbDoxNltbUkVTRVRdXT57eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfCAgICAgYC1bW1JFU0VUXV1bW1lFTExPV11dVGV4dENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo2W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjE2W1tSRVNFVF1dPiBUZXh0PSIgQSB2YXJpYWJsZSJ7eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfC1bW1JFU0VUXV1bW0dSRUVOXV1GaWVsZERlY2xbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6MjQ6M1tbUkVTRVRdXSwgW1tZZWxsb3ddXWNvbDo3W1tSRVNFVF1dPltbQ1lBTl1dIHZhcjJbW1JFU0VUXV0gW1tHcmVlbl1dJ2ludCdbW1JFU0VUXV17eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfCBgLVtbUkVTRVRdXVtbWUVMTE9XXV1GdWxsQ29tbWVudFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZToyMTo2W1tSRVNFVF1dLCBbW1llbGxvd11dbGluZToyMzo0NFtbUkVTRVRdXT57eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfCAgIHwtW1tSRVNFVF1dW1tZRUxMT1ddXVBhcmFncmFwaENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6MjE6NltbUkVTRVRdXSwgW1tZZWxsb3ddXWNvbDoyMltbUkVTRVRdXT57eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfCAgIHwgYC1bW1JFU0VUXV1bW1lFTExPV11dVGV4dENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo2W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjIyW1tSRVNFVF1dPiBUZXh0PSIgQW5vdGhlciB2YXJpYWJsZSJ7eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfCAgIGAtW1tSRVNFVF1dW1tZRUxMT1ddXVBhcmFncmFwaENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6MjM6NltbUkVTRVRdXSwgW1tZZWxsb3ddXWNvbDo0NFtbUkVTRVRdXT57eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfCAgICAgYC1bW1JFU0VUXV1bW1lFTExPV11dVGV4dENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo2W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjQ0W1tSRVNFVF1dPiBUZXh0PSIgTGlrZSB0aGUgb3RoZXIgdmFyaWFibGUsIGJ1dCBkaWZmZXJlbnQie3skfX0KLS8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwtW1tSRVNFVF1dW1tHUkVFTl1dQ1hYQ29uc3RydWN0b3JEZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1saW5lOjE4OjMzW1tSRVNFVF1dPltbQ1lBTl1dIE11dGV4W1tSRVNFVF1dIFtbR3JlZW5dXSd2b2lkICh2b2lkKSdbW1JFU0VUXV0gaW5saW5le3suKiR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgYC1bW1JFU0VUXV1bW0JsdWVdXUZ1bGxDb21tZW50W1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1saW5lOjg6NFtbUkVTRVRdXSwgW1tZZWxsb3ddXWNvbDoxMVtbUkVTRVRdXT57eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgICBgLVtbUkVTRVRdXVtbQmx1ZV1dUGFyYWdyYXBoQ29tbWVudFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjRbW1JFU0VUXV0sIFtbWWVsbG93XV1jb2w6MTFbW1JFU0VUXV0+e3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18ICAgICBgLVtbUkVTRVRdXVtbQmx1ZV1dVGV4dENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo0W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjExW1tSRVNFVF1dPiBUZXh0PSIgQ29tbWVudCJ7eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwtW1tSRVNFVF1dW1tHUkVFTl1dQ1hYUmVjb3JkRGVjbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZToxODoxW1tSRVNFVF1dLCBbW1llbGxvd11dbGluZToyNToxW1tSRVNFVF1dPiBbW1llbGxvd11dbGluZToxODozM1tbUkVTRVRdXSBjbGFzc1tbQ1lBTl1dIE11dGV4W1tSRVNFVF1dIGRlZmluaXRpb257eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfC1bW1JFU0VUXV1bW0JMVUVdXUNhcGFiaWxpdHlBdHRyW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6MjJbW1JFU0VUXV0+IGNhcGFiaWxpdHkgIm11dGV4Int7JH19CisvL0NIRUNLOiB7e159fVtbQmx1ZV1dfCB8LVtbUkVTRVRdXVtbR1JFRU5dXUNYWFJlY29yZERlY2xbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDoxW1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjMzW1tSRVNFVF1dPiBbW1llbGxvd11dY29sOjMzW1tSRVNFVF1dIGNsYXNzW1tDWUFOXV0gTXV0ZXhbW1JFU0VUXV17eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfC1bW1JFU0VUXV1bW0dSRUVOXV1GaWVsZERlY2xbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6MjA6M1tbUkVTRVRdXSwgW1tZZWxsb3ddXWNvbDo3W1tSRVNFVF1dPiBbW1llbGxvd11dY29sOjdbW1JFU0VUXV1bW0NZQU5dXSB2YXIxW1tSRVNFVF1dIFtbR3JlZW5dXSdpbnQnW1tSRVNFVF1de3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwgYC1bW1JFU0VUXV1bW0JsdWVdXUZ1bGxDb21tZW50W1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1saW5lOjE5OjZbW1JFU0VUXV0sIFtbWWVsbG93XV1jb2w6MTZbW1JFU0VUXV0+e3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwgICBgLVtbUkVTRVRdXVtbQmx1ZV1dUGFyYWdyYXBoQ29tbWVudFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjZbW1JFU0VUXV0sIFtbWWVsbG93XV1jb2w6MTZbW1JFU0VUXV0+e3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwgICAgIGAtW1tSRVNFVF1dW1tCbHVlXV1UZXh0Q29tbWVudFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjZbW1JFU0VUXV0sIFtbWWVsbG93XV1jb2w6MTZbW1JFU0VUXV0+IFRleHQ9IiBBIHZhcmlhYmxlInt7JH19CisvL0NIRUNLOiB7e159fVtbQmx1ZV1dfCB8LVtbUkVTRVRdXVtbR1JFRU5dXUZpZWxkRGVjbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZToyNDozW1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjdbW1JFU0VUXV0+IFtbWWVsbG93XV1jb2w6N1tbUkVTRVRdXVtbQ1lBTl1dIHZhcjJbW1JFU0VUXV0gW1tHcmVlbl1dJ2ludCdbW1JFU0VUXV17eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfCBgLVtbUkVTRVRdXVtbQmx1ZV1dRnVsbENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6MjE6NltbUkVTRVRdXSwgW1tZZWxsb3ddXWxpbmU6MjM6NDRbW1JFU0VUXV0+e3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwgICB8LVtbUkVTRVRdXVtbQmx1ZV1dUGFyYWdyYXBoQ29tbWVudFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZToyMTo2W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjIyW1tSRVNFVF1dPnt7JH19CisvL0NIRUNLOiB7e159fVtbQmx1ZV1dfCB8ICAgfCBgLVtbUkVTRVRdXVtbQmx1ZV1dVGV4dENvbW1lbnRbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo2W1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjIyW1tSRVNFVF1dPiBUZXh0PSIgQW5vdGhlciB2YXJpYWJsZSJ7eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfCAgIGAtW1tSRVNFVF1dW1tCbHVlXV1QYXJhZ3JhcGhDb21tZW50W1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1saW5lOjIzOjZbW1JFU0VUXV0sIFtbWWVsbG93XV1jb2w6NDRbW1JFU0VUXV0+e3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwgICAgIGAtW1tSRVNFVF1dW1tCbHVlXV1UZXh0Q29tbWVudFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjZbW1JFU0VUXV0sIFtbWWVsbG93XV1jb2w6NDRbW1JFU0VUXV0+IFRleHQ9IiBMaWtlIHRoZSBvdGhlciB2YXJpYWJsZSwgYnV0IGRpZmZlcmVudCJ7eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfC1bW1JFU0VUXV1bW0dSRUVOXV1DWFhDb25zdHJ1Y3RvckRlY2xbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWxpbmU6MTg6MzNbW1JFU0VUXV0+IFtbWWVsbG93XV1jb2w6MzNbW1JFU0VUXV1bW0NZQU5dXSBNdXRleFtbUkVTRVRdXSBbW0dyZWVuXV0ndm9pZCAodm9pZCknW1tSRVNFVF1dIGlubGluZXt7LiokfX0KIC8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwgYC1bW1JFU0VUXV1bW01BR0VOVEFdXUNvbXBvdW5kU3RtdFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjMzW1tSRVNFVF1dPnt7JH19Ci0vL0NIRUNLOiB7e159fVtbQmx1ZV1dfCB8LVtbUkVTRVRdXVtbR1JFRU5dXUNYWENvbnN0cnVjdG9yRGVjbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjMzW1tSRVNFVF1dPltbQ1lBTl1dIE11dGV4W1tSRVNFVF1dIFtbR3JlZW5dXSd2b2lkIChjb25zdCBjbGFzcyBNdXRleCAmKSdbW1JFU0VUXV0gaW5saW5le3sgLiokfX0KLS8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IHwgYC1bW1JFU0VUXV1bW0dSRUVOXV1QYXJtVmFyRGVjbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjMzW1tSRVNFVF1dPiBbW0dyZWVuXV0nY29uc3QgY2xhc3MgTXV0ZXggJidbW1JFU0VUXV17eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgYC1bW1JFU0VUXV1bW0dSRUVOXV1DWFhDb25zdHJ1Y3RvckRlY2xbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDozM1tbUkVTRVRdXT5bW0NZQU5dXSBNdXRleFtbUkVTRVRdXSBbW0dyZWVuXV0ndm9pZCAoY2xhc3MgTXV0ZXggJiYpJ1tbUkVTRVRdXSBpbmxpbmV7eyAuKiR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgICBgLVtbUkVTRVRdXVtbR1JFRU5dXVBhcm1WYXJEZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6MzNbW1JFU0VUXV0+IFtbR3JlZW5dXSdjbGFzcyBNdXRleCAmJidbW1JFU0VUXV17eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXXwtW1tSRVNFVF1dW1tHUkVFTl1dVmFyRGVjbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjFbW1JFU0VUXV0sIFtbWWVsbG93XV1saW5lOjI1OjNbW1JFU0VUXV0+W1tDWUFOXV0gbXUxW1tSRVNFVF1dIFtbR3JlZW5dXSdjbGFzcyBNdXRleCc6J2NsYXNzIE11dGV4J1tbUkVTRVRdXXt7JH19CisvL0NIRUNLOiB7e159fVtbQmx1ZV1dfCB8LVtbUkVTRVRdXVtbR1JFRU5dXUNYWENvbnN0cnVjdG9yRGVjbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjMzW1tSRVNFVF1dPiBbW1llbGxvd11dY29sOjMzW1tSRVNFVF1dW1tDWUFOXV0gTXV0ZXhbW1JFU0VUXV0gW1tHcmVlbl1dJ3ZvaWQgKGNvbnN0IGNsYXNzIE11dGV4ICYpJ1tbUkVTRVRdXSBpbmxpbmV7eyAuKiR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgfCBgLVtbUkVTRVRdXVtbR1JFRU5dXVBhcm1WYXJEZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6MzNbW1JFU0VUXV0+IFtbWWVsbG93XV1jb2w6MzNbW1JFU0VUXV0gW1tHcmVlbl1dJ2NvbnN0IGNsYXNzIE11dGV4ICYnW1tSRVNFVF1de3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV18IGAtW1tSRVNFVF1dW1tHUkVFTl1dQ1hYQ29uc3RydWN0b3JEZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6MzNbW1JFU0VUXV0+IFtbWWVsbG93XV1jb2w6MzNbW1JFU0VUXV1bW0NZQU5dXSBNdXRleFtbUkVTRVRdXSBbW0dyZWVuXV0ndm9pZCAoY2xhc3MgTXV0ZXggJiYpJ1tbUkVTRVRdXSBpbmxpbmV7eyAuKiR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgICBgLVtbUkVTRVRdXVtbR1JFRU5dXVBhcm1WYXJEZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6MzNbW1JFU0VUXV0+IFtbWWVsbG93XV1jb2w6MzNbW1JFU0VUXV0gW1tHcmVlbl1dJ2NsYXNzIE11dGV4ICYmJ1tbUkVTRVRdXXt7JH19CisvL0NIRUNLOiB7e159fVtbQmx1ZV1dfC1bW1JFU0VUXV1bW0dSRUVOXV1WYXJEZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6MVtbUkVTRVRdXSwgW1tZZWxsb3ddXWxpbmU6MjU6M1tbUkVTRVRdXT4gW1tZZWxsb3ddXWNvbDozW1tSRVNFVF1dW1tDWUFOXV0gbXUxW1tSRVNFVF1dIFtbR3JlZW5dXSdjbGFzcyBNdXRleCc6J2NsYXNzIE11dGV4J1tbUkVTRVRdXXt7JH19CiAvL0NIRUNLOiB7e159fVtbQmx1ZV1dfCBgLVtbUkVTRVRdXVtbTUFHRU5UQV1dQ1hYQ29uc3RydWN0RXhwcltbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dY29sOjNbW1JFU0VUXV0+IFtbR3JlZW5dXSdjbGFzcyBNdXRleCc6J2NsYXNzIE11dGV4J1tbUkVTRVRdXVtbQ3lhbl1dW1tSRVNFVF1dW1tDeWFuXV1bW1JFU0VUXV0gW1tHcmVlbl1dJ3ZvaWQgKHZvaWQpJ1tbUkVTRVRdXXt7JH19Ci0vL0NIRUNLOiB7e159fVtbQmx1ZV1dfC1bW1JFU0VUXV1bW0dSRUVOXV1WYXJEZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1saW5lOjE4OjFbW1JFU0VUXV0sIFtbWWVsbG93XV1saW5lOjI1OjhbW1JFU0VUXV0+W1tDWUFOXV0gbXUyW1tSRVNFVF1dIFtbR3JlZW5dXSdjbGFzcyBNdXRleCc6J2NsYXNzIE11dGV4J1tbUkVTRVRdXXt7JH19CisvL0NIRUNLOiB7e159fVtbQmx1ZV1dfC1bW1JFU0VUXV1bW0dSRUVOXV1WYXJEZWNsW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1saW5lOjE4OjFbW1JFU0VUXV0sIFtbWWVsbG93XV1saW5lOjI1OjhbW1JFU0VUXV0+IFtbWWVsbG93XV1jb2w6OFtbUkVTRVRdXVtbQ1lBTl1dIG11MltbUkVTRVRdXSBbW0dyZWVuXV0nY2xhc3MgTXV0ZXgnOidjbGFzcyBNdXRleCdbW1JFU0VUXV17eyR9fQogLy9DSEVDSzoge3tefX1bW0JsdWVdXXwgYC1bW1JFU0VUXV1bW01BR0VOVEFdXUNYWENvbnN0cnVjdEV4cHJbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDo4W1tSRVNFVF1dPiBbW0dyZWVuXV0nY2xhc3MgTXV0ZXgnOidjbGFzcyBNdXRleCdbW1JFU0VUXV1bW0N5YW5dXVtbUkVTRVRdXVtbQ3lhbl1dW1tSRVNFVF1dIFtbR3JlZW5dXSd2b2lkICh2b2lkKSdbW1JFU0VUXV17eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXWAtW1tSRVNFVF1dW1tHUkVFTl1dVmFyRGVjbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZToyNjoxW1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjVbW1JFU0VUXV0+W1tDWUFOXV0gVGVzdEV4cHJbW1JFU0VUXV0gW1tHcmVlbl1dJ2ludCdbW1JFU0VUXV17eyR9fQotLy9DSEVDSzoge3tefX1bW0JsdWVdXSAgYC1bW1JFU0VUXV1bW0JMVUVdXUd1YXJkZWRCeUF0dHJbW1JFU0VUXV1bW1llbGxvd11dIDB4e3tbMC05YS1mQS1GXSp9fVtbUkVTRVRdXSA8W1tZZWxsb3ddXWNvbDoyOVtbUkVTRVRdXT57eyR9fQorLy9DSEVDSzoge3tefX1bW0JsdWVdXWAtW1tSRVNFVF1dW1tHUkVFTl1dVmFyRGVjbFtbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dIDxbW1llbGxvd11dbGluZToyNjoxW1tSRVNFVF1dLCBbW1llbGxvd11dY29sOjVbW1JFU0VUXV0+IFtbWWVsbG93XV1jb2w6NVtbUkVTRVRdXVtbQ1lBTl1dIFRlc3RFeHByW1tSRVNFVF1dIFtbR3JlZW5dXSdpbnQnW1tSRVNFVF1de3skfX0KKy8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV0gIGAtW1tSRVNFVF1dW1tCTFVFXV1HdWFyZGVkQnlBdHRyW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6MjlbW1JFU0VUXV0sIFtbWWVsbG93XV1jb2w6NDNbW1JFU0VUXV0+e3skfX0KIC8vQ0hFQ0s6IHt7Xn19W1tCbHVlXV0gICAgYC1bW1JFU0VUXV1bW01BR0VOVEFdXURlY2xSZWZFeHByW1tSRVNFVF1dW1tZZWxsb3ddXSAweHt7WzAtOWEtZkEtRl0qfX1bW1JFU0VUXV0gPFtbWWVsbG93XV1jb2w6NDBbW1JFU0VUXV0+IFtbR3JlZW5dXSdjbGFzcyBNdXRleCc6J2NsYXNzIE11dGV4J1tbUkVTRVRdXVtbQ3lhbl1dIGx2YWx1ZVtbUkVTRVRdXVtbQ3lhbl1dW1tSRVNFVF1dIFtbR1JFRU5dXVZhcltbUkVTRVRdXVtbWWVsbG93XV0gMHh7e1swLTlhLWZBLUZdKn19W1tSRVNFVF1dW1tDWUFOXV0gJ211MSdbW1JFU0VUXV0gW1tHcmVlbl1dJ2NsYXNzIE11dGV4JzonY2xhc3MgTXV0ZXgnW1tSRVNFVF1de3skfX0KIApkaWZmIC0tZ2l0IGEvdGVzdC9NaXNjL2FzdC1kdW1wLWNvbW1lbnQuY3BwIGIvdGVzdC9NaXNjL2FzdC1kdW1wLWNvbW1lbnQuY3BwCmluZGV4IDRlODRhZjAuLjViZDY5MzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvTWlzYy9hc3QtZHVtcC1jb21tZW50LmNwcAorKysgYi90ZXN0L01pc2MvYXN0LWR1bXAtY29tbWVudC5jcHAKQEAgLTY3LDMgKzY3LDExIEBACiAvLyBDSEVDSzogICAgICBWYXJEZWNse3suKn19VGVzdF9WZXJiYXRpbUJsb2NrQ29tbWVudAogLy8gQ0hFQ0s6ICAgICAgICBWZXJiYXRpbUJsb2NrQ29tbWVudHt7Lip9fSBOYW1lPSJ2ZXJiYXRpbSIgQ2xvc2VOYW1lPSJlbmR2ZXJiYXRpbSIKIC8vIENIRUNLLU5FWFQ6ICAgICBWZXJiYXRpbUJsb2NrTGluZUNvbW1lbnR7ey4qfX0gVGV4dD0iIEFhYSIKKworLy8vIFxwYXJhbSAuLi4gTW9yZSBhcmd1bWVudHMKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIFRlc3RfVGVtcGxhdGVkRnVuY3Rpb25WYXJpYWRpYyhpbnQgYXJnLCAuLi4pOworLy8gQ0hFQ0s6ICAgICAgRnVuY3Rpb25UZW1wbGF0ZURlY2x7ey4qfX1UZXN0X1RlbXBsYXRlZEZ1bmN0aW9uVmFyaWFkaWMKKy8vIENIRUNLOiAgICAgICAgUGFyYW1Db21tYW5kQ29tbWVudHt7Lip9fSBbaW5dIGltcGxpY2l0bHkgUGFyYW09Ii4uLiIKKy8vIENIRUNLLU5FWFQ6ICAgICBQYXJhZ3JhcGhDb21tZW50CisvLyBDSEVDSy1ORVhUOiAgICAgICBUZXh0Q29tbWVudHt7Lip9fSBUZXh0PSIgTW9yZSBhcmd1bWVudHMiCmRpZmYgLS1naXQgYS90ZXN0L01pc2MvYXN0LWR1bXAtZGVjbC5jIGIvdGVzdC9NaXNjL2FzdC1kdW1wLWRlY2wuYwppbmRleCA5NDMzNWI4Li43ZDM5ZTZiIDEwMDY0NAotLS0gYS90ZXN0L01pc2MvYXN0LWR1bXAtZGVjbC5jCisrKyBiL3Rlc3QvTWlzYy9hc3QtZHVtcC1kZWNsLmMKQEAgLTIsNyArMiw3IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtdW5rbm93bi11bmtub3duIC1hc3QtZHVtcCAlcyB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLVRVIC1zdHJpY3Qtd2hpdGVzcGFjZSAlcwogCiBpbnQgVGVzdExvY2F0aW9uOwotLy8gQ0hFQ0s6IFZhckRlY2wgMHh7e1teIF0qfX0gPHt7Lip9fTo0OjEsIGNvbDo1PiBUZXN0TG9jYXRpb24KKy8vIENIRUNLOiBWYXJEZWNsIDB4e3tbXiBdKn19IDx7ey4qfX06NDoxLCBjb2w6NT4gY29sOjUgVGVzdExvY2F0aW9uCiAKIHN0cnVjdCBUZXN0SW5kZW50IHsKICAgaW50IHg7CkBAIC00Nyw3ICs0Nyw3IEBACiAgIH0gZTsKIH07CiAvLyBDSEVDSzogICAgICBSZWNvcmREZWNse3suKn19IFRlc3RFbnVtRGVjbEFub24KLS8vIENIRUNLLU5FWFQ6ICAgRW51bURlY2x7ey4qPiR9fQorLy8gQ0hFQ0stTkVYVDogICBFbnVtRGVjbHt7Lio+IC4qJH19CiAKIGVudW0gVGVzdEVudW1EZWNsRm9yd2FyZDsKIC8vIENIRUNLOiAgICAgIEVudW1EZWNse3suKn19IFRlc3RFbnVtRGVjbEZvcndhcmQKZGlmZiAtLWdpdCBhL3Rlc3QvTWlzYy9hc3QtZHVtcC1kZWNsLmNwcCBiL3Rlc3QvTWlzYy9hc3QtZHVtcC1kZWNsLmNwcAppbmRleCBkOThiZGI1Li44ZjIwYzQ2IDEwMDY0NAotLS0gYS90ZXN0L01pc2MvYXN0LWR1bXAtZGVjbC5jcHAKKysrIGIvdGVzdC9NaXNjL2FzdC1kdW1wLWRlY2wuY3BwCkBAIC0xNDMsNyArMTQzLDcgQEAKICAgc3RhdGljX2Fzc2VydCh0cnVlLCAibXNnIik7CiB9CiAvLyBDSEVDSzogICAgICBOYW1lc3BhY2VEZWNse3suKn19IFRlc3RTdGF0aWNBc3NlcnREZWNsCi0vLyBDSEVDSy1ORVhUOiAgIFN0YXRpY0Fzc2VydERlY2x7ey4qPiR9fQorLy8gQ0hFQ0stTkVYVDogICBTdGF0aWNBc3NlcnREZWNse3suKj4gLiokfX0KIC8vIENIRUNLLU5FWFQ6ICAgICBDWFhCb29sTGl0ZXJhbEV4cHIKIC8vIENIRUNLLU5FWFQ6ICAgICBTdHJpbmdMaXRlcmFsCiAKQEAgLTI3Myw3ICsyNzMsNyBAQAogICAvLyBDSEVDSy1ORVhUOiAgIEZ1bmN0aW9uRGVjbHt7Lip9fSBUZXN0RnVuY3Rpb25UZW1wbGF0ZSAndm9pZCAoVCknCiAgIC8vIENIRUNLLU5FWFQ6ICAgICBQYXJtVmFyRGVjbHt7Lip9fSAnVCcKICAgLy8gQ0hFQ0stTkVYVDogICBGdW5jdGlvbnt7Lip9fSAnVGVzdEZ1bmN0aW9uVGVtcGxhdGUnCi0gIC8vIENIRUNLLU5FWFQtTk9UOiBUZW1wbGF0ZUFyZ3VtZW50CisgIC8vIENIRUNLLU5PVDogICAgICBUZW1wbGF0ZUFyZ3VtZW50CiAKICAgdGVtcGxhdGU8dHlwZW5hbWUgVDE+IGNsYXNzIFRlc3RDbGFzc1RlbXBsYXRlIHsKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMj4gZnJpZW5kIGNsYXNzIFRlc3RDbGFzc1RlbXBsYXRlOwpAQCAtMzA4LDcgKzMwOCw4IEBACiAvLyBDSEVDSzogICAgICBOYW1lc3BhY2VEZWNse3suKn19IFRlc3RUZW1wbGF0ZVR5cGVQYXJtRGVjbAogLy8gQ0hFQ0stTkVYVDogICBGdW5jdGlvblRlbXBsYXRlRGVjbAogLy8gQ0hFQ0stTkVYVDogICAgIFRlbXBsYXRlVHlwZVBhcm1EZWNse3suKn19IHR5cGVuYW1lIC4uLiBUCi0vLyBDSEVDSy1ORVhUOiAgICAgVGVtcGxhdGVUeXBlUGFybURlY2x7ey4qfX0gY2xhc3MgVSAnaW50JworLy8gQ0hFQ0stTkVYVDogICAgIFRlbXBsYXRlVHlwZVBhcm1EZWNse3suKn19IGNsYXNzIFUKKy8vIENIRUNLLU5FWFQ6ICAgICAgIFRlbXBsYXRlQXJndW1lbnQgdHlwZSAnaW50JwogCiBuYW1lc3BhY2UgVGVzdE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsIHsKICAgdGVtcGxhdGU8aW50IEkgPSAxLCBpbnQgLi4uIEo+IHZvaWQgZm9vKCk7CkBAIC0zMTYsNyArMzE3LDggQEAKIC8vIENIRUNLOiAgICAgIE5hbWVzcGFjZURlY2x7ey4qfX0gVGVzdE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsCiAvLyBDSEVDSy1ORVhUOiAgIEZ1bmN0aW9uVGVtcGxhdGVEZWNsCiAvLyBDSEVDSy1ORVhUOiAgICAgTm9uVHlwZVRlbXBsYXRlUGFybURlY2x7ey4qfX0gJ2ludCcgSQotLy8gQ0hFQ0stTkVYVDogICAgICAgSW50ZWdlckxpdGVyYWx7ey4qfX0gJ2ludCcgMQorLy8gQ0hFQ0stTkVYVDogICAgICAgVGVtcGxhdGVBcmd1bWVudCBleHByCisvLyBDSEVDSy1ORVhUOiAgICAgICAgIEludGVnZXJMaXRlcmFse3suKn19ICdpbnQnIDEKIC8vIENIRUNLLU5FWFQ6ICAgICBOb25UeXBlVGVtcGxhdGVQYXJtRGVjbHt7Lip9fSAnaW50JyAuLi4gSgogCiBuYW1lc3BhY2UgVGVzdFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCB7CkBAIC00NDMsNyArNDQ1LDcgQEAKICAgYXNtKCJyZXQiKTsKIH0KIC8vIENIRUNLOiAgICAgIE5hbWVzcGFjZURlY2x7ey4qfX0gVGVzdEZpbGVTY29wZUFzbURlY2x7eyR9fQotLy8gQ0hFQ0s6ICAgICAgICBGaWxlU2NvcGVBc21EZWNse3suKj4kfX0KKy8vIENIRUNLOiAgICAgICAgRmlsZVNjb3BlQXNtRGVjbHt7Lio+IC4qJH19CiAvLyBDSEVDSy1ORVhUOiAgICAgU3RyaW5nTGl0ZXJhbAogCiBuYW1lc3BhY2UgVGVzdEZyaWVuZERlY2wyIHsKQEAgLTQ1MiwxMiArNDU0LDEyIEBACiAgICAgZnJpZW5kIHZvaWQgZigpOwogICB9OwogfQotLy8gQ0hFQ0s6IE5hbWVzcGFjZURlY2wgW1tUZXN0RnJpZW5kRGVjbDI6MHguKl1dIDx7ey4qfX0+IFRlc3RGcmllbmREZWNsMgotLy8gQ0hFQ0s6IHwtRnVuY3Rpb25EZWNsIFtbVGVzdEZyaWVuZERlY2wyX2Y6MHguKl1dIDx7ey4qfX0+IGYgJ3ZvaWQgKHZvaWQpJworLy8gQ0hFQ0s6IE5hbWVzcGFjZURlY2wgW1tUZXN0RnJpZW5kRGVjbDI6MHguKl1dIDx7ey4qfX0+IHt7Lip9fSBUZXN0RnJpZW5kRGVjbDIKKy8vIENIRUNLOiB8LUZ1bmN0aW9uRGVjbCBbW1Rlc3RGcmllbmREZWNsMl9mOjB4LipdXSA8e3suKn19PiB7ey4qfX0gZiAndm9pZCAodm9pZCknCiAvLyBDSEVDSzogYC1DWFhSZWNvcmREZWNsIHt7Lip9fSBzdHJ1Y3QgUwogLy8gQ0hFQ0s6ICAgfC1DWFhSZWNvcmREZWNsIHt7Lip9fSBzdHJ1Y3QgUwogLy8gQ0hFQ0s6ICAgYC1GcmllbmREZWNsCi0vLyBDSEVDSzogICAgIGAtRnVuY3Rpb25EZWNsIHt7Lip9fSBwYXJlbnQgW1tUZXN0RnJpZW5kRGVjbDJdXSBwcmV2IFtbVGVzdEZyaWVuZERlY2wyX2ZdXSA8e3suKn19PiBmICd2b2lkICh2b2lkKScKKy8vIENIRUNLOiAgICAgYC1GdW5jdGlvbkRlY2wge3suKn19IHBhcmVudCBbW1Rlc3RGcmllbmREZWNsMl1dIHByZXYgW1tUZXN0RnJpZW5kRGVjbDJfZl1dIDx7ey4qfX0+IHt7Lip9fSBmICd2b2lkICh2b2lkKScKIAogbmFtZXNwYWNlIENvbW1lbnQgewogICBleHRlcm4gaW50IFRlc3Q7CmRpZmYgLS1naXQgYS90ZXN0L01pc2MvYXN0LWR1bXAtZGVjbC5tIGIvdGVzdC9NaXNjL2FzdC1kdW1wLWRlY2wubQppbmRleCBmOGE1ZTVhLi41Mzk5MjNiIDEwMDY0NAotLS0gYS90ZXN0L01pc2MvYXN0LWR1bXAtZGVjbC5tCisrKyBiL3Rlc3QvTWlzYy9hc3QtZHVtcC1kZWNsLm0KQEAgLTEzNCwzICsxMzQsMTIgQEAKIC8vIENIRUNLLU5FWFQ6ICAgLi4uCiAvLyBDSEVDSy1ORVhUOiAgIGNhcHR1cmUgUGFybVZhcnt7Lip9fSAneCcgJ2ludCcKIC8vIENIRUNLLU5FWFQ6ICAgQ29tcG91bmRTdG10CisKK0BpbnRlcmZhY2UgQgorKyAoaW50KSBmb287CitAZW5kCisKK3ZvaWQgZigpIHsKKyAgX190eXBlb2ZfXyhCLmZvbykgVGVzdDsKK30KKy8vIENIRUNLOiBWYXJEZWNse3suKn19VGVzdCAndHlwZW9mIChCLmZvbyknOidpbnQnCmRpZmYgLS1naXQgYS90ZXN0L01pc2MvYXN0LWR1bXAtbXNwNDMwLWF0dHIuYyBiL3Rlc3QvTWlzYy9hc3QtZHVtcC1tc3A0MzAtYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MGUwYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01pc2MvYXN0LWR1bXAtbXNwNDMwLWF0dHIuYwpAQCAtMCwwICsxLDUgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG1zcDQzMC11bmtub3duLXVua25vd24gLWFzdC1kdW1wIC1hc3QtZHVtcC1maWx0ZXIgVGVzdCAlcyB8IEZpbGVDaGVjayAtLXN0cmljdC13aGl0ZXNwYWNlICVzDQorDQorX19hdHRyaWJ1dGVfXygoaW50ZXJydXB0KDEyKSkpIHZvaWQgVGVzdCh2b2lkKTsNCisvLyBDSEVDSzogRnVuY3Rpb25EZWNse3suKn19VGVzdA0KKy8vIENIRUNLLU5FWFQ6IE1TUDQzMEludGVycnVwdEF0dHINCmRpZmYgLS1naXQgYS90ZXN0L01pc2MvZGlhZy1mb3JtYXQuYyBiL3Rlc3QvTWlzYy9kaWFnLWZvcm1hdC5jCmluZGV4IDNkYzM1MWQuLmVjYTVjYWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvTWlzYy9kaWFnLWZvcm1hdC5jCisrKyBiL3Rlc3QvTWlzYy9kaWFnLWZvcm1hdC5jCkBAIC0yLDggKzIsMTEgQEAKIC8vIFJVTjogJWNsYW5nIC1mc3ludGF4LW9ubHkgLWZkaWFnbm9zdGljcy1mb3JtYXQ9Y2xhbmcgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PURFRkFVTFQKIC8vIFJVTjogJWNsYW5nIC1mc3ludGF4LW9ubHkgLWZkaWFnbm9zdGljcy1mb3JtYXQ9Y2xhbmcgLXRhcmdldCB4ODZfNjQtcGMtd2luMzIgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PURFRkFVTFQKIC8vCisvLyBSVU46ICVjbGFuZyAtZnN5bnRheC1vbmx5IC1mZGlhZ25vc3RpY3MtZm9ybWF0PW1zdmMgLWZtc2MtdmVyc2lvbj0xMzAwICAlcyAyPiYxIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9TVNWQzIwMTAKIC8vIFJVTjogJWNsYW5nIC1mc3ludGF4LW9ubHkgLWZkaWFnbm9zdGljcy1mb3JtYXQ9bXN2YyAgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PU1TVkMKKy8vIFJVTjogJWNsYW5nIC1mc3ludGF4LW9ubHkgLWZkaWFnbm9zdGljcy1mb3JtYXQ9bXN2YyAtZm1zYy12ZXJzaW9uPTEzMDAgLXRhcmdldCB4ODZfNjQtcGMtd2luMzIgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PU1TVkMyMDEwCiAvLyBSVU46ICVjbGFuZyAtZnN5bnRheC1vbmx5IC1mZGlhZ25vc3RpY3MtZm9ybWF0PW1zdmMgLXRhcmdldCB4ODZfNjQtcGMtd2luMzIgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PU1TVkMKKy8vIFJVTjogJWNsYW5nIC1mc3ludGF4LW9ubHkgLWZkaWFnbm9zdGljcy1mb3JtYXQ9bXN2YyAtZm1zYy12ZXJzaW9uPTEzMDAgLXRhcmdldCB4ODZfNjQtcGMtd2luMzIgLWZzaG93LWNvbHVtbiAlcyAyPiYxIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9TVNWQzIwMTAKIC8vIFJVTjogJWNsYW5nIC1mc3ludGF4LW9ubHkgLWZkaWFnbm9zdGljcy1mb3JtYXQ9bXN2YyAtdGFyZ2V0IHg4Nl82NC1wYy13aW4zMiAtZnNob3ctY29sdW1uICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1NU1ZDCiAvLwogLy8gUlVOOiAlY2xhbmcgLWZzeW50YXgtb25seSAtZmRpYWdub3N0aWNzLWZvcm1hdD12aSAgICAlcyAyPiYxIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9VkkKQEAgLTEyLDYgKzE1LDcgQEAKIC8vCiAvLyBSVU46ICVjbGFuZyAtZnN5bnRheC1vbmx5IC1mbm8tc2hvdy1jb2x1bW4gJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PU5PX0NPTFVNTgogLy8KKy8vIFJVTjogbm90ICVjbGFuZyAtZnN5bnRheC1vbmx5IC1XZXJyb3IgLWZkaWFnbm9zdGljcy1mb3JtYXQ9bXN2Yy1mYWxsYmFjayAtZm1zYy12ZXJzaW9uPTEzMDAgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PU1TVkMyMDEwLUZBTExCQUNLCiAvLyBSVU46IG5vdCAlY2xhbmcgLWZzeW50YXgtb25seSAtV2Vycm9yIC1mZGlhZ25vc3RpY3MtZm9ybWF0PW1zdmMtZmFsbGJhY2sgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtY2hlY2stcHJlZml4PU1TVkMtRkFMTEJBQ0sKIAogCkBAIC0yNiwxMCArMzAsMTIgQEAKIAogI2lmZGVmIGZvbwogI2VuZGlmIGJhZCAvLyBleHRlbnNpb24hCi0vLyBERUZBVUxUOiB7ey4qfX06Mjg6ODogd2FybmluZzogZXh0cmEgdG9rZW5zIGF0IGVuZCBvZiAjZW5kaWYgZGlyZWN0aXZlIFstV2V4dHJhLXRva2Vuc10KLS8vIE1TVkM6IHt7Lip9fSgyOCw3KSA6IHdhcm5pbmc6IGV4dHJhIHRva2VucyBhdCBlbmQgb2YgI2VuZGlmIGRpcmVjdGl2ZSBbLVdleHRyYS10b2tlbnNdCi0vLyBWSToge3suKn19ICsyODo4OiB3YXJuaW5nOiBleHRyYSB0b2tlbnMgYXQgZW5kIG9mICNlbmRpZiBkaXJlY3RpdmUgWy1XZXh0cmEtdG9rZW5zXQotLy8gTVNWQ19PUklHOiB7ey4qfX0oMjgpIDogd2FybmluZzogZXh0cmEgdG9rZW5zIGF0IGVuZCBvZiAjZW5kaWYgZGlyZWN0aXZlIFstV2V4dHJhLXRva2Vuc10KLS8vIE5PX0NPTFVNTjoge3suKn19OjI4OiB3YXJuaW5nOiBleHRyYSB0b2tlbnMgYXQgZW5kIG9mICNlbmRpZiBkaXJlY3RpdmUgWy1XZXh0cmEtdG9rZW5zXQotLy8gTVNWQy1GQUxMQkFDSzoge3suKn19KDI4LDcpIDogZXJyb3IoY2xhbmcpOiBleHRyYSB0b2tlbnMgYXQgZW5kIG9mICNlbmRpZiBkaXJlY3RpdmUKKy8vIERFRkFVTFQ6IHt7Lip9fTozMjo4OiB3YXJuaW5nOiBleHRyYSB0b2tlbnMgYXQgZW5kIG9mICNlbmRpZiBkaXJlY3RpdmUgWy1XZXh0cmEtdG9rZW5zXQorLy8gTVNWQzIwMTA6IHt7Lip9fSgzMiw3KSA6IHdhcm5pbmc6IGV4dHJhIHRva2VucyBhdCBlbmQgb2YgI2VuZGlmIGRpcmVjdGl2ZSBbLVdleHRyYS10b2tlbnNdCisvLyBNU1ZDOiB7ey4qfX0oMzIsOCkgOiB3YXJuaW5nOiBleHRyYSB0b2tlbnMgYXQgZW5kIG9mICNlbmRpZiBkaXJlY3RpdmUgWy1XZXh0cmEtdG9rZW5zXQorLy8gVkk6IHt7Lip9fSArMzI6ODogd2FybmluZzogZXh0cmEgdG9rZW5zIGF0IGVuZCBvZiAjZW5kaWYgZGlyZWN0aXZlIFstV2V4dHJhLXRva2Vuc10KKy8vIE1TVkNfT1JJRzoge3suKn19KDMyKSA6IHdhcm5pbmc6IGV4dHJhIHRva2VucyBhdCBlbmQgb2YgI2VuZGlmIGRpcmVjdGl2ZSBbLVdleHRyYS10b2tlbnNdCisvLyBOT19DT0xVTU46IHt7Lip9fTozMjogd2FybmluZzogZXh0cmEgdG9rZW5zIGF0IGVuZCBvZiAjZW5kaWYgZGlyZWN0aXZlIFstV2V4dHJhLXRva2Vuc10KKy8vIE1TVkMyMDEwLUZBTExCQUNLOiB7ey4qfX0oMzIsNykgOiBlcnJvcihjbGFuZyk6IGV4dHJhIHRva2VucyBhdCBlbmQgb2YgI2VuZGlmIGRpcmVjdGl2ZQorLy8gTVNWQy1GQUxMQkFDSzoge3suKn19KDMyLDgpIDogZXJyb3IoY2xhbmcpOiBleHRyYSB0b2tlbnMgYXQgZW5kIG9mICNlbmRpZiBkaXJlY3RpdmUKIGludCB4OwpkaWZmIC0tZ2l0IGEvdGVzdC9NaXNjL2RyaXZlci12ZXJpZnkuYyBiL3Rlc3QvTWlzYy9kcml2ZXItdmVyaWZ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzMWY4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTWlzYy9kcml2ZXItdmVyaWZ5LmMKQEAgLTAsMCArMSw2IEBACisvLyBSVU46IG5vdCAlY2xhbmcgLXZlcmlmeSAlcyAyPiYxIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZyAtY2MxIC12ZXJpZnkgJXMKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisKKy8vIFRlc3QgdGhhdCAtdmVyaWZ5IGlzIHN0cmljdGx5IHJlamVjdGVkIGFzIHVua25vd24gYnkgdGhlIGRyaXZlci4KKy8vIENIRUNLOiB1bmtub3duIGFyZ3VtZW50OiAnLXZlcmlmeScKZGlmZiAtLWdpdCBhL3Rlc3QvTWlzYy9sYW5ndWFnZU9wdHNPcGVuQ0wuY2wgYi90ZXN0L01pc2MvbGFuZ3VhZ2VPcHRzT3BlbkNMLmNsCmluZGV4IGM4MWRiOTkuLjgyYThmMzYgMTAwNjQ0Ci0tLSBhL3Rlc3QvTWlzYy9sYW5ndWFnZU9wdHNPcGVuQ0wuY2wKKysrIGIvdGVzdC9NaXNjL2xhbmd1YWdlT3B0c09wZW5DTC5jbApAQCAtMywxNyArMywxOSBAQAogCiAvLyBUZXN0IHRoZSBmb3JjZWQgbGFuZ3VhZ2Ugb3B0aW9ucyBmb3IgT3BlbkNMIGFyZSBzZXQgY29ycmVjdGx5LgogCi1fX2NvbnN0YW50IGludCB2MFsoc2l6ZW9mKGludCkgPT0gNCkgLTFdOwotX19jb25zdGFudCBpbnQgdjFbKF9fYWxpZ25vZihpbnQpID09IDQpIC0xXTsKLV9fY29uc3RhbnQgaW50IHYyWyhzaXplb2YobG9uZykgPT0gOCkgLTFdOwotX19jb25zdGFudCBpbnQgdjNbKF9fYWxpZ25vZihsb25nKSA9PSA4KSAtMV07Ci1fX2NvbnN0YW50IGludCB2NFsoc2l6ZW9mKGxvbmcgbG9uZykgPT0gMTYpIC0xXTsKLV9fY29uc3RhbnQgaW50IHY1WyhfX2FsaWdub2YobG9uZyBsb25nKSA9PSAxNikgLTFdOwotX19jb25zdGFudCBpbnQgdjZbKHNpemVvZihmbG9hdCkgPT0gNCkgLTFdOwotX19jb25zdGFudCBpbnQgdjdbKF9fYWxpZ25vZihmbG9hdCkgPT0gNCkgLTFdOwora2VybmVsIHZvaWQgdGVzdCgpIHsKKyAgaW50IHYwWyhzaXplb2YoaW50KSA9PSA0KSAtIDFdOworICBpbnQgdjFbKF9fYWxpZ25vZihpbnQpPT0gNCkgLSAxXTsKKyAgaW50IHYyWyhzaXplb2YobG9uZykgPT0gOCkgLSAxXTsKKyAgaW50IHYzWyhfX2FsaWdub2YobG9uZyk9PSA4KSAtIDFdOworICBpbnQgdjRbKHNpemVvZihsb25nIGxvbmcpID09IDE2KSAtIDFdOworICBpbnQgdjVbKF9fYWxpZ25vZihsb25nIGxvbmcpPT0gMTYpIC0gMV07CisgIGludCB2Nlsoc2l6ZW9mKGZsb2F0KSA9PSA0KSAtIDFdOworICBpbnQgdjdbKF9fYWxpZ25vZihmbG9hdCk9PSA0KSAtIDFdOwogI3ByYWdtYSBPUEVOQ0wgRVhURU5TSU9OIGNsX2tocl9mcDY0IDogZW5hYmxlCi1fX2NvbnN0YW50IGludCB2OFsoc2l6ZW9mKGRvdWJsZSk9PTgpIC0xXTsKLV9fY29uc3RhbnQgaW50IHY5WyhfX2FsaWdub2YoZG91YmxlKT09OCkgLTFdOworICBpbnQgdjhbKHNpemVvZihkb3VibGUpID09IDgpIC0gMV07CisgIGludCB2OVsoX19hbGlnbm9mKGRvdWJsZSk9PSA4KSAtIDFdOwogI3ByYWdtYSBPUEVOQ0wgRVhURU5TSU9OIGNsX2tocl9mcDE2IDogZW5hYmxlCi1fX2NvbnN0YW50IGludCB2MTBbKHNpemVvZihoYWxmKSA9PSAyKSAtMV07Ci1fX2NvbnN0YW50IGludCB2MTFbKF9fYWxpZ25vZihoYWxmKSA9PSAyKSAtMV07CisgIGludCB2MTBbKHNpemVvZihoYWxmKSA9PSAyKSAtIDFdOworICBpbnQgdjExWyhfX2FsaWdub2YoaGFsZikgPT0gMikgLSAxXTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTWlzYy9zZXJpYWxpemVkLWRpYWdzLXN0YWJsZS5jIGIvdGVzdC9NaXNjL3NlcmlhbGl6ZWQtZGlhZ3Mtc3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkNGM5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTWlzYy9zZXJpYWxpemVkLWRpYWdzLXN0YWJsZS5jCkBAIC0wLDAgKzEsMjAgQEAKKy8vIFJVTjogcm0gLWYgJXQKKy8vIFJVTjogbm90ICVjbGFuZyAtV2FsbCAtZnN5bnRheC1vbmx5ICVzIC0tc2VyaWFsaXplLWRpYWdub3N0aWNzICV0LmRpYSA+IC9kZXYvbnVsbCAyPiYxCisvLyBSVU46IGMtaW5kZXgtdGVzdCAtcmVhZC1kaWFnbm9zdGljcyAldC5kaWEgMj4mMSB8IEZpbGVDaGVjayAlcworCisvLyBSVU46IGMtaW5kZXgtdGVzdCAtcmVhZC1kaWFnbm9zdGljcyAlUy9JbnB1dHMvc2VyaWFsaXplZC1kaWFncy1zdGFibGUuZGlhIDI+JjEgfCBGaWxlQ2hlY2sgJXMKKworaW50IGZvbygpIHsKKyAgLy8gQ0hFQ0s6IHNlcmlhbGl6ZWQtZGlhZ3Mtc3RhYmxlLmM6W1tATElORSsyXV06MTogd2FybmluZzogY29udHJvbCByZWFjaGVzIGVuZCBvZiBub24tdm9pZCBmdW5jdGlvbiBbLVdyZXR1cm4tdHlwZV0gW1NlbWFudGljIElzc3VlXQorICAvLyBDSEVDSy1ORVhUOiBOdW1iZXIgRklYSVRzID0gMAorfQorCisvLyBDSEVDSzogc2VyaWFsaXplZC1kaWFncy1zdGFibGUuYzpbW0BMSU5FKzVdXToxMzogZXJyb3I6IHJlZGVmaW5pdGlvbiBvZiAnYmFyJyBhcyBkaWZmZXJlbnQga2luZCBvZiBzeW1ib2wgW10gW1NlbWFudGljIElzc3VlXQorLy8gQ0hFQ0stTkVYVDogTnVtYmVyIEZJWElUcyA9IDAKKy8vIENIRUNLLU5FWFQ6ICste3suKn19c2VyaWFsaXplZC1kaWFncy1zdGFibGUuYzpbW0BMSU5FKzJdXTo2OiBub3RlOiBwcmV2aW91cyBkZWZpbml0aW9uIGlzIGhlcmUgW10gW10KKy8vIENIRUNLLU5FWFQ6IE51bWJlciBGSVhJVHMgPSAwCit2b2lkIGJhcigpIHt9Cit0eXBlZGVmIGludCBiYXI7CisKKworLy8gQ0hFQ0stTEFCRUw6IE51bWJlciBvZiBkaWFnbm9zdGljczogMgpkaWZmIC0tZ2l0IGEvdGVzdC9NaXNjL3ZlcmlmeS5jIGIvdGVzdC9NaXNjL3ZlcmlmeS5jCmluZGV4IDg1YjAzNGUuLjlmZTgzZTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvTWlzYy92ZXJpZnkuYworKysgYi90ZXN0L01pc2MvdmVyaWZ5LmMKQEAgLTcsOCArNyw4IEBACiBzdHJ1Y3QgcyBzMjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t0ZW50YXRpdmUgZGVmaW5pdGlvbiBoYXMgdHlwZX19CiAKIC8vIHJlZ2V4IG1hdGNoaW5nCi1zdHJ1Y3QgcyByMTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t0ZW50YXRpdmUgZGVmaW5pdGlvbiBoYXMgdHlwZSAnc3RydWN0IHMnIHRoYXQgaXMgbmV2ZXIgY29tcGxldGVkfX0KLXN0cnVjdCBzIHIyOyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3RlbnRhdGl2ZSBkZWZpbml0aW9uIGhhcyB0eXBlICcuKltbOnNwYWNlOl1dKi4qJyB0aGF0IGlzIG5ldmVyIGNvbXBsZXRlZH19Ci1zdHJ1Y3QgcyByMzsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t0ZW50YXRpdmUgZGVmaW5pdGlvbiBoYXMgdHlwZSAnKC4qKVtbOnNwYWNlOl1dKiguKiknIHRoYXQgaXMgbmV2ZXIgY29tcGxldGVkfX0KLXN0cnVjdCBzIHI0OyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e150ZW50YXRpdmV9fQotc3RydWN0IHMgcjU7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7Y29tcGxldGVkJH19CitzdHJ1Y3QgcyByMTsgLy8gZXhwZWN0ZWQtZXJyb3IgICAge3t0ZW50YXRpdmUgZGVmaW5pdGlvbiBoYXMgdHlwZSAnc3RydWN0IHMnIHRoYXQgaXMgbmV2ZXIgY29tcGxldGVkfX0KK3N0cnVjdCBzIHIyOyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3RlbnRhdGl2ZSBkZWZpbml0aW9uIGhhcyB0eXBlICd7ey4qW1s6c3BhY2U6XV0qLip9fScgdGhhdCBpcyBuZXZlciBjb21wbGV0ZWR9fQorc3RydWN0IHMgcjM7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7dGVudGF0aXZlIGRlZmluaXRpb24gaGFzIHR5cGUgJ3t7KC4qKVtbOnNwYWNlOl1dKiguKil9fScgdGhhdCBpcyBuZXZlciBjb21wbGV0ZWR9fQorc3RydWN0IHMgcjQ7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7e3tefX10ZW50YXRpdmV9fQorc3RydWN0IHMgcjU7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7Y29tcGxldGVke3skfX19fQpkaWZmIC0tZ2l0IGEvdGVzdC9NaXNjL3dhcm5pbmctZmxhZ3MuYyBiL3Rlc3QvTWlzYy93YXJuaW5nLWZsYWdzLmMKaW5kZXggZTYxMjI1YS4uMDdhN2ZhNSAxMDA2NDQKLS0tIGEvdGVzdC9NaXNjL3dhcm5pbmctZmxhZ3MuYworKysgYi90ZXN0L01pc2Mvd2FybmluZy1mbGFncy5jCkBAIC0xOCwxMSArMTgsMTIgQEAKIAogVGhlIGxpc3Qgb2Ygd2FybmluZ3MgYmVsb3cgc2hvdWxkIE5FVkVSIGdyb3cuICBJdCBzaG91bGQgZ3JhZHVhbGx5IHNocmluayB0byAwLgogCi1DSEVDSzogV2FybmluZ3Mgd2l0aG91dCBmbGFncyAoMTM0KToKK0NIRUNLOiBXYXJuaW5ncyB3aXRob3V0IGZsYWdzICgxMDYpOgogQ0hFQ0stTkVYVDogICBleHRfZGVsZXRlX3ZvaWRfcHRyX29wZXJhbmQKIENIRUNLLU5FWFQ6ICAgZXh0X2V4cGVjdGVkX3NlbWlfZGVjbF9saXN0CiBDSEVDSy1ORVhUOiAgIGV4dF9leHBsaWNpdF9zcGVjaWFsaXphdGlvbl9zdG9yYWdlX2NsYXNzCiBDSEVDSy1ORVhUOiAgIGV4dF9pbXBsaWNpdF9saWJfZnVuY3Rpb25fZGVjbAorQ0hFQ0stTkVYVDogICBleHRfbWFueV9icmFjZXNfYXJvdW5kX3NjYWxhcl9pbml0CiBDSEVDSy1ORVhUOiAgIGV4dF9taXNzaW5nX2RlY2xzcGVjCiBDSEVDSy1ORVhUOiAgIGV4dF9taXNzaW5nX3doaXRlc3BhY2VfYWZ0ZXJfbWFjcm9fbmFtZQogQ0hFQ0stTkVYVDogICBleHRfbmV3X3BhcmVuX2FycmF5X25vbmNvbnN0CkBAIC0zNCw3ICszNSw2IEBACiBDSEVDSy1ORVhUOiAgIGV4dF90eXBlY2hlY2tfY29uZF9pbmNvbXBhdGlibGVfb3BlcmFuZHNfbm9uc3RhbmRhcmQKIENIRUNLLU5FWFQ6ICAgZXh0X3R5cGVjaGVja19vcmRlcmVkX2NvbXBhcmlzb25fb2ZfZnVuY3Rpb25fcG9pbnRlcnMKIENIRUNLLU5FWFQ6ICAgZXh0X3R5cGVjaGVja19vcmRlcmVkX2NvbXBhcmlzb25fb2ZfcG9pbnRlcl9pbnRlZ2VyCi1DSEVDSy1ORVhUOiAgIGV4dF91bmtub3duX2VzY2FwZQogQ0hFQ0stTkVYVDogICBleHRfdXNpbmdfdW5kZWZpbmVkX3N0ZAogQ0hFQ0stTkVYVDogICBwcF9pbmNsdWRlX25leHRfYWJzb2x1dGVfcGF0aAogQ0hFQ0stTkVYVDogICBwcF9pbmNsdWRlX25leHRfaW5fcHJpbWFyeQpAQCAtNDgsNyArNDgsNiBAQAogQ0hFQ0stTkVYVDogICB3YXJuX2Fub25fYml0ZmllbGRfd2lkdGhfZXhjZWVkc190eXBlX3NpemUKIENIRUNLLU5FWFQ6ICAgd2Fybl9hc21fbGFiZWxfb25fYXV0b19kZWNsCiBDSEVDSy1ORVhUOiAgIHdhcm5fYml0ZmllbGRfd2lkdGhfZXhjZWVkc190eXBlX3NpemUKLUNIRUNLLU5FWFQ6ICAgd2Fybl9ib29sX3N3aXRjaF9jb25kaXRpb24KIENIRUNLLU5FWFQ6ICAgd2Fybl9icmFjZXNfYXJvdW5kX3NjYWxhcl9pbml0CiBDSEVDSy1ORVhUOiAgIHdhcm5fY19rZXh0CiBDSEVDSy1ORVhUOiAgIHdhcm5fY2FsbF90b19wdXJlX3ZpcnR1YWxfbWVtYmVyX2Z1bmN0aW9uX2Zyb21fY3Rvcl9kdG9yCkBAIC02OCw5ICs2Nyw3IEBACiBDSEVDSy1ORVhUOiAgIHdhcm5fZHJ2X3BjaF9ub3RfZmlyc3RfaW5jbHVkZQogQ0hFQ0stTkVYVDogICB3YXJuX2R1cF9jYXRlZ29yeV9kZWYKIENIRUNLLU5FWFQ6ICAgd2Fybl9kdXBsaWNhdGVfcHJvdG9jb2xfZGVmCi1DSEVDSy1ORVhUOiAgIHdhcm5fZW51bV90b29fbGFyZ2UKIENIRUNLLU5FWFQ6ICAgd2Fybl9lbnVtX3ZhbHVlX292ZXJmbG93Ci1DSEVDSy1ORVhUOiAgIHdhcm5fZW51bWVyYXRvcl90b29fbGFyZ2UKIENIRUNLLU5FWFQ6ICAgd2Fybl9leGNlcHRpb25fY2F1Z2h0X2J5X2VhcmxpZXJfaGFuZGxlcgogQ0hFQ0stTkVYVDogICB3YXJuX2V4Y2Vzc19pbml0aWFsaXplcnMKIENIRUNLLU5FWFQ6ICAgd2Fybl9leGNlc3NfaW5pdGlhbGl6ZXJzX2luX2NoYXJfYXJyYXlfaW5pdGlhbGl6ZXIKQEAgLTg1LDkgKzgyLDcgQEAKIENIRUNLLU5FWFQ6ICAgd2Fybl9pbmNvbXBhdGlibGVfcXVhbGlmaWVkX2lkCiBDSEVDSy1ORVhUOiAgIHdhcm5faW5pdGlhbGl6ZXJfc3RyaW5nX2Zvcl9jaGFyX2FycmF5X3Rvb19sb25nCiBDSEVDSy1ORVhUOiAgIHdhcm5faW5saW5lX25hbWVzcGFjZV9yZW9wZW5lZF9ub25pbmxpbmUKLUNIRUNLLU5FWFQ6ICAgd2Fybl9pbnRlZ2VyX3Rvb19sYXJnZV9mb3Jfc2lnbmVkCiBDSEVDSy1ORVhUOiAgIHdhcm5faW52YWxpZF9hc21fY2FzdF9sdmFsdWUKLUNIRUNLLU5FWFQ6ICAgd2Fybl9tYW55X2JyYWNlc19hcm91bmRfc2NhbGFyX2luaXQKIENIRUNLLU5FWFQ6ICAgd2Fybl9tYXlub3RfcmVzcG9uZAogQ0hFQ0stTkVYVDogICB3YXJuX21ldGhvZF9wYXJhbV9yZWRlZmluaXRpb24KIENIRUNLLU5FWFQ6ICAgd2Fybl9taXNtYXRjaGVkX2V4Y2VwdGlvbl9zcGVjCkBAIC05NSw5ICs5MCw5IEBACiBDSEVDSy1ORVhUOiAgIHdhcm5fbWlzc2luZ19kZXBlbmRlbnRfdGVtcGxhdGVfa2V5d29yZAogQ0hFQ0stTkVYVDogICB3YXJuX21pc3NpbmdfZXhjZXB0aW9uX3NwZWNpZmljYXRpb24KIENIRUNLLU5FWFQ6ICAgd2Fybl9taXNzaW5nX3doaXRlc3BhY2VfYWZ0ZXJfbWFjcm9fbmFtZQorQ0hFQ0stTkVYVDogICB3YXJuX210X21lc3NhZ2UKIENIRUNLLU5FWFQ6ICAgd2Fybl9tdWx0aXBsZV9tZXRob2RfZGVjbAogQ0hFQ0stTkVYVDogICB3YXJuX25vX2NvbnN0cnVjdG9yX2Zvcl9yZWZjb25zdAotQ0hFQ0stTkVYVDogICB3YXJuX25vbm51bGxfcG9pbnRlcnNfb25seQogQ0hFQ0stTkVYVDogICB3YXJuX25vdF9jb21wb3VuZF9hc3NpZ24KIENIRUNLLU5FWFQ6ICAgd2Fybl9vYmpjX3Byb3BlcnR5X2NvcHlfbWlzc2luZ19vbl9ibG9jawogQ0hFQ0stTkVYVDogICB3YXJuX29iamNfcHJvdG9jb2xfcXVhbGlmaWVyX21pc3NpbmdfaWQKQEAgLTEwOCwzMCArMTAzLDggQEAKIENIRUNLLU5FWFQ6ICAgd2Fybl9wcF9jb252ZXJ0X3Joc190b19wb3NpdGl2ZQogQ0hFQ0stTkVYVDogICB3YXJuX3BwX2V4cHJfb3ZlcmZsb3cKIENIRUNLLU5FWFQ6ICAgd2Fybl9wcF9saW5lX2RlY2ltYWwKLUNIRUNLLU5FWFQ6ICAgd2Fybl9wcmFnbWFfYWxpZ25fZXhwZWN0ZWRfZXF1YWwKLUNIRUNLLU5FWFQ6ICAgd2Fybl9wcmFnbWFfYWxpZ25faW52YWxpZF9vcHRpb24KLUNIRUNLLU5FWFQ6ICAgd2Fybl9wcmFnbWFfZGVidWdfdW5leHBlY3RlZF9jb21tYW5kCi1DSEVDSy1ORVhUOiAgIHdhcm5fcHJhZ21hX2V4cGVjdGVkX2NvbG9uCi1DSEVDSy1ORVhUOiAgIHdhcm5fcHJhZ21hX2V4cGVjdGVkX2VuYWJsZV9kaXNhYmxlCi1DSEVDSy1ORVhUOiAgIHdhcm5fcHJhZ21hX2V4cGVjdGVkX2lkZW50aWZpZXIKLUNIRUNLLU5FWFQ6ICAgd2Fybl9wcmFnbWFfZXhwZWN0ZWRfbHBhcmVuCi1DSEVDSy1ORVhUOiAgIHdhcm5fcHJhZ21hX2V4cGVjdGVkX3JwYXJlbgotQ0hFQ0stTkVYVDogICB3YXJuX3ByYWdtYV9leHRyYV90b2tlbnNfYXRfZW9sCi1DSEVDSy1ORVhUOiAgIHdhcm5fcHJhZ21hX21zX3N0cnVjdAotQ0hFQ0stTkVYVDogICB3YXJuX3ByYWdtYV9vcHRpb25zX2FsaWduX3Jlc2V0X2ZhaWxlZAotQ0hFQ0stTkVYVDogICB3YXJuX3ByYWdtYV9vcHRpb25zX2V4cGVjdGVkX2FsaWduCi1DSEVDSy1ORVhUOiAgIHdhcm5fcHJhZ21hX3BhY2tfaW52YWxpZF9hY3Rpb24KLUNIRUNLLU5FWFQ6ICAgd2Fybl9wcmFnbWFfcGFja19pbnZhbGlkX2FsaWdubWVudAotQ0hFQ0stTkVYVDogICB3YXJuX3ByYWdtYV9wYWNrX21hbGZvcm1lZAotQ0hFQ0stTkVYVDogICB3YXJuX3ByYWdtYV9wYWNrX3BvcF9mYWlsZWQKIENIRUNLLU5FWFQ6ICAgd2Fybl9wcmFnbWFfcGFja19wb3BfaWRlbnRpZmVyX2FuZF9hbGlnbm1lbnQKIENIRUNLLU5FWFQ6ICAgd2Fybl9wcmFnbWFfcGFja19zaG93Ci1DSEVDSy1ORVhUOiAgIHdhcm5fcHJhZ21hX3BvcF9tYWNyb19ub19wdXNoCi1DSEVDSy1ORVhUOiAgIHdhcm5fcHJhZ21hX3Vua25vd25fZXh0ZW5zaW9uCi1DSEVDSy1ORVhUOiAgIHdhcm5fcHJhZ21hX3VudXNlZF9leHBlY3RlZF9wdW5jCi1DSEVDSy1ORVhUOiAgIHdhcm5fcHJhZ21hX3VudXNlZF9leHBlY3RlZF92YXIKLUNIRUNLLU5FWFQ6ICAgd2Fybl9wcmFnbWFfdW51c2VkX2V4cGVjdGVkX3Zhcl9hcmcKLUNIRUNLLU5FWFQ6ICAgd2Fybl9wcmFnbWFfdW51c2VkX3VuZGVjbGFyZWRfdmFyCiBDSEVDSy1ORVhUOiAgIHdhcm5fcHJvcGVydHlfYXR0cl9taXNtYXRjaAogQ0hFQ0stTkVYVDogICB3YXJuX3Byb3BlcnR5X2F0dHJpYnV0ZQogQ0hFQ0stTkVYVDogICB3YXJuX3Byb3BlcnR5X2dldHRlcl9vd25pbmdfbWlzbWF0Y2gKQEAgLTE0Niw3ICsxMTksNiBAQAogQ0hFQ0stTkVYVDogICB3YXJuX3RlbXBsYXRlX3NwZWNfZXh0cmFfaGVhZGVycwogQ0hFQ0stTkVYVDogICB3YXJuX3RlbnRhdGl2ZV9pbmNvbXBsZXRlX2FycmF5CiBDSEVDSy1ORVhUOiAgIHdhcm5fdHlwZWNoZWNrX2Z1bmN0aW9uX3F1YWxpZmllcnMKLUNIRUNLLU5FWFQ6ICAgd2Fybl91bmF2YWlsYWJsZV9md2RjbGFzc19tZXNzYWdlCiBDSEVDSy1ORVhUOiAgIHdhcm5fdW5kZWZfaW50ZXJmYWNlCiBDSEVDSy1ORVhUOiAgIHdhcm5fdW5kZWZfaW50ZXJmYWNlX3N1Z2dlc3QKIENIRUNLLU5FWFQ6ICAgd2Fybl91bmRlZl9wcm90b2NvbHJlZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvQm90aC9hLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKY29weSB0byB0ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Cb3RoL2EuaApkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvQm90aC9iLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Cb3RoL2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWJiZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvQm90aC9iLmgKQEAgLTAsMCArMSBAQAordm9pZCB3b250X2JlX2ZvdW5kMSh2b2lkKTsKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL0JvdGgvbW9kdWxlLm1hcCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL0JvdGgvbW9kdWxlLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjVhYWVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvQm90aC9tb2R1bGUubWFwCkBAIC0wLDAgKzEsMyBAQAorbW9kdWxlIGJvdGggeworICBoZWFkZXIgImIuaCIKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL0JvdGgvbW9kdWxlLm1vZHVsZW1hcCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL0JvdGgvbW9kdWxlLm1vZHVsZW1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmZhMDk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvQm90aC9tb2R1bGUubW9kdWxlbWFwCkBAIC0wLDAgKzEsMyBAQAorbW9kdWxlIGJvdGggeworICBoZWFkZXIgImEuaCIKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL0JvdGhfRi5mcmFtZXdvcmsvSGVhZGVycy9hLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Cb3RoX0YuZnJhbWV3b3JrL0hlYWRlcnMvYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYWJmYzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Cb3RoX0YuZnJhbWV3b3JrL0hlYWRlcnMvYS5oCkBAIC0wLDAgKzEgQEAKK3ZvaWQgd2lsbF9iZV9mb3VuZDIodm9pZCk7CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Cb3RoX0YuZnJhbWV3b3JrL0hlYWRlcnMvYi5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvQm90aF9GLmZyYW1ld29yay9IZWFkZXJzL2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE2OWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvQm90aF9GLmZyYW1ld29yay9IZWFkZXJzL2IuaApAQCAtMCwwICsxIEBACit2b2lkIHdvbnRfYmVfZm91bmQyKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvQm90aF9GLmZyYW1ld29yay9Nb2R1bGVzL21vZHVsZS5tb2R1bGVtYXAgYi90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Cb3RoX0YuZnJhbWV3b3JrL01vZHVsZXMvbW9kdWxlLm1vZHVsZW1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ5YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvQm90aF9GLmZyYW1ld29yay9Nb2R1bGVzL21vZHVsZS5tb2R1bGVtYXAKQEAgLTAsMCArMSwzIEBACitmcmFtZXdvcmsgbW9kdWxlIEJvdGhfRiB7CisgIGhlYWRlciAiYS5oIgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvQm90aF9GLmZyYW1ld29yay9tb2R1bGUubWFwIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvQm90aF9GLmZyYW1ld29yay9tb2R1bGUubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYzEwOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Cb3RoX0YuZnJhbWV3b3JrL21vZHVsZS5tYXAKQEAgLTAsMCArMSwzIEBACitmcmFtZXdvcmsgbW9kdWxlIEJvdGhfRiB7CisgIGhlYWRlciAiYi5oIgorfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvSW5mZXJyZWQuZnJhbWV3b3JrL0hlYWRlcnMvSW5mZXJyZWQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL0luZmVycmVkLmZyYW1ld29yay9IZWFkZXJzL0luZmVycmVkLmgKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL01vZHVsZV9Nb2R1bGVNYXAvYS5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvTW9kdWxlX01vZHVsZU1hcC9hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU3MWM2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL01vZHVsZV9Nb2R1bGVNYXAvYS5oCkBAIC0wLDAgKzEgQEAKK3ZvaWQgd2lsbF9iZV9mb3VuZDEodm9pZCk7CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Nb2R1bGVfTW9kdWxlTWFwL21vZHVsZS5tb2R1bGVtYXAgYi90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Nb2R1bGVfTW9kdWxlTWFwL21vZHVsZS5tb2R1bGVtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFjN2NjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL01vZHVsZV9Nb2R1bGVNYXAvbW9kdWxlLm1vZHVsZW1hcApAQCAtMCwwICsxLDMgQEAKK21vZHVsZSBtb2R1bGVfbW9kdWxlbWFwIHsKKyAgaGVhZGVyICJhLmgiCit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Nb2R1bGVfTW9kdWxlTWFwX0YuZnJhbWV3b3JrL0hlYWRlcnMvYS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oCmNvcHkgdG8gdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvTW9kdWxlX01vZHVsZU1hcF9GLmZyYW1ld29yay9IZWFkZXJzL2EuaApkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvTW9kdWxlX01vZHVsZU1hcF9GLmZyYW1ld29yay9Nb2R1bGVzL21vZHVsZS5tb2R1bGVtYXAgYi90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Nb2R1bGVfTW9kdWxlTWFwX0YuZnJhbWV3b3JrL01vZHVsZXMvbW9kdWxlLm1vZHVsZW1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDBmMzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvTW9kdWxlX01vZHVsZU1hcF9GLmZyYW1ld29yay9Nb2R1bGVzL21vZHVsZS5tb2R1bGVtYXAKQEAgLTAsMCArMSwzIEBACitmcmFtZXdvcmsgbW9kdWxlIE1vZHVsZV9Nb2R1bGVNYXBfRiB7CisgIGhlYWRlciAiYS5oIgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvTW9kdWxlX01vZHVsZU1hcF9GLmZyYW1ld29yay9Nb2R1bGVzL21vZHVsZS5wcml2YXRlLm1vZHVsZW1hcCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL01vZHVsZV9Nb2R1bGVNYXBfRi5mcmFtZXdvcmsvTW9kdWxlcy9tb2R1bGUucHJpdmF0ZS5tb2R1bGVtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhNDY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL01vZHVsZV9Nb2R1bGVNYXBfRi5mcmFtZXdvcmsvTW9kdWxlcy9tb2R1bGUucHJpdmF0ZS5tb2R1bGVtYXAKQEAgLTAsMCArMSwzIEBACitleHBsaWNpdCBmcmFtZXdvcmsgbW9kdWxlIE1vZHVsZV9Nb2R1bGVNYXBfRi5Qcml2YXRlIHsKKyAgaGVhZGVyICJwcml2YXRlLmgiCit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9Nb2R1bGVfTW9kdWxlTWFwX0YuZnJhbWV3b3JrL1ByaXZhdGVIZWFkZXJzL3ByaXZhdGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvTW9kdWxlcy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL01vZHVsZV9Nb2R1bGVNYXBfRi5mcmFtZXdvcmsvUHJpdmF0ZUhlYWRlcnMvcHJpdmF0ZS5oCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucy9tb2R1bGUubW9kdWxlbWFwIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvbW9kdWxlLm1vZHVsZW1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGY1ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvbW9kdWxlLm1vZHVsZW1hcApAQCAtMCwwICsxLDIgQEAKK2ZyYW1ld29yayBtb2R1bGUgKiB7Cit9CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL2F1dG9saW5rLXN1YjMuaCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvYXV0b2xpbmstc3ViMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMmM3MjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL2F1dG9saW5rLXN1YjMuaApAQCAtMCwwICsxIEBACitpbnQgYXV0b2xpbmtfc3ViMyh2b2lkKTsKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvYXV0b2xpbmstc3ViMy5wY2ggYi90ZXN0L01vZHVsZXMvSW5wdXRzL2F1dG9saW5rLXN1YjMucGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2M2IyZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL2F1dG9saW5rLXN1YjMucGNoCkBAIC0wLDAgKzEgQEAKK0BpbXBvcnQgYXV0b2xpbmsuc3ViMzsKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvYy1oZWFkZXItYmFkLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL2MtaGVhZGVyLWJhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmN2NkODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL2MtaGVhZGVyLWJhZC5oCkBAIC0wLDAgKzEsNCBAQAorfSAvLyBleHBlY3RlZC1lcnJvciB7e2V4dHJhbmVvdXMgY2xvc2luZyBicmFjZSAoJ30nKX19CitpbnQgbm90X2luX2V4dGVybl9jOworZXh0ZXJuICJDIiB7IC8vIGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICd7J319CisvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICd9J319CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL2MtaGVhZGVyLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL2MtaGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyZjY0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvYy1oZWFkZXIuaApAQCAtMCwwICsxIEBACitpbnQgZih2b2lkKTsKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvY3h4LWhlYWRlci5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9jeHgtaGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkNzc3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvY3h4LWhlYWRlci5oCkBAIC0wLDAgKzEgQEAKK2ludCBmKCk7CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC1pbmxpbmUtbmFtZXNwYWNlLWIuaCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvY3h4LWlubGluZS1uYW1lc3BhY2UtYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MmE1ODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC1pbmxpbmUtbmFtZXNwYWNlLWIuaApAQCAtMCwwICsxLDUgQEAKK0BpbXBvcnQgY3h4X2lubGluZV9uYW1lc3BhY2U7CisKK3N0cnVjdCBYOjpZOjpaIHsKKyAgdm9pZCBmKHN0cnVjdCBFbGFib3JhdGVkKTsKK307CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC1pbmxpbmUtbmFtZXNwYWNlLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC1pbmxpbmUtbmFtZXNwYWNlLmgKaW5kZXggMjUyNWFkMy4uNGZlYjg1MCAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9jeHgtaW5saW5lLW5hbWVzcGFjZS5oCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvY3h4LWlubGluZS1uYW1lc3BhY2UuaApAQCAtOSwzICs5LDkgQEAKICAgICB0eXBlZGVmIGludCBzaXplX3Q7CiAgIH0KIH0KKworbmFtZXNwYWNlIFggeworICBpbmxpbmUgbmFtZXNwYWNlIFkgeworICAgIHN0cnVjdCBaOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC1pcmdlbi1sZWZ0LmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC1pcmdlbi1sZWZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwYWM3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvY3h4LWlyZ2VuLWxlZnQuaApAQCAtMCwwICsxLDcgQEAKKyNpbmNsdWRlICJjeHgtaXJnZW4tdG9wLmgiCisKK1M8aW50PiBzOworCitpbmxpbmUgaW50IGluc3RhbnRpYXRlX21pbigpIHsKKyAgcmV0dXJuIG1pbigxLCAyKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvY3h4LWlyZ2VuLXJpZ2h0LmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC1pcmdlbi1yaWdodC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDBjNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC1pcmdlbi1yaWdodC5oCkBAIC0wLDAgKzEsMyBAQAorI2luY2x1ZGUgImN4eC1pcmdlbi10b3AuaCIKKworaW5saW5lIGludCBoKCkgeyByZXR1cm4gUzxpbnQ+OjpmKCk7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvY3h4LWlyZ2VuLXRvcC5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9jeHgtaXJnZW4tdG9wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExM2U5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvY3h4LWlyZ2VuLXRvcC5oCkBAIC0wLDAgKzEsMTAgQEAKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBTIHsKKyAgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpIHN0YXRpYyBpbnQgZigpIHsgcmV0dXJuIDA7IH0KKyAgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSwgdmlzaWJpbGl0eSgiaGlkZGVuIikpKSBzdGF0aWMgaW50IGcoKSB7IHJldHVybiAwOyB9Cit9OworCitleHRlcm4gdGVtcGxhdGUgc3RydWN0IFM8aW50PjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBtaW4oVCBhLCBUIGIpIHsgcmV0dXJuIGEgPCBiID8gYSA6IGI7IH0KKworZXh0ZXJuIGRlY2x0eXBlKG1pbigxLCAyKSkgaW5zdGFudGlhdGVfbWluX2RlY2w7CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC10ZW1wbGF0ZXMtYS5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9jeHgtdGVtcGxhdGVzLWEuaAppbmRleCAwYjE2MTRkLi42ZWNjMmNhIDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC10ZW1wbGF0ZXMtYS5oCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvY3h4LXRlbXBsYXRlcy1hLmgKQEAgLTQ4LDMgKzQ4LDUgQEAKIHRlbXBsYXRlPD4gc3RydWN0IE1lcmdlU3BlY2lhbGl6YXRpb25zPGNoYXI+IHsKICAgdHlwZWRlZiBpbnQgZXhwbGljaXRseV9zcGVjaWFsaXplZF9pbl9hOwogfTsKKwordm9pZCBJbnN0YW50aWF0ZVdpdGhGcmllbmQoU3RkOjpXaXRoRnJpZW5kPGludD4gd2ZpKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9jeHgtdGVtcGxhdGVzLWIuaCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvY3h4LXRlbXBsYXRlcy1iLmgKaW5kZXggNmNkODNmYS4uYTY4Mjg1NSAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9jeHgtdGVtcGxhdGVzLWIuaAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC10ZW1wbGF0ZXMtYi5oCkBAIC02Niw0ICs2Niw1IEBACiAKIHZvaWQgVHJpZ2dlckluc3RhbnRpYXRpb24oKSB7CiAgIFVzZURlZmluZWRJbkJJbXBsPHZvaWQ+KCk7CisgIFN0ZDo6ZjxpbnQ+KCk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC10ZW1wbGF0ZXMtY29tbW9uLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL2N4eC10ZW1wbGF0ZXMtY29tbW9uLmgKaW5kZXggNDBhMTFlMi4uOWI0NjUzOSAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9jeHgtdGVtcGxhdGVzLWNvbW1vbi5oCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvY3h4LXRlbXBsYXRlcy1jb21tb24uaApAQCAtOSwzICs5LDE1IEBACiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQ29tbW9uVGVtcGxhdGUgewogICBlbnVtIEUgeyBhID0gMSwgYiA9IDIsIGMgPSAzIH07CiB9OworCituYW1lc3BhY2UgU3RkIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFdpdGhGcmllbmQgeworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgV2l0aEZyaWVuZCAmQSwgY29uc3QgV2l0aEZyaWVuZCAmQikgeyByZXR1cm4gZmFsc2U7IH0KKyAgfTsKK30KKworbmFtZXNwYWNlIFN0ZCB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZigpIHsKKyAgICBleHRlcm4gVCBnKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvZGVjbGFyZS11c2UvZS5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9kZWNsYXJlLXVzZS9lLmgKaW5kZXggZWQ4ZDg0My4uMzEyNDdmNyAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9kZWNsYXJlLXVzZS9lLmgKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9kZWNsYXJlLXVzZS9lLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIEVfSAogI2RlZmluZSBFX0gKLSNpbmNsdWRlICJhLmgiCisjZGVmaW5lIEhFQURFUiAiYS5oIgorI2luY2x1ZGUgSEVBREVSCiAjaW5jbHVkZSAiYi5oIgogY29uc3QgaW50IGUgPSBhKmI7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvZGVjbGFyZS11c2UvaC5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9kZWNsYXJlLXVzZS9oLmgKaW5kZXggZGY5OWE2ZC4uMzc5ZTUwMSAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9kZWNsYXJlLXVzZS9oLmgKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9kZWNsYXJlLXVzZS9oLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIEhfSAogI2RlZmluZSBIX0gKICNpbmNsdWRlICJjLmgiCi0jaW5jbHVkZSAiZC5oIiAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiBhIG1vZHVsZSBub3QgZGVjbGFyZWQgdXNlZH19CisjaW5jbHVkZSAiZC5oIiAvLyBleHBlY3RlZC1lcnJvciB7e2RvZXMgbm90IGRlcGVuZCBvbiBhIG1vZHVsZSBleHBvcnRpbmd9fQogI2luY2x1ZGUgImgxLmgiCiBjb25zdCBpbnQgaDEgPSBhdXhfaCpjKjcqZDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9kZWNsYXJlLXVzZS9pLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL2RlY2xhcmUtdXNlL2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGU3ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9kZWNsYXJlLXVzZS9pLmgKQEAgLTAsMCArMSBAQAoraW50IGF1eF9pID0gMTM7CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL2RlY2xhcmUtdXNlL2ouaCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvZGVjbGFyZS11c2Uvai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZDQ2YTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL2RlY2xhcmUtdXNlL2ouaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIEpfSAorI2RlZmluZSBKX0gKKworI2RlZmluZSBTVFIoeCkgI3gKKyNkZWZpbmUgSERSKHgpIFNUUih4LmgpCisKKyNpbmNsdWRlIEFMTE9XRURfSU5DCisjaW5jbHVkZSBIRFIoYSkKKworY29uc3QgaW50IGogPSBhICogYSArIGI7CisKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9kZWNsYXJlLXVzZS9tb2R1bGUubWFwIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9kZWNsYXJlLXVzZS9tb2R1bGUubWFwCmluZGV4IDc3NGZjMzcuLmExNzZmYjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvZGVjbGFyZS11c2UvbW9kdWxlLm1hcAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL2RlY2xhcmUtdXNlL21vZHVsZS5tYXAKQEAgLTksMjEgKzksMjUgQEAKIG1vZHVsZSBYQyB7CiAgIGhlYWRlciAiYy5oIgogICB1c2UgWEEKKyAgLy8gSW50ZW50aW9uYWxseSBkb2Vzbid0IHVzZSBYQiB0byBzaG93IHRoYXQgLWZkZWNsLXVzZSBpc24ndCB0cmFuc2l0aXZlLgogfQogCiBtb2R1bGUgWEQgewogICBoZWFkZXIgImQuaCIKICAgdXNlIFhBCisgIC8vIEludGVudGlvbmFsbHkgZG9lc24ndCB1c2UgWEIgdG8gc2hvdyB0aGF0IC1mZGVjbC11c2UgaXNuJ3QgdHJhbnNpdGl2ZS4KIH0KIAogbW9kdWxlIFhFIHsKICAgaGVhZGVyICJlLmgiCisgIGhlYWRlciAidW5hdmFpbGFibGUuaCIKICAgdXNlIFhBCiAgIHVzZSBYQgogfQogCiBtb2R1bGUgWEYgewogICBoZWFkZXIgImYuaCIKKyAgaGVhZGVyICJ1bmF2YWlsYWJsZS5oIgogICB1c2UgWEEKICAgdXNlIFhCCiB9CkBAIC0zMywxMSArMzcsMjAgQEAKICAgaGVhZGVyICJnMS5oIgogICB1c2UgWEMKICAgdXNlIFhFCisgIHVzZSBYSgogfQogCiBtb2R1bGUgWEggewogICBoZWFkZXIgImguaCIKICAgaGVhZGVyICJoMS5oIgorICBoZWFkZXIgInMuaCIKICAgdXNlIFhDCiAgIHVzZSBYRQogfQorCittb2R1bGUgWEogeworICBoZWFkZXIgImouaCIKK30KKworbW9kdWxlIFhTIHsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvZGVjbGFyZS11c2Uvcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2NsYW5nL0RyaXZlci9DQzFPcHRpb25zLmgKcmVuYW1lIHRvIHRlc3QvTW9kdWxlcy9JbnB1dHMvZGVjbGFyZS11c2Uvcy5oCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL2Vsc2V3aGVyZS9jLWhlYWRlci1pbmRpcmVjdC5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9lbHNld2hlcmUvYy1oZWFkZXItaW5kaXJlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODNjNDFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9lbHNld2hlcmUvYy1oZWFkZXItaW5kaXJlY3QuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiYy1oZWFkZXIuaCIKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvZWxzZXdoZXJlL21vZHVsZS5tYXAgYi90ZXN0L01vZHVsZXMvSW5wdXRzL2Vsc2V3aGVyZS9tb2R1bGUubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNTY4MjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL2Vsc2V3aGVyZS9tb2R1bGUubWFwCkBAIC0wLDAgKzEgQEAKK21vZHVsZSBjX2xpYnJhcnlfaW5kaXJlY3QgeyBoZWFkZXIgImMtaGVhZGVyLWluZGlyZWN0LmgiIH0KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvaW5jbHVkZS1yZWxhdGl2ZS9hLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL2luY2x1ZGUtcmVsYXRpdmUvYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NTI4NGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL2luY2x1ZGUtcmVsYXRpdmUvYS5oCkBAIC0wLDAgKzEgQEAKK2V4dGVybiBpbnQgbjsKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvaW5jbHVkZS1yZWxhdGl2ZS9tb2R1bGUubWFwIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9pbmNsdWRlLXJlbGF0aXZlL21vZHVsZS5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwMGM4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvaW5jbHVkZS1yZWxhdGl2ZS9tb2R1bGUubWFwCkBAIC0wLDAgKzEgQEAKK21vZHVsZSBhIHsgaGVhZGVyICJhLmgiIH0KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFjcm8tdW5kZWYtdGhyb3VnaC1wY2gvQS5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9tYWNyby11bmRlZi10aHJvdWdoLXBjaC9BLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyY2M1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFjcm8tdW5kZWYtdGhyb3VnaC1wY2gvQS5oCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBBQgorI3VuZGVmIEFCCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3JvLXVuZGVmLXRocm91Z2gtcGNoL2Zvby5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9tYWNyby11bmRlZi10aHJvdWdoLXBjaC9mb28uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDAyNTZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9tYWNyby11bmRlZi10aHJvdWdoLXBjaC9mb28uaApAQCAtMCwwICsxIEBACitAaW1wb3J0IEE7CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3JvLXVuZGVmLXRocm91Z2gtcGNoL21vZHVsZS5tYXAgYi90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3JvLXVuZGVmLXRocm91Z2gtcGNoL21vZHVsZS5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmNjhjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFjcm8tdW5kZWYtdGhyb3VnaC1wY2gvbW9kdWxlLm1hcApAQCAtMCwwICsxLDMgQEAKK21vZHVsZSBBIHsKKyAgaGVhZGVyICJBLmgiCit9CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3Jvc19vdGhlci5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9tYWNyb3Nfb3RoZXIuaAppbmRleCBlYTY4NmJmLi40OTIzYTdmIDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3Jvc19vdGhlci5oCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFjcm9zX290aGVyLmgKQEAgLTEgKzEsNiBAQAotI2RlZmluZSBPVEhFUl9JTlRFR0VSIGludAorI3VuZGVmIFRPUF9PVEhFUl9VTkRFRjEKKyNkZWZpbmUgVE9QX09USEVSX1VOREVGMiA0MgorI2RlZmluZSBUT1BfT1RIRVJfUkVERUYxIDEKKyNkZWZpbmUgVE9QX09USEVSX1JFREVGMSAzCisKKyNkZWZpbmUgVE9QX09USEVSX0RFRl9SSUdIVF9VTkRFRiA0CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3Jvc19yaWdodC5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9tYWNyb3NfcmlnaHQuaAppbmRleCBkYmJkMmMzLi5hNzBjMzUwIDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3Jvc19yaWdodC5oCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFjcm9zX3JpZ2h0LmgKQEAgLTE3LDMgKzE3LDUgQEAKICNkZWZpbmUgVE9QX1JJR0hUX1JFREVGIGZsb2F0CiAKICNkZWZpbmUgRk5fQUREKHgsIHkpICh4K3kpCisKKyN1bmRlZiBUT1BfT1RIRVJfREVGX1JJR0hUX1VOREVGCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3Jvc19yaWdodF91bmRlZi5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9tYWNyb3NfcmlnaHRfdW5kZWYuaAppbmRleCA0OTQ3M2UzLi4xNWE4MzY2IDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3Jvc19yaWdodF91bmRlZi5oCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFjcm9zX3JpZ2h0X3VuZGVmLmgKQEAgLTEgKzEsNCBAQAogI3VuZGVmIFRPUF9SSUdIVF9VTkRFRgorCitAaW1wb3J0IG1hY3Jvc190b3A7CisjdW5kZWYgVE9QX09USEVSX0RFRl9SSUdIVF9VTkRFRgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9tYWNyb3NfdG9wLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3Jvc190b3AuaAppbmRleCBkZDMwM2ZmLi4xMDkzNTA0IDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3Jvc190b3AuaAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3Jvc190b3AuaApAQCAtMTQsMyArMTQsMTEgQEAKIAogI2RlZmluZSBUT1BfUklHSFRfVU5ERUYgaW50CiAKKyNkZWZpbmUgVE9QX09USEVSX1VOREVGMSA0MgorI3VuZGVmIFRPUF9PVEhFUl9VTkRFRjIKKyNkZWZpbmUgVE9QX09USEVSX1JFREVGMSAxCisjZGVmaW5lIFRPUF9PVEhFUl9SRURFRjIgMgorCisjZGVmaW5lIFRPUF9PVEhFUl9ERUZfUklHSFRfVU5ERUYgdm9pZAorCisjZGVmaW5lIFRPUF9SRURFRl9JTl9TVUJNT0RVTEVTIDAKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFjcm9zX3RvcF9iLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3Jvc190b3BfYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZWUxN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL21hY3Jvc190b3BfYi5oCkBAIC0wLDAgKzEsNSBAQAorI2luY2x1ZGUgIm1hY3Jvc190b3AuaCIKKyN1bmRlZiBUT1BfUkVERUZfSU5fU1VCTU9EVUxFUworI2RlZmluZSBUT1BfUkVERUZfSU5fU1VCTU9EVUxFUyAxCisjdW5kZWYgVE9QX1JFREVGX0lOX1NVQk1PRFVMRVMKKyNkZWZpbmUgVE9QX1JFREVGX0lOX1NVQk1PRFVMRVMgMgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9tYWNyb3NfdG9wX2MuaCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFjcm9zX3RvcF9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlODI0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFjcm9zX3RvcF9jLmgKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAibWFjcm9zX3RvcF9iLmgiCisjdW5kZWYgVE9QX1JFREVGX0lOX1NVQk1PRFVMRVMKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFsZm9ybWVkL2ExLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL21hbGZvcm1lZC9hMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMGI5MTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL21hbGZvcm1lZC9hMS5oCkBAIC0wLDAgKzEgQEAKK3ZvaWQgZigpIHsKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFsZm9ybWVkL2EyLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL21hbGZvcm1lZC9hMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzQzMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL21hbGZvcm1lZC9hMi5oCkBAIC0wLDAgKzEgQEAKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFsZm9ybWVkL2IxLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL21hbGZvcm1lZC9iMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOThiYzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL21hbGZvcm1lZC9iMS5oCkBAIC0wLDAgKzEsMyBAQAorc3RydWN0IFMgeworICAjaW5jbHVkZSAiYjIuaCIKK307CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL21hbGZvcm1lZC9iMi5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9tYWxmb3JtZWQvYjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmM1MzQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9tYWxmb3JtZWQvYjIuaApAQCAtMCwwICsxIEBACit2b2lkIGcoKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9tYWxmb3JtZWQvbW9kdWxlLm1hcCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFsZm9ybWVkL21vZHVsZS5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3N2ZmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbWFsZm9ybWVkL21vZHVsZS5tYXAKQEAgLTAsMCArMSw4IEBACittb2R1bGUgbWFsZm9ybWVkX2EgeworICBtb2R1bGUgYTEgeyBoZWFkZXIgImExLmgiIH0KKyAgbW9kdWxlIGEyIHsgaGVhZGVyICJhMi5oIiB9Cit9Cittb2R1bGUgbWFsZm9ybWVkX2IgeworICBtb2R1bGUgYjEgeyBoZWFkZXIgImIxLmgiIH0KKyAgbW9kdWxlIGIyIHsgaGVhZGVyICJiMi5oIiB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL21vZHVsZS5tYXAgYi90ZXN0L01vZHVsZXMvSW5wdXRzL21vZHVsZS5tYXAKaW5kZXggY2Y4YTI5OC4uZDZlZmZjZiAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9tb2R1bGUubWFwCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbW9kdWxlLm1hcApAQCAtMSwzICsxLDYgQEAKK21vZHVsZSBjX2xpYnJhcnkgW2V4dGVybl9jXSB7IG1vZHVsZSBpbm5lciB7IGhlYWRlciAiYy1oZWFkZXIuaCIgfSB9Cittb2R1bGUgY3h4X2xpYnJhcnkgeyBoZWFkZXIgImN4eC1oZWFkZXIuaCIgcmVxdWlyZXMgY3BsdXNwbHVzIH0KK21vZHVsZSBjX2xpYnJhcnlfYmFkIFtleHRlcm5fY10geyBoZWFkZXIgImMtaGVhZGVyLWJhZC5oIiB9CiBtb2R1bGUgZGlhbW9uZF90b3AgeyBoZWFkZXIgImRpYW1vbmRfdG9wLmgiIH0KIG1vZHVsZSBkaWFtb25kX2xlZnQgeyAKICAgaGVhZGVyICJkaWFtb25kX2xlZnQuaCIgCkBAIC0xMiw2ICsxNSw5IEBACiAgIGV4cG9ydCAqCiB9CiBtb2R1bGUgaXJnZW4geyBoZWFkZXIgImlyZ2VuLmgiIH0KK21vZHVsZSBjeHhfaXJnZW5fdG9wIHsgaGVhZGVyICJjeHgtaXJnZW4tdG9wLmgiIH0KK21vZHVsZSBjeHhfaXJnZW5fbGVmdCB7IGhlYWRlciAiY3h4LWlyZ2VuLWxlZnQuaCIgfQorbW9kdWxlIGN4eF9pcmdlbl9yaWdodCB7IGhlYWRlciAiY3h4LWlyZ2VuLXJpZ2h0LmgiIH0KIG1vZHVsZSBsb29rdXBfbGVmdF9vYmpjIHsgaGVhZGVyICJsb29rdXBfbGVmdC5oIiB9CiBtb2R1bGUgbG9va3VwX3JpZ2h0X29iamMgeyBoZWFkZXIgImxvb2t1cF9yaWdodC5oIiB9CiBtb2R1bGUgbG9va3VwX2xlZnRfY3h4IHsgaGVhZGVyICJsb29rdXBfbGVmdC5ocHAiIH0KQEAgLTIwLDYgKzI2LDggQEAKIG1vZHVsZSBtb2R1bGVfcHJpdmF0ZV9yaWdodCB7IGhlYWRlciAibW9kdWxlX3ByaXZhdGVfcmlnaHQuaCIgfQogbW9kdWxlIG1hY3Jvc190b3AgeyAKICAgaGVhZGVyICJtYWNyb3NfdG9wLmgiIAorICBleHBsaWNpdCBtb2R1bGUgYiB7IGhlYWRlciAibWFjcm9zX3RvcF9iLmgiIH0KKyAgZXhwbGljaXQgbW9kdWxlIGMgeyBoZWFkZXIgIm1hY3Jvc190b3BfYy5oIiB9CiB9CiBtb2R1bGUgbWFjcm9zX2xlZnQgeyAKICAgaGVhZGVyICJtYWNyb3NfbGVmdC5oIiAKQEAgLTMzLDYgKzQxLDcgQEAKICAgfQogfQogbW9kdWxlIG1hY3JvcyB7IGhlYWRlciAibWFjcm9zLmgiIH0KK21vZHVsZSBtYWNyb3Nfb3RoZXIgeyBoZWFkZXIgIm1hY3Jvc19vdGhlci5oIiB9CiBtb2R1bGUgY2F0ZWdvcnlfdG9wIHsgaGVhZGVyICJjYXRlZ29yeV90b3AuaCIgfQogbW9kdWxlIGNhdGVnb3J5X2xlZnQgeyAKICAgaGVhZGVyICJjYXRlZ29yeV9sZWZ0LmgiIApAQCAtMTY2LDYgKzE3NSwxMSBAQAogICAgIGhlYWRlciAiYXV0b2xpbmstc3ViMi5oIgogICAgIGxpbmsgZnJhbWV3b3JrICJhdXRvbGlua19mcmFtZXdvcmsiCiAgIH0KKworICBleHBsaWNpdCBtb2R1bGUgc3ViMyB7CisgICAgaGVhZGVyICJhdXRvbGluay1zdWIzLmgiCisgICAgbGluayAiYXV0b2xpbmtfZnJvbV9wY2giCisgIH0KIH0KIAogbW9kdWxlIHdlaXJkX29iamMgewpAQCAtMTg0LDYgKzE5OCwxMCBAQAogICBoZWFkZXIgImN4eC1pbmxpbmUtbmFtZXNwYWNlLmgiCiB9CiAKK21vZHVsZSBjeHhfaW5saW5lX25hbWVzcGFjZV9iIHsKKyAgaGVhZGVyICJjeHgtaW5saW5lLW5hbWVzcGFjZS1iLmgiCit9CisKIG1vZHVsZSBjeHhfbGlua2FnZV9jYWNoZSB7CiAgIGhlYWRlciAiY3h4LWxpbmthZ2UtY2FjaGUuaCIKIH0KQEAgLTI4MSwzICsyOTksOSBAQAogbW9kdWxlIHJlY3Vyc2l2ZV92aXNpYmlsaXR5X2MgewogICBoZWFkZXIgInJlY3Vyc2l2ZV92aXNpYmlsaXR5X2MuaCIKIH0KK21vZHVsZSByZWN1cnNpdmUxIHsKKyAgaGVhZGVyICJyZWN1cnNpdmUxLmgiCit9Cittb2R1bGUgcmVjdXJzaXZlMiB7CisgIGhlYWRlciAicmVjdXJzaXZlMi5oIgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9uYW1lc3BhY2VzLWxlZnQuaCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbmFtZXNwYWNlcy1sZWZ0LmgKaW5kZXggYmQxOTJhZi4uNzg3ZmU3NSAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9uYW1lc3BhY2VzLWxlZnQuaAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL25hbWVzcGFjZXMtbGVmdC5oCkBAIC0xLDUgKzEsMTggQEAKK25hbWVzcGFjZSBSZWRlY2xBY3Jvc3NJbXBvcnQgeworICBlbnVtIEUgeyBlIH07Cit9CisKK25hbWVzcGFjZSBBZGRBbmRSZWV4cG9ydEJlZm9yZUltcG9ydCB7CisgIHN0cnVjdCBTIHt9OworICBleHRlcm4gc3RydWN0IFMgdDsKK30KKwogQGltcG9ydCBuYW1lc3BhY2VzX3RvcDsKIAorbmFtZXNwYWNlIFJlZGVjbEFjcm9zc0ltcG9ydCB7CisgIEUgeCA9IGU7Cit9CisKIGZsb2F0ICZnbG9iYWwoZmxvYXQpOwogZmxvYXQgJmdsb2JhbDIoZmxvYXQpOwogCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL25hbWVzcGFjZXMtdG9wLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL25hbWVzcGFjZXMtdG9wLmgKaW5kZXggN2FhODQ5MC4uN2JmNTM5NCAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9uYW1lc3BhY2VzLXRvcC5oCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvbmFtZXNwYWNlcy10b3AuaApAQCAtMTcsMyArMTcsNyBAQAogICBpbnQgZihpbnQpOwogICB2b2lkICgqcCkoKSA9ICZmOwogfQorCituYW1lc3BhY2UgQWRkQW5kUmVleHBvcnRCZWZvcmVJbXBvcnQgeworICBpbnQgUzsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvcmVjdXJzaXZlMS5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9yZWN1cnNpdmUxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNiNTkxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvcmVjdXJzaXZlMS5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICJyZWN1cnNpdmUyLmgiCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL3JlY3Vyc2l2ZTIuaCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvcmVjdXJzaXZlMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NDgwYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL3JlY3Vyc2l2ZTIuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSAicmVjdXJzaXZlMS5oIgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9zdHJpbmdfbmFtZXMvYS5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9zdHJpbmdfbmFtZXMvYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNmRjMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL3N0cmluZ19uYW1lcy9hLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIEFfSAorI2RlZmluZSBBX0gKK2NvbnN0IGludCBhID0gMjsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9zdHJpbmdfbmFtZXMvYi5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9zdHJpbmdfbmFtZXMvYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZGFmNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL3N0cmluZ19uYW1lcy9iLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIEJfSAorI2RlZmluZSBCX0gKK2NvbnN0IGludCBiID0gMzsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9zdHJpbmdfbmFtZXMvYy5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9zdHJpbmdfbmFtZXMvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzI3OGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL3N0cmluZ19uYW1lcy9jLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIENfSAorI2RlZmluZSBDX0gKK2NvbnN0IGludCBjID0gMjsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy9zdHJpbmdfbmFtZXMvbW9kdWxlLm1hcCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvc3RyaW5nX25hbWVzL21vZHVsZS5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3MGVkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvc3RyaW5nX25hbWVzL21vZHVsZS5tYXAKQEAgLTAsMCArMSwxNiBAQAorbW9kdWxlICJteS9tb2R1bGUtYSIgeworICBoZWFkZXIgImEuaCIKKyAgdXNlICJteS9tb2R1bGUtYyIKKworICBtb2R1bGUgIlN1YiIgeworICAgIGhlYWRlciAic3ViLmgiCisgIH0KK30KKworbW9kdWxlICJteS9tb2R1bGUtYiIgeworICBoZWFkZXIgImIuaCIKK30KKworbW9kdWxlICJteS9tb2R1bGUtYyIgeworICBoZWFkZXIgImMuaCIKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvc3RyaW5nX25hbWVzL3N1Yi5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9zdHJpbmdfbmFtZXMvc3ViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiOTExMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvc3RyaW5nX25hbWVzL3N1Yi5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBTVUJfSAorI2RlZmluZSBTVUJfSAorY29uc3QgaW50IHN1YiA9IDI7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvc3VibW9kdWxlcy9pbXBvcnQtc2VsZi1iLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL3N1Ym1vZHVsZXMvaW1wb3J0LXNlbGYtYi5oCmluZGV4IGY4OGI1NmQuLjk4NTIwOTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvc3VibW9kdWxlcy9pbXBvcnQtc2VsZi1iLmgKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9zdWJtb2R1bGVzL2ltcG9ydC1zZWxmLWIuaApAQCAtMSwxMCArMSwxMiBAQAorLy8gRklYTUU6IFRoaXMgaW1wb3J0IGhhcyBubyBlZmZlY3QsIGJlY2F1c2UgdGhlIHN1Ym1vZHVsZSBpc24ndCBidWlsdCB5ZXQsIGFuZAorLy8gd2UgZG9uJ3QgbWFwIGFuIEBpbXBvcnQgdG8gYSAjaW5jbHVkZSBpbiB0aGlzIGNhc2UuCiBAaW1wb3J0IGltcG9ydF9zZWxmLmM7CiAjaW5jbHVkZSAiaW1wb3J0LXNlbGYtZC5oIgogCiAvLyBGSVhNRTogVGhpcyBzaG91bGQgbm90IHdvcms7IG5hbWVzIGZyb20gJ2EnIHNob3VsZCBub3QgYmUgdmlzaWJsZSBoZXJlLgogTXlUeXBlQSBpbXBvcnRfc2VsZl90ZXN0X2E7CiAKLS8vIEZJWE1FOiBUaGlzIHNob3VsZCB3b3JrIGJ1dCBkb2VzIG5vdDsgbmFtZXMgZnJvbSAnYicgYXJlIG5vdCBhY3R1YWxseSB2aXNpYmxlIGhlcmUuCisvLyBGSVhNRTogVGhpcyBzaG91bGQgd29yayBidXQgZG9lcyBub3Q7IG5hbWVzIGZyb20gJ2MnIGFyZSBub3QgYWN0dWFsbHkgdmlzaWJsZSBoZXJlLgogLy9NeVR5cGVDIGltcG9ydF9zZWxmX3Rlc3RfYzsKIAogTXlUeXBlRCBpbXBvcnRfc2VsZl90ZXN0X2Q7CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL3N1Ym1vZHVsZXMvbW9kdWxlLm1hcCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvc3VibW9kdWxlcy9tb2R1bGUubWFwCmluZGV4IGM5MWU5NGYuLjE1OTMxMDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvc3VibW9kdWxlcy9tb2R1bGUubWFwCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvc3VibW9kdWxlcy9tb2R1bGUubWFwCkBAIC0xMCwzICsxMCw4IEBACiAgIG1vZHVsZSBjIHsgaGVhZGVyICJpbXBvcnQtc2VsZi1jLmgiIH0KICAgbW9kdWxlIGQgeyBoZWFkZXIgImltcG9ydC1zZWxmLWQuaCIgfQogfQorCittb2R1bGUgbWlzc2luZ19oZWFkZXJzIHsKKyAgbW9kdWxlIG1pc3NpbmcgeyBoZWFkZXIgIm1pc3NpbmcuaCIgfQorICBtb2R1bGUgbm90X21pc3NpbmcgeyBoZWFkZXIgIm5vdF9taXNzaW5nLmgiIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvc3VibW9kdWxlcy9ub3RfbWlzc2luZy5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy9zdWJtb2R1bGVzL25vdF9taXNzaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4ZDA0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvc3VibW9kdWxlcy9ub3RfbWlzc2luZy5oCkBAIC0wLDAgKzEsMiBAQAordm9pZCBOb3RNaXNzaW5nRnVuY3Rpb24oKSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL3RlbXBsYXRlLXNwZWNpYWxpemF0aW9uLXZpc2liaWxpdHkvYS5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy90ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi12aXNpYmlsaXR5L2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgyMDU1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24tdmlzaWJpbGl0eS9hLmgKQEAgLTAsMCArMSw4IEBACisjaWZuZGVmIEFfSAorI2RlZmluZSBBX0gKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBTOwordGVtcGxhdGU8dHlwZW5hbWUgVT4gc3RydWN0IFQgeworICBzdHJ1Y3QgUzsKKyAgZW51bSBFIDogaW50OworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy90ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi12aXNpYmlsaXR5L2IuaCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24tdmlzaWJpbGl0eS9iLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwOTgyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24tdmlzaWJpbGl0eS9iLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIEJfSAorI2RlZmluZSBCX0gKKyNpbmNsdWRlICJhLmgiCitTPGludD4gKnMxOworVDxpbnQ+OjpTICpzMjsKK1Q8aW50Pjo6RSBlMTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy90ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi12aXNpYmlsaXR5L2MuaCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24tdmlzaWJpbGl0eS9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyZmIzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24tdmlzaWJpbGl0eS9jLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIENfSAorI2RlZmluZSBDX0gKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBTIHsgaW50IG47IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzdHJ1Y3QgVDxVPjo6UyB7IGludCBuOyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVT4gZW51bSBUPFU+OjpFIDogaW50IHsgZSB9OworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL3RlbXBsYXRlLXNwZWNpYWxpemF0aW9uLXZpc2liaWxpdHkvZC5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy90ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi12aXNpYmlsaXR5L2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQ4MjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy90ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi12aXNpYmlsaXR5L2QuaApAQCAtMCwwICsxLDUgQEAKKyNpZm5kZWYgRF9ICisjZGVmaW5lIERfSAordGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBTOwordGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBUOworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvSW5wdXRzL3RlbXBsYXRlLXNwZWNpYWxpemF0aW9uLXZpc2liaWxpdHkvZS5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy90ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi12aXNpYmlsaXR5L2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDZiMTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy90ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi12aXNpYmlsaXR5L2UuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgRV9ICisjZGVmaW5lIEVfSAorI2luY2x1ZGUgImMuaCIKK3RlbXBsYXRlIHN0cnVjdCBTPGNoYXI+OwordGVtcGxhdGUgc3RydWN0IFQ8Y2hhcj47CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24tdmlzaWJpbGl0eS9tb2R1bGUubWFwIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy90ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi12aXNpYmlsaXR5L21vZHVsZS5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlMmEwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24tdmlzaWJpbGl0eS9tb2R1bGUubWFwCkBAIC0wLDAgKzEsNyBAQAorbW9kdWxlIHRzdiB7CisgIG1vZHVsZSBhIHsgaGVhZGVyICJhLmgiIH0KKyAgbW9kdWxlIGIgeyBoZWFkZXIgImIuaCIgfQorICBtb2R1bGUgYyB7IGhlYWRlciAiYy5oIiB9CisgIG1vZHVsZSBkIHsgaGVhZGVyICJkLmgiIH0KKyAgbW9kdWxlIGUgeyBoZWFkZXIgImUuaCIgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy91bm5lY2Vzc2FyeS1tb2R1bGUtbWFwLXBhcnNpbmcvYTEuaCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdW5uZWNlc3NhcnktbW9kdWxlLW1hcC1wYXJzaW5nL2ExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3NTdhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdW5uZWNlc3NhcnktbW9kdWxlLW1hcC1wYXJzaW5nL2ExLmgKQEAgLTAsMCArMSBAQAordm9pZCBmKCkge30KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdW5uZWNlc3NhcnktbW9kdWxlLW1hcC1wYXJzaW5nL21vZHVsZS5tYXAgYi90ZXN0L01vZHVsZXMvSW5wdXRzL3VubmVjZXNzYXJ5LW1vZHVsZS1tYXAtcGFyc2luZy9tb2R1bGUubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNGNlZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvSW5wdXRzL3VubmVjZXNzYXJ5LW1vZHVsZS1tYXAtcGFyc2luZy9tb2R1bGUubWFwCkBAIC0wLDAgKzEsMyBAQAorbW9kdWxlIGEgeworICBlYWRlciAidW5rbm93bi5oIgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL0lucHV0cy91cGRhdGUtYWZ0ZXItbG9hZC9hLmggYi90ZXN0L01vZHVsZXMvSW5wdXRzL3VwZGF0ZS1hZnRlci1sb2FkL2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWJjZjNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy91cGRhdGUtYWZ0ZXItbG9hZC9hLmgKQEAgLTAsMCArMSBAQAorbmFtZXNwYWNlIGxsdm0ge30KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdXBkYXRlLWFmdGVyLWxvYWQvYi5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy91cGRhdGUtYWZ0ZXItbG9hZC9iLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlOWJmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdXBkYXRlLWFmdGVyLWxvYWQvYi5oCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImEuaCIKK25hbWVzcGFjZSBsbHZtIHsgdm9pZCBmKCk7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdXBkYXRlLWFmdGVyLWxvYWQvbW9kdWxlLm1hcCBiL3Rlc3QvTW9kdWxlcy9JbnB1dHMvdXBkYXRlLWFmdGVyLWxvYWQvbW9kdWxlLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWUxNjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy91cGRhdGUtYWZ0ZXItbG9hZC9tb2R1bGUubWFwCkBAIC0wLDAgKzEgQEAKK21vZHVsZSBhIHsgaGVhZGVyICJhLmgiIH0gbW9kdWxlIGIgeyBoZWFkZXIgImIuaCIgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFuZy9Ecml2ZXIvQ0MxT3B0aW9ucy5oIGIvdGVzdC9Nb2R1bGVzL0lucHV0cy91cGRhdGUtYWZ0ZXItbG9hZC9tb2R1bGVzLnRpbWVzdGFtcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIGluY2x1ZGUvY2xhbmcvRHJpdmVyL0NDMU9wdGlvbnMuaApjb3B5IHRvIHRlc3QvTW9kdWxlcy9JbnB1dHMvdXBkYXRlLWFmdGVyLWxvYWQvbW9kdWxlcy50aW1lc3RhbXAKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9hdXRvLW1vZHVsZS1pbXBvcnQubSBiL3Rlc3QvTW9kdWxlcy9hdXRvLW1vZHVsZS1pbXBvcnQubQppbmRleCBkN2ZiOWQxLi5iZjk5Mzc3IDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvYXV0by1tb2R1bGUtaW1wb3J0Lm0KKysrIGIvdGVzdC9Nb2R1bGVzL2F1dG8tbW9kdWxlLWltcG9ydC5tCkBAIC04Myw2ICs4Myw2IEBACiAgIHJldHVybiBub3RfaW5fbW9kdWxlOwogfQogCi12b2lkIGluY2x1ZGVOb3RBdFRvcExldmVsKCkgewotICAjaW5jbHVkZSA8Tm9VbWJyZWxsYS9BLmg+IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t0cmVhdGluZyAjaW5jbHVkZSBhcyBhbiBpbXBvcnR9fSBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGV4cHJlc3Npb259fQotfQordm9pZCBpbmNsdWRlTm90QXRUb3BMZXZlbCgpIHsgLy8gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJ3snfX0KKyAgI2luY2x1ZGUgPE5vVW1icmVsbGEvQS5oPiAvLyBleHBlY3RlZC13YXJuaW5nIHt7dHJlYXRpbmcgI2luY2x1ZGUgYXMgYW4gaW1wb3J0fX0gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnfSd9fQorfSAvLyBleHBlY3RlZC1lcnJvciB7e2V4dHJhbmVvdXMgY2xvc2luZyBicmFjZX19CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvYXV0b2xpbmsubSBiL3Rlc3QvTW9kdWxlcy9hdXRvbGluay5tCmluZGV4IDA3N2FhYzUuLjg4M2EyZjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9hdXRvbGluay5tCisrKyBiL3Rlc3QvTW9kdWxlcy9hdXRvbGluay5tCkBAIC0xLDYgKzEsNyBAQAogLy8gUlVOOiBybSAtcmYgJXQKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1vIC0gLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWZtb2R1bGVzIC1GICVTL0lucHV0cyAtSSAlUy9JbnB1dHMgJXMgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1mbm8tYXV0b2xpbmsgLW8gLSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZXMgLUYgJVMvSW5wdXRzIC1JICVTL0lucHV0cyAlcyB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1BVVRPTElOSy1ESVNBQkxFRCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LXBjaCAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZXMgLW8gJXQucGNoIC1JICVTL0lucHV0cyAteCBvYmplY3RpdmUtYy1oZWFkZXIgJVMvSW5wdXRzL2F1dG9saW5rLXN1YjMucGNoCisvLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bSAtbyAtIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1mbW9kdWxlcyAtRiAlUy9JbnB1dHMgLUkgJVMvSW5wdXRzIC1pbmNsdWRlLXBjaCAldC5wY2ggJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1sbHZtIC1mbm8tYXV0b2xpbmsgLW8gLSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZXMgLUYgJVMvSW5wdXRzIC1JICVTL0lucHV0cyAtaW5jbHVkZS1wY2ggJXQucGNoICVzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUFVVE9MSU5LLURJU0FCTEVEICVzCiAKIEBpbXBvcnQgYXV0b2xpbmsuc3ViMjsKIApAQCAtMjksMTEgKzMwLDE2IEBACiAgIHJldHVybiBub191bWJyZWxsYV9BOwogfQogCitpbnQgdXNlX2F1dG9saW5rX3N1YjMoKSB7CisgIHJldHVybiBhdXRvbGlua19zdWIzKCk7Cit9CisKIC8vIE5PVEU6ICJhdXRvbGlua19zdWIiIGlzIGludGVudGlvbmFsbHkgbm90IGxpbmtlZC4KIAogLy8gQ0hFQ0s6ICFsbHZtLm1vZHVsZS5mbGFncyA9ICF7ITAsICExLCAhMiwgITMsICE0fQogLy8gQ0hFQ0s6ICE0ID0gbWV0YWRhdGEgIXtpMzIgNiwgbWV0YWRhdGEgISJMaW5rZXIgT3B0aW9ucyIsIG1ldGFkYXRhICFbW0FVVE9MSU5LX09QVElPTlM6WzAtOV0rXV19Ci0vLyBDSEVDSzogIVtbQVVUT0xJTktfT1BUSU9OU11dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhW1tBVVRPTElOS19GUkFNRVdPUks6WzAtOV0rXV0sIG1ldGFkYXRhICFbW0FVVE9MSU5LOlswLTldK11dLCBtZXRhZGF0YSAhW1tERVBFTkRTT05NT0RVTEU6WzAtOV0rXV0sIG1ldGFkYXRhICFbW01PRFVMRTpbMC05XStdXSwgbWV0YWRhdGEgIVtbTk9VTUJSRUxMQTpbMC05XStdXX0KKy8vIENIRUNLOiAhW1tBVVRPTElOS19PUFRJT05TXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICFbW0FVVE9MSU5LX1BDSDpbMC05XStdXSwgbWV0YWRhdGEgIVtbQVVUT0xJTktfRlJBTUVXT1JLOlswLTldK11dLCBtZXRhZGF0YSAhW1tBVVRPTElOSzpbMC05XStdXSwgbWV0YWRhdGEgIVtbREVQRU5EU09OTU9EVUxFOlswLTldK11dLCBtZXRhZGF0YSAhW1tNT0RVTEU6WzAtOV0rXV0sIG1ldGFkYXRhICFbW05PVU1CUkVMTEE6WzAtOV0rXV19CisvLyBDSEVDSzogIVtbQVVUT0xJTktfUENIXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEie3soLWx8L0RFRkFVTFRMSUI6KX19YXV0b2xpbmtfZnJvbV9wY2h7eyhcLmxpYik/fX0ifQogLy8gQ0hFQ0s6ICFbW0FVVE9MSU5LX0ZSQU1FV09SS11dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhIi1mcmFtZXdvcmsiLCBtZXRhZGF0YSAhImF1dG9saW5rX2ZyYW1ld29yayJ9CiAvLyBDSEVDSzogIVtbQVVUT0xJTktdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJ7eygtbHwvREVGQVVMVExJQjopfX1hdXRvbGlua3t7KFwubGliKT99fSJ9CiAvLyBDSEVDSzogIVtbREVQRU5EU09OTU9EVUxFXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiLWZyYW1ld29yayIsIG1ldGFkYXRhICEiRGVwZW5kc09uTW9kdWxlIn0KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9jb25maWdfbWFjcm9zLm0gYi90ZXN0L01vZHVsZXMvY29uZmlnX21hY3Jvcy5tCmluZGV4IDIwMDc0NGQuLmIxNDczMTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9jb25maWdfbWFjcm9zLm0KKysrIGIvdGVzdC9Nb2R1bGVzL2NvbmZpZ19tYWNyb3MubQpAQCAtMjQsNSArMjQsNSBAQAogCiAvLyBSVU46IHJtIC1yZiAldAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtRFdBTlRfRk9PPTEgLWVtaXQtbW9kdWxlIC1mbW9kdWxlLW5hbWU9Y29uZmlnICVTL0lucHV0cy9tb2R1bGUubWFwCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1EV0FOVF9GT089MSAlcyAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAtRFdBTlRfRk9PPTEgJXMgLXZlcmlmeQogCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvY3h4LWlubGluZS1uYW1lc3BhY2UuY3BwIGIvdGVzdC9Nb2R1bGVzL2N4eC1pbmxpbmUtbmFtZXNwYWNlLmNwcAppbmRleCA1Yjk2NzkwLi5mNjdkNDNiIDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvY3h4LWlubGluZS1uYW1lc3BhY2UuY3BwCisrKyBiL3Rlc3QvTW9kdWxlcy9jeHgtaW5saW5lLW5hbWVzcGFjZS5jcHAKQEAgLTIsNSArMiw4IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXggb2JqZWN0aXZlLWMrKyAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzICVzIC12ZXJpZnkgLXN0ZD1jKysxMQogCiBAaW1wb3J0IGN4eF9pbmxpbmVfbmFtZXNwYWNlOworQGltcG9ydCBjeHhfaW5saW5lX25hbWVzcGFjZV9iOwogCiBUIHg7IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5rbm93biB0eXBlIG5hbWUgJ1QnfX0KKworWDo6RWxhYm9yYXRlZCAqcDsKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9jeHgtaXJnZW4uY3BwIGIvdGVzdC9Nb2R1bGVzL2N4eC1pcmdlbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0MmNiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9jeHgtaXJnZW4uY3BwCkBAIC0wLDAgKzEsMTggQEAKKy8vIFJVTjogcm0gLXJmICV0CisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jKysgLXN0ZD1jKysxMSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1kaXNhYmxlLWxsdm0tb3B0em5zIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gRklYTUU6IFdoZW4gd2UgaGF2ZSBhIHN5bnRheCBmb3IgbW9kdWxlcyBpbiBDKyssIHVzZSB0aGF0LgorCitAaW1wb3J0IGN4eF9pcmdlbl90b3A7CitAaW1wb3J0IGN4eF9pcmdlbl9sZWZ0OworQGltcG9ydCBjeHhfaXJnZW5fcmlnaHQ7CisKKy8vIENIRUNLLURBRzogZGVmaW5lIGF2YWlsYWJsZV9leHRlcm5hbGx5IGhpZGRlbiBpMzIgQF9aTjFTSWlFMWdFdih7ey4qfX0gI1tbQUxXQVlTX0lOTElORTouKl1dIGFsaWduCitpbnQgYSA9IFM8aW50Pjo6ZygpOworCisvLyBDSEVDSy1EQUc6IGRlZmluZSBhdmFpbGFibGVfZXh0ZXJuYWxseSBpMzIgQF9aTjFTSWlFMWZFdih7ey4qfX0gI1tbQUxXQVlTX0lOTElORV1dIGFsaWduCitpbnQgYiA9IGgoKTsKKworLy8gQ0hFQ0stREFHOiBkZWZpbmUgbGlua29uY2Vfb2RyIGkzMiBAX1ozbWluSWlFVF9TMF9TMF8oaTMyCitpbnQgYyA9IG1pbigxLCAyKTsKKworLy8gQ0hFQ0s6IGF0dHJpYnV0ZXMgI1tbQUxXQVlTX0lOTElORV1dID0ge3suKn19IGFsd2F5c2lubGluZQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL2N4eC10ZW1wbGF0ZXMuY3BwIGIvdGVzdC9Nb2R1bGVzL2N4eC10ZW1wbGF0ZXMuY3BwCmluZGV4IDY1ZjQxZjYuLjI5MWZhYmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9jeHgtdGVtcGxhdGVzLmNwcAorKysgYi90ZXN0L01vZHVsZXMvY3h4LXRlbXBsYXRlcy5jcHAKQEAgLTEsNiArMSw3IEBACiAvLyBSVU46IHJtIC1yZiAldAogLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAteCBvYmplY3RpdmUtYysrIC1mbW9kdWxlcyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMgLXN0ZD1jKysxMSAtYXN0LWR1bXAgLWFzdC1kdW1wLWxvb2t1cHMgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stR0xPQkFMCiAvLyBSVU46IG5vdCAlY2xhbmdfY2MxIC14IG9iamVjdGl2ZS1jKysgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAlcyAtc3RkPWMrKzExIC1hc3QtZHVtcCAtYXN0LWR1bXAtbG9va3VwcyAtYXN0LWR1bXAtZmlsdGVyIE4gfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTkFNRVNQQUNFLU4KKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgLXggb2JqZWN0aXZlLWMrKyAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzICVzIC1zdGQ9YysrMTEgLWFzdC1kdW1wIHwgRmlsZUNoZWNrICVzIC0tY2hlY2stcHJlZml4PUNIRUNLLURVTVAKIC8vIFJVTjogJWNsYW5nX2NjMSAteCBvYmplY3RpdmUtYysrIC1mbW9kdWxlcyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMgLXZlcmlmeSAtc3RkPWMrKzExCiAKIEBpbXBvcnQgY3h4X3RlbXBsYXRlc19hOwpAQCAtMTE2LDEwICsxMTcsMzcgQEAKICAgYyA9IGQ7CiB9CiAKK2Jvb2wgdGVzdEZyaWVuZEluQ2xhc3NUZW1wbGF0ZShTdGQ6OldpdGhGcmllbmQ8aW50PiB3ZmkpIHsKKyAgcmV0dXJuIHdmaSAhPSB3Zmk7Cit9CisKK25hbWVzcGFjZSBTdGQgeworICB2b2lkIGcoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tmdW5jdGlvbnMgdGhhdCBkaWZmZXIgb25seSBpbiB0aGVpciByZXR1cm4gdHlwZSBjYW5ub3QgYmUgb3ZlcmxvYWRlZH19CisgIC8vIGV4cGVjdGVkLW5vdGVAY3h4LXRlbXBsYXRlcy1jb21tb24uaDoyMSB7e3ByZXZpb3VzfX0KK30KKworLy8gRklYTUU6IFdlIHNob3VsZCBvbmx5IGhhdmUgdHdvIGVudHJpZXMgZm9yIGVhY2ggb2YgdGhlc2UgbmFtZXMgKG9uZSBmb3IgZWFjaAorLy8gZnVuY3Rpb24gdGVtcGxhdGUpLCBidXQgd2UgZG9uJ3QgYXR0ZW1wdCB0byBkZWR1cGxpY2F0ZSBsb29rdXAgcmVzdWx0cyBmcm9tCisvLyBzaWJsaW5nIG1vZHVsZXMgeWV0LgorCiAvLyBDSEVDSy1HTE9CQUw6ICAgICAgRGVjbGFyYXRpb25OYW1lICdmJwogLy8gQ0hFQ0stR0xPQkFMLU5FWFQ6IHwtRnVuY3Rpb25UZW1wbGF0ZSB7ey4qfX0gJ2YnCisvLyBDSEVDSy1HTE9CQUwtTkVYVDogfC1GdW5jdGlvblRlbXBsYXRlIHt7Lip9fSAnZicKKy8vIENIRUNLLUdMT0JBTC1ORVhUOiB8LUZ1bmN0aW9uVGVtcGxhdGUge3suKn19ICdmJwogLy8gQ0hFQ0stR0xPQkFMLU5FWFQ6IGAtRnVuY3Rpb25UZW1wbGF0ZSB7ey4qfX0gJ2YnCiAKIC8vIENIRUNLLU5BTUVTUEFDRS1OOiAgICAgIERlY2xhcmF0aW9uTmFtZSAnZicKIC8vIENIRUNLLU5BTUVTUEFDRS1OLU5FWFQ6IHwtRnVuY3Rpb25UZW1wbGF0ZSB7ey4qfX0gJ2YnCisvLyBDSEVDSy1OQU1FU1BBQ0UtTi1ORVhUOiB8LUZ1bmN0aW9uVGVtcGxhdGUge3suKn19ICdmJworLy8gQ0hFQ0stTkFNRVNQQUNFLU4tTkVYVDogfC1GdW5jdGlvblRlbXBsYXRlIHt7Lip9fSAnZicKIC8vIENIRUNLLU5BTUVTUEFDRS1OLU5FWFQ6IGAtRnVuY3Rpb25UZW1wbGF0ZSB7ey4qfX0gJ2YnCisKKy8vIENIRUNLLURVTVA6ICAgICAgQ2xhc3NUZW1wbGF0ZURlY2wge3suKn19IDx7ey4qWy9cXF19fWN4eC10ZW1wbGF0ZXMtY29tbW9uLmg6MToxLCB7ey4qfX0+ICBjb2w6e3suKn19IGluIGN4eF90ZW1wbGF0ZXNfY29tbW9uIFNvbWVUZW1wbGF0ZQorLy8gQ0hFQ0stRFVNUDogICAgICAgIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wge3suKn19IHByZXYgW1tDSEFSMjpbXiBdKl1dIHt7Lip9fSBTb21lVGVtcGxhdGUKKy8vIENIRUNLLURVTVAtTkVYVDogICAgIFRlbXBsYXRlQXJndW1lbnQgdHlwZSAnY2hhciBbMl0nCisvLyBDSEVDSy1EVU1QOiAgICAgICAgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCBbW0NIQVIyXV0ge3suKn19IFNvbWVUZW1wbGF0ZSBkZWZpbml0aW9uCisvLyBDSEVDSy1EVU1QLU5FWFQ6ICAgICBUZW1wbGF0ZUFyZ3VtZW50IHR5cGUgJ2NoYXIgWzJdJworLy8gQ0hFQ0stRFVNUDogICAgICAgIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wge3suKn19IHByZXYgW1tDSEFSMTpbXiBdKl1dIHt7Lip9fSBTb21lVGVtcGxhdGUKKy8vIENIRUNLLURVTVAtTkVYVDogICAgIFRlbXBsYXRlQXJndW1lbnQgdHlwZSAnY2hhciBbMV0nCisvLyBDSEVDSy1EVU1QOiAgICAgICAgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCBbW0NIQVIxXV0ge3suKn19IFNvbWVUZW1wbGF0ZSBkZWZpbml0aW9uCisvLyBDSEVDSy1EVU1QLU5FWFQ6ICAgICBUZW1wbGF0ZUFyZ3VtZW50IHR5cGUgJ2NoYXIgWzFdJwpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL2RlY2xhcmUtdXNlLlMgYi90ZXN0L01vZHVsZXMvZGVjbGFyZS11c2UuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzVkOGFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL2RlY2xhcmUtdXNlLlMKQEAgLTAsMCArMSw1IEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiAlY2xhbmcgLWZtb2R1bGUtbWFwcyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZXMtZGVjbHVzZSAtZm1vZHVsZS1uYW1lPVhTIC1JICVTL0lucHV0cy9kZWNsYXJlLXVzZSAtUyAlcyAtWGNsYW5nIC12ZXJpZnkKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisKKyNpbmNsdWRlICJzLmgiCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvZGVjbGFyZS11c2UxLmNwcCBiL3Rlc3QvTW9kdWxlcy9kZWNsYXJlLXVzZTEuY3BwCmluZGV4IDQ1MDgwMTcuLjVmYzQzMzYgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9kZWNsYXJlLXVzZTEuY3BwCisrKyBiL3Rlc3QvTW9kdWxlcy9kZWNsYXJlLXVzZTEuY3BwCkBAIC0xLDcgKzEsOCBAQAogLy8gUlVOOiBybSAtcmYgJXQKLS8vIFJVTjogJWNsYW5nX2NjMSAteCBvYmplY3RpdmUtYysrIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1mbW9kdWxlcyAtZm1vZHVsZXMtZGVjbHVzZSAtZm1vZHVsZS1uYW1lPVhHIC1JICVTL0lucHV0cy9kZWNsYXJlLXVzZSAlcyAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGUtbWFwcyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZXMtZGVjbHVzZSAtZm1vZHVsZS1uYW1lPVhHIC1JICVTL0lucHV0cy9kZWNsYXJlLXVzZSAlcyAtdmVyaWZ5CiAKICNpbmNsdWRlICJnLmgiCiAjaW5jbHVkZSAiZS5oIgotI2luY2x1ZGUgImYuaCIgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2Ugb2YgYSBtb2R1bGUgbm90IGRlY2xhcmVkIHVzZWR9fQotY29uc3QgaW50IGcyID0gZzErZStmOworI2luY2x1ZGUgImYuaCIgLy8gZXhwZWN0ZWQtZXJyb3Ige3ttb2R1bGUgWEcgZG9lcyBub3QgZGVwZW5kIG9uIGEgbW9kdWxlIGV4cG9ydGluZyAnZi5oJ319CisjaW5jbHVkZSAiaS5oIgorY29uc3QgaW50IGcyID0gZzEgKyBlICsgZiArIGF1eF9pOwpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL2RlY2xhcmUtdXNlMi5jcHAgYi90ZXN0L01vZHVsZXMvZGVjbGFyZS11c2UyLmNwcAppbmRleCBhMmVjNTVlLi40NTM1Mjg5IDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvZGVjbGFyZS11c2UyLmNwcAorKysgYi90ZXN0L01vZHVsZXMvZGVjbGFyZS11c2UyLmNwcApAQCAtMSw3ICsxLDcgQEAKIC8vIFJVTjogcm0gLXJmICV0Ci0vLyBSVU46ICVjbGFuZ19jYzEgLXggb2JqZWN0aXZlLWMrKyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZXMgLWZtb2R1bGVzLWRlY2x1c2UgLWZtb2R1bGUtbmFtZT1YSCAtSSAlUy9JbnB1dHMvZGVjbGFyZS11c2UgJXMgLXZlcmlmeQorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlLW1hcHMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWZtb2R1bGVzLWRlY2x1c2UgLWZtb2R1bGUtbmFtZT1YSCAtSSAlUy9JbnB1dHMvZGVjbGFyZS11c2UgJXMgLXZlcmlmeQogCiAjaW5jbHVkZSAiaC5oIgogI2luY2x1ZGUgImUuaCIKLSNpbmNsdWRlICJmLmgiIC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlIG9mIGEgbW9kdWxlIG5vdCBkZWNsYXJlZCB1c2VkfX0KKyNpbmNsdWRlICJmLmgiIC8vIGV4cGVjdGVkLWVycm9yIHt7bW9kdWxlIFhIIGRvZXMgbm90IGRlcGVuZCBvbiBhIG1vZHVsZSBleHBvcnRpbmcgJ2YuaCd9fQogY29uc3QgaW50IGgyID0gaDErZStmOwpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL2RlY2xhcmUtdXNlMy5jcHAgYi90ZXN0L01vZHVsZXMvZGVjbGFyZS11c2UzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjBiYmZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL2RlY2xhcmUtdXNlMy5jcHAKQEAgLTAsMCArMSw0IEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC1pbmNsdWRlICJnLmgiIC1pbmNsdWRlICJlLmgiIC1pbmNsdWRlICJmLmgiIC1pbmNsdWRlICJpLmgiIC1mbW9kdWxlLW1hcHMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWZtb2R1bGVzLWRlY2x1c2UgLWZtb2R1bGUtbmFtZT1YRyAtSSAlUy9JbnB1dHMvZGVjbGFyZS11c2UgJXMgLXZlcmlmeQorLy8gZXhwZWN0ZWQtZXJyb3Ige3ttb2R1bGUgWEcgZG9lcyBub3QgZGVwZW5kIG9uIGEgbW9kdWxlIGV4cG9ydGluZyAnZi5oJ319Citjb25zdCBpbnQgZzIgPSBnMSArIGUgKyBmICsgYXV4X2k7CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvZGVjbGFyZS11c2U0LmNwcCBiL3Rlc3QvTW9kdWxlcy9kZWNsYXJlLXVzZTQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzQ2NDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvZGVjbGFyZS11c2U0LmNwcApAQCAtMCwwICsxLDEwIEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlLW1hcHMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWZtb2R1bGVzLWRlY2x1c2UgLWZtb2R1bGUtbmFtZT1YRyAtSSAlUy9JbnB1dHMvZGVjbGFyZS11c2UgJXMgLXZlcmlmeQorCisjZGVmaW5lIEFMTE9XRURfSU5DICJiLmgiCisKKyNpbmNsdWRlICJqLmgiCisKK2NvbnN0IGludCBnMiA9IGo7CisKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvZGVwZW5kZW5jeS1nZW4taW5mZXJyZWQtbWFwLm0gYi90ZXN0L01vZHVsZXMvZGVwZW5kZW5jeS1nZW4taW5mZXJyZWQtbWFwLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjYzg3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9kZXBlbmRlbmN5LWdlbi1pbmZlcnJlZC1tYXAubQpAQCAtMCwwICsxLDggQEAKKy8vIFRlc3QgdGhhdCB0aGUgdmlydHVhbCBmaWxlICJfX2luZmVycmVkX21vZHVsZS5tYXAiIGRvZXNuJ3Qgc2hvdyB1cCBhcyBkZXBlbmRlbmN5LgorCisvLyBSVU46IHJtIC1yZiAldC1tY3AKKy8vIFJVTjogJWNsYW5nX2NjMSAtaXN5c3Jvb3QgJVMvSW5wdXRzL1N5c3RlbSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZGVwZW5kZW5jeS1maWxlICV0LmQgLU1UICVzLm8gLUYgJVMvSW5wdXRzIC1mc3ludGF4LW9ubHkgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0LW1jcCAlcworLy8gUlVOOiBGaWxlQ2hlY2sgJXMgPCAldC5kCisvLyBDSEVDSy1OT1Q6IF9faW5mZXJyZWRfbW9kdWxlCisKK0BpbXBvcnQgTW9kdWxlOwpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL2RlcGVuZGVuY3ktZ2VuLXBjaC5tIGIvdGVzdC9Nb2R1bGVzL2RlcGVuZGVuY3ktZ2VuLXBjaC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzc1NTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvZGVwZW5kZW5jeS1nZW4tcGNoLm0KQEAgLTAsMCArMSwxMiBAQAorLy8gUlVOOiBybSAtcmYgJXQtbWNwCisvLyBSVU46IG1rZGlyIC1wICV0LW1jcAorCisvLyBSVU46ICVjbGFuZ19jYzEgLWlzeXNyb290ICVTL0lucHV0cy9TeXN0ZW0gLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLW1vZHVsZS1maWxlLWRlcHMgLWRlcGVuZGVuY3ktZmlsZSAldC5kIC1NVCAlcy5vIC1JICVTL0lucHV0cyAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQtbWNwIC1lbWl0LXBjaCAtbyAldC5wY2ggJXMKKy8vIFJVTjogRmlsZUNoZWNrICVzIDwgJXQuZAorLy8gQ0hFQ0s6IGRlcGVuZGVuY3ktZ2VuLXBjaC5tLm8KKy8vIENIRUNLLU5FWFQ6IGRlcGVuZGVuY3ktZ2VuLXBjaC5tCisvLyBDSEVDSy1ORVhUOiBkaWFtb25kX3RvcC5wY20KKy8vIENIRUNLLU5FWFQ6IElucHV0c3t7Ln19ZGlhbW9uZF90b3AuaAorLy8gQ0hFQ0stTkVYVDogSW5wdXRze3sufX1tb2R1bGUubWFwCisKKyNpbXBvcnQgImRpYW1vbmRfdG9wLmgiCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvZGVwZW5kZW5jeS1nZW4ubSBiL3Rlc3QvTW9kdWxlcy9kZXBlbmRlbmN5LWdlbi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYzgzODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvZGVwZW5kZW5jeS1nZW4ubQpAQCAtMCwwICsxLDIyIEBACisvLyBSVU46IHJtIC1yZiAldC1tY3AKKy8vIFJVTjogbWtkaXIgLXAgJXQtbWNwCisKKy8vIFJVTjogJWNsYW5nX2NjMSAteCBvYmplY3RpdmUtYyAtaXN5c3Jvb3QgJVMvSW5wdXRzL1N5c3RlbSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZGVwZW5kZW5jeS1maWxlICV0LmQuMSAtTVQgJXMubyAtSSAlUy9JbnB1dHMgLWZzeW50YXgtb25seSAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQtbWNwICVzCisvLyBSVU46IEZpbGVDaGVjayAlcyA8ICV0LmQuMQorLy8gQ0hFQ0s6IGRlcGVuZGVuY3ktZ2VuLm0KKy8vIENIRUNLOiBJbnB1dHN7ey59fWRpYW1vbmRfdG9wLmgKKy8vIENIRUNLOiBJbnB1dHN7ey59fW1vZHVsZS5tYXAKKy8vIENIRUNLLU5PVDogdXNye3sufX1pbmNsdWRle3sufX1tb2R1bGUubWFwCisvLyBDSEVDSy1OT1Q6IHN0ZGludC5oCisKKworLy8gUlVOOiAlY2xhbmdfY2MxIC14IG9iamVjdGl2ZS1jIC1pc3lzcm9vdCAlUy9JbnB1dHMvU3lzdGVtIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1kZXBlbmRlbmN5LWZpbGUgJXQuZC4yIC1NVCAlcy5vIC1JICVTL0lucHV0cyAtc3lzLWhlYWRlci1kZXBzIC1mc3ludGF4LW9ubHkgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0LW1jcCAlcworLy8gUlVOOiBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1DSEVDSy1TWVMgPCAldC5kLjIKKy8vIENIRUNLLVNZUzogZGVwZW5kZW5jeS1nZW4ubQorLy8gQ0hFQ0stU1lTOiBJbnB1dHN7ey59fWRpYW1vbmRfdG9wLmgKKy8vIENIRUNLLVNZUzogSW5wdXRze3sufX1tb2R1bGUubWFwCisvLyBDSEVDSy1TWVM6IHVzcnt7Ln19aW5jbHVkZXt7Ln19bW9kdWxlLm1hcAorLy8gQ0hFQ0stU1lTOiBzdGRpbnQuaAorCisjaW1wb3J0ICJkaWFtb25kX3RvcC5oIgorI2ltcG9ydCAic3RkaW50LmgiIC8vIGluc2lkZSBzeXNyb290CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvZGlhZy1wcmFnbWEuYyBiL3Rlc3QvTW9kdWxlcy9kaWFnLXByYWdtYS5jCmluZGV4IDdlYzM0MDAuLjg5NDM1YzEgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9kaWFnLXByYWdtYS5jCisrKyBiL3Rlc3QvTW9kdWxlcy9kaWFnLXByYWdtYS5jCkBAIC0xLDYgKzEsNiBAQAogLy8gUlVOOiBybSAtcmYgJXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWVtaXQtbW9kdWxlIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1mbW9kdWxlLW5hbWU9ZGlhZ19wcmFnbWEgJVMvSW5wdXRzL21vZHVsZS5tYXAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLXZlcmlmeSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtdmVyaWZ5IC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAlcwogLy8gRklYTUU6IFdoZW4gd2UgaGF2ZSBhIHN5bnRheCBmb3IgbW9kdWxlcyBpbiBDLCB1c2UgdGhhdC4KIAogQGltcG9ydCBkaWFnX3ByYWdtYTsKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9kaWFtb25kLXBjaC5jIGIvdGVzdC9Nb2R1bGVzL2RpYW1vbmQtcGNoLmMKaW5kZXggZTdhZDAyZC4uMzdhOGNiZSAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL2RpYW1vbmQtcGNoLmMKKysrIGIvdGVzdC9Nb2R1bGVzL2RpYW1vbmQtcGNoLmMKQEAgLTMsNyArMyw3IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC1lbWl0LW1vZHVsZSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZS1uYW1lPWRpYW1vbmRfbGVmdCAlUy9JbnB1dHMvbW9kdWxlLm1hcAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZW1pdC1tb2R1bGUgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWZtb2R1bGUtbmFtZT1kaWFtb25kX3JpZ2h0ICVTL0lucHV0cy9tb2R1bGUubWFwCiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC1lbWl0LW1vZHVsZSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZS1uYW1lPWRpYW1vbmRfYm90dG9tICVTL0lucHV0cy9tb2R1bGUubWFwCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC1lbWl0LXBjaCAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtbyAldC5wY2ggJVMvSW5wdXRzL2RpYW1vbmQuaAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZW1pdC1wY2ggLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzIC1vICV0LnBjaCAlUy9JbnB1dHMvZGlhbW9uZC5oCiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1pbmNsdWRlLXBjaCAldC5wY2ggJXMgLXZlcmlmeQogLy8gRklYTUU6IFdoZW4gd2UgaGF2ZSBhIHN5bnRheCBmb3IgbW9kdWxlcyBpbiBDLCB1c2UgdGhhdC4KIApkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL2RpYW1vbmQuYyBiL3Rlc3QvTW9kdWxlcy9kaWFtb25kLmMKaW5kZXggODlkNWJjMC4uOGI4MjQwOCAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL2RpYW1vbmQuYworKysgYi90ZXN0L01vZHVsZXMvZGlhbW9uZC5jCkBAIC0zLDcgKzMsNyBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZW1pdC1tb2R1bGUgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWZtb2R1bGUtbmFtZT1kaWFtb25kX2xlZnQgJVMvSW5wdXRzL21vZHVsZS5tYXAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWVtaXQtbW9kdWxlIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1mbW9kdWxlLW5hbWU9ZGlhbW9uZF9yaWdodCAlUy9JbnB1dHMvbW9kdWxlLm1hcAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZW1pdC1tb2R1bGUgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWZtb2R1bGUtbmFtZT1kaWFtb25kX2JvdHRvbSAlUy9JbnB1dHMvbW9kdWxlLm1hcAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAlcyAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAlcyAtdmVyaWZ5CiAvLyBGSVhNRTogV2hlbiB3ZSBoYXZlIGEgc3ludGF4IGZvciBtb2R1bGVzIGluIEMsIHVzZSB0aGF0LgogCiBAaW1wb3J0IGRpYW1vbmRfYm90dG9tOwpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL2V4dGVybl9jLmNwcCBiL3Rlc3QvTW9kdWxlcy9leHRlcm5fYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0NjZmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9leHRlcm5fYy5jcHAKQEAgLTAsMCArMSw4MSBAQAorLy8gUlVOOiBybSAtcmYgJXQKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXZlcmlmeSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXZlcmlmeSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMgLURFWFRFUk5fQworLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAtdmVyaWZ5IC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAlcyAtREVYVEVSTl9DWFgKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXZlcmlmeSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMgLURFWFRFUk5fQyAtREVYVEVSTl9DWFgKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXZlcmlmeSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMgLURFWFRFUk5fQyAtRE5BTUVTUEFDRQorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAtdmVyaWZ5IC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAlcyAtRENYWF9IRUFERVIKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXZlcmlmeSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMgLURDWFhfSEVBREVSIC1ERVhURVJOX0MKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXZlcmlmeSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMgLURDWFhfSEVBREVSIC1ERVhURVJOX0NYWAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAtdmVyaWZ5IC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAlcyAtRENYWF9IRUFERVIgLURFWFRFUk5fQyAtREVYVEVSTl9DWFgKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXZlcmlmeSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMgLURDWFhfSEVBREVSIC1ERVhURVJOX0MgLUROQU1FU1BBQ0UKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXZlcmlmeSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgLXggYyAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAtdmVyaWZ5IC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cy9lbHNld2hlcmUgLUkgJVMvSW5wdXRzICVzIC1ERVhURVJOX0MgLURJTkRJUkVDVAorCisjaWZkZWYgSU5ESVJFQ1QKKyNpbmNsdWRlICJjLWhlYWRlci1pbmRpcmVjdC5oIgorI2VuZGlmCisKKyNpZmRlZiBOQU1FU1BBQ0UKK25hbWVzcGFjZSBNIHsKKyNlbmRpZgorCisjaWZkZWYgRVhURVJOX0MKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBFWFRFUk5fQ1hYCitleHRlcm4gIkMrKyIgeworI2VuZGlmCisKKyNpZmRlZiBDWFhfSEVBREVSCisjZGVmaW5lIEhFQURFUiAiY3h4LWhlYWRlci5oIgorI2Vsc2UKKyNkZWZpbmUgSEVBREVSICJjLWhlYWRlci5oIgorI2VuZGlmCisKKyNpbmNsdWRlIEhFQURFUgorCisjaWYgZGVmaW5lZChFWFRFUk5fQykgJiYgIWRlZmluZWQoRVhURVJOX0NYWCkgJiYgZGVmaW5lZChDWFhfSEVBREVSKQorLy8gZXhwZWN0ZWQtZXJyb3JALTMge3tpbXBvcnQgb2YgQysrIG1vZHVsZSAnY3h4X2xpYnJhcnknIGFwcGVhcnMgd2l0aGluIGV4dGVybiAiQyIgbGFuZ3VhZ2UgbGlua2FnZSBzcGVjaWZpY2F0aW9ufX0KKy8vIGV4cGVjdGVkLW5vdGVALTE3IHt7ZXh0ZXJuICJDIiBsYW5ndWFnZSBsaW5rYWdlIHNwZWNpZmljYXRpb24gYmVnaW5zIGhlcmV9fQorI2VsaWYgZGVmaW5lZChOQU1FU1BBQ0UpCisvLyBleHBlY3RlZC1lcnJvci1yZUAtNiB7e2ltcG9ydCBvZiBtb2R1bGUgJ3t7Y19saWJyYXJ5LmlubmVyfGN4eF9saWJyYXJ5fX0nIGFwcGVhcnMgd2l0aGluIG5hbWVzcGFjZSAnTSd9fQorLy8gZXhwZWN0ZWQtbm90ZUAtMjQge3tuYW1lc3BhY2UgJ00nIGJlZ2lucyBoZXJlfX0KKyNlbmRpZgorCisjaWZkZWYgRVhURVJOX0NYWAorfQorI2VuZGlmCisKKyNpZmRlZiBFWFRFUk5fQworfQorI2VuZGlmCisKKyNpZmRlZiBOQU1FU1BBQ0UKK30KK3VzaW5nIG5hbWVzcGFjZSBNOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworbmFtZXNwYWNlIE4geworI2VuZGlmCisgIHZvaWQgZygpIHsKKyAgICBpbnQgayA9IGYoKTsKKyAgfQorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKyAgICBpbnQgZjsKKyNpZiAhZGVmaW5lZChDWFhfSEVBREVSKQorICAgIC8vIGV4cGVjdGVkLWVycm9yQC0yIHt7cmVkZWZpbml0aW9uIG9mICdmJyBhcyBkaWZmZXJlbnQga2luZCBvZiBzeW1ib2x9fQorICAgIC8vIGV4cGVjdGVkLW5vdGVAYy1oZWFkZXIuaDoxIHt7cHJldmlvdXN9fQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICB9Cit9CisjZW5kaWYKKworc3VwcHJlc3NfZXhwZWN0ZWRfbm9fZGlhZ25vc3RpY3NfZXJyb3IgZXJyb3JfaGVyZTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t9fQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL2V4dGVybl9jX2JhZC5jcHAgYi90ZXN0L01vZHVsZXMvZXh0ZXJuX2NfYmFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWZkYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL2V4dGVybl9jX2JhZC5jcHAKQEAgLTAsMCArMSwyIEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZtb2R1bGVzIC14IGMrKyAtZW1pdC1tb2R1bGUgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWZtb2R1bGUtbmFtZT1jX2xpYnJhcnlfYmFkICVTL0lucHV0cy9tb2R1bGUubWFwCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvZmF0YWwtbW9kdWxlLWxvYWRlci1lcnJvci5tIGIvdGVzdC9Nb2R1bGVzL2ZhdGFsLW1vZHVsZS1sb2FkZXItZXJyb3IubQppbmRleCA2YWYzYjRjLi4yZDhkZDI0IDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvZmF0YWwtbW9kdWxlLWxvYWRlci1lcnJvci5tCisrKyBiL3Rlc3QvTW9kdWxlcy9mYXRhbC1tb2R1bGUtbG9hZGVyLWVycm9yLm0KQEAgLTIzLDQgKzIzLDQgQEAKIC8vIEFsc28gY2hlY2sgdGhhdCBsaWJjbGFuZyBkb2VzIG5vdCBjcmVhdGUgYSBQQ0ggd2l0aCBzdWNoIGFuIGVycm9yLgogLy8gUlVOOiBub3QgYy1pbmRleC10ZXN0IC13cml0ZS1wY2ggJXQucGNoIC1mbW9kdWxlcyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCBcCiAvLyBSVU46ICVzIC1YY2xhbmcgLWZkaXNhYmxlLW1vZHVsZS1oYXNoIC1GICVTL0lucHV0cyAyPiYxIHwgRmlsZUNoZWNrICVzCi0vLyBDSEVDSzogVW5hYmxlIHRvIHdyaXRlIFBDSCBmaWxlCisvLyBDSEVDSzoge3tefX1GYWlsdXJlOiBBU1QgZGVzZXJpYWxpemF0aW9uIGVycm9yIG9jY3VycmVke3skfX0KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9mbW9kdWxlcy12YWxpZGF0ZS1vbmNlLXBlci1idWlsZC1zZXNzaW9uLmMgYi90ZXN0L01vZHVsZXMvZm1vZHVsZXMtdmFsaWRhdGUtb25jZS1wZXItYnVpbGQtc2Vzc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NmQ1YTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvZm1vZHVsZXMtdmFsaWRhdGUtb25jZS1wZXItYnVpbGQtc2Vzc2lvbi5jCkBAIC0wLDAgKzEsNDUgQEAKKyNpbmNsdWRlICJmb28uaCIKKworLy8gQ2xlYXIgdGhlIG1vZHVsZSBjYWNoZS4KKy8vIFJVTjogcm0gLXJmICV0CisvLyBSVU46IG1rZGlyIC1wICV0L0lucHV0cworLy8gUlVOOiBta2RpciAtcCAldC9tb2R1bGVzLXRvLWNvbXBhcmUKKworLy8gPT09CisvLyBDcmVhdGUgYSBtb2R1bGUgd2l0aCBzeXN0ZW0gaGVhZGVycy4KKy8vIFJVTjogZWNobyAndm9pZCBtZW93KHZvaWQpOycgPiAldC9JbnB1dHMvZm9vLmgKKy8vIFJVTjogZWNobyAnbW9kdWxlIEZvbyBbc3lzdGVtXSB7IGhlYWRlciAiZm9vLmgiIH0nID4gJXQvSW5wdXRzL21vZHVsZS5tYXAKKworLy8gPT09CisvLyBDb21waWxlIHRoZSBtb2R1bGUuCisvLyBSVU46ICVjbGFuZ19jYzEgLWNjMSAtZm1vZHVsZXMgLWZkaXNhYmxlLW1vZHVsZS1oYXNoIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0L21vZHVsZXMtY2FjaGUgLWZzeW50YXgtb25seSAtSSAldC9JbnB1dHMgLWZidWlsZC1zZXNzaW9uLXRpbWVzdGFtcD0xMzkwMDAwMDAwIC1mbW9kdWxlcy12YWxpZGF0ZS1vbmNlLXBlci1idWlsZC1zZXNzaW9uICVzCisvLyBSVU46IGxzIC1SICV0L21vZHVsZXMtY2FjaGUgfCBncmVwIEZvby5wY20udGltZXN0YW1wCisvLyBSVU46IGNwICV0L21vZHVsZXMtY2FjaGUvRm9vLnBjbSAldC9tb2R1bGVzLXRvLWNvbXBhcmUvRm9vLWJlZm9yZS5wY20KKworLy8gPT09CisvLyBVc2UgaXQsIGFuZCBtYWtlIHN1cmUgdGhhdCB3ZSBkaWQgbm90IHJlY29tcGlsZSBpdC4KKy8vIFJVTjogJWNsYW5nX2NjMSAtY2MxIC1mbW9kdWxlcyAtZmRpc2FibGUtbW9kdWxlLWhhc2ggLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQvbW9kdWxlcy1jYWNoZSAtZnN5bnRheC1vbmx5IC1JICV0L0lucHV0cyAtZmJ1aWxkLXNlc3Npb24tdGltZXN0YW1wPTEzOTAwMDAwMDAgLWZtb2R1bGVzLXZhbGlkYXRlLW9uY2UtcGVyLWJ1aWxkLXNlc3Npb24gJXMKKy8vIFJVTjogbHMgLVIgJXQvbW9kdWxlcy1jYWNoZSB8IGdyZXAgRm9vLnBjbS50aW1lc3RhbXAKKy8vIFJVTjogY3AgJXQvbW9kdWxlcy1jYWNoZS9Gb28ucGNtICV0L21vZHVsZXMtdG8tY29tcGFyZS9Gb28tYWZ0ZXIucGNtCisKKy8vIFJVTjogZGlmZiAldC9tb2R1bGVzLXRvLWNvbXBhcmUvRm9vLWJlZm9yZS5wY20gJXQvbW9kdWxlcy10by1jb21wYXJlL0Zvby1hZnRlci5wY20KKworLy8gPT09CisvLyBDaGFuZ2UgdGhlIHNvdXJjZXMuCisvLyBSVU46IGVjaG8gJ3ZvaWQgbWVvdzIodm9pZCk7JyA+ICV0L0lucHV0cy9mb28uaAorCisvLyA9PT0KKy8vIFVzZSB0aGUgbW9kdWxlLCBhbmQgbWFrZSBzdXJlIHRoYXQgd2UgZGlkIG5vdCByZWNvbXBpbGUgaXQsIGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2VzIGNoYW5nZWQuCisvLyBSVU46ICVjbGFuZ19jYzEgLWNjMSAtZm1vZHVsZXMgLWZkaXNhYmxlLW1vZHVsZS1oYXNoIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0L21vZHVsZXMtY2FjaGUgLWZzeW50YXgtb25seSAtSSAldC9JbnB1dHMgLWZidWlsZC1zZXNzaW9uLXRpbWVzdGFtcD0xMzkwMDAwMDAwIC1mbW9kdWxlcy12YWxpZGF0ZS1vbmNlLXBlci1idWlsZC1zZXNzaW9uICVzCisvLyBSVU46IGxzIC1SICV0L21vZHVsZXMtY2FjaGUgfCBncmVwIEZvby5wY20udGltZXN0YW1wCisvLyBSVU46IGNwICV0L21vZHVsZXMtY2FjaGUvRm9vLnBjbSAldC9tb2R1bGVzLXRvLWNvbXBhcmUvRm9vLWFmdGVyLnBjbQorCisvLyBSVU46IGRpZmYgJXQvbW9kdWxlcy10by1jb21wYXJlL0Zvby1iZWZvcmUucGNtICV0L21vZHVsZXMtdG8tY29tcGFyZS9Gb28tYWZ0ZXIucGNtCisKKy8vID09PQorLy8gUmVjb21waWxlIHRoZSBtb2R1bGUgaWYgdGhlIHRvZGF5J3MgZGF0ZSBpcyBiZWZvcmUgMDEgSmFudWFyeSAyMDMwLgorLy8gUlVOOiAlY2xhbmdfY2MxIC1jYzEgLWZtb2R1bGVzIC1mZGlzYWJsZS1tb2R1bGUtaGFzaCAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldC9tb2R1bGVzLWNhY2hlIC1mc3ludGF4LW9ubHkgLUkgJXQvSW5wdXRzIC1mYnVpbGQtc2Vzc2lvbi10aW1lc3RhbXA9MTg5MzQ1NjAwMCAtZm1vZHVsZXMtdmFsaWRhdGUtb25jZS1wZXItYnVpbGQtc2Vzc2lvbiAlcworLy8gUlVOOiBscyAtUiAldC9tb2R1bGVzLWNhY2hlIHwgZ3JlcCBGb28ucGNtLnRpbWVzdGFtcAorLy8gUlVOOiBjcCAldC9tb2R1bGVzLWNhY2hlL0Zvby5wY20gJXQvbW9kdWxlcy10by1jb21wYXJlL0Zvby1hZnRlci5wY20KKworLy8gUlVOOiBub3QgZGlmZiAldC9tb2R1bGVzLXRvLWNvbXBhcmUvRm9vLWJlZm9yZS5wY20gJXQvbW9kdWxlcy10by1jb21wYXJlL0Zvby1hZnRlci5wY20KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9pbmNsdWRlLXJlbGF0aXZlLmMgYi90ZXN0L01vZHVsZXMvaW5jbHVkZS1yZWxhdGl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYTc2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvaW5jbHVkZS1yZWxhdGl2ZS5jCkBAIC0wLDAgKzEsMTIgQEAKKy8vIFJVTjogcm0gLXJmICV0CisvLyBSVU46IG1rZGlyICV0CisvLyBSVU46IGNwIC1yICVTL0lucHV0cy9pbmNsdWRlLXJlbGF0aXZlICV0L2luY2x1ZGUtcmVsYXRpdmUKKy8vIFJVTjogY2QgJXQKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggYyAtdmVyaWZ5IC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JIGluY2x1ZGUtcmVsYXRpdmUgJXMKKy8vIFJFUVVJUkVTOiBzaGVsbAorCisvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcworCisjaW5jbHVkZSAiYS5oIgorCitpbnQgZigpIHsgcmV0dXJuIG47IH0KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9pcmdlbi5jIGIvdGVzdC9Nb2R1bGVzL2lyZ2VuLmMKaW5kZXggOWE3Y2Y3ZS4uYzQ0YWZiMSAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL2lyZ2VuLmMKKysrIGIvdGVzdC9Nb2R1bGVzL2lyZ2VuLmMKQEAgLTEsNiArMSw2IEBACiAvLyBSVU46IHJtIC1yZiAldAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZW1pdC1tb2R1bGUgLWZtb2R1bGUtbmFtZT1pcmdlbiAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAlUy9JbnB1dHMvbW9kdWxlLm1hcAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcwogLy8gRklYTUU6IFdoZW4gd2UgaGF2ZSBhIHN5bnRheCBmb3IgbW9kdWxlcyBpbiBDLCB1c2UgdGhhdC4KIAogQGltcG9ydCBpcmdlbjsKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9saW5rYWdlLW1lcmdlLmNwcCBiL3Rlc3QvTW9kdWxlcy9saW5rYWdlLW1lcmdlLmNwcAppbmRleCA5Y2M5YWU2Li42NjQ3MTZkIDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvbGlua2FnZS1tZXJnZS5jcHAKKysrIGIvdGVzdC9Nb2R1bGVzL2xpbmthZ2UtbWVyZ2UuY3BwCkBAIC03LDYgKzcsNSBAQAogaW50IGYoaW50KTsKIAogc3RhdGljIHZvaWQgZyhpbnQpOwotLy8gZXhwZWN0ZWQtZXJyb3JALTEge3tkZWNsYXJhdGlvbiBjb25mbGljdHMgd2l0aCB0YXJnZXQgb2YgdXNpbmcgZGVjbGFyYXRpb24gYWxyZWFkeSBpbiBzY29wZX19Ci0vLyBleHBlY3RlZC1ub3RlQElucHV0cy9saW5rYWdlLW1lcmdlLWZvby5oOjIge3t0YXJnZXQgb2YgdXNpbmcgZGVjbGFyYXRpb259fQotLy8gZXhwZWN0ZWQtbm90ZUBJbnB1dHMvbGlua2FnZS1tZXJnZS1iYXIuaDozIHt7dXNpbmcgZGVjbGFyYXRpb259fQorLy8gZXhwZWN0ZWQtZXJyb3JALTEge3tmdW5jdGlvbnMgdGhhdCBkaWZmZXIgb25seSBpbiB0aGVpciByZXR1cm4gdHlwZSBjYW5ub3QgYmUgb3ZlcmxvYWRlZH19CisvLyBleHBlY3RlZC1ub3RlQElucHV0cy9saW5rYWdlLW1lcmdlLWZvby5oOjIge3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9saW5rYWdlLW1lcmdlLm0gYi90ZXN0L01vZHVsZXMvbGlua2FnZS1tZXJnZS5tCmluZGV4IGU4MzhjYTEuLjEyYWQzMmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9saW5rYWdlLW1lcmdlLm0KKysrIGIvdGVzdC9Nb2R1bGVzL2xpbmthZ2UtbWVyZ2UubQpAQCAtMSw2ICsxLDYgQEAKIC8vIFJVTjogcm0gLXJmICV0CiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1lbWl0LW1vZHVsZSAtZm1vZHVsZS1uYW1lPWxpbmthZ2VfbWVyZ2VfbGVmdCAlUy9JbnB1dHMvbW9kdWxlLm1hcAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtdyAlcyAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAtdyAlcyAtdmVyaWZ5CiAKIC8vIFRlc3QgcmVkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zIHdoZXJlIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBpcwogLy8gc3RpbGwgaGlkZGVuLgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL2xvYWRfZmFpbHVyZS5jIGIvdGVzdC9Nb2R1bGVzL2xvYWRfZmFpbHVyZS5jCmluZGV4IDZjNmQ4MTIuLjhiMGQyMDIgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9sb2FkX2ZhaWx1cmUuYworKysgYi90ZXN0L01vZHVsZXMvbG9hZF9mYWlsdXJlLmMKQEAgLTgsMTAgKzgsMTAgQEAKIAogLy8gUlVOOiBybSAtcmYgJXQKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMrKyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZmRpc2FibGUtbW9kdWxlLWhhc2ggLWVtaXQtbW9kdWxlIC1mbW9kdWxlLW5hbWU9bG9hZF9mYWlsdXJlICVTL0lucHV0cy9tb2R1bGUubWFwCi0vLyBSVU46IG5vdCAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZmRpc2FibGUtbW9kdWxlLWhhc2ggJXMgLUROT05FWElTVEVOVCAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stTk9ORVhJU1RFTlQgJXMKKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAtZmRpc2FibGUtbW9kdWxlLWhhc2ggJXMgLUROT05FWElTVEVOVCAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stTk9ORVhJU1RFTlQgJXMKIC8vIENIRUNLLU5PTkVYSVNURU5UOiBsb2FkX2ZhaWx1cmUuYzoyOjk6IGZhdGFsIGVycm9yOiBtb2R1bGUgJ2xvYWRfbm9uZXhpc3RlbnQnIG5vdCBmb3VuZAogCi0vLyBSVU46IG5vdCAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZmRpc2FibGUtbW9kdWxlLWhhc2ggJXMgLURGQUlMVVJFIDI+ICV0Lm91dAorLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzIC1mZGlzYWJsZS1tb2R1bGUtaGFzaCAlcyAtREZBSUxVUkUgMj4gJXQub3V0CiAvLyBSVU46IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUZBSUxVUkUgJXMgPCAldC5vdXQKIAogLy8gRklYTUU6IENsZWFuIHVwIGRpYWdub3N0aWMgdGV4dCBiZWxvdyBhbmQgZ2l2ZSBpdCBhIGxvY2F0aW9uCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvbG9va3VwLmNwcCBiL3Rlc3QvTW9kdWxlcy9sb29rdXAuY3BwCmluZGV4IGVmZDg4ZjQuLmJmZTAzMDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9sb29rdXAuY3BwCisrKyBiL3Rlc3QvTW9kdWxlcy9sb29rdXAuY3BwCkBAIC0yNiw4ICsyNiw4IEBACiAvLyBSVU46IHJtIC1yZiAldAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYysrIC1lbWl0LW1vZHVsZSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZS1uYW1lPWxvb2t1cF9sZWZ0X2N4eCAlUy9JbnB1dHMvbW9kdWxlLm1hcCAtdmVyaWZ5CiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jKysgLWVtaXQtbW9kdWxlIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1mbW9kdWxlLW5hbWU9bG9va3VwX3JpZ2h0X2N4eCAlUy9JbnB1dHMvbW9kdWxlLm1hcCAtdmVyaWZ5Ci0vLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jKysgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgJXMgLXZlcmlmeQotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAtYXN0LXByaW50IC14IG9iamVjdGl2ZS1jKysgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1QUklOVCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYysrIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAlcyAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1hc3QtcHJpbnQgLXggb2JqZWN0aXZlLWMrKyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1QUklOVCAlcwogLy8gRklYTUU6IFdoZW4gd2UgaGF2ZSBhIHN5bnRheCBmb3IgbW9kdWxlcyBpbiBDKyssIHVzZSB0aGF0LgogCiAvLyBDSEVDSy1QUklOVDogaW50ICpmMChpbnQgKik7CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvbG9va3VwLm0gYi90ZXN0L01vZHVsZXMvbG9va3VwLm0KaW5kZXggNTRjNzQ5MS4uMTg3ZTg3NiAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL2xvb2t1cC5tCisrKyBiL3Rlc3QvTW9kdWxlcy9sb29rdXAubQpAQCAtMSw4ICsxLDggQEAKIC8vIFJVTjogcm0gLXJmICV0CiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1lbWl0LW1vZHVsZSAteCBvYmplY3RpdmUtYyAtZm1vZHVsZS1uYW1lPWxvb2t1cF9sZWZ0X29iamMgJVMvSW5wdXRzL21vZHVsZS5tYXAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWVtaXQtbW9kdWxlIC14IG9iamVjdGl2ZS1jIC1mbW9kdWxlLW5hbWU9bG9va3VwX3JpZ2h0X29iamMgJVMvSW5wdXRzL21vZHVsZS5tYXAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLXZlcmlmeSAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAtYXN0LXByaW50IC14IG9iamVjdGl2ZS1jIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0ICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stUFJJTlQgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLWFzdC1wcmludCAteCBvYmplY3RpdmUtYyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1QUklOVCAlcwogCiBAaW1wb3J0IGxvb2t1cF9sZWZ0X29iamM7CiBAaW1wb3J0IGxvb2t1cF9yaWdodF9vYmpjOwpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL21hY3JvLXVuZGVmLXRocm91Z2gtcGNoLm0gYi90ZXN0L01vZHVsZXMvbWFjcm8tdW5kZWYtdGhyb3VnaC1wY2gubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjA3MzZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL21hY3JvLXVuZGVmLXRocm91Z2gtcGNoLm0KQEAgLTAsMCArMSw4IEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC14IG9iamVjdGl2ZS1jLWhlYWRlciAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgXAorLy8gUlVOOiAgICAgICAgICAgIC1JJVMvSW5wdXRzL21hY3JvLXVuZGVmLXRocm91Z2gtcGNoIC1lbWl0LXBjaCBcCisvLyBSVU46ICAgICAgICAgICAgJVMvSW5wdXRzL21hY3JvLXVuZGVmLXRocm91Z2gtcGNoL2Zvby5oIC1vICV0LnBjaAorLy8gUlVOOiAlY2xhbmdfY2MxIC14IG9iamVjdGl2ZS1jIC1mbW9kdWxlcyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtaW5jbHVkZS1wY2ggJXQucGNoICVzCisKKy8vIFBSMTkyMTUKKyN1bmRlZiBBQgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL21hY3Jvcy5jIGIvdGVzdC9Nb2R1bGVzL21hY3Jvcy5jCmluZGV4IDU0MWM5NWIuLjdhN2U1NzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9tYWNyb3MuYworKysgYi90ZXN0L01vZHVsZXMvbWFjcm9zLmMKQEAgLTMsMTggKzMsMTYgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWVtaXQtbW9kdWxlIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1mbW9kdWxlLW5hbWU9bWFjcm9zX2xlZnQgJVMvSW5wdXRzL21vZHVsZS5tYXAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWVtaXQtbW9kdWxlIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1mbW9kdWxlLW5hbWU9bWFjcm9zX3JpZ2h0ICVTL0lucHV0cy9tb2R1bGUubWFwCiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC1lbWl0LW1vZHVsZSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZS1uYW1lPW1hY3JvcyAlUy9JbnB1dHMvbW9kdWxlLm1hcAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtdmVyaWZ5IC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0ICVzCi0vLyBSVU46IG5vdCAlY2xhbmdfY2MxIC1FIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAlcyB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IENIRUNLLVBSRVBST0NFU1NFRCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtdmVyaWZ5IC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAlcworLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtRSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQ0hFQ0stUFJFUFJPQ0VTU0VEICVzCiAvLyBGSVhNRTogV2hlbiB3ZSBoYXZlIGEgc3ludGF4IGZvciBtb2R1bGVzIGluIEMsIHVzZSB0aGF0LgogLy8gVGhlc2Ugbm90ZXMgY29tZSBmcm9tIGhlYWRlcnMgaW4gbW9kdWxlcywgYW5kIGFyZSBib2d1cy4KIAogLy8gRklYTUU6IGV4cGVjdGVkLW5vdGVASW5wdXRzL21hY3Jvc19sZWZ0Lmg6MTF7e3ByZXZpb3VzIGRlZmluaXRpb24gaXMgaGVyZX19CiAvLyBGSVhNRTogZXhwZWN0ZWQtbm90ZUBJbnB1dHMvbWFjcm9zX3JpZ2h0Lmg6MTJ7e3ByZXZpb3VzIGRlZmluaXRpb24gaXMgaGVyZX19CiAvLyBleHBlY3RlZC1ub3RlQElucHV0cy9tYWNyb3NfcmlnaHQuaDoxMnt7ZXhwYW5kaW5nIHRoaXMgZGVmaW5pdGlvbiBvZiAnTEVGVF9SSUdIVF9ESUZGRVJFTlQnfX0KLS8vIGV4cGVjdGVkLW5vdGVASW5wdXRzL21hY3Jvc190b3AuaDoxM3t7b3RoZXIgZGVmaW5pdGlvbiBvZiAnVE9QX1JJR0hUX1JFREVGJ319CiAvLyBleHBlY3RlZC1ub3RlQElucHV0cy9tYWNyb3NfcmlnaHQuaDoxM3t7ZXhwYW5kaW5nIHRoaXMgZGVmaW5pdGlvbiBvZiAnTEVGVF9SSUdIVF9ESUZGRVJFTlQyJ319CiAvLyBleHBlY3RlZC1ub3RlQElucHV0cy9tYWNyb3NfbGVmdC5oOjE0e3tvdGhlciBkZWZpbml0aW9uIG9mICdMRUZUX1JJR0hUX0RJRkZFUkVOVCd9fQotLy8gZXhwZWN0ZWQtbm90ZUBJbnB1dHMvbWFjcm9zX3JpZ2h0Lmg6MTd7e2V4cGFuZGluZyB0aGlzIGRlZmluaXRpb24gb2YgJ1RPUF9SSUdIVF9SRURFRid9fQogCiBAaW1wb3J0IG1hY3JvczsKIApAQCAtNzksOCArNzcsOCBAQAogIyAgZXJyb3IgVE9QIHNob3VsZCBiZSB2aXNpYmxlCiAjZW5kaWYKIAotI2lmbmRlZiBUT1BfTEVGVF9VTkRFRgotIyAgZXJyb3IgVE9QX0xFRlRfVU5ERUYgc2hvdWxkIHN0aWxsIGJlIGRlZmluZWQKKyNpZmRlZiBUT1BfTEVGVF9VTkRFRgorIyAgZXJyb3IgVE9QX0xFRlRfVU5ERUYgc2hvdWxkIG5vdCBiZSBkZWZpbmVkCiAjZW5kaWYKIAogdm9pZCB0ZXN0MSgpIHsKQEAgLTExMiw3ICsxMTAsNyBAQAogICBpbnQgaTsKICAgZmxvYXQgZjsKICAgZG91YmxlIGQ7Ci0gIFRPUF9SSUdIVF9SRURFRiAqZnAgPSAmZjsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7YW1iaWd1b3VzIGV4cGFuc2lvbiBvZiBtYWNybyAnVE9QX1JJR0hUX1JFREVGJ319CisgIFRPUF9SSUdIVF9SRURFRiAqZnAgPSAmZjsgLy8gb2ssIHJpZ2h0J3MgZGVmaW5pdGlvbiBvdmVycmlkZXMgdG9wJ3MgZGVmaW5pdGlvbgogICAKICAgTEVGVF9SSUdIVF9JREVOVElDQUwgKmlwID0gJmk7CiAgIExFRlRfUklHSFRfRElGRkVSRU5UICppcDIgPSAmaTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7YW1iaWd1b3VzIGV4cGFuc2lvbiBvZiBtYWNybyAnTEVGVF9SSUdIVF9ESUZGRVJFTlQnfX0KQEAgLTEzNCw2ICsxMzIsMzMgQEAKIAogQGltcG9ydCBtYWNyb3NfcmlnaHQudW5kZWY7CiAKLSNpZm5kZWYgVE9QX1JJR0hUX1VOREVGCi0jIGVycm9yIFRPUF9SSUdIVF9VTkRFRiBzaG91bGQgc3RpbGwgYmUgZGVmaW5lZAorLy8gRklYTUU6IFdoZW4gbWFjcm9zX3JpZ2h0LnVuZGVmIGlzIGJ1aWx0LCBtYWNyb3NfdG9wIGlzIHZpc2libGUgYmVjYXVzZQorLy8gdGhlIHN0YXRlIGZyb20gYnVpbGRpbmcgbWFjcm9zX3JpZ2h0IGxlYWtzIHRocm91Z2gsIHNvIG1hY3Jvc19yaWdodC51bmRlZgorLy8gdW5kZWZpbmVzIG1hY3Jvc190b3AncyBtYWNyby4KKyNpZmRlZiBUT1BfUklHSFRfVU5ERUYKKyMgZXJyb3IgVE9QX1JJR0hUX1VOREVGIHNob3VsZCBub3QgYmUgZGVmaW5lZAogI2VuZGlmCisKK0BpbXBvcnQgbWFjcm9zX290aGVyOworCisjaWZuZGVmIFRPUF9PVEhFUl9VTkRFRjEKKyMgZXJyb3IgVE9QX09USEVSX1VOREVGMSBzaG91bGQgc3RpbGwgYmUgZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgVE9QX09USEVSX1VOREVGMgorIyBlcnJvciBUT1BfT1RIRVJfVU5ERUYyIHNob3VsZCBzdGlsbCBiZSBkZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBUT1BfT1RIRVJfUkVERUYxCisjIGVycm9yIFRPUF9PVEhFUl9SRURFRjEgc2hvdWxkIHN0aWxsIGJlIGRlZmluZWQKKyNlbmRpZgoraW50IG4xID0gVE9QX09USEVSX1JFREVGMTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7YW1iaWd1b3VzIGV4cGFuc2lvbiBvZiBtYWNybyAnVE9QX09USEVSX1JFREVGMSd9fQorLy8gZXhwZWN0ZWQtbm90ZUBtYWNyb3NfdG9wLmg6MTkge3tleHBhbmRpbmcgdGhpcyBkZWZpbml0aW9ufX0KKy8vIGV4cGVjdGVkLW5vdGVAbWFjcm9zX290aGVyLmg6NCB7e290aGVyIGRlZmluaXRpb259fQorCisjaWZuZGVmIFRPUF9PVEhFUl9SRURFRjIKKyMgZXJyb3IgVE9QX09USEVSX1JFREVGMiBzaG91bGQgc3RpbGwgYmUgZGVmaW5lZAorI2VuZGlmCitpbnQgbjIgPSBUT1BfT1RIRVJfUkVERUYyOyAvLyBvaworCitpbnQgbjMgPSBUT1BfT1RIRVJfREVGX1JJR0hUX1VOREVGOyAvLyBvawpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL21hY3JvczIuYyBiL3Rlc3QvTW9kdWxlcy9tYWNyb3MyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjODA1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9tYWNyb3MyLmMKQEAgLTAsMCArMSw4MyBAQAorLy8gUlVOOiBybSAtcmYgJXQKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWVtaXQtbW9kdWxlIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1mbW9kdWxlLW5hbWU9bWFjcm9zX3RvcCAlUy9JbnB1dHMvbW9kdWxlLm1hcAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZW1pdC1tb2R1bGUgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWZtb2R1bGUtbmFtZT1tYWNyb3NfbGVmdCAlUy9JbnB1dHMvbW9kdWxlLm1hcAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZW1pdC1tb2R1bGUgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWZtb2R1bGUtbmFtZT1tYWNyb3NfcmlnaHQgJVMvSW5wdXRzL21vZHVsZS5tYXAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWVtaXQtbW9kdWxlIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1mbW9kdWxlLW5hbWU9bWFjcm9zICVTL0lucHV0cy9tb2R1bGUubWFwCisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC12ZXJpZnkgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzICVzCisKKy8vIFRoaXMgdGVzdCBjaGVja3Mgc29tZSBvZiB0aGUgc2FtZSB0aGluZ3MgYXMgbWFjcm9zLmMsIGJ1dCBpbXBvcnRzIG1vZHVsZXMgaW4KKy8vIGEgZGlmZmVyZW50IG9yZGVyLgorCitAaW1wb3J0IG1hY3Jvc19vdGhlcjsKKworaW50IG4wID0gVE9QX09USEVSX0RFRl9SSUdIVF9VTkRFRjsgLy8gb2sKKworQGltcG9ydCBtYWNyb3NfdG9wOworCitUT1BfT1RIRVJfREVGX1JJR0hUX1VOREVGICpuMGI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2FtYmlndW91cyBleHBhbnNpb24gb2YgbWFjcm8gJ1RPUF9PVEhFUl9ERUZfUklHSFRfVU5ERUYnfX0KKy8vIGV4cGVjdGVkLW5vdGVAbWFjcm9zX3RvcC5oOjIyIHt7ZXhwYW5kaW5nIHRoaXMgZGVmaW5pdGlvbiBvZiAnVE9QX09USEVSX0RFRl9SSUdIVF9VTkRFRid9fQorLy8gZXhwZWN0ZWQtbm90ZUBtYWNyb3Nfb3RoZXIuaDo2IHt7b3RoZXIgZGVmaW5pdGlvbiBvZiAnVE9QX09USEVSX0RFRl9SSUdIVF9VTkRFRid9fQorCitAaW1wb3J0IG1hY3Jvc19yaWdodDsKK0BpbXBvcnQgbWFjcm9zX2xlZnQ7CisKKyNpZmRlZiBUT1BfTEVGVF9VTkRFRgorIyAgZXJyb3IgVE9QX0xFRlRfVU5ERUYgc2hvdWxkIG5vdCBiZSBkZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBUT1BfUklHSFRfVU5ERUYKKyMgIGVycm9yIFRPUF9SSUdIVF9VTkRFRiBzaG91bGQgc3RpbGwgYmUgZGVmaW5lZAorI2VuZGlmCisKK3ZvaWQgdGVzdCgpIHsKKyAgZmxvYXQgZjsKKyAgVE9QX1JJR0hUX1JFREVGICpmcCA9ICZmOyAvLyBvaywgcmlnaHQncyBkZWZpbml0aW9uIG92ZXJyaWRlcyB0b3AncyBkZWZpbml0aW9uCisKKyAgLy8gTm90ZSwgbGVmdCdzIGRlZmluaXRpb24gd2lucyBoZXJlLCB3aGVyZWFzIHJpZ2h0J3MgZGVmaW5pdGlvbiB3aW5zIGluCisgIC8vIG1hY3Jvcy5jLgorICBpbnQgaTsKKyAgTEVGVF9SSUdIVF9JREVOVElDQUwgKmlwID0gJmk7CisgIExFRlRfUklHSFRfRElGRkVSRU5UICppcDIgPSAmZjsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7YW1iaWd1b3VzIGV4cGFuc2lvbiBvZiBtYWNybyAnTEVGVF9SSUdIVF9ESUZGRVJFTlQnfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUBtYWNyb3NfbGVmdC5oOjE0IHt7ZXhwYW5kaW5nIHRoaXN9fQorICAvLyBleHBlY3RlZC1ub3RlQG1hY3Jvc19yaWdodC5oOjEyIHt7b3RoZXJ9fQorICBMRUZUX1JJR0hUX0RJRkZFUkVOVDIgKmlwMyA9ICZmOyAvLyBleHBlY3RlZC13YXJuaW5ne3thbWJpZ3VvdXMgZXhwYW5zaW9uIG9mIG1hY3JvICdMRUZUX1JJR0hUX0RJRkZFUkVOVDJ9fQorICAvLyBleHBlY3RlZC1ub3RlQG1hY3Jvc19sZWZ0Lmg6MTEge3tleHBhbmRpbmcgdGhpc319CisgIC8vIGV4cGVjdGVkLW5vdGVAbWFjcm9zX3JpZ2h0Lmg6MTMge3tvdGhlcn19CisjdW5kZWYgTEVGVF9SSUdIVF9ESUZGRVJFTlQzCisgIGludCBMRUZUX1JJR0hUX0RJRkZFUkVOVDM7Cit9CisKK0BpbXBvcnQgbWFjcm9zX3JpZ2h0LnVuZGVmOworCisvLyBGSVhNRTogU2VlIG1hY3Jvcy5jLgorI2lmZGVmIFRPUF9SSUdIVF9VTkRFRgorIyBlcnJvciBUT1BfUklHSFRfVU5ERUYgc2hvdWxkIG5vdCBiZSBkZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBUT1BfT1RIRVJfVU5ERUYxCisjIGVycm9yIFRPUF9PVEhFUl9VTkRFRjEgc2hvdWxkIHN0aWxsIGJlIGRlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIFRPUF9PVEhFUl9VTkRFRjIKKyMgZXJyb3IgVE9QX09USEVSX1VOREVGMiBzaG91bGQgc3RpbGwgYmUgZGVmaW5lZAorI2VuZGlmCisKKyNpZm5kZWYgVE9QX09USEVSX1JFREVGMQorIyBlcnJvciBUT1BfT1RIRVJfUkVERUYxIHNob3VsZCBzdGlsbCBiZSBkZWZpbmVkCisjZW5kaWYKK2ludCBuMSA9IFRPUF9PVEhFUl9SRURFRjE7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2FtYmlndW91cyBleHBhbnNpb24gb2YgbWFjcm8gJ1RPUF9PVEhFUl9SRURFRjEnfX0KKy8vIGV4cGVjdGVkLW5vdGVAbWFjcm9zX3RvcC5oOjE5IHt7ZXhwYW5kaW5nIHRoaXMgZGVmaW5pdGlvbn19CisvLyBleHBlY3RlZC1ub3RlQG1hY3Jvc19vdGhlci5oOjQge3tvdGhlciBkZWZpbml0aW9ufX0KKworI2lmbmRlZiBUT1BfT1RIRVJfUkVERUYyCisjIGVycm9yIFRPUF9PVEhFUl9SRURFRjIgc2hvdWxkIHN0aWxsIGJlIGRlZmluZWQKKyNlbmRpZgoraW50IG4yID0gVE9QX09USEVSX1JFREVGMjsgLy8gb2sKKworaW50IG4zID0gVE9QX09USEVSX0RFRl9SSUdIVF9VTkRFRjsgLy8gb2sKKworaW50IHRvcF9yZWRlZl9pbl9zdWJtb2R1bGVzID0gVE9QX1JFREVGX0lOX1NVQk1PRFVMRVM7CitAaW1wb3J0IG1hY3Jvc190b3AuYzsKK3ZvaWQgdGVzdDIoKSB7CisgIGludCBUT1BfUkVERUZfSU5fU1VCTU9EVUxFUyA9IHRvcF9yZWRlZl9pbl9zdWJtb2R1bGVzOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL21hbGZvcm1lZC5jcHAgYi90ZXN0L01vZHVsZXMvbWFsZm9ybWVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDdiMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL21hbGZvcm1lZC5jcHAKQEAgLTAsMCArMSwyMyBAQAorLy8gUlVOOiBybSAtcmYgJXQKKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cy9tYWxmb3JtZWQgLURIRUFERVI9ImExLmgiICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMgLS1jaGVjay1wcmVmaXg9Q0hFQ0stQQorLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzL21hbGZvcm1lZCAtREhFQURFUj0iYjEuaCIgJXMgMj4mMSB8IEZpbGVDaGVjayAlcyAtLWNoZWNrLXByZWZpeD1DSEVDSy1CCisKKyNkZWZpbmUgU1RSMih4KSAjeAorI2RlZmluZSBTVFIoeCkgU1RSMih4KQorI2luY2x1ZGUgU1RSKEhFQURFUikKKworLy8gQ0hFQ0stQTogV2hpbGUgYnVpbGRpbmcgbW9kdWxlICdtYWxmb3JtZWRfYScKKy8vIENIRUNLLUE6IGExLmg6MTp7ey4qfX0gZXJyb3I6IGV4cGVjdGVkICd9JworLy8gQ0hFQ0stQTogYTEuaDoxOnt7Lip9fSBub3RlOiB0byBtYXRjaCB0aGlzICd7JworLy8KKy8vIENIRUNLLUE6IFdoaWxlIGJ1aWxkaW5nIG1vZHVsZSAnbWFsZm9ybWVkX2EnCisvLyBDSEVDSy1BOiBhMi5oOjE6e3suKn19IGVycm9yOiBleHRyYW5lb3VzIGNsb3NpbmcgYnJhY2UKKworLy8gQ0hFQ0stQjogV2hpbGUgYnVpbGRpbmcgbW9kdWxlICdtYWxmb3JtZWRfYicKKy8vIENIRUNLLUI6IGIxLmg6Mjp7ey4qfX0gZXJyb3I6IGV4cGVjdGVkICd9JworLy8gQ0hFQ0stQjogYjEuaDoxOnt7Lip9fSBub3RlOiB0byBtYXRjaCB0aGlzICd7JworLy8gQ0hFQ0stQjogYjEuaDozOnt7Lip9fSBlcnJvcjogZXh0cmFuZW91cyBjbG9zaW5nIGJyYWNlICgnfScpCisvLworLy8gQ0hFQ0stQjogV2hpbGUgYnVpbGRpbmcgbW9kdWxlICdtYWxmb3JtZWRfYicKKy8vIENIRUNLLUI6IGIyLmg6MTp7ey4qfX0gZXJyb3I6IHJlZGVmaW5pdGlvbiBvZiAnZycKKy8vIENIRUNLLUI6IGIyLmg6MTp7ey4qfX0gbm90ZTogcHJldmlvdXMgZGVmaW5pdGlvbiBpcyBoZXJlCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvbW9kdWxlLXByaXZhdGUuY3BwIGIvdGVzdC9Nb2R1bGVzL21vZHVsZS1wcml2YXRlLmNwcAppbmRleCA0MzhkY2FiLi45MjEzYTBmIDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvbW9kdWxlLXByaXZhdGUuY3BwCisrKyBiL3Rlc3QvTW9kdWxlcy9tb2R1bGUtcHJpdmF0ZS5jcHAKQEAgLTEsNyArMSw3IEBACiAvLyBSVU46IHJtIC1yZiAldAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYysrIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1mbW9kdWxlLW5hbWU9bW9kdWxlX3ByaXZhdGVfbGVmdCAtZW1pdC1tb2R1bGUgJVMvSW5wdXRzL21vZHVsZS5tYXAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMrKyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZS1uYW1lPW1vZHVsZV9wcml2YXRlX3JpZ2h0IC1lbWl0LW1vZHVsZSAlUy9JbnB1dHMvbW9kdWxlLm1hcAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYysrIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0ICVzIC12ZXJpZnkKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMrKyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMgJXMgLXZlcmlmeQogLy8gRklYTUU6IFdoZW4gd2UgaGF2ZSBhIHN5bnRheCBmb3IgbW9kdWxlcyBpbiBDKyssIHVzZSB0aGF0LgogCiBAaW1wb3J0IG1vZHVsZV9wcml2YXRlX2xlZnQ7CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvbW9kdWxlX2ZpbGVfaW5mby5tIGIvdGVzdC9Nb2R1bGVzL21vZHVsZV9maWxlX2luZm8ubQppbmRleCAwOTMxOWQ2Li5mOWEzNWJhIDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvbW9kdWxlX2ZpbGVfaW5mby5tCisrKyBiL3Rlc3QvTW9kdWxlcy9tb2R1bGVfZmlsZV9pbmZvLm0KQEAgLTE2LDcgKzE2LDYgQEAKIC8vIENIRUNLOiAgICAgVHJpcGxlOgogLy8gQ0hFQ0s6ICAgICBDUFU6IAogLy8gQ0hFQ0s6ICAgICBBQkk6IAotLy8gQ0hFQ0s6ICAgICBDKysgQUJJOiAKIC8vIENIRUNLOiAgICAgTGlua2VyIHZlcnNpb246IAogCiAvLyBDSEVDSzogSGVhZGVyIHNlYXJjaCBvcHRpb25zOgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL21vZHVsZW1hcC1sb2NhdGlvbnMubSBiL3Rlc3QvTW9kdWxlcy9tb2R1bGVtYXAtbG9jYXRpb25zLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjZGNkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9tb2R1bGVtYXAtbG9jYXRpb25zLm0KQEAgLTAsMCArMSwxOCBAQAorLy8gUlVOOiBybSAtcmYgJXQgCisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cy9Nb2R1bGVNYXBMb2NhdGlvbnMvTW9kdWxlX01vZHVsZU1hcCAtSSAlUy9JbnB1dHMvTW9kdWxlTWFwTG9jYXRpb25zL0JvdGggLUYgJVMvSW5wdXRzL01vZHVsZU1hcExvY2F0aW9ucyAteCBvYmplY3RpdmUtYyAtZnN5bnRheC1vbmx5ICVzIC12ZXJpZnkKKworLy8gcmVndWxhcgorQGltcG9ydCBtb2R1bGVfbW9kdWxlbWFwOworQGltcG9ydCBib3RoOworLy8gZnJhbWV3b3JrCitAaW1wb3J0IE1vZHVsZV9Nb2R1bGVNYXBfRjsKK0BpbXBvcnQgTW9kdWxlX01vZHVsZU1hcF9GLlByaXZhdGU7CitAaW1wb3J0IEJvdGhfRjsKK0BpbXBvcnQgSW5mZXJyZWQ7CisKK3ZvaWQgdGVzdCgpIHsKKyAgd2lsbF9iZV9mb3VuZDEoKTsKKyAgd29udF9iZV9mb3VuZDEoKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7aW1wbGljaXQgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gJ3dvbnRfYmVfZm91bmQxJyBpcyBpbnZhbGlkIGluIEM5OX19CisgIHdpbGxfYmVfZm91bmQyKCk7CisgIHdvbnRfYmVfZm91bmQyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2ltcGxpY2l0IGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uICd3b250X2JlX2ZvdW5kMicgaXMgaW52YWxpZCBpbiBDOTl9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL25hbWVzcGFjZXMuY3BwIGIvdGVzdC9Nb2R1bGVzL25hbWVzcGFjZXMuY3BwCmluZGV4IDhjMjI1ZTAuLmE2ZjRjMjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9uYW1lc3BhY2VzLmNwcAorKysgYi90ZXN0L01vZHVsZXMvbmFtZXNwYWNlcy5jcHAKQEAgLTM2LDYgKzM2LDkgQEAKICAgZG91YmxlICZkcjMgPSBnbG9iYWwoMS4wKTsKICAgZG91YmxlICZkcjQgPSA6Omdsb2JhbDIoMS4wKTsKICAgZG91YmxlICZkcjUgPSBMb29rdXBCZWZvcmVJbXBvcnQ6OmYoMS4wKTsKKworICBzdHJ1Y3QgQWRkQW5kUmVleHBvcnRCZWZvcmVJbXBvcnQ6OlMgczsKKyAgaW50IGsgPSBBZGRBbmRSZWV4cG9ydEJlZm9yZUltcG9ydDo6UzsKIH0KIAogLy8gVGVzdCBuYW1lc3BhY2VzIG1lcmdlZCB3aXRob3V0IGEgY29tbW9uIGZpcnN0IGRlY2xhcmF0aW9uLgpAQCAtNjksOCArNzIsOCBAQAogLy8gVGVzdCBtZXJnaW5nIHdoZW4gdXNpbmcgYW5vbnltb3VzIG5hbWVzcGFjZXMsIHdoaWNoIGRvZXMgbm90CiAvLyBhY3R1YWxseSBwZXJmb3JtIGFueSBtZXJnaW5nLgogdm9pZCB0ZXN0QW5vbnltb3VzTm90TWVyZ2VkKCkgewotICBOMTE6OmNvbnN1bWVGb28oTjExOjpnZXRGb28oKSk7IC8vIGV4cGVjdGVkLWVycm9ye3tjYW5ub3QgaW5pdGlhbGl6ZSBhIHBhcmFtZXRlciBvZiB0eXBlICdOMTE6Ojxhbm9ueW1vdXM+OjpGb28gKicgd2l0aCBhbiBydmFsdWUgb2YgdHlwZSAnTjExOjo8YW5vbnltb3VzPjo6Rm9vIConfX0KLSAgTjEyOjpjb25zdW1lRm9vKE4xMjo6Z2V0Rm9vKCkpOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2Fubm90IGluaXRpYWxpemUgYSBwYXJhbWV0ZXIgb2YgdHlwZSAnTjEyOjo8YW5vbnltb3VzPjo6Rm9vIConIHdpdGggYW4gcnZhbHVlIG9mIHR5cGUgJ04xMjo6PGFub255bW91cz46OkZvbyAqJ319ICAKKyAgTjExOjpjb25zdW1lRm9vKE4xMTo6Z2V0Rm9vKCkpOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2Fubm90IGluaXRpYWxpemUgYSBwYXJhbWV0ZXIgb2YgdHlwZSAnTjExOjooYW5vbnltb3VzIG5hbWVzcGFjZSk6OkZvbyAqJyB3aXRoIGFuIHJ2YWx1ZSBvZiB0eXBlICdOMTE6Oihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6Rm9vIConfX0KKyAgTjEyOjpjb25zdW1lRm9vKE4xMjo6Z2V0Rm9vKCkpOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2Fubm90IGluaXRpYWxpemUgYSBwYXJhbWV0ZXIgb2YgdHlwZSAnTjEyOjooYW5vbnltb3VzIG5hbWVzcGFjZSk6OkZvbyAqJyB3aXRoIGFuIHJ2YWx1ZSBvZiB0eXBlICdOMTI6Oihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6Rm9vIConfX0KIH0KIAogLy8gZXhwZWN0ZWQtbm90ZUBJbnB1dHMvbmFtZXNwYWNlcy1yaWdodC5oOjYwIHt7cGFzc2luZyBhcmd1bWVudCB0byBwYXJhbWV0ZXIgaGVyZX19CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvb2JqYy1jYXRlZ29yaWVzLm0gYi90ZXN0L01vZHVsZXMvb2JqYy1jYXRlZ29yaWVzLm0KaW5kZXggZjA4YjEzYS4uYTY2YWI4ZCAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL29iamMtY2F0ZWdvcmllcy5tCisrKyBiL3Rlc3QvTW9kdWxlcy9vYmpjLWNhdGVnb3JpZXMubQpAQCAtNCw3ICs0LDcgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLXggb2JqZWN0aXZlLWMgLWZtb2R1bGUtbmFtZT1jYXRlZ29yeV9yaWdodCAtZW1pdC1tb2R1bGUgJVMvSW5wdXRzL21vZHVsZS5tYXAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLXggb2JqZWN0aXZlLWMgLWZtb2R1bGUtbmFtZT1jYXRlZ29yeV9ib3R0b20gLWVtaXQtbW9kdWxlICVTL0lucHV0cy9tb2R1bGUubWFwCiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC14IG9iamVjdGl2ZS1jIC1mbW9kdWxlLW5hbWU9Y2F0ZWdvcnlfb3RoZXIgLWVtaXQtbW9kdWxlICVTL0lucHV0cy9tb2R1bGUubWFwCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0ICVzIC12ZXJpZnkKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzICVzIC12ZXJpZnkKIAogQGltcG9ydCBjYXRlZ29yeV9ib3R0b207CiAKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9vYmpjX3JlZGVmLm0gYi90ZXN0L01vZHVsZXMvb2JqY19yZWRlZi5tCmluZGV4IGY5MTEyNDEuLjI4ZTQ3NjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9vYmpjX3JlZGVmLm0KKysrIGIvdGVzdC9Nb2R1bGVzL29iamNfcmVkZWYubQpAQCAtOCw2ICs4LDYgQEAKIC8vIFJVTjogcm0gLXJmICV0CiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1lbWl0LW1vZHVsZSAtZm1vZHVsZS1uYW1lPXJlZGVjbGFyYXRpb25zX2xlZnQgJVMvSW5wdXRzL21vZHVsZS5tYXAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWVtaXQtbW9kdWxlIC1mbW9kdWxlLW5hbWU9d2VpcmRfb2JqYyAlUy9JbnB1dHMvbW9kdWxlLm1hcAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAlcyAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cyAlcyAtdmVyaWZ5CiAvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwogCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvcmVjdXJzaXZlLmMgYi90ZXN0L01vZHVsZXMvcmVjdXJzaXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxNWIxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9yZWN1cnNpdmUuYwpAQCAtMCwwICsxLDExIEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMKKyNpbmNsdWRlICJyZWN1cnNpdmUxLmgiCisKKy8vIFJVTjogcm0gLXJmICV0CisvLyBSVU46IG5vdCAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZW1pdC1tb2R1bGUgLWZtb2R1bGUtbmFtZT1yZWN1cnNpdmUxICVTL0lucHV0cy9tb2R1bGUubWFwIDI+JjEgfCBGaWxlQ2hlY2sgJXMKKworLy8gQ0hFQ0s6ICAgICAgV2hpbGUgYnVpbGRpbmcgbW9kdWxlICdyZWN1cnNpdmUxJ3t7KCBpbXBvcnRlZCBmcm9tIC4qWy9cXXJlY3Vyc2l2ZS5jOjMpP319OgorLy8gQ0hFQ0stTkVYVDogV2hpbGUgYnVpbGRpbmcgbW9kdWxlICdyZWN1cnNpdmUyJyBpbXBvcnRlZCBmcm9tIHt7LipJbnB1dHNbL1xdfX1yZWN1cnNpdmUxLmg6MToKKy8vIENIRUNLLU5FWFQ6IEluIGZpbGUgaW5jbHVkZWQgZnJvbSA8bW9kdWxlLWluY2x1ZGVzPjoxOgorLy8gQ0hFQ0stTkVYVDogcmVjdXJzaXZlMi5oOjE6MTA6IGZhdGFsIGVycm9yOiBjeWNsaWMgZGVwZW5kZW5jeSBpbiBtb2R1bGUgJ3JlY3Vyc2l2ZTEnOiByZWN1cnNpdmUxIC0+IHJlY3Vyc2l2ZTIgLT4gcmVjdXJzaXZlMQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL3JlZGVjbC1uYW1lc3BhY2VzLm1tIGIvdGVzdC9Nb2R1bGVzL3JlZGVjbC1uYW1lc3BhY2VzLm1tCmluZGV4IDkzMTAyYzAuLjIwM2RhYTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9yZWRlY2wtbmFtZXNwYWNlcy5tbQorKysgYi90ZXN0L01vZHVsZXMvcmVkZWNsLW5hbWVzcGFjZXMubW0KQEAgLTEwLDQgKzEwLDQgQEAKIC8vIFJVTjogcm0gLXJmICV0CiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jKysgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWVtaXQtbW9kdWxlIC1mbW9kdWxlLW5hbWU9cmVkZWNsX25hbWVzcGFjZXNfbGVmdCAlUy9JbnB1dHMvbW9kdWxlLm1hcAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYysrIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1lbWl0LW1vZHVsZSAtZm1vZHVsZS1uYW1lPXJlZGVjbF9uYW1lc3BhY2VzX3JpZ2h0ICVTL0lucHV0cy9tb2R1bGUubWFwCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC13ICVzIC12ZXJpZnkKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzIC13ICVzIC12ZXJpZnkKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9yZWRlY2xhcmF0aW9ucy5tIGIvdGVzdC9Nb2R1bGVzL3JlZGVjbGFyYXRpb25zLm0KaW5kZXggZjIxMGYzNy4uMTFhY2E3NSAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL3JlZGVjbGFyYXRpb25zLm0KKysrIGIvdGVzdC9Nb2R1bGVzL3JlZGVjbGFyYXRpb25zLm0KQEAgLTcsNiArNyw2IEBACiAvLyBSVU46IHJtIC1yZiAldAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAteCBvYmplY3RpdmUtYyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZW1pdC1tb2R1bGUgLWZtb2R1bGUtbmFtZT1yZWRlY2xhcmF0aW9uc19sZWZ0ICVTL0lucHV0cy9tb2R1bGUubWFwCiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1lbWl0LW1vZHVsZSAtZm1vZHVsZS1uYW1lPXJlZGVjbGFyYXRpb25zX3JpZ2h0ICVTL0lucHV0cy9tb2R1bGUubWFwCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0ICVzIC12ZXJpZnkKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzICVzIC12ZXJpZnkKIC8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCiAKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9yZWRlY2xzL21haW4ubSBiL3Rlc3QvTW9kdWxlcy9yZWRlY2xzL21haW4ubQppbmRleCA5ZWMwMmIwLi44MjM2MDkyIDEwMDY0NAotLS0gYS90ZXN0L01vZHVsZXMvcmVkZWNscy9tYWluLm0KKysrIGIvdGVzdC9Nb2R1bGVzL3JlZGVjbHMvbWFpbi5tCkBAIC0xLDggKzEsOCBAQAogLy8gUlVOOiBybSAtcmYgJXQubWNwCiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC14IG9iamVjdGl2ZS1jIC1lbWl0LW1vZHVsZSAtZm1vZHVsZS1uYW1lPWEgJVMvbW9kdWxlLm1hcCAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldC5tY3AKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXggb2JqZWN0aXZlLWMgLWVtaXQtbW9kdWxlIC1mbW9kdWxlLW5hbWU9YiAlUy9tb2R1bGUubWFwIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0Lm1jcAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAlcyAtZW1pdC1wY2ggLW8gJXQxLnBjaCAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldC5tY3AKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgJXMgLWVtaXQtcGNoIC1vICV0Mi5wY2ggLWluY2x1ZGUtcGNoICV0MS5wY2ggLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQubWNwCisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzICVzIC1lbWl0LXBjaCAtbyAldDEucGNoIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0Lm1jcCAtSSAlUworLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAlcyAtZW1pdC1wY2ggLW8gJXQyLnBjaCAtaW5jbHVkZS1wY2ggJXQxLnBjaCAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldC5tY3AgLUkgJVMKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgJXMgLWZzeW50YXgtb25seSAtaW5jbHVkZS1wY2ggJXQyLnBjaCAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldC5tY3AgLXZlcmlmeQogCiAjaWZuZGVmIEhFQURFUjEKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9yZW5hbWVkLm0gYi90ZXN0L01vZHVsZXMvcmVuYW1lZC5tCmluZGV4IDRlOGY1MzIuLmVjMjYxNmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvTW9kdWxlcy9yZW5hbWVkLm0KKysrIGIvdGVzdC9Nb2R1bGVzL3JlbmFtZWQubQpAQCAtMyw2ICszLDYgQEAKIGludCBmKCkgeyByZXR1cm4gc2FtZV9hcGk7IH0KIAogLy8gUlVOOiBybSAtcmYgJXQKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLUkgJVMvSW5wdXRzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0ICVzIC12ZXJpZnkKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLUkgJVMvSW5wdXRzL29sZG5hbWUgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgJXMgLXZlcmlmeQogCiAvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL3N0cmluZ19uYW1lcy5jcHAgYi90ZXN0L01vZHVsZXMvc3RyaW5nX25hbWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDY1YWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL3N0cmluZ19uYW1lcy5jcHAKQEAgLTAsMCArMSw2IEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1mbW9kdWxlcyAtZm1vZHVsZXMtZGVjbHVzZSAtSSAlUy9JbnB1dHMvc3RyaW5nX25hbWVzICVzIC1mbW9kdWxlLW5hbWU9Im15L21vZHVsZS1hIiAtdmVyaWZ5CisKKyNpbmNsdWRlICJhLmgiCisjaW5jbHVkZSAiYi5oIiAvLyBleHBlY3RlZC1lcnJvciB7e2RvZXMgbm90IGRlcGVuZCBvbiBhIG1vZHVsZSBleHBvcnRpbmd9fQorI2luY2x1ZGUgImMuaCIKZGlmZiAtLWdpdCBhL3Rlc3QvTW9kdWxlcy9zdWJmcmFtZXdvcmstZnJvbS1pbnRlcm1lZGlhdGUtcGF0aC5tIGIvdGVzdC9Nb2R1bGVzL3N1YmZyYW1ld29yay1mcm9tLWludGVybWVkaWF0ZS1wYXRoLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwYmQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy9zdWJmcmFtZXdvcmstZnJvbS1pbnRlcm1lZGlhdGUtcGF0aC5tCkBAIC0wLDAgKzEsNSBAQAorLy8gUlVOOiBybSAtcmYgJXQKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtZm1vZHVsZXMgLUYgJVMvSW5wdXRzIC1GICVTL0lucHV0cy9EZXBlbmRzT25Nb2R1bGUuZnJhbWV3b3JrL0ZyYW1ld29ya3MgJXMgLXZlcmlmeQorCitAaW1wb3J0IERlcGVuZHNPbk1vZHVsZTsKK0BpbXBvcnQgU3ViRnJhbWV3b3JrOyAvLyBleHBlY3RlZC1lcnJvcnt7bW9kdWxlICdTdWJGcmFtZXdvcmsnIG5vdCBmb3VuZH19CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvc3VibW9kdWxlcy5jcHAgYi90ZXN0L01vZHVsZXMvc3VibW9kdWxlcy5jcHAKaW5kZXggOWM2MjM4OS4uYTE4MTM4YyAxMDA2NDQKLS0tIGEvdGVzdC9Nb2R1bGVzL3N1Ym1vZHVsZXMuY3BwCisrKyBiL3Rlc3QvTW9kdWxlcy9zdWJtb2R1bGVzLmNwcApAQCAtMzEsNiArMzEsOSBAQAogZXh0ZXJuIE15VHlwZUEgaW1wb3J0X3NlbGZfdGVzdF9hOyAvLyBleHBlY3RlZC1lcnJvciB7e211c3QgYmUgaW1wb3J0ZWQgZnJvbSBtb2R1bGUgJ2ltcG9ydF9zZWxmLmEnfX0KIC8vIGV4cGVjdGVkLW5vdGVAaW1wb3J0LXNlbGYtYS5oOjEge3toZXJlfX0KIGV4dGVybiBNeVR5cGVDIGltcG9ydF9zZWxmX3Rlc3RfYzsKLS8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSB2YWxpZDsgaW1wb3J0X3NlbGYuYiByZS1leHBvcnRzIGltcG9ydF9zZWxmLmQuCi1leHRlcm4gTXlUeXBlRCBpbXBvcnRfc2VsZl90ZXN0X2Q7IC8vIGV4cGVjdGVkLWVycm9yIHt7bXVzdCBiZSBpbXBvcnRlZCBmcm9tIG1vZHVsZSAnaW1wb3J0X3NlbGYuZCd9fQotLy8gZXhwZWN0ZWQtbm90ZUBpbXBvcnQtc2VsZi1kLmg6MSB7e2hlcmV9fQorZXh0ZXJuIE15VHlwZUQgaW1wb3J0X3NlbGZfdGVzdF9kOworCisvLyBleHBlY3RlZC1lcnJvckBJbnB1dHMvc3VibW9kdWxlcy9tb2R1bGUubWFwOjE1e3toZWFkZXIgJ21pc3NpbmcuaCcgbm90IGZvdW5kfX0KK0BpbXBvcnQgbWlzc2luZ19oZWFkZXJzLm1pc3Npbmc7CitAaW1wb3J0IG1pc3NpbmdfaGVhZGVycy5ub3RfbWlzc2luZzsKK3ZvaWQgZigpIHsgTm90TWlzc2luZ0Z1bmN0aW9uKCk7IH07CmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24tdmlzaWJpbGl0eS5jcHAgYi90ZXN0L01vZHVsZXMvdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24tdmlzaWJpbGl0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxMWExNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvTW9kdWxlcy90ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi12aXNpYmlsaXR5LmNwcApAQCAtMCwwICsxLDQzIEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAtdmVyaWZ5IC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cy90ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi12aXNpYmlsaXR5IC1zdGQ9YysrMTEgJXMKKy8vCisvLyBGSVhNRTogV2Ugc2hvdWxkIGFjY2VwdCB0aGUgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBjYXNlcyBiZWxvdyB0b28uCisvLyBOb3RlLCBlcnJvcnMgdHJpZ2dlciBpbXBsaWNpdCBpbXBvcnRzLCBzbyBvbmx5IGVuYWJsZSBvbmUgZXJyb3IgYXQgYSB0aW1lLgorLy8gUlVOOiAlY2xhbmdfY2MxIC1mbW9kdWxlcyAtdmVyaWZ5IC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0IC1JICVTL0lucHV0cy90ZW1wbGF0ZS1zcGVjaWFsaXphdGlvbi12aXNpYmlsaXR5IC1zdGQ9YysrMTEgLURFUlIxICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC12ZXJpZnkgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLUkgJVMvSW5wdXRzL3RlbXBsYXRlLXNwZWNpYWxpemF0aW9uLXZpc2liaWxpdHkgLXN0ZD1jKysxMSAtREVSUjIgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1vZHVsZXMgLXZlcmlmeSAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldCAtSSAlUy9JbnB1dHMvdGVtcGxhdGUtc3BlY2lhbGl6YXRpb24tdmlzaWJpbGl0eSAtc3RkPWMrKzExIC1ERVJSMyAlcworCisjaW5jbHVkZSAiYy5oIgorCitTPGludD4gaW1wbGljaXRfaW5zdF9jbGFzc190ZW1wbGF0ZTsKK2ludCBrMSA9IGltcGxpY2l0X2luc3RfY2xhc3NfdGVtcGxhdGUubjsKKworI2lmZGVmIEVSUjEKK1M8Y2hhcj4gZXhwbGljaXRfaW5zdF9jbGFzc190ZW1wbGF0ZTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3ttdXN0IGJlIGltcG9ydGVkIGZyb20gbW9kdWxlICd0c3YuZSd9fQorLy8gZXhwZWN0ZWQtbm90ZUBlLmg6NCB7e3ByZXZpb3VzfX0KK2ludCBrMiA9IGV4cGxpY2l0X2luc3RfY2xhc3NfdGVtcGxhdGUubjsKKyNlbmRpZgorCisjaW5jbHVkZSAiYS5oIgorCitUPGludD46OlMgaW1wbGljaXRfaW5zdF9tZW1iZXJfY2xhc3NfdGVtcGxhdGU7CitpbnQgazMgPSBpbXBsaWNpdF9pbnN0X21lbWJlcl9jbGFzc190ZW1wbGF0ZS5uOworCisjaWZkZWYgRVJSMgorVDxjaGFyPjo6UyBleHBsaWNpdF9pbnN0X21lbWJlcl9jbGFzc190ZW1wbGF0ZTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3ttdXN0IGJlIGltcG9ydGVkIGZyb20gbW9kdWxlICd0c3YuZSd9fQorLy8gZXhwZWN0ZWQtbm90ZUBlLmg6NSB7e3ByZXZpb3VzfX0KK2ludCBrNCA9IGV4cGxpY2l0X2luc3RfbWVtYmVyX2NsYXNzX3RlbXBsYXRlLm47CisjZW5kaWYKKworVDxpbnQ+OjpFIGltcGxpY2l0X2luc3RfbWVtYmVyX2VudW1fdGVtcGxhdGU7CitpbnQgazUgPSBkZWNsdHlwZShpbXBsaWNpdF9pbnN0X21lbWJlcl9lbnVtX3RlbXBsYXRlKTo6ZTsKKworI2lmZGVmIEVSUjMKK1Q8Y2hhcj46OkUgZXhwbGljaXRfaW5zdF9tZW1iZXJfZW51bV90ZW1wbGF0ZTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3ttdXN0IGJlIGltcG9ydGVkIGZyb20gbW9kdWxlICd0c3YuZSd9fQorLy8gZXhwZWN0ZWQtbm90ZUBlLmg6NSB7e3ByZXZpb3VzfX0KK2ludCBrNiA9IGRlY2x0eXBlKGV4cGxpY2l0X2luc3RfbWVtYmVyX2VudW1fdGVtcGxhdGUpOjplOworI2VuZGlmCisKKyNpZiBFUlIxICsgRVJSMiArIEVSUjMgPT0gMAorLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL3VubmVjZXNzYXJ5LW1vZHVsZS1tYXAtcGFyc2luZy5jIGIvdGVzdC9Nb2R1bGVzL3VubmVjZXNzYXJ5LW1vZHVsZS1tYXAtcGFyc2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODM0NDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L01vZHVsZXMvdW5uZWNlc3NhcnktbW9kdWxlLW1hcC1wYXJzaW5nLmMKQEAgLTAsMCArMSw4IEBACisvLyBUaGlzIGNoZWNrcyB0aGF0IHdlIGFyZSBub3QgcGFyc2luZyBtb2R1bGUgbWFwcyBpZiBtb2R1bGVzIGFyZSBub3QgZW5hYmxlZC4KKworLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtZm1vZHVsZXMgLUkgJVMvSW5wdXRzL3VubmVjZXNzYXJ5LW1vZHVsZS1tYXAtcGFyc2luZyAtZnN5bnRheC1vbmx5ICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtSSAlUy9JbnB1dHMvdW5uZWNlc3NhcnktbW9kdWxlLW1hcC1wYXJzaW5nIC1mc3ludGF4LW9ubHkgJXMKKworLy8gQ0hFQ0s6IGVycm9yOiBleHBlY3RlZCB1bWJyZWxsYSwgaGVhZGVyLCBzdWJtb2R1bGUsIG9yIG1vZHVsZSBleHBvcnQKKworI2luY2x1ZGUgImExLmgiCmRpZmYgLS1naXQgYS90ZXN0L01vZHVsZXMvdXBkYXRlLWFmdGVyLWxvYWQuY3BwIGIvdGVzdC9Nb2R1bGVzL3VwZGF0ZS1hZnRlci1sb2FkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDk3ZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL3VwZGF0ZS1hZnRlci1sb2FkLmNwcApAQCAtMCwwICsxLDggQEAKKy8vIFJVTjogcm0gLXJmICV0CisvLyBSVU46ICVjbGFuZ19jYzEgLWZtb2R1bGVzIC1JICVTL0lucHV0cy91cGRhdGUtYWZ0ZXItbG9hZCAtdmVyaWZ5IC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0ICVzCisKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisjaW5jbHVkZSAiYS5oIgorbmFtZXNwYWNlIGxsdm0ge30KKyNpbmNsdWRlICJiLmgiCit2b2lkIGxsdm06OmYoKSB7fQpkaWZmIC0tZ2l0IGEvdGVzdC9Nb2R1bGVzL3ZhbGlkYXRlLXN5c3RlbS1oZWFkZXJzLm0gYi90ZXN0L01vZHVsZXMvdmFsaWRhdGUtc3lzdGVtLWhlYWRlcnMubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmIyYmQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Nb2R1bGVzL3ZhbGlkYXRlLXN5c3RlbS1oZWFkZXJzLm0KQEAgLTAsMCArMSwyNSBAQAorLy8gUlVOOiBybSAtcmYgJXQvTW9kdWxlQ2FjaGUKKy8vIFJVTjogbWtkaXIgLXAgJXQvSW5wdXRzL3Vzci9pbmNsdWRlCisvLyBSVU46IHRvdWNoICV0L0lucHV0cy91c3IvaW5jbHVkZS9mb28uaAorLy8gUlVOOiBlY2hvICdtb2R1bGUgRm9vIFtzeXN0ZW1dIHsgaGVhZGVyICJmb28uaCIgfScgPiAldC9JbnB1dHMvdXNyL2luY2x1ZGUvbW9kdWxlLm1hcAorCisvLy8vCisvLyBCdWlsZCBhIG1vZHVsZSB1c2luZyBhIHN5c3RlbSBoZWFkZXIKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtaXN5c3Jvb3QgJXQvSW5wdXRzIC1mbW9kdWxlcyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldC9Nb2R1bGVDYWNoZSAtZmRpc2FibGUtbW9kdWxlLWhhc2ggLXggb2JqZWN0aXZlLWMtaGVhZGVyIC1mc3ludGF4LW9ubHkgJXMKKy8vIFJVTjogY3AgJXQvTW9kdWxlQ2FjaGUvRm9vLnBjbSAldC9Gb28ucGNtLnNhdmVkCisKKy8vLy8KKy8vIE1vZGlmeSB0aGUgc3lzdGVtIGhlYWRlciwgYW5kIGNvbmZpcm0gdGhhdCB3ZSBkb24ndCBub3RpY2Ugd2l0aG91dCAtZm1vZHVsZXMtdmFsaWRhdGUtc3lzdGVtLWhlYWRlcnMuCisvLyBUaGUgcGNtIGZpbGUgaW4gdGhlIGNhY2hlIHNob3VsZCBmYWlsIHRvIHZhbGlkYXRlLgorLy8gUlVOOiBlY2hvICcgJyA+PiAldC9JbnB1dHMvdXNyL2luY2x1ZGUvZm9vLmgKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtaXN5c3Jvb3QgJXQvSW5wdXRzIC1mbW9kdWxlcyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldC9Nb2R1bGVDYWNoZSAtZmRpc2FibGUtbW9kdWxlLWhhc2ggLXggb2JqZWN0aXZlLWMtaGVhZGVyIC1mc3ludGF4LW9ubHkgJXMKKy8vIFJVTjogZGlmZiAldC9Nb2R1bGVDYWNoZS9Gb28ucGNtICV0L0Zvby5wY20uc2F2ZWQKKworLy8vLworLy8gTm93IG1ha2Ugc3VyZSB3ZSByZWJ1aWxkIHRoZSBtb2R1bGUgd2hlbiAtZm1vZHVsZXMtdmFsaWRhdGUtc3lzdGVtLWhlYWRlcnMgaXMgc2V0LgorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1pc3lzcm9vdCAldC9JbnB1dHMgLWZtb2R1bGVzIC1mbW9kdWxlcy12YWxpZGF0ZS1zeXN0ZW0taGVhZGVycyAtZm1vZHVsZXMtY2FjaGUtcGF0aD0ldC9Nb2R1bGVDYWNoZSAtZmRpc2FibGUtbW9kdWxlLWhhc2ggLXggb2JqZWN0aXZlLWMtaGVhZGVyIC1mc3ludGF4LW9ubHkgJXMKKy8vIFJVTjogbm90IGRpZmYgJXQvTW9kdWxlQ2FjaGUvRm9vLnBjbSAldC9Gb28ucGNtLnNhdmVkCisKKy8vIFJFUVVJUkVTOiBzaGVsbAorCitAaW1wb3J0IEZvbzsKZGlmZiAtLWdpdCBhL3Rlc3QvT3Blbk1QL2xpbmtpbmcuYyBiL3Rlc3QvT3Blbk1QL2xpbmtpbmcuYwppbmRleCAzMWZkNTdkLi45NzliYTFmIDEwMDY0NAotLS0gYS90ZXN0L09wZW5NUC9saW5raW5nLmMKKysrIGIvdGVzdC9PcGVuTVAvbGlua2luZy5jCkBAIC0xLDUgKzEsNSBAQAogLy8gVGVzdCB0aGUgdGhhdCB0aGUgZHJpdmVyIHByb2R1Y2VzIHJlYXNvbmFibGUgbGlua2VyIGludm9jYXRpb25zIHdpdGgKLS8vIC1mb3Blbm1wLgorLy8gLWZvcGVubXAgb3IgLWZvcGVubXA9bGliaW9tcDV8bGliZ29tcC4KIC8vCiAvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKIC8vIFJVTjogICAgIC1mb3Blbm1wIC10YXJnZXQgaTM4Ni11bmtub3duLWxpbnV4IFwKQEAgLTE0LDMgKzE0LDU4IEBACiAvLyBDSEVDSy1MRC02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCiAvLyBDSEVDSy1MRC02NDogIi1sZ29tcCIgIi1scnQiICItbGdjYyIKIC8vIENIRUNLLUxELTY0OiAiLWxwdGhyZWFkIiAiLWxjIgorLy8KKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLWZvcGVubXA9bGliZ29tcCAtdGFyZ2V0IGkzODYtdW5rbm93bi1saW51eCBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stR09NUC1MRC0zMiAlcworLy8gQ0hFQ0stR09NUC1MRC0zMjogInt7Lip9fWxke3soLmV4ZSk/fX0iCisvLyBDSEVDSy1HT01QLUxELTMyOiAiLWxnb21wIiAiLWxydCIgIi1sZ2NjIgorLy8gQ0hFQ0stR09NUC1MRC0zMjogIi1scHRocmVhZCIgIi1sYyIKKy8vCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC1mb3Blbm1wPWxpYmdvbXAgLXRhcmdldCB4ODZfNjQtdW5rbm93bi1saW51eCBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stR09NUC1MRC02NCAlcworLy8gQ0hFQ0stR09NUC1MRC02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCisvLyBDSEVDSy1HT01QLUxELTY0OiAiLWxnb21wIiAiLWxydCIgIi1sZ2NjIgorLy8gQ0hFQ0stR09NUC1MRC02NDogIi1scHRocmVhZCIgIi1sYyIKKy8vCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC1mb3Blbm1wPWxpYmlvbXA1IC10YXJnZXQgaTM4Ni11bmtub3duLWxpbnV4IFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1JT01QNS1MRC0zMiAlcworLy8gQ0hFQ0stSU9NUDUtTEQtMzI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stSU9NUDUtTEQtMzI6ICItbGlvbXA1IiAiLWxnY2MiCisvLyBDSEVDSy1JT01QNS1MRC0zMjogIi1scHRocmVhZCIgIi1sYyIKKy8vCisvLyBSVU46ICVjbGFuZyAtbm8tY2Fub25pY2FsLXByZWZpeGVzICVzIC0jIyMgLW8gJXQubyAyPiYxIFwKKy8vIFJVTjogICAgIC1mb3Blbm1wPWxpYmlvbXA1IC10YXJnZXQgeDg2XzY0LXVua25vd24tbGludXggXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUlPTVA1LUxELTY0ICVzCisvLyBDSEVDSy1JT01QNS1MRC02NDogInt7Lip9fWxke3soLmV4ZSk/fX0iCisvLyBDSEVDSy1JT01QNS1MRC02NDogIi1saW9tcDUiICItbGdjYyIKKy8vIENIRUNLLUlPTVA1LUxELTY0OiAiLWxwdGhyZWFkIiAiLWxjIgorLy8KKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLWZvcGVubXA9bGliIC10YXJnZXQgaTM4Ni11bmtub3duLWxpbnV4IFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1MSUItTEQtMzIgJXMKKy8vIENIRUNLLUxJQi1MRC0zMjogZXJyb3I6IHVuc3VwcG9ydGVkIGFyZ3VtZW50ICdsaWInIHRvIG9wdGlvbiAnZm9wZW5tcD0nCisvLworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtZm9wZW5tcD1saWIgLXRhcmdldCB4ODZfNjQtdW5rbm93bi1saW51eCBcCisvLyBSVU46ICAgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stTElCLUxELTY0ICVzCisvLyBDSEVDSy1MSUItTEQtNjQ6IGVycm9yOiB1bnN1cHBvcnRlZCBhcmd1bWVudCAnbGliJyB0byBvcHRpb24gJ2ZvcGVubXA9JworLy8KKy8vIFJVTjogJWNsYW5nIC1uby1jYW5vbmljYWwtcHJlZml4ZXMgJXMgLSMjIyAtbyAldC5vIDI+JjEgXAorLy8gUlVOOiAgICAgLWZvcGVubXAgLWZvcGVubXA9bGliaW9tcDUgLXRhcmdldCBpMzg2LXVua25vd24tbGludXggXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLUxELVdBUk4tMzIgJXMKKy8vIENIRUNLLUxELVdBUk4tMzI6IHdhcm5pbmc6IGFyZ3VtZW50IHVudXNlZCBkdXJpbmcgY29tcGlsYXRpb246ICctZm9wZW5tcD1saWJpb21wNScKKy8vIENIRUNLLUxELVdBUk4tMzI6ICJ7ey4qfX1sZHt7KC5leGUpP319IgorLy8gQ0hFQ0stTEQtV0FSTi0zMjogIi1sZ29tcCIgIi1scnQiICItbGdjYyIKKy8vIENIRUNLLUxELVdBUk4tMzI6ICItbHB0aHJlYWQiICItbGMiCisvLworLy8gUlVOOiAlY2xhbmcgLW5vLWNhbm9uaWNhbC1wcmVmaXhlcyAlcyAtIyMjIC1vICV0Lm8gMj4mMSBcCisvLyBSVU46ICAgICAtZm9wZW5tcCAtZm9wZW5tcD1saWJpb21wNSAtdGFyZ2V0IHg4Nl82NC11bmtub3duLWxpbnV4IFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1MRC1XQVJOLTY0ICVzCisvLyBDSEVDSy1MRC1XQVJOLTY0OiB3YXJuaW5nOiBhcmd1bWVudCB1bnVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uOiAnLWZvcGVubXA9bGliaW9tcDUnCisvLyBDSEVDSy1MRC1XQVJOLTY0OiAie3suKn19bGR7eyguZXhlKT99fSIKKy8vIENIRUNLLUxELVdBUk4tNjQ6ICItbGdvbXAiICItbHJ0IiAiLWxnY2MiCisvLyBDSEVDSy1MRC1XQVJOLTY0OiAiLWxwdGhyZWFkIiAiLWxjIgorLy8KZGlmZiAtLWdpdCBhL3Rlc3QvT3Blbk1QL29wZW5tcF9jb21tb24uYyBiL3Rlc3QvT3Blbk1QL29wZW5tcF9jb21tb24uYwppbmRleCAzNzY1ZjRjLi4zMTMxYjMwIDEwMDY0NAotLS0gYS90ZXN0L09wZW5NUC9vcGVubXBfY29tbW9uLmMKKysrIGIvdGVzdC9PcGVuTVAvb3Blbm1wX2NvbW1vbi5jCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXAgLWZlcnJvci1saW1pdCAxMDAgLW8gLSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXA9bGliaW9tcDUgLWZlcnJvci1saW1pdCAxMDAgLW8gLSAlcwogCiAjcHJhZ21hIG9tcCAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGFuIE9wZW5NUCBkaXJlY3RpdmV9fQogI3ByYWdtYSBvbXAgdW5rbm93bl9kaXJlY3RpdmUgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBhbiBPcGVuTVAgZGlyZWN0aXZlfX0KZGlmZiAtLWdpdCBhL3Rlc3QvT3Blbk1QL3BhcmFsbGVsX2FzdF9wcmludC5jcHAgYi90ZXN0L09wZW5NUC9wYXJhbGxlbF9hc3RfcHJpbnQuY3BwCmluZGV4IGYyZmQyZjcuLmMxMmM1YjggMTAwNjQ0Ci0tLSBhL3Rlc3QvT3Blbk1QL3BhcmFsbGVsX2FzdF9wcmludC5jcHAKKysrIGIvdGVzdC9PcGVuTVAvcGFyYWxsZWxfYXN0X3ByaW50LmNwcApAQCAtMSw2ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mb3Blbm1wIC1hc3QtcHJpbnQgJXMgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm9wZW5tcCAteCBjKysgLXN0ZD1jKysxMSAtZW1pdC1wY2ggLW8gJXQgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm9wZW5tcCAtc3RkPWMrKzExIC1pbmNsdWRlLXBjaCAldCAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLWFzdC1wcmludCB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXA9bGliaW9tcDUgLWFzdC1wcmludCAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mb3Blbm1wPWxpYmlvbXA1IC14IGMrKyAtc3RkPWMrKzExIC1lbWl0LXBjaCAtbyAldCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mb3Blbm1wPWxpYmlvbXA1IC1zdGQ9YysrMTEgLWluY2x1ZGUtcGNoICV0IC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAtYXN0LXByaW50IHwgRmlsZUNoZWNrICVzCiAvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwogCiAjaWZuZGVmIEhFQURFUgpAQCAtOCw1MyArOCw4OSBAQAogCiB2b2lkIGZvbygpIHt9CiAKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IFMgeworICBvcGVyYXRvciBUKCkge3JldHVybiBUKCk7fQorICBzdGF0aWMgVCBUUzsKKyAgI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShUUykKK307CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgorLy8gQ0hFQ0s6ICAgICAgdGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ+IHN0cnVjdCBTIHsKKy8vIENIRUNLOiAgICAgICAgc3RhdGljIGludCBUUzsKKy8vIENIRUNLLU5FWFQ6ICAgI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShTPGludD46OlRTKQorLy8gQ0hFQ0stTkVYVDogfQorLy8gQ0hFQ0s6ICAgICAgdGVtcGxhdGUgPGNsYXNzIFQgPSBsb25nPiBzdHJ1Y3QgUyB7CisvLyBDSEVDSzogICAgICAgIHN0YXRpYyBsb25nIFRTOworLy8gQ0hFQ0stTkVYVDogICAjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKFM8bG9uZz46OlRTKQorLy8gQ0hFQ0stTkVYVDogfQorLy8gQ0hFQ0s6ICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBTIHsKKy8vIENIRUNLOiAgICAgICAgc3RhdGljIFQgVFM7CisvLyBDSEVDSy1ORVhUOiAgICNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoUzo6VFMpCisvLyBDSEVDSzogICAgICB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IEM+CiBUIHRtYWluKFQgYXJnYywgVCAqYXJndikgewogICBUIGIgPSBhcmdjLCBjLCBkLCBlLCBmLCBnOwogICBzdGF0aWMgVCBhOworICBTPFQ+IHM7CiAjcHJhZ21hIG9tcCBwYXJhbGxlbAogICBhPTI7Ci0jcHJhZ21hIG9tcCBwYXJhbGxlbCBkZWZhdWx0KG5vbmUpLCBwcml2YXRlKGFyZ2MsYikgZmlyc3Rwcml2YXRlKGFyZ3YpIHNoYXJlZCAoZCkKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGRlZmF1bHQobm9uZSksIHByaXZhdGUoYXJnYyxiKSBmaXJzdHByaXZhdGUoYXJndikgc2hhcmVkIChkKSBpZiAoYXJnYyA+IDApIG51bV90aHJlYWRzKEMpIGNvcHlpbihTPFQ+OjpUUykKKyAgZm9vKCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZiAoQykgbnVtX3RocmVhZHMocykKICAgZm9vKCk7CiAgIHJldHVybiAwOwogfQotLy8gQ0hFQ0s6IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gaW50PiBpbnQgdG1haW4oaW50IGFyZ2MsIGludCAqYXJndikgeworCisvLyBDSEVDSzogdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBpbnQsIGludCBDID0gNT4gaW50IHRtYWluKGludCBhcmdjLCBpbnQgKmFyZ3YpIHsKIC8vIENIRUNLLU5FWFQ6IGludCBiID0gYXJnYywgYywgZCwgZSwgZiwgZzsKIC8vIENIRUNLLU5FWFQ6IHN0YXRpYyBpbnQgYTsKKy8vIENIRUNLLU5FWFQ6IFM8aW50PiBzOwogLy8gQ0hFQ0stTkVYVDogI3ByYWdtYSBvbXAgcGFyYWxsZWwKIC8vIENIRUNLLU5FWFQ6IGEgPSAyOwotLy8gQ0hFQ0stTkVYVDogI3ByYWdtYSBvbXAgcGFyYWxsZWwgZGVmYXVsdChub25lKSBwcml2YXRlKGFyZ2MsYikgZmlyc3Rwcml2YXRlKGFyZ3YpIHNoYXJlZChkKQorLy8gQ0hFQ0stTkVYVDogI3ByYWdtYSBvbXAgcGFyYWxsZWwgZGVmYXVsdChub25lKSBwcml2YXRlKGFyZ2MsYikgZmlyc3Rwcml2YXRlKGFyZ3YpIHNoYXJlZChkKSBpZihhcmdjID4gMCkgbnVtX3RocmVhZHMoNSkgY29weWluKFM8aW50Pjo6VFMpCiAvLyBDSEVDSy1ORVhUOiBmb28oKQotLy8gQ0hFQ0s6IHRlbXBsYXRlIDx0eXBlbmFtZSBUID0gZmxvYXQ+IGZsb2F0IHRtYWluKGZsb2F0IGFyZ2MsIGZsb2F0ICphcmd2KSB7Ci0vLyBDSEVDSy1ORVhUOiBmbG9hdCBiID0gYXJnYywgYywgZCwgZSwgZiwgZzsKLS8vIENIRUNLLU5FWFQ6IHN0YXRpYyBmbG9hdCBhOworLy8gQ0hFQ0stTkVYVDogI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYoNSkgbnVtX3RocmVhZHMocykKKy8vIENIRUNLLU5FWFQ6IGZvbygpCisvLyBDSEVDSzogdGVtcGxhdGUgPHR5cGVuYW1lIFQgPSBsb25nLCBpbnQgQyA9IDE+IGxvbmcgdG1haW4obG9uZyBhcmdjLCBsb25nICphcmd2KSB7CisvLyBDSEVDSy1ORVhUOiBsb25nIGIgPSBhcmdjLCBjLCBkLCBlLCBmLCBnOworLy8gQ0hFQ0stTkVYVDogc3RhdGljIGxvbmcgYTsKKy8vIENIRUNLLU5FWFQ6IFM8bG9uZz4gczsKIC8vIENIRUNLLU5FWFQ6ICNwcmFnbWEgb21wIHBhcmFsbGVsCiAvLyBDSEVDSy1ORVhUOiBhID0gMjsKLS8vIENIRUNLLU5FWFQ6ICNwcmFnbWEgb21wIHBhcmFsbGVsIGRlZmF1bHQobm9uZSkgcHJpdmF0ZShhcmdjLGIpIGZpcnN0cHJpdmF0ZShhcmd2KSBzaGFyZWQoZCkKKy8vIENIRUNLLU5FWFQ6ICNwcmFnbWEgb21wIHBhcmFsbGVsIGRlZmF1bHQobm9uZSkgcHJpdmF0ZShhcmdjLGIpIGZpcnN0cHJpdmF0ZShhcmd2KSBzaGFyZWQoZCkgaWYoYXJnYyA+IDApIG51bV90aHJlYWRzKDEpIGNvcHlpbihTPGxvbmc+OjpUUykKIC8vIENIRUNLLU5FWFQ6IGZvbygpCi0vLyBDSEVDSzogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgdG1haW4oVCBhcmdjLCBUICphcmd2KSB7CisvLyBDSEVDSy1ORVhUOiAjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZigxKSBudW1fdGhyZWFkcyhzKQorLy8gQ0hFQ0stTkVYVDogZm9vKCkKKy8vIENIRUNLOiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IEM+IFQgdG1haW4oVCBhcmdjLCBUICphcmd2KSB7CiAvLyBDSEVDSy1ORVhUOiBUIGIgPSBhcmdjLCBjLCBkLCBlLCBmLCBnOwogLy8gQ0hFQ0stTkVYVDogc3RhdGljIFQgYTsKKy8vIENIRUNLLU5FWFQ6IFM8VD4gczsKIC8vIENIRUNLLU5FWFQ6ICNwcmFnbWEgb21wIHBhcmFsbGVsCiAvLyBDSEVDSy1ORVhUOiBhID0gMjsKLS8vIENIRUNLLU5FWFQ6ICNwcmFnbWEgb21wIHBhcmFsbGVsIGRlZmF1bHQobm9uZSkgcHJpdmF0ZShhcmdjLGIpIGZpcnN0cHJpdmF0ZShhcmd2KSBzaGFyZWQoZCkKKy8vIENIRUNLLU5FWFQ6ICNwcmFnbWEgb21wIHBhcmFsbGVsIGRlZmF1bHQobm9uZSkgcHJpdmF0ZShhcmdjLGIpIGZpcnN0cHJpdmF0ZShhcmd2KSBzaGFyZWQoZCkgaWYoYXJnYyA+IDApIG51bV90aHJlYWRzKEMpIGNvcHlpbihTPFQ+OjpUUykKKy8vIENIRUNLLU5FWFQ6IGZvbygpCisvLyBDSEVDSy1ORVhUOiAjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZihDKSBudW1fdGhyZWFkcyhzKQogLy8gQ0hFQ0stTkVYVDogZm9vKCkKIAorZW51bSBFbnVtIHsgfTsKKwogaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICBmbG9hdCB4OworICBsb25nIHg7CiAgIGludCBiID0gYXJnYywgYywgZCwgZSwgZiwgZzsKICAgc3RhdGljIGludCBhOwotLy8gQ0hFQ0s6IHN0YXRpYyBpbnQgYTsKKyAgI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShhKQorICBFbnVtIGVlOworLy8gQ0hFQ0s6IEVudW0gZWU7CiAjcHJhZ21hIG9tcCBwYXJhbGxlbAogLy8gQ0hFQ0stTkVYVDogI3ByYWdtYSBvbXAgcGFyYWxsZWwKICAgYT0yOwogLy8gQ0hFQ0stTkVYVDogYSA9IDI7Ci0jcHJhZ21hIG9tcCBwYXJhbGxlbCBkZWZhdWx0KG5vbmUpLCBwcml2YXRlKGFyZ2MsYikgZmlyc3Rwcml2YXRlKGFyZ3YpCi0vLyBDSEVDSy1ORVhUOiAjcHJhZ21hIG9tcCBwYXJhbGxlbCBkZWZhdWx0KG5vbmUpIHByaXZhdGUoYXJnYyxiKSBmaXJzdHByaXZhdGUoYXJndikKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGRlZmF1bHQobm9uZSksIHByaXZhdGUoYXJnYyxiKSBmaXJzdHByaXZhdGUoYXJndikgaWYgKGFyZ2MgPiAwKSBudW1fdGhyZWFkcyhlZSkgY29weWluKGEpCisvLyBDSEVDSy1ORVhUOiAjcHJhZ21hIG9tcCBwYXJhbGxlbCBkZWZhdWx0KG5vbmUpIHByaXZhdGUoYXJnYyxiKSBmaXJzdHByaXZhdGUoYXJndikgaWYoYXJnYyA+IDApIG51bV90aHJlYWRzKGVlKSBjb3B5aW4oYSkKICAgZm9vKCk7CiAvLyBDSEVDSy1ORVhUOiBmb28oKTsKLSAgcmV0dXJuIHRtYWluKGIsICZiKSArIHRtYWluKHgsICZ4KTsKKyAgcmV0dXJuIHRtYWluPGludCwgNT4oYiwgJmIpICsgdG1haW48bG9uZywgMT4oeCwgJngpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvT3Blbk1QL3BhcmFsbGVsX2NvcHlpbl9tZXNzYWdlcy5jcHAgYi90ZXN0L09wZW5NUC9wYXJhbGxlbF9jb3B5aW5fbWVzc2FnZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxY2UzNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L09wZW5NUC9wYXJhbGxlbF9jb3B5aW5fbWVzc2FnZXMuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mb3Blbm1wPWxpYmlvbXA1IC1mZXJyb3ItbGltaXQgMTAwIC1vIC0gJXMKKwordm9pZCBmb28oKSB7Cit9CisKK2Jvb2wgZm9vYm9vbChpbnQgYXJnYykgeworICByZXR1cm4gYXJnYzsKK30KKworc3RydWN0IFMxOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CitjbGFzcyBTMiB7CisgIG11dGFibGUgaW50IGE7CitwdWJsaWM6CisgIFMyKCk6YSgwKSB7IH0KKyAgUzIgJiBvcGVyYXRvciA9KFMyICZzMikgeyByZXR1cm4gKnRoaXM7IH0KK307CitjbGFzcyBTMyB7CisgIGludCBhOworcHVibGljOgorICBTMygpOmEoMCkgeyB9CisgIFMzICZvcGVyYXRvciA9KFMzICZzMykgeyByZXR1cm4gKnRoaXM7IH0KK307CitjbGFzcyBTNCB7IC8vIGV4cGVjdGVkLW5vdGUge3snUzQnIGRlY2xhcmVkIGhlcmV9fQorICBpbnQgYTsKKyAgUzQoKTsKKyAgUzQgJm9wZXJhdG9yID0oY29uc3QgUzQgJnM0KTsKK3B1YmxpYzoKKyAgUzQoaW50IHYpOmEodikgeyB9Cit9OworY2xhc3MgUzUgeyAvLyBleHBlY3RlZC1ub3RlIHt7J1M1JyBkZWNsYXJlZCBoZXJlfX0KKyAgaW50IGE7CisgIFM1KCk6YSgwKSB7fQorICBTNSAmb3BlcmF0b3IgPShjb25zdCBTNSAmczUpIHsgcmV0dXJuICp0aGlzOyB9CitwdWJsaWM6CisgIFM1KGludCB2KTphKHYpIHsgfQorfTsKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgU1QgeworcHVibGljOgorICBzdGF0aWMgVCBzOworfTsKKworCitTMiBrOworUzMgaDsKK1M0IGwoMyk7IC8vIGV4cGVjdGVkLW5vdGUge3snbCcgZGVmaW5lZCBoZXJlfX0KK1M1IG0oNCk7IC8vIGV4cGVjdGVkLW5vdGUge3snbScgZGVmaW5lZCBoZXJlfX0KKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaCwgaywgbCwgbSkKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIGludCBpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBjb3B5aW4gLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKCcgYWZ0ZXIgJ2NvcHlpbid9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBjb3B5aW4gKCAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGV4cHJlc3Npb259fSBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICcoJ319CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGNvcHlpbiAoKSAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGV4cHJlc3Npb259fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBjb3B5aW4gKGsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBjb3B5aW4gKGgsIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgZXhwcmVzc2lvbn19IGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgY29weWluIChhcmdjID4gMCA/IGFyZ3ZbMV0gOiBhcmd2WzJdKSAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIHZhcmlhYmxlIG5hbWV9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBjb3B5aW4gKGwpIC8vIGV4cGVjdGVkLWVycm9yIHt7Y29weWluIHZhcmlhYmxlIG11c3QgaGF2ZSBhbiBhY2Nlc3NpYmxlLCB1bmFtYmlndW91cyBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3J9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBjb3B5aW4gKFMxKSAvLyBleHBlY3RlZC1lcnJvciB7eydTMScgZG9lcyBub3QgcmVmZXIgdG8gYSB2YWx1ZX19CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGNvcHlpbiAoYXJndlsxXSkgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCB2YXJpYWJsZSBuYW1lfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgY29weWluKGkpIC8vIGV4cGVjdGVkLWVycm9yIHt7Y29weWluIHZhcmlhYmxlIG11c3QgYmUgdGhyZWFkcHJpdmF0ZX19CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGNvcHlpbihtKSAvLyBleHBlY3RlZC1lcnJvciB7e2NvcHlpbiB2YXJpYWJsZSBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSwgdW5hbWJpZ3VvdXMgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgY29weWluKFNUPGludD46OnMpIC8vIGV4cGVjdGVkLWVycm9yIHt7Y29weWluIHZhcmlhYmxlIG11c3QgYmUgdGhyZWFkcHJpdmF0ZX19CisgIGZvbygpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9PcGVuTVAvcGFyYWxsZWxfZGVmYXVsdF9tZXNzYWdlcy5jcHAgYi90ZXN0L09wZW5NUC9wYXJhbGxlbF9kZWZhdWx0X21lc3NhZ2VzLmNwcAppbmRleCBjYmM2YTczLi42MDE0Y2RmIDEwMDY0NAotLS0gYS90ZXN0L09wZW5NUC9wYXJhbGxlbF9kZWZhdWx0X21lc3NhZ2VzLmNwcAorKysgYi90ZXN0L09wZW5NUC9wYXJhbGxlbF9kZWZhdWx0X21lc3NhZ2VzLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mb3Blbm1wIC1mZXJyb3ItbGltaXQgMTAwIC1vIC0gJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mb3Blbm1wPWxpYmlvbXA1IC1mZXJyb3ItbGltaXQgMTAwIC1vIC0gJXMKIAogdm9pZCBmb28oKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9PcGVuTVAvcGFyYWxsZWxfZmlyc3Rwcml2YXRlX21lc3NhZ2VzLmNwcCBiL3Rlc3QvT3Blbk1QL3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZV9tZXNzYWdlcy5jcHAKaW5kZXggNzgwMDU5ZS4uOWRmNDVjNiAxMDA2NDQKLS0tIGEvdGVzdC9PcGVuTVAvcGFyYWxsZWxfZmlyc3Rwcml2YXRlX21lc3NhZ2VzLmNwcAorKysgYi90ZXN0L09wZW5NUC9wYXJhbGxlbF9maXJzdHByaXZhdGVfbWVzc2FnZXMuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXAgLWZlcnJvci1saW1pdCAxMDAgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mb3Blbm1wPWxpYmlvbXA1IC1mZXJyb3ItbGltaXQgMTAwICVzCiAKIHZvaWQgZm9vKCkgewogfQpkaWZmIC0tZ2l0IGEvdGVzdC9PcGVuTVAvcGFyYWxsZWxfaWZfbWVzc2FnZXMuY3BwIGIvdGVzdC9PcGVuTVAvcGFyYWxsZWxfaWZfbWVzc2FnZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTk2OTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L09wZW5NUC9wYXJhbGxlbF9pZl9tZXNzYWdlcy5jcHAKQEAgLTAsMCArMSw0NiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXA9bGliaW9tcDUgLWZlcnJvci1saW1pdCAxMDAgJXMKKwordm9pZCBmb28oKSB7Cit9CisKK2Jvb2wgZm9vYm9vbChpbnQgYXJnYykgeworICByZXR1cm4gYXJnYzsKK30KKworc3RydWN0IFMxOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTPiAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CitpbnQgdG1haW4oVCBhcmdjLCBTICoqYXJndikgeworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZiAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcoJyBhZnRlciAnaWYnfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYgKCAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGV4cHJlc3Npb259fSBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICcoJ319CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGlmICgpIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgZXhwcmVzc2lvbn19CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGlmIChhcmdjIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYgKGFyZ2MpKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBhcmUgaWdub3JlZH19CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGlmIChhcmdjID4gMCA/IGFyZ3ZbMV0gOiBhcmd2WzJdKQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZiAoZm9vYm9vbChhcmdjKSksIGlmICh0cnVlKSAvLyBleHBlY3RlZC1lcnJvciB7e2RpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGNhbm5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgJ2lmJyBjbGF1c2V9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZiAoUykgLy8gZXhwZWN0ZWQtZXJyb3Ige3snUycgZG9lcyBub3QgcmVmZXIgdG8gYSB2YWx1ZX19CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGlmIChhcmd2WzFdPTIpIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYgKGFyZ2MgYXJnYykgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZihhcmdjKQorICBmb28oKTsKKworICByZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGlmIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJygnIGFmdGVyICdpZid9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZiAoIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgZXhwcmVzc2lvbn19IGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYgKCkgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBleHByZXNzaW9ufX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYgKGFyZ2MgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZiAoYXJnYykpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSB0b2tlbnMgYXQgdGhlIGVuZCBvZiAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGFyZSBpZ25vcmVkfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYgKGFyZ2MgPiAwID8gYXJndlsxXSA6IGFyZ3ZbMl0pCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGlmIChmb29ib29sKGFyZ2MpKSwgaWYgKHRydWUpIC8vIGV4cGVjdGVkLWVycm9yIHt7ZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBwYXJhbGxlbCcgY2Fubm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSAnaWYnIGNsYXVzZX19CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGlmIChTMSkgLy8gZXhwZWN0ZWQtZXJyb3Ige3snUzEnIGRvZXMgbm90IHJlZmVyIHRvIGEgdmFsdWV9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZiAoYXJndlsxXT0yKSAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICcoJ319CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGlmIChhcmdjIGFyZ2MpIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYgKDEgMCkgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBpZihpZih0bWFpbihhcmdjLCBhcmd2KSAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGV4cHJlc3Npb259fSBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICcoJ319CisgIGZvbygpOworCisgIHJldHVybiB0bWFpbihhcmdjLCBhcmd2KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvT3Blbk1QL3BhcmFsbGVsX21lc3NhZ2VzLmNwcCBiL3Rlc3QvT3Blbk1QL3BhcmFsbGVsX21lc3NhZ2VzLmNwcAppbmRleCBkOTkxY2NmLi4xZTBlZGJjIDEwMDY0NAotLS0gYS90ZXN0L09wZW5NUC9wYXJhbGxlbF9tZXNzYWdlcy5jcHAKKysrIGIvdGVzdC9PcGVuTVAvcGFyYWxsZWxfbWVzc2FnZXMuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXAgLWZlcnJvci1saW1pdCAxMDAgLXN0ZD1jKysxMSAtbyAtICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtZm9wZW5tcD1saWJpb21wNSAtZmVycm9yLWxpbWl0IDEwMCAtc3RkPWMrKzExIC1vIC0gJXMKIAogdm9pZCBmb28oKSB7CiB9CkBAIC02LDggKzYsMjEgQEAKICNwcmFnbWEgb21wIHBhcmFsbGVsIC8vIGV4cGVjdGVkLWVycm9yIHt7dW5leHBlY3RlZCBPcGVuTVAgZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBwYXJhbGxlbCd9fQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBhcmUgaWdub3JlZH19CisgIGZvbygpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCAoIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSB0b2tlbnMgYXQgdGhlIGVuZCBvZiAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGFyZSBpZ25vcmVkfX0KKyAgZm9vKCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIFsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHRva2VucyBhdCB0aGUgZW5kIG9mICcjcHJhZ21hIG9tcCBwYXJhbGxlbCcgYXJlIGlnbm9yZWR9fQorICBmb28oKTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgXSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBhcmUgaWdub3JlZH19CisgIGZvbygpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCApIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSB0b2tlbnMgYXQgdGhlIGVuZCBvZiAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGFyZSBpZ25vcmVkfX0KKyAgZm9vKCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIH0gLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHRva2VucyBhdCB0aGUgZW5kIG9mICcjcHJhZ21hIG9tcCBwYXJhbGxlbCcgYXJlIGlnbm9yZWR9fQorICBmb28oKTsKICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKLSAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgdW5rbm93bigpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSB0b2tlbnMgYXQgdGhlIGVuZCBvZiAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGFyZSBpZ25vcmVkfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0ArMSB7e2V4dHJhIHRva2VucyBhdCB0aGUgZW5kIG9mICcjcHJhZ21hIG9tcCBwYXJhbGxlbCcgYXJlIGlnbm9yZWR9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCB1bmtub3duKCkKICAgZm9vKCk7CiAgIEwxOgogICAgIGZvbygpOwpkaWZmIC0tZ2l0IGEvdGVzdC9PcGVuTVAvcGFyYWxsZWxfbnVtX3RocmVhZHNfbWVzc2FnZXMuY3BwIGIvdGVzdC9PcGVuTVAvcGFyYWxsZWxfbnVtX3RocmVhZHNfbWVzc2FnZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhY2NhNWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L09wZW5NUC9wYXJhbGxlbF9udW1fdGhyZWFkc19tZXNzYWdlcy5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXA9bGliaW9tcDUgLWZlcnJvci1saW1pdCAxMDAgJXMKKwordm9pZCBmb28oKSB7Cit9CisKK2Jvb2wgZm9vYm9vbChpbnQgYXJnYykgeworICByZXR1cm4gYXJnYzsKK30KKworc3RydWN0IFMxOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CisKK3RlbXBsYXRlIDxjbGFzcyBULCB0eXBlbmFtZSBTLCBpbnQgTj4gLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorVCB0bWFpbihUIGFyZ2MsIFMgKiphcmd2KSB7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJygnIGFmdGVyICdudW1fdGhyZWFkcyd9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyAoIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgZXhwcmVzc2lvbn19IGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMgKCkgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBleHByZXNzaW9ufX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMgKGFyZ2MgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyAoYXJnYykpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSB0b2tlbnMgYXQgdGhlIGVuZCBvZiAnI3ByYWdtYSBvbXAgcGFyYWxsZWwnIGFyZSBpZ25vcmVkfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMgKChhcmdjID4gMCkgPyBhcmd2WzFdIDogYXJndlsyXSkgLy8gZXhwZWN0ZWQtZXJyb3IgMiB7e2V4cHJlc3Npb24gbXVzdCBoYXZlIGludGVncmFsIG9yIHVuc2NvcGVkIGVudW1lcmF0aW9uIHR5cGUsIG5vdCAnY2hhciAqJ319CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzIChmb29ib29sKGFyZ2MpKSwgbnVtX3RocmVhZHMgKHRydWUpLCBudW1fdGhyZWFkcyAoLTUpIC8vIGV4cGVjdGVkLWVycm9yIDIge3tkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gb25lICdudW1fdGhyZWFkcycgY2xhdXNlfX0gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCB0byAnbnVtX3RocmVhZHMnIGNsYXVzZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZX19CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzIChTKSAvLyBleHBlY3RlZC1lcnJvciB7eydTJyBkb2VzIG5vdCByZWZlciB0byBhIHZhbHVlfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMgKGFyZ3ZbMV09MikgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fSBleHBlY3RlZC1lcnJvciAyIHt7ZXhwcmVzc2lvbiBtdXN0IGhhdmUgaW50ZWdyYWwgb3IgdW5zY29wZWQgZW51bWVyYXRpb24gdHlwZSwgbm90ICdjaGFyIConfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMgKGFyZ2MpCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzIChOKSAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHRvICdudW1fdGhyZWFkcycgY2xhdXNlIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlfX0KKyAgZm9vKCk7CisKKyAgcmV0dXJuIGFyZ2M7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcoJyBhZnRlciAnbnVtX3RocmVhZHMnfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMgKCAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGV4cHJlc3Npb259fSBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICcoJ319CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzICgpIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgZXhwcmVzc2lvbn19CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzIChhcmdjIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMgKGFyZ2MpKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBhcmUgaWdub3JlZH19CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzIChhcmdjID4gMCA/IGFyZ3ZbMV0gOiBhcmd2WzJdKSAvLyBleHBlY3RlZC1lcnJvciB7e2ludGVncmFsIH19CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzIChmb29ib29sKGFyZ2MpKSwgbnVtX3RocmVhZHMgKHRydWUpLCBudW1fdGhyZWFkcyAoLTUpIC8vIGV4cGVjdGVkLWVycm9yIDIge3tkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHBhcmFsbGVsJyBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gb25lICdudW1fdGhyZWFkcycgY2xhdXNlfX0gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCB0byAnbnVtX3RocmVhZHMnIGNsYXVzZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZX19CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzIChTMSkgLy8gZXhwZWN0ZWQtZXJyb3Ige3snUzEnIGRvZXMgbm90IHJlZmVyIHRvIGEgdmFsdWV9fQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyAoYXJndlsxXT0yKSAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICcoJ319IGV4cGVjdGVkLWVycm9yIHt7ZXhwcmVzc2lvbiBtdXN0IGhhdmUgaW50ZWdyYWwgb3IgdW5zY29wZWQgZW51bWVyYXRpb24gdHlwZSwgbm90ICdjaGFyIConfX0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMgKG51bV90aHJlYWRzKHRtYWluPGludCwgY2hhciwgLTE+KGFyZ2MsIGFyZ3YpIC8vIGV4cGVjdGVkLWVycm9yIDIge3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIDIge3t0byBtYXRjaCB0aGlzICcoJ319IGV4cGVjdGVkLW5vdGUge3tpbiBpbnN0YW50aWF0aW9uIG9mIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uICd0bWFpbjxpbnQsIGNoYXIsIC0xPicgcmVxdWVzdGVkIGhlcmV9fQorICBmb28oKTsKKworICByZXR1cm4gdG1haW48aW50LCBjaGFyLCAzPihhcmdjLCBhcmd2KTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2luIGluc3RhbnRpYXRpb24gb2YgZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gJ3RtYWluPGludCwgY2hhciwgMz4nIHJlcXVlc3RlZCBoZXJlfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvT3Blbk1QL3BhcmFsbGVsX3ByaXZhdGVfbWVzc2FnZXMuY3BwIGIvdGVzdC9PcGVuTVAvcGFyYWxsZWxfcHJpdmF0ZV9tZXNzYWdlcy5jcHAKaW5kZXggMjAzN2Q1Ni4uNmRjNTVlNSAxMDA2NDQKLS0tIGEvdGVzdC9PcGVuTVAvcGFyYWxsZWxfcHJpdmF0ZV9tZXNzYWdlcy5jcHAKKysrIGIvdGVzdC9PcGVuTVAvcGFyYWxsZWxfcHJpdmF0ZV9tZXNzYWdlcy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtZm9wZW5tcCAtZmVycm9yLWxpbWl0IDEwMCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXA9bGliaW9tcDUgLWZlcnJvci1saW1pdCAxMDAgJXMKIAogdm9pZCBmb28oKSB7CiB9CmRpZmYgLS1naXQgYS90ZXN0L09wZW5NUC9wYXJhbGxlbF9zaGFyZWRfbWVzc2FnZXMuY3BwIGIvdGVzdC9PcGVuTVAvcGFyYWxsZWxfc2hhcmVkX21lc3NhZ2VzLmNwcAppbmRleCAyMTFkMzkyLi44MzYzOTg5IDEwMDY0NAotLS0gYS90ZXN0L09wZW5NUC9wYXJhbGxlbF9zaGFyZWRfbWVzc2FnZXMuY3BwCisrKyBiL3Rlc3QvT3Blbk1QL3BhcmFsbGVsX3NoYXJlZF9tZXNzYWdlcy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtZm9wZW5tcCAtZmVycm9yLWxpbWl0IDEwMCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXA9bGliaW9tcDUgLWZlcnJvci1saW1pdCAxMDAgJXMKIAogdm9pZCBmb28oKSB7CiB9CmRpZmYgLS1naXQgYS90ZXN0L09wZW5NUC9wcmVkZWZpbmVkX21hY3JvLmMgYi90ZXN0L09wZW5NUC9wcmVkZWZpbmVkX21hY3JvLmMKaW5kZXggM2E4MTE4Ni4uYzk4MjljZSAxMDA2NDQKLS0tIGEvdGVzdC9PcGVuTVAvcHJlZGVmaW5lZF9tYWNyby5jCisrKyBiL3Rlc3QvT3Blbk1QL3ByZWRlZmluZWRfbWFjcm8uYwpAQCAtMSwzMiArMSwzMiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mb3Blbm1wIC12ZXJpZnkgLURGT1BFTk1QIC1vIC0gJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm9wZW5tcD1saWJpb21wNSAtdmVyaWZ5IC1ERk9QRU5NUCAtbyAtICVzCiAvLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtbyAtICVzCiAvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwogI2lmZGVmIEZPUEVOTVAKLS8vIC1mb3Blbm1wIG9wdGlvbiBpcyBzcGVjaWZpZWQKKy8vIC1mb3Blbm1wPWxpYmlvbXA1IG9wdGlvbiBpcyBzcGVjaWZpZWQKICNpZm5kZWYgX09QRU5NUAogI2Vycm9yICJObyBfT1BFTk1QIG1hY3JvIGlzIGRlZmluZWQgd2l0aCAtZm9wZW5tcCBvcHRpb24iCi0jZWxzaWYgX09QRU5NUCAhPSAyMDExMDcKKyNlbHNpZiBfT1BFTk1QICE9IDIwMTMwNwogI2Vycm9yICJfT1BFTk1QIGhhcyBpbmNvcnJlY3QgdmFsdWUiCiAjZW5kaWYgLy9fT1BFTk1QCiAjZWxzZQotLy8gTm8gLWZvcGVubXAgb3B0aW9uIGlzIHNwZWNpZmllZAorLy8gTm8gLWZvcGVubXA9bGliaW9tcDUgb3B0aW9uIGlzIHNwZWNpZmllZAogI2lmZGVmIF9PUEVOTVAKICNlcnJvciAiX09QRU5NUCBtYWNybyBpcyBkZWZpbmVkIHdpdGhvdXQgLWZvcGVubXAgb3B0aW9uIgogI2VuZGlmIC8vIF9PUEVOTVAKICNlbmRpZiAvLyBGT1BFTk1QCiAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm9wZW5tcCAtdmVyaWZ5IC1ERk9QRU5NUCAtbyAtICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZvcGVubXA9bGliaW9tcDUgLXZlcmlmeSAtREZPUEVOTVAgLW8gLSAlcwogLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLW8gLSAlcwogLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKICNpZmRlZiBGT1BFTk1QCi0vLyAtZm9wZW5tcCBvcHRpb24gaXMgc3BlY2lmaWVkCisvLyAtZm9wZW5tcD1saWJpb21wNSBvcHRpb24gaXMgc3BlY2lmaWVkCiAjaWZuZGVmIF9PUEVOTVAKICNlcnJvciAiTm8gX09QRU5NUCBtYWNybyBpcyBkZWZpbmVkIHdpdGggLWZvcGVubXAgb3B0aW9uIgotI2Vsc2lmIF9PUEVOTVAgIT0gMjAxMTA3CisjZWxzaWYgX09QRU5NUCAhPSAyMDEzMDcKICNlcnJvciAiX09QRU5NUCBoYXMgaW5jb3JyZWN0IHZhbHVlIgogI2VuZGlmIC8vIF9PUEVOTVAKICNlbHNlCi0vLyBObyAtZm9wZW5tcCBvcHRpb24gaXMgc3BlY2lmaWVkCisvLyBObyAtZm9wZW5tcD1saWJpb21wNSBvcHRpb24gaXMgc3BlY2lmaWVkCiAjaWZkZWYgX09QRU5NUAogI2Vycm9yICJfT1BFTk1QIG1hY3JvIGlzIGRlZmluZWQgd2l0aG91dCAtZm9wZW5tcCBvcHRpb24iCiAjZW5kaWYgLy8gX09QRU5NUApkaWZmIC0tZ2l0IGEvdGVzdC9PcGVuTVAvc2ltZF9hc3RfcHJpbnQuY3BwIGIvdGVzdC9PcGVuTVAvc2ltZF9hc3RfcHJpbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMWZjY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L09wZW5NUC9zaW1kX2FzdF9wcmludC5jcHAKQEAgLTAsMCArMSwxMTMgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mb3Blbm1wPWxpYmlvbXA1IC1hc3QtcHJpbnQgJXMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm9wZW5tcD1saWJpb21wNSAteCBjKysgLXN0ZD1jKysxMSAtZW1pdC1wY2ggLW8gJXQgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm9wZW5tcD1saWJpb21wNSAtc3RkPWMrKzExIC1pbmNsdWRlLXBjaCAldCAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLWFzdC1wcmludCB8IEZpbGVDaGVjayAlcworLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKKworI2lmbmRlZiBIRUFERVIKKyNkZWZpbmUgSEVBREVSCisKK3ZvaWQgZm9vKCkge30KK2ludCBnX2luZCA9IDE7Cit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBOPiBUIHJlZHVjdChUKiBhcnIsIE4gbnVtKSB7CisgIE4gaTsKKyAgTiBpbmQ7CisgIE4gbXlpbmQ7CisgIFQgc3VtID0gKFQpMDsKKy8vIENIRUNLOiBUIHN1bSA9IChUKTA7CisjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUobXlpbmQsIGdfaW5kKQorLy8gQ0hFQ0stTkVYVDogI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlKG15aW5kLGdfaW5kKQorICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICBteWluZCA9IGluZDsKKyAgICBUIGN1ciA9IGFycltteWluZF07CisgICAgaW5kICs9IGdfaW5kOworICAgIHN1bSArPSBjdXI7CisgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgVD4gc3RydWN0IFMgeworICBTKGNvbnN0IFQgJmEpCisgICAgOm1fYShhKQorICB7fQorICBUIHJlc3VsdChUICp2KSBjb25zdCB7CisgICAgVCByZXM7CisgICAgVCB2YWw7CisvLyBDSEVDSzogVCByZXM7CisvLyBDSEVDSzogVCB2YWw7CisgICAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlKHZhbCkgIHNhZmVsZW4oNykKKy8vIENIRUNLLU5FWFQ6ICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZSh2YWwpIHNhZmVsZW4oNykKKyAgICBmb3IgKFQgaSA9IDc7IGkgPCBtX2E7ICsraSkgeworICAgICAgdmFsID0gdltpLTddICsgbV9hOworICAgICAgcmVzID0gdmFsOworICAgIH0KKyAgICBjb25zdCBUIGNsZW4gPSAzOworLy8gQ0hFQ0s6IFQgY2xlbiA9IDM7CisgICAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuKGNsZW4tMSkKKy8vIENIRUNLLU5FWFQ6ICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbihjbGVuIC0gMSkKKyAgICBmb3IoVCBpID0gY2xlbisyOyBpIDwgMjA7ICsraSkgeworLy8gQ0hFQ0stTkVYVDogZm9yIChUIGkgPSBjbGVuICsgMjsgaSA8IDIwOyArK2kpIHsKKyAgICAgIHZbaV0gPSB2W3YtY2xlbl0gKyAxOworLy8gQ0hFQ0stTkVYVDogdltpXSA9IHZbdiAtIGNsZW5dICsgMTsKKyAgICB9CisvLyBDSEVDSy1ORVhUOiB9CisgICAgcmV0dXJuIHJlczsKKyAgfQorICB+UygpCisgIHt9CisgIFQgbV9hOworfTsKKwordGVtcGxhdGU8aW50IExFTj4gc3RydWN0IFMyIHsKKyAgc3RhdGljIHZvaWQgZnVuYyhpbnQgbiwgZmxvYXQgKmEsIGZsb2F0ICpiLCBmbG9hdCAqYykgeworI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuKExFTikKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBjW2ldID0gYVtpXSArIGJbaV07CisgICAgfQorICB9Cit9OworCisvLyBTMjw0Pjo6ZnVuYyBpcyBjYWxsZWQgYmVsb3cgaW4gbWFpbi4KKy8vIENIRUNLOiB0ZW1wbGF0ZSA8aW50IExFTiA9IDQ+IHN0cnVjdCBTMiB7CisvLyBDSEVDSy1ORVhUOiBzdGF0aWMgdm9pZCBmdW5jKGludCBuLCBmbG9hdCAqYSwgZmxvYXQgKmIsIGZsb2F0ICpjKSAgICAgeworLy8gQ0hFQ0stTkVYVDogI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuKDQpCisvLyBDSEVDSy1ORVhUOiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisvLyBDSEVDSy1ORVhUOiAgICAgY1tpXSA9IGFbaV0gKyBiW2ldOworLy8gQ0hFQ0stTkVYVDogICB9CisvLyBDSEVDSy1ORVhUOiB9CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgaW50IGIgPSBhcmdjLCBjLCBkLCBlLCBmLCBnOworICBpbnQgazE9MCxrMj0wOworICBzdGF0aWMgaW50ICphOworLy8gQ0hFQ0s6IHN0YXRpYyBpbnQgKmE7CisjcHJhZ21hIG9tcCBzaW1kCisvLyBDSEVDSy1ORVhUOiAjcHJhZ21hIG9tcCBzaW1kCisgIGZvciAoaW50IGk9MDsgaSA8IDI7ICsraSkqYT0yOworLy8gQ0hFQ0stTkVYVDogZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpCisvLyBDSEVDSy1ORVhUOiAqYSA9IDI7CisjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUoYXJnYywgYikKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKQorICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyArK2opIHtmb28oKTsgazEgKz0gODsgazIgKz0gODt9CisvLyBDSEVDSy1ORVhUOiAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUoYXJnYyxiKQorLy8gQ0hFQ0stTkVYVDogZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKQorLy8gQ0hFQ0stTkVYVDogZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgKytqKSB7CisvLyBDSEVDSy1ORVhUOiBmb28oKTsKKy8vIENIRUNLLU5FWFQ6IGsxICs9IDg7CisvLyBDSEVDSy1ORVhUOiBrMiArPSA4OworLy8gQ0hFQ0stTkVYVDogfQorICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpZm9vKCk7CisvLyBDSEVDSy1ORVhUOiBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpCisvLyBDSEVDSy1ORVhUOiBmb28oKTsKKyAgY29uc3QgaW50IENMRU4gPSA0OworLy8gQ0hFQ0stTkVYVDogY29uc3QgaW50IENMRU4gPSA0OworICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4oQ0xFTikKKy8vIENIRUNLLU5FWFQ6ICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbihDTEVOKQorICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpZm9vKCk7CisvLyBDSEVDSy1ORVhUOiBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpCisvLyBDSEVDSy1ORVhUOiBmb28oKTsKKworICBmbG9hdCBhcnJbMTZdOworICBTMjw0Pjo6ZnVuYygwLGFycixhcnIsYXJyKTsKKyAgcmV0dXJuICgwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L09wZW5NUC9zaW1kX21pc2NfbWVzc2FnZXMuYyBiL3Rlc3QvT3Blbk1QL3NpbWRfbWlzY19tZXNzYWdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDBkMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L09wZW5NUC9zaW1kX21pc2NfbWVzc2FnZXMuYwpAQCAtMCwwICsxLDE5MyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLWZvcGVubXA9bGliaW9tcDUgLXZlcmlmeSAlcworCisvLyBleHBlY3RlZC1lcnJvckArMSB7e3VuZXhwZWN0ZWQgT3Blbk1QIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgc2ltZCd9fQorI3ByYWdtYSBvbXAgc2ltZAorCisvLyBleHBlY3RlZC1lcnJvckArMSB7e3VuZXhwZWN0ZWQgT3Blbk1QIGRpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgc2ltZCd9fQorI3ByYWdtYSBvbXAgc2ltZCBmb28KKworLy8gZXhwZWN0ZWQtZXJyb3JAKzEge3t1bmV4cGVjdGVkIE9wZW5NUCBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHNpbWQnfX0KKyNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbig0KQorCit2b2lkIHRlc3Rfbm9fY2xhdXNlKCkKK3sKKyAgaW50IGk7CisgICNwcmFnbWEgb21wIHNpbWQKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKworICAvLyBleHBlY3RlZC1lcnJvckArMiB7e3N0YXRlbWVudCBhZnRlciAnI3ByYWdtYSBvbXAgc2ltZCcgbXVzdCBiZSBhIGZvciBsb29wfX0KKyAgI3ByYWdtYSBvbXAgc2ltZAorICArK2k7Cit9CisKK3ZvaWQgdGVzdF9icmFuY2hfcHJvdGVjdGVkX3Njb3BlKCkKK3sKKyAgaW50IGkgPSAwOworTDE6CisgICsraTsKKworICBpbnQgeFsyNF07CisKKyAgI3ByYWdtYSBvbXAgc2ltZAorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGlmIChpID09IDUpCisgICAgICBnb3RvIEwxOyAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bmRlY2xhcmVkIGxhYmVsICdMMSd9fQorICAgIGVsc2UgaWYgKGkgPT0gNikKKyAgICAgIHJldHVybjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW5ub3QgcmV0dXJuIGZyb20gT3Blbk1QIHJlZ2lvbn19CisgICAgZWxzZSBpZiAoaSA9PSA3KQorICAgICAgZ290byBMMjsKKyAgICBlbHNlIGlmIChpID09IDgpIHsKK0wyOgorICAgICAgeFtpXSsrOworICAgIH0KKyAgfQorCisgIGlmICh4WzBdID09IDApCisgICAgZ290byBMMjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2Ugb2YgdW5kZWNsYXJlZCBsYWJlbCAnTDInfX0KKyAgZWxzZSBpZiAoeFsxXSA9PSAxKQorICAgIGdvdG8gTDE7Cit9CisKK3ZvaWQgdGVzdF9pbnZhbGlkX2NsYXVzZSgpCit7CisgIGludCBpOworICAvLyBleHBlY3RlZC13YXJuaW5nQCsxIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHNpbWQnIGFyZSBpZ25vcmVkfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBmb28gYmFyCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSA7Cit9CisKK3ZvaWQgdGVzdF9ub25faWRlbnRpZmllcnMoKQoreworICBpbnQgaSwgeDsKKworICAvLyBleHBlY3RlZC13YXJuaW5nQCsxIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHNpbWQnIGFyZSBpZ25vcmVkfX0KKyAgI3ByYWdtYSBvbXAgc2ltZDsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzIge3t1bmV4cGVjdGVkIE9wZW5NUCBjbGF1c2UgJ2ZpcnN0cHJpdmF0ZScgaW4gZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBzaW1kJ319CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdAKzEge3tleHRyYSB0b2tlbnMgYXQgdGhlIGVuZCBvZiAnI3ByYWdtYSBvbXAgc2ltZCcgYXJlIGlnbm9yZWR9fQorICAjcHJhZ21hIG9tcCBzaW1kIGZpcnN0cHJpdmF0ZSh4KTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKworICAvLyBleHBlY3RlZC13YXJuaW5nQCsxIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHNpbWQnIGFyZSBpZ25vcmVkfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlKHgpOworICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgOworCisgIC8vIGV4cGVjdGVkLXdhcm5pbmdAKzEge3tleHRyYSB0b2tlbnMgYXQgdGhlIGVuZCBvZiAnI3ByYWdtYSBvbXAgc2ltZCcgYXJlIGlnbm9yZWR9fQorICAjcHJhZ21hIG9tcCBzaW1kICwgcHJpdmF0ZSh4KTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKK30KKworZXh0ZXJuIGludCBmb28oKTsKK3ZvaWQgdGVzdF9zYWZlbGVuKCkKK3sKKyAgaW50IGk7CisgIC8vIGV4cGVjdGVkLWVycm9yQCsxIHt7ZXhwZWN0ZWQgJygnfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSA7CisgIC8vIGV4cGVjdGVkLWVycm9yQCsxIHt7ZXhwZWN0ZWQgZXhwcmVzc2lvbn19IGV4cGVjdGVkLWVycm9yQCsxIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZUArMSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuKAorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgOworICAvLyBleHBlY3RlZC1lcnJvckArMSB7e2V4cGVjdGVkIGV4cHJlc3Npb259fQorICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4oKQorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgOworICAvLyBleHBlY3RlZC1lcnJvckArMSB7e2V4cGVjdGVkIGV4cHJlc3Npb259fSBleHBlY3RlZC1lcnJvckArMSB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGVAKzEge3t0byBtYXRjaCB0aGlzICcoJ319CisgICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbigsCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSA7CisgIC8vIGV4cGVjdGVkLWVycm9yQCsxIHt7ZXhwZWN0ZWQgZXhwcmVzc2lvbn19ICBleHBlY3RlZC1lcnJvckArMSB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGVAKzEge3t0byBtYXRjaCB0aGlzICcoJ319CisgICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbigsKQorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgOworICAvLyBleHBlY3RlZC13YXJuaW5nQCsyIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHNpbWQnIGFyZSBpZ25vcmVkfX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzEge3tleHBlY3RlZCAnKCd9fQorICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4gNCkKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzIge3tleHBlY3RlZCAnKSd9fQorICAvLyBleHBlY3RlZC1ub3RlQCsxIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fQorICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4oNAorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgOworICAvLyBleHBlY3RlZC1lcnJvckArMiB7e2V4cGVjdGVkICcpJ319CisgIC8vIGV4cGVjdGVkLW5vdGVAKzEge3t0byBtYXRjaCB0aGlzICcoJ319CisgICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbig0LAorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgOworICAvLyBleHBlY3RlZC1lcnJvckArMiB7e2V4cGVjdGVkICcpJ319CisgIC8vIGV4cGVjdGVkLW5vdGVAKzEge3t0byBtYXRjaCB0aGlzICcoJ319CisgICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbig0LCkKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKyAgLy8geHhwZWN0ZWQtZXJyb3JAKzEge3tleHBlY3RlZCBleHByZXNzaW9ufX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuKDQpCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSA7CisgIC8vIGV4cGVjdGVkLWVycm9yQCsyIHt7ZXhwZWN0ZWQgJyknfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUArMSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuKDQgNCkKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzIge3tleHBlY3RlZCAnKSd9fQorICAvLyBleHBlY3RlZC1ub3RlQCsxIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fQorICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4oNCwsNCkKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuKDQpCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSA7CisgIC8vIGV4cGVjdGVkLWVycm9yQCsyIHt7ZXhwZWN0ZWQgJyknfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUArMSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuKDQsOCkKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzEge3tleHByZXNzaW9uIGlzIG5vdCBhbiBpbnRlZ2VyIGNvbnN0YW50IGV4cHJlc3Npb259fQorICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4oMi41KQorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSk7CisgIC8vIGV4cGVjdGVkLWVycm9yQCsxIHt7ZXhwcmVzc2lvbiBpcyBub3QgYW4gaW50ZWdlciBjb25zdGFudCBleHByZXNzaW9ufX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuKGZvbygpKQorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSk7CisgIC8vIGV4cGVjdGVkLWVycm9yQCsxIHt7YXJndW1lbnQgdG8gJ3NhZmVsZW4nIGNsYXVzZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZX19CisgICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbigtNSkKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpOworICAvLyBleHBlY3RlZC1lcnJvckArMSB7e2FyZ3VtZW50IHRvICdzYWZlbGVuJyBjbGF1c2UgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWV9fQorICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4oMCkKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpOworICAvLyBleHBlY3RlZC1lcnJvckArMSB7e2FyZ3VtZW50IHRvICdzYWZlbGVuJyBjbGF1c2UgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWV9fQorICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4oNS01KQorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSk7Cit9CisKK3ZvaWQgdGVzdF9wcml2YXRlKCkKK3sKKyAgaW50IGk7CisgIC8vIGV4cGVjdGVkLWVycm9yQCsyIHt7ZXhwZWN0ZWQgZXhwcmVzc2lvbn19CisgIC8vIGV4cGVjdGVkLWVycm9yQCsxIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZUArMSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlKAorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgOworICAvLyBleHBlY3RlZC1lcnJvckArMiB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGVAKzIge3t0byBtYXRjaCB0aGlzICcoJ319CisgIC8vIGV4cGVjdGVkLWVycm9yQCsxIDIge3tleHBlY3RlZCBleHByZXNzaW9ufX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlKCwKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzEgMiB7e2V4cGVjdGVkIGV4cHJlc3Npb259fQorICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUoLCkKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzEge3tleHBlY3RlZCBleHByZXNzaW9ufX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlKCkKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzEge3tleHBlY3RlZCBleHByZXNzaW9ufX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlKGludCkKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzEge3tleHBlY3RlZCB2YXJpYWJsZSBuYW1lfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlKDApCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSA7CisKKyAgaW50IHgsIHksIHo7CisgICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZSh4KQorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgOworICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUoeCwgeSkKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIDsKKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlKHgsIHksIHopCisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgeCA9IHkgKiBpICsgejsKKyAgfQorfQorCit2b2lkIHRlc3RfZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IGk7CisgIC8vIGV4cGVjdGVkLWVycm9yQCszIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZUArMyB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzIge3t1bmV4cGVjdGVkIE9wZW5NUCBjbGF1c2UgJ2ZpcnN0cHJpdmF0ZScgaW4gZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBzaW1kJ319CisgIC8vIGV4cGVjdGVkLWVycm9yQCsxIHt7ZXhwZWN0ZWQgZXhwcmVzc2lvbn19CisgICNwcmFnbWEgb21wIHNpbWQgZmlyc3Rwcml2YXRlKAorICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgOworfQorCmRpZmYgLS1naXQgYS90ZXN0L09wZW5NUC9zaW1kX3ByaXZhdGVfbWVzc2FnZXMuY3BwIGIvdGVzdC9PcGVuTVAvc2ltZF9wcml2YXRlX21lc3NhZ2VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWU0ZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9PcGVuTVAvc2ltZF9wcml2YXRlX21lc3NhZ2VzLmNwcApAQCAtMCwwICsxLDEzNCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXA9bGliaW9tcDUgJXMKKwordm9pZCBmb28oKSB7Cit9CisKK2Jvb2wgZm9vYm9vbChpbnQgYXJnYykgeworICByZXR1cm4gYXJnYzsKK30KKworc3RydWN0IFMxOyAvLyBleHBlY3RlZC1ub3RlIDIge3tkZWNsYXJlZCBoZXJlfX0gZXhwZWN0ZWQtbm90ZSAyIHt7Zm9yd2FyZCBkZWNsYXJhdGlvbiBvZiAnUzEnfX0KK2V4dGVybiBTMSBhOworY2xhc3MgUzIgeworICBtdXRhYmxlIGludCBhOworcHVibGljOgorICBTMigpOmEoMCkgeyB9Cit9OworY29uc3QgUzIgYjsKK2NvbnN0IFMyIGJhWzVdOworY2xhc3MgUzMgeworICBpbnQgYTsKK3B1YmxpYzoKKyAgUzMoKTphKDApIHsgfQorfTsKK2NvbnN0IFMzIGNhWzVdOworY2xhc3MgUzQgeyAvLyBleHBlY3RlZC1ub3RlIHt7J1M0JyBkZWNsYXJlZCBoZXJlfX0KKyAgaW50IGE7CisgIFM0KCk7CitwdWJsaWM6CisgIFM0KGludCB2KTphKHYpIHsgfQorfTsKK2NsYXNzIFM1IHsgLy8gZXhwZWN0ZWQtbm90ZSB7eydTNScgZGVjbGFyZWQgaGVyZX19CisgIGludCBhOworICBTNSgpOmEoMCkge30KK3B1YmxpYzoKKyAgUzUoaW50IHYpOmEodikgeyB9Cit9OworCitTMyBoOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShoKSAvLyBleHBlY3RlZC1ub3RlIDIge3tkZWZpbmVkIGFzIHRocmVhZHByaXZhdGUgb3IgdGhyZWFkIGxvY2FsfX0KKwordGVtcGxhdGU8Y2xhc3MgSSwgY2xhc3MgQz4gaW50IGZvb21haW4oSSBhcmdjLCBDICoqYXJndikgeworICBJIGUoNCk7CisgIEkgZyg1KTsKKyAgaW50IGk7CisgIGludCAmaiA9IGk7IC8vIGV4cGVjdGVkLW5vdGUge3snaicgZGVmaW5lZCBoZXJlfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJygnIGFmdGVyICdwcml2YXRlJ319CisgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSArK2s7CisgICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZSAoIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgZXhwcmVzc2lvbn19IGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spICsrazsKKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlICgpIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgZXhwcmVzc2lvbn19CisgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSArK2s7CisgICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZSAoYXJnYyAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICcoJ319CisgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSArK2s7CisgICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZSAoYXJnYywgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBleHByZXNzaW9ufX0gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fQorICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgKytrOworICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUgKGFyZ2MgPiAwID8gYXJndlsxXSA6IGFyZ3ZbMl0pIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgdmFyaWFibGUgbmFtZX19CisgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSArK2s7CisgICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZSAoYXJnYykKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spICsrazsKKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlIChTMSkgLy8gZXhwZWN0ZWQtZXJyb3Ige3snUzEnIGRvZXMgbm90IHJlZmVyIHRvIGEgdmFsdWV9fQorICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgKytrOworICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUgKGEsIGIpIC8vIGV4cGVjdGVkLWVycm9yIHt7cHJpdmF0ZSB2YXJpYWJsZSB3aXRoIGluY29tcGxldGUgdHlwZSAnUzEnfX0KKyAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spICsrazsKKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlIChhcmd2WzFdKSAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIHZhcmlhYmxlIG5hbWV9fQorICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgKytrOworICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUoZSwgZykKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spICsrazsKKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlKGgpIC8vIGV4cGVjdGVkLWVycm9yIHt7dGhyZWFkcHJpdmF0ZSBvciB0aHJlYWQgbG9jYWwgdmFyaWFibGUgY2Fubm90IGJlIHByaXZhdGV9fQorICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgKytrOworICAjcHJhZ21hIG9tcCBzaW1kIHNoYXJlZChpKSAvLyBleHBlY3RlZC1lcnJvciB7e3VuZXhwZWN0ZWQgT3Blbk1QIGNsYXVzZSAnc2hhcmVkJyBpbiBkaXJlY3RpdmUgJyNwcmFnbWEgb21wIHNpbWQnfX0KKyAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spICsrazsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCB2ID0gMDsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUoaSkKKyAgICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgeyBpID0gazsgdiArPSBpOyB9CisgIH0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGkpCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlKGopIC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnRzIG9mIE9wZW5NUCBjbGF1c2UgJ3ByaXZhdGUnIGNhbm5vdCBiZSBvZiByZWZlcmVuY2UgdHlwZX19CisgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSArK2s7CisgICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZShpKQorICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgKytrOworICByZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIFM0IGUoNCk7IC8vIGV4cGVjdGVkLW5vdGUge3snZScgZGVmaW5lZCBoZXJlfX0KKyAgUzUgZyg1KTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydnJyBkZWZpbmVkIGhlcmV9fQorICBpbnQgaTsKKyAgaW50ICZqID0gaTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydqJyBkZWZpbmVkIGhlcmV9fQorICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKCcgYWZ0ZXIgJ3ByaXZhdGUnfX0KKyAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spICsrazsKKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlICggLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBleHByZXNzaW9ufX0gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fQorICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgKytrOworICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUgKCkgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBleHByZXNzaW9ufX0KKyAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spICsrazsKKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlIChhcmdjIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spICsrazsKKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlIChhcmdjLCAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGV4cHJlc3Npb259fSBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICcoJ319CisgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSArK2s7CisgICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZSAoYXJnYyA+IDAgPyBhcmd2WzFdIDogYXJndlsyXSkgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCB2YXJpYWJsZSBuYW1lfX0KKyAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spICsrazsKKyAgI3ByYWdtYSBvbXAgc2ltZCBwcml2YXRlIChhcmdjKQorICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgKytrOworICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUgKFMxKSAvLyBleHBlY3RlZC1lcnJvciB7eydTMScgZG9lcyBub3QgcmVmZXIgdG8gYSB2YWx1ZX19CisgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSArK2s7CisgICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZSAoYSwgYikgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcml2YXRlIHZhcmlhYmxlIHdpdGggaW5jb21wbGV0ZSB0eXBlICdTMSd9fQorICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgKytrOworICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUgKGFyZ3ZbMV0pIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgdmFyaWFibGUgbmFtZX19CisgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSArK2s7CisgICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZShlLCBnKSAvLyBleHBlY3RlZC1lcnJvciAyIHt7cHJpdmF0ZSB2YXJpYWJsZSBtdXN0IGhhdmUgYW4gYWNjZXNzaWJsZSwgdW5hbWJpZ3VvdXMgZGVmYXVsdCBjb25zdHJ1Y3Rvcn19CisgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSArK2s7CisgICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZShoKSAvLyBleHBlY3RlZC1lcnJvciB7e3RocmVhZHByaXZhdGUgb3IgdGhyZWFkIGxvY2FsIHZhcmlhYmxlIGNhbm5vdCBiZSBwcml2YXRlfX0KKyAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spICsrazsKKyAgI3ByYWdtYSBvbXAgc2ltZCBzaGFyZWQoaSkgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1bmV4cGVjdGVkIE9wZW5NUCBjbGF1c2UgJ3NoYXJlZCcgaW4gZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBzaW1kJ319CisgIGZvciAoaW50IGsgPSAwOyBrIDwgYXJnYzsgKytrKSArK2s7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUoaSkKKyAgICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgKytrOworICB9CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChpKQorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgICNwcmFnbWEgb21wIHNpbWQgcHJpdmF0ZShqKSAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50cyBvZiBPcGVuTVAgY2xhdXNlICdwcml2YXRlJyBjYW5ub3QgYmUgb2YgcmVmZXJlbmNlIHR5cGV9fQorICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2M7ICsraykgKytrOworICAjcHJhZ21hIG9tcCBzaW1kIHByaXZhdGUoaSkKKyAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spICsrazsKKworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9PcGVuTVAvc2ltZF9zYWZlbGVuX21lc3NhZ2VzLmNwcCBiL3Rlc3QvT3Blbk1QL3NpbWRfc2FmZWxlbl9tZXNzYWdlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3ZTgwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvT3Blbk1QL3NpbWRfc2FmZWxlbl9tZXNzYWdlcy5jcHAKQEAgLTAsMCArMSw3OSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXA9bGliaW9tcDUgJXMKKwordm9pZCBmb28oKSB7Cit9CisKK2Jvb2wgZm9vYm9vbChpbnQgYXJnYykgeworICByZXR1cm4gYXJnYzsKK30KKworc3RydWN0IFMxOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CisKK3RlbXBsYXRlIDxjbGFzcyBULCB0eXBlbmFtZSBTLCBpbnQgTiwgaW50IFNUPiAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CitUIHRtYWluKFQgYXJnYywgUyAqKmFyZ3YpIHsgLy9leHBlY3RlZC1ub3RlIDIge3tkZWNsYXJlZCBoZXJlfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJygnIGFmdGVyICdzYWZlbGVuJ319CisgIGZvciAoaW50IGkgPSBTVDsgaSA8IE47IGkrKykgYXJndlswXVtpXSA9IGFyZ3ZbMF1baV0gLSBhcmd2WzBdW2ktU1RdOworICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4gKCAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGV4cHJlc3Npb259fSBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICcoJ319CisgIGZvciAoaW50IGkgPSBTVDsgaSA8IE47IGkrKykgYXJndlswXVtpXSA9IGFyZ3ZbMF1baV0gLSBhcmd2WzBdW2ktU1RdOworICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4gKCkgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBleHByZXNzaW9ufX0KKyAgZm9yIChpbnQgaSA9IFNUOyBpIDwgTjsgaSsrKSBhcmd2WzBdW2ldID0gYXJndlswXVtpXSAtIGFyZ3ZbMF1baS1TVF07CisgIC8vIGV4cGVjdGVkLWVycm9yQCszIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZUArMyB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzIgMiB7e2V4cHJlc3Npb24gaXMgbm90IGFuIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb259fQorICAvLyBleHBlY3RlZC1ub3RlQCsxIDIge3tyZWFkIG9mIG5vbi1jb25zdCB2YXJpYWJsZSAnYXJnYycgaXMgbm90IGFsbG93ZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9ufX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuIChhcmdjIAorICBmb3IgKGludCBpID0gU1Q7IGkgPCBOOyBpKyspIGFyZ3ZbMF1baV0gPSBhcmd2WzBdW2ldIC0gYXJndlswXVtpLVNUXTsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzEge3thcmd1bWVudCB0byAnc2FmZWxlbicgY2xhdXNlIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuIChTVCAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICcoJ319CisgIGZvciAoaW50IGkgPSBTVDsgaSA8IE47IGkrKykgYXJndlswXVtpXSA9IGFyZ3ZbMF1baV0gLSBhcmd2WzBdW2ktU1RdOworICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4gKDEpKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHNpbWQnIGFyZSBpZ25vcmVkfX0KKyAgZm9yIChpbnQgaSA9IFNUOyBpIDwgTjsgaSsrKSBhcmd2WzBdW2ldID0gYXJndlswXVtpXSAtIGFyZ3ZbMF1baS1TVF07CisgICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbiAoKFNUID4gMCkgPyAxICsgU1QgOiAyKQorICBmb3IgKGludCBpID0gU1Q7IGkgPCBOOyBpKyspIGFyZ3ZbMF1baV0gPSBhcmd2WzBdW2ldIC0gYXJndlswXVtpLVNUXTsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzMgMiB7e2RpcmVjdGl2ZSAnI3ByYWdtYSBvbXAgc2ltZCcgY2Fubm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSAnc2FmZWxlbicgY2xhdXNlfX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzIgMiB7e2FyZ3VtZW50IHRvICdzYWZlbGVuJyBjbGF1c2UgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWV9fQorICAvLyBleHBlY3RlZC1lcnJvckArMSAyIHt7ZXhwcmVzc2lvbiBpcyBub3QgYW4gaW50ZWdyYWwgY29uc3RhbnQgZXhwcmVzc2lvbn19CisgICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbiAoZm9vYm9vbChhcmdjKSksIHNhZmVsZW4gKHRydWUpLCBzYWZlbGVuICgtNSkKKyAgZm9yIChpbnQgaSA9IFNUOyBpIDwgTjsgaSsrKSBhcmd2WzBdW2ldID0gYXJndlswXVtpXSAtIGFyZ3ZbMF1baS1TVF07CisgICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbiAoUykgLy8gZXhwZWN0ZWQtZXJyb3Ige3snUycgZG9lcyBub3QgcmVmZXIgdG8gYSB2YWx1ZX19CisgIGZvciAoaW50IGkgPSBTVDsgaSA8IE47IGkrKykgYXJndlswXVtpXSA9IGFyZ3ZbMF1baV0gLSBhcmd2WzBdW2ktU1RdOworICAvLyBleHBlY3RlZC1lcnJvckArMSAyIHt7ZXhwcmVzc2lvbiBpcyBub3QgYW4gaW50ZWdyYWwgY29uc3RhbnQgZXhwcmVzc2lvbn19CisgICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbiAoYXJndlsxXT0yKSAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICcpJ319IGV4cGVjdGVkLW5vdGUge3t0byBtYXRjaCB0aGlzICcoJ319CisgIGZvciAoaW50IGkgPSBTVDsgaSA8IE47IGkrKykgYXJndlswXVtpXSA9IGFyZ3ZbMF1baV0gLSBhcmd2WzBdW2ktU1RdOworICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4gKDQpCisgIGZvciAoaW50IGkgPSBTVDsgaSA8IE47IGkrKykgYXJndlswXVtpXSA9IGFyZ3ZbMF1baV0gLSBhcmd2WzBdW2ktU1RdOworICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4gKE4pIC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgdG8gJ3NhZmVsZW4nIGNsYXVzZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZX19CisgIGZvciAoVCBpID0gU1Q7IGkgPCBOOyBpKyspIGFyZ3ZbMF1baV0gPSBhcmd2WzBdW2ldIC0gYXJndlswXVtpLVNUXTsKKyAgcmV0dXJuIGFyZ2M7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4gLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKCcgYWZ0ZXIgJ3NhZmVsZW4nfX0KKyAgZm9yIChpbnQgaSA9IDQ7IGkgPCAxMjsgaSsrKSBhcmd2WzBdW2ldID0gYXJndlswXVtpXSAtIGFyZ3ZbMF1baS00XTsKKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuICggLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBleHByZXNzaW9ufX0gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fQorICBmb3IgKGludCBpID0gNDsgaSA8IDEyOyBpKyspIGFyZ3ZbMF1baV0gPSBhcmd2WzBdW2ldIC0gYXJndlswXVtpLTRdOworICAjcHJhZ21hIG9tcCBzaW1kIHNhZmVsZW4gKCkgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBleHByZXNzaW9ufX0KKyAgZm9yIChpbnQgaSA9IDQ7IGkgPCAxMjsgaSsrKSBhcmd2WzBdW2ldID0gYXJndlswXVtpXSAtIGFyZ3ZbMF1baS00XTsKKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuICg0IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgZm9yIChpbnQgaSA9IDQ7IGkgPCAxMjsgaSsrKSBhcmd2WzBdW2ldID0gYXJndlswXVtpXSAtIGFyZ3ZbMF1baS00XTsKKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuICgyKzIpKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHNpbWQnIGFyZSBpZ25vcmVkfX0KKyAgZm9yIChpbnQgaSA9IDQ7IGkgPCAxMjsgaSsrKSBhcmd2WzBdW2ldID0gYXJndlswXVtpXSAtIGFyZ3ZbMF1baS00XTsKKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuIChmb29ib29sKDEpID4gMCA/IDEgOiAyKSAvLyBleHBlY3RlZC1lcnJvciB7e2V4cHJlc3Npb24gaXMgbm90IGFuIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb259fQorICBmb3IgKGludCBpID0gNDsgaSA8IDEyOyBpKyspIGFyZ3ZbMF1baV0gPSBhcmd2WzBdW2ldIC0gYXJndlswXVtpLTRdOworICAvLyBleHBlY3RlZC1lcnJvckArMyB7e2V4cHJlc3Npb24gaXMgbm90IGFuIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb259fQorICAvLyBleHBlY3RlZC1lcnJvckArMiAyIHt7ZGlyZWN0aXZlICcjcHJhZ21hIG9tcCBzaW1kJyBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gb25lICdzYWZlbGVuJyBjbGF1c2V9fQorICAvLyBleHBlY3RlZC1lcnJvckArMSAyIHt7YXJndW1lbnQgdG8gJ3NhZmVsZW4nIGNsYXVzZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZX19CisgICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbiAoZm9vYm9vbChhcmdjKSksIHNhZmVsZW4gKHRydWUpLCBzYWZlbGVuICgtNSkgCisgIGZvciAoaW50IGkgPSA0OyBpIDwgMTI7IGkrKykgYXJndlswXVtpXSA9IGFyZ3ZbMF1baV0gLSBhcmd2WzBdW2ktNF07CisgICNwcmFnbWEgb21wIHNpbWQgc2FmZWxlbiAoUzEpIC8vIGV4cGVjdGVkLWVycm9yIHt7J1MxJyBkb2VzIG5vdCByZWZlciB0byBhIHZhbHVlfX0KKyAgZm9yIChpbnQgaSA9IDQ7IGkgPCAxMjsgaSsrKSBhcmd2WzBdW2ldID0gYXJndlswXVtpXSAtIGFyZ3ZbMF1baS00XTsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzEge3tleHByZXNzaW9uIGlzIG5vdCBhbiBpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9ufX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuIChhcmd2WzFdPTIpIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyAgZm9yIChpbnQgaSA9IDQ7IGkgPCAxMjsgaSsrKSBhcmd2WzBdW2ldID0gYXJndlswXVtpXSAtIGFyZ3ZbMF1baS00XTsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzMge3tzdGF0ZW1lbnQgYWZ0ZXIgJyNwcmFnbWEgb21wIHNpbWQnIG11c3QgYmUgYSBmb3IgbG9vcH19CisgIC8vIGV4cGVjdGVkLW5vdGVAKzEge3tpbiBpbnN0YW50aWF0aW9uIG9mIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uICd0bWFpbjxpbnQsIGNoYXIsIC0xLCAtMj4nIHJlcXVlc3RlZCBoZXJlfX0KKyAgI3ByYWdtYSBvbXAgc2ltZCBzYWZlbGVuKHNhZmVsZW4odG1haW48aW50LCBjaGFyLCAtMSwgLTI+KGFyZ2MsIGFyZ3YpIC8vIGV4cGVjdGVkLWVycm9yIDIge3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIDIge3t0byBtYXRjaCB0aGlzICcoJ319CisgIGZvbygpOworICAvLyBleHBlY3RlZC1ub3RlQCsxIHt7aW4gaW5zdGFudGlhdGlvbiBvZiBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAndG1haW48aW50LCBjaGFyLCAxMiwgND4nIHJlcXVlc3RlZCBoZXJlfX0KKyAgcmV0dXJuIHRtYWluPGludCwgY2hhciwgMTIsIDQ+KGFyZ2MsIGFyZ3YpOworfQorCmRpZmYgLS1naXQgYS90ZXN0L09wZW5NUC90aHJlYWRwcml2YXRlX2FzdF9wcmludC5jcHAgYi90ZXN0L09wZW5NUC90aHJlYWRwcml2YXRlX2FzdF9wcmludC5jcHAKaW5kZXggNzJiZjZmNC4uNGQwZDQwZSAxMDA2NDQKLS0tIGEvdGVzdC9PcGVuTVAvdGhyZWFkcHJpdmF0ZV9hc3RfcHJpbnQuY3BwCisrKyBiL3Rlc3QvT3Blbk1QL3RocmVhZHByaXZhdGVfYXN0X3ByaW50LmNwcApAQCAtMSw5ICsxLDcgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mb3Blbm1wIC1hc3QtcHJpbnQgJXMgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm9wZW5tcCAteCBjKysgLXN0ZD1jKysxMSAtZW1pdC1wY2ggLW8gJXQgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm9wZW5tcCAtc3RkPWMrKzExIC1pbmNsdWRlLXBjaCAldCAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLWFzdC1wcmludAorLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZvcGVubXA9bGliaW9tcDUgLWFzdC1wcmludCAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mb3Blbm1wPWxpYmlvbXA1IC14IGMrKyAtc3RkPWMrKzExIC1lbWl0LXBjaCAtbyAldCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mb3Blbm1wPWxpYmlvbXA1IC1zdGQ9YysrMTEgLWluY2x1ZGUtcGNoICV0IC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAtYXN0LXByaW50CiAvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwotLy8gRklYTUU6IFRoaXMgdGVzdCBoYXMgYmVlbiBjcmFzaGluZyBzaW5jZSByMTg2NjQ3LgotLy8gUkVRVUlSRVM6IGRpc2FibGVkCiAKICNpZm5kZWYgSEVBREVSCiAjZGVmaW5lIEhFQURFUgpAQCAtMjgsOSArMjYsMTYgQEAKICNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoZCwgYikKIC8vIENIRUNLLU5FWFQ6ICNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoZCxiKQogCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBTVCB7CisgIHN0YXRpYyBUIG07CisgICNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobSkKK307CisKIHRlbXBsYXRlIDxjbGFzcyBUPiBUIGZvbygpIHsKICAgc3RhdGljIFQgdjsKICAgI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZSh2KQorICB2ID0gU1Q8VD46Om07CiAgIHJldHVybiB2OwogfQogLy9DSEVDSzogdGVtcGxhdGUgPGNsYXNzIFQgPSBpbnQ+IGludCBmb28oKSB7CmRpZmYgLS1naXQgYS90ZXN0L09wZW5NUC90aHJlYWRwcml2YXRlX21lc3NhZ2VzLmNwcCBiL3Rlc3QvT3Blbk1QL3RocmVhZHByaXZhdGVfbWVzc2FnZXMuY3BwCmluZGV4IDQ4NTg1NDkuLjRiNGY5ZTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvT3Blbk1QL3RocmVhZHByaXZhdGVfbWVzc2FnZXMuY3BwCisrKyBiL3Rlc3QvT3Blbk1QL3RocmVhZHByaXZhdGVfbWVzc2FnZXMuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLW1hY29zMTAuNy4wIC12ZXJpZnkgLWZvcGVubXAgLWZlcnJvci1saW1pdCAxMDAgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1tYWNvczEwLjcuMCAtdmVyaWZ5IC1mb3Blbm1wPWxpYmlvbXA1IC1mZXJyb3ItbGltaXQgMTAwICVzCiAKICNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKCcgYWZ0ZXIgJ3RocmVhZHByaXZhdGUnfX0KICNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgaWRlbnRpZmllcn19IGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KQEAgLTI0LDEzICsyNCwyMiBAQAogICByZXR1cm4gKGEpOwogfQogCisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlIChhKSAoCisvLyBleHBlY3RlZC1lcnJvckAtMSB7eycjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlJyBtdXN0IHByZWNlZGUgYWxsIHJlZmVyZW5jZXMgdG8gdmFyaWFibGUgJ2EnfX0gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e2V4dHJhIHRva2VucyBhdCB0aGUgZW5kIG9mICcjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlJyBhcmUgaWdub3JlZH19CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlIChhKSBbIC8vIGV4cGVjdGVkLWVycm9yIHt7JyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUnIG11c3QgcHJlY2VkZSBhbGwgcmVmZXJlbmNlcyB0byB2YXJpYWJsZSAnYSd9fSBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUnIGFyZSBpZ25vcmVkfX0KKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUgKGEpIHsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZScgbXVzdCBwcmVjZWRlIGFsbCByZWZlcmVuY2VzIHRvIHZhcmlhYmxlICdhJ319IGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSB0b2tlbnMgYXQgdGhlIGVuZCBvZiAnI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZScgYXJlIGlnbm9yZWR9fQorI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZSAoYSkgKSAvLyBleHBlY3RlZC1lcnJvciB7eycjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlJyBtdXN0IHByZWNlZGUgYWxsIHJlZmVyZW5jZXMgdG8gdmFyaWFibGUgJ2EnfX0gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHRva2VucyBhdCB0aGUgZW5kIG9mICcjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlJyBhcmUgaWdub3JlZH19CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlIChhKSBdIC8vIGV4cGVjdGVkLWVycm9yIHt7JyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUnIG11c3QgcHJlY2VkZSBhbGwgcmVmZXJlbmNlcyB0byB2YXJpYWJsZSAnYSd9fSBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUnIGFyZSBpZ25vcmVkfX0KKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUgKGEpIH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3snI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZScgbXVzdCBwcmVjZWRlIGFsbCByZWZlcmVuY2VzIHRvIHZhcmlhYmxlICdhJ319IGV4cGVjdGVkLXdhcm5pbmcge3tleHRyYSB0b2tlbnMgYXQgdGhlIGVuZCBvZiAnI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZScgYXJlIGlnbm9yZWR9fQogI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZSBhIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJygnIGFmdGVyICd0aHJlYWRwcml2YXRlJ319CiAjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGQgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnKSd9fSBleHBlY3RlZC1ub3RlIHt7dG8gbWF0Y2ggdGhpcyAnKCd9fSBleHBlY3RlZC1lcnJvciB7eycjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlJyBtdXN0IHByZWNlZGUgYWxsIHJlZmVyZW5jZXMgdG8gdmFyaWFibGUgJ2QnfX0KICNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoZCkpIC8vIGV4cGVjdGVkLWVycm9yIHt7JyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUnIG11c3QgcHJlY2VkZSBhbGwgcmVmZXJlbmNlcyB0byB2YXJpYWJsZSAnZCd9fSBleHBlY3RlZC13YXJuaW5nIHt7ZXh0cmEgdG9rZW5zIGF0IHRoZSBlbmQgb2YgJyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUnIGFyZSBpZ25vcmVkfX0KIGludCB4LCB5OwogI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZSh4KSkgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHRva2VucyBhdCB0aGUgZW5kIG9mICcjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlJyBhcmUgaWdub3JlZH19Ci0jcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHkpKSwgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHRva2VucyBhdCB0aGUgZW5kIG9mICcjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlJyBhcmUgaWdub3JlZH19Ci0jcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGEsZCkgIC8vIGV4cGVjdGVkLWVycm9yIHt7JyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUnIG11c3QgcHJlY2VkZSBhbGwgcmVmZXJlbmNlcyB0byB2YXJpYWJsZSAnYSd9fSBleHBlY3RlZC1lcnJvciB7eycjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlJyBtdXN0IHByZWNlZGUgYWxsIHJlZmVyZW5jZXMgdG8gdmFyaWFibGUgJ2QnfX0KKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoeSkpLAorLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e2V4dHJhIHRva2VucyBhdCB0aGUgZW5kIG9mICcjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlJyBhcmUgaWdub3JlZH19CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGEsZCkKKy8vIGV4cGVjdGVkLWVycm9yQC0xIHt7JyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUnIG11c3QgcHJlY2VkZSBhbGwgcmVmZXJlbmNlcyB0byB2YXJpYWJsZSAnYSd9fSBleHBlY3RlZC1lcnJvckAtMSB7eycjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlJyBtdXN0IHByZWNlZGUgYWxsIHJlZmVyZW5jZXMgdG8gdmFyaWFibGUgJ2QnfX0KICNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoZC5hKSAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGlkZW50aWZpZXJ9fQogI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZSgoZmxvYXQpYSkgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCB1bnF1YWxpZmllZC1pZH19CiBpbnQgZm9hOyAvLyBleHBlY3RlZC1ub3RlIHt7J2ZvYScgZGVjbGFyZWQgaGVyZX19CkBAIC05MCw5ICs5OSw5IEBACiBpbnQgbzsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZSBmb3VuZCBieSBuYW1lIGxvb2t1cCBpcyAnbyd9fQogI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZSAobykKIG5hbWVzcGFjZSB7Ci1pbnQgbzsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZSBmb3VuZCBieSBuYW1lIGxvb2t1cCBpcyAnPGFub255bW91cyBuYW1lc3BhY2U+OjpvJ319CitpbnQgbzsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZSBmb3VuZCBieSBuYW1lIGxvb2t1cCBpcyAnKGFub255bW91cyBuYW1lc3BhY2UpOjpvJ319CiAjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlIChvKQotI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZSAobykgLy8gZXhwZWN0ZWQtZXJyb3Ige3snI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZScgbXVzdCBwcmVjZWRlIGFsbCByZWZlcmVuY2VzIHRvIHZhcmlhYmxlICc8YW5vbnltb3VzIG5hbWVzcGFjZT46Om8nfX0KKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUgKG8pIC8vIGV4cGVjdGVkLWVycm9yIHt7JyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUnIG11c3QgcHJlY2VkZSBhbGwgcmVmZXJlbmNlcyB0byB2YXJpYWJsZSAnKGFub255bW91cyBuYW1lc3BhY2UpOjpvJ319CiB9CiAjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlIChvKSAvLyBleHBlY3RlZC1lcnJvciB7e3JlZmVyZW5jZSB0byAnbycgaXMgYW1iaWd1b3VzfX0KICNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUgKDo6bykgLy8gZXhwZWN0ZWQtZXJyb3Ige3snI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZScgbXVzdCBwcmVjZWRlIGFsbCByZWZlcmVuY2VzIHRvIHZhcmlhYmxlICdvJ319CmRpZmYgLS1naXQgYS90ZXN0L1BDSC9jaGFpbi1wZW5kaW5nLWluc3RhbnRpYXRpb25zLmNwcCBiL3Rlc3QvUENIL2NoYWluLXBlbmRpbmctaW5zdGFudGlhdGlvbnMuY3BwCmluZGV4IGU0OWFiY2QuLmU4N2QzMzYgMTAwNjQ0Ci0tLSBhL3Rlc3QvUENIL2NoYWluLXBlbmRpbmctaW5zdGFudGlhdGlvbnMuY3BwCisrKyBiL3Rlc3QvUENIL2NoYWluLXBlbmRpbmctaW5zdGFudGlhdGlvbnMuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLW8gLSAtY2hhaW4taW5jbHVkZSAlcyAtY2hhaW4taW5jbHVkZSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLXRyaXBsZSBpNjg2LXBjLWxpbnV4IC1vIC0gLWNoYWluLWluY2x1ZGUgJXMgLWNoYWluLWluY2x1ZGUgJXMgfCBGaWxlQ2hlY2sgJXMKIC8vIENIRUNLOiBkZWZpbmUgbGlua29uY2Vfb2RyICV7e1teIF0rfX0gQF9aTjFBSTFCRTNnZXRFdgogI2lmICFkZWZpbmVkKFBBU1MxKQogI2RlZmluZSBQQVNTMQpkaWZmIC0tZ2l0IGEvdGVzdC9QQ0gvY2hhaW4tc2VsZWN0b3JzLm0gYi90ZXN0L1BDSC9jaGFpbi1zZWxlY3RvcnMubQppbmRleCBmMmJmYzRiLi4yNTUxYzY0IDEwMDY0NAotLS0gYS90ZXN0L1BDSC9jaGFpbi1zZWxlY3RvcnMubQorKysgYi90ZXN0L1BDSC9jaGFpbi1zZWxlY3RvcnMubQpAQCAtMTgsOSArMTgsOSBAQAogICAvLyBGSVhNRTogQ2FuJ3QgdmVyaWZ5IG5vdGVzIGluIGhlYWRlcnMKICAgLy9bYSBmMl07CiAKLSAgKHZvaWQpQHNlbGVjdG9yKHgpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y3JlYXRpbmcgc2VsZWN0b3IgZm9yIG5vbmV4aXN0ZW50IG1ldGhvZCAneCd9fQotICAodm9pZClAc2VsZWN0b3IoeSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjcmVhdGluZyBzZWxlY3RvciBmb3Igbm9uZXhpc3RlbnQgbWV0aG9kICd5J319Ci0gICh2b2lkKUBzZWxlY3RvcihlKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NyZWF0aW5nIHNlbGVjdG9yIGZvciBub25leGlzdGVudCBtZXRob2QgJ2UnfX0KKyAgKHZvaWQpQHNlbGVjdG9yKHgpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bm8gbWV0aG9kIHdpdGggc2VsZWN0b3IgJ3gnIGlzIGltcGxlbWVudGVkIGluIHRoaXMgdHJhbnNsYXRpb24gdW5pdH19CisgICh2b2lkKUBzZWxlY3Rvcih5KTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e25vIG1ldGhvZCB3aXRoIHNlbGVjdG9yICd5JyBpcyBpbXBsZW1lbnRlZCBpbiB0aGlzIHRyYW5zbGF0aW9uIHVuaXR9fQorICAodm9pZClAc2VsZWN0b3IoZSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tubyBtZXRob2Qgd2l0aCBzZWxlY3RvciAnZScgaXMgaW1wbGVtZW50ZWQgaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0fX0KIH0KIAogQGltcGxlbWVudGF0aW9uIFggKEJsYWgpCmRpZmYgLS1naXQgYS90ZXN0L1BDSC9jeHgtbWFuZ2xpbmcuY3BwIGIvdGVzdC9QQ0gvY3h4LW1hbmdsaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDg2ZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QQ0gvY3h4LW1hbmdsaW5nLmNwcApAQCAtMCwwICsxLDI4IEBACisvLyBUZXN0IHdpdGhvdXQgUENILgorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1mY3h4LWV4Y2VwdGlvbnMgLWZleGNlcHRpb25zIC1pbmNsdWRlICVzICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcworLy8KKy8vIFRlc3Qgd2l0aCBQQ0guCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgLXggYysrLWhlYWRlciAlcyAtZW1pdC1wY2ggLW8gJXQKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucyAtaW5jbHVkZS1wY2ggJXQgJXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisKKyNpZm5kZWYgSEVBREVSCisjZGVmaW5lIEhFQURFUgorCitzdHJ1Y3QgQSB7CisgIHN0cnVjdCB7IGludCBhOyB9IGE7CisgIHN0cnVjdCB7IGludCBiOyB9IGI7Cit9OworCisjZWxzZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYoVCkge30KKworLy8gQ0hFQ0stTEFCRUw6IGRlZmluZSB2b2lkIEBfWjFnMUEoCit2b2lkIGcoQSBhKSB7CisgIC8vIENIRUNLOiBjYWxsIHZvaWQgQF9aMWZJTjFBVXQwX0VFdlRfKAorICBmKGEuYik7CisgIC8vIENIRUNLOiBjYWxsIHZvaWQgQF9aMWZJTjFBVXRfRUV2VF8oCisgIGYoYS5hKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L1BDSC9jeHgtcmVmZXJlbmNlLmNwcCBiL3Rlc3QvUENIL2N4eC1yZWZlcmVuY2UuY3BwCmluZGV4IGExYTQ0ZTYuLmJlY2I5MzUgMTAwNjQ0Ci0tLSBhL3Rlc3QvUENIL2N4eC1yZWZlcmVuY2UuY3BwCisrKyBiL3Rlc3QvUENIL2N4eC1yZWZlcmVuY2UuY3BwCkBAIC0xLDYgKzEsNiBAQAogLy8gVGVzdCB0aGlzIHdpdGhvdXQgcGNoLgotLy8gUlVOOiAlY2xhbmdfY2MxIC14IGMrKyAtc3RkPWMrKzExIC1pbmNsdWRlICVTL2N4eC1yZWZlcmVuY2UuaCAtZnN5bnRheC1vbmx5IC1lbWl0LWxsdm0gLW8gLSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC14IGMrKyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLXN0ZD1jKysxMSAtaW5jbHVkZSAlUy9jeHgtcmVmZXJlbmNlLmggLWZzeW50YXgtb25seSAtZW1pdC1sbHZtIC1vIC0gJXMKIAogLy8gVGVzdCB3aXRoIHBjaC4KLS8vIFJVTjogJWNsYW5nX2NjMSAteCBjKysgLXN0ZD1jKysxMSAtZW1pdC1wY2ggLW8gJXQgJVMvY3h4LXJlZmVyZW5jZS5oCi0vLyBSVU46ICVjbGFuZ19jYzEgLXggYysrIC1zdGQ9YysrMTEgLWluY2x1ZGUtcGNoICV0IC1mc3ludGF4LW9ubHkgLWVtaXQtbGx2bSAtbyAtICVzIAorLy8gUlVOOiAlY2xhbmdfY2MxIC14IGMrKyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLXN0ZD1jKysxMSAtZW1pdC1wY2ggLW8gJXQgJVMvY3h4LXJlZmVyZW5jZS5oCisvLyBSVU46ICVjbGFuZ19jYzEgLXggYysrIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtc3RkPWMrKzExIC1pbmNsdWRlLXBjaCAldCAtZnN5bnRheC1vbmx5IC1lbWl0LWxsdm0gLW8gLSAlcyAKZGlmZiAtLWdpdCBhL3Rlc3QvUENIL2N4eC1yZXF1aXJlZC1kZWNscy5jcHAgYi90ZXN0L1BDSC9jeHgtcmVxdWlyZWQtZGVjbHMuY3BwCmluZGV4IDhjNGIxMWMuLmMyZjhlMmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvUENIL2N4eC1yZXF1aXJlZC1kZWNscy5jcHAKKysrIGIvdGVzdC9QQ0gvY3h4LXJlcXVpcmVkLWRlY2xzLmNwcApAQCAtMSw5ICsxLDkgQEAKIC8vIFRlc3QgdGhpcyB3aXRob3V0IHBjaC4KLS8vIFJVTjogJWNsYW5nX2NjMSAtaW5jbHVkZSAlUy9jeHgtcmVxdWlyZWQtZGVjbHMuaCAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtaW5jbHVkZSAlUy9jeHgtcmVxdWlyZWQtZGVjbHMuaCAlcyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCiAKIC8vIFRlc3Qgd2l0aCBwY2guCi0vLyBSVU46ICVjbGFuZ19jYzEgLXggYysrLWhlYWRlciAtZW1pdC1wY2ggLW8gJXQgJVMvY3h4LXJlcXVpcmVkLWRlY2xzLmgKLS8vIFJVTjogJWNsYW5nX2NjMSAtaW5jbHVkZS1wY2ggJXQgJXMgLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXggYysrLWhlYWRlciAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtcGNoIC1vICV0ICVTL2N4eC1yZXF1aXJlZC1kZWNscy5oCisvLyBSVU46ICVjbGFuZ19jYzEgLWluY2x1ZGUtcGNoICV0ICVzIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0s6IEBfWkw1Z2xvYlMgPSBpbnRlcm5hbCBnbG9iYWwgJXN0cnVjdC5TIHplcm9pbml0aWFsaXplcgogLy8gQ0hFQ0s6IEBfWkwzYmFyID0gaW50ZXJuYWwgZ2xvYmFsIGkzMiAwLCBhbGlnbiA0CmRpZmYgLS1naXQgYS90ZXN0L1BDSC9jeHgtdGVtcGxhdGVzLmNwcCBiL3Rlc3QvUENIL2N4eC10ZW1wbGF0ZXMuY3BwCmluZGV4IGU1ZGRkODYuLjUyZWE4NzUgMTAwNjQ0Ci0tLSBhL3Rlc3QvUENIL2N4eC10ZW1wbGF0ZXMuY3BwCisrKyBiL3Rlc3QvUENIL2N4eC10ZW1wbGF0ZXMuY3BwCkBAIC0xLDI0ICsxLDI0IEBACiAvLyBUZXN0IHRoaXMgd2l0aG91dCBwY2guCi0vLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucyAtaW5jbHVkZSAlUy9jeHgtdGVtcGxhdGVzLmggLXZlcmlmeSAlcyAtYXN0LWR1bXAgLW8gLQotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgLWluY2x1ZGUgJVMvY3h4LXRlbXBsYXRlcy5oICVzIC1lbWl0LWxsdm0gLW8gLSAtRE5PX0VSUk9SUyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1mY3h4LWV4Y2VwdGlvbnMgLWZleGNlcHRpb25zIC1pbmNsdWRlICVTL2N4eC10ZW1wbGF0ZXMuaCAtdmVyaWZ5ICVzIC1hc3QtZHVtcCAtbyAtCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgLWluY2x1ZGUgJVMvY3h4LXRlbXBsYXRlcy5oICVzIC1lbWl0LWxsdm0gLW8gLSAtRE5PX0VSUk9SUyB8IEZpbGVDaGVjayAlcwogCiAvLyBUZXN0IHdpdGggcGNoLgotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgLXggYysrLWhlYWRlciAtZW1pdC1wY2ggLW8gJXQgJVMvY3h4LXRlbXBsYXRlcy5oCi0vLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucyAtaW5jbHVkZS1wY2ggJXQgLXZlcmlmeSAlcyAtYXN0LWR1bXAgIC1vIC0KLS8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1mY3h4LWV4Y2VwdGlvbnMgLWZleGNlcHRpb25zIC1pbmNsdWRlLXBjaCAldCAlcyAtZW1pdC1sbHZtIC1vIC0gLWVycm9yLW9uLWRlc2VyaWFsaXplZC1kZWNsIGRvTm90RGVzZXJpYWxpemUgLUROT19FUlJPUlMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucyAteCBjKystaGVhZGVyIC1lbWl0LXBjaCAtbyAldCAlUy9jeHgtdGVtcGxhdGVzLmgKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucyAtaW5jbHVkZS1wY2ggJXQgLXZlcmlmeSAlcyAtYXN0LWR1bXAgIC1vIC0KKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucyAtaW5jbHVkZS1wY2ggJXQgJXMgLWVtaXQtbGx2bSAtbyAtIC1lcnJvci1vbi1kZXNlcmlhbGl6ZWQtZGVjbCBkb05vdERlc2VyaWFsaXplIC1ETk9fRVJST1JTIHwgRmlsZUNoZWNrICVzCiAKIC8vIFRlc3Qgd2l0aCBtb2R1bGVzLgotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgLWZtb2R1bGVzIC14IGMrKy1oZWFkZXIgLWVtaXQtcGNoIC1vICV0ICVTL2N4eC10ZW1wbGF0ZXMuaAotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgLWZtb2R1bGVzIC1pbmNsdWRlLXBjaCAldCAtdmVyaWZ5ICVzIC1hc3QtZHVtcCAgLW8gLQotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgLWZtb2R1bGVzIC1pbmNsdWRlLXBjaCAldCAlcyAtZW1pdC1sbHZtIC1vIC0gLWVycm9yLW9uLWRlc2VyaWFsaXplZC1kZWNsIGRvTm90RGVzZXJpYWxpemUgLUROT19FUlJPUlMgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucyAtZm1vZHVsZXMgLXggYysrLWhlYWRlciAtZW1pdC1wY2ggLW8gJXQgJVMvY3h4LXRlbXBsYXRlcy5oCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgLWZtb2R1bGVzIC1pbmNsdWRlLXBjaCAldCAtdmVyaWZ5ICVzIC1hc3QtZHVtcCAgLW8gLQorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1mY3h4LWV4Y2VwdGlvbnMgLWZleGNlcHRpb25zIC1mbW9kdWxlcyAtaW5jbHVkZS1wY2ggJXQgJXMgLWVtaXQtbGx2bSAtbyAtIC1lcnJvci1vbi1kZXNlcmlhbGl6ZWQtZGVjbCBkb05vdERlc2VyaWFsaXplIC1ETk9fRVJST1JTIHwgRmlsZUNoZWNrICVzCiAKIC8vIFRlc3Qgd2l0aCBwY2ggYW5kIGRlbGF5ZWQgdGVtcGxhdGUgcGFyc2luZy4KLS8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1mY3h4LWV4Y2VwdGlvbnMgLWZkZWxheWVkLXRlbXBsYXRlLXBhcnNpbmcgLWZleGNlcHRpb25zIC14IGMrKy1oZWFkZXIgLWVtaXQtcGNoIC1vICV0ICVTL2N4eC10ZW1wbGF0ZXMuaAotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWZjeHgtZXhjZXB0aW9ucyAtZmRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyAtZmV4Y2VwdGlvbnMgLWluY2x1ZGUtcGNoICV0IC12ZXJpZnkgJXMgLWFzdC1kdW1wICAtbyAtCi0vLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZmN4eC1leGNlcHRpb25zIC1mZGVsYXllZC10ZW1wbGF0ZS1wYXJzaW5nIC1mZXhjZXB0aW9ucyAtaW5jbHVkZS1wY2ggJXQgJXMgLWVtaXQtbGx2bSAtbyAtIC1ETk9fRVJST1JTIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWZjeHgtZXhjZXB0aW9ucyAtZmRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyAtZmV4Y2VwdGlvbnMgLXggYysrLWhlYWRlciAtZW1pdC1wY2ggLW8gJXQgJVMvY3h4LXRlbXBsYXRlcy5oCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWZjeHgtZXhjZXB0aW9ucyAtZmRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyAtZmV4Y2VwdGlvbnMgLWluY2x1ZGUtcGNoICV0IC12ZXJpZnkgJXMgLWFzdC1kdW1wICAtbyAtCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWZjeHgtZXhjZXB0aW9ucyAtZmRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyAtZmV4Y2VwdGlvbnMgLWluY2x1ZGUtcGNoICV0ICVzIC1lbWl0LWxsdm0gLW8gLSAtRE5PX0VSUk9SUyB8IEZpbGVDaGVjayAlcwogCi0vLyBDSEVDSzogZGVmaW5lIHdlYWtfb2RyIHZvaWQgQF9aTjJTNElpRTFtRXYKLS8vIENIRUNLOiBkZWZpbmUgbGlua29uY2Vfb2RyIHZvaWQgQF9aTjJTM0lpRTFtRXYKKy8vIENIRUNLOiBkZWZpbmUgd2Vha19vZHIge3suKn19dm9pZCBAX1pOMlM0SWlFMW1FdgorLy8gQ0hFQ0s6IGRlZmluZSBsaW5rb25jZV9vZHIge3suKn19dm9pZCBAX1pOMlMzSWlFMW1FdgogCiBzdHJ1Y3QgQSB7CiAgIHR5cGVkZWYgaW50IHR5cGU7CmRpZmYgLS1naXQgYS90ZXN0L1BDSC9jeHgtdGVtcGxhdGVzLmggYi90ZXN0L1BDSC9jeHgtdGVtcGxhdGVzLmgKaW5kZXggOTkyZjQ3OC4uYzRhODQ0NyAxMDA2NDQKLS0tIGEvdGVzdC9QQ0gvY3h4LXRlbXBsYXRlcy5oCisrKyBiL3Rlc3QvUENIL2N4eC10ZW1wbGF0ZXMuaApAQCAtMzExLDMgKzMxMSw1MCBAQAogICAgIHJldHVybiBzaXplb2YoYXJyKTsKICAgfQogfQorCituYW1lc3BhY2UgcmRhcjE1NDY4NzA5YSB7CisgIHRlbXBsYXRlPHR5cGVuYW1lPiBzdHJ1Y3QgZGVjYXkge307CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRm9vUGFyYW1UeT4gYXV0byBmb28oRm9vUGFyYW1UeSBmb29QYXJhbSkgLT4gZGVjbHR5cGUoZm9vUGFyYW0pOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBCYXJQYXJhbVR5PiBhdXRvIGJhcihCYXJQYXJhbVR5IGJhclBhcmFtKSAtPiBkZWNheTxkZWNsdHlwZShiYXJQYXJhbSk+OworCisgIHN0cnVjdCBCIHt9OworCisgIHZvaWQgY3Jhc2goKSB7CisgICAgQiBzb21lOworICAgIGJhcihzb21lKTsKKyAgfQorfQorCituYW1lc3BhY2UgcmRhcjE1NDY4NzA5YiB7CisgIHRlbXBsYXRlPHR5cGVuYW1lPiBzdHJ1Y3QgZGVjYXkge307CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gRm9vcz4gaW50IHJldHVybnNJbnQoRm9vcy4uLiBmb29zKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBGb29QYXJhbVR5PiBhdXRvIGZvbyhGb29QYXJhbVR5Li4uIGZvb1BhcmFtKSAtPiBkZWNsdHlwZShyZXR1cm5zSW50KGZvb1BhcmFtLi4uKSk7CisgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEJhclBhcmFtVHk+IGF1dG8gYmFyKEJhclBhcmFtVHkuLi4gYmFyUGFyYW0pIC0+IGRlY2F5PGRlY2x0eXBlKHJldHVybnNJbnQoYmFyUGFyYW0uLi4pKT47CisKKyAgc3RydWN0IEIge307CisKKyAgdm9pZCBjcmFzaCgpIHsKKyAgICBCIHNvbWU7CisgICAgYmFyKHNvbWUpOworICB9Cit9CisKK25hbWVzcGFjZSByZGFyMTU0Njg3MDljIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWU+IHN0cnVjdCBkZWNheSB7fTsKKworICB0ZW1wbGF0ZTxjbGFzcy4uLiBGb29zPiBpbnQgcmV0dXJuc0ludChGb29zLi4uIGZvb3MpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEZvb1BhcmFtVHk+IHZvaWQgZm9vKEZvb1BhcmFtVHkgZm9vUGFyYW0pIHsgZGVjbHR5cGUoZm9vUGFyYW0pIGE7IH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQmFyUGFyYW1UeT4gYXV0byBiYXIoQmFyUGFyYW1UeSBiYXJQYXJhbSkgLT4gZGVjYXk8ZGVjbHR5cGUoYmFyUGFyYW0pPjsKKworICBzdHJ1Y3QgQiB7fTsKKworICB2b2lkIGNyYXNoKCkgeworICAgIEIgc29tZTsKKyAgICBiYXIoc29tZSk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9QQ0gvY3h4LXRyYWl0cy5oIGIvdGVzdC9QQ0gvY3h4LXRyYWl0cy5oCmluZGV4IDgzNjgwNGUuLmU2ZjJmZWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvUENIL2N4eC10cmFpdHMuaAorKysgYi90ZXN0L1BDSC9jeHgtdHJhaXRzLmgKQEAgLTEsMTIgKzEsMTIgQEAKIC8vIEhlYWRlciBmb3IgUENIIHRlc3QgY3h4LXRyYWl0cy5jcHAKIAogdGVtcGxhdGU8dHlwZW5hbWUgX1RwPgotc3RydWN0IF9faXNfcG9kIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2tleXdvcmQgJ19faXNfcG9kJyB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgdHJhbnNsYXRpb24gdW5pdH19CitzdHJ1Y3QgX19pc19wb2QgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7a2V5d29yZCAnX19pc19wb2QnIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgdHJhbnNsYXRpb24gdW5pdH19CiAgIGVudW0geyBfX3ZhbHVlIH07CiB9OwogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBfVHA+Ci1zdHJ1Y3QgX19pc19lbXB0eSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3trZXl3b3JkICdfX2lzX2VtcHR5JyB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgdHJhbnNsYXRpb24gdW5pdH19CitzdHJ1Y3QgX19pc19lbXB0eSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3trZXl3b3JkICdfX2lzX2VtcHR5JyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGFzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHRyYW5zbGF0aW9uIHVuaXR9fQogICBlbnVtIHsgX192YWx1ZSB9OwogfTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9QQ0gvY3h4MTEtZXhjZXB0aW9uLXNwZWMuY3BwIGIvdGVzdC9QQ0gvY3h4MTEtZXhjZXB0aW9uLXNwZWMuY3BwCmluZGV4IDQ0NjYxOWUuLjhjNzM4OGEgMTAwNjQ0Ci0tLSBhL3Rlc3QvUENIL2N4eDExLWV4Y2VwdGlvbi1zcGVjLmNwcAorKysgYi90ZXN0L1BDSC9jeHgxMS1leGNlcHRpb24tc3BlYy5jcHAKQEAgLTEsMTggKzEsNDcgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtcGVkYW50aWMtZXJyb3JzIC1zdGQ9YysrMTEgLWVtaXQtcGNoICVzIC1vICV0Ci0vLyBSVU46ICVjbGFuZ19jYzEgLXBlZGFudGljLWVycm9ycyAtc3RkPWMrKzExIC1pbmNsdWRlLXBjaCAldCAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXBlZGFudGljLWVycm9ycyAtc3RkPWMrKzExIC1lbWl0LXBjaCAlcyAtbyAldC4xCisvLyBSVU46ICVjbGFuZ19jYzEgLXBlZGFudGljLWVycm9ycyAtc3RkPWMrKzExIC1pbmNsdWRlLXBjaCAldC4xIC1lbWl0LXBjaCAlcyAtbyAldC4yCisvLyBSVU46ICVjbGFuZ19jYzEgLXBlZGFudGljLWVycm9ycyAtc3RkPWMrKzExIC1pbmNsdWRlLXBjaCAldC4yIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtcGVkYW50aWMtZXJyb3JzIC1zdGQ9YysrMTEgLWluY2x1ZGUtcGNoICV0LjIgLWVtaXQtbGx2bS1vbmx5ICVzCiAvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwogCi0jaWZuZGVmIEhFQURFUl9JTkNMVURFRAorI2lmbmRlZiBQSEFTRTFfRE9ORQorI2RlZmluZSBQSEFTRTFfRE9ORQogCi0jZGVmaW5lIEhFQURFUl9JTkNMVURFRAordGVtcGxhdGU8aW50IG4+IGludCBmKCkgbm9leGNlcHQobiAlIDIpIHsgcmV0dXJuIDA7IH0KK3RlbXBsYXRlPGludCBuPiBpbnQgZygpIG5vZXhjZXB0KG4gJSAyKTsKIAotdGVtcGxhdGU8Ym9vbCBiPiBpbnQgZigpIG5vZXhjZXB0KGIpIHt9Ci1kZWNsdHlwZShmPGZhbHNlPigpKSBhOwotZGVjbHR5cGUoZjx0cnVlPigpKSBiOworZGVjbHR5cGUoZjwyPigpKSBmMDsKK2RlY2x0eXBlKGY8Mz4oKSkgZjE7Cit0ZW1wbGF0ZSBpbnQgZjw0PigpOwordGVtcGxhdGUgaW50IGY8NT4oKTsKK2RlY2x0eXBlKGY8Nj4oKSkgZjY7CitkZWNsdHlwZShmPDc+KCkpIGY3OworCitzdHJ1Y3QgQSB7CisgIEEoKTsKKyAgQShjb25zdCBBJik7Cit9OworCitkZWNsdHlwZShnPDA+KCkpIGcwOworCisjZWxpZiAhZGVmaW5lZChQSEFTRTJfRE9ORSkKKyNkZWZpbmUgUEhBU0UyX0RPTkUKKwordGVtcGxhdGUgaW50IGY8Nj4oKTsKK3RlbXBsYXRlIGludCBmPDc+KCk7CitkZWNsdHlwZShmPDg+KCkpIGY4OworZGVjbHR5cGUoZjw5PigpKSBmOTsKK3RlbXBsYXRlIGludCBmPDEwPigpOwordGVtcGxhdGUgaW50IGY8MTE+KCk7CisKK0E6OkEoKSA9IGRlZmF1bHQ7CitBOjpBKGNvbnN0IEEmKSA9IGRlZmF1bHQ7CisKK2ludCBnMHZhbCA9IGc8MD4oKTsKIAogI2Vsc2UKIAotc3RhdGljX2Fzc2VydCghbm9leGNlcHQoZjxmYWxzZT4oKSksICIiKTsKLXN0YXRpY19hc3NlcnQobm9leGNlcHQoZjx0cnVlPigpKSwgIiIpOworc3RhdGljX2Fzc2VydCghbm9leGNlcHQoZjwwPigpKSwgIiIpOworc3RhdGljX2Fzc2VydChub2V4Y2VwdChmPDE+KCkpLCAiIik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9QQ0gvY3h4MTEtaW5oZXJpdGluZy1jdG9ycy5jcHAgYi90ZXN0L1BDSC9jeHgxMS1pbmhlcml0aW5nLWN0b3JzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWY3OGJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QQ0gvY3h4MTEtaW5oZXJpdGluZy1jdG9ycy5jcHAKQEAgLTAsMCArMSwzOSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWVtaXQtcGNoIC1vICV0ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtaW5jbHVkZS1wY2ggJXQgLXZlcmlmeSAlcworCisvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcworCisjaWZuZGVmIEhFQURFUl9JTkNMVURFRAorI2RlZmluZSBIRUFERVJfSU5DTFVERUQKKworc3RydWN0IEJhc2UgeworICBCYXNlKGludCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgQmFzZShUKSB7fQorfTsKKworc3RydWN0IFRlc3QgOiBCYXNlIHsKKyAgdXNpbmcgQmFzZTo6QmFzZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFRlc3QyIDogQmFzZSB7CisgIHVzaW5nIEJhc2U6OkJhc2U7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQj4KK3N0cnVjdCBUZXN0MyA6IEIgeworICB1c2luZyBCOjpCOworfTsKKworI2Vsc2UKKworVGVzdCB0ZXN0MWEoNDIpOworVGVzdCB0ZXN0MWIobnVsbHB0cik7CitUZXN0MjxpbnQ+IHRlc3QyYSg0Mik7CitUZXN0MjxpbnQ+IHRlc3QyYihudWxscHRyKTsKK1Rlc3QzPEJhc2U+IHRlc3QzYSg0Mik7CitUZXN0MzxCYXNlPiB0ZXN0M2IobnVsbHB0cik7CisKKyNlbmRpZiAvLyBIRUFERVJfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3Rlc3QvUENIL2RpZmZlcmVudC1kaWFnbm9zdGljLWxldmVsLmMgYi90ZXN0L1BDSC9kaWZmZXJlbnQtZGlhZ25vc3RpYy1sZXZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMWEwZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1BDSC9kaWZmZXJlbnQtZGlhZ25vc3RpYy1sZXZlbC5jCkBAIC0wLDAgKzEsMTcgQEAKKy8vIFJVTjogJWNsYW5nIC14IGMtaGVhZGVyICVzIC1XZXZlcnl0aGluZyAtbyAldC5oLnBjaAorLy8gUlVOOiAlY2xhbmcgLXggYyAlcyAtdyAtaW5jbHVkZSAldC5oIC1mc3ludGF4LW9ubHkgLVhjbGFuZyAtdmVyaWZ5CisKKyNpZm5kZWYgSEVBREVSCisjZGVmaW5lIEhFQURFUgorCitleHRlcm4gaW50IGZvbzsKKworI2Vsc2UKKwordm9pZCBmKCkgeworICBpbnQgYSA9IGZvbzsKKyAgLy8gTWFrZSBzdXJlIHdlIHBhcnNlZCB0aGlzIGJ5IGdldHRpbmcgYW4gZXJyb3IuCisgIGludCBiID0gYmFyOyAvLyBleHBlY3RlZC1lcnJvciB7e3VuZGVjbGFyZWR9fQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvUENIL2ZpZWxkLWRlc2lnbmF0b3IuYyBiL3Rlc3QvUENIL2ZpZWxkLWRlc2lnbmF0b3IuYwppbmRleCA3NjNjZmRhLi42ZjMxOGZkIDEwMDY0NAotLS0gYS90ZXN0L1BDSC9maWVsZC1kZXNpZ25hdG9yLmMKKysrIGIvdGVzdC9QQ0gvZmllbGQtZGVzaWduYXRvci5jCkBAIC0xLDYgKzEsNiBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1jYzEgJXMgLWluY2x1ZGUgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtY2MxICVzIC1lbWl0LXBjaCAtbyAldC5wY2gKLS8vIFJVTjogJWNsYW5nX2NjMSAtY2MxICVzIC1pbmNsdWRlLXBjaCAldC5wY2gKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtaW5jbHVkZSAlcworLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LXBjaCAtbyAldC5wY2gKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtaW5jbHVkZS1wY2ggJXQucGNoCiAKIC8vIHJkYXI6Ly8xMjIzOTMyMSBNYWtlIHN1cmUgd2UgZG9uJ3QgZW1pdCBhIGJvZ3VzCiAvLyAgICAgZXJyb3I6IGZpZWxkIGRlc2lnbmF0b3IgJ2UnIGRvZXMgbm90IHJlZmVyIHRvIGEgbm9uLXN0YXRpYyBkYXRhIG1lbWJlcgpkaWZmIC0tZ2l0IGEvdGVzdC9QQ0gvaXJnZW4tcmRhcjEzMTE0MTQyLm1tIGIvdGVzdC9QQ0gvaXJnZW4tcmRhcjEzMTE0MTQyLm1tCmluZGV4IDdhOWNmYmEuLjI4OGMzOWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvUENIL2lyZ2VuLXJkYXIxMzExNDE0Mi5tbQorKysgYi90ZXN0L1BDSC9pcmdlbi1yZGFyMTMxMTQxNDIubW0KQEAgLTEsNSArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLWVtaXQtcGNoIC1vICV0LnBjaAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1lbWl0LWxsdm0gLWluY2x1ZGUtcGNoICV0LnBjaCAtbyAtIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LXBjaCAtbyAldC5wY2gKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtaW5jbHVkZS1wY2ggJXQucGNoIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogI2lmbmRlZiBIRUFERVIKICNkZWZpbmUgSEVBREVSCmRpZmYgLS1naXQgYS90ZXN0L1BDSC9sb2NhbF9zdGF0aWMuY3BwIGIvdGVzdC9QQ0gvbG9jYWxfc3RhdGljLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDg1ZDgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QQ0gvbG9jYWxfc3RhdGljLmNwcApAQCAtMCwwICsxLDIwIEBACisvLyBUZXN0IHRoaXMgd2l0aG91dCBQQ0guCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtbWFjb3N4MTAuOS4wIC1pbmNsdWRlICVTL2xvY2FsX3N0YXRpYy5oIC1mc3ludGF4LW9ubHkgJXMgLWVtaXQtbGx2bSAtbyAldC5ub19wY2gubGwgJXMKKy8vIFJVTjogRmlsZUNoZWNrIC0taW5wdXQtZmlsZSAldC5ub19wY2gubGwgJXMKKworLy8gVGVzdCB3aXRoIFBDSC4KKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1tYWNvc3gxMC45LjAgLXggYysrLWhlYWRlciAtZW1pdC1wY2ggLW8gJXQucGNoICVTL2xvY2FsX3N0YXRpYy5oCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtbWFjb3N4MTAuOS4wIC1pbmNsdWRlLXBjaCAldC5wY2ggLWVtaXQtbGx2bSAtbyAldC5wY2gubGwgJXMKKy8vIFJVTjogRmlsZUNoZWNrIC0taW5wdXQtZmlsZSAldC5wY2gubGwgJXMKKwordm9pZCB0ZXN0KEJhciAmYikgeworICBiLmY8aW50PigpOworICBzdGF0aWMgaW50IHM7Cit9CisKKy8vIENoZWNrIGlmIHRoZSBtYW5nbGluZyBvZiBzdGF0aWMgYW5kIGxvY2FsIGV4dGVybiB2YXJpYWJsZXMKKy8vIGFyZSBjb3JyZWN0IGFuZCBwcmVzZXJ2ZWQgYnkgUENILgorCisvLyBDSEVDSzogQF9aWjR0ZXN0UjNCYXJFMXMgPSBpbnRlcm5hbCBnbG9iYWwgaTMyIDAsIGFsaWduIDQKKy8vIENIRUNLOiBAX1paTjNCYXIxZklpRUV2dkUxeSA9IGxpbmtvbmNlX29kciBjb25zdGFudCBpMzIgMCwgYWxpZ24gNAorCmRpZmYgLS1naXQgYS90ZXN0L1BDSC9sb2NhbF9zdGF0aWMuaCBiL3Rlc3QvUENIL2xvY2FsX3N0YXRpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OTM4MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1BDSC9sb2NhbF9zdGF0aWMuaApAQCAtMCwwICsxLDcgQEAKK2NsYXNzIEJhciB7CitwdWJsaWM6CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHZvaWQgZigpIHsKKyAgICBzdGF0aWMgY29uc3QgVCB5ID0gMDsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL3Rlc3QvUENIL21hY3JvLXVuZGVmLmNwcCBiL3Rlc3QvUENIL21hY3JvLXVuZGVmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGNlMmRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QQ0gvbWFjcm8tdW5kZWYuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZW1pdC1wY2ggLW8gJXQgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC1pbmNsdWRlLXBjaCAldCAlcyAtV3VuaW5pdGlhbGl6ZWQgLXZlcmlmeQorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLWluY2x1ZGUtcGNoICV0ICVzIC1XdW5pbml0aWFsaXplZCAtZmRpYWdub3N0aWNzLXBhcnNlYWJsZS1maXhpdHMgMj4mMSB8IEZpbGVDaGVjayAlcworCisjaWZuZGVmIEhFQURFUgorI2RlZmluZSBIRUFERVIKKworI2RlZmluZSBOVUxMIDAKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkICpmKCkgeworICB2b2lkICpwOyAgLy8gQDExCisgIHJldHVybiBwOyAvLyBAMTIKK30KKyN1bmRlZiBOVUxMCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCAqZygpIHsKKyAgdm9pZCAqcDsgIC8vIEAxNworICByZXR1cm4gcDsgLy8gQDE4Cit9CisKKyNlbHNlCisKKy8vIGV4cGVjdGVkLXdhcm5pbmdAMTIge3t1bmluaXRpYWxpemVkfX0KKy8vIGV4cGVjdGVkLW5vdGVAMTEge3tpbml0aWFsaXplfX0KKy8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6ezExOjEwLTExOjEwfToiID0gTlVMTCIKKworLy8gZXhwZWN0ZWQtd2FybmluZ0AxOCB7e3VuaW5pdGlhbGl6ZWR9fQorLy8gZXhwZWN0ZWQtbm90ZUAxNyB7e2luaXRpYWxpemV9fQorLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7MTc6MTAtMTc6MTB9OiIgPSAwIgorCitpbnQgbWFpbigpIHsKKyAgZjxpbnQ+KCk7IC8vIGV4cGVjdGVkLW5vdGUge3tpbnN0YW50aWF0aW9ufX0KKyAgZzxpbnQ+KCk7IC8vIGV4cGVjdGVkLW5vdGUge3tpbnN0YW50aWF0aW9ufX0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L1BDSC9tb2RpZmllZC1tb2R1bGUtZGVwZW5kZW5jeS5tIGIvdGVzdC9QQ0gvbW9kaWZpZWQtbW9kdWxlLWRlcGVuZGVuY3kubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTBlYWRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QQ0gvbW9kaWZpZWQtbW9kdWxlLWRlcGVuZGVuY3kubQpAQCAtMCwwICsxLDIwIEBACisvLyBSVU46IHJtIC1yZiAldC1kaXIKKy8vIFJVTjogbWtkaXIgLXAgJXQtZGlyCisvLyBSVU46IGVjaG8gJ0BpbXBvcnQgdGVzdDsnID4gJXQtZGlyL3ByZWZpeC5oCisvLyBSVU46IGVjaG8gJ3ZvaWQgZm9vKHZvaWQpOycgPiAldC1kaXIvdGVzdC5oCisvLyBSVU46IGNwICVTL21vZGlmaWVkLW1vZHVsZS1kZXBlbmRlbmN5Lm1vZHVsZS5tYXAgJXQtZGlyL21vZHVsZS5tYXAKKworLy8gUHJlY29tcGlsZSBwcmVmaXgucGNoLgorLy8gUlVOOiAlY2xhbmdfY2MxIC14IG9iamVjdGl2ZS1jIC1JICV0LWRpciAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQtZGlyL2NhY2hlIC1lbWl0LXBjaCAldC1kaXIvcHJlZml4LmggLW8gJXQtZGlyL3ByZWZpeC5wY2gKKworLy8gTW9kaWZ5IHRoZSBkZXBlbmRlbmN5LgorLy8gUlVOOiBlY2hvICcgJyA+PiAldC1kaXIvdGVzdC5oCisKKy8vIFJ1biBhbmQgY2hlY2sgdGhlIGRpYWdub3N0aWNzLgorLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAteCBvYmplY3RpdmUtYyAtaW5jbHVkZS1wY2ggJXQtZGlyL3ByZWZpeC5wY2ggLWZtb2R1bGVzIC1mbW9kdWxlcy1jYWNoZS1wYXRoPSV0LWRpci9jYWNoZSAtZnN5bnRheC1vbmx5ICVzIDI+ICV0LWRpci9sb2cKKy8vIFJVTjogRmlsZUNoZWNrICVzIDwgJXQtZGlyL2xvZworCisvLyBDSEVDSzogZmlsZSAnW1tURVNUX0g6LipbL1xcXXRlc3RcLmhdXScgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIHByZWNvbXBpbGVkIGhlYWRlciAnW1tQUkVGSVhfUENIOi4qL3ByZWZpeFwucGNoXV0nIHdhcyBidWlsdAorLy8gQ0hFQ0s6ICdbW1RFU1RfSF1dJyByZXF1aXJlZCBieSAnW1tURVNUX1BDTTouKlsvXFxddGVzdFwucGNtXV0nCisvLyBDSEVDSzogJ1tbVEVTVF9QQ01dXScgcmVxdWlyZWQgYnkgJ1tbUFJFRklYX1BDSF1dJworLy8gQ0hFQ0s6IHBsZWFzZSByZWJ1aWxkIHByZWNvbXBpbGVkIGhlYWRlciAnW1tQUkVGSVhfUENIXV0nCmRpZmYgLS1naXQgYS90ZXN0L1BDSC9tb2RpZmllZC1tb2R1bGUtZGVwZW5kZW5jeS5tb2R1bGUubWFwIGIvdGVzdC9QQ0gvbW9kaWZpZWQtbW9kdWxlLWRlcGVuZGVuY3kubW9kdWxlLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDcwNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QQ0gvbW9kaWZpZWQtbW9kdWxlLWRlcGVuZGVuY3kubW9kdWxlLm1hcApAQCAtMCwwICsxLDQgQEAKK21vZHVsZSB0ZXN0IHsKKyAgaGVhZGVyICJ0ZXN0LmgiCisgIGV4cG9ydCAqCit9CmRpZmYgLS1naXQgYS90ZXN0L1BDSC9vYmpjX2NvbnRhaW5lci5tIGIvdGVzdC9QQ0gvb2JqY19jb250YWluZXIubQppbmRleCAwZjI1ZDMyLi40NGFhYzcwIDEwMDY0NAotLS0gYS90ZXN0L1BDSC9vYmpjX2NvbnRhaW5lci5tCisrKyBiL3Rlc3QvUENIL29iamNfY29udGFpbmVyLm0KQEAgLTIxLDUgKzIxLDUgQEAKIC8vIENIRUNLLUlSOiB7e2NhbGwuKm9iamNfbXNnU2VuZH19CiAvLyBDSEVDSy1JUjogcmV0IHZvaWQKIAotLy8gQ0hFQ0s6IGF0dHJpYnV0ZXMgIzAgPSB7IG5vdW53aW5kIHt7Lip9fSB9Ci0vLyBDSEVDSzogYXR0cmlidXRlcyAjMSA9IHsgbm9ubGF6eWJpbmQgfQorLy8gQ0hFQ0stSVI6IGF0dHJpYnV0ZXMgIzAgPSB7IG5vdW53aW5kIHt7Lip9fSB9CisvLyBDSEVDSy1JUjogYXR0cmlidXRlcyAjMSA9IHsgbm9ubGF6eWJpbmQgfQpkaWZmIC0tZ2l0IGEvdGVzdC9QQ0gvb2JqY19saXRlcmFscy5tbSBiL3Rlc3QvUENIL29iamNfbGl0ZXJhbHMubW0KaW5kZXggNTlmMzM4MS4uNzc3MDQ2ZSAxMDA2NDQKLS0tIGEvdGVzdC9QQ0gvb2JqY19saXRlcmFscy5tbQorKysgYi90ZXN0L1BDSC9vYmpjX2xpdGVyYWxzLm1tCkBAIC0xLDcgKzEsNyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LXBjaCAteCBvYmplY3RpdmUtYysrIC1zdGQ9YysrMHggLW8gJXQgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtaW5jbHVkZS1wY2ggJXQgLXggb2JqZWN0aXZlLWMrKyAtc3RkPWMrKzB4ICAtdmVyaWZ5ICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWluY2x1ZGUtcGNoICV0IC14IG9iamVjdGl2ZS1jKysgLXN0ZD1jKysweCAgLWFzdC1wcmludCAlcyB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVBSSU5UICVzCi0vLyBSVU46ICVjbGFuZ19jYzEgLWluY2x1ZGUtcGNoICV0IC14IG9iamVjdGl2ZS1jKysgLXN0ZD1jKysweCAgLWVtaXQtbGx2bSAtbyAtICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stSVIgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtcGNoIC14IG9iamVjdGl2ZS1jKysgLXN0ZD1jKysweCAtbyAldCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtaW5jbHVkZS1wY2ggJXQgLXggb2JqZWN0aXZlLWMrKyAtc3RkPWMrKzB4IC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWluY2x1ZGUtcGNoICV0IC14IG9iamVjdGl2ZS1jKysgLXN0ZD1jKysweCAtYXN0LXByaW50ICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stUFJJTlQgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWluY2x1ZGUtcGNoICV0IC14IG9iamVjdGl2ZS1jKysgLXN0ZD1jKysweCAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1JUiAlcwogCiAvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwogCmRpZmYgLS1naXQgYS90ZXN0L1BDSC9vYmpjeHgtaXZhci1jbGFzcy5tbSBiL3Rlc3QvUENIL29iamN4eC1pdmFyLWNsYXNzLm1tCmluZGV4IGE4M2Q3ZTcuLjMyOWYwNmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvUENIL29iamN4eC1pdmFyLWNsYXNzLm1tCisrKyBiL3Rlc3QvUENIL29iamN4eC1pdmFyLWNsYXNzLm1tCkBAIC0xLDE1ICsxLDE1IEBACiAvLyBUZXN0IHRoaXMgd2l0aG91dCBwY2guCi0vLyBSVU46IG5vdCAlY2xhbmdfY2MxIC1pbmNsdWRlICVTL29iamN4eC1pdmFyLWNsYXNzLmggLXZlcmlmeSAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtaW5jbHVkZSAlUy9vYmpjeHgtaXZhci1jbGFzcy5oIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gVGVzdCB3aXRoIHBjaC4KLS8vIFJVTjogJWNsYW5nX2NjMSAteCBvYmplY3RpdmUtYysrLWhlYWRlciAtZW1pdC1wY2ggLW8gJXQgJVMvb2JqY3h4LWl2YXItY2xhc3MuaAotLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtaW5jbHVkZS1wY2ggJXQgLXZlcmlmeSAlcyAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAteCBvYmplY3RpdmUtYysrLWhlYWRlciAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtcGNoIC1vICV0ICVTL29iamN4eC1pdmFyLWNsYXNzLmgKKy8vIFJVTjogJWNsYW5nX2NjMSAtaW5jbHVkZS1wY2ggJXQgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlICVzIC1lbWl0LWxsdm0gLW8gLSB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSzogW0MgcG9zaXRpb25dCiAvLyBDSEVDSzogY2FsbCB7ey4qfX0gQF9aTjFTQzFFUktTXwogCiAvLyBDSEVDSzogW0Mgc2V0UG9zaXRpb246XQotLy8gQ0hFQ0s6IGNhbGwgJXN0cnVjdC5TKiBAX1pOMVNhU0VSS1NfCisvLyBDSEVDSzogPSBjYWxsIHt7Lip9fSVzdHJ1Y3QuUyogQF9aTjFTYVNFUktTXwogCiAvLyBDSEVDSzogW0MgLmN4eF9kZXN0cnVjdF0KIC8vIENIRUNLOiBbQyAuY3h4X2NvbnN0cnVjdF0KZGlmZiAtLWdpdCBhL3Rlc3QvUENIL3ByMTg4MDYuY3BwIGIvdGVzdC9QQ0gvcHIxODgwNi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI4MzIwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUENIL3ByMTg4MDYuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1lbWl0LXBjaCAtbyAldCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWluY2x1ZGUtcGNoICV0IC12ZXJpZnkgJXMKKworLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKKworLy8gQmVmb3JlIHRoZSBwYXRjaCwgdGhpcyB0ZXN0IHRyaWdnZXJlZCBhbiBhc3NlcnQgdmlvbGF0aW9uIGluCisvLyBBU1RDb250ZXh0OjpnZXRTdWJzdFRlbXBsYXRlVHlwZVBhcm1UeXBlLgorCisjaWZuZGVmIEhFQURFUl9JTkNMVURFRAorI2RlZmluZSBIRUFERVJfSU5DTFVERUQKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit1c2luZyBJZCA9IFQ7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBYPgorc3RydWN0IENsYXNzMSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBZLCB0eXBlbmFtZSA9IGRlY2x0eXBlKFkoKSk+CisgIHN0cnVjdCBOZXN0ZWQxOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEE+CitzdHJ1Y3QgQ2xhc3MyIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEIsIHR5cGVuYW1lID0gSWQ8ZGVjbHR5cGUoQigpKT4+CisgIHN0cnVjdCBOZXN0ZWQyOworfTsKKworI2Vsc2UKKworQ2xhc3MyPGNoYXI+IHRlc3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9QQ0gvdGhyZWFkLXNhZmV0eS1hdHRycy5jcHAgYi90ZXN0L1BDSC90aHJlYWQtc2FmZXR5LWF0dHJzLmNwcAppbmRleCBhNTg4YzBlLi4zZTZmMDI5IDEwMDY0NAotLS0gYS90ZXN0L1BDSC90aHJlYWQtc2FmZXR5LWF0dHJzLmNwcAorKysgYi90ZXN0L1BDSC90aHJlYWQtc2FmZXR5LWF0dHJzLmNwcApAQCAtMjA5LDMzICsyMDksMzMgQEAKIAogdm9pZCBzbHNfZnVuX2JhZF8xKCkgewogICBzbHNfbXUuVW5sb2NrKCk7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5ne3t1bmxvY2tpbmcgJ3Nsc19tdScgdGhhdCB3YXMgbm90IGxvY2tlZH19CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7cmVsZWFzaW5nIG11dGV4ICdzbHNfbXUnIHRoYXQgd2FzIG5vdCBoZWxkfX0KIH0KIAogdm9pZCBzbHNfZnVuX2JhZF8yKCkgewogICBzbHNfbXUuTG9jaygpOwogICBzbHNfbXUuTG9jaygpOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7bG9ja2luZyAnc2xzX211JyB0aGF0IGlzIGFscmVhZHkgbG9ja2VkfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5ne3thY3F1aXJpbmcgbXV0ZXggJ3Nsc19tdScgdGhhdCBpcyBhbHJlYWR5IGhlbGR9fQogICBzbHNfbXUuVW5sb2NrKCk7CiB9CiAKIHZvaWQgc2xzX2Z1bl9iYWRfMygpIHsKICAgc2xzX211LkxvY2soKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e211dGV4IGFjcXVpcmVkIGhlcmV9fQotfSAvLyBleHBlY3RlZC13YXJuaW5ne3ttdXRleCAnc2xzX211JyBpcyBzdGlsbCBsb2NrZWQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19Cit9IC8vIGV4cGVjdGVkLXdhcm5pbmd7e211dGV4ICdzbHNfbXUnIGlzIHN0aWxsIGhlbGQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CiAKIHZvaWQgc2xzX2Z1bl9iYWRfNCgpIHsKICAgaWYgKGdldEJvb2woKSkKICAgICBzbHNfbXUuTG9jaygpOyAgLy8gZXhwZWN0ZWQtbm90ZXt7bXV0ZXggYWNxdWlyZWQgaGVyZX19CiAgIGVsc2UKICAgICBzbHNfbXUyLkxvY2soKTsgLy8gZXhwZWN0ZWQtbm90ZXt7bXV0ZXggYWNxdWlyZWQgaGVyZX19Ci19IC8vIGV4cGVjdGVkLXdhcm5pbmd7e211dGV4ICdzbHNfbXUnIGlzIG5vdCBsb2NrZWQgb24gZXZlcnkgcGF0aCB0aHJvdWdoIGhlcmV9fSAgXAotICAvLyBleHBlY3RlZC13YXJuaW5ne3ttdXRleCAnc2xzX211MicgaXMgbm90IGxvY2tlZCBvbiBldmVyeSBwYXRoIHRocm91Z2ggaGVyZX19Cit9IC8vIGV4cGVjdGVkLXdhcm5pbmd7e211dGV4ICdzbHNfbXUnIGlzIG5vdCBoZWxkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlfX0gIFwKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7bXV0ZXggJ3Nsc19tdTInIGlzIG5vdCBoZWxkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlfX0KIAogdm9pZCBzbHNfZnVuX2JhZF81KCkgewogICBzbHNfbXUuTG9jaygpOyAvLyBleHBlY3RlZC1ub3RlIHt7bXV0ZXggYWNxdWlyZWQgaGVyZX19CiAgIGlmIChnZXRCb29sKCkpCiAgICAgc2xzX211LlVubG9jaygpOwotfSAvLyBleHBlY3RlZC13YXJuaW5ne3ttdXRleCAnc2xzX211JyBpcyBub3QgbG9ja2VkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlfX0KK30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7bXV0ZXggJ3Nsc19tdScgaXMgbm90IGhlbGQgb24gZXZlcnkgcGF0aCB0aHJvdWdoIGhlcmV9fQogCiB2b2lkIHNsc19mdW5fYmFkXzYoKSB7CiAgIGlmIChnZXRCb29sKCkpIHsKQEAgLTI0OCw4ICsyNDgsOCBAQAogICAgIH0KICAgfQogICBzbHNfbXUuVW5sb2NrKCk7IC8vIFwKLSAgICBleHBlY3RlZC13YXJuaW5ne3ttdXRleCAnc2xzX211JyBpcyBub3QgbG9ja2VkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlfX1cCi0gICAgZXhwZWN0ZWQtd2FybmluZ3t7dW5sb2NraW5nICdzbHNfbXUnIHRoYXQgd2FzIG5vdCBsb2NrZWR9fQorICAgIGV4cGVjdGVkLXdhcm5pbmd7e211dGV4ICdzbHNfbXUnIGlzIG5vdCBoZWxkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlfX1cCisgICAgZXhwZWN0ZWQtd2FybmluZ3t7cmVsZWFzaW5nIG11dGV4ICdzbHNfbXUnIHRoYXQgd2FzIG5vdCBoZWxkfX0KIH0KIAogdm9pZCBzbHNfZnVuX2JhZF83KCkgewpAQCAtMjU5LDcgKzI1OSw3IEBACiAgICAgaWYgKGdldEJvb2woKSkgewogICAgICAgaWYgKGdldEJvb2woKSkgewogICAgICAgICBjb250aW51ZTsgLy8gXAotICAgICAgICBleHBlY3RlZC13YXJuaW5ne3tleHBlY3RpbmcgbXV0ZXggJ3Nsc19tdScgdG8gYmUgbG9ja2VkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcH19CisgICAgICAgIGV4cGVjdGVkLXdhcm5pbmd7e2V4cGVjdGluZyBtdXRleCAnc2xzX211JyB0byBiZSBoZWxkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcH19CiAgICAgICB9CiAgICAgfQogICAgIHNsc19tdS5Mb2NrKCk7IC8vIGV4cGVjdGVkLW5vdGUge3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KQEAgLTI3MSwxNCArMjcxLDE0IEBACiAgIHNsc19tdS5Mb2NrKCk7IC8vIGV4cGVjdGVkLW5vdGV7e211dGV4IGFjcXVpcmVkIGhlcmV9fQogCiAgIGRvIHsKLSAgICBzbHNfbXUuVW5sb2NrKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4cGVjdGluZyBtdXRleCAnc2xzX211JyB0byBiZSBsb2NrZWQgYXQgc3RhcnQgb2YgZWFjaCBsb29wfX0KKyAgICBzbHNfbXUuVW5sb2NrKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4cGVjdGluZyBtdXRleCAnc2xzX211JyB0byBiZSBoZWxkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcH19CiAgIH0gd2hpbGUgKGdldEJvb2woKSk7CiB9CiAKIHZvaWQgc2xzX2Z1bl9iYWRfOSgpIHsKICAgZG8gewogICAgIHNsc19tdS5Mb2NrKCk7ICAvLyBcCi0gICAgICAvLyBleHBlY3RlZC13YXJuaW5ne3tleHBlY3RpbmcgbXV0ZXggJ3Nsc19tdScgdG8gYmUgbG9ja2VkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcH19IFwKKyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4cGVjdGluZyBtdXRleCAnc2xzX211JyB0byBiZSBoZWxkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcH19IFwKICAgICAgIC8vIGV4cGVjdGVkLW5vdGV7e211dGV4IGFjcXVpcmVkIGhlcmV9fQogICB9IHdoaWxlIChnZXRCb29sKCkpOwogICBzbHNfbXUuVW5sb2NrKCk7CkBAIC0yODYsMTggKzI4NiwxOCBAQAogCiB2b2lkIHNsc19mdW5fYmFkXzEwKCkgewogICBzbHNfbXUuTG9jaygpOyAgLy8gZXhwZWN0ZWQtbm90ZSAye3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KLSAgd2hpbGUoZ2V0Qm9vbCgpKSB7ICAvLyBleHBlY3RlZC13YXJuaW5ne3tleHBlY3RpbmcgbXV0ZXggJ3Nsc19tdScgdG8gYmUgbG9ja2VkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcH19CisgIHdoaWxlKGdldEJvb2woKSkgeyAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXhwZWN0aW5nIG11dGV4ICdzbHNfbXUnIHRvIGJlIGhlbGQgYXQgc3RhcnQgb2YgZWFjaCBsb29wfX0KICAgICBzbHNfbXUuVW5sb2NrKCk7CiAgIH0KLX0gLy8gZXhwZWN0ZWQtd2FybmluZ3t7bXV0ZXggJ3Nsc19tdScgaXMgc3RpbGwgbG9ja2VkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQorfSAvLyBleHBlY3RlZC13YXJuaW5ne3ttdXRleCAnc2xzX211JyBpcyBzdGlsbCBoZWxkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQogCiB2b2lkIHNsc19mdW5fYmFkXzExKCkgewogICB3aGlsZSAoZ2V0Qm9vbCgpKSB7IC8vIFwKLSAgICAgIGV4cGVjdGVkLXdhcm5pbmd7e2V4cGVjdGluZyBtdXRleCAnc2xzX211JyB0byBiZSBsb2NrZWQgYXQgc3RhcnQgb2YgZWFjaCBsb29wfX0KKyAgICAgIGV4cGVjdGVkLXdhcm5pbmd7e2V4cGVjdGluZyBtdXRleCAnc2xzX211JyB0byBiZSBoZWxkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcH19CiAgICAgc2xzX211LkxvY2soKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e211dGV4IGFjcXVpcmVkIGhlcmV9fQogICB9CiAgIHNsc19tdS5VbmxvY2soKTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3VubG9ja2luZyAnc2xzX211JyB0aGF0IHdhcyBub3QgbG9ja2VkfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5ne3tyZWxlYXNpbmcgbXV0ZXggJ3Nsc19tdScgdGhhdCB3YXMgbm90IGhlbGR9fQogfQogCiB2b2lkIHNsc19mdW5fYmFkXzEyKCkgewpAQCAtMzA2LDcgKzMwNiw3IEBACiAgICAgc2xzX211LlVubG9jaygpOwogICAgIGlmIChnZXRCb29sKCkpIHsKICAgICAgIGlmIChnZXRCb29sKCkpIHsKLSAgICAgICAgYnJlYWs7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e211dGV4ICdzbHNfbXUnIGlzIG5vdCBsb2NrZWQgb24gZXZlcnkgcGF0aCB0aHJvdWdoIGhlcmV9fQorICAgICAgICBicmVhazsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7bXV0ZXggJ3Nsc19tdScgaXMgbm90IGhlbGQgb24gZXZlcnkgcGF0aCB0aHJvdWdoIGhlcmV9fQogICAgICAgfQogICAgIH0KICAgICBzbHNfbXUuTG9jaygpOwpkaWZmIC0tZ2l0IGEvdGVzdC9QQ0gvdmVyaWZ5X3BjaC5tIGIvdGVzdC9QQ0gvdmVyaWZ5X3BjaC5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZmIyODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1BDSC92ZXJpZnlfcGNoLm0KQEAgLTAsMCArMSwzMCBAQAorLy8gU2V0dXA6CisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiBta2RpciAtcCAldC91c3IvaW5jbHVkZQorLy8gUlVOOiBlY2hvICcvLyBlbXB0eScgPiAldC91c3IvaW5jbHVkZS9zeXNfaGVhZGVyLmgKKy8vIFJVTjogY3AgJXMgJXQuaAorLy8KKy8vIFByZWNvbXBpbGUKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtaXN5c3Jvb3QgJXQgLXggb2JqZWN0aXZlLWMtaGVhZGVyIC1lbWl0LXBjaCAtbyAldC5wY2ggJXQuaAorCisvLyBWZXJpZnkgc3VjY2Vzc2Z1bGx5CisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWlzeXNyb290ICV0IC12ZXJpZnktcGNoICV0LnBjaAorCisvLyBJbmNvbXBhdGlibGUgbGFuZyBvcHRpb25zIGlnbm9yZWQKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtaXN5c3Jvb3QgJXQgLXggb2JqZWN0aXZlLWMgLWZuby1idWlsdGluIC12ZXJpZnktcGNoICV0LnBjaAorCisvLyBTdGFsZSBkZXBlbmRlbmN5CisvLyBSVU46IGVjaG8gJyAnID4+ICV0LmgKKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWlzeXNyb290ICV0IC12ZXJpZnktcGNoICV0LnBjaCAyPiAldC5sb2cuMgorLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1TVEFMRS1ERVAgJXMgPCAldC5sb2cuMgorLy8gQ0hFQ0stU1RBTEUtREVQOiBmaWxlICd7ey4qfX0uaCcgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIHByZWNvbXBpbGVkIGhlYWRlciAne3suKn19LnBjaCcgd2FzIGJ1aWx0CisKKy8vIFN0YWxlIGRlcGVuZGVuY3kgaW4gc3lzdGVtIGhlYWRlcgorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEwIC1pc3lzcm9vdCAldCAteCBvYmplY3RpdmUtYy1oZWFkZXIgLWVtaXQtcGNoIC1vICV0LnBjaCAldC5oCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWlzeXNyb290ICV0IC12ZXJpZnktcGNoICV0LnBjaAorLy8gUlVOOiBlY2hvICcgJyA+PiAldC91c3IvaW5jbHVkZS9zeXNfaGVhZGVyLmgKKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTAgLWlzeXNyb290ICV0IC12ZXJpZnktcGNoICV0LnBjaCAyPiAldC5sb2cuMworLy8gUlVOOiBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1TVEFMRS1TWVMtSCAlcyA8ICV0LmxvZy4zCisvLyBDSEVDSy1TVEFMRS1TWVMtSDogZmlsZSAne3suKn19c3lzX2hlYWRlci5oJyBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgcHJlY29tcGlsZWQgaGVhZGVyICd7ey4qfX0ucGNoJyB3YXMgYnVpbHQKKworI2luY2x1ZGUgPHN5c19oZWFkZXIuaD4KZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VyL0RlbGF5ZWRUZW1wbGF0ZVBhcnNpbmcuY3BwIGIvdGVzdC9QYXJzZXIvRGVsYXllZFRlbXBsYXRlUGFyc2luZy5jcHAKaW5kZXggNzMxMjhjNC4uMjlhZjZhMCAxMDA2NDQKLS0tIGEvdGVzdC9QYXJzZXIvRGVsYXllZFRlbXBsYXRlUGFyc2luZy5jcHAKKysrIGIvdGVzdC9QYXJzZXIvRGVsYXllZFRlbXBsYXRlUGFyc2luZy5jcHAKQEAgLTEyMSwzICsxMjEsNSBAQAogY29uc3RleHByIGludCBWYXIgPSBGdW4oMjApOwogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2F1dG8gaW52YWxpZFRyYWlsaW5nUmV0VHlwZSgpIC0+IEJvZ3VzIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5rbm93biB0eXBlIG5hbWUgJ0JvZ3VzJ319CmRpZmYgLS1naXQgYS90ZXN0L1BhcnNlci9NaWNyb3NvZnRFeHRlbnNpb25zLmMgYi90ZXN0L1BhcnNlci9NaWNyb3NvZnRFeHRlbnNpb25zLmMKaW5kZXggNWUxMTM5My4uYjlmNTMxZiAxMDA2NDQKLS0tIGEvdGVzdC9QYXJzZXIvTWljcm9zb2Z0RXh0ZW5zaW9ucy5jCisrKyBiL3Rlc3QvUGFyc2VyL01pY3Jvc29mdEV4dGVuc2lvbnMuYwpAQCAtNzEsOCArNzEsOCBAQAogdHlwZWRlZiBlbnVtIEUgeyBlMSB9OwogCiAKLWVudW0gX19kZWNsc3BlYyhkZXByZWNhdGVkKSBFMiB7IGksIGosIGsgfTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQotX19kZWNsc3BlYyhkZXByZWNhdGVkKSBlbnVtIEUzIHsgYSwgYiwgYyB9IGU7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KK2VudW0gX19kZWNsc3BlYyhkZXByZWNhdGVkKSBFMiB7IGksIGosIGsgfTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydFMicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KK19fZGVjbHNwZWMoZGVwcmVjYXRlZCkgZW51bSBFMyB7IGEsIGIsIGMgfSBlOyAvLyBleHBlY3RlZC1ub3RlIHt7J2UnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAKIHZvaWQgZGVwcmVjYXRlZF9lbnVtX3Rlc3Qodm9pZCkKIHsKQEAgLTk4LDcgKzk4LDcgQEAKICAgX19kZWJ1Z2JyZWFrKCk7CiB9CiAKLXN0cnVjdCBfX2RlY2xzcGVjKGZyb2JibGUpIFMxIHt9OwkvKiBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBfX2RlY2xzcGVjIGF0dHJpYnV0ZSAnZnJvYmJsZScgaWdub3JlZH19ICovCitzdHJ1Y3QgX19kZWNsc3BlYyhmcm9iYmxlKSBTMSB7fTsJLyogZXhwZWN0ZWQtd2FybmluZyB7e19fZGVjbHNwZWMgYXR0cmlidXRlICdmcm9iYmxlJyBpcyBub3Qgc3VwcG9ydGVkfX0gKi8KIHN0cnVjdCBfX2RlY2xzcGVjKDEyKSBTMiB7fTsJLyogZXhwZWN0ZWQtZXJyb3Ige3tfX2RlY2xzcGVjIGF0dHJpYnV0ZXMgbXVzdCBiZSBhbiBpZGVudGlmaWVyIG9yIHN0cmluZyBsaXRlcmFsfX0gKi8KIHN0cnVjdCBfX2RlY2xzcGVjKCJ0ZXN0aW5nIikgUzMge307IC8qIGV4cGVjdGVkLXdhcm5pbmcge3tfX2RlY2xzcGVjIGF0dHJpYnV0ZSAnInRlc3RpbmciJyBpcyBub3Qgc3VwcG9ydGVkfX0gKi8KIApAQCAtMTA2LDEyICsxMDYsMTIgQEAKIHN0cnVjdCBfX2RlY2xzcGVjKGFsaWduKDgpIGRlcHJlY2F0ZWQpIFM0IHt9OwogCiAvKiBCdXQgbXVsdGlwbGUgZGVjbHNwZWNzIG11c3Qgc3RpbGwgYmUgbGVnYWwgKi8KLXN0cnVjdCBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQgZnJvYmJsZSAidGVzdGluZyIpIFM1IHt9OyAgLyogZXhwZWN0ZWQtd2FybmluZyB7e3Vua25vd24gX19kZWNsc3BlYyBhdHRyaWJ1dGUgJ2Zyb2JibGUnIGlnbm9yZWR9fSBleHBlY3RlZC13YXJuaW5nIHt7X19kZWNsc3BlYyBhdHRyaWJ1dGUgJyJ0ZXN0aW5nIicgaXMgbm90IHN1cHBvcnRlZH19ICovCi1zdHJ1Y3QgX19kZWNsc3BlYyh1bmtub3duKDEyKSBkZXByZWNhdGVkKSBTNiB7fTsJLyogZXhwZWN0ZWQtd2FybmluZyB7e3Vua25vd24gX19kZWNsc3BlYyBhdHRyaWJ1dGUgJ3Vua25vd24nIGlnbm9yZWR9fSovCitzdHJ1Y3QgX19kZWNsc3BlYyhkZXByZWNhdGVkIGZyb2JibGUgInRlc3RpbmciKSBTNSB7fTsgIC8qIGV4cGVjdGVkLXdhcm5pbmcge3tfX2RlY2xzcGVjIGF0dHJpYnV0ZSAnZnJvYmJsZScgaXMgbm90IHN1cHBvcnRlZH19IGV4cGVjdGVkLXdhcm5pbmcge3tfX2RlY2xzcGVjIGF0dHJpYnV0ZSAnInRlc3RpbmciJyBpcyBub3Qgc3VwcG9ydGVkfX0gKi8KK3N0cnVjdCBfX2RlY2xzcGVjKHVua25vd24oMTIpIGRlcHJlY2F0ZWQpIFM2IHt9OwkvKiBleHBlY3RlZC13YXJuaW5nIHt7X19kZWNsc3BlYyBhdHRyaWJ1dGUgJ3Vua25vd24nIGlzIG5vdCBzdXBwb3J0ZWR9fSovCiAKIHN0cnVjdCBTNyB7CiAJaW50IGZvbygpIHsgcmV0dXJuIDEyOyB9Ci0JX19kZWNsc3BlYyhwcm9wZXJ0eShnZXQ9Zm9vKSBkZXByZWNhdGVkKSBpbnQgdDsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorCV9fZGVjbHNwZWMocHJvcGVydHkoZ2V0PWZvbykgZGVwcmVjYXRlZCkgaW50IHQ7IC8vIGV4cGVjdGVkLW5vdGUge3sndCcgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIH07CiAKIC8qIFRlY2huaWNhbGx5LCB0aGlzIGlzIGxlZ2FsICh0aG91Z2ggaXQgZG9lcyBub3RoaW5nKSAqLwpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvTWljcm9zb2Z0RXh0ZW5zaW9ucy5jcHAgYi90ZXN0L1BhcnNlci9NaWNyb3NvZnRFeHRlbnNpb25zLmNwcAppbmRleCBlZmI1YzNjLi41ZjNjMmEyIDEwMDY0NAotLS0gYS90ZXN0L1BhcnNlci9NaWNyb3NvZnRFeHRlbnNpb25zLmNwcAorKysgYi90ZXN0L1BhcnNlci9NaWNyb3NvZnRFeHRlbnNpb25zLmNwcApAQCAtNTAsNyArNTAsNyBAQAogc3RydWN0IF9fZGVjbHNwZWModXVpZCgiMDAwMDAwMC0wMDAwLTAwMDAtWjIzNC0wMDAwMDAwMDAwNDciKSkgdXVpZF9hdHRyX2JhZDQgeyB9Oy8vIGV4cGVjdGVkLWVycm9yIHt7dXVpZCBhdHRyaWJ1dGUgY29udGFpbnMgYSBtYWxmb3JtZWQgR1VJRH19CiBzdHJ1Y3QgX19kZWNsc3BlYyh1dWlkKCIwMDAwMDAwMDAwMDAtMDAwMC0xMjM0LTAwMDAwMDAwMDA0NyIpKSB1dWlkX2F0dHJfYmFkNSB7IH07Ly8gZXhwZWN0ZWQtZXJyb3Ige3t1dWlkIGF0dHJpYnV0ZSBjb250YWlucyBhIG1hbGZvcm1lZCBHVUlEfX0KIAotCitfX2RlY2xzcGVjKHV1aWQoIjAwMDAwMEEwLTAwMDAtMDAwMC1DMDAwLTAwMDAwMDAwMDA0NiIpKSBpbnQgaTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyd1dWlkJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGNsYXNzZXN9fQogCiBzdHJ1Y3QgX19kZWNsc3BlYyh1dWlkKCIwMDAwMDBBMC0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDYiKSkKIHN0cnVjdF93aXRoX3V1aWQgeyB9OwpAQCAtMjQyLDEwICsyNDIsMTAgQEAKICAgICAgYisrOwogICB9CiAgIF9faWZfZXhpc3RzKElGX0VYSVNUUzo6VHlwZV9ub3QpIHsKLSAgICAgdGhpcyB3b250IGNvbXBpbGUuCisgICAgIHRoaXMgd2lsbCBub3QgY29tcGlsZS4KICAgfQogICBfX2lmX25vdF9leGlzdHMoSUZfRVhJU1RTOjpUeXBlKSB7Ci0gICAgIHRoaXMgd29udCBjb21waWxlLgorICAgICB0aGlzIHdpbGwgbm90IGNvbXBpbGUuCiAgIH0KICAgX19pZl9ub3RfZXhpc3RzKElGX0VYSVNUUzo6VHlwZV9ub3QpIHsKICAgICAgYisrOwpAQCAtMjU5LDExICsyNTksMTEgQEAKIH0KIAogX19pZl9leGlzdHMoSUZfRVhJU1RTOjpUeXBlX25vdCkgewotIHRoaXMgd29udCBjb21waWxlLgorIHRoaXMgd2lsbCBub3QgY29tcGlsZS4KIH0KIAogX19pZl9ub3RfZXhpc3RzKElGX0VYSVNUUzo6VHlwZSkgewotIHRoaXMgd29udCBjb21waWxlLgorIHRoaXMgd2lsbCBub3QgY29tcGlsZS4KIH0KIAogX19pZl9ub3RfZXhpc3RzKElGX0VYSVNUUzo6VHlwZV9ub3QpIHsKQEAgLTI4MCw3ICsyODAsNyBAQAogCiAgIGludCBhcnJheTJbXSA9IHsKICAgICAwLAotICAgIF9faWZfZXhpc3RzKElGX0VYSVNUUzo6VHlwZV9ub3QpIHsgdGhpcyB3b250IGNvbXBpbGUgfQorICAgIF9faWZfZXhpc3RzKElGX0VYSVNUUzo6VHlwZV9ub3QpIHsgdGhpcyB3aWxsIG5vdCBjb21waWxlIH0KICAgICAzCiAgIH07CiAKQEAgLTI5Miw3ICsyOTIsNyBAQAogCiAgIGludCBhcnJheTRbXSA9IHsKICAgICAwLAotICAgIF9faWZfbm90X2V4aXN0cyhJRl9FWElTVFM6OlR5cGUpIHsgdGhpcyB3b250IGNvbXBpbGUgfQorICAgIF9faWZfbm90X2V4aXN0cyhJRl9FWElTVFM6OlR5cGUpIHsgdGhpcyB3aWxsIG5vdCBjb21waWxlIH0KICAgICAzCiAgIH07CiAKQEAgLTMwOSwxMSArMzA5LDExIEBACiAgIH0KIAogICBfX2lmX2V4aXN0cyhJRl9FWElTVFM6OlR5cGVfbm90KSB7Ci0gICB0aGlzIHdvbnQgY29tcGlsZS4KKyAgIHRoaXMgd2lsbCBub3QgY29tcGlsZS4KICAgfQogCiAgIF9faWZfbm90X2V4aXN0cyhJRl9FWElTVFM6OlR5cGUpIHsKLSAgIHRoaXMgd29udCBjb21waWxlLgorICAgdGhpcyB3aWxsIG5vdCBjb21waWxlLgogICB9CiAKICAgX19pZl9ub3RfZXhpc3RzKElGX0VYSVNUUzo6VHlwZV9ub3QpIHsKQEAgLTMyNSw2ICszMjUsMjkgQEAKIAogCiBpbnQgX19pZGVudGlmaWVyKGdlbmVyaWMpID0gMzsKK2ludCBfX2lkZW50aWZpZXIoaW50KSA9IDQ7CitzdHJ1Y3QgX19pZGVudGlmaWVyKGNsYXNzKSB7IF9faWRlbnRpZmllcihjbGFzcykgKl9faWRlbnRpZmllcihmb3IpOyB9OworX19pZGVudGlmaWVyKGNsYXNzKSBfX2lkZW50aWZpZXIoc3RydWN0KSA9IHsgJl9faWRlbnRpZmllcihzdHJ1Y3QpIH07CisKK2ludCBfX2lkZW50aWZpZXIgZm9yOyAvLyBleHBlY3RlZC1lcnJvciB7e21pc3NpbmcgJygnIGFmdGVyICdfX2lkZW50aWZpZXInfX0KK2ludCBfX2lkZW50aWZpZXIoZWxzZX0gPSBfX2lkZW50aWZpZXIoZm9yKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3ttaXNzaW5nICcpJyBhZnRlciBpZGVudGlmaWVyfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNoIHRoaXMgJygnfX0KKyNkZWZpbmUgaWRlbnRpZmllcl93ZWlyZCh4KSBfX2lkZW50aWZpZXIoeAoraW50IGsgPSBpZGVudGlmaWVyX3dlaXJkKGlmKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllciAnaWYnfX0KKworLy8gVGhpcyBpcyBhIGJpdCB3ZWlyZCwgYnV0IHRoZSBhbHRlcm5hdGl2ZSB0b2tlbnMgYXJlbid0IGtleXdvcmRzLCBhbmQgdGhpcworLy8gYmVoYXZpb3IgbWF0Y2hlcyBNU1ZDLiBGSVhNRTogQ29uc2lkZXIgc3VwcG9ydGluZyB0aGlzIGFueXdheS4KK2V4dGVybiBpbnQgX19pZGVudGlmaWVyKGFuZCkgcjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW5ub3QgY29udmVydCAnJiYnIHRva2VuIHRvIGFuIGlkZW50aWZpZXJ9fQorCit2b2lkIGYoKSB7CisgIF9faWRlbnRpZmllcigoKSAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBjb252ZXJ0ICcoJyB0b2tlbiB0byBhbiBpZGVudGlmaWVyfX0KKyAgX19pZGVudGlmaWVyKHZvaWQpIC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllciAndm9pZCd9fQorICBfX2lkZW50aWZpZXIoKSkgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW5ub3QgY29udmVydCAnKScgdG9rZW4gdG8gYW4gaWRlbnRpZmllcn19CisgIC8vIEZJWE1FOiBXZSBzaG91bGQgcGljayBhIGZyaWVuZGxpZXIgZGlzcGxheSBuYW1lIGZvciB0aGlzIHRva2VuIGtpbmQuCisgIF9faWRlbnRpZmllcigxKSAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBjb252ZXJ0IDxudW1lcmljX2NvbnN0YW50PiB0b2tlbiB0byBhbiBpZGVudGlmaWVyfX0KKyAgX19pZGVudGlmaWVyKCspIC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGNvbnZlcnQgJysnIHRva2VuIHRvIGFuIGlkZW50aWZpZXJ9fQorICBfX2lkZW50aWZpZXIoImZvbyIpIC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGNvbnZlcnQgPHN0cmluZ19saXRlcmFsPiB0b2tlbiB0byBhbiBpZGVudGlmaWVyfX0KKyAgX19pZGVudGlmaWVyKDspIC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGNvbnZlcnQgJzsnIHRva2VuIHRvIGFuIGlkZW50aWZpZXJ9fQorfQogCiBjbGFzcyBpbmxpbmVfZGVmaW5pdGlvbl9wdXJlX3NwZWMgewogICAgdmlydHVhbCBpbnQgZigpID0gMCB7IHJldHVybiAwOyB9Ly8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uIGRlZmluaXRpb24gd2l0aCBwdXJlLXNwZWNpZmllciBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb259fQpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvYWx0aXZlYy1jc2stYm9vbC5jIGIvdGVzdC9QYXJzZXIvYWx0aXZlYy1jc2stYm9vbC5jCmluZGV4IGJhNmZhM2IuLjg4ZDc4YzggMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL2FsdGl2ZWMtY3NrLWJvb2wuYworKysgYi90ZXN0L1BhcnNlci9hbHRpdmVjLWNzay1ib29sLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZyAtdGFyZ2V0IHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudSAtbWFsdGl2ZWMgLWZzeW50YXgtb25seSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgcG93ZXJwYzY0LXVua25vd24tbGludXgtZ251IC1mYWx0aXZlYyAtZnN5bnRheC1vbmx5ICVzCiAKIC8vIFBSMTY0NTY6IFZlcmlmeSB0aGF0IGJvb2wsIHRydWUsIGZhbHNlIGFyZSB0cmVhdGVkIGFzIGNvbnRleHQtc2Vuc2l0aXZlCiAvLyBrZXl3b3JkcyAoYW5kIHRoZXJlZm9yZSBhdmFpbGFibGUgZm9yIHVzZSBhcyBpZGVudGlmaWVycykgd2hlbiBpbgpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvYXNtLmMgYi90ZXN0L1BhcnNlci9hc20uYwppbmRleCBiOTVlMDhiLi5kYWJiMDEwIDEwMDY0NAotLS0gYS90ZXN0L1BhcnNlci9hc20uYworKysgYi90ZXN0L1BhcnNlci9hc20uYwpAQCAtMjMsMyArMjMsMTYgQEAKIC8vIDxyZGFyOi8vcHJvYmxlbS8xMDQ2NTA3OT4gLSBEb24ndCBjcmFzaCBvbiB3aWRlIHN0cmluZyBsaXRlcmFscyBpbiAnYXNtJy4KIGludCBmb28gYXNtIChMImJhciIpOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCB1c2Ugd2lkZSBzdHJpbmcgbGl0ZXJhbCBpbiAnYXNtJ319CiAKK2FzbSgpIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgc3RyaW5nIGxpdGVyYWwgaW4gJ2FzbSd9fQorLy8gZXhwZWN0ZWQtZXJyb3JALTEge3tleHBlY3RlZCAnOycgYWZ0ZXIgdG9wLWxldmVsIGFzbSBibG9ja319CisKK2FzbSg7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgc3RyaW5nIGxpdGVyYWwgaW4gJ2FzbSd9fQorCithc20oIiIpIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJzsnIGFmdGVyIHRvcC1sZXZlbCBhc20gYmxvY2t9fQorCisvLyBVbnRlcm1pbmF0ZWQgYXNtIHN0cmluZ3MgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB3ZXJlIGNhdXNpbmcgdXMgdG8gY3Jhc2gsIHNvCisvLyB0aGlzIG5lZWRzIHRvIGJlIGxhc3QuIHJkYXI6Ly8xNTYyNDA4MQorLy8gZXhwZWN0ZWQtd2FybmluZ0ArMyB7e21pc3NpbmcgdGVybWluYXRpbmcgJyInIGNoYXJhY3Rlcn19CisvLyBleHBlY3RlZC1lcnJvckArMiB7e2V4cGVjdGVkIHN0cmluZyBsaXRlcmFsIGluICdhc20nfX0KKy8vIGV4cGVjdGVkLWVycm9yQCsxIHt7ZXhwZWN0ZWQgJzsnIGFmdGVyIHRvcC1sZXZlbCBhc20gYmxvY2t9fQorYXNtKCIKZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VyL2F0dHJpYnV0ZXMuYyBiL3Rlc3QvUGFyc2VyL2F0dHJpYnV0ZXMuYwppbmRleCAzNzZlZDJlLi44ZDdlNWZlIDEwMDY0NAotLS0gYS90ZXN0L1BhcnNlci9hdHRyaWJ1dGVzLmMKKysrIGIvdGVzdC9QYXJzZXIvYXR0cmlidXRlcy5jCkBAIC02NSwyNyArNjUsMjcgQEAKIAogCiBpbnQgdGVzdEZ1bmRlZjEoaW50ICphKSBfX2F0dHJpYnV0ZV9fKChub25udWxsKDEpKSkgeyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0dDQyBkb2VzIG5vdCBhbGxvdyBub25udWxsIGF0dHJpYnV0ZSBpbiB0aGlzIHBvc2l0aW9uIG9uIGEgZnVuY3Rpb24gZGVmaW5pdGlvbn19CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0dDQyBkb2VzIG5vdCBhbGxvdyAnbm9ubnVsbCcgYXR0cmlidXRlIGluIHRoaXMgcG9zaXRpb24gb24gYSBmdW5jdGlvbiBkZWZpbml0aW9ufX0KICAgcmV0dXJuICphOwogfQogCiAvLyBub3JldHVybiBpcyBsaWZ0ZWQgdG8gdHlwZSBxdWFsaWZpZXIKIHZvaWQgdGVzdEZ1bmRlZjIoKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIHsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tHQ0MgZG9lcyBub3QgYWxsb3cgbm9yZXR1cm4gYXR0cmlidXRlIGluIHRoaXMgcG9zaXRpb24gb24gYSBmdW5jdGlvbiBkZWZpbml0aW9ufX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7R0NDIGRvZXMgbm90IGFsbG93ICdub3JldHVybicgYXR0cmlidXRlIGluIHRoaXMgcG9zaXRpb24gb24gYSBmdW5jdGlvbiBkZWZpbml0aW9ufX0KICAgdGVzdEZ1bmRlZjIoKTsKIH0KIAogaW50IHRlc3RGdW5kZWYzKGludCAqYSkgX19hdHRyaWJ1dGVfXygobm9ubnVsbCgxKSwgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tHQ0MgZG9lcyBub3QgYWxsb3cgbm9ubnVsbCBhdHRyaWJ1dGUgaW4gdGhpcyBwb3NpdGlvbiBvbiBhIGZ1bmN0aW9uIGRlZmluaXRpb259fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tHQ0MgZG9lcyBub3QgYWxsb3cgJ25vbm51bGwnIGF0dHJpYnV0ZSBpbiB0aGlzIHBvc2l0aW9uIG9uIGEgZnVuY3Rpb24gZGVmaW5pdGlvbn19CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZSkpIHsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tHQ0MgZG9lcyBub3QgYWxsb3cgcHVyZSBhdHRyaWJ1dGUgaW4gdGhpcyBwb3NpdGlvbiBvbiBhIGZ1bmN0aW9uIGRlZmluaXRpb259fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tHQ0MgZG9lcyBub3QgYWxsb3cgJ3B1cmUnIGF0dHJpYnV0ZSBpbiB0aGlzIHBvc2l0aW9uIG9uIGEgZnVuY3Rpb24gZGVmaW5pdGlvbn19CiAgIHJldHVybiAqYTsKIH0KIAogaW50IHRlc3RGdW5kZWY0KGludCAqYSkgX19hdHRyaWJ1dGVfXygobm9ubnVsbCgxKSkpIC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7R0NDIGRvZXMgbm90IGFsbG93IG5vbm51bGwgYXR0cmlidXRlIGluIHRoaXMgcG9zaXRpb24gb24gYSBmdW5jdGlvbiBkZWZpbml0aW9ufX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7R0NDIGRvZXMgbm90IGFsbG93ICdub25udWxsJyBhdHRyaWJ1dGUgaW4gdGhpcyBwb3NpdGlvbiBvbiBhIGZ1bmN0aW9uIGRlZmluaXRpb259fQogICAgICAgICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlKChwdXJlKSkgeyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0dDQyBkb2VzIG5vdCBhbGxvdyBwdXJlIGF0dHJpYnV0ZSBpbiB0aGlzIHBvc2l0aW9uIG9uIGEgZnVuY3Rpb24gZGVmaW5pdGlvbn19CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0dDQyBkb2VzIG5vdCBhbGxvdyAncHVyZScgYXR0cmlidXRlIGluIHRoaXMgcG9zaXRpb24gb24gYSBmdW5jdGlvbiBkZWZpbml0aW9ufX0KICAgcmV0dXJuICphOwogfQogCmRpZmYgLS1naXQgYS90ZXN0L1BhcnNlci9hdHRyaWJ1dGVzLm1tIGIvdGVzdC9QYXJzZXIvYXR0cmlidXRlcy5tbQppbmRleCBkOTJlM2QzLi4wMjQ2MDZiIDEwMDY0NAotLS0gYS90ZXN0L1BhcnNlci9hdHRyaWJ1dGVzLm1tCisrKyBiL3Rlc3QvUGFyc2VyL2F0dHJpYnV0ZXMubW0KQEAgLTE0LDExICsxNCwxMSBAQAogQGludGVyZmFjZSBFWFAgSSBAZW5kIC8vIGV4cGVjdGVkLWVycm9yIHt7cG9zdGZpeCBhdHRyaWJ1dGVzIGFyZSBub3QgYWxsb3dlZCBvbiBPYmplY3RpdmUtQyBkaXJlY3RpdmVzLCBwbGFjZSB0aGVtIGluIGZyb250IG9mICdAaW50ZXJmYWNlJ319CiBFWFAgQGludGVyZmFjZSBJMiBAZW5kCiAKLUBpbXBsZW1lbnRhdGlvbiBFWFAgSSBAZW5kIC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7cG9zdGZpeCBhdHRyaWJ1dGVzIGFyZSBub3QgYWxsb3dlZCBvbiBPYmplY3RpdmUtQyBkaXJlY3RpdmVzJH19CitAaW1wbGVtZW50YXRpb24gRVhQIEkgQGVuZCAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3Bvc3RmaXggYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQgb24gT2JqZWN0aXZlLUMgZGlyZWN0aXZlc3t7JH19fX0KIC8vIEZJWE1FOiBQcmVmaXggYXR0cmlidXRlIHJlY292ZXJ5IHNraXBzIHVudGlsICc7JwogRVhQIEBpbXBsZW1lbnRhdGlvbiBJMiBAZW5kOyAvLyBleHBlY3RlZC1lcnJvciB7e3ByZWZpeCBhdHRyaWJ1dGUgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBpbnRlcmZhY2Ugb3IgcHJvdG9jb2x9fQogCi1AY2xhc3MgRVhQIE9DOyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3Bvc3RmaXggYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQgb24gT2JqZWN0aXZlLUMgZGlyZWN0aXZlcyR9fQorQGNsYXNzIEVYUCBPQzsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3twb3N0Zml4IGF0dHJpYnV0ZXMgYXJlIG5vdCBhbGxvd2VkIG9uIE9iamVjdGl2ZS1DIGRpcmVjdGl2ZXN7eyR9fX19CiBFWFAgQGNsYXNzIE9DMjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcmVmaXggYXR0cmlidXRlIG11c3QgYmUgZm9sbG93ZWQgYnkgYW4gaW50ZXJmYWNlIG9yIHByb3RvY29sfX0KIAogQHByb3RvY29sIEVYUCBQIEBlbmQgLy8gZXhwZWN0ZWQtZXJyb3Ige3twb3N0Zml4IGF0dHJpYnV0ZXMgYXJlIG5vdCBhbGxvd2VkIG9uIE9iamVjdGl2ZS1DIGRpcmVjdGl2ZXMsIHBsYWNlIHRoZW0gaW4gZnJvbnQgb2YgJ0Bwcm90b2NvbCd9fQpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvYmFkLWNvbnRyb2wuYyBiL3Rlc3QvUGFyc2VyL2JhZC1jb250cm9sLmMKaW5kZXggNDgwZDgxYi4uNzI2MTRlYiAxMDA2NDQKLS0tIGEvdGVzdC9QYXJzZXIvYmFkLWNvbnRyb2wuYworKysgYi90ZXN0L1BhcnNlci9iYWQtY29udHJvbC5jCkBAIC03LDMgKzcsMTggQEAKIHZvaWQgZm9vMigpIHsgCiAgIGNvbnRpbnVlOyAvKiBleHBlY3RlZC1lcnJvciB7eydjb250aW51ZScgc3RhdGVtZW50IG5vdCBpbiBsb29wIHN0YXRlbWVudH19ICovCiB9CisKK2ludCBwcjg4ODBfOSAoaW50IGZpcnN0KSB7CisgIHN3aXRjaCgoeyBpZiAoZmlyc3QpIHsgZmlyc3QgPSAwOyBicmVhazsgfSAxOyB9KSkgeyAvLyBleHBlY3RlZC1lcnJvciB7eydicmVhaycgc3RhdGVtZW50IG5vdCBpbiBsb29wIG9yIHN3aXRjaCBzdGF0ZW1lbnR9fQorICBjYXNlIDI6IHJldHVybiAyOworICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgfQorfQorCit2b2lkIHByODg4MF8yNCgpIHsKKyAgZm9yICgoe2JyZWFrO30pOzspOyAvLyBleHBlY3RlZC1lcnJvciB7eydicmVhaycgc3RhdGVtZW50IG5vdCBpbiBsb29wIG9yIHN3aXRjaCBzdGF0ZW1lbnR9fQorfQorCit2b2lkIHByODg4MF8yNSgpIHsKKyAgZm9yICgoe2NvbnRpbnVlO30pOzspOyAvLyBleHBlY3RlZC1lcnJvciB7eydjb250aW51ZScgc3RhdGVtZW50IG5vdCBpbiBsb29wIHN0YXRlbWVudH19Cit9CmRpZmYgLS1naXQgYS90ZXN0L1BhcnNlci9idWlsdGluX2NsYXNzaWZ5X3R5cGUuYyBiL3Rlc3QvUGFyc2VyL2J1aWx0aW5fY2xhc3NpZnlfdHlwZS5jCmluZGV4IGZmNDgzYjIuLjYzZmQ4ZTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL2J1aWx0aW5fY2xhc3NpZnlfdHlwZS5jCisrKyBiL3Rlc3QvUGFyc2VyL2J1aWx0aW5fY2xhc3NpZnlfdHlwZS5jCkBAIC05LDcgKzksNyBAQAogICBzdHJ1Y3QgZm9vIHM7CiAKICAgc3RhdGljIGludCBhcnlbX19idWlsdGluX2NsYXNzaWZ5X3R5cGUoYSldOwotICBzdGF0aWMgaW50IGFyeTJbKF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlKShhKV07IC8vIGV4cGVjdGVkLWVycm9ye3t2YXJpYWJsZSBsZW5ndGggYXJyYXkgZGVjbGFyYXRpb24gY2FuIG5vdCBoYXZlICdzdGF0aWMnIHN0b3JhZ2UgZHVyYXRpb259fQorICBzdGF0aWMgaW50IGFyeTJbKF9fYnVpbHRpbl9jbGFzc2lmeV90eXBlKShhKV07IC8vIGV4cGVjdGVkLWVycm9ye3t2YXJpYWJsZSBsZW5ndGggYXJyYXkgZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgJ3N0YXRpYycgc3RvcmFnZSBkdXJhdGlvbn19CiAgIHN0YXRpYyBpbnQgYXJ5M1soKl9fYnVpbHRpbl9jbGFzc2lmeV90eXBlKShhKV07IC8vIGV4cGVjdGVkLWVycm9ye3tidWlsdGluIGZ1bmN0aW9ucyBtdXN0IGJlIGRpcmVjdGx5IGNhbGxlZH19CiAKICAgaW50IHJlc3VsdDsKZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VyL2NoZWNrLW9iamMyLXN5bnRheC0xLm0gYi90ZXN0L1BhcnNlci9jaGVjay1vYmpjMi1zeW50YXgtMS5tCmluZGV4IDlhZmY5NjMuLjZjMzAwOTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL2NoZWNrLW9iamMyLXN5bnRheC0xLm0KKysrIGIvdGVzdC9QYXJzZXIvY2hlY2stb2JqYzItc3ludGF4LTEubQpAQCAtMSw1ICsxLDcgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKLS8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisKKy8vIHJkYXI6Ly8xNTUwNTQ5MgorQGltcG9ydCBGb3VuZGF0aW9uOyAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiAnQGltcG9ydCcgd2hlbiBtb2R1bGVzIGFyZSBkaXNhYmxlZCwgYWRkIC1mbW9kdWxlc319CiAKIEBpbnRlcmZhY2UgU3ViY2xhc3MgCiArIChpbnQpbWFnaWNOdW1iZXI7CmRpZmYgLS1naXQgYS90ZXN0L1BhcnNlci9jeHgtY2xhc3MuY3BwIGIvdGVzdC9QYXJzZXIvY3h4LWNsYXNzLmNwcAppbmRleCA1ZmFjNzk3Li44MGNkODI4IDEwMDY0NAotLS0gYS90ZXN0L1BhcnNlci9jeHgtY2xhc3MuY3BwCisrKyBiL3Rlc3QvUGFyc2VyL2N4eC1jbGFzcy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1wZWRhbnRpYyAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtcGVkYW50aWMgLWZjeHgtZXhjZXB0aW9ucyAlcwogY2xhc3MgQzsKIGNsYXNzIEMgewogcHVibGljOgpAQCAtMTEzLDYgKzExMywzMiBAQAogICB9CiB9CiAKK2NsYXNzIHByMTY5ODkgeworICB2b2lkIHRwbF9tZW0oaW50ICopIHsKKyAgICByZXR1cm47CisgICAgY2xhc3MgQzIgeworICAgICAgdm9pZCBmKCk7CisgICAgfTsKKyAgICB2b2lkIEMyOjpmKCkge30gLy8gZXhwZWN0ZWQtZXJyb3J7e2Z1bmN0aW9uIGRlZmluaXRpb24gaXMgbm90IGFsbG93ZWQgaGVyZX19CisgIH07Cit9OworCituYW1lc3BhY2UgQ3RvckVycm9ycyB7CisgIHN0cnVjdCBBIHsKKyAgICBBKE5vbkV4aXN0ZW50KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1bmtub3duIHR5cGUgbmFtZSAnTm9uRXhpc3RlbnQnfX0KKyAgfTsKKyAgc3RydWN0IEIgeworICAgIEIoTm9uRXhpc3RlbnQpIDogbigwKSB7fSAvLyBleHBlY3RlZC1lcnJvciB7e3Vua25vd24gdHlwZSBuYW1lICdOb25FeGlzdGVudCd9fQorICAgIGludCBuOworICB9OworICBzdHJ1Y3QgQyB7CisgICAgQyhOb25FeGlzdGVudCkgdHJ5IHt9IGNhdGNoICguLi4pIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5rbm93biB0eXBlIG5hbWUgJ05vbkV4aXN0ZW50J319CisgIH07CisgIHN0cnVjdCBEIHsKKyAgICBEKE5vbkV4aXN0ZW50KSB7fSAvLyBleHBlY3RlZC1lcnJvciB7e3Vua25vd24gdHlwZSBuYW1lICdOb25FeGlzdGVudCd9fQorICB9OworfQorCiAvLyBQUjExMTA5IG11c3QgYXBwZWFyIGF0IHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBmaWxlCiBjbGFzcyBwcjExMTA5cjMgeyAvLyBleHBlY3RlZC1ub3Rle3t0byBtYXRjaCB0aGlzICd7J319CiAgIHB1YmxpYyAvLyBleHBlY3RlZC1lcnJvcnt7ZXhwZWN0ZWQgJzonfX0gZXhwZWN0ZWQtZXJyb3J7e2V4cGVjdGVkICd9J319IGV4cGVjdGVkLWVycm9ye3tleHBlY3RlZCAnOycgYWZ0ZXIgY2xhc3N9fQpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvY3h4LWRlY2wuY3BwIGIvdGVzdC9QYXJzZXIvY3h4LWRlY2wuY3BwCmluZGV4IDhjNGM2MTcuLmJlNzllYjQgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL2N4eC1kZWNsLmNwcAorKysgYi90ZXN0L1BhcnNlci9jeHgtZGVjbC5jcHAKQEAgLTEsNiArMSw2IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtZnN5bnRheC1vbmx5IC10cmlwbGUgaTM4Ni1saW51eCAtcGVkYW50aWMgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mc3ludGF4LW9ubHkgLXRyaXBsZSBpMzg2LWxpbnV4IC1wZWRhbnRpYy1lcnJvcnMgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgJXMKIAotY29uc3QgY2hhciBjb25zdCAqeDEwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZHVwbGljYXRlICdjb25zdCcgZGVjbGFyYXRpb24gc3BlY2lmaWVyfX0KK2NvbnN0IGNoYXIgY29uc3QgKngxMDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkdXBsaWNhdGUgJ2NvbnN0JyBkZWNsYXJhdGlvbiBzcGVjaWZpZXJ9fQogCiBpbnQgeCgqZyk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllciAnZyd9fQogCkBAIC00Niw3ICs0Niw3IEBACiAgIHZvaWQgZm9vKCkgX19hc21fXygiYmF6Iik7CiB9OwogCi1lbnVtIHsgZm9vZW51bSA9IDEsIH07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjb21tYXMgYXQgdGhlIGVuZCBvZiBlbnVtZXJhdG9yIGxpc3RzIGFyZSBhIEMrKzExIGV4dGVuc2lvbn19CitlbnVtIHsgZm9vZW51bSA9IDEsIH07IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29tbWFzIGF0IHRoZSBlbmQgb2YgZW51bWVyYXRvciBsaXN0cyBhcmUgYSBDKysxMSBleHRlbnNpb259fQogCiBzdHJ1Y3QgYSB7CiAgIGludCBUeXBlIDogZm9vZW51bTsKQEAgLTgxLDcgKzgxLDcgQEAKICAgKGdsb2JhbDUpLAogICAqZ2xvYmFsNiwKICAgJmdsb2JhbDcgPSBnbG9iYWwxLAotICAmJmdsb2JhbDggPSBzdGF0aWNfY2FzdDxpbnQmJj4oZ2xvYmFsMSksIC8vIGV4cGVjdGVkLXdhcm5pbmcgMnt7cnZhbHVlIHJlZmVyZW5jZX19CisgICYmZ2xvYmFsOCA9IHN0YXRpY19jYXN0PGludCYmPihnbG9iYWwxKSwgLy8gZXhwZWN0ZWQtZXJyb3IgMnt7cnZhbHVlIHJlZmVyZW5jZX19CiAgIFM6OmEsCiAgIGdsb2JhbDksCiAgIGdsb2JhbDEwID0gMCwKQEAgLTE4MSw3ICsxODEsNyBAQAogfQogCiBuYW1lc3BhY2UgUFIxNTAxNyB7Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBzdHJ1Y3QgWCB7IGludCBpOyB9PiBzdHJ1Y3QgUyB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snUFIxNTAxNzo6WCcgY2FuIG5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBzcGVjaWZpZXJ9fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gc3RydWN0IFggeyBpbnQgaTsgfT4gc3RydWN0IFMge307IC8vIGV4cGVjdGVkLWVycm9yIHt7J1BSMTUwMTc6OlgnIGNhbm5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBzcGVjaWZpZXJ9fQogfQogCiAvLyBFbnN1cmUgd2UgcHJvZHVjZSBhdCBsZWFzdCBzb21lIGRpYWdub3N0aWMgZm9yIGF0dHJpYnV0ZXMgaW4gQysrOTguCkBAIC0yMTIsMTQgKzIxMiwxNCBAQAogICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7fTsKICAgWDxpbnQgTj4geDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t0eXBlLWlkIGNhbm5vdCBoYXZlIGEgbmFtZX19CiAKLSAgdXNpbmcgVCA9IGludCAoKlQpKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dHlwZS1pZCBjYW5ub3QgaGF2ZSBhIG5hbWV9fSBleHBlY3RlZC13YXJuaW5nIHt7QysrMTF9fQorICB1c2luZyBUID0gaW50ICgqVCkoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t0eXBlLWlkIGNhbm5vdCBoYXZlIGEgbmFtZX19IGV4cGVjdGVkLWVycm9yIHt7QysrMTF9fQogfQogCiBuYW1lc3BhY2UgUFIxNzI1NSB7CiB2b2lkIGZvbygpIHsKICAgdHlwZW5hbWUgQTo6dGVtcGxhdGUgQjw+OyAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ0EnfX0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgYSBxdWFsaWZpZWQgbmFtZSBhZnRlciAndHlwZW5hbWUnfX0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3sndGVtcGxhdGUnIGtleXdvcmQgb3V0c2lkZSBvZiBhIHRlbXBsYXRlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1lcnJvciB7eyd0ZW1wbGF0ZScga2V5d29yZCBvdXRzaWRlIG9mIGEgdGVtcGxhdGV9fQogfQogfQogCkBAIC0yMzIsNiArMjMyLDEzIEBACiAgIEZvb0Jhcjo6fkZvb0JhcigpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5kZWNsYXJlZH19IGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgdGhlIGNsYXNzIG5hbWV9fQogfQogCituYW1lc3BhY2UgRHVwbGljYXRlRnJpZW5kIHsKKyAgc3RydWN0IEEgeworICAgIGZyaWVuZCB2b2lkIGZyaWVuZCBmKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tkdXBsaWNhdGUgJ2ZyaWVuZCcgZGVjbGFyYXRpb24gc3BlY2lmaWVyfX0KKyAgICBmcmllbmQgc3RydWN0IEIgZnJpZW5kOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZHVwbGljYXRlICdmcmllbmQnIGRlY2xhcmF0aW9uIHNwZWNpZmllcn19CisgIH07Cit9CisKIC8vIFBSODM4MAogZXh0ZXJuICIiICAgICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1bmtub3duIGxpbmthZ2UgbGFuZ3VhZ2V9fQogdGVzdDZhIHsgOy8vIGV4cGVjdGVkLWVycm9yIHt7QysrIHJlcXVpcmVzIGEgdHlwZSBzcGVjaWZpZXIgZm9yIGFsbCBkZWNsYXJhdGlvbnN9fSBcCmRpZmYgLS1naXQgYS90ZXN0L1BhcnNlci9jeHgtZnJpZW5kLmNwcCBiL3Rlc3QvUGFyc2VyL2N4eC1mcmllbmQuY3BwCmluZGV4IGEzYjg5Y2MuLmFjZTBmZjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL2N4eC1mcmllbmQuY3BwCisrKyBiL3Rlc3QvUGFyc2VyL2N4eC1mcmllbmQuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAgIHZvaWQgZihBICphKSB7IGEtPmYoKTsgfQogfTsKIAotdm9pZCBiYXIoKSB7fSAvLyBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXMgZGVmaW5pdGlvbiBpcyBoZXJlfX0KK2lubGluZSB2b2lkIGJhcigpIHt9IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91cyBkZWZpbml0aW9uIGlzIGhlcmV9fQogY2xhc3MgRSB7CiAgIGZyaWVuZCB2b2lkIGJhcigpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVkZWZpbml0aW9uIG9mICdiYXInfX0KIH07CmRpZmYgLS1naXQgYS90ZXN0L1BhcnNlci9jeHgtcmVmZXJlbmNlLmNwcCBiL3Rlc3QvUGFyc2VyL2N4eC1yZWZlcmVuY2UuY3BwCmluZGV4IGQyMTQxMmMuLmI2MjYzOGIgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL2N4eC1yZWZlcmVuY2UuY3BwCisrKyBiL3Rlc3QvUGFyc2VyL2N4eC1yZWZlcmVuY2UuY3BwCkBAIC0xMCw3ICsxMCw3IEBACiAKIHR5cGVkZWYgaW50ICYgQTsKIAotdm9pZCBnKGNvbnN0IEEgYXJlZikgewordm9pZCBnKGNvbnN0IEEgYXJlZikgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2NvbnN0JyBxdWFsaWZpZXIgb24gcmVmZXJlbmNlIHR5cGUgJ0EnIChha2EgJ2ludCAmJykgaGFzIG5vIGVmZmVjdH19CiB9CiAKIGludCAmIGNvbnN0IFggPSB2YWw7IC8vIGV4cGVjdGVkLWVycm9yIHt7J2NvbnN0JyBxdWFsaWZpZXIgbWF5IG5vdCBiZSBhcHBsaWVkIHRvIGEgcmVmZXJlbmNlfX0KZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VyL2N4eC10ZW1wbGF0ZS1hcmd1bWVudC5jcHAgYi90ZXN0L1BhcnNlci9jeHgtdGVtcGxhdGUtYXJndW1lbnQuY3BwCmluZGV4IDhiZjJhNGYuLmJiZDUzYjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL2N4eC10ZW1wbGF0ZS1hcmd1bWVudC5jcHAKKysrIGIvdGVzdC9QYXJzZXIvY3h4LXRlbXBsYXRlLWFyZ3VtZW50LmNwcApAQCAtMSw0ICsxLDUgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLWZkZWxheWVkLXRlbXBsYXRlLXBhcnNpbmcKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEEge307CiAKZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VyL2N4eC10ZW1wbGF0ZS1kZWNsLmNwcCBiL3Rlc3QvUGFyc2VyL2N4eC10ZW1wbGF0ZS1kZWNsLmNwcAppbmRleCA4MTI2OWNlLi44NzQyOTAwIDEwMDY0NAotLS0gYS90ZXN0L1BhcnNlci9jeHgtdGVtcGxhdGUtZGVjbC5jcHAKKysrIGIvdGVzdC9QYXJzZXIvY3h4LXRlbXBsYXRlLWRlY2wuY3BwCkBAIC0xLDQgKzEsNyBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAtZmRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyAtRERFTEFZRURfVEVNUExBVEVfUEFSU0lORworCisKIAogLy8gRXJyb3JzCiBleHBvcnQgY2xhc3MgZm9vIHsgfTsgICAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIHRlbXBsYXRlfX0KQEAgLTEwMiw3ICsxMDUsMTEgQEAKIHRlbXBsYXRlPGludCBTaXplPiAKIHZvaWQgZihpbnQmIGkpIHsKICAgaSA9IFNpemU7CisgI2lmZGVmIERFTEFZRURfVEVNUExBVEVfUEFSU0lORworICBTaXplID0gaTsgCisgI2Vsc2UKICAgU2l6ZSA9IGk7IC8vIGV4cGVjdGVkLWVycm9ye3tleHByZXNzaW9uIGlzIG5vdCBhc3NpZ25hYmxlfX0KKyAjZW5kaWYKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KQEAgLTEyNywzICsxMzQsNzMgQEAKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgIHZvaWQgTjo6YmFyKHR5cGVuYW1lIFQ6OngpIHsgfQogfQorCisvLyBUaGlzIFBSIG9jY3VycmVkIG9ubHkgaW4gdGVtcGxhdGUgcGFyc2luZyBtb2RlLgorbmFtZXNwYWNlIFBSMTc2MzcgewordGVtcGxhdGUgPGludD4KK3N0cnVjdCBMIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBPIHsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgICBzdGF0aWMgdm9pZCBGdW4oVSk7CisgIH07Cit9OworCit0ZW1wbGF0ZSA8aW50IGs+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBVPgordm9pZCBMPGs+OjpPPFQ+OjpGdW4oVSkge30KKwordm9pZCBJbnN0YW50aWF0ZSgpIHsgTDwwPjo6TzxpbnQ+OjpGdW4oMCk7IH0KKworfQorCituYW1lc3BhY2UgZXhwbGljaXRfcGFydGlhbF9zcGVjaWFsaXphdGlvbnMgewordHlwZWRlZiBjaGFyICgmb25lVClbMV07Cit0eXBlZGVmIGNoYXIgKCZ0d29UKVsyXTsKK3R5cGVkZWYgY2hhciAoJnRocmVlVClbM107Cit0eXBlZGVmIGNoYXIgKCZmb3VyVClbNF07Cit0eXBlZGVmIGNoYXIgKCZmaXZlVClbNV07Cit0eXBlZGVmIGNoYXIgKCZzaXhUKVs2XTsKKworY2hhciBvbmVbMV07CitjaGFyIHR3b1syXTsKK2NoYXIgdGhyZWVbM107CitjaGFyIGZvdXJbNF07CitjaGFyIGZpdmVbNV07CitjaGFyIHNpeFs2XTsKKwordGVtcGxhdGU8Ym9vbCBiPiBzdHJ1Y3QgYm9vbF8geyB0eXBlZGVmIGludCB0eXBlOyB9OwordGVtcGxhdGU8PiBzdHJ1Y3QgYm9vbF88ZmFsc2U+IHsgIH07CisKKyNkZWZpbmUgWENBVCh4LHkpIHggIyMgeQorI2RlZmluZSBDQVQoeCx5KSBYQ0FUKHgseSkKKyNkZWZpbmUgc2Fzc2VydChfYl8pIGJvb2xfPChfYl8pPjo6dHlwZSBDQVQodmFyLCBfX0xJTkVfXyk7CisKKwordGVtcGxhdGUgPGludD4KK3N0cnVjdCBMIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBPIHsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgICBzdGF0aWMgb25lVCBGdW4oVSk7CisgICAgCisgIH07Cit9OwordGVtcGxhdGUgPGludCBrPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KK29uZVQgTDxrPjo6TzxUPjo6RnVuKFUpIHsgcmV0dXJuIG9uZTsgfQorCit0ZW1wbGF0ZTw+Cit0ZW1wbGF0ZTw+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorb25lVCBMPDA+OjpPPGNoYXI+OjpGdW4oVSkgeyByZXR1cm4gb25lOyB9CisKKwordm9pZCBJbnN0YW50aWF0ZSgpIHsgCisgIHNhc3NlcnQoc2l6ZW9mKEw8MD46Ok88aW50Pjo6RnVuKDApKSA9PSBzaXplb2Yob25lKSk7IAorICBzYXNzZXJ0KHNpemVvZihMPDA+OjpPPGNoYXI+OjpGdW4oMCkpID09IHNpemVvZihvbmUpKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvY3h4LXVzaW5nLWRlY2xhcmF0aW9uLmNwcCBiL3Rlc3QvUGFyc2VyL2N4eC11c2luZy1kZWNsYXJhdGlvbi5jcHAKaW5kZXggMzIwZmQwOS4uMTcyMzdhMyAxMDA2NDQKLS0tIGEvdGVzdC9QYXJzZXIvY3h4LXVzaW5nLWRlY2xhcmF0aW9uLmNwcAorKysgYi90ZXN0L1BhcnNlci9jeHgtdXNpbmctZGVjbGFyYXRpb24uY3BwCkBAIC0zMyw3ICszMyw3IEBACiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+IGludCBmdW5jRShUWVBFIGFyZykgeyByZXR1cm4oYXJnKTsgfQogfQogCi11c2luZyBFOjpmdW5jRTxpbnQ+OyAvLyBleHBlY3RlZC1lcnJvcnt7dXNpbmcgZGVjbGFyYXRpb24gY2FuIG5vdCByZWZlciB0byBhIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ufX0KK3VzaW5nIEU6OmZ1bmNFPGludD47IC8vIGV4cGVjdGVkLWVycm9ye3t1c2luZyBkZWNsYXJhdGlvbiBjYW5ub3QgcmVmZXIgdG8gYSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbn19CiAKIG5hbWVzcGFjZSBGIHsKICAgICBzdHJ1Y3QgWDsKZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VyL2N4eDB4LWFtYmlnLmNwcCBiL3Rlc3QvUGFyc2VyL2N4eDB4LWFtYmlnLmNwcAppbmRleCA0YzIyZWQzLi5iMDZmNDMyIDEwMDY0NAotLS0gYS90ZXN0L1BhcnNlci9jeHgweC1hbWJpZy5jcHAKKysrIGIvdGVzdC9QYXJzZXIvY3h4MHgtYW1iaWcuY3BwCkBAIC00OCw3ICs0OCw3IEBACiAgIH07CiAgIC8vIFRoaXMgY291bGQgYmUgYSBiaXQtZmllbGQuCiAgIHN0cnVjdCBTMiB7Ci0gICAgZW51bSBFIDogVCB7IGEgPSAxLCBiID0gMiwgYyA9IDMsIDQgfTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tub24taW50ZWdyYWwgdHlwZX19IGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJ30nfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNofX0KKyAgICBlbnVtIEUgOiBUIHsgYSA9IDEsIGIgPSAyLCBjID0gMywgNCB9OyAvLyBleHBlY3RlZC1lcnJvciB7e25vbi1pbnRlZ3JhbCB0eXBlfX0gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBpZGVudGlmaWVyfX0KICAgfTsKICAgc3RydWN0IFMzIHsKICAgICBlbnVtIEUgOiBpbnQgeyBhID0gMSwgYiA9IDIsIGMgPSAzLCBkIH07IC8vIG9rLCBkZWZpbmVzIGFuIGVudW0KQEAgLTY0LDcgKzY0LDcgQEAKICAgfTsKICAgLy8gVGhpcyBjb3VsZCBiZSBhIGJpdC1maWVsZC4KICAgc3RydWN0IFM2IHsKLSAgICBlbnVtIEUgOiBpbnQgeyAxIH07IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJ30nfX0gZXhwZWN0ZWQtbm90ZSB7e3RvIG1hdGNofX0KKyAgICBlbnVtIEUgOiBpbnQgeyAxIH07IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgaWRlbnRpZmllcn19CiAgIH07CiAKICAgc3RydWN0IFUgewpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvY3h4MHgtYXR0cmlidXRlcy5jcHAgYi90ZXN0L1BhcnNlci9jeHgweC1hdHRyaWJ1dGVzLmNwcAppbmRleCBiMDJhZGQ5Li4xYjllNDc3IDEwMDY0NAotLS0gYS90ZXN0L1BhcnNlci9jeHgweC1hdHRyaWJ1dGVzLmNwcAorKysgYi90ZXN0L1BhcnNlci9jeHgweC1hdHRyaWJ1dGVzLmNwcApAQCAtNDgsMTMgKzQ4LDEzIEBACiBhbGlnbmFzKDgpIGludCBhbGlnbmVkX2F0dHI7CiBbW3Rlc3Q6OnZhbGlkKGZvciA0MiBbdmVyeV0gKioqKiAnKycgc3ltYm9scyB3ZW50IG9uIGEgdHJpcCBhbmQgaGFkIGEgImdvb2QiX3RpbWU7IHRoZSBlbmQuKV1dIGludCBnYXJiYWdlX2F0dHI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmtub3duIGF0dHJpYnV0ZSAndmFsaWQnIGlnbm9yZWR9fQogW1ssLCxzdGF0aWMsIGNsYXNzLCBuYW1lc3BhY2UsLCBpbmxpbmUsIGNvbnN0ZXhwciwgbXV0YWJsZSwsIGJpdGFuZCwgYml0b3I6OmNvbXBsKCEuKl8gQ3guIVVeKlIpLCwsXV0gaW50IG1vcmVfZ2FyYmFnZV9hdHRyOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBhdHRyaWJ1dGUgJ3N0YXRpYycgaWdub3JlZH19IFwKLQkvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBhdHRyaWJ1dGUgJ2NsYXNzJyBpZ25vcmVkfX0gXAotCS8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmtub3duIGF0dHJpYnV0ZSAnbmFtZXNwYWNlJyBpZ25vcmVkfX0gXAotCS8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmtub3duIGF0dHJpYnV0ZSAnaW5saW5lJyBpZ25vcmVkfX0gXAotCS8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmtub3duIGF0dHJpYnV0ZSAnY29uc3RleHByJyBpZ25vcmVkfX0gXAotCS8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmtub3duIGF0dHJpYnV0ZSAnbXV0YWJsZScgaWdub3JlZH19IFwKLQkvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBhdHRyaWJ1dGUgJ2JpdGFuZCcgaWdub3JlZH19IFwKLSAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Vua25vd24gYXR0cmlidXRlICdjb21wbCcgaWdub3JlZH19CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Vua25vd24gYXR0cmlidXRlICdjbGFzcycgaWdub3JlZH19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBhdHRyaWJ1dGUgJ25hbWVzcGFjZScgaWdub3JlZH19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBhdHRyaWJ1dGUgJ2lubGluZScgaWdub3JlZH19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBhdHRyaWJ1dGUgJ2NvbnN0ZXhwcicgaWdub3JlZH19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBhdHRyaWJ1dGUgJ211dGFibGUnIGlnbm9yZWR9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Vua25vd24gYXR0cmlidXRlICdiaXRhbmQnIGlnbm9yZWR9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Vua25vd24gYXR0cmlidXRlICdjb21wbCcgaWdub3JlZH19CiBbW3U4ImludmFsaWQhIl1dIGludCBpbnZhbGlkX3N0cmluZ19hdHRyOyAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICddJ319CiB2b2lkIGZuX2F0dHIgKCkgW1tdXTsKIHZvaWQgbm9leGNlcHRfZm5fYXR0ciAoKSBub2V4Y2VwdCBbW11dOwpAQCAtNzgsMTEgKzc4LDExIEBACiBjbGFzcyBjIGZpbmFsIFsoaW50KXswfV07CiAKIGNsYXNzIGJhc2Uge307Ci1jbGFzcyBbW11dIFtbXV0gZmluYWxfY2xhc3MgCitjbGFzcyBbW11dIFtbXV0gZmluYWxfY2xhc3MKICAgYWxpZ25hcyhmbG9hdCkgW1tdXSBmaW5hbCAvLyBleHBlY3RlZC1lcnJvciB7e2FuIGF0dHJpYnV0ZSBsaXN0IGNhbm5vdCBhcHBlYXIgaGVyZX19CiAgIGFsaWduYXMoZmxvYXQpIFtbXV0gW1tdXSBhbGlnbmFzKGZsb2F0KTogYmFzZXt9OyAvLyBleHBlY3RlZC1lcnJvciB7e2FuIGF0dHJpYnV0ZSBsaXN0IGNhbm5vdCBhcHBlYXIgaGVyZX19CiAKLWNsYXNzIFtbXV0gW1tdXSBmaW5hbF9jbGFzc19hbm90aGVyIAorY2xhc3MgW1tdXSBbW11dIGZpbmFsX2NsYXNzX2Fub3RoZXIKICAgW1tdXSBbW11dIGFsaWduYXMoMTYpIGZpbmFsIC8vIGV4cGVjdGVkLWVycm9yIHt7YW4gYXR0cmlidXRlIGxpc3QgY2Fubm90IGFwcGVhciBoZXJlfX0KICAgW1tdXSBbW11dIGFsaWduYXMoMTYpIFtbXV17fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thbiBhdHRyaWJ1dGUgbGlzdCBjYW5ub3QgYXBwZWFyIGhlcmV9fQogCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogW1tdXSB1c2luZyBuczo6aTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thbiBhdHRyaWJ1dGUgbGlzdCBjYW5ub3QgYXBwZWFyIGhlcmV9fQogW1t1bmtub3duXV0gdXNpbmcgbmFtZXNwYWNlIG5zOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBhdHRyaWJ1dGUgJ3Vua25vd24nIGlnbm9yZWR9fQotW1tub3JldHVybl1dIHVzaW5nIG5hbWVzcGFjZSBuczsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snbm9yZXR1cm4nIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zIGFuZCBtZXRob2RzfX0KK1tbbm9yZXR1cm5dXSB1c2luZyBuYW1lc3BhY2UgbnM7IC8vIGV4cGVjdGVkLWVycm9yIHt7J25vcmV0dXJuJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9uc319CiAKIHVzaW5nIFtbXV0gYWxpZ25hcyg0KSBbW11dIG5zOjppOyAvLyBleHBlY3RlZC1lcnJvciB7e2FuIGF0dHJpYnV0ZSBsaXN0IGNhbm5vdCBhcHBlYXIgaGVyZX19CiB1c2luZyBbW11dIGFsaWduYXMoNCkgW1tdXSBmb29iYXIgPSBpbnQ7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW4gYXR0cmlidXRlIGxpc3QgY2Fubm90IGFwcGVhciBoZXJlfX0gZXhwZWN0ZWQtZXJyb3Ige3snYWxpZ25hcycgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0b319CkBAIC0xNDYsNyArMTQ2LDcgQEAKIHVzaW5nIG5zOjppIFtbXV07IC8vIGV4cGVjdGVkLWVycm9yIHt7YW4gYXR0cmlidXRlIGxpc3QgY2Fubm90IGFwcGVhciBoZXJlfX0KIHVzaW5nIFtbXV0gbnM6Omk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW4gYXR0cmlidXRlIGxpc3QgY2Fubm90IGFwcGVhciBoZXJlfX0KIHVzaW5nIFQgW1t1bmtub3duXV0gPSBpbnQ7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmtub3duIGF0dHJpYnV0ZSAndW5rbm93bicgaWdub3JlZH19Ci11c2luZyBUIFtbbm9yZXR1cm5dXSA9IGludDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snbm9yZXR1cm4nIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zIGFuZCBtZXRob2RzfX0KK3VzaW5nIFQgW1tub3JldHVybl1dID0gaW50OyAvLyBleHBlY3RlZC1lcnJvciB7eydub3JldHVybicgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQogdXNpbmcgViA9IGludDsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KIHVzaW5nIFYgW1tnbnU6OnZlY3Rvcl9zaXplKDE2KV1dID0gaW50OyAvLyBleHBlY3RlZC1lcnJvciB7e3JlZGVmaW5pdGlvbiB3aXRoIGRpZmZlcmVudCB0eXBlc319CiAKQEAgLTIxMCwxNiArMjEwLDE2IEBACiAgICAgW1tdXSBjb250aW51ZTsKICAgfSB3aGlsZSAoMCk7CiAgIFtbXV0gd2hpbGUgKDApOwotICAKKwogICBbW11dIHN3aXRjaCAoaSkgewogICAgIFtbXV0gY2FzZSAwOgogICAgIFtbXV0gZGVmYXVsdDoKICAgICAgIFtbXV0gYnJlYWs7CiAgIH0KLSAgCisKICAgW1tdXSBnb3RvIHRoZXJlOwogICBbW11dIHRoZXJlOgotICAKKwogICBbW11dIHRyeSB7CiAgIH0gW1tdXSBjYXRjaCAoLi4uKSB7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW4gYXR0cmlidXRlIGxpc3QgY2Fubm90IGFwcGVhciBoZXJlfX0KICAgfQpAQCAtMjgxLDcgKzI4MSw4IEBACiAKIG5hbWVzcGFjZSBhcmd1bWVudHMgewogICB2b2lkIGZbW2dudTo6Zm9ybWF0KHByaW50ZiwgMSwgMildXShjb25zdCBjaGFyKiwgLi4uKTsKLSAgdm9pZCBnKCkgW1t1bmtub3duOjpmb28oYXJndW1lbnRzIG9mIGF0dHJpYnV0ZXMgZnJvbSB1bmtub3duIG5hbWVzcGFjZSBvdGhlciB0aGFuICdnbnUnIG5hbWVzcGFjZSBhcmUgaWdub3JlZC4uLiBibGFoLi4uKV1dOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBhdHRyaWJ1dGUgJ2ZvbycgaWdub3JlZH19CisgIHZvaWQgZygpIFtbdW5rbm93bjo6Zm9vKGlnbm9yZSBhcmd1bWVudHMgZm9yIHVua25vd24gYXR0cmlidXRlcywgZXZlbiB3aXRoIHN5bWJvbHMhKV1dOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBhdHRyaWJ1dGUgJ2ZvbycgaWdub3JlZH19CisgIFtbZGVwcmVjYXRlZCgid2l0aCBhcmd1bWVudCIpXV0gaW50IGk7CiB9CiAKIC8vIEZvcmJpZCBhdHRyaWJ1dGVzIG9uIGRlY2wgc3BlY2lmaWVycy4KQEAgLTI5Nyw3ICsyOTgsNyBAQAogaW50IHY1KClbW2dudTo6dW51c2VkXV07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3thdHRyaWJ1dGUgJ3VudXNlZCcgaWdub3JlZH19CiAKIFtbYXR0cmlidXRlX2RlY2xhcmF0aW9uXV07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmtub3duIGF0dHJpYnV0ZSAnYXR0cmlidXRlX2RlY2xhcmF0aW9uJyBpZ25vcmVkfX0KLVtbbm9yZXR1cm5dXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snbm9yZXR1cm4nIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zIGFuZCBtZXRob2RzfX0KK1tbbm9yZXR1cm5dXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snbm9yZXR1cm4nIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zfX0KIFtbY2Fycmllc19kZXBlbmRlbmN5XV07IC8vIGV4cGVjdGVkLWVycm9yIHt7J2NhcnJpZXNfZGVwZW5kZW5jeScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnMsIG1ldGhvZHMsIGFuZCBwYXJhbWV0ZXJzfX0KIAogY2xhc3MgQSB7CkBAIC0zMDksOCArMzEwLDEwIEBACiAgIC8vIEdDQydzIHRva2VuaXplciB0cmVhdHMgY29uc3QgYW5kIF9fY29uc3QgYXMgdGhlIHNhbWUgdG9rZW4uCiAgIFtbZ251Ojpjb25zdF1dIGludCAqZjEoKTsKICAgW1tnbnU6Ol9fY29uc3RdXSBpbnQgKmYyKCk7CisgIFtbZ251OjpfX2NvbnN0X19dXSBpbnQgKmYzKCk7CiAgIHZvaWQgZihjb25zdCBpbnQgKik7CiAgIHZvaWQgZygpIHsgZihmMSgpKTsgZihmMigpKTsgfQorICB2b2lkIGgoKSB7IGYoZjMoKSk7IH0KIH0KIAogbmFtZXNwYWNlIEdjY0FTYW4gewpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvY3h4MHgtZGVjbC5jcHAgYi90ZXN0L1BhcnNlci9jeHgweC1kZWNsLmNwcAppbmRleCAyNTdjNTZjLi5hMDMzNGNkIDEwMDY0NAotLS0gYS90ZXN0L1BhcnNlci9jeHgweC1kZWNsLmNwcAorKysgYi90ZXN0L1BhcnNlci9jeHgweC1kZWNsLmNwcApAQCAtMTA0LDMgKzEwNCwyMSBAQAogICB1c2luZyBbW2dudTo6YWxpZ25lZCgxKV1dIFQgPSBpbnQ7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW4gYXR0cmlidXRlIGxpc3QgY2Fubm90IGFwcGVhciBoZXJlfX0KICAgdXNpbmcgVCA9IGludCBbW2dudTo6YWxpZ25lZCgxKV1dOyAvLyBleHBlY3RlZC1lcnJvciB7eydhbGlnbmVkJyBhdHRyaWJ1dGUgY2Fubm90IGJlIGFwcGxpZWQgdG8gdHlwZXN9fQogfQorCituYW1lc3BhY2UgRHVwbGljYXRlU3BlY2lmaWVyIHsKKyAgY29uc3RleHByIGNvbnN0ZXhwciBpbnQgZigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZHVwbGljYXRlICdjb25zdGV4cHInIGRlY2xhcmF0aW9uIHNwZWNpZmllcn19CisgIGNvbnN0ZXhwciBpbnQgY29uc3RleHByIGEgPSAwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZHVwbGljYXRlICdjb25zdGV4cHInIGRlY2xhcmF0aW9uIHNwZWNpZmllcn19CisKKyAgc3RydWN0IEEgeworICAgIGZyaWVuZCBjb25zdGV4cHIgaW50IGNvbnN0ZXhwciBmcmllbmQgZigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZHVwbGljYXRlICdmcmllbmQnIGRlY2xhcmF0aW9uIHNwZWNpZmllcn19IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2R1cGxpY2F0ZSAnY29uc3RleHByJyBkZWNsYXJhdGlvbiBzcGVjaWZpZXJ9fQorICAgIGZyaWVuZCBzdHJ1Y3QgQSBmcmllbmQ7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tkdXBsaWNhdGUgJ2ZyaWVuZCd9fSBleHBlY3RlZC1lcnJvciB7eydmcmllbmQnIG11c3QgYXBwZWFyIGZpcnN0fX0KKyAgfTsKK30KKworc3RydWN0IEJhc2UgeyB2aXJ0dWFsIHZvaWQgZigpID0gMDsgdmlydHVhbCB2b2lkIGcoKSA9IDA7IHZpcnR1YWwgdm9pZCBoKCkgPSAwOyB9Oworc3RydWN0IE1lbWJlckNvbXBvbmVudE9yZGVyIDogQmFzZSB7CisgIHZvaWQgZigpIG92ZXJyaWRlIF9fYXNtX18oImZvb2JhciIpIF9fYXR0cmlidXRlX18oKCApKSB7fQorICB2b2lkIGcoKSBfX2F0dHJpYnV0ZV9fKCggKSkgb3ZlcnJpZGU7CisgIHZvaWQgaCgpIF9fYXR0cmlidXRlX18oKCApKSBvdmVycmlkZSB7fQorfTsKZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VyL2N4eDB4LWxhbWJkYS1leHByZXNzaW9ucy5jcHAgYi90ZXN0L1BhcnNlci9jeHgweC1sYW1iZGEtZXhwcmVzc2lvbnMuY3BwCmluZGV4IDI4OWQwM2MuLjUzZWEwNWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL2N4eDB4LWxhbWJkYS1leHByZXNzaW9ucy5jcHAKKysrIGIvdGVzdC9QYXJzZXIvY3h4MHgtbGFtYmRhLWV4cHJlc3Npb25zLmNwcApAQCAtMzQsNyArMzQsNyBAQAogICAgIHR5cGVkZWYgaW50IFQ7IAogICAgIGNvbnN0IGludCBiID0gMDsgCiAgICAgY29uc3QgaW50IGMgPSAxOwotICAgIGludCBhMVsxXSA9IHtbYl0gKFQoKSkge319OyAvLyBleHBlY3RlZC1lcnJvcnt7bm8gdmlhYmxlIGNvbnZlcnNpb24gZnJvbSAnPGxhbWJkYX19CisgICAgaW50IGExWzFdID0ge1tiXSAoVCgpKSB7fX07IC8vIGV4cGVjdGVkLWVycm9ye3tubyB2aWFibGUgY29udmVyc2lvbiBmcm9tICcobGFtYmRhfX0KICAgICBpbnQgYTJbMV0gPSB7W2JdID0gMSB9OwogICAgIGludCBhM1sxXSA9IHtbYixjXSA9IDEgfTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2V4cGVjdGVkIGJvZHkgb2YgbGFtYmRhIGV4cHJlc3Npb259fQogICAgIGludCBhNFsxXSA9IHtbJmJdID0gMSB9OyAvLyBleHBlY3RlZC1lcnJvcnt7aW50ZWdyYWwgY29uc3RhbnQgZXhwcmVzc2lvbiBtdXN0IGhhdmUgaW50ZWdyYWwgb3IgdW5zY29wZWQgZW51bWVyYXRpb24gdHlwZSwgbm90ICdjb25zdCBpbnQgKid9fQpAQCAtNjQsNCArNjQsMjIgQEAKICAgICAgIHJldHVybiB4ICsgMjsKICAgICB9ICgpOwogICB9CisKKyAgdm9pZCBhdHRyaWJ1dGVzKCkgeworICAgIFtdIFtbXV0ge307IC8vIGV4cGVjdGVkLWVycm9yIHt7bGFtYmRhIHJlcXVpcmVzICcoKScgYmVmb3JlIGF0dHJpYnV0ZSBzcGVjaWZpZXJ9fQorICAgIFtdIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkge307IC8vIGV4cGVjdGVkLWVycm9yIHt7bGFtYmRhIHJlcXVpcmVzICcoKScgYmVmb3JlIGF0dHJpYnV0ZSBzcGVjaWZpZXJ9fQorICAgIFtdKCkgW1tdXQorICAgICAgbXV0YWJsZSB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBib2R5IG9mIGxhbWJkYSBleHByZXNzaW9ufX0KKworICAgIFtdKCkgW1tdXSB7fTsKKyAgICBbXSgpIFtbXV0gLT4gdm9pZCB7fTsKKyAgICBbXSgpIG11dGFibGUgW1tdXSAtPiB2b2lkIHt9OworICAgIFtdKCkgbXV0YWJsZSBub2V4Y2VwdCBbW11dIC0+IHZvaWQge307CisKKyAgICAvLyBUZXN0aW5nIEdOVS1zdHlsZSBhdHRyaWJ1dGVzIG9uIGxhbWJkYXMgLS0gdGhlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQKKyAgICAvLyBiZWZvcmUgdGhlIG11dGFibGUgc3BlY2lmaWVyIGluc3RlYWQgb2YgYWZ0ZXIgKHVubGlrZSBDKysxMSkuCisgICAgW10oKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIG11dGFibGUgeyB3aGlsZSgxKTsgfTsKKyAgICBbXSgpIG11dGFibGUKKyAgICAgIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkgeyB3aGlsZSgxKTsgfTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBib2R5IG9mIGxhbWJkYSBleHByZXNzaW9ufX0KKyAgfQogfTsKZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VyL2N4eDB4LXJ2YWx1ZS1yZWZlcmVuY2UuY3BwIGIvdGVzdC9QYXJzZXIvY3h4MHgtcnZhbHVlLXJlZmVyZW5jZS5jcHAKaW5kZXggZTU3ZTYwMS4uNjEzYjgyOCAxMDA2NDQKLS0tIGEvdGVzdC9QYXJzZXIvY3h4MHgtcnZhbHVlLXJlZmVyZW5jZS5jcHAKKysrIGIvdGVzdC9QYXJzZXIvY3h4MHgtcnZhbHVlLXJlZmVyZW5jZS5jcHAKQEAgLTMsNyArMyw3IEBACiBpbnQgJiYgcjEoaW50ICYmYSk7CiAKIHR5cGVkZWYgaW50ICYmIFI7Ci12b2lkIHIyKGNvbnN0IFIgYSkgewordm9pZCByMihjb25zdCBSIGEpIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydjb25zdCcgcXVhbGlmaWVyIG9uIHJlZmVyZW5jZSB0eXBlICdSJyAoYWthICdpbnQgJiYnKSBoYXMgbm8gZWZmZWN0fX0KICAgaW50ICYgJiZhciA9IGE7IC8vIGV4cGVjdGVkLWVycm9ye3snYXInIGRlY2xhcmVkIGFzIGEgcmVmZXJlbmNlIHRvIGEgcmVmZXJlbmNlfX0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvY3h4MTEtdHlwZS1zcGVjaWZpZXIuY3BwIGIvdGVzdC9QYXJzZXIvY3h4MTEtdHlwZS1zcGVjaWZpZXIuY3BwCmluZGV4IGM2NjQ2MmEuLjE2NzY2MjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL2N4eDExLXR5cGUtc3BlY2lmaWVyLmNwcAorKysgYi90ZXN0L1BhcnNlci9jeHgxMS10eXBlLXNwZWNpZmllci5jcHAKQEAgLTE1LDggKzE1LDggQEAKIAogICAvLyBUaGVzZSBwYXJzZSBhcyB0eXBlIGRlZmluaXRpb25zLCBub3QgYXMgdHlwZSByZWZlcmVuY2VzIHdpdGggYnJhY2VkCiAgIC8vIGluaXRpYWxpemVycy4gU2FkIGJ1dCB0cnVlLi4uCi0gICh2b2lkKSBuZXcgc3RydWN0IFMge307IC8vIGV4cGVjdGVkLWVycm9ye3snUycgY2FuIG5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBzcGVjaWZpZXJ9fQotICAodm9pZCkgbmV3IGVudW0gRSB7IGUgfTsgLy8gZXhwZWN0ZWQtZXJyb3J7eydFJyBjYW4gbm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CisgICh2b2lkKSBuZXcgc3RydWN0IFMge307IC8vIGV4cGVjdGVkLWVycm9ye3snUycgY2Fubm90IGJlIGRlZmluZWQgaW4gYSB0eXBlIHNwZWNpZmllcn19CisgICh2b2lkKSBuZXcgZW51bSBFIHsgZSB9OyAvLyBleHBlY3RlZC1lcnJvcnt7J0UnIGNhbm5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBzcGVjaWZpZXJ9fQogfQogCiAvLyBBbmQgZm9yIHRyYWlsaW5nLXR5cGUtc3BlY2lmaWVyLXNlcQpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvY3h4MTEtdXNlci1kZWZpbmVkLWxpdGVyYWxzLmNwcCBiL3Rlc3QvUGFyc2VyL2N4eDExLXVzZXItZGVmaW5lZC1saXRlcmFscy5jcHAKaW5kZXggNjEzYzBiOS4uYTc0NDY1MiAxMDA2NDQKLS0tIGEvdGVzdC9QYXJzZXIvY3h4MTEtdXNlci1kZWZpbmVkLWxpdGVyYWxzLmNwcAorKysgYi90ZXN0L1BhcnNlci9jeHgxMS11c2VyLWRlZmluZWQtbGl0ZXJhbHMuY3BwCkBAIC0xNSw3ICsxNSw3IEBACiAjZWxpZiBfX2hhc19pbmNsdWRlKCJmb28iX2JhcikgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAiRklMRU5BTUUiIG9yIDxGSUxFTkFNRT59fQogI2VuZGlmCiAKLWV4dGVybiAiQysrIl94IHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7dXNlci1kZWZpbmVkIHN1ZmZpeCBjYW5ub3QgYmUgdXNlZCBoZXJlfX0gZXhwZWN0ZWQtZXJyb3Ige3t1bmtub3duIGxpbmthZ2UgbGFuZ3VhZ2V9fQorZXh0ZXJuICJDKysiX3gge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2VyLWRlZmluZWQgc3VmZml4IGNhbm5vdCBiZSB1c2VkIGhlcmV9fQogCiBpbnQgZigpIHsKICAgYXNtKCJtb3YgJWVheCwgJXJkeCJfZm9vKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2VyLWRlZmluZWQgc3VmZml4IGNhbm5vdCBiZSB1c2VkIGhlcmV9fQpAQCAtMTExLDMgKzExMSwzNSBAQAogVSIiIC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGhhdmUgYW4gZW5jb2RpbmcgcHJlZml4fX0KICIiIF9hbHNvX25vdF9jaGFyKGNvbnN0IGNoYXIgKik7CiB2b2lkIG9wZXJhdG9yICIiIHU4IiIgIlx1MDEyMyIgImhlbGxvIl9hbGxfb2ZfdGhlX3RoaW5ncyAiIihjb25zdCBjaGFyKik7IC8vIGV4cGVjdGVkLWVycm9yIHt7bXVzdCBiZSAnIiInfX0KKworLy8gTWFrZSBzdXJlIHdlIHRyZWF0IFVDTnMgYW5kIFVURi04IGFzIGVxdWl2YWxlbnQuCitpbnQgb3BlcmF0b3IiIl/CtXModW5zaWduZWQgbG9uZyBsb25nKSB7fSAvLyBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXN9fQoraW50IGh1bmRyZWRfwrVzID0gNTBfwrVzICsgNTBfXHUwMGI1czsKK2ludCBvcGVyYXRvciIiX1x1MDBiNXModW5zaWduZWQgbG9uZyBsb25nKSB7fSAvLyBleHBlY3RlZC1lcnJvciB7e3JlZGVmaW5pdGlvbiBvZiAnb3BlcmF0b3IgIiIgX8K1cyd9fQorCitpbnQgb3BlcmF0b3IiIl9cVTAwMDAyMTJCKGxvbmcgZG91YmxlKSB7fSAvLyBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXN9fQoraW50IGh1bmRyZWRf4oSrID0gNTAuMF/ihKsgKyA1MC5fXFUwMDAwMjEyQjsKK2ludCBvcGVyYXRvciIiX+KEqyhsb25nIGRvdWJsZSkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZWRlZmluaXRpb24gb2YgJ29wZXJhdG9yICIiIF/ihKsnfX0KKworaW50IG9wZXJhdG9yIiJf8JCAgChjaGFyKSB7fSAvLyBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXN9fQoraW50IPCQgIAgPSAnNCdf8JCAgCArICcyJ19cVTAwMDEwMDAwOworaW50IG9wZXJhdG9yIiJfXFUwMDAxMDAwMChjaGFyKSB7fSAvLyBleHBlY3RlZC1lcnJvciB7e3JlZGVmaW5pdGlvbiBvZiAnb3BlcmF0b3IgIiIgX/CQgIAnfX0KKworLy8gVGhlc2UgYWxsIGRlY2xhcmUgdGhlIHNhbWUgZnVuY3Rpb24uCitpbnQgb3BlcmF0b3IiIl/ihK4iIl9cdTIxMmUiIl9cVTAwMDAyMTJlIiIoY29uc3QgY2hhciosIHNpemVfdCk7CitpbnQgb3BlcmF0b3IiIl9cdTIxMmUiIl9cVTAwMDAyMTJlIiJf4oSuIiIoY29uc3QgY2hhciosIHNpemVfdCk7CitpbnQgb3BlcmF0b3IiIl9cVTAwMDAyMTJlIiJf4oSuIiJfXHUyMTJlIiIoY29uc3QgY2hhciosIHNpemVfdCk7CitpbnQgbWl4X3Vjbl91dGY4ID0gIiJf4oSuIiJfXHUyMTJlIiJfXFUwMDAwMjEyZSIiOworCit2b2lkIG9wZXJhdG9yIiJf4oSuIiJf4oSvKHVuc2lnbmVkIGxvbmcgbG9uZykge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tkaWZmZXJpbmcgdXNlci1kZWZpbmVkIHN1ZmZpeGVzICgnX+KEricgYW5kICdf4oSvJykgaW4gc3RyaW5nIGxpdGVyYWwgY29uY2F0ZW5hdGlvbn19Cit2b2lkIG9wZXJhdG9yIiJf4oSuIiJfXHUyMTJmKHVuc2lnbmVkIGxvbmcgbG9uZykge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tkaWZmZXJpbmcgdXNlci1kZWZpbmVkIHN1ZmZpeGVzICgnX+KEricgYW5kICdf4oSvJykgaW4gc3RyaW5nIGxpdGVyYWwgY29uY2F0ZW5hdGlvbn19Cit2b2lkIG9wZXJhdG9yIiJfXHUyMTJlIiJf4oSvKHVuc2lnbmVkIGxvbmcgbG9uZykge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tkaWZmZXJpbmcgdXNlci1kZWZpbmVkIHN1ZmZpeGVzICgnX+KEricgYW5kICdf4oSvJykgaW4gc3RyaW5nIGxpdGVyYWwgY29uY2F0ZW5hdGlvbn19Cit2b2lkIG9wZXJhdG9yIiJfXHUyMTJlIiJfXHUyMTJmKHVuc2lnbmVkIGxvbmcgbG9uZykge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tkaWZmZXJpbmcgdXNlci1kZWZpbmVkIHN1ZmZpeGVzICgnX+KEricgYW5kICdf4oSvJykgaW4gc3RyaW5nIGxpdGVyYWwgY29uY2F0ZW5hdGlvbn19CisKK3ZvaWQgb3BlcmF0b3IiIl/ihK4iIl/ihK4odW5zaWduZWQgbG9uZyBsb25nKSB7fSAvLyBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXN9fQordm9pZCBvcGVyYXRvciIiX1x1MjEyZSIiX1x1MjEyZSh1bnNpZ25lZCBsb25nIGxvbmcpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVkZWZpbml0aW9ufX0KKworI2RlZmluZSDCoiAqMC4wMSAvLyBleHBlY3RlZC1lcnJvciB7e21hY3JvIG5hbWVzIG11c3QgYmUgaWRlbnRpZmllcnN9fQorY29uc3RleHByIGludCBvcGVyYXRvciIiX8KiKGxvbmcgZG91YmxlIGQpIHsgcmV0dXJuIGQgKiAxMDA7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3tub24tQVNDSUl9fQorY29uc3RleHByIGludCBvcGVyYXRvciIiX8KiKHVuc2lnbmVkIGxvbmcgbG9uZyBuKSB7IHJldHVybiBuOyB9IC8vIGV4cGVjdGVkLWVycm9yIHt7bm9uLUFTQ0lJfX0KK3N0YXRpY19hc3NlcnQoMC4wMl/CoiA9PSAyX8KiLCAiIik7IC8vIGV4cGVjdGVkLWVycm9yIDJ7e25vbi1BU0NJSX19CmRpZmYgLS1naXQgYS90ZXN0L1BhcnNlci9kZWNsYXJhdG9ycy5jIGIvdGVzdC9QYXJzZXIvZGVjbGFyYXRvcnMuYwppbmRleCAyMTBhOGUyLi4zOWQ5ZGM5IDEwMDY0NAotLS0gYS90ZXN0L1BhcnNlci9kZWNsYXJhdG9ycy5jCisrKyBiL3Rlc3QvUGFyc2VyL2RlY2xhcmF0b3JzLmMKQEAgLTEwMCw2ICsxMDAsNyBAQAogCiB2b2lkIHRlc3QxNihpKSBpbnQgaSBqOyB7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnOycgYXQgZW5kIG9mIGRlY2xhcmF0aW9ufX0KIHZvaWQgdGVzdDE3KGksIGopIGludCBpLCBqIGs7IHsgfSAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICc7JyBhdCBlbmQgb2YgZGVjbGFyYXRpb259fQordm9pZCBrbnJOb1NlbWkoaSkgaW50IGkgeyB9IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJzsnIGF0IGVuZCBvZiBkZWNsYXJhdGlvbn19CiAKIAogLy8gUFIxMjU5NQpAQCAtMTEzLDMgKzExNCwzNyBAQAogICBzdHJ1Y3QgUyB7IGludCBuOyB9OiAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkICc7J319CiAKIH07CisKKy8vIFBSMTA5ODIKK2VudW0gRTExIHsKKyAgQTEgPSAxLAorfTsKKworZW51bSBFMTIgeworICAsICAvLyBleHBlY3RlZC1lcnJvcnt7ZXhwZWN0ZWQgaWRlbnRpZmllcn19CisgIEEyCit9Owordm9pZCBmdW5jX0UxMihlbnVtIEUxMiAqcCkgeyAqcCA9IEEyOyB9CisKK2VudW0gRTEzIHsKKyAgMUQsICAvLyBleHBlY3RlZC1lcnJvcnt7ZXhwZWN0ZWQgaWRlbnRpZmllcn19CisgIEEzCit9Owordm9pZCBmdW5jX0UxMyhlbnVtIEUxMyAqcCkgeyAqcCA9IEEzOyB9CisKK2VudW0gRTE0IHsKKyAgQTQgMTIsICAvLyBleHBlY3RlZC1lcnJvcnt7ZXhwZWN0ZWQgJz0gY29uc3RhbnQtZXhwcmVzc2lvbicgb3IgZW5kIG9mIGVudW1lcmF0b3IgZGVmaW5pdGlvbn19CisgIEE0YQorfTsKK3ZvaWQgZnVuY19FMTQoZW51bSBFMTQgKnApIHsgKnAgPSBBNGE7IH0KKworZW51bSBFMTUgeworICBBNT0xMiA0LCAgLy8gZXhwZWN0ZWQtZXJyb3J7e2V4cGVjdGVkICd9JyBvciAnLCd9fQorICBBNWEKK307Cit2b2lkIGZ1bmNfRTE1KGVudW0gRTE1ICpwKSB7ICpwID0gQTVhOyB9CisKK2VudW0gRTE2IHsKKyAgQTY7ICAvLyBleHBlY3RlZC1lcnJvcnt7ZXhwZWN0ZWQgJz0gY29uc3RhbnQtZXhwcmVzc2lvbicgb3IgZW5kIG9mIGVudW1lcmF0b3IgZGVmaW5pdGlvbn19CisgIEE2YQorfTsKZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VyL2RpYWctY3Jhc2guYyBiL3Rlc3QvUGFyc2VyL2RpYWctY3Jhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjEyNjVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QYXJzZXIvZGlhZy1jcmFzaC5jCkBAIC0wLDAgKzEsNiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworCisvLyBBdm9pZCBwcmVwcm9jZXNzb3IgZGlhZyBjcmFzaCBjYXVzZWQgYnkgYSBwYXJzZXIgZGlhZyBsZWZ0IGluIGZsaWdodC4KKworaW50IGZvbzogLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnOycgYWZ0ZXIgdG9wIGxldmVsIGRlY2xhcmF0b3J9fQorI2VuZGlmICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3sjZW5kaWYgd2l0aG91dCAjaWZ9fQpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvbXMtaW5saW5lLWFzbS5jIGIvdGVzdC9QYXJzZXIvbXMtaW5saW5lLWFzbS5jCmluZGV4IGRmZjE5YjQuLmE5YzE1Y2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL21zLWlubGluZS1hc20uYworKysgYi90ZXN0L1BhcnNlci9tcy1pbmxpbmUtYXNtLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSRVFVSVJFUzogZGlzYWJsZWQKKy8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlIGkzODYtYXBwbGUtZGFyd2luMTAgLXZlcmlmeSAtZmFzbS1ibG9ja3MKIAogI2RlZmluZSBNIF9fYXNtIGludCAweDJjCmRpZmYgLS1naXQgYS90ZXN0L1BhcnNlci9uYW1lc3BhY2UtYWxpYXMtYXR0ci5jcHAgYi90ZXN0L1BhcnNlci9uYW1lc3BhY2UtYWxpYXMtYXR0ci5jcHAKaW5kZXggYmE4MDkyMi4uMGJhYmE4NCAxMDA2NDQKLS0tIGEvdGVzdC9QYXJzZXIvbmFtZXNwYWNlLWFsaWFzLWF0dHIuY3BwCisrKyBiL3Rlc3QvUGFyc2VyL25hbWVzcGFjZS1hbGlhcy1hdHRyLmNwcApAQCAtNCw1ICs0LDUgQEAKIHsKIH0KIAotbmFtZXNwYWNlIEIgX19hdHRyaWJ1dGVfXyAoKCBzdGF0aWMgKSkgPSBBOyAvLyBleHBlY3RlZC1lcnJvcnt7YXR0cmlidXRlcyBjYW4gbm90IGJlIHNwZWNpZmllZCBvbiBuYW1lc3BhY2UgYWxpYXN9fQorbmFtZXNwYWNlIEIgX19hdHRyaWJ1dGVfXyAoKCBzdGF0aWMgKSkgPSBBOyAvLyBleHBlY3RlZC1lcnJvcnt7YXR0cmlidXRlcyBjYW5ub3QgYmUgc3BlY2lmaWVkIG9uIG5hbWVzcGFjZSBhbGlhc319CiAKZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VyL29iamMtZXJyb3ItcXVhbGlmaWVkLWltcGxlbWVudGF0aW9uLm0gYi90ZXN0L1BhcnNlci9vYmpjLWVycm9yLXF1YWxpZmllZC1pbXBsZW1lbnRhdGlvbi5tCmluZGV4IDhiYmQ1MDIuLjY2NDczNzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL29iamMtZXJyb3ItcXVhbGlmaWVkLWltcGxlbWVudGF0aW9uLm0KKysrIGIvdGVzdC9QYXJzZXIvb2JqYy1lcnJvci1xdWFsaWZpZWQtaW1wbGVtZW50YXRpb24ubQpAQCAtNiwyNCArNiwyNCBAQAogCiBAaW50ZXJmYWNlIEkgQGVuZAogCi1AaW1wbGVtZW50YXRpb24gSTxQPiBAZW5kIC8vIGV4cGVjdGVkLWVycm9yIHt7QGltcGxlbWVudGF0aW9uIGRlY2xhcmF0aW9uIGNhbiBub3QgYmUgcHJvdG9jb2wgcXVhbGlmaWVkfX0KK0BpbXBsZW1lbnRhdGlvbiBJPFA+IEBlbmQgLy8gZXhwZWN0ZWQtZXJyb3Ige3tAaW1wbGVtZW50YXRpb24gZGVjbGFyYXRpb24gY2Fubm90IGJlIHByb3RvY29sIHF1YWxpZmllZH19CiAKIEBpbnRlcmZhY2UgSiA8IFAsUCA+CiBAZW5kCiAKIAotQGltcGxlbWVudGF0aW9uIEogPCBQLFAgPiAvLyBleHBlY3RlZC1lcnJvciB7e0BpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbiBjYW4gbm90IGJlIHByb3RvY29sIHF1YWxpZmllZH19CitAaW1wbGVtZW50YXRpb24gSiA8IFAsUCA+IC8vIGV4cGVjdGVkLWVycm9yIHt7QGltcGxlbWVudGF0aW9uIGRlY2xhcmF0aW9uIGNhbm5vdCBiZSBwcm90b2NvbCBxdWFsaWZpZWR9fQogQGVuZAogCiBAaW50ZXJmYWNlIEsgQGVuZAogCi1AaW1wbGVtZW50YXRpb24gSyA8UCAvLyBleHBlY3RlZC1lcnJvciB7e0BpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbiBjYW4gbm90IGJlIHByb3RvY29sIHF1YWxpZmllZH19CitAaW1wbGVtZW50YXRpb24gSyA8UCAvLyBleHBlY3RlZC1lcnJvciB7e0BpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbiBjYW5ub3QgYmUgcHJvdG9jb2wgcXVhbGlmaWVkfX0KIEBlbmQgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnPid9fQogCiAvLyByZGFyOi8vMTM5MjAwMjYKLUBpbXBsZW1lbnRhdGlvbiBJIChDYXQpIDxQPiAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tAaW1wbGVtZW50YXRpb24gZGVjbGFyYXRpb24gY2FuIG5vdCBiZSBwcm90b2NvbCBxdWFsaWZpZWR9fQorQGltcGxlbWVudGF0aW9uIEkgKENhdCkgPFA+ICAvLyBleHBlY3RlZC1lcnJvciB7e0BpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbiBjYW5ub3QgYmUgcHJvdG9jb2wgcXVhbGlmaWVkfX0KIC0gKHZvaWQpIE1ldGgge30KIEBlbmQKIAotQGltcGxlbWVudGF0aW9uIEkgKENhdDEpIDxQIC8vIGV4cGVjdGVkLWVycm9yIHt7QGltcGxlbWVudGF0aW9uIGRlY2xhcmF0aW9uIGNhbiBub3QgYmUgcHJvdG9jb2wgcXVhbGlmaWVkfX0KK0BpbXBsZW1lbnRhdGlvbiBJIChDYXQxKSA8UCAvLyBleHBlY3RlZC1lcnJvciB7e0BpbXBsZW1lbnRhdGlvbiBkZWNsYXJhdGlvbiBjYW5ub3QgYmUgcHJvdG9jb2wgcXVhbGlmaWVkfX0KIEBlbmQgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnPid9fQpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvb2JqY2JyaWRnZS1yZWxhdGVkLWF0dHJpYnV0ZS5tIGIvdGVzdC9QYXJzZXIvb2JqY2JyaWRnZS1yZWxhdGVkLWF0dHJpYnV0ZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTQ0OGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1BhcnNlci9vYmpjYnJpZGdlLXJlbGF0ZWQtYXR0cmlidXRlLm0KQEAgLTAsMCArMSwxNSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZzeW50YXgtb25seSAlcworLy8gcmRhcjovLzE1NDk5MTExCisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX3JlbGF0ZWQoTlNDb2xvcixjb2xvcldpdGhDR0NvbG9yOixDR0NvbG9yKSkpIENHQ29sb3IgKkNHQ29sb3JSZWZPazsKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX3JlbGF0ZWQoTlNDb2xvciwsQ0dDb2xvcikpKSBDR0NvbG9yICpDR0NvbG9yUmVmMU9rOwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2VfcmVsYXRlZChOU0NvbG9yLCwpKSkgQ0dDb2xvciAqQ0dDb2xvclJlZjJPazsKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX3JlbGF0ZWQoTlNDb2xvcixjb2xvcldpdGhDR0NvbG9yOiwpKSkgQ0dDb2xvciAqQ0dDb2xvclJlZjNPazsKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2VfcmVsYXRlZCgsY29sb3JXaXRoQ0dDb2xvcjosQ0dDb2xvcikpKSBDR0NvbG9yICpDR0NvbG9yUmVmMU5vdE9rOyAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGEgcmVsYXRlZCBPYmplY3RpdmVDIGNsYXNzIG5hbWUsIGUuZy4sICdOU0NvbG9yJ319Cit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZV9yZWxhdGVkKE5TQ29sb3IsY29sb3JXaXRoQ0dDb2xvcixDR0NvbG9yKSkpIENHQ29sb3IgKkNHQ29sb3JSZWYyTm90T2s7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgYSBjbGFzcyBtZXRob2Qgc2VsZWN0b3Igd2l0aCBzaW5nbGUgYXJndW1lbnQsIGUuZy4sICdjb2xvcldpdGhDR0NvbG9yOid9fQordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2VfcmVsYXRlZChOU0NvbG9yLGNvbG9yV2l0aENHQ29sb3I6OixDR0NvbG9yKSkpIENHQ29sb3IgKkNHQ29sb3JSZWYzTm90T2s7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgYSBjbGFzcyBtZXRob2Qgc2VsZWN0b3Igd2l0aCBzaW5nbGUgYXJndW1lbnQsIGUuZy4sICdjb2xvcldpdGhDR0NvbG9yOid9fQordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2VfcmVsYXRlZCgxMixjb2xvcldpdGhDR0NvbG9yOixDR0NvbG9yKSkpIENHQ29sb3IgKkNHQ29sb3JSZWY0Tm90T2s7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgYSByZWxhdGVkIE9iamVjdGl2ZUMgY2xhc3MgbmFtZSwgZS5nLiwgJ05TQ29sb3InfX0KK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX3JlbGF0ZWQoTlNDb2xvciwrOixDR0NvbG9yKSkpIENHQ29sb3IgKkNHQ29sb3JSZWY1Tm90T2s7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJywnfX0KK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX3JlbGF0ZWQoTlNDb2xvcixjb2xvcldpdGhDR0NvbG9yOiwrKSkpIENHQ29sb3IgKkNHQ29sb3JSZWY2Tm90T2s7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJyknfX0KKwpkaWZmIC0tZ2l0IGEvdGVzdC9QYXJzZXIvb2JqY3h4MTEtYXR0cmlidXRlcy5tbSBiL3Rlc3QvUGFyc2VyL29iamN4eDExLWF0dHJpYnV0ZXMubW0KaW5kZXggYzFkOGM0MS4uNGJmZjIxNSAxMDA2NDQKLS0tIGEvdGVzdC9QYXJzZXIvb2JqY3h4MTEtYXR0cmlidXRlcy5tbQorKysgYi90ZXN0L1BhcnNlci9vYmpjeHgxMS1hdHRyaWJ1dGVzLm1tCkBAIC0xMywxMiArMTMsMTIgQEAKICAgaW50IGFbIFtub3JldHVybiBnZXRTaXplXSBdOwogCiAgIC8vIC4uLiBidXQgaXMgaW50ZXJwcmV0ZWQgYXMgYW4gYXR0cmlidXRlIHdoZXJlIHBvc3NpYmxlLgotICBpbnQgYlsgW25vcmV0dXJuXSBdOyAvLyBleHBlY3RlZC1lcnJvciB7eydub3JldHVybicgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnMgYW5kIG1ldGhvZHN9fQorICBpbnQgYlsgW25vcmV0dXJuXSBdOyAvLyBleHBlY3RlZC1lcnJvciB7eydub3JldHVybicgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQogCiAgIGludCBjWyBbbm9yZXR1cm4gZ2V0U2l6ZV0gKyAxIF07CiAKICAgLy8gQW4gYXJyYXkgc2l6ZSB3aGljaCBpcyBjb21wdXRlZCBieSBhIGxhbWJkYSBpcyBub3QgT0suCi0gIGludCBkWyBbbm9yZXR1cm5dIHsgcmV0dXJuIDM7IH0gKCkgXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnXSd9fSBleHBlY3RlZC1lcnJvciB7eydub3JldHVybicgYXR0cmlidXRlIG9ubHkgYXBwbGllc319CisgIGludCBkWyBbbm9yZXR1cm5dIHsgcmV0dXJuIDM7IH0gKCkgXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnXSd9fSBleHBlY3RlZC1lcnJvciB7eydub3JldHVybicgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQogCiAgIC8vIEEgbWVzc2FnZSBzZW5kIHdoaWNoIGNvbnRhaW5zIGEgbWVzc2FnZSBzZW5kIGlzIE9LLgogICBbIFsgWCBhbGxvYyBdIGluaXQgXTsKZGlmZiAtLWdpdCBhL3Rlc3QvUGFyc2VyL29wZW5jbC1rZXl3b3Jkcy5jbCBiL3Rlc3QvUGFyc2VyL29wZW5jbC1rZXl3b3Jkcy5jbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmM3MDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QYXJzZXIvb3BlbmNsLWtleXdvcmRzLmNsCkBAIC0wLDAgKzEsOCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxICVzIC12ZXJpZnkgLXBlZGFudGljIC1mc3ludGF4LW9ubHkKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisKK3ZvaWQgZihoYWxmICpoKSB7CisgIGJvb2wgYjsKKyAgaW50IHdjaGFyX3Q7CisgIGludCBjb25zdGV4cHI7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1BhcnNlci9yZWNvdmVyeS5jcHAgYi90ZXN0L1BhcnNlci9yZWNvdmVyeS5jcHAKaW5kZXggNGJlZDI1Ny4uY2IxOTc5ZiAxMDA2NDQKLS0tIGEvdGVzdC9QYXJzZXIvcmVjb3ZlcnkuY3BwCisrKyBiL3Rlc3QvUGFyc2VyL3JlY292ZXJ5LmNwcApAQCAtMTIwLDYgKzEyMCwxNiBAQAogICBJbm5lcjU7CiB9CiAKK25hbWVzcGFjZSBOUyB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBGb28ge307Cit9CitzdHJ1Y3QgTWlzc2luZ1NlbWlUaGVuVGVtcGxhdGUxIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJzsnIGFmdGVyIHN0cnVjdH19CitOUzo6Rm9vPGludD4gbWlzc2luZ1NlbWlCZWZvcmVGdW5jdGlvblJldHVybmluZ1RlbXBsYXRlSWQxKCk7CisKK3VzaW5nIE5TOjpGb287CitzdHJ1Y3QgTWlzc2luZ1NlbWlUaGVuVGVtcGxhdGUyIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJzsnIGFmdGVyIHN0cnVjdH19CitGb288aW50PiBtaXNzaW5nU2VtaUJlZm9yZUZ1bmN0aW9uUmV0dXJuaW5nVGVtcGxhdGVJZDIoKTsKKwogbmFtZXNwYWNlIFBSMTcwODQgewogZW51bSBjbGFzcyBFbnVtSUQge307CiB0ZW1wbGF0ZSA8dHlwZW5hbWU+IHN0cnVjdCBUZW1wSUQ7CmRpZmYgLS1naXQgYS90ZXN0L1BhcnNlci93YXJuLXNlbWljb2xvbi1iZWZvcmUtbWV0aG9kLWJvZHkubSBiL3Rlc3QvUGFyc2VyL3dhcm4tc2VtaWNvbG9uLWJlZm9yZS1tZXRob2QtYm9keS5tCmluZGV4IGJlNDA4ZWIuLmFiZGY5ZjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvUGFyc2VyL3dhcm4tc2VtaWNvbG9uLWJlZm9yZS1tZXRob2QtYm9keS5tCisrKyBiL3Rlc3QvUGFyc2VyL3dhcm4tc2VtaWNvbG9uLWJlZm9yZS1tZXRob2QtYm9keS5tCkBAIC0xLDcgKzEsNyBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLVdzZW1pY29sb24tYmVmb3JlLW1ldGhvZC1ib2R5IC12ZXJpZnkgJXMKIC8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC1Xc2VtaWNvbG9uLWJlZm9yZS1tZXRob2QtYm9keSAtZmRpYWdub3N0aWNzLXBhcnNlYWJsZS1maXhpdHMgJXMgMj4mMSB8IEZpbGVDaGVjayAlcwogCi0vLyBBbGxvdyBvcHRpb25hbCBzZW1pY29sb24gaW4gb2JqYyBtZXRob2QgZGVmaW5pdG9uIGFmdGVyIG1ldGhvZCBwcm90b3R5cGUsCisvLyBBbGxvdyBvcHRpb25hbCBzZW1pY29sb24gaW4gb2JqYyBtZXRob2QgZGVmaW5pdGlvbiBhZnRlciBtZXRob2QgcHJvdG90eXBlLAogLy8gd2FybiBhYm91dCBpdCBhbmQgc3VnZ2VzdCBhIGZpeGl0LgogCiBAaW50ZXJmYWNlIE5TT2JqZWN0CmRpZmYgLS1naXQgYS90ZXN0L1ByZXByb2Nlc3Nvci9JbnB1dHMvaGVhZGVybWFwLXJlbC9Gb28uZnJhbWV3b3JrL0hlYWRlcnMvRm9vLmggYi90ZXN0L1ByZXByb2Nlc3Nvci9JbnB1dHMvaGVhZGVybWFwLXJlbC9Gb28uZnJhbWV3b3JrL0hlYWRlcnMvRm9vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmZmI1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9oZWFkZXJtYXAtcmVsL0Zvby5mcmFtZXdvcmsvSGVhZGVycy9Gb28uaApAQCAtMCwwICsxLDIgQEAKKworRm9vLmggaXMgcGFyc2VkCmRpZmYgLS1naXQgYS90ZXN0L1ByZXByb2Nlc3Nvci9JbnB1dHMvaGVhZGVybWFwLXJlbC9mb28uaG1hcCBiL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9oZWFkZXJtYXAtcmVsL2Zvby5obWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4M2M2NGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1ByZXByb2Nlc3Nvci9JbnB1dHMvaGVhZGVybWFwLXJlbC9mb28uaG1hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L1ByZXByb2Nlc3Nvci9JbnB1dHMvaGVhZGVybWFwLXJlbDIvUHJvZHVjdC9zb21laGVhZGVyLmggYi90ZXN0L1ByZXByb2Nlc3Nvci9JbnB1dHMvaGVhZGVybWFwLXJlbDIvUHJvZHVjdC9zb21laGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyZTUyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9oZWFkZXJtYXAtcmVsMi9Qcm9kdWN0L3NvbWVoZWFkZXIuaApAQCAtMCwwICsxIEBACisjZGVmaW5lIEEgMgpkaWZmIC0tZ2l0IGEvdGVzdC9QcmVwcm9jZXNzb3IvSW5wdXRzL2hlYWRlcm1hcC1yZWwyL3Byb2plY3QtaGVhZGVycy5obWFwIGIvdGVzdC9QcmVwcm9jZXNzb3IvSW5wdXRzL2hlYWRlcm1hcC1yZWwyL3Byb2plY3QtaGVhZGVycy5obWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzcwZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1ByZXByb2Nlc3Nvci9JbnB1dHMvaGVhZGVybWFwLXJlbDIvcHJvamVjdC1oZWFkZXJzLmhtYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9QcmVwcm9jZXNzb3IvSW5wdXRzL2hlYWRlcm1hcC1yZWwyL3N5c3RlbS91c3IvaW5jbHVkZS9zb21laGVhZGVyLmggYi90ZXN0L1ByZXByb2Nlc3Nvci9JbnB1dHMvaGVhZGVybWFwLXJlbDIvc3lzdGVtL3Vzci9pbmNsdWRlL3NvbWVoZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjJhMDVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QcmVwcm9jZXNzb3IvSW5wdXRzL2hlYWRlcm1hcC1yZWwyL3N5c3RlbS91c3IvaW5jbHVkZS9zb21laGVhZGVyLmgKQEAgLTAsMCArMSBAQAorI2RlZmluZSBBIDEKZGlmZiAtLWdpdCBhL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9hL2IvaW5jbHVkZTMuaCBiL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9hL2IvaW5jbHVkZTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQ3N2U3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QcmVwcm9jZXNzb3IvSW5wdXRzL21pY3Jvc29mdC1oZWFkZXItc2VhcmNoL2EvYi9pbmNsdWRlMy5oCkBAIC0wLDAgKzEsNSBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJmaW5kbWUuaCIKKworI2luY2x1ZGUgImZhbHNlcG9zLmgiCmRpZmYgLS1naXQgYS90ZXN0L1ByZXByb2Nlc3Nvci9JbnB1dHMvbWljcm9zb2Z0LWhlYWRlci1zZWFyY2gvYS9maW5kbWUuaCBiL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9hL2ZpbmRtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDljOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1ByZXByb2Nlc3Nvci9JbnB1dHMvbWljcm9zb2Z0LWhlYWRlci1zZWFyY2gvYS9maW5kbWUuaApAQCAtMCwwICsxLDMgQEAKKyNwcmFnbWEgb25jZQorCisjd2FybmluZyBmaW5kbWUuaCBzdWNjZXNzZnVsbHkgaW5jbHVkZWQgdXNpbmcgTVMgc2VhcmNoIHJ1bGVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9QcmVwcm9jZXNzb3IvSW5wdXRzL21pY3Jvc29mdC1oZWFkZXItc2VhcmNoL2EvaW5jbHVkZTIuaCBiL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9hL2luY2x1ZGUyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2NDBhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9hL2luY2x1ZGUyLmgKQEAgLTAsMCArMSw2IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImIvaW5jbHVkZTMuaCIKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYi9pbmNsdWRlMy5oIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9mYWxzZXBvcy5oIGIvdGVzdC9QcmVwcm9jZXNzb3IvSW5wdXRzL21pY3Jvc29mdC1oZWFkZXItc2VhcmNoL2ZhbHNlcG9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4NTk2OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9mYWxzZXBvcy5oCkBAIC0wLDAgKzEsMyBAQAorI3ByYWdtYSBvbmNlCisKKyN3YXJuaW5nIHN1Y2Nlc3NmdWxseSByZXNvbHZlZCB0aGUgZmFsc2Vwb3MuaCBoZWFkZXIKZGlmZiAtLWdpdCBhL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9maW5kbWUuaCBiL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9maW5kbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWFmNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QcmVwcm9jZXNzb3IvSW5wdXRzL21pY3Jvc29mdC1oZWFkZXItc2VhcmNoL2ZpbmRtZS5oCkBAIC0wLDAgKzEsMyBAQAorI3ByYWdtYSBvbmNlCisKKyNlcnJvciBXcm9uZyBmaW5kbWUuaCBpbmNsdWRlZCwgTVNWQyBoZWFkZXIgc2VhcmNoIGluY29ycmVjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9pbmNsdWRlMS5oIGIvdGVzdC9QcmVwcm9jZXNzb3IvSW5wdXRzL21pY3Jvc29mdC1oZWFkZXItc2VhcmNoL2luY2x1ZGUxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwZmFjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUHJlcHJvY2Vzc29yL0lucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9pbmNsdWRlMS5oCkBAIC0wLDAgKzEsNiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhL2luY2x1ZGUyLmgiCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImEvaW5jbHVkZTIuaCIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L1ByZXByb2Nlc3Nvci9hYXJjaDY0LXRhcmdldC1mZWF0dXJlcy5jIGIvdGVzdC9QcmVwcm9jZXNzb3IvYWFyY2g2NC10YXJnZXQtZmVhdHVyZXMuYwppbmRleCA5OTc4ZjkxLi5lNDg3NjY3IDEwMDY0NAotLS0gYS90ZXN0L1ByZXByb2Nlc3Nvci9hYXJjaDY0LXRhcmdldC1mZWF0dXJlcy5jCisrKyBiL3Rlc3QvUHJlcHJvY2Vzc29yL2FhcmNoNjQtdGFyZ2V0LWZlYXR1cmVzLmMKQEAgLTE3LDggKzE3LDggQEAKIC8vIENIRUNLOiBfX0FSTV9GUDE2X0ZPUk1BVF9JRUVFIDEKIC8vIENIRUNLLU5PVDogX19BUk1fRlBfRkFTVCAxCiAvLyBDSEVDSzogX19BUk1fRlBfRkVOVl9ST1VORElORyAxCi0vLyBDSEVDSy1OT1Q6IF9fQVJNX05FT04gMQotLy8gQ0hFQ0stTk9UOiBfX0FSTV9ORU9OX0ZQIDcKKy8vIENIRUNLOiBfX0FSTV9ORU9OIDEKKy8vIENIRUNLOiBfX0FSTV9ORU9OX0ZQIDcKIC8vIENIRUNLOiBfX0FSTV9QQ1NfQUFQQ1M2NCAxCiAvLyBDSEVDSy1OT1Q6IF9fQVJNX1NJWkVPRl9NSU5JTUFMX0VOVU0gMQogLy8gQ0hFQ0stTk9UOiBfX0FSTV9TSVpFT0ZfV0NIQVJfVCAyCmRpZmYgLS1naXQgYS90ZXN0L1ByZXByb2Nlc3Nvci9hcm0tdGFyZ2V0LWZlYXR1cmVzLmMgYi90ZXN0L1ByZXByb2Nlc3Nvci9hcm0tdGFyZ2V0LWZlYXR1cmVzLmMKaW5kZXggYWU5M2EzZC4uOWRiMjlhNiAxMDA2NDQKLS0tIGEvdGVzdC9QcmVwcm9jZXNzb3IvYXJtLXRhcmdldC1mZWF0dXJlcy5jCisrKyBiL3Rlc3QvUHJlcHJvY2Vzc29yL2FybS10YXJnZXQtZmVhdHVyZXMuYwpAQCAtOCw3ICs4LDcgQEAKIC8vIENIRUNLLVY3OiBfX0FSTUVMX18gMQogLy8gQ0hFQ0stVjc6IF9fQVJNX0FSQ0ggNwogLy8gQ0hFQ0stVjc6IF9fQVJNX0FSQ0hfN0FfXyAxCi0vLyBDSEVDSy1OT1QtVjc6IF9fQVJNX0ZFQVRVUkVfQ1JDMzIKKy8vIENIRUNLLVY3LU5PVDogX19BUk1fRkVBVFVSRV9DUkMzMgogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY4YSAtbWZsb2F0LWFiaT1oYXJkIC14IGMgLUUgLWRNICVzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLVY4LUJBUkVIRiAlcwogLy8gQ0hFQ0stVjgtQkFSRUhGOiBfX0FSTUVMX18gMQpAQCAtNjgsNiArNjgsMTUgQEAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjhhLWVhYmkgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1USFVNQlY4QS1FQUJJICVzCiAvLyBUSFVNQlY4QS1FQUJJOiNkZWZpbmUgX19BUk1fQVJDSF9FWFRfSURJVl9fIDEKIAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbm9uZS1saW51eC1nbnUgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1ERUZTICVzCisvLyBDSEVDSy1ERUZTOiNkZWZpbmUgX19BUk1fU0laRU9GX01JTklNQUxfRU5VTSA0CisvLyBDSEVDSy1ERUZTOiNkZWZpbmUgX19BUk1fU0laRU9GX1dDSEFSX1QgNAorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybS1ub25lLWxpbnV4LWdudSAtZnNob3J0LXdjaGFyIC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stU0hPUlRXQ0hBUiAlcworLy8gQ0hFQ0stU0hPUlRXQ0hBUjojZGVmaW5lIF9fQVJNX1NJWkVPRl9XQ0hBUl9UIDIKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm0tbm9uZS1saW51eC1nbnUgLWZzaG9ydC1lbnVtcyAteCBjIC1FIC1kTSAlcyAtbyAtIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUNIRUNLLVNIT1JURU5VTVMgJXMKKy8vIENIRUNLLVNIT1JURU5VTVM6I2RlZmluZSBfX0FSTV9TSVpFT0ZfTUlOSU1BTF9FTlVNIDEKIAogLy8gVGVzdCB0aGF0IC1taHdkaXYgaGFzIHRoZSByaWdodCBlZmZlY3QgZm9yIGEgdGFyZ2V0IENQVSB3aGljaCBoYXMgaHdkaXYgZW5hYmxlZCBieSBkZWZhdWx0LgogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12NyAtbWNwdT1jb3J0ZXgtYTE1IC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9REVGQVVMVEhXRElWLUFSTSAlcwpAQCAtOTQsNiArMTAzLDM5IEBACiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybSAtbXRodW1iIC1tY3B1PWNvcnRleC1hMTUgLW1od2Rpdj1ub25lIC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9REVGQVVMVEhXRElWLU5PTkVIV0RJVi1USFVNQiAlcwogLy8gREVGQVVMVEhXRElWLU5PTkVIV0RJVi1USFVNQi1OT1Q6I2RlZmluZSBfX0FSTV9BUkNIX0VYVF9JRElWX18KIAorCisvLyBDaGVjayB0aGF0IC1tZnB1IHdvcmtzIHByb3Blcmx5IGZvciBDb3J0ZXgtQTcgKGVuYWJsZWQgYnkgZGVmYXVsdCkuCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LW5vbmUtbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTcgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1ERUZBVUxURlBVLUE3ICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LW5vbmUtbGludXgtZ251ZWFiaSAtbXRodW1iIC1tY3B1PWNvcnRleC1hNyAteCBjIC1FIC1kTSAlcyAtbyAtIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PURFRkFVTFRGUFUtQTcgJXMKKy8vIERFRkFVTFRGUFUtQTc6I2RlZmluZSBfX0FSTV9ORU9OX18gMQorLy8gREVGQVVMVEZQVS1BNzojZGVmaW5lIF9fQVJNX1ZGUFY0X18gMQorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LW5vbmUtbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTcgLW1mcHU9bm9uZSAteCBjIC1FIC1kTSAlcyAtbyAtIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUZQVU5PTkUtQTcgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjctbm9uZS1saW51eC1nbnVlYWJpIC1tdGh1bWIgLW1jcHU9Y29ydGV4LWE3IC1tZnB1PW5vbmUgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1GUFVOT05FLUE3ICVzCisvLyBGUFVOT05FLUE3LU5PVDojZGVmaW5lIF9fQVJNX05FT05fXyAxCisvLyBGUFVOT05FLUE3LU5PVDojZGVmaW5lIF9fQVJNX1ZGUFY0X18gMQorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LW5vbmUtbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTcgLW1mcHU9dmZwNCAteCBjIC1FIC1kTSAlcyAtbyAtIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU5PTkVPTi1BNyAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12Ny1ub25lLWxpbnV4LWdudWVhYmkgLW10aHVtYiAtbWNwdT1jb3J0ZXgtYTcgLW1mcHU9dmZwNCAteCBjIC1FIC1kTSAlcyAtbyAtIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU5PTkVPTi1BNyAlcworLy8gTk9ORU9OLUE3LU5PVDojZGVmaW5lIF9fQVJNX05FT05fXyAxCisvLyBOT05FT04tQTc6I2RlZmluZSBfX0FSTV9WRlBWNF9fIDEKKworLy8gQ2hlY2sgdGhhdCAtbWZwdSB3b3JrcyBwcm9wZXJseSBmb3IgQ29ydGV4LUE1IChlbmFibGVkIGJ5IGRlZmF1bHQpLgorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12Ny1ub25lLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LWE1IC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9REVGQVVMVEZQVS1BNSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12Ny1ub25lLWxpbnV4LWdudWVhYmkgLW10aHVtYiAtbWNwdT1jb3J0ZXgtYTUgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1ERUZBVUxURlBVLUE1ICVzCisvLyBERUZBVUxURlBVLUE1OiNkZWZpbmUgX19BUk1fTkVPTl9fIDEKKy8vIERFRkFVTFRGUFUtQTU6I2RlZmluZSBfX0FSTV9WRlBWNF9fIDEKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12Ny1ub25lLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LWE1IC1tZnB1PW5vbmUgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1GUFVOT05FLUE1ICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LW5vbmUtbGludXgtZ251ZWFiaSAtbXRodW1iIC1tY3B1PWNvcnRleC1hNSAtbWZwdT1ub25lIC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9RlBVTk9ORS1BNSAlcworLy8gRlBVTk9ORS1BNS1OT1Q6I2RlZmluZSBfX0FSTV9ORU9OX18gMQorLy8gRlBVTk9ORS1BNS1OT1Q6I2RlZmluZSBfX0FSTV9WRlBWNF9fIDEKKworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12Ny1ub25lLWxpbnV4LWdudWVhYmkgLW1jcHU9Y29ydGV4LWE1IC1tZnB1PXZmcDMtZDE2IC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Tk9ORU9OLUE1ICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LW5vbmUtbGludXgtZ251ZWFiaSAtbXRodW1iIC1tY3B1PWNvcnRleC1hNSAtbWZwdT12ZnAzLWQxNiAteCBjIC1FIC1kTSAlcyAtbyAtIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PU5PTkVPTi1BNSAlcworLy8gTk9ORU9OLUE1LU5PVDojZGVmaW5lIF9fQVJNX05FT05fXyAxCisvLyBOT05FT04tQTU6I2RlZmluZSBfX0FSTV9WRlBWNF9fIDEKKwogLy8gRklYTUU6IGFkZCBjaGVjayBmb3IgZnVydGhlciBwcmVkZWZpbmVzCiAvLyBUZXN0IHdoZXRoZXIgcHJlZGVmaW5lcyBhcmUgYXMgZXhwZWN0ZWQgd2hlbiB0YXJnZXRpbmcgY29ydGV4LWE1LgogLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12NyAtbWNwdT1jb3J0ZXgtYTUgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1BNS1BUk0gJXMKQEAgLTEwMiw2ICsxNDQsMjAgQEAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjcgLW10aHVtYiAtbWNwdT1jb3J0ZXgtYTUgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1BNS1USFVNQiAlcwogLy8gQTUtVEhVTUItTk9UOiNkZWZpbmUgX19BUk1fQVJDSF9FWFRfSURJVl9fCiAKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjcgLW1jcHU9Y29ydGV4LWE1IC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9QTUgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjcgLW10aHVtYiAtbWNwdT1jb3J0ZXgtYTUgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1BNSAlcworLy8gQTU6I2RlZmluZSBfX0FSTV9BUkNIIDcKKy8vIEE1OiNkZWZpbmUgX19BUk1fQVJDSF83QV9fIDEKKy8vIEE1OiNkZWZpbmUgX19BUk1fQVJDSF9QUk9GSUxFIEEKKworLy8gVGVzdCB3aGV0aGVyIHByZWRlZmluZXMgYXJlIGFzIGV4cGVjdGVkIHdoZW4gdGFyZ2V0aW5nIGNvcnRleC1hNy4KKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjcgLW1jcHU9Y29ydGV4LWE3IC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9QTcgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjcgLW10aHVtYiAtbWNwdT1jb3J0ZXgtYTcgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1BNyAlcworLy8gQTc6I2RlZmluZSBfX0FSTV9BUkNIIDcKKy8vIEE3OiNkZWZpbmUgX19BUk1fQVJDSF83QV9fIDEKKy8vIEE3OiNkZWZpbmUgX19BUk1fQVJDSF9FWFRfSURJVl9fIDEKKy8vIEE3OiNkZWZpbmUgX19BUk1fQVJDSF9QUk9GSUxFIEEKKwogLy8gVGVzdCB3aGV0aGVyIHByZWRlZmluZXMgYXJlIGFzIGV4cGVjdGVkIHdoZW4gdGFyZ2V0aW5nIGNvcnRleC1hOC4KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjcgLW1jcHU9Y29ydGV4LWE4IC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9QTgtQVJNICVzCiAvLyBBOC1BUk0tTk9UOiNkZWZpbmUgX19BUk1fQVJDSF9FWFRfSURJVl9fCkBAIC0xMTYsNiArMTcyLDI2IEBACiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3IC1tdGh1bWIgLW1jcHU9Y29ydGV4LWE5IC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9QTktVEhVTUIgJXMKIC8vIEE5LVRIVU1CLU5PVDojZGVmaW5lIF9fQVJNX0FSQ0hfRVhUX0lESVZfXwogCisKKy8vIENoZWNrIHRoYXQgLW1mcHUgd29ya3MgcHJvcGVybHkgZm9yIENvcnRleC1BMTIgKGVuYWJsZWQgYnkgZGVmYXVsdCkuCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LW5vbmUtbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTEyIC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9REVGQVVMVEZQVS1BMTIgJXMKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjctbm9uZS1saW51eC1nbnVlYWJpIC1tdGh1bWIgLW1jcHU9Y29ydGV4LWExMiAteCBjIC1FIC1kTSAlcyAtbyAtIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PURFRkFVTFRGUFUtQTEyICVzCisvLyBERUZBVUxURlBVLUExMjojZGVmaW5lIF9fQVJNX05FT05fXyAxCisvLyBERUZBVUxURlBVLUExMjojZGVmaW5lIF9fQVJNX1ZGUFY0X18gMQorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3LW5vbmUtbGludXgtZ251ZWFiaSAtbWNwdT1jb3J0ZXgtYTEyIC1tZnB1PW5vbmUgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1GUFVOT05FLUExMiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12Ny1ub25lLWxpbnV4LWdudWVhYmkgLW10aHVtYiAtbWNwdT1jb3J0ZXgtYTEyIC1tZnB1PW5vbmUgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1GUFVOT05FLUExMiAlcworLy8gRlBVTk9ORS1BMTItTk9UOiNkZWZpbmUgX19BUk1fTkVPTl9fIDEKKy8vIEZQVU5PTkUtQTEyLU5PVDojZGVmaW5lIF9fQVJNX1ZGUFY0X18gMQorCisvLyBUZXN0IHdoZXRoZXIgcHJlZGVmaW5lcyBhcmUgYXMgZXhwZWN0ZWQgd2hlbiB0YXJnZXRpbmcgY29ydGV4LWExMi4KKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjcgLW1jcHU9Y29ydGV4LWExMiAteCBjIC1FIC1kTSAlcyAtbyAtIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUExMiAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBhcm12NyAtbXRodW1iIC1tY3B1PWNvcnRleC1hMTIgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1BMTIgJXMKKy8vIEExMjojZGVmaW5lIF9fQVJNX0FSQ0ggNworLy8gQTEyOiNkZWZpbmUgX19BUk1fQVJDSF83QV9fIDEKKy8vIEExMjojZGVmaW5lIF9fQVJNX0FSQ0hfRVhUX0lESVZfXyAxCisvLyBBMTI6I2RlZmluZSBfX0FSTV9BUkNIX1BST0ZJTEUgQQorCiAvLyBUZXN0IHdoZXRoZXIgcHJlZGVmaW5lcyBhcmUgYXMgZXhwZWN0ZWQgd2hlbiB0YXJnZXRpbmcgY29ydGV4LWExNS4KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjcgLW1jcHU9Y29ydGV4LWExNSAteCBjIC1FIC1kTSAlcyAtbyAtIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PUExNS1BUk0gJXMKIC8vIEExNS1BUk06I2RlZmluZSBfX0FSTV9BUkNIX0VYVF9JRElWX18gMQpAQCAtMTU1LDMgKzIzMSwxMyBAQAogLy8gVGVzdCB3aGV0aGVyIHByZWRlZmluZXMgYXJlIGFzIGV4cGVjdGVkIHdoZW4gdGFyZ2V0aW5nIGNvcnRleC1tNC4KIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtdjcgLW10aHVtYiAtbWNwdT1jb3J0ZXgtbTQgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1NNC1USFVNQiAlcwogLy8gTTQtVEhVTUI6I2RlZmluZSBfX0FSTV9BUkNIX0VYVF9JRElWX18gMQorCisvLyBUZXN0IHdoZXRoZXIgcHJlZGVmaW5lcyBhcmUgYXMgZXhwZWN0ZWQgd2hlbiB0YXJnZXRpbmcga3JhaXQuCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3IC1tY3B1PWtyYWl0IC14IGMgLUUgLWRNICVzIC1vIC0gfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9S1JBSVQtQVJNICVzCisvLyBLUkFJVC1BUk06I2RlZmluZSBfX0FSTV9BUkNIX0VYVF9JRElWX18gMQorLy8gS1JBSVQtQVJNOiNkZWZpbmUgIF9fQVJNX1ZGUFY0X18gMQorCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGFybXY3IC1tdGh1bWIgLW1jcHU9a3JhaXQgLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1LUkFJVC1USFVNQiAlcworLy8gS1JBSVQtVEhVTUI6I2RlZmluZSBfX0FSTV9BUkNIX0VYVF9JRElWX18gMQorLy8gS1JBSVQtVEhVTUI6I2RlZmluZSAgX19BUk1fVkZQVjRfXyAxCisKZGlmZiAtLWdpdCBhL3Rlc3QvUHJlcHJvY2Vzc29yL2hhc19hdHRyaWJ1dGUuYyBiL3Rlc3QvUHJlcHJvY2Vzc29yL2hhc19hdHRyaWJ1dGUuYwppbmRleCA1NTVjMmIzLi41ZmUwNjBlIDEwMDY0NAotLS0gYS90ZXN0L1ByZXByb2Nlc3Nvci9oYXNfYXR0cmlidXRlLmMKKysrIGIvdGVzdC9QcmVwcm9jZXNzb3IvaGFzX2F0dHJpYnV0ZS5jCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1FICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFybS11bmtub3duLWxpbnV4IC1FICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAogLy8gQ0hFQ0s6IGFsd2F5c19pbmxpbmUKICNpZiBfX2hhc19hdHRyaWJ1dGUoYWx3YXlzX2lubGluZSkKQEAgLTM4LDMgKzM4LDEzIEBACiAjaWYgIV9faGFzX2F0dHJpYnV0ZSh2b2xhdGlsZSkKIGludCBoYXNfbm9fdm9sYXRpbGVfYXR0cmlidXRlKCk7CiAjZW5kaWYKKworLy8gQ0hFQ0s6IGhhc19hcm1faW50ZXJydXB0CisjaWYgX19oYXNfYXR0cmlidXRlKGludGVycnVwdCkKKyAgaW50IGhhc19hcm1faW50ZXJydXB0KCk7CisjZW5kaWYKKworLy8gQ0hFQ0s6IGRvZXNfbm90X2hhdmVfZGxsZXhwb3J0CisjaWYgIV9faGFzX2F0dHJpYnV0ZShkbGxleHBvcnQpCisgIGludCBkb2VzX25vdF9oYXZlX2RsbGV4cG9ydCgpOworI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L1ByZXByb2Nlc3Nvci9oZWFkZXJfbG9va3VwMS5jIGIvdGVzdC9QcmVwcm9jZXNzb3IvaGVhZGVyX2xvb2t1cDEuYwppbmRleCBkMDkwOTM2Li4zMzZhYmE2IDEwMDY0NAotLS0gYS90ZXN0L1ByZXByb2Nlc3Nvci9oZWFkZXJfbG9va3VwMS5jCisrKyBiL3Rlc3QvUHJlcHJvY2Vzc29yL2hlYWRlcl9sb29rdXAxLmMKQEAgLTEsMiArMSwyIEBACi0vLyBSVU46ICVjbGFuZyAtZm5vLW1zLWV4dGVuc2lvbnMgJXMgLUUgfCBncmVwICdzdGRkZWYuaC4qMycKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtRSB8IGdyZXAgJ3N0ZGRlZi5oLiozJwogI2luY2x1ZGUgPHN0ZGRlZi5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9QcmVwcm9jZXNzb3IvaGVhZGVybWFwLXJlbC5jIGIvdGVzdC9QcmVwcm9jZXNzb3IvaGVhZGVybWFwLXJlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NTAwYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1ByZXByb2Nlc3Nvci9oZWFkZXJtYXAtcmVsLmMKQEAgLTAsMCArMSwxMiBAQAorCisvLyBUaGlzIHVzZXMgYSBoZWFkZXJtYXAgd2l0aCB0aGlzIGVudHJ5OgorLy8gICBGb28uaCAtPiBGb28vRm9vLmgKKworLy8gUlVOOiAlY2xhbmdfY2MxIC1FICVzIC1vICV0LmkgLUkgJVMvSW5wdXRzL2hlYWRlcm1hcC1yZWwvZm9vLmhtYXAgLUYgJVMvSW5wdXRzL2hlYWRlcm1hcC1yZWwKKy8vIFJVTjogRmlsZUNoZWNrICVzIC1pbnB1dC1maWxlICV0LmkKKworLy8gQ0hFQ0s6IEZvby5oIGlzIHBhcnNlZAorLy8gQ0hFQ0s6IEZvby5oIGlzIHBhcnNlZAorCisjaW5jbHVkZSAiRm9vLmgiCisjaW5jbHVkZSAiRm9vLmgiCmRpZmYgLS1naXQgYS90ZXN0L1ByZXByb2Nlc3Nvci9oZWFkZXJtYXAtcmVsMi5jIGIvdGVzdC9QcmVwcm9jZXNzb3IvaGVhZGVybWFwLXJlbDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzA4NTRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QcmVwcm9jZXNzb3IvaGVhZGVybWFwLXJlbDIuYwpAQCAtMCwwICsxLDE0IEBACisvLyBUaGlzIHVzZXMgYSBoZWFkZXJtYXAgd2l0aCB0aGlzIGVudHJ5OgorLy8gICBzb21laGVhZGVyLmggLT4gUHJvZHVjdC9zb21laGVhZGVyLmgKKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjEzIC12IC1mc3ludGF4LW9ubHkgJXMgLWlxdW90ZSAlUy9JbnB1dHMvaGVhZGVybWFwLXJlbDIvcHJvamVjdC1oZWFkZXJzLmhtYXAgLWlzeXNyb290ICVTL0lucHV0cy9oZWFkZXJtYXAtcmVsMi9zeXN0ZW0gLUkgJVMvSW5wdXRzL2hlYWRlcm1hcC1yZWwyIC1ICisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTMgLWZzeW50YXgtb25seSAlcyAtaXF1b3RlICVTL0lucHV0cy9oZWFkZXJtYXAtcmVsMi9wcm9qZWN0LWhlYWRlcnMuaG1hcCAtaXN5c3Jvb3QgJVMvSW5wdXRzL2hlYWRlcm1hcC1yZWwyL3N5c3RlbSAtSSAlUy9JbnB1dHMvaGVhZGVybWFwLXJlbDIgLUggMj4gJXQub3V0CisvLyBSVU46IEZpbGVDaGVjayAlcyAtaW5wdXQtZmlsZSAldC5vdXQKKworLy8gQ0hFQ0s6IFByb2R1Y3Qvc29tZWhlYWRlci5oCisvLyBDSEVDSzogc3lzdGVtL3Vzci9pbmNsdWRle3tbL1xcXSt9fXNvbWVoZWFkZXIuaAorLy8gQ0hFQ0s6IHN5c3RlbS91c3IvaW5jbHVkZXt7Wy9cXF0rfX1zb21laGVhZGVyLmgKKworI2luY2x1ZGUgInNvbWVoZWFkZXIuaCIKKyNpbmNsdWRlIDxzb21laGVhZGVyLmg+CisjaW5jbHVkZSA8c29tZWhlYWRlci5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9QcmVwcm9jZXNzb3IvaW5pdC5jIGIvdGVzdC9QcmVwcm9jZXNzb3IvaW5pdC5jCmluZGV4IDg0ODZlOTQuLjhmNTdkMjkgMTAwNjQ0Ci0tLSBhL3Rlc3QvUHJlcHJvY2Vzc29yL2luaXQuYworKysgYi90ZXN0L1ByZXByb2Nlc3Nvci9pbml0LmMKQEAgLTE1LDcgKzE1LDcgQEAKIC8vIENYWDFZOiNkZWZpbmUgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18gMQogLy8gQ1hYMVk6I2RlZmluZSBfX0dYWF9SVFRJIDEKIC8vIENYWDFZOiNkZWZpbmUgX19HWFhfV0VBS19fIDEKLS8vIENYWDFZOiNkZWZpbmUgX19jcGx1c3BsdXMgMjAxMzA1TAorLy8gQ1hYMVk6I2RlZmluZSBfX2NwbHVzcGx1cyAyMDE0MDJMCiAvLyBDWFgxWTojZGVmaW5lIF9fcHJpdmF0ZV9leHRlcm5fXyBleHRlcm4KIC8vCiAvLwpAQCAtODksNyArODksNyBAQAogLy8KIC8vIEdYWDFZOiNkZWZpbmUgX19HTlVHX18KIC8vIEdYWDFZOiNkZWZpbmUgX19HWFhfV0VBS19fIDEKLS8vIEdYWDFZOiNkZWZpbmUgX19jcGx1c3BsdXMgMjAxMzA1TAorLy8gR1hYMVk6I2RlZmluZSBfX2NwbHVzcGx1cyAyMDE0MDJMCiAvLyBHWFgxWTojZGVmaW5lIF9fcHJpdmF0ZV9leHRlcm5fXyBleHRlcm4KIC8vCiAvLwpAQCAtMTk2LDE4ICsxOTYsMzM3IEBACiAvLyBTQ0hBUjojZGVmaW5lIF9fY2xhbmdfXyAxCiAvLwogLy8gUlVOOiAlY2xhbmdfY2MxIC1FIC1kTSAtZnNob3J0LXdjaGFyIDwgL2Rldi9udWxsIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggU0hPUlRXQ0hBUiAlcworLy8gd2NoYXJfdCBpcyB1MTYgZm9yIHRhcmdldGluZyBXaW4zMi4KKy8vIEZJWE1FOiBJbXBsZW1lbnQgYW5kIGNoZWNrIHg4Nl82NC1jeWd3aW4uCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mbm8tc2hvcnQtd2NoYXIgLXRyaXBsZT14ODZfNjQtdzY0LW1pbmd3MzIgPCAvZGV2L251bGwgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBTSE9SVFdDSEFSICVzCiAvLwogLy8gU0hPUlRXQ0hBUjogI2RlZmluZSBfX1NJWkVPRl9XQ0hBUl9UX18gMgogLy8gU0hPUlRXQ0hBUjogI2RlZmluZSBfX1dDSEFSX01BWF9fIDY1NTM1VQogLy8gU0hPUlRXQ0hBUjogI2RlZmluZSBfX1dDSEFSX1RZUEVfXyB1bnNpZ25lZCBzaG9ydAogLy8gU0hPUlRXQ0hBUjogI2RlZmluZSBfX1dDSEFSX1dJRFRIX18gMTYKIC8vCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mbm8tc2hvcnQtd2NoYXIgLXRyaXBsZT1pNjg2LXVua25vd24tdW5rbm93biA8IC9kZXYvbnVsbCB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IFNIT1JUV0NIQVIyICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mbm8tc2hvcnQtd2NoYXIgLXRyaXBsZT14ODZfNjQtdW5rbm93bi11bmtub3duIDwgL2Rldi9udWxsIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggU0hPUlRXQ0hBUjIgJXMKKy8vCisvLyBTSE9SVFdDSEFSMjogI2RlZmluZSBfX1NJWkVPRl9XQ0hBUl9UX18gNAorLy8gU0hPUlRXQ0hBUjI6ICNkZWZpbmUgX19XQ0hBUl9XSURUSF9fIDMyCisvLyBPdGhlciBkZWZpbml0aW9ucyB2YXJ5IGZyb20gcGxhdGZvcm0gdG8gcGxhdGZvcm0KKworLy8gUlVOOiAlY2xhbmdfY2MxIC1FIC1kTSAtZmZyZWVzdGFuZGluZyAtdHJpcGxlPWFhcmNoNjQtbm9uZS1ub25lIDwgL2Rldi9udWxsIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQUFSQ0g2NCAlcworLy8KKy8vIEFBUkNINjQ6I2RlZmluZSBfTFA2NCAxCisvLyBBQVJDSDY0LU5PVDojZGVmaW5lIF9fQUFSQ0g2NEVCX18gMQorLy8gQUFSQ0g2NDojZGVmaW5lIF9fQUFSQ0g2NEVMX18gMQorLy8gQUFSQ0g2NC1OT1Q6I2RlZmluZSBfX0FBUkNIX0JJR19FTkRJQU4gMQorLy8gQUFSQ0g2NDojZGVmaW5lIF9fQVJNXzY0QklUX1NUQVRFIDEKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0FSTV9BUkNIIDgKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0FSTV9BUkNIX0lTQV9BNjQgMQorLy8gQUFSQ0g2NC1OT1Q6I2RlZmluZSBfX0FSTV9CSUdfRU5ESUFOIDEKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0JZVEVfT1JERVJfXyBfX09SREVSX0xJVFRMRV9FTkRJQU5fXworLy8gQUFSQ0g2NDojZGVmaW5lIF9fQ0hBUjE2X1RZUEVfXyB1bnNpZ25lZCBzaG9ydAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fQ0hBUjMyX1RZUEVfXyB1bnNpZ25lZCBpbnQKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0NIQVJfQklUX18gOAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fREJMX0RFTk9STV9NSU5fXyA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fREJMX0RJR19fIDE1CisvLyBBQVJDSDY0OiNkZWZpbmUgX19EQkxfRVBTSUxPTl9fIDIuMjIwNDQ2MDQ5MjUwMzEzMWUtMTYKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0RCTF9IQVNfREVOT1JNX18gMQorLy8gQUFSQ0g2NDojZGVmaW5lIF9fREJMX0hBU19JTkZJTklUWV9fIDEKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0RCTF9IQVNfUVVJRVRfTkFOX18gMQorLy8gQUFSQ0g2NDojZGVmaW5lIF9fREJMX01BTlRfRElHX18gNTMKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0RCTF9NQVhfMTBfRVhQX18gMzA4CisvLyBBQVJDSDY0OiNkZWZpbmUgX19EQkxfTUFYX0VYUF9fIDEwMjQKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0RCTF9NQVhfXyAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fREJMX01JTl8xMF9FWFBfXyAoLTMwNykKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0RCTF9NSU5fRVhQX18gKC0xMDIxKQorLy8gQUFSQ0g2NDojZGVmaW5lIF9fREJMX01JTl9fIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4CisvLyBBQVJDSDY0OiNkZWZpbmUgX19ERUNJTUFMX0RJR19fIDM2CisvLyBBQVJDSDY0OiNkZWZpbmUgX19GTFRfREVOT1JNX01JTl9fIDEuNDAxMjk4NDZlLTQ1RgorLy8gQUFSQ0g2NDojZGVmaW5lIF9fRkxUX0RJR19fIDYKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0ZMVF9FUFNJTE9OX18gMS4xOTIwOTI5MGUtN0YKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0ZMVF9FVkFMX01FVEhPRF9fIDAKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0ZMVF9IQVNfREVOT1JNX18gMQorLy8gQUFSQ0g2NDojZGVmaW5lIF9fRkxUX0hBU19JTkZJTklUWV9fIDEKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0ZMVF9IQVNfUVVJRVRfTkFOX18gMQorLy8gQUFSQ0g2NDojZGVmaW5lIF9fRkxUX01BTlRfRElHX18gMjQKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0ZMVF9NQVhfMTBfRVhQX18gMzgKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0ZMVF9NQVhfRVhQX18gMTI4CisvLyBBQVJDSDY0OiNkZWZpbmUgX19GTFRfTUFYX18gMy40MDI4MjM0N2UrMzhGCisvLyBBQVJDSDY0OiNkZWZpbmUgX19GTFRfTUlOXzEwX0VYUF9fICgtMzcpCisvLyBBQVJDSDY0OiNkZWZpbmUgX19GTFRfTUlOX0VYUF9fICgtMTI1KQorLy8gQUFSQ0g2NDojZGVmaW5lIF9fRkxUX01JTl9fIDEuMTc1NDk0MzVlLTM4RgorLy8gQUFSQ0g2NDojZGVmaW5lIF9fRkxUX1JBRElYX18gMgorLy8gQUFSQ0g2NDojZGVmaW5lIF9fSU5UMTZfVFlQRV9fIHNob3J0CisvLyBBQVJDSDY0OiNkZWZpbmUgX19JTlQzMl9UWVBFX18gaW50CisvLyBBQVJDSDY0OiNkZWZpbmUgX19JTlQ2NF9DX1NVRkZJWF9fIEwKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0lOVDY0X1RZUEVfXyBsb25nIGludAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fSU5UOF9UWVBFX18gY2hhcgorLy8gQUFSQ0g2NDojZGVmaW5lIF9fSU5UTUFYX01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMCisvLyBBQVJDSDY0OiNkZWZpbmUgX19JTlRNQVhfVFlQRV9fIGxvbmcgaW50CisvLyBBQVJDSDY0OiNkZWZpbmUgX19JTlRNQVhfV0lEVEhfXyA2NAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fSU5UUFRSX1RZUEVfXyBsb25nIGludAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fSU5UUFRSX1dJRFRIX18gNjQKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0lOVF9NQVhfXyAyMTQ3NDgzNjQ3CisvLyBBQVJDSDY0OiNkZWZpbmUgX19MREJMX0RFTk9STV9NSU5fXyA2LjQ3NTE3NTExOTQzODAyNTExMDkyNDQzODk1ODIyNzY0NjU1ZS00OTY2TAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fTERCTF9ESUdfXyAzMworLy8gQUFSQ0g2NDojZGVmaW5lIF9fTERCTF9FUFNJTE9OX18gMS45MjU5Mjk5NDQzODcyMzU4NTMwNTU5Nzc5NDI1ODQ5MjczMmUtMzRMCisvLyBBQVJDSDY0OiNkZWZpbmUgX19MREJMX0hBU19ERU5PUk1fXyAxCisvLyBBQVJDSDY0OiNkZWZpbmUgX19MREJMX0hBU19JTkZJTklUWV9fIDEKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0xEQkxfSEFTX1FVSUVUX05BTl9fIDEKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0xEQkxfTUFOVF9ESUdfXyAxMTMKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0xEQkxfTUFYXzEwX0VYUF9fIDQ5MzIKKy8vIEFBUkNINjQ6I2RlZmluZSBfX0xEQkxfTUFYX0VYUF9fIDE2Mzg0CisvLyBBQVJDSDY0OiNkZWZpbmUgX19MREJMX01BWF9fIDEuMTg5NzMxNDk1MzU3MjMxNzY1MDg1NzU5MzI2NjI4MDA3MDJlKzQ5MzJMCisvLyBBQVJDSDY0OiNkZWZpbmUgX19MREJMX01JTl8xMF9FWFBfXyAoLTQ5MzEpCisvLyBBQVJDSDY0OiNkZWZpbmUgX19MREJMX01JTl9FWFBfXyAoLTE2MzgxKQorLy8gQUFSQ0g2NDojZGVmaW5lIF9fTERCTF9NSU5fXyAzLjM2MjEwMzE0MzExMjA5MzUwNjI2MjY3NzgxNzMyMTc1MjYwZS00OTMyTAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fTE9OR19MT05HX01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fTFA2NF9fIDEKKy8vIEFBUkNINjQ6I2RlZmluZSBfX1BPSU5URVJfV0lEVEhfXyA2NAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fUFRSRElGRl9UWVBFX18gbG9uZyBpbnQKKy8vIEFBUkNINjQ6I2RlZmluZSBfX1BUUkRJRkZfV0lEVEhfXyA2NAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fU0NIQVJfTUFYX18gMTI3CisvLyBBQVJDSDY0OiNkZWZpbmUgX19TSFJUX01BWF9fIDMyNzY3CisvLyBBQVJDSDY0OiNkZWZpbmUgX19TSUdfQVRPTUlDX1dJRFRIX18gMzIKKy8vIEFBUkNINjQ6I2RlZmluZSBfX1NJWkVPRl9ET1VCTEVfXyA4CisvLyBBQVJDSDY0OiNkZWZpbmUgX19TSVpFT0ZfRkxPQVRfXyA0CisvLyBBQVJDSDY0OiNkZWZpbmUgX19TSVpFT0ZfSU5UMTI4X18gMTYKKy8vIEFBUkNINjQ6I2RlZmluZSBfX1NJWkVPRl9JTlRfXyA0CisvLyBBQVJDSDY0OiNkZWZpbmUgX19TSVpFT0ZfTE9OR19ET1VCTEVfXyAxNgorLy8gQUFSQ0g2NDojZGVmaW5lIF9fU0laRU9GX0xPTkdfTE9OR19fIDgKKy8vIEFBUkNINjQ6I2RlZmluZSBfX1NJWkVPRl9MT05HX18gOAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fU0laRU9GX1BPSU5URVJfXyA4CisvLyBBQVJDSDY0OiNkZWZpbmUgX19TSVpFT0ZfUFRSRElGRl9UX18gOAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fU0laRU9GX1NIT1JUX18gMgorLy8gQUFSQ0g2NDojZGVmaW5lIF9fU0laRU9GX1NJWkVfVF9fIDgKKy8vIEFBUkNINjQ6I2RlZmluZSBfX1NJWkVPRl9XQ0hBUl9UX18gNAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fU0laRU9GX1dJTlRfVF9fIDQKKy8vIEFBUkNINjQ6I2RlZmluZSBfX1NJWkVfTUFYX18gMTg0NDY3NDQwNzM3MDk1NTE2MTVVTAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fU0laRV9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQKKy8vIEFBUkNINjQ6I2RlZmluZSBfX1NJWkVfV0lEVEhfXyA2NAorLy8gQUFSQ0g2NDojZGVmaW5lIF9fVUlOVE1BWF9UWVBFX18gbG9uZyB1bnNpZ25lZCBpbnQKKy8vIEFBUkNINjQ6I2RlZmluZSBfX1VTRVJfTEFCRUxfUFJFRklYX18gXworLy8gQUFSQ0g2NDojZGVmaW5lIF9fV0NIQVJfTUFYX18gNDI5NDk2NzI5NVUKKy8vIEFBUkNINjQ6I2RlZmluZSBfX1dDSEFSX1RZUEVfXyB1bnNpZ25lZCBpbnQKKy8vIEFBUkNINjQ6I2RlZmluZSBfX1dDSEFSX1VOU0lHTkVEX18gMQorLy8gQUFSQ0g2NDojZGVmaW5lIF9fV0NIQVJfV0lEVEhfXyAzMgorLy8gQUFSQ0g2NDojZGVmaW5lIF9fV0lOVF9UWVBFX18gaW50CisvLyBBQVJDSDY0OiNkZWZpbmUgX19XSU5UX1dJRFRIX18gMzIKKy8vIEFBUkNINjQ6I2RlZmluZSBfX2FhcmNoNjRfXyAxCisvLworLy8gUlVOOiAlY2xhbmdfY2MxIC1FIC1kTSAtZmZyZWVzdGFuZGluZyAtdHJpcGxlPWFhcmNoNjRfYmUtbm9uZS1ub25lIDwgL2Rldi9udWxsIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQUFSQ0g2NC1CRSAlcworLy8KKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfTFA2NCAxCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19BQVJDSDY0RUJfXyAxCisvLyBBQVJDSDY0LUJFLU5PVDojZGVmaW5lIF9fQUFSQ0g2NEVMX18gMQorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fQUFSQ0hfQklHX0VORElBTiAxCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19BUk1fNjRCSVRfU1RBVEUgMQorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fQVJNX0FSQ0ggOAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fQVJNX0FSQ0hfSVNBX0E2NCAxCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19BUk1fQklHX0VORElBTiAxCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19CWVRFX09SREVSX18gX19PUkRFUl9CSUdfRU5ESUFOX18KKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0NIQVIxNl9UWVBFX18gdW5zaWduZWQgc2hvcnQKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0NIQVIzMl9UWVBFX18gdW5zaWduZWQgaW50CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19DSEFSX0JJVF9fIDgKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0RCTF9ERU5PUk1fTUlOX18gNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0RCTF9ESUdfXyAxNQorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fREJMX0VQU0lMT05fXyAyLjIyMDQ0NjA0OTI1MDMxMzFlLTE2CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19EQkxfSEFTX0RFTk9STV9fIDEKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0RCTF9IQVNfSU5GSU5JVFlfXyAxCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19EQkxfSEFTX1FVSUVUX05BTl9fIDEKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0RCTF9NQU5UX0RJR19fIDUzCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19EQkxfTUFYXzEwX0VYUF9fIDMwOAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fREJMX01BWF9FWFBfXyAxMDI0CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19EQkxfTUFYX18gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0RCTF9NSU5fMTBfRVhQX18gKC0zMDcpCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19EQkxfTUlOX0VYUF9fICgtMTAyMSkKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0RCTF9NSU5fXyAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fREVDSU1BTF9ESUdfXyAzNgorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fRkxUX0RFTk9STV9NSU5fXyAxLjQwMTI5ODQ2ZS00NUYKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0ZMVF9ESUdfXyA2CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19GTFRfRVBTSUxPTl9fIDEuMTkyMDkyOTBlLTdGCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19GTFRfRVZBTF9NRVRIT0RfXyAwCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19GTFRfSEFTX0RFTk9STV9fIDEKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0ZMVF9IQVNfSU5GSU5JVFlfXyAxCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19GTFRfSEFTX1FVSUVUX05BTl9fIDEKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0ZMVF9NQU5UX0RJR19fIDI0CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19GTFRfTUFYXzEwX0VYUF9fIDM4CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19GTFRfTUFYX0VYUF9fIDEyOAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fRkxUX01BWF9fIDMuNDAyODIzNDdlKzM4RgorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fRkxUX01JTl8xMF9FWFBfXyAoLTM3KQorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fRkxUX01JTl9FWFBfXyAoLTEyNSkKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0ZMVF9NSU5fXyAxLjE3NTQ5NDM1ZS0zOEYKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0ZMVF9SQURJWF9fIDIKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0lOVDE2X1RZUEVfXyBzaG9ydAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fSU5UMzJfVFlQRV9fIGludAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fSU5UNjRfQ19TVUZGSVhfXyBMCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19JTlQ2NF9UWVBFX18gbG9uZyBpbnQKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0lOVDhfVFlQRV9fIGNoYXIKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0lOVE1BWF9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fSU5UTUFYX1RZUEVfXyBsb25nIGludAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fSU5UTUFYX1dJRFRIX18gNjQKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0lOVFBUUl9UWVBFX18gbG9uZyBpbnQKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0lOVFBUUl9XSURUSF9fIDY0CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19JTlRfTUFYX18gMjE0NzQ4MzY0NworLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fTERCTF9ERU5PUk1fTUlOX18gNi40NzUxNzUxMTk0MzgwMjUxMTA5MjQ0Mzg5NTgyMjc2NDY1NWUtNDk2NkwKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0xEQkxfRElHX18gMzMKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0xEQkxfRVBTSUxPTl9fIDEuOTI1OTI5OTQ0Mzg3MjM1ODUzMDU1OTc3OTQyNTg0OTI3MzJlLTM0TAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fTERCTF9IQVNfREVOT1JNX18gMQorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fTERCTF9IQVNfSU5GSU5JVFlfXyAxCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19MREJMX0hBU19RVUlFVF9OQU5fXyAxCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19MREJMX01BTlRfRElHX18gMTEzCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19MREJMX01BWF8xMF9FWFBfXyA0OTMyCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19MREJMX01BWF9FWFBfXyAxNjM4NAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fTERCTF9NQVhfXyAxLjE4OTczMTQ5NTM1NzIzMTc2NTA4NTc1OTMyNjYyODAwNzAyZSs0OTMyTAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fTERCTF9NSU5fMTBfRVhQX18gKC00OTMxKQorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fTERCTF9NSU5fRVhQX18gKC0xNjM4MSkKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0xEQkxfTUlOX18gMy4zNjIxMDMxNDMxMTIwOTM1MDYyNjI2Nzc4MTczMjE3NTI2MGUtNDkzMkwKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0xPTkdfTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0xPTkdfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX0xQNjRfXyAxCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19QT0lOVEVSX1dJRFRIX18gNjQKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1BUUkRJRkZfVFlQRV9fIGxvbmcgaW50CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19QVFJESUZGX1dJRFRIX18gNjQKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1NDSEFSX01BWF9fIDEyNworLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fU0hSVF9NQVhfXyAzMjc2NworLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fU0lHX0FUT01JQ19XSURUSF9fIDMyCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19TSVpFT0ZfRE9VQkxFX18gOAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fU0laRU9GX0ZMT0FUX18gNAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fU0laRU9GX0lOVDEyOF9fIDE2CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19TSVpFT0ZfSU5UX18gNAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fU0laRU9GX0xPTkdfRE9VQkxFX18gMTYKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1NJWkVPRl9MT05HX0xPTkdfXyA4CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19TSVpFT0ZfTE9OR19fIDgKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1NJWkVPRl9QT0lOVEVSX18gOAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fU0laRU9GX1BUUkRJRkZfVF9fIDgKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1NJWkVPRl9TSE9SVF9fIDIKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1NJWkVPRl9TSVpFX1RfXyA4CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19TSVpFT0ZfV0NIQVJfVF9fIDQKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1NJWkVPRl9XSU5UX1RfXyA0CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19TSVpFX01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1NJWkVfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19TSVpFX1dJRFRIX18gNjQKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1VJTlRNQVhfVFlQRV9fIGxvbmcgdW5zaWduZWQgaW50CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19VU0VSX0xBQkVMX1BSRUZJWF9fIF8KKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1dDSEFSX01BWF9fIDQyOTQ5NjcyOTVVCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19XQ0hBUl9UWVBFX18gdW5zaWduZWQgaW50CisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19XQ0hBUl9VTlNJR05FRF9fIDEKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1dDSEFSX1dJRFRIX18gMzIKKy8vIEFBUkNINjQtQkU6I2RlZmluZSBfX1dJTlRfVFlQRV9fIGludAorLy8gQUFSQ0g2NC1CRTojZGVmaW5lIF9fV0lOVF9XSURUSF9fIDMyCisvLyBBQVJDSDY0LUJFOiNkZWZpbmUgX19hYXJjaDY0X18gMQorLy8KKy8vIFJVTjogJWNsYW5nX2NjMSAtRSAtZE0gLWZmcmVlc3RhbmRpbmcgLXRyaXBsZT1hYXJjaDY0LW5ldGJzZCA8IC9kZXYvbnVsbCB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IEFBUkNINjQtTkVUQlNEICVzCisvLworLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfTFA2NCAxCisvLyBBQVJDSDY0LU5FVEJTRC1OT1Q6I2RlZmluZSBfX0FBUkNINjRFQl9fIDEKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19BQVJDSDY0RUxfXyAxCisvLyBBQVJDSDY0LU5FVEJTRC1OT1Q6I2RlZmluZSBfX0FBUkNIX0JJR19FTkRJQU4gMQorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0FSTV82NEJJVF9TVEFURSAxCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fQVJNX0FSQ0ggOAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0FSTV9BUkNIX0lTQV9BNjQgMQorLy8gQUFSQ0g2NC1ORVRCU0QtTk9UOiNkZWZpbmUgX19BUk1fQklHX0VORElBTiAxCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fQllURV9PUkRFUl9fIF9fT1JERVJfTElUVExFX0VORElBTl9fCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fQ0hBUjE2X1RZUEVfXyB1bnNpZ25lZCBzaG9ydAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0NIQVIzMl9UWVBFX18gdW5zaWduZWQgaW50CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fQ0hBUl9CSVRfXyA4CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fREJMX0RFTk9STV9NSU5fXyA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0RCTF9ESUdfXyAxNQorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0RCTF9FUFNJTE9OX18gMi4yMjA0NDYwNDkyNTAzMTMxZS0xNgorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0RCTF9IQVNfREVOT1JNX18gMQorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0RCTF9IQVNfSU5GSU5JVFlfXyAxCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fREJMX0hBU19RVUlFVF9OQU5fXyAxCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fREJMX01BTlRfRElHX18gNTMKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19EQkxfTUFYXzEwX0VYUF9fIDMwOAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0RCTF9NQVhfRVhQX18gMTAyNAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0RCTF9NQVhfXyAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0RCTF9NSU5fMTBfRVhQX18gKC0zMDcpCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fREJMX01JTl9FWFBfXyAoLTEwMjEpCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fREJMX01JTl9fIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fREVDSU1BTF9ESUdfXyAzNgorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0VMRl9fIDEKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19GTFRfREVOT1JNX01JTl9fIDEuNDAxMjk4NDZlLTQ1RgorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0ZMVF9ESUdfXyA2CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fRkxUX0VQU0lMT05fXyAxLjE5MjA5MjkwZS03RgorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0ZMVF9FVkFMX01FVEhPRF9fIDAKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19GTFRfSEFTX0RFTk9STV9fIDEKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19GTFRfSEFTX0lORklOSVRZX18gMQorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0ZMVF9IQVNfUVVJRVRfTkFOX18gMQorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0ZMVF9NQU5UX0RJR19fIDI0CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fRkxUX01BWF8xMF9FWFBfXyAzOAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0ZMVF9NQVhfRVhQX18gMTI4CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fRkxUX01BWF9fIDMuNDAyODIzNDdlKzM4RgorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0ZMVF9NSU5fMTBfRVhQX18gKC0zNykKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19GTFRfTUlOX0VYUF9fICgtMTI1KQorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0ZMVF9NSU5fXyAxLjE3NTQ5NDM1ZS0zOEYKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19GTFRfUkFESVhfXyAyCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fSU5UMTZfVFlQRV9fIHNob3J0CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fSU5UMzJfVFlQRV9fIGludAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0lOVDY0X0NfU1VGRklYX18gTEwKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19JTlQ2NF9UWVBFX18gbG9uZyBsb25nIGludAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0lOVDhfVFlQRV9fIGNoYXIKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19JTlRNQVhfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fSU5UTUFYX1RZUEVfXyBsb25nIGxvbmcgaW50CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fSU5UTUFYX1dJRFRIX18gNjQKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19JTlRQVFJfVFlQRV9fIGxvbmcgaW50CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fSU5UUFRSX1dJRFRIX18gNjQKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19JTlRfTUFYX18gMjE0NzQ4MzY0NworLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0xEQkxfREVOT1JNX01JTl9fIDYuNDc1MTc1MTE5NDM4MDI1MTEwOTI0NDM4OTU4MjI3NjQ2NTVlLTQ5NjZMCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fTERCTF9ESUdfXyAzMworLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0xEQkxfRVBTSUxPTl9fIDEuOTI1OTI5OTQ0Mzg3MjM1ODUzMDU1OTc3OTQyNTg0OTI3MzJlLTM0TAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0xEQkxfSEFTX0RFTk9STV9fIDEKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19MREJMX0hBU19JTkZJTklUWV9fIDEKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19MREJMX0hBU19RVUlFVF9OQU5fXyAxCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fTERCTF9NQU5UX0RJR19fIDExMworLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0xEQkxfTUFYXzEwX0VYUF9fIDQ5MzIKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19MREJMX01BWF9FWFBfXyAxNjM4NAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0xEQkxfTUFYX18gMS4xODk3MzE0OTUzNTcyMzE3NjUwODU3NTkzMjY2MjgwMDcwMmUrNDkzMkwKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19MREJMX01JTl8xMF9FWFBfXyAoLTQ5MzEpCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fTERCTF9NSU5fRVhQX18gKC0xNjM4MSkKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19MREJMX01JTl9fIDMuMzYyMTAzMTQzMTEyMDkzNTA2MjYyNjc3ODE3MzIxNzUyNjBlLTQ5MzJMCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fTElUVExFX0VORElBTl9fIDEKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19MT05HX0xPTkdfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0xMCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX0xQNjRfXyAxCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fTmV0QlNEX18gMQorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1BPSU5URVJfV0lEVEhfXyA2NAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1BUUkRJRkZfVFlQRV9fIGxvbmcgaW50CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fUFRSRElGRl9XSURUSF9fIDY0CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fU0NIQVJfTUFYX18gMTI3CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fU0hSVF9NQVhfXyAzMjc2NworLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1NJR19BVE9NSUNfV0lEVEhfXyAzMgorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1NJWkVPRl9ET1VCTEVfXyA4CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fU0laRU9GX0ZMT0FUX18gNAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1NJWkVPRl9JTlRfXyA0CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fU0laRU9GX0xPTkdfRE9VQkxFX18gMTYKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19TSVpFT0ZfTE9OR19MT05HX18gOAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1NJWkVPRl9MT05HX18gOAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1NJWkVPRl9QT0lOVEVSX18gOAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1NJWkVPRl9QVFJESUZGX1RfXyA4CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fU0laRU9GX1NIT1JUX18gMgorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1NJWkVPRl9TSVpFX1RfXyA4CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fU0laRU9GX1dDSEFSX1RfXyA0CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fU0laRU9GX1dJTlRfVF9fIDQKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19TSVpFX01BWF9fIDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUwKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19TSVpFX1RZUEVfXyBsb25nIHVuc2lnbmVkIGludAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1NJWkVfV0lEVEhfXyA2NAorLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1VJTlRNQVhfVFlQRV9fIGxvbmcgbG9uZyB1bnNpZ25lZCBpbnQKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19VU0VSX0xBQkVMX1BSRUZJWF9fCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fV0NIQVJfTUFYX18gMjE0NzQ4MzY0NworLy8gQUFSQ0g2NC1ORVRCU0Q6I2RlZmluZSBfX1dDSEFSX1RZUEVfXyBpbnQKKy8vIEFBUkNINjQtTkVUQlNEOiNkZWZpbmUgX19XQ0hBUl9XSURUSF9fIDMyCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fV0lOVF9UWVBFX18gaW50CisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fV0lOVF9XSURUSF9fIDMyCisvLyBBQVJDSDY0LU5FVEJTRDojZGVmaW5lIF9fYWFyY2g2NF9fIDEKKwogLy8gUlVOOiAlY2xhbmdfY2MxIC1FIC1kTSAtZmZyZWVzdGFuZGluZyAtdHJpcGxlPWFybS1ub25lLW5vbmUgPCAvZGV2L251bGwgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBBUk0gJXMKIC8vCiAvLyBBUk0tTk9UOiNkZWZpbmUgX0xQNjQKIC8vIEFSTTojZGVmaW5lIF9fQVBDU18zMl9fIDEKKy8vIEFSTS1OT1Q6I2RlZmluZSBfX0FSTUVCX18gMQogLy8gQVJNOiNkZWZpbmUgX19BUk1FTF9fIDEKIC8vIEFSTTojZGVmaW5lIF9fQVJNX0FSQ0hfNkpfXyAxCisvLyBBUk0tTk9UOiNkZWZpbmUgX19BUk1fQklHX0VORElBTiAxCiAvLyBBUk06I2RlZmluZSBfX0JZVEVfT1JERVJfXyBfX09SREVSX0xJVFRMRV9FTkRJQU5fXwogLy8gQVJNOiNkZWZpbmUgX19DSEFSMTZfVFlQRV9fIHVuc2lnbmVkIHNob3J0CiAvLyBBUk06I2RlZmluZSBfX0NIQVIzMl9UWVBFX18gdW5zaWduZWQgaW50CkBAIC0zMDIsMTMgKzYyMSwxMTcgQEAKIC8vIEFSTTojZGVmaW5lIF9fYXJtIDEKIC8vIEFSTTojZGVmaW5lIF9fYXJtX18gMQogCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mZnJlZXN0YW5kaW5nIC10cmlwbGU9YXJtZWItbm9uZS1ub25lIDwgL2Rldi9udWxsIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQVJNLUJFICVzCisvLworLy8gQVJNLUJFLU5PVDojZGVmaW5lIF9MUDY0CisvLyBBUk0tQkU6I2RlZmluZSBfX0FQQ1NfMzJfXyAxCisvLyBBUk0tQkU6I2RlZmluZSBfX0FSTUVCX18gMQorLy8gQVJNLUJFLU5PVDojZGVmaW5lIF9fQVJNRUxfXyAxCisvLyBBUk0tQkU6I2RlZmluZSBfX0FSTV9BUkNIXzZKX18gMQorLy8gQVJNLUJFOiNkZWZpbmUgX19BUk1fQklHX0VORElBTiAxCisvLyBBUk0tQkU6I2RlZmluZSBfX0JJR19FTkRJQU5fXyAxCisvLyBBUk0tQkU6I2RlZmluZSBfX0JZVEVfT1JERVJfXyBfX09SREVSX0JJR19FTkRJQU5fXworLy8gQVJNLUJFOiNkZWZpbmUgX19DSEFSMTZfVFlQRV9fIHVuc2lnbmVkIHNob3J0CisvLyBBUk0tQkU6I2RlZmluZSBfX0NIQVIzMl9UWVBFX18gdW5zaWduZWQgaW50CisvLyBBUk0tQkU6I2RlZmluZSBfX0NIQVJfQklUX18gOAorLy8gQVJNLUJFOiNkZWZpbmUgX19EQkxfREVOT1JNX01JTl9fIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0CisvLyBBUk0tQkU6I2RlZmluZSBfX0RCTF9ESUdfXyAxNQorLy8gQVJNLUJFOiNkZWZpbmUgX19EQkxfRVBTSUxPTl9fIDIuMjIwNDQ2MDQ5MjUwMzEzMWUtMTYKKy8vIEFSTS1CRTojZGVmaW5lIF9fREJMX0hBU19ERU5PUk1fXyAxCisvLyBBUk0tQkU6I2RlZmluZSBfX0RCTF9IQVNfSU5GSU5JVFlfXyAxCisvLyBBUk0tQkU6I2RlZmluZSBfX0RCTF9IQVNfUVVJRVRfTkFOX18gMQorLy8gQVJNLUJFOiNkZWZpbmUgX19EQkxfTUFOVF9ESUdfXyA1MworLy8gQVJNLUJFOiNkZWZpbmUgX19EQkxfTUFYXzEwX0VYUF9fIDMwOAorLy8gQVJNLUJFOiNkZWZpbmUgX19EQkxfTUFYX0VYUF9fIDEwMjQKKy8vIEFSTS1CRTojZGVmaW5lIF9fREJMX01BWF9fIDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4CisvLyBBUk0tQkU6I2RlZmluZSBfX0RCTF9NSU5fMTBfRVhQX18gKC0zMDcpCisvLyBBUk0tQkU6I2RlZmluZSBfX0RCTF9NSU5fRVhQX18gKC0xMDIxKQorLy8gQVJNLUJFOiNkZWZpbmUgX19EQkxfTUlOX18gMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgKKy8vIEFSTS1CRTojZGVmaW5lIF9fREVDSU1BTF9ESUdfXyAxNworLy8gQVJNLUJFOiNkZWZpbmUgX19GTFRfREVOT1JNX01JTl9fIDEuNDAxMjk4NDZlLTQ1RgorLy8gQVJNLUJFOiNkZWZpbmUgX19GTFRfRElHX18gNgorLy8gQVJNLUJFOiNkZWZpbmUgX19GTFRfRVBTSUxPTl9fIDEuMTkyMDkyOTBlLTdGCisvLyBBUk0tQkU6I2RlZmluZSBfX0ZMVF9FVkFMX01FVEhPRF9fIDAKKy8vIEFSTS1CRTojZGVmaW5lIF9fRkxUX0hBU19ERU5PUk1fXyAxCisvLyBBUk0tQkU6I2RlZmluZSBfX0ZMVF9IQVNfSU5GSU5JVFlfXyAxCisvLyBBUk0tQkU6I2RlZmluZSBfX0ZMVF9IQVNfUVVJRVRfTkFOX18gMQorLy8gQVJNLUJFOiNkZWZpbmUgX19GTFRfTUFOVF9ESUdfXyAyNAorLy8gQVJNLUJFOiNkZWZpbmUgX19GTFRfTUFYXzEwX0VYUF9fIDM4CisvLyBBUk0tQkU6I2RlZmluZSBfX0ZMVF9NQVhfRVhQX18gMTI4CisvLyBBUk0tQkU6I2RlZmluZSBfX0ZMVF9NQVhfXyAzLjQwMjgyMzQ3ZSszOEYKKy8vIEFSTS1CRTojZGVmaW5lIF9fRkxUX01JTl8xMF9FWFBfXyAoLTM3KQorLy8gQVJNLUJFOiNkZWZpbmUgX19GTFRfTUlOX0VYUF9fICgtMTI1KQorLy8gQVJNLUJFOiNkZWZpbmUgX19GTFRfTUlOX18gMS4xNzU0OTQzNWUtMzhGCisvLyBBUk0tQkU6I2RlZmluZSBfX0ZMVF9SQURJWF9fIDIKKy8vIEFSTS1CRTojZGVmaW5lIF9fSU5UMTZfVFlQRV9fIHNob3J0CisvLyBBUk0tQkU6I2RlZmluZSBfX0lOVDMyX1RZUEVfXyBpbnQKKy8vIEFSTS1CRTojZGVmaW5lIF9fSU5UNjRfQ19TVUZGSVhfXyBMTAorLy8gQVJNLUJFOiNkZWZpbmUgX19JTlQ2NF9UWVBFX18gbG9uZyBsb25nIGludAorLy8gQVJNLUJFOiNkZWZpbmUgX19JTlQ4X1RZUEVfXyBjaGFyCisvLyBBUk0tQkU6I2RlZmluZSBfX0lOVE1BWF9NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKKy8vIEFSTS1CRTojZGVmaW5lIF9fSU5UTUFYX1RZUEVfXyBsb25nIGxvbmcgaW50CisvLyBBUk0tQkU6I2RlZmluZSBfX0lOVE1BWF9XSURUSF9fIDY0CisvLyBBUk0tQkU6I2RlZmluZSBfX0lOVFBUUl9UWVBFX18gbG9uZyBpbnQKKy8vIEFSTS1CRTojZGVmaW5lIF9fSU5UUFRSX1dJRFRIX18gMzIKKy8vIEFSTS1CRTojZGVmaW5lIF9fSU5UX01BWF9fIDIxNDc0ODM2NDcKKy8vIEFSTS1CRTojZGVmaW5lIF9fTERCTF9ERU5PUk1fTUlOX18gNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjRMCisvLyBBUk0tQkU6I2RlZmluZSBfX0xEQkxfRElHX18gMTUKKy8vIEFSTS1CRTojZGVmaW5lIF9fTERCTF9FUFNJTE9OX18gMi4yMjA0NDYwNDkyNTAzMTMxZS0xNkwKKy8vIEFSTS1CRTojZGVmaW5lIF9fTERCTF9IQVNfREVOT1JNX18gMQorLy8gQVJNLUJFOiNkZWZpbmUgX19MREJMX0hBU19JTkZJTklUWV9fIDEKKy8vIEFSTS1CRTojZGVmaW5lIF9fTERCTF9IQVNfUVVJRVRfTkFOX18gMQorLy8gQVJNLUJFOiNkZWZpbmUgX19MREJMX01BTlRfRElHX18gNTMKKy8vIEFSTS1CRTojZGVmaW5lIF9fTERCTF9NQVhfMTBfRVhQX18gMzA4CisvLyBBUk0tQkU6I2RlZmluZSBfX0xEQkxfTUFYX0VYUF9fIDEwMjQKKy8vIEFSTS1CRTojZGVmaW5lIF9fTERCTF9NQVhfXyAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOEwKKy8vIEFSTS1CRTojZGVmaW5lIF9fTERCTF9NSU5fMTBfRVhQX18gKC0zMDcpCisvLyBBUk0tQkU6I2RlZmluZSBfX0xEQkxfTUlOX0VYUF9fICgtMTAyMSkKKy8vIEFSTS1CRTojZGVmaW5lIF9fTERCTF9NSU5fXyAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOEwKKy8vIEFSTS1CRTojZGVmaW5lIF9fTE9OR19MT05HX01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTAorLy8gQVJNLUJFOiNkZWZpbmUgX19MT05HX01BWF9fIDIxNDc0ODM2NDdMCisvLyBBUk0tQkUtTk9UOiNkZWZpbmUgX19MUDY0X18KKy8vIEFSTS1CRTojZGVmaW5lIF9fUE9JTlRFUl9XSURUSF9fIDMyCisvLyBBUk0tQkU6I2RlZmluZSBfX1BUUkRJRkZfVFlQRV9fIGludAorLy8gQVJNLUJFOiNkZWZpbmUgX19QVFJESUZGX1dJRFRIX18gMzIKKy8vIEFSTS1CRTojZGVmaW5lIF9fUkVHSVNURVJfUFJFRklYX18KKy8vIEFSTS1CRTojZGVmaW5lIF9fU0NIQVJfTUFYX18gMTI3CisvLyBBUk0tQkU6I2RlZmluZSBfX1NIUlRfTUFYX18gMzI3NjcKKy8vIEFSTS1CRTojZGVmaW5lIF9fU0lHX0FUT01JQ19XSURUSF9fIDMyCisvLyBBUk0tQkU6I2RlZmluZSBfX1NJWkVPRl9ET1VCTEVfXyA4CisvLyBBUk0tQkU6I2RlZmluZSBfX1NJWkVPRl9GTE9BVF9fIDQKKy8vIEFSTS1CRTojZGVmaW5lIF9fU0laRU9GX0lOVF9fIDQKKy8vIEFSTS1CRTojZGVmaW5lIF9fU0laRU9GX0xPTkdfRE9VQkxFX18gOAorLy8gQVJNLUJFOiNkZWZpbmUgX19TSVpFT0ZfTE9OR19MT05HX18gOAorLy8gQVJNLUJFOiNkZWZpbmUgX19TSVpFT0ZfTE9OR19fIDQKKy8vIEFSTS1CRTojZGVmaW5lIF9fU0laRU9GX1BPSU5URVJfXyA0CisvLyBBUk0tQkU6I2RlZmluZSBfX1NJWkVPRl9QVFJESUZGX1RfXyA0CisvLyBBUk0tQkU6I2RlZmluZSBfX1NJWkVPRl9TSE9SVF9fIDIKKy8vIEFSTS1CRTojZGVmaW5lIF9fU0laRU9GX1NJWkVfVF9fIDQKKy8vIEFSTS1CRTojZGVmaW5lIF9fU0laRU9GX1dDSEFSX1RfXyA0CisvLyBBUk0tQkU6I2RlZmluZSBfX1NJWkVPRl9XSU5UX1RfXyA0CisvLyBBUk0tQkU6I2RlZmluZSBfX1NJWkVfTUFYX18gNDI5NDk2NzI5NVUKKy8vIEFSTS1CRTojZGVmaW5lIF9fU0laRV9UWVBFX18gdW5zaWduZWQgaW50CisvLyBBUk0tQkU6I2RlZmluZSBfX1NJWkVfV0lEVEhfXyAzMgorLy8gQVJNLUJFOiNkZWZpbmUgX19USFVNQl9JTlRFUldPUktfXyAxCisvLyBBUk0tQkU6I2RlZmluZSBfX1VJTlRNQVhfVFlQRV9fIGxvbmcgbG9uZyB1bnNpZ25lZCBpbnQKKy8vIEFSTS1CRTojZGVmaW5lIF9fVVNFUl9MQUJFTF9QUkVGSVhfXyBfCisvLyBBUk0tQkU6I2RlZmluZSBfX1dDSEFSX01BWF9fIDQyOTQ5NjcyOTVVCisvLyBBUk0tQkU6I2RlZmluZSBfX1dDSEFSX1RZUEVfXyB1bnNpZ25lZCBpbnQKKy8vIEFSTS1CRTojZGVmaW5lIF9fV0NIQVJfV0lEVEhfXyAzMgorLy8gQVJNLUJFOiNkZWZpbmUgX19XSU5UX1RZUEVfXyBpbnQKKy8vIEFSTS1CRTojZGVmaW5lIF9fV0lOVF9XSURUSF9fIDMyCisvLyBBUk0tQkU6I2RlZmluZSBfX2FybSAxCisvLyBBUk0tQkU6I2RlZmluZSBfX2FybV9fIDEKKwogLy8gUlVOOiAlY2xhbmdfY2MxIC1FIC1kTSAtZmZyZWVzdGFuZGluZyAtdHJpcGxlPWFybS1ub25lLWxpbnV4LWdudWVhYmkgLXRhcmdldC1mZWF0dXJlICtzb2Z0LWZsb2F0IC10YXJnZXQtZmVhdHVyZSArc29mdC1mbG9hdC1hYmkgPCAvZGV2L251bGwgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBBUk1FQUJJU09GVEZQICVzCiAvLwotLy8gQVJNLU5PVDojZGVmaW5lIF9MUDY0CisvLyBBUk1FQUJJU09GVEZQLU5PVDojZGVmaW5lIF9MUDY0CiAvLyBBUk1FQUJJU09GVEZQOiNkZWZpbmUgX19BUENTXzMyX18gMQorLy8gQVJNRUFCSVNPRlRGUC1OT1Q6I2RlZmluZSBfX0FSTUVCX18gMQogLy8gQVJNRUFCSVNPRlRGUDojZGVmaW5lIF9fQVJNRUxfXyAxCiAvLyBBUk1FQUJJU09GVEZQOiNkZWZpbmUgX19BUk1fQVJDSCA2CiAvLyBBUk1FQUJJU09GVEZQOiNkZWZpbmUgX19BUk1fQVJDSF82Sl9fIDEKKy8vIEFSTUVBQklTT0ZURlAtTk9UOiNkZWZpbmUgX19BUk1fQklHX0VORElBTiAxCiAvLyBBUk1FQUJJU09GVEZQOiNkZWZpbmUgX19BUk1fRUFCSV9fIDEKIC8vIEFSTUVBQklTT0ZURlA6I2RlZmluZSBfX0FSTV9QQ1MgMQogLy8gQVJNRUFCSVNPRlRGUC1OT1Q6I2RlZmluZSBfX0FSTV9QQ1NfVkZQIDEKQEAgLTQwOSwxMSArODMyLDEzIEBACiAKIC8vIFJVTjogJWNsYW5nX2NjMSAtRSAtZE0gLWZmcmVlc3RhbmRpbmcgLXRyaXBsZT1hcm0tbm9uZS1saW51eC1nbnVlYWJpIDwgL2Rldi9udWxsIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggQVJNRUFCSUhBUkRGUCAlcwogLy8KLS8vIEFSTS1OT1Q6I2RlZmluZSBfTFA2NAorLy8gQVJNRUFCSUhBUkRGUC1OT1Q6I2RlZmluZSBfTFA2NAogLy8gQVJNRUFCSUhBUkRGUDojZGVmaW5lIF9fQVBDU18zMl9fIDEKKy8vIEFSTUVBQklIQVJERlAtTk9UOiNkZWZpbmUgX19BUk1FQl9fIDEKIC8vIEFSTUVBQklIQVJERlA6I2RlZmluZSBfX0FSTUVMX18gMQogLy8gQVJNRUFCSUhBUkRGUDojZGVmaW5lIF9fQVJNX0FSQ0ggNgogLy8gQVJNRUFCSUhBUkRGUDojZGVmaW5lIF9fQVJNX0FSQ0hfNkpfXyAxCisvLyBBUk1FQUJJSEFSREZQLU5PVDojZGVmaW5lIF9fQVJNX0JJR19FTkRJQU4gMQogLy8gQVJNRUFCSUhBUkRGUDojZGVmaW5lIF9fQVJNX0VBQklfXyAxCiAvLyBBUk1FQUJJSEFSREZQOiNkZWZpbmUgX19BUk1fUENTIDEKIC8vIEFSTUVBQklIQVJERlA6I2RlZmluZSBfX0FSTV9QQ1NfVkZQIDEKQEAgLTUzOSw2ICs5NjQsMzggQEAKIC8vIFJVTjogJWNsYW5nIC10YXJnZXQgYXJtIC1tdGh1bWIgLW1od2Rpdj1hcm0gLXggYyAtRSAtZE0gJXMgLW8gLSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1BUk1IV0RJVi1USFVNQi1GQUxTRSAlcwogLy8gQVJNSFdESVYtVEhVTUItRkFMU0UtTk9UOiNkZWZpbmUgX19BUk1fQVJDSF9FWFRfSURJVl9fCiAKKy8vIFJVTjogJWNsYW5nX2NjMSAtRSAtZE0gLWZmcmVlc3RhbmRpbmcgLXRyaXBsZT1hcm12OC1ub25lLW5vbmUgPCAvZGV2L251bGwgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBBUk12OCAlcworLy8gQVJNdjg6ICNkZWZpbmUgX19USFVNQl9JTlRFUldPUktfXyAxCisvLyBBUk12OC1OT1Q6ICNkZWZpbmUgX190aHVtYjJfXworCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mZnJlZXN0YW5kaW5nIC10cmlwbGU9YXJtZWJ2OC1ub25lLW5vbmUgPCAvZGV2L251bGwgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBBUk1lYnY4ICVzCisvLyBBUk1lYnY4OiAjZGVmaW5lIF9fVEhVTUJfSU5URVJXT1JLX18gMQorLy8gQVJNZWJ2OC1OT1Q6ICNkZWZpbmUgX190aHVtYjJfXworCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mZnJlZXN0YW5kaW5nIC10cmlwbGU9dGh1bWJ2OCA8IC9kZXYvbnVsbCB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IFRodW1idjggJXMKKy8vIFRodW1idjg6ICNkZWZpbmUgX19USFVNQl9JTlRFUldPUktfXyAxCisvLyBUaHVtYnY4OiAjZGVmaW5lIF9fdGh1bWIyX18KKworLy8gUlVOOiAlY2xhbmdfY2MxIC1FIC1kTSAtZmZyZWVzdGFuZGluZyAtdHJpcGxlPXRodW1iZWJ2OCA8IC9kZXYvbnVsbCB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IFRodW1iZWJ2OCAlcworLy8gVGh1bWJlYnY4OiAjZGVmaW5lIF9fVEhVTUJfSU5URVJXT1JLX18gMQorLy8gVGh1bWJlYnY4OiAjZGVmaW5lIF9fdGh1bWIyX18KKworLy8gUlVOOiAlY2xhbmdfY2MxIC1FIC1kTSAtZmZyZWVzdGFuZGluZyAtdHJpcGxlPXRodW1idjUgPCAvZGV2L251bGwgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBUaHVtYnY1ICVzCisvLyBUaHVtYnY1OiAjZGVmaW5lIF9fVEhVTUJfSU5URVJXT1JLX18gMQorLy8gVGh1bWJ2NS1OT1Q6ICNkZWZpbmUgX190aHVtYjJfXworCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mZnJlZXN0YW5kaW5nIC10cmlwbGU9dGh1bWJ2NnQyIDwgL2Rldi9udWxsIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggVGh1bWJ2NnQyICVzCisvLyBUaHVtYnY2dDI6ICNkZWZpbmUgX19USFVNQl9JTlRFUldPUktfXyAxCisvLyBUaHVtYnY2dDI6ICNkZWZpbmUgX190aHVtYjJfXworCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mZnJlZXN0YW5kaW5nIC10cmlwbGU9dGh1bWJ2NyA8IC9kZXYvbnVsbCB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IFRodW1idjcgJXMKKy8vIFRodW1idjc6ICNkZWZpbmUgX19USFVNQl9JTlRFUldPUktfXyAxCisvLyBUaHVtYnY3OiAjZGVmaW5lIF9fdGh1bWIyX18KKworLy8gUlVOOiAlY2xhbmdfY2MxIC1FIC1kTSAtZmZyZWVzdGFuZGluZyAtdHJpcGxlPXRodW1iZWJ2NyA8IC9kZXYvbnVsbCB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IFRodW1iZWJ2NyAlcworLy8gVGh1bWJlYnY3OiAjZGVmaW5lIF9fVEhVTUJfSU5URVJXT1JLX18gMQorLy8gVGh1bWJlYnY3OiAjZGVmaW5lIF9fdGh1bWIyX18KKwogLy8KIC8vIFJVTjogJWNsYW5nX2NjMSAtRSAtZE0gLWZmcmVlc3RhbmRpbmcgLXRyaXBsZT1pMzg2LW5vbmUtbm9uZSA8IC9kZXYvbnVsbCB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IEkzODYgJXMKIC8vCkBAIC04NDgsMTMgKzEzMDUsMTQgQEAKIC8vIE1JUFMzMkJFOiNkZWZpbmUgX0FCSU8zMiAxCiAvLyBNSVBTMzJCRS1OT1Q6I2RlZmluZSBfTFA2NAogLy8gTUlQUzMyQkU6I2RlZmluZSBfTUlQU0VCIDEKLS8vIE1JUFMzMkJFOiNkZWZpbmUgX01JUFNfQVJDSCAibWlwczMyIgotLy8gTUlQUzMyQkU6I2RlZmluZSBfTUlQU19BUkNIX01JUFMzMiAxCisvLyBNSVBTMzJCRTojZGVmaW5lIF9NSVBTX0FSQ0ggIm1pcHMzMnIyIgorLy8gTUlQUzMyQkU6I2RlZmluZSBfTUlQU19BUkNIX01JUFMzMlIyIDEKIC8vIE1JUFMzMkJFOiNkZWZpbmUgX01JUFNfRlBTRVQgMTYKIC8vIE1JUFMzMkJFOiNkZWZpbmUgX01JUFNfU0lNIF9BQklPMzIKIC8vIE1JUFMzMkJFOiNkZWZpbmUgX01JUFNfU1pJTlQgMzIKIC8vIE1JUFMzMkJFOiNkZWZpbmUgX01JUFNfU1pMT05HIDMyCiAvLyBNSVBTMzJCRTojZGVmaW5lIF9NSVBTX1NaUFRSIDMyCisvLyBNSVBTMzJCRTojZGVmaW5lIF9fQklHX0VORElBTl9fIDEKIC8vIE1JUFMzMkJFOiNkZWZpbmUgX19CWVRFX09SREVSX18gX19PUkRFUl9CSUdfRU5ESUFOX18KIC8vIE1JUFMzMkJFOiNkZWZpbmUgX19DSEFSMTZfVFlQRV9fIHVuc2lnbmVkIHNob3J0CiAvLyBNSVBTMzJCRTojZGVmaW5lIF9fQ0hBUjMyX1RZUEVfXyB1bnNpZ25lZCBpbnQKQEAgLTk1Myw3ICsxNDExLDcgQEAKIC8vIE1JUFMzMkJFOiNkZWZpbmUgX19XSU5UX1dJRFRIX18gMzIKIC8vIE1JUFMzMkJFOiNkZWZpbmUgX19jbGFuZ19fIDEKIC8vIE1JUFMzMkJFOiNkZWZpbmUgX19sbHZtX18gMQotLy8gTUlQUzMyQkU6I2RlZmluZSBfX21pcHMgMQorLy8gTUlQUzMyQkU6I2RlZmluZSBfX21pcHMgMzIKIC8vIE1JUFMzMkJFOiNkZWZpbmUgX19taXBzX18gMQogLy8gTUlQUzMyQkU6I2RlZmluZSBfX21pcHNfZnByIDMyCiAvLyBNSVBTMzJCRTojZGVmaW5lIF9fbWlwc19oYXJkX2Zsb2F0IDEKQEAgLTk2Nyw4ICsxNDI1LDggQEAKIC8vIE1JUFMzMkVMOiNkZWZpbmUgX0FCSU8zMiAxCiAvLyBNSVBTMzJFTC1OT1Q6I2RlZmluZSBfTFA2NAogLy8gTUlQUzMyRUw6I2RlZmluZSBfTUlQU0VMIDEKLS8vIE1JUFMzMkVMOiNkZWZpbmUgX01JUFNfQVJDSCAibWlwczMyIgotLy8gTUlQUzMyRUw6I2RlZmluZSBfTUlQU19BUkNIX01JUFMzMiAxCisvLyBNSVBTMzJFTDojZGVmaW5lIF9NSVBTX0FSQ0ggIm1pcHMzMnIyIgorLy8gTUlQUzMyRUw6I2RlZmluZSBfTUlQU19BUkNIX01JUFMzMlIyIDEKIC8vIE1JUFMzMkVMOiNkZWZpbmUgX01JUFNfRlBTRVQgMTYKIC8vIE1JUFMzMkVMOiNkZWZpbmUgX01JUFNfU0lNIF9BQklPMzIKIC8vIE1JUFMzMkVMOiNkZWZpbmUgX01JUFNfU1pJTlQgMzIKQEAgLTEwMzIsNiArMTQ5MCw3IEBACiAvLyBNSVBTMzJFTDojZGVmaW5lIF9fTERCTF9NSU5fMTBfRVhQX18gKC0zMDcpCiAvLyBNSVBTMzJFTDojZGVmaW5lIF9fTERCTF9NSU5fRVhQX18gKC0xMDIxKQogLy8gTUlQUzMyRUw6I2RlZmluZSBfX0xEQkxfTUlOX18gMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDhMCisvLyBNSVBTMzJFTDojZGVmaW5lIF9fTElUVExFX0VORElBTl9fIDEKIC8vIE1JUFMzMkVMOiNkZWZpbmUgX19MT05HX0xPTkdfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0xMCiAvLyBNSVBTMzJFTDojZGVmaW5lIF9fTE9OR19NQVhfXyAyMTQ3NDgzNjQ3TAogLy8gTUlQUzMyRUwtTk9UOiNkZWZpbmUgX19MUDY0X18KQEAgLTEwNjksNyArMTUyOCw3IEBACiAvLyBNSVBTMzJFTDojZGVmaW5lIF9fV0lOVF9XSURUSF9fIDMyCiAvLyBNSVBTMzJFTDojZGVmaW5lIF9fY2xhbmdfXyAxCiAvLyBNSVBTMzJFTDojZGVmaW5lIF9fbGx2bV9fIDEKLS8vIE1JUFMzMkVMOiNkZWZpbmUgX19taXBzIDEKKy8vIE1JUFMzMkVMOiNkZWZpbmUgX19taXBzIDMyCiAvLyBNSVBTMzJFTDojZGVmaW5lIF9fbWlwc19fIDEKIC8vIE1JUFMzMkVMOiNkZWZpbmUgX19taXBzX2ZwciAzMgogLy8gTUlQUzMyRUw6I2RlZmluZSBfX21pcHNfaGFyZF9mbG9hdCAxCkBAIC0xMDgzLDEzICsxNTQyLDE0IEBACiAvLyBNSVBTNjRCRTojZGVmaW5lIF9BQkk2NCAzCiAvLyBNSVBTNjRCRTojZGVmaW5lIF9MUDY0IDEKIC8vIE1JUFM2NEJFOiNkZWZpbmUgX01JUFNFQiAxCi0vLyBNSVBTNjRCRTojZGVmaW5lIF9NSVBTX0FSQ0ggIm1pcHM2NCIKLS8vIE1JUFM2NEJFOiNkZWZpbmUgX01JUFNfQVJDSF9NSVBTNjQgMQorLy8gTUlQUzY0QkU6I2RlZmluZSBfTUlQU19BUkNIICJtaXBzNjRyMiIKKy8vIE1JUFM2NEJFOiNkZWZpbmUgX01JUFNfQVJDSF9NSVBTNjRSMiAxCiAvLyBNSVBTNjRCRTojZGVmaW5lIF9NSVBTX0ZQU0VUIDMyCiAvLyBNSVBTNjRCRTojZGVmaW5lIF9NSVBTX1NJTSBfQUJJNjQKIC8vIE1JUFM2NEJFOiNkZWZpbmUgX01JUFNfU1pJTlQgMzIKIC8vIE1JUFM2NEJFOiNkZWZpbmUgX01JUFNfU1pMT05HIDY0CiAvLyBNSVBTNjRCRTojZGVmaW5lIF9NSVBTX1NaUFRSIDY0CisvLyBNSVBTNjRCRTojZGVmaW5lIF9fQklHX0VORElBTl9fIDEKIC8vIE1JUFM2NEJFOiNkZWZpbmUgX19CWVRFX09SREVSX18gX19PUkRFUl9CSUdfRU5ESUFOX18KIC8vIE1JUFM2NEJFOiNkZWZpbmUgX19DSEFSMTZfVFlQRV9fIHVuc2lnbmVkIHNob3J0CiAvLyBNSVBTNjRCRTojZGVmaW5lIF9fQ0hBUjMyX1RZUEVfXyB1bnNpZ25lZCBpbnQKQEAgLTExODUsNyArMTY0NSw3IEBACiAvLyBNSVBTNjRCRTojZGVmaW5lIF9fV0lOVF9XSURUSF9fIDMyCiAvLyBNSVBTNjRCRTojZGVmaW5lIF9fY2xhbmdfXyAxCiAvLyBNSVBTNjRCRTojZGVmaW5lIF9fbGx2bV9fIDEKLS8vIE1JUFM2NEJFOiNkZWZpbmUgX19taXBzIDEKKy8vIE1JUFM2NEJFOiNkZWZpbmUgX19taXBzIDY0CiAvLyBNSVBTNjRCRTojZGVmaW5lIF9fbWlwczY0IDEKIC8vIE1JUFM2NEJFOiNkZWZpbmUgX19taXBzNjRfXyAxCiAvLyBNSVBTNjRCRTojZGVmaW5lIF9fbWlwc19fIDEKQEAgLTEyMDEsOCArMTY2MSw4IEBACiAvLyBNSVBTNjRFTDojZGVmaW5lIF9BQkk2NCAzCiAvLyBNSVBTNjRFTDojZGVmaW5lIF9MUDY0IDEKIC8vIE1JUFM2NEVMOiNkZWZpbmUgX01JUFNFTCAxCi0vLyBNSVBTNjRFTDojZGVmaW5lIF9NSVBTX0FSQ0ggIm1pcHM2NCIKLS8vIE1JUFM2NEVMOiNkZWZpbmUgX01JUFNfQVJDSF9NSVBTNjQgMQorLy8gTUlQUzY0RUw6I2RlZmluZSBfTUlQU19BUkNIICJtaXBzNjRyMiIKKy8vIE1JUFM2NEVMOiNkZWZpbmUgX01JUFNfQVJDSF9NSVBTNjRSMiAxCiAvLyBNSVBTNjRFTDojZGVmaW5lIF9NSVBTX0ZQU0VUIDMyCiAvLyBNSVBTNjRFTDojZGVmaW5lIF9NSVBTX1NJTSBfQUJJNjQKIC8vIE1JUFM2NEVMOiNkZWZpbmUgX01JUFNfU1pJTlQgMzIKQEAgLTEyNjYsNiArMTcyNiw3IEBACiAvLyBNSVBTNjRFTDojZGVmaW5lIF9fTERCTF9NSU5fMTBfRVhQX18gKC00OTMxKQogLy8gTUlQUzY0RUw6I2RlZmluZSBfX0xEQkxfTUlOX0VYUF9fICgtMTYzODEpCiAvLyBNSVBTNjRFTDojZGVmaW5lIF9fTERCTF9NSU5fXyAzLjM2MjEwMzE0MzExMjA5MzUwNjI2MjY3NzgxNzMyMTc1MjYwZS00OTMyTAorLy8gTUlQUzY0RUw6I2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fXyAxCiAvLyBNSVBTNjRFTDojZGVmaW5lIF9fTE9OR19MT05HX01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTAogLy8gTUlQUzY0RUw6I2RlZmluZSBfX0xPTkdfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKIC8vIE1JUFM2NEVMOiNkZWZpbmUgX19MUDY0X18gMQpAQCAtMTMwMyw3ICsxNzY0LDcgQEAKIC8vIE1JUFM2NEVMOiNkZWZpbmUgX19XSU5UX1dJRFRIX18gMzIKIC8vIE1JUFM2NEVMOiNkZWZpbmUgX19jbGFuZ19fIDEKIC8vIE1JUFM2NEVMOiNkZWZpbmUgX19sbHZtX18gMQotLy8gTUlQUzY0RUw6I2RlZmluZSBfX21pcHMgMQorLy8gTUlQUzY0RUw6I2RlZmluZSBfX21pcHMgNjQKIC8vIE1JUFM2NEVMOiNkZWZpbmUgX19taXBzNjQgMQogLy8gTUlQUzY0RUw6I2RlZmluZSBfX21pcHM2NF9fIDEKIC8vIE1JUFM2NEVMOiNkZWZpbmUgX19taXBzX18gMQpAQCAtMTMxMyw2ICsxNzc0LDUwIEBACiAvLyBNSVBTNjRFTDojZGVmaW5lIF9taXBzIDEKIC8vIE1JUFM2NEVMOiNkZWZpbmUgbWlwcyAxCiAvLworLy8gQ2hlY2sgTUlQUyBhcmNoIG1hY3JvcworLy8KKy8vIFJVTjogJWNsYW5nX2NjMSAtRSAtZE0gLWZmcmVlc3RhbmRpbmcgLXRyaXBsZT1taXBzLW5vbmUtbm9uZSBcCisvLyBSVU46ICAgICAgICAgICAgPCAvZGV2L251bGwgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggTUlQUy1BUkNILURFRjMyICVzCisvLworLy8gTUlQUy1BUkNILURFRjMyOiNkZWZpbmUgX01JUFNfQVJDSCAibWlwczMycjIiCisvLyBNSVBTLUFSQ0gtREVGMzI6I2RlZmluZSBfTUlQU19BUkNIX01JUFMzMlIyIDEKKy8vCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mZnJlZXN0YW5kaW5nIC10cmlwbGU9bWlwcy1ub25lLW5vbmVzIFwKKy8vIFJVTjogICAgICAgICAgICAtdGFyZ2V0LWNwdSBtaXBzMzIgPCAvZGV2L251bGwgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggTUlQUy1BUkNILTMyICVzCisvLworLy8gTUlQUy1BUkNILTMyOiNkZWZpbmUgX01JUFNfQVJDSCAibWlwczMyIgorLy8gTUlQUy1BUkNILTMyOiNkZWZpbmUgX01JUFNfQVJDSF9NSVBTMzIgMQorLy8KKy8vIFJVTjogJWNsYW5nX2NjMSAtRSAtZE0gLWZmcmVlc3RhbmRpbmcgLXRyaXBsZT1taXBzLW5vbmUtbm9uZSBcCisvLyBSVU46ICAgICAgICAgICAgLXRhcmdldC1jcHUgbWlwczMycjIgPCAvZGV2L251bGwgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggTUlQUy1BUkNILTMyUjIgJXMKKy8vCisvLyBNSVBTLUFSQ0gtMzJSMjojZGVmaW5lIF9NSVBTX0FSQ0ggIm1pcHMzMnIyIgorLy8gTUlQUy1BUkNILTMyUjI6I2RlZmluZSBfTUlQU19BUkNIX01JUFMzMlIyIDEKKy8vCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mZnJlZXN0YW5kaW5nIC10cmlwbGU9bWlwczY0LW5vbmUtbm9uZSBcCisvLyBSVU46ICAgICAgICAgICAgPCAvZGV2L251bGwgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggTUlQUy1BUkNILURFRjY0ICVzCisvLworLy8gTUlQUy1BUkNILURFRjY0OiNkZWZpbmUgX01JUFNfQVJDSCAibWlwczY0cjIiCisvLyBNSVBTLUFSQ0gtREVGNjQ6I2RlZmluZSBfTUlQU19BUkNIX01JUFM2NFIyIDEKKy8vCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mZnJlZXN0YW5kaW5nIC10cmlwbGU9bWlwczY0LW5vbmUtbm9uZSBcCisvLyBSVU46ICAgICAgICAgICAgLXRhcmdldC1jcHUgbWlwczY0IDwgL2Rldi9udWxsIFwKKy8vIFJVTjogICB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IE1JUFMtQVJDSC02NCAlcworLy8KKy8vIE1JUFMtQVJDSC02NDojZGVmaW5lIF9NSVBTX0FSQ0ggIm1pcHM2NCIKKy8vIE1JUFMtQVJDSC02NDojZGVmaW5lIF9NSVBTX0FSQ0hfTUlQUzY0IDEKKy8vCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mZnJlZXN0YW5kaW5nIC10cmlwbGU9bWlwczY0LW5vbmUtbm9uZSBcCisvLyBSVU46ICAgICAgICAgICAgLXRhcmdldC1jcHUgbWlwczY0cjIgPCAvZGV2L251bGwgXAorLy8gUlVOOiAgIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXggTUlQUy1BUkNILTY0UjIgJXMKKy8vCisvLyBNSVBTLUFSQ0gtNjRSMjojZGVmaW5lIF9NSVBTX0FSQ0ggIm1pcHM2NHIyIgorLy8gTUlQUy1BUkNILTY0UjI6I2RlZmluZSBfTUlQU19BUkNIX01JUFM2NFIyIDEKKy8vCiAvLyBDaGVjayBNSVBTIGZsb2F0IEFCSSBtYWNyb3MKIC8vCiAvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mZnJlZXN0YW5kaW5nIFwKQEAgLTE0NzMsNiArMTk3OCw3IEBACiAvLyBNU1A0MzA6I2RlZmluZSBfX0xEQkxfTUlOXzEwX0VYUF9fICgtMzA3KQogLy8gTVNQNDMwOiNkZWZpbmUgX19MREJMX01JTl9FWFBfXyAoLTEwMjEpCiAvLyBNU1A0MzA6I2RlZmluZSBfX0xEQkxfTUlOX18gMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDhMCisvLyBNU1A0MzA6I2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fXyAxCiAvLyBNU1A0MzA6I2RlZmluZSBfX0xPTkdfTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKIC8vIE1TUDQzMDojZGVmaW5lIF9fTE9OR19NQVhfXyAyMTQ3NDgzNjQ3TAogLy8gTVNQNDMwLU5PVDojZGVmaW5lIF9fTFA2NF9fCkBAIC0xNTY5LDYgKzIwNzUsNyBAQAogLy8gTlZQVFgzMjojZGVmaW5lIF9fTERCTF9NSU5fMTBfRVhQX18gKC0zMDcpCiAvLyBOVlBUWDMyOiNkZWZpbmUgX19MREJMX01JTl9FWFBfXyAoLTEwMjEpCiAvLyBOVlBUWDMyOiNkZWZpbmUgX19MREJMX01JTl9fIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4TAorLy8gTlZQVFgzMjojZGVmaW5lIF9fTElUVExFX0VORElBTl9fIDEKIC8vIE5WUFRYMzI6I2RlZmluZSBfX0xPTkdfTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TEwKIC8vIE5WUFRYMzI6I2RlZmluZSBfX0xPTkdfTUFYX18gOTIyMzM3MjAzNjg1NDc3NTgwN0wKIC8vIE5WUFRYMzItTk9UOiNkZWZpbmUgX19MUDY0X18KQEAgLTE2NjYsNiArMjE3Myw3IEBACiAvLyBOVlBUWDY0OiNkZWZpbmUgX19MREJMX01JTl8xMF9FWFBfXyAoLTMwNykKIC8vIE5WUFRYNjQ6I2RlZmluZSBfX0xEQkxfTUlOX0VYUF9fICgtMTAyMSkKIC8vIE5WUFRYNjQ6I2RlZmluZSBfX0xEQkxfTUlOX18gMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDhMCisvLyBOVlBUWDY0OiNkZWZpbmUgX19MSVRUTEVfRU5ESUFOX18gMQogLy8gTlZQVFg2NDojZGVmaW5lIF9fTE9OR19MT05HX01BWF9fIDkyMjMzNzIwMzY4NTQ3NzU4MDdMTAogLy8gTlZQVFg2NDojZGVmaW5lIF9fTE9OR19NQVhfXyA5MjIzMzcyMDM2ODU0Nzc1ODA3TAogLy8gTlZQVFg2NDojZGVmaW5lIF9fTFA2NF9fIDEKQEAgLTE5MjksNiArMjQzNyw3IEBACiAvLyBQUEM2NExFOiNkZWZpbmUgX0FSQ0hfUFdSNiAxCiAvLyBQUEM2NExFOiNkZWZpbmUgX0FSQ0hfUFdSNlggMQogLy8gUFBDNjRMRTojZGVmaW5lIF9BUkNIX1BXUjcgMQorLy8gUFBDNjRMRTojZGVmaW5lIF9DQUxMX0VMRiAyCiAvLyBQUEM2NExFOiNkZWZpbmUgX0xJVFRMRV9FTkRJQU4gMQogLy8gUFBDNjRMRTojZGVmaW5lIF9MUDY0IDEKIC8vIFBQQzY0TEU6I2RlZmluZSBfX0JZVEVfT1JERVJfXyBfX09SREVSX0xJVFRMRV9FTkRJQU5fXwpAQCAtMjcwNiw2ICszMjE1LDcgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtRSAtZE0gLWZmcmVlc3RhbmRpbmcgLXRyaXBsZT1zcGFyYy1ub25lLW5vbmUgPCAvZGV2L251bGwgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBTUEFSQyAlcwogLy8KIC8vIFNQQVJDLU5PVDojZGVmaW5lIF9MUDY0CisvLyBTUEFSQzojZGVmaW5lIF9fQklHX0VORElBTl9fIDEKIC8vIFNQQVJDOiNkZWZpbmUgX19CWVRFX09SREVSX18gX19PUkRFUl9CSUdfRU5ESUFOX18KIC8vIFNQQVJDOiNkZWZpbmUgX19DSEFSMTZfVFlQRV9fIHVuc2lnbmVkIHNob3J0CiAvLyBTUEFSQzojZGVmaW5lIF9fQ0hBUjMyX1RZUEVfXyB1bnNpZ25lZCBpbnQKQEAgLTI4MDQsNiArMzMxNCw3IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLUUgLWRNIC1mZnJlZXN0YW5kaW5nIC10cmlwbGU9dGNlLW5vbmUtbm9uZSA8IC9kZXYvbnVsbCB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4IFRDRSAlcwogLy8KIC8vIFRDRS1OT1Q6I2RlZmluZSBfTFA2NAorLy8gVENFOiNkZWZpbmUgX19CSUdfRU5ESUFOX18gMQogLy8gVENFOiNkZWZpbmUgX19CWVRFX09SREVSX18gX19PUkRFUl9CSUdfRU5ESUFOX18KIC8vIFRDRTojZGVmaW5lIF9fQ0hBUjE2X1RZUEVfXyB1bnNpZ25lZCBzaG9ydAogLy8gVENFOiNkZWZpbmUgX19DSEFSMzJfVFlQRV9fIHVuc2lnbmVkIGludApAQCAtMzI1MSw0ICszNzYyLDYgQEAKIC8vIFBQQzY0LUZSRUVCU0QtTk9UOiAjZGVmaW5lIF9fTE9OR19ET1VCTEVfMTI4X18gMQogLy8KIC8vIFJVTjogJWNsYW5nX2NjMSAtRSAtZE0gLWZmcmVlc3RhbmRpbmcgLXRyaXBsZT14Y29yZS1ub25lLW5vbmUgPCAvZGV2L251bGwgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeCBYQ09SRSAlcworLy8gWENPUkU6I2RlZmluZSBfX0JZVEVfT1JERVJfXyBfX09SREVSX0xJVFRMRV9FTkRJQU5fXworLy8gWENPUkU6I2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fXyAxCiAvLyBYQ09SRTojZGVmaW5lIF9fWFMxQl9fIDEKZGlmZiAtLWdpdCBhL3Rlc3QvUHJlcHJvY2Vzc29yL21hY2hvLWVtYmVkZGVkLXByZWRlZmluZXMuYyBiL3Rlc3QvUHJlcHJvY2Vzc29yL21hY2hvLWVtYmVkZGVkLXByZWRlZmluZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzU2YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QcmVwcm9jZXNzb3IvbWFjaG8tZW1iZWRkZWQtcHJlZGVmaW5lcy5jCkBAIC0wLDAgKzEsNSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1FIC1kTSAtdHJpcGxlIHRodW1idjdtLWFwcGxlLXVua25vd24tbWFjaG8gJXMgfCBGaWxlQ2hlY2sgJXMKKworLy8gQ0hFQ0s6ICNkZWZpbmUgX19BUFBMRV9DQ19fCisvLyBDSEVDSzogI2RlZmluZSBfX0FQUExFX18KKy8vIENIRUNLLU5PVDogI2RlZmluZSBfX01BQ0hfXwpkaWZmIC0tZ2l0IGEvdGVzdC9QcmVwcm9jZXNzb3IvbWFjcm9fYXJnX2VtcHR5LmMgYi90ZXN0L1ByZXByb2Nlc3Nvci9tYWNyb19hcmdfZW1wdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWVjYWEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QcmVwcm9jZXNzb3IvbWFjcm9fYXJnX2VtcHR5LmMKQEAgLTAsMCArMSw3IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLUUgJXMgfCBGaWxlQ2hlY2sgLS1zdHJpY3Qtd2hpdGVzcGFjZSAlcworCisjZGVmaW5lIEZPTyh4KSB4CisjZGVmaW5lIEJBUih4KSB4IHgKKyNkZWZpbmUgQkFaKHgpIFt4XSBbIHhdIFt4IF0KK1tGT08oKV0gWyBGT08oKV0gW0ZPTygpIF0gW0JBUigpXSBbIEJBUigpXSBbQkFSKCkgXSBCQVooKQorLy8gQ0hFQ0s6IFtdIFsgXSBbIF0gWyBdIFsgXSBbIF0gW10gWyBdIFsgXQpkaWZmIC0tZ2l0IGEvdGVzdC9QcmVwcm9jZXNzb3IvbWFjcm9fZXhwYW5kX2VtcHR5LmMgYi90ZXN0L1ByZXByb2Nlc3Nvci9tYWNyb19leHBhbmRfZW1wdHkuYwppbmRleCAzZmI2Mzk0Li41NTA3NzI4IDEwMDY0NAotLS0gYS90ZXN0L1ByZXByb2Nlc3Nvci9tYWNyb19leHBhbmRfZW1wdHkuYworKysgYi90ZXN0L1ByZXByb2Nlc3Nvci9tYWNyb19leHBhbmRfZW1wdHkuYwpAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLUUgJXMgfCBGaWxlQ2hlY2sgLS1zdHJpY3Qtd2hpdGVzcGFjZSAlcworCiAvLyBDaGVjayB0aGF0IHRoaXMgZG9lc24ndCBjcmFzaAogCiAjZGVmaW5lIElERU5USVRZMSh4KSB4CkBAIC0xMiwzICsxMyw5IEBACiAjZGVmaW5lIElERU5USVRZOSh4KSBJREVOVElUWTgoeCkgSURFTlRJVFk4KHgpIElERU5USVRZOCh4KSBJREVOVElUWTgoeCkKICNkZWZpbmUgSURFTlRJVFkwKHgpIElERU5USVRZOSh4KSBJREVOVElUWTkoeCkgSURFTlRJVFk5KHgpIElERU5USVRZOSh4KQogSURFTlRJVFkwKCkKKworI2RlZmluZSBGT08oKSBCQVIoKSBzZWNvbmQKKyNkZWZpbmUgQkFSKCkKK2ZpcnN0IC8vIENIRUNLOiB7e159fWZpcnN0e3skfX0KK0ZPTygpIC8vIENIRUNLOiB7e159fSBzZWNvbmR7eyR9fQordGhpcmQgLy8gQ0hFQ0s6IHt7Xn19dGhpcmR7eyR9fQpkaWZmIC0tZ2l0IGEvdGVzdC9QcmVwcm9jZXNzb3IvbWFjcm9fcGFzdGVfY29tbWFleHQuYyBiL3Rlc3QvUHJlcHJvY2Vzc29yL21hY3JvX3Bhc3RlX2NvbW1hZXh0LmMKaW5kZXggN2NmZTQzZC4uZmRiOGY5OCAxMDA2NDQKLS0tIGEvdGVzdC9QcmVwcm9jZXNzb3IvbWFjcm9fcGFzdGVfY29tbWFleHQuYworKysgYi90ZXN0L1ByZXByb2Nlc3Nvci9tYWNyb19wYXN0ZV9jb21tYWV4dC5jCkBAIC0xLDggKzEsOCBAQAogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1FIHwgZ3JlcCAnVik7JwogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1FIHwgZ3JlcCAnVywgMSwgMik7JwogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1FIHwgZ3JlcCAnWCwgMSwgMik7JwotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1FIHwgZ3JlcCAnWSwgKTsnCi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLUUgfCBncmVwICdaLCApOycKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtRSB8IGdyZXAgJ1ksKTsnCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLUUgfCBncmVwICdaLCk7JwogCiAjZGVmaW5lIGRlYnVnKGZvcm1hdCwgLi4uKSBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQogZGVidWcoVik7CmRpZmYgLS1naXQgYS90ZXN0L1ByZXByb2Nlc3Nvci9tYWNyb19wYXN0ZV9zcGFjaW5nLmMgYi90ZXN0L1ByZXByb2Nlc3Nvci9tYWNyb19wYXN0ZV9zcGFjaW5nLmMKaW5kZXggNjQ5OGZmYy4uNDgxZDQ1NyAxMDA2NDQKLS0tIGEvdGVzdC9QcmVwcm9jZXNzb3IvbWFjcm9fcGFzdGVfc3BhY2luZy5jCisrKyBiL3Rlc3QvUHJlcHJvY2Vzc29yL21hY3JvX3Bhc3RlX3NwYWNpbmcuYwpAQCAtMSw3ICsxLDIxIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgJXMgLUUgfCBncmVwICJeeHkkIgorLy8gUlVOOiAlY2xhbmdfY2MxIC1FICVzIHwgRmlsZUNoZWNrIC0tc3RyaWN0LXdoaXRlc3BhY2UgJXMKIAogI2RlZmluZSBBICB4ICMjIHkKIGJsYWgKIAogQQorLy8gQ0hFQ0s6IHt7Xn19eHl7eyR9fQogCisjZGVmaW5lIEIoeCwgeSkgW3YgIyMgd10gWyB2IyN3XSBbdiMjdyBdIFt3ICMjIHhdIFsgdyMjeF0gW3cjI3ggXSBbeCAjIyB5XSBbIHgjI3ldIFt4IyN5IF0gW3kgIyMgel0gWyB5IyN6XSBbeSMjeiBdCitCKHgseSkKKy8vIENIRUNLOiBbdnddIFsgdnddIFt2dyBdIFt3eF0gWyB3eF0gW3d4IF0gW3h5XSBbIHh5XSBbeHkgXSBbeXpdIFsgeXpdIFt5eiBdCitCKHgsKQorLy8gQ0hFQ0s6IFt2d10gWyB2d10gW3Z3IF0gW3d4XSBbIHd4XSBbd3ggXSBbeF0gWyB4XSBbeCBdIFt6XSBbIHpdIFt6IF0KK0IoLHkpCisvLyBDSEVDSzogW3Z3XSBbIHZ3XSBbdncgXSBbd10gWyB3XSBbdyBdIFt5XSBbIHldIFt5IF0gW3l6XSBbIHl6XSBbeXogXQorQigsKQorLy8gQ0hFQ0s6IFt2d10gWyB2d10gW3Z3IF0gW3ddIFsgd10gW3cgXSBbXSBbIF0gWyBdIFt6XSBbIHpdIFt6IF0KKworI2RlZmluZSBDKHgsIHksIHopIFt4ICMjIHkgIyMgel0KK0MoLCwpIEMoYSwsKSBDKCxiLCkgQygsLGMpIEMoYSxiLCkgQyhhLCxjKSBDKCxiLGMpIEMoYSxiLGMpCisvLyBDSEVDSzogW10gW2FdIFtiXSBbY10gW2FiXSBbYWNdIFtiY10gW2FiY10KZGlmZiAtLWdpdCBhL3Rlc3QvUHJlcHJvY2Vzc29yL21hY3JvX3NwYWNlLmMgYi90ZXN0L1ByZXByb2Nlc3Nvci9tYWNyb19zcGFjZS5jCmluZGV4IDhhNDdhM2IuLjEzZTUzMWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvUHJlcHJvY2Vzc29yL21hY3JvX3NwYWNlLmMKKysrIGIvdGVzdC9QcmVwcm9jZXNzb3IvbWFjcm9fc3BhY2UuYwpAQCAtMSw2ICsxLDM2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLUUgJXMgfCBGaWxlQ2hlY2sgLS1zdHJpY3Qtd2hpdGVzcGFjZSAlcwogCi0jZGVmaW5lIFhYCi0hIFhYLAorI2RlZmluZSBGT08xKCkKKyNkZWZpbmUgRk9PMih4KXgKKyNkZWZpbmUgRk9PMyh4KSB4CisjZGVmaW5lIEZPTzQoeCl4IHgKKyNkZWZpbmUgRk9PNSh4KSB4IHgKKyNkZWZpbmUgRk9PNih4KSBbeF0KKyNkZWZpbmUgRk9PNyh4KSBbIHhdCisjZGVmaW5lIEZPTzgoeCkgW3ggXQogCi0vLyBDSEVDSzoge3tefX0hICx7eyR9fQorI2RlZmluZSBURVNUKEZPTyx4KSBGT08gPEZPTygpPiA8IEZPTygpPiA8Rk9PICgpPiA8Rk9PKCApPiA8Rk9PKCkgPiA8Rk9PKCl4PiA8Rk9PKCkgeD4gPCBGT08oKXg+CisKK1RFU1QoRk9PMSwpCisvLyBDSEVDSzogRk9PMSA8PiA8ID4gPD4gPD4gPCA+IDw+IDwgPiA8ID4KKworVEVTVChGT08yLCkKKy8vIENIRUNLOiBGT08yIDw+IDwgPiA8PiA8PiA8ID4gPD4gPCA+IDwgPgorCitURVNUKEZPTzMsKQorLy8gQ0hFQ0s6IEZPTzMgPD4gPCA+IDw+IDw+IDwgPiA8PiA8ID4gPCA+CisKK1RFU1QoRk9PNCwpCisvLyBDSEVDSzogRk9PNCA8ID4gPCA+IDwgPiA8ID4gPCA+IDwgPiA8ID4gPCA+CisKK1RFU1QoRk9PNSwpCisvLyBDSEVDSzogRk9PNSA8ID4gPCA+IDwgPiA8ID4gPCA+IDwgPiA8ID4gPCA+CisKK1RFU1QoRk9PNiwpCisvLyBDSEVDSzogRk9PNiA8W10+IDwgW10+IDxbXT4gPFtdPiA8W10gPiA8W10+IDxbXSA+IDwgW10+CisKK1RFU1QoRk9PNywpCisvLyBDSEVDSzogRk9PNyA8WyBdPiA8IFsgXT4gPFsgXT4gPFsgXT4gPFsgXSA+IDxbIF0+IDxbIF0gPiA8IFsgXT4KKworVEVTVChGT084LCkKKy8vIENIRUNLOiBGT084IDxbIF0+IDwgWyBdPiA8WyBdPiA8WyBdPiA8WyBdID4gPFsgXT4gPFsgXSA+IDwgWyBdPgpkaWZmIC0tZ2l0IGEvdGVzdC9QcmVwcm9jZXNzb3IvbWljcm9zb2Z0LWhlYWRlci1zZWFyY2guYyBiL3Rlc3QvUHJlcHJvY2Vzc29yL21pY3Jvc29mdC1oZWFkZXItc2VhcmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkYzU0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUHJlcHJvY2Vzc29yL21pY3Jvc29mdC1oZWFkZXItc2VhcmNoLmMKQEAgLTAsMCArMSw4IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLUklUy9JbnB1dHMvbWljcm9zb2Z0LWhlYWRlci1zZWFyY2ggJXMgLWZtcy1jb21wYXRpYmlsaXR5IC12ZXJpZnkKKworLy8gZXhwZWN0ZWQtd2FybmluZ0BJbnB1dHMvbWljcm9zb2Z0LWhlYWRlci1zZWFyY2gvYS9maW5kbWUuaDozIHt7ZmluZG1lLmggc3VjY2Vzc2Z1bGx5IGluY2x1ZGVkIHVzaW5nIE1TIHNlYXJjaCBydWxlc319CisvLyBleHBlY3RlZC13YXJuaW5nQElucHV0cy9taWNyb3NvZnQtaGVhZGVyLXNlYXJjaC9hL2IvaW5jbHVkZTMuaDozIHt7I2luY2x1ZGUgcmVzb2x2ZWQgdXNpbmcgbm9uLXBvcnRhYmxlIE1TVkMgc2VhcmNoIHJ1bGVzIGFzfX0KKworLy8gZXhwZWN0ZWQtd2FybmluZ0BJbnB1dHMvbWljcm9zb2Z0LWhlYWRlci1zZWFyY2gvZmFsc2Vwb3MuaDozIHt7c3VjY2Vzc2Z1bGx5IHJlc29sdmVkIHRoZSBmYWxzZXBvcy5oIGhlYWRlcn19CisKKyNpbmNsdWRlICJJbnB1dHMvbWljcm9zb2Z0LWhlYWRlci1zZWFyY2gvaW5jbHVkZTEuaCIKZGlmZiAtLWdpdCBhL3Rlc3QvUHJlcHJvY2Vzc29yL3ByaW50LXByYWdtYS1taWNyb3NvZnQuYyBiL3Rlc3QvUHJlcHJvY2Vzc29yL3ByaW50LXByYWdtYS1taWNyb3NvZnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRmYjRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9QcmVwcm9jZXNzb3IvcHJpbnQtcHJhZ21hLW1pY3Jvc29mdC5jCkBAIC0wLDAgKzEsMjAgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZnN5bnRheC1vbmx5IC1mbXMtZXh0ZW5zaW9ucyAtRSAtbyAtIHwgRmlsZUNoZWNrICVzCisKKyNkZWZpbmUgQkFSICIyIgorI3ByYWdtYSBjb21tZW50KGxpbmtlciwgImJhcj0iIEJBUikKKy8vIENIRUNLOiAjcHJhZ21hIGNvbW1lbnQobGlua2VyLCAiYmFyPSIgIjIiKQorI3ByYWdtYSBjb21tZW50KHVzZXIsICJDb21waWxlZCBvbiAiIF9fREFURV9fICIgYXQgIiBfX1RJTUVfXykKKy8vIENIRUNLOiAjcHJhZ21hIGNvbW1lbnQodXNlciwgIkNvbXBpbGVkIG9uICIgInt7W14iXSp9fSIgIiBhdCAiICJ7e1teIl0qfX0iKQorCisjZGVmaW5lIEtFWTEgIktFWTEiCisjZGVmaW5lIEtFWTIgIktFWTIiCisjZGVmaW5lIFZBTDEgIlZBTDFcIiIKKyNkZWZpbmUgVkFMMiAiVkFMMiIKKworI3ByYWdtYSBkZXRlY3RfbWlzbWF0Y2goS0VZMSBLRVkyLCBWQUwxIFZBTDIpCisvLyBDSEVDSzogI3ByYWdtYSBkZXRlY3RfbWlzbWF0Y2goIktFWTEiICJLRVkyIiwgIlZBTDFcIiIgIlZBTDIiKQorCisjZGVmaW5lIF9DUlRfUEFDS0lORyA4CisjcHJhZ21hIHBhY2socHVzaCwgX0NSVF9QQUNLSU5HKQorLy8gQ0hFQ0s6ICNwcmFnbWEgcGFjayhwdXNoLCA4KQorI3ByYWdtYSBwYWNrKHBvcCkKZGlmZiAtLWdpdCBhL3Rlc3QvUHJlcHJvY2Vzc29yL3Vjbi1hbGxvd2VkLWNoYXJzLmMgYi90ZXN0L1ByZXByb2Nlc3Nvci91Y24tYWxsb3dlZC1jaGFycy5jCmluZGV4IGQ0OWFhOWMuLmQ3ZDY3ZmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvUHJlcHJvY2Vzc29yL3Vjbi1hbGxvd2VkLWNoYXJzLmMKKysrIGIvdGVzdC9QcmVwcm9jZXNzb3IvdWNuLWFsbG93ZWQtY2hhcnMuYwpAQCAtMTcsNyArMTcsNyBAQAogLy8gSWRlbnRpZmllciBpbml0aWFsIGNoYXJhY3RlcnMKIGV4dGVybiBjaGFyIFx1MEU1MDsgLy8gQysrMDMsIEMxMSwgQysrMTEKIGV4dGVybiBjaGFyIFx1MDMwMDsgLy8gZGlzYWxsb3dlZCBpbml0aWFsbHkgaW4gQzExL0MrKzExLCBhbHdheXMgaW4gQzk5L0MrKzAzCi0KK2V4dGVybiBjaGFyIFx1MEQ2MTsgLy8gQzk5LCBDMTEsIEMrKzAzLCBDKysxMQogCiAKIApkaWZmIC0tZ2l0IGEvdGVzdC9QcmVwcm9jZXNzb3IveDg2X3RhcmdldF9mZWF0dXJlcy5jIGIvdGVzdC9QcmVwcm9jZXNzb3IveDg2X3RhcmdldF9mZWF0dXJlcy5jCmluZGV4IDc1MWM4YWUuLjdiYzVjZDggMTAwNjQ0Ci0tLSBhL3Rlc3QvUHJlcHJvY2Vzc29yL3g4Nl90YXJnZXRfZmVhdHVyZXMuYworKysgYi90ZXN0L1ByZXByb2Nlc3Nvci94ODZfdGFyZ2V0X2ZlYXR1cmVzLmMKQEAgLTE5MywxNiArMTkzLDE2IEBACiAvLyBTSEE6ICNkZWZpbmUgX19TU0UyX18gMQogLy8gU0hBLU5PVDogI2RlZmluZSBfX1NTRTNfXyAxCiAKLS8vIHJ1bjogJWNsYW5nIC10YXJnZXQgaTM4Ni11bmtub3duLXVua25vd24gLW1hcmNoPXBlbnRpdW1wcm8gLW1zaGEgLW1uby1zaGEgLXggYyAtZSAtZG0gLW8gLSAlcyB8IGZpbGVjaGVjayAtLWNoZWNrLXByZWZpeD1TSEFOT1NIQSAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCBpMzg2LXVua25vd24tdW5rbm93biAtbWFyY2g9cGVudGl1bXBybyAtbXNoYSAtbW5vLXNoYSAteCBjIC1FIC1kTSAtbyAtICVzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVNIQU5PU0hBICVzCiAKIC8vIFNIQU5PU0hBLU5PVDogI2RlZmluZSBfX1NIQV9fIDEKIC8vIFNIQU5PU0hBLU5PVDogI2RlZmluZSBfX1NTRTJfXyAxCiAKLS8vIHJ1bjogJWNsYW5nIC10YXJnZXQgaTM4Ni11bmtub3duLXVua25vd24gLW1hcmNoPXBlbnRpdW1wcm8gLW1zaGEgLW1uby1zc2UyIC14IGMgLWUgLWRtIC1vIC0gJXMgfCBmaWxlY2hlY2sgLS1jaGVjay1wcmVmaXg9U0hBTk9TU0UyICVzCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGkzODYtdW5rbm93bi11bmtub3duIC1tYXJjaD1wZW50aXVtcHJvIC1tc2hhIC1tbm8tc3NlMiAteCBjIC1FIC1kTSAtbyAtICVzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVNIQU5PU1NFMiAlcwogCi0vLyBTSEFOT1NTU0UyLU5PVDogI2RlZmluZSBfX1NIQV9fIDEKLS8vIFNIQU5PU1NTRTItTk9UOiAjZGVmaW5lIF9fU1NFMl9fIDEKLS8vIFNIQU5PU1NTRTItTk9UOiAjZGVmaW5lIF9fU1NFM19fIDEKKy8vIFNIQU5PU1NFMi1OT1Q6ICNkZWZpbmUgX19TSEFfXyAxCisvLyBTSEFOT1NTRTItTk9UOiAjZGVmaW5lIF9fU1NFMl9fIDEKKy8vIFNIQU5PU1NFMi1OT1Q6ICNkZWZpbmUgX19TU0UzX18gMQogCiAvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGkzODYtdW5rbm93bi11bmtub3duIC1tYXJjaD1hdG9tIC1tdGJtIC14IGMgLUUgLWRNIC1vIC0gJXMgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9VEJNICVzCiAKZGlmZiAtLWdpdCBhL3Rlc3QvUHJvZmlsZS9JbnB1dHMvYy1hdHRyaWJ1dGVzLnByb2ZkYXRhIGIvdGVzdC9Qcm9maWxlL0lucHV0cy9jLWF0dHJpYnV0ZXMucHJvZmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlNjgyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUHJvZmlsZS9JbnB1dHMvYy1hdHRyaWJ1dGVzLnByb2ZkYXRhCkBAIC0wLDAgKzEsMzQgQEAKK2hvdF8xMDBfcGVyY2VudAorMgorMgorMTAwMDAwCis0OTk5OTUwMDAwCisKK2hvdF80MF9wZXJjZW50CisyCisyCis0MDAwMAorNzk5OTgwMDAwCisKK25vcm1hbF9mdW5jCisyCisyCisyMDAwMAorMTk5OTkwMDAwCisKK2NvbGRfZnVuYworMgorMgorNTAwCisxMjQ3NTAKKworbWFpbgorNgorNgorMQorMAorMTAwMDAwCis0MDAwMAorMjAwMDAKKzUwMAorCmRpZmYgLS1naXQgYS90ZXN0L1Byb2ZpbGUvSW5wdXRzL2MtY291bnRlci1vdmVyZmxvd3MucHJvZmRhdGEgYi90ZXN0L1Byb2ZpbGUvSW5wdXRzL2MtY291bnRlci1vdmVyZmxvd3MucHJvZmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4NjM3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUHJvZmlsZS9JbnB1dHMvYy1jb3VudGVyLW92ZXJmbG93cy5wcm9mZGF0YQpAQCAtMCwwICsxLDEyIEBACittYWluCis4Cis4CisxCis2ODcxOTQ3NjcyMAorNjQ0MjQ1MDk0MjUKKzY4NzE5NDc2NzIwCisyMTQ3NDgzNjQ3NQorMjE0NzQ4MzY0NzUKKzIxNDc0ODM2NDc1Cis0Mjk0OTY3Mjk1CisKZGlmZiAtLWdpdCBhL3Rlc3QvUHJvZmlsZS9JbnB1dHMvYy1nZW5lcmFsLnByb2ZkYXRhIGIvdGVzdC9Qcm9maWxlL0lucHV0cy9jLWdlbmVyYWwucHJvZmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkNTYxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUHJvZmlsZS9JbnB1dHMvYy1nZW5lcmFsLnByb2ZkYXRhCkBAIC0wLDAgKzEsMTUwIEBACitzaW1wbGVfbG9vcHMKKzQKKzQKKzEKKzEwMAorMTAwCis3NQorCitjb25kaXRpb25hbHMKKzExCisxMQorMQorMTAwCis1MAorNTAKKzMzCiszMworMTYKKzk5CisxMDAKKzk5CisxMDAKKworZWFybHlfZXhpdHMKKzkKKzkKKzEKKzAKKzUxCisxCisyNQorMQorMjUKKzEKKzAKKworanVtcHMKKzIyCisyMgorMQorMQorMAorMQorMAorMAorMQorMAorMQorMgorMworMgorMAorMworMAorMQorMQorMQorMTAKKzAKKzEwCis5CisKK3N3aXRjaGVzCisxOQorMTkKKzEKKzEKKzEKKzE1Cis3CisxCiswCisyCisyCiszCiszCis0Cis0CiswCis0Cis0Cis1CisxCiswCisKK2JpZ19zd2l0Y2gKKzE3CisxNworMQorMzIKKzMyCisxCiswCisxCisxCisxMQorMTEKKzEKKzEKKzE1CisxNQorMQorMQorMgorMgorCitib29sZWFuX29wZXJhdG9ycworOAorOAorMQorMTAwCiszNAorNjYKKzE3CiszNAorMzMKKzUwCisKK2Jvb2xvcF9sb29wcworOQorOQorMQorNTAKKzUxCis1MAorMjYKKzUwCis1MQorNTAKKzI2CisKK2RvX2ZhbGx0aHJvdWdoCis0Cis0CisxCisxMAorMgorOAorCittYWluCisxCisxCisxCisKK2MtZ2VuZXJhbC5jOnN0YXRpY19mdW5jCisyCisyCisxCisxMAorCmRpZmYgLS1naXQgYS90ZXN0L1Byb2ZpbGUvSW5wdXRzL2Mtb3V0ZGF0ZWQtZGF0YS5wcm9mZGF0YSBiL3Rlc3QvUHJvZmlsZS9JbnB1dHMvYy1vdXRkYXRlZC1kYXRhLnByb2ZkYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MDE1YmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1Byb2ZpbGUvSW5wdXRzL2Mtb3V0ZGF0ZWQtZGF0YS5wcm9mZGF0YQpAQCAtMCwwICsxLDEyIEBACitub191c2FibGVfZGF0YQorMworMworMQorMAorMAorCittYWluCisxCisxCisxCisKZGlmZiAtLWdpdCBhL3Rlc3QvUHJvZmlsZS9JbnB1dHMvY3h4LWNsYXNzLnByb2ZkYXRhIGIvdGVzdC9Qcm9maWxlL0lucHV0cy9jeHgtY2xhc3MucHJvZmRhdGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2NjQwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUHJvZmlsZS9JbnB1dHMvY3h4LWNsYXNzLnByb2ZkYXRhCkBAIC0wLDAgKzEsNDEgQEAKK19aMTRzaW1wbGVfd3JhcHBlcnYKKzIKKzIKKzEKKzEwMAorCittYWluCisxCisxCisxCisKK19aTjZTaW1wbGVEMUV2CisyCisyCiswCiswCisKK19aTjZTaW1wbGVEMkV2CisyCisyCisxMDAKKzk5CisKK19aTjZTaW1wbGU2bWV0aG9kRXYKKzIKKzIKKzEwMAorOTkKKworX1pONlNpbXBsZUMxRWkKKzIKKzIKKzAKKzAKKworX1pONlNpbXBsZUMyRWkKKzIKKzIKKzEwMAorOTkKKwpkaWZmIC0tZ2l0IGEvdGVzdC9Qcm9maWxlL0lucHV0cy9jeHgtdGhyb3dzLnByb2ZkYXRhIGIvdGVzdC9Qcm9maWxlL0lucHV0cy9jeHgtdGhyb3dzLnByb2ZkYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTZjM2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1Byb2ZpbGUvSW5wdXRzL2N4eC10aHJvd3MucHJvZmRhdGEKQEAgLTAsMCArMSwxOCBAQAorX1o2dGhyb3dzdgorOQorOQorMQorMTAwCisxMDAKKzY2CiszMworMTcKKzUwCiszMworMTAwCisKK21haW4KKzEKKzEKKzEKKwpkaWZmIC0tZ2l0IGEvdGVzdC9Qcm9maWxlL0lucHV0cy9vYmpjLWdlbmVyYWwucHJvZmRhdGEgYi90ZXN0L1Byb2ZpbGUvSW5wdXRzL29iamMtZ2VuZXJhbC5wcm9mZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODQxZTkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Qcm9maWxlL0lucHV0cy9vYmpjLWdlbmVyYWwucHJvZmRhdGEKQEAgLTAsMCArMSwxNyBAQAorb2JqYy1nZW5lcmFsLm06X18xMytbQSBmb3JlYWNoOl1fYmxvY2tfaW52b2tlCisyCisyCisyCisxCisKK29iamMtZ2VuZXJhbC5tOitbQSBmb3JlYWNoOl0KKzIKKzIKKzEKKzIKKworbWFpbgorMQorMQorMQorCmRpZmYgLS1naXQgYS90ZXN0L1Byb2ZpbGUvUkVBRE1FIGIvdGVzdC9Qcm9maWxlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjY2NzY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Qcm9maWxlL1JFQURNRQpAQCAtMCwwICsxLDE2IEBACitUaGVzZSBhcmUgdGVzdHMgZm9yIGluc3RydW1lbnRhdGlvbiBiYXNlZCBwcm9maWxpbmcuICBUaGlzIHNwZWNpZmljYWxseSBtZWFucwordGhlIC1mcHJvZmlsZS1pbnN0ci1nZW5lcmF0ZSBhbmQgLWZwcm9maWxlLWluc3RyLXVzZSBkcml2ZXIgZmxhZ3MuCisKK1Rlc3RzIGluIHRoaXMgZGlyZWN0b3J5IHNob3VsZCB1c3VhbGx5IHRlc3QgYm90aDoKKworICAtIHRoZSBnZW5lcmF0aW9uIG9mIGluc3RydW1lbnRhdGlvbiAoLWZwcm9maWxlLWluc3RyLWdlbmVyYXRlKSwgYW5kCisgIC0gdGhlIHVzZSBvZiBwcm9maWxlIGRhdGEgZnJvbSBpbnN0cnVtZW50ZWQgcnVucyAoLWZwcm9maWxlLWluc3RyLXVzZSkuCisKK0luIG9yZGVyIHRvIHRlc3QgLWZwcm9maWxlLWluc3RyLXVzZSB3aXRob3V0IGFjdHVhbGx5IHJ1bm5pbmcgYW4gaW5zdHJ1bWVudGVkCitwcm9ncmFtLCAucHJvZmRhdGEgZmlsZXMgYXJlIGNoZWNrZWQgaW50byBJbnB1dHMvLgorCitUaGUgaW5wdXQgc291cmNlIGZpbGVzIG11c3QgaW5jbHVkZSBhIG1haW4gZnVuY3Rpb24gc3VjaCB0aGF0IGJ1aWxkaW5nIHdpdGgKKy1mcHJvZmlsZS1pbnN0ci1nZW5lcmF0ZSBhbmQgcnVubmluZyB0aGUgcmVzdWx0aW5nIHByb2dyYW0gZ2VuZXJhdGVzIHRoZSBzYW1lCisucHJvZmRhdGEgZmlsZSB0aGF0IGlzIGNvbnN1bWVkIGJ5IHRoZSB0ZXN0cyBmb3IgLWZwcm9maWxlLWluc3RyLXVzZS4gIEV2ZW4KK3Rlc3RzIHRoYXQgb25seSBjaGVjayAtZnByb2ZpbGUtaW5zdHItdXNlIHNob3VsZCBpbmNsdWRlIHN1Y2ggYSBtYWluIGZ1bmN0aW9uLAorc28gdGhhdCBwcm9maWxlIGRhdGEgY2FuIGJlIHJlZ2VuZXJhdGVkIGFzIHRoZSAucHJvZmRhdGEgZmlsZSBmb3JtYXQgZXZvbHZlcy4KZGlmZiAtLWdpdCBhL3Rlc3QvUHJvZmlsZS9jLWF0dHJpYnV0ZXMuYyBiL3Rlc3QvUHJvZmlsZS9jLWF0dHJpYnV0ZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTgwOTU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Qcm9maWxlL2MtYXR0cmlidXRlcy5jCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFRlc3QgdGhhdCBpbnN0cnVtZW50YXRpb24gYmFzZWQgcHJvZmlsaW5nIHNldHMgZnVuY3Rpb24gYXR0cmlidXRlcyBjb3JyZWN0bHkuCisKKy8vIFJVTjogJWNsYW5nICVzIC1vIC0gLW1sbHZtIC1kaXNhYmxlLWxsdm0tb3B0em5zIC1lbWl0LWxsdm0gLVMgLWZwcm9maWxlLWluc3RyLXVzZT0lUy9JbnB1dHMvYy1hdHRyaWJ1dGVzLnByb2ZkYXRhIHwgRmlsZUNoZWNrICVzCisKK2V4dGVybiBpbnQgYXRvaShjb25zdCBjaGFyICopOworCisvLyBDSEVDSzogaG90XzEwMF9wZXJjZW50KGkzMnt7Lip9fSVpKSBbW0hPVDojWzAtOV0rXV0KK3ZvaWQgaG90XzEwMF9wZXJjZW50KGludCBpKSB7CisgIHdoaWxlIChpID4gMCkKKyAgICBpLS07Cit9CisKKy8vIENIRUNLOiBob3RfNDBfcGVyY2VudChpMzJ7ey4qfX0laSkgW1tIT1RdXQordm9pZCBob3RfNDBfcGVyY2VudChpbnQgaSkgeworICB3aGlsZSAoaSA+IDApCisgICAgaS0tOworfQorCisvLyBDSEVDSzogbm9ybWFsX2Z1bmMoaTMye3suKn19JWkpIFtbTk9STUFMOiNbMC05XStdXQordm9pZCBub3JtYWxfZnVuYyhpbnQgaSkgeworICB3aGlsZSAoaSA+IDApCisgICAgaS0tOworfQorCisvLyBDSEVDSzogY29sZF9mdW5jKGkzMnt7Lip9fSVpKSBbW0NPTEQ6I1swLTldK11dCit2b2lkIGNvbGRfZnVuYyhpbnQgaSkgeworICB3aGlsZSAoaSA+IDApCisgICAgaS0tOworfQorCisvLyBDSEVDSzogYXR0cmlidXRlcyBbW0hPVF1dID0geyBpbmxpbmVoaW50IG5vdW53aW5kIHt7Lip9fSB9CisvLyBDSEVDSzogYXR0cmlidXRlcyBbW05PUk1BTF1dID0geyBub3Vud2luZCB7ey4qfX0gfQorLy8gQ0hFQ0s6IGF0dHJpYnV0ZXMgW1tDT0xEXV0gPSB7IGNvbGQgbm91bndpbmQge3suKn19IH0KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBpbnQgbWF4ID0gYXRvaShhcmd2WzFdKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykKKyAgICBob3RfMTAwX3BlcmNlbnQoaSk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXggKiA0IC8gMTA7IGkrKykKKyAgICBob3RfNDBfcGVyY2VudChpKTsKKyAgZm9yIChpID0gMDsgaSA8IG1heCAqIDIgLyAxMDsgaSsrKQorICAgIG5vcm1hbF9mdW5jKGkpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4IC8gMjAwOyBpKyspCisgICAgY29sZF9mdW5jKGkpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvUHJvZmlsZS9jLWNvdW50ZXItb3ZlcmZsb3dzLmMgYi90ZXN0L1Byb2ZpbGUvYy1jb3VudGVyLW92ZXJmbG93cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmU5YmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1Byb2ZpbGUvYy1jb3VudGVyLW92ZXJmbG93cy5jCkBAIC0wLDAgKzEsNDggQEAKKy8vIFRlc3QgdGhhdCBiaWcgYnJhbmNoIHdlaWdodHMgZ2V0IHNjYWxlZCBkb3duIHRvIDMyLWJpdHMsIHJhdGhlciB0aGFuIGp1c3QKKy8vIHRydW5jYXRlZC4KKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLW1hY29zeDEwLjkgLW1haW4tZmlsZS1uYW1lIGMtY291bnRlci1vdmVyZmxvd3MuYyAlcyAtbyAtIC1lbWl0LWxsdm0gLWZwcm9maWxlLWluc3RyLXVzZT0lUy9JbnB1dHMvYy1jb3VudGVyLW92ZXJmbG93cy5wcm9mZGF0YSB8IEZpbGVDaGVjayAlcworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjRfdDsKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICAvLyBOZWVkIGNvdW50cyBoaWdoZXIgdGhhbiAzMi1iaXRzLgorICAvLyBDSEVDSzogYnIge3suKn19ICFwcm9mICFbW0ZPUjpbMC05XStdXQorICAvLyBtYXggICA9IDB4ZmZmZmZmZmYwCisgIC8vIHNjYWxlID0gMHhmZmZmZmZmZjAgLyAweGZmZmZmZmZmICsgMSA9IDE3CisgIC8vIGxvb3AtYm9keTogMHhmZmZmZmZmZjAgLyAxNyArIDEgPSAweGYwZjBmMGYwICsgMSA9IDQwNDIzMjIxNjEgPT4gLTI1MjY0NTEzNQorICAvLyBsb29wLWV4aXQ6IDB4MDAwMDAwMDAxIC8gMTcgKyAxID0gMHgwMDAwMDAwMCArIDEgPSAgICAgICAgICAxID0+ICAgICAgICAgIDEKKyAgZm9yICh1aW50NjRfdCBJID0gMDsgSSA8IDB4ZmZmZmZmZmYwOyArK0kpIHsKKyAgICAvLyBtYXggICA9IDB4ZmZmZmZmZmYgKiAxNSA9IDB4ZWZmZmZmZmYxCisgICAgLy8gc2NhbGUgPSAweGVmZmZmZmZmMSAvIDB4ZmZmZmZmZmYgKyAxID0gMTYKKyAgICAvLyBDSEVDSzogYnIge3suKn19ICFwcm9mICFbW0lGOlswLTldK11dCisgICAgaWYgKEkgJiAweGYpIHsKKyAgICAgIC8vIDB4ZWZmZmZmZmYxIC8gMTYgKyAxID0gMHhlZmZmZmZmZiArIDEgPSA0MDI2NTMxODQwID0+IC0yNjg0MzU0NTYKKyAgICB9IGVsc2UgeworICAgICAgLy8gMHgwZmZmZmZmZmYgLyAxNiArIDEgPSAweDBmZmZmZmZmICsgMSA9ICAyNjg0MzU0NTYgPT4gIDI2ODQzNTQ1NgorICAgIH0KKworICAgIC8vIG1heCAgID0gMHhmZmZmZmZmZiAqIDUgPSAweDRmZmZmZmZmYgorICAgIC8vIHNjYWxlID0gMHg0ZmZmZmZmZmIgLyAweGZmZmZmZmZmICsgMSA9IDYKKyAgICAvLyBDSEVDSzogXSwgIXByb2YgIVtbU1dJVENIOlswLTldK11dCisgICAgc3dpdGNoICgoSSAmIDB4ZikgLyA1KSB7CisgICAgY2FzZSAwOgorICAgICAgLy8gMHg0ZmZmZmZmZmIgLyA2ID0gMHhkNTU1NTU1NCArIDEgPSAzNTc5MTM5NDEzID0+IC03MTU4Mjc4ODMKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIC8vIDB4NGZmZmZmZmZiIC8gNiA9IDB4ZDU1NTU1NTQgKyAxID0gMzU3OTEzOTQxMyA9PiAtNzE1ODI3ODgzCisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAvLyAweDRmZmZmZmZmYiAvIDYgPSAweGQ1NTU1NTU0ICsgMSA9IDM1NzkxMzk0MTMgPT4gLTcxNTgyNzg4MworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8vIDB4MGZmZmZmZmZmIC8gNiA9IDB4MmFhYWFhYWEgKyAxID0gIDcxNTgyNzg4MyA9PiAgNzE1ODI3ODgzCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIENIRUNLLURBRzogIVtbRk9SXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgLTI1MjY0NTEzNSwgaTMyIDF9CisvLyBDSEVDSy1EQUc6ICFbW0lGXV0gID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIC0yNjg0MzU0NTYsIGkzMiAyNjg0MzU0NTZ9CisvLyBDSEVDSy1EQUc6ICFbW1NXSVRDSF1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDcxNTgyNzg4MywgaTMyIC03MTU4Mjc4ODMsIGkzMiAtNzE1ODI3ODgzLCBpMzIgLTcxNTgyNzg4M30KZGlmZiAtLWdpdCBhL3Rlc3QvUHJvZmlsZS9jLWdlbmVyYWwuYyBiL3Rlc3QvUHJvZmlsZS9jLWdlbmVyYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDc1ZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Qcm9maWxlL2MtZ2VuZXJhbC5jCkBAIC0wLDAgKzEsNTIwIEBACisvLyBUZXN0IGluc3RydW1lbnRhdGlvbiBvZiBnZW5lcmFsIGNvbnN0cnVjdHMgaW4gQy4KKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLW1hY29zeDEwLjkgLW1haW4tZmlsZS1uYW1lIGMtZ2VuZXJhbC5jICVzIC1vIC0gLWVtaXQtbGx2bSAtZnByb2ZpbGUtaW5zdHItZ2VuZXJhdGUgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1QR09HRU4gJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1tYWNvc3gxMC45IC1tYWluLWZpbGUtbmFtZSBjLWdlbmVyYWwuYyAlcyAtbyAtIC1lbWl0LWxsdm0gLWZwcm9maWxlLWluc3RyLXVzZT0lUy9JbnB1dHMvYy1nZW5lcmFsLnByb2ZkYXRhIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9UEdPVVNFICVzCisKKy8vIFBHT0dFTjogQFtbU0xDOl9fbGx2bV9wcm9maWxlX2NvdW50ZXJzX3NpbXBsZV9sb29wc11dID0gZ2xvYmFsIFs0IHggaTY0XSB6ZXJvaW5pdGlhbGl6ZXIKKy8vIFBHT0dFTjogQFtbSUZDOl9fbGx2bV9wcm9maWxlX2NvdW50ZXJzX2NvbmRpdGlvbmFsc11dID0gZ2xvYmFsIFsxMSB4IGk2NF0gemVyb2luaXRpYWxpemVyCisvLyBQR09HRU46IEBbW0VFQzpfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19lYXJseV9leGl0c11dID0gZ2xvYmFsIFs5IHggaTY0XSB6ZXJvaW5pdGlhbGl6ZXIKKy8vIFBHT0dFTjogQFtbSk1DOl9fbGx2bV9wcm9maWxlX2NvdW50ZXJzX2p1bXBzXV0gPSBnbG9iYWwgWzIyIHggaTY0XSB6ZXJvaW5pdGlhbGl6ZXIKKy8vIFBHT0dFTjogQFtbU1dDOl9fbGx2bV9wcm9maWxlX2NvdW50ZXJzX3N3aXRjaGVzXV0gPSBnbG9iYWwgWzE5IHggaTY0XSB6ZXJvaW5pdGlhbGl6ZXIKKy8vIFBHT0dFTjogQFtbQlNDOl9fbGx2bV9wcm9maWxlX2NvdW50ZXJzX2JpZ19zd2l0Y2hdXSA9IGdsb2JhbCBbMTcgeCBpNjRdIHplcm9pbml0aWFsaXplcgorLy8gUEdPR0VOOiBAW1tCT0M6X19sbHZtX3Byb2ZpbGVfY291bnRlcnNfYm9vbGVhbl9vcGVyYXRvcnNdXSA9IGdsb2JhbCBbOCB4IGk2NF0gemVyb2luaXRpYWxpemVyCisvLyBQR09HRU46IEBbW0JMQzpfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19ib29sb3BfbG9vcHNdXSA9IGdsb2JhbCBbOSB4IGk2NF0gemVyb2luaXRpYWxpemVyCisvLyBQR09HRU46IEBbW01BQzpfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19tYWluXV0gPSBnbG9iYWwgWzEgeCBpNjRdIHplcm9pbml0aWFsaXplcgorLy8gUEdPR0VOOiBAW1tTVEM6X19sbHZtX3Byb2ZpbGVfY291bnRlcnNfc3RhdGljX2Z1bmNdXSA9IGludGVybmFsIGdsb2JhbCBbMiB4IGk2NF0gemVyb2luaXRpYWxpemVyCisKKy8vIFBHT0dFTi1MQUJFTDogQHNpbXBsZV9sb29wcygpCisvLyBQR09VU0UtTEFCRUw6IEBzaW1wbGVfbG9vcHMoKQorLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbU0xDXV0sIGk2NCAwLCBpNjQgMAordm9pZCBzaW1wbGVfbG9vcHMoKSB7CisgIGludCBpOworICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTTENdXSwgaTY0IDAsIGk2NCAxCisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW1NMMTpbMC05XStdXQorICBmb3IgKGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgfQorICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTTENdXSwgaTY0IDAsIGk2NCAyCisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW1NMMjpbMC05XStdXQorICB3aGlsZSAoaSA+IDApCisgICAgaS0tOworICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTTENdXSwgaTY0IDAsIGk2NCAzCisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW1NMMzpbMC05XStdXQorICBkbyB7fSB3aGlsZSAoaSsrIDwgNzUpOworCisgIC8vIFBHT0dFTi1OT1Q6IHN0b3JlIHt7Lip9fSBAW1tTTENdXSwKKyAgLy8gUEdPVVNFLU5PVDogYnIge3suKn19ICFwcm9mICFbMC05XSsKK30KKworLy8gUEdPR0VOLUxBQkVMOiBAY29uZGl0aW9uYWxzKCkKKy8vIFBHT1VTRS1MQUJFTDogQGNvbmRpdGlvbmFscygpCisvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tJRkNdXSwgaTY0IDAsIGk2NCAwCit2b2lkIGNvbmRpdGlvbmFscygpIHsKKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSUZDXV0sIGk2NCAwLCBpNjQgMQorICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tJRjE6WzAtOV0rXV0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0lGQ11dLCBpNjQgMCwgaTY0IDIKKyAgICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tJRjI6WzAtOV0rXV0KKyAgICBpZiAoaSAlIDIpIHsKKyAgICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0lGQ11dLCBpNjQgMCwgaTY0IDMKKyAgICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0lGMzpbMC05XStdXQorICAgICAgaWYgKGkpIHt9CisgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSUZDXV0sIGk2NCAwLCBpNjQgNAorICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0lGNDpbMC05XStdXQorICAgIH0gZWxzZSBpZiAoaSAlIDMpIHsKKyAgICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0lGQ11dLCBpNjQgMCwgaTY0IDUKKyAgICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0lGNTpbMC05XStdXQorICAgICAgaWYgKGkpIHt9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0lGQ11dLCBpNjQgMCwgaTY0IDYKKyAgICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0lGNjpbMC05XStdXQorICAgICAgaWYgKGkpIHt9CisgICAgfQorCisgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSUZDXV0sIGk2NCAwLCBpNjQgOAorICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0lGQ11dLCBpNjQgMCwgaTY0IDcKKyAgICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tJRjc6WzAtOV0rXV0KKyAgICBpZiAoMSAmJiBpKSB7fQorICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0lGQ11dLCBpNjQgMCwgaTY0IDEwCisgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSUZDXV0sIGk2NCAwLCBpNjQgOQorICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0lGODpbMC05XStdXQorICAgIGlmICgwIHx8IGkpIHt9CisgIH0KKworICAvLyBQR09HRU4tTk9UOiBzdG9yZSB7ey4qfX0gQFtbSUZDXV0sCisgIC8vIFBHT1VTRS1OT1Q6IGJyIHt7Lip9fSAhcHJvZiAhWzAtOV0rCit9CisKKy8vIFBHT0dFTi1MQUJFTDogQGVhcmx5X2V4aXRzKCkKKy8vIFBHT1VTRS1MQUJFTDogQGVhcmx5X2V4aXRzKCkKKy8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0VFQ11dLCBpNjQgMCwgaTY0IDAKK3ZvaWQgZWFybHlfZXhpdHMoKSB7CisgIGludCBpID0gMDsKKworICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tFRUNdXSwgaTY0IDAsIGk2NCAxCisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0VFMTpbMC05XStdXQorICBpZiAoaSkge30KKworICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tFRUNdXSwgaTY0IDAsIGk2NCAyCisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0VFMjpbMC05XStdXQorICB3aGlsZSAoaSA8IDEwMCkgeworICAgIGkrKzsKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tFRUNdXSwgaTY0IDAsIGk2NCAzCisgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbRUUzOlswLTldK11dCisgICAgaWYgKGkgPiA1MCkKKyAgICAgIGJyZWFrOworICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0VFQ11dLCBpNjQgMCwgaTY0IDQKKyAgICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tFRTQ6WzAtOV0rXV0KKyAgICBpZiAoaSAlIDIpCisgICAgICBjb250aW51ZTsKKyAgfQorCisgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0VFQ11dLCBpNjQgMCwgaTY0IDUKKyAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbRUU1OlswLTldK11dCisgIGlmIChpKSB7fQorCisgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0VFQ11dLCBpNjQgMCwgaTY0IDYKKyAgZG8geworICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0VFQ11dLCBpNjQgMCwgaTY0IDcKKyAgICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tFRTY6WzAtOV0rXV0KKyAgICBpZiAoaSA+IDc1KQorICAgICAgcmV0dXJuOworICAgIGVsc2UKKyAgICAgIGkrKzsKKyAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbRUU3OlswLTldK11dCisgIH0gd2hpbGUgKGkgPCAxMDApOworCisgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0VFQ11dLCBpNjQgMCwgaTY0IDgKKyAgLy8gTmV2ZXIgcmVhY2hlZCAtPiBubyB3ZWlnaHRzCisgIGlmIChpKSB7fQorCisgIC8vIFBHT0dFTi1OT1Q6IHN0b3JlIHt7Lip9fSBAW1tFRUNdXSwKKyAgLy8gUEdPVVNFLU5PVDogYnIge3suKn19ICFwcm9mICFbMC05XSsKK30KKworLy8gUEdPR0VOLUxBQkVMOiBAanVtcHMoKQorLy8gUEdPVVNFLUxBQkVMOiBAanVtcHMoKQorLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSk1DXV0sIGk2NCAwLCBpNjQgMAordm9pZCBqdW1wcygpIHsKKyAgaW50IGk7CisKKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSk1DXV0sIGk2NCAwLCBpNjQgMQorICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tKTTE6WzAtOV0rXV0KKyAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworICAgIGdvdG8gb3V0b2Zsb29wOworICAgIC8vIE5ldmVyIHJlYWNoZWQgLT4gbm8gd2VpZ2h0cworICAgIGlmIChpKSB7fQorICB9CisvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tKTUNdXSwgaTY0IDAsIGk2NCAzCitvdXRvZmxvb3A6CisgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0pNQ11dLCBpNjQgMCwgaTY0IDQKKyAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbSk0yOlswLTldK11dCisgIGlmIChpKSB7fQorCisgIGdvdG8gbG9vcDE7CisKKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSk1DXV0sIGk2NCAwLCBpNjQgNQorICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tKTTM6WzAtOV0rXV0KKyAgd2hpbGUgKGkpIHsKKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSk1DXV0sIGk2NCAwLCBpNjQgNgorICBsb29wMToKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tKTUNdXSwgaTY0IDAsIGk2NCA3CisgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbSk00OlswLTldK11dCisgICAgaWYgKGkpIHt9CisgIH0KKworICBnb3RvIGxvb3AyOworLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSk1DXV0sIGk2NCAwLCBpNjQgOAorZmlyc3Q6CisvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tKTUNdXSwgaTY0IDAsIGk2NCA5CitzZWNvbmQ6CisvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tKTUNdXSwgaTY0IDAsIGk2NCAxMAordGhpcmQ6CisgIGkrKzsKKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSk1DXV0sIGk2NCAwLCBpNjQgMTEKKyAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbSk01OlswLTldK11dCisgIGlmIChpIDwgMykKKyAgICBnb3RvIGxvb3AyOworCisgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0pNQ11dLCBpNjQgMCwgaTY0IDEyCisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0pNNjpbMC05XStdXQorICB3aGlsZSAoaSA8IDMpIHsKKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSk1DXV0sIGk2NCAwLCBpNjQgMTMKKyAgbG9vcDI6CisgICAgLy8gUEdPVVNFOiBzd2l0Y2gge3suKn19IFsKKyAgICAvLyBQR09VU0U6IF0sICFwcm9mICFbW0pNNzpbMC05XStdXQorICAgIHN3aXRjaCAoaSkgeworICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0pNQ11dLCBpNjQgMCwgaTY0IDE1CisgICAgY2FzZSAwOgorICAgICAgZ290byBmaXJzdDsKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tKTUNdXSwgaTY0IDAsIGk2NCAxNgorICAgIGNhc2UgMToKKyAgICAgIGdvdG8gc2Vjb25kOworICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0pNQ11dLCBpNjQgMCwgaTY0IDE3CisgICAgY2FzZSAyOgorICAgICAgZ290byB0aGlyZDsKKyAgICB9CisgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSk1DXV0sIGk2NCAwLCBpNjQgMTQKKyAgfQorCisgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0pNQ11dLCBpNjQgMCwgaTY0IDE4CisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0pNODpbMC05XStdXQorICBmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIGdvdG8gd2l0aGlubG9vcDsKKyAgICAvLyBuZXZlciByZWFjaGVkIC0+IG5vIHdlaWdodHMKKyAgICBpZiAoaSkge30KKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbSk1DXV0sIGk2NCAwLCBpNjQgMjAKKyAgd2l0aGlubG9vcDoKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tKTUNdXSwgaTY0IDAsIGk2NCAyMQorICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0pNOTpbMC05XStdXQorICAgIGlmIChpKSB7fQorICB9CisKKyAgLy8gUEdPR0VOLU5PVDogc3RvcmUge3suKn19IEBbW0pNQ11dLAorICAvLyBQR09VU0UtTk9UOiBiciB7ey4qfX0gIXByb2YgIVswLTldKworfQorCisvLyBQR09HRU4tTEFCRUw6IEBzd2l0Y2hlcygpCisvLyBQR09VU0UtTEFCRUw6IEBzd2l0Y2hlcygpCisvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTV0NdXSwgaTY0IDAsIGk2NCAwCit2b2lkIHN3aXRjaGVzKCkgeworICBzdGF0aWMgaW50IHdlaWdodHNbXSA9IHsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA1fTsKKworICAvLyBObyBjYXNlcyAtPiBubyB3ZWlnaHRzCisgIHN3aXRjaCAod2VpZ2h0c1swXSkgeworICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTV0NdXSwgaTY0IDAsIGk2NCAyCisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbU1dDXV0sIGk2NCAwLCBpNjQgMQorCisgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW1NXQ11dLCBpNjQgMCwgaTY0IDMKKyAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbU1cxOlswLTldK11dCisgIGZvciAoaW50IGkgPSAwLCBsZW4gPSBzaXplb2Yod2VpZ2h0cykgLyBzaXplb2Yod2VpZ2h0c1swXSk7IGkgPCBsZW47ICsraSkgeworICAgIC8vIFBHT1VTRTogc3dpdGNoIHt7Lip9fSBbCisgICAgLy8gUEdPVVNFOiBdLCAhcHJvZiAhW1tTVzI6WzAtOV0rXV0KKyAgICBzd2l0Y2ggKGlbd2VpZ2h0c10pIHsKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTV0NdXSwgaTY0IDAsIGk2NCA1CisgICAgY2FzZSAxOgorICAgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbU1dDXV0sIGk2NCAwLCBpNjQgNgorICAgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbU1czOlswLTldK11dCisgICAgICBpZiAoaSkge30KKyAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbU1dDXV0sIGk2NCAwLCBpNjQgNworICAgIGNhc2UgMjoKKyAgICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW1NXQ11dLCBpNjQgMCwgaTY0IDgKKyAgICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW1NXNDpbMC05XStdXQorICAgICAgaWYgKGkpIHt9CisgICAgICBicmVhazsKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTV0NdXSwgaTY0IDAsIGk2NCA5CisgICAgY2FzZSAzOgorICAgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbU1dDXV0sIGk2NCAwLCBpNjQgMTAKKyAgICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW1NXNTpbMC05XStdXQorICAgICAgaWYgKGkpIHt9CisgICAgICBjb250aW51ZTsKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTV0NdXSwgaTY0IDAsIGk2NCAxMQorICAgIGNhc2UgNDoKKyAgICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW1NXQ11dLCBpNjQgMCwgaTY0IDEyCisgICAgICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tTVzY6WzAtOV0rXV0KKyAgICAgIGlmIChpKSB7fQorICAgICAgLy8gUEdPVVNFOiBzd2l0Y2gge3suKn19IFsKKyAgICAgIC8vIFBHT1VTRTogXSwgIXByb2YgIVtbU1c3OlswLTldK11dCisgICAgICBzd2l0Y2ggKGkpIHsKKyAgICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW1NXQ11dLCBpNjQgMCwgaTY0IDE0CisgICAgICBjYXNlIDYgLi4uIDk6CisgICAgICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW1NXQ11dLCBpNjQgMCwgaTY0IDE1CisgICAgICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW1NXODpbMC05XStdXQorICAgICAgICBpZiAoaSkge30KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTV0NdXSwgaTY0IDAsIGk2NCAxMworCisgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbU1dDXV0sIGk2NCAwLCBpNjQgMTYKKyAgICBkZWZhdWx0OgorICAgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbU1dDXV0sIGk2NCAwLCBpNjQgMTcKKyAgICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW1NXOTpbMC05XStdXQorICAgICAgaWYgKGkgPT0gbGVuIC0gMSkKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTV0NdXSwgaTY0IDAsIGk2NCA0CisgIH0KKworICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTV0NdXSwgaTY0IDAsIGk2NCAxOAorICAvLyBOZXZlciByZWFjaGVkIC0+IG5vIHdlaWdodHMKKyAgaWYgKHdlaWdodHNbMF0pIHt9CisKKyAgLy8gUEdPR0VOLU5PVDogc3RvcmUge3suKn19IEBbW1NXQ11dLAorICAvLyBQR09VU0UtTk9UOiBiciB7ey4qfX0gIXByb2YgIVswLTldKworfQorCisvLyBQR09HRU4tTEFCRUw6IEBiaWdfc3dpdGNoKCkKKy8vIFBHT1VTRS1MQUJFTDogQGJpZ19zd2l0Y2goKQorLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbQlNDXV0sIGk2NCAwLCBpNjQgMAordm9pZCBiaWdfc3dpdGNoKCkgeworICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCU0NdXSwgaTY0IDAsIGk2NCAxCisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0JTMTpbMC05XStdXQorICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyArK2kpIHsKKyAgICAvLyBQR09VU0U6IHN3aXRjaCB7ey4qfX0gWworICAgIC8vIFBHT1VTRTogXSwgIXByb2YgIVtbQlMyOlswLTldK11dCisgICAgc3dpdGNoICgxIDw8IGkpIHsKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCU0NdXSwgaTY0IDAsIGk2NCAzCisgICAgY2FzZSAoMSA8PCAwKToKKyAgICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0JTQ11dLCBpNjQgMCwgaTY0IDQKKyAgICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0JTMzpbMC05XStdXQorICAgICAgaWYgKGkpIHt9CisgICAgICAvLyBmYWxsdGhyb3VnaAorICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0JTQ11dLCBpNjQgMCwgaTY0IDUKKyAgICBjYXNlICgxIDw8IDEpOgorICAgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbQlNDXV0sIGk2NCAwLCBpNjQgNgorICAgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbQlM0OlswLTldK11dCisgICAgICBpZiAoaSkge30KKyAgICAgIGJyZWFrOworICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0JTQ11dLCBpNjQgMCwgaTY0IDcKKyAgICBjYXNlICgxIDw8IDIpIC4uLiAoMSA8PCAxMik6CisgICAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCU0NdXSwgaTY0IDAsIGk2NCA4CisgICAgICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tCUzU6WzAtOV0rXV0KKyAgICAgIGlmIChpKSB7fQorICAgICAgYnJlYWs7CisgICAgLy8gVGhlIGJyYW5jaCBmb3IgdGhlIGxhcmdlIGNhc2UgcmFuZ2UgYWJvdmUgYXBwZWFycyBhZnRlciB0aGUgY2FzZSBib2R5CisgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbQlM2OlswLTldK11dCisKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCU0NdXSwgaTY0IDAsIGk2NCA5CisgICAgY2FzZSAoMSA8PCAxMyk6CisgICAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCU0NdXSwgaTY0IDAsIGk2NCAxMAorICAgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbQlM3OlswLTldK11dCisgICAgICBpZiAoaSkge30KKyAgICAgIGJyZWFrOworICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0JTQ11dLCBpNjQgMCwgaTY0IDExCisgICAgY2FzZSAoMSA8PCAxNCkgLi4uICgxIDw8IDI4KToKKyAgICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0JTQ11dLCBpNjQgMCwgaTY0IDEyCisgICAgICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tCUzg6WzAtOV0rXV0KKyAgICAgIGlmIChpKSB7fQorICAgICAgYnJlYWs7CisgICAgLy8gVGhlIGJyYW5jaCBmb3IgdGhlIGxhcmdlIGNhc2UgcmFuZ2UgYWJvdmUgYXBwZWFycyBhZnRlciB0aGUgY2FzZSBib2R5CisgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbQlM5OlswLTldK11dCisKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCU0NdXSwgaTY0IDAsIGk2NCAxMworICAgIGNhc2UgKDEgPDwgMjkpIC4uLiAoKDEgPDwgMjkpICsgMSk6CisgICAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCU0NdXSwgaTY0IDAsIGk2NCAxNAorICAgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbQlMxMDpbMC05XStdXQorICAgICAgaWYgKGkpIHt9CisgICAgICBicmVhazsKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCU0NdXSwgaTY0IDAsIGk2NCAxNQorICAgIGRlZmF1bHQ6CisgICAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCU0NdXSwgaTY0IDAsIGk2NCAxNgorICAgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbQlMxMTpbMC05XStdXQorICAgICAgaWYgKGkpIHt9CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbQlNDXV0sIGk2NCAwLCBpNjQgMgorICB9CisKKyAgLy8gUEdPR0VOLU5PVDogc3RvcmUge3suKn19IEBbW0JTQ11dLAorICAvLyBQR09VU0UtTk9UOiBiciB7ey4qfX0gIXByb2YgIVswLTldKworICAvLyBQR09VU0U6IHJldCB2b2lkCit9CisKKy8vIFBHT0dFTi1MQUJFTDogQGJvb2xlYW5fb3BlcmF0b3JzKCkKKy8vIFBHT1VTRS1MQUJFTDogQGJvb2xlYW5fb3BlcmF0b3JzKCkKKy8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0JPQ11dLCBpNjQgMCwgaTY0IDAKK3ZvaWQgYm9vbGVhbl9vcGVyYXRvcnMoKSB7CisgIGludCB2OworICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCT0NdXSwgaTY0IDAsIGk2NCAxCisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0JPMTpbMC05XStdXQorICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbQk9DXV0sIGk2NCAwLCBpNjQgMgorICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0JPMjpbMC05XStdXQorICAgIHYgPSBpICUgMyB8fCBpOworCisgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbQk9DXV0sIGk2NCAwLCBpNjQgMworICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0JPMzpbMC05XStdXQorICAgIHYgPSBpICUgMyAmJiBpOworCisgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbQk9DXV0sIGk2NCAwLCBpNjQgNQorICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0JPQ11dLCBpNjQgMCwgaTY0IDQKKyAgICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tCTzQ6WzAtOV0rXV0KKyAgICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tCTzU6WzAtOV0rXV0KKyAgICB2ID0gaSAlIDMgfHwgaSAlIDIgfHwgaTsKKworICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0JPQ11dLCBpNjQgMCwgaTY0IDcKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCT0NdXSwgaTY0IDAsIGk2NCA2CisgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbQk82OlswLTldK11dCisgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbQk83OlswLTldK11dCisgICAgdiA9IGkgJSAyICYmIGkgJSAzICYmIGk7CisgIH0KKworICAvLyBQR09HRU4tTk9UOiBzdG9yZSB7ey4qfX0gQFtbQk9DXV0sCisgIC8vIFBHT1VTRS1OT1Q6IGJyIHt7Lip9fSAhcHJvZiAhWzAtOV0rCit9CisKKy8vIFBHT0dFTi1MQUJFTDogQGJvb2xvcF9sb29wcygpCisvLyBQR09VU0UtTEFCRUw6IEBib29sb3BfbG9vcHMoKQorLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbQkxDXV0sIGk2NCAwLCBpNjQgMAordm9pZCBib29sb3BfbG9vcHMoKSB7CisgIGludCBpID0gMTAwOworCisgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0JMQ11dLCBpNjQgMCwgaTY0IDIKKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbQkxDXV0sIGk2NCAwLCBpNjQgMQorICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tCTDE6WzAtOV0rXV0KKyAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbQkwyOlswLTldK11dCisgIHdoaWxlIChpICYmIGkgPiA1MCkKKyAgICBpLS07CisKKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbQkxDXV0sIGk2NCAwLCBpNjQgNAorICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCTENdXSwgaTY0IDAsIGk2NCAzCisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0JMMzpbMC05XStdXQorICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tCTDQ6WzAtOV0rXV0KKyAgd2hpbGUgKChpICUgMikgfHwgKGkgPiAwKSkKKyAgICBpLS07CisKKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbQkxDXV0sIGk2NCAwLCBpNjQgNgorICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCTENdXSwgaTY0IDAsIGk2NCA1CisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0JMNTpbMC05XStdXQorICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tCTDY6WzAtOV0rXV0KKyAgZm9yIChpID0gMTAwOyBpICYmIGkgPiA1MDsgLS1pKTsKKworICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tCTENdXSwgaTY0IDAsIGk2NCA4CisgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0JMQ11dLCBpNjQgMCwgaTY0IDcKKyAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbQkw3OlswLTldK11dCisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0JMODpbMC05XStdXQorICBmb3IgKDsgKGkgJSAyKSB8fCAoaSA+IDApOyAtLWkpOworCisgIC8vIFBHT0dFTi1OT1Q6IHN0b3JlIHt7Lip9fSBAW1tCTENdXSwKKyAgLy8gUEdPVVNFLU5PVDogYnIge3suKn19ICFwcm9mICFbMC05XSsKK30KKwordm9pZCBkb19mYWxsdGhyb3VnaCgpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgaW50IGogPSAwOworICAgIGRvIHsKKyAgICAgIC8vIFRoZSBudW1iZXIgb2YgZXhpdHMgb3V0IG9mIHRoaXMgZG8tbG9vcCB2aWEgdGhlIGJyZWFrIHN0YXRlbWVudAorICAgICAgLy8gZXhjZWVkcyB0aGUgY291bnRlciB2YWx1ZSBmb3IgdGhlIGxvb3AgKHdoaWNoIGRvZXMgbm90IGluY2x1ZGUgdGhlCisgICAgICAvLyBmYWxsdGhyb3VnaCBjb3VudCkuIE1ha2Ugc3VyZSB0aGF0IGRvZXMgbm90IHZpb2xhdGUgYW55IGFzc2VydGlvbnMuCisgICAgICBpZiAoaSA8IDgpIGJyZWFrOworICAgICAgaisrOworICAgIH0gd2hpbGUgKGogPCAyKTsKKyAgfQorfQorCisvLyBQR09HRU4tTEFCRUw6IEBzdGF0aWNfZnVuYygpCisvLyBQR09VU0UtTEFCRUw6IEBzdGF0aWNfZnVuYygpCisvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tTVENdXSwgaTY0IDAsIGk2NCAwCitzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYygpIHsKKyAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbU1RDXV0sIGk2NCAwLCBpNjQgMQorICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tTVDE6WzAtOV0rXV0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgIH0KK30KKworLy8gUEdPVVNFLURBRzogIVtbU0wxXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMTAxLCBpMzIgMn0KKy8vIFBHT1VTRS1EQUc6ICFbW1NMMl1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDEwMSwgaTMyIDJ9CisvLyBQR09VU0UtREFHOiAhW1tTTDNdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiA3NiwgaTMyIDJ9CisKKy8vIFBHT1VTRS1EQUc6ICFbW0VFMV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDEsIGkzMiAyfQorLy8gUEdPVVNFLURBRzogIVtbRUUyXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgNTIsIGkzMiAxfQorLy8gUEdPVVNFLURBRzogIVtbRUUzXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMiwgaTMyIDUxfQorLy8gUEdPVVNFLURBRzogIVtbRUU0XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMjYsIGkzMiAyNn0KKy8vIFBHT1VTRS1EQUc6ICFbW0VFNV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDIsIGkzMiAxfQorLy8gUEdPVVNFLURBRzogIVtbRUU2XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMiwgaTMyIDI2fQorLy8gUEdPVVNFLURBRzogIVtbRUU3XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMjYsIGkzMiAxfQorCisvLyBQR09VU0UtREFHOiAhW1tJRjFdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAxMDEsIGkzMiAyfQorLy8gUEdPVVNFLURBRzogIVtbSUYyXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgNTEsIGkzMiA1MX0KKy8vIFBHT1VTRS1EQUc6ICFbW0lGM11dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDUxLCBpMzIgMX0KKy8vIFBHT1VTRS1EQUc6ICFbW0lGNF1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDM0LCBpMzIgMTh9CisvLyBQR09VU0UtREFHOiAhW1tJRjVdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAzNCwgaTMyIDF9CisvLyBQR09VU0UtREFHOiAhW1tJRjZdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAxNywgaTMyIDJ9CisvLyBQR09VU0UtREFHOiAhW1tJRjddXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAxMDAsIGkzMiAyfQorLy8gUEdPVVNFLURBRzogIVtbSUY4XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMTAwLCBpMzIgMn0KKworLy8gUEdPVVNFLURBRzogIVtbSk0xXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMiwgaTMyIDF9CisvLyBQR09VU0UtREFHOiAhW1tKTTJdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAxLCBpMzIgMn0KKy8vIFBHT1VTRS1EQUc6ICFbW0pNM11dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDEsIGkzMiAyfQorLy8gUEdPVVNFLURBRzogIVtbSk00XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMSwgaTMyIDJ9CisvLyBQR09VU0UtREFHOiAhW1tKTTVdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAzLCBpMzIgMn0KKy8vIFBHT1VTRS1EQUc6ICFbW0pNNl1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDEsIGkzMiAyfQorLy8gUEdPVVNFLURBRzogIVtbSk03XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMSwgaTMyIDIsIGkzMiAyLCBpMzIgMn0KKy8vIFBHT1VTRS1EQUc6ICFbW0pNOF1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDExLCBpMzIgMn0KKy8vIFBHT1VTRS1EQUc6ICFbW0pNOV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDEwLCBpMzIgMn0KKworLy8gUEdPVVNFLURBRzogIVtbU1cxXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMTYsIGkzMiAxfQorLy8gUEdPVVNFLURBRzogIVtbU1cyXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgNiwgaTMyIDIsIGkzMiAzLCBpMzIgNCwgaTMyIDV9CisvLyBQR09VU0UtREFHOiAhW1tTVzNdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAxLCBpMzIgMn0KKy8vIFBHT1VTRS1EQUc6ICFbW1NXNF1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDMsIGkzMiAyfQorLy8gUEdPVVNFLURBRzogIVtbU1c1XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgNCwgaTMyIDF9CisvLyBQR09VU0UtREFHOiAhW1tTVzZdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiA1LCBpMzIgMX0KKy8vIFBHT1VTRS1EQUc6ICFbW1NXN11dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDEsIGkzMiAyLCBpMzIgMiwgaTMyIDIsIGkzMiAyfQorLy8gUEdPVVNFLURBRzogIVtbU1c4XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgNSwgaTMyIDF9CisvLyBQR09VU0UtREFHOiAhW1tTVzldXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAyLCBpMzIgNX0KKworLy8gUEdPVVNFLURBRzogIVtbQlMxXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMzMsIGkzMiAyfQorLy8gUEdPVVNFLURBRzogIVtbQlMyXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMjksIGkzMiAyLCBpMzIgMiwgaTMyIDIsIGkzMiAyLCBpMzIgMX0KKy8vIFBHT1VTRS1EQUc6ICFbW0JTM11dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDEsIGkzMiAyfQorLy8gUEdPVVNFLURBRzogIVtbQlM0XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMiwgaTMyIDJ9CisvLyBQR09VU0UtREFHOiAhW1tCUzVdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAxMiwgaTMyIDF9CisvLyBQR09VU0UtREFHOiAhW1tCUzZdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAxMiwgaTMyIDN9CisvLyBQR09VU0UtREFHOiAhW1tCUzddXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAyLCBpMzIgMX0KKy8vIFBHT1VTRS1EQUc6ICFbW0JTOF1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDE2LCBpMzIgMX0KKy8vIFBHT1VTRS1EQUc6ICFbW0JTOV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDE2LCBpMzIgMTR9CisvLyBQR09VU0UtREFHOiAhW1tCUzEwXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMiwgaTMyIDF9CisvLyBQR09VU0UtREFHOiAhW1tCUzExXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMywgaTMyIDF9CisKKy8vIFBHT1VTRS1EQUc6ICFbW0JPMV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDEwMSwgaTMyIDJ9CisvLyBQR09VU0UtREFHOiAhW1tCTzJdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiA2NywgaTMyIDM1fQorLy8gUEdPVVNFLURBRzogIVtbQk8zXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgNjcsIGkzMiAzNX0KKy8vIFBHT1VTRS1EQUc6ICFbW0JPNF1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDY3LCBpMzIgMzV9CisvLyBQR09VU0UtREFHOiAhW1tCTzVdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAxOCwgaTMyIDE4fQorLy8gUEdPVVNFLURBRzogIVtbQk82XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgNTEsIGkzMiA1MX0KKy8vIFBHT1VTRS1EQUc6ICFbW0JPN11dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDM0LCBpMzIgMTh9CisvLyBQR09VU0UtREFHOiAhW1tCTDFdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiA1MiwgaTMyIDF9CisvLyBQR09VU0UtREFHOiAhW1tCTDJdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiA1MSwgaTMyIDJ9CisvLyBQR09VU0UtREFHOiAhW1tCTDNdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAyNiwgaTMyIDI3fQorLy8gUEdPVVNFLURBRzogIVtbQkw0XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgNTEsIGkzMiAyfQorLy8gUEdPVVNFLURBRzogIVtbQkw1XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgNTIsIGkzMiAxfQorLy8gUEdPVVNFLURBRzogIVtbQkw2XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgNTEsIGkzMiAyfQorLy8gUEdPVVNFLURBRzogIVtbQkw3XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMjYsIGkzMiAyN30KKy8vIFBHT1VTRS1EQUc6ICFbW0JMOF1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDUxLCBpMzIgMn0KKy8vIFBHT1VTRS1EQUc6ICFbW1NUMV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDExLCBpMzIgMn0KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBzaW1wbGVfbG9vcHMoKTsKKyAgY29uZGl0aW9uYWxzKCk7CisgIGVhcmx5X2V4aXRzKCk7CisgIGp1bXBzKCk7CisgIHN3aXRjaGVzKCk7CisgIGJpZ19zd2l0Y2goKTsKKyAgYm9vbGVhbl9vcGVyYXRvcnMoKTsKKyAgYm9vbG9wX2xvb3BzKCk7CisgIGRvX2ZhbGx0aHJvdWdoKCk7CisgIHN0YXRpY19mdW5jKCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Qcm9maWxlL2MtbGlua2FnZS1hdmFpbGFibGVfZXh0ZXJuYWxseS5jIGIvdGVzdC9Qcm9maWxlL2MtbGlua2FnZS1hdmFpbGFibGVfZXh0ZXJuYWxseS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZGYzMDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1Byb2ZpbGUvYy1saW5rYWdlLWF2YWlsYWJsZV9leHRlcm5hbGx5LmMKQEAgLTAsMCArMSwxMiBAQAorLy8gTWFrZSBzdXJlIGluc3RyZW1lbnRhdGlvbiBkYXRhIGZyb20gYXZhaWxhYmxlX2V4dGVybmFsbHkgZnVuY3Rpb25zIGRvZXNuJ3QKKy8vIGdldCB0aHJvd24gb3V0LgorLy8gUlVOOiAlY2xhbmdfY2MxIC1PMiAtdHJpcGxlIHg4Nl82NC1hcHBsZS1tYWNvc3gxMC45IC1tYWluLWZpbGUtbmFtZSBjLWxpbmthZ2UtYXZhaWxhYmxlX2V4dGVybmFsbHkuYyAlcyAtbyAtIC1lbWl0LWxsdm0gLWZwcm9maWxlLWluc3RyLWdlbmVyYXRlIHwgRmlsZUNoZWNrICVzCisKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfY291bnRlcnNfZm9vID0gbGlua29uY2Vfb2RyIGdsb2JhbCBbMSB4IGk2NF0gemVyb2luaXRpYWxpemVyLCBzZWN0aW9uICJfX0RBVEEsX19sbHZtX3ByZl9jbnRzIiwgYWxpZ24gOAorLy8gQ0hFQ0s6IEBfX2xsdm1fcHJvZmlsZV9uYW1lX2ZvbyA9IGxpbmtvbmNlX29kciBjb25zdGFudCBbMyB4IGk4XSBjImZvbyIsIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX25hbWVzIiwgYWxpZ24gMQorLy8gQ0hFQ0s6IEBfX2xsdm1fcHJvZmlsZV9kYXRhX2ZvbyA9IGxpbmtvbmNlX29kciBjb25zdGFudCB7IGkzMiwgaTMyLCBpNjQsIGk4KiwgaTY0KiB9IHsgaTMyIDMsIGkzMiAxLCBpNjQgMSwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFszIHggaThdKiBAX19sbHZtX3Byb2ZpbGVfbmFtZV9mb28sIGkzMiAwLCBpMzIgMCksIGk2NCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEgeCBpNjRdKiBAX19sbHZtX3Byb2ZpbGVfY291bnRlcnNfZm9vLCBpMzIgMCwgaTMyIDApIH0sIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX2RhdGEiLCBhbGlnbiA4CitpbmxpbmUgaW50IGZvbyh2b2lkKSB7IHJldHVybiAxOyB9CisKK2ludCBtYWluKHZvaWQpIHsKKyAgcmV0dXJuIGZvbygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9Qcm9maWxlL2MtbGlua2FnZS5jIGIvdGVzdC9Qcm9maWxlL2MtbGlua2FnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZWFlMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1Byb2ZpbGUvYy1saW5rYWdlLmMKQEAgLTAsMCArMSwzNyBAQAorLy8gQ2hlY2sgdGhlIGRhdGEgc3RydWN0dXJlcyBlbWl0dGVkIGJ5IGluc3RydW1lbnRhdGlvbi4KKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1tYWNvc3gxMC45IC1tYWluLWZpbGUtbmFtZSBjLWxpbmthZ2UuYyAlcyAtbyAtIC1lbWl0LWxsdm0gLWZwcm9maWxlLWluc3RyLWdlbmVyYXRlIHwgRmlsZUNoZWNrICVzCisKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfcnVudGltZSA9IGV4dGVybmFsIGdsb2JhbCBpMzIKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfY291bnRlcnNfZm9vID0gZ2xvYmFsIFsxIHggaTY0XSB6ZXJvaW5pdGlhbGl6ZXIsIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX2NudHMiLCBhbGlnbiA4CisvLyBDSEVDSzogQF9fbGx2bV9wcm9maWxlX25hbWVfZm9vID0gY29uc3RhbnQgWzMgeCBpOF0gYyJmb28iLCBzZWN0aW9uICJfX0RBVEEsX19sbHZtX3ByZl9uYW1lcyIsIGFsaWduIDEKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfZGF0YV9mb28gPSBjb25zdGFudCB7IGkzMiwgaTMyLCBpNjQsIGk4KiwgaTY0KiB9IHsgaTMyIDMsIGkzMiAxLCBpNjQgMSwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFszIHggaThdKiBAX19sbHZtX3Byb2ZpbGVfbmFtZV9mb28sIGkzMiAwLCBpMzIgMCksIGk2NCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEgeCBpNjRdKiBAX19sbHZtX3Byb2ZpbGVfY291bnRlcnNfZm9vLCBpMzIgMCwgaTMyIDApIH0sIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX2RhdGEiLCBhbGlnbiA4Cit2b2lkIGZvbyh2b2lkKSB7IH0KKworLy8gQ0hFQ0s6IEBfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19mb29fd2VhayA9IHdlYWsgZ2xvYmFsIFs1IHggaTY0XSB6ZXJvaW5pdGlhbGl6ZXIsIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX2NudHMiLCBhbGlnbiA4CisvLyBDSEVDSzogQF9fbGx2bV9wcm9maWxlX25hbWVfZm9vX3dlYWsgPSB3ZWFrIGNvbnN0YW50IFs4IHggaThdIGMiZm9vX3dlYWsiLCBzZWN0aW9uICJfX0RBVEEsX19sbHZtX3ByZl9uYW1lcyIsIGFsaWduIDEKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfZGF0YV9mb29fd2VhayA9IHdlYWsgY29uc3RhbnQgeyBpMzIsIGkzMiwgaTY0LCBpOCosIGk2NCogfSB7IGkzMiA4LCBpMzIgNSwgaTY0IDUsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbOCB4IGk4XSogQF9fbGx2bV9wcm9maWxlX25hbWVfZm9vX3dlYWssIGkzMiAwLCBpMzIgMCksIGk2NCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzUgeCBpNjRdKiBAX19sbHZtX3Byb2ZpbGVfY291bnRlcnNfZm9vX3dlYWssIGkzMiAwLCBpMzIgMCkgfSwgc2VjdGlvbiAiX19EQVRBLF9fbGx2bV9wcmZfZGF0YSIsIGFsaWduIDgKK3ZvaWQgZm9vX3dlYWsodm9pZCkgX19hdHRyaWJ1dGVfXygod2VhaykpOwordm9pZCBmb29fd2Vhayh2b2lkKSB7IGlmICgwKXt9IGlmICgwKXt9IGlmICgwKXt9IGlmICgwKXt9IH0KKworLy8gQ0hFQ0s6IEBfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19tYWluID0gZ2xvYmFsIFsxIHggaTY0XSB6ZXJvaW5pdGlhbGl6ZXIsIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX2NudHMiLCBhbGlnbiA4CisvLyBDSEVDSzogQF9fbGx2bV9wcm9maWxlX25hbWVfbWFpbiA9IGNvbnN0YW50IFs0IHggaThdIGMibWFpbiIsIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX25hbWVzIiwgYWxpZ24gMQorLy8gQ0hFQ0s6IEBfX2xsdm1fcHJvZmlsZV9kYXRhX21haW4gPSBjb25zdGFudCB7IGkzMiwgaTMyLCBpNjQsIGk4KiwgaTY0KiB9IHsgaTMyIDQsIGkzMiAxLCBpNjQgMSwgaTgqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFs0IHggaThdKiBAX19sbHZtX3Byb2ZpbGVfbmFtZV9tYWluLCBpMzIgMCwgaTMyIDApLCBpNjQqIGdldGVsZW1lbnRwdHIgaW5ib3VuZHMgKFsxIHggaTY0XSogQF9fbGx2bV9wcm9maWxlX2NvdW50ZXJzX21haW4sIGkzMiAwLCBpMzIgMCkgfSwgc2VjdGlvbiAiX19EQVRBLF9fbGx2bV9wcmZfZGF0YSIsIGFsaWduIDgKK3N0YXRpYyB2b2lkIGZvb19pbnRlcm5hbCh2b2lkKTsKK2ludCBtYWluKHZvaWQpIHsKKyAgZm9vKCk7CisgIGZvb19pbnRlcm5hbCgpOworICBmb29fd2VhaygpOworICByZXR1cm4gMDsKK30KKworLy8gQ0hFQ0s6IEBfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19mb29faW50ZXJuYWwgPSBpbnRlcm5hbCBnbG9iYWwgWzMgeCBpNjRdIHplcm9pbml0aWFsaXplciwgc2VjdGlvbiAiX19EQVRBLF9fbGx2bV9wcmZfY250cyIsIGFsaWduIDgKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfbmFtZV9mb29faW50ZXJuYWwgPSBpbnRlcm5hbCBjb25zdGFudCBbMjQgeCBpOF0gYyJjLWxpbmthZ2UuYzpmb29faW50ZXJuYWwiLCBzZWN0aW9uICJfX0RBVEEsX19sbHZtX3ByZl9uYW1lcyIsIGFsaWduIDEKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfZGF0YV9mb29faW50ZXJuYWwgPSBpbnRlcm5hbCBjb25zdGFudCB7IGkzMiwgaTMyLCBpNjQsIGk4KiwgaTY0KiB9IHsgaTMyIDI0LCBpMzIgMywgaTY0IDMsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMjQgeCBpOF0qIEBfX2xsdm1fcHJvZmlsZV9uYW1lX2Zvb19pbnRlcm5hbCwgaTMyIDAsIGkzMiAwKSwgaTY0KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMyB4IGk2NF0qIEBfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19mb29faW50ZXJuYWwsIGkzMiAwLCBpMzIgMCkgfSwgc2VjdGlvbiAiX19EQVRBLF9fbGx2bV9wcmZfZGF0YSIsIGFsaWduIDgKK3N0YXRpYyB2b2lkIGZvb19pbnRlcm5hbCh2b2lkKSB7IGlmICgwKXt9IGlmICgwKXt9IH0KKworLy8gQ0hFQ0s6IEBsbHZtLnVzZWQgPSBhcHBlbmRpbmcgZ2xvYmFsIFs1IHggaTgqXSBbaTgqIGJpdGNhc3QgKGkzMiAoKSogQF9fbGx2bV9wcm9maWxlX3J1bnRpbWVfdXNlciB0byBpOCopLCBpOCogYml0Y2FzdCAoeyBpMzIsIGkzMiwgaTY0LCBpOCosIGk2NCogfSogQF9fbGx2bV9wcm9maWxlX2RhdGFfZm9vIHRvIGk4KiksIGk4KiBiaXRjYXN0ICh7IGkzMiwgaTMyLCBpNjQsIGk4KiwgaTY0KiB9KiBAX19sbHZtX3Byb2ZpbGVfZGF0YV9mb29fd2VhayB0byBpOCopLCBpOCogYml0Y2FzdCAoeyBpMzIsIGkzMiwgaTY0LCBpOCosIGk2NCogfSogQF9fbGx2bV9wcm9maWxlX2RhdGFfbWFpbiB0byBpOCopLCBpOCogYml0Y2FzdCAoeyBpMzIsIGkzMiwgaTY0LCBpOCosIGk2NCogfSogQF9fbGx2bV9wcm9maWxlX2RhdGFfZm9vX2ludGVybmFsIHRvIGk4KildLCBzZWN0aW9uICJsbHZtLm1ldGFkYXRhIgorCisvLyBDSEVDSzogZGVmaW5lIGxpbmtvbmNlX29kciBpMzIgQF9fbGx2bV9wcm9maWxlX3J1bnRpbWVfdXNlcigpIHt7Lip9fSB7CisvLyBDSEVDSzogICAlW1tSRUc6LipdXSA9IGxvYWQgaTMyKiBAX19sbHZtX3Byb2ZpbGVfcnVudGltZQorLy8gQ0hFQ0s6ICAgcmV0IGkzMiAlW1tSRUddXQorLy8gQ0hFQ0s6IH0KZGlmZiAtLWdpdCBhL3Rlc3QvUHJvZmlsZS9jLW91dGRhdGVkLWRhdGEuYyBiL3Rlc3QvUHJvZmlsZS9jLW91dGRhdGVkLWRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTVhNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Qcm9maWxlL2Mtb3V0ZGF0ZWQtZGF0YS5jCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFRlc3QgdGhhdCBvdXRkYXRlZCBkYXRhIGlzIGlnbm9yZWQuCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1tYWNvc3gxMC45IC1tYWluLWZpbGUtbmFtZSBjLW91dGRhdGVkLWRhdGEuYyAlcyAtbyAtIC1lbWl0LWxsdm0gLWZwcm9maWxlLWluc3RyLXVzZT0lUy9JbnB1dHMvYy1vdXRkYXRlZC1kYXRhLnByb2ZkYXRhIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9UEdPVVNFICVzCisKKy8vIFRPRE86IFdlIHNob3VsZCBoYXZlIGEgd2FybmluZyBvciBhIHJlbWFyayB0aGF0IHRlbGxzIHVzIHRoZSBwcm9maWxlIGRhdGEgd2FzCisvLyBkaXNjYXJkZWQsIHJhdGhlciB0aGFuIGp1c3QgY2hlY2tpbmcgdGhhdCB3ZSBmYWlsIHRvIGFkZCBtZXRhZGF0YS4KKworLy8gUEdPVVNFLUxBQkVMOiBAbm9fdXNhYmxlX2RhdGEoKQordm9pZCBub191c2FibGVfZGF0YSgpIHsKKyAgaW50IGkgPSAwOworCisgIGlmIChpKSB7fQorCisjaWZkZWYgR0VORVJBVEVfT1VUREFURURfREFUQQorICBpZiAoaSkge30KKyNlbmRpZgorCisgIC8vIFBHT1VTRS1OT1Q6IGJyIHt7Lip9fSAhcHJvZiAhWzAtOV0rCit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgbm9fdXNhYmxlX2RhdGEoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1Byb2ZpbGUvY3h4LWNsYXNzLmNwcCBiL3Rlc3QvUHJvZmlsZS9jeHgtY2xhc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmJjMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1Byb2ZpbGUvY3h4LWNsYXNzLmNwcApAQCAtMCwwICsxLDc3IEBACisvLyBUZXN0cyBmb3IgaW5zdHJ1bWVudGF0aW9uIG9mIEMrKyBtZXRob2RzLCBjb25zdHJ1Y3RvcnMsIGFuZCBkZXN0cnVjdG9ycy4KKworLy8gUlVOOiAlY2xhbmcgJXMgLW8gLSAtZW1pdC1sbHZtIC1TIC1mcHJvZmlsZS1pbnN0ci1nZW5lcmF0ZSAtZm5vLWV4Y2VwdGlvbnMgLXRhcmdldCAlaXRhbml1bV9hYmlfdHJpcGxlID4gJXRnZW4KKy8vIFJVTjogRmlsZUNoZWNrIC0taW5wdXQtZmlsZT0ldGdlbiAtY2hlY2stcHJlZml4PUNUUkdFTiAlcworLy8gUlVOOiBGaWxlQ2hlY2sgLS1pbnB1dC1maWxlPSV0Z2VuIC1jaGVjay1wcmVmaXg9RFRSR0VOICVzCisvLyBSVU46IEZpbGVDaGVjayAtLWlucHV0LWZpbGU9JXRnZW4gLWNoZWNrLXByZWZpeD1NVEhHRU4gJXMKKy8vIFJVTjogRmlsZUNoZWNrIC0taW5wdXQtZmlsZT0ldGdlbiAtY2hlY2stcHJlZml4PVdSUEdFTiAlcworCisvLyBSVU46ICVjbGFuZyAlcyAtbyAtIC1lbWl0LWxsdm0gLVMgLWZwcm9maWxlLWluc3RyLXVzZT0lUy9JbnB1dHMvY3h4LWNsYXNzLnByb2ZkYXRhIC1mbm8tZXhjZXB0aW9ucyAtdGFyZ2V0ICVpdGFuaXVtX2FiaV90cmlwbGUgPiAldHVzZQorLy8gUlVOOiBGaWxlQ2hlY2sgLS1pbnB1dC1maWxlPSV0dXNlIC1jaGVjay1wcmVmaXg9Q1RSVVNFICVzCisvLyBSVU46IEZpbGVDaGVjayAtLWlucHV0LWZpbGU9JXR1c2UgLWNoZWNrLXByZWZpeD1EVFJVU0UgJXMKKy8vIFJVTjogRmlsZUNoZWNrIC0taW5wdXQtZmlsZT0ldHVzZSAtY2hlY2stcHJlZml4PU1USFVTRSAlcworLy8gUlVOOiBGaWxlQ2hlY2sgLS1pbnB1dC1maWxlPSV0dXNlIC1jaGVjay1wcmVmaXg9V1JQVVNFICVzCisKK2NsYXNzIFNpbXBsZSB7CisgIGludCBNZW1iZXI7CitwdWJsaWM6CisgIC8vIENUUkdFTi1MQUJFTDogZGVmaW5lIHt7Lip9fSBAX1pONlNpbXBsZUMyRWkoCisgIC8vIENUUlVTRS1MQUJFTDogZGVmaW5lIHt7Lip9fSBAX1pONlNpbXBsZUMyRWkoCisgIC8vIENUUkdFTjogc3RvcmUge3suKn19IEBbW1NDQzpfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19fWk42U2ltcGxlQzJFaV1dLCBpNjQgMCwgaTY0IDAKKyAgZXhwbGljaXQgU2ltcGxlKGludCBNZW1iZXIpIDogTWVtYmVyKE1lbWJlcikgeworICAgIC8vIENUUkdFTjogc3RvcmUge3suKn19IEBbW1NDQ11dLCBpNjQgMCwgaTY0IDEKKyAgICAvLyBDVFJVU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tTQzE6WzAtOV0rXV0KKyAgICBpZiAoTWVtYmVyKSB7fQorICAgIC8vIENUUkdFTi1OT1Q6IHN0b3JlIHt7Lip9fSBAW1tTQ0NdXSwKKyAgICAvLyBDVFJVU0UtTk9UOiBiciB7ey4qfX0gIXByb2YgIVswLTldKworICAgIC8vIENUUlVTRTogcmV0CisgIH0KKyAgLy8gQ1RSVVNFOiAhW1tTQzFdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAxMDAsIGkzMiAyfQorCisgIC8vIERUUkdFTi1MQUJFTDogZGVmaW5lIHt7Lip9fSBAX1pONlNpbXBsZUQyRXYoCisgIC8vIERUUlVTRS1MQUJFTDogZGVmaW5lIHt7Lip9fSBAX1pONlNpbXBsZUQyRXYoCisgIC8vIERUUkdFTjogc3RvcmUge3suKn19IEBbW1NEQzpfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19fWk42U2ltcGxlRDJFdl1dLCBpNjQgMCwgaTY0IDAKKyAgflNpbXBsZSgpIHsKKyAgICAvLyBEVFJHRU46IHN0b3JlIHt7Lip9fSBAW1tTRENdXSwgaTY0IDAsIGk2NCAxCisgICAgLy8gRFRSVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbU0QxOlswLTldK11dCisgICAgaWYgKE1lbWJlcikge30KKyAgICAvLyBEVFJHRU4tTk9UOiBzdG9yZSB7ey4qfX0gQFtbU0RDXV0sCisgICAgLy8gRFRSVVNFLU5PVDogYnIge3suKn19ICFwcm9mICFbMC05XSsKKyAgICAvLyBEVFJVU0U6IHJldAorICB9CisgIC8vIERUUlVTRTogIVtbU0QxXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMTAwLCBpMzIgMn0KKworICAvLyBNVEhHRU4tTEFCRUw6IGRlZmluZSB7ey4qfX0gQF9aTjZTaW1wbGU2bWV0aG9kRXYoCisgIC8vIE1USFVTRS1MQUJFTDogZGVmaW5lIHt7Lip9fSBAX1pONlNpbXBsZTZtZXRob2RFdigKKyAgLy8gTVRIR0VOOiBzdG9yZSB7ey4qfX0gQFtbU01DOl9fbGx2bV9wcm9maWxlX2NvdW50ZXJzX19aTjZTaW1wbGU2bWV0aG9kRXZdXSwgaTY0IDAsIGk2NCAwCisgIHZvaWQgbWV0aG9kKCkgeworICAgIC8vIE1USEdFTjogc3RvcmUge3suKn19IEBbW1NNQ11dLCBpNjQgMCwgaTY0IDEKKyAgICAvLyBNVEhVU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tTTTE6WzAtOV0rXV0KKyAgICBpZiAoTWVtYmVyKSB7fQorICAgIC8vIE1USEdFTi1OT1Q6IHN0b3JlIHt7Lip9fSBAW1tTTUNdXSwKKyAgICAvLyBNVEhVU0UtTk9UOiBiciB7ey4qfX0gIXByb2YgIVswLTldKworICAgIC8vIE1USFVTRTogcmV0CisgIH0KKyAgLy8gTVRIVVNFOiAhW1tTTTFdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAxMDAsIGkzMiAyfQorfTsKKworLy8gV1JQR0VOLUxBQkVMOiBkZWZpbmUge3suKn19IEBfWjE0c2ltcGxlX3dyYXBwZXJ2KAorLy8gV1JQVVNFLUxBQkVMOiBkZWZpbmUge3suKn19IEBfWjE0c2ltcGxlX3dyYXBwZXJ2KAorLy8gV1JQR0VOOiBzdG9yZSB7ey4qfX0gQFtbU1dDOl9fbGx2bV9wcm9maWxlX2NvdW50ZXJzX19aMTRzaW1wbGVfd3JhcHBlcnZdXSwgaTY0IDAsIGk2NCAwCit2b2lkIHNpbXBsZV93cmFwcGVyKCkgeworICAvLyBXUlBHRU46IHN0b3JlIHt7Lip9fSBAW1tTV0NdXSwgaTY0IDAsIGk2NCAxCisgIC8vIFdSUFVTRTogYnIge3suKn19ICFwcm9mICFbW1NXMTpbMC05XStdXQorICBmb3IgKGludCBJID0gMDsgSSA8IDEwMDsgKytJKSB7CisgICAgU2ltcGxlIFMoSSk7CisgICAgUy5tZXRob2QoKTsKKyAgfQorICAvLyBXUlBHRU4tTk9UOiBzdG9yZSB7ey4qfX0gQFtbU1dDXV0sCisgIC8vIFdSUFVTRS1OT1Q6IGJyIHt7Lip9fSAhcHJvZiAhWzAtOV0rCisgIC8vIFdSUFVTRTogcmV0Cit9CisvLyBXUlBVU0U6ICFbW1NXMV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDEwMSwgaTMyIDJ9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgc2ltcGxlX3dyYXBwZXIoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1Byb2ZpbGUvY3h4LWxpbmthZ2UuY3BwIGIvdGVzdC9Qcm9maWxlL2N4eC1saW5rYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGMxOTgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Qcm9maWxlL2N4eC1saW5rYWdlLmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtbWFjb3N4MTAuOS4wIC1lbWl0LWxsdm0gLW1haW4tZmlsZS1uYW1lIGN4eC1saW5rYWdlLmNwcCAlcyAtbyAtIC1mcHJvZmlsZS1pbnN0ci1nZW5lcmF0ZSB8IEZpbGVDaGVjayAlcworCisvLyBDSEVDSzogQF9fbGx2bV9wcm9maWxlX3J1bnRpbWUgPSBleHRlcm5hbCBnbG9iYWwgaTMyCisvLyBDSEVDSzogQF9fbGx2bV9wcm9maWxlX2NvdW50ZXJzX19aM2Zvb3YgPSBnbG9iYWwgWzEgeCBpNjRdIHplcm9pbml0aWFsaXplciwgc2VjdGlvbiAiX19EQVRBLF9fbGx2bV9wcmZfY250cyIsIGFsaWduIDgKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfbmFtZV9fWjNmb292ID0gY29uc3RhbnQgWzcgeCBpOF0gYyJfWjNmb292Iiwgc2VjdGlvbiAiX19EQVRBLF9fbGx2bV9wcmZfbmFtZXMiLCBhbGlnbiAxCisvLyBDSEVDSzogQF9fbGx2bV9wcm9maWxlX2RhdGFfX1ozZm9vdiA9IGNvbnN0YW50IHsgaTMyLCBpMzIsIGk2NCwgaTgqLCBpNjQqIH0geyBpMzIgNywgaTMyIDEsIGk2NCAxLCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzcgeCBpOF0qIEBfX2xsdm1fcHJvZmlsZV9uYW1lX19aM2Zvb3YsIGkzMiAwLCBpMzIgMCksIGk2NCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEgeCBpNjRdKiBAX19sbHZtX3Byb2ZpbGVfY291bnRlcnNfX1ozZm9vdiwgaTMyIDAsIGkzMiAwKSB9LCBzZWN0aW9uICJfX0RBVEEsX19sbHZtX3ByZl9kYXRhIiwgYWxpZ24gOAordm9pZCBmb28odm9pZCkgeyB9CisKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfY291bnRlcnNfX1o4Zm9vX3dlYWt2ID0gd2VhayBnbG9iYWwgWzUgeCBpNjRdIHplcm9pbml0aWFsaXplciwgc2VjdGlvbiAiX19EQVRBLF9fbGx2bV9wcmZfY250cyIsIGFsaWduIDgKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfbmFtZV9fWjhmb29fd2Vha3YgPSB3ZWFrIGNvbnN0YW50IFsxMiB4IGk4XSBjIl9aOGZvb193ZWFrdiIsIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX25hbWVzIiwgYWxpZ24gMQorLy8gQ0hFQ0s6IEBfX2xsdm1fcHJvZmlsZV9kYXRhX19aOGZvb193ZWFrdiA9IHdlYWsgY29uc3RhbnQgeyBpMzIsIGkzMiwgaTY0LCBpOCosIGk2NCogfSB7IGkzMiAxMiwgaTMyIDUsIGk2NCA1LCBpOCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzEyIHggaThdKiBAX19sbHZtX3Byb2ZpbGVfbmFtZV9fWjhmb29fd2Vha3YsIGkzMiAwLCBpMzIgMCksIGk2NCogZ2V0ZWxlbWVudHB0ciBpbmJvdW5kcyAoWzUgeCBpNjRdKiBAX19sbHZtX3Byb2ZpbGVfY291bnRlcnNfX1o4Zm9vX3dlYWt2LCBpMzIgMCwgaTMyIDApIH0sIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX2RhdGEiLCBhbGlnbiA4Cit2b2lkIGZvb193ZWFrKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWspKTsKK3ZvaWQgZm9vX3dlYWsodm9pZCkgeyBpZiAoMCl7fSBpZiAoMCl7fSBpZiAoMCl7fSBpZiAoMCl7fSB9CisKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfY291bnRlcnNfbWFpbiA9IGdsb2JhbCBbMSB4IGk2NF0gemVyb2luaXRpYWxpemVyLCBzZWN0aW9uICJfX0RBVEEsX19sbHZtX3ByZl9jbnRzIiwgYWxpZ24gOAorLy8gQ0hFQ0s6IEBfX2xsdm1fcHJvZmlsZV9uYW1lX21haW4gPSBjb25zdGFudCBbNCB4IGk4XSBjIm1haW4iLCBzZWN0aW9uICJfX0RBVEEsX19sbHZtX3ByZl9uYW1lcyIsIGFsaWduIDEKKy8vIENIRUNLOiBAX19sbHZtX3Byb2ZpbGVfZGF0YV9tYWluID0gY29uc3RhbnQgeyBpMzIsIGkzMiwgaTY0LCBpOCosIGk2NCogfSB7IGkzMiA0LCBpMzIgMSwgaTY0IDEsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbNCB4IGk4XSogQF9fbGx2bV9wcm9maWxlX25hbWVfbWFpbiwgaTMyIDAsIGkzMiAwKSwgaTY0KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMSB4IGk2NF0qIEBfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19tYWluLCBpMzIgMCwgaTMyIDApIH0sIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX2RhdGEiLCBhbGlnbiA4CitpbmxpbmUgdm9pZCBmb29faW5saW5lKHZvaWQpOworaW50IG1haW4odm9pZCkgeworICBmb28oKTsKKyAgZm9vX2lubGluZSgpOworICBmb29fd2VhaygpOworICByZXR1cm4gMDsKK30KKworLy8gQ0hFQ0s6IEBfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19fWjEwZm9vX2lubGluZXYgPSBsaW5rb25jZV9vZHIgZ2xvYmFsIFs3IHggaTY0XSB6ZXJvaW5pdGlhbGl6ZXIsIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX2NudHMiLCBhbGlnbiA4CisvLyBDSEVDSzogQF9fbGx2bV9wcm9maWxlX25hbWVfX1oxMGZvb19pbmxpbmV2ID0gbGlua29uY2Vfb2RyIGNvbnN0YW50IFsxNSB4IGk4XSBjIl9aMTBmb29faW5saW5ldiIsIHNlY3Rpb24gIl9fREFUQSxfX2xsdm1fcHJmX25hbWVzIiwgYWxpZ24gMQorLy8gQ0hFQ0s6IEBfX2xsdm1fcHJvZmlsZV9kYXRhX19aMTBmb29faW5saW5ldiA9IGxpbmtvbmNlX29kciBjb25zdGFudCB7IGkzMiwgaTMyLCBpNjQsIGk4KiwgaTY0KiB9IHsgaTMyIDE1LCBpMzIgNywgaTY0IDcsIGk4KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbMTUgeCBpOF0qIEBfX2xsdm1fcHJvZmlsZV9uYW1lX19aMTBmb29faW5saW5ldiwgaTMyIDAsIGkzMiAwKSwgaTY0KiBnZXRlbGVtZW50cHRyIGluYm91bmRzIChbNyB4IGk2NF0qIEBfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19fWjEwZm9vX2lubGluZXYsIGkzMiAwLCBpMzIgMCkgfSwgc2VjdGlvbiAiX19EQVRBLF9fbGx2bV9wcmZfZGF0YSIsIGFsaWduIDgKK2lubGluZSB2b2lkIGZvb19pbmxpbmUodm9pZCkgeyBpZiAoMCl7fSBpZiAoMCl7fSBpZiAoMCl7fSBpZiAoMCl7fSBpZiAoMCl7fSBpZiAoMCl7fX0KKworLy8gQ0hFQ0s6IEBsbHZtLnVzZWQgPSBhcHBlbmRpbmcgZ2xvYmFsIFs1IHggaTgqXSBbaTgqIGJpdGNhc3QgKGkzMiAoKSogQF9fbGx2bV9wcm9maWxlX3J1bnRpbWVfdXNlciB0byBpOCopLCBpOCogYml0Y2FzdCAoeyBpMzIsIGkzMiwgaTY0LCBpOCosIGk2NCogfSogQF9fbGx2bV9wcm9maWxlX2RhdGFfX1ozZm9vdiB0byBpOCopLCBpOCogYml0Y2FzdCAoeyBpMzIsIGkzMiwgaTY0LCBpOCosIGk2NCogfSogQF9fbGx2bV9wcm9maWxlX2RhdGFfX1o4Zm9vX3dlYWt2IHRvIGk4KiksIGk4KiBiaXRjYXN0ICh7IGkzMiwgaTMyLCBpNjQsIGk4KiwgaTY0KiB9KiBAX19sbHZtX3Byb2ZpbGVfZGF0YV9tYWluIHRvIGk4KiksIGk4KiBiaXRjYXN0ICh7IGkzMiwgaTMyLCBpNjQsIGk4KiwgaTY0KiB9KiBAX19sbHZtX3Byb2ZpbGVfZGF0YV9fWjEwZm9vX2lubGluZXYgdG8gaTgqKV0sIHNlY3Rpb24gImxsdm0ubWV0YWRhdGEiCisKKy8vIENIRUNLOiBkZWZpbmUgbGlua29uY2Vfb2RyIGkzMiBAX19sbHZtX3Byb2ZpbGVfcnVudGltZV91c2VyKCkge3suKn19IHsKKy8vIENIRUNLOiAgICVbW1JFRzouKl1dID0gbG9hZCBpMzIqIEBfX2xsdm1fcHJvZmlsZV9ydW50aW1lCisvLyBDSEVDSzogICByZXQgaTMyICVbW1JFR11dCisvLyBDSEVDSzogfQpkaWZmIC0tZ2l0IGEvdGVzdC9Qcm9maWxlL2N4eC10aHJvd3MuY3BwIGIvdGVzdC9Qcm9maWxlL2N4eC10aHJvd3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2Y1M2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1Byb2ZpbGUvY3h4LXRocm93cy5jcHAKQEAgLTAsMCArMSw3MiBAQAorLy8gVGVzdCBpbnN0cnVtZW50YXRpb24gb2YgQysrIGV4Y2VwdGlvbiBoYW5kbGluZyBjb25zdHJ1Y3RzLgorCisvLyBGSVhNRTogRG9uJ3Qgc2VlayBiYiBsYWJlbHMsIGxpa2UgImlmLmVsc2UiCisvLyBSRVFVSVJFUzogYXNzZXJ0cworCisvLyBSVU46ICVjbGFuZ3h4ICVzIC1vIC0gLWVtaXQtbGx2bSAtUyAtZnByb2ZpbGUtaW5zdHItZ2VuZXJhdGUgLXRhcmdldCAlaXRhbml1bV9hYmlfdHJpcGxlIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9UEdPR0VOICVzCisvLyBSVU46ICVjbGFuZ3h4ICVzIC1vIC0gLWVtaXQtbGx2bSAtUyAtZnByb2ZpbGUtaW5zdHItZ2VuZXJhdGUgLXRhcmdldCAlaXRhbml1bV9hYmlfdHJpcGxlIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9UEdPR0VOLUVYQyAlcworCisvLyBSVU46ICVjbGFuZyAlcyAtbyAtIC1lbWl0LWxsdm0gLVMgLWZwcm9maWxlLWluc3RyLXVzZT0lUy9JbnB1dHMvY3h4LXRocm93cy5wcm9mZGF0YSAtdGFyZ2V0ICVpdGFuaXVtX2FiaV90cmlwbGUgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1QR09VU0UgJXMKKy8vIFJVTjogJWNsYW5nICVzIC1vIC0gLWVtaXQtbGx2bSAtUyAtZnByb2ZpbGUtaW5zdHItdXNlPSVTL0lucHV0cy9jeHgtdGhyb3dzLnByb2ZkYXRhIC10YXJnZXQgJWl0YW5pdW1fYWJpX3RyaXBsZSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVBHT1VTRS1FWEMgJXMKKworLy8gUEdPR0VOOiBAW1tUSEM6X19sbHZtX3Byb2ZpbGVfY291bnRlcnNfX1o2dGhyb3dzdl1dID0gZ2xvYmFsIFs5IHggaTY0XSB6ZXJvaW5pdGlhbGl6ZXIKKy8vIFBHT0dFTi1FWEM6IEBbW1RIQzpfX2xsdm1fcHJvZmlsZV9jb3VudGVyc19fWjZ0aHJvd3N2XV0gPSBnbG9iYWwgWzkgeCBpNjRdIHplcm9pbml0aWFsaXplcgorCisvLyBQR09HRU4tTEFCRUw6IEBfWjZ0aHJvd3N2KCkKKy8vIFBHT1VTRS1MQUJFTDogQF9aNnRocm93c3YoKQorLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbVEhDXV0sIGk2NCAwLCBpNjQgMAordm9pZCB0aHJvd3MoKSB7CisgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW1RIQ11dLCBpNjQgMCwgaTY0IDEKKyAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbVEgxOlswLTldK11dCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICB0cnkgeworICAgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbVEhDXV0sIGk2NCAwLCBpNjQgMworICAgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbVEgyOlswLTldK11dCisgICAgICBpZiAoaSAlIDMpIHsKKyAgICAgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbVEhDXV0sIGk2NCAwLCBpNjQgNAorICAgICAgICAvLyBQR09VU0U6IGJyIHt7Lip9fSAhcHJvZiAhW1tUSDM6WzAtOV0rXV0KKyAgICAgICAgaWYgKGkgPCA1MCkKKyAgICAgICAgICB0aHJvdyAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGNhdGNoIGJsb2NrIG1heSBiZSBlbWl0dGVkIGFmdGVyIHRoZSB0aHJvdyBhYm92ZSwgd2UgY2FuIHNraXAgaXQKKyAgICAgICAgLy8gYnkgbG9va2luZyBmb3IgYW4gZWxzZSBibG9jaywgYnV0IHRoaXMgd2lsbCBicmVhayBpZiBhbnlvbmUgcHV0cyBhbgorICAgICAgICAvLyBlbHNlIGluIHRoZSBjYXRjaAorICAgICAgICAvLyBQR09VU0U6IGlmLmVsc2V7ey4qfX06CisgICAgICAgIC8vIFBHT0dFTjogaWYuZWxzZXt7Lip9fToKKworICAgICAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tUSENdXSwgaTY0IDAsIGk2NCA1CisgICAgICAgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW1RINDpbMC05XStdXQorICAgICAgICBpZiAoaSA+PSA1MCkKKyAgICAgICAgICB0aHJvdyAwOworICAgICAgfQorICAgIH0gY2F0Y2ggKGludCBlKSB7CisgICAgICAvLyBQR09VU0UtRVhDOiBjYXRjaHt7Lip9fToKKyAgICAgIC8vIFBHT0dFTi1FWEM6IGNhdGNoe3suKn19OgorCisgICAgICAvLyBQR09HRU4tRVhDOiBzdG9yZSB7ey4qfX0gQFtbVEhDXV0sIGk2NCAwLCBpNjQgNgorICAgICAgLy8gUEdPR0VOLUVYQzogc3RvcmUge3suKn19IEBbW1RIQ11dLCBpNjQgMCwgaTY0IDcKKyAgICAgIC8vIFBHT1VTRS1FWEM6IGJyIHt7Lip9fSAhcHJvZiAhW1tUSDU6WzAtOV0rXV0KKyAgICAgIGlmIChlKSB7fQorICAgIH0KKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tUSENdXSwgaTY0IDAsIGk2NCAyCisKKyAgICAvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tUSENdXSwgaTY0IDAsIGk2NCA4CisgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbVEg2OlswLTldK11dCisgICAgaWYgKGkgPCAxMDApIHt9CisgIH0KKworICAvLyBQR09VU0UtTk9UOiBiciB7ey4qfX0gIXByb2YgIVswLTldKworICAvLyBQR09VU0U6IHJldCB2b2lkCit9CisKKy8vIFBHT1VTRS1EQUc6ICFbW1RIMV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDEwMSwgaTMyIDJ9CisvLyBQR09VU0UtREFHOiAhW1tUSDJdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiA2NywgaTMyIDM1fQorLy8gUEdPVVNFLURBRzogIVtbVEgzXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMzQsIGkzMiAzNH0KKy8vIFBHT1VTRS1EQUc6ICFbW1RINF1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDE4LCBpMzIgMTh9CisvLyBQR09VU0UtRVhDOiAhW1tUSDVdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAzNCwgaTMyIDE4fQorLy8gUEdPVVNFLURBRzogIVtbVEg2XV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMTAxLCBpMzIgMX0KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICB0aHJvd3MoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1Byb2ZpbGUvb2JqYy1nZW5lcmFsLm0gYi90ZXN0L1Byb2ZpbGUvb2JqYy1nZW5lcmFsLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4ZTVlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUHJvZmlsZS9vYmpjLWdlbmVyYWwubQpAQCAtMCwwICsxLDczIEBACisvLyBUZXN0IGluc3RydW1lbnRhdGlvbiBvZiBnZW5lcmFsIGNvbnN0cnVjdHMgaW4gb2JqZWN0aXZlIEMuCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1tYWNvc3gxMC45IC1tYWluLWZpbGUtbmFtZSBvYmpjLWdlbmVyYWwubSAlcyAtbyAtIC1lbWl0LWxsdm0gLWZibG9ja3MgLWZwcm9maWxlLWluc3RyLWdlbmVyYXRlIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9UEdPR0VOICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtbWFjb3N4MTAuOSAtbWFpbi1maWxlLW5hbWUgb2JqYy1nZW5lcmFsLm0gJXMgLW8gLSAtZW1pdC1sbHZtIC1mYmxvY2tzIC1mcHJvZmlsZS1pbnN0ci11c2U9JVMvSW5wdXRzL29iamMtZ2VuZXJhbC5wcm9mZGF0YSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PVBHT1VTRSAlcworCisjaWZkZWYgSEFWRV9GT1VOREFUSU9OCisKKy8vIFVzZSB0aGlzIHRvIGJ1aWxkIGFuIGluc3RydW1lbnRlZCB2ZXJzaW9uIHRvIHJlZ2VuZXJhdGUgdGhlIGlucHV0IGZpbGUuCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2Vsc2UKKworLy8gTWluaW1hbCBkZWZpbml0aW9ucyB0byBnZXQgdGhpcyB0byBjb21waWxlIHdpdGhvdXQgRm91bmRhdGlvbi5oLgorCitAcHJvdG9jb2wgTlNPYmplY3QKK0BlbmQKKworQGludGVyZmFjZSBOU09iamVjdCA8TlNPYmplY3Q+CistIChpZClpbml0OworKyAoaWQpYWxsb2M7CitAZW5kCisKK3N0cnVjdCBOU0Zhc3RFbnVtZXJhdGlvblN0YXRlOworQGludGVyZmFjZSBOU0FycmF5IDogTlNPYmplY3QKKy0gKHVuc2lnbmVkIGxvbmcpIGNvdW50QnlFbnVtZXJhdGluZ1dpdGhTdGF0ZTogKHN0cnVjdCBOU0Zhc3RFbnVtZXJhdGlvblN0YXRlKikgc3RhdGUKKyAgICAgICAgICAgICAgICAgIG9iamVjdHM6IChpZCopIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgY291bnQ6ICh1bnNpZ25lZCBsb25nKSBidWZmZXJTaXplOworKyhOU0FycmF5KikgYXJyYXlXaXRoT2JqZWN0czogKGlkKSBmaXJzdCwgLi4uOworQGVuZDsKKyNlbmRpZgorCisvLyBQR09HRU46IEBbW0ZSQzoiX19sbHZtX3Byb2ZpbGVfY291bnRlcnNfXCtcW0EgZm9yZWFjaDpcXSJdXSA9IGludGVybmFsIGdsb2JhbCBbMiB4IGk2NF0gemVyb2luaXRpYWxpemVyCisvLyBQR09HRU46IEBbW0JMQzoiX19sbHZtX3Byb2ZpbGVfY291bnRlcnNfX18xM1wrXFtBIGZvcmVhY2g6XF1fYmxvY2tfaW52b2tlIl1dID0gaW50ZXJuYWwgZ2xvYmFsIFsyIHggaTY0XSB6ZXJvaW5pdGlhbGl6ZXIKKy8vIFBHT0dFTjogQFtbTUFDOl9fbGx2bV9wcm9maWxlX2NvdW50ZXJzX21haW5dXSA9IGdsb2JhbCBbMSB4IGk2NF0gemVyb2luaXRpYWxpemVyCisKK0BpbnRlcmZhY2UgQSA6IE5TT2JqZWN0CisrICh2b2lkKWZvcmVhY2g6IChOU0FycmF5ICopYXJyYXk7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBBCisvLyBQR09HRU46IGRlZmluZSB7ey4qfX0rW0EgZm9yZWFjaDpdCisvLyBQR09VU0U6IGRlZmluZSB7ey4qfX0rW0EgZm9yZWFjaDpdCisvLyBQR09HRU46IHN0b3JlIHt7Lip9fSBAW1tGUkNdXSwgaTY0IDAsIGk2NCAwCisrICh2b2lkKWZvcmVhY2g6IChOU0FycmF5ICopYXJyYXkKK3sKKyAgX19ibG9jayBpZCByZXN1bHQ7CisgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0ZSQ11dLCBpNjQgMCwgaTY0IDEKKyAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbRlIxOlswLTldK11dCisgIC8vIFBHT1VTRTogYnIge3suKn19ICFwcm9mICFbW0ZSMjpbMC05XStdXQorICBmb3IgKGlkIHggaW4gYXJyYXkpIHsKKyAgICAvLyBQR09HRU46IGRlZmluZSB7ey4qfX1fYmxvY2tfaW52b2tlCisgICAgLy8gUEdPVVNFOiBkZWZpbmUge3suKn19X2Jsb2NrX2ludm9rZQorICAgIC8vIFBHT0dFTjogc3RvcmUge3suKn19IEBbW0JMQ11dLCBpNjQgMCwgaTY0IDAKKyAgICBeeyBzdGF0aWMgaW50IGluaXQgPSAwOworICAgICAgLy8gUEdPR0VOOiBzdG9yZSB7ey4qfX0gQFtbQkxDXV0sIGk2NCAwLCBpNjQgMQorICAgICAgLy8gUEdPVVNFOiBiciB7ey4qfX0gIXByb2YgIVtbQkwxOlswLTldK11dCisgICAgICAgaWYgKGluaXQpCisgICAgICAgICByZXN1bHQgPSB4OworICAgICAgIGluaXQgPSAxOyB9KCk7CisgIH0KK30KK0BlbmQKKworLy8gUEdPVVNFLURBRzogIVtbRlIxXV0gPSBtZXRhZGF0YSAhe21ldGFkYXRhICEiYnJhbmNoX3dlaWdodHMiLCBpMzIgMiwgaTMyIDN9CisvLyBQR09VU0UtREFHOiAhW1tGUjJdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJicmFuY2hfd2VpZ2h0cyIsIGkzMiAzLCBpMzIgMn0KKy8vIFBHT1VTRS1EQUc6ICFbW0JMMV1dID0gbWV0YWRhdGEgIXttZXRhZGF0YSAhImJyYW5jaF93ZWlnaHRzIiwgaTMyIDIsIGkzMiAyfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIEEgKmEgPSBbW0EgYWxsb2NdIGluaXRdOworICBOU0FycmF5ICphcnJheSA9IFtOU0FycmF5IGFycmF5V2l0aE9iamVjdHM6IEAiMCIsIEAiMSIsICh2b2lkKikwXTsKKyAgW0EgZm9yZWFjaDogYXJyYXldOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvUmV3cml0ZXIvZGxsaW1wb3J0LXR5cGVkZWYuYyBiL3Rlc3QvUmV3cml0ZXIvZGxsaW1wb3J0LXR5cGVkZWYuYwppbmRleCA5NzYxMGRkLi5iNTg3ZjE2IDEwMDY0NAotLS0gYS90ZXN0L1Jld3JpdGVyL2RsbGltcG9ydC10eXBlZGVmLmMKKysrIGIvdGVzdC9SZXdyaXRlci9kbGxpbXBvcnQtdHlwZWRlZi5jCkBAIC0xMCw3ICsxMCw3IEBACiB2b2lkIGJhcigpIHsgcmV0dXJuIDE7IH0KIAogLy8gQ0hFQ0stTkVHOiBlcnJvcjogdm9pZCBmdW5jdGlvbiAnYmFyJyBzaG91bGQgbm90IHJldHVybiBhIHZhbHVlCi0vLyBDSEVDSy1ORUc6IDEgZXJyb3IgZ2VuZXJhdGVkCisvLyBDSEVDSy1ORUc6IHt7Xn19MSBlcnJvciBnZW5lcmF0ZWQKIC8vIENIRUNLLVBPUzogd2FybmluZzogJ2RsbGltcG9ydCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucwogLy8gQ0hFQ0stUE9TOiBlcnJvcjogdm9pZCBmdW5jdGlvbiAnYmFyJyBzaG91bGQgbm90IHJldHVybiBhIHZhbHVlCiAvLyBDSEVDSy1QT1M6IDEgd2FybmluZyBhbmQgMSBlcnJvciBnZW5lcmF0ZWQKZGlmZiAtLWdpdCBhL3Rlc3QvUmV3cml0ZXIvbWlzc2luZy1kbGxpbXBvcnQuYyBiL3Rlc3QvUmV3cml0ZXIvbWlzc2luZy1kbGxpbXBvcnQuYwppbmRleCAxMjc5ODliLi4xZTQ2ODlmIDEwMDY0NAotLS0gYS90ZXN0L1Jld3JpdGVyL21pc3NpbmctZGxsaW1wb3J0LmMKKysrIGIvdGVzdC9SZXdyaXRlci9taXNzaW5nLWRsbGltcG9ydC5jCkBAIC0xMyw3ICsxMyw3IEBACiAKIC8vIENIRUNLLU5FRzogZXJyb3I6IHZvaWQgZnVuY3Rpb24gJ2Jhcicgc2hvdWxkIG5vdCByZXR1cm4gYSB2YWx1ZQogLy8gQ0hFQ0stTkVHOiAxIGVycm9yIGdlbmVyYXRlZAotLy8gQ0hFQ0stUE9TOiB3YXJuaW5nOiAnZm9vJyByZWRlY2xhcmVkIHdpdGhvdXQgZGxsaW1wb3J0IGF0dHJpYnV0ZTogcHJldmlvdXMgZGxsaW1wb3J0IGlnbm9yZWQKKy8vIENIRUNLLVBPUzogd2FybmluZzogJ2ZvbycgcmVkZWNsYXJlZCB3aXRob3V0ICdkbGxpbXBvcnQnIGF0dHJpYnV0ZTogcHJldmlvdXMgJ2RsbGltcG9ydCcgaWdub3JlZAogLy8gQ0hFQ0stUE9TOiBlcnJvcjogdm9pZCBmdW5jdGlvbiAnYmFyJyBzaG91bGQgbm90IHJldHVybiBhIHZhbHVlCiAvLyBDSEVDSy1QT1M6IDEgd2FybmluZyBhbmQgMSBlcnJvciBnZW5lcmF0ZWQKIApkaWZmIC0tZ2l0IGEvdGVzdC9SZXdyaXRlci9uby1pbnRlZ3JhdGVkLXByZXByb2Nlc3NpbmctNjRiaXQubSBiL3Rlc3QvUmV3cml0ZXIvbm8taW50ZWdyYXRlZC1wcmVwcm9jZXNzaW5nLTY0Yml0Lm0KaW5kZXggNjMxODQ0OS4uZWE2M2MwYiAxMDA2NDQKLS0tIGEvdGVzdC9SZXdyaXRlci9uby1pbnRlZ3JhdGVkLXByZXByb2Nlc3NpbmctNjRiaXQubQorKysgYi90ZXN0L1Jld3JpdGVyL25vLWludGVncmF0ZWQtcHJlcHJvY2Vzc2luZy02NGJpdC5tCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtdW5rb3duLXVua25vd24gLWZtcy1leHRlbnNpb25zIC1yZXdyaXRlLW9iamMgJXMgLW8gLSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtdW5rbm93bi11bmtub3duIC1mbXMtZXh0ZW5zaW9ucyAtcmV3cml0ZS1vYmpjICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIC8vIHJkYXI6Ly8xMjE4OTc5MwogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL3Rlc3QvUmV3cml0ZXIvbm8taW50ZWdyYXRlZC1wcmVwcm9jZXNzaW5nLm0gYi90ZXN0L1Jld3JpdGVyL25vLWludGVncmF0ZWQtcHJlcHJvY2Vzc2luZy5tCmluZGV4IGU0Y2MzMDEuLmJjMjdhNjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvUmV3cml0ZXIvbm8taW50ZWdyYXRlZC1wcmVwcm9jZXNzaW5nLm0KKysrIGIvdGVzdC9SZXdyaXRlci9uby1pbnRlZ3JhdGVkLXByZXByb2Nlc3NpbmcubQpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nIC1hcmNoIGkzODYgLWZtcy1leHRlbnNpb25zIC1yZXdyaXRlLW9iamMgJXMgLW8gJXQtcncuY3BwCisvLyBSVU46ICVjbGFuZyAtdGFyZ2V0IGkzODYtdW5rbm93bi11bmtub3duIC1mbXMtZXh0ZW5zaW9ucyAtcmV3cml0ZS1vYmpjICVzIC1vICV0LXJ3LmNwcAogLy8gUlVOOiBGaWxlQ2hlY2sgJXMgPCAldC1ydy5jcHAKIC8vIHJkYXI6Ly8xMjE4OTc5MwogCkBAIC0yMyw0ICsyMyw0IEBACiAvLyBDSEVDSzogc3RhdGljIHN0cnVjdCBfY2xhc3Nfcm9fdCBfT0JKQ19DTEFTU19ST18kX01ZSU5URgogLy8gQ0hFQ0stTkVYVDogMCwgMCwgMCwKIC8vIENIRUNLLU5FWFQ6IDAsCi0vLyBDSEVDSy1ORVNUOiAiTVlJTlRGIiwKKy8vIENIRUNLLU5FWFQ6ICJNWUlOVEYiLApkaWZmIC0tZ2l0IGEvdGVzdC9SZXdyaXRlci9wcm90b2NvbC1yZXdyaXRlLTEubSBiL3Rlc3QvUmV3cml0ZXIvcHJvdG9jb2wtcmV3cml0ZS0xLm0KaW5kZXggNTQxYjdlZS4uMGM1MTA0ZiAxMDA2NDQKLS0tIGEvdGVzdC9SZXdyaXRlci9wcm90b2NvbC1yZXdyaXRlLTEubQorKysgYi90ZXN0L1Jld3JpdGVyL3Byb3RvY29sLXJld3JpdGUtMS5tCkBAIC0xLDQgKzEsNyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1yZXdyaXRlLW9iamMgLWZvYmpjLXJ1bnRpbWU9bWFjb3N4LWZyYWdpbGUtMTAuNSAgJXMgLW8gLQorLy8gUlVOOiAlY2xhbmdfY2MxIC14IG9iamVjdGl2ZS1jIC1Xbm8tb2JqYy1yb290LWNsYXNzIC1mbXMtZXh0ZW5zaW9ucyAtcmV3cml0ZS1vYmpjICVzIC1vICV0LXJ3LmNwcAorLy8gUlVOOiBGaWxlQ2hlY2sgIC0taW5wdXQtZmlsZT0ldC1ydy5jcHAgJXMKKy8vIHJkYXI6Ly85ODQ2NzU5CisvLyByZGFyOi8vMTU1MTc4OTUKIAogdHlwZWRlZiBzdHJ1Y3QgTXlXaWRnZXQgewogICBpbnQgYTsKQEAgLTQ2LDMgKzQ5LDI1IEBACiAKICAgcmV0dXJuIDA7CiB9CisKKy8vIHJkYXI6Ly8xNTUxNzg5NQorQGNsYXNzIE5TT2JqZWN0OworCitAaW50ZXJmYWNlIE5TUHJvdG9jb2xDaGVja2VyCisrIChpZClwcm90b2NvbENoZWNrZXJXaXRoVGFyZ2V0OihOU09iamVjdCAqKWFuT2JqZWN0IHByb3RvY29sOihQcm90b2NvbCAqKWFQcm90b2NvbDsKK0BlbmQKKworQHByb3RvY29sIE5TQ29ubmVjdGlvblZlcnNpb25lZFByb3RvY29sCitAZW5kCisKKworQGludGVyZmFjZSBOU0Nvbm5lY3Rpb24gQGVuZAorCitAaW1wbGVtZW50YXRpb24gTlNDb25uZWN0aW9uCistICh2b2lkKSBNZXRoIHsKKyAgW05TUHJvdG9jb2xDaGVja2VyIHByb3RvY29sQ2hlY2tlcldpdGhUYXJnZXQ6MCBwcm90b2NvbDpAcHJvdG9jb2woTlNDb25uZWN0aW9uVmVyc2lvbmVkUHJvdG9jb2wpXTsKK30KK0BlbmQKKworLy8gQ0hFQ0s6IHN0YXRpYyBzdHJ1Y3QgX3Byb3RvY29sX3QgKl9PQkpDX1BST1RPQ09MX1JFRkVSRU5DRV8kX05TQ29ubmVjdGlvblZlcnNpb25lZFByb3RvY29sID0gJl9PQkpDX1BST1RPQ09MX05TQ29ubmVjdGlvblZlcnNpb25lZFByb3RvY29sCisvLyBDSEVDSzogc2VsX3JlZ2lzdGVyTmFtZSgicHJvdG9jb2xDaGVja2VyV2l0aFRhcmdldDpwcm90b2NvbDoiKSwgKE5TT2JqZWN0ICopMCwgKFByb3RvY29sICopX09CSkNfUFJPVE9DT0xfUkVGRVJFTkNFXyRfTlNDb25uZWN0aW9uVmVyc2lvbmVkUHJvdG9jb2wKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS8yMDA3LTEwLTAxLUJ1aWxkQXJyYXlSZWYuYyBiL3Rlc3QvU2VtYS8yMDA3LTEwLTAxLUJ1aWxkQXJyYXlSZWYuYwppbmRleCA0NjkyNzMxLi4yNTUyOTM0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvMjAwNy0xMC0wMS1CdWlsZEFycmF5UmVmLmMKKysrIGIvdGVzdC9TZW1hLzIwMDctMTAtMDEtQnVpbGRBcnJheVJlZi5jCkBAIC0xLDkgKzEsOSBAQAotLy8gUlVOOiBub3QgJWNsYW5nX2NjMV9vbmx5IC1jICVzIC1vIC0gPiAvZGV2L251bGwKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKIC8vIFBSIDE2MDMKIHZvaWQgZnVuYygpCiB7CiAgICBjb25zdCBpbnQgKmFycjsKLSAgIGFyclswXSA9IDE7ICAvLyBleHBlY3RlZC1lcnJvciB7e2Fzc2lnbm1lbnQgb2YgcmVhZC1vbmx5IGxvY2F0aW9ufX0KKyAgIGFyclswXSA9IDE7ICAvLyBleHBlY3RlZC1lcnJvciB7e3JlYWQtb25seSB2YXJpYWJsZSBpcyBub3QgYXNzaWduYWJsZX19CiB9CiAKIHN0cnVjdCBmb28gewpAQCAtMTUsNiArMTUsNiBAQAogewogICBjb25zdCBzdHJ1Y3QgZm9vICpmcDsKICAgZnAgPSAmc2ZvbzsKLSAgZnBbMF0uYmFyID0gMTsgIC8vIGV4cGVjdGVkLWVycm9yIHt7IGFzc2lnbm1lbnQgb2YgcmVhZC1vbmx5IG1lbWJlcn19CisgIGZwWzBdLmJhciA9IDE7ICAvLyBleHBlY3RlZC1lcnJvciB7e3JlYWQtb25seSB2YXJpYWJsZSBpcyBub3QgYXNzaWduYWJsZX19CiAgIHJldHVybiBzZm9vLmJhcjsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS8yMDA5LTAzLTA5LVdlYWtEZWNsYXJhdGlvbnMtMS5jIGIvdGVzdC9TZW1hLzIwMDktMDMtMDktV2Vha0RlY2xhcmF0aW9ucy0xLmMKaW5kZXggZjIxOWRlNi4uYzAwMzVhNCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hLzIwMDktMDMtMDktV2Vha0RlY2xhcmF0aW9ucy0xLmMKKysrIGIvdGVzdC9TZW1hLzIwMDktMDMtMDktV2Vha0RlY2xhcmF0aW9ucy0xLmMKQEAgLTEsMTIgKzEsMTIgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlIGk2ODYtYXBwbGUtZGFyd2luCisvLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAlcyAtdHJpcGxlIGk2ODYtYXBwbGUtZGFyd2luCiAvLyBJbnNpc3QgdXBvbiB3YXJuaW5ncyBmb3IgaW5hcHByb3ByaWF0ZSB3ZWFrIGF0dHJpYnV0ZXMuCiAKIC8vIE8uSy4KIGV4dGVybiBpbnQgZXh0X3dlYWtfaW1wb3J0IF9fYXR0cmlidXRlX18gKChfX3dlYWtfaW1wb3J0X18pKTsKIAogLy8gVGhlc2UgYXJlIGluYXBwcm9wcmlhdGUsIGFuZCBzaG91bGQgZ2VuZXJhdGUgd2FybmluZ3M6Ci1pbnQgZGVjbF93ZWFrX2ltcG9ydCBfX2F0dHJpYnV0ZV9fICgoX193ZWFrX2ltcG9ydF9fKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcgeyd3ZWFrX2ltcG9ydCcgYXR0cmlidXRlIGNhbm5vdCBiZSBzcGVjaWZpZWQgb24gYSBkZWZpbml0aW9ufQotaW50IGRlY2xfaW5pdGlhbGl6ZWRfd2Vha19pbXBvcnQgX19hdHRyaWJ1dGVfXyAoKF9fd2Vha19pbXBvcnRfXykpID0gMTM7IC8vIGV4cGVjdGVkLXdhcm5pbmcgeyd3ZWFrX2ltcG9ydCcgYXR0cmlidXRlIGNhbm5vdCBiZSBzcGVjaWZpZWQgb24gYSBkZWZpbml0aW9ufQoraW50IGRlY2xfd2Vha19pbXBvcnQgX19hdHRyaWJ1dGVfXyAoKF9fd2Vha19pbXBvcnRfXykpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3dlYWtfaW1wb3J0JyBhdHRyaWJ1dGUgY2Fubm90IGJlIHNwZWNpZmllZCBvbiBhIGRlZmluaXRpb259fQoraW50IGRlY2xfaW5pdGlhbGl6ZWRfd2Vha19pbXBvcnQgX19hdHRyaWJ1dGVfXyAoKF9fd2Vha19pbXBvcnRfXykpID0gMTM7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snd2Vha19pbXBvcnQnIGF0dHJpYnV0ZSBjYW5ub3QgYmUgc3BlY2lmaWVkIG9uIGEgZGVmaW5pdGlvbn19CiAKIC8vIE8uSy4KIGV4dGVybiBpbnQgZXh0X2Yodm9pZCkgX19hdHRyaWJ1dGVfXyAoKF9fd2Vha19pbXBvcnRfXykpOwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hLzIwMDktMDQtMjItVW5rbm93blNpemUuYyBiL3Rlc3QvU2VtYS8yMDA5LTA0LTIyLVVua25vd25TaXplLmMKaW5kZXggOWY3MTc0MC4uNjBiZDhkMiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hLzIwMDktMDQtMjItVW5rbm93blNpemUuYworKysgYi90ZXN0L1NlbWEvMjAwOS0wNC0yMi1Vbmtub3duU2l6ZS5jCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC1vIC0KKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCiAvLyBQUjI5NTgKIHN0YXRpYyBzdHJ1Y3QgZm9vIHM7IC8vIGV4cGVjdGVkLWVycm9yIHsgdGVudGF0aXZlIGRlZmluaXRpb24gaGFzIHR5cGUgJ3N0cnVjdCBmb28nIHRoYXQgaXMgbmV2ZXIgY29tcGxldGVkIH0KIHN0cnVjdCBmb28gKnAgPSAmczsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS8yMDA5LTA3LTE3LVZvaWRQYXJhbWV0ZXIuYyBiL3Rlc3QvU2VtYS8yMDA5LTA3LTE3LVZvaWRQYXJhbWV0ZXIuYwppbmRleCA2OGQxYjFlLi5iODM4YjAyIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvMjAwOS0wNy0xNy1Wb2lkUGFyYW1ldGVyLmMKKysrIGIvdGVzdC9TZW1hLzIwMDktMDctMTctVm9pZFBhcmFtZXRlci5jCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtZW1pdC1sbHZtICVzIC1vIC0KKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mc3ludGF4LW9ubHkgJXMKIC8vIFBSNDIxNAogdHlwZWRlZiB2b2lkIHZ0Owotdm9pZCAoKmZ1bmNfcHRyKSh2dCBteV92dCk7IC8vIGV4cGVjdGVkLWVycm9yIHthcmd1bWVudCBtYXkgbm90IGhhdmUgJ3ZvaWQnIHR5cGV9Cit2b2lkICgqZnVuY19wdHIpKHZ0IG15X3Z0KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBtYXkgbm90IGhhdmUgJ3ZvaWQnIHR5cGV9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL0lucHV0cy9tcy1rZXl3b3JkLXN5c3RlbS1oZWFkZXIuaCBiL3Rlc3QvU2VtYS9JbnB1dHMvbXMta2V5d29yZC1zeXN0ZW0taGVhZGVyLmgKaW5kZXggNDNhM2RiNy4uZGRhNGMyYSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL0lucHV0cy9tcy1rZXl3b3JkLXN5c3RlbS1oZWFkZXIuaAorKysgYi90ZXN0L1NlbWEvSW5wdXRzL21zLWtleXdvcmQtc3lzdGVtLWhlYWRlci5oCkBAIC0zLDcgKzMsNyBAQAogdHlwZWRlZiB1bmlvbiB7CiAgIHVuaW9uIHcgKl9fdXB0cjsKICNpZiBkZWZpbmVkKE1TKSAmJiBkZWZpbmVkKE5PVF9TWVNURU0pCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmdALTIge3trZXl3b3JkICdfX3VwdHInIHdpbGwgYmUgdHJlYXRlZCBhcyBhbiBpZGVudGlmaWVyIGhlcmV9fQorICAvLyBleHBlY3RlZC13YXJuaW5nQC0yIHt7a2V5d29yZCAnX191cHRyJyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGFzIGFuIGlkZW50aWZpZXIgaGVyZX19CiAjZW5kaWYKICAgaW50ICpfX2lwdHI7CiB9IFdTIF9fYXR0cmlidXRlX18oKF9fdHJhbnNwYXJlbnRfdW5pb25fXykpOwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL0lucHV0cy93YXJuLXVucmVhY2hhYmxlLmggYi90ZXN0L1NlbWEvSW5wdXRzL3dhcm4tdW5yZWFjaGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQyNDJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hL0lucHV0cy93YXJuLXVucmVhY2hhYmxlLmgKQEAgLTAsMCArMSw3IEBACisvLyBUZXN0IHRoYXQgdGhpcyB1bnJlYWNoYWJsZSBjb2RlIHdhcm5pbmcgaXMKKy8vIG5vdCByZXBvcnRlZCBiZWNhdXNlIGl0IGlzIGluIGEgaGVhZGVyLgorCit2b2lkIGZvb191bnJlYWNoYWJsZV9oZWFkZXIoKSB7CisgIHJldHVybjsKKyAgZm9vX3VucmVhY2hhYmxlX2hlYWRlcigpOyAvLyBuby13YXJuaW5nCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL01pY3Jvc29mdENvbXBhdGliaWxpdHkuYyBiL3Rlc3QvU2VtYS9NaWNyb3NvZnRDb21wYXRpYmlsaXR5LmMKaW5kZXggNjMzMGMxNS4uYTE5M2IyNiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL01pY3Jvc29mdENvbXBhdGliaWxpdHkuYworKysgYi90ZXN0L1NlbWEvTWljcm9zb2Z0Q29tcGF0aWJpbGl0eS5jCkBAIC0xNiw2ICsxNiw4IEBACiB9CiAKIF9fZGVjbHNwZWMoYWxpZ24oMzI3NjgpKSBzdHJ1Y3QgUzEgeyBpbnQgYTsgfSBzOwkvKiBleHBlY3RlZC1lcnJvciB7e3JlcXVlc3RlZCBhbGlnbm1lbnQgbXVzdCBiZSA4MTkyIGJ5dGVzIG9yIHNtYWxsZXJ9fSAqLwotc3RydWN0IF9fZGVjbHNwZWMoYWxpZ25lZCkgUzIge307IC8qIGV4cGVjdGVkLXdhcm5pbmcge3t1bmtub3duIF9fZGVjbHNwZWMgYXR0cmlidXRlICdhbGlnbmVkJyBpZ25vcmVkfX0gKi8KK3N0cnVjdCBfX2RlY2xzcGVjKGFsaWduZWQpIFMyIHt9OyAvKiBleHBlY3RlZC13YXJuaW5nIHt7X19kZWNsc3BlYyBhdHRyaWJ1dGUgJ2FsaWduZWQnIGlzIG5vdCBzdXBwb3J0ZWR9fSAqLwogCiBzdHJ1Y3QgX19kZWNsc3BlYyhhcHBkb21haW4pIFMzIHt9OyAvKiBleHBlY3RlZC13YXJuaW5nIHt7X19kZWNsc3BlYyBhdHRyaWJ1dGUgJ2FwcGRvbWFpbicgaXMgbm90IHN1cHBvcnRlZH19ICovCisKK19fZGVjbHNwZWMoX19ub3JldHVybl9fKSB2b2lkIGY3KHZvaWQpOyAvKiBleHBlY3RlZC13YXJuaW5nIHt7X19kZWNsc3BlYyBhdHRyaWJ1dGUgJ19fbm9yZXR1cm5fXycgaXMgbm90IHN1cHBvcnRlZH19ICovCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvTWljcm9zb2Z0RXh0ZW5zaW9ucy5jIGIvdGVzdC9TZW1hL01pY3Jvc29mdEV4dGVuc2lvbnMuYwppbmRleCBhNmNhZjdhLi5iMTk5NjQ0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvTWljcm9zb2Z0RXh0ZW5zaW9ucy5jCisrKyBiL3Rlc3QvU2VtYS9NaWNyb3NvZnRFeHRlbnNpb25zLmMKQEAgLTIwLDEwICsyMCw3IEBACiAgICBpbnQgRFtdOwogfTsKIAotCi0KLQotCitzdHJ1Y3QgX19kZWNsc3BlYyh1dWlkKCIwMDAwMDAwMC0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDYiKSkgSVVua25vd24ge307IC8qIGV4cGVjdGVkLWVycm9yIHt7J3V1aWQnIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGluIEN9fSAqLwogCiB0eXBlZGVmIHN0cnVjdCBub3RuZXN0ZWQgewogICBsb25nIGJhZDE7CkBAIC05MCwxMSArODcsMTEgQEAKICAgQUE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3thbm9ueW1vdXMgc3RydWN0cyBhcmUgYSBNaWNyb3NvZnQgZXh0ZW5zaW9ufX0KIH0gQkI7CiAKLV9fZGVjbHNwZWMoZGVwcmVjYXRlZCgiVGhpcyBpcyBkZXByZWNhdGVkIikpIGVudW0gREUxIHsgb25lLCB0d28gfSBlMTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydlMScgZGVjbGFyZWQgaGVyZX19Ci1zdHJ1Y3QgX19kZWNsc3BlYyhkZXByZWNhdGVkKSBEUzEgeyBpbnQgaTsgZmxvYXQgZjsgfTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorX19kZWNsc3BlYyhkZXByZWNhdGVkKCJUaGlzIGlzIGRlcHJlY2F0ZWQiKSkgZW51bSBERTEgeyBvbmUsIHR3byB9IGUxOyAvLyBleHBlY3RlZC1ub3RlIHt7J2UxJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQorc3RydWN0IF9fZGVjbHNwZWMoZGVwcmVjYXRlZCkgRFMxIHsgaW50IGk7IGZsb2F0IGY7IH07IC8vIGV4cGVjdGVkLW5vdGUge3snRFMxJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogCiAjZGVmaW5lIE1ZX1RFWFQJCSJUaGlzIGlzIGFsc28gZGVwcmVjYXRlZCIKLV9fZGVjbHNwZWMoZGVwcmVjYXRlZChNWV9URVhUKSkgdm9pZCBEZnVuYzEoIHZvaWQgKSB7fSAvLyBleHBlY3RlZC1ub3RlIHt7J0RmdW5jMScgZGVjbGFyZWQgaGVyZX19CitfX2RlY2xzcGVjKGRlcHJlY2F0ZWQoTVlfVEVYVCkpIHZvaWQgRGZ1bmMxKCB2b2lkICkge30gLy8gZXhwZWN0ZWQtbm90ZSB7eydEZnVuYzEnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAKIHN0cnVjdCBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQoMTIzKSkgRFMyIHt9OwkvLyBleHBlY3RlZC1lcnJvciB7eydkZXByZWNhdGVkJyBhdHRyaWJ1dGUgcmVxdWlyZXMgYSBzdHJpbmd9fQogCkBAIC0xMzQsMyArMTMxLDE3IEBACiAKIHR5cGVkZWYgaW50ICpUOwogVCBfX3B0cjMyIHdyb25nMTA7IC8vIGV4cGVjdGVkLWVycm9yIHt7J19fcHRyMzInIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gcG9pbnRlciBhcmd1bWVudHN9fQorCit0eXBlZGVmIGNoYXIgKm15X3ZhX2xpc3Q7Cit2b2lkIF9fdmFfc3RhcnQobXlfdmFfbGlzdCAqYXAsIC4uLik7IC8vIGV4cGVjdGVkLW5vdGUge3twYXNzaW5nIGFyZ3VtZW50IHRvIHBhcmFtZXRlciAnYXAnIGhlcmV9fQordm9pZCB2bXlwcmludGYoY29uc3QgY2hhciAqZiwgbXlfdmFfbGlzdCBhcCk7Cit2b2lkIG15cHJpbnRmKGNvbnN0IGNoYXIgKmYsIC4uLikgeworICBteV92YV9saXN0IGFwOworICBpZiAoMSkgeworICAgIF9fdmFfc3RhcnQoJmFwLCBmKTsKKyAgICB2bXlwcmludGYoZiwgYXApOworICAgIGFwID0gMDsKKyAgfSBlbHNlIHsKKyAgICBfX3ZhX3N0YXJ0KGFwLCBmKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2luY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzIHBhc3NpbmcgJ215X3ZhX2xpc3QnfX0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2FhcmNoNjQtbmVvbi1yYW5nZXMuYyBiL3Rlc3QvU2VtYS9hYXJjaDY0LW5lb24tcmFuZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjOWM1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYS9hYXJjaDY0LW5lb24tcmFuZ2VzLmMKQEAgLTAsMCArMSwyMTcgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFhcmNoNjQtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiAtZmZyZWVzdGFuZGluZyAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKK3ZvaWQgdGVzdF92ZXh0XzhiaXQoaW50OHg4X3Qgc21hbGwsIGludDh4MTZfdCBiaWcpIHsKKyAgdmV4dF9zOChzbWFsbCwgc21hbGwsIDcpOworICB2ZXh0X3U4KHNtYWxsLCBzbWFsbCwgNyk7CisgIHZleHRfcDgoc21hbGwsIHNtYWxsLCA3KTsKKyAgdmV4dHFfczgoYmlnLCBiaWcsIDE1KTsKKyAgdmV4dHFfdTgoYmlnLCBiaWcsIDE1KTsKKyAgdmV4dHFfcDgoYmlnLCBiaWcsIDE1KTsKKworICB2ZXh0X3M4KHNtYWxsLCBzbWFsbCwgOCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDd9fQorICB2ZXh0X3U4KHNtYWxsLCBzbWFsbCwgOCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDd9fQorICB2ZXh0X3A4KHNtYWxsLCBzbWFsbCwgOCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDd9fQorICB2ZXh0cV9zOChiaWcsIGJpZywgMTYpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAxNX19CisgIHZleHRxX3U4KGJpZywgYmlnLCAxNik7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDE1fX0KKyAgdmV4dHFfcDgoYmlnLCBiaWcsIDE2KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMTV9fQorfQorCit2b2lkIHRlc3RfbXVsX2xhbmVfZjY0KGZsb2F0NjR4MV90IHNtYWxsLCBmbG9hdDY0eDJfdCBiaWcsIGZsb2F0NjR4Ml90IHJocykgeworICB2bXVsX2xhbmVfZjY0KHNtYWxsLCBzbWFsbCwgMCk7CisgIHZtdWxfbGFuZXFfZjY0KHNtYWxsLCBiaWcsIDEpOworICB2bXVscV9sYW5lX2Y2NChiaWcsIHNtYWxsLCAwKTsKKyAgdm11bHFfbGFuZXFfZjY0KGJpZywgYmlnLCAxKTsKKyAgdmZtYV9sYW5lX2Y2NChzbWFsbCwgc21hbGwsIHNtYWxsLCAwKTsKKyAgdmZtYV9sYW5lcV9mNjQoc21hbGwsIHNtYWxsLCBiaWcsIDEpOworICB2Zm1hcV9sYW5lX2Y2NChiaWcsIGJpZywgc21hbGwsIDApOworICB2Zm1hcV9sYW5lcV9mNjQoYmlnLCBiaWcsIGJpZywgMSk7CisKKyAgdm11bF9sYW5lX2Y2NChzbWFsbCwgc21hbGwsIDEpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAwfX0KKyAgdm11bF9sYW5lcV9mNjQoc21hbGwsIGJpZywgMik7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDF9fQorICB2Zm1hX2xhbmVfZjY0KHNtYWxsLCBzbWFsbCwgc21hbGwsIDEpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAwfX0KKyAgdmZtYV9sYW5lcV9mNjQoc21hbGwsIHNtYWxsLCBiaWcsIDIpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAxfX0KKyAgdmZtYXFfbGFuZXFfZjY0KGJpZywgYmlnLCBiaWcsIDIpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAxfX0KK30KKwordm9pZCB0ZXN0X2xkMXN0MShpbnQ4eDhfdCBzbWFsbCwgaW50OHgxNl90IGJpZywgdm9pZCAqYWRkcikgeworICB2bGQxX2xhbmVfczgoYWRkciwgc21hbGwsIDcpOworICB2bGQxX2xhbmVfczE2KGFkZHIsIHNtYWxsLCAzKTsKKyAgdmxkMV9sYW5lX3MzMihhZGRyLCBzbWFsbCwgMSk7CisgIHZsZDFfbGFuZV9zNjQoYWRkciwgc21hbGwsIDApOworCisgIHZsZDFxX2xhbmVfczgoYWRkciwgYmlnLCAxNSk7CisgIHZsZDFxX2xhbmVfczE2KGFkZHIsIGJpZywgNyk7CisgIHZsZDFxX2xhbmVfczMyKGFkZHIsIGJpZywgMyk7CisgIHZsZDFxX2xhbmVfczY0KGFkZHIsIGJpZywgMSk7CisKKyAgdmxkMV9sYW5lX3M4KGFkZHIsIHNtYWxsLCA4KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gN319CisgIHZsZDFfbGFuZV9zMTYoYWRkciwgc21hbGwsIDQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAzfX0KKyAgdmxkMV9sYW5lX3MzMihhZGRyLCBzbWFsbCwgMik7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDF9fQorICB2bGQxX2xhbmVfczY0KGFkZHIsIHNtYWxsLCAxKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMH19CisKKyAgdmxkMXFfbGFuZV9zOChhZGRyLCBiaWcsIDE2KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMTV9fQorICB2bGQxcV9sYW5lX3MxNihhZGRyLCBiaWcsIDgpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byA3fX0KKyAgdmxkMXFfbGFuZV9zMzIoYWRkciwgYmlnLCA0KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gM319CisgIHZsZDFxX2xhbmVfczY0KGFkZHIsIGJpZywgMik7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDF9fQorCisgIHZzdDFfbGFuZV9zOChhZGRyLCBzbWFsbCwgNyk7CisgIHZzdDFfbGFuZV9zMTYoYWRkciwgc21hbGwsIDMpOworICB2c3QxX2xhbmVfczMyKGFkZHIsIHNtYWxsLCAxKTsKKyAgdnN0MV9sYW5lX3M2NChhZGRyLCBzbWFsbCwgMCk7CisKKyAgdnN0MXFfbGFuZV9zOChhZGRyLCBiaWcsIDE1KTsKKyAgdnN0MXFfbGFuZV9zMTYoYWRkciwgYmlnLCA3KTsKKyAgdnN0MXFfbGFuZV9zMzIoYWRkciwgYmlnLCAzKTsKKyAgdnN0MXFfbGFuZV9zNjQoYWRkciwgYmlnLCAxKTsKKworICB2c3QxX2xhbmVfczgoYWRkciwgc21hbGwsIDgpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byA3fX0KKyAgdnN0MV9sYW5lX3MxNihhZGRyLCBzbWFsbCwgNCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDN9fQorICB2c3QxX2xhbmVfczMyKGFkZHIsIHNtYWxsLCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19CisgIHZzdDFfbGFuZV9zNjQoYWRkciwgc21hbGwsIDEpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAwfX0KKworICB2c3QxcV9sYW5lX3M4KGFkZHIsIGJpZywgMTYpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAxNX19CisgIHZzdDFxX2xhbmVfczE2KGFkZHIsIGJpZywgOCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDd9fQorICB2c3QxcV9sYW5lX3MzMihhZGRyLCBiaWcsIDQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAzfX0KKyAgdnN0MXFfbGFuZV9zNjQoYWRkciwgYmlnLCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19Cit9CisKK3ZvaWQgdGVzdF9sZDJzdDIoaW50OHg4eDJfdCBzbWFsbDgsIGludDh4MTZ4Ml90IGJpZzgsCisgICAgICAgICAgICAgICAgIGludDE2eDR4Ml90IHNtYWxsMTYsIGludDE2eDh4Ml90IGJpZzE2LAorICAgICAgICAgICAgICAgICBpbnQzMngyeDJfdCBzbWFsbDMyLCBpbnQzMng0eDJfdCBiaWczMiwKKyAgICAgICAgICAgICAgICAgaW50NjR4MXgyX3Qgc21hbGw2NCwgaW50NjR4MngyX3QgYmlnNjQsCisgICAgICAgICAgICAgICAgIHZvaWQgKmFkZHIpIHsKKyAgdmxkMl9sYW5lX3M4KGFkZHIsIHNtYWxsOCwgNyk7CisgIHZsZDJfbGFuZV9zMTYoYWRkciwgc21hbGwxNiwgMyk7CisgIHZsZDJfbGFuZV9zMzIoYWRkciwgc21hbGwzMiwgMSk7CisgIHZsZDJfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMCk7CisKKyAgdmxkMnFfbGFuZV9zOChhZGRyLCBiaWc4LCAxNSk7CisgIHZsZDJxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA3KTsKKyAgdmxkMnFfbGFuZV9zMzIoYWRkciwgYmlnMzIsIDMpOworICB2bGQycV9sYW5lX3M2NChhZGRyLCBiaWc2NCwgMSk7CisKKyAgdmxkMl9sYW5lX3M4KGFkZHIsIHNtYWxsOCwgOCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDd9fQorICB2bGQyX2xhbmVfczE2KGFkZHIsIHNtYWxsMTYsIDQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAzfX0KKyAgdmxkMl9sYW5lX3MzMihhZGRyLCBzbWFsbDMyLCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19CisgIHZsZDJfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDB9fQorCisgIHZsZDJxX2xhbmVfczgoYWRkciwgYmlnOCwgMTYpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAxNX19CisgIHZsZDJxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA4KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gN319CisgIHZsZDJxX2xhbmVfczMyKGFkZHIsIGJpZzMyLCA0KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gM319CisgIHZsZDJxX2xhbmVfczY0KGFkZHIsIGJpZzY0LCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19CisKKyAgdnN0Ml9sYW5lX3M4KGFkZHIsIHNtYWxsOCwgNyk7CisgIHZzdDJfbGFuZV9zMTYoYWRkciwgc21hbGwxNiwgMyk7CisgIHZzdDJfbGFuZV9zMzIoYWRkciwgc21hbGwzMiwgMSk7CisgIHZzdDJfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMCk7CisKKyAgdnN0MnFfbGFuZV9zOChhZGRyLCBiaWc4LCAxNSk7CisgIHZzdDJxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA3KTsKKyAgdnN0MnFfbGFuZV9zMzIoYWRkciwgYmlnMzIsIDMpOworICB2c3QycV9sYW5lX3M2NChhZGRyLCBiaWc2NCwgMSk7CisKKyAgdnN0Ml9sYW5lX3M4KGFkZHIsIHNtYWxsOCwgOCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDd9fQorICB2c3QyX2xhbmVfczE2KGFkZHIsIHNtYWxsMTYsIDQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAzfX0KKyAgdnN0Ml9sYW5lX3MzMihhZGRyLCBzbWFsbDMyLCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19CisgIHZzdDJfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDB9fQorCisgIHZzdDJxX2xhbmVfczgoYWRkciwgYmlnOCwgMTYpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAxNX19CisgIHZzdDJxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA4KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gN319CisgIHZzdDJxX2xhbmVfczMyKGFkZHIsIGJpZzMyLCA0KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gM319CisgIHZzdDJxX2xhbmVfczY0KGFkZHIsIGJpZzY0LCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19Cit9CisKK3ZvaWQgdGVzdF9sZDNzdDMoaW50OHg4eDNfdCBzbWFsbDgsIGludDh4MTZ4M190IGJpZzgsCisgICAgICAgICAgICAgICAgIGludDE2eDR4M190IHNtYWxsMTYsIGludDE2eDh4M190IGJpZzE2LAorICAgICAgICAgICAgICAgICBpbnQzMngyeDNfdCBzbWFsbDMyLCBpbnQzMng0eDNfdCBiaWczMiwKKyAgICAgICAgICAgICAgICAgaW50NjR4MXgzX3Qgc21hbGw2NCwgaW50NjR4MngzX3QgYmlnNjQsCisgICAgICAgICAgICAgICAgIHZvaWQgKmFkZHIpIHsKKyAgdmxkM19sYW5lX3M4KGFkZHIsIHNtYWxsOCwgNyk7CisgIHZsZDNfbGFuZV9zMTYoYWRkciwgc21hbGwxNiwgMyk7CisgIHZsZDNfbGFuZV9zMzIoYWRkciwgc21hbGwzMiwgMSk7CisgIHZsZDNfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMCk7CisKKyAgdmxkM3FfbGFuZV9zOChhZGRyLCBiaWc4LCAxNSk7CisgIHZsZDNxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA3KTsKKyAgdmxkM3FfbGFuZV9zMzIoYWRkciwgYmlnMzIsIDMpOworICB2bGQzcV9sYW5lX3M2NChhZGRyLCBiaWc2NCwgMSk7CisKKyAgdmxkM19sYW5lX3M4KGFkZHIsIHNtYWxsOCwgOCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDd9fQorICB2bGQzX2xhbmVfczE2KGFkZHIsIHNtYWxsMTYsIDQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAzfX0KKyAgdmxkM19sYW5lX3MzMihhZGRyLCBzbWFsbDMyLCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19CisgIHZsZDNfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDB9fQorCisgIHZsZDNxX2xhbmVfczgoYWRkciwgYmlnOCwgMTYpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAxNX19CisgIHZsZDNxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA4KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gN319CisgIHZsZDNxX2xhbmVfczMyKGFkZHIsIGJpZzMyLCA0KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gM319CisgIHZsZDNxX2xhbmVfczY0KGFkZHIsIGJpZzY0LCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19CisKKyAgdnN0M19sYW5lX3M4KGFkZHIsIHNtYWxsOCwgNyk7CisgIHZzdDNfbGFuZV9zMTYoYWRkciwgc21hbGwxNiwgMyk7CisgIHZzdDNfbGFuZV9zMzIoYWRkciwgc21hbGwzMiwgMSk7CisgIHZzdDNfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMCk7CisKKyAgdnN0M3FfbGFuZV9zOChhZGRyLCBiaWc4LCAxNSk7CisgIHZzdDNxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA3KTsKKyAgdnN0M3FfbGFuZV9zMzIoYWRkciwgYmlnMzIsIDMpOworICB2c3QzcV9sYW5lX3M2NChhZGRyLCBiaWc2NCwgMSk7CisKKyAgdnN0M19sYW5lX3M4KGFkZHIsIHNtYWxsOCwgOCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDd9fQorICB2c3QzX2xhbmVfczE2KGFkZHIsIHNtYWxsMTYsIDQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAzfX0KKyAgdnN0M19sYW5lX3MzMihhZGRyLCBzbWFsbDMyLCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19CisgIHZzdDNfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDB9fQorCisgIHZzdDNxX2xhbmVfczgoYWRkciwgYmlnOCwgMTYpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAxNX19CisgIHZzdDNxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA4KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gN319CisgIHZzdDNxX2xhbmVfczMyKGFkZHIsIGJpZzMyLCA0KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gM319CisgIHZzdDNxX2xhbmVfczY0KGFkZHIsIGJpZzY0LCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19Cit9CisKK3ZvaWQgdGVzdF9sZDRzdDQoaW50OHg4eDRfdCBzbWFsbDgsIGludDh4MTZ4NF90IGJpZzgsCisgICAgICAgICAgICAgICAgIGludDE2eDR4NF90IHNtYWxsMTYsIGludDE2eDh4NF90IGJpZzE2LAorICAgICAgICAgICAgICAgICBpbnQzMngyeDRfdCBzbWFsbDMyLCBpbnQzMng0eDRfdCBiaWczMiwKKyAgICAgICAgICAgICAgICAgaW50NjR4MXg0X3Qgc21hbGw2NCwgaW50NjR4Mng0X3QgYmlnNjQsCisgICAgICAgICAgICAgICAgIHZvaWQgKmFkZHIpIHsKKyAgdmxkNF9sYW5lX3M4KGFkZHIsIHNtYWxsOCwgNyk7CisgIHZsZDRfbGFuZV9zMTYoYWRkciwgc21hbGwxNiwgMyk7CisgIHZsZDRfbGFuZV9zMzIoYWRkciwgc21hbGwzMiwgMSk7CisgIHZsZDRfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMCk7CisKKyAgdmxkNHFfbGFuZV9zOChhZGRyLCBiaWc4LCAxNSk7CisgIHZsZDRxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA3KTsKKyAgdmxkNHFfbGFuZV9zMzIoYWRkciwgYmlnMzIsIDMpOworICB2bGQ0cV9sYW5lX3M2NChhZGRyLCBiaWc2NCwgMSk7CisKKyAgdmxkNF9sYW5lX3M4KGFkZHIsIHNtYWxsOCwgOCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDd9fQorICB2bGQ0X2xhbmVfczE2KGFkZHIsIHNtYWxsMTYsIDQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAzfX0KKyAgdmxkNF9sYW5lX3MzMihhZGRyLCBzbWFsbDMyLCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19CisgIHZsZDRfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDB9fQorCisgIHZsZDRxX2xhbmVfczgoYWRkciwgYmlnOCwgMTYpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAxNX19CisgIHZsZDRxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA4KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gN319CisgIHZsZDRxX2xhbmVfczMyKGFkZHIsIGJpZzMyLCA0KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gM319CisgIHZsZDRxX2xhbmVfczY0KGFkZHIsIGJpZzY0LCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19CisKKyAgdnN0NF9sYW5lX3M4KGFkZHIsIHNtYWxsOCwgNyk7CisgIHZzdDRfbGFuZV9zMTYoYWRkciwgc21hbGwxNiwgMyk7CisgIHZzdDRfbGFuZV9zMzIoYWRkciwgc21hbGwzMiwgMSk7CisgIHZzdDRfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMCk7CisKKyAgdnN0NHFfbGFuZV9zOChhZGRyLCBiaWc4LCAxNSk7CisgIHZzdDRxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA3KTsKKyAgdnN0NHFfbGFuZV9zMzIoYWRkciwgYmlnMzIsIDMpOworICB2c3Q0cV9sYW5lX3M2NChhZGRyLCBiaWc2NCwgMSk7CisKKyAgdnN0NF9sYW5lX3M4KGFkZHIsIHNtYWxsOCwgOCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDd9fQorICB2c3Q0X2xhbmVfczE2KGFkZHIsIHNtYWxsMTYsIDQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAzfX0KKyAgdnN0NF9sYW5lX3MzMihhZGRyLCBzbWFsbDMyLCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19CisgIHZzdDRfbGFuZV9zNjQoYWRkciwgc21hbGw2NCwgMSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXJndW1lbnQgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSAwIHRvIDB9fQorCisgIHZzdDRxX2xhbmVfczgoYWRkciwgYmlnOCwgMTYpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHNob3VsZCBiZSBhIHZhbHVlIGZyb20gMCB0byAxNX19CisgIHZzdDRxX2xhbmVfczE2KGFkZHIsIGJpZzE2LCA4KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gN319CisgIHZzdDRxX2xhbmVfczMyKGFkZHIsIGJpZzMyLCA0KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gM319CisgIHZzdDRxX2xhbmVfczY0KGFkZHIsIGJpZzY0LCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thcmd1bWVudCBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIDAgdG8gMX19Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9hYXJjaDY0LW5lb24tdmVjdG9yLXR5cGVzLmMgYi90ZXN0L1NlbWEvYWFyY2g2NC1uZW9uLXZlY3Rvci10eXBlcy5jCmluZGV4IDg5NGNmNmQuLmI3MzNlM2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9hYXJjaDY0LW5lb24tdmVjdG9yLXR5cGVzLmMKKysrIGIvdGVzdC9TZW1hL2FhcmNoNjQtbmVvbi12ZWN0b3ItdHlwZXMuYwpAQCAtMSwxOSArMSwzNCBAQAogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC10cmlwbGUgYWFyY2g2NC1ub25lLWxpbnV4LWdudSAtdGFyZ2V0LWZlYXR1cmUgK25lb24gLWZzeW50YXgtb25seSAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSBhYXJjaDY0LW5vbmUtbGludXgtZ251IC10YXJnZXQtZmVhdHVyZSArbmVvbiAtRFVTRV9MT05HIC1mc3ludGF4LW9ubHkgLXZlcmlmeQogCiB0eXBlZGVmIGZsb2F0IGZsb2F0MzJfdDsKIHR5cGVkZWYgdW5zaWduZWQgY2hhciBwb2x5OF90OwogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBwb2x5MTZfdDsKKworLy8gQm90aCAibG9uZyIgYW5kICJsb25nIGxvbmciIHNob3VsZCB3b3JrIGZvciA2NC1iaXQgYXJjaCBsaWtlIGFhcmNoNjQuCisvLyBzdGRpbnQuaCBpbiBnbnUgbGliYyBpcyB1c2luZyAibG9uZyIgZm9yIDY0LWJpdCBhcmNoLgorI2lmIFVTRV9MT05HCit0eXBlZGVmIGxvbmcgaW50NjRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50NjRfdDsKKyNlbHNlCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NF90OwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7CisjZW5kaWYKK3R5cGVkZWYgdWludDY0X3QgcG9seTY0X3Q7CiAKIC8vIERlZmluZSBzb21lIHZhbGlkIE5lb24gdHlwZXMuCiB0eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fdmVjdG9yX3R5cGUoMikpKSBpbnQgaW50MzJ4Ml90OwogdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDQpKSkgaW50IGludDMyeDRfdDsKK3R5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSgxKSkpIGludDY0X3QgaW50NjR4MV90OwordHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDIpKSkgaW50NjRfdCBpbnQ2NHgyX3Q7CiB0eXBlZGVmIF9fYXR0cmlidXRlX18oKG5lb25fdmVjdG9yX3R5cGUoMSkpKSB1aW50NjRfdCB1aW50NjR4MV90OwogdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDIpKSkgdWludDY0X3QgdWludDY0eDJfdDsKIHR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSgyKSkpIGZsb2F0MzJfdCBmbG9hdDMyeDJfdDsKIHR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSg0KSkpIGZsb2F0MzJfdCBmbG9hdDMyeDRfdDsKIHR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl9wb2x5dmVjdG9yX3R5cGUoMTYpKSkgcG9seThfdCAgcG9seTh4MTZfdDsKIHR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl9wb2x5dmVjdG9yX3R5cGUoOCkpKSAgcG9seTE2X3QgcG9seTE2eDhfdDsKK3R5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl9wb2x5dmVjdG9yX3R5cGUoMSkpKSAgcG9seTY0X3QgcG9seTY0eDFfdDsKK3R5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl9wb2x5dmVjdG9yX3R5cGUoMikpKSAgcG9seTY0X3QgcG9seTY0eDJfdDsKIAogLy8gVGhlIGF0dHJpYnV0ZXMgbXVzdCBoYXZlIGEgc2luZ2xlIGFyZ3VtZW50LgogdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDIsIDQpKSkgaW50IG9ubHlfb25lX2FyZzsgLy8gZXhwZWN0ZWQtZXJyb3J7e2F0dHJpYnV0ZSB0YWtlcyBvbmUgYXJndW1lbnR9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2FsbG9jX3NpemUuYyBiL3Rlc3QvU2VtYS9hbGxvY19zaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MzMyM2EuLjAwMDAwMDAKLS0tIGEvdGVzdC9TZW1hL2FsbG9jX3NpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKLQotdm9pZCogbXlfbWFsbG9jKHVuc2lnbmVkIGNoYXIpIF9fYXR0cmlidXRlX18oKGFsbG9jX3NpemUoMSkpKTsKLXZvaWQqIG15X2NhbGxvYyh1bnNpZ25lZCBjaGFyLCBzaG9ydCkgX19hdHRyaWJ1dGVfXygoYWxsb2Nfc2l6ZSgxLDIpKSk7Ci12b2lkKiBteV9yZWFsbG9jKHZvaWQqLCB1bnNpZ25lZCkgX19hdHRyaWJ1dGVfXygoYWxsb2Nfc2l6ZSgyKSkpOwotCi0KLXZvaWQqIGZuMShpbnQpIF9fYXR0cmlidXRlX18oKGFsbG9jX3NpemUoInhwdG8iKSkpOyAvLyBleHBlY3RlZC1lcnJvcnt7J2FsbG9jX3NpemUnIGF0dHJpYnV0ZSByZXF1aXJlcyBwYXJhbWV0ZXIgMSB0byBiZSBhbiBpbnRlZ2VyIGNvbnN0YW50fX0KLQotdm9pZCogZm4yKHZvaWQqKSBfX2F0dHJpYnV0ZV9fKChhbGxvY19zaXplKDEpKSk7IC8vIGV4cGVjdGVkLWVycm9ye3snYWxsb2Nfc2l6ZScgYXR0cmlidXRlIHJlcXVpcmVzIGFuIGludGVnZXIgY29uc3RhbnR9fQotCi12b2lkKiBmbjModW5zaWduZWQpIF9fYXR0cmlidXRlX18oKGFsbG9jX3NpemUoMCkpKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2F0dHJpYnV0ZSBwYXJhbWV0ZXIgMSBpcyBvdXQgb2YgYm91bmRzfX0KLXZvaWQqIGZuNCh1bnNpZ25lZCkgX19hdHRyaWJ1dGVfXygoYWxsb2Nfc2l6ZSgyKSkpOyAvLyBleHBlY3RlZC1lcnJvcnt7YXR0cmlidXRlIHBhcmFtZXRlciAxIGlzIG91dCBvZiBib3VuZHN9fQotCi12b2lkIGZuNSh1bnNpZ25lZCkgX19hdHRyaWJ1dGVfXygoYWxsb2Nfc2l6ZSgxKSkpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEgcG9pbnRlcn19Ci1jaGFyIGZuNih1bnNpZ25lZCkgX19hdHRyaWJ1dGVfXygoYWxsb2Nfc2l6ZSgxKSkpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEgcG9pbnRlcn19Ci0KLXZvaWQqIGZuNyh1bnNpZ25lZCkgX19hdHRyaWJ1dGVfXygoYWxsb2Nfc2l6ZSkpOyAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KLQotdm9pZCAqZm44KGludCwgaW50KSBfX2F0dHJpYnV0ZV9fKChhbGxvY19zaXplKDEsIDEpKSk7IC8vIE9LCi0KLXZvaWQqIGZuOSh1bnNpZ25lZCkgX19hdHRyaWJ1dGVfXygoYWxsb2Nfc2l6ZSgxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMykpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbnRlZ2VyIGNvbnN0YW50IGlzIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IHVuc2lnbmVkIGludGVnZXIgdHlwZX19IC8vIGV4cGVjdGVkLWVycm9yIHt7YXR0cmlidXRlIHBhcmFtZXRlciAxIGlzIG91dCBvZiBib3VuZHN9fQotCi12b2lkKiBmbjEwKHNpemVfdCwgc2l6ZV90KSBfX2F0dHJpYnV0ZV9fKChhbGxvY19zaXplKDEsMikpKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlZGVmaW5pdGlvbiBvZiBwYXJhbWV0ZXJ9fSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtZXJyb3J7e2EgcGFyYW1ldGVyIGxpc3Qgd2l0aG91dCB0eXBlcyBpcyBvbmx5IGFsbG93ZWQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9ufX0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLWVycm9ye3thdHRyaWJ1dGUgcGFyYW1ldGVyIDEgaXMgb3V0IG9mIGJvdW5kc319Ci12b2lkKiBmbjExKCkgX19hdHRyaWJ1dGVfXygoYWxsb2Nfc2l6ZSgxKSkpOyAvLyBleHBlY3RlZC1lcnJvcnt7YXR0cmlidXRlIHBhcmFtZXRlciAxIGlzIG91dCBvZiBib3VuZHN9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2FybS1pbnRlcnJ1cHQtYXR0ci5jIGIvdGVzdC9TZW1hL2FybS1pbnRlcnJ1cHQtYXR0ci5jCmluZGV4IGIyY2VkYzIuLmU4ZjIxYWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9hcm0taW50ZXJydXB0LWF0dHIuYworKysgYi90ZXN0L1NlbWEvYXJtLWludGVycnVwdC1hdHRyLmMKQEAgLTEsOSArMSw5IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSBhcm0tYXBwbGUtZGFyd2luIC12ZXJpZnkgLWZzeW50YXgtb25seQogCi1fX2F0dHJpYnV0ZV9fKChpbnRlcnJ1cHQoSVJRKSkpIHZvaWQgZm9vKCkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3snaW50ZXJydXB0JyBhdHRyaWJ1dGUgcmVxdWlyZXMgYSBzdHJpbmd9fSAKK19fYXR0cmlidXRlX18oKGludGVycnVwdChJUlEpKSkgdm9pZCBmb28oKSB7fSAvLyBleHBlY3RlZC1lcnJvciB7eydpbnRlcnJ1cHQnIGF0dHJpYnV0ZSByZXF1aXJlcyBhIHN0cmluZ319CiBfX2F0dHJpYnV0ZV9fKChpbnRlcnJ1cHQoImlycSIpKSkgdm9pZCBmb28xKCkge30gLy8gZXhwZWN0ZWQtd2FybmluZyB7eydpbnRlcnJ1cHQnIGF0dHJpYnV0ZSBhcmd1bWVudCBub3Qgc3VwcG9ydGVkOiBpcnF9fQogCi1fX2F0dHJpYnV0ZV9fKChpbnRlcnJ1cHQoIklSUSIsIDEpKSkgdm9pZCBmb28yKCkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3thdHRyaWJ1dGUgdGFrZXMgbm8gbW9yZSB0aGFuIDEgYXJndW1lbnR9fQorX19hdHRyaWJ1dGVfXygoaW50ZXJydXB0KCJJUlEiLCAxKSkpIHZvaWQgZm9vMigpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7J2ludGVycnVwdCcgYXR0cmlidXRlIHRha2VzIG5vIG1vcmUgdGhhbiAxIGFyZ3VtZW50fX0KIAogX19hdHRyaWJ1dGVfXygoaW50ZXJydXB0KCJJUlEiKSkpIHZvaWQgZm9vMygpIHt9CiBfX2F0dHJpYnV0ZV9fKChpbnRlcnJ1cHQoIkZJUSIpKSkgdm9pZCBmb280KCkge30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9hcm02NC1pbmxpbmUtYXNtLmMgYi90ZXN0L1NlbWEvYXJtNjQtaW5saW5lLWFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTM2MjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWEvYXJtNjQtaW5saW5lLWFzbS5jCkBAIC0wLDAgKzEsOCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zNy4xIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcwordm9pZCBmb28oKSB7CisgIGFzbSB2b2xhdGlsZSgiVVNFKCUwKSIgOjogInoiKDBMTCkpOworICBhc20gdm9sYXRpbGUoIlVTRSgleDApIiA6OiAieiIoMExMKSk7CisgIGFzbSB2b2xhdGlsZSgiVVNFKCV3MCkiIDo6ICJ6IigwKSk7CisKKyAgYXNtIHZvbGF0aWxlKCJVU0UoJTApIiA6OiAieiIoMCkpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dmFsdWUgc2l6ZSBkb2VzIG5vdCBtYXRjaCByZWdpc3RlciBzaXplIHNwZWNpZmllZCBieSB0aGUgY29uc3RyYWludCBhbmQgbW9kaWZpZXJ9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2FybTY0LW5lb24tYXJncy5jIGIvdGVzdC9TZW1hL2FybTY0LW5lb24tYXJncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTY1M2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWEvYXJtNjQtbmVvbi1hcmdzLmMKQEAgLTAsMCArMSwxMyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtYXBwbGUtZGFyd2luIC1mc3ludGF4LW9ubHkgLWZmcmVlc3RhbmRpbmcgLXZlcmlmeSAlcworCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworLy8gcmRhcjovLzEzNTI3OTAwCit2b2lkIHZjb3B5X3JlamVjdChmbG9hdDMyeDRfdCB2T3V0MCwgZmxvYXQzMng0X3QgdkFscGhhLCBpbnQgdCkgeworICB2Y29weXFfbGFuZXFfZjMyKHZPdXQwLCAxLCB2QWxwaGEsIHQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FyZ3VtZW50IHRvICdfX2J1aWx0aW5fbmVvbl92Z2V0cV9sYW5lX2YzMicgbXVzdCBiZSBhIGNvbnN0YW50IGludGVnZXJ9fSBleHBlY3RlZC1lcnJvciB7e2luaXRpYWxpemluZyAnZmxvYXQzMl90JyAoYWthICdmbG9hdCcpIHdpdGggYW4gZXhwcmVzc2lvbiBvZiBpbmNvbXBhdGlibGUgdHlwZSAndm9pZCd9fQorfQorCisvLyByZGFyOi8vcHJvYmxlbS8xNTI1NjE5OQorZmxvYXQzMng0X3QgdGVzdF92bWxzcV9sYW5lKGZsb2F0MzJ4NF90IGFjY3VtLCBmbG9hdDMyeDRfdCBsaHMsIGZsb2F0MzJ4Ml90IHJocykgeworICByZXR1cm4gdm1sc3FfbGFuZV9mMzIoYWNjdW0sIGxocywgcmhzLCAxKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9hc20uYyBiL3Rlc3QvU2VtYS9hc20uYwppbmRleCBjODFmMTZhLi4xNTU5YjIyIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvYXNtLmMKKysrIGIvdGVzdC9TZW1hL2FzbS5jCkBAIC0xMyw2ICsxMyw5IEBACiAgIGFzbSAoImZvb1xuIiA6ICI9YSIgKGkpIDogIlsiIChpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW52YWxpZCBpbnB1dCBjb25zdHJhaW50ICdbJyBpbiBhc219fQogICBhc20gKCJmb29cbiIgOiAiPWEiIChpKSA6ICJbZm9vIiAoaSkpOyAvLyBleHBlY3RlZC1lcnJvciB7e2ludmFsaWQgaW5wdXQgY29uc3RyYWludCAnW2ZvbycgaW4gYXNtfX0KICAgYXNtICgiZm9vXG4iIDogIj1hIiAoaSkgOiAiW3N5bWJvbGljX25hbWVdIiAoaSkpOyAvLyBleHBlY3RlZC1lcnJvciB7e2ludmFsaWQgaW5wdXQgY29uc3RyYWludCAnW3N5bWJvbGljX25hbWVdJyBpbiBhc219fQorCisgIGFzbSAoImZvb1xuIiA6IDogIiIgKGkpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbnZhbGlkIGlucHV0IGNvbnN0cmFpbnQgJycgaW4gYXNtfX0KKyAgYXNtICgiZm9vXG4iIDogIj1hIiAoaSkgOiAiIiAoaSkpOyAvLyBleHBlY3RlZC1lcnJvciB7e2ludmFsaWQgaW5wdXQgY29uc3RyYWludCAnJyBpbiBhc219fQogfQogCiB2b2lkIGNsb2JiZXJzKCkgewpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2F0b21pYy1vcHMuYyBiL3Rlc3QvU2VtYS9hdG9taWMtb3BzLmMKaW5kZXggYzJkMzhlNy4uNmY5ZjU2OCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL2F0b21pYy1vcHMuYworKysgYi90ZXN0L1NlbWEvYXRvbWljLW9wcy5jCkBAIC0xODIsMyArMTgyLDIyNSBAQAogICBmbGFnIGZsYWd2YXIgPSB7IDAgfTsKICAgUFIxNjkzMSgmZmxhZ3Zhcik7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlc319CiB9CisKK3ZvaWQgbWVtb3J5X2NoZWNrcyhfQXRvbWljKGludCkgKkFwLCBpbnQgKnAsIGludCB2YWwpIHsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2xvYWQoQXAsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2xvYWQoQXAsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2xvYWQoQXAsIG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2xvYWQoQXAsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21lbW9yeSBvcmRlciBhcmd1bWVudCB0byBhdG9taWMgb3BlcmF0aW9uIGlzIGludmFsaWR9fQorICAodm9pZClfX2MxMV9hdG9taWNfbG9hZChBcCwgbWVtb3J5X29yZGVyX2FjcV9yZWwpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWVtb3J5IG9yZGVyIGFyZ3VtZW50IHRvIGF0b21pYyBvcGVyYXRpb24gaXMgaW52YWxpZH19CisgICh2b2lkKV9fYzExX2F0b21pY19sb2FkKEFwLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICh2b2lkKV9fYzExX2F0b21pY19sb2FkKEFwLCB2YWwpOworICAodm9pZClfX2MxMV9hdG9taWNfbG9hZChBcCwgLTEpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWVtb3J5IG9yZGVyIGFyZ3VtZW50IHRvIGF0b21pYyBvcGVyYXRpb24gaXMgaW52YWxpZH19CisgICh2b2lkKV9fYzExX2F0b21pY19sb2FkKEFwLCA0Mik7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZW1vcnkgb3JkZXIgYXJndW1lbnQgdG8gYXRvbWljIG9wZXJhdGlvbiBpcyBpbnZhbGlkfX0KKworICAodm9pZClfX2MxMV9hdG9taWNfc3RvcmUoQXAsIHZhbCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2MxMV9hdG9taWNfc3RvcmUoQXAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWVtb3J5IG9yZGVyIGFyZ3VtZW50IHRvIGF0b21pYyBvcGVyYXRpb24gaXMgaW52YWxpZH19CisgICh2b2lkKV9fYzExX2F0b21pY19zdG9yZShBcCwgdmFsLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZW1vcnkgb3JkZXIgYXJndW1lbnQgdG8gYXRvbWljIG9wZXJhdGlvbiBpcyBpbnZhbGlkfX0KKyAgKHZvaWQpX19jMTFfYXRvbWljX3N0b3JlKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX3N0b3JlKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21lbW9yeSBvcmRlciBhcmd1bWVudCB0byBhdG9taWMgb3BlcmF0aW9uIGlzIGludmFsaWR9fQorICAodm9pZClfX2MxMV9hdG9taWNfc3RvcmUoQXAsIHZhbCwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICh2b2lkKV9fYzExX2F0b21pY19mZXRjaF9hZGQoQXAsIDEsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX2FkZChBcCwgMSwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAodm9pZClfX2MxMV9hdG9taWNfZmV0Y2hfYWRkKEFwLCAxLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICh2b2lkKV9fYzExX2F0b21pY19mZXRjaF9hZGQoQXAsIDEsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX2FkZChBcCwgMSwgbWVtb3J5X29yZGVyX2FjcV9yZWwpOworICAodm9pZClfX2MxMV9hdG9taWNfZmV0Y2hfYWRkKEFwLCAxLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisKKyAgKHZvaWQpX19jMTFfYXRvbWljX2luaXQoQXAsIHZhbCk7CisgICh2b2lkKV9fYzExX2F0b21pY19pbml0KEFwLCB2YWwpOworICAodm9pZClfX2MxMV9hdG9taWNfaW5pdChBcCwgdmFsKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2luaXQoQXAsIHZhbCk7CisgICh2b2lkKV9fYzExX2F0b21pY19pbml0KEFwLCB2YWwpOworICAodm9pZClfX2MxMV9hdG9taWNfaW5pdChBcCwgdmFsKTsKKworICAodm9pZClfX2MxMV9hdG9taWNfZmV0Y2hfc3ViKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX3N1YihBcCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICh2b2lkKV9fYzExX2F0b21pY19mZXRjaF9zdWIoQXAsIHZhbCwgbWVtb3J5X29yZGVyX2NvbnN1bWUpOworICAodm9pZClfX2MxMV9hdG9taWNfZmV0Y2hfc3ViKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX3N1YihBcCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisgICh2b2lkKV9fYzExX2F0b21pY19mZXRjaF9zdWIoQXAsIHZhbCwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICh2b2lkKV9fYzExX2F0b21pY19mZXRjaF9hbmQoQXAsIHZhbCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2MxMV9hdG9taWNfZmV0Y2hfYW5kKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX2FuZChBcCwgdmFsLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICh2b2lkKV9fYzExX2F0b21pY19mZXRjaF9hbmQoQXAsIHZhbCwgbWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAodm9pZClfX2MxMV9hdG9taWNfZmV0Y2hfYW5kKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX2FuZChBcCwgdmFsLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX29yKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX29yKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX29yKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX29yKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX29yKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX29yKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKworICAodm9pZClfX2MxMV9hdG9taWNfZmV0Y2hfeG9yKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX3hvcihBcCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICh2b2lkKV9fYzExX2F0b21pY19mZXRjaF94b3IoQXAsIHZhbCwgbWVtb3J5X29yZGVyX2NvbnN1bWUpOworICAodm9pZClfX2MxMV9hdG9taWNfZmV0Y2hfeG9yKEFwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2ZldGNoX3hvcihBcCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisgICh2b2lkKV9fYzExX2F0b21pY19mZXRjaF94b3IoQXAsIHZhbCwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICh2b2lkKV9fYzExX2F0b21pY19leGNoYW5nZShBcCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYzExX2F0b21pY19leGNoYW5nZShBcCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICh2b2lkKV9fYzExX2F0b21pY19leGNoYW5nZShBcCwgdmFsLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICh2b2lkKV9fYzExX2F0b21pY19leGNoYW5nZShBcCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICh2b2lkKV9fYzExX2F0b21pY19leGNoYW5nZShBcCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisgICh2b2lkKV9fYzExX2F0b21pY19leGNoYW5nZShBcCwgdmFsLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisKKyAgKHZvaWQpX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKEFwLCBwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYzExX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhBcCwgcCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoQXAsIHAsIHZhbCwgbWVtb3J5X29yZGVyX2NvbnN1bWUsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKEFwLCBwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxlYXNlLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYzExX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhBcCwgcCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoQXAsIHAsIHZhbCwgbWVtb3J5X29yZGVyX3NlcV9jc3QsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKworICAodm9pZClfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrKEFwLCBwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYzExX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsoQXAsIHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcXVpcmUsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhBcCwgcCwgdmFsLCBtZW1vcnlfb3JkZXJfY29uc3VtZSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2MxMV9hdG9taWNfY29tcGFyZV9leGNoYW5nZV93ZWFrKEFwLCBwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxlYXNlLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYzExX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsoQXAsIHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcV9yZWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19jMTFfYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhBcCwgcCwgdmFsLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworCisgICh2b2lkKV9fYXRvbWljX2xvYWRfbihwLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYXRvbWljX2xvYWRfbihwLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICh2b2lkKV9fYXRvbWljX2xvYWRfbihwLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICh2b2lkKV9fYXRvbWljX2xvYWRfbihwLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZW1vcnkgb3JkZXIgYXJndW1lbnQgdG8gYXRvbWljIG9wZXJhdGlvbiBpcyBpbnZhbGlkfX0KKyAgKHZvaWQpX19hdG9taWNfbG9hZF9uKHAsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21lbW9yeSBvcmRlciBhcmd1bWVudCB0byBhdG9taWMgb3BlcmF0aW9uIGlzIGludmFsaWR9fQorICAodm9pZClfX2F0b21pY19sb2FkX24ocCwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICh2b2lkKV9fYXRvbWljX2xvYWQocCwgcCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2F0b21pY19sb2FkKHAsIHAsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgKHZvaWQpX19hdG9taWNfbG9hZChwLCBwLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICh2b2lkKV9fYXRvbWljX2xvYWQocCwgcCwgbWVtb3J5X29yZGVyX3JlbGVhc2UpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWVtb3J5IG9yZGVyIGFyZ3VtZW50IHRvIGF0b21pYyBvcGVyYXRpb24gaXMgaW52YWxpZH19CisgICh2b2lkKV9fYXRvbWljX2xvYWQocCwgcCwgbWVtb3J5X29yZGVyX2FjcV9yZWwpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWVtb3J5IG9yZGVyIGFyZ3VtZW50IHRvIGF0b21pYyBvcGVyYXRpb24gaXMgaW52YWxpZH19CisgICh2b2lkKV9fYXRvbWljX2xvYWQocCwgcCwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICh2b2lkKV9fYXRvbWljX3N0b3JlKHAsIHAsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19hdG9taWNfc3RvcmUocCwgcCwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWVtb3J5IG9yZGVyIGFyZ3VtZW50IHRvIGF0b21pYyBvcGVyYXRpb24gaXMgaW52YWxpZH19CisgICh2b2lkKV9fYXRvbWljX3N0b3JlKHAsIHAsIG1lbW9yeV9vcmRlcl9jb25zdW1lKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21lbW9yeSBvcmRlciBhcmd1bWVudCB0byBhdG9taWMgb3BlcmF0aW9uIGlzIGludmFsaWR9fQorICAodm9pZClfX2F0b21pY19zdG9yZShwLCBwLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICh2b2lkKV9fYXRvbWljX3N0b3JlKHAsIHAsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21lbW9yeSBvcmRlciBhcmd1bWVudCB0byBhdG9taWMgb3BlcmF0aW9uIGlzIGludmFsaWR9fQorICAodm9pZClfX2F0b21pY19zdG9yZShwLCBwLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisKKyAgKHZvaWQpX19hdG9taWNfc3RvcmVfbihwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19hdG9taWNfc3RvcmVfbihwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21lbW9yeSBvcmRlciBhcmd1bWVudCB0byBhdG9taWMgb3BlcmF0aW9uIGlzIGludmFsaWR9fQorICAodm9pZClfX2F0b21pY19zdG9yZV9uKHAsIHZhbCwgbWVtb3J5X29yZGVyX2NvbnN1bWUpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWVtb3J5IG9yZGVyIGFyZ3VtZW50IHRvIGF0b21pYyBvcGVyYXRpb24gaXMgaW52YWxpZH19CisgICh2b2lkKV9fYXRvbWljX3N0b3JlX24ocCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICh2b2lkKV9fYXRvbWljX3N0b3JlX24ocCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZW1vcnkgb3JkZXIgYXJndW1lbnQgdG8gYXRvbWljIG9wZXJhdGlvbiBpcyBpbnZhbGlkfX0KKyAgKHZvaWQpX19hdG9taWNfc3RvcmVfbihwLCB2YWwsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKworICAodm9pZClfX2F0b21pY19mZXRjaF9hZGQocCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX2FkZChwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgKHZvaWQpX19hdG9taWNfZmV0Y2hfYWRkKHAsIHZhbCwgbWVtb3J5X29yZGVyX2NvbnN1bWUpOworICAodm9pZClfX2F0b21pY19mZXRjaF9hZGQocCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX2FkZChwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKyAgKHZvaWQpX19hdG9taWNfZmV0Y2hfYWRkKHAsIHZhbCwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICh2b2lkKV9fYXRvbWljX2ZldGNoX3N1YihwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19hdG9taWNfZmV0Y2hfc3ViKHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAodm9pZClfX2F0b21pY19mZXRjaF9zdWIocCwgdmFsLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX3N1YihwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgKHZvaWQpX19hdG9taWNfZmV0Y2hfc3ViKHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcV9yZWwpOworICAodm9pZClfX2F0b21pY19mZXRjaF9zdWIocCwgdmFsLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisKKyAgKHZvaWQpX19hdG9taWNfYWRkX2ZldGNoKHAsIHZhbCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2F0b21pY19hZGRfZmV0Y2gocCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICh2b2lkKV9fYXRvbWljX2FkZF9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKyAgKHZvaWQpX19hdG9taWNfYWRkX2ZldGNoKHAsIHZhbCwgbWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAodm9pZClfX2F0b21pY19hZGRfZmV0Y2gocCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisgICh2b2lkKV9fYXRvbWljX2FkZF9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKworICAodm9pZClfX2F0b21pY19zdWJfZmV0Y2gocCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYXRvbWljX3N1Yl9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgKHZvaWQpX19hdG9taWNfc3ViX2ZldGNoKHAsIHZhbCwgbWVtb3J5X29yZGVyX2NvbnN1bWUpOworICAodm9pZClfX2F0b21pY19zdWJfZmV0Y2gocCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICh2b2lkKV9fYXRvbWljX3N1Yl9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKyAgKHZvaWQpX19hdG9taWNfc3ViX2ZldGNoKHAsIHZhbCwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICh2b2lkKV9fYXRvbWljX2ZldGNoX2FuZChwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19hdG9taWNfZmV0Y2hfYW5kKHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAodm9pZClfX2F0b21pY19mZXRjaF9hbmQocCwgdmFsLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX2FuZChwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgKHZvaWQpX19hdG9taWNfZmV0Y2hfYW5kKHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcV9yZWwpOworICAodm9pZClfX2F0b21pY19mZXRjaF9hbmQocCwgdmFsLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisKKyAgKHZvaWQpX19hdG9taWNfZmV0Y2hfb3IocCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX29yKHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAodm9pZClfX2F0b21pY19mZXRjaF9vcihwLCB2YWwsIG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKyAgKHZvaWQpX19hdG9taWNfZmV0Y2hfb3IocCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX29yKHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcV9yZWwpOworICAodm9pZClfX2F0b21pY19mZXRjaF9vcihwLCB2YWwsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKworICAodm9pZClfX2F0b21pY19mZXRjaF94b3IocCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX3hvcihwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgKHZvaWQpX19hdG9taWNfZmV0Y2hfeG9yKHAsIHZhbCwgbWVtb3J5X29yZGVyX2NvbnN1bWUpOworICAodm9pZClfX2F0b21pY19mZXRjaF94b3IocCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX3hvcihwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKyAgKHZvaWQpX19hdG9taWNfZmV0Y2hfeG9yKHAsIHZhbCwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICh2b2lkKV9fYXRvbWljX2ZldGNoX25hbmQocCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX25hbmQocCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX25hbmQocCwgdmFsLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX25hbmQocCwgdmFsLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX25hbmQocCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisgICh2b2lkKV9fYXRvbWljX2ZldGNoX25hbmQocCwgdmFsLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisKKyAgKHZvaWQpX19hdG9taWNfYW5kX2ZldGNoKHAsIHZhbCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2F0b21pY19hbmRfZmV0Y2gocCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICh2b2lkKV9fYXRvbWljX2FuZF9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKyAgKHZvaWQpX19hdG9taWNfYW5kX2ZldGNoKHAsIHZhbCwgbWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAodm9pZClfX2F0b21pY19hbmRfZmV0Y2gocCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisgICh2b2lkKV9fYXRvbWljX2FuZF9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKworICAodm9pZClfX2F0b21pY19vcl9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19hdG9taWNfb3JfZmV0Y2gocCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICh2b2lkKV9fYXRvbWljX29yX2ZldGNoKHAsIHZhbCwgbWVtb3J5X29yZGVyX2NvbnN1bWUpOworICAodm9pZClfX2F0b21pY19vcl9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgKHZvaWQpX19hdG9taWNfb3JfZmV0Y2gocCwgdmFsLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisgICh2b2lkKV9fYXRvbWljX29yX2ZldGNoKHAsIHZhbCwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICh2b2lkKV9fYXRvbWljX3hvcl9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19hdG9taWNfeG9yX2ZldGNoKHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAodm9pZClfX2F0b21pY194b3JfZmV0Y2gocCwgdmFsLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICh2b2lkKV9fYXRvbWljX3hvcl9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgKHZvaWQpX19hdG9taWNfeG9yX2ZldGNoKHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcV9yZWwpOworICAodm9pZClfX2F0b21pY194b3JfZmV0Y2gocCwgdmFsLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisKKyAgKHZvaWQpX19hdG9taWNfbmFuZF9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19hdG9taWNfbmFuZF9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgKHZvaWQpX19hdG9taWNfbmFuZF9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9jb25zdW1lKTsKKyAgKHZvaWQpX19hdG9taWNfbmFuZF9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgKHZvaWQpX19hdG9taWNfbmFuZF9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKyAgKHZvaWQpX19hdG9taWNfbmFuZF9mZXRjaChwLCB2YWwsIG1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKworICAodm9pZClfX2F0b21pY19leGNoYW5nZV9uKHAsIHZhbCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2F0b21pY19leGNoYW5nZV9uKHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAodm9pZClfX2F0b21pY19leGNoYW5nZV9uKHAsIHZhbCwgbWVtb3J5X29yZGVyX2NvbnN1bWUpOworICAodm9pZClfX2F0b21pY19leGNoYW5nZV9uKHAsIHZhbCwgbWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAodm9pZClfX2F0b21pY19leGNoYW5nZV9uKHAsIHZhbCwgbWVtb3J5X29yZGVyX2FjcV9yZWwpOworICAodm9pZClfX2F0b21pY19leGNoYW5nZV9uKHAsIHZhbCwgbWVtb3J5X29yZGVyX3NlcV9jc3QpOworCisgICh2b2lkKV9fYXRvbWljX2V4Y2hhbmdlKHAsIHAsIHAsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19hdG9taWNfZXhjaGFuZ2UocCwgcCwgcCwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAodm9pZClfX2F0b21pY19leGNoYW5nZShwLCBwLCBwLCBtZW1vcnlfb3JkZXJfY29uc3VtZSk7CisgICh2b2lkKV9fYXRvbWljX2V4Y2hhbmdlKHAsIHAsIHAsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgKHZvaWQpX19hdG9taWNfZXhjaGFuZ2UocCwgcCwgcCwgbWVtb3J5X29yZGVyX2FjcV9yZWwpOworICAodm9pZClfX2F0b21pY19leGNoYW5nZShwLCBwLCBwLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisKKyAgKHZvaWQpX19hdG9taWNfY29tcGFyZV9leGNoYW5nZShwLCBwLCBwLCAwLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlKHAsIHAsIHAsIDAsIG1lbW9yeV9vcmRlcl9hY3F1aXJlLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UocCwgcCwgcCwgMCwgbWVtb3J5X29yZGVyX2NvbnN1bWUsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgKHZvaWQpX19hdG9taWNfY29tcGFyZV9leGNoYW5nZShwLCBwLCBwLCAwLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlKHAsIHAsIHAsIDAsIG1lbW9yeV9vcmRlcl9hY3FfcmVsLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICh2b2lkKV9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UocCwgcCwgcCwgMCwgbWVtb3J5X29yZGVyX3NlcV9jc3QsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKworICAodm9pZClfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24ocCwgcCwgdmFsLCAwLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24ocCwgcCwgdmFsLCAwLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24ocCwgcCwgdmFsLCAwLCBtZW1vcnlfb3JkZXJfY29uc3VtZSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24ocCwgcCwgdmFsLCAwLCBtZW1vcnlfb3JkZXJfcmVsZWFzZSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24ocCwgcCwgdmFsLCAwLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAodm9pZClfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlX24ocCwgcCwgdmFsLCAwLCBtZW1vcnlfb3JkZXJfc2VxX2NzdCwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2F0dHItYWxpYXMtZWxmLmMgYi90ZXN0L1NlbWEvYXR0ci1hbGlhcy1lbGYuYwppbmRleCA4OGJkN2I3Li4wMWJjMTg3IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvYXR0ci1hbGlhcy1lbGYuYworKysgYi90ZXN0L1NlbWEvYXR0ci1hbGlhcy1lbGYuYwpAQCAtNTIsMyArNTIsNyBAQAogCiBleHRlcm4gaW50IGE0IF9fYXR0cmlidXRlX18oKGFsaWFzKCJiNCIpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YWxpYXMgbXVzdCBwb2ludCB0byBhIGRlZmluZWQgdmFyaWFibGUgb3IgZnVuY3Rpb259fQogdHlwZWRlZiBpbnQgYjQ7CisKK3ZvaWQgdGVzdDJfYmFyKCkge30KK3ZvaWQgdGVzdDJfZm9vKCkgX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoInRlc3QyX2JhciIpKSk7Cit2b2lkIHRlc3QyX3plZCgpIF9fYXR0cmlidXRlX18oKGFsaWFzKCJ0ZXN0Ml9mb28iKSkpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWxpYXMgd2lsbCBhbHdheXMgcmVzb2x2ZSB0byB0ZXN0Ml9iYXIgZXZlbiBpZiB3ZWFrIGRlZmluaXRpb24gb2YgYWxpYXMgdGVzdDJfZm9vIGlzIG92ZXJyaWRkZW59fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2F0dHItYWxpZ25lZC5jIGIvdGVzdC9TZW1hL2F0dHItYWxpZ25lZC5jCmluZGV4IDkyZjI3NDIuLmFkNTkzNTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9hdHRyLWFsaWduZWQuYworKysgYi90ZXN0L1NlbWEvYXR0ci1hbGlnbmVkLmMKQEAgLTEsNiArMSw3IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpMzg2LWFwcGxlLWRhcndpbjkgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCiAKIGludCB4IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMykpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZXF1ZXN0ZWQgYWxpZ25tZW50IGlzIG5vdCBhIHBvd2VyIG9mIDJ9fQoraW50IHkgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxIDw8IDI5KSkpOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlcXVlc3RlZCBhbGlnbm1lbnQgbXVzdCBiZSAyNjg0MzU0NTYgYnl0ZXMgb3Igc21hbGxlcn19CiAKIC8vIFBSMzI1NAogc2hvcnQgZzBbM10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCkpOwpAQCAtMjAsNiArMjEsMTIgQEAKIGNoYXIgYTJbX19hbGlnbm9mX18oYSkgPT0gMT8gOiAtMV0gPSB7IDAgfTsKIGNoYXIgYTNbc2l6ZW9mKGEpID09IDE/IDogLTFdID0geyAwIH07CiAKK3R5cGVkZWYgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMSkpKSB1bmRlcmFsaWduZWRfbG9uZ2xvbmc7CitjaGFyIGE0W19fYWxpZ25vZl9fKHVuZGVyYWxpZ25lZF9sb25nbG9uZykgPT0gMSA/OiAtMV0gPSB7MH07CisKK3R5cGVkZWYgbG9uZyBsb25nIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMSkpKSB1bmRlcmFsaWduZWRfY29tcGxleF9sb25nbG9uZzsKK2NoYXIgYTVbX19hbGlnbm9mX18odW5kZXJhbGlnbmVkX2NvbXBsZXhfbG9uZ2xvbmcpID09IDEgPzogLTFdID0gezB9OworCiAvLyByZGFyOi8vcHJvYmxlbS84MzM1ODY1CiBpbnQgYiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDIpKSk7CiBjaGFyIGIxW19fYWxpZ25vZl9fKGIpID09IDIgPzogLTFdID0gezB9OwpAQCAtMzIsNyArMzksNyBAQAogY2hhciBkMVtfX2FsaWdub2ZfXyhkKSA9PSAyID86IC0xXSA9IHswfTsKIGNoYXIgZDJbX19hbGlnbm9mX18oZC5tZW1iZXIpID09IDIgPzogLTFdID0gezB9OwogCi1zdHJ1Y3QgRSB7IGludCBtZW1iZXIgX19hdHRyaWJ1dGVfXygoYWxpZ24oMikpKTsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK3N0cnVjdCBFIHsgaW50IG1lbWJlciBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDIpKSk7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiBzdHJ1Y3QgRSBlOwogY2hhciBlMVtfX2FsaWdub2ZfXyhlKSA9PSAyID86IC0xXSA9IHswfTsKIGNoYXIgZTJbX19hbGlnbm9mX18oZS5tZW1iZXIpID09IDIgPzogLTFdID0gezB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2F0dHItYXZhaWxhYmlsaXR5LWlvcy5jIGIvdGVzdC9TZW1hL2F0dHItYXZhaWxhYmlsaXR5LWlvcy5jCmluZGV4IDMyOTA2OGMuLjY0NjJkNTggMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9hdHRyLWF2YWlsYWJpbGl0eS1pb3MuYworKysgYi90ZXN0L1NlbWEvYXR0ci1hdmFpbGFiaWxpdHktaW9zLmMKQEAgLTEsMTQgKzEsMTQgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAiLXRyaXBsZSIgIng4Nl82NC1hcHBsZS1pb3MzLjAiIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcwogCi12b2lkIGYwKGludCkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTIuMCxkZXByZWNhdGVkPTIuMSkpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydmMCcgZGVjbGFyZWQgaGVyZX19Cit2b2lkIGYwKGludCkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTIuMCxkZXByZWNhdGVkPTIuMSkpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydmMCcgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIHZvaWQgZjEoaW50KSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkoaW9zLGludHJvZHVjZWQ9Mi4xKSkpOwotdm9pZCBmMihpbnQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShpb3MsaW50cm9kdWNlZD0yLjAsZGVwcmVjYXRlZD0zLjApKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snZjInIGRlY2xhcmVkIGhlcmV9fQordm9pZCBmMihpbnQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShpb3MsaW50cm9kdWNlZD0yLjAsZGVwcmVjYXRlZD0zLjApKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snZjInIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiB2b2lkIGYzKGludCkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTMuMCkpKTsKIHZvaWQgZjQoaW50KSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuMSxkZXByZWNhdGVkPTEwLjMsb2Jzb2xldGVkPTEwLjUpLCBhdmFpbGFiaWxpdHkoaW9zLGludHJvZHVjZWQ9Mi4wLGRlcHJlY2F0ZWQ9Mi4xLG9ic29sZXRlZD0zLjApKSk7IC8vIGV4cGVjdGVkLW5vdGV7e2V4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlfX0KIAotdm9pZCBmNShpbnQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShpb3MsaW50cm9kdWNlZD0yLjApKSkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxkZXByZWNhdGVkPTMuMCkpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydmNScgZGVjbGFyZWQgaGVyZX19Cit2b2lkIGY1KGludCkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTIuMCkpKSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkoaW9zLGRlcHJlY2F0ZWQ9My4wKSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J2Y1JyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogdm9pZCBmNihpbnQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShpb3MsZGVwcmVjYXRlZD0zLjApKSk7Ci12b2lkIGY2KGludCkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTIuMCkpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydmNicgZGVjbGFyZWQgaGVyZX19Cit2b2lkIGY2KGludCkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTIuMCkpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydmNicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIAogdm9pZCB0ZXN0KCkgewogICBmMCgwKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2YwJyBpcyBkZXByZWNhdGVkOiBmaXJzdCBkZXByZWNhdGVkIGluIGlPUyAyLjF9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2F0dHItYXZhaWxhYmlsaXR5LW1hY29zeC5jIGIvdGVzdC9TZW1hL2F0dHItYXZhaWxhYmlsaXR5LW1hY29zeC5jCmluZGV4IDQ2OGU5MzAuLjM4ZjE0OWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9hdHRyLWF2YWlsYWJpbGl0eS1tYWNvc3guYworKysgYi90ZXN0L1NlbWEvYXR0ci1hdmFpbGFiaWxpdHktbWFjb3N4LmMKQEAgLTIsMTAgKzIsMTAgQEAKIAogdm9pZCBmMChpbnQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC40LGRlcHJlY2F0ZWQ9MTAuNikpKTsKIHZvaWQgZjEoaW50KSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNSkpKTsKLXZvaWQgZjIoaW50KSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNCxkZXByZWNhdGVkPTEwLjUpKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snZjInIGRlY2xhcmVkIGhlcmV9fQordm9pZCBmMihpbnQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC40LGRlcHJlY2F0ZWQ9MTAuNSkpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydmMicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIHZvaWQgZjMoaW50KSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNikpKTsKIHZvaWQgZjQoaW50KSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuMSxkZXByZWNhdGVkPTEwLjMsb2Jzb2xldGVkPTEwLjUpLCBhdmFpbGFiaWxpdHkoaW9zLGludHJvZHVjZWQ9Mi4wLGRlcHJlY2F0ZWQ9My4wKSkpOyAvLyBleHBlY3RlZC1ub3Rle3tleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZX19Ci12b2lkIGY1KGludCkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTMuMiksIGF2YWlsYWJpbGl0eShtYWNvc3gsdW5hdmFpbGFibGUpKSk7IC8vIGV4cGVjdGVkLW5vdGV7e2Z1bmN0aW9uIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQordm9pZCBmNShpbnQpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShpb3MsaW50cm9kdWNlZD0zLjIpLCBhdmFpbGFiaWxpdHkobWFjb3N4LHVuYXZhaWxhYmxlKSkpOyAvLyBleHBlY3RlZC1ub3Rle3snZjUnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQogCiB2b2lkIHRlc3QoKSB7CiAgIGYwKDApOwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2F0dHItYXZhaWxhYmlsaXR5LmMgYi90ZXN0L1NlbWEvYXR0ci1hdmFpbGFiaWxpdHkuYwppbmRleCBhYzZhMTg3Li5iN2E4ZTZlIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvYXR0ci1hdmFpbGFiaWxpdHkuYworKysgYi90ZXN0L1NlbWEvYXR0ci1hdmFpbGFiaWxpdHkuYwpAQCAtOCwxMCArOCwxMCBAQAogCiAvLyByZGFyOi8vMTAwOTUxMzEKIGV4dGVybiB2b2lkIAotQVRTRm9udEdldE5hbWUoY29uc3QgY2hhciAqb05hbWUpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD04LjAsZGVwcmVjYXRlZD05LjAsIG1lc3NhZ2U9InVzZSBDVEZvbnRDb3B5RnVsbE5hbWUiKSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J0FUU0ZvbnRHZXROYW1lJyBkZWNsYXJlZCBoZXJlfX0KK0FUU0ZvbnRHZXROYW1lKGNvbnN0IGNoYXIgKm9OYW1lKSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9OC4wLGRlcHJlY2F0ZWQ9OS4wLCBtZXNzYWdlPSJ1c2UgQ1RGb250Q29weUZ1bGxOYW1lIikpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydBVFNGb250R2V0TmFtZScgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIAogZXh0ZXJuIHZvaWQKLUFUU0ZvbnRHZXRQb3N0U2NyaXB0TmFtZShpbnQgZmxhZ3MpIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD04LjAsb2Jzb2xldGVkPTkuMCwgbWVzc2FnZT0idXNlIEFUU0ZvbnRHZXRGdWxsUG9zdFNjcmlwdE5hbWUiKSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7ZnVuY3Rpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgdW5hdmFpbGFibGUgaGVyZX19CitBVFNGb250R2V0UG9zdFNjcmlwdE5hbWUoaW50IGZsYWdzKSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9OC4wLG9ic29sZXRlZD05LjAsIG1lc3NhZ2U9InVzZSBBVFNGb250R2V0RnVsbFBvc3RTY3JpcHROYW1lIikpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydBVFNGb250R2V0UG9zdFNjcmlwdE5hbWUnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQogCiB2b2lkIHRlc3RfMTAwOTUxMzEoKSB7CiAgIEFUU0ZvbnRHZXROYW1lKCJIZWxsbyIpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0FUU0ZvbnRHZXROYW1lJyBpcyBkZXByZWNhdGVkOiBmaXJzdCBkZXByZWNhdGVkIGluIE9TIFggOS4wIC0gdXNlIENURm9udENvcHlGdWxsTmFtZX19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvYXR0ci1jYXBhYmlsaXRpZXMuYyBiL3Rlc3QvU2VtYS9hdHRyLWNhcGFiaWxpdGllcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjEyM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWEvYXR0ci1jYXBhYmlsaXRpZXMuYwpAQCAtMCwwICsxLDUzIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtV3RocmVhZC1zYWZldHkgLXZlcmlmeSAlcworCit0eXBlZGVmIGludCBfX2F0dHJpYnV0ZV9fKChjYXBhYmlsaXR5KCJyb2xlIikpKSBUaHJlYWRSb2xlOworc3RydWN0IF9fYXR0cmlidXRlX18oKHNoYXJlZF9jYXBhYmlsaXR5KCJtdXRleCIpKSkgTXV0ZXgge307CitzdHJ1Y3QgTm90QUNhcGFiaWxpdHkge307CisKKy8vIFRlc3QgYW4gaW52YWxpZCBjYXBhYmlsaXR5IG5hbWUKK3N0cnVjdCBfX2F0dHJpYnV0ZV9fKChjYXBhYmlsaXR5KCJ3cm9uZyIpKSkgSW5jb3JyZWN0TmFtZSB7fTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2ludmFsaWQgY2FwYWJpbGl0eSBuYW1lICd3cm9uZyc7IGNhcGFiaWxpdHkgbmFtZSBtdXN0IGJlICdtdXRleCcgb3IgJ3JvbGUnfX0KKworaW50IFRlc3QxIF9fYXR0cmlidXRlX18oKGNhcGFiaWxpdHkoInRlc3QxIikpKTsgIC8vIGV4cGVjdGVkLWVycm9yIHt7J2NhcGFiaWxpdHknIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0cyBvciB0eXBlZGVmc319CitpbnQgVGVzdDIgX19hdHRyaWJ1dGVfXygoc2hhcmVkX2NhcGFiaWxpdHkoInRlc3QyIikpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snc2hhcmVkX2NhcGFiaWxpdHknIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0cyBvciB0eXBlZGVmc319CitpbnQgVGVzdDMgX19hdHRyaWJ1dGVfXygoYWNxdWlyZV9jYXBhYmlsaXR5KCJ0ZXN0MyIpKSk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2FjcXVpcmVfY2FwYWJpbGl0eScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQoraW50IFRlc3Q0IF9fYXR0cmlidXRlX18oKHRyeV9hY3F1aXJlX2NhcGFiaWxpdHkoInRlc3Q0IikpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3sndHJ5X2FjcXVpcmVfY2FwYWJpbGl0eScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQoraW50IFRlc3Q1IF9fYXR0cmlidXRlX18oKHJlbGVhc2VfY2FwYWJpbGl0eSgidGVzdDUiKSkpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3JlbGVhc2VfY2FwYWJpbGl0eScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQorCitzdHJ1Y3QgX19hdHRyaWJ1dGVfXygoY2FwYWJpbGl0eSgxMikpKSBUZXN0MyB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snY2FwYWJpbGl0eScgYXR0cmlidXRlIHJlcXVpcmVzIGEgc3RyaW5nfX0KK3N0cnVjdCBfX2F0dHJpYnV0ZV9fKChzaGFyZWRfY2FwYWJpbGl0eShUZXN0MikpKSBUZXN0NCB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snc2hhcmVkX2NhcGFiaWxpdHknIGF0dHJpYnV0ZSByZXF1aXJlcyBhIHN0cmluZ319CisKK3N0cnVjdCBfX2F0dHJpYnV0ZV9fKChjYXBhYmlsaXR5KSkgVGVzdDUge307IC8vIGV4cGVjdGVkLWVycm9yIHt7J2NhcGFiaWxpdHknIGF0dHJpYnV0ZSB0YWtlcyBvbmUgYXJndW1lbnR9fQorc3RydWN0IF9fYXR0cmlidXRlX18oKHNoYXJlZF9jYXBhYmlsaXR5KCJ0ZXN0MSIsIDEyKSkpIFRlc3Q2IHt9OyAvLyBleHBlY3RlZC1lcnJvciB7eydzaGFyZWRfY2FwYWJpbGl0eScgYXR0cmlidXRlIHRha2VzIG9uZSBhcmd1bWVudH19CisKK3N0cnVjdCBOb3RBQ2FwYWJpbGl0eSBCYWRDYXBhYmlsaXR5OworVGhyZWFkUm9sZSBHVUksIFdvcmtlcjsKK3ZvaWQgRnVuYzEodm9pZCkgX19hdHRyaWJ1dGVfXygocmVxdWlyZXNfY2FwYWJpbGl0eShHVUkpKSkge30KK3ZvaWQgRnVuYzIodm9pZCkgX19hdHRyaWJ1dGVfXygocmVxdWlyZXNfc2hhcmVkX2NhcGFiaWxpdHkoV29ya2VyKSkpIHt9CisKK3ZvaWQgRnVuYzModm9pZCkgX19hdHRyaWJ1dGVfXygocmVxdWlyZXNfY2FwYWJpbGl0eSkpIHt9ICAvLyBleHBlY3RlZC1lcnJvciB7eydyZXF1aXJlc19jYXBhYmlsaXR5JyBhdHRyaWJ1dGUgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudH19Cit2b2lkIEZ1bmM0KHZvaWQpIF9fYXR0cmlidXRlX18oKHJlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5KSkge30gIC8vIGV4cGVjdGVkLWVycm9yIHt7J3JlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5JyBhdHRyaWJ1dGUgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudH19CisKK3ZvaWQgRnVuYzUodm9pZCkgX19hdHRyaWJ1dGVfXygocmVxdWlyZXNfY2FwYWJpbGl0eSgxKSkpIHt9ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3JlcXVpcmVzX2NhcGFiaWxpdHknIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eScgYXR0cmlidXRlOyB0eXBlIGhlcmUgaXMgJ2ludCd9fQordm9pZCBGdW5jNih2b2lkKSBfX2F0dHJpYnV0ZV9fKChyZXF1aXJlc19zaGFyZWRfY2FwYWJpbGl0eShCYWRDYXBhYmlsaXR5KSkpIHt9ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3JlcXVpcmVzX3NoYXJlZF9jYXBhYmlsaXR5JyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgYW5ub3RhdGVkIHdpdGggJ2NhcGFiaWxpdHknIGF0dHJpYnV0ZTsgdHlwZSBoZXJlIGlzICdzdHJ1Y3QgTm90QUNhcGFiaWxpdHknfX0KKwordm9pZCBGdW5jNyh2b2lkKSBfX2F0dHJpYnV0ZV9fKChhc3NlcnRfY2FwYWJpbGl0eShHVUkpKSkge30KK3ZvaWQgRnVuYzgodm9pZCkgX19hdHRyaWJ1dGVfXygoYXNzZXJ0X3NoYXJlZF9jYXBhYmlsaXR5KEdVSSkpKSB7fQorCit2b2lkIEZ1bmM5KHZvaWQpIF9fYXR0cmlidXRlX18oKGFzc2VydF9jYXBhYmlsaXR5KCkpKSB7fSAvLyBleHBlY3RlZC1lcnJvciB7eydhc3NlcnRfY2FwYWJpbGl0eScgYXR0cmlidXRlIHRha2VzIG9uZSBhcmd1bWVudH19Cit2b2lkIEZ1bmMxMCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChhc3NlcnRfc2hhcmVkX2NhcGFiaWxpdHkoKSkpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7J2Fzc2VydF9zaGFyZWRfY2FwYWJpbGl0eScgYXR0cmlidXRlIHRha2VzIG9uZSBhcmd1bWVudH19CisKK3ZvaWQgRnVuYzExKHZvaWQpIF9fYXR0cmlidXRlX18oKGFjcXVpcmVfY2FwYWJpbGl0eShHVUkpKSkge30KK3ZvaWQgRnVuYzEyKHZvaWQpIF9fYXR0cmlidXRlX18oKGFjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkoR1VJKSkpIHt9CisKK3ZvaWQgRnVuYzE1KHZvaWQpIF9fYXR0cmlidXRlX18oKHJlbGVhc2VfY2FwYWJpbGl0eShHVUkpKSkge30KK3ZvaWQgRnVuYzE2KHZvaWQpIF9fYXR0cmlidXRlX18oKHJlbGVhc2Vfc2hhcmVkX2NhcGFiaWxpdHkoR1VJKSkpIHt9Cit2b2lkIEZ1bmMxNyh2b2lkKSBfX2F0dHJpYnV0ZV9fKChyZWxlYXNlX2dlbmVyaWNfY2FwYWJpbGl0eShHVUkpKSkge30KKwordm9pZCBGdW5jMjEodm9pZCkgX19hdHRyaWJ1dGVfXygodHJ5X2FjcXVpcmVfY2FwYWJpbGl0eSgxKSkpIHt9Cit2b2lkIEZ1bmMyMih2b2lkKSBfX2F0dHJpYnV0ZV9fKCh0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSgxKSkpIHt9CisKK3ZvaWQgRnVuYzIzKHZvaWQpIF9fYXR0cmlidXRlX18oKHRyeV9hY3F1aXJlX2NhcGFiaWxpdHkoMSwgR1VJKSkpIHt9Cit2b2lkIEZ1bmMyNCh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh0cnlfYWNxdWlyZV9zaGFyZWRfY2FwYWJpbGl0eSgxLCBHVUkpKSkge30KKwordm9pZCBGdW5jMjUodm9pZCkgX19hdHRyaWJ1dGVfXygodHJ5X2FjcXVpcmVfY2FwYWJpbGl0eSgpKSkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3sndHJ5X2FjcXVpcmVfY2FwYWJpbGl0eScgYXR0cmlidXRlIHRha2VzIGF0IGxlYXN0IDEgYXJndW1lbnR9fQordm9pZCBGdW5jMjYodm9pZCkgX19hdHRyaWJ1dGVfXygodHJ5X2FjcXVpcmVfc2hhcmVkX2NhcGFiaWxpdHkoKSkpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7J3RyeV9hY3F1aXJlX3NoYXJlZF9jYXBhYmlsaXR5JyBhdHRyaWJ1dGUgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudH19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2F0dHItY2xlYW51cC5jIGIvdGVzdC9TZW1hL2F0dHItY2xlYW51cC5jCmluZGV4IGY1Y2JjMzguLjI2ZjI4M2EgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9hdHRyLWNsZWFudXAuYworKysgYi90ZXN0L1NlbWEvYXR0ci1jbGVhbnVwLmMKQEAgLTM4LDcgKzM4LDcgQEAKICAgX19hdHRyaWJ1dGUoKGNsZWFudXAoYzQpKSkgdm9pZCogZzsKIH0KIAotdm9pZCBjNSh2b2lkKikgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAgLy8gZXhwZWN0ZWQtbm90ZXt7J2M1JyBkZWNsYXJlZCBoZXJlfX0KK3ZvaWQgYzUodm9pZCopIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgIC8vIGV4cGVjdGVkLW5vdGV7eydjNScgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIHZvaWQgdDUoKSB7CiAgIGludCBpIF9fYXR0cmlidXRlX18oKGNsZWFudXAoYzUpKSk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2M1JyBpcyBkZXByZWNhdGVkfX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9hdHRyLWNvbGRob3QuYyBiL3Rlc3QvU2VtYS9hdHRyLWNvbGRob3QuYwppbmRleCAyNTNiMTg5Li5hYmFkZjg4IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvYXR0ci1jb2xkaG90LmMKKysrIGIvdGVzdC9TZW1hL2F0dHItY29sZGhvdC5jCkBAIC02LDUgKzYsNSBAQAogaW50IHZhcjEgX19hdHRyaWJ1dGVfXygoX19jb2xkX18pKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J19fY29sZF9fJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9uc319CiBpbnQgdmFyMiBfX2F0dHJpYnV0ZV9fKChfX2hvdF9fKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydfX2hvdF9fJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9uc319CiAKLWludCBxdXgoKSBfX2F0dHJpYnV0ZV9fKChfX2hvdF9fKSkgX19hdHRyaWJ1dGVfXygoX19jb2xkX18pKTsgLy8gZXhwZWN0ZWQtZXJyb3J7eydfX2hvdF9fJyBhbmQgY29sZCBhdHRyaWJ1dGVzIGFyZSBub3QgY29tcGF0aWJsZX19Ci1pbnQgYmF6KCkgX19hdHRyaWJ1dGVfXygoX19jb2xkX18pKSBfX2F0dHJpYnV0ZV9fKChfX2hvdF9fKSk7IC8vIGV4cGVjdGVkLWVycm9ye3snX19jb2xkX18nIGFuZCBob3QgYXR0cmlidXRlcyBhcmUgbm90IGNvbXBhdGlibGV9fQoraW50IHF1eCgpIF9fYXR0cmlidXRlX18oKF9faG90X18pKSBfX2F0dHJpYnV0ZV9fKChfX2NvbGRfXykpOyAvLyBleHBlY3RlZC1lcnJvcnt7J19faG90X18nIGFuZCAnY29sZCcgYXR0cmlidXRlcyBhcmUgbm90IGNvbXBhdGlibGV9fQoraW50IGJheigpIF9fYXR0cmlidXRlX18oKF9fY29sZF9fKSkgX19hdHRyaWJ1dGVfXygoX19ob3RfXykpOyAvLyBleHBlY3RlZC1lcnJvcnt7J19fY29sZF9fJyBhbmQgJ2hvdCcgYXR0cmlidXRlcyBhcmUgbm90IGNvbXBhdGlibGV9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2F0dHItZGVwcmVjYXRlZC1tZXNzYWdlLmMgYi90ZXN0L1NlbWEvYXR0ci1kZXByZWNhdGVkLW1lc3NhZ2UuYwppbmRleCBmNDhkMTNlLi5jNjgzMDYxIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvYXR0ci1kZXByZWNhdGVkLW1lc3NhZ2UuYworKysgYi90ZXN0L1NlbWEvYXR0ci1kZXByZWNhdGVkLW1lc3NhZ2UuYwpAQCAtMSw3ICsxLDcgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdmVyaWZ5IC1mc3ludGF4LW9ubHkKIC8vIHJkYXI6IC8vIDY3MzQ1MjAKIAotdHlwZWRlZiBpbnQgSU5UMSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJQbGVhc2UgYXZvaWQgSU5UMSIpKSk7IC8vIGV4cGVjdGVkLW5vdGUgMyB7eydJTlQxJyBkZWNsYXJlZCBoZXJlfX0KK3R5cGVkZWYgaW50IElOVDEgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgiUGxlYXNlIGF2b2lkIElOVDEiKSkpOyAvLyBleHBlY3RlZC1ub3RlIDMge3snSU5UMScgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIAogdHlwZWRlZiBJTlQxIElOVDIgX19hdHRyaWJ1dGVfXyAoKF9fZGVwcmVjYXRlZF9fKCJQbGVhc2UgYXZvaWQgSU5UMiIpKSk7CiAKQEAgLTEyLDE2ICsxMiwxNiBAQAogSU5UMSBzaG91bGRfYmVfdW5hdmFpbGFibGU7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snSU5UMScgaXMgZGVwcmVjYXRlZDogUGxlYXNlIGF2b2lkIElOVDF9fQogSU5UMWEgc2hvdWxkX25vdF9iZV9kZXByZWNhdGVkOwogCi1JTlQxIGYxKHZvaWQpIF9fYXR0cmlidXRlX18gKChkZXByZWNhdGVkKCJQbGVhc2UgYXZvaWQgZjEiKSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J2YxJyBkZWNsYXJlZCBoZXJlfX0KK0lOVDEgZjEodm9pZCkgX19hdHRyaWJ1dGVfXyAoKGRlcHJlY2F0ZWQoIlBsZWFzZSBhdm9pZCBmMSIpKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snZjEnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiBJTlQxIGYyKHZvaWQpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0lOVDEnIGlzIGRlcHJlY2F0ZWQ6IFBsZWFzZSBhdm9pZCBJTlQxfX0KIAotdHlwZWRlZiBlbnVtIHtyZWQsIGdyZWVuLCBibHVlfSBDb2xvciBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCJQbGVhc2UgYXZvaWQgQ29sb3IiKSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J0NvbG9yJyBkZWNsYXJlZCBoZXJlfX0KK3R5cGVkZWYgZW51bSB7cmVkLCBncmVlbiwgYmx1ZX0gQ29sb3IgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgiUGxlYXNlIGF2b2lkIENvbG9yIikpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydDb2xvcicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KICAKIAogQ29sb3IgYzE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snQ29sb3InIGlzIGRlcHJlY2F0ZWQ6IFBsZWFzZSBhdm9pZCBDb2xvcn19CiAKIGludCBnMTsKLWludCBnMiBfX2F0dHJpYnV0ZV9fICgoZGVwcmVjYXRlZCgiUGxlYXNlIGF2b2lkIGcyIikpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydnMicgZGVjbGFyZWQgaGVyZX19CitpbnQgZzIgX19hdHRyaWJ1dGVfXyAoKGRlcHJlY2F0ZWQoIlBsZWFzZSBhdm9pZCBnMiIpKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snZzInIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAKIGludCBmdW5jMSgpCiB7CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvYXR0ci1kZXByZWNhdGVkLmMgYi90ZXN0L1NlbWEvYXR0ci1kZXByZWNhdGVkLmMKaW5kZXggODEyNGFiMC4uYzllM2RkNSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL2F0dHItZGVwcmVjYXRlZC5jCisrKyBiL3Rlc3QvU2VtYS9hdHRyLWRlcHJlY2F0ZWQuYwpAQCAtMSwxMCArMSwxMCBAQAogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC12ZXJpZnkgLWZzeW50YXgtb25seQogCi1pbnQgZigpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7ZGVjbGFyZWQgaGVyZX19CitpbnQgZigpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7J2YnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiB2b2lkIGcoKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7Ci12b2lkIGcoKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQordm9pZCBnKCk7IC8vIGV4cGVjdGVkLW5vdGUge3snZycgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIAotZXh0ZXJuIGludCB2YXIgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CitleHRlcm4gaW50IHZhciBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUge3sndmFyJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogCiBpbnQgYSgpIHsKICAgaW50ICgqcHRyKSgpID0gZjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydmJyBpcyBkZXByZWNhdGVkfX0KQEAgLTE3LDEzICsxNywxMyBAQAogfQogCiAvLyB0ZXN0IGlmIGF0dHJpYnV0ZXMgcHJvcGFnYXRlIHRvIHZhcmlhYmxlcwotZXh0ZXJuIGludCB2YXI7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KK2V4dGVybiBpbnQgdmFyOyAvLyBleHBlY3RlZC1ub3RlIHt7J3ZhcicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIGludCB3KCkgewogICByZXR1cm4gdmFyOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3ZhcicgaXMgZGVwcmVjYXRlZH19CiB9CiAKIGludCBvbGRfZm4oKSBfX2F0dHJpYnV0ZV9fICgoZGVwcmVjYXRlZCkpOwotaW50IG9sZF9mbigpOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CitpbnQgb2xkX2ZuKCk7IC8vIGV4cGVjdGVkLW5vdGUge3snb2xkX2ZuJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogaW50ICgqZm5fcHRyKSgpID0gb2xkX2ZuOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J29sZF9mbicgaXMgZGVwcmVjYXRlZH19CiAKIGludCBvbGRfZm4oKSB7CkBAIC0zMiw3ICszMiw3IEBACiAKIAogc3RydWN0IGZvbyB7Ci0gIGludCB4IF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAzIHt7ZGVjbGFyZWQgaGVyZX19CisgIGludCB4IF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAzIHt7J3gnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiB9OwogCiB2b2lkIHRlc3QxKHN0cnVjdCBmb28gKkYpIHsKQEAgLTQxLDExICs0MSwxMSBAQAogICBzdHJ1Y3QgZm9vIGYyID0geyAxNyB9OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3gnIGlzIGRlcHJlY2F0ZWR9fQogfQogCi10eXBlZGVmIHN0cnVjdCBmb28gZm9vX2RlcCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUgMTIge3tkZWNsYXJlZCBoZXJlfX0KK3R5cGVkZWYgc3RydWN0IGZvbyBmb29fZGVwIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAxMiB7eydmb29fZGVwJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogZm9vX2RlcCAqdGVzdDI7ICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZm9vX2RlcCcgaXMgZGVwcmVjYXRlZH19CiAKIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkLCAKLSAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkX2F0dHJpYnV0ZSkpIGJhcl9kZXAgOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Vua25vd24gYXR0cmlidXRlICdpbnZhbGlkX2F0dHJpYnV0ZScgaWdub3JlZH19IGV4cGVjdGVkLW5vdGUgMiB7e2RlY2xhcmVkIGhlcmV9fQorICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRfYXR0cmlidXRlKSkgYmFyX2RlcCA7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5rbm93biBhdHRyaWJ1dGUgJ2ludmFsaWRfYXR0cmlidXRlJyBpZ25vcmVkfX0gZXhwZWN0ZWQtbm90ZSAyIHt7J2Jhcl9kZXAnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAKIHN0cnVjdCBiYXJfZGVwICp0ZXN0MzsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2Jhcl9kZXAnIGlzIGRlcHJlY2F0ZWR9fQogCkBAIC0xMDIsOSArMTAyLDkgQEAKICAgICAgICAgdGVzdDE5OwogCiAvLyByZGFyOi8vcHJvYmxlbS84NTE4NzUxCi1lbnVtIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSBUZXN0MjAgeyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19Ci0gIHRlc3QyMF9hIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSwgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQotICB0ZXN0MjBfYiAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CitlbnVtIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSBUZXN0MjAgeyAvLyBleHBlY3RlZC1ub3RlIHt7J1Rlc3QyMCcgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KKyAgdGVzdDIwX2EgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpLCAvLyBleHBlY3RlZC1ub3RlIHt7J3Rlc3QyMF9hJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQorICB0ZXN0MjBfYiAvLyBleHBlY3RlZC1ub3RlIHt7J3Rlc3QyMF9iJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogfTsKIHZvaWQgdGVzdDIwKCkgewogICBlbnVtIFRlc3QyMCBmOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J1Rlc3QyMCcgaXMgZGVwcmVjYXRlZH19CkBAIC0xMjIsNSArMTIyLDUgQEAKIH07CiAKIHR5cGVkZWYgaW50IHRlc3QyM190eSBfX2F0dHJpYnV0ZSgoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXMgZGVmaW5pdGlvbiBpcyBoZXJlfX0KLXR5cGVkZWYgaW50IHRlc3QyM190eTsgLy8gZXhwZWN0ZWQtbm90ZSB7eyd0ZXN0MjNfdHknIGRlY2xhcmVkIGhlcmV9fSBleHBlY3RlZC13YXJuaW5nIHt7cmVkZWZpbml0aW9uIG9mIHR5cGVkZWYgJ3Rlc3QyM190eScgaXMgYSBDMTEgZmVhdHVyZX19Cit0eXBlZGVmIGludCB0ZXN0MjNfdHk7IC8vIGV4cGVjdGVkLW5vdGUge3sndGVzdDIzX3R5JyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fSBleHBlY3RlZC13YXJuaW5nIHt7cmVkZWZpbml0aW9uIG9mIHR5cGVkZWYgJ3Rlc3QyM190eScgaXMgYSBDMTEgZmVhdHVyZX19CiB0ZXN0MjNfdHkgdGVzdDIzX3Y7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sndGVzdDIzX3R5JyBpcyBkZXByZWNhdGVkfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9hdHRyLW1hbGxvYy5jIGIvdGVzdC9TZW1hL2F0dHItbWFsbG9jLmMKaW5kZXggMmNlYzg0ZC4uYzc4ZDE1YyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL2F0dHItbWFsbG9jLmMKKysrIGIvdGVzdC9TZW1hL2F0dHItbWFsbG9jLmMKQEAgLTEsNSArMSw1IEBACi0vLyBSVU46ICVjbGFuZyAtWGNsYW5nIC12ZXJpZnkgLWZzeW50YXgtb25seSAlcwotLy8gUlVOOiAlY2xhbmcgLWVtaXQtbGx2bSAtUyAtbyAldCAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgLWZzeW50YXgtb25seSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gJXQgJXMKIAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvYXR0ci1tc3A0MzAuYyBiL3Rlc3QvU2VtYS9hdHRyLW1zcDQzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOGNkOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWEvYXR0ci1tc3A0MzAuYwpAQCAtMCwwICsxLDYgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIG1zcDQzMC11bmtub3duLXVua25vd24gLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzDQorDQoraW50IGk7DQordm9pZCBmKHZvaWQpIF9fYXR0cmlidXRlX18oKGludGVycnVwdChpKSkpOyAvKiBleHBlY3RlZC1lcnJvciB7eydpbnRlcnJ1cHQnIGF0dHJpYnV0ZSByZXF1aXJlcyBhbiBpbnRlZ2VyIGNvbnN0YW50fX0gKi8NCisNCit2b2lkIGYyKHZvaWQpIF9fYXR0cmlidXRlX18oKGludGVycnVwdCgxMikpKTsNCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvYXR0ci1ub2R1cGxpY2F0ZS5jIGIvdGVzdC9TZW1hL2F0dHItbm9kdXBsaWNhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTc3ZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hL2F0dHItbm9kdXBsaWNhdGUuYwpAQCAtMCwwICsxLDggQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdmVyaWZ5IC1mc3ludGF4LW9ubHkKKworaW50IGEgX19hdHRyaWJ1dGVfXygobm9kdXBsaWNhdGUpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydub2R1cGxpY2F0ZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQorCit2b2lkIHQxKCkgX19hdHRyaWJ1dGVfXygobm9kdXBsaWNhdGUpKTsKKwordm9pZCB0MigpIF9fYXR0cmlidXRlX18oKG5vZHVwbGljYXRlKDIpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J25vZHVwbGljYXRlJyBhdHRyaWJ1dGUgdGFrZXMgbm8gYXJndW1lbnRzfX0KKwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2F0dHItb3duZXJzaGlwLmMgYi90ZXN0L1NlbWEvYXR0ci1vd25lcnNoaXAuYwppbmRleCBlMzFiNDI5Li4yYWE5ZjlmIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvYXR0ci1vd25lcnNoaXAuYworKysgYi90ZXN0L1NlbWEvYXR0ci1vd25lcnNoaXAuYwpAQCAtMSwxMiArMSwxMiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC12ZXJpZnkKIAogdm9pZCBmMSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChvd25lcnNoaXBfdGFrZXMoImZvbyIpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J293bmVyc2hpcF90YWtlcycgYXR0cmlidXRlIHJlcXVpcmVzIHBhcmFtZXRlciAxIHRvIGJlIGFuIGlkZW50aWZpZXJ9fQotdm9pZCAqZjIodm9pZCkgX19hdHRyaWJ1dGVfXygob3duZXJzaGlwX3JldHVybnMoZm9vLCAxLCAyKSkpOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3thdHRyaWJ1dGUgdGFrZXMgbm8gbW9yZSB0aGFuIDEgYXJndW1lbnR9fQordm9pZCAqZjIodm9pZCkgX19hdHRyaWJ1dGVfXygob3duZXJzaGlwX3JldHVybnMoZm9vLCAxLCAyKSkpOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb3duZXJzaGlwX3JldHVybnMnIGF0dHJpYnV0ZSB0YWtlcyBubyBtb3JlIHRoYW4gMSBhcmd1bWVudH19CiB2b2lkIGYzKHZvaWQpIF9fYXR0cmlidXRlX18oKG93bmVyc2hpcF9ob2xkcyhmb28sIDEpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J293bmVyc2hpcF9ob2xkcycgYXR0cmlidXRlIHBhcmFtZXRlciAxIGlzIG91dCBvZiBib3VuZHN9fQogdm9pZCAqZjQodm9pZCkgX19hdHRyaWJ1dGVfXygob3duZXJzaGlwX3JldHVybnMoZm9vKSkpOwotdm9pZCBmNSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChvd25lcnNoaXBfaG9sZHMoZm9vKSkpOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3thdHRyaWJ1dGUgdGFrZXMgYXQgbGVhc3QgMiBhcmd1bWVudHN9fQordm9pZCBmNSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChvd25lcnNoaXBfaG9sZHMoZm9vKSkpOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb3duZXJzaGlwX2hvbGRzJyBhdHRyaWJ1dGUgdGFrZXMgYXQgbGVhc3QgMiBhcmd1bWVudHN9fQogdm9pZCBmNih2b2lkKSBfX2F0dHJpYnV0ZV9fKChvd25lcnNoaXBfaG9sZHMoZm9vLCAxLCAyLCAzKSkpOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb3duZXJzaGlwX2hvbGRzJyBhdHRyaWJ1dGUgcGFyYW1ldGVyIDEgaXMgb3V0IG9mIGJvdW5kc319Ci12b2lkIGY3KHZvaWQpIF9fYXR0cmlidXRlX18oKG93bmVyc2hpcF90YWtlcyhmb28pKSk7ICAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAyIGFyZ3VtZW50c319Cit2b2lkIGY3KHZvaWQpIF9fYXR0cmlidXRlX18oKG93bmVyc2hpcF90YWtlcyhmb28pKSk7ICAvLyBleHBlY3RlZC1lcnJvciB7eydvd25lcnNoaXBfdGFrZXMnIGF0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAyIGFyZ3VtZW50c319CiB2b2lkIGY4KGludCAqaSwgaW50ICpqLCBpbnQgaykgX19hdHRyaWJ1dGVfXygob3duZXJzaGlwX2hvbGRzKGZvbywgMSwgMiwgNCkpKTsgIC8vIGV4cGVjdGVkLWVycm9yIHt7J293bmVyc2hpcF9ob2xkcycgYXR0cmlidXRlIHBhcmFtZXRlciAzIGlzIG91dCBvZiBib3VuZHN9fQogCiBpbnQgZjkgX19hdHRyaWJ1dGVfXygob3duZXJzaGlwX3Rha2VzKGZvbywgMSkpKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snb3duZXJzaGlwX3Rha2VzJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9uc319CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvYXR0ci1zZWN0aW9uLmMgYi90ZXN0L1NlbWEvYXR0ci1zZWN0aW9uLmMKaW5kZXggMzk2ODkyYS4uODEyZGUwNiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL2F0dHItc2VjdGlvbi5jCisrKyBiL3Rlc3QvU2VtYS9hdHRyLXNlY3Rpb24uYwpAQCAtMTAsMTAgKzEwLDEyIEBACiAKIC8vIFBSNjAwNwogdm9pZCB0ZXN0KCkgewotICBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJORUFSLHgiKSkpIGludCBuMTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snc2VjdGlvbicgYXR0cmlidXRlIGlzIG5vdCB2YWxpZCBvbiBsb2NhbCB2YXJpYWJsZXN9fQorICBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJORUFSLHgiKSkpIGludCBuMTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snc2VjdGlvbicgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnMgYW5kIGdsb2JhbCB2YXJpYWJsZXN9fQogICBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJORUFSLHgiKSkpIHN0YXRpYyBpbnQgbjI7IC8vIG9rLgogfQogCiAvLyBwcjkzNTYKIHZvaWQgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiZm9vLHplZCIpKSkgdGVzdDIodm9pZCk7IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91cyBhdHRyaWJ1dGUgaXMgaGVyZX19CiB2b2lkIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oImJhcix6ZWQiKSkpIHRlc3QyKHZvaWQpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tzZWN0aW9uIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIGRlY2xhcmF0aW9ufX0KKworZW51bSBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJORUFSLHgiKSkpIGUgeyBvbmUgfTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snc2VjdGlvbicgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnMgYW5kIGdsb2JhbCB2YXJpYWJsZXN9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2F0dHItdW5hdmFpbGFibGUtbWVzc2FnZS5jIGIvdGVzdC9TZW1hL2F0dHItdW5hdmFpbGFibGUtbWVzc2FnZS5jCmluZGV4IGViZGY5NDUuLjQwMGEyYzYgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9hdHRyLXVuYXZhaWxhYmxlLW1lc3NhZ2UuYworKysgYi90ZXN0L1NlbWEvYXR0ci11bmF2YWlsYWJsZS1tZXNzYWdlLmMKQEAgLTEsOCArMSw4IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCiAvLyByZGFyOiAvLzY3MzQ1MjAKIAotaW50IGZvbyhpbnQpICBfX2F0dHJpYnV0ZV9fKChfX3VuYXZhaWxhYmxlX18oIlVTRSBJRk9PIElOU1RFQUQiKSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7ZnVuY3Rpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgdW5hdmFpbGFibGUgaGVyZX19Ci1kb3VibGUgZGZvbyhkb3VibGUpICBfX2F0dHJpYnV0ZV9fKChfX3VuYXZhaWxhYmxlX18oIk5PIExPTkdFUiIpKSk7IC8vIGV4cGVjdGVkLW5vdGUgMiB7e2Z1bmN0aW9uIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQoraW50IGZvbyhpbnQpICBfX2F0dHJpYnV0ZV9fKChfX3VuYXZhaWxhYmxlX18oIlVTRSBJRk9PIElOU1RFQUQiKSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J2ZvbycgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgdW5hdmFpbGFibGUgaGVyZX19Citkb3VibGUgZGZvbyhkb3VibGUpICBfX2F0dHJpYnV0ZV9fKChfX3VuYXZhaWxhYmxlX18oIk5PIExPTkdFUiIpKSk7IC8vIGV4cGVjdGVkLW5vdGUgMiB7eydkZm9vJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZSBoZXJlfX0KIAogdm9pZCBiYXIoKSBfX2F0dHJpYnV0ZV9fKChfX3VuYXZhaWxhYmxlX18pKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2V4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlfX0KIApAQCAtMzQsMTMgKzM0LDEzIEBACiAKIC8vIHJkYXI6Ly8xMDIwMTY5MAogZW51bSBmb28gewotICAgIGEgPSAxLCAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19Ci0gICAgYiBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCkpKSA9IDIsIC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KKyAgICBhID0gMSwgLy8gZXhwZWN0ZWQtbm90ZSB7eydhJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQorICAgIGIgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCgpKSkgPSAyLCAvLyBleHBlY3RlZC1ub3RlIHt7J2InIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAgICAgYyA9IDMKIH1fX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKCkpKTsKIAotZW51bSBmZWUgeyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyYXRpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgdW5hdmFpbGFibGUgaGVyZX19Ci0gICAgciA9IDEsIC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJhdGlvbiBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZSBoZXJlfX0KK2VudW0gZmVlIHsgLy8gZXhwZWN0ZWQtbm90ZSB7eydmZWUnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQorICAgIHIgPSAxLCAvLyBleHBlY3RlZC1ub3RlIHt7J3InIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQogICAgIHMgPSAyLAogICAgIHQgPSAzCiB9X19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUoKSkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2F0dHItdXNlZC5jIGIvdGVzdC9TZW1hL2F0dHItdXNlZC5jCmluZGV4IGFjY2M3YjYuLjRlM2JkYTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9hdHRyLXVzZWQuYworKysgYi90ZXN0L1NlbWEvYXR0ci11c2VkLmMKQEAgLTEsNyArMSw3IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtZnN5bnRheC1vbmx5IC1Xbm8tcHJpdmF0ZS1leHRlcm4gJXMKIAotZXh0ZXJuIGludCBsMCBfX2F0dHJpYnV0ZV9fKCh1c2VkKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1c2VkIGF0dHJpYnV0ZSBpZ25vcmVkfX0KLV9fcHJpdmF0ZV9leHRlcm5fXyBpbnQgbDEgX19hdHRyaWJ1dGVfXygodXNlZCkpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dXNlZCBhdHRyaWJ1dGUgaWdub3JlZH19CitleHRlcm4gaW50IGwwIF9fYXR0cmlidXRlX18oKHVzZWQpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyd1c2VkJyBhdHRyaWJ1dGUgaWdub3JlZH19CitfX3ByaXZhdGVfZXh0ZXJuX18gaW50IGwxIF9fYXR0cmlidXRlX18oKHVzZWQpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyd1c2VkJyBhdHRyaWJ1dGUgaWdub3JlZH19CiAKIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkgcyB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sndXNlZCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uc319CiAgIGludCB4OwpAQCAtMTMsOCArMTMsOCBAQAogfQogCiB2b2lkIGYxKCkgewotICBzdGF0aWMgaW50IGEgX19hdHRyaWJ1dGVfXygodXNlZCkpOyAKLSAgaW50IGIgX19hdHRyaWJ1dGVfXygodXNlZCkpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dXNlZCBhdHRyaWJ1dGUgaWdub3JlZH19CisgIHN0YXRpYyBpbnQgYSBfX2F0dHJpYnV0ZV9fKCh1c2VkKSk7CisgIGludCBiIF9fYXR0cmlidXRlX18oKHVzZWQpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyd1c2VkJyBhdHRyaWJ1dGUgaWdub3JlZH19CiB9CiAKIHN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKHVzZWQpKSBmMCh2b2lkKTsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9iaXRmaWVsZC1sYXlvdXQuYyBiL3Rlc3QvU2VtYS9iaXRmaWVsZC1sYXlvdXQuYwppbmRleCBkMjI2MzkxLi4yYWJkMTM5IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvYml0ZmllbGQtbGF5b3V0LmMKKysrIGIvdGVzdC9TZW1hL2JpdGZpZWxkLWxheW91dC5jCkBAIC05LDYgKzksMjEgQEAKIENIRUNLX1NJWkUoc3RydWN0LCBhLCA1KQogQ0hFQ0tfQUxJR04oc3RydWN0LCBhLCAxKQogCisvLyBaZXJvLXdpZHRoIGJpdC1maWVsZHMgd2l0aCBwYWNrZWQKK3N0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhMiB7IHNob3J0IHggOiA5OyBjaGFyIDogMDsgaW50IHkgOiAxNzsgfTsKK0NIRUNLX1NJWkUoc3RydWN0LCBhMiwgNSkKK0NIRUNLX0FMSUdOKHN0cnVjdCwgYTIsIDEpCisKKy8vIFplcm8td2lkdGggYml0LWZpZWxkcyBhdCB0aGUgZW5kIG9mIHBhY2tlZCBzdHJ1Y3QKK3N0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhMyB7IHNob3J0IHggOiA5OyBpbnQgOiAwOyB9OworQ0hFQ0tfU0laRShzdHJ1Y3QsIGEzLCA0KQorQ0hFQ0tfQUxJR04oc3RydWN0LCBhMywgMSkKKworLy8gRm9yIGNvbXBhcmlzb24sIG5vbi16ZXJvLXdpZHRoIGJpdC1maWVsZHMgYXQgdGhlIGVuZCBvZiBwYWNrZWQgc3RydWN0CitzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYTQgeyBzaG9ydCB4IDogOTsgaW50IDogMTsgfTsKK0NIRUNLX1NJWkUoc3RydWN0LCBhNCwgMikKK0NIRUNLX0FMSUdOKHN0cnVjdCwgYTQsIDEpCisKIHVuaW9uIGIge2NoYXIgeDsgaW50IDogMDsgY2hhciB5O307CiBDSEVDS19TSVpFKHVuaW9uLCBiLCAxKQogQ0hFQ0tfQUxJR04odW5pb24sIGIsIDEpCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvYmxvY2stbWlzYy5jIGIvdGVzdC9TZW1hL2Jsb2NrLW1pc2MuYwppbmRleCAyMjYwNDU4Li5iNDczMmI1IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvYmxvY2stbWlzYy5jCisrKyBiL3Rlc3QvU2VtYS9ibG9jay1taXNjLmMKQEAgLTEzMSw3ICsxMzEsNyBAQAogICBzdGF0aWMgdm9pZCAqUCA9IF57ICAvLyBleHBlY3RlZC1lcnJvciB7e2luaXRpYWxpemVyIGVsZW1lbnQgaXMgbm90IGEgY29tcGlsZS10aW1lIGNvbnN0YW50fX0KIAogICAgIHZvaWQgKlEgPSBeewotICAgICAgLy8gUmVmZXJlbmNlcyB0ZXN0MTQncyAiWCI6IG91dGVyIGJsb2NrIGlzIG5vbiBjb25zdGFudC4KKyAgICAgIC8vIFJlZmVyZW5jZXMgdGVzdDE0J3MgIlgiOiBvdXRlciBibG9jayBpcyBub24tY29uc3RhbnQuCiAgICAgICByZXR1cm4gWCs0OwogICAgIH07CiAgIH07CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvYnVpbHRpbnMtYXJtNjQtZXhjbHVzaXZlLmMgYi90ZXN0L1NlbWEvYnVpbHRpbnMtYXJtNjQtZXhjbHVzaXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlOWMxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYS9idWlsdGlucy1hcm02NC1leGNsdXNpdmUuYwpAQCAtMCwwICsxLDU5IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1hcHBsZS1pb3M3LjAgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisKK3N0cnVjdCBTaW1wbGUgeworICBjaGFyIGEsIGI7Cit9OworCitpbnQgdGVzdF9sZHJleChjaGFyICphZGRyKSB7CisgIGludCBzdW0gPSAwOworICBzdW0gKz0gX19idWlsdGluX2FybV9sZHJleChhZGRyKTsKKyAgc3VtICs9IF9fYnVpbHRpbl9hcm1fbGRyZXgoKHNob3J0ICopYWRkcik7CisgIHN1bSArPSBfX2J1aWx0aW5fYXJtX2xkcmV4KChpbnQgKilhZGRyKTsKKyAgc3VtICs9IF9fYnVpbHRpbl9hcm1fbGRyZXgoKGxvbmcgbG9uZyAqKWFkZHIpOworICBzdW0gKz0gX19idWlsdGluX2FybV9sZHJleCgoX19pbnQxMjggKilhZGRyKTsKKyAgc3VtICs9IF9fYnVpbHRpbl9hcm1fbGRyZXgoKGZsb2F0ICopYWRkcik7CisgIHN1bSArPSBfX2J1aWx0aW5fYXJtX2xkcmV4KChkb3VibGUgKilhZGRyKTsKKyAgc3VtICs9ICpfX2J1aWx0aW5fYXJtX2xkcmV4KChpbnQgKiopYWRkcik7CisgIHN1bSArPSBfX2J1aWx0aW5fYXJtX2xkcmV4KChzdHJ1Y3QgU2ltcGxlICoqKWFkZHIpLT5hOworICBzdW0gKz0gX19idWlsdGluX2FybV9sZHJleCgodm9sYXRpbGUgY2hhciAqKWFkZHIpOworICBzdW0gKz0gX19idWlsdGluX2FybV9sZHJleCgoY29uc3Qgdm9sYXRpbGUgY2hhciAqKWFkZHIpOworCisgIC8vIEluIHByaW5jaXBsZSB0aGlzIG1pZ2h0IGJlIHZhbGlkLCBidXQgc3RpY2sgdG8gaW50cyBhbmQgZmxvYXRzIGZvciBzY2FsYXIKKyAgLy8gdHlwZXMgYXQgdGhlIG1vbWVudC4KKyAgc3VtICs9IF9fYnVpbHRpbl9hcm1fbGRyZXgoKHN0cnVjdCBTaW1wbGUgKilhZGRyKS5hOyAvLyBleHBlY3RlZC1lcnJvciB7e2FkZHJlc3MgYXJndW1lbnQgdG8gYXRvbWljIGJ1aWx0aW4gbXVzdCBiZSBhIHBvaW50ZXIgdG99fQorCisgIF9fYnVpbHRpbl9hcm1fbGRyZXgoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t0b28gZmV3IGFyZ3VtZW50cyB0byBmdW5jdGlvbiBjYWxsfX0KKyAgX19idWlsdGluX2FybV9sZHJleCgxLCAyKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t0b28gbWFueSBhcmd1bWVudHMgdG8gZnVuY3Rpb24gY2FsbH19CisgIHJldHVybiBzdW07Cit9CisKK2ludCB0ZXN0X3N0cmV4KGNoYXIgKmFkZHIpIHsKKyAgaW50IHJlcyA9IDA7CisgIHN0cnVjdCBTaW1wbGUgdmFyID0gezB9OworICByZXMgfD0gX19idWlsdGluX2FybV9zdHJleCg0LCBhZGRyKTsKKyAgcmVzIHw9IF9fYnVpbHRpbl9hcm1fc3RyZXgoNDIsIChzaG9ydCAqKWFkZHIpOworICByZXMgfD0gX19idWlsdGluX2FybV9zdHJleCg0MiwgKGludCAqKWFkZHIpOworICByZXMgfD0gX19idWlsdGluX2FybV9zdHJleCg0MiwgKGxvbmcgbG9uZyAqKWFkZHIpOworICByZXMgfD0gX19idWlsdGluX2FybV9zdHJleCg0MiwgKF9faW50MTI4ICopYWRkcik7CisgIHJlcyB8PSBfX2J1aWx0aW5fYXJtX3N0cmV4KDIuNzE4MjhmLCAoZmxvYXQgKilhZGRyKTsKKyAgcmVzIHw9IF9fYnVpbHRpbl9hcm1fc3RyZXgoMy4xNDE1OSwgKGRvdWJsZSAqKWFkZHIpOworICByZXMgfD0gX19idWlsdGluX2FybV9zdHJleCgmdmFyLCAoc3RydWN0IFNpbXBsZSAqKilhZGRyKTsKKworICByZXMgfD0gX19idWlsdGluX2FybV9zdHJleCg0MiwgKHZvbGF0aWxlIGNoYXIgKilhZGRyKTsKKyAgcmVzIHw9IF9fYnVpbHRpbl9hcm1fc3RyZXgoNDIsIChjaGFyICpjb25zdClhZGRyKTsKKyAgcmVzIHw9IF9fYnVpbHRpbl9hcm1fc3RyZXgoNDIsIChjb25zdCBjaGFyICopYWRkcik7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3twYXNzaW5nICdjb25zdCBjaGFyIConIHRvIHBhcmFtZXRlciBvZiB0eXBlICd2b2xhdGlsZSBjaGFyIConIGRpc2NhcmRzIHF1YWxpZmllcnN9fQorCisKKyAgcmVzIHw9IF9fYnVpbHRpbl9hcm1fc3RyZXgodmFyLCAoc3RydWN0IFNpbXBsZSAqKWFkZHIpOyAvLyBleHBlY3RlZC1lcnJvciB7e2FkZHJlc3MgYXJndW1lbnQgdG8gYXRvbWljIGJ1aWx0aW4gbXVzdCBiZSBhIHBvaW50ZXIgdG99fQorICByZXMgfD0gX19idWlsdGluX2FybV9zdHJleCh2YXIsIChzdHJ1Y3QgU2ltcGxlICoqKWFkZHIpOyAvLyBleHBlY3RlZC1lcnJvciB7e3Bhc3NpbmcgJ3N0cnVjdCBTaW1wbGUnIHRvIHBhcmFtZXRlciBvZiBpbmNvbXBhdGlibGUgdHlwZSAnc3RydWN0IFNpbXBsZSAqJ319CisgIHJlcyB8PSBfX2J1aWx0aW5fYXJtX3N0cmV4KCZ2YXIsIChzdHJ1Y3QgU2ltcGxlICoqKWFkZHIpLmE7IC8vIGV4cGVjdGVkLWVycm9yIHt7aXMgbm90IGEgc3RydWN0dXJlIG9yIHVuaW9ufX0KKworICBfX2J1aWx0aW5fYXJtX3N0cmV4KDEpOyAvLyBleHBlY3RlZC1lcnJvciB7e3RvbyBmZXcgYXJndW1lbnRzIHRvIGZ1bmN0aW9uIGNhbGx9fQorICBfX2J1aWx0aW5fYXJtX3N0cmV4KDEsIDIsIDMpOyAvLyBleHBlY3RlZC1lcnJvciB7e3RvbyBtYW55IGFyZ3VtZW50cyB0byBmdW5jdGlvbiBjYWxsfX0KKyAgcmV0dXJuIHJlczsKK30KKwordm9pZCB0ZXN0X2NscmV4KCkgeworICBfX2J1aWx0aW5fYXJtX2NscmV4KCk7CisgIF9fYnVpbHRpbl9hcm1fY2xyZXgoMSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dG9vIG1hbnkgYXJndW1lbnRzIHRvIGZ1bmN0aW9uIGNhbGx9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2J1aWx0aW5zLWFybTY0LmMgYi90ZXN0L1NlbWEvYnVpbHRpbnMtYXJtNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmJkYzlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hL2J1aWx0aW5zLWFybTY0LmMKQEAgLTAsMCArMSwxOCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYXJtNjQtYXBwbGUtaW9zIC1EVEVTVDEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisKKyNpZmRlZiBURVNUMQordm9pZCBfX2NsZWFyX2NhY2hlKHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpOworI2VuZGlmCisKK3ZvaWQgdGVzdF9jbGVhcl9jYWNoZV9jaGFycyhjaGFyICpzdGFydCwgY2hhciAqZW5kKSB7CisgIF9fY2xlYXJfY2FjaGUoc3RhcnQsIGVuZCk7Cit9CisKK3ZvaWQgdGVzdF9jbGVhcl9jYWNoZV92b2lkcyh2b2lkICpzdGFydCwgdm9pZCAqZW5kKSB7CisgIF9fY2xlYXJfY2FjaGUoc3RhcnQsIGVuZCk7Cit9CisKK3ZvaWQgdGVzdF9jbGVhcl9jYWNoZV9ub19hcmdzKCkgeworICBfX2NsZWFyX2NhY2hlKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dG9vIGZldyBhcmd1bWVudHMgdG8gZnVuY3Rpb24gY2FsbH19Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvY2FsbGluZ2NvbnYuYyBiL3Rlc3QvU2VtYS9jYWxsaW5nY29udi5jCmluZGV4IDUwMGMwZmIuLmY5ZmE5ZmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9jYWxsaW5nY29udi5jCisrKyBiL3Rlc3QvU2VtYS9jYWxsaW5nY29udi5jCkBAIC02NiwzICs2Niw1IEBACiB0eXBlZGVmIHZvaWQgdHlwZWRlZl9mdW5fdChpbnQpOwogdHlwZWRlZl9mdW5fdCB0eXBlZGVmX2Z1bjsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fQogdm9pZCBfX2F0dHJpYnV0ZV9fKChzdGRjYWxsKSkgdHlwZWRlZl9mdW4oaW50IHgpIHsgfSAvLyBleHBlY3RlZC1lcnJvciB7e2Z1bmN0aW9uIGRlY2xhcmVkICdzdGRjYWxsJyBoZXJlIHdhcyBwcmV2aW91c2x5IGRlY2xhcmVkIHdpdGhvdXQgY2FsbGluZyBjb252ZW50aW9ufX0KKworc3RydWN0IHR5cGVfdGVzdCB7fSBfX2F0dHJpYnV0ZV9fKChzdGRjYWxsKSk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3N0ZGNhbGwnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zIGFuZCBtZXRob2RzfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9jb25zdC1ldmFsLmMgYi90ZXN0L1NlbWEvY29uc3QtZXZhbC5jCmluZGV4IDE2ZDAyOGUuLjg4M2NjZWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9jb25zdC1ldmFsLmMKKysrIGIvdGVzdC9TZW1hL2NvbnN0LWV2YWwuYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXRyaXBsZSBpNjg2LWxpbnV4ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5IC10cmlwbGUgaTY4Ni1saW51eCAlcyAtV25vLXRhdXRvbG9naWNhbC1wb2ludGVyLWNvbXBhcmUKIAogI2RlZmluZSBFVkFMX0VYUFIodGVzdG5vLCBleHByKSBpbnQgdGVzdCMjdGVzdG5vID0gc2l6ZW9mKHN0cnVjdHtjaGFyIHFxW2V4cHJdO30pOwogaW50IHg7CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvY29uc3RydWN0b3ItYXR0cmlidXRlLmMgYi90ZXN0L1NlbWEvY29uc3RydWN0b3ItYXR0cmlidXRlLmMKaW5kZXggMzgyNTkxNi4uMWJiNjlmYyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL2NvbnN0cnVjdG9yLWF0dHJpYnV0ZS5jCisrKyBiL3Rlc3QvU2VtYS9jb25zdHJ1Y3Rvci1hdHRyaWJ1dGUuYwpAQCAtMywxMyArMywxMyBAQAogaW50IHggX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydjb25zdHJ1Y3RvcicgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQogaW50IGYoKSBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpOwogaW50IGYoKSBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcigxKSkpOwotaW50IGYoKSBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcigxLDIpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXR0cmlidXRlIHRha2VzIG5vIG1vcmUgdGhhbiAxIGFyZ3VtZW50fX0KLWludCBmKCkgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IoMS4wKSkpOyAvLyBleHBlY3RlZC1lcnJvciB7eydjb25zdHJ1Y3RvcicgYXR0cmlidXRlIHJlcXVpcmVzIHBhcmFtZXRlciAxIHRvIGJlIGFuIGludGVnZXIgY29uc3RhbnR9fQoraW50IGYoKSBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcigxLDIpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J2NvbnN0cnVjdG9yJyBhdHRyaWJ1dGUgdGFrZXMgbm8gbW9yZSB0aGFuIDEgYXJndW1lbnR9fQoraW50IGYoKSBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcigxLjApKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J2NvbnN0cnVjdG9yJyBhdHRyaWJ1dGUgcmVxdWlyZXMgYW4gaW50ZWdlciBjb25zdGFudH19CiAKIGludCB4IF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydkZXN0cnVjdG9yJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9uc319CiBpbnQgZigpIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKTsKIGludCBmKCkgX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcigxKSkpOwotaW50IGYoKSBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKDEsMikpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thdHRyaWJ1dGUgdGFrZXMgbm8gbW9yZSB0aGFuIDEgYXJndW1lbnR9fQotaW50IGYoKSBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKDEuMCkpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snZGVzdHJ1Y3RvcicgYXR0cmlidXRlIHJlcXVpcmVzIHBhcmFtZXRlciAxIHRvIGJlIGFuIGludGVnZXIgY29uc3RhbnR9fQoraW50IGYoKSBfX2F0dHJpYnV0ZV9fKChkZXN0cnVjdG9yKDEsMikpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snZGVzdHJ1Y3RvcicgYXR0cmlidXRlIHRha2VzIG5vIG1vcmUgdGhhbiAxIGFyZ3VtZW50fX0KK2ludCBmKCkgX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcigxLjApKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J2Rlc3RydWN0b3InIGF0dHJpYnV0ZSByZXF1aXJlcyBhbiBpbnRlZ2VyIGNvbnN0YW50fX0KIAogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvY3Jhc2gtaW52YWxpZC1hcnJheS5jIGIvdGVzdC9TZW1hL2NyYXNoLWludmFsaWQtYXJyYXkuYwppbmRleCBlZWFjMzkxLi4wMjk0MTNiIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvY3Jhc2gtaW52YWxpZC1hcnJheS5jCisrKyBiL3Rlc3QvU2VtYS9jcmFzaC1pbnZhbGlkLWFycmF5LmMKQEAgLTEsMTggKzEsMTYgQEAKLS8vIFJVTjogbm90ICVjbGFuZ19jYzEgLU8xICVzIC1lbWl0LWxsdm0KKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlPXg4Nl82NC1hcHBsZS1kYXJ3aW4gLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCiAvLyBQUjY5MTMKIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KIGludCBtYWluKCkKIHsKICAgIGludCB4WzEwXVsxMF07Ci0gICBpbnQgKCpwKVtdID0geDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbnZhbGlkIHVzZSBvZiBhcnJheSB3aXRoIHVuc3BlY2lmaWVkIGJvdW5kc30KKyAgIGludCAoKnApW10gPSB4OwogCiAgICBpbnQgaTsKIAogICAgZm9yKGkgPSAwOyBpIDwgMTA7ICsraSkKICAgIHsKLSAgICAgICBwW2ldW2ldID0gaTsKKyAgICAgICBwW2ldW2ldID0gaTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tzdWJzY3JpcHQgb2YgcG9pbnRlciB0byBpbmNvbXBsZXRlIHR5cGUgJ2ludCBbXSd9fQogICAgfQogfQogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvZGVjbC1pbi1wcm90b3R5cGUuYyBiL3Rlc3QvU2VtYS9kZWNsLWluLXByb3RvdHlwZS5jCmluZGV4IDA1YjhlMGEuLjljYjdmYWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9kZWNsLWluLXByb3RvdHlwZS5jCisrKyBiL3Rlc3QvU2VtYS9kZWNsLWluLXByb3RvdHlwZS5jCkBAIC0xLDEyICsxLDEyIEBACi0vLyBSVU46ICVjbGFuZ19jYzFfb25seSAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCiAKIGNvbnN0IGludCBBQSA9IDU7CiAKLWludCBmMShlbnVtIHtBQSxCQn0gRSkgeworaW50IGYxKGVudW0ge0FBLEJCfSBFKSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5vdCBiZSB2aXNpYmxlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbn19CiAgICAgcmV0dXJuIEJCOwogfQogCi1pbnQgZjIoZW51bSB7QUE9NyxCQn0gRSkgeworaW50IGYyKGVudW0ge0FBPTcsQkJ9IEUpIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dpbGwgbm90IGJlIHZpc2libGUgb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9ufX0KICAgICByZXR1cm4gQUE7CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9kbGxleHBvcnQuYyBiL3Rlc3QvU2VtYS9kbGxleHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTcxZTVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hL2RsbGV4cG9ydC5jCkBAIC0wLDAgKzEsMTM1IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXdpbjMyICAgICAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXN0ZD1jOTkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC13aW4zMiAgIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtc3RkPWMxMSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1taW5ndzMyICAgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1zdGQ9YzExICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtbWluZ3czMiAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXN0ZD1jOTkgJXMKKworLy8gSW52YWxpZCB1c2FnZS4KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSB0eXBlZGVmIGludCB0eXBlZGVmMTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGV4cG9ydCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uc319Cit0eXBlZGVmIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBpbnQgdHlwZWRlZjI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxleHBvcnQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGVzIGFuZCBmdW5jdGlvbnN9fQordHlwZWRlZiBpbnQgX19kZWNsc3BlYyhkbGxleHBvcnQpIHR5cGVkZWYzOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsZXhwb3J0JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zfX0KK3R5cGVkZWYgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgKCpGdW5UeSkoKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGV4cG9ydCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uc319CitlbnVtIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBFbnVtIHsgRW51bVZhbCB9OyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsZXhwb3J0JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zfX0KK3N0cnVjdCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUmVjb3JkIHt9OyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsZXhwb3J0JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zfX0KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBHbG9iYWxzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBFeHBvcnQgZGVjbGFyYXRpb24uCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgZXh0ZXJuIGludCBFeHRlcm5HbG9iYWxEZWNsOworCisvLyBkbGxleHBvcnQgaW1wbGllcyBhIGRlZmluaXRpb24uCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgaW50IEdsb2JhbERlZjsKKworLy8gRXhwb3J0IGRlZmluaXRpb24uCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgaW50IEdsb2JhbEluaXQxID0gMTsKK2ludCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgR2xvYmFsSW5pdDIgPSAxOworCisvLyBEZWNsYXJlLCB0aGVuIGV4cG9ydCBkZWZpbml0aW9uLgorX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybiBpbnQgR2xvYmFsRGVjbEluaXQ7CitpbnQgR2xvYmFsRGVjbEluaXQgPSAxOworCisvLyBSZWRlY2xhcmF0aW9ucworX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybiBpbnQgR2xvYmFsUmVkZWNsMTsKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSAgICAgICAgaW50IEdsb2JhbFJlZGVjbDE7CisKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBleHRlcm4gaW50IEdsb2JhbFJlZGVjbDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBHbG9iYWxSZWRlY2wyOworCisgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBHbG9iYWxSZWRlY2wzOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBleHRlcm4gaW50IEdsb2JhbFJlZGVjbDM7IC8vIGV4cGVjdGVkLWVycm9ye3tyZWRlY2xhcmF0aW9uIG9mICdHbG9iYWxSZWRlY2wzJyBjYW5ub3QgYWRkICdkbGxleHBvcnQnIGF0dHJpYnV0ZX19CisKKy8vIEV4dGVybmFsIGxpbmthZ2UgaXMgcmVxdWlyZWQuCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgc3RhdGljIGludCBTdGF0aWNHbG9iYWw7IC8vIGV4cGVjdGVkLWVycm9ye3snU3RhdGljR2xvYmFsJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxleHBvcnQnfX0KKworLy8gRXhwb3J0IGluIGxvY2FsIHNjb3BlLgordm9pZCBmdW5jdGlvblNjb3BlKCkgeworICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgICAgICAgIGludCBMb2NhbFZhckRlY2w7IC8vIGV4cGVjdGVkLWVycm9ye3snTG9jYWxWYXJEZWNsJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxleHBvcnQnfX0KKyAgX19kZWNsc3BlYyhkbGxleHBvcnQpICAgICAgICBpbnQgTG9jYWxWYXJEZWYgPSAxOyAvLyBleHBlY3RlZC1lcnJvcnt7J0xvY2FsVmFyRGVmJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxleHBvcnQnfX0KKyAgX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybiBpbnQgRXh0ZXJuTG9jYWxWYXJEZWNsOworICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgc3RhdGljIGludCBTdGF0aWNMb2NhbFZhcjsgLy8gZXhwZWN0ZWQtZXJyb3J7eydTdGF0aWNMb2NhbFZhcicgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsZXhwb3J0J319Cit9CisKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRnVuY3Rpb25zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBFeHBvcnQgZnVuY3Rpb24gZGVjbGFyYXRpb24uIENoZWNrIGRpZmZlcmVudCBwbGFjZW1lbnRzLgorX19hdHRyaWJ1dGVfXygoZGxsZXhwb3J0KSkgdm9pZCBkZWNsMUEoKTsgLy8gU2FuaXR5IGNoZWNrIHdpdGggX19hdHRyaWJ1dGVfXworX19kZWNsc3BlYyhkbGxleHBvcnQpICAgICAgdm9pZCBkZWNsMUIoKTsKKwordm9pZCBfX2F0dHJpYnV0ZV9fKChkbGxleHBvcnQpKSBkZWNsMkEoKTsKK3ZvaWQgX19kZWNsc3BlYyhkbGxleHBvcnQpICAgICAgZGVjbDJCKCk7CisKKy8vIEV4cG9ydCBmdW5jdGlvbiBkZWZpbml0aW9uLgorX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgZGVmKCkge30KKworLy8gRXhwb3J0IGlubGluZSBmdW5jdGlvbi4KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBpbmxpbmUgdm9pZCBpbmxpbmVGdW5jMSgpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxleHBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KK2V4dGVybiB2b2lkIGlubGluZUZ1bmMxKCk7CisKK2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKGRsbGV4cG9ydCkpIGlubGluZUZ1bmMyKCkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGV4cG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQorZXh0ZXJuIHZvaWQgaW5saW5lRnVuYzIoKTsKKworLy8gUmVkZWNsYXJhdGlvbnMKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIHJlZGVjbDEoKTsKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIHJlZGVjbDEoKTsKKworX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgcmVkZWNsMigpOworICAgICAgICAgICAgICAgICAgICAgIHZvaWQgcmVkZWNsMigpOworCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCByZWRlY2wzKCk7CisgICAgICAgICAgICAgICAgICAgICAgdm9pZCByZWRlY2wzKCkge30KKworICAgICAgICAgICAgICAgICAgICAgIHZvaWQgcmVkZWNsNCgpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIHJlZGVjbDQoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlZGVjbGFyYXRpb24gb2YgJ3JlZGVjbDQnIGNhbm5vdCBhZGQgJ2RsbGV4cG9ydCcgYXR0cmlidXRlfX0KKworLy8gRXh0ZXJuYWwgbGlua2FnZSBpcyByZXF1aXJlZC4KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBzdGF0aWMgaW50IHN0YXRpY0Z1bmMoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7eydzdGF0aWNGdW5jJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxleHBvcnQnfX0KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcmVjZWRlbmNlCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBkbGxleHBvcnQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGRsbGltcG9ydCBpZiBib3RoIGFyZSBzcGVjaWZpZWQuCitfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQsIGRsbGV4cG9ydCkpICAgICAgIGV4dGVybiBpbnQgUHJlY2VkZW5jZUV4dGVybkdsb2JhbDFBOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybiBpbnQgUHJlY2VkZW5jZUV4dGVybkdsb2JhbDFCOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CisKK19fYXR0cmlidXRlX18oKGRsbGV4cG9ydCwgZGxsaW1wb3J0KSkgICAgICAgZXh0ZXJuIGludCBQcmVjZWRlbmNlRXh0ZXJuR2xvYmFsMkE7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgZXh0ZXJuIGludCBQcmVjZWRlbmNlRXh0ZXJuR2xvYmFsMkI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKworX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0LCBkbGxleHBvcnQpKSAgICAgICBpbnQgUHJlY2VkZW5jZUdsb2JhbDFBOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgX19kZWNsc3BlYyhkbGxleHBvcnQpIGludCBQcmVjZWRlbmNlR2xvYmFsMUI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKworX19hdHRyaWJ1dGVfXygoZGxsZXhwb3J0LCBkbGxpbXBvcnQpKSAgICAgICBpbnQgUHJlY2VkZW5jZUdsb2JhbDJBOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGludCBQcmVjZWRlbmNlR2xvYmFsMkI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKworX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybiBpbnQgUHJlY2VkZW5jZUV4dGVybkdsb2JhbFJlZGVjbDE7CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgZXh0ZXJuIGludCBQcmVjZWRlbmNlRXh0ZXJuR2xvYmFsUmVkZWNsMTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQorCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgZXh0ZXJuIGludCBQcmVjZWRlbmNlRXh0ZXJuR2xvYmFsUmVkZWNsMjsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQorX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybiBpbnQgUHJlY2VkZW5jZUV4dGVybkdsb2JhbFJlZGVjbDI7CisKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBleHRlcm4gaW50IFByZWNlZGVuY2VHbG9iYWxSZWRlY2wxOworX19kZWNsc3BlYyhkbGxpbXBvcnQpICAgICAgICBpbnQgUHJlY2VkZW5jZUdsb2JhbFJlZGVjbDE7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKworX19kZWNsc3BlYyhkbGxpbXBvcnQpIGV4dGVybiBpbnQgUHJlY2VkZW5jZUdsb2JhbFJlZGVjbDI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSAgICAgICAgaW50IFByZWNlZGVuY2VHbG9iYWxSZWRlY2wyOworCit2b2lkIF9fYXR0cmlidXRlX18oKGRsbGltcG9ydCwgZGxsZXhwb3J0KSkgICAgICAgcHJlY2VkZW5jZTFBKCkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQordm9pZCBfX2RlY2xzcGVjKGRsbGltcG9ydCkgX19kZWNsc3BlYyhkbGxleHBvcnQpIHByZWNlZGVuY2UxQigpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKwordm9pZCBfX2F0dHJpYnV0ZV9fKChkbGxleHBvcnQsIGRsbGltcG9ydCkpICAgICAgIHByZWNlZGVuY2UyQSgpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KK3ZvaWQgX19kZWNsc3BlYyhkbGxleHBvcnQpIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBwcmVjZWRlbmNlMkIoKSB7fSAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CisKK3ZvaWQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHByZWNlZGVuY2VSZWRlY2wxKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KK3ZvaWQgX19kZWNsc3BlYyhkbGxleHBvcnQpIHByZWNlZGVuY2VSZWRlY2wxKCkge30KKwordm9pZCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgcHJlY2VkZW5jZVJlZGVjbDIoKTsKK3ZvaWQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHByZWNlZGVuY2VSZWRlY2wyKCkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2RsbGltcG9ydC1kbGxleHBvcnQuYyBiL3Rlc3QvU2VtYS9kbGxpbXBvcnQtZGxsZXhwb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwODEwZDYuLjAwMDAwMDAKLS0tIGEvdGVzdC9TZW1hL2RsbGltcG9ydC1kbGxleHBvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGkzODYtbWluZ3czMiAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1taW5ndzMyIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcwotCi1pbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChkbGxleHBvcnQpKSBmb28xKCl7fSAvLyBleHBlY3RlZC13YXJuaW5ne3tkbGxleHBvcnQgYXR0cmlidXRlIGlnbm9yZWR9fQotaW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0KSkgZm9vMigpe30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZGxsaW1wb3J0IGF0dHJpYnV0ZSBpZ25vcmVkfX0KLQotdm9pZCBfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKSBmb28zKCl7fSAvLyBleHBlY3RlZC1lcnJvcnt7ZGxsaW1wb3J0IGF0dHJpYnV0ZSBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHN5bWJvbCBkZWNsYXJhdGlvbn19Ci0KLXZvaWQgX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0LCBkbGxleHBvcnQpKSBmb280KCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2RsbGltcG9ydCBhdHRyaWJ1dGUgaWdub3JlZH19Ci0KLXZvaWQgX19hdHRyaWJ1dGVfXygoZGxsZXhwb3J0KSkgZm9vNSgpOwotdm9pZCBfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKSBmb281KCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2RsbGltcG9ydCBhdHRyaWJ1dGUgaWdub3JlZH19Ci0KLXR5cGVkZWYgaW50IF9fYXR0cmlidXRlX18oKGRsbGV4cG9ydCkpIHR5cGU2OyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsZXhwb3J0JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zfX0KLQotdHlwZWRlZiBpbnQgX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0KSkgdHlwZTc7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGVzIGFuZCBmdW5jdGlvbnN9fQotCi12b2lkIF9fYXR0cmlidXRlX18oKGRsbGltcG9ydCkpIGZvbzYoKTsKLXZvaWQgZm9vNigpe30gLy8gZXhwZWN0ZWQtd2FybmluZyB7eydmb282JyByZWRlY2xhcmVkIHdpdGhvdXQgZGxsaW1wb3J0IGF0dHJpYnV0ZTogcHJldmlvdXMgZGxsaW1wb3J0IGlnbm9yZWR9fQotCi0vLyBQUjYyNjkKLWlubGluZSB2b2lkIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBmb283KCl7fSAvLyBleHBlY3RlZC13YXJuaW5ne3tkbGxleHBvcnQgYXR0cmlidXRlIGlnbm9yZWR9fQotaW5saW5lIHZvaWQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGZvbzgoKXt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2RsbGltcG9ydCBhdHRyaWJ1dGUgaWdub3JlZH19Ci0KLXZvaWQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGZvbzkoKXt9IC8vIGV4cGVjdGVkLWVycm9ye3tkbGxpbXBvcnQgYXR0cmlidXRlIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gc3ltYm9sIGRlY2xhcmF0aW9ufX0KLQotdm9pZCBfX2RlY2xzcGVjKGRsbGltcG9ydCkgX19kZWNsc3BlYyhkbGxleHBvcnQpIGZvbzEwKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2RsbGltcG9ydCBhdHRyaWJ1dGUgaWdub3JlZH19Ci0KLXZvaWQgX19kZWNsc3BlYyhkbGxleHBvcnQpIGZvbzExKCk7Ci12b2lkIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBmb28xMSgpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tkbGxpbXBvcnQgYXR0cmlidXRlIGlnbm9yZWR9fQotCi10eXBlZGVmIGludCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdHlwZTE7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxleHBvcnQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGVzIGFuZCBmdW5jdGlvbnN9fQotCi10eXBlZGVmIGludCBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdHlwZTI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGVzIGFuZCBmdW5jdGlvbnN9fQotCi12b2lkIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBmb28xMigpOwotdm9pZCBmb28xMigpe30gLy8gZXhwZWN0ZWQtd2FybmluZyB7eydmb28xMicgcmVkZWNsYXJlZCB3aXRob3V0IGRsbGltcG9ydCBhdHRyaWJ1dGU6IHByZXZpb3VzIGRsbGltcG9ydCBpZ25vcmVkfX0KLQotdm9pZCBfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKSBmb28xMygpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tkbGxpbXBvcnQgYXR0cmlidXRlIGlnbm9yZWR9fQotdm9pZCBfX2F0dHJpYnV0ZV9fKChkbGxleHBvcnQpKSBmb28xMygpOwotCi1leHRlcm4gaW50IGZvbzE0IF9fYXR0cmlidXRlX18oKGRsbGV4cG9ydCkpOwotZXh0ZXJuIGludCBmb28xNCBfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e2RsbGltcG9ydCBhdHRyaWJ1dGUgaWdub3JlZH19Ci0KLV9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgZm9vMTUgPSA1NDsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGNhbm5vdCBiZSBzcGVjaWZpZWQgb24gYSBkZWZpbml0aW9ufX0KLQotZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgZm9vMTc7Ci1pbnQgZm9vMTcgPSA1NDsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGNhbm5vdCBiZSBzcGVjaWZpZWQgb24gYSBkZWZpbml0aW9ufX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9kbGxpbXBvcnQuYyBiL3Rlc3QvU2VtYS9kbGxpbXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDk4Mjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hL2RsbGltcG9ydC5jCkBAIC0wLDAgKzEsMTIyIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXdpbjMyICAgICAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXN0ZD1jOTkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC13aW4zMiAgIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtc3RkPWMxMSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1taW5ndzMyICAgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1zdGQ9YzExICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtbWluZ3czMiAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXN0ZD1jOTkgJXMKKworLy8gSW52YWxpZCB1c2FnZS4KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSB0eXBlZGVmIGludCB0eXBlZGVmMTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uc319Cit0eXBlZGVmIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgdHlwZWRlZjI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGVzIGFuZCBmdW5jdGlvbnN9fQordHlwZWRlZiBpbnQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHR5cGVkZWYzOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zfX0KK3R5cGVkZWYgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgKCpGdW5UeSkoKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uc319CitlbnVtIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBFbnVtIHsgRW51bVZhbCB9OyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zfX0KK3N0cnVjdCBfX2RlY2xzcGVjKGRsbGltcG9ydCkgUmVjb3JkIHt9OyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zfX0KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBHbG9iYWxzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBJbXBvcnQgZGVjbGFyYXRpb24uCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgZXh0ZXJuIGludCBFeHRlcm5HbG9iYWxEZWNsOworCisvLyBkbGxpbXBvcnQgaW1wbGllcyBhIGRlY2xhcmF0aW9uLgorX19kZWNsc3BlYyhkbGxpbXBvcnQpIGludCBHbG9iYWxEZWNsOworaW50ICoqX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0KSkqIEdsb2JhbERlY2xDaHVua0F0dHI7CitpbnQgR2xvYmFsRGVjbEF0dHIgX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0KSk7CisKKy8vIE5vdCBhbGxvd2VkIG9uIGRlZmluaXRpb25zLgorX19kZWNsc3BlYyhkbGxpbXBvcnQpIGV4dGVybiBpbnQgRXh0ZXJuR2xvYmFsSW5pdCA9IDE7IC8vIGV4cGVjdGVkLWVycm9ye3tkZWZpbml0aW9uIG9mIGRsbGltcG9ydCBkYXRhfX0KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgR2xvYmFsSW5pdDEgPSAxOyAvLyBleHBlY3RlZC1lcnJvcnt7ZGVmaW5pdGlvbiBvZiBkbGxpbXBvcnQgZGF0YX19CitpbnQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIEdsb2JhbEluaXQyID0gMTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2RlZmluaXRpb24gb2YgZGxsaW1wb3J0IGRhdGF9fQorCisvLyBEZWNsYXJlLCB0aGVuIHJlamVjdCBkZWZpbml0aW9uLgorX19kZWNsc3BlYyhkbGxpbXBvcnQpIGV4dGVybiBpbnQgRXh0ZXJuR2xvYmFsRGVjbEluaXQ7IC8vIGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fSBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBhdHRyaWJ1dGUgaXMgaGVyZX19CitpbnQgRXh0ZXJuR2xvYmFsRGVjbEluaXQgPSAxOyAvLyBleHBlY3RlZC13YXJuaW5ne3snRXh0ZXJuR2xvYmFsRGVjbEluaXQnIHJlZGVjbGFyZWQgd2l0aG91dCAnZGxsaW1wb3J0JyBhdHRyaWJ1dGU6IHByZXZpb3VzICdkbGxpbXBvcnQnIGlnbm9yZWR9fQorCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IEdsb2JhbERlY2xJbml0OyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgYXR0cmlidXRlIGlzIGhlcmV9fQoraW50IEdsb2JhbERlY2xJbml0ID0gMTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J0dsb2JhbERlY2xJbml0JyByZWRlY2xhcmVkIHdpdGhvdXQgJ2RsbGltcG9ydCcgYXR0cmlidXRlOiBwcmV2aW91cyAnZGxsaW1wb3J0JyBpZ25vcmVkfX0KKworaW50ICpfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKSBHbG9iYWxEZWNsQ2h1bmtBdHRySW5pdDsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19IGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGF0dHJpYnV0ZSBpcyBoZXJlfX0KK2ludCAqR2xvYmFsRGVjbENodW5rQXR0ckluaXQgPSAwOyAvLyBleHBlY3RlZC13YXJuaW5ne3snR2xvYmFsRGVjbENodW5rQXR0ckluaXQnIHJlZGVjbGFyZWQgd2l0aG91dCAnZGxsaW1wb3J0JyBhdHRyaWJ1dGU6IHByZXZpb3VzICdkbGxpbXBvcnQnIGlnbm9yZWR9fQorCitpbnQgR2xvYmFsRGVjbEF0dHJJbml0IF9fYXR0cmlidXRlX18oKGRsbGltcG9ydCkpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgYXR0cmlidXRlIGlzIGhlcmV9fQoraW50IEdsb2JhbERlY2xBdHRySW5pdCA9IDE7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydHbG9iYWxEZWNsQXR0ckluaXQnIHJlZGVjbGFyZWQgd2l0aG91dCAnZGxsaW1wb3J0JyBhdHRyaWJ1dGU6IHByZXZpb3VzICdkbGxpbXBvcnQnIGlnbm9yZWR9fQorCisvLyBSZWRlY2xhcmF0aW9ucworX19kZWNsc3BlYyhkbGxpbXBvcnQpIGV4dGVybiBpbnQgR2xvYmFsUmVkZWNsMTsKK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBleHRlcm4gaW50IEdsb2JhbFJlZGVjbDE7CisKK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgR2xvYmFsUmVkZWNsMmE7CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IEdsb2JhbFJlZGVjbDJhOworCitpbnQgKl9fYXR0cmlidXRlX18oKGRsbGltcG9ydCkpIEdsb2JhbFJlZGVjbDJiOworaW50ICpfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKSBHbG9iYWxSZWRlY2wyYjsKKworaW50IEdsb2JhbFJlZGVjbDJjIF9fYXR0cmlidXRlX18oKGRsbGltcG9ydCkpOworaW50IEdsb2JhbFJlZGVjbDJjIF9fYXR0cmlidXRlX18oKGRsbGltcG9ydCkpOworCisvLyBOQjogTVNWQyBpc3N1ZXMgYSB3YXJuaW5nIGFuZCBtYWtlcyBHbG9iYWxSZWRlY2wzIGRsbGV4cG9ydC4gV2UgZm9sbG93IEdDQworLy8gYW5kIGRyb3AgdGhlIGRsbGltcG9ydCB3aXRoIGEgd2FybmluZy4KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBleHRlcm4gaW50IEdsb2JhbFJlZGVjbDM7IC8vIGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fSBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBhdHRyaWJ1dGUgaXMgaGVyZX19CisgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBHbG9iYWxSZWRlY2wzOyAvLyBleHBlY3RlZC13YXJuaW5ne3snR2xvYmFsUmVkZWNsMycgcmVkZWNsYXJlZCB3aXRob3V0ICdkbGxpbXBvcnQnIGF0dHJpYnV0ZTogcHJldmlvdXMgJ2RsbGltcG9ydCcgaWdub3JlZH19CisKKyAgICAgICAgICAgICAgICAgICAgICBleHRlcm4gaW50IEdsb2JhbFJlZGVjbDQ7IC8vIGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fQorX19kZWNsc3BlYyhkbGxpbXBvcnQpIGV4dGVybiBpbnQgR2xvYmFsUmVkZWNsNDsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlZGVjbGFyYXRpb24gb2YgJ0dsb2JhbFJlZGVjbDQnIGNhbm5vdCBhZGQgJ2RsbGltcG9ydCcgYXR0cmlidXRlfX0KKworLy8gRXh0ZXJuYWwgbGlua2FnZSBpcyByZXF1aXJlZC4KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBzdGF0aWMgaW50IFN0YXRpY0dsb2JhbDsgLy8gZXhwZWN0ZWQtZXJyb3J7eydTdGF0aWNHbG9iYWwnIG11c3QgaGF2ZSBleHRlcm5hbCBsaW5rYWdlIHdoZW4gZGVjbGFyZWQgJ2RsbGltcG9ydCd9fQorCisvLyBJbXBvcnQgaW4gbG9jYWwgc2NvcGUuCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgZmxvYXQgTG9jYWxSZWRlY2wxOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWZpbml0aW9uIGlzIGhlcmV9fQorX19kZWNsc3BlYyhkbGxpbXBvcnQpIGZsb2F0IExvY2FsUmVkZWNsMjsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVmaW5pdGlvbiBpcyBoZXJlfX0KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBmbG9hdCBMb2NhbFJlZGVjbDM7IC8vIGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlZmluaXRpb24gaXMgaGVyZX19Cit2b2lkIGZ1bmN0aW9uU2NvcGUoKSB7CisgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgTG9jYWxSZWRlY2wxOyAvLyBleHBlY3RlZC1lcnJvcnt7cmVkZWZpbml0aW9uIG9mICdMb2NhbFJlZGVjbDEnIHdpdGggYSBkaWZmZXJlbnQgdHlwZTogJ2ludCcgdnMgJ2Zsb2F0J319CisgIGludCAqX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0KSkgTG9jYWxSZWRlY2wyOyAvLyBleHBlY3RlZC1lcnJvcnt7cmVkZWZpbml0aW9uIG9mICdMb2NhbFJlZGVjbDInIHdpdGggYSBkaWZmZXJlbnQgdHlwZTogJ2ludCAqJyB2cyAnZmxvYXQnfX0KKyAgaW50IExvY2FsUmVkZWNsMyBfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlZGVmaW5pdGlvbiBvZiAnTG9jYWxSZWRlY2wzJyB3aXRoIGEgZGlmZmVyZW50IHR5cGU6ICdpbnQnIHZzICdmbG9hdCd9fQorCisgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSAgICAgICAgaW50IExvY2FsVmFyRGVjbDsKKyAgX19kZWNsc3BlYyhkbGxpbXBvcnQpICAgICAgICBpbnQgTG9jYWxWYXJEZWYgPSAxOyAvLyBleHBlY3RlZC1lcnJvcnt7ZGVmaW5pdGlvbiBvZiBkbGxpbXBvcnQgZGF0YX19CisgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBleHRlcm4gaW50IEV4dGVybkxvY2FsVmFyRGVjbDsKKyAgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGV4dGVybiBpbnQgRXh0ZXJuTG9jYWxWYXJEZWYgPSAxOyAvLyBleHBlY3RlZC1lcnJvcnt7ZGVmaW5pdGlvbiBvZiBkbGxpbXBvcnQgZGF0YX19CisgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBzdGF0aWMgaW50IFN0YXRpY0xvY2FsVmFyOyAvLyBleHBlY3RlZC1lcnJvcnt7J1N0YXRpY0xvY2FsVmFyJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxpbXBvcnQnfX0KK30KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGdW5jdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEltcG9ydCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gQ2hlY2sgZGlmZmVyZW50IHBsYWNlbWVudHMuCitfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKSB2b2lkIGRlY2wxQSgpOyAvLyBTYW5pdHkgY2hlY2sgd2l0aCBfX2F0dHJpYnV0ZV9fCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgICAgICB2b2lkIGRlY2wxQigpOworCit2b2lkIF9fYXR0cmlidXRlX18oKGRsbGltcG9ydCkpIGRlY2wyQSgpOwordm9pZCBfX2RlY2xzcGVjKGRsbGltcG9ydCkgICAgICBkZWNsMkIoKTsKKworLy8gTm90IGFsbG93ZWQgb24gZnVuY3Rpb24gZGVmaW5pdGlvbnMuCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBkZWYoKSB7fSAvLyBleHBlY3RlZC1lcnJvcnt7J2RsbGltcG9ydCcgYXR0cmlidXRlIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gc3ltYm9sIGRlY2xhcmF0aW9ufX0KKworLy8gSW1wb3J0IGlubGluZSBmdW5jdGlvbi4KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbmxpbmUgdm9pZCBpbmxpbmVGdW5jMSgpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KK2lubGluZSB2b2lkIF9fYXR0cmlidXRlX18oKGRsbGltcG9ydCkpIGlubGluZUZ1bmMyKCkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQorCisvLyBSZWRlY2xhcmF0aW9ucworX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgcmVkZWNsMSgpOworX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgcmVkZWNsMSgpOworCisvLyBOQjogTVNWQyBpc3N1ZXMgYSB3YXJuaW5nIGFuZCBtYWtlcyByZWRlY2wyL3JlZGVjbDMgZGxsZXhwb3J0LiBXZSBmb2xsb3cgR0NDCisvLyBhbmQgZHJvcCB0aGUgZGxsaW1wb3J0IHdpdGggYSB3YXJuaW5nLgorX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgcmVkZWNsMigpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgYXR0cmlidXRlIGlzIGhlcmV9fQorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgcmVkZWNsMigpOyAvLyBleHBlY3RlZC13YXJuaW5ne3sncmVkZWNsMicgcmVkZWNsYXJlZCB3aXRob3V0ICdkbGxpbXBvcnQnIGF0dHJpYnV0ZTogcHJldmlvdXMgJ2RsbGltcG9ydCcgaWdub3JlZH19CisKK19fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIHJlZGVjbDMoKTsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19IGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGF0dHJpYnV0ZSBpcyBoZXJlfX0KKyAgICAgICAgICAgICAgICAgICAgICB2b2lkIHJlZGVjbDMoKSB7fSAvLyBleHBlY3RlZC13YXJuaW5ne3sncmVkZWNsMycgcmVkZWNsYXJlZCB3aXRob3V0ICdkbGxpbXBvcnQnIGF0dHJpYnV0ZTogcHJldmlvdXMgJ2RsbGltcG9ydCcgaWdub3JlZH19CisKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkIHJlZGVjbDQoKTsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCByZWRlY2w0KCk7IC8vIGV4cGVjdGVkLWVycm9ye3tyZWRlY2xhcmF0aW9uIG9mICdyZWRlY2w0JyBjYW5ub3QgYWRkICdkbGxpbXBvcnQnIGF0dHJpYnV0ZX19CisKKy8vIEV4dGVybmFsIGxpbmthZ2UgaXMgcmVxdWlyZWQuCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgc3RhdGljIGludCBzdGF0aWNGdW5jKCk7IC8vIGV4cGVjdGVkLWVycm9ye3snc3RhdGljRnVuYycgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsaW1wb3J0J319CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvZW1wdHkxLmMgYi90ZXN0L1NlbWEvZW1wdHkxLmMKaW5kZXggZGU5MjJmNy4uOWEyZmI2NyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL2VtcHR5MS5jCisrKyBiL3Rlc3QvU2VtYS9lbXB0eTEuYwpAQCAtMSw0ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLVdjKystY29tcGF0CisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtV2MrKy1jb21wYXQKKworLy8gTm90ZTogRW1wdHkgQyBzdHJ1Y3RzIGFyZSA0IGJ5dGVzIGluIHRoZSBNaWNyb3NvZnQgQUJJLgogCiBzdHJ1Y3QgZW1wXzEgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZW1wdHkgc3RydWN0IGhhcyBzaXplIDAgaW4gQywgc2l6ZSAxIGluIEMrK319CiB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2VuYWJsZV9pZi5jIGIvdGVzdC9TZW1hL2VuYWJsZV9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzQzMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWEvZW5hYmxlX2lmLmMKQEAgLTAsMCArMSw5NyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxICVzIC12ZXJpZnkKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtRENPREVHRU4gLWVtaXQtbGx2bSAtbyAtIHwgRmlsZUNoZWNrICVzCisKKyNkZWZpbmUgT19DUkVBVCAweDEwMAordHlwZWRlZiBpbnQgbW9kZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHNpemVfdDsKKworaW50IG9wZW4oY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBmbGFncykgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKCEoZmxhZ3MgJiBPX0NSRUFUKSwgIm11c3Qgc3BlY2lmeSBtb2RlIHdoZW4gdXNpbmcgT19DUkVBVCIpKSkgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSk7ICAvLyBleHBlY3RlZC1ub3Rle3tjYW5kaWRhdGUgZGlzYWJsZWQ6IG11c3Qgc3BlY2lmeSBtb2RlIHdoZW4gdXNpbmcgT19DUkVBVH19CitpbnQgb3Blbihjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSkgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSk7ICAvLyBleHBlY3RlZC1ub3Rle3tjYW5kaWRhdGUgZnVuY3Rpb24gbm90IHZpYWJsZTogcmVxdWlyZXMgMyBhcmd1bWVudHMsIGJ1dCAyIHdlcmUgcHJvdmlkZWR9fQorCit2b2lkIHRlc3QxKCkgeworI2lmbmRlZiBDT0RFR0VOCisgIG9wZW4oInBhdGgiLCBPX0NSRUFUKTsgIC8vIGV4cGVjdGVkLWVycm9ye3tubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgY2FsbCB0byAnb3Blbid9fQorI2VuZGlmCisgIG9wZW4oInBhdGgiLCBPX0NSRUFULCAwNjYwKTsKKyAgb3BlbigicGF0aCIsIDApOworICBvcGVuKCJwYXRoIiwgMCwgMCk7Cit9CisKK3NpemVfdCBfX3N0cm5sZW5fY2hrKGNvbnN0IGNoYXIgKnMsIHNpemVfdCByZXF1ZXN0ZWRfYW1vdW50LCBzaXplX3Qgc19sZW4pOworCitzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICpzLCBzaXplX3QgbWF4bGVuKSAgLy8gZXhwZWN0ZWQtbm90ZXt7Y2FuZGlkYXRlIGZ1bmN0aW9ufX0KKyAgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgX19hc21fXygic3Rybmxlbl9yZWFsMSIpOworCitfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKK2lubGluZSBzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICpzLCBzaXplX3QgbWF4bGVuKSAgLy8gZXhwZWN0ZWQtbm90ZXt7Y2FuZGlkYXRlIGZ1bmN0aW9ufX0KKyAgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKF9fYnVpbHRpbl9vYmplY3Rfc2l6ZShzLCAwKSAhPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaG9zZW4gd2hlbiB0YXJnZXQgYnVmZmVyIHNpemUgaXMga25vd24iKSkpCit7CisgIHJldHVybiBfX3N0cm5sZW5fY2hrKHMsIG1heGxlbiwgX19idWlsdGluX29iamVjdF9zaXplKHMsIDApKTsKK30KKworc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqcywgc2l6ZV90IG1heGxlbikgIC8vIGV4cGVjdGVkLW5vdGV7e2NhbmRpZGF0ZSBkaXNhYmxlZDogY2hvc2VuIHdoZW4gJ21heGxlbicgaXMga25vd24gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBidWZmZXIgc2l6ZX19CisgIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZihfX2J1aWx0aW5fb2JqZWN0X3NpemUocywgMCkgIT0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvc2VuIHdoZW4gdGFyZ2V0IGJ1ZmZlciBzaXplIGlzIGtub3duIikpKQorICBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYobWF4bGVuIDw9IF9fYnVpbHRpbl9vYmplY3Rfc2l6ZShzLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaG9zZW4gd2hlbiAnbWF4bGVuJyBpcyBrbm93biB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGJ1ZmZlciBzaXplIikpKQorICBfX2FzbV9fKCJzdHJubGVuX3JlYWwyIik7CisKK3NpemVfdCBzdHJubGVuKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBtYXhsZW4pICAvLyBleHBlY3RlZC1ub3Rle3tjYW5kaWRhdGUgZnVuY3Rpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYWRlIHVuYXZhaWxhYmxlfX0KKyAgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKF9fYnVpbHRpbl9vYmplY3Rfc2l6ZShzLCAwKSAhPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaG9zZW4gd2hlbiB0YXJnZXQgYnVmZmVyIHNpemUgaXMga25vd24iKSkpCisgIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZihtYXhsZW4gPiBfX2J1aWx0aW5fb2JqZWN0X3NpemUocywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvc2VuIHdoZW4gJ21heGxlbicgaXMgbGFyZ2VyIHRoYW4gdGhlIGJ1ZmZlciBzaXplIikpKQorICBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSgiJ21heGxlbicgaXMgbGFyZ2VyIHRoYW4gdGhlIGJ1ZmZlciBzaXplIikpKTsKKwordm9pZCB0ZXN0Mihjb25zdCBjaGFyICpzLCBpbnQgaSkgeworLy8gQ0hFQ0s6IGRlZmluZSB2b2lkIEB0ZXN0MgorICBjb25zdCBjaGFyIGNbMTIzXTsKKyAgc3RybmxlbihzLCBpKTsKKy8vIENIRUNLOiBjYWxsIHt7Lip9fXN0cm5sZW5fcmVhbDEKKyAgc3RybmxlbihzLCA5OTkpOworLy8gQ0hFQ0s6IGNhbGwge3suKn19c3Rybmxlbl9yZWFsMQorICBzdHJubGVuKGMsIDEpOworLy8gQ0hFQ0s6IGNhbGwge3suKn19c3Rybmxlbl9yZWFsMgorICBzdHJubGVuKGMsIGkpOworLy8gQ0hFQ0s6IGNhbGwge3suKn19c3Rybmxlbl9jaGsKKyNpZm5kZWYgQ09ERUdFTgorICBzdHJubGVuKGMsIDk5OSk7ICAvLyBleHBlY3RlZC1lcnJvcnt7Y2FsbCB0byB1bmF2YWlsYWJsZSBmdW5jdGlvbiAnc3Rybmxlbic6ICdtYXhsZW4nIGlzIGxhcmdlciB0aGFuIHRoZSBidWZmZXIgc2l6ZX19CisjZW5kaWYKK30KKworaW50IGlzZGlnaXQoaW50IGMpIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpOyAgLy8gZXhwZWN0ZWQtbm90ZXt7Y2FuZGlkYXRlIGZ1bmN0aW9ufX0KK2ludCBpc2RpZ2l0KGludCBjKSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKSAgLy8gZXhwZWN0ZWQtbm90ZXt7Y2FuZGlkYXRlIGZ1bmN0aW9uIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFkZSB1bmF2YWlsYWJsZX19CisgIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZihjIDw9IC0xIHx8IGMgPiAyNTUsICInYycgbXVzdCBoYXZlIHRoZSB2YWx1ZSBvZiBhbiB1bnNpZ25lZCBjaGFyIG9yIEVPRiIpKSkKKyAgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUoIidjJyBtdXN0IGhhdmUgdGhlIHZhbHVlIG9mIGFuIHVuc2lnbmVkIGNoYXIgb3IgRU9GIikpKTsKKwordm9pZCB0ZXN0MyhpbnQgYykgeworICBpc2RpZ2l0KGMpOworICBpc2RpZ2l0KDEwKTsKKyNpZm5kZWYgQ09ERUdFTgorICBpc2RpZ2l0KC0xMCk7ICAvLyBleHBlY3RlZC1lcnJvcnt7Y2FsbCB0byB1bmF2YWlsYWJsZSBmdW5jdGlvbiAnaXNkaWdpdCc6ICdjJyBtdXN0IGhhdmUgdGhlIHZhbHVlIG9mIGFuIHVuc2lnbmVkIGNoYXIgb3IgRU9GfX0KKyNlbmRpZgorfQorCisjaWZuZGVmIENPREVHRU4KK19fYXR0cmlidXRlX18oKGVuYWJsZV9pZihuID09IDAsICJjaG9zZW4gd2hlbiAnbicgaXMgemVybyIpKSkgdm9pZCBmMShpbnQgbik7IC8vIGV4cGVjdGVkLWVycm9ye3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICduJ319CisKK2ludCBuIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZigxLCAiYWx3YXlzIGNob3NlbiIpKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydlbmFibGVfaWYnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zfX0KKwordm9pZCBmKGludCBuKSBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYoImNob3NlbiB3aGVuICduJyBpcyB6ZXJvIiwgbiA9PSAwKSkpOyAgLy8gZXhwZWN0ZWQtZXJyb3J7eydlbmFibGVfaWYnIGF0dHJpYnV0ZSByZXF1aXJlcyBhIHN0cmluZ319CisKK3ZvaWQgZihpbnQgbikgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKCkpKTsgIC8vIGV4cGVjdGVkLWVycm9ye3snZW5hYmxlX2lmJyBhdHRyaWJ1dGUgcmVxdWlyZXMgZXhhY3RseSAyIGFyZ3VtZW50c319CisKK3ZvaWQgZihpbnQgbikgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKHVucmVzb2x2ZWRpZCwgImNob3NlbiB3aGVuICd1bnJlc29sdmVkaWQnIGlzIG5vbi16ZXJvIikpKTsgIC8vIGV4cGVjdGVkLWVycm9ye3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICd1bnJlc29sdmVkaWQnfX0KKworaW50IGdsb2JhbDsKK3ZvaWQgZihpbnQgbikgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKGdsb2JhbCA9PSAwLCAiY2hvc2VuIHdoZW4gJ2dsb2JhbCcgaXMgemVybyIpKSk7ICAvLyBleHBlY3RlZC1lcnJvcnt7J2VuYWJsZV9pZicgYXR0cmlidXRlIGV4cHJlc3Npb24gbmV2ZXIgcHJvZHVjZXMgYSBjb25zdGFudCBleHByZXNzaW9ufX0gIC8vIGV4cGVjdGVkLW5vdGV7e3N1YmV4cHJlc3Npb24gbm90IHZhbGlkIGluIGEgY29uc3RhbnQgZXhwcmVzc2lvbn19CisKK2NvbnN0IGludCBjc3QgPSA3Owordm9pZCByZXR1cm5fY3N0KHZvaWQpIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZihjc3QgPT0gNywgImNob3NlbiB3aGVuICdjc3QnIGlzIDciKSkpOwordm9pZCB0ZXN0X3JldHVybl9jc3QoKSB7IHJldHVybl9jc3QoKTsgfQorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvZXh0X3ZlY3Rvcl9jYXN0cy5jIGIvdGVzdC9TZW1hL2V4dF92ZWN0b3JfY2FzdHMuYwppbmRleCA2NjAwNGIwLi5kNjBiYzNjIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvZXh0X3ZlY3Rvcl9jYXN0cy5jCisrKyBiL3Rlc3QvU2VtYS9leHRfdmVjdG9yX2Nhc3RzLmMKQEAgLTEsNiArMSw3IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtbWFjb3MxMC43LjAgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1mbm8tbGF4LXZlY3Rvci1jb252ZXJzaW9ucyAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLW1hY29zMTAuNy4wIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtZm5vLWxheC12ZWN0b3ItY29udmVyc2lvbnMgLVdjb252ZXJzaW9uICVzCiAKIHR5cGVkZWYgX19hdHRyaWJ1dGVfXygoIGV4dF92ZWN0b3JfdHlwZSgyKSApKSBmbG9hdCBmbG9hdDI7Cit0eXBlZGVmIF9fYXR0cmlidXRlX18oKCBleHRfdmVjdG9yX3R5cGUoMykgKSkgZmxvYXQgZmxvYXQzOwogdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKCggZXh0X3ZlY3Rvcl90eXBlKDQpICkpIGludCBpbnQ0OwogdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKCggZXh0X3ZlY3Rvcl90eXBlKDgpICkpIHNob3J0IHNob3J0ODsKIHR5cGVkZWYgX19hdHRyaWJ1dGVfXygoIGV4dF92ZWN0b3JfdHlwZSg0KSApKSBmbG9hdCBmbG9hdDQ7CkBAIC0xMSwxMiArMTIsMTYgQEAKIAogc3RhdGljIHZvaWQgdGVzdCgpIHsKICAgICBmbG9hdDIgdmVjMjsKKyAgICBmbG9hdDMgdmVjMzsKICAgICBmbG9hdDQgdmVjNCwgdmVjNF8yOwogICAgIGludDQgaXZlYzQ7CiAgICAgc2hvcnQ4IGlzaDg7CiAgICAgdDMgdmVjNF8zOwogICAgIGludCAqcHRyOwogICAgIGludCBpOworCisgICAgdmVjMyArPSB2ZWMyOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbid0IGNvbnZlcnQgYmV0d2VlbiB2ZWN0b3IgdmFsdWVzIG9mIGRpZmZlcmVudCBzaXplfX0KKyAgICB2ZWM0ICs9IHZlYzM7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FuJ3QgY29udmVydCBiZXR3ZWVuIHZlY3RvciB2YWx1ZXMgb2YgZGlmZmVyZW50IHNpemV9fQogICAgIAogICAgIHZlYzQgPSA1LjBmOwogICAgIHZlYzQgPSAoZmxvYXQ0KTUuMGY7CkBAIC0zMyw5ICszOCw4IEBACiAgICAgaXZlYzQgPSAoaW50NClwdHI7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW52YWxpZCBjb252ZXJzaW9uIGJldHdlZW4gdmVjdG9yIHR5cGUgJ2ludDQnIGFuZCBzY2FsYXIgdHlwZSAnaW50IConfX0KICAgICAKICAgICB2ZWM0ID0gKGZsb2F0NCl2ZWMyOyAvLyBleHBlY3RlZC1lcnJvciB7e2ludmFsaWQgY29udmVyc2lvbiBiZXR3ZWVuIGV4dC12ZWN0b3IgdHlwZSAnZmxvYXQ0JyBhbmQgJ2Zsb2F0Mid9fQotICAgIAotICAgIGlzaDggKz0gNTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW4ndCBjb252ZXJ0IGJldHdlZW4gdmVjdG9yIHZhbHVlcyBvZiBkaWZmZXJlbnQgc2l6ZSAoJ3Nob3J0OCcgYW5kICdpbnQnKX19Ci0gICAgaXNoOCArPSAoc2hvcnQpNTsKKyAgCisgICAgaXNoOCArPSA1OwogICAgIGl2ZWM0ICo9IDU7CiAgICAgIHZlYzQgLz0gNS4yZjsKICAgICAgdmVjNCAlPSA0OyAvLyBleHBlY3RlZC1lcnJvciB7e2ludmFsaWQgb3BlcmFuZHMgdG8gYmluYXJ5IGV4cHJlc3Npb24gKCdmbG9hdDQnIGFuZCAnaW50Jyl9fQpAQCAtNDQsNyArNDgsNyBAQAogICAgIGl2ZWM0ICs9IChpbnQ0KXZlYzQ7CiAgICAgaXZlYzQgLT0gaXZlYzQ7CiAgICAgaXZlYzQgfD0gaXZlYzQ7Ci0gICAgaXZlYzQgKz0gcHRyOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbid0IGNvbnZlcnQgYmV0d2VlbiB2ZWN0b3IgdmFsdWVzIG9mIGRpZmZlcmVudCBzaXplICgnaW50NCcgYW5kICdpbnQgKicpfX0KKyAgICBpdmVjNCArPSBwdHI7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FuJ3QgY29udmVydCBiZXR3ZWVuIHZlY3RvciBhbmQgbm9uLXNjYWxhciB2YWx1ZXMgKCdpbnQ0JyBhbmQgJ2ludCAqJyl9fQogfQogCiB0eXBlZGVmIF9fYXR0cmlidXRlX18oKCBleHRfdmVjdG9yX3R5cGUoMikgKSkgZmxvYXQyIHZlY2Zsb2F0MjsgLy8gZXhwZWN0ZWQtZXJyb3J7e2ludmFsaWQgdmVjdG9yIGVsZW1lbnQgdHlwZSAnZmxvYXQyJ319CkBAIC03NCwzICs3OCw0NyBAQAogICAgIHJldHVybiBzdHJpZGU7CiB9CiAKKy8vIHJkYXI6Ly8xNjE5NjkwMgordHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChleHRfdmVjdG9yX3R5cGUoNCkpKSBmbG9hdCBmbG9hdDMyeDRfdDsKKwordHlwZWRlZiBmbG9hdCBDM0RWZWN0b3IzIF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSgzKSkpOworCitleHRlcm4gZmxvYXQzMng0X3QgdmFic3FfZjMyKGZsb2F0MzJ4NF90IF9fYSk7CisKK0MzRFZlY3RvcjMgRnVuYyhjb25zdCBDM0RWZWN0b3IzIGEpIHsKKyAgICByZXR1cm4gKEMzRFZlY3RvcjMpdmFic3FfZjMyKChmbG9hdDMyeDRfdClhKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbnZhbGlkIGNvbnZlcnNpb24gYmV0d2VlbiBleHQtdmVjdG9yIHR5cGUgJ2Zsb2F0MzJ4NF90JyBhbmQgJ0MzRFZlY3RvcjMnfX0KK30KKworLy8gcmRhcjovLzE2MzUwODAyCit0eXBlZGVmIGRvdWJsZSBkb3VibGUyIF9fYXR0cmlidXRlX18gKChleHRfdmVjdG9yX3R5cGUoMikpKTsKKworc3RhdGljIHZvaWQgc3BsYXRzKGludCBpLCBsb25nIGwsIF9fdWludDEyOF90IHQsIGZsb2F0IGYsIGRvdWJsZSBkKSB7CisgIHNob3J0OCB2cyA9IDA7CisgIGludDQgdmkgPSBpOworICB1bG9uZzIgdmwgPSAodW5zaWduZWQgbG9uZylsOworICBmbG9hdDIgdmYgPSBmOworICBkb3VibGUyIHZkID0gZDsKKyAgCisgIHZzID0gNjU1MzYgKyB2czsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2ltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSAnaW50JyB0byAnc2hvcnQ4JyBjaGFuZ2VzIHZhbHVlIGZyb20gNjU1MzYgdG8gMH19CisgIHZzID0gdnMgKyBpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW1wbGljaXQgY29udmVyc2lvbiBsb3NlcyBpbnRlZ2VyIHByZWNpc2lvbn19CisgIHZzID0gdnMgKyAxOworICB2cyA9IHZzICsgMS5mOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbid0IGNvbnZlcnQgYmV0d2VlbiB2ZWN0b3IgdmFsdWVzIG9mIGRpZmZlcmVudCBzaXplfX0KKyAgCisgIHZpID0gbCArIHZpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW1wbGljaXQgY29udmVyc2lvbiBsb3NlcyBpbnRlZ2VyIHByZWNpc2lvbn19CisgIHZpID0gMSArIHZpOworICB2aSA9IHZpICsgMi4wOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbid0IGNvbnZlcnQgYmV0d2VlbiB2ZWN0b3IgdmFsdWVzIG9mIGRpZmZlcmVudCBzaXplfX0KKyAgdmkgPSB2aSArIDB4ZmZmZmZmZmY7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbXBsaWNpdCBjb252ZXJzaW9uIGNoYW5nZXMgc2lnbmVkbmVzc319CisgIAorICB2bCA9IGwgKyB2bDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2ltcGxpY2l0IGNvbnZlcnNpb24gY2hhbmdlcyBzaWduZWRuZXNzfX0KKyAgdmwgPSB2bCArIHQ7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbXBsaWNpdCBjb252ZXJzaW9uIGxvc2VzIGludGVnZXIgcHJlY2lzaW9ufX0KKyAgCisgIHZmID0gMSArIHZmOworICB2ZiA9IGwgKyB2ZjsKKyAgdmYgPSAyLjAgKyB2ZjsKKyAgdmYgPSBkICsgdmY7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbXBsaWNpdCBjb252ZXJzaW9uIGxvc2VzIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbn19CisgIHZmID0gdmYgKyAweGZmZmZmZmZmOworICB2ZiA9IHZmICsgMi4xOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW1wbGljaXQgY29udmVyc2lvbiBsb3NlcyBmbG9hdGluZy1wb2ludCBwcmVjaXNpb259fQorICAKKyAgdmQgPSBsICsgdmQ7CisgIHZkID0gdmQgKyB0OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2ZuLXB0ci1hcy1mbi1wcm90b3R5cGUuYyBiL3Rlc3QvU2VtYS9mbi1wdHItYXMtZm4tcHJvdG90eXBlLmMKaW5kZXggY2Y5NWM5Ny4uNGIwMWIxMyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL2ZuLXB0ci1hcy1mbi1wcm90b3R5cGUuYworKysgYi90ZXN0L1NlbWEvZm4tcHRyLWFzLWZuLXByb3RvdHlwZS5jCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxX29ubHkgLWFzdC1wcmludCAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1hc3QtcHJpbnQgJXMgfCBGaWxlQ2hlY2sgJXMKIAogLy8gVGhpcyB0ZXN0Y2FzZSBjaGVja3MgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgCiAvLyBTZW1hOjpBY3RPbntTdGFydCxFbmR9RnVuY3Rpb25EZWNsYXJhdG9yLCBzcGVjaWZpY2FsbHkgY2hlY2tpbmcgdGhhdApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2Zvcm1hdC1zdHJpbmdzLWZpeGl0LmMgYi90ZXN0L1NlbWEvZm9ybWF0LXN0cmluZ3MtZml4aXQuYwppbmRleCAzMTI3NDE4Li5iOTgyZWI0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvZm9ybWF0LXN0cmluZ3MtZml4aXQuYworKysgYi90ZXN0L1NlbWEvZm9ybWF0LXN0cmluZ3MtZml4aXQuYwpAQCAtMTQsNiArMTQsNyBAQAogdHlwZWRlZiBfX0lOVE1BWF9UWVBFX18gaW50bWF4X3Q7CiB0eXBlZGVmIF9fVUlOVE1BWF9UWVBFX18gdWludG1heF90OwogdHlwZWRlZiBfX1BUUkRJRkZfVFlQRV9fIHB0cmRpZmZfdDsKK3R5cGVkZWYgX19XQ0hBUl9UWVBFX18gd2NoYXJfdDsKIAogdm9pZCB0ZXN0KCkgewogICAvLyBCYXNpYyB0eXBlcwpAQCAtOTcsMTEgKzk4LDEzIEBACiAKIGludCBzY2FuZihjaGFyIGNvbnN0ICosIC4uLik7CiAKLXZvaWQgdGVzdDIoKSB7Cit2b2lkIHRlc3QyKGludCBpbnRTQVBhcm1bc3RhdGljIDJdKSB7CiAgIGNoYXIgc3RyWzEwMF07CisgIGNoYXIgKnZzdHIgPSAiYWJjIjsKICAgc2hvcnQgc2hvcnRWYXI7CiAgIHVuc2lnbmVkIHNob3J0IHVTaG9ydFZhcjsKICAgaW50IGludFZhcjsKKyAgaW50IGludEFWYXJbMl07CiAgIHVuc2lnbmVkIHVJbnRWYXI7CiAgIGZsb2F0IGZsb2F0VmFyOwogICBkb3VibGUgZG91YmxlVmFyOwpAQCAtMTE0LDExICsxMTcsMjAgQEAKICAgaW50bWF4X3QgaW50bWF4VmFyOwogICB1aW50bWF4X3QgdUludG1heFZhcjsKICAgcHRyZGlmZl90IHB0cmRpZmZWYXI7CisgIGVudW0ge0EsIEIsIEN9IGVudW1WYXI7CiAKKyAgLy8gU29tZSBzdHJpbmcgdHlwZXMuCiAgIHNjYW5mKCIlbGYiLCBzdHIpOworICBzY2FuZigiJWxmIiwgdnN0cik7CisgIHNjYW5mKCIlbHMiLCBzdHIpOworICBzY2FuZigiJWxzIiwgc3RyKTsKKworICAvLyBTb21lIGludGVnZXIgdHlwZXMuCiAgIHNjYW5mKCIlZiIsICZzaG9ydFZhcik7CiAgIHNjYW5mKCIlZiIsICZ1U2hvcnRWYXIpOwogICBzY2FuZigiJXAiLCAmaW50VmFyKTsKKyAgc2NhbmYoIiVmIiwgaW50QVZhcik7CisgIHNjYW5mKCIlZiIsIGludFNBUGFybSk7CiAgIHNjYW5mKCIlTGYiLCAmdUludFZhcik7CiAgIHNjYW5mKCIlbGQiLCAmZmxvYXRWYXIpOwogICBzY2FuZigiJWYiLCAmZG91YmxlVmFyKTsKQEAgLTEyNyw2ICsxMzksNyBAQAogICBzY2FuZigiJWYiLCAmdUxvbmdWYXIpOwogICBzY2FuZigiJWYiLCAmbG9uZ0xvbmdWYXIpOwogICBzY2FuZigiJWYiLCAmdUxvbmdMb25nVmFyKTsKKyAgc2NhbmYoIiVkIiwgJmVudW1WYXIpOyAvLyBGSVhNRTogV2Ugb3VnaHQgdG8gZml4IHNwZWNpZmllcnMgZm9yIGVudW1zLgogCiAgIC8vIFNvbWUgbmFtZWQgaW50cy4KICAgc2NhbmYoIiVmIiwgJnNpemVWYXIpOwpAQCAtMjA2LDEwICsyMTksMTUgQEAKIC8vIENIRUNLOiBwcmludGYoIiVMYSIsIChsb25nIGRvdWJsZSkgNDIpOwogLy8gQ0hFQ0s6IHByaW50ZigiJUxBIiwgKGxvbmcgZG91YmxlKSA0Mik7CiAKLS8vIENIRUNLOiBzY2FuZigiJXMiLCBzdHIpOworLy8gQ0hFQ0s6IHNjYW5mKCIlOTlzIiwgc3RyKTsKKy8vIENIRUNLOiBzY2FuZigiJXMiLCB2c3RyKTsKKy8vIENIRUNLOiBzY2FuZigiJTk5cyIsIHN0cik7CisvLyBDSEVDSzogc2NhbmYoIiU5OXMiLCBzdHIpOwogLy8gQ0hFQ0s6IHNjYW5mKCIlaGQiLCAmc2hvcnRWYXIpOwogLy8gQ0hFQ0s6IHNjYW5mKCIlaHUiLCAmdVNob3J0VmFyKTsKIC8vIENIRUNLOiBzY2FuZigiJWQiLCAmaW50VmFyKTsKKy8vIENIRUNLOiBzY2FuZigiJWQiLCBpbnRBVmFyKTsKKy8vIENIRUNLOiBzY2FuZigiJWQiLCBpbnRTQVBhcm0pOwogLy8gQ0hFQ0s6IHNjYW5mKCIldSIsICZ1SW50VmFyKTsKIC8vIENIRUNLOiBzY2FuZigiJWYiLCAmZmxvYXRWYXIpOwogLy8gQ0hFQ0s6IHNjYW5mKCIlbGYiLCAmZG91YmxlVmFyKTsKQEAgLTIxOCw2ICsyMzYsNyBAQAogLy8gQ0hFQ0s6IHNjYW5mKCIlbHUiLCAmdUxvbmdWYXIpOwogLy8gQ0hFQ0s6IHNjYW5mKCIlbGxkIiwgJmxvbmdMb25nVmFyKTsKIC8vIENIRUNLOiBzY2FuZigiJWxsdSIsICZ1TG9uZ0xvbmdWYXIpOworLy8gQ0hFQ0s6IHNjYW5mKCIlZCIsICZlbnVtVmFyKTsKIC8vIENIRUNLOiBzY2FuZigiJXp1IiwgJnNpemVWYXIpOwogLy8gQ0hFQ0s6IHNjYW5mKCIlamQiLCAmaW50bWF4VmFyKTsKIC8vIENIRUNLOiBzY2FuZigiJWp1IiwgJnVJbnRtYXhWYXIpOwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2Zvcm1hdC1zdHJpbmdzLXNjYW5mLmMgYi90ZXN0L1NlbWEvZm9ybWF0LXN0cmluZ3Mtc2NhbmYuYwppbmRleCBkNjZiZWQ1Li4zODE0NDdjIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvZm9ybWF0LXN0cmluZ3Mtc2NhbmYuYworKysgYi90ZXN0L1NlbWEvZm9ybWF0LXN0cmluZ3Mtc2NhbmYuYwpAQCAtMTA3LDkgKzEwNyw5IEBACiAKICAgLy8gVGVzdCBhcmd1bWVudCB0eXBlIGNoZWNrIGZvciB0aGUgJ20nIGxlbmd0aCBtb2RpZmllci4KICAgc2NhbmYoIiVtcyIsIGZwKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Zm9ybWF0IHNwZWNpZmllcyB0eXBlICdjaGFyICoqJyBidXQgdGhlIGFyZ3VtZW50IGhhcyB0eXBlICdmbG9hdCAqJ319Ci0gIHNjYW5mKCIlbVMiLCBmcCk7IC8vIGV4cGVjdGVkLXdhcm5pbmctcmV7e2Zvcm1hdCBzcGVjaWZpZXMgdHlwZSAnd2NoYXJfdCBcKlwqJyBcKGFrYSAnW14nXSsnXCkgYnV0IHRoZSBhcmd1bWVudCBoYXMgdHlwZSAnZmxvYXQgXConfX0KKyAgc2NhbmYoIiVtUyIsIGZwKTsgLy8gZXhwZWN0ZWQtd2FybmluZy1yZXt7Zm9ybWF0IHNwZWNpZmllcyB0eXBlICd3Y2hhcl90ICoqJyAoYWthICd7e1teJ10rfX0nKSBidXQgdGhlIGFyZ3VtZW50IGhhcyB0eXBlICdmbG9hdCAqJ319CiAgIHNjYW5mKCIlbWMiLCBmcCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2Zvcm1hdCBzcGVjaWZpZXMgdHlwZSAnY2hhciAqKicgYnV0IHRoZSBhcmd1bWVudCBoYXMgdHlwZSAnZmxvYXQgKid9fQotICBzY2FuZigiJW1DIiwgZnApOyAvLyBleHBlY3RlZC13YXJuaW5nLXJle3tmb3JtYXQgc3BlY2lmaWVzIHR5cGUgJ3djaGFyX3QgXCpcKicgXChha2EgJ1teJ10rJ1wpIGJ1dCB0aGUgYXJndW1lbnQgaGFzIHR5cGUgJ2Zsb2F0IFwqJ319CisgIHNjYW5mKCIlbUMiLCBmcCk7IC8vIGV4cGVjdGVkLXdhcm5pbmctcmV7e2Zvcm1hdCBzcGVjaWZpZXMgdHlwZSAnd2NoYXJfdCAqKicgKGFrYSAne3tbXiddK319JykgYnV0IHRoZSBhcmd1bWVudCBoYXMgdHlwZSAnZmxvYXQgKid9fQogICBzY2FuZigiJW1bYWJjXSIsIGZwKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Zm9ybWF0IHNwZWNpZmllcyB0eXBlICdjaGFyICoqJyBidXQgdGhlIGFyZ3VtZW50IGhhcyB0eXBlICdmbG9hdCAqJ319CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9mb3JtYXQtc3RyaW5ncy5jIGIvdGVzdC9TZW1hL2Zvcm1hdC1zdHJpbmdzLmMKaW5kZXggNmRhMDI3ZS4uYWQ3YjM3YyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL2Zvcm1hdC1zdHJpbmdzLmMKKysrIGIvdGVzdC9TZW1hL2Zvcm1hdC1zdHJpbmdzLmMKQEAgLTUzNSw2ICs1MzUsMjEgQEAKICAgICAgICAgIDAuMCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2Zvcm1hdCBzcGVjaWZpZXN9fQogfQogCit2b2lkIHByMTg5MDUoKSB7CisgIGNvbnN0IGNoYXIgczFbXSA9ICJzXDAlcyI7IC8vIGV4cGVjdGVkLW5vdGV7e2Zvcm1hdCBzdHJpbmcgaXMgZGVmaW5lZCBoZXJlfX0KKyAgY29uc3QgY2hhciBzMlsxXSA9ICJzIjsgLy8gZXhwZWN0ZWQtbm90ZXt7Zm9ybWF0IHN0cmluZyBpcyBkZWZpbmVkIGhlcmV9fQorICBjb25zdCBjaGFyIHMzWzJdID0gInNcMCVzIjsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7aW5pdGlhbGl6ZXItc3RyaW5nIGZvciBjaGFyIGFycmF5IGlzIHRvbyBsb25nfX0KKyAgY29uc3QgY2hhciBzNFsxMF0gPSAicyI7CisgIGNvbnN0IGNoYXIgczVbMF0gPSAiJXMiOyAvLyBleHBlY3RlZC13YXJuaW5ne3tpbml0aWFsaXplci1zdHJpbmcgZm9yIGNoYXIgYXJyYXkgaXMgdG9vIGxvbmd9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMXt7Zm9ybWF0IHN0cmluZyBpcyBkZWZpbmVkIGhlcmV9fQorCisgIHByaW50ZihzMSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2Zvcm1hdCBzdHJpbmcgY29udGFpbnMgJ1wwJyB3aXRoaW4gdGhlIHN0cmluZyBib2R5fX0KKyAgcHJpbnRmKHMyKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Zm9ybWF0IHN0cmluZyBpcyBub3QgbnVsbC10ZXJtaW5hdGVkfX0KKyAgcHJpbnRmKHMzKTsgLy8gbm8td2FybmluZworICBwcmludGYoczQpOyAvLyBuby13YXJuaW5nCisgIHByaW50ZihzNSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2Zvcm1hdCBzdHJpbmcgaXMgbm90IG51bGwtdGVybWluYXRlZH19Cit9CisKIHZvaWQgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHN0cmZtb24sMSwyKSkpIG1vbmZvcm1hdChjb25zdCBjaGFyICpmbXQsIC4uLik7CiB2b2lkIF9fYXR0cmlidXRlX18oKGZvcm1hdChzdHJmdGltZSwxLDApKSkgZGF0ZWZvcm1hdChjb25zdCBjaGFyICpmbXQpOwogCkBAIC01NDQsNyArNTU5LDcgQEAKICAgbW9uZm9ybWF0KCIiLCAxKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Zm9ybWF0IHN0cmluZyBpcyBlbXB0eX19CiAgIG1vbmZvcm1hdChzdHIpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tmb3JtYXQgc3RyaW5nIGlzIG5vdCBhIHN0cmluZyBsaXRlcmFsIChwb3RlbnRpYWxseSBpbnNlY3VyZSl9fQogICBkYXRlZm9ybWF0KCIiKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Zm9ybWF0IHN0cmluZyBpcyBlbXB0eX19Ci0gIGRhdGVmb3JtYXQoc3RyKTsgLy8gbm8td2FybmluZyAodXNpbmcgc3RyZnRpbWUgbm9uIGxpdGVyYWwgaXMgbm90IHVuc2FmZSkKKyAgZGF0ZWZvcm1hdChzdHIpOyAvLyBuby13YXJuaW5nICh1c2luZyBzdHJmdGltZSBub24tbGl0ZXJhbCBpcyBub3QgdW5zYWZlKQogfQogCiAvLyBEbyBub3Qgd2FybiBhYm91dCB1bnVzZWQgYXJndW1lbnRzIGNvbWluZyBmcm9tIHN5c3RlbSBoZWFkZXJzLgpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2ktYy1lLmMgYi90ZXN0L1NlbWEvaS1jLWUuYwppbmRleCA3NzQ5YjZjLi5jNjAyNWY5IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvaS1jLWUuYworKysgYi90ZXN0L1NlbWEvaS1jLWUuYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nICVzIC1mZnJlZXN0YW5kaW5nIC1Xbm8taW50LXRvLXBvaW50ZXItY2FzdCAtZnN5bnRheC1vbmx5IC1YY2xhbmcgLXZlcmlmeSAtcGVkYW50aWMgLWZwYXNjYWwtc3RyaW5ncyAtc3RkPWM5OQorLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mZnJlZXN0YW5kaW5nIC1Xbm8taW50LXRvLXBvaW50ZXItY2FzdCAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXBlZGFudGljIC1mcGFzY2FsLXN0cmluZ3MgLXN0ZD1jOTkKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2ltcGxpY2l0LWJ1aWx0aW4tZGVjbC5jIGIvdGVzdC9TZW1hL2ltcGxpY2l0LWJ1aWx0aW4tZGVjbC5jCmluZGV4IGQ3ZWMxNjkuLmJmYzE5MDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9pbXBsaWNpdC1idWlsdGluLWRlY2wuYworKysgYi90ZXN0L1NlbWEvaW1wbGljaXQtYnVpbHRpbi1kZWNsLmMKQEAgLTEsNCArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisvLyBSVU46IG5vdCAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLWFzdC1kdW1wICVzIHwgRmlsZUNoZWNrICVzCisKIHZvaWQgZigpIHsKICAgaW50ICpwdHIgPSBtYWxsb2Moc2l6ZW9mKGludCkgKiAxMCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2ltcGxpY2l0bHkgZGVjbGFyaW5nIGxpYnJhcnkgZnVuY3Rpb24gJ21hbGxvYycgd2l0aCB0eXBlfX0gXAogICAvLyBleHBlY3RlZC1ub3Rle3twbGVhc2UgaW5jbHVkZSB0aGUgaGVhZGVyIDxzdGRsaWIuaD4gb3IgZXhwbGljaXRseSBwcm92aWRlIGEgZGVjbGFyYXRpb24gZm9yICdtYWxsb2MnfX0gXApAQCAtNTcsMyArNTksMTAgQEAKIHZvaWQgbG9uZ2ptcCgpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tkZWNsYXJhdGlvbiBvZiBidWlsdC1pbiBmdW5jdGlvbiAnbG9uZ2ptcCcgcmVxdWlyZXMgaW5jbHVzaW9uIG9mIHRoZSBoZWFkZXIgPHNldGptcC5oPn19CiAKIGV4dGVybiBmbG9hdCBmbWF4ZihmbG9hdCwgZmxvYXQpOworCitzdHJ1Y3QgX19qbXBfYnVmX3RhZyB7fTsKK3ZvaWQgc2lnc2V0am1wKHN0cnVjdCBfX2ptcF9idWZfdGFnWzFdLCBpbnQpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tkZWNsYXJhdGlvbiBvZiBidWlsdC1pbiBmdW5jdGlvbiAnc2lnc2V0am1wJyByZXF1aXJlcyBpbmNsdXNpb24gb2YgdGhlIGhlYWRlciA8c2V0am1wLmg+fX0KKworLy8gQ0hFQ0s6ICAgICBGdW5jdGlvbkRlY2wge3suKn19IDxsaW5lOltbQExJTkUtMl1dOjEsIGNvbDo0ND4gY29sOjYgc2lnc2V0am1wICcKKy8vIENIRUNLLU5PVDogRnVuY3Rpb25EZWNsCisvLyBDSEVDSzogICAgIFJldHVybnNUd2ljZUF0dHIge3suKn19IDx7ey4qfX0+IEltcGxpY2l0CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvaW1wbGljaXQtY2FzdC1kdW1wLmMgYi90ZXN0L1NlbWEvaW1wbGljaXQtY2FzdC1kdW1wLmMKaW5kZXggODdmMTVkMC4uNGNkODU1ZiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL2ltcGxpY2l0LWNhc3QtZHVtcC5jCisrKyBiL3Rlc3QvU2VtYS9pbXBsaWNpdC1jYXN0LWR1bXAuYwpAQCAtNSw3ICs1LDcgQEAKIAogCiB2b2lkIGJhcigpIHsKLSAgLy8gQ0hFQ0s6ICBGdW5jdGlvbkRlY2wge3suKn19IDxsaW5lOnt7Lip9fSwgbGluZTp7ey4qfX0+IGJhciAndm9pZCAoKScKKyAgLy8gQ0hFQ0s6ICBGdW5jdGlvbkRlY2wge3suKn19IDxsaW5lOnt7Lip9fSwgbGluZTp7ey4qfX0+IGxpbmU6e3suKn19IGJhciAndm9pZCAoKScKIAogICBmb28xKDApOwogICAvLyBDSEVDSzogSW1wbGljaXRDYXN0RXhwciB7ey4qfX0gPGNvbDp7ey4qfX0+ICd2b2lkIConIDxOdWxsVG9Qb2ludGVyPgpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL2lubGluZS1hc20tdmFsaWRhdGUuYyBiL3Rlc3QvU2VtYS9pbmxpbmUtYXNtLXZhbGlkYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlNDk3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYS9pbmxpbmUtYXNtLXZhbGlkYXRlLmMKQEAgLTAsMCArMSw4IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBhcm02NC1hcHBsZS1tYWNvc3gxMC44LjAgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisKK3Vuc2lnbmVkIHQsIHIsICpwOworCitpbnQgZm9vICh2b2lkKSB7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCAic3R4ciAgICV3W190XSwgJVtfcl0sIFslW19wXV0iIDogW190XSAiPSZyIiAodCkgOiBbX3BdICJwIiAocCksIFtfcl0gInIiIChyKSA6ICJtZW1vcnkiKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3ZhbHVlIHNpemUgZG9lcyBub3QgbWF0Y2ggcmVnaXN0ZXIgc2l6ZSBzcGVjaWZpZWQgYnkgdGhlIGNvbnN0cmFpbnQgYW5kIG1vZGlmaWVyfX0KKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvbGl0LmxvY2FsLmNmZyBiL3Rlc3QvU2VtYS9saXQubG9jYWwuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZWY1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWEvbGl0LmxvY2FsLmNmZwpAQCAtMCwwICsxLDQgQEAKK2NvbmZpZy5zdWJzdGl0dXRpb25zID0gbGlzdChjb25maWcuc3Vic3RpdHV0aW9ucykKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmluc2VydCgwLAorICAgIChyJyVjbGFuZ1xiJywKKyAgICAgIiIiKioqIERvIG5vdCB1c2UgdGhlIGRyaXZlciBpbiBTZW1hIHRlc3RzLiAqKioiIiIpICkKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9sb29wLWNvbnRyb2wuYyBiL3Rlc3QvU2VtYS9sb29wLWNvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzMzZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hL2xvb3AtY29udHJvbC5jCkBAIC0wLDAgKzEsMTIxIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAteCBjKysgLVdlcnJvciAlcworCitpbnQgcHI4ODgwXzEoKSB7CisgIGludCBmaXJzdCA9IDE7CisgIGZvciAoIDsgKHsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gMDsgY29udGludWU7IH0gMDsgfSk7ICkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgcHI4ODgwXzIoaW50IGZpcnN0KSB7CisgIGZvciAoIDsgKHsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gMDsgYnJlYWs7IH0gMDsgfSk7ICkge30KK30KKwordm9pZCBwcjg4ODBfMyhpbnQgZmlyc3QpIHsKKyAgZm9yICggOyA7ICh2b2lkKSh7IGlmIChmaXJzdCkgeyBmaXJzdCA9IDA7IGNvbnRpbnVlOyB9IDA7IH0pKSB7fQorfQorCit2b2lkIHByODg4MF80KGludCBmaXJzdCkgeworICBmb3IgKCA7IDsgKHZvaWQpKHsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gMDsgYnJlYWs7IH0gMDsgfSkpIHt9Cit9CisKK3ZvaWQgcHI4ODgwXzUgKGludCBmaXJzdCkgeworICB3aGlsZSgoeyBpZiAoZmlyc3QpIHsgZmlyc3QgPSAwOyBjb250aW51ZTsgfSAwOyB9KSkge30KK30KKwordm9pZCBwcjg4ODBfNiAoaW50IGZpcnN0KSB7CisgIHdoaWxlKCh7IGlmIChmaXJzdCkgeyBmaXJzdCA9IDA7IGJyZWFrOyB9IDA7IH0pKSB7fQorfQorCit2b2lkIHByODg4MF83IChpbnQgZmlyc3QpIHsKKyAgZG8ge30gd2hpbGUoKHsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gMDsgY29udGludWU7IH0gMDsgfSkpOworfQorCit2b2lkIHByODg4MF84IChpbnQgZmlyc3QpIHsKKyAgZG8ge30gd2hpbGUoKHsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gMDsgYnJlYWs7IH0gMDsgfSkpOworfQorCit2b2lkIHByODg4MF8xMChpbnQgaSkgeworICBmb3IgKCA7IGkgIT0gMTAgOyBpKysgKQorICAgIGZvciAoIDsgOyAodm9pZCkoeyArK2k7IGNvbnRpbnVlOyBpO30pKSB7fSAvLyBleHBlY3RlZC13YXJuaW5ne3snY29udGludWUnIGlzIGJvdW5kIHRvIGN1cnJlbnQgbG9vcCwgR0NDIGJpbmRzIGl0IHRvIHRoZSBlbmNsb3NpbmcgbG9vcH19Cit9CisKK3ZvaWQgcHI4ODgwXzExKGludCBpKSB7CisgIGZvciAoIDsgaSAhPSAxMCA7IGkrKyApCisgICAgZm9yICggOyA7ICh2b2lkKSh7ICsraTsgYnJlYWs7IGk7fSkpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydicmVhaycgaXMgYm91bmQgdG8gY3VycmVudCBsb29wLCBHQ0MgYmluZHMgaXQgdG8gdGhlIGVuY2xvc2luZyBsb29wfX0KK30KKwordm9pZCBwcjg4ODBfMTIoaW50IGksIGludCBqKSB7CisgIGZvciAoIDsgaSAhPSAxMCA7IGkrKyApCisgICAgZm9yICggOyAoe2lmIChpKSBjb250aW51ZTsgaTt9KTsgaisrKSB7fSAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2NvbnRpbnVlJyBpcyBib3VuZCB0byBjdXJyZW50IGxvb3AsIEdDQyBiaW5kcyBpdCB0byB0aGUgZW5jbG9zaW5nIGxvb3B9fQorfQorCit2b2lkIHByODg4MF8xMyhpbnQgaSwgaW50IGopIHsKKyAgZm9yICggOyBpICE9IDEwIDsgaSsrICkKKyAgICBmb3IgKCA7ICh7aWYgKGkpIGJyZWFrOyBpO30pOyBqKyspIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydicmVhaycgaXMgYm91bmQgdG8gY3VycmVudCBsb29wLCBHQ0MgYmluZHMgaXQgdG8gdGhlIGVuY2xvc2luZyBsb29wfX0KK30KKwordm9pZCBwcjg4ODBfMTQoaW50IGkpIHsKKyAgZm9yICggOyBpICE9IDEwIDsgaSsrICkKKyAgICB3aGlsZSgoe2lmIChpKSBicmVhazsgaTt9KSkge30gLy8gZXhwZWN0ZWQtd2FybmluZyB7eydicmVhaycgaXMgYm91bmQgdG8gY3VycmVudCBsb29wLCBHQ0MgYmluZHMgaXQgdG8gdGhlIGVuY2xvc2luZyBsb29wfX0KK30KKwordm9pZCBwcjg4ODBfMTUoaW50IGkpIHsKKyAgd2hpbGUgKC0taSkKKyAgICB3aGlsZSgoe2lmIChpKSBjb250aW51ZTsgaTt9KSkge30gLy8gZXhwZWN0ZWQtd2FybmluZyB7eydjb250aW51ZScgaXMgYm91bmQgdG8gY3VycmVudCBsb29wLCBHQ0MgYmluZHMgaXQgdG8gdGhlIGVuY2xvc2luZyBsb29wfX0KK30KKwordm9pZCBwcjg4ODBfMTYoaW50IGkpIHsKKyAgZm9yICggOyBpICE9IDEwIDsgaSsrICkKKyAgICBkbyB7fSB3aGlsZSgoe2lmIChpKSBicmVhazsgaTt9KSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snYnJlYWsnIGlzIGJvdW5kIHRvIGN1cnJlbnQgbG9vcCwgR0NDIGJpbmRzIGl0IHRvIHRoZSBlbmNsb3NpbmcgbG9vcH19Cit9CisKK3ZvaWQgcHI4ODgwXzE3KGludCBpKSB7CisgIGZvciAoIDsgaSAhPSAxMCA7IGkrKyApCisgICAgZG8ge30gd2hpbGUoKHtpZiAoaSkgY29udGludWU7IGk7fSkpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2NvbnRpbnVlJyBpcyBib3VuZCB0byBjdXJyZW50IGxvb3AsIEdDQyBiaW5kcyBpdCB0byB0aGUgZW5jbG9zaW5nIGxvb3B9fQorfQorCit2b2lkIHByODg4MF8xOChpbnQgeCwgaW50IHkpIHsKKyAgd2hpbGUoeCA+IDApCisgICAgc3dpdGNoKCh7aWYoeSkgYnJlYWs7IHk7fSkpIHsKKyAgICBjYXNlIDI6IHggPSAwOworICAgIH0KK30KKwordm9pZCBwcjg4ODBfMTkoaW50IHgsIGludCB5KSB7CisgIHN3aXRjaCh4KSB7CisgIGNhc2UgMToKKyAgICBzd2l0Y2goKHtpZih5KSBicmVhazsgeTt9KSkgeworICAgIGNhc2UgMjogeCA9IDA7CisgICAgfQorICB9Cit9CisKK3ZvaWQgcHI4ODgwXzIwKGludCB4LCBpbnQgeSkgeworICBzd2l0Y2goeCkgeworICBjYXNlIDE6CisgICAgd2hpbGUoKHtpZiAoeSkgYnJlYWs7IHk7fSkpIHt9IC8vZXhwZWN0ZWQtd2FybmluZyB7eydicmVhaycgaXMgYm91bmQgdG8gbG9vcCwgR0NDIGJpbmRzIGl0IHRvIHN3aXRjaH19CisgIH0KK30KKwordm9pZCBwcjg4ODBfMjEoaW50IHgsIGludCB5KSB7CisgIHN3aXRjaCh4KSB7CisgIGNhc2UgMToKKyAgICBkbyB7fSB3aGlsZSgoe2lmICh5KSBicmVhazsgeTt9KSk7IC8vZXhwZWN0ZWQtd2FybmluZyB7eydicmVhaycgaXMgYm91bmQgdG8gbG9vcCwgR0NDIGJpbmRzIGl0IHRvIHN3aXRjaH19CisgIH0KK30KKwordm9pZCBwcjg4ODBfMjIoaW50IHgsIGludCB5KSB7CisgIHN3aXRjaCh4KSB7CisgIGNhc2UgMToKKyAgICBmb3IgKCA7IDsgKHZvaWQpKHsgKyt5OyBicmVhazsgeTt9KSkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2JyZWFrJyBpcyBib3VuZCB0byBsb29wLCBHQ0MgYmluZHMgaXQgdG8gc3dpdGN9fQorICB9Cit9CisKK3ZvaWQgcHI4ODgwXzIzKGludCB4LCBpbnQgeSkgeworICBzd2l0Y2goeCkgeworICBjYXNlIDE6CisgICAgZm9yICggOyAoeyArK3k7IGJyZWFrOyB5O30pOyArK3kpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydicmVhaycgaXMgYm91bmQgdG8gbG9vcCwgR0NDIGJpbmRzIGl0IHRvIHN3aXRjaH19CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9tcy1pbmxpbmUtYXNtLmMgYi90ZXN0L1NlbWEvbXMtaW5saW5lLWFzbS5jCmluZGV4IDY5ZjIzNGUuLmRlY2E2NTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9tcy1pbmxpbmUtYXNtLmMKKysrIGIvdGVzdC9TZW1hL21zLWlubGluZS1hc20uYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJFUVVJUkVTOiB4ODYtNjQtcmVnaXN0ZXJlZC10YXJnZXQKKy8vIFJFUVVJUkVTOiB4ODYtcmVnaXN0ZXJlZC10YXJnZXQKIC8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZmFzbS1ibG9ja3MgLVduby1taWNyb3NvZnQgLXZlcmlmeSAtZnN5bnRheC1vbmx5CiAKIHZvaWQgdDEodm9pZCkgeyAKQEAgLTMyLDMgKzMyLDcyIEBACiAgICAgbW92IGVheCwgVFlQRSBiYXIgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1bmFibGUgdG8gbG9va3VwIGV4cHJlc3Npb259fQogICB9CiB9CisKK3ZvaWQgcmRhcjE1MzE4NDMyKHZvaWQpIHsKKyAgLy8gV2UgdXNlZCB0byBjcmFzaCBvbiB0aGlzLiAgV2hlbiBMTFZNIGNhbGxlZCBiYWNrIHRvIENsYW5nIHRvIHBhcnNlIGEgbmFtZQorICAvLyBhbmQgZG8gbmFtZSBsb29rdXAsIGlmIHBhcnNpbmcgZmFpbGVkLCB3ZSBkaWQgbm90IHJlc3RvcmUgdGhlIGxleGVyIHN0YXRlCisgIC8vIHByb3Blcmx5LgorCisgIC8vIGV4cGVjdGVkLWVycm9yQCsyIHt7ZXhwZWN0ZWQgaWRlbnRpZmllcn19CisgIF9fYXNtIHsKKyAgICBhbmQgZWN4LCB+MTUKKyAgfQorCisgIGludCB4ID0gMDsKKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzMge3tleHBlY3RlZCBpZGVudGlmaWVyfX0KKyAgX19hc20geworICAgIGFuZCBlY3gsIHgKKyAgICBhbmQgZWN4LCB+MTUKKyAgfQorfQorCitzdGF0aWMgaW50IGdsb2JhbDsKKworaW50IHQyKGludCAqYXJyLCBpbnQgaSkgeworICBfX2FzbSB7CisgICAgbW92IGVheCwgYXJyOworICAgIG1vdiBlYXgsIGFyclswXTsKKyAgICBtb3YgZWF4LCBhcnJbMSArIDJdOworICAgIG1vdiBlYXgsIGFyclsxICsgKDIgKiA1KSAtIDMgKyAxPDwxXTsKKyAgfQorCisgIC8vIGV4cGVjdGVkLWVycm9yQCsxIHt7Y2Fubm90IHVzZSBiYXNlIHJlZ2lzdGVyIHdpdGggdmFyaWFibGUgcmVmZXJlbmNlfX0KKyAgX19hc20gbW92IGVheCwgYXJyW2VicCArIDEgKyAoMiAqIDUpIC0gMyArIDE8PDFdCisgIC8vIGV4cGVjdGVkLWVycm9yQCsxIHt7Y2Fubm90IHVzZSBpbmRleCByZWdpc3RlciB3aXRoIHZhcmlhYmxlIHJlZmVyZW5jZX19CisgIF9fYXNtIG1vdiBlYXgsIGFycltlc2kgKiA0XQorICAvLyBleHBlY3RlZC1lcnJvckArMSB7e2Nhbm5vdCB1c2UgbW9yZSB0aGFuIG9uZSBzeW1ib2wgaW4gbWVtb3J5IG9wZXJhbmR9fQorICBfX2FzbSBtb3YgZWF4LCBhcnJbaV0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzEge3tjYW5ub3QgdXNlIG1vcmUgdGhhbiBvbmUgc3ltYm9sIGluIG1lbW9yeSBvcGVyYW5kfX0KKyAgX19hc20gbW92IGVheCwgZ2xvYmFsW2ldCisKKyAgLy8gRklYTUU6IFdoeSBkb24ndCB3ZSBkaWFnbm9zZSB0aGlzPworICAvLyBleHBlY3RlZC1YZXJyb3JAKzEge3tjYW5ub3QgcmVmZXJlbmNlIG11bHRpcGxlIGxvY2FsIHZhcmlhYmxlcyBpbiBhc3NlbWJseSBvcGVyYW5kfX0KKyAgLy9fX2FzbSBtb3YgZWF4LCBbYXJyICsgaV07CisgIHJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBhOworICBpbnQgYjsKK30gQTsKKwordm9pZCB0MygpIHsKKyAgX19hc20gbW92IGVheCwgW2VheF0gVW5kZWNsYXJlZElkIC8vIGV4cGVjdGVkLWVycm9yIHt7dW5rbm93biB0b2tlbiBpbiBleHByZXNzaW9ufX0KKworICAvLyBGSVhNRTogT25seSBlbWl0IG9uZSBkaWFnbm9zdGljIGhlcmUuCisgIC8vIGV4cGVjdGVkLWVycm9yQCsyIHt7dW5leHBlY3RlZCB0eXBlIG5hbWUgJ0EnOiBleHBlY3RlZCBleHByZXNzaW9ufX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzEge3t1bmtub3duIHRva2VuIGluIGV4cHJlc3Npb259fQorICBfX2FzbSBtb3YgZWF4LCBbZWF4XSBBCit9CisKK3ZvaWQgdDQoKSB7CisgIC8vIFRoZSBkb3QgaW4gdGhlICJpbnRlbCBkb3Qgb3BlcmF0b3IiIGlzIG9wdGlvbmFsIGluIE1TVkMuICBNU1ZDIGFsc28gZG9lcworICAvLyBnbG9iYWwgZmllbGQgbG9va3VwLCBidXQgd2UgZG9uJ3QuCisgIF9fYXNtIG1vdiBlYXgsIFswXSBBLmEKKyAgX19hc20gbW92IGVheCwgWzBdLkEuYQorICBfX2FzbSBtb3YgZWF4LCBbMF0uYSAgICAvLyBleHBlY3RlZC1lcnJvciB7e1VuYWJsZSB0byBsb29rdXAgZmllbGQgcmVmZXJlbmNlIX19CisgIF9fYXNtIG1vdiBlYXgsIGZzOlswXSBBLmEKKyAgX19hc20gbW92IGVheCwgZnM6WzBdLkEuYQorICBfX2FzbSBtb3YgZWF4LCBmczpbMF0uYSAvLyBleHBlY3RlZC1lcnJvciB7e1VuYWJsZSB0byBsb29rdXAgZmllbGQgcmVmZXJlbmNlIX19CisgIF9fYXNtIG1vdiBlYXgsIGZzOlswXS4gQS5hICAvLyBleHBlY3RlZC1lcnJvciB7e1VuZXhwZWN0ZWQgdG9rZW4gdHlwZSF9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL21zLXdjaGFyLmMgYi90ZXN0L1NlbWEvbXMtd2NoYXIuYwppbmRleCBmZWJhZjI4Li5lYWQzZDk3IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvbXMtd2NoYXIuYworKysgYi90ZXN0L1NlbWEvbXMtd2NoYXIuYwpAQCAtMTIsNyArMTIsNyBAQAogdW5zaWduZWQgc2hvcnQgZzsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZWRlZmluaXRpb24gb2YgJ2cnIHdpdGggYSBkaWZmZXJlbnQgdHlwZTogJ3Vuc2lnbmVkIHNob3J0JyB2cyAnX193Y2hhcl90J319CiAKIC8vIFRoZSB0eXBlIG9mIGEgd2lkZSBzdHJpbmcgbGl0ZXJhbCBpcyBhY3R1YWxseSBub3QgX193Y2hhcl90LgotX193Y2hhcl90IHNbXSA9IEwiSGVsbG8gd29ybGQhIjsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3thcnJheSBpbml0aWFsaXplciBtdXN0IGJlIGFuIGluaXRpYWxpemVyIGxpc3QkfX0KK19fd2NoYXJfdCBzW10gPSBMIkhlbGxvIHdvcmxkISI7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7YXJyYXkgaW5pdGlhbGl6ZXIgbXVzdCBiZSBhbiBpbml0aWFsaXplciBsaXN0e3skfX19fQogCiAvLyBEbyBub3Qgc3VnZ2VzdCBpbml0aWFsaXppbmcgd2l0aCBhIHN0cmluZyBoZXJlLCBiZWNhdXNlIGl0IHdvdWxkIG5vdCB3b3JrLgotX193Y2hhcl90IHRbXSA9IDE7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7YXJyYXkgaW5pdGlhbGl6ZXIgbXVzdCBiZSBhbiBpbml0aWFsaXplciBsaXN0JH19CitfX3djaGFyX3QgdFtdID0gMTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3thcnJheSBpbml0aWFsaXplciBtdXN0IGJlIGFuIGluaXRpYWxpemVyIGxpc3R7eyR9fX19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvbXNfYml0ZmllbGRfbGF5b3V0LmMgYi90ZXN0L1NlbWEvbXNfYml0ZmllbGRfbGF5b3V0LmMKaW5kZXggNGEyMDc2Yy4uZjIwMTBjMSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL21zX2JpdGZpZWxkX2xheW91dC5jCisrKyBiL3Rlc3QvU2VtYS9tc19iaXRmaWVsZF9sYXlvdXQuYwpAQCAtMSw2ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZm5vLXJ0dGkgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtY3h4LWFiaSBtaWNyb3NvZnQgLWZkdW1wLXJlY29yZC1sYXlvdXRzICVzIDI+L2Rldi9udWxsIFwNCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzICVzIDI+L2Rldi9udWxsIFwNCiAvLyBSVU46ICAgICAgICAgICAgfCBGaWxlQ2hlY2sgJXMNCi0vLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIHg4Nl82NC1wYy13aW4zMiAtY3h4LWFiaSBtaWNyb3NvZnQgLWZkdW1wLXJlY29yZC1sYXlvdXRzICVzIDI+L2Rldi9udWxsIFwNCisvLyBSVU46ICVjbGFuZ19jYzEgLWZuby1ydHRpIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIHg4Nl82NC1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgJXMgMj4vZGV2L251bGwgXA0KIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcw0KIA0KIHR5cGVkZWYgc3RydWN0IEEgew0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9tc19jbGFzc19sYXlvdXQuY3BwIGIvdGVzdC9TZW1hL21zX2NsYXNzX2xheW91dC5jcHAKaW5kZXggYmI4MDUyZS4uODk2ZDNlZCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL21zX2NsYXNzX2xheW91dC5jcHAKKysrIGIvdGVzdC9TZW1hL21zX2NsYXNzX2xheW91dC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bS1vbmx5IC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZmR1bXAtcmVjb3JkLWxheW91dHMgLWN4eC1hYmkgbWljcm9zb2Z0ICVzIDI+JjEgXAorLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0tb25seSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZkdW1wLXJlY29yZC1sYXlvdXRzICVzIDI+L2Rldi9udWxsIFwKIC8vIFJVTjogICAgICAgICAgICB8IEZpbGVDaGVjayAlcwogCiAjcHJhZ21hIHBhY2socHVzaCwgOCkKQEAgLTI4OSw3ICsyODksNyBAQAogLy8gQ0hFQ0stTkVYVDogIDggfCAgICAgKEQgdmZ0YWJsZSBwb2ludGVyKQogLy8gQ0hFQ0stTkVYVDogMTYgfCAgICAgZG91YmxlIGEKIC8vIENIRUNLLU5FWFQ6IHNpemVvZj0yNCwgYWxpZ249OAotLy8gQ0hFQ0stTkVYVDogbnZzaXplPTgsIG52YWxpZ249NAorLy8gQ0hFQ0stTkVYVDogbnZzaXplPTgsIG52YWxpZ249OAogCiAvLyBDSEVDSzogJXN0cnVjdC5IID0gdHlwZSB7ICVzdHJ1Y3QuRywgaTMyKiwgJWNsYXNzLkQgfQogCkBAIC0zNTQsNyArMzU0LDcgQEAKIC8vIENIRUNLLU5FWFQ6ICAgIHwgW3NpemVvZj00MCwgYWxpZ249OAogLy8gQ0hFQ0stTkVYVDogICAgfCAgbnZzaXplPTI0LCBudmFsaWduPThdCiAKLS8vIENIRUNLOiBzdHJ1Y3QuTyA9IHR5cGUgeyBpMzIgKC4uLikqKiwgWzQgeCBpOF0sICVzdHJ1Y3QuSC5iYXNlLCAlc3RydWN0LkcsIFs0IHggaThdLCAlY2xhc3MuRCB9CisvLyBDSEVDSzogc3RydWN0Lk8gPSB0eXBlIHsgaTMyICguLi4pKiosIFs0IHggaThdLCAlc3RydWN0LkguYmFzZSwgJXN0cnVjdC5HLCAlY2xhc3MuRCB9CiAvLyBDSEVDSzogc3RydWN0Lk8uYmFzZSA9IHR5cGUgeyBpMzIgKC4uLikqKiwgWzQgeCBpOF0sICVzdHJ1Y3QuSC5iYXNlLCAlc3RydWN0LkcsIFs0IHggaThdIH0KIAogCkBAIC00MjgsMTAgKzQyOCwxMCBAQAogLy8gQ0hFQ0stTkVYVDogbnZzaXplPTEyLCBudmFsaWduPTQKIAogLy8gQ0hFQ0s6ICVzdHJ1Y3QuZiA9IHR5cGUgeyBpMzIgKC4uLikqKiB9Ci0vLyBDSEVDSzogJXN0cnVjdC5zID0gdHlwZSB7IGkzMiAoLi4uKSoqLCBpMzIqLCBpMzIsIFs0IHggaThdLCAlc3RydWN0LmYgfQorLy8gQ0hFQ0s6ICVzdHJ1Y3QucyA9IHR5cGUgeyBpMzIgKC4uLikqKiwgaTMyKiwgaTMyLCBpMzIsICVzdHJ1Y3QuZiB9CiAvLyBDSEVDSzogJWNsYXNzLklBID0gdHlwZSB7IGkzMiAoLi4uKSoqIH0KLS8vIENIRUNLOiAlY2xhc3MuSUNoID0gdHlwZSB7IGkzMiAoLi4uKSoqLCBpMzIqLCBbNCB4IGk4XSwgJWNsYXNzLklBIH0KLS8vIENIRUNLOiAlc3RydWN0LnNkID0gdHlwZSB7IGkzMiosIGkzMiwgaTgsIFs3IHggaThdLCAlc3RydWN0LmYsICVzdHJ1Y3Qucy5iYXNlLCBbNCB4IGk4XSwgJWNsYXNzLklBLCAlY2xhc3MuSUNoLmJhc2UgfQorLy8gQ0hFQ0s6ICVjbGFzcy5JQ2ggPSB0eXBlIHsgaTMyICguLi4pKiosIGkzMiosIGkzMiwgJWNsYXNzLklBIH0KKy8vIENIRUNLOiAlc3RydWN0LnNkID0gdHlwZSB7IGkzMiosIGkzMiwgaTgsIGkzMiwgJXN0cnVjdC5mLCAlc3RydWN0LnMuYmFzZSwgaTMyLCAlY2xhc3MuSUEsICVjbGFzcy5JQ2guYmFzZSB9CiAKIC8vIENIRUNLOiAgICAgICAwIHwgc3RydWN0IEFWCiAvLyBDSEVDSy1ORVhUOiAgMCB8ICAgKEFWIHZmdGFibGUgcG9pbnRlcikKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCiAvLyBDSEVDSzogJXN0cnVjdC5BViA9IHR5cGUgeyBpMzIgKC4uLikqKiB9CiAvLyBDSEVDSzogJXN0cnVjdC5CViA9IHR5cGUgeyAlc3RydWN0LkFWIH0KLS8vIENIRUNLOiAlc3RydWN0LkNWID0gdHlwZSB7IGkzMiosIFs0IHggaThdLCAlc3RydWN0LkJWIH0KKy8vIENIRUNLOiAlc3RydWN0LkNWID0gdHlwZSB7IGkzMiosIGkzMiwgJXN0cnVjdC5CViB9CiAvLyBDSEVDSzogJXN0cnVjdC5DVi5iYXNlID0gdHlwZSB7IGkzMiogfQogCiAvLyBDSEVDSzogICAgICAgMCB8IHN0cnVjdCBEVgpAQCAtNDcwLDEyICs0NzAsMTIgQEAKIC8vIENIRUNLOiAlc3RydWN0LkRWID0gdHlwZSB7ICVzdHJ1Y3QuQlYgfQogCiAvLyBDSEVDSzogICAgICAgMCB8IHN0cnVjdCBFVgotLy8gQ0hFQ0stTkVYVDogIDQgfCAgIHN0cnVjdCBDViAoYmFzZSkKLS8vIENIRUNLLU5FWFQ6ICA0IHwgICAgIChDViB2YnRhYmxlIHBvaW50ZXIpCiAvLyBDSEVDSy1ORVhUOiAgMCB8ICAgc3RydWN0IERWIChwcmltYXJ5IGJhc2UpCiAvLyBDSEVDSy1ORVhUOiAgMCB8ICAgICBzdHJ1Y3QgQlYgKHByaW1hcnkgYmFzZSkKIC8vIENIRUNLLU5FWFQ6ICAwIHwgICAgICAgc3RydWN0IEFWIChwcmltYXJ5IGJhc2UpCiAvLyBDSEVDSy1ORVhUOiAgMCB8ICAgICAgICAgKEFWIHZmdGFibGUgcG9pbnRlcikKKy8vIENIRUNLLU5FWFQ6ICA0IHwgICBzdHJ1Y3QgQ1YgKGJhc2UpCisvLyBDSEVDSy1ORVhUOiAgNCB8ICAgICAoQ1YgdmJ0YWJsZSBwb2ludGVyKQogLy8gQ0hFQ0stTkVYVDogIDggfCAgICh2dG9yZGlzcCBmb3IgdmJhc2UgQlYpCiAvLyBDSEVDSy1ORVhUOiAxMiB8ICAgc3RydWN0IEJWICh2aXJ0dWFsIGJhc2UpCiAvLyBDSEVDSy1ORVhUOiAxMiB8ICAgICBzdHJ1Y3QgQVYgKHByaW1hcnkgYmFzZSkKQEAgLTQ4Myw3ICs0ODMsNyBAQAogLy8gQ0hFQ0stTkVYVDogc2l6ZW9mPTE2LCBhbGlnbj00CiAvLyBDSEVDSy1ORVhUOiBudnNpemU9OCwgbnZhbGlnbj00CiAKLS8vIENIRUNLOiAlc3RydWN0LkVWID0gdHlwZSB7ICVzdHJ1Y3QuRFYsICVzdHJ1Y3QuQ1YuYmFzZSwgWzQgeCBpOF0sICVzdHJ1Y3QuQlYgfQorLy8gQ0hFQ0s6ICVzdHJ1Y3QuRVYgPSB0eXBlIHsgJXN0cnVjdC5EViwgJXN0cnVjdC5DVi5iYXNlLCBpMzIsICVzdHJ1Y3QuQlYgfQogLy8gQ0hFQ0s6ICVzdHJ1Y3QuRVYuYmFzZSA9IHR5cGUgeyAlc3RydWN0LkRWLCAlc3RydWN0LkNWLmJhc2UgfQogCiAvLyBPdmVycmlkaW5nIGEgbWV0aG9kIG1lYW5zIHRoYXQgYWxsIHRoZSB2YmFzZXMgY29udGFpbmluZyB0aGF0CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvbmVvbi12ZWN0b3ItdHlwZXMuYyBiL3Rlc3QvU2VtYS9uZW9uLXZlY3Rvci10eXBlcy5jCmluZGV4IGQ4ZGQ0MTIuLjAzZjY2OWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9uZW9uLXZlY3Rvci10eXBlcy5jCisrKyBiL3Rlc3QvU2VtYS9uZW9uLXZlY3Rvci10eXBlcy5jCkBAIC00LDcgKzQsNyBAQAogdHlwZWRlZiBmbG9hdCBmbG9hdDMyX3Q7CiB0eXBlZGVmIHNpZ25lZCBjaGFyIHBvbHk4X3Q7CiB0eXBlZGVmIHNob3J0IHBvbHkxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIF9fSU5UNjRfVFlQRV9fIHVpbnQ2NF90OwogCiAvLyBEZWZpbmUgc29tZSB2YWxpZCBOZW9uIHR5cGVzLgogdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3ZlY3Rvcl90eXBlKDIpKSkgaW50IGludDMyeDJfdDsKQEAgLTIzLDcgKzIzLDYgQEAKIHR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSgyLjApKSkgaW50IG5vbl9pbnRfd2lkdGg7IC8vIGV4cGVjdGVkLWVycm9ye3snbmVvbl92ZWN0b3JfdHlwZScgYXR0cmlidXRlIHJlcXVpcmVzIGFuIGludGVnZXIgY29uc3RhbnR9fQogCiAvLyBPbmx5IGNlcnRhaW4gZWxlbWVudCB0eXBlcyBhcmUgYWxsb3dlZC4KLXR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSgyKSkpIGRvdWJsZSBkb3VibGVfZWx0OyAvLyBleHBlY3RlZC1lcnJvcnt7aW52YWxpZCB2ZWN0b3IgZWxlbWVudCB0eXBlfX0KIHR5cGVkZWYgX19hdHRyaWJ1dGVfXygobmVvbl92ZWN0b3JfdHlwZSg0KSkpIHZvaWQqIHB0cl9lbHQ7IC8vIGV4cGVjdGVkLWVycm9ye3tpbnZhbGlkIHZlY3RvciBlbGVtZW50IHR5cGV9fQogdHlwZWRlZiBfX2F0dHJpYnV0ZV9fKChuZW9uX3BvbHl2ZWN0b3JfdHlwZSg0KSkpIGZsb2F0MzJfdCBiYWRfcG9seV9lbHQ7IC8vIGV4cGVjdGVkLWVycm9ye3tpbnZhbGlkIHZlY3RvciBlbGVtZW50IHR5cGV9fQogc3RydWN0IGFnZ3IgeyBzaWduZWQgY2hhciBjOyB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL25vbm51bGwuYyBiL3Rlc3QvU2VtYS9ub25udWxsLmMKaW5kZXggNGU2MTcxMS4uMGU5MjY1NCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL25vbm51bGwuYworKysgYi90ZXN0L1NlbWEvbm9ubnVsbC5jCkBAIC0yMCwzICsyMCwzNiBAQAogfQogCiB2b2lkIGZvbyhjb25zdCBjaGFyICpzdHIpIF9fYXR0cmlidXRlX18oKG5vbm51bGwoImZvbyIpKSk7IC8vIGV4cGVjdGVkLWVycm9ye3snbm9ubnVsbCcgYXR0cmlidXRlIHJlcXVpcmVzIHBhcmFtZXRlciAxIHRvIGJlIGFuIGludGVnZXIgY29uc3RhbnR9fQordm9pZCBiYXIoaW50IGkpIF9fYXR0cmlidXRlX18oKG5vbm51bGwoMSkpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydub25udWxsJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHBvaW50ZXIgYXJndW1lbnRzfX0gZXhwZWN0ZWQtd2FybmluZyB7eydub25udWxsJyBhdHRyaWJ1dGUgYXBwbGllZCB0byBmdW5jdGlvbiB3aXRoIG5vIHBvaW50ZXIgYXJndW1lbnRzfX0KKwordm9pZCBiYXooX19hdHRyaWJ1dGVfXygobm9ubnVsbCkpIGNvbnN0IGNoYXIgKnN0cik7Cit2b2lkIGJhejIoX19hdHRyaWJ1dGVfXygobm9ubnVsbCgxKSkpIGNvbnN0IGNoYXIgKnN0cik7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snbm9ubnVsbCcgYXR0cmlidXRlIHdoZW4gdXNlZCBvbiBwYXJhbWV0ZXJzIHRha2VzIG5vIGFyZ3VtZW50c319Cit2b2lkIGJhejMoX19hdHRyaWJ1dGVfXygobm9ubnVsbCkpIGludCB4KTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydub25udWxsJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHBvaW50ZXIgYXJndW1lbnRzfX0KKwordm9pZCB0ZXN0X2JheigpIHsKKyAgYmF6KDApOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bnVsbCBwYXNzZWQgdG8gYSBjYWxsZWUgd2hpY2ggcmVxdWlyZXMgYSBub24tbnVsbCBhcmd1bWVudH19CisgIGJhejIoMCk7IC8vIG5vLXdhcm5pbmcKKyAgYmF6MygwKTsgLy8gbm8td2FybmluZworfQorCit2b2lkIHRlc3Rfdm9pZF9yZXR1cm5zX25vbm51bGwodm9pZCkgX19hdHRyaWJ1dGVfXygocmV0dXJuc19ub25udWxsKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sncmV0dXJuc19ub25udWxsJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHJldHVybiB2YWx1ZXMgdGhhdCBhcmUgcG9pbnRlcnN9fQoraW50IHRlc3RfaW50X3JldHVybnNfbm9ubnVsbCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChyZXR1cm5zX25vbm51bGwpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydyZXR1cm5zX25vbm51bGwnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBwb2ludGVyc319Cit2b2lkICp0ZXN0X3B0cl9yZXR1cm5zX25vbm51bGwodm9pZCkgX19hdHRyaWJ1dGVfXygocmV0dXJuc19ub25udWxsKSk7IC8vIG5vLXdhcm5pbmcKKworaW50IGkgX19hdHRyaWJ1dGVfXygobm9ubnVsbCkpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J25vbm51bGwnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zLCBtZXRob2RzLCBhbmQgcGFyYW1ldGVyc319CitpbnQgaiBfX2F0dHJpYnV0ZV9fKChyZXR1cm5zX25vbm51bGwpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydyZXR1cm5zX25vbm51bGwnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zIGFuZCBtZXRob2RzfX0KK3ZvaWQgKnRlc3Rfbm9fZm5fcHJvdG8oKSBfX2F0dHJpYnV0ZV9fKChyZXR1cm5zX25vbm51bGwpKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3sncmV0dXJuc19ub25udWxsJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9ucyBhbmQgbWV0aG9kc319CisKK19fYXR0cmlidXRlX18oKHJldHVybnNfbm9ubnVsbCkpCit2b2lkICp0ZXN0X2JhZF9yZXR1cm5zX251bGwodm9pZCkgeworICByZXR1cm4gMDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e251bGwgcmV0dXJuZWQgZnJvbSBmdW5jdGlvbiB0aGF0IHJlcXVpcmVzIGEgbm9uLW51bGwgcmV0dXJuIHZhbHVlfX0KK30KKwordm9pZCBQUjE4Nzk1KGludCAoKmcpKGNvbnN0IGNoYXIgKmgsIC4uLikgX19hdHRyaWJ1dGVfXygobm9ubnVsbCgxKSkpIF9fYXR0cmlidXRlX18oKG5vbm51bGwpKSkgeworICBnKDApOyAvLyBleHBlY3RlZC13YXJuaW5ne3tudWxsIHBhc3NlZCB0byBhIGNhbGxlZSB3aGljaCByZXF1aXJlcyBhIG5vbi1udWxsIGFyZ3VtZW50fX0KK30KK3ZvaWQgUFIxODc5NV9oZWxwZXIoKSB7CisgIFBSMTg3OTUoMCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e251bGwgcGFzc2VkIHRvIGEgY2FsbGVlIHdoaWNoIHJlcXVpcmVzIGEgbm9uLW51bGwgYXJndW1lbnR9fQorfQorCisKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9vdmVybG9hZGFibGUuYyBiL3Rlc3QvU2VtYS9vdmVybG9hZGFibGUuYwppbmRleCBiOTNjMzlmLi5iZGQ0NzE0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvb3ZlcmxvYWRhYmxlLmMKKysrIGIvdGVzdC9TZW1hL292ZXJsb2FkYWJsZS5jCkBAIC0xLDYgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcwogCi1pbnQgdmFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpOyAvLyBleHBlY3RlZC1lcnJvcnt7J292ZXJsb2FkYWJsZScgYXR0cmlidXRlIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBmdW5jdGlvbn19CitpbnQgdmFyIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpOyAvLyBleHBlY3RlZC1lcnJvcnt7J292ZXJsb2FkYWJsZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQogdm9pZCBwYXJhbXModm9pZCkgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKDEyKSkpOyAvLyBleHBlY3RlZC1lcnJvciB7eydvdmVybG9hZGFibGUnIGF0dHJpYnV0ZSB0YWtlcyBubyBhcmd1bWVudHN9fQogCiBpbnQgKmYoaW50KSBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKTsgLy8gZXhwZWN0ZWQtbm90ZSAye3twcmV2aW91cyBvdmVybG9hZCBvZiBmdW5jdGlvbiBpcyBoZXJlfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9wcmFnbWEtbXNfc3RydWN0LmMgYi90ZXN0L1NlbWEvcHJhZ21hLW1zX3N0cnVjdC5jCmluZGV4IDY1MzMzMjAuLmUyYzVmZjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS9wcmFnbWEtbXNfc3RydWN0LmMKKysrIGIvdGVzdC9TZW1hL3ByYWdtYS1tc19zdHJ1Y3QuYwpAQCAtMjUsNyArMjUsNyBAQAogfSBfX2F0dHJpYnV0ZV9fKChfX21zX3N0cnVjdF9fKSkgdDE7CiAKIHN0cnVjdCBTIHsKLQkJICAgZG91YmxlIF9fYXR0cmlidXRlX18oKG1zX3N0cnVjdCkpIGQ7CS8vIGV4cGVjdGVkLXdhcm5pbmcge3snbXNfc3RydWN0JyBhdHRyaWJ1dGUgaWdub3JlZH19CisJCSAgIGRvdWJsZSBfX2F0dHJpYnV0ZV9fKChtc19zdHJ1Y3QpKSBkOwkvLyBleHBlY3RlZC13YXJuaW5nIHt7J21zX3N0cnVjdCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3Qgb3IgdW5pb259fQogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYmZfMSA6IDEyOwogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgOiAwOwogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYmZfMiA6IDEyOwpAQCAtMzYsNyArMzYsNyBAQAogICBBID0gMCwKICAgQiwKICAgQwotfSBfX2F0dHJpYnV0ZV9fKChtc19zdHJ1Y3QpKSBlMTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydtc19zdHJ1Y3QnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KK30gX19hdHRyaWJ1dGVfXygobXNfc3RydWN0KSkgZTE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snbXNfc3RydWN0JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHN0cnVjdCBvciB1bmlvbn19CiAKIC8vIHJkYXI6Ly8xMDUxMzU5OQogI3ByYWdtYSBtc19zdHJ1Y3Qgb24KQEAgLTUyLDEwICs1MiwxMiBAQAogdm9pZCAqcHYxOwogRm9vIGZvbzsKIHVuc2lnbmVkIHNob3J0IGZJbml0ZWQgOiAxOwotdm9pZCAqcHYyOwkJCi19IFBhY2tPZGRpdHk7CQkKK3ZvaWQgKnB2MjsKK30gUGFja09kZGl0eTsKIAogI3ByYWdtYSBtc19zdHJ1Y3Qgb2ZmCiAKIHN0YXRpYyBpbnQgYXJyW3NpemVvZihQYWNrT2RkaXR5KSA9PSA0MCA/IDEgOiAtMV07CiAKK3N0cnVjdCBfX2RlY2xzcGVjKG1zX3N0cnVjdCkgYmFkIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e19fZGVjbHNwZWMgYXR0cmlidXRlICdtc19zdHJ1Y3QnIGlzIG5vdCBzdXBwb3J0ZWR9fQorfTsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9wcmFnbWEtcGFjay1hcHBsZS5jIGIvdGVzdC9TZW1hL3ByYWdtYS1wYWNrLWFwcGxlLmMKaW5kZXggNWIzM2MwMy4uNDI2ZDk4NCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL3ByYWdtYS1wYWNrLWFwcGxlLmMKKysrIGIvdGVzdC9TZW1hL3ByYWdtYS1wYWNrLWFwcGxlLmMKQEAgLTEsNSArMSw1IEBACi0vLyBSVU46ICVjbGFuZyAtZnN5bnRheC1vbmx5ICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMKLS8vIFJVTjogJWNsYW5nIC1mc3ludGF4LW9ubHkgLWZhcHBsZS1wcmFnbWEtcGFjayAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stQVBQTEUgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5ICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC1mYXBwbGUtcHJhZ21hLXBhY2sgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLUFQUExFICVzCiAKICNwcmFnbWEgcGFjayhwdXNoLDEpCiAjcHJhZ21hIHBhY2soMikKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9yZXR1cm4uYyBiL3Rlc3QvU2VtYS9yZXR1cm4uYwppbmRleCA3ZTdjOGI3Li4yYTU4YTZlIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvcmV0dXJuLmMKKysrIGIvdGVzdC9TZW1hL3JldHVybi5jCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmcgJXMgLWZzeW50YXgtb25seSAtV2lnbm9yZWQtcXVhbGlmaWVycyAtV25vLWVycm9yPXJldHVybi10eXBlIC1YY2xhbmcgLXZlcmlmeSAtZmJsb2NrcyAtV25vLXVucmVhY2hhYmxlLWNvZGUgLVduby11bnVzZWQtdmFsdWUKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW45ICVzIC1mc3ludGF4LW9ubHkgLVdpZ25vcmVkLXF1YWxpZmllcnMgLVduby1lcnJvcj1yZXR1cm4tdHlwZSAtdmVyaWZ5IC1mYmxvY2tzIC1Xbm8tdW5yZWFjaGFibGUtY29kZSAtV25vLXVudXNlZC12YWx1ZQogCiAvLyBjbGFuZyBlbWl0cyB0aGUgZm9sbG93aW5nIHdhcm5pbmcgYnkgZGVmYXVsdC4KIC8vIFdpdGggR0NDLCAtcGVkYW50aWMsIC1XcmV0dXJuLXR5cGUgb3IgLVdhbGwgYXJlIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIApAQCAtMjc1LDMgKzI3NSw0NCBAQAogICAgIHJldHVybiA1OwogICB9CiB9CisKKy8vIFBSMTg5OTkKK2ludCB0ZXN0MzUoKSB7CitsYmw6CisgIGlmICgxKQorICAgIGdvdG8gbGJsOworfQorCisvLyBQUjE5MDc0Lgordm9pZCBhYm9ydCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworI2RlZmluZSBhdl9hc3NlcnQwKGNvbmQpIGRvIHtcCisgICAgaWYgKCEoY29uZCkpIHtcCisgICAgICBhYm9ydCgpO1wKKyAgICB9XAorICB9IHdoaWxlICgwKQorCitpbnQgUFIxOTA3NChpbnQgeCkgeworICBzd2l0Y2goeCkgeworICBjYXNlIDA6CisgICAgcmV0dXJuIDA7CisgIGRlZmF1bHQ6CisgICAgYXZfYXNzZXJ0MCgwKTsKKyAgfSAvLyBuby13YXJuaW5nCit9CisKK2ludCBQUjE5MDc0X3Bvc2l0aXZlKGludCB4KSB7CisgIHN3aXRjaCh4KSB7CisgIGNhc2UgMDoKKyAgICByZXR1cm4gMDsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y29udHJvbCBtYXkgcmVhY2ggZW5kIG9mIG5vbi12b2lkIGZ1bmN0aW9ufX0KKworLy8gc2l6ZW9mKGxvbmcpIHRlc3QuCitpbnQgc2l6ZW9mX2xvbmcoKSB7CisgIGlmIChzaXplb2YobG9uZykgPT0gNCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKHNpemVvZihsb25nKSA9PSA4KQorICAgIHJldHVybiAyOworfSAvLyBuby13YXJuaW5nCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvc2VudGluZWwtYXR0cmlidXRlLmMgYi90ZXN0L1NlbWEvc2VudGluZWwtYXR0cmlidXRlLmMKaW5kZXggZTVjYmY2ZS4uNDZmMTM1MCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL3NlbnRpbmVsLWF0dHJpYnV0ZS5jCisrKyBiL3Rlc3QvU2VtYS9zZW50aW5lbC1hdHRyaWJ1dGUuYwpAQCAtNSw3ICs1LDcgQEAKIHZvaWQgZjIoaW50IGEsIC4uLikgX19hdHRyaWJ1dGVfXyAoKHNlbnRpbmVsKDEpKSk7CiAKIHZvaWQgZjMoaW50IGEsIC4uLikgX19hdHRyaWJ1dGVfXyAoKHNlbnRpbmVsKCJoZWxsbyIpKSk7IC8vZXhwZWN0ZWQtZXJyb3J7eydzZW50aW5lbCcgYXR0cmlidXRlIHJlcXVpcmVzIHBhcmFtZXRlciAxIHRvIGJlIGFuIGludGVnZXIgY29uc3RhbnR9fQotdm9pZCBmNChpbnQgYSwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoc2VudGluZWwoMSwgMiwgMykpKTsgLy9leHBlY3RlZC1lcnJvcnt7YXR0cmlidXRlIHRha2VzIG5vIG1vcmUgdGhhbiAyIGFyZ3VtZW50c319Cit2b2lkIGY0KGludCBhLCAuLi4pIF9fYXR0cmlidXRlX18gKChzZW50aW5lbCgxLCAyLCAzKSkpOyAvL2V4cGVjdGVkLWVycm9ye3snc2VudGluZWwnIGF0dHJpYnV0ZSB0YWtlcyBubyBtb3JlIHRoYW4gMiBhcmd1bWVudHN9fQogdm9pZCBmNChpbnQgYSwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoc2VudGluZWwoLTEpKSk7IC8vZXhwZWN0ZWQtZXJyb3J7e3BhcmFtZXRlciAxIGxlc3MgdGhhbiB6ZXJvfX0KIHZvaWQgZjQoaW50IGEsIC4uLikgX19hdHRyaWJ1dGVfXyAoKHNlbnRpbmVsKDAsIDIpKSk7IC8vIGV4cGVjdGVkLWVycm9ye3twYXJhbWV0ZXIgMiBub3QgMCBvciAxfX0KIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL3NoaWZ0LmMgYi90ZXN0L1NlbWEvc2hpZnQuYwppbmRleCAxNDJkODNjLi5kMzU1NTQ0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvc2hpZnQuYworKysgYi90ZXN0L1NlbWEvc2hpZnQuYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nIC1XYWxsIC1Xc2hpZnQtc2lnbi1vdmVyZmxvdyAtZmZyZWVzdGFuZGluZyAtZnN5bnRheC1vbmx5IC1YY2xhbmcgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1XYWxsIC1Xc2hpZnQtc2lnbi1vdmVyZmxvdyAtZmZyZWVzdGFuZGluZyAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKIAogI2luY2x1ZGUgPGxpbWl0cy5oPgogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvc3RhdGVtZW50cy5jIGIvdGVzdC9TZW1hL3N0YXRlbWVudHMuYwppbmRleCBmMDFlZTQwLi4wNTc0OTJhIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvc3RhdGVtZW50cy5jCisrKyBiL3Rlc3QvU2VtYS9zdGF0ZW1lbnRzLmMKQEAgLTkwLDkgKzkwLDYgQEAKICAgfQogfQogCi0vLyBQUiA4ODgwCi0vLyBGSVhNRTogQ2xhbmcgc2hvdWxkIHJlamVjdCB0aGlzLCBzaW5jZSBHQ0MgZG9lcy4gIFByZXZpb3VzbHkgdGhpcwotLy8gd2FzIGNhdXNpbmcgYSBjcmFzaCBpbiB0aGUgQ0ZHIGJ1aWxkZXIuCiBpbnQgdGVzdF9wcjg4ODAoKSB7CiAgIGludCBmaXJzdCA9IDE7CiAgIGZvciAoIDsgKHsgaWYgKGZpcnN0KSB7IGZpcnN0ID0gMDsgY29udGludWU7IH0gMDsgfSk7ICkKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9zdGF0aWMtaW5pdC5jIGIvdGVzdC9TZW1hL3N0YXRpYy1pbml0LmMKaW5kZXggYmJmOTAzOC4uYTJlZDU1MSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL3N0YXRpYy1pbml0LmMKKysrIGIvdGVzdC9TZW1hL3N0YXRpYy1pbml0LmMKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1Xbm8tYm9vbC1jb252ZXJzaW9uICVzCiAKIHR5cGVkZWYgX190eXBlb2YoKGludCopIDAgLSAoaW50KikgMCkgaW50cHRyX3Q7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS9zd2l0Y2guYyBiL3Rlc3QvU2VtYS9zd2l0Y2guYwppbmRleCBlMzdkNWRhLi4wOTIzNzhkIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvc3dpdGNoLmMKKysrIGIvdGVzdC9TZW1hL3N3aXRjaC5jCkBAIC0xMDksMTQgKzEwOSwxNCBAQAogICBzd2l0Y2goYSkgewogICAgIGNhc2UgQToKICAgICBjYXNlIEI6Ci0gICAgY2FzZSAzOiAvLyBleHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gPGFub255bW91cyBlbnVtfX0KKyAgICBjYXNlIDM6IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2Nhc2UgdmFsdWUgbm90IGluIGVudW1lcmF0ZWQgdHlwZSAnZW51bSAoYW5vbnltb3VzIGVudW19fQogICAgICAgYnJlYWs7CiAgIH0KICAgc3dpdGNoKGEpIHsKICAgICBjYXNlIEE6CiAgICAgY2FzZSBCOgotICAgIGNhc2UgMyAuLi4gLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gPGFub255bW91cyBlbnVtfX0KLSAgICAgICAgNDogLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gPGFub255bW91cyBlbnVtfX0KKyAgICBjYXNlIDMgLi4uIC8vZXhwZWN0ZWQtd2FybmluZ3t7Y2FzZSB2YWx1ZSBub3QgaW4gZW51bWVyYXRlZCB0eXBlICdlbnVtIChhbm9ueW1vdXMgZW51bX19CisgICAgICAgIDQ6IC8vZXhwZWN0ZWQtd2FybmluZ3t7Y2FzZSB2YWx1ZSBub3QgaW4gZW51bWVyYXRlZCB0eXBlICdlbnVtIChhbm9ueW1vdXMgZW51bX19CiAgICAgICBicmVhazsKICAgfQogICBzd2l0Y2goYSkgewpAQCAtMTI0LDE2ICsxMjQsMTYgQEAKICAgICAgIGJyZWFrOwogICB9CiAgIHN3aXRjaChhKSB7Ci0gICAgY2FzZSAwIC4uLiAyOiAvL2V4cGVjdGVkLXdhcm5pbmd7e2Nhc2UgdmFsdWUgbm90IGluIGVudW1lcmF0ZWQgdHlwZSAnZW51bSA8YW5vbnltb3VzIGVudW19fQorICAgIGNhc2UgMCAuLi4gMjogLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gKGFub255bW91cyBlbnVtfX0KICAgICAgIGJyZWFrOwogICB9CiAgIHN3aXRjaChhKSB7Ci0gICAgY2FzZSAxIC4uLiAzOiAvL2V4cGVjdGVkLXdhcm5pbmd7e2Nhc2UgdmFsdWUgbm90IGluIGVudW1lcmF0ZWQgdHlwZSAnZW51bSA8YW5vbnltb3VzIGVudW19fQorICAgIGNhc2UgMSAuLi4gMzogLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gKGFub255bW91cyBlbnVtfX0KICAgICAgIGJyZWFrOwogICB9CiAgIHN3aXRjaChhKSB7Ci0gICAgY2FzZSAwIC4uLiAgLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gPGFub255bW91cyBlbnVtfX0KLSAgICAgIDM6ICAvL2V4cGVjdGVkLXdhcm5pbmd7e2Nhc2UgdmFsdWUgbm90IGluIGVudW1lcmF0ZWQgdHlwZSAnZW51bSA8YW5vbnltb3VzIGVudW19fQorICAgIGNhc2UgMCAuLi4gIC8vZXhwZWN0ZWQtd2FybmluZ3t7Y2FzZSB2YWx1ZSBub3QgaW4gZW51bWVyYXRlZCB0eXBlICdlbnVtIChhbm9ueW1vdXMgZW51bX19CisgICAgICAzOiAgLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gKGFub255bW91cyBlbnVtfX0KICAgICAgIGJyZWFrOwogICB9CiAKQEAgLTE2NywxMSArMTY3LDExIEBACiAgICAgQyA9IDEKICAgfSBhOwogICBzd2l0Y2goYSkgewotICAgIGNhc2UgMDogLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gPGFub255bW91cyBlbnVtfX0KKyAgICBjYXNlIDA6IC8vZXhwZWN0ZWQtd2FybmluZ3t7Y2FzZSB2YWx1ZSBub3QgaW4gZW51bWVyYXRlZCB0eXBlICdlbnVtIChhbm9ueW1vdXMgZW51bX19CiAgICAgY2FzZSAxOgotICAgIGNhc2UgMjogLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gPGFub255bW91cyBlbnVtfX0KKyAgICBjYXNlIDI6IC8vZXhwZWN0ZWQtd2FybmluZ3t7Y2FzZSB2YWx1ZSBub3QgaW4gZW51bWVyYXRlZCB0eXBlICdlbnVtIChhbm9ueW1vdXMgZW51bX19CiAgICAgY2FzZSAzOgotICAgIGNhc2UgNDogLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gPGFub255bW91cyBlbnVtfX0KKyAgICBjYXNlIDQ6IC8vZXhwZWN0ZWQtd2FybmluZ3t7Y2FzZSB2YWx1ZSBub3QgaW4gZW51bWVyYXRlZCB0eXBlICdlbnVtIChhbm9ueW1vdXMgZW51bX19CiAgICAgICBicmVhazsKICAgfQogfQpAQCAtMTg0LDE0ICsxODQsMTQgQEAKICAgICBEID0gMTIKICAgfSBhOwogICBzd2l0Y2goYSkgewotICAgIGNhc2UgMCAuLi4gIC8vZXhwZWN0ZWQtd2FybmluZ3t7Y2FzZSB2YWx1ZSBub3QgaW4gZW51bWVyYXRlZCB0eXBlICdlbnVtIDxhbm9ueW1vdXMgZW51bX19Ci0JICAgIDE6ICAvL2V4cGVjdGVkLXdhcm5pbmd7e2Nhc2UgdmFsdWUgbm90IGluIGVudW1lcmF0ZWQgdHlwZSAnZW51bSA8YW5vbnltb3VzIGVudW19fQorICAgIGNhc2UgMCAuLi4gIC8vZXhwZWN0ZWQtd2FybmluZ3t7Y2FzZSB2YWx1ZSBub3QgaW4gZW51bWVyYXRlZCB0eXBlICdlbnVtIChhbm9ueW1vdXMgZW51bX19CisJICAgIDE6ICAvL2V4cGVjdGVkLXdhcm5pbmd7e2Nhc2UgdmFsdWUgbm90IGluIGVudW1lcmF0ZWQgdHlwZSAnZW51bSAoYW5vbnltb3VzIGVudW19fQogICAgIGNhc2UgMiAuLi4gNDoKLSAgICBjYXNlIDUgLi4uICAvL2V4cGVjdGVkLXdhcm5pbmd7e2Nhc2UgdmFsdWUgbm90IGluIGVudW1lcmF0ZWQgdHlwZSAnZW51bSA8YW5vbnltb3VzIGVudW19fQkKLQkgICAgICA5OiAgLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gPGFub255bW91cyBlbnVtfX0KKyAgICBjYXNlIDUgLi4uICAvL2V4cGVjdGVkLXdhcm5pbmd7e2Nhc2UgdmFsdWUgbm90IGluIGVudW1lcmF0ZWQgdHlwZSAnZW51bSAoYW5vbnltb3VzIGVudW19fQkKKwkgICAgICA5OiAgLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gKGFub255bW91cyBlbnVtfX0KICAgICBjYXNlIDEwIC4uLiAxMjoKLSAgICBjYXNlIDEzIC4uLiAgLy9leHBlY3RlZC13YXJuaW5ne3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gPGFub255bW91cyBlbnVtfX0KLSAgICAgICAgICAgICAgMTY6IC8vZXhwZWN0ZWQtd2FybmluZ3t7Y2FzZSB2YWx1ZSBub3QgaW4gZW51bWVyYXRlZCB0eXBlICdlbnVtIDxhbm9ueW1vdXMgZW51bX19CisgICAgY2FzZSAxMyAuLi4gIC8vZXhwZWN0ZWQtd2FybmluZ3t7Y2FzZSB2YWx1ZSBub3QgaW4gZW51bWVyYXRlZCB0eXBlICdlbnVtIChhbm9ueW1vdXMgZW51bX19CisgICAgICAgICAgICAgIDE2OiAvL2V4cGVjdGVkLXdhcm5pbmd7e2Nhc2UgdmFsdWUgbm90IGluIGVudW1lcmF0ZWQgdHlwZSAnZW51bSAoYW5vbnltb3VzIGVudW19fQogICAgICAgYnJlYWs7CiAgIH0KIH0KQEAgLTM0OSwzICszNDksMjkgQEAKICAgICAgIGJyZWFrOwogICB9CiB9CisKKy8vIEFsbG93IHRoZSB3YXJuaW5nICdjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUnIHRvIGJlIHNpbGVuY2VkIHdpdGgKKy8vIHRoZSBmb2xsb3dpbmcgcGF0dGVybi4KKy8vCisvLyBJZiAnY2FzZScgZXhwcmVzc2lvbiByZWZlcnMgdG8gYSBzdGF0aWMgY29uc3QgdmFyaWFibGUgb2YgdGhlIGNvcnJlY3QgZW51bQorLy8gdHlwZSwgdGhlbiB3ZSBjb3VudCB0aGlzIGFzIGEgc3VmZmljaWVudCBkZWNsYXJhdGlvbiBvZiBpbnRlbnQgYnkgdGhlIHVzZXIsCisvLyBzbyB3ZSBzaWxlbmNlIHRoZSB3YXJuaW5nLgorZW51bSBFeHRlbmRlZEVudW0xIHsKKyAgRUUxX2EsCisgIEVFMV9iCit9OworCitlbnVtIEV4dGVuZGVkRW51bTFfdW5yZWxhdGVkIHsgRUUxX21pc2MgfTsKKworc3RhdGljIGNvbnN0IGVudW0gRXh0ZW5kZWRFbnVtMSBFRTFfYyA9IDEwMDsKK3N0YXRpYyBjb25zdCBlbnVtIEV4dGVuZGVkRW51bTFfdW5yZWxhdGVkIEVFMV9kID0gMTAxOworCit2b2lkIHN3aXRjaF9vbl9FeHRlbmRlZEVudW0xKGVudW0gRXh0ZW5kZWRFbnVtMSBlKSB7CisgIHN3aXRjaChlKSB7CisgIGNhc2UgRUUxX2E6IGJyZWFrOworICBjYXNlIEVFMV9iOiBicmVhazsKKyAgY2FzZSBFRTFfYzogYnJlYWs7IC8vIG5vLXdhcm5pbmcKKyAgY2FzZSBFRTFfZDogYnJlYWs7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYXNlIHZhbHVlIG5vdCBpbiBlbnVtZXJhdGVkIHR5cGUgJ2VudW0gRXh0ZW5kZWRFbnVtMSd9fQorICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS90aHJlYWQtc3BlY2lmaWVyLmMgYi90ZXN0L1NlbWEvdGhyZWFkLXNwZWNpZmllci5jCmluZGV4IGJmMWNlOWUuLjM5MjQzZDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS90aHJlYWQtc3BlY2lmaWVyLmMKKysrIGIvdGVzdC9TZW1hL3RocmVhZC1zcGVjaWZpZXIuYwpAQCAtMjEsNyArMjEsNyBAQAogX190aHJlYWQgX19wcml2YXRlX2V4dGVybl9fIGludCB0NDsKIHN0cnVjdCB0NSB7IF9fdGhyZWFkIGludCB4OyB9OwogI2lmZGVmIF9fY3BsdXNwbHVzCi0vLyBleHBlY3RlZC1lcnJvci1yZUAtMiB7eycoX190aHJlYWR8X1RocmVhZF9sb2NhbHx0aHJlYWRfbG9jYWwpJyBpcyBvbmx5IGFsbG93ZWQgb24gdmFyaWFibGUgZGVjbGFyYXRpb25zfX0KKy8vIGV4cGVjdGVkLWVycm9yLXJlQC0yIHt7J3t7X190aHJlYWR8X1RocmVhZF9sb2NhbHx0aHJlYWRfbG9jYWx9fScgaXMgb25seSBhbGxvd2VkIG9uIHZhcmlhYmxlIGRlY2xhcmF0aW9uc319CiAjZWxzZQogLy8gRklYTUU6IFRoZSAnaXMgb25seSBhbGxvd2VkIG9uIHZhcmlhYmxlIGRlY2xhcmF0aW9ucycgZGlhZ25vc3RpYyBpcyBiZXR0ZXIgaGVyZS4KIC8vIGV4cGVjdGVkLWVycm9yQC01IHt7dHlwZSBuYW1lIGRvZXMgbm90IGFsbG93IHN0b3JhZ2UgY2xhc3MgdG8gYmUgc3BlY2lmaWVkfX0KQEAgLTQ3LDE3ICs0NywxNyBAQAogICBzdGF0aWMgX190aHJlYWQgaW50IHQxMDsKICAgX190aHJlYWQgX19wcml2YXRlX2V4dGVybl9fIGludCB0MTE7CiAjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCi0gIF9fdGhyZWFkIGF1dG8gaW50IHQxMmE7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7Y2Fubm90IGNvbWJpbmUgd2l0aCBwcmV2aW91cyAnKF9fdGhyZWFkfF9UaHJlYWRfbG9jYWwpJyBkZWNsYXJhdGlvbiBzcGVjaWZpZXJ9fQorICBfX3RocmVhZCBhdXRvIGludCB0MTJhOyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e2Nhbm5vdCBjb21iaW5lIHdpdGggcHJldmlvdXMgJ3t7X190aHJlYWR8X1RocmVhZF9sb2NhbH19JyBkZWNsYXJhdGlvbiBzcGVjaWZpZXJ9fQogICBhdXRvIF9fdGhyZWFkIGludCB0MTJiOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBjb21iaW5lIHdpdGggcHJldmlvdXMgJ2F1dG8nIGRlY2xhcmF0aW9uIHNwZWNpZmllcn19CiAjZWxpZiAhZGVmaW5lZChDWFgxMSkKLSAgX190aHJlYWQgYXV0byB0MTJhID0gMDsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3snX1RocmVhZF9sb2NhbCcgdmFyaWFibGVzIG11c3QgaGF2ZSBnbG9iYWwgc3RvcmFnZX19Ci0gIGF1dG8gX190aHJlYWQgdDEyYiA9IDA7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7J19UaHJlYWRfbG9jYWwnIHZhcmlhYmxlcyBtdXN0IGhhdmUgZ2xvYmFsIHN0b3JhZ2V9fQorICBfX3RocmVhZCBhdXRvIHQxMmEgPSAwOyAvLyBleHBlY3RlZC1lcnJvciB7eydfVGhyZWFkX2xvY2FsJyB2YXJpYWJsZXMgbXVzdCBoYXZlIGdsb2JhbCBzdG9yYWdlfX0KKyAgYXV0byBfX3RocmVhZCB0MTJiID0gMDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snX1RocmVhZF9sb2NhbCcgdmFyaWFibGVzIG11c3QgaGF2ZSBnbG9iYWwgc3RvcmFnZX19CiAjZW5kaWYKLSAgX190aHJlYWQgcmVnaXN0ZXIgaW50IHQxM2E7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7Y2Fubm90IGNvbWJpbmUgd2l0aCBwcmV2aW91cyAnKF9fdGhyZWFkfF9UaHJlYWRfbG9jYWx8dGhyZWFkX2xvY2FsKScgZGVjbGFyYXRpb24gc3BlY2lmaWVyfX0KKyAgX190aHJlYWQgcmVnaXN0ZXIgaW50IHQxM2E7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7Y2Fubm90IGNvbWJpbmUgd2l0aCBwcmV2aW91cyAne3tfX3RocmVhZHxfVGhyZWFkX2xvY2FsfHRocmVhZF9sb2NhbH19JyBkZWNsYXJhdGlvbiBzcGVjaWZpZXJ9fQogICByZWdpc3RlciBfX3RocmVhZCBpbnQgdDEzYjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW5ub3QgY29tYmluZSB3aXRoIHByZXZpb3VzICdyZWdpc3RlcicgZGVjbGFyYXRpb24gc3BlY2lmaWVyfX0KIH0KIAotX190aHJlYWQgdHlwZWRlZiBpbnQgdDE0OyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e2Nhbm5vdCBjb21iaW5lIHdpdGggcHJldmlvdXMgJyhfX3RocmVhZHxfVGhyZWFkX2xvY2FsfHRocmVhZF9sb2NhbCknIGRlY2xhcmF0aW9uIHNwZWNpZmllcn19CitfX3RocmVhZCB0eXBlZGVmIGludCB0MTQ7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7Y2Fubm90IGNvbWJpbmUgd2l0aCBwcmV2aW91cyAne3tfX3RocmVhZHxfVGhyZWFkX2xvY2FsfHRocmVhZF9sb2NhbH19JyBkZWNsYXJhdGlvbiBzcGVjaWZpZXJ9fQogX190aHJlYWQgaW50IHQxNTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fQogZXh0ZXJuIGludCB0MTU7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm9uLXRocmVhZC1sb2NhbCBkZWNsYXJhdGlvbiBvZiAndDE1JyBmb2xsb3dzIHRocmVhZC1sb2NhbCBkZWNsYXJhdGlvbn19CiBleHRlcm4gaW50IHQxNjsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL3RyYW5zcGFyZW50LXVuaW9uLmMgYi90ZXN0L1NlbWEvdHJhbnNwYXJlbnQtdW5pb24uYwppbmRleCBhYjFiYTE4Li5lZmY3ZGY2IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvdHJhbnNwYXJlbnQtdW5pb24uYworKysgYi90ZXN0L1NlbWEvdHJhbnNwYXJlbnQtdW5pb24uYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nIC1mc3ludGF4LW9ubHkgLVhjbGFuZyAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCiB0eXBlZGVmIHVuaW9uIHsKICAgaW50ICppcDsKICAgZmxvYXQgKmZwOwpAQCAtNzAsNCArNzAsMjIgQEAKICAgaW50NCB2ZWM7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2ZpcnN0IGZpZWxkIG9mIGEgdHJhbnNwYXJlbnQgdW5pb24gY2Fubm90IGhhdmUgdmVjdG9yIHR5cGUgJ2ludDQnOyB0cmFuc3BhcmVudF91bmlvbiBhdHRyaWJ1dGUgaWdub3JlZH19CiB9IFRVNSBfX2F0dHJpYnV0ZV9fKCh0cmFuc3BhcmVudF91bmlvbikpOwogCi0gIAordW5pb24gcHIxNTEzNCB7CisgIHVuc2lnbmVkIGludCB1OworICBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBleHBvOjI7CisgICAgdW5zaWduZWQgaW50IG1hbnQ6MzA7CisgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisgIC8vIFRoZSBwYWNrZWQgYXR0cmlidXRlIGlzIGFjY2VwdGFibGUgYmVjYXVzZSBpdCBkZWZpbmVzIGEgbGVzcyBzdHJpY3QKKyAgLy8gYWxpZ25tZW50IHRoYW4gcmVxdWlyZWQgYnkgdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSB0cmFuc3BhcmVudCB1bmlvbi4KK30gX19hdHRyaWJ1dGVfXygodHJhbnNwYXJlbnRfdW5pb24pKTsKKwordW5pb24gcHIxNTEzNHYyIHsKKyAgc3RydWN0IHsgLy8gZXhwZWN0ZWQtbm90ZSB7e2FsaWdubWVudCBvZiBmaXJzdCBmaWVsZCBpcyAzMiBiaXRzfX0KKyAgICB1bnNpZ25lZCBpbnQgdTE7CisgICAgdW5zaWduZWQgaW50IHUyOworICB9OworICBzdHJ1Y3QgeyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2FsaWdubWVudCBvZiBmaWVsZCAnJyAoNjQgYml0cykgZG9lcyBub3QgbWF0Y2ggdGhlIGFsaWdubWVudCBvZiB0aGUgZmlyc3QgZmllbGQgaW4gdHJhbnNwYXJlbnQgdW5pb247IHRyYW5zcGFyZW50X3VuaW9uIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKyAgICB1bnNpZ25lZCBpbnQgdTM7CisgIH0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfSBfX2F0dHJpYnV0ZV9fKCh0cmFuc3BhcmVudF91bmlvbikpOwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL3R5cGVvZi11c2UtZGVwcmVjYXRlZC5jIGIvdGVzdC9TZW1hL3R5cGVvZi11c2UtZGVwcmVjYXRlZC5jCmluZGV4IDE1MThjODMuLmJhNzJiMTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS90eXBlb2YtdXNlLWRlcHJlY2F0ZWQuYworKysgYi90ZXN0L1NlbWEvdHlwZW9mLXVzZS1kZXByZWNhdGVkLmMKQEAgLTEsMjUgKzEsMjUgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAlcyAtdmVyaWZ5IC1mc3ludGF4LW9ubHkKIAotc3RydWN0IHMgeyBpbnQgYTsgfSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkgeDsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3sncycgaXMgZGVwcmVjYXRlZH19IGV4cGVjdGVkLW5vdGUgMiB7eydzJyBkZWNsYXJlZCBoZXJlfX0KK3N0cnVjdCBzIHsgaW50IGE7IH0gX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpIHg7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3MnIGlzIGRlcHJlY2F0ZWR9fSBleHBlY3RlZC1ub3RlIDIge3sncycgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIAogdHlwZW9mKHgpIHk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3MnIGlzIGRlcHJlY2F0ZWR9fQogCi11bmlvbiB1bnsgaW50IGE7IH0gX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpIHU7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3VuJyBpcyBkZXByZWNhdGVkfX0gZXhwZWN0ZWQtbm90ZSAyIHt7J3VuJyBkZWNsYXJlZCBoZXJlfX0KK3VuaW9uIHVueyBpbnQgYTsgfSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkgdTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3sndW4nIGlzIGRlcHJlY2F0ZWR9fSBleHBlY3RlZC1ub3RlIDIge3sndW4nIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAKIHR5cGVvZiggICAgIHUpIHo7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sndW4nIGlzIGRlcHJlY2F0ZWR9fQogCi1lbnVtIEV7IG9uZX0gX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpICBlOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0UnIGlzIGRlcHJlY2F0ZWR9fSBleHBlY3RlZC1ub3RlIDIge3snRScgZGVjbGFyZWQgaGVyZX19CitlbnVtIEV7IG9uZX0gX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpICBlOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0UnIGlzIGRlcHJlY2F0ZWR9fSBleHBlY3RlZC1ub3RlIDIge3snRScgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIAogdHlwZW9mKCBlKSB3OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0UnIGlzIGRlcHJlY2F0ZWR9fQogCi1zdHJ1Y3QgZm9vIHsgaW50IHg7IH0gX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J2ZvbycgZGVjbGFyZWQgaGVyZX19Ci10eXBlZGVmIHN0cnVjdCBmb28gYmFyIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydiYXInIGRlY2xhcmVkIGhlcmV9fQorc3RydWN0IGZvbyB7IGludCB4OyB9IF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydmb28nIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19Cit0eXBlZGVmIHN0cnVjdCBmb28gYmFyIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydiYXInIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiBiYXIgeDE7CS8vIGV4cGVjdGVkLXdhcm5pbmcge3snYmFyJyBpcyBkZXByZWNhdGVkfX0KIAogaW50IG1haW4oKSB7IHR5cGVvZih4MSkgeTsgfQkvLyBleHBlY3RlZC13YXJuaW5nIHt7J2ZvbycgaXMgZGVwcmVjYXRlZH19CiAKIHN0cnVjdCBnb3JmIHsgaW50IHg7IH07Ci10eXBlZGVmIHN0cnVjdCBnb3JmIFQgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAgLy8gZXhwZWN0ZWQtbm90ZSB7eydUJyBkZWNsYXJlZCBoZXJlfX0KK3R5cGVkZWYgc3RydWN0IGdvcmYgVCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7ICAvLyBleHBlY3RlZC1ub3RlIHt7J1QnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiBUIHQ7CS8vIGV4cGVjdGVkLXdhcm5pbmcge3snVCcgaXMgZGVwcmVjYXRlZH19CiB2b2lkIHdlZSgpIHsgdHlwZW9mKHQpIHk7IH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL3R5cGVzLmMgYi90ZXN0L1NlbWEvdHlwZXMuYwppbmRleCBkYWMwYmZlLi4zMzk3ODhlIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvdHlwZXMuYworKysgYi90ZXN0L1NlbWEvdHlwZXMuYwpAQCAtNTMsNyArNTMsNyBAQAogaW50IF9fYXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoOCksIHZlY3Rvcl9zaXplICg4KSkpIHY7ICAvLyBleHBlY3RlZC1lcnJvciB7e2ludmFsaWQgdmVjdG9yIGVsZW1lbnQgdHlwZX19CiAKIHZvaWQgdGVzdChpbnQgaSkgewotICBjaGFyIGMgPSAoY2hhciBfX2F0dHJpYnV0ZV9fKChhbGlnbig4KSkpKSBpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2FsaWduJyBhdHRyaWJ1dGUgaWdub3JlZCB3aGVuIHBhcnNpbmcgdHlwZX19CisgIGNoYXIgYyA9IChjaGFyIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKSkgaTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydhbGlnbmVkJyBhdHRyaWJ1dGUgaWdub3JlZCB3aGVuIHBhcnNpbmcgdHlwZX19CiB9CiAKIC8vIGh0dHA6Ly9sbHZtLm9yZy9QUjExMDgyCkBAIC03MiwzICs3Miw0IEBACiAvLyBubyBzdXBwb3J0IGZvciB2ZWN0b3IgZW51bSB0eXBlCiBlbnVtIHsgZV8yIH0geDMgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoNjQpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW52YWxpZCB2ZWN0b3IgZWxlbWVudCB0eXBlfX0KIAoraW50IHg0IF9fYXR0cmlidXRlX18oKGV4dF92ZWN0b3JfdHlwZSg2NCkpKTsgIC8vIGV4cGVjdGVkLWVycm9yIHt7J2V4dF92ZWN0b3JfdHlwZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB0eXBlc319CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvdW51c2VkLWV4cHIuYyBiL3Rlc3QvU2VtYS91bnVzZWQtZXhwci5jCmluZGV4IGVhMDg2MzEuLjQzZDgxNTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS91bnVzZWQtZXhwci5jCisrKyBiL3Rlc3QvU2VtYS91bnVzZWQtZXhwci5jCkBAIC03LDExICs3LDExIEBACiB2b2lkIGJhcih2b2xhdGlsZSBpbnQgKlZQLCBpbnQgKlAsIGludCBBLAogICAgICAgICAgX0NvbXBsZXggZG91YmxlIEMsIHZvbGF0aWxlIF9Db21wbGV4IGRvdWJsZSBWQykgewogICAKLSAgVlAgPCBQOyAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4cHJlc3Npb24gcmVzdWx0IHVudXNlZH19CisgIFZQIDwgUDsgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxhdGlvbmFsIGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZH19CiAgICh2b2lkKUE7CiAgICh2b2lkKWZvbygxLDIpOyAgICAgIC8vIG5vIHdhcm5pbmcuCiAgIAotICBBIDwgZm9vKDEsIDIpOyAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwcmVzc2lvbiByZXN1bHQgdW51c2VkfX0KKyAgQSA8IGZvbygxLCAyKTsgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlbGF0aW9uYWwgY29tcGFyaXNvbiByZXN1bHQgdW51c2VkfX0KIAogICBmb28oMSwyKStmb28oNCwzKTsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwcmVzc2lvbiByZXN1bHQgdW51c2VkfX0KIApAQCAtNTQsMjMgKzU0LDIzIEBACiAgIGludCBiID0gMDsKIAogICBpZiAoYSkKLSAgICBiIDwgMTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXhwcmVzc2lvbiByZXN1bHQgdW51c2VkfX0KKyAgICBiIDwgMTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7cmVsYXRpb25hbCBjb21wYXJpc29uIHJlc3VsdCB1bnVzZWR9fQogICBlbHNlCi0gICAgYiA8IDI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4cHJlc3Npb24gcmVzdWx0IHVudXNlZH19CisgICAgYiA8IDI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e3JlbGF0aW9uYWwgY29tcGFyaXNvbiByZXN1bHQgdW51c2VkfX0KICAgICAKICAgd2hpbGUgKDEpCi0gICAgYiA8IDM7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4cHJlc3Npb24gcmVzdWx0IHVudXNlZH19CisgICAgYiA8IDM7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e3JlbGF0aW9uYWwgY29tcGFyaXNvbiByZXN1bHQgdW51c2VkfX0KIAogICBkbwotICAgIGIgPCA0OyAvLyBleHBlY3RlZC13YXJuaW5ne3tleHByZXNzaW9uIHJlc3VsdCB1bnVzZWR9fQorICAgIGIgPCA0OyAvLyBleHBlY3RlZC13YXJuaW5ne3tyZWxhdGlvbmFsIGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZH19CiAgIHdoaWxlICgxKTsKICAgCiAgIGZvciAoOzspCi0gICAgYiA8IDU7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4cHJlc3Npb24gcmVzdWx0IHVudXNlZH19CisgICAgYiA8IDU7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e3JlbGF0aW9uYWwgY29tcGFyaXNvbiByZXN1bHQgdW51c2VkfX0KICAgICAKLSAgZm9yIChiIDwgMTs7KSB7fSAvLyBleHBlY3RlZC13YXJuaW5ne3tleHByZXNzaW9uIHJlc3VsdCB1bnVzZWR9fQorICBmb3IgKGIgPCAxOzspIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7e3JlbGF0aW9uYWwgY29tcGFyaXNvbiByZXN1bHQgdW51c2VkfX0KICAgZm9yICg7YiA8IDE7KSB7fQotICBmb3IgKDs7YiA8IDEpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4cHJlc3Npb24gcmVzdWx0IHVudXNlZH19CisgIGZvciAoOztiIDwgMSkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7cmVsYXRpb25hbCBjb21wYXJpc29uIHJlc3VsdCB1bnVzZWR9fQogfQogCiAvLyByZGFyOi8vNzE4NjExOQpAQCAtOTEsNyArOTEsNyBAQAogICBmbjEoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZ25vcmluZyByZXR1cm4gdmFsdWUgb2YgZnVuY3Rpb24gZGVjbGFyZWQgd2l0aCB3YXJuX3VudXNlZF9yZXN1bHQgYXR0cmlidXRlfX0KICAgZm4yKDkyLCAyMSk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7aWdub3JpbmcgcmV0dXJuIHZhbHVlIG9mIGZ1bmN0aW9uIGRlY2xhcmVkIHdpdGggcHVyZSBhdHRyaWJ1dGV9fQogICBmbjMoNDIpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lnbm9yaW5nIHJldHVybiB2YWx1ZSBvZiBmdW5jdGlvbiBkZWNsYXJlZCB3aXRoIGNvbnN0IGF0dHJpYnV0ZX19Ci0gIF9fYnVpbHRpbl9mYWJzZigwKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lnbm9yaW5nIHJldHVybiB2YWx1ZSBvZiBmdW5jdGlvbiBkZWNsYXJlZCB3aXRoIGNvbnN0IGF0dHJpYnV0ZX19CisgIF9fYnVpbHRpbl9hYnMoMCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZ25vcmluZyByZXR1cm4gdmFsdWUgb2YgZnVuY3Rpb24gZGVjbGFyZWQgd2l0aCBjb25zdCBhdHRyaWJ1dGV9fQogICAodm9pZCkwLCBmbjEoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZ25vcmluZyByZXR1cm4gdmFsdWUgb2YgZnVuY3Rpb24gZGVjbGFyZWQgd2l0aCB3YXJuX3VudXNlZF9yZXN1bHQgYXR0cmlidXRlfX0KICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvdmFyaWFkaWMtcHJvbW90aW9uLmMgYi90ZXN0L1NlbWEvdmFyaWFkaWMtcHJvbW90aW9uLmMKaW5kZXggYjI0ODc3NC4uMDFkOGU5MyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hL3ZhcmlhZGljLXByb21vdGlvbi5jCisrKyBiL3Rlc3QvU2VtYS92YXJpYWRpYy1wcm9tb3Rpb24uYwpAQCAtNiw3ICs2LDcgQEAKICAgdmFyaWFkaWMoMywgKmYxNiwgZjMyLCBmNjQpOwogCiAvLyBDSEVDSzogSW1wbGljaXRDYXN0RXhwciB7ey4qfX0gJ2RvdWJsZScgPEZsb2F0aW5nQ2FzdD4KLS8vIENIRUNLLU5FWFQ6ICdoYWxmJworLy8gQ0hFQ0stTkVYVDogJ19fZnAxNicKIAogLy8gQ0hFQ0s6IEltcGxpY2l0Q2FzdEV4cHIge3suKn19ICdkb3VibGUnIDxGbG9hdGluZ0Nhc3Q+CiAvLyBDSEVDSy1ORVhUOiAnZmxvYXQnCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvdmVjdG9yLWNhc3QuYyBiL3Rlc3QvU2VtYS92ZWN0b3ItY2FzdC5jCmluZGV4IDdmYTZlODYuLmJmYzczMWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS92ZWN0b3ItY2FzdC5jCisrKyBiL3Rlc3QvU2VtYS92ZWN0b3ItY2FzdC5jCkBAIC0zNiwzICszNiwyMSBAQAogICBmMihZKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbmNvbXBhdGlibGUgdmVjdG9yIHR5cGVzIHBhc3NpbmcgJ3QzJyB0byBwYXJhbWV0ZXIgb2YgdHlwZSAndDInfX0KIH0KIAordHlwZWRlZiBmbG9hdCBmbG9hdDIgX19hdHRyaWJ1dGVfXyAoKHZlY3Rvcl9zaXplICg4KSkpOworCit2b2lkIGY0KCkgeworICBmbG9hdDIgZjI7CisgIGRvdWJsZSBkOworICBmMiArPSBkOworICBkICs9IGYyOworfQorCisvLyByZGFyOi8vMTU5MzE0MjYKKy8vIERvbid0IHBlcm1pdCBhIGxheCBjb252ZXJzaW9uIHRvIGFuZCBmcm9tIGEgcG9pbnRlciB0eXBlLgordHlwZWRlZiBzaG9ydCBzaG9ydF9zaXplb2ZfcG9pbnRlciBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZShzaXplb2Yodm9pZCopKSkpOwordm9pZCBmNSgpIHsKKyAgc2hvcnRfc2l6ZW9mX3BvaW50ZXIgdjsKKyAgdm9pZCAqcHRyOworICB2ID0gcHRyOyAvLyBleHBlY3RlZC1lcnJvciB7e2Fzc2lnbmluZyB0byAnc2hvcnRfc2l6ZW9mX3BvaW50ZXInIGZyb20gaW5jb21wYXRpYmxlIHR5cGUgJ3ZvaWQgKid9fQorICBwdHIgPSB2OyAvLyBleHBlY3RlZC1lcnJvciB7e2Fzc2lnbmluZyB0byAndm9pZCAqJyBmcm9tIGluY29tcGF0aWJsZSB0eXBlICdzaG9ydF9zaXplb2ZfcG9pbnRlcid9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL3ZsYS5jIGIvdGVzdC9TZW1hL3ZsYS5jCmluZGV4IDRmZDYzNjEuLmUwM2RkYTggMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS92bGEuYworKysgYi90ZXN0L1NlbWEvdmxhLmMKQEAgLTE5LDcgKzE5LDcgQEAKIC8vIFBSMjM1Mgogdm9pZCBmMih1bnNpZ25lZCBpbnQgbSkKIHsKLSAgZXh0ZXJuIGludCBlMVsyXVttXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2YXJpYWJsZSBsZW5ndGggYXJyYXkgZGVjbGFyYXRpb24gY2FuIG5vdCBoYXZlICdleHRlcm4nIGxpbmthZ2V9fQorICBleHRlcm4gaW50IGUxWzJdW21dOyAvLyBleHBlY3RlZC1lcnJvciB7e3ZhcmlhYmxlIGxlbmd0aCBhcnJheSBkZWNsYXJhdGlvbiBjYW5ub3QgaGF2ZSAnZXh0ZXJuJyBsaW5rYWdlfX0KIAogICBlMVswXVswXSA9IDA7CiAgIApAQCAtMzQsMTAgKzM0LDEwIEBACiAKIHZvaWQgZjMoKQogewotICBzdGF0aWMgaW50IGFbaV07IC8vIGV4cGVjdGVkLWVycm9yIHt7dmFyaWFibGUgbGVuZ3RoIGFycmF5IGRlY2xhcmF0aW9uIGNhbiBub3QgaGF2ZSAnc3RhdGljJyBzdG9yYWdlIGR1cmF0aW9ufX0KLSAgZXh0ZXJuIGludCBiW2ldOyAvLyBleHBlY3RlZC1lcnJvciB7e3ZhcmlhYmxlIGxlbmd0aCBhcnJheSBkZWNsYXJhdGlvbiBjYW4gbm90IGhhdmUgJ2V4dGVybicgbGlua2FnZX19CisgIHN0YXRpYyBpbnQgYVtpXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2YXJpYWJsZSBsZW5ndGggYXJyYXkgZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgJ3N0YXRpYycgc3RvcmFnZSBkdXJhdGlvbn19CisgIGV4dGVybiBpbnQgYltpXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2YXJpYWJsZSBsZW5ndGggYXJyYXkgZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgJ2V4dGVybicgbGlua2FnZX19CiAKLSAgZXh0ZXJuIGludCAoKmMxKVtpXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2YXJpYWJseSBtb2RpZmllZCB0eXBlIGRlY2xhcmF0aW9uIGNhbiBub3QgaGF2ZSAnZXh0ZXJuJyBsaW5rYWdlfX0KKyAgZXh0ZXJuIGludCAoKmMxKVtpXTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2YXJpYWJseSBtb2RpZmllZCB0eXBlIGRlY2xhcmF0aW9uIGNhbm5vdCBoYXZlICdleHRlcm4nIGxpbmthZ2V9fQogICBzdGF0aWMgaW50ICgqZClbaV07CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS93YXJuLWFic29sdXRlLXZhbHVlLWhlYWRlci5jIGIvdGVzdC9TZW1hL3dhcm4tYWJzb2x1dGUtdmFsdWUtaGVhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiZjllZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYS93YXJuLWFic29sdXRlLXZhbHVlLWhlYWRlci5jCkBAIC0wLDAgKzEsMzYgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtcGMtbGludXgtZ251IC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAtV2Fic29sdXRlLXZhbHVlCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXBjLWxpbnV4LWdudSAtZnN5bnRheC1vbmx5ICVzIC1XYWJzb2x1dGUtdmFsdWUgLWZkaWFnbm9zdGljcy1wYXJzZWFibGUtZml4aXRzIDI+JjEgfCBGaWxlQ2hlY2sgJXMKKworaW50IGFicyhpbnQpOworCisvLyBXcm9uZyBzaWduYXR1cmUKK2ludCBmYWJzZihpbnQpOworLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7aW5jb21wYXRpYmxlIHJlZGVjbGFyYXRpb24gb2YgbGlicmFyeSBmdW5jdGlvbiAnZmFic2YnfX0KKy8vIGV4cGVjdGVkLW5vdGVALTJ7eydmYWJzZicgaXMgYSBidWlsdGluIHdpdGggdHlwZSAnZmxvYXQgKGZsb2F0KSd9fQorCit2b2lkIHRlc3RfaW50KGludCBpLCB1bnNpZ25lZCB1LCBsb25nIGxvbmcgbGwsIGZsb2F0IGYsIGRvdWJsZSBkKSB7CisgICh2b2lkKWFicyhpKTsKKworICAvLyBSZW1vdmUgYWJzIGNhbGwKKyAgKHZvaWQpYWJzKHUpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGludCcgaGFzIG5vIGVmZmVjdH19CisgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3JlbW92ZSB0aGUgY2FsbCB0byAnYWJzJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxMn06IiIKKworICBpbnQgbGxhYnM7CisgICh2b2lkKWxsYWJzOworICAvLyBDb25mbGljdCBpbiBuYW1lcywgbm8gbm90ZXMKKyAgKHZvaWQpYWJzKGxsKTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7YWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2FicycgZ2l2ZW4gYW4gYXJndW1lbnQgb2YgdHlwZSAnbG9uZyBsb25nJyBidXQgaGFzIHBhcmFtZXRlciBvZiB0eXBlICdpbnQnIHdoaWNoIG1heSBjYXVzZSB0cnVuY2F0aW9uIG9mIHZhbHVlfX0KKworICAvLyBDb25mbGljdCBpbiBuYW1lcywgbm8gbm90ZXMKKyAgKHZvaWQpYWJzKGYpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisKKyAgLy8gU3VnZ2VzdCBoZWFkZXIuCisgICh2b2lkKWFicyhkKTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7dXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0ye3t1c2UgZnVuY3Rpb24gJ2ZhYnMnIGluc3RlYWR9fQorICAvLyBleHBlY3RlZC1ub3RlQC0ze3twbGVhc2UgaW5jbHVkZSB0aGUgaGVhZGVyIDxtYXRoLmg+IG9yIGV4cGxpY2l0bHkgcHJvdmlkZSBhIGRlY2xhcmF0aW9uIGZvciAnZmFicyd9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTRdXTo5LVtbQExJTkUtNF1dOjEyfToiZmFicyIKK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS93YXJuLWFic29sdXRlLXZhbHVlLmMgYi90ZXN0L1NlbWEvd2Fybi1hYnNvbHV0ZS12YWx1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjAxZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWEvd2Fybi1hYnNvbHV0ZS12YWx1ZS5jCkBAIC0wLDAgKzEsNzgyIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXBjLWxpbnV4LWdudSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLVdhYnNvbHV0ZS12YWx1ZQorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1wYy1saW51eC1nbnUgLWZzeW50YXgtb25seSAlcyAtV2Fic29sdXRlLXZhbHVlIC1mZGlhZ25vc3RpY3MtcGFyc2VhYmxlLWZpeGl0cyAyPiYxIHwgRmlsZUNoZWNrICVzCisKK2ludCBhYnMoaW50KTsKK2xvbmcgaW50IGxhYnMobG9uZyBpbnQpOworbG9uZyBsb25nIGludCBsbGFicyhsb25nIGxvbmcgaW50KTsKKworZmxvYXQgZmFic2YoZmxvYXQpOworZG91YmxlIGZhYnMoZG91YmxlKTsKK2xvbmcgZG91YmxlIGZhYnNsKGxvbmcgZG91YmxlKTsKKworZmxvYXQgY2Fic2YoZmxvYXQgX0NvbXBsZXgpOworZG91YmxlIGNhYnMoZG91YmxlIF9Db21wbGV4KTsKK2xvbmcgZG91YmxlIGNhYnNsKGxvbmcgZG91YmxlIF9Db21wbGV4KTsKKwordm9pZCB0ZXN0X2ludChpbnQgeCkgeworICAodm9pZClhYnMoeCk7CisgICh2b2lkKWxhYnMoeCk7CisgICh2b2lkKWxsYWJzKHgpOworCisgICh2b2lkKWZhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2ZhYnNmJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGludGVnZXIgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2FicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiJhYnMiCisgICh2b2lkKWZhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnZmFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEzfToiYWJzIgorICAodm9pZClmYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGZsb2F0aW5nIHBvaW50IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdmYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToiYWJzIgorCisgICh2b2lkKWNhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgY29tcGxleCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnY2Fic2YnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImFicyIKKyAgKHZvaWQpY2Ficyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2NhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxM306ImFicyIKKyAgKHZvaWQpY2Fic2woeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdjYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToiYWJzIgorCisgICh2b2lkKV9fYnVpbHRpbl9hYnMoeCk7CisgICh2b2lkKV9fYnVpbHRpbl9sYWJzKHgpOworICAodm9pZClfX2J1aWx0aW5fbGxhYnMoeCk7CisKKyAgKHZvaWQpX19idWlsdGluX2ZhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzZicgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06Il9fYnVpbHRpbl9hYnMiCisgICh2b2lkKV9fYnVpbHRpbl9mYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGludGVnZXIgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9hYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjIzfToiX19idWlsdGluX2FicyIKKyAgKHZvaWQpX19idWlsdGluX2ZhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06Il9fYnVpbHRpbl9hYnMiCisKKyAgKHZvaWQpX19idWlsdGluX2NhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgY29tcGxleCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnNmJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGludGVnZXIgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9hYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2FicyIKKyAgKHZvaWQpX19idWlsdGluX2NhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fY2Ficycgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306Il9fYnVpbHRpbl9hYnMiCisgICh2b2lkKV9fYnVpbHRpbl9jYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06Il9fYnVpbHRpbl9hYnMiCit9CisKK3ZvaWQgdGVzdF9sb25nKGxvbmcgeCkgeworICAodm9pZClhYnMoeCk7ICAvLyBubyB3YXJuaW5nIC0gaW50IGFuZCBsb25nIGFyZSBzYW1lIGxlbmd0aCBmb3IgdGhpcyB0YXJnZXQKKyAgKHZvaWQpbGFicyh4KTsKKyAgKHZvaWQpbGxhYnMoeCk7CisKKyAgKHZvaWQpZmFic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnZmFic2YnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnbGFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiJsYWJzIgorICAodm9pZClmYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2ZhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnbGFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTN9OiJsYWJzIgorICAodm9pZClmYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGZsb2F0aW5nIHBvaW50IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdmYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdsYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImxhYnMiCisKKyAgKHZvaWQpY2Fic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdjYWJzZicgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdsYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImxhYnMiCisgICh2b2lkKWNhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdjYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGludGVnZXIgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2xhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEzfToibGFicyIKKyAgKHZvaWQpY2Fic2woeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdjYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdsYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImxhYnMiCisKKyAgKHZvaWQpX19idWlsdGluX2Ficyh4KTsgIC8vIG5vIHdhcm5pbmcgLSBpbnQgYW5kIGxvbmcgYXJlIHNhbWUgbGVuZ3RoIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB0YXJnZXQKKyAgKHZvaWQpX19idWlsdGluX2xhYnMoeCk7CisgICh2b2lkKV9fYnVpbHRpbl9sbGFicyh4KTsKKworICAodm9pZClfX2J1aWx0aW5fZmFic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnNmJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGludGVnZXIgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9sYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06Il9fYnVpbHRpbl9sYWJzIgorICAodm9pZClfX2J1aWx0aW5fZmFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGZsb2F0aW5nIHBvaW50IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjN9OiJfX2J1aWx0aW5fbGFicyIKKyAgKHZvaWQpX19idWlsdGluX2ZhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiJfX2J1aWx0aW5fbGFicyIKKworICAodm9pZClfX2J1aWx0aW5fY2Fic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fY2Fic2YnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2xhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2xhYnMiCisgICh2b2lkKV9fYnVpbHRpbl9jYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgY29tcGxleCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2xhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjIzfToiX19idWlsdGluX2xhYnMiCisgICh2b2lkKV9fYnVpbHRpbl9jYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiJfX2J1aWx0aW5fbGFicyIKK30KKwordm9pZCB0ZXN0X2xvbmdfbG9uZyhsb25nIGxvbmcgeCkgeworICAodm9pZClhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2Fic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdhYnMnIGdpdmVuIGFuIGFyZ3VtZW50IG9mIHR5cGUgJ2xvbmcgbG9uZycgYnV0IGhhcyBwYXJhbWV0ZXIgb2YgdHlwZSAnaW50JyB3aGljaCBtYXkgY2F1c2UgdHJ1bmNhdGlvbiBvZiB2YWx1ZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3VzZSBmdW5jdGlvbiAnbGxhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEyfToibGxhYnMiCisgICh2b2lkKWxhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2Fic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdsYWJzJyBnaXZlbiBhbiBhcmd1bWVudCBvZiB0eXBlICdsb25nIGxvbmcnIGJ1dCBoYXMgcGFyYW1ldGVyIG9mIHR5cGUgJ2xvbmcnIHdoaWNoIG1heSBjYXVzZSB0cnVuY2F0aW9uIG9mIHZhbHVlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMnt7dXNlIGZ1bmN0aW9uICdsbGFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTN9OiJsbGFicyIKKyAgKHZvaWQpbGxhYnMoeCk7CisKKyAgKHZvaWQpZmFic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnZmFic2YnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnbGxhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToibGxhYnMiCisgICh2b2lkKWZhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnZmFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdsbGFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTN9OiJsbGFicyIKKyAgKHZvaWQpZmFic2woeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnZmFic2wnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnbGxhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToibGxhYnMiCisKKyAgKHZvaWQpY2Fic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdjYWJzZicgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdsbGFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiJsbGFicyIKKyAgKHZvaWQpY2Ficyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2NhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnbGxhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEzfToibGxhYnMiCisgICh2b2lkKWNhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgY29tcGxleCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnY2Fic2wnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnbGxhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToibGxhYnMiCisKKyAgKHZvaWQpX19idWlsdGluX2Ficyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7YWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9hYnMnIGdpdmVuIGFuIGFyZ3VtZW50IG9mIHR5cGUgJ2xvbmcgbG9uZycgYnV0IGhhcyBwYXJhbWV0ZXIgb2YgdHlwZSAnaW50JyB3aGljaCBtYXkgY2F1c2UgdHJ1bmNhdGlvbiBvZiB2YWx1ZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2xsYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyMn06Il9fYnVpbHRpbl9sbGFicyIKKyAgKHZvaWQpX19idWlsdGluX2xhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2Fic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGFicycgZ2l2ZW4gYW4gYXJndW1lbnQgb2YgdHlwZSAnbG9uZyBsb25nJyBidXQgaGFzIHBhcmFtZXRlciBvZiB0eXBlICdsb25nJyB3aGljaCBtYXkgY2F1c2UgdHJ1bmNhdGlvbiBvZiB2YWx1ZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2xsYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306Il9fYnVpbHRpbl9sbGFicyIKKyAgKHZvaWQpX19idWlsdGluX2xsYWJzKHgpOworCisgICh2b2lkKV9fYnVpbHRpbl9mYWJzZih4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGZsb2F0aW5nIHBvaW50IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFic2YnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2xsYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06Il9fYnVpbHRpbl9sbGFicyIKKyAgKHZvaWQpX19idWlsdGluX2ZhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgaW50ZWdlciB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2xsYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306Il9fYnVpbHRpbl9sbGFicyIKKyAgKHZvaWQpX19idWlsdGluX2ZhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGxhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2xsYWJzIgorCisgICh2b2lkKV9fYnVpbHRpbl9jYWJzZih4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzZicgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGxhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2xsYWJzIgorICAodm9pZClfX2J1aWx0aW5fY2Ficyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGludGVnZXIgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9sbGFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjN9OiJfX2J1aWx0aW5fbGxhYnMiCisgICh2b2lkKV9fYnVpbHRpbl9jYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBpbnRlZ2VyIHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGxhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2xsYWJzIgorfQorCit2b2lkIHRlc3RfZmxvYXQoZmxvYXQgeCkgeworICAodm9pZClhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2ZhYnNmJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxMn06ImZhYnNmIgorICAodm9pZClsYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnbGFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnZmFic2YnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEzfToiZmFic2YiCisgICh2b2lkKWxsYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnbGxhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2ZhYnNmJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImZhYnNmIgorCisgICh2b2lkKWZhYnNmKHgpOworICAodm9pZClmYWJzKHgpOworICAodm9pZClmYWJzbCh4KTsKKworICAodm9pZCljYWJzZih4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2NhYnNmJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdmYWJzZicgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiJmYWJzZiIKKyAgKHZvaWQpY2Ficyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2NhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2ZhYnNmJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxM306ImZhYnNmIgorICAodm9pZCljYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2NhYnNsJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdmYWJzZicgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiJmYWJzZiIKKworICAodm9pZClfX2J1aWx0aW5fYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2Ficycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnNmJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyMn06Il9fYnVpbHRpbl9mYWJzZiIKKyAgKHZvaWQpX19idWlsdGluX2xhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnNmJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306Il9fYnVpbHRpbl9mYWJzZiIKKyAgKHZvaWQpX19idWlsdGluX2xsYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2xsYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFic2YnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2ZhYnNmIgorCisgICh2b2lkKV9fYnVpbHRpbl9mYWJzZih4KTsKKyAgKHZvaWQpX19idWlsdGluX2ZhYnMoeCk7CisgICh2b2lkKV9fYnVpbHRpbl9mYWJzbCh4KTsKKworICAodm9pZClfX2J1aWx0aW5fY2Fic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fY2Fic2YnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzZicgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiJfX2J1aWx0aW5fZmFic2YiCisgICh2b2lkKV9fYnVpbHRpbl9jYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgY29tcGxleCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzZicgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjN9OiJfX2J1aWx0aW5fZmFic2YiCisgICh2b2lkKV9fYnVpbHRpbl9jYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnNmJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06Il9fYnVpbHRpbl9mYWJzZiIKK30KKwordm9pZCB0ZXN0X2RvdWJsZShkb3VibGUgeCkgeworICAodm9pZClhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2ZhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEyfToiZmFicyIKKyAgKHZvaWQpbGFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2xhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2ZhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEzfToiZmFicyIKKyAgKHZvaWQpbGxhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdsbGFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnZmFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiJmYWJzIgorCisgICh2b2lkKWZhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3thYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnZmFic2YnIGdpdmVuIGFuIGFyZ3VtZW50IG9mIHR5cGUgJ2RvdWJsZScgYnV0IGhhcyBwYXJhbWV0ZXIgb2YgdHlwZSAnZmxvYXQnIHdoaWNoIG1heSBjYXVzZSB0cnVuY2F0aW9uIG9mIHZhbHVlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMnt7dXNlIGZ1bmN0aW9uICdmYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImZhYnMiCisgICh2b2lkKWZhYnMoeCk7CisgICh2b2lkKWZhYnNsKHgpOworCisgICh2b2lkKWNhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgY29tcGxleCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnY2Fic2YnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2ZhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToiZmFicyIKKyAgKHZvaWQpY2Ficyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2NhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2ZhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEzfToiZmFicyIKKyAgKHZvaWQpY2Fic2woeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdjYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnZmFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiJmYWJzIgorCisgICh2b2lkKV9fYnVpbHRpbl9hYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjJ9OiJfX2J1aWx0aW5fZmFicyIKKyAgKHZvaWQpX19idWlsdGluX2xhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjIzfToiX19idWlsdGluX2ZhYnMiCisgICh2b2lkKV9fYnVpbHRpbl9sbGFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9sbGFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2ZhYnMiCisKKyAgKHZvaWQpX19idWlsdGluX2ZhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3thYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnNmJyBnaXZlbiBhbiBhcmd1bWVudCBvZiB0eXBlICdkb3VibGUnIGJ1dCBoYXMgcGFyYW1ldGVyIG9mIHR5cGUgJ2Zsb2F0JyB3aGljaCBtYXkgY2F1c2UgdHJ1bmNhdGlvbiBvZiB2YWx1ZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2ZhYnMiCisgICh2b2lkKV9fYnVpbHRpbl9mYWJzKHgpOworICAodm9pZClfX2J1aWx0aW5fZmFic2woeCk7CisKKyAgKHZvaWQpX19idWlsdGluX2NhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgY29tcGxleCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnNmJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiJfX2J1aWx0aW5fZmFicyIKKyAgKHZvaWQpX19idWlsdGluX2NhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fY2Ficycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjIzfToiX19idWlsdGluX2ZhYnMiCisgICh2b2lkKV9fYnVpbHRpbl9jYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzbCcgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2ZhYnMiCit9CisKK3ZvaWQgdGVzdF9sb25nX2RvdWJsZShsb25nIGRvdWJsZSB4KSB7CisgICh2b2lkKWFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2Ficycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnZmFic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEyfToiZmFic2wiCisgICh2b2lkKWxhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdsYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdmYWJzbCcgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTN9OiJmYWJzbCIKKyAgKHZvaWQpbGxhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdsbGFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnZmFic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToiZmFic2wiCisKKyAgKHZvaWQpZmFic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2Fic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdmYWJzZicgZ2l2ZW4gYW4gYXJndW1lbnQgb2YgdHlwZSAnbG9uZyBkb3VibGUnIGJ1dCBoYXMgcGFyYW1ldGVyIG9mIHR5cGUgJ2Zsb2F0JyB3aGljaCBtYXkgY2F1c2UgdHJ1bmNhdGlvbiBvZiB2YWx1ZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3VzZSBmdW5jdGlvbiAnZmFic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToiZmFic2wiCisgICh2b2lkKWZhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2Fic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdmYWJzJyBnaXZlbiBhbiBhcmd1bWVudCBvZiB0eXBlICdsb25nIGRvdWJsZScgYnV0IGhhcyBwYXJhbWV0ZXIgb2YgdHlwZSAnZG91YmxlJyB3aGljaCBtYXkgY2F1c2UgdHJ1bmNhdGlvbiBvZiB2YWx1ZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3VzZSBmdW5jdGlvbiAnZmFic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEzfToiZmFic2wiCisgICh2b2lkKWZhYnNsKHgpOworCisgICh2b2lkKWNhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgY29tcGxleCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnY2Fic2YnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2ZhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImZhYnNsIgorICAodm9pZCljYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgY29tcGxleCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnY2Ficycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnZmFic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEzfToiZmFic2wiCisgICh2b2lkKWNhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgY29tcGxleCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnY2Fic2wnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2ZhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImZhYnNsIgorCisgICh2b2lkKV9fYnVpbHRpbl9hYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjIyfToiX19idWlsdGluX2ZhYnNsIgorICAodm9pZClfX2J1aWx0aW5fbGFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9sYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjIzfToiX19idWlsdGluX2ZhYnNsIgorICAodm9pZClfX2J1aWx0aW5fbGxhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGxhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzbCcgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiJfX2J1aWx0aW5fZmFic2wiCisKKyAgKHZvaWQpX19idWlsdGluX2ZhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3thYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnNmJyBnaXZlbiBhbiBhcmd1bWVudCBvZiB0eXBlICdsb25nIGRvdWJsZScgYnV0IGhhcyBwYXJhbWV0ZXIgb2YgdHlwZSAnZmxvYXQnIHdoaWNoIG1heSBjYXVzZSB0cnVuY2F0aW9uIG9mIHZhbHVlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMnt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2ZhYnNsIgorICAodm9pZClfX2J1aWx0aW5fZmFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7YWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzJyBnaXZlbiBhbiBhcmd1bWVudCBvZiB0eXBlICdsb25nIGRvdWJsZScgYnV0IGhhcyBwYXJhbWV0ZXIgb2YgdHlwZSAnZG91YmxlJyB3aGljaCBtYXkgY2F1c2UgdHJ1bmNhdGlvbiBvZiB2YWx1ZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306Il9fYnVpbHRpbl9mYWJzbCIKKyAgKHZvaWQpX19idWlsdGluX2ZhYnNsKHgpOworCisgICh2b2lkKV9fYnVpbHRpbl9jYWJzZih4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGNvbXBsZXggYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzZicgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06Il9fYnVpbHRpbl9mYWJzbCIKKyAgKHZvaWQpX19idWlsdGluX2NhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBjb21wbGV4IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fY2Ficycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306Il9fYnVpbHRpbl9mYWJzbCIKKyAgKHZvaWQpX19idWlsdGluX2NhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgY29tcGxleCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnNsJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2ZhYnNsIgorfQorCit2b2lkIHRlc3RfY29tcGxleF9mbG9hdChfQ29tcGxleCBmbG9hdCB4KSB7CisgICh2b2lkKWFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2Ficycgd2hlbiBhcmd1bWVudCBpcyBvZiBjb21wbGV4IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdjYWJzZicgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTJ9OiJjYWJzZiIKKyAgKHZvaWQpbGFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2xhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnY2Fic2YnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEzfToiY2Fic2YiCisgICh2b2lkKWxsYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnbGxhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnY2Fic2YnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToiY2Fic2YiCisKKyAgKHZvaWQpZmFic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnZmFic2YnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnY2Fic2YnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToiY2Fic2YiCisgICh2b2lkKWZhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnZmFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBjb21wbGV4IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdjYWJzZicgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTN9OiJjYWJzZiIKKyAgKHZvaWQpZmFic2woeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnZmFic2wnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnY2Fic2YnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToiY2Fic2YiCisKKyAgKHZvaWQpY2Fic2YoeCk7CisgICh2b2lkKWNhYnMoeCk7CisgICh2b2lkKWNhYnNsKHgpOworCisgICh2b2lkKV9fYnVpbHRpbl9hYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzZicgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjJ9OiJfX2J1aWx0aW5fY2Fic2YiCisgICh2b2lkKV9fYnVpbHRpbl9sYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2xhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnNmJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306Il9fYnVpbHRpbl9jYWJzZiIKKyAgKHZvaWQpX19idWlsdGluX2xsYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2xsYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzZicgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiJfX2J1aWx0aW5fY2Fic2YiCisKKyAgKHZvaWQpX19idWlsdGluX2ZhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzZicgd2hlbiBhcmd1bWVudCBpcyBvZiBjb21wbGV4IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fY2Fic2YnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2NhYnNmIgorICAodm9pZClfX2J1aWx0aW5fZmFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGZsb2F0aW5nIHBvaW50IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBjb21wbGV4IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fY2Fic2YnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjIzfToiX19idWlsdGluX2NhYnNmIgorICAodm9pZClfX2J1aWx0aW5fZmFic2woeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnNsJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzZicgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiJfX2J1aWx0aW5fY2Fic2YiCisKKyAgKHZvaWQpX19idWlsdGluX2NhYnNmKHgpOworICAodm9pZClfX2J1aWx0aW5fY2Ficyh4KTsKKyAgKHZvaWQpX19idWlsdGluX2NhYnNsKHgpOworfQorCit2b2lkIHRlc3RfY29tcGxleF9kb3VibGUoX0NvbXBsZXggZG91YmxlIHgpIHsKKyAgKHZvaWQpYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2NhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEyfToiY2FicyIKKyAgKHZvaWQpbGFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2xhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnY2FicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTN9OiJjYWJzIgorICAodm9pZClsbGFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2xsYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2NhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToiY2FicyIKKworICAodm9pZClmYWJzZih4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGZsb2F0aW5nIHBvaW50IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdmYWJzZicgd2hlbiBhcmd1bWVudCBpcyBvZiBjb21wbGV4IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdjYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImNhYnMiCisgICh2b2lkKWZhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnZmFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBjb21wbGV4IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdjYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxM306ImNhYnMiCisgICh2b2lkKWZhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2ZhYnNsJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2NhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToiY2FicyIKKworICAodm9pZCljYWJzZih4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e2Fic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdjYWJzZicgZ2l2ZW4gYW4gYXJndW1lbnQgb2YgdHlwZSAnX0NvbXBsZXggZG91YmxlJyBidXQgaGFzIHBhcmFtZXRlciBvZiB0eXBlICdfQ29tcGxleCBmbG9hdCcgd2hpY2ggbWF5IGNhdXNlIHRydW5jYXRpb24gb2YgdmFsdWV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdjYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImNhYnMiCisgICh2b2lkKWNhYnMoeCk7CisgICh2b2lkKWNhYnNsKHgpOworCisgICh2b2lkKV9fYnVpbHRpbl9hYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyMn06Il9fYnVpbHRpbl9jYWJzIgorICAodm9pZClfX2J1aWx0aW5fbGFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9sYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306Il9fYnVpbHRpbl9jYWJzIgorICAodm9pZClfX2J1aWx0aW5fbGxhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGxhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2NhYnMiCisKKyAgKHZvaWQpX19idWlsdGluX2ZhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzZicgd2hlbiBhcmd1bWVudCBpcyBvZiBjb21wbGV4IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fY2FicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiJfX2J1aWx0aW5fY2FicyIKKyAgKHZvaWQpX19idWlsdGluX2ZhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjIzfToiX19idWlsdGluX2NhYnMiCisgICh2b2lkKV9fYnVpbHRpbl9mYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGZsb2F0aW5nIHBvaW50IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFic2wnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnMnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiX19idWlsdGluX2NhYnMiCisKKyAgKHZvaWQpX19idWlsdGluX2NhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7YWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzZicgZ2l2ZW4gYW4gYXJndW1lbnQgb2YgdHlwZSAnX0NvbXBsZXggZG91YmxlJyBidXQgaGFzIHBhcmFtZXRlciBvZiB0eXBlICdfQ29tcGxleCBmbG9hdCcgd2hpY2ggbWF5IGNhdXNlIHRydW5jYXRpb24gb2YgdmFsdWV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fY2FicycgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiJfX2J1aWx0aW5fY2FicyIKKyAgKHZvaWQpX19idWlsdGluX2NhYnMoeCk7CisgICh2b2lkKV9fYnVpbHRpbl9jYWJzbCh4KTsKK30KKwordm9pZCB0ZXN0X2NvbXBsZXhfbG9uZ19kb3VibGUoX0NvbXBsZXggbG9uZyBkb3VibGUgeCkgeworICAodm9pZClhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnY2Fic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEyfToiY2Fic2wiCisgICh2b2lkKWxhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdsYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2NhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxM306ImNhYnNsIgorICAodm9pZClsbGFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2xsYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2NhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImNhYnNsIgorCisgICh2b2lkKWZhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2ZhYnNmJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2NhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImNhYnNsIgorICAodm9pZClmYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2ZhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnY2Fic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjEzfToiY2Fic2wiCisgICh2b2lkKWZhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2ZhYnNsJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ2NhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06ImNhYnNsIgorCisgICh2b2lkKWNhYnNmKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7YWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2NhYnNmJyBnaXZlbiBhbiBhcmd1bWVudCBvZiB0eXBlICdfQ29tcGxleCBsb25nIGRvdWJsZScgYnV0IGhhcyBwYXJhbWV0ZXIgb2YgdHlwZSAnX0NvbXBsZXggZmxvYXQnIHdoaWNoIG1heSBjYXVzZSB0cnVuY2F0aW9uIG9mIHZhbHVlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnY2Fic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjE0fToiY2Fic2wiCisgICh2b2lkKWNhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3thYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnY2FicycgZ2l2ZW4gYW4gYXJndW1lbnQgb2YgdHlwZSAnX0NvbXBsZXggbG9uZyBkb3VibGUnIGJ1dCBoYXMgcGFyYW1ldGVyIG9mIHR5cGUgJ19Db21wbGV4IGRvdWJsZScgd2hpY2ggbWF5IGNhdXNlIHRydW5jYXRpb24gb2YgdmFsdWV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdjYWJzbCcgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTN9OiJjYWJzbCIKKyAgKHZvaWQpY2Fic2woeCk7CisKKyAgKHZvaWQpX19idWlsdGluX2Ficyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9hYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyMn06Il9fYnVpbHRpbl9jYWJzbCIKKyAgKHZvaWQpX19idWlsdGluX2xhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGFicycgd2hlbiBhcmd1bWVudCBpcyBvZiBjb21wbGV4IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7dXNlIGZ1bmN0aW9uICdfX2J1aWx0aW5fY2Fic2wnIGluc3RlYWR9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjIzfToiX19idWlsdGluX2NhYnNsIgorICAodm9pZClfX2J1aWx0aW5fbGxhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fbGxhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06Il9fYnVpbHRpbl9jYWJzbCIKKworICAodm9pZClfX2J1aWx0aW5fZmFic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t1c2luZyBmbG9hdGluZyBwb2ludCBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2ZhYnNmJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzbCcgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiJfX2J1aWx0aW5fY2Fic2wiCisgICh2b2lkKV9fYnVpbHRpbl9mYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dXNpbmcgZmxvYXRpbmcgcG9pbnQgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ19fYnVpbHRpbl9mYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGNvbXBsZXggdHlwZX19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t1c2UgZnVuY3Rpb24gJ19fYnVpbHRpbl9jYWJzbCcgaW5zdGVhZH19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjN9OiJfX2J1aWx0aW5fY2Fic2wiCisgICh2b2lkKV9fYnVpbHRpbl9mYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3VzaW5nIGZsb2F0aW5nIHBvaW50IGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdfX2J1aWx0aW5fZmFic2wnIHdoZW4gYXJndW1lbnQgaXMgb2YgY29tcGxleCB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06Il9fYnVpbHRpbl9jYWJzbCIKKworICAodm9pZClfX2J1aWx0aW5fY2Fic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3thYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnNmJyBnaXZlbiBhbiBhcmd1bWVudCBvZiB0eXBlICdfQ29tcGxleCBsb25nIGRvdWJsZScgYnV0IGhhcyBwYXJhbWV0ZXIgb2YgdHlwZSAnX0NvbXBsZXggZmxvYXQnIHdoaWNoIG1heSBjYXVzZSB0cnVuY2F0aW9uIG9mIHZhbHVlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06Il9fYnVpbHRpbl9jYWJzbCIKKyAgKHZvaWQpX19idWlsdGluX2NhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3thYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnMnIGdpdmVuIGFuIGFyZ3VtZW50IG9mIHR5cGUgJ19Db21wbGV4IGxvbmcgZG91YmxlJyBidXQgaGFzIHBhcmFtZXRlciBvZiB0eXBlICdfQ29tcGxleCBkb3VibGUnIHdoaWNoIG1heSBjYXVzZSB0cnVuY2F0aW9uIG9mIHZhbHVlfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3VzZSBmdW5jdGlvbiAnX19idWlsdGluX2NhYnNsJyBpbnN0ZWFkfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306Il9fYnVpbHRpbl9jYWJzbCIKKyAgKHZvaWQpX19idWlsdGluX2NhYnNsKHgpOworfQorCit2b2lkIHRlc3RfdW5zaWduZWRfaW50KHVuc2lnbmVkIGludCB4KSB7CisgICh2b2lkKWFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgaW50JyBoYXMgbm8gZWZmZWN0fX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3JlbW92ZSB0aGUgY2FsbCB0byAnYWJzJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxMn06IiIKKyAgKHZvaWQpbGFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgaW50JyBoYXMgbm8gZWZmZWN0fX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3JlbW92ZSB0aGUgY2FsbCB0byAnbGFicycgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTN9OiIiCisgICh2b2lkKWxsYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCB0eXBlICd1bnNpZ25lZCBpbnQnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdsbGFicycgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiIiCisKKyAgKHZvaWQpZmFic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGludCcgaGFzIG5vIGVmZmVjdH19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3tyZW1vdmUgdGhlIGNhbGwgdG8gJ2ZhYnNmJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06IiIKKyAgKHZvaWQpZmFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgaW50JyBoYXMgbm8gZWZmZWN0fX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3JlbW92ZSB0aGUgY2FsbCB0byAnZmFicycgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTN9OiIiCisgICh2b2lkKWZhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCB0eXBlICd1bnNpZ25lZCBpbnQnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdmYWJzbCcgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiIiCisKKyAgKHZvaWQpY2Fic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGludCcgaGFzIG5vIGVmZmVjdH19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3tyZW1vdmUgdGhlIGNhbGwgdG8gJ2NhYnNmJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxNH06IiIKKyAgKHZvaWQpY2Ficyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgaW50JyBoYXMgbm8gZWZmZWN0fX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3JlbW92ZSB0aGUgY2FsbCB0byAnY2Ficycgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTN9OiIiCisgICh2b2lkKWNhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCB0eXBlICd1bnNpZ25lZCBpbnQnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdjYWJzbCcgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiIiCisKKyAgKHZvaWQpX19idWlsdGluX2Ficyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgaW50JyBoYXMgbm8gZWZmZWN0fX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3JlbW92ZSB0aGUgY2FsbCB0byAnX19idWlsdGluX2Ficycgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjJ9OiIiCisgICh2b2lkKV9fYnVpbHRpbl9sYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCB0eXBlICd1bnNpZ25lZCBpbnQnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdfX2J1aWx0aW5fbGFicycgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjN9OiIiCisgICh2b2lkKV9fYnVpbHRpbl9sbGFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgaW50JyBoYXMgbm8gZWZmZWN0fX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3JlbW92ZSB0aGUgY2FsbCB0byAnX19idWlsdGluX2xsYWJzJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06IiIKKworICAodm9pZClfX2J1aWx0aW5fZmFic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGludCcgaGFzIG5vIGVmZmVjdH19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3tyZW1vdmUgdGhlIGNhbGwgdG8gJ19fYnVpbHRpbl9mYWJzZicgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiIiCisgICh2b2lkKV9fYnVpbHRpbl9mYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCB0eXBlICd1bnNpZ25lZCBpbnQnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdfX2J1aWx0aW5fZmFicycgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjN9OiIiCisgICh2b2lkKV9fYnVpbHRpbl9mYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgaW50JyBoYXMgbm8gZWZmZWN0fX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3JlbW92ZSB0aGUgY2FsbCB0byAnX19idWlsdGluX2ZhYnNsJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06IiIKKworICAodm9pZClfX2J1aWx0aW5fY2Fic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGludCcgaGFzIG5vIGVmZmVjdH19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3tyZW1vdmUgdGhlIGNhbGwgdG8gJ19fYnVpbHRpbl9jYWJzZicgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjR9OiIiCisgICh2b2lkKV9fYnVpbHRpbl9jYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCB0eXBlICd1bnNpZ25lZCBpbnQnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdfX2J1aWx0aW5fY2Ficycgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MjN9OiIiCisgICh2b2lkKV9fYnVpbHRpbl9jYWJzbCh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgaW50JyBoYXMgbm8gZWZmZWN0fX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3JlbW92ZSB0aGUgY2FsbCB0byAnX19idWlsdGluX2NhYnNsJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06IiIKK30KKwordm9pZCB0ZXN0X3Vuc2lnbmVkX2xvbmcodW5zaWduZWQgbG9uZyB4KSB7CisgICh2b2lkKWFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgbG9uZycgaGFzIG5vIGVmZmVjdH19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3tyZW1vdmUgdGhlIGNhbGwgdG8gJ2Ficycgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTJ9OiIiCisgICh2b2lkKWxhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdsYWJzJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxM306IiIKKyAgKHZvaWQpbGxhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdsbGFicycgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiIiCisKKyAgKHZvaWQpZmFic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdmYWJzZicgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiIiCisgICh2b2lkKWZhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdmYWJzJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxM306IiIKKyAgKHZvaWQpZmFic2woeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdmYWJzbCcgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiIiCisKKyAgKHZvaWQpY2Fic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdjYWJzZicgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiIiCisgICh2b2lkKWNhYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdjYWJzJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxM306IiIKKyAgKHZvaWQpY2Fic2woeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdjYWJzbCcgc2luY2UgdW5zaWduZWQgdmFsdWVzIGNhbm5vdCBiZSBuZWdhdGl2ZX19CisgIC8vIENIRUNLOiBmaXgtaXQ6Int7Lip9fSI6e1tbQExJTkUtM11dOjktW1tATElORS0zXV06MTR9OiIiCisKKyAgKHZvaWQpX19idWlsdGluX2Ficyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgbG9uZycgaGFzIG5vIGVmZmVjdH19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3tyZW1vdmUgdGhlIGNhbGwgdG8gJ19fYnVpbHRpbl9hYnMnIHNpbmNlIHVuc2lnbmVkIHZhbHVlcyBjYW5ub3QgYmUgbmVnYXRpdmV9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjIyfToiIgorICAodm9pZClfX2J1aWx0aW5fbGFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgbG9uZycgaGFzIG5vIGVmZmVjdH19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3tyZW1vdmUgdGhlIGNhbGwgdG8gJ19fYnVpbHRpbl9sYWJzJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306IiIKKyAgKHZvaWQpX19idWlsdGluX2xsYWJzKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCB0eXBlICd1bnNpZ25lZCBsb25nJyBoYXMgbm8gZWZmZWN0fX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3JlbW92ZSB0aGUgY2FsbCB0byAnX19idWlsdGluX2xsYWJzJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06IiIKKworICAodm9pZClfX2J1aWx0aW5fZmFic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdfX2J1aWx0aW5fZmFic2YnIHNpbmNlIHVuc2lnbmVkIHZhbHVlcyBjYW5ub3QgYmUgbmVnYXRpdmV9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiIgorICAodm9pZClfX2J1aWx0aW5fZmFicyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgbG9uZycgaGFzIG5vIGVmZmVjdH19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3tyZW1vdmUgdGhlIGNhbGwgdG8gJ19fYnVpbHRpbl9mYWJzJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306IiIKKyAgKHZvaWQpX19idWlsdGluX2ZhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCB0eXBlICd1bnNpZ25lZCBsb25nJyBoYXMgbm8gZWZmZWN0fX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3JlbW92ZSB0aGUgY2FsbCB0byAnX19idWlsdGluX2ZhYnNsJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06IiIKKworICAodm9pZClfX2J1aWx0aW5fY2Fic2YoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnIGhhcyBubyBlZmZlY3R9fQorICAvLyBleHBlY3RlZC1ub3RlQC0yIHt7cmVtb3ZlIHRoZSBjYWxsIHRvICdfX2J1aWx0aW5fY2Fic2YnIHNpbmNlIHVuc2lnbmVkIHZhbHVlcyBjYW5ub3QgYmUgbmVnYXRpdmV9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTNdXTo5LVtbQExJTkUtM11dOjI0fToiIgorICAodm9pZClfX2J1aWx0aW5fY2Ficyh4KTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e3Rha2luZyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgdHlwZSAndW5zaWduZWQgbG9uZycgaGFzIG5vIGVmZmVjdH19CisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3tyZW1vdmUgdGhlIGNhbGwgdG8gJ19fYnVpbHRpbl9jYWJzJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyM306IiIKKyAgKHZvaWQpX19idWlsdGluX2NhYnNsKHgpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7dGFraW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB1bnNpZ25lZCB0eXBlICd1bnNpZ25lZCBsb25nJyBoYXMgbm8gZWZmZWN0fX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtMiB7e3JlbW92ZSB0aGUgY2FsbCB0byAnX19idWlsdGluX2NhYnNsJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToyNH06IiIKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL3dhcm4tZG9jdW1lbnRhdGlvbi5jcHAgYi90ZXN0L1NlbWEvd2Fybi1kb2N1bWVudGF0aW9uLmNwcAppbmRleCA3MTY2YTQ5Li5lZDI1ZDk0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvd2Fybi1kb2N1bWVudGF0aW9uLmNwcAorKysgYi90ZXN0L1NlbWEvd2Fybi1kb2N1bWVudGF0aW9uLmNwcApAQCAtMTY3LDcgKzE2NywxMyBAQAogCiAvLyBleHBlY3RlZC13YXJuaW5nQCsxIHt7J1xwYXJhbScgY29tbWFuZCB1c2VkIGluIGEgY29tbWVudCB0aGF0IGlzIG5vdCBhdHRhY2hlZCB0byBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9ufX0KIC8vLyBccGFyYW0gYSBCbGFoIGJsYWguCi1pbnQgdGVzdF9wYXJhbTE7CitpbnQgdGVzdF9wYXJhbTFfYmFja3NsYXNoOworCisvLyByZGFyOi8vMTMwNjYyNzYKKy8vIENoZWNrIHRoYXQgdGhlIGRpYWdub3N0aWMgdXNlcyB0aGUgc2FtZSBjb21tYW5kIG1hcmtlciBhcyB0aGUgY29tbWVudC4KKy8vIGV4cGVjdGVkLXdhcm5pbmdAKzEge3snQHBhcmFtJyBjb21tYW5kIHVzZWQgaW4gYSBjb21tZW50IHRoYXQgaXMgbm90IGF0dGFjaGVkIHRvIGEgZnVuY3Rpb24gZGVjbGFyYXRpb259fQorLy8vIEBwYXJhbSBhIEJsYWggYmxhaC4KK2ludCB0ZXN0X3BhcmFtMV9hdDsKIAogLy8gZXhwZWN0ZWQtd2FybmluZ0ArMSB7e2VtcHR5IHBhcmFncmFwaCBwYXNzZWQgdG8gJ1xwYXJhbScgY29tbWFuZH19CiAvLy8gXHBhcmFtCkBAIC0yNjksNDEgKzI3NSw4NSBAQAogLy8vIFxwYXJhbSB4MiBDY2MuCiBpbnQgdGVzdF9wYXJhbTIyKGludCB4MSwgaW50IHgyLCBpbnQgeDMpOwogCi0vLyBleHBlY3RlZC13YXJuaW5nQCsyIHt7cGFyYW1ldGVyICdiYmInIG5vdCBmb3VuZCBpbiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb259fSBleHBlY3RlZC1ub3RlQCsyIHt7ZGlkIHlvdSBtZWFuICdjY2MnP319Ci0vLy8gXHBhcmFtIGFhYSBNZW93LgotLy8vIFxwYXJhbSBiYmIgQmJiLgotLy8vIFxyZXR1cm5zIGFhYS4KLXR5cGVkZWYgaW50IHRlc3RfcGFyYW0yMyhpbnQgYWFhLCBpbnQgY2NjKTsKKy8vPT09LS0tCisvLyBUZXN0IHRoYXQgd2UgdHJlYXQgdHlwZWRlZnMgdG8gc29tZSBub24tZnVuY3Rpb24gdHlwZXMgYXMgZnVuY3Rpb25zIGZvciB0aGUKKy8vIHB1cnBvc2VzIG9mIGRvY3VtZW50YXRpb24gY29tbWVudCBwYXJzaW5nLgorLy89PT0tLS0KKworbmFtZXNwYWNlIGZvbyB7CisgIGlubGluZSBuYW1lc3BhY2UgYmFyIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdHJ1Y3QgZnVuY3Rpb25fd3JhcHBlciB7fTsKKworICAgIHRlbXBsYXRlPHVuc2lnbmVkPgorICAgIHN0cnVjdCBub3RfYV9mdW5jdGlvbl93cmFwcGVyIHt9OworICB9Cit9OwogCiAvLyBleHBlY3RlZC13YXJuaW5nQCsyIHt7cGFyYW1ldGVyICdiYmInIG5vdCBmb3VuZCBpbiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb259fSBleHBlY3RlZC1ub3RlQCsyIHt7ZGlkIHlvdSBtZWFuICdjY2MnP319CiAvLy8gXHBhcmFtIGFhYSBNZW93LgogLy8vIFxwYXJhbSBiYmIgQmJiLgogLy8vIFxyZXR1cm5zIGFhYS4KLXR5cGVkZWYgaW50ICgqdGVzdF9wYXJhbTI0KShpbnQgYWFhLCBpbnQgY2NjKTsKK3R5cGVkZWYgaW50IHRlc3RfZnVuY3Rpb25fbGlrZV90eXBlZGVmMShpbnQgYWFhLCBpbnQgY2NjKTsKIAogLy8gZXhwZWN0ZWQtd2FybmluZ0ArMiB7e3BhcmFtZXRlciAnYmJiJyBub3QgZm91bmQgaW4gdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ufX0gZXhwZWN0ZWQtbm90ZUArMiB7e2RpZCB5b3UgbWVhbiAnY2NjJz99fQogLy8vIFxwYXJhbSBhYWEgTWVvdy4KIC8vLyBccGFyYW0gYmJiIEJiYi4KIC8vLyBccmV0dXJucyBhYWEuCi10eXBlZGVmIGludCAoKiBjb25zdCB0ZXN0X3BhcmFtMjUpKGludCBhYWEsIGludCBjY2MpOwordHlwZWRlZiBpbnQgKCp0ZXN0X2Z1bmN0aW9uX2xpa2VfdHlwZWRlZjIpKGludCBhYWEsIGludCBjY2MpOwogCiAvLyBleHBlY3RlZC13YXJuaW5nQCsyIHt7cGFyYW1ldGVyICdiYmInIG5vdCBmb3VuZCBpbiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb259fSBleHBlY3RlZC1ub3RlQCsyIHt7ZGlkIHlvdSBtZWFuICdjY2MnP319CiAvLy8gXHBhcmFtIGFhYSBNZW93LgogLy8vIFxwYXJhbSBiYmIgQmJiLgogLy8vIFxyZXR1cm5zIGFhYS4KLXR5cGVkZWYgaW50IChDOjoqdGVzdF9wYXJhbTI2KShpbnQgYWFhLCBpbnQgY2NjKTsKK3R5cGVkZWYgaW50ICgqIGNvbnN0IHRlc3RfZnVuY3Rpb25fbGlrZV90eXBlZGVmMykoaW50IGFhYSwgaW50IGNjYyk7CiAKLXR5cGVkZWYgaW50ICgqdGVzdF9wYXJhbTI3KShpbnQgYWFhKTsKKy8vIGV4cGVjdGVkLXdhcm5pbmdAKzIge3twYXJhbWV0ZXIgJ2JiYicgbm90IGZvdW5kIGluIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbn19IGV4cGVjdGVkLW5vdGVAKzIge3tkaWQgeW91IG1lYW4gJ2NjYyc/fX0KKy8vLyBccGFyYW0gYWFhIE1lb3cuCisvLy8gXHBhcmFtIGJiYiBCYmIuCisvLy8gXHJldHVybnMgYWFhLgordHlwZWRlZiBpbnQgKEM6Oip0ZXN0X2Z1bmN0aW9uX2xpa2VfdHlwZWRlZjQpKGludCBhYWEsIGludCBjY2MpOworCisvLyBleHBlY3RlZC13YXJuaW5nQCsyIHt7cGFyYW1ldGVyICdiYmInIG5vdCBmb3VuZCBpbiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb259fSBleHBlY3RlZC1ub3RlQCsyIHt7ZGlkIHlvdSBtZWFuICdjY2MnP319CisvLy8gXHBhcmFtIGFhYSBNZW93LgorLy8vIFxwYXJhbSBiYmIgQmJiLgorLy8vIFxyZXR1cm5zIGFhYS4KK3R5cGVkZWYgZm9vOjpmdW5jdGlvbl93cmFwcGVyPGludCAoaW50IGFhYSwgaW50IGNjYyk+IHRlc3RfZnVuY3Rpb25fbGlrZV90eXBlZGVmNTsKKworLy8gZXhwZWN0ZWQtd2FybmluZ0ArMiB7e3BhcmFtZXRlciAnYmJiJyBub3QgZm91bmQgaW4gdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9ufX0gZXhwZWN0ZWQtbm90ZUArMiB7e2RpZCB5b3UgbWVhbiAnY2NjJz99fQorLy8vIFxwYXJhbSBhYWEgTWVvdy4KKy8vLyBccGFyYW0gYmJiIEJiYi4KKy8vLyBccmV0dXJucyBhYWEuCit0eXBlZGVmIGZvbzo6ZnVuY3Rpb25fd3JhcHBlcjxpbnQgKGludCBhYWEsIGludCBjY2MpPiAqdGVzdF9mdW5jdGlvbl9saWtlX3R5cGVkZWY2OworCisvLyBleHBlY3RlZC13YXJuaW5nQCsyIHt7cGFyYW1ldGVyICdiYmInIG5vdCBmb3VuZCBpbiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb259fSBleHBlY3RlZC1ub3RlQCsyIHt7ZGlkIHlvdSBtZWFuICdjY2MnP319CisvLy8gXHBhcmFtIGFhYSBNZW93LgorLy8vIFxwYXJhbSBiYmIgQmJiLgorLy8vIFxyZXR1cm5zIGFhYS4KK3R5cGVkZWYgZm9vOjpmdW5jdGlvbl93cmFwcGVyPGludCAoaW50IGFhYSwgaW50IGNjYyk+ICZ0ZXN0X2Z1bmN0aW9uX2xpa2VfdHlwZWRlZjc7CisKKy8vIGV4cGVjdGVkLXdhcm5pbmdAKzIge3twYXJhbWV0ZXIgJ2JiYicgbm90IGZvdW5kIGluIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbn19IGV4cGVjdGVkLW5vdGVAKzIge3tkaWQgeW91IG1lYW4gJ2NjYyc/fX0KKy8vLyBccGFyYW0gYWFhIE1lb3cuCisvLy8gXHBhcmFtIGJiYiBCYmIuCisvLy8gXHJldHVybnMgYWFhLgordHlwZWRlZiBmb286OmZ1bmN0aW9uX3dyYXBwZXI8aW50IChpbnQgYWFhLCBpbnQgY2NjKT4gJiZ0ZXN0X2Z1bmN0aW9uX2xpa2VfdHlwZWRlZjg7CisKKwordHlwZWRlZiBpbnQgKCp0ZXN0X25vdF9mdW5jdGlvbl9saWtlX3R5cGVkZWYxKShpbnQgYWFhKTsKIAogLy8gZXhwZWN0ZWQtd2FybmluZ0ArMSB7eydccGFyYW0nIGNvbW1hbmQgdXNlZCBpbiBhIGNvbW1lbnQgdGhhdCBpcyBub3QgYXR0YWNoZWQgdG8gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbn19CiAvLy8gXHBhcmFtIGFhYSBNZW93LgotdHlwZWRlZiB0ZXN0X3BhcmFtMjcgdGVzdF9wYXJhbTI4OwordHlwZWRlZiB0ZXN0X25vdF9mdW5jdGlvbl9saWtlX3R5cGVkZWYxIHRlc3Rfbm90X2Z1bmN0aW9uX2xpa2VfdHlwZWRlZjI7CiAKIC8vIHJkYXI6Ly8xMzA2NjI3NgorLy8gQ2hlY2sgdGhhdCB0aGUgZGlhZ25vc3RpYyB1c2VzIHRoZSBzYW1lIGNvbW1hbmQgbWFya2VyIGFzIHRoZSBjb21tZW50LgogLy8gZXhwZWN0ZWQtd2FybmluZ0ArMSB7eydAcGFyYW0nIGNvbW1hbmQgdXNlZCBpbiBhIGNvbW1lbnQgdGhhdCBpcyBub3QgYXR0YWNoZWQgdG8gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbn19CiAvLy8gQHBhcmFtIGFhYSBNZW93LgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdGVzdF9wYXJhbTI5OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdGVzdF9ub3RfZnVuY3Rpb25fbGlrZV90eXBlZGVmMzsKIAorLy8gZXhwZWN0ZWQtd2FybmluZ0ArMSB7eydccGFyYW0nIGNvbW1hbmQgdXNlZCBpbiBhIGNvbW1lbnQgdGhhdCBpcyBub3QgYXR0YWNoZWQgdG8gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbn19CisvLy8gXHBhcmFtIGFhYSBNZW93LgordHlwZWRlZiBmb286Om5vdF9hX2Z1bmN0aW9uX3dyYXBwZXI8MT4gdGVzdF9ub3RfZnVuY3Rpb25fbGlrZV90eXBlZGVmNDsKIAogLy8vIFxwYXJhbSBhYWEgQWFhCiAvLy8gXHBhcmFtIC4uLiBWYXJhcmcKQEAgLTMyMSw2ICszNzEsMjYgQEAKIGludCB0ZXN0X3ZhcmFyZ19wYXJhbTQoKTsKIAogCisvLy8gXHBhcmFtIGFhYSBBYWEKKy8vLyBccGFyYW0gLi4uIFZhcmFyZwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2ludCB0ZXN0X3RlbXBsYXRlX3ZhcmFyZ19wYXJhbTEoaW50IGFhYSwgLi4uKTsKKworLy8vIFxwYXJhbSAuLi4gVmFyYXJnCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW50IHRlc3RfdGVtcGxhdGVfdmFyYXJnX3BhcmFtMiguLi4pOworCisvLyBleHBlY3RlZC13YXJuaW5nQCsxIHt7cGFyYW1ldGVyICcuLi4nIG5vdCBmb3VuZCBpbiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb259fSBleHBlY3RlZC1ub3RlQCsxIHt7ZGlkIHlvdSBtZWFuICdhYWEnP319CisvLy8gXHBhcmFtIC4uLiBWYXJhcmcKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbnQgdGVzdF90ZW1wbGF0ZV92YXJhcmdfcGFyYW0zKGludCBhYWEpOworCisvLyBleHBlY3RlZC13YXJuaW5nQCsxIHt7cGFyYW1ldGVyICcuLi4nIG5vdCBmb3VuZCBpbiB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb259fQorLy8vIFxwYXJhbSAuLi4gVmFyYXJnCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW50IHRlc3RfdGVtcGxhdGVfdmFyYXJnX3BhcmFtNCgpOworCisKIC8vIGV4cGVjdGVkLXdhcm5pbmdAKzEge3snXHRwYXJhbScgY29tbWFuZCB1c2VkIGluIGEgY29tbWVudCB0aGF0IGlzIG5vdCBhdHRhY2hlZCB0byBhIHRlbXBsYXRlIGRlY2xhcmF0aW9ufX0KIC8vLyBcdHBhcmFtIFQgQWFhCiBpbnQgdGVzdF90cGFyYW0xOwpAQCAtNTAzLDcgKzU3MywxMyBAQAogCiAvLyBleHBlY3RlZC13YXJuaW5nQCsxIHt7J1xyZXR1cm5zJyBjb21tYW5kIHVzZWQgaW4gYSBjb21tZW50IHRoYXQgaXMgbm90IGF0dGFjaGVkIHRvIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGRlY2xhcmF0aW9ufX0KIC8vLyBccmV0dXJucyBBYWEKLWludCB0ZXN0X3JldHVybnNfd3JvbmdfZGVjbF8xOworaW50IHRlc3RfcmV0dXJuc193cm9uZ19kZWNsXzFfYmFja3NsYXNoOworCisvLyByZGFyOi8vMTMwNjYyNzYKKy8vIENoZWNrIHRoYXQgdGhlIGRpYWdub3N0aWMgdXNlcyB0aGUgc2FtZSBjb21tYW5kIG1hcmtlciBhcyB0aGUgY29tbWVudC4KKy8vIGV4cGVjdGVkLXdhcm5pbmdAKzEge3snQHJldHVybnMnIGNvbW1hbmQgdXNlZCBpbiBhIGNvbW1lbnQgdGhhdCBpcyBub3QgYXR0YWNoZWQgdG8gYSBmdW5jdGlvbiBvciBtZXRob2QgZGVjbGFyYXRpb259fQorLy8vIEByZXR1cm5zIEFhYQoraW50IHRlc3RfcmV0dXJuc193cm9uZ19kZWNsXzFfYXQ7CiAKIC8vIGV4cGVjdGVkLXdhcm5pbmdAKzEge3snXHJldHVybicgY29tbWFuZCB1c2VkIGluIGEgY29tbWVudCB0aGF0IGlzIG5vdCBhdHRhY2hlZCB0byBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBkZWNsYXJhdGlvbn19CiAvLy8gXHJldHVybiBBYWEKQEAgLTU1NSwxMSArNjMxLDYgQEAKIC8vLyBccmV0dXJucyBBYWEKIG5hbWVzcGFjZSB0ZXN0X3JldHVybnNfd3JvbmdfZGVjbF8xMCB7IH07CiAKLS8vIHJkYXI6Ly8xMzA2NjI3NgotLy8gZXhwZWN0ZWQtd2FybmluZ0ArMSB7eydAcmV0dXJucycgY29tbWFuZCB1c2VkIGluIGEgY29tbWVudCB0aGF0IGlzIG5vdCBhdHRhY2hlZCB0byBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBkZWNsYXJhdGlvbn19Ci0vLy8gQHJldHVybnMgQWFhCi10eXBlZGVmIHVuc2lnbmVkIGludCB0ZXN0X3JldHVybnNfd3JvbmdfZGVjbF8xMTsKLQogLy8gcmRhcjovLzEzMDk0MzUyCiAvLyBleHBlY3RlZC13YXJuaW5nQCsxIHt7J0BmdW5jdGlvbicgY29tbWFuZCBzaG91bGQgYmUgdXNlZCBpbiBhIGNvbW1lbnQgYXR0YWNoZWQgdG8gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbn19CiAvKiEJQGZ1bmN0aW9uIHRlc3RfZnVuY3Rpb24KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS93YXJuLW1pc3NpbmctdmFyaWFibGUtZGVjbGFyYXRpb25zLmMgYi90ZXN0L1NlbWEvd2Fybi1taXNzaW5nLXZhcmlhYmxlLWRlY2xhcmF0aW9ucy5jCmluZGV4IDYzMWQzZDIuLmU1Y2U5N2QgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS93YXJuLW1pc3NpbmctdmFyaWFibGUtZGVjbGFyYXRpb25zLmMKKysrIGIvdGVzdC9TZW1hL3dhcm4tbWlzc2luZy12YXJpYWJsZS1kZWNsYXJhdGlvbnMuYwpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nIC1XbWlzc2luZy12YXJpYWJsZS1kZWNsYXJhdGlvbnMgLWZzeW50YXgtb25seSAtWGNsYW5nIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtV21pc3NpbmctdmFyaWFibGUtZGVjbGFyYXRpb25zIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcwogCiBpbnQgdmJhZDE7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e25vIHByZXZpb3VzIGV4dGVybiBkZWNsYXJhdGlvbiBmb3Igbm9uLXN0YXRpYyB2YXJpYWJsZSAndmJhZDEnfX0KIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL3dhcm4tbnVsbC5jIGIvdGVzdC9TZW1hL3dhcm4tbnVsbC5jCmluZGV4IDI4ZmI2YTUuLjNiZjJhZWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS93YXJuLW51bGwuYworKysgYi90ZXN0L1NlbWEvd2Fybi1udWxsLmMKQEAgLTEsNSArMSw3IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXZlcmlmeQogCisjZGVmaW5lIFNPTUVfQUREUiAodW5zaWduZWQgbG9uZyBsb25nKTAKKwogLy8gUFIxMDgzNzogV2FybiBpZiBhIG5vbi1wb2ludGVyLXR5cGVkIGV4cHJlc3Npb24gaXMgZm9sZGVkIHRvIGEgbnVsbCBwb2ludGVyCiBpbnQgKnAgPSAwOwogaW50ICpxID0gJ1wwJzsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXhwcmVzc2lvbiB3aGljaCBldmFsdWF0ZXMgdG8gemVybyB0cmVhdGVkIGFzIGEgbnVsbCBwb2ludGVyIGNvbnN0YW50fX0KQEAgLTgsNCArMTAsNSBAQAogICBwID0gMDsKICAgcSA9ICdcMCc7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGVzIHRvIHplcm8gdHJlYXRlZCBhcyBhIG51bGwgcG9pbnRlciBjb25zdGFudH19CiAgIHIgPSAxIC0gMTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXhwcmVzc2lvbiB3aGljaCBldmFsdWF0ZXMgdG8gemVybyB0cmVhdGVkIGFzIGEgbnVsbCBwb2ludGVyIGNvbnN0YW50fX0KKyAgcCA9IFNPTUVfQUREUjsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXhwcmVzc2lvbiB3aGljaCBldmFsdWF0ZXMgdG8gemVybyB0cmVhdGVkIGFzIGEgbnVsbCBwb2ludGVyIGNvbnN0YW50fX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYS93YXJuLW91dG9mLXJhbmdlLWFzc2lnbi1lbnVtLmMgYi90ZXN0L1NlbWEvd2Fybi1vdXRvZi1yYW5nZS1hc3NpZ24tZW51bS5jCmluZGV4IDQzZWVhMGMuLmVkZDRlMzcgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS93YXJuLW91dG9mLXJhbmdlLWFzc2lnbi1lbnVtLmMKKysrIGIvdGVzdC9TZW1hL3dhcm4tb3V0b2YtcmFuZ2UtYXNzaWduLWVudW0uYwpAQCAtMTEsNiArMTEsMjQgQEAKIENDVGVzdEVudW0gdGVzdCA9IDUwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW50ZWdlciBjb25zdGFudCBub3QgaW4gcmFuZ2Ugb2YgZW51bWVyYXRlZCB0eXBlICdDQ1Rlc3RFbnVtJ319CiBDQ1Rlc3RFbnVtIHRlc3QxID0gLTUwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW50ZWdlciBjb25zdGFudCBub3QgaW4gcmFuZ2Ugb2YgZW51bWVyYXRlZCB0eXBlICdDQ1Rlc3RFbnVtJ319CiAKKy8vIEV4cGxpY2l0IGNhc3Qgc2hvdWxkIHNpbGVuY2UgdGhlIHdhcm5pbmcuCitzdGF0aWMgY29uc3QgQ0NUZXN0RW51bSBTaWxlbmNlV2l0aENhc3QxID0gNTE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbnRlZ2VyIGNvbnN0YW50IG5vdCBpbiByYW5nZSBvZiBlbnVtZXJhdGVkIHR5cGUgJ0NDVGVzdEVudW0nfX0KK3N0YXRpYyBjb25zdCBDQ1Rlc3RFbnVtIFNpbGVuY2VXaXRoQ2FzdDIgPSAoQ0NUZXN0RW51bSkgNTE7IC8vIG5vLXdhcm5pbmcKK3N0YXRpYyBjb25zdCBDQ1Rlc3RFbnVtIFNpbGVuY2VXaXRoQ2FzdDMgPSAoY29uc3QgQ0NUZXN0RW51bSkgNTE7IC8vIG5vLXdhcm5pbmcKK3N0YXRpYyBjb25zdCBDQ1Rlc3RFbnVtIFNpbGVuY2VXaXRoQ2FzdDQgPSAoY29uc3Qgdm9sYXRpbGUgQ0NUZXN0RW51bSkgNTE7IC8vIG5vLXdhcm5pbmcKKwordm9pZCBTaWxlbmNlV2l0aENhc3RMb2NhbFZhcigpIHsKKyAgQ0NUZXN0RW51bSBTaWxlbmNlV2l0aENhc3QxID0gNTE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbnRlZ2VyIGNvbnN0YW50IG5vdCBpbiByYW5nZSBvZiBlbnVtZXJhdGVkIHR5cGUgJ0NDVGVzdEVudW0nfX0KKyAgQ0NUZXN0RW51bSBTaWxlbmNlV2l0aENhc3QyID0gKENDVGVzdEVudW0pIDUxOyAvLyBuby13YXJuaW5nCisgIENDVGVzdEVudW0gU2lsZW5jZVdpdGhDYXN0MyA9IChjb25zdCBDQ1Rlc3RFbnVtKSA1MTsgLy8gbm8td2FybmluZworICBDQ1Rlc3RFbnVtIFNpbGVuY2VXaXRoQ2FzdDQgPSAoY29uc3Qgdm9sYXRpbGUgQ0NUZXN0RW51bSkgNTE7IC8vIG5vLXdhcm5pbmcKKworICBjb25zdCBDQ1Rlc3RFbnVtIFNpbGVuY2VXaXRoQ2FzdDFjID0gNTE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbnRlZ2VyIGNvbnN0YW50IG5vdCBpbiByYW5nZSBvZiBlbnVtZXJhdGVkIHR5cGUgJ0NDVGVzdEVudW0nfX0KKyAgY29uc3QgQ0NUZXN0RW51bSBTaWxlbmNlV2l0aENhc3QyYyA9IChDQ1Rlc3RFbnVtKSA1MTsgLy8gbm8td2FybmluZworICBjb25zdCBDQ1Rlc3RFbnVtIFNpbGVuY2VXaXRoQ2FzdDNjID0gKGNvbnN0IENDVGVzdEVudW0pIDUxOyAvLyBuby13YXJuaW5nCisgIGNvbnN0IENDVGVzdEVudW0gU2lsZW5jZVdpdGhDYXN0NGMgPSAoY29uc3Qgdm9sYXRpbGUgQ0NUZXN0RW51bSkgNTE7IC8vIG5vLXdhcm5pbmcKK30KKwogQ0NUZXN0RW51bSBmb28oQ0NUZXN0RW51bSByKSB7CiAgIHJldHVybiAyMDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2ludGVnZXIgY29uc3RhbnQgbm90IGluIHJhbmdlIG9mIGVudW1lcmF0ZWQgdHlwZSAnQ0NUZXN0RW51bSd9fQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL3dhcm4tdGhyZWFkLXNhZmV0eS1hbmFseXNpcy5jIGIvdGVzdC9TZW1hL3dhcm4tdGhyZWFkLXNhZmV0eS1hbmFseXNpcy5jCmluZGV4IDE5MThhY2UuLjZkNDFlNDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYS93YXJuLXRocmVhZC1zYWZldHktYW5hbHlzaXMuYworKysgYi90ZXN0L1NlbWEvd2Fybi10aHJlYWQtc2FmZXR5LWFuYWx5c2lzLmMKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZyAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLVd0aHJlYWQtc2FmZXR5IC1XdGhyZWFkLXNhZmV0eS1iZXRhIC1mY3h4LWV4Y2VwdGlvbnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLVd0aHJlYWQtc2FmZXR5IC1XdGhyZWFkLXNhZmV0eS1iZXRhICVzCiAKICNkZWZpbmUgTE9DS0FCTEUgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fICgobG9ja2FibGUpKQogI2RlZmluZSBTQ09QRURfTE9DS0FCTEUgICAgIF9fYXR0cmlidXRlX18gKChzY29wZWRfbG9ja2FibGUpKQpAQCAtMzEsMTUgKzMxLDEyIEBACiAgIHN0cnVjdCBNdXRleCAqbXVfOwogfTsKIAotLy8gRGVmaW5lIG11dGV4IGxvY2svdW5sb2NrIGZ1bmN0aW9ucy4KLXZvaWQgbXV0ZXhfZXhjbHVzaXZlX2xvY2soc3RydWN0IE11dGV4ICptdSkgRVhDTFVTSVZFX0xPQ0tfRlVOQ1RJT04obXUpIHsKLX0KLQotdm9pZCBtdXRleF9zaGFyZWRfbG9jayhzdHJ1Y3QgTXV0ZXggKm11KSBTSEFSRURfTE9DS19GVU5DVElPTihtdSkgewotfQotCi12b2lkIG11dGV4X3VubG9jayhzdHJ1Y3QgTXV0ZXggKm11KSBVTkxPQ0tfRlVOQ1RJT04obXUpIHsKLX0KKy8vIERlY2xhcmUgbXV0ZXggbG9jay91bmxvY2sgZnVuY3Rpb25zLgordm9pZCBtdXRleF9leGNsdXNpdmVfbG9jayhzdHJ1Y3QgTXV0ZXggKm11KSBFWENMVVNJVkVfTE9DS19GVU5DVElPTihtdSk7Cit2b2lkIG11dGV4X3NoYXJlZF9sb2NrKHN0cnVjdCBNdXRleCAqbXUpIFNIQVJFRF9MT0NLX0ZVTkNUSU9OKG11KTsKK3ZvaWQgbXV0ZXhfdW5sb2NrKHN0cnVjdCBNdXRleCAqbXUpIFVOTE9DS19GVU5DVElPTihtdSk7Cit2b2lkIG11dGV4X3NoYXJlZF91bmxvY2soc3RydWN0IE11dGV4ICptdSkgX19hdHRyaWJ1dGVfXygocmVsZWFzZV9zaGFyZWRfY2FwYWJpbGl0eShtdSkpKTsKK3ZvaWQgbXV0ZXhfZXhjbHVzaXZlX3VubG9jayhzdHJ1Y3QgTXV0ZXggKm11KSBfX2F0dHJpYnV0ZV9fKChyZWxlYXNlX2NhcGFiaWxpdHkobXUpKSk7CiAKIC8vIERlZmluZSBnbG9iYWwgdmFyaWFibGVzLgogc3RydWN0IE11dGV4IG11MTsKQEAgLTc3LDE0ICs3NCwxNCBAQAogCiBpbnQgbWFpbigpIHsKIAotICBGb29fZnVuMSgxKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Y2FsbGluZyBmdW5jdGlvbiAnRm9vX2Z1bjEnIHJlcXVpcmVzIHNoYXJlZCBsb2NrIG9uICdtdTInfX0gXAotICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtd2FybmluZ3t7Y2FsbGluZyBmdW5jdGlvbiAnRm9vX2Z1bjEnIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdtdTEnfX0KKyAgRm9vX2Z1bjEoMSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2NhbGxpbmcgZnVuY3Rpb24gJ0Zvb19mdW4xJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInfX0gXAorICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtd2FybmluZ3t7Y2FsbGluZyBmdW5jdGlvbiAnRm9vX2Z1bjEnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211MScgZXhjbHVzaXZlbHl9fQogCiAgIG11dGV4X2V4Y2x1c2l2ZV9sb2NrKCZtdTEpOwogICBtdXRleF9zaGFyZWRfbG9jaygmbXUyKTsKICAgRm9vX2Z1bjEoMSk7CiAKLSAgbXV0ZXhfc2hhcmVkX2xvY2soJm11MSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2xvY2tpbmcgJ211MScgdGhhdCBpcyBhbHJlYWR5IGxvY2tlZH19CisgIG11dGV4X3NoYXJlZF9sb2NrKCZtdTEpOyAvLyBleHBlY3RlZC13YXJuaW5ne3thY3F1aXJpbmcgbXV0ZXggJ211MScgdGhhdCBpcyBhbHJlYWR5IGhlbGR9fQogICBtdXRleF91bmxvY2soJm11MSk7CiAgIG11dGV4X3VubG9jaygmbXUyKTsKICAgbXV0ZXhfc2hhcmVkX2xvY2soJm11MSk7CkBAIC05OCwxMyArOTUsMTMgQEAKICAgbXV0ZXhfdW5sb2NrKCZtdTEpOwogCiAgIG11dGV4X2V4Y2x1c2l2ZV9sb2NrKCZtdTEpOwotICBGb29fZnVuYzMoNCk7ICAvLyBleHBlY3RlZC13YXJuaW5ne3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnRm9vX2Z1bmMzJyB3aGlsZSBtdXRleCAnbXUxJyBpcyBsb2NrZWR9fQorICBGb29fZnVuYzMoNCk7ICAvLyBleHBlY3RlZC13YXJuaW5ne3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnRm9vX2Z1bmMzJyB3aGlsZSBtdXRleCAnbXUxJyBpcyBoZWxkfX0KICAgbXV0ZXhfdW5sb2NrKCZtdTEpOwogCiAgIEZvb19mdW5jMyg1KTsKIAotICBzZXRfdmFsdWUoJmFfLCAwKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Y2FsbGluZyBmdW5jdGlvbiAnc2V0QScgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ2Zvb18ubXVfJ319Ci0gIGdldF92YWx1ZShiXyk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2NhbGxpbmcgZnVuY3Rpb24gJ2dldEInIHJlcXVpcmVzIHNoYXJlZCBsb2NrIG9uICdmb29fLm11Xyd9fQorICBzZXRfdmFsdWUoJmFfLCAwKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Y2FsbGluZyBmdW5jdGlvbiAnc2V0X3ZhbHVlJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdmb29fLm11XycgZXhjbHVzaXZlbHl9fQorICBnZXRfdmFsdWUoYl8pOyAvLyBleHBlY3RlZC13YXJuaW5ne3tjYWxsaW5nIGZ1bmN0aW9uICdnZXRfdmFsdWUnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2Zvb18ubXVfJ319CiAgIG11dGV4X2V4Y2x1c2l2ZV9sb2NrKGZvb18ubXVfKTsKICAgc2V0X3ZhbHVlKCZhXywgMSk7CiAgIG11dGV4X3VubG9jayhmb29fLm11Xyk7CkBAIC0xMTIsMTIgKzEwOSwyMCBAQAogICAodm9pZCkoZ2V0X3ZhbHVlKGJfKSA9PSAxKTsKICAgbXV0ZXhfdW5sb2NrKGZvb18ubXVfKTsKIAotICBjXyA9IDA7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e3dyaXRpbmcgdmFyaWFibGUgJ2NfJyByZXF1aXJlcyBsb2NraW5nIGFueSBtdXRleCBleGNsdXNpdmVseX19Ci0gICh2b2lkKSgqZF8gPT0gMCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2RfJyByZXF1aXJlcyBsb2NraW5nIGFueSBtdXRleH19CisgIGNfID0gMDsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7d3JpdGluZyB2YXJpYWJsZSAnY18nIHJlcXVpcmVzIGhvbGRpbmcgYW55IG11dGV4IGV4Y2x1c2l2ZWx5fX0KKyAgKHZvaWQpKCpkXyA9PSAwKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZF8nIHJlcXVpcmVzIGhvbGRpbmcgYW55IG11dGV4fX0KICAgbXV0ZXhfZXhjbHVzaXZlX2xvY2soZm9vXy5tdV8pOwogICBjXyA9IDE7CiAgICh2b2lkKSgqZF8gPT0gMSk7CiAgIG11dGV4X3VubG9jayhmb29fLm11Xyk7CiAKKyAgbXV0ZXhfZXhjbHVzaXZlX2xvY2soJm11MSk7CisgIG11dGV4X3NoYXJlZF91bmxvY2soJm11MSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxlYXNpbmcgbXV0ZXggJ211MScgdXNpbmcgc2hhcmVkIGFjY2VzcywgZXhwZWN0ZWQgZXhjbHVzaXZlIGFjY2Vzc319CisgIG11dGV4X2V4Y2x1c2l2ZV91bmxvY2soJm11MSk7CisKKyAgbXV0ZXhfc2hhcmVkX2xvY2soJm11MSk7CisgIG11dGV4X2V4Y2x1c2l2ZV91bmxvY2soJm11MSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxlYXNpbmcgbXV0ZXggJ211MScgdXNpbmcgZXhjbHVzaXZlIGFjY2VzcywgZXhwZWN0ZWQgc2hhcmVkIGFjY2Vzc319CisgIG11dGV4X3NoYXJlZF91bmxvY2soJm11MSk7CisKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvd2Fybi10eXBlLXNhZmV0eS5jIGIvdGVzdC9TZW1hL3dhcm4tdHlwZS1zYWZldHkuYwppbmRleCBkZmFiOGY4Li4wNDMxMzg2IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvd2Fybi10eXBlLXNhZmV0eS5jCisrKyBiL3Rlc3QvU2VtYS93YXJuLXR5cGUtc2FmZXR5LmMKQEAgLTU3LDYgKzU3LDggQEAKICAgICBfX2F0dHJpYnV0ZV9fKCggdHlwZV90YWdfZm9yX2RhdGF0eXBlKG1waSxpbnQsbGF5b3V0X2NvbXBhdGlibGUsbm90X2FfZmxhZykgKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW52YWxpZCBjb21wYXJpc29uIGZsYWcgJ25vdF9hX2ZsYWcnfX0KIAogCit2b2lkIGRhdGF0eXBlX3dyb25nNyh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh0eXBlX3RhZ19mb3JfZGF0YXR5cGUoZGF0YXR5cGVfd3Jvbmc3LCBpbnQpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J3R5cGVfdGFnX2Zvcl9kYXRhdHlwZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXN9fQorCiAvLyBVc2luZyBhIHRhZyB3aXRoIGtpbmQgQSBpbiBhIHBsYWNlIHdoZXJlIHRoZSBmdW5jdGlvbiByZXF1aXJlcyBraW5kIEIgc2hvdWxkCiAvLyB3YXJuLgogCkBAIC0xNTYsNSArMTU4LDMgQEAKICAgRl9mdW5jKGZsb2F0X3B0ciwgMHhGRkZGRkZGRkZGRkZGRkZGVUxMKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2FyZ3VtZW50IHR5cGUgJ2Zsb2F0IConIGRvZXNuJ3QgbWF0Y2ggc3BlY2lmaWVkICdmJyB0eXBlIHRhZyB0aGF0IHJlcXVpcmVzICdpbnQgKid9fQogICBGX2Z1bmMoZmxvYXRfcHRyLCAweEZGRkZGRkZGVUxMKTsKIH0KLQotCmRpZmYgLS1naXQgYS90ZXN0L1NlbWEvd2Fybi11bnJlYWNoYWJsZS5jIGIvdGVzdC9TZW1hL3dhcm4tdW5yZWFjaGFibGUuYwppbmRleCBmZDc0YjVjLi4wZDIyOTY1IDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvd2Fybi11bnJlYWNoYWJsZS5jCisrKyBiL3Rlc3QvU2VtYS93YXJuLXVucmVhY2hhYmxlLmMKQEAgLTEsNCArMSw2IEBACi0vLyBSVU46ICVjbGFuZyAlcyAtZnN5bnRheC1vbmx5IC1YY2xhbmcgLXZlcmlmeSAtZmJsb2NrcyAtV3VucmVhY2hhYmxlLWNvZGUgLVduby11bnVzZWQtdmFsdWUgLVduby1jb3ZlcmVkLXN3aXRjaC1kZWZhdWx0CisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1mYmxvY2tzIC1XdW5yZWFjaGFibGUtY29kZS1hZ2dyZXNzaXZlIC1Xbm8tdW51c2VkLXZhbHVlIC1Xbm8tY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCAtSSAlUy9JbnB1dHMKKworI2luY2x1ZGUgIndhcm4tdW5yZWFjaGFibGUuaCIKIAogaW50IGhhbHQoKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwogaW50IGxpdmUoKTsKQEAgLTEwNyw3ICsxMDksNyBAQAogICAgIGNhc2UgQzM6CiAgICAgICByZXR1cm4gMTsKICAgICBkZWZhdWx0OiB7Ci0gICAgICBpbnQgaSA9IDA7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e3dpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fQorICAgICAgaW50IGkgPSAwOyAvLyBuby13YXJuaW5nCiAgICAgICArK2k7CiAgICAgICByZXR1cm4gaTsKICAgICB9CkBAIC0xMzQsMTAgKzEzNiwyNjMgQEAKIAogLy8gVGVzdCBjYXNlIGZvciA8cmRhcjovL3Byb2JsZW0vMTEwMDU3NzA+LiAgV2Ugc2hvdWxkIHRyZWF0IGNvZGUgZ3VhcmRlZAogLy8gYnkgJ3ggJiAwJyBhbmQgJ3ggKiAwJyBhcyB1bnJlYWNoYWJsZS4KLXZvaWQgY2FsbGVkRnVuKCk7CitpbnQgY2FsbGVkRnVuKCk7CiB2b2lkIHRlc3RfbXVsX2FuZF96ZXJvKGludCB4KSB7CiAgIGlmICh4ICYgMCkgY2FsbGVkRnVuKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KICAgaWYgKDAgJiB4KSBjYWxsZWRGdW4oKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fQogICBpZiAoeCAqIDApIGNhbGxlZEZ1bigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19CiAgIGlmICgwICogeCkgY2FsbGVkRnVuKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KIH0KKwordm9pZCByYXplKCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK3ZvaWQgd2Fybl9oZXJlKCk7CisKK2ludCB0ZXN0X2JyZWFrX3ByZWNlZGVkX2J5X25vcmV0dXJuKGludCBpKSB7CisgIHN3aXRjaCAoaSkgeworICAgIGNhc2UgMToKKyAgICAgIHJhemUoKTsKKyAgICAgIGJyZWFrOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2JyZWFrJyB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KKyAgICBjYXNlIDI6CisgICAgICByYXplKCk7CisgICAgICBicmVhazsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydicmVhaycgd2lsbCBuZXZlciBiZSBleGVjdXRlZH19CisgICAgICB3YXJuX2hlcmUoKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fQorICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiAxOworICAgICAgYnJlYWs7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgICBicmVhazsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fQorICB9CisgIHJldHVybiBpOworfQorCisvLyBEb24ndCB3YXJuIGFib3V0IHVucmVhY2hhYmxlICdkZWZhdWx0JyBjYXNlcywgYXMgdGhhdCBpcyBjb3ZlcmVkCisvLyBieSAtV2NvdmVyZWQtc3dpdGNoLWRlZmF1bHQuCit0eXBlZGVmIGVudW0geyBWYWx1ZTEgPSAxIH0gTXlFbnVtOwordm9pZCB1bnJlYWNoYWJsZV9kZWZhdWx0KE15RW51bSBlKSB7CisgIHN3aXRjaCAoZSkgeworICBjYXNlIFZhbHVlMToKKyAgICBjYWxsZWRGdW4oKTsKKyAgICBicmVhazsKKyAgY2FzZSAyOiAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FzZSB2YWx1ZSBub3QgaW4gZW51bWVyYXRlZCB0eXBlICdNeUVudW0nfX0KKyAgICBjYWxsZWRGdW4oKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBjYWxsZWRGdW4oKTsgLy8gbm8td2FybmluZworICAgIGJyZWFrOworICB9Cit9Cit2b2lkIHVucmVhY2hhYmxlX2luX2RlZmF1bHQoTXlFbnVtIGUpIHsKKyAgc3dpdGNoIChlKSB7CisgIGRlZmF1bHQ6CisgICAgcmF6ZSgpOworICAgIGNhbGxlZEZ1bigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19CisgICAgYnJlYWs7CisgIH0KK30KKworLy8gRG9uJ3Qgd2FybiBhYm91dCB0cml2aWFsIGRlYWQgcmV0dXJucy4KK2ludCB0cml2aWFsX2RlYWRfcmV0dXJuKCkgeworICByYXplKCk7CisgIHJldHVybiAoKDApKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydyZXR1cm4nIHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fQorfQorCit2b2lkIHRyaXZpYWxfZGVhZF9yZXR1cm5fdm9pZCgpIHsKKyAgcmF6ZSgpOworICByZXR1cm47IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sncmV0dXJuJyB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KK30KKworTXlFbnVtIHRyaXZhbF9kZWFkX3JldHVybl9lbnVtKCkgeworICByYXplKCk7CisgIHJldHVybiBWYWx1ZTE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sncmV0dXJuJyB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KK30KKworTXlFbnVtIHRyaXZpYWxfZGVhZF9yZXR1cm5fZW51bV8yKGludCB4KSB7CisgIHN3aXRjaCAoeCkgeworICAgIGNhc2UgMTogcmV0dXJuIDE7CisgICAgY2FzZSAyOiByZXR1cm4gMjsKKyAgICBjYXNlIDM6IHJldHVybiAzOworICAgIGRlZmF1bHQ6IHJldHVybiA0OworICB9CisKKyAgcmV0dXJuIDI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KK30KKworY29uc3QgY2hhciAqdHJpdmlhbF9kZWFkX3JldHVybl9jc3RyKCkgeworICByYXplKCk7CisgIHJldHVybiAiIjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JldHVybicgd2lsbCBuZXZlciBiZSBleGVjdXRlZH19Cit9CisKK2NoYXIgdHJpdmlhbF9kZWFkX3JldHVybl9jaGFyKCkgeworICByYXplKCk7CisgIHJldHVybiAnICc7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZXR1cm4nIHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fQorfQorCitNeUVudW0gbm9udHJpdmlhbF9kZWFkX3JldHVybl9lbnVtXzIoaW50IHgpIHsKKyAgc3dpdGNoICh4KSB7CisgICAgY2FzZSAxOiByZXR1cm4gMTsKKyAgICBjYXNlIDI6IHJldHVybiAyOworICAgIGNhc2UgMzogcmV0dXJuIDM7CisgICAgZGVmYXVsdDogcmV0dXJuIDQ7CisgIH0KKworICByZXR1cm4gY2FsbGVkRnVuKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KK30KKworZW51bSBYIHsgQSwgQiwgQyB9OworCitpbnQgY292ZXJlZF9zd2l0Y2goZW51bSBYIHgpIHsKKyAgc3dpdGNoICh4KSB7CisgIGNhc2UgQTogcmV0dXJuIDE7CisgIGNhc2UgQjogcmV0dXJuIDI7CisgIGNhc2UgQzogcmV0dXJuIDM7CisgIH0KKyAgcmV0dXJuIDQ7IC8vIG5vLXdhcm5pbmcKK30KKworLy8gVGVzdCB1bnJlYWNoYWJsZSBjb2RlIGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uIHZhbHVlcworI2RlZmluZSBDT05GSUdfQ09OU1RBTlQgMQoraW50IHRlc3RfY29uZmlnX2NvbnN0YW50KGludCB4KSB7CisgIGlmICghQ09ORklHX0NPTlNUQU5UKSB7CisgICAgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoITEpIHsgLy8gZXhwZWN0ZWQtbm90ZSB7e3NpbGVuY2UgYnkgYWRkaW5nIHBhcmVudGhlc2VzIHRvIG1hcmsgY29kZSBhcyBleHBsaWNpdGx5IGRlYWR9fQorICAgIGNhbGxlZEZ1bigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHNpemVvZihpbnQpID4gc2l6ZW9mKGNoYXIpKSB7CisgICAgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoeCA+IDEwKQorICAgIHJldHVybiBDT05GSUdfQ09OU1RBTlQgPyBjYWxsZWRGdW4oKSA6IGNhbGxlZEZ1bigpOyAvLyBuby13YXJuaW5nCisgIGVsc2UKKyAgICByZXR1cm4gMSA/IC8vIGV4cGVjdGVkLW5vdGUge3tzaWxlbmNlIGJ5IGFkZGluZyBwYXJlbnRoZXNlcyB0byBtYXJrIGNvZGUgYXMgZXhwbGljaXRseSBkZWFkfX0KKyAgICAgIGNhbGxlZEZ1bigpIDoKKyAgICAgIGNhbGxlZEZ1bigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19Cit9CisKK2ludCBzaXplb2ZfaW50KGludCB4LCBpbnQgeSkgeworICBpZiAoc2l6ZW9mKGxvbmcpID09IHNpemVvZihpbnQpKQorICAgIHJldHVybiAxOyAvLyBuby13YXJuaW5nCisgIGlmIChzaXplb2YobG9uZykgIT0gc2l6ZW9mKGludCkpCisgICAgcmV0dXJuIDA7IC8vIG5vLXdhcm5pbmcKKyAgaWYgKHggJiYgeSAmJiBzaXplb2YobG9uZykgPCBzaXplb2YoY2hhcikpCisgICAgcmV0dXJuIDA7IC8vIG5vLXdhcm5pbmcKKyAgcmV0dXJuIDI7IC8vIG5vLXdhcm5pbmcKK30KKworZW51bSBNeUVudW0yIHsKKyAgTUVfQSA9IENPTkZJR19DT05TVEFOVCwKKyAgTUVfQiA9IDEKK307CisKK2ludCB0ZXN0X015RW51bSgpIHsKKyAgaWYgKCFNRV9BKQorICAgIHJldHVybiAxOyAvLyBuby13YXJuaW5nCisgIGlmIChNRV9BKQorICAgIHJldHVybiAyOyAvLyBuby13YXJuaW5nCisgIGlmIChNRV9CKQorICAgIHJldHVybiAzOworICBpZiAoIU1FX0IpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KKyAgICByZXR1cm4gNDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fQorICByZXR1cm4gNTsKK30KKworLy8gVGVzdCBmb3IgaWRpb21hdGljIGRvLi53aGlsZS4KK2ludCB0ZXN0X2RvX3doaWxlKGludCB4KSB7CisgIGRvIHsKKyAgICBpZiAoeCA9PSBjYWxsZWRGdW4oKSkKKyAgICAgIGJyZWFrOworICAgICsreDsKKyAgICBicmVhazsKKyAgfQorICB3aGlsZSAoMCk7IC8vIG5vLXdhcm5pbmcKKyAgcmV0dXJuIHg7Cit9CisKK2ludCB0ZXN0X2RvX3doaWxlX25vbnRyaXZpYWxfY29uZChpbnQgeCkgeworICBkbyB7CisgICAgaWYgKHggPT0gY2FsbGVkRnVuKCkpCisgICAgICBicmVhazsKKyAgICArK3g7CisgICAgYnJlYWs7CisgIH0KKyAgd2hpbGUgKGNhbGxlZEZ1bigpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fQorICByZXR1cm4geDsKK30KKworLy8gRGlhZ25vc3RpYyBjb250cm9sOiAtV3VucmVhY2hhYmxlLWNvZGUtcmV0dXJuLgorCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW5yZWFjaGFibGUtY29kZS1yZXR1cm4iCisKK3ZvaWQgdHJpdmlhbF9kZWFkX3JldHVybl92b2lkX1NVUFBSRVNTRUQoKSB7CisgIHJhemUoKTsKKyAgcmV0dXJuOyAvLyBuby13YXJuaW5nCit9CisKK015RW51bSB0cml2YWxfZGVhZF9yZXR1cm5fZW51bV9TVVBQUkVTU0VEKCkgeworICByYXplKCk7CisgIHJldHVybiBWYWx1ZTE7IC8vIG5vLXdhcm5pbmcKK30KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorCisvLyBEaWFnbm9zdGljIGNvbnRyb2w6IC1XdW5yZWFjaGFibGUtY29kZS1icmVhay4KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VucmVhY2hhYmxlLWNvZGUtYnJlYWsiCisKK2ludCB0ZXN0X2JyZWFrX3ByZWNlZGVkX2J5X25vcmV0dXJuX1NVUFBSRVNTRUQoaW50IGkpIHsKKyAgc3dpdGNoIChpKSB7CisgICAgY2FzZSAxOgorICAgICAgcmF6ZSgpOworICAgICAgYnJlYWs7IC8vIG5vLXdhcm5pbmcKKyAgICBjYXNlIDI6CisgICAgICByYXplKCk7CisgICAgICBicmVhazsgLy8gbm8td2FybmluZworICAgICAgd2Fybl9oZXJlKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gMTsKKyAgICAgIGJyZWFrOyAvLyBuby13YXJuaW5nCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgICAgYnJlYWs7IC8vIG5vLXdhcm5pbmcKKyAgfQorICByZXR1cm4gaTsKK30KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorCisvLyBUZXN0ICJzaWxlbmNpbmciIHdpdGggcGFyZW50aGVzZXMuCit2b2lkIHRlc3Rfd2l0aF9wYXJlbl9zaWxlbmNpbmcoaW50IHgpIHsKKyAgaWYgKDApIGNhbGxlZEZ1bigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19IGV4cGVjdGVkLW5vdGUge3tzaWxlbmNlIGJ5IGFkZGluZyBwYXJlbnRoZXNlcyB0byBtYXJrIGNvZGUgYXMgZXhwbGljaXRseSBkZWFkfX0KKyAgaWYgKCgwKSkgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKworICBpZiAoMSkgLy8gZXhwZWN0ZWQtbm90ZSB7e3NpbGVuY2UgYnkgYWRkaW5nIHBhcmVudGhlc2VzIHRvIG1hcmsgY29kZSBhcyBleHBsaWNpdGx5IGRlYWR9fQorICAgIGNhbGxlZEZ1bigpOworICBlbHNlCisgICAgY2FsbGVkRnVuKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KKworICBpZiAoKDEpKQorICAgIGNhbGxlZEZ1bigpOworICBlbHNlCisgICAgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKyAgCisgIGlmICghMSkgLy8gZXhwZWN0ZWQtbm90ZSB7e3NpbGVuY2UgYnkgYWRkaW5nIHBhcmVudGhlc2VzIHRvIG1hcmsgY29kZSBhcyBleHBsaWNpdGx5IGRlYWR9fQorICAgIGNhbGxlZEZ1bigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y29kZSB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KKyAgZWxzZQorICAgIGNhbGxlZEZ1bigpOworICAKKyAgaWYgKCghMSkpCisgICAgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKyAgZWxzZQorICAgIGNhbGxlZEZ1bigpOworICAKKyAgaWYgKCEoMSkpCisgICAgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKyAgZWxzZQorICAgIGNhbGxlZEZ1bigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hL3djaGFyLmMgYi90ZXN0L1NlbWEvd2NoYXIuYwppbmRleCAxM2MyZjU4Li43NGU0ODJhIDEwMDY0NAotLS0gYS90ZXN0L1NlbWEvd2NoYXIuYworKysgYi90ZXN0L1NlbWEvd2NoYXIuYwpAQCAtMSw1ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nICVzIC1mc3ludGF4LW9ubHkgLVhjbGFuZyAtdmVyaWZ5Ci0vLyBSVU46ICVjbGFuZyAlcyAtZnN5bnRheC1vbmx5IC1mc2hvcnQtd2NoYXIgLVhjbGFuZyAtdmVyaWZ5IC1EU0hPUlRfV0NIQVIKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZnN5bnRheC1vbmx5IC12ZXJpZnkKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZnN5bnRheC1vbmx5IC1mc2hvcnQtd2NoYXIgLXZlcmlmeSAtRFNIT1JUX1dDSEFSCiAKIHR5cGVkZWYgX19XQ0hBUl9UWVBFX18gd2NoYXJfdDsKIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1VEQS9jdWRhLmggYi90ZXN0L1NlbWFDVURBL2N1ZGEuaAppbmRleCAyNmE4ZGYwLi5hOWE0NTk1IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDVURBL2N1ZGEuaAorKysgYi90ZXN0L1NlbWFDVURBL2N1ZGEuaApAQCAtNyw2ICs3LDcgQEAKICNkZWZpbmUgX19nbG9iYWxfXyBfX2F0dHJpYnV0ZV9fKChnbG9iYWwpKQogI2RlZmluZSBfX2hvc3RfXyBfX2F0dHJpYnV0ZV9fKChob3N0KSkKICNkZWZpbmUgX19zaGFyZWRfXyBfX2F0dHJpYnV0ZV9fKChzaGFyZWQpKQorI2RlZmluZSBfX2xhdW5jaF9ib3VuZHNfXyguLi4pIF9fYXR0cmlidXRlX18oKGxhdW5jaF9ib3VuZHMoX19WQV9BUkdTX18pKSkKIAogc3RydWN0IGRpbTMgewogICB1bnNpZ25lZCB4LCB5LCB6OwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1VEQS9sYXVuY2hfYm91bmRzLmN1IGIvdGVzdC9TZW1hQ1VEQS9sYXVuY2hfYm91bmRzLmN1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYTRlNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWFDVURBL2xhdW5jaF9ib3VuZHMuY3UKQEAgLTAsMCArMSwxNCBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcw0KKw0KKyNpbmNsdWRlICJjdWRhLmgiDQorDQorX19sYXVuY2hfYm91bmRzX18oMTI4LCA3KSB2b2lkIFRlc3QxKHZvaWQpOw0KK19fbGF1bmNoX2JvdW5kc19fKDEyOCkgdm9pZCBUZXN0Mih2b2lkKTsNCisNCitfX2xhdW5jaF9ib3VuZHNfXygxLCAyLCAzKSB2b2lkIFRlc3QzKHZvaWQpOyAvLyBleHBlY3RlZC1lcnJvciB7eydsYXVuY2hfYm91bmRzJyBhdHRyaWJ1dGUgdGFrZXMgbm8gbW9yZSB0aGFuIDIgYXJndW1lbnRzfX0NCisNCisvLyBGSVhNRTogdGhlIGVycm9yIHNob3VsZCByZWFkIHRoYXQgdGhlIGF0dHJpYnV0ZSB0YWtlcyBleGFjdGx5IG9uZSBvciB0d28gYXJndW1lbnRzLCBidXQgdGhlcmUNCisvLyBpcyBubyBzdXBwb3J0IGZvciBzdWNoIGEgZGlhZ25vc3RpYyBjdXJyZW50bHkuDQorX19sYXVuY2hfYm91bmRzX18oKSB2b2lkIFRlc3Q0KHZvaWQpOyAvLyBleHBlY3RlZC1lcnJvciB7eydsYXVuY2hfYm91bmRzJyBhdHRyaWJ1dGUgdGFrZXMgbm8gbW9yZSB0aGFuIDIgYXJndW1lbnRzfX0NCisNCitpbnQgVGVzdDUgX19sYXVuY2hfYm91bmRzX18oMTI4LCA3KTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydsYXVuY2hfYm91bmRzJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9ucyBhbmQgbWV0aG9kc319DQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL01pY3Jvc29mdENvbXBhdGliaWxpdHkuY3BwIGIvdGVzdC9TZW1hQ1hYL01pY3Jvc29mdENvbXBhdGliaWxpdHkuY3BwCmluZGV4IDA1MDM3YWMuLmZiN2Q5NzUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9NaWNyb3NvZnRDb21wYXRpYmlsaXR5LmNwcAorKysgYi90ZXN0L1NlbWFDWFgvTWljcm9zb2Z0Q29tcGF0aWJpbGl0eS5jcHAKQEAgLTMsNiArMyw3IEBACiAKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgY2hhcjE2X3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBjaGFyMzJfdDsKK3N0cnVjdCBfQXRvbWljIHt9OwogCiB0eXBlbmFtZSBkZWNsdHlwZSgzKSBhOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwZWN0ZWQgYSBxdWFsaWZpZWQgbmFtZSBhZnRlciAndHlwZW5hbWUnfX0KIApAQCAtMjEsNiArMjIsMTIgQEAKIH0KIAogCituYW1lc3BhY2UgbXNfcHJlZGVmaW5lZF90eXBlcyB7CisgIC8vIDo6dHlwZV9pbmZvIGlzIGEgYnVpbHQtaW4gZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbi4KKyAgdm9pZCBmKGNvbnN0IHR5cGVfaW5mbyAmYSk7CisgIHZvaWQgZihzaXplX3QpOworfQorCiAKIG5hbWVzcGFjZSBtc19wcm90ZWN0ZWRfc2NvcGUgewogICBzdHJ1Y3QgQyB7IEMoKTsgfTsKQEAgLTEwNSw2ICsxMTIsOSBAQAogY2xhc3MgQiA6IHB1YmxpYyBBIHsKIHByaXZhdGU6ICAgCiAgIHVzaW5nIEE6OmY7CisgIHZvaWQgZygpIHsKKyAgICBmKCk7IC8vIG5vIGRpYWdub3N0aWMKKyAgfQogfTsKIAogY2xhc3MgQyA6IHB1YmxpYyBCIHsgCkBAIC0xMTQsNiArMTI0LDI3IEBACiAKIH0KIAorbmFtZXNwYWNlIHVzaW5nX3RhZ19yZWRlY2xhcmF0aW9uCit7CisgIHN0cnVjdCBTOworICBuYW1lc3BhY2UgTiB7CisgICAgdXNpbmcgOjp1c2luZ190YWdfcmVkZWNsYXJhdGlvbjo6UzsKKyAgICBzdHJ1Y3QgUyB7fTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzIGRlZmluaXRpb24gaXMgaGVyZX19CisgIH0KKyAgdm9pZCBmKCkgeworICAgIE46OlMgczE7CisgICAgUyBzMjsKKyAgfQorICB2b2lkIGcoKSB7CisgICAgc3RydWN0IFM7IC8vIGV4cGVjdGVkLW5vdGUge3tmb3J3YXJkIGRlY2xhcmF0aW9uIG9mICdTJ319CisgICAgUyBzMzsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2YXJpYWJsZSBoYXMgaW5jb21wbGV0ZSB0eXBlICdTJ319CisgIH0KKyAgdm9pZCBoKCkgeworICAgIHVzaW5nIDo6dXNpbmdfdGFnX3JlZGVjbGFyYXRpb246OlM7CisgICAgc3RydWN0IFMge307IC8vIGV4cGVjdGVkLWVycm9yIHt7cmVkZWZpbml0aW9uIG9mICdTJ319CisgIH0KK30KKwogCiBuYW1lc3BhY2UgTWlzc2luZ1R5cGVuYW1lIHsKIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL01pY3Jvc29mdEV4dGVuc2lvbnMuY3BwIGIvdGVzdC9TZW1hQ1hYL01pY3Jvc29mdEV4dGVuc2lvbnMuY3BwCmluZGV4IGM1YjQ1YTIuLjBmNmViYmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9NaWNyb3NvZnRFeHRlbnNpb25zLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvTWljcm9zb2Z0RXh0ZW5zaW9ucy5jcHAKQEAgLTEsMTAgKzEsNiBAQAogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtZnN5bnRheC1vbmx5IC1XbWljcm9zb2Z0IC1XYysrMTEtZXh0ZW5zaW9ucyAtV25vLWxvbmctbG9uZyAtdmVyaWZ5IC1mbXMtZXh0ZW5zaW9ucyAtZmV4Y2VwdGlvbnMgLWZjeHgtZXhjZXB0aW9ucwogCiAKLS8vIDo6dHlwZV9pbmZvIGlzIHByZWRlY2xhcmVkIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJ0aW9uCi12b2lkIGYoY29uc3QgdHlwZV9pbmZvICZhKTsKLQotCiAvLyBNaWNyb3NvZnQgZG9lc24ndCB2YWxpZGF0ZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4KIG5hbWVzcGFjZSBtaWNyb3NvZnRfZXhjZXB0aW9uX3NwZWMgewogCkBAIC0zNywxMSArMzMsMTEgQEAKIC8vIE1TVkMgYWxsb3dzIHR5cGUgZGVmaW5pdGlvbiBpbiBhbm9ueW1vdXMgdW5pb24gYW5kIHN0cnVjdAogc3RydWN0IEEKIHsKLSAgdW5pb24gCisgIHVuaW9uCiAgIHsKICAgICBpbnQgYTsKICAgICBzdHJ1Y3QgQiAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3R5cGVzIGRlY2xhcmVkIGluIGFuIGFub255bW91cyB1bmlvbiBhcmUgYSBNaWNyb3NvZnQgZXh0ZW5zaW9ufX0KLSAgICB7IAorICAgIHsKICAgICAgIGludCBjOwogICAgIH0gZDsKIApAQCAtNjMsNyArNTksNyBAQAogICAgIHsKICAgICAgIGludCBjMjsKICAgICB9IGQyOwotICAgIAorCiAJdW5pb24gQzIgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t0eXBlcyBkZWNsYXJlZCBpbiBhbiBhbm9ueW1vdXMgc3RydWN0IGFyZSBhIE1pY3Jvc29mdCBleHRlbnNpb259fQogICAgIHsKICAgICAgIGludCBlMjsKQEAgLTc4LDcgKzc0LDcgQEAKIC8vIF9fc3RkY2FsbCBoYW5kbGluZwogc3RydWN0IE0gewogICAgIGludCBfX3N0ZGNhbGwgYWRkUCgpOwotICAgIGZsb2F0IF9fc3RkY2FsbCBzdWJ0cmFjdFAoKTsgCisgICAgZmxvYXQgX19zdGRjYWxsIHN1YnRyYWN0UCgpOwogfTsKIAogLy8gX191bmFsaWduZWQgaGFuZGxpbmcKQEAgLTkwLDcgKzg2LDcgQEAKIHZvaWQgbTEoKSB7CiAgIGgxPGludD4oJk06OmFkZFApOwogICBoMSgmTTo6c3VidHJhY3RQKTsKLX0gCit9CiAKIAogCkBAIC05OCw3ICs5NCw3IEBACiAKIHZvaWQgZihsb25nIGxvbmcpOwogdm9pZCBmKGludCk7Ci0gCisKIGludCBtYWluKCkKIHsKICAgLy8gVGhpcyBpcyBhbiBhbWJpZ3VvdXMgY2FsbCBpbiBzdGFuZGFyZCBDKysuCkBAIC0xMjMsMTAgKzExOSwxMSBAQAogCiBjbGFzcyBBQUEgewogX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgZih2b2lkKSB7IH0KLXZvaWQgZjIodm9pZCk7Cit2b2lkIGYyKHZvaWQpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KIH07CiAKLV9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIEFBQTo6ZjIodm9pZCkgeyAvLyBleHBlY3RlZC1lcnJvciB7e2RsbGltcG9ydCBhdHRyaWJ1dGUgY2FuIGJlIGFwcGxpZWQgb25seSB0byBzeW1ib2x9fQorX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgQUFBOjpmMih2b2lkKSB7IC8vIGV4cGVjdGVkLWVycm9ye3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgY2FuIGJlIGFwcGxpZWQgb25seSB0byBzeW1ib2x9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLWVycm9yQC0xe3tyZWRlY2xhcmF0aW9uIG9mICdBQUE6OmYyJyBjYW5ub3QgYWRkICdkbGxpbXBvcnQnIGF0dHJpYnV0ZX19CiAKIH0KIApAQCAtMzA3LDcgKzMwNCw3IEBACiAgIF9fZGVjbHNwZWMocHJvcGVydHkoZ2V0PUdldFYsIHB1dD1TZXRWKSkgVCBWOwogICBUIEdldFYoKSB7IHJldHVybiAwOyB9CiAgIHZvaWQgU2V0VihUIHYpIHt9Ci0gIHZvaWQgZigpIHsgViA9IHRoaXMtPlY7IFYgPCB0aGlzLT5WOyB9CisgIGJvb2wgZigpIHsgViA9IHRoaXMtPlY7IHJldHVybiBWIDwgdGhpcy0+VjsgfQogICB2b2lkIGcoKSB7IFYrKzsgfQogICB2b2lkIGgoKSB7IFYqPTI7IH0KIH07CkBAIC0zNjgsMTggKzM2NSwxOCBAQAogCiBuYW1lc3BhY2UgcmRhcjE0MjUwMzc4IHsKICAgY2xhc3MgQmFyIHt9OwotICAKKwogICBuYW1lc3BhY2UgTnlOYW1lc3BhY2UgewogICAgIGNsYXNzIEZvbyB7CiAgICAgcHVibGljOgogICAgICAgQmFyKiBFbnN1cmVCYXIoKTsKICAgICB9OwotICAgIAorCiAgICAgY2xhc3MgQmF6IDogcHVibGljIEZvbyB7CiAgICAgcHVibGljOgogICAgICAgZnJpZW5kIGNsYXNzIEJhcjsKICAgICB9OwotICAgIAorCiAgICAgQmFyKiBGb286OkVuc3VyZUJhcigpIHsKICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTQxMCwzICs0MDcsMTQgQEAKIAogLy8gZXhwZWN0ZWQtZXJyb3JAKzEge3tiYXNlICdTZWFsZWRUeXBlJyBpcyBtYXJrZWQgJ3NlYWxlZCd9fQogc3RydWN0IEluaGVyaXRGcm9tU2VhbGVkIDogU2VhbGVkVHlwZSB7fTsKKwordm9pZCBBZnRlckNsYXNzQm9keSgpIHsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0ArMSB7e2F0dHJpYnV0ZSAnZGVwcmVjYXRlZCcgaXMgaWdub3JlZCwgcGxhY2UgaXQgYWZ0ZXIgInN0cnVjdCIgdG8gYXBwbHkgYXR0cmlidXRlIHRvIHR5cGUgZGVjbGFyYXRpb259fQorICBzdHJ1Y3QgRCB7fSBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQpOworCisgIHN0cnVjdCBfX2RlY2xzcGVjKGFsaWduKDQpKSBTIHt9IF9fZGVjbHNwZWMoYWxpZ24oOCkpIHMxOworICBTIHMyOworICBfU3RhdGljX2Fzc2VydChfX2FsaWdub2YoUykgPT0gNCwgIiIpOworICBfU3RhdGljX2Fzc2VydChfX2FsaWdub2YoczEpID09IDgsICIiKTsKKyAgX1N0YXRpY19hc3NlcnQoX19hbGlnbm9mKHMyKSA9PSA0LCAiIik7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvUFI4MDEyLmNwcCBiL3Rlc3QvU2VtYUNYWC9QUjgwMTIuY3BwCmluZGV4IDljZmMyYjAuLjBhNDNhZjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9QUjgwMTIuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9QUjgwMTIuY3BwCkBAIC0xLDMgKzEsMyBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAtc3RkPWMrKzExCiAKLXZvaWQgZm9vIChpbnQgb3BlcmF0b3IrKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2Nhbm5vdCBiZSB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlcn19Cit2b2lkIGZvbyhpbnQgb3BlcmF0b3IrKTsgLy8gZXhwZWN0ZWQtZXJyb3J7eydvcGVyYXRvcisnIGNhbm5vdCBiZSB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlcn19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvYWJzdHJhY3QuY3BwIGIvdGVzdC9TZW1hQ1hYL2Fic3RyYWN0LmNwcAppbmRleCBkN2UyZDBhLi5iNTIxMTk2IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvYWJzdHJhY3QuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9hYnN0cmFjdC5jcHAKQEAgLTI2OCwxNiArMjY4LDE2IEBACiB9CiAKIG5hbWVzcGFjZSBwcjEyNjU4IHsKLSAgY2xhc3MgQyB7DQotICAgIHB1YmxpYzoNCi0gICAgICBDKGludCB2KXt9DQotICAgICAgdmlydHVhbCB2b2lkIGYoKSA9IDA7IC8vIGV4cGVjdGVkLW5vdGUge3t1bmltcGxlbWVudGVkIHB1cmUgdmlydHVhbCBtZXRob2QgJ2YnIGluICdDJ319DQotICB9Ow0KLQ0KLSAgdm9pZCBmb28oIEMmIGMgKSB7fQ0KLQ0KLSAgdm9pZCBiYXIoIHZvaWQgKSB7DQotICAgIGZvbyhDKDk5KSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YWxsb2NhdGluZyBhbiBvYmplY3Qgb2YgYWJzdHJhY3QgY2xhc3MgdHlwZSAncHIxMjY1ODo6Qyd9fQ0KKyAgY2xhc3MgQyB7CisgICAgcHVibGljOgorICAgICAgQyhpbnQgdil7fQorICAgICAgdmlydHVhbCB2b2lkIGYoKSA9IDA7IC8vIGV4cGVjdGVkLW5vdGUge3t1bmltcGxlbWVudGVkIHB1cmUgdmlydHVhbCBtZXRob2QgJ2YnIGluICdDJ319CisgIH07CisKKyAgdm9pZCBmb28oIEMmIGMgKSB7fQorCisgIHZvaWQgYmFyKCB2b2lkICkgeworICAgIGZvbyhDKDk5KSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YWxsb2NhdGluZyBhbiBvYmplY3Qgb2YgYWJzdHJhY3QgY2xhc3MgdHlwZSAncHIxMjY1ODo6Qyd9fQogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9hY2Nlc3MuY3BwIGIvdGVzdC9TZW1hQ1hYL2FjY2Vzcy5jcHAKaW5kZXggNWNjZDQxOC4uNWZhMTUwOSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2FjY2Vzcy5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2FjY2Vzcy5jcHAKQEAgLTEzNiwzICsxMzYsMjUgQEAKICAgICB9OwogICB9CiB9CisKK25hbWVzcGFjZSBMb2NhbEV4dGVyblZhciB7CisgIGNsYXNzIHRlc3QgeworICBwcml2YXRlOgorICAgIHN0cnVjdCBwcml2YXRlX3N0cnVjdCB7IC8vIGV4cGVjdGVkLW5vdGUgMnt7aGVyZX19CisgICAgICBpbnQgeDsKKyAgICB9OworICAgIGludCB1c2VfcHJpdmF0ZSgpOworICB9OworCisgIGludCB0ZXN0Ojp1c2VfcHJpdmF0ZSgpIHsKKyAgICBleHRlcm4gaW50IGFycmF5W3NpemVvZih0ZXN0Ojpwcml2YXRlX3N0cnVjdCldOyAvLyBvaworICAgIHJldHVybiBhcnJheVswXTsKKyAgfQorCisgIGludCBmKCkgeworICAgIGV4dGVybiBpbnQgYXJyYXlbc2l6ZW9mKHRlc3Q6OnByaXZhdGVfc3RydWN0KV07IC8vIGV4cGVjdGVkLWVycm9yIHt7cHJpdmF0ZX19CisgICAgcmV0dXJuIGFycmF5WzBdOworICB9CisKKyAgaW50IGFycmF5W3NpemVvZih0ZXN0Ojpwcml2YXRlX3N0cnVjdCldOyAvLyBleHBlY3RlZC1lcnJvciB7e3ByaXZhdGV9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2FkZHItb2Ytb3ZlcmxvYWRlZC1mdW5jdGlvbi5jcHAgYi90ZXN0L1NlbWFDWFgvYWRkci1vZi1vdmVybG9hZGVkLWZ1bmN0aW9uLmNwcAppbmRleCAyMzBhMWViLi4zNThmZThkIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvYWRkci1vZi1vdmVybG9hZGVkLWZ1bmN0aW9uLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvYWRkci1vZi1vdmVybG9hZGVkLWZ1bmN0aW9uLmNwcApAQCAtODQsNyArODQsNyBAQAogCiAgIHZvaWQgaCgpIHsKICAgICAvLyBEbyBub3Qgc3VnZ2VzdCAnKCknIHNpbmNlIGFuIGludCBhcmd1bWVudCBpcyByZXF1aXJlZAotICAgIHExPGludD47IC8vIGV4cGVjdGVkLWVycm9yLXJle3tyZWZlcmVuY2UgdG8gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQkfX0KKyAgICBxMTxpbnQ+OyAvLyBleHBlY3RlZC1lcnJvci1yZXt7cmVmZXJlbmNlIHRvIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVke3skfX19fQogICAgIC8vIFN1Z2dlc3QgJygpJyBzaW5jZSB0aGVyZSdzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG9ubHkgYXJndW1lbnQgJiB0aGUKICAgICAvLyB0eXBlIGFyZ3VtZW50IGlzIGFscmVhZHkgcHJvdmlkZWQKICAgICBxMjxpbnQ+OyAvLyBleHBlY3RlZC1lcnJvcnt7cmVmZXJlbmNlIHRvIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkOyBkaWQgeW91IG1lYW4gdG8gY2FsbCBpdCB3aXRoIG5vIGFyZ3VtZW50cz99fQpAQCAtOTIsNyArOTIsNyBAQAogICAgIC8vIGFscmVhZHkgcHJvdmlkZWQKICAgICBxMzxpbnQ+OyAvLyBleHBlY3RlZC1lcnJvcnt7cmVmZXJlbmNlIHRvIG5vbi1zdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkOyBkaWQgeW91IG1lYW4gdG8gY2FsbCBpdCB3aXRoIG5vIGFyZ3VtZW50cz99fQogICAgIC8vIERvIG5vdCBzdWdnZXN0ICcoKScgc2luY2UgYW5vdGhlciB0eXBlIGFyZ3VtZW50IGlzIHJlcXVpcmVkCi0gICAgcTQ8aW50PjsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e3JlZmVyZW5jZSB0byBub24tc3RhdGljIG1lbWJlciBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCR9fQorICAgIHE0PGludD47IC8vIGV4cGVjdGVkLWVycm9yLXJle3tyZWZlcmVuY2UgdG8gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWR7eyR9fX19CiAgICAgLy8gU3VnZ2VzdCAnKCknIHNpbmNlIHRoZSB0eXBlIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlCiAgICAgcTU7IC8vIGV4cGVjdGVkLWVycm9ye3tyZWZlcmVuY2UgdG8gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQ7IGRpZCB5b3UgbWVhbiB0byBjYWxsIGl0IHdpdGggbm8gYXJndW1lbnRzP319CiAgIH0KQEAgLTIyMCwyMCArMjIwLDIwIEBACiAKICAgdm9pZCBRdWFsaWZpZXJUZXN0KCkgewogICAgIHZvaWQgKFF1YWxpZmllcnM6OipYKSgpOwotICAgIFggPSAmUXVhbGlmaWVyczo6QzsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thc3NpZ25pbmcgdG8gJ3ZvaWQgKHRlc3QxOjpRdWFsaWZpZXJzOjoqKSgpJyBmcm9tIGluY29tcGF0aWJsZSB0eXBlICd2b2lkICh0ZXN0MTo6UXVhbGlmaWVyczo6KikoKSBjb25zdCc6IGRpZmZlcmVudCBxdWFsaWZpZXJzIChub25lIHZzIGNvbnN0KX19Ci0gICAgWCA9ICZRdWFsaWZpZXJzOjpWOyAvLyBleHBlY3RlZC1lcnJvcnt7YXNzaWduaW5nIHRvICd2b2lkICh0ZXN0MTo6UXVhbGlmaWVyczo6KikoKScgZnJvbSBpbmNvbXBhdGlibGUgdHlwZSAndm9pZCAodGVzdDE6OlF1YWxpZmllcnM6OiopKCkgdm9sYXRpbGUnOiBkaWZmZXJlbnQgcXVhbGlmaWVycyAobm9uZSB2cyB2b2xhdGlsZSl9fQotICAgIFggPSAmUXVhbGlmaWVyczo6UjsgLy8gZXhwZWN0ZWQtZXJyb3J7e2Fzc2lnbmluZyB0byAndm9pZCAodGVzdDE6OlF1YWxpZmllcnM6OiopKCknIGZyb20gaW5jb21wYXRpYmxlIHR5cGUgJ3ZvaWQgKHRlc3QxOjpRdWFsaWZpZXJzOjoqKSgpIHJlc3RyaWN0JzogZGlmZmVyZW50IHF1YWxpZmllcnMgKG5vbmUgdnMgcmVzdHJpY3QpfX0KLSAgICBYID0gJlF1YWxpZmllcnM6OkNWOyAvLyBleHBlY3RlZC1lcnJvcnt7YXNzaWduaW5nIHRvICd2b2lkICh0ZXN0MTo6UXVhbGlmaWVyczo6KikoKScgZnJvbSBpbmNvbXBhdGlibGUgdHlwZSAndm9pZCAodGVzdDE6OlF1YWxpZmllcnM6OiopKCkgY29uc3Qgdm9sYXRpbGUnOiBkaWZmZXJlbnQgcXVhbGlmaWVycyAobm9uZSB2cyBjb25zdCBhbmQgdm9sYXRpbGUpfX0KLSAgICBYID0gJlF1YWxpZmllcnM6OkNSOyAvLyBleHBlY3RlZC1lcnJvcnt7YXNzaWduaW5nIHRvICd2b2lkICh0ZXN0MTo6UXVhbGlmaWVyczo6KikoKScgZnJvbSBpbmNvbXBhdGlibGUgdHlwZSAndm9pZCAodGVzdDE6OlF1YWxpZmllcnM6OiopKCkgY29uc3QgcmVzdHJpY3QnOiBkaWZmZXJlbnQgcXVhbGlmaWVycyAobm9uZSB2cyBjb25zdCBhbmQgcmVzdHJpY3QpfX0KLSAgICBYID0gJlF1YWxpZmllcnM6OlZSOyAvLyBleHBlY3RlZC1lcnJvcnt7YXNzaWduaW5nIHRvICd2b2lkICh0ZXN0MTo6UXVhbGlmaWVyczo6KikoKScgZnJvbSBpbmNvbXBhdGlibGUgdHlwZSAndm9pZCAodGVzdDE6OlF1YWxpZmllcnM6OiopKCkgdm9sYXRpbGUgcmVzdHJpY3QnOiBkaWZmZXJlbnQgcXVhbGlmaWVycyAobm9uZSB2cyB2b2xhdGlsZSBhbmQgcmVzdHJpY3QpfX0KLSAgICBYID0gJlF1YWxpZmllcnM6OkNWUjsgLy8gZXhwZWN0ZWQtZXJyb3J7e2Fzc2lnbmluZyB0byAndm9pZCAodGVzdDE6OlF1YWxpZmllcnM6OiopKCknIGZyb20gaW5jb21wYXRpYmxlIHR5cGUgJ3ZvaWQgKHRlc3QxOjpRdWFsaWZpZXJzOjoqKSgpIGNvbnN0IHZvbGF0aWxlIHJlc3RyaWN0JzogZGlmZmVyZW50IHF1YWxpZmllcnMgKG5vbmUgdnMgY29uc3QsIHZvbGF0aWxlLCBhbmQgcmVzdHJpY3QpfX0KKyAgICBYID0gJlF1YWxpZmllcnM6OkM7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7YXNzaWduaW5nIHRvICd2b2lkICh0ZXN0MTo6UXVhbGlmaWVyczo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIGZyb20gaW5jb21wYXRpYmxlIHR5cGUgJ3ZvaWQgKHRlc3QxOjpRdWFsaWZpZXJzOjoqKSgpe3soIF9fYXR0cmlidXRlX19cKFwodGhpc2NhbGxcKVwpKT99fSBjb25zdCc6IGRpZmZlcmVudCBxdWFsaWZpZXJzIChub25lIHZzIGNvbnN0KX19CisgICAgWCA9ICZRdWFsaWZpZXJzOjpWOyAvLyBleHBlY3RlZC1lcnJvci1yZXt7YXNzaWduaW5nIHRvICd2b2lkICh0ZXN0MTo6UXVhbGlmaWVyczo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIGZyb20gaW5jb21wYXRpYmxlIHR5cGUgJ3ZvaWQgKHRlc3QxOjpRdWFsaWZpZXJzOjoqKSgpe3soIF9fYXR0cmlidXRlX19cKFwodGhpc2NhbGxcKVwpKT99fSB2b2xhdGlsZSc6IGRpZmZlcmVudCBxdWFsaWZpZXJzIChub25lIHZzIHZvbGF0aWxlKX19CisgICAgWCA9ICZRdWFsaWZpZXJzOjpSOyAvLyBleHBlY3RlZC1lcnJvci1yZXt7YXNzaWduaW5nIHRvICd2b2lkICh0ZXN0MTo6UXVhbGlmaWVyczo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIGZyb20gaW5jb21wYXRpYmxlIHR5cGUgJ3ZvaWQgKHRlc3QxOjpRdWFsaWZpZXJzOjoqKSgpe3soIF9fYXR0cmlidXRlX19cKFwodGhpc2NhbGxcKVwpKT99fSByZXN0cmljdCc6IGRpZmZlcmVudCBxdWFsaWZpZXJzIChub25lIHZzIHJlc3RyaWN0KX19CisgICAgWCA9ICZRdWFsaWZpZXJzOjpDVjsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e2Fzc2lnbmluZyB0byAndm9pZCAodGVzdDE6OlF1YWxpZmllcnM6OiopKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319JyBmcm9tIGluY29tcGF0aWJsZSB0eXBlICd2b2lkICh0ZXN0MTo6UXVhbGlmaWVyczo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0gY29uc3Qgdm9sYXRpbGUnOiBkaWZmZXJlbnQgcXVhbGlmaWVycyAobm9uZSB2cyBjb25zdCBhbmQgdm9sYXRpbGUpfX0KKyAgICBYID0gJlF1YWxpZmllcnM6OkNSOyAvLyBleHBlY3RlZC1lcnJvci1yZXt7YXNzaWduaW5nIHRvICd2b2lkICh0ZXN0MTo6UXVhbGlmaWVyczo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIGZyb20gaW5jb21wYXRpYmxlIHR5cGUgJ3ZvaWQgKHRlc3QxOjpRdWFsaWZpZXJzOjoqKSgpe3soIF9fYXR0cmlidXRlX19cKFwodGhpc2NhbGxcKVwpKT99fSBjb25zdCByZXN0cmljdCc6IGRpZmZlcmVudCBxdWFsaWZpZXJzIChub25lIHZzIGNvbnN0IGFuZCByZXN0cmljdCl9fQorICAgIFggPSAmUXVhbGlmaWVyczo6VlI7IC8vIGV4cGVjdGVkLWVycm9yLXJle3thc3NpZ25pbmcgdG8gJ3ZvaWQgKHRlc3QxOjpRdWFsaWZpZXJzOjoqKSgpe3soIF9fYXR0cmlidXRlX19cKFwodGhpc2NhbGxcKVwpKT99fScgZnJvbSBpbmNvbXBhdGlibGUgdHlwZSAndm9pZCAodGVzdDE6OlF1YWxpZmllcnM6OiopKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319IHZvbGF0aWxlIHJlc3RyaWN0JzogZGlmZmVyZW50IHF1YWxpZmllcnMgKG5vbmUgdnMgdm9sYXRpbGUgYW5kIHJlc3RyaWN0KX19CisgICAgWCA9ICZRdWFsaWZpZXJzOjpDVlI7IC8vIGV4cGVjdGVkLWVycm9yLXJle3thc3NpZ25pbmcgdG8gJ3ZvaWQgKHRlc3QxOjpRdWFsaWZpZXJzOjoqKSgpe3soIF9fYXR0cmlidXRlX19cKFwodGhpc2NhbGxcKVwpKT99fScgZnJvbSBpbmNvbXBhdGlibGUgdHlwZSAndm9pZCAodGVzdDE6OlF1YWxpZmllcnM6OiopKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319IGNvbnN0IHZvbGF0aWxlIHJlc3RyaWN0JzogZGlmZmVyZW50IHF1YWxpZmllcnMgKG5vbmUgdnMgY29uc3QsIHZvbGF0aWxlLCBhbmQgcmVzdHJpY3QpfX0KICAgfQogCiAgIHN0cnVjdCBEdW1teSB7CiAgICAgdm9pZCBOKCkge307CiAgIH07CiAKLSAgdm9pZCAoUXVhbGlmaWVyczo6KlgpKCkgPSAmRHVtbXk6Ok47IC8vIGV4cGVjdGVkLWVycm9ye3tjYW5ub3QgaW5pdGlhbGl6ZSBhIHZhcmlhYmxlIG9mIHR5cGUgJ3ZvaWQgKHRlc3QxOjpRdWFsaWZpZXJzOjoqKSgpJyB3aXRoIGFuIHJ2YWx1ZSBvZiB0eXBlICd2b2lkICh0ZXN0MTo6RHVtbXk6OiopKCknOiBkaWZmZXJlbnQgY2xhc3NlcyAoJ3Rlc3QxOjpRdWFsaWZpZXJzJyB2cyAndGVzdDE6OkR1bW15Jyl9fQorICB2b2lkIChRdWFsaWZpZXJzOjoqWCkoKSA9ICZEdW1teTo6TjsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e2Nhbm5vdCBpbml0aWFsaXplIGEgdmFyaWFibGUgb2YgdHlwZSAndm9pZCAodGVzdDE6OlF1YWxpZmllcnM6OiopKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319JyB3aXRoIGFuIHJ2YWx1ZSBvZiB0eXBlICd2b2lkICh0ZXN0MTo6RHVtbXk6OiopKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319JzogZGlmZmVyZW50IGNsYXNzZXMgKCd0ZXN0MTo6UXVhbGlmaWVycycgdnMgJ3Rlc3QxOjpEdW1teScpfX0KIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFBSMTY1NjEgewpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2FnZ3JlZ2F0ZS1pbml0aWFsaXphdGlvbi5jcHAgYi90ZXN0L1NlbWFDWFgvYWdncmVnYXRlLWluaXRpYWxpemF0aW9uLmNwcAppbmRleCA4ODViZjcwLi40ZTQxNzc0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvYWdncmVnYXRlLWluaXRpYWxpemF0aW9uLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvYWdncmVnYXRlLWluaXRpYWxpemF0aW9uLmNwcApAQCAtNDksNyArNDksNyBAQAogICBBKGludCk7CiAgIH5BKCk7CiAgIAotICBBKGNvbnN0IEEmKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7ZnVuY3Rpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KKyAgQShjb25zdCBBJikgPSBkZWxldGU7IC8vIGV4cGVjdGVkLW5vdGUgMiB7eydBJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZWxldGVkIGhlcmV9fQogfTsKIAogc3RydWN0IEIgewpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2FsaWFzLXRlbXBsYXRlLmNwcCBiL3Rlc3QvU2VtYUNYWC9hbGlhcy10ZW1wbGF0ZS5jcHAKaW5kZXggZGI5YzgyYS4uODllZmM1MCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2FsaWFzLXRlbXBsYXRlLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvYWxpYXMtdGVtcGxhdGUuY3BwCkBAIC0xMDIsMTAgKzEwMiwxMCBAQAogfTsKIAogbmFtZXNwYWNlIFRhZ05hbWUgewotICB0ZW1wbGF0ZTx0eXBlbmFtZSBaPiB1c2luZyBTID0gc3RydWN0IHsgaW50IG47IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FuIG5vdCBiZSBkZWZpbmVkfX0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgWj4gdXNpbmcgVCA9IGNsYXNzIHsgaW50IG47IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FuIG5vdCBiZSBkZWZpbmVkfX0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgWj4gdXNpbmcgVSA9IGVudW0geyBhLCBiLCBjIH07IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FuIG5vdCBiZSBkZWZpbmVkfX0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgWj4gdXNpbmcgViA9IHN0cnVjdCBWIHsgaW50IG47IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7J1RhZ05hbWU6OlYnIGNhbiBub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgYWxpYXMgdGVtcGxhdGV9fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBaPiB1c2luZyBTID0gc3RydWN0IHsgaW50IG47IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGJlIGRlZmluZWR9fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBaPiB1c2luZyBUID0gY2xhc3MgeyBpbnQgbjsgfTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW5ub3QgYmUgZGVmaW5lZH19CisgIHRlbXBsYXRlPHR5cGVuYW1lIFo+IHVzaW5nIFUgPSBlbnVtIHsgYSwgYiwgYyB9OyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBiZSBkZWZpbmVkfX0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgWj4gdXNpbmcgViA9IHN0cnVjdCBWIHsgaW50IG47IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7J1RhZ05hbWU6OlYnIGNhbm5vdCBiZSBkZWZpbmVkIGluIGEgdHlwZSBhbGlhcyB0ZW1wbGF0ZX19CiB9CiAKIG5hbWVzcGFjZSBTdGRFeGFtcGxlIHsKQEAgLTEzNiw3ICsxMzYsNyBAQAogbmFtZXNwYWNlIFZvaWRBcmcgewogICB0ZW1wbGF0ZTx0eXBlbmFtZSBaPiB1c2luZyBWID0gdm9pZDsKICAgVjxpbnQ+IGYoaW50KTsgLy8gb2sKLSAgVjxjaGFyPiBnKFY8ZG91YmxlPik7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZW1wdHkgcGFyYW1ldGVyIGxpc3QgZGVmaW5lZCB3aXRoIGEgdHlwZSBhbGlhcyBvZiAndm9pZCcgbm90IGFsbG93ZWR9fQorICBWPGNoYXI+IGcoVjxkb3VibGU+KTsgLy8gb2sgKERSNTc3KQogfQogCiBuYW1lc3BhY2UgQ3VycmllZCB7CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvYW5vbnltb3VzLXN0cnVjdC5jcHAgYi90ZXN0L1NlbWFDWFgvYW5vbnltb3VzLXN0cnVjdC5jcHAKaW5kZXggOGE2MTA0MS4uMWI1ZGMxMyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2Fub255bW91cy1zdHJ1Y3QuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9hbm9ueW1vdXMtc3RydWN0LmNwcApAQCAtMTQsMyArMTQsMTAgQEAKICAgc3RhdGljIHN0cnVjdCB7CiAgIH07CiB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBmb28oVCk7Cit0eXBlZGVmIHN0cnVjdCB7IC8vIGV4cGVjdGVkLW5vdGUge3t1c2UgYSB0YWcgbmFtZSBoZXJlIHRvIGVzdGFibGlzaCBsaW5rYWdlIHByaW9yIHRvIGRlZmluaXRpb259fSBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CisgIHZvaWQgdGVzdCgpIHsKKyAgICBmb28odGhpcyk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t0ZW1wbGF0ZSBhcmd1bWVudCB1c2VzIHVubmFtZWQgdHlwZX19CisgIH0KK30gQTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1bnN1cHBvcnRlZDogdHlwZWRlZiBjaGFuZ2VzIGxpbmthZ2Ugb2YgYW5vbnltb3VzIHR5cGUsIGJ1dCBsaW5rYWdlIHdhcyBhbHJlYWR5IGNvbXB1dGVkfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9hc3QtcHJpbnQuY3BwIGIvdGVzdC9TZW1hQ1hYL2FzdC1wcmludC5jcHAKaW5kZXggYTE5NzViNC4uM2Q5OGZkOCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2FzdC1wcmludC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2FzdC1wcmludC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWFzdC1wcmludCAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1hc3QtcHJpbnQgJXMgLXN0ZD1nbnUrKzExIHwgRmlsZUNoZWNrICVzCiAKIC8vIENIRUNLOiByOwogLy8gQ0hFQ0stTkVYVDogKHItPm1ldGhvZCgpKTsKQEAgLTE2NCwzICsxNjQsMzUgQEAKIHZvaWQgdGVzdDE0KCkgewogICBzdHJ1Y3QgWCB7IHVuaW9uIHsgaW50IHg7IH0geDsgfTsKIH0KKworCisvLyBDSEVDSzogZmxvYXQgdGVzdDE1KCkgeworLy8gQ0hFQ0s6ICAgICByZXR1cm4gX19idWlsdGluX2FzaW5mKDEuRik7CisvLyBDSEVDSzogfQorLy8gQ0hFQ0stTk9UOiBleHRlcm4gIkMiCitmbG9hdCB0ZXN0MTUoKSB7CisgIHJldHVybiBfX2J1aWx0aW5fYXNpbmYoMS4wRik7Cit9CisKK25hbWVzcGFjZSBQUjE4Nzc2IHsKK3N0cnVjdCBBIHsKKyAgb3BlcmF0b3Igdm9pZCAqKCk7CisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKTsKKyAgQSBvcGVyYXRvciYoQSk7Cit9OworCisvLyBDSEVDSzogc3RydWN0IEEKKy8vIENIRUNLLU5FWFQ6IHt7XlsgXSpvcGVyYXRvcn19IHZvaWQgKigpOworLy8gQ0hFQ0stTkVYVDoge3teWyBdKmV4cGxpY2l0fX0gb3BlcmF0b3IgYm9vbCgpOworCit2b2lkIGJhcih2b2lkICopOworCit2b2lkIGZvbygpIHsKKyAgQSBhLCBiOworICBiYXIoYSAmIGIpOworLy8gQ0hFQ0s6IGJhcihhICYgYik7CisgIGlmIChhICYgYikKKy8vIENIRUNLOiBpZiAoYSAmIGIpCisgICAgcmV0dXJuOworfQorfTsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9hdHRyLWNvbW1vbi5jcHAgYi90ZXN0L1NlbWFDWFgvYXR0ci1jb21tb24uY3BwCmluZGV4IDU4YjMwMTMuLmZiOTg2MzkgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9hdHRyLWNvbW1vbi5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2F0dHItY29tbW9uLmNwcApAQCAtMSwzICsxLDMgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKIAotX19hdHRyaWJ1dGVfXygoY29tbW9uKSkgaW50IHg7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29tbW9uIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGluIEMrK319CitfX2F0dHJpYnV0ZV9fKChjb21tb24pKSBpbnQgeDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snY29tbW9uJyBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBpbiBDKyt9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2F0dHItY3h4MHguY3BwIGIvdGVzdC9TZW1hQ1hYL2F0dHItY3h4MHguY3BwCmluZGV4IGUyNGUxMmUuLjZiYTg5YTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9hdHRyLWN4eDB4LmNwcAorKysgYi90ZXN0L1NlbWFDWFgvYXR0ci1jeHgweC5jcHAKQEAgLTQ1LDMgKzQ1LDggQEAKIHN0YXRpY19hc3NlcnQoYWxpZ25vZihvdXRlcjxpbnQsY2hhcj46OmlubmVyPGRvdWJsZSxzaG9ydD4pID09IGFsaWdub2YoaW50KSAqIGFsaWdub2YoZG91YmxlKSwgInRlbXBsYXRlJ3MgYWxpZ25tZW50IGlzIHdyb25nIik7CiAKIHN0YXRpY19hc3NlcnQoYWxpZ25vZihpbnQoaW50KSkgPj0gMSwgImFsaWdub2YoZnVuY3Rpb24pIG5vdCBwb3NpdGl2ZSIpOyAvLyBleHBlY3RlZC1lcnJvcnt7aW52YWxpZCBhcHBsaWNhdGlvbiBvZiAnYWxpZ25vZicgdG8gYSBmdW5jdGlvbiB0eXBlfX0KKworW1tfX2NhcnJpZXNfZGVwZW5kZW5jeV9fXV0gIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3Vua25vd24gYXR0cmlidXRlICdfX2NhcnJpZXNfZGVwZW5kZW5jeV9fJyBpZ25vcmVkfX0KK3ZvaWQgZnVuYyh2b2lkKTsKKworYWxpZ25hcyg0KSBhdXRvIFBSMTkyNTIgPSAwOwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2F0dHItZGVwcmVjYXRlZC5jcHAgYi90ZXN0L1NlbWFDWFgvYXR0ci1kZXByZWNhdGVkLmNwcAppbmRleCBiMzIyM2YzLi5kMjhlYjc1IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvYXR0ci1kZXByZWNhdGVkLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvYXR0ci1kZXByZWNhdGVkLmNwcApAQCAtMSwxMCArMSwxMCBAQAogLy8gUlVOOiAlY2xhbmdfY2MxICVzIC12ZXJpZnkgLWZleGNlcHRpb25zCiBjbGFzcyBBIHsKLSAgdm9pZCBmKCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIDIge3tkZWNsYXJlZCBoZXJlfX0KKyAgdm9pZCBmKCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIDIge3snZicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KICAgdm9pZCBnKEEqIGEpOwogICB2b2lkIGgoQSogYSkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOwogCi0gIGludCBiIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7ZGVjbGFyZWQgaGVyZX19CisgIGludCBiIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7J2InIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiB9OwogCiB2b2lkIEE6OmcoQSogYSkKQEAgLTI2LDcgKzI2LDcgQEAKIH0KIAogc3RydWN0IEIgewotICB2aXJ0dWFsIHZvaWQgZigpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSA0IHt7ZGVjbGFyZWQgaGVyZX19CisgIHZpcnR1YWwgdm9pZCBmKCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIDQge3snZicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KICAgdm9pZCBnKCk7CiB9OwogCkBAIC02OCwyMCArNjgsMjAgQEAKIAogLy8gT3ZlcmxvYWRlZCBuYW1lc3BhY2UgbWVtYmVycy4KIG5hbWVzcGFjZSB0ZXN0MSB7Ci0gIHZvaWQgZm9vKGludCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CisgIHZvaWQgZm9vKGludCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J2ZvbycgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KICAgdm9pZCB0ZXN0MSgpIHsgZm9vKDEwKTsgfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZGVwcmVjYXRlZH19Ci0gIHZvaWQgZm9vKHNob3J0KSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KKyAgdm9pZCBmb28oc2hvcnQpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydmb28nIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAgIHZvaWQgdGVzdDIoc2hvcnQgcykgeyBmb28ocyk7IH0gLy8gZXhwZWN0ZWQtd2FybmluZyB7e2RlcHJlY2F0ZWR9fQogICB2b2lkIGZvbyhsb25nKTsKICAgdm9pZCB0ZXN0Myhsb25nIGwpIHsgZm9vKGwpOyB9CiAgIHN0cnVjdCBBIHsKLSAgICBmcmllbmQgdm9pZCBmb28oQSopIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorICAgIGZyaWVuZCB2b2lkIGZvbyhBKikgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J2ZvbycgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KICAgfTsKICAgdm9pZCB0ZXN0NChBICphKSB7IGZvbyhhKTsgfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZGVwcmVjYXRlZH19CiAKICAgbmFtZXNwYWNlIG5zIHsKICAgICBzdHJ1Y3QgRm9vIHt9OwotICAgIHZvaWQgZm9vKGNvbnN0IEZvbyAmZikgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CisgICAgdm9pZCBmb28oY29uc3QgRm9vICZmKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snZm9vJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogICB9CiAgIHZvaWQgdGVzdDUoKSB7CiAgICAgZm9vKG5zOjpGb28oKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tkZXByZWNhdGVkfX0KQEAgLTkxLDkgKzkxLDkgQEAKIC8vIE92ZXJsb2FkZWQgY2xhc3MgbWVtYmVycy4KIG5hbWVzcGFjZSB0ZXN0MiB7CiAgIHN0cnVjdCBBIHsKLSAgICB2b2lkIGZvbyhpbnQpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7ZGVjbGFyZWQgaGVyZX19CisgICAgdm9pZCBmb28oaW50KSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUgMiB7eydmb28nIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAgICAgdm9pZCBmb28obG9uZyk7Ci0gICAgc3RhdGljIHZvaWQgYmFyKGludCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIDMge3tkZWNsYXJlZCBoZXJlfX0KKyAgICBzdGF0aWMgdm9pZCBiYXIoaW50KSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUgMyB7eydiYXInIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAgICAgc3RhdGljIHZvaWQgYmFyKGxvbmcpOwogCiAgICAgdm9pZCB0ZXN0MihpbnQgaSwgbG9uZyBsKTsKQEAgLTEyMCwxMiArMTIwLDEyIEBACiBuYW1lc3BhY2UgdGVzdDMgewogICBzdHJ1Y3QgQSB7CiAgICAgdm9pZCBvcGVyYXRvciooY29uc3QgQSAmKTsKLSAgICB2b2lkIG9wZXJhdG9yKihpbnQpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorICAgIHZvaWQgb3BlcmF0b3IqKGludCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J29wZXJhdG9yKicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KICAgICB2b2lkIG9wZXJhdG9yLShjb25zdCBBICYpIGNvbnN0OwogICB9OwogICB2b2lkIG9wZXJhdG9yKyhjb25zdCBBICYsIGNvbnN0IEEgJik7Ci0gIHZvaWQgb3BlcmF0b3IrKGNvbnN0IEEgJiwgaW50KSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KLSAgdm9pZCBvcGVyYXRvci0oY29uc3QgQSAmLCBpbnQpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorICB2b2lkIG9wZXJhdG9yKyhjb25zdCBBICYsIGludCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J29wZXJhdG9yKycgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KKyAgdm9pZCBvcGVyYXRvci0oY29uc3QgQSAmLCBpbnQpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydvcGVyYXRvci0nIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAKICAgdm9pZCB0ZXN0KCkgewogICAgIEEgYSwgYjsKQEAgLTE0Myw5ICsxNDMsOSBAQAogICBzdHJ1Y3QgQSB7CiAgICAgdHlwZWRlZiB2b2lkICgqaW50Zm4pKGludCk7CiAgICAgdHlwZWRlZiB2b2lkICgqdW5pbnRmbikodW5zaWduZWQpOwotICAgIG9wZXJhdG9yIGludGZuKCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CisgICAgb3BlcmF0b3IgaW50Zm4oKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snb3BlcmF0b3Igdm9pZCAoKikoaW50KScgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KICAgICBvcGVyYXRvciB1bmludGZuKCk7Ci0gICAgdm9pZCBvcGVyYXRvciAoKShBICYpIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorICAgIHZvaWQgb3BlcmF0b3IgKCkoQSAmKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snb3BlcmF0b3IoKScgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KICAgICB2b2lkIG9wZXJhdG9yICgpKGNvbnN0IEEgJik7CiAgIH07CiAKQEAgLTE2Myw3ICsxNjMsNyBAQAogCiBuYW1lc3BhY2UgdGVzdDUgewogICBzdHJ1Y3QgQSB7Ci0gICAgb3BlcmF0b3IgaW50KCkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIDMge3tkZWNsYXJlZCBoZXJlfX0KKyAgICBvcGVyYXRvciBpbnQoKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUgMyB7eydvcGVyYXRvciBpbnQnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAgICAgb3BlcmF0b3IgbG9uZygpOwogICB9OwogICB2b2lkIHRlc3QxKEEgYSkgewpAQCAtMTkzLDggKzE5Myw4IEBACiAKIC8vIHJkYXI6Ly9wcm9ibGVtLzg1MTg3NTEKIG5hbWVzcGFjZSB0ZXN0NiB7Ci0gIGVudW0gX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpIEEgeyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19Ci0gICAgYTAgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorICBlbnVtIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSBBIHsgLy8gZXhwZWN0ZWQtbm90ZSB7eydBJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQorICAgIGEwIC8vIGV4cGVjdGVkLW5vdGUge3snYTAnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAgIH07CiAgIHZvaWQgdGVzdEEoKSB7CiAgICAgQSB4OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0EnIGlzIGRlcHJlY2F0ZWR9fQpAQCAtMjAyLDcgKzIwMiw3IEBACiAgIH0KICAgCiAgIGVudW0gQiB7Ci0gICAgYjAgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpLCAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CisgICAgYjAgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpLCAvLyBleHBlY3RlZC1ub3RlIHt7J2IwJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogICAgIGIxCiAgIH07CiAgIHZvaWQgdGVzdEIoKSB7CkBAIC0yMTIsOCArMjEyLDggQEAKICAgfQogCiAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgQyB7Ci0gICAgZW51bSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkgRW51bSB7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KLSAgICAgIGMwIC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KKyAgICBlbnVtIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSBFbnVtIHsgLy8gZXhwZWN0ZWQtbm90ZSB7eydFbnVtJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQorICAgICAgYzAgLy8gZXhwZWN0ZWQtbm90ZSB7eydjMCcgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KICAgICB9OwogICB9OwogICB2b2lkIHRlc3RDKCkgewpAQCAtMjI0LDcgKzIyNCw3IEBACiAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgRCB7CiAgICAgZW51bSBFbnVtIHsKICAgICAgIGQwLAotICAgICAgZDEgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpLCAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CisgICAgICBkMSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSksIC8vIGV4cGVjdGVkLW5vdGUge3snZDEnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAgICAgfTsKICAgfTsKICAgdm9pZCB0ZXN0RCgpIHsKQEAgLTIzNiw4ICsyMzYsOCBAQAogCiBuYW1lc3BhY2UgdGVzdDcgewogICBzdHJ1Y3QgWCB7Ci0gICAgdm9pZCogb3BlcmF0b3IgbmV3KHR5cGVvZihzaXplb2Yodm9pZCopKSkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAgLy8gZXhwZWN0ZWQtbm90ZXt7J29wZXJhdG9yIG5ldycgZGVjbGFyZWQgaGVyZX19Ci0gICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7ICAvLyBleHBlY3RlZC1ub3Rle3snb3BlcmF0b3IgZGVsZXRlJyBkZWNsYXJlZCBoZXJlfX0KKyAgICB2b2lkKiBvcGVyYXRvciBuZXcodHlwZW9mKHNpemVvZih2b2lkKikpKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7ICAvLyBleHBlY3RlZC1ub3Rle3snb3BlcmF0b3IgbmV3JyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQorICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAgLy8gZXhwZWN0ZWQtbm90ZXt7J29wZXJhdG9yIGRlbGV0ZScgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KICAgfTsKIAogICB2b2lkIHRlc3QoKSB7CkBAIC0yNDcsNiArMjQ3LDYgQEAKIAogLy8gcmRhcjovL3Byb2JsZW0vMTUwNDQyMTgKIHR5cGVkZWYgc3RydWN0IFREUyB7Ci19IFREUyBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snVERTJyBkZWNsYXJlZCBoZXJlfX0KK30gVERTIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydURFMnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiBURFMgdGRzOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J1REUycgaXMgZGVwcmVjYXRlZH19CiBzdHJ1Y3QgVERTIHRkczI7IC8vIG5vIHdhcm5pbmcsIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdGhlIHR5cGVkZWYuCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvYXR0ci1vcHRub25lLmNwcCBiL3Rlc3QvU2VtYUNYWC9hdHRyLW9wdG5vbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYTUwMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWFDWFgvYXR0ci1vcHRub25lLmNwcApAQCAtMCwwICsxLDQ3IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZm1zLWNvbXBhdGliaWxpdHkgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisKK2ludCBmb28oKSBfX2F0dHJpYnV0ZV9fKChvcHRub25lKSk7CitpbnQgYmFyKCkgX19hdHRyaWJ1dGVfXygob3B0bm9uZSkpIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7CisKK2ludCBiYXooKSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkgX19hdHRyaWJ1dGVfXygob3B0bm9uZSkpOyAvLyBleHBlY3RlZC1lcnJvcnt7J2Fsd2F5c19pbmxpbmUnIGFuZCAnb3B0bm9uZScgYXR0cmlidXRlcyBhcmUgbm90IGNvbXBhdGlibGV9fQoraW50IHF1eigpIF9fYXR0cmlidXRlX18oKG9wdG5vbmUpKSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSk7IC8vIGV4cGVjdGVkLWVycm9ye3snb3B0bm9uZScgYW5kICdhbHdheXNfaW5saW5lJyBhdHRyaWJ1dGVzIGFyZSBub3QgY29tcGF0aWJsZX19CisKK19fZm9yY2VpbmxpbmUgX19hdHRyaWJ1dGVfXygob3B0bm9uZSkpIGludCBiYXgoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7eydfX2ZvcmNlaW5saW5lJyBhbmQgJ29wdG5vbmUnIGF0dHJpYnV0ZXMgYXJlIG5vdCBjb21wYXRpYmxlfX0KK19fYXR0cmlidXRlX18oKG9wdG5vbmUpKSBfX2ZvcmNlaW5saW5lIGludCBxdXgoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7eydvcHRub25lJyBhbmQgJ19fZm9yY2VpbmxpbmUnIGF0dHJpYnV0ZXMgYXJlIG5vdCBjb21wYXRpYmxlfX0KKworaW50IGdsb2JhbFZhciBfX2F0dHJpYnV0ZV9fKChvcHRub25lKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydvcHRub25lJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9uc319CisKK2ludCBmdWJhcihpbnQgX19hdHRyaWJ1dGVfXygob3B0bm9uZSkpLCBpbnQpOyAvLyBleHBlY3RlZC13YXJuaW5ne3snb3B0bm9uZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQorCitzdHJ1Y3QgQSB7CisgIGludCBhRmllbGQgX19hdHRyaWJ1dGVfXygob3B0bm9uZSkpOyAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J29wdG5vbmUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zfX0KK307CisKK3N0cnVjdCBCIHsKKyAgdm9pZCBmb28oKSBfX2F0dHJpYnV0ZV9fKChvcHRub25lKSk7CisgIHN0YXRpYyB2b2lkIGJhcigpIF9fYXR0cmlidXRlX18oKG9wdG5vbmUpKTsKK307CisKKy8vIFZlcmlmeSB0aGF0IHdlIGNhbiBzcGVjaWZ5IHRoZSBbW2NsYW5nOjpvcHRub25lXV0gc3ludGF4IGFzIHdlbGwuCisKK1tbY2xhbmc6Om9wdG5vbmVdXQoraW50IGZvbzIoKTsKK1tbY2xhbmc6Om9wdG5vbmVdXQoraW50IGJhcjIoKSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpOworCitbW2NsYW5nOjpvcHRub25lXV0KK2ludCBiYXoyKCkgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpOyAvLyBleHBlY3RlZC1lcnJvcnt7J2Fsd2F5c19pbmxpbmUnIGFuZCAnb3B0bm9uZScgYXR0cmlidXRlcyBhcmUgbm90IGNvbXBhdGlibGV9fQorCitbW2NsYW5nOjpvcHRub25lXV0gaW50IGdsb2JhbFZhcjI7IC8vZXhwZWN0ZWQtd2FybmluZ3t7J29wdG5vbmUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zfX0KKworc3RydWN0IEEyIHsKKyAgW1tjbGFuZzo6b3B0bm9uZV1dIGludCBhRmllbGQ7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydvcHRub25lJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9uc319Cit9OworCitzdHJ1Y3QgQjIgeworICBbW2NsYW5nOjpvcHRub25lXV0KKyAgdm9pZCBmb28oKTsKKyAgW1tjbGFuZzo6b3B0bm9uZV1dCisgIHN0YXRpYyB2b2lkIGJhcigpOworfTsKKwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2F0dHItc2VsZWN0YW55LmNwcCBiL3Rlc3QvU2VtYUNYWC9hdHRyLXNlbGVjdGFueS5jcHAKaW5kZXggMGY5Nzc2ZC4uYzI3YTkxNSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2F0dHItc2VsZWN0YW55LmNwcAorKysgYi90ZXN0L1NlbWFDWFgvYXR0ci1zZWxlY3RhbnkuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mbXMtZXh0ZW5zaW9ucyAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZm1zLWV4dGVuc2lvbnMgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1zdGQ9YysrMTEgJXMKIC8vIE1TVkMgcHJvZHVjZXMgc2ltaWxhciBkaWFnbm9zdGljcy4KIAogX19kZWNsc3BlYyhzZWxlY3RhbnkpIHZvaWQgZm9vKCkgeyB9IC8vIGV4cGVjdGVkLWVycm9ye3snc2VsZWN0YW55JyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGRhdGEgaXRlbXMgd2l0aCBleHRlcm5hbCBsaW5rYWdlfX0KQEAgLTMxLDMgKzMxLDYgQEAKIH07CiAKIF9fZGVjbHNwZWMoc2VsZWN0YW55KSBYIHgoMSk7CisKK25hbWVzcGFjZSB7IGNsYXNzIEludGVybmFsIHt9OyB9CitfX2RlY2xzcGVjKHNlbGVjdGFueSkgYXV0byB4OCA9IEludGVybmFsKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J3NlbGVjdGFueScgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBkYXRhIGl0ZW1zIHdpdGggZXh0ZXJuYWwgbGlua2FnZX19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvYXR0ci11bmF2YWlsYWJsZS5jcHAgYi90ZXN0L1NlbWFDWFgvYXR0ci11bmF2YWlsYWJsZS5jcHAKaW5kZXggMmQ4MjY2OC4uNTFkYzhmZSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2F0dHItdW5hdmFpbGFibGUuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9hdHRyLXVuYXZhaWxhYmxlLmNwcApAQCAtMyw3ICszLDcgQEAKIGludCAmZm9vKGludCk7IC8vIGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGV9fQogZG91YmxlICZmb28oZG91YmxlKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZX19CiB2b2lkIGZvbyguLi4pIF9fYXR0cmlidXRlX18oKF9fdW5hdmFpbGFibGVfXykpOyAvLyBleHBlY3RlZC1ub3RlIHt7Y2FuZGlkYXRlIGZ1bmN0aW9ufX0gXAotLy8gZXhwZWN0ZWQtbm90ZXt7ZnVuY3Rpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgdW5hdmFpbGFibGUgaGVyZX19CisvLyBleHBlY3RlZC1ub3Rle3snZm9vJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZSBoZXJlfX0KIAogdm9pZCBiYXIoLi4uKSBfX2F0dHJpYnV0ZV9fKChfX3VuYXZhaWxhYmxlX18pKTsgLy8gZXhwZWN0ZWQtbm90ZSAye3tleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZX19CiAKQEAgLTM3LDMgKzM3LDIyIEBACiAgIGZvbyhzcCk7CiAgIGZvbygpOwogfQorCisvLyBTaG93IHRoYXQgZGVsYXllZCBwcm9jZXNzaW5nIG9mICd1bmF2YWlsYWJsZScgaXMgdGhlIHNhbWUKKy8vIGRlbGF5ZWQgcHJvY2VzcyBmb3IgJ2RlcHJlY2F0ZWQnLgorLy8gPHJkYXI6Ly9wcm9ibGVtLzEyMjQxMzYxPiBhbmQgPHJkYXI6Ly9wcm9ibGVtLzE1NTg0MjE5PgorZW51bSBEZXByZWNhdGVkRW51bSB7IERFX0EsIERFX0IgfSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snRGVwcmVjYXRlZEVudW0nIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CitfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkgdHlwZWRlZiBlbnVtIERlcHJlY2F0ZWRFbnVtIERlcHJlY2F0ZWRFbnVtOwordHlwZWRlZiBlbnVtIERlcHJlY2F0ZWRFbnVtIEFub3RoZXJEZXByZWNhdGVkRW51bTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydEZXByZWNhdGVkRW51bScgaXMgZGVwcmVjYXRlZH19CisKK19fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKQorRGVwcmVjYXRlZEVudW0gdGVzdERlcHJlY2F0ZWQoRGVwcmVjYXRlZEVudW0gWCkgeyByZXR1cm4gWDsgfQorCisKK2VudW0gVW5hdmFpbGFibGVFbnVtIHsgVUVfQSwgVUVfQiB9IF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snVW5hdmFpbGFibGVFbnVtJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZSBoZXJlfX0KK19fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSkgdHlwZWRlZiBlbnVtIFVuYXZhaWxhYmxlRW51bSBVbmF2YWlsYWJsZUVudW07Cit0eXBlZGVmIGVudW0gVW5hdmFpbGFibGVFbnVtIEFub3RoZXJVbmF2YWlsYWJsZUVudW07IC8vIGV4cGVjdGVkLWVycm9yIHt7J1VuYXZhaWxhYmxlRW51bScgaXMgdW5hdmFpbGFibGV9fQorCisKK19fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSkKK1VuYXZhaWxhYmxlRW51bSB0ZXN0VW5hdmFpbGFibGUoVW5hdmFpbGFibGVFbnVtIFgpIHsgcmV0dXJuIFg7IH0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9hdHRyLXVzZWQuY3BwIGIvdGVzdC9TZW1hQ1hYL2F0dHItdXNlZC5jcHAKaW5kZXggOWJhZTNlZC4uNjVkZjg2MSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2F0dHItdXNlZC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2F0dHItdXNlZC5jcHAKQEAgLTEsNSArMSw1IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCiAKLWV4dGVybiBjaGFyIHRlc3QxW10gX19hdHRyaWJ1dGVfXygodXNlZCkpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dXNlZCBhdHRyaWJ1dGUgaWdub3JlZH19Ci1leHRlcm4gY29uc3QgY2hhciB0ZXN0MltdIF9fYXR0cmlidXRlX18oKHVzZWQpKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VzZWQgYXR0cmlidXRlIGlnbm9yZWR9fQorZXh0ZXJuIGNoYXIgdGVzdDFbXSBfX2F0dHJpYnV0ZV9fKCh1c2VkKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sndXNlZCcgYXR0cmlidXRlIGlnbm9yZWR9fQorZXh0ZXJuIGNvbnN0IGNoYXIgdGVzdDJbXSBfX2F0dHJpYnV0ZV9fKCh1c2VkKSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sndXNlZCcgYXR0cmlidXRlIGlnbm9yZWR9fQogZXh0ZXJuIGNvbnN0IGNoYXIgdGVzdDNbXSBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkgPSAiIjsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9hdHRyLXdlYWsuY3BwIGIvdGVzdC9TZW1hQ1hYL2F0dHItd2Vhay5jcHAKaW5kZXggODkzOWEyOC4uOGJhM2E5NSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2F0dHItd2Vhay5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2F0dHItd2Vhay5jcHAKQEAgLTEsOSArMSw5IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtcGMtbGludXgtZ251IC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LXBjLWxpbnV4LWdudSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXN0ZD1jKysxMSAlcwogCiBzdGF0aWMgaW50IHRlc3QwIF9fYXR0cmlidXRlX18oKHdlYWspKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t3ZWFrIGRlY2xhcmF0aW9uIGNhbm5vdCBoYXZlIGludGVybmFsIGxpbmthZ2V9fQogc3RhdGljIHZvaWQgdGVzdDEoKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7d2VhayBkZWNsYXJhdGlvbiBjYW5ub3QgaGF2ZSBpbnRlcm5hbCBsaW5rYWdlfX0KIAotbmFtZXNwYWNlIHRlc3QyIF9fYXR0cmlidXRlX18oKHdlYWspKSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snd2VhaycgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uc319CituYW1lc3BhY2UgdGVzdDIgX19hdHRyaWJ1dGVfXygod2VhaykpIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyd3ZWFrJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHZhcmlhYmxlcywgZnVuY3Rpb25zIGFuZCBjbGFzc2VzfX0KIH0KIAogbmFtZXNwYWNlIHsKQEAgLTMxLDYgKzMxLDEwIEBACiB9OwogdGVtcGxhdGUgPGNsYXNzIFQ+CiBpbnQgVGVzdDc8VD46OnZhcjsKLW5hbWVzcGFjZSB7IGNsYXNzIEludGVybmFsOyB9CituYW1lc3BhY2UgeyBjbGFzcyBJbnRlcm5hbCB7fTsgfQogdGVtcGxhdGUgc3RydWN0IFRlc3Q3PEludGVybmFsPjsKIHRlbXBsYXRlIHN0cnVjdCBUZXN0NzxpbnQ+OworCitjbGFzcyBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgVGVzdDgge307IC8vIE9LCisKK19fYXR0cmlidXRlX18oKHdlYWspKSBhdXRvIFRlc3Q5ID0gSW50ZXJuYWwoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t3ZWFrIGRlY2xhcmF0aW9uIGNhbm5vdCBoYXZlIGludGVybmFsIGxpbmthZ2V9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2F0dHItd2Vha3JlZi5jcHAgYi90ZXN0L1NlbWFDWFgvYXR0ci13ZWFrcmVmLmNwcAppbmRleCAwYzNmMWQyLi40NmNhNWFiIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvYXR0ci13ZWFrcmVmLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvYXR0ci13ZWFrcmVmLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1wYy1saW51eC1nbnUgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtcGMtbGludXgtZ251IC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtc3RkPWMrKzExICVzCiAKIC8vIEdDQyB3aWxsIGFjY2VwdCBhbnl0aGluZyBhcyB0aGUgYXJndW1lbnQgb2Ygd2Vha3JlZi4gU2hvdWxkIHdlCiAvLyBjaGVjayBmb3IgYW4gZXhpc3RpbmcgZGVjbD8KQEAgLTM0LDMgKzM0LDUgQEAKIGludCBhMTAoKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrcmVmICgiZm9vIikpKTsKIAogc3RhdGljIGludCB2IF9fYXR0cmlidXRlX18oKHdlYWtyZWYoYTEpLCBhbGlhcygiZm9vIikpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snd2Vha3JlZicgYXR0cmlidXRlIHJlcXVpcmVzIGEgc3RyaW5nfX0KKworX19hdHRyaWJ1dGVfXygod2Vha3JlZiAoImZvbyIpKSkgYXV0byBhMTEgPSAxOyAvLyBleHBlY3RlZC1lcnJvciB7e3dlYWtyZWYgZGVjbGFyYXRpb24gbXVzdCBoYXZlIGludGVybmFsIGxpbmthZ2V9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2M5OS12YXJpYWJsZS1sZW5ndGgtYXJyYXkuY3BwIGIvdGVzdC9TZW1hQ1hYL2M5OS12YXJpYWJsZS1sZW5ndGgtYXJyYXkuY3BwCmluZGV4IGJiNjIwYzcuLjIzN2Y1NjQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9jOTktdmFyaWFibGUtbGVuZ3RoLWFycmF5LmNwcAorKysgYi90ZXN0L1NlbWFDWFgvYzk5LXZhcmlhYmxlLWxlbmd0aC1hcnJheS5jcHAKQEAgLTE0MCwzICsxNDAsMjQgQEAKICAgfQogICBpbnQgdGVzdCA9IGY8aW50PigwKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2luc3RhbnRpYXRpb24gb2Z9fQogfQorCituYW1lc3BhY2UgcHIxODYzMyB7CisgIHN0cnVjdCBBMSB7CisgICAgc3RhdGljIGNvbnN0IGludCBzejsKKyAgICBzdGF0aWMgY29uc3QgaW50IHN6MjsKKyAgfTsKKyAgY29uc3QgaW50IEExOjpzejIgPSAxMTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgdm9pZCBmdW5jICgpIHsKKyAgICBpbnQgYXJyW0ExOjpzel07IC8vIGV4cGVjdGVkLXdhcm5pbmd7e3ZhcmlhYmxlIGxlbmd0aCBhcnJheXMgYXJlIGEgQzk5IGZlYXR1cmV9fQorICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHZvaWQgZnVuYzIgKCkgeworICAgIGludCBhcnJbQTE6OnN6Ml07CisgIH0KKyAgY29uc3QgaW50IEExOjpzeiA9IDEyOworICB2b2lkIGZ1bmMyKCkgeworICAgIGZ1bmM8aW50PigpOworICAgIGZ1bmMyPGludD4oKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2NhbGxpbmctY29udi1jb21wYXQuY3BwIGIvdGVzdC9TZW1hQ1hYL2NhbGxpbmctY29udi1jb21wYXQuY3BwCmluZGV4IDJkNTIzODYuLmNlYmFjOWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9jYWxsaW5nLWNvbnYtY29tcGF0LmNwcAorKysgYi90ZXN0L1NlbWFDWFgvY2FsbGluZy1jb252LWNvbXBhdC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtc3RkPWMrKzExIC1mbXMtZXh0ZW5zaW9ucyAtY3h4LWFiaSBtaWNyb3NvZnQgLXZlcmlmeSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC1zdGQ9YysrMTEgLWZtcy1leHRlbnNpb25zIC12ZXJpZnkgLXRyaXBsZSBpNjg2LXBjLXdpbjMyICVzCiAKIC8vIFBvaW50ZXJzIHRvIGZyZWUgZnVuY3Rpb25zCiB2b2lkICAgICAgICAgICAgZnJlZV9mdW5jX2RlZmF1bHQoKTsKQEAgLTM1MSwyNCArMzUxLDI1IEBACiB0eXBlZGVmIHZvaWQgKF9fc3RkY2FsbCAgZnVuX3N0ZGNhbGwpKCk7CiB0eXBlZGVmIHZvaWQgKF9fZmFzdGNhbGwgZnVuX2Zhc3RjYWxsKSgpOwogCi0vLyBGSVhNRTogQWRqdXN0IGNkZWNsIHRvIHRoaXNjYWxsIHdoZW4gZm9ybWluZyBhIG1lbWJlciBwb2ludGVyLgotLy9mdW5fZGVmYXVsdCAgQTo6KnRkMSA9ICZBOjptZXRob2RfdGhpc2NhbGw7Ci1mdW5fY2RlY2wgICAgQTo6KnRkMiA9ICZBOjptZXRob2RfY2RlY2w7CitmdW5fZGVmYXVsdCAgQTo6KnRkMSA9ICZBOjptZXRob2RfdGhpc2NhbGw7CitmdW5fY2RlY2wgICAgQTo6KnRkMiA9ICZBOjptZXRob2RfdGhpc2NhbGw7CiBmdW5fc3RkY2FsbCAgQTo6KnRkMyA9ICZBOjptZXRob2Rfc3RkY2FsbDsKIGZ1bl9mYXN0Y2FsbCBBOjoqdGQ0ID0gJkE6Om1ldGhvZF9mYXN0Y2FsbDsKIAogLy8gUm91bmQgdHJpcCB0aGUgZnVuY3Rpb24gdHlwZSB0aHJvdWdoIGEgdGVtcGxhdGUsIGFuZCB2ZXJpZnkgdGhhdCBvbmx5IGNkZWNsCiAvLyBnZXRzIGFkanVzdGVkLgotdGVtcGxhdGU8dHlwZW5hbWUgRm4+IHN0cnVjdCBYIHsKLSAgdHlwZWRlZiBGbiBBOjoqcDsKLX07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBGbj4gc3RydWN0IFggeyB0eXBlZGVmIEZuIEE6OipwOyB9OwogCi0vLyBGSVhNRTogQWRqdXN0IGNkZWNsIHRvIHRoaXNjYWxsIHdoZW4gZm9ybWluZyBhIG1lbWJlciBwb2ludGVyLgotLy9YPHZvaWQgICAgICAgICAgICAoKT46OnAgdG1wbDEgPSAmQTo6bWV0aG9kX3RoaXNjYWxsOwotLy9YPHZvaWQgX19jZGVjbCAgICAoKT46OnAgdG1wbDIgPSAmQTo6bWV0aG9kX3RoaXNjYWxsOworWDx2b2lkICAgICAgICAgICAgKCk+OjpwIHRtcGwxID0gJkE6Om1ldGhvZF90aGlzY2FsbDsKK1g8dm9pZCBfX2NkZWNsICAgICgpPjo6cCB0bXBsMiA9ICZBOjptZXRob2RfdGhpc2NhbGw7CiBYPHZvaWQgX19zdGRjYWxsICAoKT46OnAgdG1wbDMgPSAmQTo6bWV0aG9kX3N0ZGNhbGw7CiBYPHZvaWQgX19mYXN0Y2FsbCAoKT46OnAgdG1wbDQgPSAmQTo6bWV0aG9kX2Zhc3RjYWxsOwogCitYPGZ1bl9kZWZhdWx0ID46OnAgdG1wbDUgPSAmQTo6bWV0aG9kX3RoaXNjYWxsOworWDxmdW5fY2RlY2wgICA+OjpwIHRtcGw2ID0gJkE6Om1ldGhvZF90aGlzY2FsbDsKK1g8ZnVuX3N0ZGNhbGwgPjo6cCB0bXBsNyA9ICZBOjptZXRob2Rfc3RkY2FsbDsKK1g8ZnVuX2Zhc3RjYWxsPjo6cCB0bXBsOCA9ICZBOjptZXRob2RfZmFzdGNhbGw7CisKIH0gLy8gZW5kIG5hbWVzcGFjZSBNZW1iZXJQb2ludGVycwogCiAvLyBUZXN0IHRoYXQgbGFtYmRhcyB0aGF0IGNhcHR1cmUgbm90aGluZyBjb252ZXJ0IHRvIGNkZWNsIGZ1bmN0aW9uIHBvaW50ZXJzLgpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2NvbXBhcmUuY3BwIGIvdGVzdC9TZW1hQ1hYL2NvbXBhcmUuY3BwCmluZGV4IDgyMTRmNzguLmVmMGE1MjQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9jb21wYXJlLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvY29tcGFyZS5jcHAKQEAgLTIyNSw3ICsyMjUsNyBAQAogfQogCiAvLyBUZXN0IGNvbXBhcmlzb24gb2Ygc2hvcnQgdG8gdW5zaWduZWQuICBJZiB0YXV0b2xvZ2ljYWwgY29tcGFyZSBkb2VzIG5vdAotLy8gdHJpZ2dlciwgdGhlbiB0aGUgc2lnbmVkIGNvbXBhcmlzaW9uIHdhcm5pbmcgd2lsbC4KKy8vIHRyaWdnZXIsIHRoZW4gdGhlIHNpZ25lZCBjb21wYXJpc29uIHdhcm5pbmcgd2lsbC4KIHZvaWQgdGVzdDQoc2hvcnQgcykgewogICAvLyBBIGlzIG1heCBzaG9ydCBwbHVzIDEuICBBbGwgemVybyBhbmQgcG9zaXRpdmUgc2hvcnRzIGFyZSBzbWFsbGVyIHRoYW4gaXQuCiAgIC8vIEFsbCBuZWdhdGl2ZSBzaG9ydHMgYXJlIGNhc3QgdG93YXJkcyB0aGUgbWF4IHVuc2lnbmVkIHJhbmdlLiAgUmVsYXRpb24KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9jb25kaXRpb25hbC1leHByLmNwcCBiL3Rlc3QvU2VtYUNYWC9jb25kaXRpb25hbC1leHByLmNwcAppbmRleCA1YWJlZTRhLi41MzhkZTU4IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvY29uZGl0aW9uYWwtZXhwci5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2NvbmRpdGlvbmFsLWV4cHIuY3BwCkBAIC03NSw2ICs3NSw3IEBACiAgIGludCBpMSA9IFRvQm9vbCgpID8gMCA6IDE7CiAKICAgLy8gcDIgKG9uZSBvciBib3RoIHZvaWQsIGFuZCB0aHJvd2luZykKKyAgRmllbGRzIGZsZHM7CiAgIGkxID8gdGhyb3cgMCA6IHRocm93IDE7CiAgIGkxID8gdGVzdCgpIDogdGhyb3cgMTsKICAgaTEgPyB0aHJvdyAwIDogdGVzdCgpOwpAQCAtODUsOCArODYsMTYgQEAKICAgaTEgPSBpMSA/IDAgOiAodGhyb3cgMCk7CiAgIGkxID8gMCA6IHRlc3QoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyaWdodCBvcGVyYW5kIHRvID8gaXMgdm9pZCwgYnV0IGxlZnQgb3BlcmFuZCBpcyBvZiB0eXBlICdpbnQnfX0KICAgaTEgPyB0ZXN0KCkgOiAwOyAvLyBleHBlY3RlZC1lcnJvciB7e2xlZnQgb3BlcmFuZCB0byA/IGlzIHZvaWQsIGJ1dCByaWdodCBvcGVyYW5kIGlzIG9mIHR5cGUgJ2ludCd9fQotICAoaTEgPyB0aHJvdyAwIDogaTEpID0gMDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHByZXNzaW9uIGlzIG5vdCBhc3NpZ25hYmxlfX0KLSAgKGkxID8gaTEgOiB0aHJvdyAwKSA9IDA7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwcmVzc2lvbiBpcyBub3QgYXNzaWduYWJsZX19CisgIChpMSA/IHRocm93IDAgOiBpMSkgPSAwOworICAoaTEgPyBpMSA6IHRocm93IDApID0gMDsKKyAgKGkxID8gKHRocm93IDApIDogaTEpID0gMDsKKyAgKGkxID8gaTEgOiAodGhyb3cgMCkpID0gMDsKKyAgKGkxID8gKHZvaWQpKHRocm93IDApIDogaTEpID0gMDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tsZWZ0IG9wZXJhbmQgdG8gPyBpcyB2b2lkLCBidXQgcmlnaHQgb3BlcmFuZCBpcyBvZiB0eXBlICdpbnQnfX0KKyAgKGkxID8gaTEgOiAodm9pZCkodGhyb3cgMCkpID0gMDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyaWdodCBvcGVyYW5kIHRvID8gaXMgdm9pZCwgYnV0IGxlZnQgb3BlcmFuZCBpcyBvZiB0eXBlICdpbnQnfX0KKyAgaW50ICZ0aHJvd1JlZjEgPSAoaTEgPyBmbGRzLmkxIDogdGhyb3cgMCk7CisgIGludCAmdGhyb3dSZWYyID0gKGkxID8gdGhyb3cgMCA6IGZsZHMuaTEpOworICBpbnQgJnRocm93UmVmMyA9IChpMSA/IGZsZHMuYjEgOiB0aHJvdyAwKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tub24tY29uc3QgcmVmZXJlbmNlIGNhbm5vdCBiaW5kIHRvIGJpdC1maWVsZH19CisgIGludCAmdGhyb3dSZWY0ID0gKGkxID8gdGhyb3cgMCA6IGZsZHMuYjEpOyAvLyBleHBlY3RlZC1lcnJvciB7e25vbi1jb25zdCByZWZlcmVuY2UgY2Fubm90IGJpbmQgdG8gYml0LWZpZWxkfX0KIAogICAvLyBwMyAob25lIG9yIGJvdGggY2xhc3MgdHlwZSwgY29udmVydCB0byBlYWNoIG90aGVyKQogICAvLyBiMSAobHZhbHVlcykKQEAgLTE1MSw3ICsxNjAsNiBAQAogICAmKGkxID8gaTEgOiBpMik7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IHRha2UgdGhlIGFkZHJlc3Mgb2YgYW4gcnZhbHVlfX0KIAogICAvLyBwNCAobHZhbHVlLCBzYW1lIHR5cGUpCi0gIEZpZWxkcyBmbGRzOwogICBpbnQgJmlyMSA9IGkxID8gZmxkcy5pMSA6IGZsZHMuaTI7CiAgIChpMSA/IGZsZHMuYjEgOiBmbGRzLmkyKSA9IDA7CiAgIChpMSA/IGZsZHMuaTEgOiBmbGRzLmIyKSA9IDA7CkBAIC0yMTksOCArMjI3LDggQEAKICAgLy8gKm11c3QqIGNyZWF0ZSBhIHNlcGFyYXRlIHRlbXBvcmFyeSBjb3B5IG9mIGNsYXNzIG9iamVjdHMuIFRoaXMgY2FuIG9ubHkKICAgLy8gYmUgcHJvcGVybHkgdGVzdGVkIGF0IHJ1bnRpbWUsIHRob3VnaC4KIAotICBjb25zdCBBYnN0cmFjdCAmYSA9IHRydWUgPyBzdGF0aWNfY2FzdDxjb25zdCBBYnN0cmFjdCY+KERlcml2ZWQxKCkpIDogRGVyaXZlZDIoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thbGxvY2F0aW5nIGFuIG9iamVjdCBvZiBhYnN0cmFjdCBjbGFzcyB0eXBlICdjb25zdCBBYnN0cmFjdCd9fQotICB0cnVlID8gc3RhdGljX2Nhc3Q8Y29uc3QgQWJzdHJhY3QmPihEZXJpdmVkMSgpKSA6IHRocm93IDM7IC8vIGV4cGVjdGVkLWVycm9yIHt7YWxsb2NhdGluZyBhbiBvYmplY3Qgb2YgYWJzdHJhY3QgY2xhc3MgdHlwZSAnY29uc3QgQWJzdHJhY3QnfX0KKyAgY29uc3QgQWJzdHJhY3QgJmFic3RyYWN0MSA9IHRydWUgPyBzdGF0aWNfY2FzdDxjb25zdCBBYnN0cmFjdCY+KERlcml2ZWQxKCkpIDogRGVyaXZlZDIoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thbGxvY2F0aW5nIGFuIG9iamVjdCBvZiBhYnN0cmFjdCBjbGFzcyB0eXBlICdjb25zdCBBYnN0cmFjdCd9fQorICBjb25zdCBBYnN0cmFjdCAmYWJzdHJhY3QyID0gdHJ1ZSA/IHN0YXRpY19jYXN0PGNvbnN0IEFic3RyYWN0Jj4oRGVyaXZlZDEoKSkgOiB0aHJvdyAzOyAvLyBvawogfQogCiBuYW1lc3BhY2UgUFI2NTk1IHsKQEAgLTM2NywzICszNzUsMTIgQEAKICAgY29uc3Qgdm9sYXRpbGUgaW50ICZjdmlyMiA9IGIgPyBjdmkgOiB2aTsKICAgY29uc3Qgdm9sYXRpbGUgaW50ICZjdmlyMyA9IGIgPyBjaSA6IHZpOyAvLyBleHBlY3RlZC1lcnJvcnt7dm9sYXRpbGUgbHZhbHVlIHJlZmVyZW5jZSB0byB0eXBlICdjb25zdCB2b2xhdGlsZSBpbnQnIGNhbm5vdCBiaW5kIHRvIGEgdGVtcG9yYXJ5IG9mIHR5cGUgJ2ludCd9fQogfQorCituYW1lc3BhY2UgUFIxNzA1MiB7CisgIHN0cnVjdCBYIHsKKyAgICBpbnQgaV87CisgICAgYm9vbCBiXzsKKworICAgIGludCAmdGVzdCgpIHsgcmV0dXJuIGJfID8gaV8gOiB0aHJvdyAxOyB9CisgIH07Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvY29uc3QtY2FzdC5jcHAgYi90ZXN0L1NlbWFDWFgvY29uc3QtY2FzdC5jcHAKaW5kZXggMWZlMzUwZC4uY2I5OTM3YyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2NvbnN0LWNhc3QuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9jb25zdC1jYXN0LmNwcApAQCAtNjAsNyArNjAsNyBAQAogICAvLyBGdW5jdGlvbiBwb2ludGVycy4KICAgZiBmcDIgPSBjb25zdF9jYXN0PGY+KGZwMSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29uc3RfY2FzdCB0byAnZicgKGFrYSAnaW50ICgqKShpbnQpJyksIHdoaWNoIGlzIG5vdCBhIHJlZmVyZW5jZSwgcG9pbnRlci10by1vYmplY3QsIG9yIHBvaW50ZXItdG8tZGF0YS1tZW1iZXJ9fQogICB2b2lkIChBOjoqbWZuKSgpID0gMDsKLSAgKHZvaWQpY29uc3RfY2FzdDx2b2lkIChBOjoqKSgpPihtZm4pOyAvLyBleHBlY3RlZC1lcnJvciB7e2NvbnN0X2Nhc3QgdG8gJ3ZvaWQgKEE6OiopKCknLCB3aGljaCBpcyBub3QgYSByZWZlcmVuY2UsIHBvaW50ZXItdG8tb2JqZWN0LCBvciBwb2ludGVyLXRvLWRhdGEtbWVtYmVyfX0KKyAgKHZvaWQpY29uc3RfY2FzdDx2b2lkIChBOjoqKSgpPihtZm4pOyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e2NvbnN0X2Nhc3QgdG8gJ3ZvaWQgKEE6OiopKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319Jywgd2hpY2ggaXMgbm90IGEgcmVmZXJlbmNlLCBwb2ludGVyLXRvLW9iamVjdCwgb3IgcG9pbnRlci10by1kYXRhLW1lbWJlcn19CiAgICh2b2lkKWNvbnN0X2Nhc3Q8aW50JiY+KDApOyAvLyBleHBlY3RlZC1lcnJvciB7e2NvbnN0X2Nhc3QgZnJvbSBydmFsdWUgdG8gcmVmZXJlbmNlIHR5cGUgJ2ludCAmJid9fSBleHBlY3RlZC13YXJuaW5nIHt7QysrMTF9fQogICByZXR1cm4gKip2YXIzOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2NvbnN0YW50LWV4cHJlc3Npb24tY3h4MTEuY3BwIGIvdGVzdC9TZW1hQ1hYL2NvbnN0YW50LWV4cHJlc3Npb24tY3h4MTEuY3BwCmluZGV4IDY3MjRiZTcuLjU3NGU5YjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9jb25zdGFudC1leHByZXNzaW9uLWN4eDExLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvY29uc3RhbnQtZXhwcmVzc2lvbi1jeHgxMS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LWxpbnV4IC1Xbm8tc3RyaW5nLXBsdXMtaW50IC1Xbm8tcG9pbnRlci1hcml0aCAtV25vLXplcm8tbGVuZ3RoLWFycmF5IC1mc3ludGF4LW9ubHkgLWZjeHgtZXhjZXB0aW9ucyAtdmVyaWZ5IC1zdGQ9YysrMTEgLXBlZGFudGljICVzIC1Xbm8tY29tbWVudAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1saW51eCAtV25vLXN0cmluZy1wbHVzLWludCAtV25vLXBvaW50ZXItYXJpdGggLVduby16ZXJvLWxlbmd0aC1hcnJheSAtZnN5bnRheC1vbmx5IC1mY3h4LWV4Y2VwdGlvbnMgLXZlcmlmeSAtc3RkPWMrKzExIC1wZWRhbnRpYyAlcyAtV25vLWNvbW1lbnQgLVduby10YXV0b2xvZ2ljYWwtcG9pbnRlci1jb21wYXJlIC1Xbm8tYm9vbC1jb252ZXJzaW9uCiAKIG5hbWVzcGFjZSBTdGF0aWNBc3NlcnRGb2xkVGVzdCB7CiAKQEAgLTE4NjMsMyArMTg2MywxMyBAQAogICBjb25zdGV4cHIgY2hhciBkW10gPSB7ICdmJywgJ28nLCAnbycgfTsgLy8gbm8gbnVsIHRlcm1pbmF0b3IuCiAgIGNvbnN0ZXhwciBpbnQgYmFkID0gX19idWlsdGluX3N0cmxlbihkKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjb25zdGFudCBleHByZXNzaW9ufX0gZXhwZWN0ZWQtbm90ZSB7e29uZS1wYXN0LXRoZS1lbmR9fQogfQorCituYW1lc3BhY2UgUFIxOTAxMCB7CisgIHN0cnVjdCBFbXB0eSB7fTsKKyAgc3RydWN0IEVtcHR5MiA6IEVtcHR5IHt9OworICBzdHJ1Y3QgVGVzdCA6IEVtcHR5MiB7CisgICAgY29uc3RleHByIFRlc3QoKSB7fQorICAgIEVtcHR5MiBhcnJheVsyXTsKKyAgfTsKKyAgdm9pZCB0ZXN0KCkgeyBjb25zdGV4cHIgVGVzdCB0OyB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvY29uc3RhbnQtZXhwcmVzc2lvbi5jcHAgYi90ZXN0L1NlbWFDWFgvY29uc3RhbnQtZXhwcmVzc2lvbi5jcHAKaW5kZXggOTQyYmY0MS4uZTAxYWNkZCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2NvbnN0YW50LWV4cHJlc3Npb24uY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9jb25zdGFudC1leHByZXNzaW9uLmNwcApAQCAtMTI0LDMgKzEyNCwyMCBAQAogICBzdHJ1Y3QgWSB7IGJvb2wgYjsgWCB4OyB9OyAvLyBleHBlY3RlZC1lcnJvciB7e2ZpZWxkIGhhcyBpbmNvbXBsZXRlIHR5cGUgJ3Rlc3QzOjpYJ319CiAgIGludCBmKCkgeyByZXR1cm4gWSgpLmI7IH0KIH0KKworLy8gUFIxODI4MworbmFtZXNwYWNlIHRlc3Q0IHsKKyAgdGVtcGxhdGUgPGludD4gc3RydWN0IEEge307CisgIGludCBjb25zdCBpID0geyA0MiB9OworICAvLyBpIGNhbiBiZSB1c2VkIGFzIG5vbi10eXBlIHRlbXBsYXRlLXBhcmFtZXRlciBhcyAiY29uc3QgaW50IHggPSB7IDQyIH07IiBpcworICAvLyBlcXVpdmFsZW50IHRvICJjb25zdCBpbnQgeCA9IDQyOyIgYXMgcGVyIEMrKzAzIDguNS9wMTMuCisgIHR5cGVkZWYgQTxpPiBBaTsgLy8gb2sKK30KKworLy8gcmRhcjovLzE2MDY0OTUyCituYW1lc3BhY2UgcmRhcjE2MDY0OTUyIHsKKyAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4gdm9pZCBmbjEoKSB7CisgICBUIGI7CisgICB1bnNpZ25lZCB3ID0gKHtpbnQgYSA9IGIudmFsW3NpemVvZigwKV07IDA7IH0pOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dXNlIG9mIEdOVSBzdGF0ZW1lbnQgZXhwcmVzc2lvbiBleHRlbnNpb259fQorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvY29uc3RleHByLXZhbHVlLWluaXQuY3BwIGIvdGVzdC9TZW1hQ1hYL2NvbnN0ZXhwci12YWx1ZS1pbml0LmNwcAppbmRleCBlNWI3ZGI1Li45YWQxMTI5IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvY29uc3RleHByLXZhbHVlLWluaXQuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9jb25zdGV4cHItdmFsdWUtaW5pdC5jcHAKQEAgLTksNyArOSw3IEBACiAgIEEgYTsKIH07CiAKLWNvbnN0ZXhwciBBIGE7IC8vIG9rLCB6ZXJvIGluaXRpYWxpemF0aW9uIHByZWNlZWRzIHN0YXRpYyBpbml0aWFsaXphdGlvbgorY29uc3RleHByIEEgYTsgLy8gb2ssIHplcm8gaW5pdGlhbGl6YXRpb24gcHJlY2VkZXMgc3RhdGljIGluaXRpYWxpemF0aW9uCiB2b2lkIGYoKSB7CiAgIGNvbnN0ZXhwciBBIGE7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29uc3RhbnQgZXhwcmVzc2lvbn19IGV4cGVjdGVkLW5vdGUge3tpbiBjYWxsIHRvICdBKCknfX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9jb25zdHJ1Y3Rvci1pbml0aWFsaXplci5jcHAgYi90ZXN0L1NlbWFDWFgvY29uc3RydWN0b3ItaW5pdGlhbGl6ZXIuY3BwCmluZGV4IDE3NTc2MzIuLjgxZGMxOWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9jb25zdHJ1Y3Rvci1pbml0aWFsaXplci5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2NvbnN0cnVjdG9yLWluaXRpYWxpemVyLmNwcApAQCAtOTQsNyArOTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVyaXZlZDo6QmFzZTEoKSwgLy8gZXhwZWN0ZWQtZXJyb3Ige3t0eXBlICdEZXJpdmVkOjpCYXNlMScgaXMgbm90IGEgZGlyZWN0IG9yIHZpcnR1YWwgYmFzZSBvZiAnQ3VycmVudCd9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVyaXZlZDo6VigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpOb25FeGlzdGluZygpLCAvLyBleHBlY3RlZC1lcnJvciB7e21lbWJlciBpbml0aWFsaXplciAnTm9uRXhpc3RpbmcnIGRvZXMgbm90IG5hbWUgYSBub24tc3RhdGljIGRhdGEgbWVtYmVyIG9yfX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDo6Tm9uRXhpc3RpbmcoKSAge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBhIGNsYXNzIG9yIG5hbWVzcGFjZX19IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDo6Tm9uRXhpc3RpbmcoKSAge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3snSU5UJyAoYWthICdpbnQnKSBpcyBub3QgYSBjbGFzcywgbmFtZXNwYWNlLCBvciBzY29wZWQgZW51bWVyYXRpb259fSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7bWVtYmVyIGluaXRpYWxpemVyICdOb25FeGlzdGluZycgZG9lcyBub3QgbmFtZSBhIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIgb3J9fQogfTsKIApAQCAtMjMyLDE1ICsyMzIsMTQgQEAKIC8vIDxyZGFyOi8vcHJvYmxlbS84MzA4MjE1PjogZG9uJ3QgY3Jhc2guCiAvLyBMb3RzIG9mIHF1ZXN0aW9uYWJsZSByZWNvdmVyeSBoZXJlOyAgZXJyb3JzIGNhbiBjaGFuZ2UuCiBuYW1lc3BhY2UgdGVzdDMgewotICBjbGFzcyBBIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHt9OyAvLyBleHBlY3RlZC1lcnJvciB7e3VuZGVjbGFyZWQgaWRlbnRpZmllcn19IGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgY2xhc3MgbmFtZX19IGV4cGVjdGVkLW5vdGUgNCB7e2NhbmRpZGF0ZX19CisgIGNsYXNzIEEgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24ge307IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5kZWNsYXJlZCBpZGVudGlmaWVyfX0gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBjbGFzcyBuYW1lfX0gZXhwZWN0ZWQtbm90ZSAyIHt7Y2FuZGlkYXRlfX0KICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsKICAgcHVibGljOgogICAgIEIoY29uc3QgU3RyaW5nJiBzLCBpbnQgZT0wKSAvLyBleHBlY3RlZC1lcnJvciB7e3Vua25vd24gdHlwZSBuYW1lfX0gCiAgICAgICA6IEEoZSksIG1fU3RyaW5nKHMpICwgbV9FcnJvclN0cihfX251bGwpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWF0Y2hpbmcgY29uc3RydWN0b3J9fSBleHBlY3RlZC1lcnJvciB7e2RvZXMgbm90IG5hbWV9fQogICAgIEIoY29uc3QgQiYgZSkKICAgICAgIDogQShlKSwgbV9TdHJpbmcoZS5tX1N0cmluZyksIG1fRXJyb3JTdHIoX19udWxsKSB7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZG9lcyBub3QgbmFtZX19IFwKLSAgICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWVtYmVyIG5hbWVkICdtX1N0cmluZycgaW4gJ3Rlc3QzOjpCJ319IFwKLSAgICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWF0Y2hpbmd9fQorICAgICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtZW1iZXIgbmFtZWQgJ21fU3RyaW5nJyBpbiAndGVzdDM6OkInfX0KICAgICB9CiAgIH07CiB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvY29udmVyc2lvbi1mdW5jdGlvbi5jcHAgYi90ZXN0L1NlbWFDWFgvY29udmVyc2lvbi1mdW5jdGlvbi5jcHAKaW5kZXggN2VhZWQ1NC4uMWQ1NzAwZCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2NvbnZlcnNpb24tZnVuY3Rpb24uY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9jb252ZXJzaW9uLWZ1bmN0aW9uLmNwcApAQCAtNDA1LDMgKzQwNSwxNCBAQAogCiAgIEEgZihjb25zdCBDIGMpIHsgcmV0dXJuIGM7IH0KIH0KKworbmFtZXNwYWNlIFBSMTgyMzQgeworICBzdHJ1Y3QgQSB7CisgICAgb3BlcmF0b3IgZW51bSBFIHsgZSB9ICgpOyAvLyBleHBlY3RlZC1lcnJvciB7eydQUjE4MjM0OjpBOjpFJyBjYW5ub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KKyAgICBvcGVyYXRvciBzdHJ1Y3QgUyB7IGludCBuOyB9ICgpOyAvLyBleHBlY3RlZC1lcnJvciB7eydQUjE4MjM0OjpBOjpTJyBjYW5ub3QgYmUgZGVmaW5lZCBpbiBhIHR5cGUgc3BlY2lmaWVyfX0KKyAgfSBhOworICBBOjpTIHMgPSBhOworICBBOjpFIGUgPSBhOyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19CisgIGJvb2wgazEgPSBlID09IEE6OmU7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWVtYmVyIG5hbWVkICdlJ319CisgIGJvb2wgazIgPSBlLm4gPT0gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9jcmFzaGVzLmNwcCBiL3Rlc3QvU2VtYUNYWC9jcmFzaGVzLmNwcAppbmRleCAwYjE1YmIwLi4xNTcwZDEyIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvY3Jhc2hlcy5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2NyYXNoZXMuY3BwCkBAIC0yMTgsMyArMjE4LDE2IEBACiAgIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3N0cmluZ2J1ZjxjaGFyPjsKIH0KIAorbmFtZXNwYWNlIHByMTY5ODkgeworICBjbGFzcyBDIHsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBDIHRwbF9tZW0oVCAqKSB7IHJldHVybiB9ICAgIC8vIGV4cGVjdGVkLWVycm9ye3tleHBlY3RlZCBleHByZXNzaW9ufX0KKyAgICB2b2lkIG1lbShpbnQgKnApIHsKKyAgICAgIHRwbF9tZW0ocCk7CisgICAgfQorICB9OworICBjbGFzcyBDMiB7CisgICAgdm9pZCBmKCk7CisgIH07CisgIHZvaWQgQzI6OmYoKSB7fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2NzdHlsZS1jYXN0LmNwcCBiL3Rlc3QvU2VtYUNYWC9jc3R5bGUtY2FzdC5jcHAKaW5kZXggNDY4YzhlYy4uYWZhYzZhMSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2NzdHlsZS1jYXN0LmNwcAorKysgYi90ZXN0L1NlbWFDWFgvY3N0eWxlLWNhc3QuY3BwCkBAIC0yMjcsNiArMjI3LDYgQEAKICAgdm9pZCAoc3RydWN0dXJlOjoqcHNmKSgpID0gMDsKICAgKHZvaWQpKGludCAoc3RydWN0dXJlOjoqKSgpKShwc2YpOwogCi0gICh2b2lkKSh2b2lkIChzdHJ1Y3R1cmU6OiopKCkpKHBzaSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7Qy1zdHlsZSBjYXN0IGZyb20gJ2NvbnN0IGludCBzdHJ1Y3R1cmU6OionIHRvICd2b2lkIChzdHJ1Y3R1cmU6OiopKCknIGlzIG5vdCBhbGxvd2VkfX0KLSAgKHZvaWQpKGludCBzdHJ1Y3R1cmU6OiopKHBzZik7IC8vIGV4cGVjdGVkLWVycm9yIHt7Qy1zdHlsZSBjYXN0IGZyb20gJ3ZvaWQgKHN0cnVjdHVyZTo6KikoKScgdG8gJ2ludCBzdHJ1Y3R1cmU6OionIGlzIG5vdCBhbGxvd2VkfX0KKyAgKHZvaWQpKHZvaWQgKHN0cnVjdHVyZTo6KikoKSkocHNpKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3tDLXN0eWxlIGNhc3QgZnJvbSAnY29uc3QgaW50IHN0cnVjdHVyZTo6KicgdG8gJ3ZvaWQgKHN0cnVjdHVyZTo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIGlzIG5vdCBhbGxvd2VkfX0KKyAgKHZvaWQpKGludCBzdHJ1Y3R1cmU6OiopKHBzZik7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7Qy1zdHlsZSBjYXN0IGZyb20gJ3ZvaWQgKHN0cnVjdHVyZTo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIHRvICdpbnQgc3RydWN0dXJlOjoqJyBpcyBub3QgYWxsb3dlZH19CiB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvY3h4LWFsdGl2ZWMuY3BwIGIvdGVzdC9TZW1hQ1hYL2N4eC1hbHRpdmVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWFjYmFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hQ1hYL2N4eC1hbHRpdmVjLmNwcApAQCAtMCwwICsxLDUgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlPXBvd2VycGMtYXBwbGUtZGFyd2luOCAtZmFsdGl2ZWMgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisKK3N0cnVjdCBWZWN0b3IgeworCV9fdmVjdG9yIGZsb2F0IHh5enc7Cit9IF9fYXR0cmlidXRlX18oKHZlY3JldHVybikpIF9fYXR0cmlidXRlX18oKHZlY3JldHVybikpOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3sndmVjcmV0dXJuJyBhdHRyaWJ1dGUgY2Fubm90IGJlIHJlcGVhdGVkfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9jeHgweC1jdXJzb3J5LWRlZmF1bHQtZGVsZXRlLmNwcCBiL3Rlc3QvU2VtYUNYWC9jeHgweC1jdXJzb3J5LWRlZmF1bHQtZGVsZXRlLmNwcAppbmRleCBiMTA3OGRjLi4wN2E3ODQyIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvY3h4MHgtY3Vyc29yeS1kZWZhdWx0LWRlbGV0ZS5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2N4eDB4LWN1cnNvcnktZGVmYXVsdC1kZWxldGUuY3BwCkBAIC04MCwzICs4MCw3IEBACiAvLyAoYnV0IG5vdCBub3JtYWwgZGVmaW5pdGlvbnMpCiBzdHJ1Y3QgUyB7IFMoKTsgfTsKIFM6OlMoKSBfX2F0dHJpYnV0ZSgocHVyZSkpID0gZGVmYXVsdDsKKwordXNpbmcgc2l6ZV90ID0gZGVjbHR5cGUoc2l6ZW9mKDApKTsKK3ZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QpID0gZGVsZXRlOyAvLyBleHBlY3RlZC1lcnJvciB7e2RlbGV0ZWQgZGVmaW5pdGlvbiBtdXN0IGJlIGZpcnN0IGRlY2xhcmF0aW9ufX0gZXhwZWN0ZWQtbm90ZSB7e2ltcGxpY2l0fX0KK3ZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKikgbm9leGNlcHQgPSBkZWxldGU7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZGVsZXRlZCBkZWZpbml0aW9uIG11c3QgYmUgZmlyc3QgZGVjbGFyYXRpb259fSBleHBlY3RlZC1ub3RlIHt7aW1wbGljaXR9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2N4eDB4LWRlbGVnYXRpbmctY3RvcnMuY3BwIGIvdGVzdC9TZW1hQ1hYL2N4eDB4LWRlbGVnYXRpbmctY3RvcnMuY3BwCmluZGV4IGEzNGVlNGYuLjJlMWFiZjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9jeHgweC1kZWxlZ2F0aW5nLWN0b3JzLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvY3h4MHgtZGVsZWdhdGluZy1jdG9ycy5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKIH0KIAogc3RydWN0IGRlbGV0ZWRfZHRvciB7Ci0gIH5kZWxldGVkX2R0b3IoKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZXt7ZnVuY3Rpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KKyAgfmRlbGV0ZWRfZHRvcigpID0gZGVsZXRlOyAvLyBleHBlY3RlZC1ub3Rle3snfmRlbGV0ZWRfZHRvcicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KICAgZGVsZXRlZF9kdG9yKCk7CiAgIGRlbGV0ZWRfZHRvcihpbnQpIDogZGVsZXRlZF9kdG9yKCkgLy8gZXhwZWN0ZWQtZXJyb3J7e2F0dGVtcHQgdG8gdXNlIGEgZGVsZXRlZCBmdW5jdGlvbn19CiAgIHt9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvY3h4MHgtZGVsZXRlZC1kZWZhdWx0LWN0b3IuY3BwIGIvdGVzdC9TZW1hQ1hYL2N4eDB4LWRlbGV0ZWQtZGVmYXVsdC1jdG9yLmNwcAppbmRleCAwY2ViYzEwLi5iOWFmNjc5IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvY3h4MHgtZGVsZXRlZC1kZWZhdWx0LWN0b3IuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9jeHgweC1kZWxldGVkLWRlZmF1bHQtY3Rvci5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKIGdvb2RfY29uc3QgZ2M7CiAKIHN0cnVjdCBub19kZWZhdWx0IHsKLSAgbm9fZGVmYXVsdCgpID0gZGVsZXRlOyAvLyBleHBlY3RlZC1ub3RlIDN7e2RlbGV0ZWQgaGVyZX19CisgIG5vX2RlZmF1bHQoKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSA0e3tkZWxldGVkIGhlcmV9fQogfTsKIHN0cnVjdCBub19kdG9yIHsKICAgfm5vX2R0b3IoKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSAye3tkZWxldGVkIGhlcmV9fQpAQCAtMTE0LDcgKzExNCw3IEBACiBkZWZhdWx0ZWRfZGVsZXRlIGRkOyAvLyBleHBlY3RlZC1lcnJvciB7e2NhbGwgdG8gaW1wbGljaXRseS1kZWxldGVkIGRlZmF1bHQgY29uc3RydWN0b3J9fQogCiBzdHJ1Y3QgbGF0ZV9kZWxldGUgewotICBub19kZWZhdWx0IG5kOworICBub19kZWZhdWx0IG5kOyAvLyBleHBlY3RlZC1ub3RlIHt7YmVjYXVzZSBmaWVsZCAnbmQnIGhhcyBhIGRlbGV0ZWQgZGVmYXVsdCBjb25zdHJ1Y3Rvcn19CiAgIGxhdGVfZGVsZXRlKCk7CiB9OwogbGF0ZV9kZWxldGU6OmxhdGVfZGVsZXRlKCkgPSBkZWZhdWx0OyAvLyBleHBlY3RlZC1lcnJvciB7e3dvdWxkIGRlbGV0ZSBpdH19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvY3h4MHgtdHlwZS1jb252ZXJ0LWNvbnN0cnVjdC5jcHAgYi90ZXN0L1NlbWFDWFgvY3h4MHgtdHlwZS1jb252ZXJ0LWNvbnN0cnVjdC5jcHAKaW5kZXggNmE3ZmU0NS4uMjVhNDNkNyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2N4eDB4LXR5cGUtY29udmVydC1jb25zdHJ1Y3QuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9jeHgweC10eXBlLWNvbnZlcnQtY29uc3RydWN0LmNwcApAQCAtOSw5ICs5LDkgQEAKICAgVXN0ciA9IFUiYSBVVEYtMzIgc3RyaW5nIjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thc3NpZ25pbmcgdG8gJ2NoYXIzMl90IConIGZyb20gaW5jb21wYXRpYmxlIHR5cGUgJ2NvbnN0IGNoYXIzMl90IFsxNl0nfX0KIAogICBjaGFyICpSc3RyOwotICBSc3RyID0gUiJmb28oYSByYXcgc3RyaW5nKWZvbyI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2NvbnZlcnNpb24gZnJvbSBzdHJpbmcgbGl0ZXJhbCB0byAnY2hhciAqJyBpcyBkZXByZWNhdGVkfX0KKyAgUnN0ciA9IFIiZm9vKGEgcmF3IHN0cmluZylmb28iOyAvLyBleHBlY3RlZC13YXJuaW5ne3tJU08gQysrMTEgZG9lcyBub3QgYWxsb3cgY29udmVyc2lvbiBmcm9tIHN0cmluZyBsaXRlcmFsIHRvICdjaGFyIConfX0KICAgd2NoYXJfdCAqTFJzdHI7Ci0gIExSc3RyID0gTFIiZm9vKGEgd2lkZSByYXcgc3RyaW5nKWZvbyI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2NvbnZlcnNpb24gZnJvbSBzdHJpbmcgbGl0ZXJhbCB0byAnd2NoYXJfdCAqJyBpcyBkZXByZWNhdGVkfX0KKyAgTFJzdHIgPSBMUiJmb28oYSB3aWRlIHJhdyBzdHJpbmcpZm9vIjsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7SVNPIEMrKzExIGRvZXMgbm90IGFsbG93IGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgbGl0ZXJhbCB0byAnd2NoYXJfdCAqJ319CiAgIGNoYXIgKnU4UnN0cjsKICAgdThSc3RyID0gdThSImZvbyhhIFVURi04IHJhdyBzdHJpbmcpZm9vIjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thc3NpZ25pbmcgdG8gJ2NoYXIgKicgZnJvbSBpbmNvbXBhdGlibGUgdHlwZSAnY29uc3QgY2hhciBbMTldJ319CiAgIGNoYXIxNl90ICp1UnN0cjsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9jeHgxMS1hdHRyLXByaW50LmNwcCBiL3Rlc3QvU2VtYUNYWC9jeHgxMS1hdHRyLXByaW50LmNwcAppbmRleCAwMTMyNWQzLi45OTllYWVkIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvY3h4MTEtYXR0ci1wcmludC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2N4eDExLWF0dHItcHJpbnQuY3BwCkBAIC00Miw5ICs0Miw2IEBACiAvLyBDSEVDSzoge3tcW319W25vcmV0dXJuXV07CiB2b2lkIGY0IFtbbm9yZXR1cm5dXSAoKTsKIAotLy8gQ0hFQ0s6IHt7XFt9fVtzdGQ6Om5vcmV0dXJuXV07Ci12b2lkIGY1IFtbc3RkOjpub3JldHVybl1dICgpOwotCiAvLyBDSEVDSzogX19hdHRyaWJ1dGVfXygoZ251X2lubGluZSkpOwogaW5saW5lIHZvaWQgZjYoKSBfX2F0dHJpYnV0ZV9fKChnbnVfaW5saW5lKSk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9jeHgxMS1nbnUtYXR0cnMuY3BwIGIvdGVzdC9TZW1hQ1hYL2N4eDExLWdudS1hdHRycy5jcHAKaW5kZXggMjJkNjFhMS4uOWYxODIyNCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2N4eDExLWdudS1hdHRycy5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2N4eDExLWdudS1hdHRycy5jcHAKQEAgLTE5LDggKzE5LDYgQEAKIHZvaWQgYWxpZ25lZF9mbiBbW2dudTo6YWxpZ25lZCgzMildXSAoKTsKIHN0cnVjdCBbW2dudTo6YWxpZ25lZCg4KV1dIGFsaWduZWRfc3RydWN0IHt9OwogCi1bW2dudTo6bWFsbG9jLCBnbnU6OmFsbG9jX3NpemUoMSwyKV1dIHZvaWQgKmFsbG9jX3NpemUoaW50IGEsIGludCBiKTsKLQogdm9pZCBhbHdheXNfaW5saW5lIFtbZ251OjphbHdheXNfaW5saW5lXV0gKCk7CiAKIF9fdGhyZWFkIGludCB0bHNfbW9kZWwgW1tnbnU6OnRsc19tb2RlbCgibG9jYWwtZXhlYyIpXV07CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvY3h4MTEtdXNlci1kZWZpbmVkLWxpdGVyYWxzLmNwcCBiL3Rlc3QvU2VtYUNYWC9jeHgxMS11c2VyLWRlZmluZWQtbGl0ZXJhbHMuY3BwCmluZGV4IGY4YmJjZDkuLmNiNzc5NjQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9jeHgxMS11c2VyLWRlZmluZWQtbGl0ZXJhbHMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9jeHgxMS11c2VyLWRlZmluZWQtbGl0ZXJhbHMuY3BwCkBAIC0xNDEsMyArMTQxLDI3IEBACiAgIGludCBvcGVyYXRvciIiIF9iKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gZnVuY3Rpb24gdGVtcGxhdGUgbWF0Y2hlcyBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbn19CiAgIGludCBtYWluKCkgeyByZXR1cm4gMF9iOyB9IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWF0Y2hpbmcgbGl0ZXJhbCBvcGVyYXRvciBmb3IgY2FsbCB0byAnb3BlcmF0b3IgIiIgX2InfX0KIH0KKworbmFtZXNwYWNlIGJhZF9uYW1lcyB7CisgIHRlbXBsYXRlPGNoYXIuLi4+IGludCBvcGVyYXRvciIiX3goKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYoKSB7CisgICAgY2xhc3MgVDo6IC8vIGV4cGVjdGVkLWVycm9yIHt7YW5vbnltb3VzIGNsYXNzfX0gZXhwZWN0ZWQtd2FybmluZyB7e2RvZXMgbm90IGRlY2xhcmUgYW55dGhpbmd9fQorICAgICAgICBvcGVyYXRvciAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGlkZW50aWZpZXJ9fQorICAgICAgICAgICAgIiJfcTwnYSc+OworCisgICAgVDo6dGVtcGxhdGUgb3BlcmF0b3IiIl9xPCdhJz4oKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tub24tbmFtZXNwYWNlIHNjb3BlICdUOjonIGNhbm5vdCBoYXZlIGEgbGl0ZXJhbCBvcGVyYXRvciBtZW1iZXJ9fSBleHBlY3RlZC1lcnJvciAre3t9fQorICAgIFQ6OnRlbXBsYXRlIG9wZXJhdG9yIiJfcTwnYSc+OjpYOyAvLyBleHBlY3RlZC1lcnJvciB7e25vbi1uYW1lc3BhY2Ugc2NvcGUgJ1Q6OicgY2Fubm90IGhhdmUgYSBsaXRlcmFsIG9wZXJhdG9yIG1lbWJlcn19IGV4cGVjdGVkLWVycm9yICt7e319CisgICAgVDo6b3BlcmF0b3IiIl9xPCdhJz4oKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tub24tbmFtZXNwYWNlIHNjb3BlICdUOjonIGNhbm5vdCBoYXZlIGEgbGl0ZXJhbCBvcGVyYXRvciBtZW1iZXJ9fSBleHBlY3RlZC1lcnJvciAre3t9fQorICAgIHR5cGVuYW1lIFQ6OnRlbXBsYXRlIG9wZXJhdG9yIiJfcTwnYSc+IGE7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm9uLW5hbWVzcGFjZSBzY29wZSAnVDo6JyBjYW5ub3QgaGF2ZSBhIGxpdGVyYWwgb3BlcmF0b3IgbWVtYmVyfX0gZXhwZWN0ZWQtZXJyb3IgK3t7fX0KKyAgICB0eXBlbmFtZSBUOjpvcGVyYXRvciIiX3EoIiIpOyAvLyBleHBlY3RlZC1lcnJvciAre3t9fSBleHBlY3RlZC1ub3RlIHt7dG8gbWF0Y2h9fQorICAgIFQ6Om9wZXJhdG9yIiJfcSgiIik7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm9uLW5hbWVzcGFjZSBzY29wZSAnVDo6JyBjYW5ub3QgaGF2ZSBhIGxpdGVyYWwgb3BlcmF0b3IgbWVtYmVyfX0KKworICAgIGJhZF9uYW1lczo6b3BlcmF0b3IiIl94PCdhJywgJ2InLCAnYyc+KCk7CisgIH07CisKKyAgc3RydWN0IFMge307CisgIHZvaWQgZygpIHsKKyAgICBTOjpvcGVyYXRvciIiX3EoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tub24tbmFtZXNwYWNlIHNjb3BlICdTOjonIGNhbm5vdCBoYXZlIGEgbGl0ZXJhbCBvcGVyYXRvciBtZW1iZXJ9fQorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvY3h4MXktZ2VuZXJpYy1sYW1iZGFzLmNwcCBiL3Rlc3QvU2VtYUNYWC9jeHgxeS1nZW5lcmljLWxhbWJkYXMuY3BwCmluZGV4IDIwZTA2ZjQuLmRjODU3NDggMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9jeHgxeS1nZW5lcmljLWxhbWJkYXMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9jeHgxeS1nZW5lcmljLWxhbWJkYXMuY3BwCkBAIC0zLDYgKzMsMTcgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzF5IC12ZXJpZnkgLWZzeW50YXgtb25seSAtZmJsb2NrcyAtZm1zLWV4dGVuc2lvbnMgJXMgLURNU19FWFRFTlNJT05TCiAvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxeSAtdmVyaWZ5IC1mc3ludGF4LW9ubHkgLWZibG9ja3MgLWZkZWxheWVkLXRlbXBsYXRlLXBhcnNpbmcgLWZtcy1leHRlbnNpb25zICVzIC1ETVNfRVhURU5TSU9OUyAtRERFTEFZRURfVEVNUExBVEVfUEFSU0lORwogCit0ZW1wbGF0ZTxjbGFzcyBGLCBjbGFzcyAuLi5SZXN0PiBzdHJ1Y3QgZmlyc3RfaW1wbCB7IHR5cGVkZWYgRiB0eXBlOyB9OwordGVtcGxhdGU8Y2xhc3MgLi4uQXJncz4gdXNpbmcgZmlyc3QgPSB0eXBlbmFtZSBmaXJzdF9pbXBsPEFyZ3MuLi4+Ojp0eXBlOworCituYW1lc3BhY2Ugc2ltcGxlX2V4cGxpY2l0X2NhcHR1cmUgeworICB2b2lkIHRlc3QoKSB7CisgICAgaW50IGk7CisgICAgYXV0byBMID0gW2ldKGF1dG8gYSkgeyByZXR1cm4gaSArIGE7IH07CisgICAgTCgzLjE0KTsKKyAgfQorfQorCiBuYW1lc3BhY2UgZXhwbGljaXRfY2FsbCB7CiBpbnQgdGVzdCgpIHsKICAgYXV0byBMID0gW10oYXV0byBhKSB7IHJldHVybiBhOyB9OwpAQCAtNDg5LDggKzUwMCw2IEBACiAKIHRlbXBsYXRlPGNsYXNzIC4uLiBUcz4gdm9pZCBwcmludChUcyAuLi4gdHMpIHsgfQogCi10ZW1wbGF0ZTxjbGFzcyBGLCBjbGFzcyAuLi4gUmVzdD4gdXNpbmcgZmlyc3QgPSBGOwotCiB0ZW1wbGF0ZTxjbGFzcyAuLi4gVHM+IGF1dG8gZm9vVihUcyAuLi4gdHMpIHsKICAgYXV0byBMID0gW10oYXV0byAuLi4gYSkgeyAKICAgICBhdXRvIE0gPSBbXShkZWNsdHlwZShhKSAuLi4gYikgeyAgCkBAIC01NjAsNyArNTY5LDYgQEAKIG5hbWVzcGFjZSB2YXJpYWRpY190ZXN0c18xIHsKIHRlbXBsYXRlPGNsYXNzIC4uLiBUcz4gdm9pZCBwcmludChUcyAuLi4gdHMpIHsgfQogCi10ZW1wbGF0ZTxjbGFzcyBGLCBjbGFzcyAuLi4gUmVzdD4gdXNpbmcgRmlyc3RUeXBlID0gRjsKIHRlbXBsYXRlPGNsYXNzIEYsIGNsYXNzIC4uLiBSZXN0PiBGJiBGaXJzdEFyZyhGJiBmLCBSZXN0Li4uKSB7IHJldHVybiBmOyB9CiAgCiB0ZW1wbGF0ZTxjbGFzcyAuLi4gVHM+IGludCBmb29WKFRzIC4uLiB0cykgewpAQCAtNTc0LDcgKzU4Miw3IEBACiAgICAgICB9OyAgCiAgICAgICBOKCdhJyk7CiAgICAgICBOKE4pOwotICAgICAgTihGaXJzdFR5cGU8VHMuLi4+e30pOworICAgICAgTihmaXJzdDxUcy4uLj57fSk7CiAgICAgfTsKICAgICBNKGEuLi4pOwogICAgIHByaW50KCJhID0gIiwgYS4uLiwgIlxuIik7ICAgIApAQCAtNTk5LDcgKzYwNyw3IEBACiAgICAgICB9OyAgCiAgICAgICBOKCdhJyk7CiAgICAgICBOKE4pOwotICAgICAgTihGaXJzdFR5cGU8VHMuLi4+e30pOworICAgICAgTihmaXJzdDxUcy4uLj57fSk7CiAgICAgfTsKICAgICBNKGEuLi4pOwogICAgIHJldHVybiBNOwpAQCAtNjE5LDcgKzYyNyw3IEBACiAgICAgICAgIH07ICAKICAgICAgICAgTignYScpOwogICAgICAgICBOKE4pOwotICAgICAgICBOKEZpcnN0VHlwZTxUcy4uLj57fSk7CisgICAgICAgIE4oZmlyc3Q8VHMuLi4+e30pOwogICAgICAgICByZXR1cm4gTjsKICAgICAgIH07CiAgICAgICBNKGEuLi4pOwpAQCAtNzYzLDcgKzc3MSw2IEBACiAKIAogbmFtZXNwYWNlIGZwdHJfd2l0aF9kZWNsdHlwZV9yZXR1cm5fdHlwZSB7Ci10ZW1wbGF0ZTxjbGFzcyBGLCBjbGFzcyAuLi4gVHM+IHVzaW5nIEZpcnN0VHlwZSA9IEY7CiB0ZW1wbGF0ZTxjbGFzcyBGLCBjbGFzcyAuLi4gUmVzdD4gRiYgRmlyc3RBcmcoRiYgZiwgUmVzdCYgLi4uIHIpIHsgcmV0dXJuIGY7IH07CiB0ZW1wbGF0ZTxjbGFzcyAuLi4gVHM+IGF1dG8gdmZ1bihUcyYmIC4uLiB0cykgewogICBwcmludCh0cy4uLik7CkBAIC03NzQsNyArNzgxLDcgQEAKICB7CiAgICBhdXRvIEwgPSBbXShhdXRvIC4uLiBBcykgewogICAgIHJldHVybiBbXShhdXRvIGIpIC0+ZGVjbHR5cGUoYikgeyAgIAotICAgICAgdmZ1bihbXShkZWNsdHlwZShBcykgYSkgLT4gZGVjbHR5cGUoYSkgeyByZXR1cm4gYTsgfSAuLi4pKEZpcnN0VHlwZTxkZWNsdHlwZShBcykuLi4+e30pOworICAgICAgdmZ1bihbXShkZWNsdHlwZShBcykgYSkgLT4gZGVjbHR5cGUoYSkgeyByZXR1cm4gYTsgfSAuLi4pKGZpcnN0PGRlY2x0eXBlKEFzKS4uLj57fSk7CiAgICAgICByZXR1cm4gZGVjbHR5cGUoYil7fTsKICAgICB9OwogICAgfTsKQEAgLTkwNSw0ICs5MTIsNCBAQAogCiAKIAotfSAvL2VuZCBucyBpbmNsYXNzX2xhbWJkYXNfd2l0aGluX25lc3RlZF9jbGFzc2VzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfSAvL2VuZCBucyBpbmNsYXNzX2xhbWJkYXNfd2l0aGluX25lc3RlZF9jbGFzc2VzCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvY3h4MXktaW5pdC1jYXB0dXJlcy5jcHAgYi90ZXN0L1NlbWFDWFgvY3h4MXktaW5pdC1jYXB0dXJlcy5jcHAKaW5kZXggMmNiNGQzMS4uNjRmZTUwYSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2N4eDF5LWluaXQtY2FwdHVyZXMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9jeHgxeS1pbml0LWNhcHR1cmVzLmNwcApAQCAtMzYsNyArMzYsNyBAQAogbmFtZXNwYWNlIG9kcl91c2Vfd2l0aGluX2luaXRfY2FwdHVyZSB7CiAKIGludCB0ZXN0KCkgewotCisgIAogICB7IC8vIG5vIGNhcHR1cmVzCiAgICAgY29uc3QgaW50IHggPSAxMDsKICAgICBhdXRvIEwgPSBbeiA9IHggKyAyXShpbnQgYSkgewpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2N4eDF5LXZhcmlhYmxlLXRlbXBsYXRlc19pbl9jbGFzcy5jcHAgYi90ZXN0L1NlbWFDWFgvY3h4MXktdmFyaWFibGUtdGVtcGxhdGVzX2luX2NsYXNzLmNwcAppbmRleCA5NGQwZjE2Li4xZTVlODM0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvY3h4MXktdmFyaWFibGUtdGVtcGxhdGVzX2luX2NsYXNzLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvY3h4MXktdmFyaWFibGUtdGVtcGxhdGVzX2luX2NsYXNzLmNwcApAQCAtMzksMTEgKzM5LDExIEBACiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IENPTlNUIFQgQjE6OnJpZ2h0PFQsaW50PiA9IFQoNSk7CiAKICAgY2xhc3MgQjIgewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQwPiBzdGF0aWMgQ09OU1QgVCByaWdodCA9IFQoMTAwKTsgIC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91cyBkZWZpbml0aW9uIGlzIGhlcmV9fQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0YXRpYyBDT05TVCBUIHJpZ2h0PFQsaW50PiA9IFQoNSk7ICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91cyBkZWZpbml0aW9uIGlzIGhlcmV9fQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQwPiBzdGF0aWMgQ09OU1QgVCByaWdodCA9IFQoMTAwKTsgIC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91cyBpbml0aWFsaXphdGlvbiBpcyBoZXJlfX0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdGF0aWMgQ09OU1QgVCByaWdodDxULGludD4gPSBUKDUpOyAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXMgaW5pdGlhbGl6YXRpb24gaXMgaGVyZX19CiAgIH07Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQwPiBDT05TVCBUIEIyOjpyaWdodCA9IFQoMTAwKTsgICAvLyBleHBlY3RlZC1lcnJvciB7e3JlZGVmaW5pdGlvbiBvZiAncmlnaHQnfX0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gQ09OU1QgVCBCMjo6cmlnaHQ8VCxpbnQ+ID0gVCg1KTsgICAgICAgICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7cmVkZWZpbml0aW9uIG9mICdyaWdodCd9fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBUMD4gQ09OU1QgVCBCMjo6cmlnaHQgPSBUKDEwMCk7ICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tzdGF0aWMgZGF0YSBtZW1iZXIgJ3JpZ2h0JyBhbHJlYWR5IGhhcyBhbiBpbml0aWFsaXplcn19CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IENPTlNUIFQgQjI6OnJpZ2h0PFQsaW50PiA9IFQoNSk7ICAgICAgICAgICAvLyBleHBlY3RlZC1lcnJvciB7e3N0YXRpYyBkYXRhIG1lbWJlciAncmlnaHQnIGFscmVhZHkgaGFzIGFuIGluaXRpYWxpemVyfX0KIAogICBjbGFzcyBCMyB7CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVDA+IHN0YXRpYyBDT05TVCBUIHJpZ2h0ID0gVCgxMDApOwpAQCAtMjkxLDYgKzI5MSwzMCBAQAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lLi4uVT4gVCBBPFQ+Ojp5PHR1cGxlPFUuLi4+ID5bXSA9IHsgVSgpLi4uIH07CiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQTxpbnQ+Ojp5PHR1cGxlPGNoYXIsIGNoYXIsIGNoYXI+ID4pID09IDEyLCAiIik7CiAgIH0KKworICBuYW1lc3BhY2UgYmFkX3JlZmVyZW5jZSB7CisgICAgc3RydWN0IFMgeworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RhdGljIGludCBBOyAvLyBleHBlY3RlZC1ub3RlIDR7e2hlcmV9fQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYoKSB7CisgICAgICB0eXBlbmFtZSBUOjp0ZW1wbGF0ZSBBPGludD4gYTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t0ZW1wbGF0ZSBuYW1lIHJlZmVycyB0byBub24tdHlwZSB0ZW1wbGF0ZSAnUzo6QSd9fQorICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGcoKSB7CisgICAgICBUOjp0ZW1wbGF0ZSBBPGludD46OkIgPSAwOyAvLyBleHBlY3RlZC1lcnJvciB7e3RlbXBsYXRlIG5hbWUgcmVmZXJzIHRvIG5vbi10eXBlIHRlbXBsYXRlICdTOjpBJ319CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgaCgpIHsKKyAgICAgIGNsYXNzIFQ6OnRlbXBsYXRlIEE8aW50PiBjOyAvLyBleHBlY3RlZC1lcnJvciB7e3RlbXBsYXRlIG5hbWUgcmVmZXJzIHRvIG5vbi10eXBlIHRlbXBsYXRlICdTOjpBJ319CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgWCA6IFQ6OnRlbXBsYXRlIEE8aW50PiB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t0ZW1wbGF0ZSBuYW1lIHJlZmVycyB0byBub24tdHlwZSB0ZW1wbGF0ZSAnUzo6QSd9fQorCisgICAgdGVtcGxhdGUgdm9pZCBmPFM+KCk7IC8vIGV4cGVjdGVkLW5vdGUge3tpbiBpbnN0YW50aWF0aW9uIG9mfX0KKyAgICB0ZW1wbGF0ZSB2b2lkIGc8Uz4oKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2luIGluc3RhbnRpYXRpb24gb2Z9fQorICAgIHRlbXBsYXRlIHZvaWQgaDxTPigpOyAvLyBleHBlY3RlZC1ub3RlIHt7aW4gaW5zdGFudGlhdGlvbiBvZn19CisgICAgdGVtcGxhdGUgc3RydWN0IFg8Uz47IC8vIGV4cGVjdGVkLW5vdGUge3tpbiBpbnN0YW50aWF0aW9uIG9mfX0KKyAgfQogfQogCiBuYW1lc3BhY2UgaW5fbmVzdGVkX2NsYXNzZXMgewpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2N4eDF5LXZhcmlhYmxlLXRlbXBsYXRlc190b3BfbGV2ZWwuY3BwIGIvdGVzdC9TZW1hQ1hYL2N4eDF5LXZhcmlhYmxlLXRlbXBsYXRlc190b3BfbGV2ZWwuY3BwCmluZGV4IGI2ZTg3NjIuLjM3ZDViZjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9jeHgxeS12YXJpYWJsZS10ZW1wbGF0ZXNfdG9wX2xldmVsLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvY3h4MXktdmFyaWFibGUtdGVtcGxhdGVzX3RvcF9sZXZlbC5jcHAKQEAgLTgxLDcgKzgxLDcgQEAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIHY7IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91cyBkZWZpbml0aW9uIGlzIGhlcmV9fQogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCB2OyAvLyBleHBlY3RlZC1lcnJvciB7e3JlZGVmaW5pdGlvbiBvZiAndid9fQogICAgIAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCB2MTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzIHRlbXBsYXRlIGRlY2xhcmF0aW9uIGlzIGhlcmV9fQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGV4dGVybiBpbnQgdjE7IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91cyB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KICAgICB0ZW1wbGF0ZTxpbnQgST4gaW50IHYxOyAgICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7dGVtcGxhdGUgcGFyYW1ldGVyIGhhcyBhIGRpZmZlcmVudCBraW5kIGluIHRlbXBsYXRlIHJlZGVjbGFyYXRpb259fQogICB9CiAgIG5hbWVzcGFjZSBwdnRfdXNlIHsKQEAgLTkwLDExICs5MCw4IEBACiAgIH0KIAogICBuYW1lc3BhY2UgcHZ0X2RpZmZfcGFyYW1zIHsKLSAgICAvLyBGSVhNRTogKD8pIFJlZGVmaW5pdGlvbnMgc2hvdWxkIHNpbXBseSBiZSBub3QgYWxsb3dlZCwgd2hldGhlciB0aGUKLSAgICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIG1hdGNoIG9yIG5vdC4gSG93ZXZlciwgdGhpcyBjdXJyZW50IGJlaGF2aW91ciBhbHNvCi0gICAgLy8gbWF0Y2hlcyB0aGF0IG9mIGNsYXNzIHRlbXBsYXRlcy4uLgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lPiBUIHY7ICAgLy8gZXhwZWN0ZWQtbm90ZSAye3twcmV2aW91cyB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIHY7ICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3t0b28gZmV3IHRlbXBsYXRlIHBhcmFtZXRlcnMgaW4gdGVtcGxhdGUgcmVkZWNsYXJhdGlvbn19CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWU+IFQgdjsgICAvLyBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXMgdGVtcGxhdGUgZGVjbGFyYXRpb24gaXMgaGVyZX19CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCB2OyAgIC8vIGV4cGVjdGVkLWVycm9yIHt7dG9vIGZldyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGluIHRlbXBsYXRlIHJlZGVjbGFyYXRpb259fSBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXMgdGVtcGxhdGUgZGVjbGFyYXRpb24gaXMgaGVyZX19CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUsIHR5cGVuYW1lPiBUIHY7IC8vIGV4cGVjdGVkLWVycm9yIHt7dG9vIG1hbnkgdGVtcGxhdGUgcGFyYW1ldGVycyBpbiB0ZW1wbGF0ZSByZWRlY2xhcmF0aW9ufX0KICAgfQogCkBAIC0zOTEsNyArMzg4LDcgQEAKICAgCiAgIG5hbWVzcGFjZSBuMSB7CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gCi0gICAgVCBwaTFhID0gVCgzLjE0MTU5MjY1MzU4OTc5MzIzODUpOworICAgIFQgcGkxYSA9IFQoMy4xNDE1OTI2NTM1ODk3OTMyMzg1KTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2V4cGxpY2l0bHkgc3BlY2lhbGl6ZWQgZGVjbGFyYXRpb24gaXMgaGVyZX19CiAjaWZuZGVmIFBSRUNYWDExCiAvLyBleHBlY3RlZC1ub3RlQC0yIHt7ZXhwbGljaXQgaW5zdGFudGlhdGlvbiByZWZlcnMgaGVyZX19CiAjZW5kaWYKQEAgLTQxMyw3ICs0MTAsNyBAQAogI2VuZGlmCiAgICAgZmxvYXQgZjEgPSBwaTFhPGZsb2F0PjsKICAgICAKLSAgICB0ZW1wbGF0ZTw+IGRvdWJsZSBwaTFhPGRvdWJsZT4gPSA1LjI7ICAvLyBleHBlY3RlZC1lcnJvciB7e25vIHZhcmlhYmxlIHRlbXBsYXRlIG1hdGNoZXMgc3BlY2lhbGl6YXRpb259fQorICAgIHRlbXBsYXRlPD4gZG91YmxlIHBpMWE8ZG91YmxlPiA9IDUuMjsgIC8vIGV4cGVjdGVkLWVycm9yIHt7dmFyaWFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gb2YgJ3BpMWEnIG11c3Qgb3JpZ2luYWxseSBiZSBkZWNsYXJlZCBpbiBuYW1lc3BhY2UgJ24xJ319CiAgICAgZG91YmxlIGQxID0gcGkxYTxkb3VibGU+OwogICB9CiAgIApAQCAtNDMyLDMgKzQyOSwyMiBAQAogICB9CiB9CiAKK25hbWVzcGFjZSBuZXN0ZWRfbmFtZSB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBhOyAvLyBleHBlY3RlZC1ub3RlIHt7dmFyaWFibGUgdGVtcGxhdGUgJ2EnIGRlY2xhcmVkIGhlcmV9fQorICBhPGludD46OmIgYzsgLy8gZXhwZWN0ZWQtZXJyb3Ige3txdWFsaWZpZWQgbmFtZSByZWZlcnMgaW50byBhIHNwZWNpYWxpemF0aW9uIG9mIHZhcmlhYmxlIHRlbXBsYXRlICdhJ319CisKKyAgY2xhc3MgYTxpbnQ+IHt9OyAvLyBleHBlY3RlZC1lcnJvciB7e2lkZW50aWZpZXIgZm9sbG93ZWQgYnkgJzwnIGluZGljYXRlcyBhIGNsYXNzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGJ1dCAnYScgcmVmZXJzIHRvIGEgdmFyaWFibGUgdGVtcGxhdGV9fQorICBlbnVtIGE8aW50PiB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBpZGVudGlmaWVyIG9yICd7J319IGV4cGVjdGVkLXdhcm5pbmcge3tkb2VzIG5vdCBkZWNsYXJlIGFueXRoaW5nfX0KK30KKworbmFtZXNwYWNlIFBSMTg1MzAgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgYTsKKyAgaW50IGE8aW50PjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZXF1aXJlcyAndGVtcGxhdGU8Pid9fQorfQorCituYW1lc3BhY2UgUFIxOTE1MiB7CisjaWZuZGVmIFBSRUNYWDExCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0IGF1dG8geCA9IDE7CisgIHN0YXRpY19hc3NlcnQoeDxpbnQ+ID09IDEsICIiKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2N4eDk4LWNvbXBhdC5jcHAgYi90ZXN0L1NlbWFDWFgvY3h4OTgtY29tcGF0LmNwcAppbmRleCA5NjkwNjM4Li44YzFlZmM5IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvY3h4OTgtY29tcGF0LmNwcAorKysgYi90ZXN0L1NlbWFDWFgvY3h4OTgtY29tcGF0LmNwcApAQCAtMjMsNyArMjMsNyBAQAogY2xhc3MgVmFyaWFkaWMzIHt9OwogCiBhbGlnbmFzKDgpIGludCB3aXRoX2FsaWduYXM7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snYWxpZ25hcycgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTh9fQotaW50IHdpdGhfYXR0cmlidXRlIFtbIF1dOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7YXR0cmlidXRlcyBhcmUgaW5jb21wYXRpYmxlIHdpdGggQysrOTh9fQoraW50IHdpdGhfYXR0cmlidXRlIFtbIF1dOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7QysrMTEgYXR0cmlidXRlIHN5bnRheCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OH19CiAKIHZvaWQgTGl0ZXJhbHMoKSB7CiAgICh2b2lkKXU4InN0ciI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmljb2RlIGxpdGVyYWxzIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBDKys5OH19CkBAIC0yMTksMTggKzIxOSwxMSBAQAogY2xhc3MgUHJpdmF0ZU1lbWJlciB7CiAgIHN0cnVjdCBJbVByaXZhdGUge307CiB9OwotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdHlwZW5hbWUgVDo6SW1Qcml2YXRlIFNGSU5BRUFjY2Vzc0NvbnRyb2woVCB0KSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tzdWJzdGl0dXRpb24gZmFpbHVyZSBkdWUgdG8gYWNjZXNzIGNvbnRyb2wgaXMgaW5jb21wYXRpYmxlIHdpdGggQysrOTh9fSBleHBlY3RlZC1ub3RlIHt7d2hpbGUgc3Vic3RpdHV0aW5nIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnRzIGludG8gZnVuY3Rpb24gdGVtcGxhdGUgJ1NGSU5BRUFjY2Vzc0NvbnRyb2wnIFt3aXRoIFQgPSBQcml2YXRlTWVtYmVyXX19Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0eXBlbmFtZSBUOjpJbVByaXZhdGUgU0ZJTkFFQWNjZXNzQ29udHJvbChUIHQpIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3N1YnN0aXR1dGlvbiBmYWlsdXJlIGR1ZSB0byBhY2Nlc3MgY29udHJvbCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDKys5OH19CiAgIHJldHVybiB0eXBlbmFtZSBUOjpJbVByaXZhdGUoKTsKIH0KIGludCBTRklOQUVBY2Nlc3NDb250cm9sKC4uLikgeyByZXR1cm4gMDsgfQotaW50IENoZWNrU0ZJTkFFQWNjZXNzQ29udHJvbCA9IFNGSU5BRUFjY2Vzc0NvbnRyb2woUHJpdmF0ZU1lbWJlcigpKTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBGcmllbmRSZWRlZmluaXRpb24gewotICBmcmllbmQgdm9pZCBGcmllbmQoKSB7fSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnJpZW5kIGZ1bmN0aW9uICdGcmllbmQnIHdvdWxkIGJlIGltcGxpY2l0bHkgcmVkZWZpbmVkIGluIEMrKzk4fX0gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KLX07Ci1GcmllbmRSZWRlZmluaXRpb248aW50PiBGcmllbmRSZWRlZjE7Ci1GcmllbmRSZWRlZmluaXRpb248Y2hhcj4gRnJpZW5kUmVkZWYyOyAvLyBleHBlY3RlZC1ub3RlIHt7cmVxdWVzdGVkIGhlcmV9fQoraW50IENoZWNrU0ZJTkFFQWNjZXNzQ29udHJvbCA9IFNGSU5BRUFjY2Vzc0NvbnRyb2woUHJpdmF0ZU1lbWJlcigpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3doaWxlIHN1YnN0aXR1dGluZyBkZWR1Y2VkIHRlbXBsYXRlIGFyZ3VtZW50cyBpbnRvIGZ1bmN0aW9uIHRlbXBsYXRlICdTRklOQUVBY2Nlc3NDb250cm9sJyBbd2l0aCBUID0gUHJpdmF0ZU1lbWJlcl19fQogCiBuYW1lc3BhY2UgQ29weUN0b3JJc3N1ZXMgewogICBzdHJ1Y3QgUHJpdmF0ZSB7CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvZGVjbC1taWNyb3NvZnQtY2FsbC1jb252LmNwcCBiL3Rlc3QvU2VtYUNYWC9kZWNsLW1pY3Jvc29mdC1jYWxsLWNvbnYuY3BwCmluZGV4IDlmMTQ2MzIuLjQyODIwNDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9kZWNsLW1pY3Jvc29mdC1jYWxsLWNvbnYuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9kZWNsLW1pY3Jvc29mdC1jYWxsLWNvbnYuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtY3h4LWFiaSBtaWNyb3NvZnQgLWZtcy1leHRlbnNpb25zIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLWZtcy1leHRlbnNpb25zIC12ZXJpZnkgJXMKIAogdHlwZWRlZiB2b2lkIHZvaWRfZnVuX3QoKTsKIHR5cGVkZWYgdm9pZCBfX2NkZWNsIGNkZWNsX2Z1bl90KCk7CkBAIC0xOTEsMyArMTkxLDQxIEBACiAgIH07CiAgIGV4dGVybiB0ZW1wbGF0ZSB2b2lkIHZhbGFycmF5PGludD46OmJhcigpOwogfQorCituYW1lc3BhY2UgdGVzdDYgeworICBzdHJ1Y3QgZm9vIHsKKyAgICBpbnQgYmFyKCk7CisgIH07CisgIHR5cGVkZWYgaW50IGJhcl90KCk7CisgIHZvaWQgemVkKGJhcl90IGZvbzo6KikgeworICB9CisgIHZvaWQgYmF6KCkgeworICAgIHplZCgmZm9vOjpiYXIpOworICB9Cit9CisKK25hbWVzcGFjZSB0ZXN0NyB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgUyB7CisgICAgdm9pZCBmKFQgdCkgeworICAgICAgdCA9IDQyOworICAgIH0KKyAgfTsKKyAgdGVtcGxhdGU8PiB2b2lkIFM8dm9pZCo+OjpmKHZvaWQqKTsKKyAgdm9pZCBnKFM8dm9pZCo+IHMsIHZvaWQqIHApIHsKKyAgICBzLmYocCk7CisgIH0KK30KKworbmFtZXNwYWNlIHRlc3Q4IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBTIHsKKyAgICB2b2lkIGYoVCB0KSB7IC8vIGV4cGVjdGVkLW5vdGUge3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KKyAgICAgIHQgPSA0MjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thc3NpZ25pbmcgdG8gJ3ZvaWQgKicgZnJvbSBpbmNvbXBhdGlibGUgdHlwZSAnaW50J319CisgICAgfQorICB9OworICB0ZW1wbGF0ZTw+IHZvaWQgX19jZGVjbCBTPHZvaWQqPjo6Zih2b2lkKik7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZnVuY3Rpb24gZGVjbGFyZWQgJ2NkZWNsJyBoZXJlIHdhcyBwcmV2aW91c2x5IGRlY2xhcmVkIHdpdGhvdXQgY2FsbGluZyBjb252ZW50aW9ufX0KKyAgdm9pZCBnKFM8dm9pZCo+IHMsIHZvaWQqIHApIHsKKyAgICBzLmYocCk7IC8vIGV4cGVjdGVkLW5vdGUge3tpbiBpbnN0YW50aWF0aW9uIG9mIG1lbWJlciBmdW5jdGlvbiAndGVzdDg6OlM8dm9pZCAqPjo6ZicgcmVxdWVzdGVkIGhlcmV9fQorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvZGVjbHR5cGUuY3BwIGIvdGVzdC9TZW1hQ1hYL2RlY2x0eXBlLmNwcAppbmRleCBkNmU4NWQyLi44ZGU1YTljIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvZGVjbHR5cGUuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9kZWNsdHlwZS5jcHAKQEAgLTQ1LDYgKzQ1LDE2IEBACiAgIFUgJnIgPSBTPGludD46OmYoKTsKIH0KIAorbmFtZXNwYWNlIFBSMTg4NzYgeworICBzdHJ1Y3QgQSB7IH5BKCkgPSBkZWxldGU7IH07IC8vIGV4cGVjdGVkLW5vdGUgK3t7aGVyZX19CisgIEEgZigpOworICBkZWNsdHlwZShmKCkpICphOyAvLyBvaywgZnVuY3Rpb24gY2FsbAorICBkZWNsdHlwZShBKCkpICpiOyAvLyBleHBlY3RlZC1lcnJvciB7e2F0dGVtcHQgdG8gdXNlIGEgZGVsZXRlZCBmdW5jdGlvbn19CisgIGRlY2x0eXBlKDAsIGYoKSkgKmM7IC8vIG9rLCBmdW5jdGlvbiBjYWxsIG9uIFJIUyBvZiBjb21tYQorICBkZWNsdHlwZSgwLCBBKCkpICpkOyAvLyBleHBlY3RlZC1lcnJvciB7e2F0dGVtcHQgdG8gdXNlIGEgZGVsZXRlZCBmdW5jdGlvbn19CisgIGRlY2x0eXBlKGYoKSwgMCkgKmU7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXR0ZW1wdCB0byB1c2UgYSBkZWxldGVkIGZ1bmN0aW9ufX0KK30KKwogdGVtcGxhdGU8dHlwZW5hbWU+CiBjbGFzcyBjb25kaXRpb25hbCB7CiB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2RlbGV0ZWQtZnVuY3Rpb24uY3BwIGIvdGVzdC9TZW1hQ1hYL2RlbGV0ZWQtZnVuY3Rpb24uY3BwCmluZGV4IGU3OGU3ZWQuLmQ3ZWY5YjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9kZWxldGVkLWZ1bmN0aW9uLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvZGVsZXRlZC1mdW5jdGlvbi5jcHAKQEAgLTE1LDkgKzE1LDkgQEAKIHZvaWQgb3YoZG91YmxlKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZSBmdW5jdGlvbiBoYXMgYmVlbiBleHBsaWNpdGx5IGRlbGV0ZWR9fQogCiBzdHJ1Y3QgV2l0aERlbCB7Ci0gIFdpdGhEZWwoKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2Z1bmN0aW9uIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlbGV0ZWQgaGVyZX19Ci0gIHZvaWQgZm4oKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2Z1bmN0aW9uIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlbGV0ZWQgaGVyZX19Ci0gIG9wZXJhdG9yIGludCgpID0gZGVsZXRlOyAvLyBleHBlY3RlZC1ub3RlIHt7ZnVuY3Rpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KKyAgV2l0aERlbCgpID0gZGVsZXRlOyAvLyBleHBlY3RlZC1ub3RlIHt7J1dpdGhEZWwnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlbGV0ZWQgaGVyZX19CisgIHZvaWQgZm4oKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydmbicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KKyAgb3BlcmF0b3IgaW50KCkgPSBkZWxldGU7IC8vIGV4cGVjdGVkLW5vdGUge3snb3BlcmF0b3IgaW50JyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZWxldGVkIGhlcmV9fQogICB2b2lkIG9wZXJhdG9yICsoaW50KSA9IGRlbGV0ZTsKIAogICBpbnQgaSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tvbmx5IGZ1bmN0aW9ucyBjYW4gaGF2ZSBkZWxldGVkIGRlZmluaXRpb25zfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9kZWxldGVkLW9wZXJhdG9yLmNwcCBiL3Rlc3QvU2VtYUNYWC9kZWxldGVkLW9wZXJhdG9yLmNwcAppbmRleCA5ZjUzZTcxLi5kZjY3OTc4IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvZGVsZXRlZC1vcGVyYXRvci5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2RlbGV0ZWQtb3BlcmF0b3IuY3BwCkBAIC0xMyw2ICsxMyw3IEBACiB9CiAKIHN0cnVjdCBEZWxPcERlbCB7Ci0gIHZpcnR1YWwgfkRlbE9wRGVsKCkge30gLy8gZXhwZWN0ZWQtZXJyb3Ige3tkZWxldGVkIGZ1bmN0aW9ufX0KLSAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopID0gZGVsZXRlOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVsZXRlZCBoZXJlfX0KKyAgLy8gRklYTUU6IEluIE1TIEFCSSwgd2UgZXJyb3IgdHdpY2UgYmVsb3cuCisgIHZpcnR1YWwgfkRlbE9wRGVsKCkge30gLy8gZXhwZWN0ZWQtZXJyb3IgMS0yIHt7YXR0ZW1wdCB0byB1c2UgYSBkZWxldGVkIGZ1bmN0aW9ufX0KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopID0gZGVsZXRlOyAvLyBleHBlY3RlZC1ub3RlIDEtMiB7e2RlbGV0ZWQgaGVyZX19CiB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2RlcHJlY2F0ZWQuY3BwIGIvdGVzdC9TZW1hQ1hYL2RlcHJlY2F0ZWQuY3BwCmluZGV4IDAzMzVhODAuLjJmZTZkNTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9kZXByZWNhdGVkLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvZGVwcmVjYXRlZC5jcHAKQEAgLTI0LDEyICsyNCwxNSBAQAogICByZWdpc3RlciBpbnQgbSBhc20oInJieCIpOyAvLyBuby13YXJuaW5nCiAKICAgaW50IGsgPSB0b19pbnQobik7IC8vIG5vLXdhcm5pbmcKLQogICBib29sIGI7CiAgICsrYjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2luY3JlbWVudGluZyBleHByZXNzaW9uIG9mIHR5cGUgYm9vbCBpcyBkZXByZWNhdGVkfX0KIAotICAvLyBGSVhNRTogVGhpcyBpcyBpbGwtZm9ybWVkIGluIEMrKzExLgotICBjaGFyICpwID0gImZvbyI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjb252ZXJzaW9uIGZyb20gc3RyaW5nIGxpdGVyYWwgdG8gJ2NoYXIgKicgaXMgZGVwcmVjYXRlZH19CisgIGNoYXIgKnAgPSAiZm9vIjsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMiB7e2NvbnZlcnNpb24gZnJvbSBzdHJpbmcgbGl0ZXJhbCB0byAnY2hhciAqJyBpcyBkZXByZWNhdGVkfX0KKyNlbHNlCisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTQge3tJU08gQysrMTEgZG9lcyBub3QgYWxsb3cgY29udmVyc2lvbiBmcm9tIHN0cmluZyBsaXRlcmFsIHRvICdjaGFyIConfX0KKyNlbmRpZgogfQogCiBzdHJ1Y3QgUyB7IGludCBuOyB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2Rlc3RydWN0b3IuY3BwIGIvdGVzdC9TZW1hQ1hYL2Rlc3RydWN0b3IuY3BwCmluZGV4IGU1MTFiZTAuLjc2NDIyMjggMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9kZXN0cnVjdG9yLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvZGVzdHJ1Y3Rvci5jcHAKQEAgLTEsNCArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZnN5bnRheC1vbmx5IC1Xbm9uLXZpcnR1YWwtZHRvciAtV2RlbGV0ZS1ub24tdmlydHVhbC1kdG9yIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZnN5bnRheC1vbmx5IC1Xbm9uLXZpcnR1YWwtZHRvciAtV2RlbGV0ZS1ub24tdmlydHVhbC1kdG9yIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC10cmlwbGUgJW1zX2FiaV90cmlwbGUgLURNU0FCSSAtZnN5bnRheC1vbmx5IC1Xbm9uLXZpcnR1YWwtZHRvciAtV2RlbGV0ZS1ub24tdmlydHVhbC1kdG9yIC12ZXJpZnkgJXMKIGNsYXNzIEEgewogcHVibGljOgogICB+QSgpOwpAQCAtODMsNiArODQsMTIgQEAKIH0KIAogbmFtZXNwYWNlIFBSNjcwOSB7CisjaWZkZWYgTVNBQkkKKyAgLy8gVGhpcyBidWcsICJDbGFuZyBpbnN0YW50aWF0ZXMgZGVzdHJ1Y3RvciBmb3IgZnVuY3Rpb24gYXJndW1lbnQiIGlzIGludGVuZGVkCisgIC8vIGJlaGF2aW91ciBpbiB0aGUgTWljcm9zb2Z0IEFCSSBiZWNhdXNlIHRoZSBjYWxsZWUgbmVlZHMgdG8gZGVzdHJ1Y3QgdGhlIGFyZ3VtZW50cy4KKyAgLy8gZXhwZWN0ZWQtZXJyb3JAKzMge3tpbmRpcmVjdGlvbiByZXF1aXJlcyBwb2ludGVyIG9wZXJhbmQgKCdpbnQnIGludmFsaWQpfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUArMyB7e2luIGluc3RhbnRpYXRpb24gb2YgbWVtYmVyIGZ1bmN0aW9uICdQUjY3MDk6Olg8aW50Pjo6flgnIHJlcXVlc3RlZCBoZXJlfX0KKyNlbmRpZgogICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBYIHsgVCB2OyB+WCgpIHsgKysqdjsgfSB9OwogICB2b2lkIGEoWDxpbnQ+IHgpIHt9CiB9CkBAIC0xMDAsMTAgKzEwNywxNiBAQAogICAgICAgVDo6ZGVsZXRlSXQocCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dHlwZSAnaW50JyBjYW5ub3QgYmUgdXNlZCBwcmlvciB0byAnOjonfX0KICAgICB9CiAKKyNpZmRlZiBNU0FCSQorICAgIC8vIGV4cGVjdGVkLW5vdGVAKzIge3tpbiBpbnN0YW50aWF0aW9uIG9mIG1lbWJlciBmdW5jdGlvbiAndGVzdDY6OkE8aW50Pjo6b3BlcmF0b3IgZGVsZXRlJyByZXF1ZXN0ZWQgaGVyZX19CisjZW5kaWYKICAgICB2aXJ0dWFsIH5BKCkge30KICAgfTsKIAotICBjbGFzcyBCIDogQTxpbnQ+IHsgQigpOyB9OyAvLyBleHBlY3RlZC1ub3RlIHt7aW4gaW5zdGFudGlhdGlvbiBvZiBtZW1iZXIgZnVuY3Rpb24gJ3Rlc3Q2OjpBPGludD46Om9wZXJhdG9yIGRlbGV0ZScgcmVxdWVzdGVkIGhlcmV9fQorI2lmbmRlZiBNU0FCSQorICAgIC8vIGV4cGVjdGVkLW5vdGVAKzIge3tpbiBpbnN0YW50aWF0aW9uIG9mIG1lbWJlciBmdW5jdGlvbiAndGVzdDY6OkE8aW50Pjo6b3BlcmF0b3IgZGVsZXRlJyByZXF1ZXN0ZWQgaGVyZX19CisjZW5kaWYKKyAgY2xhc3MgQiA6IEE8aW50PiB7IEIoKTsgfTsKICAgQjo6QigpIHt9CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9kbGxleHBvcnQuY3BwIGIvdGVzdC9TZW1hQ1hYL2RsbGV4cG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU1OGVlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC9kbGxleHBvcnQuY3BwCkBAIC0wLDAgKzEsMjUxIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXdpbjMyICAgICAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXN0ZD1jKysxMSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LXdpbjMyICAgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1zdGQ9YysrMXkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtbWluZ3czMiAgIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtc3RkPWMrKzF5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtbWluZ3czMiAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXN0ZD1jKysxMSAlcworCisvLyBIZWxwZXIgc3RydWN0cyB0byBtYWtlIHRlbXBsYXRlcyBtb3JlIGV4cHJlc3NpdmUuCitzdHJ1Y3QgSW1wbGljaXRJbnN0X0V4cG9ydGVkIHt9Oworc3RydWN0IEV4cGxpY2l0RGVjbF9FeHBvcnRlZCB7fTsKK3N0cnVjdCBFeHBsaWNpdEluc3RfRXhwb3J0ZWQge307CitzdHJ1Y3QgRXhwbGljaXRTcGVjX0V4cG9ydGVkIHt9Oworc3RydWN0IEV4cGxpY2l0U3BlY19EZWZfRXhwb3J0ZWQge307CitzdHJ1Y3QgRXhwbGljaXRTcGVjX0lubGluZURlZl9FeHBvcnRlZCB7fTsKK3N0cnVjdCBFeHBsaWNpdFNwZWNfTm90RXhwb3J0ZWQge307CituYW1lc3BhY2UgeyBzdHJ1Y3QgSW50ZXJuYWwge307IH0KK3N0cnVjdCBFeHRlcm5hbCB7IGludCB2OyB9OworCisKKy8vIEludmFsaWQgdXNhZ2UuCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdHlwZWRlZiBpbnQgdHlwZWRlZjE7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxleHBvcnQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGVzIGFuZCBmdW5jdGlvbnN9fQordHlwZWRlZiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgaW50IHR5cGVkZWYyOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsZXhwb3J0JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zfX0KK3R5cGVkZWYgaW50IF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB0eXBlZGVmMzsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGV4cG9ydCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uc319Cit0eXBlZGVmIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkICgqRnVuVHkpKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxleHBvcnQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGVzIGFuZCBmdW5jdGlvbnN9fQorZW51bSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgRW51bSB7fTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGV4cG9ydCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uc319CisjaWYgX19oYXNfZmVhdHVyZShjeHhfc3Ryb25nX2VudW1zKQorICBlbnVtIGNsYXNzIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBFbnVtQ2xhc3Mge307IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxleHBvcnQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGVzIGFuZCBmdW5jdGlvbnN9fQorI2VuZGlmCisKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR2xvYmFscworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gRXhwb3J0IGRlY2xhcmF0aW9uLgorX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybiBpbnQgRXh0ZXJuR2xvYmFsRGVjbDsKKworLy8gZGxsZXhwb3J0IGltcGxpZXMgYSBkZWZpbml0aW9uLgorX19kZWNsc3BlYyhkbGxleHBvcnQpIGludCBHbG9iYWxEZWY7CisKKy8vIEV4cG9ydCBkZWZpbml0aW9uLgorX19kZWNsc3BlYyhkbGxleHBvcnQpIGludCBHbG9iYWxJbml0MSA9IDE7CitpbnQgX19kZWNsc3BlYyhkbGxleHBvcnQpIEdsb2JhbEluaXQyID0gMTsKKworLy8gRGVjbGFyZSwgdGhlbiBleHBvcnQgZGVmaW5pdGlvbi4KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBleHRlcm4gaW50IEdsb2JhbERlY2xJbml0OworaW50IEdsb2JhbERlY2xJbml0ID0gMTsKKworLy8gUmVkZWNsYXJhdGlvbnMKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBleHRlcm4gaW50IEdsb2JhbFJlZGVjbDE7CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgICAgICAgIGludCBHbG9iYWxSZWRlY2wxOworCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgZXh0ZXJuIGludCBHbG9iYWxSZWRlY2wyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgR2xvYmFsUmVkZWNsMjsKKworICAgICAgICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgR2xvYmFsUmVkZWNsMzsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgZXh0ZXJuIGludCBHbG9iYWxSZWRlY2wzOyAvLyBleHBlY3RlZC1lcnJvcnt7cmVkZWNsYXJhdGlvbiBvZiAnR2xvYmFsUmVkZWNsMycgY2Fubm90IGFkZCAnZGxsZXhwb3J0JyBhdHRyaWJ1dGV9fQorCisvLyBFeHRlcm5hbCBsaW5rYWdlIGlzIHJlcXVpcmVkLgorX19kZWNsc3BlYyhkbGxleHBvcnQpIHN0YXRpYyBpbnQgU3RhdGljR2xvYmFsOyAvLyBleHBlY3RlZC1lcnJvcnt7J1N0YXRpY0dsb2JhbCcgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsZXhwb3J0J319CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgSW50ZXJuYWwgSW50ZXJuYWxUeXBlR2xvYmFsOyAvLyBleHBlY3RlZC1lcnJvcnt7J0ludGVybmFsVHlwZUdsb2JhbCcgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsZXhwb3J0J319CituYW1lc3BhY2UgICAgeyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgaW50IEludGVybmFsR2xvYmFsOyB9IC8vIGV4cGVjdGVkLWVycm9ye3snKGFub255bW91cyBuYW1lc3BhY2UpOjpJbnRlcm5hbEdsb2JhbCcgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsZXhwb3J0J319CituYW1lc3BhY2UgbnMgeyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgaW50IEV4dGVybmFsR2xvYmFsOyB9CisKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBhdXRvIEludGVybmFsQXV0b1R5cGVHbG9iYWwgPSBJbnRlcm5hbCgpOyAvLyBleHBlY3RlZC1lcnJvcnt7J0ludGVybmFsQXV0b1R5cGVHbG9iYWwnIG11c3QgaGF2ZSBleHRlcm5hbCBsaW5rYWdlIHdoZW4gZGVjbGFyZWQgJ2RsbGV4cG9ydCd9fQorX19kZWNsc3BlYyhkbGxleHBvcnQpIGF1dG8gRXh0ZXJuYWxBdXRvVHlwZUdsb2JhbCA9IEV4dGVybmFsKCk7CisKKy8vIEV4cG9ydCBpbiBsb2NhbCBzY29wZS4KK3ZvaWQgZnVuY3Rpb25TY29wZSgpIHsKKyAgX19kZWNsc3BlYyhkbGxleHBvcnQpICAgICAgICBpbnQgTG9jYWxWYXJEZWNsOyAvLyBleHBlY3RlZC1lcnJvcnt7J0xvY2FsVmFyRGVjbCcgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsZXhwb3J0J319CisgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSAgICAgICAgaW50IExvY2FsVmFyRGVmID0gMTsgLy8gZXhwZWN0ZWQtZXJyb3J7eydMb2NhbFZhckRlZicgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsZXhwb3J0J319CisgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBleHRlcm4gaW50IEV4dGVybkxvY2FsVmFyRGVjbDsKKyAgX19kZWNsc3BlYyhkbGxleHBvcnQpIHN0YXRpYyBpbnQgU3RhdGljTG9jYWxWYXI7IC8vIGV4cGVjdGVkLWVycm9ye3snU3RhdGljTG9jYWxWYXInIG11c3QgaGF2ZSBleHRlcm5hbCBsaW5rYWdlIHdoZW4gZGVjbGFyZWQgJ2RsbGV4cG9ydCd9fQorfQorCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZ1bmN0aW9ucworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gRXhwb3J0IGZ1bmN0aW9uIGRlY2xhcmF0aW9uLiBDaGVjayBkaWZmZXJlbnQgcGxhY2VtZW50cy4KK19fYXR0cmlidXRlX18oKGRsbGV4cG9ydCkpIHZvaWQgZGVjbDFBKCk7IC8vIFNhbml0eSBjaGVjayB3aXRoIF9fYXR0cmlidXRlX18KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSAgICAgIHZvaWQgZGVjbDFCKCk7CisKK3ZvaWQgX19hdHRyaWJ1dGVfXygoZGxsZXhwb3J0KSkgZGVjbDJBKCk7Cit2b2lkIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSAgICAgIGRlY2wyQigpOworCisvLyBFeHBvcnQgZnVuY3Rpb24gZGVmaW5pdGlvbi4KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGRlZigpIHt9CisKKy8vIGV4dGVybiAiQyIKK2V4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgZXh0ZXJuQygpIHt9CisKKy8vIEV4cG9ydCBpbmxpbmUgZnVuY3Rpb24uCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgaW5saW5lIHZvaWQgaW5saW5lRnVuYzEoKSB7fSAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsZXhwb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CitpbmxpbmUgdm9pZCBfX2F0dHJpYnV0ZV9fKChkbGxleHBvcnQpKSBpbmxpbmVGdW5jMigpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxleHBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKworX19kZWNsc3BlYyhkbGxleHBvcnQpIGlubGluZSB2b2lkIGlubGluZURlY2woKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGV4cG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIGlubGluZURlY2woKSB7fQorCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCBpbmxpbmVEZWYoKTsKKyAgICAgICAgICAgICAgIGlubGluZSB2b2lkIGlubGluZURlZigpIHt9CisKKy8vIFJlZGVjbGFyYXRpb25zCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCByZWRlY2wxKCk7CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCByZWRlY2wxKCkge30KKworX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgcmVkZWNsMigpOworICAgICAgICAgICAgICAgICAgICAgIHZvaWQgcmVkZWNsMigpIHt9CisKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkIHJlZGVjbDMoKTsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCByZWRlY2wzKCk7IC8vIGV4cGVjdGVkLWVycm9ye3tyZWRlY2xhcmF0aW9uIG9mICdyZWRlY2wzJyBjYW5ub3QgYWRkICdkbGxleHBvcnQnIGF0dHJpYnV0ZX19CisKKy8vIEZyaWVuZCBmdW5jdGlvbnMKK3N0cnVjdCBGdW5jRnJpZW5kIHsKKyAgZnJpZW5kIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGZyaWVuZDEoKTsKKyAgZnJpZW5kIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGZyaWVuZDIoKTsKKyAgZnJpZW5kICAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZyaWVuZDMoKTsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19Cit9OworX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgZnJpZW5kMSgpIHt9CisgICAgICAgICAgICAgICAgICAgICAgdm9pZCBmcmllbmQyKCkge30KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGZyaWVuZDMoKSB7fSAvLyBleHBlY3RlZC1lcnJvcnt7cmVkZWNsYXJhdGlvbiBvZiAnZnJpZW5kMycgY2Fubm90IGFkZCAnZGxsZXhwb3J0JyBhdHRyaWJ1dGV9fQorCisvLyBJbXBsaWNpdCBkZWNsYXJhdGlvbnMgY2FuIGJlIHJlZGVjbGFyZWQgd2l0aCBkbGxleHBvcnQuCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCogb3BlcmF0b3IgbmV3KF9fU0laRV9UWVBFX18gbik7CisKKy8vIEV4dGVybmFsIGxpbmthZ2UgaXMgcmVxdWlyZWQuCitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgc3RhdGljIGludCBzdGF0aWNGdW5jKCk7IC8vIGV4cGVjdGVkLWVycm9ye3snc3RhdGljRnVuYycgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsZXhwb3J0J319CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgSW50ZXJuYWwgaW50ZXJuYWxSZXRGdW5jKCk7IC8vIGV4cGVjdGVkLWVycm9ye3snaW50ZXJuYWxSZXRGdW5jJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxleHBvcnQnfX0KK25hbWVzcGFjZSAgICB7IF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGludGVybmFsRnVuYygpIHt9IH0gLy8gZXhwZWN0ZWQtZXJyb3J7eycoYW5vbnltb3VzIG5hbWVzcGFjZSk6OmludGVybmFsRnVuYycgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsZXhwb3J0J319CituYW1lc3BhY2UgbnMgeyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCBleHRlcm5hbEZ1bmMoKSB7fSB9CisKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRnVuY3Rpb24gdGVtcGxhdGVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBFeHBvcnQgZnVuY3Rpb24gdGVtcGxhdGUgZGVjbGFyYXRpb24uIENoZWNrIGRpZmZlcmVudCBwbGFjZW1lbnRzLgordGVtcGxhdGU8dHlwZW5hbWUgVD4gX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgZnVuY1RtcGxEZWNsMSgpOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgZnVuY1RtcGxEZWNsMigpOworCisvLyBFeHBvcnQgZnVuY3Rpb24gdGVtcGxhdGUgZGVmaW5pdGlvbi4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGZ1bmNUbXBsRGVmKCkge30KKworLy8gUmVkZWNsYXJhdGlvbnMKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGZ1bmNUbXBsUmVkZWNsMSgpOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgZnVuY1RtcGxSZWRlY2wxKCkge30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgZnVuY1RtcGxSZWRlY2wyKCk7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBmdW5jVG1wbFJlZGVjbDIoKSB7fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBmdW5jVG1wbFJlZGVjbDMoKTsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCBmdW5jVG1wbFJlZGVjbDMoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlZGVjbGFyYXRpb24gb2YgJ2Z1bmNUbXBsUmVkZWNsMycgY2Fubm90IGFkZCAnZGxsZXhwb3J0JyBhdHRyaWJ1dGV9fQorCisvLyBGdW5jdGlvbiB0ZW1wbGF0ZSBmcmllbmRzCitzdHJ1Y3QgRnVuY1RtcGxGcmllbmQgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBmcmllbmQgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgZnVuY1RtcGxGcmllbmQxKCk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGZyaWVuZCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCBmdW5jVG1wbEZyaWVuZDIoKTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gZnJpZW5kICAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZ1bmNUbXBsRnJpZW5kMygpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCBmdW5jVG1wbEZyaWVuZDEoKSB7fQordGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZnVuY1RtcGxGcmllbmQyKCkge30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGZ1bmNUbXBsRnJpZW5kMygpIHt9IC8vIGV4cGVjdGVkLWVycm9ye3tyZWRlY2xhcmF0aW9uIG9mICdmdW5jVG1wbEZyaWVuZDMnIGNhbm5vdCBhZGQgJ2RsbGV4cG9ydCcgYXR0cmlidXRlfX0KKworLy8gRXh0ZXJuYWwgbGlua2FnZSBpcyByZXF1aXJlZC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBzdGF0aWMgaW50IHN0YXRpY0Z1bmNUbXBsKCk7IC8vIGV4cGVjdGVkLWVycm9ye3snc3RhdGljRnVuY1RtcGwnIG11c3QgaGF2ZSBleHRlcm5hbCBsaW5rYWdlIHdoZW4gZGVjbGFyZWQgJ2RsbGV4cG9ydCd9fQordGVtcGxhdGU8dHlwZW5hbWUgVD4gX19kZWNsc3BlYyhkbGxleHBvcnQpIEludGVybmFsIGludGVybmFsUmV0RnVuY1RtcGwoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7eydpbnRlcm5hbFJldEZ1bmNUbXBsJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxleHBvcnQnfX0KK25hbWVzcGFjZSAgICB7IHRlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGludGVybmFsRnVuY1RtcGwoKTsgfSAvLyBleHBlY3RlZC1lcnJvcnt7Jyhhbm9ueW1vdXMgbmFtZXNwYWNlKTo6aW50ZXJuYWxGdW5jVG1wbCcgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsZXhwb3J0J319CituYW1lc3BhY2UgbnMgeyB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCBleHRlcm5hbEZ1bmNUbXBsKCk7IH0KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGZ1bmNUbXBsKCkge30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGV4cG9ydGVkRnVuY1RtcGxEZWNsKCk7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCBleHBvcnRlZEZ1bmNUbXBsKCkge30KKworLy8gRXhwb3J0IGltcGxpY2l0IGluc3RhbnRpYXRpb24gb2YgYW4gZXhwb3J0ZWQgZnVuY3Rpb24gdGVtcGxhdGUuCit2b2lkIHVzZUZ1blRtcGxEZWNsKCkgeyBleHBvcnRlZEZ1bmNUbXBsRGVjbDxJbXBsaWNpdEluc3RfRXhwb3J0ZWQ+KCk7IH0KK3ZvaWQgdXNlRnVuVG1wbERlZigpIHsgZXhwb3J0ZWRGdW5jVG1wbDxJbXBsaWNpdEluc3RfRXhwb3J0ZWQ+KCk7IH0KKworLy8gRXhwb3J0IGV4cGxpY2l0IGluc3RhbnRpYXRpb24gZGVjbGFyYXRpb24gb2YgYW4gZXhwb3J0ZWQgZnVuY3Rpb24gdGVtcGxhdGUuCitleHRlcm4gdGVtcGxhdGUgdm9pZCBleHBvcnRlZEZ1bmNUbXBsPEV4cGxpY2l0RGVjbF9FeHBvcnRlZD4oKTsKKyAgICAgICB0ZW1wbGF0ZSB2b2lkIGV4cG9ydGVkRnVuY1RtcGw8RXhwbGljaXREZWNsX0V4cG9ydGVkPigpOworCisvLyBFeHBvcnQgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBkZWZpbml0aW9uIG9mIGFuIGV4cG9ydGVkIGZ1bmN0aW9uIHRlbXBsYXRlLgordGVtcGxhdGUgdm9pZCBleHBvcnRlZEZ1bmNUbXBsPEV4cGxpY2l0SW5zdF9FeHBvcnRlZD4oKTsKKworLy8gRXhwb3J0IHNwZWNpYWxpemF0aW9uIG9mIGFuIGV4cG9ydGVkIGZ1bmN0aW9uIHRlbXBsYXRlLgordGVtcGxhdGU8PiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCBleHBvcnRlZEZ1bmNUbXBsPEV4cGxpY2l0U3BlY19FeHBvcnRlZD4oKTsKK3RlbXBsYXRlPD4gX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgZXhwb3J0ZWRGdW5jVG1wbDxFeHBsaWNpdFNwZWNfRGVmX0V4cG9ydGVkPigpIHt9Cit0ZW1wbGF0ZTw+IF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBpbmxpbmUgdm9pZCBleHBvcnRlZEZ1bmNUbXBsPEV4cGxpY2l0U3BlY19JbmxpbmVEZWZfRXhwb3J0ZWQ+KCkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGV4cG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQorCisvLyBOb3QgZXhwb3J0aW5nIHNwZWNpYWxpemF0aW9uIG9mIGFuIGV4cG9ydGVkIGZ1bmN0aW9uIHRlbXBsYXRlIHdpdGhvdXQKKy8vIGV4cGxpY2l0IGRsbGV4cG9ydC4KK3RlbXBsYXRlPD4gdm9pZCBleHBvcnRlZEZ1bmNUbXBsPEV4cGxpY2l0U3BlY19Ob3RFeHBvcnRlZD4oKSB7fQorCisKKy8vIEV4cG9ydCBleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9uIG9mIGEgbm9uLWV4cG9ydGVkIGZ1bmN0aW9uIHRlbXBsYXRlLgorZXh0ZXJuIHRlbXBsYXRlIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkIGZ1bmNUbXBsPEV4cGxpY2l0RGVjbF9FeHBvcnRlZD4oKTsKKyAgICAgICB0ZW1wbGF0ZSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCBmdW5jVG1wbDxFeHBsaWNpdERlY2xfRXhwb3J0ZWQ+KCk7CisKKy8vIEV4cG9ydCBleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlZmluaXRpb24gb2YgYSBub24tZXhwb3J0ZWQgZnVuY3Rpb24gdGVtcGxhdGUuCit0ZW1wbGF0ZSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCBmdW5jVG1wbDxFeHBsaWNpdEluc3RfRXhwb3J0ZWQ+KCk7CisKKy8vIEV4cG9ydCBzcGVjaWFsaXphdGlvbiBvZiBhIG5vbi1leHBvcnRlZCBmdW5jdGlvbiB0ZW1wbGF0ZS4KK3RlbXBsYXRlPD4gX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgZnVuY1RtcGw8RXhwbGljaXRTcGVjX0V4cG9ydGVkPigpOwordGVtcGxhdGU8PiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZCBmdW5jVG1wbDxFeHBsaWNpdFNwZWNfRGVmX0V4cG9ydGVkPigpIHt9Cit0ZW1wbGF0ZTw+IF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBpbmxpbmUgdm9pZCBmdW5jVG1wbDxFeHBsaWNpdFNwZWNfSW5saW5lRGVmX0V4cG9ydGVkPigpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxleHBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcmVjZWRlbmNlCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBkbGxleHBvcnQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGRsbGltcG9ydCBpZiBib3RoIGFyZSBzcGVjaWZpZWQuCitfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQsIGRsbGV4cG9ydCkpICAgICAgIGV4dGVybiBpbnQgUHJlY2VkZW5jZUV4dGVybkdsb2JhbDFBOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybiBpbnQgUHJlY2VkZW5jZUV4dGVybkdsb2JhbDFCOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CisKK19fYXR0cmlidXRlX18oKGRsbGV4cG9ydCwgZGxsaW1wb3J0KSkgICAgICAgZXh0ZXJuIGludCBQcmVjZWRlbmNlRXh0ZXJuR2xvYmFsMkE7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgZXh0ZXJuIGludCBQcmVjZWRlbmNlRXh0ZXJuR2xvYmFsMkI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKworX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0LCBkbGxleHBvcnQpKSAgICAgICBpbnQgUHJlY2VkZW5jZUdsb2JhbDFBOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgX19kZWNsc3BlYyhkbGxleHBvcnQpIGludCBQcmVjZWRlbmNlR2xvYmFsMUI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKworX19hdHRyaWJ1dGVfXygoZGxsZXhwb3J0LCBkbGxpbXBvcnQpKSAgICAgICBpbnQgUHJlY2VkZW5jZUdsb2JhbDJBOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CitfX2RlY2xzcGVjKGRsbGV4cG9ydCkgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGludCBQcmVjZWRlbmNlR2xvYmFsMkI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKworX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybiBpbnQgUHJlY2VkZW5jZUV4dGVybkdsb2JhbFJlZGVjbDE7CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgZXh0ZXJuIGludCBQcmVjZWRlbmNlRXh0ZXJuR2xvYmFsUmVkZWNsMTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQorCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgZXh0ZXJuIGludCBQcmVjZWRlbmNlRXh0ZXJuR2xvYmFsUmVkZWNsMjsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQorX19kZWNsc3BlYyhkbGxleHBvcnQpIGV4dGVybiBpbnQgUHJlY2VkZW5jZUV4dGVybkdsb2JhbFJlZGVjbDI7CisKK19fZGVjbHNwZWMoZGxsZXhwb3J0KSBleHRlcm4gaW50IFByZWNlZGVuY2VHbG9iYWxSZWRlY2wxOworX19kZWNsc3BlYyhkbGxpbXBvcnQpICAgICAgICBpbnQgUHJlY2VkZW5jZUdsb2JhbFJlZGVjbDE7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKworX19kZWNsc3BlYyhkbGxpbXBvcnQpIGV4dGVybiBpbnQgUHJlY2VkZW5jZUdsb2JhbFJlZGVjbDI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KK19fZGVjbHNwZWMoZGxsZXhwb3J0KSAgICAgICAgaW50IFByZWNlZGVuY2VHbG9iYWxSZWRlY2wyOworCit2b2lkIF9fYXR0cmlidXRlX18oKGRsbGltcG9ydCwgZGxsZXhwb3J0KSkgICAgICAgcHJlY2VkZW5jZTFBKCkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQordm9pZCBfX2RlY2xzcGVjKGRsbGltcG9ydCkgX19kZWNsc3BlYyhkbGxleHBvcnQpIHByZWNlZGVuY2UxQigpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KKwordm9pZCBfX2F0dHJpYnV0ZV9fKChkbGxleHBvcnQsIGRsbGltcG9ydCkpICAgICAgIHByZWNlZGVuY2UyQSgpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KK3ZvaWQgX19kZWNsc3BlYyhkbGxleHBvcnQpIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBwcmVjZWRlbmNlMkIoKSB7fSAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CisKK3ZvaWQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHByZWNlZGVuY2VSZWRlY2wxKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KK3ZvaWQgX19kZWNsc3BlYyhkbGxleHBvcnQpIHByZWNlZGVuY2VSZWRlY2wxKCkge30KKwordm9pZCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgcHJlY2VkZW5jZVJlZGVjbDIoKTsKK3ZvaWQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHByZWNlZGVuY2VSZWRlY2wyKCkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2RsbGltcG9ydC5jcHAgYi90ZXN0L1NlbWFDWFgvZGxsaW1wb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWU5ZTdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hQ1hYL2RsbGltcG9ydC5jcHAKQEAgLTAsMCArMSwyMjcgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtd2luMzIgICAgIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtc3RkPWMrKzExICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtd2luMzIgICAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXN0ZD1jKysxeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1taW5ndzMyICAgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1zdGQ9YysrMXkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1taW5ndzMyIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtc3RkPWMrKzExICVzCisKKy8vIEhlbHBlciBzdHJ1Y3RzIHRvIG1ha2UgdGVtcGxhdGVzIG1vcmUgZXhwcmVzc2l2ZS4KK3N0cnVjdCBJbXBsaWNpdEluc3RfSW1wb3J0ZWQge307CitzdHJ1Y3QgRXhwbGljaXREZWNsX0ltcG9ydGVkIHt9Oworc3RydWN0IEV4cGxpY2l0SW5zdF9JbXBvcnRlZCB7fTsKK3N0cnVjdCBFeHBsaWNpdFNwZWNfSW1wb3J0ZWQge307CitzdHJ1Y3QgRXhwbGljaXRTcGVjX0RlZl9JbXBvcnRlZCB7fTsKK3N0cnVjdCBFeHBsaWNpdFNwZWNfSW5saW5lRGVmX0ltcG9ydGVkIHt9Oworc3RydWN0IEV4cGxpY2l0U3BlY19Ob3RJbXBvcnRlZCB7fTsKK25hbWVzcGFjZSB7IHN0cnVjdCBJbnRlcm5hbCB7fTsgfQorCisKKy8vIEludmFsaWQgdXNhZ2UuCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgdHlwZWRlZiBpbnQgdHlwZWRlZjE7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGVzIGFuZCBmdW5jdGlvbnN9fQordHlwZWRlZiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IHR5cGVkZWYyOyAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zfX0KK3R5cGVkZWYgaW50IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB0eXBlZGVmMzsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uc319Cit0eXBlZGVmIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkICgqRnVuVHkpKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGVzIGFuZCBmdW5jdGlvbnN9fQorZW51bSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgRW51bSB7fTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9uc319CisjaWYgX19oYXNfZmVhdHVyZShjeHhfc3Ryb25nX2VudW1zKQorICBlbnVtIGNsYXNzIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBFbnVtQ2xhc3Mge307IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gdmFyaWFibGVzIGFuZCBmdW5jdGlvbnN9fQorI2VuZGlmCisKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR2xvYmFscworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gSW1wb3J0IGRlY2xhcmF0aW9uLgorX19kZWNsc3BlYyhkbGxpbXBvcnQpIGV4dGVybiBpbnQgRXh0ZXJuR2xvYmFsRGVjbDsKKworLy8gZGxsaW1wb3J0IGltcGxpZXMgYSBkZWNsYXJhdGlvbi4KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgR2xvYmFsRGVjbDsKK2ludCAqKl9fYXR0cmlidXRlX18oKGRsbGltcG9ydCkpKiBHbG9iYWxEZWNsQ2h1bmtBdHRyOworaW50IEdsb2JhbERlY2xBdHRyIF9fYXR0cmlidXRlX18oKGRsbGltcG9ydCkpOworCisvLyBOb3QgYWxsb3dlZCBvbiBkZWZpbml0aW9ucy4KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBleHRlcm4gaW50IEV4dGVybkdsb2JhbEluaXQgPSAxOyAvLyBleHBlY3RlZC1lcnJvcnt7ZGVmaW5pdGlvbiBvZiBkbGxpbXBvcnQgZGF0YX19CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IEdsb2JhbEluaXQxID0gMTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2RlZmluaXRpb24gb2YgZGxsaW1wb3J0IGRhdGF9fQoraW50IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBHbG9iYWxJbml0MiA9IDE7IC8vIGV4cGVjdGVkLWVycm9ye3tkZWZpbml0aW9uIG9mIGRsbGltcG9ydCBkYXRhfX0KKworLy8gRGVjbGFyZSwgdGhlbiByZWplY3QgZGVmaW5pdGlvbi4KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBleHRlcm4gaW50IEV4dGVybkdsb2JhbERlY2xJbml0OyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgYXR0cmlidXRlIGlzIGhlcmV9fQoraW50IEV4dGVybkdsb2JhbERlY2xJbml0ID0gMTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J0V4dGVybkdsb2JhbERlY2xJbml0JyByZWRlY2xhcmVkIHdpdGhvdXQgJ2RsbGltcG9ydCcgYXR0cmlidXRlOiBwcmV2aW91cyAnZGxsaW1wb3J0JyBpZ25vcmVkfX0KKworX19kZWNsc3BlYyhkbGxpbXBvcnQpIGludCBHbG9iYWxEZWNsSW5pdDsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19IGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGF0dHJpYnV0ZSBpcyBoZXJlfX0KK2ludCBHbG9iYWxEZWNsSW5pdCA9IDE7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydHbG9iYWxEZWNsSW5pdCcgcmVkZWNsYXJlZCB3aXRob3V0ICdkbGxpbXBvcnQnIGF0dHJpYnV0ZTogcHJldmlvdXMgJ2RsbGltcG9ydCcgaWdub3JlZH19CisKK2ludCAqX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0KSkgR2xvYmFsRGVjbENodW5rQXR0ckluaXQ7IC8vIGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fSBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBhdHRyaWJ1dGUgaXMgaGVyZX19CitpbnQgKkdsb2JhbERlY2xDaHVua0F0dHJJbml0ID0gMDsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J0dsb2JhbERlY2xDaHVua0F0dHJJbml0JyByZWRlY2xhcmVkIHdpdGhvdXQgJ2RsbGltcG9ydCcgYXR0cmlidXRlOiBwcmV2aW91cyAnZGxsaW1wb3J0JyBpZ25vcmVkfX0KKworaW50IEdsb2JhbERlY2xBdHRySW5pdCBfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKTsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19IGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGF0dHJpYnV0ZSBpcyBoZXJlfX0KK2ludCBHbG9iYWxEZWNsQXR0ckluaXQgPSAxOyAvLyBleHBlY3RlZC13YXJuaW5ne3snR2xvYmFsRGVjbEF0dHJJbml0JyByZWRlY2xhcmVkIHdpdGhvdXQgJ2RsbGltcG9ydCcgYXR0cmlidXRlOiBwcmV2aW91cyAnZGxsaW1wb3J0JyBpZ25vcmVkfX0KKworLy8gUmVkZWNsYXJhdGlvbnMKK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBleHRlcm4gaW50IEdsb2JhbFJlZGVjbDE7CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgZXh0ZXJuIGludCBHbG9iYWxSZWRlY2wxOworCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IEdsb2JhbFJlZGVjbDJhOworX19kZWNsc3BlYyhkbGxpbXBvcnQpIGludCBHbG9iYWxSZWRlY2wyYTsKKworaW50ICpfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKSBHbG9iYWxSZWRlY2wyYjsKK2ludCAqX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0KSkgR2xvYmFsUmVkZWNsMmI7CisKK2ludCBHbG9iYWxSZWRlY2wyYyBfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKTsKK2ludCBHbG9iYWxSZWRlY2wyYyBfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKTsKKworLy8gTkI6IE1TVkMgaXNzdWVzIGEgd2FybmluZyBhbmQgbWFrZXMgR2xvYmFsUmVkZWNsMyBkbGxleHBvcnQuIFdlIGZvbGxvdyBHQ0MKKy8vIGFuZCBkcm9wIHRoZSBkbGxpbXBvcnQgd2l0aCBhIHdhcm5pbmcuCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgZXh0ZXJuIGludCBHbG9iYWxSZWRlY2wzOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgYXR0cmlidXRlIGlzIGhlcmV9fQorICAgICAgICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgR2xvYmFsUmVkZWNsMzsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J0dsb2JhbFJlZGVjbDMnIHJlZGVjbGFyZWQgd2l0aG91dCAnZGxsaW1wb3J0JyBhdHRyaWJ1dGU6IHByZXZpb3VzICdkbGxpbXBvcnQnIGlnbm9yZWR9fQorCisgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGludCBHbG9iYWxSZWRlY2w0OyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBleHRlcm4gaW50IEdsb2JhbFJlZGVjbDQ7IC8vIGV4cGVjdGVkLWVycm9ye3tyZWRlY2xhcmF0aW9uIG9mICdHbG9iYWxSZWRlY2w0JyBjYW5ub3QgYWRkICdkbGxpbXBvcnQnIGF0dHJpYnV0ZX19CisKKy8vIEV4dGVybmFsIGxpbmthZ2UgaXMgcmVxdWlyZWQuCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgc3RhdGljIGludCBTdGF0aWNHbG9iYWw7IC8vIGV4cGVjdGVkLWVycm9ye3snU3RhdGljR2xvYmFsJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxpbXBvcnQnfX0KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBJbnRlcm5hbCBJbnRlcm5hbFR5cGVHbG9iYWw7IC8vIGV4cGVjdGVkLWVycm9ye3snSW50ZXJuYWxUeXBlR2xvYmFsJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxpbXBvcnQnfX0KK25hbWVzcGFjZSAgICB7IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgSW50ZXJuYWxHbG9iYWw7IH0gLy8gZXhwZWN0ZWQtZXJyb3J7eycoYW5vbnltb3VzIG5hbWVzcGFjZSk6OkludGVybmFsR2xvYmFsJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxpbXBvcnQnfX0KK25hbWVzcGFjZSBucyB7IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgRXh0ZXJuYWxHbG9iYWw7IH0KKworX19kZWNsc3BlYyhkbGxpbXBvcnQpIGF1dG8gSW50ZXJuYWxBdXRvVHlwZUdsb2JhbCA9IEludGVybmFsKCk7IC8vIGV4cGVjdGVkLWVycm9ye3snSW50ZXJuYWxBdXRvVHlwZUdsb2JhbCcgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsaW1wb3J0J319CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtZXJyb3JALTF7e2RlZmluaXRpb24gb2YgZGxsaW1wb3J0IGRhdGF9fQorCisvLyBJbXBvcnQgaW4gbG9jYWwgc2NvcGUuCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgZmxvYXQgTG9jYWxSZWRlY2wxOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWZpbml0aW9uIGlzIGhlcmV9fQorX19kZWNsc3BlYyhkbGxpbXBvcnQpIGZsb2F0IExvY2FsUmVkZWNsMjsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVmaW5pdGlvbiBpcyBoZXJlfX0KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBmbG9hdCBMb2NhbFJlZGVjbDM7IC8vIGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlZmluaXRpb24gaXMgaGVyZX19Cit2b2lkIGZ1bmN0aW9uU2NvcGUoKSB7CisgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgTG9jYWxSZWRlY2wxOyAvLyBleHBlY3RlZC1lcnJvcnt7cmVkZWZpbml0aW9uIG9mICdMb2NhbFJlZGVjbDEnIHdpdGggYSBkaWZmZXJlbnQgdHlwZTogJ2ludCcgdnMgJ2Zsb2F0J319CisgIGludCAqX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0KSkgTG9jYWxSZWRlY2wyOyAvLyBleHBlY3RlZC1lcnJvcnt7cmVkZWZpbml0aW9uIG9mICdMb2NhbFJlZGVjbDInIHdpdGggYSBkaWZmZXJlbnQgdHlwZTogJ2ludCAqJyB2cyAnZmxvYXQnfX0KKyAgaW50IExvY2FsUmVkZWNsMyBfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlZGVmaW5pdGlvbiBvZiAnTG9jYWxSZWRlY2wzJyB3aXRoIGEgZGlmZmVyZW50IHR5cGU6ICdpbnQnIHZzICdmbG9hdCd9fQorCisgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSAgICAgICAgaW50IExvY2FsVmFyRGVjbDsKKyAgX19kZWNsc3BlYyhkbGxpbXBvcnQpICAgICAgICBpbnQgTG9jYWxWYXJEZWYgPSAxOyAvLyBleHBlY3RlZC1lcnJvcnt7ZGVmaW5pdGlvbiBvZiBkbGxpbXBvcnQgZGF0YX19CisgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBleHRlcm4gaW50IEV4dGVybkxvY2FsVmFyRGVjbDsKKyAgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGV4dGVybiBpbnQgRXh0ZXJuTG9jYWxWYXJEZWYgPSAxOyAvLyBleHBlY3RlZC1lcnJvcnt7ZGVmaW5pdGlvbiBvZiBkbGxpbXBvcnQgZGF0YX19CisgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBzdGF0aWMgaW50IFN0YXRpY0xvY2FsVmFyOyAvLyBleHBlY3RlZC1lcnJvcnt7J1N0YXRpY0xvY2FsVmFyJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxpbXBvcnQnfX0KK30KKworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGdW5jdGlvbnMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEltcG9ydCBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gQ2hlY2sgZGlmZmVyZW50IHBsYWNlbWVudHMuCitfX2F0dHJpYnV0ZV9fKChkbGxpbXBvcnQpKSB2b2lkIGRlY2wxQSgpOyAvLyBTYW5pdHkgY2hlY2sgd2l0aCBfX2F0dHJpYnV0ZV9fCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgICAgICB2b2lkIGRlY2wxQigpOworCit2b2lkIF9fYXR0cmlidXRlX18oKGRsbGltcG9ydCkpIGRlY2wyQSgpOwordm9pZCBfX2RlY2xzcGVjKGRsbGltcG9ydCkgICAgICBkZWNsMkIoKTsKKworLy8gTm90IGFsbG93ZWQgb24gZnVuY3Rpb24gZGVmaW5pdGlvbnMuCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBkZWYoKSB7fSAvLyBleHBlY3RlZC1lcnJvcnt7J2RsbGltcG9ydCcgYXR0cmlidXRlIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gc3ltYm9sIGRlY2xhcmF0aW9ufX0KKworLy8gZXh0ZXJuICAiQyIKK2V4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQgZXh0ZXJuQygpOworCisvLyBJbXBvcnQgaW5saW5lIGZ1bmN0aW9uLgorX19kZWNsc3BlYyhkbGxpbXBvcnQpIGlubGluZSB2b2lkIGlubGluZUZ1bmMxKCkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQoraW5saW5lIHZvaWQgX19hdHRyaWJ1dGVfXygoZGxsaW1wb3J0KSkgaW5saW5lRnVuYzIoKSB7fSAvLyBleHBlY3RlZC13YXJuaW5ne3snZGxsaW1wb3J0JyBhdHRyaWJ1dGUgaWdub3JlZH19CisKKy8vIFJlZGVjbGFyYXRpb25zCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCByZWRlY2wxKCk7CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCByZWRlY2wxKCk7CisKKy8vIE5COiBNU1ZDIGlzc3VlcyBhIHdhcm5pbmcgYW5kIG1ha2VzIHJlZGVjbDIvcmVkZWNsMyBkbGxleHBvcnQuIFdlIGZvbGxvdyBHQ0MKKy8vIGFuZCBkcm9wIHRoZSBkbGxpbXBvcnQgd2l0aCBhIHdhcm5pbmcuCitfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCByZWRlY2wyKCk7IC8vIGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fSBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBhdHRyaWJ1dGUgaXMgaGVyZX19CisgICAgICAgICAgICAgICAgICAgICAgdm9pZCByZWRlY2wyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydyZWRlY2wyJyByZWRlY2xhcmVkIHdpdGhvdXQgJ2RsbGltcG9ydCcgYXR0cmlidXRlOiBwcmV2aW91cyAnZGxsaW1wb3J0JyBpZ25vcmVkfX0KKworX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgcmVkZWNsMygpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgYXR0cmlidXRlIGlzIGhlcmV9fQorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgcmVkZWNsMygpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydyZWRlY2wzJyByZWRlY2xhcmVkIHdpdGhvdXQgJ2RsbGltcG9ydCcgYXR0cmlidXRlOiBwcmV2aW91cyAnZGxsaW1wb3J0JyBpZ25vcmVkfX0KKworICAgICAgICAgICAgICAgICAgICAgIHZvaWQgcmVkZWNsNCgpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIHJlZGVjbDQoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlZGVjbGFyYXRpb24gb2YgJ3JlZGVjbDQnIGNhbm5vdCBhZGQgJ2RsbGltcG9ydCcgYXR0cmlidXRlfX0KKworLy8gRnJpZW5kIGZ1bmN0aW9ucworc3RydWN0IEZ1bmNGcmllbmQgeworICBmcmllbmQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgZnJpZW5kMSgpOworICBmcmllbmQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgZnJpZW5kMigpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgYXR0cmlidXRlIGlzIGhlcmV9fQorICBmcmllbmQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgZnJpZW5kMygpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgYXR0cmlidXRlIGlzIGhlcmV9fQorICBmcmllbmQgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZnJpZW5kNCgpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KK307CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBmcmllbmQxKCk7CisgICAgICAgICAgICAgICAgICAgICAgdm9pZCBmcmllbmQyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydmcmllbmQyJyByZWRlY2xhcmVkIHdpdGhvdXQgJ2RsbGltcG9ydCcgYXR0cmlidXRlOiBwcmV2aW91cyAnZGxsaW1wb3J0JyBpZ25vcmVkfX0KKyAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZyaWVuZDMoKSB7fSAvLyBleHBlY3RlZC13YXJuaW5ne3snZnJpZW5kMycgcmVkZWNsYXJlZCB3aXRob3V0ICdkbGxpbXBvcnQnIGF0dHJpYnV0ZTogcHJldmlvdXMgJ2RsbGltcG9ydCcgaWdub3JlZH19CitfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBmcmllbmQ0KCk7IC8vIGV4cGVjdGVkLWVycm9ye3tyZWRlY2xhcmF0aW9uIG9mICdmcmllbmQ0JyBjYW5ub3QgYWRkICdkbGxpbXBvcnQnIGF0dHJpYnV0ZX19CisKKy8vIEltcGxpY2l0IGRlY2xhcmF0aW9ucyBjYW4gYmUgcmVkZWNsYXJlZCB3aXRoIGRsbGltcG9ydC4KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkKiBvcGVyYXRvciBuZXcoX19TSVpFX1RZUEVfXyBuKTsKKworLy8gRXh0ZXJuYWwgbGlua2FnZSBpcyByZXF1aXJlZC4KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBzdGF0aWMgaW50IHN0YXRpY0Z1bmMoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7eydzdGF0aWNGdW5jJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxpbXBvcnQnfX0KK19fZGVjbHNwZWMoZGxsaW1wb3J0KSBJbnRlcm5hbCBpbnRlcm5hbFJldEZ1bmMoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7eydpbnRlcm5hbFJldEZ1bmMnIG11c3QgaGF2ZSBleHRlcm5hbCBsaW5rYWdlIHdoZW4gZGVjbGFyZWQgJ2RsbGltcG9ydCd9fQorbmFtZXNwYWNlICAgIHsgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgaW50ZXJuYWxGdW5jKCk7IH0gLy8gZXhwZWN0ZWQtZXJyb3J7eycoYW5vbnltb3VzIG5hbWVzcGFjZSk6OmludGVybmFsRnVuYycgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsaW1wb3J0J319CituYW1lc3BhY2UgbnMgeyBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBleHRlcm5hbEZ1bmMoKTsgfQorCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZ1bmN0aW9uIHRlbXBsYXRlcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gSW1wb3J0IGZ1bmN0aW9uIHRlbXBsYXRlIGRlY2xhcmF0aW9uLiBDaGVjayBkaWZmZXJlbnQgcGxhY2VtZW50cy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIGZ1bmNUbXBsRGVjbDEoKTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGZ1bmNUbXBsRGVjbDIoKTsKKworLy8gUmVkZWNsYXJhdGlvbnMKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIGZ1bmNUbXBsUmVkZWNsMSgpOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgZnVuY1RtcGxSZWRlY2wxKCk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIGZ1bmNUbXBsUmVkZWNsMigpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgYXR0cmlidXRlIGlzIGhlcmV9fQordGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZnVuY1RtcGxSZWRlY2wyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydmdW5jVG1wbFJlZGVjbDInIHJlZGVjbGFyZWQgd2l0aG91dCAnZGxsaW1wb3J0JyBhdHRyaWJ1dGU6IHByZXZpb3VzICdkbGxpbXBvcnQnIGlnbm9yZWR9fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBmdW5jVG1wbFJlZGVjbDMoKTsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19IGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGF0dHJpYnV0ZSBpcyBoZXJlfX0KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+ICAgICAgICAgICAgICAgICAgICAgICB2b2lkIGZ1bmNUbXBsUmVkZWNsMygpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydmdW5jVG1wbFJlZGVjbDMnIHJlZGVjbGFyZWQgd2l0aG91dCAnZGxsaW1wb3J0JyBhdHRyaWJ1dGU6IHByZXZpb3VzICdkbGxpbXBvcnQnIGlnbm9yZWR9fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBmdW5jVG1wbFJlZGVjbDQoKTsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBmdW5jVG1wbFJlZGVjbDQoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlZGVjbGFyYXRpb24gb2YgJ2Z1bmNUbXBsUmVkZWNsNCcgY2Fubm90IGFkZCAnZGxsaW1wb3J0JyBhdHRyaWJ1dGV9fQorCisvLyBGdW5jdGlvbiB0ZW1wbGF0ZSBmcmllbmRzCitzdHJ1Y3QgRnVuY1RtcGxGcmllbmQgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBmcmllbmQgX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgZnVuY1RtcGxGcmllbmQxKCk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGZyaWVuZCBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBmdW5jVG1wbEZyaWVuZDIoKTsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19IGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGF0dHJpYnV0ZSBpcyBoZXJlfX0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gZnJpZW5kIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIGZ1bmNUbXBsRnJpZW5kMygpOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgYXR0cmlidXRlIGlzIGhlcmV9fQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBmcmllbmQgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZnVuY1RtcGxGcmllbmQ0KCk7IC8vIGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIGZ1bmNUbXBsRnJpZW5kMSgpOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZnVuY1RtcGxGcmllbmQyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydmdW5jVG1wbEZyaWVuZDInIHJlZGVjbGFyZWQgd2l0aG91dCAnZGxsaW1wb3J0JyBhdHRyaWJ1dGU6IHByZXZpb3VzICdkbGxpbXBvcnQnIGlnbm9yZWR9fQordGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZnVuY1RtcGxGcmllbmQzKCkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2Z1bmNUbXBsRnJpZW5kMycgcmVkZWNsYXJlZCB3aXRob3V0ICdkbGxpbXBvcnQnIGF0dHJpYnV0ZTogcHJldmlvdXMgJ2RsbGltcG9ydCcgaWdub3JlZH19Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBmdW5jVG1wbEZyaWVuZDQoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlZGVjbGFyYXRpb24gb2YgJ2Z1bmNUbXBsRnJpZW5kNCcgY2Fubm90IGFkZCAnZGxsaW1wb3J0JyBhdHRyaWJ1dGV9fQorCisvLyBFeHRlcm5hbCBsaW5rYWdlIGlzIHJlcXVpcmVkLgordGVtcGxhdGU8dHlwZW5hbWUgVD4gX19kZWNsc3BlYyhkbGxpbXBvcnQpIHN0YXRpYyBpbnQgc3RhdGljRnVuY1RtcGwoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7eydzdGF0aWNGdW5jVG1wbCcgbXVzdCBoYXZlIGV4dGVybmFsIGxpbmthZ2Ugd2hlbiBkZWNsYXJlZCAnZGxsaW1wb3J0J319Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgSW50ZXJuYWwgaW50ZXJuYWxSZXRGdW5jVG1wbCgpOyAvLyBleHBlY3RlZC1lcnJvcnt7J2ludGVybmFsUmV0RnVuY1RtcGwnIG11c3QgaGF2ZSBleHRlcm5hbCBsaW5rYWdlIHdoZW4gZGVjbGFyZWQgJ2RsbGltcG9ydCd9fQorbmFtZXNwYWNlICAgIHsgdGVtcGxhdGU8dHlwZW5hbWUgVD4gX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgaW50ZXJuYWxGdW5jVG1wbCgpOyB9IC8vIGV4cGVjdGVkLWVycm9ye3snKGFub255bW91cyBuYW1lc3BhY2UpOjppbnRlcm5hbEZ1bmNUbXBsJyBtdXN0IGhhdmUgZXh0ZXJuYWwgbGlua2FnZSB3aGVuIGRlY2xhcmVkICdkbGxpbXBvcnQnfX0KK25hbWVzcGFjZSBucyB7IHRlbXBsYXRlPHR5cGVuYW1lIFQ+IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIGV4dGVybmFsRnVuY1RtcGwoKTsgfQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZnVuY1RtcGwoKSB7fQordGVtcGxhdGU8dHlwZW5hbWUgVD4gX19kZWNsc3BlYyhkbGxpbXBvcnQpIHZvaWQgaW1wb3J0ZWRGdW5jVG1wbCgpOworCisvLyBJbXBvcnQgc3BlY2lhbGl6YXRpb24gb2YgYW4gaW1wb3J0ZWQgZnVuY3Rpb24gdGVtcGxhdGUuIEEgZGVmaW5pdGlvbiBtdXN0IGJlCisvLyBkZWNsYXJlZCBpbmxpbmUuCit0ZW1wbGF0ZTw+IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIGltcG9ydGVkRnVuY1RtcGw8RXhwbGljaXRTcGVjX0ltcG9ydGVkPigpOwordGVtcGxhdGU8PiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBpbXBvcnRlZEZ1bmNUbXBsPEV4cGxpY2l0U3BlY19EZWZfSW1wb3J0ZWQ+KCkge30gLy8gZXhwZWN0ZWQtZXJyb3J7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHN5bWJvbCBkZWNsYXJhdGlvbn19Cit0ZW1wbGF0ZTw+IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbmxpbmUgdm9pZCBpbXBvcnRlZEZ1bmNUbXBsPEV4cGxpY2l0U3BlY19JbmxpbmVEZWZfSW1wb3J0ZWQ+KCkge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7J2RsbGltcG9ydCcgYXR0cmlidXRlIGlnbm9yZWR9fQorCisvLyBOb3QgaW1wb3J0aW5nIHNwZWNpYWxpemF0aW9uIG9mIGFuIGltcG9ydGVkIGZ1bmN0aW9uIHRlbXBsYXRlIHdpdGhvdXQKKy8vIGV4cGxpY2l0IGRsbGltcG9ydC4KK3RlbXBsYXRlPD4gdm9pZCBpbXBvcnRlZEZ1bmNUbXBsPEV4cGxpY2l0U3BlY19Ob3RJbXBvcnRlZD4oKSB7fQorCisKKy8vIEltcG9ydCBleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9uIG9mIGEgbm9uLWltcG9ydGVkIGZ1bmN0aW9uIHRlbXBsYXRlLgorZXh0ZXJuIHRlbXBsYXRlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIGZ1bmNUbXBsPEV4cGxpY2l0RGVjbF9JbXBvcnRlZD4oKTsKKworLy8gSW1wb3J0IHNwZWNpYWxpemF0aW9uIG9mIGEgbm9uLWltcG9ydGVkIGZ1bmN0aW9uIHRlbXBsYXRlLiBBIGRlZmluaXRpb24gbXVzdAorLy8gYmUgZGVjbGFyZWQgaW5saW5lLgordGVtcGxhdGU8PiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBmdW5jVG1wbDxFeHBsaWNpdFNwZWNfSW1wb3J0ZWQ+KCk7Cit0ZW1wbGF0ZTw+IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIGZ1bmNUbXBsPEV4cGxpY2l0U3BlY19EZWZfSW1wb3J0ZWQ+KCkge30gLy8gZXhwZWN0ZWQtZXJyb3J7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHN5bWJvbCBkZWNsYXJhdGlvbn19Cit0ZW1wbGF0ZTw+IF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbmxpbmUgdm9pZCBmdW5jVG1wbDxFeHBsaWNpdFNwZWNfSW5saW5lRGVmX0ltcG9ydGVkPigpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydkbGxpbXBvcnQnIGF0dHJpYnV0ZSBpZ25vcmVkfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9lbmFibGVfaWYuY3BwIGIvdGVzdC9TZW1hQ1hYL2VuYWJsZV9pZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkYzI0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC9lbmFibGVfaWYuY3BwCkBAIC0wLDAgKzEsNzkgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC12ZXJpZnkgJXMKKwordHlwZWRlZiBpbnQgKCpmcCkoaW50KTsKK2ludCBzdXJyb2dhdGUoaW50KTsKKworc3RydWN0IFggeworICBYKCkgPSBkZWZhdWx0OyAgLy8gZXhwZWN0ZWQtbm90ZXt7Y2FuZGlkYXRlIGNvbnN0cnVjdG9yIG5vdCB2aWFibGU6IHJlcXVpcmVzIDAgYXJndW1lbnRzLCBidXQgMSB3YXMgcHJvdmlkZWR9fQorICBYKGNvbnN0IFgmKSA9IGRlZmF1bHQ7ICAvLyBleHBlY3RlZC1ub3Rle3tjYW5kaWRhdGUgY29uc3RydWN0b3Igbm90IHZpYWJsZTogbm8ga25vd24gY29udmVyc2lvbiBmcm9tICdib29sJyB0byAnY29uc3QgWCcgZm9yIDFzdCBhcmd1bWVudH19CisgIFgoYm9vbCBiKSBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYoYiwgImNob3NlbiB3aGVuICdiJyBpcyB0cnVlIikpKTsgIC8vIGV4cGVjdGVkLW5vdGV7e2NhbmRpZGF0ZSBkaXNhYmxlZDogY2hvc2VuIHdoZW4gJ2InIGlzIHRydWV9fQorCisgIHZvaWQgZihpbnQgbikgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKG4gPT0gMCwgImNob3NlbiB3aGVuICduJyBpcyB6ZXJvIikpKTsKKyAgdm9pZCBmKGludCBuKSBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYobiA9PSAxLCAiY2hvc2VuIHdoZW4gJ24nIGlzIG9uZSIpKSk7ICAvLyBleHBlY3RlZC1ub3Rle3ttZW1iZXIgZGVjbGFyYXRpb24gbmVhcmx5IG1hdGNoZXN9fSBleHBlY3RlZC1ub3Rle3tjYW5kaWRhdGUgZGlzYWJsZWQ6IGNob3NlbiB3aGVuICduJyBpcyBvbmV9fQorCisgIHN0YXRpYyB2b2lkIHMoaW50IG4pIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZihuID09IDAsICJjaG9zZW4gd2hlbiAnbicgaXMgemVybyIpKSk7ICAvLyBleHBlY3RlZC1ub3RlMnt7Y2FuZGlkYXRlIGRpc2FibGVkOiBjaG9zZW4gd2hlbiAnbicgaXMgemVyb319CisKKyAgdm9pZCBjb25mbGljdChpbnQgbikgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKG4rbiA9PSAxMCwgImNob3NlbiB3aGVuICduJyBpcyBmaXZlIikpKTsgIC8vIGV4cGVjdGVkLW5vdGV7e2NhbmRpZGF0ZSBmdW5jdGlvbn19CisgIHZvaWQgY29uZmxpY3QoaW50IG4pIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZihuKjIgPT0gMTAsICJjaG9zZW4gd2hlbiAnbicgaXMgZml2ZSIpKSk7ICAvLyBleHBlY3RlZC1ub3Rle3tjYW5kaWRhdGUgZnVuY3Rpb259fQorCisgIG9wZXJhdG9yIGxvbmcoKSBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYodHJ1ZSwgImNob3NlbiBvbiB5b3VyIHBsYXRmb3JtIikpKTsKKyAgb3BlcmF0b3IgaW50KCkgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKGZhbHNlLCAiY2hvc2VuIG9uIG90aGVyIHBsYXRmb3JtIikpKTsKKworICBvcGVyYXRvciBmcCgpIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZihmYWxzZSwgIm5ldmVyIGVuYWJsZWQiKSkpIHsgcmV0dXJuIHN1cnJvZ2F0ZTsgfSAgLy8gZXhwZWN0ZWQtbm90ZXt7Y29udmVyc2lvbiBjYW5kaWRhdGUgb2YgdHlwZSAnaW50ICgqKShpbnQpJ319ICAvLyBGSVhNRTogdGhlIG1lc3NhZ2UgaXMgbm90IGRpc3BsYXllZAorfTsKKwordm9pZCBYOjpmKGludCBuKSBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYobiA9PSAwLCAiY2hvc2VuIHdoZW4gJ24nIGlzIHplcm8iKSkpICAvLyBleHBlY3RlZC1ub3Rle3ttZW1iZXIgZGVjbGFyYXRpb24gbmVhcmx5IG1hdGNoZXN9fSBleHBlY3RlZC1ub3Rle3tjYW5kaWRhdGUgZGlzYWJsZWQ6IGNob3NlbiB3aGVuICduJyBpcyB6ZXJvfX0KK3sKK30KKwordm9pZCBYOjpmKGludCBuKSBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYobiA9PSAyLCAiY2hvc2VuIHdoZW4gJ24nIGlzIHR3byIpKSkgIC8vIGV4cGVjdGVkLWVycm9ye3tvdXQtb2YtbGluZSBkZWZpbml0aW9uIG9mICdmJyBkb2VzIG5vdCBtYXRjaCBhbnkgZGVjbGFyYXRpb24gaW4gJ1gnfX0gZXhwZWN0ZWQtbm90ZXt7Y2FuZGlkYXRlIGRpc2FibGVkOiBjaG9zZW4gd2hlbiAnbicgaXMgdHdvfX0KK3sKK30KKworWCB4MSh0cnVlKTsKK1ggeDIoZmFsc2UpOyAvLyBleHBlY3RlZC1lcnJvcnt7bm8gbWF0Y2hpbmcgY29uc3RydWN0b3IgZm9yIGluaXRpYWxpemF0aW9uIG9mICdYJ319CisKK19fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSBjb25zdGV4cHIgaW50IG9sZCgpIHsgcmV0dXJuIDA7IH0gIC8vIGV4cGVjdGVkLW5vdGUye3snb2xkJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQordm9pZCBkZXByZWMxKGludCBpKSBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYob2xkKCkgPT0gMCwgImNob3NlbiB3aGVuIG9sZCgpIGlzIHplcm8iKSkpOyAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J29sZCcgaXMgZGVwcmVjYXRlZH19Cit2b2lkIGRlcHJlYzIoaW50IGkpIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZihvbGQoKSA9PSAwLCAiY2hvc2VuIHdoZW4gb2xkKCkgaXMgemVybyIpKSk7ICAvLyBleHBlY3RlZC13YXJuaW5ne3snb2xkJyBpcyBkZXByZWNhdGVkfX0KKwordm9pZCBvdmVybG9hZGVkKGludCk7Cit2b2lkIG92ZXJsb2FkZWQobG9uZyk7CisKK3N0cnVjdCBOb3RoaW5nIHsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgdHlwZWRlcChUIHQpIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZih0LCAiIikpKTsgIC8vIGV4cGVjdGVkLW5vdGV7e2NhbmRpZGF0ZSBkaXNhYmxlZDp9fSAgZXhwZWN0ZWQtZXJyb3J7e3ZhbHVlIG9mIHR5cGUgJ05vdGhpbmcnIGlzIG5vdCBjb250ZXh0dWFsbHkgY29udmVydGlibGUgdG8gJ2Jvb2wnfX0KK3RlbXBsYXRlPGludCBOPiB2b2lkIHZhbHVlZGVwKCkgX19hdHRyaWJ1dGVfXygoZW5hYmxlX2lmKE4gPT0gMSwgIiIpKSk7CisKKy8vIEZJWE1FOiB3ZSBza2lwIHBvdGVudGlhbCBjb25zdGFudCBleHByZXNzaW9uIGV2YWx1YXRpb24gb24gdmFsdWUgZGVwZW5kZW50CisvLyBlbmFibGUtaWYgZXhwcmVzc2lvbnMKK2ludCBub3RfY29uc3RleHByKCk7Cit0ZW1wbGF0ZTxpbnQgTj4gdm9pZCB2YWx1ZWRlcCgpIF9fYXR0cmlidXRlX18oKGVuYWJsZV9pZihOID09IG5vdF9jb25zdGV4cHIoKSwgIiIpKSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGluc3RhbnRpYXRpb25kZXAoKSBfX2F0dHJpYnV0ZV9fKChlbmFibGVfaWYoc2l6ZW9mKHNpemVvZihUKSkgIT0gMCwgIiIpKSk7CisKK3ZvaWQgdGVzdCgpIHsKKyAgWCB4OworICB4LmYoMCk7CisgIHguZigxKTsKKyAgeC5mKDIpOyAgLy8gbm8gZXJyb3IsIHN1cHByZXNzZWQgYnkgZXJyb25lb3VzIG91dC1vZi1saW5lIGRlZmluaXRpb24KKyAgeC5mKDMpOyAgLy8gZXhwZWN0ZWQtZXJyb3J7e25vIG1hdGNoaW5nIG1lbWJlciBmdW5jdGlvbiBmb3IgY2FsbCB0byAnZid9fQorCisgIHgucygwKTsKKyAgeC5zKDEpOyAgLy8gZXhwZWN0ZWQtZXJyb3J7e25vIG1hdGNoaW5nIG1lbWJlciBmdW5jdGlvbiBmb3IgY2FsbCB0byAncyd9fQorCisgIFg6OnMoMCk7CisgIFg6OnMoMSk7ICAvLyBleHBlY3RlZC1lcnJvcnt7bm8gbWF0Y2hpbmcgbWVtYmVyIGZ1bmN0aW9uIGZvciBjYWxsIHRvICdzJ319CisKKyAgeC5jb25mbGljdCg1KTsgIC8vIGV4cGVjdGVkLWVycm9ye3tjYWxsIHRvIG1lbWJlciBmdW5jdGlvbiAnY29uZmxpY3QnIGlzIGFtYmlndW91c319CisKKyAgZGVwcmVjMigwKTsKKworICBvdmVybG9hZGVkKHgpOworCisgIGludCBpID0geCgxKTsgIC8vIGV4cGVjdGVkLWVycm9ye3tubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgY2FsbCB0byBvYmplY3Qgb2YgdHlwZSAnWCd9fQorCisgIE5vdGhpbmcgbjsKKyAgdHlwZWRlcCgwKTsgIC8vIGV4cGVjdGVkLWVycm9ye3tubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgY2FsbCB0byAndHlwZWRlcCd9fQorICB0eXBlZGVwKDEpOworICB0eXBlZGVwKG4pOyAgLy8gZXhwZWN0ZWQtbm90ZXt7aW4gaW5zdGFudGlhdGlvbiBvZiBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAndHlwZWRlcDxOb3RoaW5nPicgcmVxdWVzdGVkIGhlcmV9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2VudW0tc2NvcGVkLmNwcCBiL3Rlc3QvU2VtYUNYWC9lbnVtLXNjb3BlZC5jcHAKaW5kZXggYjRhYWQxOC4uMWVlZDIyOCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2VudW0tc2NvcGVkLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvZW51bS1zY29wZWQuY3BwCkBAIC03OCwyMiArNzgsMjIgQEAKIC8vIEFsbCB0aGUgcmVkZWNsYXJhdGlvbnMgYmVsb3cgYXJlIGRvbmUgdHdpY2Ugb24gcHVycG9zZS4gVGVzdHMgdGhhdCB0aGUgdHlwZQogLy8gb2YgdGhlIGRlY2xhcmF0aW9uIGlzbid0IGNoYW5nZWQuCiAKLWVudW0gY2xhc3MgUmVkZWNsYXJlMjsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgdXNlIGlzIGhlcmV9fSBleHBlY3RlZC1ub3Rle3twcmV2aW91cyB1c2UgaXMgaGVyZX19CitlbnVtIGNsYXNzIFJlZGVjbGFyZTI7IC8vIGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fSBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KIGVudW0gUmVkZWNsYXJlMjsgLy8gZXhwZWN0ZWQtZXJyb3J7e3ByZXZpb3VzbHkgZGVjbGFyZWQgYXMgc2NvcGVkfX0KIGVudW0gUmVkZWNsYXJlMjsgLy8gZXhwZWN0ZWQtZXJyb3J7e3ByZXZpb3VzbHkgZGVjbGFyZWQgYXMgc2NvcGVkfX0KIAotZW51bSBSZWRlY2xhcmUzIDogaW50OyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyB1c2UgaXMgaGVyZX19IGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIHVzZSBpcyBoZXJlfX0KK2VudW0gUmVkZWNsYXJlMyA6IGludDsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19IGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fQogZW51bSBSZWRlY2xhcmUzOyAvLyBleHBlY3RlZC1lcnJvcnt7cHJldmlvdXNseSBkZWNsYXJlZCB3aXRoIGZpeGVkIHVuZGVybHlpbmcgdHlwZX19CiBlbnVtIFJlZGVjbGFyZTM7IC8vIGV4cGVjdGVkLWVycm9ye3twcmV2aW91c2x5IGRlY2xhcmVkIHdpdGggZml4ZWQgdW5kZXJseWluZyB0eXBlfX0KIAogZW51bSBjbGFzcyBSZWRlY2xhcmU1OwogZW51bSBjbGFzcyBSZWRlY2xhcmU1IDogaW50OyAvLyBvawogCi1lbnVtIFJlZGVjbGFyZTYgOiBpbnQ7IC8vIGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIHVzZSBpcyBoZXJlfX0gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgdXNlIGlzIGhlcmV9fQorZW51bSBSZWRlY2xhcmU2IDogaW50OyAgIC8vIGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fSBleHBlY3RlZC1ub3Rle3twcmV2aW91cyBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KIGVudW0gUmVkZWNsYXJlNiA6IHNob3J0OyAvLyBleHBlY3RlZC1lcnJvcnt7cmVkZWNsYXJlZCB3aXRoIGRpZmZlcmVudCB1bmRlcmx5aW5nIHR5cGV9fQogZW51bSBSZWRlY2xhcmU2IDogc2hvcnQ7IC8vIGV4cGVjdGVkLWVycm9ye3tyZWRlY2xhcmVkIHdpdGggZGlmZmVyZW50IHVuZGVybHlpbmcgdHlwZX19CiAKLWVudW0gY2xhc3MgUmVkZWNsYXJlNzsgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgdXNlIGlzIGhlcmV9fSBleHBlY3RlZC1ub3Rle3twcmV2aW91cyB1c2UgaXMgaGVyZX19CitlbnVtIGNsYXNzIFJlZGVjbGFyZTc7ICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZXt7cHJldmlvdXMgZGVjbGFyYXRpb24gaXMgaGVyZX19IGV4cGVjdGVkLW5vdGV7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fQogZW51bSBjbGFzcyBSZWRlY2xhcmU3IDogc2hvcnQ7IC8vIGV4cGVjdGVkLWVycm9ye3tyZWRlY2xhcmVkIHdpdGggZGlmZmVyZW50IHVuZGVybHlpbmcgdHlwZX19CiBlbnVtIGNsYXNzIFJlZGVjbGFyZTcgOiBzaG9ydDsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JlZGVjbGFyZWQgd2l0aCBkaWZmZXJlbnQgdW5kZXJseWluZyB0eXBlfX0KIApAQCAtMjcyLDYgKzI3MiwxMSBAQAogICBBIGYoQSBhKSB7IHJldHVybiAtYTsgfSAvLyBleHBlY3RlZC1lcnJvciB7e2ludmFsaWQgYXJndW1lbnQgdHlwZSAnUFIxNjkwMDo6QScgdG8gdW5hcnkgZXhwcmVzc2lvbn19CiB9CiAKK25hbWVzcGFjZSBQUjE4NTUxIHsKKyAgZW51bSBjbGFzcyBBIHsgQSB9OworICBib29sIGYoKSB7IHJldHVybiAhQTo6QTsgfSAvLyBleHBlY3RlZC1lcnJvciB7e2ludmFsaWQgYXJndW1lbnQgdHlwZSAnUFIxODU1MTo6QScgdG8gdW5hcnkgZXhwcmVzc2lvbn19Cit9CisKIG5hbWVzcGFjZSByZGFyMTUxMjQzMjkgewogICBlbnVtIGNsYXNzIEIgOiBib29sIHsgRiwgVCB9OwogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvZXhwbGljaXQuY3BwIGIvdGVzdC9TZW1hQ1hYL2V4cGxpY2l0LmNwcAppbmRleCAxYzRkNzcwLi5hYTI4YmQ4IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvZXhwbGljaXQuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9leHBsaWNpdC5jcHAKQEAgLTI0NiwzICsyNDYsOCBAQAogICBleHBsaWNpdCBleHBsaWNpdCBUZXN0KGludCB4KTsgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e2R1cGxpY2F0ZSAnZXhwbGljaXQnIGRlY2xhcmF0aW9uIHNwZWNpZmllcn19CiAgIH07CiB9CisKK25hbWVzcGFjZSBQUjE4Nzc3IHsKKyAgc3RydWN0IFMgeyBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3Q7IH0gczsKKyAgaW50ICpwID0gbmV3IGludChzKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyB2aWFibGUgY29udmVyc2lvbn19Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvZXhwcmVzc2lvbi10cmFpdHMuY3BwIGIvdGVzdC9TZW1hQ1hYL2V4cHJlc3Npb24tdHJhaXRzLmNwcAppbmRleCAzYTAwNjg3Li41MWJiOTBlIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvZXhwcmVzc2lvbi10cmFpdHMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9leHByZXNzaW9uLXRyYWl0cy5jcHAKQEAgLTUyMCwyMCArNTIwLDE5IEBACiAgICAgLy8gNS4xNiBDb25kaXRpb25hbCBvcGVyYXRvciBbZXhwci5jb25kXQogICAgIC8vCiAgICAgLy8gMiBJZiBlaXRoZXIgdGhlIHNlY29uZCBvciB0aGUgdGhpcmQgb3BlcmFuZCBoYXMgdHlwZSAocG9zc2libHkKLSAgICAvLyBjdi1xdWFsaWZpZWQpIHZvaWQsIHRoZW4gdGhlIGx2YWx1ZS10by1ydmFsdWUgKDQuMSksCi0gICAgLy8gYXJyYXktdG8tcG9pbnRlciAoNC4yKSwgYW5kIGZ1bmN0aW9uLXRvLXBvaW50ZXIgKDQuMykgc3RhbmRhcmQKLSAgICAvLyBjb252ZXJzaW9ucyBhcmUgcGVyZm9ybWVkIG9uIHRoZSBzZWNvbmQgYW5kIHRoaXJkIG9wZXJhbmRzLCBhbmQgb25lCi0gICAgLy8gb2YgdGhlIGZvbGxvd2luZyBzaGFsbCBob2xkOgorICAgIC8vIGN2LXF1YWxpZmllZCkgdm9pZCwgb25lIG9mIHRoZSBmb2xsb3dpbmcgc2hhbGwgaG9sZDoKICAgICAvLwogICAgIC8vIC0gVGhlIHNlY29uZCBvciB0aGUgdGhpcmQgb3BlcmFuZCAoYnV0IG5vdCBib3RoKSBpcyBhCi0gICAgLy8gdGhyb3ctZXhwcmVzc2lvbiAoMTUuMSk7IHRoZSByZXN1bHQgaXMgb2YgdGhlIHR5cGUgb2YgdGhlIG90aGVyIGFuZAotICAgIC8vIGlzIGFuIHJ2YWx1ZS4KKyAgICAvLyAocG9zc2libHkgcGFyZW50aGVzaXplZCkgdGhyb3ctZXhwcmVzc2lvbiAoMTUuMSk7IHRoZSByZXN1bHQKKyAgICAvLyBpcyBvZiB0aGUgdHlwZSBhbmQgdmFsdWUgY2F0ZWdvcnkgb2YgdGhlIG90aGVyLgogCiAgICAgQ2xhc3MgY2xhc3NMdmFsdWU7CiAgICAgQVNTRVJUX1JWQUxVRShjb25kID8gdGhyb3cgMSA6ICh2b2lkKTApOwogICAgIEFTU0VSVF9SVkFMVUUoY29uZCA/ICh2b2lkKTAgOiB0aHJvdyAxKTsKLSAgICBBU1NFUlRfUlZBTFVFKGNvbmQgPyB0aHJvdyAxIDogY2xhc3NMdmFsdWUpOwotICAgIEFTU0VSVF9SVkFMVUUoY29uZCA/IGNsYXNzTHZhbHVlIDogdGhyb3cgMSk7CisgICAgQVNTRVJUX1JWQUxVRShjb25kID8gdGhyb3cgMSA6IDApOworICAgIEFTU0VSVF9SVkFMVUUoY29uZCA/IDAgOiB0aHJvdyAxKTsKKyAgICBBU1NFUlRfTFZBTFVFKGNvbmQgPyB0aHJvdyAxIDogY2xhc3NMdmFsdWUpOworICAgIEFTU0VSVF9MVkFMVUUoY29uZCA/IGNsYXNzTHZhbHVlIDogdGhyb3cgMSk7CiAKICAgICAvLyAtIEJvdGggdGhlIHNlY29uZCBhbmQgdGhlIHRoaXJkIG9wZXJhbmRzIGhhdmUgdHlwZSB2b2lkOyB0aGUgcmVzdWx0CiAgICAgLy8gaXMgb2YgdHlwZSB2b2lkIGFuZCBpcyBhbiBydmFsdWUuIFtOb3RlOiB0aGlzIGluY2x1ZGVzIHRoZSBjYXNlCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvZXhwcmVzc2lvbnMuY3BwIGIvdGVzdC9TZW1hQ1hYL2V4cHJlc3Npb25zLmNwcAppbmRleCAyNjM1ZmI4Li4yNWE5Yzg0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvZXhwcmVzc2lvbnMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9leHByZXNzaW9ucy5jcHAKQEAgLTExOCwzICsxMTgsMTAgQEAKICAgKHZvaWQpczEuZm9vKCk7CiAgICh2b2lkKXMyLmZvbygpOwogfQorCituYW1lc3BhY2UgcHIxNjk5MiB7CisgIHR5cGVkZWYgaW50IFQ7CisgIHVuc2lnbmVkIGdldHN6KCkgeworICAgIHJldHVybiAoc2l6ZW9mIFQoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9mbGV4aWJsZS1hcnJheS10ZXN0LmNwcCBiL3Rlc3QvU2VtYUNYWC9mbGV4aWJsZS1hcnJheS10ZXN0LmNwcAppbmRleCBmMjg3NzExLi5lNThmMTlhIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvZmxleGlibGUtYXJyYXktdGVzdC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2ZsZXhpYmxlLWFycmF5LXRlc3QuY3BwCkBAIC0zNiwxNCArMzYsMjAgQEAKIH0KIAogc3RydWN0IFMgewotCXZpcnR1YWwgdm9pZCBmb28oKTsKKyAgdmlydHVhbCB2b2lkIGZvbygpOwogfTsKIAogc3RydWN0IFggewogICAgaW50IGJsYWg7Ci0gICBTIHN0cmluZ3NbXTsJLy8gZXhwZWN0ZWQtZXJyb3Ige3tmbGV4aWJsZSBhcnJheSBtZW1iZXIgJ3N0cmluZ3MnIG9mIG5vbi1QT0QgZWxlbWVudCB0eXBlICdTIFtdJ319CisgICBTIHN0cmluZ3NbXTsKIH07CiAKK1MgYSwgYiA9IGE7CitTIGYoWCAmeCkgeworICBhID0gYjsKKyAgcmV0dXJuIHguc3RyaW5nc1swXTsKK30KKwogY2xhc3MgQSB7CiAgIGludCBzOwogICBjaGFyIGNbXTsKQEAgLTcxLDMgKzc3LDE0IEBACiB9OwogCiB9CisKK3N0cnVjdCBOb25Ucml2RHRvciB7IH5Ob25Ucml2RHRvcigpOyB9OworLy8gRklYTUU6IEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgd2Ugc2hvdWxkIGRpc2FsbG93IGV4YW1wbGVzIGxpa2UgdGhpcy4gR0NDIGFjY2VwdHMuCitzdHJ1Y3QgRmxleE5vblRyaXZEdG9yIHsKKyAgaW50IG47CisgIE5vblRyaXZEdG9yIG50ZFtdOyAvLyBleHBlY3RlZC1lcnJvciB7e2ZsZXhpYmxlIGFycmF5IG1lbWJlciAnbnRkJyBvZiB0eXBlICdOb25Ucml2RHRvciBbXScgd2l0aCBub24tdHJpdmlhbCBkZXN0cnVjdGlvbn19CisgIH5GbGV4Tm9uVHJpdkR0b3IoKSB7CisgICAgZm9yIChpbnQgaSA9IG47IGkgIT0gMDsgLS1pKQorICAgICAgbnRkW2ktMV0ufk5vblRyaXZEdG9yKCk7CisgIH0KK307CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvZm9yLXJhbmdlLWRlcmVmZXJlbmNlLmNwcCBiL3Rlc3QvU2VtYUNYWC9mb3ItcmFuZ2UtZGVyZWZlcmVuY2UuY3BwCmluZGV4IGJmMzE4N2QuLjczNzcxOTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9mb3ItcmFuZ2UtZGVyZWZlcmVuY2UuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9mb3ItcmFuZ2UtZGVyZWZlcmVuY2UuY3BwCkBAIC0xMSw3ICsxMSw3IEBACiAKIHN0cnVjdCBEZWxldGVkRW5kIDogcHVibGljIFQgewogICBEYXRhICpiZWdpbigpOwotICBEYXRhICplbmQoKSA9IGRlbGV0ZTsgLy9leHBlY3RlZC1ub3RlIHt7ZnVuY3Rpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KKyAgRGF0YSAqZW5kKCkgPSBkZWxldGU7IC8vZXhwZWN0ZWQtbm90ZSB7eydlbmQnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlbGV0ZWQgaGVyZX19CiB9OwogCiBzdHJ1Y3QgRGVsZXRlZEFETEJlZ2luIHsgfTsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9mdW5jdGlvbmFsLWNhc3QuY3BwIGIvdGVzdC9TZW1hQ1hYL2Z1bmN0aW9uYWwtY2FzdC5jcHAKaW5kZXggZjhlMGM0Ni4uZjVjYTc2YyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2Z1bmN0aW9uYWwtY2FzdC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2Z1bmN0aW9uYWwtY2FzdC5jcHAKQEAgLTMwNSw4ICszMDUsOCBAQAogICAodm9pZClzdHJ1Y3R1cmVpbWZwKHBzZik7CiAKICAgdHlwZWRlZiB2b2lkIChzdHJ1Y3R1cmU6OipzdHJ1Y3R1cmV2bWZwKSgpOwotICAodm9pZClzdHJ1Y3R1cmV2bWZwKHBzaSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZnVuY3Rpb25hbC1zdHlsZSBjYXN0IGZyb20gJ2NvbnN0IGludCBzdHJ1Y3R1cmU6OionIHRvICdzdHJ1Y3R1cmV2bWZwJyAoYWthICd2b2lkIChzdHJ1Y3R1cmU6OiopKCknKSBpcyBub3QgYWxsb3dlZH19Ci0gICh2b2lkKXN0cnVjdHVyZWltcChwc2YpOyAvLyBleHBlY3RlZC1lcnJvciB7e2Z1bmN0aW9uYWwtc3R5bGUgY2FzdCBmcm9tICd2b2lkIChzdHJ1Y3R1cmU6OiopKCknIHRvICdzdHJ1Y3R1cmVpbXAnIChha2EgJ2ludCBzdHJ1Y3R1cmU6OionKSBpcyBub3QgYWxsb3dlZH19CisgICh2b2lkKXN0cnVjdHVyZXZtZnAocHNpKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3tmdW5jdGlvbmFsLXN0eWxlIGNhc3QgZnJvbSAnY29uc3QgaW50IHN0cnVjdHVyZTo6KicgdG8gJ3N0cnVjdHVyZXZtZnAnIChha2EgJ3ZvaWQgKHN0cnVjdHVyZTo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nKSBpcyBub3QgYWxsb3dlZH19CisgICh2b2lkKXN0cnVjdHVyZWltcChwc2YpOyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e2Z1bmN0aW9uYWwtc3R5bGUgY2FzdCBmcm9tICd2b2lkIChzdHJ1Y3R1cmU6OiopKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319JyB0byAnc3RydWN0dXJlaW1wJyAoYWthICdpbnQgc3RydWN0dXJlOjoqJykgaXMgbm90IGFsbG93ZWR9fQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tIG1pc2MgLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvZ290by5jcHAgYi90ZXN0L1NlbWFDWFgvZ290by5jcHAKaW5kZXggMjRiY2I3Yy4uMDQyZWMzYyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2dvdG8uY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9nb3RvLmNwcApAQCAtMTE4LDcgKzExOCw3IEBACiAKIG5hbWVzcGFjZSB0ZXN0MTIgewogICBzdHJ1Y3QgQSB7IEEoKTsgQShjb25zdCBBJik7IH5BKCk7IH07Ci0gIHZvaWQgdGVzdChBIGEpIHsgLy8gZXhwZWN0ZWQtbm90ZSB7e2p1bXAgZW50ZXJzIGxpZmV0aW1lIG9mIGJsb2NrfX0gRklYTUU6IHdpZXJkIGxvY2F0aW9uCisgIHZvaWQgdGVzdChBIGEpIHsgLy8gZXhwZWN0ZWQtbm90ZSB7e2p1bXAgZW50ZXJzIGxpZmV0aW1lIG9mIGJsb2NrfX0gRklYTUU6IHdlaXJkIGxvY2F0aW9uCiAgICAgZ290byBsYmw7IC8vIGV4cGVjdGVkLWVycm9yIHt7Z290byBpbnRvIHByb3RlY3RlZCBzY29wZX19CiAgICAgKHZvaWQpIF57ICh2b2lkKSBhOyB9OwogICBsYmw6CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvaW1wbGljaXQtbWVtYmVyLWZ1bmN0aW9ucy5jcHAgYi90ZXN0L1NlbWFDWFgvaW1wbGljaXQtbWVtYmVyLWZ1bmN0aW9ucy5jcHAKaW5kZXggYjVmN2ZlMS4uZGU2NzlmZSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2ltcGxpY2l0LW1lbWJlci1mdW5jdGlvbnMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9pbXBsaWNpdC1tZW1iZXItZnVuY3Rpb25zLmNwcApAQCAtNTgsMTMgKzU4LDEzIEBACiAgIH07CiAgIHN0cnVjdCBCOwogICBzdHJ1Y3QgQSB7CisgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMSB7e3doaWxlIHN1YnN0aXR1dGluZyBkZWR1Y2VkIHRlbXBsYXRlIGFyZ3VtZW50c319CiAgICAgdHlwZWRlZiBCIHR5cGU7CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKICAgICAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIEludm9rZUNvcHlDb25zdHJ1Y3Rvcjx0eXBlbmFtZSBUOjp0eXBlPjo6dHlwZT4KICAgICAvLyBleHBlY3RlZC1ub3RlQC0xIHt7aW4gaW5zdGFudGlhdGlvbiBvZiB0ZW1wbGF0ZSBjbGFzc319CiAgICAgQShjb25zdCBUICYpOwogICAgIC8vIGV4cGVjdGVkLW5vdGVALTEge3tpbiBpbnN0YW50aWF0aW9uIG9mIGRlZmF1bHQgYXJndW1lbnR9fQotICAgIC8vIGV4cGVjdGVkLW5vdGVALTIge3t3aGlsZSBzdWJzdGl0dXRpbmcgZGVkdWNlZCB0ZW1wbGF0ZSBhcmd1bWVudHN9fQogICB9OwogICBzdHJ1Y3QgQiB7IC8vIGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGUgY29uc3RydWN0b3IgKHRoZSBpbXBsaWNpdCBtb3ZlIH19CiAgICAgQigpOyAvLyBleHBlY3RlZC1ub3RlIHt7Y2FuZGlkYXRlIGNvbnN0cnVjdG9yIG5vdCB2aWFibGV9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2ltcGxpY2l0LXZpcnR1YWwtbWVtYmVyLWZ1bmN0aW9ucy5jcHAgYi90ZXN0L1NlbWFDWFgvaW1wbGljaXQtdmlydHVhbC1tZW1iZXItZnVuY3Rpb25zLmNwcAppbmRleCBjZDU0N2Y1Li5mODhhNTVjIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvaW1wbGljaXQtdmlydHVhbC1tZW1iZXItZnVuY3Rpb25zLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvaW1wbGljaXQtdmlydHVhbC1tZW1iZXItZnVuY3Rpb25zLmNwcApAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdHJpcGxlICVtc19hYmlfdHJpcGxlIC1ETVNBQkkgLXZlcmlmeSAlcwogc3RydWN0IEEgewogICB2aXJ0dWFsIH5BKCk7CiB9OwpAQCAtOSw4ICsxMCwxMiBAQAogICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSAodm9pZCAqLCBpbnQpOyAvLyBleHBlY3RlZC1ub3RlIHt7J29wZXJhdG9yIGRlbGV0ZScgZGVjbGFyZWQgaGVyZX19CiB9OwogCisjaWZkZWYgTVNBQkkKK0IgYjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ltcGxpY2l0IGRlc3RydWN0b3IgZm9yICdCJyBmaXJzdCByZXF1aXJlZCBoZXJlfX0KKyNlbHNlCiB2b2lkIEI6OmYoKSB7IC8vIGV4cGVjdGVkLW5vdGUge3tpbXBsaWNpdCBkZXN0cnVjdG9yIGZvciAnQicgZmlyc3QgcmVxdWlyZWQgaGVyZX19CiB9CisjZW5kaWYKIAogc3RydWN0IEMgOiBBIHsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBzdWl0YWJsZSBtZW1iZXIgJ29wZXJhdG9yIGRlbGV0ZScgaW4gJ0MnfX0KICAgQygpOwpAQCAtMjYsNCArMzEsMyBAQAogdm9pZCBmKCkgewogICBuZXcgRDsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ltcGxpY2l0IGRlc3RydWN0b3IgZm9yICdEJyBmaXJzdCByZXF1aXJlZCBoZXJlfX0KIH0KLQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2luaXQtcHJpb3JpdHktYXR0ci5jcHAgYi90ZXN0L1NlbWFDWFgvaW5pdC1wcmlvcml0eS1hdHRyLmNwcAppbmRleCBhOTFlYjYwLi5hMmU2ZGYyIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvaW5pdC1wcmlvcml0eS1hdHRyLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvaW5pdC1wcmlvcml0eS1hdHRyLmNwcApAQCAtMjUsOCArMjUsNyBAQAogCiBUd28ga29vWzRdICBfX2F0dHJpYnV0ZV9fKChpbml0X3ByaW9yaXR5KDEuMTMpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J2luaXRfcHJpb3JpdHknIGF0dHJpYnV0ZSByZXF1aXJlcyBhbiBpbnRlZ2VyIGNvbnN0YW50fX0KIAotCi1Ud28gZnVuYygpICBfX2F0dHJpYnV0ZV9fKChpbml0X3ByaW9yaXR5KDEwMDEpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FuIG9ubHkgdXNlICdpbml0X3ByaW9yaXR5JyBhdHRyaWJ1dGUgb24gZmlsZS1zY29wZSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIG9mIGNsYXNzIHR5cGV9fQorVHdvIGZ1bmMoKSAgX19hdHRyaWJ1dGVfXygoaW5pdF9wcmlvcml0eSgxMDAxKSkpOyAvLyBleHBlY3RlZC1lcnJvciB7eydpbml0X3ByaW9yaXR5JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHZhcmlhYmxlc319CiAKIGludCBpICBfX2F0dHJpYnV0ZV9fKChpbml0X3ByaW9yaXR5KDEwMDEpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FuIG9ubHkgdXNlICdpbml0X3ByaW9yaXR5JyBhdHRyaWJ1dGUgb24gZmlsZS1zY29wZSBkZWZpbml0aW9ucyBvZiBvYmplY3RzIG9mIGNsYXNzIHR5cGV9fQogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvbGFtYmRhLWV4cHJlc3Npb25zLmNwcCBiL3Rlc3QvU2VtYUNYWC9sYW1iZGEtZXhwcmVzc2lvbnMuY3BwCmluZGV4IGUyOTA0MjQuLjlhNTNlNDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9sYW1iZGEtZXhwcmVzc2lvbnMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9sYW1iZGEtZXhwcmVzc2lvbnMuY3BwCkBAIC0yODIsNCArMjgyLDg0IEBACiAgICAgfTsKICAgICBMIGw7IAogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQorCisvLyBQUjE4NDc3OiBkb24ndCB0cnkgdG8gY2FwdHVyZSAndGhpcycgZnJvbSBhbiBOU0RNSSBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nCisvLyBhIGxhbWJkYS4KK25hbWVzcGFjZSBOU0RNSXNfaW5fbGFtYmRhcyB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBTIHsgaW50IGEgPSAwOyBpbnQgYiA9IGE7IH07CisgIHZvaWQgZigpIHsgW10oKSB7IFM8aW50PiBzOyB9OyB9CisKKyAgYXV0byB4ID0gW117IHN0cnVjdCBTIHsgaW50IG4sIG0gPSBuOyB9OyB9OworICBhdXRvIHkgPSBbJl17IHN0cnVjdCBTIHsgaW50IG4sIG0gPSBuOyB9OyB9OyAvLyBleHBlY3RlZC1lcnJvciB7e25vbi1sb2NhbCBsYW1iZGEgZXhwcmVzc2lvbiBjYW5ub3QgaGF2ZSBhIGNhcHR1cmUtZGVmYXVsdH19CisgIHZvaWQgZygpIHsgYXV0byB6ID0gWyZdeyBzdHJ1Y3QgUyB7IGludCBuLCBtID0gbjsgfTsgfTsgfQorfQorCituYW1lc3BhY2UgQ2FwdHVyZUluY29tcGxldGUgeworICBzdHJ1Y3QgSW5jb21wbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSAye3tmb3J3YXJkIGRlY2x9fQorICB2b2lkIGcoY29uc3QgSW5jb21wbGV0ZSAmYSk7CisgIHZvaWQgZihJbmNvbXBsZXRlICZhKSB7CisgICAgKHZvaWQpIFthXSB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbmNvbXBsZXRlfX0KKyAgICAodm9pZCkgWyZhXSB7fTsKKworICAgICh2b2lkKSBbPV0geyBnKGEpOyB9OyAvLyBleHBlY3RlZC1lcnJvciB7e2luY29tcGxldGV9fQorICAgICh2b2lkKSBbJl0geyBmKGEpOyB9OworICB9Cit9CisKK25hbWVzcGFjZSBDYXB0dXJlQWJzdHJhY3QgeworICBzdHJ1Y3QgUyB7CisgICAgdmlydHVhbCB2b2lkIGYoKSA9IDA7IC8vIGV4cGVjdGVkLW5vdGUge3t1bmltcGxlbWVudGVkfX0KKyAgICBpbnQgbiA9IDA7CisgIH07CisgIHN0cnVjdCBUIDogUyB7CisgICAgY29uc3RleHByIFQoKSB7fQorICAgIHZvaWQgZigpOworICB9OworICB2b2lkIGYoKSB7CisgICAgY29uc3RleHByIFQgdCA9IFQoKTsKKyAgICBTICZzID0gY29uc3RfY2FzdDxUJj4odCk7CisgICAgLy8gRklYTUU6IE9uY2Ugd2UgcHJvcGVybHkgY29tcHV0ZSBvZHItdXNlIHBlciBEUjcxMiwgdGhpcyBzaG91bGQgYmUKKyAgICAvLyBhY2NlcHRlZCAoYW5kIHNob3VsZCBub3QgY2FwdHVyZSAncycpLgorICAgIFs9XSB7IHJldHVybiBzLm47IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7YWJzdHJhY3R9fQorICB9Cit9CisKK25hbWVzcGFjZSBQUjE4MTI4IHsKKyAgYXV0byBsID0gWz1de307IC8vIGV4cGVjdGVkLWVycm9yIHt7bm9uLWxvY2FsIGxhbWJkYSBleHByZXNzaW9uIGNhbm5vdCBoYXZlIGEgY2FwdHVyZS1kZWZhdWx0fX0KKworICBzdHJ1Y3QgUyB7CisgICAgaW50IG47CisgICAgaW50ICgqZigpKVt0cnVlID8gMSA6IChbPV17IHJldHVybiBuOyB9KCksIDApXTsKKyAgICAvLyBleHBlY3RlZC1lcnJvckAtMSB7e25vbi1sb2NhbCBsYW1iZGEgZXhwcmVzc2lvbiBjYW5ub3QgaGF2ZSBhIGNhcHR1cmUtZGVmYXVsdH19CisgICAgLy8gZXhwZWN0ZWQtZXJyb3JALTIge3tpbnZhbGlkIHVzZSBvZiBub24tc3RhdGljIGRhdGEgbWVtYmVyICduJ319CisgICAgLy8gZXhwZWN0ZWQtZXJyb3JALTMge3thIGxhbWJkYSBleHByZXNzaW9uIG1heSBub3QgYXBwZWFyIGluc2lkZSBvZiBhIGNvbnN0YW50IGV4cHJlc3Npb259fQorICAgIGludCBnKGludCBrID0gKFs9XXsgcmV0dXJuIG47IH0oKSwgMCkpOworICAgIC8vIGV4cGVjdGVkLWVycm9yQC0xIHt7bm9uLWxvY2FsIGxhbWJkYSBleHByZXNzaW9uIGNhbm5vdCBoYXZlIGEgY2FwdHVyZS1kZWZhdWx0fX0KKyAgICAvLyBleHBlY3RlZC1lcnJvckAtMiB7e2ludmFsaWQgdXNlIG9mIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIgJ24nfX0KKworICAgIGludCBhID0gWz1deyByZXR1cm4gbjsgfSgpOyAvLyBvaworICAgIGludCBiID0gWz1deyByZXR1cm4gWz1deyByZXR1cm4gbjsgfSgpOyB9KCk7IC8vIG9rCisgICAgaW50IGMgPSBbXXsgaW50IGsgPSAwOyByZXR1cm4gWz1deyByZXR1cm4gazsgfSgpOyB9KCk7IC8vIG9rCisgICAgaW50IGQgPSBbXXsgcmV0dXJuIFs9XXsgcmV0dXJuIG47IH0oKTsgfSgpOyAvLyBleHBlY3RlZC1lcnJvciB7eyd0aGlzJyBjYW5ub3QgYmUgaW1wbGljaXRseSBjYXB0dXJlZCBpbiB0aGlzIGNvbnRleHR9fQorICB9OworfQorCituYW1lc3BhY2UgUFIxODQ3MyB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZigpIHsKKyAgICBUIHQoMCk7CisgICAgKHZvaWQpIFs9XXsgaW50IG4gPSB0OyB9OyAvLyBleHBlY3RlZC1lcnJvciB7e2RlbGV0ZWR9fQorICB9CisKKyAgdGVtcGxhdGUgdm9pZCBmPGludD4oKTsKKyAgc3RydWN0IE5vQ29weSB7CisgICAgTm9Db3B5KGludCk7CisgICAgTm9Db3B5KGNvbnN0IE5vQ29weSAmKSA9IGRlbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlbGV0ZWR9fQorICAgIG9wZXJhdG9yIGludCgpIGNvbnN0OworICB9OworICB0ZW1wbGF0ZSB2b2lkIGY8Tm9Db3B5PigpOyAvLyBleHBlY3RlZC1ub3RlIHt7aW5zdGFudGlhdGlvbn19Cit9CisKK3ZvaWQgUFIxOTI0OSgpIHsKKyAgYXV0byB4ID0gWyZ4XXt9OyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBhcHBlYXIgaW4gaXRzIG93biBpbml0fX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9saW5rYWdlLmNwcCBiL3Rlc3QvU2VtYUNYWC9saW5rYWdlLmNwcAppbmRleCAxM2QyOTVhLi44YTIwMTNmIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvbGlua2FnZS5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL2xpbmthZ2UuY3BwCkBAIC01LDYgKzUsOCBAQAogCiAvLyBSVU46ICVjbGFuZ19jYzEgLVdlcnJvciAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMCAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgJXMKIAorLy8gQ0hFQ0s6IEBfWlpONXRlc3Q2MUEzZm9vRXZFM2JhciA9IGxpbmtvbmNlX29kciBnbG9iYWwgaTMyIDAsIGFsaWduIDQKKwogLy8gUFI4OTI2CiBuYW1lc3BhY2UgdGVzdDAgewogICB0eXBlZGVmIHN0cnVjdCB7CkBAIC0xMDMsMyArMTA1LDIwIEBACiAgICAgfTsKICAgfQogfQorCisvLyBUZXN0IHRoYXQgd2UgZG9uJ3QgY29tcHV0ZSBsaW5rYWdlIHRvbyBoYXN0aWx5IGJlZm9yZSB3ZSdyZSBkb25lCisvLyBwcm9jZXNzaW5nIGEgcmVjb3JkIGRlY2wuICByZGFyOi8vMTU5MjgxMjUKK25hbWVzcGFjZSB0ZXN0NiB7CisgIHR5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgZm9vKCkgeworICAgICAgLy8gVGVzdGVkIGF0IHRvcCBvZiBmaWxlLgorICAgICAgc3RhdGljIGludCBiYXIgPSAwOworICAgICAgcmV0dXJuIGJhcisrOworICAgIH0KKyAgfSBBOworCisgIHZvaWQgdGVzdCgpIHsKKyAgICBBIGE7CisgICAgYS5mb28oKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL2xpbmthZ2UyLmNwcCBiL3Rlc3QvU2VtYUNYWC9saW5rYWdlMi5jcHAKaW5kZXggMDc1ZjVlNy4uYTdlYjE1ZiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL2xpbmthZ2UyLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvbGlua2FnZTIuY3BwCkBAIC0yMTMsMyArMjEzLDcgQEAKICAgdm9pZCBwcjE2MjQ3X2JhcihpbnQpIHt9CiAgIHZvaWQgcHIxNjI0N19iYXIoZG91YmxlKSB7fQogfQorbmFtZXNwYWNlIFBSMTg5NjQgeworICB1bnNpZ25lZCAmKmZvbzsgLy9leHBlY3RlZC1lcnJvcnt7J2ZvbycgZGVjbGFyZWQgYXMgYSBwb2ludGVyIHRvIGEgcmVmZXJlbmNlIG9mIHR5cGV9fQorICBleHRlcm4gc3RydWN0IHt9ICpmb287IC8vIGRvbid0IGFzc2VydAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL21lbWJlci1leHByLmNwcCBiL3Rlc3QvU2VtYUNYWC9tZW1iZXItZXhwci5jcHAKaW5kZXggMjM5YWVjZi4uZTA5NTVhZSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL21lbWJlci1leHByLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvbWVtYmVyLWV4cHIuY3BwCkBAIC0xOTMsNyArMTkzLDcgQEAKICAgfTsKIAogICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBjYWxsX2Z1bmMoVCB0KSB7Ci0gICAgdC0+ZnVuYygpOyAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUgMiB7e21lbWJlciByZWZlcmVuY2UgdHlwZSAnUFIxNTA0NTo6YmFyJyBpcyBub3QgYSBwb2ludGVyJH19IFwKKyAgICB0LT5mdW5jKCk7ICAvLyBleHBlY3RlZC1lcnJvci1yZSAyIHt7bWVtYmVyIHJlZmVyZW5jZSB0eXBlICdQUjE1MDQ1OjpiYXInIGlzIG5vdCBhIHBvaW50ZXJ7eyR9fX19IFwKICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuIHRvIHVzZSAnLicgaW5zdGVhZD99fQogICB9CiAKQEAgLTIwNyw3ICsyMDcsNyBAQAogCiAgICAgLy8gTWFrZSBzdXJlIGEgZml4aXQgaXNuJ3QgZ2l2ZW4gaW4gdGhlIGNhc2UgdGhhdCB0aGUgJy0+JyBpc24ndCBhY3R1YWxseQogICAgIC8vIHRoZSBwcm9ibGVtICh0aGUgcHJvYmxlbSBpcyB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4gb3BlcmF0b3ItPikuCi0gICAgZi0+ZnVuYygpOyAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3ttZW1iZXIgcmVmZXJlbmNlIHR5cGUgJ1BSMTUwNDU6OmJhcicgaXMgbm90IGEgcG9pbnRlciR9fQorICAgIGYtPmZ1bmMoKTsgIC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7bWVtYmVyIHJlZmVyZW5jZSB0eXBlICdQUjE1MDQ1OjpiYXInIGlzIG5vdCBhIHBvaW50ZXJ7eyR9fX19CiAKICAgICBjYWxsX2Z1bmMoZSk7ICAvLyBleHBlY3RlZC1ub3RlIHt7aW4gaW5zdGFudGlhdGlvbiBvZiBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAnUFIxNTA0NTo6Y2FsbF9mdW5jPFBSMTUwNDU6OmJhcj4nIHJlcXVlc3RlZCBoZXJlfX0KIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL21lbWJlci1pbml0LmNwcCBiL3Rlc3QvU2VtYUNYWC9tZW1iZXItaW5pdC5jcHAKaW5kZXggNmU0ZmQ1ZC4uZDhhMDBiMyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL21lbWJlci1pbml0LmNwcAorKysgYi90ZXN0L1NlbWFDWFgvbWVtYmVyLWluaXQuY3BwCkBAIC0xMDAsMyArMTAwLDEzIEBACiAgIH07CiAgIHZvaWQgZihTcHJpdGUmIHgpIHsgeCA9IHg7IH0KIH0KKworbmFtZXNwYWNlIFBSMTg1NjAgeworICBzdHJ1Y3QgWCB7IGludCBtOyB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBYLAorICAgICAgICAgICB0eXBlbmFtZSBVID0gZGVjbHR5cGUoVDo6bSk+CisgIGludCBmKCk7CisKKyAgc3RydWN0IFkgeyBpbnQgYiA9IGYoKTsgfTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9tZW1iZXItcG9pbnRlci1tcy5jcHAgYi90ZXN0L1NlbWFDWFgvbWVtYmVyLXBvaW50ZXItbXMuY3BwCmluZGV4IGFlZThlMmUuLmU3YzRhZTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9tZW1iZXItcG9pbnRlci1tcy5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL21lbWJlci1wb2ludGVyLW1zLmNwcApAQCAtMSw1ICsxLDYgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1jeHgtYWJpIG1pY3Jvc29mdCAtZm1zLWNvbXBhdGliaWxpdHkgLWZzeW50YXgtb25seSAtdHJpcGxlPWkzODYtcGMtd2luMzIgLXZlcmlmeSAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWN4eC1hYmkgbWljcm9zb2Z0IC1mbXMtY29tcGF0aWJpbGl0eSAtZnN5bnRheC1vbmx5IC10cmlwbGU9eDg2XzY0LXBjLXdpbjMyIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1mbXMtY29tcGF0aWJpbGl0eSAtZnN5bnRheC1vbmx5IC10cmlwbGU9aTM4Ni1wYy13aW4zMiAtdmVyaWZ5IC1EVk1CICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZm1zLWNvbXBhdGliaWxpdHkgLWZzeW50YXgtb25seSAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiAtdmVyaWZ5IC1EVk1CICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZm1zLWNvbXBhdGliaWxpdHkgLWZzeW50YXgtb25seSAtdHJpcGxlPXg4Nl82NC1wYy13aW4zMiAtdmVyaWZ5IC1EVk1WIC1mbXMtbWVtcHRyLXJlcD12aXJ0dWFsICVzCiAvLwogLy8gVGhpcyBmaWxlIHNob3VsZCBhbHNvIGdpdmUgbm8gZGlhZ25vc3RpY3Mgd2hlbiBydW4gdGhyb3VnaCBjbC5leGUgZnJvbSBNU1ZTCiAvLyAyMDEyLCB3aGljaCBzdXBwb3J0cyBDKysxMSBhbmQgc3RhdGljX2Fzc2VydC4gIEl0IHNob3VsZCBwYXNzIGZvciBib3RoIDY0LWJpdApAQCAtMTgsMjIgKzE5LDczIEBACiAgIGludCBmOwogfTsKIAorI2lmZGVmIFZNQgogZW51bSB7CisgIGtTaW5nbGVEYXRhQWxpZ24gICAgICAgICAgICAgPSAxICogc2l6ZW9mKGludCksCisgIGtTaW5nbGVGdW5jdGlvbkFsaWduICAgICAgICAgPSAxICogc2l6ZW9mKHZvaWQgKiksCisgIGtNdWx0aXBsZURhdGFBbGlnbiAgICAgICAgICAgPSAxICogc2l6ZW9mKGludCksCisgIC8vIEV2ZXJ5dGhpbmcgd2l0aCBtb3JlIHRoYW4gMSBmaWVsZCBpcyA4IGJ5dGUgYWxpZ25lZCwgZXhjZXB0IHZpcnR1YWwgZGF0YQorICAvLyBtZW1iZXIgcG9pbnRlcnMgb24geDY0ICh1Z2gpLgorICBrTXVsdGlwbGVGdW5jdGlvbkFsaWduICAgICAgID0gOCwKKyNpZmRlZiBfTV9YNjQKKyAga1ZpcnR1YWxEYXRhQWxpZ24gICAgICAgICAgICA9IDQsCisjZWxzZQorICBrVmlydHVhbERhdGFBbGlnbiAgICAgICAgICAgID0gOCwKKyNlbmRpZgorICBrVmlydHVhbEZ1bmN0aW9uQWxpZ24gICAgICAgID0gOCwKKyAga1Vuc3BlY2lmaWVkRGF0YUFsaWduICAgICAgICA9IDgsCisgIGtVbnNwZWNpZmllZEZ1bmN0aW9uQWxpZ24gICAgPSA4LAorCiAgIGtTaW5nbGVEYXRhU2l6ZSAgICAgICAgICAgICA9IDEgKiBzaXplb2YoaW50KSwKICAga1NpbmdsZUZ1bmN0aW9uU2l6ZSAgICAgICAgID0gMSAqIHNpemVvZih2b2lkICopLAogICBrTXVsdGlwbGVEYXRhU2l6ZSAgICAgICAgICAgPSAxICogc2l6ZW9mKGludCksCiAgIGtNdWx0aXBsZUZ1bmN0aW9uU2l6ZSAgICAgICA9IDIgKiBzaXplb2Yodm9pZCAqKSwKICAga1ZpcnR1YWxEYXRhU2l6ZSAgICAgICAgICAgID0gMiAqIHNpemVvZihpbnQpLAogICBrVmlydHVhbEZ1bmN0aW9uU2l6ZSAgICAgICAgPSAyICogc2l6ZW9mKGludCkgKyAxICogc2l6ZW9mKHZvaWQgKiksCi0gIC8vIFVuc3BlY2lmaWVkIGlzIHdlaXJkLCBpdCdzIDEgbW9yZSBzbG90IHRoYW4gdmlydHVhbC4KLSAga1Vuc3BlY2lmaWVkRGF0YVNpemUgICAgICAgID0ga1ZpcnR1YWxEYXRhU2l6ZSArIDEgKiBzaXplb2YoaW50KSwKLSAga1Vuc3BlY2lmaWVkRnVuY3Rpb25TaXplICAgID0ga1ZpcnR1YWxGdW5jdGlvblNpemUgKyAxICogc2l6ZW9mKHZvaWQgKiksCisgIGtVbnNwZWNpZmllZERhdGFTaXplICAgICAgICA9IDMgKiBzaXplb2YoaW50KSwKKyAga1Vuc3BlY2lmaWVkRnVuY3Rpb25TaXplICAgID0gMiAqIHNpemVvZihpbnQpICsgMiAqIHNpemVvZih2b2lkICopLAogfTsKKyNlbGlmIFZNVgorZW51bSB7CisgIC8vIEV2ZXJ5dGhpbmcgd2l0aCBtb3JlIHRoYW4gMSBmaWVsZCBpcyA4IGJ5dGUgYWxpZ25lZCwgZXhjZXB0IHZpcnR1YWwgZGF0YQorICAvLyBtZW1iZXIgcG9pbnRlcnMgb24geDY0ICh1Z2gpLgorI2lmZGVmIF9NX1g2NAorICBrVmlydHVhbERhdGFBbGlnbiA9IDQsCisjZWxzZQorICBrVmlydHVhbERhdGFBbGlnbiA9IDgsCisjZW5kaWYKKyAga011bHRpcGxlRGF0YUFsaWduID0ga1ZpcnR1YWxEYXRhQWxpZ24sCisgIGtTaW5nbGVEYXRhQWxpZ24gPSBrVmlydHVhbERhdGFBbGlnbiwKKworICBrVW5zcGVjaWZpZWRGdW5jdGlvbkFsaWduID0gOCwKKyAga1ZpcnR1YWxGdW5jdGlvbkFsaWduID0ga1Vuc3BlY2lmaWVkRnVuY3Rpb25BbGlnbiwKKyAga011bHRpcGxlRnVuY3Rpb25BbGlnbiA9IGtVbnNwZWNpZmllZEZ1bmN0aW9uQWxpZ24sCisgIGtTaW5nbGVGdW5jdGlvbkFsaWduID0ga1Vuc3BlY2lmaWVkRnVuY3Rpb25BbGlnbiwKKworICBrVW5zcGVjaWZpZWREYXRhU2l6ZSA9IDMgKiBzaXplb2YoaW50KSwKKyAga1ZpcnR1YWxEYXRhU2l6ZSA9IGtVbnNwZWNpZmllZERhdGFTaXplLAorICBrTXVsdGlwbGVEYXRhU2l6ZSA9IGtVbnNwZWNpZmllZERhdGFTaXplLAorICBrU2luZ2xlRGF0YVNpemUgPSBrVW5zcGVjaWZpZWREYXRhU2l6ZSwKKworICBrVW5zcGVjaWZpZWRGdW5jdGlvblNpemUgPSAyICogc2l6ZW9mKGludCkgKyAyICogc2l6ZW9mKHZvaWQgKiksCisgIGtWaXJ0dWFsRnVuY3Rpb25TaXplID0ga1Vuc3BlY2lmaWVkRnVuY3Rpb25TaXplLAorICBrTXVsdGlwbGVGdW5jdGlvblNpemUgPSBrVW5zcGVjaWZpZWRGdW5jdGlvblNpemUsCisgIGtTaW5nbGVGdW5jdGlvblNpemUgPSBrVW5zcGVjaWZpZWRGdW5jdGlvblNpemUsCit9OworI2Vsc2UKKyNlcnJvciAidGVzdCBkb2Vzbid0IHlldCBzdXBwb3J0IHRoaXMgbW9kZSEiCisjZW5kaWYKIAogLy8gaW5jb21wbGV0ZSB0eXBlcworI2lmZGVmIFZNQgogY2xhc3MgX19zaW5nbGVfaW5oZXJpdGFuY2UgSW5jU2luZ2xlOwogY2xhc3MgX19tdWx0aXBsZV9pbmhlcml0YW5jZSBJbmNNdWx0aXBsZTsKIGNsYXNzIF9fdmlydHVhbF9pbmhlcml0YW5jZSBJbmNWaXJ0dWFsOworI2Vsc2UKK2NsYXNzIEluY1NpbmdsZTsKK2NsYXNzIEluY011bHRpcGxlOworY2xhc3MgSW5jVmlydHVhbDsKKyNlbmRpZgogc3RhdGljX2Fzc2VydChzaXplb2YoaW50IEluY1NpbmdsZTo6KikgICAgICAgID09IGtTaW5nbGVEYXRhU2l6ZSwgIiIpOwogc3RhdGljX2Fzc2VydChzaXplb2YoaW50IEluY011bHRpcGxlOjoqKSAgICAgID09IGtNdWx0aXBsZURhdGFTaXplLCAiIik7CiBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQgSW5jVmlydHVhbDo6KikgICAgICAgPT0ga1ZpcnR1YWxEYXRhU2l6ZSwgIiIpOwpAQCAtNDEsNiArOTMsMTMgQEAKIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHZvaWQgKEluY011bHRpcGxlOjoqKSgpKSA9PSBrTXVsdGlwbGVGdW5jdGlvblNpemUsICIiKTsKIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHZvaWQgKEluY1ZpcnR1YWw6OiopKCkpICA9PSBrVmlydHVhbEZ1bmN0aW9uU2l6ZSwgIiIpOwogCitzdGF0aWNfYXNzZXJ0KF9fYWxpZ25vZihpbnQgSW5jU2luZ2xlOjoqKSAgICAgICAgPT0ga1NpbmdsZURhdGFBbGlnbiwgIiIpOworc3RhdGljX2Fzc2VydChfX2FsaWdub2YoaW50IEluY011bHRpcGxlOjoqKSAgICAgID09IGtNdWx0aXBsZURhdGFBbGlnbiwgIiIpOworc3RhdGljX2Fzc2VydChfX2FsaWdub2YoaW50IEluY1ZpcnR1YWw6OiopICAgICAgID09IGtWaXJ0dWFsRGF0YUFsaWduLCAiIik7CitzdGF0aWNfYXNzZXJ0KF9fYWxpZ25vZih2b2lkIChJbmNTaW5nbGU6OiopKCkpICAgPT0ga1NpbmdsZUZ1bmN0aW9uQWxpZ24sICIiKTsKK3N0YXRpY19hc3NlcnQoX19hbGlnbm9mKHZvaWQgKEluY011bHRpcGxlOjoqKSgpKSA9PSBrTXVsdGlwbGVGdW5jdGlvbkFsaWduLCAiIik7CitzdGF0aWNfYXNzZXJ0KF9fYWxpZ25vZih2b2lkIChJbmNWaXJ0dWFsOjoqKSgpKSAgPT0ga1ZpcnR1YWxGdW5jdGlvbkFsaWduLCAiIik7CisKIC8vIEFuIGluY29tcGxldGUgdHlwZSB3aXRoIGFuIHVuc3BlY2lmaWVkIGluaGVyaXRhbmNlIG1vZGVsIHNlZW1zIHRvIHRha2Ugb25lCiAvLyBtb3JlIHNsb3QgdGhhbiB2aXJ0dWFsLiAgSXQncyBub3QgY2xlYXIgd2hhdCBpdCdzIHVzZWQgZm9yIHlldC4KIGNsYXNzIEluY1Vuc3BlY2lmaWVkOwpAQCAtNjIsOSArMTIxLDE1IEBACiAKIC8vIFRlc3QgYm90aCBkZWNsYXJlZCBhbmQgZGVmaW5lZCB0ZW1wbGF0ZXMuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgWDsKKyNpZmRlZiBWTUIKIHRlbXBsYXRlIDw+IGNsYXNzIF9fc2luZ2xlX2luaGVyaXRhbmNlICAgWDxJbmNTaW5nbGU+OwogdGVtcGxhdGUgPD4gY2xhc3MgX19tdWx0aXBsZV9pbmhlcml0YW5jZSBYPEluY011bHRpcGxlPjsKIHRlbXBsYXRlIDw+IGNsYXNzIF9fdmlydHVhbF9pbmhlcml0YW5jZSAgWDxJbmNWaXJ0dWFsPjsKKyNlbHNlCit0ZW1wbGF0ZSA8PiBjbGFzcyBYPEluY1NpbmdsZT47Cit0ZW1wbGF0ZSA8PiBjbGFzcyBYPEluY011bHRpcGxlPjsKK3RlbXBsYXRlIDw+IGNsYXNzIFg8SW5jVmlydHVhbD47CisjZW5kaWYKIC8vIERvbid0IGRlY2xhcmUgWDxJbmNVbnNwZWNpZmllZD4uCiBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQgWDxJbmNTaW5nbGU+OjoqKSAgICAgICAgICAgPT0ga1NpbmdsZURhdGFTaXplLCAiIik7CiBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQgWDxJbmNNdWx0aXBsZT46OiopICAgICAgICAgPT0ga011bHRpcGxlRGF0YVNpemUsICIiKTsKQEAgLTExNyw5ICsxODIsNyBAQAogCiBzdGF0aWNfYXNzZXJ0KHNpemVvZih2YXJpYWJsZV9mb3JjZXNfc2l6aW5nKSA9PSBrVW5zcGVjaWZpZWREYXRhU2l6ZSwgIiIpOwogc3RhdGljX2Fzc2VydChzaXplb2YoTWVtUHRyMSkgPT0ga1Vuc3BlY2lmaWVkRGF0YVNpemUsICIiKTsKLS8vIEZJWE1FOiBDbGFuZyBmYWlscyB0aGlzIGFzc2VydCBiZWNhdXNlIGl0IGxvY2tzIGluIHRoZSBpbmhlcml0YW5jZSBtb2RlbCBhdAotLy8gdGhlIHBvaW50IG9mIHRoZSB0eXBlZGVmIGluc3RlYWQgb2YgdGhlIGZpcnN0IHVzYWdlLCB3aGlsZSBNU1ZDIGRvZXMgbm90LgotLy9zdGF0aWNfYXNzZXJ0KHNpemVvZihNZW1QdHIyKSA9PSBrU2luZ2xlRGF0YVNpemUsICIiKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKE1lbVB0cjIpID09IGtTaW5nbGVEYXRhU2l6ZSwgIiIpOwogCiBzdHJ1Y3QgTWVtUHRySW5Cb2R5IHsKICAgdHlwZWRlZiBpbnQgTWVtUHRySW5Cb2R5OjoqTWVtUHRyOwpAQCAtMTY0LDUgKzIyNyw0OCBAQAogICB2b2lkIChUOjoqZnVuY19wdHIpKCk7CiB9OwogCisjaWZkZWYgVk1CCiBpbnQgVmlydHVhbDo6KkNhc3RUZXN0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQgVmlydHVhbDo6Kj4oJkFBOjp4KTsKICAgLy8gZXhwZWN0ZWQtZXJyb3JALTEge3tjYW5ub3QgcmVpbnRlcnByZXRfY2FzdCBmcm9tIG1lbWJlciBwb2ludGVyIHR5cGV9fQorI2VuZGlmCisKK25hbWVzcGFjZSBFcnJvclRlc3QgewordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHN0cnVjdCBfX3NpbmdsZV9pbmhlcml0YW5jZSBBOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7aW5oZXJpdGFuY2UgbW9kZWwgaWdub3JlZCBvbiBwcmltYXJ5IHRlbXBsYXRlfX0KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgX19tdWx0aXBsZV9pbmhlcml0YW5jZSBBPFQsIFQ+OworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xIHt7aW5oZXJpdGFuY2UgbW9kZWwgaWdub3JlZCBvbiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9ufX0KK3RlbXBsYXRlIDw+IHN0cnVjdCBfX3NpbmdsZV9pbmhlcml0YW5jZSBBPGludCwgZmxvYXQ+OworCitzdHJ1Y3QgQiB7fTsgLy8gZXhwZWN0ZWQtbm90ZSB7e0IgZGVmaW5lZCBoZXJlfX0KK3N0cnVjdCBfX211bHRpcGxlX2luaGVyaXRhbmNlIEI7IC8vIGV4cGVjdGVkLWVycm9ye3tpbmhlcml0YW5jZSBtb2RlbCBkb2VzIG5vdCBtYXRjaCBkZWZpbml0aW9ufX0KKworc3RydWN0IF9fbXVsdGlwbGVfaW5oZXJpdGFuY2UgQyB7fTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2luaGVyaXRhbmNlIG1vZGVsIGRvZXMgbm90IG1hdGNoIGRlZmluaXRpb259fQorIC8vIGV4cGVjdGVkLW5vdGVALTEge3tDIGRlZmluZWQgaGVyZX19CisKK3N0cnVjdCBfX3ZpcnR1YWxfaW5oZXJpdGFuY2UgRDsKK3N0cnVjdCBEIDogdmlydHVhbCBCIHt9OworfQorI2lmZGVmIFZNQgorI3ByYWdtYSBwb2ludGVyc190b19tZW1iZXJzKGZ1bGxfZ2VuZXJhbGl0eSwgbXVsdGlwbGVfaW5oZXJpdGFuY2UpCitzdHJ1Y3QgVHJ1bHlTaW5nbGVJbmhlcml0YW5jZTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKGludCBUcnVseVNpbmdsZUluaGVyaXRhbmNlOjoqKSA9PSBrTXVsdGlwbGVEYXRhU2l6ZSwgIiIpOworI3ByYWdtYSBwb2ludGVyc190b19tZW1iZXJzKGJlc3RfY2FzZSkKKy8vIFRoaXMgZGVmaW5pdGlvbiBzaG91bGRuJ3QgY29uZmxpY3Qgd2l0aCB0aGUgaW5jcmVhc2VkIGdlbmVyYWxpdHkgdGhhdCB0aGUKKy8vIG11bHRpcGxlX2luaGVyaXRhbmNlIG1vZGVsIGdhdmUgdG8gVHJ1bHlTaW5nbGVJbmhlcml0YW5jZS4KK3N0cnVjdCBUcnVseVNpbmdsZUluaGVyaXRhbmNlIHt9OworCisvLyBFdmVuIGlmIGEgZGVmaW5pdGlvbiBwcm9jZWVkcyB0aGUgZmlyc3QgbWVudGlvbiBvZiBhIHBvaW50ZXIgdG8gbWVtYmVyLCB3ZQorLy8gc3RpbGwgZ2l2ZSB0aGUgcmVjb3JkIHRoZSBmdWxseSBnZW5lcmFsIHJlcHJlc2VudGF0aW9uLgorI3ByYWdtYSBwb2ludGVyc190b19tZW1iZXJzKGZ1bGxfZ2VuZXJhbGl0eSwgdmlydHVhbF9pbmhlcml0YW5jZSkKK3N0cnVjdCBTaW5nbGVJbmhlcml0YW5jZUFzVmlydHVhbEFmdGVyUHJhZ21hIHt9Oworc3RhdGljX2Fzc2VydChzaXplb2YoaW50IFNpbmdsZUluaGVyaXRhbmNlQXNWaXJ0dWFsQWZ0ZXJQcmFnbWE6OiopID09IDEyLCAiIik7CisKKyNwcmFnbWEgcG9pbnRlcnNfdG9fbWVtYmVycyhiZXN0X2Nhc2UpCisKKy8vIFRoZSBhYm92ZSBob2xkcyBldmVuIGlmIHRoZSBwcmFnbWEgY29tZXMgYWZ0ZXIgdGhlIGRlZmluaXRpb24uCitzdHJ1Y3QgU2luZ2xlSW5oZXJpdGFuY2VBc1ZpcnR1YWxCZWZvcmVQcmFnbWEge307CisjcHJhZ21hIHBvaW50ZXJzX3RvX21lbWJlcnModmlydHVhbF9pbmhlcml0YW5jZSkKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKGludCBTaW5nbGVJbmhlcml0YW5jZUFzVmlydHVhbEJlZm9yZVByYWdtYTo6KikgPT0gMTIsICIiKTsKKworI3ByYWdtYSBwb2ludGVyc190b19tZW1iZXJzKHNpbmdsZSkgLy8gZXhwZWN0ZWQtZXJyb3J7e3VuZXhwZWN0ZWQgJ3NpbmdsZSd9fQorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvbWVtYmVyLXBvaW50ZXIuY3BwIGIvdGVzdC9TZW1hQ1hYL21lbWJlci1wb2ludGVyLmNwcAppbmRleCA0ZThiNGE4Li5iODYzMWJjIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvbWVtYmVyLXBvaW50ZXIuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9tZW1iZXItcG9pbnRlci5jcHAKQEAgLTcsMTIgKzcsMTMgQEAKIHN0cnVjdCBFIDogQSB7fTsKIHN0cnVjdCBGIDogRCwgRSB7fTsKIHN0cnVjdCBHIDogdmlydHVhbCBEIHt9OworY2xhc3MgSCA6IEEge307IC8vIGV4cGVjdGVkLW5vdGUgMnt7aW1wbGljaXRseSBkZWNsYXJlZCBwcml2YXRlIGhlcmV9fQogCiBpbnQgQTo6KnBkaTE7CiBpbnQgKDo6QTo6KnBkaTIpOwogaW50IChBOjoqcGZpKShpbnQpOwogCi1pbnQgQjo6KnBiaTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCBhIGNsYXNzIG9yIG5hbWVzcGFjZX19CitpbnQgQjo6KnBiaTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snQicgaXMgbm90IGEgY2xhc3MsIG5hbWVzcGFjZSwgb3Igc2NvcGVkIGVudW1lcmF0aW9ufX0KIGludCBDOjoqcGNpOyAvLyBleHBlY3RlZC1lcnJvciB7eydwY2knIGRvZXMgbm90IHBvaW50IGludG8gYSBjbGFzc319CiB2b2lkIEE6OipwZHY7IC8vIGV4cGVjdGVkLWVycm9yIHt7J3BkdicgZGVjbGFyZWQgYXMgYSBtZW1iZXIgcG9pbnRlciB0byB2b2lkfX0KIGludCYgQTo6KnBkcjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3sncGRyJyBkZWNsYXJlZCBhcyBhIG1lbWJlciBwb2ludGVyIHRvIGEgcmVmZXJlbmNlfX0KQEAgLTExNSw4ICsxMTYsMTEgQEAKICAgKHZvaWQpKGQuKnBhaSk7CiAgICh2b2lkKShwZC0+KnBhaSk7CiAgIEYgZiwgKnB0cmYgPSAmZjsKLSAgKHZvaWQpKGYuKnBhaSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7bGVmdCBoYW5kIG9wZXJhbmQgdG8gLiogbXVzdCBiZSBhIGNsYXNzIGNvbXBhdGlibGUgd2l0aCB0aGUgcmlnaHQgaGFuZCBvcGVyYW5kLCBidXQgaXMgJ0YnfX0KLSAgKHZvaWQpKHB0cmYtPipwYWkpOyAvLyBleHBlY3RlZC1lcnJvciB7e2xlZnQgaGFuZCBvcGVyYW5kIHRvIC0+KiBtdXN0IGJlIGEgcG9pbnRlciB0byBjbGFzcyBjb21wYXRpYmxlIHdpdGggdGhlIHJpZ2h0IGhhbmQgb3BlcmFuZCwgYnV0IGlzICdGIConfX0KKyAgKHZvaWQpKGYuKnBhaSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW1iaWd1b3VzIGNvbnZlcnNpb24gZnJvbSBkZXJpdmVkIGNsYXNzICdGJyB0byBiYXNlIGNsYXNzICdBJ319CisgICh2b2lkKShwdHJmLT4qcGFpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3thbWJpZ3VvdXMgY29udmVyc2lvbiBmcm9tIGRlcml2ZWQgY2xhc3MgJ0YnIHRvIGJhc2UgY2xhc3MgJ0EnfX0KKyAgSCBoLCAqcHRyaCA9ICZoOworICAodm9pZCkoaC4qcGFpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW5ub3QgY2FzdCAnSCcgdG8gaXRzIHByaXZhdGUgYmFzZSBjbGFzcyAnQSd9fQorICAodm9pZCkocHRyaC0+KnBhaSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGNhc3QgJ0gnIHRvIGl0cyBwcml2YXRlIGJhc2UgY2xhc3MgJ0EnfX0KIAogICAodm9pZCkoaG0uKmkpOyAvLyBleHBlY3RlZC1lcnJvciB7e3BvaW50ZXItdG8tbWVtYmVyfX0KICAgKHZvaWQpKHBobS0+KmkpOyAvLyBleHBlY3RlZC1lcnJvciB7e3BvaW50ZXItdG8tbWVtYmVyfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9taWNyb3NvZnQtZHRvci1sb29rdXAtY3h4MTEuY3BwIGIvdGVzdC9TZW1hQ1hYL21pY3Jvc29mdC1kdG9yLWxvb2t1cC1jeHgxMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzOTlhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC9taWNyb3NvZnQtZHRvci1sb29rdXAtY3h4MTEuY3BwCkBAIC0wLDAgKzEsMTMgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtcGMtd2luMzIgLXN0ZD1jKysxMSAtdmVyaWZ5ICVzCisKK3N0cnVjdCBTIHsKKyAgdmlydHVhbCB+UygpID0gZGVsZXRlOyAvLyBleHBlY3RlZC1ub3RlIHt7J35TJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZWxldGVkIGhlcmV9fQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgaW50KTsKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIGRvdWJsZSk7Cit9IHM7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXR0ZW1wdCB0byB1c2UgYSBkZWxldGVkIGZ1bmN0aW9ufX0KKworc3RydWN0IFQgeyAvLyBleHBlY3RlZC1ub3Rle3t2aXJ0dWFsIGRlc3RydWN0b3IgcmVxdWlyZXMgYW4gdW5hbWJpZ3VvdXMsIGFjY2Vzc2libGUgJ29wZXJhdG9yIGRlbGV0ZSd9fQorICB2aXJ0dWFsIH5UKCkgPSBkZWZhdWx0OyAvLyBleHBlY3RlZC1ub3RlIHt7ZXhwbGljaXRseSBkZWZhdWx0ZWQgZnVuY3Rpb24gd2FzIGltcGxpY2l0bHkgZGVsZXRlZCBoZXJlfX0KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIGludCk7CisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBkb3VibGUpOworfSB0OyAvLyBleHBlY3RlZC1lcnJvciB7e2F0dGVtcHQgdG8gdXNlIGEgZGVsZXRlZCBmdW5jdGlvbn19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvbWljcm9zb2Z0LWR0b3ItbG9va3VwLmNwcCBiL3Rlc3QvU2VtYUNYWC9taWNyb3NvZnQtZHRvci1sb29rdXAuY3BwCmluZGV4IGQyNjRiYWIuLjUxMTI5YWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9taWNyb3NvZnQtZHRvci1sb29rdXAuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9taWNyb3NvZnQtZHRvci1sb29rdXAuY3BwCkBAIC0xLDEyICsxLDExIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1jeHgtYWJpIGl0YW5pdW0gLWZzeW50YXgtb25seSAlcwotLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1wYy13aW4zMiAtY3h4LWFiaSBtaWNyb3NvZnQgLXZlcmlmeSAtRE1TVkNfQUJJICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1mc3ludGF4LW9ubHkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlICVtc19hYmlfdHJpcGxlIC12ZXJpZnkgJXMKIAogbmFtZXNwYWNlIFRlc3QxIHsKIAogLy8gU2hvdWxkIGJlIGFjY2VwdGVkIHVuZGVyIHRoZSBJdGFuaXVtIEFCSSAoZmlyc3QgUlVOIGxpbmUpIGJ1dCByZWplY3RlZAogLy8gdW5kZXIgdGhlIE1pY3Jvc29mdCBBQkkgKHNlY29uZCBSVU4gbGluZSksIGFzIE1pY3Jvc29mdCBBQkkgcmVxdWlyZXMKLS8vIG9wZXJhdG9yIGRlbGV0ZSgpIGxvb2t1cHMgdG8gYmUgZG9uZSBhdCBhbGwgdmlydHVhbCBkZXN0cnVjdG9yIGRlY2xhcmF0aW9uCi0vLyBwb2ludHMuCisvLyBvcGVyYXRvciBkZWxldGUoKSBsb29rdXBzIHRvIGJlIGRvbmUgd2hlbiB2dGFibGVzIGFyZSBtYXJrZWQgdXNlZC4KIAogc3RydWN0IEEgewogICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICopOyAvLyBleHBlY3RlZC1ub3RlIHt7bWVtYmVyIGZvdW5kIGJ5IGFtYmlndW91cyBuYW1lIGxvb2t1cH19CkBAIC0yNCw2ICsyMywxMCBAQAogICB2aXJ0dWFsIH5WQygpOyAvLyBleHBlY3RlZC1lcnJvciB7e21lbWJlciAnb3BlcmF0b3IgZGVsZXRlJyBmb3VuZCBpbiBtdWx0aXBsZSBiYXNlIGNsYXNzZXMgb2YgZGlmZmVyZW50IHR5cGVzfX0KIH07CiAKK3ZvaWQgZihWQyB2YykgeworICAvLyBUaGlzIG1hcmtzIFZDJ3MgdnRhYmxlIHVzZWQuCit9CisKIH0KIAogbmFtZXNwYWNlIFRlc3QyIHsKQEAgLTMyLDEwICszNSw5IEBACiAvLyByZXF1aXJlcyBhIGR0b3IgZm9yIEIsIGJ1dCB3ZSBjYW4ndCBpbXBsaWNpdGx5IGRlZmluZSBpdCBiZWNhdXNlIH5BIGlzCiAvLyBwcml2YXRlLiAgYmFyIHNob3VsZCBiZSBhYmxlIHRvIGNhbGwgQSdzIHByaXZhdGUgZHRvciB3aXRob3V0IGVycm9yLCBldmVuCiAvLyB0aG91Z2ggTVNWQyByZWplY3RzIGJhci4KLQogY2xhc3MgQSB7CiBwcml2YXRlOgotICB+QSgpOyAvLyBleHBlY3RlZC1ub3RlIDJ7e2RlY2xhcmVkIHByaXZhdGUgaGVyZX19CisgIH5BKCk7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBwcml2YXRlIGhlcmV9fQogICBpbnQgYTsKIH07CiAKQEAgLTU0LDcgKzU2LDcgQEAKIH07CiAKIHZvaWQgZm9vKEIgYikgeyB9IC8vIGV4cGVjdGVkLW5vdGUge3tpbXBsaWNpdCBkZXN0cnVjdG9yIGZvciAnVGVzdDI6OkInIGZpcnN0IHJlcXVpcmVkIGhlcmV9fQotdm9pZCBiYXIoQSBhKSB7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3t2YXJpYWJsZSBvZiB0eXBlICdUZXN0Mjo6QScgaGFzIHByaXZhdGUgZGVzdHJ1Y3Rvcn19Cit2b2lkIGJhcihBIGEpIHsgfSAvLyBubyBlcnJvcjsgTVNWQyByZWplY3RzIHRoaXMsIGJ1dCB3ZSBza2lwIHRoZSBkaXJlY3QgYWNjZXNzIGNoZWNrLgogdm9pZCBiYXooRCBkKSB7IH0gLy8gbm8gZXJyb3IKIAogfQpAQCAtNjQsMTMgKzY2LDEzIEBACiAKIGNsYXNzIEEgewogICBBKCk7Ci0gIH5BKCk7IC8vIGV4cGVjdGVkLW5vdGUgMnt7aW1wbGljaXRseSBkZWNsYXJlZCBwcml2YXRlIGhlcmV9fQorICB+QSgpOyAvLyBleHBlY3RlZC1ub3RlIHt7aW1wbGljaXRseSBkZWNsYXJlZCBwcml2YXRlIGhlcmV9fQogICBmcmllbmQgdm9pZCBiYXIoQSk7CiAgIGludCBhOwogfTsKIAogdm9pZCBiYXIoQSBhKSB7IH0KLXZvaWQgYmF6KEEgYSkgeyB9IC8vIGV4cGVjdGVkLWVycm9yIHt7dmFyaWFibGUgb2YgdHlwZSAnVGVzdDM6OkEnIGhhcyBwcml2YXRlIGRlc3RydWN0b3J9fQordm9pZCBiYXooQSBhKSB7IH0gLy8gbm8gZXJyb3I7IE1TVkMgcmVqZWN0cyB0aGlzLCBidXQgdGhlIHN0YW5kYXJkIGFsbG93cyBpdC4KIAogLy8gTVNWQyBhY2NlcHRzIGZvbygpIGJ1dCB3ZSByZWplY3QgaXQgZm9yIGNvbnNpc3RlbmN5IHdpdGggSXRhbml1bS4gIE1TVkMgYWxzbwogLy8gcmVqZWN0cyB0aGlzIGlmIEEgaGFzIGEgY29weSBjdG9yIG9yIGlmIHdlIGNhbGwgQSdzIGN0b3IuCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvbWlzc2luZy1tZW1iZXJzLmNwcCBiL3Rlc3QvU2VtYUNYWC9taXNzaW5nLW1lbWJlcnMuY3BwCmluZGV4IDYxOWJjNjEuLjk2YmVkMDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9taXNzaW5nLW1lbWJlcnMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9taXNzaW5nLW1lbWJlcnMuY3BwCkBAIC0xLDcgKzEsNyBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcwogbmFtZXNwYWNlIEEgewogICBuYW1lc3BhY2UgQiB7Ci0gICAgY2xhc3MgQyB7IH07IC8vIGV4cGVjdGVkLW5vdGUgMiB7eydBOjpCOjpDJyBkZWNsYXJlZCBoZXJlfX0KKyAgICBjbGFzcyBDIHsgfTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydBOjpCOjpDJyBkZWNsYXJlZCBoZXJlfX0KICAgICBzdHJ1Y3QgUyB7IH07CiAgICAgdW5pb24gVSB7IH07CiAgIH0KQEAgLTE4LDEzICsxOCwxMiBAQAogfQogCiB2b2lkIGcoKSB7Ci0gIEE6OkI6OkQ6OkU7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWVtYmVyIG5hbWVkICdEJyBpbiBuYW1lc3BhY2UgJ0E6OkInfX0KKyAgQTo6Qjo6RDo6RTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3tubyBtZW1iZXIgbmFtZWQgJ0QnIGluIG5hbWVzcGFjZSAnQTo6Qid7eyR9fX19CiAgIC8vIEZJWE1FOiBUaGUgdHlwbyBjb3JyZWN0aW9ucyBiZWxvdyBzaG91bGQgYmUgc3VwcHJlc3NlZCBzaW5jZSBBOjpCOjpDCiAgIC8vIGRvZXNuJ3QgaGF2ZSBhIG1lbWJlciBuYW1lZCBELgogICBCOjpCOjpDOjpEOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1lbWJlciBuYW1lZCAnQycgaW4gJ0I6OkInOyBkaWQgeW91IG1lYW4gJ0E6OkI6OkMnP319IFwKLSAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtZW1iZXIgbmFtZWQgJ0QnIGluICdBOjpCOjpDJ319Ci0gIDo6Qzo6RDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtZW1iZXIgbmFtZWQgJ0MnIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlOyBkaWQgeW91IG1lYW4gJ0E6OkI6OkMnP319XAotICAgICAgICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWVtYmVyIG5hbWVkICdEJyBpbiAnQTo6Qjo6Qyd9fQorICAgICAgICAgICAgICAvLyBleHBlY3RlZC1lcnJvci1yZSB7e25vIG1lbWJlciBuYW1lZCAnRCcgaW4gJ0E6OkI6OkMne3skfX19fQorICA6OkM6OkQ7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7bm8gbWVtYmVyIG5hbWVkICdDJyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZXt7JH19fX0KIH0KIAogaW50IEE6OkI6OmkgPSAxMDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtZW1iZXIgbmFtZWQgJ2knIGluIG5hbWVzcGFjZSAnQTo6Qid9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL21zLWludGVyZmFjZS5jcHAgYi90ZXN0L1NlbWFDWFgvbXMtaW50ZXJmYWNlLmNwcAppbmRleCAzNjI1ZjcwLi5lNzM4NmNlIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvbXMtaW50ZXJmYWNlLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvbXMtaW50ZXJmYWNlLmNwcApAQCAtMTAsNyArMTAsNyBAQAogICBib29sIG9wZXJhdG9yISgpOwogICAvLyBleHBlY3RlZC1lcnJvckArMSB7e29wZXJhdG9yICdvcGVyYXRvciBpbnQnIGlzIG5vdCBwZXJtaXR0ZWQgd2l0aGluIGFuIGludGVyZmFjZSB0eXBlfX0KICAgb3BlcmF0b3IgaW50KCk7Ci0gIC8vIGV4cGVjdGVkLWVycm9yQCsxIHt7bmVzdGVkIGNsYXNzIEkxOjo8YW5vbnltb3VzPiBpcyBub3QgcGVybWl0dGVkIHdpdGhpbiBhbiBpbnRlcmZhY2UgdHlwZX19CisgIC8vIGV4cGVjdGVkLWVycm9yQCsxIHt7bmVzdGVkIGNsYXNzIEkxOjooYW5vbnltb3VzKSBpcyBub3QgcGVybWl0dGVkIHdpdGhpbiBhbiBpbnRlcmZhY2UgdHlwZX19CiAgIHN0cnVjdCB7IGludCBhOyB9OwogICB2b2lkIGZuMigpIHsKICAgICBzdHJ1Y3QgQSB7IH07IC8vIHNob3VsZCBiZSBpZ25vcmVkOiBub3QgYSBuZXN0ZWQgY2xhc3MKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9tc19zdHJ1Y3QuY3BwIGIvdGVzdC9TZW1hQ1hYL21zX3N0cnVjdC5jcHAKaW5kZXggMzdmYTlhNy4uMjgzMmI1NiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL21zX3N0cnVjdC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL21zX3N0cnVjdC5jcHAKQEAgLTEsNSArMSw2IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5IC10cmlwbGUgaTY4Ni1hcHBsZS1kYXJ3aW45IC1zdGQ9YysrMTEgJXMKLS8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtV25vLWVycm9yPWluY29tcGF0aWJsZS1tcy1zdHJ1Y3QgLXZlcmlmeSAtdHJpcGxlIGk2ODYtYXBwbGUtZGFyd2luOSAtc3RkPWMrKzExICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtV25vLWVycm9yPWluY29tcGF0aWJsZS1tcy1zdHJ1Y3QgLXZlcmlmeSAtdHJpcGxlIGFybXY3LWFwcGxlLWRhcndpbjkgLXN0ZD1jKysxMSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLURURVNUX0ZPUl9FUlJPUiAtdmVyaWZ5IC10cmlwbGUgYXJtdjctYXBwbGUtZGFyd2luOSAtc3RkPWMrKzExICVzCiAKICNwcmFnbWEgbXNfc3RydWN0IG9uCiAKQEAgLTksMTAgKzEwLDI5IEBACiB9OwogCiBzdHJ1Y3QgQiA6IHB1YmxpYyBBIHsKKyNpZmRlZiBURVNUX0ZPUl9FUlJPUgorICAvLyBleHBlY3RlZC1lcnJvckAtMiB7e21zX3N0cnVjdCBtYXkgbm90IHByb2R1Y2UgTVNWQy1jb21wYXRpYmxlIGxheW91dHMgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIGNsYXNzZXMgb3IgdmlydHVhbCBmdW5jdGlvbnN9fQorI2Vsc2UKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtNCB7e21zX3N0cnVjdCBtYXkgbm90IHByb2R1Y2UgTVNWQy1jb21wYXRpYmxlIGxheW91dHMgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIGNsYXNzZXMgb3IgdmlydHVhbCBmdW5jdGlvbnN9fQorI2VuZGlmCiAgIHVuc2lnbmVkIGxvbmcgYzoxNjsKIAlpbnQgZDsKICAgQigpOwogfTsKIAogc3RhdGljX2Fzc2VydChfX2J1aWx0aW5fb2Zmc2V0b2YoQiwgZCkgPT0gMTIsCi0gICJXZSBjYW4ndCBhbGxvY2F0ZSB0aGUgYml0ZmllbGQgaW50byB0aGUgcGFkZGluZyB1bmRlciBtc19zdHJ1Y3QiKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICJXZSBjYW4ndCBhbGxvY2F0ZSB0aGUgYml0ZmllbGQgaW50byB0aGUgcGFkZGluZyB1bmRlciBtc19zdHJ1Y3QiKTsKKworLy8gcmRhcjovLzE2MTc4ODk1CitzdHJ1Y3QgQyB7CisjaWZkZWYgVEVTVF9GT1JfRVJST1IKKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTIge3ttc19zdHJ1Y3QgbWF5IG5vdCBwcm9kdWNlIE1TVkMtY29tcGF0aWJsZSBsYXlvdXRzIGZvciBjbGFzc2VzIHdpdGggYmFzZSBjbGFzc2VzIG9yIHZpcnR1YWwgZnVuY3Rpb25zfX0KKyNlbHNlCisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTQge3ttc19zdHJ1Y3QgbWF5IG5vdCBwcm9kdWNlIE1TVkMtY29tcGF0aWJsZSBsYXlvdXRzIGZvciBjbGFzc2VzIHdpdGggYmFzZSBjbGFzc2VzIG9yIHZpcnR1YWwgZnVuY3Rpb25zfX0KKyNlbmRpZgorICB2aXJ0dWFsIHZvaWQgZm9vKCk7CisgIGxvbmcgbG9uZyBuOworfTsKKworc3RhdGljX2Fzc2VydChfX2J1aWx0aW5fb2Zmc2V0b2YoQywgbikgPT0gOCwKKyAgICAgICAgICAgICAgImxvbmcgbG9uZyBmaWVsZCBpbiBtc19zdHJ1Y3Qgc2hvdWxkIGJlIDgtYnl0ZSBhbGlnbmVkIik7CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvbmVzdGVkLW5hbWUtc3BlYy5jcHAgYi90ZXN0L1NlbWFDWFgvbmVzdGVkLW5hbWUtc3BlYy5jcHAKaW5kZXggZGY0ZjFiMi4uODU4N2U3MCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL25lc3RlZC1uYW1lLXNwZWMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9uZXN0ZWQtbmFtZS1zcGVjLmNwcApAQCAtODUsMTAgKzg1LDEzIEBACiAKIHZvaWQgZjMoKSB7CiAgIE46OnggPSAwOyAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ04nfX0KLSAgaW50IE47Ci0gIE46OnggPSAwOyAvLyBleHBlY3RlZC1lcnJvciB7e2V4cGVjdGVkIGEgY2xhc3Mgb3IgbmFtZXNwYWNlfX0KKyAgLy8gRklYTUU6IENvbnNpZGVyIGluY2x1ZGluZyB0aGUga2luZCBvZiBlbnRpdHkgdGhhdCAnTicgaXMgKCJ2YXJpYWJsZSAnTicKKyAgLy8gZGVjbGFyZWQgaGVyZSIsICJ0ZW1wbGF0ZSAnWCcgZGVjbGFyZWQgaGVyZSIsIGV0YykgdG8gaGVscCBleHBsYWluIHdoYXQgaXQKKyAgLy8gaXMgaWYgaXQncyAnbm90IGEgY2xhc3MsIG5hbWVzcGFjZSwgb3Igc2NvcGVkIGVudW1lcmF0aW9uJy4KKyAgaW50IE47IC8vIGV4cGVjdGVkLW5vdGUge3snTicgZGVjbGFyZWQgaGVyZX19CisgIE46OnggPSAwOyAvLyBleHBlY3RlZC1lcnJvciB7eydOJyBpcyBub3QgYSBjbGFzcywgbmFtZXNwYWNlLCBvciBzY29wZWQgZW51bWVyYXRpb259fQogICB7IGludCBBOyAgICAgICAgICAgQTo6YXggPSAwOyB9Ci0gIHsgdHlwZWRlZiBpbnQgQTsgICBBOjpheCA9IDA7IH0gLy8gZXhwZWN0ZWQtZXJyb3J7e2V4cGVjdGVkIGEgY2xhc3Mgb3IgbmFtZXNwYWNlfX0KKyAgeyB0eXBlZGVmIGludCBBOyAgIEE6OmF4ID0gMDsgfSAvLyBleHBlY3RlZC1lcnJvcnt7J0EnIChha2EgJ2ludCcpIGlzIG5vdCBhIGNsYXNzLCBuYW1lc3BhY2UsIG9yIHNjb3BlZCBlbnVtZXJhdGlvbn19CiAgIHsgdHlwZWRlZiBBOjpDIEE7ICBBOjpheCA9IDA7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtZW1iZXIgbmFtZWQgJ2F4J319CiAgIHsgdHlwZWRlZiBBOjpDIEE7ICBBOjpjeCA9IDA7IH0KIH0KQEAgLTExNCw3ICsxMTcsNyBAQAogICAgIH07CiAKICAgICB2b2lkIGYoKSB7Ci0gICAgICByZXR1cm4gRTo6WDsgLy8gZXhwZWN0ZWQtZXJyb3J7e2V4cGVjdGVkIGEgY2xhc3Mgb3IgbmFtZXNwYWNlfX0KKyAgICAgIHJldHVybiBFOjpYOyAvLyBleHBlY3RlZC1lcnJvcnt7J0U6Ok5lc3RlZDo6RScgaXMgbm90IGEgY2xhc3MsIG5hbWVzcGFjZSwgb3Igc2NvcGVkIGVudW1lcmF0aW9ufX0KICAgICB9CiAgIH0KIH0KQEAgLTE0Myw3ICsxNDYsNyBAQAogICB2b2lkIGcoaW50Jik7IC8vIGV4cGVjdGVkLW5vdGV7e3R5cGUgb2YgMXN0IHBhcmFtZXRlciBvZiBtZW1iZXIgZGVjbGFyYXRpb24gZG9lcyBub3QgbWF0Y2ggZGVmaW5pdGlvbiAoJ2ludCAmJyB2cyAnY29uc3QgaW50ICYnKX19CiB9IAogCi12b2lkIEE6OmYoKSB7fSAvLyBleHBlY3RlZC1lcnJvci1yZXt7b3V0LW9mLWxpbmUgZGVmaW5pdGlvbiBvZiAnZicgZG9lcyBub3QgbWF0Y2ggYW55IGRlY2xhcmF0aW9uIGluIG5hbWVzcGFjZSAnQSckfX0KK3ZvaWQgQTo6ZigpIHt9IC8vIGV4cGVjdGVkLWVycm9yLXJle3tvdXQtb2YtbGluZSBkZWZpbml0aW9uIG9mICdmJyBkb2VzIG5vdCBtYXRjaCBhbnkgZGVjbGFyYXRpb24gaW4gbmFtZXNwYWNlICdBJ3t7JH19fX0KIAogdm9pZCBBOjpnKGNvbnN0IGludCYpIHsgfSAvLyBleHBlY3RlZC1lcnJvcnt7b3V0LW9mLWxpbmUgZGVmaW5pdGlvbiBvZiAnZycgZG9lcyBub3QgbWF0Y2ggYW55IGRlY2xhcmF0aW9uIGluIG5hbWVzcGFjZSAnQSd9fQogCkBAIC0xNjAsNyArMTYzLDcgQEAKICAgdm9pZCBmKCk7CiAgIC8vIEZJWE1FOiBpZiB3ZSBtb3ZlIHRoaXMgdG8gYSBzZXBhcmF0ZSBkZWZpbml0aW9uIG9mIE4sIHRoaW5ncyBicmVhayEKIH0KLXZvaWQgOjpnbG9iYWxfZnVuYzIoaW50KSB7IH0gLy8gZXhwZWN0ZWQtZXJyb3J7e2V4dHJhIHF1YWxpZmljYXRpb24gb24gbWVtYmVyICdnbG9iYWxfZnVuYzInfX0KK3ZvaWQgOjpnbG9iYWxfZnVuYzIoaW50KSB7IH0gLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXh0cmEgcXVhbGlmaWNhdGlvbiBvbiBtZW1iZXIgJ2dsb2JhbF9mdW5jMid9fQogCiB2b2lkIE46OmYoKSB7IH0gLy8gb2theQogCkBAIC0zMDgsNCArMzExLDQgQEAKIH0KIAogbmFtZXNwYWNlIFR5cGVkZWZOYW1lc3BhY2UgeyB0eXBlZGVmIGludCBGOyB9OwotVHlwZWRlZk5hbWVzcGFjZTo6Rjo6Tm9uZXhpc3RlbnROYW1lIEJhZE5OU1dpdGhDWFhTY29wZVNwZWM7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgYSBjbGFzcyBvciBuYW1lc3BhY2V9fQorVHlwZWRlZk5hbWVzcGFjZTo6Rjo6Tm9uZXhpc3RlbnROYW1lIEJhZE5OU1dpdGhDWFhTY29wZVNwZWM7IC8vIGV4cGVjdGVkLWVycm9yIHt7J0YnIChha2EgJ2ludCcpIGlzIG5vdCBhIGNsYXNzLCBuYW1lc3BhY2UsIG9yIHNjb3BlZCBlbnVtZXJhdGlvbn19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvbmV3LWRlbGV0ZS5jcHAgYi90ZXN0L1NlbWFDWFgvbmV3LWRlbGV0ZS5jcHAKaW5kZXggN2ZhY2QxMC4uMTc1ZWJlNyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL25ldy1kZWxldGUuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9uZXctZGVsZXRlLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLXRyaXBsZT1pNjg2LXBjLWxpbnV4LWdudQorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAtdHJpcGxlPWk2ODYtcGMtbGludXgtZ251IC1Xbm8tbmV3LXJldHVybnMtbnVsbAogCiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAKQEAgLTUxNywzICs1MTcsNyBAQAogICAgIHJldHVybiAwOwogICB9CiB9OworCituYW1lc3BhY2UgUFIxODU0NCB7CisgIGlubGluZSB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90KTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb3BlcmF0b3IgbmV3JyBjYW5ub3QgYmUgZGVjbGFyZWQgaW5zaWRlIGEgbmFtZXNwYWNlfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9uZXctbnVsbC5jcHAgYi90ZXN0L1NlbWFDWFgvbmV3LW51bGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYmUwYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWFDWFgvbmV3LW51bGwuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLXN0ZD1jKys5OAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAtc3RkPWMrKzExCisKK3R5cGVkZWYgX19TSVpFX1RZUEVfXyBzaXplX3Q7CisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCitzdHJ1Y3QgUzEgeworICAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBuKSB7CisgICAgIHJldHVybiBudWxscHRyOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J29wZXJhdG9yIG5ldycgc2hvdWxkIG5vdCByZXR1cm4gYSBudWxsIHBvaW50ZXIgdW5sZXNzIGl0IGlzIGRlY2xhcmVkICd0aHJvdygpJyBvciAnbm9leGNlcHQnfX0KKyAgIH0KKyAgIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCBuKSBub2V4Y2VwdCB7CisgICAgIHJldHVybiBfX251bGw7CisgICB9Cit9OworI2VuZGlmCisKK3N0cnVjdCBTMiB7CisgICBzdGF0aWMgc2l6ZV90IHg7CisgICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IG4pIHRocm93KCkgeworICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCBuKSB7CisgICAgIHJldHVybiAodm9pZCopMDsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTIge3snb3BlcmF0b3IgbmV3W10nIHNob3VsZCBub3QgcmV0dXJuIGEgbnVsbCBwb2ludGVyIHVubGVzcyBpdCBpcyBkZWNsYXJlZCAndGhyb3coKScgb3IgJ25vZXhjZXB0J319CisjZWxzZQorICAgICAvLyBleHBlY3RlZC13YXJuaW5nLXJlQC00IHt7J29wZXJhdG9yIG5ld1tdJyBzaG91bGQgbm90IHJldHVybiBhIG51bGwgcG9pbnRlciB1bmxlc3MgaXQgaXMgZGVjbGFyZWQgJ3Rocm93KCkne3skfX19fQorI2VuZGlmCisgICB9Cit9OworCitzdHJ1Y3QgUzMgeworICAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBuKSB7CisgICAgIHJldHVybiAxLTE7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAgICAvLyBleHBlY3RlZC1lcnJvckAtMiB7e2Nhbm5vdCBpbml0aWFsaXplIHJldHVybiBvYmplY3Qgb2YgdHlwZSAndm9pZCAqJyB3aXRoIGFuIHJ2YWx1ZSBvZiB0eXBlICdpbnQnfX0KKyNlbHNlCisgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTQge3tleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyB0byB6ZXJvIHRyZWF0ZWQgYXMgYSBudWxsIHBvaW50ZXIgY29uc3RhbnQgb2YgdHlwZSAndm9pZCAqJ319CisgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTUge3snb3BlcmF0b3IgbmV3JyBzaG91bGQgbm90IHJldHVybiBhIG51bGwgcG9pbnRlciB1bmxlc3MgaXQgaXMgZGVjbGFyZWQgJ3Rocm93KCknfX0KKyNlbmRpZgorICAgfQorICAgdm9pZCAqb3BlcmF0b3IgbmV3W10oc2l6ZV90IG4pIHsKKyAgICAgcmV0dXJuICh2b2lkKikoMS0xKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydvcGVyYXRvciBuZXdbXScgc2hvdWxkIG5vdCByZXR1cm4gYSBudWxsIHBvaW50ZXIgdW5sZXNzIGl0IGlzIGRlY2xhcmVkICd0aHJvdygpJ319CisgICB9Cit9OworCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAordGVtcGxhdGU8Ym9vbCBCPiBzdHJ1Y3QgUzQgeworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IG4pIG5vZXhjZXB0KEIpIHsKKyAgICByZXR1cm4gMDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydvcGVyYXRvciBuZXcnIHNob3VsZCBub3QgcmV0dXJuIGEgbnVsbCBwb2ludGVyfX0KKyAgfQorfTsKK3RlbXBsYXRlIHN0cnVjdCBTNDx0cnVlPjsKK3RlbXBsYXRlIHN0cnVjdCBTNDxmYWxzZT47IC8vIGV4cGVjdGVkLW5vdGUge3tpbiBpbnN0YW50aWF0aW9uIG9mfX0KKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5UPiBzdHJ1Y3QgUzUgeyAvLyBleHBlY3RlZC13YXJuaW5nIDAtMXt7ZXh0ZW5zaW9ufX0KKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBuKSB0aHJvdyhULi4uKSB7CisgICAgcmV0dXJuIDA7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snb3BlcmF0b3IgbmV3JyBzaG91bGQgbm90IHJldHVybiBhIG51bGwgcG9pbnRlcn19CisgIH0KK307Cit0ZW1wbGF0ZSBzdHJ1Y3QgUzU8PjsKK3RlbXBsYXRlIHN0cnVjdCBTNTxpbnQ+OyAvLyBleHBlY3RlZC1ub3RlIHt7aW4gaW5zdGFudGlhdGlvbiBvZn19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvbm9ubnVsbC5jcHAgYi90ZXN0L1NlbWFDWFgvbm9ubnVsbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmNmQxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC9ub25udWxsLmNwcApAQCAtMCwwICsxLDE1IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisKK3RlbXBsYXRlPGludCBJPgorc3RydWN0IFRTIHsKKyAgX19hdHRyaWJ1dGVfXygocmV0dXJuc19ub25udWxsKSkKKyAgdm9pZCAqdmFsdWVfZGVwZW5kZW50KHZvaWQpIHsKKyAgICByZXR1cm4gSTsgLy8gbm8td2FybmluZworICB9CisKKyAgX19hdHRyaWJ1dGVfXygocmV0dXJuc19ub25udWxsKSkKKyAgdm9pZCAqdmFsdWVfaW5kZXBlbmRlbnQodm9pZCkgeworICAgIHJldHVybiAwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bnVsbCByZXR1cm5lZCBmcm9tIGZ1bmN0aW9uIHRoYXQgcmVxdWlyZXMgYSBub24tbnVsbCByZXR1cm4gdmFsdWV9fQorICB9Cit9OworCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvbnVsbF9pbl9hcml0aG1ldGljX29wcy5jcHAgYi90ZXN0L1NlbWFDWFgvbnVsbF9pbl9hcml0aG1ldGljX29wcy5jcHAKaW5kZXggYTkxOTIxMy4uM2I0MmFiNCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL251bGxfaW5fYXJpdGhtZXRpY19vcHMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9udWxsX2luX2FyaXRobWV0aWNfb3BzLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC11bmtub3duLXVua25vd24gLWZzeW50YXgtb25seSAtZmJsb2NrcyAtV251bGwtYXJpdGhtZXRpYyAtdmVyaWZ5IC1Xbm8tc3RyaW5nLXBsdXMtaW50ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtdW5rbm93bi11bmtub3duIC1mc3ludGF4LW9ubHkgLWZibG9ja3MgLVdudWxsLWFyaXRobWV0aWMgLXZlcmlmeSAtV25vLXN0cmluZy1wbHVzLWludCAtV25vLXRhdXRvbG9naWNhbC1wb2ludGVyLWNvbXBhcmUgJXMKICNpbmNsdWRlIDxzdGRkZWYuaD4KIAogdm9pZCBmKCkgewpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL251bGxwdHJfaW5fYXJpdGhtZXRpY19vcHMuY3BwIGIvdGVzdC9TZW1hQ1hYL251bGxwdHJfaW5fYXJpdGhtZXRpY19vcHMuY3BwCmluZGV4IDk2NzEzNTMuLjYwYjQ2NzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9udWxscHRyX2luX2FyaXRobWV0aWNfb3BzLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvbnVsbHB0cl9pbl9hcml0aG1ldGljX29wcy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtZmJsb2NrcyAtc3RkPWMrKzExIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC1Xbm8tdGF1dG9sb2dpY2FsLXBvaW50ZXItY29tcGFyZSAtZmJsb2NrcyAtc3RkPWMrKzExIC12ZXJpZnkgJXMKIAogdm9pZCBmb28oKSB7CiAgIGludCBhOwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL29sZC1zdHlsZS1jYXN0LmNwcCBiL3Rlc3QvU2VtYUNYWC9vbGQtc3R5bGUtY2FzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhNzhlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC9vbGQtc3R5bGUtY2FzdC5jcHAKQEAgLTAsMCArMSwxMSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLVdvbGQtc3R5bGUtY2FzdCAlcworCit2b2lkIHRlc3QxKCkgeworICBsb25nIHggPSAobG9uZykxMjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VzZSBvZiBvbGQtc3R5bGUgY2FzdH19CisgIChsb25nKXg7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1c2Ugb2Ygb2xkLXN0eWxlIGNhc3R9fSBleHBlY3RlZC13YXJuaW5nIHt7ZXhwcmVzc2lvbiByZXN1bHQgdW51c2VkfX0KKyAgKHZvaWQqKil4OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dXNlIG9mIG9sZC1zdHlsZSBjYXN0fX0gZXhwZWN0ZWQtd2FybmluZyB7e2V4cHJlc3Npb24gcmVzdWx0IHVudXNlZH19CisgIGxvbmcgeSA9IHN0YXRpY19jYXN0PGxvbmc+KDEyKTsKKyAgKHZvaWQpeTsKKyAgdHlwZWRlZiB2b2lkIFZPSUQ7CisgIChWT0lEKXk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvb3BlcmF0b3ItYXJyb3ctZGVwdGguY3BwIGIvdGVzdC9TZW1hQ1hYL29wZXJhdG9yLWFycm93LWRlcHRoLmNwcAppbmRleCAzZTJiYThlLi43NjlkYWUwIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvb3BlcmF0b3ItYXJyb3ctZGVwdGguY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9vcGVyYXRvci1hcnJvdy1kZXB0aC5jcHAKQEAgLTksNyArOSw3IEBACiB0ZW1wbGF0ZTxpbnQgTj4gc3RydWN0IEIgewogICBBPE4tMT4gb3BlcmF0b3ItPigpOyAvLyBleHBlY3RlZC1ub3RlICt7eydvcGVyYXRvci0+JyBkZWNsYXJlZCBoZXJlIHByb2R1Y2VzIGFuIG9iamVjdCBvZiB0eXBlICdBPH19CiAjaWYgTUFYICE9IDIKLSAgLy8gZXhwZWN0ZWQtbm90ZS1yZUAtMiB7eyhza2lwcGluZyAoMTIwfDIpICdvcGVyYXRvci0+J3MgaW4gYmFja3RyYWNlKX19CisgIC8vIGV4cGVjdGVkLW5vdGUtcmVALTIge3soc2tpcHBpbmcge3sxMjB8Mn19ICdvcGVyYXRvci0+J3MgaW4gYmFja3RyYWNlKX19CiAjZW5kaWYKIH07CiAKQEAgLTIyLDUgKzIyLDUgQEAKIGludCBuID0gZ29vZC0+bjsKIAogQjxNQVgvMiArIDE+IGJhZDsKLWludCBtID0gYmFkLT5uOyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3VzZSBvZiAnb3BlcmF0b3ItPicgb24gdHlwZSAnQjwoMnwxMHwxMjgpIC8gMiBcKyAxPicgd291bGQgaW52b2tlIGEgc2VxdWVuY2Ugb2YgbW9yZSB0aGFuICgyfDEwfDEyOCkgJ29wZXJhdG9yLT4nIGNhbGxzfX0KK2ludCBtID0gYmFkLT5uOyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3VzZSBvZiAnb3BlcmF0b3ItPicgb24gdHlwZSAnQjx7ezJ8MTB8MTI4fX0gLyAyICsgMT4nIHdvdWxkIGludm9rZSBhIHNlcXVlbmNlIG9mIG1vcmUgdGhhbiB7ezJ8MTB8MTI4fX0gJ29wZXJhdG9yLT4nIGNhbGxzfX0KICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlQC0xIHt7dXNlIC1mb3BlcmF0b3ItYXJyb3ctZGVwdGg9TiB0byBpbmNyZWFzZSAnb3BlcmF0b3ItPicgbGltaXR9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL292ZXJsb2FkLTB4LmNwcCBiL3Rlc3QvU2VtYUNYWC9vdmVybG9hZC0weC5jcHAKaW5kZXggNjc3ZDE2YS4uMWMxODVhNSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL292ZXJsb2FkLTB4LmNwcAorKysgYi90ZXN0L1NlbWFDWFgvb3ZlcmxvYWQtMHguY3BwCkBAIC0xLDcgKzEsMTEgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC1zdGQ9YysrMTEgLXZlcmlmeSAlcyAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC1zdGQ9YysrMTEgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcwogCiBuYW1lc3BhY2UgdGVzdDAgewotICBzdHJ1Y3QgQSB7IC8vIGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGUgZnVuY3Rpb24gKHRoZSBpbXBsaWNpdCBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IpIG5vdCB2aWFibGU6ICd0aGlzJyBhcmd1bWVudCBoYXMgdHlwZSAnY29uc3QgdGVzdDA6OkEnLCBidXQgbWV0aG9kIGlzIG5vdCBtYXJrZWQgY29uc3R9fSBleHBlY3RlZC1ub3RlIHt7Y2FuZGlkYXRlIGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yKSBub3QgdmlhYmxlOiAndGhpcycgYXJndW1lbnQgaGFzIHR5cGUgJ2NvbnN0IHRlc3QwOjpBJywgYnV0IG1ldGhvZCBpcyBub3QgbWFya2VkIGNvbnN0fX0KKyAgc3RydWN0IEEgeyAvLyBleHBlY3RlZC1ub3RlIHt7Y2FuZGlkYXRlIGZ1bmN0aW9uICh0aGUgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IG9wZXJhdG9yKSBub3QgdmlhYmxlOiAndGhpcycgYXJndW1lbnQgaGFzIHR5cGUgJ2NvbnN0IHRlc3QwOjpBJywgYnV0IG1ldGhvZCBpcyBub3QgbWFya2VkIGNvbnN0fX0KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8vIGV4cGVjdGVkLW5vdGVALTIge3tjYW5kaWRhdGUgZnVuY3Rpb24gKHRoZSBpbXBsaWNpdCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IpIG5vdCB2aWFibGU6ICd0aGlzJyBhcmd1bWVudCBoYXMgdHlwZSAnY29uc3QgdGVzdDA6OkEnLCBidXQgbWV0aG9kIGlzIG5vdCBtYXJrZWQgY29uc3R9fQorI2VuZGlmCiAgICAgQSAmb3BlcmF0b3I9KHZvaWQqKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZSBmdW5jdGlvbiBub3QgdmlhYmxlOiAndGhpcycgYXJndW1lbnQgaGFzIHR5cGUgJ2NvbnN0IHRlc3QwOjpBJywgYnV0IG1ldGhvZCBpcyBub3QgbWFya2VkIGNvbnN0fX0KICAgfTsKIApAQCAtOSwzICsxMyw3OSBAQAogICAgIGEgPSAiaGVscCI7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gdmlhYmxlIG92ZXJsb2FkZWQgJz0nfX0KICAgfQogfQorCituYW1lc3BhY2UgUFIxNjMxNCB7CisgIHZvaWQgZihjaGFyKik7CisgIGludCAmZiguLi4pOworICB2b2lkIHgoKQorICB7CisgICAgaW50ICZuID0gZigiZm9vIik7CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMiB7e2NvbnZlcnNpb24gZnJvbSBzdHJpbmcgbGl0ZXJhbCB0byAnY2hhciAqJyBpcyBkZXByZWNhdGVkfX0KKyAgICAvLyBleHBlY3RlZC1lcnJvckAtMyB7e25vbi1jb25zdCBsdmFsdWUgcmVmZXJlbmNlIHRvIHR5cGUgJ2ludCcgY2Fubm90IGJpbmQgdG8gYSB0ZW1wb3Jhcnkgb2YgdHlwZSAndm9pZCd9fQorI2VuZGlmCisgIH0KK30KKworbmFtZXNwYWNlIHdhcm5faWZfYmVzdCB7CisgIGludCBmKGNoYXIgKik7CisgIHZvaWQgZihkb3VibGUpOworICB2b2lkIHgoKQorICB7CisgICAgaW50IG4gPSBmKCJmb28iKTsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0yIHt7Y29udmVyc2lvbiBmcm9tIHN0cmluZyBsaXRlcmFsIHRvICdjaGFyIConIGlzIGRlcHJlY2F0ZWR9fQorI2Vsc2UKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC00IHt7SVNPIEMrKzExIGRvZXMgbm90IGFsbG93IGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgbGl0ZXJhbCB0byAnY2hhciAqJ319CisjZW5kaWYKKyAgfQorfQorCituYW1lc3BhY2UgdXNlcmRlZmluZWRfdnNfaWxsZm9ybWVkIHsKKyAgc3RydWN0IFggeyBYKGNvbnN0IGNoYXIgKik7IH07CisKKyAgdm9pZCAqZihjaGFyICpwKTsgLy8gYmVzdCBmb3IgQysrMDMKKyAgZG91YmxlIGYoWCB4KTsgIC8vIGJlc3QgZm9yIEMrKzExCisgIHZvaWQgZygpCisgIHsKKyAgICBkb3VibGUgZCA9IGYoImZvbyIpOworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTIge3tjb252ZXJzaW9uIGZyb20gc3RyaW5nIGxpdGVyYWwgdG8gJ2NoYXIgKicgaXMgZGVwcmVjYXRlZH19CisgICAgLy8gZXhwZWN0ZWQtZXJyb3JALTMge3tjYW5ub3QgaW5pdGlhbGl6ZSBhIHZhcmlhYmxlIG9mIHR5cGUgJ2RvdWJsZScgd2l0aCBhbiBydmFsdWUgb2YgdHlwZSAndm9pZCAqJ319CisjZW5kaWYKKyAgfQorfQorCituYW1lc3BhY2Ugc2ZpbmFlX3Rlc3QgeworICBpbnQgZihpbnQsIGNoYXIqKTsKKworICB0ZW1wbGF0ZTxpbnQgVD4KKyAgc3RydWN0IFMgeyB0eXBlZGVmIGludCB0eXBlOyB9OworCisgIHRlbXBsYXRlPD4KKyAgc3RydWN0IFM8c2l6ZW9mKGludCk+IHsgdHlwZWRlZiB2b2lkIHR5cGU7IH07CisKKyAgLy8gQysrMTE6IFNGSU5BRSBmYWlsdXJlCisgIC8vIEMrKzAzOiBvaworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgY3h4MTFfaWdub3JlZChULCB0eXBlbmFtZSBTPHNpemVvZihmKFQoKSwgImZvbyIpKT46OnR5cGUgKik7CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTIge3tjb252ZXJzaW9uIGZyb20gc3RyaW5nIGxpdGVyYWwgdG8gJ2NoYXIgKicgaXMgZGVwcmVjYXRlZH19CisjZWxzZQorICAvLyBleHBlY3RlZC1ub3RlQC00IHt7Y2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IHN1YnN0aXR1dGlvbiBmYWlsdXJlfX0KKyNlbmRpZgorCisgIC8vIEMrKzExOiBiZXR0ZXIgdGhhbiBsYXR0ZXIKKyAgLy8gQysrMDM6IHdvcnNlIHRoYW4gbGF0dGVyCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZyhULCAuLi4pOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgZyhULCB0eXBlbmFtZSBTPHNpemVvZihmKFQoKSwgImZvbyIpKT46OnR5cGUgKik7CisjaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTIge3tjb252ZXJzaW9uIGZyb20gc3RyaW5nIGxpdGVyYWwgdG8gJ2NoYXIgKicgaXMgZGVwcmVjYXRlZH19CisjZW5kaWYKKworICBpbnQgYSA9IGN4eDExX2lnbm9yZWQoMCwgMCk7CisgIGludCBiID0gZygwLCAwKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisgIC8vIGV4cGVjdGVkLWVycm9yQC0zIHt7bm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIGNhbGwgdG8gJ2N4eDExX2lnbm9yZWQnfX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTMge3tjYW5ub3QgaW5pdGlhbGl6ZSBhIHZhcmlhYmxlIG9mIHR5cGUgJ2ludCcgd2l0aCBhbiBydmFsdWUgb2YgdHlwZSAndm9pZCd9fQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvb3ZlcmxvYWRlZC1vcGVyYXRvci5jcHAgYi90ZXN0L1NlbWFDWFgvb3ZlcmxvYWRlZC1vcGVyYXRvci5jcHAKaW5kZXggOTkxMDVjYi4uY2QyYjJkMyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL292ZXJsb2FkZWQtb3BlcmF0b3IuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9vdmVybG9hZGVkLW9wZXJhdG9yLmNwcApAQCAtNDUyLDMgKzQ1Miw1OCBAQAogICAgIFJlc3VsdCA9IDE7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gdmlhYmxlIG92ZXJsb2FkZWQgJz0nfX0gLy8gZXhwZWN0ZWQtbm90ZSB7e3R5cGUgJ1BvaW50ZXJVbmlvbjxpbnQgKiwgZmxvYXQgKj4nIGlzIGluY29tcGxldGV9fQogICB9CiB9CisKK25hbWVzcGFjZSBQUjE0OTk1IHsKKyAgc3RydWN0IEIge307CisgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLlQ+IHZvaWQgb3BlcmF0b3IrKyhCLCBULi4uKSB7fQorCisgIHZvaWQgZigpIHsKKyAgICBCIGI7CisgICAgYisrOyAgLy8gb2sKKyAgICArK2I7ICAvLyBvaworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gVD4KKyAgc3RydWN0IEMgeworICAgIHZvaWQgb3BlcmF0b3ItLSAoVC4uLikge30KKyAgfTsKKworICB2b2lkIGcoKSB7CisgICAgQzxpbnQ+IHBvc3RmaXg7CisgICAgQzw+IHByZWZpeDsKKyAgICBwb3N0Zml4LS07ICAvLyBvaworICAgIC0tcHJlZml4OyAgLy8gb2sKKyAgfQorCisgIHN0cnVjdCBEIHt9OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIG9wZXJhdG9yKysoRCwgVCkge30KKworICB2b2lkIGgoKSB7CisgICAgRCBkOworICAgIGQrKzsgIC8vIG9rCisgICAgKytkOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2Fubm90IGluY3JlbWVudCB2YWx1ZSBvZiB0eXBlICdQUjE0OTk1OjpEJ319CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLlQ+IHN0cnVjdCBFIHsKKyAgICB2b2lkIG9wZXJhdG9yKysoVC4uLikge30gLy8gZXhwZWN0ZWQtZXJyb3J7e3BhcmFtZXRlciBvZiBvdmVybG9hZGVkIHBvc3QtaW5jcmVtZW50IG9wZXJhdG9yIG11c3QgaGF2ZSB0eXBlICdpbnQnIChub3QgJ2NoYXInKX19CisgIH07CisKKyAgRTxjaGFyPiBlOyAvLyBleHBlY3RlZC1ub3RlIHt7aW4gaW5zdGFudGlhdGlvbiBvZiB0ZW1wbGF0ZSBjbGFzcyAnUFIxNDk5NTo6RTxjaGFyPicgcmVxdWVzdGVkIGhlcmV9fQorICAKKyAgc3RydWN0IEYgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIFQ+CisgICAgaW50IG9wZXJhdG9yKysgKFQuLi4pIHt9CisgIH07CisKKyAgaW50IGsxID0gRigpLm9wZXJhdG9yKysoMCwgMCk7CisgIGludCBrMiA9IEYoKS5vcGVyYXRvcisrKCcwJyk7CisgIC8vIGV4cGVjdGVkLWVycm9yQC01IHt7b3ZlcmxvYWRlZCAnb3BlcmF0b3IrKycgbXVzdCBiZSBhIHVuYXJ5IG9yIGJpbmFyeSBvcGVyYXRvcn19CisgIC8vIGV4cGVjdGVkLW5vdGVALTMge3tpbiBpbnN0YW50aWF0aW9uIG9mIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uICdQUjE0OTk1OjpGOjpvcGVyYXRvcisrPGludCwgaW50PicgcmVxdWVzdGVkIGhlcmV9fQorICAvLyBleHBlY3RlZC1lcnJvckAtNCB7e25vIG1hdGNoaW5nIG1lbWJlciBmdW5jdGlvbiBmb3IgY2FsbCB0byAnb3BlcmF0b3IrKyd9fQorICAvLyBleHBlY3RlZC1ub3RlQC04IHt7Y2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWQ6IHN1YnN0aXR1dGlvbiBmYWlsdXJlfX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTkge3twYXJhbWV0ZXIgb2Ygb3ZlcmxvYWRlZCBwb3N0LWluY3JlbWVudCBvcGVyYXRvciBtdXN0IGhhdmUgdHlwZSAnaW50JyAobm90ICdjaGFyJyl9fQorICAvLyBleHBlY3RlZC1ub3RlQC02IHt7aW4gaW5zdGFudGlhdGlvbiBvZiBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiAnUFIxNDk5NTo6Rjo6b3BlcmF0b3IrKzxjaGFyPicgcmVxdWVzdGVkIGhlcmV9fQorICAvLyBleHBlY3RlZC1lcnJvckAtNyB7e25vIG1hdGNoaW5nIG1lbWJlciBmdW5jdGlvbiBmb3IgY2FsbCB0byAnb3BlcmF0b3IrKyd9fQorICAvLyBleHBlY3RlZC1ub3RlQC0xMiB7e2NhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOiBzdWJzdGl0dXRpb24gZmFpbHVyZX19Cit9IC8vIG5hbWVzcGFjZSBQUjE0OTk1CisKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9wcjEzMzk0LWNyYXNoLW9uLWludmFsaWQuY3BwIGIvdGVzdC9TZW1hQ1hYL3ByMTMzOTQtY3Jhc2gtb24taW52YWxpZC5jcHAKaW5kZXggODQxZTNjMi4uMzA0ZWU5MiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3ByMTMzOTQtY3Jhc2gtb24taW52YWxpZC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3ByMTMzOTQtY3Jhc2gtb24taW52YWxpZC5jcHAKQEAgLTgsMTIgKzgsMTIgQEAKIH0KIG5hbWVzcGFjZSBnYXRla2VlcGVyX3YxIHsKICAgbmFtZXNwYWNlIGdhdGVrZWVwZXJfZmFjdG9yeV92MSB7Ci0gICAgc3RydWN0IGNsb3N1cmVfdCB7IC8vIGV4cGVjdGVkLW5vdGUge3snY2xvc3VyZV90JyBkZWNsYXJlZCBoZXJlfX0KKyAgICBzdHJ1Y3QgY2xvc3VyZV90IHsgLy8gZXhwZWN0ZWQtbm90ZSB7eydjbG9zdXJlX3QnIGRlY2xhcmVkIGhlcmV9fSBleHBlY3RlZC1ub3RlIHt7J2dhdGVrZWVwZXJfZmFjdG9yeV92MTo6Y2xvc3VyZV90JyBkZWNsYXJlZCBoZXJlfX0KICAgICAgIGdhdGVrZWVwZXJfdjE6OmNsb3N1cmVfdCogY3JlYXRlKCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gdHlwZSBuYW1lZCAnY2xvc3VyZV90JyBpbiBuYW1lc3BhY2UgJ2dhdGVrZWVwZXJfdjEnOyBkaWQgeW91IG1lYW4gc2ltcGx5ICdjbG9zdXJlX3QnP319CiAgICAgfTsKICAgfQogICAvLyBGSVhNRTogVHlwbyBjb3JyZWN0aW9uIHNob3VsZCByZW1vdmUgdGhlICdnYXRla2VlcGVyX3YxOjonIG5hbWUgc3BlY2lmaWVyCi0gIGdhdGVrZWVwZXJfdjE6OmNsb3N1cmVfdCAqeDsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3tubyB0eXBlIG5hbWVkICdjbG9zdXJlX3QnIGluIG5hbWVzcGFjZSAnZ2F0ZWtlZXBlcl92MSckfX0KKyAgZ2F0ZWtlZXBlcl92MTo6Y2xvc3VyZV90ICp4OyAvLyBleHBlY3RlZC1lcnJvciB7e25vIHR5cGUgbmFtZWQgJ2Nsb3N1cmVfdCcgaW4gbmFtZXNwYWNlICdnYXRla2VlcGVyX3YxJzsgZGlkIHlvdSBtZWFuICdnYXRla2VlcGVyX2ZhY3RvcnlfdjE6OmNsb3N1cmVfdCd9fQogfQogCiBuYW1lc3BhY2UgRm9vIHsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9wcjE4Mjg0LWNyYXNoLW9uLWludmFsaWQuY3BwIGIvdGVzdC9TZW1hQ1hYL3ByMTgyODQtY3Jhc2gtb24taW52YWxpZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxY2IyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC9wcjE4Mjg0LWNyYXNoLW9uLWludmFsaWQuY3BwCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKKy8vIERvbid0IGNyYXNoIChQUjE4Mjg0KS4KKworbmFtZXNwYWNlIG4xIHsKK2NsYXNzIEEgeyB9OworY2xhc3MgQyB7IEEgYTsgfTsKKworQTo6UnVuVGVzdCgpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7QysrIHJlcXVpcmVzIGEgdHlwZSBzcGVjaWZpZXIgZm9yIGFsbCBkZWNsYXJhdGlvbnN9fQorCit2b2lkIGYoKSB7CisgIG5ldyBDOworfQorfSAvLyBuYW1lc3BhY2UgbjEKKworbmFtZXNwYWNlIG4yIHsKK2NsYXNzIEEgeyB9OworY2xhc3MgQyA6IHB1YmxpYyBBIHsgfTsKKworQTo6UnVuVGVzdCgpIHt9IC8vIGV4cGVjdGVkLWVycm9yIHt7QysrIHJlcXVpcmVzIGEgdHlwZSBzcGVjaWZpZXIgZm9yIGFsbCBkZWNsYXJhdGlvbnN9fQorCit2b2lkIGYoKSB7CisgIG5ldyBDOworfQorfSAvLyBuYW1lc3BhY2UgbjIKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9wcjk4MTIuYyBiL3Rlc3QvU2VtYUNYWC9wcjk4MTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmJlNDRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hQ1hYL3ByOTgxMi5jCkBAIC0wLDAgKzEsMjEgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKKworI2RlZmluZSBib29sIF9Cb29sCitpbnQgdGVzdDEoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGJvb2wgc2lnbmVkOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snYm9vbCcgY2Fubm90IGJlIHNpZ25lZCBvciB1bnNpZ25lZH19IGV4cGVjdGVkLXdhcm5pbmcge3tkZWNsYXJhdGlvbiBkb2VzIG5vdCBkZWNsYXJlIGFueXRoaW5nfX0KKworICAgIHJldHVybiAwOworfQorI3VuZGVmIGJvb2wKKwordHlwZWRlZiBpbnQgYm9vbDsKKworaW50IHRlc3QyKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBib29sIHNpZ25lZDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3sndHlwZS1uYW1lJyBjYW5ub3QgYmUgc2lnbmVkIG9yIHVuc2lnbmVkfX0gZXhwZWN0ZWQtd2FybmluZyB7e2RlY2xhcmF0aW9uIGRvZXMgbm90IGRlY2xhcmUgYW55dGhpbmd9fQorICAgIF9Cb29sIHNpZ25lZDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snX0Jvb2wnIGNhbm5vdCBiZSBzaWduZWQgb3IgdW5zaWduZWR9fSBleHBlY3RlZC13YXJuaW5nIHt7ZGVjbGFyYXRpb24gZG9lcyBub3QgZGVjbGFyZSBhbnl0aGluZ319CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3ByOTgxMi5jcHAgYi90ZXN0L1NlbWFDWFgvcHI5ODEyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2QwYmVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hQ1hYL3ByOTgxMi5jcHAKQEAgLTAsMCArMSw5IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisKK2ludCB0ZXN0KGludCwgY2hhcioqKQoreworICAgIGJvb2wgc2lnbmVkOyAvLyBleHBlY3RlZC1lcnJvciB7eydib29sJyBjYW5ub3QgYmUgc2lnbmVkIG9yIHVuc2lnbmVkfX0gZXhwZWN0ZWQtd2FybmluZyB7e2RlY2xhcmF0aW9uIGRvZXMgbm90IGRlY2xhcmUgYW55dGhpbmd9fQorCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9wcmFnbWEtdnRvcmRpc3AuY3BwIGIvdGVzdC9TZW1hQ1hYL3ByYWdtYS12dG9yZGlzcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4NDFjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC9wcmFnbWEtdnRvcmRpc3AuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1mbXMtZXh0ZW5zaW9ucyAtZm1zLWNvbXBhdGliaWxpdHkgLWZzeW50YXgtb25seSAtdHJpcGxlPWkzODYtcGMtd2luMzIgLXZlcmlmeSAlcworCitzdHJ1Y3QgQSB7IGludCBhOyB9OworCisjcHJhZ21hIHZ0b3JkaXNwKHBvcCkgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyNwcmFnbWEgdnRvcmRpc3AocG9wLCAuLi4pIGZhaWxlZDogc3RhY2sgZW1wdHl9fQorI3ByYWdtYSB2dG9yZGlzcChwdXNoLCAwKQorI3ByYWdtYSB2dG9yZGlzcChwdXNoLCAxKQorI3ByYWdtYSB2dG9yZGlzcChwdXNoLCAyKQorc3RydWN0IEIgOiB2aXJ0dWFsIEEgeyBpbnQgYjsgfTsKKyNwcmFnbWEgdnRvcmRpc3AocG9wKQorI3ByYWdtYSB2dG9yZGlzcChwb3ApCisjcHJhZ21hIHZ0b3JkaXNwKHBvcCkKKyNwcmFnbWEgdnRvcmRpc3AocG9wKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7I3ByYWdtYSB2dG9yZGlzcChwb3AsIC4uLikgZmFpbGVkOiBzdGFjayBlbXB0eX19CisKKyNwcmFnbWEgdnRvcmRpc3AocHVzaCwgMykgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4cGVjdGVkIGludGVnZXIgYmV0d2VlbiAwIGFuZCAyIGluY2x1c2l2ZSBpbiAnI3ByYWdtYSB2dG9yZGlzcCcgLSBpZ25vcmVkfX0KKyNwcmFnbWEgdnRvcmRpc3AoKQorCisjZGVmaW5lIE9ORSAxCisjcHJhZ21hIHZ0b3JkaXNwKHB1c2gsIE9ORSkKKyNkZWZpbmUgVFdPIDEKKyNwcmFnbWEgdnRvcmRpc3AocHVzaCwgVFdPKQorCisvLyBUZXN0IGEgcmVzZXQuCisjcHJhZ21hIHZ0b3JkaXNwKCkKKyNwcmFnbWEgdnRvcmRpc3AocG9wKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7I3ByYWdtYSB2dG9yZGlzcChwb3AsIC4uLikgZmFpbGVkOiBzdGFjayBlbXB0eX19CisKKyNwcmFnbWEgdnRvcmRpc3AoICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Vua25vd24gYWN0aW9uIGZvciAnI3ByYWdtYSB2dG9yZGlzcCcgLSBpZ25vcmVkfX0KKyNwcmFnbWEgdnRvcmRpc3AoYXNkZikgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Vua25vd24gYWN0aW9uIGZvciAnI3ByYWdtYSB2dG9yZGlzcCcgLSBpZ25vcmVkfX0KKyNwcmFnbWEgdnRvcmRpc3AoLCkgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Vua25vd24gYWN0aW9uIGZvciAnI3ByYWdtYSB2dG9yZGlzcCcgLSBpZ25vcmVkfX0KKyNwcmFnbWEgdnRvcmRpc3AgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21pc3NpbmcgJygnIGFmdGVyICcjcHJhZ21hIHZ0b3JkaXNwJyAtIGlnbm9yaW5nfX0KKyNwcmFnbWEgdnRvcmRpc3AoMykgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4cGVjdGVkIGludGVnZXIgYmV0d2VlbiAwIGFuZCAyIGluY2x1c2l2ZSBpbiAnI3ByYWdtYSB2dG9yZGlzcCcgLSBpZ25vcmVkfX0KKyNwcmFnbWEgdnRvcmRpc3AoKSwgc3R1ZmYgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dHJhIHRva2Vuc319CisKK3N0cnVjdCBDIHsKKy8vIEZJWE1FOiBPdXIgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gdG9rZW4gaW5zZXJ0aW9uIG1ha2VzIGl0IGltcG9zc2libGUgZm9yCisvLyB0aGUgcHJhZ21hIHRvIGFwcGVhciBldmVyeXdoZXJlIHdlIHNob3VsZCBzdXBwb3J0IGl0LgorLy8jcHJhZ21hIHZ0b3JkaXNwKCkKKyAgc3RydWN0IEQgOiB2aXJ0dWFsIEEgeworICB9OworfTsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9wcmFnbWEtd2Vhay5jcHAgYi90ZXN0L1NlbWFDWFgvcHJhZ21hLXdlYWsuY3BwCmluZGV4IDA1N2NmNmIuLmMxZmYyMDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9wcmFnbWEtd2Vhay5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3ByYWdtYS13ZWFrLmNwcApAQCAtNiwzICs2LDYgQEAKICAgdm9pZCBmb28oKSB7CiAgIH07CiB9CisKK2V4dGVybiAiQyIgaW50IFRlc3Q7CisjcHJhZ21hIHdlYWsgdGVzdCA9IFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9wcmltYXJ5LWJhc2UuY3BwIGIvdGVzdC9TZW1hQ1hYL3ByaW1hcnktYmFzZS5jcHAKaW5kZXggMGI2YWFlZi4uZDMwNWFhMyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3ByaW1hcnktYmFzZS5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3ByaW1hcnktYmFzZS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcwogLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKIGNsYXNzIEEgeyB2aXJ0dWFsIHZvaWQgZigpOyB9OwogY2xhc3MgQiA6IHZpcnR1YWwgQSB7IH07CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvcXVhbGlmaWVkLWlkLWxvb2t1cC5jcHAgYi90ZXN0L1NlbWFDWFgvcXVhbGlmaWVkLWlkLWxvb2t1cC5jcHAKaW5kZXggMjMxNjRmYS4uOGVlZjZmNCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3F1YWxpZmllZC1pZC1sb29rdXAuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9xdWFsaWZpZWQtaWQtbG9va3VwLmNwcApAQCAtOTQsNyArOTQsNyBAQAogdm9pZCB0ZXN0X2EoKSB7CiAgIGE6OmE6OmkgPSAzOyAvLyBleHBlY3RlZC1lcnJvcnt7bm8gbWVtYmVyIG5hbWVkICdpJyBpbiBuYW1lc3BhY2UgJ2E6OmEnOyBkaWQgeW91IG1lYW4gJ2E6OmE6OmE6OmknP319CiAgIGE6OmE6OmE6OmkgPSA0OwotICBhOjphOjpqID0gMzsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e25vIG1lbWJlciBuYW1lZCAnaicgaW4gbmFtZXNwYWNlICdhOjphJyR9fQorICBhOjphOjpqID0gMzsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e25vIG1lbWJlciBuYW1lZCAnaicgaW4gbmFtZXNwYWNlICdhOjphJ3t7JH19fX0KIH0KICAgCiBzdHJ1Y3QgVW5kZWYgeyAvLyBleHBlY3RlZC1ub3Rle3tkZWZpbml0aW9uIG9mICdVbmRlZicgaXMgbm90IGNvbXBsZXRlIHVudGlsIHRoZSBjbG9zaW5nICd9J319CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvcmVmZXJlbmNlcy5jcHAgYi90ZXN0L1NlbWFDWFgvcmVmZXJlbmNlcy5jcHAKaW5kZXggMzdmYzJhOC4uY2ZlN2RjMSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3JlZmVyZW5jZXMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9yZWZlcmVuY2VzLmNwcApAQCAtODUsOSArODUsMTkgQEAKICAgdHlwZWRlZiBpbnQmIGludHJlZjsKICAgdHlwZWRlZiBpbnRyZWYmIGludHJlZnJlZjsgLy8gQysrIERSIDEwNjogcmVmZXJlbmNlIGNvbGxhcHNpbmcKIAotICB0eXBlZGVmIGludHJlZiBjb25zdCBpbnRyZWZfYzsgLy8gb2theS4gRklYTUU6IGhvdyBkbyB3ZSB2ZXJpZnkgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIHR5cGUgYXMgaW50cmVmPworICB0eXBlZGVmIGludHJlZiBjb25zdCBpbnRyZWZfYzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydjb25zdCcgcXVhbGlmaWVyIG9uIHJlZmVyZW5jZSB0eXBlICdpbnRyZWYnIChha2EgJ2ludCAmJykgaGFzIG5vIGVmZmVjdH19CisgIHR5cGVkZWYgaW50cmVmX2MgaW50cmVmOyAvLyBvaywgc2FtZSB0eXBlCisKKyAgdHlwZWRlZiBpbnRyZWYgdm9sYXRpbGUgaW50cmVmOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3ZvbGF0aWxlJyBxdWFsaWZpZXIgb24gcmVmZXJlbmNlIHR5cGUgJ2ludHJlZicgKGFrYSAnaW50ICYnKSBoYXMgbm8gZWZmZWN0fX0KKyAgdHlwZWRlZiBpbnRyZWYgX0F0b21pYyBpbnRyZWY7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snX0F0b21pYycgcXVhbGlmaWVyIG9uIHJlZmVyZW5jZSB0eXBlICdpbnRyZWYnIChha2EgJ2ludCAmJykgaGFzIG5vIGVmZmVjdH19CisKKyAgdm9pZCByZXN0cmljdF9yZWYoX19yZXN0cmljdCBpbnRyZWYpOyAvLyBvaworICB2b2lkIHJlc3RyaWN0X3JlZihpbnQgJl9fcmVzdHJpY3QpOyAvLyBvawogfQogCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgY29uc3RfcGFyYW0oY29uc3QgVCkge30KK2ludCBjb25zdF9yZWZfcGFyYW0gPSBjb25zdF9wYXJhbTxpbnQmPihjb25zdF9yZWZfcGFyYW0pOyAvLyBuby13YXJuaW5nCisKIAogY2xhc3Mgc3RyaW5nIHsKICAgY2hhciAqRGF0YTsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9yZWludGVycHJldC1jYXN0LmNwcCBiL3Rlc3QvU2VtYUNYWC9yZWludGVycHJldC1jYXN0LmNwcAppbmRleCBhNGJjNDMyLi40Mjg0MDMyIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvcmVpbnRlcnByZXQtY2FzdC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3JlaW50ZXJwcmV0LWNhc3QuY3BwCkBAIC05NiwxMiArOTYsMTIgQEAKICAgdm9pZCAoc3RydWN0dXJlOjoqcHNmKSgpID0gMDsKICAgKHZvaWQpcmVpbnRlcnByZXRfY2FzdDxpbnQgKHN0cnVjdHVyZTo6KikoKT4ocHNmKTsKIAotICAodm9pZClyZWludGVycHJldF9jYXN0PHZvaWQgKHN0cnVjdHVyZTo6KikoKT4ocHNpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZWludGVycHJldF9jYXN0IGZyb20gJ2NvbnN0IGludCBzdHJ1Y3R1cmU6OionIHRvICd2b2lkIChzdHJ1Y3R1cmU6OiopKCknIGlzIG5vdCBhbGxvd2VkfX0KLSAgKHZvaWQpcmVpbnRlcnByZXRfY2FzdDxpbnQgc3RydWN0dXJlOjoqPihwc2YpOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlaW50ZXJwcmV0X2Nhc3QgZnJvbSAndm9pZCAoc3RydWN0dXJlOjoqKSgpJyB0byAnaW50IHN0cnVjdHVyZTo6KicgaXMgbm90IGFsbG93ZWR9fQorICAodm9pZClyZWludGVycHJldF9jYXN0PHZvaWQgKHN0cnVjdHVyZTo6KikoKT4ocHNpKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3tyZWludGVycHJldF9jYXN0IGZyb20gJ2NvbnN0IGludCBzdHJ1Y3R1cmU6OionIHRvICd2b2lkIChzdHJ1Y3R1cmU6OiopKCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319JyBpcyBub3QgYWxsb3dlZH19CisgICh2b2lkKXJlaW50ZXJwcmV0X2Nhc3Q8aW50IHN0cnVjdHVyZTo6Kj4ocHNmKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3tyZWludGVycHJldF9jYXN0IGZyb20gJ3ZvaWQgKHN0cnVjdHVyZTo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIHRvICdpbnQgc3RydWN0dXJlOjoqJyBpcyBub3QgYWxsb3dlZH19CiAKICAgLy8gQ2Fubm90IGNhc3QgZnJvbSBpbnRlZ2VycyB0byBtZW1iZXIgcG9pbnRlcnMsIG5vdCBldmVuIHRoZSBudWxsIHBvaW50ZXIKICAgLy8gbGl0ZXJhbC4KLSAgKHZvaWQpcmVpbnRlcnByZXRfY2FzdDx2b2lkIChzdHJ1Y3R1cmU6OiopKCk+KDApOyAvLyBleHBlY3RlZC1lcnJvciB7e3JlaW50ZXJwcmV0X2Nhc3QgZnJvbSAnaW50JyB0byAndm9pZCAoc3RydWN0dXJlOjoqKSgpJyBpcyBub3QgYWxsb3dlZH19CisgICh2b2lkKXJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAoc3RydWN0dXJlOjoqKSgpPigwKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3tyZWludGVycHJldF9jYXN0IGZyb20gJ2ludCcgdG8gJ3ZvaWQgKHN0cnVjdHVyZTo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIGlzIG5vdCBhbGxvd2VkfX0KICAgKHZvaWQpcmVpbnRlcnByZXRfY2FzdDxpbnQgc3RydWN0dXJlOjoqPigwKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tyZWludGVycHJldF9jYXN0IGZyb20gJ2ludCcgdG8gJ2ludCBzdHJ1Y3R1cmU6OionIGlzIG5vdCBhbGxvd2VkfX0KIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3JldHVybi1ub3JldHVybi5jcHAgYi90ZXN0L1NlbWFDWFgvcmV0dXJuLW5vcmV0dXJuLmNwcAppbmRleCA2MTdkZTAwLi4xNmJiODZjIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvcmV0dXJuLW5vcmV0dXJuLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvcmV0dXJuLW5vcmV0dXJuLmNwcApAQCAtNDAsNiArNDAsMTQgQEAKICAgICBzd2l0Y2ggKHgpIGRlZmF1bHQ6IEwxOiBMMjogY2FzZSA0OiB7IHByNjg4NF9hYm9ydF9zdHJ1Y3QoKTsgfQogICB9CiAKKyAgLy8gRklYTUU6IGRldGVjdCBub3JldHVybiBkZXN0cnVjdG9ycyB0cmlnZ2VyZWQgYnkgY2FsbHMgdG8gZGVsZXRlLgorICBpbnQgZjcoaW50IHgpIHsKKyAgICBzd2l0Y2ggKHgpIGRlZmF1bHQ6IEwxOiBMMjogY2FzZSA0OiB7CisgICAgICBwcjY4ODRfYWJvcnRfc3RydWN0ICpwID0gbmV3IHByNjg4NF9hYm9ydF9zdHJ1Y3QoKTsKKyAgICAgIGRlbGV0ZSBwOworICAgIH0KKyAgfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y29udHJvbCByZWFjaGVzIGVuZCBvZiBub24tdm9pZCBmdW5jdGlvbn19CisKICAgLy8gVGVzdCB0aGF0IHRoZXNlIGNvbnN0cnVjdHMgd29yayBldmVuIHdoZW4gZXh0cmFuZW91cyBibG9ja3MgYXJlIGNyZWF0ZWQKICAgLy8gYmVmb3JlIGFuZCBhZnRlciB0aGUgc3dpdGNoIGR1ZSB0byBpbXBsaWNpdCBkZXN0cnVjdG9ycy4KICAgaW50IGcxKGludCB4KSB7CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvcmV0dXJuLXN0YWNrLWFkZHIuY3BwIGIvdGVzdC9TZW1hQ1hYL3JldHVybi1zdGFjay1hZGRyLmNwcAppbmRleCBmYmJhZjgzLi43NjcwNzk4ZSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3JldHVybi1zdGFjay1hZGRyLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvcmV0dXJuLXN0YWNrLWFkZHIuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtc3RkPWMrKzExICVzCiAKIGludCogcmV0X2xvY2FsKCkgewogICBpbnQgeCA9IDE7CkBAIC0xMDgsNiArMTA4LDExIEBACiAgIHJldHVybiBjb25zdF9jYXN0PGludCo+KCZ4KTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3thZGRyZXNzIG9mIHN0YWNrIG1lbW9yeX19CiB9CiAKK3N0cnVjdCBBIHsgdmlydHVhbCB+QSgpOyB9OyBzdHJ1Y3QgQiA6IEEge307CitBKiByZXRfY3BwX2R5bmFtaWNfY2FzdChCIGIpIHsKKyAgcmV0dXJuIGR5bmFtaWNfY2FzdDxBKj4oJmIpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWRkcmVzcyBvZiBzdGFjayBtZW1vcnl9fQorfQorCiAvLyBQUiA3OTk5IC0gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgZmllbGQgaXMgaXRzZWxmIGEgcmVmZXJlbmNlLgogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBQUjc5OTkgewogICBQUjc5OTkoVCYgdCkgOiB2YWx1ZSh0KSB7fQpAQCAtMTM3LDUgKzE0MiwxNyBAQAogICB9CiB9CiAKLS8vIFRPRE86IHRlc3QgY2FzZSBmb3IgZHluYW1pY19jYXN0LiAgY2xhbmcgZG9lcyBub3QgeWV0IGhhdmUKLS8vIHN1cHBvcnQgZm9yIEMrKyBjbGFzc2VzIHRvIHdyaXRlIHN1Y2ggYSB0ZXN0IGNhc2UuCisvLyBEb24ndCB3YXJuIGFib3V0IHJldHVybmluZyBhIGxvY2FsIHZhcmlhYmxlIGZyb20gYSBzdXJyb3VuZGluZyBmdW5jdGlvbiBpZgorLy8gd2UncmUgd2l0aGluIGEgbGFtYmRhLWV4cHJlc3Npb24uCit2b2lkIHJldF9mcm9tX2xhbWJkYSgpIHsKKyAgaW50IGE7CisgIGludCAmYiA9IGE7CisgICh2b2lkKSBbJl0oKSAtPiBpbnQmIHsgcmV0dXJuIGE7IH07CisgICh2b2lkKSBbJl0oKSAtPiBpbnQmIHsgcmV0dXJuIGI7IH07CisgICh2b2lkKSBbPV0oKSBtdXRhYmxlIC0+IGludCYgeyByZXR1cm4gYTsgfTsKKyAgKHZvaWQpIFs9XSgpIG11dGFibGUgLT4gaW50JiB7IHJldHVybiBiOyB9OworICAodm9pZCkgWyZdKCkgLT4gaW50JiB7IGludCBhOyByZXR1cm4gYTsgfTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlZmVyZW5jZSB0byBzdGFja319CisgICh2b2lkKSBbPV0oKSAtPiBpbnQmIHsgaW50IGE7IHJldHVybiBhOyB9OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVmZXJlbmNlIHRvIHN0YWNrfX0KKyAgKHZvaWQpIFsmXSgpIC0+IGludCYgeyBpbnQgJmEgPSBiOyByZXR1cm4gYTsgfTsKKyAgKHZvaWQpIFs9XSgpIG11dGFibGUgLT4gaW50JiB7IGludCAmYSA9IGI7IHJldHVybiBhOyB9OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3JldHVybi5jcHAgYi90ZXN0L1NlbWFDWFgvcmV0dXJuLmNwcAppbmRleCA1ODBmMGE3Li45OGRiZDUxIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvcmV0dXJuLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvcmV0dXJuLmNwcApAQCAtMTAyLDMgKzEwMiwxMyBAQAogICAgIH0KICAgfTsKIH0KKworLy8gcmRhcjovLzE1MzY2NDk0CisvLyBwcjE3NzU5CituYW1lc3BhY2UgY3Rvcl9yZXR1cm5zX3ZvaWQgeworICB2b2lkIGYoKSB7fQorICBzdHJ1Y3QgUyB7IAorICAgIFMoKSB7IHJldHVybiBmKCk7IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7Y29uc3RydWN0b3IgJ1MnIG11c3Qgbm90IHJldHVybiB2b2lkIGV4cHJlc3Npb259fQorICAgIH5TKCkgeyByZXR1cm4gZigpOyB9IC8vIGV4cGVjdGVkLWVycm9yIHt7ZGVzdHJ1Y3RvciAnflMnIG11c3Qgbm90IHJldHVybiB2b2lkIGV4cHJlc3Npb259fQorICB9OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3J2YWwtcmVmZXJlbmNlcy1leGFtcGxlcy5jcHAgYi90ZXN0L1NlbWFDWFgvcnZhbC1yZWZlcmVuY2VzLWV4YW1wbGVzLmNwcAppbmRleCAxMTBhZTI2Li44YTViNTYyIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvcnZhbC1yZWZlcmVuY2VzLWV4YW1wbGVzLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvcnZhbC1yZWZlcmVuY2VzLWV4YW1wbGVzLmNwcApAQCAtNCw3ICs0LDcgQEAKIGNsYXNzIHVuaXF1ZV9wdHIgewogICBUICpwdHI7CiAKLSAgdW5pcXVlX3B0cihjb25zdCB1bmlxdWVfcHRyJikgPSBkZWxldGU7IC8vIGV4cGVjdGVkLW5vdGUgM3t7ZnVuY3Rpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVsZXRlZCBoZXJlfX0KKyAgdW5pcXVlX3B0cihjb25zdCB1bmlxdWVfcHRyJikgPSBkZWxldGU7IC8vIGV4cGVjdGVkLW5vdGUgM3t7J3VuaXF1ZV9wdHInIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlbGV0ZWQgaGVyZX19CiAgIHVuaXF1ZV9wdHIgJm9wZXJhdG9yPShjb25zdCB1bmlxdWVfcHRyJikgPSBkZWxldGU7IC8vIGV4cGVjdGVkLW5vdGV7e2NhbmRpZGF0ZSBmdW5jdGlvbiBoYXMgYmVlbiBleHBsaWNpdGx5IGRlbGV0ZWR9fQogcHVibGljOgogICB1bmlxdWVfcHRyKCkgOiBwdHIoMCkgeyB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvc2NvcGUtY2hlY2suY3BwIGIvdGVzdC9TZW1hQ1hYL3Njb3BlLWNoZWNrLmNwcAppbmRleCA5MGM5MzE3Li5jNWZkYjA5IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvc2NvcGUtY2hlY2suY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9zY29wZS1jaGVjay5jcHAKQEAgLTIyNiw3ICsyMjYsNyBAQAogICAgIHN0YXRpYyB2b2lkICppcHNbXSA9IHsgJiZsMCB9OwogICAgIGNvbnN0IEMgYzAgPSAxNzsKICAgbDA6IC8vIGV4cGVjdGVkLW5vdGUge3twb3NzaWJsZSB0YXJnZXQgb2YgaW5kaXJlY3QgZ290b319Ci0gICAgY29uc3QgQyAmYzEgPSA0MjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2p1bXAgZXhpdHMgc2NvcGUgb2YgdmFyaWFibGUgd2l0aCBub24tdHJpdmlhbCBkZXN0cnVjdG9yfX0KKyAgICBjb25zdCBDICZjMSA9IDQyOyAvLyBleHBlY3RlZC1ub3RlIHt7anVtcCBleGl0cyBzY29wZSBvZiBsaWZldGltZS1leHRlbmRlZCB0ZW1wb3Jhcnkgd2l0aCBub24tdHJpdmlhbCBkZXN0cnVjdG9yfX0KICAgICBjb25zdCBDICZjMiA9IGMwOwogICAgIGdvdG8gKmlwOyAvLyBleHBlY3RlZC1lcnJvciB7e2luZGlyZWN0IGdvdG8gbWlnaHQgY3Jvc3MgcHJvdGVjdGVkIHNjb3Blc319CiAgIH0KQEAgLTI0MSw3ICsyNDEsNyBAQAogICB2b2lkIGYodm9pZCAqKmlwKSB7CiAgICAgc3RhdGljIHZvaWQgKmlwc1tdID0geyAmJmwwIH07CiAgIGwwOiAvLyBleHBlY3RlZC1ub3RlIHt7cG9zc2libGUgdGFyZ2V0IG9mIGluZGlyZWN0IGdvdG99fQotICAgIGNvbnN0IGludCAmYzEgPSBDKDEpLmk7IC8vIGV4cGVjdGVkLW5vdGUge3tqdW1wIGV4aXRzIHNjb3BlIG9mIHZhcmlhYmxlIHdpdGggbm9uLXRyaXZpYWwgZGVzdHJ1Y3Rvcn19CisgICAgY29uc3QgaW50ICZjMSA9IEMoMSkuaTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2p1bXAgZXhpdHMgc2NvcGUgb2YgbGlmZXRpbWUtZXh0ZW5kZWQgdGVtcG9yYXJ5IHdpdGggbm9uLXRyaXZpYWwgZGVzdHJ1Y3Rvcn19CiAgICAgZ290byAqaXA7ICAvLyBleHBlY3RlZC1lcnJvciB7e2luZGlyZWN0IGdvdG8gbWlnaHQgY3Jvc3MgcHJvdGVjdGVkIHNjb3Blc319CiAgIH0KIH0KQEAgLTI5NSw2ICsyOTUsMTIwIEBACiB9CiAjZW5kaWYKIAorbmFtZXNwYWNlIHRlc3QxOCB7CisgIHN0cnVjdCBBIHsgfkEoKTsgfTsKKyAgc3RydWN0IEIgeyBjb25zdCBpbnQgJnI7IGNvbnN0IEEgJmE7IH07CisgIGludCBmKCkgeworICAgIHZvaWQgKnAgPSAmJng7CisgICAgY29uc3QgQSBhID0gQSgpOworICB4OgorICAgIEIgYiA9IHsgMCwgYSB9OyAvLyBvaworICAgIGdvdG8gKnA7CisgIH0KKyAgaW50IGcoKSB7CisgICAgdm9pZCAqcCA9ICYmeDsKKyAgeDogLy8gZXhwZWN0ZWQtbm90ZSB7e3Bvc3NpYmxlIHRhcmdldCBvZiBpbmRpcmVjdCBnb3RvfX0KKyAgICBCIGIgPSB7IDAsIEEoKSB9OyAvLyBleHBlY3RlZC1ub3RlIHt7anVtcCBleGl0cyBzY29wZSBvZiBsaWZldGltZS1leHRlbmRlZCB0ZW1wb3Jhcnkgd2l0aCBub24tdHJpdmlhbCBkZXN0cnVjdG9yfX0KKyAgICBnb3RvICpwOyAvLyBleHBlY3RlZC1lcnJvciB7e2luZGlyZWN0IGdvdG8gbWlnaHQgY3Jvc3MgcHJvdGVjdGVkIHNjb3Blc319CisgIH0KK30KKworI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKK25hbWVzcGFjZSBzdGQgeworICB0eXBlZGVmIGRlY2x0eXBlKHNpemVvZihpbnQpKSBzaXplX3Q7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBpbml0aWFsaXplcl9saXN0IHsKKyAgICBjb25zdCBUICpiZWdpbjsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpbml0aWFsaXplcl9saXN0KGNvbnN0IFQgKiwgc2l6ZV90KTsKKyAgfTsKK30KK25hbWVzcGFjZSB0ZXN0MTkgeworICBzdHJ1Y3QgQSB7IH5BKCk7IH07CisKKyAgaW50IGYoKSB7CisgICAgdm9pZCAqcCA9ICYmeDsKKyAgICBBIGE7CisgIHg6IC8vIGV4cGVjdGVkLW5vdGUge3twb3NzaWJsZSB0YXJnZXQgb2YgaW5kaXJlY3QgZ290b319CisgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEE+IGlsID0geyBhIH07IC8vIGV4cGVjdGVkLW5vdGUge3tqdW1wIGV4aXRzIHNjb3BlIG9mIGxpZmV0aW1lLWV4dGVuZGVkIHRlbXBvcmFyeSB3aXRoIG5vbi10cml2aWFsIGRlc3RydWN0b3J9fQorICAgIGdvdG8gKnA7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW5kaXJlY3QgZ290byBtaWdodCBjcm9zcyBwcm90ZWN0ZWQgc2NvcGVzfX0KKyAgfQorfQorCituYW1lc3BhY2UgdGVzdDIwIHsKKyAgc3RydWN0IEEgeyB+QSgpOyB9OworICBzdHJ1Y3QgQiB7CisgICAgY29uc3QgQSAmYTsKKyAgfTsKKworICBpbnQgZigpIHsKKyAgICB2b2lkICpwID0gJiZ4OworICAgIEEgYTsKKyAgeDoKKyAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Qj4gaWwgPSB7CisgICAgICBhLAorICAgICAgYQorICAgIH07CisgICAgZ290byAqcDsKKyAgfQorICBpbnQgZygpIHsKKyAgICB2b2lkICpwID0gJiZ4OworICAgIEEgYTsKKyAgeDogLy8gZXhwZWN0ZWQtbm90ZSB7e3Bvc3NpYmxlIHRhcmdldCBvZiBpbmRpcmVjdCBnb3RvfX0KKyAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Qj4gaWwgPSB7CisgICAgICBhLAorICAgICAgeyBBKCkgfSAvLyBleHBlY3RlZC1ub3RlIHt7anVtcCBleGl0cyBzY29wZSBvZiBsaWZldGltZS1leHRlbmRlZCB0ZW1wb3Jhcnkgd2l0aCBub24tdHJpdmlhbCBkZXN0cnVjdG9yfX0KKyAgICB9OworICAgIGdvdG8gKnA7IC8vIGV4cGVjdGVkLWVycm9yIHt7aW5kaXJlY3QgZ290byBtaWdodCBjcm9zcyBwcm90ZWN0ZWQgc2NvcGVzfX0KKyAgfQorfQorI2VuZGlmCisKK25hbWVzcGFjZSB0ZXN0MjEgeworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYoKSB7CisgIGdvdG8geDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcm90ZWN0ZWQgc2NvcGV9fQorICAgIFQgdDsgLy8gZXhwZWN0ZWQtbm90ZSB7e2J5cGFzc2VzfX0KKyB4OiByZXR1cm47CisgIH0KKworICB0ZW1wbGF0ZSB2b2lkIGY8aW50PigpOworICBzdHJ1Y3QgWCB7IH5YKCk7IH07CisgIHRlbXBsYXRlIHZvaWQgZjxYPigpOyAvLyBleHBlY3RlZC1ub3RlIHt7aW5zdGFudGlhdGlvbiBvZn19Cit9CisKK25hbWVzcGFjZSBQUjE4MjE3IHsKKyAgdHlwZWRlZiBpbnQgKlg7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGNsYXNzIE15Q2wgeworICAgIFQgbWVtOworICB9OworCisgIGNsYXNzIFNvdXJjZSB7CisgICAgTXlDbDxYPiBtOworICBwdWJsaWM6CisgICAgaW50IGdldEtpbmQoKSBjb25zdDsKKyAgfTsKKworICBib29sIGI7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFRUPgorICBzdGF0aWMgdm9pZCBmb28oY29uc3QgU291cmNlICZTRiwgTXlDbDxUVCAqPiBTb3VyY2U6OiptKSB7CisgICAgc3dpdGNoIChTRi5nZXRLaW5kKCkpIHsKKyAgICAgIGNhc2UgMTogcmV0dXJuOworICAgICAgY2FzZSAyOiBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgIGNhc2UgNDogcmV0dXJuOworICAgIH07CisgICAgaWYgKGIpIHsKKyAgICAgIGF1dG8gJnkgPSBjb25zdF9jYXN0PE15Q2w8VFQgKj4gJj4oU0YuKm0pOyAvLyBleHBlY3RlZC13YXJuaW5nIDAtMXt7ZXh0ZW5zaW9ufX0KKyAgICB9CisgIH0KKworICBpbnQgU291cmNlOjpnZXRLaW5kKCkgY29uc3QgeworICAgIGZvbygqdGhpcywgJlNvdXJjZTo6bSk7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKwogLy8gVGhpcyB0ZXN0IG11c3QgYmUgbGFzdCwgYmVjYXVzZSB0aGUgZXJyb3IgcHJvaGliaXRzIGZ1cnRoZXIganVtcCBkaWFnbm9zdGljcy4KIG5hbWVzcGFjZSB0ZXN0SW52YWxpZCB7CiBJbnZhbGlkIGludjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1bmtub3duIHR5cGUgbmFtZX19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvc291cmNlcmFuZ2VzLmNwcCBiL3Rlc3QvU2VtYUNYWC9zb3VyY2VyYW5nZXMuY3BwCmluZGV4IDFmMjVkNWIuLjliYTAwM2EgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9zb3VyY2VyYW5nZXMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC9zb3VyY2VyYW5nZXMuY3BwCkBAIC0xMiw3ICsxMiw3IEBACiB0eXBlZGVmIGludCBDOwogfQogCi0vLyBDSEVDSzogVmFyRGVjbCB7ezB4WzAtOWEtZkEtRl0rfX0gPGxpbmU6MTY6MSwgY29sOjM2PiBJbXBsaWNpdENvbnN0ckFycmF5ICdmb286OkEgWzJdJworLy8gQ0hFQ0s6IFZhckRlY2wge3sweFswLTlhLWZBLUZdK319IDxsaW5lOjE2OjEsIGNvbDozNj4gY29sOjE1IEltcGxpY2l0Q29uc3RyQXJyYXkgJ2Zvbzo6QSBbMl0nCiBzdGF0aWMgZm9vOjpBIEltcGxpY2l0Q29uc3RyQXJyYXlbMl07CiAKIGludCBtYWluKCkgewpAQCAtMjgsMyArMjgsMTIgQEAKICAgLy8gQ0hFQ0s6IENYWENvbnN0cnVjdEV4cHIge3sweFswLTlhLWZBLUZdK319IDxjb2w6MTAsIGNvbDoxNz4gJ2Zvbzo6QScKICAgcmV0dXJuIGZvbzo6QSgpOwogfQorCit2b2lkIGRlc3RydWN0KGZvbzo6QSAqYTEsIGZvbzo6QSAqYTIsIFA8aW50PiAqcDEpIHsKKyAgLy8gQ0hFQ0s6IE1lbWJlckV4cHIge3sweFswLTlhLWZBLUZdK319IDxjb2w6MywgY29sOjg+ICc8Ym91bmQgbWVtYmVyIGZ1bmN0aW9uIHR5cGU+JyAtPn5BCisgIGExLT5+QSgpOworICAvLyBDSEVDSzogTWVtYmVyRXhwciB7ezB4WzAtOWEtZkEtRl0rfX0gPGNvbDozLCBjb2w6MTY+ICc8Ym91bmQgbWVtYmVyIGZ1bmN0aW9uIHR5cGU+JyAtPn5BCisgIGEyLT5mb286OkE6On5BKCk7CisgIC8vIENIRUNLOiBNZW1iZXJFeHByIHt7MHhbMC05YS1mQS1GXSt9fSA8Y29sOjMsIGNvbDoxMz4gJzxib3VuZCBtZW1iZXIgZnVuY3Rpb24gdHlwZT4nIC0+flAKKyAgcDEtPn5QPGludD4oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC9zdGF0aWMtY2FzdC5jcHAgYi90ZXN0L1NlbWFDWFgvc3RhdGljLWNhc3QuY3BwCmluZGV4IDdmYjAxNmUuLjA2ZmQ4NjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC9zdGF0aWMtY2FzdC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3N0YXRpYy1jYXN0LmNwcApAQCAtOSw2ICs5LDggQEAKIHN0cnVjdCBHMSA6IHB1YmxpYyBCIHt9Owogc3RydWN0IEcyIDogcHVibGljIEIge307CiBzdHJ1Y3QgSCA6IHB1YmxpYyBHMSwgcHVibGljIEcyIHt9OyAvLyBBbWJpZ3VvdXMgcGF0aCB0byBCLgorc3RydWN0IEk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5jb21wbGV0ZS4KK3N0cnVjdCBKOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluY29tcGxldGUuCiAKIGVudW0gRW51bSB7IEVuMSwgRW4yIH07CiBlbnVtIE9ub20geyBPbjEsIE9uMiB9OwpAQCAtMTMxLDYgKzEzMyw3IEBACiAgIC8vIEJhZCBjb2RlIGJlbG93CiAgICh2b2lkKXN0YXRpY19jYXN0PGludCBBOjoqPigoaW50IEg6OiopMCk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YW1iaWd1b3VzIGNvbnZlcnNpb24gZnJvbSBwb2ludGVyIHRvIG1lbWJlciBvZiBkZXJpdmVkIGNsYXNzICdIJyB0byBwb2ludGVyIHRvIG1lbWJlciBvZiBiYXNlIGNsYXNzICdBJzp9fQogICAodm9pZClzdGF0aWNfY2FzdDxpbnQgQTo6Kj4oKGludCBGOjoqKTApOyAvLyBleHBlY3RlZC1lcnJvciB7e2NvbnZlcnNpb24gZnJvbSBwb2ludGVyIHRvIG1lbWJlciBvZiBjbGFzcyAnRicgdG8gcG9pbnRlciB0byBtZW1iZXIgb2YgY2xhc3MgJ0EnIHZpYSB2aXJ0dWFsIGJhc2UgJ0InIGlzIG5vdCBhbGxvd2VkfX0KKyAgKHZvaWQpc3RhdGljX2Nhc3Q8aW50IEk6Oio+KChpbnQgSjo6KikwKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tzdGF0aWNfY2FzdCBmcm9tICdpbnQgSjo6KicgdG8gJ2ludCBJOjoqJyBpcyBub3QgYWxsb3dlZH19CiB9CiAKIC8vIFBSIDUyNjEgLSBzdGF0aWNfY2FzdCBzaG91bGQgaW5zdGFudGlhdGUgdGVtcGxhdGUgaWYgcG9zc2libGUKQEAgLTE5Miw2ICsxOTUsNiBAQAogICAgICh2b2lkKXN0YXRpY19jYXN0PHZvaWQgKEE6OiopKCk+KCZCOjpmKTsKICAgICAodm9pZClzdGF0aWNfY2FzdDx2b2lkIChCOjoqKSgpPigmQjo6Zik7CiAgICAgKHZvaWQpc3RhdGljX2Nhc3Q8dm9pZCAoQzo6KikoKT4oJkI6OmYpOwotICAgICh2b2lkKXN0YXRpY19jYXN0PHZvaWQgKEQ6OiopKCk+KCZCOjpmKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2FkZHJlc3Mgb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbiAnZicgY2Fubm90IGJlIHN0YXRpY19jYXN0IHRvIHR5cGUgJ3ZvaWQgKFBSNjA3Mjo6RDo6KikoKSd9fQorICAgICh2b2lkKXN0YXRpY19jYXN0PHZvaWQgKEQ6OiopKCk+KCZCOjpmKTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e2FkZHJlc3Mgb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbiAnZicgY2Fubm90IGJlIHN0YXRpY19jYXN0IHRvIHR5cGUgJ3ZvaWQgKFBSNjA3Mjo6RDo6KikoKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nfX0KICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3N3aXRjaC1pbXBsaWNpdC1mYWxsdGhyb3VnaC5jcHAgYi90ZXN0L1NlbWFDWFgvc3dpdGNoLWltcGxpY2l0LWZhbGx0aHJvdWdoLmNwcAppbmRleCBkNzk1OTIzLi44MzEzMjRhIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvc3dpdGNoLWltcGxpY2l0LWZhbGx0aHJvdWdoLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvc3dpdGNoLWltcGxpY2l0LWZhbGx0aHJvdWdoLmNwcApAQCAtMjY1LDMgKzI2NSwxNiBAQAogICB9OwogfQogCituYW1lc3BhY2UgUFIxODk4MyB7CisgIHZvaWQgZmF0YWwoKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworICBpbnQgbnVtKCk7CisgIHZvaWQgdGVzdCgpIHsKKyAgICBzd2l0Y2ggKG51bSgpKSB7CisgICAgY2FzZSAxOgorICAgICAgZmF0YWwoKTsKKyAgICAgIC8vIERvbid0IGlzc3VlIGEgd2FybmluZy4KKyAgICBjYXNlIDI6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC90cmFpbGluZy1yZXR1cm4tMHguY3BwIGIvdGVzdC9TZW1hQ1hYL3RyYWlsaW5nLXJldHVybi0weC5jcHAKaW5kZXggZjdlMzQzMy4uY2Y1ZTY1OSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3RyYWlsaW5nLXJldHVybi0weC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3RyYWlsaW5nLXJldHVybi0weC5jcHAKQEAgLTE3LDcgKzE3LDkgQEAKICAgICByZXR1cm4gMDsKIH0KIAotYXV0byBnKCk7IC8vIGV4cGVjdGVkLWVycm9ye3tyZXR1cm4gd2l0aG91dCB0cmFpbGluZyByZXR1cm4gdHlwZX19CithdXRvIGcoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3JldHVybiB3aXRob3V0IHRyYWlsaW5nIHJldHVybiB0eXBlOyBkZWR1Y2VkIHJldHVybiB0eXBlcyBhcmUgYSBDKysxeSBleHRlbnNpb259fQorZGVjbHR5cGUoYXV0bykgZzIoKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXh0ZW5zaW9ufX0gZXhwZWN0ZWQtZXJyb3ItcmV7e3t7Xn19ZGVkdWNlZCByZXR1cm4gdHlwZXMgYXJlIGEgQysrMXkgZXh0ZW5zaW9ufX0KK2F1dG8gYmFkbmVzcyA9IGcyKCk7CiAKIGludCBoKCkgLT4gaW50OyAvLyBleHBlY3RlZC1lcnJvcnt7dHJhaWxpbmcgcmV0dXJuIHR5cGUgbXVzdCBzcGVjaWZ5IHJldHVybiB0eXBlICdhdXRvJywgbm90ICdpbnQnfX0KIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3R5cGUtZGVmaW5pdGlvbi1pbi1zcGVjaWZpZXIuY3BwIGIvdGVzdC9TZW1hQ1hYL3R5cGUtZGVmaW5pdGlvbi1pbi1zcGVjaWZpZXIuY3BwCmluZGV4IGE2MTRlNmMuLmJkYTkxZDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC90eXBlLWRlZmluaXRpb24taW4tc3BlY2lmaWVyLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvdHlwZS1kZWZpbml0aW9uLWluLXNwZWNpZmllci5jcHAKQEAgLTEzLDExICsxMywxMSBAQAogdm9pZCBmMCgpIHsKICAgdHlwZWRlZiBzdHJ1Y3QgUzEgeyBpbnQgeDsgfSBTMV90eXBlZGVmOwogCi0gICh2b2lkKSgoc3RydWN0IFMyIHsgaW50IHg7IH0qKTApOyAvLyBleHBlY3RlZC1lcnJvcnt7Y2FuIG5vdCBiZSBkZWZpbmVkfX0KKyAgKHZvaWQpKChzdHJ1Y3QgUzIgeyBpbnQgeDsgfSopMCk7IC8vIGV4cGVjdGVkLWVycm9ye3tjYW5ub3QgYmUgZGVmaW5lZH19CiAKICAgc3RydWN0IFMzIHsgaW50IHg7IH0gczM7CiAKLSAgKHZvaWQpc3RhdGljX2Nhc3Q8c3RydWN0IFM0IHsgaW50IHg7IH0gKj4oMCk7IC8vIGV4cGVjdGVkLWVycm9ye3tjYW4gbm90IGJlIGRlZmluZWR9fQorICAodm9pZClzdGF0aWNfY2FzdDxzdHJ1Y3QgUzQgeyBpbnQgeDsgfSAqPigwKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2Nhbm5vdCBiZSBkZWZpbmVkfX0KIH0KIAogc3RydWN0IFM1IHsgaW50IHg7IH0gZjEoKSB7IHJldHVybiBTNSgpOyB9IC8vIGV4cGVjdGVkLWVycm9ye3tyZXN1bHQgdHlwZX19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvdHlwZS10cmFpdHMuY3BwIGIvdGVzdC9TZW1hQ1hYL3R5cGUtdHJhaXRzLmNwcAppbmRleCAzZTQ3OTIxLi4yOGZiOGRjIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvdHlwZS10cmFpdHMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC90eXBlLXRyYWl0cy5jcHAKQEAgLTExMiw2ICsxMTIsMTQgQEAKIHN0cnVjdCBIYXNOb1Rocm93Q29uc3RydWN0b3JXaXRoQXJncyB7CiAgIEhhc05vVGhyb3dDb25zdHJ1Y3RvcldpdGhBcmdzKEhhc0NvbnMgaSA9IEhhc0NvbnMoMCkpIHRocm93KCk7CiB9Oworc3RydWN0IEhhc011bHRpcGxlRGVmYXVsdENvbnN0cnVjdG9yMSB7CisgIEhhc011bHRpcGxlRGVmYXVsdENvbnN0cnVjdG9yMSgpIHRocm93KCk7CisgIEhhc011bHRpcGxlRGVmYXVsdENvbnN0cnVjdG9yMShpbnQgaSA9IDApOworfTsKK3N0cnVjdCBIYXNNdWx0aXBsZURlZmF1bHRDb25zdHJ1Y3RvcjIgeworICBIYXNNdWx0aXBsZURlZmF1bHRDb25zdHJ1Y3RvcjIoaW50IGkgPSAwKTsKKyAgSGFzTXVsdGlwbGVEZWZhdWx0Q29uc3RydWN0b3IyKCkgdGhyb3coKTsKK307CiAKIHN0cnVjdCBIYXNOb1Rocm93Q29weSB7IEhhc05vVGhyb3dDb3B5KGNvbnN0IEhhc05vVGhyb3dDb3B5JikgdGhyb3coKTsgfTsKIHN0cnVjdCBIYXNNdWx0aXBsZUNvcHkgewpAQCAtMTQ3NSw2ICsxNDgzLDEwIEBACiAgIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfbW92ZV9hc3NpZ24oTm9EZWZhdWx0TW92ZUFzc2lnbkR1ZVRvVURDb3B5Q3RvcikpXTsgfQogICB7IGludCBhcnJbRihfX2hhc19ub3Rocm93X21vdmVfYXNzaWduKE5vRGVmYXVsdE1vdmVBc3NpZ25EdWVUb1VEQ29weUFzc2lnbikpXTsgfQogICB7IGludCBhcnJbRihfX2hhc19ub3Rocm93X21vdmVfYXNzaWduKE5vRGVmYXVsdE1vdmVBc3NpZ25EdWVUb0R0b3IpKV07IH0KKworCisgIHsgaW50IGFycltUKF9faXNfbm90aHJvd19hc3NpZ25hYmxlKEhhc05vVGhyb3dNb3ZlQXNzaWduLCBIYXNOb1Rocm93TW92ZUFzc2lnbikpXTsgfQorICB7IGludCBhcnJbRihfX2lzX25vdGhyb3dfYXNzaWduYWJsZShIYXNUaHJvd01vdmVBc3NpZ24sIEhhc1Rocm93TW92ZUFzc2lnbikpXTsgfQogfQogCiB2b2lkIGhhc190cml2aWFsX21vdmVfYXNzaWduKCkgewpAQCAtMTU2Miw2ICsxNTc0LDkgQEAKICAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19jb25zdHJ1Y3Rvcih2b2lkKSldOyB9CiAgIHsgaW50IGFycltGKF9faGFzX25vdGhyb3dfY29uc3RydWN0b3IoY3ZvaWQpKV07IH0KICAgeyBpbnQgYXJyW0YoX19oYXNfbm90aHJvd19jb25zdHJ1Y3RvcihIYXNUZW1wbGF0ZUNvbnMpKV07IH0KKworICB7IGludCBhcnJbRihfX2hhc19ub3Rocm93X2NvbnN0cnVjdG9yKEhhc011bHRpcGxlRGVmYXVsdENvbnN0cnVjdG9yMSkpXTsgfQorICB7IGludCBhcnJbRihfX2hhc19ub3Rocm93X2NvbnN0cnVjdG9yKEhhc011bHRpcGxlRGVmYXVsdENvbnN0cnVjdG9yMikpXTsgfQogfQogCiB2b2lkIGhhc192aXJ0dWFsX2Rlc3RydWN0b3IoKSB7CkBAIC0xOTMxLDYgKzE5NDYsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpdmlhbE1vdmVCdXROb3RDb3B5JiYpKSldOyB9CiB9CiAKK3ZvaWQgY29uc3RydWN0aWJsZV9jaGVja3MoKSB7CisgIHsgaW50IGFycltUKF9faXNfY29uc3RydWN0aWJsZShIYXNOb1Rocm93Q29uc3RydWN0b3JXaXRoQXJncykpXTsgfQorICB7IGludCBhcnJbRihfX2lzX25vdGhyb3dfY29uc3RydWN0aWJsZShIYXNOb1Rocm93Q29uc3RydWN0b3JXaXRoQXJncykpXTsgfSAvLyBNU1ZDIGRvZXNuJ3QgbG9vayBpbnRvIGRlZmF1bHQgYXJncyBhbmQgZ2V0cyB0aGlzIHdyb25nLgorCisgIHsgaW50IGFycltUKF9faXNfY29uc3RydWN0aWJsZShIYXNOb1Rocm93Q29uc3RydWN0b3JXaXRoQXJncywgSGFzQ29ucykpXTsgfQorICB7IGludCBhcnJbVChfX2lzX25vdGhyb3dfY29uc3RydWN0aWJsZShIYXNOb1Rocm93Q29uc3RydWN0b3JXaXRoQXJncywgSGFzQ29ucykpXTsgfQorCisgIHsgaW50IGFycltUKF9faXNfY29uc3RydWN0aWJsZShOb25Ucml2aWFsRGVmYXVsdCkpXTsgfQorICB7IGludCBhcnJbRihfX2lzX25vdGhyb3dfY29uc3RydWN0aWJsZShOb25Ucml2aWFsRGVmYXVsdCkpXTsgfQorCisgIHsgaW50IGFycltUKF9faXNfY29uc3RydWN0aWJsZShpbnQpKV07IH0KKyAgeyBpbnQgYXJyW1QoX19pc19ub3Rocm93X2NvbnN0cnVjdGlibGUoaW50KSldOyB9CisKKyAgeyBpbnQgYXJyW0YoX19pc19jb25zdHJ1Y3RpYmxlKE5vblBPRCkpXTsgfQorICB7IGludCBhcnJbRihfX2lzX25vdGhyb3dfY29uc3RydWN0aWJsZShOb25QT0QpKV07IH0KKworICB7IGludCBhcnJbVChfX2lzX2NvbnN0cnVjdGlibGUoTm9uUE9ELCBpbnQpKV07IH0KKyAgeyBpbnQgYXJyW0YoX19pc19ub3Rocm93X2NvbnN0cnVjdGlibGUoTm9uUE9ELCBpbnQpKV07IH0KK30KKwogLy8gSW5zdGFudGlhdGlvbiBvZiBfX2lzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlCiB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgogc3RydWN0IGlzX3RyaXZpYWxseV9jb25zdHJ1Y3RpYmxlIHsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC90eXBlaWQtcmVmLmNwcCBiL3Rlc3QvU2VtYUNYWC90eXBlaWQtcmVmLmNwcAppbmRleCBkMDFmZDMxLi43ZTVkYmRkIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvdHlwZWlkLXJlZi5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3R5cGVpZC1yZWYuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1lbWl0LWxsdm0gLW8gLSAlcyB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gJXMgfCBGaWxlQ2hlY2sgJXMKIG5hbWVzcGFjZSBzdGQgewogICBjbGFzcyB0eXBlX2luZm87CiB9CkBAIC03LDYgKzcsNiBAQAogCiB2b2lkIGYoKSB7CiAgIC8vIENIRUNLOiBAX1pUUzFYID0gbGlua29uY2Vfb2RyIGNvbnN0YW50Ci0gIC8vIENIRUNLOiBAX1pUSTFYID0gbGlua29uY2Vfb2RyIHVubmFtZWRfYWRkciBjb25zdGFudCAKKyAgLy8gQ0hFQ0s6IEBfWlRJMVggPSBsaW5rb25jZV9vZHIgY29uc3RhbnQgCiAgICh2b2lkKXR5cGVpZChYJik7CiB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvdHlwZXNfY29tcGF0aWJsZV9wLmNwcCBiL3Rlc3QvU2VtYUNYWC90eXBlc19jb21wYXRpYmxlX3AuY3BwCmluZGV4IDRhYTlhMWMuLmViZmY1M2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC90eXBlc19jb21wYXRpYmxlX3AuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC90eXBlc19jb21wYXRpYmxlX3AuY3BwCkBAIC0xLDUgKzEsOCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAteCBjKysgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC14IGMgJXMKIAotYm9vbCBmKCkgewotICByZXR1cm4gX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcChpbnQsIGNvbnN0IGludCk7IC8vIGV4cGVjdGVkLWVycm9ye3tDKyt9fQorLy8gVGVzdCB0aGF0IEdOVSBDIGV4dGVuc2lvbiBfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wKCkgaXMgbm90IGF2YWlsYWJsZSBpbiBDKysgbW9kZS4KKworaW50IGYoKSB7CisgIHJldHVybiBfX2J1aWx0aW5fdHlwZXNfY29tcGF0aWJsZV9wKGludCwgY29uc3QgaW50KTsgLy8gZXhwZWN0ZWQtZXJyb3J7e319CiB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvdHlwby1jb3JyZWN0aW9uLXB0Mi5jcHAgYi90ZXN0L1NlbWFDWFgvdHlwby1jb3JyZWN0aW9uLXB0Mi5jcHAKaW5kZXggNTI1ZDExYi4uOTk0M2RkMiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3R5cG8tY29ycmVjdGlvbi1wdDIuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC90eXBvLWNvcnJlY3Rpb24tcHQyLmNwcApAQCAtNyw4ICs3LDggQEAKIAogbmFtZXNwYWNlIGJvZ3VzX2tleXdvcmRfc3VnZ2VzdGlvbiB7CiB2b2lkIHRlc3QoKSB7Ci0gICBzdGF0dXMgPSAiT0siOyAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdzdGF0dXMnJH19Ci0gICByZXR1cm4gc3RhdHVzOyAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdzdGF0dXMnJH19CisgICBzdGF0dXMgPSAiT0siOyAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdzdGF0dXMne3skfX19fQorICAgcmV0dXJuIHN0YXR1czsgIC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7dXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllciAnc3RhdHVzJ3t7JH19fX0KICB9CiB9CiAKQEAgLTMzLDcgKzMzLDcgQEAKIH07CiAvLyBzaG91bGQgYmUgdm9pZCBUOjpmKCk7CiB2b2lkIGYoKSB7Ci0gZGF0YV9zdHJ1Y3QtPmZvbygpOyAgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ2RhdGFfc3RydWN0JyR9fQorIGRhdGFfc3RydWN0LT5mb28oKTsgIC8vIGV4cGVjdGVkLWVycm9yLXJle3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdkYXRhX3N0cnVjdCd7eyR9fX19CiB9CiAKIG5hbWVzcGFjZSBQUjEyMjg3IHsKQEAgLTExNiw5ICsxMTYsOSBAQAogdm9pZCB0ZXN0QWNjZXNzKCkgewogICBGaWd1cmUgb2JqOwogICBzd2l0Y2ggKG9iai50eXBlKCkpIHsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tlbnVtZXJhdGlvbiB2YWx1ZXMgJ1NRVUFSRScsICdUUklBTkdMRScsIGFuZCAnQ0lSQ0xFJyBub3QgaGFuZGxlZCBpbiBzd2l0Y2h9fQotICBjYXNlIFNRVUFSRTogIC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7dXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllciAnU1FVQVJFJyR9fQotICBjYXNlIFRSSUFOR0xFOiAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdUUklBTkdMRSckfX0KLSAgY2FzZSBDSVJDRTogIC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7dXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllciAnQ0lSQ0UnJH19CisgIGNhc2UgU1FVQVJFOiAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdTUVVBUkUne3skfX19fQorICBjYXNlIFRSSUFOR0xFOiAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdUUklBTkdMRSd7eyR9fX19CisgIGNhc2UgQ0lSQ0U6ICAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ0NJUkNFJ3t7JH19fX0KICAgICBicmVhazsKICAgfQogfQpAQCAtMTI2LDEzICsxMjYsMTMgQEAKIAogbG9uZyByZWFkbGluZShjb25zdCBjaGFyICosIGNoYXIgKiwgdW5zaWduZWQgbG9uZyk7CiB2b2lkIGFzc2lnbl90b191bmtub3duX3ZhcigpIHsKLSAgICBkZWFkbGluZV8gPSAxOyAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdkZWFkbGluZV8nJH19CisgICAgZGVhZGxpbmVfID0gMTsgIC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7dXNlIG9mIHVuZGVjbGFyZWQgaWRlbnRpZmllciAnZGVhZGxpbmVfJ3t7JH19fX0KIH0KIAogbmFtZXNwYWNlIG5vX25zX2JlZm9yZV9kb3QgewogbmFtZXNwYWNlIHJlMiB7fQogdm9pZCB0ZXN0KCkgewotICAgIHJlcS5zZXRfY2hlY2soZmFsc2UpOyAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdyZXEnJH19CisgICAgcmVxLnNldF9jaGVjayhmYWxzZSk7ICAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ3JlcSd7eyR9fX19CiB9CiB9CiAKQEAgLTE5OSwzICsxOTksNjAgQEAKIFBSMTgyMTM6OldyYXBwZXJJbmZvIDo6UFIxODIxMzo6V3JhcHBhYmxlPGludD46OmtXcmFwcGVySW5mbyA9IHsgMCB9OyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtZW1iZXIgbmFtZWQgJ1BSMTgyMTMnIGluICdQUjE4MjEzOjpXcmFwcGVySW5mbyc7IGRpZCB5b3UgbWVhbiBzaW1wbHkgJ1BSMTgyMTMnP319IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tDKysgcmVxdWlyZXMgYSB0eXBlIHNwZWNpZmllciBmb3IgYWxsIGRlY2xhcmF0aW9uc319CiB9CisKK25hbWVzcGFjZSBQUjE4NjUxIHsKK3N0cnVjdCB7CisgIGludCB4OworfSBhLCBiOworCitpbnQgeSA9IHg7ICAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ3gne3skfX19fQorfQorCituYW1lc3BhY2UgUFIxODY4NSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQywgaW50IEksIGludCBKPgorY2xhc3MgU2V0VmVjdG9yIHsKKyBwdWJsaWM6CisgIFNldFZlY3RvcigpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQywgaW50IEk+CitjbGFzcyBTbWFsbFNldFZlY3RvciA6IHB1YmxpYyBTZXRWZWN0b3I8QywgSSwgOD4ge307CisKK2NsYXNzIGZvbyB7fTsKK1NtYWxsU2V0VmVjdG9yPGZvbyosIDI+IGZvb1NldDsKK30KKworUFIxODY4NTo6Qml0VmVjdG9yIE1hcDsgIC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7bm8gdHlwZSBuYW1lZCAnQml0VmVjdG9yJyBpbiBuYW1lc3BhY2UgJ1BSMTg2ODUne3skfX19fQorCituYW1lc3BhY2Ugc2hhZG93ZWRfdGVtcGxhdGUgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEZpemJpbiB7fTsgIC8vIGV4cGVjdGVkLW5vdGUge3snOjpzaGFkb3dlZF90ZW1wbGF0ZTo6Rml6YmluJyBkZWNsYXJlZCBoZXJlfX0KK2NsYXNzIEJheiB7CisgICBpbnQgRml6YmluKCk7CisgICAvLyBUT0RPOiBUZWFjaCB0aGUgcGFyc2VyIHRvIHJlY292ZXIgZnJvbSB0aGUgdHlwbyBjb3JyZWN0aW9uIGluc3RlYWQgb2YKKyAgIC8vIGNvbnRpbnVpbmcgdG8gdHJlYXQgdGhlIHRlbXBsYXRlIG5hbWUgYXMgYW4gaW1wbGljaXQtaW50IGRlY2xhcmF0aW9uLgorICAgRml6YmluPGludD4gcXV4OyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1bmtub3duIHR5cGUgbmFtZSAnRml6YmluJzsgZGlkIHlvdSBtZWFuICc6OnNoYWRvd2VkX3RlbXBsYXRlOjpGaXpiaW4nP319IFwKKyAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgbWVtYmVyIG5hbWUgb3IgJzsnIGFmdGVyIGRlY2xhcmF0aW9uIHNwZWNpZmllcnN9fQorfTsKK30KKworbmFtZXNwYWNlIFBSMTg4NTIgewordm9pZCBmdW5jKCkgeworICBzdHJ1Y3QgZm9vIHsKKyAgICB2b2lkIGJhcigpIHt9CisgIH07CisgIGJhcigpOyAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdiYXIne3skfX19fQorfQorfQorCituYW1lc3BhY2Ugc3RkIHsKK2NsYXNzIGJlcm5vdWxsaV9kaXN0cmlidXRpb24geworIHB1YmxpYzoKKyAgZG91YmxlIHAoKSBjb25zdDsKK307Cit9Cit2b2lkIHRlc3QoKSB7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IHR5cG8gY29ycmVjdGlvbiBkb2Vzbid0IHN1Z2dlc3QgY2hhbmdpbmcgJ3AnIHRvCisgIC8vICdzdGQ6OmJlcm5vdWxsaV9kaXN0cmlidXRpb246OnAnIGFzIHRoYXQgaXMgbW9zdCBsaWtlbHkgd3JvbmcuCisgIGlmIChwKSAgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdwJ3t7JH19fX0KKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvdHlwby1jb3JyZWN0aW9uLmNwcCBiL3Rlc3QvU2VtYUNYWC90eXBvLWNvcnJlY3Rpb24uY3BwCmluZGV4IDQwNDdlNmEuLjg1NDEzNTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC90eXBvLWNvcnJlY3Rpb24uY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC90eXBvLWNvcnJlY3Rpb24uY3BwCkBAIC0yODIsMTMgKzI4MiwxMyBAQAogbmFtZXNwYWNlIGI2OTU2ODA5X3Rlc3QyIHsKICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEVyciB7IHR5cGVuYW1lIFQ6OmVycm9yIG47IH07ICAvLyBleHBlY3RlZC1lcnJvcnt7dHlwZSAndm9pZCAqJyBjYW5ub3QgYmUgdXNlZCBwcmlvciB0byAnOjonIGJlY2F1c2UgaXQgaGFzIG5vIG1lbWJlcnN9fQogICBzdHJ1Y3QgUyB7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdHlwZW5hbWUgRXJyPFQ+Ojp0eXBlIG1ldGhvZChUKTsgIC8vIGV4cGVjdGVkLW5vdGV7e2luIGluc3RhbnRpYXRpb24gb2YgdGVtcGxhdGUgY2xhc3MgJ2I2OTU2ODA5X3Rlc3QyOjpFcnI8dm9pZCAqPicgcmVxdWVzdGVkIGhlcmV9fSAgZXhwZWN0ZWQtbm90ZXt7d2hpbGUgc3Vic3RpdHV0aW5nIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnRzIGludG8gZnVuY3Rpb24gdGVtcGxhdGUgJ21ldGhvZCcgW3dpdGggVCA9IHZvaWQgKl19fQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHR5cGVuYW1lIEVycjxUPjo6dHlwZSBtZXRob2QoVCk7ICAvLyBleHBlY3RlZC1ub3Rle3tpbiBpbnN0YW50aWF0aW9uIG9mIHRlbXBsYXRlIGNsYXNzICdiNjk1NjgwOV90ZXN0Mjo6RXJyPHZvaWQgKj4nIHJlcXVlc3RlZCBoZXJlfX0KICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgbWV0aG9kKFQgKik7CiAgIH07CiAKICAgdm9pZCB0ZXN0KCkgewogICAgIFMgczsKLSAgICBpbnQgayA9IHMubWV0aG9kZCgodm9pZCopMCk7ICAvLyBleHBlY3RlZC1lcnJvcnt7bm8gbWVtYmVyIG5hbWVkICdtZXRob2RkJyBpbiAnYjY5NTY4MDlfdGVzdDI6OlMnOyBkaWQgeW91IG1lYW4gJ21ldGhvZCc/fX0KKyAgICBpbnQgayA9IHMubWV0aG9kZCgodm9pZCopMCk7ICAvLyBleHBlY3RlZC1lcnJvcnt7bm8gbWVtYmVyIG5hbWVkICdtZXRob2RkJyBpbiAnYjY5NTY4MDlfdGVzdDI6OlMnOyBkaWQgeW91IG1lYW4gJ21ldGhvZCc/fX0gZXhwZWN0ZWQtbm90ZXt7d2hpbGUgc3Vic3RpdHV0aW5nIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnRzIGludG8gZnVuY3Rpb24gdGVtcGxhdGUgJ21ldGhvZCcgW3dpdGggVCA9IHZvaWQgKl19fQogICB9CiB9CiAKQEAgLTI5OSw2ICsyOTksNiBAQAogaW50IGZsaWJiZXJkeSgpOyAgLy8gZXhwZWN0ZWQtbm90ZXt7J2ZsaWJiZXJkeScgZGVjbGFyZWQgaGVyZX19CiBpbnQgbm9fY29ycmVjdGlvbigpIHsKICAgcmV0dXJuIGhpYmJlcmR5KCkgKyAgLy8gZXhwZWN0ZWQtZXJyb3J7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ2hpYmJlcmR5JzsgZGlkIHlvdSBtZWFuICdmbGliYmVyZHknP319Ci0gICAgICAgICBnaWJiZXJkeSgpOyAgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ2dpYmJlcmR5JyR9fQorICAgICAgICAgZ2liYmVyZHkoKTsgIC8vIGV4cGVjdGVkLWVycm9yLXJle3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdnaWJiZXJkeSd7eyR9fX19CiB9OwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3VuZGVmaW5lZC1pbnRlcm5hbC5jcHAgYi90ZXN0L1NlbWFDWFgvdW5kZWZpbmVkLWludGVybmFsLmNwcAppbmRleCAxYjc2YTg2Li4xY2IwNzA4IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvdW5kZWZpbmVkLWludGVybmFsLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvdW5kZWZpbmVkLWludGVybmFsLmNwcApAQCAtMSw3ICsxLDEwIEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCiAKIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBwcm9kdWNlIGludmFsaWQgSVIuCi0vLyBSVU46ICVjbGFuZ19jYzEgLWVtaXQtbGx2bS1vbmx5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1lbWl0LWxsdm0tb25seSAlcworCisvLyBGSVhNRTogSXRhbml1bSBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5OyB0aGUgdGVzdCBzaG91bGQgcGFzcworLy8gaW4gTVMgbW9kZSB0b28uCiAKIG5hbWVzcGFjZSB0ZXN0MSB7CiAgIHN0YXRpYyB2b2lkIGZvbygpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3QxOjpmb28nIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19CkBAIC0xNSw5ICsxOCw5IEBACiAKIG5hbWVzcGFjZSB0ZXN0MiB7CiAgIG5hbWVzcGFjZSB7Ci0gICAgdm9pZCBmb28oKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0Mjo6PGFub255bW91cyBuYW1lc3BhY2U+Ojpmb28nIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19Ci0gICAgZXh0ZXJuIGludCB2YXI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t2YXJpYWJsZSAndGVzdDI6Ojxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6dmFyJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQotICAgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGJhcigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3QyOjo8YW5vbnltb3VzIG5hbWVzcGFjZT46OmJhcjxpbnQ+JyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQorICAgIHZvaWQgZm9vKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiAndGVzdDI6Oihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6Zm9vJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQorICAgIGV4dGVybiBpbnQgdmFyOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dmFyaWFibGUgJ3Rlc3QyOjooYW5vbnltb3VzIG5hbWVzcGFjZSk6OnZhcicgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBiYXIoKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0Mjo6KGFub255bW91cyBuYW1lc3BhY2UpOjpiYXI8aW50PicgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KICAgfQogICB2b2lkIHRlc3QoKSB7CiAgICAgZm9vKCk7IC8vIGV4cGVjdGVkLW5vdGUge3t1c2VkIGhlcmV9fQpAQCAtNDksMTEgKzUyLDExIEBACiBuYW1lc3BhY2UgdGVzdDQgewogICBuYW1lc3BhY2UgewogICAgIHN0cnVjdCBBIHsKLSAgICAgIEEoKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0NDo6PGFub255bW91cyBuYW1lc3BhY2U+OjpBOjpBJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQotICAgICAgfkEoKTsvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3Q0Ojo8YW5vbnltb3VzIG5hbWVzcGFjZT46OkE6On5BJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQotICAgICAgdmlydHVhbCB2b2lkIGZvbygpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3Q0Ojo8YW5vbnltb3VzIG5hbWVzcGFjZT46OkE6OmZvbycgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KKyAgICAgIEEoKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0NDo6KGFub255bW91cyBuYW1lc3BhY2UpOjpBOjpBJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQorICAgICAgfkEoKTsvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3Q0OjooYW5vbnltb3VzIG5hbWVzcGFjZSk6OkE6On5BJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQorICAgICAgdmlydHVhbCB2b2lkIGZvbygpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3Q0OjooYW5vbnltb3VzIG5hbWVzcGFjZSk6OkE6OmZvbycgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KICAgICAgIHZpcnR1YWwgdm9pZCBiYXIoKSA9IDA7Ci0gICAgICB2aXJ0dWFsIHZvaWQgYmF6KCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiAndGVzdDQ6Ojxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6QTo6YmF6JyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQorICAgICAgdmlydHVhbCB2b2lkIGJheigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3Q0OjooYW5vbnltb3VzIG5hbWVzcGFjZSk6OkE6OmJheicgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KICAgICB9OwogICB9CiAKQEAgLTc1LDggKzc4LDggQEAKICAgfQogCiAgIHRlbXBsYXRlIDxjbGFzcyBOPiBzdHJ1Y3QgQiB7Ci0gICAgc3RhdGljIGludCB2YXI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t2YXJpYWJsZSAndGVzdDU6OkI8dGVzdDU6Ojxhbm9ueW1vdXM+OjpBPjo6dmFyJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQotICAgIHN0YXRpYyB2b2lkIGZvbygpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3Q1OjpCPHRlc3Q1Ojo8YW5vbnltb3VzPjo6QT46OmZvbycgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KKyAgICBzdGF0aWMgaW50IHZhcjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3ZhcmlhYmxlICd0ZXN0NTo6Qjx0ZXN0NTo6KGFub255bW91cyBuYW1lc3BhY2UpOjpBPjo6dmFyJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQorICAgIHN0YXRpYyB2b2lkIGZvbygpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3Q1OjpCPHRlc3Q1OjooYW5vbnltb3VzIG5hbWVzcGFjZSk6OkE+Ojpmb28nIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19CiAgIH07CiAKICAgdm9pZCB0ZXN0KCkgewpAQCAtMTc1LDcgKzE3OCw3IEBACiBuYW1lc3BhY2UgT3ZlcmxvYWRVc2UgewogICBuYW1lc3BhY2UgewogICAgIHZvaWQgZigpOwotICAgIHZvaWQgZihpbnQpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ092ZXJsb2FkVXNlOjo8YW5vbnltb3VzIG5hbWVzcGFjZT46OmYnIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19CisgICAgdm9pZCBmKGludCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiAnT3ZlcmxvYWRVc2U6Oihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6ZicgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KICAgfQogICB0ZW1wbGF0ZTx2b2lkIHgoKT4gdm9pZCB0KGludCopIHsgeCgpOyB9CiAgIHRlbXBsYXRlPHZvaWQgeChpbnQpPiB2b2lkIHQobG9uZyopIHsgeCgxMCk7IH0gLy8gZXhwZWN0ZWQtbm90ZSB7e3VzZWQgaGVyZX19CkBAIC0xOTMsNyArMTk2LDcgQEAKIAogbmFtZXNwYWNlIHRlc3Q4IHsKICAgdHlwZWRlZiBzdHJ1Y3QgewotICAgIHZvaWQgYmFyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiAndGVzdDg6Ojxhbm9ueW1vdXMgc3RydWN0Pjo6YmFyJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQorICAgIHZvaWQgYmFyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiAndGVzdDg6Oihhbm9ueW1vdXMgc3RydWN0KTo6YmFyJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQogICAgIHZvaWQgZm9vKCkgewogICAgICAgYmFyKCk7IC8vIGV4cGVjdGVkLW5vdGUge3t1c2VkIGhlcmV9fQogICAgIH0KQEAgLTIwNCw3ICsyMDcsNyBAQAogICBuYW1lc3BhY2UgewogICAgIHN0cnVjdCBYIHsKICAgICAgIHZpcnR1YWwgdm9pZCBub3R1c2VkKCkgPSAwOwotICAgICAgdmlydHVhbCB2b2lkIHVzZWQoKSA9IDA7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiAndGVzdDk6Ojxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6WDo6dXNlZCcgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KKyAgICAgIHZpcnR1YWwgdm9pZCB1c2VkKCkgPSAwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3Q5OjooYW5vbnltb3VzIG5hbWVzcGFjZSk6Olg6OnVzZWQnIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19CiAgICAgfTsKICAgfQogICB2b2lkIHRlc3QoWCAmeCkgewpAQCAtMjE3LDcgKzIyMCw3IEBACiAgIG5hbWVzcGFjZSB7CiAgICAgc3RydWN0IFggewogICAgICAgdmlydHVhbCB2b2lkIG5vdHVzZWQoKSA9IDA7Ci0gICAgICB2aXJ0dWFsIHZvaWQgdXNlZCgpID0gMDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0MTA6Ojxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6WDo6dXNlZCcgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KKyAgICAgIHZpcnR1YWwgdm9pZCB1c2VkKCkgPSAwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3QxMDo6KGFub255bW91cyBuYW1lc3BhY2UpOjpYOjp1c2VkJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQogCiAgICAgICB2b2lkIHRlc3QoKSB7CiAgICAgICAgIG5vdHVzZWQoKTsKQEAgLTI0NCwxMSArMjQ3LDExIEBACiAgICAgfTsKIAogICAgIHN0cnVjdCBCIHsKLSAgICAgIGJvb2wgb3BlcmF0b3IoKSgpIGNvbnN0OyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0MTE6Ojxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6Qjo6b3BlcmF0b3IoKScgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KLSAgICAgIHZvaWQgb3BlcmF0b3IhKCkgY29uc3Q7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3QxMTo6PGFub255bW91cyBuYW1lc3BhY2U+OjpCOjpvcGVyYXRvciEnIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19Ci0gICAgICBib29sIG9wZXJhdG9yKyhjb25zdCBCJikgY29uc3Q7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3QxMTo6PGFub255bW91cyBuYW1lc3BhY2U+OjpCOjpvcGVyYXRvcisnIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19Ci0gICAgICBpbnQgb3BlcmF0b3JbXShpbnQpIGNvbnN0OyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0MTE6Ojxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6Qjo6b3BlcmF0b3JbXScgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KLSAgICAgIGNvbnN0IEIqIG9wZXJhdG9yLT4oKSBjb25zdDsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiAndGVzdDExOjo8YW5vbnltb3VzIG5hbWVzcGFjZT46OkI6Om9wZXJhdG9yLT4nIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19CisgICAgICBib29sIG9wZXJhdG9yKCkoKSBjb25zdDsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiAndGVzdDExOjooYW5vbnltb3VzIG5hbWVzcGFjZSk6OkI6Om9wZXJhdG9yKCknIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19CisgICAgICB2b2lkIG9wZXJhdG9yISgpIGNvbnN0OyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0MTE6Oihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6Qjo6b3BlcmF0b3IhJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQorICAgICAgYm9vbCBvcGVyYXRvcisoY29uc3QgQiYpIGNvbnN0OyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0MTE6Oihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6Qjo6b3BlcmF0b3IrJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQorICAgICAgaW50IG9wZXJhdG9yW10oaW50KSBjb25zdDsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiAndGVzdDExOjooYW5vbnltb3VzIG5hbWVzcGFjZSk6OkI6Om9wZXJhdG9yW10nIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19CisgICAgICBjb25zdCBCKiBvcGVyYXRvci0+KCkgY29uc3Q7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3QxMTo6KGFub255bW91cyBuYW1lc3BhY2UpOjpCOjpvcGVyYXRvci0+JyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQogICAgICAgaW50IG1lbWJlcjsKICAgICB9OwogICB9CkBAIC0yNzgsMTggKzI4MSwxOCBAQAogICAgIHN0cnVjdCBDbHMgewogICAgICAgdmlydHVhbCB2b2lkIGYoaW50KSA9IDA7CiAgICAgICB2aXJ0dWFsIHZvaWQgZihpbnQsIGRvdWJsZSkgPSAwOwotICAgICAgdm9pZCBnKGludCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3QxMjo6PGFub255bW91cyBuYW1lc3BhY2U+OjpDbHM6OmcnIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19CisgICAgICB2b2lkIGcoaW50KTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiAndGVzdDEyOjooYW5vbnltb3VzIG5hbWVzcGFjZSk6OkNsczo6ZycgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KICAgICAgIHZvaWQgZyhpbnQsIGRvdWJsZSk7CiAgICAgICB2aXJ0dWFsIG9wZXJhdG9yIFQxKCkgPSAwOwogICAgICAgdmlydHVhbCBvcGVyYXRvciBUMigpID0gMDsKICAgICAgIHZpcnR1YWwgb3BlcmF0b3IgVDMmKCkgPSAwOwotICAgICAgb3BlcmF0b3IgVDQoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmdW5jdGlvbiAndGVzdDEyOjo8YW5vbnltb3VzIG5hbWVzcGFjZT46OkNsczo6b3BlcmF0b3IgVDQnIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19Ci0gICAgICBvcGVyYXRvciBUNSgpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0MTI6Ojxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6Q2xzOjpvcGVyYXRvciBUNScgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KLSAgICAgIG9wZXJhdG9yIFQ2JigpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0MTI6Ojxhbm9ueW1vdXMgbmFtZXNwYWNlPjo6Q2xzOjpvcGVyYXRvciBjbGFzcyB0ZXN0MTI6OlQ2ICYnIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGJ1dCBpcyBub3QgZGVmaW5lZH19CisgICAgICBvcGVyYXRvciBUNCgpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Z1bmN0aW9uICd0ZXN0MTI6Oihhbm9ueW1vdXMgbmFtZXNwYWNlKTo6Q2xzOjpvcGVyYXRvciBUNCcgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KKyAgICAgIG9wZXJhdG9yIFQ1KCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3QxMjo6KGFub255bW91cyBuYW1lc3BhY2UpOjpDbHM6Om9wZXJhdG9yIFQ1JyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQorICAgICAgb3BlcmF0b3IgVDYmKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3QxMjo6KGFub255bW91cyBuYW1lc3BhY2UpOjpDbHM6Om9wZXJhdG9yIHRlc3QxMjo6VDYgJicgaGFzIGludGVybmFsIGxpbmthZ2UgYnV0IGlzIG5vdCBkZWZpbmVkfX0KICAgICB9OwogCiAgICAgc3RydWN0IENsczIgewotICAgICAgQ2xzMihUNyk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3QxMjo6PGFub255bW91cyBuYW1lc3BhY2U+OjpDbHMyOjpDbHMyJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQorICAgICAgQ2xzMihUNyk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZnVuY3Rpb24gJ3Rlc3QxMjo6KGFub255bW91cyBuYW1lc3BhY2UpOjpDbHMyOjpDbHMyJyBoYXMgaW50ZXJuYWwgbGlua2FnZSBidXQgaXMgbm90IGRlZmluZWR9fQogICAgIH07CiAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3VuaW5pdGlhbGl6ZWQuY3BwIGIvdGVzdC9TZW1hQ1hYL3VuaW5pdGlhbGl6ZWQuY3BwCmluZGV4IDQ5OTFlYmUuLjY3N2ExNDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC91bmluaXRpYWxpemVkLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvdW5pbml0aWFsaXplZC5jcHAKQEAgLTExNyw3ICsxMTcsNyBAQAogICBBIGEyMHthMjB9OyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3ZhcmlhYmxlICdhMjAnIGlzIHVuaW5pdGlhbGl6ZWQgd2hlbiB1c2VkIHdpdGhpbiBpdHMgb3duIGluaXRpYWxpemF0aW9ufX0KICAgQSBhMjEgPSB7YTIxfTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t2YXJpYWJsZSAnYTIxJyBpcyB1bmluaXRpYWxpemVkIHdoZW4gdXNlZCB3aXRoaW4gaXRzIG93biBpbml0aWFsaXphdGlvbn19CiAKLSAgLy8gRklYTUU6IE1ha2UgdGhlIGxvY2FsIHVuaW5pdGlhbGl6ZWQgd2FybmluZyBjb25zaXN0YW50IHdpdGggdGhlIGdsb2JhbAorICAvLyBGSVhNRTogTWFrZSB0aGUgbG9jYWwgdW5pbml0aWFsaXplZCB3YXJuaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgZ2xvYmFsCiAgIC8vIHVuaW5pdGlhbGl6ZWQgY2hlY2tpbmcuCiAgIEEgKmEyMiA9IG5ldyBBKGEyMi0+Y291bnQpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3ZhcmlhYmxlICdhMjInIGlzIHVuaW5pdGlhbGl6ZWQgd2hlbiB1c2VkIHdpdGhpbiBpdHMgb3duIGluaXRpYWxpemF0aW9ufX0KICAgQSAqYTIzID0gbmV3IEEoYTIzLT5PTkUpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3ZhcmlhYmxlICdhMjMnIGlzIHVuaW5pdGlhbGl6ZWQgd2hlbiB1c2VkIHdpdGhpbiBpdHMgb3duIGluaXRpYWxpemF0aW9ufX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC91bnJlYWNoYWJsZS1jb2RlLmNwcCBiL3Rlc3QvU2VtYUNYWC91bnJlYWNoYWJsZS1jb2RlLmNwcAppbmRleCA3NDMyOTBlLi5mZDAwNmMwIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvdW5yZWFjaGFibGUtY29kZS5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3VucmVhY2hhYmxlLWNvZGUuY3BwCkBAIC0xLDE3ICsxLDI5IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgLWZzeW50YXgtb25seSAtV3VucmVhY2hhYmxlLWNvZGUgLWZibG9ja3MgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mY3h4LWV4Y2VwdGlvbnMgLWZleGNlcHRpb25zIC1mc3ludGF4LW9ubHkgLVd1bnJlYWNoYWJsZS1jb2RlLWFnZ3Jlc3NpdmUgLWZibG9ja3MgLXZlcmlmeSAlcwogCiBpbnQgajsKLXZvaWQgYmFyKCkgeyB9CitpbnQgYmFyKCk7CiBpbnQgdGVzdDEoKSB7CiAgIGZvciAoaW50IGkgPSAwOwogICAgICAgIGkgIT0gMTA7Ci0gICAgICAgKytpKSB7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19CisgICAgICAgKytpKSB7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bG9vcCB3aWxsIHJ1biBhdCBtb3N0IG9uY2UgKGxvb3AgaW5jcmVtZW50IG5ldmVyIGV4ZWN1dGVkKX19CiAgICAgaWYgKGogPT0gMjMpIC8vIG1pc3Npbmcge30ncwogICAgICAgYmFyKCk7CiAgICAgICByZXR1cm4gMTsKICAgfQogICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7ICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KKyAgcmV0dXJuIDE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KK30KKworaW50IHRlc3QxX0IoKSB7CisgIGZvciAoaW50IGkgPSAwOworICAgICAgIGkgIT0gMTA7CisgICAgICAgKytpKSB7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bG9vcCB3aWxsIHJ1biBhdCBtb3N0IG9uY2UgKGxvb3AgaW5jcmVtZW50IG5ldmVyIGV4ZWN1dGVkKX19CisgICAgaWYgKGogPT0gMjMpIC8vIG1pc3Npbmcge30ncworICAgICAgYmFyKCk7CisgICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKKyAgcmV0dXJuIGJhcigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19CiB9CiAKIHZvaWQgdGVzdDIoaW50IGkpIHsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC92YXJhcmctY2xhc3MuY3BwIGIvdGVzdC9TZW1hQ1hYL3ZhcmFyZy1jbGFzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmNTIxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC92YXJhcmctY2xhc3MuY3BwCkBAIC0wLDAgKzEsNDggQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1XY2xhc3MtdmFyYXJncyAtc3RkPWMrKzk4ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtV2NsYXNzLXZhcmFyZ3MgLXN0ZD1jKysxMSAlcworCitzdHJ1Y3QgQSB7fTsKK3N0cnVjdCBCIHsgfkIoKTsgfTsKK2NsYXNzIEMgeyBjaGFyICpjX3N0cigpOyB9Oworc3RydWN0IEQgeyBjaGFyICpjX3N0cigpOyB9Oworc3RydWN0IEUgeyBFKCk7IH07CitzdHJ1Y3QgRiB7IEYoKTsgY2hhciAqY19zdHIoKTsgfTsKKwordm9pZCB2KC4uLik7Cit2b2lkIHcoY29uc3QgY2hhciosIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKKwordm9pZCB0ZXN0KEEgYSwgQiBiLCBDIGMsIEQgZCwgRSBlLCBGIGYpIHsKKyAgdihhKTsgLy8gZXhwZWN0ZWQtd2FybmluZy1yZSB7e3Bhc3Npbmcgb2JqZWN0IG9mIGNsYXNzIHR5cGUgJ0EnIHRocm91Z2ggdmFyaWFkaWMgZnVuY3Rpb257eyR9fX19CisgIHYoYik7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7Y2Fubm90IHBhc3Mgb2JqZWN0IG9mIG5vbi17e1BPRHx0cml2aWFsfX0gdHlwZSAnQicgdGhyb3VnaCB2YXJpYWRpYyBmdW5jdGlvbjsgY2FsbCB3aWxsIGFib3J0IGF0IHJ1bnRpbWV9fQorICB2KGMpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cGFzc2luZyBvYmplY3Qgb2YgY2xhc3MgdHlwZSAnQycgdGhyb3VnaCB2YXJpYWRpYyBmdW5jdGlvbjsgZGlkIHlvdSBtZWFuIHRvIGNhbGwgJy5jX3N0cigpJz99fQorICB2KGQpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cGFzc2luZyBvYmplY3Qgb2YgY2xhc3MgdHlwZSAnRCcgdGhyb3VnaCB2YXJpYWRpYyBmdW5jdGlvbjsgZGlkIHlvdSBtZWFuIHRvIGNhbGwgJy5jX3N0cigpJz99fQorICB2KGUpOworICB2KGYpOworI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAorICAvLyBleHBlY3RlZC1lcnJvckAtMyB7e2Nhbm5vdCBwYXNzIG9iamVjdCBvZiBub24tUE9EIHR5cGUgJ0UnIHRocm91Z2ggdmFyaWFkaWMgZnVuY3Rpb247IGNhbGwgd2lsbCBhYm9ydCBhdCBydW50aW1lfX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTMge3tjYW5ub3QgcGFzcyBvYmplY3Qgb2Ygbm9uLVBPRCB0eXBlICdGJyB0aHJvdWdoIHZhcmlhZGljIGZ1bmN0aW9uOyBjYWxsIHdpbGwgYWJvcnQgYXQgcnVudGltZX19CisjZWxzZQorICAvLyBleHBlY3RlZC13YXJuaW5nLXJlQC02IHt7cGFzc2luZyBvYmplY3Qgb2YgY2xhc3MgdHlwZSAnRScgdGhyb3VnaCB2YXJpYWRpYyBmdW5jdGlvbnt7JH19fX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtNiB7e3Bhc3Npbmcgb2JqZWN0IG9mIGNsYXNzIHR5cGUgJ0YnIHRocm91Z2ggdmFyaWFkaWMgZnVuY3Rpb247IGRpZCB5b3UgbWVhbiB0byBjYWxsICcuY19zdHIoKSc/fX0KKyNlbmRpZgorCisgIHYoZC5jX3N0cigpKTsKKyAgdihmLmNfc3RyKCkpOworICB2KDApOworICB2KCd4Jyk7CisKKyAgdygiJXMiLCBhKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Zvcm1hdCBzcGVjaWZpZXMgdHlwZSAnY2hhciAqJyBidXQgdGhlIGFyZ3VtZW50IGhhcyB0eXBlICdBJ319CisgIHcoIiVzIiwgYik7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7Y2Fubm90IHBhc3Mgbm9uLXt7UE9EfHRyaXZpYWx9fSBvYmplY3Qgb2YgdHlwZSAnQicgdG8gdmFyaWFkaWMgZnVuY3Rpb247IGV4cGVjdGVkIHR5cGUgZnJvbSBmb3JtYXQgc3RyaW5nIHdhcyAnY2hhciAqJ319CisgIHcoIiVzIiwgYyk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tmb3JtYXQgc3BlY2lmaWVzIHR5cGUgJ2NoYXIgKicgYnV0IHRoZSBhcmd1bWVudCBoYXMgdHlwZSAnQyd9fQorICB3KCIlcyIsIGQpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Zm9ybWF0IHNwZWNpZmllcyB0eXBlICdjaGFyIConIGJ1dCB0aGUgYXJndW1lbnQgaGFzIHR5cGUgJ0QnfX0KKyAgdygiJXMiLCBlKTsKKyAgdygiJXMiLCBmKTsKKyNpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTMge3tjYW5ub3QgcGFzcyBub24tUE9EIG9iamVjdCBvZiB0eXBlICdFJyB0byB2YXJpYWRpYyBmdW5jdGlvbjsgZXhwZWN0ZWQgdHlwZSBmcm9tIGZvcm1hdCBzdHJpbmcgd2FzICdjaGFyIConfX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3JALTMge3tjYW5ub3QgcGFzcyBub24tUE9EIG9iamVjdCBvZiB0eXBlICdGJyB0byB2YXJpYWRpYyBmdW5jdGlvbjsgZXhwZWN0ZWQgdHlwZSBmcm9tIGZvcm1hdCBzdHJpbmcgd2FzICdjaGFyIConfX0KKyAgLy8gZXhwZWN0ZWQtbm90ZUAtNCB7e2RpZCB5b3UgbWVhbiB0byBjYWxsIHRoZSBjX3N0cigpIG1ldGhvZD99fQorI2Vsc2UKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtNyB7e2Zvcm1hdCBzcGVjaWZpZXMgdHlwZSAnY2hhciAqJyBidXQgdGhlIGFyZ3VtZW50IGhhcyB0eXBlICdFJ319CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTcge3tmb3JtYXQgc3BlY2lmaWVzIHR5cGUgJ2NoYXIgKicgYnV0IHRoZSBhcmd1bWVudCBoYXMgdHlwZSAnRid9fQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvdmVjdG9yLWNhc3RzLmNwcCBiL3Rlc3QvU2VtYUNYWC92ZWN0b3ItY2FzdHMuY3BwCmluZGV4IDY4MWEwN2UuLjNhYTA5N2IgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC92ZWN0b3ItY2FzdHMuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC92ZWN0b3ItY2FzdHMuY3BwCkBAIC0yLDYgKzIsNyBAQAogdHlwZWRlZiBpbnQgX192MnNpIF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg4KSkpOwogdHlwZWRlZiBzaG9ydCBfX3Y0aGkgX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDgpKSk7CiB0eXBlZGVmIHNob3J0IF9fdjhoaSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYpKSk7Cit0eXBlZGVmIHNob3J0IF9fdjNoaSBfX2F0dHJpYnV0ZV9fKChfX2V4dF92ZWN0b3JfdHlwZV9fKDMpKSk7CiAKIHN0cnVjdCBTIHsgfTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7Y2FuZGlkYXRlIGNvbnN0cnVjdG9yfX0KIApAQCAtMzcsNCArMzgsMjggQEAKICAgKHZvaWQpKF9fdjRoaSl2OGhpOyAvLyBleHBlY3RlZC1lcnJvciB7e0Mtc3R5bGUgY2FzdCBmcm9tIHZlY3RvciAnX192OGhpJyB0byB2ZWN0b3IgJ19fdjRoaScgb2YgZGlmZmVyZW50IHNpemV9fQogfQogCitzdHJ1Y3QgdGVzdHZlYyB7CisgIF9fdjJzaSB2OworICB2b2lkIG1hZGQoY29uc3QgdGVzdHZlYyYgcmhzKSB7CisgICAgdiA9IHYgKyByaHM7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FuJ3QgY29udmVydCBiZXR3ZWVuIHZlY3RvciBhbmQgbm9uLXNjYWxhciB2YWx1ZXN9fQorICB9CisgIHZvaWQgbWFkZDIodGVzdHZlYyByaHMpIHsKKyAgICB2ID0gdiArIHJoczsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW4ndCBjb252ZXJ0IGJldHdlZW4gdmVjdG9yIGFuZCBub24tc2NhbGFyIHZhbHVlc319CisgIH0KK307CiAKKy8vIHJkYXI6Ly8xNTkzMTQyNgorLy8gICBDb252ZXJzaW9ucyBmb3IgcmV0dXJuIHZhbHVlcy4KK19fdjRoaSB0aHJlZVRvRm91cihfX3YzaGkgdikgeyAvLyBleHBlY3RlZC1ub3RlIHt7bm90IHZpYWJsZX19CisgIHJldHVybiB2OyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBpbml0aWFsaXplIHJldHVybiBvYmplY3R9fQorfQorX192M2hpIGZvdXJUb1RocmVlKF9fdjRoaSB2KSB7IC8vIGV4cGVjdGVkLW5vdGUge3tub3QgdmlhYmxlfX0KKyAgcmV0dXJuIHY7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y2Fubm90IGluaXRpYWxpemUgcmV0dXJuIG9iamVjdH19Cit9CisvLyAgIENvbnZlcnNpb25zIGZvciBjYWxscy4KK3ZvaWQgY2FsbDN0bzQoX192NGhpIHYpIHsKKyAgKHZvaWQpIHRocmVlVG9Gb3VyKHYpOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBjYWxsfX0KK30KK3ZvaWQgY2FsbDR0bzMoX192M2hpIHYpIHsKKyAgKHZvaWQpIGZvdXJUb1RocmVlKHYpOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBjYWxsfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC92aXJ0dWFsLWJhc2UtdXNlZC5jcHAgYi90ZXN0L1NlbWFDWFgvdmlydHVhbC1iYXNlLXVzZWQuY3BwCmluZGV4IDA0NTE4Y2UuLmM0NmNmNWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC92aXJ0dWFsLWJhc2UtdXNlZC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3ZpcnR1YWwtYmFzZS11c2VkLmNwcApAQCAtMSw0MiArMSw4OSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC12ZXJpZnkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC10cmlwbGUgJW1zX2FiaV90cmlwbGUgLURNU0FCSSAtdmVyaWZ5ICVzCiAvLyBQUjc4MDAKIAorLy8gVGhlIE1pY3Jvc29mdCBBQkkgZG9lc24ndCBoYXZlIHRoZSBjb25jZXB0IG9mIGtleSBmdW5jdGlvbnMsIHNvIHdlIGhhdmUgZGlmZmVyZW50CisvLyBleHBlY3RhdGlvbnMgYWJvdXQgd2hlbiBmdW5jdGlvbnMgYXJlIGZpcnN0IHJlcXVpcmVkIGZvciB0aGF0IGNhc2UuCisKKyNpZmRlZiBNU0FCSQorLy8gZXhwZWN0ZWQtbm90ZUArMiAzIHt7ZGVjbGFyZWQgcHJpdmF0ZSBoZXJlfX0KKyNlbmRpZgogY2xhc3MgTm9EZXN0cm95IHsgfk5vRGVzdHJveSgpOyB9OyAvLyBleHBlY3RlZC1ub3RlIDMge3tkZWNsYXJlZCBwcml2YXRlIGhlcmV9fQogc3RydWN0IEEgewogICB2aXJ0dWFsIH5BKCk7CiB9OwogCisjaWZkZWYgTVNBQkkKKy8vIGV4cGVjdGVkLWVycm9yQCszIHt7ZmllbGQgb2YgdHlwZSAnTm9EZXN0cm95JyBoYXMgcHJpdmF0ZSBkZXN0cnVjdG9yfX0KKyNlbmRpZgogc3RydWN0IEIgOiBwdWJsaWMgdmlydHVhbCBBIHsKICAgTm9EZXN0cm95IHg7IC8vIGV4cGVjdGVkLWVycm9yIHt7ZmllbGQgb2YgdHlwZSAnTm9EZXN0cm95JyBoYXMgcHJpdmF0ZSBkZXN0cnVjdG9yfX0KIH07CisjaWZkZWYgTVNBQkkKKy8vIGV4cGVjdGVkLW5vdGVAKzMge3tpbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciAnQicgZmlyc3QgcmVxdWlyZWQgaGVyZX19CisvLyBleHBlY3RlZC1ub3RlQCsyIHt7aW1wbGljaXQgZGVzdHJ1Y3RvciBmb3IgJ0InIGZpcnN0IHJlcXVpcmVkIGhlcmV9fQorI2VuZGlmCiBzdHJ1Y3QgRCA6IHB1YmxpYyB2aXJ0dWFsIEIgewogICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgIH5EKCk7CiB9OworI2lmZGVmIE1TQUJJCitEIGQ7IC8vIGV4cGVjdGVkLW5vdGUge3tpbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciAnRCcgZmlyc3QgcmVxdWlyZWQgaGVyZX19CisjZWxzZQogdm9pZCBEOjpmb28oKSB7IC8vIGV4cGVjdGVkLW5vdGUge3tpbXBsaWNpdCBkZXN0cnVjdG9yIGZvciAnQicgZmlyc3QgcmVxdWlyZWQgaGVyZX19CiB9CisjZW5kaWYKIAorI2lmZGVmIE1TQUJJCisvLyBleHBlY3RlZC1lcnJvckArMyB7e2ZpZWxkIG9mIHR5cGUgJ05vRGVzdHJveScgaGFzIHByaXZhdGUgZGVzdHJ1Y3Rvcn19CisjZW5kaWYKIHN0cnVjdCBFIDogcHVibGljIHZpcnR1YWwgQSB7CiAgIE5vRGVzdHJveSB4OyAvLyBleHBlY3RlZC1lcnJvciB7e2ZpZWxkIG9mIHR5cGUgJ05vRGVzdHJveScgaGFzIHByaXZhdGUgZGVzdHJ1Y3Rvcn19CiB9OworI2lmZGVmIE1TQUJJCisvLyBleHBlY3RlZC1ub3RlQCsyIHt7aW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgJ0UnIGZpcnN0IHJlcXVpcmVkIGhlcmV9fQorI2VuZGlmCiBzdHJ1Y3QgRiA6IHB1YmxpYyBFIHsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ltcGxpY2l0IGRlc3RydWN0b3IgZm9yICdFJyBmaXJzdCByZXF1aXJlZCBoZXJlfX0KIH07CisjaWZkZWYgTVNBQkkKKy8vIGV4cGVjdGVkLW5vdGVAKzIge3tpbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciAnRicgZmlyc3QgcmVxdWlyZWQgaGVyZX19CisjZW5kaWYKIHN0cnVjdCBHIDogcHVibGljIHZpcnR1YWwgRiB7CiAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgfkcoKTsKIH07CisjaWZkZWYgTVNBQkkKK0cgZzsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ltcGxpY2l0IGRlZmF1bHQgY29uc3RydWN0b3IgZm9yICdHJyBmaXJzdCByZXF1aXJlZCBoZXJlfX0KKyNlbHNlCiB2b2lkIEc6OmZvbygpIHsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ltcGxpY2l0IGRlc3RydWN0b3IgZm9yICdGJyBmaXJzdCByZXF1aXJlZCBoZXJlfX0KIH0KKyNlbmRpZgogCisjaWZkZWYgTVNBQkkKKy8vIGV4cGVjdGVkLW5vdGVAKzMge3snSCcgZGVjbGFyZWQgaGVyZX19CisvLyBleHBlY3RlZC1lcnJvckArMyB7e2ZpZWxkIG9mIHR5cGUgJ05vRGVzdHJveScgaGFzIHByaXZhdGUgZGVzdHJ1Y3Rvcn19CisjZW5kaWYKIHN0cnVjdCBIIDogcHVibGljIHZpcnR1YWwgQSB7CiAgIE5vRGVzdHJveSB4OyAvLyBleHBlY3RlZC1lcnJvciB7e2ZpZWxkIG9mIHR5cGUgJ05vRGVzdHJveScgaGFzIHByaXZhdGUgZGVzdHJ1Y3Rvcn19CiB9OworI2lmZGVmIE1TQUJJCisvLyBleHBlY3RlZC1lcnJvckArMyB7e2ltcGxpY2l0IGRlZmF1bHQgY29uc3RydWN0b3IgZm9yICdJJyBtdXN0IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZSB0aGUgYmFzZSBjbGFzcyAnSCcgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3J9fQorLy8gZXhwZWN0ZWQtbm90ZUArMiB7e2ltcGxpY2l0IGRlc3RydWN0b3IgZm9yICdIJyBmaXJzdCByZXF1aXJlZCBoZXJlfX0KKyNlbmRpZgogc3RydWN0IEkgOiBwdWJsaWMgdmlydHVhbCBIIHsKICAgfkkoKTsKIH07CisjaWZkZWYgTVNBQkkKKy8vIGV4cGVjdGVkLW5vdGVAKzMge3tpbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciAnSCcgZmlyc3QgcmVxdWlyZWQgaGVyZX19CisvLyBleHBlY3RlZC1ub3RlQCsyIHt7aW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgJ0knIGZpcnN0IHJlcXVpcmVkIGhlcmV9fQorI2VuZGlmCiBzdHJ1Y3QgSiA6IHB1YmxpYyBJIHsKICAgdmlydHVhbCB2b2lkIGZvbygpOwogICB+SigpOwogfTsKKyNpZmRlZiBNU0FCSQorSiBqOyAvLyBleHBlY3RlZC1ub3RlIHt7aW1wbGljaXQgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgJ0onIGZpcnN0IHJlcXVpcmVkIGhlcmV9fQorI2Vsc2UKIHZvaWQgSjo6Zm9vKCkgeyAvLyBleHBlY3RlZC1ub3RlIHt7aW1wbGljaXQgZGVzdHJ1Y3RvciBmb3IgJ0gnIGZpcnN0IHJlcXVpcmVkIGhlcmV9fQogfQorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvdmlydHVhbC1vdmVycmlkZS14ODYuY3BwIGIvdGVzdC9TZW1hQ1hYL3ZpcnR1YWwtb3ZlcnJpZGUteDg2LmNwcAppbmRleCA3NWQ4YWYzLi4xZDlkMWZiIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvdmlydHVhbC1vdmVycmlkZS14ODYuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC92aXJ0dWFsLW92ZXJyaWRlLXg4Ni5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZT1pNjg2LXBjLXVua25vd24gLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzIC1zdGQ9YysrMTEgLWN4eC1hYmkgbWljcm9zb2Z0CisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZT1pNjg2LXBjLXdpbjMyIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAtc3RkPWMrKzExCiAKIG5hbWVzcGFjZSBQUjE0MzM5IHsKICAgY2xhc3MgQSB7CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvdmlydHVhbC1vdmVycmlkZS5jcHAgYi90ZXN0L1NlbWFDWFgvdmlydHVhbC1vdmVycmlkZS5jcHAKaW5kZXggYjQ3NzQzOC4uZTk1YWNhYiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3ZpcnR1YWwtb3ZlcnJpZGUuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC92aXJ0dWFsLW92ZXJyaWRlLmNwcApAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLXN0ZD1jKysxMQorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC12ZXJpZnkgJXMgLXN0ZD1jKysxMQorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXRyaXBsZSAlbXNfYWJpX3RyaXBsZSAtdmVyaWZ5ICVzIC1zdGQ9YysrMTEKIG5hbWVzcGFjZSBUMSB7CiAKIGNsYXNzIEEgewpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3ZsYS5jcHAgYi90ZXN0L1NlbWFDWFgvdmxhLmNwcAppbmRleCBkNjNiNjMzLi5kYWU2NDUwIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvdmxhLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvdmxhLmNwcApAQCAtMywzICszLDE3IEBACiAvLyBQUjExOTI1CiBpbnQgbjsKIGludCAoJmYoKSlbbl07IC8vIGV4cGVjdGVkLWVycm9yIHt7ZnVuY3Rpb24gZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgdmFyaWFibHkgbW9kaWZpZWQgdHlwZX19CisKK25hbWVzcGFjZSBQUjE4NTgxIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHBvZCB7fTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGVycm9yIHsKKyAgICB0eXBlbmFtZSBUOjplcnJvciBlOyAvLyBleHBlY3RlZC1lcnJvciB7e2Nhbm5vdCBiZSB1c2VkIHByaW9yIHRvICc6Oid9fQorICB9OworICBzdHJ1Y3QgaW5jb21wbGV0ZTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvcndhcmQgZGVjbGFyYXRpb259fQorCisgIHZvaWQgZihpbnQgbikgeworICAgIHBvZDxpbnQ+IGFbbl07CisgICAgZXJyb3I8aW50PiBiW25dOyAvLyBleHBlY3RlZC1ub3RlIHt7aW5zdGFudGlhdGlvbn19CisgICAgaW5jb21wbGV0ZSBjW25dOyAvLyBleHBlY3RlZC1lcnJvciB7e2luY29tcGxldGV9fQorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvdnRvcmRpc3AtbW9kZS5jcHAgYi90ZXN0L1NlbWFDWFgvdnRvcmRpc3AtbW9kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5MTUzNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC92dG9yZGlzcC1tb2RlLmNwcApAQCAtMCwwICsxLDI2IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1zdGQ9YysrMTEgLXZ0b3JkaXNwLW1vZGU9MCAtRFZUT1JESVNQX01PREU9MCAlcyAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1zdGQ9YysrMTEgLXZ0b3JkaXNwLW1vZGU9MSAtRFZUT1JESVNQX01PREU9MSAlcyAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXBjLXdpbjMyIC1zdGQ9YysrMTEgLXZ0b3JkaXNwLW1vZGU9MiAtRFZUT1JESVNQX01PREU9MiAlcyAtdmVyaWZ5CisKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCisKK3N0cnVjdCBBIHsKKyAgQSgpOworICB2aXJ0dWFsIHZvaWQgZm9vKCk7Cit9OworCisvLyBBdCAvdmQxLCB0aGVyZSBpcyBhIHZ0b3JkaXNwIGJlZm9yZSBBLgorc3RydWN0IEIgOiB2aXJ0dWFsIEEgeworICBCKCk7CisgIHZpcnR1YWwgdm9pZCBmb28oKTsKKyAgdmlydHVhbCB2b2lkIGJhcigpOworfTsKKworLy8gQXQgL3ZkMiwgdGhlcmUgaXMgYSB2dG9yZGlzcCBiZWZvcmUgQiwgYnV0IG9ubHkgYmVjYXVzZSBpdCBoYXMgaXRzIG93bgorLy8gdmZ0YWJsZS4KK3N0cnVjdCBDIDogdmlydHVhbCBCIHsKKyAgQygpOworfTsKKworLy8gVGhlcmUgYXJlIHR3byB2ZnB0cnMsIHR3byB2YnB0cnMsIGFuZCBzb21lIG51bWJlciBvZiB2dG9yZGlzcHMuCitzdGF0aWNfYXNzZXJ0KHNpemVvZihDKSA9PSAyICogNCArIDIgKiA0ICsgNCAqIFZUT1JESVNQX01PREUsICJzaXplIG1pc21hdGNoIik7CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvd2Fybi1hYnNvbHV0ZS12YWx1ZS1oZWFkZXIuY3BwIGIvdGVzdC9TZW1hQ1hYL3dhcm4tYWJzb2x1dGUtdmFsdWUtaGVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWFhYWJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tYWJzb2x1dGUtdmFsdWUtaGVhZGVyLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSBpNjg2LXBjLWxpbnV4LWdudSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLVdhYnNvbHV0ZS12YWx1ZQorLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgaTY4Ni1wYy1saW51eC1nbnUgLWZzeW50YXgtb25seSAlcyAtV2Fic29sdXRlLXZhbHVlIC1mZGlhZ25vc3RpY3MtcGFyc2VhYmxlLWZpeGl0cyAyPiYxIHwgRmlsZUNoZWNrICVzCisKK2V4dGVybiAiQyIgaW50IGFicyhpbnQpOworCisvLyBXcm9uZyBzaWduYXR1cmUKK2ludCBmYWJzZihpbnQpOworCit2b2lkIHRlc3RfaW50KGludCBpLCB1bnNpZ25lZCB1LCBsb25nIGxvbmcgbGwsIGZsb2F0IGYsIGRvdWJsZSBkKSB7CisgICh2b2lkKWFicyhpKTsKKworICAvLyBSZW1vdmUgYWJzIGNhbGwKKyAgKHZvaWQpYWJzKHUpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3t0YWtpbmcgdGhlIGFic29sdXRlIHZhbHVlIG9mIHVuc2lnbmVkIHR5cGUgJ3Vuc2lnbmVkIGludCcgaGFzIG5vIGVmZmVjdH19CisgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3JlbW92ZSB0aGUgY2FsbCB0byAnYWJzJyBzaW5jZSB1bnNpZ25lZCB2YWx1ZXMgY2Fubm90IGJlIG5lZ2F0aXZlfX0KKyAgLy8gQ0hFQ0s6IGZpeC1pdDoie3suKn19Ijp7W1tATElORS0zXV06OS1bW0BMSU5FLTNdXToxMn06IiIKKworICBpbnQgbGxhYnM7CisgICh2b2lkKWxsYWJzOworICAvLyBDb25mbGljdCBpbiBuYW1lcywgc3VnZ2VzdCBxdWFsaWZpZWQgbmFtZQorICAodm9pZClhYnMobGwpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3thYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnYWJzJyBnaXZlbiBhbiBhcmd1bWVudCBvZiB0eXBlICdsb25nIGxvbmcnIGJ1dCBoYXMgcGFyYW1ldGVyIG9mIHR5cGUgJ2ludCcgd2hpY2ggbWF5IGNhdXNlIHRydW5jYXRpb24gb2YgdmFsdWV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0ye3t1c2UgZnVuY3Rpb24gJzo6bGxhYnMnIGluc3RlYWR9fQorICAvLyBleHBlY3RlZC1ub3RlQC0ze3twbGVhc2UgaW5jbHVkZSB0aGUgaGVhZGVyIDxzdGRsaWIuaD4gb3IgZXhwbGljaXRseSBwcm92aWRlIGEgZGVjbGFyYXRpb24gZm9yICdsbGFicyd9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTRdXTo5LVtbQExJTkUtNF1dOjEyfToiOjpsbGFicyIKKworICAvLyBDb25mbGljdCBpbiBuYW1lcywgbm8gbm90ZXMKKyAgKHZvaWQpYWJzKGYpOworICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3t1c2luZyBpbnRlZ2VyIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uICdhYnMnIHdoZW4gYXJndW1lbnQgaXMgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZX19CisKKyAgLy8gU3VnZ2VzdCBoZWFkZXIuCisgICh2b2lkKWFicyhkKTsKKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7dXNpbmcgaW50ZWdlciBhYnNvbHV0ZSB2YWx1ZSBmdW5jdGlvbiAnYWJzJyB3aGVuIGFyZ3VtZW50IGlzIG9mIGZsb2F0aW5nIHBvaW50IHR5cGV9fQorICAvLyBleHBlY3RlZC1ub3RlQC0ye3t1c2UgZnVuY3Rpb24gJ2ZhYnMnIGluc3RlYWR9fQorICAvLyBleHBlY3RlZC1ub3RlQC0ze3twbGVhc2UgaW5jbHVkZSB0aGUgaGVhZGVyIDxtYXRoLmg+IG9yIGV4cGxpY2l0bHkgcHJvdmlkZSBhIGRlY2xhcmF0aW9uIGZvciAnZmFicyd9fQorICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTRdXTo5LVtbQExJTkUtNF1dOjEyfToiZmFicyIKK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLWFic29sdXRlLXZhbHVlMi5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi1hYnNvbHV0ZS12YWx1ZTIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmN2U4OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWFDWFgvd2Fybi1hYnNvbHV0ZS12YWx1ZTIuY3BwCkBAIC0wLDAgKzEsMTMgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGk2ODYtcGMtbGludXgtZ251IC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAtV2Fic29sdXRlLXZhbHVlCisKK2V4dGVybiAiQyIgeworaW50IGFicyhpbnQpOworZG91YmxlIGZhYnMoZG91YmxlKTsKK30KKwordXNpbmcgOjpmYWJzOworCitkb3VibGUgdGVzdChkb3VibGUgeCkgeworICByZXR1cm4gOjphYnMoeCk7CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e3VzaW5nIGludGVnZXIgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24gJ2Ficycgd2hlbiBhcmd1bWVudCBpcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLWFkZHJlc3MuY3BwIGIvdGVzdC9TZW1hQ1hYL3dhcm4tYWRkcmVzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5ZWRmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC93YXJuLWFkZHJlc3MuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLVduby1ib29sLWNvbnZlcnNpb24gLVduby1zdHJpbmctY29tcGFyZSAtV25vLXRhdXRvbG9naWNhbC1jb21wYXJlIC1XYWRkcmVzcyAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworCit2b2lkIGZvbygpOworaW50IGFycls1XTsKK2ludCBnbG9iYWw7Citjb25zdCBjaGFyKiBzdHIgPSAiIjsKKwordm9pZCB0ZXN0KCkgeworICBpZiAoZm9vKSB7fSAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e2Fsd2F5cyBldmFsdWF0ZSB0byAndHJ1ZSd9fSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZXt7c2lsZW5jZX19CisgIGlmIChhcnIpIHt9ICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7YWx3YXlzIGV2YWx1YXRlIHRvICd0cnVlJ319CisgIGlmICgmZ2xvYmFsKSB7fSAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7YWx3YXlzIGV2YWx1YXRlIHRvICd0cnVlJ319CisgIGlmIChmb28gPT0gMCkge30gICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7YWx3YXlzIGZhbHNlfX0gXAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGV7e3NpbGVuY2V9fQorICBpZiAoYXJyID09IDApIHt9ICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e2Fsd2F5cyBmYWxzZX19CisgIGlmICgmZ2xvYmFsID09IDApIHt9ICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7YWx3YXlzIGZhbHNlfX0KKworICBpZiAoc3RyID09ICJmb28iKSB7fSAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3Vuc3BlY2lmaWVkfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLWJvb2wtY29udmVyc2lvbi5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi1ib29sLWNvbnZlcnNpb24uY3BwCmluZGV4IGIzZDEzNmUuLmI0NjI4OTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC93YXJuLWJvb2wtY29udmVyc2lvbi5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tYm9vbC1jb252ZXJzaW9uLmNwcApAQCAtMSw1ICsxLDYgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKIAorbmFtZXNwYWNlIEJvb2xlYW5GYWxzZSB7CiBpbnQqIGogPSBmYWxzZTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7aW5pdGlhbGl6YXRpb24gb2YgcG9pbnRlciBvZiB0eXBlICdpbnQgKicgdG8gbnVsbCBmcm9tIGEgY29uc3RhbnQgYm9vbGVhbiBleHByZXNzaW9ufX0KIAogdm9pZCBmb28oaW50KiBpLCBpbnQgKmo9KGZhbHNlKSkgLy8gZXhwZWN0ZWQtd2FybmluZ3t7aW5pdGlhbGl6YXRpb24gb2YgcG9pbnRlciBvZiB0eXBlICdpbnQgKicgdG8gbnVsbCBmcm9tIGEgY29uc3RhbnQgYm9vbGVhbiBleHByZXNzaW9ufX0KQEAgLTIyLDMgKzIzLDk4IEBACiAvLyBpc24ndCBmbGFnZ2VkLgogdGVtcGxhdGUgPGludCBOPiBzdHJ1Y3QgUyB7fTsKIFM8c2l6ZW9mKGYoZmFsc2UpKT4gczsKKworfQorCituYW1lc3BhY2UgRnVuY3Rpb24gewordm9pZCBmMSgpOworCitzdHJ1Y3QgUyB7CisgIHN0YXRpYyB2b2lkIGYyKCk7Cit9OworCitleHRlcm4gdm9pZCBmMygpIF9fYXR0cmlidXRlX18oKHdlYWtfaW1wb3J0KSk7CisKK3N0cnVjdCBTMiB7CisgIHN0YXRpYyB2b2lkIGY0KCkgX19hdHRyaWJ1dGVfXygod2Vha19pbXBvcnQpKTsKK307CisKK2Jvb2wgZjUoKTsKK2Jvb2wgZjYoaW50KTsKKwordm9pZCBiYXIoKSB7CisgIGJvb2wgYjsKKworICBiID0gZjE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3thZGRyZXNzIG9mIGZ1bmN0aW9uICdmMScgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ3RydWUnfX0gXAorICAgICAgICAgICAgIGV4cGVjdGVkLW5vdGUge3twcmVmaXggd2l0aCB0aGUgYWRkcmVzcy1vZiBvcGVyYXRvciB0byBzaWxlbmNlIHRoaXMgd2FybmluZ319CisgIGlmIChmMSkge30gLy8gZXhwZWN0ZWQtd2FybmluZyB7e2FkZHJlc3Mgb2YgZnVuY3Rpb24gJ2YxJyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAndHJ1ZSd9fSBcCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQtbm90ZSB7e3ByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nfX0KKyAgYiA9IFM6OmYyOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWRkcmVzcyBvZiBmdW5jdGlvbiAnUzo6ZjInIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICd0cnVlJ319IFwKKyAgICAgICAgICAgICAgICBleHBlY3RlZC1ub3RlIHt7cHJlZml4IHdpdGggdGhlIGFkZHJlc3Mtb2Ygb3BlcmF0b3IgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmd9fQorICBpZiAoUzo6ZjIpIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3thZGRyZXNzIG9mIGZ1bmN0aW9uICdTOjpmMicgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ3RydWUnfX0gXAorICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLW5vdGUge3twcmVmaXggd2l0aCB0aGUgYWRkcmVzcy1vZiBvcGVyYXRvciB0byBzaWxlbmNlIHRoaXMgd2FybmluZ319CisgIGIgPSBmNTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2FkZHJlc3Mgb2YgZnVuY3Rpb24gJ2Y1JyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAndHJ1ZSd9fSBcCisgICAgICAgICAgICAgZXhwZWN0ZWQtbm90ZSB7e3ByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nfX0gXAorICAgICAgICAgICAgIGV4cGVjdGVkLW5vdGUge3tzdWZmaXggd2l0aCBwYXJlbnRoZXNlcyB0byB0dXJuIHRoaXMgaW50byBhIGZ1bmN0aW9uIGNhbGx9fQorICBiID0gZjY7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3thZGRyZXNzIG9mIGZ1bmN0aW9uICdmNicgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ3RydWUnfX0gXAorICAgICAgICAgICAgIGV4cGVjdGVkLW5vdGUge3twcmVmaXggd2l0aCB0aGUgYWRkcmVzcy1vZiBvcGVyYXRvciB0byBzaWxlbmNlIHRoaXMgd2FybmluZ319CisKKyAgLy8gaW1wbGljaXQgY2FzdHMgb2Ygd2Vha2x5IGltcG9ydGVkIHN5bWJvbHMgYXJlIG9rOgorICBiID0gZjM7CisgIGlmIChmMykge30KKyAgYiA9IFMyOjpmNDsKKyAgaWYgKFMyOjpmNCkge30KK30KK30KKworbmFtZXNwYWNlIEFycmF5IHsKKyAgI2RlZmluZSBHZXRWYWx1ZShwdHIpICAoKHB0cikgPyBwdHJbMF0gOiAwKQorICBleHRlcm4gaW50IGFbXSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CisgIGludCBiW10gPSB7OCwxMywyMX07CisgIHN0cnVjdCB7CisgICAgaW50IHhbMTBdOworICB9IGM7CisgIGNvbnN0IGNoYXIgc3RyW10gPSAidGV4dCI7CisgIHZvaWQgaWdub3JlKCkgeworICAgIGlmIChhKSB7fQorICAgIGlmIChhKSB7fQorICAgICh2b2lkKUdldFZhbHVlKGIpOworICB9CisgIHZvaWQgdGVzdCgpIHsKKyAgICBpZiAoYikge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3thZGRyZXNzIG9mIGFycmF5ICdiJyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAndHJ1ZSd9fQorICAgIGlmIChiKSB7fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2FkZHJlc3Mgb2YgYXJyYXkgJ2InIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICd0cnVlJ319CisgICAgaWYgKGMueCkge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3thZGRyZXNzIG9mIGFycmF5ICdjLngnIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICd0cnVlJ319CisgICAgaWYgKHN0cikge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3thZGRyZXNzIG9mIGFycmF5ICdzdHInIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICd0cnVlJ319CisgIH0KK30KKworbmFtZXNwYWNlIFBvaW50ZXIgeworICBleHRlcm4gaW50IGEgX19hdHRyaWJ1dGVfXygod2VhaykpOworICBpbnQgYjsKKyAgc3RhdGljIGludCBjOworICBjbGFzcyBTIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBpbnQgYTsKKyAgICBpbnQgYjsKKyAgfTsKKyAgdm9pZCBpZ25vcmVkKCkgeworICAgIGlmICgmYSkge30KKyAgfQorICB2b2lkIHRlc3QoKSB7CisgICAgUyBzOworICAgIGlmICgmYikge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3thZGRyZXNzIG9mICdiJyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAndHJ1ZSd9fQorICAgIGlmICgmYykge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3thZGRyZXNzIG9mICdjJyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAndHJ1ZSd9fQorICAgIGlmICgmcy5hKSB7fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2FkZHJlc3Mgb2YgJ3MuYScgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ3RydWUnfX0KKyAgICBpZiAoJnMuYikge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3thZGRyZXNzIG9mICdzLmInIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICd0cnVlJ319CisgICAgaWYgKCZTOjphKSB7fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2FkZHJlc3Mgb2YgJ1M6OmEnIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICd0cnVlJ319CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLWNvbnN1bWVkLWFuYWx5c2lzLmNwcCBiL3Rlc3QvU2VtYUNYWC93YXJuLWNvbnN1bWVkLWFuYWx5c2lzLmNwcAppbmRleCA2NGZkYzAwLi5iZDA5MWM2IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvd2Fybi1jb25zdW1lZC1hbmFseXNpcy5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tY29uc3VtZWQtYW5hbHlzaXMuY3BwCkBAIC01MSw3ICs1MSw3IEBACiAKIGNsYXNzIENPTlNVTUFCTEUodW5jb25zdW1lZCkgRGVzdHJ1Y3RvclRlc3RlciB7CiBwdWJsaWM6Ci0gIERlc3RydWN0b3JUZXN0ZXIoKSBSRVRVUk5fVFlQRVNUQVRFKHVuY29uc3VtZWQpOworICBEZXN0cnVjdG9yVGVzdGVyKCk7CiAgIERlc3RydWN0b3JUZXN0ZXIoaW50KTsKICAgCiAgIHZvaWQgb3BlcmF0b3IqKCkgQ0FMTEFCTEVfV0hFTigidW5jb25zdW1lZCIpOwpAQCAtODIsMTEgKzgyLDIxIEBACiB2b2lkIHRlc3RJbml0aWFsaXphdGlvbigpIHsKICAgQ29uc3VtYWJsZUNsYXNzPGludD4gdmFyMDsKICAgQ29uc3VtYWJsZUNsYXNzPGludD4gdmFyMSA9IENvbnN1bWFibGVDbGFzczxpbnQ+KCk7Ci0gIAotICB2YXIwID0gQ29uc3VtYWJsZUNsYXNzPGludD4oKTsKLSAgCisgIENvbnN1bWFibGVDbGFzczxpbnQ+IHZhcjIoNDIpOworICBDb25zdW1hYmxlQ2xhc3M8aW50PiB2YXIzKHZhcjIpOyAgLy8gY29weSBjb25zdHJ1Y3RvcgorICBDb25zdW1hYmxlQ2xhc3M8aW50PiB2YXI0KHZhcjApOyAgLy8gY29weSBjb25zdW1lZCB2YWx1ZQorCiAgICp2YXIwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW52YWxpZCBpbnZvY2F0aW9uIG9mIG1ldGhvZCAnb3BlcmF0b3IqJyBvbiBvYmplY3QgJ3ZhcjAnIHdoaWxlIGl0IGlzIGluIHRoZSAnY29uc3VtZWQnIHN0YXRlfX0KICAgKnZhcjE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbnZhbGlkIGludm9jYXRpb24gb2YgbWV0aG9kICdvcGVyYXRvcionIG9uIG9iamVjdCAndmFyMScgd2hpbGUgaXQgaXMgaW4gdGhlICdjb25zdW1lZCcgc3RhdGV9fQorICAqdmFyMjsKKyAgKnZhcjM7CisgICp2YXI0OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW52YWxpZCBpbnZvY2F0aW9uIG9mIG1ldGhvZCAnb3BlcmF0b3IqJyBvbiBvYmplY3QgJ3ZhcjQnIHdoaWxlIGl0IGlzIGluIHRoZSAnY29uc3VtZWQnIHN0YXRlfX0KKworICB2YXIwID0gQ29uc3VtYWJsZUNsYXNzPGludD4oNDIpOworICAqdmFyMDsKKyAgCisgIHZhcjAgPSB2YXIxOworICAqdmFyMDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2ludmFsaWQgaW52b2NhdGlvbiBvZiBtZXRob2QgJ29wZXJhdG9yKicgb24gb2JqZWN0ICd2YXIwJyB3aGlsZSBpdCBpcyBpbiB0aGUgJ2NvbnN1bWVkJyBzdGF0ZX19CiAgIAogICBpZiAodmFyMC5pc1ZhbGlkKCkpIHsKICAgICAqdmFyMDsKQEAgLTk4LDE5ICsxMDgsMTYgQEAKIH0KIAogdm9pZCB0ZXN0RGVzdHJ1Y3Rpb24oKSB7Ci0gIERlc3RydWN0b3JUZXN0ZXIgRDAoNDIpLCBEMSg0Mik7CisgIERlc3RydWN0b3JUZXN0ZXIgRDAoNDIpLCBEMSg0MiksIEQyOwogICAKICAgKkQwOwogICAqRDE7Ci0gIAotICBEZXN0cnVjdG9yVGVzdGVyIEQyOwotICAqRDI7CisgICpEMjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2ludmFsaWQgaW52b2NhdGlvbiBvZiBtZXRob2QgJ29wZXJhdG9yKicgb24gb2JqZWN0ICdEMicgd2hpbGUgaXQgaXMgaW4gdGhlICdjb25zdW1lZCcgc3RhdGV9fQogICAKICAgRDAufkRlc3RydWN0b3JUZXN0ZXIoKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2ludmFsaWQgaW52b2NhdGlvbiBvZiBtZXRob2QgJ35EZXN0cnVjdG9yVGVzdGVyJyBvbiBvYmplY3QgJ0QwJyB3aGlsZSBpdCBpcyBpbiB0aGUgJ3VuY29uc3VtZWQnIHN0YXRlfX0KICAgCiAgIHJldHVybjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2ludmFsaWQgaW52b2NhdGlvbiBvZiBtZXRob2QgJ35EZXN0cnVjdG9yVGVzdGVyJyBvbiBvYmplY3QgJ0QwJyB3aGlsZSBpdCBpcyBpbiB0aGUgJ3VuY29uc3VtZWQnIHN0YXRlfX0gXAotICAgICAgICAgICAgIGV4cGVjdGVkLXdhcm5pbmcge3tpbnZhbGlkIGludm9jYXRpb24gb2YgbWV0aG9kICd+RGVzdHJ1Y3RvclRlc3Rlcicgb24gb2JqZWN0ICdEMScgd2hpbGUgaXQgaXMgaW4gdGhlICd1bmNvbnN1bWVkJyBzdGF0ZX19IFwKLSAgICAgICAgICAgICBleHBlY3RlZC13YXJuaW5nIHt7aW52YWxpZCBpbnZvY2F0aW9uIG9mIG1ldGhvZCAnfkRlc3RydWN0b3JUZXN0ZXInIG9uIG9iamVjdCAnRDInIHdoaWxlIGl0IGlzIGluIHRoZSAndW5jb25zdW1lZCcgc3RhdGV9fQorICAgICAgICAgICAgIGV4cGVjdGVkLXdhcm5pbmcge3tpbnZhbGlkIGludm9jYXRpb24gb2YgbWV0aG9kICd+RGVzdHJ1Y3RvclRlc3Rlcicgb24gb2JqZWN0ICdEMScgd2hpbGUgaXQgaXMgaW4gdGhlICd1bmNvbnN1bWVkJyBzdGF0ZX19CiB9CiAKIHZvaWQgdGVzdFRlbXBWYWx1ZSgpIHsKQEAgLTQyNyw2ICs0MzQsMjkgQEAKICAgdGVzdFBhcmFtVHlwZXN0YXRlQ2FsbGVlKFZhcjAsIFZhcjEpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7YXJndW1lbnQgbm90IGluIGV4cGVjdGVkIHN0YXRlOyBleHBlY3RlZCAnY29uc3VtZWQnLCBvYnNlcnZlZCAndW5jb25zdW1lZCd9fQogfQogCisKK3ZvaWQgY29uc3VtZUZ1bmMoQ29uc3VtYWJsZUNsYXNzPGludD4gUCBQQVJBTV9UWVBFU1RBVEUodW5jb25zdW1lZCkpOworc3RydWN0IFBhcmFtVGVzdCB7CisgIHN0YXRpYyB2b2lkIGNvbnN1bWVGdW5jU3RhdGljKENvbnN1bWFibGVDbGFzczxpbnQ+IFAgUEFSQU1fVFlQRVNUQVRFKHVuY29uc3VtZWQpKTsKKyAgdm9pZCBjb25zdW1lRnVuY01ldGgoQ29uc3VtYWJsZUNsYXNzPGludD4gUCBQQVJBTV9UWVBFU1RBVEUodW5jb25zdW1lZCkpOworICB2b2lkIG9wZXJhdG9yPDwoQ29uc3VtYWJsZUNsYXNzPGludD4gUCBQQVJBTV9UWVBFU1RBVEUodW5jb25zdW1lZCkpOworfTsKKwordm9pZCBvcGVyYXRvcj4+KFBhcmFtVGVzdCYgcHQsIENvbnN1bWFibGVDbGFzczxpbnQ+IFAgUEFSQU1fVFlQRVNUQVRFKHVuY29uc3VtZWQpKTsKKworCit2b2lkIHRlc3RGdW5jdGlvblBhcmFtcygpIHsKKyAgLy8gTWFrZSBzdXJlIHdlIGhhbmRsZSB0aGUgZGlmZmVyZW50IGtpbmRzIG9mIGZ1bmN0aW9ucy4KKyAgQ29uc3VtYWJsZUNsYXNzPGludD4gUDsKKworICBjb25zdW1lRnVuYyhQKTsgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2FyZ3VtZW50IG5vdCBpbiBleHBlY3RlZCBzdGF0ZTsgZXhwZWN0ZWQgJ3VuY29uc3VtZWQnLCBvYnNlcnZlZCAnY29uc3VtZWQnfX0KKyAgUGFyYW1UZXN0Ojpjb25zdW1lRnVuY1N0YXRpYyhQKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3thcmd1bWVudCBub3QgaW4gZXhwZWN0ZWQgc3RhdGU7IGV4cGVjdGVkICd1bmNvbnN1bWVkJywgb2JzZXJ2ZWQgJ2NvbnN1bWVkJ319CisgIFBhcmFtVGVzdCBwdDsKKyAgcHQuY29uc3VtZUZ1bmNNZXRoKFApOyAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3thcmd1bWVudCBub3QgaW4gZXhwZWN0ZWQgc3RhdGU7IGV4cGVjdGVkICd1bmNvbnN1bWVkJywgb2JzZXJ2ZWQgJ2NvbnN1bWVkJ319CisgIHB0IDw8IFA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7YXJndW1lbnQgbm90IGluIGV4cGVjdGVkIHN0YXRlOyBleHBlY3RlZCAndW5jb25zdW1lZCcsIG9ic2VydmVkICdjb25zdW1lZCd9fQorICBwdCA+PiBQOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2FyZ3VtZW50IG5vdCBpbiBleHBlY3RlZCBzdGF0ZTsgZXhwZWN0ZWQgJ3VuY29uc3VtZWQnLCBvYnNlcnZlZCAnY29uc3VtZWQnfX0KK30KKwogdm9pZCBiYWYzKENvbnN1bWFibGVDbGFzczxpbnQ+IHZhcikgewogICAqdmFyOwogfQpAQCAtNjQ1LDEyICs2NzUsMTcgQEAKIH0gLy8gZW5kIG5hbWVzcGFjZSBDb250aW51ZUlDRVRlc3QKIAogCi1uYW1lc3BhY2UgSW5pdGlhbGl6ZXJBc3NlcnRpb25GYWlsVGVzdCB7CituYW1lc3BhY2UgU3RhdHVzVXNlQ2FzZVRlc3RzIHsKIAotY2xhc3MgQ09OU1VNQUJMRSh1bmNvbnN1bWVkKSBTdGF0dXMgeworY2xhc3MgQ09OU1VNQUJMRSh1bmNvbnN1bWVkKQorICAgICAgX19hdHRyaWJ1dGVfXygoY29uc3VtYWJsZV9hdXRvX2Nhc3Rfc3RhdGUpKQorICAgICAgX19hdHRyaWJ1dGVfXygoY29uc3VtYWJsZV9zZXRfc3RhdGVfb25fcmVhZCkpCisgICAgU3RhdHVzIHsKICAgaW50IGNvZGU7CiAKIHB1YmxpYzoKKyAgc3RhdGljIFN0YXR1cyBPSzsKKwogICBTdGF0dXMoKSBSRVRVUk5fVFlQRVNUQVRFKGNvbnN1bWVkKTsKICAgU3RhdHVzKGludCBjKSBSRVRVUk5fVFlQRVNUQVRFKHVuY29uc3VtZWQpOwogCkBAIC02NjAsNiArNjk1LDggQEAKICAgU3RhdHVzJiBvcGVyYXRvcj0oY29uc3QgU3RhdHVzICZvdGhlcikgQ0FMTEFCTEVfV0hFTigidW5rbm93biIsICJjb25zdW1lZCIpOwogICBTdGF0dXMmIG9wZXJhdG9yPShTdGF0dXMgJiZvdGhlcikgQ0FMTEFCTEVfV0hFTigidW5rbm93biIsICJjb25zdW1lZCIpOwogCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdGF0dXMgJm90aGVyKSBjb25zdCBTRVRfVFlQRVNUQVRFKGNvbnN1bWVkKTsKKwogICBib29sIGNoZWNrKCkgIGNvbnN0IFNFVF9UWVBFU1RBVEUoY29uc3VtZWQpOwogICB2b2lkIGlnbm9yZSgpIGNvbnN0IFNFVF9UWVBFU1RBVEUoY29uc3VtZWQpOwogICAvLyBTdGF0dXMmIG1hcmtBc0NoZWNrZWQoKSB7IHJldHVybiAqdGhpczsgfQpAQCAtNjczLDcgKzcxMCwxNCBAQAogYm9vbCAgIGNvbmQoKTsKIFN0YXR1cyBkb1NvbWV0aGluZygpOwogdm9pZCAgIGhhbmRsZVN0YXR1cyhjb25zdCBTdGF0dXMmIHMgUkVUVVJOX1RZUEVTVEFURShjb25zdW1lZCkpOwotdm9pZCAgIGhhbmRsZVN0YXR1c1B0cihjb25zdCBTdGF0dXMqIHMpOwordm9pZCAgIGhhbmRsZVN0YXR1c1JlZihTdGF0dXMmIHMpOwordm9pZCAgIGhhbmRsZVN0YXR1c1B0cihTdGF0dXMqIHMpOwordm9pZCAgIGhhbmRsZVN0YXR1c1VubWFya2VkKGNvbnN0IFN0YXR1cyYgcyk7CisKK3ZvaWQgICBsb2coY29uc3QgY2hhciogbXNnKTsKK3ZvaWQgICBmYWlsKCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKK3ZvaWQgICBjaGVja1N0YXQoY29uc3QgU3RhdHVzJiBzKTsKKwogCiB2b2lkIHRlc3RTaW1wbGVUZW1wb3JhcmllczAoKSB7CiAgIGRvU29tZXRoaW5nKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbnZhbGlkIGludm9jYXRpb24gb2YgbWV0aG9kICd+U3RhdHVzJyBvbiBhIHRlbXBvcmFyeSBvYmplY3Qgd2hpbGUgaXQgaXMgaW4gdGhlICd1bmNvbnN1bWVkJyBzdGF0ZX19CkBAIC02OTEsNiArNzM1LDE1IEBACiAgIFN0YXR1cyBzID0gZG9Tb21ldGhpbmcoKTsKIH0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbnZhbGlkIGludm9jYXRpb24gb2YgbWV0aG9kICd+U3RhdHVzJyBvbiBvYmplY3QgJ3MnIHdoaWxlIGl0IGlzIGluIHRoZSAndW5jb25zdW1lZCcgc3RhdGV9fQogCitTdGF0dXMgdGVzdFNpbXBsZVRlbXBvcmFyaWVzUmV0dXJuMCgpIHsKKyAgcmV0dXJuIGRvU29tZXRoaW5nKCk7Cit9CisKK1N0YXR1cyB0ZXN0U2ltcGxlVGVtcG9yYXJpZXNSZXR1cm4xKCkgeworICBTdGF0dXMgcyA9IGRvU29tZXRoaW5nKCk7CisgIHJldHVybiBzOworfQorCiB2b2lkIHRlc3RTaW1wbGVUZW1wb3JhcmllczQoKSB7CiAgIFN0YXR1cyBzID0gZG9Tb21ldGhpbmcoKTsKICAgcy5jaGVjaygpOwpAQCAtNzAyLDggKzc1NSwxNyBAQAogfQogCiB2b2lkIHRlc3RTaW1wbGVUZW1wb3JhcmllczYoKSB7Ci0gIFN0YXR1cyBzID0gZG9Tb21ldGhpbmcoKTsKLSAgaGFuZGxlU3RhdHVzKHMpOworICBTdGF0dXMgczEgPSBkb1NvbWV0aGluZygpOworICBoYW5kbGVTdGF0dXMoczEpOworCisgIFN0YXR1cyBzMiA9IGRvU29tZXRoaW5nKCk7CisgIGhhbmRsZVN0YXR1c1JlZihzMik7CisKKyAgU3RhdHVzIHMzID0gZG9Tb21ldGhpbmcoKTsKKyAgaGFuZGxlU3RhdHVzUHRyKCZzMyk7CisKKyAgU3RhdHVzIHM0ID0gZG9Tb21ldGhpbmcoKTsKKyAgaGFuZGxlU3RhdHVzVW5tYXJrZWQoczQpOwogfQogCiB2b2lkIHRlc3RTaW1wbGVUZW1wb3JhcmllczcoKSB7CkBAIC03NDUsMzggKzgwNyw1OCBAQAogfQogCiB2b2lkIHRlc3RUZW1wb3Jhcmllc0FuZENvbnN0cnVjdG9yczAoKSB7Ci0gIFN0YXR1cyBzKGRvU29tZXRoaW5nKCkpOworICBTdGF0dXMgcyhkb1NvbWV0aGluZygpKTsgICAgLy8gVGVzdCB0aGUgY29weSBjb25zdHJ1Y3Rvci4KICAgcy5jaGVjaygpOwogfQogCi12b2lkIHRlc3RUZW1wb3Jhcmllc0FuZENvbnN0cnVjdG9yczEoKSB7Ci0gIC8vIFRlc3QgdGhlIGNvcHkgY29uc3RydWN0b3IuCi0gIAotICBTdGF0dXMgczEgPSBkb1NvbWV0aGluZygpOwotICBTdGF0dXMgczIoczEpOwotICBzMi5jaGVjaygpOwotfSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2ludmFsaWQgaW52b2NhdGlvbiBvZiBtZXRob2QgJ35TdGF0dXMnIG9uIG9iamVjdCAnczEnIHdoaWxlIGl0IGlzIGluIHRoZSAndW5jb25zdW1lZCcgc3RhdGV9fQordm9pZCB0ZXN0VGVtcG9yYXJpZXNBbmRDb25zdHJ1Y3RvcnMxRigpIHsKKyAgU3RhdHVzIHMxID0gZG9Tb21ldGhpbmcoKTsgIC8vIFRlc3QgdGhlIGNvcHkgY29uc3RydWN0b3IuCisgIFN0YXR1cyBzMiA9IHMxOworfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW52YWxpZCBpbnZvY2F0aW9uIG9mIG1ldGhvZCAnflN0YXR1cycgb24gb2JqZWN0ICdzMicgd2hpbGUgaXQgaXMgaW4gdGhlICd1bmNvbnN1bWVkJyBzdGF0ZX19CiAKLXZvaWQgdGVzdFRlbXBvcmFyaWVzQW5kQ29uc3RydWN0b3JzMigpIHsKLSAgLy8gVGVzdCB0aGUgbW92ZSBjb25zdHJ1Y3Rvci4KLSAgCi0gIFN0YXR1cyBzMSA9IGRvU29tZXRoaW5nKCk7Ci0gIFN0YXR1cyBzMihzdGF0aWNfY2FzdDxTdGF0dXMmJj4oczEpKTsKK3ZvaWQgdGVzdFRlbXBvcmFyaWVzQW5kQ29uc3RydWN0b3JzMVMoKSB7CisgIFN0YXR1cyBzMSA9IGRvU29tZXRoaW5nKCk7ICAvLyBUZXN0IHRoZSBjb3B5IGNvbnN0cnVjdG9yLgorICBTdGF0dXMgczIoczEpOwogICBzMi5jaGVjaygpOwogfQogCi12b2lkIHRlc3RUZW1wb3Jhcmllc0FuZE9wZXJhdG9yczAoKSB7Cit2b2lkIHRlc3RUZW1wb3Jhcmllc0FuZENvbnN0cnVjdG9yczJGKCkgeworICAvLyBUZXN0IHRoZSBtb3ZlIGNvbnN0cnVjdG9yLgorICBTdGF0dXMgczEgPSBkb1NvbWV0aGluZygpOworICBTdGF0dXMgczIgPSBzdGF0aWNfY2FzdDxTdGF0dXMmJj4oczEpOworfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW52YWxpZCBpbnZvY2F0aW9uIG9mIG1ldGhvZCAnflN0YXR1cycgb24gb2JqZWN0ICdzMicgd2hpbGUgaXQgaXMgaW4gdGhlICd1bmNvbnN1bWVkJyBzdGF0ZX19CisKK3ZvaWQgdGVzdFRlbXBvcmFyaWVzQW5kQ29uc3RydWN0b3JzMlMoKSB7CisgIC8vIFRlc3QgdGhlIG1vdmUgY29uc3RydWN0b3IuCisgIFN0YXR1cyBzMSA9IGRvU29tZXRoaW5nKCk7CisgIFN0YXR1cyBzMiA9IHN0YXRpY19jYXN0PFN0YXR1cyYmPihzMSk7CisgIHMyLmNoZWNrKCk7Cit9CisKK3ZvaWQgdGVzdFRlbXBvcmFyaWVzQW5kT3BlcmF0b3JzMEYoKSB7CiAgIC8vIFRlc3QgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCi0gIAorICBTdGF0dXMgczEgPSBkb1NvbWV0aGluZygpOworICBTdGF0dXMgczI7CisgIHMyID0gczE7Cit9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbnZhbGlkIGludm9jYXRpb24gb2YgbWV0aG9kICd+U3RhdHVzJyBvbiBvYmplY3QgJ3MyJyB3aGlsZSBpdCBpcyBpbiB0aGUgJ3VuY29uc3VtZWQnIHN0YXRlfX0KKwordm9pZCB0ZXN0VGVtcG9yYXJpZXNBbmRPcGVyYXRvcnMwUygpIHsKKyAgLy8gVGVzdCB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4KICAgU3RhdHVzIHMxID0gZG9Tb21ldGhpbmcoKTsKICAgU3RhdHVzIHMyOwogICBzMiA9IHMxOwogICBzMi5jaGVjaygpOwotfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW52YWxpZCBpbnZvY2F0aW9uIG9mIG1ldGhvZCAnflN0YXR1cycgb24gb2JqZWN0ICdzMScgd2hpbGUgaXQgaXMgaW4gdGhlICd1bmNvbnN1bWVkJyBzdGF0ZX19Cit9CiAKLXZvaWQgdGVzdFRlbXBvcmFyaWVzQW5kT3BlcmF0b3JzMSgpIHsKK3ZvaWQgdGVzdFRlbXBvcmFyaWVzQW5kT3BlcmF0b3JzMUYoKSB7CiAgIC8vIFRlc3QgdGhlIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KLSAgCisgIFN0YXR1cyBzMSA9IGRvU29tZXRoaW5nKCk7CisgIFN0YXR1cyBzMjsKKyAgczIgPSBzdGF0aWNfY2FzdDxTdGF0dXMmJj4oczEpOworfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW52YWxpZCBpbnZvY2F0aW9uIG9mIG1ldGhvZCAnflN0YXR1cycgb24gb2JqZWN0ICdzMicgd2hpbGUgaXQgaXMgaW4gdGhlICd1bmNvbnN1bWVkJyBzdGF0ZX19CisKK3ZvaWQgdGVzdFRlbXBvcmFyaWVzQW5kT3BlcmF0b3JzMVMoKSB7CisgIC8vIFRlc3QgdGhlIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KICAgU3RhdHVzIHMxID0gZG9Tb21ldGhpbmcoKTsKICAgU3RhdHVzIHMyOwogICBzMiA9IHN0YXRpY19jYXN0PFN0YXR1cyYmPihzMSk7CkBAIC03OTEsNSArODczLDYyIEBACiAgIHMyLmNoZWNrKCk7CiB9CiAKK1N0YXR1cyB0ZXN0UmV0dXJuQXV0b2Nhc3QoKSB7CisgIFN0YXR1cyBzID0gZG9Tb21ldGhpbmcoKTsKKyAgcy5jaGVjaygpOyAgLy8gY29uc3VtZSBzCisgIHJldHVybiBzOyAgIC8vIHNob3VsZCBhdXRvY2FzdCBiYWNrIHRvIHVuY29uc3VtZWQKK30KKworCituYW1lc3BhY2UgVGVzdFBhcmVucyB7CisKK3ZvaWQgdGVzdDMoKSB7CisgIGNoZWNrU3RhdCgoZG9Tb21ldGhpbmcoKSkpOworfQorCit2b2lkIHRlc3Q0KCkgeworICBTdGF0dXMgcyA9IChkb1NvbWV0aGluZygpKTsKKyAgcy5jaGVjaygpOworfQorCit2b2lkIHRlc3Q1KCkgeworICAoZG9Tb21ldGhpbmcoKSkuY2hlY2soKTsKK30KKwordm9pZCB0ZXN0NigpIHsKKyAgaWYgKChkb1NvbWV0aGluZygpKSA9PSBTdGF0dXM6Ok9LKQorICAgIHJldHVybjsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIFRlc3RQYXJlbnMKKwogfSAvLyBlbmQgbmFtZXNwYWNlIEluaXRpYWxpemVyQXNzZXJ0aW9uRmFpbFRlc3QKIAorCituYW1lc3BhY2Ugc3RkIHsKKyAgdm9pZCBtb3ZlKCk7CisgIHRlbXBsYXRlPGNsYXNzIFQ+CisgIHZvaWQgbW92ZShUJiYpOworCisgIG5hbWVzcGFjZSBfXzEgeworICAgIHZvaWQgbW92ZSgpOworICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgdm9pZCBtb3ZlKFQmJik7CisgIH0KK30KKworbmFtZXNwYWNlIFBSMTgyNjAgeworICBjbGFzcyBYIHsKKyAgICBwdWJsaWM6CisgICAgICB2b2lkIG1vdmUoKTsKKyAgfSB4OworCisgIHZvaWQgdGVzdCgpIHsKKyAgICB4Lm1vdmUoKTsKKyAgICBzdGQ6Om1vdmUoKTsKKyAgICBzdGQ6Om1vdmUoeCk7CisgICAgc3RkOjpfXzE6Om1vdmUoKTsKKyAgICBzdGQ6Ol9fMTo6bW92ZSh4KTsKKyAgfQorfSAvLyBlbmQgbmFtZXNwYWNlIFBSMTgyNjAKKwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3dhcm4tY29uc3VtZWQtcGFyc2luZy5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi1jb25zdW1lZC1wYXJzaW5nLmNwcAppbmRleCAwYTkxNjM2Li41YzBhMDRmIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvd2Fybi1jb25zdW1lZC1wYXJzaW5nLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvd2Fybi1jb25zdW1lZC1wYXJzaW5nLmNwcApAQCAtMTcsOSArMTcsOSBAQAogfQogCiBjbGFzcyBBdHRyVGVzdGVyMCB7Ci0gIHZvaWQgY29uc3VtZXMoKSAgICAgICBfX2F0dHJpYnV0ZV9fICgoc2V0X3R5cGVzdGF0ZSgpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXR0cmlidXRlIHRha2VzIG9uZSBhcmd1bWVudH19Ci0gIGJvb2wgdGVzdFVuY29uc3VtZWQoKSBfX2F0dHJpYnV0ZV9fICgodGVzdF90eXBlc3RhdGUoKSkpOyAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSB0YWtlcyBvbmUgYXJndW1lbnR9fQotICB2b2lkIGNhbGxhYmxlV2hlbigpICAgX19hdHRyaWJ1dGVfXyAoKGNhbGxhYmxlX3doZW4oKSkpOyAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KKyAgdm9pZCBjb25zdW1lcygpICAgICAgIF9fYXR0cmlidXRlX18gKChzZXRfdHlwZXN0YXRlKCkpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snc2V0X3R5cGVzdGF0ZScgYXR0cmlidXRlIHRha2VzIG9uZSBhcmd1bWVudH19CisgIGJvb2wgdGVzdFVuY29uc3VtZWQoKSBfX2F0dHJpYnV0ZV9fICgodGVzdF90eXBlc3RhdGUoKSkpOyAvLyBleHBlY3RlZC1lcnJvciB7eyd0ZXN0X3R5cGVzdGF0ZScgYXR0cmlidXRlIHRha2VzIG9uZSBhcmd1bWVudH19CisgIHZvaWQgY2FsbGFibGVXaGVuKCkgICBfX2F0dHJpYnV0ZV9fICgoY2FsbGFibGVfd2hlbigpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J2NhbGxhYmxlX3doZW4nIGF0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KIH07CiAKIGludCB2YXIwIFNFVF9UWVBFU1RBVEUoY29uc3VtZWQpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3NldF90eXBlc3RhdGUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gbWV0aG9kc319CkBAIC01MywzICs1MywxMyBAQAogfTsKIAogY2xhc3MgQ09OU1VNQUJMRSg0MikgQXR0clRlc3RlcjM7IC8vIGV4cGVjdGVkLWVycm9yIHt7J2NvbnN1bWFibGUnIGF0dHJpYnV0ZSByZXF1aXJlcyBhbiBpZGVudGlmaWVyfX0KKworCitjbGFzcyBDT05TVU1BQkxFKHVuY29uc3VtZWQpCisgICAgICBfX2F0dHJpYnV0ZV9fKChjb25zdW1hYmxlX2F1dG9fY2FzdF9zdGF0ZSkpCisgICAgICBfX2F0dHJpYnV0ZV9fKChjb25zdW1hYmxlX3NldF9zdGF0ZV9vbl9yZWFkKSkKKyAgICAgIFN0YXR1cyB7Cit9OworCisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3dhcm4tZXhpdC10aW1lLWRlc3RydWN0b3JzLmNwcCBiL3Rlc3QvU2VtYUNYWC93YXJuLWV4aXQtdGltZS1kZXN0cnVjdG9ycy5jcHAKaW5kZXggZjQ5MTM0Yi4uMTI0NTc2YSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3dhcm4tZXhpdC10aW1lLWRlc3RydWN0b3JzLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvd2Fybi1leGl0LXRpbWUtZGVzdHJ1Y3RvcnMuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLVdleGl0LXRpbWUtZGVzdHJ1Y3RvcnMgJXMgLXZlcmlmeQorLy8gUlVOOiAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWZzeW50YXgtb25seSAtV2V4aXQtdGltZS1kZXN0cnVjdG9ycyAlcyAtdmVyaWZ5CiAKIG5hbWVzcGFjZSB0ZXN0MSB7CiAgIHN0cnVjdCBBIHsgfkEoKTsgfTsKQEAgLTIzLDUgKzIzLDIzIEBACiAgIHN0YXRpYyBBICZlID0gYls1XTsKICAgc3RhdGljIEEgJmYgPSBjWzVdWzddOwogfQorfQogCituYW1lc3BhY2UgdGVzdDMgeworICBzdHJ1Y3QgQSB7IH5BKCkgPSBkZWZhdWx0OyB9OworICBBIGE7CisKKyAgc3RydWN0IEIgeyB+QigpOyB9OworICBzdHJ1Y3QgQyA6IEIgeyB+QygpID0gZGVmYXVsdDsgfTsKKyAgQyBjOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhpdC10aW1lIGRlc3RydWN0b3J9fQorCisgIGNsYXNzIEQgeworICAgIGZyaWVuZCBzdHJ1Y3QgRTsKKyAgICB+RCgpID0gZGVmYXVsdDsKKyAgfTsKKyAgc3RydWN0IEUgOiBEIHsKKyAgICBEIGQ7CisgICAgfkUoKSA9IGRlZmF1bHQ7CisgIH07CisgIEUgZTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLWZ1bmMtYXMtYm9vbC5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi1mdW5jLWFzLWJvb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWRmNzQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvU2VtYUNYWC93YXJuLWZ1bmMtYXMtYm9vbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXggYysrIC12ZXJpZnkgLWZzeW50YXgtb25seSAlcwotCi12b2lkIGYxKCk7Ci0KLXN0cnVjdCBTIHsKLSAgc3RhdGljIHZvaWQgZjIoKTsKLX07Ci0KLWV4dGVybiB2b2lkIGYzKCkgX19hdHRyaWJ1dGVfXygod2Vha19pbXBvcnQpKTsKLQotc3RydWN0IFMyIHsKLSAgc3RhdGljIHZvaWQgZjQoKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrX2ltcG9ydCkpOwotfTsKLQotYm9vbCBmNSgpOwotYm9vbCBmNihpbnQpOwotCi12b2lkIGJhcigpIHsKLSAgYm9vbCBiOwotCi0gIGIgPSBmMTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2FkZHJlc3Mgb2YgZnVuY3Rpb24gJ2YxJyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAndHJ1ZSd9fSBcCi0gICAgICAgICAgICAgZXhwZWN0ZWQtbm90ZSB7e3ByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nfX0KLSAgaWYgKGYxKSB7fSAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWRkcmVzcyBvZiBmdW5jdGlvbiAnZjEnIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICd0cnVlJ319IFwKLSAgICAgICAgICAgICAgICBleHBlY3RlZC1ub3RlIHt7cHJlZml4IHdpdGggdGhlIGFkZHJlc3Mtb2Ygb3BlcmF0b3IgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmd9fQotICBiID0gUzo6ZjI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3thZGRyZXNzIG9mIGZ1bmN0aW9uICdTOjpmMicgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ3RydWUnfX0gXAotICAgICAgICAgICAgICAgIGV4cGVjdGVkLW5vdGUge3twcmVmaXggd2l0aCB0aGUgYWRkcmVzcy1vZiBvcGVyYXRvciB0byBzaWxlbmNlIHRoaXMgd2FybmluZ319Ci0gIGlmIChTOjpmMikge30gLy8gZXhwZWN0ZWQtd2FybmluZyB7e2FkZHJlc3Mgb2YgZnVuY3Rpb24gJ1M6OmYyJyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAndHJ1ZSd9fSBcCi0gICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtbm90ZSB7e3ByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nfX0KLSAgYiA9IGY1OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWRkcmVzcyBvZiBmdW5jdGlvbiAnZjUnIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICd0cnVlJ319IFwKLSAgICAgICAgICAgICBleHBlY3RlZC1ub3RlIHt7cHJlZml4IHdpdGggdGhlIGFkZHJlc3Mtb2Ygb3BlcmF0b3IgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmd9fSBcCi0gICAgICAgICAgICAgZXhwZWN0ZWQtbm90ZSB7e3N1ZmZpeCB3aXRoIHBhcmVudGhlc2VzIHRvIHR1cm4gdGhpcyBpbnRvIGEgZnVuY3Rpb24gY2FsbH19Ci0gIGIgPSBmNjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2FkZHJlc3Mgb2YgZnVuY3Rpb24gJ2Y2JyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAndHJ1ZSd9fSBcCi0gICAgICAgICAgICAgZXhwZWN0ZWQtbm90ZSB7e3ByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nfX0KLQotICAvLyBpbXBsaWNpdCBjYXN0cyBvZiB3ZWFrbHkgaW1wb3J0ZWQgc3ltYm9scyBhcmUgb2s6Ci0gIGIgPSBmMzsKLSAgaWYgKGYzKSB7fQotICBiID0gUzI6OmY0OwotICBpZiAoUzI6OmY0KSB7fQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3dhcm4tZ2xvYmFsLWNvbnN0cnVjdG9ycy5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi1nbG9iYWwtY29uc3RydWN0b3JzLmNwcAppbmRleCBmNTdmMGRlLi45MGQ4NTU4IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvd2Fybi1nbG9iYWwtY29uc3RydWN0b3JzLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvd2Fybi1nbG9iYWwtY29uc3RydWN0b3JzLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC1XZ2xvYmFsLWNvbnN0cnVjdG9ycyAlcyAtdmVyaWZ5CisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZnN5bnRheC1vbmx5IC1XZ2xvYmFsLWNvbnN0cnVjdG9ycyAlcyAtdmVyaWZ5CiAKIGludCBvcGFxdWVfaW50KCk7CiAKQEAgLTEwMSwzICsxMDEsMjIgQEAKICAgaW50IGE7CiAgIEEgYiA9IHsgYSB9OwogfQorCituYW1lc3BhY2UgcHIxOTI1MyB7CisgIHN0cnVjdCBBIHsgfkEoKSA9IGRlZmF1bHQ7IH07CisgIEEgYTsKKworICBzdHJ1Y3QgQiB7IH5CKCk7IH07CisgIHN0cnVjdCBDIDogQiB7IH5DKCkgPSBkZWZhdWx0OyB9OworICBDIGM7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tnbG9iYWwgZGVzdHJ1Y3Rvcn19CisKKyAgY2xhc3MgRCB7CisgICAgZnJpZW5kIHN0cnVjdCBFOworICAgIH5EKCkgPSBkZWZhdWx0OworICB9OworICBzdHJ1Y3QgRSA6IEQgeworICAgIEQgZDsKKyAgICB+RSgpID0gZGVmYXVsdDsKKyAgfTsKKyAgRSBlOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3dhcm4taW5maW5pdGUtcmVjdXJzaW9uLmNwcCBiL3Rlc3QvU2VtYUNYWC93YXJuLWluZmluaXRlLXJlY3Vyc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiN2M1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC93YXJuLWluZmluaXRlLXJlY3Vyc2lvbi5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLVdpbmZpbml0ZS1yZWN1cnNpb24KKwordm9pZCBhKCkgeyAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Y2FsbCBpdHNlbGZ9fQorICBhKCk7Cit9CisKK3ZvaWQgYihpbnQgeCkgeyAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Y2FsbCBpdHNlbGZ9fQorICBpZiAoeCkKKyAgICBiKHgpOworICBlbHNlCisgICAgYih4KzEpOworfQorCit2b2lkIGMoaW50IHgpIHsKKyAgaWYgKHgpCisgICAgYyg1KTsKK30KKwordm9pZCBkKGludCB4KSB7ICAvLyBleHBlY3RlZC13YXJuaW5ne3tjYWxsIGl0c2VsZn19CisgIGlmICh4KQorICAgICsreDsKKyAgcmV0dXJuIGQoeCk7Cit9CisKKy8vIERvZXNuJ3Qgd2FybiBvbiBtdXR1YWxseSByZWN1cnNpdmUgZnVuY3Rpb25zCit2b2lkIGUoKTsKK3ZvaWQgZigpOworCit2b2lkIGUoKSB7IGYoKTsgfQordm9pZCBmKCkgeyBlKCk7IH0KKworLy8gRG9uJ3Qgd2FybiBvbiBpbmZpbml0ZSBsb29wcwordm9pZCBnKCkgeworICB3aGlsZSAodHJ1ZSkKKyAgICBnKCk7CisKKyAgZygpOworfQorCit2b2lkIGgoaW50IHgpIHsKKyAgd2hpbGUgKHggPCA1KSB7CisgICAgaCh4KzEpOworICB9Cit9CisKK3ZvaWQgaShpbnQgeCkgeyAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Y2FsbCBpdHNlbGZ9fQorICB3aGlsZSAoeCA8IDUpIHsKKyAgICAtLXg7CisgIH0KKyAgaSgwKTsKK30KKworaW50IGooKSB7ICAvLyBleHBlY3RlZC13YXJuaW5ne3tjYWxsIGl0c2VsZn19CisgIHJldHVybiA1ICsgaigpOworfQorCitjbGFzcyBTIHsKKyAgc3RhdGljIHZvaWQgYSgpOworICB2b2lkIGIoKTsKK307CisKK3ZvaWQgUzo6YSgpIHsgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e2NhbGwgaXRzZWxmfX0KKyAgcmV0dXJuIGEoKTsKK30KKwordm9pZCBTOjpiKCkgeyAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Y2FsbCBpdHNlbGZ9fQorICBpbnQgaSA9IDA7CisgIGRvIHsKKyAgICArK2k7CisgICAgYigpOworICB9IHdoaWxlIChpID4gNSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIG1lbWJlcj4KK3N0cnVjdCBUIHsKKyAgbWVtYmVyIG07CisgIHZvaWQgYSgpIHsgcmV0dXJuIGEoKTsgfSAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7Y2FsbCBpdHNlbGZ9fQorICBzdGF0aWMgdm9pZCBiKCkgeyByZXR1cm4gYigpOyB9ICAvLyBleHBlY3RlZC13YXJuaW5ne3tjYWxsIGl0c2VsZn19Cit9OworCit2b2lkIHRlc3RfVCgpIHsKKyAgVDxpbnQ+IGZvbzsKKyAgZm9vLmEoKTsgIC8vIGV4cGVjdGVkLW5vdGV7e2luIGluc3RhbnRpYXRpb259fQorICBmb28uYigpOyAgLy8gZXhwZWN0ZWQtbm90ZXt7aW4gaW5zdGFudGlhdGlvbn19Cit9CisKK2NsYXNzIFUgeworICBVKiB1OworICB2b2lkIEZ1bigpIHsgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e2NhbGwgaXRzZWxmfX0KKyAgICB1LT5GdW4oKTsKKyAgfQorfTsKKworLy8gTm8gd2FybmluZ3Mgb24gdGVtcGxhdGVkIGZ1bmN0aW9ucworLy8gc3VtPDA+KCkgaXMgaW5zdGFudGlhdGVkLCBkb2VzIHJlY3Vyc2l2ZWx5IGNhbGwgaXRzZWxmLCBidXQgbmV2ZXIgcnVucy4KK3RlbXBsYXRlIDxpbnQgdmFsdWU+CitpbnQgc3VtKCkgeworICByZXR1cm4gdmFsdWUgKyBzdW08dmFsdWUvMj4oKTsKK30KKwordGVtcGxhdGU8PgoraW50IHN1bTwxPigpIHsgcmV0dXJuIDE7IH0KKwordGVtcGxhdGU8aW50IHgsIGludCB5PgoraW50IGNhbGN1bGF0ZV92YWx1ZSgpIHsKKyAgaWYgKHggIT0geSkKKyAgICByZXR1cm4gc3VtPHggLSB5PigpOyAgLy8gVGhpcyBpbnN0YW50aWF0ZXMgc3VtPDA+KCkgZXZlbiBpZiBuZXZlciBjYWxsZWQuCisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworaW50IHZhbHVlID0gY2FsY3VsYXRlX3ZhbHVlPDEsMT4oKTsKKwordm9pZCBEb1NvbWV0aGluZ0hlcmUoKTsKKworLy8gRG9TdHVmZjwwLDA+KCkgaXMgaW5zdGFudGlhdGVkLCBidXQgbmV2ZXIgY2FsbGVkLgordGVtcGxhdGU8aW50IEZpcnN0LCBpbnQgTGFzdD4KK2ludCBEb1N0dWZmKCkgeworICBpZiAoRmlyc3QgKyAxID09IExhc3QpIHsKKyAgICAvLyBUaGlzIGJyYW5jaCBnZXRzIHJlbW92ZWQgZHVyaW5nIDwwLCAwPiBpbnN0YW50aWF0aW9uIGluIHNvIENGRyBmb3IgdGhpcworICAgIC8vIGZ1bmN0aW9uIGdvZXMgc3RyYWlnaHQgdG8gdGhlIGVsc2UgYnJhbmNoLgorICAgIERvU29tZXRoaW5nSGVyZSgpOworICB9IGVsc2UgeworICAgIERvU3R1ZmY8Rmlyc3QsIChGaXJzdCArIExhc3QpLzI+KCk7CisgICAgRG9TdHVmZjwoRmlyc3QgKyBMYXN0KS8yLCBMYXN0PigpOworICB9CisgIHJldHVybiAwOworfQoraW50IHN0dWZmID0gRG9TdHVmZjwwLCAxPigpOworCit0ZW1wbGF0ZTxpbnQgeD4KK3N0cnVjdCBXcmFwcGVyIHsKKyAgc3RhdGljIGludCBydW4oKSB7CisgICAgLy8gU2ltaWxhciB0byB0aGUgYWJvdmUsIFdyYXBwZXI8MD46OnJ1bigpIHdpbGwgZGlzY2FyZCB0aGUgaWYgc3RhdGVtZW50LgorICAgIGlmICh4ID09IDEpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gV3JhcHBlcjx4LzI+OjpydW4oKTsKKyAgfQorICBzdGF0aWMgaW50IHJ1bjIoKSB7ICAvLyBleHBlY3RlZC13YXJuaW5ne3tjYWxsIGl0c2VsZn19CisgICAgcmV0dXJuIHJ1bjIoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGludCB4PgoraW50IHRlc3Rfd3JhcHBlcigpIHsKKyAgaWYgKHggIT0gMCkKKyAgICByZXR1cm4gV3JhcHBlcjx4Pjo6cnVuKCkgKworICAgICAgICAgICBXcmFwcGVyPHg+OjpydW4yKCk7ICAvLyBleHBlY3RlZC1ub3Rle3tpbnN0YW50aWF0aW9ufX0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCB3cmFwcGVyX3N1bSA9IHRlc3Rfd3JhcHBlcjwyPigpOyAgLy8gZXhwZWN0ZWQtbm90ZXt7aW5zdGFudGlhdGlvbn19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvd2Fybi1tZW1zaXplLWNvbXBhcmlzb24uY3BwIGIvdGVzdC9TZW1hQ1hYL3dhcm4tbWVtc2l6ZS1jb21wYXJpc29uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGM0MTBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tbWVtc2l6ZS1jb21wYXJpc29uLmNwcApAQCAtMCwwICsxLDkzIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisvLworCit0eXBlZGVmIF9fU0laRV9UWVBFX18gc2l6ZV90OworZXh0ZXJuICJDIiB2b2lkICptZW1zZXQodm9pZCAqLCBpbnQsIHNpemVfdCk7CitleHRlcm4gIkMiIHZvaWQgKm1lbW1vdmUodm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3Qgbik7CitleHRlcm4gIkMiIHZvaWQgKm1lbWNweSh2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuKTsKK2V4dGVybiAiQyIgdm9pZCAqbWVtY21wKHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOworZXh0ZXJuICJDIiBpbnQgc3RybmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKTsKK2V4dGVybiAiQyIgaW50IHN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pOworZXh0ZXJuICJDIiBjaGFyICpzdHJuY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgbik7CitleHRlcm4gIkMiIGNoYXIgKnN0cm5jYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBuKTsKK2V4dGVybiAiQyIgY2hhciAqc3RybmR1cChjb25zdCAgY2hhciAqc3JjLCBzaXplX3Qgbik7CitleHRlcm4gIkMiIHNpemVfdCBzdHJsY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gIkMiIHNpemVfdCBzdHJsY2F0KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSk7CisKK3ZvaWQgZigpIHsKKyAgY2hhciBiMVs4MF0sIGIyWzgwXTsKKyAgaWYgKG1lbXNldChiMSwgMCwgc2l6ZW9mKGIxKSAhPSAwKSkge30gLy8gXAorICAgIGV4cGVjdGVkLXdhcm5pbmd7e3NpemUgYXJndW1lbnQgaW4gJ21lbXNldCcgY2FsbCBpcyBhIGNvbXBhcmlzb259fSBcCisgICAgZXhwZWN0ZWQtbm90ZSB7e2RpZCB5b3UgbWVhbiB0byBjb21wYXJlfX0gXAorICAgIGV4cGVjdGVkLW5vdGUge3tleHBsaWNpdGx5IGNhc3QgdGhlIGFyZ3VtZW50fX0KKyAgaWYgKG1lbXNldChiMSwgMCwgc2l6ZW9mKGIxKSkgIT0gMCkge30KKworICBpZiAobWVtbW92ZShiMSwgYjIsIHNpemVvZihiMSkgPT0gMCkpIHt9IC8vIFwKKyAgICBleHBlY3RlZC13YXJuaW5ne3tzaXplIGFyZ3VtZW50IGluICdtZW1tb3ZlJyBjYWxsIGlzIGEgY29tcGFyaXNvbn19IFwKKyAgICBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuIHRvIGNvbXBhcmV9fSBcCisgICAgZXhwZWN0ZWQtbm90ZSB7e2V4cGxpY2l0bHkgY2FzdCB0aGUgYXJndW1lbnR9fQorICBpZiAobWVtbW92ZShiMSwgYjIsIHNpemVvZihiMSkpID09IDApIHt9CisKKyAgaWYgKG1lbWNweShiMSwgYjIsIHNpemVvZihiMSkgPCAwKSkge30gLy8gXAorICAgIGV4cGVjdGVkLXdhcm5pbmd7e3NpemUgYXJndW1lbnQgaW4gJ21lbWNweScgY2FsbCBpcyBhIGNvbXBhcmlzb259fSBcCisgICAgZXhwZWN0ZWQtbm90ZSB7e2RpZCB5b3UgbWVhbiB0byBjb21wYXJlfX0gXAorICAgIGV4cGVjdGVkLW5vdGUge3tleHBsaWNpdGx5IGNhc3QgdGhlIGFyZ3VtZW50fX0KKyAgaWYgKG1lbWNweShiMSwgYjIsIHNpemVvZihiMSkpIDwgMCkge30KKworICBpZiAobWVtY21wKGIxLCBiMiwgc2l6ZW9mKGIxKSA8PSAwKSkge30gLy8gXAorICAgIGV4cGVjdGVkLXdhcm5pbmd7e3NpemUgYXJndW1lbnQgaW4gJ21lbWNtcCcgY2FsbCBpcyBhIGNvbXBhcmlzb259fSBcCisgICAgZXhwZWN0ZWQtbm90ZSB7e2RpZCB5b3UgbWVhbiB0byBjb21wYXJlfX0gXAorICAgIGV4cGVjdGVkLW5vdGUge3tleHBsaWNpdGx5IGNhc3QgdGhlIGFyZ3VtZW50fX0KKyAgaWYgKG1lbWNtcChiMSwgYjIsIHNpemVvZihiMSkpIDw9IDApIHt9CisKKyAgaWYgKHN0cm5jbXAoYjEsIGIyLCBzaXplb2YoYjEpID4gMCkpIHt9IC8vIFwKKyAgICBleHBlY3RlZC13YXJuaW5ne3tzaXplIGFyZ3VtZW50IGluICdzdHJuY21wJyBjYWxsIGlzIGEgY29tcGFyaXNvbn19IFwKKyAgICBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuIHRvIGNvbXBhcmV9fSBcCisgICAgZXhwZWN0ZWQtbm90ZSB7e2V4cGxpY2l0bHkgY2FzdCB0aGUgYXJndW1lbnR9fQorICBpZiAoc3RybmNtcChiMSwgYjIsIHNpemVvZihiMSkpID4gMCkge30KKworICBpZiAoc3RybmNhc2VjbXAoYjEsIGIyLCBzaXplb2YoYjEpID49IDApKSB7fSAvLyBcCisgICAgZXhwZWN0ZWQtd2FybmluZ3t7c2l6ZSBhcmd1bWVudCBpbiAnc3RybmNhc2VjbXAnIGNhbGwgaXMgYSBjb21wYXJpc29ufX0gXAorICAgIGV4cGVjdGVkLW5vdGUge3tkaWQgeW91IG1lYW4gdG8gY29tcGFyZX19IFwKKyAgICBleHBlY3RlZC1ub3RlIHt7ZXhwbGljaXRseSBjYXN0IHRoZSBhcmd1bWVudH19CisgIGlmIChzdHJuY2FzZWNtcChiMSwgYjIsIHNpemVvZihiMSkpID49IDApIHt9CisKKyAgaWYgKHN0cm5jcHkoYjEsIGIyLCBzaXplb2YoYjEpID09IDAgfHwgdHJ1ZSkpIHt9IC8vIFwKKyAgICBleHBlY3RlZC13YXJuaW5ne3tzaXplIGFyZ3VtZW50IGluICdzdHJuY3B5JyBjYWxsIGlzIGEgY29tcGFyaXNvbn19IFwKKyAgICBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuIHRvIGNvbXBhcmV9fSBcCisgICAgZXhwZWN0ZWQtbm90ZSB7e2V4cGxpY2l0bHkgY2FzdCB0aGUgYXJndW1lbnR9fQorICBpZiAoc3RybmNweShiMSwgYjIsIHNpemVvZihiMSkpID09IDAgfHwgdHJ1ZSkge30KKworICBpZiAoc3RybmNhdChiMSwgYjIsIHNpemVvZihiMSkgLSAxID49IDAgJiYgdHJ1ZSkpIHt9IC8vIFwKKyAgICBleHBlY3RlZC13YXJuaW5ne3tzaXplIGFyZ3VtZW50IGluICdzdHJuY2F0JyBjYWxsIGlzIGEgY29tcGFyaXNvbn19IFwKKyAgICBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuIHRvIGNvbXBhcmV9fSBcCisgICAgZXhwZWN0ZWQtbm90ZSB7e2V4cGxpY2l0bHkgY2FzdCB0aGUgYXJndW1lbnR9fQorICBpZiAoc3RybmNhdChiMSwgYjIsIHNpemVvZihiMSkgLSAxKSA+PSAwICYmIHRydWUpIHt9CisKKyAgaWYgKHN0cm5kdXAoYjEsIHNpemVvZihiMSkgIT0gMCkpIHt9IC8vIFwKKyAgICBleHBlY3RlZC13YXJuaW5ne3tzaXplIGFyZ3VtZW50IGluICdzdHJuZHVwJyBjYWxsIGlzIGEgY29tcGFyaXNvbn19IFwKKyAgICBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuIHRvIGNvbXBhcmV9fSBcCisgICAgZXhwZWN0ZWQtbm90ZSB7e2V4cGxpY2l0bHkgY2FzdCB0aGUgYXJndW1lbnR9fQorICBpZiAoc3RybmR1cChiMSwgc2l6ZW9mKGIxKSkgIT0gMCkge30KKworICBpZiAoc3RybGNweShiMSwgYjIsIHNpemVvZihiMSkgIT0gMCkpIHt9IC8vIFwKKyAgICBleHBlY3RlZC13YXJuaW5ne3tzaXplIGFyZ3VtZW50IGluICdzdHJsY3B5JyBjYWxsIGlzIGEgY29tcGFyaXNvbn19IFwKKyAgICBleHBlY3RlZC1ub3RlIHt7ZGlkIHlvdSBtZWFuIHRvIGNvbXBhcmV9fSBcCisgICAgZXhwZWN0ZWQtbm90ZSB7e2V4cGxpY2l0bHkgY2FzdCB0aGUgYXJndW1lbnR9fQorICBpZiAoc3RybGNweShiMSwgYjIsIHNpemVvZihiMSkpICE9IDApIHt9CisKKyAgaWYgKHN0cmxjYXQoYjEsIGIyLCBzaXplb2YoYjEpICE9IDApKSB7fSAvLyBcCisgICAgZXhwZWN0ZWQtd2FybmluZ3t7c2l6ZSBhcmd1bWVudCBpbiAnc3RybGNhdCcgY2FsbCBpcyBhIGNvbXBhcmlzb259fSBcCisgICAgZXhwZWN0ZWQtbm90ZSB7e2RpZCB5b3UgbWVhbiB0byBjb21wYXJlfX0gXAorICAgIGV4cGVjdGVkLW5vdGUge3tleHBsaWNpdGx5IGNhc3QgdGhlIGFyZ3VtZW50fX0KKyAgaWYgKHN0cmxjYXQoYjEsIGIyLCBzaXplb2YoYjEpKSAhPSAwKSB7fQorCisgIGlmIChtZW1zZXQoYjEsIDAsIHNpemVvZihiMSkgLyAyKSkge30KKyAgaWYgKG1lbXNldChiMSwgMCwgc2l6ZW9mKGIxKSA+PiAyKSkge30KKyAgaWYgKG1lbXNldChiMSwgMCwgNCA8PCAyKSkge30KKyAgaWYgKG1lbXNldChiMSwgMCwgNCArIDIpKSB7fQorICBpZiAobWVtc2V0KGIxLCAwLCA0IC0gMikpIHt9CisgIGlmIChtZW1zZXQoYjEsIDAsIDQgKiAyKSkge30KKworICBpZiAobWVtc2V0KGIxLCAwLCAoc2l6ZV90KShzaXplb2YoYjEpICE9IDApKSkge30KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLW5ldy1vdmVyYWxpZ25lZC5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi1uZXctb3ZlcmFsaWduZWQuY3BwCmluZGV4IDQyYTRlMzUuLjcxMDk3M2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC93YXJuLW5ldy1vdmVyYWxpZ25lZC5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tbmV3LW92ZXJhbGlnbmVkLmNwcApAQCAtMzgsNyArMzgsNyBAQAogICB9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMjU2KSkpOwogCiAgIHZvaWQqIG9wZXJhdG9yIG5ldyh1bnNpZ25lZCBsb25nKSB7Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snb3BlcmF0b3IgbmV3JyBzaG91bGQgbm90IHJldHVybiBhIG51bGwgcG9pbnRlciB1bmxlc3MgaXQgaXMgZGVjbGFyZWQgJ3Rocm93KCknfX0KICAgfQogCiAgIFNlcGFyYXRlQ2FjaGVMaW5lczxpbnQ+IGhpZ2hfY29udGVudGlvbl9kYXRhWzEwXTsKQEAgLTU5LDcgKzU5LDcgQEAKICAgfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDI1NikpKTsKIAogICB2b2lkKiBvcGVyYXRvciBuZXdbXSh1bnNpZ25lZCBsb25nKSB7Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snb3BlcmF0b3IgbmV3W10nIHNob3VsZCBub3QgcmV0dXJuIGEgbnVsbCBwb2ludGVyIHVubGVzcyBpdCBpcyBkZWNsYXJlZCAndGhyb3coKSd9fQogICB9CiAKICAgU2VwYXJhdGVDYWNoZUxpbmVzPGludD4gaGlnaF9jb250ZW50aW9uX2RhdGFbMTBdOwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3dhcm4tcmVpbnRlcnByZXQtYmFzZS1jbGFzcy5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi1yZWludGVycHJldC1iYXNlLWNsYXNzLmNwcAppbmRleCAzNmI4ZmRhLi4wMjMxZjE5IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvd2Fybi1yZWludGVycHJldC1iYXNlLWNsYXNzLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvd2Fybi1yZWludGVycHJldC1iYXNlLWNsYXNzLmNwcApAQCAtMSw1ICsxLDggQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtV3JlaW50ZXJwcmV0LWJhc2UtY2xhc3MgLVduby11bnVzZWQtdm9sYXRpbGUtbHZhbHVlICVzCi0vLyBSVU46IG5vdCAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWZzeW50YXgtb25seSAtZmRpYWdub3N0aWNzLXBhcnNlYWJsZS1maXhpdHMgLVdyZWludGVycHJldC1iYXNlLWNsYXNzIC1Xbm8tdW51c2VkLXZvbGF0aWxlLWx2YWx1ZSAlcyAyPiYxIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXN0ZD1jKysxMSAtZnN5bnRheC1vbmx5IC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtdmVyaWZ5IC1XcmVpbnRlcnByZXQtYmFzZS1jbGFzcyAtV25vLXVudXNlZC12b2xhdGlsZS1sdmFsdWUgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1mc3ludGF4LW9ubHkgLXRyaXBsZSAlbXNfYWJpX3RyaXBsZSAtRE1TQUJJIC12ZXJpZnkgLVdyZWludGVycHJldC1iYXNlLWNsYXNzIC1Xbm8tdW51c2VkLXZvbGF0aWxlLWx2YWx1ZSAlcworCisvLyBSVU46IG5vdCAlY2xhbmdfY2MxIC1zdGQ9YysrMTEgLWZzeW50YXgtb25seSAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWZkaWFnbm9zdGljcy1wYXJzZWFibGUtZml4aXRzIC1XcmVpbnRlcnByZXQtYmFzZS1jbGFzcyAtV25vLXVudXNlZC12b2xhdGlsZS1sdmFsdWUgJXMgMj4mMSB8IEZpbGVDaGVjayAlcworLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtc3RkPWMrKzExIC1mc3ludGF4LW9ubHkgLXRyaXBsZSAlbXNfYWJpX3RyaXBsZSAtZmRpYWdub3N0aWNzLXBhcnNlYWJsZS1maXhpdHMgLVdyZWludGVycHJldC1iYXNlLWNsYXNzIC1Xbm8tdW51c2VkLXZvbGF0aWxlLWx2YWx1ZSAlcyAyPiYxIHwgRmlsZUNoZWNrICVzCiAKIC8vIFBSIDEzODI0CiBjbGFzcyBBIHsKQEAgLTI4OCw2ICsyOTEsMTEgQEAKICAgKHZvaWQpcmVpbnRlcnByZXRfY2FzdDxJICo+KGYpOwogICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTFdXTo5LVtbQExJTkUtMV1dOjI1fToic3RhdGljX2Nhc3QiCiAKKyNpZmRlZiBNU0FCSQorICAvLyBJbiBNUyBBQkkgbW9kZSwgQSBpcyBhdCBub24temVybyBvZmZzZXQgaW4gSC4KKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0ArMyB7eydyZWludGVycHJldF9jYXN0JyB0byBjbGFzcyAnSCAqJyBmcm9tIGl0cyBiYXNlIGF0IG5vbi16ZXJvIG9mZnNldCAnQSAqJyBiZWhhdmVzIGRpZmZlcmVudGx5IGZyb20gJ3N0YXRpY19jYXN0J319CisgIC8vIGV4cGVjdGVkLW5vdGVAKzIge3t1c2UgJ3N0YXRpY19jYXN0J319CisjZW5kaWYKICAgKHZvaWQpcmVpbnRlcnByZXRfY2FzdDxIICo+KGEpOwogCiAgIC8vIGV4cGVjdGVkLXdhcm5pbmdAKzIge3sncmVpbnRlcnByZXRfY2FzdCcgdG8gY2xhc3MgJ0wnIChha2EgJ2NvbnN0IEYgKnZvbGF0aWxlJykgZnJvbSBpdHMgYmFzZSBhdCBub24temVybyBvZmZzZXQgJ0UgKicgYmVoYXZlcyBkaWZmZXJlbnRseSBmcm9tICdzdGF0aWNfY2FzdCd9fQpAQCAtMzA5LDYgKzMxNywxMiBAQAogICAvLyBDSEVDSzogZml4LWl0OiJ7ey4qfX0iOntbW0BMSU5FLTFdXTo5LVtbQExJTkUtMV1dOjI1fToic3RhdGljX2Nhc3QiCiAKICAgKHZvaWQpcmVpbnRlcnByZXRfY2FzdDxFICo+KGgpOworCisjaWZkZWYgTVNBQkkKKyAgLy8gSW4gTVMgQUJJIG1vZGUsIEEgaXMgYXQgbm9uLXplcm8gb2Zmc2V0IGluIEguCisgIC8vIGV4cGVjdGVkLXdhcm5pbmdAKzMge3sncmVpbnRlcnByZXRfY2FzdCcgZnJvbSBjbGFzcyAnSCAqJyB0byBpdHMgYmFzZSBhdCBub24temVybyBvZmZzZXQgJ0EgKicgYmVoYXZlcyBkaWZmZXJlbnRseSBmcm9tICdzdGF0aWNfY2FzdCd9fQorICAvLyBleHBlY3RlZC1ub3RlQCsyIHt7dXNlICdzdGF0aWNfY2FzdCd9fQorI2VuZGlmCiAgICh2b2lkKXJlaW50ZXJwcmV0X2Nhc3Q8QSAqPihoKTsKIAogICAvLyBleHBlY3RlZC13YXJuaW5nQCsyIHt7J3JlaW50ZXJwcmV0X2Nhc3QnIGZyb20gY2xhc3MgJ0kgKicgdG8gaXRzIHZpcnR1YWwgYmFzZSAnRiAqJyBiZWhhdmVzIGRpZmZlcmVudGx5IGZyb20gJ3N0YXRpY19jYXN0J319CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvd2Fybi1zaGFkb3cuY3BwIGIvdGVzdC9TZW1hQ1hYL3dhcm4tc2hhZG93LmNwcAppbmRleCA2OGU5NDY3Li41YWQyMjMzIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvd2Fybi1zaGFkb3cuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC93YXJuLXNoYWRvdy5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKIHVzaW5nIG5hbWVzcGFjZSB5eTsKIAogdm9pZCBmb28oKSB7Ci0gIGludCBpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZGVjbGFyYXRpb24gc2hhZG93cyBhIHZhcmlhYmxlIGluIG5hbWVzcGFjZSAnPGFub255bW91cz4nfX0KKyAgaW50IGk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tkZWNsYXJhdGlvbiBzaGFkb3dzIGEgdmFyaWFibGUgaW4gbmFtZXNwYWNlICcoYW5vbnltb3VzKSd9fQogICBpbnQgajsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2RlY2xhcmF0aW9uIHNoYWRvd3MgYSB2YXJpYWJsZSBpbiBuYW1lc3BhY2UgJ29uZTo6dHdvJ319CiAgIGludCBtOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3dhcm4tc2lnbi1jb252ZXJzaW9uLmNwcCBiL3Rlc3QvU2VtYUNYWC93YXJuLXNpZ24tY29udmVyc2lvbi5jcHAKaW5kZXggYmEyYmM5Yi4uNzQ2YjEyNCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3dhcm4tc2lnbi1jb252ZXJzaW9uLmNwcAorKysgYi90ZXN0L1NlbWFDWFgvd2Fybi1zaWduLWNvbnZlcnNpb24uY3BwCkBAIC0yNSwyMyArMjUsMjMgQEAKICAgICBpbnQgYzEgPSAxID8gaSA6IEZvbzxib29sPjo6QzsKICAgICBpbnQgYzIgPSAxID8gRm9vPGJvb2w+OjpDIDogaTsKIAotICAgIGludCBkMWEgPSAxID8gaSA6IEZvbzxib29sPjo6RDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Rlc3QxOjpGb288Ym9vbD46Ojxhbm9ueW1vdXMgZW51bSBhdCB9fQotICAgIGludCBkMWIgPSAxID8gaSA6IEZvbzxib29sPjo6RDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dhcm4tc2lnbi1jb252ZXJzaW9uLmNwcDoxMzo1PicgdG8gJ2ludCd9fQotICAgIGludCBkMmEgPSAxID8gRm9vPGJvb2w+OjpEIDogaTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e29wZXJhbmQgb2YgPyBjaGFuZ2VzIHNpZ25lZG5lc3M6ICd0ZXN0MTo6Rm9vPGJvb2w+Ojo8YW5vbnltb3VzIGVudW0gYXQgfX0KLSAgICBpbnQgZDJiID0gMSA/IEZvbzxib29sPjo6RCA6IGk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3YXJuLXNpZ24tY29udmVyc2lvbi5jcHA6MTM6NT4nIHRvICdpbnQnfX0KLSAgICBpbnQgZDNhID0gMSA/IEIgOiBGb288Ym9vbD46OkQ7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tvcGVyYW5kIG9mID8gY2hhbmdlcyBzaWduZWRuZXNzOiAndGVzdDE6OkZvbzxib29sPjo6PGFub255bW91cyBlbnVtIGF0IH19Ci0gICAgaW50IGQzYiA9IDEgPyBCIDogRm9vPGJvb2w+OjpEOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2Fybi1zaWduLWNvbnZlcnNpb24uY3BwOjEzOjU+JyB0byAnaW50J319Ci0gICAgaW50IGQ0YSA9IDEgPyBGb288Ym9vbD46OkQgOiBCOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7b3BlcmFuZCBvZiA/IGNoYW5nZXMgc2lnbmVkbmVzczogJ3Rlc3QxOjpGb288Ym9vbD46Ojxhbm9ueW1vdXMgZW51bSBhdCB9fQotICAgIGludCBkNGIgPSAxID8gRm9vPGJvb2w+OjpEIDogQjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dhcm4tc2lnbi1jb252ZXJzaW9uLmNwcDoxMzo1PicgdG8gJ2ludCd9fQorICAgIGludCBkMWEgPSAxID8gaSA6IEZvbzxib29sPjo6RDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Rlc3QxOjpGb288Ym9vbD46Oihhbm9ueW1vdXMgZW51bSBhdCB9fQorICAgIGludCBkMWIgPSAxID8gaSA6IEZvbzxib29sPjo6RDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dhcm4tc2lnbi1jb252ZXJzaW9uLmNwcDoxMzo1KScgdG8gJ2ludCd9fQorICAgIGludCBkMmEgPSAxID8gRm9vPGJvb2w+OjpEIDogaTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e29wZXJhbmQgb2YgPyBjaGFuZ2VzIHNpZ25lZG5lc3M6ICd0ZXN0MTo6Rm9vPGJvb2w+OjooYW5vbnltb3VzIGVudW0gYXQgfX0KKyAgICBpbnQgZDJiID0gMSA/IEZvbzxib29sPjo6RCA6IGk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3YXJuLXNpZ24tY29udmVyc2lvbi5jcHA6MTM6NSknIHRvICdpbnQnfX0KKyAgICBpbnQgZDNhID0gMSA/IEIgOiBGb288Ym9vbD46OkQ7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tvcGVyYW5kIG9mID8gY2hhbmdlcyBzaWduZWRuZXNzOiAndGVzdDE6OkZvbzxib29sPjo6KGFub255bW91cyBlbnVtIGF0IH19CisgICAgaW50IGQzYiA9IDEgPyBCIDogRm9vPGJvb2w+OjpEOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2Fybi1zaWduLWNvbnZlcnNpb24uY3BwOjEzOjUpJyB0byAnaW50J319CisgICAgaW50IGQ0YSA9IDEgPyBGb288Ym9vbD46OkQgOiBCOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7b3BlcmFuZCBvZiA/IGNoYW5nZXMgc2lnbmVkbmVzczogJ3Rlc3QxOjpGb288Ym9vbD46Oihhbm9ueW1vdXMgZW51bSBhdCB9fQorICAgIGludCBkNGIgPSAxID8gRm9vPGJvb2w+OjpEIDogQjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dhcm4tc2lnbi1jb252ZXJzaW9uLmNwcDoxMzo1KScgdG8gJ2ludCd9fQogCi0gICAgaW50IGUxYSA9IDEgPyBpIDogRTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e29wZXJhbmQgb2YgPyBjaGFuZ2VzIHNpZ25lZG5lc3M6ICd0ZXN0MTo6PGFub255bW91cyBlbnVtIGF0IH19Ci0gICAgaW50IGUxYiA9IDEgPyBpIDogRTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dhcm4tc2lnbi1jb252ZXJzaW9uLmNwcDoxNjozPicgdG8gJ2ludCd9fQotICAgIGludCBlMmEgPSAxID8gRSA6IGk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tvcGVyYW5kIG9mID8gY2hhbmdlcyBzaWduZWRuZXNzOiAndGVzdDE6Ojxhbm9ueW1vdXMgZW51bSBhdCB9fQotICAgIGludCBlMmIgPSAxID8gRSA6IGk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3YXJuLXNpZ24tY29udmVyc2lvbi5jcHA6MTY6Mz4nIHRvICdpbnQnfX0KLSAgICBpbnQgZTNhID0gMSA/IEUgOiBCOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7b3BlcmFuZCBvZiA/IGNoYW5nZXMgc2lnbmVkbmVzczogJ3Rlc3QxOjo8YW5vbnltb3VzIGVudW0gYXQgfX0KLSAgICBpbnQgZTNiID0gMSA/IEUgOiBCOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2Fybi1zaWduLWNvbnZlcnNpb24uY3BwOjE2OjM+JyB0byAnaW50J319Ci0gICAgaW50IGU0YSA9IDEgPyBCIDogRTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e29wZXJhbmQgb2YgPyBjaGFuZ2VzIHNpZ25lZG5lc3M6ICd0ZXN0MTo6PGFub255bW91cyBlbnVtIGF0IH19Ci0gICAgaW50IGU0YiA9IDEgPyBCIDogRTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dhcm4tc2lnbi1jb252ZXJzaW9uLmNwcDoxNjozPicgdG8gJ2ludCd9fQorICAgIGludCBlMWEgPSAxID8gaSA6IEU7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tvcGVyYW5kIG9mID8gY2hhbmdlcyBzaWduZWRuZXNzOiAndGVzdDE6Oihhbm9ueW1vdXMgZW51bSBhdCB9fQorICAgIGludCBlMWIgPSAxID8gaSA6IEU7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3YXJuLXNpZ24tY29udmVyc2lvbi5jcHA6MTY6MyknIHRvICdpbnQnfX0KKyAgICBpbnQgZTJhID0gMSA/IEUgOiBpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7b3BlcmFuZCBvZiA/IGNoYW5nZXMgc2lnbmVkbmVzczogJ3Rlc3QxOjooYW5vbnltb3VzIGVudW0gYXQgfX0KKyAgICBpbnQgZTJiID0gMSA/IEUgOiBpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2Fybi1zaWduLWNvbnZlcnNpb24uY3BwOjE2OjMpJyB0byAnaW50J319CisgICAgaW50IGUzYSA9IDEgPyBFIDogQjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e29wZXJhbmQgb2YgPyBjaGFuZ2VzIHNpZ25lZG5lc3M6ICd0ZXN0MTo6KGFub255bW91cyBlbnVtIGF0IH19CisgICAgaW50IGUzYiA9IDEgPyBFIDogQjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dhcm4tc2lnbi1jb252ZXJzaW9uLmNwcDoxNjozKScgdG8gJ2ludCd9fQorICAgIGludCBlNGEgPSAxID8gQiA6IEU7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tvcGVyYW5kIG9mID8gY2hhbmdlcyBzaWduZWRuZXNzOiAndGVzdDE6Oihhbm9ueW1vdXMgZW51bSBhdCB9fQorICAgIGludCBlNGIgPSAxID8gQiA6IEU7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3YXJuLXNpZ24tY29udmVyc2lvbi5jcHA6MTY6MyknIHRvICdpbnQnfX0KICAgfQogfQogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvd2Fybi1zdHJpbmctY29udmVyc2lvbi5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi1zdHJpbmctY29udmVyc2lvbi5jcHAKaW5kZXggMjM5NjBlNC4uYjI2MTI2ZiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3dhcm4tc3RyaW5nLWNvbnZlcnNpb24uY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC93YXJuLXN0cmluZy1jb252ZXJzaW9uLmNwcApAQCAtMSwxNCArMSwyMCBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLVdzdHJpbmctY29udmVyc2lvbiAtdmVyaWZ5ICVzCiAKIC8vIFdhcm4gb24gY2FzZXMgd2hlcmUgYSBzdHJpbmcgbGl0ZXJhbCBpcyBjb252ZXJ0ZWQgaW50byBhIGJvb2wuCi0vLyBBbiBleGNlcHRpb24gaXMgbWFkZSBmb3IgdGhpcyBpbiBsb2dpY2FsIG9wZXJhdG9ycy4KKy8vIEFuIGV4Y2VwdGlvbiBpcyBtYWRlIGZvciB0aGlzIGluIGxvZ2ljYWwgYW5kIG9wZXJhdG9ycy4KIHZvaWQgYXNzZXJ0KGJvb2wgY29uZGl0aW9uKTsKIHZvaWQgdGVzdDAoKSB7CiAgIGJvb2wgYjAgPSAiaGkiOyAvLyBleHBlY3RlZC13YXJuaW5ne3tpbXBsaWNpdCBjb252ZXJzaW9uIHR1cm5zIHN0cmluZyBsaXRlcmFsIGludG8gYm9vbDogJ2NvbnN0IGNoYXIgWzNdJyB0byAnYm9vbCd9fQogICBiMCA9ICIiOyAvLyBleHBlY3RlZC13YXJuaW5ne3tpbXBsaWNpdCBjb252ZXJzaW9uIHR1cm5zIHN0cmluZyBsaXRlcmFsIGludG8gYm9vbDogJ2NvbnN0IGNoYXIgWzFdJyB0byAnYm9vbCd9fQorICBiMCA9IDAgfHwgIiI7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2ltcGxpY2l0IGNvbnZlcnNpb24gdHVybnMgc3RyaW5nIGxpdGVyYWwgaW50byBib29sOiAnY29uc3QgY2hhciBbMV0nIHRvICdib29sJ319CisgIGIwID0gIiIgfHwgMDsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7aW1wbGljaXQgY29udmVyc2lvbiB0dXJucyBzdHJpbmcgbGl0ZXJhbCBpbnRvIGJvb2w6ICdjb25zdCBjaGFyIFsxXScgdG8gJ2Jvb2wnfX0KICAgYjAgPSAwICYmICIiOworICBiMCA9ICIiICYmIDA7CiAgIGFzc2VydCgiZXJyb3IiKTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7aW1wbGljaXQgY29udmVyc2lvbiB0dXJucyBzdHJpbmcgbGl0ZXJhbCBpbnRvIGJvb2w6ICdjb25zdCBjaGFyIFs2XScgdG8gJ2Jvb2wnfX0KKyAgYXNzZXJ0KDAgfHwgImVycm9yIik7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2ltcGxpY2l0IGNvbnZlcnNpb24gdHVybnMgc3RyaW5nIGxpdGVyYWwgaW50byBib29sOiAnY29uc3QgY2hhciBbNl0nIHRvICdib29sJ319CisgIGFzc2VydCgiZXJyb3IiIHx8IDApOyAvLyBleHBlY3RlZC13YXJuaW5ne3tpbXBsaWNpdCBjb252ZXJzaW9uIHR1cm5zIHN0cmluZyBsaXRlcmFsIGludG8gYm9vbDogJ2NvbnN0IGNoYXIgWzZdJyB0byAnYm9vbCd9fQogICBhc3NlcnQoMCAmJiAiZXJyb3IiKTsKKyAgYXNzZXJ0KCJlcnJvciIgJiYgMCk7CiAKICAgd2hpbGUoImhpIikge30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7aW1wbGljaXQgY29udmVyc2lvbiB0dXJucyBzdHJpbmcgbGl0ZXJhbCBpbnRvIGJvb2w6ICdjb25zdCBjaGFyIFszXScgdG8gJ2Jvb2wnfX0KICAgZG8ge30gd2hpbGUoImhpIik7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e2ltcGxpY2l0IGNvbnZlcnNpb24gdHVybnMgc3RyaW5nIGxpdGVyYWwgaW50byBib29sOiAnY29uc3QgY2hhciBbM10nIHRvICdib29sJ319CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvd2Fybi1zeXNoZWFkZXItbWFjcm8uY3BwIGIvdGVzdC9TZW1hQ1hYL3dhcm4tc3lzaGVhZGVyLW1hY3JvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODg0NjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tc3lzaGVhZGVyLW1hY3JvLmNwcApAQCAtMCwwICsxLDM1IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtZnN5bnRheC1vbmx5IC1Xc2hhZG93IC1Xb2xkLXN0eWxlLWNhc3QgJXMKKworLy8gVGVzdCB0aGF0IG1hY3JvIGV4cGFuc2lvbnMgZnJvbSBzeXN0ZW0gaGVhZGVycyBkb24ndCB0cmlnZ2VyICdzeW50YWN0aWMnCisvLyB3YXJuaW5ncyB0aGF0IGFyZSBub3QgYWN0aW9uYWJsZS4KKworI2lmZGVmIElTX1NZU0hFQURFUgorI3ByYWdtYSBjbGFuZyBzeXN0ZW1faGVhZGVyCisKKyNkZWZpbmUgU0FOSVRZKGEpIChhIC8gMCkKKworI2RlZmluZSBTSEFET1coYSkgX19leHRlbnNpb25fXyh7IGludCB2ID0gYTsgdjsgfSkKKworI2RlZmluZSBPTERfU1RZTEVfQ0FTVChhKSAoKGludCkgKGEpKQorCisjZWxzZQorCisjZGVmaW5lIElTX1NZU0hFQURFUgorI2luY2x1ZGUgX19GSUxFX18KKwordm9pZCB0ZXN0U2FuaXR5KCkgeworICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSB0ZXN0IGlzIHNldCB1cCBjb3JyZWN0bHkKKyAgaW50IGkgPSBTQU5JVFkoMCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tkaXZpc2lvbiBieSB6ZXJvIGlzIHVuZGVmaW5lZH19Cit9CisKK3ZvaWQgUFIxNjA5MygpIHsKKyAgLy8gbm8gLVdzaGFkb3cgaW4gc3lzdGVtIG1hY3JvIGV4cGFuc2lvbgorICBpbnQgaSA9IFNIQURPVyhTSEFET1coMSkpOworfQorCit2b2lkIFBSMTgxNDcoKSB7CisgIC8vIG5vIC1Xb2xkX3N0eWxlX2Nhc3QgaW4gc3lzdGVtIG1hY3JvIGV4cGFuc2lvbgorICBpbnQgaSA9IE9MRF9TVFlMRV9DQVNUKDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLXRhdXRvbG9naWNhbC1jb21wYXJlLmNwcCBiL3Rlc3QvU2VtYUNYWC93YXJuLXRhdXRvbG9naWNhbC1jb21wYXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDRmM2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tdGF1dG9sb2dpY2FsLWNvbXBhcmUuY3BwCkBAIC0wLDAgKzEsMTM4IEBACisvLyBGb3JjZSB4ODYtNjQgYmVjYXVzZSBzb21lIG9mIG91ciBoZXVyaXN0aWNzIGFyZSBhY3R1YWxseSBiYXNlZAorLy8gb24gaW50ZWdlciBzaXplcy4KKworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbiAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXN0ZD1jKysxMSAlcworCituYW1lc3BhY2UgUnVudGltZUJlaGF2aW9yIHsKKyAgLy8gQXZvaWQgZW1pdHRpbmcgdGF1dG9sb2dpY2FsIGNvbXBhcmUgd2FybmluZ3Mgd2hlbiB0aGUgY29kZSBhbHJlYWR5IGhhcworICAvLyBjb21waWxlIHRpbWUgY2hlY2tzIG9uIHZhcmlhYmxlIHNpemVzLgorCisgIGNvbnN0IGludCBraW50bWF4ID0gMjE0NzQ4MzY0NzsKKyAgdm9pZCB0ZXN0MChzaG9ydCB4KSB7CisgICAgaWYgKHNpemVvZih4KSA8IHNpemVvZihpbnQpIHx8IHggPCBraW50bWF4KSB7fQorCisgICAgaWYgKHggPCBraW50bWF4KSB7fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2NvbXBhcmlzb24gb2YgY29uc3RhbnQgMjE0NzQ4MzY0NyB3aXRoIGV4cHJlc3Npb24gb2YgdHlwZSAnc2hvcnQnIGlzIGFsd2F5cyB0cnVlfX0KKyAgfQorCisgIHZvaWQgdGVzdDEoc2hvcnQgeCkgeworICAgIGlmICh4IDwga2ludG1heCkge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tjb21wYXJpc29uIG9mIGNvbnN0YW50IDIxNDc0ODM2NDcgd2l0aCBleHByZXNzaW9uIG9mIHR5cGUgJ3Nob3J0JyBpcyBhbHdheXMgdHJ1ZX19CisKKyAgICBpZiAoc2l6ZW9mKHgpIDwgc2l6ZW9mKGludCkpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoeCA8IGtpbnRtYXgpIHt9CisgIH0KK30KKworbmFtZXNwYWNlIEFycmF5Q29tcGFyZSB7CisgICNkZWZpbmUgR2V0VmFsdWUocHRyKSAgKChwdHIgIT0gMCkgPyBwdHJbMF0gOiAwKQorICBleHRlcm4gaW50IGFbXSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CisgIGludCBiW10gPSB7OCwxMywyMX07CisgIHN0cnVjdCB7CisgICAgaW50IHhbMTBdOworICB9IGM7CisgIGNvbnN0IGNoYXIgc3RyW10gPSAidGV4dCI7CisgIHZvaWQgaWdub3JlKCkgeworICAgIGlmIChhID09IDApIHt9CisgICAgaWYgKGEgIT0gMCkge30KKyAgICAodm9pZClHZXRWYWx1ZShiKTsKKyAgfQorICB2b2lkIHRlc3QoKSB7CisgICAgaWYgKGIgPT0gMCkge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tjb21wYXJpc29uIG9mIGFycmF5ICdiJyBlcXVhbCB0byBhIG51bGwgcG9pbnRlciBpcyBhbHdheXMgZmFsc2V9fQorICAgIGlmIChiICE9IDApIHt9CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7Y29tcGFyaXNvbiBvZiBhcnJheSAnYicgbm90IGVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzIGFsd2F5cyB0cnVlfX0KKyAgICBpZiAoMCA9PSBiKSB7fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2NvbXBhcmlzb24gb2YgYXJyYXkgJ2InIGVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzIGFsd2F5cyBmYWxzZX19CisgICAgaWYgKDAgIT0gYikge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tjb21wYXJpc29uIG9mIGFycmF5ICdiJyBub3QgZXF1YWwgdG8gYSBudWxsIHBvaW50ZXIgaXMgYWx3YXlzIHRydWV9fQorICAgIGlmIChjLnggPT0gMCkge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tjb21wYXJpc29uIG9mIGFycmF5ICdjLngnIGVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzIGFsd2F5cyBmYWxzZX19CisgICAgaWYgKGMueCAhPSAwKSB7fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2NvbXBhcmlzb24gb2YgYXJyYXkgJ2MueCcgbm90IGVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzIGFsd2F5cyB0cnVlfX0KKyAgICBpZiAoc3RyID09IDApIHt9CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7Y29tcGFyaXNvbiBvZiBhcnJheSAnc3RyJyBlcXVhbCB0byBhIG51bGwgcG9pbnRlciBpcyBhbHdheXMgZmFsc2V9fQorICAgIGlmIChzdHIgIT0gMCkge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tjb21wYXJpc29uIG9mIGFycmF5ICdzdHInIG5vdCBlcXVhbCB0byBhIG51bGwgcG9pbnRlciBpcyBhbHdheXMgdHJ1ZX19CisgIH0KK30KKworbmFtZXNwYWNlIEZ1bmN0aW9uQ29tcGFyZSB7CisgICNkZWZpbmUgQ2FsbEZ1bmN0aW9uKGYpICgoZiAhPSAwKSA/IGYoKSA6IDApCisgIGV4dGVybiB2b2lkIGEoKSAgX19hdHRyaWJ1dGVfXygod2VhaykpOworICB2b2lkIGZ1bjEoKTsKKyAgaW50IGZ1bjIoKTsKKyAgaW50KiBmdW4zKCk7CisgIGludCogZnVuNChpbnQpOworICBjbGFzcyBTIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBpbnQgZm9vKCk7CisgIH07CisgIHZvaWQgaWdub3JlKCkgeworICAgIGlmIChhID09IDApIHt9CisgICAgaWYgKDAgIT0gYSkge30KKyAgICAodm9pZClDYWxsRnVuY3Rpb24oZnVuMik7CisgIH0KKyAgdm9pZCB0ZXN0KCkgeworICAgIGlmIChmdW4xID09IDApIHt9CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7Y29tcGFyaXNvbiBvZiBmdW5jdGlvbiAnZnVuMScgZXF1YWwgdG8gYSBudWxsIHBvaW50ZXIgaXMgYWx3YXlzIGZhbHNlfX0KKyAgICAvLyBleHBlY3RlZC1ub3RlQC0ye3twcmVmaXggd2l0aCB0aGUgYWRkcmVzcy1vZiBvcGVyYXRvciB0byBzaWxlbmNlIHRoaXMgd2FybmluZ319CisgICAgaWYgKGZ1bjIgPT0gMCkge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tjb21wYXJpc29uIG9mIGZ1bmN0aW9uICdmdW4yJyBlcXVhbCB0byBhIG51bGwgcG9pbnRlciBpcyBhbHdheXMgZmFsc2V9fQorICAgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3ByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nfX0KKyAgICAvLyBleHBlY3RlZC1ub3RlQC0ze3tzdWZmaXggd2l0aCBwYXJlbnRoZXNlcyB0byB0dXJuIHRoaXMgaW50byBhIGZ1bmN0aW9uIGNhbGx9fQorICAgIGlmIChmdW4zID09IDApIHt9CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7Y29tcGFyaXNvbiBvZiBmdW5jdGlvbiAnZnVuMycgZXF1YWwgdG8gYSBudWxsIHBvaW50ZXIgaXMgYWx3YXlzIGZhbHNlfX0KKyAgICAvLyBleHBlY3RlZC1ub3RlQC0ye3twcmVmaXggd2l0aCB0aGUgYWRkcmVzcy1vZiBvcGVyYXRvciB0byBzaWxlbmNlIHRoaXMgd2FybmluZ319CisgICAgLy8gZXhwZWN0ZWQtbm90ZUAtM3t7c3VmZml4IHdpdGggcGFyZW50aGVzZXMgdG8gdHVybiB0aGlzIGludG8gYSBmdW5jdGlvbiBjYWxsfX0KKyAgICBpZiAoZnVuNCA9PSAwKSB7fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2NvbXBhcmlzb24gb2YgZnVuY3Rpb24gJ2Z1bjQnIGVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzIGFsd2F5cyBmYWxzZX19CisgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMnt7cHJlZml4IHdpdGggdGhlIGFkZHJlc3Mtb2Ygb3BlcmF0b3IgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmd9fQorICAgIGlmIChudWxscHRyICE9IGZ1bjEpIHt9CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7Y29tcGFyaXNvbiBvZiBmdW5jdGlvbiAnZnVuMScgbm90IGVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzIGFsd2F5cyB0cnVlfX0KKyAgICAvLyBleHBlY3RlZC1ub3RlQC0ye3twcmVmaXggd2l0aCB0aGUgYWRkcmVzcy1vZiBvcGVyYXRvciB0byBzaWxlbmNlIHRoaXMgd2FybmluZ319CisgICAgaWYgKG51bGxwdHIgIT0gZnVuMikge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tjb21wYXJpc29uIG9mIGZ1bmN0aW9uICdmdW4yJyBub3QgZXF1YWwgdG8gYSBudWxsIHBvaW50ZXIgaXMgYWx3YXlzIHRydWV9fQorICAgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3ByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nfX0KKyAgICBpZiAobnVsbHB0ciAhPSBmdW4zKSB7fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2NvbXBhcmlzb24gb2YgZnVuY3Rpb24gJ2Z1bjMnIG5vdCBlcXVhbCB0byBhIG51bGwgcG9pbnRlciBpcyBhbHdheXMgdHJ1ZX19CisgICAgLy8gZXhwZWN0ZWQtbm90ZUAtMnt7cHJlZml4IHdpdGggdGhlIGFkZHJlc3Mtb2Ygb3BlcmF0b3IgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmd9fQorICAgIC8vIGV4cGVjdGVkLW5vdGVALTN7e3N1ZmZpeCB3aXRoIHBhcmVudGhlc2VzIHRvIHR1cm4gdGhpcyBpbnRvIGEgZnVuY3Rpb24gY2FsbH19CisgICAgaWYgKG51bGxwdHIgIT0gZnVuNCkge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tjb21wYXJpc29uIG9mIGZ1bmN0aW9uICdmdW40JyBub3QgZXF1YWwgdG8gYSBudWxsIHBvaW50ZXIgaXMgYWx3YXlzIHRydWV9fQorICAgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3ByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nfX0KKyAgICBpZiAoUzo6Zm9vID09IDApIHt9CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7Y29tcGFyaXNvbiBvZiBmdW5jdGlvbiAnUzo6Zm9vJyBlcXVhbCB0byBhIG51bGwgcG9pbnRlciBpcyBhbHdheXMgZmFsc2V9fQorICAgIC8vIGV4cGVjdGVkLW5vdGVALTJ7e3ByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nfX0KKyAgICAvLyBleHBlY3RlZC1ub3RlQC0ze3tzdWZmaXggd2l0aCBwYXJlbnRoZXNlcyB0byB0dXJuIHRoaXMgaW50byBhIGZ1bmN0aW9uIGNhbGx9fQorICB9Cit9CisKK25hbWVzcGFjZSBQb2ludGVyQ29tcGFyZSB7CisgIGV4dGVybiBpbnQgYSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CisgIGludCBiOworICBzdGF0aWMgaW50IGM7CisgIGNsYXNzIFMgeworICBwdWJsaWM6CisgICAgc3RhdGljIGludCBhOworICAgIGludCBiOworICB9OworICB2b2lkIGlnbm9yZWQoKSB7CisgICAgaWYgKCZhID09IDApIHt9CisgIH0KKyAgdm9pZCB0ZXN0KCkgeworICAgIFMgczsKKyAgICBpZiAoJmIgPT0gMCkge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tjb21wYXJpc29uIG9mIGFkZHJlc3Mgb2YgJ2InIGVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzIGFsd2F5cyBmYWxzZX19CisgICAgaWYgKCZjID09IDApIHt9CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7Y29tcGFyaXNvbiBvZiBhZGRyZXNzIG9mICdjJyBlcXVhbCB0byBhIG51bGwgcG9pbnRlciBpcyBhbHdheXMgZmFsc2V9fQorICAgIGlmICgmcy5hID09IDApIHt9CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7Y29tcGFyaXNvbiBvZiBhZGRyZXNzIG9mICdzLmEnIGVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzIGFsd2F5cyBmYWxzZX19CisgICAgaWYgKCZzLmIgPT0gMCkge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tjb21wYXJpc29uIG9mIGFkZHJlc3Mgb2YgJ3MuYicgZXF1YWwgdG8gYSBudWxsIHBvaW50ZXIgaXMgYWx3YXlzIGZhbHNlfX0KKyAgICBpZiAoJlM6OmEgPT0gMCkge30KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tjb21wYXJpc29uIG9mIGFkZHJlc3Mgb2YgJ1M6OmEnIGVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzIGFsd2F5cyBmYWxzZX19CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLXRocmVhZC1zYWZldHktYW5hbHlzaXMuY3BwIGIvdGVzdC9TZW1hQ1hYL3dhcm4tdGhyZWFkLXNhZmV0eS1hbmFseXNpcy5jcHAKaW5kZXggY2U2MjUwZC4uMzRhMzNhYSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3dhcm4tdGhyZWFkLXNhZmV0eS1hbmFseXNpcy5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tdGhyZWFkLXNhZmV0eS1hbmFseXNpcy5jcHAKQEAgLTIwOCwzMyArMjA4LDMzIEBACiAKIHZvaWQgc2xzX2Z1bl9iYWRfMSgpIHsKICAgc2xzX211LlVubG9jaygpOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7dW5sb2NraW5nICdzbHNfbXUnIHRoYXQgd2FzIG5vdCBsb2NrZWR9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3JlbGVhc2luZyBtdXRleCAnc2xzX211JyB0aGF0IHdhcyBub3QgaGVsZH19CiB9CiAKIHZvaWQgc2xzX2Z1bl9iYWRfMigpIHsKICAgc2xzX211LkxvY2soKTsKICAgc2xzX211LkxvY2soKTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e2xvY2tpbmcgJ3Nsc19tdScgdGhhdCBpcyBhbHJlYWR5IGxvY2tlZH19CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7YWNxdWlyaW5nIG11dGV4ICdzbHNfbXUnIHRoYXQgaXMgYWxyZWFkeSBoZWxkfX0KICAgc2xzX211LlVubG9jaygpOwogfQogCiB2b2lkIHNsc19mdW5fYmFkXzMoKSB7CiAgIHNsc19tdS5Mb2NrKCk7IC8vIGV4cGVjdGVkLW5vdGUge3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KLX0gLy8gZXhwZWN0ZWQtd2FybmluZ3t7bXV0ZXggJ3Nsc19tdScgaXMgc3RpbGwgbG9ja2VkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQorfSAvLyBleHBlY3RlZC13YXJuaW5ne3ttdXRleCAnc2xzX211JyBpcyBzdGlsbCBoZWxkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQogCiB2b2lkIHNsc19mdW5fYmFkXzQoKSB7CiAgIGlmIChnZXRCb29sKCkpCiAgICAgc2xzX211LkxvY2soKTsgIC8vIGV4cGVjdGVkLW5vdGV7e211dGV4IGFjcXVpcmVkIGhlcmV9fQogICBlbHNlCiAgICAgc2xzX211Mi5Mb2NrKCk7IC8vIGV4cGVjdGVkLW5vdGV7e211dGV4IGFjcXVpcmVkIGhlcmV9fQotfSAvLyBleHBlY3RlZC13YXJuaW5ne3ttdXRleCAnc2xzX211JyBpcyBub3QgbG9ja2VkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlfX0gIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7bXV0ZXggJ3Nsc19tdTInIGlzIG5vdCBsb2NrZWQgb24gZXZlcnkgcGF0aCB0aHJvdWdoIGhlcmV9fQorfSAvLyBleHBlY3RlZC13YXJuaW5ne3ttdXRleCAnc2xzX211JyBpcyBub3QgaGVsZCBvbiBldmVyeSBwYXRoIHRocm91Z2ggaGVyZX19ICBcCisgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e211dGV4ICdzbHNfbXUyJyBpcyBub3QgaGVsZCBvbiBldmVyeSBwYXRoIHRocm91Z2ggaGVyZX19CiAKIHZvaWQgc2xzX2Z1bl9iYWRfNSgpIHsKICAgc2xzX211LkxvY2soKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e211dGV4IGFjcXVpcmVkIGhlcmV9fQogICBpZiAoZ2V0Qm9vbCgpKQogICAgIHNsc19tdS5VbmxvY2soKTsKLX0gLy8gZXhwZWN0ZWQtd2FybmluZ3t7bXV0ZXggJ3Nsc19tdScgaXMgbm90IGxvY2tlZCBvbiBldmVyeSBwYXRoIHRocm91Z2ggaGVyZX19Cit9IC8vIGV4cGVjdGVkLXdhcm5pbmd7e211dGV4ICdzbHNfbXUnIGlzIG5vdCBoZWxkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlfX0KIAogdm9pZCBzbHNfZnVuX2JhZF82KCkgewogICBpZiAoZ2V0Qm9vbCgpKSB7CkBAIC0yNDcsOCArMjQ3LDggQEAKICAgICB9CiAgIH0KICAgc2xzX211LlVubG9jaygpOyAvLyBcCi0gICAgZXhwZWN0ZWQtd2FybmluZ3t7bXV0ZXggJ3Nsc19tdScgaXMgbm90IGxvY2tlZCBvbiBldmVyeSBwYXRoIHRocm91Z2ggaGVyZX19XAotICAgIGV4cGVjdGVkLXdhcm5pbmd7e3VubG9ja2luZyAnc2xzX211JyB0aGF0IHdhcyBub3QgbG9ja2VkfX0KKyAgICBleHBlY3RlZC13YXJuaW5ne3ttdXRleCAnc2xzX211JyBpcyBub3QgaGVsZCBvbiBldmVyeSBwYXRoIHRocm91Z2ggaGVyZX19XAorICAgIGV4cGVjdGVkLXdhcm5pbmd7e3JlbGVhc2luZyBtdXRleCAnc2xzX211JyB0aGF0IHdhcyBub3QgaGVsZH19CiB9CiAKIHZvaWQgc2xzX2Z1bl9iYWRfNygpIHsKQEAgLTI1OCw3ICsyNTgsNyBAQAogICAgIGlmIChnZXRCb29sKCkpIHsKICAgICAgIGlmIChnZXRCb29sKCkpIHsKICAgICAgICAgY29udGludWU7IC8vIFwKLSAgICAgICAgZXhwZWN0ZWQtd2FybmluZ3t7ZXhwZWN0aW5nIG11dGV4ICdzbHNfbXUnIHRvIGJlIGxvY2tlZCBhdCBzdGFydCBvZiBlYWNoIGxvb3B9fQorICAgICAgICBleHBlY3RlZC13YXJuaW5ne3tleHBlY3RpbmcgbXV0ZXggJ3Nsc19tdScgdG8gYmUgaGVsZCBhdCBzdGFydCBvZiBlYWNoIGxvb3B9fQogICAgICAgfQogICAgIH0KICAgICBzbHNfbXUuTG9jaygpOyAvLyBleHBlY3RlZC1ub3RlIHt7bXV0ZXggYWNxdWlyZWQgaGVyZX19CkBAIC0yNzAsMTQgKzI3MCwxNCBAQAogICBzbHNfbXUuTG9jaygpOyAvLyBleHBlY3RlZC1ub3Rle3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KIAogICBkbyB7Ci0gICAgc2xzX211LlVubG9jaygpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tleHBlY3RpbmcgbXV0ZXggJ3Nsc19tdScgdG8gYmUgbG9ja2VkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcH19CisgICAgc2xzX211LlVubG9jaygpOyAvLyBleHBlY3RlZC13YXJuaW5ne3tleHBlY3RpbmcgbXV0ZXggJ3Nsc19tdScgdG8gYmUgaGVsZCBhdCBzdGFydCBvZiBlYWNoIGxvb3B9fQogICB9IHdoaWxlIChnZXRCb29sKCkpOwogfQogCiB2b2lkIHNsc19mdW5fYmFkXzkoKSB7CiAgIGRvIHsKICAgICBzbHNfbXUuTG9jaygpOyAgLy8gXAotICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXhwZWN0aW5nIG11dGV4ICdzbHNfbXUnIHRvIGJlIGxvY2tlZCBhdCBzdGFydCBvZiBlYWNoIGxvb3B9fSBcCisgICAgICAvLyBleHBlY3RlZC13YXJuaW5ne3tleHBlY3RpbmcgbXV0ZXggJ3Nsc19tdScgdG8gYmUgaGVsZCBhdCBzdGFydCBvZiBlYWNoIGxvb3B9fSBcCiAgICAgICAvLyBleHBlY3RlZC1ub3Rle3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KICAgfSB3aGlsZSAoZ2V0Qm9vbCgpKTsKICAgc2xzX211LlVubG9jaygpOwpAQCAtMjg1LDE4ICsyODUsMTggQEAKIAogdm9pZCBzbHNfZnVuX2JhZF8xMCgpIHsKICAgc2xzX211LkxvY2soKTsgIC8vIGV4cGVjdGVkLW5vdGUgMnt7bXV0ZXggYWNxdWlyZWQgaGVyZX19Ci0gIHdoaWxlKGdldEJvb2woKSkgeyAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXhwZWN0aW5nIG11dGV4ICdzbHNfbXUnIHRvIGJlIGxvY2tlZCBhdCBzdGFydCBvZiBlYWNoIGxvb3B9fQorICB3aGlsZShnZXRCb29sKCkpIHsgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4cGVjdGluZyBtdXRleCAnc2xzX211JyB0byBiZSBoZWxkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcH19CiAgICAgc2xzX211LlVubG9jaygpOwogICB9Ci19IC8vIGV4cGVjdGVkLXdhcm5pbmd7e211dGV4ICdzbHNfbXUnIGlzIHN0aWxsIGxvY2tlZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KK30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7bXV0ZXggJ3Nsc19tdScgaXMgc3RpbGwgaGVsZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KIAogdm9pZCBzbHNfZnVuX2JhZF8xMSgpIHsKICAgd2hpbGUgKGdldEJvb2woKSkgeyAvLyBcCi0gICAgICBleHBlY3RlZC13YXJuaW5ne3tleHBlY3RpbmcgbXV0ZXggJ3Nsc19tdScgdG8gYmUgbG9ja2VkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcH19CisgICAgICBleHBlY3RlZC13YXJuaW5ne3tleHBlY3RpbmcgbXV0ZXggJ3Nsc19tdScgdG8gYmUgaGVsZCBhdCBzdGFydCBvZiBlYWNoIGxvb3B9fQogICAgIHNsc19tdS5Mb2NrKCk7IC8vIGV4cGVjdGVkLW5vdGUge3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KICAgfQogICBzbHNfbXUuVW5sb2NrKCk7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5ne3t1bmxvY2tpbmcgJ3Nsc19tdScgdGhhdCB3YXMgbm90IGxvY2tlZH19CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7cmVsZWFzaW5nIG11dGV4ICdzbHNfbXUnIHRoYXQgd2FzIG5vdCBoZWxkfX0KIH0KIAogdm9pZCBzbHNfZnVuX2JhZF8xMigpIHsKQEAgLTMwNSw3ICszMDUsNyBAQAogICAgIHNsc19tdS5VbmxvY2soKTsKICAgICBpZiAoZ2V0Qm9vbCgpKSB7CiAgICAgICBpZiAoZ2V0Qm9vbCgpKSB7Ci0gICAgICAgIGJyZWFrOyAvLyBleHBlY3RlZC13YXJuaW5ne3ttdXRleCAnc2xzX211JyBpcyBub3QgbG9ja2VkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlfX0KKyAgICAgICAgYnJlYWs7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e211dGV4ICdzbHNfbXUnIGlzIG5vdCBoZWxkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlfX0KICAgICAgIH0KICAgICB9CiAgICAgc2xzX211LkxvY2soKTsKQEAgLTMzNCwxOSArMzM0LDE5IEBACiAKIHZvaWQgYWFfZnVuX2JhZF8xKCkgewogICBnbG9jay5nbG9iYWxVbmxvY2soKTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3VubG9ja2luZyAnYWFfbXUnIHRoYXQgd2FzIG5vdCBsb2NrZWR9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3JlbGVhc2luZyBtdXRleCAnYWFfbXUnIHRoYXQgd2FzIG5vdCBoZWxkfX0KIH0KIAogdm9pZCBhYV9mdW5fYmFkXzIoKSB7CiAgIGdsb2NrLmdsb2JhbExvY2soKTsKICAgZ2xvY2suZ2xvYmFsTG9jaygpOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7bG9ja2luZyAnYWFfbXUnIHRoYXQgaXMgYWxyZWFkeSBsb2NrZWR9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e2FjcXVpcmluZyBtdXRleCAnYWFfbXUnIHRoYXQgaXMgYWxyZWFkeSBoZWxkfX0KICAgZ2xvY2suZ2xvYmFsVW5sb2NrKCk7CiB9CiAKIHZvaWQgYWFfZnVuX2JhZF8zKCkgewogICBnbG9jay5nbG9iYWxMb2NrKCk7IC8vIGV4cGVjdGVkLW5vdGV7e211dGV4IGFjcXVpcmVkIGhlcmV9fQotfSAvLyBleHBlY3RlZC13YXJuaW5ne3ttdXRleCAnYWFfbXUnIGlzIHN0aWxsIGxvY2tlZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KK30gLy8gZXhwZWN0ZWQtd2FybmluZ3t7bXV0ZXggJ2FhX211JyBpcyBzdGlsbCBoZWxkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KIC8vIFJlZ3Jlc3Npb24gdGVzdHMgZm9yIHVudXN1YWwgbWV0aG9kIG5hbWVzCkBAIC0zNTksMTcgKzM1OSwxNyBAQAogICAvLyBGSVhNRTogY2FuJ3QgY3VycmVudGx5IGNoZWNrIGluc2lkZSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLgogICBXZWlyZE1ldGhvZHMoKSB7CiAgICAgd211LkxvY2soKTsgLy8gRVhQRUNURUQtTk9URSB7e211dGV4IGFjcXVpcmVkIGhlcmV9fQotICB9IC8vIEVYUEVDVEVELVdBUk5JTkcge3ttdXRleCAnd211JyBpcyBzdGlsbCBsb2NrZWQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CisgIH0gLy8gRVhQRUNURUQtV0FSTklORyB7e211dGV4ICd3bXUnIGlzIHN0aWxsIGhlbGQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CiAgIH5XZWlyZE1ldGhvZHMoKSB7CiAgICAgd211LkxvY2soKTsgLy8gRVhQRUNURUQtTk9URSB7e211dGV4IGFjcXVpcmVkIGhlcmV9fQotICB9IC8vIEVYUEVDVEVELVdBUk5JTkcge3ttdXRleCAnd211JyBpcyBzdGlsbCBsb2NrZWQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CisgIH0gLy8gRVhQRUNURUQtV0FSTklORyB7e211dGV4ICd3bXUnIGlzIHN0aWxsIGhlbGQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CiAgIHZvaWQgb3BlcmF0b3IrKygpIHsKICAgICB3bXUuTG9jaygpOyAvLyBleHBlY3RlZC1ub3RlIHt7bXV0ZXggYWNxdWlyZWQgaGVyZX19Ci0gIH0gLy8gZXhwZWN0ZWQtd2FybmluZyB7e211dGV4ICd3bXUnIGlzIHN0aWxsIGxvY2tlZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KKyAgfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ3dtdScgaXMgc3RpbGwgaGVsZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KICAgb3BlcmF0b3IgaW50KigpIHsKICAgICB3bXUuTG9jaygpOyAvLyBleHBlY3RlZC1ub3RlIHt7bXV0ZXggYWNxdWlyZWQgaGVyZX19CiAgICAgcmV0dXJuIDA7Ci0gIH0gLy8gZXhwZWN0ZWQtd2FybmluZyB7e211dGV4ICd3bXUnIGlzIHN0aWxsIGxvY2tlZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KKyAgfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ3dtdScgaXMgc3RpbGwgaGVsZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KIH07CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwpAQCAtMzg2LDEzICszODYsMTMgQEAKICAgICAgICAgICAgICAgICAgX19hdHRyaWJ1dGVfXygocHRfZ3VhcmRlZF9ieShzbHNfbXUpKSk7CiAgIHZvaWQgdGVzdEZvbygpIHsKICAgICBwZ2JfZmllbGQgPSAmeDsgLy8gXAotICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ3BnYl9maWVsZCcgcmVxdWlyZXMgbG9ja2luZyAnc2xzX211MicgZXhjbHVzaXZlbHl9fQotICAgICpwZ2JfZmllbGQgPSB4OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAncGdiX2ZpZWxkJyByZXF1aXJlcyBsb2NraW5nICdzbHNfbXUyJ319IFwKLSAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwZ2JfZmllbGQnIHJlcXVpcmVzIGxvY2tpbmcgJ3Nsc19tdScgZXhjbHVzaXZlbHl9fQotICAgIHggPSAqcGdiX2ZpZWxkOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAncGdiX2ZpZWxkJyByZXF1aXJlcyBsb2NraW5nICdzbHNfbXUyJ319IFwKLSAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwZ2JfZmllbGQnIHJlcXVpcmVzIGxvY2tpbmcgJ3Nsc19tdSd9fQotICAgICgqcGdiX2ZpZWxkKSsrOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAncGdiX2ZpZWxkJyByZXF1aXJlcyBsb2NraW5nICdzbHNfbXUyJ319IFwKLSAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwZ2JfZmllbGQnIHJlcXVpcmVzIGxvY2tpbmcgJ3Nsc19tdScgZXhjbHVzaXZlbHl9fQorICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ3BnYl9maWVsZCcgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnc2xzX211MicgZXhjbHVzaXZlbHl9fQorICAgICpwZ2JfZmllbGQgPSB4OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAncGdiX2ZpZWxkJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdzbHNfbXUyJ319IFwKKyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwZ2JfZmllbGQnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ3Nsc19tdScgZXhjbHVzaXZlbHl9fQorICAgIHggPSAqcGdiX2ZpZWxkOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAncGdiX2ZpZWxkJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdzbHNfbXUyJ319IFwKKyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwZ2JfZmllbGQnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ3Nsc19tdSd9fQorICAgICgqcGdiX2ZpZWxkKSsrOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAncGdiX2ZpZWxkJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdzbHNfbXUyJ319IFwKKyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwZ2JfZmllbGQnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ3Nsc19tdScgZXhjbHVzaXZlbHl9fQogICB9CiB9OwogCkBAIC00MDIsNyArNDAyLDcgQEAKIAogICB2b2lkIHRlc3RGb28oKSB7CiAgICAgZ2JfZmllbGQgPSAwOyAvLyBcCi0gICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnZ2JfZmllbGQnIHJlcXVpcmVzIGxvY2tpbmcgJ3Nsc19tdScgZXhjbHVzaXZlbHl9fQorICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2diX2ZpZWxkJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdzbHNfbXUnIGV4Y2x1c2l2ZWx5fX0KICAgfQogCiAgIHZvaWQgdGVzdE5vQW5hbCgpIF9fYXR0cmlidXRlX18oKG5vX3RocmVhZF9zYWZldHlfYW5hbHlzaXMpKSB7CkBAIC00MzUsNTkgKzQzNSw1OSBAQAogCiB2b2lkIGdiX2JhZF8wKCkgewogICBzbHNfZ3VhcmRfdmFyID0gMTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3dyaXRpbmcgdmFyaWFibGUgJ3Nsc19ndWFyZF92YXInIHJlcXVpcmVzIGxvY2tpbmcgYW55IG11dGV4IGV4Y2x1c2l2ZWx5fX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5ne3t3cml0aW5nIHZhcmlhYmxlICdzbHNfZ3VhcmRfdmFyJyByZXF1aXJlcyBob2xkaW5nIGFueSBtdXRleCBleGNsdXNpdmVseX19CiB9CiAKIHZvaWQgZ2JfYmFkXzEoKSB7CiAgIGludCB4ID0gc2xzX2d1YXJkX3ZhcjsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3JlYWRpbmcgdmFyaWFibGUgJ3Nsc19ndWFyZF92YXInIHJlcXVpcmVzIGxvY2tpbmcgYW55IG11dGV4fX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5ne3tyZWFkaW5nIHZhcmlhYmxlICdzbHNfZ3VhcmRfdmFyJyByZXF1aXJlcyBob2xkaW5nIGFueSBtdXRleH19CiB9CiAKIHZvaWQgZ2JfYmFkXzIoKSB7CiAgIHNsc19ndWFyZGJ5X3ZhciA9IDE7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnc2xzX2d1YXJkYnlfdmFyJyByZXF1aXJlcyBsb2NraW5nICdzbHNfbXUnIGV4Y2x1c2l2ZWx5fX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnc2xzX2d1YXJkYnlfdmFyJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdzbHNfbXUnIGV4Y2x1c2l2ZWx5fX0KIH0KIAogdm9pZCBnYl9iYWRfMygpIHsKICAgaW50IHggPSBzbHNfZ3VhcmRieV92YXI7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnc2xzX2d1YXJkYnlfdmFyJyByZXF1aXJlcyBsb2NraW5nICdzbHNfbXUnfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnc2xzX2d1YXJkYnlfdmFyJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdzbHNfbXUnfX0KIH0KIAogdm9pZCBnYl9iYWRfNCgpIHsKICAgKnBnYl9ndmFyID0gMTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwZ2JfZ3ZhcicgcmVxdWlyZXMgbG9ja2luZyBhbnkgbXV0ZXggZXhjbHVzaXZlbHl9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwZ2JfZ3ZhcicgcmVxdWlyZXMgaG9sZGluZyBhbnkgbXV0ZXggZXhjbHVzaXZlbHl9fQogfQogCiB2b2lkIGdiX2JhZF81KCkgewogICBpbnQgeCA9ICpwZ2JfZ3ZhcjsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwZ2JfZ3ZhcicgcmVxdWlyZXMgbG9ja2luZyBhbnkgbXV0ZXh9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwZ2JfZ3ZhcicgcmVxdWlyZXMgaG9sZGluZyBhbnkgbXV0ZXh9fQogfQogCiB2b2lkIGdiX2JhZF82KCkgewogICAqcGdiX3ZhciA9IDE7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAncGdiX3ZhcicgcmVxdWlyZXMgbG9ja2luZyAnc2xzX211JyBleGNsdXNpdmVseX19CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3BnYl92YXInIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ3Nsc19tdScgZXhjbHVzaXZlbHl9fQogfQogCiB2b2lkIGdiX2JhZF83KCkgewogICBpbnQgeCA9ICpwZ2JfdmFyOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3BnYl92YXInIHJlcXVpcmVzIGxvY2tpbmcgJ3Nsc19tdSd9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwZ2JfdmFyJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdzbHNfbXUnfX0KIH0KIAogdm9pZCBnYl9iYWRfOCgpIHsKICAgR0JGb28gRzsKICAgRy5nYl9maWVsZCA9IDA7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnZ2JfZmllbGQnIHJlcXVpcmVzIGxvY2tpbmcgJ3Nsc19tdSd9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdnYl9maWVsZCcgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnc2xzX211J319CiB9CiAKIHZvaWQgZ2JfYmFkXzkoKSB7CiAgIHNsc19ndWFyZF92YXIrKzsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3dyaXRpbmcgdmFyaWFibGUgJ3Nsc19ndWFyZF92YXInIHJlcXVpcmVzIGxvY2tpbmcgYW55IG11dGV4IGV4Y2x1c2l2ZWx5fX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5ne3t3cml0aW5nIHZhcmlhYmxlICdzbHNfZ3VhcmRfdmFyJyByZXF1aXJlcyBob2xkaW5nIGFueSBtdXRleCBleGNsdXNpdmVseX19CiAgIHNsc19ndWFyZF92YXItLTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3dyaXRpbmcgdmFyaWFibGUgJ3Nsc19ndWFyZF92YXInIHJlcXVpcmVzIGxvY2tpbmcgYW55IG11dGV4IGV4Y2x1c2l2ZWx5fX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5ne3t3cml0aW5nIHZhcmlhYmxlICdzbHNfZ3VhcmRfdmFyJyByZXF1aXJlcyBob2xkaW5nIGFueSBtdXRleCBleGNsdXNpdmVseX19CiAgICsrc2xzX2d1YXJkX3ZhcjsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3dyaXRpbmcgdmFyaWFibGUgJ3Nsc19ndWFyZF92YXInIHJlcXVpcmVzIGxvY2tpbmcgYW55IG11dGV4IGV4Y2x1c2l2ZWx5fX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5ne3t3cml0aW5nIHZhcmlhYmxlICdzbHNfZ3VhcmRfdmFyJyByZXF1aXJlcyBob2xkaW5nIGFueSBtdXRleCBleGNsdXNpdmVseX19CiAgIC0tc2xzX2d1YXJkX3ZhcjsvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7d3JpdGluZyB2YXJpYWJsZSAnc2xzX2d1YXJkX3ZhcicgcmVxdWlyZXMgbG9ja2luZyBhbnkgbXV0ZXggZXhjbHVzaXZlbHl9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3dyaXRpbmcgdmFyaWFibGUgJ3Nsc19ndWFyZF92YXInIHJlcXVpcmVzIGhvbGRpbmcgYW55IG11dGV4IGV4Y2x1c2l2ZWx5fX0KIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCkBAIC01MDMsMTEgKzUwMywxMSBAQAogCiAgIHZvaWQgdGVzdCgpIHsKICAgICBhID0gMDsgLy8gXAotICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgbG9ja2luZyAnbXUnIGV4Y2x1c2l2ZWx5fX0KKyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211JyBleGNsdXNpdmVseX19CiAgICAgYiA9IGE7IC8vIFwKLSAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBsb2NraW5nICdtdSd9fQorICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211J319CiAgICAgYyA9IDA7IC8vIFwKLSAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdjJyByZXF1aXJlcyBsb2NraW5nICdtdScgZXhjbHVzaXZlbHl9fQorICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2MnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211JyBleGNsdXNpdmVseX19CiAgIH0KIAogICBpbnQgYyBfX2F0dHJpYnV0ZV9fKChndWFyZGVkX2J5KG11KSkpOwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAgIExhdGVGb28gZm9vQjsKICAgZm9vQS5tdS5Mb2NrKCk7CiAgIGZvb0IuYSA9IDU7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5ne3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBsb2NraW5nICdmb29CLm11JyBleGNsdXNpdmVseX19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5ne3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdmb29CLm11JyBleGNsdXNpdmVseX19IFwKICAgICAvLyBleHBlY3RlZC1ub3Rle3tmb3VuZCBuZWFyIG1hdGNoICdmb29BLm11J319CiAgIGZvb0EubXUuVW5sb2NrKCk7CiB9CkBAIC01NjAsNyArNTYwLDcgQEAKICAgYjEubXUxXy5Mb2NrKCk7CiAgIGludCByZXMgPSBiMS5hXyArIGIzLT5iXzsKICAgYjMtPmJfID0gKmIxLnE7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5ne3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdxJyByZXF1aXJlcyBsb2NraW5nICdiMS5tdSd9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2IxLm11J319CiAgIGIxLm11MV8uVW5sb2NrKCk7CiAgIGIxLmJfID0gcmVzOwogICBtdS5VbmxvY2soKTsKQEAgLTU3MCw3ICs1NzAsNyBAQAogICBMYXRlQmFyIEJhckE7CiAgIEJhckEuRm9vUG9pbnRlci0+bXUuTG9jaygpOwogICBCYXJBLkZvby5hID0gMjsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGxvY2tpbmcgJ0JhckEuRm9vLm11JyBleGNsdXNpdmVseX19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5ne3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdCYXJBLkZvby5tdScgZXhjbHVzaXZlbHl9fSBcCiAgICAgLy8gZXhwZWN0ZWQtbm90ZXt7Zm91bmQgbmVhciBtYXRjaCAnQmFyQS5Gb29Qb2ludGVyLT5tdSd9fQogICBCYXJBLkZvb1BvaW50ZXItPm11LlVubG9jaygpOwogfQpAQCAtNTc5LDcgKzU3OSw3IEBACiAgIExhdGVCYXIgQmFyQTsKICAgQmFyQS5Gb28ubXUuTG9jaygpOwogICBCYXJBLkZvb1BvaW50ZXItPmEgPSAyOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgbG9ja2luZyAnQmFyQS5Gb29Qb2ludGVyLT5tdScgZXhjbHVzaXZlbHl9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnQmFyQS5Gb29Qb2ludGVyLT5tdScgZXhjbHVzaXZlbHl9fSBcCiAgICAgLy8gZXhwZWN0ZWQtbm90ZXt7Zm91bmQgbmVhciBtYXRjaCAnQmFyQS5Gb28ubXUnfX0KICAgQmFyQS5Gb28ubXUuVW5sb2NrKCk7CiB9CkBAIC01ODgsNyArNTg4LDcgQEAKICAgTGF0ZUJhciBCYXJBOwogICBCYXJBLkZvby5tdS5Mb2NrKCk7CiAgIEJhckEuRm9vMi5hID0gMjsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmd7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGxvY2tpbmcgJ0JhckEuRm9vMi5tdScgZXhjbHVzaXZlbHl9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ3t7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnQmFyQS5Gb28yLm11JyBleGNsdXNpdmVseX19IFwKICAgICAvLyBleHBlY3RlZC1ub3Rle3tmb3VuZCBuZWFyIG1hdGNoICdCYXJBLkZvby5tdSd9fQogICBCYXJBLkZvby5tdS5VbmxvY2soKTsKIH0KQEAgLTYwOCwxMSArNjA4LDExIEBACiAKIHZvaWQgc2hhcmVkX2Z1bl8xKCkgewogICBzbHNfbXUuUmVhZGVyTG9jaygpOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e211dGV4ICdzbHNfbXUnIGlzIGxvY2tlZCBleGNsdXNpdmVseSBhbmQgc2hhcmVkIGluIHRoZSBzYW1lIHNjb3BlfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ3Nsc19tdScgaXMgYWNxdWlyZWQgZXhjbHVzaXZlbHkgYW5kIHNoYXJlZCBpbiB0aGUgc2FtZSBzY29wZX19CiAgIGRvIHsKICAgICBzbHNfbXUuVW5sb2NrKCk7CiAgICAgc2xzX211LkxvY2soKTsgIC8vIFwKLSAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3t0aGUgb3RoZXIgbG9jayBvZiBtdXRleCAnc2xzX211JyBpcyBoZXJlfX0KKyAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3t0aGUgb3RoZXIgYWNxdWlzaXRpb24gb2YgbXV0ZXggJ3Nsc19tdScgaXMgaGVyZX19CiAgIH0gd2hpbGUgKGdldEJvb2woKSk7CiAgIHNsc19tdS5VbmxvY2soKTsKIH0KQEAgLTYzOCwyMCArNjM4LDIwIEBACiB2b2lkIHNoYXJlZF9mdW5fOCgpIHsKICAgaWYgKGdldEJvb2woKSkKICAgICBzbHNfbXUuTG9jaygpOyAvLyBcCi0gICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ3Nsc19tdScgaXMgbG9ja2VkIGV4Y2x1c2l2ZWx5IGFuZCBzaGFyZWQgaW4gdGhlIHNhbWUgc2NvcGV9fQorICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e211dGV4ICdzbHNfbXUnIGlzIGFjcXVpcmVkIGV4Y2x1c2l2ZWx5IGFuZCBzaGFyZWQgaW4gdGhlIHNhbWUgc2NvcGV9fQogICBlbHNlCiAgICAgc2xzX211LlJlYWRlckxvY2soKTsgLy8gXAotICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3RoZSBvdGhlciBsb2NrIG9mIG11dGV4ICdzbHNfbXUnIGlzIGhlcmV9fQorICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3RoZSBvdGhlciBhY3F1aXNpdGlvbiBvZiBtdXRleCAnc2xzX211JyBpcyBoZXJlfX0KICAgc2xzX211LlVubG9jaygpOwogfQogCiB2b2lkIHNoYXJlZF9iYWRfMCgpIHsKICAgc2xzX211LkxvY2soKTsgIC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ3Nsc19tdScgaXMgbG9ja2VkIGV4Y2x1c2l2ZWx5IGFuZCBzaGFyZWQgaW4gdGhlIHNhbWUgc2NvcGV9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnc2xzX211JyBpcyBhY3F1aXJlZCBleGNsdXNpdmVseSBhbmQgc2hhcmVkIGluIHRoZSBzYW1lIHNjb3BlfX0KICAgZG8gewogICAgIHNsc19tdS5VbmxvY2soKTsKICAgICBzbHNfbXUuUmVhZGVyTG9jaygpOyAgLy8gXAotICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3RoZSBvdGhlciBsb2NrIG9mIG11dGV4ICdzbHNfbXUnIGlzIGhlcmV9fQorICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3RoZSBvdGhlciBhY3F1aXNpdGlvbiBvZiBtdXRleCAnc2xzX211JyBpcyBoZXJlfX0KICAgfSB3aGlsZSAoZ2V0Qm9vbCgpKTsKICAgc2xzX211LlVubG9jaygpOwogfQpAQCAtNjU5LDEwICs2NTksMTAgQEAKIHZvaWQgc2hhcmVkX2JhZF8xKCkgewogICBpZiAoZ2V0Qm9vbCgpKQogICAgIHNsc19tdS5Mb2NrKCk7IC8vIFwKLSAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnc2xzX211JyBpcyBsb2NrZWQgZXhjbHVzaXZlbHkgYW5kIHNoYXJlZCBpbiB0aGUgc2FtZSBzY29wZX19CisgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ3Nsc19tdScgaXMgYWNxdWlyZWQgZXhjbHVzaXZlbHkgYW5kIHNoYXJlZCBpbiB0aGUgc2FtZSBzY29wZX19CiAgIGVsc2UKICAgICBzbHNfbXUuUmVhZGVyTG9jaygpOyAvLyBcCi0gICAgICAvLyBleHBlY3RlZC1ub3RlIHt7dGhlIG90aGVyIGxvY2sgb2YgbXV0ZXggJ3Nsc19tdScgaXMgaGVyZX19CisgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7dGhlIG90aGVyIGFjcXVpc2l0aW9uIG9mIG11dGV4ICdzbHNfbXUnIGlzIGhlcmV9fQogICAqcGdiX3ZhciA9IDE7CiAgIHNsc19tdS5VbmxvY2soKTsKIH0KQEAgLTY3MCwxMCArNjcwLDEwIEBACiB2b2lkIHNoYXJlZF9iYWRfMigpIHsKICAgaWYgKGdldEJvb2woKSkKICAgICBzbHNfbXUuUmVhZGVyTG9jaygpOyAvLyBcCi0gICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ3Nsc19tdScgaXMgbG9ja2VkIGV4Y2x1c2l2ZWx5IGFuZCBzaGFyZWQgaW4gdGhlIHNhbWUgc2NvcGV9fQorICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e211dGV4ICdzbHNfbXUnIGlzIGFjcXVpcmVkIGV4Y2x1c2l2ZWx5IGFuZCBzaGFyZWQgaW4gdGhlIHNhbWUgc2NvcGV9fQogICBlbHNlCiAgICAgc2xzX211LkxvY2soKTsgLy8gXAotICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3RoZSBvdGhlciBsb2NrIG9mIG11dGV4ICdzbHNfbXUnIGlzIGhlcmV9fQorICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3RoZSBvdGhlciBhY3F1aXNpdGlvbiBvZiBtdXRleCAnc2xzX211JyBpcyBoZXJlfX0KICAgKnBnYl92YXIgPSAxOwogICBzbHNfbXUuVW5sb2NrKCk7CiB9CkBAIC03NjIsNDkgKzc2Miw0OSBAQAogCiB2b2lkIGVzX2JhZF8wKCkgewogICBCYXIuYWFfZWxyX2Z1bigpOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2FhX2Vscl9mdW4nIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdhYV9tdSd9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdhYV9lbHJfZnVuJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdhYV9tdScgZXhjbHVzaXZlbHl9fQogfQogCiB2b2lkIGVzX2JhZF8xKCkgewogICBhYV9tdS5SZWFkZXJMb2NrKCk7CiAgIEJhci5hYV9lbHJfZnVuKCk7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnYWFfZWxyX2Z1bicgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ2FhX211J319CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2FhX2Vscl9mdW4nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2FhX211JyBleGNsdXNpdmVseX19CiAgIGFhX211LlVubG9jaygpOwogfQogCiB2b2lkIGVzX2JhZF8yKCkgewogICBCYXIuYWFfZWxyX2Z1bl9zKCk7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnYWFfZWxyX2Z1bl9zJyByZXF1aXJlcyBzaGFyZWQgbG9jayBvbiAnYWFfbXUnfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnYWFfZWxyX2Z1bl9zJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdhYV9tdSd9fQogfQogCiB2b2lkIGVzX2JhZF8zKCkgewogICBNeUxSRm9vLnRlc3QoKTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICd0ZXN0JyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnc2xzX211J319CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ3Rlc3QnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ3Nsc19tdScgZXhjbHVzaXZlbHl9fQogfQogCiB2b2lkIGVzX2JhZF80KCkgewogICBNeUxSRm9vLnRlc3RTaGFyZWQoKTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICd0ZXN0U2hhcmVkJyByZXF1aXJlcyBzaGFyZWQgbG9jayBvbiAnc2xzX211Mid9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICd0ZXN0U2hhcmVkJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdzbHNfbXUyJ319CiB9CiAKIHZvaWQgZXNfYmFkXzUoKSB7CiAgIHNsc19tdS5SZWFkZXJMb2NrKCk7CiAgIE15TFJGb28udGVzdCgpOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ3Rlc3QnIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdzbHNfbXUnfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAndGVzdCcgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnc2xzX211JyBleGNsdXNpdmVseX19CiAgIHNsc19tdS5VbmxvY2soKTsKIH0KIAogdm9pZCBlc19iYWRfNigpIHsKICAgc2xzX211LkxvY2soKTsKICAgQmFyLmxlX2Z1bigpOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Nhbm5vdCBjYWxsIGZ1bmN0aW9uICdsZV9mdW4nIHdoaWxlIG11dGV4ICdzbHNfbXUnIGlzIGxvY2tlZH19CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Nhbm5vdCBjYWxsIGZ1bmN0aW9uICdsZV9mdW4nIHdoaWxlIG11dGV4ICdzbHNfbXUnIGlzIGhlbGR9fQogICBzbHNfbXUuVW5sb2NrKCk7CiB9CiAKIHZvaWQgZXNfYmFkXzcoKSB7CiAgIHNsc19tdS5SZWFkZXJMb2NrKCk7CiAgIEJhci5sZV9mdW4oKTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnbGVfZnVuJyB3aGlsZSBtdXRleCAnc2xzX211JyBpcyBsb2NrZWR9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnbGVfZnVuJyB3aGlsZSBtdXRleCAnc2xzX211JyBpcyBoZWxkfX0KICAgc2xzX211LlVubG9jaygpOwogfQogCkBAIC0xMjA5LDcgKzEyMDksNyBAQAogewogICBpbnQgeDsKICAgbXVfLkxvY2soKTsKLSAgeCA9IGZvbygpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnbXUyJ319CisgIHggPSBmb28oKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2ZvbycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUyJyBleGNsdXNpdmVseX19CiAgIGFfID0geCArIDE7CiAgIG11Xy5VbmxvY2soKTsKICAgaWYgKHggPiA1KSB7CkBAIC0xMjIzLDEzICsxMjIzLDEzIEBACiB7CiAgIEZvbyBmMSwgKmYyOwogICBmMS5tdV8uTG9jaygpOwotICBmMS5iYXIoKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Nhbm5vdCBjYWxsIGZ1bmN0aW9uICdiYXInIHdoaWxlIG11dGV4ICdmMS5tdV8nIGlzIGxvY2tlZH19CisgIGYxLmJhcigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ2Jhcicgd2hpbGUgbXV0ZXggJ2YxLm11XycgaXMgaGVsZH19CiAgIG11Mi5Mb2NrKCk7CiAgIGYxLmZvbygpOwogICBtdTIuVW5sb2NrKCk7CiAgIGYxLm11Xy5VbmxvY2soKTsKICAgZjItPm11Xy5Mb2NrKCk7Ci0gIGYyLT5iYXIoKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Nhbm5vdCBjYWxsIGZ1bmN0aW9uICdiYXInIHdoaWxlIG11dGV4ICdmMi0+bXVfJyBpcyBsb2NrZWR9fQorICBmMi0+YmFyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnYmFyJyB3aGlsZSBtdXRleCAnZjItPm11XycgaXMgaGVsZH19CiAgIGYyLT5tdV8uVW5sb2NrKCk7CiAgIG11Mi5Mb2NrKCk7CiAgIHcgPSAyOwpAQCAtMTI1OCw3ICsxMjU4LDcgQEAKICAgYjEtPk15TG9jaygpOwogICBiMS0+YV8gPSA1OwogICBiMi0+YV8gPSAzOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2FfJyByZXF1aXJlcyBsb2NraW5nICdiMi0+bXUxXycgZXhjbHVzaXZlbHl9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2FfJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdiMi0+bXUxXycgZXhjbHVzaXZlbHl9fSBcCiAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvdW5kIG5lYXIgbWF0Y2ggJ2IxLT5tdTFfJ319CiAgIGIyLT5NeUxvY2soKTsKICAgYjItPk15VW5sb2NrKCk7CkBAIC0xMjg4LDE4ICsxMjg4LDE4IEBACiB7CiAgIGludCB4OwogICBiMy0+bXUxXy5Mb2NrKCk7Ci0gIHJlcyA9IGIxLmFfICsgYjMtPmJfOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYV8nIHJlcXVpcmVzIGxvY2tpbmcgJ2IxLm11MV8nfX0gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdyZXMnIHJlcXVpcmVzIGxvY2tpbmcgJ211JyBleGNsdXNpdmVseX19IFwKKyAgcmVzID0gYjEuYV8gKyBiMy0+Yl87IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdhXycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnYjEubXUxXyd9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ3JlcycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUnIGV4Y2x1c2l2ZWx5fX0gXAogICAgIC8vIGV4cGVjdGVkLW5vdGUge3tmb3VuZCBuZWFyIG1hdGNoICdiMy0+bXUxXyd9fQotICAqcCA9IGk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdwJyByZXF1aXJlcyBsb2NraW5nICdtdSd9fSBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3AnIHJlcXVpcmVzIGxvY2tpbmcgJ211JyBleGNsdXNpdmVseX19Ci0gIGIxLmFfID0gcmVzICsgYjMtPmJfOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAncmVzJyByZXF1aXJlcyBsb2NraW5nICdtdSd9fSBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2FfJyByZXF1aXJlcyBsb2NraW5nICdiMS5tdTFfJyBleGNsdXNpdmVseX19IFwKKyAgKnAgPSBpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAncCcgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUnfX0gXAorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdwJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdScgZXhjbHVzaXZlbHl9fQorICBiMS5hXyA9IHJlcyArIGIzLT5iXzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3JlcycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUnfX0gXAorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhXycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnYjEubXUxXycgZXhjbHVzaXZlbHl9fSBcCiAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvdW5kIG5lYXIgbWF0Y2ggJ2IzLT5tdTFfJ319Ci0gIGIzLT5iXyA9ICpiMS5xOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAncScgcmVxdWlyZXMgbG9ja2luZyAnbXUnfX0KKyAgYjMtPmJfID0gKmIxLnE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdxJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdSd9fQogICBiMy0+bXUxXy5VbmxvY2soKTsKLSAgYjEuYl8gPSByZXM7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdyZXMnIHJlcXVpcmVzIGxvY2tpbmcgJ211J319Ci0gIHggPSByZXM7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdyZXMnIHJlcXVpcmVzIGxvY2tpbmcgJ211J319CisgIGIxLmJfID0gcmVzOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAncmVzJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdSd9fQorICB4ID0gcmVzOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAncmVzJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdSd9fQogICByZXR1cm4geDsKIH0KIH0gLy8gZW5kIG5hbWVzcGFjZSB0aHJlYWRfYW5ub3RfbG9ja18yMQpAQCAtMTMyMSwxMCArMTMyMSwxMCBAQAogICAgICBjaGlsZC0+RnVuYyhuZXdfZm9vKTsgLy8gVGhlcmUgc2hvdWxkbid0IGJlIGFueSB3YXJuaW5nIGhlcmUgYXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3F1aXJlZCBsb2NrIGlzIG5vdCBpbiBjaGlsZC4KICAgICAgY2hpbGQtPmJhcig3KTsgLy8gXAotICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdiYXInIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdjaGlsZC0+bG9ja18nfX0gXAorICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdiYXInIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2NoaWxkLT5sb2NrXycgZXhjbHVzaXZlbHl9fSBcCiAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvdW5kIG5lYXIgbWF0Y2ggJ2xvY2tfJ319CiAgICAgIGNoaWxkLT5hXyA9IDU7IC8vIFwKLSAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYV8nIHJlcXVpcmVzIGxvY2tpbmcgJ2NoaWxkLT5sb2NrXycgZXhjbHVzaXZlbHl9fSBcCisgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2FfJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdjaGlsZC0+bG9ja18nIGV4Y2x1c2l2ZWx5fX0gXAogICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3tmb3VuZCBuZWFyIG1hdGNoICdsb2NrXyd9fQogICAgICBsb2NrXy5VbmxvY2soKTsKICAgfQpAQCAtMTM2Miw3ICsxMzYyLDcgQEAKICAgbG9ja18uTG9jaygpOwogCiAgIGNoaWxkLT5sb2NrXy5Mb2NrKCk7Ci0gIGNoaWxkLT5GdW5jKG5ld19mb28pOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ0Z1bmMnIHdoaWxlIG11dGV4ICdjaGlsZC0+bG9ja18nIGlzIGxvY2tlZH19CisgIGNoaWxkLT5GdW5jKG5ld19mb28pOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ0Z1bmMnIHdoaWxlIG11dGV4ICdjaGlsZC0+bG9ja18nIGlzIGhlbGR9fQogICBjaGlsZC0+YmFyKDcpOwogICBjaGlsZC0+YV8gPSA1OwogICBjaGlsZC0+bG9ja18uVW5sb2NrKCk7CkBAIC0xNDAxLDggKzE0MDEsOCBAQAogIHB1YmxpYzoKICAgdm9pZCBmMSgpIEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRChtdTIpIEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRChtdTEpIHsKICAgICB4ID0gNTsKLSAgICBmMigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ2YyJyB3aGlsZSBtdXRleCAnbXUxJyBpcyBsb2NrZWR9fSBcCi0gICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ2YyJyB3aGlsZSBtdXRleCAnbXUyJyBpcyBsb2NrZWR9fQorICAgIGYyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnZjInIHdoaWxlIG11dGV4ICdtdTEnIGlzIGhlbGR9fSBcCisgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ2YyJyB3aGlsZSBtdXRleCAnbXUyJyBpcyBoZWxkfX0KICAgfQogfTsKIApAQCAtMTQxMCw4ICsxNDEwLDggQEAKIAogdm9pZCBmdW5jKCkKIHsKLSAgZm9vLT5mMSgpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZjEnIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdmb28tPm11Mid9fSBcCi0gICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2YxJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnZm9vLT5tdTEnfX0KKyAgZm9vLT5mMSgpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZjEnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2Zvby0+bXUyJyBleGNsdXNpdmVseX19IFwKKyAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZjEnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2Zvby0+bXUxJyBleGNsdXNpdmVseX19CiB9CiB9IC8vIGVuZCBuYW1lc3BhY2UgdGhyZWFkX2Fubm90X2xvY2tfNDIKIApAQCAtMTQzNCwxNCArMTQzNCwxNCBAQAogICBDaGlsZCAqYzsKICAgQmFzZSAqYiA9IGM7CiAKLSAgYi0+ZnVuYzEoKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2Z1bmMxJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnYi0+bXVfJ319CisgIGItPmZ1bmMxKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdmdW5jMScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnYi0+bXVfJyBleGNsdXNpdmVseX19CiAgIGItPm11Xy5Mb2NrKCk7Ci0gIGItPmZ1bmMyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnZnVuYzInIHdoaWxlIG11dGV4ICdiLT5tdV8nIGlzIGxvY2tlZH19CisgIGItPmZ1bmMyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnZnVuYzInIHdoaWxlIG11dGV4ICdiLT5tdV8nIGlzIGhlbGR9fQogICBiLT5tdV8uVW5sb2NrKCk7CiAKLSAgYy0+ZnVuYzEoKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2Z1bmMxJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnYy0+bXVfJ319CisgIGMtPmZ1bmMxKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdmdW5jMScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnYy0+bXVfJyBleGNsdXNpdmVseX19CiAgIGMtPm11Xy5Mb2NrKCk7Ci0gIGMtPmZ1bmMyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnZnVuYzInIHdoaWxlIG11dGV4ICdjLT5tdV8nIGlzIGxvY2tlZH19CisgIGMtPmZ1bmMyKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnZnVuYzInIHdoaWxlIG11dGV4ICdjLT5tdV8nIGlzIGhlbGR9fQogICBjLT5tdV8uVW5sb2NrKCk7CiB9CiB9IC8vIGVuZCBuYW1lc3BhY2UgdGhyZWFkX2Fubm90X2xvY2tfNDYKQEAgLTE0NjgsMTAgKzE0NjgsMTAgQEAKIHZvaWQgbWFpbigpCiB7CiAgIEZvbyBhOwotICBhLm1ldGhvZDEoMSk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdtZXRob2QxJyByZXF1aXJlcyBzaGFyZWQgbG9jayBvbiAnYS5tdTEnfX0gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdtZXRob2QxJyByZXF1aXJlcyBzaGFyZWQgbG9jayBvbiAnbXUnfX0gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdtZXRob2QxJyByZXF1aXJlcyBzaGFyZWQgbG9jayBvbiAnYS5tdTInfX0gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdtZXRob2QxJyByZXF1aXJlcyBzaGFyZWQgbG9jayBvbiAnbXUzJ319CisgIGEubWV0aG9kMSgxKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ21ldGhvZDEnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2EubXUxJ319IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnbWV0aG9kMScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUnfX0gXAorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdtZXRob2QxJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdhLm11Mid9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ21ldGhvZDEnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Myd9fQogfQogfSAvLyBlbmQgbmFtZXNwYWNlIHRocmVhZF9hbm5vdF9sb2NrXzY3X21vZGlmaWVkCiAKQEAgLTE1MTYsMTQgKzE1MTYsMTQgQEAKICAgICAgIERhdGFMb2NrZXIgZGxyOwogICAgICAgZGxyLmxvY2tEYXRhKGQxKTsgICAvLyBleHBlY3RlZC1ub3RlIHt7bXV0ZXggYWNxdWlyZWQgaGVyZX19CiAgICAgICBkbHIudW5sb2NrRGF0YShkMik7IC8vIFwKLSAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VubG9ja2luZyAnZDItPm11JyB0aGF0IHdhcyBub3QgbG9ja2VkfX0KLSAgICB9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnZDEtPm11JyBpcyBzdGlsbCBsb2NrZWQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CisgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxlYXNpbmcgbXV0ZXggJ2QyLT5tdScgdGhhdCB3YXMgbm90IGhlbGR9fQorICAgIH0gLy8gZXhwZWN0ZWQtd2FybmluZyB7e211dGV4ICdkMS0+bXUnIGlzIHN0aWxsIGhlbGQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CiAKICAgICB2b2lkIGJhcjQoTXlEYXRhKiBkMSwgTXlEYXRhKiBkMikgewogICAgICAgRGF0YUxvY2tlciBkbHI7CiAgICAgICBkbHIubG9ja0RhdGEoZDEpOwogICAgICAgZm9vKGQyKTsgLy8gXAotICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnZDItPm11J319IFwKKyAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2ZvbycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnZDItPm11JyBleGNsdXNpdmVseX19IFwKICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvdW5kIG5lYXIgbWF0Y2ggJ2QxLT5tdSd9fQogICAgICAgZGxyLnVubG9ja0RhdGEoZDEpOwogICAgIH0KQEAgLTE1NjYsOCArMTU2Niw4IEBACiAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CiAgIHN0cnVjdCBJbmRpcmVjdExvY2sgewogICAgIGludCBEb05hdWdodHlUaGluZ3MoVCAqdCkgewotICAgICAgdS0+biA9IDA7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICd1JyByZXF1aXJlcyBsb2NraW5nICdtJ319Ci0gICAgICByZXR1cm4gdC0+cy0+bjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3MnIHJlcXVpcmVzIGxvY2tpbmcgJ3QtPm0nfX0KKyAgICAgIHUtPm4gPSAwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAndScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbSd9fQorICAgICAgcmV0dXJuIHQtPnMtPm47IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdzJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICd0LT5tJ319CiAgICAgfQogICB9OwogCkBAIC0xNTgzLDcgKzE1ODMsNyBAQAogICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzdHJ1Y3QgVyB7CiAgICAgViB2OwogICAgIHZvaWQgZihVIHUpIHsKLSAgICAgIHYucC0+Zih1KTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3AnIHJlcXVpcmVzIGxvY2tpbmcgJ3YubSd9fQorICAgICAgdi5wLT5mKHUpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAncCcgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAndi5tJ319CiAgICAgfQogICB9OwogICB0ZW1wbGF0ZSBzdHJ1Y3QgVzxpbnQ+OyAvLyBleHBlY3RlZC1ub3RlIHt7aGVyZX19CkBAIC0xNjIwLDcgKzE2MjAsNyBAQAogICB2b2lkIGZvbzMoKSB7CiAgICAgTXV0ZXhMb2NrIG11bG9ja19hKCZtdTEpOwogICAgIE11dGV4TG9jayBtdWxvY2tfYigmbXUxKTsgLy8gXAotICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2xvY2tpbmcgJ211MScgdGhhdCBpcyBhbHJlYWR5IGxvY2tlZH19CisgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWNxdWlyaW5nIG11dGV4ICdtdTEnIHRoYXQgaXMgYWxyZWFkeSBoZWxkfX0KICAgfQogCiAgIHZvaWQgZm9vNCgpIHsKQEAgLTE2NDYsNyArMTY0Niw3IEBACiB2b2lkIGZvbygpIEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRChmb29PYmoubXVfKTsKIAogdm9pZCBiYXIoKSB7Ci0gIGZvbygpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2ZvbycgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ2Zvb09iai5tdV8nfX0KKyAgZm9vKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdmb29PYmoubXVfJyBleGNsdXNpdmVseX19CiAgIGZvb09iai5tdV8uTG9jaygpOwogICBmb28oKTsKICAgZm9vT2JqLm11Xy5VbmxvY2soKTsKQEAgLTE3MjIsNyArMTcyMiw3IEBACiAgICAgaWYgKGNvbmQpCiAgICAgICBiID0gdHJ1ZTsKICAgICBpZiAoYikgeyAgICAvLyBiIHNob3VsZCBiZSB1bmtub3duIGF0IHRoaXMgcG9pbnQsIGJlY2F1c2Ugb2YgdGhlIGpvaW4gcG9pbnQKLSAgICAgIGEgPSA4OyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgbG9ja2luZyAnbXUnIGV4Y2x1c2l2ZWx5fX0KKyAgICAgIGEgPSA4OyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUnIGV4Y2x1c2l2ZWx5fX0KICAgICB9CiAgICAgaWYgKGIyKSB7ICAgLy8gYjIgc2hvdWxkIGJlIGtub3duIGF0IHRoaXMgcG9pbnQuCiAgICAgICBhID0gODsKQEAgLTE3NDgsNyArMTc0OCw3IEBACiAKICAgICB3aGlsZSAoY29uZCkgewogICAgICAgaWYgKGIpIHsgICAvLyBiIHNob3VsZCBiZSB1a25vd24gYXQgdGhpcyBwb2ludCBiL2Mgb2YgdGhlIGxvb3AKLSAgICAgICAgYSA9IDEwOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGxvY2tpbmcgJ211JyBleGNsdXNpdmVseX19CisgICAgICAgIGEgPSAxMDsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdScgZXhjbHVzaXZlbHl9fQogICAgICAgfQogICAgICAgYiA9ICFiOwogICAgIH0KQEAgLTE4NzYsNyArMTg3Niw3IEBACiAKICAgZjEubXVfLlVubG9jaygpOwogICBidC5iYXJURCgmZjEpOyAgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdiYXJURCcgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ2YxLm11Xyd9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2JhclREJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdmMS5tdV8nIGV4Y2x1c2l2ZWx5fX0gXAogICAgIC8vIGV4cGVjdGVkLW5vdGUge3tmb3VuZCBuZWFyIG1hdGNoICdidC5mb29CYXNlLm11Xyd9fQogCiAgIGJ0LmZvb0Jhc2UubXVfLlVubG9jaygpOwpAQCAtMTg4NSw3ICsxODg1LDcgQEAKIAogICBDZWxsPGludD4gY2VsbDsKICAgY2VsbC5kYXRhID0gMDsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdkYXRhJyByZXF1aXJlcyBsb2NraW5nICdjZWxsLm11XycgZXhjbHVzaXZlbHl9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdkYXRhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdjZWxsLm11XycgZXhjbHVzaXZlbHl9fQogICBjZWxsLmZvbygpOwogICBjZWxsLm11Xy5Mb2NrKCk7CiAgIGNlbGwuZm9vRXgoKTsKQEAgLTE5NTQsNyArMTk1NCw3IEBACiB2b2lkIHRlc3QoKSB7CiAgIEZvbyBteWZvbzsKICAgbXlmb28uZm9vMSgmbXlmb28pOyAgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdmb28xJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnbXlmb28ubXVfJ319CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2ZvbzEnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ215Zm9vLm11XycgZXhjbHVzaXZlbHl9fQogICBteWZvby5tdV8uTG9jaygpOwogICBteWZvby5mb28xKCZteWZvbyk7CiAgIG15Zm9vLm11Xy5VbmxvY2soKTsKQEAgLTE5ODAsNyArMTk4MCw3IEBACiAgICAgICBpZiAoYmFyKCkpIHsKICAgICAgICAgLy8gLi4uCiAgICAgICAgIGlmIChmb28oKSkKLSAgICAgICAgICBjb250aW51ZTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4cGVjdGluZyBtdXRleCAnbScgdG8gYmUgbG9ja2VkIGF0IHN0YXJ0IG9mIGVhY2ggbG9vcH19CisgICAgICAgICAgY29udGludWU7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHBlY3RpbmcgbXV0ZXggJ20nIHRvIGJlIGhlbGQgYXQgc3RhcnQgb2YgZWFjaCBsb29wfX0KICAgICAgICAgLy8uLi4KICAgICAgIH0KICAgICAgIC8vIC4uLgpAQCAtMjA2OSwyMSArMjA2OSwyMSBAQAogICBGb28gbXlGb287CiAKICAgbXlGb28uZm9vMigpOyAgICAgICAgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdmb28yJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnbXlGb28ubXVfJ319CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2ZvbzInIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ215Rm9vLm11XycgZXhjbHVzaXZlbHl9fQogICBteUZvby5mb28zKCZteUZvbyk7ICAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2ZvbzMnIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdteUZvby5tdV8nfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vMycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXlGb28ubXVfJyBleGNsdXNpdmVseX19CiAgIG15Rm9vLmZvb1QxKGR1bW15KTsgIC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vVDEnIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdteUZvby5tdV8nfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vVDEnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ215Rm9vLm11XycgZXhjbHVzaXZlbHl9fQogCiAgIG15Rm9vLmZvb1QyKGR1bW15KTsgIC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vVDInIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdteUZvby5tdV8nfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vVDInIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ215Rm9vLm11XycgZXhjbHVzaXZlbHl9fQogCiAgIGZvb0YxKCZteUZvbyk7ICAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2Zvb0YxJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnbXlGb28ubXVfJ319CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2Zvb0YxJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdteUZvby5tdV8nIGV4Y2x1c2l2ZWx5fX0KICAgZm9vRjIoJm15Rm9vKTsgIC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vRjInIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdteUZvby5tdV8nfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vRjInIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ215Rm9vLm11XycgZXhjbHVzaXZlbHl9fQogICBmb29GMygmbXlGb28pOyAgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdmb29GMycgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ215Rm9vLm11Xyd9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdmb29GMycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXlGb28ubXVfJyBleGNsdXNpdmVseX19CiAKICAgbXlGb28ubXVfLkxvY2soKTsKICAgbXlGb28uZm9vMigpOwpAQCAtMjA5OSw3ICsyMDk5LDcgQEAKIAogICBGb29UPGludD4gbXlGb29UOwogICBteUZvb1QuZm9vKCk7ICAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2ZvbycgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ215Rm9vVC5tdV8nfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdteUZvb1QubXVfJyBleGNsdXNpdmVseX19CiB9CiAKIH0gLy8gZW5kIG5hbWVzcGFjZSBGdW5jdGlvbkRlZmluaXRpb25UZXN0CkBAIC0yMTI3LDcgKzIxMjcsNyBAQAogCiAgIHZvaWQgdGVzdCgpIHsKICAgICBmb28gPSAyOyAgLy8gXAotICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2ZvbycgcmVxdWlyZXMgbG9ja2luZyAndGhpcycgZXhjbHVzaXZlbHl9fQorICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2ZvbycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAndGhpcycgZXhjbHVzaXZlbHl9fQogICB9CiB9OwogCkBAIC0yMTkyLDExICsyMTkyLDExIEBACiAKICAgdm9pZCBmb28oKSB7CiAgICAgYSA9IDA7IC8vIFwKLSAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBsb2NraW5nICdtdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nIGV4Y2x1c2l2ZWx5fX0KICAgICBiID0gMDsgLy8gXAotICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2InIHJlcXVpcmVzIGxvY2tpbmcgJ211XycgZXhjbHVzaXZlbHl9fQorICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2InIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211XycgZXhjbHVzaXZlbHl9fQogICAgIGMgPSAwOyAvLyBcCi0gICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJyBleGNsdXNpdmVseX19CisgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJyBleGNsdXNpdmVseX19CiAgIH0KIAogcHJpdmF0ZToKQEAgLTIyODMsMzEgKzIyODMsMzEgQEAKIAogICBiYXIuZ2V0Rm9vKCkubXVfLkxvY2soKTsKICAgYmFyLmdldEZvb2V5KCkuYSA9IDA7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgbG9ja2luZyAnYmFyLmdldEZvb2V5KCkubXVfJyBleGNsdXNpdmVseX19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnYmFyLmdldEZvb2V5KCkubXVfJyBleGNsdXNpdmVseX19IFwKICAgICAvLyBleHBlY3RlZC1ub3RlIHt7Zm91bmQgbmVhciBtYXRjaCAnYmFyLmdldEZvbygpLm11Xyd9fQogICBiYXIuZ2V0Rm9vKCkubXVfLlVubG9jaygpOwogCiAgIGJhci5nZXRGb28yKGEpLm11Xy5Mb2NrKCk7CiAgIGJhci5nZXRGb28yKGIpLmEgPSAwOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGxvY2tpbmcgJ2Jhci5nZXRGb28yKGIpLm11XycgZXhjbHVzaXZlbHl9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2Jhci5nZXRGb28yKGIpLm11XycgZXhjbHVzaXZlbHl9fSBcCiAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvdW5kIG5lYXIgbWF0Y2ggJ2Jhci5nZXRGb28yKGEpLm11Xyd9fQogICBiYXIuZ2V0Rm9vMihhKS5tdV8uVW5sb2NrKCk7CiAKICAgYmFyLmdldEZvbzMoYSwgYikubXVfLkxvY2soKTsKICAgYmFyLmdldEZvbzMoYSwgYykuYSA9IDA7ICAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGxvY2tpbmcgJ2Jhci5nZXRGb28zKGEsYykubXVfJyBleGNsdXNpdmVseX19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnYmFyLmdldEZvbzMoYSxjKS5tdV8nIGV4Y2x1c2l2ZWx5fX0gXAogICAgIC8vIGV4cGVjdGVkLW5vdGUge3snYmFyLmdldEZvbzMoYSxiKS5tdV8nfX0KICAgYmFyLmdldEZvbzMoYSwgYikubXVfLlVubG9jaygpOwogCiAgIGdldEJhckZvbyhiYXIsIGEpLm11Xy5Mb2NrKCk7CiAgIGdldEJhckZvbyhiYXIsIGIpLmEgPSAwOyAgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBsb2NraW5nICdnZXRCYXJGb28oYmFyLGIpLm11XycgZXhjbHVzaXZlbHl9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2dldEJhckZvbyhiYXIsYikubXVfJyBleGNsdXNpdmVseX19IFwKICAgICAvLyBleHBlY3RlZC1ub3RlIHt7J2dldEJhckZvbyhiYXIsYSkubXVfJ319CiAgIGdldEJhckZvbyhiYXIsIGEpLm11Xy5VbmxvY2soKTsKIAogICAoYSA+IDAgPyBmb29BcnJheVsxXSA6IGZvb0FycmF5W2JdKS5tdV8uTG9jaygpOwogICAoYSA+IDAgPyBmb29BcnJheVtiXSA6IGZvb0FycmF5W2NdKS5hID0gMDsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBsb2NraW5nICcoKGEjXykjXyNmb29BcnJheVtiXSkubXVfJyBleGNsdXNpdmVseX19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnKChhI18pI18jZm9vQXJyYXlbYl0pLm11XycgZXhjbHVzaXZlbHl9fSBcCiAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7eycoKGEjXykjXyNmb29BcnJheVtfXSkubXVfJ319CiAgIChhID4gMCA/IGZvb0FycmF5WzFdIDogZm9vQXJyYXlbYl0pLm11Xy5VbmxvY2soKTsKIH0KQEAgLTIzNTYsMTkgKzIzNTYsMTkgQEAKIAogLy8gQ2FsbHMgZ2V0TXUoKSBkaXJlY3RseSB0byBsb2NrIGFuZCB1bmxvY2sKIHZvaWQgdGVzdDEoRm9vKiBmMSwgRm9vKiBmMikgewotICBmMS0+YSA9IDA7ICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBsb2NraW5nICdmMS0+bXVfJyBleGNsdXNpdmVseX19Ci0gIGYxLT5mb28oKTsgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2ZvbycgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ2YxLT5tdV8nfX0KKyAgZjEtPmEgPSAwOyAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnZjEtPm11XycgZXhjbHVzaXZlbHl9fQorICBmMS0+Zm9vKCk7ICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdmb28nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2YxLT5tdV8nIGV4Y2x1c2l2ZWx5fX0KIAotICBmMS0+Zm9vMihmMik7ICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdmb28yJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnZjEtPm11Xyd9fSBcCi0gICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2ZvbzInIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdmMi0+bXVfJ319Ci0gIEZvbzo6c2ZvbyhmMSk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ3Nmb28nIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdmMS0+bXVfJ319CisgIGYxLT5mb28yKGYyKTsgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2ZvbzInIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2YxLT5tdV8nIGV4Y2x1c2l2ZWx5fX0gXAorICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdmb28yJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdmMi0+bXVfJyBleGNsdXNpdmVseX19CisgIEZvbzo6c2ZvbyhmMSk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ3Nmb28nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2YxLT5tdV8nIGV4Y2x1c2l2ZWx5fX0KIAogICBmMS0+Z2V0TXUoKS0+TG9jaygpOwogCiAgIGYxLT5hID0gMDsKICAgZjEtPmZvbygpOwogICBmMS0+Zm9vMihmMik7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vMicgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ2YyLT5tdV8nfX0gXAorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdmb28yJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdmMi0+bXVfJyBleGNsdXNpdmVseX19IFwKICAgICAvLyBleHBlY3RlZC1ub3RlIHt7Zm91bmQgbmVhciBtYXRjaCAnZjEtPm11Xyd9fQogCiAgIEZvbzo6Z2V0TXUoZjIpLT5Mb2NrKCk7CkBAIC0yMzk4LDE5ICsyMzk4LDE5IEBACiAvLyBVc2UgZ2V0TXUoKSB3aXRoaW4gb3RoZXIgYXR0cmlidXRlcy4KIC8vIFRoaXMgcmVxdWlyZXMgYXQgbGVzdCBsZXZlbHMgb2Ygc3Vic3RpdHV0aW9uLCBtb3JlIGluIHRoZSBjYXNlIG9mCiB2b2lkIHRlc3QyKEJhciogYjEsIEJhciogYjIpIHsKLSAgYjEtPmIgPSAwOyAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYicgcmVxdWlyZXMgbG9ja2luZyAnYjEtPm11XycgZXhjbHVzaXZlbHl9fQotICBiMS0+YmFyKCk7ICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdiYXInIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdiMS0+bXVfJ319Ci0gIGIxLT5iYXIyKGIyKTsgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2JhcjInIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdiMS0+bXVfJ319IFwKLSAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnYmFyMicgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ2IyLT5tdV8nfX0KLSAgQmFyOjpzYmFyKGIxKTsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnc2JhcicgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ2IxLT5tdV8nfX0KLSAgQmFyOjpzYmFyMihiMSk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnc2JhcjInIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdiMS0+bXVfJ319CisgIGIxLT5iID0gMDsgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2InIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2IxLT5tdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgYjEtPmJhcigpOyAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnYmFyJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdiMS0+bXVfJyBleGNsdXNpdmVseX19CisgIGIxLT5iYXIyKGIyKTsgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2JhcjInIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2IxLT5tdV8nIGV4Y2x1c2l2ZWx5fX0gXAorICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdiYXIyJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdiMi0+bXVfJyBleGNsdXNpdmVseX19CisgIEJhcjo6c2JhcihiMSk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ3NiYXInIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2IxLT5tdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgQmFyOjpzYmFyMihiMSk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnc2JhcjInIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2IxLT5tdV8nIGV4Y2x1c2l2ZWx5fX0KIAogICBiMS0+Z2V0TXUoKS0+TG9jaygpOwogCiAgIGIxLT5iID0gMDsKICAgYjEtPmJhcigpOwogICBiMS0+YmFyMihiMik7ICAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2JhcjInIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdiMi0+bXVfJ319IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnYmFyMicgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnYjItPm11XycgZXhjbHVzaXZlbHl9fSBcCiAgICAgLy8gLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvdW5kIG5lYXIgbWF0Y2ggJ2IxLT5tdV8nfX0KIAogICBiMi0+Z2V0TXUoKS0+TG9jaygpOwpAQCAtMjQ3NiwxMyArMjQ3NiwxMyBAQAogICBSZWxlYXNhYmxlTXV0ZXhMb2NrIHJsb2NrKCZtdV8pOwogICBhID0gMDsKICAgcmxvY2suUmVsZWFzZSgpOwotICBhID0gMTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBsb2NraW5nICdtdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgYSA9IDE7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJyBleGNsdXNpdmVseX19CiB9CiAKIHZvaWQgRm9vOjp0ZXN0NCgpIHsKICAgUmVsZWFzYWJsZU11dGV4TG9jayBybG9jaygmbXVfKTsKICAgcmxvY2suUmVsZWFzZSgpOwotICBybG9jay5SZWxlYXNlKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5sb2NraW5nICdtdV8nIHRoYXQgd2FzIG5vdCBsb2NrZWR9fQorICBybG9jay5SZWxlYXNlKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVsZWFzaW5nIG11dGV4ICdtdV8nIHRoYXQgd2FzIG5vdCBoZWxkfX0KIH0KIAogdm9pZCBGb286OnRlc3Q1KCkgewpAQCAtMjQ5MSw3ICsyNDkxLDcgQEAKICAgICBybG9jay5SZWxlYXNlKCk7CiAgIH0KICAgLy8gbm8gd2FybmluZyBvbiBqb2luIHBvaW50IGZvciBtYW5hZ2VkIGxvY2suCi0gIHJsb2NrLlJlbGVhc2UoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmxvY2tpbmcgJ211XycgdGhhdCB3YXMgbm90IGxvY2tlZH19CisgIHJsb2NrLlJlbGVhc2UoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxlYXNpbmcgbXV0ZXggJ211XycgdGhhdCB3YXMgbm90IGhlbGR9fQogfQogCiAKQEAgLTI1NjAsMTIgKzI1NjAsMTIgQEAKIAogICB2b2lkIGZvbzEoKSBFWENMVVNJVkVfTE9DS1NfUkVRVUlSRUQobXV0ZXhfKSB7ICAvLyBleHBlY3RlZC1ub3RlIHt7bXV0ZXggYWNxdWlyZWQgaGVyZX19CiAgICAgbXV0ZXhfLlVubG9jaygpOwotICB9ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwZWN0aW5nIG11dGV4ICdtdXRleF8nIHRvIGJlIGxvY2tlZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KKyAgfSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4cGVjdGluZyBtdXRleCAnbXV0ZXhfJyB0byBiZSBoZWxkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQogCiAKICAgdm9pZCBmb28yKCkgU0hBUkVEX0xPQ0tTX1JFUVVJUkVEKG11dGV4XykgeyAgIC8vIGV4cGVjdGVkLW5vdGUge3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KICAgICBtdXRleF8uVW5sb2NrKCk7Ci0gIH0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHBlY3RpbmcgbXV0ZXggJ211dGV4XycgdG8gYmUgbG9ja2VkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQorICB9ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwZWN0aW5nIG11dGV4ICdtdXRleF8nIHRvIGJlIGhlbGQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CiB9OwogCiB9IC8vIGVuZCBuYW1lc3BhY2UgVW5sb2NrQnVnCkBAIC0yNTk5LDcgKzI1OTksNyBAQAogCiAgIHZvaWQgdGVzdDIoKSB7CiAgICAgV1RGX1Njb3BlZExvY2thYmxlIHd0ZigmbXVfKTsgIC8vIGV4cGVjdGVkLW5vdGUge3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KLSAgfSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e211dGV4ICdtdV8nIGlzIHN0aWxsIGxvY2tlZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KKyAgfSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e211dGV4ICdtdV8nIGlzIHN0aWxsIGhlbGQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CiAKICAgdm9pZCB0ZXN0MygpIHsKICAgICBpZiAoYykgewpAQCAtMjYyMiw3ICsyNjIyLDcgQEAKICAgICBpZiAoYykgewogICAgICAgV1RGX1Njb3BlZExvY2thYmxlIHd0ZigmbXVfKTsgIC8vIGV4cGVjdGVkLW5vdGUge3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KICAgICB9Ci0gIH0gLy8gZXhwZWN0ZWQtd2FybmluZyB7e211dGV4ICdtdV8nIGlzIG5vdCBsb2NrZWQgb24gZXZlcnkgcGF0aCB0aHJvdWdoIGhlcmV9fQorICB9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnbXVfJyBpcyBub3QgaGVsZCBvbiBldmVyeSBwYXRoIHRocm91Z2ggaGVyZX19CiAKICAgdm9pZCB0ZXN0NigpIHsKICAgICBpZiAoYykgewpAQCAtMjYzMSw3ICsyNjMxLDcgQEAKICAgICBlbHNlIHsKICAgICAgIFdURl9TY29wZWRMb2NrYWJsZSB3dGYoJm11Xyk7ICAvLyBleHBlY3RlZC1ub3RlIHt7bXV0ZXggYWNxdWlyZWQgaGVyZX19CiAgICAgfQotICB9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnbXVfJyBpcyBub3QgbG9ja2VkIG9uIGV2ZXJ5IHBhdGggdGhyb3VnaCBoZXJlfX0KKyAgfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ211XycgaXMgbm90IGhlbGQgb24gZXZlcnkgcGF0aCB0aHJvdWdoIGhlcmV9fQogfTsKIAogCkBAIC0yNjU1LDcgKzI2NTUsNyBAQAogICAgIFJlYWRlck11dGV4TG9jayBsb2NrKGdldE11dGV4UHRyKCkuZ2V0KCkpOwogICAgIGludCBiID0gYTsKICAgfQotICBpbnQgYiA9IGE7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgbG9ja2luZyAnZ2V0TXV0ZXhQdHIoKSd9fQorICBpbnQgYiA9IGE7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnZ2V0TXV0ZXhQdHIoKSd9fQogfQogCiB9IC8vIGVuZCBuYW1lc3BhY2UgVGVtcG9yYXJ5Q2xlYW51cEV4cHIKQEAgLTI2ODYsOSArMjY4Niw5IEBACiB9OwogCiB2b2lkIEZvbzo6dGVzdDAoKSB7Ci0gIGEgPSAwOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGxvY2tpbmcgJ211XycgZXhjbHVzaXZlbHl9fQotICBiID0gMDsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdiJyByZXF1aXJlcyBsb2NraW5nICdtdV8nIGV4Y2x1c2l2ZWx5fX0KLSAgYyA9IDA7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJyBleGNsdXNpdmVseX19CisgIGEgPSAwOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211XycgZXhjbHVzaXZlbHl9fQorICBiID0gMDsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdiJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgYyA9IDA7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJyBleGNsdXNpdmVseX19CiB9CiAKIHZvaWQgRm9vOjp0ZXN0MSgpIHsKQEAgLTI3NzIsMTAgKzI3NzIsMTAgQEAKIAogdm9pZCBGb286OnRlc3Q4KCkgewogICBtdV8tPkxvY2soKTsKLSAgbXVfLmdldCgpLT5Mb2NrKCk7ICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tsb2NraW5nICdtdV8nIHRoYXQgaXMgYWxyZWFkeSBsb2NrZWR9fQotICAoKm11XykuTG9jaygpOyAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2xvY2tpbmcgJ211XycgdGhhdCBpcyBhbHJlYWR5IGxvY2tlZH19CisgIG11Xy5nZXQoKS0+TG9jaygpOyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWNxdWlyaW5nIG11dGV4ICdtdV8nIHRoYXQgaXMgYWxyZWFkeSBoZWxkfX0KKyAgKCptdV8pLkxvY2soKTsgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3thY3F1aXJpbmcgbXV0ZXggJ211XycgdGhhdCBpcyBhbHJlYWR5IGhlbGR9fQogICBtdV8uZ2V0KCktPlVubG9jaygpOwotICBVbmxvY2soKTsgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VubG9ja2luZyAnbXVfJyB0aGF0IHdhcyBub3QgbG9ja2VkfX0KKyAgVW5sb2NrKCk7ICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxlYXNpbmcgbXV0ZXggJ211XycgdGhhdCB3YXMgbm90IGhlbGR9fQogfQogCiAKQEAgLTI3OTAsOSArMjc5MCw5IEBACiAKIAogdm9pZCBCYXI6OnRlc3QwKCkgewotICBmb28tPmEgPSAwOyAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBsb2NraW5nICdmb28tPm11XycgZXhjbHVzaXZlbHl9fQotICAoKmZvbykuYiA9IDA7ICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdiJyByZXF1aXJlcyBsb2NraW5nICdmb28tPm11XycgZXhjbHVzaXZlbHl9fQotICBmb28uZ2V0KCktPmMgPSAwOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdjJyByZXF1aXJlcyBsb2NraW5nICdmb28tPm11XycgZXhjbHVzaXZlbHl9fQorICBmb28tPmEgPSAwOyAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdmb28tPm11XycgZXhjbHVzaXZlbHl9fQorICAoKmZvbykuYiA9IDA7ICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdiJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdmb28tPm11XycgZXhjbHVzaXZlbHl9fQorICBmb28uZ2V0KCktPmMgPSAwOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdjJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdmb28tPm11XycgZXhjbHVzaXZlbHl9fQogfQogCiAKQEAgLTI5MDYsOSArMjkwNiw5IEBACiAgIGZvby51bmxvY2soKTsKIAogICBmb28ubG9jaygpOwotICBmb28ubG9jaygpOyAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2xvY2tpbmcgJ2ZvbycgdGhhdCBpcyBhbHJlYWR5IGxvY2tlZH19CisgIGZvby5sb2NrKCk7ICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWNxdWlyaW5nIG11dGV4ICdmb28nIHRoYXQgaXMgYWxyZWFkeSBoZWxkfX0KICAgZm9vLnVubG9jaygpOwotICBmb28udW5sb2NrKCk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VubG9ja2luZyAnZm9vJyB0aGF0IHdhcyBub3QgbG9ja2VkfX0KKyAgZm9vLnVubG9jaygpOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxlYXNpbmcgbXV0ZXggJ2ZvbycgdGhhdCB3YXMgbm90IGhlbGR9fQogfQogCiAKQEAgLTI5MTksMTAgKzI5MTksMTAgQEAKICAgZm9vLnVubG9jazEoKTsKIAogICBmb28ubG9jazEoKTsKLSAgZm9vLmxvY2sxKCk7ICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tsb2NraW5nICdmb28ubXUxXycgdGhhdCBpcyBhbHJlYWR5IGxvY2tlZH19CisgIGZvby5sb2NrMSgpOyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWNxdWlyaW5nIG11dGV4ICdmb28ubXUxXycgdGhhdCBpcyBhbHJlYWR5IGhlbGR9fQogICBmb28uYSA9IDA7CiAgIGZvby51bmxvY2sxKCk7Ci0gIGZvby51bmxvY2sxKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5sb2NraW5nICdmb28ubXUxXycgdGhhdCB3YXMgbm90IGxvY2tlZH19CisgIGZvby51bmxvY2sxKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVsZWFzaW5nIG11dGV4ICdmb28ubXUxXycgdGhhdCB3YXMgbm90IGhlbGR9fQogfQogCiAKQEAgLTI5MzMsMTAgKzI5MzMsMTAgQEAKICAgZm9vLnVubG9jazEoKTsKIAogICBmb28uc2xvY2sxKCk7Ci0gIGZvby5zbG9jazEoKTsgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2xvY2tpbmcgJ2Zvby5tdTFfJyB0aGF0IGlzIGFscmVhZHkgbG9ja2VkfX0KKyAgZm9vLnNsb2NrMSgpOyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWNxdWlyaW5nIG11dGV4ICdmb28ubXUxXycgdGhhdCBpcyBhbHJlYWR5IGhlbGR9fQogICBpbnQgZDIgPSBmb28uYTsKICAgZm9vLnVubG9jazEoKTsKLSAgZm9vLnVubG9jazEoKTsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5sb2NraW5nICdmb28ubXUxXycgdGhhdCB3YXMgbm90IGxvY2tlZH19CisgIGZvby51bmxvY2sxKCk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlbGVhc2luZyBtdXRleCAnZm9vLm11MV8nIHRoYXQgd2FzIG5vdCBoZWxkfX0KICAgcmV0dXJuIGQxICsgZDI7CiB9CiAKQEAgLTI5NTEsMTcgKzI5NTEsMTcgQEAKIAogICBmb28ubG9jazMoKTsKICAgZm9vLmxvY2szKCk7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bG9ja2luZyAnZm9vLm11MV8nIHRoYXQgaXMgYWxyZWFkeSBsb2NrZWR9fSBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2xvY2tpbmcgJ2Zvby5tdTJfJyB0aGF0IGlzIGFscmVhZHkgbG9ja2VkfX0gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tsb2NraW5nICdmb28ubXUzXycgdGhhdCBpcyBhbHJlYWR5IGxvY2tlZH19CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2FjcXVpcmluZyBtdXRleCAnZm9vLm11MV8nIHRoYXQgaXMgYWxyZWFkeSBoZWxkfX0gXAorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3thY3F1aXJpbmcgbXV0ZXggJ2Zvby5tdTJfJyB0aGF0IGlzIGFscmVhZHkgaGVsZH19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWNxdWlyaW5nIG11dGV4ICdmb28ubXUzXycgdGhhdCBpcyBhbHJlYWR5IGhlbGR9fQogICBmb28uYSA9IDA7CiAgIGZvby5iID0gMDsKICAgZm9vLmMgPSAwOwogICBmb28udW5sb2NrMygpOwogICBmb28udW5sb2NrMygpOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VubG9ja2luZyAnZm9vLm11MV8nIHRoYXQgd2FzIG5vdCBsb2NrZWR9fSBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VubG9ja2luZyAnZm9vLm11Ml8nIHRoYXQgd2FzIG5vdCBsb2NrZWR9fSBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VubG9ja2luZyAnZm9vLm11M18nIHRoYXQgd2FzIG5vdCBsb2NrZWR9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxlYXNpbmcgbXV0ZXggJ2Zvby5tdTFfJyB0aGF0IHdhcyBub3QgaGVsZH19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVsZWFzaW5nIG11dGV4ICdmb28ubXUyXycgdGhhdCB3YXMgbm90IGhlbGR9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlbGVhc2luZyBtdXRleCAnZm9vLm11M18nIHRoYXQgd2FzIG5vdCBoZWxkfX0KIH0KIAogCkBAIC0yOTc1LDE3ICsyOTc1LDE3IEBACiAKICAgZm9vLmxvY2tsb3RzKCk7CiAgIGZvby5sb2NrbG90cygpOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2xvY2tpbmcgJ2Zvby5tdTFfJyB0aGF0IGlzIGFscmVhZHkgbG9ja2VkfX0gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tsb2NraW5nICdmb28ubXUyXycgdGhhdCBpcyBhbHJlYWR5IGxvY2tlZH19IFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bG9ja2luZyAnZm9vLm11M18nIHRoYXQgaXMgYWxyZWFkeSBsb2NrZWR9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3thY3F1aXJpbmcgbXV0ZXggJ2Zvby5tdTFfJyB0aGF0IGlzIGFscmVhZHkgaGVsZH19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWNxdWlyaW5nIG11dGV4ICdmb28ubXUyXycgdGhhdCBpcyBhbHJlYWR5IGhlbGR9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2FjcXVpcmluZyBtdXRleCAnZm9vLm11M18nIHRoYXQgaXMgYWxyZWFkeSBoZWxkfX0KICAgZm9vLmEgPSAwOwogICBmb28uYiA9IDA7CiAgIGZvby5jID0gMDsKICAgZm9vLnVubG9ja2xvdHMoKTsKICAgZm9vLnVubG9ja2xvdHMoKTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmxvY2tpbmcgJ2Zvby5tdTFfJyB0aGF0IHdhcyBub3QgbG9ja2VkfX0gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmxvY2tpbmcgJ2Zvby5tdTJfJyB0aGF0IHdhcyBub3QgbG9ja2VkfX0gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bmxvY2tpbmcgJ2Zvby5tdTNfJyB0aGF0IHdhcyBub3QgbG9ja2VkfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVsZWFzaW5nIG11dGV4ICdmb28ubXUxXycgdGhhdCB3YXMgbm90IGhlbGR9fSBcCisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlbGVhc2luZyBtdXRleCAnZm9vLm11Ml8nIHRoYXQgd2FzIG5vdCBoZWxkfX0gXAorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxlYXNpbmcgbXV0ZXggJ2Zvby5tdTNfJyB0aGF0IHdhcyBub3QgaGVsZH19CiB9CiAKIH0gIC8vIGVuZCBuYW1lc3BhY2UgRHVwbGljYXRlQXR0cmlidXRlVGVzdApAQCAtMzAxMCw3ICszMDEwLDcgQEAKIAogdm9pZCBGb286OnRlc3QxKCkgewogICBpZiAodHJ5TG9ja011dGV4UCgpID09IDApIHsKLSAgICBhID0gMDsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBsb2NraW5nICdtdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgICBhID0gMDsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nIGV4Y2x1c2l2ZWx5fX0KICAgICByZXR1cm47CiAgIH0KICAgYSA9IDA7CkBAIC0zMDMyLDE0ICszMDMyLDE0IEBACiAgIH0KIAogICBpZiAodHJ5TG9ja011dGV4SSgpID09IDApIHsKLSAgICBhID0gMDsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgbG9ja2luZyAnbXVfJyBleGNsdXNpdmVseX19CisgICAgYSA9IDA7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211XycgZXhjbHVzaXZlbHl9fQogICAgIHJldHVybjsKICAgfQogICBhID0gMDsKICAgdW5sb2NrKCk7CiAKICAgaWYgKDAgPT0gdHJ5TG9ja011dGV4SSgpKSB7Ci0gICAgYSA9IDA7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGxvY2tpbmcgJ211XycgZXhjbHVzaXZlbHl9fQorICAgIGEgPSAwOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nIGV4Y2x1c2l2ZWx5fX0KICAgICByZXR1cm47CiAgIH0KICAgYSA9IDA7CkBAIC0zMDUxLDcgKzMwNTEsNyBAQAogICB9CiAKICAgaWYgKG11Xy5UcnlMb2NrKCkgPT0gZmFsc2UpIHsKLSAgICBhID0gMDsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgbG9ja2luZyAnbXVfJyBleGNsdXNpdmVseX19CisgICAgYSA9IDA7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211XycgZXhjbHVzaXZlbHl9fQogICAgIHJldHVybjsKICAgfQogICBhID0gMDsKQEAgLTMwNjIsMTIgKzMwNjIsMTIgQEAKICAgICB1bmxvY2soKTsKICAgfQogICBlbHNlIHsKLSAgICBhID0gMDsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBsb2NraW5nICdtdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgICBhID0gMDsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nIGV4Y2x1c2l2ZWx5fX0KICAgfQogCiAjaWYgX19oYXNfZmVhdHVyZShjeHhfbnVsbHB0cikKICAgaWYgKHRyeUxvY2tNdXRleFAoKSA9PSBudWxscHRyKSB7Ci0gICAgYSA9IDA7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgbG9ja2luZyAnbXVfJyBleGNsdXNpdmVseX19CisgICAgYSA9IDA7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJyBleGNsdXNpdmVseX19CiAgICAgcmV0dXJuOwogICB9CiAgIGEgPSAwOwpAQCAtMzEwMywyNiArMzEwMywyNiBAQAogICBHcmFwaCBnMjsKICAgTm9kZSBuMTsKIAotICBuMS5hID0gMDsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgbG9ja2luZyAnJkV4aXN0ZW50aWFsUGF0dGVybk1hdGNoaW5nOjpHcmFwaDo6bXVfJyBleGNsdXNpdmVseX19Ci0gIG4xLmZvbygpOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdmb28nIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICcmRXhpc3RlbnRpYWxQYXR0ZXJuTWF0Y2hpbmc6OkdyYXBoOjptdV8nfX0KKyAgbjEuYSA9IDA7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJyZFeGlzdGVudGlhbFBhdHRlcm5NYXRjaGluZzo6R3JhcGg6Om11XycgZXhjbHVzaXZlbHl9fQorICBuMS5mb28oKTsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZm9vJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICcmRXhpc3RlbnRpYWxQYXR0ZXJuTWF0Y2hpbmc6OkdyYXBoOjptdV8nIGV4Y2x1c2l2ZWx5fX0KICAgbjEuZm9vMigpOwogCiAgIGcxLm11Xy5Mb2NrKCk7CiAgIG4xLmEgPSAwOwogICBuMS5mb28oKTsKLSAgbjEuZm9vMigpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Nhbm5vdCBjYWxsIGZ1bmN0aW9uICdmb28yJyB3aGlsZSBtdXRleCAnJkV4aXN0ZW50aWFsUGF0dGVybk1hdGNoaW5nOjpHcmFwaDo6bXVfJyBpcyBsb2NrZWR9fQorICBuMS5mb28yKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ2ZvbzInIHdoaWxlIG11dGV4ICcmRXhpc3RlbnRpYWxQYXR0ZXJuTWF0Y2hpbmc6OkdyYXBoOjptdV8nIGlzIGhlbGR9fQogICBnMS5tdV8uVW5sb2NrKCk7CiAKICAgZzIubXVfLkxvY2soKTsKICAgbjEuYSA9IDA7CiAgIG4xLmZvbygpOwotICBuMS5mb28yKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ2ZvbzInIHdoaWxlIG11dGV4ICcmRXhpc3RlbnRpYWxQYXR0ZXJuTWF0Y2hpbmc6OkdyYXBoOjptdV8nIGlzIGxvY2tlZH19CisgIG4xLmZvbzIoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnZm9vMicgd2hpbGUgbXV0ZXggJyZFeGlzdGVudGlhbFBhdHRlcm5NYXRjaGluZzo6R3JhcGg6Om11XycgaXMgaGVsZH19CiAgIGcyLm11Xy5VbmxvY2soKTsKIAogICBMb2NrQWxsR3JhcGhzKCk7CiAgIG4xLmEgPSAwOwogICBuMS5mb28oKTsKLSAgbjEuZm9vMigpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Nhbm5vdCBjYWxsIGZ1bmN0aW9uICdmb28yJyB3aGlsZSBtdXRleCAnJkV4aXN0ZW50aWFsUGF0dGVybk1hdGNoaW5nOjpHcmFwaDo6bXVfJyBpcyBsb2NrZWR9fQorICBuMS5mb28yKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ2ZvbzInIHdoaWxlIG11dGV4ICcmRXhpc3RlbnRpYWxQYXR0ZXJuTWF0Y2hpbmc6OkdyYXBoOjptdV8nIGlzIGhlbGR9fQogICBVbmxvY2tBbGxHcmFwaHMoKTsKIAogICBMb2NrQWxsR3JhcGhzKCk7CkBAIC0zMTMyLDcgKzMxMzIsNyBAQAogICBnMi5tdV8uVW5sb2NrKCk7CiAKICAgTG9ja0FsbEdyYXBocygpOwotICBnMS5tdV8uTG9jaygpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2xvY2tpbmcgJ2cxLm11XycgdGhhdCBpcyBhbHJlYWR5IGxvY2tlZH19CisgIGcxLm11Xy5Mb2NrKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7YWNxdWlyaW5nIG11dGV4ICdnMS5tdV8nIHRoYXQgaXMgYWxyZWFkeSBoZWxkfX0KICAgZzEubXVfLlVubG9jaygpOwogfQogCkBAIC0zMjYwLDkgKzMyNjAsOSBAQAogICAgICAgYmVnaW5Ob1dhcm5PbldyaXRlcygpOwogICAgIH0KICAgICBhID0gMDsgLy8gXAotICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGxvY2tpbmcgJ211XycgZXhjbHVzaXZlbHl9fQorICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211XycgZXhjbHVzaXZlbHl9fQogICAgIGVuZE5vV2Fybk9uV3JpdGVzKCk7ICAvLyBcCi0gICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7dW5sb2NraW5nICcqJyB0aGF0IHdhcyBub3QgbG9ja2VkfX0KKyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxlYXNpbmcgbXV0ZXggJyonIHRoYXQgd2FzIG5vdCBoZWxkfX0KICAgfQogCiAKQEAgLTMzOTAsMTcgKzMzOTAsMTcgQEAKIAogCiB2b2lkIHRlc3QxKCkgewotICBGb28gZjsgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdGb28nIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdtdV8nfX0KLSAgaW50IGEgPSBmWzBdOyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnb3BlcmF0b3JbXScgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ211Xyd9fQotfSAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICd+Rm9vJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnbXVfJ319CisgIEZvbyBmOyAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ0ZvbycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJyBleGNsdXNpdmVseX19CisgIGludCBhID0gZlswXTsgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ29wZXJhdG9yW10nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211XycgZXhjbHVzaXZlbHl9fQorfSAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICd+Rm9vJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nIGV4Y2x1c2l2ZWx5fX0KIAogCiB2b2lkIHRlc3QyKCkgewogICBCYXI6Om11Xy5Mb2NrKCk7CiAgIHsKLSAgICBCYXIgYjsgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ0Jhcicgd2hpbGUgbXV0ZXggJ211XycgaXMgbG9ja2VkfX0KLSAgICBpbnQgYSA9IGJbMF07ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ29wZXJhdG9yW10nIHdoaWxlIG11dGV4ICdtdV8nIGlzIGxvY2tlZH19Ci0gIH0gICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Nhbm5vdCBjYWxsIGZ1bmN0aW9uICd+QmFyJyB3aGlsZSBtdXRleCAnbXVfJyBpcyBsb2NrZWR9fQorICAgIEJhciBiOyAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnQmFyJyB3aGlsZSBtdXRleCAnbXVfJyBpcyBoZWxkfX0KKyAgICBpbnQgYSA9IGJbMF07ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhbGwgZnVuY3Rpb24gJ29wZXJhdG9yW10nIHdoaWxlIG11dGV4ICdtdV8nIGlzIGhlbGR9fQorICB9ICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYW5ub3QgY2FsbCBmdW5jdGlvbiAnfkJhcicgd2hpbGUgbXV0ZXggJ211XycgaXMgaGVsZH19CiAgIEJhcjo6bXVfLlVubG9jaygpOwogfQogCkBAIC0zNDk5LDcgKzM0OTksNyBAQAogdm9pZCBGb286OnRlc3QoKSB7CiAgIENlbGw8aW50PiBjZWxsOwogICBlbHIoJmNlbGwpOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2VscicgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ2NlbGwubXVfJ319CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ2VscicgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnY2VsbC5tdV8nIGV4Y2x1c2l2ZWx5fX0KIH0KIAogCkBAIC0zNTEyLDcgKzM1MTIsNyBAQAogdm9pZCBnbG9iYWxUZXN0KCkgewogICBDZWxsPGludD4gY2VsbDsKICAgZ2xvYmFsRUxSKCZjZWxsKTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdnbG9iYWxFTFInIHJlcXVpcmVzIGV4Y2x1c2l2ZSBsb2NrIG9uICdjZWxsLm11Xyd9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdnbG9iYWxFTFInIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2NlbGwubXVfJyBleGNsdXNpdmVseX19CiB9CiAKIApAQCAtMzUzMyw3ICszNTMzLDcgQEAKIHZvaWQgZ2xvYmFsVGVzdDIoKSB7CiAgIENlbGw8aW50PiBjZWxsOwogICBnbG9iYWxFTFIyKCZjZWxsKTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdnbG9iYWxFTFIyJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnY2VsbC5tdV8nfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZ2xvYmFsRUxSMicgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnY2VsbC5tdV8nIGV4Y2x1c2l2ZWx5fX0KIH0KIAogCkBAIC0zNTUwLDcgKzM1NTAsNyBAQAogICBDZWxsPGludD4gY2VsbDsKICAgRm9vVDxpbnQ+IGZvbzsKICAgZm9vLmVscigmY2VsbCk7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZWxyJyByZXF1aXJlcyBleGNsdXNpdmUgbG9jayBvbiAnY2VsbC5tdV8nfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FsbGluZyBmdW5jdGlvbiAnZWxyJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdjZWxsLm11XycgZXhjbHVzaXZlbHl9fQogfQogCiB9ICAvLyBlbmQgbmFtZXNwYWNlIFRlbXBsYXRlRnVuY3Rpb25QYXJhbVJlbWFwVGVzdApAQCAtMzYxNiw4ICszNjE2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0xVU0lWRV9UUllMT0NLX0ZVTkNUSU9OKHRydWUsIG11Ml8pOwogICBib29sIHJlYWRlcnRyeWxvY2soKSBTSEFSRURfVFJZTE9DS19GVU5DVElPTih0cnVlLCBtdTFfKQogICAgICAgICAgICAgICAgICAgICAgICBTSEFSRURfVFJZTE9DS19GVU5DVElPTih0cnVlLCBtdTJfKTsKKyAgdm9pZCBhc3NlcnRCb3RoKCkgQVNTRVJUX0VYQ0xVU0lWRV9MT0NLKG11MV8pCisgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9FWENMVVNJVkVfTE9DSyhtdTJfKTsKKyAgdm9pZCBhc3NlcnRTaGFyZWQoKSBBU1NFUlRfU0hBUkVEX0xPQ0sobXUxXykKKyAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfU0hBUkVEX0xPQ0sobXUyXyk7CiAKICAgdm9pZCB0ZXN0KCk7CisgIHZvaWQgdGVzdEFzc2VydCgpOworICB2b2lkIHRlc3RBc3NlcnRTaGFyZWQoKTsKIH07CiAKIApAQCAtMzY3Niw2ICszNjgyLDIxIEBACiAgIH0KIH0KIAorLy8gRm9yY2UgZHVwbGljYXRpb24gb2YgYXR0cmlidXRlcwordm9pZCBGb286OmFzc2VydEJvdGgoKSB7IH0KK3ZvaWQgRm9vOjphc3NlcnRTaGFyZWQoKSB7IH0KKwordm9pZCBGb286OnRlc3RBc3NlcnQoKSB7CisgIGFzc2VydEJvdGgoKTsKKyAgYSA9IDA7CisgIGIgPSAwOworfQorCit2b2lkIEZvbzo6dGVzdEFzc2VydFNoYXJlZCgpIHsKKyAgYXNzZXJ0U2hhcmVkKCk7CisgIGludCB6eiA9IGEgKyBiOworfQorCiAKIH0gIC8vIGVuZCBuYW1lc3BhY2UgTXVsdGlwbGVBdHRyaWJ1dGVUZXN0CiAKQEAgLTM3MTcsMjQgKzM3MzgsMjQgQEAKICAgLy8gbWV0aG9kIGNhbGwgdGVzdHMKICAgdm9pZCB0ZXN0KCkgewogICAgIGRhdGFfLnNldFZhbHVlKDApOyAgICAgICAgIC8vIEZJWE1FIC0tIHNob3VsZCBiZSB3cml0aW5nIFwKLSAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdkYXRhXycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319CisgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnZGF0YV8nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Xyd9fQogICAgIGludCBhID0gZGF0YV8uZ2V0VmFsdWUoKTsgIC8vIFwKLSAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdkYXRhXycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319CisgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnZGF0YV8nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Xyd9fQogCiAgICAgZGF0YXAxXy0+c2V0VmFsdWUoMCk7ICAgICAgLy8gRklYTUUgLS0gc2hvdWxkIGJlIHdyaXRpbmcgXAotICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2RhdGFwMV8nIHJlcXVpcmVzIGxvY2tpbmcgJ211Xyd9fQorICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2RhdGFwMV8nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Xyd9fQogICAgIGEgPSBkYXRhcDFfLT5nZXRWYWx1ZSgpOyAgIC8vIFwKLSAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdkYXRhcDFfJyByZXF1aXJlcyBsb2NraW5nICdtdV8nfX0KKyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdkYXRhcDFfJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nfX0KIAogICAgIGRhdGFwMl8tPnNldFZhbHVlKDApOyAgICAgIC8vIEZJWE1FIC0tIHNob3VsZCBiZSB3cml0aW5nIFwKLSAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdkYXRhcDJfJyByZXF1aXJlcyBsb2NraW5nICdtdV8nfX0KKyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdkYXRhcDJfJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nfX0KICAgICBhID0gZGF0YXAyXy0+Z2V0VmFsdWUoKTsgICAvLyBcCi0gICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZGF0YXAyXycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319CisgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZGF0YXAyXycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJ319CiAKICAgICAoKmRhdGFwMl8pLnNldFZhbHVlKDApOyAgICAvLyBGSVhNRSAtLSBzaG91bGQgYmUgd3JpdGluZyBcCi0gICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZGF0YXAyXycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319CisgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZGF0YXAyXycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJ319CiAgICAgYSA9ICgqZGF0YXAyXykuZ2V0VmFsdWUoKTsgLy8gXAotICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2RhdGFwMl8nIHJlcXVpcmVzIGxvY2tpbmcgJ211Xyd9fQorICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2RhdGFwMl8nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Xyd9fQogCiAgICAgbXVfLkxvY2soKTsKICAgICBkYXRhXy5zZXRWYWx1ZSgxKTsKQEAgLTM3NTIsMzEgKzM3NzMsMzEgQEAKIAogICAvLyBvcGVyYXRvciB0ZXN0cwogICB2b2lkIHRlc3QyKCkgewotICAgIGRhdGFfICAgID0gRGF0YSgxKTsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnZGF0YV8nIHJlcXVpcmVzIGxvY2tpbmcgJ211XycgZXhjbHVzaXZlbHl9fQotICAgICpkYXRhcDFfID0gZGF0YV87ICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnZGF0YXAxXycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2RhdGFfJyByZXF1aXJlcyBsb2NraW5nICdtdV8nfX0KLSAgICAqZGF0YXAyXyA9IGRhdGFfOyAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2RhdGFwMl8nIHJlcXVpcmVzIGxvY2tpbmcgJ211XycgZXhjbHVzaXZlbHl9fSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdkYXRhXycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319Ci0gICAgZGF0YV8gPSAqZGF0YXAxXzsgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdkYXRhXycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJyBleGNsdXNpdmVseX19IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2RhdGFwMV8nIHJlcXVpcmVzIGxvY2tpbmcgJ211Xyd9fQotICAgIGRhdGFfID0gKmRhdGFwMl87ICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnZGF0YV8nIHJlcXVpcmVzIGxvY2tpbmcgJ211XycgZXhjbHVzaXZlbHl9fSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdkYXRhcDJfJyByZXF1aXJlcyBsb2NraW5nICdtdV8nfX0KKyAgICBkYXRhXyAgICA9IERhdGEoMSk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2RhdGFfJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgICAqZGF0YXAxXyA9IGRhdGFfOyAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2RhdGFwMV8nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Xyd9fSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdkYXRhXycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJ319CisgICAgKmRhdGFwMl8gPSBkYXRhXzsgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdkYXRhcDJfJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nIGV4Y2x1c2l2ZWx5fX0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnZGF0YV8nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Xyd9fQorICAgIGRhdGFfID0gKmRhdGFwMV87ICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnZGF0YV8nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211XycgZXhjbHVzaXZlbHl9fSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdkYXRhcDFfJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nfX0KKyAgICBkYXRhXyA9ICpkYXRhcDJfOyAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2RhdGFfJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nIGV4Y2x1c2l2ZWx5fX0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZGF0YXAyXycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJ319CiAKLSAgICBkYXRhX1swXSA9IDA7ICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2RhdGFfJyByZXF1aXJlcyBsb2NraW5nICdtdV8nfX0KLSAgICAoKmRhdGFwMl8pWzBdID0gMDsgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2RhdGFwMl8nIHJlcXVpcmVzIGxvY2tpbmcgJ211Xyd9fQorICAgIGRhdGFfWzBdID0gMDsgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnZGF0YV8nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Xyd9fQorICAgICgqZGF0YXAyXylbMF0gPSAwOyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZGF0YXAyXycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJ319CiAKLSAgICBkYXRhXygpOyAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2RhdGFfJyByZXF1aXJlcyBsb2NraW5nICdtdV8nfX0KKyAgICBkYXRhXygpOyAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2RhdGFfJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nfX0KICAgfQogCiAgIC8vIGNvbnN0IG9wZXJhdG9yIHRlc3RzCiAgIHZvaWQgdGVzdDMoKSBjb25zdCB7Ci0gICAgRGF0YSBteWRhdChkYXRhXyk7ICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2RhdGFfJyByZXF1aXJlcyBsb2NraW5nICdtdV8nfX0KKyAgICBEYXRhIG15ZGF0KGRhdGFfKTsgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnZGF0YV8nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Xyd9fQogCiAgICAgLy9GSVhNRQotICAgIC8vc2hvd0RhdGFDZWxsKGRhdGFfKTsgICAgLy8geHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnZGF0YV8nIHJlcXVpcmVzIGxvY2tpbmcgJ211Xyd9fQotICAgIC8vc2hvd0RhdGFDZWxsKCpkYXRhcDJfKTsgLy8geHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZGF0YXAyXycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319CisgICAgLy9zaG93RGF0YUNlbGwoZGF0YV8pOyAgICAvLyB4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdkYXRhXycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJ319CisgICAgLy9zaG93RGF0YUNlbGwoKmRhdGFwMl8pOyAvLyB4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdkYXRhcDJfJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nfX0KIAotICAgIGludCBhID0gZGF0YV9bMF07ICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdkYXRhXycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319CisgICAgaW50IGEgPSBkYXRhX1swXTsgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2RhdGFfJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nfX0KICAgfQogCiBwcml2YXRlOgpAQCAtMzgyMCwzMSArMzg0MSwzMSBAQAogICBGb28qIGZvb3AgUFRfR1VBUkRFRF9CWShtdV8pOwogCiAgIHZvaWQgdGVzdCgpIHsKLSAgICBmb28ubXlNZXRob2QoKTsgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnZm9vJyByZXF1aXJlcyBsb2NraW5nICdtdV8nfX0KKyAgICBmb28ubXlNZXRob2QoKTsgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnZm9vJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nfX0KIAotICAgIGludCBmYSA9IGZvby5hOyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdmb28nIHJlcXVpcmVzIGxvY2tpbmcgJ211Xyd9fQotICAgIGZvby5hICA9IGZhOyAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdmb28nIHJlcXVpcmVzIGxvY2tpbmcgJ211XycgZXhjbHVzaXZlbHl9fQorICAgIGludCBmYSA9IGZvby5hOyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdmb28nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Xyd9fQorICAgIGZvby5hICA9IGZhOyAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdmb28nIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211XycgZXhjbHVzaXZlbHl9fQogCi0gICAgZmEgPSBmb29wLT5hOyAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2Zvb3AnIHJlcXVpcmVzIGxvY2tpbmcgJ211Xyd9fQotICAgIGZvb3AtPmEgPSBmYTsgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdmb29wJyByZXF1aXJlcyBsb2NraW5nICdtdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgICBmYSA9IGZvb3AtPmE7ICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZm9vcCcgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJ319CisgICAgZm9vcC0+YSA9IGZhOyAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2Zvb3AnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211XycgZXhjbHVzaXZlbHl9fQogCi0gICAgZmEgPSAoKmZvb3ApLmE7ICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2Zvb3AnIHJlcXVpcmVzIGxvY2tpbmcgJ211Xyd9fQotICAgICgqZm9vcCkuYSA9IGZhOyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdmb29wJyByZXF1aXJlcyBsb2NraW5nICdtdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgICBmYSA9ICgqZm9vcCkuYTsgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZm9vcCcgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJ319CisgICAgKCpmb29wKS5hID0gZmE7ICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2Zvb3AnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211XycgZXhjbHVzaXZlbHl9fQogCi0gICAgZm9vLmMgID0gQ2VsbCgwKTsgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2ZvbycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgbG9ja2luZyAnZm9vLmNlbGxfbXVfJyBleGNsdXNpdmVseX19Ci0gICAgZm9vLmMuY2VsbE1ldGhvZCgpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2ZvbycgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgbG9ja2luZyAnZm9vLmNlbGxfbXVfJ319CisgICAgZm9vLmMgID0gQ2VsbCgwKTsgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2ZvbycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJ319IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnZm9vLmNlbGxfbXVfJyBleGNsdXNpdmVseX19CisgICAgZm9vLmMuY2VsbE1ldGhvZCgpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2ZvbycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXVfJ319IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnZm9vLmNlbGxfbXVfJ319CiAKLSAgICBmb29wLT5jICA9IENlbGwoMCk7ICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdmb29wJyByZXF1aXJlcyBsb2NraW5nICdtdV8nfX0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2MnIHJlcXVpcmVzIGxvY2tpbmcgJ2Zvb3AtPmNlbGxfbXVfJyBleGNsdXNpdmVseX19Ci0gICAgZm9vcC0+Yy5jZWxsTWV0aG9kKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZm9vcCcgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdjJyByZXF1aXJlcyBsb2NraW5nICdmb29wLT5jZWxsX211Xyd9fQorICAgIGZvb3AtPmMgID0gQ2VsbCgwKTsgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2Zvb3AnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Xyd9fSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnZm9vcC0+Y2VsbF9tdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgICBmb29wLT5jLmNlbGxNZXRob2QoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdmb29wJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nfX0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2MnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ2Zvb3AtPmNlbGxfbXVfJ319CiAKLSAgICAoKmZvb3ApLmMgID0gQ2VsbCgwKTsgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2Zvb3AnIHJlcXVpcmVzIGxvY2tpbmcgJ211Xyd9fSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdjJyByZXF1aXJlcyBsb2NraW5nICdmb29wLT5jZWxsX211XycgZXhjbHVzaXZlbHl9fQotICAgICgqZm9vcCkuYy5jZWxsTWV0aG9kKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnZm9vcCcgcmVxdWlyZXMgbG9ja2luZyAnbXVfJ319IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2MnIHJlcXVpcmVzIGxvY2tpbmcgJ2Zvb3AtPmNlbGxfbXVfJ319CisgICAgKCpmb29wKS5jICA9IENlbGwoMCk7ICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdmb29wJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nfX0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnZm9vcC0+Y2VsbF9tdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgICAoKmZvb3ApLmMuY2VsbE1ldGhvZCgpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2Zvb3AnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Xyd9fSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdjJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdmb29wLT5jZWxsX211Xyd9fQogICB9OwogfTsKIApAQCAtMzkxNywzNCArMzkzOCwzNCBAQAogICB2b2lkIGxvY2tCYWQoKSBFWENMVVNJVkVfTE9DS19GVU5DVElPTihtdV8pIHsgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e211dGV4IGFjcXVpcmVkIGhlcmV9fQogICAgIG11Ml8uTG9jaygpOwogICAgIG11Ml8uVW5sb2NrKCk7Ci0gIH0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHBlY3RpbmcgbXV0ZXggJ211XycgdG8gYmUgbG9ja2VkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQorICB9ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwZWN0aW5nIG11dGV4ICdtdV8nIHRvIGJlIGhlbGQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CiAKICAgdm9pZCByZWFkZXJMb2NrQmFkKCkgU0hBUkVEX0xPQ0tfRlVOQ1RJT04obXVfKSB7ICAvLyBleHBlY3RlZC1ub3RlIHt7bXV0ZXggYWNxdWlyZWQgaGVyZX19CiAgICAgbXUyXy5Mb2NrKCk7CiAgICAgbXUyXy5VbmxvY2soKTsKLSAgfSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4cGVjdGluZyBtdXRleCAnbXVfJyB0byBiZSBsb2NrZWQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CisgIH0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHBlY3RpbmcgbXV0ZXggJ211XycgdG8gYmUgaGVsZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KIAogICB2b2lkIHVubG9ja0JhZCgpIFVOTE9DS19GVU5DVElPTihtdV8pIHsgIC8vIGV4cGVjdGVkLW5vdGUge3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KICAgICBtdTJfLkxvY2soKTsKICAgICBtdTJfLlVubG9jaygpOwotICB9ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ211XycgaXMgc3RpbGwgbG9ja2VkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQorICB9ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ211XycgaXMgc3RpbGwgaGVsZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KIAogICAvLyBDaGVjayBsb2NraW5nIHRoZSB3cm9uZyB0aGluZy4KICAgdm9pZCBsb2NrQmFkMigpIEVYQ0xVU0lWRV9MT0NLX0ZVTkNUSU9OKG11XykgeyAgIC8vIGV4cGVjdGVkLW5vdGUge3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KICAgICBtdTJfLkxvY2soKTsgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7bXV0ZXggYWNxdWlyZWQgaGVyZX19Ci0gIH0gLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4cGVjdGluZyBtdXRleCAnbXVfJyB0byBiZSBsb2NrZWQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19IFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ211Ml8nIGlzIHN0aWxsIGxvY2tlZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KKyAgfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwZWN0aW5nIG11dGV4ICdtdV8nIHRvIGJlIGhlbGQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19IFwKKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXV0ZXggJ211Ml8nIGlzIHN0aWxsIGhlbGQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CiAKIAogICB2b2lkIHJlYWRlckxvY2tCYWQyKCkgU0hBUkVEX0xPQ0tfRlVOQ1RJT04obXVfKSB7ICAgLy8gZXhwZWN0ZWQtbm90ZSB7e211dGV4IGFjcXVpcmVkIGhlcmV9fQogICAgIG11Ml8uUmVhZGVyTG9jaygpOyAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KLSAgfSAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwZWN0aW5nIG11dGV4ICdtdV8nIHRvIGJlIGxvY2tlZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnbXUyXycgaXMgc3RpbGwgbG9ja2VkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQorICB9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHBlY3RpbmcgbXV0ZXggJ211XycgdG8gYmUgaGVsZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0gXAorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnbXUyXycgaXMgc3RpbGwgaGVsZCBhdCB0aGUgZW5kIG9mIGZ1bmN0aW9ufX0KIAogCiAgIHZvaWQgdW5sb2NrQmFkMigpIFVOTE9DS19GVU5DVElPTihtdV8pIHsgIC8vIGV4cGVjdGVkLW5vdGUge3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KLSAgICBtdTJfLlVubG9jaygpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VubG9ja2luZyAnbXUyXycgdGhhdCB3YXMgbm90IGxvY2tlZH19Ci0gIH0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnbXVfJyBpcyBzdGlsbCBsb2NrZWQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CisgICAgbXUyXy5VbmxvY2soKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxlYXNpbmcgbXV0ZXggJ211Ml8nIHRoYXQgd2FzIG5vdCBoZWxkfX0KKyAgfSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e211dGV4ICdtdV8nIGlzIHN0aWxsIGhlbGQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CiAKIHByaXZhdGU6CiAgIE11dGV4IG11XzsKQEAgLTM5NzEsNyArMzk5Miw3IEBACiAgIHZvaWQgdGVzdDIoKSB7CiAgICAgbXVfLkFzc2VydFJlYWRlckhlbGQoKTsKICAgICBpbnQgYiA9IGE7Ci0gICAgYSA9IDA7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGxvY2tpbmcgJ211XycgZXhjbHVzaXZlbHl9fQorICAgIGEgPSAwOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nIGV4Y2x1c2l2ZWx5fX0KICAgfQogCiAgIHZvaWQgdGVzdDMoKSB7CkBAIC00MDMyLDcgKzQwNTMsNyBAQAogICAgIGVsc2UgewogICAgICAgbXVfLkxvY2soKTsgIC8vIGV4cGVjdGVkLW5vdGUge3ttdXRleCBhY3F1aXJlZCBoZXJlfX0KICAgICB9Ci0gIH0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnbXVfJyBpcyBzdGlsbCBsb2NrZWQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CisgIH0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnbXVfJyBpcyBzdGlsbCBoZWxkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQogCiAgIHZvaWQgdGVzdDEwKCkgewogICAgIGlmIChjKSB7CkBAIC00MDQxLDcgKzQwNjIsNyBAQAogICAgIGVsc2UgewogICAgICAgbXVfLkFzc2VydEhlbGQoKTsKICAgICB9Ci0gIH0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnbXVfJyBpcyBzdGlsbCBsb2NrZWQgYXQgdGhlIGVuZCBvZiBmdW5jdGlvbn19CisgIH0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttdXRleCAnbXVfJyBpcyBzdGlsbCBoZWxkIGF0IHRoZSBlbmQgb2YgZnVuY3Rpb259fQogCiAgIHZvaWQgYXNzZXJ0TXUoKSBBU1NFUlRfRVhDTFVTSVZFX0xPQ0sobXVfKTsKIApAQCAtNDE3OCw1MiArNDE5OSw1MiBAQAogCiAgIHZvaWQgdGVzdDIoKSB7CiAgICAgbXUxLlJlYWRlckxvY2soKTsKLSAgICBpZiAoKmEgPT0gMCkgZG9Tb21ldGhpbmcoKTsgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnYScgcmVxdWlyZXMgbG9ja2luZyAnbXUyJ319Ci0gICAgKmEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2EnIHJlcXVpcmVzIGxvY2tpbmcgJ211MicgZXhjbHVzaXZlbHl9fQorICAgIGlmICgqYSA9PSAwKSBkb1NvbWV0aGluZygpOyAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInfX0KKyAgICAqYSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUyJyBleGNsdXNpdmVseX19CiAKLSAgICBpZiAoYy0+YSA9PSAwKSBkb1NvbWV0aGluZygpOyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnYycgcmVxdWlyZXMgbG9ja2luZyAnbXUyJ319Ci0gICAgYy0+YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2MnIHJlcXVpcmVzIGxvY2tpbmcgJ211MicgZXhjbHVzaXZlbHl9fQorICAgIGlmIChjLT5hID09IDApIGRvU29tZXRoaW5nKCk7ICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdjJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInfX0KKyAgICBjLT5hID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUyJyBleGNsdXNpdmVseX19CiAKLSAgICBpZiAoKCpjKS5hID09IDApIGRvU29tZXRoaW5nKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnYycgcmVxdWlyZXMgbG9ja2luZyAnbXUyJ319Ci0gICAgKCpjKS5hID0gMDsgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ2MnIHJlcXVpcmVzIGxvY2tpbmcgJ211MicgZXhjbHVzaXZlbHl9fQorICAgIGlmICgoKmMpLmEgPT0gMCkgZG9Tb21ldGhpbmcoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdjJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInfX0KKyAgICAoKmMpLmEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUyJyBleGNsdXNpdmVseX19CiAKLSAgICBpZiAoYVswXSA9PSA0MikgZG9Tb21ldGhpbmcoKTsgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdhJyByZXF1aXJlcyBsb2NraW5nICdtdTInfX0KLSAgICBhWzBdID0gNTc7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdhJyByZXF1aXJlcyBsb2NraW5nICdtdTInIGV4Y2x1c2l2ZWx5fX0KLSAgICBpZiAoY1swXS5hID09IDQyKSBkb1NvbWV0aGluZygpOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdjJyByZXF1aXJlcyBsb2NraW5nICdtdTInfX0KLSAgICBjWzBdLmEgPSA1NzsgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdjJyByZXF1aXJlcyBsb2NraW5nICdtdTInIGV4Y2x1c2l2ZWx5fX0KKyAgICBpZiAoYVswXSA9PSA0MikgZG9Tb21ldGhpbmcoKTsgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInfX0KKyAgICBhWzBdID0gNTc7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInIGV4Y2x1c2l2ZWx5fX0KKyAgICBpZiAoY1swXS5hID09IDQyKSBkb1NvbWV0aGluZygpOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdjJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInfX0KKyAgICBjWzBdLmEgPSA1NzsgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdjJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInIGV4Y2x1c2l2ZWx5fX0KICAgICBtdTEuVW5sb2NrKCk7CiAgIH0KIAogICB2b2lkIHRlc3QzKCkgewogICAgIG11Mi5Mb2NrKCk7Ci0gICAgaWYgKCphID09IDApIGRvU29tZXRoaW5nKCk7ICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGxvY2tpbmcgJ211MSd9fQotICAgICphID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdhJyByZXF1aXJlcyBsb2NraW5nICdtdTEnfX0KKyAgICBpZiAoKmEgPT0gMCkgZG9Tb21ldGhpbmcoKTsgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUxJ319CisgICAgKmEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211MSd9fQogCi0gICAgaWYgKGMtPmEgPT0gMCkgZG9Tb21ldGhpbmcoKTsgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2MnIHJlcXVpcmVzIGxvY2tpbmcgJ211MSd9fQotICAgIGMtPmEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdjJyByZXF1aXJlcyBsb2NraW5nICdtdTEnfX0KKyAgICBpZiAoYy0+YSA9PSAwKSBkb1NvbWV0aGluZygpOyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUxJ319CisgICAgYy0+YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2MnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211MSd9fQogCi0gICAgaWYgKCgqYykuYSA9PSAwKSBkb1NvbWV0aGluZygpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2MnIHJlcXVpcmVzIGxvY2tpbmcgJ211MSd9fQotICAgICgqYykuYSA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdjJyByZXF1aXJlcyBsb2NraW5nICdtdTEnfX0KKyAgICBpZiAoKCpjKS5hID09IDApIGRvU29tZXRoaW5nKCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUxJ319CisgICAgKCpjKS5hID0gMDsgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ2MnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211MSd9fQogCi0gICAgaWYgKGFbMF0gPT0gNDIpIGRvU29tZXRoaW5nKCk7ICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgbG9ja2luZyAnbXUxJ319Ci0gICAgYVswXSA9IDU3OyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgbG9ja2luZyAnbXUxJ319Ci0gICAgaWYgKGNbMF0uYSA9PSA0MikgZG9Tb21ldGhpbmcoKTsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgbG9ja2luZyAnbXUxJ319Ci0gICAgY1swXS5hID0gNTc7ICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgbG9ja2luZyAnbXUxJ319CisgICAgaWYgKGFbMF0gPT0gNDIpIGRvU29tZXRoaW5nKCk7ICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUxJ319CisgICAgYVswXSA9IDU3OyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUxJ319CisgICAgaWYgKGNbMF0uYSA9PSA0MikgZG9Tb21ldGhpbmcoKTsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUxJ319CisgICAgY1swXS5hID0gNTc7ICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUxJ319CiAgICAgbXUyLlVubG9jaygpOwogICB9CiAKICAgdm9pZCB0ZXN0NCgpIHsgIC8vIExpdGVyYWwgYXJyYXlzCi0gICAgaWYgKHNhWzBdID09IDQyKSBkb1NvbWV0aGluZygpOyAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NhJyByZXF1aXJlcyBsb2NraW5nICdtdTEnfX0KLSAgICBzYVswXSA9IDU3OyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnc2EnIHJlcXVpcmVzIGxvY2tpbmcgJ211MScgZXhjbHVzaXZlbHl9fQotICAgIGlmIChzY1swXS5hID09IDQyKSBkb1NvbWV0aGluZygpOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdzYycgcmVxdWlyZXMgbG9ja2luZyAnbXUxJ319Ci0gICAgc2NbMF0uYSA9IDU3OyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ3NjJyByZXF1aXJlcyBsb2NraW5nICdtdTEnIGV4Y2x1c2l2ZWx5fX0KKyAgICBpZiAoc2FbMF0gPT0gNDIpIGRvU29tZXRoaW5nKCk7ICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnc2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211MSd9fQorICAgIHNhWzBdID0gNTc7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdzYScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUxJyBleGNsdXNpdmVseX19CisgICAgaWYgKHNjWzBdLmEgPT0gNDIpIGRvU29tZXRoaW5nKCk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NjJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTEnfX0KKyAgICBzY1swXS5hID0gNTc7ICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnc2MnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211MScgZXhjbHVzaXZlbHl9fQogCi0gICAgaWYgKCpzYSA9PSA0MikgZG9Tb21ldGhpbmcoKTsgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NhJyByZXF1aXJlcyBsb2NraW5nICdtdTEnfX0KLSAgICAqc2EgPSA1NzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnc2EnIHJlcXVpcmVzIGxvY2tpbmcgJ211MScgZXhjbHVzaXZlbHl9fQotICAgIGlmICgoKnNjKS5hID09IDQyKSBkb1NvbWV0aGluZygpOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdzYycgcmVxdWlyZXMgbG9ja2luZyAnbXUxJ319Ci0gICAgKCpzYykuYSA9IDU3OyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ3NjJyByZXF1aXJlcyBsb2NraW5nICdtdTEnIGV4Y2x1c2l2ZWx5fX0KLSAgICBpZiAoc2MtPmEgPT0gNDIpIGRvU29tZXRoaW5nKCk7ICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnc2MnIHJlcXVpcmVzIGxvY2tpbmcgJ211MSd9fQotICAgIHNjLT5hID0gNTc7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdzYycgcmVxdWlyZXMgbG9ja2luZyAnbXUxJyBleGNsdXNpdmVseX19CisgICAgaWYgKCpzYSA9PSA0MikgZG9Tb21ldGhpbmcoKTsgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NhJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTEnfX0KKyAgICAqc2EgPSA1NzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7d3JpdGluZyB2YXJpYWJsZSAnc2EnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211MScgZXhjbHVzaXZlbHl9fQorICAgIGlmICgoKnNjKS5hID09IDQyKSBkb1NvbWV0aGluZygpOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdzYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUxJ319CisgICAgKCpzYykuYSA9IDU3OyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dyaXRpbmcgdmFyaWFibGUgJ3NjJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTEnIGV4Y2x1c2l2ZWx5fX0KKyAgICBpZiAoc2MtPmEgPT0gNDIpIGRvU29tZXRoaW5nKCk7ICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnc2MnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211MSd9fQorICAgIHNjLT5hID0gNTc7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3cml0aW5nIHZhcmlhYmxlICdzYycgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUxJyBleGNsdXNpdmVseX19CiAgIH0KIAogICB2b2lkIHRlc3Q1KCkgewpAQCAtNDI2OCwxNSArNDI4OSwxNSBAQAogICB2b2lkIHRlc3QyKCkgewogICAgIG11Mi5Mb2NrKCk7CiAKLSAgICBzcC5nZXQoKTsgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NwJyByZXF1aXJlcyBsb2NraW5nICdtdTEnfX0KLSAgICBpZiAoKnNwID09IDApIGRvU29tZXRoaW5nKCk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NwJyByZXF1aXJlcyBsb2NraW5nICdtdTEnfX0KLSAgICAqc3AgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NwJyByZXF1aXJlcyBsb2NraW5nICdtdTEnfX0KLSAgICBzcS0+YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NxJyByZXF1aXJlcyBsb2NraW5nICdtdTEnfX0KKyAgICBzcC5nZXQoKTsgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NwJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTEnfX0KKyAgICBpZiAoKnNwID09IDApIGRvU29tZXRoaW5nKCk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NwJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTEnfX0KKyAgICAqc3AgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NwJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTEnfX0KKyAgICBzcS0+YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NxJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTEnfX0KIAotICAgIGlmIChzcFswXSA9PSAwKSBkb1NvbWV0aGluZygpOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdzcCcgcmVxdWlyZXMgbG9ja2luZyAnbXUxJ319Ci0gICAgc3BbMF0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NwJyByZXF1aXJlcyBsb2NraW5nICdtdTEnfX0KLSAgICBpZiAoc3FbMF0uYSA9PSAwKSBkb1NvbWV0aGluZygpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnc3EnIHJlcXVpcmVzIGxvY2tpbmcgJ211MSd9fQotICAgIHNxWzBdLmEgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdzcScgcmVxdWlyZXMgbG9ja2luZyAnbXUxJ319CisgICAgaWYgKHNwWzBdID09IDApIGRvU29tZXRoaW5nKCk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NwJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTEnfX0KKyAgICBzcFswXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB2YXJpYWJsZSAnc3AnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211MSd9fQorICAgIGlmIChzcVswXS5hID09IDApIGRvU29tZXRoaW5nKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHZhcmlhYmxlICdzcScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUxJ319CisgICAgc3FbMF0uYSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdmFyaWFibGUgJ3NxJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTEnfX0KIAogICAgIG11Mi5VbmxvY2soKTsKICAgfQpAQCAtNDI4NSwxNCArNDMwNiwxNCBAQAogICAgIG11MS5Mb2NrKCk7CiAKICAgICBzcC5nZXQoKTsKLSAgICBpZiAoKnNwID09IDApIGRvU29tZXRoaW5nKCk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3NwJyByZXF1aXJlcyBsb2NraW5nICdtdTInfX0KLSAgICAqc3AgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3NwJyByZXF1aXJlcyBsb2NraW5nICdtdTInfX0KLSAgICBzcS0+YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3NxJyByZXF1aXJlcyBsb2NraW5nICdtdTInfX0KKyAgICBpZiAoKnNwID09IDApIGRvU29tZXRoaW5nKCk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3NwJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInfX0KKyAgICAqc3AgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3NwJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInfX0KKyAgICBzcS0+YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3NxJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInfX0KIAotICAgIGlmIChzcFswXSA9PSAwKSBkb1NvbWV0aGluZygpOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdzcCcgcmVxdWlyZXMgbG9ja2luZyAnbXUyJ319Ci0gICAgc3BbMF0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3NwJyByZXF1aXJlcyBsb2NraW5nICdtdTInfX0KLSAgICBpZiAoc3FbMF0uYSA9PSAwKSBkb1NvbWV0aGluZygpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnc3EnIHJlcXVpcmVzIGxvY2tpbmcgJ211Mid9fQotICAgIHNxWzBdLmEgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdzcScgcmVxdWlyZXMgbG9ja2luZyAnbXUyJ319CisgICAgaWYgKHNwWzBdID09IDApIGRvU29tZXRoaW5nKCk7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3NwJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInfX0KKyAgICBzcFswXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVhZGluZyB0aGUgdmFsdWUgcG9pbnRlZCB0byBieSAnc3AnIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ211Mid9fQorICAgIGlmIChzcVswXS5hID09IDApIGRvU29tZXRoaW5nKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWFkaW5nIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5ICdzcScgcmVxdWlyZXMgaG9sZGluZyBtdXRleCAnbXUyJ319CisgICAgc3FbMF0uYSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlYWRpbmcgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgJ3NxJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdTInfX0KIAogICAgIG11MS5VbmxvY2soKTsKICAgfQpAQCAtNDMwNSw3ICs0MzI2LDcgQEAKIAogY2xhc3MgQSB7CiAgIHZvaWQgUnVuKCkgewotICAoUnVuSGVscGVyKSgpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NhbGxpbmcgZnVuY3Rpb24gJ1J1bkhlbHBlcicgcmVxdWlyZXMgZXhjbHVzaXZlIGxvY2sgb24gJ00nfX0KKyAgKFJ1bkhlbHBlcikoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdSdW5IZWxwZXInIHJlcXVpcmVzIGhvbGRpbmcgbXV0ZXggJ00nIGV4Y2x1c2l2ZWx5fX0KICB9CiAKICB2b2lkIFJ1bkhlbHBlcigpIF9fYXR0cmlidXRlX18oKGV4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZChNKSkpOwpAQCAtNDMxNCwzICs0MzM1LDQ2IEBACiAKIH0gIC8vIGVuZCBuYW1lc3BhY2UgTm9uTWVtYmVyQ2FsbGVlSUNFVGVzdAogCisKK25hbWVzcGFjZSBwdF9ndWFyZF9hdHRyaWJ1dGVfdHlwZSB7CisgIGludCBpIFBUX0dVQVJERURfQlkoc2xzX211KTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3sncHRfZ3VhcmRlZF9ieScgb25seSBhcHBsaWVzIHRvIHBvaW50ZXIgdHlwZXM7IHR5cGUgaGVyZSBpcyAnaW50J319CisgIGludCBqIFBUX0dVQVJERURfVkFSOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydwdF9ndWFyZGVkX3Zhcicgb25seSBhcHBsaWVzIHRvIHBvaW50ZXIgdHlwZXM7IHR5cGUgaGVyZSBpcyAnaW50J319CisKKyAgdm9pZCB0ZXN0KCkgeworICAgIGludCBpIFBUX0dVQVJERURfQlkoc2xzX211KTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3sncHRfZ3VhcmRlZF9ieScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmaWVsZHMgYW5kIGdsb2JhbCB2YXJpYWJsZXN9fQorICAgIGludCBqIFBUX0dVQVJERURfVkFSOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydwdF9ndWFyZGVkX3ZhcicgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmaWVsZHMgYW5kIGdsb2JhbCB2YXJpYWJsZXN9fQorCisgICAgdHlwZWRlZiBpbnQgUFRfR1VBUkRFRF9CWShzbHNfbXUpIGJhZDE7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3B0X2d1YXJkZWRfYnknIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZmllbGRzIGFuZCBnbG9iYWwgdmFyaWFibGVzfX0KKyAgICB0eXBlZGVmIGludCBQVF9HVUFSREVEX1ZBUiBiYWQyOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydwdF9ndWFyZGVkX3ZhcicgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmaWVsZHMgYW5kIGdsb2JhbCB2YXJpYWJsZXN9fQorICB9Cit9ICAvLyBlbmQgbmFtZXNwYWNlIHB0X2d1YXJkX2F0dHJpYnV0ZV90eXBlCisKKworbmFtZXNwYWNlIFRocmVhZEF0dHJpYnV0ZXNPbkxhbWJkYXMgeworCitjbGFzcyBGb28geworICBNdXRleCBtdV87CisKKyAgdm9pZCBMb2NrZWRGdW5jdGlvbigpIEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRChtdV8pOworCisgIHZvaWQgdGVzdCgpIHsKKyAgICBhdXRvIGZ1bmMxID0gW3RoaXNdKCkgRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEKG11XykgeworICAgICAgTG9ja2VkRnVuY3Rpb24oKTsKKyAgICB9OworCisgICAgYXV0byBmdW5jMiA9IFt0aGlzXSgpIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgeworICAgICAgTG9ja2VkRnVuY3Rpb24oKTsKKyAgICB9OworCisgICAgYXV0byBmdW5jMyA9IFt0aGlzXSgpIEVYQ0xVU0lWRV9MT0NLX0ZVTkNUSU9OKG11XykgeworICAgICAgbXVfLkxvY2soKTsKKyAgICB9OworCisgICAgZnVuYzEoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjYWxsaW5nIGZ1bmN0aW9uICdvcGVyYXRvcigpJyByZXF1aXJlcyBob2xkaW5nIG11dGV4ICdtdV8nIGV4Y2x1c2l2ZWx5fX0KKyAgICBmdW5jMigpOworICAgIGZ1bmMzKCk7CisgICAgbXVfLlVubG9jaygpOworICB9Cit9OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIFRocmVhZEF0dHJpYnV0ZXNPbkxhbWJkYXMKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLXRocmVhZC1zYWZldHktcGFyc2luZy5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi10aHJlYWQtc2FmZXR5LXBhcnNpbmcuY3BwCmluZGV4IDFiZDRlNDMuLjZkNGFkMzkgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC93YXJuLXRocmVhZC1zYWZldHktcGFyc2luZy5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tdGhyZWFkLXNhZmV0eS1wYXJzaW5nLmNwcApAQCAtMjI5LDI4ICsyMjksMjggQEAKIH07CiAKIHZvaWQgbF90ZXN0X2Z1bmN0aW9uKCkgTE9DS0FCTEU7ICAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snbG9ja2FibGUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gY2xhc3Nlc319CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snbG9ja2FibGUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0LCB1bmlvbiBvciBjbGFzc319CiAKIGludCBsX3Rlc3RmbihpbnQgeSkgewogICBpbnQgeCBMT0NLQUJMRSA9IHk7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2xvY2thYmxlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGNsYXNzZXN9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snbG9ja2FibGUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0LCB1bmlvbiBvciBjbGFzc319CiAgIHJldHVybiB4OwogfQogCiBpbnQgbF90ZXN0X3ZhciBMT0NLQUJMRTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2xvY2thYmxlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGNsYXNzZXN9fQorICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2xvY2thYmxlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHN0cnVjdCwgdW5pb24gb3IgY2xhc3N9fQogCiBjbGFzcyBMRm9vIHsKICBwcml2YXRlOgogICBpbnQgdGVzdF9maWVsZCBMT0NLQUJMRTsgLy8gXAotICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snbG9ja2FibGUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gY2xhc3Nlc319CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydsb2NrYWJsZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzfX0KICAgdm9pZCB0ZXN0X21ldGhvZCgpIExPQ0tBQkxFOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydsb2NrYWJsZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBjbGFzc2VzfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2xvY2thYmxlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHN0cnVjdCwgdW5pb24gb3IgY2xhc3N9fQogfTsKIAogCiB2b2lkIGxfZnVuY3Rpb25fcGFyYW1zKGludCBsdmFyIExPQ0tBQkxFKTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2xvY2thYmxlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGNsYXNzZXN9fQorICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2xvY2thYmxlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHN0cnVjdCwgdW5pb24gb3IgY2xhc3N9fQogCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwpAQCAtMjY5LDI4ICsyNjksMjggQEAKIH07CiAKIHZvaWQgc2xfdGVzdF9mdW5jdGlvbigpIFNDT1BFRF9MT0NLQUJMRTsgIC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydzY29wZWRfbG9ja2FibGUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gY2xhc3Nlc319CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snc2NvcGVkX2xvY2thYmxlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHN0cnVjdCwgdW5pb24gb3IgY2xhc3N9fQogCiBpbnQgc2xfdGVzdGZuKGludCB5KSB7CiAgIGludCB4IFNDT1BFRF9MT0NLQUJMRSA9IHk7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3Njb3BlZF9sb2NrYWJsZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBjbGFzc2VzfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3Njb3BlZF9sb2NrYWJsZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzfX0KICAgcmV0dXJuIHg7CiB9CiAKIGludCBzbF90ZXN0X3ZhciBTQ09QRURfTE9DS0FCTEU7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydzY29wZWRfbG9ja2FibGUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gY2xhc3Nlc319CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snc2NvcGVkX2xvY2thYmxlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHN0cnVjdCwgdW5pb24gb3IgY2xhc3N9fQogCiBjbGFzcyBTTEZvbyB7CiAgcHJpdmF0ZToKICAgaW50IHRlc3RfZmllbGQgU0NPUEVEX0xPQ0tBQkxFOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydzY29wZWRfbG9ja2FibGUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gY2xhc3Nlc319CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydzY29wZWRfbG9ja2FibGUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0LCB1bmlvbiBvciBjbGFzc319CiAgIHZvaWQgdGVzdF9tZXRob2QoKSBTQ09QRURfTE9DS0FCTEU7IC8vIFwKLSAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3Njb3BlZF9sb2NrYWJsZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBjbGFzc2VzfX0KKyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3Njb3BlZF9sb2NrYWJsZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzfX0KIH07CiAKIAogdm9pZCBzbF9mdW5jdGlvbl9wYXJhbXMoaW50IGx2YXIgU0NPUEVEX0xPQ0tBQkxFKTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3Njb3BlZF9sb2NrYWJsZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBjbGFzc2VzfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydzY29wZWRfbG9ja2FibGUnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0LCB1bmlvbiBvciBjbGFzc319CiAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCkBAIC0zNTMsMTMgKzM1MywxMyBAQAogCiAvLyBpbGxlZ2FsIGF0dHJpYnV0ZSBhcmd1bWVudHMKIGludCBnYl92YXJfYXJnX2JhZF8xIEdVQVJERURfQlkoMSk7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydndWFyZGVkX2J5JyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHRoYXQgYXJlIGNsYXNzIHR5cGUgb3IgcG9pbnQgdG8gY2xhc3MgdHlwZTsgdHlwZSBoZXJlIGlzICdpbnQnfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydndWFyZGVkX2J5JyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgYW5ub3RhdGVkIHdpdGggJ2NhcGFiaWxpdHknIGF0dHJpYnV0ZTsgdHlwZSBoZXJlIGlzICdpbnQnfX0KIGludCBnYl92YXJfYXJnX2JhZF8yIEdVQVJERURfQlkoIm11Iik7IC8vIFwKICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lnbm9yaW5nICdndWFyZGVkX2J5JyBhdHRyaWJ1dGUgYmVjYXVzZSBpdHMgYXJndW1lbnQgaXMgaW52YWxpZH19CiBpbnQgZ2JfdmFyX2FyZ19iYWRfMyBHVUFSREVEX0JZKG11RG91YmxlUG9pbnRlcik7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydndWFyZGVkX2J5JyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHRoYXQgYXJlIGNsYXNzIHR5cGUgb3IgcG9pbnQgdG8gY2xhc3MgdHlwZTsgdHlwZSBoZXJlIGlzICdjbGFzcyBNdXRleCAqKid9fQorICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2d1YXJkZWRfYnknIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eScgYXR0cmlidXRlOyB0eXBlIGhlcmUgaXMgJ011dGV4ICoqJ319CiBpbnQgZ2JfdmFyX2FyZ19iYWRfNCBHVUFSREVEX0JZKHVtdSk7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydndWFyZGVkX2J5JyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgYW5ub3RhdGVkIHdpdGggJ2xvY2thYmxlJyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnY2xhc3MgVW5sb2NrYWJsZU11J319CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZ3VhcmRlZF9ieScgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnVW5sb2NrYWJsZU11J319CiAKIC8vMy4KIC8vIFRocmVhZCBTYWZldHkgYW5hbHlzaXMgdGVzdHMKQEAgLTQyNCwxMyArNDI0LDEzIEBACiAKIC8vIGlsbGVnYWwgYXR0cmlidXRlIGFyZ3VtZW50cwogaW50ICogcGdiX3Zhcl9hcmdfYmFkXzEgUFRfR1VBUkRFRF9CWSgxKTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3B0X2d1YXJkZWRfYnknIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydwdF9ndWFyZGVkX2J5JyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgYW5ub3RhdGVkIHdpdGggJ2NhcGFiaWxpdHknIGF0dHJpYnV0ZTsgdHlwZSBoZXJlIGlzICdpbnQnfX0KIGludCAqIHBnYl92YXJfYXJnX2JhZF8yIFBUX0dVQVJERURfQlkoIm11Iik7IC8vIFwKICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lnbm9yaW5nICdwdF9ndWFyZGVkX2J5JyBhdHRyaWJ1dGUgYmVjYXVzZSBpdHMgYXJndW1lbnQgaXMgaW52YWxpZH19CiBpbnQgKiBwZ2JfdmFyX2FyZ19iYWRfMyBQVF9HVUFSREVEX0JZKG11RG91YmxlUG9pbnRlcik7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydwdF9ndWFyZGVkX2J5JyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHRoYXQgYXJlIGNsYXNzIHR5cGUgb3IgcG9pbnQgdG8gY2xhc3MgdHlwZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3sncHRfZ3VhcmRlZF9ieScgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnTXV0ZXggKionfX0KIGludCAqIHBnYl92YXJfYXJnX2JhZF80IFBUX0dVQVJERURfQlkodW11KTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3B0X2d1YXJkZWRfYnknIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnbG9ja2FibGUnIGF0dHJpYnV0ZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3sncHRfZ3VhcmRlZF9ieScgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGV9fQogCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwpAQCAtNDQ2LDEyICs0NDYsMTIgQEAKIE11dGV4IG11X2FhIEFDUVVJUkVEX0FGVEVSKG11MSk7CiAKIE11dGV4IGFhX3Zhcl9ub2FyZ3MgX19hdHRyaWJ1dGVfXygoYWNxdWlyZWRfYWZ0ZXIpKTsgLy8gXAotICAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snYWNxdWlyZWRfYWZ0ZXInIGF0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KIAogY2xhc3MgQUFGb28gewogIHByaXZhdGU6CiAgIE11dGV4IGFhX2ZpZWxkX25vYXJncyBfX2F0dHJpYnV0ZV9fKChhY3F1aXJlZF9hZnRlcikpOyAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3thdHRyaWJ1dGUgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudH19CisgICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snYWNxdWlyZWRfYWZ0ZXInIGF0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KICAgTXV0ZXggYWFfZmllbGRfYXJncyBBQ1FVSVJFRF9BRlRFUihtdTEpOwogfTsKIApAQCAtNDg1LDE1ICs0ODUsMTUgQEAKIAogLy8gaWxsZWdhbCBhdHRyaWJ1dGUgYXJndW1lbnRzCiBNdXRleCBhYV92YXJfYXJnX2JhZF8xIEFDUVVJUkVEX0FGVEVSKDEpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snYWNxdWlyZWRfYWZ0ZXInIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydhY3F1aXJlZF9hZnRlcicgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnaW50J319CiBNdXRleCBhYV92YXJfYXJnX2JhZF8yIEFDUVVJUkVEX0FGVEVSKCJtdSIpOyAvLyBcCiAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZ25vcmluZyAnYWNxdWlyZWRfYWZ0ZXInIGF0dHJpYnV0ZSBiZWNhdXNlIGl0cyBhcmd1bWVudCBpcyBpbnZhbGlkfX0KIE11dGV4IGFhX3Zhcl9hcmdfYmFkXzMgQUNRVUlSRURfQUZURVIobXVEb3VibGVQb2ludGVyKTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2FjcXVpcmVkX2FmdGVyJyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHRoYXQgYXJlIGNsYXNzIHR5cGUgb3IgcG9pbnQgdG8gY2xhc3MgdHlwZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snYWNxdWlyZWRfYWZ0ZXInIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eScgYXR0cmlidXRlOyB0eXBlIGhlcmUgaXMgJ011dGV4ICoqJ319CiBNdXRleCBhYV92YXJfYXJnX2JhZF80IEFDUVVJUkVEX0FGVEVSKHVtdSk7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydhY3F1aXJlZF9hZnRlcicgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdsb2NrYWJsZScgYXR0cmlidXRlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydhY3F1aXJlZF9hZnRlcicgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGV9fQogVW5sb2NrYWJsZU11IGFhX3Zhcl9hcmdfYmFkXzUgQUNRVUlSRURfQUZURVIobXVfYWEpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snYWNxdWlyZWRfYWZ0ZXInIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIGluIGEgY29udGV4dCBhbm5vdGF0ZWQgd2l0aCAnbG9ja2FibGUnIGF0dHJpYnV0ZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snYWNxdWlyZWRfYWZ0ZXInIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIGluIGEgY29udGV4dCBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eSgibXV0ZXgiKScgYXR0cmlidXRlfX0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCiAvLyAgQWNxdWlyZWQgQmVmb3JlIChhYikKQEAgLTUwNiwxMiArNTA2LDEyIEBACiBNdXRleCBtdV9hYiBBQ1FVSVJFRF9CRUZPUkUobXUxKTsKIAogTXV0ZXggYWJfdmFyX25vYXJncyBfX2F0dHJpYnV0ZV9fKChhY3F1aXJlZF9iZWZvcmUpKTsgLy8gXAotICAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snYWNxdWlyZWRfYmVmb3JlJyBhdHRyaWJ1dGUgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudH19CiAKIGNsYXNzIEFCRm9vIHsKICBwcml2YXRlOgogICBNdXRleCBhYl9maWVsZF9ub2FyZ3MgX19hdHRyaWJ1dGVfXygoYWNxdWlyZWRfYmVmb3JlKSk7IC8vIFwKLSAgICAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KKyAgICAvLyBleHBlY3RlZC1lcnJvciB7eydhY3F1aXJlZF9iZWZvcmUnIGF0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KICAgTXV0ZXggYWJfZmllbGRfYXJncyBBQ1FVSVJFRF9CRUZPUkUobXUxKTsKIH07CiAKQEAgLTU0OCwxNSArNTQ4LDE1IEBACiAKIC8vIGlsbGVnYWwgYXR0cmlidXRlIGFyZ3VtZW50cwogTXV0ZXggYWJfdmFyX2FyZ19iYWRfMSBBQ1FVSVJFRF9CRUZPUkUoMSk7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydhY3F1aXJlZF9iZWZvcmUnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydhY3F1aXJlZF9iZWZvcmUnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eScgYXR0cmlidXRlOyB0eXBlIGhlcmUgaXMgJ2ludCd9fQogTXV0ZXggYWJfdmFyX2FyZ19iYWRfMiBBQ1FVSVJFRF9CRUZPUkUoIm11Iik7IC8vIFwKICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lnbm9yaW5nICdhY3F1aXJlZF9iZWZvcmUnIGF0dHJpYnV0ZSBiZWNhdXNlIGl0cyBhcmd1bWVudCBpcyBpbnZhbGlkfX0KIE11dGV4IGFiX3Zhcl9hcmdfYmFkXzMgQUNRVUlSRURfQkVGT1JFKG11RG91YmxlUG9pbnRlcik7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydhY3F1aXJlZF9iZWZvcmUnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydhY3F1aXJlZF9iZWZvcmUnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eScgYXR0cmlidXRlOyB0eXBlIGhlcmUgaXMgJ011dGV4ICoqJ319CiBNdXRleCBhYl92YXJfYXJnX2JhZF80IEFDUVVJUkVEX0JFRk9SRSh1bXUpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snYWNxdWlyZWRfYmVmb3JlJyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgYW5ub3RhdGVkIHdpdGggJ2xvY2thYmxlJyBhdHRyaWJ1dGV9fQorICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2FjcXVpcmVkX2JlZm9yZScgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGV9fQogVW5sb2NrYWJsZU11IGFiX3Zhcl9hcmdfYmFkXzUgQUNRVUlSRURfQkVGT1JFKG11X2FiKTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2FjcXVpcmVkX2JlZm9yZScgYXR0cmlidXRlIGNhbiBvbmx5IGJlIGFwcGxpZWQgaW4gYSBjb250ZXh0IGFubm90YXRlZCB3aXRoICdsb2NrYWJsZScgYXR0cmlidXRlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydhY3F1aXJlZF9iZWZvcmUnIGF0dHJpYnV0ZSBjYW4gb25seSBiZSBhcHBsaWVkIGluIGEgY29udGV4dCBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eSgibXV0ZXgiKScgYXR0cmlidXRlfX0KIAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KQEAgLTYxNyw5ICs2MTcsOSBAQAogaW50IGVsZl9mdW5jdGlvbl9iYWRfMigpIEVYQ0xVU0lWRV9MT0NLX0ZVTkNUSU9OKCJtdSIpOyAvLyBcCiAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZ25vcmluZyAnZXhjbHVzaXZlX2xvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSBiZWNhdXNlIGl0cyBhcmd1bWVudCBpcyBpbnZhbGlkfX0KIGludCBlbGZfZnVuY3Rpb25fYmFkXzMoKSBFWENMVVNJVkVfTE9DS19GVU5DVElPTihtdURvdWJsZVBvaW50ZXIpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZXhjbHVzaXZlX2xvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydleGNsdXNpdmVfbG9ja19mdW5jdGlvbicgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnTXV0ZXggKionfX0KIGludCBlbGZfZnVuY3Rpb25fYmFkXzQoKSBFWENMVVNJVkVfTE9DS19GVU5DVElPTih1bXUpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZXhjbHVzaXZlX2xvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnbG9ja2FibGUnIGF0dHJpYnV0ZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZXhjbHVzaXZlX2xvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eScgYXR0cmlidXRlfX0KIAogaW50IGVsZl9mdW5jdGlvbl9iYWRfMSgpIEVYQ0xVU0lWRV9MT0NLX0ZVTkNUSU9OKDEpOyAvLyBcCiAgIC8vIGV4cGVjdGVkLWVycm9yIHt7J2V4Y2x1c2l2ZV9sb2NrX2Z1bmN0aW9uJyBhdHRyaWJ1dGUgcGFyYW1ldGVyIDEgaXMgb3V0IG9mIGJvdW5kczogbm8gcGFyYW1ldGVycyB0byBpbmRleCBpbnRvfX0KQEAgLTY4OSw5ICs2ODksOSBAQAogaW50IHNsZl9mdW5jdGlvbl9iYWRfMigpIFNIQVJFRF9MT0NLX0ZVTkNUSU9OKCJtdSIpOyAvLyBcCiAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZ25vcmluZyAnc2hhcmVkX2xvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSBiZWNhdXNlIGl0cyBhcmd1bWVudCBpcyBpbnZhbGlkfX0KIGludCBzbGZfZnVuY3Rpb25fYmFkXzMoKSBTSEFSRURfTE9DS19GVU5DVElPTihtdURvdWJsZVBvaW50ZXIpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snc2hhcmVkX2xvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydzaGFyZWRfbG9ja19mdW5jdGlvbicgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnTXV0ZXggKionfX0KIGludCBzbGZfZnVuY3Rpb25fYmFkXzQoKSBTSEFSRURfTE9DS19GVU5DVElPTih1bXUpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snc2hhcmVkX2xvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnbG9ja2FibGUnIGF0dHJpYnV0ZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snc2hhcmVkX2xvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eScgYXR0cmlidXRlfX0KIAogaW50IHNsZl9mdW5jdGlvbl9iYWRfMSgpIFNIQVJFRF9MT0NLX0ZVTkNUSU9OKDEpOyAvLyBcCiAgIC8vIGV4cGVjdGVkLWVycm9yIHt7J3NoYXJlZF9sb2NrX2Z1bmN0aW9uJyBhdHRyaWJ1dGUgcGFyYW1ldGVyIDEgaXMgb3V0IG9mIGJvdW5kczogbm8gcGFyYW1ldGVycyB0byBpbmRleCBpbnRvfX0KQEAgLTcxNSw3ICs3MTUsNyBAQAogLy8gcGx1cyBhbiBvcHRpb25hbCBsaXN0IG9mIGxvY2tzICh2YXJzL2ZpZWxkcykKIAogdm9pZCBldGZfZnVuY3Rpb24oKSBfX2F0dHJpYnV0ZV9fKChleGNsdXNpdmVfdHJ5bG9ja19mdW5jdGlvbikpOyAgLy8gXAotICAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snZXhjbHVzaXZlX3RyeWxvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KIAogdm9pZCBldGZfZnVuY3Rpb25fYXJncygpIEVYQ0xVU0lWRV9UUllMT0NLX0ZVTkNUSU9OKDEsIG11Mik7CiAKQEAgLTc3MSw5ICs3NzEsOSBAQAogaW50IGV0Zl9mdW5jdGlvbl9iYWRfNCgpIEVYQ0xVU0lWRV9UUllMT0NLX0ZVTkNUSU9OKDEsICJtdSIpOyAvLyBcCiAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZ25vcmluZyAnZXhjbHVzaXZlX3RyeWxvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSBiZWNhdXNlIGl0cyBhcmd1bWVudCBpcyBpbnZhbGlkfX0KIGludCBldGZfZnVuY3Rpb25fYmFkXzUoKSBFWENMVVNJVkVfVFJZTE9DS19GVU5DVElPTigxLCBtdURvdWJsZVBvaW50ZXIpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZXhjbHVzaXZlX3RyeWxvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydleGNsdXNpdmVfdHJ5bG9ja19mdW5jdGlvbicgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnTXV0ZXggKionfX0KIGludCBldGZfZnVuY3Rpb25fYmFkXzYoKSBFWENMVVNJVkVfVFJZTE9DS19GVU5DVElPTigxLCB1bXUpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZXhjbHVzaXZlX3RyeWxvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnbG9ja2FibGUnIGF0dHJpYnV0ZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZXhjbHVzaXZlX3RyeWxvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eScgYXR0cmlidXRlfX0KIAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KQEAgLTc4OCw3ICs3ODgsNyBAQAogLy8gcGx1cyBhbiBvcHRpb25hbCBsaXN0IG9mIGxvY2tzICh2YXJzL2ZpZWxkcykKIAogdm9pZCBzdGZfZnVuY3Rpb24oKSBfX2F0dHJpYnV0ZV9fKChzaGFyZWRfdHJ5bG9ja19mdW5jdGlvbikpOyAgLy8gXAotICAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snc2hhcmVkX3RyeWxvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KIAogdm9pZCBzdGZfZnVuY3Rpb25fYXJncygpIFNIQVJFRF9UUllMT0NLX0ZVTkNUSU9OKDEsIG11Mik7CiAKQEAgLTg0NSw5ICs4NDUsOSBAQAogaW50IHN0Zl9mdW5jdGlvbl9iYWRfNCgpIFNIQVJFRF9UUllMT0NLX0ZVTkNUSU9OKDEsICJtdSIpOyAvLyBcCiAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZ25vcmluZyAnc2hhcmVkX3RyeWxvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSBiZWNhdXNlIGl0cyBhcmd1bWVudCBpcyBpbnZhbGlkfX0KIGludCBzdGZfZnVuY3Rpb25fYmFkXzUoKSBTSEFSRURfVFJZTE9DS19GVU5DVElPTigxLCBtdURvdWJsZVBvaW50ZXIpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snc2hhcmVkX3RyeWxvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydzaGFyZWRfdHJ5bG9ja19mdW5jdGlvbicgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnTXV0ZXggKionfX0KIGludCBzdGZfZnVuY3Rpb25fYmFkXzYoKSBTSEFSRURfVFJZTE9DS19GVU5DVElPTigxLCB1bXUpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snc2hhcmVkX3RyeWxvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnbG9ja2FibGUnIGF0dHJpYnV0ZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snc2hhcmVkX3RyeWxvY2tfZnVuY3Rpb24nIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eScgYXR0cmlidXRlfX0KIAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KQEAgLTkwOCw5ICs5MDgsOSBAQAogaW50IHVmX2Z1bmN0aW9uX2JhZF8yKCkgVU5MT0NLX0ZVTkNUSU9OKCJtdSIpOyAvLyBcCiAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZ25vcmluZyAndW5sb2NrX2Z1bmN0aW9uJyBhdHRyaWJ1dGUgYmVjYXVzZSBpdHMgYXJndW1lbnQgaXMgaW52YWxpZH19CiBpbnQgdWZfZnVuY3Rpb25fYmFkXzMoKSBVTkxPQ0tfRlVOQ1RJT04obXVEb3VibGVQb2ludGVyKTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3VubG9ja19mdW5jdGlvbicgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB0aGF0IGFyZSBjbGFzcyB0eXBlIG9yIHBvaW50IHRvIGNsYXNzIHR5cGV9fQorICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3VubG9ja19mdW5jdGlvbicgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnTXV0ZXggKionfX0KIGludCB1Zl9mdW5jdGlvbl9iYWRfNCgpIFVOTE9DS19GVU5DVElPTih1bXUpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3sndW5sb2NrX2Z1bmN0aW9uJyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgYW5ub3RhdGVkIHdpdGggJ2xvY2thYmxlJyBhdHRyaWJ1dGV9fQorICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3VubG9ja19mdW5jdGlvbicgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGV9fQogCiBpbnQgdWZfZnVuY3Rpb25fYmFkXzEoKSBVTkxPQ0tfRlVOQ1RJT04oMSk7IC8vIFwKICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3sndW5sb2NrX2Z1bmN0aW9uJyBhdHRyaWJ1dGUgcGFyYW1ldGVyIDEgaXMgb3V0IG9mIGJvdW5kczogbm8gcGFyYW1ldGVycyB0byBpbmRleCBpbnRvfX0KQEAgLTk4MCwxMyArOTgwLDEzIEBACiAKIC8vIGlsbGVnYWwgYXR0cmlidXRlIGFyZ3VtZW50cwogaW50IGxyX2Z1bmN0aW9uX2JhZF8xKCkgTE9DS19SRVRVUk5FRCgxKTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2xvY2tfcmV0dXJuZWQnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydsb2NrX3JldHVybmVkJyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgYW5ub3RhdGVkIHdpdGggJ2NhcGFiaWxpdHknIGF0dHJpYnV0ZTsgdHlwZSBoZXJlIGlzICdpbnQnfX0KIGludCBscl9mdW5jdGlvbl9iYWRfMigpIExPQ0tfUkVUVVJORUQoIm11Iik7IC8vIFwKICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lnbm9yaW5nICdsb2NrX3JldHVybmVkJyBhdHRyaWJ1dGUgYmVjYXVzZSBpdHMgYXJndW1lbnQgaXMgaW52YWxpZH19CiBpbnQgbHJfZnVuY3Rpb25fYmFkXzMoKSBMT0NLX1JFVFVSTkVEKG11RG91YmxlUG9pbnRlcik7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydsb2NrX3JldHVybmVkJyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHRoYXQgYXJlIGNsYXNzIHR5cGUgb3IgcG9pbnQgdG8gY2xhc3MgdHlwZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snbG9ja19yZXR1cm5lZCcgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnTXV0ZXggKionfX0KIGludCBscl9mdW5jdGlvbl9iYWRfNCgpIExPQ0tfUkVUVVJORUQodW11KTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2xvY2tfcmV0dXJuZWQnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnbG9ja2FibGUnIGF0dHJpYnV0ZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snbG9ja19yZXR1cm5lZCcgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGV9fQogCiAKIApAQCAtMTAwMSw3ICsxMDAxLDcgQEAKIC8vIHRha2VzIG9uZSBvciBtb3JlIGFyZ3VtZW50cywgYWxsIGxvY2tzICh2YXJzL2ZpZWxkcykKIAogdm9pZCBsZV9mdW5jdGlvbigpIF9fYXR0cmlidXRlX18oKGxvY2tzX2V4Y2x1ZGVkKSk7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtZXJyb3Ige3thdHRyaWJ1dGUgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudH19CisgIC8vIGV4cGVjdGVkLWVycm9yIHt7J2xvY2tzX2V4Y2x1ZGVkJyBhdHRyaWJ1dGUgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudH19CiAKIHZvaWQgbGVfZnVuY3Rpb25fYXJnKCkgTE9DS1NfRVhDTFVERUQobXUxKTsKIApAQCAtMTA0NywxMyArMTA0NywxMyBAQAogCiAvLyBpbGxlZ2FsIGF0dHJpYnV0ZSBhcmd1bWVudHMKIGludCBsZV9mdW5jdGlvbl9iYWRfMSgpIExPQ0tTX0VYQ0xVREVEKDEpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snbG9ja3NfZXhjbHVkZWQnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydsb2Nrc19leGNsdWRlZCcgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnaW50J319CiBpbnQgbGVfZnVuY3Rpb25fYmFkXzIoKSBMT0NLU19FWENMVURFRCgibXUiKTsgLy8gXAogICAvLyBleHBlY3RlZC13YXJuaW5nIHt7aWdub3JpbmcgJ2xvY2tzX2V4Y2x1ZGVkJyBhdHRyaWJ1dGUgYmVjYXVzZSBpdHMgYXJndW1lbnQgaXMgaW52YWxpZH19CiBpbnQgbGVfZnVuY3Rpb25fYmFkXzMoKSBMT0NLU19FWENMVURFRChtdURvdWJsZVBvaW50ZXIpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snbG9ja3NfZXhjbHVkZWQnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydsb2Nrc19leGNsdWRlZCcgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnTXV0ZXggKionfX0KIGludCBsZV9mdW5jdGlvbl9iYWRfNCgpIExPQ0tTX0VYQ0xVREVEKHVtdSk7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydsb2Nrc19leGNsdWRlZCcgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdsb2NrYWJsZScgYXR0cmlidXRlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydsb2Nrc19leGNsdWRlZCcgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGV9fQogCiAKIApAQCAtMTA2OCw3ICsxMDY4LDcgQEAKIC8vIHRha2VzIG9uZSBvciBtb3JlIGFyZ3VtZW50cywgYWxsIGxvY2tzICh2YXJzL2ZpZWxkcykKIAogdm9pZCBlbHJfZnVuY3Rpb24oKSBfX2F0dHJpYnV0ZV9fKChleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQpKTsgLy8gXAotICAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KKyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkJyBhdHRyaWJ1dGUgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudH19CiAKIHZvaWQgZWxyX2Z1bmN0aW9uX2FyZygpIEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRChtdTEpOwogCkBAIC0xMTE0LDEzICsxMTE0LDEzIEBACiAKIC8vIGlsbGVnYWwgYXR0cmlidXRlIGFyZ3VtZW50cwogaW50IGVscl9mdW5jdGlvbl9iYWRfMSgpIEVYQ0xVU0lWRV9MT0NLU19SRVFVSVJFRCgxKTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2V4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCcgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB0aGF0IGFyZSBjbGFzcyB0eXBlIG9yIHBvaW50IHRvIGNsYXNzIHR5cGV9fQorICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2V4Y2x1c2l2ZV9sb2Nrc19yZXF1aXJlZCcgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnaW50J319CiBpbnQgZWxyX2Z1bmN0aW9uX2JhZF8yKCkgRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEKCJtdSIpOyAvLyBcCiAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpZ25vcmluZyAnZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkJyBhdHRyaWJ1dGUgYmVjYXVzZSBpdHMgYXJndW1lbnQgaXMgaW52YWxpZH19CiBpbnQgZWxyX2Z1bmN0aW9uX2JhZF8zKCkgRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEKG11RG91YmxlUG9pbnRlcik7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgdGhhdCBhcmUgY2xhc3MgdHlwZSBvciBwb2ludCB0byBjbGFzcyB0eXBlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eScgYXR0cmlidXRlOyB0eXBlIGhlcmUgaXMgJ011dGV4ICoqJ319CiBpbnQgZWxyX2Z1bmN0aW9uX2JhZF80KCkgRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEKHVtdSk7IC8vIFwKLSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydleGNsdXNpdmVfbG9ja3NfcmVxdWlyZWQnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnbG9ja2FibGUnIGF0dHJpYnV0ZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkJyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgYW5ub3RhdGVkIHdpdGggJ2NhcGFiaWxpdHknIGF0dHJpYnV0ZX19CiAKIAogCkBAIC0xMTM2LDcgKzExMzYsNyBAQAogLy8gdGFrZXMgb25lIG9yIG1vcmUgYXJndW1lbnRzLCBhbGwgbG9ja3MgKHZhcnMvZmllbGRzKQogCiB2b2lkIHNscl9mdW5jdGlvbigpIF9fYXR0cmlidXRlX18oKHNoYXJlZF9sb2Nrc19yZXF1aXJlZCkpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLWVycm9yIHt7YXR0cmlidXRlIHRha2VzIGF0IGxlYXN0IDEgYXJndW1lbnR9fQorICAvLyBleHBlY3RlZC1lcnJvciB7eydzaGFyZWRfbG9ja3NfcmVxdWlyZWQnIGF0dHJpYnV0ZSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50fX0KIAogdm9pZCBzbHJfZnVuY3Rpb25fYXJnKCkgU0hBUkVEX0xPQ0tTX1JFUVVJUkVEKG11MSk7CiAKQEAgLTExODIsMTMgKzExODIsMTMgQEAKIAogLy8gaWxsZWdhbCBhdHRyaWJ1dGUgYXJndW1lbnRzCiBpbnQgc2xyX2Z1bmN0aW9uX2JhZF8xKCkgU0hBUkVEX0xPQ0tTX1JFUVVJUkVEKDEpOyAvLyBcCi0gIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snc2hhcmVkX2xvY2tzX3JlcXVpcmVkJyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHRoYXQgYXJlIGNsYXNzIHR5cGUgb3IgcG9pbnQgdG8gY2xhc3MgdHlwZX19CisgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snc2hhcmVkX2xvY2tzX3JlcXVpcmVkJyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgYW5ub3RhdGVkIHdpdGggJ2NhcGFiaWxpdHknIGF0dHJpYnV0ZTsgdHlwZSBoZXJlIGlzICdpbnQnfX0KIGludCBzbHJfZnVuY3Rpb25fYmFkXzIoKSBTSEFSRURfTE9DS1NfUkVRVUlSRUQoIm11Iik7IC8vIFwKICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2lnbm9yaW5nICdzaGFyZWRfbG9ja3NfcmVxdWlyZWQnIGF0dHJpYnV0ZSBiZWNhdXNlIGl0cyBhcmd1bWVudCBpcyBpbnZhbGlkfX0KIGludCBzbHJfZnVuY3Rpb25fYmFkXzMoKSBTSEFSRURfTE9DS1NfUkVRVUlSRUQobXVEb3VibGVQb2ludGVyKTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3NoYXJlZF9sb2Nrc19yZXF1aXJlZCcgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB0aGF0IGFyZSBjbGFzcyB0eXBlIG9yIHBvaW50IHRvIGNsYXNzIHR5cGV9fQorICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3NoYXJlZF9sb2Nrc19yZXF1aXJlZCcgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnTXV0ZXggKionfX0KIGludCBzbHJfZnVuY3Rpb25fYmFkXzQoKSBTSEFSRURfTE9DS1NfUkVRVUlSRUQodW11KTsgLy8gXAotICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3NoYXJlZF9sb2Nrc19yZXF1aXJlZCcgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdsb2NrYWJsZScgYXR0cmlidXRlfX0KKyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydzaGFyZWRfbG9ja3NfcmVxdWlyZWQnIGF0dHJpYnV0ZSByZXF1aXJlcyBhcmd1bWVudHMgd2hvc2UgdHlwZSBpcyBhbm5vdGF0ZWQgd2l0aCAnY2FwYWJpbGl0eScgYXR0cmlidXRlfX0KIAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KQEAgLTE0MzAsNyArMTQzMCw3IEBACiAgIGludCBhIEdVQVJERURfQlkobXUxXyk7CiAgIGludCBiIEdVQVJERURfQlkobXUyXyk7CiAgIGludCBjIEdVQVJERURfQlkobXUzXyk7ICAvLyBcCi0gICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydndWFyZGVkX2J5JyBhdHRyaWJ1dGUgcmVxdWlyZXMgYXJndW1lbnRzIHdob3NlIHR5cGUgaXMgYW5ub3RhdGVkIHdpdGggJ2xvY2thYmxlJyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnY2xhc3MgSW5oZXJpdGFuY2VUZXN0OjpEZXJpdmVkMyd9fQorICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZ3VhcmRlZF9ieScgYXR0cmlidXRlIHJlcXVpcmVzIGFyZ3VtZW50cyB3aG9zZSB0eXBlIGlzIGFubm90YXRlZCB3aXRoICdjYXBhYmlsaXR5JyBhdHRyaWJ1dGU7IHR5cGUgaGVyZSBpcyAnSW5oZXJpdGFuY2VUZXN0OjpEZXJpdmVkMyd9fQogCiAgIHZvaWQgZm9vKCkgRVhDTFVTSVZFX0xPQ0tTX1JFUVVJUkVEKG11MV8sIG11Ml8pIHsKICAgICBhID0gMDsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLXVucmVhY2hhYmxlLmNwcCBiL3Rlc3QvU2VtYUNYWC93YXJuLXVucmVhY2hhYmxlLmNwcAppbmRleCBkZDA3MTI1Li4wNGJkNzQzIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFDWFgvd2Fybi11bnJlYWNoYWJsZS5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tdW5yZWFjaGFibGUuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxICVzIC1mY3h4LWV4Y2VwdGlvbnMgLWZleGNlcHRpb25zIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtZmJsb2NrcyAtV3VucmVhY2hhYmxlLWNvZGUgLVduby11bnVzZWQtdmFsdWUKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucyAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLWZibG9ja3MgLXN0ZD1jKysxMSAtV3VucmVhY2hhYmxlLWNvZGUtYWdncmVzc2l2ZSAtV25vLXVudXNlZC12YWx1ZQogCiBpbnQgJmhhbHQoKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwogaW50ICZsaXZlKCk7CkBAIC0xMDcsMyArMTA3LDIyMyBAQAogICBkZWFkKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KIH0KIAorLy8gSGFuZGxlICd0cnknIGNvZGUgZG9taW5hdGluZyBhIGRlYWQgcmV0dXJuLgorZW51bSBQUjE5MDQwX3Rlc3RfcmV0dXJuX3QKK3sgUFIxOTA0MF9URVNUX0ZBSUxVUkUgfTsKK25hbWVzcGFjZSBQUjE5MDQwX2xpYnRlc3QKK3sKKyAgY2xhc3MgQSB7CisgIHB1YmxpYzoKKyAgICB+QSAoKTsKKyAgfTsKK30KK1BSMTkwNDBfdGVzdF9yZXR1cm5fdCBQUjE5MDQwX2ZuMSAoKQoreworICAgIHRyeQorICAgIHsKKyAgICAgICAgdGhyb3cgUFIxOTA0MF9saWJ0ZXN0OjpBICgpOworICAgIH0gY2F0Y2ggKC4uLikKKyAgICB7CisgICAgICAgIHJldHVybiBQUjE5MDQwX1RFU1RfRkFJTFVSRTsKKyAgICB9CisgICAgcmV0dXJuIFBSMTkwNDBfVEVTVF9GQUlMVVJFOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19Cit9CisKK19fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKK3ZvaWQgcmF6ZSgpOworCituYW1lc3BhY2Ugc3RkIHsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBiYXNpY19zdHJpbmcgeworICBiYXNpY19zdHJpbmcoY29uc3QgVCogeCkge30KKyAgfmJhc2ljX3N0cmluZygpIHt9OworfTsKK3R5cGVkZWYgYmFzaWNfc3RyaW5nPGNoYXI+IHN0cmluZzsKK30KKworc3RkOjpzdHJpbmcgdGVzdFN0cigpIHsKKyAgcmF6ZSgpOworICByZXR1cm4gIiI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sncmV0dXJuJyB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KK30KKworc3RkOjpzdHJpbmcgdGVzdFN0cldhcm4oY29uc3QgY2hhciAqcykgeworICByYXplKCk7CisgIHJldHVybiBzOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19Cit9CisKK2Jvb2wgdGVzdEJvb2woKSB7CisgIHJhemUoKTsKKyAgcmV0dXJuIHRydWU7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sncmV0dXJuJyB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KK30KKworc3RhdGljIGNvbnN0IGJvb2wgQ29uZGl0aW9uVmFyID0gMTsKK2ludCB0ZXN0X2dsb2JhbF9hc19jb25kaXRpb25WYXJpYWJsZSgpIHsKKyAgaWYgKENvbmRpdGlvblZhcikKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7IC8vIG5vLXdhcm5pbmcKK30KKworLy8gSGFuZGxlIHVucmVhY2hhYmxlIHRlbXBvcmFyeSBkZXN0cnVjdG9ycy4KK2NsYXNzIEEgeworcHVibGljOgorICBBKCk7CisgIH5BKCk7Cit9OworCitfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCit2b2lkIHJhemUoY29uc3QgQSYgeCk7CisKK3ZvaWQgdGVzdF93aXRoX3VucmVhY2hhYmxlX3RtcF9kdG9ycyhpbnQgeCkgeworICByYXplKHggPyBBKCkgOiBBKCkpOyAvLyBuby13YXJuaW5nCit9CisKKy8vIFRlc3Qgc2l6ZW9mIC0gc2l6ZW9mIGluIGVudW0gZGVjbGFyYXRpb24uCitlbnVtIHsgQnJvd25Db3cgPSBzaXplb2YobG9uZykgLSBzaXplb2YoY2hhcikgfTsKK2VudW0geyBDb3dCcm93biA9IDggLSAxIH07CisKKworaW50IHRlc3RfZW51bV9zaXplb2ZfYXJpdGhtZXRpYygpIHsKKyAgaWYgKEJyb3duQ293KQorICAgIHJldHVybiAxOworICByZXR1cm4gMjsKK30KKworaW50IHRlc3RfZW51bV9hcml0aG1ldGljKCkgeworICBpZiAoQ293QnJvd24pCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAyOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bmV2ZXIgYmUgZXhlY3V0ZWR9fQorfQorCitpbnQgdGVzdF9hcml0aG1ldGljKCkgeworICBpZiAoOCAtMSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tuZXZlciBiZSBleGVjdXRlZH19Cit9CisKK2ludCB0ZXN0X3RyZWF0X2NvbnN0X2Jvb2xfbG9jYWxfYXNfY29uZmlnX3ZhbHVlKCkgeworICBjb25zdCBib29sIGNvbnRyb2xWYWx1ZSA9IGZhbHNlOworICBpZiAoIWNvbnRyb2xWYWx1ZSkKKyAgICByZXR1cm4gMTsKKyAgdGVzdF90cmVhdF9jb25zdF9ib29sX2xvY2FsX2FzX2NvbmZpZ192YWx1ZSgpOyAvLyBuby13YXJuaW5nCisgIHJldHVybiAwOworfQorCitpbnQgdGVzdF90cmVhdF9ub25fY29uc3RfYm9vbF9sb2NhbF9hc19ub25fY29uZmlnX3ZhbHVlKCkgeworICBib29sIGNvbnRyb2xWYWx1ZSA9IGZhbHNlOworICBpZiAoIWNvbnRyb2xWYWx1ZSkKKyAgICByZXR1cm4gMTsKKyAgLy8gVGhlcmUgaXMgbm8gd2FybmluZyBoZXJlIGJlY2F1c2UgJ2NvbnRyb2xWYWx1ZScgaXNuJ3QgcmVhbGx5CisgIC8vIGEgY29udHJvbCB2YWx1ZSBhdCBhbGwuICBUaGUgQ0ZHIHdpbGwgbm90IHRyZWF0IHRoaXMKKyAgLy8gYnJhbmNoIGFzIHVucmVhY2hhYmxlLgorICB0ZXN0X3RyZWF0X25vbl9jb25zdF9ib29sX2xvY2FsX2FzX25vbl9jb25maWdfdmFsdWUoKTsgLy8gbm8td2FybmluZworICByZXR1cm4gMDsKK30KKwordm9pZCB0ZXN0X2RvX3doaWxlKGludCB4KSB7CisgIC8vIEhhbmRsZSB0cml2aWFsIGV4cHJlc3Npb25zIHdpdGgKKyAgLy8gaW1wbGljaXQgY2FzdHMgdG8gYm9vbC4KKyAgZG8geworICAgIGJyZWFrOworICB9IHdoaWxlICgwKTsgLy8gbm8td2FybmluZworfQorCitjbGFzcyBGcm9ib3p6IHsKK3B1YmxpYzoKKyAgRnJvYm96eihpbnQgeCk7CisgIH5Gcm9ib3p6KCk7Cit9OworCitGcm9ib3p6IHRlc3RfcmV0dXJuX29iamVjdChpbnQgZmxhZykgeworICByZXR1cm4gRnJvYm96eihmbGFnKTsKKyAgcmV0dXJuIEZyb2JvenooNDIpOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydyZXR1cm4nIHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fQorfQorCitGcm9ib3p6IHRlc3RfcmV0dXJuX29iamVjdF9jb250cm9sX2Zsb3coaW50IGZsYWcpIHsKKyAgcmV0dXJuIEZyb2JvenooZmxhZyk7CisgIHJldHVybiBGcm9ib3p6KGZsYWcgPyA0MiA6IDI0KTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NvZGUgd2lsbCBuZXZlciBiZSBleGVjdXRlZH19Cit9CisKK3ZvaWQgc29tZXRoaW5nVG9DYWxsKCk7CisKK3N0YXRpYyBjb25zdGV4cHIgYm9vbCBpc0NvbnN0RXhwckNvbmZpZ1ZhbHVlKCkgeyByZXR1cm4gdHJ1ZTsgfQorCitpbnQgdGVzdF9jb25zdF9leHByX2NvbmZpZ192YWx1ZSgpIHsKKyBpZiAoaXNDb25zdEV4cHJDb25maWdWYWx1ZSgpKSB7CisgICBzb21ldGhpbmdUb0NhbGwoKTsKKyAgIHJldHVybiAwOworIH0KKyBzb21ldGhpbmdUb0NhbGwoKTsgLy8gbm8td2FybmluZworIHJldHVybiAxOworfQoraW50IHRlc3RfY29uc3RfZXhwcl9jb25maWdfdmFsdWVfMigpIHsKKyBpZiAoIWlzQ29uc3RFeHByQ29uZmlnVmFsdWUoKSkgeworICAgc29tZXRoaW5nVG9DYWxsKCk7IC8vIG5vLXdhcm5pbmcKKyAgIHJldHVybiAwOworIH0KKyBzb21ldGhpbmdUb0NhbGwoKTsKKyByZXR1cm4gMTsKK30KKworY2xhc3MgRnJvZG8geworcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCBhSG9iYml0ID0gdHJ1ZTsKK307CisKK3ZvaWQgdGVzdF9zdGF0aWNfY2xhc3NfdmFyKCkgeworICBpZiAoRnJvZG86OmFIb2JiaXQpCisgICAgc29tZXRoaW5nVG9DYWxsKCk7CisgIGVsc2UKKyAgICBzb21ldGhpbmdUb0NhbGwoKTsgLy8gbm8td2FybmluZworfQorCit2b2lkIHRlc3Rfc3RhdGljX2NsYXNzX3ZhcihGcm9kbyAmRikgeworICBpZiAoRi5hSG9iYml0KQorICAgIHNvbWV0aGluZ1RvQ2FsbCgpOworICBlbHNlCisgICAgc29tZXRoaW5nVG9DYWxsKCk7IC8vIG5vLXdhcm5pbmcKK30KKwordm9pZCB0ZXN0X3VucmVhY2hhYmxlX2Zvcl9udWxsX2luY3JlbWVudCgpIHsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDEwIDsgKSAvLyBuby13YXJuaW5nCisgICAgYnJlYWs7Cit9CisKK3ZvaWQgdGVzdF91bnJlYWNoYWJsZV9mb3JyYW5nZV9pbmNyZW1lbnQoKSB7CisgIGludCB4WzEwXSA9IHsgMCB9OworICBmb3IgKGF1dG8gaSA6IHgpIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2xvb3Agd2lsbCBydW4gYXQgbW9zdCBvbmNlIChsb29wIGluY3JlbWVudCBuZXZlciBleGVjdXRlZCl9fQorICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgY2FsbGVkRnVuKCkge30KKworLy8gVGVzdCAic2lsZW5jaW5nIiB3aXRoIHBhcmVudGhlc2VzLgordm9pZCB0ZXN0X3dpdGhfcGFyZW5fc2lsZW5jaW5nKGludCB4KSB7CisgIGlmIChmYWxzZSkgY2FsbGVkRnVuKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0gZXhwZWN0ZWQtbm90ZSB7e3NpbGVuY2UgYnkgYWRkaW5nIHBhcmVudGhlc2VzIHRvIG1hcmsgY29kZSBhcyBleHBsaWNpdGx5IGRlYWR9fQorICBpZiAoKGZhbHNlKSkgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKworICBpZiAodHJ1ZSkgLy8gZXhwZWN0ZWQtbm90ZSB7e3NpbGVuY2UgYnkgYWRkaW5nIHBhcmVudGhlc2VzIHRvIG1hcmsgY29kZSBhcyBleHBsaWNpdGx5IGRlYWR9fQorICAgIGNhbGxlZEZ1bigpOworICBlbHNlCisgICAgY2FsbGVkRnVuKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3t3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KKworICBpZiAoKHRydWUpKQorICAgIGNhbGxlZEZ1bigpOworICBlbHNlCisgICAgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKyAgCisgIGlmICghdHJ1ZSkgLy8gZXhwZWN0ZWQtbm90ZSB7e3NpbGVuY2UgYnkgYWRkaW5nIHBhcmVudGhlc2VzIHRvIG1hcmsgY29kZSBhcyBleHBsaWNpdGx5IGRlYWR9fQorICAgIGNhbGxlZEZ1bigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y29kZSB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkfX0KKyAgZWxzZQorICAgIGNhbGxlZEZ1bigpOworICAKKyAgaWYgKCghdHJ1ZSkpCisgICAgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKyAgZWxzZQorICAgIGNhbGxlZEZ1bigpOworICAKKyAgaWYgKCEodHJ1ZSkpCisgICAgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKyAgZWxzZQorICAgIGNhbGxlZEZ1bigpOworfQorCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvd2Fybi11bnVzZWQtYXR0cmlidXRlLmNwcCBiL3Rlc3QvU2VtYUNYWC93YXJuLXVudXNlZC1hdHRyaWJ1dGUuY3BwCmluZGV4IDcyZjk2ZWUuLmY1MmRlM2IgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC93YXJuLXVudXNlZC1hdHRyaWJ1dGUuY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC93YXJuLXVudXNlZC1hdHRyaWJ1dGUuY3BwCkBAIC0xLDIwICsxLDIwIEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtV3VudXNlZC12YXJpYWJsZSAtdmVyaWZ5ICVzCi1zdHJ1Y3QgX19hdHRyaWJ1dGVfXygod2Fybl91bnVzZWQpKSBUZXN0Ci17Ci0gICAgVGVzdCgpOwotICAgIH5UZXN0KCk7Ci0gICAgdm9pZCB1c2UoKTsKK3N0cnVjdCBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZCkpIFRlc3QgeworICBUZXN0KCk7CisgIH5UZXN0KCk7CisgIHZvaWQgdXNlKCk7CiB9OwogCi1zdHJ1Y3QgVGVzdE5vcm1hbAotewotICAgIFRlc3ROb3JtYWwoKTsKK3N0cnVjdCBUZXN0Tm9ybWFsIHsKKyAgVGVzdE5vcm1hbCgpOwogfTsKIAotaW50IG1haW4oKQotewotICAgVGVzdCB1bnVzZWQ7ICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VudXNlZCB2YXJpYWJsZSAndW51c2VkJ319Ci0gICBUZXN0IHVzZWQ7Ci0gICBUZXN0Tm9ybWFsIG5vcm1hbDsKLSAgIHVzZWQudXNlKCk7CitpbnQgbWFpbih2b2lkKSB7CisgIFRlc3QgdW51c2VkOyAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3t1bnVzZWQgdmFyaWFibGUgJ3VudXNlZCd9fQorICBUZXN0IHVzZWQ7CisgIFRlc3ROb3JtYWwgbm9ybWFsOworICB1c2VkLnVzZSgpOworCisgIGludCBpIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkKSkgPSAxMjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyd3YXJuX3VudXNlZCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzfX0KKyAgcmV0dXJuIGk7CiB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFDWFgvd2Fybi11bnVzZWQtY29tcGFyaXNvbi5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi11bnVzZWQtY29tcGFyaXNvbi5jcHAKaW5kZXggMDE1M2YyMS4uOGU2ZjBmNCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3dhcm4tdW51c2VkLWNvbXBhcmlzb24uY3BwCisrKyBiL3Rlc3QvU2VtYUNYWC93YXJuLXVudXNlZC1jb21wYXJpc29uLmNwcApAQCAtMyw2ICszLDEwIEBACiBzdHJ1Y3QgQSB7CiAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBJik7CiAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBJik7CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEEmKTsKKyAgYm9vbCBvcGVyYXRvcj4oY29uc3QgQSYpOworICBib29sIG9wZXJhdG9yPD0oY29uc3QgQSYpOworICBib29sIG9wZXJhdG9yPj0oY29uc3QgQSYpOwogICBBIG9wZXJhdG9yfD0oY29uc3QgQSYpOwogICBvcGVyYXRvciBib29sKCk7CiB9OwpAQCAtMTUsNiArMTksMTEgQEAKICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7dXNlICc9JyB0byB0dXJuIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbiBpbnRvIGFuIGFzc2lnbm1lbnR9fQogICB4ICE9IDc7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbmVxdWFsaXR5IGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZH19IFwKICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7dXNlICd8PScgdG8gdHVybiB0aGlzIGluZXF1YWxpdHkgY29tcGFyaXNvbiBpbnRvIGFuIG9yLWFzc2lnbm1lbnR9fQorICB4IDwgNzsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxhdGlvbmFsIGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZH19CisgIHggPiA3OyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlbGF0aW9uYWwgY29tcGFyaXNvbiByZXN1bHQgdW51c2VkfX0KKyAgeCA8PSA3OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVsYXRpb25hbCBjb21wYXJpc29uIHJlc3VsdCB1bnVzZWR9fQorICB4ID49IDc7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxhdGlvbmFsIGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZH19CisKICAgNyA9PSB4OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXF1YWxpdHkgY29tcGFyaXNvbiByZXN1bHQgdW51c2VkfX0KICAgcCA9PSBwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXF1YWxpdHkgY29tcGFyaXNvbiByZXN1bHQgdW51c2VkfX0gXAogICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3t1c2UgJz0nIHRvIHR1cm4gdGhpcyBlcXVhbGl0eSBjb21wYXJpc29uIGludG8gYW4gYXNzaWdubWVudH19IFwKQEAgLTI1LDYgKzM0LDExIEBACiAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3VzZSAnPScgdG8gdHVybiB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24gaW50byBhbiBhc3NpZ25tZW50fX0KICAgYSAhPSBiOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW5lcXVhbGl0eSBjb21wYXJpc29uIHJlc3VsdCB1bnVzZWR9fSBcCiAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3VzZSAnfD0nIHRvIHR1cm4gdGhpcyBpbmVxdWFsaXR5IGNvbXBhcmlzb24gaW50byBhbiBvci1hc3NpZ25tZW50fX0KKyAgYSA8IGI7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVsYXRpb25hbCBjb21wYXJpc29uIHJlc3VsdCB1bnVzZWR9fQorICBhID4gYjsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tyZWxhdGlvbmFsIGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZH19CisgIGEgPD0gYjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3JlbGF0aW9uYWwgY29tcGFyaXNvbiByZXN1bHQgdW51c2VkfX0KKyAgYSA+PSBiOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cmVsYXRpb25hbCBjb21wYXJpc29uIHJlc3VsdCB1bnVzZWR9fQorCiAgIEEoKSA9PSBiOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXF1YWxpdHkgY29tcGFyaXNvbiByZXN1bHQgdW51c2VkfX0KICAgaWYgKDQyKSB4ID09IDc7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tlcXVhbGl0eSBjb21wYXJpc29uIHJlc3VsdCB1bnVzZWR9fSBcCiAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7dXNlICc9JyB0byB0dXJuIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbiBpbnRvIGFuIGFzc2lnbm1lbnR9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hQ1hYL3dhcm4tdW51c2VkLWxhYmVsLWVycm9yLmNwcCBiL3Rlc3QvU2VtYUNYWC93YXJuLXVudXNlZC1sYWJlbC1lcnJvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiNjE2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYUNYWC93YXJuLXVudXNlZC1sYWJlbC1lcnJvci5jcHAKQEAgLTAsMCArMSwyNiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLVd1bnVzZWQtdmFyaWFibGUgLVd1bnVzZWQtbGFiZWwgLXZlcmlmeSAlcworCitzdGF0aWMgaW50IHVudXNlZF9sb2NhbF9zdGF0aWM7CisKK25hbWVzcGFjZSBQUjg0NTUgeworICB2b2lkIGYoKSB7CisgICAgQTogLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VudXNlZCBsYWJlbCAnQSd9fQorICAgICAgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaW50IGk7IC8vIGF0dHJpYnV0ZSBhcHBsaWVzIHRvIHZhcmlhYmxlCisgICAgQjogLy8gYXR0cmlidXRlIGFwcGxpZXMgdG8gbGFiZWwKKyAgICAgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOyBpbnQgajsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VudXNlZCB2YXJpYWJsZSAnaid9fQorICB9CisKKyAgdm9pZCBnKCkgeworICAgIEM6IC8vIHVudXNlZCBsYWJlbCAnQycgd2lsbCBub3QgYXBwZWFyIGhlcmUgYmVjYXVzZSBhbiBlcnJvciBoYXMgb2NjdXJyZWQKKyAgICAgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisgICAgICAjcHJhZ21hIHdlYWsgdW51c2VkX2xvY2FsX3N0YXRpYyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnOycgYWZ0ZXIgX19hdHRyaWJ1dGVfX319CisgICAgICA7CisgIH0KKworICB2b2lkIGgoKSB7CisgICAgRDogLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VudXNlZCBsYWJlbCAnRCd9fQorICAgICAgI3ByYWdtYSB3ZWFrIHVudXNlZF9sb2NhbF9zdGF0aWMKKyAgICAgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZGVjbGFyYXRpb24gZG9lcyBub3QgZGVjbGFyZSBhbnl0aGluZ319CisgICAgICA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLXVudXNlZC12YWx1ZS5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi11bnVzZWQtdmFsdWUuY3BwCmluZGV4IDVlNDNkM2UuLjRlMTM0N2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC93YXJuLXVudXNlZC12YWx1ZS5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tdW51c2VkLXZhbHVlLmNwcApAQCAtMzIsNyArMzIsNyBAQAogfQogCiBuYW1lc3BhY2UgdGVzdDIgewotICBleHRlcm4gIkMiIHsKKyAgZXh0ZXJuICJDKysiIHsKICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBiYXNpY19zdHJpbmcgewogICAgICAgICBzdHJ1Y3QgWCB7fTsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLXVudXNlZC12YXJpYWJsZXMuY3BwIGIvdGVzdC9TZW1hQ1hYL3dhcm4tdW51c2VkLXZhcmlhYmxlcy5jcHAKaW5kZXggOTNkMmY2Zi4uZWNiMzZlYyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hQ1hYL3dhcm4tdW51c2VkLXZhcmlhYmxlcy5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4tdW51c2VkLXZhcmlhYmxlcy5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtV3VudXNlZC12YXJpYWJsZSAtV3VudXNlZC1sYWJlbCAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtV3VudXNlZC12YXJpYWJsZSAtV3VudXNlZC1sYWJlbCAtV25vLWMrKzF5LWV4dGVuc2lvbnMgLXZlcmlmeSAlcwogdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmKCkgewogICBUIHQ7CiAgIHQgPSAxNzsKQEAgLTExNSw2ICsxMTUsMTcgQEAKICAgfQogfQogCituYW1lc3BhY2UgUFIxOTMwNSB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBuID0gMDsgLy8gbm8gd2FybmluZworICBpbnQgYSA9IG48aW50PjsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBpbnQgbCA9IDA7IC8vIG5vIHdhcm5pbmcKKyAgaW50IGIgPSBsPGludD47CisKKyAgLy8gRklYTUU6IEl0J2QgYmUgbmljZSB0byB3YXJuIGhlcmUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBtID0gMDsKK30KKwogbmFtZXNwYWNlIGN0b3Jfd2l0aF9jbGVhbnVwcyB7CiAgIHN0cnVjdCBTMSB7CiAgICAgflMxKCk7CkBAIC0xMjgsMjYgKzEzOSwzIEBACiB9CiAKICNpbmNsdWRlICJJbnB1dHMvd2Fybi11bnVzZWQtdmFyaWFibGVzLmgiCi0KLW5hbWVzcGFjZSBQUjg0NTUgewotICB2b2lkIGYoKSB7Ci0gICAgQTogLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VudXNlZCBsYWJlbCAnQSd9fQotICAgICAgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaW50IGk7IC8vIGF0dHJpYnV0ZSBhcHBsaWVzIHRvIHZhcmlhYmxlCi0gICAgQjogLy8gYXR0cmlidXRlIGFwcGxpZXMgdG8gbGFiZWwKLSAgICAgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOyBpbnQgajsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VudXNlZCB2YXJpYWJsZSAnaid9fQotICB9Ci0KLSAgdm9pZCBnKCkgewotICAgIEM6IC8vIHVudXNlZCBsYWJlbCAnQycgd2lsbCBub3QgYXBwZWFyIGhlcmUgYmVjYXVzZSBhbiBlcnJvciBvY2N1cnMKLSAgICAgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCi0gICAgICAjcHJhZ21hIHdlYWsgdW51c2VkX2xvY2FsX3N0YXRpYyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tleHBlY3RlZCAnOycgYWZ0ZXIgX19hdHRyaWJ1dGVfX319Ci0gICAgICA7Ci0gIH0KLQotICB2b2lkIGgoKSB7Ci0gICAgRDogLy8gZXhwZWN0ZWQtd2FybmluZyB7e3VudXNlZCBsYWJlbCAnRCd9fQotICAgICAgI3ByYWdtYSB3ZWFrIHVudXNlZF9sb2NhbF9zdGF0aWMKLSAgICAgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZGVjbGFyYXRpb24gZG9lcyBub3QgZGVjbGFyZSBhbnl0aGluZ319Ci0gICAgICA7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYUNYWC93YXJuLXdlYWstdnRhYmxlcy5jcHAgYi90ZXN0L1NlbWFDWFgvd2Fybi13ZWFrLXZ0YWJsZXMuY3BwCmluZGV4IDEzNWUwMzQuLjY3MWZmMjkgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYUNYWC93YXJuLXdlYWstdnRhYmxlcy5jcHAKKysrIGIvdGVzdC9TZW1hQ1hYL3dhcm4td2Vhay12dGFibGVzLmNwcApAQCAtMSw0ICsxLDUgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLVd3ZWFrLXZ0YWJsZXMgLVd3ZWFrLXRlbXBsYXRlLXZ0YWJsZXMKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1Xd2Vhay12dGFibGVzIC1Xd2Vhay10ZW1wbGF0ZS12dGFibGVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWZzeW50YXgtb25seSAtdHJpcGxlICVtc19hYmlfdHJpcGxlIC1XZXJyb3IgLVduby13ZWFrLXZ0YWJsZXMgLVduby13ZWFrLXRlbXBsYXRlLXZ0YWJsZXMKIAogc3RydWN0IEEgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0EnIGhhcyBubyBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCBkZWZpbml0aW9uczsgaXRzIHZ0YWJsZSB3aWxsIGJlIGVtaXR0ZWQgaW4gZXZlcnkgdHJhbnNsYXRpb24gdW5pdH19CiAgIHZpcnR1YWwgdm9pZCBmKCkgeyB9IApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9hcmMtZGVjbHMubSBiL3Rlc3QvU2VtYU9iakMvYXJjLWRlY2xzLm0KaW5kZXggOTAzY2VhMi4uN2ZjZjU3NiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9hcmMtZGVjbHMubQorKysgYi90ZXN0L1NlbWFPYmpDL2FyYy1kZWNscy5tCkBAIC01MSwyMCArNTEsMjggQEAKIH0KIAogLy8gcmRhcjovLzkxNTczNDgKKy8vIHJkYXI6Ly8xNTc1NzUxMAogCiBAaW50ZXJmYWNlIEoKLUBwcm9wZXJ0eSAocmV0YWluKSBpZCBuZXdGb287IC8vIGV4cGVjdGVkLW5vdGUge3twcm9wZXJ0eSBkZWNsYXJlZCBoZXJlfX0KLUBwcm9wZXJ0eSAoc3Ryb25nKSBpZCBjb3B5QmFyOyAvLyBleHBlY3RlZC1ub3RlIHt7cHJvcGVydHkgZGVjbGFyZWQgaGVyZX19Ci1AcHJvcGVydHkgKGNvcHkpIGlkIGFsbG9jQmF6OyAvLyBleHBlY3RlZC1ub3RlIHt7cHJvcGVydHkgZGVjbGFyZWQgaGVyZX19CitAcHJvcGVydHkgKHJldGFpbikgaWQgbmV3Rm9vOyAvLyBleHBlY3RlZC1lcnJvciB7e3Byb3BlcnR5IGZvbGxvd3MgQ29jb2EgbmFtaW5nIGNvbnZlbnRpb24gZm9yIHJldHVybmluZyAnb3duZWQnIG9iamVjdHN9fQorQHByb3BlcnR5IChzdHJvbmcpIGlkIGNvcHlCYXI7ICAvLyBleHBlY3RlZC1lcnJvciB7e3Byb3BlcnR5IGZvbGxvd3MgQ29jb2EgbmFtaW5nIGNvbnZlbnRpb24gZm9yIHJldHVybmluZyAnb3duZWQnIG9iamVjdHN9fQorQHByb3BlcnR5IChjb3B5KSBpZCBhbGxvY0JhejsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcm9wZXJ0eSBmb2xsb3dzIENvY29hIG5hbWluZyBjb252ZW50aW9uIGZvciByZXR1cm5pbmcgJ293bmVkJyBvYmplY3RzfX0KIEBwcm9wZXJ0eSAoY29weSwgbm9uYXRvbWljKSBpZCBuZXc7CitAcHJvcGVydHkgKHJldGFpbikgaWQgbmV3REZvbzsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcm9wZXJ0eSBmb2xsb3dzIENvY29hIG5hbWluZyBjb252ZW50aW9uIGZvciByZXR1cm5pbmcgJ293bmVkJyBvYmplY3RzfX0KK0Bwcm9wZXJ0eSAoc3Ryb25nKSBpZCBjb3B5REJhcjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twcm9wZXJ0eSBmb2xsb3dzIENvY29hIG5hbWluZyBjb252ZW50aW9uIGZvciByZXR1cm5pbmcgJ293bmVkJyBvYmplY3RzfX0KK0Bwcm9wZXJ0eSAoY29weSkgaWQgYWxsb2NEQmF6OyAvLyBleHBlY3RlZC1lcnJvciB7e3Byb3BlcnR5IGZvbGxvd3MgQ29jb2EgbmFtaW5nIGNvbnZlbnRpb24gZm9yIHJldHVybmluZyAnb3duZWQnIG9iamVjdHN9fQogQGVuZAogCiBAaW1wbGVtZW50YXRpb24gSgotQHN5bnRoZXNpemUgbmV3Rm9vOwkvLyBleHBlY3RlZC1lcnJvciB7e3Byb3BlcnR5J3Mgc3ludGhlc2l6ZWQgZ2V0dGVyIGZvbGxvd3MgQ29jb2EgbmFtaW5nIGNvbnZlbnRpb24gZm9yIHJldHVybmluZ319Ci1Ac3ludGhlc2l6ZSBjb3B5QmFyOwkvLyBleHBlY3RlZC1lcnJvciB7e3Byb3BlcnR5J3Mgc3ludGhlc2l6ZWQgZ2V0dGVyIGZvbGxvd3MgQ29jb2EgbmFtaW5nIGNvbnZlbnRpb24gZm9yIHJldHVybmluZ319Ci1Ac3ludGhlc2l6ZSBhbGxvY0JhejsJLy8gZXhwZWN0ZWQtZXJyb3Ige3twcm9wZXJ0eSdzIHN5bnRoZXNpemVkIGdldHRlciBmb2xsb3dzIENvY29hIG5hbWluZyBjb252ZW50aW9uIGZvciByZXR1cm5pbmd9fQorQHN5bnRoZXNpemUgbmV3Rm9vOworQHN5bnRoZXNpemUgY29weUJhcjsKK0BzeW50aGVzaXplIGFsbG9jQmF6OwogQHN5bnRoZXNpemUgbmV3OwogLSBuZXcge3JldHVybiAwOyB9OworCitAZHluYW1pYyBuZXdERm9vOworQGR5bmFtaWMgY29weURCYXI7IAorQGR5bmFtaWMgYWxsb2NEQmF6OwogQGVuZAogCiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvYXJjLWp1bXAtYmxvY2subSBiL3Rlc3QvU2VtYU9iakMvYXJjLWp1bXAtYmxvY2subQppbmRleCAyNmExZmM4Li45YjA2YzVhIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL2FyYy1qdW1wLWJsb2NrLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9hcmMtanVtcC1ibG9jay5tCkBAIC04NCw3ICs4NCw3IEBACiBAZW5kCiAKIC8vIFRlc3QgMi4gIHJkYXI6Ly9wcm9ibGVtLzExMTUwOTE5Ci1pbnQgdGVzdDIoaWQgb2JqLCBpbnQgc3RhdGUpIHsgLy8gZXhwZWN0ZWQtbm90ZSB7e2p1bXAgZW50ZXJzIGxpZmV0aW1lIG9mIGJsb2NrfX0gRklYTUU6IHdpZXJkIGxvY2F0aW9uCitpbnQgdGVzdDIoaWQgb2JqLCBpbnQgc3RhdGUpIHsgLy8gZXhwZWN0ZWQtbm90ZSB7e2p1bXAgZW50ZXJzIGxpZmV0aW1lIG9mIGJsb2NrfX0gRklYTUU6IHdlaXJkIGxvY2F0aW9uCiAgIHN3aXRjaCAoc3RhdGUpIHsKICAgY2FzZSAwOgogICAgICh2b2lkKSBeeyAodm9pZCkgb2JqOyB9OwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9hcmMtb2JqY2JyaWRnZS1yZWxhdGVkLWF0dHJpYnV0ZS5tIGIvdGVzdC9TZW1hT2JqQy9hcmMtb2JqY2JyaWRnZS1yZWxhdGVkLWF0dHJpYnV0ZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGFlZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWFPYmpDL2FyYy1vYmpjYnJpZGdlLXJlbGF0ZWQtYXR0cmlidXRlLm0KQEAgLTAsMCArMSw0MSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXggb2JqZWN0aXZlLWMgLWZvYmpjLWFyYyAtdmVyaWZ5IC1Xbm8tb2JqYy1yb290LWNsYXNzICVzCisvLyByZGFyOi8vMTU0OTkxMTEKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2VfcmVsYXRlZChOU0NvbG9yLGNvbG9yV2l0aENHQ29sb3I6LENHQ29sb3IpKSkgQ0dDb2xvciAqQ0dDb2xvclJlZjsgLy8gZXhwZWN0ZWQtbm90ZSA1IHt7ZGVjbGFyZWQgaGVyZX19Cit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZV9yZWxhdGVkKE5TQ29sb3IsLENHQ29sb3IxKSkpIENHQ29sb3IxICpDR0NvbG9yUmVmMTsKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX3JlbGF0ZWQoTlNDb2xvciwsKSkpIENHQ29sb3IyICpDR0NvbG9yUmVmMjsKKworQGludGVyZmFjZSBOU0NvbG9yIC8vIGV4cGVjdGVkLW5vdGUgNSB7e2RlY2xhcmVkIGhlcmV9fQorKyAoTlNDb2xvciAqKWNvbG9yV2l0aENHQ29sb3I6KENHQ29sb3JSZWYpY2dDb2xvcjsKKy0gKENHQ29sb3JSZWYpQ0dDb2xvcjsKKy0gKENHQ29sb3JSZWYxKUNHQ29sb3IxOworQGVuZAorCitAaW50ZXJmYWNlIE5TVGV4dEZpZWxkIAorLSAodm9pZClzZXRCYWNrZ3JvdW5kQ29sb3I6KE5TQ29sb3IgKiljb2xvcjsKKy0gKE5TQ29sb3IgKiliYWNrZ3JvdW5kQ29sb3I7CitAZW5kCisKK3ZvaWQgZm9vKE5TQ29sb3IqKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Bhc3NpbmcgYXJndW1lbnQgdG8gcGFyYW1ldGVyIGhlcmV9fQorCitOU0NvbG9yICogVGVzdDEoTlNUZXh0RmllbGQgKnRleHRGaWVsZCwgQ0dDb2xvclJlZiBuZXdDb2xvcikgeworICBmb28obmV3Q29sb3IpOyAvLyBleHBlY3RlZC1lcnJvciB7eydDR0NvbG9yUmVmJyAoYWthICdzdHJ1Y3QgQ0dDb2xvciAqJykgbXVzdCBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCB0byAnTlNDb2xvciAqJzsgdXNlICcrY29sb3JXaXRoQ0dDb2xvcjonIG1ldGhvZCBmb3IgdGhpcyBjb252ZXJzaW9ufX0KKyAgdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvciA9IG5ld0NvbG9yOyAvLyBleHBlY3RlZC1lcnJvciB7eydDR0NvbG9yUmVmJyAoYWthICdzdHJ1Y3QgQ0dDb2xvciAqJykgbXVzdCBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCB0byAnTlNDb2xvciAqX19zdHJvbmcnOyB1c2UgJytjb2xvcldpdGhDR0NvbG9yOicgbWV0aG9kIGZvciB0aGlzIGNvbnZlcnNpb259fQorICByZXR1cm4gbmV3Q29sb3I7IC8vIGV4cGVjdGVkLWVycm9yIHt7J0NHQ29sb3JSZWYnIChha2EgJ3N0cnVjdCBDR0NvbG9yIConKSBtdXN0IGJlIGV4cGxpY2l0bHkgY29udmVydGVkIHRvICdOU0NvbG9yIConOyB1c2UgJytjb2xvcldpdGhDR0NvbG9yOicgbWV0aG9kIGZvciB0aGlzIGNvbnZlcnNpb259fQorfQorCitOU0NvbG9yICogVGVzdDIoTlNUZXh0RmllbGQgKnRleHRGaWVsZCwgQ0dDb2xvclJlZjEgbmV3Q29sb3IpIHsKKyAgZm9vKG5ld0NvbG9yKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2luY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzIHBhc3NpbmcgJ0NHQ29sb3JSZWYxJyAoYWthICdzdHJ1Y3QgQ0dDb2xvcjEgKicpIHRvIHBhcmFtZXRlciBvZiB0eXBlICdOU0NvbG9yIConfX0KKyAgdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvciA9IG5ld0NvbG9yOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW5jb21wYXRpYmxlIHBvaW50ZXIgdHlwZXMgYXNzaWduaW5nIHRvICdOU0NvbG9yICpfX3N0cm9uZycgZnJvbSAnQ0dDb2xvclJlZjEnIChha2EgJ3N0cnVjdCBDR0NvbG9yMSAqJyl9fQorICByZXR1cm4gbmV3Q29sb3I7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcyByZXR1cm5pbmcgJ0NHQ29sb3JSZWYxJyAoYWthICdzdHJ1Y3QgQ0dDb2xvcjEgKicpIGZyb20gYSBmdW5jdGlvbiB3aXRoIHJlc3VsdCB0eXBlICdOU0NvbG9yIConfX0KK30KKworQ0dDb2xvclJlZiBUZXN0MyhOU1RleHRGaWVsZCAqdGV4dEZpZWxkLCBDR0NvbG9yUmVmIG5ld0NvbG9yKSB7CisgIG5ld0NvbG9yID0gdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvcjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snTlNDb2xvciAqJyBtdXN0IGJlIGV4cGxpY2l0bHkgY29udmVydGVkIHRvICdDR0NvbG9yUmVmJyAoYWthICdzdHJ1Y3QgQ0dDb2xvciAqJyk7IHVzZSAnLUNHQ29sb3InIG1ldGhvZCBmb3IgdGhpcyBjb252ZXJzaW9ufX0KKyAgcmV0dXJuIHRleHRGaWVsZC5iYWNrZ3JvdW5kQ29sb3I7IC8vIGV4cGVjdGVkLWVycm9yIHt7J05TQ29sb3IgKicgbXVzdCBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCB0byAnQ0dDb2xvclJlZicgKGFrYSAnc3RydWN0IENHQ29sb3IgKicpOyB1c2UgJy1DR0NvbG9yJyBtZXRob2QgZm9yIHRoaXMgY29udmVyc2lvbn19Cit9CisKK0NHQ29sb3JSZWYyIFRlc3Q0KE5TVGV4dEZpZWxkICp0ZXh0RmllbGQsIENHQ29sb3JSZWYyIG5ld0NvbG9yKSB7CisgIG5ld0NvbG9yID0gdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvcjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2luY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzIGFzc2lnbmluZ319CisgIHJldHVybiB0ZXh0RmllbGQuYmFja2dyb3VuZENvbG9yOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW5jb21wYXRpYmxlIHBvaW50ZXIgdHlwZXMgcmV0dXJuaW5nfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvYXJjLXByb3BlcnR5LWxpZmV0aW1lLm0gYi90ZXN0L1NlbWFPYmpDL2FyYy1wcm9wZXJ0eS1saWZldGltZS5tCmluZGV4IGVkNzJlOGMuLjQ4NzRmZjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvYXJjLXByb3BlcnR5LWxpZmV0aW1lLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9hcmMtcHJvcGVydHktbGlmZXRpbWUubQpAQCAtMTU0LDcgKzE1NCw3IEBACiBAcHJvcGVydHkgIGlkIHByb3A7CiBAcHJvcGVydHkgIF9fc3Ryb25nIGlkIHN0cm9uZ19wcm9wOwogQHByb3BlcnR5ICAoc3Ryb25nKSBpZCBzdHJvbmdfYXR0cl9wcm9wOwotQHByb3BlcnR5ICAoc3Ryb25nKSBfX3N0cm9uZyBpZCByZWFseV9zdHJvbmdfYXR0cl9wcm9wOworQHByb3BlcnR5ICAoc3Ryb25nKSBfX3N0cm9uZyBpZCByZWFsbHlfc3Ryb25nX2F0dHJfcHJvcDsKICsgKGlkKSBhbGxvYzsKIC0gKGlkKSBpbml0OwogLSAoaWQpIGltcGxpY2l0OwpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICAgIGYucHJvcCA9IFtbQmF6IGFsbG9jXSBpbml0XTsKICAgICAgICAgZi5zdHJvbmdfcHJvcCA9IFtbQmF6IGFsbG9jXSBpbml0XTsKICAgICAgICAgZi5zdHJvbmdfYXR0cl9wcm9wID0gW1tCYXogYWxsb2NdIGluaXRdOwotICAgICAgICBmLnJlYWx5X3N0cm9uZ19hdHRyX3Byb3AgPSBbW0JheiBhbGxvY10gaW5pdF07CisgICAgICAgIGYucmVhbGx5X3N0cm9uZ19hdHRyX3Byb3AgPSBbW0JheiBhbGxvY10gaW5pdF07CiAgICAgICAgIGYuaW1wbGljaXQgPSBbW0JheiBhbGxvY10gaW5pdF07CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvYXJjLXVuYXZhaWxhYmxlLWZvci13ZWFrcmVmLm0gYi90ZXN0L1NlbWFPYmpDL2FyYy11bmF2YWlsYWJsZS1mb3Itd2Vha3JlZi5tCmluZGV4IGVhYjVmMmMuLjgyNzQ4MDIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvYXJjLXVuYXZhaWxhYmxlLWZvci13ZWFrcmVmLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9hcmMtdW5hdmFpbGFibGUtZm9yLXdlYWtyZWYubQpAQCAtOTAsMyArOTAsNSBAQAogX19hdHRyaWJ1dGVfXygob2JqY19hcmNfd2Vha19yZWZlcmVuY2VfdW5hdmFpbGFibGUoMSkpKQkvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZScgYXR0cmlidXRlIHRha2VzIG5vIGFyZ3VtZW50c319CiBAaW50ZXJmYWNlIEkzCiBAZW5kCisKK2ludCBJNCBfX2F0dHJpYnV0ZV9fKChvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZSkpOyAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2FyY193ZWFrX3JlZmVyZW5jZV91bmF2YWlsYWJsZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBPYmplY3RpdmUtQyBpbnRlcmZhY2VzfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvYXJjLXVuYXZhaWxhYmxlLXN5c3RlbS1mdW5jdGlvbi5tIGIvdGVzdC9TZW1hT2JqQy9hcmMtdW5hdmFpbGFibGUtc3lzdGVtLWZ1bmN0aW9uLm0KaW5kZXggYjBiNzBkYi4uNTRjZWFhZiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9hcmMtdW5hdmFpbGFibGUtc3lzdGVtLWZ1bmN0aW9uLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9hcmMtdW5hdmFpbGFibGUtc3lzdGVtLWZ1bmN0aW9uLm0KQEAgLTMsNyArMyw3IEBACiAKICMgMSAiPGNvbW1hbmQgbGluZT4iCiAjIDEgIi9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0ZvdW5kYXRpb24uZnJhbWV3b3JrL0hlYWRlcnMvRm91bmRhdGlvbi5oIiAxIDMKLWlkICogZm9vKCk7IC8vIGV4cGVjdGVkLW5vdGUge3tmdW5jdGlvbiBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZSBoZXJlfX0KK2lkICogZm9vKCk7IC8vIGV4cGVjdGVkLW5vdGUge3snZm9vJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZSBoZXJlfX0KIAogIyAxICJhcmMtdW5hdmFpbGFibGUtc3lzdGVtLWZ1bmN0aW9uLm0iIDIKIHZvaWQgcmV0KCkgewpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9hdHRyLWF2YWlsYWJpbGl0eS5tIGIvdGVzdC9TZW1hT2JqQy9hdHRyLWF2YWlsYWJpbGl0eS5tCmluZGV4IGZkZGNkNTAuLjc5OTBiMTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvYXR0ci1hdmFpbGFiaWxpdHkubQorKysgYi90ZXN0L1NlbWFPYmpDL2F0dHItYXZhaWxhYmlsaXR5Lm0KQEAgLTEsMTEgKzEsMTEgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW45LjAuMCAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKIAogQHByb3RvY29sIFAKLS0gKHZvaWQpcHJvdG9fbWV0aG9kIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC4xLGRlcHJlY2F0ZWQ9MTAuMikpKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7bWV0aG9kICdwcm90b19tZXRob2QnIGRlY2xhcmVkIGhlcmV9fQorLSAodm9pZClwcm90b19tZXRob2QgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjEsZGVwcmVjYXRlZD0xMC4yKSkpOyAvLyBleHBlY3RlZC1ub3RlIDIge3sncHJvdG9fbWV0aG9kJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogQGVuZAogCiBAaW50ZXJmYWNlIEEgPFA+Ci0tICh2b2lkKW1ldGhvZCBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuMSxkZXByZWNhdGVkPTEwLjIpKSk7IC8vIGV4cGVjdGVkLW5vdGUge3ttZXRob2QgJ21ldGhvZCcgZGVjbGFyZWQgaGVyZX19CistICh2b2lkKW1ldGhvZCBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuMSxkZXByZWNhdGVkPTEwLjIpKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snbWV0aG9kJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogCiAtICh2b2lkKW92ZXJyaWRkZW4gX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjMpKSk7IC8vIGV4cGVjdGVkLW5vdGV7e292ZXJyaWRkZW4gbWV0aG9kIGlzIGhlcmV9fQogLSAodm9pZClvdmVycmlkZGVuMiBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuMykpKTsKQEAgLTM3LDcgKzM3LDcgQEAKIC8vIHVzaW5nIGEgZGVwcmVjYXRlZCBtZXRob2Qgd2hlbiB0aGF0IG1ldGhvZCBpcyByZS1pbXBsZW1lbnRlZCBpbiBhCiAvLyBzdWJjbGFzcyB3aGVyZSB0aGUgcmVkZWNsYXJlZCBtZXRob2QgaXMgbm90IGRlcHJlY2F0ZWQuCiBAaW50ZXJmYWNlIEMKLS0gKHZvaWQpIG1ldGhvZCBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuMSxkZXByZWNhdGVkPTEwLjIpKSk7IC8vIGV4cGVjdGVkLW5vdGUge3ttZXRob2QgJ21ldGhvZCcgZGVjbGFyZWQgaGVyZX19CistICh2b2lkKSBtZXRob2QgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjEsZGVwcmVjYXRlZD0xMC4yKSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J21ldGhvZCcgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIEBlbmQKIAogQGludGVyZmFjZSBEIDogQwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9hdHRyLWRlcHJlY2F0ZWQubSBiL3Rlc3QvU2VtYU9iakMvYXR0ci1kZXByZWNhdGVkLm0KaW5kZXggYWE0YjQ3OS4uOWRiYTQ4ZSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9hdHRyLWRlcHJlY2F0ZWQubQorKysgYi90ZXN0L1NlbWFPYmpDL2F0dHItZGVwcmVjYXRlZC5tCkBAIC0yLDEwICsyLDEwIEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXggb2JqZWN0aXZlLWMrKyAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKIAogQGludGVyZmFjZSBBIHsKLSAgaW50IFggX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIDIge3tkZWNsYXJlZCBoZXJlfX0KKyAgaW50IFggX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIDIge3snWCcgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIH0KLSsgKHZvaWQpRiBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUgMiB7e2RlY2xhcmVkIGhlcmV9fQotLSAodm9pZClmIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSA0IHt7ZGVjbGFyZWQgaGVyZX19CisrICh2b2lkKUYgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIDIge3snRicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KKy0gKHZvaWQpZiBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUgNCB7eydmJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogQGVuZAogCiBAaW1wbGVtZW50YXRpb24gQQpAQCAtNDMsNyArNDMsNyBAQAogQGVuZAogCiBAcHJvdG9jb2wgUAotLSAodm9pZClwIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorLSAodm9pZClwIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydwJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogQGVuZAogCiB2b2lkIHQxKEEgKmEpCkBAIC03Miw3ICs3Miw3IEBACiAKIEBpbnRlcmZhY2UgQmFyIAogCi1AcHJvcGVydHkgKGFzc2lnbiwgc2V0dGVyID0gTXlTZXR0ZXI6KSBpbnQgRm9vQmFyIF9fYXR0cmlidXRlX18gKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUgMiB7e2RlY2xhcmVkIGhlcmV9fQorQHByb3BlcnR5IChhc3NpZ24sIHNldHRlciA9IE15U2V0dGVyOikgaW50IEZvb0JhciBfX2F0dHJpYnV0ZV9fICgoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIDIge3snRm9vQmFyJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogLSAodm9pZCkgTXlTZXR0ZXIgOiAoaW50KSB2YWx1ZTsKIEBlbmQKIApAQCAtODQsNyArODQsNyBAQAogCiAKIF9fYXR0cmlidXRlICgoZGVwcmVjYXRlZCkpICAKLUBpbnRlcmZhY2UgREVQUkVDQVRFRCB7IC8vIGV4cGVjdGVkLW5vdGUgMiB7e2RlY2xhcmVkIGhlcmV9fQorQGludGVyZmFjZSBERVBSRUNBVEVEIHsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7J0RFUFJFQ0FURUQnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAgIEBwdWJsaWMgaW50IGl2YXI7IAogICBERVBSRUNBVEVEICppdmFyMjsgLy8gbm8gd2FybmluZy4KIH0gCkBAIC0xMDgsOCArMTA4LDggQEAKIAogCiBAaW50ZXJmYWNlIFRlc3QyCi1AcHJvcGVydHkgaW50IHRlc3QyIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSA0IHt7ZGVjbGFyZWQgaGVyZX19IFwKLQkJCQkJCSAvLyBleHBlY3RlZC1ub3RlIDIge3twcm9wZXJ0eSAndGVzdDInIGlzIGRlY2xhcmVkIGRlcHJlY2F0ZWQgaGVyZX19CitAcHJvcGVydHkgaW50IHRlc3QyIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7cHJvcGVydHkgJ3Rlc3QyJyBpcyBkZWNsYXJlZCBkZXByZWNhdGVkIGhlcmV9fSBleHBlY3RlZC1ub3RlIDMge3sndGVzdDInIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19IFwKKwkJCQkJCSAvLyBleHBlY3RlZC1ub3RlIHt7J3NldFRlc3QyOicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIEBlbmQKIAogdm9pZCB0ZXN0KFRlc3QyICpmb28pIHsKQEAgLTEyNyw3ICsxMjcsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAJaW50IHg7Ci19IGZvb3R5cGUgX19hdHRyaWJ1dGUoKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7ZGVjbGFyZWQgaGVyZX19Cit9IGZvb3R5cGUgX19hdHRyaWJ1dGUoKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7J2Zvb3R5cGUnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAKIEBpbnRlcmZhY2UgZm9vIHsKIAlmb290eXBlIGE7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZm9vdHlwZScgaXMgZGVwcmVjYXRlZH19CkBAIC0xNDIsNyArMTQyLDcgQEAKICsodm9pZCljbWV0aDsKIEBlbmQKIAotdHlwZWRlZiBOZXdJIERlcHJJIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoImJsYWgiKSkpOyAvLyBleHBlY3RlZC1ub3RlIDQge3snRGVwckknIGRlY2xhcmVkIGhlcmV9fQordHlwZWRlZiBOZXdJIERlcHJJIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQoImJsYWgiKSkpOyAvLyBleHBlY3RlZC1ub3RlIDQge3snRGVwckknIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAKIEBpbnRlcmZhY2UgU0kgOiBEZXBySSAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0RlcHJJJyBpcyBkZXByZWNhdGVkOiBibGFofX0KIC0oRGVwckkqKW1ldGg7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snRGVwckknIGlzIGRlcHJlY2F0ZWQ6IGJsYWh9fQpAQCAtMTU0LDMgKzE1NCw0MSBAQAogICByZXR1cm4gMDsKIH0KIEBlbmQKKworLy8gPHJkYXI6Ly9wcm9ibGVtLzE1NDA3MzY2PiBhbmQgPHJkYXI6Ly9wcm9ibGVtLzE1NDY2NzgzPjoKKy8vIC0gVXNpbmcgZGVwcmVjYXRlZCBjbGFzcyBuYW1lIGluc2lkZSBjbGFzcyBzaG91bGQgbm90IHdhcm4gYWJvdXQgZGVwcmVjYXRpb24uCisvLyAtIEltcGxlbWVudGF0aW9ucyBvZiBkZXByZWNhdGVkIGNsYXNzZXMgc2hvdWxkIG5vdCByZXN1bHQgaW4gZGVwcmVjYXRpb24gd2FybmluZ3MuCitfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKK0BpbnRlcmZhY2UgRGVwcmVjYXRlZENsYXNzQQorQGVuZAorCitfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKK0BpbnRlcmZhY2UgRGVwcmVjYXRlZENsYXNzQgorLy8gVGhlIHNlbGYtcmVmZXJlbmNlIHJldHVybiB2YWx1ZSBzaG91bGQgbm90IGJlCisvLyBmbGFnZ2VkIGFzIHRoZSB1c2Ugb2YgYSBkZXByZWNhdGVkIGRlY2xhcmF0aW9uLgorKyAoRGVwcmVjYXRlZENsYXNzQiAqKXNoYXJlZEluc3RhbmNlOyAvLyBuby13YXJuaW5nCisKKy8vIFNpbmNlIHRoaXMgY2xhc3MgaXMgZGVwcmVjYXRlZCwgcmV0dXJuaW5nIGEgcmVmZXJlbmNlCisvLyB0byBhbm90aGVyIGRlcHJlY2F0ZWQgY2xhc3MgaXMgZmluZSBhcyB0aGV5IG1heQorLy8gaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgdG9nZXRoZXIuICBGcm9tIGEgdXNlcidzCisvLyBwZXJzcGVjdGl2ZSB0aGV5IGFyZSBhbGwgZGVwcmVjYXRlZC4KKysgKERlcHJlY2F0ZWRDbGFzc0EgKilzb21ldGhpbmdFbHNlOyAvLyBuby13YXJuaW5nCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBEZXByZWNhdGVkQ2xhc3NCCisrIChEZXByZWNhdGVkQ2xhc3NCICopc2hhcmVkSW5zdGFuY2UKK3sKKyAgLy8gVGhpcyBzZWxmLXJlZmVyZW5jZSBzaG91bGQgbm90CisgIC8vIGJlIGZsYWdnZWQgYXMgYSB1c2Ugb2YgYSBkZXByZWNhdGVkCisgIC8vIGRlY2xhcmF0aW9uLgorICBzdGF0aWMgRGVwcmVjYXRlZENsYXNzQiAqeDsgLy8gbm8td2FybmluZworICByZXR1cm4geDsKK30KKysgKERlcHJlY2F0ZWRDbGFzc0EgKilzb21ldGhpbmdFbHNlIHsKKyAgLy8gU2luY2UgdGhpcyBjbGFzcyBpcyBkZXByZWNhdGVkLCByZWZlcmVuY2luZworICAvLyBhbm90aGVyIGRlcHJlY2F0ZWQgY2xhc3MgaXMgYWxzbyBPSy4KKyAgc3RhdGljIERlcHJlY2F0ZWRDbGFzc0EgKng7IC8vIG5vLXdhcm5pbmcKKyAgcmV0dXJuIHg7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvYXR0ci1kZXNpZ25hdGVkLWluaXQubSBiL3Rlc3QvU2VtYU9iakMvYXR0ci1kZXNpZ25hdGVkLWluaXQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWYzNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hT2JqQy9hdHRyLWRlc2lnbmF0ZWQtaW5pdC5tCkBAIC0wLDAgKzEsMjkzIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtV25vLWluY29tcGxldGUtaW1wbGVtZW50YXRpb24gLXZlcmlmeSAtZmJsb2NrcyAlcworCisjZGVmaW5lIE5TX0RFU0lHTkFURURfSU5JVElBTElaRVIgX19hdHRyaWJ1dGVfXygob2JqY19kZXNpZ25hdGVkX2luaXRpYWxpemVyKSkKKwordm9pZCBmbmZvbyh2b2lkKSBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOyAvLyBleHBlY3RlZC1lcnJvciB7e29ubHkgYXBwbGllcyB0byBpbml0IG1ldGhvZHMgb2YgaW50ZXJmYWNlIG9yIGNsYXNzIGV4dGVuc2lvbiBkZWNsYXJhdGlvbnN9fQorCitAcHJvdG9jb2wgUDEKKy0oaWQpaW5pdCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOyAvLyBleHBlY3RlZC1lcnJvciB7e29ubHkgYXBwbGllcyB0byBpbml0IG1ldGhvZHMgb2YgaW50ZXJmYWNlIG9yIGNsYXNzIGV4dGVuc2lvbiBkZWNsYXJhdGlvbnN9fQorQGVuZAorCitfX2F0dHJpYnV0ZV9fKChvYmpjX3Jvb3RfY2xhc3MpKQorQGludGVyZmFjZSBJMQorLSh2b2lkKW1ldGggTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tvbmx5IGFwcGxpZXMgdG8gaW5pdCBtZXRob2RzIG9mIGludGVyZmFjZSBvciBjbGFzcyBleHRlbnNpb24gZGVjbGFyYXRpb25zfX0KKy0oaWQpaW5pdCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOworKyhpZClpbml0IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7IC8vIGV4cGVjdGVkLWVycm9yIHt7b25seSBhcHBsaWVzIHRvIGluaXQgbWV0aG9kcyBvZiBpbnRlcmZhY2Ugb3IgY2xhc3MgZXh0ZW5zaW9uIGRlY2xhcmF0aW9uc319CitAZW5kCisKK0BpbnRlcmZhY2UgSTEoY2F0KQorLShpZClpbml0MiBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOyAvLyBleHBlY3RlZC1lcnJvciB7e29ubHkgYXBwbGllcyB0byBpbml0IG1ldGhvZHMgb2YgaW50ZXJmYWNlIG9yIGNsYXNzIGV4dGVuc2lvbiBkZWNsYXJhdGlvbnN9fQorQGVuZAorCitAaW50ZXJmYWNlIEkxKCkKKy0oaWQpaW5pdDMgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEkxCistKHZvaWQpbWV0aCB7fQorLShpZClpbml0IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVIgeyByZXR1cm4gMDsgfSAvLyBleHBlY3RlZC1lcnJvciB7e29ubHkgYXBwbGllcyB0byBpbml0IG1ldGhvZHMgb2YgaW50ZXJmYWNlIG9yIGNsYXNzIGV4dGVuc2lvbiBkZWNsYXJhdGlvbnN9fQorKyhpZClpbml0IHsgcmV0dXJuIDA7IH0KKy0oaWQpaW5pdDMgeyByZXR1cm4gMDsgfQorLShpZClpbml0NCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSIHsgcmV0dXJuIDA7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3tvbmx5IGFwcGxpZXMgdG8gaW5pdCBtZXRob2RzIG9mIGludGVyZmFjZSBvciBjbGFzcyBleHRlbnNpb24gZGVjbGFyYXRpb25zfX0gXAorCQkJCQkJCQkJIAkJCSAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tzZWNvbmRhcnkgaW5pdGlhbGl6ZXIgbWlzc2luZyBhICdzZWxmJyBjYWxsIHRvIGFub3RoZXIgaW5pdGlhbGl6ZXJ9fQorQGVuZAorCitfX2F0dHJpYnV0ZV9fKChvYmpjX3Jvb3RfY2xhc3MpKQorQGludGVyZmFjZSBCMQorLShpZClpbml0QjEgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsgLy8gZXhwZWN0ZWQtbm90ZSA2IHt7bWV0aG9kIG1hcmtlZCBhcyBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBjbGFzcyBoZXJlfX0KKy0oaWQpaW5pdEIyOworQGVuZAorCitAaW50ZXJmYWNlIEIxKCkKKy0oaWQpaW5pdEIzIE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7IC8vIGV4cGVjdGVkLW5vdGUgNCB7e21ldGhvZCBtYXJrZWQgYXMgZGVzaWduYXRlZCBpbml0aWFsaXplciBvZiB0aGUgY2xhc3MgaGVyZX19CitAZW5kOworCitAaW1wbGVtZW50YXRpb24gQjEKKy0oaWQpaW5pdEIxIHsgcmV0dXJuIDA7IH0KKy0oaWQpaW5pdEIyIHsgcmV0dXJuIDA7IH0gLy8gZXhwZWN0ZWQtd2FybmluZyB7e3NlY29uZGFyeSBpbml0aWFsaXplciBtaXNzaW5nIGEgJ3NlbGYnIGNhbGwgdG8gYW5vdGhlciBpbml0aWFsaXplcn19CistKGlkKWluaXRCMyB7IHJldHVybiAwOyB9CitAZW5kCisKK0BpbnRlcmZhY2UgUzEgOiBCMQorLShpZClpbml0UzEgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsgLy8gZXhwZWN0ZWQtbm90ZSB7e21ldGhvZCBtYXJrZWQgYXMgZGVzaWduYXRlZCBpbml0aWFsaXplciBvZiB0aGUgY2xhc3MgaGVyZX19CistKGlkKWluaXRTMiBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOworLShpZClpbml0UzMgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7bWV0aG9kIG1hcmtlZCBhcyBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBjbGFzcyBoZXJlfX0KKy0oaWQpaW5pdEIxOworQGVuZAorCitAaW50ZXJmYWNlIFMxKCkKKy0oaWQpaW5pdFM0IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7IC8vIGV4cGVjdGVkLW5vdGUgMiB7e21ldGhvZCBtYXJrZWQgYXMgZGVzaWduYXRlZCBpbml0aWFsaXplciBvZiB0aGUgY2xhc3MgaGVyZX19CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTMQorLShpZClpbml0UzEgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZGVzaWduYXRlZCBpbml0aWFsaXplciBtaXNzaW5nIGEgJ3N1cGVyJyBjYWxsIHRvIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciBvZiB0aGUgc3VwZXIgY2xhc3N9fQorICByZXR1cm4gMDsKK30KKy0oaWQpaW5pdFMyIHsKKyAgcmV0dXJuIFtzdXBlciBpbml0QjFdOworfQorLShpZClpbml0UzMgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZGVzaWduYXRlZCBpbml0aWFsaXplciBtaXNzaW5nIGEgJ3N1cGVyJyBjYWxsIHRvIGEgZGVzaWduYXRlZCBpbml0aWFsaXplciBvZiB0aGUgc3VwZXIgY2xhc3N9fQorICByZXR1cm4gW3N1cGVyIGluaXRCMl07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tkZXNpZ25hdGVkIGluaXRpYWxpemVyIGludm9rZWQgYSBub24tZGVzaWduYXRlZCBpbml0aWFsaXplcn19Cit9CistKGlkKWluaXRTNCB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tkZXNpZ25hdGVkIGluaXRpYWxpemVyIG1pc3NpbmcgYSAnc3VwZXInIGNhbGwgdG8gYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBzdXBlciBjbGFzc319CisgIHJldHVybiBbc2VsZiBpbml0QjFdOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZGVzaWduYXRlZCBpbml0aWFsaXplciBzaG91bGQgb25seSBpbnZva2UgYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9uICdzdXBlcid9fQorfQorLShpZClpbml0QjEgeworICByZXR1cm4gW3NlbGYgaW5pdFMxXTsKK30KKy0oaWQpaW5pdEIzIHsKKyAgcmV0dXJuIFtzZWxmIGluaXRTMV07Cit9CitAZW5kCisKK0BpbnRlcmZhY2UgUzIgOiBCMQorLShpZClpbml0QjE7CitAZW5kCisKK0BpbnRlcmZhY2UgU1MyIDogUzIKKy0oaWQpaW5pdFNTMSBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOworQGVuZAorCitAaW1wbGVtZW50YXRpb24gU1MyIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2Qgb3ZlcnJpZGUgZm9yIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBzdXBlcmNsYXNzICctaW5pdEIxJyBub3QgZm91bmR9fSBcCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2Qgb3ZlcnJpZGUgZm9yIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBzdXBlcmNsYXNzICctaW5pdEIzJyBub3QgZm91bmR9fQorLShpZClpbml0U1MxIHsKKyAgcmV0dXJuIFtzdXBlciBpbml0QjFdOworfQorQGVuZAorCitAaW50ZXJmYWNlIFMzIDogQjEKKy0oaWQpaW5pdFMxIE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7IC8vIGV4cGVjdGVkLW5vdGUge3ttZXRob2QgbWFya2VkIGFzIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgb2YgdGhlIGNsYXNzIGhlcmV9fQorQGVuZAorCitAaW50ZXJmYWNlIFNTMyA6IFMzCistKGlkKWluaXRTUzEgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7bWV0aG9kIG1hcmtlZCBhcyBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBjbGFzcyBoZXJlfX0KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFNTMyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWV0aG9kIG92ZXJyaWRlIGZvciB0aGUgZGVzaWduYXRlZCBpbml0aWFsaXplciBvZiB0aGUgc3VwZXJjbGFzcyAnLWluaXRTMScgbm90IGZvdW5kfX0KKy0oaWQpaW5pdFNTMSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tkZXNpZ25hdGVkIGluaXRpYWxpemVyIG1pc3NpbmcgYSAnc3VwZXInIGNhbGwgdG8gYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBzdXBlciBjbGFzc319CisgIHJldHVybiBbc3VwZXIgaW5pdEIxXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Rlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgaW52b2tlZCBhIG5vbi1kZXNpZ25hdGVkIGluaXRpYWxpemVyfX0KK30KK0BlbmQKKworQGludGVyZmFjZSBTNCA6IEIxCistKGlkKWluaXRCMTsKKy0oaWQpaW5pdEIzOworQGVuZAorCitAaW1wbGVtZW50YXRpb24gUzQKKy0oaWQpaW5pdEIxIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Rlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgbWlzc2luZyBhICdzdXBlcicgY2FsbCB0byBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgb2YgdGhlIHN1cGVyIGNsYXNzfX0KKyAgcmV0dXJuIDA7Cit9CistKGlkKWluaXRCMyB7CisgIHJldHVybiBbc3VwZXIgaW5pdEIzXTsKK30KK0BlbmQKKworQGludGVyZmFjZSBTNSA6IEIxCistKHZvaWQpbWV0aDsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFM1CistKGlkKWluaXRCMSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tkZXNpZ25hdGVkIGluaXRpYWxpemVyIG1pc3NpbmcgYSAnc3VwZXInIGNhbGwgdG8gYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBzdXBlciBjbGFzc319CisgIHJldHVybiAwOworfQorLShpZClpbml0QjMgeworICBbc2VsZiBpbml0QjFdOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZGVzaWduYXRlZCBpbml0aWFsaXplciBzaG91bGQgb25seSBpbnZva2UgYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9uICdzdXBlcid9fQorICBTNSAqczsKKyAgW3MgaW5pdEIxXTsKKyAgW3NlbGYgbWV0aF07CisgIHZvaWQgKF5ibGspKHZvaWQpID0gXnsKKyAgICBbc2VsZiBpbml0QjFdOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZGVzaWduYXRlZCBpbml0aWFsaXplciBzaG91bGQgb25seSBpbnZva2UgYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9uICdzdXBlcid9fQorICB9OworICByZXR1cm4gW3N1cGVyIGluaXRCM107Cit9CistKHZvaWQpbWV0aCB7fQorLShpZClpbml0UzEgeworICByZXR1cm4gMDsKK30KKy0oaWQpaW5pdFMyIHsKKyAgcmV0dXJuIFtzdXBlciBpbml0QjFdOworfQorQGVuZAorCitAaW50ZXJmYWNlIFM2IDogQjEKKy0oaWQpaW5pdFMxIE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7CistKGlkKWluaXRTMjsKKy0oaWQpaW5pdFMzOworLShpZClpbml0UzQ7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTNiAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWV0aG9kIG92ZXJyaWRlIGZvciB0aGUgZGVzaWduYXRlZCBpbml0aWFsaXplciBvZiB0aGUgc3VwZXJjbGFzcyAnLWluaXRCMScgbm90IGZvdW5kfX0gXAorICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2Qgb3ZlcnJpZGUgZm9yIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBzdXBlcmNsYXNzICctaW5pdEIzJyBub3QgZm91bmR9fQorLShpZClpbml0UzEgeworICByZXR1cm4gW3N1cGVyIGluaXRCMV07Cit9CistKGlkKWluaXRTMiB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tzZWNvbmRhcnkgaW5pdGlhbGl6ZXIgbWlzc2luZyBhICdzZWxmJyBjYWxsIHRvIGFub3RoZXIgaW5pdGlhbGl6ZXJ9fQorICByZXR1cm4gW3N1cGVyIGluaXRCMV07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tzZWNvbmRhcnkgaW5pdGlhbGl6ZXIgc2hvdWxkIG5vdCBpbnZva2UgYW4gaW5pdGlhbGl6ZXIgb24gJ3N1cGVyJ319Cit9CistKGlkKWluaXRTMyB7CisgIHJldHVybiBbc2VsZiBpbml0QjFdOworfQorLShpZClpbml0UzQgeworICByZXR1cm4gW3NlbGYgaW5pdFMxXTsKK30KKy0oaWQpaW5pdFM1IHsKKyAgW3N1cGVyIGluaXRCMV07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tzZWNvbmRhcnkgaW5pdGlhbGl6ZXIgc2hvdWxkIG5vdCBpbnZva2UgYW4gaW5pdGlhbGl6ZXIgb24gJ3N1cGVyJ319CisgIHZvaWQgKF5ibGspKHZvaWQpID0gXnsKKyAgICBbc3VwZXIgaW5pdEIxXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3NlY29uZGFyeSBpbml0aWFsaXplciBzaG91bGQgbm90IGludm9rZSBhbiBpbml0aWFsaXplciBvbiAnc3VwZXInfX0KKyAgfTsKKyAgcmV0dXJuIFtzZWxmIGluaXRTMV07Cit9CistKGlkKWluaXRTNiB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tzZWNvbmRhcnkgaW5pdGlhbGl6ZXIgbWlzc2luZyBhICdzZWxmJyBjYWxsIHRvIGFub3RoZXIgaW5pdGlhbGl6ZXJ9fQorICBTNiAqczsKKyAgcmV0dXJuIFtzIGluaXRTMV07Cit9CitAZW5kCisKK0BpbnRlcmZhY2UgU1M0IDogUzQKKy0oaWQpaW5pdEIxOworQGVuZAorCitAaW1wbGVtZW50YXRpb24gU1M0CistKGlkKWluaXRCMSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tkZXNpZ25hdGVkIGluaXRpYWxpemVyIG1pc3NpbmcgYSAnc3VwZXInIGNhbGwgdG8gYSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9mIHRoZSBzdXBlciBjbGFzc319CisgIHJldHVybiAwOworfQorQGVuZAorCitAaW50ZXJmYWNlIFM3IDogQjEKKy0oaWQpaW5pdEIxOworLShpZClpbml0QjM7CistKGlkKWluaXROZXdPbmU7CitAZW5kCisKK0BpbnRlcmZhY2UgU1M3IDogUzcKKy0oaWQpaW5pdEIxOworQGVuZAorCitAaW1wbGVtZW50YXRpb24gU1M3CistKGlkKWluaXRCMSB7CisgIHJldHVybiAwOworfQorQGVuZAorCitfX2F0dHJpYnV0ZV9fKChvYmpjX3Jvb3RfY2xhc3MpKQorQGludGVyZmFjZSBCMgorLShpZClpbml0OworQGVuZAorCitAaW50ZXJmYWNlIFM4OiBCMgorLShpZClpbml0UzggTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFM4CistKGlkKWluaXRTOAoreworICByZXR1cm4gW3N1cGVyIGluaXRdOworfQorQGVuZAorCitAaW50ZXJmYWNlIFM5IDogQjEKKy0oaWQpaW5pdEIxOworLShpZClpbml0QjM7CitAZW5kCisKK0BpbnRlcmZhY2UgUzkoc2Vjb25kSW5pdCkKKy0oaWQpaW5pdE5ld09uZTsKK0BlbmQKKworQGludGVyZmFjZSBTUzkgOiBTOQorLShpZClpbml0QjE7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTUzkKKy0oaWQpaW5pdEIxIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Rlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgbWlzc2luZyBhICdzdXBlcicgY2FsbCB0byBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgb2YgdGhlIHN1cGVyIGNsYXNzfX0KKyAgcmV0dXJuIDA7Cit9CitAZW5kCisKKy8vIHJkYXI6Ly8xNjI2MTQ5NAorQGNsYXNzIEdFT1BEQW5hbHl0aWNNZXRhZGF0YTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ZvcndhcmQgZGVjbGFyYXRpb24gb2YgY2xhc3MgaGVyZX19CisKK0BpbXBsZW1lbnRhdGlvbiBHRU9QREFuYWx5dGljTWV0YWRhdGEgKFBsYWNlQ2FyZEV4dHJhcykgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYW5ub3QgZmluZCBpbnRlcmZhY2UgZGVjbGFyYXRpb24gZm9yICdHRU9QREFuYWx5dGljTWV0YWRhdGEnfX0KKy0gKGluc3RhbmNldHlwZSlpbml0SW5Qcm9jZXNzCit7CisgICAgcmV0dXJuICgodm9pZCopMCk7Cit9CitAZW5kCisKKy8vIHJkYXI6Ly8xNjMwNTQ2MAorX19hdHRyaWJ1dGVfXygob2JqY19yb290X2NsYXNzKSkKK0BpbnRlcmZhY2UgTXlPYmplY3QKKy0gKGluc3RhbmNldHlwZSlpbml0V2l0aFN0dWZmOihpZClzdHVmZiBfX2F0dHJpYnV0ZV9fKChvYmpjX2Rlc2lnbmF0ZWRfaW5pdGlhbGl6ZXIpKTsKKy0gKGluc3RhbmNldHlwZSlpbml0IF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSk7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBNeU9iamVjdAorLSAoaW5zdGFuY2V0eXBlKWluaXQKK3sKKyAgIHJldHVybiAoKHZvaWQqKTApOworfQorQGVuZAorCisvLyByZGFyOi8vMTYzMjMyMzMKK19fYXR0cmlidXRlX18oKG9iamNfcm9vdF9jbGFzcykpCitAaW50ZXJmYWNlIEI0IAorLShpZClpbml0QjQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsgCitAZW5kCisKK0BpbnRlcmZhY2UgcmRhcjE2MzIzMjMzIDogQjQKKy0oaWQpaW5pdFM0IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiByZGFyMTYzMjMyMzMKKy0oaWQpaW5pdFM0IHsKKyAgICBzdGF0aWMgaWQgc1NoYXJlZE9iamVjdCA9ICh2b2lkKikwOworICAgICh2b2lkKV4odm9pZCkgeworICAgICAgICBzU2hhcmVkT2JqZWN0ID0gW3N1cGVyIGluaXRCNF07CisgICAgfTsKKyAgICByZXR1cm4gMDsKK30KKy0oaWQpaW5pdEI0IHsKKyAgIHJldHVybiBbc2VsZiBpbml0UzRdOworfQorQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9hdHRyLW5zLWJyaWRnZWQubSBiL3Rlc3QvU2VtYU9iakMvYXR0ci1ucy1icmlkZ2VkLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjYwYTIuLjAwMDAwMDAKLS0tIGEvdGVzdC9TZW1hT2JqQy9hdHRyLW5zLWJyaWRnZWQubQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKLQotdHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygobnNfYnJpZGdlZCkpIHRlc3QwcyAqdGVzdDByZWY7Ci0KLXZvaWQgdGVzdDBmdW5jKHZvaWQpIF9fYXR0cmlidXRlX18oKG5zX2JyaWRnZWQpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snbnNfYnJpZGdlZCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3RzfX0KLQotdW5pb24gX19hdHRyaWJ1dGVfXygobnNfYnJpZGdlZCkpIHRlc3QwdTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snbnNfYnJpZGdlZCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3RzfX0KLQotc3RydWN0IF9fYXR0cmlidXRlX18oKG5zX2JyaWRnZWQoVGVzdDEpKSkgdGVzdDFzOwotCi1AY2xhc3MgVGVzdDI7Ci1zdHJ1Y3QgX19hdHRyaWJ1dGVfXygobnNfYnJpZGdlZChUZXN0MikpKSB0ZXN0MnM7Ci0KLXZvaWQgVGVzdDModm9pZCk7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KLXN0cnVjdCBfX2F0dHJpYnV0ZV9fKChuc19icmlkZ2VkKFRlc3QzKSkpIHRlc3QzczsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twYXJhbWV0ZXIgb2YgJ25zX2JyaWRnZWQnIGF0dHJpYnV0ZSBkb2VzIG5vdCBuYW1lIGFuIE9iamVjdGl2ZS1DIGNsYXNzfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvY2F0ZWdvcnktMS5tIGIvdGVzdC9TZW1hT2JqQy9jYXRlZ29yeS0xLm0KaW5kZXggMThiODcyYS4uODlhYzU1MCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9jYXRlZ29yeS0xLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9jYXRlZ29yeS0xLm0KQEAgLTIsNyArMiw4IEBACiAKIEBpbnRlcmZhY2UgTXlDbGFzczEgQGVuZAogCi1AcHJvdG9jb2wgcDEscDIscDM7CitAcHJvdG9jb2wgcDEscDIscDM7IC8vIGV4cGVjdGVkLW5vdGUge3twcm90b2NvbCAncDEnIGhhcyBubyBkZWZpbml0aW9ufX0gXAorICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7cHJvdG9jb2wgJ3AyJyBoYXMgbm8gZGVmaW5pdGlvbn19CiAKIEBpbnRlcmZhY2UgTXlDbGFzczEgKENhdGVnb3J5MSkgIDxwMT4gLy8gZXhwZWN0ZWQtd2FybmluZyB7e2Nhbm5vdCBmaW5kIHByb3RvY29sIGRlZmluaXRpb24gZm9yICdwMSd9fSBleHBlY3RlZC1ub3RlIHt7cHJldmlvdXMgZGVmaW5pdGlvbiBpcyBoZXJlfX0KIEBlbmQKQEAgLTY1LDEzICs2NiwxMyBAQAogLSh2b2lkKSBpbTA7IC8vIGV4cGVjdGVkLW5vdGUge3ttZXRob2QgJ2ltMCcgZGVjbGFyZWQgaGVyZX19CiBAZW5kCiAKLUBpbnRlcmZhY2UgTXVsdGlwbGVDYXRfSSBAZW5kIC8vIGV4cGVjdGVkLW5vdGUge3tyZXF1aXJlZCBmb3IgZGlyZWN0IG9yIGluZGlyZWN0IHByb3RvY29sICdNdWx0aXBsZUNhdF9QJ319CitAaW50ZXJmYWNlIE11bHRpcGxlQ2F0X0kgQGVuZAogCiBAaW50ZXJmYWNlIE11bHRpcGxlQ2F0X0koKSAgQGVuZAogCiBAaW50ZXJmYWNlIE11bHRpcGxlQ2F0X0koKSA8TXVsdGlwbGVDYXRfUD4gIEBlbmQKIAotQGltcGxlbWVudGF0aW9uIE11bHRpcGxlQ2F0X0kgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21ldGhvZCAnaW0wJyBpbiBwcm90b2NvbCBub3QgaW1wbGVtZW50ZWR9fQorQGltcGxlbWVudGF0aW9uIE11bHRpcGxlQ2F0X0kgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21ldGhvZCAnaW0wJyBpbiBwcm90b2NvbCAnTXVsdGlwbGVDYXRfUCcgbm90IGltcGxlbWVudGVkfX0KIEBlbmQKIAogLy8gPHJkYXI6Ly9wcm9ibGVtLzc2ODAzOTE+IC0gSGFuZGxlIG5hbWVsZXNzIGNhdGVnb3JpZXMgd2l0aCBubyBuYW1lIHRoYXQgcmVmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvY2hlY2stb2JqY2JyaWRnZS1yZWxhdGVkLWF0dHJpYnV0ZS1sb29rdXAubSBiL3Rlc3QvU2VtYU9iakMvY2hlY2stb2JqY2JyaWRnZS1yZWxhdGVkLWF0dHJpYnV0ZS1sb29rdXAubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWI2NmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hT2JqQy9jaGVjay1vYmpjYnJpZGdlLXJlbGF0ZWQtYXR0cmlidXRlLWxvb2t1cC5tCkBAIC0wLDAgKzEsNDEgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC14IG9iamVjdGl2ZS1jIC12ZXJpZnkgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKKy8vIHJkYXI6Ly8xNTQ5OTExMQorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZV9yZWxhdGVkKE5TQ29sb3IsY29sb3JYV2l0aENHQ29sb3I6LENYR0NvbG9yKSkpIENHQ29sb3IgKkNHQ29sb3JSZWY7IC8vIGV4cGVjdGVkLW5vdGUgMiB7e2RlY2xhcmVkIGhlcmV9fQorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZV9yZWxhdGVkKFhOU0NvbG9yLGNvbG9yV2l0aENHQ29sb3I6LENHQ29sb3IpKSkgQ0dDb2xvcjEgKkNHQ29sb3JSZWYxOyAvLyBleHBlY3RlZC1ub3RlIDIge3tkZWNsYXJlZCBoZXJlfX0KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2VfcmVsYXRlZChQTnNDb2xvcixjb2xvcldpdGhDR0NvbG9yOixDR0NvbG9yKSkpIENHQ29sb3IyICpDR0NvbG9yUmVmMjsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7ZGVjbGFyZWQgaGVyZX19CisKK0BpbnRlcmZhY2UgTlNDb2xvcgorKyAoTlNDb2xvciAqKWNvbG9yV2l0aENHQ29sb3I6KENHQ29sb3JSZWYpY2dDb2xvcjsKKy0gKENHQ29sb3JSZWYpQ0dDb2xvcjsKK0BlbmQKKworQGludGVyZmFjZSBOU1RleHRGaWVsZCAKKy0gKHZvaWQpc2V0QmFja2dyb3VuZENvbG9yOihOU0NvbG9yICopY29sb3I7CistIChOU0NvbG9yICopYmFja2dyb3VuZENvbG9yOworQGVuZAorCit0eXBlZGVmIGludCBQTnNDb2xvcjsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7ZGVjbGFyZWQgaGVyZX19CisKK05TQ29sb3IgKiBUZXN0MShOU1RleHRGaWVsZCAqdGV4dEZpZWxkLCBDR0NvbG9yUmVmIG5ld0NvbG9yKSB7CisgdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvciA9IG5ld0NvbG9yOyAvLyBleHBlY3RlZC1lcnJvciB7eydDR0NvbG9yUmVmJyAoYWthICdzdHJ1Y3QgQ0dDb2xvciAqJykgbXVzdCBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCB0byAnTlNDb2xvciAqJzsgdXNlICcrY29sb3JYV2l0aENHQ29sb3I6JyBtZXRob2QgZm9yIHRoaXMgY29udmVyc2lvbn19IFwKKwkJCQkJLy8gZXhwZWN0ZWQtd2FybmluZyB7e2luY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzIGFzc2lnbmluZyB0byAnTlNDb2xvciAqJyBmcm9tICdDR0NvbG9yUmVmJyAoYWthICdzdHJ1Y3QgQ0dDb2xvciAqJyl9fQorIG5ld0NvbG9yID0gdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvcjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snTlNDb2xvciAqJyBtdXN0IGJlIGV4cGxpY2l0bHkgY29udmVydGVkIHRvICdDR0NvbG9yUmVmJyAoYWthICdzdHJ1Y3QgQ0dDb2xvciAqJyk7IHVzZSAnLUNYR0NvbG9yJyBtZXRob2QgZm9yIHRoaXMgY29udmVyc2lvbn19IFwKKwkJCQkJLy8gZXhwZWN0ZWQtd2FybmluZyB7e2luY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzIGFzc2lnbmluZyB0byAnQ0dDb2xvclJlZicgKGFrYSAnc3RydWN0IENHQ29sb3IgKicpIGZyb20gJ05TQ29sb3IgKid9fQorfQorTlNDb2xvciAqIFRlc3QyKE5TVGV4dEZpZWxkICp0ZXh0RmllbGQsIENHQ29sb3JSZWYxIG5ld0NvbG9yKSB7CisgdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvciA9IG5ld0NvbG9yOyAvLyBleHBlY3RlZC1lcnJvciB7e2NvdWxkIG5vdCBmaW5kIE9iamVjdGl2ZS1DIGNsYXNzICdYTlNDb2xvcicgdG8gY29udmVydCAnQ0dDb2xvclJlZjEnIChha2EgJ3N0cnVjdCBDR0NvbG9yMSAqJykgdG8gJ05TQ29sb3IgKid9fSBcCisJCQkJICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcyBhc3NpZ25pbmcgdG8gJ05TQ29sb3IgKicgZnJvbSAnQ0dDb2xvclJlZjEnIChha2EgJ3N0cnVjdCBDR0NvbG9yMSAqJyl9fQorIG5ld0NvbG9yID0gdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvciA7IC8vIGV4cGVjdGVkLWVycm9yIHt7Y291bGQgbm90IGZpbmQgT2JqZWN0aXZlLUMgY2xhc3MgJ1hOU0NvbG9yJyB0byBjb252ZXJ0ICdOU0NvbG9yIConIHRvICdDR0NvbG9yUmVmMScgKGFrYSAnc3RydWN0IENHQ29sb3IxIConKX19IFwKKwkJCQkJLy8gZXhwZWN0ZWQtd2FybmluZyB7e2luY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzIGFzc2lnbmluZyB0byAnQ0dDb2xvclJlZjEnIChha2EgJ3N0cnVjdCBDR0NvbG9yMSAqJykgZnJvbSAnTlNDb2xvciAqJ319Cit9CisKK05TQ29sb3IgKiBUZXN0MyhOU1RleHRGaWVsZCAqdGV4dEZpZWxkLCBDR0NvbG9yUmVmMiBuZXdDb2xvcikgeworIHRleHRGaWVsZC5iYWNrZ3JvdW5kQ29sb3IgPSBuZXdDb2xvcjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snUE5zQ29sb3InIG11c3QgYmUgbmFtZSBvZiBhbiBPYmplY3RpdmUtQyBjbGFzcyB0byBiZSBhYmxlIHRvIGNvbnZlcnQgJ0NHQ29sb3JSZWYyJyAoYWthICdzdHJ1Y3QgQ0dDb2xvcjIgKicpIHRvICdOU0NvbG9yIConfX0gXAorCQkJCQkvLyBleHBlY3RlZC13YXJuaW5nIHt7aW5jb21wYXRpYmxlIHBvaW50ZXIgdHlwZXMgYXNzaWduaW5nIHRvICdOU0NvbG9yIConIGZyb20gJ0NHQ29sb3JSZWYyJyAoYWthICdzdHJ1Y3QgQ0dDb2xvcjIgKicpfX0KKyBuZXdDb2xvciA9IHRleHRGaWVsZC5iYWNrZ3JvdW5kQ29sb3I7IC8vIGV4cGVjdGVkLWVycm9yIHt7J1BOc0NvbG9yJyBtdXN0IGJlIG5hbWUgb2YgYW4gT2JqZWN0aXZlLUMgY2xhc3MgdG8gYmUgYWJsZSB0byBjb252ZXJ0ICdOU0NvbG9yIConIHRvICdDR0NvbG9yUmVmMicgKGFrYSAnc3RydWN0IENHQ29sb3IyIConKX19IFwKKwkJCQkJLy8gZXhwZWN0ZWQtd2FybmluZyB7e2luY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzIGFzc2lnbmluZyB0byAnQ0dDb2xvclJlZjInIChha2EgJ3N0cnVjdCBDR0NvbG9yMiAqJykgZnJvbSAnTlNDb2xvciAqJ319Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvY2xhc3MtZGVmLXRlc3QtMS5tIGIvdGVzdC9TZW1hT2JqQy9jbGFzcy1kZWYtdGVzdC0xLm0KaW5kZXggNzkzMWNjMy4uOThhODg3ZSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9jbGFzcy1kZWYtdGVzdC0xLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9jbGFzcy1kZWYtdGVzdC0xLm0KQEAgLTEsNiArMSw2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1Xbm8tb2JqYy1yb290LWNsYXNzICVzCiAKLUBwcm90b2NvbCBTVVBFUjsKK0Bwcm90b2NvbCBTVVBFUjsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Byb3RvY29sICdTVVBFUicgaGFzIG5vIGRlZmluaXRpb259fQogCiBAaW50ZXJmYWNlIFNVUEVSIDxTVVBFUj4gQGVuZCAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGZpbmQgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IgJ1NVUEVSJ319CiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvY2xhc3MtZXh0ZW5zaW9uLWR1cC1tZXRob2RzLm0gYi90ZXN0L1NlbWFPYmpDL2NsYXNzLWV4dGVuc2lvbi1kdXAtbWV0aG9kcy5tCmluZGV4IDY5MmZmOGMuLjVmNDYzYWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvY2xhc3MtZXh0ZW5zaW9uLWR1cC1tZXRob2RzLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9jbGFzcy1leHRlbnNpb24tZHVwLW1ldGhvZHMubQpAQCAtMTMsMyArMTMsMTYgQEAKICsgKGludCkgIEluc3RNZXRoOwogLSAoaW50KSBPSzsKIEBlbmQKKworLy8gcmRhcjovLzE2MzEyMTA1CitAY2xhc3MgTlNPYmplY3Q7CisKK19fYXR0cmlidXRlX18oKG9iamNfcm9vdF9jbGFzcykpIEBpbnRlcmZhY2UgQXBwRGVsZWdhdGUKKysgKHZvaWQpc29tZU1ldGhvZFdpdGhBcmd1bWVudDooTlNPYmplY3QgKilhcmd1bWVudDsKKysgKHZvaWQpc29tZU1ldGhvZFdpdGhBcmd1bWVudDooTlNPYmplY3QgKilhcmd1bWVudCA6IChOU09iamVjdCopIGFyZ3VtZW50MjsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzIGRlY2xhcmF0aW9uIGlzIGhlcmV9fQorQGVuZAorCitAaW50ZXJmYWNlIEFwcERlbGVnYXRlICgpCistICh2b2lkKXNvbWVNZXRob2RXaXRoQXJndW1lbnQ6KGZsb2F0KWFyZ3VtZW50OyAvLyBPSy4gTm8gd2FybmluZyB0byBiZSBpc3N1ZWQgaGVyZS4KKysgKHZvaWQpc29tZU1ldGhvZFdpdGhBcmd1bWVudDooZmxvYXQpYXJndW1lbnQgOiAoZmxvYXQpYXJndW1lbnQyOyAvLyBleHBlY3RlZC1lcnJvciB7e2R1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiBtZXRob2QgJ3NvbWVNZXRob2RXaXRoQXJndW1lbnQ6Oid9fQorQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9jbGFzcy1wcm90by0xLm0gYi90ZXN0L1NlbWFPYmpDL2NsYXNzLXByb3RvLTEubQppbmRleCAwMmM0MGFhLi41MWE4OTkzIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL2NsYXNzLXByb3RvLTEubQorKysgYi90ZXN0L1NlbWFPYmpDL2NsYXNzLXByb3RvLTEubQpAQCAtMiw3ICsyLDggQEAKIAogQGludGVyZmFjZSBJTlRGMSBAZW5kCiAKLUBwcm90b2NvbCBwMSxwMixwMzsKK0Bwcm90b2NvbCBwMSxwMixwMzsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Byb3RvY29sICdwMicgaGFzIG5vIGRlZmluaXRpb259fSBcCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3twcm90b2NvbCAncDMnIGhhcyBubyBkZWZpbml0aW9ufX0KIAogQHByb3RvY29sIHAxOwogCkBAIC0zNCwzICszNSwxNCBAQAogCiBAaW50ZXJmYWNlIEk0IDogVTIgPHAxLHAyPgogQGVuZAorCisvLyByZGFyOi8vMTYxMTExODIKK0BpbnRlcmZhY2UgTlNPYmplY3QgQGVuZAorCitAcHJvdG9jb2wgVW5kZWZpbmVkUGFyZW50UHJvdG9jb2w7IC8vIGV4cGVjdGVkLW5vdGUge3twcm90b2NvbCAnVW5kZWZpbmVkUGFyZW50UHJvdG9jb2wnIGhhcyBubyBkZWZpbml0aW9ufX0KKworQHByb3RvY29sIFVuZGVmaW5lZFByb3RvY29sIDxVbmRlZmluZWRQYXJlbnRQcm90b2NvbD4KK0BlbmQKKworQGludGVyZmFjZSBTb21lT2JqZWN0IDogTlNPYmplY3QgPFVuZGVmaW5lZFByb3RvY29sPiAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGZpbmQgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IgJ1VuZGVmaW5lZFByb3RvY29sJ319CitAZW5kCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL2NsYXNzLXVuYXZhaWwtd2FybmluZy5tIGIvdGVzdC9TZW1hT2JqQy9jbGFzcy11bmF2YWlsLXdhcm5pbmcubQppbmRleCBiMmJkMzg4Li5hMzM3Yzk3IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL2NsYXNzLXVuYXZhaWwtd2FybmluZy5tCisrKyBiL3Rlc3QvU2VtYU9iakMvY2xhc3MtdW5hdmFpbC13YXJuaW5nLm0KQEAgLTIsNyArMiw3IEBACiAvLyByZGFyOi8vOTA5MjIwOAogCiBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSgibm90IGF2YWlsYWJsZSIpKSkKLUBpbnRlcmZhY2UgTXlDbGFzcyB7IC8vIGV4cGVjdGVkLW5vdGUgOCB7e2RlY2xhcmF0aW9uIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQorQGludGVyZmFjZSBNeUNsYXNzIHsgLy8gZXhwZWN0ZWQtbm90ZSA4IHt7J015Q2xhc3MnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQogQHB1YmxpYwogICAgIHZvaWQgKl90ZXN0OwogICAgIE15Q2xhc3MgKml2YXI7IC8vIG5vIGVycm9yLgpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9jb21wYXJlLXF1YWxpZmllZC1jbGFzcy5tIGIvdGVzdC9TZW1hT2JqQy9jb21wYXJlLXF1YWxpZmllZC1jbGFzcy5tCmluZGV4IDBmNDE1YjYuLjYwZWY4NTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvY29tcGFyZS1xdWFsaWZpZWQtY2xhc3MubQorKysgYi90ZXN0L1NlbWFPYmpDL2NvbXBhcmUtcXVhbGlmaWVkLWNsYXNzLm0KQEAgLTI1LDYgKzI1LDYgQEAKICAgICAKICAgICByZXR1cm4gY2xhc3NBID09IGNsYXNzQiAgfHwgY2xhc3NBID09IGNsYXNzQyB8fAogICAgICAgICAgICBjbGFzc0MgPT0gY2xhc3NBIHx8Ci0gICAgICAgICAgIGNsYXNzQSA9PSBjbGFzc0Q7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjb21wYXJpc29uIG9mIGRpc3RpbmN0IHBvaW50ZXIgdHlwZXMgKCdDbGFzczxTb21lUHJvdG9jb2w+IConIGFuZCAnQ2xhc3M8U29tZVByb3RvY29sMT4gKicpfX0KKyAgICAgICAgICAgY2xhc3NBID09IGNsYXNzRDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NvbXBhcmlzb24gb2YgZGlzdGluY3QgcG9pbnRlciB0eXBlcyAoJ0NsYXNzPFNvbWVQcm90b2NvbD4nIGFuZCAnQ2xhc3M8U29tZVByb3RvY29sMT4nKX19CiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvY29tcGFyZS1xdWFsaWZpZWQtaWQubSBiL3Rlc3QvU2VtYU9iakMvY29tcGFyZS1xdWFsaWZpZWQtaWQubQppbmRleCAwMmZhODZlLi43ZGE3NzQ5IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL2NvbXBhcmUtcXVhbGlmaWVkLWlkLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9jb21wYXJlLXF1YWxpZmllZC1pZC5tCkBAIC0xNSw3ICsxNSw3IEBACiBAaW50ZXJmYWNlIE5TTXV0YWJsZURpY3Rpb25hcnkgOiBOU0RpY3Rpb25hcnkgIC0gKHZvaWQpcmVtb3ZlT2JqZWN0Rm9yS2V5OihpZClhS2V5OyBAZW5kIC8vIGV4cGVjdGVkLW5vdGUge3tyZWNlaXZlciBpcyBpbnN0YW5jZSBvZiBjbGFzcyBkZWNsYXJlZCBoZXJlfX0KIGV4dGVybiBOU1N0cmluZyAqIGNvbnN0IE5TVGFza0RpZFRlcm1pbmF0ZU5vdGlmaWNhdGlvbjsKIAotQGludGVyZmFjZSBYQ1Byb3BlcnR5RXhwYW5zaW9uQ29udGV4dCA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+IHsgLy8gZXhwZWN0ZWQtbm90ZSB7e3JlcXVpcmVkIGZvciBkaXJlY3Qgb3IgaW5kaXJlY3QgcHJvdG9jb2wgJ05TQ29weWluZyd9fQorQGludGVyZmFjZSBYQ1Byb3BlcnR5RXhwYW5zaW9uQ29udGV4dCA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+IHsKICAgTlNNdXRhYmxlRGljdGlvbmFyeSAqIF9wcm9wTmFtZXNUb1Byb3BWYWx1ZXNDYWNoZTsKIH0gQGVuZAogCkBAIC0yMyw3ICsyMyw3IEBACiAtIChOU1N0cmluZyAqKWV2YWx1YXRlQXNTdHJpbmdJbkNvbnRleHQ6KFhDUHJvcGVydHlFeHBhbnNpb25Db250ZXh0ICopY29udGV4dCB3aXRoTmVzdGluZ1N0YXRlOihjb25zdCB2b2lkICopc3RhdGU7CiBAZW5kCiAKLUBpbXBsZW1lbnRhdGlvbiBYQ1Byb3BlcnR5RXhwYW5zaW9uQ29udGV4dCAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWV0aG9kICdjb3B5V2l0aFpvbmU6JyBpbiBwcm90b2NvbCBub3QgaW1wbGVtZW50ZWR9fQorQGltcGxlbWVudGF0aW9uIFhDUHJvcGVydHlFeHBhbnNpb25Db250ZXh0IC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2QgJ2NvcHlXaXRoWm9uZTonIGluIHByb3RvY29sICdOU0NvcHlpbmcnIG5vdCBpbXBsZW1lbnRlZH19CiAtIChOU1N0cmluZyAqKWV4cGFuZGVkVmFsdWVGb3JQcm9wZXJ0eTooTlNTdHJpbmcgKilwcm9wZXJ0eSB7CiAgIGlkIDxYQ1Byb3BlcnR5VmFsdWVzPiBjYWNoZWRWYWx1ZU5vZGUgPSBbX3Byb3BOYW1lc1RvUHJvcFZhbHVlc0NhY2hlIG9iamVjdEZvcktleTpwcm9wZXJ0eV07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2QgJy1vYmplY3RGb3JLZXk6JyBub3QgZm91bmQgKHJldHVybiB0eXBlIGRlZmF1bHRzIHRvICdpZCcpfX0KICAgaWYgKGNhY2hlZFZhbHVlTm9kZSA9PSAoKHZvaWQgKikwKSkgeyB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL2NvbnRpbnVhdGlvbi1jbGFzcy1wcm9wZXJ0eS5tIGIvdGVzdC9TZW1hT2JqQy9jb250aW51YXRpb24tY2xhc3MtcHJvcGVydHkubQppbmRleCAyYThlNTA4Li44M2FhNzk2IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL2NvbnRpbnVhdGlvbi1jbGFzcy1wcm9wZXJ0eS5tCisrKyBiL3Rlc3QvU2VtYU9iakMvY29udGludWF0aW9uLWNsYXNzLXByb3BlcnR5Lm0KQEAgLTYxLDMgKzYxLDE1IEBACiBAcHJvcGVydHkgKG5vbmF0b21pYywgcmVhZHdyaXRlLCBhc3NpZ24pIHN0cnVjdCBTMSAqaHR0cFJlcXVlc3QzOwogQHByb3BlcnR5IChub25hdG9taWMsIHJlYWR3cml0ZSwgYXNzaWduKSBzdHJ1Y3QgUzIgKmh0dHBSZXF1ZXN0NDsKIEBlbmQKKworLy8gcmRhcjovLzE1ODU5ODYyCitAcHJvdG9jb2wgQURDYW1lcmFKU09fQmluZGluZ3MKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCByZWFkb25seSkgTlNTdHJpbmcgKmN1cnJlbnRQaWN0dXJlVVJJOworQGVuZAorCitAaW50ZXJmYWNlIEFEQ2FtZXJhSlNPCitAZW5kCisKK0BpbnRlcmZhY2UgQURDYW1lcmFKU08oKSAgPEFEQ2FtZXJhSlNPX0JpbmRpbmdzPgorQHByb3BlcnR5IChub25hdG9taWMsIGNvcHkpIE5TU3RyaW5nICpjdXJyZW50UGljdHVyZVVSSTsKK0BlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvZGVhbGxvYy5tIGIvdGVzdC9TZW1hT2JqQy9kZWFsbG9jLm0KaW5kZXggNTkyMThkMi4uYzFiZDBiNSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9kZWFsbG9jLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9kZWFsbG9jLm0KQEAgLTEsNSArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTEgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC1mYmxvY2tzIC12ZXJpZnkgJXMKLS8vIFJVTjogbm90ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTEgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC1mYmxvY2tzIC1mZGlhZ25vc3RpY3MtcGFyc2VhYmxlLWZpeGl0cyAlcyAyPiYxIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTEgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC1mYmxvY2tzIC1XZGVhbGxvYy1pbi1jYXRlZ29yeSAtdmVyaWZ5ICVzCisvLyBSVU46IG5vdCAlY2xhbmdfY2MxIC10cmlwbGUgeDg2XzY0LWFwcGxlLWRhcndpbjExIC1mc3ludGF4LW9ubHkgLWZvYmpjLWFyYyAtZmJsb2NrcyAtV2RlYWxsb2MtaW4tY2F0ZWdvcnkgLWZkaWFnbm9zdGljcy1wYXJzZWFibGUtZml4aXRzICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMKIC8vIHJkYXI6Ly8xMTk4NzgzOAogCiBAcHJvdG9jb2wgTlNPYmplY3QKQEAgLTIzLDMgKzIzLDMzIEBACiAKIEBlbmQKIAorLy8gcmRhcjovLzE1Mzk3NDMwCitAaW50ZXJmYWNlIEJhc2UKKy0gKHZvaWQpZGVhbGxvYzsKK0BlbmQKKworQGludGVyZmFjZSBTdWJjbGFzcyA6IEJhc2UKK0BlbmQgCisKK0BpbnRlcmZhY2UgU3ViY2xhc3MgKENBVCkKKy0gKHZvaWQpZGVhbGxvYzsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFN1YmNsYXNzIChDQVQpCistICh2b2lkKWRlYWxsb2MgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7LWRlYWxsb2MgaXMgYmVpbmcgb3ZlcnJpZGRlbiBpbiBhIGNhdGVnb3J5fX0KK30KK0BlbmQKKworLy8gcmRhcjovLzE1OTE5Nzc1CitAaW50ZXJmYWNlIE5TT2JqZWN0IEBlbmQKK0BpbnRlcmZhY2UgTlNFcnJvcjpOU09iamVjdAorQGVuZAorCitAaW50ZXJmYWNlIE5TRXJyb3IoQ0FUKQorLSAoTlNFcnJvciAqKU1DQ29weUFzUHJpbWFyeUVycm9yIF9fYXR0cmlidXRlX18oKG9iamNfbWV0aG9kX2ZhbWlseShuZXcpKSk7CitAZW5kCitAaW1wbGVtZW50YXRpb24gTlNFcnJvcihDQVQpCistIChOU0Vycm9yICopTUNDb3B5QXNQcmltYXJ5RXJyb3IgeworICByZXR1cm4gMDsKK30KK0BlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvZGVmYXVsdC1zeW50aGVzaXplLTMubSBiL3Rlc3QvU2VtYU9iakMvZGVmYXVsdC1zeW50aGVzaXplLTMubQppbmRleCAxYzMyNjY1Li5jOTE1OTc0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL2RlZmF1bHQtc3ludGhlc2l6ZS0zLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9kZWZhdWx0LXN5bnRoZXNpemUtMy5tCkBAIC0zNyw3ICszNyw3IEBACiBAaW50ZXJmYWNlIERlZXAoQ0FUKSAgLy8gZXhwZWN0ZWQtZXJyb3Ige3thdHRyaWJ1dGVzIG1heSBub3QgYmUgc3BlY2lmaWVkIG9uIGEgY2F0ZWdvcnl9fQogQGVuZAogCi1fX2F0dHJpYnV0ZSAoKG9iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMpKSAvLyBleHBlY3RlZC1lcnJvciB7e29iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMgYXR0cmlidXRlIG1heSBvbmx5IGJlIHNwZWNpZmllZCBvbiBhIGNsYXNzfX0gCitfX2F0dHJpYnV0ZSAoKG9iamNfcmVxdWlyZXNfcHJvcGVydHlfZGVmaW5pdGlvbnMpKSAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX3JlcXVpcmVzX3Byb3BlcnR5X2RlZmluaXRpb25zJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIE9iamVjdGl2ZS1DIGludGVyZmFjZXN9fQogQHByb3RvY29sIFAgQGVuZAogCiAvLyByZGFyOi8vMTMzODg1MDMKQEAgLTE3MiwxMiArMTcyLDQ0IEBACiBAaW50ZXJmYWNlIE9rYXkgOiBOU09iamVjdDxGb29pbmc+CiBAZW5kCiAKLUBpbXBsZW1lbnRhdGlvbiBPa2F5IC8vIGV4cGVjdGVkLXdhcm5pbmcgMiB7e2F1dG8gcHJvcGVydHkgc3ludGhlc2lzIHdpbGwgbm90IHN5bnRoZXNpemUgcHJvcGVydHkgZGVjbGFyZWQgaW4gYSBwcm90b2NvbH19CitAaW1wbGVtZW50YXRpb24gT2theSAvLyBleHBlY3RlZC13YXJuaW5nIHt7YXV0byBwcm9wZXJ0eSBzeW50aGVzaXMgd2lsbCBub3Qgc3ludGhlc2l6ZSBwcm9wZXJ0eSAnbXVhaGFoYWhhJyBkZWNsYXJlZCBpbiBwcm90b2NvbCAnRm9vaW5nJ319IGV4cGVjdGVkLXdhcm5pbmcge3thdXRvIHByb3BlcnR5IHN5bnRoZXNpcyB3aWxsIG5vdCBzeW50aGVzaXplIHByb3BlcnR5ICdob2hvJyBkZWNsYXJlZCBpbiBwcm90b2NvbCAnU3ViRm9vbGluZyd9fQogQGVuZAogCiBAaW50ZXJmYWNlIEZhaWwgOiBGb29PYmplY3QKIEBlbmQKIAotQGltcGxlbWVudGF0aW9uIEZhaWwgLy8gZXhwZWN0ZWQtd2FybmluZyAyIHt7YXV0byBwcm9wZXJ0eSBzeW50aGVzaXMgd2lsbCBub3Qgc3ludGhlc2l6ZSBwcm9wZXJ0eSBkZWNsYXJlZCBpbiBhIHByb3RvY29sfX0KK0BpbXBsZW1lbnRhdGlvbiBGYWlsIC8vIGV4cGVjdGVkLXdhcm5pbmcge3thdXRvIHByb3BlcnR5IHN5bnRoZXNpcyB3aWxsIG5vdCBzeW50aGVzaXplIHByb3BlcnR5ICdtdWFoYWhhaGEnIGRlY2xhcmVkIGluIHByb3RvY29sICdGb29pbmcnfX0gZXhwZWN0ZWQtd2FybmluZyB7e2F1dG8gcHJvcGVydHkgc3ludGhlc2lzIHdpbGwgbm90IHN5bnRoZXNpemUgcHJvcGVydHkgJ2hvaG8nIGRlY2xhcmVkIGluIHByb3RvY29sICdTdWJGb29saW5nJ319CiBAZW5kCiAKKy8vIHJkYXI6Ly8xNjA4OTE5MQorQGNsYXNzIE5TVVJMOworCitAaW50ZXJmYWNlIFJvb3QKKy0gKHZvaWQpc2V0RmlsZVVSTCA6IChOU1VSTCAqKSBhcmc7CistICh2b2lkKXNldEZpbGUgOiAoTlNVUkwgKikgYXJnOworLSAoTlNVUkwgKilmaWxlU3lzOworLSAodm9pZClzZXRGaWxlU3lzIDogKE5TVVJMICopIGFyZzsKKy0gKE5TVVJMICopZmlsZUtlcmw7CitAZW5kCisKK0BpbnRlcmZhY2UgU3VwZXJDbGFzcyA6IFJvb3QKKy0gKE5TVVJMICopZmlsZVVSTDsKKy0gKE5TVVJMICopZmlsZTsKKy0gKE5TVVJMICopZmlsZUxvZzsKKy0gKHZvaWQpc2V0RmlsZUxvZyA6IChOU1VSTCAqKSBhcmc7CistICh2b2lkKXNldEZpbGVLZXJsIDogKE5TVVJMICopIGFyZzsKK0BlbmQKKworQHByb3RvY29sIHIxNjA4OTE5MVByb3RvY29sCitAcHJvcGVydHkgKHJlYWRvbmx5KSBOU1VSTCAqZmlsZVVSTDsKK0Bwcm9wZXJ0eSAoY29weSkgTlNVUkwgKmZpbGU7CitAcHJvcGVydHkgKGNvcHkpIE5TVVJMICpmaWxlU3lzOworQHByb3BlcnR5IChjb3B5KSBOU1VSTCAqZmlsZUxvZzsKK0Bwcm9wZXJ0eSAoY29weSkgTlNVUkwgKmZpbGVLZXJsOworQGVuZAorCitAaW50ZXJmYWNlIFN1YkNsYXNzIDogU3VwZXJDbGFzcyA8cjE2MDg5MTkxUHJvdG9jb2w+CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTdWJDbGFzcworQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9kZWZhdWx0LXN5bnRoZXNpemUubSBiL3Rlc3QvU2VtYU9iakMvZGVmYXVsdC1zeW50aGVzaXplLm0KaW5kZXggZGQxNmMxMy4uOTM1NmI5ZiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9kZWZhdWx0LXN5bnRoZXNpemUubQorKysgYi90ZXN0L1NlbWFPYmpDL2RlZmF1bHQtc3ludGhlc2l6ZS5tCkBAIC0xMzYsNSArMTM2LDUgQEAKIEBpbnRlcmZhY2UgTXlDbGFzcyA8TXlQcm90b2NvbD4gCiBAZW5kCiAgCi1AaW1wbGVtZW50YXRpb24gTXlDbGFzcyAvLyBleHBlY3RlZC13YXJuaW5nIHt7YXV0byBwcm9wZXJ0eSBzeW50aGVzaXMgd2lsbCBub3Qgc3ludGhlc2l6ZSBwcm9wZXJ0eSBkZWNsYXJlZCBpbiBhIHByb3RvY29sfX0KK0BpbXBsZW1lbnRhdGlvbiBNeUNsYXNzIC8vIGV4cGVjdGVkLXdhcm5pbmcge3thdXRvIHByb3BlcnR5IHN5bnRoZXNpcyB3aWxsIG5vdCBzeW50aGVzaXplIHByb3BlcnR5ICdyZXF1aXJlZFN0cmluZycgZGVjbGFyZWQgaW4gcHJvdG9jb2wgJ015UHJvdG9jb2wnfX0KIEBlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvZm9ybWF0LWFyZy1hdHRyaWJ1dGUubSBiL3Rlc3QvU2VtYU9iakMvZm9ybWF0LWFyZy1hdHRyaWJ1dGUubQppbmRleCBlNzcwMzczLi43OWY1NjU2IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL2Zvcm1hdC1hcmctYXR0cmlidXRlLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9mb3JtYXQtYXJnLWF0dHJpYnV0ZS5tCkBAIC0xLDQgKzEsNCBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1XZXJyb3IgLVdmb3JtYXQtbm9ubGl0ZXJhbCAtdmVyaWZ5IC1mc3ludGF4LW9ubHkgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mc3ludGF4LW9ubHkgJXMKIAogQGNsYXNzIE5TU3RyaW5nOwogCkBAIC05LDkgKzksOSBAQAogZXh0ZXJuIHZvaWQgZmMyIChjb25zdCBOU1N0cmluZyAqKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXRfYXJnKCkpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snZm9ybWF0X2FyZycgYXR0cmlidXRlIHRha2VzIG9uZSBhcmd1bWVudH19CiBleHRlcm4gdm9pZCBmYzMgKGNvbnN0IE5TU3RyaW5nICopIF9fYXR0cmlidXRlX18oKGZvcm1hdF9hcmcoMSwgMikpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snZm9ybWF0X2FyZycgYXR0cmlidXRlIHRha2VzIG9uZSBhcmd1bWVudH19CiAKLXN0cnVjdCBzMSB7IGludCBpOyB9IF9fYXR0cmlidXRlX18oKGZvcm1hdF9hcmcoMSkpKTsgIC8vIGV4cGVjdGVkLWVycm9yIHt7J2Zvcm1hdF9hcmcnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zfX0KLXVuaW9uIHUxIHsgaW50IGk7IH0gX19hdHRyaWJ1dGVfXygoZm9ybWF0X2FyZygxKSkpOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snZm9ybWF0X2FyZycgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQotZW51bSBlMSB7IEUxVjAgfSBfX2F0dHJpYnV0ZV9fKChmb3JtYXRfYXJnKDEpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J2Zvcm1hdF9hcmcnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zfX0KK3N0cnVjdCBzMSB7IGludCBpOyB9IF9fYXR0cmlidXRlX18oKGZvcm1hdF9hcmcoMSkpKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZm9ybWF0X2FyZycgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQordW5pb24gdTEgeyBpbnQgaTsgfSBfX2F0dHJpYnV0ZV9fKChmb3JtYXRfYXJnKDEpKSk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2Zvcm1hdF9hcmcnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zfX0KK2VudW0gZTEgeyBFMVYwIH0gX19hdHRyaWJ1dGVfXygoZm9ybWF0X2FyZygxKSkpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2Zvcm1hdF9hcmcnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zfX0KIAogZXh0ZXJuIE5TU3RyaW5nICpmZjMgKGNvbnN0IE5TU3RyaW5nICopIF9fYXR0cmlidXRlX18oKGZvcm1hdF9hcmcoMy0yKSkpOwogZXh0ZXJuIE5TU3RyaW5nICpmZjQgKGNvbnN0IE5TU3RyaW5nICopIF9fYXR0cmlidXRlX18oKGZvcm1hdF9hcmcoZm9vKSkpOyAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ2Zvbyd9fQpAQCAtMjUsMjMgKzI1LDMgQEAKIGV4dGVybiBpbnQgZmkzIChjb25zdCBOU1N0cmluZyAqKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXRfYXJnKDEpKSk7ICAvLyBleHBlY3RlZC1lcnJvciB7e2Z1bmN0aW9uIGRvZXMgbm90IHJldHVybiBOU1N0cmluZ319CiBleHRlcm4gTlNTdHJpbmcgKmZpNCAoY29uc3QgTlNTdHJpbmcgKikgX19hdHRyaWJ1dGVfXygoZm9ybWF0X2FyZygxKSkpOyAKIGV4dGVybiBOU1N0cmluZyAqZmk1IChjb25zdCBOU1N0cmluZyAqKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXRfYXJnKDEpKSk7IAotCi0vLyByZGFyOi8vMTUyNDIwMTAKLUBpbnRlcmZhY2UgTlNTdHJpbmcKLSsgKGlkKXN0cmluZ1dpdGhGb3JtYXQ6KE5TU3RyaW5nICopZm9ybWF0LCAuLi4gX19hdHRyaWJ1dGVfXygoZm9ybWF0KF9fTlNTdHJpbmdfXywgMSwgMikpKTsKLUBlbmQKLQotQGludGVyZmFjZSBOU0J1bmRsZQotLSAoTlNTdHJpbmcgKilsb2NhbGl6ZWRTdHJpbmdGb3JLZXk6KE5TU3RyaW5nICopa2V5IHZhbHVlOihOU1N0cmluZyAqKXZhbHVlIHRhYmxlOihOU1N0cmluZyAqKXRhYmxlTmFtZSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0X2FyZygxKSkpOwotKyAoTlNCdW5kbGUgKiltYWluQnVuZGxlOwotQGVuZAotCi0KLU5TU3RyaW5nKiBsb2NhbGl6ZWRGb3JtYXQoTlNTdHJpbmcqIHN0cmluZykgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdF9hcmcoMSkpKTsKLQotaW50IG1haW4oKQotewotICBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpbW05TQnVuZGxlIG1haW5CdW5kbGVdIGxvY2FsaXplZFN0cmluZ0ZvcktleTpAImZvbyAlZCIgdmFsdWU6QCJiYXIgJWQiIHRhYmxlOjBdLCA0Ml07Ci0KLSAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6bG9jYWxpemVkRm9ybWF0KEAiZm9vICVkIiksIDQyXTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvZm9ybWF0LXN0cmluZ3Mtb2JqYy5tIGIvdGVzdC9TZW1hT2JqQy9mb3JtYXQtc3RyaW5ncy1vYmpjLm0KaW5kZXggMjY2N2UzMC4uNDk1NjdhNyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9mb3JtYXQtc3RyaW5ncy1vYmpjLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9mb3JtYXQtc3RyaW5ncy1vYmpjLm0KQEAgLTExNiw2ICsxMTYsOSBAQAogICBOU0xvZyhuczIpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bW9yZSAnJScgY29udmVyc2lvbnMgdGhhbiBkYXRhIGFyZ3VtZW50c319CiAgIE5TU3RyaW5nICogbnMzID0gbnMxOwogICBOU0xvZyhuczMpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Zm9ybWF0IHN0cmluZyBpcyBub3QgYSBzdHJpbmcgbGl0ZXJhbH19fQorCisgIE5TU3RyaW5nICogY29uc3QgbnM2ID0gQCJzcGxpdCIgIiBzdHJpbmcgIiBAIiVzIjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2Zvcm1hdCBzdHJpbmcgaXMgZGVmaW5lZCBoZXJlfX0KKyAgTlNMb2cobnM2KTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21vcmUgJyUnIGNvbnZlcnNpb25zIHRoYW4gZGF0YSBhcmd1bWVudHN9fQogfQogCiAvLyBEbyBub3QgZW1pdCB3YXJuaW5ncyB3aGVuIHVzaW5nIE5TTG9jYWxpemVkU3RyaW5nCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL2ZvcndhcmQtcHJvdG9jb2wtaW5jb21wbGV0ZS1pbXBsLXdhcm4ubSBiL3Rlc3QvU2VtYU9iakMvZm9yd2FyZC1wcm90b2NvbC1pbmNvbXBsZXRlLWltcGwtd2Fybi5tCmluZGV4IGMzZWZlYmEuLmMyMzVlMzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvZm9yd2FyZC1wcm90b2NvbC1pbmNvbXBsZXRlLWltcGwtd2Fybi5tCisrKyBiL3Rlc3QvU2VtYU9iakMvZm9yd2FyZC1wcm90b2NvbC1pbmNvbXBsZXRlLWltcGwtd2Fybi5tCkBAIC0xMiw5ICsxMiw5IEBACiAKIEBwcm90b2NvbCBEVlRJbnZhbGlkYXRpb247CiAKLUBpbnRlcmZhY2UgSUJJbWFnZUNhdGFsb2dEb2N1bWVudCA6IE5TT2JqZWN0IDxEVlRJbnZhbGlkYXRpb24+IC8vIGV4cGVjdGVkLW5vdGUge3tyZXF1aXJlZCBmb3IgZGlyZWN0IG9yIGluZGlyZWN0IHByb3RvY29sICdEVlRJbnZhbGlkYXRpb24nfX0KK0BpbnRlcmZhY2UgSUJJbWFnZUNhdGFsb2dEb2N1bWVudCA6IE5TT2JqZWN0IDxEVlRJbnZhbGlkYXRpb24+CiBAZW5kCiAKLUBpbXBsZW1lbnRhdGlvbiBJQkltYWdlQ2F0YWxvZ0RvY3VtZW50IC8vIGV4cGVjdGVkLXdhcm5pbmcge3thdXRvIHByb3BlcnR5IHN5bnRoZXNpcyB3aWxsIG5vdCBzeW50aGVzaXplIHByb3BlcnR5IGRlY2xhcmVkIGluIGEgcHJvdG9jb2x9fSBcIAotCQkJCSAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWV0aG9kICdpbnZhbGlkYXRlJyBpbiBwcm90b2NvbCBub3QgaW1wbGVtZW50ZWR9fQorQGltcGxlbWVudGF0aW9uIElCSW1hZ2VDYXRhbG9nRG9jdW1lbnQgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2F1dG8gcHJvcGVydHkgc3ludGhlc2lzIHdpbGwgbm90IHN5bnRoZXNpemUgcHJvcGVydHkgJ1Byb3AnIGRlY2xhcmVkIGluIHByb3RvY29sICdEVlRJbnZhbGlkYXRpb24nfX0gXAorCQkJCSAgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWV0aG9kICdpbnZhbGlkYXRlJyBpbiBwcm90b2NvbCAnRFZUSW52YWxpZGF0aW9uJyBub3QgaW1wbGVtZW50ZWR9fQogQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9pYmFjdGlvbi5tIGIvdGVzdC9TZW1hT2JqQy9pYmFjdGlvbi5tCmluZGV4IDljNTlkN2EuLjQzYzkyN2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvaWJhY3Rpb24ubQorKysgYi90ZXN0L1NlbWFPYmpDL2liYWN0aW9uLm0KQEAgLTQsMTIgKzQsMTIgQEAKIHsKICAgX19hdHRyaWJ1dGVfXygoaWJvdXRsZXQpKSBpZCBteW91dGxldDsKIH0KLSsgKHZvaWQpIF9fYXR0cmlidXRlX18oKGliYWN0aW9uKSkgbXlDbGFzc01ldGhvZDooaWQpbXNnOyAvLyBleHBlY3RlZC13YXJuaW5ne3tpYmFjdGlvbiBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBPYmplY3RpdmUtQyBpbnN0YW5jZSBtZXRob2RzfX0KKysgKHZvaWQpIF9fYXR0cmlidXRlX18oKGliYWN0aW9uKSkgbXlDbGFzc01ldGhvZDooaWQpbXNnOyAvLyBleHBlY3RlZC13YXJuaW5ne3snaWJhY3Rpb24nIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gT2JqZWN0aXZlLUMgaW5zdGFuY2UgbWV0aG9kc319CiAtICh2b2lkKSBfX2F0dHJpYnV0ZV9fKChpYmFjdGlvbikpIG15TWVzc2FnZTooaWQpbXNnOwogQGVuZAogCiBAaW1wbGVtZW50YXRpb24gRm9vCi0rICh2b2lkKSBfX2F0dHJpYnV0ZV9fKChpYmFjdGlvbikpIG15Q2xhc3NNZXRob2Q6KGlkKW1zZyB7fSAvLyBleHBlY3RlZC13YXJuaW5ne3tpYmFjdGlvbiBhdHRyaWJ1dGUgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBPYmplY3RpdmUtQyBpbnN0YW5jZSBtZXRob2RzfX0KKysgKHZvaWQpIF9fYXR0cmlidXRlX18oKGliYWN0aW9uKSkgbXlDbGFzc01ldGhvZDooaWQpbXNnIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmd7eydpYmFjdGlvbicgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBPYmplY3RpdmUtQyBpbnN0YW5jZSBtZXRob2RzfX0KIC8vIE5vcm1hbGx5IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBiZSBhdHRhY2hlZCB0byBtZXRob2QgZGVmaW5pdGlvbnMsIGJ1dAogLy8gd2UgYWxsb3cgJ2liYWN0aW9uJyB0byBiZSBhdHRhY2hlZCBiZWNhdXNlIGl0IGNhbiBiZSBleHBhbmRlZCBmcm9tCiAvLyB0aGUgSUJBY3Rpb24gbWFjcm8uCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL2luY29tcGxldGUtaW1wbGVtZW50YXRpb24ubSBiL3Rlc3QvU2VtYU9iakMvaW5jb21wbGV0ZS1pbXBsZW1lbnRhdGlvbi5tCmluZGV4IDRiOGQ2MDAuLjc0ZGVhMmEgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvaW5jb21wbGV0ZS1pbXBsZW1lbnRhdGlvbi5tCisrKyBiL3Rlc3QvU2VtYU9iakMvaW5jb21wbGV0ZS1pbXBsZW1lbnRhdGlvbi5tCkBAIC0zOSwzICszOSwyOSBAQAogCiBAZW5kCiAKKy8vIHJkYXI6Ly8xNTU4MDk2OQordHlwZWRlZiBjaGFyIEJPT0w7CisKK0Bwcm90b2NvbCBOU09iamVjdAorLSAoQk9PTClpc0VxdWFsOihpZClvYmplY3Q7CitAZW5kCisKK0BpbnRlcmZhY2UgTlNPYmplY3QgPE5TT2JqZWN0PgorQGVuZAorCitAcHJvdG9jb2wgTlNBcHBsaWNhdGlvbkRlbGVnYXRlIDxOU09iamVjdD4KKy0gKHZvaWQpSW1wbGVUaGlzTWV0aG9kOyAvLyBleHBlY3RlZC1ub3RlIHt7bWV0aG9kICdJbXBsZVRoaXNNZXRob2QnIGRlY2xhcmVkIGhlcmV9fQorQGVuZAorCitAaW50ZXJmYWNlIEFwcERlbGVnYXRlIDogTlNPYmplY3QgPE5TQXBwbGljYXRpb25EZWxlZ2F0ZT4KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEFwcERlbGVnYXRlIChNUlJDYXRlZ29yeSkKKworLSAoQk9PTClpc0VxdWFsOihpZClvYmplY3QKK3sKKyAgICByZXR1cm4gX19vYmpjX25vOworfQorCistICh2b2lkKUltcGxlVGhpc01ldGhvZCB7fSAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2F0ZWdvcnkgaXMgaW1wbGVtZW50aW5nIGEgbWV0aG9kIHdoaWNoIHdpbGwgYWxzbyBiZSBpbXBsZW1lbnRlZCBieSBpdHMgcHJpbWFyeSBjbGFzc319CitAZW5kCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL21ldGhvZC1hdHRyaWJ1dGVzLm0gYi90ZXN0L1NlbWFPYmpDL21ldGhvZC1hdHRyaWJ1dGVzLm0KaW5kZXggYjQwMmQ1Mi4uMWIwYTkwMCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9tZXRob2QtYXR0cmlidXRlcy5tCisrKyBiL3Rlc3QvU2VtYU9iakMvbWV0aG9kLWF0dHJpYnV0ZXMubQpAQCAtMSw0ICsxLDQgQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5IC1mc3ludGF4LW9ubHkgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGkzODYtdW5rbm93bi11bmtub3duIC12ZXJpZnkgLWZzeW50YXgtb25seSAtV25vLW9iamMtcm9vdC1jbGFzcyAlcwogCiBAY2xhc3MgTlNTdHJpbmc7CiAKQEAgLTcsMjYgKzcsMjggQEAKIC0gKE5TU3RyaW5nICopc3RyaW5nQnlBcHBlbmRpbmdGb3JtYXQ6KE5TU3RyaW5nICopZm9ybWF0LCAuLi4gX19hdHRyaWJ1dGVfXygoZm9ybWF0KF9fTlNTdHJpbmdfXywgMSwgMikpKTsKIC0odm9pZCkgbTAgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKIC0odm9pZCkgbTEgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CistKHZvaWQpIG0yIF9fYXR0cmlidXRlX18oKHN0ZGNhbGwpKTsKKy0odm9pZCkgbTMgX19hdHRyaWJ1dGVfXygob3B0bm9uZSkpOwogQGVuZAogCiAKIEBpbnRlcmZhY2UgSU5URgogLSAoaW50KSBmb28xOiAoaW50KWFyZzEgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOwogCi0tIChpbnQpIGZvbzogKGludClhcmcxOyAgLy8gZXhwZWN0ZWQtbm90ZSB7e21ldGhvZCAnZm9vOicgZGVjbGFyZWQgaGVyZX19CistIChpbnQpIGZvbzogKGludClhcmcxOwogCi0tIChpbnQpIGZvbzI6IChpbnQpYXJnMSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e21ldGhvZCAnZm9vMjonIGRlY2xhcmVkIGhlcmV9fQorLSAoaW50KSBmb28yOiAoaW50KWFyZzEgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpIF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSk7CiAtIChpbnQpIGZvbzM6IChpbnQpYXJnMSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUpKSBfX2F0dHJpYnV0ZV9fKChuc19jb25zdW1lc19zZWxmKSk7CiBAZW5kCiAKIEBpbXBsZW1lbnRhdGlvbiBJTlRGCi0tIChpbnQpIGZvbzogKGludClhcmcxICBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSl7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3thdHRyaWJ1dGVzIG9uIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBhbmQgaXRzIGRlY2xhcmF0aW9uIG11c3QgbWF0Y2h9fQorLSAoaW50KSBmb286IChpbnQpYXJnMSAgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpewogICAgICAgICByZXR1cm4gMTA7CiB9CiAtIChpbnQpIGZvbzE6IChpbnQpYXJnMSB7CiAgICAgICAgIHJldHVybiAxMDsKIH0KLS0gKGludCkgZm9vMjogKGludClhcmcxIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSB7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7YXR0cmlidXRlcyBvbiBtZXRob2QgaW1wbGVtZW50YXRpb24gYW5kIGl0cyBkZWNsYXJhdGlvbiBtdXN0IG1hdGNofX0KKy0gKGludCkgZm9vMjogKGludClhcmcxIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSB7CiAgICAgICAgIHJldHVybiAxMDsKIH0KIC0gKGludCkgZm9vMzogKGludClhcmcxIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpIF9fYXR0cmlidXRlX18oKG5zX2NvbnN1bWVzX3NlbGYpKSB7cmV0dXJuIDA7IH0KQEAgLTM5LDcgKzQxLDcgQEAKIAogQGludGVyZmFjZSBGb28gCiAtICh2b2lkKWRvU29tZXRoaW5nMTooaWQpc2VuZGVyOwotLSAodm9pZClkb1NvbWV0aGluZzI6KGlkKXNlbmRlcjsgLy8gZXhwZWN0ZWQtbm90ZSB7e21ldGhvZCAnZG9Tb21ldGhpbmcyOicgZGVjbGFyZWQgaGVyZX19CistICh2b2lkKWRvU29tZXRoaW5nMjooaWQpc2VuZGVyOwogQGVuZAogCiBAaW1wbGVtZW50YXRpb24gRm9vCkBAIC01Miw3ICs1NCw3IEBACiBAZW5kCiBAaW1wbGVtZW50YXRpb24gQmFyCiAtIChJQkFjdGlvbilkb1NvbWV0aGluZzE6KGlkKXNlbmRlciB7fQotLSAoSUJBY3Rpb24pZG9Tb21ldGhpbmcyOihpZClzZW5kZXIge30gLy8gZXhwZWN0ZWQtd2FybmluZyB7e2F0dHJpYnV0ZXMgb24gbWV0aG9kIGltcGxlbWVudGF0aW9uIGFuZCBpdHMgZGVjbGFyYXRpb24gbXVzdCBtYXRjaH19CistIChJQkFjdGlvbilkb1NvbWV0aGluZzI6KGlkKXNlbmRlciB7fQogLSAoSUJBY3Rpb24pZG9Tb21ldGhpbmczOihpZClzZW5kZXIge30KIEBlbmQKIApAQCAtNjMsNyArNjUsNyBAQAogLShpZCltZXRob2QgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOwogLShpZCltZXRob2QxOwogLShpZCltZXRob2QyIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSk7Ci0tIChpZCkgbWV0aG9kMzogKGludClhcmcxIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7bWV0aG9kICdtZXRob2QzOicgZGVjbGFyZWQgaGVyZX19CistIChpZCkgbWV0aG9kMzogKGludClhcmcxIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOwogLSAoaWQpIG1ldGhvZDQ6IChpbnQpYXJnMSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpICBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUpKTsgCiBAZW5kCiAKQEAgLTc3LDEwICs3OSwyMyBAQAogLShpZCltZXRob2QyIHsKICAgICByZXR1cm4gc2VsZjsKIH0KLS0gKGlkKSBtZXRob2QzOiAoaW50KWFyZzEgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpIF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSkgeyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2F0dHJpYnV0ZXMgb24gbWV0aG9kIGltcGxlbWVudGF0aW9uIGFuZCBpdHMgZGVjbGFyYXRpb24gbXVzdCBtYXRjaH19CistIChpZCkgbWV0aG9kMzogKGludClhcmcxIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpIHsKICAgICAgICAgcmV0dXJuIHNlbGY7CiB9CiAtIChpZCkgbWV0aG9kNDogKGludClhcmcxIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpIF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSkgewogICByZXR1cm4gc2VsZjsKIH0KIEBlbmQKKworX19hdHRyaWJ1dGVfXygoY2RlY2wpKSAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydjZGVjbCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnMgYW5kIG1ldGhvZHN9fQorQGludGVyZmFjZSBDb21wbGFpbiAKK0BlbmQKKworLy8gcmRhcjovLzE1NDUwNjM3CitAaW50ZXJmYWNlIHJkYXIxNTQ1MDYzNyA6IE5TT2JqZWN0CitAcHJvcGVydHkgaW50IHAgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX19URVhULGZvbyIpKSk7CisKKy0gKGlkKSBJTWV0aG9kIDooaW50KSBjb3VudCwgLi4uICBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX1RFWFQsZm9vIikpKTsKKworKyAodm9pZCkgQ01ldGhvZCA6IChpZCkgT2JqIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fVEVYVCxmZWUiKSkpOworQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9tZXRob2Qtc2VudGluZWwtYXR0ci5tIGIvdGVzdC9TZW1hT2JqQy9tZXRob2Qtc2VudGluZWwtYXR0ci5tCmluZGV4IGQyMzBiZTUuLjgyZWUzNzMgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvbWV0aG9kLXNlbnRpbmVsLWF0dHIubQorKysgYi90ZXN0L1NlbWFPYmpDL21ldGhvZC1zZW50aW5lbC1hdHRyLm0KQEAgLTEzLDcgKzEzLDcgQEAKIC0gKHZvaWQpIGZvbzggOiAoaW50KXgsIC4uLiBfX2F0dHJpYnV0ZV9fICgoX19zZW50aW5lbF9fKCJhIikpKTsgIC8vIGV4cGVjdGVkLWVycm9yIHt7J19fc2VudGluZWxfXycgYXR0cmlidXRlIHJlcXVpcmVzIHBhcmFtZXRlciAxIHRvIGJlIGFuIGludGVnZXIgY29uc3RhbnR9fQogLSAodm9pZCkgZm9vOSA6IChpbnQpeCwgLi4uIF9fYXR0cmlidXRlX18gKChfX3NlbnRpbmVsX18oLTEpKSk7ICAvLyBleHBlY3RlZC1lcnJvciB7eydzZW50aW5lbCcgcGFyYW1ldGVyIDEgbGVzcyB0aGFuIHplcm99fQogLSAodm9pZCkgZm9vMTAgOiAoaW50KXgsIC4uLiBfX2F0dHJpYnV0ZV9fICgoX19zZW50aW5lbF9fKDEsMSkpKTsKLS0gKHZvaWQpIGZvbzExIDogKGludCl4LCAuLi4gX19hdHRyaWJ1dGVfXyAoKF9fc2VudGluZWxfXygxLDEsMykpKTsgIC8vIGV4cGVjdGVkLWVycm9yIHt7YXR0cmlidXRlIHRha2VzIG5vIG1vcmUgdGhhbiAyIGFyZ3VtZW50c319CistICh2b2lkKSBmb28xMSA6IChpbnQpeCwgLi4uIF9fYXR0cmlidXRlX18gKChfX3NlbnRpbmVsX18oMSwxLDMpKSk7ICAvLyBleHBlY3RlZC1lcnJvciB7eydfX3NlbnRpbmVsX18nIGF0dHJpYnV0ZSB0YWtlcyBubyBtb3JlIHRoYW4gMiBhcmd1bWVudHN9fQogLSAodm9pZCkgZm9vMTIgOiAoaW50KXgsIC4uLiBBVFRSOyAvLyBleHBlY3RlZC1ub3RlIHt7bWV0aG9kIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHNlbnRpbmVsIGhlcmV9fQogCiAvLyByZGFyOi8vNzk3NTc4OApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9tZXRob2QtdW5kZWYtY2F0ZWdvcnktd2Fybi0xLm0gYi90ZXN0L1NlbWFPYmpDL21ldGhvZC11bmRlZi1jYXRlZ29yeS13YXJuLTEubQppbmRleCA5OGQ3MzJiLi5jOTUxZGIyIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL21ldGhvZC11bmRlZi1jYXRlZ29yeS13YXJuLTEubQorKysgYi90ZXN0L1NlbWFPYmpDL21ldGhvZC11bmRlZi1jYXRlZ29yeS13YXJuLTEubQpAQCAtOCwyMCArOCwyMCBAQAogLSAodm9pZCkgUG1ldGgxOyAgLy8gZXhwZWN0ZWQtbm90ZSB7e21ldGhvZCAnUG1ldGgxJyBkZWNsYXJlZCBoZXJlfX0KIEBlbmQKIAotQGludGVyZmFjZSBNeUNsYXNzMShDQVQpIDxQPiAvLyBleHBlY3RlZC1ub3RlIHt7cmVxdWlyZWQgZm9yIGRpcmVjdCBvciBpbmRpcmVjdCBwcm90b2NvbCAnUCd9fQorQGludGVyZmFjZSBNeUNsYXNzMShDQVQpIDxQPgogLSAodm9pZCkgbWV0aDI7ICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7bWV0aG9kICdtZXRoMicgZGVjbGFyZWQgaGVyZX19CiBAZW5kCiAKLUBpbXBsZW1lbnRhdGlvbiBNeUNsYXNzMShDQVQpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2QgJ1BtZXRoJyBpbiBwcm90b2NvbCBub3QgaW1wbGVtZW50ZWR9fSBcCitAaW1wbGVtZW50YXRpb24gTXlDbGFzczEoQ0FUKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWV0aG9kICdQbWV0aCcgaW4gcHJvdG9jb2wgJ1AnIG5vdCBpbXBsZW1lbnRlZH19IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2QgZGVmaW5pdGlvbiBmb3IgJ21ldGgyJyBub3QgZm91bmR9fQogLSAodm9pZCkgUG1ldGgxe30KIEBlbmQKIAotQGludGVyZmFjZSBNeUNsYXNzMShET0cpIDxQPiAvLyBleHBlY3RlZC1ub3RlIHt7cmVxdWlyZWQgZm9yIGRpcmVjdCBvciBpbmRpcmVjdCBwcm90b2NvbCAnUCd9fQorQGludGVyZmFjZSBNeUNsYXNzMShET0cpIDxQPgogLSAodm9pZClwcHA7ICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7bWV0aG9kICdwcHAnIGRlY2xhcmVkIGhlcmV9fQogQGVuZAogCi1AaW1wbGVtZW50YXRpb24gTXlDbGFzczEoRE9HKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWV0aG9kICdQbWV0aDEnIGluIHByb3RvY29sIG5vdCBpbXBsZW1lbnRlZH19IFwKK0BpbXBsZW1lbnRhdGlvbiBNeUNsYXNzMShET0cpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2QgJ1BtZXRoMScgaW4gcHJvdG9jb2wgJ1AnIG5vdCBpbXBsZW1lbnRlZH19IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2QgZGVmaW5pdGlvbiBmb3IgJ3BwcCcgbm90IGZvdW5kfX0KIC0gKHZvaWQpIFBtZXRoIHt9CiBAZW5kCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL21ldGhvZC11bmRlZi1leHRlbnNpb24td2Fybi0xLm0gYi90ZXN0L1NlbWFPYmpDL21ldGhvZC11bmRlZi1leHRlbnNpb24td2Fybi0xLm0KaW5kZXggZmJjMjFiZC4uODE5ZDZlZCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9tZXRob2QtdW5kZWYtZXh0ZW5zaW9uLXdhcm4tMS5tCisrKyBiL3Rlc3QvU2VtYU9iakMvbWV0aG9kLXVuZGVmLWV4dGVuc2lvbi13YXJuLTEubQpAQCAtMSw2ICsxLDYgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKIAotQGludGVyZmFjZSBNeUNsYXNzIC8vIGV4cGVjdGVkLW5vdGUge3tyZXF1aXJlZCBmb3IgZGlyZWN0IG9yIGluZGlyZWN0IHByb3RvY29sICdQJ319CitAaW50ZXJmYWNlIE15Q2xhc3MKIEBlbmQKIAogQHByb3RvY29sIFAKQEAgLTE4LDcgKzE4LDcgQEAKIC0gKHZvaWQpY2F0ZWdvcnlNZXRob2Q7CiBAZW5kCiAKLUBpbXBsZW1lbnRhdGlvbiBNeUNsYXNzIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2QgJ1BtZXRoMScgaW4gcHJvdG9jb2wgbm90IGltcGxlbWVudGVkfX0gXAorQGltcGxlbWVudGF0aW9uIE15Q2xhc3MgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21ldGhvZCAnUG1ldGgxJyBpbiBwcm90b2NvbCAnUCcgbm90IGltcGxlbWVudGVkfX0gXAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21ldGhvZCBkZWZpbml0aW9uIGZvciAnbWV0aDInIG5vdCBmb3VuZH19CiAtICh2b2lkKVBtZXRoIHt9CiBAZW5kCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL25vbm51bGwubSBiL3Rlc3QvU2VtYU9iakMvbm9ubnVsbC5tCmluZGV4IDkwMjEwNWIuLmEzNDVlZGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvbm9ubnVsbC5tCisrKyBiL3Rlc3QvU2VtYU9iakMvbm9ubnVsbC5tCkBAIC03NCw2ICs3NCw5IEBACiBAaW50ZXJmYWNlIE5TT2JqZWN0IAogLSAodm9pZClkb1NvbWV0aGluZ1dpdGhOb25OdWxsUG9pbnRlcjoodm9pZCAqKXB0ciA6KGludClpYXJnIDogKHZvaWQqKXB0cjEgX19hdHRyaWJ1dGVfXygobm9ubnVsbCgxLCAzKSkpOwogKyAodm9pZClkb1NvbWV0aGluZ0NsYXNzeVdpdGhOb25OdWxsUG9pbnRlcjoodm9pZCAqKXB0ciBfX2F0dHJpYnV0ZV9fKChub25udWxsKDEpKSk7CistICh2b2lkKilyZXR1cm5zQ05vbk51bGwgX19hdHRyaWJ1dGVfXygocmV0dXJuc19ub25udWxsKSk7IC8vIG5vLXdhcm5pbmcKKy0gKGlkKXJldHVybnNPYmpDTm9uTnVsbCBfX2F0dHJpYnV0ZV9fKChyZXR1cm5zX25vbm51bGwpKTsgLy8gbm8td2FybmluZworLSAoaW50KXJldHVybnNJbnROb25OdWxsIF9fYXR0cmlidXRlX18oKHJldHVybnNfbm9ubnVsbCkpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J3JldHVybnNfbm9ubnVsbCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byByZXR1cm4gdmFsdWVzIHRoYXQgYXJlIHBvaW50ZXJzfX0KIEBlbmQKIAogZXh0ZXJuIHZvaWQgRG9Tb21ldGhpbmdOb3ROdWxsKHZvaWQgKmRiKSBfX2F0dHJpYnV0ZV9fKChub25udWxsKDEpKSk7CkBAIC04Miw2ICs4NSw3IEBACiB7CiAgIHZvaWQgKiB2cDsKIH0KKy0gKHZvaWQqKSB0ZXN0UmV0TnVsbCBfX2F0dHJpYnV0ZV9fKChyZXR1cm5zX25vbm51bGwpKTsKIEBlbmQKIAogQGltcGxlbWVudGF0aW9uIElNUApAQCAtOTMsNSArOTcsMjkgQEAKICAgRG9Tb21ldGhpbmdOb3ROdWxsKE5VTEwpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bnVsbCBwYXNzZWQgdG8gYSBjYWxsZWUgd2hpY2ggcmVxdWlyZXMgYSBub24tbnVsbCBhcmd1bWVudH19CiAgIFtvYmplY3QgZG9Tb21ldGhpbmdXaXRoTm9uTnVsbFBvaW50ZXI6dnA6MTp2cF07CiB9CistICh2b2lkKikgdGVzdFJldE51bGwgeworICByZXR1cm4gMDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e251bGwgcmV0dXJuZWQgZnJvbSBtZXRob2QgdGhhdCByZXF1aXJlcyBhIG5vbi1udWxsIHJldHVybiB2YWx1ZX19Cit9CiBAZW5kCiAKK19fYXR0cmlidXRlX18oKG9iamNfcm9vdF9jbGFzcykpCitAaW50ZXJmYWNlIFRlc3ROb25OdWxsUGFyYW1ldGVycworLSAodm9pZCkgZG9Ob3RQYXNzTnVsbFBhcmFtZXRlck5vblBvaW50ZXJBcmc6KGludClfX2F0dHJpYnV0ZV9fKChub25udWxsKSl4OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J25vbm51bGwnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gcG9pbnRlciBhcmd1bWVudHN9fQorLSAodm9pZCkgZG9Ob3RQYXNzTnVsbFBhcmFtZXRlcjooaWQpX19hdHRyaWJ1dGVfXygobm9ubnVsbCkpeDsKKy0gKHZvaWQpIGRvTm90UGFzc051bGxQYXJhbWV0ZXJBcmdJbmRleDooaWQpX19hdHRyaWJ1dGVfXygobm9ubnVsbCgxKSkpeDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydub25udWxsJyBhdHRyaWJ1dGUgd2hlbiB1c2VkIG9uIHBhcmFtZXRlcnMgdGFrZXMgbm8gYXJndW1lbnRzfX0KKy0gKHZvaWQpIGRvTm90UGFzc051bGxPbk1ldGhvZDooaWQpeCBfX2F0dHJpYnV0ZV9fKChub25udWxsKDEpKSk7CitAZW5kCisKK3ZvaWQgdGVzdChUZXN0Tm9uTnVsbFBhcmFtZXRlcnMgKmYpIHsKKyAgW2YgZG9Ob3RQYXNzTnVsbFBhcmFtZXRlcjowXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e251bGwgcGFzc2VkIHRvIGEgY2FsbGVlIHdoaWNoIHJlcXVpcmVzIGEgbm9uLW51bGwgYXJndW1lbnR9fQorICBbZiBkb05vdFBhc3NOdWxsUGFyYW1ldGVyQXJnSW5kZXg6MF07IC8vIG5vLXdhcm5pbmcKKyAgW2YgZG9Ob3RQYXNzTnVsbE9uTWV0aG9kOjBdOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bnVsbCBwYXNzZWQgdG8gYSBjYWxsZWUgd2hpY2ggcmVxdWlyZXMgYSBub24tbnVsbCBhcmd1bWVudH19Cit9CisKKwordm9pZCBQUjE4Nzk1KGludCAoXmcpKGNvbnN0IGNoYXIgKmgsIC4uLikgX19hdHRyaWJ1dGVfXygobm9ubnVsbCgxKSkpIF9fYXR0cmlidXRlX18oKG5vbm51bGwpKSkgeworICBnKDApOyAvLyBleHBlY3RlZC13YXJuaW5ne3tudWxsIHBhc3NlZCB0byBhIGNhbGxlZSB3aGljaCByZXF1aXJlcyBhIG5vbi1udWxsIGFyZ3VtZW50fX0KK30KK3ZvaWQgUFIxODc5NV9oZWxwZXIoKSB7CisgIFBSMTg3OTUoMCk7IC8vIGV4cGVjdGVkLXdhcm5pbmd7e251bGwgcGFzc2VkIHRvIGEgY2FsbGVlIHdoaWNoIHJlcXVpcmVzIGEgbm9uLW51bGwgYXJndW1lbnR9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9uc29iamVjdC1hdHRyaWJ1dGUubSBiL3Rlc3QvU2VtYU9iakMvbnNvYmplY3QtYXR0cmlidXRlLm0KaW5kZXggZWFkMjIyYy4uNmJkMmQ1ZCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9uc29iamVjdC1hdHRyaWJ1dGUubQorKysgYi90ZXN0L1NlbWFPYmpDL25zb2JqZWN0LWF0dHJpYnV0ZS5tCkBAIC02LDcgKzYsNyBAQAogc3RhdGljIGludCBjb3VudDsKIHN0YXRpYyBDR0NvbG9yUmVmIHRtcCA9IDA7CiAKLXR5cGVkZWYgc3RydWN0IFMxICBfX2F0dHJpYnV0ZV9fICgoTlNPYmplY3QpKSBDR0NvbG9yUmVmMTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tfX2F0dHJpYnV0ZSAoKE5TT2JqZWN0KSkgaXMgZm9yIHBvaW50ZXIgdHlwZXMgb25seX19Cit0eXBlZGVmIHN0cnVjdCBTMSAgX19hdHRyaWJ1dGVfXyAoKE5TT2JqZWN0KSkgQ0dDb2xvclJlZjE7IC8vIGV4cGVjdGVkLWVycm9yIHt7J05TT2JqZWN0JyBhdHRyaWJ1dGUgaXMgZm9yIHBvaW50ZXIgdHlwZXMgb25seX19CiB0eXBlZGVmIHZvaWQgKiAgX19hdHRyaWJ1dGVfXyAoKE5TT2JqZWN0KSkgQ0dDb2xvclJlZjI7IC8vIG5vLXdhcm5pbmcKIHR5cGVkZWYgdm9pZCAqIENGVHlwZVJlZjsKIApAQCAtNDgsMTggKzQ4LDE4IEBACiAvLyByZGFyOi8vMTA0NTMzNDIKIEBpbnRlcmZhY2UgSQogewotICAgX19hdHRyaWJ1dGVfXygoTlNPYmplY3QpKSB2b2lkICogY29sb3I7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tfX2F0dHJpYnV0ZSAoKE5TT2JqZWN0KSkgbWF5IGJlIHB1dCBvbiBhIHR5cGVkZWYgb25seSwgYXR0cmlidXRlIGlzIGlnbm9yZWR9fQorICAgX19hdHRyaWJ1dGVfXygoTlNPYmplY3QpKSB2b2lkICogY29sb3I7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snTlNPYmplY3QnIGF0dHJpYnV0ZSBtYXkgYmUgcHV0IG9uIGEgdHlwZWRlZiBvbmx5OyBhdHRyaWJ1dGUgaXMgaWdub3JlZH19CiB9CiAgIC8vIDxyZGFyOi8vcHJvYmxlbS8xMDkzMDUwNz4KIEBwcm9wZXJ0eSAobm9uYXRvbWljLCByZXRhaW4pIF9fYXR0cmlidXRlX18oKE5TT2JqZWN0KSkgQ0dDb2xvclJlZk5vTlNPYmplY3QgY29sb3I7IC8vIC8vIG5vLXdhcm5pbmcKIEBlbmQKIHZvaWQgdGVzdF8xMDQ1MzM0MigpIHsKLSAgICBjaGFyKiBfX2F0dHJpYnV0ZV9fKChOU09iamVjdCkpIHN0cmluZzIgPSAwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7X19hdHRyaWJ1dGUgKChOU09iamVjdCkpIG1heSBiZSBwdXQgb24gYSB0eXBlZGVmIG9ubHksIGF0dHJpYnV0ZSBpcyBpZ25vcmVkfX0KKyAgICBjaGFyKiBfX2F0dHJpYnV0ZV9fKChOU09iamVjdCkpIHN0cmluZzIgPSAwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J05TT2JqZWN0JyBhdHRyaWJ1dGUgbWF5IGJlIHB1dCBvbiBhIHR5cGVkZWYgb25seTsgYXR0cmlidXRlIGlzIGlnbm9yZWR9fQogfQogCiAvLyByZGFyOi8vMTE1Njk4NjAKIEBpbnRlcmZhY2UgQSB7IGludCBpOyB9Ci1AcHJvcGVydHkocmV0YWluKSBfX2F0dHJpYnV0ZV9fKChOU09iamVjdCkpIGludCBpOyAvLyBleHBlY3RlZC1lcnJvciB7e19fYXR0cmlidXRlICgoTlNPYmplY3QpKSBpcyBmb3IgcG9pbnRlciB0eXBlcyBvbmx5fX0gXAorQHByb3BlcnR5KHJldGFpbikgX19hdHRyaWJ1dGVfXygoTlNPYmplY3QpKSBpbnQgaTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snTlNPYmplY3QnIGF0dHJpYnV0ZSBpcyBmb3IgcG9pbnRlciB0eXBlcyBvbmx5fX0gXAogICAJCQkJCQkgICAvLyBleHBlY3RlZC1lcnJvciB7e3Byb3BlcnR5IHdpdGggJ3JldGFpbiAob3Igc3Ryb25nKScgYXR0cmlidXRlIG11c3QgYmUgb2Ygb2JqZWN0IHR5cGV9fQogQGVuZAogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL29iamNicmlkZ2UtYXR0cmlidXRlLWFyYy5tIGIvdGVzdC9TZW1hT2JqQy9vYmpjYnJpZGdlLWF0dHJpYnV0ZS1hcmMubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjgzMGZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hT2JqQy9vYmpjYnJpZGdlLWF0dHJpYnV0ZS1hcmMubQpAQCAtMCwwICsxLDEzOSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXggb2JqZWN0aXZlLWMgLWZvYmpjLWFyYyAtdmVyaWZ5IC1Xbm8tb2JqYy1yb290LWNsYXNzICVzCisvLyByZGFyOi8vMTU0NTQ4NDYKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKG9iamNfYnJpZGdlKE5TRXJyb3IpKSkgX19DRkVycm9yUmVmICogQ0ZFcnJvclJlZjsgLy8gZXhwZWN0ZWQtbm90ZSA3IHt7ZGVjbGFyZWQgaGVyZX19CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18gKChvYmpjX2JyaWRnZShNeUVycm9yKSkpIF9fQ0ZNeUVycm9yUmVmICogQ0ZNeUVycm9yUmVmOyAvLyBleHBlY3RlZC1ub3RlIDMge3tkZWNsYXJlZCBoZXJlfX0KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2UoMTIpKSkgX19DRk15Q29sb3IgICpDRk15Q29sb3JSZWY7IC8vIGV4cGVjdGVkLWVycm9yIHt7cGFyYW1ldGVyIG9mICdvYmpjX2JyaWRnZScgYXR0cmlidXRlIG11c3QgYmUgYSBzaW5nbGUgbmFtZSBvZiBhbiBPYmplY3RpdmUtQyBjbGFzc319CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18gKChvYmpjX2JyaWRnZSkpIF9fQ0ZBcnJheSAqQ0ZBcnJheVJlZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSB0YWtlcyBvbmUgYXJndW1lbnR9fQorCit0eXBlZGVmIHZvaWQgKiAgX19hdHRyaWJ1dGVfXyAoKG9iamNfYnJpZGdlKE5TVVJMKSkpIENGVVJMUmVmOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0IG9yIHVuaW9ufX0KKwordHlwZWRlZiB2b2lkICogQ0ZTdHJpbmdSZWYgX19hdHRyaWJ1dGVfXyAoKG9iamNfYnJpZGdlKE5TU3RyaW5nKSkpOyAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2JyaWRnZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3Qgb3IgdW5pb259fQorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZShOU0xvY2FsZSwgTlNFcnJvcikpKSBfX0NGTG9jYWxlICpDRkxvY2FsZVJlZjsvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ05TRXJyb3InfX0KKwordHlwZWRlZiBzdHJ1Y3QgX19DRkRhdGEgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2UoTlNEYXRhKSkpIENGRGF0YVJlZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0IG9yIHVuaW9ufX0KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2UoTlNEaWN0aW9uYXJ5KSkpIF9fQ0ZEaWN0aW9uYXJ5ICogQ0ZEaWN0aW9uYXJ5UmVmOworCit0eXBlZGVmIHN0cnVjdCBfX0NGU2V0UmVmICogQ0ZTZXRSZWYgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2UoTlNTZXQpKSk7IC8vIGV4cGVjdGVkLWVycm9yIHt7J29iamNfYnJpZGdlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHN0cnVjdCBvciB1bmlvbn19OworCit0eXBlZGVmIHVuaW9uIF9fQ0ZVQ29sb3IgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2UoTlNVQ29sb3IpKSkgKiBDRlVDb2xvclJlZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0IG9yIHVuaW9ufX07CisKK3R5cGVkZWYgdW5pb24gX19DRlVDb2xvciBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZShOU1VDb2xvcikpKSAqQ0ZVQ29sb3IxUmVmOyAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2JyaWRnZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3Qgb3IgdW5pb259fTsKKwordHlwZWRlZiB1bmlvbiBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZShOU1VDb2xvcikpKSBfX0NGVVByaW1lQ29sb3IgWFhYOwordHlwZWRlZiBYWFggKkNGVUNvbG9yMlJlZjsKKworQGludGVyZmFjZSBJCit7CisgICBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZShOU0Vycm9yKSkpIHZvaWQgKiBjb2xvcjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0IG9yIHVuaW9ufX07Cit9CitAZW5kCisKK0Bwcm90b2NvbCBOU1Rlc3RpbmcgQGVuZAorQGNsYXNzIE5TU3RyaW5nOworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZShOU1Rlc3RpbmcpKSkgX19DRkVycm9yICpDRlRlc3RpbmdSZWY7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KKworaWQgVGVzdDEoQ0ZUZXN0aW5nUmVmIGNmKSB7CisgIHJldHVybiAoTlNTdHJpbmcgKiljZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tDRiBvYmplY3Qgb2YgdHlwZSAnQ0ZUZXN0aW5nUmVmJyAoYWthICdzdHJ1Y3QgX19DRkVycm9yIConKSBpcyBicmlkZ2VkIHRvICdOU1Rlc3RpbmcnLCB3aGljaCBpcyBub3QgYW4gT2JqZWN0aXZlLUMgY2xhc3N9fQorfQorCit0eXBlZGVmIENGRXJyb3JSZWYgQ0ZFcnJvclJlZjE7CisKK3R5cGVkZWYgQ0ZFcnJvclJlZjEgQ0ZFcnJvclJlZjI7IC8vIGV4cGVjdGVkLW5vdGUgMiB7e2RlY2xhcmVkIGhlcmV9fQorCitAcHJvdG9jb2wgUDEgQGVuZAorQHByb3RvY29sIFAyIEBlbmQKK0Bwcm90b2NvbCBQMyBAZW5kCitAcHJvdG9jb2wgUDQgQGVuZAorQHByb3RvY29sIFA1IEBlbmQKKworQGludGVyZmFjZSBOU0Vycm9yPFAxLCBQMiwgUDM+IEBlbmQgLy8gZXhwZWN0ZWQtbm90ZSA3IHt7ZGVjbGFyZWQgaGVyZX19CisKK0BpbnRlcmZhY2UgTXlFcnJvciA6IE5TRXJyb3IgLy8gZXhwZWN0ZWQtbm90ZSAzIHt7ZGVjbGFyZWQgaGVyZX19CitAZW5kCisKK0BpbnRlcmZhY2UgTlNVQ29sb3IgQGVuZAorCitAY2xhc3MgTlNTdHJpbmc7CisKK3ZvaWQgVGVzdDIoQ0ZFcnJvclJlZjIgY2YsIE5TRXJyb3IgKm5zLCBOU1N0cmluZyAqc3RyLCBDbGFzcyBjLCBDRlVDb2xvcjJSZWYgY2YyKSB7CisgICh2b2lkKShOU1N0cmluZyAqKWNmOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0NGRXJyb3JSZWYyJyAoYWthICdzdHJ1Y3QgX19DRkVycm9yUmVmIConKSBicmlkZ2VzIHRvIE5TRXJyb3IsIG5vdCAnTlNTdHJpbmcnfX0KKyAgKHZvaWQpKE5TRXJyb3IgKiljZjsgLy8gb2theQorICAodm9pZCkoTXlFcnJvciopY2Y7IC8vIG9rYXksCisgICh2b2lkKShOU1VDb2xvciAqKWNmMjsgLy8gb2theQorICAodm9pZCkoQ0ZFcnJvclJlZiluczsgLy8gb2theQorICAodm9pZCkoQ0ZFcnJvclJlZilzdHI7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J05TU3RyaW5nJyBjYW5ub3QgYnJpZGdlIHRvICdDRkVycm9yUmVmJyAoYWthICdzdHJ1Y3QgX19DRkVycm9yUmVmIConKX19CisgICh2b2lkKShDbGFzcyljZjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydDRkVycm9yUmVmMicgKGFrYSAnc3RydWN0IF9fQ0ZFcnJvclJlZiAqJykgYnJpZGdlcyB0byBOU0Vycm9yLCBub3QgJ0NsYXNzJ319CisgICh2b2lkKShDRkVycm9yUmVmKWM7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snQ2xhc3MnIGNhbm5vdCBicmlkZ2UgdG8gJ0NGRXJyb3JSZWYnfX0KK30KKworCit2b2lkIFRlc3QzKENGRXJyb3JSZWYgY2YsIE5TRXJyb3IgKm5zKSB7CisgICh2b2lkKShpZCljZjsgLy8gb2theQorICh2b2lkKShpZDxQMSwgUDI+KWNmOyAvLyBva2F5CisgKHZvaWQpKGlkPFAxLCBQMiwgUDQ+KWNmOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0NGRXJyb3JSZWYnIChha2EgJ3N0cnVjdCBfX0NGRXJyb3JSZWYgKicpIGJyaWRnZXMgdG8gTlNFcnJvciwgbm90ICdpZDxQMSxQMixQND4nfX0KK30KKwordm9pZCBUZXN0NChDRk15RXJyb3JSZWYgY2YpIHsKKyAgICh2b2lkKShpZCljZjsgLy8gb2theQorICh2b2lkKShpZDxQMSwgUDI+KWNmOyAvLyBvaworICh2b2lkKShpZDxQMSwgUDIsIFAzPiljZjsgLy8gb2sKKyAodm9pZCkoaWQ8UDIsIFAzPiljZjsgLy8gb2sKKyAodm9pZCkoaWQ8UDEsIFAyLCBQND4pY2Y7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snQ0ZNeUVycm9yUmVmJyAoYWthICdzdHJ1Y3QgX19DRk15RXJyb3JSZWYgKicpIGJyaWRnZXMgdG8gTXlFcnJvciwgbm90ICdpZDxQMSxQMixQND4nfX0KK30KKwordm9pZCBUZXN0NShpZDxQMSwgUDIsIFAzPiBQMTIzLCBpZCBJRCwgaWQ8UDEsIFAyLCBQMywgUDQ+IFAxMjM0LCBpZDxQMSwgUDI+IFAxMiwgaWQ8UDIsIFAzPiBQMjMpIHsKKyAodm9pZCkoQ0ZFcnJvclJlZilJRDsgLy8gb2sKKyAodm9pZCkoQ0ZFcnJvclJlZilQMTIzOyAvLyBvaworICh2b2lkKShDRkVycm9yUmVmKVAxMjM0OyAvLyBvaworICh2b2lkKShDRkVycm9yUmVmKVAxMjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydpZDxQMSxQMj4nIGNhbm5vdCBicmlkZ2UgdG8gJ0NGRXJyb3JSZWYnIChha2EgJ3N0cnVjdCBfX0NGRXJyb3JSZWYgKicpfX0KKyAodm9pZCkoQ0ZFcnJvclJlZilQMjM7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snaWQ8UDIsUDM+JyBjYW5ub3QgYnJpZGdlIHRvICdDRkVycm9yUmVmJyAoYWthICdzdHJ1Y3QgX19DRkVycm9yUmVmIConKX19Cit9CisKK3ZvaWQgVGVzdDYoaWQ8UDEsIFAyLCBQMz4gUDEyMywgaWQgSUQsIGlkPFAxLCBQMiwgUDMsIFA0PiBQMTIzNCwgaWQ8UDEsIFAyPiBQMTIsIGlkPFAyLCBQMz4gUDIzKSB7CisKKyAodm9pZCkoQ0ZNeUVycm9yUmVmKUlEOyAvLyBvaworICh2b2lkKShDRk15RXJyb3JSZWYpUDEyMzsgLy8gb2sKKyAodm9pZCkoQ0ZNeUVycm9yUmVmKVAxMjM0OyAvLyBvaworICh2b2lkKShDRk15RXJyb3JSZWYpUDEyOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2lkPFAxLFAyPicgY2Fubm90IGJyaWRnZSB0byAnQ0ZNeUVycm9yUmVmJyAoYWthICdzdHJ1Y3QgX19DRk15RXJyb3JSZWYgKicpfX0KKyAodm9pZCkoQ0ZNeUVycm9yUmVmKVAyMzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydpZDxQMixQMz4nIGNhbm5vdCBicmlkZ2UgdG8gJ0NGTXlFcnJvclJlZicgKGFrYSAnc3RydWN0IF9fQ0ZNeUVycm9yUmVmIConKX19Cit9CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18gKChvYmpjX2JyaWRnZShNeVBlcnNvbmFsRXJyb3IpKSkgX19DRk15UGVyc29uYWxFcnJvclJlZiAqIENGTXlQZXJzb25hbEVycm9yUmVmOyAgLy8gZXhwZWN0ZWQtbm90ZSA0IHt7ZGVjbGFyZWQgaGVyZX19CisKK0BpbnRlcmZhY2UgTXlQZXJzb25hbEVycm9yIDogTlNFcnJvciA8UDQ+IC8vIGV4cGVjdGVkLW5vdGUgNCB7e2RlY2xhcmVkIGhlcmV9fQorQGVuZAorCit2b2lkIFRlc3Q3KGlkPFAxLCBQMiwgUDM+IFAxMjMsIGlkIElELCBpZDxQMSwgUDIsIFAzLCBQND4gUDEyMzQsIGlkPFAxLCBQMj4gUDEyLCBpZDxQMiwgUDM+IFAyMykgeworICh2b2lkKShDRk15UGVyc29uYWxFcnJvclJlZilJRDsgLy8gb2sKKyAodm9pZCkoQ0ZNeVBlcnNvbmFsRXJyb3JSZWYpUDEyMzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydpZDxQMSxQMixQMz4nIGNhbm5vdCBicmlkZ2UgdG8gJ0NGTXlQZXJzb25hbEVycm9yUmVmJyAoYWthICdzdHJ1Y3QgX19DRk15UGVyc29uYWxFcnJvclJlZiAqJyl9fQorICh2b2lkKShDRk15UGVyc29uYWxFcnJvclJlZilQMTIzNDsgLy8gb2sKKyAodm9pZCkoQ0ZNeVBlcnNvbmFsRXJyb3JSZWYpUDEyOyAvLyAgZXhwZWN0ZWQtd2FybmluZyB7eydpZDxQMSxQMj4nIGNhbm5vdCBicmlkZ2UgdG8gJ0NGTXlQZXJzb25hbEVycm9yUmVmJyAoYWthICdzdHJ1Y3QgX19DRk15UGVyc29uYWxFcnJvclJlZiAqJyl9fQorICh2b2lkKShDRk15UGVyc29uYWxFcnJvclJlZilQMjM7IC8vICBleHBlY3RlZC13YXJuaW5nIHt7J2lkPFAyLFAzPicgY2Fubm90IGJyaWRnZSB0byAnQ0ZNeVBlcnNvbmFsRXJyb3JSZWYnIChha2EgJ3N0cnVjdCBfX0NGTXlQZXJzb25hbEVycm9yUmVmIConKX19Cit9CisKK3ZvaWQgVGVzdDgoQ0ZNeVBlcnNvbmFsRXJyb3JSZWYgY2YpIHsKKyAgKHZvaWQpKGlkKWNmOyAvLyBvaworICAodm9pZCkoaWQ8UDE+KWNmOyAvLyBvaworICAodm9pZCkoaWQ8UDEsIFAyPiljZjsgLy8gb2sKKyAgKHZvaWQpKGlkPFAxLCBQMiwgUDM+KWNmOyAvLyBvaworICAodm9pZCkoaWQ8UDEsIFAyLCBQMywgUDQ+KWNmOyAvLyBvaworICAodm9pZCkoaWQ8UDEsIFAyLCBQMywgUDQsIFA1PiljZjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydDRk15UGVyc29uYWxFcnJvclJlZicgKGFrYSAnc3RydWN0IF9fQ0ZNeVBlcnNvbmFsRXJyb3JSZWYgKicpIGJyaWRnZXMgdG8gTXlQZXJzb25hbEVycm9yLCBub3QgJ2lkPFAxLFAyLFAzLFA0LFA1Pid9fQorfQorCit2b2lkIFRlc3Q5KENGRXJyb3JSZWYyIGNmLCBOU0Vycm9yICpucywgTlNTdHJpbmcgKnN0ciwgQ2xhc3MgYywgQ0ZVQ29sb3IyUmVmIGNmMikgeworICAodm9pZCkoX19icmlkZ2UgTlNTdHJpbmcgKiljZjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydDRkVycm9yUmVmMicgKGFrYSAnc3RydWN0IF9fQ0ZFcnJvclJlZiAqJykgYnJpZGdlcyB0byBOU0Vycm9yLCBub3QgJ05TU3RyaW5nJ319CisgICh2b2lkKShfX2JyaWRnZSBOU0Vycm9yICopY2Y7IC8vIG9rYXkKKyAgKHZvaWQpKF9fYnJpZGdlIE15RXJyb3IqKWNmOyAvLyBva2F5LAorICAodm9pZCkoX19icmlkZ2UgTlNVQ29sb3IgKiljZjI7IC8vIG9rYXkKKyAgKHZvaWQpKF9fYnJpZGdlIENGRXJyb3JSZWYpbnM7IC8vIG9rYXkKKyAgKHZvaWQpKF9fYnJpZGdlIENGRXJyb3JSZWYpc3RyOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydOU1N0cmluZycgY2Fubm90IGJyaWRnZSB0byAnQ0ZFcnJvclJlZicgKGFrYSAnc3RydWN0IF9fQ0ZFcnJvclJlZiAqJyl9fQorICAodm9pZCkoX19icmlkZ2UgQ2xhc3MpY2Y7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snQ0ZFcnJvclJlZjInIChha2EgJ3N0cnVjdCBfX0NGRXJyb3JSZWYgKicpIGJyaWRnZXMgdG8gTlNFcnJvciwgbm90ICdDbGFzcyd9fQorICAodm9pZCkoX19icmlkZ2UgQ0ZFcnJvclJlZiljOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J19fdW5zYWZlX3VucmV0YWluZWQgQ2xhc3MnIGNhbm5vdCBicmlkZ2UgdG8gJ0NGRXJyb3JSZWYnIChha2EgJ3N0cnVjdCBfX0NGRXJyb3JSZWYgKicpfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvb2JqY2JyaWRnZS1hdHRyaWJ1dGUubSBiL3Rlc3QvU2VtYU9iakMvb2JqY2JyaWRnZS1hdHRyaWJ1dGUubQppbmRleCAyZGIyZmY0Li4zNmIzZDYwIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL29iamNicmlkZ2UtYXR0cmlidXRlLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9vYmpjYnJpZGdlLWF0dHJpYnV0ZS5tCkBAIC0xLDExICsxLDEzIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC12ZXJpZnkgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKIC8vIHJkYXI6Ly8xNTQ1NDg0NgogCi10eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgob2JqY19icmlkZ2UoTlNFcnJvcikpKSBfX0NGRXJyb3JSZWYgKiBDRkVycm9yUmVmOyAvLyBleHBlY3RlZC1ub3RlIDIge3tkZWNsYXJlZCBoZXJlfX0KK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18gKChvYmpjX2JyaWRnZShOU0Vycm9yKSkpIF9fQ0ZFcnJvclJlZiAqIENGRXJyb3JSZWY7IC8vIGV4cGVjdGVkLW5vdGUgNSB7e2RlY2xhcmVkIGhlcmV9fQorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgob2JqY19icmlkZ2UoTXlFcnJvcikpKSBfX0NGTXlFcnJvclJlZiAqIENGTXlFcnJvclJlZjsgLy8gZXhwZWN0ZWQtbm90ZSAzIHt7ZGVjbGFyZWQgaGVyZX19CiAKIHR5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlKDEyKSkpIF9fQ0ZNeUNvbG9yICAqQ0ZNeUNvbG9yUmVmOyAvLyBleHBlY3RlZC1lcnJvciB7e3BhcmFtZXRlciBvZiAnb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSBtdXN0IGJlIGEgc2luZ2xlIG5hbWUgb2YgYW4gT2JqZWN0aXZlLUMgY2xhc3N9fQogCi10eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgob2JqY19icmlkZ2UpKSBfX0NGQXJyYXkgKkNGQXJyYXlSZWY7IC8vIGV4cGVjdGVkLWVycm9yIHt7cGFyYW1ldGVyIG9mICdvYmpjX2JyaWRnZScgYXR0cmlidXRlIG11c3QgYmUgYSBzaW5nbGUgbmFtZSBvZiBhbiBPYmplY3RpdmUtQyBjbGFzc319Cit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgob2JqY19icmlkZ2UpKSBfX0NGQXJyYXkgKkNGQXJyYXlSZWY7IC8vIGV4cGVjdGVkLWVycm9yIHt7J29iamNfYnJpZGdlJyBhdHRyaWJ1dGUgdGFrZXMgb25lIGFyZ3VtZW50fX0KIAogdHlwZWRlZiB2b2lkICogIF9fYXR0cmlidXRlX18gKChvYmpjX2JyaWRnZShOU1VSTCkpKSBDRlVSTFJlZjsgIC8vIGV4cGVjdGVkLWVycm9yIHt7J29iamNfYnJpZGdlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHN0cnVjdCBvciB1bmlvbn19CiAKQEAgLTQzLDExICs0NSwxNyBAQAogCiB0eXBlZGVmIENGRXJyb3JSZWYgQ0ZFcnJvclJlZjE7CiAKLXR5cGVkZWYgQ0ZFcnJvclJlZjEgQ0ZFcnJvclJlZjI7Cit0eXBlZGVmIENGRXJyb3JSZWYxIENGRXJyb3JSZWYyOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CiAKLUBpbnRlcmZhY2UgTlNFcnJvciBAZW5kCitAcHJvdG9jb2wgUDEgQGVuZAorQHByb3RvY29sIFAyIEBlbmQKK0Bwcm90b2NvbCBQMyBAZW5kCitAcHJvdG9jb2wgUDQgQGVuZAorQHByb3RvY29sIFA1IEBlbmQKIAotQGludGVyZmFjZSBNeUVycm9yIDogTlNFcnJvcgorQGludGVyZmFjZSBOU0Vycm9yPFAxLCBQMiwgUDM+IEBlbmQgLy8gZXhwZWN0ZWQtbm90ZSA1IHt7ZGVjbGFyZWQgaGVyZX19CisKK0BpbnRlcmZhY2UgTXlFcnJvciA6IE5TRXJyb3IgLy8gZXhwZWN0ZWQtbm90ZSAzIHt7ZGVjbGFyZWQgaGVyZX19CiBAZW5kCiAKIEBpbnRlcmZhY2UgTlNVQ29sb3IgQGVuZApAQCAtNjQsMyArNzIsNTcgQEAKICAgKHZvaWQpKENsYXNzKWNmOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0NGRXJyb3JSZWYyJyAoYWthICdzdHJ1Y3QgX19DRkVycm9yUmVmIConKSBicmlkZ2VzIHRvIE5TRXJyb3IsIG5vdCAnQ2xhc3MnfX0KICAgKHZvaWQpKENGRXJyb3JSZWYpYzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydDbGFzcycgY2Fubm90IGJyaWRnZSB0byAnQ0ZFcnJvclJlZid9fQogfQorCisKK3ZvaWQgVGVzdDMoQ0ZFcnJvclJlZiBjZiwgTlNFcnJvciAqbnMpIHsKKyAgKHZvaWQpKGlkKWNmOyAvLyBva2F5CisgKHZvaWQpKGlkPFAxLCBQMj4pY2Y7IC8vIG9rYXkKKyAodm9pZCkoaWQ8UDEsIFAyLCBQND4pY2Y7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snQ0ZFcnJvclJlZicgKGFrYSAnc3RydWN0IF9fQ0ZFcnJvclJlZiAqJykgYnJpZGdlcyB0byBOU0Vycm9yLCBub3QgJ2lkPFAxLFAyLFA0Pid9fQorfQorCit2b2lkIFRlc3Q0KENGTXlFcnJvclJlZiBjZikgeworICAgKHZvaWQpKGlkKWNmOyAvLyBva2F5CisgKHZvaWQpKGlkPFAxLCBQMj4pY2Y7IC8vIG9rCisgKHZvaWQpKGlkPFAxLCBQMiwgUDM+KWNmOyAvLyBvaworICh2b2lkKShpZDxQMiwgUDM+KWNmOyAvLyBvaworICh2b2lkKShpZDxQMSwgUDIsIFA0PiljZjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydDRk15RXJyb3JSZWYnIChha2EgJ3N0cnVjdCBfX0NGTXlFcnJvclJlZiAqJykgYnJpZGdlcyB0byBNeUVycm9yLCBub3QgJ2lkPFAxLFAyLFA0Pid9fQorfQorCit2b2lkIFRlc3Q1KGlkPFAxLCBQMiwgUDM+IFAxMjMsIGlkIElELCBpZDxQMSwgUDIsIFAzLCBQND4gUDEyMzQsIGlkPFAxLCBQMj4gUDEyLCBpZDxQMiwgUDM+IFAyMykgeworICh2b2lkKShDRkVycm9yUmVmKUlEOyAvLyBvaworICh2b2lkKShDRkVycm9yUmVmKVAxMjM7IC8vIG9rCisgKHZvaWQpKENGRXJyb3JSZWYpUDEyMzQ7IC8vIG9rCisgKHZvaWQpKENGRXJyb3JSZWYpUDEyOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2lkPFAxLFAyPicgY2Fubm90IGJyaWRnZSB0byAnQ0ZFcnJvclJlZicgKGFrYSAnc3RydWN0IF9fQ0ZFcnJvclJlZiAqJyl9fQorICh2b2lkKShDRkVycm9yUmVmKVAyMzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydpZDxQMixQMz4nIGNhbm5vdCBicmlkZ2UgdG8gJ0NGRXJyb3JSZWYnIChha2EgJ3N0cnVjdCBfX0NGRXJyb3JSZWYgKicpfX0KK30KKwordm9pZCBUZXN0NihpZDxQMSwgUDIsIFAzPiBQMTIzLCBpZCBJRCwgaWQ8UDEsIFAyLCBQMywgUDQ+IFAxMjM0LCBpZDxQMSwgUDI+IFAxMiwgaWQ8UDIsIFAzPiBQMjMpIHsKKworICh2b2lkKShDRk15RXJyb3JSZWYpSUQ7IC8vIG9rCisgKHZvaWQpKENGTXlFcnJvclJlZilQMTIzOyAvLyBvaworICh2b2lkKShDRk15RXJyb3JSZWYpUDEyMzQ7IC8vIG9rCisgKHZvaWQpKENGTXlFcnJvclJlZilQMTI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snaWQ8UDEsUDI+JyBjYW5ub3QgYnJpZGdlIHRvICdDRk15RXJyb3JSZWYnIChha2EgJ3N0cnVjdCBfX0NGTXlFcnJvclJlZiAqJyl9fQorICh2b2lkKShDRk15RXJyb3JSZWYpUDIzOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2lkPFAyLFAzPicgY2Fubm90IGJyaWRnZSB0byAnQ0ZNeUVycm9yUmVmJyAoYWthICdzdHJ1Y3QgX19DRk15RXJyb3JSZWYgKicpfX0KK30KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKG9iamNfYnJpZGdlKE15UGVyc29uYWxFcnJvcikpKSBfX0NGTXlQZXJzb25hbEVycm9yUmVmICogQ0ZNeVBlcnNvbmFsRXJyb3JSZWY7ICAvLyBleHBlY3RlZC1ub3RlIDQge3tkZWNsYXJlZCBoZXJlfX0KKworQGludGVyZmFjZSBNeVBlcnNvbmFsRXJyb3IgOiBOU0Vycm9yIDxQND4gLy8gZXhwZWN0ZWQtbm90ZSA0IHt7ZGVjbGFyZWQgaGVyZX19CitAZW5kCisKK3ZvaWQgVGVzdDcoaWQ8UDEsIFAyLCBQMz4gUDEyMywgaWQgSUQsIGlkPFAxLCBQMiwgUDMsIFA0PiBQMTIzNCwgaWQ8UDEsIFAyPiBQMTIsIGlkPFAyLCBQMz4gUDIzKSB7CisgKHZvaWQpKENGTXlQZXJzb25hbEVycm9yUmVmKUlEOyAvLyBvaworICh2b2lkKShDRk15UGVyc29uYWxFcnJvclJlZilQMTIzOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2lkPFAxLFAyLFAzPicgY2Fubm90IGJyaWRnZSB0byAnQ0ZNeVBlcnNvbmFsRXJyb3JSZWYnIChha2EgJ3N0cnVjdCBfX0NGTXlQZXJzb25hbEVycm9yUmVmIConKX19CisgKHZvaWQpKENGTXlQZXJzb25hbEVycm9yUmVmKVAxMjM0OyAvLyBvaworICh2b2lkKShDRk15UGVyc29uYWxFcnJvclJlZilQMTI7IC8vICBleHBlY3RlZC13YXJuaW5nIHt7J2lkPFAxLFAyPicgY2Fubm90IGJyaWRnZSB0byAnQ0ZNeVBlcnNvbmFsRXJyb3JSZWYnIChha2EgJ3N0cnVjdCBfX0NGTXlQZXJzb25hbEVycm9yUmVmIConKX19CisgKHZvaWQpKENGTXlQZXJzb25hbEVycm9yUmVmKVAyMzsgLy8gIGV4cGVjdGVkLXdhcm5pbmcge3snaWQ8UDIsUDM+JyBjYW5ub3QgYnJpZGdlIHRvICdDRk15UGVyc29uYWxFcnJvclJlZicgKGFrYSAnc3RydWN0IF9fQ0ZNeVBlcnNvbmFsRXJyb3JSZWYgKicpfX0KK30KKwordm9pZCBUZXN0OChDRk15UGVyc29uYWxFcnJvclJlZiBjZikgeworICAodm9pZCkoaWQpY2Y7IC8vIG9rCisgICh2b2lkKShpZDxQMT4pY2Y7IC8vIG9rCisgICh2b2lkKShpZDxQMSwgUDI+KWNmOyAvLyBvaworICAodm9pZCkoaWQ8UDEsIFAyLCBQMz4pY2Y7IC8vIG9rCisgICh2b2lkKShpZDxQMSwgUDIsIFAzLCBQND4pY2Y7IC8vIG9rCisgICh2b2lkKShpZDxQMSwgUDIsIFAzLCBQNCwgUDU+KWNmOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0NGTXlQZXJzb25hbEVycm9yUmVmJyAoYWthICdzdHJ1Y3QgX19DRk15UGVyc29uYWxFcnJvclJlZiAqJykgYnJpZGdlcyB0byBNeVBlcnNvbmFsRXJyb3IsIG5vdCAnaWQ8UDEsUDIsUDMsUDQsUDU+J319Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL29iamNicmlkZ2UtcmVsYXRlZC1hdHRyaWJ1dGUubSBiL3Rlc3QvU2VtYU9iakMvb2JqY2JyaWRnZS1yZWxhdGVkLWF0dHJpYnV0ZS5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzJlODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWFPYmpDL29iamNicmlkZ2UtcmVsYXRlZC1hdHRyaWJ1dGUubQpAQCAtMCwwICsxLDQxIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYyAtdmVyaWZ5IC1Xbm8tb2JqYy1yb290LWNsYXNzICVzCisvLyByZGFyOi8vMTU0OTkxMTEKKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2VfcmVsYXRlZChOU0NvbG9yLGNvbG9yV2l0aENHQ29sb3I6LENHQ29sb3IpKSkgQ0dDb2xvciAqQ0dDb2xvclJlZjsgLy8gZXhwZWN0ZWQtbm90ZSA1IHt7ZGVjbGFyZWQgaGVyZX19Cit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZV9yZWxhdGVkKE5TQ29sb3IsLENHQ29sb3IxKSkpIENHQ29sb3IxICpDR0NvbG9yUmVmMTsKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX3JlbGF0ZWQoTlNDb2xvciwsKSkpIENHQ29sb3IyICpDR0NvbG9yUmVmMjsKKworQGludGVyZmFjZSBOU0NvbG9yIC8vIGV4cGVjdGVkLW5vdGUgNSB7e2RlY2xhcmVkIGhlcmV9fQorKyAoTlNDb2xvciAqKWNvbG9yV2l0aENHQ29sb3I6KENHQ29sb3JSZWYpY2dDb2xvcjsKKy0gKENHQ29sb3JSZWYpQ0dDb2xvcjsKKy0gKENHQ29sb3JSZWYxKUNHQ29sb3IxOworQGVuZAorCitAaW50ZXJmYWNlIE5TVGV4dEZpZWxkIAorLSAodm9pZClzZXRCYWNrZ3JvdW5kQ29sb3I6KE5TQ29sb3IgKiljb2xvcjsKKy0gKE5TQ29sb3IgKiliYWNrZ3JvdW5kQ29sb3I7CitAZW5kCisKK3ZvaWQgZm9vKE5TQ29sb3IqKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Bhc3NpbmcgYXJndW1lbnQgdG8gcGFyYW1ldGVyIGhlcmV9fQorCitOU0NvbG9yICogVGVzdDEoTlNUZXh0RmllbGQgKnRleHRGaWVsZCwgQ0dDb2xvclJlZiBuZXdDb2xvcikgeworICBmb28obmV3Q29sb3IpOyAvLyBleHBlY3RlZC1lcnJvciB7eydDR0NvbG9yUmVmJyAoYWthICdzdHJ1Y3QgQ0dDb2xvciAqJykgbXVzdCBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCB0byAnTlNDb2xvciAqJzsgdXNlICcrY29sb3JXaXRoQ0dDb2xvcjonIG1ldGhvZCBmb3IgdGhpcyBjb252ZXJzaW9ufX0KKyAgdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvciA9IG5ld0NvbG9yOyAvLyBleHBlY3RlZC1lcnJvciB7eydDR0NvbG9yUmVmJyAoYWthICdzdHJ1Y3QgQ0dDb2xvciAqJykgbXVzdCBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCB0byAnTlNDb2xvciAqJzsgdXNlICcrY29sb3JXaXRoQ0dDb2xvcjonIG1ldGhvZCBmb3IgdGhpcyBjb252ZXJzaW9ufX0KKyAgcmV0dXJuIG5ld0NvbG9yOyAvLyBleHBlY3RlZC1lcnJvciB7eydDR0NvbG9yUmVmJyAoYWthICdzdHJ1Y3QgQ0dDb2xvciAqJykgbXVzdCBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCB0byAnTlNDb2xvciAqJzsgdXNlICcrY29sb3JXaXRoQ0dDb2xvcjonIG1ldGhvZCBmb3IgdGhpcyBjb252ZXJzaW9ufX0KK30KKworTlNDb2xvciAqIFRlc3QyKE5TVGV4dEZpZWxkICp0ZXh0RmllbGQsIENHQ29sb3JSZWYxIG5ld0NvbG9yKSB7CisgIGZvbyhuZXdDb2xvcik7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcyBwYXNzaW5nICdDR0NvbG9yUmVmMSd9fQorICB0ZXh0RmllbGQuYmFja2dyb3VuZENvbG9yID0gbmV3Q29sb3I7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcyBhc3NpZ25pbmd9fQorICByZXR1cm4gbmV3Q29sb3I7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcyByZXR1cm5pbmd9fQorfQorCitDR0NvbG9yUmVmIFRlc3QzKE5TVGV4dEZpZWxkICp0ZXh0RmllbGQsIENHQ29sb3JSZWYgbmV3Q29sb3IpIHsKKyAgbmV3Q29sb3IgPSB0ZXh0RmllbGQuYmFja2dyb3VuZENvbG9yOyAvLyBleHBlY3RlZC1lcnJvciB7eydOU0NvbG9yIConIG11c3QgYmUgZXhwbGljaXRseSBjb252ZXJ0ZWQgdG8gJ0NHQ29sb3JSZWYnIChha2EgJ3N0cnVjdCBDR0NvbG9yIConKTsgdXNlICctQ0dDb2xvcicgbWV0aG9kIGZvciB0aGlzIGNvbnZlcnNpb259fQorICByZXR1cm4gdGV4dEZpZWxkLmJhY2tncm91bmRDb2xvcjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snTlNDb2xvciAqJyBtdXN0IGJlIGV4cGxpY2l0bHkgY29udmVydGVkIHRvICdDR0NvbG9yUmVmJyAoYWthICdzdHJ1Y3QgQ0dDb2xvciAqJyk7IHVzZSAnLUNHQ29sb3InIG1ldGhvZCBmb3IgdGhpcyBjb252ZXJzaW9ufX0KK30KKworQ0dDb2xvclJlZjIgVGVzdDQoTlNUZXh0RmllbGQgKnRleHRGaWVsZCwgQ0dDb2xvclJlZjIgbmV3Q29sb3IpIHsKKyAgbmV3Q29sb3IgPSB0ZXh0RmllbGQuYmFja2dyb3VuZENvbG9yOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW5jb21wYXRpYmxlIHBvaW50ZXIgdHlwZXMgYXNzaWduaW5nfX0KKyAgcmV0dXJuIHRleHRGaWVsZC5iYWNrZ3JvdW5kQ29sb3I7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcyByZXR1cm5pbmd9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9vYmpjYnJpZGdlbXV0YWJsZS1hdHRyaWJ1dGUubSBiL3Rlc3QvU2VtYU9iakMvb2JqY2JyaWRnZW11dGFibGUtYXR0cmlidXRlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjOGRlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYU9iakMvb2JqY2JyaWRnZW11dGFibGUtYXR0cmlidXRlLm0KQEAgLTAsMCArMSwzMSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtV25vLW9iamMtcm9vdC1jbGFzcyAlcworLy8gcmRhcjovLzE1NDk4MDQ0CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX211dGFibGUoTlNNdXRhYmxlRGljdGlvbmFyeSkpKSBfX0NGRGljdGlvbmFyeSAqIENGTXV0YWJsZURpY3Rpb25hcnlSZWY7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2VfbXV0YWJsZSgxMikpKSBfX0NGRGljdGlvbmFyeUIxICogQ0ZNdXRhYmxlRGljdGlvbmFyeUIxUmVmOyAvLyBleHBlY3RlZC1lcnJvciB7e3BhcmFtZXRlciBvZiAnb2JqY19icmlkZ2VfbXV0YWJsZScgYXR0cmlidXRlIG11c3QgYmUgYSBzaW5nbGUgbmFtZSBvZiBhbiBPYmplY3RpdmUtQyBjbGFzc319CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX211dGFibGUoUCkpKSBfX0NGRGljdGlvbmFyeUIyICogQ0ZNdXRhYmxlRGljdGlvbmFyeUIyUmVmOyAvLyBleHBlY3RlZC1ub3RlIHt7ZGVjbGFyZWQgaGVyZX19CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX211dGFibGUoTlNNdXRhYmxlRGljdGlvbmFyeSwgVW5rbm93bikpKSBfX0NGRGljdGlvbmFyeUIzICogQ0ZNdXRhYmxlRGljdGlvbmFyeUIzUmVmOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdVbmtub3duJ319CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlX211dGFibGUpKSBfX0NGRGljdGlvbmFyeUI0ICogQ0ZNdXRhYmxlRGljdGlvbmFyeUI0UmVmOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2VfbXV0YWJsZScgYXR0cmlidXRlIHRha2VzIG9uZSBhcmd1bWVudH19CisKK0BpbnRlcmZhY2UgTlNEaWN0aW9uYXJ5CitAZW5kCisKK0BpbnRlcmZhY2UgTlNNdXRhYmxlRGljdGlvbmFyeSA6IE5TRGljdGlvbmFyeQorQGVuZAorCitAcHJvdG9jb2wgUCBAZW5kCisKK3ZvaWQgVGVzdChOU011dGFibGVEaWN0aW9uYXJ5ICptZCwgTlNEaWN0aW9uYXJ5ICpuZCwgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBtY2YsIENGTXV0YWJsZURpY3Rpb25hcnlCMlJlZiBibWNmKSB7CisKKyAgKHZvaWQpIChDRk11dGFibGVEaWN0aW9uYXJ5UmVmKW1kOworICAodm9pZCkgKENGTXV0YWJsZURpY3Rpb25hcnlSZWYpbmQ7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snTlNEaWN0aW9uYXJ5JyBjYW5ub3QgYnJpZGdlIHRvICdDRk11dGFibGVEaWN0aW9uYXJ5UmVmJyAoYWthICdzdHJ1Y3QgX19DRkRpY3Rpb25hcnkgKicpfX0KKyAgKHZvaWQpIChOU0RpY3Rpb25hcnkgKiltY2Y7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0NGTXV0YWJsZURpY3Rpb25hcnlSZWYnIChha2EgJ3N0cnVjdCBfX0NGRGljdGlvbmFyeSAqJykgYnJpZGdlcyB0byBOU011dGFibGVEaWN0aW9uYXJ5LCBub3QgJ05TRGljdGlvbmFyeSd9fQorICAodm9pZCkgKE5TTXV0YWJsZURpY3Rpb25hcnkgKiltY2Y7IC8vIG9rOworICAodm9pZCkgKE5TTXV0YWJsZURpY3Rpb25hcnkgKilibWNmOyAvLyBleHBlY3RlZC1lcnJvciB7e0NGIG9iamVjdCBvZiB0eXBlICdDRk11dGFibGVEaWN0aW9uYXJ5QjJSZWYnIChha2EgJ3N0cnVjdCBfX0NGRGljdGlvbmFyeUIyIConKSBpcyBicmlkZ2VkIHRvICdQJywgd2hpY2ggaXMgbm90IGFuIE9iamVjdGl2ZS1DIGNsYXNzfX0KKyAgCit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvb3BhcXVlLWlzLWFjY2Vzcy13YXJuLm0gYi90ZXN0L1NlbWFPYmpDL29wYXF1ZS1pcy1hY2Nlc3Mtd2Fybi5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMGY3MjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWFPYmpDL29wYXF1ZS1pcy1hY2Nlc3Mtd2Fybi5tCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWFwcGxlLWRhcndpbiAtYXJjaCBhcm02NCAtbWlvcy12ZXJzaW9uLW1pbj03IC1mc3ludGF4LW9ubHkgLVdkZXByZWNhdGVkLW9iamMtaXNhLXVzYWdlICVzIC1YY2xhbmcgLXZlcmlmeQorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luIC1hcmNoIGFybTY0IC1taW9zLXZlcnNpb24tbWluPTcgLWZzeW50YXgtb25seSAlcyAtWGNsYW5nIC12ZXJpZnkKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWFwcGxlLWRhcndpbiAtbWlvcy1zaW11bGF0b3ItdmVyc2lvbi1taW49NyAtZnN5bnRheC1vbmx5IC1XZGVwcmVjYXRlZC1vYmpjLWlzYS11c2FnZSAlcyAtWGNsYW5nIC12ZXJpZnkKKy8vIHJkYXI6Ly8xMDcwOTEwMgorCit0eXBlZGVmIHN0cnVjdCBvYmpjX29iamVjdCB7CisgIHN0cnVjdCBvYmpjX2NsYXNzICppc2E7Cit9ICppZDsKKworQGludGVyZmFjZSBOU09iamVjdCB7CisgIHN0cnVjdCBvYmpjX2NsYXNzICppc2E7Cit9CitAZW5kCitAaW50ZXJmYWNlIFdoYXRldmVyIDogTlNPYmplY3QKKytzZWxmOworQGVuZAorCitzdGF0aWMgdm9pZCBmdW5jKCkgeworCisgIGlkIHg7CisKKyAgWygqeCkuaXNhIHNlbGZdOyAvLyBleHBlY3RlZC1lcnJvciB7e2RpcmVjdCBhY2Nlc3MgdG8gT2JqZWN0aXZlLUMncyBpc2EgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBvYmplY3RfZ2V0Q2xhc3MoKX19CisgIFt4LT5pc2Egc2VsZl07ICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkaXJlY3QgYWNjZXNzIHRvIE9iamVjdGl2ZS1DJ3MgaXNhIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2Ygb2JqZWN0X2dldENsYXNzKCl9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9vcGFxdWUtaXMtYWNjZXNzLm0gYi90ZXN0L1NlbWFPYmpDL29wYXF1ZS1pcy1hY2Nlc3MubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQ5MWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hT2JqQy9vcGFxdWUtaXMtYWNjZXNzLm0KQEAgLTAsMCArMSwyMyBAQAorLy8gUlVOOiAlY2xhbmcgLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luIC1hcmNoIGFybTY0IC1taW9zLXZlcnNpb24tbWluPTcgLWZzeW50YXgtb25seSAlcyAtWGNsYW5nIC12ZXJpZnkKKy8vIFJVTjogJWNsYW5nIC10YXJnZXQgeDg2XzY0LWFwcGxlLWRhcndpbiAtYXJjaCB4ODZfNjQgLW1pb3Mtc2ltdWxhdG9yLXZlcnNpb24tbWluPTcgLWZzeW50YXgtb25seSAlcyAtWGNsYW5nIC12ZXJpZnkKKy8vIHJkYXI6Ly8xMDcwOTEwMgorCit0eXBlZGVmIHN0cnVjdCBvYmpjX29iamVjdCB7CisgIHN0cnVjdCBvYmpjX2NsYXNzICppc2E7Cit9ICppZDsKKworQGludGVyZmFjZSBOU09iamVjdCB7CisgIHN0cnVjdCBvYmpjX2NsYXNzICppc2E7Cit9CitAZW5kCitAaW50ZXJmYWNlIFdoYXRldmVyIDogTlNPYmplY3QKKytzZWxmOworQGVuZAorCitzdGF0aWMgdm9pZCBmdW5jKCkgeworCisgIGlkIHg7CisKKyAgWygqeCkuaXNhIHNlbGZdOyAvLyBleHBlY3RlZC1lcnJvciB7e2RpcmVjdCBhY2Nlc3MgdG8gT2JqZWN0aXZlLUMncyBpc2EgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBvYmplY3RfZ2V0Q2xhc3MoKX19CisgIFt4LT5pc2Egc2VsZl07ICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tkaXJlY3QgYWNjZXNzIHRvIE9iamVjdGl2ZS1DJ3MgaXNhIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2Ygb2JqZWN0X2dldENsYXNzKCl9fQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9vdmVycmlkaW5nLXByb3BlcnR5LWluLWNsYXNzLWV4dGVuc2lvbi5tIGIvdGVzdC9TZW1hT2JqQy9vdmVycmlkaW5nLXByb3BlcnR5LWluLWNsYXNzLWV4dGVuc2lvbi5tCmluZGV4IDhjMGUxYjkuLjc3ZWZkNTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvb3ZlcnJpZGluZy1wcm9wZXJ0eS1pbi1jbGFzcy1leHRlbnNpb24ubQorKysgYi90ZXN0L1NlbWFPYmpDL292ZXJyaWRpbmctcHJvcGVydHktaW4tY2xhc3MtZXh0ZW5zaW9uLm0KQEAgLTEsNCArMSw1IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtV2V2ZXJ5dGhpbmcgJXMKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCiAvLyByZGFyOi8vMTIxMDM0MzQKIAogQGNsYXNzIE5TU3RyaW5nOwpAQCAtNyw3ICs4LDcgQEAKIAogQGludGVyZmFjZSBNeUNsYXNzICA6IE5TT2JqZWN0CiAKLUBwcm9wZXJ0eSAobm9uYXRvbWljLCBjb3B5LCByZWFkb25seSkgTlNTdHJpbmcqIG5hbWU7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3twcm9wZXJ0eSBhdHRyaWJ1dGVzICdyZWFkb25seScgYW5kICdjb3B5JyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlfX0KK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBjb3B5LCByZWFkb25seSkgTlNTdHJpbmcqIG5hbWU7CiAKIEBlbmQKIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9wcm9wZXJ0eS0xMC5tIGIvdGVzdC9TZW1hT2JqQy9wcm9wZXJ0eS0xMC5tCmluZGV4IDhjYjhlYzYuLmIyYWFmMmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvcHJvcGVydHktMTAubQorKysgYi90ZXN0L1NlbWFPYmpDL3Byb3BlcnR5LTEwLm0KQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtV3JlYWRvbmx5LXNldHRlci1hdHRycyAtdmVyaWZ5ICVzICAtZmJsb2NrcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcyAgLWZibG9ja3MKIAogLy8gQ2hlY2sgcHJvcGVydHkgYXR0cmlidXRlIGNvbnNpc3RlbmN5LgogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL3Byb3BlcnR5LTEyLm0gYi90ZXN0L1NlbWFPYmpDL3Byb3BlcnR5LTEyLm0KaW5kZXggYzRhNzU1NS4uNWZjMzExYSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9wcm9wZXJ0eS0xMi5tCisrKyBiL3Rlc3QvU2VtYU9iakMvcHJvcGVydHktMTIubQpAQCAtMSwxNSArMSwxNSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLVduby1vYmpjLXJvb3QtY2xhc3MgLVdyZWFkb25seS1zZXR0ZXItYXR0cnMgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLVduby1vYmpjLXJvb3QtY2xhc3MgLXZlcmlmeSAlcwogCiBAcHJvdG9jb2wgUDAKLUBwcm9wZXJ0eShyZWFkb25seSxhc3NpZ24pIGlkIFg7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3twcm9wZXJ0eSBhdHRyaWJ1dGVzICdyZWFkb25seScgYW5kICdhc3NpZ24nIGFyZSBtdXR1YWxseSBleGNsdXNpdmV9fQorQHByb3BlcnR5KHJlYWRvbmx5LGFzc2lnbikgaWQgWDsKIEBlbmQKIAogQHByb3RvY29sIFAxCi1AcHJvcGVydHkocmVhZG9ubHkscmV0YWluKSBpZCBYOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cHJvcGVydHkgYXR0cmlidXRlcyAncmVhZG9ubHknIGFuZCAncmV0YWluJyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlfX0KK0Bwcm9wZXJ0eShyZWFkb25seSxyZXRhaW4pIGlkIFg7CiBAZW5kCiAKIEBwcm90b2NvbCBQMgotQHByb3BlcnR5KHJlYWRvbmx5LGNvcHkpIGlkIFg7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3twcm9wZXJ0eSBhdHRyaWJ1dGVzICdyZWFkb25seScgYW5kICdjb3B5JyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlfX0KK0Bwcm9wZXJ0eShyZWFkb25seSxjb3B5KSBpZCBYOwogQGVuZAogCiBAcHJvdG9jb2wgUDMKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvcHJvcGVydHktZGVwcmVjYXRlZC13YXJuaW5nLm0gYi90ZXN0L1NlbWFPYmpDL3Byb3BlcnR5LWRlcHJlY2F0ZWQtd2FybmluZy5tCmluZGV4IDdlMTAzNTYuLmM4OWVkYjkgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvcHJvcGVydHktZGVwcmVjYXRlZC13YXJuaW5nLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9wcm9wZXJ0eS1kZXByZWNhdGVkLXdhcm5pbmcubQpAQCAtNSw3ICs1LDcgQEAKIHR5cGVkZWYgc2lnbmVkIGNoYXIgQk9PTDsKIAogQHByb3RvY29sIFAKLUBwcm9wZXJ0eShub25hdG9taWMsYXNzaWduKSBpZCBwdGFyZ2V0IF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShpb3MsaW50cm9kdWNlZD0yLjAsZGVwcmVjYXRlZD0zLjApKSk7IC8vIGV4cGVjdGVkLW5vdGUge3twcm9wZXJ0eSAncHRhcmdldCcgaXMgZGVjbGFyZWQgZGVwcmVjYXRlZCBoZXJlfX0gZXhwZWN0ZWQtbm90ZSB7e21ldGhvZCAncHRhcmdldCcgZGVjbGFyZWQgaGVyZX19CitAcHJvcGVydHkobm9uYXRvbWljLGFzc2lnbikgaWQgcHRhcmdldCBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkoaW9zLGludHJvZHVjZWQ9Mi4wLGRlcHJlY2F0ZWQ9My4wKSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7cHJvcGVydHkgJ3B0YXJnZXQnIGlzIGRlY2xhcmVkIGRlcHJlY2F0ZWQgaGVyZX19IGV4cGVjdGVkLW5vdGUge3sncHRhcmdldCcgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIEBlbmQKIAogQHByb3RvY29sIFAxPFA+CkBAIC0xNCw3ICsxNCw3IEBACiAKIAogQGludGVyZmFjZSBVSVRhYmxlVmlld0NlbGw8UDE+Ci1AcHJvcGVydHkobm9uYXRvbWljLGFzc2lnbikgaWQgdGFyZ2V0IF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShpb3MsaW50cm9kdWNlZD0yLjAsZGVwcmVjYXRlZD0zLjApKSk7IC8vIGV4cGVjdGVkLW5vdGUge3twcm9wZXJ0eSAndGFyZ2V0JyBpcyBkZWNsYXJlZCBkZXByZWNhdGVkIGhlcmV9fSBleHBlY3RlZC1ub3RlIHt7bWV0aG9kICdzZXRUYXJnZXQ6JyBkZWNsYXJlZCBoZXJlfX0KK0Bwcm9wZXJ0eShub25hdG9taWMsYXNzaWduKSBpZCB0YXJnZXQgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTIuMCxkZXByZWNhdGVkPTMuMCkpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Byb3BlcnR5ICd0YXJnZXQnIGlzIGRlY2xhcmVkIGRlcHJlY2F0ZWQgaGVyZX19IGV4cGVjdGVkLW5vdGUge3snc2V0VGFyZ2V0OicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIEBlbmQKIAogQGludGVyZmFjZSBQU1RhYmxlQ2VsbCA6IFVJVGFibGVWaWV3Q2VsbApAQCAtMjIsOSArMjIsOSBAQAogQGVuZAogCiBAaW50ZXJmYWNlIFVJVGFibGVWaWV3Q2VsbChVSURlcHJlY2F0ZWQpCi1AcHJvcGVydHkobm9uYXRvbWljLGFzc2lnbikgaWQgZGVwX3RhcmdldCAgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTIuMCxkZXByZWNhdGVkPTMuMCkpKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7bWV0aG9kICdkZXBfdGFyZ2V0JyBkZWNsYXJlZCBoZXJlfX0gXAorQHByb3BlcnR5KG5vbmF0b21pYyxhc3NpZ24pIGlkIGRlcF90YXJnZXQgIF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShpb3MsaW50cm9kdWNlZD0yLjAsZGVwcmVjYXRlZD0zLjApKSk7IC8vIGV4cGVjdGVkLW5vdGUgMiB7eydkZXBfdGFyZ2V0JyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIDQge3twcm9wZXJ0eSAnZGVwX3RhcmdldCcgaXMgZGVjbGFyZWQgZGVwcmVjYXRlZCBoZXJlfX0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7bWV0aG9kICdzZXREZXBfdGFyZ2V0OicgZGVjbGFyZWQgaGVyZX19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIDIge3snc2V0RGVwX3RhcmdldDonIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiBAZW5kCiAKIEBpbXBsZW1lbnRhdGlvbiBQU1RhYmxlQ2VsbApAQCAtNTUsOSArNTUsOSBAQAogCiAKIEBpbnRlcmZhY2UgQ3VzdG9tQWNjZXNzb3JOYW1lcwotQHByb3BlcnR5KGdldHRlcj1pc0VuYWJsZWQsYXNzaWduKSBCT09MIGVuYWJsZWQgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTIuMCxkZXByZWNhdGVkPTMuMCkpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e21ldGhvZCAnaXNFbmFibGVkJyBkZWNsYXJlZCBoZXJlfX0gZXhwZWN0ZWQtbm90ZSB7e3Byb3BlcnR5ICdlbmFibGVkJyBpcyBkZWNsYXJlZCBkZXByZWNhdGVkIGhlcmV9fQorQHByb3BlcnR5KGdldHRlcj1pc0VuYWJsZWQsYXNzaWduKSBCT09MIGVuYWJsZWQgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KGlvcyxpbnRyb2R1Y2VkPTIuMCxkZXByZWNhdGVkPTMuMCkpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydpc0VuYWJsZWQnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19IGV4cGVjdGVkLW5vdGUge3twcm9wZXJ0eSAnZW5hYmxlZCcgaXMgZGVjbGFyZWQgZGVwcmVjYXRlZCBoZXJlfX0KIAotQHByb3BlcnR5KHNldHRlcj1zZXROZXdEZWxlZ2F0ZTosYXNzaWduKSBpZCBkZWxlZ2F0ZSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkoaW9zLGludHJvZHVjZWQ9Mi4wLGRlcHJlY2F0ZWQ9My4wKSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7bWV0aG9kICdzZXROZXdEZWxlZ2F0ZTonIGRlY2xhcmVkIGhlcmV9fSBleHBlY3RlZC1ub3RlIHt7cHJvcGVydHkgJ2RlbGVnYXRlJyBpcyBkZWNsYXJlZCBkZXByZWNhdGVkIGhlcmV9fQorQHByb3BlcnR5KHNldHRlcj1zZXROZXdEZWxlZ2F0ZTosYXNzaWduKSBpZCBkZWxlZ2F0ZSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkoaW9zLGludHJvZHVjZWQ9Mi4wLGRlcHJlY2F0ZWQ9My4wKSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J3NldE5ld0RlbGVnYXRlOicgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0gZXhwZWN0ZWQtbm90ZSB7e3Byb3BlcnR5ICdkZWxlZ2F0ZScgaXMgZGVjbGFyZWQgZGVwcmVjYXRlZCBoZXJlfX0KIEBlbmQKIAogdm9pZCB0ZXN0Q3VzdG9tQWNjZXNzb3JOYW1lcyhDdXN0b21BY2Nlc3Nvck5hbWVzICpvYmopIHsKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvcHJvcGVydHktaW4tY2xhc3MtZXh0ZW5zaW9uLTEubSBiL3Rlc3QvU2VtYU9iakMvcHJvcGVydHktaW4tY2xhc3MtZXh0ZW5zaW9uLTEubQppbmRleCA1MTgzN2ZkLi5hYjQ2MWVmIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL3Byb3BlcnR5LWluLWNsYXNzLWV4dGVuc2lvbi0xLm0KKysrIGIvdGVzdC9TZW1hT2JqQy9wcm9wZXJ0eS1pbi1jbGFzcy1leHRlbnNpb24tMS5tCkBAIC04LDIwICs4LDE5IEBACiAKIEBwcm9wZXJ0eSAobm9uYXRvbWljLCByZWFkb25seSkgTlNTdHJpbmcqIGFkZGluZ01lbW9yeU1vZGVsOwogCi1AcHJvcGVydHkgKG5vbmF0b21pYywgY29weSwgcmVhZG9ubHkpIE5TU3RyaW5nKiBtYXRjaGluZ01lbW9yeU1vZGVsOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cHJvcGVydHkgYXR0cmlidXRlcyAncmVhZG9ubHknIGFuZCAnY29weScgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZX19CitAcHJvcGVydHkgKG5vbmF0b21pYywgY29weSwgcmVhZG9ubHkpIE5TU3RyaW5nKiBtYXRjaGluZ01lbW9yeU1vZGVsOwogCi1AcHJvcGVydHkgKG5vbmF0b21pYywgcmV0YWluLCByZWFkb25seSkgTlNTdHJpbmcqIGFkZGluZ05vTmV3TWVtb3J5TW9kZWw7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3twcm9wZXJ0eSBhdHRyaWJ1dGVzICdyZWFkb25seScgYW5kICdyZXRhaW4nIGFyZSBtdXR1YWxseSBleGNsdXNpdmV9fQorQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbiwgcmVhZG9ubHkpIE5TU3RyaW5nKiBhZGRpbmdOb05ld01lbW9yeU1vZGVsOwogCiBAcHJvcGVydHkgKHJlYWRvbmx5KSBOU1N0cmluZyogbm9uZTsKIEBwcm9wZXJ0eSAocmVhZG9ubHkpIE5TU3RyaW5nKiBub25lMTsKIAotQHByb3BlcnR5IChhc3NpZ24sIHJlYWRvbmx5KSBOU1N0cmluZyogY2hhbmdlTWVtb3J5TW9kZWw7IC8vIGV4cGVjdGVkLW5vdGUge3twcm9wZXJ0eSBkZWNsYXJlZCBoZXJlfX0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3twcm9wZXJ0eSBhdHRyaWJ1dGVzICdyZWFkb25seScgYW5kICdhc3NpZ24nIGFyZSBtdXR1YWxseSBleGNsdXNpdmV9fQorQHByb3BlcnR5IChhc3NpZ24sIHJlYWRvbmx5KSBOU1N0cmluZyogY2hhbmdlTWVtb3J5TW9kZWw7IC8vIGV4cGVjdGVkLW5vdGUge3twcm9wZXJ0eSBkZWNsYXJlZCBoZXJlfX0KIAogQHByb3BlcnR5IChyZWFkb25seSkgX193ZWFrIGlkIHdlYWtfcHJvcDsKIEBwcm9wZXJ0eSAocmVhZG9ubHkpIF9fd2VhayBpZCB3ZWFrX3Byb3AxOwogCi1AcHJvcGVydHkgKGFzc2lnbiwgcmVhZG9ubHkpIE5TU3RyaW5nKiBhc3NpZ25Qcm9wZXJ0eTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Byb3BlcnR5IGF0dHJpYnV0ZXMgJ3JlYWRvbmx5JyBhbmQgJ2Fzc2lnbicgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZX19CitAcHJvcGVydHkgKGFzc2lnbiwgcmVhZG9ubHkpIE5TU3RyaW5nKiBhc3NpZ25Qcm9wZXJ0eTsKIAogQHByb3BlcnR5IChyZWFkb25seSkgTlNTdHJpbmcqIHJlYWRvbmx5UHJvcDsKIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9wcm9wZXJ0eS1pbmhlcml0ZWQubSBiL3Rlc3QvU2VtYU9iakMvcHJvcGVydHktaW5oZXJpdGVkLm0KaW5kZXggZjVmMWI0Mi4uY2QyMjNkZCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9wcm9wZXJ0eS1pbmhlcml0ZWQubQorKysgYi90ZXN0L1NlbWFPYmpDL3Byb3BlcnR5LWluaGVyaXRlZC5tCkBAIC00NCwzICs0NCwyOSBAQAogQHByb3BlcnR5KGFzc2lnbikgRGF0YSAqcF9iYXNlOwkKIEBwcm9wZXJ0eShhc3NpZ24pIE5TRGF0YSAqcF9kYXRhOwkvLyBleHBlY3RlZC13YXJuaW5ne3twcm9wZXJ0eSB0eXBlICdOU0RhdGEgKicgaXMgaW5jb21wYXRpYmxlIHdpdGggdHlwZSAnTlNNdXRhYmxlRGF0YSAqJyBpbmhlcml0ZWQgZnJvbSAnQmFzZSd9fQogQGVuZAorCisvLyByZGFyOi8vMTU5Njc1MTcKK0Bwcm90b2NvbCBQMQorQHByb3BlcnR5IChub25hdG9taWMpIHZvaWQqIHNlbGVjdGVkOworQGVuZAorCitAcHJvdG9jb2wgUDIKK0Bwcm9wZXJ0eSAobm9uYXRvbWljKSB2b2lkKiBzZWxlY3RlZDsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Byb3BlcnR5IGRlY2xhcmVkIGhlcmV9fQorQGVuZAorCitAaW50ZXJmYWNlIE1LQW5ub3RhdGlvblZpZXcgPFAxPgorQHByb3BlcnR5IChub25hdG9taWMpIHZvaWQqIHNlbGVjdGVkOyAvLyBleHBlY3RlZC1ub3RlIHt7cHJvcGVydHkgZGVjbGFyZWQgaGVyZX19CitAcHJvcGVydHkgKG5vbmF0b21pYykgY2hhciBzZWxlY3RlZDI7CitAZW5kCisKK0BpbnRlcmZhY2UgUGFyZW50IDogTUtBbm5vdGF0aW9uVmlldyA8UDI+CitAcHJvcGVydHkgKG5vbmF0b21pYykgdm9pZCogc2VsZWN0ZWQxOyAvLyBleHBlY3RlZC1ub3RlIHt7cHJvcGVydHkgZGVjbGFyZWQgaGVyZX19CitAcHJvcGVydHkgKG5vbmF0b21pYykgY2hhciBzZWxlY3RlZDI7CitAZW5kCisKK0BpbnRlcmZhY2UgQ2hpbGQgOiBQYXJlbnQKK0Bwcm9wZXJ0eSAobm9uYXRvbWljKSBjaGFyIHNlbGVjdGVkOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cHJvcGVydHkgdHlwZSAnY2hhcicgaXMgaW5jb21wYXRpYmxlIHdpdGggdHlwZSAndm9pZCAqJyBpbmhlcml0ZWQgZnJvbSAnTUtBbm5vdGF0aW9uVmlldyd9fSBcCisJCQkJICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7cHJvcGVydHkgdHlwZSAnY2hhcicgaXMgaW5jb21wYXRpYmxlIHdpdGggdHlwZSAndm9pZCAqJyBpbmhlcml0ZWQgZnJvbSAnUDInfX0KK0Bwcm9wZXJ0eSAobm9uYXRvbWljKSBjaGFyIHNlbGVjdGVkMTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Byb3BlcnR5IHR5cGUgJ2NoYXInIGlzIGluY29tcGF0aWJsZSB3aXRoIHR5cGUgJ3ZvaWQgKicgaW5oZXJpdGVkIGZyb20gJ1BhcmVudCd9fQorQHByb3BlcnR5IChub25hdG9taWMpIGNoYXIgc2VsZWN0ZWQyOworQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9wcm9wZXJ0eS1ub25pbmhlcml0ZWQtYXZhaWxhYmlsaXR5LWF0dHIubSBiL3Rlc3QvU2VtYU9iakMvcHJvcGVydHktbm9uaW5oZXJpdGVkLWF2YWlsYWJpbGl0eS1hdHRyLm0KaW5kZXggMGMyYTVkMy4uNzkzY2ViNiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9wcm9wZXJ0eS1ub25pbmhlcml0ZWQtYXZhaWxhYmlsaXR5LWF0dHIubQorKysgYi90ZXN0L1NlbWFPYmpDL3Byb3BlcnR5LW5vbmluaGVyaXRlZC1hdmFpbGFiaWxpdHktYXR0ci5tCkBAIC0xLDE3ICsxLDE2IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtbWFjb3N4MTAuOC4wIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcwogCi0vLyBUaGlzIHRlc3QgY2FzZSBzaG93cyB0aGF0ICdhdmFpbGFibGl0eScgYW5kICdkZXByZWNhdGVkJyBkb2VzIG5vdCBpbmhlcml0CisvLyBUaGlzIHRlc3QgY2FzZSBzaG93cyB0aGF0ICdhdmFpbGFiaWxpdHknIGFuZCAnZGVwcmVjYXRlZCcgZG8gbm90IGluaGVyaXQKIC8vIHdoZW4gYSBwcm9wZXJ0eSBpcyByZWRlY2xhcmVkIGluIGEgc3ViY2xhc3MuICBUaGlzIGlzIGludGVudGlvbmFsLgogCiBAaW50ZXJmYWNlIE5TT2JqZWN0IEBlbmQKIEBwcm90b2NvbCBteVByb3RvY29sCi1AcHJvcGVydHkgaW50IG15UHJvdG9jb2xQcm9wZXJ0eSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNyxkZXByZWNhdGVkPTEwLjgpKSk7IC8vIGV4cGVjdGVkLW5vdGUge3ttZXRob2QgJ215UHJvdG9jb2xQcm9wZXJ0eScgZGVjbGFyZWQgaGVyZX19IFwKK0Bwcm9wZXJ0eSBpbnQgbXlQcm90b2NvbFByb3BlcnR5IF9fYXR0cmlidXRlX18oKGF2YWlsYWJpbGl0eShtYWNvc3gsaW50cm9kdWNlZD0xMC43LGRlcHJlY2F0ZWQ9MTAuOCkpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydteVByb3RvY29sUHJvcGVydHknIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3Byb3BlcnR5ICdteVByb3RvY29sUHJvcGVydHknIGlzIGRlY2xhcmVkIGRlcHJlY2F0ZWQgaGVyZX19CiBAZW5kCiAKIEBpbnRlcmZhY2UgRm9vIDogTlNPYmplY3QKLUBwcm9wZXJ0eSBpbnQgbXlQcm9wZXJ0eSBfX2F0dHJpYnV0ZV9fKChhdmFpbGFiaWxpdHkobWFjb3N4LGludHJvZHVjZWQ9MTAuNyxkZXByZWNhdGVkPTEwLjgpKSk7ICAvLyBleHBlY3RlZC1ub3RlIHt7J215UHJvcGVydHknIGRlY2xhcmVkIGhlcmV9fSBcCi0JCQkJCQkJCS8vIGV4cGVjdGVkLW5vdGUge3ttZXRob2QgJ215UHJvcGVydHknIGRlY2xhcmVkIGhlcmV9fSBcCitAcHJvcGVydHkgaW50IG15UHJvcGVydHkgX19hdHRyaWJ1dGVfXygoYXZhaWxhYmlsaXR5KG1hY29zeCxpbnRyb2R1Y2VkPTEwLjcsZGVwcmVjYXRlZD0xMC44KSkpOyAgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7J215UHJvcGVydHknIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19IFwKIAkJCQkJCQkJLy8gZXhwZWN0ZWQtbm90ZSB7e3Byb3BlcnR5ICdteVByb3BlcnR5JyBpcyBkZWNsYXJlZCBkZXByZWNhdGVkIGhlcmV9fQogQGVuZAogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL3Byb3BlcnR5LXR5cGVjaGVjay0xLm0gYi90ZXN0L1NlbWFPYmpDL3Byb3BlcnR5LXR5cGVjaGVjay0xLm0KaW5kZXggNThkMGYyMS4uNWZiMDVjOCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9wcm9wZXJ0eS10eXBlY2hlY2stMS5tCisrKyBiL3Rlc3QvU2VtYU9iakMvcHJvcGVydHktdHlwZWNoZWNrLTEubQpAQCAtOTMsNyArOTMsNyBAQAogIHJldHVybiBjb250YWluZXIucGllY2VzOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7dHlwZSBvZiBwcm9wZXJ0eSAncGllY2VzJyBkb2VzIG5vdCBtYXRjaCB0eXBlIG9mIGFjY2Vzc29yICdwaWVjZXMnfX0KIH0KIAotLSAoaWQpZmlyc3RQZWljZQorLSAoaWQpZmlyc3RQaWVjZQogewogICByZXR1cm4gY29udGFpbmVyLmZpcnN0OwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9wcm90b2NvbC1hdHRyaWJ1dGUubSBiL3Rlc3QvU2VtYU9iakMvcHJvdG9jb2wtYXR0cmlidXRlLm0KaW5kZXggYjJhZWNjMi4uNTJiZDQ0MSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy9wcm90b2NvbC1hdHRyaWJ1dGUubQorKysgYi90ZXN0L1NlbWFPYmpDL3Byb3RvY29sLWF0dHJpYnV0ZS5tCkBAIC02LDcgKzYsNyBAQAogQ2xhc3MgPEZ3UHJvdG8+IGNGdyA9IDA7ICAvLyBleHBlY3RlZC1lcnJvciB7eydGd1Byb3RvJyBpcyB1bmF2YWlsYWJsZX19CiAKIAotX19hdHRyaWJ1dGUgKChkZXByZWNhdGVkKSkgQHByb3RvY29sIE15UHJvdG8xIC8vIGV4cGVjdGVkLW5vdGUgNyB7e2RlY2xhcmVkIGhlcmV9fQorX19hdHRyaWJ1dGUgKChkZXByZWNhdGVkKSkgQHByb3RvY29sIE15UHJvdG8xIC8vIGV4cGVjdGVkLW5vdGUgNyB7eydNeVByb3RvMScgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIEBlbmQKIAogQHByb3RvY29sIFByb3RvMiAgPE15UHJvdG8xPiAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydNeVByb3RvMScgaXMgZGVwcmVjYXRlZH19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL3Byb3RvY29scy1zdXBwcmVzcy1jb25mb3JtYW5jZS5tIGIvdGVzdC9TZW1hT2JqQy9wcm90b2NvbHMtc3VwcHJlc3MtY29uZm9ybWFuY2UubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTllNDRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hT2JqQy9wcm90b2NvbHMtc3VwcHJlc3MtY29uZm9ybWFuY2UubQpAQCAtMCwwICsxLDIwNyBAQAorLy8gUlVOOiAlY2xhbmdfY2MxICAtdHJpcGxlIHg4Nl82NC1hcHBsZS1kYXJ3aW4xMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMgLVduby1vYmpjLXJvb3QtY2xhc3MKKworLy8gTWFyayB0aGlzIHByb3RvY29sIGFzIHJlcXVpcmluZyBhbGwgb2YgaXRzIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMKKy8vIHRvIGJlIGV4cGxpY2l0bHkgaW1wbGVtZW50ZWQgaW4gdGhlIGFkb3B0aW5nIGNsYXNzLgorX19hdHRyaWJ1dGVfXygob2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbikpCitAcHJvdG9jb2wgUHJvdG9jb2wKKy0gKHZvaWQpIHRoZUJlc3RPZlRpbWVzOyAvLyBleHBlY3RlZC1ub3RlIHt7bWV0aG9kICd0aGVCZXN0T2ZUaW1lcycgZGVjbGFyZWQgaGVyZX19CitAcHJvcGVydHkgKHJlYWRvbmx5KSBpZCB0aGVXb3JzdE9mVGltZXM7IC8vIGV4cGVjdGVkLW5vdGUge3twcm9wZXJ0eSBkZWNsYXJlZCBoZXJlfX0KK0BlbmQKKworLy8gSW4gdGhpcyBleGFtcGxlLCBDbGFzc0EgYWRvcHRzIHRoZSBwcm90b2NvbC4gIFdlIHdvbid0CisvLyBwcm92aWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlLCBidXQgdGhpcyBwcm90b2NvbCB3aWxsCisvLyBiZSBhZG9wdGVkIGxhdGVyIGJ5IGEgc3ViY2xhc3MuCitAaW50ZXJmYWNlIENsYXNzQSA8UHJvdG9jb2w+CistICh2b2lkKSB0aGVCZXN0T2ZUaW1lczsKK0Bwcm9wZXJ0eSAocmVhZG9ubHkpIGlkIHRoZVdvcnN0T2ZUaW1lczsKK0BlbmQKKworLy8gVGhpcyBjbGFzcyBzdWJjbGFzc2VzIENsYXNzQSAod2hpY2ggYWxzbyBhZG9wdHMgJ1Byb3RvY29sJykuCitAaW50ZXJmYWNlIENsYXNzQiA6IENsYXNzQSA8UHJvdG9jb2w+CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBDbGFzc0IgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Byb3BlcnR5ICd0aGVXb3JzdE9mVGltZXMnIHJlcXVpcmVzIG1ldGhvZCAndGhlV29yc3RPZlRpbWVzJyB0byBiZSBkZWZpbmVkIC0gdXNlIEBzeW50aGVzaXplLCBAZHluYW1pYyBvciBwcm92aWRlIGEgbWV0aG9kIGltcGxlbWVudGF0aW9uIGluIHRoaXMgY2xhc3MgaW1wbGVtZW50YXRpb259fQorQGVuZAorCitAaW50ZXJmYWNlIENsYXNzQl9Hb29kIDogQ2xhc3NBIDxQcm90b2NvbD4KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIENsYXNzQl9Hb29kIC8vIG5vLXdhcm5pbmcKKy0gKHZvaWQpIHRoZUJlc3RPZlRpbWVzIHt9CitAZHluYW1pYyB0aGVXb3JzdE9mVGltZXM7CitAZW5kCisKK0BpbnRlcmZhY2UgQ2xhc3NCX0Fsc29Hb29kIDogQ2xhc3NBIDxQcm90b2NvbD4KK0Bwcm9wZXJ0eSAocmVhZG9ubHkpIGlkIHRoZVdvcnN0T2ZUaW1lczsKK0BlbmQKKworLy8gRGVmYXVsdCBzeW50aGVzaXMgYWN0cyBhcyBpZiBAZHluYW1pYworLy8gaGFkIGJlZW4gd3JpdHRlbiBmb3IgJ3RoZVdvcnN0T2ZUaW1lcycgYmVjYXVzZQorLy8gaXQgaXMgZGVjbGFyZWQgaW4gQ2xhc3NBLiAgVGhpcyBpcyBva2F5LCBzaW5jZQorLy8gdGhlIGF1dGhvciBvZiBDbGFzc0JfQWxzb0dvb2QgbmVlZHMgZXhwbGljaXRseQorLy8gd3JpdGUgQHByb3BlcnR5IGluIHRoZSBAaW50ZXJmYWNlLgorQGltcGxlbWVudGF0aW9uIENsYXNzQl9BbHNvR29vZCAvLyBuby13YXJuaW5nCistICh2b2lkKSB0aGVCZXN0T2ZUaW1lcyB7fQorQGVuZAorCisvLyBUZXN0IHRoYXQgaW5oZXJpdGVkIHByb3RvY29scyBkbyBub3QgZ2V0IHRoZSBleHBsaWNpdCBjb25mb3JtYW5jZSByZXF1aXJlbWVudC4KK0Bwcm90b2NvbCBJbmhlcml0ZWQKKy0gKHZvaWQpIGZhaXJJc0ZvdWw7CitAZW5kCisKK19fYXR0cmlidXRlX18oKG9iamNfcHJvdG9jb2xfcmVxdWlyZXNfZXhwbGljaXRfaW1wbGVtZW50YXRpb24pKQorQHByb3RvY29sIERlcml2ZWQgPEluaGVyaXRlZD4KKy0gKHZvaWQpIGZvdWxJc0ZhaXI7IC8vIGV4cGVjdGVkLW5vdGUge3ttZXRob2QgJ2ZvdWxJc0ZhaXInIGRlY2xhcmVkIGhlcmV9fQorQGVuZAorCitAaW50ZXJmYWNlIENsYXNzQyA8SW5oZXJpdGVkPgorQGVuZAorCitAaW50ZXJmYWNlIENsYXNzRCA6IENsYXNzQyA8RGVyaXZlZD4KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIENsYXNzRCAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWV0aG9kICdmb3VsSXNGYWlyJyBpbiBwcm90b2NvbCAnRGVyaXZlZCcgbm90IGltcGxlbWVudGVkfX0KK0BlbmQKKworLy8gVGVzdCB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBjb3JyZWN0bHkuCitfX2F0dHJpYnV0ZV9fKChvYmpjX3Byb3RvY29sX3JlcXVpcmVzX2V4cGxpY2l0X2ltcGxlbWVudGF0aW9uKDErMikpKSAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSB0YWtlcyBubyBhcmd1bWVudHN9fQorQHByb3RvY29sIEFub3RoZXJQcm90b2NvbCBAZW5kCisKKy8vIENhbm5vdCBwdXQgdGhlIGF0dHJpYnV0ZSBvbiBjbGFzc2VzIG9yIG90aGVyIG5vbi1wcm90b2NvbCBkZWNsYXJhdGlvbnMuCitfX2F0dHJpYnV0ZV9fKChvYmpjX3Byb3RvY29sX3JlcXVpcmVzX2V4cGxpY2l0X2ltcGxlbWVudGF0aW9uKSkgLy8gZXhwZWN0ZWQtZXJyb3Ige3thdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIE9iamVjdGl2ZS1DIHByb3RvY29sc319CitAaW50ZXJmYWNlIEFub3RoZXJDbGFzcyBAZW5kCisKK19fYXR0cmlidXRlX18oKG9iamNfcHJvdG9jb2xfcmVxdWlyZXNfZXhwbGljaXRfaW1wbGVtZW50YXRpb24pKSAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gT2JqZWN0aXZlLUMgcHJvdG9jb2xzfX0KK2ludCB4OworCisvLyBUZXN0IHRoYXQgaW5oZXJpdGVkIHByb3RvY29scyB3aXRoIHRoZSBhdHRyaWJ1dGUKKy8vIGFyZSB0cmVhdGVkIHByb3Blcmx5LgorX19hdHRyaWJ1dGVfXygob2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbikpCitAcHJvdG9jb2wgUHJvdG9jb2xBCitAcmVxdWlyZWQKKy0gKHZvaWQpcmx5ZWg7IC8vIGV4cGVjdGVkLW5vdGUgMiB7e21ldGhvZCAncmx5ZWgnIGRlY2xhcmVkIGhlcmV9fQorLSAodm9pZClpbm5zbW91dGg7IC8vIGV4cGVjdGVkLW5vdGUgMiB7e21ldGhvZCAnaW5uc21vdXRoJyBkZWNsYXJlZCBoZXJlfX0KK0BlbmQKKworQHByb3RvY29sIFByb3RvY29sQiA8UHJvdG9jb2xBPgorQHJlcXVpcmVkCistICh2b2lkKWR1bndpY2g7CistICh2b2lkKWlubnNtb3V0aDsgLy8gZXhwZWN0ZWQtbm90ZSB7e21ldGhvZCAnaW5uc21vdXRoJyBkZWNsYXJlZCBoZXJlfX0KK0BlbmQKKworX19hdHRyaWJ1dGVfXygob2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbikpCitAcHJvdG9jb2wgUHJvdG9jb2xCX0V4cGxpY2l0IDxQcm90b2NvbEE+CitAcmVxdWlyZWQKKy0gKHZvaWQpZHVud2ljaDsKKy0gKHZvaWQpaW5uc21vdXRoOyAvLyBleHBlY3RlZC1ub3RlIDIge3ttZXRob2QgJ2lubnNtb3V0aCcgZGVjbGFyZWQgaGVyZX19CitAZW5kCisKK0Bwcm90b2NvbCBQcm90b2NvbEMKK0ByZXF1aXJlZAorLSAodm9pZClybHllaDsKKy0gKHZvaWQpaW5uc21vdXRoOworLSAodm9pZClkdW53aWNoOworQGVuZAorCitAaW50ZXJmYWNlIE15T2JqZWN0IDxQcm90b2NvbEM+IEBlbmQKKworLy8gUHJvdmlkZSB0d28gdmFyaWFudHMgb2YgYSBiYXNlIGNsYXNzLCBvbmUgdGhhdCBhZG9wdHMgUHJvdG9jb2xBIGFuZAorLy8gb25lIHRoYXQgZG9lcyBub3QuCitAaW50ZXJmYWNlIExvdmVjcmFmdCA8UHJvdG9jb2xBPiBAZW5kCitAaW50ZXJmYWNlIExvdmVjcmFmdF8yIEBlbmQKKworLy8gUHJvdmlkZSB0d28gdmFyaWFudHMgb2YgYSBzdWJjbGFzcyB0aGF0IGNvbmZvcm0gdG8gUHJvdG9jb2xCLiAgT25lCisvLyBzdWJjbGFzc2VzIGZyb20gYSBjbGFzcyB0aGF0IGNvbmZvcm1zIHRvIFByb3RvY29sQSwgdGhlIG90aGVyIHRoYXQKKy8vIGRvZXMgbm90LgorLy8KKy8vIEZyb20gdGhvc2UsIHByb3ZpZGUgdHdvIHZhcmlhbnRzIHRoYXQgY29uZm9ybWF0IHRvIFByb3RvY29sQl9FeHBsaWNpdAorLy8gaW5zdGVhZC4KK0BpbnRlcmZhY2UgU2hvZ2dvdGggOiBMb3ZlY3JhZnQgPFByb3RvY29sQj4gQGVuZAorQGludGVyZmFjZSBTaG9nZ290aF8yIDogTG92ZWNyYWZ0XzIgPFByb3RvY29sQj4gQGVuZAorQGludGVyZmFjZSBTaG9nZ290aF9FeHBsaWNpdCA6IExvdmVjcmFmdCA8UHJvdG9jb2xCX0V4cGxpY2l0PiBAZW5kCitAaW50ZXJmYWNlIFNob2dnb3RoXzJfRXhwbGljaXQgOiBMb3ZlY3JhZnRfMiA8UHJvdG9jb2xCX0V4cGxpY2l0PiBAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBNeU9iamVjdAorLSAodm9pZClpbm5zbW91dGgge30KKy0gKHZvaWQpcmx5ZWgge30KKy0gKHZvaWQpZHVud2ljaCB7fQorQGVuZAorCitAaW1wbGVtZW50YXRpb24gTG92ZWNyYWZ0CistICh2b2lkKWlubnNtb3V0aCB7fQorLSAodm9pZClybHllaCB7fQorQGVuZAorCitAaW1wbGVtZW50YXRpb24gU2hvZ2dvdGgKKy0gKHZvaWQpZHVud2ljaCB7fQorQGVuZAorCitAaW1wbGVtZW50YXRpb24gU2hvZ2dvdGhfMiAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWV0aG9kICdpbm5zbW91dGgnIGluIHByb3RvY29sICdQcm90b2NvbEInIG5vdCBpbXBsZW1lbnRlZH19XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21ldGhvZCAncmx5ZWgnIGluIHByb3RvY29sICdQcm90b2NvbEEnIG5vdCBpbXBsZW1lbnRlZH19XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydpbm5zbW91dGgnIGluIHByb3RvY29sICdQcm90b2NvbEEnIG5vdCBpbXBsZW1lbnRlZH19IAorLSAodm9pZClkdW53aWNoIHt9CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBTaG9nZ290aF9FeHBsaWNpdCAvLyBleHBlY3RlZC13YXJuaW5nIHt7bWV0aG9kICdpbm5zbW91dGgnIGluIHByb3RvY29sICdQcm90b2NvbEJfRXhwbGljaXQnIG5vdCBpbXBsZW1lbnRlZH19CistICh2b2lkKWR1bndpY2gge30KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFNob2dnb3RoXzJfRXhwbGljaXQgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21ldGhvZCAnaW5uc21vdXRoJyBpbiBwcm90b2NvbCAnUHJvdG9jb2xCX0V4cGxpY2l0JyBub3QgaW1wbGVtZW50ZWR9fVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2QgJ3JseWVoJyBpbiBwcm90b2NvbCAnUHJvdG9jb2xBJyBub3QgaW1wbGVtZW50ZWR9fVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2QgJ2lubnNtb3V0aCcgaW4gcHJvdG9jb2wgJ1Byb3RvY29sQScgbm90IGltcGxlbWVudGVkfX0KKy0gKHZvaWQpZHVud2ljaCB7fQorQGVuZAorCisvLyBDYXRlZ29yaWVzIGFkb3B0aW5nIGEgcHJvdG9jb2wgd2l0aCBleHBsaWNpdCBjb25mb3JtYW5jZSBuZWVkIHRvIGltcGxlbWVudCB0aGF0IHByb3RvY29sLgorQGludGVyZmFjZSBQYXJlbnQKKy0gKHZvaWQpIHRoZUJlc3RPZlRpbWVzOworQHByb3BlcnR5IChyZWFkb25seSkgaWQgdGhlV29yc3RPZlRpbWVzOworQGVuZAorCitAaW50ZXJmYWNlIERlcml2ZWQgOiBQYXJlbnQKK0BlbmQKKworQGludGVyZmFjZSBEZXJpdmVkIChNeUNhdCkgPFByb3RvY29sPgorQGVuZAorCitAaW1wbGVtZW50YXRpb24gRGVyaXZlZCAoTXlDYXQpIC8vIGV4cGVjdGVkLXdhcm5pbmcge3ttZXRob2QgJ3RoZUJlc3RPZlRpbWVzJyBpbiBwcm90b2NvbCAnUHJvdG9jb2wnIG5vdCBpbXBsZW1lbnRlZH19CitAZW5kCisKK19fYXR0cmlidXRlX18oKG9iamNfcHJvdG9jb2xfcmVxdWlyZXNfZXhwbGljaXRfaW1wbGVtZW50YXRpb24pKSAgLy8gZXhwZWN0ZWQtZXJyb3J7e2F0dHJpYnV0ZSAnb2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbicgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBAcHJvdG9jb2wgZGVmaW5pdGlvbnMsIG5vdCBmb3J3YXJkIGRlY2xhcmF0aW9uc319CitAcHJvdG9jb2wgTm90RGVmaW5lZDsKKworLy8gQW5vdGhlciBjb21wbGV0ZSBoaWVyYXJjaHkuCisgX19hdHRyaWJ1dGVfXygob2JqY19wcm90b2NvbF9yZXF1aXJlc19leHBsaWNpdF9pbXBsZW1lbnRhdGlvbikpCitAcHJvdG9jb2wgRXgyRm9vQmFyCistICh2b2lkKW1ldGhvZEE7CitAZW5kCisKKyBfX2F0dHJpYnV0ZV9fKChvYmpjX3Byb3RvY29sX3JlcXVpcmVzX2V4cGxpY2l0X2ltcGxlbWVudGF0aW9uKSkKK0Bwcm90b2NvbCBFeDJQcm90b2NvbEEKKy0gKHZvaWQpbWV0aG9kQjsKK0BlbmQKKworIF9fYXR0cmlidXRlX18oKG9iamNfcHJvdG9jb2xfcmVxdWlyZXNfZXhwbGljaXRfaW1wbGVtZW50YXRpb24pKQorQHByb3RvY29sIEV4MlByb3RvY29sQiA8RXgyUHJvdG9jb2xBPgorLSAodm9pZCltZXRob2RBOyAvLyBleHBlY3RlZC1ub3RlIHt7bWV0aG9kICdtZXRob2RBJyBkZWNsYXJlZCBoZXJlfX0KK0BlbmQKKworLy8gTk9UIHJlcXVpcmVkCitAcHJvdG9jb2wgRXgyUHJvdG9jb2xDIDxFeDJQcm90b2NvbEE+CistICh2b2lkKW1ldGhvZEI7CistICh2b2lkKW1ldGhvZEE7CitAZW5kCisKK0BpbnRlcmZhY2UgRXgyQ2xhc3NBIDxFeDJQcm90b2NvbEMsIEV4MkZvb0Jhcj4KK0BlbmQKK0BpbXBsZW1lbnRhdGlvbiBFeDJDbGFzc0EKKy0gKHZvaWQpbWV0aG9kQiB7fQorLSAodm9pZCltZXRob2RBIHt9CitAZW5kCisKK0BpbnRlcmZhY2UgRXgyQ2xhc3NCIDogRXgyQ2xhc3NBIDxFeDJQcm90b2NvbEI+CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBFeDJDbGFzc0IgLy8gZXhwZWN0ZWQtd2FybmluZyB7e21ldGhvZCAnbWV0aG9kQScgaW4gcHJvdG9jb2wgJ0V4MlByb3RvY29sQicgbm90IGltcGxlbWVudGVkfX0KK0BlbmQKKwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9zZWxlY3Rvci0xLm0gYi90ZXN0L1NlbWFPYmpDL3NlbGVjdG9yLTEubQppbmRleCAxODZlMTlmLi4wZDgzZDQ3IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL3NlbGVjdG9yLTEubQorKysgYi90ZXN0L1NlbWFPYmpDL3NlbGVjdG9yLTEubQpAQCAtMSwxOCArMSwxNyBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgJXMgCi0vLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcworLy8gUlVOOiAlY2xhbmdfY2MxICAtV3NlbGVjdG9yLXR5cGUtbWlzbWF0Y2ggLXZlcmlmeSAlcyAKIAogQGludGVyZmFjZSBJCi0tIChpZCkgY29tcGFyZTogKGNoYXIpIGFyZzE7CistIChpZCkgY29tcGFyZTogKGNoYXIpIGFyZzE7IC8vIGV4cGVjdGVkLW5vdGUge3ttZXRob2QgJ2NvbXBhcmU6JyBkZWNsYXJlZCBoZXJlfX0KIC0gbGVuZ3RoOwogQGVuZAogCiBAaW50ZXJmYWNlIEoKLS0gKGlkKSBjb21wYXJlOiAoaWQpIGFyZzE7CistIChpZCkgY29tcGFyZTogKGlkKSBhcmcxOyAvLyBleHBlY3RlZC1ub3RlIHt7bWV0aG9kICdjb21wYXJlOicgZGVjbGFyZWQgaGVyZX19CiBAZW5kCiAKIFNFTCBmdW5jKCkKIHsKLQlyZXR1cm4gQHNlbGVjdG9yKGNvbXBhcmU6KTsJLy8gTm9uIHdhcm5pbmcgb24gbXVsdGlwbGUgc2VsZWN0b3IgZm91bmQuCisJcmV0dXJuIEBzZWxlY3Rvcihjb21wYXJlOik7CS8vIGV4cGVjdGVkLXdhcm5pbmcge3tzZXZlcmFsIG1ldGhvZHMgd2l0aCBzZWxlY3RvciAnY29tcGFyZTonIG9mIG1pc21hdGNoZWQgdHlwZXMgYXJlIGZvdW5kIGZvciB0aGUgQHNlbGVjdG9yIGV4cHJlc3Npb259fQogfQogCiBpbnQgbWFpbigpIHsKQEAgLTI3LDMgKzI2LDI2IEBACiAKICBTRUwgczkgPSBAc2VsZWN0b3IoOmVudW06Ym9vbDopOwogfQorCisvLyByZGFyOi8vMTU3OTQwNTUKK0BpbnRlcmZhY2UgTlNPYmplY3QgQGVuZAorCitAY2xhc3MgTlNOdW1iZXI7CisKK0BpbnRlcmZhY2UgWEJSZWNpcGUgOiBOU09iamVjdAorQHByb3BlcnR5IChub25hdG9taWMsIGFzc2lnbikgZmxvYXQgZmluYWxWb2x1bWU7IC8vIGV4cGVjdGVkLW5vdGUge3ttZXRob2QgJ3NldEZpbmFsVm9sdW1lOicgZGVjbGFyZWQgaGVyZX19CitAZW5kCisKK0BpbnRlcmZhY2UgWEJEb2N1bWVudCA6IE5TT2JqZWN0CitAZW5kCisKK0BpbnRlcmZhY2UgWEJEb2N1bWVudCAoKQorLSAodm9pZClzZXRGaW5hbFZvbHVtZTooTlNOdW1iZXIgKilmaW5hbFZvbHVtZU51bWJlcjsgLy8gZXhwZWN0ZWQtbm90ZSB7e21ldGhvZCAnc2V0RmluYWxWb2x1bWU6JyBkZWNsYXJlZCBoZXJlfX0KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFhCRG9jdW1lbnQKKy0gKHZvaWQpc2V0RmluYWxWb2x1bWU6KE5TTnVtYmVyICopZmluYWxWb2x1bWVOdW1iZXIKK3sKKyAgICAodm9pZClAc2VsZWN0b3Ioc2V0RmluYWxWb2x1bWU6KTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3NldmVyYWwgbWV0aG9kcyB3aXRoIHNlbGVjdG9yICdzZXRGaW5hbFZvbHVtZTonIG9mIG1pc21hdGNoZWQgdHlwZXMgYXJlIGZvdW5kIGZvciB0aGUgQHNlbGVjdG9yIGV4cHJlc3Npb259fQorfQorQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9zZWxlY3Rvci0zLm0gYi90ZXN0L1NlbWFPYmpDL3NlbGVjdG9yLTMubQppbmRleCBkNzgyYzc4Li5jOTM0ZGJjIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL3NlbGVjdG9yLTMubQorKysgYi90ZXN0L1NlbWFPYmpDL3NlbGVjdG9yLTMubQpAQCAtMTQsNyArMTQsNyBAQAogLSAodm9pZCkgZm9vCiB7CiAgIFNFTCBhLGIsYzsKLSAgYSA9IEBzZWxlY3RvcihiMWFyKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjcmVhdGluZyBzZWxlY3RvciBmb3Igbm9uZXhpc3RlbnQgbWV0aG9kICdiMWFyJ319CisgIGEgPSBAc2VsZWN0b3IoYjFhcik7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7bm8gbWV0aG9kIHdpdGggc2VsZWN0b3IgJ2IxYXInIGlzIGltcGxlbWVudGVkIGluIHRoaXMgdHJhbnNsYXRpb24gdW5pdH19CiAgIGIgPSBAc2VsZWN0b3IoYmFyKTsKIH0KIEBlbmQKQEAgLTI1LDcgKzI1LDcgQEAKIAogU0VMIGZ1bmMoKQogewotICAgIHJldHVybiAgQHNlbGVjdG9yKGxlbmd0aCk7ICAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y3JlYXRpbmcgc2VsZWN0b3IgZm9yIG5vbmV4aXN0ZW50IG1ldGhvZCAnbGVuZ3RoJ319CisgICAgcmV0dXJuICBAc2VsZWN0b3IobGVuZ3RoKTsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tubyBtZXRob2Qgd2l0aCBzZWxlY3RvciAnbGVuZ3RoJyBpcyBpbXBsZW1lbnRlZCBpbiB0aGlzIHRyYW5zbGF0aW9uIHVuaXR9fQogfQogCiAvLyByZGFyOi8vOTU0NTU2NApAQCAtNjksNyArNjksNyBAQAogCiBAaW1wbGVtZW50YXRpb24gSU5URgogLSAodm9pZCkgTWV0aCB7Ci0gIGlmKCBbY254IHJlc3BvbmRzVG9TZWxlY3RvcjpNeVNlbGVjdG9yKEBzZWxlY3RvciggX3NldFF1ZXVlOiApKV0gKSAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y3JlYXRpbmcgc2VsZWN0b3IgZm9yIG5vbmV4aXN0ZW50IG1ldGhvZCAnX3NldFF1ZXVlOid9fSAKKyAgaWYoIFtjbnggcmVzcG9uZHNUb1NlbGVjdG9yOk15U2VsZWN0b3IoQHNlbGVjdG9yKCBfc2V0UXVldWU6ICkpXSApIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tubyBtZXRob2Qgd2l0aCBzZWxlY3RvciAnX3NldFF1ZXVlOicgaXMgaW1wbGVtZW50ZWQgaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0fX0KICAgewogICB9CiAKQEAgLTg0LDIzICs4NCwyMyBAQAogCiAvLyByZGFyOi8vMTQwMDcxOTQKIEBpbnRlcmZhY2UgVXhUZWNoVGVzdCA6IE5TT2JqZWN0Ci0tIChpbnQpIGludmFsaWRhdGUgOiAoaWQpQXJnOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7bXVsdGlwbGUgc2VsZWN0b3JzIG5hbWVkICdpbnZhbGlkYXRlOicgZm91bmR9fQotKyAoaW50KSBDX2ludmFsaWRhdGUgOiAoaW50KWFyZzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e211bHRpcGxlIHNlbGVjdG9ycyBuYW1lZCAnQ19pbnZhbGlkYXRlOicgZm91bmR9fQorLSAoaW50KSBpbnZhbGlkYXRlIDogKGlkKUFyZzsKKysgKGludCkgQ19pbnZhbGlkYXRlIDogKGludClhcmc7CiBAZW5kCiAKIEBpbnRlcmZhY2UgVXhUZWNoVGVzdChDQVQpCi0tIChjaGFyKSBpbnZhbGlkYXRlIDogKGludClhcmc7IC8vIGV4cGVjdGVkLW5vdGUge3thbHNvIGZvdW5kfX0KLSsgKGludCkgQ19pbnZhbGlkYXRlIDogKGNoYXIpYXJnOyAvLyBleHBlY3RlZC1ub3RlIHt7YWxzbyBmb3VuZH19CistIChjaGFyKSBpbnZhbGlkYXRlIDogKGludClhcmc7CisrIChpbnQpIENfaW52YWxpZGF0ZSA6IChjaGFyKWFyZzsKIEBlbmQKIAogQGludGVyZmFjZSBOU1BvcnQgOiBOU09iamVjdAotLSAoZG91YmxlKSBpbnZhbGlkYXRlIDogKHZvaWQqKUFyZzE7IC8vIGV4cGVjdGVkLW5vdGUge3thbHNvIGZvdW5kfX0KLSsgKGludCkgQ19pbnZhbGlkYXRlIDogKGlkKilhcmc7IC8vIGV4cGVjdGVkLW5vdGUge3thbHNvIGZvdW5kfX0KKy0gKGRvdWJsZSkgaW52YWxpZGF0ZSA6ICh2b2lkKilBcmcxOworKyAoaW50KSBDX2ludmFsaWRhdGUgOiAoaWQqKWFyZzsKIEBlbmQKIAogCiBAaW50ZXJmYWNlIFVTRVRleHQgOiBOU1BvcnQKLS0gKGludCkgaW52YWxpZGF0ZSA6IChpbnQpYXJnOyAvLyBleHBlY3RlZC1ub3RlIHt7YWxzbyBmb3VuZH19CistIChpbnQpIGludmFsaWRhdGUgOiAoaW50KWFyZzsKIEBlbmQKIAogQGltcGxlbWVudGF0aW9uIFVTRVRleHQKQEAgLTExMCwzICsxMTAsMjcgQEAKIEBpbnRlcmZhY2UgVVNFVGV4dFN1YiA6IFVTRVRleHQKIC0gKGludCkgaW52YWxpZGF0ZSA6IChpZClhcmc7CiBAZW5kCisKKy8vIHJkYXI6Ly8xNjQyODYzOAorQGludGVyZmFjZSBJMTY0Mjg2MzgKKy0gKGludCkgY29tcGFyZTogKEkxNjQyODYzOCAqKSBhcmcxOyAvLyBjb21tZW50aW5nIG91dCB0aGlzIGxpbmUgYXZvaWRzIHRoZSB3YXJuaW5nCitAZW5kCisKK0BpbnRlcmZhY2UgSjE2NDI4NjM4CistIChpbnQpIGNvbXBhcmU6IChKMTY0Mjg2MzggKikgYXJnMTsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEoxNjQyODYzOAorLSAodm9pZCltZXRob2QgeworICAgIFNFTCBzID0gQHNlbGVjdG9yKGNvbXBhcmU6KTsgLy8gc3B1cmlvdXMgd2FybmluZworICAgICh2b2lkKXM7Cit9CistIChpbnQpIGNvbXBhcmU6IChKMTY0Mjg2MzggKikgYXJnMSB7CisgICAgcmV0dXJuIDA7Cit9CitAZW5kCisKK3ZvaWQgdGVzdDE2NDI4NjM4KCkgeworICAgIFNFTCBzID0gQHNlbGVjdG9yKGNvbXBhcmU6KTsKKyAgICAodm9pZClzOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy9zZWxlY3Rvci1vdmVybG9hZC5tIGIvdGVzdC9TZW1hT2JqQy9zZWxlY3Rvci1vdmVybG9hZC5tCmluZGV4IDUzYmE2ZjcuLjQ0NzYwN2EgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvc2VsZWN0b3Itb3ZlcmxvYWQubQorKysgYi90ZXN0L1NlbWFPYmpDL3NlbGVjdG9yLW92ZXJsb2FkLm0KQEAgLTEsNCArMSw1IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgJXMgLWZzeW50YXgtb25seQorLy8gRklYTUU6IFRoaXMgdGVzdCBuZWVkcyBuZWVkcyB0byBiZSBydW4gd2l0aCAtdmVyaWZ5CiAKIEBpbnRlcmZhY2UgTlNPYmplY3QKICsgYWxsb2M7CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL3NwZWNpYWwtZGVwLXVuYXZhaWwtd2FybmluZy5tIGIvdGVzdC9TZW1hT2JqQy9zcGVjaWFsLWRlcC11bmF2YWlsLXdhcm5pbmcubQppbmRleCBhMTc5NjQ3Li45ZTE2YjMzIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL3NwZWNpYWwtZGVwLXVuYXZhaWwtd2FybmluZy5tCisrKyBiL3Rlc3QvU2VtYU9iakMvc3BlY2lhbC1kZXAtdW5hdmFpbC13YXJuaW5nLm0KQEAgLTQsNDggKzQsNDggQEAKIEBpbnRlcmZhY2UgQgogLSAodm9pZCkgZGVwSW5BOwogLSAodm9pZCkgdW5hdmFpbE1ldGggX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2hhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQotLSAodm9pZCkgZGVwSW5BMSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CistICh2b2lkKSBkZXBJbkExIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydkZXBJbkExJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogLSAodm9pZCkgdW5hdmFpbE1ldGgxOwotLSAodm9pZCkgZGVwSW5BMiBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CistICh2b2lkKSBkZXBJbkEyIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydkZXBJbkEyJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogLSAodm9pZCkgdW5hdmFpbE1ldGgyIF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSk7IC8vIGV4cGVjdGVkLW5vdGUge3toYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCB1bmF2YWlsYWJsZSBoZXJlfX0KIC0gKHZvaWQpIGRlcHVuYXZhaWxJbkE7CiAtICh2b2lkKSBkZXB1bmF2YWlsSW5BMSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2hhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQotLSAodm9pZClGdXp6eU1ldGggX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworLSAodm9pZClGdXp6eU1ldGggX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J0Z1enp5TWV0aCcgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIC0gKHZvaWQpRnV6enlNZXRoMSBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOwogQGVuZAogCiBAaW50ZXJmYWNlIEEKIC0gKHZvaWQpIHVuYXZhaWxNZXRoMSBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7aGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgdW5hdmFpbGFibGUgaGVyZX19Ci0tICh2b2lkKSBkZXBJbkEgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworLSAodm9pZCkgZGVwSW5BIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydkZXBJbkEnIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIGRlcHJlY2F0ZWQgaGVyZX19CiAtICh2b2lkKSBkZXBJbkEyIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKIC0gKHZvaWQpIGRlcEluQTE7CiAtICh2b2lkKSB1bmF2YWlsTWV0aDIgX19hdHRyaWJ1dGVfXygodW5hdmFpbGFibGUpKTsgCiAtICh2b2lkKSBkZXB1bmF2YWlsSW5BIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKSBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSkpOyAvLyBleHBlY3RlZC1ub3RlIHt7aGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgdW5hdmFpbGFibGUgaGVyZX19CiAtICh2b2lkKSBkZXB1bmF2YWlsSW5BMTsKIC0gKHZvaWQpRnV6enlNZXRoIF9fYXR0cmlidXRlX18oKHVuYXZhaWxhYmxlKSk7Ci0tICh2b2lkKUZ1enp5TWV0aDEgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOworLSAodm9pZClGdXp6eU1ldGgxIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7eydGdXp6eU1ldGgxJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogQGVuZAogCiAKLUBjbGFzcyBDOwkvLyBleHBlY3RlZC1ub3RlIDUge3tmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGNsYXNzIGhlcmV9fQorQGNsYXNzIEM7CS8vIGV4cGVjdGVkLW5vdGUgMTAge3tmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGNsYXNzIGhlcmV9fQogCiB2b2lkIHRlc3QoQyAqYykgewotICBbYyBkZXBJbkFdOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2RlcEluQScgbWF5YmUgZGVwcmVjYXRlZCBiZWNhdXNlIHJlY2VpdmVyIHR5cGUgaXMgdW5rbm93bn19Ci0gIFtjIHVuYXZhaWxNZXRoXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyd1bmF2YWlsTWV0aCcgbWF5YmUgdW5hdmFpbGFibGUgYmVjYXVzZSByZWNlaXZlciB0eXBlIGlzIHVua25vd259fQotICBbYyBkZXBJbkExXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydkZXBJbkExJyBtYXliZSBkZXByZWNhdGVkIGJlY2F1c2UgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3dufX0KLSAgW2MgdW5hdmFpbE1ldGgxXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyd1bmF2YWlsTWV0aDEnIG1heWJlIHVuYXZhaWxhYmxlIGJlY2F1c2UgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3dufX0KLSAgW2MgZGVwSW5BMl07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZGVwSW5BMicgbWF5YmUgZGVwcmVjYXRlZCBiZWNhdXNlIHJlY2VpdmVyIHR5cGUgaXMgdW5rbm93bn19Ci0gIFtjIHVuYXZhaWxNZXRoMl07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sndW5hdmFpbE1ldGgyJyBtYXliZSB1bmF2YWlsYWJsZSBiZWNhdXNlIHJlY2VpdmVyIHR5cGUgaXMgdW5rbm93bn19Ci0gIFtjIGRlcHVuYXZhaWxJbkFdOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2RlcHVuYXZhaWxJbkEnIG1heWJlIHVuYXZhaWxhYmxlIGJlY2F1c2UgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3dufX0gCi0gIFtjIGRlcHVuYXZhaWxJbkExXTsvLyBleHBlY3RlZC13YXJuaW5nIHt7J2RlcHVuYXZhaWxJbkExJyBtYXliZSB1bmF2YWlsYWJsZSBiZWNhdXNlIHJlY2VpdmVyIHR5cGUgaXMgdW5rbm93bn19Ci0gIFtjIEZ1enp5TWV0aF07ICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydGdXp6eU1ldGgnIG1heWJlIGRlcHJlY2F0ZWQgYmVjYXVzZSByZWNlaXZlciB0eXBlIGlzIHVua25vd259fQotICBbYyBGdXp6eU1ldGgxXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydGdXp6eU1ldGgxJyBtYXliZSBkZXByZWNhdGVkIGJlY2F1c2UgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3dufX0KKyAgW2MgZGVwSW5BXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydkZXBJbkEnIG1heSBiZSBkZXByZWNhdGVkIGJlY2F1c2UgdGhlIHJlY2VpdmVyIHR5cGUgaXMgdW5rbm93bn19CisgIFtjIHVuYXZhaWxNZXRoXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyd1bmF2YWlsTWV0aCcgbWF5IGJlIHVuYXZhaWxhYmxlIGJlY2F1c2UgdGhlIHJlY2VpdmVyIHR5cGUgaXMgdW5rbm93bn19CisgIFtjIGRlcEluQTFdOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2RlcEluQTEnIG1heSBiZSBkZXByZWNhdGVkIGJlY2F1c2UgdGhlIHJlY2VpdmVyIHR5cGUgaXMgdW5rbm93bn19CisgIFtjIHVuYXZhaWxNZXRoMV07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3sndW5hdmFpbE1ldGgxJyBtYXkgYmUgdW5hdmFpbGFibGUgYmVjYXVzZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3dufX0KKyAgW2MgZGVwSW5BMl07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZGVwSW5BMicgbWF5IGJlIGRlcHJlY2F0ZWQgYmVjYXVzZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3dufX0KKyAgW2MgdW5hdmFpbE1ldGgyXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eyd1bmF2YWlsTWV0aDInIG1heSBiZSB1bmF2YWlsYWJsZSBiZWNhdXNlIHRoZSByZWNlaXZlciB0eXBlIGlzIHVua25vd259fQorICBbYyBkZXB1bmF2YWlsSW5BXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydkZXB1bmF2YWlsSW5BJyBtYXkgYmUgdW5hdmFpbGFibGUgYmVjYXVzZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3dufX0gCisgIFtjIGRlcHVuYXZhaWxJbkExXTsvLyBleHBlY3RlZC13YXJuaW5nIHt7J2RlcHVuYXZhaWxJbkExJyBtYXkgYmUgdW5hdmFpbGFibGUgYmVjYXVzZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3dufX0KKyAgW2MgRnV6enlNZXRoXTsgICAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0Z1enp5TWV0aCcgbWF5IGJlIGRlcHJlY2F0ZWQgYmVjYXVzZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3dufX0KKyAgW2MgRnV6enlNZXRoMV07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snRnV6enlNZXRoMScgbWF5IGJlIGRlcHJlY2F0ZWQgYmVjYXVzZSB0aGUgcmVjZWl2ZXIgdHlwZSBpcyB1bmtub3dufX0KIAogfQogCiAvLyByZGFyOi8vMTAyNjg0MjIKIF9fYXR0cmlidXRlICgoZGVwcmVjYXRlZCkpCi1AaW50ZXJmYWNlIERFUFJFQ0FURUQgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorQGludGVyZmFjZSBERVBSRUNBVEVEIC8vIGV4cGVjdGVkLW5vdGUge3snREVQUkVDQVRFRCcgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KICsoaWQpbmV3OwogQGVuZAogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDL3RlbnRhdGl2ZS1wcm9wZXJ0eS1kZWNsLm0gYi90ZXN0L1NlbWFPYmpDL3RlbnRhdGl2ZS1wcm9wZXJ0eS1kZWNsLm0KaW5kZXggYWE3ZGY1Mi4uYTk2NDliNiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy90ZW50YXRpdmUtcHJvcGVydHktZGVjbC5tCisrKyBiL3Rlc3QvU2VtYU9iakMvdGVudGF0aXZlLXByb3BlcnR5LWRlY2wubQpAQCAtMSwxMCArMSwxMSBAQAogLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLVdldmVyeXRoaW5nIC12ZXJpZnkgJXMKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCiAvLyByZGFyOi8vMTE2NTY5ODIKLS8qKiBOb3JtYWxseSwgYSBwcm9wZXJ0eSBjYW5ub3QgYmUgYm90aCAncmVhZG9ubHknIGFuZCBoYXZpbmcgYSAid3JpdGUiIGF0dHJpYnV0ZQorLyoqIEEgcHJvcGVydHkgbWF5IG5vdCBiZSBib3RoICdyZWFkb25seScgYW5kIGhhdmluZyBhIG1lbW9yeSBtYW5hZ2VtZW50IGF0dHJpYnV0ZQogICAgIChjb3B5L3JldGFpbi9ldGMuKS4gQnV0LCBwcm9wZXJ0eSBkZWNsYXJhdGlvbiBpbiBwcmltYXJ5IGNsYXNzIGFuZCBwcm90Y29scwogICAgIGFyZSB0ZW50YXRpdmUgYXMgdGhleSBtYXkgYmUgb3ZlcnJpZGRlbiBpbnRvIGEgJ3JlYWR3cml0ZScgcHJvcGVydHkgaW4gY2xhc3MgCi0gICAgZXh0ZW5zaW9ucy4gUG9zdHBvbmUgZGlhZ25vc2luZyBzdWNoIHdhcm5pbmdzIHVudGlsIHRoZSBjbGFzcyBpbXBsZW1lbnRhdGlvbiAKLSAgICBpcyBzZWVuLgorICAgIGV4dGVuc2lvbnMuIFNvLCBkbyBub3QgaXNzdWUgYW55IHdhcm5pbmcgb24gJ3JlYWRvbmx5JyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQKKyAgICBhdHRyaWJ1dGVzIGluIGEgcHJvcGVydHkuCiAqLwogCiBAaW50ZXJmYWNlIFN1cGVyIHsKQEAgLTE0LDggKzE1LDggQEAKIEBjbGFzcyBOU1N0cmluZzsKIAogQGludGVyZmFjZSBNeUNsYXNzIDogU3VwZXIKLUBwcm9wZXJ0eShub25hdG9taWMsIGNvcHksIHJlYWRvbmx5KSBOU1N0cmluZyAqcHJvcDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Byb3BlcnR5IGF0dHJpYnV0ZXMgJ3JlYWRvbmx5JyBhbmQgJ2NvcHknIGFyZSBtdXR1YWxseSBleGNsdXNpdmV9fQotQHByb3BlcnR5KG5vbmF0b21pYywgY29weSwgcmVhZG9ubHkpIGlkIHdhcm5Qcm9wOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7cHJvcGVydHkgYXR0cmlidXRlcyAncmVhZG9ubHknIGFuZCAnY29weScgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZX19CitAcHJvcGVydHkobm9uYXRvbWljLCBjb3B5LCByZWFkb25seSkgTlNTdHJpbmcgKnByb3A7CitAcHJvcGVydHkobm9uYXRvbWljLCBjb3B5LCByZWFkb25seSkgaWQgd2FyblByb3A7CiBAZW5kCiAKIEBpbnRlcmZhY2UgTXlDbGFzcyAoKQpAQCAtMjksOCArMzAsOCBAQAogCiAKIEBwcm90b2NvbCBQCi1AcHJvcGVydHkobm9uYXRvbWljLCBjb3B5LCByZWFkb25seSkgTlNTdHJpbmcgKnByb3A7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3twcm9wZXJ0eSBhdHRyaWJ1dGVzICdyZWFkb25seScgYW5kICdjb3B5JyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlfX0KLUBwcm9wZXJ0eShub25hdG9taWMsIGNvcHksIHJlYWRvbmx5KSBpZCB3YXJuUHJvcDsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3Byb3BlcnR5IGF0dHJpYnV0ZXMgJ3JlYWRvbmx5JyBhbmQgJ2NvcHknIGFyZSBtdXR1YWxseSBleGNsdXNpdmV9fQorQHByb3BlcnR5KG5vbmF0b21pYywgY29weSwgcmVhZG9ubHkpIE5TU3RyaW5nICpwcm9wOworQHByb3BlcnR5KG5vbmF0b21pYywgY29weSwgcmVhZG9ubHkpIGlkIHdhcm5Qcm9wOwogQGVuZAogCiBAaW50ZXJmYWNlIFlvdXJDbGFzcyA6IFN1cGVyIDxQPgpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy91bmRlZi1wcm90b2NvbC1tZXRob2RzLTEubSBiL3Rlc3QvU2VtYU9iakMvdW5kZWYtcHJvdG9jb2wtbWV0aG9kcy0xLm0KaW5kZXggMjViMWRhZC4uNDg1OGZhZiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy91bmRlZi1wcm90b2NvbC1tZXRob2RzLTEubQorKysgYi90ZXN0L1NlbWFPYmpDL3VuZGVmLXByb3RvY29sLW1ldGhvZHMtMS5tCkBAIC0yMiwxMyArMjIsMTAgQEAKICsgKHZvaWQpIGNsc19tZXRoIDogKGludCkgYXJnMTsgICAvLyBleHBlY3RlZC1ub3RlIHt7bWV0aG9kICdjbHNfbWV0aDonIGRlY2xhcmVkIGhlcmV9fQogQGVuZAogCi1AaW50ZXJmYWNlIElOVEYgPFBST1RPPiAvLyBleHBlY3RlZC1ub3RlIDMge3tyZXF1aXJlZCBmb3IgZGlyZWN0IG9yIGluZGlyZWN0IHByb3RvY29sICdQUk9UTyd9fSBcCi0JCQkvLyBleHBlY3RlZC1ub3RlIDIge3tyZXF1aXJlZCBmb3IgZGlyZWN0IG9yIGluZGlyZWN0IHByb3RvY29sICdQMSd9fSBcCi0JCQkvLyBleHBlY3RlZC1ub3RlIDIge3tyZXF1aXJlZCBmb3IgZGlyZWN0IG9yIGluZGlyZWN0IHByb3RvY29sICdQMyd9fSBcCi0JCQkvLyBleHBlY3RlZC1ub3RlIDIge3tyZXF1aXJlZCBmb3IgZGlyZWN0IG9yIGluZGlyZWN0IHByb3RvY29sICdQMid9fQorQGludGVyZmFjZSBJTlRGIDxQUk9UTz4KIEBlbmQKIAotQGltcGxlbWVudGF0aW9uIElOVEYgLy8gZXhwZWN0ZWQtd2FybmluZyA5IHt7aW4gcHJvdG9jb2wgbm90IGltcGxlbWVudGVkfX0KK0BpbXBsZW1lbnRhdGlvbiBJTlRGIC8vIGV4cGVjdGVkLXdhcm5pbmcgOSB7e2luIHByb3RvY29sICd9fQogLSAodm9pZCkgRGVmUDFwcm90b3t9CiArICh2b2lkKSBEZWZDbHNQM1Byb3Rve30KIEBlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvdW5zdWVkLWJhY2tpbmctaXZhci13YXJuaW5nLm0gYi90ZXN0L1NlbWFPYmpDL3Vuc3VlZC1iYWNraW5nLWl2YXItd2FybmluZy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDdkZWE3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvU2VtYU9iakMvdW5zdWVkLWJhY2tpbmctaXZhci13YXJuaW5nLm0KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLyBSVU46ICVjbGFuZ19jYzEgIC1mc3ludGF4LW9ubHkgLVd1bnVzZWQtcHJvcGVydHktaXZhciAtdmVyaWZ5IC1Xbm8tb2JqYy1yb290LWNsYXNzICVzCi0vLyByZGFyOi8vMTQ5ODk5OTkKLQotQGludGVyZmFjZSBOU09iamVjdCBAZW5kCi0KLUBpbnRlcmZhY2UgRXhhbXBsZSA6IE5TT2JqZWN0Ci1AcHJvcGVydHkgKG5vbmF0b21pYywgY29weSkgaWQgdDsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Byb3BlcnR5IGRlY2xhcmVkIGhlcmV9fQotQHByb3BlcnR5IChub25hdG9taWMsIGNvcHkpIGlkIHU7IC8vIGV4cGVjdGVkLW5vdGUge3twcm9wZXJ0eSBkZWNsYXJlZCBoZXJlfX0KLUBwcm9wZXJ0eSAobm9uYXRvbWljLCBjb3B5KSBpZCB2OyAvLyBleHBlY3RlZC1ub3RlIHt7cHJvcGVydHkgZGVjbGFyZWQgaGVyZX19Ci1AcHJvcGVydHkgKG5vbmF0b21pYywgY29weSkgaWQgdzsKLUBwcm9wZXJ0eSAobm9uYXRvbWljLCBjb3B5KSBpZCB4OyAvLyBleHBlY3RlZC1ub3RlIHt7cHJvcGVydHkgZGVjbGFyZWQgaGVyZX19Ci1AcHJvcGVydHkgKG5vbmF0b21pYywgY29weSkgaWQgeTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Byb3BlcnR5IGRlY2xhcmVkIGhlcmV9fQotQHByb3BlcnR5IChub25hdG9taWMsIGNvcHkpIGlkIHo7Ci1AcHJvcGVydHkgKG5vbmF0b21pYywgY29weSkgaWQgb2s7Ci1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBFeGFtcGxlCi0tICh2b2lkKSBzZXRYOihpZCluZXdYIHsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpdmFyICdfeCcgd2hpY2ggYmFja3MgdGhlIHByb3BlcnR5IGlzIG5vdCByZWZlcmVuY2VkIGluIHRoaXMgcHJvcGVydHkncyBhY2Nlc3Nvcn19Ci0gICAgX3kgPSBuZXdYOwotfQotLSAoaWQpIHkgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aXZhciAnX3knIHdoaWNoIGJhY2tzIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGlzIHByb3BlcnR5J3MgYWNjZXNzb3J9fQotICByZXR1cm4gX3Y7Ci19Ci0KLS0gKHZvaWQpIHNldFY6KGlkKW5ld1YgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aXZhciAnX3YnIHdoaWNoIGJhY2tzIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGlzIHByb3BlcnR5J3MgYWNjZXNzb3J9fQotICAgIF95ID0gbmV3VjsKLX0KLQotLy8gTm8gd2FybmluZyBoZXJlIGJlY2F1c2UgdGhlcmUgaXMgbm8gYmFja2luZyBpdmFyLgotLy8gYm90aCBzZXR0ZXIvZ2V0dGVyIGFyZSB1c2VyIGRlZmluZWQuCi0tICh2b2lkKSBzZXRXOihpZCluZXdXIHsKLSAgICBfeSA9IG5ld1c7Ci19Ci0tIChpZCkgdyB7Ci0gIHJldHVybiBfdjsKLX0KLQotLSAoaWQpIHUgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7aXZhciAnX3UnIHdoaWNoIGJhY2tzIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGlzIHByb3BlcnR5J3MgYWNjZXNzb3J9fQotICByZXR1cm4gX3Y7Ci19Ci0KLUBzeW50aGVzaXplIG9rID0gb2tJdmFyOwotLSAodm9pZCkgc2V0T2s6KGlkKW5ld09rIHsKLSAgICBva0l2YXIgPSBuZXdPazsKLX0KLQotQHN5bnRoZXNpemUgdCA9IHRJdmFyOwotLSAodm9pZCkgc2V0VDooaWQpbmV3VCB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpdmFyICd0SXZhcicgd2hpY2ggYmFja3MgdGhlIHByb3BlcnR5IGlzIG5vdCByZWZlcmVuY2VkIGluIHRoaXMgcHJvcGVydHkncyBhY2Nlc3Nvcn19Ci0gICAgb2tJdmFyID0gbmV3VDsKLX0KLUBlbmQKLQotLy8gcmRhcjovLzE1NDczNDMyCi10eXBlZGVmIGNoYXIgQk9PTDsKLUBpbnRlcmZhY2UgQ2FsREFWU2VydmVyVmVyc2lvbiB7Ci0gIEJPT0wgX3N1cHBvcnRzVGltZVJhbmdlRmlsdGVyV2l0aG91dEVuZERhdGU7Ci19Ci1AcHJvcGVydHkgKG5vbmF0b21pYywgcmVhZG9ubHksbm9uYXRvbWljKSBCT09MIHN1cHBvcnRzVGltZVJhbmdlRmlsdGVyV2l0aG91dEVuZERhdGU7Ci1AZW5kCi0KLUBpbnRlcmZhY2UgQ2FsREFWQ29uY3JldGVTZXJ2ZXJWZXJzaW9uIDogQ2FsREFWU2VydmVyVmVyc2lvbiB7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgQ2FsZW5kYXJTZXJ2ZXJWZXJzaW9uIDogQ2FsREFWQ29uY3JldGVTZXJ2ZXJWZXJzaW9uCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBDYWxEQVZTZXJ2ZXJWZXJzaW9uCi1Ac3ludGhlc2l6ZSBzdXBwb3J0c1RpbWVSYW5nZUZpbHRlcldpdGhvdXRFbmREYXRlPV9zdXBwb3J0c1RpbWVSYW5nZUZpbHRlcldpdGhvdXRFbmREYXRlOwotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gQ2FsZW5kYXJTZXJ2ZXJWZXJzaW9uCi0tKEJPT0wpc3VwcG9ydHNUaW1lUmFuZ2VGaWx0ZXJXaXRob3V0RW5kRGF0ZSB7Ci0gIHJldHVybiAwOwotfQotQGVuZApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy91bnVzZWQtYmFja2luZy1pdmFyLXdhcm5pbmcubSBiL3Rlc3QvU2VtYU9iakMvdW51c2VkLWJhY2tpbmctaXZhci13YXJuaW5nLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwNjdjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYU9iakMvdW51c2VkLWJhY2tpbmctaXZhci13YXJuaW5nLm0KQEAgLTAsMCArMSwyMDMgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAgLWZzeW50YXgtb25seSAtV3VudXNlZC1wcm9wZXJ0eS1pdmFyIC12ZXJpZnkgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKKy8vIHJkYXI6Ly8xNDk4OTk5OQorCitAaW50ZXJmYWNlIE5TT2JqZWN0IEBlbmQKKworQGludGVyZmFjZSBFeGFtcGxlIDogTlNPYmplY3QKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBjb3B5KSBpZCB0OyAvLyBleHBlY3RlZC1ub3RlIHt7cHJvcGVydHkgZGVjbGFyZWQgaGVyZX19CitAcHJvcGVydHkgKG5vbmF0b21pYywgY29weSkgaWQgdTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Byb3BlcnR5IGRlY2xhcmVkIGhlcmV9fQorQHByb3BlcnR5IChub25hdG9taWMsIGNvcHkpIGlkIHY7IC8vIGV4cGVjdGVkLW5vdGUge3twcm9wZXJ0eSBkZWNsYXJlZCBoZXJlfX0KK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBjb3B5KSBpZCB3OworQHByb3BlcnR5IChub25hdG9taWMsIGNvcHkpIGlkIHg7IC8vIGV4cGVjdGVkLW5vdGUge3twcm9wZXJ0eSBkZWNsYXJlZCBoZXJlfX0KK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBjb3B5KSBpZCB5OyAvLyBleHBlY3RlZC1ub3RlIHt7cHJvcGVydHkgZGVjbGFyZWQgaGVyZX19CitAcHJvcGVydHkgKG5vbmF0b21pYywgY29weSkgaWQgejsKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBjb3B5KSBpZCBvazsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEV4YW1wbGUKKy0gKHZvaWQpIHNldFg6KGlkKW5ld1ggeyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2l2YXIgJ194JyB3aGljaCBiYWNrcyB0aGUgcHJvcGVydHkgaXMgbm90IHJlZmVyZW5jZWQgaW4gdGhpcyBwcm9wZXJ0eSdzIGFjY2Vzc29yfX0KKyAgICBfeSA9IG5ld1g7Cit9CistIChpZCkgeSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpdmFyICdfeScgd2hpY2ggYmFja3MgdGhlIHByb3BlcnR5IGlzIG5vdCByZWZlcmVuY2VkIGluIHRoaXMgcHJvcGVydHkncyBhY2Nlc3Nvcn19CisgIHJldHVybiBfdjsKK30KKworLSAodm9pZCkgc2V0VjooaWQpbmV3ViB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpdmFyICdfdicgd2hpY2ggYmFja3MgdGhlIHByb3BlcnR5IGlzIG5vdCByZWZlcmVuY2VkIGluIHRoaXMgcHJvcGVydHkncyBhY2Nlc3Nvcn19CisgICAgX3kgPSBuZXdWOworfQorCisvLyBObyB3YXJuaW5nIGhlcmUgYmVjYXVzZSB0aGVyZSBpcyBubyBiYWNraW5nIGl2YXIuCisvLyBib3RoIHNldHRlci9nZXR0ZXIgYXJlIHVzZXIgZGVmaW5lZC4KKy0gKHZvaWQpIHNldFc6KGlkKW5ld1cgeworICAgIF95ID0gbmV3VzsKK30KKy0gKGlkKSB3IHsKKyAgcmV0dXJuIF92OworfQorCistIChpZCkgdSB7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpdmFyICdfdScgd2hpY2ggYmFja3MgdGhlIHByb3BlcnR5IGlzIG5vdCByZWZlcmVuY2VkIGluIHRoaXMgcHJvcGVydHkncyBhY2Nlc3Nvcn19CisgIHJldHVybiBfdjsKK30KKworQHN5bnRoZXNpemUgb2sgPSBva0l2YXI7CistICh2b2lkKSBzZXRPazooaWQpbmV3T2sgeworICAgIG9rSXZhciA9IG5ld09rOworfQorCitAc3ludGhlc2l6ZSB0ID0gdEl2YXI7CistICh2b2lkKSBzZXRUOihpZCluZXdUIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2l2YXIgJ3RJdmFyJyB3aGljaCBiYWNrcyB0aGUgcHJvcGVydHkgaXMgbm90IHJlZmVyZW5jZWQgaW4gdGhpcyBwcm9wZXJ0eSdzIGFjY2Vzc29yfX0KKyAgICBva0l2YXIgPSBuZXdUOworfQorQGVuZAorCisvLyByZGFyOi8vMTU0NzM0MzIKK3R5cGVkZWYgY2hhciBCT09MOworQGludGVyZmFjZSBDYWxEQVZTZXJ2ZXJWZXJzaW9uIHsKKyAgQk9PTCBfc3VwcG9ydHNUaW1lUmFuZ2VGaWx0ZXJXaXRob3V0RW5kRGF0ZTsKK30KK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCByZWFkb25seSxub25hdG9taWMpIEJPT0wgc3VwcG9ydHNUaW1lUmFuZ2VGaWx0ZXJXaXRob3V0RW5kRGF0ZTsKK0BlbmQKKworQGludGVyZmFjZSBDYWxEQVZDb25jcmV0ZVNlcnZlclZlcnNpb24gOiBDYWxEQVZTZXJ2ZXJWZXJzaW9uIHsKK30KK0BlbmQKKworQGludGVyZmFjZSBDYWxlbmRhclNlcnZlclZlcnNpb24gOiBDYWxEQVZDb25jcmV0ZVNlcnZlclZlcnNpb24KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIENhbERBVlNlcnZlclZlcnNpb24KK0BzeW50aGVzaXplIHN1cHBvcnRzVGltZVJhbmdlRmlsdGVyV2l0aG91dEVuZERhdGU9X3N1cHBvcnRzVGltZVJhbmdlRmlsdGVyV2l0aG91dEVuZERhdGU7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBDYWxlbmRhclNlcnZlclZlcnNpb24KKy0oQk9PTClzdXBwb3J0c1RpbWVSYW5nZUZpbHRlcldpdGhvdXRFbmREYXRlIHsKKyAgcmV0dXJuIDA7Cit9CitAZW5kCisKKy8vIHJkYXI6Ly8xNTYzMDcxOQorQGludGVyZmFjZSBDREJNb2RpZnlSZWNvcmRzT3BlcmF0aW9uIDogTlNPYmplY3QKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCBhc3NpZ24pIEJPT0wgYXRvbWljOworQGVuZAorCitAY2xhc3MgTlNTdHJpbmc7CisKK0BpbXBsZW1lbnRhdGlvbiBDREJNb2RpZnlSZWNvcmRzT3BlcmF0aW9uCistICh2b2lkKXNldEF0b21pYzooQk9PTClhdG9taWMgeworICBpZiAoYXRvbWljID09IF9fb2JqY195ZXMpIHsKKyAgICBOU1N0cmluZyAqcmVjb3JkWm9uZUlEID0gMDsKKyAgfQorICBfYXRvbWljID0gYXRvbWljOworfQorQGVuZAorCisvLyByZGFyOi8vMTU3Mjg5MDEKK0BpbnRlcmZhY2UgR0FUVE9wZXJhdGlvbiA6IE5TT2JqZWN0IHsKKyAgICBsb25nIG9wZXJhdGlvbjsKK30KK0Bwcm9wZXJ0eShhc3NpZ24pIGxvbmcgb3BlcmF0aW9uOworQGVuZAorCitAaW1wbGVtZW50YXRpb24gR0FUVE9wZXJhdGlvbgorQHN5bnRoZXNpemUgb3BlcmF0aW9uOworKyAoaWQpIG9wZXJhdGlvbiB7CisgICAgcmV0dXJuIDA7Cit9CitAZW5kCisKKy8vIHJkYXI6Ly8xNTcyNzMyNworQGludGVyZmFjZSBSYWRhcjE1NzI3MzI3IDogTlNPYmplY3QKK0Bwcm9wZXJ0eSAoYXNzaWduLCByZWFkb25seSkgbG9uZyBwOworQHByb3BlcnR5IChhc3NpZ24pIGxvbmcgcTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7cHJvcGVydHkgZGVjbGFyZWQgaGVyZX19CitAcHJvcGVydHkgKGFzc2lnbiwgcmVhZG9ubHkpIGxvbmcgcjsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Byb3BlcnR5IGRlY2xhcmVkIGhlcmV9fQorLSAobG9uZylNZXRoOworQGVuZAorCitAaW1wbGVtZW50YXRpb24gUmFkYXIxNTcyNzMyNworQHN5bnRoZXNpemUgcDsKK0BzeW50aGVzaXplIHE7CitAc3ludGhlc2l6ZSByOworLSAobG9uZylNZXRoIHsgcmV0dXJuIHA7IH0KKy0gKGxvbmcpIHAgeyBbc2VsZiBNZXRoXTsgcmV0dXJuIDA7ICB9CistIChsb25nKSBxIHsgcmV0dXJuIDA7IH0gLy8gZXhwZWN0ZWQtd2FybmluZyB7e2l2YXIgJ3EnIHdoaWNoIGJhY2tzIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGlzIHByb3BlcnR5J3MgYWNjZXNzb3J9fQorLSAodm9pZCkgc2V0USA6IChsb25nKSB2YWwgeyB9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpdmFyICdxJyB3aGljaCBiYWNrcyB0aGUgcHJvcGVydHkgaXMgbm90IHJlZmVyZW5jZWQgaW4gdGhpcyBwcm9wZXJ0eSdzIGFjY2Vzc29yfX0KKy0gKGxvbmcpIHIgeyBbc2VsZiBNZXRoXTsgcmV0dXJuIHA7IH0gLy8gZXhwZWN0ZWQtd2FybmluZyB7e2l2YXIgJ3InIHdoaWNoIGJhY2tzIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGlzIHByb3BlcnR5J3MgYWNjZXNzb3J9fQorQGVuZAorCitAaW50ZXJmYWNlIEkxCitAcHJvcGVydHkgKHJlYWRvbmx5KSBpbnQgcDE7CitAcHJvcGVydHkgKHJlYWRvbmx5KSBpbnQgcDI7IC8vIGV4cGVjdGVkLW5vdGUge3twcm9wZXJ0eSBkZWNsYXJlZCBoZXJlfX0KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEkxCitAc3ludGhlc2l6ZSBwMT1fcDE7CitAc3ludGhlc2l6ZSBwMj1fcDI7CisKKy0oaW50KXAxIHsKKyAgcmV0dXJuIFtzZWxmIGdldFAxXTsKK30KKy0oaW50KWdldFAxIHsKKyAgcmV0dXJuIF9wMTsKK30KKy0oaW50KWdldFAyIHsKKyAgcmV0dXJuIF9wMjsKK30KKy0oaW50KXAyIHsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tpdmFyICdfcDInIHdoaWNoIGJhY2tzIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGlzIHByb3BlcnR5J3MgYWNjZXNzb3J9fQorICBSYWRhcjE1NzI3MzI3ICpvOworICByZXR1cm4gW28gTWV0aF07Cit9CitAZW5kCisKKy8vIHJkYXI6Ly8xNTg3MzQyNQorQHByb3RvY29sIE15UHJvdG9jb2wKK0Bwcm9wZXJ0eSAobm9uYXRvbWljLCByZWFkb25seSkgaW50IG15UHJvcGVydHk7CitAZW5kCisKK0BpbnRlcmZhY2UgTXlGaXJzdENsYXNzIDogTlNPYmplY3QgPE15UHJvdG9jb2w+CitAZW5kCisKK0BpbnRlcmZhY2UgTXlTZWNvbmRDbGFzcyA6IE5TT2JqZWN0IDxNeVByb3RvY29sPgorQGVuZAorCitAaW1wbGVtZW50YXRpb24gTXlGaXJzdENsYXNzCitAc3ludGhlc2l6ZSBteVByb3BlcnR5OworQGVuZAorCitAaW1wbGVtZW50YXRpb24gTXlTZWNvbmRDbGFzcworQGR5bmFtaWMgbXlQcm9wZXJ0eTsKKy0oaW50KW15UHJvcGVydHkgIC8vIHNob3VsZCBub3Qgd2FybjsgcHJvcGVydHkgaXMgZHluYW1pYworeworICAgIHJldHVybiAwOworfQorQGVuZAorCisvLyByZGFyOi8vMTU4OTAyNTEKK0BjbGFzcyBOU1VSTDsKKworQHByb3RvY29sIE1DQ0lEVVJMUHJvdG9jb2xEYXRhUHJvdmlkZXIKK0ByZXF1aXJlZAorQHByb3BlcnR5KHN0cm9uZywgYXRvbWljLCByZWFkb25seSkgTlNVUkwgKmNpZFVSTDsKK0Bwcm9wZXJ0eShzdHJvbmcsIGF0b21pYywgcmVhZG9ubHkpIE5TVVJMICpjaWRVUkwxOyAvLyBleHBlY3RlZC1ub3RlIHt7cHJvcGVydHkgZGVjbGFyZWQgaGVyZX19CitAZW5kCisKK0BpbnRlcmZhY2UgVW5yZWxhdGVkQ2xhc3MgOiBOU09iamVjdCA8TUNDSURVUkxQcm90b2NvbERhdGFQcm92aWRlcj4KK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFVucmVsYXRlZENsYXNzCitAc3ludGhlc2l6ZSBjaWRVUkwgPSBfY2lkVVJMOworQHN5bnRoZXNpemUgY2lkVVJMMSA9IF9jaWRVUkwxOworQGVuZAorCitAaW50ZXJmYWNlIE1VSVdlYkF0dGFjaG1lbnRDb250cm9sbGVyIDogTlNPYmplY3QgPE1DQ0lEVVJMUHJvdG9jb2xEYXRhUHJvdmlkZXI+CitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIE1VSVdlYkF0dGFjaG1lbnRDb250cm9sbGVyCistIChOU1VSTCAqKWNpZFVSTCB7CisgICAgcmV0dXJuIDA7Cit9CitAc3ludGhlc2l6ZSBjaWRVUkwxICA9IF9jaWRVUkwxOworLSAoTlNVUkwgKiljaWRVUkwxIHsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2l2YXIgJ19jaWRVUkwxJyB3aGljaCBiYWNrcyB0aGUgcHJvcGVydHkgaXMgbm90IHJlZmVyZW5jZWQgaW4gdGhpcyBwcm9wZXJ0eSdzIGFjY2Vzc29yfX0KKyAgICByZXR1cm4gMDsKK30KK0BlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvdW51c2VkLm0gYi90ZXN0L1NlbWFPYmpDL3VudXNlZC5tCmluZGV4IDNmZDFjZjAuLjE2YTM4OTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9iakMvdW51c2VkLm0KKysrIGIvdGVzdC9TZW1hT2JqQy91bnVzZWQubQpAQCAtNzIsMyArNzIsMTIgQEAKIC0gKHZvaWQpIGIge30KIC0gKHZvaWQpIGEgeyBbc2VsZiBiXTsgfQogQGVuZAorCisvLyBUZXN0IHRoYXQgb2JqY19wcmVjaXNlX2xpZmV0aW1lIHN1cHByZXNzZXMKKy8vIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncy4KK2V4dGVybiB2b2lkIHJkYXIxNTU5Njg4M19mb28odm9pZCk7Cit2b2lkIHJkYXIxNTU5Njg4MyhpZCB4KSB7CisgIF9fYXR0cmlidXRlX18oKG9iamNfcHJlY2lzZV9saWZldGltZSkpIGlkIHkgPSB4OyAvLyBuby13YXJuaW5nCisgIHJkYXIxNTU5Njg4M19mb28oKTsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy93YXJuLWRlcHJlY2F0ZWQtaW1wbGVtZW50YXRpb25zLm0gYi90ZXN0L1NlbWFPYmpDL3dhcm4tZGVwcmVjYXRlZC1pbXBsZW1lbnRhdGlvbnMubQppbmRleCBmNjM5NjJmLi42ZTIwOGI1IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL3dhcm4tZGVwcmVjYXRlZC1pbXBsZW1lbnRhdGlvbnMubQorKysgYi90ZXN0L1NlbWFPYmpDL3dhcm4tZGVwcmVjYXRlZC1pbXBsZW1lbnRhdGlvbnMubQpAQCAtMTEsMTMgKzExLDEzIEBACiBAZW5kCiAKIEBpbnRlcmZhY2UgQSgpCi0tICh2b2lkKSBFIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e21ldGhvZCAnRScgZGVjbGFyZWQgaGVyZX19CistICh2b2lkKSBFIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKIEBlbmQKIAogQGltcGxlbWVudGF0aW9uIEEKICsgKHZvaWQpRiB7IH0JLy8gTm8gd2FybmluZywgaW1wbGVtZW50aW5nIGl0cyBvd24gZGVwcmVjYXRlZCBtZXRob2QKIC0gKHZvaWQpIEQge30gLy8gIGV4cGVjdGVkLXdhcm5pbmcge3tJbXBsZW1lbnRpbmcgZGVwcmVjYXRlZCBtZXRob2R9fQotLSAodm9pZCkgRSB7fSAvLyAgZXhwZWN0ZWQtd2FybmluZyB7e0ltcGxlbWVudGluZyBkZXByZWNhdGVkIG1ldGhvZH19CistICh2b2lkKSBFIHt9IC8vIE5vIHdhcm5pbmcsIGltcGxlbWVudGluZyBkZXByZWNhdGVkIG1ldGhvZCBpbiBpdHMgY2xhc3MgZXh0ZW5zaW9uLgogQGVuZAogCiBAaW50ZXJmYWNlIEEoQ0FUKQpAQCAtMjksNyArMjksNyBAQAogQGVuZAogCiBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKLUBpbnRlcmZhY2UgQ0wgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7Y2xhc3MgZGVjbGFyZWQgaGVyZX19IC8vIGV4cGVjdGVkLW5vdGUgMiB7e2RlY2xhcmVkIGhlcmV9fQorQGludGVyZmFjZSBDTCAvLyBleHBlY3RlZC1ub3RlIDIge3tjbGFzcyBkZWNsYXJlZCBoZXJlfX0gLy8gZXhwZWN0ZWQtbm90ZSAyIHt7J0NMJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogQGVuZAogCiBAaW1wbGVtZW50YXRpb24gQ0wgLy8gZXhwZWN0ZWQtd2FybmluZyB7e0ltcGxlbWVudGluZyBkZXByZWNhdGVkIGNsYXNzfX0KQEAgLTUzLDMgKzUzLDE1IEBACiAtICh2b2lkKSBCIHt9IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tJbXBsZW1lbnRpbmcgZGVwcmVjYXRlZCBtZXRob2R9fQogQGVuZAogCitAaW50ZXJmYWNlIFRlc3QKK0BlbmQKKworQGludGVyZmFjZSBUZXN0KCkKKy0gKGlkKWluaXRTcGVjaWFsSW5Qcml2YXRlSGVhZGVyIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIFRlc3QKKy0gKGlkKWluaXRTcGVjaWFsSW5Qcml2YXRlSGVhZGVyIHsKKyAgcmV0dXJuICh2b2lkICopMDsKK30KK0BlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvd2Fybi1mb3J3YXJkLWNsYXNzLWF0dHItZGVwcmVjYXRlZC5tIGIvdGVzdC9TZW1hT2JqQy93YXJuLWZvcndhcmQtY2xhc3MtYXR0ci1kZXByZWNhdGVkLm0KaW5kZXggODU0ZmY2OS4uY2IxMThjMyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy93YXJuLWZvcndhcmQtY2xhc3MtYXR0ci1kZXByZWNhdGVkLm0KKysrIGIvdGVzdC9TZW1hT2JqQy93YXJuLWZvcndhcmQtY2xhc3MtYXR0ci1kZXByZWNhdGVkLm0KQEAgLTQsNyArNCw3IEBACiBAY2xhc3MgQUJHcm91cEltcG9ydEZpbGVzU2NvcGU7IC8vIGV4cGVjdGVkLW5vdGUge3tmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGNsYXNzIGhlcmV9fQogCiBAaW50ZXJmYWNlIEkxCi0tIChpZCkgZmlsZW5hbWVzIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsKKy0gKGlkKSBmaWxlbmFtZXMgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpOyAvLyBleHBlY3RlZC1ub3RlIHt7J2ZpbGVuYW1lcycgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIEBlbmQKIAogQGludGVyZmFjZSBJMgpAQCAtMTYsNyArMTYsNyBAQAogQGltcGxlbWVudGF0aW9uIEkyCiAtIChpZCkgTWV0aCA6IChBQkdyb3VwSW1wb3J0RmlsZXNTY29wZSopIHNjb3BlCiB7Ci0gIGlkIHAgPSAgW3NlbGYgaW5pdFdpdGhBY2NvdW50IDogMCBmaWxlbmFtZXMgOltzY29wZSBmaWxlbmFtZXNdXTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydmaWxlbmFtZXMnIG1heWJlIGRlcHJlY2F0ZWQgYmVjYXVzZSByZWNlaXZlciB0eXBlIGlzIHVua25vd259fQorICBpZCBwID0gIFtzZWxmIGluaXRXaXRoQWNjb3VudCA6IDAgZmlsZW5hbWVzIDpbc2NvcGUgZmlsZW5hbWVzXV07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snZmlsZW5hbWVzJyBtYXkgYmUgZGVwcmVjYXRlZCBiZWNhdXNlIHRoZSByZWNlaXZlciB0eXBlIGlzIHVua25vd259fQogICByZXR1cm4gMDsKIH0KIC0gKGlkKSBmaWxlbmFtZXMgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQy93YXJuLXByb3RvY29sLW1ldGhvZC1kZXByZWNhdGVkLm0gYi90ZXN0L1NlbWFPYmpDL3dhcm4tcHJvdG9jb2wtbWV0aG9kLWRlcHJlY2F0ZWQubQppbmRleCA5Mjg2OTRkLi43MGRkMzk0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDL3dhcm4tcHJvdG9jb2wtbWV0aG9kLWRlcHJlY2F0ZWQubQorKysgYi90ZXN0L1NlbWFPYmpDL3dhcm4tcHJvdG9jb2wtbWV0aG9kLWRlcHJlY2F0ZWQubQpAQCAtMyw3ICszLDcgQEAKIAogQHByb3RvY29sIFRlc3RQcm90b2NvbCAKIC0gKHZvaWQpbmV3UHJvdG9jb2xNZXRob2Q7Ci0tICh2b2lkKWRlcHJlY2F0ZWRQcm90b2NvbE1ldGhvZCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUgMiB7e21ldGhvZCAnZGVwcmVjYXRlZFByb3RvY29sTWV0aG9kJyBkZWNsYXJlZCBoZXJlfX0KKy0gKHZvaWQpZGVwcmVjYXRlZFByb3RvY29sTWV0aG9kIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKTsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7J2RlcHJlY2F0ZWRQcm90b2NvbE1ldGhvZCcgaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgZGVwcmVjYXRlZCBoZXJlfX0KIEBlbmQKIAogQGludGVyZmFjZSBOU09iamVjdCBAZW5kCkBAIC0xMSw3ICsxMSw3IEBACiBAaW50ZXJmYWNlIFRlc3RDbGFzcyA6IE5TT2JqZWN0IDxUZXN0UHJvdG9jb2w+CiAKIC0gKHZvaWQpbmV3SW5zdGFuY2VNZXRob2Q7Ci0tICh2b2lkKWRlcHJlY2F0ZWRJbnN0YW5jZU1ldGhvZCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUge3ttZXRob2QgJ2RlcHJlY2F0ZWRJbnN0YW5jZU1ldGhvZCcgZGVjbGFyZWQgaGVyZX19CistICh2b2lkKWRlcHJlY2F0ZWRJbnN0YW5jZU1ldGhvZCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7IC8vIGV4cGVjdGVkLW5vdGUge3snZGVwcmVjYXRlZEluc3RhbmNlTWV0aG9kJyBoYXMgYmVlbiBleHBsaWNpdGx5IG1hcmtlZCBkZXByZWNhdGVkIGhlcmV9fQogCiBAZW5kCiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakMvd2Fybi11bnJlYWNoYWJsZS5tIGIvdGVzdC9TZW1hT2JqQy93YXJuLXVucmVhY2hhYmxlLm0KaW5kZXggODMyY2JkMi4uMzY2NzY3NiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQy93YXJuLXVucmVhY2hhYmxlLm0KKysrIGIvdGVzdC9TZW1hT2JqQy93YXJuLXVucmVhY2hhYmxlLm0KQEAgLTEsNCArMSw0IEBACi0vLyBSVU46ICVjbGFuZyAlcyAtZnN5bnRheC1vbmx5IC1YY2xhbmcgLXZlcmlmeSAtZmJsb2NrcyAtV3VucmVhY2hhYmxlLWNvZGUgLVduby11bnVzZWQtdmFsdWUgLVduby1jb3ZlcmVkLXN3aXRjaC1kZWZhdWx0CisvLyBSVU46ICVjbGFuZyAlcyAtZnN5bnRheC1vbmx5IC1YY2xhbmcgLXZlcmlmeSAtZmJsb2NrcyAtV3VucmVhY2hhYmxlLWNvZGUtYWdncmVzc2l2ZSAtV25vLXVudXNlZC12YWx1ZSAtV25vLWNvdmVyZWQtc3dpdGNoLWRlZmF1bHQKIAogLy8gVGhpcyBwcmV2aW91c2x5IHRyaWdnZXJlZCBhIHdhcm5pbmcgZnJvbSAtV3VucmVhY2hhYmxlLWNvZGUgYmVjYXVzZSBvZgogLy8gYSBidXN0ZWQgQ0ZHLgpAQCAtMTUsMyArMTUsNzAgQEAKICAgcmV0dXJuOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19CiB9CiAKKyNkZWZpbmUgTk8gX19vYmpjX25vCisjZGVmaW5lIFlFUyBfX29iamNfeWVzCisjZGVmaW5lIENPTkZJRyBOTworCisvLyBUZXN0IHRoYXQgJ05PJyBhbmQgJ1lFUycgYXJlIG5vdCB0cmVhdGVkIGFzIGNvbmZpZ3VyYXRpb24gbWFjcm9zLgoraW50IHRlc3RfTk8oKSB7CisgIGlmIChOTykKKyAgICByZXR1cm4gMTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fQorICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB0ZXN0X1lFUygpIHsKKyAgaWYgKFlFUykKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19Cit9CisKK2ludCB0ZXN0X0NPTkZJRygpIHsKKyAgaWYgKENPTkZJRykKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvLyBGSVhNRTogVGhpcyBzaG91bGQgYXQgc29tZSBwb2ludCByZXBvcnQgYSB3YXJuaW5nCisvLyB0aGF0IHRoZSBsb29wIGluY3JlbWVudCBpcyB1bnJlYWNoYWJsZS4KK3ZvaWQgdGVzdF9sb29wX2luY3JlbWVudChpZCBjb250YWluZXIpIHsKKyAgZm9yIChpZCB4IGluIGNvbnRhaW5lcikgeyAvLyBuby13YXJuaW5nCisgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBjYWxsZWRGdW4oKSB7fQorCisvLyBUZXN0ICJzaWxlbmNpbmciIHdpdGggcGFyZW50aGVzZXMuCit2b2lkIHRlc3Rfd2l0aF9wYXJlbl9zaWxlbmNpbmcoaW50IHgpIHsKKyAgaWYgKE5PKSBjYWxsZWRGdW4oKTsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e3dpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fSBleHBlY3RlZC1ub3RlIHt7c2lsZW5jZSBieSBhZGRpbmcgcGFyZW50aGVzZXMgdG8gbWFyayBjb2RlIGFzIGV4cGxpY2l0bHkgZGVhZH19CisgIGlmICgoTk8pKSBjYWxsZWRGdW4oKTsgLy8gbm8td2FybmluZworCisgIGlmIChZRVMpIC8vIGV4cGVjdGVkLW5vdGUge3tzaWxlbmNlIGJ5IGFkZGluZyBwYXJlbnRoZXNlcyB0byBtYXJrIGNvZGUgYXMgZXhwbGljaXRseSBkZWFkfX0KKyAgICBjYWxsZWRGdW4oKTsKKyAgZWxzZQorICAgIGNhbGxlZEZ1bigpOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7d2lsbCBuZXZlciBiZSBleGVjdXRlZH19CisKKyAgaWYgKChZRVMpKQorICAgIGNhbGxlZEZ1bigpOworICBlbHNlCisgICAgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKyAgCisgIGlmICghWUVTKSAvLyBleHBlY3RlZC1ub3RlIHt7c2lsZW5jZSBieSBhZGRpbmcgcGFyZW50aGVzZXMgdG8gbWFyayBjb2RlIGFzIGV4cGxpY2l0bHkgZGVhZH19CisgICAgY2FsbGVkRnVuKCk7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjb2RlIHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWR9fQorICBlbHNlCisgICAgY2FsbGVkRnVuKCk7CisgIAorICBpZiAoKCFZRVMpKQorICAgIGNhbGxlZEZ1bigpOyAvLyBuby13YXJuaW5nCisgIGVsc2UKKyAgICBjYWxsZWRGdW4oKTsKKyAgCisgIGlmICghKFlFUykpCisgICAgY2FsbGVkRnVuKCk7IC8vIG5vLXdhcm5pbmcKKyAgZWxzZQorICAgIGNhbGxlZEZ1bigpOworfQorCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDWFgvYXJjLXN5c3RlbS1oZWFkZXIubW0gYi90ZXN0L1NlbWFPYmpDWFgvYXJjLXN5c3RlbS1oZWFkZXIubW0KaW5kZXggMzM1OGU1Zi4uYjk3ZTJmMyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQ1hYL2FyYy1zeXN0ZW0taGVhZGVyLm1tCisrKyBiL3Rlc3QvU2VtYU9iakNYWC9hcmMtc3lzdGVtLWhlYWRlci5tbQpAQCAtNiw0ICs2LDQgQEAKICAgYS0+ZGF0YS52b2lkX3B0ciA9IDA7CiAgIGEtPmRhdGEuYV9iLmIgPSAwOyAvLyBleHBlY3RlZC1lcnJvcnt7J2FfYicgaXMgdW5hdmFpbGFibGU6IHRoaXMgc3lzdGVtIGZpZWxkIGhhcyByZXRhaW5pbmcgb3duZXJzaGlwfX0KIH0KLS8vIGV4cGVjdGVkLW5vdGVAYXJjLXN5c3RlbS1oZWFkZXIuaDoxMHt7ZGVjbGFyYXRpb24gaGFzIGJlZW4gZXhwbGljaXRseSBtYXJrZWQgdW5hdmFpbGFibGUgaGVyZX19CisvLyBleHBlY3RlZC1ub3RlQGFyYy1zeXN0ZW0taGVhZGVyLmg6MTB7eydhX2InIGhhcyBiZWVuIGV4cGxpY2l0bHkgbWFya2VkIHVuYXZhaWxhYmxlIGhlcmV9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQ1hYL2FyYy10ZW1wbGF0ZXMubW0gYi90ZXN0L1NlbWFPYmpDWFgvYXJjLXRlbXBsYXRlcy5tbQppbmRleCBiMzUxOWI5Li5lYmVkZTY0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDWFgvYXJjLXRlbXBsYXRlcy5tbQorKysgYi90ZXN0L1NlbWFPYmpDWFgvYXJjLXRlbXBsYXRlcy5tbQpAQCAtMzAyLDMgKzMwMiwxOSBAQAogICAgIGZsb2F0ICZmcjIgPSB0YWtlUHRyPEE+KGEpOwogICB9CiB9CisKK25hbWVzcGFjZSByZGFyMTU3MTM5NDUgeworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gaW50ICZmKF9fc3Ryb25nIFQgJik7CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBmbG9hdCAmZihfX3dlYWsgVCAmKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGRvdWJsZSAmZihfX3Vuc2FmZV91bnJldGFpbmVkIFQgJik7CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBjaGFyICZmKFQgJik7CisKKyAgdm9pZCBmb28oKSB7CisgICAgX19zdHJvbmcgTlNTdHJpbmcgKiBjb25zdCBzdHJvbmcgPSAwOworICAgIGludCAmaXIgPSAoZikoc3Ryb25nKTsKKyAgICBfX3dlYWsgTlNTdHJpbmcgKiBjb25zdCB3ZWFrID0gMDsKKyAgICBmbG9hdCAmZnIgPSAoZikod2Vhayk7CisgICAgX191bnNhZmVfdW5yZXRhaW5lZCBOU1N0cmluZyAqIGNvbnN0IHVuc2FmZSA9IDA7CisgICAgZG91YmxlICZkciA9IChmKSh1bnNhZmUpOworICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDWFgvY29udGV4dHVhbC1jb252ZXJ0LXRvLWlkLm1tIGIvdGVzdC9TZW1hT2JqQ1hYL2NvbnRleHR1YWwtY29udmVydC10by1pZC5tbQppbmRleCA2MDJkNmMyLi40N2E5ZDA3IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDWFgvY29udGV4dHVhbC1jb252ZXJ0LXRvLWlkLm1tCisrKyBiL3Rlc3QvU2VtYU9iakNYWC9jb250ZXh0dWFsLWNvbnZlcnQtdG8taWQubW0KQEAgLTgsNiArOCwxMCBAQAogLSB1bmtub3duTWV0aG9kOwogQGVuZAogCitAaW50ZXJmYWNlIEMgOiBBCistIGtub3duTWV0aG9kOworQGVuZAorCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmV0YWluUHRyIHsKICAgZXhwbGljaXQgb3BlcmF0b3IgVCooKSBjb25zdDsKIH07CkBAIC0xNyw2ICsyMSwxNiBAQAogICBbYSB1bmtub3duTWV0aG9kXTsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7J0EnIG1heSBub3QgcmVzcG9uZCB0byAndW5rbm93bk1ldGhvZCd9fQogfQogCit2b2lkIGV4cGxpY2l0Q2FzdChSZXRhaW5QdHI8QT4gYSwgUmV0YWluUHRyPEI+IGIsIFJldGFpblB0cjxDPiBjKSB7CisgICh2b2lkKShBKilhOworICAodm9pZCkoQSopYjsgLy8gZXhwZWN0ZWQtZXJyb3J7e2Nhbm5vdCBjb252ZXJ0ICdSZXRhaW5QdHI8Qj4nIHRvICdBIConIHdpdGhvdXQgYSBjb252ZXJzaW9uIG9wZXJhdG9yfX0KKyAgKHZvaWQpKEEqKWM7CisgICh2b2lkKShDKilhOworICAodm9pZClzdGF0aWNfY2FzdDxBKj4oYSk7CisgICh2b2lkKXN0YXRpY19jYXN0PEEqPihiKTsgIC8vIGV4cGVjdGVkLWVycm9ye3tjYW5ub3QgY29udmVydCAnUmV0YWluUHRyPEI+JyB0byAnQSAqJyB3aXRob3V0IGEgY29udmVyc2lvbiBvcGVyYXRvcn19CisgICh2b2lkKXN0YXRpY19jYXN0PEEqPihjKTsKK30KKwogc3RydWN0IEluY29tcGxldGU7IC8vIGV4cGVjdGVkLW5vdGV7e2ZvcndhcmQgZGVjbGFyYXRpb259fQogCiB2b2lkIG1ldGhvZENhbGxUb0luY29tcGxldGUoSW5jb21wbGV0ZSAmaW5jb21wbGV0ZSkgewpAQCAtMzEsMyArNDUsOCBAQAogICBbYSBrbm93bk1ldGhvZF07CiAgIFthIHVua25vd25NZXRob2RdOwogfQorCit2b2lkIGV4cGxpY2l0Q2FzdChJZFB0ciBhKSB7CisgICh2b2lkKShBKilhOworICAodm9pZClzdGF0aWNfY2FzdDxBKj4oYSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDWFgvY3Jhc2gubW0gYi90ZXN0L1NlbWFPYmpDWFgvY3Jhc2gubW0KaW5kZXggMzQ1ZjcyZS4uNTIxYjkyMyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQ1hYL2NyYXNoLm1tCisrKyBiL3Rlc3QvU2VtYU9iakNYWC9jcmFzaC5tbQpAQCAtMTQsMTAgKzE0LDEwIEBACiBAaW1wbGVtZW50YXRpb24gVGVzdAogCiBzdHJ1Y3QgRXZpbFN0cnVjdCB7Ci19IC8vIG5vdGUgdGhlIG1pc3Npbmcgc2VtaWNvbG9uCit9IC8vIGV4cGVjdGVkLWVycm9yIHt7ZXhwZWN0ZWQgJzsnIGFmdGVyIHN0cnVjdH19CiAKLSAgdHlwZWRlZiBzdGQ6OnBhaXI8aW50LCBpbnQ+IEludGVnZXJQYWlyOyAvLyBleHBlY3RlZC1lcnJvcnt7dHlwZWRlZiBkZWNsYXJhdG9yIGNhbm5vdCBiZSBxdWFsaWZpZWR9fSBcCi0vLyBleHBlY3RlZC1lcnJvcnt7dHlwZWRlZiBuYW1lIG11c3QgYmUgYW4gaWRlbnRpZmllcn19IFwKLS8vIGV4cGVjdGVkLWVycm9ye3tleHBlY3RlZCAnOycgYWZ0ZXIgdG9wIGxldmVsIGRlY2xhcmF0b3J9fQorICB0eXBlZGVmIHN0ZDo6cGFpcjxpbnQsIGludD4gSW50ZWdlclBhaXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uVHM+IHZvaWQgZihUcyk7IC8vIGV4cGVjdGVkLWVycm9yIHt7dW5leHBhbmRlZH19IGV4cGVjdGVkLXdhcm5pbmcge3tleHRlbnNpb259fQogCiBAZW5kCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDWFgvZXhjZXB0aW9ucy1mcmFnaWxlLm1tIGIvdGVzdC9TZW1hT2JqQ1hYL2V4Y2VwdGlvbnMtZnJhZ2lsZS5tbQppbmRleCA1NGQ5ZjgzLi5mZjVhMGNiIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDWFgvZXhjZXB0aW9ucy1mcmFnaWxlLm1tCisrKyBiL3Rlc3QvU2VtYU9iakNYWC9leGNlcHRpb25zLWZyYWdpbGUubW0KQEAgLTYsNyArNiw3IEBACiBuYW1lc3BhY2UgdGVzdDAgewogICB2b2lkIHRlc3QoKSB7CiAgICAgdHJ5IHsKLSAgICB9IGNhdGNoIChOU0V4Y2VwdGlvbiAqZSkgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2FuIG5vdCBjYXRjaCBhbiBleGNlcHRpb24gdGhyb3duIHdpdGggQHRocm93IGluIEMrKyBpbiB0aGUgbm9uLXVuaWZpZWQgZXhjZXB0aW9uIG1vZGVsfX0KKyAgICB9IGNhdGNoIChOU0V4Y2VwdGlvbiAqZSkgeyAvLyBleHBlY3RlZC13YXJuaW5nIHt7Y2Fubm90IGNhdGNoIGFuIGV4Y2VwdGlvbiB0aHJvd24gd2l0aCBAdGhyb3cgaW4gQysrIGluIHRoZSBub24tdW5pZmllZCBleGNlcHRpb24gbW9kZWx9fQogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT2JqQ1hYL21pY3Jvc29mdC1hYmktYnl2YWwubW0gYi90ZXN0L1NlbWFPYmpDWFgvbWljcm9zb2Z0LWFiaS1ieXZhbC5tbQppbmRleCBmMGM0Y2FhLi5hNDRmMjQwIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPYmpDWFgvbWljcm9zb2Z0LWFiaS1ieXZhbC5tbQorKysgYi90ZXN0L1NlbWFPYmpDWFgvbWljcm9zb2Z0LWFiaS1ieXZhbC5tbQpAQCAtMSw3ICsxLDggQEAKLS8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLWN4eC1hYmkgbWljcm9zb2Z0IC1Xbm8tb2JqYy1yb290LWNsYXNzICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5IC10cmlwbGUgJW1zX2FiaV90cmlwbGUgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKKy8vIGV4cGVjdGVkLW5vLWRpYWdub3N0aWNzCiAKIGNsYXNzIEZvbyB7Ci0gIH5Gb28oKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2ltcGxpY2l0bHkgZGVjbGFyZWQgcHJpdmF0ZSBoZXJlfX0KKyAgfkZvbygpOwogfTsKIAogQGludGVyZmFjZSBiYXIKQEAgLTksNiArMTAsNiBAQAogQGVuZAogCiBAaW1wbGVtZW50YXRpb24gYmFyCi0tICh2b2lkKSBteV9tZXRob2Q6IChGb28pYXJnIHsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2YXJpYWJsZSBvZiB0eXBlICdGb28nIGhhcyBwcml2YXRlIGRlc3RydWN0b3J9fQorLSAodm9pZCkgbXlfbWV0aG9kOiAoRm9vKWFyZyB7IC8vIG5vIGVycm9yOyBNUyBBQkkgd2lsbCBjYWxsIEZvbydzIGR0b3IsIGJ1dCB3ZSBza2lwIHRoZSBhY2Nlc3MgY2hlY2suCiB9CiBAZW5kCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDWFgvb2JqY2JyaWRnZS1hdHRyaWJ1dGUtYXJjLm1tIGIvdGVzdC9TZW1hT2JqQ1hYL29iamNicmlkZ2UtYXR0cmlidXRlLWFyYy5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWNiYTJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hT2JqQ1hYL29iamNicmlkZ2UtYXR0cmlidXRlLWFyYy5tbQpAQCAtMCwwICsxLDEzOSBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXggb2JqZWN0aXZlLWMrKyAtZm9iamMtYXJjIC12ZXJpZnkgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKKy8vIHJkYXI6Ly8xNTQ1NDg0NgorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgob2JqY19icmlkZ2UoTlNFcnJvcikpKSBfX0NGRXJyb3JSZWYgKiBDRkVycm9yUmVmOyAvLyBleHBlY3RlZC1ub3RlIDcge3tkZWNsYXJlZCBoZXJlfX0KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKG9iamNfYnJpZGdlKE15RXJyb3IpKSkgX19DRk15RXJyb3JSZWYgKiBDRk15RXJyb3JSZWY7IC8vIGV4cGVjdGVkLW5vdGUgMyB7e2RlY2xhcmVkIGhlcmV9fQorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZSgxMikpKSBfX0NGTXlDb2xvciAgKkNGTXlDb2xvclJlZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twYXJhbWV0ZXIgb2YgJ29iamNfYnJpZGdlJyBhdHRyaWJ1dGUgbXVzdCBiZSBhIHNpbmdsZSBuYW1lIG9mIGFuIE9iamVjdGl2ZS1DIGNsYXNzfX0KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKG9iamNfYnJpZGdlKSkgX19DRkFycmF5ICpDRkFycmF5UmVmOyAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2JyaWRnZScgYXR0cmlidXRlIHRha2VzIG9uZSBhcmd1bWVudH19CisKK3R5cGVkZWYgdm9pZCAqICBfX2F0dHJpYnV0ZV9fICgob2JqY19icmlkZ2UoTlNVUkwpKSkgQ0ZVUkxSZWY7ICAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2JyaWRnZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzfX0KKwordHlwZWRlZiB2b2lkICogQ0ZTdHJpbmdSZWYgX19hdHRyaWJ1dGVfXyAoKG9iamNfYnJpZGdlKE5TU3RyaW5nKSkpOyAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2JyaWRnZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzfX0KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2UoTlNMb2NhbGUsIE5TRXJyb3IpKSkgX19DRkxvY2FsZSAqQ0ZMb2NhbGVSZWY7Ly8gZXhwZWN0ZWQtZXJyb3Ige3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdOU0Vycm9yJ319CisKK3R5cGVkZWYgc3RydWN0IF9fQ0ZEYXRhIF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlKE5TRGF0YSkpKSBDRkRhdGFSZWY7IC8vIGV4cGVjdGVkLWVycm9yIHt7J29iamNfYnJpZGdlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHN0cnVjdCwgdW5pb24gb3IgY2xhc3N9fQorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZShOU0RpY3Rpb25hcnkpKSkgX19DRkRpY3Rpb25hcnkgKiBDRkRpY3Rpb25hcnlSZWY7CisKK3R5cGVkZWYgc3RydWN0IF9fQ0ZTZXRSZWYgKiBDRlNldFJlZiBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZShOU1NldCkpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0LCB1bmlvbiBvciBjbGFzc319OworCit0eXBlZGVmIHVuaW9uIF9fQ0ZVQ29sb3IgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2UoTlNVQ29sb3IpKSkgKiBDRlVDb2xvclJlZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0LCB1bmlvbiBvciBjbGFzc319OworCit0eXBlZGVmIHVuaW9uIF9fQ0ZVQ29sb3IgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2UoTlNVQ29sb3IpKSkgKkNGVUNvbG9yMVJlZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0LCB1bmlvbiBvciBjbGFzc319OworCit0eXBlZGVmIHVuaW9uIF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlKE5TVUNvbG9yKSkpIF9fQ0ZVUHJpbWVDb2xvciBYWFg7Cit0eXBlZGVmIFhYWCAqQ0ZVQ29sb3IyUmVmOworCitAaW50ZXJmYWNlIEkKK3sKKyAgIF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlKE5TRXJyb3IpKSkgdm9pZCAqIGNvbG9yOyAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2JyaWRnZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzfX07Cit9CitAZW5kCisKK0Bwcm90b2NvbCBOU1Rlc3RpbmcgQGVuZAorQGNsYXNzIE5TU3RyaW5nOworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZShOU1Rlc3RpbmcpKSkgX19DRkVycm9yICpDRlRlc3RpbmdSZWY7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KKworaWQgVGVzdDEoQ0ZUZXN0aW5nUmVmIGNmKSB7CisgIHJldHVybiAoTlNTdHJpbmcgKiljZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tDRiBvYmplY3Qgb2YgdHlwZSAnQ0ZUZXN0aW5nUmVmJyAoYWthICdfX0NGRXJyb3IgKicpIGlzIGJyaWRnZWQgdG8gJ05TVGVzdGluZycsIHdoaWNoIGlzIG5vdCBhbiBPYmplY3RpdmUtQyBjbGFzc319Cit9CisKK3R5cGVkZWYgQ0ZFcnJvclJlZiBDRkVycm9yUmVmMTsKKwordHlwZWRlZiBDRkVycm9yUmVmMSBDRkVycm9yUmVmMjsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7ZGVjbGFyZWQgaGVyZX19CisKK0Bwcm90b2NvbCBQMSBAZW5kCitAcHJvdG9jb2wgUDIgQGVuZAorQHByb3RvY29sIFAzIEBlbmQKK0Bwcm90b2NvbCBQNCBAZW5kCitAcHJvdG9jb2wgUDUgQGVuZAorCitAaW50ZXJmYWNlIE5TRXJyb3I8UDEsIFAyLCBQMz4gQGVuZCAvLyBleHBlY3RlZC1ub3RlIDcge3tkZWNsYXJlZCBoZXJlfX0KKworQGludGVyZmFjZSBNeUVycm9yIDogTlNFcnJvciAvLyBleHBlY3RlZC1ub3RlIDMge3tkZWNsYXJlZCBoZXJlfX0KK0BlbmQKKworQGludGVyZmFjZSBOU1VDb2xvciBAZW5kCisKK0BjbGFzcyBOU1N0cmluZzsKKwordm9pZCBUZXN0MihDRkVycm9yUmVmMiBjZiwgTlNFcnJvciAqbnMsIE5TU3RyaW5nICpzdHIsIENsYXNzIGMsIENGVUNvbG9yMlJlZiBjZjIpIHsKKyAgKHZvaWQpKE5TU3RyaW5nICopY2Y7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snQ0ZFcnJvclJlZjInIChha2EgJ19fQ0ZFcnJvclJlZiAqJykgYnJpZGdlcyB0byBOU0Vycm9yLCBub3QgJ05TU3RyaW5nJ319CisgICh2b2lkKShOU0Vycm9yICopY2Y7IC8vIG9rYXkKKyAgKHZvaWQpKE15RXJyb3IqKWNmOyAvLyBva2F5LAorICAodm9pZCkoTlNVQ29sb3IgKiljZjI7IC8vIG9rYXkKKyAgKHZvaWQpKENGRXJyb3JSZWYpbnM7IC8vIG9rYXkKKyAgKHZvaWQpKENGRXJyb3JSZWYpc3RyOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydOU1N0cmluZycgY2Fubm90IGJyaWRnZSB0byAnQ0ZFcnJvclJlZicgKGFrYSAnX19DRkVycm9yUmVmIConKX19CisgICh2b2lkKShDbGFzcyljZjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydDRkVycm9yUmVmMicgKGFrYSAnX19DRkVycm9yUmVmIConKSBicmlkZ2VzIHRvIE5TRXJyb3IsIG5vdCAnQ2xhc3MnfX0KKyAgKHZvaWQpKENGRXJyb3JSZWYpYzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydDbGFzcycgY2Fubm90IGJyaWRnZSB0byAnQ0ZFcnJvclJlZid9fQorfQorCisKK3ZvaWQgVGVzdDMoQ0ZFcnJvclJlZiBjZiwgTlNFcnJvciAqbnMpIHsKKyAgKHZvaWQpKGlkKWNmOyAvLyBva2F5CisgKHZvaWQpKGlkPFAxLCBQMj4pY2Y7IC8vIG9rYXkKKyAodm9pZCkoaWQ8UDEsIFAyLCBQND4pY2Y7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snQ0ZFcnJvclJlZicgKGFrYSAnX19DRkVycm9yUmVmIConKSBicmlkZ2VzIHRvIE5TRXJyb3IsIG5vdCAnaWQ8UDEsUDIsUDQ+J319Cit9CisKK3ZvaWQgVGVzdDQoQ0ZNeUVycm9yUmVmIGNmKSB7CisgICAodm9pZCkoaWQpY2Y7IC8vIG9rYXkKKyAodm9pZCkoaWQ8UDEsIFAyPiljZjsgLy8gb2sKKyAodm9pZCkoaWQ8UDEsIFAyLCBQMz4pY2Y7IC8vIG9rCisgKHZvaWQpKGlkPFAyLCBQMz4pY2Y7IC8vIG9rCisgKHZvaWQpKGlkPFAxLCBQMiwgUDQ+KWNmOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0NGTXlFcnJvclJlZicgKGFrYSAnX19DRk15RXJyb3JSZWYgKicpIGJyaWRnZXMgdG8gTXlFcnJvciwgbm90ICdpZDxQMSxQMixQND4nfX0KK30KKwordm9pZCBUZXN0NShpZDxQMSwgUDIsIFAzPiBQMTIzLCBpZCBJRCwgaWQ8UDEsIFAyLCBQMywgUDQ+IFAxMjM0LCBpZDxQMSwgUDI+IFAxMiwgaWQ8UDIsIFAzPiBQMjMpIHsKKyAodm9pZCkoQ0ZFcnJvclJlZilJRDsgLy8gb2sKKyAodm9pZCkoQ0ZFcnJvclJlZilQMTIzOyAvLyBvaworICh2b2lkKShDRkVycm9yUmVmKVAxMjM0OyAvLyBvaworICh2b2lkKShDRkVycm9yUmVmKVAxMjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydpZDxQMSxQMj4nIGNhbm5vdCBicmlkZ2UgdG8gJ0NGRXJyb3JSZWYnIChha2EgJ19fQ0ZFcnJvclJlZiAqJyl9fQorICh2b2lkKShDRkVycm9yUmVmKVAyMzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydpZDxQMixQMz4nIGNhbm5vdCBicmlkZ2UgdG8gJ0NGRXJyb3JSZWYnIChha2EgJ19fQ0ZFcnJvclJlZiAqJyl9fQorfQorCit2b2lkIFRlc3Q2KGlkPFAxLCBQMiwgUDM+IFAxMjMsIGlkIElELCBpZDxQMSwgUDIsIFAzLCBQND4gUDEyMzQsIGlkPFAxLCBQMj4gUDEyLCBpZDxQMiwgUDM+IFAyMykgeworCisgKHZvaWQpKENGTXlFcnJvclJlZilJRDsgLy8gb2sKKyAodm9pZCkoQ0ZNeUVycm9yUmVmKVAxMjM7IC8vIG9rCisgKHZvaWQpKENGTXlFcnJvclJlZilQMTIzNDsgLy8gb2sKKyAodm9pZCkoQ0ZNeUVycm9yUmVmKVAxMjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydpZDxQMSxQMj4nIGNhbm5vdCBicmlkZ2UgdG8gJ0NGTXlFcnJvclJlZicgKGFrYSAnX19DRk15RXJyb3JSZWYgKicpfX0KKyAodm9pZCkoQ0ZNeUVycm9yUmVmKVAyMzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydpZDxQMixQMz4nIGNhbm5vdCBicmlkZ2UgdG8gJ0NGTXlFcnJvclJlZicgKGFrYSAnX19DRk15RXJyb3JSZWYgKicpfX0KK30KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKG9iamNfYnJpZGdlKE15UGVyc29uYWxFcnJvcikpKSBfX0NGTXlQZXJzb25hbEVycm9yUmVmICogQ0ZNeVBlcnNvbmFsRXJyb3JSZWY7ICAvLyBleHBlY3RlZC1ub3RlIDQge3tkZWNsYXJlZCBoZXJlfX0KKworQGludGVyZmFjZSBNeVBlcnNvbmFsRXJyb3IgOiBOU0Vycm9yIDxQND4gLy8gZXhwZWN0ZWQtbm90ZSA0IHt7ZGVjbGFyZWQgaGVyZX19CitAZW5kCisKK3ZvaWQgVGVzdDcoaWQ8UDEsIFAyLCBQMz4gUDEyMywgaWQgSUQsIGlkPFAxLCBQMiwgUDMsIFA0PiBQMTIzNCwgaWQ8UDEsIFAyPiBQMTIsIGlkPFAyLCBQMz4gUDIzKSB7CisgKHZvaWQpKENGTXlQZXJzb25hbEVycm9yUmVmKUlEOyAvLyBvaworICh2b2lkKShDRk15UGVyc29uYWxFcnJvclJlZilQMTIzOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J2lkPFAxLFAyLFAzPicgY2Fubm90IGJyaWRnZSB0byAnQ0ZNeVBlcnNvbmFsRXJyb3JSZWYnIChha2EgJ19fQ0ZNeVBlcnNvbmFsRXJyb3JSZWYgKicpfX0KKyAodm9pZCkoQ0ZNeVBlcnNvbmFsRXJyb3JSZWYpUDEyMzQ7IC8vIG9rCisgKHZvaWQpKENGTXlQZXJzb25hbEVycm9yUmVmKVAxMjsgLy8gIGV4cGVjdGVkLXdhcm5pbmcge3snaWQ8UDEsUDI+JyBjYW5ub3QgYnJpZGdlIHRvICdDRk15UGVyc29uYWxFcnJvclJlZicgKGFrYSAnX19DRk15UGVyc29uYWxFcnJvclJlZiAqJyl9fQorICh2b2lkKShDRk15UGVyc29uYWxFcnJvclJlZilQMjM7IC8vICBleHBlY3RlZC13YXJuaW5nIHt7J2lkPFAyLFAzPicgY2Fubm90IGJyaWRnZSB0byAnQ0ZNeVBlcnNvbmFsRXJyb3JSZWYnIChha2EgJ19fQ0ZNeVBlcnNvbmFsRXJyb3JSZWYgKicpfX0KK30KKwordm9pZCBUZXN0OChDRk15UGVyc29uYWxFcnJvclJlZiBjZikgeworICAodm9pZCkoaWQpY2Y7IC8vIG9rCisgICh2b2lkKShpZDxQMT4pY2Y7IC8vIG9rCisgICh2b2lkKShpZDxQMSwgUDI+KWNmOyAvLyBvaworICAodm9pZCkoaWQ8UDEsIFAyLCBQMz4pY2Y7IC8vIG9rCisgICh2b2lkKShpZDxQMSwgUDIsIFAzLCBQND4pY2Y7IC8vIG9rCisgICh2b2lkKShpZDxQMSwgUDIsIFAzLCBQNCwgUDU+KWNmOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0NGTXlQZXJzb25hbEVycm9yUmVmJyAoYWthICdfX0NGTXlQZXJzb25hbEVycm9yUmVmIConKSBicmlkZ2VzIHRvIE15UGVyc29uYWxFcnJvciwgbm90ICdpZDxQMSxQMixQMyxQNCxQNT4nfX0KK30KKwordm9pZCBUZXN0OShDRkVycm9yUmVmMiBjZiwgTlNFcnJvciAqbnMsIE5TU3RyaW5nICpzdHIsIENsYXNzIGMsIENGVUNvbG9yMlJlZiBjZjIpIHsKKyAgKHZvaWQpKF9fYnJpZGdlIE5TU3RyaW5nICopY2Y7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snQ0ZFcnJvclJlZjInIChha2EgJ19fQ0ZFcnJvclJlZiAqJykgYnJpZGdlcyB0byBOU0Vycm9yLCBub3QgJ05TU3RyaW5nJ319CisgICh2b2lkKShfX2JyaWRnZSBOU0Vycm9yICopY2Y7IC8vIG9rYXkKKyAgKHZvaWQpKF9fYnJpZGdlIE15RXJyb3IqKWNmOyAvLyBva2F5LAorICAodm9pZCkoX19icmlkZ2UgTlNVQ29sb3IgKiljZjI7IC8vIG9rYXkKKyAgKHZvaWQpKF9fYnJpZGdlIENGRXJyb3JSZWYpbnM7IC8vIG9rYXkKKyAgKHZvaWQpKF9fYnJpZGdlIENGRXJyb3JSZWYpc3RyOyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydOU1N0cmluZycgY2Fubm90IGJyaWRnZSB0byAnQ0ZFcnJvclJlZicgKGFrYSAnX19DRkVycm9yUmVmIConKX19CisgICh2b2lkKShfX2JyaWRnZSBDbGFzcyljZjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydDRkVycm9yUmVmMicgKGFrYSAnX19DRkVycm9yUmVmIConKSBicmlkZ2VzIHRvIE5TRXJyb3IsIG5vdCAnQ2xhc3MnfX0KKyAgKHZvaWQpKF9fYnJpZGdlIENGRXJyb3JSZWYpYzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydfX3Vuc2FmZV91bnJldGFpbmVkIENsYXNzJyBjYW5ub3QgYnJpZGdlIHRvICdDRkVycm9yUmVmJyAoYWthICdfX0NGRXJyb3JSZWYgKicpfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9iakNYWC9vYmpjYnJpZGdlLWF0dHJpYnV0ZS5tbSBiL3Rlc3QvU2VtYU9iakNYWC9vYmpjYnJpZGdlLWF0dHJpYnV0ZS5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2E5YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hT2JqQ1hYL29iamNicmlkZ2UtYXR0cmlidXRlLm1tCkBAIC0wLDAgKzEsMTI4IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYysrIC12ZXJpZnkgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKKy8vIHJkYXI6Ly8xNTQ1NDg0NgorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fICgob2JqY19icmlkZ2UoTlNFcnJvcikpKSBfX0NGRXJyb3JSZWYgKiBDRkVycm9yUmVmOyAvLyBleHBlY3RlZC1ub3RlIDUge3tkZWNsYXJlZCBoZXJlfX0KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKG9iamNfYnJpZGdlKE15RXJyb3IpKSkgX19DRk15RXJyb3JSZWYgKiBDRk15RXJyb3JSZWY7IC8vIGV4cGVjdGVkLW5vdGUgMyB7e2RlY2xhcmVkIGhlcmV9fQorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZSgxMikpKSBfX0NGTXlDb2xvciAgKkNGTXlDb2xvclJlZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3twYXJhbWV0ZXIgb2YgJ29iamNfYnJpZGdlJyBhdHRyaWJ1dGUgbXVzdCBiZSBhIHNpbmdsZSBuYW1lIG9mIGFuIE9iamVjdGl2ZS1DIGNsYXNzfX0KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXyAoKG9iamNfYnJpZGdlKSkgX19DRkFycmF5ICpDRkFycmF5UmVmOyAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2JyaWRnZScgYXR0cmlidXRlIHRha2VzIG9uZSBhcmd1bWVudH19CisKK3R5cGVkZWYgdm9pZCAqICBfX2F0dHJpYnV0ZV9fICgob2JqY19icmlkZ2UoTlNVUkwpKSkgQ0ZVUkxSZWY7ICAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2JyaWRnZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzfX0KKwordHlwZWRlZiB2b2lkICogQ0ZTdHJpbmdSZWYgX19hdHRyaWJ1dGVfXyAoKG9iamNfYnJpZGdlKE5TU3RyaW5nKSkpOyAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2JyaWRnZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzfX0KKwordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2UoTlNMb2NhbGUsIE5TRXJyb3IpKSkgX19DRkxvY2FsZSAqQ0ZMb2NhbGVSZWY7Ly8gZXhwZWN0ZWQtZXJyb3Ige3t1c2Ugb2YgdW5kZWNsYXJlZCBpZGVudGlmaWVyICdOU0Vycm9yJ319CisKK3R5cGVkZWYgc3RydWN0IF9fQ0ZEYXRhIF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlKE5TRGF0YSkpKSBDRkRhdGFSZWY7IC8vIGV4cGVjdGVkLWVycm9yIHt7J29iamNfYnJpZGdlJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHN0cnVjdCwgdW5pb24gb3IgY2xhc3N9fQorCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZShOU0RpY3Rpb25hcnkpKSkgX19DRkRpY3Rpb25hcnkgKiBDRkRpY3Rpb25hcnlSZWY7CisKK3R5cGVkZWYgc3RydWN0IF9fQ0ZTZXRSZWYgKiBDRlNldFJlZiBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZShOU1NldCkpKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0LCB1bmlvbiBvciBjbGFzc319OworCit0eXBlZGVmIHVuaW9uIF9fQ0ZVQ29sb3IgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2UoTlNVQ29sb3IpKSkgKiBDRlVDb2xvclJlZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0LCB1bmlvbiBvciBjbGFzc319OworCit0eXBlZGVmIHVuaW9uIF9fQ0ZVQ29sb3IgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2UoTlNVQ29sb3IpKSkgKkNGVUNvbG9yMVJlZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snb2JqY19icmlkZ2UnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gc3RydWN0LCB1bmlvbiBvciBjbGFzc319OworCit0eXBlZGVmIHVuaW9uIF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlKE5TVUNvbG9yKSkpIF9fQ0ZVUHJpbWVDb2xvciBYWFg7Cit0eXBlZGVmIFhYWCAqQ0ZVQ29sb3IyUmVmOworCitAaW50ZXJmYWNlIEkKK3sKKyAgIF9fYXR0cmlidXRlX18oKG9iamNfYnJpZGdlKE5TRXJyb3IpKSkgdm9pZCAqIGNvbG9yOyAvLyBleHBlY3RlZC1lcnJvciB7eydvYmpjX2JyaWRnZScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzfX07Cit9CitAZW5kCisKK0Bwcm90b2NvbCBOU1Rlc3RpbmcgQGVuZAorQGNsYXNzIE5TU3RyaW5nOworCit0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChvYmpjX2JyaWRnZShOU1Rlc3RpbmcpKSkgX19DRkVycm9yICpDRlRlc3RpbmdSZWY7IC8vIGV4cGVjdGVkLW5vdGUge3tkZWNsYXJlZCBoZXJlfX0KKworaWQgVGVzdDEoQ0ZUZXN0aW5nUmVmIGNmKSB7CisgIHJldHVybiAoTlNTdHJpbmcgKiljZjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tDRiBvYmplY3Qgb2YgdHlwZSAnQ0ZUZXN0aW5nUmVmJyAoYWthICdfX0NGRXJyb3IgKicpIGlzIGJyaWRnZWQgdG8gJ05TVGVzdGluZycsIHdoaWNoIGlzIG5vdCBhbiBPYmplY3RpdmUtQyBjbGFzc319Cit9CisKK3R5cGVkZWYgQ0ZFcnJvclJlZiBDRkVycm9yUmVmMTsKKwordHlwZWRlZiBDRkVycm9yUmVmMSBDRkVycm9yUmVmMjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorCitAcHJvdG9jb2wgUDEgQGVuZAorQHByb3RvY29sIFAyIEBlbmQKK0Bwcm90b2NvbCBQMyBAZW5kCitAcHJvdG9jb2wgUDQgQGVuZAorQHByb3RvY29sIFA1IEBlbmQKKworQGludGVyZmFjZSBOU0Vycm9yPFAxLCBQMiwgUDM+IEBlbmQgLy8gZXhwZWN0ZWQtbm90ZSA1IHt7ZGVjbGFyZWQgaGVyZX19CisKK0BpbnRlcmZhY2UgTXlFcnJvciA6IE5TRXJyb3IgLy8gZXhwZWN0ZWQtbm90ZSAzIHt7ZGVjbGFyZWQgaGVyZX19CitAZW5kCisKK0BpbnRlcmZhY2UgTlNVQ29sb3IgQGVuZAorCitAY2xhc3MgTlNTdHJpbmc7CisKK3ZvaWQgVGVzdDIoQ0ZFcnJvclJlZjIgY2YsIE5TRXJyb3IgKm5zLCBOU1N0cmluZyAqc3RyLCBDbGFzcyBjLCBDRlVDb2xvcjJSZWYgY2YyKSB7CisgICh2b2lkKShOU1N0cmluZyAqKWNmOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0NGRXJyb3JSZWYyJyAoYWthICdfX0NGRXJyb3JSZWYgKicpIGJyaWRnZXMgdG8gTlNFcnJvciwgbm90ICdOU1N0cmluZyd9fQorICAodm9pZCkoTlNFcnJvciAqKWNmOyAvLyBva2F5CisgICh2b2lkKShNeUVycm9yKiljZjsgLy8gb2theSwKKyAgKHZvaWQpKE5TVUNvbG9yICopY2YyOyAvLyBva2F5CisgICh2b2lkKShDRkVycm9yUmVmKW5zOyAvLyBva2F5CisgICh2b2lkKShDRkVycm9yUmVmKXN0cjsgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3snTlNTdHJpbmcnIGNhbm5vdCBicmlkZ2UgdG8gJ0NGRXJyb3JSZWYnIChha2EgJ19fQ0ZFcnJvclJlZiAqJyl9fQorICAodm9pZCkoQ2xhc3MpY2Y7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snQ0ZFcnJvclJlZjInIChha2EgJ19fQ0ZFcnJvclJlZiAqJykgYnJpZGdlcyB0byBOU0Vycm9yLCBub3QgJ0NsYXNzJ319CisgICh2b2lkKShDRkVycm9yUmVmKWM7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snQ2xhc3MnIGNhbm5vdCBicmlkZ2UgdG8gJ0NGRXJyb3JSZWYnfX0KK30KKworCit2b2lkIFRlc3QzKENGRXJyb3JSZWYgY2YsIE5TRXJyb3IgKm5zKSB7CisgICh2b2lkKShpZCljZjsgLy8gb2theQorICh2b2lkKShpZDxQMSwgUDI+KWNmOyAvLyBva2F5CisgKHZvaWQpKGlkPFAxLCBQMiwgUDQ+KWNmOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7J0NGRXJyb3JSZWYnIChha2EgJ19fQ0ZFcnJvclJlZiAqJykgYnJpZGdlcyB0byBOU0Vycm9yLCBub3QgJ2lkPFAxLFAyLFA0Pid9fQorfQorCit2b2lkIFRlc3Q0KENGTXlFcnJvclJlZiBjZikgeworICAgKHZvaWQpKGlkKWNmOyAvLyBva2F5CisgKHZvaWQpKGlkPFAxLCBQMj4pY2Y7IC8vIG9rCisgKHZvaWQpKGlkPFAxLCBQMiwgUDM+KWNmOyAvLyBvaworICh2b2lkKShpZDxQMiwgUDM+KWNmOyAvLyBvaworICh2b2lkKShpZDxQMSwgUDIsIFA0PiljZjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydDRk15RXJyb3JSZWYnIChha2EgJ19fQ0ZNeUVycm9yUmVmIConKSBicmlkZ2VzIHRvIE15RXJyb3IsIG5vdCAnaWQ8UDEsUDIsUDQ+J319Cit9CisKK3ZvaWQgVGVzdDUoaWQ8UDEsIFAyLCBQMz4gUDEyMywgaWQgSUQsIGlkPFAxLCBQMiwgUDMsIFA0PiBQMTIzNCwgaWQ8UDEsIFAyPiBQMTIsIGlkPFAyLCBQMz4gUDIzKSB7CisgKHZvaWQpKENGRXJyb3JSZWYpSUQ7IC8vIG9rCisgKHZvaWQpKENGRXJyb3JSZWYpUDEyMzsgLy8gb2sKKyAodm9pZCkoQ0ZFcnJvclJlZilQMTIzNDsgLy8gb2sKKyAodm9pZCkoQ0ZFcnJvclJlZilQMTI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snaWQ8UDEsUDI+JyBjYW5ub3QgYnJpZGdlIHRvICdDRkVycm9yUmVmJyAoYWthICdfX0NGRXJyb3JSZWYgKicpfX0KKyAodm9pZCkoQ0ZFcnJvclJlZilQMjM7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snaWQ8UDIsUDM+JyBjYW5ub3QgYnJpZGdlIHRvICdDRkVycm9yUmVmJyAoYWthICdfX0NGRXJyb3JSZWYgKicpfX0KK30KKwordm9pZCBUZXN0NihpZDxQMSwgUDIsIFAzPiBQMTIzLCBpZCBJRCwgaWQ8UDEsIFAyLCBQMywgUDQ+IFAxMjM0LCBpZDxQMSwgUDI+IFAxMiwgaWQ8UDIsIFAzPiBQMjMpIHsKKworICh2b2lkKShDRk15RXJyb3JSZWYpSUQ7IC8vIG9rCisgKHZvaWQpKENGTXlFcnJvclJlZilQMTIzOyAvLyBvaworICh2b2lkKShDRk15RXJyb3JSZWYpUDEyMzQ7IC8vIG9rCisgKHZvaWQpKENGTXlFcnJvclJlZilQMTI7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snaWQ8UDEsUDI+JyBjYW5ub3QgYnJpZGdlIHRvICdDRk15RXJyb3JSZWYnIChha2EgJ19fQ0ZNeUVycm9yUmVmIConKX19CisgKHZvaWQpKENGTXlFcnJvclJlZilQMjM7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3snaWQ8UDIsUDM+JyBjYW5ub3QgYnJpZGdlIHRvICdDRk15RXJyb3JSZWYnIChha2EgJ19fQ0ZNeUVycm9yUmVmIConKX19Cit9CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18gKChvYmpjX2JyaWRnZShNeVBlcnNvbmFsRXJyb3IpKSkgX19DRk15UGVyc29uYWxFcnJvclJlZiAqIENGTXlQZXJzb25hbEVycm9yUmVmOyAgLy8gZXhwZWN0ZWQtbm90ZSA0IHt7ZGVjbGFyZWQgaGVyZX19CisKK0BpbnRlcmZhY2UgTXlQZXJzb25hbEVycm9yIDogTlNFcnJvciA8UDQ+IC8vIGV4cGVjdGVkLW5vdGUgNCB7e2RlY2xhcmVkIGhlcmV9fQorQGVuZAorCit2b2lkIFRlc3Q3KGlkPFAxLCBQMiwgUDM+IFAxMjMsIGlkIElELCBpZDxQMSwgUDIsIFAzLCBQND4gUDEyMzQsIGlkPFAxLCBQMj4gUDEyLCBpZDxQMiwgUDM+IFAyMykgeworICh2b2lkKShDRk15UGVyc29uYWxFcnJvclJlZilJRDsgLy8gb2sKKyAodm9pZCkoQ0ZNeVBlcnNvbmFsRXJyb3JSZWYpUDEyMzsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydpZDxQMSxQMixQMz4nIGNhbm5vdCBicmlkZ2UgdG8gJ0NGTXlQZXJzb25hbEVycm9yUmVmJyAoYWthICdfX0NGTXlQZXJzb25hbEVycm9yUmVmIConKX19CisgKHZvaWQpKENGTXlQZXJzb25hbEVycm9yUmVmKVAxMjM0OyAvLyBvaworICh2b2lkKShDRk15UGVyc29uYWxFcnJvclJlZilQMTI7IC8vICBleHBlY3RlZC13YXJuaW5nIHt7J2lkPFAxLFAyPicgY2Fubm90IGJyaWRnZSB0byAnQ0ZNeVBlcnNvbmFsRXJyb3JSZWYnIChha2EgJ19fQ0ZNeVBlcnNvbmFsRXJyb3JSZWYgKicpfX0KKyAodm9pZCkoQ0ZNeVBlcnNvbmFsRXJyb3JSZWYpUDIzOyAvLyAgZXhwZWN0ZWQtd2FybmluZyB7eydpZDxQMixQMz4nIGNhbm5vdCBicmlkZ2UgdG8gJ0NGTXlQZXJzb25hbEVycm9yUmVmJyAoYWthICdfX0NGTXlQZXJzb25hbEVycm9yUmVmIConKX19Cit9CisKK3ZvaWQgVGVzdDgoQ0ZNeVBlcnNvbmFsRXJyb3JSZWYgY2YpIHsKKyAgKHZvaWQpKGlkKWNmOyAvLyBvaworICAodm9pZCkoaWQ8UDE+KWNmOyAvLyBvaworICAodm9pZCkoaWQ8UDEsIFAyPiljZjsgLy8gb2sKKyAgKHZvaWQpKGlkPFAxLCBQMiwgUDM+KWNmOyAvLyBvaworICAodm9pZCkoaWQ8UDEsIFAyLCBQMywgUDQ+KWNmOyAvLyBvaworICAodm9pZCkoaWQ8UDEsIFAyLCBQMywgUDQsIFA1PiljZjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7eydDRk15UGVyc29uYWxFcnJvclJlZicgKGFrYSAnX19DRk15UGVyc29uYWxFcnJvclJlZiAqJykgYnJpZGdlcyB0byBNeVBlcnNvbmFsRXJyb3IsIG5vdCAnaWQ8UDEsUDIsUDMsUDQsUDU+J319Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDWFgvb2JqY2JyaWRnZS1yZWxhdGVkLWF0dHJpYnV0ZS5tbSBiL3Rlc3QvU2VtYU9iakNYWC9vYmpjYnJpZGdlLXJlbGF0ZWQtYXR0cmlidXRlLm1tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZmQwM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWFPYmpDWFgvb2JqY2JyaWRnZS1yZWxhdGVkLWF0dHJpYnV0ZS5tbQpAQCAtMCwwICsxLDI3IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAteCBvYmplY3RpdmUtYysrIC12ZXJpZnkgLVduby1vYmpjLXJvb3QtY2xhc3MgJXMKKy8vIHJkYXI6Ly8xNTQ5OTExMQordHlwZWRlZiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygob2JqY19icmlkZ2VfcmVsYXRlZChOU0NvbG9yLGNvbG9yV2l0aENHQ29sb3I6LENHQ29sb3IpKSkgQ0dDb2xvciAqQ0dDb2xvclJlZjsgLy8gZXhwZWN0ZWQtbm90ZSA2IHt7ZGVjbGFyZWQgaGVyZX19CisKK0BpbnRlcmZhY2UgTlNDb2xvciAvLyBleHBlY3RlZC1ub3RlIDYge3tkZWNsYXJlZCBoZXJlfX0KKysgKE5TQ29sb3IgKiljb2xvcldpdGhDR0NvbG9yOihDR0NvbG9yUmVmKWNnQ29sb3I7CistIChDR0NvbG9yUmVmKUNHQ29sb3I7CitAZW5kCisKK0BpbnRlcmZhY2UgTlNUZXh0RmllbGQKKy0gKHZvaWQpc2V0QmFja2dyb3VuZENvbG9yOihOU0NvbG9yICopY29sb3I7CistIChOU0NvbG9yICopYmFja2dyb3VuZENvbG9yOworQGVuZAorCisKK05TQ29sb3IgKlRlc3QxKE5TQ29sb3IgKm5zQ29sb3IsIENHQ29sb3JSZWYgbmV3Q29sb3IpIHsKKyAgbnNDb2xvciA9IG5ld0NvbG9yOyAvLyBleHBlY3RlZC1lcnJvciB7eydDR0NvbG9yUmVmJyAoYWthICdDR0NvbG9yIConKSBtdXN0IGJlIGV4cGxpY2l0bHkgY29udmVydGVkIHRvICdOU0NvbG9yIConOyB1c2UgJytjb2xvcldpdGhDR0NvbG9yOicgbWV0aG9kIGZvciB0aGlzIGNvbnZlcnNpb259fQorICBOU0NvbG9yICpucyA9IG5ld0NvbG9yOyAvLyBleHBlY3RlZC1lcnJvciB7eydDR0NvbG9yUmVmJyAoYWthICdDR0NvbG9yIConKSBtdXN0IGJlIGV4cGxpY2l0bHkgY29udmVydGVkIHRvICdOU0NvbG9yIConOyB1c2UgJytjb2xvcldpdGhDR0NvbG9yOicgbWV0aG9kIGZvciB0aGlzIGNvbnZlcnNpb259fSAKKyAgcmV0dXJuIG5ld0NvbG9yOyAvLyBleHBlY3RlZC1lcnJvciB7eydDR0NvbG9yUmVmJyAoYWthICdDR0NvbG9yIConKSBtdXN0IGJlIGV4cGxpY2l0bHkgY29udmVydGVkIHRvICdOU0NvbG9yIConOyB1c2UgJytjb2xvcldpdGhDR0NvbG9yOicgbWV0aG9kIGZvciB0aGlzIGNvbnZlcnNpb259fSAKK30KKworQ0dDb2xvclJlZiBUZXN0MihOU0NvbG9yICpuZXdDb2xvciwgQ0dDb2xvclJlZiBjZ0NvbG9yKSB7CisgIGNnQ29sb3IgPSBuZXdDb2xvcjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snTlNDb2xvciAqJyBtdXN0IGJlIGV4cGxpY2l0bHkgY29udmVydGVkIHRvICdDR0NvbG9yUmVmJyAoYWthICdDR0NvbG9yIConKTsgdXNlICctQ0dDb2xvcicgbWV0aG9kIGZvciB0aGlzIGNvbnZlcnNpb259fQorICBDR0NvbG9yUmVmIGNnID0gbmV3Q29sb3I7IC8vIGV4cGVjdGVkLWVycm9yIHt7J05TQ29sb3IgKicgbXVzdCBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCB0byAnQ0dDb2xvclJlZicgKGFrYSAnQ0dDb2xvciAqJyk7IHVzZSAnLUNHQ29sb3InIG1ldGhvZCBmb3IgdGhpcyBjb252ZXJzaW9ufX0gCisgIHJldHVybiBuZXdDb2xvcjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3snTlNDb2xvciAqJyBtdXN0IGJlIGV4cGxpY2l0bHkgY29udmVydGVkIHRvICdDR0NvbG9yUmVmJyAoYWthICdDR0NvbG9yIConKTsgdXNlICctQ0dDb2xvcicgbWV0aG9kIGZvciB0aGlzIGNvbnZlcnNpb259fQorfQorCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDWFgvb2xkLXN0eWxlLWNhc3QubW0gYi90ZXN0L1NlbWFPYmpDWFgvb2xkLXN0eWxlLWNhc3QubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiYWMwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYU9iakNYWC9vbGQtc3R5bGUtY2FzdC5tbQpAQCAtMCwwICsxLDExIEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSB4ODZfNjQtYXBwbGUtZGFyd2luMTEgLWZzeW50YXgtb25seSAtZm9iamMtYXJjIC1Xb2xkLXN0eWxlLWNhc3QgLXZlcmlmeSAlcworLy8gZXhwZWN0ZWQtbm8tZGlhZ25vc3RpY3MKKworLy8gV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gd3JpdGUgQVJDL0MrKyBicmlkZ2UgY2FzdHMgaW4gdGVybXMgb2YgQysrCisvLyBjYXN0cywgc28gZW5zdXJlIHdlIGRvbid0IGVtaXQgYW4gb2xkLXN0eWxlLWNhc3Qgd2FybmluZyBpbiB0aGVzZSBjYXNlcy4KKworaWQgdGVzdCh2b2lkICpvcGFxdWVJbnB1dCkgeworICBpZCBzb21lT2JqQ09iamVjdCA9IChfX2JyaWRnZSBpZClvcGFxdWVJbnB1dDsKKyAgdm9pZCAqc29tZUNGT2JqZWN0ID0gKF9fYnJpZGdlX3JldGFpbmVkIHZvaWQgKilzb21lT2JqQ09iamVjdDsKKyAgcmV0dXJuIChfX2JyaWRnZV90cmFuc2ZlciBpZClzb21lQ0ZPYmplY3Q7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDWFgvcHJvcGVydC1kb3QtZXJyb3IubW0gYi90ZXN0L1NlbWFPYmpDWFgvcHJvcGVydC1kb3QtZXJyb3IubW0KaW5kZXggMmE0NjJlNC4uZTI4MjA0YyAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT2JqQ1hYL3Byb3BlcnQtZG90LWVycm9yLm1tCisrKyBiL3Rlc3QvU2VtYU9iakNYWC9wcm9wZXJ0LWRvdC1lcnJvci5tbQpAQCAtNTMsNyArNTMsNyBAQAogCiAvLyBQUjk3NTkKIGNsYXNzIEZvcndhcmQ7Ci1AaW50ZXJmYWNlIEQgeworQGludGVyZmFjZSBEIHsgLy8gZXhwZWN0ZWQtbm90ZSAyIHt7J0QnIGRlY2xhcmVkIGhlcmV9fQogQHB1YmxpYwogICBpbnQgaXZhcjsKIH0KQEAgLTY0LDYgKzY0LDYgQEAKIHZvaWQgdGVzdEQoRCAqZCkgewogICBkLkZvcndhcmQ6OnByb3BlcnR5ID0gMTc7IC8vIGV4cGVjdGVkLWVycm9ye3twcm9wZXJ0eSBhY2Nlc3MgY2Fubm90IGJlIHF1YWxpZmllZCB3aXRoICdGb3J3YXJkOjonfX0KICAgZC0+Rm9yd2FyZDo6aXZhciA9IDEyOyAvLyBleHBlY3RlZC1lcnJvcnt7aW5zdGFuY2UgdmFyaWFibGUgYWNjZXNzIGNhbm5vdCBiZSBxdWFsaWZpZWQgd2l0aCAnRm9yd2FyZDo6J319Ci0gIGQuRDo6cHJvcGVydHkgPSAxNzsgLy8gZXhwZWN0ZWQtZXJyb3J7e2V4cGVjdGVkIGEgY2xhc3Mgb3IgbmFtZXNwYWNlfX0KLSAgZC0+RDo6aXZhciA9IDEyOyAvLyBleHBlY3RlZC1lcnJvcnt7ZXhwZWN0ZWQgYSBjbGFzcyBvciBuYW1lc3BhY2V9fQorICBkLkQ6OnByb3BlcnR5ID0gMTc7IC8vIGV4cGVjdGVkLWVycm9ye3snRCcgaXMgbm90IGEgY2xhc3MsIG5hbWVzcGFjZSwgb3Igc2NvcGVkIGVudW1lcmF0aW9ufX0KKyAgZC0+RDo6aXZhciA9IDEyOyAvLyBleHBlY3RlZC1lcnJvcnt7J0QnIGlzIG5vdCBhIGNsYXNzLCBuYW1lc3BhY2UsIG9yIHNjb3BlZCBlbnVtZXJhdGlvbn19CiB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPYmpDWFgvd2Fybi1vYmpjLWxpdGVyYWwtY29udmVyc2lvbi5tbSBiL3Rlc3QvU2VtYU9iakNYWC93YXJuLW9iamMtbGl0ZXJhbC1jb252ZXJzaW9uLm1tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjQ1NjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWFPYmpDWFgvd2Fybi1vYmpjLWxpdGVyYWwtY29udmVyc2lvbi5tbQpAQCAtMCwwICsxLDc0IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5IC1Xb2JqYy1saXRlcmFsLWNvbnZlcnNpb24gJXMKKworQGNsYXNzIE5TU3RyaW5nOworCitAaW50ZXJmYWNlIE5TTnVtYmVyCisrIChOU051bWJlciAqKW51bWJlcldpdGhDaGFyOihjaGFyKXZhbHVlOworKyAoTlNOdW1iZXIgKiludW1iZXJXaXRoSW50OihpbnQpdmFsdWU7CisrIChOU051bWJlciAqKW51bWJlcldpdGhMb25nTG9uZzoobG9uZyBsb25nKXZhbHVlOworKyAoTlNOdW1iZXIgKiludW1iZXJXaXRoRmxvYXQ6KGZsb2F0KXZhbHVlOworKyAoTlNOdW1iZXIgKiludW1iZXJXaXRoRG91YmxlOihkb3VibGUpdmFsdWU7CisrIChOU051bWJlciAqKW51bWJlcldpdGhCb29sOihib29sKXZhbHVlOworQGVuZAorCitAaW50ZXJmYWNlIE5TQXJyYXkKKysgKGlkKWFycmF5V2l0aE9iamVjdHM6KGNvbnN0IGlkIFtdKW9iamVjdHMgY291bnQ6KGludCljbnQ7CitAZW5kCisKK0BpbnRlcmZhY2UgTlNEaWN0aW9uYXJ5CisrIChpZClkaWN0aW9uYXJ5V2l0aE9iamVjdHM6KGNvbnN0IGlkIFtdKW9iamVjdHMgZm9yS2V5czooY29uc3QgaWQgW10pa2V5cyBjb3VudDoodW5zaWduZWQgbG9uZyljbnQ7CitAZW5kCisKK3ZvaWQgY2hhcl90ZXN0KCkgeworICBpZiAoQCdhJykge30KKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7aW1wbGljaXQgYm9vbGVhbiBjb252ZXJzaW9uIG9mIE9iamVjdGl2ZS1DIG9iamVjdCBsaXRlcmFsIGFsd2F5cyBldmFsdWF0ZXMgdG8gdHJ1ZX19Cit9CisKK3ZvaWQgaW50X3Rlc3QoKSB7CisgIGlmIChAMTIpIHt9CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2ltcGxpY2l0IGJvb2xlYW4gY29udmVyc2lvbiBvZiBPYmplY3RpdmUtQyBvYmplY3QgbGl0ZXJhbCBhbHdheXMgZXZhbHVhdGVzIHRvIHRydWV9fQorICBpZiAoQC0xMikge30KKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7aW1wbGljaXQgYm9vbGVhbiBjb252ZXJzaW9uIG9mIE9iamVjdGl2ZS1DIG9iamVjdCBsaXRlcmFsIGFsd2F5cyBldmFsdWF0ZXMgdG8gdHJ1ZX19CisgIGlmIChAMTJMTCkge30KKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7aW1wbGljaXQgYm9vbGVhbiBjb252ZXJzaW9uIG9mIE9iamVjdGl2ZS1DIG9iamVjdCBsaXRlcmFsIGFsd2F5cyBldmFsdWF0ZXMgdG8gdHJ1ZX19CisgIGlmIChALTEyTEwpIHt9CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2ltcGxpY2l0IGJvb2xlYW4gY29udmVyc2lvbiBvZiBPYmplY3RpdmUtQyBvYmplY3QgbGl0ZXJhbCBhbHdheXMgZXZhbHVhdGVzIHRvIHRydWV9fQorfQorCit2b2lkIGZsb2F0X3Rlc3QoKSB7CisgIGlmIChAMTIuNTUpIHt9CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2ltcGxpY2l0IGJvb2xlYW4gY29udmVyc2lvbiBvZiBPYmplY3RpdmUtQyBvYmplY3QgbGl0ZXJhbCBhbHdheXMgZXZhbHVhdGVzIHRvIHRydWV9fQorICBpZiAoQC0xMi41NSkge30KKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7aW1wbGljaXQgYm9vbGVhbiBjb252ZXJzaW9uIG9mIE9iamVjdGl2ZS1DIG9iamVjdCBsaXRlcmFsIGFsd2F5cyBldmFsdWF0ZXMgdG8gdHJ1ZX19CisgIGlmIChAMTIuNTVGKSB7fQorICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tpbXBsaWNpdCBib29sZWFuIGNvbnZlcnNpb24gb2YgT2JqZWN0aXZlLUMgb2JqZWN0IGxpdGVyYWwgYWx3YXlzIGV2YWx1YXRlcyB0byB0cnVlfX0KKyAgaWYgKEAtMTIuNTVGKSB7fQorICAvLyBleHBlY3RlZC13YXJuaW5nQC0xe3tpbXBsaWNpdCBib29sZWFuIGNvbnZlcnNpb24gb2YgT2JqZWN0aXZlLUMgb2JqZWN0IGxpdGVyYWwgYWx3YXlzIGV2YWx1YXRlcyB0byB0cnVlfX0KK30KKwordm9pZCBib29sX3Rlc3QoKSB7CisgIGlmIChAdHJ1ZSkge30KKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7aW1wbGljaXQgYm9vbGVhbiBjb252ZXJzaW9uIG9mIE9iamVjdGl2ZS1DIG9iamVjdCBsaXRlcmFsIGFsd2F5cyBldmFsdWF0ZXMgdG8gdHJ1ZX19CisgIGlmIChAZmFsc2UpIHt9CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2ltcGxpY2l0IGJvb2xlYW4gY29udmVyc2lvbiBvZiBPYmplY3RpdmUtQyBvYmplY3QgbGl0ZXJhbCBhbHdheXMgZXZhbHVhdGVzIHRvIHRydWV9fQorfQorCit2b2lkIHN0cmluZ190ZXN0KCkgeworICBpZiAoQCJhc2RmIikge30KKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7aW1wbGljaXQgYm9vbGVhbiBjb252ZXJzaW9uIG9mIE9iamVjdGl2ZS1DIG9iamVjdCBsaXRlcmFsIGFsd2F5cyBldmFsdWF0ZXMgdG8gdHJ1ZX19Cit9CisKK3ZvaWQgYXJyYXlfdGVzdCgpIHsKKyAgaWYgKEBbIEAzMTMsIEAzMzEsIEAzNjcsIEAzNzkgXSkge30KKyAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMXt7aW1wbGljaXQgYm9vbGVhbiBjb252ZXJzaW9uIG9mIE9iamVjdGl2ZS1DIG9iamVjdCBsaXRlcmFsIGFsd2F5cyBldmFsdWF0ZXMgdG8gdHJ1ZX19Cit9CisKK3ZvaWQgZGljdGlvbmFyeV90ZXN0KCkgeworICBpZiAoQHsgQDA6IEAwLCBAMTogQDEsIEAyOiBAMSwgQDM6IEAzIH0pIHt9CisgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTF7e2ltcGxpY2l0IGJvb2xlYW4gY29udmVyc2lvbiBvZiBPYmplY3RpdmUtQyBvYmplY3QgbGl0ZXJhbCBhbHdheXMgZXZhbHVhdGVzIHRvIHRydWV9fQorfQorCit2b2lkIG9iamNfYm9vbF90ZXN0ICgpIHsKKyAgaWYgKF9fb2JqY195ZXMpIHt9CisgIGlmIChfX29iamNfbm8pIHt9Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPcGVuQ0wvYWRkcmVzcy1zcGFjZXMuY2wgYi90ZXN0L1NlbWFPcGVuQ0wvYWRkcmVzcy1zcGFjZXMuY2wKaW5kZXggNmFiMTBiMy4uYjE4OGVhNCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hT3BlbkNML2FkZHJlc3Mtc3BhY2VzLmNsCisrKyBiL3Rlc3QvU2VtYU9wZW5DTC9hZGRyZXNzLXNwYWNlcy5jbApAQCAtMTEsMyArMTEsMjkgQEAKICAgaXAgPSAmbGk7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXNzaWduaW5nICdfX2xvY2FsIGludCAqJyB0byAnaW50IConIGNoYW5nZXMgYWRkcmVzcyBzcGFjZSBvZiBwb2ludGVyfX0KICAgaXAgPSAmY2k7IC8vIGV4cGVjdGVkLWVycm9yIHt7YXNzaWduaW5nICdfX2NvbnN0YW50IGludCAqJyB0byAnaW50IConIGNoYW5nZXMgYWRkcmVzcyBzcGFjZSBvZiBwb2ludGVyfX0KIH0KKwordm9pZCBleHBsaWNpdF9jYXN0KGdsb2JhbCBpbnQqIGcsIGxvY2FsIGludCogbCwgY29uc3RhbnQgaW50KiBjLCBwcml2YXRlIGludCogcCkKK3sKKyAgZyA9IChnbG9iYWwgaW50KikgbDsgICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYXN0aW5nICdfX2xvY2FsIGludCAqJyB0byB0eXBlICdfX2dsb2JhbCBpbnQgKicgY2hhbmdlcyBhZGRyZXNzIHNwYWNlIG9mIHBvaW50ZXJ9fQorICBnID0gKGdsb2JhbCBpbnQqKSBjOyAgICAvLyBleHBlY3RlZC1lcnJvciB7e2Nhc3RpbmcgJ19fY29uc3RhbnQgaW50IConIHRvIHR5cGUgJ19fZ2xvYmFsIGludCAqJyBjaGFuZ2VzIGFkZHJlc3Mgc3BhY2Ugb2YgcG9pbnRlcn19CisgIGcgPSAoZ2xvYmFsIGludCopIHA7ICAgIC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FzdGluZyAnaW50IConIHRvIHR5cGUgJ19fZ2xvYmFsIGludCAqJyBjaGFuZ2VzIGFkZHJlc3Mgc3BhY2Ugb2YgcG9pbnRlcn19CisKKyAgbCA9IChsb2NhbCBpbnQqKSBnOyAgICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYXN0aW5nICdfX2dsb2JhbCBpbnQgKicgdG8gdHlwZSAnX19sb2NhbCBpbnQgKicgY2hhbmdlcyBhZGRyZXNzIHNwYWNlIG9mIHBvaW50ZXJ9fQorICBsID0gKGxvY2FsIGludCopIGM7ICAgICAvLyBleHBlY3RlZC1lcnJvciB7e2Nhc3RpbmcgJ19fY29uc3RhbnQgaW50IConIHRvIHR5cGUgJ19fbG9jYWwgaW50IConIGNoYW5nZXMgYWRkcmVzcyBzcGFjZSBvZiBwb2ludGVyfX0KKyAgbCA9IChsb2NhbCBpbnQqKSBwOyAgICAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYXN0aW5nICdpbnQgKicgdG8gdHlwZSAnX19sb2NhbCBpbnQgKicgY2hhbmdlcyBhZGRyZXNzIHNwYWNlIG9mIHBvaW50ZXJ9fQorCisgIGMgPSAoY29uc3RhbnQgaW50KikgZzsgIC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FzdGluZyAnX19nbG9iYWwgaW50IConIHRvIHR5cGUgJ19fY29uc3RhbnQgaW50IConIGNoYW5nZXMgYWRkcmVzcyBzcGFjZSBvZiBwb2ludGVyfX0KKyAgYyA9IChjb25zdGFudCBpbnQqKSBsOyAgLy8gZXhwZWN0ZWQtZXJyb3Ige3tjYXN0aW5nICdfX2xvY2FsIGludCAqJyB0byB0eXBlICdfX2NvbnN0YW50IGludCAqJyBjaGFuZ2VzIGFkZHJlc3Mgc3BhY2Ugb2YgcG9pbnRlcn19CisgIGMgPSAoY29uc3RhbnQgaW50KikgcDsgIC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FzdGluZyAnaW50IConIHRvIHR5cGUgJ19fY29uc3RhbnQgaW50IConIGNoYW5nZXMgYWRkcmVzcyBzcGFjZSBvZiBwb2ludGVyfX0KKworICBwID0gKHByaXZhdGUgaW50KikgZzsgICAvLyBleHBlY3RlZC1lcnJvciB7e2Nhc3RpbmcgJ19fZ2xvYmFsIGludCAqJyB0byB0eXBlICdpbnQgKicgY2hhbmdlcyBhZGRyZXNzIHNwYWNlIG9mIHBvaW50ZXJ9fQorICBwID0gKHByaXZhdGUgaW50KikgbDsgICAvLyBleHBlY3RlZC1lcnJvciB7e2Nhc3RpbmcgJ19fbG9jYWwgaW50IConIHRvIHR5cGUgJ2ludCAqJyBjaGFuZ2VzIGFkZHJlc3Mgc3BhY2Ugb2YgcG9pbnRlcn19CisgIHAgPSAocHJpdmF0ZSBpbnQqKSBjOyAgIC8vIGV4cGVjdGVkLWVycm9yIHt7Y2FzdGluZyAnX19jb25zdGFudCBpbnQgKicgdG8gdHlwZSAnaW50IConIGNoYW5nZXMgYWRkcmVzcyBzcGFjZSBvZiBwb2ludGVyfX0KK30KKwordm9pZCBva19leHBsaWNpdF9jYXN0cyhnbG9iYWwgaW50ICpnLCBnbG9iYWwgaW50KiBnMiwgbG9jYWwgaW50KiBsLCBsb2NhbCBpbnQqIGwyLCBwcml2YXRlIGludCogcCwgcHJpdmF0ZSBpbnQqIHAyKQoreworICBnID0gKGdsb2JhbCBpbnQqKSBnMjsKKyAgbCA9IChsb2NhbCBpbnQqKSBsMjsKKyAgcCA9IChwcml2YXRlIGludCopIHAyOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT3BlbkNML2V2ZW50X3QuY2wgYi90ZXN0L1NlbWFPcGVuQ0wvZXZlbnRfdC5jbAppbmRleCA1YWI1YzEwLi5lMDk4ODM5IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPcGVuQ0wvZXZlbnRfdC5jbAorKysgYi90ZXN0L1NlbWFPcGVuQ0wvZXZlbnRfdC5jbApAQCAtNCw3ICs0LDcgQEAKIAogY29uc3RhbnQgc3RydWN0IGV2dF9zIHsKICAgZXZlbnRfdCBldnQ7ICAvLyBleHBlY3RlZC1lcnJvciB7e3RoZSBldmVudF90IHR5cGUgY2Fubm90IGJlIHVzZWQgdG8gZGVjbGFyZSBhIHN0cnVjdHVyZSBvciB1bmlvbiBmaWVsZH19Ci19IGV2dF9zdHI7Cit9IGV2dF9zdHIgPSB7MH07CiAKIHZvaWQgZm9vKGV2ZW50X3QgZXZ0KTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3Bhc3NpbmcgYXJndW1lbnQgdG8gcGFyYW1ldGVyICdldnQnIGhlcmV9fQogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFPcGVuQ0wvZXh0ZXJuLmNsIGIvdGVzdC9TZW1hT3BlbkNML2V4dGVybi5jbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVlMDcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hT3BlbkNML2V4dGVybi5jbApAQCAtMCwwICsxLDkgQEAKKy8vIFJVTjogJWNsYW5nX2NjMSAteCBjbCAtY2wtc3RkPUNMMS4yIC1lbWl0LWxsdm0gJXMgLW8gLSAtdmVyaWZ5IHwgRmlsZUNoZWNrICVzCisvLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcworCisvLyBDSEVDSzogQGZvbyA9IGV4dGVybmFsIGdsb2JhbCBmbG9hdAorZXh0ZXJuIGNvbnN0YW50IGZsb2F0IGZvbzsKKwora2VybmVsIHZvaWQgdGVzdChnbG9iYWwgZmxvYXQqIGJ1ZikgeworICBidWZbMF0gKz0gZm9vOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT3BlbkNML2Z1bmNfcHRyLmNsIGIvdGVzdC9TZW1hT3BlbkNML2Z1bmNfcHRyLmNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMWEzZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1NlbWFPcGVuQ0wvZnVuY19wdHIuY2wKQEAgLTAsMCArMSwxNiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxICVzIC12ZXJpZnkgLXBlZGFudGljIC1mc3ludGF4LW9ubHkKKwordm9pZCBmb28odm9pZCopOworCit2b2lkIGJhcigpCit7CisgIC8vIGRlY2xhcmluZyBhIGZ1bmN0aW9uIHBvaW50ZXIgaXMgYW4gZXJyb3IKKyAgdm9pZCAoKmZwdHIpKGludCk7IC8vIGV4cGVjdGVkLWVycm9ye3twb2ludGVycyB0byBmdW5jdGlvbnMgYXJlIG5vdCBhbGxvd2VkfX0KKworICAvLyB0YWtpbmcgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiBpcyBhbiBlcnJvcgorICBmb28oKHZvaWQqKWZvbyk7IC8vIGV4cGVjdGVkLWVycm9ye3t0YWtpbmcgYWRkcmVzcyBvZiBmdW5jdGlvbiBpcyBub3QgYWxsb3dlZH19CisgIGZvbygmZm9vKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3Rha2luZyBhZGRyZXNzIG9mIGZ1bmN0aW9uIGlzIG5vdCBhbGxvd2VkfX0KKworICAvLyBqdXN0IGNhbGxpbmcgYSBmdW5jdGlvbiBpcyBjb3JyZWN0CisgIGZvbygwKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9wZW5DTC9pbnZhbGlkLWNvbnN0YW50LmNsIGIvdGVzdC9TZW1hT3BlbkNML2ludmFsaWQtY29uc3RhbnQuY2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ODExZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYU9wZW5DTC9pbnZhbGlkLWNvbnN0YW50LmNsCkBAIC0wLDAgKzEsMiBAQAorLy8gUlVOOiAlY2xhbmdfY2MxIC12ZXJpZnkgJXMgCitjb25zdGFudCBpbnQgbm9faW5pdDsgLy8gZXhwZWN0ZWQtZXJyb3Ige3t2YXJpYWJsZSBpbiBjb25zdGFudCBhZGRyZXNzIHNwYWNlIG11c3QgYmUgaW5pdGlhbGl6ZWR9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT3BlbkNML2ludmFsaWQta2VybmVsLWF0dHJzLmNsIGIvdGVzdC9TZW1hT3BlbkNML2ludmFsaWQta2VybmVsLWF0dHJzLmNsCmluZGV4IDY2OGRjMmEuLmY3NjZhZGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYU9wZW5DTC9pbnZhbGlkLWtlcm5lbC1hdHRycy5jbAorKysgYi90ZXN0L1NlbWFPcGVuQ0wvaW52YWxpZC1rZXJuZWwtYXR0cnMuY2wKQEAgLTE0LDMgKzE0LDIwIEBACiAKIGtlcm5lbCBfX2F0dHJpYnV0ZV9fKCh3b3JrX2dyb3VwX3NpemVfaGludCgxLDIsMykpKSBfX2F0dHJpYnV0ZV9fKCh3b3JrX2dyb3VwX3NpemVfaGludCgzLDIsMSkpKSB2b2lkIGtlcm5lbDcoKSB7fSAgLy9leHBlY3RlZC13YXJuaW5ne3thdHRyaWJ1dGUgJ3dvcmtfZ3JvdXBfc2l6ZV9oaW50JyBpcyBhbHJlYWR5IGFwcGxpZWQgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVyc319CiAKK19fYXR0cmlidXRlX18oKHJlcWRfd29ya19ncm91cF9zaXplKDgsMTYsMzIpKSkgdm9pZCBrZXJuZWw4KCl7fSAvLyBleHBlY3RlZC1lcnJvciB7e2F0dHJpYnV0ZSAncmVxZF93b3JrX2dyb3VwX3NpemUnIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBrZXJuZWx9fQorCitfX2F0dHJpYnV0ZV9fKCh3b3JrX2dyb3VwX3NpemVfaGludCg4LDE2LDMyKSkpIHZvaWQga2VybmVsOSgpe30gLy8gZXhwZWN0ZWQtZXJyb3Ige3thdHRyaWJ1dGUgJ3dvcmtfZ3JvdXBfc2l6ZV9oaW50JyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEga2VybmVsfX0KKworX19hdHRyaWJ1dGVfXygodmVjX3R5cGVfaGludChjaGFyKSkpIHZvaWQga2VybmVsMTAoKXt9IC8vIGV4cGVjdGVkLWVycm9yIHt7YXR0cmlidXRlICd2ZWNfdHlwZV9oaW50JyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEga2VybmVsfX0KKworY29uc3RhbnQgaW50IGZvbzEgX19hdHRyaWJ1dGVfXygocmVxZF93b3JrX2dyb3VwX3NpemUoOCwxNiwzMikpKSA9IDA7IC8vIGV4cGVjdGVkLWVycm9yIHt7J3JlcWRfd29ya19ncm91cF9zaXplJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9uc319CisKK2NvbnN0YW50IGludCBmb28yIF9fYXR0cmlidXRlX18oKHdvcmtfZ3JvdXBfc2l6ZV9oaW50KDgsMTYsMzIpKSkgPSAwOyAvLyBleHBlY3RlZC1lcnJvciB7eyd3b3JrX2dyb3VwX3NpemVfaGludCcgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBmdW5jdGlvbnN9fQorCitjb25zdGFudCBpbnQgZm9vMyBfX2F0dHJpYnV0ZV9fKCh2ZWNfdHlwZV9oaW50KGNoYXIpKSkgPSAwOyAvLyBleHBlY3RlZC1lcnJvciB7eyd2ZWNfdHlwZV9oaW50JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9uc319CisKK3ZvaWQgZl9rZXJuZWxfaW1hZ2UyZF90KCBrZXJuZWwgaW1hZ2UyZF90IGltYWdlICkgeyAvLyBleHBlY3RlZC1lcnJvciB7eydrZXJuZWwnIGF0dHJpYnV0ZSBvbmx5IGFwcGxpZXMgdG8gZnVuY3Rpb25zfX0KKyAgaW50IF9fa2VybmVsIHg7IC8vIGV4cGVjdGVkLWVycm9yIHt7J19fa2VybmVsJyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIGZ1bmN0aW9uc319CisgIHJlYWRfb25seSBpbnQgaTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3sncmVhZF9vbmx5JyBhdHRyaWJ1dGUgb25seSBhcHBsaWVzIHRvIHBhcmFtZXRlcnN9fQorICBfX3dyaXRlX29ubHkgaW50IGo7IC8vIGV4cGVjdGVkLWVycm9yIHt7J19fd3JpdGVfb25seScgYXR0cmlidXRlIG9ubHkgYXBwbGllcyB0byBwYXJhbWV0ZXJzfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYU9wZW5DTC9pbnZhbGlkLWtlcm5lbC5jbCBiL3Rlc3QvU2VtYU9wZW5DTC9pbnZhbGlkLWtlcm5lbC5jbAppbmRleCBjMTJiZDg0Li5kZjczZWRkIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFPcGVuQ0wvaW52YWxpZC1rZXJuZWwuY2wKKysrIGIvdGVzdC9TZW1hT3BlbkNML2ludmFsaWQta2VybmVsLmNsCkBAIC0yLDYgKzIsOCBAQAogCiBrZXJuZWwgdm9pZCBub19wdHJwdHIoZ2xvYmFsIGludCAqKmkpIHsgfSAvLyBleHBlY3RlZC1lcnJvcnt7a2VybmVsIHBhcmFtZXRlciBjYW5ub3QgYmUgZGVjbGFyZWQgYXMgYSBwb2ludGVyIHRvIGEgcG9pbnRlcn19CiAKK19fa2VybmVsIHZvaWQgbm9fcHJpdmF0ZXB0cihfX3ByaXZhdGUgaW50ICppKSB7IH0gLy8gZXhwZWN0ZWQtZXJyb3Ige3trZXJuZWwgcGFyYW1ldGVyIGNhbm5vdCBiZSBkZWNsYXJlZCBhcyBhIHBvaW50ZXIgdG8gdGhlIF9fcHJpdmF0ZSBhZGRyZXNzIHNwYWNlfX0KKwoga2VybmVsIGludCBiYXIoKSAgeyAvLyBleHBlY3RlZC1lcnJvciB7e2tlcm5lbCBtdXN0IGhhdmUgdm9pZCByZXR1cm4gdHlwZX19CiAgIHJldHVybiA2OwogfQpAQCAtMTMsMyArMTUsMTUgQEAKIGludCBtYWluKCkgeyAvLyBleHBlY3RlZC1lcnJvciB7e2Z1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgJ21haW4nfX0KICAgcmV0dXJuIDA7CiB9CisKK2ludCogZ2xvYmFsIHgoaW50KiB4KSB7IC8vIGV4cGVjdGVkLWVycm9yIHt7cmV0dXJuIHZhbHVlIGNhbm5vdCBiZSBxdWFsaWZpZWQgd2l0aCBhZGRyZXNzIHNwYWNlfX0KKyAgcmV0dXJuIHggKyAxOworfQorCitpbnQqIGxvY2FsIHgoaW50KiB4KSB7IC8vIGV4cGVjdGVkLWVycm9yIHt7cmV0dXJuIHZhbHVlIGNhbm5vdCBiZSBxdWFsaWZpZWQgd2l0aCBhZGRyZXNzIHNwYWNlfX0KKyAgcmV0dXJuIHggKyAxOworfQorCitpbnQqIGNvbnN0YW50IHgoaW50KiB4KSB7IC8vIGV4cGVjdGVkLWVycm9yIHt7cmV0dXJuIHZhbHVlIGNhbm5vdCBiZSBxdWFsaWZpZWQgd2l0aCBhZGRyZXNzIHNwYWNlfX0KKyAgcmV0dXJuIHggKyAxOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hT3BlbkNML3NpemVvZi5jbCBiL3Rlc3QvU2VtYU9wZW5DTC9zaXplb2YuY2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmYzQzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvU2VtYU9wZW5DTC9zaXplb2YuY2wKQEAgLTAsMCArMSw1IEBACisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXZlcmlmeSAtZnN5bnRheC1vbmx5CisKK2tlcm5lbCB2b2lkIHRlc3QoZ2xvYmFsIGludCogYnVmKSB7CisgIGJ1ZlswXSA9IHNpemVvZih2b2lkKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbnZhbGlkIGFwcGxpY2F0aW9uIG9mICdzaXplb2YnIHRvIGEgdm9pZCB0eXBlfX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYVRlbXBsYXRlL2F0dHJpYnV0ZXMuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvYXR0cmlidXRlcy5jcHAKaW5kZXggNWEwNmE3MC4uMWQ0NjA1OCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hVGVtcGxhdGUvYXR0cmlidXRlcy5jcHAKKysrIGIvdGVzdC9TZW1hVGVtcGxhdGUvYXR0cmlidXRlcy5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKICAgdGVtcGxhdGU8dW5zaWduZWQgU2l6ZSwgdW5zaWduZWQgQWxpZ24+CiAgIGNsYXNzIG15X2FsaWduZWRfc3RvcmFnZQogICB7Ci0gICAgX19hdHRyaWJ1dGVfXygoYWxpZ24oQWxpZ24pKSkgY2hhciBzdG9yYWdlW1NpemVdOworICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoQWxpZ24pKSkgY2hhciBzdG9yYWdlW1NpemVdOwogICB9OwogICAKICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYVRlbXBsYXRlL2NsYXNzLXRlbXBsYXRlLWRlY2wuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvY2xhc3MtdGVtcGxhdGUtZGVjbC5jcHAKaW5kZXggZTY1ZGEyYi4uYjcyMWFhYiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hVGVtcGxhdGUvY2xhc3MtdGVtcGxhdGUtZGVjbC5jcHAKKysrIGIvdGVzdC9TZW1hVGVtcGxhdGUvY2xhc3MtdGVtcGxhdGUtZGVjbC5jcHAKQEAgLTE0LDYgKzE0LDEzIEBACiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIEQ7IC8vIGV4cGVjdGVkLWVycm9ye3t0ZW1wbGF0ZXMgbXVzdCBoYXZlIEMrKyBsaW5rYWdlfX0KIH0KIAorZXh0ZXJuICJDIiB7CisgIGNsYXNzIFBSMTc5NjggeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIEQ7IC8vIGV4cGVjdGVkLWVycm9ye3t0ZW1wbGF0ZXMgbXVzdCBoYXZlIEMrKyBsaW5rYWdlfX0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYoKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e3RlbXBsYXRlcyBtdXN0IGhhdmUgQysrIGxpbmthZ2V9fQorICB9OworfQorCiB0ZW1wbGF0ZTxjbGFzcyBVPiBjbGFzcyBBOyAvLyBleHBlY3RlZC1ub3Rle3twcmV2aW91cyB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiBpcyBoZXJlfX0KIAogdGVtcGxhdGU8aW50IE4+IGNsYXNzIEE7IC8vIGV4cGVjdGVkLWVycm9ye3t0ZW1wbGF0ZSBwYXJhbWV0ZXIgaGFzIGEgZGlmZmVyZW50IGtpbmQgaW4gdGVtcGxhdGUgcmVkZWNsYXJhdGlvbn19CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFUZW1wbGF0ZS9jbGFzcy10ZW1wbGF0ZS1zcGVjLmNwcCBiL3Rlc3QvU2VtYVRlbXBsYXRlL2NsYXNzLXRlbXBsYXRlLXNwZWMuY3BwCmluZGV4IGY5MDE1YjMuLjAyOTJjMWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL2NsYXNzLXRlbXBsYXRlLXNwZWMuY3BwCisrKyBiL3Rlc3QvU2VtYVRlbXBsYXRlL2NsYXNzLXRlbXBsYXRlLXNwZWMuY3BwCkBAIC05MSw3ICs5MSw3IEBACiBuYW1lc3BhY2UgTSB7CiAgIHRlbXBsYXRlPD4gc3RydWN0IDo6Tjo6QjxzaG9ydD4geyB9OyAvLyBleHBlY3RlZC1lcnJvcnt7Y2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gb2YgJ0InIG5vdCBpbiBhIG5hbWVzcGFjZSBlbmNsb3NpbmcgJ04nfX0KIAotICB0ZW1wbGF0ZTw+IHN0cnVjdCA6OkE8bG9uZyBkb3VibGU+OyAvLyBleHBlY3RlZC1lcnJvcnt7b3JpZ2luYWxseX19CisgIHRlbXBsYXRlPD4gc3RydWN0IDo6QTxsb25nIGRvdWJsZT47IC8vIGV4cGVjdGVkLWVycm9ye3ttdXN0IG9jY3VyIGF0IGdsb2JhbCBzY29wZX19CiB9CiAKIHRlbXBsYXRlPD4gc3RydWN0IE46OkI8Y2hhcj4geyAKQEAgLTExOSwzICsxMTksNjEgQEAKICAgfTsKIAogfQorCituYW1lc3BhY2UgUFIxODAwOSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgQSB7CisgICAgdGVtcGxhdGUgPGludCBOLCBpbnQgTT4gc3RydWN0IFM7CisgICAgdGVtcGxhdGUgPGludCBOPiBzdHJ1Y3QgUzxOLCBzaXplb2YoVCk+IHt9OworICB9OworICBBPGludD46OlM8OCwgc2l6ZW9mKGludCk+IGE7IC8vIG9rCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBCIHsKKyAgICB0ZW1wbGF0ZSA8aW50IE4sIGludCBNPiBzdHJ1Y3QgUzsgLy8gZXhwZWN0ZWQtbm90ZSB7e2RlY2xhcmVkIGhlcmV9fQorICAgIHRlbXBsYXRlIDxpbnQgTj4gc3RydWN0IFM8Tiwgc2l6ZW9mKFQpICsKKyAgICAgICAgTiAvLyBleHBlY3RlZC1lcnJvciB7e25vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IGRlcGVuZHMgb24gYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgdGhlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb259fQorICAgICAgICA+IHt9OworICB9OworICBCPGludD46OlM8OCwgc2l6ZW9mKGludCkgKyA4PiBzOyAvLyBleHBlY3RlZC1lcnJvciB7e3VuZGVmaW5lZH19CisKKyAgdGVtcGxhdGU8aW50IEE+IHN0cnVjdCBvdXRlciB7CisgICAgdGVtcGxhdGU8aW50IEIsIGludCBDPiBzdHJ1Y3QgaW5uZXIge307CisgICAgdGVtcGxhdGU8aW50IEM+IHN0cnVjdCBpbm5lcjxBICogMiwgQz4ge307CisgIH07Cit9CisKK25hbWVzcGFjZSBQUjE2NTE5IHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgVC4uLk4+IHN0cnVjdCBpbnRlZ2VyX3NlcXVlbmNlIHsgdHlwZWRlZiBUIHZhbHVlX3R5cGU7IH07IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRlbnNpb259fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBfX21ha2VfaW50ZWdlcl9zZXF1ZW5jZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgVCBOPiB1c2luZyBtYWtlX2ludGVnZXJfc2VxdWVuY2UgPSB0eXBlbmFtZSBfX21ha2VfaW50ZWdlcl9zZXF1ZW5jZTxUPjo6dGVtcGxhdGUgbWFrZTxOLCBOICUgMj46OnR5cGU7IC8vIGV4cGVjdGVkLXdhcm5pbmcge3tleHRlbnNpb259fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUgLi4uRXh0cmE+IHN0cnVjdCBfX21ha2VfaW50ZWdlcl9zZXF1ZW5jZV9pbXBsOyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0ZW5zaW9ufX0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgVCAuLi5OLCBUIC4uLkV4dHJhPiBzdHJ1Y3QgX19tYWtlX2ludGVnZXJfc2VxdWVuY2VfaW1wbDxpbnRlZ2VyX3NlcXVlbmNlPFQsIE4uLi4+LCBFeHRyYS4uLj4geyAvLyBleHBlY3RlZC13YXJuaW5nIDJ7e2V4dGVuc2lvbn19CisgICAgdHlwZWRlZiBpbnRlZ2VyX3NlcXVlbmNlPFQsIE4uLi4sIHNpemVvZi4uLihOKSArIE4uLi4sIEV4dHJhLi4uPiB0eXBlOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBfX21ha2VfaW50ZWdlcl9zZXF1ZW5jZSB7CisgICAgdGVtcGxhdGU8VCBOLCBUIFBhcml0eSwgdHlwZW5hbWUgPSB2b2lkPiBzdHJ1Y3QgbWFrZTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBEdW1teT4gc3RydWN0IG1ha2U8MCwgMCwgRHVtbXk+IHsgdHlwZWRlZiBpbnRlZ2VyX3NlcXVlbmNlPFQ+IHR5cGU7IH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRHVtbXk+IHN0cnVjdCBtYWtlPDEsIDEsIER1bW15PiB7IHR5cGVkZWYgaW50ZWdlcl9zZXF1ZW5jZTxULCAwPiB0eXBlOyB9OworICAgIHRlbXBsYXRlPFQgTiwgdHlwZW5hbWUgRHVtbXk+IHN0cnVjdCBtYWtlPE4sIDAsIER1bW15PiA6IF9fbWFrZV9pbnRlZ2VyX3NlcXVlbmNlX2ltcGw8bWFrZV9pbnRlZ2VyX3NlcXVlbmNlPFQsIE4vMj4gPiB7fTsKKyAgICB0ZW1wbGF0ZTxUIE4sIHR5cGVuYW1lIER1bW15PiBzdHJ1Y3QgbWFrZTxOLCAxLCBEdW1teT4gOiBfX21ha2VfaW50ZWdlcl9zZXF1ZW5jZV9pbXBsPG1ha2VfaW50ZWdlcl9zZXF1ZW5jZTxULCBOLzI+LCBOIC0gMT4ge307CisgIH07CisKKyAgdXNpbmcgWCA9IG1ha2VfaW50ZWdlcl9zZXF1ZW5jZTxpbnQsIDU+OyAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXh0ZW5zaW9ufX0KKyAgdXNpbmcgWCA9IGludGVnZXJfc2VxdWVuY2U8aW50LCAwLCAxLCAyLCAzLCA0PjsgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4dGVuc2lvbn19Cit9CisKK25hbWVzcGFjZSBEZWZhdWx0QXJnVnNQYXJ0aWFsU3BlYyB7CisgIC8vIENoZWNrIHRoYXQgdGhlIGRpYWdub3N0aWMgcG9pbnRzIGF0IHRoZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLCBub3QganVzdCBhdAorICAvLyB0aGUgZGVmYXVsdCBhcmd1bWVudC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IE4gPQorICAgICAgc2l6ZW9mKFQpIC8vIGV4cGVjdGVkLW5vdGUge3t0ZW1wbGF0ZSBwYXJhbWV0ZXIgaXMgdXNlZCBpbiBkZWZhdWx0IGFyZ3VtZW50IGRlY2xhcmVkIGhlcmV9fQorICA+IHN0cnVjdCBYIHt9OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWDxUPiB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBkZXBlbmRzIG9uIGEgdGVtcGxhdGUgcGFyYW1ldGVyIG9mIHRoZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9ufX0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgVCBOID0gMCAvLyBleHBlY3RlZC1ub3RlIHt7dGVtcGxhdGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIGhlcmV9fQorICA+IHN0cnVjdCBTOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUzxUPiB7fTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBzcGVjaWFsaXplcyBhIHRlbXBsYXRlIHBhcmFtZXRlciB3aXRoIGRlcGVuZGVudCB0eXBlICdUJ319Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFUZW1wbGF0ZS9kZXBlbmRlbnQtZXhwci5jcHAgYi90ZXN0L1NlbWFUZW1wbGF0ZS9kZXBlbmRlbnQtZXhwci5jcHAKaW5kZXggMmMyNmVjNS4uNzE5NWM5ZCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hVGVtcGxhdGUvZGVwZW5kZW50LWV4cHIuY3BwCisrKyBiL3Rlc3QvU2VtYVRlbXBsYXRlL2RlcGVuZGVudC1leHByLmNwcApAQCAtOTMsMyArOTMsMTAgQEAKICAgfQogICB0ZW1wbGF0ZSBzdHJ1Y3QgQTxpbnQ+OwogfQorCituYW1lc3BhY2UgUFIxODE1MiB7CisgIHRlbXBsYXRlPGludCBOPiBzdHJ1Y3QgQSB7CisgICAgc3RhdGljIGNvbnN0IGludCBuID0ge059OworICB9OworICB0ZW1wbGF0ZSBzdHJ1Y3QgQTwwPjsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYVRlbXBsYXRlL2RlcGVuZGVudC1uYW1lcy5jcHAgYi90ZXN0L1NlbWFUZW1wbGF0ZS9kZXBlbmRlbnQtbmFtZXMuY3BwCmluZGV4IDRkNGFhZmEuLjVhMjUwMzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL2RlcGVuZGVudC1uYW1lcy5jcHAKKysrIGIvdGVzdC9TZW1hVGVtcGxhdGUvZGVwZW5kZW50LW5hbWVzLmNwcApAQCAtMjMyLDcgKzIzMiw3IEBACiAgICAgICBzdHJ1Y3QgRGF0YSB7fTsKICAgICB9CiAKLSAgICBzdGQ6Om9zdHJlYW0gJnByaW50KHN0ZDo6b3N0cmVhbSAmb3V0LCBpbnQpOyAvLyBleHBlY3RlZC1ub3RlLXJlIHt7c2hvdWxkIGJlIGRlY2xhcmVkIHByaW9yIHRvIHRoZSBjYWxsIHNpdGUkfX0KKyAgICBzdGQ6Om9zdHJlYW0gJnByaW50KHN0ZDo6b3N0cmVhbSAmb3V0LCBpbnQpOyAvLyBleHBlY3RlZC1ub3RlLXJlIHt7c2hvdWxkIGJlIGRlY2xhcmVkIHByaW9yIHRvIHRoZSBjYWxsIHNpdGV7eyR9fX19CiAgICAgc3RkOjpvc3RyZWFtICZwcmludChzdGQ6Om9zdHJlYW0gJm91dCwgbnM6OkRhdGEpOyAvLyBleHBlY3RlZC1ub3RlIHt7c2hvdWxkIGJlIGRlY2xhcmVkIHByaW9yIHRvIHRoZSBjYWxsIHNpdGUgb3IgaW4gbmFtZXNwYWNlICdQUjEwMDUzOjpteV9maWxlMl9hOjpucyd9fQogICAgIHN0ZDo6b3N0cmVhbSAmcHJpbnQoc3RkOjpvc3RyZWFtICZvdXQsIHN0ZDo6dmVjdG9yPG5zMjo6RGF0YT4pOyAvLyBleHBlY3RlZC1ub3RlIHt7c2hvdWxkIGJlIGRlY2xhcmVkIHByaW9yIHRvIHRoZSBjYWxsIHNpdGUgb3IgaW4gbmFtZXNwYWNlICdQUjEwMDUzOjpteV9maWxlMl9hOjpuczInfX0KICAgICBzdGQ6Om9zdHJlYW0gJnByaW50KHN0ZDo6b3N0cmVhbSAmb3V0LCBzdGQ6OnBhaXI8bnM6OkRhdGEsIG5zMjo6RGF0YT4pOyAvLyBleHBlY3RlZC1ub3RlIHt7c2hvdWxkIGJlIGRlY2xhcmVkIHByaW9yIHRvIHRoZSBjYWxsIHNpdGUgb3IgaW4gYW4gYXNzb2NpYXRlZCBuYW1lc3BhY2Ugb2Ygb25lIG9mIGl0cyBhcmd1bWVudHN9fQpAQCAtMzk3LDUgKzM5Nyw1IEBACiAgIHN0cnVjdCBYIHt9OwogfTsKIHVzaW5nIHNpemVfdCA9IGRlY2x0eXBlKHNpemVvZigwKSk7Ci12b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90LCBPcGVyYXRvck5ldzo6WCk7IC8vIGV4cGVjdGVkLW5vdGUtcmUge3tzaG91bGQgYmUgZGVjbGFyZWQgcHJpb3IgdG8gdGhlIGNhbGwgc2l0ZSR9fQordm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgT3BlcmF0b3JOZXc6OlgpOyAvLyBleHBlY3RlZC1ub3RlLXJlIHt7c2hvdWxkIGJlIGRlY2xhcmVkIHByaW9yIHRvIHRoZSBjYWxsIHNpdGV7eyR9fX19CiB0ZW1wbGF0ZSB2b2lkIE9wZXJhdG9yTmV3OjpmKE9wZXJhdG9yTmV3OjpYKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2luc3RhbnRpYXRpb24gb2Z9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvZGVwZW5kZW50LXR5cGUtaWRlbnRpdHkuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvZGVwZW5kZW50LXR5cGUtaWRlbnRpdHkuY3BwCmluZGV4IDczMTAxM2MuLmE3OTY4MzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL2RlcGVuZGVudC10eXBlLWlkZW50aXR5LmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9kZXBlbmRlbnQtdHlwZS1pZGVudGl0eS5jcHAKQEAgLTk4LDMgKzk4LDI3IEBACiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICBUIFRlbXBsYXRlQ2xhc3MyPFQ+OjptZW1iZXJbVGVtcGxhdGVDbGFzczI8VD46OlNJWkVdOwogfQorCituYW1lc3BhY2UgUFIxODI3NSB7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBBIHsKKyAgICB2b2lkIGYoY29uc3QgaW50KTsKKyAgICB2b2lkIGcoaW50KTsKKyAgICB2b2lkIGgoY29uc3QgVCk7CisgICAgdm9pZCBpKFQpOworICB9OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHZvaWQgQTxUPjo6ZihpbnQgeCkgeyB4ID0gMDsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHZvaWQgQTxUPjo6Zyhjb25zdCBpbnQgeCkgeyB4ID0gMDsgfSAvLyBleHBlY3RlZC1lcnJvciB7e25vdCBhc3NpZ25hYmxlfX0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICB2b2lkIEE8VD46OmgoVCkge30gLy8gRklYTUU6IFNob3VsZCByZWplY3QgdGhpcy4gVHlwZSBpcyBkaWZmZXJlbnQgZnJvbSBwcmlvciBkZWNsIGlmIFQgaXMgYW4gYXJyYXkgdHlwZS4KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICB2b2lkIEE8VD46OmkoY29uc3QgVCkge30gLy8gRklYTUU6IFNob3VsZCByZWplY3QgdGhpcy4gVHlwZSBpcyBkaWZmZXJlbnQgZnJvbSBwcmlvciBkZWNsIGlmIFQgaXMgYW4gYXJyYXkgdHlwZS4KKworICB0ZW1wbGF0ZSBzdHJ1Y3QgQTxpbnQ+OworICB0ZW1wbGF0ZSBzdHJ1Y3QgQTxpbnRbMV0+OworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvZXhwbGljaXQtaW5zdGFudGlhdGlvbi5jcHAgYi90ZXN0L1NlbWFUZW1wbGF0ZS9leHBsaWNpdC1pbnN0YW50aWF0aW9uLmNwcAppbmRleCBkMDQwNDY0Li5jMjhjNWQxIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFUZW1wbGF0ZS9leHBsaWNpdC1pbnN0YW50aWF0aW9uLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9leHBsaWNpdC1pbnN0YW50aWF0aW9uLmNwcApAQCAtMTYsNyArMTYsNyBAQAogICB9IAogICBUKiBmMChUKiwgVCopIHsgcmV0dXJuIFQoKTsgfSAvLyBleHBlY3RlZC13YXJuaW5ne3tleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlcyB0byB6ZXJvIHRyZWF0ZWQgYXMgYSBudWxsIHBvaW50ZXIgY29uc3RhbnQgb2YgdHlwZSAnaW50IConfX0KIAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gVCBmMChULCBVKSB7IHJldHVybiBUKCk7IH0gLy8gZXhwZWN0ZWQtbm90ZSB7e2NhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOiBjb3VsZCBub3QgbWF0Y2ggJ2ludCAoaW50LCBVKScgYWdhaW5zdCAnaW50IChpbnQpIGNvbnN0J319IFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IFQgZjAoVCwgVSkgeyByZXR1cm4gVCgpOyB9IC8vIGV4cGVjdGVkLW5vdGUtcmUge3tjYW5kaWRhdGUgdGVtcGxhdGUgaWdub3JlZDogY291bGQgbm90IG1hdGNoICdpbnQgKGludCwgVSl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319JyBhZ2FpbnN0ICdpbnQgKGludCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319IGNvbnN0J319IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3tjYW5kaWRhdGUgdGVtcGxhdGUgaWdub3JlZDogY291bGQgbm90IG1hdGNoICdpbnQnIGFnYWluc3QgJ2ludCAqJ319CiB9OwogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFUZW1wbGF0ZS9pbmplY3QtdGVtcGxhdGVkLWZyaWVuZC1wb3N0LmNwcCBiL3Rlc3QvU2VtYVRlbXBsYXRlL2luamVjdC10ZW1wbGF0ZWQtZnJpZW5kLXBvc3QuY3BwCmluZGV4IGM4NmY3MTguLmI4YjlhMzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL2luamVjdC10ZW1wbGF0ZWQtZnJpZW5kLXBvc3QuY3BwCisrKyBiL3Rlc3QvU2VtYVRlbXBsYXRlL2luamVjdC10ZW1wbGF0ZWQtZnJpZW5kLXBvc3QuY3BwCkBAIC0xLDEyICsxLDE3IEBACi0vLyBSVU46ICVjbGFuZyAlcyAtc3RkPWMrKzk4IC1TIC1lbWl0LWxsdm0gLW8gLSB8IGdyZXAgLWUgImRlZmluZSBsaW5rb25jZV9vZHIuKl9abHNSMTFzdGRfb3N0cmVhbVJLOFN0cmVhbWVySTNGb29FIgotLy8gUlVOOiAlY2xhbmcgJXMgLXN0ZD1jKys5OCAtUyAtZW1pdC1sbHZtIC1vIC0gLURQUk9UT1RZUEUgfCBncmVwIC1lICJkZWZpbmUgbGlua29uY2Vfb2RyLipfWmxzUjExc3RkX29zdHJlYW1SSzhTdHJlYW1lckkzRm9vRSIKLS8vIFJVTjogJWNsYW5nICVzIC1zdGQ9YysrOTggLVMgLWVtaXQtbGx2bSAtbyAtIC1ESU5TVEFOVElBVEUgfCBncmVwIC1lICJkZWZpbmUgbGlua29uY2Vfb2RyLipfWmxzUjExc3RkX29zdHJlYW1SSzhTdHJlYW1lckkzRm9vRSIKLS8vIFJVTjogJWNsYW5nICVzIC1zdGQ9YysrOTggLVMgLWVtaXQtbGx2bSAtbyAtIC1EUFJPVE9UWVBFIC1ESU5TVEFOVElBVEUgfCBncmVwIC1lICJkZWZpbmUgbGlua29uY2Vfb2RyLipfWmxzUjExc3RkX29zdHJlYW1SSzhTdHJlYW1lckkzRm9vRSIKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtc3RkPWMrKzk4IC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtc3RkPWMrKzk4IC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gLURQUk9UT1RZUEUgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stUFJPVE9UWVBFICVzCisvLyBSVU46ICVjbGFuZ19jYzEgJXMgLXN0ZD1jKys5OCAtdHJpcGxlICVpdGFuaXVtX2FiaV90cmlwbGUgLWVtaXQtbGx2bSAtbyAtIC1ESU5TVEFOVElBVEUgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9Q0hFQ0stSU5TVEFOVElBVEUgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtc3RkPWMrKzk4IC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZW1pdC1sbHZtIC1vIC0gLURQUk9UT1RZUEUgLURJTlNUQU5USUFURSB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1DSEVDSy1QUk9UT1RZUEUtSU5TVEFOVElBVEUgJXMKIC8vIFJVTjogJWNsYW5nX2NjMSAlcyAtRFJFREVGSU5FIC12ZXJpZnkKIC8vIFJVTjogJWNsYW5nX2NjMSAlcyAtRFBST1RPVFlQRSAtRFJFREVGSU5FIC12ZXJpZnkKIC8vIFBSODAwNzogZnJpZW5kIGZ1bmN0aW9uIG5vdCBpbnN0YW50aWF0ZWQsIHJlb3JkZXJlZCB2ZXJzaW9uLgogLy8gQ29ycmVzcG9uZHMgdG8gaHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zODM5MgogCisvLyBDSEVDSzogZGVmaW5lIGxpbmtvbmNlX29kcnt7Lip9fV9abHNSMTFzdGRfb3N0cmVhbVJLOFN0cmVhbWVySTNGb29FCisvLyBDSEVDSy1QUk9UT1RZUEU6IGRlZmluZSBsaW5rb25jZV9vZHJ7ey4qfX1fWmxzUjExc3RkX29zdHJlYW1SSzhTdHJlYW1lckkzRm9vRQorLy8gQ0hFQ0stSU5TVEFOVElBVEU6IGRlZmluZSBsaW5rb25jZV9vZHJ7ey4qfX1fWmxzUjExc3RkX29zdHJlYW1SSzhTdHJlYW1lckkzRm9vRQorLy8gQ0hFQ0stUFJPVE9UWVBFLUlOU1RBTlRJQVRFOiBkZWZpbmUgbGlua29uY2Vfb2Rye3suKn19X1psc1IxMXN0ZF9vc3RyZWFtUks4U3RyZWFtZXJJM0Zvb0UKKwogc3RydWN0IHN0ZF9vc3RyZWFtCiB7CiAgIGludCBkdW1teTsKQEAgLTE5LDcgKzI0LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgRm9vIHt9IEZvbzsKIAotc3RkX29zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGRfb3N0cmVhbSYsIGNvbnN0IFN0cmVhbWVyPEZvbz4mKTsKK2lubGluZSBzdGRfb3N0cmVhbSYgb3BlcmF0b3IgPDwgKHN0ZF9vc3RyZWFtJiwgY29uc3QgU3RyZWFtZXI8Rm9vPiYpOwogCiB2b2lkIHRlc3QoY29uc3QgU3RyZWFtZXI8Rm9vPiYgZm9vKQogewpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5qZWN0LXRlbXBsYXRlZC1mcmllbmQuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvaW5qZWN0LXRlbXBsYXRlZC1mcmllbmQuY3BwCmluZGV4IDdiZTYxM2IuLmYwZjI4N2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL2luamVjdC10ZW1wbGF0ZWQtZnJpZW5kLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbmplY3QtdGVtcGxhdGVkLWZyaWVuZC5jcHAKQEAgLTEsNyArMSw5IEBACi0vLyBSVU46ICVjbGFuZyAlcyAtUyAtZW1pdC1sbHZtIC1vIC0gfCBncmVwIC1lICJkZWZpbmUgbGlua29uY2Vfb2RyLipfWmxzUjExc3RkX29zdHJlYW1SSzhTdHJlYW1lckkzRm9vRSIKKy8vIFJVTjogJWNsYW5nX2NjMSAlcyAtZW1pdC1sbHZtIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtbyAtIHwgRmlsZUNoZWNrICVzCiAvLyBSVU46ICVjbGFuZ19jYzEgJXMgLURSRURFRklORSAtdmVyaWZ5CiAvLyBQUjgwMDc6IGZyaWVuZCBmdW5jdGlvbiBub3QgaW5zdGFudGlhdGVkLgogCisvLyBDSEVDSzogZGVmaW5lIGxpbmtvbmNlX29kcnt7Lip9fV9abHNSMTFzdGRfb3N0cmVhbVJLOFN0cmVhbWVySTNGb29FCisKIHN0cnVjdCBzdGRfb3N0cmVhbQogewogICBpbnQgZHVtbXk7CkBAIC0yNyw3ICsyOSw3IEBACiAKIHR5cGVkZWYgc3RydWN0IEZvbyB7fSBGb287CiAKLXN0ZF9vc3RyZWFtJiBvcGVyYXRvciA8PCAoc3RkX29zdHJlYW0mLCBjb25zdCBTdHJlYW1lcjxGb28+Jik7CitpbmxpbmUgc3RkX29zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGRfb3N0cmVhbSYsIGNvbnN0IFN0cmVhbWVyPEZvbz4mKTsKICNpZmRlZiBSRURFRklORQogc3RkX29zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGRfb3N0cmVhbSYgbywgY29uc3QgU3RyZWFtZXI8Rm9vPiYpIC8vIGV4cGVjdGVkLW5vdGV7e2lzIGhlcmV9fQogewpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtY29tcGxldGUuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtY29tcGxldGUuY3BwCmluZGV4IDY4ZDVhZTMuLmEyOWU5ZDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL2luc3RhbnRpYXRlLWNvbXBsZXRlLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1jb21wbGV0ZS5jcHAKQEAgLTEsNCArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJW1zX2FiaV90cmlwbGUgLURNU0FCSSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKIAogLy8gVGVzdHMgdmFyaW91cyBwbGFjZXMgd2hlcmUgcmVxdWlyaW5nIGEgY29tcGxldGUgdHlwZSBpbnZvbHZlcwogLy8gaW5zdGFudGlhdGlvbiBvZiB0aGF0IHR5cGUuCkBAIC03LDYgKzgsOSBAQAogc3RydWN0IFggewogICBYKFQpOwogCisjaWZkZWYgTVNBQkkKKy8vIGV4cGVjdGVkLWVycm9yQCsye3tkYXRhIG1lbWJlciBpbnN0YW50aWF0ZWQgd2l0aCBmdW5jdGlvbiB0eXBlICdsb25nIChsb25nKSd9fQorI2VuZGlmCiAgIFQgZjsgLy8gZXhwZWN0ZWQtZXJyb3J7e2RhdGEgbWVtYmVyIGluc3RhbnRpYXRlZCB3aXRoIGZ1bmN0aW9uIHR5cGUgJ2Zsb2F0IChpbnQpJ319IFwKICAgICAgICAvLyBleHBlY3RlZC1lcnJvcnt7ZGF0YSBtZW1iZXIgaW5zdGFudGlhdGVkIHdpdGggZnVuY3Rpb24gdHlwZSAnaW50IChpbnQpJ319IFwKICAgICAgICAvLyBleHBlY3RlZC1lcnJvcnt7ZGF0YSBtZW1iZXIgaW5zdGFudGlhdGVkIHdpdGggZnVuY3Rpb24gdHlwZSAnY2hhciAoY2hhciknfX0gXApAQCAtNDAsNyArNDQsMTEgQEAKIAogdm9pZCB0ZXN0X21lbXB0cihYPGxvbmc+ICpwMSwgbG9uZyBYPGxvbmc+OjoqcG0xLAogICAgICAgICAgICAgICAgICBYPGxvbmcobG9uZyk+ICpwMiwgCisjaWZkZWYgTVNBQkkKKyAgICAgICAgICAgICAgICAgbG9uZyAoWDxsb25nKGxvbmcpPjo6KnBtMikobG9uZykpIHsgLy8gZXhwZWN0ZWQtbm90ZXt7aW4gaW5zdGFudGlhdGlvbiBvZiB0ZW1wbGF0ZSBjbGFzcyAnWDxsb25nIChsb25nKT4nIHJlcXVlc3RlZCBoZXJlfX0KKyNlbHNlCiAgICAgICAgICAgICAgICAgIGxvbmcgKFg8bG9uZyhsb25nKT46OipwbTIpKGxvbmcpKSB7CisjZW5kaWYKICAgKHZvaWQpKHAxLT4qcG0xKTsKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtZW51bS5jcHAgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1lbnVtLmNwcAppbmRleCA1MzUzYTkyLi4zZGE4ZWI0IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1lbnVtLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1lbnVtLmNwcApAQCAtMjUsMyArMjUsMTggQEAKIAogICB0ZW1wbGF0ZSB2b2lkIGY8aW50PigpOwogfQorCituYW1lc3BhY2UgRW51bVNjb3BpbmcgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEMgeworICBlbnVtIHsKKyAgICB2YWx1ZSA9IDQyCisgIH07Cit9OworCit2b2lkIGYoaW50IGksIEM8aW50Pjo6QyBjKSB7CisgIGludCB2YWx1ZTsKK30KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtZXhjZXB0aW9uLXNwZWMtY3h4MTEuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtZXhjZXB0aW9uLXNwZWMtY3h4MTEuY3BwCmluZGV4IDVmNDNlYTIuLmEzNzZmMGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL2luc3RhbnRpYXRlLWV4Y2VwdGlvbi1zcGVjLWN4eDExLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1leGNlcHRpb24tc3BlYy1jeHgxMS5jcHAKQEAgLTEsOCArMSwxMSBAQAotLy8gUlVOOiAlY2xhbmdfY2MxIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAtc3RkPWMrKzExIC1mdGVtcGxhdGUtZGVwdGggMTYgLWZjeHgtZXhjZXB0aW9ucyAtZmV4Y2VwdGlvbnMgJXMKKy8vIFJVTjogJWNsYW5nX2NjMSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1zdGQ9YysrMTEgLWZ0ZW1wbGF0ZS1kZXB0aCAxNiAtZmN4eC1leGNlcHRpb25zIC1mZXhjZXB0aW9ucyAlcwogCiAvLyBEUjEzMzA6IGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGZvciBhIGZ1bmN0aW9uIHRlbXBsYXRlIGlzIG9ubHkKIC8vIGluc3RhbnRpYXRlZCB3aGVuIGl0IGlzIG5lZWRlZC4KIAorLy8gTm90ZTogdGhlIHRlc3QgaXMgSXRhbml1bS1zcGVjaWZpYyBiZWNhdXNlIGl0IGRlcGVuZHMgb24ga2V5IGZ1bmN0aW9ucyBpbiB0aGUKKy8vIFBSMTI3NjMgbmFtZXNwYWNlLgorCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYxKFQqKSB0aHJvdyhUKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2luY29tcGxldGUgdHlwZSAnSW5jb21wbGV0ZScgaXMgbm90IGFsbG93ZWQgaW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb259fQogc3RydWN0IEluY29tcGxldGU7IC8vIGV4cGVjdGVkLW5vdGV7e2ZvcndhcmR9fQogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1leGNlcHRpb24tc3BlYy5jcHAgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1leGNlcHRpb24tc3BlYy5jcHAKaW5kZXggZDRmMTJkZi4uOTkzZWU4ZCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtZXhjZXB0aW9uLXNwZWMuY3BwCisrKyBiL3Rlc3QvU2VtYVRlbXBsYXRlL2luc3RhbnRpYXRlLWV4Y2VwdGlvbi1zcGVjLmNwcApAQCAtMSwxMSArMSw5IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCiAKLS8vIEZJWE1FOiB0aGUgIm5vdGUiIHNob3VsZCBiZSBkb3duIGF0IHRoZSBjYWxsIHNpdGUhCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYxKFQqKSB0aHJvdyhUKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2luY29tcGxldGUgdHlwZSAnSW5jb21wbGV0ZScgaXMgbm90IGFsbG93ZWQgaW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb259fSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZXt7aW5zdGFudGlhdGlvbiBvZn19Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGYxKFQqKSB0aHJvdyhUKTsgLy8gZXhwZWN0ZWQtZXJyb3J7e2luY29tcGxldGUgdHlwZSAnSW5jb21wbGV0ZScgaXMgbm90IGFsbG93ZWQgaW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb259fQogc3RydWN0IEluY29tcGxldGU7IC8vIGV4cGVjdGVkLW5vdGV7e2ZvcndhcmR9fQogCiB2b2lkIHRlc3RfZjEoSW5jb21wbGV0ZSAqaW5jb21wbGV0ZV9wLCBpbnQgKmludF9wKSB7CiAgIGYxKGludF9wKTsKLSAgZjEoaW5jb21wbGV0ZV9wKTsgCisgIGYxKGluY29tcGxldGVfcCk7IC8vIGV4cGVjdGVkLW5vdGV7e2luc3RhbnRpYXRpb24gb2Z9fQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtZnVuY3Rpb24tMi5jcHAgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1mdW5jdGlvbi0yLmNwcAppbmRleCAxOWE4YjYxLi5mNTA4OWM5IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1mdW5jdGlvbi0yLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1mdW5jdGlvbi0yLmNwcApAQCAtNjQsMyArNjQsMjggQEAKICAgICAoZikoMTcpOwogICB9CiB9CisKK25hbWVzcGFjZSByZGFyMTU0NjQ1NDcgeworICBjbGFzcyBBIHsKKyAgICBBKCk7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFI+IGNsYXNzIEIgeworICBwdWJsaWM6CisgICAgc3RhdGljIHZvaWQgbWV0aDEoKTsKKyAgICBzdGF0aWMgdm9pZCBtZXRoMigpOworICB9OworCisgIEE6OkEoKSB7CisgICAgZXh0ZXJuIGludCBjb21waWxlX3RpbWVfYXNzZXJ0X2ZhaWxlZDsKKyAgICBCPGludD46Om1ldGgyKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUj4gdm9pZCBCPFI+OjptZXRoMSgpIHsKKyAgICBleHRlcm4gaW50IGNvbXBpbGVfdGltZV9hc3NlcnRfZmFpbGVkOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFI+IHZvaWQgQjxSPjo6bWV0aDIoKSB7CisgICAgZXh0ZXJuIGludCBjb21waWxlX3RpbWVfYXNzZXJ0X2ZhaWxlZDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtZnVuY3Rpb24tcGFyYW1zLmNwcCBiL3Rlc3QvU2VtYVRlbXBsYXRlL2luc3RhbnRpYXRlLWZ1bmN0aW9uLXBhcmFtcy5jcHAKaW5kZXggNWJmYWU1My4uNTU2YTgxOCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtZnVuY3Rpb24tcGFyYW1zLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1mdW5jdGlvbi1wYXJhbXMuY3BwCkBAIC03LDEyICs3LDEyIEBACiB9OwogdGVtcGxhdGUgPGNsYXNzIE1vZGVsLCB2b2lkIChNb2RlbDo6KikoKT4gc3RydWN0IHdyYXBfY29uc3RyYWludHMgeyB9OwogdGVtcGxhdGUgPGNsYXNzIE1vZGVsPiAKLWlubGluZSBjaGFyIGhhc19jb25zdHJhaW50c18oTW9kZWwqICwgIC8vIGV4cGVjdGVkLW5vdGUgMnt7d2hpbGUgc3Vic3RpdHV0aW5nIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnRzIGludG8gZnVuY3Rpb24gdGVtcGxhdGUgJ2hhc19jb25zdHJhaW50c18nIFt3aXRoIH19IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSAze3tjYW5kaWRhdGUgdGVtcGxhdGUgaWdub3JlZH19CitpbmxpbmUgY2hhciBoYXNfY29uc3RyYWludHNfKE1vZGVsKiAsIC8vIGV4cGVjdGVkLW5vdGUgM3t7Y2FuZGlkYXRlIHRlbXBsYXRlIGlnbm9yZWR9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfY29uc3RyYWludHM8TW9kZWwsJk1vZGVsOjpjb25zdHJhaW50cz4qID0gMCk7IC8vIGV4cGVjdGVkLW5vdGUgMnt7aW4gaW5zdGFudGlhdGlvbn19CiAKIHRlbXBsYXRlIDxjbGFzcyBNb2RlbD4gc3RydWN0IG5vdF9zYXRpc2ZpZWQgewotICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZiggaGFzX2NvbnN0cmFpbnRzXygoTW9kZWwqKTApICA9PSAxKTsgLy8gZXhwZWN0ZWQtZXJyb3IgM3t7bm8gbWF0Y2hpbmcgZnVuY3Rpb259fQorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZiggaGFzX2NvbnN0cmFpbnRzXygoTW9kZWwqKTApICA9PSAxKTsgLy8gZXhwZWN0ZWQtZXJyb3IgM3t7bm8gbWF0Y2hpbmcgZnVuY3Rpb259fSBcCisgIC8vIGV4cGVjdGVkLW5vdGUgMnt7d2hpbGUgc3Vic3RpdHV0aW5nIGRlZHVjZWQgdGVtcGxhdGUgYXJndW1lbnRzIGludG8gZnVuY3Rpb24gdGVtcGxhdGUgJ2hhc19jb25zdHJhaW50c18nIFt3aXRoIH19CiB9OwogdGVtcGxhdGUgPGNsYXNzIE1vZGVsRm4+IHN0cnVjdCByZXF1aXJlbWVudF87CiB0ZW1wbGF0ZSA8dm9pZCgqKSgpPiBzdHJ1Y3QgaW5zdGFudGlhdGUgewpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtbG9jYWwtY2xhc3MuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtbG9jYWwtY2xhc3MuY3BwCmluZGV4IDJiZjI0YzIuLmM5ODk3YjkgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL2luc3RhbnRpYXRlLWxvY2FsLWNsYXNzLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1sb2NhbC1jbGFzcy5jcHAKQEAgLTEsNSArMSw0IEBACiAvLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtc3RkPWMrKzExICVzCi0vLyBleHBlY3RlZC1uby1kaWFnbm9zdGljcwogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIHZvaWQgZjAoKSB7CiAgIHN0cnVjdCBYOwpAQCAtMTgxLDMgKzE4MCwxNyBAQAogICAgIHJldHVybiAwOwogICB9CiB9CisKK25hbWVzcGFjZSBQUjE4OTA3IHsKK3RlbXBsYXRlIDx0eXBlbmFtZT4KK2NsYXNzIEMgOiBwdWJsaWMgQzxpbnQ+IHt9OyAvLyBleHBlY3RlZC1lcnJvcnt7d2l0aGluIGl0cyBvd24gZGVmaW5pdGlvbn19CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBYPgordm9pZCBGKCkgeworICBzdHJ1Y3QgQSA6IEM8WD4ge307Cit9CisKK3N0cnVjdCBCIHsKKyAgdm9pZCBmKCkgeyBGPGludD4oKTsgfQorfTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYVRlbXBsYXRlL2luc3RhbnRpYXRlLW1ldGhvZC5jcHAgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS1tZXRob2QuY3BwCmluZGV4IDVlOWRhM2YuLjU4Y2I4OTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL2luc3RhbnRpYXRlLW1ldGhvZC5jcHAKKysrIGIvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtbWV0aG9kLmNwcApAQCAtMTc4LDcgKzE3OCw3IEBACiBuYW1lc3BhY2UgU2FtZVNpZ25hdHVyZUFmdGVySW5zdGFudGlhdGlvbiB7CiAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBTIHsKICAgICB2b2lkIGYoVCAqKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZXZpb3VzfX0KLSAgICB2b2lkIGYoY29uc3QgVCopOyAvLyBleHBlY3RlZC1lcnJvciB7e211bHRpcGxlIG92ZXJsb2FkcyBvZiAnZicgaW5zdGFudGlhdGUgdG8gdGhlIHNhbWUgc2lnbmF0dXJlICd2b2lkIChjb25zdCBpbnQgKiknfX0KKyAgICB2b2lkIGYoY29uc3QgVCopOyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e211bHRpcGxlIG92ZXJsb2FkcyBvZiAnZicgaW5zdGFudGlhdGUgdG8gdGhlIHNhbWUgc2lnbmF0dXJlICd2b2lkIChjb25zdCBpbnQgKil7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319J319CiAgIH07CiAgIFM8Y29uc3QgaW50PiBzOyAvLyBleHBlY3RlZC1ub3RlIHt7aW5zdGFudGlhdGlvbn19CiB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0ZS12YXItdGVtcGxhdGUuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtdmFyLXRlbXBsYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDdjNDMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGUtdmFyLXRlbXBsYXRlLmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBSVU46ICVjbGFuZ19jYzEgLXZlcmlmeSAtc3RkPWMrKzF5ICVzCisKK25hbWVzcGFjZSBQUjE3ODQ2IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0ZXhwciBUIHBpID0gVCgzLjE0KTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0ZXhwciBUIHRhdSA9IDIgKiBwaTxUPjsKKyAgY29uc3RleHByIGRvdWJsZSB0YXVfZG91YmxlID0gdGF1PGRvdWJsZT47CisgIHN0YXRpY19hc3NlcnQodGF1X2RvdWJsZSA9PSA2LjI4LCAiIik7Cit9CisKK25hbWVzcGFjZSBQUjE3ODQ4IHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3RleHByIFQgdmFyID0gMTIzNDU7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0ZXhwciBUIGYoKSB7IHJldHVybiB2YXI8VD47IH0KKyAgY29uc3RleHByIGludCBrID0gZjxpbnQ+KCk7CisgIHN0YXRpY19hc3NlcnQoayA9PSAxMjM0NSwgIiIpOworfQorCituYW1lc3BhY2UgTm9uRGVwZW5kZW50IHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3RleHByIFQgYSA9IDA7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0ZXhwciBUIGIgPSBhPGludD47CisgIHN0YXRpY19hc3NlcnQoYjxpbnQ+ID09IDAsICIiKTsKK30KKworbmFtZXNwYWNlIEluc3RhbnRpYXRpb25EZXBlbmRlbnQgeworICBpbnQgZihpbnQpOworICB2b2lkIGYoY2hhcik7CisKKyAgdGVtcGxhdGU8aW50PiBjb25zdGV4cHIgaW50IGEgPSAxOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdGV4cHIgVCBiID0gYTxzaXplb2Yoc2l6ZW9mKGYoVCgpKSkpPjsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbnZhbGlkIGFwcGxpY2F0aW9uIG9mICdzaXplb2YnIHRvIGFuIGluY29tcGxldGUgdHlwZSAndm9pZCd9fQorCisgIHN0YXRpY19hc3NlcnQoYjxpbnQ+ID09IDEsICIiKTsKKyAgc3RhdGljX2Fzc2VydChiPGNoYXI+ID09IDEsICIiKTsgLy8gZXhwZWN0ZWQtbm90ZSB7e2luIGluc3RhbnRpYXRpb24gb2Z9fSBleHBlY3RlZC1lcnJvciB7e25vdCBhbiBpbnRlZ3JhbCBjb25zdGFudH19CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmKCkgeworICAgIHN0YXRpY19hc3NlcnQoYTxzaXplb2Yoc2l6ZW9mKGYoVCgpKSkpPiA9PSAwLCAiIik7IC8vIGV4cGVjdGVkLWVycm9yIHt7c3RhdGljX2Fzc2VydCBmYWlsZWR9fQorICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0aW9uLWJhY2t0cmFjZS5jcHAgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0aW9uLWJhY2t0cmFjZS5jcHAKaW5kZXggZjY0MDgzNi4uMzlkZmIwYiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGlvbi1iYWNrdHJhY2UuY3BwCisrKyBiL3Rlc3QvU2VtYVRlbXBsYXRlL2luc3RhbnRpYXRpb24tYmFja3RyYWNlLmNwcApAQCAtMzksMTMgKzM5LDEzIEBACiAgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CiAgICAgdHlwZW5hbWUgUmVzdWx0VHk8VDI+OjplcnJvciBEZWR1Y2UoIHZvaWQgKFQxOjoqbWVtYmVyKShUMikgKSB7fSAvLyBcCiAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e2luc3RhbnRpYXRpb24gb2YgdGVtcGxhdGUgY2xhc3MgJ1BSMTMzNjU6OlJlc3VsdFR5PGludCAmPid9fSBcCi0gICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3N1YnN0aXR1dGluZyBkZWR1Y2VkIHRlbXBsYXRlIGFyZ3VtZW50cyBpbnRvIGZ1bmN0aW9uIHRlbXBsYXRlICdEZWR1Y2UnIFt3aXRoIFQxID0gUFIxMzM2NTo6Q2xzLCBUMiA9IGludCAmXX19IFwKICAgICAvLyBleHBlY3RlZC1ub3RlIHt7c3Vic3RpdHV0aW9uIGZhaWx1cmUgW3dpdGggVDEgPSBQUjEzMzY1OjpDbHMsIFQyID0gaW50ICZdfX0KIAogICBzdHJ1Y3QgQ2xzIHsKICAgICB2b2lkIG1ldGhvZChpbnQmKTsKICAgfTsKICAgdm9pZCB0ZXN0KCkgewotICAgIERlZHVjZSgmQ2xzOjptZXRob2QpOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1hdGNoaW5nIGZ1bmN0aW9ufX0KKyAgICBEZWR1Y2UoJkNsczo6bWV0aG9kKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtYXRjaGluZyBmdW5jdGlvbn19IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3N1YnN0aXR1dGluZyBkZWR1Y2VkIHRlbXBsYXRlIGFyZ3VtZW50cyBpbnRvIGZ1bmN0aW9uIHRlbXBsYXRlICdEZWR1Y2UnIFt3aXRoIFQxID0gUFIxMzM2NTo6Q2xzLCBUMiA9IGludCAmXX19CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYVRlbXBsYXRlL2luc3RhbnRpYXRpb24tZGVwdGgtc3Vic3QtMi5jcHAgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0aW9uLWRlcHRoLXN1YnN0LTIuY3BwCmluZGV4IGVmMmE1YzcuLmM5ZGYwOTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL2luc3RhbnRpYXRpb24tZGVwdGgtc3Vic3QtMi5jcHAKKysrIGIvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGlvbi1kZXB0aC1zdWJzdC0yLmNwcApAQCAtMSw2ICsxLDYgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtdmVyaWZ5ICVzIC1mdGVtcGxhdGUtZGVwdGggMgogCiB0ZW1wbGF0ZTxpbnQgTj4gc3RydWN0IFMgeyB9OwotdGVtcGxhdGU8dHlwZW5hbWUgVD4gUzxUKCkgKyBUKCk+IG9wZXJhdG9yKyhULCBUKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tpbnN0YW50aWF0aW9uIGV4Y2VlZGVkIG1heGltdW0gZGVwdGh9fSBleHBlY3RlZC1ub3RlIDN7e3doaWxlIHN1YnN0aXR1dGluZ319Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTPFQoKSArIFQoKT4gb3BlcmF0b3IrKFQsIFQpOyAvLyBleHBlY3RlZC1lcnJvciB7e2luc3RhbnRpYXRpb24gZXhjZWVkZWQgbWF4aW11bSBkZXB0aH19IGV4cGVjdGVkLW5vdGUgMnt7d2hpbGUgc3Vic3RpdHV0aW5nfX0KIFM8MD4gczsKLWludCBrID0gcyArIHM7CitpbnQgayA9IHMgKyBzOyAvLyBleHBlY3RlZC1ub3RlIHt7d2hpbGUgc3Vic3RpdHV0aW5nfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYVRlbXBsYXRlL2luc3RhbnRpYXRpb24tZGVwdGgtc3Vic3QuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGlvbi1kZXB0aC1zdWJzdC5jcHAKaW5kZXggMDY3OTVmOS4uMmEzZTQyMiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGlvbi1kZXB0aC1zdWJzdC5jcHAKKysrIGIvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGlvbi1kZXB0aC1zdWJzdC5jcHAKQEAgLTMsNyArMyw3IEBACiAvLyBQUjk3OTMKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGF1dG8gZihUIHQpIC0+IGRlY2x0eXBlKGYodCkpOyAvLyBcCiAvLyBleHBlY3RlZC1lcnJvciB7e3JlY3Vyc2l2ZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGV4Y2VlZGVkIG1heGltdW0gZGVwdGggb2YgMn19IFwKLS8vIGV4cGVjdGVkLW5vdGUgMyB7e3doaWxlIHN1YnN0aXR1dGluZ319CisvLyBleHBlY3RlZC1ub3RlIDIge3t3aGlsZSBzdWJzdGl0dXRpbmd9fQogCiBzdHJ1Y3QgUyB7fTsKLWludCBrID0gZihTe30pOworaW50IGsgPSBmKFN7fSk7IC8vIGV4cGVjdGVkLW5vdGUge3t3aGlsZSBzdWJzdGl0dXRpbmd9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvaW5zdGFudGlhdGlvbi1vcmRlci5jcHAgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0aW9uLW9yZGVyLmNwcAppbmRleCBlMDU4YTViLi45Y2FjMjU2IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0aW9uLW9yZGVyLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9pbnN0YW50aWF0aW9uLW9yZGVyLmNwcApAQCAtNSwxMSArNSwxMSBAQAogdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBBIHsgdXNpbmcgWCA9IHR5cGVuYW1lIFQ6Olg7IH07IC8vIGV4cGVjdGVkLWVycm9yIHt7bm8gbWVtYmVyc319CiB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdHlwZW5hbWUgVDo6WCBmKHR5cGVuYW1lIEE8VD46OlgpOwogdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgZiguLi4pIHt9Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4gYXV0byBnKHR5cGVuYW1lIEE8VD46OlgpIC0+IHR5cGVuYW1lIFQ6Olg7IC8vIGV4cGVjdGVkLW5vdGUge3toZXJlfX0gZXhwZWN0ZWQtbm90ZSB7e3N1YnN0aXR1dGluZ319Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gYXV0byBnKHR5cGVuYW1lIEE8VD46OlgpIC0+IHR5cGVuYW1lIFQ6Olg7IC8vIGV4cGVjdGVkLW5vdGUge3toZXJlfX0KIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGcoLi4uKSB7fQogCiB2b2lkIGgoKQogewogICBmPGludD4oMCk7IC8vIG9rLCBTRklOQUUgaW4gcmV0dXJuIHR5cGUKLSAgZzxpbnQ+KDApOyAvLyBub3Qgb2ssIHN1YnN0aXR1dGlvbiBpbnNpZGUgQTxpbnQ+IGlzIGEgaGFyZCBlcnJvcgorICBnPGludD4oMCk7IC8vIG5vdCBvaywgc3Vic3RpdHV0aW9uIGluc2lkZSBBPGludD4gaXMgYSBoYXJkIGVycm9yIC8vIGV4cGVjdGVkLW5vdGUge3tzdWJzdGl0dXRpbmd9fQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvbXMtZnVuY3Rpb24tc3BlY2lhbGl6YXRpb24tY2xhc3Mtc2NvcGUuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvbXMtZnVuY3Rpb24tc3BlY2lhbGl6YXRpb24tY2xhc3Mtc2NvcGUuY3BwCmluZGV4IDllZmIwMmMuLjVkYTAwODMgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL21zLWZ1bmN0aW9uLXNwZWNpYWxpemF0aW9uLWNsYXNzLXNjb3BlLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9tcy1mdW5jdGlvbi1zcGVjaWFsaXphdGlvbi1jbGFzcy1zY29wZS5jcHAKQEAgLTEsOTMgKzEsNzcgQEAKIC8vIFJVTjogJWNsYW5nX2NjMSAtZm1zLWV4dGVuc2lvbnMgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCiAvLyBSVU46ICVjbGFuZ19jYzEgLWZtcy1leHRlbnNpb25zIC1mZGVsYXllZC10ZW1wbGF0ZS1wYXJzaW5nIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcwogCi0KIGNsYXNzIEEgewogcHVibGljOgotCXRlbXBsYXRlIDxjbGFzcyBVPgotICAgIEEoVSBwKSB7Ci0JfQotCXRlbXBsYXRlIDw+Ci0gICAgQShpbnQgcCkgeyAvLyBleHBlY3RlZC13YXJuaW5ne3tleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiAnQScgd2l0aGluIGNsYXNzIHNjb3BlIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbn19Ci0JfQotCQotCXRlbXBsYXRlIDxjbGFzcyBVPgotICAgIHZvaWQgZihVIHApIHsgCi0JfQotCi0JdGVtcGxhdGUgPD4KLSAgICB2b2lkIGYoaW50IHApIHsgLy8gZXhwZWN0ZWQtd2FybmluZ3t7ZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gb2YgJ2YnIHdpdGhpbiBjbGFzcyBzY29wZSBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb259fQotCX0KLQotCXZvaWQgZihpbnQgcCkgeyAKLSAgICB9Ci19OwotCi12b2lkIHRlc3QxKCkKLXsKLSAgIEEgYSgzKTsKLSAgIGNoYXIqIGIgOwotICAgYS5mKGIpOwotICAgYS5mPGludD4oOTkpOwotICAgYS5mKDEwMCk7Ci19Ci0KLQotCi0KLXRlbXBsYXRlIDxjbGFzcyBUPgotY2xhc3MgQiB7Ci1wdWJsaWM6Ci0JdGVtcGxhdGUgPGNsYXNzIFU+Ci0gICAgQihVIHApIHsgCi0JfQotCXRlbXBsYXRlIDw+Ci0gICAgQihpbnQgcCkgeyAvLyBleHBlY3RlZC13YXJuaW5ne3tleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiAnQjxUPicgd2l0aGluIGNsYXNzIHNjb3BlIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbn19Ci0JfQotCQotCXRlbXBsYXRlIDxjbGFzcyBVPgotICAgIHZvaWQgZihVIHApIHsKLQkgIFQgeSA9IDk7Ci0JfQotCi0KLSAgICB0ZW1wbGF0ZSA8PgotICAgIHZvaWQgZihpbnQgcCkgeyAvLyBleHBlY3RlZC13YXJuaW5ne3tleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiAnZicgd2l0aGluIGNsYXNzIHNjb3BlIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbn19Ci0JICBUIGEgPSAzOwotCX0KLQotCXZvaWQgZihpbnQgcCkgeyAKLSAJICBUIGEgPSAzOwotICAgIH0KLX07Ci0KLXZvaWQgdGVzdDIoKQotewotICAgQjxjaGFyPiBiKDMpOwotICAgY2hhciogcHRyOwotICAgYi5mKHB0cik7Ci0gICBiLmY8aW50Pig5OSk7Ci0gICBiLmYoMTAwKTsKLX0KLQotCi1uYW1lc3BhY2UgUFIxMjcwOSB7Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1jbGFzcyBUZW1wbGF0ZUNsYXNzIHsKLSAgdm9pZCBtZW1iZXJfZnVuY3Rpb24oKSB7Ci0gICAgc3BlY2lhbGl6ZWRfbWVtYmVyX3RlbXBsYXRlPGZhbHNlPigpOworICB0ZW1wbGF0ZTxjbGFzcyBVPiBBKFUgcCkge30KKyAgdGVtcGxhdGU8PiBBKGludCBwKSB7CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e2V4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mICdBJyB3aXRoaW4gY2xhc3Mgc2NvcGUgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9ufX0KICAgfQogCi0gIHRlbXBsYXRlPGJvb2wgYj4KLSAgdm9pZCBzcGVjaWFsaXplZF9tZW1iZXJfdGVtcGxhdGUoKSB7fQorICB0ZW1wbGF0ZTxjbGFzcyBVPiB2b2lkIGYoVSBwKSB7fQogCi0gIHRlbXBsYXRlPD4KLSAgdm9pZCBzcGVjaWFsaXplZF9tZW1iZXJfdGVtcGxhdGU8ZmFsc2U+KCkge30gIC8vIGV4cGVjdGVkLXdhcm5pbmd7e2V4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mICdzcGVjaWFsaXplZF9tZW1iZXJfdGVtcGxhdGUnIHdpdGhpbiBjbGFzcyBzY29wZSBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb259fQorICB0ZW1wbGF0ZTw+IHZvaWQgZihpbnQgcCkgeworICAgIC8vIGV4cGVjdGVkLXdhcm5pbmdALTEge3tleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiAnZicgd2l0aGluIGNsYXNzIHNjb3BlIGlzIGEgTWljcm9zb2Z0IGV4dGVuc2lvbn19CisgIH0KKworICB2b2lkIGYoaW50IHApIHt9CiB9OwogCi12b2lkIGYoKSB7Ci0gIFRlbXBsYXRlQ2xhc3M8aW50PiB0Owordm9pZCB0ZXN0MSgpIHsKKyAgQSBhKDMpOworICBjaGFyICpiOworICBhLmYoYik7CisgIGEuZjxpbnQ+KDk5KTsKKyAgYS5mKDEwMCk7CiB9CiAKK3RlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEIgeworcHVibGljOgorICB0ZW1wbGF0ZTxjbGFzcyBVPiBCKFUgcCkge30KKyAgdGVtcGxhdGU8PiBCKGludCBwKSB7CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e2V4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mICdCPFQ+JyB3aXRoaW4gY2xhc3Mgc2NvcGUgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9ufX0KKyAgfQorCisgIHRlbXBsYXRlPGNsYXNzIFU+IHZvaWQgZihVIHApIHsgVCB5ID0gOTsgfQorCisgIHRlbXBsYXRlPD4gdm9pZCBmKGludCBwKSB7CisgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e2V4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mICdmJyB3aXRoaW4gY2xhc3Mgc2NvcGUgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9ufX0KKyAgICBUIGEgPSAzOworICB9CisKKyAgdm9pZCBmKGludCBwKSB7IFQgYSA9IDM7IH0KK307CisKK3ZvaWQgdGVzdDIoKSB7CisgIEI8Y2hhcj4gYigzKTsKKyAgY2hhciAqcHRyOworICBiLmYocHRyKTsKKyAgYi5mPGludD4oOTkpOworICBiLmYoMTAwKTsKK30KKworbmFtZXNwYWNlIFBSMTI3MDkgeworICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBUZW1wbGF0ZUNsYXNzIHsKKyAgICB2b2lkIG1lbWJlcl9mdW5jdGlvbigpIHsgc3BlY2lhbGl6ZWRfbWVtYmVyX3RlbXBsYXRlPGZhbHNlPigpOyB9CisKKyAgICB0ZW1wbGF0ZTxib29sIGI+IHZvaWQgc3BlY2lhbGl6ZWRfbWVtYmVyX3RlbXBsYXRlKCkge30KKworICAgIHRlbXBsYXRlPD4gdm9pZCBzcGVjaWFsaXplZF9tZW1iZXJfdGVtcGxhdGU8ZmFsc2U+KCkgeworICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZ0AtMSB7e2V4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mICdzcGVjaWFsaXplZF9tZW1iZXJfdGVtcGxhdGUnIHdpdGhpbiBjbGFzcyBzY29wZSBpcyBhIE1pY3Jvc29mdCBleHRlbnNpb259fQorICAgIH0KKyAgfTsKKworICB2b2lkIGYoKSB7IFRlbXBsYXRlQ2xhc3M8aW50PiB0OyB9Cit9CisKK25hbWVzcGFjZSBEdXBsaWNhdGVzIHsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEEgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHZvaWQgZigpOworICAgIHRlbXBsYXRlPD4gdm9pZCBmPGludD4oKSB7fSAvLyBleHBlY3RlZC13YXJuaW5nIHt7TWljcm9zb2Z0IGV4dGVuc2lvbn19CisgICAgdGVtcGxhdGU8PiB2b2lkIGY8VD4oKSB7fSAvLyBleHBlY3RlZC13YXJuaW5nIHt7TWljcm9zb2Z0IGV4dGVuc2lvbn19CisgIH07CisKKyAgLy8gRklYTUU6IFdlIHNob3VsZCBkaWFnbm9zZSB0aGUgZHVwbGljYXRlIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGRlZmluaXRpb25zCisgIC8vIGhlcmUuCisgIHRlbXBsYXRlIHN0cnVjdCBBPGludD47CiB9CmRpZmYgLS1naXQgYS90ZXN0L1NlbWFUZW1wbGF0ZS9tcy1pZi1leGlzdHMuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvbXMtaWYtZXhpc3RzLmNwcAppbmRleCAwNGY0YTYzLi45Yjk1YmJhIDEwMDY0NAotLS0gYS90ZXN0L1NlbWFUZW1wbGF0ZS9tcy1pZi1leGlzdHMuY3BwCisrKyBiL3Rlc3QvU2VtYVRlbXBsYXRlL21zLWlmLWV4aXN0cy5jcHAKQEAgLTQ4LDExICs0OCwxMSBAQAogICAgIHsgfQogICB9CiAKLSAgaW50IGFycmF5MltdID0gew0KLSAgICAwLCANCi0gICAgX19pZl9leGlzdHMoVDo6YmFyKSB7MiwgfS8vIGV4cGVjdGVkLXdhcm5pbmd7e2RlcGVuZGVudCBfX2lmX2V4aXN0cyBkZWNsYXJhdGlvbnMgYXJlIGlnbm9yZWR9fQ0KLSAgICAzDQotICB9Ow0KKyAgaW50IGFycmF5MltdID0geworICAgIDAsIAorICAgIF9faWZfZXhpc3RzKFQ6OmJhcikgezIsIH0vLyBleHBlY3RlZC13YXJuaW5ne3tkZXBlbmRlbnQgX19pZl9leGlzdHMgZGVjbGFyYXRpb25zIGFyZSBpZ25vcmVkfX0KKyAgICAzCisgIH07CiB9CiAKIHRlbXBsYXRlIHZvaWQgZihIYXNGb28pOyAvLyBleHBlY3RlZC1ub3Rle3tpbiBpbnN0YW50aWF0aW9uIG9mIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uICdmPEhhc0Zvbz4nIHJlcXVlc3RlZCBoZXJlfX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYVRlbXBsYXRlL21zLWxvb2t1cC10ZW1wbGF0ZS1iYXNlLWNsYXNzZXMuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvbXMtbG9va3VwLXRlbXBsYXRlLWJhc2UtY2xhc3Nlcy5jcHAKaW5kZXggNzJjZTA1Ni4uOGY5NjUzZCAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hVGVtcGxhdGUvbXMtbG9va3VwLXRlbXBsYXRlLWJhc2UtY2xhc3Nlcy5jcHAKKysrIGIvdGVzdC9TZW1hVGVtcGxhdGUvbXMtbG9va3VwLXRlbXBsYXRlLWJhc2UtY2xhc3Nlcy5jcHAKQEAgLTE3Niw3ICsxNzYsNyBAQAogdGVtcGxhdGUgPGNsYXNzIFQ+CiBjbGFzcyBCYXNlIHsKICBwdWJsaWM6Ci0gIGJvb2wgYmFzZV9mdW4odm9pZCogcCkgeyByZXR1cm4gZmFsc2U7IH0gIC8vIGV4cGVjdGVkLW5vdGUge3ttdXN0IHF1YWxpZnkgaWRlbnRpZmllciB0byBmaW5kIHRoaXMgZGVjbGFyYXRpb24gaW4gZGVwZW5kZW50IGJhc2UgY2xhc319CisgIGJvb2wgYmFzZV9mdW4odm9pZCogcCkgeyByZXR1cm4gZmFsc2U7IH0gIC8vIGV4cGVjdGVkLW5vdGUge3ttdXN0IHF1YWxpZnkgaWRlbnRpZmllciB0byBmaW5kIHRoaXMgZGVjbGFyYXRpb24gaW4gZGVwZW5kZW50IGJhc2UgY2xhc3N9fQogICBvcGVyYXRvciBUKigpIGNvbnN0IHsgcmV0dXJuIDA7IH0KIH07CiAKQEAgLTIyMiw3ICsyMjIsNyBAQAogfTsKIAogdGVtcGxhdGUgc3RydWN0IEI8QT47Ci10ZW1wbGF0ZSBzdHJ1Y3QgQzxBPjsgIC8vIGV4cGVjdGVkLW5vdGUtcmUgMSsge3tpbiBpbnN0YW50aWF0aW9uIG9mIG1lbWJlciBmdW5jdGlvbiAnUFIxNjAxNDo6QzxQUjE2MDE0OjpBPjo6LionIHJlcXVlc3RlZCBoZXJlfX0KK3RlbXBsYXRlIHN0cnVjdCBDPEE+OyAgLy8gZXhwZWN0ZWQtbm90ZS1yZSAxKyB7e2luIGluc3RhbnRpYXRpb24gb2YgbWVtYmVyIGZ1bmN0aW9uICdQUjE2MDE0OjpDPFBSMTYwMTQ6OkE+Ojp7ey4qfX0nIHJlcXVlc3RlZCBoZXJlfX0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBEIDogVCB7CiAgIHN0cnVjdCBJbm5lciB7CkBAIC0yMzYsMyArMjM2LDI2IEBACiB0ZW1wbGF0ZSBzdHJ1Y3QgRDxBPjsKIAogfQorCituYW1lc3BhY2UgUFIxOTIzMyB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBBIDogVCB7CisgIHZvaWQgZm9vKCkgeworICAgIDo6dW5kZWYoKTsgLy8gZXhwZWN0ZWQtZXJyb3Ige3tubyBtZW1iZXIgbmFtZWQgJ3VuZGVmJyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZX19CisgIH0KKyAgdm9pZCBiYXIoKSB7CisgICAgOjpVbmRlZkNsYXNzOjp1bmRlZigpOyAvLyBleHBlY3RlZC1lcnJvciB7e25vIG1lbWJlciBuYW1lZCAnVW5kZWZDbGFzcycgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2V9fQorICB9CisgIHZvaWQgYmF6KCkgeworICAgIEI6OnF1eCgpOyAvLyBleHBlY3RlZC1lcnJvciB7e3VzZSBvZiB1bmRlY2xhcmVkIGlkZW50aWZpZXIgJ0InfX0KKyAgfQorfTsKKworc3RydWN0IEIgeyB2b2lkIHF1eCgpOyB9Oworc3RydWN0IEMgOiBCIHsgfTsKK3RlbXBsYXRlIHN0cnVjdCBBPEM+OyAvLyBObyBlcnJvciEgIEIgaXMgYSBiYXNlIG9mIEE8Qz4sIGFuZCBxdXggaXMgYXZhaWxhYmxlLgorCitzdHJ1Y3QgRCB7IH07Cit0ZW1wbGF0ZSBzdHJ1Y3QgQTxEPjsgLy8gZXhwZWN0ZWQtbm90ZSB7e2luIGluc3RhbnRpYXRpb24gb2YgbWVtYmVyIGZ1bmN0aW9uICdQUjE5MjMzOjpBPFBSMTkyMzM6OkQ+OjpiYXonIHJlcXVlc3RlZCBoZXJlfX0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvb3BlcmF0b3ItdGVtcGxhdGUuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvb3BlcmF0b3ItdGVtcGxhdGUuY3BwCmluZGV4IDMwZDZjY2YuLjQxNjYyNTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvU2VtYVRlbXBsYXRlL29wZXJhdG9yLXRlbXBsYXRlLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS9vcGVyYXRvci10ZW1wbGF0ZS5jcHAKQEAgLTEyLDcgKzEyLDYgQEAKIHRlbXBsYXRlPGNsYXNzIFg+c3RydWN0IEJ7dHlwZWRlZiBYIFk7fTsKIHRlbXBsYXRlPGNsYXNzIFg+Ym9vbCBvcGVyYXRvcj09KEI8WD4qLHR5cGVuYW1lIEI8WD46OlkpOyAvLyBcCiAvLyBleHBlY3RlZC1lcnJvcnt7b3ZlcmxvYWRlZCAnb3BlcmF0b3I9PScgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb2YgY2xhc3Mgb3IgZW51bWVyYXRpb24gdHlwZX19IFwKLS8vIGV4cGVjdGVkLW5vdGV7e2luIGluc3RhbnRpYXRpb24gb2YgZnVuY3Rpb24gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb259fSBcCiAvLyBleHBlY3RlZC1ub3Rle3tjYW5kaWRhdGUgdGVtcGxhdGUgaWdub3JlZDogc3Vic3RpdHV0aW9uIGZhaWx1cmUgW3dpdGggWCA9IGludF19fQotaW50IGEoQjxpbnQ+IHgpIHsgcmV0dXJuIG9wZXJhdG9yPT0oJngsMSk7IH0gLy8gZXhwZWN0ZWQtZXJyb3J7e25vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBjYWxsIHRvICdvcGVyYXRvcj09J319Ci0KK2ludCBhKEI8aW50PiB4KSB7IHJldHVybiBvcGVyYXRvcj09KCZ4LDEpOyB9IC8vIGV4cGVjdGVkLWVycm9ye3tubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgY2FsbCB0byAnb3BlcmF0b3I9PSd9fSBcCisvLyBleHBlY3RlZC1ub3Rle3tpbiBpbnN0YW50aWF0aW9uIG9mIGZ1bmN0aW9uIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ufX0KZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYVRlbXBsYXRlL3Jlc29sdmUtc2luZ2xlLXRlbXBsYXRlLWlkLmNwcCBiL3Rlc3QvU2VtYVRlbXBsYXRlL3Jlc29sdmUtc2luZ2xlLXRlbXBsYXRlLWlkLmNwcAppbmRleCA3ZmIxNmViLi5iZWJjYTc2IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFUZW1wbGF0ZS9yZXNvbHZlLXNpbmdsZS10ZW1wbGF0ZS1pZC5jcHAKKysrIGIvdGVzdC9TZW1hVGVtcGxhdGUvcmVzb2x2ZS1zaW5nbGUtdGVtcGxhdGUtaWQuY3BwCkBAIC00NSw5ICs0NSwxNSBAQAogICArb25lVDxpbnQ+OyAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2V4cHJlc3Npb24gcmVzdWx0IHVudXNlZH19CiAgIC1vbmVUPGludD47ICAvL2V4cGVjdGVkLWVycm9yIHt7aW52YWxpZCBhcmd1bWVudCB0eXBlfX0KICAgb25lVDxpbnQ+ID09IDA7ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2VxdWFsaXR5IGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZH19IFwKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3VzZSAnPScgdG8gdHVybiB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24gaW50byBhbiBhc3NpZ25tZW50fX0KLSAgMCA9PSBvbmVUPGludD47ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2VxdWFsaXR5IGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZH19Ci0gIDAgIT0gb25lVDxpbnQ+OyAgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW5lcXVhbGl0eSBjb21wYXJpc29uIHJlc3VsdCB1bnVzZWR9fQorICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7dXNlICc9JyB0byB0dXJuIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbiBpbnRvIGFuIGFzc2lnbm1lbnR9fSBcCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjb21wYXJpc29uIG9mIGZ1bmN0aW9uICdvbmVUPGludD4nIGVxdWFsIHRvIGEgbnVsbCBwb2ludGVyIGlzIGFsd2F5cyBmYWxzZX19IFwKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nfX0KKyAgMCA9PSBvbmVUPGludD47ICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2VxdWFsaXR5IGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZH19IFwKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NvbXBhcmlzb24gb2YgZnVuY3Rpb24gJ29uZVQ8aW50PicgZXF1YWwgdG8gYSBudWxsIHBvaW50ZXIgaXMgYWx3YXlzIGZhbHNlfX0gXAorICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7cHJlZml4IHdpdGggdGhlIGFkZHJlc3Mtb2Ygb3BlcmF0b3IgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmd9fQorICAwICE9IG9uZVQ8aW50PjsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7aW5lcXVhbGl0eSBjb21wYXJpc29uIHJlc3VsdCB1bnVzZWR9fSBcCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tjb21wYXJpc29uIG9mIGZ1bmN0aW9uICdvbmVUPGludD4nIG5vdCBlcXVhbCB0byBhIG51bGwgcG9pbnRlciBpcyBhbHdheXMgdHJ1ZX19IFwKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtbm90ZSB7e3ByZWZpeCB3aXRoIHRoZSBhZGRyZXNzLW9mIG9wZXJhdG9yIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nfX0KICAgKGZhbHNlID8gb25lIDogb25lVDxpbnQ+KTsgICAvLyBleHBlY3RlZC13YXJuaW5nIHt7ZXhwcmVzc2lvbiByZXN1bHQgdW51c2VkfX0KICAgdm9pZCAoKnAxKShpbnQpOyBwMSA9IG9uZVQ8aW50PjsKICAgCkBAIC02MSwxNSArNjcsMTcgQEAKICAgYiA9ICh2b2lkICgqKSgpKSB0d29UPGludD47CiAgIAogICBvbmUgPCBvbmU7IC8vZXhwZWN0ZWQtd2FybmluZyB7e3NlbGYtY29tcGFyaXNvbiBhbHdheXMgZXZhbHVhdGVzIHRvIGZhbHNlfX0gXAotICAgICAgICAgICAgIC8vZXhwZWN0ZWQtd2FybmluZyB7e2V4cHJlc3Npb24gcmVzdWx0IHVudXNlZH19ICAgICAgICAgCisgICAgICAgICAgICAgLy9leHBlY3RlZC13YXJuaW5nIHt7cmVsYXRpb25hbCBjb21wYXJpc29uIHJlc3VsdCB1bnVzZWR9fSAgICAgICAgIAogCiAgIG9uZVQ8aW50PiA8IG9uZVQ8aW50PjsgIC8vZXhwZWN0ZWQtd2FybmluZyB7e3NlbGYtY29tcGFyaXNvbiBhbHdheXMgZXZhbHVhdGVzIHRvIGZhbHNlfX0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4cGVjdGVkLXdhcm5pbmcge3tleHByZXNzaW9uIHJlc3VsdCB1bnVzZWR9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4cGVjdGVkLXdhcm5pbmcge3tyZWxhdGlvbmFsIGNvbXBhcmlzb24gcmVzdWx0IHVudXNlZH19CiAKICAgdHdvIDwgdHdvOyAvL2V4cGVjdGVkLWVycm9yIDIge3tyZWZlcmVuY2UgdG8gb3ZlcmxvYWRlZCBmdW5jdGlvbiBjb3VsZCBub3QgYmUgcmVzb2x2ZWQ7IGRpZCB5b3UgbWVhbiB0byBjYWxsIGl0IHdpdGggbm8gYXJndW1lbnRzP319IGV4cGVjdGVkLWVycm9yIHt7aW52YWxpZCBvcGVyYW5kcyB0byBiaW5hcnkgZXhwcmVzc2lvbiAoJ3ZvaWQnIGFuZCAndm9pZCcpfX0KICAgdHdvVDxpbnQ+IDwgdHdvVDxpbnQ+OyAvL2V4cGVjdGVkLWVycm9yIHt7cmVmZXJlbmNlIHRvIG92ZXJsb2FkZWQgZnVuY3Rpb24gY291bGQgbm90IGJlIHJlc29sdmVkOyBkaWQgeW91IG1lYW4gdG8gY2FsbCBpdD99fSB7e2Nhbm5vdCByZXNvbHZlIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ3R3b1QnIGZyb20gY29udGV4dH19CiAgIG9uZVQ8aW50PiA9PSAwOyAgIC8vIGV4cGVjdGVkLXdhcm5pbmcge3tlcXVhbGl0eSBjb21wYXJpc29uIHJlc3VsdCB1bnVzZWR9fSBcCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3t1c2UgJz0nIHRvIHR1cm4gdGhpcyBlcXVhbGl0eSBjb21wYXJpc29uIGludG8gYW4gYXNzaWdubWVudH19CisgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkLW5vdGUge3t1c2UgJz0nIHRvIHR1cm4gdGhpcyBlcXVhbGl0eSBjb21wYXJpc29uIGludG8gYW4gYXNzaWdubWVudH19IFwKKyAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQtd2FybmluZyB7e2NvbXBhcmlzb24gb2YgZnVuY3Rpb24gJ29uZVQ8aW50PicgZXF1YWwgdG8gYSBudWxsIHBvaW50ZXIgaXMgYWx3YXlzIGZhbHNlfX0gXAorICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZC1ub3RlIHt7cHJlZml4IHdpdGggdGhlIGFkZHJlc3Mtb2Ygb3BlcmF0b3IgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmd9fQogCiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvU2VtYVRlbXBsYXRlL3RlbXBfYXJnX25vbnR5cGUuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvdGVtcF9hcmdfbm9udHlwZS5jcHAKaW5kZXggOGY2Y2MxOS4uOTFiMGM2ZSAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hVGVtcGxhdGUvdGVtcF9hcmdfbm9udHlwZS5jcHAKKysrIGIvdGVzdC9TZW1hVGVtcGxhdGUvdGVtcF9hcmdfbm9udHlwZS5jcHAKQEAgLTgyLDcgKzgyLDcgQEAKIHRlbXBsYXRlPGludCAoWjo6KnBtZikoaW50KT4gc3RydWN0IEE2OyAvLyBleHBlY3RlZC1ub3Rle3t0ZW1wbGF0ZSBwYXJhbWV0ZXIgaXMgZGVjbGFyZWQgaGVyZX19CiBBNjwmWjo6Zm9vPiAqYTE3XzE7CiBBNjwmWjo6YmFyPiAqYTE3XzI7Ci1BNjwmWjo6YmF6PiAqYTE3XzM7IC8vIGV4cGVjdGVkLWVycm9ye3tub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudCBvZiB0eXBlICdkb3VibGUgKFo6OiopKGRvdWJsZSknIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYSB2YWx1ZSBvZiB0eXBlICdpbnQgKFo6OiopKGludCknfX0KK0E2PCZaOjpiYXo+ICphMTdfMzsgLy8gZXhwZWN0ZWQtZXJyb3ItcmV7e25vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50IG9mIHR5cGUgJ2RvdWJsZSAoWjo6KikoZG91YmxlKXt7KCBfX2F0dHJpYnV0ZV9fXChcKHRoaXNjYWxsXClcKSk/fX0nIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYSB2YWx1ZSBvZiB0eXBlICdpbnQgKFo6OiopKGludCl7eyggX19hdHRyaWJ1dGVfX1woXCh0aGlzY2FsbFwpXCkpP319J319CiAKIAogdGVtcGxhdGU8aW50IFo6OipwbT4gc3RydWN0IEE3OyAgLy8gZXhwZWN0ZWQtbm90ZXt7dGVtcGxhdGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIGhlcmV9fQpkaWZmIC0tZ2l0IGEvdGVzdC9TZW1hVGVtcGxhdGUvdHlwZW5hbWUtc3BlY2lmaWVyLmNwcCBiL3Rlc3QvU2VtYVRlbXBsYXRlL3R5cGVuYW1lLXNwZWNpZmllci5jcHAKaW5kZXggNzMzZGM3Zi4uNmJkNTY3ZiAxMDA2NDQKLS0tIGEvdGVzdC9TZW1hVGVtcGxhdGUvdHlwZW5hbWUtc3BlY2lmaWVyLmNwcAorKysgYi90ZXN0L1NlbWFUZW1wbGF0ZS90eXBlbmFtZS1zcGVjaWZpZXIuY3BwCkBAIC0xMzcsOCArMTM3LDggQEAKIAogICB2b2lkIGZvbygpIHsKICAgICBwYWlyPEV4YW1wbGVJdGVtU2V0OjppdGVyYXRvciwgaW50PiBpOyAvLyBleHBlY3RlZC1lcnJvciB7e3RlbXBsYXRlIGFyZ3VtZW50IGZvciB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlciBtdXN0IGJlIGEgdHlwZTsgZGlkIHlvdSBmb3JnZXQgJ3R5cGVuYW1lJz99fQotICAgIHBhaXI8dGhpcy0+RXhhbXBsZUl0ZW1TZXQ6Oml0ZXJhdG9yLCBpbnQ+IGk7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7dGVtcGxhdGUgYXJndW1lbnQgZm9yIHRlbXBsYXRlIHR5cGUgcGFyYW1ldGVyIG11c3QgYmUgYSB0eXBlJH19Ci0gICAgcGFpcjxFeGFtcGxlSXRlbVNldDo6b3BlcmF0b3JbXSwgaW50PiBpOyAvLyBleHBlY3RlZC1lcnJvci1yZSB7e3RlbXBsYXRlIGFyZ3VtZW50IGZvciB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlciBtdXN0IGJlIGEgdHlwZSR9fQorICAgIHBhaXI8dGhpcy0+RXhhbXBsZUl0ZW1TZXQ6Oml0ZXJhdG9yLCBpbnQ+IGk7IC8vIGV4cGVjdGVkLWVycm9yLXJlIHt7dGVtcGxhdGUgYXJndW1lbnQgZm9yIHRlbXBsYXRlIHR5cGUgcGFyYW1ldGVyIG11c3QgYmUgYSB0eXBle3skfX19fQorICAgIHBhaXI8RXhhbXBsZUl0ZW1TZXQ6Om9wZXJhdG9yW10sIGludD4gaTsgLy8gZXhwZWN0ZWQtZXJyb3ItcmUge3t0ZW1wbGF0ZSBhcmd1bWVudCBmb3IgdGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIHR5cGV7eyR9fX19CiAgIH0KICAgcGFpcjxFeGFtcGxlSXRlbVNldDo6aXRlcmF0b3IsIGludD4gZWx0OyAvLyBleHBlY3RlZC1lcnJvciB7e3RlbXBsYXRlIGFyZ3VtZW50IGZvciB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlciBtdXN0IGJlIGEgdHlwZTsgZGlkIHlvdSBmb3JnZXQgJ3R5cGVuYW1lJz99fQogCmRpZmYgLS1naXQgYS90ZXN0L1NlbWFUZW1wbGF0ZS92aXJ0dWFsLW1lbWJlci1mdW5jdGlvbnMuY3BwIGIvdGVzdC9TZW1hVGVtcGxhdGUvdmlydHVhbC1tZW1iZXItZnVuY3Rpb25zLmNwcAppbmRleCA0MzlkOGY4Li4xYTAxODA4IDEwMDY0NAotLS0gYS90ZXN0L1NlbWFUZW1wbGF0ZS92aXJ0dWFsLW1lbWJlci1mdW5jdGlvbnMuY3BwCisrKyBiL3Rlc3QvU2VtYVRlbXBsYXRlL3ZpcnR1YWwtbWVtYmVyLWZ1bmN0aW9ucy5jcHAKQEAgLTEsNCArMSw1IEBACi0vLyBSVU46ICVjbGFuZ19jYzEgLWZzeW50YXgtb25seSAtdmVyaWZ5ICVzCisvLyBSVU46ICVjbGFuZ19jYzEgLXRyaXBsZSAlaXRhbml1bV9hYmlfdHJpcGxlIC1mc3ludGF4LW9ubHkgLXZlcmlmeSAlcworLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgJW1zX2FiaV90cmlwbGUgLURNU0FCSSAtZnN5bnRheC1vbmx5IC12ZXJpZnkgJXMKIAogbmFtZXNwYWNlIFBSNTU1NyB7CiB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IEEgewpAQCAtNzEsOCArNzIsMTMgQEAKIAogICBpbnQgZigpIHsgcmV0dXJuIEI8aW50Pjo6dmFsdWU7IH0KIAorI2lmZGVmIE1TQUJJCisgIHZvaWQgdGVzdF90eXBlaWQoQjxmbG9hdD46OklubmVyIGJmaSkgeyAvLyBleHBlY3RlZC1ub3Rle3tpbXBsaWNpdCBkZXN0cnVjdG9yfX0KKyAgICAodm9pZCl0eXBlaWQoYmZpKTsKKyNlbHNlCiAgIHZvaWQgdGVzdF90eXBlaWQoQjxmbG9hdD46OklubmVyIGJmaSkgewogICAgICh2b2lkKXR5cGVpZChiZmkpOyAvLyBleHBlY3RlZC1ub3Rle3tpbXBsaWNpdCBkZXN0cnVjdG9yfX0KKyNlbmRpZgogICB9CiAKICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KQEAgLTgwLDcgKzg2LDcgQEAKICAgICB2b2lkIGYoKSB7IH0KICAgfTsKIAotICB2b2lkIHRlc3RfWChYPGludD4geGksIFg8ZmxvYXQ+IHhmKSB7CisgIHZvaWQgdGVzdF9YKFg8aW50PiAmeGksIFg8ZmxvYXQ+ICZ4ZikgewogICAgIHhpLmYoKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9Ub29saW5nL211bHRpLWpvYnMuY3BwIGIvdGVzdC9Ub29saW5nL211bHRpLWpvYnMuY3BwCmluZGV4IGNlZjg0NDMuLjM2ZTNiMzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvVG9vbGluZy9tdWx0aS1qb2JzLmNwcAorKysgYi90ZXN0L1Rvb2xpbmcvbXVsdGktam9icy5jcHAKQEAgLTEsNyArMSw1IEBACiAvLyBSVU46IG5vdCBjbGFuZy1jaGVjayAiJXMiIC0tIC1uby1pbnRlZ3JhdGVkLWFzIC1jIDI+JjEgfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogbm90IGNsYW5nLWNoZWNrICIlcyIgLS0gLXRhcmdldCB4ODZfNjQtd2luMzIgLW5vLWludGVncmF0ZWQtYXMgLWMgMj4mMSB8IEZpbGVDaGVjayAlcwogCiAvLyBDSEVDSzogQysrIHJlcXVpcmVzCiBpbnZhbGlkOwotCi0vLyBNU1ZDIHRhcmdldGVkIGRyaXZlcnMgKCotd2luMzIpIGFyZSBpbmNhcGFibGUgb2YgaW52b2tpbmcgZXh0ZXJuYWwgYXNzZW1ibGVyLgotLy8gWEZBSUw6IHdpbjMyCmRpZmYgLS1naXQgYS90ZXN0L1VuaXQvbGl0LmNmZyBiL3Rlc3QvVW5pdC9saXQuY2ZnCmluZGV4IGYzOWZkZWQuLjAxYjU0YzcgMTAwNjQ0Ci0tLSBhL3Rlc3QvVW5pdC9saXQuY2ZnCisrKyBiL3Rlc3QvVW5pdC9saXQuY2ZnCkBAIC0zLDYgKzMsNyBAQAogIyBDb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSAnbGl0JyB0ZXN0IHJ1bm5lci4KIAogaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KIAogaW1wb3J0IGxpdC5mb3JtYXRzCiBpbXBvcnQgbGl0LnV0aWwKQEAgLTg1LDEwICs4NiwxOSBAQAogICAgIGxpdF9jb25maWcubG9hZF9jb25maWcoY29uZmlnLCBzaXRlX2NmZykKICAgICByYWlzZSBTeXN0ZW1FeGl0CiAKLSMgSWYgbmVjZXNzYXJ5LCBwb2ludCB0aGUgZHluYW1pYyBsb2FkZXIgYXQgbGliTExWTS5zby4KLWlmIGNvbmZpZy5lbmFibGVfc2hhcmVkOgotICAgIHNobGlicGF0aCA9IGNvbmZpZy5lbnZpcm9ubWVudC5nZXQoY29uZmlnLnNobGlicGF0aF92YXIsJycpCi0gICAgaWYgc2hsaWJwYXRoOgotICAgICAgICBzaGxpYnBhdGggPSBvcy5wYXRoc2VwICsgc2hsaWJwYXRoCi0gICAgc2hsaWJwYXRoID0gY29uZmlnLnNobGliZGlyICsgc2hsaWJwYXRoCi0gICAgY29uZmlnLmVudmlyb25tZW50W2NvbmZpZy5zaGxpYnBhdGhfdmFyXSA9IHNobGlicGF0aAorc2hsaWJwYXRoX3ZhciA9ICcnCitpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnTGludXgnOgorICAgIHNobGlicGF0aF92YXIgPSAnTERfTElCUkFSWV9QQVRIJworZWxpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnRGFyd2luJzoKKyAgICBzaGxpYnBhdGhfdmFyID0gJ0RZTERfTElCUkFSWV9QQVRIJworZWxpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CisgICAgc2hsaWJwYXRoX3ZhciA9ICdQQVRIJworCisjIFBvaW50IHRoZSBkeW5hbWljIGxvYWRlciBhdCBkeW5hbWljIGxpYnJhcmllcyBpbiAnbGliJy4KK2xsdm1fbGlic19kaXIgPSBnZXRhdHRyKGNvbmZpZywgJ2xsdm1fbGlic19kaXInLCBOb25lKQoraWYgbm90IGxsdm1fbGlic19kaXI6CisgICAgbGl0X2NvbmZpZy5mYXRhbCgnTm8gTExWTSBsaWJzIGRpciBzZXQhJykKK3NobGlicGF0aCA9IG9zLnBhdGgucGF0aHNlcC5qb2luKChsbHZtX2xpYnNfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmVudmlyb25tZW50LmdldChzaGxpYnBhdGhfdmFyLCcnKSkpCitjb25maWcuZW52aXJvbm1lbnRbc2hsaWJwYXRoX3Zhcl0gPSBzaGxpYnBhdGgKKwpkaWZmIC0tZ2l0IGEvdGVzdC9Vbml0L2xpdC5zaXRlLmNmZy5pbiBiL3Rlc3QvVW5pdC9saXQuc2l0ZS5jZmcuaW4KaW5kZXggYTI1NWNkYy4uMzdlOGNiMCAxMDA2NDQKLS0tIGEvdGVzdC9Vbml0L2xpdC5zaXRlLmNmZy5pbgorKysgYi90ZXN0L1VuaXQvbGl0LnNpdGUuY2ZnLmluCkBAIC0xMCw3ICsxMCw2IEBACiBjb25maWcuY2xhbmdfb2JqX3Jvb3QgPSAiQENMQU5HX0JJTkFSWV9ESVJAIgogY29uZmlnLmVuYWJsZV9zaGFyZWQgPSBARU5BQkxFX1NIQVJFREAKIGNvbmZpZy5zaGxpYmRpciA9ICJAU0hMSUJESVJAIgotY29uZmlnLnNobGlicGF0aF92YXIgPSAiQFNITElCUEFUSF9WQVJAIgogY29uZmlnLnRhcmdldF90cmlwbGUgPSAiQFRBUkdFVF9UUklQTEVAIgogCiAjIFN1cHBvcnQgc3Vic3RpdHV0aW9uIG9mIHRoZSB0b29sc19kaXIsIGxpYnNfZGlycywgYW5kIGJ1aWxkX21vZGUgd2l0aCB1c2VyCmRpZmYgLS1naXQgYS90ZXN0L1ZGUy9JbnB1dHMvYWN0dWFsX2hlYWRlci5oIGIvdGVzdC9WRlMvSW5wdXRzL2FjdHVhbF9oZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFlNTg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9WRlMvSW5wdXRzL2FjdHVhbF9oZWFkZXIuaApAQCAtMCwwICsxIEBACit2b2lkIGJhcih2b2lkKTsKZGlmZiAtLWdpdCBhL3Rlc3QvVkZTL0lucHV0cy9hY3R1YWxfbW9kdWxlLm1hcCBiL3Rlc3QvVkZTL0lucHV0cy9hY3R1YWxfbW9kdWxlLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODJkYWMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9WRlMvSW5wdXRzL2FjdHVhbF9tb2R1bGUubWFwCkBAIC0wLDAgKzEsNCBAQAorbW9kdWxlIG5vdF9yZWFsIHsKKyAgaGVhZGVyICJub3RfcmVhbC5oIgorICBleHBvcnQgKgorfQpkaWZmIC0tZ2l0IGEvdGVzdC9WRlMvSW5wdXRzL2V4dGVybmFsLW5hbWVzLmggYi90ZXN0L1ZGUy9JbnB1dHMvZXh0ZXJuYWwtbmFtZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjBiYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9WRlMvSW5wdXRzL2V4dGVybmFsLW5hbWVzLmgKQEAgLTAsMCArMSw0IEBACit2b2lkIGZvbyhjaGFyICoqYykgeworICAqYyA9IF9fRklMRV9fOworICBpbnQgeCA9IGM7IC8vIHByb2R1Y2UgYSBkaWFnbm9zdGljCit9CmRpZmYgLS1naXQgYS90ZXN0L1ZGUy9JbnB1dHMvaW5jbHVkZV9yZWFsLmggYi90ZXN0L1ZGUy9JbnB1dHMvaW5jbHVkZV9yZWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1MGM2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvVkZTL0lucHV0cy9pbmNsdWRlX3JlYWwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSAicmVhbC5oIgpkaWZmIC0tZ2l0IGEvdGVzdC9WRlMvSW5wdXRzL2ludmFsaWQteWFtbC55YW1sIGIvdGVzdC9WRlMvSW5wdXRzL2ludmFsaWQteWFtbC55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNmM2NjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1ZGUy9JbnB1dHMvaW52YWxpZC15YW1sLnlhbWwKQEAgLTAsMCArMSw0IEBACit7CisgICd2ZXJzaW9uJzogMCwKKyAgJ3Jvb3RzJzogW10KK10KZGlmZiAtLWdpdCBhL3Rlc3QvVkZTL0lucHV0cy9taXNzaW5nLWtleS55YW1sIGIvdGVzdC9WRlMvSW5wdXRzL21pc3Npbmcta2V5LnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxOGMyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvVkZTL0lucHV0cy9taXNzaW5nLWtleS55YW1sCkBAIC0wLDAgKzEsNCBAQAoreworICAndmVyc2lvbic6IDAsCisgICdyb290cyc6IFsgeyAnbmFtZScgOiAnZm9vJywgJ2V4dGVybmFsLWNvbnRlbnRzJzogJ2JhcicgfSBdCit9CmRpZmYgLS1naXQgYS90ZXN0L1ZGUy9JbnB1dHMvcHVibGljX2hlYWRlci5oIGIvdGVzdC9WRlMvSW5wdXRzL3B1YmxpY19oZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzExMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9WRlMvSW5wdXRzL3B1YmxpY19oZWFkZXIuaApAQCAtMCwwICsxIEBACit2b2lkIGZyb21fZnJhbWV3b3JrKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdGVzdC9WRlMvSW5wdXRzL3Vua25vd24ta2V5LnlhbWwgYi90ZXN0L1ZGUy9JbnB1dHMvdW5rbm93bi1rZXkueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzdkODI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9WRlMvSW5wdXRzL3Vua25vd24ta2V5LnlhbWwKQEAgLTAsMCArMSw1IEBACit7CisgICd2ZXJzaW9uJzogMCwKKyAgJ3Vua25vd24ta2V5JzogJ3ZhbHVlJywKKyAgJ3Jvb3RzJzogW10KK30KZGlmZiAtLWdpdCBhL3Rlc3QvVkZTL0lucHV0cy91bmtub3duLXZhbHVlLnlhbWwgYi90ZXN0L1ZGUy9JbnB1dHMvdW5rbm93bi12YWx1ZS55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTBiMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1ZGUy9JbnB1dHMvdW5rbm93bi12YWx1ZS55YW1sCkBAIC0wLDAgKzEsNSBAQAoreworICAndmVyc2lvbic6IDAsCisgICdjYXNlLXNlbnNpdGl2ZSc6ICdNYXliZT8nLAorICAncm9vdHMnOiBbXQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9WRlMvSW5wdXRzL3VzZS1leHRlcm5hbC1uYW1lcy55YW1sIGIvdGVzdC9WRlMvSW5wdXRzL3VzZS1leHRlcm5hbC1uYW1lcy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZWE2MzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1ZGUy9JbnB1dHMvdXNlLWV4dGVybmFsLW5hbWVzLnlhbWwKQEAgLTAsMCArMSw3IEBACit7CisgICd2ZXJzaW9uJzogMCwKKyAgJ3VzZS1leHRlcm5hbC1uYW1lcyc6IEVYVEVSTkFMX05BTUVTLAorICAncm9vdHMnOiBbeyAndHlwZSc6ICdmaWxlJywgJ25hbWUnOiAnT1VUX0RJUi9leHRlcm5hbC1uYW1lcy5oJywKKyAgICAgICAgICAgICAnZXh0ZXJuYWwtY29udGVudHMnOiAnSU5QVVRfRElSL2V4dGVybmFsLW5hbWVzLmgnCisgICAgICAgICAgIH1dCit9CmRpZmYgLS1naXQgYS90ZXN0L1ZGUy9JbnB1dHMvdmZzb3ZlcmxheS55YW1sIGIvdGVzdC9WRlMvSW5wdXRzL3Zmc292ZXJsYXkueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzFlZDMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9WRlMvSW5wdXRzL3Zmc292ZXJsYXkueWFtbApAQCAtMCwwICsxLDIxIEBACit7CisgICd2ZXJzaW9uJzogMCwKKyAgJ3Jvb3RzJzogWworICAgIHsgJ25hbWUnOiAnT1VUX0RJUicsICd0eXBlJzogJ2RpcmVjdG9yeScsCisgICAgICAnY29udGVudHMnOiBbCisgICAgICAgIHsgJ25hbWUnOiAnbm90X3JlYWwuaCcsICd0eXBlJzogJ2ZpbGUnLAorICAgICAgICAgICdleHRlcm5hbC1jb250ZW50cyc6ICdJTlBVVF9ESVIvYWN0dWFsX2hlYWRlci5oJworICAgICAgICB9LAorICAgICAgICB7ICduYW1lJzogJ21vZHVsZS5tYXAnLCAndHlwZSc6ICdmaWxlJywKKyAgICAgICAgICAnZXh0ZXJuYWwtY29udGVudHMnOiAnSU5QVVRfRElSL2FjdHVhbF9tb2R1bGUubWFwJworICAgICAgICB9LAorICAgICAgICB7ICduYW1lJzogJ2luY2x1ZGVfcmVhbC5oJywgJ3R5cGUnOiAnZmlsZScsCisgICAgICAgICAgJ2V4dGVybmFsLWNvbnRlbnRzJzogJ0lOUFVUX0RJUi9pbmNsdWRlX3JlYWwuaCcKKyAgICAgICAgfSwKKyAgICAgICAgeyAnbmFtZSc6ICdTb21lRnJhbWV3b3JrLmZyYW1ld29yay9IZWFkZXJzL3B1YmxpY19oZWFkZXIuaCcsICd0eXBlJzogJ2ZpbGUnLAorICAgICAgICAgICdleHRlcm5hbC1jb250ZW50cyc6ICdJTlBVVF9ESVIvcHVibGljX2hlYWRlci5oJworICAgICAgICB9CisgICAgICBdCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS90ZXN0L1ZGUy9leHRlcm5hbC1uYW1lcy5jIGIvdGVzdC9WRlMvZXh0ZXJuYWwtbmFtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTBiZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9WRlMvZXh0ZXJuYWwtbmFtZXMuYwpAQCAtMCwwICsxLDM1IEBACisvLyBSVU46IHNlZCAtZSAiczpJTlBVVF9ESVI6JVMvSW5wdXRzOmciIC1lICJzOk9VVF9ESVI6JXQ6ZyIgLWUgInM6RVhURVJOQUxfTkFNRVM6dHJ1ZToiICVTL0lucHV0cy91c2UtZXh0ZXJuYWwtbmFtZXMueWFtbCA+ICV0LmV4dGVybmFsLnlhbWwKKy8vIFJVTjogc2VkIC1lICJzOklOUFVUX0RJUjolUy9JbnB1dHM6ZyIgLWUgInM6T1VUX0RJUjoldDpnIiAtZSAiczpFWFRFUk5BTF9OQU1FUzpmYWxzZToiICVTL0lucHV0cy91c2UtZXh0ZXJuYWwtbmFtZXMueWFtbCA+ICV0LnlhbWwKKy8vIFJFUVVJUkVTOiBzaGVsbAorCisjaW5jbHVkZSAiZXh0ZXJuYWwtbmFtZXMuaCIKKworLy8vLworLy8gUHJlcHJvY2Vzc29yIChfX0ZJTEVfXyBtYWNybyBhbmQgIyBkaXJlY3RpdmVzKToKKworLy8gUlVOOiAlY2xhbmdfY2MxIC1JICV0IC1pdmZzb3ZlcmxheSAldC5leHRlcm5hbC55YW1sIC1FICVzIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stUFAtRVhURVJOQUwgJXMKKy8vIENIRUNLLVBQLUVYVEVSTkFMOiAjIHt7WzAtOV0qfX0gIltbTkFNRTouKklucHV0cy5leHRlcm5hbC1uYW1lcy5oXV0iCisvLyBDSEVDSy1QUC1FWFRFUk5BTC1ORVhUOiB2b2lkIGZvbyhjaGFyICoqYykgeworLy8gQ0hFQ0stUFAtRVhURVJOQUwtTkVYVDogKmMgPSAiW1tOQU1FXV0iOworCisvLyBSVU46ICVjbGFuZ19jYzEgLUkgJXQgLWl2ZnNvdmVybGF5ICV0LnlhbWwgLUUgJXMgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1QUCAlcworLy8gQ0hFQ0stUFAtTk9UOiBJbnB1dHMKKworLy8vLworLy8gRGlhZ25vc3RpY3M6CisKKy8vIFJVTjogJWNsYW5nX2NjMSAtSSAldCAtaXZmc292ZXJsYXkgJXQuZXh0ZXJuYWwueWFtbCAtZnN5bnRheC1vbmx5ICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1ESUFHLUVYVEVSTkFMICVzCisvLyBDSEVDSy1ESUFHLUVYVEVSTkFMOiB7ey4qfX1JbnB1dHN7ey59fWV4dGVybmFsLW5hbWVzLmg6e3tbMC05XSo6WzAtOV0qfX06IHdhcm5pbmc6IGluY29tcGF0aWJsZSBwb2ludGVyCisKKy8vIFJVTjogJWNsYW5nX2NjMSAtSSAldCAtaXZmc292ZXJsYXkgJXQueWFtbCAtZnN5bnRheC1vbmx5ICVzIDI+JjEgfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1ESUFHICVzCisvLyBDSEVDSy1ESUFHLU5PVDogSW5wdXRzCisKKy8vLy8KKy8vIERlYnVnIGluZm8KKworLy8gUlVOOiAlY2xhbmdfY2MxIC1JICV0IC1pdmZzb3ZlcmxheSAldC5leHRlcm5hbC55YW1sIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZyAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1ERUJVRy1FWFRFUk5BTCAlcworLy8gQ0hFQ0stREVCVUctRVhURVJOQUw6ICFbW051bTpbMC05XSpdXSA9IG1ldGFkYXRhICF7bWV0YWRhdGEgISJ7ey4qfX1JbnB1dHN7ey59fWV4dGVybmFsLW5hbWVzLmgKKy8vIENIRUNLLURFQlVHLUVYVEVSTkFMOiBtZXRhZGF0YSAhe2kzMiB7e1swLTldKn19LCBtZXRhZGF0YSAhW1tOdW1dXXt7Lip9fURXX1RBR19maWxlX3R5cGUKKworLy8gUlVOOiAlY2xhbmdfY2MxIC1JICV0IC1pdmZzb3ZlcmxheSAldC55YW1sIC10cmlwbGUgJWl0YW5pdW1fYWJpX3RyaXBsZSAtZyAtZW1pdC1sbHZtICVzIC1vIC0gfCBGaWxlQ2hlY2sgLWNoZWNrLXByZWZpeD1DSEVDSy1ERUJVRyAlcworLy8gQ0hFQ0stREVCVUctTk9UOiBJbnB1dHMKZGlmZiAtLWdpdCBhL3Rlc3QvVkZTL2ZyYW1ld29yay1pbXBvcnQubSBiL3Rlc3QvVkZTL2ZyYW1ld29yay1pbXBvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDBiYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9WRlMvZnJhbWV3b3JrLWltcG9ydC5tCkBAIC0wLDAgKzEsOSBAQAorLy8gUlVOOiBzZWQgLWUgInM6SU5QVVRfRElSOiVTL0lucHV0czpnIiAtZSAiczpPVVRfRElSOiV0OmciICVTL0lucHV0cy92ZnNvdmVybGF5LnlhbWwgPiAldC55YW1sCisvLyBSVU46ICVjbGFuZ19jYzEgLVdlcnJvciAtRiAldCAtaXZmc292ZXJsYXkgJXQueWFtbCAtZnN5bnRheC1vbmx5ICVzCisvLyBSRVFVSVJFUzogc2hlbGwKKworI2ltcG9ydCA8U29tZUZyYW1ld29yay9wdWJsaWNfaGVhZGVyLmg+CisKK3ZvaWQgZm9vKCkgeworICBmcm9tX2ZyYW1ld29yaygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9WRlMvaW1wbGljaXQtaW5jbHVkZS5jIGIvdGVzdC9WRlMvaW1wbGljaXQtaW5jbHVkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjY2NWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1ZGUy9pbXBsaWNpdC1pbmNsdWRlLmMKQEAgLTAsMCArMSw3IEBACisvLyBSVU46IHNlZCAtZSAiczpJTlBVVF9ESVI6JVMvSW5wdXRzOmciIC1lICJzOk9VVF9ESVI6JXQ6ZyIgJVMvSW5wdXRzL3Zmc292ZXJsYXkueWFtbCA+ICV0LnlhbWwKKy8vIFJVTjogJWNsYW5nX2NjMSAtV2Vycm9yIC1pdmZzb3ZlcmxheSAldC55YW1sIC1JICV0IC1pbmNsdWRlICJub3RfcmVhbC5oIiAtZnN5bnRheC1vbmx5ICVzCisvLyBSRVFVSVJFUzogc2hlbGwKKwordm9pZCBmb28oKSB7CisgIGJhcigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9WRlMvaW5jbHVkZS1taXhlZC1yZWFsLWFuZC12aXJ0dWFsLmMgYi90ZXN0L1ZGUy9pbmNsdWRlLW1peGVkLXJlYWwtYW5kLXZpcnR1YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWY1Zjk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9WRlMvaW5jbHVkZS1taXhlZC1yZWFsLWFuZC12aXJ0dWFsLmMKQEAgLTAsMCArMSwxNCBAQAorLy8gUlVOOiBybSAtcmYgJXQKKy8vIFJVTjogbWtkaXIgLXAgJXQKKy8vIFJVTjogZWNobyAidm9pZCBiYXoodm9pZCk7IiA+ICV0L3JlYWwuaAorLy8gUlVOOiBzZWQgLWUgInM6SU5QVVRfRElSOiVTL0lucHV0czpnIiAtZSAiczpPVVRfRElSOiV0OmciICVTL0lucHV0cy92ZnNvdmVybGF5LnlhbWwgPiAldC55YW1sCisvLyBSVU46ICVjbGFuZ19jYzEgLVdlcnJvciAtaXZmc292ZXJsYXkgJXQueWFtbCAtSSAldCAtZnN5bnRheC1vbmx5ICVzCisvLyBSRVFVSVJFUzogc2hlbGwKKworI2luY2x1ZGUgIm5vdF9yZWFsLmgiCisjaW5jbHVkZSAicmVhbC5oIgorCit2b2lkIGZvbygpIHsKKyAgYmFyKCk7CisgIGJheigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9WRlMvaW5jbHVkZS1yZWFsLWZyb20tdmlydHVhbC5jIGIvdGVzdC9WRlMvaW5jbHVkZS1yZWFsLWZyb20tdmlydHVhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzA3YjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1ZGUy9pbmNsdWRlLXJlYWwtZnJvbS12aXJ0dWFsLmMKQEAgLTAsMCArMSwxMiBAQAorLy8gUlVOOiBybSAtcmYgJXQKKy8vIFJVTjogbWtkaXIgLXAgJXQKKy8vIFJVTjogZWNobyAidm9pZCBiYXoodm9pZCk7IiA+ICV0L3JlYWwuaAorLy8gUlVOOiBzZWQgLWUgInM6SU5QVVRfRElSOiVTL0lucHV0czpnIiAtZSAiczpPVVRfRElSOiV0OmciICVTL0lucHV0cy92ZnNvdmVybGF5LnlhbWwgPiAldC55YW1sCisvLyBSVU46ICVjbGFuZ19jYzEgLVdlcnJvciAtaXZmc292ZXJsYXkgJXQueWFtbCAtSSAldCAtZnN5bnRheC1vbmx5ICVzCisvLyBSRVFVSVJFUzogc2hlbGwKKworI2luY2x1ZGUgImluY2x1ZGVfcmVhbC5oIgorCit2b2lkIGZvbygpIHsKKyAgYmF6KCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1ZGUy9pbmNsdWRlLXZpcnR1YWwtZnJvbS1yZWFsLmMgYi90ZXN0L1ZGUy9pbmNsdWRlLXZpcnR1YWwtZnJvbS1yZWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmNjA1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvVkZTL2luY2x1ZGUtdmlydHVhbC1mcm9tLXJlYWwuYwpAQCAtMCwwICsxLDEyIEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiBta2RpciAtcCAldAorLy8gUlVOOiBlY2hvICcjaW5jbHVkZSAibm90X3JlYWwuaCInID4gJXQvaW5jbHVkZV9ub3RfcmVhbC5oCisvLyBSVU46IHNlZCAtZSAiczpJTlBVVF9ESVI6JVMvSW5wdXRzOmciIC1lICJzOk9VVF9ESVI6JXQ6ZyIgJVMvSW5wdXRzL3Zmc292ZXJsYXkueWFtbCA+ICV0LnlhbWwKKy8vIFJVTjogJWNsYW5nX2NjMSAtV2Vycm9yIC1pdmZzb3ZlcmxheSAldC55YW1sIC1JICV0IC1mc3ludGF4LW9ubHkgJXMKKy8vIFJFUVVJUkVTOiBzaGVsbAorCisjaW5jbHVkZSAiaW5jbHVkZV9ub3RfcmVhbC5oIgorCit2b2lkIGZvbygpIHsKKyAgYmFyKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1ZGUy9pbmNsdWRlLmMgYi90ZXN0L1ZGUy9pbmNsdWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkMDRkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvVkZTL2luY2x1ZGUuYwpAQCAtMCwwICsxLDkgQEAKKy8vIFJVTjogc2VkIC1lICJzOklOUFVUX0RJUjolUy9JbnB1dHM6ZyIgLWUgInM6T1VUX0RJUjoldDpnIiAlUy9JbnB1dHMvdmZzb3ZlcmxheS55YW1sID4gJXQueWFtbAorLy8gUlVOOiAlY2xhbmdfY2MxIC1XZXJyb3IgLUkgJXQgLWl2ZnNvdmVybGF5ICV0LnlhbWwgLWZzeW50YXgtb25seSAlcworLy8gUkVRVUlSRVM6IHNoZWxsCisKKyNpbmNsdWRlICJub3RfcmVhbC5oIgorCit2b2lkIGZvbygpIHsKKyAgYmFyKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L1ZGUy9tb2R1bGUtaW1wb3J0Lm0gYi90ZXN0L1ZGUy9tb2R1bGUtaW1wb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmZDkwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvVkZTL21vZHVsZS1pbXBvcnQubQpAQCAtMCwwICsxLDEwIEBACisvLyBSVU46IHJtIC1yZiAldAorLy8gUlVOOiBzZWQgLWUgInM6SU5QVVRfRElSOiVTL0lucHV0czpnIiAtZSAiczpPVVRfRElSOiV0OmciICVTL0lucHV0cy92ZnNvdmVybGF5LnlhbWwgPiAldC55YW1sCisvLyBSVU46ICVjbGFuZ19jYzEgLVdlcnJvciAtZm1vZHVsZXMgLWZtb2R1bGVzLWNhY2hlLXBhdGg9JXQgLWl2ZnNvdmVybGF5ICV0LnlhbWwgLUkgJXQgLWZzeW50YXgtb25seSAlcworLy8gUkVRVUlSRVM6IHNoZWxsCisKK0BpbXBvcnQgbm90X3JlYWw7CisKK3ZvaWQgZm9vKCkgeworICBiYXIoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvVkZTL3BhcnNlLWVycm9ycy5jIGIvdGVzdC9WRlMvcGFyc2UtZXJyb3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5NGVmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvVkZTL3BhcnNlLWVycm9ycy5jCkBAIC0wLDAgKzEsMTQgQEAKKy8vIFJVTjogbm90ICVjbGFuZ19jYzEgLWl2ZnNvdmVybGF5ICVTL0lucHV0cy9pbnZhbGlkLXlhbWwueWFtbCAtZnN5bnRheC1vbmx5ICVzIDI+JjEgfCBGaWxlQ2hlY2sgJXMKKy8vIENIRUNLOiBpbnZhbGlkIHZpcnR1YWwgZmlsZXN5c3RlbSBvdmVybGF5IGZpbGUKKworLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtaXZmc292ZXJsYXkgJVMvSW5wdXRzL21pc3Npbmcta2V5LnlhbWwgLWZzeW50YXgtb25seSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stTUlTU0lORy1UWVBFICVzCisvLyBDSEVDSy1NSVNTSU5HLVRZUEU6IG1pc3Npbmcga2V5ICd0eXBlJworLy8gQ0hFQ0stTUlTU0lORy1UWVBFOiBpbnZhbGlkIHZpcnR1YWwgZmlsZXN5c3RlbSBvdmVybGF5IGZpbGUKKworLy8gUlVOOiBub3QgJWNsYW5nX2NjMSAtaXZmc292ZXJsYXkgJVMvSW5wdXRzL3Vua25vd24ta2V5LnlhbWwgLWZzeW50YXgtb25seSAlcyAyPiYxIHwgRmlsZUNoZWNrIC1jaGVjay1wcmVmaXg9Q0hFQ0stVU5LTk9XTi1LRVkgJXMKKy8vIENIRUNLLVVOS05PV04tS0VZOiB1bmtub3duIGtleQorLy8gQ0hFQ0stVU5LTk9XTi1LRVk6IGludmFsaWQgdmlydHVhbCBmaWxlc3lzdGVtIG92ZXJsYXkgZmlsZQorCisvLyBSVU46IG5vdCAlY2xhbmdfY2MxIC1pdmZzb3ZlcmxheSAlUy9JbnB1dHMvdW5rbm93bi12YWx1ZS55YW1sIC1mc3ludGF4LW9ubHkgJXMgMj4mMSB8IEZpbGVDaGVjayAtY2hlY2stcHJlZml4PUNIRUNLLVVOS05PV04tVkFMVUUgJXMKKy8vIENIRUNLLVVOS05PV04tVkFMVUU6IGV4cGVjdGVkIGJvb2xlYW4gdmFsdWUKKy8vIENIRUNLLVVOS05PV04tVkFMVUU6IGludmFsaWQgdmlydHVhbCBmaWxlc3lzdGVtIG92ZXJsYXkgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9WRlMvcmVsYXRpdmUtcGF0aC5jIGIvdGVzdC9WRlMvcmVsYXRpdmUtcGF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTAxZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1ZGUy9yZWxhdGl2ZS1wYXRoLmMKQEAgLTAsMCArMSwxMSBAQAorLy8gUlVOOiBta2RpciAtcCAldAorLy8gUlVOOiBjZCAldAorLy8gUlVOOiBzZWQgLWUgInM6SU5QVVRfRElSOiVTL0lucHV0czpnIiAtZSAiczpPVVRfRElSOiV0OmciICVTL0lucHV0cy92ZnNvdmVybGF5LnlhbWwgPiAldC55YW1sCisvLyBSVU46ICVjbGFuZ19jYzEgLVdlcnJvciAtSSAuIC1pdmZzb3ZlcmxheSAldC55YW1sIC1mc3ludGF4LW9ubHkgJXMKKy8vIFJFUVVJUkVTOiBzaGVsbAorCisjaW5jbHVkZSAibm90X3JlYWwuaCIKKwordm9pZCBmb28oKSB7CisgIGJhcigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9saXQuY2ZnIGIvdGVzdC9saXQuY2ZnCmluZGV4IDE5ZGFhNjEuLjY2Y2VjNjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvbGl0LmNmZworKysgYi90ZXN0L2xpdC5jZmcKQEAgLTQ0LDcgKzQ0LDcgQEAKIGNvbmZpZy50ZXN0X2Zvcm1hdCA9IGxpdC5mb3JtYXRzLlNoVGVzdChleGVjdXRlX2V4dGVybmFsKQogCiAjIHN1ZmZpeGVzOiBBIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIHRvIHRyZWF0IGFzIHRlc3QgZmlsZXMuCi1jb25maWcuc3VmZml4ZXMgPSBbJy5jJywgJy5jcHAnLCAnLm0nLCAnLm1tJywgJy5jdScsICcubGwnLCAnLmNsJywgJy5zJ10KK2NvbmZpZy5zdWZmaXhlcyA9IFsnLmMnLCAnLmNwcCcsICcubScsICcubW0nLCAnLmN1JywgJy5sbCcsICcuY2wnLCAnLnMnLCAnLlMnXQogCiAjIGV4Y2x1ZGVzOiBBIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gZXhjbHVkZSBmcm9tIHRoZSB0ZXN0c3VpdGUuIFRoZSAnSW5wdXRzJwogIyBzdWJkaXJlY3RvcmllcyBjb250YWluIGF1eGlsaWFyeSBpbnB1dHMgZm9yIHZhcmlvdXMgdGVzdHMgaW4gdGhlaXIgcGFyZW50CkBAIC05NCwxMCArOTQsMTQgQEAKIAogIyBUd2VhayB0aGUgUEFUSCB0byBpbmNsdWRlIHRoZSB0b29scyBkaXIgYW5kIHRoZSBzY3JpcHRzIGRpci4KIGlmIGNsYW5nX29ial9yb290IGlzIG5vdCBOb25lOgorICAgIGNsYW5nX3Rvb2xzX2RpciA9IGdldGF0dHIoY29uZmlnLCAnY2xhbmdfdG9vbHNfZGlyJywgTm9uZSkKKyAgICBpZiBub3QgY2xhbmdfdG9vbHNfZGlyOgorICAgICAgICBsaXRfY29uZmlnLmZhdGFsKCdObyBDbGFuZyB0b29scyBkaXIgc2V0IScpCiAgICAgbGx2bV90b29sc19kaXIgPSBnZXRhdHRyKGNvbmZpZywgJ2xsdm1fdG9vbHNfZGlyJywgTm9uZSkKICAgICBpZiBub3QgbGx2bV90b29sc19kaXI6CiAgICAgICAgIGxpdF9jb25maWcuZmF0YWwoJ05vIExMVk0gdG9vbHMgZGlyIHNldCEnKQotICAgIHBhdGggPSBvcy5wYXRoLnBhdGhzZXAuam9pbigobGx2bV90b29sc19kaXIsIGNvbmZpZy5lbnZpcm9ubWVudFsnUEFUSCddKSkKKyAgICBwYXRoID0gb3MucGF0aC5wYXRoc2VwLmpvaW4oKAorICAgICAgICAgICAgY2xhbmdfdG9vbHNfZGlyLCBsbHZtX3Rvb2xzX2RpciwgY29uZmlnLmVudmlyb25tZW50WydQQVRIJ10pKQogICAgIGNvbmZpZy5lbnZpcm9ubWVudFsnUEFUSCddID0gcGF0aAogICAgIGxsdm1fbGlic19kaXIgPSBnZXRhdHRyKGNvbmZpZywgJ2xsdm1fbGlic19kaXInLCBOb25lKQogICAgIGlmIG5vdCBsbHZtX2xpYnNfZGlyOgpAQCAtMTkxLDYgKzE5NSwyMiBAQAogaWYgbm90IGxpdF9jb25maWcucXVpZXQ6CiAgICAgbGl0X2NvbmZpZy5ub3RlKCd1c2luZyBjbGFuZzogJXInICUgY29uZmlnLmNsYW5nKQogCisjIFBsdWdpbnMgKGxvYWRhYmxlIG1vZHVsZXMpCisjIFRPRE86IFRoaXMgc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IE1ha2VmaWxlIG9yIGF1dG9jb25mLgoraWYgc3lzLnBsYXRmb3JtIGluIFsnd2luMzInLCAnY3lnd2luJ106CisgICAgaGFzX3BsdWdpbnMgPSAoY29uZmlnLmVuYWJsZV9zaGFyZWQgPT0gMSkKK2Vsc2U6CisgICAgaGFzX3BsdWdpbnMgPSBUcnVlCisKK2lmIGhhc19wbHVnaW5zIGFuZCBjb25maWcubGx2bV9wbHVnaW5fZXh0OgorICAgIGNvbmZpZy5hdmFpbGFibGVfZmVhdHVyZXMuYWRkKCdwbHVnaW5zJykKKworY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCAoJyVsbHZtc2hsaWJkaXInLCBjb25maWcubGx2bV9zaGxpYl9kaXIpICkKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCggKCclcGx1Z2luZXh0JywgY29uZmlnLmxsdm1fcGx1Z2luX2V4dCkgKQorCitpZiBjb25maWcuY2xhbmdfZXhhbXBsZXM6CisgICAgY29uZmlnLmF2YWlsYWJsZV9mZWF0dXJlcy5hZGQoJ2V4YW1wbGVzJykKKwogIyBOb3RlIHRoYXQgd2hlbiBzdWJzdGl0dXRpbmcgJWNsYW5nX2NjMSBhbHNvIGZpbGwgaW4gdGhlIGluY2x1ZGUgZGlyZWN0b3J5IG9mCiAjIHRoZSBidWlsdGluIGhlYWRlcnMuIFRob3NlIGFyZSBwYXJ0IG9mIGV2ZW4gYSBmcmVlc3RhbmRpbmcgZW52aXJvbm1lbnQsIGJ1dAogIyBDbGFuZyByZWxpZXMgb24gdGhlIGRyaXZlciB0byBsb2NhdGUgdGhlbS4KQEAgLTIwOCw2ICsyMjgsMzEgQEAKICAgICAjIEVuc3VyZSB0aGUgcmVzdWx0IGlzIGFuIGFzY2lpIHN0cmluZywgYWNyb3NzIFB5dGhvbjIuNSsgLSBQeXRob24zLgogICAgIHJldHVybiBzdHIoZGlyLmRlY29kZSgnYXNjaWknKSkKIAorZGVmIG1ha2VJdGFuaXVtQUJJVHJpcGxlKHRyaXBsZSk6CisgICAgbSA9IHJlLm1hdGNoKHInKFx3KyktKFx3KyktKFx3KyknLCB0cmlwbGUpCisgICAgaWYgbm90IG06CisgICAgICBsaXRfY29uZmlnLmZhdGFsKCJDb3VsZCBub3QgdHVybiAnJXMnIGludG8gSXRhbml1bSBBQkkgdHJpcGxlIiAlIHRyaXBsZSkKKyAgICBpZiBtLmdyb3VwKDMpLmxvd2VyKCkgIT0gJ3dpbjMyJzoKKyAgICAgICMgQWxsIG5vbi13aW4zMiB0cmlwbGVzIHVzZSB0aGUgSXRhbml1bSBBQkkuCisgICAgICByZXR1cm4gdHJpcGxlCisgICAgcmV0dXJuIG0uZ3JvdXAoMSkgKyAnLScgKyBtLmdyb3VwKDIpICsgJy1taW5ndzMyJworCitkZWYgbWFrZU1TQUJJVHJpcGxlKHRyaXBsZSk6CisgICAgbSA9IHJlLm1hdGNoKHInKFx3KyktKFx3KyktKFx3KyknLCB0cmlwbGUpCisgICAgaWYgbm90IG06CisgICAgICBsaXRfY29uZmlnLmZhdGFsKCJDb3VsZCBub3QgdHVybiAnJXMnIGludG8gTVMgQUJJIHRyaXBsZSIgJSB0cmlwbGUpCisgICAgaXNhID0gbS5ncm91cCgxKS5sb3dlcigpCisgICAgdmVuZG9yID0gbS5ncm91cCgyKS5sb3dlcigpCisgICAgb3MgPSBtLmdyb3VwKDMpLmxvd2VyKCkKKyAgICBpZiBvcyA9PSAnd2luMzInOgorICAgICAgIyBJZiB0aGUgT1MgaXMgd2luMzIsIHdlJ3JlIGRvbmUuCisgICAgICByZXR1cm4gdHJpcGxlCisgICAgaWYgaXNhLnN0YXJ0c3dpdGgoJ3g4NicpIG9yIGlzYSA9PSAnYW1kNjQnIG9yIHJlLm1hdGNoKHInaVxkODYnLCBpc2EpOiAKKyAgICAgICMgRm9yIHg4NiBJU0FzLCBhZGp1c3QgdGhlIE9TLgorICAgICAgcmV0dXJuIGlzYSArICctJyArIHZlbmRvciArICctd2luMzInCisgICAgIyAtd2luMzIgaXMgbm90IHN1cHBvcnRlZCBmb3Igbm9uLXg4NiB0YXJnZXRzOyB1c2UgYSBkZWZhdWx0LgorICAgIHJldHVybiAnaTY4Ni1wYy13aW4zMicKKwogY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCAoJyVjbGFuZ19jYzEnLCAnJXMgLWNjMSAtaW50ZXJuYWwtaXN5c3RlbSAlcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGNvbmZpZy5jbGFuZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsYW5nQnVpbHRpbkluY2x1ZGVEaXIoY29uZmlnLmNsYW5nKSkpICkKQEAgLTIxOSw2ICsyNjQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAtLWRyaXZlci1tb2RlPWcrKyAnKSkKIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCggKCclY2xhbmcnLCAnICcgKyBjb25maWcuY2xhbmcgKyAnICcpICkKIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCggKCcldGVzdF9kZWJ1Z2luZm8nLCAnICcgKyBjb25maWcubGx2bV9zcmNfcm9vdCArICcvdXRpbHMvdGVzdF9kZWJ1Z2luZm8ucGwgJykgKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCAoJyVpdGFuaXVtX2FiaV90cmlwbGUnLCBtYWtlSXRhbml1bUFCSVRyaXBsZShjb25maWcudGFyZ2V0X3RyaXBsZSkpICkKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCggKCclbXNfYWJpX3RyaXBsZScsIG1ha2VNU0FCSVRyaXBsZShjb25maWcudGFyZ2V0X3RyaXBsZSkpICkKIAogIyBGSVhNRTogRmluZCBuaWNlciB3YXkgdG8gcHJvaGliaXQgdGhpcy4KIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgKQEAgLTI0MSw2ICsyODgsNDIgQEAKICAgICAoJyAlY2xhbmctY2wgJywKICAgICAgIiIiKioqIGludmFsaWQgc3Vic3RpdHV0aW9uLCB1c2UgJyVjbGFuZ19jbCcuICoqKiIiIikgKQogCisjIEZvciBlYWNoIG9jY3VycmVuY2Ugb2YgYSBjbGFuZyB0b29sIG5hbWUgYXMgaXRzIG93biB3b3JkLCByZXBsYWNlIGl0CisjIHdpdGggdGhlIGZ1bGwgcGF0aCB0byB0aGUgYnVpbGQgZGlyZWN0b3J5IGhvbGRpbmcgdGhhdCB0b29sLiAgVGhpcworIyBlbnN1cmVzIHRoYXQgd2UgYXJlIHRlc3RpbmcgdGhlIHRvb2xzIGp1c3QgYnVpbHQgYW5kIG5vdCBzb21lIHJhbmRvbQorIyB0b29scyB0aGF0IG1pZ2h0IGhhcHBlbiB0byBiZSBpbiB0aGUgdXNlcidzIFBBVEguCit0b29sX2RpcnMgPSBvcy5wYXRoLnBhdGhzZXAuam9pbigoY2xhbmdfdG9vbHNfZGlyLCBsbHZtX3Rvb2xzX2RpcikpCisKKyMgUmVnZXggYXNzZXJ0aW9ucyB0byByZWplY3QgbmVpZ2hib3IgaHlwaGVucy9kb3RzIChzZWVuIGluIHNvbWUgdGVzdHMpLgorIyBGb3IgZXhhbXBsZSwgZG9uJ3QgbWF0Y2ggJ2NsYW5nLWNoZWNrLScgb3IgJy5jbGFuZy1mb3JtYXQnLgorTm9QcmVIeXBoZW5Eb3QgPSByIig/PCEoLXxcLikpIgorTm9Qb3N0SHlwaGVuRG90ID0gciIoPyEoLXxcLikpIgorCitmb3IgcGF0dGVybiBpbiBbciJcYkZpbGVDaGVja1xiIiwKKyAgICAgICAgICAgICAgICByIlxiYy1pbmRleC10ZXN0XGIiLAorICAgICAgICAgICAgICAgIE5vUHJlSHlwaGVuRG90ICsgciJcYmNsYW5nLWNoZWNrXGIiICsgTm9Qb3N0SHlwaGVuRG90LAorICAgICAgICAgICAgICAgIE5vUHJlSHlwaGVuRG90ICsgciJcYmNsYW5nLWZvcm1hdFxiIiArIE5vUG9zdEh5cGhlbkRvdCwKKyAgICAgICAgICAgICAgICAjIEZJWE1FOiBTb21lIGNsYW5nIHRlc3QgdXNlcyBvcHQ/CisgICAgICAgICAgICAgICAgTm9QcmVIeXBoZW5Eb3QgKyByIlxib3B0XGIiICsgTm9Qb3N0SHlwaGVuRG90LAorICAgICAgICAgICAgICAgICMgSGFuZGxlIHRoZXNlIHNwZWNpYWxseSBhcyB0aGV5IGFyZSBzdHJpbmdzIHNlYXJjaGVkCisgICAgICAgICAgICAgICAgIyBmb3IgZHVyaW5nIHRlc3RpbmcuCisgICAgICAgICAgICAgICAgciJcfCBcYmNvdW50XGIiLAorICAgICAgICAgICAgICAgIHIiXHwgXGJub3RcYiJdOgorICAgICMgRXh0cmFjdCB0aGUgdG9vbCBuYW1lIGZyb20gdGhlIHBhdHRlcm4uICBUaGlzIHJlbGllcyBvbiB0aGUgdG9vbAorICAgICMgbmFtZSBiZWluZyBzdXJyb3VuZGVkIGJ5IFxiIHdvcmQgbWF0Y2ggb3BlcmF0b3JzLiAgSWYgdGhlCisgICAgIyBwYXR0ZXJuIHN0YXJ0cyB3aXRoICJ8ICIsIGluY2x1ZGUgaXQgaW4gdGhlIHN0cmluZyB0byBiZQorICAgICMgc3Vic3RpdHV0ZWQuCisgICAgdG9vbF9tYXRjaCA9IHJlLm1hdGNoKHIiXihcXCk/KChcfCApPylcVytiKFswLTlBLVphLXotX10rKVxcYlxXKiQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuKQorICAgIHRvb2xfcGlwZSA9IHRvb2xfbWF0Y2guZ3JvdXAoMikKKyAgICB0b29sX25hbWUgPSB0b29sX21hdGNoLmdyb3VwKDQpCisgICAgdG9vbF9wYXRoID0gbGl0LnV0aWwud2hpY2godG9vbF9uYW1lLCB0b29sX2RpcnMpCisgICAgaWYgbm90IHRvb2xfcGF0aDoKKyAgICAgICAgIyBXYXJuLCBidXQgc3RpbGwgcHJvdmlkZSBhIHN1YnN0aXR1dGlvbi4KKyAgICAgICAgbGl0X2NvbmZpZy5ub3RlKCdEaWQgbm90IGZpbmQgJyArIHRvb2xfbmFtZSArICcgaW4gJyArIHRvb2xfZGlycykKKyAgICAgICAgdG9vbF9wYXRoID0gY2xhbmdfdG9vbHNfZGlyICsgJy8nICsgdG9vbF9uYW1lCisgICAgY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKChwYXR0ZXJuLCB0b29sX3BpcGUgKyB0b29sX3BhdGgpKQorCiAjIyMKIAogIyBTZXQgYXZhaWxhYmxlIGZlYXR1cmVzIHdlIGFsbG93IHRlc3RzIHRvIGNvbmRpdGlvbmFsaXplIG9uLgpAQCAtMjU3LDEyICszNDAsMjQgQEAKIGlmIG5vdCBwbGF0Zm9ybS5zeXN0ZW0oKSBpbiBbJ1dpbmRvd3MnXSBvciBub3QgZXhlY3V0ZV9leHRlcm5hbDoKICAgICBjb25maWcuYXZhaWxhYmxlX2ZlYXR1cmVzLmFkZCgnc2hlbGwtcHJlc2VydmVzLXJvb3QnKQogCisjIEZvciB0ZXN0cyB0aGF0IHJlcXVpcmUgRGFyd2luIHRvIHJ1bi4KKyMgVGhpcyBpcyB1c2VkIGJ5IGRlYnVnaW5mby10ZXN0cy8qYmxvY2sqLm0gYW5kIGRlYnVnaW5mby10ZXN0cy9mb3JlYWNoLm0uCitpZiBwbGF0Zm9ybS5zeXN0ZW0oKSBpbiBbJ0RhcndpbiddOgorICAgIGNvbmZpZy5hdmFpbGFibGVfZmVhdHVyZXMuYWRkKCdzeXN0ZW0tZGFyd2luJykKKwogIyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgaW4gbm9uLWR1bWIgdGVybWluYWwKIGlmIHBsYXRmb3JtLnN5c3RlbSgpIG5vdCBpbiBbJ1dpbmRvd3MnXToKICAgICBjb25maWcuYXZhaWxhYmxlX2ZlYXR1cmVzLmFkZCgnYW5zaS1lc2NhcGUtc2VxdWVuY2VzJykKIAotIyBOYXRpdmUgY29tcGlsYXRpb246IGhvc3QgYXJjaCA9PSB0YXJnZXQgYXJjaAotaWYgY29uZmlnLmhvc3RfYXJjaCBpbiBjb25maWcudGFyZ2V0X3RyaXBsZToKKyMgQ2FwYWJpbGl0eSB0byBwcmludCB1dGY4IHRvIHRoZSB0ZXJtaW5hbC4KKyMgV2luZG93cyBleHBlY3RzIGNvZGVwYWdlLCB1bmxlc3MgV2lkZSBBUEkuCitpZiBwbGF0Zm9ybS5zeXN0ZW0oKSBub3QgaW4gWydXaW5kb3dzJ106CisgICAgY29uZmlnLmF2YWlsYWJsZV9mZWF0dXJlcy5hZGQoJ3V0ZjgtY2FwYWJsZS10ZXJtaW5hbCcpCisKKyMgTmF0aXZlIGNvbXBpbGF0aW9uOiBDaGVjayBpZiB0cmlwbGVzIG1hdGNoLgorIyBGSVhNRTogQ29uc2lkZXIgY2FzZXMgdGhhdCB0YXJnZXQgY2FuIGJlIGV4ZWN1dGVkCisjIGV2ZW4gaWYgaG9zdF90cmlwbGUgd2VyZSBkaWZmZXJlbnQgZnJvbSB0YXJnZXRfdHJpcGxlLgoraWYgY29uZmlnLmhvc3RfdHJpcGxlID09IGNvbmZpZy50YXJnZXRfdHJpcGxlOgogICAgIGNvbmZpZy5hdmFpbGFibGVfZmVhdHVyZXMuYWRkKCJuYXRpdmUiKQogCiAjIENhc2UtaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW0KQEAgLTI4NCw2ICszNzksMTQgQEAKIGlmIG9zLnBhdGguZXhpc3RzKCIvZGV2L2ZkLzAiKSBhbmQgc3lzLnBsYXRmb3JtIG5vdCBpbiBbJ2N5Z3dpbiddOgogICAgIGNvbmZpZy5hdmFpbGFibGVfZmVhdHVyZXMuYWRkKCdkZXYtZmQtZnMnKQogCisjIERXMiBUYXJnZXQKK2lmIG5vdCByZS5tYXRjaChyJy4qLXdpbjMyJCcsIGNvbmZpZy50YXJnZXRfdHJpcGxlKToKKyAgICBjb25maWcuYXZhaWxhYmxlX2ZlYXR1cmVzLmFkZCgnZHcyJykKKworIyBOb3Qgc2V0IG9uIG5hdGl2ZSBNUyBlbnZpcm9ubWVudC4KK2lmIG5vdCByZS5tYXRjaChyJy4qLXdpbjMyJCcsIGNvbmZpZy50YXJnZXRfdHJpcGxlKToKKyAgICBjb25maWcuYXZhaWxhYmxlX2ZlYXR1cmVzLmFkZCgnbm9uLW1zLXNkaycpCisKICMgW1BSODgzM10gTExQNjQtaW5jb21wYXRpYmxlIHRlc3RzCiBpZiBub3QgcmUubWF0Y2gocideeDg2XzY0LiotKHdpbjMyfG1pbmd3MzIpJCcsIGNvbmZpZy50YXJnZXRfdHJpcGxlKToKICAgICBjb25maWcuYXZhaWxhYmxlX2ZlYXR1cmVzLmFkZCgnTFA2NCcpCkBAIC0yOTIsNDAgKzM5NSwzNiBAQAogaWYgbm90IHJlLm1hdGNoKHInLiotKGN5Z3dpbnxtaW5ndzMyKSQnLCBjb25maWcudGFyZ2V0X3RyaXBsZSk6CiAgICAgY29uZmlnLmF2YWlsYWJsZV9mZWF0dXJlcy5hZGQoJ2NsYW5nLWRyaXZlcicpCiAKLSMgUmVnaXN0ZXJlZCBUYXJnZXRzCi1kZWYgZ2V0X2xsY19wcm9wcyh0b29sKToKLSAgICBzZXRfb2ZfdGFyZ2V0cyA9IHNldCgpCi0gICAgZW5hYmxlX2Fzc2VydGlvbnMgPSBGYWxzZQorIyBbUFIxODg1Nl0gRGVwZW5kcyB0byByZW1vdmUgb3BlbmVkIGZpbGUuIE9uIHdpbjMyLCBhIGZpbGUgY291bGQgYmUgcmVtb3ZlZAorIyBvbmx5IGlmIGFsbCBoYW5kbGVzIHdlcmUgY2xvc2VkLgoraWYgcGxhdGZvcm0uc3lzdGVtKCkgbm90IGluIFsnV2luZG93cyddOgorICAgIGNvbmZpZy5hdmFpbGFibGVfZmVhdHVyZXMuYWRkKCdjYW4tcmVtb3ZlLW9wZW5lZC1maWxlJykKIAotICAgIGNtZCA9IHN1YnByb2Nlc3MuUG9wZW4oW3Rvb2wsICctdmVyc2lvbiddLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorIyBSZXR1cm5zIHNldCBvZiBhdmFpbGFibGUgZmVhdHVyZXMsIHJlZ2lzdGVyZWQtdGFyZ2V0KHMpIGFuZCBhc3NlcnRzLgorZGVmIGdldF9sbHZtX2NvbmZpZ19wcm9wcygpOgorICAgIHNldF9vZl9mZWF0dXJlcyA9IHNldCgpCiAKLSAgICAjIFBhcnNlIHRoZSBzdGRvdXQgdG8gZ2V0IHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgdGFyZ2V0cy4KLSAgICBwYXJzZV90YXJnZXRzID0gRmFsc2UKLSAgICBmb3IgbGluZSBpbiBjbWQuc3Rkb3V0OgotICAgICAgICBsaW5lID0gbGluZS5kZWNvZGUoJ2FzY2lpJykKLSAgICAgICAgaWYgcGFyc2VfdGFyZ2V0czoKLSAgICAgICAgICAgIG0gPSByZS5tYXRjaCggcicoLiopIC0gJywgbGluZSkKLSAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgc2V0X29mX3RhcmdldHMuYWRkKG0uZ3JvdXAoMSkuc3RyaXAoKSArICctcmVnaXN0ZXJlZC10YXJnZXQnKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICBlbGlmICJSZWdpc3RlcmVkIFRhcmdldHM6IiBpbiBsaW5lOgotICAgICAgICAgICAgcGFyc2VfdGFyZ2V0cyA9IFRydWUKKyAgICBjbWQgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgICBbCisgICAgICAgICAgICBvcy5wYXRoLmpvaW4obGx2bV90b29sc19kaXIsICdsbHZtLWNvbmZpZycpLAorICAgICAgICAgICAgJy0tYXNzZXJ0aW9uLW1vZGUnLAorICAgICAgICAgICAgJy0tdGFyZ2V0cy1idWlsdCcsCisgICAgICAgICAgICBdLAorICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFCisgICAgICAgICkKKyAgICAjIDFzdCBsaW5lIGNvcnJlc3BvbmRzIHRvIC0tYXNzZXJ0aW9uLW1vZGUsICJPTiIgb3IgIk9GRiIuCisgICAgbGluZSA9IGNtZC5zdGRvdXQucmVhZGxpbmUoKS5zdHJpcCgpLmRlY29kZSgnYXNjaWknKQorICAgIGlmIGxpbmUgPT0gIk9OIjoKKyAgICAgICAgc2V0X29mX2ZlYXR1cmVzLmFkZCgnYXNzZXJ0cycpCiAKLSAgICAgICAgaWYgcmUuc2VhcmNoKHInd2l0aCBhc3NlcnRpb25zJywgbGluZSk6Ci0gICAgICAgICAgICBlbmFibGVfYXNzZXJ0aW9ucyA9IFRydWUKKyAgICAjIDJuZCBsaW5lIGNvcnJlc3BvbmRzIHRvIC0tdGFyZ2V0cy1idWlsdCwgbGlrZTsKKyAgICAjIEFBcmNoNjQgQVJNIENwcEJhY2tlbmQgWDg2CisgICAgZm9yIGFyY2ggaW4gY21kLnN0ZG91dC5yZWFkbGluZSgpLmRlY29kZSgnYXNjaWknKS5zcGxpdCgpOgorICAgICAgICBzZXRfb2ZfZmVhdHVyZXMuYWRkKGFyY2gubG93ZXIoKSArICctcmVnaXN0ZXJlZC10YXJnZXQnKQogCi0gICAgcmV0dXJuIHsic2V0X29mX3RhcmdldHMiOiAgICBzZXRfb2ZfdGFyZ2V0cywKLSAgICAgICAgICAgICJlbmFibGVfYXNzZXJ0aW9ucyI6IGVuYWJsZV9hc3NlcnRpb25zfQorICAgIHJldHVybiBzZXRfb2ZfZmVhdHVyZXMKIAotbGxjX3Byb3BzID0gZ2V0X2xsY19wcm9wcyhvcy5wYXRoLmpvaW4obGx2bV90b29sc19kaXIsICdsbGMnKSkKLWlmIGxlbihsbGNfcHJvcHNbJ3NldF9vZl90YXJnZXRzJ10pID4gMDoKLSAgICBjb25maWcuYXZhaWxhYmxlX2ZlYXR1cmVzLnVwZGF0ZShsbGNfcHJvcHNbJ3NldF9vZl90YXJnZXRzJ10pCi1lbHNlOgotICAgIGxpdF9jb25maWcuZmF0YWwoJ05vIFRhcmdldHMgUmVnaXN0ZXJlZCB3aXRoIHRoZSBMTFZNIFRvb2xzIScpCi0KLWlmIGxsY19wcm9wc1snZW5hYmxlX2Fzc2VydGlvbnMnXToKLSAgICBjb25maWcuYXZhaWxhYmxlX2ZlYXR1cmVzLmFkZCgnYXNzZXJ0cycpCitjb25maWcuYXZhaWxhYmxlX2ZlYXR1cmVzLnVwZGF0ZShnZXRfbGx2bV9jb25maWdfcHJvcHMoKSkKIAogaWYgbGl0LnV0aWwud2hpY2goJ3htbGxpbnQnKToKICAgICBjb25maWcuYXZhaWxhYmxlX2ZlYXR1cmVzLmFkZCgneG1sbGludCcpCkBAIC0zMzMsNiArNDMyLDggQEAKICMgU2FuaXRpemVycy4KIGlmIGNvbmZpZy5sbHZtX3VzZV9zYW5pdGl6ZXIgPT0gIkFkZHJlc3MiOgogICAgIGNvbmZpZy5hdmFpbGFibGVfZmVhdHVyZXMuYWRkKCJhc2FuIikKK2Vsc2U6CisgICAgY29uZmlnLmF2YWlsYWJsZV9mZWF0dXJlcy5hZGQoIm5vdF9hc2FuIikKIGlmIChjb25maWcubGx2bV91c2Vfc2FuaXRpemVyID09ICJNZW1vcnkiIG9yCiAgICAgICAgIGNvbmZpZy5sbHZtX3VzZV9zYW5pdGl6ZXIgPT0gIk1lbW9yeVdpdGhPcmlnaW5zIik6CiAgICAgY29uZmlnLmF2YWlsYWJsZV9mZWF0dXJlcy5hZGQoIm1zYW4iKQpkaWZmIC0tZ2l0IGEvdGVzdC9saXQuc2l0ZS5jZmcuaW4gYi90ZXN0L2xpdC5zaXRlLmNmZy5pbgppbmRleCA5YTRmYTMzLi4yYTI4YzAwIDEwMDY0NAotLS0gYS90ZXN0L2xpdC5zaXRlLmNmZy5pbgorKysgYi90ZXN0L2xpdC5zaXRlLmNmZy5pbgpAQCAtNiwxOSArNiwyNyBAQAogY29uZmlnLmxsdm1fb2JqX3Jvb3QgPSAiQExMVk1fQklOQVJZX0RJUkAiCiBjb25maWcubGx2bV90b29sc19kaXIgPSAiQExMVk1fVE9PTFNfRElSQCIKIGNvbmZpZy5sbHZtX2xpYnNfZGlyID0gIkBMTFZNX0xJQlNfRElSQCIKK2NvbmZpZy5sbHZtX3NobGliX2RpciA9ICJAU0hMSUJESVJAIgorY29uZmlnLmxsdm1fcGx1Z2luX2V4dCA9ICJATExWTV9QTFVHSU5fRVhUQCIKIGNvbmZpZy5saXRfdG9vbHNfZGlyID0gIkBMTFZNX0xJVF9UT09MU19ESVJAIgogY29uZmlnLmNsYW5nX29ial9yb290ID0gIkBDTEFOR19CSU5BUllfRElSQCIKK2NvbmZpZy5jbGFuZ190b29sc19kaXIgPSAiQENMQU5HX1RPT0xTX0RJUkAiCitjb25maWcuaG9zdF90cmlwbGUgPSAiQExMVk1fSE9TVF9UUklQTEVAIgogY29uZmlnLnRhcmdldF90cmlwbGUgPSAiQFRBUkdFVF9UUklQTEVAIgogY29uZmlnLmxsdm1fdXNlX3Nhbml0aXplciA9ICJATExWTV9VU0VfU0FOSVRJWkVSQCIKIGNvbmZpZy5jbGFuZ19hcmNtdCA9IEBFTkFCTEVfQ0xBTkdfQVJDTVRACiBjb25maWcuY2xhbmdfc3RhdGljYW5hbHl6ZXIgPSBARU5BQkxFX0NMQU5HX1NUQVRJQ19BTkFMWVpFUkAKIGNvbmZpZy5jbGFuZ19yZXdyaXRlciA9IEBFTkFCTEVfQ0xBTkdfUkVXUklURVJACitjb25maWcuY2xhbmdfZXhhbXBsZXMgPSBARU5BQkxFX0NMQU5HX0VYQU1QTEVTQAorY29uZmlnLmVuYWJsZV9zaGFyZWQgPSBARU5BQkxFX1NIQVJFREAKIGNvbmZpZy5ob3N0X2FyY2ggPSAiQEhPU1RfQVJDSEAiCiAKICMgU3VwcG9ydCBzdWJzdGl0dXRpb24gb2YgdGhlIHRvb2xzIGFuZCBsaWJzIGRpcnMgd2l0aCB1c2VyIHBhcmFtZXRlcnMuIFRoaXMgaXMKICMgdXNlZCB3aGVuIHdlIGNhbid0IGRldGVybWluZSB0aGUgdG9vbCBkaXIgYXQgY29uZmlndXJhdGlvbiB0aW1lLgogdHJ5OgorICAgIGNvbmZpZy5jbGFuZ190b29sc19kaXIgPSBjb25maWcuY2xhbmdfdG9vbHNfZGlyICUgbGl0X2NvbmZpZy5wYXJhbXMKICAgICBjb25maWcubGx2bV90b29sc19kaXIgPSBjb25maWcubGx2bV90b29sc19kaXIgJSBsaXRfY29uZmlnLnBhcmFtcworICAgIGNvbmZpZy5sbHZtX3NobGliX2RpciA9IGNvbmZpZy5sbHZtX3NobGliX2RpciAlIGxpdF9jb25maWcucGFyYW1zCiAgICAgY29uZmlnLmxsdm1fbGlic19kaXIgPSBjb25maWcubGx2bV9saWJzX2RpciAlIGxpdF9jb25maWcucGFyYW1zCiBleGNlcHQgS2V5RXJyb3I6CiAgICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCmRpZmYgLS1naXQgYS90b29scy9DTWFrZUxpc3RzLnR4dCBiL3Rvb2xzL0NNYWtlTGlzdHMudHh0CmluZGV4IGZlZjBhZGMuLjU4YmU2MTUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL0NNYWtlTGlzdHMudHh0CisrKyBiL3Rvb2xzL0NNYWtlTGlzdHMudHh0CkBAIC0yLDYgKzIsNyBAQAogYWRkX3N1YmRpcmVjdG9yeShkcml2ZXIpCiBpZihDTEFOR19FTkFCTEVfUkVXUklURVIpCiAgIGFkZF9zdWJkaXJlY3RvcnkoY2xhbmctZm9ybWF0KQorICBhZGRfc3ViZGlyZWN0b3J5KGNsYW5nLWZvcm1hdC12cykKIGVuZGlmKCkKIAogaWYoQ0xBTkdfRU5BQkxFX0FSQ01UKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjbXQtdGVzdC9DTWFrZUxpc3RzLnR4dCBiL3Rvb2xzL2FyY210LXRlc3QvQ01ha2VMaXN0cy50eHQKaW5kZXggM2Q4NWQwNS4uMGNiMmMwZiAxMDA2NDQKLS0tIGEvdG9vbHMvYXJjbXQtdGVzdC9DTWFrZUxpc3RzLnR4dAorKysgYi90b29scy9hcmNtdC10ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0xLDkgKzEsNSBAQAogc2V0KExMVk1fTElOS19DT01QT05FTlRTCi0gICR7TExWTV9UQVJHRVRTX1RPX0JVSUxEfQotICBhc21wYXJzZXIKLSAgYml0cmVhZGVyCiAgIHN1cHBvcnQKLSAgbWMKICAgKQogCiBhZGRfY2xhbmdfZXhlY3V0YWJsZShhcmNtdC10ZXN0CkBAIC0xMiw2ICs4LDcgQEAKIAogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGFyY210LXRlc3QKICAgY2xhbmdBUkNNaWdyYXRlCi0gIGNsYW5nRWRpdAotICBjbGFuZ1Jld3JpdGVDb3JlCisgIGNsYW5nQmFzaWMKKyAgY2xhbmdGcm9udGVuZAorICBjbGFuZ0xleAogICApCmRpZmYgLS1naXQgYS90b29scy9hcmNtdC10ZXN0L2FyY210LXRlc3QuY3BwIGIvdG9vbHMvYXJjbXQtdGVzdC9hcmNtdC10ZXN0LmNwcAppbmRleCA1MDQyNmUzLi4yODMzMWMyIDEwMDY0NAotLS0gYS90b29scy9hcmNtdC10ZXN0L2FyY210LXRlc3QuY3BwCisrKyBiL3Rvb2xzL2FyY210LXRlc3QvYXJjbXQtdGVzdC5jcHAKQEAgLTgzLDE3ICs4MywxNyBAQAogICBQcmludFRyYW5zZm9ybXMocmF3X29zdHJlYW0gJk9TKQogICAgIDogQ3R4KDApLCBPUyhPUykgeyB9CiAKLSAgdmlydHVhbCB2b2lkIHN0YXJ0KEFTVENvbnRleHQgJmN0eCkgeyBDdHggPSAmY3R4OyB9Ci0gIHZpcnR1YWwgdm9pZCBmaW5pc2goKSB7IEN0eCA9IDA7IH0KKyAgdm9pZCBzdGFydChBU1RDb250ZXh0ICZjdHgpIG92ZXJyaWRlIHsgQ3R4ID0gJmN0eDsgfQorICB2b2lkIGZpbmlzaCgpIG92ZXJyaWRlIHsgQ3R4ID0gMDsgfQogCi0gIHZpcnR1YWwgdm9pZCBpbnNlcnQoU291cmNlTG9jYXRpb24gbG9jLCBTdHJpbmdSZWYgdGV4dCkgeworICB2b2lkIGluc2VydChTb3VyY2VMb2NhdGlvbiBsb2MsIFN0cmluZ1JlZiB0ZXh0KSBvdmVycmlkZSB7CiAgICAgYXNzZXJ0KEN0eCk7CiAgICAgT1MgPDwgIkluc2VydDogIjsKICAgICBwcmludFNvdXJjZUxvY2F0aW9uKGxvYywgKkN0eCwgT1MpOwogICAgIE9TIDw8ICIgXCIiIDw8IHRleHQgPDwgIlwiXG4iOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHJlbW92ZShDaGFyU291cmNlUmFuZ2UgcmFuZ2UpIHsKKyAgdm9pZCByZW1vdmUoQ2hhclNvdXJjZVJhbmdlIHJhbmdlKSBvdmVycmlkZSB7CiAgICAgYXNzZXJ0KEN0eCk7CiAgICAgT1MgPDwgIlJlbW92ZTogIjsKICAgICBwcmludFNvdXJjZVJhbmdlKHJhbmdlLCAqQ3R4LCBPUyk7CkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdDSS5nZXRNaWdyYXRvck9wdHMoKS5Ob0ZpbmFsaXplUmVtb3ZhbCk7CiAgIGFzc2VydCghdHJhbnNmb3Jtcy5lbXB0eSgpKTsKIAotICBPd25pbmdQdHI8UHJpbnRUcmFuc2Zvcm1zPiB0cmFuc2Zvcm1QcmludGVyOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJpbnRUcmFuc2Zvcm1zPiB0cmFuc2Zvcm1QcmludGVyOwogICBpZiAoT3V0cHV0VHJhbnNmb3JtYXRpb25zKQogICAgIHRyYW5zZm9ybVByaW50ZXIucmVzZXQobmV3IFByaW50VHJhbnNmb3JtcyhsbHZtOjpvdXRzKCkpKTsKIApAQCAtMjA3LDEyICsyMDcsMTIgQEAKIHN0YXRpYyBib29sIGZpbGVzQ29tcGFyZUVxdWFsKFN0cmluZ1JlZiBmbmFtZTEsIFN0cmluZ1JlZiBmbmFtZTIpIHsKICAgdXNpbmcgbmFtZXNwYWNlIGxsdm07CiAKLSAgT3duaW5nUHRyPE1lbW9yeUJ1ZmZlcj4gZmlsZTE7CisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IGZpbGUxOwogICBNZW1vcnlCdWZmZXI6OmdldEZpbGUoZm5hbWUxLCBmaWxlMSk7CiAgIGlmICghZmlsZTEpCiAgICAgcmV0dXJuIGZhbHNlOwotICAKLSAgT3duaW5nUHRyPE1lbW9yeUJ1ZmZlcj4gZmlsZTI7CisKKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gZmlsZTI7CiAgIE1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZShmbmFtZTIsIGZpbGUyKTsKICAgaWYgKCFmaWxlMikKICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMzgsNyArMjM4LDcgQEAKICAgICByZXN1bHRNYXBbc3lzOjpwYXRoOjpzdGVtKGZuYW1lKV0gPSBmbmFtZTsKICAgfQogCi0gIE93bmluZ1B0cjxNZW1vcnlCdWZmZXI+IGlucHV0QnVmOworICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBpbnB1dEJ1ZjsKICAgaWYgKFJlbWFwcGluZ3NGaWxlLmVtcHR5KCkpCiAgICAgTWVtb3J5QnVmZmVyOjpnZXRTVERJTihpbnB1dEJ1Zik7CiAgIGVsc2UKZGlmZiAtLWdpdCBhL3Rvb2xzL2MtYXJjbXQtdGVzdC9DTWFrZUxpc3RzLnR4dCBiL3Rvb2xzL2MtYXJjbXQtdGVzdC9DTWFrZUxpc3RzLnR4dAppbmRleCAxZTcyMjYxLi45MDE0Y2NjIDEwMDY0NAotLS0gYS90b29scy9jLWFyY210LXRlc3QvQ01ha2VMaXN0cy50eHQKKysrIGIvdG9vbHMvYy1hcmNtdC10ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0xLDggKzEsMyBAQAotc2V0KCBMTFZNX0xJTktfQ09NUE9ORU5UUwotICBzdXBwb3J0Ci0gIG1jCi0gICkKLQogYWRkX2NsYW5nX2V4ZWN1dGFibGUoYy1hcmNtdC10ZXN0CiAgIGMtYXJjbXQtdGVzdC5jCiAgICkKZGlmZiAtLWdpdCBhL3Rvb2xzL2MtYXJjbXQtdGVzdC9NYWtlZmlsZSBiL3Rvb2xzL2MtYXJjbXQtdGVzdC9NYWtlZmlsZQppbmRleCA0YTAxYzcyLi42YWM1ZTIwIDEwMDY0NAotLS0gYS90b29scy9jLWFyY210LXRlc3QvTWFrZWZpbGUKKysrIGIvdG9vbHMvYy1hcmNtdC10ZXN0L01ha2VmaWxlCkBAIC0zMCw2ICszMCw3IEBACiAJICAgY2xhbmdSZXdyaXRlRnJvbnRlbmQuYSBcCiAJICAgY2xhbmdSZXdyaXRlQ29yZS5hIFwKIAkgICBjbGFuZ0luZGV4LmEgY2xhbmdGcm9udGVuZC5hIGNsYW5nRHJpdmVyLmEgXAorCSAgIGNsYW5nU3RhdGljQW5hbHl6ZXJDaGVja2Vycy5hIGNsYW5nU3RhdGljQW5hbHl6ZXJDb3JlLmEgXAogCSAgIGNsYW5nU2VyaWFsaXphdGlvbi5hIGNsYW5nUGFyc2UuYSBjbGFuZ1NlbWEuYSBcCiAJICAgY2xhbmdBbmFseXNpcy5hIGNsYW5nRWRpdC5hIGNsYW5nQVNULmEgY2xhbmdMZXguYSBjbGFuZ0Jhc2ljLmEKIApkaWZmIC0tZ2l0IGEvdG9vbHMvYy1pbmRleC10ZXN0L0NNYWtlTGlzdHMudHh0IGIvdG9vbHMvYy1pbmRleC10ZXN0L0NNYWtlTGlzdHMudHh0CmluZGV4IGQ4NTA0MTEuLjExMzE3MmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2MtaW5kZXgtdGVzdC9DTWFrZUxpc3RzLnR4dAorKysgYi90b29scy9jLWluZGV4LXRlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTEsOCArMSwzIEBACi1zZXQoIExMVk1fTElOS19DT01QT05FTlRTCi0gIHN1cHBvcnQKLSAgbWMKLSAgKQotCiBhZGRfY2xhbmdfZXhlY3V0YWJsZShjLWluZGV4LXRlc3QKICAgYy1pbmRleC10ZXN0LmMKICAgKQpAQCAtMTAsNyArNSw3IEBACiBpZihOT1QgTVNWQykKICAgc2V0X3Byb3BlcnR5KAogICAgIFNPVVJDRSBjLWluZGV4LXRlc3QuYwotICAgIFBST1BFUlRZIENPTVBJTEVfRkxBR1MgIi1zdGQ9Yzg5IgorICAgIFBST1BFUlRZIENPTVBJTEVfRkxBR1MgIi1zdGQ9Z251ODkiCiAgICAgKQogZW5kaWYoKQogCmRpZmYgLS1naXQgYS90b29scy9jLWluZGV4LXRlc3QvYy1pbmRleC10ZXN0LmMgYi90b29scy9jLWluZGV4LXRlc3QvYy1pbmRleC10ZXN0LmMKaW5kZXggOTBhNjUyOC4uZjZiNTUxMCAxMDA2NDQKLS0tIGEvdG9vbHMvYy1pbmRleC10ZXN0L2MtaW5kZXgtdGVzdC5jCisrKyBiL3Rvb2xzL2MtaW5kZXgtdGVzdC9jLWluZGV4LXRlc3QuYwpAQCAtMiw2ICsyLDcgQEAKIAogI2luY2x1ZGUgImNsYW5nLWMvSW5kZXguaCIKICNpbmNsdWRlICJjbGFuZy1jL0NYQ29tcGlsYXRpb25EYXRhYmFzZS5oIgorI2luY2x1ZGUgImNsYW5nLWMvQnVpbGRTeXN0ZW0uaCIKICNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtNzgsOCArNzksMzMgQEAKICAgcmV0dXJuIG9wdGlvbnM7CiB9CiAKKy8qKiBcYnJpZWYgUmV0dXJucyAwIGluIGNhc2Ugb2Ygc3VjY2Vzcywgbm9uLXplcm8gaW4gY2FzZSBvZiBhIGZhaWx1cmUuICovCiBzdGF0aWMgaW50IGNoZWNrRm9yRXJyb3JzKENYVHJhbnNsYXRpb25Vbml0IFRVKTsKIAorc3RhdGljIHZvaWQgZGVzY3JpYmVMaWJjbGFuZ0ZhaWx1cmUoZW51bSBDWEVycm9yQ29kZSBFcnIpIHsKKyAgc3dpdGNoIChFcnIpIHsKKyAgY2FzZSBDWEVycm9yX1N1Y2Nlc3M6CisgICAgZnByaW50ZihzdGRlcnIsICJTdWNjZXNzXG4iKTsKKyAgICByZXR1cm47CisKKyAgY2FzZSBDWEVycm9yX0ZhaWx1cmU6CisgICAgZnByaW50ZihzdGRlcnIsICJGYWlsdXJlIChubyBkZXRhaWxzIGF2YWlsYWJsZSlcbiIpOworICAgIHJldHVybjsKKworICBjYXNlIENYRXJyb3JfQ3Jhc2hlZDoKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWx1cmU6IGxpYmNsYW5nIGNyYXNoZWRcbiIpOworICAgIHJldHVybjsKKworICBjYXNlIENYRXJyb3JfSW52YWxpZEFyZ3VtZW50czoKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWx1cmU6IGludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBhIGxpYmNsYW5nIHJvdXRpbmVcbiIpOworICAgIHJldHVybjsKKworICBjYXNlIENYRXJyb3JfQVNUUmVhZEVycm9yOgorICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbHVyZTogQVNUIGRlc2VyaWFsaXphdGlvbiBlcnJvciBvY2N1cnJlZFxuIik7CisgICAgcmV0dXJuOworICB9Cit9CisKIHN0YXRpYyB2b2lkIFByaW50RXh0ZW50KEZJTEUgKm91dCwgdW5zaWduZWQgYmVnaW5fbGluZSwgdW5zaWduZWQgYmVnaW5fY29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZW5kX2xpbmUsIHVuc2lnbmVkIGVuZF9jb2x1bW4pIHsKICAgZnByaW50ZihvdXQsICJbJWQ6JWQgLSAlZDolZF0iLCBiZWdpbl9saW5lLCBiZWdpbl9jb2x1bW4sCkBAIC04OCwxMCArMTE0LDExIEBACiAKIHN0YXRpYyB1bnNpZ25lZCBDcmVhdGVUcmFuc2xhdGlvblVuaXQoQ1hJbmRleCBJZHgsIGNvbnN0IGNoYXIgKmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYVHJhbnNsYXRpb25Vbml0ICpUVSkgewotCi0gICpUVSA9IGNsYW5nX2NyZWF0ZVRyYW5zbGF0aW9uVW5pdChJZHgsIGZpbGUpOwotICBpZiAoISpUVSkgeworICBlbnVtIENYRXJyb3JDb2RlIEVyciA9IGNsYW5nX2NyZWF0ZVRyYW5zbGF0aW9uVW5pdDIoSWR4LCBmaWxlLCBUVSk7CisgIGlmIChFcnIgIT0gQ1hFcnJvcl9TdWNjZXNzKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbG9hZCB0cmFuc2xhdGlvbiB1bml0IGZyb20gJyVzJyFcbiIsIGZpbGUpOworICAgIGRlc2NyaWJlTGliY2xhbmdGYWlsdXJlKEVycik7CisgICAgKlRVID0gMDsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gMTsKQEAgLTEwNywyMCArMTM0LDI1IEBACiAgIGZyZWUodW5zYXZlZF9maWxlcyk7CiB9CiAKLWludCBwYXJzZV9yZW1hcHBlZF9maWxlcyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGludCBzdGFydF9hcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENYVW5zYXZlZEZpbGUgKip1bnNhdmVkX2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbnVtX3Vuc2F2ZWRfZmlsZXMpIHsKK3N0YXRpYyBpbnQgcGFyc2VfcmVtYXBwZWRfZmlsZXNfd2l0aF9vcHQoY29uc3QgY2hhciAqb3B0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENYVW5zYXZlZEZpbGUgKip1bnNhdmVkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm51bV91bnNhdmVkX2ZpbGVzKSB7CiAgIGludCBpOwogICBpbnQgYXJnOwotICBpbnQgcHJlZml4X2xlbiA9IHN0cmxlbigiLXJlbWFwLWZpbGU9Iik7CisgIGludCBwcmVmaXhfbGVuID0gc3RybGVuKG9wdF9uYW1lKTsKKyAgaW50IGFyZ19pbmRpY2VzWzIwXTsKICAgKnVuc2F2ZWRfZmlsZXMgPSAwOwogICAqbnVtX3Vuc2F2ZWRfZmlsZXMgPSAwOwogCiAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVtYXBwZWQgZmlsZXMuICovCiAgIGZvciAoYXJnID0gc3RhcnRfYXJnOyBhcmcgPCBhcmdjOyArK2FyZykgewotICAgIGlmIChzdHJuY21wKGFyZ3ZbYXJnXSwgIi1yZW1hcC1maWxlPSIsIHByZWZpeF9sZW4pKQotICAgICAgYnJlYWs7CisgICAgaWYgKHN0cm5jbXAoYXJndlthcmddLCBvcHRfbmFtZSwgcHJlZml4X2xlbikpCisgICAgICBjb250aW51ZTsKIAorICAgIGFzc2VydCgqbnVtX3Vuc2F2ZWRfZmlsZXMgPCAoaW50KShzaXplb2YoYXJnX2luZGljZXMpL3NpemVvZihpbnQpKSk7CisgICAgYXJnX2luZGljZXNbKm51bV91bnNhdmVkX2ZpbGVzXSA9IGFyZzsKICAgICArKypudW1fdW5zYXZlZF9maWxlczsKICAgfQogCkBAIC0xMzAsMTcgKzE2MiwxNyBAQAogICAqdW5zYXZlZF9maWxlcwogICAgID0gKHN0cnVjdCBDWFVuc2F2ZWRGaWxlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ1hVbnNhdmVkRmlsZSkgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpudW1fdW5zYXZlZF9maWxlcyk7Ci0gIGZvciAoYXJnID0gc3RhcnRfYXJnLCBpID0gMDsgaSAhPSAqbnVtX3Vuc2F2ZWRfZmlsZXM7ICsraSwgKythcmcpIHsKKyAgZm9yIChpID0gMDsgaSAhPSAqbnVtX3Vuc2F2ZWRfZmlsZXM7ICsraSkgewogICAgIHN0cnVjdCBDWFVuc2F2ZWRGaWxlICp1bnNhdmVkID0gKnVuc2F2ZWRfZmlsZXMgKyBpOwotICAgIGNvbnN0IGNoYXIgKmFyZ19zdHJpbmcgPSBhcmd2W2FyZ10gKyBwcmVmaXhfbGVuOworICAgIGNvbnN0IGNoYXIgKmFyZ19zdHJpbmcgPSBhcmd2W2FyZ19pbmRpY2VzW2ldXSArIHByZWZpeF9sZW47CiAgICAgaW50IGZpbGVuYW1lX2xlbjsKICAgICBjaGFyICpmaWxlbmFtZTsKICAgICBjaGFyICpjb250ZW50czsKICAgICBGSUxFICp0b19maWxlOwotICAgIGNvbnN0IGNoYXIgKnNlbWkgPSBzdHJjaHIoYXJnX3N0cmluZywgJzsnKTsKLSAgICBpZiAoIXNlbWkpIHsKKyAgICBjb25zdCBjaGFyICpzZXAgPSBzdHJjaHIoYXJnX3N0cmluZywgJywnKTsKKyAgICBpZiAoIXNlcCkgewogICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICJlcnJvcjogLXJlbWFwLWZpbGU9ZnJvbTt0byBhcmd1bWVudCBpcyBtaXNzaW5nIHNlbWljb2xvblxuIik7CisgICAgICAgICAgICAgICJlcnJvcjogJXNmcm9tOnRvIGFyZ3VtZW50IGlzIG1pc3NpbmcgY29tbWFcbiIsIG9wdF9uYW1lKTsKICAgICAgIGZyZWVfcmVtYXBwZWRfZmlsZXMoKnVuc2F2ZWRfZmlsZXMsIGkpOwogICAgICAgKnVuc2F2ZWRfZmlsZXMgPSAwOwogICAgICAgKm51bV91bnNhdmVkX2ZpbGVzID0gMDsKQEAgLTE0OCwxMCArMTgwLDEwIEBACiAgICAgfQogCiAgICAgLyogT3BlbiB0aGUgZmlsZSB0aGF0IHdlJ3JlIHJlbWFwcGluZyB0by4gKi8KLSAgICB0b19maWxlID0gZm9wZW4oc2VtaSArIDEsICJyYiIpOworICAgIHRvX2ZpbGUgPSBmb3BlbihzZXAgKyAxLCAicmIiKTsKICAgICBpZiAoIXRvX2ZpbGUpIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNhbm5vdCBvcGVuIGZpbGUgJXMgdGhhdCB3ZSBhcmUgcmVtYXBwaW5nIHRvXG4iLAotICAgICAgICAgICAgICBzZW1pICsgMSk7CisgICAgICAgICAgICAgIHNlcCArIDEpOwogICAgICAgZnJlZV9yZW1hcHBlZF9maWxlcygqdW5zYXZlZF9maWxlcywgaSk7CiAgICAgICAqdW5zYXZlZF9maWxlcyA9IDA7CiAgICAgICAqbnVtX3Vuc2F2ZWRfZmlsZXMgPSAwOwpAQCAtMTY3LDcgKzE5OSw3IEBACiAgICAgY29udGVudHMgPSAoY2hhciAqKW1hbGxvYyh1bnNhdmVkLT5MZW5ndGggKyAxKTsKICAgICBpZiAoZnJlYWQoY29udGVudHMsIDEsIHVuc2F2ZWQtPkxlbmd0aCwgdG9fZmlsZSkgIT0gdW5zYXZlZC0+TGVuZ3RoKSB7CiAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiB1bmV4cGVjdGVkICVzIHJlYWRpbmcgJ3RvJyBmaWxlICVzXG4iLAotICAgICAgICAgICAgICAoZmVvZih0b19maWxlKSA/ICJFT0YiIDogImVycm9yIiksIHNlbWkgKyAxKTsKKyAgICAgICAgICAgICAgKGZlb2YodG9fZmlsZSkgPyAiRU9GIiA6ICJlcnJvciIpLCBzZXAgKyAxKTsKICAgICAgIGZjbG9zZSh0b19maWxlKTsKICAgICAgIGZyZWVfcmVtYXBwZWRfZmlsZXMoKnVuc2F2ZWRfZmlsZXMsIGkpOwogICAgICAgZnJlZShjb250ZW50cyk7CkBAIC0xODIsNyArMjE0LDcgQEAKICAgICBmY2xvc2UodG9fZmlsZSk7CiAKICAgICAvKiBDb3B5IHRoZSBmaWxlIG5hbWUgdGhhdCB3ZSdyZSByZW1hcHBpbmcgZnJvbS4gKi8KLSAgICBmaWxlbmFtZV9sZW4gPSBzZW1pIC0gYXJnX3N0cmluZzsKKyAgICBmaWxlbmFtZV9sZW4gPSBzZXAgLSBhcmdfc3RyaW5nOwogICAgIGZpbGVuYW1lID0gKGNoYXIgKiltYWxsb2MoZmlsZW5hbWVfbGVuICsgMSk7CiAgICAgbWVtY3B5KGZpbGVuYW1lLCBhcmdfc3RyaW5nLCBmaWxlbmFtZV9sZW4pOwogICAgIGZpbGVuYW1lW2ZpbGVuYW1lX2xlbl0gPSAwOwpAQCAtMTkyLDYgKzIyNCw0OCBAQAogICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwYXJzZV9yZW1hcHBlZF9maWxlcyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGludCBzdGFydF9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDWFVuc2F2ZWRGaWxlICoqdW5zYXZlZF9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1fdW5zYXZlZF9maWxlcykgeworICByZXR1cm4gcGFyc2VfcmVtYXBwZWRfZmlsZXNfd2l0aF9vcHQoIi1yZW1hcC1maWxlPSIsIGFyZ2MsIGFyZ3YsIHN0YXJ0X2FyZywKKyAgICAgIHVuc2F2ZWRfZmlsZXMsIG51bV91bnNhdmVkX2ZpbGVzKTsKK30KKworc3RhdGljIGludCBwYXJzZV9yZW1hcHBlZF9maWxlc193aXRoX3RyeShpbnQgdHJ5X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ1hVbnNhdmVkRmlsZSAqKnVuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbnVtX3Vuc2F2ZWRfZmlsZXMpIHsKKyAgc3RydWN0IENYVW5zYXZlZEZpbGUgKnVuc2F2ZWRfZmlsZXNfbm9fdHJ5X2lkeDsKKyAgaW50IG51bV91bnNhdmVkX2ZpbGVzX25vX3RyeV9pZHg7CisgIHN0cnVjdCBDWFVuc2F2ZWRGaWxlICp1bnNhdmVkX2ZpbGVzX3RyeV9pZHg7CisgIGludCBudW1fdW5zYXZlZF9maWxlc190cnlfaWR4OworICBpbnQgcmV0OworICBjaGFyIG9wdF9uYW1lWzMyXTsKKworICByZXQgPSBwYXJzZV9yZW1hcHBlZF9maWxlcyhhcmdjLCBhcmd2LCBzdGFydF9hcmcsCisgICAgICAmdW5zYXZlZF9maWxlc19ub190cnlfaWR4LCAmbnVtX3Vuc2F2ZWRfZmlsZXNfbm9fdHJ5X2lkeCk7CisgIGlmIChyZXQpCisgICAgcmV0dXJuIHJldDsKKworICBzcHJpbnRmKG9wdF9uYW1lLCAiLXJlbWFwLWZpbGUtJWQ9IiwgdHJ5X2lkeCk7CisgIHJldCA9IHBhcnNlX3JlbWFwcGVkX2ZpbGVzX3dpdGhfb3B0KG9wdF9uYW1lLCBhcmdjLCBhcmd2LCBzdGFydF9hcmcsCisgICAgICAmdW5zYXZlZF9maWxlc190cnlfaWR4LCAmbnVtX3Vuc2F2ZWRfZmlsZXNfdHJ5X2lkeCk7CisgIGlmIChyZXQpCisgICAgcmV0dXJuIHJldDsKKworICAqbnVtX3Vuc2F2ZWRfZmlsZXMgPSBudW1fdW5zYXZlZF9maWxlc19ub190cnlfaWR4ICsgbnVtX3Vuc2F2ZWRfZmlsZXNfdHJ5X2lkeDsKKyAgKnVuc2F2ZWRfZmlsZXMKKyAgICA9IChzdHJ1Y3QgQ1hVbnNhdmVkRmlsZSAqKXJlYWxsb2ModW5zYXZlZF9maWxlc19ub190cnlfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IENYVW5zYXZlZEZpbGUpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbnVtX3Vuc2F2ZWRfZmlsZXMpOworICBtZW1jcHkoKnVuc2F2ZWRfZmlsZXMgKyBudW1fdW5zYXZlZF9maWxlc19ub190cnlfaWR4LAorICAgICAgICAgdW5zYXZlZF9maWxlc190cnlfaWR4LCBzaXplb2Yoc3RydWN0IENYVW5zYXZlZEZpbGUpICoKKyAgICAgICAgICAgIG51bV91bnNhdmVkX2ZpbGVzX3RyeV9pZHgpOworICBmcmVlKHVuc2F2ZWRfZmlsZXNfdHJ5X2lkeCk7CisgIHJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqcGFyc2VfY29tbWVudHNfc2NoZW1hKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgewogICBjb25zdCBjaGFyICpDb21tZW50c1NjaGVtYUFyZyA9ICItY29tbWVudHMteG1sLXNjaGVtYT0iOwogICBjb25zdCBjaGFyICpDb21tZW50U2NoZW1hRmlsZSA9IE5VTEw7CkBAIC0xMTg5LDExICsxMjYzLDExIEBACiAgICAgfQogICAgIC8qIFByaW50IHRoZSBhcmd1bWVudCB0eXBlcyBpZiB0aGV5IGV4aXN0LiAqLwogICAgIHsKLSAgICAgIGludCBudW1BcmdzID0gY2xhbmdfQ3Vyc29yX2dldE51bUFyZ3VtZW50cyhjdXJzb3IpOwotICAgICAgaWYgKG51bUFyZ3MgIT0gLTEgJiYgbnVtQXJncyAhPSAwKSB7CisgICAgICBpbnQgTnVtQXJncyA9IGNsYW5nX0N1cnNvcl9nZXROdW1Bcmd1bWVudHMoY3Vyc29yKTsKKyAgICAgIGlmIChOdW1BcmdzICE9IC0xICYmIE51bUFyZ3MgIT0gMCkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgcHJpbnRmKCIgW2FyZ3M9Iik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1BcmdzOyArK2kpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bUFyZ3M7ICsraSkgewogICAgICAgICAgIENYVHlwZSBUID0gY2xhbmdfZ2V0Q3Vyc29yVHlwZShjbGFuZ19DdXJzb3JfZ2V0QXJndW1lbnQoY3Vyc29yLCBpKSk7CiAgICAgICAgICAgaWYgKFQua2luZCAhPSBDWFR5cGVfSW52YWxpZCkgewogICAgICAgICAgICAgUHJpbnRUeXBlQW5kVHlwZUtpbmQoVCwgIiBbJXNdIFslc10iKTsKQEAgLTEyMDIsNiArMTI3NiwyMSBAQAogICAgICAgICBwcmludGYoIl0iKTsKICAgICAgIH0KICAgICB9CisgICAgLyogUHJpbnQgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IHR5cGVzIGlmIHRoZXkgZXhpc3QuICovCisgICAgeworICAgICAgaW50IE51bVRBcmdzID0gY2xhbmdfVHlwZV9nZXROdW1UZW1wbGF0ZUFyZ3VtZW50cyhUKTsKKyAgICAgIGlmIChOdW1UQXJncyAhPSAtMSAmJiBOdW1UQXJncyAhPSAwKSB7CisgICAgICAgIGludCBpOworICAgICAgICBwcmludGYoIiBbdGVtcGxhdGVhcmdzLyVkPSIsIE51bVRBcmdzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bVRBcmdzOyArK2kpIHsKKyAgICAgICAgICBDWFR5cGUgVEFyZyA9IGNsYW5nX1R5cGVfZ2V0VGVtcGxhdGVBcmd1bWVudEFzVHlwZShULCBpKTsKKyAgICAgICAgICBpZiAoVEFyZy5raW5kICE9IENYVHlwZV9JbnZhbGlkKSB7CisgICAgICAgICAgICBQcmludFR5cGVBbmRUeXBlS2luZChUQXJnLCAiIFt0eXBlPSVzXSBbdHlwZWtpbmQ9JXNdIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZigiXSIpOworICAgICAgfQorICAgIH0KICAgICAvKiBQcmludCBpZiB0aGlzIGlzIGEgbm9uLVBPRCB0eXBlLiAqLwogICAgIHByaW50ZigiIFtpc1BPRD0lZF0iLCBjbGFuZ19pc1BPRFR5cGUoVCkpOwogCkBAIC0xMjQwLDcgKzEzMjksNyBAQAogICAgIENYQ3Vyc29yIFBhcmVudCwgUm9vdDsKICAgICBpZiAoY2xhbmdfZ2V0Q3Vyc29yS2luZChjdXJzb3IpID09IENYQ3Vyc29yX0ZpZWxkRGVjbCApIHsKICAgICAgIGNvbnN0IGNoYXIgKlJvb3RQYXJlbnROYW1lOwotICAgICAgUm9vdCA9IFBhcmVudCA9IHA7CisgICAgICBQYXJlbnQgPSBwOwogICAgICAgZG8gewogICAgICAgICBSb290ID0gUGFyZW50OwogICAgICAgICBSb290UGFyZW50TmFtZSA9IGNsYW5nX2dldENTdHJpbmcoY2xhbmdfZ2V0Q3Vyc29yU3BlbGxpbmcoUm9vdCkpOwpAQCAtMTM3Miw4ICsxNDYxLDkgQEAKICAgY29uc3QgY2hhciAqQ29tbWVudFNjaGVtYUZpbGU7CiAgIHN0cnVjdCBDWFVuc2F2ZWRGaWxlICp1bnNhdmVkX2ZpbGVzID0gMDsKICAgaW50IG51bV91bnNhdmVkX2ZpbGVzID0gMDsKKyAgZW51bSBDWEVycm9yQ29kZSBFcnI7CiAgIGludCByZXN1bHQ7Ci0gIAorCiAgIElkeCA9IGNsYW5nX2NyZWF0ZUluZGV4KC8qIGV4Y2x1ZGVEZWNsc0Zyb21QQ0ggKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzdHJjbXAoZmlsdGVyLCAibG9jYWwiKSB8fCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoZmlsdGVyLCAibG9jYWwtZGlzcGxheSIpKT8gMSA6IDAsCkBAIC0xMzg5LDEzICsxNDc5LDE0IEBACiAgICAgcmV0dXJuIC0xOwogICB9CiAKLSAgVFUgPSBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdChJZHgsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndiArIG51bV91bnNhdmVkX2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2MgLSBudW1fdW5zYXZlZF9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNhdmVkX2ZpbGVzLCBudW1fdW5zYXZlZF9maWxlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdFBhcnNpbmdPcHRpb25zKCkpOwotICBpZiAoIVRVKSB7CisgIEVyciA9IGNsYW5nX3BhcnNlVHJhbnNsYXRpb25Vbml0MihJZHgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2ICsgbnVtX3Vuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdjIC0gbnVtX3Vuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNhdmVkX2ZpbGVzLCBudW1fdW5zYXZlZF9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlZmF1bHRQYXJzaW5nT3B0aW9ucygpLCAmVFUpOworICBpZiAoRXJyICE9IENYRXJyb3JfU3VjY2VzcykgewogICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGxvYWQgdHJhbnNsYXRpb24gdW5pdCFcbiIpOworICAgIGRlc2NyaWJlTGliY2xhbmdGYWlsdXJlKEVycik7CiAgICAgZnJlZV9yZW1hcHBlZF9maWxlcyh1bnNhdmVkX2ZpbGVzLCBudW1fdW5zYXZlZF9maWxlcyk7CiAgICAgY2xhbmdfZGlzcG9zZUluZGV4KElkeCk7CiAgICAgcmV0dXJuIDE7CkBAIC0xNDE1LDcgKzE1MDYsOSBAQAogICBDWFRyYW5zbGF0aW9uVW5pdCBUVTsKICAgc3RydWN0IENYVW5zYXZlZEZpbGUgKnVuc2F2ZWRfZmlsZXMgPSAwOwogICBpbnQgbnVtX3Vuc2F2ZWRfZmlsZXMgPSAwOwotICBpbnQgcmVzdWx0OworICBpbnQgY29tcGlsZXJfYXJnX2lkeCA9IDA7CisgIGVudW0gQ1hFcnJvckNvZGUgRXJyOworICBpbnQgcmVzdWx0LCBpOwogICBpbnQgdHJpYWw7CiAgIGludCByZW1hcF9hZnRlcl90cmlhbCA9IDA7CiAgIGNoYXIgKmVuZHB0ciA9IDA7CkBAIC0xNDI4LDE1ICsxNTIxLDI1IEBACiAgICAgY2xhbmdfZGlzcG9zZUluZGV4KElkeCk7CiAgICAgcmV0dXJuIC0xOwogICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGFyZ2M7ICsraSkgeworICAgIGlmIChzdHJjbXAoYXJndltpXSwgIi0tIikgPT0gMCkKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChpIDwgYXJnYykKKyAgICBjb21waWxlcl9hcmdfaWR4ID0gaSsxOworICBpZiAobnVtX3Vuc2F2ZWRfZmlsZXMgPiBjb21waWxlcl9hcmdfaWR4KQorICAgIGNvbXBpbGVyX2FyZ19pZHggPSBudW1fdW5zYXZlZF9maWxlczsKICAgCiAgIC8qIExvYWQgdGhlIGluaXRpYWwgdHJhbnNsYXRpb24gdW5pdCAtLSB3ZSBkbyB0aGlzIHdpdGhvdXQgaG9ub3JpbmcgcmVtYXBwZWQKICAgICogZmlsZXMsIHNvIHRoYXQgd2UgaGF2ZSBhIHdheSB0byB0ZXN0IHJlc3VsdHMgYWZ0ZXIgY2hhbmdpbmcgdGhlIHNvdXJjZS4gKi8KLSAgVFUgPSBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdChJZHgsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndiArIG51bV91bnNhdmVkX2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2MgLSBudW1fdW5zYXZlZF9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBnZXREZWZhdWx0UGFyc2luZ09wdGlvbnMoKSk7Ci0gIGlmICghVFUpIHsKKyAgRXJyID0gY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQyKElkeCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3YgKyBjb21waWxlcl9hcmdfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYyAtIGNvbXBpbGVyX2FyZ19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBnZXREZWZhdWx0UGFyc2luZ09wdGlvbnMoKSwgJlRVKTsKKyAgaWYgKEVyciAhPSBDWEVycm9yX1N1Y2Nlc3MpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBsb2FkIHRyYW5zbGF0aW9uIHVuaXQhXG4iKTsKKyAgICBkZXNjcmliZUxpYmNsYW5nRmFpbHVyZShFcnIpOwogICAgIGZyZWVfcmVtYXBwZWRfZmlsZXModW5zYXZlZF9maWxlcywgbnVtX3Vuc2F2ZWRfZmlsZXMpOwogICAgIGNsYW5nX2Rpc3Bvc2VJbmRleChJZHgpOwogICAgIHJldHVybiAxOwpAQCAtMTQ1MSwxMSArMTU1NCwyMiBAQAogICB9CiAKICAgZm9yICh0cmlhbCA9IDA7IHRyaWFsIDwgdHJpYWxzOyArK3RyaWFsKSB7Ci0gICAgaWYgKGNsYW5nX3JlcGFyc2VUcmFuc2xhdGlvblVuaXQoVFUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFsID49IHJlbWFwX2FmdGVyX3RyaWFsID8gbnVtX3Vuc2F2ZWRfZmlsZXMgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbCA+PSByZW1hcF9hZnRlcl90cmlhbCA/IHVuc2F2ZWRfZmlsZXMgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nX2RlZmF1bHRSZXBhcnNlT3B0aW9ucyhUVSkpKSB7CisgICAgZnJlZV9yZW1hcHBlZF9maWxlcyh1bnNhdmVkX2ZpbGVzLCBudW1fdW5zYXZlZF9maWxlcyk7CisgICAgaWYgKHBhcnNlX3JlbWFwcGVkX2ZpbGVzX3dpdGhfdHJ5KHRyaWFsLCBhcmdjLCBhcmd2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5zYXZlZF9maWxlcywgJm51bV91bnNhdmVkX2ZpbGVzKSkgeworICAgICAgY2xhbmdfZGlzcG9zZVRyYW5zbGF0aW9uVW5pdChUVSk7CisgICAgICBjbGFuZ19kaXNwb3NlSW5kZXgoSWR4KTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBFcnIgPSBjbGFuZ19yZXBhcnNlVHJhbnNsYXRpb25Vbml0KAorICAgICAgICBUVSwKKyAgICAgICAgdHJpYWwgPj0gcmVtYXBfYWZ0ZXJfdHJpYWwgPyBudW1fdW5zYXZlZF9maWxlcyA6IDAsCisgICAgICAgIHRyaWFsID49IHJlbWFwX2FmdGVyX3RyaWFsID8gdW5zYXZlZF9maWxlcyA6IDAsCisgICAgICAgIGNsYW5nX2RlZmF1bHRSZXBhcnNlT3B0aW9ucyhUVSkpOworICAgIGlmIChFcnIgIT0gQ1hFcnJvcl9TdWNjZXNzKSB7CiAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byByZXBhcnNlIHRyYW5zbGF0aW9uIHVuaXQhXG4iKTsKKyAgICAgIGRlc2NyaWJlTGliY2xhbmdGYWlsdXJlKEVycik7CiAgICAgICBjbGFuZ19kaXNwb3NlVHJhbnNsYXRpb25Vbml0KFRVKTsKICAgICAgIGZyZWVfcmVtYXBwZWRfZmlsZXModW5zYXZlZF9maWxlcywgbnVtX3Vuc2F2ZWRfZmlsZXMpOwogICAgICAgY2xhbmdfZGlzcG9zZUluZGV4KElkeCk7CkBAIC0xODc3LDcgKzE5OTEsOCBAQAogICBzdHJ1Y3QgQ1hVbnNhdmVkRmlsZSAqdW5zYXZlZF9maWxlcyA9IDA7CiAgIGludCBudW1fdW5zYXZlZF9maWxlcyA9IDA7CiAgIENYQ29kZUNvbXBsZXRlUmVzdWx0cyAqcmVzdWx0cyA9IDA7Ci0gIENYVHJhbnNsYXRpb25Vbml0IFRVID0gMDsKKyAgZW51bSBDWEVycm9yQ29kZSBFcnI7CisgIENYVHJhbnNsYXRpb25Vbml0IFRVOwogICB1bnNpZ25lZCBJLCBSZXBlYXRzID0gMTsKICAgdW5zaWduZWQgY29tcGxldGlvbk9wdGlvbnMgPSBjbGFuZ19kZWZhdWx0Q29kZUNvbXBsZXRlT3B0aW9ucygpOwogICAKQEAgLTE5MDIsMjEgKzIwMTcsMjcgQEAKICAgCiAgIGlmIChnZXRlbnYoIkNJTkRFWFRFU1RfRURJVElORyIpKQogICAgIFJlcGVhdHMgPSA1OwotICAKLSAgVFUgPSBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdChDSWR4LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3YgKyBudW1fdW5zYXZlZF9maWxlcyArIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYyAtIG51bV91bnNhdmVkX2ZpbGVzIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBnZXREZWZhdWx0UGFyc2luZ09wdGlvbnMoKSk7Ci0gIGlmICghVFUpIHsKKworICBFcnIgPSBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdDIoQ0lkeCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3YgKyBudW1fdW5zYXZlZF9maWxlcyArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdjIC0gbnVtX3Vuc2F2ZWRfZmlsZXMgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgZ2V0RGVmYXVsdFBhcnNpbmdPcHRpb25zKCksICZUVSk7CisgIGlmIChFcnIgIT0gQ1hFcnJvcl9TdWNjZXNzKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbG9hZCB0cmFuc2xhdGlvbiB1bml0IVxuIik7CisgICAgZGVzY3JpYmVMaWJjbGFuZ0ZhaWx1cmUoRXJyKTsKICAgICByZXR1cm4gMTsKICAgfQogCi0gIGlmIChjbGFuZ19yZXBhcnNlVHJhbnNsYXRpb25Vbml0KFRVLCAwLCAwLCBjbGFuZ19kZWZhdWx0UmVwYXJzZU9wdGlvbnMoVFUpKSkgeworICBFcnIgPSBjbGFuZ19yZXBhcnNlVHJhbnNsYXRpb25Vbml0KFRVLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nX2RlZmF1bHRSZXBhcnNlT3B0aW9ucyhUVSkpOworCisgIGlmIChFcnIgIT0gQ1hFcnJvcl9TdWNjZXNzKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcmVwYXJzZSB0cmFuc2xhdGlvbiBpbml0IVxuIik7CisgICAgZGVzY3JpYmVMaWJjbGFuZ0ZhaWx1cmUoRXJyKTsKKyAgICBjbGFuZ19kaXNwb3NlVHJhbnNsYXRpb25Vbml0KFRVKTsKICAgICByZXR1cm4gMTsKICAgfQotICAKKwogICBmb3IgKEkgPSAwOyBJICE9IFJlcGVhdHM7ICsrSSkgewogICAgIHJlc3VsdHMgPSBjbGFuZ19jb2RlQ29tcGxldGVBdChUVSwgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zYXZlZF9maWxlcywgbnVtX3Vuc2F2ZWRfZmlsZXMsCkBAIC0yMDAzLDYgKzIxMjQsNyBAQAogICBpbnQgZXJyb3JDb2RlOwogICBzdHJ1Y3QgQ1hVbnNhdmVkRmlsZSAqdW5zYXZlZF9maWxlcyA9IDA7CiAgIGludCBudW1fdW5zYXZlZF9maWxlcyA9IDA7CisgIGVudW0gQ1hFcnJvckNvZGUgRXJyOwogICBDWFRyYW5zbGF0aW9uVW5pdCBUVTsKICAgQ1hDdXJzb3IgQ3Vyc29yOwogICBDdXJzb3JTb3VyY2VMb2NhdGlvbiAqTG9jYXRpb25zID0gMDsKQEAgLTIwMzYsMTUgKzIxNTgsMTUgQEAKICAgLyogUGFyc2UgdGhlIHRyYW5zbGF0aW9uIHVuaXQuIFdoZW4gd2UncmUgdGVzdGluZyBjbGFuZ19nZXRDdXJzb3IoKSBhZnRlcgogICAgICByZXBhcnNpbmcsIGRvbid0IHJlbWFwIHVuc2F2ZWQgZmlsZXMgdW50aWwgdGhlIHNlY29uZCBwYXJzZS4gKi8KICAgQ0lkeCA9IGNsYW5nX2NyZWF0ZUluZGV4KDEsIDEpOwotICBUVSA9IGNsYW5nX3BhcnNlVHJhbnNsYXRpb25Vbml0KENJZHgsIGFyZ3ZbYXJnYyAtIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3YgKyBudW1fdW5zYXZlZF9maWxlcyArIDEgKyBOdW1Mb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYyAtIG51bV91bnNhdmVkX2ZpbGVzIC0gMiAtIE51bUxvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNhdmVkX2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdHMgPiAxPyAwIDogbnVtX3Vuc2F2ZWRfZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdFBhcnNpbmdPcHRpb25zKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBpZiAoIVRVKSB7CisgIEVyciA9IGNsYW5nX3BhcnNlVHJhbnNsYXRpb25Vbml0MihDSWR4LCBhcmd2W2FyZ2MgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndiArIG51bV91bnNhdmVkX2ZpbGVzICsgMSArIE51bUxvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYyAtIG51bV91bnNhdmVkX2ZpbGVzIC0gMiAtIE51bUxvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zYXZlZF9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0cyA+IDE/IDAgOiBudW1fdW5zYXZlZF9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdFBhcnNpbmdPcHRpb25zKCksICZUVSk7CisgIGlmIChFcnIgIT0gQ1hFcnJvcl9TdWNjZXNzKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gcGFyc2UgaW5wdXRcbiIpOworICAgIGRlc2NyaWJlTGliY2xhbmdGYWlsdXJlKEVycik7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTIwNTIsMTEgKzIxNzQsMTQgQEAKICAgICByZXR1cm4gLTE7CiAKICAgZm9yIChJID0gMDsgSSAhPSBSZXBlYXRzOyArK0kpIHsKLSAgICBpZiAoUmVwZWF0cyA+IDEgJiYKLSAgICAgICAgY2xhbmdfcmVwYXJzZVRyYW5zbGF0aW9uVW5pdChUVSwgbnVtX3Vuc2F2ZWRfZmlsZXMsIHVuc2F2ZWRfZmlsZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nX2RlZmF1bHRSZXBhcnNlT3B0aW9ucyhUVSkpKSB7Ci0gICAgICBjbGFuZ19kaXNwb3NlVHJhbnNsYXRpb25Vbml0KFRVKTsKLSAgICAgIHJldHVybiAxOworICAgIGlmIChSZXBlYXRzID4gMSkgeworICAgICAgRXJyID0gY2xhbmdfcmVwYXJzZVRyYW5zbGF0aW9uVW5pdChUVSwgbnVtX3Vuc2F2ZWRfZmlsZXMsIHVuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nX2RlZmF1bHRSZXBhcnNlT3B0aW9ucyhUVSkpOworICAgICAgaWYgKEVyciAhPSBDWEVycm9yX1N1Y2Nlc3MpIHsKKyAgICAgICAgZGVzY3JpYmVMaWJjbGFuZ0ZhaWx1cmUoRXJyKTsKKyAgICAgICAgY2xhbmdfZGlzcG9zZVRyYW5zbGF0aW9uVW5pdChUVSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQogICAgIH0KIAogICAgIGlmIChjaGVja0ZvckVycm9ycyhUVSkgIT0gMCkKQEAgLTIxNjksNiArMjI5NCw3IEBACiAgIGludCBlcnJvckNvZGU7CiAgIHN0cnVjdCBDWFVuc2F2ZWRGaWxlICp1bnNhdmVkX2ZpbGVzID0gMDsKICAgaW50IG51bV91bnNhdmVkX2ZpbGVzID0gMDsKKyAgZW51bSBDWEVycm9yQ29kZSBFcnI7CiAgIENYVHJhbnNsYXRpb25Vbml0IFRVOwogICBDWEN1cnNvciBDdXJzb3I7CiAgIEN1cnNvclNvdXJjZUxvY2F0aW9uICpMb2NhdGlvbnMgPSAwOwpAQCAtMjIwMiwxNSArMjMyOCwxNiBAQAogICAvKiBQYXJzZSB0aGUgdHJhbnNsYXRpb24gdW5pdC4gV2hlbiB3ZSdyZSB0ZXN0aW5nIGNsYW5nX2dldEN1cnNvcigpIGFmdGVyCiAgICAgIHJlcGFyc2luZywgZG9uJ3QgcmVtYXAgdW5zYXZlZCBmaWxlcyB1bnRpbCB0aGUgc2Vjb25kIHBhcnNlLiAqLwogICBDSWR4ID0gY2xhbmdfY3JlYXRlSW5kZXgoMSwgMSk7Ci0gIFRVID0gY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQoQ0lkeCwgYXJndlthcmdjIC0gMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndiArIG51bV91bnNhdmVkX2ZpbGVzICsgMSArIE51bUxvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdjIC0gbnVtX3Vuc2F2ZWRfZmlsZXMgLSAyIC0gTnVtTG9jYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2F2ZWRfZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0cyA+IDE/IDAgOiBudW1fdW5zYXZlZF9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWZhdWx0UGFyc2luZ09wdGlvbnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGlmICghVFUpIHsKKyAgRXJyID0gY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQyKENJZHgsIGFyZ3ZbYXJnYyAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndiArIG51bV91bnNhdmVkX2ZpbGVzICsgMSArIE51bUxvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2MgLSBudW1fdW5zYXZlZF9maWxlcyAtIDIgLSBOdW1Mb2NhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNhdmVkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0cyA+IDE/IDAgOiBudW1fdW5zYXZlZF9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlZmF1bHRQYXJzaW5nT3B0aW9ucygpLCAmVFUpOworICBpZiAoRXJyICE9IENYRXJyb3JfU3VjY2VzcykgewogICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIHBhcnNlIGlucHV0XG4iKTsKKyAgICBkZXNjcmliZUxpYmNsYW5nRmFpbHVyZShFcnIpOworICAgIGNsYW5nX2Rpc3Bvc2VUcmFuc2xhdGlvblVuaXQoVFUpOwogICAgIHJldHVybiAtMTsKICAgfQogCkBAIC0yMjE4LDExICsyMzQ1LDE0IEBACiAgICAgcmV0dXJuIC0xOwogCiAgIGZvciAoSSA9IDA7IEkgIT0gUmVwZWF0czsgKytJKSB7Ci0gICAgaWYgKFJlcGVhdHMgPiAxICYmCi0gICAgICAgIGNsYW5nX3JlcGFyc2VUcmFuc2xhdGlvblVuaXQoVFUsIG51bV91bnNhdmVkX2ZpbGVzLCB1bnNhdmVkX2ZpbGVzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFuZ19kZWZhdWx0UmVwYXJzZU9wdGlvbnMoVFUpKSkgewotICAgICAgY2xhbmdfZGlzcG9zZVRyYW5zbGF0aW9uVW5pdChUVSk7Ci0gICAgICByZXR1cm4gMTsKKyAgICBpZiAoUmVwZWF0cyA+IDEpIHsKKyAgICAgIEVyciA9IGNsYW5nX3JlcGFyc2VUcmFuc2xhdGlvblVuaXQoVFUsIG51bV91bnNhdmVkX2ZpbGVzLCB1bnNhdmVkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFuZ19kZWZhdWx0UmVwYXJzZU9wdGlvbnMoVFUpKTsKKyAgICAgIGlmIChFcnIgIT0gQ1hFcnJvcl9TdWNjZXNzKSB7CisgICAgICAgIGRlc2NyaWJlTGliY2xhbmdGYWlsdXJlKEVycik7CisgICAgICAgIGNsYW5nX2Rpc3Bvc2VUcmFuc2xhdGlvblVuaXQoVFUpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KICAgICB9CiAKICAgICBpZiAoY2hlY2tGb3JFcnJvcnMoVFUpICE9IDApCkBAIC0yMjczLDYgKzI0MDMsNyBAQAogICBDWEluZGV4IENJZHg7CiAgIHN0cnVjdCBDWFVuc2F2ZWRGaWxlICp1bnNhdmVkX2ZpbGVzID0gMDsKICAgaW50IG51bV91bnNhdmVkX2ZpbGVzID0gMDsKKyAgZW51bSBDWEVycm9yQ29kZSBFcnI7CiAgIENYVHJhbnNsYXRpb25Vbml0IFRVOwogICBjb25zdCBjaGFyICoqRmlsZW5hbWVzID0gMDsKICAgdW5zaWduZWQgTnVtRmlsZW5hbWVzID0gMDsKQEAgLTIzMDIsMTUgKzI0MzMsMTcgQEAKICAgLyogUGFyc2UgdGhlIHRyYW5zbGF0aW9uIHVuaXQuIFdoZW4gd2UncmUgdGVzdGluZyBjbGFuZ19nZXRDdXJzb3IoKSBhZnRlcgogICAgICByZXBhcnNpbmcsIGRvbid0IHJlbWFwIHVuc2F2ZWQgZmlsZXMgdW50aWwgdGhlIHNlY29uZCBwYXJzZS4gKi8KICAgQ0lkeCA9IGNsYW5nX2NyZWF0ZUluZGV4KDEsIDEpOwotICBUVSA9IGNsYW5nX3BhcnNlVHJhbnNsYXRpb25Vbml0KENJZHgsIGFyZ3ZbYXJnYyAtIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3YgKyBudW1fdW5zYXZlZF9maWxlcyArIDEgKyBOdW1GaWxlbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYyAtIG51bV91bnNhdmVkX2ZpbGVzIC0gMiAtIE51bUZpbGVuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNhdmVkX2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdHMgPiAxPyAwIDogbnVtX3Vuc2F2ZWRfZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdFBhcnNpbmdPcHRpb25zKCkpOworICBFcnIgPSBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdDIoCisgICAgICBDSWR4LCBhcmd2W2FyZ2MgLSAxXSwKKyAgICAgIGFyZ3YgKyBudW1fdW5zYXZlZF9maWxlcyArIDEgKyBOdW1GaWxlbmFtZXMsCisgICAgICBhcmdjIC0gbnVtX3Vuc2F2ZWRfZmlsZXMgLSAyIC0gTnVtRmlsZW5hbWVzLAorICAgICAgdW5zYXZlZF9maWxlcywKKyAgICAgIFJlcGVhdHMgPiAxID8gMCA6IG51bV91bnNhdmVkX2ZpbGVzLCBnZXREZWZhdWx0UGFyc2luZ09wdGlvbnMoKSwgJlRVKTsKIAotICBpZiAoIVRVKSB7CisgIGlmIChFcnIgIT0gQ1hFcnJvcl9TdWNjZXNzKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gcGFyc2UgaW5wdXRcbiIpOworICAgIGRlc2NyaWJlTGliY2xhbmdGYWlsdXJlKEVycik7CisgICAgY2xhbmdfZGlzcG9zZVRyYW5zbGF0aW9uVW5pdChUVSk7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTIzMTgsMTEgKzI0NTEsMTQgQEAKICAgICByZXR1cm4gLTE7CiAKICAgZm9yIChJID0gMDsgSSAhPSBSZXBlYXRzOyArK0kpIHsKLSAgICBpZiAoUmVwZWF0cyA+IDEgJiYKLSAgICAgICAgY2xhbmdfcmVwYXJzZVRyYW5zbGF0aW9uVW5pdChUVSwgbnVtX3Vuc2F2ZWRfZmlsZXMsIHVuc2F2ZWRfZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhbmdfZGVmYXVsdFJlcGFyc2VPcHRpb25zKFRVKSkpIHsKLSAgICAgIGNsYW5nX2Rpc3Bvc2VUcmFuc2xhdGlvblVuaXQoVFUpOwotICAgICAgcmV0dXJuIDE7CisgICAgaWYgKFJlcGVhdHMgPiAxKSB7CisgICAgICBFcnIgPSBjbGFuZ19yZXBhcnNlVHJhbnNsYXRpb25Vbml0KFRVLCBudW1fdW5zYXZlZF9maWxlcywgdW5zYXZlZF9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhbmdfZGVmYXVsdFJlcGFyc2VPcHRpb25zKFRVKSk7CisgICAgICBpZiAoRXJyICE9IENYRXJyb3JfU3VjY2VzcykgeworICAgICAgICBkZXNjcmliZUxpYmNsYW5nRmFpbHVyZShFcnIpOworICAgICAgICBjbGFuZ19kaXNwb3NlVHJhbnNsYXRpb25Vbml0KFRVKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGNoZWNrRm9yRXJyb3JzKFRVKSAhPSAwKQpAQCAtMjg2Nyw2ICszMDAzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbmRleENCLHNpemVvZihJbmRleENCKSwgaW5kZXhfb3B0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGFyZ3MsIG51bV9hcmdzLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdFBhcnNpbmdPcHRpb25zKCkpOworICBpZiAocmVzdWx0ICE9IENYRXJyb3JfU3VjY2VzcykKKyAgICBkZXNjcmliZUxpYmNsYW5nRmFpbHVyZShyZXN1bHQpOworCiAgIGlmIChpbmRleF9kYXRhLmZhaWxfZm9yX2Vycm9yKQogICAgIHJlc3VsdCA9IC0xOwogCkBAIC0zMTE4LDYgKzMyNTcsOCBAQAogICBDWFNvdXJjZUxvY2F0aW9uIHN0YXJ0TG9jLCBlbmRMb2M7CiAgIENYRmlsZSBmaWxlID0gMDsKICAgQ1hDdXJzb3IgKmN1cnNvcnMgPSAwOworICBDWFNvdXJjZVJhbmdlTGlzdCAqc2tpcHBlZF9yYW5nZXMgPSAwOworICBlbnVtIENYRXJyb3JDb2RlIEVycjsKICAgdW5zaWduZWQgaTsKIAogICBpbnB1dCArPSBzdHJsZW4oIi10ZXN0LWFubm90YXRlLXRva2Vucz0iKTsKQEAgLTMxMzEsMTQgKzMyNzIsMTUgQEAKICAgfQogCiAgIENJZHggPSBjbGFuZ19jcmVhdGVJbmRleCgwLCAxKTsKLSAgVFUgPSBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdChDSWR4LCBhcmd2W2FyZ2MgLSAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2ICsgbnVtX3Vuc2F2ZWRfZmlsZXMgKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2MgLSBudW1fdW5zYXZlZF9maWxlcyAtIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zYXZlZF9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdW5zYXZlZF9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWZhdWx0UGFyc2luZ09wdGlvbnMoKSk7Ci0gIGlmICghVFUpIHsKKyAgRXJyID0gY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQyKENJZHgsIGFyZ3ZbYXJnYyAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndiArIG51bV91bnNhdmVkX2ZpbGVzICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2MgLSBudW1fdW5zYXZlZF9maWxlcyAtIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNhdmVkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Vuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWZhdWx0UGFyc2luZ09wdGlvbnMoKSwgJlRVKTsKKyAgaWYgKEVyciAhPSBDWEVycm9yX1N1Y2Nlc3MpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBwYXJzZSBpbnB1dFxuIik7CisgICAgZGVzY3JpYmVMaWJjbGFuZ0ZhaWx1cmUoRXJyKTsKICAgICBjbGFuZ19kaXNwb3NlSW5kZXgoQ0lkeCk7CiAgICAgZnJlZShmaWxlbmFtZSk7CiAgICAgZnJlZV9yZW1hcHBlZF9maWxlcyh1bnNhdmVkX2ZpbGVzLCBudW1fdW5zYXZlZF9maWxlcyk7CkBAIC0zMTUzLDkgKzMyOTUsMTEgQEAKIAogICBpZiAoZ2V0ZW52KCJDSU5ERVhURVNUX0VESVRJTkciKSkgewogICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKLSAgICAgIGlmIChjbGFuZ19yZXBhcnNlVHJhbnNsYXRpb25Vbml0KFRVLCBudW1fdW5zYXZlZF9maWxlcywgdW5zYXZlZF9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nX2RlZmF1bHRSZXBhcnNlT3B0aW9ucyhUVSkpKSB7CisgICAgICBFcnIgPSBjbGFuZ19yZXBhcnNlVHJhbnNsYXRpb25Vbml0KFRVLCBudW1fdW5zYXZlZF9maWxlcywgdW5zYXZlZF9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhbmdfZGVmYXVsdFJlcGFyc2VPcHRpb25zKFRVKSk7CisgICAgICBpZiAoRXJyICE9IENYRXJyb3JfU3VjY2VzcykgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byByZXBhcnNlIHRyYW5zbGF0aW9uIHVuaXQhXG4iKTsKKyAgICAgICAgZGVzY3JpYmVMaWJjbGFuZ0ZhaWx1cmUoRXJyKTsKICAgICAgICAgZXJyb3JDb2RlID0gLTE7CiAgICAgICAgIGdvdG8gdGVhcmRvd247CiAgICAgICB9CkBAIC0zMjA2LDYgKzMzNTAsMTkgQEAKICAgICBnb3RvIHRlYXJkb3duOwogICB9CiAKKyAgc2tpcHBlZF9yYW5nZXMgPSBjbGFuZ19nZXRTa2lwcGVkUmFuZ2VzKFRVLCBmaWxlKTsKKyAgZm9yIChpID0gMDsgaSAhPSBza2lwcGVkX3Jhbmdlcy0+Y291bnQ7ICsraSkgeworICAgIHVuc2lnbmVkIHN0YXJ0X2xpbmUsIHN0YXJ0X2NvbHVtbiwgZW5kX2xpbmUsIGVuZF9jb2x1bW47CisgICAgY2xhbmdfZ2V0U3BlbGxpbmdMb2NhdGlvbihjbGFuZ19nZXRSYW5nZVN0YXJ0KHNraXBwZWRfcmFuZ2VzLT5yYW5nZXNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJnN0YXJ0X2xpbmUsICZzdGFydF9jb2x1bW4sIDApOworICAgIGNsYW5nX2dldFNwZWxsaW5nTG9jYXRpb24oY2xhbmdfZ2V0UmFuZ2VFbmQoc2tpcHBlZF9yYW5nZXMtPnJhbmdlc1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmZW5kX2xpbmUsICZlbmRfY29sdW1uLCAwKTsKKyAgICBwcmludGYoIlNraXBwaW5nOiAiKTsKKyAgICBQcmludEV4dGVudChzdGRvdXQsIHN0YXJ0X2xpbmUsIHN0YXJ0X2NvbHVtbiwgZW5kX2xpbmUsIGVuZF9jb2x1bW4pOworICAgIHByaW50ZigiXG4iKTsKKyAgfQorICBjbGFuZ19kaXNwb3NlU291cmNlUmFuZ2VMaXN0KHNraXBwZWRfcmFuZ2VzKTsKKwogICBmb3IgKGkgPSAwOyBpICE9IG51bV90b2tlbnM7ICsraSkgewogICAgIGNvbnN0IGNoYXIgKmtpbmQgPSAiPHVua25vd24+IjsKICAgICBDWFN0cmluZyBzcGVsbGluZyA9IGNsYW5nX2dldFRva2VuU3BlbGxpbmcoVFUsIHRva2Vuc1tpXSk7CkBAIC0zNTA2LDYgKzM2NjMsNyBAQAogICBDWFRyYW5zbGF0aW9uVW5pdCBUVTsKICAgc3RydWN0IENYVW5zYXZlZEZpbGUgKnVuc2F2ZWRfZmlsZXMgPSAwOwogICBpbnQgbnVtX3Vuc2F2ZWRfZmlsZXMgPSAwOworICBlbnVtIENYRXJyb3JDb2RlIEVycjsKICAgaW50IHJlc3VsdCA9IDA7CiAgIAogICBJZHggPSBjbGFuZ19jcmVhdGVJbmRleCgvKiBleGNsdWRlRGVjbHNGcm9tUENIICovMSwgLyogZGlzcGxheURpYWdub3N0aWNzPSovMSk7CkBAIC0zNTE0LDE4ICszNjcyLDE5IEBACiAgICAgY2xhbmdfZGlzcG9zZUluZGV4KElkeCk7CiAgICAgcmV0dXJuIC0xOwogICB9Ci0gIAotICBUVSA9IGNsYW5nX3BhcnNlVHJhbnNsYXRpb25Vbml0KElkeCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2ICsgbnVtX3Vuc2F2ZWRfZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYyAtIG51bV91bnNhdmVkX2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2F2ZWRfZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Vuc2F2ZWRfZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hUcmFuc2xhdGlvblVuaXRfSW5jb21wbGV0ZSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hUcmFuc2xhdGlvblVuaXRfRGV0YWlsZWRQcmVwcm9jZXNzaW5nUmVjb3JkfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hUcmFuc2xhdGlvblVuaXRfRm9yU2VyaWFsaXphdGlvbik7Ci0gIGlmICghVFUpIHsKKworICBFcnIgPSBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdDIoCisgICAgICBJZHgsIDAsIGFyZ3YgKyBudW1fdW5zYXZlZF9maWxlcywgYXJnYyAtIG51bV91bnNhdmVkX2ZpbGVzLAorICAgICAgdW5zYXZlZF9maWxlcywgbnVtX3Vuc2F2ZWRfZmlsZXMsCisgICAgICBDWFRyYW5zbGF0aW9uVW5pdF9JbmNvbXBsZXRlIHwKKyAgICAgICAgICBDWFRyYW5zbGF0aW9uVW5pdF9EZXRhaWxlZFByZXByb2Nlc3NpbmdSZWNvcmQgfAorICAgICAgICAgIENYVHJhbnNsYXRpb25Vbml0X0ZvclNlcmlhbGl6YXRpb24sCisgICAgICAmVFUpOworICBpZiAoRXJyICE9IENYRXJyb3JfU3VjY2VzcykgewogICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGxvYWQgdHJhbnNsYXRpb24gdW5pdCFcbiIpOworICAgIGRlc2NyaWJlTGliY2xhbmdGYWlsdXJlKEVycik7CiAgICAgZnJlZV9yZW1hcHBlZF9maWxlcyh1bnNhdmVkX2ZpbGVzLCBudW1fdW5zYXZlZF9maWxlcyk7CisgICAgY2xhbmdfZGlzcG9zZVRyYW5zbGF0aW9uVW5pdChUVSk7CiAgICAgY2xhbmdfZGlzcG9zZUluZGV4KElkeCk7CiAgICAgcmV0dXJuIDE7CiAgIH0KQEAgLTM1NzcsNiArMzczNiw3IEBACiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0U2V2ZXJpdHlTdHJpbmcoZW51bSBDWERpYWdub3N0aWNTZXZlcml0eSBzZXZlcml0eSkgewogICBzd2l0Y2ggKHNldmVyaXR5KSB7CiAgICAgY2FzZSBDWERpYWdub3N0aWNfTm90ZTogcmV0dXJuICJub3RlIjsKKyAgICBjYXNlIENYRGlhZ25vc3RpY19SZW1hcms6IHJldHVybiAicmVtYXJrIjsKICAgICBjYXNlIENYRGlhZ25vc3RpY19FcnJvcjogcmV0dXJuICJlcnJvciI7CiAgICAgY2FzZSBDWERpYWdub3N0aWNfRmF0YWw6IHJldHVybiAiZmF0YWwiOwogICAgIGNhc2UgQ1hEaWFnbm9zdGljX0lnbm9yZWQ6IHJldHVybiAiaWdub3JlZCI7CkBAIC0zNzIxLDYgKzM4ODEsMTEgQEAKICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcGVyZm9ybV9wcmludF9idWlsZF9zZXNzaW9uX3RpbWVzdGFtcCh2b2lkKSB7CisgIHByaW50ZigiJWxsZFxuIiwgY2xhbmdfZ2V0QnVpbGRTZXNzaW9uVGltZXN0YW1wKCkpOworICByZXR1cm4gMDsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIENvbW1hbmQgbGluZSBwcm9jZXNzaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzc3Nyw2ICszOTQyLDggQEAKICAgZnByaW50ZihzdGRlcnIsCiAgICAgIiAgICAgICBjLWluZGV4LXRlc3QgLWNvbXBpbGF0aW9uLWRiIFtsb29rdXAgPGZpbGVuYW1lPl0gZGF0YWJhc2VcbiIpOwogICBmcHJpbnRmKHN0ZGVyciwKKyAgICAiICAgICAgIGMtaW5kZXgtdGVzdCAtcHJpbnQtYnVpbGQtc2Vzc2lvbi10aW1lc3RhbXBcbiIpOworICBmcHJpbnRmKHN0ZGVyciwKICAgICAiICAgICAgIGMtaW5kZXgtdGVzdCAtcmVhZC1kaWFnbm9zdGljcyA8ZmlsZT5cblxuIik7CiAgIGZwcmludGYoc3RkZXJyLAogICAgICIgPHN5bWJvbCBmaWx0ZXI+IHZhbHVlczpcbiVzIiwKQEAgLTM4NzYsNiArNDA0Myw4IEBACiAgICAgcmV0dXJuIHdyaXRlX3BjaF9maWxlKGFyZ3ZbMl0sIGFyZ2MgLSAzLCBhcmd2ICsgMyk7CiAgIGVsc2UgaWYgKGFyZ2MgPiAyICYmIHN0cmNtcChhcmd2WzFdLCAiLWNvbXBpbGF0aW9uLWRiIikgPT0gMCkKICAgICByZXR1cm4gcGVyZm9ybV90ZXN0X2NvbXBpbGF0aW9uX2RiKGFyZ3ZbYXJnYy0xXSwgYXJnYyAtIDMsIGFyZ3YgKyAyKTsKKyAgZWxzZSBpZiAoYXJnYyA9PSAyICYmIHN0cmNtcChhcmd2WzFdLCAiLXByaW50LWJ1aWxkLXNlc3Npb24tdGltZXN0YW1wIikgPT0gMCkKKyAgICByZXR1cm4gcGVyZm9ybV9wcmludF9idWlsZF9zZXNzaW9uX3RpbWVzdGFtcCgpOwogCiAgIHByaW50X3VzYWdlKCk7CiAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvdG9vbHMvY2xhbmctY2hlY2svQ01ha2VMaXN0cy50eHQgYi90b29scy9jbGFuZy1jaGVjay9DTWFrZUxpc3RzLnR4dAppbmRleCAyMDcwZGUzLi44YjljZDg4IDEwMDY0NAotLS0gYS90b29scy9jbGFuZy1jaGVjay9DTWFrZUxpc3RzLnR4dAorKysgYi90b29scy9jbGFuZy1jaGVjay9DTWFrZUxpc3RzLnR4dApAQCAtMSw5ICsxLDYgQEAKIHNldChMTFZNX0xJTktfQ09NUE9ORU5UUwotICAke0xMVk1fVEFSR0VUU19UT19CVUlMRH0KLSAgYXNtcGFyc2VyCi0gIGJpdHJlYWRlcgotICBzdXBwb3J0Ci0gIG1jCisgIE9wdGlvbgorICBTdXBwb3J0CiAgICkKIAogYWRkX2NsYW5nX2V4ZWN1dGFibGUoY2xhbmctY2hlY2sKQEAgLTExLDEwICs4LDEzIEBACiAgICkKIAogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNsYW5nLWNoZWNrCi0gIGNsYW5nVG9vbGluZworICBjbGFuZ0FTVAogICBjbGFuZ0Jhc2ljCisgIGNsYW5nRHJpdmVyCisgIGNsYW5nRnJvbnRlbmQKICAgY2xhbmdSZXdyaXRlRnJvbnRlbmQKICAgY2xhbmdTdGF0aWNBbmFseXplckZyb250ZW5kCisgIGNsYW5nVG9vbGluZwogICApCiAKIGluc3RhbGwoVEFSR0VUUyBjbGFuZy1jaGVjawpkaWZmIC0tZ2l0IGEvdG9vbHMvY2xhbmctY2hlY2svQ2xhbmdDaGVjay5jcHAgYi90b29scy9jbGFuZy1jaGVjay9DbGFuZ0NoZWNrLmNwcAppbmRleCA3MDFkYjUyLi40ZmM5NzBjIDEwMDY0NAotLS0gYS90b29scy9jbGFuZy1jaGVjay9DbGFuZ0NoZWNrLmNwcAorKysgYi90b29scy9jbGFuZy1jaGVjay9DbGFuZ0NoZWNrLmNwcApAQCAtMjAsMjAgKzIwLDE4IEBACiAjaW5jbHVkZSAiY2xhbmcvRHJpdmVyL09wdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9BU1RDb25zdW1lcnMuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db21waWxlckluc3RhbmNlLmgiCi0jaW5jbHVkZSAiY2xhbmcvU3RhdGljQW5hbHl6ZXIvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmgiCiAjaW5jbHVkZSAiY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9GaXhJdFJld3JpdGVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvUmV3cml0ZS9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaCIKKyNpbmNsdWRlICJjbGFuZy9TdGF0aWNBbmFseXplci9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0NvbW1vbk9wdGlvbnNQYXJzZXIuaCIKICNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1Rvb2xpbmcuaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9PcHRUYWJsZS5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NpZ25hbHMuaCIKLSNpbmNsdWRlICJsbHZtL09wdGlvbi9PcHRUYWJsZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgY2xhbmc6OmRyaXZlcjsKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6dG9vbGluZzsKIHVzaW5nIG5hbWVzcGFjZSBsbHZtOwotdXNpbmcgbmFtZXNwYWNlIGxsdm06Om9wdDsKIAogc3RhdGljIGNsOjpleHRyYWhlbHAgQ29tbW9uSGVscChDb21tb25PcHRpb25zUGFyc2VyOjpIZWxwTWVzc2FnZSk7CiBzdGF0aWMgY2w6OmV4dHJhaGVscCBNb3JlSGVscCgKQEAgLTUxLDM0ICs0OSw0MiBAQAogICAgICJcbiIKICk7CiAKLXN0YXRpYyBPd25pbmdQdHI8T3B0VGFibGU+IE9wdGlvbnMoY3JlYXRlRHJpdmVyT3B0VGFibGUoKSk7Ci1zdGF0aWMgY2w6Om9wdDxib29sPiBBU1REdW1wKAotICAgICJhc3QtZHVtcCIsCi0gICAgY2w6OmRlc2MoT3B0aW9ucy0+Z2V0T3B0aW9uSGVscFRleHQob3B0aW9uczo6T1BUX2FzdF9kdW1wKSkpOwotc3RhdGljIGNsOjpvcHQ8Ym9vbD4gQVNUTGlzdCgKLSAgICAiYXN0LWxpc3QiLAotICAgIGNsOjpkZXNjKE9wdGlvbnMtPmdldE9wdGlvbkhlbHBUZXh0KG9wdGlvbnM6Ok9QVF9hc3RfbGlzdCkpKTsKLXN0YXRpYyBjbDo6b3B0PGJvb2w+IEFTVFByaW50KAotICAgICJhc3QtcHJpbnQiLAotICAgIGNsOjpkZXNjKE9wdGlvbnMtPmdldE9wdGlvbkhlbHBUZXh0KG9wdGlvbnM6Ok9QVF9hc3RfcHJpbnQpKSk7CitzdGF0aWMgY2w6Ok9wdGlvbkNhdGVnb3J5IENsYW5nQ2hlY2tDYXRlZ29yeSgiY2xhbmctY2hlY2sgb3B0aW9ucyIpOworc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxvcHQ6Ok9wdFRhYmxlPiBPcHRpb25zKGNyZWF0ZURyaXZlck9wdFRhYmxlKCkpOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK0FTVER1bXAoImFzdC1kdW1wIiwgY2w6OmRlc2MoT3B0aW9ucy0+Z2V0T3B0aW9uSGVscFRleHQob3B0aW9uczo6T1BUX2FzdF9kdW1wKSksCisgICAgICAgIGNsOjpjYXQoQ2xhbmdDaGVja0NhdGVnb3J5KSk7CitzdGF0aWMgY2w6Om9wdDxib29sPgorQVNUTGlzdCgiYXN0LWxpc3QiLCBjbDo6ZGVzYyhPcHRpb25zLT5nZXRPcHRpb25IZWxwVGV4dChvcHRpb25zOjpPUFRfYXN0X2xpc3QpKSwKKyAgICAgICAgY2w6OmNhdChDbGFuZ0NoZWNrQ2F0ZWdvcnkpKTsKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CitBU1RQcmludCgiYXN0LXByaW50IiwKKyAgICAgICAgIGNsOjpkZXNjKE9wdGlvbnMtPmdldE9wdGlvbkhlbHBUZXh0KG9wdGlvbnM6Ok9QVF9hc3RfcHJpbnQpKSwKKyAgICAgICAgIGNsOjpjYXQoQ2xhbmdDaGVja0NhdGVnb3J5KSk7CiBzdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4gQVNURHVtcEZpbHRlcigKICAgICAiYXN0LWR1bXAtZmlsdGVyIiwKLSAgICBjbDo6ZGVzYyhPcHRpb25zLT5nZXRPcHRpb25IZWxwVGV4dChvcHRpb25zOjpPUFRfYXN0X2R1bXBfZmlsdGVyKSkpOwotc3RhdGljIGNsOjpvcHQ8Ym9vbD4gQW5hbHl6ZSgKLSAgICAiYW5hbHl6ZSIsCi0gICAgY2w6OmRlc2MoT3B0aW9ucy0+Z2V0T3B0aW9uSGVscFRleHQob3B0aW9uczo6T1BUX2FuYWx5emUpKSk7CisgICAgY2w6OmRlc2MoT3B0aW9ucy0+Z2V0T3B0aW9uSGVscFRleHQob3B0aW9uczo6T1BUX2FzdF9kdW1wX2ZpbHRlcikpLAorICAgIGNsOjpjYXQoQ2xhbmdDaGVja0NhdGVnb3J5KSk7CitzdGF0aWMgY2w6Om9wdDxib29sPgorQW5hbHl6ZSgiYW5hbHl6ZSIsIGNsOjpkZXNjKE9wdGlvbnMtPmdldE9wdGlvbkhlbHBUZXh0KG9wdGlvbnM6Ok9QVF9hbmFseXplKSksCisgICAgICAgIGNsOjpjYXQoQ2xhbmdDaGVja0NhdGVnb3J5KSk7CiAKLXN0YXRpYyBjbDo6b3B0PGJvb2w+IEZpeGl0KAotICAgICJmaXhpdCIsCi0gICAgY2w6OmRlc2MoT3B0aW9ucy0+Z2V0T3B0aW9uSGVscFRleHQob3B0aW9uczo6T1BUX2ZpeGl0KSkpOworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KK0ZpeGl0KCJmaXhpdCIsIGNsOjpkZXNjKE9wdGlvbnMtPmdldE9wdGlvbkhlbHBUZXh0KG9wdGlvbnM6Ok9QVF9maXhpdCkpLAorICAgICAgY2w6OmNhdChDbGFuZ0NoZWNrQ2F0ZWdvcnkpKTsKIHN0YXRpYyBjbDo6b3B0PGJvb2w+IEZpeFdoYXRZb3VDYW4oCiAgICAgImZpeC13aGF0LXlvdS1jYW4iLAotICAgIGNsOjpkZXNjKE9wdGlvbnMtPmdldE9wdGlvbkhlbHBUZXh0KG9wdGlvbnM6Ok9QVF9maXhfd2hhdF95b3VfY2FuKSkpOworICAgIGNsOjpkZXNjKE9wdGlvbnMtPmdldE9wdGlvbkhlbHBUZXh0KG9wdGlvbnM6Ok9QVF9maXhfd2hhdF95b3VfY2FuKSksCisgICAgY2w6OmNhdChDbGFuZ0NoZWNrQ2F0ZWdvcnkpKTsKIAotc3RhdGljIGNsOjpsaXN0PHN0ZDo6c3RyaW5nPiBBcmdzQWZ0ZXIoImV4dHJhLWFyZyIsCi0gICAgY2w6OmRlc2MoIkFkZGl0aW9uYWwgYXJndW1lbnQgdG8gYXBwZW5kIHRvIHRoZSBjb21waWxlciBjb21tYW5kIGxpbmUiKSk7Ci1zdGF0aWMgY2w6Omxpc3Q8c3RkOjpzdHJpbmc+IEFyZ3NCZWZvcmUoImV4dHJhLWFyZy1iZWZvcmUiLAotICAgIGNsOjpkZXNjKCJBZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHByZXBlbmQgdG8gdGhlIGNvbXBpbGVyIGNvbW1hbmQgbGluZSIpKTsKK3N0YXRpYyBjbDo6bGlzdDxzdGQ6OnN0cmluZz4gQXJnc0FmdGVyKAorICAgICJleHRyYS1hcmciLAorICAgIGNsOjpkZXNjKCJBZGRpdGlvbmFsIGFyZ3VtZW50IHRvIGFwcGVuZCB0byB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lIiksCisgICAgY2w6OmNhdChDbGFuZ0NoZWNrQ2F0ZWdvcnkpKTsKK3N0YXRpYyBjbDo6bGlzdDxzdGQ6OnN0cmluZz4gQXJnc0JlZm9yZSgKKyAgICAiZXh0cmEtYXJnLWJlZm9yZSIsCisgICAgY2w6OmRlc2MoIkFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcHJlcGVuZCB0byB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lIiksCisgICAgY2w6OmNhdChDbGFuZ0NoZWNrQ2F0ZWdvcnkpKTsKIAogbmFtZXNwYWNlIHsKIApAQCAtOTAsNyArOTYsNyBAQAogICAgIEZpeFdoYXRZb3VDYW4gPSA6OkZpeFdoYXRZb3VDYW47CiAgIH0KIAotICBzdGQ6OnN0cmluZyBSZXdyaXRlRmlsZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBpbnQgJmZkKSB7CisgIHN0ZDo6c3RyaW5nIFJld3JpdGVGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGludCAmZmQpIG92ZXJyaWRlIHsKICAgICBhc3NlcnQobGx2bTo6c3lzOjpwYXRoOjppc19hYnNvbHV0ZShmaWxlbmFtZSkgJiYKICAgICAgICAgICAgImNsYW5nLWZpeGl0IGV4cGVjdHMgYWJzb2x1dGUgcGF0aHMgb25seS4iKTsKIApAQCAtMTE3LDE1ICsxMjMsMTUgQEAKICAgICAgIDogY2xhbmc6OkZpeEl0UmV3cml0ZXIoRGlhZ3MsIFNvdXJjZU1nciwgTGFuZ09wdHMsIEZpeEl0T3B0cykgewogICB9CiAKLSAgdmlydHVhbCBib29sIEluY2x1ZGVJbkRpYWdub3N0aWNDb3VudHMoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICBib29sIEluY2x1ZGVJbkRpYWdub3N0aWNDb3VudHMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQogfTsKIAogLy8vIFxicmllZiBTdWJjbGFzc2VzIFxjIGNsYW5nOjpGaXhJdEFjdGlvbiBzbyB0aGF0IHdlIGNhbiBpbnN0YWxsIHRoZSBjdXN0b20KIC8vLyBcYyBGaXhJdFJld3JpdGVyLgogY2xhc3MgRml4SXRBY3Rpb24gOiBwdWJsaWMgY2xhbmc6OkZpeEl0QWN0aW9uIHsKIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIEJlZ2luU291cmNlRmlsZUFjdGlvbihjbGFuZzo6Q29tcGlsZXJJbnN0YW5jZSYgQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVuYW1lKSB7CisgIGJvb2wgQmVnaW5Tb3VyY2VGaWxlQWN0aW9uKGNsYW5nOjpDb21waWxlckluc3RhbmNlJiBDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVuYW1lKSBvdmVycmlkZSB7CiAgICAgRml4SXRPcHRzLnJlc2V0KG5ldyBGaXhJdE9wdGlvbnMpOwogICAgIFJld3JpdGVyLnJlc2V0KG5ldyBGaXhJdFJld3JpdGVyKENJLmdldERpYWdub3N0aWNzKCksIENJLmdldFNvdXJjZU1hbmFnZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSS5nZXRMYW5nT3B0cygpLCBGaXhJdE9wdHMuZ2V0KCkpKTsKQEAgLTE0Niw3ICsxNTIsNyBAQAogICB9CiAKICAgdmlydHVhbCBDb21tYW5kTGluZUFyZ3VtZW50cwotICBBZGp1c3QoY29uc3QgQ29tbWFuZExpbmVBcmd1bWVudHMgJkFyZ3MpIExMVk1fT1ZFUlJJREUgeworICBBZGp1c3QoY29uc3QgQ29tbWFuZExpbmVBcmd1bWVudHMgJkFyZ3MpIG92ZXJyaWRlIHsKICAgICBDb21tYW5kTGluZUFyZ3VtZW50cyBSZXR1cm4oQXJncyk7CiAKICAgICBDb21tYW5kTGluZUFyZ3VtZW50czo6aXRlcmF0b3IgSTsKQEAgLTE4Nyw3ICsxOTMsNyBAQAogCiBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpIHsKICAgbGx2bTo6c3lzOjpQcmludFN0YWNrVHJhY2VPbkVycm9yU2lnbmFsKCk7Ci0gIENvbW1vbk9wdGlvbnNQYXJzZXIgT3B0aW9uc1BhcnNlcihhcmdjLCBhcmd2KTsKKyAgQ29tbW9uT3B0aW9uc1BhcnNlciBPcHRpb25zUGFyc2VyKGFyZ2MsIGFyZ3YsIENsYW5nQ2hlY2tDYXRlZ29yeSk7CiAgIENsYW5nVG9vbCBUb29sKE9wdGlvbnNQYXJzZXIuZ2V0Q29tcGlsYXRpb25zKCksCiAgICAgICAgICAgICAgICAgIE9wdGlvbnNQYXJzZXIuZ2V0U291cmNlUGF0aExpc3QoKSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2NsYW5nLWZvcm1hdC12cy9DTWFrZUxpc3RzLnR4dCBiL3Rvb2xzL2NsYW5nLWZvcm1hdC12cy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODgzYTk4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvY2xhbmctZm9ybWF0LXZzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTYgQEAKK29wdGlvbihCVUlMRF9DTEFOR19GT1JNQVRfVlNfUExVR0lOICJCdWlsZCBjbGFuZy1mb3JtYXQgVlMgcGx1Z2luIiBPRkYpCitpZiAoQlVJTERfQ0xBTkdfRk9STUFUX1ZTX1BMVUdJTikKKyAgYWRkX2N1c3RvbV90YXJnZXQoY2xhbmdfZm9ybWF0X2V4ZV9mb3JfdnNpeAorICAgICAgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5X2lmX2RpZmZlcmVudAorICAgICAgIiR7TExWTV9UT09MU19CSU5BUllfRElSfS8ke0NNQUtFX0NGR19JTlRESVJ9L2NsYW5nLWZvcm1hdC5leGUiCisgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NsYW5nRm9ybWF0L2NsYW5nLWZvcm1hdC5leGUiCisgICAgICBERVBFTkRTIGNsYW5nLWZvcm1hdCkKKworICBhZGRfY3VzdG9tX3RhcmdldChjbGFuZ19mb3JtYXRfdnNpeCBBTEwKKyAgICAgIGRldmVudiAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NsYW5nRm9ybWF0LnNsbiIgL0J1aWxkIFJlbGVhc2UKKyAgICAgIERFUEVORFMgY2xhbmdfZm9ybWF0X2V4ZV9mb3JfdnNpeAorICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHlfaWZfZGlmZmVyZW50CisgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NsYW5nRm9ybWF0L2Jpbi9SZWxlYXNlL0NsYW5nRm9ybWF0LnZzaXgiCisgICAgICAiJHtMTFZNX1RPT0xTX0JJTkFSWV9ESVJ9LyR7Q01BS0VfQ0ZHX0lOVERJUn0vQ2xhbmdGb3JtYXQudnNpeCIKKyAgICAgIERFUEVORFMgY2xhbmdfZm9ybWF0X2V4ZV9mb3JfdnNpeCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2NsYW5nLWZvcm1hdC12cy9DbGFuZ0Zvcm1hdC9DbGFuZ0Zvcm1hdC5jc3Byb2ogYi90b29scy9jbGFuZy1mb3JtYXQtdnMvQ2xhbmdGb3JtYXQvQ2xhbmdGb3JtYXQuY3Nwcm9qCmluZGV4IDY1Y2NhYmEuLjJmNDkyMjEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2NsYW5nLWZvcm1hdC12cy9DbGFuZ0Zvcm1hdC9DbGFuZ0Zvcm1hdC5jc3Byb2oKKysrIGIvdG9vbHMvY2xhbmctZm9ybWF0LXZzL0NsYW5nRm9ybWF0L0NsYW5nRm9ybWF0LmNzcHJvagpAQCAtMTc4LDYgKzE3OCw5IEBACiAgICAgPE5vbmUgSW5jbHVkZT0iUmVzb3VyY2VzXEltYWdlc18zMmJpdC5ibXAiIC8+DQogICA8L0l0ZW1Hcm91cD4NCiAgIDxJdGVtR3JvdXA+DQorICAgIDxDb250ZW50IEluY2x1ZGU9ImNsYW5nLWZvcm1hdC5leGUiPg0KKyAgICAgIDxJbmNsdWRlSW5WU0lYPnRydWU8L0luY2x1ZGVJblZTSVg+DQorICAgIDwvQ29udGVudD4NCiAgICAgPENvbnRlbnQgSW5jbHVkZT0iUmVzb3VyY2VzXFBhY2thZ2UuaWNvIiAvPg0KICAgPC9JdGVtR3JvdXA+DQogICA8SXRlbUdyb3VwPg0KZGlmZiAtLWdpdCBhL3Rvb2xzL2NsYW5nLWZvcm1hdC12cy9DbGFuZ0Zvcm1hdC9DbGFuZ0Zvcm1hdFBhY2thZ2UuY3MgYi90b29scy9jbGFuZy1mb3JtYXQtdnMvQ2xhbmdGb3JtYXQvQ2xhbmdGb3JtYXRQYWNrYWdlLmNzCmluZGV4IDc5N2Q0NjcuLmMzYWE4ZmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2NsYW5nLWZvcm1hdC12cy9DbGFuZ0Zvcm1hdC9DbGFuZ0Zvcm1hdFBhY2thZ2UuY3MKKysrIGIvdG9vbHMvY2xhbmctZm9ybWF0LXZzL0NsYW5nRm9ybWF0L0NsYW5nRm9ybWF0UGFja2FnZS5jcwpAQCAtMjIsNiArMjIsNyBAQAogdXNpbmcgU3lzdGVtLkNvbXBvbmVudE1vZGVsOw0KIHVzaW5nIFN5c3RlbS5Db21wb25lbnRNb2RlbC5EZXNpZ247DQogdXNpbmcgU3lzdGVtLklPOw0KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOw0KIHVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCiB1c2luZyBTeXN0ZW0uWG1sLkxpbnE7DQogDQpAQCAtMTI4LDkgKzEyOSwxMiBAQAogICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAgcHJpdmF0ZSBzdHJpbmcgUnVuQ2xhbmdGb3JtYXQoc3RyaW5nIHRleHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIHN0cmluZyBwYXRoKQ0KICAgICAgICAgew0KKyAgICAgICAgICAgIHN0cmluZyB2c2l4UGF0aCA9IFBhdGguR2V0RGlyZWN0b3J5TmFtZSgNCisgICAgICAgICAgICAgICAgdHlwZW9mKENsYW5nRm9ybWF0UGFja2FnZSkuQXNzZW1ibHkuTG9jYXRpb24pOw0KKw0KICAgICAgICAgICAgIFN5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzIHByb2Nlc3MgPSBuZXcgU3lzdGVtLkRpYWdub3N0aWNzLlByb2Nlc3MoKTsNCiAgICAgICAgICAgICBwcm9jZXNzLlN0YXJ0SW5mby5Vc2VTaGVsbEV4ZWN1dGUgPSBmYWxzZTsNCi0gICAgICAgICAgICBwcm9jZXNzLlN0YXJ0SW5mby5GaWxlTmFtZSA9ICJjbGFuZy1mb3JtYXQuZXhlIjsNCisgICAgICAgICAgICBwcm9jZXNzLlN0YXJ0SW5mby5GaWxlTmFtZSA9IHZzaXhQYXRoICsgIlxcY2xhbmctZm9ybWF0LmV4ZSI7DQogICAgICAgICAgICAgLy8gUG9vciBtYW4ncyBlc2NhcGluZyAtIHRoaXMgd2lsbCBub3Qgd29yayB3aGVuIHF1b3RlcyBhcmUgYWxyZWFkeSBlc2NhcGVkDQogICAgICAgICAgICAgLy8gaW4gdGhlIGlucHV0IChidXQgd2UgZG9uJ3QgbmVlZCBtb3JlKS4NCiAgICAgICAgICAgICBzdHJpbmcgc3R5bGUgPSBHZXRTdHlsZSgpLlJlcGxhY2UoIlwiIiwgIlxcXCIiKTsNCmRpZmYgLS1naXQgYS90b29scy9jbGFuZy1mb3JtYXQtdnMvUkVBRE1FLnR4dCBiL3Rvb2xzL2NsYW5nLWZvcm1hdC12cy9SRUFETUUudHh0CmluZGV4IDZkNGViYjMuLmI4N2RmNmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2NsYW5nLWZvcm1hdC12cy9SRUFETUUudHh0CisrKyBiL3Rvb2xzL2NsYW5nLWZvcm1hdC12cy9SRUFETUUudHh0CkBAIC0zLDQgKzMsMTEgQEAKIA0KIEJ1aWxkIHByZXJlcXVpc2l0ZXMgYXJlOg0KIC0gVmlzdWFsIFN0dWRpbyAyMDEyIFByb2Zlc3Npb25hbA0KLS0gVmlzdWFsIFN0dWRpbyBTREsgKGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG9hZC9kZXRhaWxzLmFzcHg/aWQ9MzA2NjgpDQorLSBWaXN1YWwgU3R1ZGlvIDIwMTAgUHJvZmVzc2lvbmFsDQorLSBWaXN1YWwgU3R1ZGlvIDIwMTAgU0RLLg0KKw0KK2NsYW5nLWZvcm1hdC5leGUgbXVzdCBiZSBjb3BpZWQgaW50byB0aGUgQ2xhbmdGb3JtYXQvIGRpcmVjdG9yeSBiZWZvcmUgYnVpbGRpbmcuDQorSXQgd2lsbCBiZSBidW5kbGVkIGludG8gdGhlIC52c2l4IGZpbGUuDQorDQorVGhlIGV4dGVuc2lvbiBjYW4gYmUgYnVpbHQgbWFudWFsbHkgZnJvbSBDbGFuZ0Zvcm1hdC5zbG4gKGUuZy4gYnkgb3BlbmluZyBpdCBpbg0KK1Zpc3VhbCBTdHVkaW8pLCBvciB3aXRoIGNtYWtlIGJ5IHNldHRpbmcgdGhlIEJVSUxEX0NMQU5HX0ZPUk1BVF9WU19QTFVHSU4gZmxhZy4NCmRpZmYgLS1naXQgYS90b29scy9jbGFuZy1mb3JtYXQvQ01ha2VMaXN0cy50eHQgYi90b29scy9jbGFuZy1mb3JtYXQvQ01ha2VMaXN0cy50eHQKaW5kZXggN2JiM2ZiZi4uYjAyOWY3MSAxMDA2NDQKLS0tIGEvdG9vbHMvY2xhbmctZm9ybWF0L0NNYWtlTGlzdHMudHh0CisrKyBiL3Rvb2xzL2NsYW5nLWZvcm1hdC9DTWFrZUxpc3RzLnR4dApAQCAtMSwxNSArMSwxNSBAQAogc2V0KExMVk1fTElOS19DT01QT05FTlRTIHN1cHBvcnQpCi1zZXQoTExWTV9VU0VEX0xJQlMgY2xhbmdGb3JtYXQgY2xhbmdUb29saW5nIGNsYW5nQmFzaWMgY2xhbmdBU1QpCiAKIGFkZF9jbGFuZ19leGVjdXRhYmxlKGNsYW5nLWZvcm1hdAogICBDbGFuZ0Zvcm1hdC5jcHAKICAgKQogCiB0YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmctZm9ybWF0Ci0gIGNsYW5nRm9ybWF0Ci0gIGNsYW5nVG9vbGluZwogICBjbGFuZ0Jhc2ljCi0gIGNsYW5nUmV3cml0ZUZyb250ZW5kCisgIGNsYW5nRm9ybWF0CisgIGNsYW5nTGV4CisgIGNsYW5nUmV3cml0ZUNvcmUKKyAgY2xhbmdUb29saW5nCiAgICkKIAogaW5zdGFsbChUQVJHRVRTIGNsYW5nLWZvcm1hdCBSVU5USU1FIERFU1RJTkFUSU9OIGJpbikKZGlmZiAtLWdpdCBhL3Rvb2xzL2NsYW5nLWZvcm1hdC9DbGFuZ0Zvcm1hdC5jcHAgYi90b29scy9jbGFuZy1mb3JtYXQvQ2xhbmdGb3JtYXQuY3BwCmluZGV4IDc2ODE2NWIuLjZmOTQ0NjEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2NsYW5nLWZvcm1hdC9DbGFuZ0Zvcm1hdC5jcHAKKysrIGIvdG9vbHMvY2xhbmctZm9ybWF0L0NsYW5nRm9ybWF0LmNwcApAQCAtMTcsMTMgKzE3LDE0IEBACiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpY09wdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9GaWxlTWFuYWdlci5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1NvdXJjZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9WZXJzaW9uLmgiCiAjaW5jbHVkZSAiY2xhbmcvRm9ybWF0L0Zvcm1hdC5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9MZXhlci5oIgogI2luY2x1ZGUgImNsYW5nL1Jld3JpdGUvQ29yZS9SZXdyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NpZ25hbHMuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGxsdm07CiAKQEAgLTMxLDcgKzMyLDcgQEAKIAogLy8gTWFyayBhbGwgb3VyIG9wdGlvbnMgd2l0aCB0aGlzIGNhdGVnb3J5LCBldmVyeXRoaW5nIGVsc2UgKGV4Y2VwdCBmb3IgLXZlcnNpb24KIC8vIGFuZCAtaGVscCkgd2lsbCBiZSBoaWRkZW4uCi1jbDo6T3B0aW9uQ2F0ZWdvcnkgQ2xhbmdGb3JtYXRDYXRlZ29yeSgiQ2xhbmctZm9ybWF0IG9wdGlvbnMiKTsKK3N0YXRpYyBjbDo6T3B0aW9uQ2F0ZWdvcnkgQ2xhbmdGb3JtYXRDYXRlZ29yeSgiQ2xhbmctZm9ybWF0IG9wdGlvbnMiKTsKIAogc3RhdGljIGNsOjpsaXN0PHVuc2lnbmVkPgogICAgIE9mZnNldHMoIm9mZnNldCIsCkBAIC02Miw2ICs2MywxMyBAQAogICAgIFN0eWxlKCJzdHlsZSIsCiAgICAgICAgICAgY2w6OmRlc2MoY2xhbmc6OmZvcm1hdDo6U3R5bGVPcHRpb25IZWxwRGVzY3JpcHRpb24pLAogICAgICAgICAgIGNsOjppbml0KCJmaWxlIiksIGNsOjpjYXQoQ2xhbmdGb3JtYXRDYXRlZ29yeSkpOworc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CitGYWxsYmFja1N0eWxlKCJmYWxsYmFjay1zdHlsZSIsCisgICAgICAgICAgICAgIGNsOjpkZXNjKCJUaGUgbmFtZSBvZiB0aGUgcHJlZGVmaW5lZCBzdHlsZSB1c2VkIGFzIGFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgImZhbGxiYWNrIGluIGNhc2UgY2xhbmctZm9ybWF0IGlzIGludm9rZWQgd2l0aFxuIgorICAgICAgICAgICAgICAgICAgICAgICAiLXN0eWxlPWZpbGUsIGJ1dCBjYW4gbm90IGZpbmQgdGhlIC5jbGFuZy1mb3JtYXRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgdG8gdXNlLiIpLAorICAgICAgICAgICAgICBjbDo6aW5pdCgiTExWTSIpLCBjbDo6Y2F0KENsYW5nRm9ybWF0Q2F0ZWdvcnkpKTsKIAogc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CiBBc3N1bWVGaWxlbmFtZSgiYXNzdW1lLWZpbGVuYW1lIiwKQEAgLTE3Myw2ICsxODEsMjYgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgdm9pZCBvdXRwdXRSZXBsYWNlbWVudFhNTChTdHJpbmdSZWYgVGV4dCkgeworICBzaXplX3QgRnJvbSA9IDA7CisgIHNpemVfdCBJbmRleDsKKyAgd2hpbGUgKChJbmRleCA9IFRleHQuZmluZF9maXJzdF9vZigiXG5cciIsIEZyb20pKSAhPSBTdHJpbmdSZWY6Om5wb3MpIHsKKyAgICBsbHZtOjpvdXRzKCkgPDwgVGV4dC5zdWJzdHIoRnJvbSwgSW5kZXggLSBGcm9tKTsKKyAgICBzd2l0Y2ggKFRleHRbSW5kZXhdKSB7CisgICAgY2FzZSAnXG4nOgorICAgICAgbGx2bTo6b3V0cygpIDw8ICImIzEwOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdccic6CisgICAgICBsbHZtOjpvdXRzKCkgPDwgIiYjMTM7IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGNoYXJhY3RlciBlbmNvdW50ZXJlZCEiKTsKKyAgICB9CisgICAgRnJvbSA9IEluZGV4ICsgMTsKKyAgfQorICBsbHZtOjpvdXRzKCkgPDwgVGV4dC5zdWJzdHIoRnJvbSk7Cit9CisKIC8vIFJldHVybnMgdHJ1ZSBvbiBlcnJvci4KIHN0YXRpYyBib29sIGZvcm1hdChTdHJpbmdSZWYgRmlsZU5hbWUpIHsKICAgRmlsZU1hbmFnZXIgRmlsZXMoKEZpbGVTeXN0ZW1PcHRpb25zKCkpKTsKQEAgLTE4MCw3ICsyMDgsNyBAQAogICAgICAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNJRHM+KG5ldyBEaWFnbm9zdGljSURzKSwKICAgICAgIG5ldyBEaWFnbm9zdGljT3B0aW9ucyk7CiAgIFNvdXJjZU1hbmFnZXIgU291cmNlcyhEaWFnbm9zdGljcywgRmlsZXMpOwotICBPd25pbmdQdHI8TWVtb3J5QnVmZmVyPiBDb2RlOworICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBDb2RlOwogICBpZiAoZXJyb3JfY29kZSBlYyA9IE1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZU9yU1RESU4oRmlsZU5hbWUsIENvZGUpKSB7CiAgICAgbGx2bTo6ZXJycygpIDw8IGVjLm1lc3NhZ2UoKSA8PCAiXG4iOwogICAgIHJldHVybiB0cnVlOwpAQCAtMTkyLDggKzIyMCw4IEBACiAgIGlmIChmaWxsUmFuZ2VzKFNvdXJjZXMsIElELCBDb2RlLmdldCgpLCBSYW5nZXMpKQogICAgIHJldHVybiB0cnVlOwogCi0gIEZvcm1hdFN0eWxlIEZvcm1hdFN0eWxlID0KLSAgICAgIGdldFN0eWxlKFN0eWxlLCAoRmlsZU5hbWUgPT0gIi0iKSA/IEFzc3VtZUZpbGVuYW1lIDogRmlsZU5hbWUpOworICBGb3JtYXRTdHlsZSBGb3JtYXRTdHlsZSA9IGdldFN0eWxlKAorICAgICAgU3R5bGUsIChGaWxlTmFtZSA9PSAiLSIpID8gQXNzdW1lRmlsZW5hbWUgOiBGaWxlTmFtZSwgRmFsbGJhY2tTdHlsZSk7CiAgIExleGVyIExleChJRCwgU291cmNlcy5nZXRCdWZmZXIoSUQpLCBTb3VyY2VzLAogICAgICAgICAgICAgZ2V0Rm9ybWF0dGluZ0xhbmdPcHRzKEZvcm1hdFN0eWxlLlN0YW5kYXJkKSk7CiAgIHRvb2xpbmc6OlJlcGxhY2VtZW50cyBSZXBsYWNlcyA9IHJlZm9ybWF0KEZvcm1hdFN0eWxlLCBMZXgsIFNvdXJjZXMsIFJhbmdlcyk7CkBAIC0yMDUsOCArMjMzLDkgQEAKICAgICAgICAgIEkgIT0gRTsgKytJKSB7CiAgICAgICBsbHZtOjpvdXRzKCkgPDwgIjxyZXBsYWNlbWVudCAiCiAgICAgICAgICAgICAgICAgICAgPDwgIm9mZnNldD0nIiA8PCBJLT5nZXRPZmZzZXQoKSA8PCAiJyAiCi0gICAgICAgICAgICAgICAgICAgPDwgImxlbmd0aD0nIiA8PCBJLT5nZXRMZW5ndGgoKSA8PCAiJz4iCi0gICAgICAgICAgICAgICAgICAgPDwgSS0+Z2V0UmVwbGFjZW1lbnRUZXh0KCkgPDwgIjwvcmVwbGFjZW1lbnQ+XG4iOworICAgICAgICAgICAgICAgICAgIDw8ICJsZW5ndGg9JyIgPDwgSS0+Z2V0TGVuZ3RoKCkgPDwgIic+IjsKKyAgICAgIG91dHB1dFJlcGxhY2VtZW50WE1MKEktPmdldFJlcGxhY2VtZW50VGV4dCgpKTsKKyAgICAgIGxsdm06Om91dHMoKSA8PCAiPC9yZXBsYWNlbWVudD5cbiI7CiAgICAgfQogICAgIGxsdm06Om91dHMoKSA8PCAiPC9yZXBsYWNlbWVudHM+XG4iOwogICB9IGVsc2UgewpAQCAtMjI4LDYgKzI1NywxMSBAQAogfSAgLy8gbmFtZXNwYWNlIGZvcm1hdAogfSAgLy8gbmFtZXNwYWNlIGNsYW5nCiAKK3N0YXRpYyB2b2lkIFByaW50VmVyc2lvbigpIHsKKyAgcmF3X29zdHJlYW0gJk9TID0gb3V0cygpOworICBPUyA8PCBjbGFuZzo6Z2V0Q2xhbmdUb29sRnVsbFZlcnNpb24oImNsYW5nLWZvcm1hdCIpIDw8ICdcbic7Cit9CisKIGludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgewogICBsbHZtOjpzeXM6OlByaW50U3RhY2tUcmFjZU9uRXJyb3JTaWduYWwoKTsKIApAQCAtMjQxLDYgKzI3NSw3IEBACiAgICAgICBJLT5zZWNvbmQtPnNldEhpZGRlbkZsYWcoY2w6OlJlYWxseUhpZGRlbik7CiAgIH0KIAorICBjbDo6U2V0VmVyc2lvblByaW50ZXIoUHJpbnRWZXJzaW9uKTsKICAgY2w6OlBhcnNlQ29tbWFuZExpbmVPcHRpb25zKAogICAgICAgYXJnYywgYXJndiwKICAgICAgICJBIHRvb2wgdG8gZm9ybWF0IEMvQysrL09iai1DIGNvZGUuXG5cbiIKQEAgLTI1Niw3ICsyOTEsOCBAQAogICBpZiAoRHVtcENvbmZpZykgewogICAgIHN0ZDo6c3RyaW5nIENvbmZpZyA9CiAgICAgICAgIGNsYW5nOjpmb3JtYXQ6OmNvbmZpZ3VyYXRpb25Bc1RleHQoY2xhbmc6OmZvcm1hdDo6Z2V0U3R5bGUoCi0gICAgICAgICAgICBTdHlsZSwgRmlsZU5hbWVzLmVtcHR5KCkgPyBBc3N1bWVGaWxlbmFtZSA6IEZpbGVOYW1lc1swXSkpOworICAgICAgICAgICAgU3R5bGUsIEZpbGVOYW1lcy5lbXB0eSgpID8gQXNzdW1lRmlsZW5hbWUgOiBGaWxlTmFtZXNbMF0sCisgICAgICAgICAgICBGYWxsYmFja1N0eWxlKSk7CiAgICAgbGx2bTo6b3V0cygpIDw8IENvbmZpZyA8PCAiXG4iOwogICAgIHJldHVybiAwOwogICB9CmRpZmYgLS1naXQgYS90b29scy9jbGFuZy1mb3JtYXQvY2xhbmctZm9ybWF0LWRpZmYucHkgYi90b29scy9jbGFuZy1mb3JtYXQvY2xhbmctZm9ybWF0LWRpZmYucHkKaW5kZXggNjBiOGZiNy4uMzc2MjU3YiAxMDA3NTUKLS0tIGEvdG9vbHMvY2xhbmctZm9ybWF0L2NsYW5nLWZvcm1hdC1kaWZmLnB5CisrKyBiL3Rvb2xzL2NsYW5nLWZvcm1hdC9jbGFuZy1mb3JtYXQtZGlmZi5weQpAQCAtMzcsMTIgKzM3LDIwIEBACiBkZWYgbWFpbigpOgogICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlZm9ybWF0IGNoYW5nZWQgbGluZXMgaW4gZGlmZi4gV2l0aG91dCAtaSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcHRpb24ganVzdCBvdXRwdXQgdGhlIGRpZmYgdGhhdCB3b3VsZCBiZScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wdGlvbiBqdXN0IG91dHB1dCB0aGUgZGlmZiB0aGF0IHdvdWxkIGJlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ludHJvZHVjZWQuJykKICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWknLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2FwcGx5IGVkaXRzIHRvIGZpbGVzIGluc3RlYWQgb2YgZGlzcGxheWluZyBhIGRpZmYnKQotICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcCcsIGRlZmF1bHQ9MCwKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXAnLCBtZXRhdmFyPSdOVU0nLCBkZWZhdWx0PTAsCiAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3RyaXAgdGhlIHNtYWxsZXN0IHByZWZpeCBjb250YWluaW5nIFAgc2xhc2hlcycpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1yZWdleCcsIG1ldGF2YXI9J1BBVFRFUk4nLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nY3VzdG9tIHBhdHRlcm4gc2VsZWN0aW5nIGZpbGUgcGF0aHMgdG8gcmVmb3JtYXQgJworICAgICAgICAgICAgICAgICAgICAgICcoY2FzZSBzZW5zaXRpdmUsIG92ZXJyaWRlcyAtaXJlZ2V4KScpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1pcmVnZXgnLCBtZXRhdmFyPSdQQVRURVJOJywgZGVmYXVsdD0KKyAgICAgICAgICAgICAgICAgICAgICByJy4qXC4oY3BwfGNjfGNcK1wrfGN4eHxjfGNsfGh8aHBwfG18bW18aW5jfGpzfHByb3RvJworICAgICAgICAgICAgICAgICAgICAgIHInfHByb3RvZGV2ZWwpJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdjdXN0b20gcGF0dGVybiBzZWxlY3RpbmcgZmlsZSBwYXRocyB0byByZWZvcm1hdCAnCisgICAgICAgICAgICAgICAgICAgICAgJyhjYXNlIGluc2Vuc2l0aXZlLCBvdmVycmlkZGVuIGJ5IC1yZWdleCknKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgJy1zdHlsZScsCiAgICAgICBoZWxwPQpAQCAtNTksMTAgKzY3LDEyIEBACiAgICAgaWYgZmlsZW5hbWUgPT0gTm9uZToKICAgICAgIGNvbnRpbnVlCiAKLSAgICAjIEZJWE1FOiBBZGQgb3RoZXIgdHlwZXMgY29udGFpbmluZyBDKysvT2JqQyBjb2RlLgotICAgIGlmIG5vdCAoZmlsZW5hbWUuZW5kc3dpdGgoIi5jcHAiKSBvciBmaWxlbmFtZS5lbmRzd2l0aCgiLmNjIikgb3IKLSAgICAgICAgICAgIGZpbGVuYW1lLmVuZHN3aXRoKCIuaCIpKToKLSAgICAgIGNvbnRpbnVlCisgICAgaWYgYXJncy5yZWdleCBpcyBub3QgTm9uZToKKyAgICAgIGlmIG5vdCByZS5tYXRjaCgnXiVzJCcgJSBhcmdzLnJlZ2V4LCBmaWxlbmFtZSk6CisgICAgICAgIGNvbnRpbnVlCisgICAgZWxzZToKKyAgICAgIGlmIG5vdCByZS5tYXRjaCgnXiVzJCcgJSBhcmdzLmlyZWdleCwgZmlsZW5hbWUsIHJlLklHTk9SRUNBU0UpOgorICAgICAgICBjb250aW51ZQogCiAgICAgbWF0Y2ggPSByZS5zZWFyY2goJ15AQC4qXCsoXGQrKSgsKFxkKykpPycsIGxpbmUpCiAgICAgaWYgbWF0Y2g6CkBAIC04NSwxMSArOTUsOCBAQAogICAgIGlmIGFyZ3Muc3R5bGU6CiAgICAgICBjb21tYW5kLmV4dGVuZChbJy1zdHlsZScsIGFyZ3Muc3R5bGVdKQogICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPU5vbmUsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSkKICAgICBzdGRvdXQsIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQotICAgIGlmIHN0ZGVycjoKLSAgICAgIHByaW50IHN0ZGVycgogICAgIGlmIHAucmV0dXJuY29kZSAhPSAwOgogICAgICAgc3lzLmV4aXQocC5yZXR1cm5jb2RlKTsKIApAQCAtMTAyLDcgKzEwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhiZWZvcmUgZm9ybWF0dGluZyknLCAnKGFmdGVyIGZvcm1hdHRpbmcpJykKICAgICAgIGRpZmZfc3RyaW5nID0gc3RyaW5nLmpvaW4oZGlmZiwgJycpCiAgICAgICBpZiBsZW4oZGlmZl9zdHJpbmcpID4gMDoKLSAgICAgICAgcHJpbnQgZGlmZl9zdHJpbmcKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZShkaWZmX3N0cmluZykKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgbWFpbigpCmRpZmYgLS1naXQgYS90b29scy9jbGFuZy1mb3JtYXQvY2xhbmctZm9ybWF0LnB5IGIvdG9vbHMvY2xhbmctZm9ybWF0L2NsYW5nLWZvcm1hdC5weQppbmRleCBmNWE1NzU2Li4wYzBkYTZlIDEwMDY0NAotLS0gYS90b29scy9jbGFuZy1mb3JtYXQvY2xhbmctZm9ybWF0LnB5CisrKyBiL3Rvb2xzL2NsYW5nLWZvcm1hdC9jbGFuZy1mb3JtYXQucHkKQEAgLTMyLDQ4ICszMiw1MSBAQAogIyB1c2VkLgogc3R5bGUgPSAnZmlsZScKIAotIyBHZXQgdGhlIGN1cnJlbnQgdGV4dC4KLWJ1ZiA9IHZpbS5jdXJyZW50LmJ1ZmZlcgotdGV4dCA9ICdcbicuam9pbihidWYpCitkZWYgbWFpbigpOgorICAjIEdldCB0aGUgY3VycmVudCB0ZXh0LgorICBidWYgPSB2aW0uY3VycmVudC5idWZmZXIKKyAgdGV4dCA9ICdcbicuam9pbihidWYpCiAKLSMgRGV0ZXJtaW5lIHJhbmdlIHRvIGZvcm1hdC4KLWN1cnNvciA9IGludCh2aW0uZXZhbCgnbGluZTJieXRlKGxpbmUoIi4iKSkrY29sKCIuIiknKSkgLSAyCi1saW5lcyA9ICclczolcycgJSAodmltLmN1cnJlbnQucmFuZ2Uuc3RhcnQgKyAxLCB2aW0uY3VycmVudC5yYW5nZS5lbmQgKyAxKQorICAjIERldGVybWluZSByYW5nZSB0byBmb3JtYXQuCisgIGN1cnNvciA9IGludCh2aW0uZXZhbCgnbGluZTJieXRlKGxpbmUoIi4iKSkrY29sKCIuIiknKSkgLSAyCisgIGxpbmVzID0gJyVzOiVzJyAlICh2aW0uY3VycmVudC5yYW5nZS5zdGFydCArIDEsIHZpbS5jdXJyZW50LnJhbmdlLmVuZCArIDEpCiAKLSMgQXZvaWQgZmxhc2hpbmcgYW4gdWdseSwgdWdseSBjbWQgcHJvbXB0IG9uIFdpbmRvd3Mgd2hlbiBpbnZva2luZyBjbGFuZy1mb3JtYXQuCi1zdGFydHVwaW5mbyA9IE5vbmUKLWlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4zMicpOgotICBzdGFydHVwaW5mbyA9IHN1YnByb2Nlc3MuU1RBUlRVUElORk8oKQotICBzdGFydHVwaW5mby5kd0ZsYWdzIHw9IHN1YnByb2Nlc3MuU1RBUlRGX1VTRVNIT1dXSU5ET1cKLSAgc3RhcnR1cGluZm8ud1Nob3dXaW5kb3cgPSBzdWJwcm9jZXNzLlNXX0hJREUKKyAgIyBBdm9pZCBmbGFzaGluZyBhbiB1Z2x5LCB1Z2x5IGNtZCBwcm9tcHQgb24gV2luZG93cyB3aGVuIGludm9raW5nIGNsYW5nLWZvcm1hdC4KKyAgc3RhcnR1cGluZm8gPSBOb25lCisgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4zMicpOgorICAgIHN0YXJ0dXBpbmZvID0gc3VicHJvY2Vzcy5TVEFSVFVQSU5GTygpCisgICAgc3RhcnR1cGluZm8uZHdGbGFncyB8PSBzdWJwcm9jZXNzLlNUQVJURl9VU0VTSE9XV0lORE9XCisgICAgc3RhcnR1cGluZm8ud1Nob3dXaW5kb3cgPSBzdWJwcm9jZXNzLlNXX0hJREUKIAotIyBDYWxsIGZvcm1hdHRlci4KLWNvbW1hbmQgPSBbYmluYXJ5LCAnLWxpbmVzJywgbGluZXMsICctc3R5bGUnLCBzdHlsZSwgJy1jdXJzb3InLCBzdHIoY3Vyc29yKV0KLWlmIHZpbS5jdXJyZW50LmJ1ZmZlci5uYW1lOgotICBjb21tYW5kLmV4dGVuZChbJy1hc3N1bWUtZmlsZW5hbWUnLCB2aW0uY3VycmVudC5idWZmZXIubmFtZV0pCi1wID0gc3VicHJvY2Vzcy5Qb3Blbihjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3RhcnR1cGluZm89c3RhcnR1cGluZm8pCi1zdGRvdXQsIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoaW5wdXQ9dGV4dCkKKyAgIyBDYWxsIGZvcm1hdHRlci4KKyAgY29tbWFuZCA9IFtiaW5hcnksICctbGluZXMnLCBsaW5lcywgJy1zdHlsZScsIHN0eWxlLCAnLWN1cnNvcicsIHN0cihjdXJzb3IpXQorICBpZiB2aW0uY3VycmVudC5idWZmZXIubmFtZToKKyAgICBjb21tYW5kLmV4dGVuZChbJy1hc3N1bWUtZmlsZW5hbWUnLCB2aW0uY3VycmVudC5idWZmZXIubmFtZV0pCisgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3RhcnR1cGluZm89c3RhcnR1cGluZm8pCisgIHN0ZG91dCwgc3RkZXJyID0gcC5jb21tdW5pY2F0ZShpbnB1dD10ZXh0KQogCi0jIElmIHN1Y2Nlc3NmdWwsIHJlcGxhY2UgYnVmZmVyIGNvbnRlbnRzLgotaWYgc3RkZXJyOgotICBtZXNzYWdlID0gc3RkZXJyLnNwbGl0bGluZXMoKVswXQotICBwYXJ0cyA9IG1lc3NhZ2Uuc3BsaXQoJyAnLCAyKQotICBpZiBsZW4ocGFydHMpID4gMjoKLSAgICBtZXNzYWdlID0gcGFydHNbMl0KLSAgcHJpbnQgJ0Zvcm1hdHRpbmcgZmFpbGVkOiAlcyAodG90YWwgJWQgd2FybmluZ3MsICVkIGVycm9ycyknICUgKAotICAgICAgbWVzc2FnZSwgc3RkZXJyLmNvdW50KCd3YXJuaW5nOicpLCBzdGRlcnIuY291bnQoJ2Vycm9yOicpKQorICAjIElmIHN1Y2Nlc3NmdWwsIHJlcGxhY2UgYnVmZmVyIGNvbnRlbnRzLgorICBpZiBzdGRlcnI6CisgICAgbWVzc2FnZSA9IHN0ZGVyci5zcGxpdGxpbmVzKClbMF0KKyAgICBwYXJ0cyA9IG1lc3NhZ2Uuc3BsaXQoJyAnLCAyKQorICAgIGlmIGxlbihwYXJ0cykgPiAyOgorICAgICAgbWVzc2FnZSA9IHBhcnRzWzJdCisgICAgcHJpbnQgJ0Zvcm1hdHRpbmcgZmFpbGVkOiAlcyAodG90YWwgJWQgd2FybmluZ3MsICVkIGVycm9ycyknICUgKAorICAgICAgICBtZXNzYWdlLCBzdGRlcnIuY291bnQoJ3dhcm5pbmc6JyksIHN0ZGVyci5jb3VudCgnZXJyb3I6JykpCiAKLWlmIG5vdCBzdGRvdXQ6Ci0gIHByaW50ICgnTm8gb3V0cHV0IGZyb20gY2xhbmctZm9ybWF0IChjcmFzaGVkPykuXG4nICsKLSAgICAgICdQbGVhc2UgcmVwb3J0IHRvIGJ1Z3MubGx2bS5vcmcuJykKLWVsc2U6Ci0gIGxpbmVzID0gc3Rkb3V0LnNwbGl0KCdcbicpCi0gIG91dHB1dCA9IGpzb24ubG9hZHMobGluZXNbMF0pCi0gIGxpbmVzID0gbGluZXNbMTpdCi0gIHNlcXVlbmNlID0gZGlmZmxpYi5TZXF1ZW5jZU1hdGNoZXIoTm9uZSwgdmltLmN1cnJlbnQuYnVmZmVyLCBsaW5lcykKLSAgZm9yIG9wIGluIHJldmVyc2VkKHNlcXVlbmNlLmdldF9vcGNvZGVzKCkpOgotICAgIGlmIG9wWzBdIGlzIG5vdCAnZXF1YWwnOgotICAgICAgdmltLmN1cnJlbnQuYnVmZmVyW29wWzFdOm9wWzJdXSA9IGxpbmVzW29wWzNdOm9wWzRdXQotICB2aW0uY29tbWFuZCgnZ290byAlZCcgJSAob3V0cHV0WydDdXJzb3InXSArIDEpKQorICBpZiBub3Qgc3Rkb3V0OgorICAgIHByaW50ICgnTm8gb3V0cHV0IGZyb20gY2xhbmctZm9ybWF0IChjcmFzaGVkPykuXG4nICsKKyAgICAgICAgJ1BsZWFzZSByZXBvcnQgdG8gYnVncy5sbHZtLm9yZy4nKQorICBlbHNlOgorICAgIGxpbmVzID0gc3Rkb3V0LnNwbGl0KCdcbicpCisgICAgb3V0cHV0ID0ganNvbi5sb2FkcyhsaW5lc1swXSkKKyAgICBsaW5lcyA9IGxpbmVzWzE6XQorICAgIHNlcXVlbmNlID0gZGlmZmxpYi5TZXF1ZW5jZU1hdGNoZXIoTm9uZSwgdmltLmN1cnJlbnQuYnVmZmVyLCBsaW5lcykKKyAgICBmb3Igb3AgaW4gcmV2ZXJzZWQoc2VxdWVuY2UuZ2V0X29wY29kZXMoKSk6CisgICAgICBpZiBvcFswXSBpcyBub3QgJ2VxdWFsJzoKKyAgICAgICAgdmltLmN1cnJlbnQuYnVmZmVyW29wWzFdOm9wWzJdXSA9IGxpbmVzW29wWzNdOm9wWzRdXQorICAgIHZpbS5jb21tYW5kKCdnb3RvICVkJyAlIChvdXRwdXRbJ0N1cnNvciddICsgMSkpCisKK21haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGlhZy1idWlsZC9kaWFnLWJ1aWxkLnNoIGIvdG9vbHMvZGlhZy1idWlsZC9kaWFnLWJ1aWxkLnNoCmluZGV4IDRmZWY4ZmIuLjAxODI4OGQgMTAwNzU1Ci0tLSBhL3Rvb2xzL2RpYWctYnVpbGQvZGlhZy1idWlsZC5zaAorKysgYi90b29scy9kaWFnLWJ1aWxkL2RpYWctYnVpbGQuc2gKQEAgLTEsNSArMSwxNCBAQAogIyEvYmluL2Jhc2gKIAorIyBkaWFnLWJ1aWxkOiBhIHRvb2wgc2hvd2luZyBlbmFibGVkIHdhcm5pbmdzIGluIGEgcHJvamVjdC4KKyMKKyMgZGlhZy1idWlsZCBhY3RzIGFzIGEgd3JhcHBlciBmb3IgJ2RpYWd0b29sIHNob3ctZW5hYmxlZCcsIGluIHRoZSBzYW1lIHdheQorIyB0aGF0IHNjYW4tYnVpbGQgYWN0cyBhcyBhIHdyYXBwZXIgZm9yIHRoZSBzdGF0aWMgYW5hbHl6ZXIuIFRoZSBjb21tb24gY2FzZSBpcworIyBzaW1wbGU6IHVzZSAnZGlhZy1idWlsZCBtYWtlJyBvciAnZGlhZy1idWlsZCB4Y29kZWJ1aWxkJyB0byBsaXN0IHRoZSB3YXJuaW5ncworIyBlbmFibGVkIGZvciB0aGUgZmlyc3QgY29tcGlsYXRpb24gY29tbWFuZCB3ZSBzZWUuIE90aGVyIGJ1aWxkIHN5c3RlbXMgcmVxdWlyZQorIyB5b3UgdG8gbWFudWFsbHkgc3BlY2lmeSAiZHJ5LXJ1biIgYW5kICJ1c2UgJENDIGFuZCAkQ1hYIjsgaWYgdGhlcmUgaXMgYSBidWlsZAorIyBzeXN0ZW0geW91IGFyZSBpbnRlcmVzdGVkIGluLCBwbGVhc2UgYWRkIGl0IHRvIHRoZSBzd2l0Y2ggc3RhdGVtZW50LgorCiBwcmludF91c2FnZSAoKSB7CiAgICAgZWNobyAnVXNhZ2U6IGRpYWctYnVpbGQuc2ggWy12XSB4Y29kZWJ1aWxkIFtmbGFnc10nCiAgICAgZWNobyAnICAgICAgIGRpYWctYnVpbGQuc2ggWy12XSBtYWtlIFtmbGFnc10nCmRpZmYgLS1naXQgYS90b29scy9kaWFndG9vbC9DTWFrZUxpc3RzLnR4dCBiL3Rvb2xzL2RpYWd0b29sL0NNYWtlTGlzdHMudHh0CmluZGV4IDhhYTJkMjEuLmU4OGMyYWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RpYWd0b29sL0NNYWtlTGlzdHMudHh0CisrKyBiL3Rvb2xzL2RpYWd0b29sL0NNYWtlTGlzdHMudHh0CkBAIC0xLDkgKzEsNSBAQAogc2V0KExMVk1fTElOS19DT01QT05FTlRTCi0gICR7TExWTV9UQVJHRVRTX1RPX0JVSUxEfQotICBhc21wYXJzZXIKLSAgYml0cmVhZGVyCi0gIHN1cHBvcnQKLSAgbWMKKyAgU3VwcG9ydAogICApCiAKIGFkZF9jbGFuZ19leGVjdXRhYmxlKGRpYWd0b29sCkBAIC0xNSwxNCArMTEsOCBAQAogICBUcmVlVmlldy5jcHAKICkKIAotYWRkX2RlcGVuZGVuY2llcyhkaWFndG9vbAotICBDbGFuZ0RpYWdub3N0aWNJbmRleE5hbWUKLSAgKQotCiB0YXJnZXRfbGlua19saWJyYXJpZXMoZGlhZ3Rvb2wKICAgY2xhbmdCYXNpYwotICBjbGFuZ0xleAotICBjbGFuZ1NlbWEKICAgY2xhbmdGcm9udGVuZAogICApCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2RpYWd0b29sL0RpYWdUb29sLmggYi90b29scy9kaWFndG9vbC9EaWFnVG9vbC5oCmluZGV4IDkzZDUzMWIuLmIxZTY5ZjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RpYWd0b29sL0RpYWdUb29sLmgKKysrIGIvdG9vbHMvZGlhZ3Rvb2wvRGlhZ1Rvb2wuaApAQCAtNjIsNyArNjIsNyBAQAogcHVibGljOlwKICAgQ0xTTkFNRSgpIDogRGlhZ1Rvb2woTkFNRSwgREVTQykge31cCiAgIHZpcnR1YWwgfkNMU05BTUUoKSB7fVwKLSAgdmlydHVhbCBpbnQgcnVuKHVuc2lnbmVkIGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgbGx2bTo6cmF3X29zdHJlYW0gJm91dCk7XAorICBpbnQgcnVuKHVuc2lnbmVkIGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgbGx2bTo6cmF3X29zdHJlYW0gJm91dCkgb3ZlcnJpZGU7XAogfTtcCiBkaWFndG9vbDo6UmVnaXN0ZXJEaWFnVG9vbDxDTFNOQU1FPiBSZWdpc3RlciMjQ0xTTkFNRTtcCiB9CmRpZmYgLS1naXQgYS90b29scy9kaWFndG9vbC9TaG93RW5hYmxlZFdhcm5pbmdzLmNwcCBiL3Rvb2xzL2RpYWd0b29sL1Nob3dFbmFibGVkV2FybmluZ3MuY3BwCmluZGV4IGJjYzc1MjAuLmFkNTZiMDMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RpYWd0b29sL1Nob3dFbmFibGVkV2FybmluZ3MuY3BwCisrKyBiL3Rvb2xzL2RpYWd0b29sL1Nob3dFbmFibGVkV2FybmluZ3MuY3BwCkBAIC00NCw2ICs0NCw3IEBACiAgIHN3aXRjaCAoTGV2ZWwpIHsKICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6SWdub3JlZDogcmV0dXJuICcgJzsKICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6Tm90ZTogICAgcmV0dXJuICctJzsKKyAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6UmVtYXJrOiAgcmV0dXJuICdSJzsKICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6V2FybmluZzogcmV0dXJuICdXJzsKICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3I6ICAgcmV0dXJuICdFJzsKICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6RmF0YWw6ICAgcmV0dXJuICdGJzsKQEAgLTYzLDkgKzY0LDkgQEAKICAgICBuZXcgRGlhZ25vc3RpY3NFbmdpbmUoRGlhZ0lEcywgbmV3IERpYWdub3N0aWNPcHRpb25zKCksIERpYWdzQnVmZmVyKSk7CiAKICAgLy8gVHJ5IHRvIGJ1aWxkIGEgQ29tcGlsZXJJbnZvY2F0aW9uLgotICBPd25pbmdQdHI8Q29tcGlsZXJJbnZvY2F0aW9uPiBJbnZvY2F0aW9uKAotICAgIGNyZWF0ZUludm9jYXRpb25Gcm9tQ29tbWFuZExpbmUoQXJyYXlSZWY8Y29uc3QgY2hhciAqPihhcmd2LCBhcmdjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVyaW1EaWFncykpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsZXJJbnZvY2F0aW9uPiBJbnZvY2F0aW9uKAorICAgICAgY3JlYXRlSW52b2NhdGlvbkZyb21Db21tYW5kTGluZShBcnJheVJlZjxjb25zdCBjaGFyICo+KGFyZ3YsIGFyZ2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmltRGlhZ3MpKTsKICAgaWYgKCFJbnZvY2F0aW9uKQogICAgIHJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS90b29scy9kcml2ZXIvQ01ha2VMaXN0cy50eHQgYi90b29scy9kcml2ZXIvQ01ha2VMaXN0cy50eHQKaW5kZXggYzk0YmM3Ny4uZjYwMTYyZiAxMDA2NDQKLS0tIGEvdG9vbHMvZHJpdmVyL0NNYWtlTGlzdHMudHh0CisrKyBiL3Rvb2xzL2RyaXZlci9DTWFrZUxpc3RzLnR4dApAQCAtMSwxNiArMSwyOSBAQAogc2V0KCBMTFZNX0xJTktfQ09NUE9ORU5UUwogICAke0xMVk1fVEFSR0VUU19UT19CVUlMRH0KLSAgYXNtcGFyc2VyCi0gIGJpdHJlYWRlcgotICBiaXR3cml0ZXIKLSAgaXJyZWFkZXIKLSAgY29kZWdlbgotICBpbnN0cnVtZW50YXRpb24KLSAgaXBvCi0gIGxpbmtlcgotICBzZWxlY3Rpb25kYWcKKyAgQW5hbHlzaXMKKyAgQ29yZQorICBJUEEKKyAgSVBPCisgIEluc3RDb21iaW5lCisgIEluc3RydW1lbnRhdGlvbgorICBNQworICBNQ1BhcnNlcgorICBPYmpDQVJDT3B0cworICBPcHRpb24KKyAgU2NhbGFyT3B0cworICBTdXBwb3J0CisgIFRyYW5zZm9ybVV0aWxzCisgIFZlY3Rvcml6ZQogICApCiAKK29wdGlvbihDTEFOR19QTFVHSU5fU1VQUE9SVCAiQnVpbGQgY2xhbmcgd2l0aCBwbHVnaW4gc3VwcG9ydCIgT04pCisKKyMgU3VwcG9ydCBwbHVnaW5zLiBUaGlzIG11c3QgYmUgYmVmb3JlIGFkZF9jbGFuZ19leGVjdXRhYmxlIGFzIGl0IHJlYWRzCisjIExMVk1fTk9fREVBRF9TVFJJUC4KK2lmKENMQU5HX1BMVUdJTl9TVVBQT1JUKQorICBzZXQoTExWTV9OT19ERUFEX1NUUklQIDEpCitlbmRpZigpCisKIGFkZF9jbGFuZ19leGVjdXRhYmxlKGNsYW5nCiAgIGRyaXZlci5jcHAKICAgY2MxX21haW4uY3BwCkBAIC0xOCw0NCArMzEsMTggQEAKICAgKQogCiB0YXJnZXRfbGlua19saWJyYXJpZXMoY2xhbmcKLSAgY2xhbmdGcm9udGVuZFRvb2wKLSAgY2xhbmdBU1QKLSAgY2xhbmdBbmFseXNpcwogICBjbGFuZ0Jhc2ljCi0gIGNsYW5nQ29kZUdlbgogICBjbGFuZ0RyaXZlcgotICBjbGFuZ0VkaXQKICAgY2xhbmdGcm9udGVuZAotICBjbGFuZ0xleAotICBjbGFuZ1BhcnNlCi0gIGNsYW5nRWRpdAotICBjbGFuZ1NlbWEKLSAgY2xhbmdTZXJpYWxpemF0aW9uCisgIGNsYW5nRnJvbnRlbmRUb29sCiAgICkKIAotaWYoQ0xBTkdfRU5BQkxFX1NUQVRJQ19BTkFMWVpFUikKLSAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNsYW5nCi0gICAgY2xhbmdTdGF0aWNBbmFseXplckZyb250ZW5kCi0gICAgY2xhbmdTdGF0aWNBbmFseXplckNoZWNrZXJzCi0gICAgY2xhbmdTdGF0aWNBbmFseXplckNvcmUKLSAgICApCi1lbmRpZigpCi0KLWlmKENMQU5HX0VOQUJMRV9BUkNNVCkKLSAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNsYW5nCi0gICAgY2xhbmdBUkNNaWdyYXRlCi0gICAgKQotZW5kaWYoKQotCi1pZihDTEFOR19FTkFCTEVfUkVXUklURVIpCi0gIHRhcmdldF9saW5rX2xpYnJhcmllcyhjbGFuZwotICAgIGNsYW5nUmV3cml0ZUNvcmUKLSAgICBjbGFuZ1Jld3JpdGVGcm9udGVuZAotICAgICkKLWVuZGlmKCkKLQogc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGNsYW5nIFBST1BFUlRJRVMgVkVSU0lPTiAke0NMQU5HX0VYRUNVVEFCTEVfVkVSU0lPTn0pCi1zZXRfdGFyZ2V0X3Byb3BlcnRpZXMoY2xhbmcgUFJPUEVSVElFUyBFTkFCTEVfRVhQT1JUUyAxKQorCisjIFN1cHBvcnQgcGx1Z2lucy4KK2lmKENMQU5HX1BMVUdJTl9TVVBQT1JUKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoY2xhbmcgUFJPUEVSVElFUyBFTkFCTEVfRVhQT1JUUyAxKQorZW5kaWYoKQogCiBhZGRfZGVwZW5kZW5jaWVzKGNsYW5nIGNsYW5nLWhlYWRlcnMpCiAKQEAgLTY1LDIxICs1MiwyMyBAQAogICBzZXQoY2xhbmdfYmluYXJ5ICJjbGFuZyR7Q01BS0VfRVhFQ1VUQUJMRV9TVUZGSVh9IikKIGVsc2UoKQogICBzZXQoQ0xBTkdYWF9MSU5LX09SX0NPUFkgY29weSkKLSAgc2V0KGNsYW5nX2JpbmFyeSAiJHtDTUFLRV9SVU5USU1FX09VVFBVVF9ESVJFQ1RPUll9LyR7Q01BS0VfQ0ZHX0lOVERJUn0vY2xhbmcke0NNQUtFX0VYRUNVVEFCTEVfU1VGRklYfSIpCisgIHNldChjbGFuZ19iaW5hcnkgIiR7TExWTV9SVU5USU1FX09VVFBVVF9JTlRESVJ9L2NsYW5nJHtDTUFLRV9FWEVDVVRBQkxFX1NVRkZJWH0iKQogZW5kaWYoKQogCiAjIENyZWF0ZSB0aGUgY2xhbmcrKyBzeW1saW5rIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuCi1zZXQoY2xhbmdfcHAgIiR7Q01BS0VfUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZfS8ke0NNQUtFX0NGR19JTlRESVJ9L2NsYW5nKyske0NNQUtFX0VYRUNVVEFCTEVfU1VGRklYfSIpCitzZXQoY2xhbmdfcHAgIiR7TExWTV9SVU5USU1FX09VVFBVVF9JTlRESVJ9L2NsYW5nKyske0NNQUtFX0VYRUNVVEFCTEVfU1VGRklYfSIpCiBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIGNsYW5nIFBPU1RfQlVJTEQKLSAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgJHtDTEFOR1hYX0xJTktfT1JfQ09QWX0gIiR7Y2xhbmdfYmluYXJ5fSIgIiR7Y2xhbmdfcHB9IikKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgJHtDTEFOR1hYX0xJTktfT1JfQ09QWX0gIiR7Y2xhbmdfYmluYXJ5fSIgIiR7Y2xhbmdfcHB9IgorICAgIFdPUktJTkdfRElSRUNUT1JZICIke0xMVk1fUlVOVElNRV9PVVRQVVRfSU5URElSfSIpCiAKIHNldF9wcm9wZXJ0eShESVJFQ1RPUlkgQVBQRU5ECiAgIFBST1BFUlRZIEFERElUSU9OQUxfTUFLRV9DTEVBTl9GSUxFUyAke2NsYW5nX3BwfSkKIAogIyBDcmVhdGUgdGhlIGNsYW5nLWNsIHN5bWxpbmsgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KLXNldChjbGFuZ19jbCAiJHtDTUFLRV9SVU5USU1FX09VVFBVVF9ESVJFQ1RPUll9LyR7Q01BS0VfQ0ZHX0lOVERJUn0vY2xhbmctY2wke0NNQUtFX0VYRUNVVEFCTEVfU1VGRklYfSIpCitzZXQoY2xhbmdfY2wgIiR7TExWTV9SVU5USU1FX09VVFBVVF9JTlRESVJ9L2NsYW5nLWNsJHtDTUFLRV9FWEVDVVRBQkxFX1NVRkZJWH0iKQogYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBjbGFuZyBQT1NUX0JVSUxECi0gICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FICR7Q0xBTkdYWF9MSU5LX09SX0NPUFl9ICIke2NsYW5nX2JpbmFyeX0iICIke2NsYW5nX2NsfSIpCisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FICR7Q0xBTkdYWF9MSU5LX09SX0NPUFl9ICIke2NsYW5nX2JpbmFyeX0iICIke2NsYW5nX2NsfSIKKyAgICBXT1JLSU5HX0RJUkVDVE9SWSAiJHtMTFZNX1JVTlRJTUVfT1VUUFVUX0lOVERJUn0iKQogCiBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORAogICBQUk9QRVJUWSBBRERJVElPTkFMX01BS0VfQ0xFQU5fRklMRVMgJHtjbGFuZ19jbH0pCkBAIC0xMjEsMyArMTEwLDExIEBACiAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhjbGFuZyAiLVdsLC1vcmRlcl9maWxlLCR7Q0xBTkdfT1JERVJfRklMRX0iKQogZW5kaWYoKQogCitpZihXSVRIX1BPTExZIEFORCBMSU5LX1BPTExZX0lOVE9fVE9PTFMpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhjbGFuZyBQb2xseSkKKyAgaWYoUE9MTFlfTElOS19MSUJTKQorICAgIGZvcmVhY2gobGliICR7UE9MTFlfTElOS19MSUJTfSkKKyAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhjbGFuZyAke2xpYn0pCisgICAgZW5kZm9yZWFjaChsaWIpCisgIGVuZGlmKFBPTExZX0xJTktfTElCUykKK2VuZGlmKFdJVEhfUE9MTFkgQU5EIExJTktfUE9MTFlfSU5UT19UT09MUykKZGlmZiAtLWdpdCBhL3Rvb2xzL2RyaXZlci9NYWtlZmlsZSBiL3Rvb2xzL2RyaXZlci9NYWtlZmlsZQppbmRleCBmN2E5ZjhmLi5kNzViMTljIDEwMDY0NAotLS0gYS90b29scy9kcml2ZXIvTWFrZWZpbGUKKysrIGIvdG9vbHMvZHJpdmVyL01ha2VmaWxlCkBAIC0xMSwxMiArMTEsNiBAQAogVE9PTE5BTUUgPSBjbGFuZwogVE9PTEFMSUFTID0gY2xhbmcrKwogCi0jIFdlIGRvbid0IGN1cnJlbnRseSBleHBlY3QgcHJvZHVjdGlvbiBDbGFuZyBidWlsZHMgdG8gYmUgaW50ZXJlc3RlZCBpbgotIyBwbHVnaW5zLiBUaGlzIGlzIGltcG9ydGFudCBmb3Igc3RhcnR1cCBwZXJmb3JtYW5jZS4KLWlmZGVmIENMQU5HX0lTX1BST0RVQ1RJT04KLVRPT0xfTk9fRVhQT1JUUyA6PSAxCi1lbmRpZgotCiBpZmRlZiBDTEFOR19PUkRFUl9GSUxFCiBUT09MX09SREVSX0ZJTEUgOj0gJChDTEFOR19PUkRFUl9GSUxFKQogZW5kaWYKQEAgLTI5LDggKzIzLDE3IEBACiAjIExJTktfQ09NUE9ORU5UUyBiZWZvcmUgaW5jbHVkaW5nIE1ha2VmaWxlLnJ1bGVzCiBpbmNsdWRlICQoQ0xBTkdfTEVWRUwpLy4uLy4uL01ha2VmaWxlLmNvbmZpZwogCisjIEhhdmUgdGhlIG9wdGlvbiBvZiBub3Qgc3VwcG9ydGluZyBwbHVnaW5zLiBUaGlzIGlzIGltcG9ydGFudCBmb3Igc3RhcnR1cAorIyBwZXJmb3JtYW5jZS4KK2lmZXEgKCQoQ0xBTkdfUExVR0lOX1NVUFBPUlQpLCAxKQorTk9fREVBRF9TVFJJUCA6PSAxCitlbHNlCitUT09MX05PX0VYUE9SVFMgOj0gMQorZW5kaWYKKwogTElOS19DT01QT05FTlRTIDo9ICQoVEFSR0VUU19UT19CVUlMRCkgYXNtcGFyc2VyIGJpdHJlYWRlciBiaXR3cml0ZXIgY29kZWdlbiBcCi0gICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudGF0aW9uIGlwbyBpcnJlYWRlciBsaW5rZXIgc2VsZWN0aW9uZGFnIG9wdGlvbgorICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnRhdGlvbiBpcG8gaXJyZWFkZXIgbGlua2VyIG9iamNhcmNvcHRzIG9wdGlvbiBcCisgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uZGFnCiBVU0VETElCUyA9IGNsYW5nRnJvbnRlbmRUb29sLmEgY2xhbmdGcm9udGVuZC5hIGNsYW5nRHJpdmVyLmEgXAogICAgICAgICAgICBjbGFuZ1NlcmlhbGl6YXRpb24uYSBjbGFuZ0NvZGVHZW4uYSBjbGFuZ1BhcnNlLmEgY2xhbmdTZW1hLmEKIApAQCAtNDcsNyArNTAsNyBAQAogVVNFRExJQlMgKz0gY2xhbmdSZXdyaXRlRnJvbnRlbmQuYSBjbGFuZ1Jld3JpdGVDb3JlLmEKIGVuZGlmCiAKLVVTRURMSUJTICs9IGNsYW5nQW5hbHlzaXMuYSBjbGFuZ0VkaXQuYSBjbGFuZ0FTVC5hIGNsYW5nQmFzaWMuYSBjbGFuZ0xleC5hCitVU0VETElCUyArPSBjbGFuZ0FuYWx5c2lzLmEgY2xhbmdFZGl0LmEgY2xhbmdBU1QuYSBjbGFuZ0xleC5hIGNsYW5nQmFzaWMuYQogCiBpbmNsdWRlICQoQ0xBTkdfTEVWRUwpL01ha2VmaWxlCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2RyaXZlci9jYzFfbWFpbi5jcHAgYi90b29scy9kcml2ZXIvY2MxX21haW4uY3BwCmluZGV4IDViM2I1YWQuLjk5MGM0ZmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RyaXZlci9jYzFfbWFpbi5jcHAKKysrIGIvdG9vbHMvZHJpdmVyL2NjMV9tYWluLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0Zyb250ZW5kRGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL1RleHREaWFnbm9zdGljQnVmZmVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWNQcmludGVyLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvVXRpbHMuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZFRvb2wvVXRpbHMuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdGF0aXN0aWMuaCIKICNpbmNsdWRlICJsbHZtL0xpbmtBbGxQYXNzZXMuaCIKQEAgLTU2LDkgKzU3LDE1IEBACiAgIGV4aXQoR2VuQ3Jhc2hEaWFnID8gNzAgOiAxKTsKIH0KIAorI2lmZGVmIExJTktfUE9MTFlfSU5UT19UT09MUworbmFtZXNwYWNlIHBvbGx5IHsKK3ZvaWQgaW5pdGlhbGl6ZVBvbGx5UGFzc2VzKGxsdm06OlBhc3NSZWdpc3RyeSAmUmVnaXN0cnkpOworfQorI2VuZGlmCisKIGludCBjYzFfbWFpbihjb25zdCBjaGFyICoqQXJnQmVnaW4sIGNvbnN0IGNoYXIgKipBcmdFbmQsCiAgICAgICAgICAgICAgY29uc3QgY2hhciAqQXJndjAsIHZvaWQgKk1haW5BZGRyKSB7Ci0gIE93bmluZ1B0cjxDb21waWxlckluc3RhbmNlPiBDbGFuZyhuZXcgQ29tcGlsZXJJbnN0YW5jZSgpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENvbXBpbGVySW5zdGFuY2U+IENsYW5nKG5ldyBDb21waWxlckluc3RhbmNlKCkpOwogICBJbnRydXNpdmVSZWZDbnRQdHI8RGlhZ25vc3RpY0lEcz4gRGlhZ0lEKG5ldyBEaWFnbm9zdGljSURzKCkpOwogCiAgIC8vIEluaXRpYWxpemUgdGFyZ2V0cyBmaXJzdCwgc28gdGhhdCAtLXZlcnNpb24gc2hvd3MgcmVnaXN0ZXJlZCB0YXJnZXRzLgpAQCAtNjcsNiArNzQsMTEgQEAKICAgbGx2bTo6SW5pdGlhbGl6ZUFsbEFzbVByaW50ZXJzKCk7CiAgIGxsdm06OkluaXRpYWxpemVBbGxBc21QYXJzZXJzKCk7CiAKKyNpZmRlZiBMSU5LX1BPTExZX0lOVE9fVE9PTFMKKyAgbGx2bTo6UGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSA9ICpsbHZtOjpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpOworICBwb2xseTo6aW5pdGlhbGl6ZVBvbGx5UGFzc2VzKFJlZ2lzdHJ5KTsKKyNlbmRpZgorCiAgIC8vIEJ1ZmZlciBkaWFnbm9zdGljcyBmcm9tIGFyZ3VtZW50IHBhcnNpbmcgc28gdGhhdCB3ZSBjYW4gb3V0cHV0IHRoZW0gdXNpbmcgYQogICAvLyB3ZWxsIGZvcm1lZCBkaWFnbm9zdGljIG9iamVjdC4KICAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNPcHRpb25zPiBEaWFnT3B0cyA9IG5ldyBEaWFnbm9zdGljT3B0aW9ucygpOwpAQCAtMTEyLDcgKzEyNCw3IEBACiAgIGlmIChDbGFuZy0+Z2V0RnJvbnRlbmRPcHRzKCkuRGlzYWJsZUZyZWUpIHsKICAgICBpZiAobGx2bTo6QXJlU3RhdGlzdGljc0VuYWJsZWQoKSB8fCBDbGFuZy0+Z2V0RnJvbnRlbmRPcHRzKCkuU2hvd1N0YXRzKQogICAgICAgbGx2bTo6UHJpbnRTdGF0aXN0aWNzKCk7Ci0gICAgQ2xhbmcudGFrZSgpOworICAgIEJ1cnlQb2ludGVyKENsYW5nLnJlbGVhc2UoKSk7CiAgICAgcmV0dXJuICFTdWNjZXNzOwogICB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2RyaXZlci9jYzFhc19tYWluLmNwcCBiL3Rvb2xzL2RyaXZlci9jYzFhc19tYWluLmNwcAppbmRleCAzMWNkMjM2Li44NTIxYzJhIDEwMDY0NAotLS0gYS90b29scy9kcml2ZXIvY2MxYXNfbWFpbi5jcHAKKysrIGIvdG9vbHMvZHJpdmVyL2NjMWFzX21haW4uY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmREaWFnbm9zdGljLmgiCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvVGV4dERpYWdub3N0aWNQcmludGVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvVXRpbHMuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTd2l0Y2guaCIKICNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKICNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKQEAgLTU0LDYgKzUzLDcgQEAKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVGltZXIuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvc3lzdGVtX2Vycm9yLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOjpkcml2ZXI7CiB1c2luZyBuYW1lc3BhY2UgbGx2bTsKQEAgLTg1LDYgKzg1LDcgQEAKICAgdW5zaWduZWQgTm9Jbml0aWFsVGV4dFNlY3Rpb24gOiAxOwogICB1bnNpZ25lZCBTYXZlVGVtcG9yYXJ5TGFiZWxzIDogMTsKICAgdW5zaWduZWQgR2VuRHdhcmZGb3JBc3NlbWJseSA6IDE7CisgIHVuc2lnbmVkIENvbXByZXNzRGVidWdTZWN0aW9ucyA6IDE7CiAgIHN0ZDo6c3RyaW5nIER3YXJmRGVidWdGbGFnczsKICAgc3RkOjpzdHJpbmcgRHdhcmZEZWJ1Z1Byb2R1Y2VyOwogICBzdGQ6OnN0cmluZyBEZWJ1Z0NvbXBpbGF0aW9uRGlyOwpAQCAtMTUxLDEwICsxNTIsMTAgQEAKICAgYm9vbCBTdWNjZXNzID0gdHJ1ZTsKIAogICAvLyBQYXJzZSB0aGUgYXJndW1lbnRzLgotICBPd25pbmdQdHI8T3B0VGFibGU+IE9wdFRibChjcmVhdGVDQzFBc09wdFRhYmxlKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8T3B0VGFibGU+IE9wdFRibChjcmVhdGVDQzFBc09wdFRhYmxlKCkpOwogICB1bnNpZ25lZCBNaXNzaW5nQXJnSW5kZXgsIE1pc3NpbmdBcmdDb3VudDsKLSAgT3duaW5nUHRyPElucHV0QXJnTGlzdD4gQXJncygKLSAgICBPcHRUYmwtPlBhcnNlQXJncyhBcmdCZWdpbiwgQXJnRW5kLE1pc3NpbmdBcmdJbmRleCwgTWlzc2luZ0FyZ0NvdW50KSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEFyZ0xpc3Q+IEFyZ3MoCisgICAgICBPcHRUYmwtPlBhcnNlQXJncyhBcmdCZWdpbiwgQXJnRW5kLCBNaXNzaW5nQXJnSW5kZXgsIE1pc3NpbmdBcmdDb3VudCkpOwogCiAgIC8vIENoZWNrIGZvciBtaXNzaW5nIGFyZ3VtZW50IGVycm9yLgogICBpZiAoTWlzc2luZ0FyZ0NvdW50KSB7CkBAIC0xODYsNiArMTg3LDcgQEAKICAgT3B0cy5Ob0luaXRpYWxUZXh0U2VjdGlvbiA9IEFyZ3MtPmhhc0FyZyhPUFRfbik7CiAgIE9wdHMuU2F2ZVRlbXBvcmFyeUxhYmVscyA9IEFyZ3MtPmhhc0FyZyhPUFRfbXNhdmVfdGVtcF9sYWJlbHMpOwogICBPcHRzLkdlbkR3YXJmRm9yQXNzZW1ibHkgPSBBcmdzLT5oYXNBcmcoT1BUX2cpOworICBPcHRzLkNvbXByZXNzRGVidWdTZWN0aW9ucyA9IEFyZ3MtPmhhc0FyZyhPUFRfY29tcHJlc3NfZGVidWdfc2VjdGlvbnMpOwogICBPcHRzLkR3YXJmRGVidWdGbGFncyA9IEFyZ3MtPmdldExhc3RBcmdWYWx1ZShPUFRfZHdhcmZfZGVidWdfZmxhZ3MpOwogICBPcHRzLkR3YXJmRGVidWdQcm9kdWNlciA9IEFyZ3MtPmdldExhc3RBcmdWYWx1ZShPUFRfZHdhcmZfZGVidWdfcHJvZHVjZXIpOwogICBPcHRzLkRlYnVnQ29tcGlsYXRpb25EaXIgPSBBcmdzLT5nZXRMYXN0QXJnVmFsdWUoT1BUX2ZkZWJ1Z19jb21waWxhdGlvbl9kaXIpOwpAQCAtMjUxLDcgKzI1Myw3IEBACiAgIHN0ZDo6c3RyaW5nIEVycm9yOwogICByYXdfZmRfb3N0cmVhbSAqT3V0ID0KICAgICAgIG5ldyByYXdfZmRfb3N0cmVhbShPcHRzLk91dHB1dFBhdGguY19zdHIoKSwgRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKEJpbmFyeSA/IHN5czo6ZnM6OkZfQmluYXJ5IDogc3lzOjpmczo6Rl9Ob25lKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgKEJpbmFyeSA/IHN5czo6ZnM6OkZfTm9uZSA6IHN5czo6ZnM6OkZfVGV4dCkpOwogICBpZiAoIUVycm9yLmVtcHR5KCkpIHsKICAgICBEaWFncy5SZXBvcnQoZGlhZzo6ZXJyX2ZlX3VuYWJsZV90b19vcGVuX291dHB1dCkKICAgICAgIDw8IE9wdHMuT3V0cHV0UGF0aCA8PCBFcnJvcjsKQEAgLTI3MSwxMyArMjczLDEzIEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgT3duaW5nUHRyPE1lbW9yeUJ1ZmZlcj4gQnVmZmVyUHRyOworICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCdWZmZXJQdHI7CiAgIGlmIChlcnJvcl9jb2RlIGVjID0gTWVtb3J5QnVmZmVyOjpnZXRGaWxlT3JTVERJTihPcHRzLklucHV0RmlsZSwgQnVmZmVyUHRyKSkgewogICAgIEVycm9yID0gZWMubWVzc2FnZSgpOwogICAgIERpYWdzLlJlcG9ydChkaWFnOjplcnJfZmVfZXJyb3JfcmVhZGluZykgPDwgT3B0cy5JbnB1dEZpbGU7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIE1lbW9yeUJ1ZmZlciAqQnVmZmVyID0gQnVmZmVyUHRyLnRha2UoKTsKKyAgTWVtb3J5QnVmZmVyICpCdWZmZXIgPSBCdWZmZXJQdHIucmVsZWFzZSgpOwogCiAgIFNvdXJjZU1nciBTcmNNZ3I7CiAKQEAgLTI4OCwxMiArMjkwLDE3IEBACiAgIC8vIGl0IGxhdGVyLgogICBTcmNNZ3Iuc2V0SW5jbHVkZURpcnMoT3B0cy5JbmNsdWRlUGF0aHMpOwogCi0gIE93bmluZ1B0cjxNQ1JlZ2lzdGVySW5mbz4gTVJJKFRoZVRhcmdldC0+Y3JlYXRlTUNSZWdJbmZvKE9wdHMuVHJpcGxlKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNQ1JlZ2lzdGVySW5mbz4gTVJJKFRoZVRhcmdldC0+Y3JlYXRlTUNSZWdJbmZvKE9wdHMuVHJpcGxlKSk7CiAgIGFzc2VydChNUkkgJiYgIlVuYWJsZSB0byBjcmVhdGUgdGFyZ2V0IHJlZ2lzdGVyIGluZm8hIik7CiAKLSAgT3duaW5nUHRyPE1DQXNtSW5mbz4gTUFJKFRoZVRhcmdldC0+Y3JlYXRlTUNBc21JbmZvKCpNUkksIE9wdHMuVHJpcGxlKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNQ0FzbUluZm8+IE1BSShUaGVUYXJnZXQtPmNyZWF0ZU1DQXNtSW5mbygqTVJJLCBPcHRzLlRyaXBsZSkpOwogICBhc3NlcnQoTUFJICYmICJVbmFibGUgdG8gY3JlYXRlIHRhcmdldCBhc20gaW5mbyEiKTsKIAorICAvLyBFbnN1cmUgTUNBc21JbmZvIGluaXRpYWxpemF0aW9uIG9jY3VycyBiZWZvcmUgYW55IHVzZSwgb3RoZXJ3aXNlIHNlY3Rpb25zCisgIC8vIG1heSBiZSBjcmVhdGVkIHdpdGggYSBjb21iaW5hdGlvbiBvZiBkZWZhdWx0IGFuZCBleHBsaWNpdCBzZXR0aW5ncy4KKyAgaWYgKE9wdHMuQ29tcHJlc3NEZWJ1Z1NlY3Rpb25zKQorICAgIE1BSS0+c2V0Q29tcHJlc3NEZWJ1Z1NlY3Rpb25zKHRydWUpOworCiAgIGJvb2wgSXNCaW5hcnkgPSBPcHRzLk91dHB1dFR5cGUgPT0gQXNzZW1ibGVySW52b2NhdGlvbjo6RlRfT2JqOwogICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gKk91dCA9IEdldE91dHB1dFN0cmVhbShPcHRzLCBEaWFncywgSXNCaW5hcnkpOwogICBpZiAoIU91dCkKQEAgLTMwMSw3ICszMDgsOCBAQAogCiAgIC8vIEZJWE1FOiBUaGlzIGlzIG5vdCBwcmV0dHkuIE1DQ29udGV4dCBoYXMgYSBwdHIgdG8gTUNPYmplY3RGaWxlSW5mbyBhbmQKICAgLy8gTUNPYmplY3RGaWxlSW5mbyBuZWVkcyBhIE1DQ29udGV4dCByZWZlcmVuY2UgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBpdHNlbGYuCi0gIE93bmluZ1B0cjxNQ09iamVjdEZpbGVJbmZvPiBNT0ZJKG5ldyBNQ09iamVjdEZpbGVJbmZvKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8TUNPYmplY3RGaWxlSW5mbz4gTU9GSShuZXcgTUNPYmplY3RGaWxlSW5mbygpKTsKKwogICBNQ0NvbnRleHQgQ3R4KE1BSS5nZXQoKSwgTVJJLmdldCgpLCBNT0ZJLmdldCgpLCAmU3JjTWdyKTsKICAgLy8gRklYTUU6IEFzc2VtYmxlciBiZWhhdmlvciBjYW4gY2hhbmdlIHdpdGggLXN0YXRpYy4KICAgTU9GSS0+SW5pdE1DT2JqZWN0RmlsZUluZm8oT3B0cy5UcmlwbGUsCkBAIC0zMjcsMTEgKzMzNSwxMSBAQAogICAgICAgRlMgKz0gIiwiICsgT3B0cy5GZWF0dXJlc1tpXTsKICAgfQogCi0gIE93bmluZ1B0cjxNQ1N0cmVhbWVyPiBTdHI7CisgIHN0ZDo6dW5pcXVlX3B0cjxNQ1N0cmVhbWVyPiBTdHI7CiAKLSAgT3duaW5nUHRyPE1DSW5zdHJJbmZvPiBNQ0lJKFRoZVRhcmdldC0+Y3JlYXRlTUNJbnN0ckluZm8oKSk7Ci0gIE93bmluZ1B0cjxNQ1N1YnRhcmdldEluZm8+Ci0gICAgU1RJKFRoZVRhcmdldC0+Y3JlYXRlTUNTdWJ0YXJnZXRJbmZvKE9wdHMuVHJpcGxlLCBPcHRzLkNQVSwgRlMpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPE1DSW5zdHJJbmZvPiBNQ0lJKFRoZVRhcmdldC0+Y3JlYXRlTUNJbnN0ckluZm8oKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNQ1N1YnRhcmdldEluZm8+IFNUSSgKKyAgICAgIFRoZVRhcmdldC0+Y3JlYXRlTUNTdWJ0YXJnZXRJbmZvKE9wdHMuVHJpcGxlLCBPcHRzLkNQVSwgRlMpKTsKIAogICAvLyBGSVhNRTogVGhlcmUgaXMgYSBiaXQgb2YgY29kZSBkdXBsaWNhdGlvbiB3aXRoIGFkZFBhc3Nlc1RvRW1pdEZpbGUuCiAgIGlmIChPcHRzLk91dHB1dFR5cGUgPT0gQXNzZW1ibGVySW52b2NhdGlvbjo6RlRfQXNtKSB7CkBAIC0zNDUsNyArMzUzLDYgQEAKICAgICAgIE1BQiA9IFRoZVRhcmdldC0+Y3JlYXRlTUNBc21CYWNrZW5kKCpNUkksIE9wdHMuVHJpcGxlLCBPcHRzLkNQVSk7CiAgICAgfQogICAgIFN0ci5yZXNldChUaGVUYXJnZXQtPmNyZWF0ZUFzbVN0cmVhbWVyKEN0eCwgKk91dCwgLyphc212ZXJib3NlKi90cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdXNlTG9jKi8gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnVzZUNGSSovIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp1c2VEd2FyZkRpcmVjdG9yeSovIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVAsIENFLCBNQUIsCkBAIC0zNTksMTQgKzM2NiwxNSBAQAogICAgIE1DQXNtQmFja2VuZCAqTUFCID0gVGhlVGFyZ2V0LT5jcmVhdGVNQ0FzbUJhY2tlbmQoKk1SSSwgT3B0cy5UcmlwbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRzLkNQVSk7CiAgICAgU3RyLnJlc2V0KFRoZVRhcmdldC0+Y3JlYXRlTUNPYmplY3RTdHJlYW1lcihPcHRzLlRyaXBsZSwgQ3R4LCAqTUFCLCAqT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0UsIE9wdHMuUmVsYXhBbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRSwgKlNUSSwgT3B0cy5SZWxheEFsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMuTm9FeGVjU3RhY2spKTsKICAgICBTdHIuZ2V0KCktPkluaXRTZWN0aW9ucygpOwogICB9CiAKLSAgT3duaW5nUHRyPE1DQXNtUGFyc2VyPiBQYXJzZXIoY3JlYXRlTUNBc21QYXJzZXIoU3JjTWdyLCBDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpTdHIuZ2V0KCksICpNQUkpKTsKLSAgT3duaW5nUHRyPE1DVGFyZ2V0QXNtUGFyc2VyPiBUQVAoVGhlVGFyZ2V0LT5jcmVhdGVNQ0FzbVBhcnNlcigqU1RJLCAqUGFyc2VyLCAqTUNJSSkpOworICBzdGQ6OnVuaXF1ZV9wdHI8TUNBc21QYXJzZXI+IFBhcnNlcigKKyAgICAgIGNyZWF0ZU1DQXNtUGFyc2VyKFNyY01nciwgQ3R4LCAqU3RyLmdldCgpLCAqTUFJKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNQ1RhcmdldEFzbVBhcnNlcj4gVEFQKAorICAgICAgVGhlVGFyZ2V0LT5jcmVhdGVNQ0FzbVBhcnNlcigqU1RJLCAqUGFyc2VyLCAqTUNJSSkpOwogICBpZiAoIVRBUCkgewogICAgIERpYWdzLlJlcG9ydChkaWFnOjplcnJfdGFyZ2V0X3Vua25vd25fdHJpcGxlKSA8PCBPcHRzLlRyaXBsZTsKICAgICByZXR1cm4gZmFsc2U7CkBAIC00MjgsNyArNDM2LDcgQEAKIAogICAvLyBIb25vciAtaGVscC4KICAgaWYgKEFzbS5TaG93SGVscCkgewotICAgIE93bmluZ1B0cjxPcHRUYWJsZT4gT3B0cyhkcml2ZXI6OmNyZWF0ZUNDMUFzT3B0VGFibGUoKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE9wdFRhYmxlPiBPcHRzKGRyaXZlcjo6Y3JlYXRlQ0MxQXNPcHRUYWJsZSgpKTsKICAgICBPcHRzLT5QcmludEhlbHAobGx2bTo6b3V0cygpLCAiY2xhbmcgLWNjMWFzIiwgIkNsYW5nIEludGVncmF0ZWQgQXNzZW1ibGVyIik7CiAgICAgcmV0dXJuIDA7CiAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2RyaXZlci9kcml2ZXIuY3BwIGIvdG9vbHMvZHJpdmVyL2RyaXZlci5jcHAKaW5kZXggM2E2YTA5Yi4uYmViMjcxZiAxMDA2NDQKLS0tIGEvdG9vbHMvZHJpdmVyL2RyaXZlci5jcHAKKysrIGIvdG9vbHMvZHJpdmVyL2RyaXZlci5jcHAKQEAgLTIyLDEwICsyMiwxMCBAQAogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL1RleHREaWFnbm9zdGljUHJpbnRlci5oIgogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL1V0aWxzLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9Pd25pbmdQdHIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvY29uZmlnLmgiCiAjaW5jbHVkZSAibGx2bS9PcHRpb24vQXJnTGlzdC5oIgogI2luY2x1ZGUgImxsdm0vT3B0aW9uL09wdFRhYmxlLmgiCiAjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0aW9uLmgiCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RpbWVyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3N5c3RlbV9lcnJvci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6ZHJpdmVyOwogdXNpbmcgbmFtZXNwYWNlIGxsdm06Om9wdDsKQEAgLTE2OSw3ICsxNzAsNyBAQAogICAgIE9TID0gJmxsdm06Om51bGxzKCk7CiAgIH0KIAotICAqT1MgPDwgIiMjIyBRQV9PVkVSUklERV9HQ0MzX09QVElPTlM6ICIgPDwgT3ZlcnJpZGVTdHIgPDwgIlxuIjsKKyAgKk9TIDw8ICIjIyMgQ0NDX09WRVJSSURFX09QVElPTlM6ICIgPDwgT3ZlcnJpZGVTdHIgPDwgIlxuIjsKIAogICAvLyBUaGlzIGRvZXMgbm90IG5lZWQgdG8gYmUgZWZmaWNpZW50LgogCkBAIC0yMjcsOCArMjI4LDExIEBACiAgICAgeyAiKysiLCAgICAgICAgIi0tZHJpdmVyLW1vZGU9ZysrIiB9LAogICB9OwogICBzdGQ6OnN0cmluZyBQcm9nTmFtZShsbHZtOjpzeXM6OnBhdGg6OnN0ZW0oQXJnVmVjdG9yWzBdKSk7CisjaWZkZWYgTExWTV9PTl9XSU4zMgorICAvLyBUcmFuc2Zvcm0gdG8gbG93ZXJjYXNlIGZvciBjYXNlIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtcy4KICAgc3RkOjp0cmFuc2Zvcm0oUHJvZ05hbWUuYmVnaW4oKSwgUHJvZ05hbWUuZW5kKCksIFByb2dOYW1lLmJlZ2luKCksCiAgICAgICAgICAgICAgICAgIHRvTG93ZXJjYXNlKTsKKyNlbmRpZgogICBTdHJpbmdSZWYgUHJvZ05hbWVSZWYoUHJvZ05hbWUpOwogICBTdHJpbmdSZWYgUHJlZml4OwogCkBAIC0yODEsNyArMjg1LDcgQEAKICAgY2xhc3MgU3RyaW5nU2V0U2F2ZXIgOiBwdWJsaWMgbGx2bTo6Y2w6OlN0cmluZ1NhdmVyIHsKICAgcHVibGljOgogICAgIFN0cmluZ1NldFNhdmVyKHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiAmU3RvcmFnZSkgOiBTdG9yYWdlKFN0b3JhZ2UpIHt9Ci0gICAgY29uc3QgY2hhciAqU2F2ZVN0cmluZyhjb25zdCBjaGFyICpTdHIpIExMVk1fT1ZFUlJJREUgeworICAgIGNvbnN0IGNoYXIgKlNhdmVTdHJpbmcoY29uc3QgY2hhciAqU3RyKSBvdmVycmlkZSB7CiAgICAgICByZXR1cm4gU2F2ZVN0cmluZ0luU2V0KFN0b3JhZ2UsIFN0cik7CiAgICAgfQogICBwcml2YXRlOgpAQCAtMzMwLDkgKzMzNCw5IEBACiAgICAgfQogICB9CiAKLSAgLy8gSGFuZGxlIFFBX09WRVJSSURFX0dDQzNfT1BUSU9OUyBhbmQgQ0NDX0FERF9BUkdTLCB1c2VkIGZvciBlZGl0aW5nIGEKLSAgLy8gY29tbWFuZCBsaW5lIGJlaGluZCB0aGUgc2NlbmVzLgotICBpZiAoY29uc3QgY2hhciAqT3ZlcnJpZGVTdHIgPSA6OmdldGVudigiUUFfT1ZFUlJJREVfR0NDM19PUFRJT05TIikpIHsKKyAgLy8gSGFuZGxlIENDQ19PVkVSUklERV9PUFRJT05TLCB1c2VkIGZvciBlZGl0aW5nIGEgY29tbWFuZCBsaW5lIGJlaGluZCB0aGUKKyAgLy8gc2NlbmVzLgorICBpZiAoY29uc3QgY2hhciAqT3ZlcnJpZGVTdHIgPSA6OmdldGVudigiQ0NDX09WRVJSSURFX09QVElPTlMiKSkgewogICAgIC8vIEZJWE1FOiBEcml2ZXIgc2hvdWxkbid0IHRha2UgZXh0cmEgaW5pdGlhbCBhcmd1bWVudC4KICAgICBBcHBseVFBT3ZlcnJpZGUoYXJndiwgT3ZlcnJpZGVTdHIsIFNhdmVkU3RyaW5ncyk7CiAgIH0KQEAgLTM0MSwxMSArMzQ1LDEwIEBACiAKICAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNPcHRpb25zPiBEaWFnT3B0cyA9IG5ldyBEaWFnbm9zdGljT3B0aW9uczsKICAgewotICAgIE93bmluZ1B0cjxPcHRUYWJsZT4gT3B0cyhjcmVhdGVEcml2ZXJPcHRUYWJsZSgpKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8T3B0VGFibGU+IE9wdHMoY3JlYXRlRHJpdmVyT3B0VGFibGUoKSk7CiAgICAgdW5zaWduZWQgTWlzc2luZ0FyZ0luZGV4LCBNaXNzaW5nQXJnQ291bnQ7Ci0gICAgT3duaW5nUHRyPElucHV0QXJnTGlzdD4gQXJncyhPcHRzLT5QYXJzZUFyZ3MoYXJndi5iZWdpbigpKzEsIGFyZ3YuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzc2luZ0FyZ0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc3NpbmdBcmdDb3VudCkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEFyZ0xpc3Q+IEFyZ3MoT3B0cy0+UGFyc2VBcmdzKAorICAgICAgICBhcmd2LmJlZ2luKCkgKyAxLCBhcmd2LmVuZCgpLCBNaXNzaW5nQXJnSW5kZXgsIE1pc3NpbmdBcmdDb3VudCkpOwogICAgIC8vIFdlIGlnbm9yZSBNaXNzaW5nQXJnQ291bnQgYW5kIHRoZSByZXR1cm4gdmFsdWUgb2YgUGFyc2VEaWFnbm9zdGljQXJncy4KICAgICAvLyBBbnkgZXJyb3JzIHRoYXQgd291bGQgYmUgZGlhZ25vc2VkIGhlcmUgd2lsbCBhbHNvIGJlIGRpYWdub3NlZCBsYXRlciwKICAgICAvLyB3aGVuIHRoZSBEaWFnbm9zdGljc0VuZ2luZSBhY3R1YWxseSBleGlzdHMuCkBAIC00MDgsNyArNDExLDcgQEAKICAgaWYgKFRoZURyaXZlci5DQ0xvZ0RpYWdub3N0aWNzKQogICAgIFRoZURyaXZlci5DQ0xvZ0RpYWdub3N0aWNzRmlsZW5hbWUgPSA6OmdldGVudigiQ0NfTE9HX0RJQUdOT1NUSUNTX0ZJTEUiKTsKIAotICBPd25pbmdQdHI8Q29tcGlsYXRpb24+IEMoVGhlRHJpdmVyLkJ1aWxkQ29tcGlsYXRpb24oYXJndikpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsYXRpb24+IEMoVGhlRHJpdmVyLkJ1aWxkQ29tcGlsYXRpb24oYXJndikpOwogICBpbnQgUmVzID0gMDsKICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGludCwgY29uc3QgQ29tbWFuZCAqPiwgND4gRmFpbGluZ0NvbW1hbmRzOwogICBpZiAoQy5nZXQoKSkKQEAgLTQ0Myw3ICs0NDYsNyBAQAogICAKICAgbGx2bTo6bGx2bV9zaHV0ZG93bigpOwogCi0jaWZkZWYgX1dJTjMyCisjaWZkZWYgTExWTV9PTl9XSU4zMgogICAvLyBFeGl0IHN0YXR1cyBzaG91bGQgbm90IGJlIG5lZ2F0aXZlIG9uIFdpbjMyLCB1bmxlc3MgYWJub3JtYWwgdGVybWluYXRpb24uCiAgIC8vIE9uY2UgYWJub3JtYWwgdGVybWlhdGlvbiB3YXMgY2F1Z2h0LCBuZWdhdGl2ZSBzdGF0dXMgc2hvdWxkIG5vdCBiZQogICAvLyBwcm9wYWdhdGVkLgpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvQVJDTWlncmF0ZS5jcHAgYi90b29scy9saWJjbGFuZy9BUkNNaWdyYXRlLmNwcAppbmRleCAzOTQxNzk0Li5kYmI2MDRkIDEwMDY0NAotLS0gYS90b29scy9saWJjbGFuZy9BUkNNaWdyYXRlLmNwcAorKysgYi90b29scy9saWJjbGFuZy9BUkNNaWdyYXRlLmNwcApAQCAtNTUsNyArNTUsNyBAQAogICB9CiAKICAgVGV4dERpYWdub3N0aWNCdWZmZXIgZGlhZ0J1ZmZlcjsKLSAgT3duaW5nUHRyPFJlbWFwPiByZW1hcChuZXcgUmVtYXAoKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxSZW1hcD4gcmVtYXAobmV3IFJlbWFwKCkpOwogCiAgIGJvb2wgZXJyID0gYXJjbXQ6OmdldEZpbGVSZW1hcHBpbmdzKHJlbWFwLT5WZWMsIG1pZ3JhdGVfZGlyX3BhdGgsJmRpYWdCdWZmZXIpOwogCkBAIC03MCwyMCArNzAsMjAgQEAKICAgICByZXR1cm4gMDsKICAgfQogCi0gIHJldHVybiByZW1hcC50YWtlKCk7CisgIHJldHVybiByZW1hcC5yZWxlYXNlKCk7CiB9CiAKIENYUmVtYXBwaW5nIGNsYW5nX2dldFJlbWFwcGluZ3NGcm9tRmlsZUxpc3QoY29uc3QgY2hhciAqKmZpbGVQYXRocywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtRmlsZXMpIHsKICAgYm9vbCBMb2dnaW5nID0gOjpnZXRlbnYoIkxJQkNMQU5HX0xPR0dJTkciKTsKIAotICBPd25pbmdQdHI8UmVtYXA+IHJlbWFwKG5ldyBSZW1hcCgpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPFJlbWFwPiByZW1hcChuZXcgUmVtYXAoKSk7CiAKICAgaWYgKG51bUZpbGVzID09IDApIHsKICAgICBpZiAoTG9nZ2luZykKICAgICAgIGxsdm06OmVycnMoKSA8PCAiY2xhbmdfZ2V0UmVtYXBwaW5nc0Zyb21GaWxlTGlzdCB3YXMgY2FsbGVkIHdpdGggIgogICAgICAgICAgICAgICAgICAgICAgICJudW1GaWxlcz0wXG4iOwotICAgIHJldHVybiByZW1hcC50YWtlKCk7CisgICAgcmV0dXJuIHJlbWFwLnJlbGVhc2UoKTsKICAgfQogCiAgIGlmICghZmlsZVBhdGhzKSB7CkBAIC0xMDgsMTAgKzEwOCwxMCBAQAogICAgICAgICAgICAgIEkgPSBkaWFnQnVmZmVyLmVycl9iZWdpbigpLCBFID0gZGlhZ0J1ZmZlci5lcnJfZW5kKCk7IEkgIT0gRTsgKytJKQogICAgICAgICBsbHZtOjplcnJzKCkgPDwgSS0+c2Vjb25kIDw8ICdcbic7CiAgICAgfQotICAgIHJldHVybiByZW1hcC50YWtlKCk7CisgICAgcmV0dXJuIHJlbWFwLnJlbGVhc2UoKTsKICAgfQogCi0gIHJldHVybiByZW1hcC50YWtlKCk7CisgIHJldHVybiByZW1hcC5yZWxlYXNlKCk7CiB9CiAKIHVuc2lnbmVkIGNsYW5nX3JlbWFwX2dldE51bUZpbGVzKENYUmVtYXBwaW5nIG1hcCkgewpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvQnVpbGRTeXN0ZW0uY3BwIGIvdG9vbHMvbGliY2xhbmcvQnVpbGRTeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YzZlOTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9saWJjbGFuZy9CdWlsZFN5c3RlbS5jcHAKQEAgLTAsMCArMSwyNzkgQEAKKy8vPT09LSBCdWlsZFN5c3RlbS5jcHAgLSBVdGlsaXRpZXMgZm9yIHVzZSBieSBidWlsZCBzeXN0ZW1zIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdmFyaW91cyB1dGlsaXRpZXMgZm9yIHVzZSBieSBidWlsZCBzeXN0ZW1zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJjbGFuZy1jL0J1aWxkU3lzdGVtLmgiCisjaW5jbHVkZSAiQ1hTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UaW1lVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKwordXNpbmcgbmFtZXNwYWNlIGNsYW5nOwordXNpbmcgbmFtZXNwYWNlIGxsdm06OnN5czsKKwordW5zaWduZWQgbG9uZyBsb25nIGNsYW5nX2dldEJ1aWxkU2Vzc2lvblRpbWVzdGFtcCh2b2lkKSB7CisgIHJldHVybiBsbHZtOjpzeXM6OlRpbWVWYWx1ZTo6bm93KCkudG9FcG9jaFRpbWUoKTsKK30KKworc3RydWN0IENYVmlydHVhbEZpbGVPdmVybGF5SW1wbCB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ID4gTWFwcGluZ3M7CisgIE9wdGlvbmFsPGJvb2w+IElzQ2FzZVNlbnNpdGl2ZTsKK307CisKK0NYVmlydHVhbEZpbGVPdmVybGF5IGNsYW5nX1ZpcnR1YWxGaWxlT3ZlcmxheV9jcmVhdGUodW5zaWduZWQpIHsKKyAgcmV0dXJuIG5ldyBDWFZpcnR1YWxGaWxlT3ZlcmxheUltcGwoKTsKK30KKworZW51bSBDWEVycm9yQ29kZQorY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X2FkZEZpbGVNYXBwaW5nKENYVmlydHVhbEZpbGVPdmVybGF5IFZGTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2aXJ0dWFsUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFsUGF0aCkgeworICBpZiAoIVZGTyB8fCAhdmlydHVhbFBhdGggfHwgIXJlYWxQYXRoKQorICAgIHJldHVybiBDWEVycm9yX0ludmFsaWRBcmd1bWVudHM7CisgIGlmICghcGF0aDo6aXNfYWJzb2x1dGUodmlydHVhbFBhdGgpKQorICAgIHJldHVybiBDWEVycm9yX0ludmFsaWRBcmd1bWVudHM7CisgIGlmICghcGF0aDo6aXNfYWJzb2x1dGUocmVhbFBhdGgpKQorICAgIHJldHVybiBDWEVycm9yX0ludmFsaWRBcmd1bWVudHM7CisKKyAgZm9yIChwYXRoOjpjb25zdF9pdGVyYXRvcgorICAgICAgICAgUEkgPSBwYXRoOjpiZWdpbih2aXJ0dWFsUGF0aCksCisgICAgICAgICBQRSA9IHBhdGg6OmVuZCh2aXJ0dWFsUGF0aCk7IFBJICE9IFBFOyArK1BJKSB7CisgICAgU3RyaW5nUmVmIENvbXAgPSAqUEk7CisgICAgaWYgKENvbXAgPT0gIi4iIHx8IENvbXAgPT0gIi4uIikKKyAgICAgIHJldHVybiBDWEVycm9yX0ludmFsaWRBcmd1bWVudHM7CisgIH0KKworICBWRk8tPk1hcHBpbmdzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcih2aXJ0dWFsUGF0aCwgcmVhbFBhdGgpKTsKKyAgcmV0dXJuIENYRXJyb3JfU3VjY2VzczsKK30KKworZW51bSBDWEVycm9yQ29kZQorY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X3NldENhc2VTZW5zaXRpdml0eShDWFZpcnR1YWxGaWxlT3ZlcmxheSBWRk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYXNlU2Vuc2l0aXZlKSB7CisgIGlmICghVkZPKQorICAgIHJldHVybiBDWEVycm9yX0ludmFsaWRBcmd1bWVudHM7CisKKyAgVkZPLT5Jc0Nhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlOworICByZXR1cm4gQ1hFcnJvcl9TdWNjZXNzOworfQorCituYW1lc3BhY2Ugeworc3RydWN0IEVudHJ5VHkgeworICBzdGQ6OnN0cmluZyBWUGF0aDsKKyAgc3RkOjpzdHJpbmcgUlBhdGg7CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgRW50cnlUeSAmTEhTLCBjb25zdCBFbnRyeVR5ICZSSFMpIHsKKyAgICByZXR1cm4gTEhTLlZQYXRoIDwgUkhTLlZQYXRoOworICB9Cit9OworCitjbGFzcyBKU09OVkZTUHJpbnRlciB7CisgIGxsdm06OnJhd19vc3RyZWFtICZPUzsKKyAgQ1hWaXJ0dWFsRmlsZU92ZXJsYXkgVkZPOworCitwdWJsaWM6CisgIEpTT05WRlNQcmludGVyKGxsdm06OnJhd19vc3RyZWFtICZPUywgQ1hWaXJ0dWFsRmlsZU92ZXJsYXkgVkZPKQorICAgIDogT1MoT1MpLCBWRk8oVkZPKSB7fQorCisgIC8vLyBFbnRyaWVzIG11c3QgYmUgc29ydGVkLgorICB2b2lkIHByaW50KEFycmF5UmVmPEVudHJ5VHk+IEVudHJpZXMpIHsKKyAgICBPUyA8PCAie1xuIgorICAgICAgICAgICIgICd2ZXJzaW9uJzogMCxcbiI7CisgICAgaWYgKFZGTy0+SXNDYXNlU2Vuc2l0aXZlLmhhc1ZhbHVlKCkpIHsKKyAgICAgIE9TIDw8ICIgICdjYXNlLXNlbnNpdGl2ZSc6ICciOworICAgICAgaWYgKFZGTy0+SXNDYXNlU2Vuc2l0aXZlLmdldFZhbHVlKCkpCisgICAgICAgIE9TIDw8ICJ0cnVlIjsKKyAgICAgIGVsc2UKKyAgICAgICAgT1MgPDwgImZhbHNlIjsKKyAgICAgIE9TIDw8ICInLFxuIjsKKyAgICB9CisgICAgT1MgPDwgIiAgJ3Jvb3RzJzogW1xuIjsKKyAgICBwcmludERpck5vZGVzKEVudHJpZXMsICIiLCA0KTsKKyAgICBPUyA8PCAiICBdXG4iCisgICAgICAgICAgIn1cbiI7CisgIH0KKworcHJpdmF0ZToKKyAgQXJyYXlSZWY8RW50cnlUeT4gcHJpbnREaXJOb2RlcyhBcnJheVJlZjxFbnRyeVR5PiBFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBQYXJlbnRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGVudCkgeworICAgIHdoaWxlICghRW50cmllcy5lbXB0eSgpKSB7CisgICAgICBjb25zdCBFbnRyeVR5ICZFbnRyeSA9IEVudHJpZXMuZnJvbnQoKTsKKyAgICAgIE9TLmluZGVudChJbmRlbnQpIDw8ICJ7XG4iOworICAgICAgSW5kZW50ICs9IDI7CisgICAgICBPUy5pbmRlbnQoSW5kZW50KSA8PCAiJ3R5cGUnOiAnZGlyZWN0b3J5JyxcbiI7CisgICAgICBPUy5pbmRlbnQoSW5kZW50KSA8PCAiJ25hbWUnOiBcIiI7CisgICAgICBTdHJpbmdSZWYgRGlyTmFtZSA9IGNvbnRhaW5lZFBhcnQoUGFyZW50UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOjpwYXJlbnRfcGF0aChFbnRyeS5WUGF0aCkpOworICAgICAgT1Mud3JpdGVfZXNjYXBlZChEaXJOYW1lKSA8PCAiXCIsXG4iOworICAgICAgT1MuaW5kZW50KEluZGVudCkgPDwgIidjb250ZW50cyc6IFtcbiI7CisgICAgICBFbnRyaWVzID0gcHJpbnRDb250ZW50cyhFbnRyaWVzLCBJbmRlbnQgKyAyKTsKKyAgICAgIE9TLmluZGVudChJbmRlbnQpIDw8ICJdXG4iOworICAgICAgSW5kZW50IC09IDI7CisgICAgICBPUy5pbmRlbnQoSW5kZW50KSA8PCAnfSc7CisgICAgICBpZiAoRW50cmllcy5lbXB0eSgpKSB7CisgICAgICAgIE9TIDw8ICdcbic7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgU3RyaW5nUmVmIE5leHRWUGF0aCA9IEVudHJpZXMuZnJvbnQoKS5WUGF0aDsKKyAgICAgIGlmICghY29udGFpbmVkSW4oUGFyZW50UGF0aCwgTmV4dFZQYXRoKSkgeworICAgICAgICBPUyA8PCAnXG4nOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIE9TIDw8ICIsXG4iOworICAgIH0KKyAgICByZXR1cm4gRW50cmllczsKKyAgfQorCisgIEFycmF5UmVmPEVudHJ5VHk+IHByaW50Q29udGVudHMoQXJyYXlSZWY8RW50cnlUeT4gRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnQpIHsKKyAgICB3aGlsZSAoIUVudHJpZXMuZW1wdHkoKSkgeworICAgICAgY29uc3QgRW50cnlUeSAmRW50cnkgPSBFbnRyaWVzLmZyb250KCk7CisgICAgICBFbnRyaWVzID0gRW50cmllcy5zbGljZSgxKTsKKyAgICAgIFN0cmluZ1JlZiBQYXJlbnRQYXRoID0gcGF0aDo6cGFyZW50X3BhdGgoRW50cnkuVlBhdGgpOworICAgICAgU3RyaW5nUmVmIFZOYW1lID0gcGF0aDo6ZmlsZW5hbWUoRW50cnkuVlBhdGgpOworICAgICAgT1MuaW5kZW50KEluZGVudCkgPDwgIntcbiI7CisgICAgICBJbmRlbnQgKz0gMjsKKyAgICAgIE9TLmluZGVudChJbmRlbnQpIDw8ICIndHlwZSc6ICdmaWxlJyxcbiI7CisgICAgICBPUy5pbmRlbnQoSW5kZW50KSA8PCAiJ25hbWUnOiBcIiI7CisgICAgICBPUy53cml0ZV9lc2NhcGVkKFZOYW1lKSA8PCAiXCIsXG4iOworICAgICAgT1MuaW5kZW50KEluZGVudCkgPDwgIidleHRlcm5hbC1jb250ZW50cyc6IFwiIjsKKyAgICAgIE9TLndyaXRlX2VzY2FwZWQoRW50cnkuUlBhdGgpIDw8ICJcIlxuIjsKKyAgICAgIEluZGVudCAtPSAyOworICAgICAgT1MuaW5kZW50KEluZGVudCkgPDwgJ30nOworICAgICAgaWYgKEVudHJpZXMuZW1wdHkoKSkgeworICAgICAgICBPUyA8PCAnXG4nOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIFN0cmluZ1JlZiBOZXh0VlBhdGggPSBFbnRyaWVzLmZyb250KCkuVlBhdGg7CisgICAgICBpZiAoIWNvbnRhaW5lZEluKFBhcmVudFBhdGgsIE5leHRWUGF0aCkpIHsKKyAgICAgICAgT1MgPDwgJ1xuJzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBPUyA8PCAiLFxuIjsKKyAgICAgIGlmIChwYXRoOjpwYXJlbnRfcGF0aChOZXh0VlBhdGgpICE9IFBhcmVudFBhdGgpIHsKKyAgICAgICAgRW50cmllcyA9IHByaW50RGlyTm9kZXMoRW50cmllcywgUGFyZW50UGF0aCwgSW5kZW50KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVudHJpZXM7CisgIH0KKworICBib29sIGNvbnRhaW5lZEluKFN0cmluZ1JlZiBQYXJlbnQsIFN0cmluZ1JlZiBQYXRoKSB7CisgICAgcmV0dXJuIFBhdGguc3RhcnRzd2l0aChQYXJlbnQpOworICB9CisKKyAgU3RyaW5nUmVmIGNvbnRhaW5lZFBhcnQoU3RyaW5nUmVmIFBhcmVudCwgU3RyaW5nUmVmIFBhdGgpIHsKKyAgICBhc3NlcnQoY29udGFpbmVkSW4oUGFyZW50LCBQYXRoKSk7CisgICAgaWYgKFBhcmVudC5lbXB0eSgpKQorICAgICAgcmV0dXJuIFBhdGg7CisgICAgcmV0dXJuIFBhdGguc2xpY2UoUGFyZW50LnNpemUoKSsxLCBTdHJpbmdSZWY6Om5wb3MpOworICB9Cit9OworfQorCitlbnVtIENYRXJyb3JDb2RlCitjbGFuZ19WaXJ0dWFsRmlsZU92ZXJsYXlfd3JpdGVUb0J1ZmZlcihDWFZpcnR1YWxGaWxlT3ZlcmxheSBWRk8sIHVuc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKm91dF9idWZmZXJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKm91dF9idWZmZXJfc2l6ZSkgeworICBpZiAoIVZGTyB8fCAhb3V0X2J1ZmZlcl9wdHIgfHwgIW91dF9idWZmZXJfc2l6ZSkKKyAgICByZXR1cm4gQ1hFcnJvcl9JbnZhbGlkQXJndW1lbnRzOworCisgIGxsdm06OlNtYWxsVmVjdG9yPEVudHJ5VHksIDE2PiBFbnRyaWVzOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVkZPLT5NYXBwaW5ncy5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgRW50cnlUeSBFbnRyeTsKKyAgICBFbnRyeS5WUGF0aCA9IFZGTy0+TWFwcGluZ3NbaV0uZmlyc3Q7CisgICAgRW50cnkuUlBhdGggPSBWRk8tPk1hcHBpbmdzW2ldLnNlY29uZDsKKyAgICBFbnRyaWVzLnB1c2hfYmFjayhFbnRyeSk7CisgIH0KKworICAvLyBGSVhNRTogV2Ugc2hvdWxkIGFkZCBvcHRpb25zIHRvIGRldGVybWluZSBpZiB0aGUgcGF0aHMgYXJlIGNhc2Ugc2Vuc2l0aXZlCisgIC8vIG9yIG5vdC4gVGhlIGZvbGxvd2luZyBhc3N1bWVzIHRoYXQgaWYgcGF0aHMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgdGhlIGNhbGxlcgorICAvLyBkaWQgbm90IG1peCBjYXNlcyBpbiB0aGUgdmlydHVhbCBwYXRocyBpdCBwcm92aWRlZC4KKworICBzdGQ6OnNvcnQoRW50cmllcy5iZWdpbigpLCBFbnRyaWVzLmVuZCgpKTsKKworICBsbHZtOjpTbWFsbFN0cmluZzwyNTY+IEJ1ZjsKKyAgbGx2bTo6cmF3X3N2ZWN0b3Jfb3N0cmVhbSBPUyhCdWYpOworICBKU09OVkZTUHJpbnRlciBQcmludGVyKE9TLCBWRk8pOworICBQcmludGVyLnByaW50KEVudHJpZXMpOworCisgIFN0cmluZ1JlZiBEYXRhID0gT1Muc3RyKCk7CisgICpvdXRfYnVmZmVyX3B0ciA9IChjaGFyKiltYWxsb2MoRGF0YS5zaXplKCkpOworICAqb3V0X2J1ZmZlcl9zaXplID0gRGF0YS5zaXplKCk7CisgIG1lbWNweSgqb3V0X2J1ZmZlcl9wdHIsIERhdGEuZGF0YSgpLCBEYXRhLnNpemUoKSk7CisgIHJldHVybiBDWEVycm9yX1N1Y2Nlc3M7Cit9CisKK3ZvaWQgY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X2Rpc3Bvc2UoQ1hWaXJ0dWFsRmlsZU92ZXJsYXkgVkZPKSB7CisgIGRlbGV0ZSBWRk87Cit9CisKKworc3RydWN0IENYTW9kdWxlTWFwRGVzY3JpcHRvckltcGwgeworICBzdGQ6OnN0cmluZyBNb2R1bGVOYW1lOworICBzdGQ6OnN0cmluZyBVbWJyZWxsYUhlYWRlcjsKK307CisKK0NYTW9kdWxlTWFwRGVzY3JpcHRvciBjbGFuZ19Nb2R1bGVNYXBEZXNjcmlwdG9yX2NyZWF0ZSh1bnNpZ25lZCkgeworICByZXR1cm4gbmV3IENYTW9kdWxlTWFwRGVzY3JpcHRvckltcGwoKTsKK30KKworZW51bSBDWEVycm9yQ29kZQorY2xhbmdfTW9kdWxlTWFwRGVzY3JpcHRvcl9zZXRGcmFtZXdvcmtNb2R1bGVOYW1lKENYTW9kdWxlTWFwRGVzY3JpcHRvciBNTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgeworICBpZiAoIU1NRCB8fCAhbmFtZSkKKyAgICByZXR1cm4gQ1hFcnJvcl9JbnZhbGlkQXJndW1lbnRzOworCisgIE1NRC0+TW9kdWxlTmFtZSA9IG5hbWU7CisgIHJldHVybiBDWEVycm9yX1N1Y2Nlc3M7Cit9CisKK2VudW0gQ1hFcnJvckNvZGUKK2NsYW5nX01vZHVsZU1hcERlc2NyaXB0b3Jfc2V0VW1icmVsbGFIZWFkZXIoQ1hNb2R1bGVNYXBEZXNjcmlwdG9yIE1NRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgeworICBpZiAoIU1NRCB8fCAhbmFtZSkKKyAgICByZXR1cm4gQ1hFcnJvcl9JbnZhbGlkQXJndW1lbnRzOworCisgIE1NRC0+VW1icmVsbGFIZWFkZXIgPSBuYW1lOworICByZXR1cm4gQ1hFcnJvcl9TdWNjZXNzOworfQorCitlbnVtIENYRXJyb3JDb2RlCitjbGFuZ19Nb2R1bGVNYXBEZXNjcmlwdG9yX3dyaXRlVG9CdWZmZXIoQ1hNb2R1bGVNYXBEZXNjcmlwdG9yIE1NRCwgdW5zaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqb3V0X2J1ZmZlcl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqb3V0X2J1ZmZlcl9zaXplKSB7CisgIGlmICghTU1EIHx8ICFvdXRfYnVmZmVyX3B0ciB8fCAhb3V0X2J1ZmZlcl9zaXplKQorICAgIHJldHVybiBDWEVycm9yX0ludmFsaWRBcmd1bWVudHM7CisKKyAgbGx2bTo6U21hbGxTdHJpbmc8MjU2PiBCdWY7CisgIGxsdm06OnJhd19zdmVjdG9yX29zdHJlYW0gT1MoQnVmKTsKKyAgT1MgPDwgImZyYW1ld29yayBtb2R1bGUgIiA8PCBNTUQtPk1vZHVsZU5hbWUgPDwgIiB7XG4iOworICBPUyA8PCAiICB1bWJyZWxsYSBoZWFkZXIgXCIiOworICBPUy53cml0ZV9lc2NhcGVkKE1NRC0+VW1icmVsbGFIZWFkZXIpIDw8ICJcIlxuIjsKKyAgT1MgPDwgJ1xuJzsKKyAgT1MgPDwgIiAgZXhwb3J0ICpcbiI7CisgIE9TIDw8ICIgIG1vZHVsZSAqIHsgZXhwb3J0ICogfVxuIjsKKyAgT1MgPDwgIn1cbiI7CisKKyAgU3RyaW5nUmVmIERhdGEgPSBPUy5zdHIoKTsKKyAgKm91dF9idWZmZXJfcHRyID0gKGNoYXIqKW1hbGxvYyhEYXRhLnNpemUoKSk7CisgICpvdXRfYnVmZmVyX3NpemUgPSBEYXRhLnNpemUoKTsKKyAgbWVtY3B5KCpvdXRfYnVmZmVyX3B0ciwgRGF0YS5kYXRhKCksIERhdGEuc2l6ZSgpKTsKKyAgcmV0dXJuIENYRXJyb3JfU3VjY2VzczsKK30KKwordm9pZCBjbGFuZ19Nb2R1bGVNYXBEZXNjcmlwdG9yX2Rpc3Bvc2UoQ1hNb2R1bGVNYXBEZXNjcmlwdG9yIE1NRCkgeworICBkZWxldGUgTU1EOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvQ0luZGV4LmNwcCBiL3Rvb2xzL2xpYmNsYW5nL0NJbmRleC5jcHAKaW5kZXggZjUzZTVjMS4uMDQ3OTdhOSAxMDA2NDQKLS0tIGEvdG9vbHMvbGliY2xhbmcvQ0luZGV4LmNwcAorKysgYi90b29scy9saWJjbGFuZy9DSW5kZXguY3BwCkBAIC0yNSw2ICsyNSw4IEBACiAjaW5jbHVkZSAiY2xhbmcvQVNUL0F0dHIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdFZpc2l0b3IuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpY0NhdGVnb3JpZXMuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9EaWFnbm9zdGljSURzLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvVmVyc2lvbi5oIgogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0FTVFVuaXQuaCIKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db21waWxlckluc3RhbmNlLmgiCkBAIC0zNCw2ICszNiw3IEBACiAjaW5jbHVkZSAiY2xhbmcvTGV4L0xleGVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3NpbmdSZWNvcmQuaCIKICNpbmNsdWRlICJjbGFuZy9MZXgvUHJlcHJvY2Vzc29yLmgiCisjaW5jbHVkZSAiY2xhbmcvU2VyaWFsaXphdGlvbi9TZXJpYWxpemF0aW9uRGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgiCkBAIC02Miw2ICs2NSw3IEBACiBDWFRyYW5zbGF0aW9uVW5pdCBjeHR1OjpNYWtlQ1hUcmFuc2xhdGlvblVuaXQoQ0luZGV4ZXIgKkNJZHgsIEFTVFVuaXQgKkFVKSB7CiAgIGlmICghQVUpCiAgICAgcmV0dXJuIDA7CisgIGFzc2VydChDSWR4KTsKICAgQ1hUcmFuc2xhdGlvblVuaXQgRCA9IG5ldyBDWFRyYW5zbGF0aW9uVW5pdEltcGwoKTsKICAgRC0+Q0lkeCA9IENJZHg7CiAgIEQtPlRoZUFTVFVuaXQgPSBBVTsKQEAgLTcyLDYgKzc2LDE4IEBACiAgIHJldHVybiBEOwogfQogCitib29sIGN4dHU6OmlzQVNUUmVhZEVycm9yKEFTVFVuaXQgKkFVKSB7CisgIGZvciAoQVNUVW5pdDo6c3RvcmVkX2RpYWdfaXRlcmF0b3IgRCA9IEFVLT5zdG9yZWRfZGlhZ19iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFbmQgPSBBVS0+c3RvcmVkX2RpYWdfZW5kKCk7CisgICAgICAgRCAhPSBERW5kOyArK0QpIHsKKyAgICBpZiAoRC0+Z2V0TGV2ZWwoKSA+PSBEaWFnbm9zdGljc0VuZ2luZTo6RXJyb3IgJiYKKyAgICAgICAgRGlhZ25vc3RpY0lEczo6Z2V0Q2F0ZWdvcnlOdW1iZXJGb3JEaWFnKEQtPmdldElEKCkpID09CisgICAgICAgICAgICBkaWFnOjpEaWFnQ2F0X0FTVF9EZXNlcmlhbGl6YXRpb25fSXNzdWUpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKIGN4dHU6OkNYVFVPd25lcjo6fkNYVFVPd25lcigpIHsKICAgaWYgKFRVKQogICAgIGNsYW5nX2Rpc3Bvc2VUcmFuc2xhdGlvblVuaXQoVFUpOwpAQCAtMjk4LDcgKzMxNCw3IEBACiAgICAgaWYgKE91dGVyLmlzSW52YWxpZCgpKQogICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgbGx2bTo6dGllKEZpbGUsIE9mZnNldCkgPSBTTS5nZXREZWNvbXBvc2VkRXhwYW5zaW9uTG9jKE91dGVyKTsKKyAgICBzdGQ6OnRpZShGaWxlLCBPZmZzZXQpID0gU00uZ2V0RGVjb21wb3NlZEV4cGFuc2lvbkxvYyhPdXRlcik7CiAgICAgTGVuZ3RoID0gMDsKICAgICBVbml0LT5maW5kRmlsZVJlZ2lvbkRlY2xzKEZpbGUsIE9mZnNldCwgTGVuZ3RoLCBEZWNscyk7CiAgIH0KQEAgLTc2OSw3ICs3ODUsNyBAQAogICAgIC8vIElmIHdlIGhhdmUgYSBmdW5jdGlvbiBkZWNsYXJlZCBkaXJlY3RseSAod2l0aG91dCB0aGUgdXNlIG9mIGEgdHlwZWRlZiksCiAgICAgLy8gdmlzaXQganVzdCB0aGUgcmV0dXJuIHR5cGUuIE90aGVyd2lzZSwganVzdCB2aXNpdCB0aGUgZnVuY3Rpb24ncyB0eXBlCiAgICAgLy8gbm93LgotICAgIGlmICgoRlRMICYmICFpc2E8Q1hYQ29udmVyc2lvbkRlY2w+KE5EKSAmJiBWaXNpdChGVEwuZ2V0UmVzdWx0TG9jKCkpKSB8fAorICAgIGlmICgoRlRMICYmICFpc2E8Q1hYQ29udmVyc2lvbkRlY2w+KE5EKSAmJiBWaXNpdChGVEwuZ2V0UmV0dXJuTG9jKCkpKSB8fAogICAgICAgICAoIUZUTCAmJiBWaXNpdChUTCkpKQogICAgICAgcmV0dXJuIHRydWU7CiAgICAgCkBAIC03NzksOCArNzk1LDkgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgCiAgICAgLy8gVmlzaXQgdGhlIGRlY2xhcmF0aW9uIG5hbWUuCi0gICAgaWYgKFZpc2l0RGVjbGFyYXRpb25OYW1lSW5mbyhORC0+Z2V0TmFtZUluZm8oKSkpCi0gICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIWlzYTxDWFhEZXN0cnVjdG9yRGVjbD4oTkQpKQorICAgICAgaWYgKFZpc2l0RGVjbGFyYXRpb25OYW1lSW5mbyhORC0+Z2V0TmFtZUluZm8oKSkpCisgICAgICAgIHJldHVybiB0cnVlOwogICAgIAogICAgIC8vIEZJWE1FOiBWaXNpdCBleHBsaWNpdGx5LXNwZWNpZmllZCB0ZW1wbGF0ZSBhcmd1bWVudHMhCiAgICAgCkBAIC03OTUsMTMgKzgxMiwxMSBAQAogICAgIGlmIChDWFhDb25zdHJ1Y3RvckRlY2wgKkNvbnN0cnVjdG9yID0gZHluX2Nhc3Q8Q1hYQ29uc3RydWN0b3JEZWNsPihORCkpIHsKICAgICAgIC8vIEZpbmQgdGhlIGluaXRpYWxpemVycyB0aGF0IHdlcmUgd3JpdHRlbiBpbiB0aGUgc291cmNlLgogICAgICAgU21hbGxWZWN0b3I8Q1hYQ3RvckluaXRpYWxpemVyICosIDQ+IFdyaXR0ZW5Jbml0czsKLSAgICAgIGZvciAoQ1hYQ29uc3RydWN0b3JEZWNsOjppbml0X2l0ZXJhdG9yIEkgPSBDb25zdHJ1Y3Rvci0+aW5pdF9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVuZCA9IENvbnN0cnVjdG9yLT5pbml0X2VuZCgpOwotICAgICAgICAgICBJICE9IElFbmQ7ICsrSSkgewotICAgICAgICBpZiAoISgqSSktPmlzV3JpdHRlbigpKQorICAgICAgZm9yIChhdXRvICpJIDogQ29uc3RydWN0b3ItPmluaXRzKCkpIHsKKyAgICAgICAgaWYgKCFJLT5pc1dyaXR0ZW4oKSkKICAgICAgICAgICBjb250aW51ZTsKICAgICAgIAotICAgICAgICBXcml0dGVuSW5pdHMucHVzaF9iYWNrKCpJKTsKKyAgICAgICAgV3JpdHRlbkluaXRzLnB1c2hfYmFjayhJKTsKICAgICAgIH0KICAgICAgIAogICAgICAgLy8gU29ydCB0aGUgaW5pdGlhbGl6ZXJzIGluIHNvdXJjZSBvcmRlcgpAQCAtODk1LDE0ICs5MTAsMTIgQEAKIH0KIAogYm9vbCBDdXJzb3JWaXNpdG9yOjpWaXNpdE9iakNNZXRob2REZWNsKE9iakNNZXRob2REZWNsICpORCkgewotICBpZiAoVHlwZVNvdXJjZUluZm8gKlRTSW5mbyA9IE5ELT5nZXRSZXN1bHRUeXBlU291cmNlSW5mbygpKQorICBpZiAoVHlwZVNvdXJjZUluZm8gKlRTSW5mbyA9IE5ELT5nZXRSZXR1cm5UeXBlU291cmNlSW5mbygpKQogICAgIGlmIChWaXNpdChUU0luZm8tPmdldFR5cGVMb2MoKSkpCiAgICAgICByZXR1cm4gdHJ1ZTsKIAotICBmb3IgKE9iakNNZXRob2REZWNsOjpwYXJhbV9pdGVyYXRvciBQID0gTkQtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgUEVuZCA9IE5ELT5wYXJhbV9lbmQoKTsKLSAgICAgICBQICE9IFBFbmQ7ICsrUCkgewotICAgIGlmIChWaXNpdChNYWtlQ1hDdXJzb3IoKlAsIFRVLCBSZWdpb25PZkludGVyZXN0KSkpCisgIGZvciAoY29uc3QgYXV0byAqUCA6IE5ELT5wYXJhbXMoKSkgeworICAgIGlmIChWaXNpdChNYWtlQ1hDdXJzb3IoUCwgVFUsIFJlZ2lvbk9mSW50ZXJlc3QpKSkKICAgICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTkzNCwxOSArOTQ3LDYgQEAKICAgfQogfQogCi1uYW1lc3BhY2UgewotICBzdHJ1Y3QgQ29udGFpbmVyRGVjbHNTb3J0IHsKLSAgICBTb3VyY2VNYW5hZ2VyICZTTTsKLSAgICBDb250YWluZXJEZWNsc1NvcnQoU291cmNlTWFuYWdlciAmc20pIDogU00oc20pIHt9Ci0gICAgYm9vbCBvcGVyYXRvcigpKERlY2wgKkEsIERlY2wgKkIpIHsKLSAgICAgIFNvdXJjZUxvY2F0aW9uIExfQSA9IEEtPmdldExvY1N0YXJ0KCk7Ci0gICAgICBTb3VyY2VMb2NhdGlvbiBMX0IgPSBCLT5nZXRMb2NTdGFydCgpOwotICAgICAgYXNzZXJ0KExfQS5pc1ZhbGlkKCkgJiYgTF9CLmlzVmFsaWQoKSk7Ci0gICAgICByZXR1cm4gU00uaXNCZWZvcmVJblRyYW5zbGF0aW9uVW5pdChMX0EsIExfQik7Ci0gICAgfQotICB9OwotfQotCiBib29sIEN1cnNvclZpc2l0b3I6OlZpc2l0T2JqQ0NvbnRhaW5lckRlY2woT2JqQ0NvbnRhaW5lckRlY2wgKkQpIHsKICAgLy8gRklYTUU6IEV2ZW50dWFsbHkgY29udmVydCBiYWNrIHRvIGp1c3QgJ1Zpc2l0RGVjbENvbnRleHQoKScuICBFc3NlbnRpYWxseQogICAvLyBhbiBAaW1wbGVtZW50YXRpb24gY2FuIGxleGljYWxseSBjb250YWluIERlY2xzIHRoYXQgYXJlIG5vdCBwcm9wZXJseQpAQCAtOTc4LDE4ICs5NzgsMjEgQEAKIAogICAvLyBHZXQgYWxsIHRoZSBEZWNscyBpbiB0aGUgRGVjbENvbnRleHQsIGFuZCBzb3J0IHRoZW0gd2l0aCB0aGUKICAgLy8gYWRkaXRpb25hbCBvbmVzIHdlJ3ZlIGNvbGxlY3RlZC4gIFRoZW4gdmlzaXQgdGhlbS4KLSAgZm9yIChEZWNsQ29udGV4dDo6ZGVjbF9pdGVyYXRvciBJID0gRC0+ZGVjbHNfYmVnaW4oKSwgRSA9IEQtPmRlY2xzX2VuZCgpOwotICAgICAgIEkhPUU7ICsrSSkgewotICAgIERlY2wgKnN1YkRlY2wgPSAqSTsKLSAgICBpZiAoIXN1YkRlY2wgfHwgc3ViRGVjbC0+Z2V0TGV4aWNhbERlY2xDb250ZXh0KCkgIT0gRCB8fAotICAgICAgICBzdWJEZWNsLT5nZXRMb2NTdGFydCgpLmlzSW52YWxpZCgpKQorICBmb3IgKGF1dG8gKlN1YkRlY2wgOiBELT5kZWNscygpKSB7CisgICAgaWYgKCFTdWJEZWNsIHx8IFN1YkRlY2wtPmdldExleGljYWxEZWNsQ29udGV4dCgpICE9IEQgfHwKKyAgICAgICAgU3ViRGVjbC0+Z2V0TG9jU3RhcnQoKS5pc0ludmFsaWQoKSkKICAgICAgIGNvbnRpbnVlOwotICAgIERlY2xzSW5Db250YWluZXIucHVzaF9iYWNrKHN1YkRlY2wpOworICAgIERlY2xzSW5Db250YWluZXIucHVzaF9iYWNrKFN1YkRlY2wpOwogICB9CiAKICAgLy8gTm93IHNvcnQgdGhlIERlY2xzIHNvIHRoYXQgdGhleSBhcHBlYXIgaW4gbGV4aWNhbCBvcmRlci4KICAgc3RkOjpzb3J0KERlY2xzSW5Db250YWluZXIuYmVnaW4oKSwgRGVjbHNJbkNvbnRhaW5lci5lbmQoKSwKLSAgICAgICAgICAgIENvbnRhaW5lckRlY2xzU29ydChTTSkpOworICAgICAgICAgICAgWyZTTV0oRGVjbCAqQSwgRGVjbCAqQikgeworICAgIFNvdXJjZUxvY2F0aW9uIExfQSA9IEEtPmdldExvY1N0YXJ0KCk7CisgICAgU291cmNlTG9jYXRpb24gTF9CID0gQi0+Z2V0TG9jU3RhcnQoKTsKKyAgICBhc3NlcnQoTF9BLmlzVmFsaWQoKSAmJiBMX0IuaXNWYWxpZCgpKTsKKyAgICByZXR1cm4gU00uaXNCZWZvcmVJblRyYW5zbGF0aW9uVW5pdChMX0EsIExfQik7CisgIH0pOwogCiAgIC8vIE5vdyB2aXNpdCB0aGUgZGVjbHMuCiAgIGZvciAoU21hbGxWZWN0b3JJbXBsPERlY2wqPjo6aXRlcmF0b3IgSSA9IERlY2xzSW5Db250YWluZXIuYmVnaW4oKSwKQEAgLTE1MTcsMTEgKzE1MjAsMTEgQEAKIAogYm9vbCBDdXJzb3JWaXNpdG9yOjpWaXNpdEZ1bmN0aW9uVHlwZUxvYyhGdW5jdGlvblR5cGVMb2MgVEwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNraXBSZXN1bHRUeXBlKSB7Ci0gIGlmICghU2tpcFJlc3VsdFR5cGUgJiYgVmlzaXQoVEwuZ2V0UmVzdWx0TG9jKCkpKQorICBpZiAoIVNraXBSZXN1bHRUeXBlICYmIFZpc2l0KFRMLmdldFJldHVybkxvYygpKSkKICAgICByZXR1cm4gdHJ1ZTsKIAotICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gVEwuZ2V0TnVtQXJncygpOyBJICE9IE47ICsrSSkKLSAgICBpZiAoRGVjbCAqRCA9IFRMLmdldEFyZyhJKSkKKyAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IFRMLmdldE51bVBhcmFtcygpOyBJICE9IE47ICsrSSkKKyAgICBpZiAoRGVjbCAqRCA9IFRMLmdldFBhcmFtKEkpKQogICAgICAgaWYgKFZpc2l0KE1ha2VDWEN1cnNvcihELCBUVSwgUmVnaW9uT2ZJbnRlcmVzdCkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIApAQCAtMTU0Miw2ICsxNTQ1LDEwIEBACiAgIHJldHVybiBWaXNpdChUTC5nZXRPcmlnaW5hbExvYygpKTsKIH0KIAorYm9vbCBDdXJzb3JWaXNpdG9yOjpWaXNpdEFkanVzdGVkVHlwZUxvYyhBZGp1c3RlZFR5cGVMb2MgVEwpIHsKKyAgcmV0dXJuIFZpc2l0KFRMLmdldE9yaWdpbmFsTG9jKCkpOworfQorCiBib29sIEN1cnNvclZpc2l0b3I6OlZpc2l0VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGVMb2MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZUxvYyBUTCkgewogICAvLyBWaXNpdCB0aGUgdGVtcGxhdGUgbmFtZS4KQEAgLTE2NTEsOSArMTY1OCw4IEBACiAgICAgICByZXR1cm4gdHJ1ZTsKIAogICBpZiAoRC0+aXNDb21wbGV0ZURlZmluaXRpb24oKSkgewotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBJID0gRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgIEUgPSBELT5iYXNlc19lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIGlmIChWaXNpdChjeGN1cnNvcjo6TWFrZUN1cnNvckNYWEJhc2VTcGVjaWZpZXIoSSwgVFUpKSkKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBELT5iYXNlcygpKSB7CisgICAgICBpZiAoVmlzaXQoY3hjdXJzb3I6Ok1ha2VDdXJzb3JDWFhCYXNlU3BlY2lmaWVyKCZJLCBUVSkpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgIH0KQEAgLTE2NjIsOSArMTY2OCw4IEBACiB9CiAKIGJvb2wgQ3Vyc29yVmlzaXRvcjo6VmlzaXRBdHRyaWJ1dGVzKERlY2wgKkQpIHsKLSAgZm9yIChBdHRyVmVjOjpjb25zdF9pdGVyYXRvciBpID0gRC0+YXR0cl9iZWdpbigpLCBlID0gRC0+YXR0cl9lbmQoKTsKLSAgICAgICBpICE9IGU7ICsraSkKLSAgICBpZiAoVmlzaXQoTWFrZUNYQ3Vyc29yKCppLCBELCBUVSkpKQorICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBELT5hdHRycygpKQorICAgIGlmIChWaXNpdChNYWtlQ1hDdXJzb3IoSSwgRCwgVFUpKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgcmV0dXJuIGZhbHNlOwpAQCAtMTgzNSw4ICsxODQwLDYgQEAKICAgdm9pZCBWaXNpdFN0bXQoY29uc3QgU3RtdCAqUyk7CiAgIHZvaWQgVmlzaXRTd2l0Y2hTdG10KGNvbnN0IFN3aXRjaFN0bXQgKlMpOwogICB2b2lkIFZpc2l0V2hpbGVTdG10KGNvbnN0IFdoaWxlU3RtdCAqVyk7Ci0gIHZvaWQgVmlzaXRVbmFyeVR5cGVUcmFpdEV4cHIoY29uc3QgVW5hcnlUeXBlVHJhaXRFeHByICpFKTsKLSAgdm9pZCBWaXNpdEJpbmFyeVR5cGVUcmFpdEV4cHIoY29uc3QgQmluYXJ5VHlwZVRyYWl0RXhwciAqRSk7CiAgIHZvaWQgVmlzaXRUeXBlVHJhaXRFeHByKGNvbnN0IFR5cGVUcmFpdEV4cHIgKkUpOwogICB2b2lkIFZpc2l0QXJyYXlUeXBlVHJhaXRFeHByKGNvbnN0IEFycmF5VHlwZVRyYWl0RXhwciAqRSk7CiAgIHZvaWQgVmlzaXRFeHByZXNzaW9uVHJhaXRFeHByKGNvbnN0IEV4cHJlc3Npb25UcmFpdEV4cHIgKkUpOwpAQCAtMTg0OCw2ICsxODUxLDcgQEAKICAgdm9pZCBWaXNpdExhbWJkYUV4cHIoY29uc3QgTGFtYmRhRXhwciAqRSk7CiAgIHZvaWQgVmlzaXRPTVBFeGVjdXRhYmxlRGlyZWN0aXZlKGNvbnN0IE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUgKkQpOwogICB2b2lkIFZpc2l0T01QUGFyYWxsZWxEaXJlY3RpdmUoY29uc3QgT01QUGFyYWxsZWxEaXJlY3RpdmUgKkQpOworICB2b2lkIFZpc2l0T01QU2ltZERpcmVjdGl2ZShjb25zdCBPTVBTaW1kRGlyZWN0aXZlICpEKTsKIAogcHJpdmF0ZToKICAgdm9pZCBBZGREZWNsYXJhdGlvbk5hbWVJbmZvKGNvbnN0IFN0bXQgKlMpOwpAQCAtMTkyMCwxNCArMTkyNCwyNCBAQAogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKIH07CiAKK3ZvaWQgT01QQ2xhdXNlRW5xdWV1ZTo6VmlzaXRPTVBJZkNsYXVzZShjb25zdCBPTVBJZkNsYXVzZSAqQykgeworICBWaXNpdG9yLT5BZGRTdG10KEMtPmdldENvbmRpdGlvbigpKTsKK30KKwordm9pZCBPTVBDbGF1c2VFbnF1ZXVlOjpWaXNpdE9NUE51bVRocmVhZHNDbGF1c2UoY29uc3QgT01QTnVtVGhyZWFkc0NsYXVzZSAqQykgeworICBWaXNpdG9yLT5BZGRTdG10KEMtPmdldE51bVRocmVhZHMoKSk7Cit9CisKK3ZvaWQgT01QQ2xhdXNlRW5xdWV1ZTo6VmlzaXRPTVBTYWZlbGVuQ2xhdXNlKGNvbnN0IE9NUFNhZmVsZW5DbGF1c2UgKkMpIHsKKyAgVmlzaXRvci0+QWRkU3RtdChDLT5nZXRTYWZlbGVuKCkpOworfQorCiB2b2lkIE9NUENsYXVzZUVucXVldWU6OlZpc2l0T01QRGVmYXVsdENsYXVzZShjb25zdCBPTVBEZWZhdWx0Q2xhdXNlICpDKSB7IH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIHZvaWQgT01QQ2xhdXNlRW5xdWV1ZTo6VmlzaXRPTVBDbGF1c2VMaXN0KFQgKk5vZGUpIHsKLSAgZm9yICh0eXBlbmFtZSBUOjp2YXJsaXN0X2NvbnN0X2l0ZXJhdG9yIEkgPSBOb2RlLT52YXJsaXN0X2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gTm9kZS0+dmFybGlzdF9lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKQotICAgIFZpc2l0b3ItPkFkZFN0bXQoKkkpOworICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBOb2RlLT52YXJsaXN0cygpKQorICAgIFZpc2l0b3ItPkFkZFN0bXQoSSk7CiB9CiAKIHZvaWQgT01QQ2xhdXNlRW5xdWV1ZTo6VmlzaXRPTVBQcml2YXRlQ2xhdXNlKGNvbnN0IE9NUFByaXZhdGVDbGF1c2UgKkMpIHsKQEAgLTE5NDAsNiArMTk1NCw5IEBACiB2b2lkIE9NUENsYXVzZUVucXVldWU6OlZpc2l0T01QU2hhcmVkQ2xhdXNlKGNvbnN0IE9NUFNoYXJlZENsYXVzZSAqQykgewogICBWaXNpdE9NUENsYXVzZUxpc3QoQyk7CiB9Cit2b2lkIE9NUENsYXVzZUVucXVldWU6OlZpc2l0T01QQ29weWluQ2xhdXNlKGNvbnN0IE9NUENvcHlpbkNsYXVzZSAqQykgeworICBWaXNpdE9NUENsYXVzZUxpc3QoQyk7Cit9CiB9CiAKIHZvaWQgRW5xdWV1ZVZpc2l0b3I6OkVucXVldWVDaGlsZHJlbihjb25zdCBPTVBDbGF1c2UgKlMpIHsKQEAgLTIwNjIsOSArMjA3OSw4IEBACiB2b2lkIEVucXVldWVWaXNpdG9yOjpWaXNpdERlY2xTdG10KGNvbnN0IERlY2xTdG10ICpTKSB7CiAgIHVuc2lnbmVkIHNpemUgPSBXTC5zaXplKCk7CiAgIGJvb2wgaXNGaXJzdCA9IHRydWU7Ci0gIGZvciAoRGVjbFN0bXQ6OmNvbnN0X2RlY2xfaXRlcmF0b3IgRCA9IFMtPmRlY2xfYmVnaW4oKSwgREVuZCA9IFMtPmRlY2xfZW5kKCk7Ci0gICAgICAgRCAhPSBERW5kOyArK0QpIHsKLSAgICBBZGREZWNsKCpELCBpc0ZpcnN0KTsKKyAgZm9yIChjb25zdCBhdXRvICpEIDogUy0+ZGVjbHMoKSkgeworICAgIEFkZERlY2woRCwgaXNGaXJzdCk7CiAgICAgaXNGaXJzdCA9IGZhbHNlOwogICB9CiAgIGlmIChzaXplID09IFdMLnNpemUoKSkKQEAgLTIxODEsMTUgKzIxOTcsNiBAQAogICBBZGREZWNsKFctPmdldENvbmRpdGlvblZhcmlhYmxlKCkpOwogfQogCi12b2lkIEVucXVldWVWaXNpdG9yOjpWaXNpdFVuYXJ5VHlwZVRyYWl0RXhwcihjb25zdCBVbmFyeVR5cGVUcmFpdEV4cHIgKkUpIHsKLSAgQWRkVHlwZUxvYyhFLT5nZXRRdWVyaWVkVHlwZVNvdXJjZUluZm8oKSk7Ci19Ci0KLXZvaWQgRW5xdWV1ZVZpc2l0b3I6OlZpc2l0QmluYXJ5VHlwZVRyYWl0RXhwcihjb25zdCBCaW5hcnlUeXBlVHJhaXRFeHByICpFKSB7Ci0gIEFkZFR5cGVMb2MoRS0+Z2V0UmhzVHlwZVNvdXJjZUluZm8oKSk7Ci0gIEFkZFR5cGVMb2MoRS0+Z2V0TGhzVHlwZVNvdXJjZUluZm8oKSk7Ci19Ci0KIHZvaWQgRW5xdWV1ZVZpc2l0b3I6OlZpc2l0VHlwZVRyYWl0RXhwcihjb25zdCBUeXBlVHJhaXRFeHByICpFKSB7CiAgIGZvciAodW5zaWduZWQgSSA9IEUtPmdldE51bUFyZ3MoKTsgSSA+IDA7IC0tSSkKICAgICBBZGRUeXBlTG9jKEUtPmdldEFyZyhJLTEpKTsKQEAgLTIyNDMsNiArMjI1MCwxMCBAQAogICBWaXNpdE9NUEV4ZWN1dGFibGVEaXJlY3RpdmUoRCk7CiB9CiAKK3ZvaWQgRW5xdWV1ZVZpc2l0b3I6OlZpc2l0T01QU2ltZERpcmVjdGl2ZShjb25zdCBPTVBTaW1kRGlyZWN0aXZlICpEKSB7CisgIFZpc2l0T01QRXhlY3V0YWJsZURpcmVjdGl2ZShEKTsKK30KKwogdm9pZCBDdXJzb3JWaXNpdG9yOjpFbnF1ZXVlV29ya0xpc3QoVmlzaXRvcldvcmtMaXN0ICZXTCwgY29uc3QgU3RtdCAqUykgewogICBFbnF1ZXVlVmlzaXRvcihXTCwgTWFrZUNYQ3Vyc29yKFMsIFN0bXRQYXJlbnQsIFRVLFJlZ2lvbk9mSW50ZXJlc3QpKS5WaXNpdChTKTsKIH0KQEAgLTI0NDQsMTIgKzI0NTUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBUTC5nZXRBczxGdW5jdGlvblByb3RvVHlwZUxvYz4oKSkgewogICAgICAgICAgICAgaWYgKEUtPmhhc0V4cGxpY2l0UGFyYW1ldGVycygpKSB7CiAgICAgICAgICAgICAgIC8vIFZpc2l0IHBhcmFtZXRlcnMuCi0gICAgICAgICAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBQcm90by5nZXROdW1BcmdzKCk7IEkgIT0gTjsgKytJKQotICAgICAgICAgICAgICAgIGlmIChWaXNpdChNYWtlQ1hDdXJzb3IoUHJvdG8uZ2V0QXJnKEkpLCBUVSkpKQorICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBOID0gUHJvdG8uZ2V0TnVtUGFyYW1zKCk7IEkgIT0gTjsgKytJKQorICAgICAgICAgICAgICAgIGlmIChWaXNpdChNYWtlQ1hDdXJzb3IoUHJvdG8uZ2V0UGFyYW0oSSksIFRVKSkpCiAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIC8vIFZpc2l0IHJlc3VsdCB0eXBlLgotICAgICAgICAgICAgICBpZiAoVmlzaXQoUHJvdG8uZ2V0UmVzdWx0TG9jKCkpKQorICAgICAgICAgICAgICBpZiAoVmlzaXQoUHJvdG8uZ2V0UmV0dXJuTG9jKCkpKQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KQEAgLTI1NDQsNyArMjU1NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXNwbGF5RGlhZ25vc3RpY3MpIHsKICAgLy8gV2UgdXNlIGNyYXNoIHJlY292ZXJ5IHRvIG1ha2Ugc29tZSBvZiBvdXIgQVBJcyBtb3JlIHJlbGlhYmxlLCBpbXBsaWNpdGx5CiAgIC8vIGVuYWJsZSBpdC4KLSAgbGx2bTo6Q3Jhc2hSZWNvdmVyeUNvbnRleHQ6OkVuYWJsZSgpOworICBpZiAoIWdldGVudigiTElCQ0xBTkdfRElTQUJMRV9DUkFTSF9SRUNPVkVSWSIpKQorICAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0OjpFbmFibGUoKTsKIAogICAvLyBFbmFibGUgc3VwcG9ydCBmb3IgbXVsdGl0aHJlYWRpbmcgaW4gTExWTS4KICAgewpAQCAtMjU5NCwxMSArMjYwNiwyNiBAQAogICBlbHNlCiAgICAgbGx2bTo6Q3Jhc2hSZWNvdmVyeUNvbnRleHQ6OkRpc2FibGUoKTsKIH0KLSAgCisKIENYVHJhbnNsYXRpb25Vbml0IGNsYW5nX2NyZWF0ZVRyYW5zbGF0aW9uVW5pdChDWEluZGV4IENJZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXN0X2ZpbGVuYW1lKSB7Ci0gIGlmICghQ0lkeCB8fCAhYXN0X2ZpbGVuYW1lKQotICAgIHJldHVybiAwOworICBDWFRyYW5zbGF0aW9uVW5pdCBUVTsKKyAgZW51bSBDWEVycm9yQ29kZSBSZXN1bHQgPQorICAgICAgY2xhbmdfY3JlYXRlVHJhbnNsYXRpb25Vbml0MihDSWR4LCBhc3RfZmlsZW5hbWUsICZUVSk7CisgICh2b2lkKVJlc3VsdDsKKyAgYXNzZXJ0KChUVSAmJiBSZXN1bHQgPT0gQ1hFcnJvcl9TdWNjZXNzKSB8fAorICAgICAgICAgKCFUVSAmJiBSZXN1bHQgIT0gQ1hFcnJvcl9TdWNjZXNzKSk7CisgIHJldHVybiBUVTsKK30KKworZW51bSBDWEVycm9yQ29kZSBjbGFuZ19jcmVhdGVUcmFuc2xhdGlvblVuaXQyKENYSW5kZXggQ0lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphc3RfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hUcmFuc2xhdGlvblVuaXQgKm91dF9UVSkgeworICBpZiAob3V0X1RVKQorICAgICpvdXRfVFUgPSBOVUxMOworCisgIGlmICghQ0lkeCB8fCAhYXN0X2ZpbGVuYW1lIHx8ICFvdXRfVFUpCisgICAgcmV0dXJuIENYRXJyb3JfSW52YWxpZEFyZ3VtZW50czsKIAogICBMT0dfRlVOQ19TRUNUSU9OIHsKICAgICAqTG9nIDw8IGFzdF9maWxlbmFtZTsKQEAgLTI2MDgsMjAgKzI2MzUsMjAgQEAKICAgRmlsZVN5c3RlbU9wdGlvbnMgRmlsZVN5c3RlbU9wdHM7CiAKICAgSW50cnVzaXZlUmVmQ250UHRyPERpYWdub3N0aWNzRW5naW5lPiBEaWFnczsKLSAgQVNUVW5pdCAqVFUgPSBBU1RVbml0OjpMb2FkRnJvbUFTVEZpbGUoYXN0X2ZpbGVuYW1lLCBEaWFncywgRmlsZVN5c3RlbU9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYSWR4LT5nZXRPbmx5TG9jYWxEZWNscygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDYXB0dXJlRGlhZ25vc3RpY3M9Ki90cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQWxsb3dQQ0hXaXRoQ29tcGlsZXJFcnJvcnM9Ki90cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVXNlckZpbGVzQXJlVm9sYXRpbGU9Ki90cnVlKTsKLSAgcmV0dXJuIE1ha2VDWFRyYW5zbGF0aW9uVW5pdChDWFhJZHgsIFRVKTsKKyAgQVNUVW5pdCAqQVUgPSBBU1RVbml0OjpMb2FkRnJvbUFTVEZpbGUoYXN0X2ZpbGVuYW1lLCBEaWFncywgRmlsZVN5c3RlbU9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWElkeC0+Z2V0T25seUxvY2FsRGVjbHMoKSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDYXB0dXJlRGlhZ25vc3RpY3M9Ki90cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkFsbG93UENIV2l0aENvbXBpbGVyRXJyb3JzPSovdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVc2VyRmlsZXNBcmVWb2xhdGlsZT0qL3RydWUpOworICAqb3V0X1RVID0gTWFrZUNYVHJhbnNsYXRpb25Vbml0KENYWElkeCwgQVUpOworICByZXR1cm4gKm91dF9UVSA/IENYRXJyb3JfU3VjY2VzcyA6IENYRXJyb3JfRmFpbHVyZTsKIH0KIAogdW5zaWduZWQgY2xhbmdfZGVmYXVsdEVkaXRpbmdUcmFuc2xhdGlvblVuaXRPcHRpb25zKCkgewogICByZXR1cm4gQ1hUcmFuc2xhdGlvblVuaXRfUHJlY29tcGlsZWRQcmVhbWJsZSB8IAogICAgICAgICAgQ1hUcmFuc2xhdGlvblVuaXRfQ2FjaGVDb21wbGV0aW9uUmVzdWx0czsKIH0KLSAgCisKIENYVHJhbnNsYXRpb25Vbml0CiBjbGFuZ19jcmVhdGVUcmFuc2xhdGlvblVuaXRGcm9tU291cmNlRmlsZShDWEluZGV4IENJZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzb3VyY2VfZmlsZW5hbWUsCkBAIC0yNjQ0LDcgKzI2NzEsOCBAQAogICBzdHJ1Y3QgQ1hVbnNhdmVkRmlsZSAqdW5zYXZlZF9maWxlczsKICAgdW5zaWduZWQgbnVtX3Vuc2F2ZWRfZmlsZXM7CiAgIHVuc2lnbmVkIG9wdGlvbnM7Ci0gIENYVHJhbnNsYXRpb25Vbml0IHJlc3VsdDsKKyAgQ1hUcmFuc2xhdGlvblVuaXQgKm91dF9UVTsKKyAgQ1hFcnJvckNvZGUgcmVzdWx0OwogfTsKIHN0YXRpYyB2b2lkIGNsYW5nX3BhcnNlVHJhbnNsYXRpb25Vbml0X0ltcGwodm9pZCAqVXNlckRhdGEpIHsKICAgUGFyc2VUcmFuc2xhdGlvblVuaXRJbmZvICpQVFVJID0KQEAgLTI2NTYsMTAgKzI2ODQsMTkgQEAKICAgc3RydWN0IENYVW5zYXZlZEZpbGUgKnVuc2F2ZWRfZmlsZXMgPSBQVFVJLT51bnNhdmVkX2ZpbGVzOwogICB1bnNpZ25lZCBudW1fdW5zYXZlZF9maWxlcyA9IFBUVUktPm51bV91bnNhdmVkX2ZpbGVzOwogICB1bnNpZ25lZCBvcHRpb25zID0gUFRVSS0+b3B0aW9uczsKLSAgUFRVSS0+cmVzdWx0ID0gMDsKKyAgQ1hUcmFuc2xhdGlvblVuaXQgKm91dF9UVSA9IFBUVUktPm91dF9UVTsKIAotICBpZiAoIUNJZHgpCisgIC8vIFNldCB1cCB0aGUgaW5pdGlhbCByZXR1cm4gdmFsdWVzLgorICBpZiAob3V0X1RVKQorICAgICpvdXRfVFUgPSBOVUxMOworICBQVFVJLT5yZXN1bHQgPSBDWEVycm9yX0ZhaWx1cmU7CisKKyAgLy8gQ2hlY2sgYXJndW1lbnRzLgorICBpZiAoIUNJZHggfHwgIW91dF9UVSB8fAorICAgICAgKHVuc2F2ZWRfZmlsZXMgPT0gTlVMTCAmJiBudW1fdW5zYXZlZF9maWxlcyAhPSAwKSkgeworICAgIFBUVUktPnJlc3VsdCA9IENYRXJyb3JfSW52YWxpZEFyZ3VtZW50czsKICAgICByZXR1cm47CisgIH0KIAogICBDSW5kZXhlciAqQ1hYSWR4ID0gc3RhdGljX2Nhc3Q8Q0luZGV4ZXIgKj4oQ0lkeCk7CiAKQEAgLTI2NzAsNyArMjcwNyw3IEBACiAgIC8vIEZJWE1FOiBBZGQgYSBmbGFnIGZvciBtb2R1bGVzLgogICBUcmFuc2xhdGlvblVuaXRLaW5kIFRVS2luZAogICAgID0gKG9wdGlvbnMgJiBDWFRyYW5zbGF0aW9uVW5pdF9JbmNvbXBsZXRlKT8gVFVfUHJlZml4IDogVFVfQ29tcGxldGU7Ci0gIGJvb2wgQ2FjaGVDb2RlQ29tcGV0aW9uUmVzdWx0cworICBib29sIENhY2hlQ29kZUNvbXBsZXRpb25SZXN1bHRzCiAgICAgPSBvcHRpb25zICYgQ1hUcmFuc2xhdGlvblVuaXRfQ2FjaGVDb21wbGV0aW9uUmVzdWx0czsKICAgYm9vbCBJbmNsdWRlQnJpZWZDb21tZW50c0luQ29kZUNvbXBsZXRpb24KICAgICA9IG9wdGlvbnMgJiBDWFRyYW5zbGF0aW9uVW5pdF9JbmNsdWRlQnJpZWZDb21tZW50c0luQ29kZUNvbXBsZXRpb247CkBAIC0yNjg2LDggKzI3MjMsOCBAQAogICAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0UmVsZWFzZVJlZkNsZWFudXA8RGlhZ25vc3RpY3NFbmdpbmU+ID4KICAgICBEaWFnQ2xlYW51cChEaWFncy5nZXRQdHIoKSk7CiAKLSAgT3duaW5nUHRyPHN0ZDo6dmVjdG9yPEFTVFVuaXQ6OlJlbWFwcGVkRmlsZT4gPgotICAgIFJlbWFwcGVkRmlsZXMobmV3IHN0ZDo6dmVjdG9yPEFTVFVuaXQ6OlJlbWFwcGVkRmlsZT4oKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxBU1RVbml0OjpSZW1hcHBlZEZpbGU+PiBSZW1hcHBlZEZpbGVzKAorICAgICAgbmV3IHN0ZDo6dmVjdG9yPEFTVFVuaXQ6OlJlbWFwcGVkRmlsZT4oKSk7CiAKICAgLy8gUmVjb3ZlciByZXNvdXJjZXMgaWYgd2UgY3Jhc2ggYmVmb3JlIGV4aXRpbmcgdGhpcyBmdW5jdGlvbi4KICAgbGx2bTo6Q3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwUmVnaXN0cmFyPApAQCAtMjcwMSw4ICsyNzM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyKSk7CiAgIH0KIAotICBPd25pbmdQdHI8c3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiA+Ci0gICAgQXJncyhuZXcgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+KCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPj4gQXJncygKKyAgICAgIG5ldyBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+KCkpOwogCiAgIC8vIFJlY292ZXIgcmVzb3VyY2VzIGlmIHdlIGNyYXNoIGJlZm9yZSBleGl0aW5nIHRoaXMgbWV0aG9kLgogICBsbHZtOjpDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXBSZWdpc3RyYXI8c3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+ID4KQEAgLTI3NDIsMjcgKzI3NzksMTUgQEAKICAgfQogICAKICAgdW5zaWduZWQgTnVtRXJyb3JzID0gRGlhZ3MtPmdldENsaWVudCgpLT5nZXROdW1FcnJvcnMoKTsKLSAgT3duaW5nUHRyPEFTVFVuaXQ+IEVyclVuaXQ7Ci0gIE93bmluZ1B0cjxBU1RVbml0PiBVbml0KAotICAgIEFTVFVuaXQ6OkxvYWRGcm9tQ29tbWFuZExpbmUoQXJncy0+c2l6ZSgpID8gJigqQXJncylbMF0gOiAwIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmVjdG9yOjpkYXRhKCkgbm90IHBvcnRhYmxlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncy0+c2l6ZSgpID8gKCYoKkFyZ3MpWzBdICsgQXJncy0+c2l6ZSgpKSA6MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYSWR4LT5nZXRDbGFuZ1Jlc291cmNlc1BhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYWElkeC0+Z2V0T25seUxvY2FsRGVjbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2FwdHVyZURpYWdub3N0aWNzPSovdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFwcGVkRmlsZXMtPnNpemUoKSA/ICYoKlJlbWFwcGVkRmlsZXMpWzBdOjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1hcHBlZEZpbGVzLT5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlJlbWFwcGVkRmlsZXNLZWVwT3JpZ2luYWxOYW1lPSovdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWNvbXBpbGVQcmVhbWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRVS2luZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlQ29kZUNvbXBldGlvblJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlQnJpZWZDb21tZW50c0luQ29kZUNvbXBsZXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkFsbG93UENIV2l0aENvbXBpbGVyRXJyb3JzPSovdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXBGdW5jdGlvbkJvZGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVXNlckZpbGVzQXJlVm9sYXRpbGU9Ki90cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yU2VyaWFsaXphdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFcnJVbml0KSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RVbml0PiBFcnJVbml0OworICBzdGQ6OnVuaXF1ZV9wdHI8QVNUVW5pdD4gVW5pdChBU1RVbml0OjpMb2FkRnJvbUNvbW1hbmRMaW5lKAorICAgICAgQXJncy0+ZGF0YSgpLCBBcmdzLT5kYXRhKCkgKyBBcmdzLT5zaXplKCksIERpYWdzLAorICAgICAgQ1hYSWR4LT5nZXRDbGFuZ1Jlc291cmNlc1BhdGgoKSwgQ1hYSWR4LT5nZXRPbmx5TG9jYWxEZWNscygpLAorICAgICAgLypDYXB0dXJlRGlhZ25vc3RpY3M9Ki90cnVlLCAqUmVtYXBwZWRGaWxlcy5nZXQoKSwKKyAgICAgIC8qUmVtYXBwZWRGaWxlc0tlZXBPcmlnaW5hbE5hbWU9Ki90cnVlLCBQcmVjb21waWxlUHJlYW1ibGUsIFRVS2luZCwKKyAgICAgIENhY2hlQ29kZUNvbXBsZXRpb25SZXN1bHRzLCBJbmNsdWRlQnJpZWZDb21tZW50c0luQ29kZUNvbXBsZXRpb24sCisgICAgICAvKkFsbG93UENIV2l0aENvbXBpbGVyRXJyb3JzPSovdHJ1ZSwgU2tpcEZ1bmN0aW9uQm9kaWVzLAorICAgICAgLypVc2VyRmlsZXNBcmVWb2xhdGlsZT0qL3RydWUsIEZvclNlcmlhbGl6YXRpb24sICZFcnJVbml0KSk7CiAKICAgaWYgKE51bUVycm9ycyAhPSBEaWFncy0+Z2V0Q2xpZW50KCktPmdldE51bUVycm9ycygpKSB7CiAgICAgLy8gTWFrZSBzdXJlIHRvIGNoZWNrIHRoYXQgJ1VuaXQnIGlzIG5vbi1OVUxMLgpAQCAtMjc3MCwxNSArMjc5NSw0MSBAQAogICAgICAgcHJpbnREaWFnc1RvU3RkZXJyKFVuaXQgPyBVbml0LmdldCgpIDogRXJyVW5pdC5nZXQoKSk7CiAgIH0KIAotICBQVFVJLT5yZXN1bHQgPSBNYWtlQ1hUcmFuc2xhdGlvblVuaXQoQ1hYSWR4LCBVbml0LnRha2UoKSk7CisgIGlmIChpc0FTVFJlYWRFcnJvcihVbml0ID8gVW5pdC5nZXQoKSA6IEVyclVuaXQuZ2V0KCkpKSB7CisgICAgUFRVSS0+cmVzdWx0ID0gQ1hFcnJvcl9BU1RSZWFkRXJyb3I7CisgIH0gZWxzZSB7CisgICAgKlBUVUktPm91dF9UVSA9IE1ha2VDWFRyYW5zbGF0aW9uVW5pdChDWFhJZHgsIFVuaXQucmVsZWFzZSgpKTsKKyAgICBQVFVJLT5yZXN1bHQgPSAqUFRVSS0+b3V0X1RVID8gQ1hFcnJvcl9TdWNjZXNzIDogQ1hFcnJvcl9GYWlsdXJlOworICB9CiB9Ci1DWFRyYW5zbGF0aW9uVW5pdCBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdChDWEluZGV4IENJZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzb3VyY2VfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqY29tbWFuZF9saW5lX2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NvbW1hbmRfbGluZV9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ1hVbnNhdmVkRmlsZSAqdW5zYXZlZF9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV91bnNhdmVkX2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb3B0aW9ucykgeworCitDWFRyYW5zbGF0aW9uVW5pdAorY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQoQ1hJbmRleCBDSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc291cmNlX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgKmNvbW1hbmRfbGluZV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jb21tYW5kX2xpbmVfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDWFVuc2F2ZWRGaWxlICp1bnNhdmVkX2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3Vuc2F2ZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBvcHRpb25zKSB7CisgIENYVHJhbnNsYXRpb25Vbml0IFRVOworICBlbnVtIENYRXJyb3JDb2RlIFJlc3VsdCA9IGNsYW5nX3BhcnNlVHJhbnNsYXRpb25Vbml0MigKKyAgICAgIENJZHgsIHNvdXJjZV9maWxlbmFtZSwgY29tbWFuZF9saW5lX2FyZ3MsIG51bV9jb21tYW5kX2xpbmVfYXJncywKKyAgICAgIHVuc2F2ZWRfZmlsZXMsIG51bV91bnNhdmVkX2ZpbGVzLCBvcHRpb25zLCAmVFUpOworICAodm9pZClSZXN1bHQ7CisgIGFzc2VydCgoVFUgJiYgUmVzdWx0ID09IENYRXJyb3JfU3VjY2VzcykgfHwKKyAgICAgICAgICghVFUgJiYgUmVzdWx0ICE9IENYRXJyb3JfU3VjY2VzcykpOworICByZXR1cm4gVFU7Cit9CisKK2VudW0gQ1hFcnJvckNvZGUgY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQyKAorICAgIENYSW5kZXggQ0lkeCwKKyAgICBjb25zdCBjaGFyICpzb3VyY2VfZmlsZW5hbWUsCisgICAgY29uc3QgY2hhciAqY29uc3QgKmNvbW1hbmRfbGluZV9hcmdzLAorICAgIGludCBudW1fY29tbWFuZF9saW5lX2FyZ3MsCisgICAgc3RydWN0IENYVW5zYXZlZEZpbGUgKnVuc2F2ZWRfZmlsZXMsCisgICAgdW5zaWduZWQgbnVtX3Vuc2F2ZWRfZmlsZXMsCisgICAgdW5zaWduZWQgb3B0aW9ucywKKyAgICBDWFRyYW5zbGF0aW9uVW5pdCAqb3V0X1RVKSB7CiAgIExPR19GVU5DX1NFQ1RJT04gewogICAgICpMb2cgPDwgc291cmNlX2ZpbGVuYW1lIDw8ICI6ICI7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gbnVtX2NvbW1hbmRfbGluZV9hcmdzOyArK2kpCkBAIC0yNzg3LDcgKzI4MzgsOCBAQAogCiAgIFBhcnNlVHJhbnNsYXRpb25Vbml0SW5mbyBQVFVJID0geyBDSWR4LCBzb3VyY2VfZmlsZW5hbWUsIGNvbW1hbmRfbGluZV9hcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2NvbW1hbmRfbGluZV9hcmdzLCB1bnNhdmVkX2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Vuc2F2ZWRfZmlsZXMsIG9wdGlvbnMsIDAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV91bnNhdmVkX2ZpbGVzLCBvcHRpb25zLCBvdXRfVFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEVycm9yX0ZhaWx1cmUgfTsKICAgbGx2bTo6Q3Jhc2hSZWNvdmVyeUNvbnRleHQgQ1JDOwogCiAgIGlmICghUnVuU2FmZWx5KENSQywgY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXRfSW1wbCwgJlBUVUkpKSB7CkBAIC0yODEwLDEwICsyODYyLDExIEBACiAgICAgZnByaW50ZihzdGRlcnIsICJdLFxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICdvcHRpb25zJyA6ICVkLFxuIiwgb3B0aW9ucyk7CiAgICAgZnByaW50ZihzdGRlcnIsICJ9XG4iKTsKLSAgICAKLSAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBDWEVycm9yX0NyYXNoZWQ7CiAgIH0gZWxzZSBpZiAoZ2V0ZW52KCJMSUJDTEFOR19SRVNPVVJDRV9VU0FHRSIpKSB7Ci0gICAgUHJpbnRMaWJjbGFuZ1Jlc291cmNlVXNhZ2UoUFRVSS5yZXN1bHQpOworICAgIGlmIChDWFRyYW5zbGF0aW9uVW5pdCAqVFUgPSBQVFVJLm91dF9UVSkKKyAgICAgIFByaW50TGliY2xhbmdSZXNvdXJjZVVzYWdlKCpUVSk7CiAgIH0KICAgCiAgIHJldHVybiBQVFVJLnJlc3VsdDsKQEAgLTI4NTIsOCArMjkwNSwxMCBAQAogICAgICpMb2cgPDwgVFUgPDwgJyAnIDw8IEZpbGVOYW1lOwogICB9CiAKLSAgaWYgKCFUVSkKKyAgaWYgKGlzTm90VXNhYmxlVFUoVFUpKSB7CisgICAgTE9HX0JBRF9UVShUVSk7CiAgICAgcmV0dXJuIENYU2F2ZUVycm9yX0ludmFsaWRUVTsKKyAgfQogCiAgIEFTVFVuaXQgKkNYWFVuaXQgPSBjeHR1OjpnZXRBU1RVbml0KFRVKTsKICAgQVNUVW5pdDo6Q29uY3VycmVuY3lDaGVjayBDaGVjaygqQ1hYVW5pdCk7CkBAIC0yODk2LDcgKzI5NTEsOCBAQAogICBpZiAoQ1RVbml0KSB7CiAgICAgLy8gSWYgdGhlIHRyYW5zbGF0aW9uIHVuaXQgaGFzIGJlZW4gbWFya2VkIGFzIHVuc2FmZSB0byBmcmVlLCBqdXN0IGRpc2NhcmQKICAgICAvLyBpdC4KLSAgICBpZiAoY3h0dTo6Z2V0QVNUVW5pdChDVFVuaXQpLT5pc1Vuc2FmZVRvRnJlZSgpKQorICAgIEFTVFVuaXQgKlVuaXQgPSBjeHR1OjpnZXRBU1RVbml0KENUVW5pdCk7CisgICAgaWYgKFVuaXQgJiYgVW5pdC0+aXNVbnNhZmVUb0ZyZWUoKSkKICAgICAgIHJldHVybjsKIAogICAgIGRlbGV0ZSBjeHR1OjpnZXRBU1RVbml0KENUVW5pdCk7CkBAIC0yOTIzLDE5ICsyOTc5LDI4IEBACiBzdGF0aWMgdm9pZCBjbGFuZ19yZXBhcnNlVHJhbnNsYXRpb25Vbml0X0ltcGwodm9pZCAqVXNlckRhdGEpIHsKICAgUmVwYXJzZVRyYW5zbGF0aW9uVW5pdEluZm8gKlJUVUkgPQogICAgIHN0YXRpY19jYXN0PFJlcGFyc2VUcmFuc2xhdGlvblVuaXRJbmZvKj4oVXNlckRhdGEpOworICBSVFVJLT5yZXN1bHQgPSBDWEVycm9yX0ZhaWx1cmU7CisKICAgQ1hUcmFuc2xhdGlvblVuaXQgVFUgPSBSVFVJLT5UVTsKLSAgaWYgKCFUVSkKLSAgICByZXR1cm47Ci0KLSAgLy8gUmVzZXQgdGhlIGFzc29jaWF0ZWQgZGlhZ25vc3RpY3MuCi0gIGRlbGV0ZSBzdGF0aWNfY2FzdDxDWERpYWdub3N0aWNTZXRJbXBsKj4oVFUtPkRpYWdub3N0aWNzKTsKLSAgVFUtPkRpYWdub3N0aWNzID0gMDsKLQogICB1bnNpZ25lZCBudW1fdW5zYXZlZF9maWxlcyA9IFJUVUktPm51bV91bnNhdmVkX2ZpbGVzOwogICBzdHJ1Y3QgQ1hVbnNhdmVkRmlsZSAqdW5zYXZlZF9maWxlcyA9IFJUVUktPnVuc2F2ZWRfZmlsZXM7CiAgIHVuc2lnbmVkIG9wdGlvbnMgPSBSVFVJLT5vcHRpb25zOwogICAodm9pZCkgb3B0aW9uczsKLSAgUlRVSS0+cmVzdWx0ID0gMTsKKworICAvLyBDaGVjayBhcmd1bWVudHMuCisgIGlmIChpc05vdFVzYWJsZVRVKFRVKSkgeworICAgIExPR19CQURfVFUoVFUpOworICAgIFJUVUktPnJlc3VsdCA9IENYRXJyb3JfSW52YWxpZEFyZ3VtZW50czsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHVuc2F2ZWRfZmlsZXMgPT0gTlVMTCAmJiBudW1fdW5zYXZlZF9maWxlcyAhPSAwKSB7CisgICAgUlRVSS0+cmVzdWx0ID0gQ1hFcnJvcl9JbnZhbGlkQXJndW1lbnRzOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFJlc2V0IHRoZSBhc3NvY2lhdGVkIGRpYWdub3N0aWNzLgorICBkZWxldGUgc3RhdGljX2Nhc3Q8Q1hEaWFnbm9zdGljU2V0SW1wbCo+KFRVLT5EaWFnbm9zdGljcyk7CisgIFRVLT5EaWFnbm9zdGljcyA9IDA7CiAKICAgQ0luZGV4ZXIgKkNYWElkeCA9IFRVLT5DSWR4OwogICBpZiAoQ1hYSWR4LT5pc09wdEVuYWJsZWQoQ1hHbG9iYWxPcHRfVGhyZWFkQmFja2dyb3VuZFByaW9yaXR5Rm9yRWRpdGluZykpCkBAIC0yOTQzLDEwICszMDA4LDEwIEBACiAKICAgQVNUVW5pdCAqQ1hYVW5pdCA9IGN4dHU6OmdldEFTVFVuaXQoVFUpOwogICBBU1RVbml0OjpDb25jdXJyZW5jeUNoZWNrIENoZWNrKCpDWFhVbml0KTsKLSAgCi0gIE93bmluZ1B0cjxzdGQ6OnZlY3RvcjxBU1RVbml0OjpSZW1hcHBlZEZpbGU+ID4KLSAgICBSZW1hcHBlZEZpbGVzKG5ldyBzdGQ6OnZlY3RvcjxBU1RVbml0OjpSZW1hcHBlZEZpbGU+KCkpOwotICAKKworICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8QVNUVW5pdDo6UmVtYXBwZWRGaWxlPj4gUmVtYXBwZWRGaWxlcygKKyAgICAgIG5ldyBzdGQ6OnZlY3RvcjxBU1RVbml0OjpSZW1hcHBlZEZpbGU+KCkpOworCiAgIC8vIFJlY292ZXIgcmVzb3VyY2VzIGlmIHdlIGNyYXNoIGJlZm9yZSBleGl0aW5nIHRoaXMgZnVuY3Rpb24uCiAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhcjwKICAgICBzdGQ6OnZlY3RvcjxBU1RVbml0OjpSZW1hcHBlZEZpbGU+ID4gUmVtYXBwZWRDbGVhbnVwKFJlbWFwcGVkRmlsZXMuZ2V0KCkpOwpAQCAtMjk1OCwxMCArMzAyMywxMSBAQAogICAgIFJlbWFwcGVkRmlsZXMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcih1bnNhdmVkX2ZpbGVzW0ldLkZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIpKTsKICAgfQotICAKLSAgaWYgKCFDWFhVbml0LT5SZXBhcnNlKFJlbWFwcGVkRmlsZXMtPnNpemUoKSA/ICYoKlJlbWFwcGVkRmlsZXMpWzBdIDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlbWFwcGVkRmlsZXMtPnNpemUoKSkpCi0gICAgUlRVSS0+cmVzdWx0ID0gMDsKKworICBpZiAoIUNYWFVuaXQtPlJlcGFyc2UoKlJlbWFwcGVkRmlsZXMuZ2V0KCkpKQorICAgIFJUVUktPnJlc3VsdCA9IENYRXJyb3JfU3VjY2VzczsKKyAgZWxzZSBpZiAoaXNBU1RSZWFkRXJyb3IoQ1hYVW5pdCkpCisgICAgUlRVSS0+cmVzdWx0ID0gQ1hFcnJvcl9BU1RSZWFkRXJyb3I7CiB9CiAKIGludCBjbGFuZ19yZXBhcnNlVHJhbnNsYXRpb25Vbml0KENYVHJhbnNsYXRpb25Vbml0IFRVLApAQCAtMjk3Myw3ICszMDM5LDcgQEAKICAgfQogCiAgIFJlcGFyc2VUcmFuc2xhdGlvblVuaXRJbmZvIFJUVUkgPSB7IFRVLCBudW1fdW5zYXZlZF9maWxlcywgdW5zYXZlZF9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgMCB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLCBDWEVycm9yX0ZhaWx1cmUgfTsKIAogICBpZiAoZ2V0ZW52KCJMSUJDTEFOR19OT1RIUkVBRFMiKSkgewogICAgIGNsYW5nX3JlcGFyc2VUcmFuc2xhdGlvblVuaXRfSW1wbCgmUlRVSSk7CkBAIC0yOTg1LDcgKzMwNTEsNyBAQAogICBpZiAoIVJ1blNhZmVseShDUkMsIGNsYW5nX3JlcGFyc2VUcmFuc2xhdGlvblVuaXRfSW1wbCwgJlJUVUkpKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJsaWJjbGFuZzogY3Jhc2ggZGV0ZWN0ZWQgZHVyaW5nIHJlcGFyc2luZ1xuIik7CiAgICAgY3h0dTo6Z2V0QVNUVW5pdChUVSktPnNldFVuc2FmZVRvRnJlZSh0cnVlKTsKLSAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gQ1hFcnJvcl9DcmFzaGVkOwogICB9IGVsc2UgaWYgKGdldGVudigiTElCQ0xBTkdfUkVTT1VSQ0VfVVNBR0UiKSkKICAgICBQcmludExpYmNsYW5nUmVzb3VyY2VVc2FnZShUVSk7CiAKQEAgLTI5OTQsMTYgKzMwNjAsMjAgQEAKIAogCiBDWFN0cmluZyBjbGFuZ19nZXRUcmFuc2xhdGlvblVuaXRTcGVsbGluZyhDWFRyYW5zbGF0aW9uVW5pdCBDVFVuaXQpIHsKLSAgaWYgKCFDVFVuaXQpCisgIGlmIChpc05vdFVzYWJsZVRVKENUVW5pdCkpIHsKKyAgICBMT0dfQkFEX1RVKENUVW5pdCk7CiAgICAgcmV0dXJuIGN4c3RyaW5nOjpjcmVhdGVFbXB0eSgpOworICB9CiAKICAgQVNUVW5pdCAqQ1hYVW5pdCA9IGN4dHU6OmdldEFTVFVuaXQoQ1RVbml0KTsKICAgcmV0dXJuIGN4c3RyaW5nOjpjcmVhdGVEdXAoQ1hYVW5pdC0+Z2V0T3JpZ2luYWxTb3VyY2VGaWxlTmFtZSgpKTsKIH0KIAogQ1hDdXJzb3IgY2xhbmdfZ2V0VHJhbnNsYXRpb25Vbml0Q3Vyc29yKENYVHJhbnNsYXRpb25Vbml0IFRVKSB7Ci0gIGlmICghVFUpCisgIGlmIChpc05vdFVzYWJsZVRVKFRVKSkgeworICAgIExPR19CQURfVFUoVFUpOwogICAgIHJldHVybiBjbGFuZ19nZXROdWxsQ3Vyc29yKCk7CisgIH0KIAogICBBU1RVbml0ICpDWFhVbml0ID0gY3h0dTo6Z2V0QVNUVW5pdChUVSk7CiAgIHJldHVybiBNYWtlQ1hDdXJzb3IoQ1hYVW5pdC0+Z2V0QVNUQ29udGV4dCgpLmdldFRyYW5zbGF0aW9uVW5pdERlY2woKSwgVFUpOwpAQCAtMzAzMyw4ICszMTAzLDEwIEBACiB9CiAKIENYRmlsZSBjbGFuZ19nZXRGaWxlKENYVHJhbnNsYXRpb25Vbml0IFRVLCBjb25zdCBjaGFyICpmaWxlX25hbWUpIHsKLSAgaWYgKCFUVSkKKyAgaWYgKGlzTm90VXNhYmxlVFUoVFUpKSB7CisgICAgTE9HX0JBRF9UVShUVSk7CiAgICAgcmV0dXJuIDA7CisgIH0KIAogICBBU1RVbml0ICpDWFhVbml0ID0gY3h0dTo6Z2V0QVNUVW5pdChUVSk7CiAKQEAgLTMwNDIsOCArMzExNCwxNCBAQAogICByZXR1cm4gY29uc3RfY2FzdDxGaWxlRW50cnkgKj4oRk1nci5nZXRGaWxlKGZpbGVfbmFtZSkpOwogfQogCi11bnNpZ25lZCBjbGFuZ19pc0ZpbGVNdWx0aXBsZUluY2x1ZGVHdWFyZGVkKENYVHJhbnNsYXRpb25Vbml0IFRVLCBDWEZpbGUgZmlsZSkgewotICBpZiAoIVRVIHx8ICFmaWxlKQordW5zaWduZWQgY2xhbmdfaXNGaWxlTXVsdGlwbGVJbmNsdWRlR3VhcmRlZChDWFRyYW5zbGF0aW9uVW5pdCBUVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGaWxlIGZpbGUpIHsKKyAgaWYgKGlzTm90VXNhYmxlVFUoVFUpKSB7CisgICAgTE9HX0JBRF9UVShUVSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoIWZpbGUpCiAgICAgcmV0dXJuIDA7CiAKICAgQVNUVW5pdCAqQ1hYVW5pdCA9IGN4dHU6OmdldEFTVFVuaXQoVFUpOwpAQCAtMzMwOSw2ICszMzg3LDIyIEBACiAgIH0KIAogICBpZiAoY2xhbmdfaXNFeHByZXNzaW9uKEMua2luZCkpIHsKKyAgICBjb25zdCBFeHByICpFID0gZ2V0Q3Vyc29yRXhwcihDKTsKKworICAgIGlmIChDLmtpbmQgPT0gQ1hDdXJzb3JfT2JqQ1N0cmluZ0xpdGVyYWwgfHwKKyAgICAgICAgQy5raW5kID09IENYQ3Vyc29yX1N0cmluZ0xpdGVyYWwpIHsKKyAgICAgIGNvbnN0IFN0cmluZ0xpdGVyYWwgKlNMaXQ7CisgICAgICBpZiAoY29uc3QgT2JqQ1N0cmluZ0xpdGVyYWwgKk9TTCA9IGR5bl9jYXN0PE9iakNTdHJpbmdMaXRlcmFsPihFKSkgeworICAgICAgICBTTGl0ID0gT1NMLT5nZXRTdHJpbmcoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNMaXQgPSBjYXN0PFN0cmluZ0xpdGVyYWw+KEUpOworICAgICAgfQorICAgICAgU21hbGxTdHJpbmc8MjU2PiBCdWY7CisgICAgICBsbHZtOjpyYXdfc3ZlY3Rvcl9vc3RyZWFtIE9TKEJ1Zik7CisgICAgICBTTGl0LT5vdXRwdXRTdHJpbmcoT1MpOworICAgICAgcmV0dXJuIGN4c3RyaW5nOjpjcmVhdGVEdXAoT1Muc3RyKCkpOworICAgIH0KKwogICAgIGNvbnN0IERlY2wgKkQgPSBnZXREZWNsRnJvbUV4cHIoZ2V0Q3Vyc29yRXhwcihDKSk7CiAgICAgaWYgKEQpCiAgICAgICByZXR1cm4gZ2V0RGVjbFNwZWxsaW5nKEQpOwpAQCAtMzgxOSw3ICszOTEzLDkgQEAKICAgY2FzZSBDWEN1cnNvcl9Nb2R1bGVJbXBvcnREZWNsOgogICAgIHJldHVybiBjeHN0cmluZzo6Y3JlYXRlUmVmKCJNb2R1bGVJbXBvcnQiKTsKICAgY2FzZSBDWEN1cnNvcl9PTVBQYXJhbGxlbERpcmVjdGl2ZToKLSAgICAgIHJldHVybiBjeHN0cmluZzo6Y3JlYXRlUmVmKCJPTVBQYXJhbGxlbERpcmVjdGl2ZSIpOworICAgIHJldHVybiBjeHN0cmluZzo6Y3JlYXRlUmVmKCJPTVBQYXJhbGxlbERpcmVjdGl2ZSIpOworICBjYXNlIENYQ3Vyc29yX09NUFNpbWREaXJlY3RpdmU6CisgICAgcmV0dXJuIGN4c3RyaW5nOjpjcmVhdGVSZWYoIk9NUFNpbWREaXJlY3RpdmUiKTsKICAgfQogCiAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCBDWEN1cnNvcktpbmQiKTsKQEAgLTM5MzYsOCArNDAzMiwxMCBAQAogfQogCiBDWEN1cnNvciBjbGFuZ19nZXRDdXJzb3IoQ1hUcmFuc2xhdGlvblVuaXQgVFUsIENYU291cmNlTG9jYXRpb24gTG9jKSB7Ci0gIGlmICghVFUpCisgIGlmIChpc05vdFVzYWJsZVRVKFRVKSkgeworICAgIExPR19CQURfVFUoVFUpOwogICAgIHJldHVybiBjbGFuZ19nZXROdWxsQ3Vyc29yKCk7CisgIH0KIAogICBBU1RVbml0ICpDWFhVbml0ID0gY3h0dTo6Z2V0QVNUVW5pdChUVSk7CiAgIEFTVFVuaXQ6OkNvbmN1cnJlbmN5Q2hlY2sgQ2hlY2soKkNYWFVuaXQpOwpAQCAtNDg5Nyw2ICs0OTk1LDExIEBACiAgICAgYnJlYWs7CiAgIH0KIAorICBpZiAoaXNOb3RVc2FibGVUVShUVSkpIHsKKyAgICBMT0dfQkFEX1RVKFRVKTsKKyAgICByZXR1cm4gY3hzdHJpbmc6OmNyZWF0ZUVtcHR5KCk7CisgIH0KKwogICAvLyBXZSBoYXZlIHRvIGZpbmQgdGhlIHN0YXJ0aW5nIGJ1ZmZlciBwb2ludGVyIHRoZSBoYXJkIHdheSwgYnkKICAgLy8gZGVjb25zdHJ1Y3RpbmcgdGhlIHNvdXJjZSBsb2NhdGlvbi4KICAgQVNUVW5pdCAqQ1hYVW5pdCA9IGN4dHU6OmdldEFTVFVuaXQoVFUpOwpAQCAtNDkxNiw2ICs1MDE5LDExIEBACiB9CiAKIENYU291cmNlTG9jYXRpb24gY2xhbmdfZ2V0VG9rZW5Mb2NhdGlvbihDWFRyYW5zbGF0aW9uVW5pdCBUVSwgQ1hUb2tlbiBDWFRvaykgeworICBpZiAoaXNOb3RVc2FibGVUVShUVSkpIHsKKyAgICBMT0dfQkFEX1RVKFRVKTsKKyAgICByZXR1cm4gY2xhbmdfZ2V0TnVsbExvY2F0aW9uKCk7CisgIH0KKwogICBBU1RVbml0ICpDWFhVbml0ID0gY3h0dTo6Z2V0QVNUVW5pdChUVSk7CiAgIGlmICghQ1hYVW5pdCkKICAgICByZXR1cm4gY2xhbmdfZ2V0TnVsbExvY2F0aW9uKCk7CkBAIC00OTI1LDYgKzUwMzMsMTEgQEAKIH0KIAogQ1hTb3VyY2VSYW5nZSBjbGFuZ19nZXRUb2tlbkV4dGVudChDWFRyYW5zbGF0aW9uVW5pdCBUVSwgQ1hUb2tlbiBDWFRvaykgeworICBpZiAoaXNOb3RVc2FibGVUVShUVSkpIHsKKyAgICBMT0dfQkFEX1RVKFRVKTsKKyAgICByZXR1cm4gY2xhbmdfZ2V0TnVsbFJhbmdlKCk7CisgIH0KKwogICBBU1RVbml0ICpDWFhVbml0ID0gY3h0dTo6Z2V0QVNUVW5pdChUVSk7CiAgIGlmICghQ1hYVW5pdCkKICAgICByZXR1cm4gY2xhbmdfZ2V0TnVsbFJhbmdlKCk7CkBAIC01MDE2LDggKzUxMjksMTAgQEAKICAgaWYgKE51bVRva2VucykKICAgICAqTnVtVG9rZW5zID0gMDsKIAotICBpZiAoIVRVKQorICBpZiAoaXNOb3RVc2FibGVUVShUVSkpIHsKKyAgICBMT0dfQkFEX1RVKFRVKTsKICAgICByZXR1cm47CisgIH0KIAogICBBU1RVbml0ICpDWFhVbml0ID0gY3h0dTo6Z2V0QVNUVW5pdChUVSk7CiAgIGlmICghQ1hYVW5pdCB8fCAhVG9rZW5zIHx8ICFOdW1Ub2tlbnMpCkBAIC01MDc1LDE4ICs1MTkwLDI2IEBACiAgICAgdW5zaWduZWQgQmVmb3JlQ2hpbGRyZW5Ub2tlbklkeDsKICAgfTsKICAgU21hbGxWZWN0b3I8UG9zdENoaWxkcmVuSW5mbywgOD4gUG9zdENoaWxkcmVuSW5mb3M7Ci0gIAorCisgIENYVG9rZW4gJmdldFRvayh1bnNpZ25lZCBJZHgpIHsKKyAgICBhc3NlcnQoSWR4IDwgTnVtVG9rZW5zKTsKKyAgICByZXR1cm4gVG9rZW5zW0lkeF07CisgIH0KKyAgY29uc3QgQ1hUb2tlbiAmZ2V0VG9rKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBOdW1Ub2tlbnMpOworICAgIHJldHVybiBUb2tlbnNbSWR4XTsKKyAgfQogICBib29sIE1vcmVUb2tlbnMoKSBjb25zdCB7IHJldHVybiBUb2tJZHggPCBOdW1Ub2tlbnM7IH0KICAgdW5zaWduZWQgTmV4dFRva2VuKCkgY29uc3QgeyByZXR1cm4gVG9rSWR4OyB9CiAgIHZvaWQgQWR2YW5jZVRva2VuKCkgeyArK1Rva0lkeDsgfQogICBTb3VyY2VMb2NhdGlvbiBHZXRUb2tlbkxvYyh1bnNpZ25lZCB0b2tJKSB7Ci0gICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uOjpnZXRGcm9tUmF3RW5jb2RpbmcoVG9rZW5zW3Rva0ldLmludF9kYXRhWzFdKTsKKyAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhnZXRUb2sodG9rSSkuaW50X2RhdGFbMV0pOwogICB9CiAgIGJvb2wgaXNGdW5jdGlvbk1hY3JvVG9rZW4odW5zaWduZWQgdG9rSSkgY29uc3QgewotICAgIHJldHVybiBUb2tlbnNbdG9rSV0uaW50X2RhdGFbM10gIT0gMDsKKyAgICByZXR1cm4gZ2V0VG9rKHRva0kpLmludF9kYXRhWzNdICE9IDA7CiAgIH0KICAgU291cmNlTG9jYXRpb24gZ2V0RnVuY3Rpb25NYWNyb1Rva2VuTG9jKHVuc2lnbmVkIHRva0kpIGNvbnN0IHsKLSAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhUb2tlbnNbdG9rSV0uaW50X2RhdGFbM10pOworICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKGdldFRvayh0b2tJKS5pbnRfZGF0YVszXSk7CiAgIH0KIAogICB2b2lkIGFubm90YXRlQW5kQWR2YW5jZVRva2VucyhDWEN1cnNvciwgUmFuZ2VDb21wYXJpc29uUmVzdWx0LCBTb3VyY2VSYW5nZSk7CkBAIC01MjIzLDEwICs1MzQ2LDggQEAKICAgICAgICAgaWYgKE1ldGhvZC0+Z2V0T2JqQ0RlY2xRdWFsaWZpZXIoKSkKICAgICAgICAgICBIYXNDb250ZXh0U2Vuc2l0aXZlS2V5d29yZHMgPSB0cnVlOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICBmb3IgKE9iakNNZXRob2REZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBQID0gTWV0aG9kLT5wYXJhbV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFbmQgPSBNZXRob2QtPnBhcmFtX2VuZCgpOwotICAgICAgICAgICAgICAgUCAhPSBQRW5kOyArK1ApIHsKLSAgICAgICAgICAgIGlmICgoKlApLT5nZXRPYmpDRGVjbFF1YWxpZmllcigpKSB7CisgICAgICAgICAgZm9yIChjb25zdCBhdXRvICpQIDogTWV0aG9kLT5wYXJhbXMoKSkgeworICAgICAgICAgICAgaWYgKFAtPmdldE9iakNEZWNsUXVhbGlmaWVyKCkpIHsKICAgICAgICAgICAgICAgSGFzQ29udGV4dFNlbnNpdGl2ZUtleXdvcmRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC01MzMzLDcgKzU0NTQsNyBAQAogICAvLyBUaGlzIGNhbiBoYXBwZW4gZm9yIEMrKyBjb25zdHJ1Y3RvciBleHByZXNzaW9ucyB3aG9zZSByYW5nZSBnZW5lcmFsbHkKICAgLy8gaW5jbHVkZSB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24sIGUuZy46CiAgIC8vICBNeUNYWENsYXNzIGZvbzsgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGFubm90YXRlICdmb28nIGFzIGEgQ2FsbEV4cHIgY3Vyc29yLgotICBpZiAoY2xhbmdfaXNFeHByZXNzaW9uKGN1cnNvckspKSB7CisgIGlmIChjbGFuZ19pc0V4cHJlc3Npb24oY3Vyc29ySykgJiYgTW9yZVRva2VucygpKSB7CiAgICAgY29uc3QgRXhwciAqRSA9IGdldEN1cnNvckV4cHIoY3Vyc29yKTsKICAgICBpZiAoY29uc3QgRGVjbCAqRCA9IGdldEN1cnNvclBhcmVudERlY2woY3Vyc29yKSkgewogICAgICAgY29uc3QgdW5zaWduZWQgSSA9IE5leHRUb2tlbigpOwpAQCAtNTQ1NSwxNCArNTU3NiwyMyBAQAogICB9CiAKIHByaXZhdGU6CisgIENYVG9rZW4gJmdldFRvayh1bnNpZ25lZCBJZHgpIHsKKyAgICBhc3NlcnQoSWR4IDwgTnVtVG9rZW5zKTsKKyAgICByZXR1cm4gVG9rZW5zW0lkeF07CisgIH0KKyAgY29uc3QgQ1hUb2tlbiAmZ2V0VG9rKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBOdW1Ub2tlbnMpOworICAgIHJldHVybiBUb2tlbnNbSWR4XTsKKyAgfQorCiAgIFNvdXJjZUxvY2F0aW9uIGdldFRva2VuTG9jKHVuc2lnbmVkIHRva0kpIHsKLSAgICByZXR1cm4gU291cmNlTG9jYXRpb246OmdldEZyb21SYXdFbmNvZGluZyhUb2tlbnNbdG9rSV0uaW50X2RhdGFbMV0pOworICAgIHJldHVybiBTb3VyY2VMb2NhdGlvbjo6Z2V0RnJvbVJhd0VuY29kaW5nKGdldFRvayh0b2tJKS5pbnRfZGF0YVsxXSk7CiAgIH0KIAogICB2b2lkIHNldEZ1bmN0aW9uTWFjcm9Ub2tlbkxvYyh1bnNpZ25lZCB0b2tJLCBTb3VyY2VMb2NhdGlvbiBsb2MpIHsKICAgICAvLyBUaGUgdGhpcmQgZmllbGQgaXMgcmVzZXJ2ZWQgYW5kIGN1cnJlbnRseSBub3QgdXNlZC4gVXNlIGl0IGhlcmUKICAgICAvLyB0byBtYXJrIG1hY3JvIGFyZyBleHBhbmRlZCB0b2tlbnMgd2l0aCB0aGVpciBleHBhbmRlZCBsb2NhdGlvbnMuCi0gICAgVG9rZW5zW3Rva0ldLmludF9kYXRhWzNdID0gbG9jLmdldFJhd0VuY29kaW5nKCk7CisgICAgZ2V0VG9rKHRva0kpLmludF9kYXRhWzNdID0gbG9jLmdldFJhd0VuY29kaW5nKCk7CiAgIH0KIH07CiAKQEAgLTU3MjAsNyArNTg1MCwxMSBAQAogdm9pZCBjbGFuZ19hbm5vdGF0ZVRva2VucyhDWFRyYW5zbGF0aW9uVW5pdCBUVSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hUb2tlbiAqVG9rZW5zLCB1bnNpZ25lZCBOdW1Ub2tlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENYQ3Vyc29yICpDdXJzb3JzKSB7Ci0gIGlmICghVFUgfHwgTnVtVG9rZW5zID09IDAgfHwgIVRva2VucyB8fCAhQ3Vyc29ycykgeworICBpZiAoaXNOb3RVc2FibGVUVShUVSkpIHsKKyAgICBMT0dfQkFEX1RVKFRVKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKE51bVRva2VucyA9PSAwIHx8ICFUb2tlbnMgfHwgIUN1cnNvcnMpIHsKICAgICBMT0dfRlVOQ19TRUNUSU9OIHsgKkxvZyA8PCAiPG51bGwgaW5wdXQ+IjsgfQogICAgIHJldHVybjsKICAgfQpAQCAtNTg5MCw5ICs2MDI0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdmFpbGFiaWxpdHlfc2l6ZSkgewogICBib29sIEhhZEF2YWlsQXR0ciA9IGZhbHNlOwogICBpbnQgTiA9IDA7Ci0gIGZvciAoRGVjbDo6YXR0cl9pdGVyYXRvciBBID0gRC0+YXR0cl9iZWdpbigpLCBBRW5kID0gRC0+YXR0cl9lbmQoKTsgQSAhPSBBRW5kOwotICAgICAgICsrQSkgewotICAgIGlmIChEZXByZWNhdGVkQXR0ciAqRGVwcmVjYXRlZCA9IGR5bl9jYXN0PERlcHJlY2F0ZWRBdHRyPigqQSkpIHsKKyAgZm9yIChhdXRvIEEgOiBELT5hdHRycygpKSB7CisgICAgaWYgKERlcHJlY2F0ZWRBdHRyICpEZXByZWNhdGVkID0gZHluX2Nhc3Q8RGVwcmVjYXRlZEF0dHI+KEEpKSB7CiAgICAgICBIYWRBdmFpbEF0dHIgPSB0cnVlOwogICAgICAgaWYgKGFsd2F5c19kZXByZWNhdGVkKQogICAgICAgICAqYWx3YXlzX2RlcHJlY2F0ZWQgPSAxOwpAQCAtNTkwMSw3ICs2MDM0LDcgQEAKICAgICAgIGNvbnRpbnVlOwogICAgIH0KICAgICAKLSAgICBpZiAoVW5hdmFpbGFibGVBdHRyICpVbmF2YWlsYWJsZSA9IGR5bl9jYXN0PFVuYXZhaWxhYmxlQXR0cj4oKkEpKSB7CisgICAgaWYgKFVuYXZhaWxhYmxlQXR0ciAqVW5hdmFpbGFibGUgPSBkeW5fY2FzdDxVbmF2YWlsYWJsZUF0dHI+KEEpKSB7CiAgICAgICBIYWRBdmFpbEF0dHIgPSB0cnVlOwogICAgICAgaWYgKGFsd2F5c191bmF2YWlsYWJsZSkKICAgICAgICAgKmFsd2F5c191bmF2YWlsYWJsZSA9IDE7CkBAIC01OTExLDcgKzYwNDQsNyBAQAogICAgICAgY29udGludWU7CiAgICAgfQogICAgIAotICAgIGlmIChBdmFpbGFiaWxpdHlBdHRyICpBdmFpbCA9IGR5bl9jYXN0PEF2YWlsYWJpbGl0eUF0dHI+KCpBKSkgeworICAgIGlmIChBdmFpbGFiaWxpdHlBdHRyICpBdmFpbCA9IGR5bl9jYXN0PEF2YWlsYWJpbGl0eUF0dHI+KEEpKSB7CiAgICAgICBIYWRBdmFpbEF0dHIgPSB0cnVlOwogICAgICAgaWYgKE4gPCBhdmFpbGFiaWxpdHlfc2l6ZSkgewogICAgICAgICBhdmFpbGFiaWxpdHlbTl0uUGxhdGZvcm0KQEAgLTYyMjMsNyArNjM1NiwxMSBAQAogCiB1bnNpZ25lZCBjbGFuZ19Nb2R1bGVfZ2V0TnVtVG9wTGV2ZWxIZWFkZXJzKENYVHJhbnNsYXRpb25Vbml0IFRVLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWE1vZHVsZSBDWE1vZCkgewotICBpZiAoIVRVIHx8ICFDWE1vZCkKKyAgaWYgKGlzTm90VXNhYmxlVFUoVFUpKSB7CisgICAgTE9HX0JBRF9UVShUVSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFDWE1vZCkKICAgICByZXR1cm4gMDsKICAgTW9kdWxlICpNb2QgPSBzdGF0aWNfY2FzdDxNb2R1bGUqPihDWE1vZCk7CiAgIEZpbGVNYW5hZ2VyICZGaWxlTWdyID0gY3h0dTo6Z2V0QVNUVW5pdChUVSktPmdldEZpbGVNYW5hZ2VyKCk7CkBAIC02MjMzLDcgKzYzNzAsMTEgQEAKIAogQ1hGaWxlIGNsYW5nX01vZHVsZV9nZXRUb3BMZXZlbEhlYWRlcihDWFRyYW5zbGF0aW9uVW5pdCBUVSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hNb2R1bGUgQ1hNb2QsIHVuc2lnbmVkIEluZGV4KSB7Ci0gIGlmICghVFUgfHwgIUNYTW9kKQorICBpZiAoaXNOb3RVc2FibGVUVShUVSkpIHsKKyAgICBMT0dfQkFEX1RVKFRVKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIUNYTW9kKQogICAgIHJldHVybiAwOwogICBNb2R1bGUgKk1vZCA9IHN0YXRpY19jYXN0PE1vZHVsZSo+KENYTW9kKTsKICAgRmlsZU1hbmFnZXIgJkZpbGVNZ3IgPSBjeHR1OjpnZXRBU1RVbml0KFRVKS0+Z2V0RmlsZU1hbmFnZXIoKTsKQEAgLTYyNTYsMTMgKzYzOTcsOSBAQAogICBpZiAoIWNsYW5nX2lzRGVjbGFyYXRpb24oQy5raW5kKSkKICAgICByZXR1cm4gMDsKIAotICBjb25zdCBDWFhNZXRob2REZWNsICpNZXRob2QgPSAwOwogICBjb25zdCBEZWNsICpEID0gY3hjdXJzb3I6OmdldEN1cnNvckRlY2woQyk7Ci0gIGlmIChjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRnVuVG1wbCA9Ci0gICAgICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oRCkpCi0gICAgTWV0aG9kID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4oRnVuVG1wbC0+Z2V0VGVtcGxhdGVkRGVjbCgpKTsKLSAgZWxzZQotICAgIE1ldGhvZCA9IGR5bl9jYXN0X29yX251bGw8Q1hYTWV0aG9kRGVjbD4oRCk7CisgIGNvbnN0IENYWE1ldGhvZERlY2wgKk1ldGhvZCA9CisgICAgICBEID8gZHluX2Nhc3Rfb3JfbnVsbDxDWFhNZXRob2REZWNsPihELT5nZXRBc0Z1bmN0aW9uKCkpIDogMDsKICAgcmV0dXJuIChNZXRob2QgJiYgTWV0aG9kLT5pc1ZpcnR1YWwoKSAmJiBNZXRob2QtPmlzUHVyZSgpKSA/IDEgOiAwOwogfQogCkBAIC02MjcwLDEzICs2NDA3LDkgQEAKICAgaWYgKCFjbGFuZ19pc0RlY2xhcmF0aW9uKEMua2luZCkpCiAgICAgcmV0dXJuIDA7CiAgIAotICBjb25zdCBDWFhNZXRob2REZWNsICpNZXRob2QgPSAwOwogICBjb25zdCBEZWNsICpEID0gY3hjdXJzb3I6OmdldEN1cnNvckRlY2woQyk7Ci0gIGlmIChjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRnVuVG1wbCA9Ci0gICAgICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oRCkpCi0gICAgTWV0aG9kID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4oRnVuVG1wbC0+Z2V0VGVtcGxhdGVkRGVjbCgpKTsKLSAgZWxzZQotICAgIE1ldGhvZCA9IGR5bl9jYXN0X29yX251bGw8Q1hYTWV0aG9kRGVjbD4oRCk7CisgIGNvbnN0IENYWE1ldGhvZERlY2wgKk1ldGhvZCA9CisgICAgICBEID8gZHluX2Nhc3Rfb3JfbnVsbDxDWFhNZXRob2REZWNsPihELT5nZXRBc0Z1bmN0aW9uKCkpIDogMDsKICAgcmV0dXJuIChNZXRob2QgJiYgTWV0aG9kLT5pc1N0YXRpYygpKSA/IDEgOiAwOwogfQogCkBAIC02Mjg0LDEzICs2NDE3LDkgQEAKICAgaWYgKCFjbGFuZ19pc0RlY2xhcmF0aW9uKEMua2luZCkpCiAgICAgcmV0dXJuIDA7CiAgIAotICBjb25zdCBDWFhNZXRob2REZWNsICpNZXRob2QgPSAwOwogICBjb25zdCBEZWNsICpEID0gY3hjdXJzb3I6OmdldEN1cnNvckRlY2woQyk7Ci0gIGlmIChjb25zdCBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRnVuVG1wbCA9Ci0gICAgICAgICAgZHluX2Nhc3Rfb3JfbnVsbDxGdW5jdGlvblRlbXBsYXRlRGVjbD4oRCkpCi0gICAgTWV0aG9kID0gZHluX2Nhc3Q8Q1hYTWV0aG9kRGVjbD4oRnVuVG1wbC0+Z2V0VGVtcGxhdGVkRGVjbCgpKTsKLSAgZWxzZQotICAgIE1ldGhvZCA9IGR5bl9jYXN0X29yX251bGw8Q1hYTWV0aG9kRGVjbD4oRCk7CisgIGNvbnN0IENYWE1ldGhvZERlY2wgKk1ldGhvZCA9CisgICAgICBEID8gZHluX2Nhc3Rfb3JfbnVsbDxDWFhNZXRob2REZWNsPihELT5nZXRBc0Z1bmN0aW9uKCkpIDogMDsKICAgcmV0dXJuIChNZXRob2QgJiYgTWV0aG9kLT5pc1ZpcnR1YWwoKSkgPyAxIDogMDsKIH0KIH0gLy8gZW5kOiBleHRlcm4gIkMiCkBAIC02Mzc2LDEzICs2NTA1LDE0IEBACiB9CiAKIENYVFVSZXNvdXJjZVVzYWdlIGNsYW5nX2dldENYVFVSZXNvdXJjZVVzYWdlKENYVHJhbnNsYXRpb25Vbml0IFRVKSB7Ci0gIGlmICghVFUpIHsKKyAgaWYgKGlzTm90VXNhYmxlVFUoVFUpKSB7CisgICAgTE9HX0JBRF9UVShUVSk7CiAgICAgQ1hUVVJlc291cmNlVXNhZ2UgdXNhZ2UgPSB7ICh2b2lkKikgMCwgMCwgMCB9OwogICAgIHJldHVybiB1c2FnZTsKICAgfQogICAKICAgQVNUVW5pdCAqYXN0VW5pdCA9IGN4dHU6OmdldEFTVFVuaXQoVFUpOwotICBPd25pbmdQdHI8TWVtVXNhZ2VFbnRyaWVzPiBlbnRyaWVzKG5ldyBNZW1Vc2FnZUVudHJpZXMoKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1Vc2FnZUVudHJpZXM+IGVudHJpZXMobmV3IE1lbVVzYWdlRW50cmllcygpKTsKICAgQVNUQ29udGV4dCAmYXN0Q29udGV4dCA9IGFzdFVuaXQtPmdldEFTVENvbnRleHQoKTsKICAgCiAgIC8vIEhvdyBtdWNoIG1lbW9yeSBpcyB1c2VkIGJ5IEFTVCBub2RlcyBhbmQgdHlwZXM/CkBAIC02NDYzLDcgKzY1OTMsNyBAQAogICBDWFRVUmVzb3VyY2VVc2FnZSB1c2FnZSA9IHsgKHZvaWQqKSBlbnRyaWVzLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgZW50cmllcy0+c2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMtPnNpemUoKSA/ICYoKmVudHJpZXMpWzBdIDogMCB9OwotICBlbnRyaWVzLnRha2UoKTsKKyAgZW50cmllcy5yZWxlYXNlKCk7CiAgIHJldHVybiB1c2FnZTsKIH0KIApAQCAtNjQ3Miw2ICs2NjAyLDUyIEBACiAgICAgZGVsZXRlIChNZW1Vc2FnZUVudHJpZXMqKSB1c2FnZS5kYXRhOwogfQogCitDWFNvdXJjZVJhbmdlTGlzdCAqY2xhbmdfZ2V0U2tpcHBlZFJhbmdlcyhDWFRyYW5zbGF0aW9uVW5pdCBUVSwgQ1hGaWxlIGZpbGUpIHsKKyAgQ1hTb3VyY2VSYW5nZUxpc3QgKnNraXBwZWQgPSBuZXcgQ1hTb3VyY2VSYW5nZUxpc3Q7CisgIHNraXBwZWQtPmNvdW50ID0gMDsKKyAgc2tpcHBlZC0+cmFuZ2VzID0gMDsKKworICBpZiAoaXNOb3RVc2FibGVUVShUVSkpIHsKKyAgICBMT0dfQkFEX1RVKFRVKTsKKyAgICByZXR1cm4gc2tpcHBlZDsKKyAgfQorCisgIGlmICghZmlsZSkKKyAgICByZXR1cm4gc2tpcHBlZDsKKworICBBU1RVbml0ICphc3RVbml0ID0gY3h0dTo6Z2V0QVNUVW5pdChUVSk7CisgIFByZXByb2Nlc3NpbmdSZWNvcmQgKnBwUmVjID0gYXN0VW5pdC0+Z2V0UHJlcHJvY2Vzc29yKCkuZ2V0UHJlcHJvY2Vzc2luZ1JlY29yZCgpOworICBpZiAoIXBwUmVjKQorICAgIHJldHVybiBza2lwcGVkOworCisgIEFTVENvbnRleHQgJkN0eCA9IGFzdFVuaXQtPmdldEFTVENvbnRleHQoKTsKKyAgU291cmNlTWFuYWdlciAmc20gPSBDdHguZ2V0U291cmNlTWFuYWdlcigpOworICBGaWxlRW50cnkgKmZpbGVFbnRyeSA9IHN0YXRpY19jYXN0PEZpbGVFbnRyeSAqPihmaWxlKTsKKyAgRmlsZUlEIHdhbnRlZEZpbGVJRCA9IHNtLnRyYW5zbGF0ZUZpbGUoZmlsZUVudHJ5KTsKKworICBjb25zdCBzdGQ6OnZlY3RvcjxTb3VyY2VSYW5nZT4gJlNraXBwZWRSYW5nZXMgPSBwcFJlYy0+Z2V0U2tpcHBlZFJhbmdlcygpOworICBzdGQ6OnZlY3RvcjxTb3VyY2VSYW5nZT4gd2FudGVkUmFuZ2VzOworICBmb3IgKHN0ZDo6dmVjdG9yPFNvdXJjZVJhbmdlPjo6Y29uc3RfaXRlcmF0b3IgaSA9IFNraXBwZWRSYW5nZXMuYmVnaW4oKSwgZWkgPSBTa2lwcGVkUmFuZ2VzLmVuZCgpOworICAgICAgIGkgIT0gZWk7ICsraSkgeworICAgIGlmIChzbS5nZXRGaWxlSUQoaS0+Z2V0QmVnaW4oKSkgPT0gd2FudGVkRmlsZUlEIHx8IHNtLmdldEZpbGVJRChpLT5nZXRFbmQoKSkgPT0gd2FudGVkRmlsZUlEKQorICAgICAgd2FudGVkUmFuZ2VzLnB1c2hfYmFjaygqaSk7CisgIH0KKworICBza2lwcGVkLT5jb3VudCA9IHdhbnRlZFJhbmdlcy5zaXplKCk7CisgIHNraXBwZWQtPnJhbmdlcyA9IG5ldyBDWFNvdXJjZVJhbmdlW3NraXBwZWQtPmNvdW50XTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZWkgPSBza2lwcGVkLT5jb3VudDsgaSAhPSBlaTsgKytpKQorICAgIHNraXBwZWQtPnJhbmdlc1tpXSA9IGN4bG9jOjp0cmFuc2xhdGVTb3VyY2VSYW5nZShDdHgsIHdhbnRlZFJhbmdlc1tpXSk7CisKKyAgcmV0dXJuIHNraXBwZWQ7Cit9CisKK3ZvaWQgY2xhbmdfZGlzcG9zZVNvdXJjZVJhbmdlTGlzdChDWFNvdXJjZVJhbmdlTGlzdCAqcmFuZ2VzKSB7CisgIGlmIChyYW5nZXMpIHsKKyAgICBkZWxldGVbXSByYW5nZXMtPnJhbmdlczsKKyAgICBkZWxldGUgcmFuZ2VzOworICB9Cit9CisKIH0gLy8gZW5kIGV4dGVybiAiQyIKIAogdm9pZCBjbGFuZzo6UHJpbnRMaWJjbGFuZ1Jlc291cmNlVXNhZ2UoQ1hUcmFuc2xhdGlvblVuaXQgVFUpIHsKQEAgLTY2NTUsOSArNjgzMSw5IEBACiAgICAgICAgIExvZ09TIDw8ICIgKCIgPDwgVW5pdC0+Z2V0QVNURmlsZU5hbWUoKSA8PCAnKSc7CiAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgfQorICB9IGVsc2UgeworICAgIExvZ09TIDw8ICI8TlVMTCBUVT4iOwogICB9Ci0KLSAgTG9nT1MgPDwgIjxOVUxMIFRVPiI7CiAgIHJldHVybiAqdGhpczsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvQ0luZGV4Q29kZUNvbXBsZXRpb24uY3BwIGIvdG9vbHMvbGliY2xhbmcvQ0luZGV4Q29kZUNvbXBsZXRpb24uY3BwCmluZGV4IDg2NWJiNTguLjU5MTI5NDUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmNsYW5nL0NJbmRleENvZGVDb21wbGV0aW9uLmNwcAorKysgYi90b29scy9saWJjbGFuZy9DSW5kZXhDb2RlQ29tcGxldGlvbi5jcHAKQEAgLTMwLDEzICszMCwxMyBAQAogI2luY2x1ZGUgImNsYW5nL1NlbWEvU2VtYS5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCi0jaW5jbHVkZSAibGx2bS9TdXBwb3J0L0F0b21pYy5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DcmFzaFJlY292ZXJ5Q29udGV4dC5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qcm9ncmFtLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RpbWVyLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPGNzdGRpbz4KICNpbmNsdWRlIDxjc3RkbGliPgogI2luY2x1ZGUgPHN0cmluZz4KQEAgLTMxNSw3ICszMTUsNyBAQAogLy8vIGN1cnJlbnRseSBhY3RpdmUuCiAvLy8KIC8vLyBVc2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KLXN0YXRpYyBsbHZtOjpzeXM6OmNhc19mbGFnIENvZGVDb21wbGV0aW9uUmVzdWx0T2JqZWN0czsKK3N0YXRpYyBzdGQ6OmF0b21pYzx1bnNpZ25lZD4gQ29kZUNvbXBsZXRpb25SZXN1bHRPYmplY3RzOwogICAKIEFsbG9jYXRlZENYQ29kZUNvbXBsZXRlUmVzdWx0czo6QWxsb2NhdGVkQ1hDb2RlQ29tcGxldGVSZXN1bHRzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlU3lzdGVtT3B0aW9ucyYgRmlsZVN5c3RlbU9wdHMpCkBAIC0zMzIsMTAgKzMzMiw5IEBACiAgICAgQ29udGFpbmVyS2luZChDWEN1cnNvcl9JbnZhbGlkQ29kZSksCiAgICAgQ29udGFpbmVySXNJbmNvbXBsZXRlKDEpCiB7IAotICBpZiAoZ2V0ZW52KCJMSUJDTEFOR19PQkpUUkFDS0lORyIpKSB7Ci0gICAgbGx2bTo6c3lzOjpBdG9taWNJbmNyZW1lbnQoJkNvZGVDb21wbGV0aW9uUmVzdWx0T2JqZWN0cyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICIrKysgJWQgY29tcGxldGlvbiByZXN1bHRzXG4iLCBDb2RlQ29tcGxldGlvblJlc3VsdE9iamVjdHMpOwotICB9ICAgIAorICBpZiAoZ2V0ZW52KCJMSUJDTEFOR19PQkpUUkFDS0lORyIpKQorICAgIGZwcmludGYoc3RkZXJyLCAiKysrICV1IGNvbXBsZXRpb24gcmVzdWx0c1xuIiwKKyAgICAgICAgICAgICsrQ29kZUNvbXBsZXRpb25SZXN1bHRPYmplY3RzKTsKIH0KICAgCiBBbGxvY2F0ZWRDWENvZGVDb21wbGV0ZVJlc3VsdHM6On5BbGxvY2F0ZWRDWENvZGVDb21wbGV0ZVJlc3VsdHMoKSB7CkBAIC0zNDYsMTAgKzM0NSw5IEBACiAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBUZW1wb3JhcnlCdWZmZXJzLnNpemUoKTsgSSAhPSBOOyArK0kpCiAgICAgZGVsZXRlIFRlbXBvcmFyeUJ1ZmZlcnNbSV07CiAKLSAgaWYgKGdldGVudigiTElCQ0xBTkdfT0JKVFJBQ0tJTkciKSkgewotICAgIGxsdm06OnN5czo6QXRvbWljRGVjcmVtZW50KCZDb2RlQ29tcGxldGlvblJlc3VsdE9iamVjdHMpOwotICAgIGZwcmludGYoc3RkZXJyLCAiLS0tICVkIGNvbXBsZXRpb24gcmVzdWx0c1xuIiwgQ29kZUNvbXBsZXRpb25SZXN1bHRPYmplY3RzKTsKLSAgfSAgICAKKyAgaWYgKGdldGVudigiTElCQ0xBTkdfT0JKVFJBQ0tJTkciKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIi0tLSAldSBjb21wbGV0aW9uIHJlc3VsdHNcbiIsCisgICAgICAgICAgICAtLUNvZGVDb21wbGV0aW9uUmVzdWx0T2JqZWN0cyk7CiB9CiAgIAogfSAvLyBlbmQgZXh0ZXJuICJDIgpAQCAtNTM5LDExICs1MzcsMTEgQEAKICAgICAgICAgQWxsb2NhdGVkUmVzdWx0cyhSZXN1bHRzKSwgQ0NUVUluZm8oUmVzdWx0cy5Db2RlQ29tcGxldGlvbkFsbG9jYXRvciksCiAgICAgICAgIFRVKFRyYW5zbGF0aW9uVW5pdCkgeyB9CiAgICAgfkNhcHR1cmVDb21wbGV0aW9uUmVzdWx0cygpIHsgRmluaXNoKCk7IH0KLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgUHJvY2Vzc0NvZGVDb21wbGV0ZVJlc3VsdHMoU2VtYSAmUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uQ29udGV4dCBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlQ29tcGxldGlvblJlc3VsdCAqUmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtUmVzdWx0cykgeworCisgICAgdm9pZCBQcm9jZXNzQ29kZUNvbXBsZXRlUmVzdWx0cyhTZW1hICZTLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVDb21wbGV0aW9uQ29udGV4dCBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUNvbXBsZXRpb25SZXN1bHQgKlJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZXN1bHRzKSBvdmVycmlkZSB7CiAgICAgICBTdG9yZWRSZXN1bHRzLnJlc2VydmUoU3RvcmVkUmVzdWx0cy5zaXplKCkgKyBOdW1SZXN1bHRzKTsKICAgICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gTnVtUmVzdWx0czsgKytJKSB7CiAgICAgICAgIENvZGVDb21wbGV0aW9uU3RyaW5nICpTdG9yZWRDb21wbGV0aW9uICAgICAgICAKQEAgLTYxNiwxMCArNjE0LDEwIEBACiAgICAgICAgIEFsbG9jYXRlZFJlc3VsdHMuQ29udGFpbmVySXNJbmNvbXBsZXRlID0gMTsKICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIFByb2Nlc3NPdmVybG9hZENhbmRpZGF0ZXMoU2VtYSAmUywgdW5zaWduZWQgQ3VycmVudEFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybG9hZENhbmRpZGF0ZSAqQ2FuZGlkYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1DYW5kaWRhdGVzKSB7CisKKyAgICB2b2lkIFByb2Nlc3NPdmVybG9hZENhbmRpZGF0ZXMoU2VtYSAmUywgdW5zaWduZWQgQ3VycmVudEFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRDYW5kaWRhdGUgKkNhbmRpZGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNhbmRpZGF0ZXMpIG92ZXJyaWRlIHsKICAgICAgIFN0b3JlZFJlc3VsdHMucmVzZXJ2ZShTdG9yZWRSZXN1bHRzLnNpemUoKSArIE51bUNhbmRpZGF0ZXMpOwogICAgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSAhPSBOdW1DYW5kaWRhdGVzOyArK0kpIHsKICAgICAgICAgQ29kZUNvbXBsZXRpb25TdHJpbmcgKlN0b3JlZENvbXBsZXRpb24KQEAgLTYzMiwxMyArNjMwLDEzIEBACiAgICAgICAgIFN0b3JlZFJlc3VsdHMucHVzaF9iYWNrKFIpOwogICAgICAgfQogICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIENvZGVDb21wbGV0aW9uQWxsb2NhdG9yICZnZXRBbGxvY2F0b3IoKSB7IAorCisgICAgQ29kZUNvbXBsZXRpb25BbGxvY2F0b3IgJmdldEFsbG9jYXRvcigpIG92ZXJyaWRlIHsKICAgICAgIHJldHVybiAqQWxsb2NhdGVkUmVzdWx0cy5Db2RlQ29tcGxldGlvbkFsbG9jYXRvcjsKICAgICB9CiAKLSAgICB2aXJ0dWFsIENvZGVDb21wbGV0aW9uVFVJbmZvICZnZXRDb2RlQ29tcGxldGlvblRVSW5mbygpIHsgcmV0dXJuIENDVFVJbmZvOyB9Ci0gICAgCisgICAgQ29kZUNvbXBsZXRpb25UVUluZm8gJmdldENvZGVDb21wbGV0aW9uVFVJbmZvKCkgb3ZlcnJpZGUgeyByZXR1cm4gQ0NUVUluZm87fQorCiAgIHByaXZhdGU6CiAgICAgdm9pZCBGaW5pc2goKSB7CiAgICAgICBBbGxvY2F0ZWRSZXN1bHRzLlJlc3VsdHMgPSBuZXcgQ1hDb21wbGV0aW9uUmVzdWx0IFtTdG9yZWRSZXN1bHRzLnNpemUoKV07CkBAIC02ODAsNyArNjc4LDEyIEBACiAjZW5kaWYKIAogICBib29sIEVuYWJsZUxvZ2dpbmcgPSBnZXRlbnYoIkxJQkNMQU5HX0NPREVfQ09NUExFVElPTl9MT0dHSU5HIikgIT0gMDsKLSAgCisKKyAgaWYgKGN4dHU6OmlzTm90VXNhYmxlVFUoVFUpKSB7CisgICAgTE9HX0JBRF9UVShUVSk7CisgICAgcmV0dXJuOworICB9CisKICAgQVNUVW5pdCAqQVNUID0gY3h0dTo6Z2V0QVNUVW5pdChUVSk7CiAgIGlmICghQVNUKQogICAgIHJldHVybjsKQEAgLTcxOCw3ICs3MjEsNyBAQAogCiAgIC8vIFBlcmZvcm0gY29tcGxldGlvbi4KICAgQVNULT5Db2RlQ29tcGxldGUoY29tcGxldGVfZmlsZW5hbWUsIGNvbXBsZXRlX2xpbmUsIGNvbXBsZXRlX2NvbHVtbiwKLSAgICAgICAgICAgICAgICAgICAgUmVtYXBwZWRGaWxlcy5kYXRhKCksIFJlbWFwcGVkRmlsZXMuc2l6ZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgUmVtYXBwZWRGaWxlcywKICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbnMgJiBDWENvZGVDb21wbGV0ZV9JbmNsdWRlTWFjcm9zKSwKICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbnMgJiBDWENvZGVDb21wbGV0ZV9JbmNsdWRlQ29kZVBhdHRlcm5zKSwKICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZUJyaWVmQ29tbWVudHMsCmRpZmYgLS1naXQgYS90b29scy9saWJjbGFuZy9DSW5kZXhEaWFnbm9zdGljLmNwcCBiL3Rvb2xzL2xpYmNsYW5nL0NJbmRleERpYWdub3N0aWMuY3BwCmluZGV4IDBlOWRkZTguLmNmOWRjNmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmNsYW5nL0NJbmRleERpYWdub3N0aWMuY3BwCisrKyBiL3Rvb2xzL2xpYmNsYW5nL0NJbmRleERpYWdub3N0aWMuY3BwCkBAIC01MSwzMiArNTEsMzUgQEAKICAgICAgIE1lc3NhZ2UoTXNnKSwgTG9jKEwpIHt9CiAKICAgdmlydHVhbCB+Q1hEaWFnbm9zdGljQ3VzdG9tTm90ZUltcGwoKSB7fQotICAKLSAgQ1hEaWFnbm9zdGljU2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoKSBjb25zdCB7CisKKyAgQ1hEaWFnbm9zdGljU2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIENYRGlhZ25vc3RpY19Ob3RlOwogICB9Ci0gIAotICBDWFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3QgeworCisgIENYU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIExvYzsKICAgfQotICAKLSAgQ1hTdHJpbmcgZ2V0U3BlbGxpbmcoKSBjb25zdCB7CisKKyAgQ1hTdHJpbmcgZ2V0U3BlbGxpbmcoKSBjb25zdCBvdmVycmlkZSB7CiAgICAgcmV0dXJuIGN4c3RyaW5nOjpjcmVhdGVSZWYoTWVzc2FnZS5jX3N0cigpKTsKICAgfQotICAKLSAgQ1hTdHJpbmcgZ2V0RGlhZ25vc3RpY09wdGlvbihDWFN0cmluZyAqRGlzYWJsZSkgY29uc3QgeworCisgIENYU3RyaW5nIGdldERpYWdub3N0aWNPcHRpb24oQ1hTdHJpbmcgKkRpc2FibGUpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBpZiAoRGlzYWJsZSkKICAgICAgICpEaXNhYmxlID0gY3hzdHJpbmc6OmNyZWF0ZUVtcHR5KCk7CiAgICAgcmV0dXJuIGN4c3RyaW5nOjpjcmVhdGVFbXB0eSgpOwogICB9Ci0gIAotICB1bnNpZ25lZCBnZXRDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgQ1hTdHJpbmcgZ2V0Q2F0ZWdvcnlUZXh0KCkgY29uc3QgeyByZXR1cm4gY3hzdHJpbmc6OmNyZWF0ZUVtcHR5KCk7IH0KIAotICB1bnNpZ25lZCBnZXROdW1SYW5nZXMoKSBjb25zdCB7IHJldHVybiAwOyB9Ci0gIENYU291cmNlUmFuZ2UgZ2V0UmFuZ2UodW5zaWduZWQgUmFuZ2UpIGNvbnN0IHsgcmV0dXJuIGNsYW5nX2dldE51bGxSYW5nZSgpOyB9Ci0gIHVuc2lnbmVkIGdldE51bUZpeEl0cygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgQ1hTdHJpbmcgZ2V0Rml4SXQodW5zaWduZWQgRml4SXQsIENYU291cmNlUmFuZ2UgKlJlcGxhY2VtZW50UmFuZ2UpIGNvbnN0IHsKKyAgdW5zaWduZWQgZ2V0Q2F0ZWdvcnkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgIENYU3RyaW5nIGdldENhdGVnb3J5VGV4dCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGN4c3RyaW5nOjpjcmVhdGVFbXB0eSgpOyB9CisKKyAgdW5zaWduZWQgZ2V0TnVtUmFuZ2VzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICBDWFNvdXJjZVJhbmdlIGdldFJhbmdlKHVuc2lnbmVkIFJhbmdlKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGNsYW5nX2dldE51bGxSYW5nZSgpOworICB9CisgIHVuc2lnbmVkIGdldE51bUZpeEl0cygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgQ1hTdHJpbmcgZ2V0Rml4SXQodW5zaWduZWQgRml4SXQsCisgICAgICAgICAgICAgICAgICAgIENYU291cmNlUmFuZ2UgKlJlcGxhY2VtZW50UmFuZ2UpIGNvbnN0IG92ZXJyaWRlIHsKICAgICBpZiAoUmVwbGFjZW1lbnRSYW5nZSkKICAgICAgICpSZXBsYWNlbWVudFJhbmdlID0gY2xhbmdfZ2V0TnVsbFJhbmdlKCk7CiAgICAgcmV0dXJuIGN4c3RyaW5nOjpjcmVhdGVFbXB0eSgpOwpAQCAtOTMsOSArOTYsOSBAQAogICAKICAgdmlydHVhbCB+Q1hEaWFnbm9zdGljUmVuZGVyZXIoKSB7fQogCi0gIHZpcnR1YWwgdm9pZCBiZWdpbkRpYWdub3N0aWMoRGlhZ09yU3RvcmVkRGlhZyBELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCkgeyAgICAKLSAgICAKKyAgdm9pZCBiZWdpbkRpYWdub3N0aWMoRGlhZ09yU3RvcmVkRGlhZyBELAorICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgTGV2ZWwpIG92ZXJyaWRlIHsKKwogICAgIGNvbnN0IFN0b3JlZERpYWdub3N0aWMgKlNEID0gRC5keW5fY2FzdDxjb25zdCBTdG9yZWREaWFnbm9zdGljKj4oKTsKICAgICBpZiAoIVNEKQogICAgICAgcmV0dXJuOwpAQCAtMTA5LDEzICsxMTIsMTMgQEAKICAgICBpZiAoTGV2ZWwgIT0gRGlhZ25vc3RpY3NFbmdpbmU6Ok5vdGUpCiAgICAgICBDdXJyZW50U2V0ID0gJkNELT5nZXRDaGlsZERpYWdub3N0aWNzKCk7CiAgIH0KLSAgCi0gIHZpcnR1YWwgdm9pZCBlbWl0RGlhZ25vc3RpY01lc3NhZ2UoU291cmNlTG9jYXRpb24gTG9jLCBQcmVzdW1lZExvYyBQTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDaGFyU291cmNlUmFuZ2U+IFJhbmdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICpTTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnT3JTdG9yZWREaWFnIEQpIHsKKworICB2b2lkIGVtaXREaWFnbm9zdGljTWVzc2FnZShTb3VyY2VMb2NhdGlvbiBMb2MsIFByZXN1bWVkTG9jIFBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENoYXJTb3VyY2VSYW5nZT4gUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICpTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ09yU3RvcmVkRGlhZyBEKSBvdmVycmlkZSB7CiAgICAgaWYgKCFELmlzTnVsbCgpKQogICAgICAgcmV0dXJuOwogICAgIApAQCAtMTI3LDIwICsxMzAsMjAgQEAKICAgICBDWERpYWdub3N0aWNJbXBsICpDRCA9IG5ldyBDWERpYWdub3N0aWNDdXN0b21Ob3RlSW1wbChNZXNzYWdlLCBMKTsKICAgICBDdXJyZW50U2V0LT5hcHBlbmREaWFnbm9zdGljKENEKTsKICAgfQotICAKLSAgdmlydHVhbCB2b2lkIGVtaXREaWFnbm9zdGljTG9jKFNvdXJjZUxvY2F0aW9uIExvYywgUHJlc3VtZWRMb2MgUExvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENoYXJTb3VyY2VSYW5nZT4gUmFuZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAmU00pIHt9CiAKLSAgdmlydHVhbCB2b2lkIGVtaXRDb2RlQ29udGV4dChTb3VyY2VMb2NhdGlvbiBMb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDaGFyU291cmNlUmFuZ2U+JiBSYW5nZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Rml4SXRIaW50PiBIaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkge30KLSAgCi0gIHZpcnR1YWwgdm9pZCBlbWl0Tm90ZShTb3VyY2VMb2NhdGlvbiBMb2MsIFN0cmluZ1JlZiBNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAqU00pIHsKKyAgdm9pZCBlbWl0RGlhZ25vc3RpY0xvYyhTb3VyY2VMb2NhdGlvbiBMb2MsIFByZXN1bWVkTG9jIFBMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENoYXJTb3VyY2VSYW5nZT4gUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvdXJjZU1hbmFnZXIgJlNNKSBvdmVycmlkZSB7fQorCisgIHZvaWQgZW1pdENvZGVDb250ZXh0KFNvdXJjZUxvY2F0aW9uIExvYywKKyAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3NFbmdpbmU6OkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q2hhclNvdXJjZVJhbmdlPiYgUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxGaXhJdEhpbnQ+IEhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb3VyY2VNYW5hZ2VyICZTTSkgb3ZlcnJpZGUge30KKworICB2b2lkIGVtaXROb3RlKFNvdXJjZUxvY2F0aW9uIExvYywgU3RyaW5nUmVmIE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWFuYWdlciAqU00pIG92ZXJyaWRlIHsKICAgICBDWFNvdXJjZUxvY2F0aW9uIEw7CiAgICAgaWYgKFNNKQogICAgICAgTCA9IHRyYW5zbGF0ZVNvdXJjZUxvY2F0aW9uKCpTTSwgTGFuZ09wdHMsIExvYyk7CkBAIC0yMDgsMTIgKzIxMSwyMSBAQAogZXh0ZXJuICJDIiB7CiAKIHVuc2lnbmVkIGNsYW5nX2dldE51bURpYWdub3N0aWNzKENYVHJhbnNsYXRpb25Vbml0IFVuaXQpIHsKKyAgaWYgKGN4dHU6OmlzTm90VXNhYmxlVFUoVW5pdCkpIHsKKyAgICBMT0dfQkFEX1RVKFVuaXQpOworICAgIHJldHVybiAwOworICB9CiAgIGlmICghY3h0dTo6Z2V0QVNUVW5pdChVbml0KSkKICAgICByZXR1cm4gMDsKICAgcmV0dXJuIGxhenlDcmVhdGVEaWFncyhVbml0LCAvKmNoZWNrSWZDaGFuZ2VkPSovdHJ1ZSktPmdldE51bURpYWdub3N0aWNzKCk7CiB9CiAKIENYRGlhZ25vc3RpYyBjbGFuZ19nZXREaWFnbm9zdGljKENYVHJhbnNsYXRpb25Vbml0IFVuaXQsIHVuc2lnbmVkIEluZGV4KSB7CisgIGlmIChjeHR1Ojppc05vdFVzYWJsZVRVKFVuaXQpKSB7CisgICAgTE9HX0JBRF9UVShVbml0KTsKKyAgICByZXR1cm4gMDsKKyAgfQorCiAgIENYRGlhZ25vc3RpY1NldCBEID0gY2xhbmdfZ2V0RGlhZ25vc3RpY1NldEZyb21UVShVbml0KTsKICAgaWYgKCFEKQogICAgIHJldHVybiAwOwpAQCAtMjI0LDggKzIzNiwxMiBAQAogCiAgIHJldHVybiBEaWFncy0+Z2V0RGlhZ25vc3RpYyhJbmRleCk7CiB9Ci0gIAorCiBDWERpYWdub3N0aWNTZXQgY2xhbmdfZ2V0RGlhZ25vc3RpY1NldEZyb21UVShDWFRyYW5zbGF0aW9uVW5pdCBVbml0KSB7CisgIGlmIChjeHR1Ojppc05vdFVzYWJsZVRVKFVuaXQpKSB7CisgICAgTE9HX0JBRF9UVShVbml0KTsKKyAgICByZXR1cm4gMDsKKyAgfQogICBpZiAoIWN4dHU6OmdldEFTVFVuaXQoVW5pdCkpCiAgICAgcmV0dXJuIDA7CiAgIHJldHVybiBzdGF0aWNfY2FzdDxDWERpYWdub3N0aWM+KGxhenlDcmVhdGVEaWFncyhVbml0KSk7CkBAIC0yOTIsNiArMzA4LDcgQEAKICAgc3dpdGNoIChTZXZlcml0eSkgewogICBjYXNlIENYRGlhZ25vc3RpY19JZ25vcmVkOiBsbHZtX3VucmVhY2hhYmxlKCJpbXBvc3NpYmxlIik7CiAgIGNhc2UgQ1hEaWFnbm9zdGljX05vdGU6IE91dCA8PCAibm90ZTogIjsgYnJlYWs7CisgIGNhc2UgQ1hEaWFnbm9zdGljX1JlbWFyazogT3V0IDw8ICJyZW1hcms6ICI7IGJyZWFrOwogICBjYXNlIENYRGlhZ25vc3RpY19XYXJuaW5nOiBPdXQgPDwgIndhcm5pbmc6ICI7IGJyZWFrOwogICBjYXNlIENYRGlhZ25vc3RpY19FcnJvcjogT3V0IDw8ICJlcnJvcjogIjsgYnJlYWs7CiAgIGNhc2UgQ1hEaWFnbm9zdGljX0ZhdGFsOiBPdXQgPDwgImZhdGFsIGVycm9yOiAiOyBicmVhazsKQEAgLTQzNyw5ICs0NTQsMTAgQEAKIH0KIAogdm9pZCBjbGFuZ19kaXNwb3NlRGlhZ25vc3RpY1NldChDWERpYWdub3N0aWNTZXQgRGlhZ3MpIHsKLSAgQ1hEaWFnbm9zdGljU2V0SW1wbCAqRCA9IHN0YXRpY19jYXN0PENYRGlhZ25vc3RpY1NldEltcGwqPihEaWFncyk7Ci0gIGlmIChELT5pc0V4dGVybmFsbHlNYW5hZ2VkKCkpCi0gICAgZGVsZXRlIEQ7CisgIGlmIChDWERpYWdub3N0aWNTZXRJbXBsICpEID0gc3RhdGljX2Nhc3Q8Q1hEaWFnbm9zdGljU2V0SW1wbCAqPihEaWFncykpIHsKKyAgICBpZiAoRC0+aXNFeHRlcm5hbGx5TWFuYWdlZCgpKQorICAgICAgZGVsZXRlIEQ7CisgIH0KIH0KICAgCiBDWERpYWdub3N0aWMgY2xhbmdfZ2V0RGlhZ25vc3RpY0luU2V0KENYRGlhZ25vc3RpY1NldCBEaWFncywKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYmNsYW5nL0NJbmRleERpYWdub3N0aWMuaCBiL3Rvb2xzL2xpYmNsYW5nL0NJbmRleERpYWdub3N0aWMuaAppbmRleCBiMWMzOTc4Li4zMWFlOTAyIDEwMDY0NAotLS0gYS90b29scy9saWJjbGFuZy9DSW5kZXhEaWFnbm9zdGljLmgKKysrIGIvdG9vbHMvbGliY2xhbmcvQ0luZGV4RGlhZ25vc3RpYy5oCkBAIC0xMjEsMzUgKzEyMSwzNSBAQAogICB2aXJ0dWFsIH5DWFN0b3JlZERpYWdub3N0aWMoKSB7fQogICAKICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNldmVyaXR5IG9mIHRoZSBkaWFnbm9zdGljLgotICB2aXJ0dWFsIENYRGlhZ25vc3RpY1NldmVyaXR5IGdldFNldmVyaXR5KCkgY29uc3Q7Ci0gIAorICBDWERpYWdub3N0aWNTZXZlcml0eSBnZXRTZXZlcml0eSgpIGNvbnN0IG92ZXJyaWRlOworCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGlhZ25vc3RpYy4KLSAgdmlydHVhbCBDWFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3Q7CisgIENYU291cmNlTG9jYXRpb24gZ2V0TG9jYXRpb24oKSBjb25zdCBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc3BlbGxpbmcgb2YgdGhlIGRpYWdub3N0aWMuCi0gIHZpcnR1YWwgQ1hTdHJpbmcgZ2V0U3BlbGxpbmcoKSBjb25zdDsKKyAgQ1hTdHJpbmcgZ2V0U3BlbGxpbmcoKSBjb25zdCBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdGV4dCBmb3IgdGhlIGRpYWdub3N0aWMgb3B0aW9uLgotICB2aXJ0dWFsIENYU3RyaW5nIGdldERpYWdub3N0aWNPcHRpb24oQ1hTdHJpbmcgKkRpc2FibGUpIGNvbnN0OwotICAKKyAgQ1hTdHJpbmcgZ2V0RGlhZ25vc3RpY09wdGlvbihDWFN0cmluZyAqRGlzYWJsZSkgY29uc3Qgb3ZlcnJpZGU7CisKICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGNhdGVnb3J5IG9mIHRoZSBkaWFnbm9zdGljLgotICB2aXJ0dWFsIHVuc2lnbmVkIGdldENhdGVnb3J5KCkgY29uc3Q7Ci0gIAorICB1bnNpZ25lZCBnZXRDYXRlZ29yeSgpIGNvbnN0IG92ZXJyaWRlOworCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBjYXRlZ29yeSBzdHJpbmcgb2YgdGhlIGRpYWdub3N0aWMuCi0gIHZpcnR1YWwgQ1hTdHJpbmcgZ2V0Q2F0ZWdvcnlUZXh0KCkgY29uc3Q7CisgIENYU3RyaW5nIGdldENhdGVnb3J5VGV4dCgpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc291cmNlIHJhbmdlcyBmb3IgdGhlIGRpYWdub3N0aWMuCi0gIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtUmFuZ2VzKCkgY29uc3Q7Ci0gIAorICB1bnNpZ25lZCBnZXROdW1SYW5nZXMoKSBjb25zdCBvdmVycmlkZTsKKwogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc291cmNlIHJhbmdlcyBmb3IgdGhlIGRpYWdub3N0aWMuCi0gIHZpcnR1YWwgQ1hTb3VyY2VSYW5nZSBnZXRSYW5nZSh1bnNpZ25lZCBSYW5nZSkgY29uc3Q7CisgIENYU291cmNlUmFuZ2UgZ2V0UmFuZ2UodW5zaWduZWQgUmFuZ2UpIGNvbnN0IG92ZXJyaWRlOwogCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgRml4SXRzLgotICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bUZpeEl0cygpIGNvbnN0OworICB1bnNpZ25lZCBnZXROdW1GaXhJdHMoKSBjb25zdCBvdmVycmlkZTsKIAogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgRml4SXQgaW5mb3JtYXRpb24gKHNvdXJjZSByYW5nZSBhbmQgaW5zZXJ0ZWQgdGV4dCkuCi0gIHZpcnR1YWwgQ1hTdHJpbmcgZ2V0Rml4SXQodW5zaWduZWQgRml4SXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hTb3VyY2VSYW5nZSAqUmVwbGFjZW1lbnRSYW5nZSkgY29uc3Q7CisgIENYU3RyaW5nIGdldEZpeEl0KHVuc2lnbmVkIEZpeEl0LAorICAgICAgICAgICAgICAgICAgICBDWFNvdXJjZVJhbmdlICpSZXBsYWNlbWVudFJhbmdlKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENYRGlhZ25vc3RpY0ltcGwgKkQpIHsKICAgICByZXR1cm4gRC0+Z2V0S2luZCgpID09IFN0b3JlZERpYWdub3N0aWNLaW5kOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvQ0luZGV4SGlnaC5jcHAgYi90b29scy9saWJjbGFuZy9DSW5kZXhIaWdoLmNwcAppbmRleCBjNzcyZGJiLi4zMjJmNzIzIDEwMDY0NAotLS0gYS90b29scy9saWJjbGFuZy9DSW5kZXhIaWdoLmNwcAorKysgYi90b29scy9saWJjbGFuZy9DSW5kZXhIaWdoLmNwcApAQCAtNDgwLDEzICs0ODAsMTIgQEAKIAogQ1hSZXN1bHQgY2xhbmdfZmluZEluY2x1ZGVzSW5GaWxlKENYVHJhbnNsYXRpb25Vbml0IFRVLCBDWEZpbGUgZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hDdXJzb3JBbmRSYW5nZVZpc2l0b3IgdmlzaXRvcikgewotICBMb2dSZWYgTG9nID0gTG9nZ2VyOjptYWtlKExMVk1fRlVOQ1RJT05fTkFNRSk7Ci0KLSAgaWYgKCFUVSkgewotICAgIGlmIChMb2cpCi0gICAgICAqTG9nIDw8ICJOdWxsIENYVHJhbnNsYXRpb25Vbml0IjsKKyAgaWYgKGN4dHU6OmlzTm90VXNhYmxlVFUoVFUpKSB7CisgICAgTE9HX0JBRF9UVShUVSk7CiAgICAgcmV0dXJuIENYUmVzdWx0X0ludmFsaWQ7CiAgIH0KKworICBMb2dSZWYgTG9nID0gTG9nZ2VyOjptYWtlKExMVk1fRlVOQ1RJT05fTkFNRSk7CiAgIGlmICghZmlsZSkgewogICAgIGlmIChMb2cpCiAgICAgICAqTG9nIDw8ICJOdWxsIGZpbGUiOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvQ0luZGV4SW5jbHVzaW9uU3RhY2suY3BwIGIvdG9vbHMvbGliY2xhbmcvQ0luZGV4SW5jbHVzaW9uU3RhY2suY3BwCmluZGV4IGE2ZDMxMTUuLjM2NTYwOWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmNsYW5nL0NJbmRleEluY2x1c2lvblN0YWNrLmNwcAorKysgYi90b29scy9saWJjbGFuZy9DSW5kZXhJbmNsdXNpb25TdGFjay5jcHAKQEAgLTI0LDcgKzI0LDExIEBACiBleHRlcm4gIkMiIHsKIHZvaWQgY2xhbmdfZ2V0SW5jbHVzaW9ucyhDWFRyYW5zbGF0aW9uVW5pdCBUVSwgQ1hJbmNsdXNpb25WaXNpdG9yIENCLAogICAgICAgICAgICAgICAgICAgICAgICAgIENYQ2xpZW50RGF0YSBjbGllbnREYXRhKSB7Ci0gIAorICBpZiAoY3h0dTo6aXNOb3RVc2FibGVUVShUVSkpIHsKKyAgICBMT0dfQkFEX1RVKFRVKTsKKyAgICByZXR1cm47CisgIH0KKwogICBBU1RVbml0ICpDWFhVbml0ID0gY3h0dTo6Z2V0QVNUVW5pdChUVSk7CiAgIFNvdXJjZU1hbmFnZXIgJlNNID0gQ1hYVW5pdC0+Z2V0U291cmNlTWFuYWdlcigpOwogICBBU1RDb250ZXh0ICZDdHggPSBDWFhVbml0LT5nZXRBU1RDb250ZXh0KCk7CmRpZmYgLS1naXQgYS90b29scy9saWJjbGFuZy9DSW5kZXhVU1JzLmNwcCBiL3Rvb2xzL2xpYmNsYW5nL0NJbmRleFVTUnMuY3BwCmluZGV4IDJiNDNjNWIuLjI1ODgxYzMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmNsYW5nL0NJbmRleFVTUnMuY3BwCisrKyBiL3Rvb2xzL2xpYmNsYW5nL0NJbmRleFVTUnMuY3BwCkBAIC0xNCw4ICsxNCwxMCBAQAogI2luY2x1ZGUgIkNJbmRleGVyLmgiCiAjaW5jbHVkZSAiQ1hDdXJzb3IuaCIKICNpbmNsdWRlICJDWFN0cmluZy5oIgorI2luY2x1ZGUgIkNYVHJhbnNsYXRpb25Vbml0LmgiCiAjaW5jbHVkZSAiY2xhbmcvSW5kZXgvVVNSR2VuZXJhdGlvbi5oIgogI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzaW5nUmVjb3JkLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvQVNUVW5pdC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCiAKQEAgLTczLDEwICs3NSwxNiBAQAogICAgIGlmICghYnVmKQogICAgICAgcmV0dXJuIGN4c3RyaW5nOjpjcmVhdGVFbXB0eSgpOwogCi0gICAgYnVmLT5EYXRhICs9IGdldFVTUlNwYWNlUHJlZml4KCk7Ci0gICAgYnVmLT5EYXRhICs9ICJtYWNyb0AiOwotICAgIGJ1Zi0+RGF0YSArPQotICAgICAgICBjeGN1cnNvcjo6Z2V0Q3Vyc29yTWFjcm9EZWZpbml0aW9uKEMpLT5nZXROYW1lKCktPmdldE5hbWVTdGFydCgpOworICAgIGJvb2wgSWdub3JlID0gZ2VuZXJhdGVVU1JGb3JNYWNybyhjeGN1cnNvcjo6Z2V0Q3Vyc29yTWFjcm9EZWZpbml0aW9uKEMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeHR1OjpnZXRBU1RVbml0KFRVKS0+Z2V0U291cmNlTWFuYWdlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYtPkRhdGEpOworICAgIGlmIChJZ25vcmUpIHsKKyAgICAgIGJ1Zi0+ZGlzcG9zZSgpOworICAgICAgcmV0dXJuIGN4c3RyaW5nOjpjcmVhdGVFbXB0eSgpOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgQy1zdHJpbmcsIGJ1dCBkb24ndCBtYWtlIGEgY29weSBzaW5jZSBpdCBpcyBhbHJlYWR5IGluCisgICAgLy8gdGhlIHN0cmluZyBidWZmZXIuCiAgICAgYnVmLT5EYXRhLnB1c2hfYmFjaygnXDAnKTsKICAgICByZXR1cm4gY3JlYXRlQ1hTdHJpbmcoYnVmKTsKICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvQ0xvZy5oIGIvdG9vbHMvbGliY2xhbmcvQ0xvZy5oCmluZGV4IDU3ZTAxYWUuLmZlNmMyMTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmNsYW5nL0NMb2cuaAorKysgYi90b29scy9saWJjbGFuZy9DTG9nLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpZm5kZWYgTExWTV9MSUJDTEFOR19DTE9HX0gKICNkZWZpbmUgTExWTV9MSUJDTEFOR19DTE9HX0gKIAorI2luY2x1ZGUgImNsYW5nLWMvSW5kZXguaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKQEAgLTk1LDcgKzk2LDggQEAKIC8vLyAgICAgKkxvZyA8PCAiYmxhaCI7CiAvLy8gICB9CiAvLy8gXGVuZGNvZGUKLSNkZWZpbmUgTE9HX1NFQ1RJT04oTkFNRSkgaWYgKExvZ1JlZiBMb2cgPSBjbGFuZzo6Y3hpbmRleDo6TG9nZ2VyOjptYWtlKE5BTUUpKQorI2RlZmluZSBMT0dfU0VDVElPTihOQU1FKSBcCisgICAgaWYgKGNsYW5nOjpjeGluZGV4OjpMb2dSZWYgTG9nID0gY2xhbmc6OmN4aW5kZXg6OkxvZ2dlcjo6bWFrZShOQU1FKSkKICNkZWZpbmUgTE9HX0ZVTkNfU0VDVElPTiBMT0dfU0VDVElPTihMTFZNX0ZVTkNUSU9OX05BTUUpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvQ01ha2VMaXN0cy50eHQgYi90b29scy9saWJjbGFuZy9DTWFrZUxpc3RzLnR4dAppbmRleCBiN2JkZTY5Li5kNmJiYmY4IDEwMDY0NAotLS0gYS90b29scy9saWJjbGFuZy9DTWFrZUxpc3RzLnR4dAorKysgYi90b29scy9saWJjbGFuZy9DTWFrZUxpc3RzLnR4dApAQCAtMSw5OSArMSwxMDMgQEAKLXNldChMTFZNX0xJTktfQ09NUE9ORU5UUwotICAke0xMVk1fVEFSR0VUU19UT19CVUlMRH0KLSAgYXNtcGFyc2VyCi0gIHN1cHBvcnQKLSAgYml0cmVhZGVyCi0gIG1jCi0gICkKLQogc2V0KFNPVVJDRVMKICAgQVJDTWlncmF0ZS5jcHAKKyAgQnVpbGRTeXN0ZW0uY3BwCiAgIENJbmRleC5jcHAKICAgQ0luZGV4Q1hYLmNwcAogICBDSW5kZXhDb2RlQ29tcGxldGlvbi5jcHAKICAgQ0luZGV4RGlhZ25vc3RpYy5jcHAKLSAgQ0luZGV4RGlhZ25vc3RpYy5oCiAgIENJbmRleEhpZ2guY3BwCiAgIENJbmRleEluY2x1c2lvblN0YWNrLmNwcAogICBDSW5kZXhVU1JzLmNwcAogICBDSW5kZXhlci5jcHAKLSAgQ0luZGV4ZXIuaAogICBDWENvbW1lbnQuY3BwCiAgIENYQ3Vyc29yLmNwcAotICBDWEN1cnNvci5oCiAgIENYQ29tcGlsYXRpb25EYXRhYmFzZS5jcHAKICAgQ1hMb2FkZWREaWFnbm9zdGljLmNwcAotICBDWExvYWRlZERpYWdub3N0aWMuaAogICBDWFNvdXJjZUxvY2F0aW9uLmNwcAotICBDWFNvdXJjZUxvY2F0aW9uLmgKICAgQ1hTdG9yZWREaWFnbm9zdGljLmNwcAogICBDWFN0cmluZy5jcHAKLSAgQ1hTdHJpbmcuaAotICBDWFRyYW5zbGF0aW9uVW5pdC5oCiAgIENYVHlwZS5jcHAKLSAgQ1hUeXBlLmgKICAgSW5kZXhCb2R5LmNwcAogICBJbmRleERlY2wuY3BwCiAgIEluZGV4VHlwZVNvdXJjZUluZm8uY3BwCi0gIEluZGV4X0ludGVybmFsLmgKICAgSW5kZXhpbmcuY3BwCiAgIEluZGV4aW5nQ29udGV4dC5jcHAKKworICBBRERJVElPTkFMX0hFQURFUlMKKyAgQ0luZGV4RGlhZ25vc3RpYy5oCisgIENJbmRleGVyLmgKKyAgQ1hDdXJzb3IuaAorICBDWExvYWRlZERpYWdub3N0aWMuaAorICBDWFNvdXJjZUxvY2F0aW9uLmgKKyAgQ1hTdHJpbmcuaAorICBDWFRyYW5zbGF0aW9uVW5pdC5oCisgIENYVHlwZS5oCisgIEluZGV4X0ludGVybmFsLmgKICAgSW5kZXhpbmdDb250ZXh0LmgKICAgLi4vLi4vaW5jbHVkZS9jbGFuZy1jL0luZGV4LmgKICAgKQogCi1zZXQoTElCUkFSSUVTCi0gIGNsYW5nSW5kZXgKLSAgY2xhbmdBUkNNaWdyYXRlCi0gIGNsYW5nUmV3cml0ZUNvcmUKLSAgY2xhbmdSZXdyaXRlRnJvbnRlbmQKLSAgY2xhbmdGcm9udGVuZAotICBjbGFuZ0RyaXZlcgotICBjbGFuZ1NlcmlhbGl6YXRpb24KLSAgY2xhbmdTZW1hCi0gIGNsYW5nRWRpdAotICBjbGFuZ0FTVAotICBjbGFuZ0xleAotICBjbGFuZ1Rvb2xpbmcKLSAgY2xhbmdCYXNpYwotICApCitvcHRpb24oTElCQ0xBTkdfQlVJTERfU1RBVElDCisgICJCdWlsZCBsaWJjbGFuZyBhcyBhIHN0YXRpYyBsaWJyYXJ5IChpbiBhZGRpdGlvbiB0byBhIHNoYXJlZCBvbmUpIiBPRkYpCiAKLXNldChHRU5FUkFURURfSEVBREVSUwotICBDbGFuZ0F0dHJDbGFzc2VzCi0gIENsYW5nQXR0ckxpc3QKLSAgQ2xhbmdBdHRyUGFyc2VkQXR0ckxpc3QKLSAgQ2xhbmdDb21tZW50Tm9kZXMKLSAgQ2xhbmdEaWFnbm9zdGljQ29tbW9uCi0gIENsYW5nRGlhZ25vc3RpY0Zyb250ZW5kCi0gIENsYW5nRGVjbE5vZGVzCi0gIENsYW5nU3RtdE5vZGVzCi0gICkKK3NldChMTFZNX0VYUE9SVEVEX1NZTUJPTF9GSUxFICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWJjbGFuZy5leHBvcnRzKQogCi1zZXQoRVhQT1JURURfU1lNQk9MX0ZJTEUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYmNsYW5nLmV4cG9ydHMpCitpZihNU1ZDKQorICAjIEF2b2lkIExOSzQxOTcgbm90IHRvIHNwY2VpZnkgbGliY2xhbmcuZGVmIGhlcmUuCisgICMgRWFjaCBmdW5jdGlvbnMgaXMgZXhwb3J0ZWQgYXMgImRsbGV4cG9ydCIgaW4gaW5jbHVkZS9jbGFuZy1jLgorICAjIEtCODM1MzI2CisgIHNldChMTFZNX0VYUE9SVEVEX1NZTUJPTF9GSUxFKQorZW5kaWYoKQogCiBpZiggTExWTV9FTkFCTEVfUElDICkKLSAgc2V0KFNIQVJFRF9MSUJSQVJZIFRSVUUpCi0gIGFkZF9jbGFuZ19saWJyYXJ5KGxpYmNsYW5nICR7U09VUkNFU30pCi0gIHRhcmdldF9saW5rX2xpYnJhcmllcyhsaWJjbGFuZyAke0xJQlJBUklFU30pCi0gIGFkZF9kZXBlbmRlbmNpZXMobGliY2xhbmcgJHtHRU5FUkFURURfSEVBREVSU30gY2xhbmctaGVhZGVycykKKyAgc2V0KEVOQUJMRV9TSEFSRUQgU0hBUkVEKQorZW5kaWYoKQogCitpZigoTk9UIExMVk1fRU5BQkxFX1BJQyBPUiBMSUJDTEFOR19CVUlMRF9TVEFUSUMpIEFORCBOT1QgV0lOMzIpCisgIHNldChFTkFCTEVfU1RBVElDIFNUQVRJQykKK2VuZGlmKCkKKworaWYoV0lOMzIpCisgIHNldChvdXRwdXRfbmFtZSAibGliY2xhbmciKQorZWxzZSgpCisgIHNldChvdXRwdXRfbmFtZSAiY2xhbmciKQorZW5kaWYoKQorCithZGRfY2xhbmdfbGlicmFyeShsaWJjbGFuZyAke0VOQUJMRV9TSEFSRUR9ICR7RU5BQkxFX1NUQVRJQ30KKyAgT1VUUFVUX05BTUUgJHtvdXRwdXRfbmFtZX0KKyAgJHtTT1VSQ0VTfQorICBERVBFTkRTIGNsYW5nLWhlYWRlcnMKKworICBMSU5LX0xJQlMKKyAgY2xhbmdBUkNNaWdyYXRlCisgIGNsYW5nQVNUCisgIGNsYW5nQmFzaWMKKyAgY2xhbmdGcm9udGVuZAorICBjbGFuZ0luZGV4CisgIGNsYW5nTGV4CisgIGNsYW5nU2VtYQorICBjbGFuZ1Rvb2xpbmcKKworICBMSU5LX0NPTVBPTkVOVFMKKyAgQml0UmVhZGVyCisgIFN1cHBvcnQKKyAgKQorCitpZihFTkFCTEVfU0hBUkVEKQogICBpZihXSU4zMikKICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMobGliY2xhbmcKICAgICAgIFBST1BFUlRJRVMKLSAgICAgIE9VVFBVVF9OQU1FICJsaWJjbGFuZyIKICAgICAgIFZFUlNJT04gJHtMSUJDTEFOR19MSUJSQVJZX1ZFUlNJT059CiAgICAgICBERUZJTkVfU1lNQk9MIF9DSU5ERVhfTElCXykKICAgZWxzZSgpCiAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKGxpYmNsYW5nCiAgICAgICBQUk9QRVJUSUVTCi0gICAgICBPVVRQVVRfTkFNRSAiY2xhbmciCiAgICAgICBWRVJTSU9OICR7TElCQ0xBTkdfTElCUkFSWV9WRVJTSU9OfQogICAgICAgREVGSU5FX1NZTUJPTCBfQ0lOREVYX0xJQl8pCiAgIGVuZGlmKCkKIAogICBpZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iKQotICAgIHNldChMSUJDTEFOR19MSU5LX0ZMQUdTCi0gICAgICAiIC1XbCwtY29tcGF0aWJpbGl0eV92ZXJzaW9uIC1XbCwxIC1XbCwtZGVhZF9zdHJpcCIpCisgICAgc2V0KExJQkNMQU5HX0xJTktfRkxBR1MgIiAtV2wsLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAtV2wsMSIpCiAgICAgaWYgKERFRklORUQgJHtMTFZNX1NVQk1JVF9WRVJTSU9OfSkKICAgICAgIHNldChMSUJDTEFOR19MSU5LX0ZMQUdTCiAgICAgICAgICIke0xJQkNMQU5HX0xJTktfRkxBR1N9IC1XbCwtY3VycmVudF92ZXJzaW9uIC1XbCwke0xMVk1fU1VCTUlUX1ZFUlNJT059LiR7TExWTV9TVUJNSVRfU1VCVkVSU0lPTn0iKQpAQCAtMTAxLDI2ICsxMDUsNSBAQAogCiAgICAgc2V0X3Byb3BlcnR5KFRBUkdFVCBsaWJjbGFuZyBBUFBFTkRfU1RSSU5HIFBST1BFUlRZCiAgICAgICAgICAgICAgICAgIExJTktfRkxBR1MgJHtMSUJDTEFOR19MSU5LX0ZMQUdTfSkKLSAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMobGliY2xhbmcKLSAgICAgIFBST1BFUlRJRVMKLSAgICAgIElOU1RBTExfTkFNRV9ESVIgIkBycGF0aCIpCiAgIGVuZGlmKCkKLQotCi0gIHNldChMSUJDTEFOR19TVEFUSUNfVEFSR0VUX05BTUUgbGliY2xhbmdfc3RhdGljKQotZWxzZSgpCi0gIHNldChMSUJDTEFOR19TVEFUSUNfVEFSR0VUX05BTUUgbGliY2xhbmcpCi1lbmRpZigpCi0KLW9wdGlvbihMSUJDTEFOR19CVUlMRF9TVEFUSUMKLSAgIkJ1aWxkIGxpYmNsYW5nIGFzIGEgc3RhdGljIGxpYnJhcnkgKGluIGFkZGl0aW9uIHRvIGEgc2hhcmVkIG9uZSkiIE9GRikKLQotaWYoIChOT1QgTExWTV9FTkFCTEVfUElDIE9SIExJQkNMQU5HX0JVSUxEX1NUQVRJQykgQU5EIE5PVCBXSU4zMiApCi0gIGFkZF9jbGFuZ19saWJyYXJ5KCR7TElCQ0xBTkdfU1RBVElDX1RBUkdFVF9OQU1FfSBTVEFUSUMgJHtTT1VSQ0VTfSkKLSAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7TElCQ0xBTkdfU1RBVElDX1RBUkdFVF9OQU1FfSAke0xJQlJBUklFU30pCi0gIGFkZF9kZXBlbmRlbmNpZXMoJHtMSUJDTEFOR19TVEFUSUNfVEFSR0VUX05BTUV9ICR7R0VORVJBVEVEX0hFQURFUlN9IGNsYW5nLWhlYWRlcnMpCi0KLSAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7TElCQ0xBTkdfU1RBVElDX1RBUkdFVF9OQU1FfQotICAgIFBST1BFUlRJRVMKLSAgICBPVVRQVVRfTkFNRSAiY2xhbmciKQogZW5kaWYoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvQ1hDb21waWxhdGlvbkRhdGFiYXNlLmNwcCBiL3Rvb2xzL2xpYmNsYW5nL0NYQ29tcGlsYXRpb25EYXRhYmFzZS5jcHAKaW5kZXggNDMzY2FlYy4uZjQ3MjhmZSAxMDA2NDQKLS0tIGEvdG9vbHMvbGliY2xhbmcvQ1hDb21waWxhdGlvbkRhdGFiYXNlLmNwcAorKysgYi90b29scy9saWJjbGFuZy9DWENvbXBpbGF0aW9uRGF0YWJhc2UuY3BwCkBAIC04LDcgKzgsNyBAQAogCiBleHRlcm4gIkMiIHsKIAotLy8gRklYTUU6IGRvIHNvbWV0aGluZyBtb3JlIHVzZWZ1bGwgd2l0aCB0aGUgZXJyb3IgbWVzc2FnZQorLy8gRklYTUU6IGRvIHNvbWV0aGluZyBtb3JlIHVzZWZ1bCB3aXRoIHRoZSBlcnJvciBtZXNzYWdlCiBDWENvbXBpbGF0aW9uRGF0YWJhc2UKIGNsYW5nX0NvbXBpbGF0aW9uRGF0YWJhc2VfZnJvbURpcmVjdG9yeShjb25zdCBjaGFyICpCdWlsZERpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWENvbXBpbGF0aW9uRGF0YWJhc2VfRXJyb3IgKkVycm9yQ29kZSkKQEAgLTQwLDkgKzQwLDggQEAKIHsKICAgc3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmQ+IENDbWQ7CiAKLSAgQWxsb2NhdGVkQ1hDb21waWxlQ29tbWFuZHMoY29uc3Qgc3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmQ+JiBDbWQpCi0gICAgOiBDQ21kKENtZCkKLSAgeyB9CisgIEFsbG9jYXRlZENYQ29tcGlsZUNvbW1hbmRzKHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPiBDbWQpCisgICAgICA6IENDbWQoc3RkOjptb3ZlKENtZCkpIHt9CiB9OwogCiBDWENvbXBpbGVDb21tYW5kcwpAQCAtNTAsMTAgKzQ5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkNvbXBsZXRlRmlsZU5hbWUpCiB7CiAgIGlmIChDb21waWxhdGlvbkRhdGFiYXNlICpkYiA9IHN0YXRpY19jYXN0PENvbXBpbGF0aW9uRGF0YWJhc2UgKj4oQ0RiKSkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPgotICAgICAgQ0NtZChkYi0+Z2V0Q29tcGlsZUNvbW1hbmRzKENvbXBsZXRlRmlsZU5hbWUpKTsKKyAgICBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZD4gQ0NtZChkYi0+Z2V0Q29tcGlsZUNvbW1hbmRzKENvbXBsZXRlRmlsZU5hbWUpKTsKICAgICBpZiAoIUNDbWQuZW1wdHkoKSkKLSAgICAgIHJldHVybiBuZXcgQWxsb2NhdGVkQ1hDb21waWxlQ29tbWFuZHMoIENDbWQgKTsKKyAgICAgIHJldHVybiBuZXcgQWxsb2NhdGVkQ1hDb21waWxlQ29tbWFuZHMoc3RkOjptb3ZlKENDbWQpKTsKICAgfQogCiAgIHJldHVybiAwOwpAQCAtNjIsOSArNjAsOSBAQAogQ1hDb21waWxlQ29tbWFuZHMKIGNsYW5nX0NvbXBpbGF0aW9uRGF0YWJhc2VfZ2V0QWxsQ29tcGlsZUNvbW1hbmRzKENYQ29tcGlsYXRpb25EYXRhYmFzZSBDRGIpIHsKICAgaWYgKENvbXBpbGF0aW9uRGF0YWJhc2UgKmRiID0gc3RhdGljX2Nhc3Q8Q29tcGlsYXRpb25EYXRhYmFzZSAqPihDRGIpKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmQ+IENDbWQoZGItPmdldEFsbENvbXBpbGVDb21tYW5kcygpKTsKKyAgICBzdGQ6OnZlY3RvcjxDb21waWxlQ29tbWFuZD4gQ0NtZChkYi0+Z2V0QWxsQ29tcGlsZUNvbW1hbmRzKCkpOwogICAgIGlmICghQ0NtZC5lbXB0eSgpKQotICAgICAgcmV0dXJuIG5ldyBBbGxvY2F0ZWRDWENvbXBpbGVDb21tYW5kcyggQ0NtZCApOworICAgICAgcmV0dXJuIG5ldyBBbGxvY2F0ZWRDWENvbXBpbGVDb21tYW5kcyhzdGQ6Om1vdmUoQ0NtZCkpOwogICB9CiAKICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS90b29scy9saWJjbGFuZy9DWEN1cnNvci5jcHAgYi90b29scy9saWJjbGFuZy9DWEN1cnNvci5jcHAKaW5kZXggYzc1YzA2MS4uZDY4Mjk4NiAxMDA2NDQKLS0tIGEvdG9vbHMvbGliY2xhbmcvQ1hDdXJzb3IuY3BwCisrKyBiL3Rvb2xzL2xpYmNsYW5nL0NYQ3Vyc29yLmNwcApAQCAtMjEzLDcgKzIxMyw2IEBACiAgIGNhc2UgU3RtdDo6QXNUeXBlRXhwckNsYXNzOgogICBjYXNlIFN0bXQ6OkF0b21pY0V4cHJDbGFzczoKICAgY2FzZSBTdG10OjpCaW5hcnlDb25kaXRpb25hbE9wZXJhdG9yQ2xhc3M6Ci0gIGNhc2UgU3RtdDo6QmluYXJ5VHlwZVRyYWl0RXhwckNsYXNzOgogICBjYXNlIFN0bXQ6OlR5cGVUcmFpdEV4cHJDbGFzczoKICAgY2FzZSBTdG10OjpDWFhCaW5kVGVtcG9yYXJ5RXhwckNsYXNzOgogICBjYXNlIFN0bXQ6OkNYWERlZmF1bHRBcmdFeHByQ2xhc3M6CkBAIC0yMzYsNyArMjM1LDYgQEAKICAgY2FzZSBTdG10OjpTaHVmZmxlVmVjdG9yRXhwckNsYXNzOgogICBjYXNlIFN0bXQ6OkNvbnZlcnRWZWN0b3JFeHByQ2xhc3M6CiAgIGNhc2UgU3RtdDo6VW5hcnlFeHByT3JUeXBlVHJhaXRFeHByQ2xhc3M6Ci0gIGNhc2UgU3RtdDo6VW5hcnlUeXBlVHJhaXRFeHByQ2xhc3M6CiAgIGNhc2UgU3RtdDo6VkFBcmdFeHByQ2xhc3M6CiAgIGNhc2UgU3RtdDo6T2JqQ0FycmF5TGl0ZXJhbENsYXNzOgogICBjYXNlIFN0bXQ6Ok9iakNEaWN0aW9uYXJ5TGl0ZXJhbENsYXNzOgpAQCAtNTExLDkgKzUwOSwxMSBAQAogICBjYXNlIFN0bXQ6Ok9NUFBhcmFsbGVsRGlyZWN0aXZlQ2xhc3M6CiAgICAgSyA9IENYQ3Vyc29yX09NUFBhcmFsbGVsRGlyZWN0aXZlOwogICAgIGJyZWFrOwotICAKKyAgY2FzZSBTdG10OjpPTVBTaW1kRGlyZWN0aXZlQ2xhc3M6CisgICAgSyA9IENYQ3Vyc29yX09NUFNpbWREaXJlY3RpdmU7CisgICAgYnJlYWs7CiAgIH0KLSAgCisKICAgQ1hDdXJzb3IgQyA9IHsgSywgMCwgeyBQYXJlbnQsIFMsIFRVIH0gfTsKICAgcmV0dXJuIEM7CiB9CmRpZmYgLS1naXQgYS90b29scy9saWJjbGFuZy9DWExvYWRlZERpYWdub3N0aWMuY3BwIGIvdG9vbHMvbGliY2xhbmcvQ1hMb2FkZWREaWFnbm9zdGljLmNwcAppbmRleCBiMDJmZGQ2Li42NzljNTI4IDEwMDY0NAotLS0gYS90b29scy9saWJjbGFuZy9DWExvYWRlZERpYWdub3N0aWMuY3BwCisrKyBiL3Rvb2xzL2xpYmNsYW5nL0NYTG9hZGVkRGlhZ25vc3RpYy5jcHAKQEAgLTE1LDEzICsxNSwxMyBAQAogI2luY2x1ZGUgIkNYU3RyaW5nLmgiCiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRGlhZ25vc3RpYy5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0ZpbGVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiY2xhbmcvQmFzaWMvTExWTS5oIgogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL1NlcmlhbGl6ZWREaWFnbm9zdGljUHJpbnRlci5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKLSNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgotI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xMVk0uaCIKLSNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgogI2luY2x1ZGUgImxsdm0vQml0Y29kZS9CaXRzdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzsKIApAQCAtNjcsMTMgKzY3LDIwIEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiBDWERpYWdub3N0aWNTZXZlcml0eSBDWExvYWRlZERpYWdub3N0aWM6OmdldFNldmVyaXR5KCkgY29uc3QgewotICAvLyBGSVhNRTogcG9zc2libHkgcmVmYWN0b3Igd2l0aCBsb2dpYyBpbiBDWFN0b3JlZERpYWdub3N0aWMuCi0gIHN3aXRjaCAoc2V2ZXJpdHkpIHsKLSAgICBjYXNlIERpYWdub3N0aWNzRW5naW5lOjpJZ25vcmVkOiByZXR1cm4gQ1hEaWFnbm9zdGljX0lnbm9yZWQ7Ci0gICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6Tm90ZTogICAgcmV0dXJuIENYRGlhZ25vc3RpY19Ob3RlOwotICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6Oldhcm5pbmc6IHJldHVybiBDWERpYWdub3N0aWNfV2FybmluZzsKLSAgICBjYXNlIERpYWdub3N0aWNzRW5naW5lOjpFcnJvcjogICByZXR1cm4gQ1hEaWFnbm9zdGljX0Vycm9yOwotICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6OkZhdGFsOiAgIHJldHVybiBDWERpYWdub3N0aWNfRmF0YWw7CisgIC8vIEZJWE1FOiBGYWlsIG1vcmUgc29mdGx5IGlmIHRoZSBkaWFnbm9zdGljIGxldmVsIGlzIHVua25vd24/CisgIGF1dG8gc2V2ZXJpdHlBc0xldmVsID0gc3RhdGljX2Nhc3Q8c2VyaWFsaXplZF9kaWFnczo6TGV2ZWw+KHNldmVyaXR5KTsKKyAgYXNzZXJ0KHNldmVyaXR5ID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPihzZXZlcml0eUFzTGV2ZWwpICYmCisgICAgICAgICAidW5rbm93biBzZXJpYWxpemVkIGRpYWdub3N0aWMgbGV2ZWwiKTsKKworICBzd2l0Y2ggKHNldmVyaXR5QXNMZXZlbCkgeworI2RlZmluZSBDQVNFKFgpIGNhc2Ugc2VyaWFsaXplZF9kaWFnczo6WDogcmV0dXJuIENYRGlhZ25vc3RpY18jI1g7CisgIENBU0UoSWdub3JlZCkKKyAgQ0FTRShOb3RlKQorICBDQVNFKFdhcm5pbmcpCisgIENBU0UoRXJyb3IpCisgIENBU0UoRmF0YWwpCisgIENBU0UoUmVtYXJrKQorI3VuZGVmIENBU0UKICAgfQogICAKICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBkaWFnbm9zdGljIGxldmVsIik7CkBAIC0xNzUsNyArMTgyLDcgQEAKIC8vIERlc2VyaWFsaXplIGRpYWdub3N0aWNzLgogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAotZW51bSB7IE1heFN1cHBvcnRlZFZlcnNpb24gPSAxIH07CitlbnVtIHsgTWF4U3VwcG9ydGVkVmVyc2lvbiA9IDIgfTsKIHR5cGVkZWYgU21hbGxWZWN0b3I8dWludDY0X3QsIDY0PiBSZWNvcmREYXRhOwogZW51bSBMb2FkUmVzdWx0IHsgRmFpbHVyZSA9IDEsIFN1Y2Nlc3MgPSAwIH07CiBlbnVtIFN0cmVhbVJlc3VsdCB7IFJlYWRfRW5kT2ZTdHJlYW0sCkBAIC0yNTIsNyArMjU5LDcgQEAKICAgRmlsZVN5c3RlbU9wdGlvbnMgRk87CiAgIEZpbGVNYW5hZ2VyIEZpbGVNZ3IoRk8pOwogCi0gIE93bmluZ1B0cjxsbHZtOjpNZW1vcnlCdWZmZXI+IEJ1ZmZlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPGxsdm06Ok1lbW9yeUJ1ZmZlcj4gQnVmZmVyOwogICBCdWZmZXIucmVzZXQoRmlsZU1nci5nZXRCdWZmZXJGb3JGaWxlKGZpbGUpKTsKIAogICBpZiAoIUJ1ZmZlcikgewpAQCAtMjc3LDcgKzI4NCw4IEBACiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBPd25pbmdQdHI8Q1hMb2FkZWREaWFnbm9zdGljU2V0SW1wbD4gRGlhZ3MobmV3IENYTG9hZGVkRGlhZ25vc3RpY1NldEltcGwoKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWExvYWRlZERpYWdub3N0aWNTZXRJbXBsPiBEaWFncygKKyAgICAgIG5ldyBDWExvYWRlZERpYWdub3N0aWNTZXRJbXBsKCkpOwogCiAgIHdoaWxlICh0cnVlKSB7CiAgICAgdW5zaWduZWQgQmxvY2tJRCA9IDA7CkBAIC0yODUsNyArMjkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tJRCwgdHJ1ZSk7CiAgICAgc3dpdGNoIChSZXMpIHsKICAgICAgIGNhc2UgUmVhZF9FbmRPZlN0cmVhbToKLSAgICAgICAgcmV0dXJuIChDWERpYWdub3N0aWNTZXQpIERpYWdzLnRha2UoKTsKKyAgICAgICAgcmV0dXJuIChDWERpYWdub3N0aWNTZXQpRGlhZ3MucmVsZWFzZSgpOwogICAgICAgY2FzZSBSZWFkX0ZhaWx1cmU6CiAgICAgICAgIHJldHVybiAwOwogICAgICAgY2FzZSBSZWFkX1JlY29yZDoKQEAgLTUzMiw4ICs1NDAsOCBAQAogICAgIHJlcG9ydEludmFsaWRGaWxlKCJtYWxmb3JtZWQgZGlhZ25vc3RpYyBibG9jayIpOwogICAgIHJldHVybiBGYWlsdXJlOwogICB9Ci0gIAotICBPd25pbmdQdHI8Q1hMb2FkZWREaWFnbm9zdGljPiBEKG5ldyBDWExvYWRlZERpYWdub3N0aWMoKSk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENYTG9hZGVkRGlhZ25vc3RpYz4gRChuZXcgQ1hMb2FkZWREaWFnbm9zdGljKCkpOwogICBSZWNvcmREYXRhIFJlY29yZDsKICAgCiAgIHdoaWxlICh0cnVlKSB7CkBAIC01NjAsNyArNTY4LDcgQEAKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAgICAgICBjYXNlIFJlYWRfQmxvY2tFbmQ6Ci0gICAgICAgIERpYWdzLmFwcGVuZERpYWdub3N0aWMoRC50YWtlKCkpOyAgICAgICAgCisgICAgICAgIERpYWdzLmFwcGVuZERpYWdub3N0aWMoRC5yZWxlYXNlKCkpOwogICAgICAgICByZXR1cm4gU3VjY2VzczsKICAgICAgIGNhc2UgUmVhZF9SZWNvcmQ6CiAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvQ1hMb2FkZWREaWFnbm9zdGljLmggYi90b29scy9saWJjbGFuZy9DWExvYWRlZERpYWdub3N0aWMuaAppbmRleCBkNGIxMWQ1Li5jMjgxZjliIDEwMDY0NAotLS0gYS90b29scy9saWJjbGFuZy9DWExvYWRlZERpYWdub3N0aWMuaAorKysgYi90b29scy9saWJjbGFuZy9DWExvYWRlZERpYWdub3N0aWMuaApAQCAtMjksMzYgKzI5LDM2IEBACiAgIHZpcnR1YWwgfkNYTG9hZGVkRGlhZ25vc3RpYygpOwogICAKICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNldmVyaXR5IG9mIHRoZSBkaWFnbm9zdGljLgotICB2aXJ0dWFsIENYRGlhZ25vc3RpY1NldmVyaXR5IGdldFNldmVyaXR5KCkgY29uc3Q7Ci0gIAorICBDWERpYWdub3N0aWNTZXZlcml0eSBnZXRTZXZlcml0eSgpIGNvbnN0IG92ZXJyaWRlOworCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGlhZ25vc3RpYy4KLSAgdmlydHVhbCBDWFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3Q7Ci0gIAorICBDWFNvdXJjZUxvY2F0aW9uIGdldExvY2F0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisKICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNwZWxsaW5nIG9mIHRoZSBkaWFnbm9zdGljLgotICB2aXJ0dWFsIENYU3RyaW5nIGdldFNwZWxsaW5nKCkgY29uc3Q7Ci0gIAorICBDWFN0cmluZyBnZXRTcGVsbGluZygpIGNvbnN0IG92ZXJyaWRlOworCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB0ZXh0IGZvciB0aGUgZGlhZ25vc3RpYyBvcHRpb24uCi0gIHZpcnR1YWwgQ1hTdHJpbmcgZ2V0RGlhZ25vc3RpY09wdGlvbihDWFN0cmluZyAqRGlzYWJsZSkgY29uc3Q7Ci0gIAorICBDWFN0cmluZyBnZXREaWFnbm9zdGljT3B0aW9uKENYU3RyaW5nICpEaXNhYmxlKSBjb25zdCBvdmVycmlkZTsKKwogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgY2F0ZWdvcnkgb2YgdGhlIGRpYWdub3N0aWMuCi0gIHZpcnR1YWwgdW5zaWduZWQgZ2V0Q2F0ZWdvcnkoKSBjb25zdDsKLSAgCisgIHVuc2lnbmVkIGdldENhdGVnb3J5KCkgY29uc3Qgb3ZlcnJpZGU7CisKICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGNhdGVnb3J5IHN0cmluZyBvZiB0aGUgZGlhZ25vc3RpYy4KLSAgdmlydHVhbCBDWFN0cmluZyBnZXRDYXRlZ29yeVRleHQoKSBjb25zdDsKLSAgCisgIENYU3RyaW5nIGdldENhdGVnb3J5VGV4dCgpIGNvbnN0IG92ZXJyaWRlOworCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc291cmNlIHJhbmdlcyBmb3IgdGhlIGRpYWdub3N0aWMuCi0gIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtUmFuZ2VzKCkgY29uc3Q7Ci0gIAorICB1bnNpZ25lZCBnZXROdW1SYW5nZXMoKSBjb25zdCBvdmVycmlkZTsKKwogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgc291cmNlIHJhbmdlcyBmb3IgdGhlIGRpYWdub3N0aWMuCi0gIHZpcnR1YWwgQ1hTb3VyY2VSYW5nZSBnZXRSYW5nZSh1bnNpZ25lZCBSYW5nZSkgY29uc3Q7Ci0gIAorICBDWFNvdXJjZVJhbmdlIGdldFJhbmdlKHVuc2lnbmVkIFJhbmdlKSBjb25zdCBvdmVycmlkZTsKKwogICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIEZpeEl0cy4KLSAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1GaXhJdHMoKSBjb25zdDsKLSAgCisgIHVuc2lnbmVkIGdldE51bUZpeEl0cygpIGNvbnN0IG92ZXJyaWRlOworCiAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBGaXhJdCBpbmZvcm1hdGlvbiAoc291cmNlIHJhbmdlIGFuZCBpbnNlcnRlZCB0ZXh0KS4KLSAgdmlydHVhbCBDWFN0cmluZyBnZXRGaXhJdCh1bnNpZ25lZCBGaXhJdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWFNvdXJjZVJhbmdlICpSZXBsYWNlbWVudFJhbmdlKSBjb25zdDsKLSAgCisgIENYU3RyaW5nIGdldEZpeEl0KHVuc2lnbmVkIEZpeEl0LAorICAgICAgICAgICAgICAgICAgICBDWFNvdXJjZVJhbmdlICpSZXBsYWNlbWVudFJhbmdlKSBjb25zdCBvdmVycmlkZTsKKwogICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENYRGlhZ25vc3RpY0ltcGwgKkQpIHsKICAgICByZXR1cm4gRC0+Z2V0S2luZCgpID09IExvYWRlZERpYWdub3N0aWNLaW5kOwogICB9CmRpZmYgLS1naXQgYS90b29scy9saWJjbGFuZy9DWFNvdXJjZUxvY2F0aW9uLmNwcCBiL3Rvb2xzL2xpYmNsYW5nL0NYU291cmNlTG9jYXRpb24uY3BwCmluZGV4IDczNzExNzcuLmY3OGI2ODcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmNsYW5nL0NYU291cmNlTG9jYXRpb24uY3BwCisrKyBiL3Rvb2xzL2xpYmNsYW5nL0NYU291cmNlTG9jYXRpb24uY3BwCkBAIC0xMjIsNyArMTIyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRmlsZSBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb2x1bW4pIHsKLSAgaWYgKCFUVSB8fCAhZmlsZSkKKyAgaWYgKGN4dHU6OmlzTm90VXNhYmxlVFUoVFUpKSB7CisgICAgTE9HX0JBRF9UVShUVSk7CisgICAgcmV0dXJuIGNsYW5nX2dldE51bGxMb2NhdGlvbigpOworICB9CisgIGlmICghZmlsZSkKICAgICByZXR1cm4gY2xhbmdfZ2V0TnVsbExvY2F0aW9uKCk7CiAgIGlmIChsaW5lID09IDAgfHwgY29sdW1uID09IDApCiAgICAgcmV0dXJuIGNsYW5nX2dldE51bGxMb2NhdGlvbigpOwpAQCAtMTUxLDkgKzE1NSwxMyBAQAogQ1hTb3VyY2VMb2NhdGlvbiBjbGFuZ19nZXRMb2NhdGlvbkZvck9mZnNldChDWFRyYW5zbGF0aW9uVW5pdCBUVSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGaWxlIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG9mZnNldCkgewotICBpZiAoIVRVIHx8ICFmaWxlKQorICBpZiAoY3h0dTo6aXNOb3RVc2FibGVUVShUVSkpIHsKKyAgICBMT0dfQkFEX1RVKFRVKTsKICAgICByZXR1cm4gY2xhbmdfZ2V0TnVsbExvY2F0aW9uKCk7Ci0gIAorICB9CisgIGlmICghZmlsZSkKKyAgICByZXR1cm4gY2xhbmdfZ2V0TnVsbExvY2F0aW9uKCk7CisKICAgQVNUVW5pdCAqQ1hYVW5pdCA9IGN4dHU6OmdldEFTVFVuaXQoVFUpOwogCiAgIFNvdXJjZUxvY2F0aW9uIFNMb2MgCmRpZmYgLS1naXQgYS90b29scy9saWJjbGFuZy9DWFN0b3JlZERpYWdub3N0aWMuY3BwIGIvdG9vbHMvbGliY2xhbmcvQ1hTdG9yZWREaWFnbm9zdGljLmNwcAppbmRleCA5NzMxNjE2Li40NWNlMzliIDEwMDY0NAotLS0gYS90b29scy9saWJjbGFuZy9DWFN0b3JlZERpYWdub3N0aWMuY3BwCisrKyBiL3Rvb2xzL2xpYmNsYW5nL0NYU3RvcmVkRGlhZ25vc3RpYy5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICAgc3dpdGNoIChEaWFnLmdldExldmVsKCkpIHsKICAgICBjYXNlIERpYWdub3N0aWNzRW5naW5lOjpJZ25vcmVkOiByZXR1cm4gQ1hEaWFnbm9zdGljX0lnbm9yZWQ7CiAgICAgY2FzZSBEaWFnbm9zdGljc0VuZ2luZTo6Tm90ZTogICAgcmV0dXJuIENYRGlhZ25vc3RpY19Ob3RlOworICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6OlJlbWFyazogIHJldHVybiBDWERpYWdub3N0aWNfUmVtYXJrOwogICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6Oldhcm5pbmc6IHJldHVybiBDWERpYWdub3N0aWNfV2FybmluZzsKICAgICBjYXNlIERpYWdub3N0aWNzRW5naW5lOjpFcnJvcjogICByZXR1cm4gQ1hEaWFnbm9zdGljX0Vycm9yOwogICAgIGNhc2UgRGlhZ25vc3RpY3NFbmdpbmU6OkZhdGFsOiAgIHJldHVybiBDWERpYWdub3N0aWNfRmF0YWw7CmRpZmYgLS1naXQgYS90b29scy9saWJjbGFuZy9DWFN0cmluZy5oIGIvdG9vbHMvbGliY2xhbmcvQ1hTdHJpbmcuaAppbmRleCA3MDMyMDMzLi5hYzA0MjU5IDEwMDY0NAotLS0gYS90b29scy9saWJjbGFuZy9DWFN0cmluZy5oCisrKyBiL3Rvb2xzL2xpYmNsYW5nL0NYU3RyaW5nLmgKQEAgLTE5LDggKzE5LDggQEAKICNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgogI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgotI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIGN4c3RyaW5nIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYmNsYW5nL0NYVHJhbnNsYXRpb25Vbml0LmggYi90b29scy9saWJjbGFuZy9DWFRyYW5zbGF0aW9uVW5pdC5oCmluZGV4IGMwMDE0YzAuLjEzMTgzYmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmNsYW5nL0NYVHJhbnNsYXRpb25Vbml0LmgKKysrIGIvdG9vbHMvbGliY2xhbmcvQ1hUcmFuc2xhdGlvblVuaXQuaApAQCAtMTQsOCArMTQsOSBAQAogI2lmbmRlZiBMTFZNX0NMQU5HX0NYVFJBTlNMQVRJT05VTklUX0gKICNkZWZpbmUgTExWTV9DTEFOR19DWFRSQU5TTEFUSU9OVU5JVF9ICiAKLSNpbmNsdWRlICJjbGFuZy1jL0luZGV4LmgiCisjaW5jbHVkZSAiQ0xvZy5oIgogI2luY2x1ZGUgIkNYU3RyaW5nLmgiCisjaW5jbHVkZSAiY2xhbmctYy9JbmRleC5oIgogCiBuYW1lc3BhY2UgY2xhbmcgewogICBjbGFzcyBBU1RVbml0OwpAQCAtNDUsNiArNDYsMjEgQEAKICAgcmV0dXJuIFRVLT5UaGVBU1RVbml0OwogfQogCisvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgQVNUVW5pdCBoYXMgYSBkaWFnbm9zdGljIGFib3V0IHRoZSBBU1QgZmlsZSBiZWluZworLy8vIGNvcnJ1cHRlZC4KK2Jvb2wgaXNBU1RSZWFkRXJyb3IoQVNUVW5pdCAqQVUpOworCitzdGF0aWMgaW5saW5lIGJvb2wgaXNOb3RVc2FibGVUVShDWFRyYW5zbGF0aW9uVW5pdCBUVSkgeworICByZXR1cm4gIVRVOworfQorCisjZGVmaW5lIExPR19CQURfVFUoVFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgTE9HX0ZVTkNfU0VDVElPTiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICpMb2cgPDwgImNhbGxlZCB3aXRoIGEgYmFkIFRVOiAiIDw8IFRVOyAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoZmFsc2UpCisKIGNsYXNzIENYVFVPd25lciB7CiAgIENYVHJhbnNsYXRpb25Vbml0SW1wbCAqVFU7CiAgIApkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvQ1hUeXBlLmNwcCBiL3Rvb2xzL2xpYmNsYW5nL0NYVHlwZS5jcHAKaW5kZXggMWUyY2IxOC4uODJjMzBiZiAxMDA2NDQKLS0tIGEvdG9vbHMvbGliY2xhbmcvQ1hUeXBlLmNwcAorKysgYi90b29scy9saWJjbGFuZy9DWFR5cGUuY3BwCkBAIC01MzgsNyArNTM4LDcgQEAKICAgICByZXR1cm4gLTE7CiAgIAogICBpZiAoY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKkZEID0gVC0+Z2V0QXM8RnVuY3Rpb25Qcm90b1R5cGU+KCkpIHsKLSAgICByZXR1cm4gRkQtPmdldE51bUFyZ3MoKTsKKyAgICByZXR1cm4gRkQtPmdldE51bVBhcmFtcygpOwogICB9CiAgIAogICBpZiAoVC0+Z2V0QXM8RnVuY3Rpb25Ob1Byb3RvVHlwZT4oKSkgewpAQCAtNTU0LDExICs1NTQsMTEgQEAKICAgICByZXR1cm4gTWFrZUNYVHlwZShRdWFsVHlwZSgpLCBHZXRUVShYKSk7CiAKICAgaWYgKGNvbnN0IEZ1bmN0aW9uUHJvdG9UeXBlICpGRCA9IFQtPmdldEFzPEZ1bmN0aW9uUHJvdG9UeXBlPigpKSB7Ci0gICAgdW5zaWduZWQgbnVtQXJncyA9IEZELT5nZXROdW1BcmdzKCk7Ci0gICAgaWYgKGkgPj0gbnVtQXJncykKKyAgICB1bnNpZ25lZCBudW1QYXJhbXMgPSBGRC0+Z2V0TnVtUGFyYW1zKCk7CisgICAgaWYgKGkgPj0gbnVtUGFyYW1zKQogICAgICAgcmV0dXJuIE1ha2VDWFR5cGUoUXVhbFR5cGUoKSwgR2V0VFUoWCkpOwotICAgIAotICAgIHJldHVybiBNYWtlQ1hUeXBlKEZELT5nZXRBcmdUeXBlKGkpLCBHZXRUVShYKSk7CisKKyAgICByZXR1cm4gTWFrZUNYVHlwZShGRC0+Z2V0UGFyYW1UeXBlKGkpLCBHZXRUVShYKSk7CiAgIH0KICAgCiAgIHJldHVybiBNYWtlQ1hUeXBlKFF1YWxUeXBlKCksIEdldFRVKFgpKTsKQEAgLTU3MCw4ICs1NzAsOCBAQAogICAgIHJldHVybiBNYWtlQ1hUeXBlKFF1YWxUeXBlKCksIEdldFRVKFgpKTsKICAgCiAgIGlmIChjb25zdCBGdW5jdGlvblR5cGUgKkZEID0gVC0+Z2V0QXM8RnVuY3Rpb25UeXBlPigpKQotICAgIHJldHVybiBNYWtlQ1hUeXBlKEZELT5nZXRSZXN1bHRUeXBlKCksIEdldFRVKFgpKTsKLSAgCisgICAgcmV0dXJuIE1ha2VDWFR5cGUoRkQtPmdldFJldHVyblR5cGUoKSwgR2V0VFUoWCkpOworCiAgIHJldHVybiBNYWtlQ1hUeXBlKFF1YWxUeXBlKCksIEdldFRVKFgpKTsKIH0KIApAQCAtNTc5LDcgKzU3OSw3IEBACiAgIGlmIChjbGFuZ19pc0RlY2xhcmF0aW9uKEMua2luZCkpIHsKICAgICBjb25zdCBEZWNsICpEID0gY3hjdXJzb3I6OmdldEN1cnNvckRlY2woQyk7CiAgICAgaWYgKGNvbnN0IE9iakNNZXRob2REZWNsICpNRCA9IGR5bl9jYXN0X29yX251bGw8T2JqQ01ldGhvZERlY2w+KEQpKQotICAgICAgcmV0dXJuIE1ha2VDWFR5cGUoTUQtPmdldFJlc3VsdFR5cGUoKSwgY3hjdXJzb3I6OmdldEN1cnNvclRVKEMpKTsKKyAgICAgIHJldHVybiBNYWtlQ1hUeXBlKE1ELT5nZXRSZXR1cm5UeXBlKCksIGN4Y3Vyc29yOjpnZXRDdXJzb3JUVShDKSk7CiAKICAgICByZXR1cm4gY2xhbmdfZ2V0UmVzdWx0VHlwZShjbGFuZ19nZXRDdXJzb3JUeXBlKEMpKTsKICAgfQpAQCAtNzUyLDE1ICs3NTIsMTQgQEAKIH0KIAogc3RhdGljIGxvbmcgbG9uZyB2aXNpdFJlY29yZEZvclZhbGlkYXRpb24oY29uc3QgUmVjb3JkRGVjbCAqUkQpIHsKLSAgZm9yIChSZWNvcmREZWNsOjpmaWVsZF9pdGVyYXRvciBJID0gUkQtPmZpZWxkX2JlZ2luKCksIEUgPSBSRC0+ZmllbGRfZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpewotICAgIFF1YWxUeXBlIEZRVCA9ICgqSSktPmdldFR5cGUoKTsKKyAgZm9yIChjb25zdCBhdXRvICpJIDogUkQtPmZpZWxkcygpKXsKKyAgICBRdWFsVHlwZSBGUVQgPSBJLT5nZXRUeXBlKCk7CiAgICAgaWYgKEZRVC0+aXNJbmNvbXBsZXRlVHlwZSgpKQogICAgICAgcmV0dXJuIENYVHlwZUxheW91dEVycm9yX0luY29tcGxldGU7CiAgICAgaWYgKEZRVC0+aXNEZXBlbmRlbnRUeXBlKCkpCiAgICAgICByZXR1cm4gQ1hUeXBlTGF5b3V0RXJyb3JfRGVwZW5kZW50OwogICAgIC8vIHJlY3Vyc2UKLSAgICBpZiAoY29uc3QgUmVjb3JkVHlwZSAqQ2hpbGRUeXBlID0gKCpJKS0+Z2V0VHlwZSgpLT5nZXRBczxSZWNvcmRUeXBlPigpKSB7CisgICAgaWYgKGNvbnN0IFJlY29yZFR5cGUgKkNoaWxkVHlwZSA9IEktPmdldFR5cGUoKS0+Z2V0QXM8UmVjb3JkVHlwZT4oKSkgewogICAgICAgaWYgKGNvbnN0IFJlY29yZERlY2wgKkNoaWxkID0gQ2hpbGRUeXBlLT5nZXREZWNsKCkpIHsKICAgICAgICAgbG9uZyBsb25nIHJldCA9IHZpc2l0UmVjb3JkRm9yVmFsaWRhdGlvbihDaGlsZCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQpAQCAtODcxLDQgKzg3MCwzOCBAQAogICByZXR1cm4gY3hzdHJpbmc6OmNyZWF0ZUR1cChlbmNvZGluZyk7CiB9CiAKK2ludCBjbGFuZ19UeXBlX2dldE51bVRlbXBsYXRlQXJndW1lbnRzKENYVHlwZSBDVCkgeworICBRdWFsVHlwZSBUID0gR2V0UXVhbFR5cGUoQ1QpOworICBpZiAoVC5pc051bGwoKSkKKyAgICByZXR1cm4gLTE7CisgIGNvbnN0IENYWFJlY29yZERlY2wgKlJlY29yZERlY2wgPSBULT5nZXRBc0NYWFJlY29yZERlY2woKTsKKyAgaWYgKCFSZWNvcmREZWNsKQorICAgIHJldHVybiAtMTsKKyAgY29uc3QgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqVGVtcGxhdGVEZWNsID0KKyAgICAgIGR5bl9jYXN0PENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+KFJlY29yZERlY2wpOworICBpZiAoIVRlbXBsYXRlRGVjbCkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiBUZW1wbGF0ZURlY2wtPmdldFRlbXBsYXRlQXJncygpLnNpemUoKTsKK30KKworQ1hUeXBlIGNsYW5nX1R5cGVfZ2V0VGVtcGxhdGVBcmd1bWVudEFzVHlwZShDWFR5cGUgQ1QsIHVuc2lnbmVkIGkpIHsKKyAgUXVhbFR5cGUgVCA9IEdldFF1YWxUeXBlKENUKTsKKyAgaWYgKFQuaXNOdWxsKCkpCisgICAgcmV0dXJuIE1ha2VDWFR5cGUoUXVhbFR5cGUoKSwgR2V0VFUoQ1QpKTsKKyAgY29uc3QgQ1hYUmVjb3JkRGVjbCAqUmVjb3JkRGVjbCA9IFQtPmdldEFzQ1hYUmVjb3JkRGVjbCgpOworICBpZiAoIVJlY29yZERlY2wpCisgICAgcmV0dXJuIE1ha2VDWFR5cGUoUXVhbFR5cGUoKSwgR2V0VFUoQ1QpKTsKKyAgY29uc3QgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCAqVGVtcGxhdGVEZWNsID0KKyAgICAgIGR5bl9jYXN0PENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2w+KFJlY29yZERlY2wpOworICBpZiAoIVRlbXBsYXRlRGVjbCkKKyAgICByZXR1cm4gTWFrZUNYVHlwZShRdWFsVHlwZSgpLCBHZXRUVShDVCkpOworICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TGlzdCAmVEEgPSBUZW1wbGF0ZURlY2wtPmdldFRlbXBsYXRlQXJncygpOworICBpZiAoVEEuc2l6ZSgpIDw9IGkpCisgICAgcmV0dXJuIE1ha2VDWFR5cGUoUXVhbFR5cGUoKSwgR2V0VFUoQ1QpKTsKKyAgY29uc3QgVGVtcGxhdGVBcmd1bWVudCAmQSA9IFRBLmdldChpKTsKKyAgaWYgKEEuZ2V0S2luZCgpICE9IFRlbXBsYXRlQXJndW1lbnQ6OlR5cGUpCisgICAgcmV0dXJuIE1ha2VDWFR5cGUoUXVhbFR5cGUoKSwgR2V0VFUoQ1QpKTsKKyAgcmV0dXJuIE1ha2VDWFR5cGUoQS5nZXRBc1R5cGUoKSwgR2V0VFUoQ1QpKTsKK30KKwogfSAvLyBlbmQ6IGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYmNsYW5nL0luZGV4Qm9keS5jcHAgYi90b29scy9saWJjbGFuZy9JbmRleEJvZHkuY3BwCmluZGV4IGUwOGEzNDYuLjZjYzgwNjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmNsYW5nL0luZGV4Qm9keS5jcHAKKysrIGIvdG9vbHMvbGliY2xhbmcvSW5kZXhCb2R5LmNwcApAQCAtOCwxOSArOCwxOSBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgIkluZGV4aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIlJlY3Vyc2l2ZUFTVFZpc2l0b3IuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3IuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIGN4aW5kZXg7CiAKIG5hbWVzcGFjZSB7CiAKLWNsYXNzIEJvZHlJbmRleGVyIDogcHVibGljIGN4aW5kZXg6OlJlY3Vyc2l2ZUFTVFZpc2l0b3I8Qm9keUluZGV4ZXI+IHsKK2NsYXNzIEJvZHlJbmRleGVyIDogcHVibGljIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPEJvZHlJbmRleGVyPiB7CiAgIEluZGV4aW5nQ29udGV4dCAmSW5kZXhDdHg7CiAgIGNvbnN0IE5hbWVkRGVjbCAqUGFyZW50OwogICBjb25zdCBEZWNsQ29udGV4dCAqUGFyZW50REM7CiAKLSAgdHlwZWRlZiBSZWN1cnNpdmVBU1RWaXNpdG9yPEJvZHlJbmRleGVyPiBiYXNlOworICB0eXBlZGVmIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPEJvZHlJbmRleGVyPiBiYXNlOwogcHVibGljOgogICBCb2R5SW5kZXhlcihJbmRleGluZ0NvbnRleHQgJmluZGV4Q3R4LAogICAgICAgICAgICAgICBjb25zdCBOYW1lZERlY2wgKlBhcmVudCwgY29uc3QgRGVjbENvbnRleHQgKkRDKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvSW5kZXhEZWNsLmNwcCBiL3Rvb2xzL2xpYmNsYW5nL0luZGV4RGVjbC5jcHAKaW5kZXggODlmZWI5Ni4uNjQwNTJlZCAxMDA2NDQKLS0tIGEvdG9vbHMvbGliY2xhbmcvSW5kZXhEZWNsLmNwcAorKysgYi90b29scy9saWJjbGFuZy9JbmRleERlY2wuY3BwCkBAIC00MSwxMCArNDEsOCBAQAogICAgICAgaWYgKGNvbnN0IFBhcm1WYXJEZWNsICpQYXJtID0gZHluX2Nhc3Q8UGFybVZhckRlY2w+KEQpKSB7CiAgICAgICAgIEluZGV4Q3R4LmhhbmRsZVZhcihQYXJtKTsKICAgICAgIH0gZWxzZSBpZiAoY29uc3QgRnVuY3Rpb25EZWNsICpGRCA9IGR5bl9jYXN0PEZ1bmN0aW9uRGVjbD4oRCkpIHsKLSAgICAgICAgZm9yIChGdW5jdGlvbkRlY2w6OnBhcmFtX2NvbnN0X2l0ZXJhdG9yIFBJID0gRkQtPnBhcmFtX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRSA9IEZELT5wYXJhbV9lbmQoKTsKLSAgICAgICAgICAgICBQSSAhPSBQRTsgKytQSSkgewotICAgICAgICAgIEluZGV4Q3R4LmhhbmRsZVZhcigqUEkpOworICAgICAgICBmb3IgKGF1dG8gUEkgOiBGRC0+cGFyYW1zKCkpIHsKKyAgICAgICAgICBJbmRleEN0eC5oYW5kbGVWYXIoUEkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNTUsMTEgKzUzLDkgQEAKICAgICBpZiAoRC0+aXNJbXBsaWNpdCgpKQogICAgICAgcmV0dXJuOwogCi0gICAgSW5kZXhDdHguaW5kZXhUeXBlU291cmNlSW5mbyhELT5nZXRSZXN1bHRUeXBlU291cmNlSW5mbygpLCBEKTsKLSAgICBmb3IgKE9iakNNZXRob2REZWNsOjpwYXJhbV9jb25zdF9pdGVyYXRvciBJID0gRC0+cGFyYW1fYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRC0+cGFyYW1fZW5kKCk7Ci0gICAgICAgICBJICE9IEU7ICsrSSkKLSAgICAgIGhhbmRsZURlY2xhcmF0b3IoKkksIEQpOworICAgIEluZGV4Q3R4LmluZGV4VHlwZVNvdXJjZUluZm8oRC0+Z2V0UmV0dXJuVHlwZVNvdXJjZUluZm8oKSwgRCk7CisgICAgZm9yIChjb25zdCBhdXRvICpJIDogRC0+cGFyYW1zKCkpCisgICAgICBoYW5kbGVEZWNsYXJhdG9yKEksIEQpOwogCiAgICAgaWYgKEQtPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkgewogICAgICAgY29uc3QgU3RtdCAqQm9keSA9IEQtPmdldEJvZHkoKTsKQEAgLTc1LDEwICs3MSw3IEBACiAKICAgICBpZiAoY29uc3QgQ1hYQ29uc3RydWN0b3JEZWNsICpDdG9yID0gZHluX2Nhc3Q8Q1hYQ29uc3RydWN0b3JEZWNsPihEKSkgewogICAgICAgLy8gQ29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLgotICAgICAgZm9yIChDWFhDb25zdHJ1Y3RvckRlY2w6OmluaXRfY29uc3RfaXRlcmF0b3IgSSA9IEN0b3ItPmluaXRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBDdG9yLT5pbml0X2VuZCgpOwotICAgICAgICAgICBJICE9IEU7ICsrSSkgewotICAgICAgICBDWFhDdG9ySW5pdGlhbGl6ZXIgKkluaXQgPSAqSTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAqSW5pdCA6IEN0b3ItPmluaXRzKCkpIHsKICAgICAgICAgaWYgKEluaXQtPmlzV3JpdHRlbigpKSB7CiAgICAgICAgICAgSW5kZXhDdHguaW5kZXhUeXBlU291cmNlSW5mbyhJbml0LT5nZXRUeXBlU291cmNlSW5mbygpLCBEKTsKICAgICAgICAgICBpZiAoY29uc3QgRmllbGREZWNsICpNZW1iZXIgPSBJbml0LT5nZXRBbnlNZW1iZXIoKSkKQEAgLTE3MiwxNSArMTY1LDExIEBACiAKICAgICAvLyBJbmRleCB0aGUgaXZhcnMgZmlyc3QgdG8gbWFrZSBzdXJlIHRoZSBzeW50aGVzaXplZCBpdmFycyBhcmUgaW5kZXhlZAogICAgIC8vIGJlZm9yZSBpbmRleGluZyB0aGUgbWV0aG9kcyB0aGF0IGNhbiByZWZlcmVuY2UgdGhlbS4KLSAgICBmb3IgKE9iakNJbXBsZW1lbnRhdGlvbkRlY2w6Oml2YXJfaXRlcmF0b3IKLSAgICAgICAgICAgSXZhckkgPSBELT5pdmFyX2JlZ2luKCksCi0gICAgICAgICAgIEl2YXJFID0gRC0+aXZhcl9lbmQoKTsgSXZhckkgIT0gSXZhckU7ICsrSXZhckkpIHsKLSAgICAgIEluZGV4Q3R4LmluZGV4RGVjbCgqSXZhckkpOwotICAgIH0KLSAgICBmb3IgKERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yCi0gICAgICAgICAgIEkgPSBELT5kZWNsc19iZWdpbigpLCBFID0gRC0+ZGVjbHNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBpZiAoIWlzYTxPYmpDSXZhckRlY2w+KCpJKSkKLSAgICAgICAgSW5kZXhDdHguaW5kZXhEZWNsKCpJKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gKkl2YXJJIDogRC0+aXZhcnMoKSkKKyAgICAgIEluZGV4Q3R4LmluZGV4RGVjbChJdmFySSk7CisgICAgZm9yIChjb25zdCBhdXRvICpJIDogRC0+ZGVjbHMoKSkgeworICAgICAgaWYgKCFpc2E8T2JqQ0l2YXJEZWNsPihJKSkKKyAgICAgICAgSW5kZXhDdHguaW5kZXhEZWNsKEkpOwogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwpAQCAtMjY4LDExICsyNTcsOSBAQAogICAgIC8vIHdlIHNob3VsZCBkbyBiZXR0ZXIuCiAKICAgICBJbmRleEN0eC5pbmRleE5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoRC0+Z2V0UXVhbGlmaWVyTG9jKCksIEQpOwotICAgIGZvciAoVXNpbmdEZWNsOjpzaGFkb3dfaXRlcmF0b3IKLSAgICAgICAgICAgSSA9IEQtPnNoYWRvd19iZWdpbigpLCBFID0gRC0+c2hhZG93X2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgSW5kZXhDdHguaGFuZGxlUmVmZXJlbmNlKCgqSSktPmdldFVuZGVybHlpbmdEZWNsKCksIEQtPmdldExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRCwgRC0+Z2V0TGV4aWNhbERlY2xDb250ZXh0KCkpOwotICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gKkkgOiBELT5zaGFkb3dzKCkpCisgICAgICBJbmRleEN0eC5oYW5kbGVSZWZlcmVuY2UoSS0+Z2V0VW5kZXJseWluZ0RlY2woKSwgRC0+Z2V0TG9jYXRpb24oKSwgRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBELT5nZXRMZXhpY2FsRGVjbENvbnRleHQoKSk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIApAQCAtMzQxLDEwICszMjgsOCBAQAogfQogCiB2b2lkIEluZGV4aW5nQ29udGV4dDo6aW5kZXhEZWNsQ29udGV4dChjb25zdCBEZWNsQ29udGV4dCAqREMpIHsKLSAgZm9yIChEZWNsQ29udGV4dDo6ZGVjbF9pdGVyYXRvcgotICAgICAgICAgSSA9IERDLT5kZWNsc19iZWdpbigpLCBFID0gREMtPmRlY2xzX2VuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIGluZGV4RGVjbCgqSSk7Ci0gIH0KKyAgZm9yIChjb25zdCBhdXRvICpJIDogREMtPmRlY2xzKCkpCisgICAgaW5kZXhEZWNsKEkpOwogfQogCiB2b2lkIEluZGV4aW5nQ29udGV4dDo6aW5kZXhUb3BMZXZlbERlY2woY29uc3QgRGVjbCAqRCkgewpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvSW5kZXhUeXBlU291cmNlSW5mby5jcHAgYi90b29scy9saWJjbGFuZy9JbmRleFR5cGVTb3VyY2VJbmZvLmNwcAppbmRleCAyYzc3MWM4Li40ZjhkNGU1IDEwMDY0NAotLS0gYS90b29scy9saWJjbGFuZy9JbmRleFR5cGVTb3VyY2VJbmZvLmNwcAorKysgYi90b29scy9saWJjbGFuZy9JbmRleFR5cGVTb3VyY2VJbmZvLmNwcApAQCAtOCwxNCArOCwxNCBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgIkluZGV4aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIlJlY3Vyc2l2ZUFTVFZpc2l0b3IuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRGF0YVJlY3Vyc2l2ZUFTVFZpc2l0b3IuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGNsYW5nOwogdXNpbmcgbmFtZXNwYWNlIGN4aW5kZXg7CiAKIG5hbWVzcGFjZSB7CiAKLWNsYXNzIFR5cGVJbmRleGVyIDogcHVibGljIGN4aW5kZXg6OlJlY3Vyc2l2ZUFTVFZpc2l0b3I8VHlwZUluZGV4ZXI+IHsKK2NsYXNzIFR5cGVJbmRleGVyIDogcHVibGljIERhdGFSZWN1cnNpdmVBU1RWaXNpdG9yPFR5cGVJbmRleGVyPiB7CiAgIEluZGV4aW5nQ29udGV4dCAmSW5kZXhDdHg7CiAgIGNvbnN0IE5hbWVkRGVjbCAqUGFyZW50OwogICBjb25zdCBEZWNsQ29udGV4dCAqUGFyZW50REM7CmRpZmYgLS1naXQgYS90b29scy9saWJjbGFuZy9JbmRleGluZy5jcHAgYi90b29scy9saWJjbGFuZy9JbmRleGluZy5jcHAKaW5kZXggOTlmY2RiNi4uNTVlNmU3OSAxMDA2NDQKLS0tIGEvdG9vbHMvbGliY2xhbmcvSW5kZXhpbmcuY3BwCisrKyBiL3Rvb2xzL2xpYmNsYW5nL0luZGV4aW5nLmNwcApAQCAtMjE5LDcgKzIxOSw3IEBACiAgICAgYXNzZXJ0KFJlZ2lvbkxvYy5pc0ZpbGVJRCgpKTsKICAgICBGaWxlSUQgUmVnaW9uRklEOwogICAgIHVuc2lnbmVkIFJlZ2lvbk9mZnNldDsKLSAgICBsbHZtOjp0aWUoUmVnaW9uRklELCBSZWdpb25PZmZzZXQpID0gU00uZ2V0RGVjb21wb3NlZExvYyhSZWdpb25Mb2MpOworICAgIHN0ZDo6dGllKFJlZ2lvbkZJRCwgUmVnaW9uT2Zmc2V0KSA9IFNNLmdldERlY29tcG9zZWRMb2MoUmVnaW9uTG9jKTsKIAogICAgIGlmIChSZWdpb25GSUQgIT0gRklEKSB7CiAgICAgICBpZiAoaXNQYXJzZWRPbmNlSW5jbHVkZShGRSkpIHsKQEAgLTI1Myw4ICsyNTMsOCBAQAogICBJbmRleFBQQ2FsbGJhY2tzKFByZXByb2Nlc3NvciAmUFAsIEluZGV4aW5nQ29udGV4dCAmaW5kZXhDdHgpCiAgICAgOiBQUChQUCksIEluZGV4Q3R4KGluZGV4Q3R4KSwgSXNNYWluRmlsZUVudGVyZWQoZmFsc2UpIHsgfQogCi0gIHZpcnR1YWwgdm9pZCBGaWxlQ2hhbmdlZChTb3VyY2VMb2NhdGlvbiBMb2MsIEZpbGVDaGFuZ2VSZWFzb24gUmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBGaWxlVHlwZSwgRmlsZUlEIFByZXZGSUQpIHsKKyAgdm9pZCBGaWxlQ2hhbmdlZChTb3VyY2VMb2NhdGlvbiBMb2MsIEZpbGVDaGFuZ2VSZWFzb24gUmVhc29uLAorICAgICAgICAgICAgICAgICBTcmNNZ3I6OkNoYXJhY3RlcmlzdGljS2luZCBGaWxlVHlwZSwgRmlsZUlEIFByZXZGSUQpIG92ZXJyaWRlIHsKICAgICBpZiAoSXNNYWluRmlsZUVudGVyZWQpCiAgICAgICByZXR1cm47CiAKQEAgLTI2NywxNSArMjY3LDExIEBACiAgICAgfQogICB9CiAKLSAgdmlydHVhbCB2b2lkIEluY2x1c2lvbkRpcmVjdGl2ZShTb3VyY2VMb2NhdGlvbiBIYXNoTG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRva2VuICZJbmNsdWRlVG9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQW5nbGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJTb3VyY2VSYW5nZSBGaWxlbmFtZVJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VhcmNoUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVsYXRpdmVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqSW1wb3J0ZWQpIHsKKyAgdm9pZCBJbmNsdXNpb25EaXJlY3RpdmUoU291cmNlTG9jYXRpb24gSGFzaExvYywgY29uc3QgVG9rZW4gJkluY2x1ZGVUb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwgYm9vbCBJc0FuZ2xlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhclNvdXJjZVJhbmdlIEZpbGVuYW1lUmFuZ2UsIGNvbnN0IEZpbGVFbnRyeSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNlYXJjaFBhdGgsIFN0cmluZ1JlZiBSZWxhdGl2ZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqSW1wb3J0ZWQpIG92ZXJyaWRlIHsKICAgICBib29sIGlzSW1wb3J0ID0gKEluY2x1ZGVUb2suaXModG9rOjppZGVudGlmaWVyKSAmJgogICAgICAgICAgICAgSW5jbHVkZVRvay5nZXRJZGVudGlmaWVySW5mbygpLT5nZXRQUEtleXdvcmRJRCgpID09IHRvazo6cHBfaW1wb3J0KTsKICAgICBJbmRleEN0eC5wcEluY2x1ZGVkRmlsZShIYXNoTG9jLCBGaWxlTmFtZSwgRmlsZSwgaXNJbXBvcnQsIElzQW5nbGVkLApAQCAtMjgzLDI1ICsyNzksMjEgQEAKICAgfQogCiAgIC8vLyBNYWNyb0RlZmluZWQgLSBUaGlzIGhvb2sgaXMgY2FsbGVkIHdoZW5ldmVyIGEgbWFjcm8gZGVmaW5pdGlvbiBpcyBzZWVuLgotICB2aXJ0dWFsIHZvaWQgTWFjcm9EZWZpbmVkKGNvbnN0IFRva2VuICZJZCwgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKSB7Ci0gIH0KKyAgdm9pZCBNYWNyb0RlZmluZWQoY29uc3QgVG9rZW4gJklkLCBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQpIG92ZXJyaWRlIHt9CiAKICAgLy8vIE1hY3JvVW5kZWZpbmVkIC0gVGhpcyBob29rIGlzIGNhbGxlZCB3aGVuZXZlciBhIG1hY3JvICN1bmRlZiBpcyBzZWVuLgogICAvLy8gTUkgaXMgcmVsZWFzZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgY2FsbGJhY2suCi0gIHZpcnR1YWwgdm9pZCBNYWNyb1VuZGVmaW5lZChjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1EKSB7Ci0gIH0KKyAgdm9pZCBNYWNyb1VuZGVmaW5lZChjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY3JvRGlyZWN0aXZlICpNRCkgb3ZlcnJpZGUge30KIAogICAvLy8gTWFjcm9FeHBhbmRzIC0gVGhpcyBpcyBjYWxsZWQgYnkgd2hlbiBhIG1hY3JvIGludm9jYXRpb24gaXMgZm91bmQuCi0gIHZpcnR1YWwgdm9pZCBNYWNyb0V4cGFuZHMoY29uc3QgVG9rZW4gJk1hY3JvTmFtZVRvaywgY29uc3QgTWFjcm9EaXJlY3RpdmUgKk1ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlLCBjb25zdCBNYWNyb0FyZ3MgKkFyZ3MpIHsKLSAgfQorICB2b2lkIE1hY3JvRXhwYW5kcyhjb25zdCBUb2tlbiAmTWFjcm9OYW1lVG9rLCBjb25zdCBNYWNyb0RpcmVjdGl2ZSAqTUQsCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZVJhbmdlIFJhbmdlLCBjb25zdCBNYWNyb0FyZ3MgKkFyZ3MpIG92ZXJyaWRlIHt9CiAKICAgLy8vIFNvdXJjZVJhbmdlU2tpcHBlZCAtIFRoaXMgaG9vayBpcyBjYWxsZWQgd2hlbiBhIHNvdXJjZSByYW5nZSBpcyBza2lwcGVkLgogICAvLy8gXHBhcmFtIFJhbmdlIFRoZSBTb3VyY2VSYW5nZSB0aGF0IHdhcyBza2lwcGVkLiBUaGUgcmFuZ2UgYmVnaW5zIGF0IHRoZQogICAvLy8gI2lmLyNlbHNlIGRpcmVjdGl2ZSBhbmQgZW5kcyBhZnRlciB0aGUgI2VuZGlmLyNlbHNlIGRpcmVjdGl2ZS4KLSAgdmlydHVhbCB2b2lkIFNvdXJjZVJhbmdlU2tpcHBlZChTb3VyY2VSYW5nZSBSYW5nZSkgewotICB9CisgIHZvaWQgU291cmNlUmFuZ2VTa2lwcGVkKFNvdXJjZVJhbmdlIFJhbmdlKSBvdmVycmlkZSB7fQogfTsKIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTMxOCwyNCArMzEwLDI0IEBACiAKICAgLy8gQVNUQ29uc3VtZXIgSW1wbGVtZW50YXRpb24KIAotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDb250ZXh0KSB7CisgIHZvaWQgSW5pdGlhbGl6ZShBU1RDb250ZXh0ICZDb250ZXh0KSBvdmVycmlkZSB7CiAgICAgSW5kZXhDdHguc2V0QVNUQ29udGV4dChDb250ZXh0KTsKICAgICBJbmRleEN0eC5zdGFydGVkVHJhbnNsYXRpb25Vbml0KCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgSGFuZGxlVHJhbnNsYXRpb25Vbml0KEFTVENvbnRleHQgJkN0eCkgeworICB2b2lkIEhhbmRsZVRyYW5zbGF0aW9uVW5pdChBU1RDb250ZXh0ICZDdHgpIG92ZXJyaWRlIHsKICAgICBpZiAoU0tDdHJsKQogICAgICAgU0tDdHJsLT5maW5pc2hlZCgpOwogICB9CiAKLSAgdmlydHVhbCBib29sIEhhbmRsZVRvcExldmVsRGVjbChEZWNsR3JvdXBSZWYgREcpIHsKKyAgYm9vbCBIYW5kbGVUb3BMZXZlbERlY2woRGVjbEdyb3VwUmVmIERHKSBvdmVycmlkZSB7CiAgICAgSW5kZXhDdHguaW5kZXhEZWNsR3JvdXBSZWYoREcpOwogICAgIHJldHVybiAhSW5kZXhDdHguc2hvdWxkQWJvcnQoKTsKICAgfQogCiAgIC8vLyBcYnJpZWYgSGFuZGxlIHRoZSBzcGVjaWZpZWQgdG9wLWxldmVsIGRlY2xhcmF0aW9uIHRoYXQgb2NjdXJyZWQgaW5zaWRlCiAgIC8vLyBhbmQgT2JqQyBjb250YWluZXIuCi0gIHZpcnR1YWwgdm9pZCBIYW5kbGVUb3BMZXZlbERlY2xJbk9iakNDb250YWluZXIoRGVjbEdyb3VwUmVmIEQpIHsKKyAgdm9pZCBIYW5kbGVUb3BMZXZlbERlY2xJbk9iakNDb250YWluZXIoRGVjbEdyb3VwUmVmIEQpIG92ZXJyaWRlIHsKICAgICAvLyBUaGV5IHdpbGwgYmUgaGFuZGxlZCBhZnRlciB0aGUgaW50ZXJmYWNlIGlzIHNlZW4gZmlyc3QuCiAgICAgSW5kZXhDdHguYWRkVFVEZWNsSW5PYmpDQ29udGFpbmVyKEQpOwogICB9CkBAIC0zNDMsOSArMzM1LDkgQEAKICAgLy8vIFxicmllZiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgQVNUIHJlYWRlciB3aGVuIGRlc2VyaWFsaXppbmcgdGhpbmdzLgogICAvLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yd2FyZHMgdG8gSGFuZGxlVG9wTGV2ZWxEZWNsIGJ1dCB3ZSBkb24ndAogICAvLy8gY2FyZSBhYm91dCB0aGVtIHdoZW4gaW5kZXhpbmcsIHNvIGhhdmUgYW4gZW1wdHkgZGVmaW5pdGlvbi4KLSAgdmlydHVhbCB2b2lkIEhhbmRsZUludGVyZXN0aW5nRGVjbChEZWNsR3JvdXBSZWYgRCkge30KKyAgdm9pZCBIYW5kbGVJbnRlcmVzdGluZ0RlY2woRGVjbEdyb3VwUmVmIEQpIG92ZXJyaWRlIHt9CiAKLSAgdmlydHVhbCB2b2lkIEhhbmRsZVRhZ0RlY2xEZWZpbml0aW9uKFRhZ0RlY2wgKkQpIHsKKyAgdm9pZCBIYW5kbGVUYWdEZWNsRGVmaW5pdGlvbihUYWdEZWNsICpEKSBvdmVycmlkZSB7CiAgICAgaWYgKCFJbmRleEN0eC5zaG91bGRJbmRleEltcGxpY2l0VGVtcGxhdGVJbnN0cygpKQogICAgICAgcmV0dXJuOwogCkBAIC0zNTMsMTQgKzM0NSwxNCBAQAogICAgICAgSW5kZXhDdHguaW5kZXhEZWNsKEQpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIEhhbmRsZUNYWEltcGxpY2l0RnVuY3Rpb25JbnN0YW50aWF0aW9uKEZ1bmN0aW9uRGVjbCAqRCkgeworICB2b2lkIEhhbmRsZUNYWEltcGxpY2l0RnVuY3Rpb25JbnN0YW50aWF0aW9uKEZ1bmN0aW9uRGVjbCAqRCkgb3ZlcnJpZGUgewogICAgIGlmICghSW5kZXhDdHguc2hvdWxkSW5kZXhJbXBsaWNpdFRlbXBsYXRlSW5zdHMoKSkKICAgICAgIHJldHVybjsKIAogICAgIEluZGV4Q3R4LmluZGV4RGVjbChEKTsKICAgfQogCi0gIHZpcnR1YWwgYm9vbCBzaG91bGRTa2lwRnVuY3Rpb25Cb2R5KERlY2wgKkQpIHsKKyAgYm9vbCBzaG91bGRTa2lwRnVuY3Rpb25Cb2R5KERlY2wgKkQpIG92ZXJyaWRlIHsKICAgICBpZiAoIVNLQ3RybCkgewogICAgICAgLy8gQWx3YXlzIHNraXAgYm9kaWVzLgogICAgICAgcmV0dXJuIHRydWU7CkBAIC0zNzUsNyArMzY3LDcgQEAKIAogICAgIEZpbGVJRCBGSUQ7CiAgICAgdW5zaWduZWQgT2Zmc2V0OwotICAgIGxsdm06OnRpZShGSUQsIE9mZnNldCkgPSBTTS5nZXREZWNvbXBvc2VkTG9jKExvYyk7CisgICAgc3RkOjp0aWUoRklELCBPZmZzZXQpID0gU00uZ2V0RGVjb21wb3NlZExvYyhMb2MpOwogICAgIC8vIERvbid0IHNraXAgYm9kaWVzIGZyb20gbWFpbiBmaWxlczsgdGhpcyBtYXkgYmUgcmV2aXNpdGVkLgogICAgIGlmIChTTS5nZXRNYWluRmlsZUlEKCkgPT0gRklEKQogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzk1LDggKzM4Nyw4IEBACiAgIFNtYWxsVmVjdG9yPFN0b3JlZERpYWdub3N0aWMsIDQ+IEVycm9yczsKIHB1YmxpYzoKIAotICB2aXJ0dWFsIHZvaWQgSGFuZGxlRGlhZ25vc3RpYyhEaWFnbm9zdGljc0VuZ2luZTo6TGV2ZWwgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pIHsKKyAgdm9pZCBIYW5kbGVEaWFnbm9zdGljKERpYWdub3N0aWNzRW5naW5lOjpMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWMgJkluZm8pIG92ZXJyaWRlIHsKICAgICBpZiAobGV2ZWwgPj0gRGlhZ25vc3RpY3NFbmdpbmU6OkVycm9yKQogICAgICAgRXJyb3JzLnB1c2hfYmFjayhTdG9yZWREaWFnbm9zdGljKGxldmVsLCBJbmZvKSk7CiAgIH0KQEAgLTQxMSw3ICs0MDMsNyBAQAogICBDWFRyYW5zbGF0aW9uVW5pdCBDWFRVOwogCiAgIFNlc3Npb25Ta2lwQm9keURhdGEgKlNLRGF0YTsKLSAgT3duaW5nUHRyPFRVU2tpcEJvZHlDb250cm9sPiBTS0N0cmw7CisgIHN0ZDo6dW5pcXVlX3B0cjxUVVNraXBCb2R5Q29udHJvbD4gU0tDdHJsOwogCiBwdWJsaWM6CiAgIEluZGV4aW5nRnJvbnRlbmRBY3Rpb24oQ1hDbGllbnREYXRhIGNsaWVudERhdGEsCkBAIC00MjIsOCArNDE0LDggQEAKICAgICA6IEluZGV4Q3R4KGNsaWVudERhdGEsIGluZGV4Q2FsbGJhY2tzLCBpbmRleE9wdGlvbnMsIGN4VFUpLAogICAgICAgQ1hUVShjeFRVKSwgU0tEYXRhKHNrRGF0YSkgeyB9CiAKLSAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIHsKKyAgQVNUQ29uc3VtZXIgKkNyZWF0ZUFTVENvbnN1bWVyKENvbXBpbGVySW5zdGFuY2UgJkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgb3ZlcnJpZGUgewogICAgIFByZXByb2Nlc3Nvck9wdGlvbnMgJlBQT3B0cyA9IENJLmdldFByZXByb2Nlc3Nvck9wdHMoKTsKIAogICAgIGlmICghUFBPcHRzLkltcGxpY2l0UENISW5jbHVkZS5lbXB0eSgpKSB7CkBAIC00NDYsMTcgKzQzOCwxNyBAQAogICAgIHJldHVybiBuZXcgSW5kZXhpbmdDb25zdW1lcihJbmRleEN0eCwgU0tDdHJsLmdldCgpKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBFbmRTb3VyY2VGaWxlQWN0aW9uKCkgeworICB2b2lkIEVuZFNvdXJjZUZpbGVBY3Rpb24oKSBvdmVycmlkZSB7CiAgICAgaW5kZXhEaWFnbm9zdGljcyhDWFRVLCBJbmRleEN0eCk7CiAgIH0KIAotICB2aXJ0dWFsIFRyYW5zbGF0aW9uVW5pdEtpbmQgZ2V0VHJhbnNsYXRpb25Vbml0S2luZCgpIHsKKyAgVHJhbnNsYXRpb25Vbml0S2luZCBnZXRUcmFuc2xhdGlvblVuaXRLaW5kKCkgb3ZlcnJpZGUgewogICAgIGlmIChJbmRleEN0eC5zaG91bGRJbmRleEltcGxpY2l0VGVtcGxhdGVJbnN0cygpKQogICAgICAgcmV0dXJuIFRVX0NvbXBsZXRlOwogICAgIGVsc2UKICAgICAgIHJldHVybiBUVV9QcmVmaXg7CiAgIH0KLSAgdmlydHVhbCBib29sIGhhc0NvZGVDb21wbGV0aW9uU3VwcG9ydCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgaGFzQ29kZUNvbXBsZXRpb25TdXBwb3J0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIH07CiAKIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCkBAIC00NjUsNyArNDU3LDcgQEAKIAogc3RydWN0IEluZGV4U2Vzc2lvbkRhdGEgewogICBDWEluZGV4IENJZHg7Ci0gIE93bmluZ1B0cjxTZXNzaW9uU2tpcEJvZHlEYXRhPiBTa2lwQm9keURhdGE7CisgIHN0ZDo6dW5pcXVlX3B0cjxTZXNzaW9uU2tpcEJvZHlEYXRhPiBTa2lwQm9keURhdGE7CiAKICAgZXhwbGljaXQgSW5kZXhTZXNzaW9uRGF0YShDWEluZGV4IGNJZHgpCiAgICAgOiBDSWR4KGNJZHgpLCBTa2lwQm9keURhdGEobmV3IFNlc3Npb25Ta2lwQm9keURhdGEpIHt9CkBAIC01MTQsMTYgKzUwNiwyMiBAQAogICB1bnNpZ25lZCBudW1fdW5zYXZlZF9maWxlcyA9IElUVUktPm51bV91bnNhdmVkX2ZpbGVzOwogICBDWFRyYW5zbGF0aW9uVW5pdCAqb3V0X1RVICA9IElUVUktPm91dF9UVTsKICAgdW5zaWduZWQgVFVfb3B0aW9ucyA9IElUVUktPlRVX29wdGlvbnM7Ci0gIElUVUktPnJlc3VsdCA9IDE7IC8vIGluaXQgYXMgZXJyb3IuCi0gIAorCisgIC8vIFNldCB1cCB0aGUgaW5pdGlhbCByZXR1cm4gdmFsdWUuCisgIElUVUktPnJlc3VsdCA9IENYRXJyb3JfRmFpbHVyZTsKKwogICBpZiAob3V0X1RVKQogICAgICpvdXRfVFUgPSAwOwotICBib29sIHJlcXVlc3RlZFRvR2V0VFUgPSAob3V0X1RVICE9IDApOyAKKyAgYm9vbCByZXF1ZXN0ZWRUb0dldFRVID0gKG91dF9UVSAhPSAwKTsKIAotICBpZiAoIWN4SWR4QWN0aW9uKQorICBpZiAoIWN4SWR4QWN0aW9uKSB7CisgICAgSVRVSS0+cmVzdWx0ID0gQ1hFcnJvcl9JbnZhbGlkQXJndW1lbnRzOwogICAgIHJldHVybjsKLSAgaWYgKCFjbGllbnRfaW5kZXhfY2FsbGJhY2tzIHx8IGluZGV4X2NhbGxiYWNrc19zaXplID09IDApCisgIH0KKyAgaWYgKCFjbGllbnRfaW5kZXhfY2FsbGJhY2tzIHx8IGluZGV4X2NhbGxiYWNrc19zaXplID09IDApIHsKKyAgICBJVFVJLT5yZXN1bHQgPSBDWEVycm9yX0ludmFsaWRBcmd1bWVudHM7CiAgICAgcmV0dXJuOworICB9CiAKICAgSW5kZXhlckNhbGxiYWNrcyBDQjsKICAgbWVtc2V0KCZDQiwgMCwgc2l6ZW9mKENCKSk7CkBAIC01NTMsOSArNTUxLDkgQEAKICAgbGx2bTo6Q3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwUmVnaXN0cmFyPERpYWdub3N0aWNzRW5naW5lLAogICAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0UmVsZWFzZVJlZkNsZWFudXA8RGlhZ25vc3RpY3NFbmdpbmU+ID4KICAgICBEaWFnQ2xlYW51cChEaWFncy5nZXRQdHIoKSk7Ci0gIAotICBPd25pbmdQdHI8c3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiA+Ci0gICAgQXJncyhuZXcgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+KCkpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+PiBBcmdzKAorICAgICAgbmV3IHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4oKSk7CiAKICAgLy8gUmVjb3ZlciByZXNvdXJjZXMgaWYgd2UgY3Jhc2ggYmVmb3JlIGV4aXRpbmcgdGhpcyBtZXRob2QuCiAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhcjxzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gPgpAQCAtNTg2LDcgKzU4NCw3IEBACiAgIGlmIChDSW52b2stPmdldEZyb250ZW5kT3B0cygpLklucHV0cy5lbXB0eSgpKQogICAgIHJldHVybjsKIAotICBPd25pbmdQdHI8TWVtQnVmZmVyT3duZXI+IEJ1Zk93bmVyKG5ldyBNZW1CdWZmZXJPd25lcigpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPE1lbUJ1ZmZlck93bmVyPiBCdWZPd25lcihuZXcgTWVtQnVmZmVyT3duZXIoKSk7CiAKICAgLy8gUmVjb3ZlciByZXNvdXJjZXMgaWYgd2UgY3Jhc2ggYmVmb3JlIGV4aXRpbmcgdGhpcyBtZXRob2QuCiAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhcjxNZW1CdWZmZXJPd25lcj4KQEAgLTYxMiw3ICs2MTAsOCBAQAogICBBU1RVbml0ICpVbml0ID0gQVNUVW5pdDo6Y3JlYXRlKENJbnZvay5nZXRQdHIoKSwgRGlhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZURpYWdub3N0aWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVXNlckZpbGVzQXJlVm9sYXRpbGU9Ki90cnVlKTsKLSAgT3duaW5nUHRyPENYVFVPd25lcj4gQ1hUVShuZXcgQ1hUVU93bmVyKE1ha2VDWFRyYW5zbGF0aW9uVW5pdChDWFhJZHgsIFVuaXQpKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWFRVT3duZXI+IENYVFUoCisgICAgICBuZXcgQ1hUVU93bmVyKE1ha2VDWFRyYW5zbGF0aW9uVW5pdChDWFhJZHgsIFVuaXQpKSk7CiAKICAgLy8gUmVjb3ZlciByZXNvdXJjZXMgaWYgd2UgY3Jhc2ggYmVmb3JlIGV4aXRpbmcgdGhpcyBtZXRob2QuCiAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhcjxDWFRVT3duZXI+CkBAIC02MjUsNyArNjI0LDcgQEAKICAgaWYgKFNraXBCb2RpZXMpCiAgICAgQ0ludm9rLT5nZXRGcm9udGVuZE9wdHMoKS5Ta2lwRnVuY3Rpb25Cb2RpZXMgPSB0cnVlOwogCi0gIE93bmluZ1B0cjxJbmRleGluZ0Zyb250ZW5kQWN0aW9uPiBJbmRleEFjdGlvbjsKKyAgc3RkOjp1bmlxdWVfcHRyPEluZGV4aW5nRnJvbnRlbmRBY3Rpb24+IEluZGV4QWN0aW9uOwogICBJbmRleEFjdGlvbi5yZXNldChuZXcgSW5kZXhpbmdGcm9udGVuZEFjdGlvbihjbGllbnRfZGF0YSwgQ0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X29wdGlvbnMsIENYVFUtPmdldFRVKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwQm9kaWVzID8gSWR4U2Vzc2lvbi0+U2tpcEJvZHlEYXRhLmdldCgpIDogMCkpOwpAQCAtNjcxLDEzICs2NzAsMTggQEAKICAgaWYgKERpYWdUcmFwLmhhc0Vycm9yT2NjdXJyZWQoKSAmJiBDWFhJZHgtPmdldERpc3BsYXlEaWFnbm9zdGljcygpKQogICAgIHByaW50RGlhZ3NUb1N0ZGVycihVbml0KTsKIAorICBpZiAoaXNBU1RSZWFkRXJyb3IoVW5pdCkpIHsKKyAgICBJVFVJLT5yZXN1bHQgPSBDWEVycm9yX0FTVFJlYWRFcnJvcjsKKyAgICByZXR1cm47CisgIH0KKwogICBpZiAoIVN1Y2Nlc3MpCiAgICAgcmV0dXJuOwogCiAgIGlmIChvdXRfVFUpCiAgICAgKm91dF9UVSA9IENYVFUtPnRha2VUVSgpOwogCi0gIElUVUktPnJlc3VsdCA9IDA7IC8vIHN1Y2Nlc3MuCisgIElUVUktPnJlc3VsdCA9IENYRXJyb3JfU3VjY2VzczsKIH0KIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTcwNiw3ICs3MTAsNyBAQAogICAvLyBGSVhNRTogT25seSBkZXNlcmlhbGl6ZSBpbmNsdXNpb24gZGlyZWN0aXZlcy4KIAogICBQcmVwcm9jZXNzaW5nUmVjb3JkOjppdGVyYXRvciBJLCBFOwotICBsbHZtOjp0aWUoSSwgRSkgPSBVbml0LmdldExvY2FsUHJlcHJvY2Vzc2luZ0VudGl0aWVzKCk7CisgIHN0ZDo6dGllKEksIEUpID0gVW5pdC5nZXRMb2NhbFByZXByb2Nlc3NpbmdFbnRpdGllcygpOwogCiAgIGJvb2wgaXNNb2R1bGVGaWxlID0gVW5pdC5pc01vZHVsZUZpbGUoKTsKICAgZm9yICg7IEkgIT0gRTsgKytJKSB7CkBAIC03NTQsMTIgKzc1OCwyMCBAQAogICBJbmRleGVyQ2FsbGJhY2tzICpjbGllbnRfaW5kZXhfY2FsbGJhY2tzID0gSVRVSS0+aW5kZXhfY2FsbGJhY2tzOwogICB1bnNpZ25lZCBpbmRleF9jYWxsYmFja3Nfc2l6ZSA9IElUVUktPmluZGV4X2NhbGxiYWNrc19zaXplOwogICB1bnNpZ25lZCBpbmRleF9vcHRpb25zID0gSVRVSS0+aW5kZXhfb3B0aW9uczsKLSAgSVRVSS0+cmVzdWx0ID0gMTsgLy8gaW5pdCBhcyBlcnJvci4KIAotICBpZiAoIVRVKQorICAvLyBTZXQgdXAgdGhlIGluaXRpYWwgcmV0dXJuIHZhbHVlLgorICBJVFVJLT5yZXN1bHQgPSBDWEVycm9yX0ZhaWx1cmU7CisKKyAgLy8gQ2hlY2sgYXJndW1lbnRzLgorICBpZiAoaXNOb3RVc2FibGVUVShUVSkpIHsKKyAgICBMT0dfQkFEX1RVKFRVKTsKKyAgICBJVFVJLT5yZXN1bHQgPSBDWEVycm9yX0ludmFsaWRBcmd1bWVudHM7CiAgICAgcmV0dXJuOwotICBpZiAoIWNsaWVudF9pbmRleF9jYWxsYmFja3MgfHwgaW5kZXhfY2FsbGJhY2tzX3NpemUgPT0gMCkKKyAgfQorICBpZiAoIWNsaWVudF9pbmRleF9jYWxsYmFja3MgfHwgaW5kZXhfY2FsbGJhY2tzX3NpemUgPT0gMCkgeworICAgIElUVUktPnJlc3VsdCA9IENYRXJyb3JfSW52YWxpZEFyZ3VtZW50czsKICAgICByZXR1cm47CisgIH0KIAogICBDSW5kZXhlciAqQ1hYSWR4ID0gVFUtPkNJZHg7CiAgIGlmIChDWFhJZHgtPmlzT3B0RW5hYmxlZChDWEdsb2JhbE9wdF9UaHJlYWRCYWNrZ3JvdW5kUHJpb3JpdHlGb3JJbmRleGluZykpCkBAIC03NzEsMTQgKzc4MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW5kZXhfY2FsbGJhY2tzX3NpemUgOiBzaXplb2YoQ0IpOwogICBtZW1jcHkoJkNCLCBjbGllbnRfaW5kZXhfY2FsbGJhY2tzLCBDbGllbnRDQlNpemUpOwogCi0gIE93bmluZ1B0cjxJbmRleGluZ0NvbnRleHQ+IEluZGV4Q3R4OworICBzdGQ6OnVuaXF1ZV9wdHI8SW5kZXhpbmdDb250ZXh0PiBJbmRleEN0eDsKICAgSW5kZXhDdHgucmVzZXQobmV3IEluZGV4aW5nQ29udGV4dChjbGllbnRfZGF0YSwgQ0IsIGluZGV4X29wdGlvbnMsIFRVKSk7CiAKICAgLy8gUmVjb3ZlciByZXNvdXJjZXMgaWYgd2UgY3Jhc2ggYmVmb3JlIGV4aXRpbmcgdGhpcyBtZXRob2QuCiAgIGxsdm06OkNyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhcjxJbmRleGluZ0NvbnRleHQ+CiAgICAgSW5kZXhDdHhDbGVhbnVwKEluZGV4Q3R4LmdldCgpKTsKIAotICBPd25pbmdQdHI8SW5kZXhpbmdDb25zdW1lcj4gSW5kZXhDb25zdW1lcjsKKyAgc3RkOjp1bmlxdWVfcHRyPEluZGV4aW5nQ29uc3VtZXI+IEluZGV4Q29uc3VtZXI7CiAgIEluZGV4Q29uc3VtZXIucmVzZXQobmV3IEluZGV4aW5nQ29uc3VtZXIoKkluZGV4Q3R4LCAwKSk7CiAKICAgLy8gUmVjb3ZlciByZXNvdXJjZXMgaWYgd2UgY3Jhc2ggYmVmb3JlIGV4aXRpbmcgdGhpcyBtZXRob2QuCkBAIC04MDcsNyArODE5LDcgQEAKICAgaW5kZXhUcmFuc2xhdGlvblVuaXQoKlVuaXQsICpJbmRleEN0eCk7CiAgIGluZGV4RGlhZ25vc3RpY3MoVFUsICpJbmRleEN0eCk7CiAKLSAgSVRVSS0+cmVzdWx0ID0gMDsKKyAgSVRVSS0+cmVzdWx0ID0gQ1hFcnJvcl9TdWNjZXNzOwogfQogCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtOTc5LDcgKzk5MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhfY2FsbGJhY2tzX3NpemUsIGluZGV4X29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2ZpbGVuYW1lLCBjb21tYW5kX2xpbmVfYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY29tbWFuZF9saW5lX2FyZ3MsIHVuc2F2ZWRfZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Vuc2F2ZWRfZmlsZXMsIG91dF9UVSwgVFVfb3B0aW9ucywgMCB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV91bnNhdmVkX2ZpbGVzLCBvdXRfVFUsIFRVX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hFcnJvcl9GYWlsdXJlIH07CiAKICAgaWYgKGdldGVudigiTElCQ0xBTkdfTk9USFJFQURTIikpIHsKICAgICBjbGFuZ19pbmRleFNvdXJjZUZpbGVfSW1wbCgmSVRVSSk7CmRpZmYgLS1naXQgYS90b29scy9saWJjbGFuZy9JbmRleGluZ0NvbnRleHQuY3BwIGIvdG9vbHMvbGliY2xhbmcvSW5kZXhpbmdDb250ZXh0LmNwcAppbmRleCA0MWVkNmVhLi4xNjM3ODQzIDEwMDY0NAotLS0gYS90b29scy9saWJjbGFuZy9JbmRleGluZ0NvbnRleHQuY3BwCisrKyBiL3Rvb2xzL2xpYmNsYW5nL0luZGV4aW5nQ29udGV4dC5jcHAKQEAgLTY3LDkgKzY3LDcgQEAKICAgaWYgKCFELT5oYXNBdHRycygpKQogICAgIHJldHVybjsKIAotICBmb3IgKEF0dHJWZWM6OmNvbnN0X2l0ZXJhdG9yIEF0dHJJID0gRC0+YXR0cl9iZWdpbigpLCBBdHRyRSA9IEQtPmF0dHJfZW5kKCk7Ci0gICAgICAgICBBdHRySSAhPSBBdHRyRTsgKytBdHRySSkgewotICAgIGNvbnN0IEF0dHIgKkEgPSAqQXR0ckk7CisgIGZvciAoY29uc3QgYXV0byAqQSA6IEQtPmF0dHJzKCkpIHsKICAgICBDWEN1cnNvciBDID0gTWFrZUNYQ3Vyc29yKEEsIEQsIElkeEN0eC5DWFRVKTsKICAgICBDWElkeExvYyBMb2MgPSAgSWR4Q3R4LmdldEluZGV4TG9jKEEtPmdldExvY2F0aW9uKCkpOwogICAgIHN3aXRjaCAoQy5raW5kKSB7CkBAIC0xMjUsOSArMTIzLDcgQEAKIEluZGV4aW5nQ29udGV4dDo6Q1hYQmFzZXNMaXN0SW5mbzo6Q1hYQmFzZXNMaXN0SW5mbyhjb25zdCBDWFhSZWNvcmREZWNsICpELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleGluZ0NvbnRleHQgJklkeEN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyYXRjaEFsbG9jICZTQSkgewotICBmb3IgKENYWFJlY29yZERlY2w6OmJhc2VfY2xhc3NfY29uc3RfaXRlcmF0b3IKLSAgICAgICAgIEkgPSBELT5iYXNlc19iZWdpbigpLCBFID0gRC0+YmFzZXNfZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgY29uc3QgQ1hYQmFzZVNwZWNpZmllciAmQmFzZSA9ICpJOworICBmb3IgKGNvbnN0IGF1dG8gJkJhc2UgOiBELT5iYXNlcygpKSB7CiAgICAgQmFzZUVudGl0aWVzLnB1c2hfYmFjayhFbnRpdHlJbmZvKCkpOwogICAgIGNvbnN0IE5hbWVkRGVjbCAqQmFzZUQgPSAwOwogICAgIFF1YWxUeXBlIFQgPSBCYXNlLmdldFR5cGUoKTsKQEAgLTI2OCw3ICsyNjQsNiBAQAogICBNb2R1bGUgKk1vZCA9IEltcG9ydEQtPmdldEltcG9ydGVkTW9kdWxlKCk7CiAgIGlmICghTW9kKQogICAgIHJldHVybjsKLSAgc3RkOjpzdHJpbmcgTW9kdWxlTmFtZSA9IE1vZC0+Z2V0RnVsbE1vZHVsZU5hbWUoKTsKIAogICBDWElkeEltcG9ydGVkQVNURmlsZUluZm8gSW5mbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENYRmlsZT4oCkBAIC04MDMsOSArNzk4LDkgQEAKICAgY29uc3QgRmlsZUVudHJ5ICpGRSA9IFNNLmdldEZpbGVFbnRyeUZvcklEKEZJRCk7CiAgIGlmICghRkUpCiAgICAgcmV0dXJuIHRydWU7Ci0gIFJlZkZpbGVPY2N1cmVuY2UgUmVmT2NjdXIoRkUsIEQpOwotICBzdGQ6OnBhaXI8bGx2bTo6RGVuc2VTZXQ8UmVmRmlsZU9jY3VyZW5jZT46Oml0ZXJhdG9yLCBib29sPgotICByZXMgPSBSZWZGaWxlT2NjdXJlbmNlcy5pbnNlcnQoUmVmT2NjdXIpOworICBSZWZGaWxlT2NjdXJyZW5jZSBSZWZPY2N1cihGRSwgRCk7CisgIHN0ZDo6cGFpcjxsbHZtOjpEZW5zZVNldDxSZWZGaWxlT2NjdXJyZW5jZT46Oml0ZXJhdG9yLCBib29sPgorICByZXMgPSBSZWZGaWxlT2NjdXJyZW5jZXMuaW5zZXJ0KFJlZk9jY3VyKTsKICAgaWYgKCFyZXMuc2Vjb25kKQogICAgIHJldHVybiB0cnVlOyAvLyBhbHJlYWR5IGluIG1hcC4KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbGliY2xhbmcvSW5kZXhpbmdDb250ZXh0LmggYi90b29scy9saWJjbGFuZy9JbmRleGluZ0NvbnRleHQuaAppbmRleCAzNDM3ZDU1Li44OGQ2MjNmIDEwMDY0NAotLS0gYS90b29scy9saWJjbGFuZy9JbmRleGluZ0NvbnRleHQuaAorKysgYi90b29scy9saWJjbGFuZy9JbmRleGluZ0NvbnRleHQuaApAQCAtMjg2LDggKzI4Niw4IEBACiAgIENvbnRhaW5lck1hcFR5IENvbnRhaW5lck1hcDsKICAgRW50aXR5TWFwVHkgRW50aXR5TWFwOwogCi0gIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IEZpbGVFbnRyeSAqLCBjb25zdCBEZWNsICo+IFJlZkZpbGVPY2N1cmVuY2U7Ci0gIGxsdm06OkRlbnNlU2V0PFJlZkZpbGVPY2N1cmVuY2U+IFJlZkZpbGVPY2N1cmVuY2VzOworICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBGaWxlRW50cnkgKiwgY29uc3QgRGVjbCAqPiBSZWZGaWxlT2NjdXJyZW5jZTsKKyAgbGx2bTo6RGVuc2VTZXQ8UmVmRmlsZU9jY3VycmVuY2U+IFJlZkZpbGVPY2N1cnJlbmNlczsKIAogICBzdGQ6OmRlcXVlPERlY2xHcm91cFJlZj4gVFVEZWNsc0luT2JqQ0NvbnRhaW5lcjsKICAgCkBAIC0zMzUsNyArMzM1LDcgQEAKICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4T3B0aW9ucywgQ1hUcmFuc2xhdGlvblVuaXQgY3hUVSkKICAgICA6IEN0eCgwKSwgQ2xpZW50RGF0YShjbGllbnREYXRhKSwgQ0IoaW5kZXhDYWxsYmFja3MpLAogICAgICAgSW5kZXhPcHRpb25zKGluZGV4T3B0aW9ucyksIENYVFUoY3hUVSksCi0gICAgICBTdHJTY3JhdGNoKC8qc2l6ZT0qLzEwMjQpLCBTdHJBZGFwdGVyQ291bnQoMCkgeyB9CisgICAgICBTdHJTY3JhdGNoKCksIFN0ckFkYXB0ZXJDb3VudCgwKSB7IH0KIAogICBBU1RDb250ZXh0ICZnZXRBU1RDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gKkN0eDsgfQogCmRpZmYgLS1naXQgYS90b29scy9saWJjbGFuZy9NYWtlZmlsZSBiL3Rvb2xzL2xpYmNsYW5nL01ha2VmaWxlCmluZGV4IDQzZWNiZDEuLjQxZDUxNjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmNsYW5nL01ha2VmaWxlCisrKyBiL3Rvb2xzL2xpYmNsYW5nL01ha2VmaWxlCkBAIC0xNywxNCArMTcsMTggQEAKIAogaW5jbHVkZSAkKENMQU5HX0xFVkVMKS8uLi8uLi9NYWtlZmlsZS5jb25maWcKIExJTktfQ09NUE9ORU5UUyA6PSAkKFRBUkdFVFNfVE9fQlVJTEQpIGFzbXBhcnNlciBiaXRyZWFkZXIgc3VwcG9ydCBtYyBvcHRpb24KLVVTRURMSUJTID0gY2xhbmdJbmRleC5hIGNsYW5nRnJvbnRlbmQuYSBjbGFuZ0RyaXZlci5hIFwKK1VTRURMSUJTID0gY2xhbmdJbmRleC5hIGNsYW5nQVJDTWlncmF0ZS5hIFwKKwkgICBjbGFuZ1Jld3JpdGVGcm9udGVuZC5hIFwKKwkgICBjbGFuZ0Zvcm1hdC5hIFwKIAkgICBjbGFuZ1Rvb2xpbmcuYSBcCisJICAgY2xhbmdGcm9udGVuZC5hIGNsYW5nRHJpdmVyLmEgXAogCSAgIGNsYW5nU2VyaWFsaXphdGlvbi5hIFwKIAkgICBjbGFuZ1BhcnNlLmEgY2xhbmdTZW1hLmEgXAotCSAgIGNsYW5nQVJDTWlncmF0ZS5hIGNsYW5nUmV3cml0ZUZyb250ZW5kLmEgY2xhbmdSZXdyaXRlQ29yZS5hIFwKKwkgICBjbGFuZ1N0YXRpY0FuYWx5emVyQ2hlY2tlcnMuYSBjbGFuZ1N0YXRpY0FuYWx5emVyQ29yZS5hIFwKKwkgICBjbGFuZ1Jld3JpdGVDb3JlLmEgXAogCSAgIGNsYW5nQW5hbHlzaXMuYSBjbGFuZ0VkaXQuYSBcCisJICAgY2xhbmdBU1RNYXRjaGVycy5hIFwKIAkgICBjbGFuZ0FTVC5hIGNsYW5nTGV4LmEgY2xhbmdCYXNpYy5hIFwKLQkgICBjbGFuZ0Zvcm1hdC5hCiAKIGluY2x1ZGUgJChDTEFOR19MRVZFTCkvTWFrZWZpbGUKIApAQCAtNDYsMTYgKzUwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1XbCwkKExMVk1fU1VCTUlUX1ZFUlNJT04pLiQoTExWTV9TVUJNSVRfU1VCVkVSU0lPTikKICAgICBlbmRpZgogCi0gICAgIyBFeHRyYSBvcHRpb25zIHRvIG92ZXJyaWRlIGxpYnRvb2wgZGVmYXVsdHMuCi0gICAgTExWTUxpYnNPcHRpb25zICs9IC1XbCwtZGVhZF9zdHJpcAotCi0gICAgIyBNYWMgT1MgWCAxMC40IGFuZCBlYXJsaWVyIHRvb2xzIGRvIG5vdCBhbGxvdyBhIHNlY29uZCAtaW5zdGFsbF9uYW1lIG9uIGNvbW1hbmQgbGluZQotICAgIERBUldJTl9WRVJTIDo9ICQoc2hlbGwgZWNobyAkKFRBUkdFVF9UUklQTEUpIHwgc2VkICdzLy4qZGFyd2luXChbMC05XSpcKS4qL1wxLycpCi0gICAgaWZuZXEgKCQoREFSV0lOX1ZFUlMpLDgpCi0gICAgICAgTExWTUxpYnNPcHRpb25zICs9IC1XbCwtaW5zdGFsbF9uYW1lIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLVdsLCJAcnBhdGgvbGliJChMSUJSQVJZTkFNRSkkKFNITElCRVhUKSIKLSAgICBlbmRpZgotCiAgICAgIyBJZiB3ZSdyZSBkb2luZyBhbiBBcHBsZS1zdHlsZSBidWlsZCwgYWRkIHRoZSBMVE8gb2JqZWN0IHBhdGguCiAgICAgaWZlcSAoJChSQ19YQlMpLFlFUykKICAgICAgICBUZW1wRmlsZSAgICAgICAgOj0gJChzaGVsbCBta2RpciAtcCAke09CSlJPT1R9L2RTWU1zIDsgbWt0ZW1wICR7T0JKUk9PVH0vZFNZTXMvY2xhbmctbHRvLlhYWFhYWCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYmNsYW5nL1JlY3Vyc2l2ZUFTVFZpc2l0b3IuaCBiL3Rvb2xzL2xpYmNsYW5nL1JlY3Vyc2l2ZUFTVFZpc2l0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkNWFjYi4uMDAwMDAwMAotLS0gYS90b29scy9saWJjbGFuZy9SZWN1cnNpdmVBU1RWaXNpdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzg0ICswLDAgQEAKLS8vPT09LS0tIFJlY3Vyc2l2ZUFTVFZpc2l0b3IuaCAtIFJlY3Vyc2l2ZSBBU1QgVmlzaXRvciAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCi0vLwotLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQotLy8KLS8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQotLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgotLy8KLS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCi0vLwotLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBSZWN1cnNpdmVBU1RWaXNpdG9yIGludGVyZmFjZSwgd2hpY2ggcmVjdXJzaXZlbHkKLS8vICB0cmF2ZXJzZXMgdGhlIGVudGlyZSBBU1QuCi0vLwotLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLSNpZm5kZWYgTExWTV9DTEFOR19MSUJDTEFOR19SRUNVUlNJVkVBU1RWSVNJVE9SX0gKLSNkZWZpbmUgTExWTV9DTEFOR19MSUJDTEFOR19SRUNVUlNJVkVBU1RWSVNJVE9SX0gKLQotI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsLmgiCi0jaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xDWFguaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvRGVjbEZyaWVuZC5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsT2JqQy5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsT3Blbk1QLmgiCi0jaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xUZW1wbGF0ZS5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9FeHByLmgiCi0jaW5jbHVkZSAiY2xhbmcvQVNUL0V4cHJDWFguaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvRXhwck9iakMuaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvTmVzdGVkTmFtZVNwZWNpZmllci5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10LmgiCi0jaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXRDWFguaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE9iakMuaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvU3RtdE9wZW5NUC5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9UZW1wbGF0ZUJhc2UuaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvVGVtcGxhdGVOYW1lLmgiCi0jaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGUuaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZUxvYy5oIgotCi0vLyBUaGUgZm9sbG93aW5nIHRocmVlIG1hY3JvcyBhcmUgdXNlZCBmb3IgbWV0YSBwcm9ncmFtbWluZy4gIFRoZSBjb2RlCi0vLyB1c2luZyB0aGVtIGlzIHJlc3BvbnNpYmxlIGZvciBkZWZpbmluZyBtYWNybyBPUEVSQVRPUigpLgotCi0vLyBBbGwgdW5hcnkgb3BlcmF0b3JzLgotI2RlZmluZSBVTkFSWU9QX0xJU1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBPUEVSQVRPUihQb3N0SW5jKSAgIE9QRVJBVE9SKFBvc3REZWMpICAgICAgICAgXAotICBPUEVSQVRPUihQcmVJbmMpICAgIE9QRVJBVE9SKFByZURlYykgICAgICAgICAgXAotICBPUEVSQVRPUihBZGRyT2YpICAgIE9QRVJBVE9SKERlcmVmKSAgICAgICAgICAgXAotICBPUEVSQVRPUihQbHVzKSAgICAgIE9QRVJBVE9SKE1pbnVzKSAgICAgICAgICAgXAotICBPUEVSQVRPUihOb3QpICAgICAgIE9QRVJBVE9SKExOb3QpICAgICAgICAgICAgXAotICBPUEVSQVRPUihSZWFsKSAgICAgIE9QRVJBVE9SKEltYWcpICAgICAgICAgICAgXAotICBPUEVSQVRPUihFeHRlbnNpb24pCi0KLS8vIEFsbCBiaW5hcnkgb3BlcmF0b3JzIChleGNsdWRpbmcgY29tcG91bmQgYXNzaWduIG9wZXJhdG9ycykuCi0jZGVmaW5lIEJJTk9QX0xJU1QoKSBcCi0gIE9QRVJBVE9SKFB0ck1lbUQpICAgICAgICAgICAgICBPUEVSQVRPUihQdHJNZW1JKSAgICBcCi0gIE9QRVJBVE9SKE11bCkgICBPUEVSQVRPUihEaXYpICBPUEVSQVRPUihSZW0pICAgICAgICBcCi0gIE9QRVJBVE9SKEFkZCkgICBPUEVSQVRPUihTdWIpICBPUEVSQVRPUihTaGwpICAgICAgICBcCi0gIE9QRVJBVE9SKFNocikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIE9QRVJBVE9SKExUKSAgICBPUEVSQVRPUihHVCkgICBPUEVSQVRPUihMRSkgICAgICAgICBcCi0gIE9QRVJBVE9SKEdFKSAgICBPUEVSQVRPUihFUSkgICBPUEVSQVRPUihORSkgICAgICAgICBcCi0gIE9QRVJBVE9SKEFuZCkgICBPUEVSQVRPUihYb3IpICBPUEVSQVRPUihPcikgICAgICAgICBcCi0gIE9QRVJBVE9SKExBbmQpICBPUEVSQVRPUihMT3IpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIE9QRVJBVE9SKEFzc2lnbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIE9QRVJBVE9SKENvbW1hKQotCi0vLyBBbGwgY29tcG91bmQgYXNzaWduIG9wZXJhdG9ycy4KLSNkZWZpbmUgQ0FPX0xJU1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgT1BFUkFUT1IoTXVsKSBPUEVSQVRPUihEaXYpIE9QRVJBVE9SKFJlbSkgT1BFUkFUT1IoQWRkKSBPUEVSQVRPUihTdWIpIFwKLSAgT1BFUkFUT1IoU2hsKSBPUEVSQVRPUihTaHIpIE9QRVJBVE9SKEFuZCkgT1BFUkFUT1IoT3IpICBPUEVSQVRPUihYb3IpCi0KLW5hbWVzcGFjZSBjbGFuZyB7Ci1uYW1lc3BhY2UgY3hpbmRleCB7Ci0KLS8vIEEgaGVscGVyIG1hY3JvIHRvIGltcGxlbWVudCBzaG9ydC1jaXJjdWl0aW5nIHdoZW4gcmVjdXJzaW5nLiAgSXQKLS8vIGludm9rZXMgQ0FMTF9FWFBSLCB3aGljaCBtdXN0IGJlIGEgbWV0aG9kIGNhbGwsIG9uIHRoZSBkZXJpdmVkCi0vLyBvYmplY3QgKHMudC4gYSB1c2VyIG9mIFJlY3Vyc2l2ZUFTVFZpc2l0b3IgY2FuIG92ZXJyaWRlIHRoZSBtZXRob2QKLS8vIGluIENBTExfRVhQUikuCi0jZGVmaW5lIFRSWV9UTyhDQUxMX0VYUFIpIFwKLSAgZG8geyBpZiAoIWdldERlcml2ZWQoKS5DQUxMX0VYUFIpIHJldHVybiBmYWxzZTsgfSB3aGlsZSAoMCkKLQotLy8vIFxicmllZiBBIGNsYXNzIHRoYXQgZG9lcyBwcmVvcmRlciBkZXB0aC1maXJzdCB0cmF2ZXJzYWwgb24gdGhlCi0vLy8gZW50aXJlIENsYW5nIEFTVCBhbmQgdmlzaXRzIGVhY2ggbm9kZS4KLS8vLwotLy8vIFRoaXMgY2xhc3MgcGVyZm9ybXMgdGhyZWUgZGlzdGluY3QgdGFza3M6Ci0vLy8gICAxLiB0cmF2ZXJzZSB0aGUgQVNUIChpLmUuIGdvIHRvIGVhY2ggbm9kZSk7Ci0vLy8gICAyLiBhdCBhIGdpdmVuIG5vZGUsIHdhbGsgdXAgdGhlIGNsYXNzIGhpZXJhcmNoeSwgc3RhcnRpbmcgZnJvbQotLy8vICAgICAgdGhlIG5vZGUncyBkeW5hbWljIHR5cGUsIHVudGlsIHRoZSB0b3AtbW9zdCBjbGFzcyAoZS5nLiBTdG10LAotLy8vICAgICAgRGVjbCwgb3IgVHlwZSkgaXMgcmVhY2hlZC4KLS8vLyAgIDMuIGdpdmVuIGEgKG5vZGUsIGNsYXNzKSBjb21iaW5hdGlvbiwgd2hlcmUgJ2NsYXNzJyBpcyBzb21lIGJhc2UKLS8vLyAgICAgIGNsYXNzIG9mIHRoZSBkeW5hbWljIHR5cGUgb2YgJ25vZGUnLCBjYWxsIGEgdXNlci1vdmVycmlkYWJsZQotLy8vICAgICAgZnVuY3Rpb24gdG8gYWN0dWFsbHkgdmlzaXQgdGhlIG5vZGUuCi0vLy8KLS8vLyBUaGVzZSB0YXNrcyBhcmUgZG9uZSBieSB0aHJlZSBncm91cHMgb2YgbWV0aG9kcywgcmVzcGVjdGl2ZWx5OgotLy8vICAgMS4gVHJhdmVyc2VEZWNsKERlY2wgKngpIGRvZXMgdGFzayAjMS4gIEl0IGlzIHRoZSBlbnRyeSBwb2ludAotLy8vICAgICAgZm9yIHRyYXZlcnNpbmcgYW4gQVNUIHJvb3RlZCBhdCB4LiAgVGhpcyBtZXRob2Qgc2ltcGx5Ci0vLy8gICAgICBkaXNwYXRjaGVzIChpLmUuIGZvcndhcmRzKSB0byBUcmF2ZXJzZUZvbyhGb28gKngpIHdoZXJlIEZvbwotLy8vICAgICAgaXMgdGhlIGR5bmFtaWMgdHlwZSBvZiAqeCwgd2hpY2ggY2FsbHMgV2Fsa1VwRnJvbUZvbyh4KSBhbmQKLS8vLyAgICAgIHRoZW4gcmVjdXJzaXZlbHkgdmlzaXRzIHRoZSBjaGlsZCBub2RlcyBvZiB4LgotLy8vICAgICAgVHJhdmVyc2VTdG10KFN0bXQgKngpIGFuZCBUcmF2ZXJzZVR5cGUoUXVhbFR5cGUgeCkgd29yawotLy8vICAgICAgc2ltaWxhcmx5LgotLy8vICAgMi4gV2Fsa1VwRnJvbUZvbyhGb28gKngpIGRvZXMgdGFzayAjMi4gIEl0IGRvZXMgbm90IHRyeSB0byB2aXNpdAotLy8vICAgICAgYW55IGNoaWxkIG5vZGUgb2YgeC4gIEluc3RlYWQsIGl0IGZpcnN0IGNhbGxzIFdhbGtVcEZyb21CYXIoeCkKLS8vLyAgICAgIHdoZXJlIEJhciBpcyB0aGUgZGlyZWN0IHBhcmVudCBjbGFzcyBvZiBGb28gKHVubGVzcyBGb28gaGFzCi0vLy8gICAgICBubyBwYXJlbnQpLCBhbmQgdGhlbiBjYWxscyBWaXNpdEZvbyh4KSAoc2VlIHRoZSBuZXh0IGxpc3QgaXRlbSkuCi0vLy8gICAzLiBWaXNpdEZvbyhGb28gKngpIGRvZXMgdGFzayAjMy4KLS8vLwotLy8vIFRoZXNlIHRocmVlIG1ldGhvZCBncm91cHMgYXJlIHRpZXJlZCAoVHJhdmVyc2UqID4gV2Fsa1VwRnJvbSogPgotLy8vIFZpc2l0KikuICBBIG1ldGhvZCAoZS5nLiBUcmF2ZXJzZSopIG1heSBjYWxsIG1ldGhvZHMgZnJvbSB0aGUgc2FtZQotLy8vIHRpZXIgKGUuZy4gb3RoZXIgVHJhdmVyc2UqKSBvciBvbmUgdGllciBsb3dlciAoZS5nLiBXYWxrVXBGcm9tKikuCi0vLy8gSXQgbWF5IG5vdCBjYWxsIG1ldGhvZHMgZnJvbSBhIGhpZ2hlciB0aWVyLgotLy8vCi0vLy8gTm90ZSB0aGF0IHNpbmNlIFdhbGtVcEZyb21Gb28oKSBjYWxscyBXYWxrVXBGcm9tQmFyKCkgKHdoZXJlIEJhcgotLy8vIGlzIEZvbydzIHN1cGVyIGNsYXNzKSBiZWZvcmUgY2FsbGluZyBWaXNpdEZvbygpLCB0aGUgcmVzdWx0IGlzCi0vLy8gdGhhdCB0aGUgVmlzaXQqKCkgbWV0aG9kcyBmb3IgYSBnaXZlbiBub2RlIGFyZSBjYWxsZWQgaW4gdGhlCi0vLy8gdG9wLWRvd24gb3JkZXIgKGUuZy4gZm9yIGEgbm9kZSBvZiB0eXBlIE5hbWVkRGVjbCwgdGhlIG9yZGVyIHdpbGwKLS8vLyBiZSBWaXNpdERlY2woKSwgVmlzaXROYW1lZERlY2woKSwgYW5kIHRoZW4gVmlzaXROYW1lc3BhY2VEZWNsKCkpLgotLy8vCi0vLy8gVGhpcyBzY2hlbWUgZ3VhcmFudGVlcyB0aGF0IGFsbCBWaXNpdCooKSBjYWxscyBmb3IgdGhlIHNhbWUgQVNUCi0vLy8gbm9kZSBhcmUgZ3JvdXBlZCB0b2dldGhlci4gIEluIG90aGVyIHdvcmRzLCBWaXNpdCooKSBtZXRob2RzIGZvcgotLy8vIGRpZmZlcmVudCBub2RlcyBhcmUgbmV2ZXIgaW50ZXJsZWF2ZWQuCi0vLy8KLS8vLyBTdG10cyBhcmUgdHJhdmVyc2VkIGludGVybmFsbHkgdXNpbmcgYSBkYXRhIHF1ZXVlIHRvIGF2b2lkIGEgc3RhY2sgb3ZlcmZsb3cKLS8vLyB3aXRoIGh1Z2VseSBuZXN0ZWQgQVNUcy4KLS8vLwotLy8vIENsaWVudHMgb2YgdGhpcyB2aXNpdG9yIHNob3VsZCBzdWJjbGFzcyB0aGUgdmlzaXRvciAocHJvdmlkaW5nCi0vLy8gdGhlbXNlbHZlcyBhcyB0aGUgdGVtcGxhdGUgYXJndW1lbnQsIHVzaW5nIHRoZSBjdXJpb3VzbHkgcmVjdXJyaW5nCi0vLy8gdGVtcGxhdGUgcGF0dGVybikgYW5kIG92ZXJyaWRlIGFueSBvZiB0aGUgVHJhdmVyc2UqLCBXYWxrVXBGcm9tKiwKLS8vLyBhbmQgVmlzaXQqIG1ldGhvZHMgZm9yIGRlY2xhcmF0aW9ucywgdHlwZXMsIHN0YXRlbWVudHMsCi0vLy8gZXhwcmVzc2lvbnMsIG9yIG90aGVyIEFTVCBub2RlcyB3aGVyZSB0aGUgdmlzaXRvciBzaG91bGQgY3VzdG9taXplCi0vLy8gYmVoYXZpb3IuICBNb3N0IHVzZXJzIG9ubHkgbmVlZCB0byBvdmVycmlkZSBWaXNpdCouICBBZHZhbmNlZAotLy8vIHVzZXJzIG1heSBvdmVycmlkZSBUcmF2ZXJzZSogYW5kIFdhbGtVcEZyb20qIHRvIGltcGxlbWVudCBjdXN0b20KLS8vLyB0cmF2ZXJzYWwgc3RyYXRlZ2llcy4gIFJldHVybmluZyBmYWxzZSBmcm9tIG9uZSBvZiB0aGVzZSBvdmVycmlkZGVuCi0vLy8gZnVuY3Rpb25zIHdpbGwgYWJvcnQgdGhlIGVudGlyZSB0cmF2ZXJzYWwuCi0vLy8KLS8vLyBCeSBkZWZhdWx0LCB0aGlzIHZpc2l0b3IgdHJpZXMgdG8gdmlzaXQgZXZlcnkgcGFydCBvZiB0aGUgZXhwbGljaXQKLS8vLyBzb3VyY2UgY29kZSBleGFjdGx5IG9uY2UuICBUaGUgZGVmYXVsdCBwb2xpY3kgdG93YXJkcyB0ZW1wbGF0ZXMKLS8vLyBpcyB0byBkZXNjZW5kIGludG8gdGhlICdwYXR0ZXJuJyBjbGFzcyBvciBmdW5jdGlvbiBib2R5LCBub3QgYW55Ci0vLy8gZXhwbGljaXQgb3IgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMuICBFeHBsaWNpdCBzcGVjaWFsaXphdGlvbnMKLS8vLyBhcmUgc3RpbGwgdmlzaXRlZCwgYW5kIHRoZSBwYXR0ZXJucyBvZiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9ucwotLy8vIGFyZSB2aXNpdGVkIHNlcGFyYXRlbHkuICBUaGlzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIGJ5Ci0vLy8gb3ZlcnJpZGluZyBzaG91bGRWaXNpdFRlbXBsYXRlSW5zdGFudGlhdGlvbnMoKSBpbiB0aGUgZGVyaXZlZCBjbGFzcwotLy8vIHRvIHJldHVybiB0cnVlLCBpbiB3aGljaCBjYXNlIGFsbCBrbm93biBpbXBsaWNpdCBhbmQgZXhwbGljaXQKLS8vLyBpbnN0YW50aWF0aW9ucyB3aWxsIGJlIHZpc2l0ZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgcGF0dGVybgotLy8vIGZyb20gd2hpY2ggdGhleSB3ZXJlIHByb2R1Y2VkLgotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWNsYXNzIFJlY3Vyc2l2ZUFTVFZpc2l0b3IgewotcHVibGljOgotICAvLy8gXGJyaWVmIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgZGVyaXZlZCBjbGFzcy4KLSAgRGVyaXZlZCAmZ2V0RGVyaXZlZCgpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxEZXJpdmVkKj4odGhpcyk7IH0KLQotICAvLy8gXGJyaWVmIFJldHVybiB3aGV0aGVyIHRoaXMgdmlzaXRvciBzaG91bGQgcmVjdXJzZSBpbnRvCi0gIC8vLyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucy4KLSAgYm9vbCBzaG91bGRWaXNpdFRlbXBsYXRlSW5zdGFudGlhdGlvbnMoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gIC8vLyBcYnJpZWYgUmV0dXJuIHdoZXRoZXIgdGhpcyB2aXNpdG9yIHNob3VsZCByZWN1cnNlIGludG8gdGhlIHR5cGVzIG9mCi0gIC8vLyBUeXBlTG9jcy4KLSAgYm9vbCBzaG91bGRXYWxrVHlwZXNPZlR5cGVMb2NzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSBzdGF0ZW1lbnQgb3IgZXhwcmVzc2lvbiwgYnkKLSAgLy8vIGRpc3BhdGNoaW5nIHRvIFRyYXZlcnNlKigpIGJhc2VkIG9uIHRoZSBhcmd1bWVudCdzIGR5bmFtaWMgdHlwZS4KLSAgLy8vCi0gIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZQotICAvLy8gb3RoZXJ3aXNlIChpbmNsdWRpbmcgd2hlbiB0aGUgYXJndW1lbnQgaXMgTlVMTCkuCi0gIGJvb2wgVHJhdmVyc2VTdG10KFN0bXQgKlMpOwotCi0gIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSB0eXBlLCBieSBkaXNwYXRjaGluZyB0bwotICAvLy8gVHJhdmVyc2UqVHlwZSgpIGJhc2VkIG9uIHRoZSBhcmd1bWVudCdzIGdldFR5cGVDbGFzcygpIHByb3BlcnR5LgotICAvLy8KLSAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlCi0gIC8vLyBvdGhlcndpc2UgKGluY2x1ZGluZyB3aGVuIHRoZSBhcmd1bWVudCBpcyBhIE51bGwgdHlwZSkuCi0gIGJvb2wgVHJhdmVyc2VUeXBlKFF1YWxUeXBlIFQpOwotCi0gIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSB0eXBlIHdpdGggbG9jYXRpb24sIGJ5IGRpc3BhdGNoaW5nIHRvCi0gIC8vLyBUcmF2ZXJzZSpUeXBlTG9jKCkgYmFzZWQgb24gdGhlIGFyZ3VtZW50IHR5cGUncyBnZXRUeXBlQ2xhc3MoKSBwcm9wZXJ0eS4KLSAgLy8vCi0gIC8vLyBccmV0dXJucyBmYWxzZSBpZiB0aGUgdmlzaXRhdGlvbiB3YXMgdGVybWluYXRlZCBlYXJseSwgdHJ1ZQotICAvLy8gb3RoZXJ3aXNlIChpbmNsdWRpbmcgd2hlbiB0aGUgYXJndW1lbnQgaXMgYSBOdWxsIHR5cGUgbG9jYXRpb24pLgotICBib29sIFRyYXZlcnNlVHlwZUxvYyhUeXBlTG9jIFRMKTsKLQotICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGEgZGVjbGFyYXRpb24sIGJ5IGRpc3BhdGNoaW5nIHRvCi0gIC8vLyBUcmF2ZXJzZSpEZWNsKCkgYmFzZWQgb24gdGhlIGFyZ3VtZW50J3MgZHluYW1pYyB0eXBlLgotICAvLy8KLSAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlCi0gIC8vLyBvdGhlcndpc2UgKGluY2x1ZGluZyB3aGVuIHRoZSBhcmd1bWVudCBpcyBOVUxMKS4KLSAgYm9vbCBUcmF2ZXJzZURlY2woRGVjbCAqRCk7Ci0KLSAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIEMrKyBuZXN0ZWQtbmFtZS1zcGVjaWZpZXIuCi0gIC8vLwotICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUgb3RoZXJ3aXNlLgotICBib29sIFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllcihOZXN0ZWROYW1lU3BlY2lmaWVyICpOTlMpOwotCi0gIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSBDKysgbmVzdGVkLW5hbWUtc3BlY2lmaWVyIHdpdGggbG9jYXRpb24KLSAgLy8vIGluZm9ybWF0aW9uLgotICAvLy8KLSAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlIG90aGVyd2lzZS4KLSAgYm9vbCBUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoTmVzdGVkTmFtZVNwZWNpZmllckxvYyBOTlMpOwotCi0gIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSBuYW1lIHdpdGggaXRzIGxvY2F0aW9uIGluZm9ybWF0aW9uLgotICAvLy8KLSAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlIG90aGVyd2lzZS4KLSAgYm9vbCBUcmF2ZXJzZURlY2xhcmF0aW9uTmFtZUluZm8oRGVjbGFyYXRpb25OYW1lSW5mbyBOYW1lSW5mbyk7Ci0KLSAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIHRlbXBsYXRlIG5hbWUgYW5kIGRpc3BhdGNoIHRvIHRoZQotICAvLy8gYXBwcm9wcmlhdGUgbWV0aG9kLgotICAvLy8KLSAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlIG90aGVyd2lzZS4KLSAgYm9vbCBUcmF2ZXJzZVRlbXBsYXRlTmFtZShUZW1wbGF0ZU5hbWUgVGVtcGxhdGUpOwotCi0gIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSB0ZW1wbGF0ZSBhcmd1bWVudCBhbmQgZGlzcGF0Y2ggdG8gdGhlCi0gIC8vLyBhcHByb3ByaWF0ZSBtZXRob2QgZm9yIHRoZSBhcmd1bWVudCB0eXBlLgotICAvLy8KLSAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlIG90aGVyd2lzZS4KLSAgLy8gRklYTUU6IG1pZ3JhdGUgY2FsbGVycyB0byBUZW1wbGF0ZUFyZ3VtZW50TG9jIGluc3RlYWQuCi0gIGJvb2wgVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50KGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZyk7Ci0KLSAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIHRlbXBsYXRlIGFyZ3VtZW50IGxvY2F0aW9uIGFuZCBkaXNwYXRjaCB0byB0aGUKLSAgLy8vIGFwcHJvcHJpYXRlIG1ldGhvZCBmb3IgdGhlIGFyZ3VtZW50IHR5cGUuCi0gIC8vLwotICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUgb3RoZXJ3aXNlLgotICBib29sIFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvYyhjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TG9jICZBcmdMb2MpOwotCi0gIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgdmlzaXQgYSBzZXQgb2YgdGVtcGxhdGUgYXJndW1lbnRzLgotICAvLy8gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzLCBidXQgaXQncyBub3QgZXhwZWN0ZWQgdGhhdAotICAvLy8gd2lsbCBiZSBuZWVkZWQgLS0gdGhpcyB2aXNpdG9yIGFsd2F5cyBkaXNwYXRjaGVzIHRvIGFub3RoZXIuCi0gIC8vLwotICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUgb3RoZXJ3aXNlLgotICAvLyBGSVhNRTogdGFrZSBhIFRlbXBsYXRlQXJndW1lbnRMb2MqIChvciBUZW1wbGF0ZUFyZ3VtZW50TGlzdEluZm8pIGluc3RlYWQuCi0gIGJvb2wgVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50cyhjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQXJncyk7Ci0KLSAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCBhIGNvbnN0cnVjdG9yIGluaXRpYWxpemVyLiAgVGhpcwotICAvLy8gYXV0b21hdGljYWxseSBkaXNwYXRjaGVzIHRvIGFub3RoZXIgdmlzaXRvciBmb3IgdGhlIGluaXRpYWxpemVyCi0gIC8vLyBleHByZXNzaW9uLCBidXQgbm90IGZvciB0aGUgbmFtZSBvZiB0aGUgaW5pdGlhbGl6ZXIsIHNvIG1heQotICAvLy8gYmUgb3ZlcnJpZGRlbiBmb3IgY2xpZW50cyB0aGF0IG5lZWQgYWNjZXNzIHRvIHRoZSBuYW1lLgotICAvLy8KLSAgLy8vIFxyZXR1cm5zIGZhbHNlIGlmIHRoZSB2aXNpdGF0aW9uIHdhcyB0ZXJtaW5hdGVkIGVhcmx5LCB0cnVlIG90aGVyd2lzZS4KLSAgYm9vbCBUcmF2ZXJzZUNvbnN0cnVjdG9ySW5pdGlhbGl6ZXIoQ1hYQ3RvckluaXRpYWxpemVyICpJbml0KTsKLQotICAvLy8gXGJyaWVmIFJlY3Vyc2l2ZWx5IHZpc2l0IGEgbGFtYmRhIGNhcHR1cmUuCi0gIC8vLwotICAvLy8gXHJldHVybnMgZmFsc2UgaWYgdGhlIHZpc2l0YXRpb24gd2FzIHRlcm1pbmF0ZWQgZWFybHksIHRydWUgb3RoZXJ3aXNlLgotICBib29sIFRyYXZlcnNlTGFtYmRhQ2FwdHVyZShMYW1iZGFFeHByOjpDYXB0dXJlIEMpOwotICAKLSAgLy8gLS0tLSBNZXRob2RzIG9uIFN0bXRzIC0tLS0KLQotICAvLyBEZWNsYXJlIFRyYXZlcnNlKigpIGZvciBhbGwgY29uY3JldGUgU3RtdCBjbGFzc2VzLgotI2RlZmluZSBBQlNUUkFDVF9TVE1UKFNUTVQpCi0jZGVmaW5lIFNUTVQoQ0xBU1MsIFBBUkVOVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBib29sIFRyYXZlcnNlIyNDTEFTUyhDTEFTUyAqUyk7Ci0jaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXROb2Rlcy5pbmMiCi0gIC8vIFRoZSBhYm92ZSBoZWFkZXIgI3VuZGVmcyBBQlNUUkFDVF9TVE1UIGFuZCBTVE1UIHVwb24gZXhpdC4KLQotICAvLyBEZWZpbmUgV2Fsa1VwRnJvbSooKSBhbmQgZW1wdHkgVmlzaXQqKCkgZm9yIGFsbCBTdG10IGNsYXNzZXMuCi0gIGJvb2wgV2Fsa1VwRnJvbVN0bXQoU3RtdCAqUykgeyByZXR1cm4gZ2V0RGVyaXZlZCgpLlZpc2l0U3RtdChTKTsgfQotICBib29sIFZpc2l0U3RtdChTdG10ICpTKSB7IHJldHVybiB0cnVlOyB9Ci0jZGVmaW5lIFNUTVQoQ0xBU1MsIFBBUkVOVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBib29sIFdhbGtVcEZyb20jI0NMQVNTKENMQVNTICpTKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBUUllfVE8oV2Fsa1VwRnJvbSMjUEFSRU5UKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVFJZX1RPKFZpc2l0IyNDTEFTUyhTKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJvb2wgVmlzaXQjI0NMQVNTKENMQVNTICpTKSB7IHJldHVybiB0cnVlOyB9Ci0jaW5jbHVkZSAiY2xhbmcvQVNUL1N0bXROb2Rlcy5pbmMiCi0KLSAgLy8gRGVmaW5lIFRyYXZlcnNlKigpLCBXYWxrVXBGcm9tKigpLCBhbmQgVmlzaXQqKCkgZm9yIHVuYXJ5Ci0gIC8vIG9wZXJhdG9yIG1ldGhvZHMuICBVbmFyeSBvcGVyYXRvcnMgYXJlIG5vdCBjbGFzc2VzIGluIHRoZW1zZWx2ZXMKLSAgLy8gKHRoZXkncmUgYWxsIG9wY29kZXMgaW4gVW5hcnlPcGVyYXRvcikgYnV0IGRvIGhhdmUgdmlzaXRvcnMuCi0jZGVmaW5lIE9QRVJBVE9SKE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYm9vbCBUcmF2ZXJzZVVuYXJ5IyNOQU1FKFVuYXJ5T3BlcmF0b3IgKlMpIHsgICAgICAgICAgICAgICAgICBcCi0gICAgVFJZX1RPKFdhbGtVcEZyb21VbmFyeSMjTkFNRShTKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFN0bXRRdWV1ZUFjdGlvbiBTdG10UXVldWUoKnRoaXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTdG10UXVldWUucXVldWUoUy0+Z2V0U3ViRXhwcigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYm9vbCBXYWxrVXBGcm9tVW5hcnkjI05BTUUoVW5hcnlPcGVyYXRvciAqUykgeyAgICAgICAgICAgICAgICBcCi0gICAgVFJZX1RPKFdhbGtVcEZyb21VbmFyeU9wZXJhdG9yKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFRSWV9UTyhWaXNpdFVuYXJ5IyNOQU1FKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBib29sIFZpc2l0VW5hcnkjI05BTUUoVW5hcnlPcGVyYXRvciAqUykgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIFVOQVJZT1BfTElTVCgpCi0jdW5kZWYgT1BFUkFUT1IKLQotICAvLyBEZWZpbmUgVHJhdmVyc2UqKCksIFdhbGtVcEZyb20qKCksIGFuZCBWaXNpdCooKSBmb3IgYmluYXJ5Ci0gIC8vIG9wZXJhdG9yIG1ldGhvZHMuICBCaW5hcnkgb3BlcmF0b3JzIGFyZSBub3QgY2xhc3NlcyBpbiB0aGVtc2VsdmVzCi0gIC8vICh0aGV5J3JlIGFsbCBvcGNvZGVzIGluIEJpbmFyeU9wZXJhdG9yKSBidXQgZG8gaGF2ZSB2aXNpdG9ycy4KLSNkZWZpbmUgR0VORVJBTF9CSU5PUF9GQUxMQkFDSyhOQU1FLCBCSU5PUF9UWVBFKSAgICAgICAgICAgICAgICBcCi0gIGJvb2wgVHJhdmVyc2VCaW4jI05BTUUoQklOT1BfVFlQRSAqUykgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFRSWV9UTyhXYWxrVXBGcm9tQmluIyNOQU1FKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTdG10UXVldWVBY3Rpb24gU3RtdFF1ZXVlKCp0aGlzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgU3RtdFF1ZXVlLnF1ZXVlKFMtPmdldExIUygpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFN0bXRRdWV1ZS5xdWV1ZShTLT5nZXRSSFMoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBib29sIFdhbGtVcEZyb21CaW4jI05BTUUoQklOT1BfVFlQRSAqUykgeyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBUUllfVE8oV2Fsa1VwRnJvbSMjQklOT1BfVFlQRShTKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVFJZX1RPKFZpc2l0QmluIyNOQU1FKFMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJvb2wgVmlzaXRCaW4jI05BTUUoQklOT1BfVFlQRSAqUykgeyByZXR1cm4gdHJ1ZTsgfQotCi0jZGVmaW5lIE9QRVJBVE9SKE5BTUUpIEdFTkVSQUxfQklOT1BfRkFMTEJBQ0soTkFNRSwgQmluYXJ5T3BlcmF0b3IpCi0gIEJJTk9QX0xJU1QoKQotI3VuZGVmIE9QRVJBVE9SCi0KLSAgLy8gRGVmaW5lIFRyYXZlcnNlKigpLCBXYWxrVXBGcm9tKigpLCBhbmQgVmlzaXQqKCkgZm9yIGNvbXBvdW5kCi0gIC8vIGFzc2lnbm1lbnQgbWV0aG9kcy4gIENvbXBvdW5kIGFzc2lnbm1lbnQgb3BlcmF0b3JzIGFyZSBub3QKLSAgLy8gY2xhc3NlcyBpbiB0aGVtc2VsdmVzICh0aGV5J3JlIGFsbCBvcGNvZGVzIGluCi0gIC8vIENvbXBvdW5kQXNzaWduT3BlcmF0b3IpIGJ1dCBkbyBoYXZlIHZpc2l0b3JzLgotI2RlZmluZSBPUEVSQVRPUihOQU1FKSBcCi0gIEdFTkVSQUxfQklOT1BfRkFMTEJBQ0soTkFNRSMjQXNzaWduLCBDb21wb3VuZEFzc2lnbk9wZXJhdG9yKQotCi0gIENBT19MSVNUKCkKLSN1bmRlZiBPUEVSQVRPUgotI3VuZGVmIEdFTkVSQUxfQklOT1BfRkFMTEJBQ0sKLQotICAvLyAtLS0tIE1ldGhvZHMgb24gVHlwZXMgLS0tLQotICAvLyBGSVhNRTogcmV2YW1wIHRvIHRha2UgVHlwZUxvYydzIHJhdGhlciB0aGFuIFR5cGVzLgotCi0gIC8vIERlY2xhcmUgVHJhdmVyc2UqKCkgZm9yIGFsbCBjb25jcmV0ZSBUeXBlIGNsYXNzZXMuCi0jZGVmaW5lIEFCU1RSQUNUX1RZUEUoQ0xBU1MsIEJBU0UpCi0jZGVmaW5lIFRZUEUoQ0xBU1MsIEJBU0UpIFwKLSAgYm9vbCBUcmF2ZXJzZSMjQ0xBU1MjI1R5cGUoQ0xBU1MjI1R5cGUgKlQpOwotI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTm9kZXMuZGVmIgotICAvLyBUaGUgYWJvdmUgaGVhZGVyICN1bmRlZnMgQUJTVFJBQ1RfVFlQRSBhbmQgVFlQRSB1cG9uIGV4aXQuCi0KLSAgLy8gRGVmaW5lIFdhbGtVcEZyb20qKCkgYW5kIGVtcHR5IFZpc2l0KigpIGZvciBhbGwgVHlwZSBjbGFzc2VzLgotICBib29sIFdhbGtVcEZyb21UeXBlKFR5cGUgKlQpIHsgcmV0dXJuIGdldERlcml2ZWQoKS5WaXNpdFR5cGUoVCk7IH0KLSAgYm9vbCBWaXNpdFR5cGUoVHlwZSAqVCkgeyByZXR1cm4gdHJ1ZTsgfQotI2RlZmluZSBUWVBFKENMQVNTLCBCQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYm9vbCBXYWxrVXBGcm9tIyNDTEFTUyMjVHlwZShDTEFTUyMjVHlwZSAqVCkgeyAgICAgICAgICAgICAgICBcCi0gICAgVFJZX1RPKFdhbGtVcEZyb20jI0JBU0UoVCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFRSWV9UTyhWaXNpdCMjQ0xBU1MjI1R5cGUoVCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBib29sIFZpc2l0IyNDTEFTUyMjVHlwZShDTEFTUyMjVHlwZSAqVCkgeyByZXR1cm4gdHJ1ZTsgfQotI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTm9kZXMuZGVmIgotCi0gIC8vIC0tLS0gTWV0aG9kcyBvbiBUeXBlTG9jcyAtLS0tCi0gIC8vIEZJWE1FOiB0aGlzIGN1cnJlbnRseSBqdXN0IGNhbGxzIHRoZSBtYXRjaGluZyBUeXBlIG1ldGhvZHMKLQotICAvLyBEZWNsYXJlIFRyYXZlcnNlKigpIGZvciBhbGwgY29uY3JldGUgVHlwZSBjbGFzc2VzLgotI2RlZmluZSBBQlNUUkFDVF9UWVBFTE9DKENMQVNTLCBCQVNFKQotI2RlZmluZSBUWVBFTE9DKENMQVNTLCBCQVNFKSBcCi0gIGJvb2wgVHJhdmVyc2UjI0NMQVNTIyNUeXBlTG9jKENMQVNTIyNUeXBlTG9jIFRMKTsKLSNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZUxvY05vZGVzLmRlZiIKLSAgLy8gVGhlIGFib3ZlIGhlYWRlciAjdW5kZWZzIEFCU1RSQUNUX1RZUEVMT0MgYW5kIFRZUEVMT0MgdXBvbiBleGl0LgotCi0gIC8vIERlZmluZSBXYWxrVXBGcm9tKigpIGFuZCBlbXB0eSBWaXNpdCooKSBmb3IgYWxsIFR5cGVMb2MgY2xhc3Nlcy4KLSAgYm9vbCBXYWxrVXBGcm9tVHlwZUxvYyhUeXBlTG9jIFRMKSB7IHJldHVybiBnZXREZXJpdmVkKCkuVmlzaXRUeXBlTG9jKFRMKTsgfQotICBib29sIFZpc2l0VHlwZUxvYyhUeXBlTG9jIFRMKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgLy8gUXVhbGlmaWVkVHlwZUxvYyBhbmQgVW5xdWFsVHlwZUxvYyBhcmUgbm90IGRlY2xhcmVkIGluCi0gIC8vIFR5cGVOb2Rlcy5kZWYgYW5kIHRodXMgbmVlZCB0byBiZSBoYW5kbGVkIHNwZWNpYWxseS4KLSAgYm9vbCBXYWxrVXBGcm9tUXVhbGlmaWVkVHlwZUxvYyhRdWFsaWZpZWRUeXBlTG9jIFRMKSB7Ci0gICAgcmV0dXJuIGdldERlcml2ZWQoKS5WaXNpdFVucXVhbFR5cGVMb2MoVEwuZ2V0VW5xdWFsaWZpZWRMb2MoKSk7Ci0gIH0KLSAgYm9vbCBWaXNpdFF1YWxpZmllZFR5cGVMb2MoUXVhbGlmaWVkVHlwZUxvYyBUTCkgeyByZXR1cm4gdHJ1ZTsgfQotICBib29sIFdhbGtVcEZyb21VbnF1YWxUeXBlTG9jKFVucXVhbFR5cGVMb2MgVEwpIHsKLSAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlZpc2l0VW5xdWFsVHlwZUxvYyhUTC5nZXRVbnF1YWxpZmllZExvYygpKTsKLSAgfQotICBib29sIFZpc2l0VW5xdWFsVHlwZUxvYyhVbnF1YWxUeXBlTG9jIFRMKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgLy8gTm90ZSB0aGF0IEJBU0UgaW5jbHVkZXMgdHJhaWxpbmcgJ1R5cGUnIHdoaWNoIENMQVNTIGRvZXNuJ3QuCi0jZGVmaW5lIFRZUEUoQ0xBU1MsIEJBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBib29sIFdhbGtVcEZyb20jI0NMQVNTIyNUeXBlTG9jKENMQVNTIyNUeXBlTG9jIFRMKSB7ICAgICAgICAgIFwKLSAgICBUUllfVE8oV2Fsa1VwRnJvbSMjQkFTRSMjTG9jKFRMKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVFJZX1RPKFZpc2l0IyNDTEFTUyMjVHlwZUxvYyhUTCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJvb2wgVmlzaXQjI0NMQVNTIyNUeXBlTG9jKENMQVNTIyNUeXBlTG9jIFRMKSB7IHJldHVybiB0cnVlOyB9Ci0jaW5jbHVkZSAiY2xhbmcvQVNUL1R5cGVOb2Rlcy5kZWYiCi0KLSAgLy8gLS0tLSBNZXRob2RzIG9uIERlY2xzIC0tLS0KLQotICAvLyBEZWNsYXJlIFRyYXZlcnNlKigpIGZvciBhbGwgY29uY3JldGUgRGVjbCBjbGFzc2VzLgotI2RlZmluZSBBQlNUUkFDVF9ERUNMKERFQ0wpCi0jZGVmaW5lIERFQ0woQ0xBU1MsIEJBU0UpIFwKLSAgYm9vbCBUcmF2ZXJzZSMjQ0xBU1MjI0RlY2woQ0xBU1MjI0RlY2wgKkQpOwotI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsTm9kZXMuaW5jIgotICAvLyBUaGUgYWJvdmUgaGVhZGVyICN1bmRlZnMgQUJTVFJBQ1RfREVDTCBhbmQgREVDTCB1cG9uIGV4aXQuCi0KLSAgLy8gRGVmaW5lIFdhbGtVcEZyb20qKCkgYW5kIGVtcHR5IFZpc2l0KigpIGZvciBhbGwgRGVjbCBjbGFzc2VzLgotICBib29sIFdhbGtVcEZyb21EZWNsKERlY2wgKkQpIHsgcmV0dXJuIGdldERlcml2ZWQoKS5WaXNpdERlY2woRCk7IH0KLSAgYm9vbCBWaXNpdERlY2woRGVjbCAqRCkgeyByZXR1cm4gdHJ1ZTsgfQotI2RlZmluZSBERUNMKENMQVNTLCBCQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYm9vbCBXYWxrVXBGcm9tIyNDTEFTUyMjRGVjbChDTEFTUyMjRGVjbCAqRCkgeyAgICAgICAgICAgICAgICBcCi0gICAgVFJZX1RPKFdhbGtVcEZyb20jI0JBU0UoRCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFRSWV9UTyhWaXNpdCMjQ0xBU1MjI0RlY2woRCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBib29sIFZpc2l0IyNDTEFTUyMjRGVjbChDTEFTUyMjRGVjbCAqRCkgeyByZXR1cm4gdHJ1ZTsgfQotI2luY2x1ZGUgImNsYW5nL0FTVC9EZWNsTm9kZXMuaW5jIgotCi1wcml2YXRlOgotICAvLyBUaGVzZSBhcmUgaGVscGVyIG1ldGhvZHMgdXNlZCBieSBtb3JlIHRoYW4gb25lIFRyYXZlcnNlKiBtZXRob2QuCi0gIGJvb2wgVHJhdmVyc2VUZW1wbGF0ZVBhcmFtZXRlckxpc3RIZWxwZXIoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUUEwpOwotICBib29sIFRyYXZlcnNlQ2xhc3NJbnN0YW50aWF0aW9ucyhDbGFzc1RlbXBsYXRlRGVjbCAqRCk7Ci0gIGJvb2wgVHJhdmVyc2VWYXJpYWJsZUluc3RhbnRpYXRpb25zKFZhclRlbXBsYXRlRGVjbCAqRCk7Ci0gIGJvb2wgVHJhdmVyc2VGdW5jdGlvbkluc3RhbnRpYXRpb25zKEZ1bmN0aW9uVGVtcGxhdGVEZWNsICpEKSA7Ci0gIGJvb2wgVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcihjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TG9jICpUQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb3VudCk7Ci0gIGJvb2wgVHJhdmVyc2VBcnJheVR5cGVMb2NIZWxwZXIoQXJyYXlUeXBlTG9jIFRMKTsKLSAgYm9vbCBUcmF2ZXJzZVJlY29yZEhlbHBlcihSZWNvcmREZWNsICpEKTsKLSAgYm9vbCBUcmF2ZXJzZUNYWFJlY29yZEhlbHBlcihDWFhSZWNvcmREZWNsICpEKTsKLSAgYm9vbCBUcmF2ZXJzZURlY2xhcmF0b3JIZWxwZXIoRGVjbGFyYXRvckRlY2wgKkQpOwotICBib29sIFRyYXZlcnNlRGVjbENvbnRleHRIZWxwZXIoRGVjbENvbnRleHQgKkRDKTsKLSAgYm9vbCBUcmF2ZXJzZUZ1bmN0aW9uSGVscGVyKEZ1bmN0aW9uRGVjbCAqRCk7Ci0gIGJvb2wgVHJhdmVyc2VWYXJIZWxwZXIoVmFyRGVjbCAqRCk7Ci0gIGJvb2wgVHJhdmVyc2VPTVBDbGF1c2UoT01QQ2xhdXNlICpDKTsKLSNkZWZpbmUgT1BFTk1QX0NMQVVTRShOYW1lLCBDbGFzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYm9vbCBWaXNpdCMjQ2xhc3MoQ2xhc3MgKkMpOwotI2luY2x1ZGUgImNsYW5nL0Jhc2ljL09wZW5NUEtpbmRzLmRlZiIKLSAgLy8vIFxicmllZiBQcm9jZXNzIGNsYXVzZXMgd2l0aCBsaXN0IG9mIHZhcmlhYmxlcy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHZvaWQgVmlzaXRPTVBDbGF1c2VMaXN0KFQgKk5vZGUpOwotCi0gIHR5cGVkZWYgU21hbGxWZWN0b3I8U3RtdCAqLCAxNj4gU3RtdHNUeTsKLSAgdHlwZWRlZiBTbWFsbFZlY3RvcjxTdG10c1R5ICosIDQ+IFF1ZXVlc1R5OwotICAKLSAgUXVldWVzVHkgUXVldWVzOwotCi0gIGNsYXNzIE5ld1F1ZXVlUkFJSSB7Ci0gICAgUmVjdXJzaXZlQVNUVmlzaXRvciAmUkFWOwotICBwdWJsaWM6Ci0gICAgTmV3UXVldWVSQUlJKFN0bXRzVHkgJnF1ZXVlLCBSZWN1cnNpdmVBU1RWaXNpdG9yICZSQVYpIDogUkFWKFJBVikgewotICAgICAgUkFWLlF1ZXVlcy5wdXNoX2JhY2soJnF1ZXVlKTsKLSAgICB9Ci0gICAgfk5ld1F1ZXVlUkFJSSgpIHsKLSAgICAgIFJBVi5RdWV1ZXMucG9wX2JhY2soKTsKLSAgICB9Ci0gIH07Ci0KLSAgU3RtdHNUeSAmZ2V0Q3VycmVudFF1ZXVlKCkgewotICAgIGFzc2VydCghUXVldWVzLmVtcHR5KCkgJiYgImJhc2UgVHJhdmVyc2VTdG10IHdhcyBuZXZlciBjYWxsZWQ/Iik7Ci0gICAgcmV0dXJuICpRdWV1ZXMuYmFjaygpOwotICB9Ci0KLXB1YmxpYzoKLSAgY2xhc3MgU3RtdFF1ZXVlQWN0aW9uIHsKLSAgICBTdG10c1R5ICZDdXJyUXVldWU7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBTdG10UXVldWVBY3Rpb24oUmVjdXJzaXZlQVNUVmlzaXRvciAmUkFWKQotICAgICAgOiBDdXJyUXVldWUoUkFWLmdldEN1cnJlbnRRdWV1ZSgpKSB7IH0KLQotICAgIHZvaWQgcXVldWUoU3RtdCAqUykgewotICAgICAgQ3VyclF1ZXVlLnB1c2hfYmFjayhTKTsKLSAgICB9Ci0gIH07Ci19OwotCi0jZGVmaW5lIERJU1BBVENIKE5BTUUsIENMQVNTLCBWQVIpIFwKLSAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZSMjTkFNRShzdGF0aWNfY2FzdDxDTEFTUyo+KFZBUikpCi0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlU3RtdChTdG10ICpTKSB7Ci0gIGlmICghUykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBTdG10c1R5IFF1ZXVlLCBTdG10c1RvRW5xdWV1OwotICBRdWV1ZS5wdXNoX2JhY2soUyk7Ci0gIE5ld1F1ZXVlUkFJSSBOUShTdG10c1RvRW5xdWV1LCAqdGhpcyk7Ci0KLSAgd2hpbGUgKCFRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgUyA9IFF1ZXVlLnBvcF9iYWNrX3ZhbCgpOwotICAgIGlmICghUykKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgU3RtdHNUb0VucXVldS5jbGVhcigpOwotCi0jZGVmaW5lIERJU1BBVENIX1NUTVQoTkFNRSwgQ0xBU1MsIFZBUikgXAotICAgIFRSWV9UTyhUcmF2ZXJzZSMjTkFNRShzdGF0aWNfY2FzdDxDTEFTUyo+KFZBUikpKTsgYnJlYWsKLQotICAgIC8vIElmIHdlIGhhdmUgYSBiaW5hcnkgZXhwciwgZGlzcGF0Y2ggdG8gdGhlIHN1YmNvZGUgb2YgdGhlIGJpbm9wLiAgQSBzbWFydAotICAgIC8vIG9wdGltaXplciAoZS5nLiBMTFZNKSB3aWxsIGZvbGQgdGhpcyBjb21wYXJpc29uIGludG8gdGhlIHN3aXRjaCBzdG10Ci0gICAgLy8gYmVsb3cuCi0gICAgaWYgKEJpbmFyeU9wZXJhdG9yICpCaW5PcCA9IGR5bl9jYXN0PEJpbmFyeU9wZXJhdG9yPihTKSkgewotICAgICAgc3dpdGNoIChCaW5PcC0+Z2V0T3Bjb2RlKCkpIHsKLSNkZWZpbmUgT1BFUkFUT1IoTkFNRSkgXAotICAgICAgY2FzZSBCT18jI05BTUU6IERJU1BBVENIX1NUTVQoQmluIyNOQU1FLCBCaW5hcnlPcGVyYXRvciwgUyk7Ci0gIAotICAgICAgQklOT1BfTElTVCgpCi0jdW5kZWYgT1BFUkFUT1IKLSN1bmRlZiBCSU5PUF9MSVNUCi0gIAotI2RlZmluZSBPUEVSQVRPUihOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhc2UgQk9fIyNOQU1FIyNBc3NpZ246ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIERJU1BBVENIX1NUTVQoQmluIyNOQU1FIyNBc3NpZ24sIENvbXBvdW5kQXNzaWduT3BlcmF0b3IsIFMpOwotICAKLSAgICAgIENBT19MSVNUKCkKLSN1bmRlZiBPUEVSQVRPUgotI3VuZGVmIENBT19MSVNUCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChVbmFyeU9wZXJhdG9yICpVbk9wID0gZHluX2Nhc3Q8VW5hcnlPcGVyYXRvcj4oUykpIHsKLSAgICAgIHN3aXRjaCAoVW5PcC0+Z2V0T3Bjb2RlKCkpIHsKLSNkZWZpbmUgT1BFUkFUT1IoTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhc2UgVU9fIyNOQU1FOiBESVNQQVRDSF9TVE1UKFVuYXJ5IyNOQU1FLCBVbmFyeU9wZXJhdG9yLCBTKTsKLSAgCi0gICAgICBVTkFSWU9QX0xJU1QoKQotI3VuZGVmIE9QRVJBVE9SCi0jdW5kZWYgVU5BUllPUF9MSVNUCi0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgCi0gICAgICAvLyBUb3Agc3dpdGNoIHN0bXQ6IGRpc3BhdGNoIHRvIFRyYXZlcnNlRm9vU3RtdCBmb3IgZWFjaCBjb25jcmV0ZSBGb29TdG10LgotICAgICAgc3dpdGNoIChTLT5nZXRTdG10Q2xhc3MoKSkgewotICAgICAgY2FzZSBTdG10OjpOb1N0bXRDbGFzczogYnJlYWs7Ci0jZGVmaW5lIEFCU1RSQUNUX1NUTVQoU1RNVCkKLSNkZWZpbmUgU1RNVChDTEFTUywgUEFSRU5UKSBcCi0gICAgICBjYXNlIFN0bXQ6OkNMQVNTIyNDbGFzczogRElTUEFUQ0hfU1RNVChDTEFTUywgQ0xBU1MsIFMpOwotI2luY2x1ZGUgImNsYW5nL0FTVC9TdG10Tm9kZXMuaW5jIgotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoU21hbGxWZWN0b3JJbXBsPFN0bXQgKj46OnJldmVyc2VfaXRlcmF0b3IKLSAgICAgICAgICAgUkkgPSBTdG10c1RvRW5xdWV1LnJiZWdpbigpLAotICAgICAgICAgICBSRSA9IFN0bXRzVG9FbnF1ZXUucmVuZCgpOyBSSSAhPSBSRTsgKytSSSkKLSAgICAgIFF1ZXVlLnB1c2hfYmFjaygqUkkpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlVHlwZShRdWFsVHlwZSBUKSB7Ci0gIGlmIChULmlzTnVsbCgpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN3aXRjaCAoVC0+Z2V0VHlwZUNsYXNzKCkpIHsKLSNkZWZpbmUgQUJTVFJBQ1RfVFlQRShDTEFTUywgQkFTRSkKLSNkZWZpbmUgVFlQRShDTEFTUywgQkFTRSkgXAotICBjYXNlIFR5cGU6OkNMQVNTOiBESVNQQVRDSChDTEFTUyMjVHlwZSwgQ0xBU1MjI1R5cGUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxUeXBlKj4oVC5nZXRUeXBlUHRyKCkpKTsKLSNpbmNsdWRlICJjbGFuZy9BU1QvVHlwZU5vZGVzLmRlZiIKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVR5cGVMb2MoVHlwZUxvYyBUTCkgewotICBpZiAoVEwuaXNOdWxsKCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChUTC5nZXRUeXBlTG9jQ2xhc3MoKSkgewotI2RlZmluZSBBQlNUUkFDVF9UWVBFTE9DKENMQVNTLCBCQVNFKQotI2RlZmluZSBUWVBFTE9DKENMQVNTLCBCQVNFKSBcCi0gIGNhc2UgVHlwZUxvYzo6Q0xBU1M6IFwKLSAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlIyNDTEFTUyMjVHlwZUxvYyhUTC5jYXN0QXM8Q0xBU1MjI1R5cGVMb2M+KCkpOwotI2luY2x1ZGUgImNsYW5nL0FTVC9UeXBlTG9jTm9kZXMuZGVmIgotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VEZWNsKERlY2wgKkQpIHsKLSAgaWYgKCFEKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8vIEFzIGEgc3ludGF4IHZpc2l0b3IsIHdlIHdhbnQgdG8gaWdub3JlIGRlY2xhcmF0aW9ucyBmb3IKLSAgLy8gaW1wbGljaXRseS1kZWZpbmVkIGRlY2xhcmF0aW9ucyAob25lcyBub3QgdHlwZWQgZXhwbGljaXRseSBieSB0aGUKLSAgLy8gdXNlcikuCi0gIGlmIChELT5pc0ltcGxpY2l0KCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChELT5nZXRLaW5kKCkpIHsKLSNkZWZpbmUgQUJTVFJBQ1RfREVDTChERUNMKQotI2RlZmluZSBERUNMKENMQVNTLCBCQVNFKSBcCi0gIGNhc2UgRGVjbDo6Q0xBU1M6IERJU1BBVENIKENMQVNTIyNEZWNsLCBDTEFTUyMjRGVjbCwgRCk7Ci0jaW5jbHVkZSAiY2xhbmcvQVNUL0RlY2xOb2Rlcy5pbmMiCi0gfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jdW5kZWYgRElTUEFUQ0gKLQotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZE5hbWVTcGVjaWZpZXIgKk5OUykgewotICBpZiAoIU5OUykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoTk5TLT5nZXRQcmVmaXgoKSkKLSAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyKE5OUy0+Z2V0UHJlZml4KCkpKTsKLQotICBzd2l0Y2ggKE5OUy0+Z2V0S2luZCgpKSB7Ci0gIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6SWRlbnRpZmllcjoKLSAgY2FzZSBOZXN0ZWROYW1lU3BlY2lmaWVyOjpOYW1lc3BhY2U6Ci0gIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6TmFtZXNwYWNlQWxpYXM6Ci0gIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6R2xvYmFsOgotICAgIHJldHVybiB0cnVlOwotCi0gIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6VHlwZVNwZWM6Ci0gIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6VHlwZVNwZWNXaXRoVGVtcGxhdGU6Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShRdWFsVHlwZShOTlMtPmdldEFzVHlwZSgpLCAwKSkpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkTmFtZVNwZWNpZmllckxvYyBOTlMpIHsKLSAgaWYgKCFOTlMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgIGlmIChOZXN0ZWROYW1lU3BlY2lmaWVyTG9jIFByZWZpeCA9IE5OUy5nZXRQcmVmaXgoKSkKLSAgICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhQcmVmaXgpKTsKLQotICBzd2l0Y2ggKE5OUy5nZXROZXN0ZWROYW1lU3BlY2lmaWVyKCktPmdldEtpbmQoKSkgewotICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6OklkZW50aWZpZXI6Ci0gIGNhc2UgTmVzdGVkTmFtZVNwZWNpZmllcjo6TmFtZXNwYWNlOgotICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6Ok5hbWVzcGFjZUFsaWFzOgotICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6Okdsb2JhbDoKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6OlR5cGVTcGVjOgotICBjYXNlIE5lc3RlZE5hbWVTcGVjaWZpZXI6OlR5cGVTcGVjV2l0aFRlbXBsYXRlOgotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoTk5TLmdldFR5cGVMb2MoKSkpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlRGVjbGFyYXRpb25OYW1lSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWVJbmZvIE5hbWVJbmZvKSB7Ci0gIHN3aXRjaCAoTmFtZUluZm8uZ2V0TmFtZSgpLmdldE5hbWVLaW5kKCkpIHsKLSAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWENvbnN0cnVjdG9yTmFtZToKLSAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWERlc3RydWN0b3JOYW1lOgotICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYQ29udmVyc2lvbkZ1bmN0aW9uTmFtZToKLSAgICBpZiAoVHlwZVNvdXJjZUluZm8gKlRTSW5mbyA9IE5hbWVJbmZvLmdldE5hbWVkVHlwZUluZm8oKSkKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVFNJbmZvLT5nZXRUeXBlTG9jKCkpKTsKLQotICAgIGJyZWFrOwotCi0gIGNhc2UgRGVjbGFyYXRpb25OYW1lOjpJZGVudGlmaWVyOgotICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6T2JqQ1plcm9BcmdTZWxlY3RvcjoKLSAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6Ok9iakNPbmVBcmdTZWxlY3RvcjoKLSAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6Ok9iakNNdWx0aUFyZ1NlbGVjdG9yOgotICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYT3BlcmF0b3JOYW1lOgotICBjYXNlIERlY2xhcmF0aW9uTmFtZTo6Q1hYTGl0ZXJhbE9wZXJhdG9yTmFtZToKLSAgY2FzZSBEZWNsYXJhdGlvbk5hbWU6OkNYWFVzaW5nRGlyZWN0aXZlOgotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlVGVtcGxhdGVOYW1lKFRlbXBsYXRlTmFtZSBUZW1wbGF0ZSkgewotICBpZiAoRGVwZW5kZW50VGVtcGxhdGVOYW1lICpEVE4gPSBUZW1wbGF0ZS5nZXRBc0RlcGVuZGVudFRlbXBsYXRlTmFtZSgpKQotICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXIoRFROLT5nZXRRdWFsaWZpZXIoKSkpOwotICBlbHNlIGlmIChRdWFsaWZpZWRUZW1wbGF0ZU5hbWUgKlFUTiA9IFRlbXBsYXRlLmdldEFzUXVhbGlmaWVkVGVtcGxhdGVOYW1lKCkpCi0gICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllcihRVE4tPmdldFF1YWxpZmllcigpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnQgJkFyZykgewotICBzd2l0Y2ggKEFyZy5nZXRLaW5kKCkpIHsKLSAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpOdWxsOgotICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OkRlY2xhcmF0aW9uOgotICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OkludGVncmFsOgotICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6Ok51bGxQdHI6Ci0gICAgcmV0dXJuIHRydWU7Ci0KLSAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpUeXBlOgotICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUeXBlKEFyZy5nZXRBc1R5cGUoKSk7Ci0KLSAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpUZW1wbGF0ZToKLSAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpUZW1wbGF0ZUV4cGFuc2lvbjoKLSAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlVGVtcGxhdGVOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnLmdldEFzVGVtcGxhdGVPclRlbXBsYXRlUGF0dGVybigpKTsKLQotICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OkV4cHJlc3Npb246Ci0gICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVN0bXQoQXJnLmdldEFzRXhwcigpKTsKLQotICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OlBhY2s6Ci0gICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRzKEFyZy5wYWNrX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZy5wYWNrX3NpemUoKSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gRklYTUU6IG5vIHRlbXBsYXRlIG5hbWUgbG9jYXRpb24/Ci0vLyBGSVhNRTogbm8gc291cmNlIGxvY2F0aW9ucyBmb3IgYSB0ZW1wbGF0ZSBhcmd1bWVudCBwYWNrPwotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRlbXBsYXRlQXJndW1lbnRMb2MgJkFyZ0xvYykgewotICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICZBcmcgPSBBcmdMb2MuZ2V0QXJndW1lbnQoKTsKLQotICBzd2l0Y2ggKEFyZy5nZXRLaW5kKCkpIHsKLSAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpOdWxsOgotICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OkRlY2xhcmF0aW9uOgotICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OkludGVncmFsOgotICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6Ok51bGxQdHI6Ci0gICAgcmV0dXJuIHRydWU7Ci0KLSAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpUeXBlOiB7Ci0gICAgLy8gRklYTUU6IGhvdyBjYW4gVFNJIGV2ZXIgYmUgTlVMTD8KLSAgICBpZiAoVHlwZVNvdXJjZUluZm8gKlRTSSA9IEFyZ0xvYy5nZXRUeXBlU291cmNlSW5mbygpKQotICAgICAgcmV0dXJuIGdldERlcml2ZWQoKS5UcmF2ZXJzZVR5cGVMb2MoVFNJLT5nZXRUeXBlTG9jKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUeXBlKEFyZy5nZXRBc1R5cGUoKSk7Ci0gIH0KLQotICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OlRlbXBsYXRlOgotICBjYXNlIFRlbXBsYXRlQXJndW1lbnQ6OlRlbXBsYXRlRXhwYW5zaW9uOgotICAgIGlmIChBcmdMb2MuZ2V0VGVtcGxhdGVRdWFsaWZpZXJMb2MoKSkKLSAgICAgIFRSWV9UTyhnZXREZXJpdmVkKCkuVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdMb2MuZ2V0VGVtcGxhdGVRdWFsaWZpZXJMb2MoKSkpOwotICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VUZW1wbGF0ZU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZy5nZXRBc1RlbXBsYXRlT3JUZW1wbGF0ZVBhdHRlcm4oKSk7Ci0KLSAgY2FzZSBUZW1wbGF0ZUFyZ3VtZW50OjpFeHByZXNzaW9uOgotICAgIHJldHVybiBnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEFyZ0xvYy5nZXRTb3VyY2VFeHByZXNzaW9uKCkpOwotCi0gIGNhc2UgVGVtcGxhdGVBcmd1bWVudDo6UGFjazoKLSAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudHMoQXJnLnBhY2tfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnLnBhY2tfc2l6ZSgpKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50ICpBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtQXJncykgewotICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJICE9IE51bUFyZ3M7ICsrSSkgewotICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnQoQXJnc1tJXSkpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlQ29uc3RydWN0b3JJbml0aWFsaXplcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hYQ3RvckluaXRpYWxpemVyICpJbml0KSB7Ci0gIGlmIChUeXBlU291cmNlSW5mbyAqVEluZm8gPSBJbml0LT5nZXRUeXBlU291cmNlSW5mbygpKQotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEluZm8tPmdldFR5cGVMb2MoKSkpOwotCi0gIGlmIChJbml0LT5pc1dyaXR0ZW4oKSkKLSAgICBUUllfVE8oVHJhdmVyc2VTdG10KEluaXQtPmdldEluaXQoKSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VMYW1iZGFDYXB0dXJlKExhbWJkYUV4cHI6OkNhcHR1cmUgQyl7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLSBUeXBlIHRyYXZlcnNhbCAtLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGlzIG1hY3JvIG1ha2VzIGF2YWlsYWJsZSBhIHZhcmlhYmxlIFQsIHRoZSBwYXNzZWQtaW4gdHlwZS4KLSNkZWZpbmUgREVGX1RSQVZFUlNFX1RZUEUoVFlQRSwgQ09ERSkgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZSMjVFlQRSAoVFlQRSAqVCkgeyAgICAgICAgXAotICAgIFRSWV9UTyhXYWxrVXBGcm9tIyNUWVBFIChUKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBDT0RFOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLURFRl9UUkFWRVJTRV9UWVBFKEJ1aWx0aW5UeXBlLCB7IH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKENvbXBsZXhUeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRFbGVtZW50VHlwZSgpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKFBvaW50ZXJUeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRQb2ludGVlVHlwZSgpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKEJsb2NrUG9pbnRlclR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBvaW50ZWVUeXBlKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoTFZhbHVlUmVmZXJlbmNlVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0UG9pbnRlZVR5cGUoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRShSVmFsdWVSZWZlcmVuY2VUeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRQb2ludGVlVHlwZSgpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKE1lbWJlclBvaW50ZXJUeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShRdWFsVHlwZShULT5nZXRDbGFzcygpLCAwKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0UG9pbnRlZVR5cGUoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRShEZWNheWVkVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0T3JpZ2luYWxUeXBlKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoQ29uc3RhbnRBcnJheVR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldEVsZW1lbnRUeXBlKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoSW5jb21wbGV0ZUFycmF5VHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRShWYXJpYWJsZUFycmF5VHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoVC0+Z2V0U2l6ZUV4cHIoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRShEZXBlbmRlbnRTaXplZEFycmF5VHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOwotICAgIGlmIChULT5nZXRTaXplRXhwcigpKQotICAgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChULT5nZXRTaXplRXhwcigpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKERlcGVuZGVudFNpemVkRXh0VmVjdG9yVHlwZSwgewotICAgIGlmIChULT5nZXRTaXplRXhwcigpKQotICAgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChULT5nZXRTaXplRXhwcigpKSk7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRFbGVtZW50VHlwZSgpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKFZlY3RvclR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldEVsZW1lbnRUeXBlKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoRXh0VmVjdG9yVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0RWxlbWVudFR5cGUoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRShGdW5jdGlvbk5vUHJvdG9UeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXRSZXN1bHRUeXBlKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoRnVuY3Rpb25Qcm90b1R5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFJlc3VsdFR5cGUoKSkpOwotCi0gICAgZm9yIChGdW5jdGlvblByb3RvVHlwZTo6YXJnX3R5cGVfaXRlcmF0b3IgQSA9IFQtPmFyZ190eXBlX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVuZCA9IFQtPmFyZ190eXBlX2VuZCgpOwotICAgICAgICAgQSAhPSBBRW5kOyArK0EpIHsKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoKkEpKTsKLSAgICB9Ci0KLSAgICBmb3IgKEZ1bmN0aW9uUHJvdG9UeXBlOjpleGNlcHRpb25faXRlcmF0b3IgRSA9IFQtPmV4Y2VwdGlvbl9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRW5kID0gVC0+ZXhjZXB0aW9uX2VuZCgpOwotICAgICAgICAgRSAhPSBFRW5kOyArK0UpIHsKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoKkUpKTsKLSAgICB9Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKFVucmVzb2x2ZWRVc2luZ1R5cGUsIHsgfSkKLURFRl9UUkFWRVJTRV9UWVBFKFR5cGVkZWZUeXBlLCB7IH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKFR5cGVPZkV4cHJUeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlU3RtdChULT5nZXRVbmRlcmx5aW5nRXhwcigpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKFR5cGVPZlR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFVuZGVybHlpbmdUeXBlKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoRGVjbHR5cGVUeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlU3RtdChULT5nZXRVbmRlcmx5aW5nRXhwcigpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKFVuYXJ5VHJhbnNmb3JtVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0QmFzZVR5cGUoKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0VW5kZXJseWluZ1R5cGUoKSkpOwotICAgIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKEF1dG9UeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXREZWR1Y2VkVHlwZSgpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKFJlY29yZFR5cGUsIHsgfSkKLURFRl9UUkFWRVJTRV9UWVBFKEVudW1UeXBlLCB7IH0pCi1ERUZfVFJBVkVSU0VfVFlQRShUZW1wbGF0ZVR5cGVQYXJtVHlwZSwgeyB9KQotREVGX1RSQVZFUlNFX1RZUEUoU3Vic3RUZW1wbGF0ZVR5cGVQYXJtVHlwZSwgeyB9KQotREVGX1RSQVZFUlNFX1RZUEUoU3Vic3RUZW1wbGF0ZVR5cGVQYXJtUGFja1R5cGUsIHsgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoVGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZU5hbWUoVC0+Z2V0VGVtcGxhdGVOYW1lKCkpKTsKLSAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50cyhULT5nZXRBcmdzKCksIFQtPmdldE51bUFyZ3MoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRShJbmplY3RlZENsYXNzTmFtZVR5cGUsIHsgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoQXR0cmlidXRlZFR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldE1vZGlmaWVkVHlwZSgpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFKFBhcmVuVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0SW5uZXJUeXBlKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoRWxhYm9yYXRlZFR5cGUsIHsKLSAgICBpZiAoVC0+Z2V0UXVhbGlmaWVyKCkpIHsKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXIoVC0+Z2V0UXVhbGlmaWVyKCkpKTsKLSAgICB9Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShULT5nZXROYW1lZFR5cGUoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRShEZXBlbmRlbnROYW1lVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXIoVC0+Z2V0UXVhbGlmaWVyKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoRGVwZW5kZW50VGVtcGxhdGVTcGVjaWFsaXphdGlvblR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyKFQtPmdldFF1YWxpZmllcigpKSk7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudHMoVC0+Z2V0QXJncygpLCBULT5nZXROdW1BcmdzKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoUGFja0V4cGFuc2lvblR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBhdHRlcm4oKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRShPYmpDSW50ZXJmYWNlVHlwZSwgeyB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRShPYmpDT2JqZWN0VHlwZSwgewotICAgIC8vIFdlIGhhdmUgdG8gd2F0Y2ggb3V0IGhlcmUgYmVjYXVzZSBhbiBPYmpDSW50ZXJmYWNlVHlwZSdzIGJhc2UKLSAgICAvLyB0eXBlIGlzIGl0c2VsZi4KLSAgICBpZiAoVC0+Z2V0QmFzZVR5cGUoKS5nZXRUeXBlUHRyKCkgIT0gVCkKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0QmFzZVR5cGUoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRShPYmpDT2JqZWN0UG9pbnRlclR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFQtPmdldFBvaW50ZWVUeXBlKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEUoQXRvbWljVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0VmFsdWVUeXBlKCkpKTsKLSAgfSkKLQotI3VuZGVmIERFRl9UUkFWRVJTRV9UWVBFCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tIFR5cGVMb2MgdHJhdmVyc2FsIC0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRoaXMgbWFjcm8gbWFrZXMgYXZhaWxhYmxlIGEgdmFyaWFibGUgVEwsIHRoZSBwYXNzZWQtaW4gVHlwZUxvYy4KLS8vIElmIHJlcXVlc3RlZCwgaXQgY2FsbHMgV2Fsa1VwRnJvbSogZm9yIHRoZSBUeXBlIGluIHRoZSBnaXZlbiBUeXBlTG9jLAotLy8gaW4gYWRkaXRpb24gdG8gV2Fsa1VwRnJvbSogZm9yIHRoZSBUeXBlTG9jIGl0c2VsZiwgc3VjaCB0aGF0IGV4aXN0aW5nCi0vLyBjbGllbnRzIHRoYXQgb3ZlcnJpZGUgdGhlIFdhbGtVcEZyb20qVHlwZSgpIGFuZC9vciBWaXNpdCpUeXBlKCkgbWV0aG9kcwotLy8gY29udGludWUgdG8gd29yay4KLSNkZWZpbmUgREVGX1RSQVZFUlNFX1RZUEVMT0MoVFlQRSwgQ09ERSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZSMjVFlQRSMjTG9jKFRZUEUjI0xvYyBUTCkgeyBcCi0gICAgaWYgKGdldERlcml2ZWQoKS5zaG91bGRXYWxrVHlwZXNPZlR5cGVMb2NzKCkpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBUUllfVE8oV2Fsa1VwRnJvbSMjVFlQRShjb25zdF9jYXN0PFRZUEUqPihUTC5nZXRUeXBlUHRyKCkpKSk7ICAgICBcCi0gICAgVFJZX1RPKFdhbGtVcEZyb20jI1RZUEUjI0xvYyhUTCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBDT0RFOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VRdWFsaWZpZWRUeXBlTG9jKAotICAgIFF1YWxpZmllZFR5cGVMb2MgVEwpIHsKLSAgLy8gTW92ZSB0aGlzIG92ZXIgdG8gdGhlICdtYWluJyB0eXBlbG9jIHRyZWUuICBOb3RlIHRoYXQgdGhpcyBpcyBhCi0gIC8vIG1vdmUgLS0gd2UgcHJldGVuZCB0aGF0IHdlIHdlcmUgcmVhbGx5IGxvb2tpbmcgYXQgdGhlIHVucXVhbGlmaWVkCi0gIC8vIHR5cGVsb2MgYWxsIGFsb25nIC0tIHJhdGhlciB0aGFuIGEgcmVjdXJzaW9uLCBzbyB3ZSBkb24ndCBmb2xsb3cKLSAgLy8gdGhlIG5vcm1hbCBDUlRQIHBsYW4gb2YgZ29pbmcgdGhyb3VnaAotICAvLyBnZXREZXJpdmVkKCkuVHJhdmVyc2VUeXBlTG9jLiAgSWYgd2UgZGlkLCB3ZSdkIGJlIHRyYXZlcnNpbmcKLSAgLy8gdHdpY2UgZm9yIHRoZSBzYW1lIHR5cGUgKG9uY2UgYXMgYSBRdWFsaWZpZWRUeXBlTG9jIHZlcnNpb24gb2YKLSAgLy8gdGhlIHR5cGUsIG9uY2UgYXMgYW4gVW5xdWFsaWZpZWRUeXBlTG9jIHZlcnNpb24gb2YgdGhlIHR5cGUpLAotICAvLyB3aGljaCBpbiBlZmZlY3QgbWVhbnMgd2UnZCBjYWxsIFZpc2l0VHlwZUxvYyB0d2ljZSB3aXRoIHRoZQotICAvLyAnc2FtZScgdHlwZS4gIFRoaXMgc29sdmVzIHRoYXQgcHJvYmxlbSwgYXQgdGhlIGNvc3Qgb2YgbmV2ZXIKLSAgLy8gc2VlaW5nIHRoZSBxdWFsaWZpZWQgdmVyc2lvbiBvZiB0aGUgdHlwZSAodW5sZXNzIHRoZSBjbGllbnQKLSAgLy8gc3ViY2xhc3NlcyBUcmF2ZXJzZVF1YWxpZmllZFR5cGVMb2MgdGhlbXNlbHZlcykuICBJdCdzIG5vdCBhCi0gIC8vIHBlcmZlY3Qgc29sdXRpb24uICBBIHBlcmZlY3Qgc29sdXRpb24gcHJvYmFibHkgcmVxdWlyZXMgbWFraW5nCi0gIC8vIFF1YWxpZmllZFR5cGVMb2MgYSB3cmFwcGVyIGFyb3VuZCBUeXBlTG9jIC0tIGxpa2UgUXVhbFR5cGUgaXMgYQotICAvLyB3cmFwcGVyIGFyb3VuZCBUeXBlKiAtLSByYXRoZXIgdGhhbiBiZWluZyBpdHMgb3duIGNsYXNzIGluIHRoZQotICAvLyB0eXBlIGhpZXJhcmNoeS4KLSAgcmV0dXJuIFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRVbnF1YWxpZmllZExvYygpKTsKLX0KLQotREVGX1RSQVZFUlNFX1RZUEVMT0MoQnVpbHRpblR5cGUsIHsgfSkKLQotLy8gRklYTUU6IENvbXBsZXhUeXBlTG9jIGlzIHVuZmluaXNoZWQKLURFRl9UUkFWRVJTRV9UWVBFTE9DKENvbXBsZXhUeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShUTC5nZXRUeXBlUHRyKCktPmdldEVsZW1lbnRUeXBlKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEVMT0MoUG9pbnRlclR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFBvaW50ZWVMb2MoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRUxPQyhCbG9ja1BvaW50ZXJUeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRQb2ludGVlTG9jKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEVMT0MoTFZhbHVlUmVmZXJlbmNlVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UG9pbnRlZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFTE9DKFJWYWx1ZVJlZmVyZW5jZVR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFBvaW50ZWVMb2MoKSkpOwotICB9KQotCi0vLyBGSVhNRTogbG9jYXRpb24gb2YgYmFzZSBjbGFzcz8KLS8vIFdlIHRyYXZlcnNlIHRoaXMgaW4gdGhlIHR5cGUgY2FzZSBhcyB3ZWxsLCBidXQgaG93IGlzIGl0IG5vdCByZWFjaGVkIHRocm91Z2gKLS8vIHRoZSBwb2ludGVlIHR5cGU/Ci1ERUZfVFJBVkVSU0VfVFlQRUxPQyhNZW1iZXJQb2ludGVyVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoUXVhbFR5cGUoVEwuZ2V0VHlwZVB0cigpLT5nZXRDbGFzcygpLCAwKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UG9pbnRlZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFTE9DKERlY2F5ZWRUeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRPcmlnaW5hbExvYygpKSk7Ci0gIH0pCi0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlQXJyYXlUeXBlTG9jSGVscGVyKEFycmF5VHlwZUxvYyBUTCkgewotICAvLyBUaGlzIGlzbid0IGF2YWlsYWJsZSBmb3IgQXJyYXlUeXBlLCBidXQgaXMgZm9yIHRoZSBBcnJheVR5cGVMb2MuCi0gIFRSWV9UTyhUcmF2ZXJzZVN0bXQoVEwuZ2V0U2l6ZUV4cHIoKSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotREVGX1RSQVZFUlNFX1RZUEVMT0MoQ29uc3RhbnRBcnJheVR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldEVsZW1lbnRMb2MoKSkpOwotICAgIHJldHVybiBUcmF2ZXJzZUFycmF5VHlwZUxvY0hlbHBlcihUTCk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFTE9DKEluY29tcGxldGVBcnJheVR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldEVsZW1lbnRMb2MoKSkpOwotICAgIHJldHVybiBUcmF2ZXJzZUFycmF5VHlwZUxvY0hlbHBlcihUTCk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFTE9DKFZhcmlhYmxlQXJyYXlUeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRFbGVtZW50TG9jKCkpKTsKLSAgICByZXR1cm4gVHJhdmVyc2VBcnJheVR5cGVMb2NIZWxwZXIoVEwpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRUxPQyhEZXBlbmRlbnRTaXplZEFycmF5VHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0RWxlbWVudExvYygpKSk7Ci0gICAgcmV0dXJuIFRyYXZlcnNlQXJyYXlUeXBlTG9jSGVscGVyKFRMKTsKLSAgfSkKLQotLy8gRklYTUU6IG9yZGVyPyB3aHkgbm90IHNpemUgZXhwciBmaXJzdD8KLS8vIEZJWE1FOiBiYXNlIFZlY3RvclR5cGVMb2MgaXMgdW5maW5pc2hlZAotREVGX1RSQVZFUlNFX1RZUEVMT0MoRGVwZW5kZW50U2l6ZWRFeHRWZWN0b3JUeXBlLCB7Ci0gICAgaWYgKFRMLmdldFR5cGVQdHIoKS0+Z2V0U2l6ZUV4cHIoKSkKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoVEwuZ2V0VHlwZVB0cigpLT5nZXRTaXplRXhwcigpKSk7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZShUTC5nZXRUeXBlUHRyKCktPmdldEVsZW1lbnRUeXBlKCkpKTsKLSAgfSkKLQotLy8gRklYTUU6IFZlY3RvclR5cGVMb2MgaXMgdW5maW5pc2hlZAotREVGX1RSQVZFUlNFX1RZUEVMT0MoVmVjdG9yVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVEwuZ2V0VHlwZVB0cigpLT5nZXRFbGVtZW50VHlwZSgpKSk7Ci0gIH0pCi0KLS8vIEZJWE1FOiBzaXplIGFuZCBhdHRyaWJ1dGVzCi0vLyBGSVhNRTogYmFzZSBWZWN0b3JUeXBlTG9jIGlzIHVuZmluaXNoZWQKLURFRl9UUkFWRVJTRV9UWVBFTE9DKEV4dFZlY3RvclR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFRMLmdldFR5cGVQdHIoKS0+Z2V0RWxlbWVudFR5cGUoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRUxPQyhGdW5jdGlvbk5vUHJvdG9UeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRSZXN1bHRMb2MoKSkpOwotICB9KQotCi0vLyBGSVhNRTogbG9jYXRpb24gb2YgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIChhdHRyaWJ1dGVzPykKLURFRl9UUkFWRVJTRV9UWVBFTE9DKEZ1bmN0aW9uUHJvdG9UeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRSZXN1bHRMb2MoKSkpOwotCi0gICAgY29uc3QgRnVuY3Rpb25Qcm90b1R5cGUgKlQgPSBUTC5nZXRUeXBlUHRyKCk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gVEwuZ2V0TnVtQXJncygpOyBJICE9IEU7ICsrSSkgewotICAgICAgaWYgKFRMLmdldEFyZyhJKSkgewotICAgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKFRMLmdldEFyZyhJKSkpOwotICAgICAgfSBlbHNlIGlmIChJIDwgVC0+Z2V0TnVtQXJncygpKSB7Ci0gICAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGUoVC0+Z2V0QXJnVHlwZShJKSkpOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoRnVuY3Rpb25Qcm90b1R5cGU6OmV4Y2VwdGlvbl9pdGVyYXRvciBFID0gVC0+ZXhjZXB0aW9uX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVFbmQgPSBULT5leGNlcHRpb25fZW5kKCk7Ci0gICAgICAgICBFICE9IEVFbmQ7ICsrRSkgewotICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZSgqRSkpOwotICAgIH0KLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEVMT0MoVW5yZXNvbHZlZFVzaW5nVHlwZSwgeyB9KQotREVGX1RSQVZFUlNFX1RZUEVMT0MoVHlwZWRlZlR5cGUsIHsgfSkKLQotREVGX1RSQVZFUlNFX1RZUEVMT0MoVHlwZU9mRXhwclR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VTdG10KFRMLmdldFVuZGVybHlpbmdFeHByKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEVMT0MoVHlwZU9mVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0VW5kZXJseWluZ1RJbmZvKCktPmdldFR5cGVMb2MoKSkpOwotICB9KQotCi0vLyBGSVhNRTogbG9jYXRpb24gb2YgdW5kZXJseWluZyBleHByCi1ERUZfVFJBVkVSU0VfVFlQRUxPQyhEZWNsdHlwZVR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VTdG10KFRMLmdldFR5cGVQdHIoKS0+Z2V0VW5kZXJseWluZ0V4cHIoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRUxPQyhVbmFyeVRyYW5zZm9ybVR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFVuZGVybHlpbmdUSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEVMT0MoQXV0b1R5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFRMLmdldFR5cGVQdHIoKS0+Z2V0RGVkdWNlZFR5cGUoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRUxPQyhSZWNvcmRUeXBlLCB7IH0pCi1ERUZfVFJBVkVSU0VfVFlQRUxPQyhFbnVtVHlwZSwgeyB9KQotREVGX1RSQVZFUlNFX1RZUEVMT0MoVGVtcGxhdGVUeXBlUGFybVR5cGUsIHsgfSkKLURFRl9UUkFWRVJTRV9UWVBFTE9DKFN1YnN0VGVtcGxhdGVUeXBlUGFybVR5cGUsIHsgfSkKLURFRl9UUkFWRVJTRV9UWVBFTE9DKFN1YnN0VGVtcGxhdGVUeXBlUGFybVBhY2tUeXBlLCB7IH0pCi0KLS8vIEZJWE1FOiB1c2UgdGhlIGxvYyBmb3IgdGhlIHRlbXBsYXRlIG5hbWU/Ci1ERUZfVFJBVkVSU0VfVFlQRUxPQyhUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlTmFtZShUTC5nZXRUeXBlUHRyKCktPmdldFRlbXBsYXRlTmFtZSgpKSk7Ci0gICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFRMLmdldE51bUFyZ3MoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2MoVEwuZ2V0QXJnTG9jKEkpKSk7Ci0gICAgfQotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRUxPQyhJbmplY3RlZENsYXNzTmFtZVR5cGUsIHsgfSkKLQotREVGX1RSQVZFUlNFX1RZUEVMT0MoUGFyZW5UeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRJbm5lckxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFTE9DKEF0dHJpYnV0ZWRUeXBlLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTC5nZXRNb2RpZmllZExvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFTE9DKEVsYWJvcmF0ZWRUeXBlLCB7Ci0gICAgaWYgKFRMLmdldFF1YWxpZmllckxvYygpKSB7Ci0gICAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKFRMLmdldFF1YWxpZmllckxvYygpKSk7Ci0gICAgfQotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0TmFtZWRUeXBlTG9jKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1RZUEVMT0MoRGVwZW5kZW50TmFtZVR5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKFRMLmdldFF1YWxpZmllckxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFTE9DKERlcGVuZGVudFRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlLCB7Ci0gICAgaWYgKFRMLmdldFF1YWxpZmllckxvYygpKSB7Ci0gICAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKFRMLmdldFF1YWxpZmllckxvYygpKSk7Ci0gICAgfQotCi0gICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFRMLmdldE51bUFyZ3MoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2MoVEwuZ2V0QXJnTG9jKEkpKSk7Ci0gICAgfQotICB9KQotCi1ERUZfVFJBVkVSU0VfVFlQRUxPQyhQYWNrRXhwYW5zaW9uVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UGF0dGVybkxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFTE9DKE9iakNJbnRlcmZhY2VUeXBlLCB7IH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFTE9DKE9iakNPYmplY3RUeXBlLCB7Ci0gICAgLy8gV2UgaGF2ZSB0byB3YXRjaCBvdXQgaGVyZSBiZWNhdXNlIGFuIE9iakNJbnRlcmZhY2VUeXBlJ3MgYmFzZQotICAgIC8vIHR5cGUgaXMgaXRzZWxmLgotICAgIGlmIChUTC5nZXRUeXBlUHRyKCktPmdldEJhc2VUeXBlKCkuZ2V0VHlwZVB0cigpICE9IFRMLmdldFR5cGVQdHIoKSkKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0QmFzZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFTE9DKE9iakNPYmplY3RQb2ludGVyVHlwZSwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVEwuZ2V0UG9pbnRlZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9UWVBFTE9DKEF0b21pY1R5cGUsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRMLmdldFZhbHVlTG9jKCkpKTsKLSAgfSkKLQotI3VuZGVmIERFRl9UUkFWRVJTRV9UWVBFTE9DCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tIERlY2wgdHJhdmVyc2FsIC0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gRm9yIGEgRGVjbCwgd2UgYXV0b21hdGUgKGluIHRoZSBERUZfVFJBVkVSU0VfREVDTCBtYWNybykgdHJhdmVyc2luZwotLy8gdGhlIGNoaWxkcmVuIHRoYXQgY29tZSBmcm9tIHRoZSBEZWNsQ29udGV4dCBhc3NvY2lhdGVkIHdpdGggaXQuCi0vLyBUaGVyZWZvcmUgZWFjaCBUcmF2ZXJzZSogb25seSBuZWVkcyB0byB3b3JyeSBhYm91dCBjaGlsZHJlbiBvdGhlcgotLy8gdGhhbiB0aG9zZS4KLQotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VEZWNsQ29udGV4dEhlbHBlcihEZWNsQ29udGV4dCAqREMpIHsKLSAgaWYgKCFEQykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKERlY2xDb250ZXh0OjpkZWNsX2l0ZXJhdG9yIENoaWxkID0gREMtPmRlY2xzX2JlZ2luKCksCi0gICAgICAgICAgIENoaWxkRW5kID0gREMtPmRlY2xzX2VuZCgpOwotICAgICAgIENoaWxkICE9IENoaWxkRW5kOyArK0NoaWxkKSB7Ci0gICAgLy8gQmxvY2tEZWNscyBhbmQgQ2FwdHVyZWREZWNscyBhcmUgdHJhdmVyc2VkIHRocm91Z2ggQmxvY2tFeHBycyBhbmQKLSAgICAvLyBDYXB0dXJlZFN0bXRzIHJlc3BlY3RpdmVseS4KLSAgICBpZiAoIWlzYTxCbG9ja0RlY2w+KCpDaGlsZCkgJiYgIWlzYTxDYXB0dXJlZERlY2w+KCpDaGlsZCkpCi0gICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKCpDaGlsZCkpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFRoaXMgbWFjcm8gbWFrZXMgYXZhaWxhYmxlIGEgdmFyaWFibGUgRCwgdGhlIHBhc3NlZC1pbiBkZWNsLgotI2RlZmluZSBERUZfVFJBVkVSU0VfREVDTChERUNMLCBDT0RFKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlIyNERUNMIChERUNMICpEKSB7ICAgXAotICBUUllfVE8oV2Fsa1VwRnJvbSMjREVDTCAoRCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyBDT0RFOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFRSWV9UTyhUcmF2ZXJzZURlY2xDb250ZXh0SGVscGVyKGR5bl9jYXN0PERlY2xDb250ZXh0PihEKSkpOyAgXAotICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotREVGX1RSQVZFUlNFX0RFQ0woQWNjZXNzU3BlY0RlY2wsIHsgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woQmxvY2tEZWNsLCB7Ci0gICAgaWYgKFR5cGVTb3VyY2VJbmZvICpUSW5mbyA9IEQtPmdldFNpZ25hdHVyZUFzV3JpdHRlbigpKQotICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUSW5mby0+Z2V0VHlwZUxvYygpKSk7Ci0gICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRCb2R5KCkpKTsKLSAgICAvLyBUaGlzIHJldHVybiBzdGF0ZW1lbnQgbWFrZXMgc3VyZSB0aGUgdHJhdmVyc2FsIG9mIG5vZGVzIGluCi0gICAgLy8gZGVjbHNfYmVnaW4oKS9kZWNsc19lbmQoKSAoZG9uZSBpbiB0aGUgREVGX1RSQVZFUlNFX0RFQ0wgbWFjcm8pCi0gICAgLy8gaXMgc2tpcHBlZCAtIGRvbid0IHJlbW92ZSBpdC4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woQ2FwdHVyZWREZWNsLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRCb2R5KCkpKTsKLSAgICAvLyBUaGlzIHJldHVybiBzdGF0ZW1lbnQgbWFrZXMgc3VyZSB0aGUgdHJhdmVyc2FsIG9mIG5vZGVzIGluCi0gICAgLy8gZGVjbHNfYmVnaW4oKS9kZWNsc19lbmQoKSAoZG9uZSBpbiB0aGUgREVGX1RSQVZFUlNFX0RFQ0wgbWFjcm8pCi0gICAgLy8gaXMgc2tpcHBlZCAtIGRvbid0IHJlbW92ZSBpdC4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woRW1wdHlEZWNsLCB7IH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKEZpbGVTY29wZUFzbURlY2wsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEFzbVN0cmluZygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKEltcG9ydERlY2wsIHsgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woRnJpZW5kRGVjbCwgewotICAgIC8vIEZyaWVuZCBpcyBlaXRoZXIgZGVjbCBvciBhIHR5cGUuCi0gICAgaWYgKEQtPmdldEZyaWVuZFR5cGUoKSkKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0RnJpZW5kVHlwZSgpLT5nZXRUeXBlTG9jKCkpKTsKLSAgICBlbHNlCi0gICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKEQtPmdldEZyaWVuZERlY2woKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChGcmllbmRUZW1wbGF0ZURlY2wsIHsKLSAgICBpZiAoRC0+Z2V0RnJpZW5kVHlwZSgpKQotICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhELT5nZXRGcmllbmRUeXBlKCktPmdldFR5cGVMb2MoKSkpOwotICAgIGVsc2UKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woRC0+Z2V0RnJpZW5kRGVjbCgpKSk7Ci0gICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IEQtPmdldE51bVRlbXBsYXRlUGFyYW1ldGVycygpOyBJIDwgRTsgKytJKSB7Ci0gICAgICBUZW1wbGF0ZVBhcmFtZXRlckxpc3QgKlRQTCA9IEQtPmdldFRlbXBsYXRlUGFyYW1ldGVyTGlzdChJKTsKLSAgICAgIGZvciAoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0OjppdGVyYXRvciBJVFBMID0gVFBMLT5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVUUEwgPSBUUEwtPmVuZCgpOwotICAgICAgICAgICBJVFBMICE9IEVUUEw7ICsrSVRQTCkgewotICAgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKCpJVFBMKSk7Ci0gICAgICB9Ci0gICAgfQotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChDbGFzc1Njb3BlRnVuY3Rpb25TcGVjaWFsaXphdGlvbkRlY2wsIHsKLSAgVFJZX1RPKFRyYXZlcnNlRGVjbChELT5nZXRTcGVjaWFsaXphdGlvbigpKSk7Ci0gfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woTGlua2FnZVNwZWNEZWNsLCB7IH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKE9iakNQcm9wZXJ0eUltcGxEZWNsLCB7Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudCB0aGlzCi0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKFN0YXRpY0Fzc2VydERlY2wsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEFzc2VydEV4cHIoKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0TWVzc2FnZSgpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKFRyYW5zbGF0aW9uVW5pdERlY2wsIHsKLSAgICAvLyBDb2RlIGluIGFuIHVubmFtZWQgbmFtZXNwYWNlIHNob3dzIHVwIGF1dG9tYXRpY2FsbHkgaW4KLSAgICAvLyBkZWNsc19iZWdpbigpL2RlY2xzX2VuZCgpLiAgVGh1cyB3ZSBkb24ndCBuZWVkIHRvIHJlY3Vyc2Ugb24KLSAgICAvLyBELT5nZXRBbm9ueW1vdXNOYW1lc3BhY2UoKS4KLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woTmFtZXNwYWNlQWxpYXNEZWNsLCB7Ci0gICAgLy8gV2Ugc2hvdWxkbid0IHRyYXZlcnNlIGFuIGFsaWFzZWQgbmFtZXNwYWNlLCBzaW5jZSBpdCB3aWxsIGJlCi0gICAgLy8gZGVmaW5lZCAoYW5kLCB0aGVyZWZvcmUsIHRyYXZlcnNlZCkgc29tZXdoZXJlIGVsc2UuCi0gICAgLy8KLSAgICAvLyBUaGlzIHJldHVybiBzdGF0ZW1lbnQgbWFrZXMgc3VyZSB0aGUgdHJhdmVyc2FsIG9mIG5vZGVzIGluCi0gICAgLy8gZGVjbHNfYmVnaW4oKS9kZWNsc19lbmQoKSAoZG9uZSBpbiB0aGUgREVGX1RSQVZFUlNFX0RFQ0wgbWFjcm8pCi0gICAgLy8gaXMgc2tpcHBlZCAtIGRvbid0IHJlbW92ZSBpdC4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woTGFiZWxEZWNsLCB7Ci0gIC8vIFRoZXJlIGlzIG5vIGNvZGUgaW4gYSBMYWJlbERlY2wuCi19KQotCi0KLURFRl9UUkFWRVJTRV9ERUNMKE5hbWVzcGFjZURlY2wsIHsKLSAgICAvLyBDb2RlIGluIGFuIHVubmFtZWQgbmFtZXNwYWNlIHNob3dzIHVwIGF1dG9tYXRpY2FsbHkgaW4KLSAgICAvLyBkZWNsc19iZWdpbigpL2RlY2xzX2VuZCgpLiAgVGh1cyB3ZSBkb24ndCBuZWVkIHRvIHJlY3Vyc2Ugb24KLSAgICAvLyBELT5nZXRBbm9ueW1vdXNOYW1lc3BhY2UoKS4KLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woT2JqQ0NvbXBhdGlibGVBbGlhc0RlY2wsIHsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKE9iakNDYXRlZ29yeURlY2wsIHsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKE9iakNDYXRlZ29yeUltcGxEZWNsLCB7Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudAotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChPYmpDSW1wbGVtZW50YXRpb25EZWNsLCB7Ci0gICAgLy8gRklYTUU6IGltcGxlbWVudAotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChPYmpDSW50ZXJmYWNlRGVjbCwgewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woT2JqQ1Byb3RvY29sRGVjbCwgewotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQKLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woT2JqQ01ldGhvZERlY2wsIHsKLSAgICBpZiAoRC0+Z2V0UmVzdWx0VHlwZVNvdXJjZUluZm8oKSkgewotICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhELT5nZXRSZXN1bHRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKLSAgICB9Ci0gICAgZm9yIChPYmpDTWV0aG9kRGVjbDo6cGFyYW1faXRlcmF0b3IKLSAgICAgICAgICAgSSA9IEQtPnBhcmFtX2JlZ2luKCksIEUgPSBELT5wYXJhbV9lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woKkkpKTsKLSAgICB9Ci0gICAgaWYgKEQtPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkgewotICAgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRCb2R5KCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKE9iakNQcm9wZXJ0eURlY2wsIHsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKFVzaW5nRGVjbCwgewotICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoRC0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKLSAgICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKEQtPmdldE5hbWVJbmZvKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woVXNpbmdEaXJlY3RpdmVEZWNsLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhELT5nZXRRdWFsaWZpZXJMb2MoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChVc2luZ1NoYWRvd0RlY2wsIHsgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woT01QVGhyZWFkUHJpdmF0ZURlY2wsIHsKLSAgICBmb3IgKE9NUFRocmVhZFByaXZhdGVEZWNsOjp2YXJsaXN0X2l0ZXJhdG9yIEkgPSBELT52YXJsaXN0X2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gRC0+dmFybGlzdF9lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgICBUUllfVE8oVHJhdmVyc2VTdG10KCpJKSk7Ci0gICAgfQotICB9KQotCi0vLyBBIGhlbHBlciBtZXRob2QgZm9yIFRlbXBsYXRlRGVjbCdzIGNoaWxkcmVuLgotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VUZW1wbGF0ZVBhcmFtZXRlckxpc3RIZWxwZXIoCi0gICAgVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUUEwpIHsKLSAgaWYgKFRQTCkgewotICAgIGZvciAoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0OjppdGVyYXRvciBJID0gVFBMLT5iZWdpbigpLCBFID0gVFBMLT5lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKCpJKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBBIGhlbHBlciBtZXRob2QgZm9yIHRyYXZlcnNpbmcgdGhlIGltcGxpY2l0IGluc3RhbnRpYXRpb25zIG9mIGEKLS8vIGNsYXNzIHRlbXBsYXRlLgotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VDbGFzc0luc3RhbnRpYXRpb25zKAotICAgIENsYXNzVGVtcGxhdGVEZWNsICpEKSB7Ci0gIENsYXNzVGVtcGxhdGVEZWNsOjpzcGVjX2l0ZXJhdG9yIGVuZCA9IEQtPnNwZWNfZW5kKCk7Ci0gIGZvciAoQ2xhc3NUZW1wbGF0ZURlY2w6OnNwZWNfaXRlcmF0b3IgaXQgPSBELT5zcGVjX2JlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgIENsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wqIFNEID0gKml0OwotCi0gICAgc3dpdGNoIChTRC0+Z2V0U3BlY2lhbGl6YXRpb25LaW5kKCkpIHsKLSAgICAvLyBWaXNpdCB0aGUgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgd2l0aCB0aGUgcmVxdWVzdGVkIHBhdHRlcm4uCi0gICAgY2FzZSBUU0tfVW5kZWNsYXJlZDoKLSAgICBjYXNlIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb246Ci0gICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKFNEKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgb24gYW4gZXhwbGljaXQgaW5zdGFudGlhdGlvbgotICAgIC8vIG9yIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGJlY2F1c2UgdGhlcmUgd2lsbCBiZSBhbiBleHBsaWNpdAotICAgIC8vIG5vZGUgZm9yIGl0IGVsc2V3aGVyZS4KLSAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWNsYXJhdGlvbjoKLSAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWZpbml0aW9uOgotICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotREVGX1RSQVZFUlNFX0RFQ0woQ2xhc3NUZW1wbGF0ZURlY2wsIHsKLSAgICBDWFhSZWNvcmREZWNsKiBUZW1wRGVjbCA9IEQtPmdldFRlbXBsYXRlZERlY2woKTsKLSAgICBUUllfVE8oVHJhdmVyc2VEZWNsKFRlbXBEZWNsKSk7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVQYXJhbWV0ZXJMaXN0SGVscGVyKEQtPmdldFRlbXBsYXRlUGFyYW1ldGVycygpKSk7Ci0KLSAgICAvLyBCeSBkZWZhdWx0LCB3ZSBkbyBub3QgdHJhdmVyc2UgdGhlIGluc3RhbnRpYXRpb25zIG9mCi0gICAgLy8gY2xhc3MgdGVtcGxhdGVzIHNpbmNlIHRoZXkgZG8gbm90IGFwcGVhciBpbiB0aGUgdXNlciBjb2RlLiBUaGUKLSAgICAvLyBmb2xsb3dpbmcgY29kZSBvcHRpb25hbGx5IHRyYXZlcnNlcyB0aGVtLgotICAgIC8vCi0gICAgLy8gV2Ugb25seSB0cmF2ZXJzZSB0aGUgY2xhc3MgaW5zdGFudGlhdGlvbnMgd2hlbiB3ZSBzZWUgdGhlIGNhbm9uaWNhbAotICAgIC8vIGRlY2xhcmF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSwgdG8gZW5zdXJlIHdlIG9ubHkgdmlzaXQgdGhlbSBvbmNlLgotICAgIGlmIChnZXREZXJpdmVkKCkuc2hvdWxkVmlzaXRUZW1wbGF0ZUluc3RhbnRpYXRpb25zKCkgJiYKLSAgICAgICAgRCA9PSBELT5nZXRDYW5vbmljYWxEZWNsKCkpCi0gICAgICBUUllfVE8oVHJhdmVyc2VDbGFzc0luc3RhbnRpYXRpb25zKEQpKTsKLQotICAgIC8vIE5vdGUgdGhhdCBnZXRJbnN0YW50aWF0ZWRGcm9tTWVtYmVyVGVtcGxhdGUoKSBpcyBqdXN0IGEgbGluawotICAgIC8vIGZyb20gYSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGJhY2sgdG8gdGhlIHRlbXBsYXRlIGZyb20gd2hpY2gKLSAgICAvLyBpdCB3YXMgaW5zdGFudGlhdGVkLCBhbmQgdGh1cyBzaG91bGQgbm90IGJlIHRyYXZlcnNlZC4KLSAgfSkKLQotLy8gQSBoZWxwZXIgbWV0aG9kIGZvciB0cmF2ZXJzaW5nIHRoZSBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyBvZiBhCi0vLyBjbGFzcyB0ZW1wbGF0ZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgotYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVZhcmlhYmxlSW5zdGFudGlhdGlvbnMoCi0gICAgVmFyVGVtcGxhdGVEZWNsICpEKSB7Ci0gIFZhclRlbXBsYXRlRGVjbDo6c3BlY19pdGVyYXRvciBlbmQgPSBELT5zcGVjX2VuZCgpOwotICBmb3IgKFZhclRlbXBsYXRlRGVjbDo6c3BlY19pdGVyYXRvciBpdCA9IEQtPnNwZWNfYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wgKlNEID0gKml0OwotCi0gICAgc3dpdGNoIChTRC0+Z2V0U3BlY2lhbGl6YXRpb25LaW5kKCkpIHsKLSAgICAvLyBWaXNpdCB0aGUgaW1wbGljaXQgaW5zdGFudGlhdGlvbnMgd2l0aCB0aGUgcmVxdWVzdGVkIHBhdHRlcm4uCi0gICAgY2FzZSBUU0tfVW5kZWNsYXJlZDoKLSAgICBjYXNlIFRTS19JbXBsaWNpdEluc3RhbnRpYXRpb246Ci0gICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKFNEKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgb24gYW4gZXhwbGljaXQgaW5zdGFudGlhdGlvbgotICAgIC8vIG9yIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGJlY2F1c2UgdGhlcmUgd2lsbCBiZSBhbiBleHBsaWNpdAotICAgIC8vIG5vZGUgZm9yIGl0IGVsc2V3aGVyZS4KLSAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWNsYXJhdGlvbjoKLSAgICBjYXNlIFRTS19FeHBsaWNpdEluc3RhbnRpYXRpb25EZWZpbml0aW9uOgotICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotREVGX1RSQVZFUlNFX0RFQ0woCi0gICAgVmFyVGVtcGxhdGVEZWNsLAotICAgIHsKLSAgVmFyRGVjbCAqVGVtcERlY2wgPSBELT5nZXRUZW1wbGF0ZWREZWNsKCk7Ci0gIFRSWV9UTyhUcmF2ZXJzZURlY2woVGVtcERlY2wpKTsKLSAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVQYXJhbWV0ZXJMaXN0SGVscGVyKEQtPmdldFRlbXBsYXRlUGFyYW1ldGVycygpKSk7Ci0KLSAgLy8gQnkgZGVmYXVsdCwgd2UgZG8gbm90IHRyYXZlcnNlIHRoZSBpbnN0YW50aWF0aW9ucyBvZgotICAvLyB2YXJpYWJsZSB0ZW1wbGF0ZXMgc2luY2UgdGhleSBkbyBub3QgYXBwZWFyIGluIHRoZSB1c2VyIGNvZGUuIFRoZQotICAvLyBmb2xsb3dpbmcgY29kZSBvcHRpb25hbGx5IHRyYXZlcnNlcyB0aGVtLgotICAvLwotICAvLyBXZSBvbmx5IHRyYXZlcnNlIHRoZSB2YXJpYWJsZSBpbnN0YW50aWF0aW9ucyB3aGVuIHdlIHNlZSB0aGUgY2Fub25pY2FsCi0gIC8vIGRlY2xhcmF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSwgdG8gZW5zdXJlIHdlIG9ubHkgdmlzaXQgdGhlbSBvbmNlLgotICBpZiAoZ2V0RGVyaXZlZCgpLnNob3VsZFZpc2l0VGVtcGxhdGVJbnN0YW50aWF0aW9ucygpICYmCi0gICAgICBEID09IEQtPmdldENhbm9uaWNhbERlY2woKSkKLSAgICBUUllfVE8oVHJhdmVyc2VWYXJpYWJsZUluc3RhbnRpYXRpb25zKEQpKTsKLQotICAgICAgLy8gTm90ZSB0aGF0IGdldEluc3RhbnRpYXRlZEZyb21NZW1iZXJUZW1wbGF0ZSgpIGlzIGp1c3QgYSBsaW5rCi0gICAgICAvLyBmcm9tIGEgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBiYWNrIHRvIHRoZSB0ZW1wbGF0ZSBmcm9tIHdoaWNoCi0gICAgICAvLyBpdCB3YXMgaW5zdGFudGlhdGVkLCBhbmQgdGh1cyBzaG91bGQgbm90IGJlIHRyYXZlcnNlZC4KLX0pCi0KLS8vIEEgaGVscGVyIG1ldGhvZCBmb3IgdHJhdmVyc2luZyB0aGUgaW5zdGFudGlhdGlvbnMgb2YgYQotLy8gZnVuY3Rpb24gd2hpbGUgc2tpcHBpbmcgaXRzIHNwZWNpYWxpemF0aW9ucy4KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlRnVuY3Rpb25JbnN0YW50aWF0aW9ucygKLSAgICBGdW5jdGlvblRlbXBsYXRlRGVjbCAqRCkgewotICBGdW5jdGlvblRlbXBsYXRlRGVjbDo6c3BlY19pdGVyYXRvciBlbmQgPSBELT5zcGVjX2VuZCgpOwotICBmb3IgKEZ1bmN0aW9uVGVtcGxhdGVEZWNsOjpzcGVjX2l0ZXJhdG9yIGl0ID0gRC0+c3BlY19iZWdpbigpOyBpdCAhPSBlbmQ7Ci0gICAgICAgKytpdCkgewotICAgIEZ1bmN0aW9uRGVjbCogRkQgPSAqaXQ7Ci0gICAgc3dpdGNoIChGRC0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSkgewotICAgIGNhc2UgVFNLX1VuZGVjbGFyZWQ6Ci0gICAgY2FzZSBUU0tfSW1wbGljaXRJbnN0YW50aWF0aW9uOgotICAgICAgLy8gV2UgZG9uJ3Qga25vdyB3aGF0IGtpbmQgb2YgRnVuY3Rpb25EZWNsIHRoaXMgaXMuCi0gICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKEZEKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8vIE5vIG5lZWQgdG8gdmlzaXQgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMsIHdlJ2xsIGZpbmQgdGhlIG5vZGUKLSAgICAvLyBldmVudHVhbGx5LgotICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlY2xhcmF0aW9uOgotICAgIGNhc2UgVFNLX0V4cGxpY2l0SW5zdGFudGlhdGlvbkRlZmluaXRpb246Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVFNLX0V4cGxpY2l0U3BlY2lhbGl6YXRpb246Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotREVGX1RSQVZFUlNFX0RFQ0woRnVuY3Rpb25UZW1wbGF0ZURlY2wsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VEZWNsKEQtPmdldFRlbXBsYXRlZERlY2woKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlUGFyYW1ldGVyTGlzdEhlbHBlcihELT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSkpOwotCi0gICAgLy8gQnkgZGVmYXVsdCwgd2UgZG8gbm90IHRyYXZlcnNlIHRoZSBpbnN0YW50aWF0aW9ucyBvZgotICAgIC8vIGZ1bmN0aW9uIHRlbXBsYXRlcyBzaW5jZSB0aGV5IGRvIG5vdCBhcHBlYXIgaW4gdGhlIHVzZXIgY29kZS4gVGhlCi0gICAgLy8gZm9sbG93aW5nIGNvZGUgb3B0aW9uYWxseSB0cmF2ZXJzZXMgdGhlbS4KLSAgICAvLwotICAgIC8vIFdlIG9ubHkgdHJhdmVyc2UgdGhlIGZ1bmN0aW9uIGluc3RhbnRpYXRpb25zIHdoZW4gd2Ugc2VlIHRoZSBjYW5vbmljYWwKLSAgICAvLyBkZWNsYXJhdGlvbiBvZiB0aGUgdGVtcGxhdGUsIHRvIGVuc3VyZSB3ZSBvbmx5IHZpc2l0IHRoZW0gb25jZS4KLSAgICBpZiAoZ2V0RGVyaXZlZCgpLnNob3VsZFZpc2l0VGVtcGxhdGVJbnN0YW50aWF0aW9ucygpICYmCi0gICAgICAgIEQgPT0gRC0+Z2V0Q2Fub25pY2FsRGVjbCgpKQotICAgICAgVFJZX1RPKFRyYXZlcnNlRnVuY3Rpb25JbnN0YW50aWF0aW9ucyhEKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKFRlbXBsYXRlVGVtcGxhdGVQYXJtRGVjbCwgewotICAgIC8vIEQgaXMgdGhlICJUIiBpbiBzb21ldGhpbmcgbGlrZQotICAgIC8vICAgdGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgVD4gY2xhc3MgY29udGFpbmVyIHsgfTsKLSAgICBUUllfVE8oVHJhdmVyc2VEZWNsKEQtPmdldFRlbXBsYXRlZERlY2woKSkpOwotICAgIGlmIChELT5oYXNEZWZhdWx0QXJndW1lbnQoKSkgewotICAgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvYyhELT5nZXREZWZhdWx0QXJndW1lbnQoKSkpOwotICAgIH0KLSAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZVBhcmFtZXRlckxpc3RIZWxwZXIoRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woVGVtcGxhdGVUeXBlUGFybURlY2wsIHsKLSAgICAvLyBEIGlzIHRoZSAiVCIgaW4gc29tZXRoaW5nIGxpa2UgInRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIHZlY3RvcjsiCi0gICAgaWYgKEQtPmdldFR5cGVGb3JEZWNsKCkpCi0gICAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFF1YWxUeXBlKEQtPmdldFR5cGVGb3JEZWNsKCksIDApKSk7Ci0gICAgaWYgKEQtPmhhc0RlZmF1bHRBcmd1bWVudCgpKQotICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhELT5nZXREZWZhdWx0QXJndW1lbnRJbmZvKCktPmdldFR5cGVMb2MoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChUeXBlZGVmRGVjbCwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Ci0gICAgLy8gV2Ugc2hvdWxkbid0IHRyYXZlcnNlIEQtPmdldFR5cGVGb3JEZWNsKCk7IGl0J3MgYSByZXN1bHQgb2YKLSAgICAvLyBkZWNsYXJpbmcgdGhlIHR5cGVkZWYsIG5vdCBzb21ldGhpbmcgdGhhdCB3YXMgd3JpdHRlbiBpbiB0aGUKLSAgICAvLyBzb3VyY2UuCi0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKFR5cGVBbGlhc0RlY2wsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKEQtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOwotICAgIC8vIFdlIHNob3VsZG4ndCB0cmF2ZXJzZSBELT5nZXRUeXBlRm9yRGVjbCgpOyBpdCdzIGEgcmVzdWx0IG9mCi0gICAgLy8gZGVjbGFyaW5nIHRoZSB0eXBlIGFsaWFzLCBub3Qgc29tZXRoaW5nIHRoYXQgd2FzIHdyaXR0ZW4gaW4gdGhlCi0gICAgLy8gc291cmNlLgotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChUeXBlQWxpYXNUZW1wbGF0ZURlY2wsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VEZWNsKEQtPmdldFRlbXBsYXRlZERlY2woKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlUGFyYW1ldGVyTGlzdEhlbHBlcihELT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wsIHsKLSAgICAvLyBBIGRlcGVuZGVudCB1c2luZyBkZWNsYXJhdGlvbiB3aGljaCB3YXMgbWFya2VkIHdpdGggJ3R5cGVuYW1lJy4KLSAgICAvLyAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEEgOiBwdWJsaWMgQjxUPiB7IHVzaW5nIHR5cGVuYW1lIEI8VD46OmZvbzsgfTsKLSAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7Ci0gICAgLy8gV2Ugc2hvdWxkbid0IHRyYXZlcnNlIEQtPmdldFR5cGVGb3JEZWNsKCk7IGl0J3MgYSByZXN1bHQgb2YKLSAgICAvLyBkZWNsYXJpbmcgdGhlIHR5cGUsIG5vdCBzb21ldGhpbmcgdGhhdCB3YXMgd3JpdHRlbiBpbiB0aGUKLSAgICAvLyBzb3VyY2UuCi0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKEVudW1EZWNsLCB7Ci0gICAgaWYgKEQtPmdldFR5cGVGb3JEZWNsKCkpCi0gICAgICBUUllfVE8oVHJhdmVyc2VUeXBlKFF1YWxUeXBlKEQtPmdldFR5cGVGb3JEZWNsKCksIDApKSk7Ci0KLSAgICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7Ci0gICAgLy8gVGhlIGVudW1lcmF0b3JzIGFyZSBhbHJlYWR5IHRyYXZlcnNlZCBieQotICAgIC8vIGRlY2xzX2JlZ2luKCkvZGVjbHNfZW5kKCkuCi0gIH0pCi0KLQotLy8gSGVscGVyIG1ldGhvZHMgZm9yIFJlY29yZERlY2wgYW5kIGl0cyBjaGlsZHJlbi4KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlUmVjb3JkSGVscGVyKAotICAgIFJlY29yZERlY2wgKkQpIHsKLSAgLy8gV2Ugc2hvdWxkbid0IHRyYXZlcnNlIEQtPmdldFR5cGVGb3JEZWNsKCk7IGl0J3MgYSByZXN1bHQgb2YKLSAgLy8gZGVjbGFyaW5nIHRoZSB0eXBlLCBub3Qgc29tZXRoaW5nIHRoYXQgd2FzIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZS4KLQotICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZUNYWFJlY29yZEhlbHBlcigKLSAgICBDWFhSZWNvcmREZWNsICpEKSB7Ci0gIGlmICghVHJhdmVyc2VSZWNvcmRIZWxwZXIoRCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoRC0+aXNDb21wbGV0ZURlZmluaXRpb24oKSkgewotICAgIGZvciAoQ1hYUmVjb3JkRGVjbDo6YmFzZV9jbGFzc19pdGVyYXRvciBJID0gRC0+YmFzZXNfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IEQtPmJhc2VzX2VuZCgpOwotICAgICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoSS0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Ci0gICAgfQotICAgIC8vIFdlIGRvbid0IHRyYXZlcnNlIHRoZSBmcmllbmRzIG9yIHRoZSBjb252ZXJzaW9ucywgYXMgdGhleSBhcmUKLSAgICAvLyBhbHJlYWR5IGluIGRlY2xzX2JlZ2luKCkvZGVjbHNfZW5kKCkuCi0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLURFRl9UUkFWRVJTRV9ERUNMKFJlY29yZERlY2wsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VSZWNvcmRIZWxwZXIoRCkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChDWFhSZWNvcmREZWNsLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlQ1hYUmVjb3JkSGVscGVyKEQpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbCwgewotICAgIC8vIEZvciBpbXBsaWNpdCBpbnN0YW50aWF0aW9ucyAoInNldDxpbnQ+IHg7IiksIHdlIGRvbid0IHdhbnQgdG8KLSAgICAvLyByZWN1cnNlIGF0IGFsbCwgc2luY2UgdGhlIGluc3RhdGlhdGVkIGNsYXNzIGlzbid0IHdyaXR0ZW4gaW4KLSAgICAvLyB0aGUgc291cmNlIGNvZGUgYW55d2hlcmUuICAoTm90ZSB0aGUgaW5zdGF0aWF0ZWQgKnR5cGUqIC0tCi0gICAgLy8gc2V0PGludD4gLS0gaXMgd3JpdHRlbiwgYW5kIHdpbGwgc3RpbGwgZ2V0IGEgY2FsbGJhY2sgb2YKLSAgICAvLyBUZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZSkuICBGb3IgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMKLSAgICAvLyAoInRlbXBsYXRlIHNldDxpbnQ+OyIpLCB3ZSBkbyBuZWVkIGEgY2FsbGJhY2ssIHNpbmNlIHRoaXMKLSAgICAvLyBpcyB0aGUgb25seSBjYWxsYmFjayB0aGF0J3MgbWFkZSBmb3IgdGhpcyBpbnN0YW50aWF0aW9uLgotICAgIC8vIFdlIHVzZSBnZXRUeXBlQXNXcml0dGVuKCkgdG8gZGlzdGluZ3Vpc2guCi0gICAgaWYgKFR5cGVTb3VyY2VJbmZvICpUU0kgPSBELT5nZXRUeXBlQXNXcml0dGVuKCkpCi0gICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRTSS0+Z2V0VHlwZUxvYygpKSk7Ci0KLSAgICBpZiAoIWdldERlcml2ZWQoKS5zaG91bGRWaXNpdFRlbXBsYXRlSW5zdGFudGlhdGlvbnMoKSAmJgotICAgICAgICBELT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpICE9IFRTS19FeHBsaWNpdFNwZWNpYWxpemF0aW9uKQotICAgICAgLy8gUmV0dXJuaW5nIGZyb20gaGVyZSBza2lwcyB0cmF2ZXJzaW5nIHRoZQotICAgICAgLy8gZGVjbGFyYXRpb24gY29udGV4dCBvZiB0aGUgQ2xhc3NUZW1wbGF0ZVNwZWNpYWxpemF0aW9uRGVjbAotICAgICAgLy8gKGVtYmVkZGVkIGluIHRoZSBERUZfVFJBVkVSU0VfREVDTCgpIG1hY3JvKQotICAgICAgLy8gd2hpY2ggY29udGFpbnMgdGhlIGluc3RhbnRpYXRlZCBtZW1iZXJzIG9mIHRoZSBjbGFzcy4KLSAgICAgIHJldHVybiB0cnVlOwotICB9KQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcigKLSAgICBjb25zdCBUZW1wbGF0ZUFyZ3VtZW50TG9jICpUQUwsIHVuc2lnbmVkIENvdW50KSB7Ci0gIGZvciAodW5zaWduZWQgSSA9IDA7IEkgPCBDb3VudDsgKytJKSB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvYyhUQUxbSV0pKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotREVGX1RSQVZFUlNFX0RFQ0woQ2xhc3NUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkRlY2wsIHsKLSAgICAvLyBUaGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4KLSAgICBpZiAoVGVtcGxhdGVQYXJhbWV0ZXJMaXN0ICpUUEwgPSBELT5nZXRUZW1wbGF0ZVBhcmFtZXRlcnMoKSkgewotICAgICAgZm9yIChUZW1wbGF0ZVBhcmFtZXRlckxpc3Q6Oml0ZXJhdG9yIEkgPSBUUEwtPmJlZ2luKCksIEUgPSBUUEwtPmVuZCgpOwotICAgICAgICAgICBJICE9IEU7ICsrSSkgewotICAgICAgICBUUllfVE8oVHJhdmVyc2VEZWNsKCpJKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFRoZSBhcmdzIHRoYXQgcmVtYWlucyB1bnNwZWNpYWxpemVkLgotICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2NzSGVscGVyKAotICAgICAgICAgICAgICAgICAgICAgICBELT5nZXRUZW1wbGF0ZUFyZ3NBc1dyaXR0ZW4oKS0+Z2V0VGVtcGxhdGVBcmdzKCksCi0gICAgICAgICAgICAgICAgICAgICAgIEQtPmdldFRlbXBsYXRlQXJnc0FzV3JpdHRlbigpLT5OdW1UZW1wbGF0ZUFyZ3MpKTsKLQotICAgIC8vIERvbid0IG5lZWQgdGhlIENsYXNzVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25IZWxwZXIsIGV2ZW4KLSAgICAvLyB0aG91Z2ggdGhhdCdzIG91ciBwYXJlbnQgY2xhc3MgLS0gd2UgYWxyZWFkeSB2aXNpdCBhbGwgdGhlCi0gICAgLy8gdGVtcGxhdGUgYXJncyBoZXJlLgotICAgIFRSWV9UTyhUcmF2ZXJzZUNYWFJlY29yZEhlbHBlcihEKSk7Ci0KLSAgICAvLyBJbnN0YW50aWF0aW9ucyB3aWxsIGhhdmUgYmVlbiB2aXNpdGVkIHdpdGggdGhlIHByaW1hcnkgdGVtcGxhdGUuCi0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKEVudW1Db25zdGFudERlY2wsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEluaXRFeHByKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woVW5yZXNvbHZlZFVzaW5nVmFsdWVEZWNsLCB7Ci0gICAgLy8gTGlrZSBVbnJlc29sdmVkVXNpbmdUeXBlbmFtZURlY2wsIGJ1dCB3aXRob3V0IHRoZSAndHlwZW5hbWUnOgotICAgIC8vICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBDbGFzcyBBIDogcHVibGljIEJhc2U8VD4geyB1c2luZyBCYXNlPFQ+Ojpmb287IH07Ci0gICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhELT5nZXRRdWFsaWZpZXJMb2MoKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0aW9uTmFtZUluZm8oRC0+Z2V0TmFtZUluZm8oKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChJbmRpcmVjdEZpZWxkRGVjbCwge30pCi0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlRyYXZlcnNlRGVjbGFyYXRvckhlbHBlcihEZWNsYXJhdG9yRGVjbCAqRCkgewotICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7Ci0gIGlmIChELT5nZXRUeXBlU291cmNlSW5mbygpKQotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Ci0gIGVsc2UKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlKEQtPmdldFR5cGUoKSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotREVGX1RSQVZFUlNFX0RFQ0woRmllbGREZWNsLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRvckhlbHBlcihEKSk7Ci0gICAgaWYgKEQtPmlzQml0RmllbGQoKSkKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0Qml0V2lkdGgoKSkpOwotICAgIGVsc2UgaWYgKEQtPmhhc0luQ2xhc3NJbml0aWFsaXplcigpKQotICAgICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXRJbkNsYXNzSW5pdGlhbGl6ZXIoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChNU1Byb3BlcnR5RGVjbCwgewotICAgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0b3JIZWxwZXIoRCkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChPYmpDQXREZWZzRmllbGREZWNsLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRvckhlbHBlcihEKSk7Ci0gICAgaWYgKEQtPmlzQml0RmllbGQoKSkKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0Qml0V2lkdGgoKSkpOwotICAgIC8vIEZJWE1FOiBpbXBsZW1lbnQgdGhlIHJlc3QuCi0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKE9iakNJdmFyRGVjbCwgewotICAgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0b3JIZWxwZXIoRCkpOwotICAgIGlmIChELT5pc0JpdEZpZWxkKCkpCi0gICAgICBUUllfVE8oVHJhdmVyc2VTdG10KEQtPmdldEJpdFdpZHRoKCkpKTsKLSAgICAvLyBGSVhNRTogaW1wbGVtZW50IHRoZSByZXN0LgotICB9KQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZUZ1bmN0aW9uSGVscGVyKEZ1bmN0aW9uRGVjbCAqRCkgewotICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKEQtPmdldFF1YWxpZmllckxvYygpKSk7Ci0gIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0aW9uTmFtZUluZm8oRC0+Z2V0TmFtZUluZm8oKSkpOwotCi0gIC8vIElmIHdlJ3JlIGFuIGV4cGxpY2l0IHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCBpdGVyYXRlIG92ZXIgdGhlCi0gIC8vIHRlbXBsYXRlIGFyZ3MgdGhhdCB3ZXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLiAgSWYgd2Ugd2VyZSBkb2luZwotICAvLyB0aGlzIGluIHR5cGluZyBvcmRlciwgd2UnZCBkbyBpdCBiZXR3ZWVuIHRoZSByZXR1cm4gdHlwZSBhbmQKLSAgLy8gdGhlIGZ1bmN0aW9uIGFyZ3MsIGJ1dCBib3RoIGFyZSBoYW5kbGVkIGJ5IHRoZSBGdW5jdGlvblR5cGVMb2MKLSAgLy8gYWJvdmUsIHNvIHdlIGhhdmUgdG8gY2hvb3NlIG9uZSBzaWRlLiAgSSd2ZSBkZWNpZGVkIHRvIGRvIGJlZm9yZS4KLSAgaWYgKGNvbnN0IEZ1bmN0aW9uVGVtcGxhdGVTcGVjaWFsaXphdGlvbkluZm8gKkZUU0kgPQotICAgICAgRC0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbkluZm8oKSkgewotICAgIGlmIChGVFNJLT5nZXRUZW1wbGF0ZVNwZWNpYWxpemF0aW9uS2luZCgpICE9IFRTS19VbmRlY2xhcmVkICYmCi0gICAgICAgIEZUU0ktPmdldFRlbXBsYXRlU3BlY2lhbGl6YXRpb25LaW5kKCkgIT0gVFNLX0ltcGxpY2l0SW5zdGFudGlhdGlvbikgewotICAgICAgLy8gQSBzcGVjaWFsaXphdGlvbiBtaWdodCBub3QgaGF2ZSBleHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudHMgaWYgaXQgaGFzCi0gICAgICAvLyBhIHRlbXBsYXRlZCByZXR1cm4gdHlwZSBhbmQgY29uY3JldGUgYXJndW1lbnRzLgotICAgICAgaWYgKGNvbnN0IEFTVFRlbXBsYXRlQXJndW1lbnRMaXN0SW5mbyAqVEFMSSA9Ci0gICAgICAgICAgRlRTSS0+VGVtcGxhdGVBcmd1bWVudHNBc1dyaXR0ZW4pIHsKLSAgICAgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvY3NIZWxwZXIoVEFMSS0+Z2V0VGVtcGxhdGVBcmdzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTEktPk51bVRlbXBsYXRlQXJncykpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFZpc2l0IHRoZSBmdW5jdGlvbiB0eXBlIGl0c2VsZiwgd2hpY2ggY2FuIGJlIGVpdGhlcgotICAvLyBGdW5jdGlvbk5vUHJvdG9UeXBlIG9yIEZ1bmN0aW9uUHJvdG9UeXBlLCBvciBhIHR5cGVkZWYuICBUaGlzCi0gIC8vIGFsc28gY292ZXJzIHRoZSByZXR1cm4gdHlwZSBhbmQgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMsCi0gIC8vIGluY2x1ZGluZyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMuCi0gIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoRC0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Ci0KLSAgaWYgKENYWENvbnN0cnVjdG9yRGVjbCAqQ3RvciA9IGR5bl9jYXN0PENYWENvbnN0cnVjdG9yRGVjbD4oRCkpIHsKLSAgICAvLyBDb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCi0gICAgZm9yIChDWFhDb25zdHJ1Y3RvckRlY2w6OmluaXRfaXRlcmF0b3IgSSA9IEN0b3ItPmluaXRfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gQ3Rvci0+aW5pdF9lbmQoKTsKLSAgICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgICBUUllfVE8oVHJhdmVyc2VDb25zdHJ1Y3RvckluaXRpYWxpemVyKCpJKSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKEQtPmlzVGhpc0RlY2xhcmF0aW9uQURlZmluaXRpb24oKSkgewotICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0Qm9keSgpKSk7ICAvLyBGdW5jdGlvbiBib2R5LgotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ERUZfVFJBVkVSU0VfREVDTChGdW5jdGlvbkRlY2wsIHsKLSAgICAvLyBXZSBza2lwIGRlY2xzX2JlZ2luL2RlY2xzX2VuZCwgd2hpY2ggYXJlIGFscmVhZHkgY292ZXJlZCBieQotICAgIC8vIFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoKS4KLSAgICByZXR1cm4gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcihEKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woQ1hYTWV0aG9kRGVjbCwgewotICAgIC8vIFdlIHNraXAgZGVjbHNfYmVnaW4vZGVjbHNfZW5kLCB3aGljaCBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5Ci0gICAgLy8gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcigpLgotICAgIHJldHVybiBUcmF2ZXJzZUZ1bmN0aW9uSGVscGVyKEQpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChDWFhDb25zdHJ1Y3RvckRlY2wsIHsKLSAgICAvLyBXZSBza2lwIGRlY2xzX2JlZ2luL2RlY2xzX2VuZCwgd2hpY2ggYXJlIGFscmVhZHkgY292ZXJlZCBieQotICAgIC8vIFRyYXZlcnNlRnVuY3Rpb25IZWxwZXIoKS4KLSAgICByZXR1cm4gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcihEKTsKLSAgfSkKLQotLy8gQ1hYQ29udmVyc2lvbkRlY2wgaXMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yLgotLy8gSXQncyBub3QgYSBjYXN0IGV4cHJlc3Npb24uCi1ERUZfVFJBVkVSU0VfREVDTChDWFhDb252ZXJzaW9uRGVjbCwgewotICAgIC8vIFdlIHNraXAgZGVjbHNfYmVnaW4vZGVjbHNfZW5kLCB3aGljaCBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5Ci0gICAgLy8gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcigpLgotICAgIHJldHVybiBUcmF2ZXJzZUZ1bmN0aW9uSGVscGVyKEQpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChDWFhEZXN0cnVjdG9yRGVjbCwgewotICAgIC8vIFdlIHNraXAgZGVjbHNfYmVnaW4vZGVjbHNfZW5kLCB3aGljaCBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5Ci0gICAgLy8gVHJhdmVyc2VGdW5jdGlvbkhlbHBlcigpLgotICAgIHJldHVybiBUcmF2ZXJzZUZ1bmN0aW9uSGVscGVyKEQpOwotICB9KQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZVZhckhlbHBlcihWYXJEZWNsICpEKSB7Ci0gIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0b3JIZWxwZXIoRCkpOwotICAvLyBEZWZhdWx0IHBhcmFtcyBhcmUgdGFrZW4gY2FyZSBvZiB3aGVuIHdlIHRyYXZlcnNlIHRoZSBQYXJtVmFyRGVjbC4KLSAgaWYgKCFpc2E8UGFybVZhckRlY2w+KEQpKQotICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0SW5pdCgpKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ERUZfVFJBVkVSU0VfREVDTChWYXJEZWNsLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVmFySGVscGVyKEQpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wsIHsKLSAgLy8gRm9yIGltcGxpY2l0IGluc3RhbnRpYXRpb25zLCB3ZSBkb24ndCB3YW50IHRvCi0gIC8vIHJlY3Vyc2UgYXQgYWxsLCBzaW5jZSB0aGUgaW5zdGF0aWF0ZWQgY2xhc3MgaXNuJ3Qgd3JpdHRlbiBpbgotICAvLyB0aGUgc291cmNlIGNvZGUgYW55d2hlcmUuCi0gIGlmIChUeXBlU291cmNlSW5mbyAqVFNJID0gRC0+Z2V0VHlwZUFzV3JpdHRlbigpKQotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoVFNJLT5nZXRUeXBlTG9jKCkpKTsKLQotICBpZiAoIWdldERlcml2ZWQoKS5zaG91bGRWaXNpdFRlbXBsYXRlSW5zdGFudGlhdGlvbnMoKSAmJgotICAgICAgRC0+Z2V0VGVtcGxhdGVTcGVjaWFsaXphdGlvbktpbmQoKSAhPSBUU0tfRXhwbGljaXRTcGVjaWFsaXphdGlvbikKLSAgICAvLyBSZXR1cm5pbmcgZnJvbSBoZXJlIHNraXBzIHRyYXZlcnNpbmcgdGhlCi0gICAgLy8gZGVjbGFyYXRpb24gY29udGV4dCBvZiB0aGUgVmFyVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2wKLSAgICAvLyAoZW1iZWRkZWQgaW4gdGhlIERFRl9UUkFWRVJTRV9ERUNMKCkgbWFjcm8pLgotICAgIHJldHVybiB0cnVlOwotfSkKLQotREVGX1RSQVZFUlNFX0RFQ0woVmFyVGVtcGxhdGVQYXJ0aWFsU3BlY2lhbGl6YXRpb25EZWNsLAotICAgICAgICAgICAgICAgICAgewotICAvLyBUaGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4KLSAgaWYgKFRlbXBsYXRlUGFyYW1ldGVyTGlzdCAqVFBMID0gRC0+Z2V0VGVtcGxhdGVQYXJhbWV0ZXJzKCkpIHsKLSAgICBmb3IgKFRlbXBsYXRlUGFyYW1ldGVyTGlzdDo6aXRlcmF0b3IgSSA9IFRQTC0+YmVnaW4oKSwgRSA9IFRQTC0+ZW5kKCk7Ci0gICAgICAgICBJICE9IEU7ICsrSSkgewotICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbCgqSSkpOwotICAgIH0KLSAgfQotICAvLyBUaGUgYXJncyB0aGF0IHJlbWFpbnMgdW5zcGVjaWFsaXplZC4KLSAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvY3NIZWxwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgRC0+Z2V0VGVtcGxhdGVBcmdzQXNXcml0dGVuKCktPmdldFRlbXBsYXRlQXJncygpLAotICAgICAgICAgICAgICAgICAgICAgICAgIEQtPmdldFRlbXBsYXRlQXJnc0FzV3JpdHRlbigpLT5OdW1UZW1wbGF0ZUFyZ3MpKTsKLQotICAvLyBEb24ndCBuZWVkIHRoZSBWYXJUZW1wbGF0ZVBhcnRpYWxTcGVjaWFsaXphdGlvbkhlbHBlciwgZXZlbgotICAvLyB0aG91Z2ggdGhhdCdzIG91ciBwYXJlbnQgY2xhc3MgLS0gd2UgYWxyZWFkeSB2aXNpdCBhbGwgdGhlCi0gIC8vIHRlbXBsYXRlIGFyZ3MgaGVyZS4KLSAgVFJZX1RPKFRyYXZlcnNlVmFySGVscGVyKEQpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBJbnN0YW50aWF0aW9ucyB3aWxsIGhhdmUgYmVlbiB2aXNpdGVkIHdpdGggdGhlIHByaW1hcnkKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUuCi19KQotCi1ERUZfVFJBVkVSU0VfREVDTChJbXBsaWNpdFBhcmFtRGVjbCwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVZhckhlbHBlcihEKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9ERUNMKE5vblR5cGVUZW1wbGF0ZVBhcm1EZWNsLCB7Ci0gICAgLy8gQSBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGUuZy4gIlMiIGluIHRlbXBsYXRlPGludCBTPiBjbGFzcyBGb28gLi4uCi0gICAgVFJZX1RPKFRyYXZlcnNlRGVjbGFyYXRvckhlbHBlcihEKSk7Ci0gICAgVFJZX1RPKFRyYXZlcnNlU3RtdChELT5nZXREZWZhdWx0QXJndW1lbnQoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfREVDTChQYXJtVmFyRGVjbCwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVZhckhlbHBlcihEKSk7Ci0KLSAgICBpZiAoRC0+aGFzRGVmYXVsdEFyZygpICYmCi0gICAgICAgIEQtPmhhc1VuaW5zdGFudGlhdGVkRGVmYXVsdEFyZygpICYmCi0gICAgICAgICFELT5oYXNVbnBhcnNlZERlZmF1bHRBcmcoKSkKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0VW5pbnN0YW50aWF0ZWREZWZhdWx0QXJnKCkpKTsKLQotICAgIGlmIChELT5oYXNEZWZhdWx0QXJnKCkgJiYKLSAgICAgICAgIUQtPmhhc1VuaW5zdGFudGlhdGVkRGVmYXVsdEFyZygpICYmCi0gICAgICAgICFELT5oYXNVbnBhcnNlZERlZmF1bHRBcmcoKSkKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVN0bXQoRC0+Z2V0RGVmYXVsdEFyZygpKSk7Ci0gIH0pCi0KLSN1bmRlZiBERUZfVFJBVkVSU0VfREVDTAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLSBTdG10IHRyYXZlcnNhbCAtLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEZvciBzdG10cywgd2UgYXV0b21hdGUgKGluIHRoZSBERUZfVFJBVkVSU0VfU1RNVCBtYWNybykgaXRlcmF0aW5nCi0vLyBvdmVyIHRoZSBjaGlsZHJlbiBkZWZpbmVkIGluIGNoaWxkcmVuKCkgKGV2ZXJ5IHN0bXQgZGVmaW5lcyB0aGVzZSwKLS8vIHRob3VnaCBzb21ldGltZXMgdGhlIHJhbmdlIGlzIGVtcHR5KS4gIEVhY2ggaW5kaXZpZHVhbCBUcmF2ZXJzZSoKLS8vIG1ldGhvZCBvbmx5IG5lZWRzIHRvIHdvcnJ5IGFib3V0IGNoaWxkcmVuIG90aGVyIHRoYW4gdGhvc2UuICBUbyBzZWUKLS8vIHdoYXQgY2hpbGRyZW4oKSBkb2VzIGZvciBhIGdpdmVuIGNsYXNzLCBzZWUsIGUuZy4sCi0vLyAgIGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb3h5Z2VuL1N0bXRfOGNwcF9zb3VyY2UuaHRtbAotCi0vLyBUaGlzIG1hY3JvIG1ha2VzIGF2YWlsYWJsZSBhIHZhcmlhYmxlIFMsIHRoZSBwYXNzZWQtaW4gc3RtdC4KLSNkZWZpbmUgREVGX1RSQVZFUlNFX1NUTVQoU1RNVCwgQ09ERSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2UjI1NUTVQgKFNUTVQgKlMpIHsgICAgICAgICAgIFwKLSAgVFJZX1RPKFdhbGtVcEZyb20jI1NUTVQoUykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU3RtdFF1ZXVlQWN0aW9uIFN0bXRRdWV1ZSgqdGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyBDT0RFOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZm9yIChTdG10OjpjaGlsZF9yYW5nZSByYW5nZSA9IFMtPmNoaWxkcmVuKCk7IHJhbmdlOyArK3JhbmdlKSB7ICAgICAgIFwKLSAgICBTdG10UXVldWUucXVldWUoKnJhbmdlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotREVGX1RSQVZFUlNFX1NUTVQoR0NDQXNtU3RtdCwgewotICAgIFN0bXRRdWV1ZS5xdWV1ZShTLT5nZXRBc21TdHJpbmcoKSk7Ci0gICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IFMtPmdldE51bUlucHV0cygpOyBJIDwgRTsgKytJKSB7Ci0gICAgICBTdG10UXVldWUucXVldWUoUy0+Z2V0SW5wdXRDb25zdHJhaW50TGl0ZXJhbChJKSk7Ci0gICAgfQotICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBTLT5nZXROdW1PdXRwdXRzKCk7IEkgPCBFOyArK0kpIHsKLSAgICAgIFN0bXRRdWV1ZS5xdWV1ZShTLT5nZXRPdXRwdXRDb25zdHJhaW50TGl0ZXJhbChJKSk7Ci0gICAgfQotICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBTLT5nZXROdW1DbG9iYmVycygpOyBJIDwgRTsgKytJKSB7Ci0gICAgICBTdG10UXVldWUucXVldWUoUy0+Z2V0Q2xvYmJlclN0cmluZ0xpdGVyYWwoSSkpOwotICAgIH0KLSAgICAvLyBjaGlsZHJlbigpIGl0ZXJhdGVzIG92ZXIgaW5wdXRFeHByIGFuZCBvdXRwdXRFeHByLgotICB9KQotCi1ERUZfVFJBVkVSU0VfU1RNVChNU0FzbVN0bXQsIHsKLSAgICAvLyBGSVhNRTogTVMgQXNtIGRvZXNuJ3QgY3VycmVudGx5IHBhcnNlIENvbnN0cmFpbnRzLCBDbG9iYmVycywgZXRjLiAgT25jZQotICAgIC8vIGFkZGVkIHRoaXMgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQuCi0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKENYWENhdGNoU3RtdCwgewotICAgIFRSWV9UTyhUcmF2ZXJzZURlY2woUy0+Z2V0RXhjZXB0aW9uRGVjbCgpKSk7Ci0gICAgLy8gY2hpbGRyZW4oKSBpdGVyYXRlcyBvdmVyIHRoZSBoYW5kbGVyIGJsb2NrLgotICB9KQotCi1ERUZfVFJBVkVSU0VfU1RNVChEZWNsU3RtdCwgewotICAgIGZvciAoRGVjbFN0bXQ6OmRlY2xfaXRlcmF0b3IgSSA9IFMtPmRlY2xfYmVnaW4oKSwgRSA9IFMtPmRlY2xfZW5kKCk7Ci0gICAgICAgICBJICE9IEU7ICsrSSkgewotICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbCgqSSkpOwotICAgIH0KLSAgICAvLyBTdXBwcmVzcyB0aGUgZGVmYXVsdCBpdGVyYXRpb24gb3ZlciBjaGlsZHJlbigpIGJ5Ci0gICAgLy8gcmV0dXJuaW5nLiAgSGVyZSdzIHdoeTogQSBEZWNsU3RtdCBsb29rcyBsaWtlICd0eXBlIHZhciBbPQotICAgIC8vIGluaXRpYWxpemVyXScuICBUaGUgZGVjbHMgYWJvdmUgYWxyZWFkeSB0cmF2ZXJzZSBvdmVyIHRoZQotICAgIC8vIGluaXRpYWxpemVycywgc28gd2UgZG9uJ3QgaGF2ZSB0byBkbyBpdCBhZ2FpbiAod2hpY2gKLSAgICAvLyBjaGlsZHJlbigpIHdvdWxkIGRvKS4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSkKLQotCi0vLyBUaGVzZSBub24tZXhwciBzdG10cyAobW9zdCBvZiB0aGVtKSwgZG8gbm90IG5lZWQgYW55IGFjdGlvbiBleGNlcHQKLS8vIGl0ZXJhdGluZyBvdmVyIHRoZSBjaGlsZHJlbi4KLURFRl9UUkFWRVJTRV9TVE1UKEJyZWFrU3RtdCwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoQ1hYVHJ5U3RtdCwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoQ2FzZVN0bXQsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKENvbXBvdW5kU3RtdCwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoQ29udGludWVTdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChEZWZhdWx0U3RtdCwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoRG9TdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChGb3JTdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChHb3RvU3RtdCwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoSWZTdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChJbmRpcmVjdEdvdG9TdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChMYWJlbFN0bXQsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKEF0dHJpYnV0ZWRTdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChOdWxsU3RtdCwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0F0Q2F0Y2hTdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChPYmpDQXRGaW5hbGx5U3RtdCwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0F0U3luY2hyb25pemVkU3RtdCwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0F0VGhyb3dTdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChPYmpDQXRUcnlTdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChPYmpDRm9yQ29sbGVjdGlvblN0bXQsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKE9iakNBdXRvcmVsZWFzZVBvb2xTdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChDWFhGb3JSYW5nZVN0bXQsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKE1TRGVwZW5kZW50RXhpc3RzU3RtdCwgewotICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoUy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKLSAgICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKFMtPmdldE5hbWVJbmZvKCkpKTsKLX0pCi1ERUZfVFJBVkVSU0VfU1RNVChSZXR1cm5TdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChTd2l0Y2hTdG10LCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChXaGlsZVN0bXQsIHsgfSkKLQotREVGX1RSQVZFUlNFX1NUTVQoQ1hYRGVwZW5kZW50U2NvcGVNZW1iZXJFeHByLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhTLT5nZXRRdWFsaWZpZXJMb2MoKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0aW9uTmFtZUluZm8oUy0+Z2V0TWVtYmVyTmFtZUluZm8oKSkpOwotICAgIGlmIChTLT5oYXNFeHBsaWNpdFRlbXBsYXRlQXJncygpKSB7Ci0gICAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcigKLSAgICAgICAgICBTLT5nZXRUZW1wbGF0ZUFyZ3MoKSwgUy0+Z2V0TnVtVGVtcGxhdGVBcmdzKCkpKTsKLSAgICB9Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKERlY2xSZWZFeHByLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhTLT5nZXRRdWFsaWZpZXJMb2MoKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZURlY2xhcmF0aW9uTmFtZUluZm8oUy0+Z2V0TmFtZUluZm8oKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2NzSGVscGVyKAotICAgICAgICBTLT5nZXRUZW1wbGF0ZUFyZ3MoKSwgUy0+Z2V0TnVtVGVtcGxhdGVBcmdzKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1NUTVQoRGVwZW5kZW50U2NvcGVEZWNsUmVmRXhwciwgewotICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoUy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKLSAgICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKFMtPmdldE5hbWVJbmZvKCkpKTsKLSAgICBpZiAoUy0+aGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkgewotICAgICAgVFJZX1RPKFRyYXZlcnNlVGVtcGxhdGVBcmd1bWVudExvY3NIZWxwZXIoCi0gICAgICAgICAgUy0+Z2V0RXhwbGljaXRUZW1wbGF0ZUFyZ3MoKS5nZXRUZW1wbGF0ZUFyZ3MoKSwKLSAgICAgICAgICBTLT5nZXROdW1UZW1wbGF0ZUFyZ3MoKSkpOwotICAgIH0KLSAgfSkKLQotREVGX1RSQVZFUlNFX1NUTVQoTWVtYmVyRXhwciwgewotICAgIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoUy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKLSAgICBUUllfVE8oVHJhdmVyc2VEZWNsYXJhdGlvbk5hbWVJbmZvKFMtPmdldE1lbWJlck5hbWVJbmZvKCkpKTsKLSAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcigKLSAgICAgICAgUy0+Z2V0VGVtcGxhdGVBcmdzKCksIFMtPmdldE51bVRlbXBsYXRlQXJncygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKEltcGxpY2l0Q2FzdEV4cHIsIHsKLSAgICAvLyBXZSBkb24ndCB0cmF2ZXJzZSB0aGUgY2FzdCB0eXBlLCBhcyBpdCdzIG5vdCB3cml0dGVuIGluIHRoZQotICAgIC8vIHNvdXJjZSBjb2RlLgotICB9KQotCi1ERUZfVFJBVkVSU0VfU1RNVChDU3R5bGVDYXN0RXhwciwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZUluZm9Bc1dyaXR0ZW4oKS0+Z2V0VHlwZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKENYWEZ1bmN0aW9uYWxDYXN0RXhwciwgewotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZUluZm9Bc1dyaXR0ZW4oKS0+Z2V0VHlwZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKENYWENvbnN0Q2FzdEV4cHIsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVJbmZvQXNXcml0dGVuKCktPmdldFR5cGVMb2MoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfU1RNVChDWFhEeW5hbWljQ2FzdEV4cHIsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVJbmZvQXNXcml0dGVuKCktPmdldFR5cGVMb2MoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfU1RNVChDWFhSZWludGVycHJldENhc3RFeHByLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRUeXBlSW5mb0FzV3JpdHRlbigpLT5nZXRUeXBlTG9jKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1NUTVQoQ1hYU3RhdGljQ2FzdEV4cHIsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVJbmZvQXNXcml0dGVuKCktPmdldFR5cGVMb2MoKSkpOwotICB9KQotCi0vLyBJbml0TGlzdEV4cHIgaXMgYSB0cmlja3kgb25lLCBiZWNhdXNlIHdlIHdhbnQgdG8gZG8gYWxsIG91ciB3b3JrIG9uCi0vLyB0aGUgc3ludGFjdGljIGZvcm0gb2YgdGhlIGxpc3RleHByLCBidXQgdGhpcyBtZXRob2QgdGFrZXMgdGhlCi0vLyBzZW1hbnRpYyBmb3JtIGJ5IGRlZmF1bHQuICBXZSBjYW4ndCB1c2UgdGhlIG1hY3JvIGhlbHBlciBiZWNhdXNlIGl0Ci0vLyBjYWxscyBXYWxrVXAqKCkgb24gdGhlIHNlbWFudGljIGZvcm0sIGJlZm9yZSBvdXIgY29kZSBjYW4gY29udmVydAotLy8gdG8gdGhlIHN5bnRhY3RpYyBmb3JtLgotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VJbml0TGlzdEV4cHIoSW5pdExpc3RFeHByICpTKSB7Ci0gIGlmIChJbml0TGlzdEV4cHIgKlN5biA9IFMtPmdldFN5bnRhY3RpY0Zvcm0oKSkKLSAgICBTID0gU3luOwotICBUUllfVE8oV2Fsa1VwRnJvbUluaXRMaXN0RXhwcihTKSk7Ci0gIFN0bXRRdWV1ZUFjdGlvbiBTdG10UXVldWUoKnRoaXMpOwotICAvLyBBbGwgd2UgbmVlZCBhcmUgdGhlIGRlZmF1bHQgYWN0aW9ucy4gIEZJWE1FOiB1c2UgYSBoZWxwZXIgZnVuY3Rpb24uCi0gIGZvciAoU3RtdDo6Y2hpbGRfcmFuZ2UgcmFuZ2UgPSBTLT5jaGlsZHJlbigpOyByYW5nZTsgKytyYW5nZSkgewotICAgIFN0bXRRdWV1ZS5xdWV1ZSgqcmFuZ2UpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBHZW5lcmljU2VsZWN0aW9uRXhwciBpcyBhIHNwZWNpYWwgY2FzZSBiZWNhdXNlIHRoZSB0eXBlcyBhbmQgZXhwcmVzc2lvbnMKLS8vIGFyZSBpbnRlcmxlYXZlZC4gIFdlIGFsc28gbmVlZCB0byB3YXRjaCBvdXQgZm9yIG51bGwgdHlwZXMgKGRlZmF1bHQKLS8vIGdlbmVyaWMgYXNzb2NpYXRpb25zKS4KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OgotVHJhdmVyc2VHZW5lcmljU2VsZWN0aW9uRXhwcihHZW5lcmljU2VsZWN0aW9uRXhwciAqUykgewotICBUUllfVE8oV2Fsa1VwRnJvbUdlbmVyaWNTZWxlY3Rpb25FeHByKFMpKTsKLSAgU3RtdFF1ZXVlQWN0aW9uIFN0bXRRdWV1ZSgqdGhpcyk7Ci0gIFN0bXRRdWV1ZS5xdWV1ZShTLT5nZXRDb250cm9sbGluZ0V4cHIoKSk7Ci0gIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gUy0+Z2V0TnVtQXNzb2NzKCk7ICsraSkgewotICAgIGlmIChUeXBlU291cmNlSW5mbyAqVFMgPSBTLT5nZXRBc3NvY1R5cGVTb3VyY2VJbmZvKGkpKQotICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUUy0+Z2V0VHlwZUxvYygpKSk7Ci0gICAgU3RtdFF1ZXVlLnF1ZXVlKFMtPmdldEFzc29jRXhwcihpKSk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFBzZXVkb09iamVjdEV4cHIgaXMgYSBzcGVjaWFsIGNhc2UgYmVjYXVzZSBvZiB0aGUgd2llcmRuZXNzIHdpdGgKLS8vIHN5bnRhY3RpYyBleHByZXNzaW9ucyBhbmQgb3BhcXVlIHZhbHVlcy4KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OgotVHJhdmVyc2VQc2V1ZG9PYmplY3RFeHByKFBzZXVkb09iamVjdEV4cHIgKlMpIHsKLSAgVFJZX1RPKFdhbGtVcEZyb21Qc2V1ZG9PYmplY3RFeHByKFMpKTsKLSAgU3RtdFF1ZXVlQWN0aW9uIFN0bXRRdWV1ZSgqdGhpcyk7Ci0gIFN0bXRRdWV1ZS5xdWV1ZShTLT5nZXRTeW50YWN0aWNGb3JtKCkpOwotICBmb3IgKFBzZXVkb09iamVjdEV4cHI6OnNlbWFudGljc19pdGVyYXRvcgotICAgICAgICAgaSA9IFMtPnNlbWFudGljc19iZWdpbigpLCBlID0gUy0+c2VtYW50aWNzX2VuZCgpOyBpICE9IGU7ICsraSkgewotICAgIEV4cHIgKnN1YiA9ICppOwotICAgIGlmIChPcGFxdWVWYWx1ZUV4cHIgKk9WRSA9IGR5bl9jYXN0PE9wYXF1ZVZhbHVlRXhwcj4oc3ViKSkKLSAgICAgIHN1YiA9IE9WRS0+Z2V0U291cmNlRXhwcigpOwotICAgIFN0bXRRdWV1ZS5xdWV1ZShzdWIpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ERUZfVFJBVkVSU0VfU1RNVChDWFhTY2FsYXJWYWx1ZUluaXRFeHByLCB7Ci0gICAgLy8gVGhpcyBpcyBjYWxsZWQgZm9yIGNvZGUgbGlrZSAncmV0dXJuIFQoKScgd2hlcmUgVCBpcyBhIGJ1aWx0LWluCi0gICAgLy8gKGkuZS4gbm9uLWNsYXNzKSB0eXBlLgotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKENYWE5ld0V4cHIsIHsKLSAgLy8gVGhlIGNoaWxkLWl0ZXJhdG9yIHdpbGwgcGljayB1cCB0aGUgb3RoZXIgYXJndW1lbnRzLgotICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldEFsbG9jYXRlZFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfU1RNVChPZmZzZXRPZkV4cHIsIHsKLSAgICAvLyBUaGUgY2hpbGQtaXRlcmF0b3Igd2lsbCBwaWNrIHVwIHRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZwotICAgIC8vIHRoZSBmaWVsZC4KLSAgICAvLyBGSU1YRTogZm9yIGNvZGUgbGlrZSBvZmZzZXRvZihGb28sIGEuYi5jKSwgc2hvdWxkIHdlIGdldAotICAgIC8vIG1ha2luZyBhIE1lbWJlckV4cHIgY2FsbGJhY2tzIGZvciBGb28uYSwgRm9vLmEuYiwgYW5kIEZvby5hLmIuYz8KLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfU1RNVChVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHIsIHsKLSAgICAvLyBUaGUgY2hpbGQtaXRlcmF0b3Igd2lsbCBwaWNrIHVwIHRoZSBhcmcgaWYgaXQncyBhbiBleHByZXNzaW9uLAotICAgIC8vIGJ1dCBub3QgaWYgaXQncyBhIHR5cGUuCi0gICAgaWYgKFMtPmlzQXJndW1lbnRUeXBlKCkpCi0gICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldEFyZ3VtZW50VHlwZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKENYWFR5cGVpZEV4cHIsIHsKLSAgICAvLyBUaGUgY2hpbGQtaXRlcmF0b3Igd2lsbCBwaWNrIHVwIHRoZSBhcmcgaWYgaXQncyBhbiBleHByZXNzaW9uLAotICAgIC8vIGJ1dCBub3QgaWYgaXQncyBhIHR5cGUuCi0gICAgaWYgKFMtPmlzVHlwZU9wZXJhbmQoKSkKLSAgICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZU9wZXJhbmRTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOwotICB9KQotCi1ERUZfVFJBVkVSU0VfU1RNVChDWFhVdWlkb2ZFeHByLCB7Ci0gICAgLy8gVGhlIGNoaWxkLWl0ZXJhdG9yIHdpbGwgcGljayB1cCB0aGUgYXJnIGlmIGl0J3MgYW4gZXhwcmVzc2lvbiwKLSAgICAvLyBidXQgbm90IGlmIGl0J3MgYSB0eXBlLgotICAgIGlmIChTLT5pc1R5cGVPcGVyYW5kKCkpCi0gICAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVPcGVyYW5kU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKLSAgfSkKLQotREVGX1RSQVZFUlNFX1NUTVQoVW5hcnlUeXBlVHJhaXRFeHByLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRRdWVyaWVkVHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKEJpbmFyeVR5cGVUcmFpdEV4cHIsIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldExoc1R5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOwotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0UmhzVHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKFR5cGVUcmFpdEV4cHIsIHsKLSAgZm9yICh1bnNpZ25lZCBJID0gMCwgTiA9IFMtPmdldE51bUFyZ3MoKTsgSSAhPSBOOyArK0kpCi0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRBcmcoSSktPmdldFR5cGVMb2MoKSkpOwotfSkKLQotREVGX1RSQVZFUlNFX1NUTVQoQXJyYXlUeXBlVHJhaXRFeHByLCB7Ci0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRRdWVyaWVkVHlwZVNvdXJjZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKEV4cHJlc3Npb25UcmFpdEV4cHIsIHsKLSAgICBTdG10UXVldWUucXVldWUoUy0+Z2V0UXVlcmllZEV4cHJlc3Npb24oKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKFZBQXJnRXhwciwgewotICAgIC8vIFRoZSBjaGlsZC1pdGVyYXRvciB3aWxsIHBpY2sgdXAgdGhlIGV4cHJlc3Npb24gYXJndW1lbnQuCi0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRXcml0dGVuVHlwZUluZm8oKS0+Z2V0VHlwZUxvYygpKSk7Ci0gIH0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKENYWFRlbXBvcmFyeU9iamVjdEV4cHIsIHsKLSAgICAvLyBUaGlzIGlzIGNhbGxlZCBmb3IgY29kZSBsaWtlICdyZXR1cm4gVCgpJyB3aGVyZSBUIGlzIGEgY2xhc3MgdHlwZS4KLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFMtPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKSkpOwotICB9KQotCi0vLyBXYWxrIG9ubHkgdGhlIHZpc2libGUgcGFydHMgb2YgbGFtYmRhIGV4cHJlc3Npb25zLiAgCi10ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkPgotYm9vbCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpUcmF2ZXJzZUxhbWJkYUV4cHIoTGFtYmRhRXhwciAqUykgewotICBUUllfVE8oV2Fsa1VwRnJvbUxhbWJkYUV4cHIoUykpOwotCi0gIGZvciAoTGFtYmRhRXhwcjo6Y2FwdHVyZV9pdGVyYXRvciBDID0gUy0+ZXhwbGljaXRfY2FwdHVyZV9iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VuZCA9IFMtPmV4cGxpY2l0X2NhcHR1cmVfZW5kKCk7Ci0gICAgICAgQyAhPSBDRW5kOyArK0MpIHsKLSAgICBUUllfVE8oVHJhdmVyc2VMYW1iZGFDYXB0dXJlKCpDKSk7Ci0gIH0KLQotICBpZiAoUy0+aGFzRXhwbGljaXRQYXJhbWV0ZXJzKCkgfHwgUy0+aGFzRXhwbGljaXRSZXN1bHRUeXBlKCkpIHsKLSAgICBUeXBlTG9jIFRMID0gUy0+Z2V0Q2FsbE9wZXJhdG9yKCktPmdldFR5cGVTb3VyY2VJbmZvKCktPmdldFR5cGVMb2MoKTsKLSAgICBpZiAoUy0+aGFzRXhwbGljaXRQYXJhbWV0ZXJzKCkgJiYgUy0+aGFzRXhwbGljaXRSZXN1bHRUeXBlKCkpIHsKLSAgICAgIC8vIFZpc2l0IHRoZSB3aG9sZSB0eXBlLgotICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUTCkpOwotICAgIH0gZWxzZSBpZiAoRnVuY3Rpb25Qcm90b1R5cGVMb2MgUHJvdG8gPSBUTC5nZXRBczxGdW5jdGlvblByb3RvVHlwZUxvYz4oKSkgewotICAgICAgaWYgKFMtPmhhc0V4cGxpY2l0UGFyYW1ldGVycygpKSB7Ci0gICAgICAgIC8vIFZpc2l0IHBhcmFtZXRlcnMuCi0gICAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIE4gPSBQcm90by5nZXROdW1BcmdzKCk7IEkgIT0gTjsgKytJKSB7Ci0gICAgICAgICAgVFJZX1RPKFRyYXZlcnNlRGVjbChQcm90by5nZXRBcmcoSSkpKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhQcm90by5nZXRSZXN1bHRMb2MoKSkpOwotICAgICAgfSAgICAgICAgCi0gICAgfQotICB9Ci0KLSAgU3RtdFF1ZXVlQWN0aW9uIFN0bXRRdWV1ZSgqdGhpcyk7Ci0gIFN0bXRRdWV1ZS5xdWV1ZShTLT5nZXRCb2R5KCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotREVGX1RSQVZFUlNFX1NUTVQoQ1hYVW5yZXNvbHZlZENvbnN0cnVjdEV4cHIsIHsKLSAgICAvLyBUaGlzIGlzIGNhbGxlZCBmb3IgY29kZSBsaWtlICdUKCknLCB3aGVyZSBUIGlzIGEgdGVtcGxhdGUgYXJndW1lbnQuCi0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhTLT5nZXRUeXBlU291cmNlSW5mbygpLT5nZXRUeXBlTG9jKCkpKTsKLSAgfSkKLQotLy8gVGhlc2UgZXhwcmVzc2lvbnMgYWxsIG1pZ2h0IHRha2UgZXhwbGljaXQgdGVtcGxhdGUgYXJndW1lbnRzLgotLy8gV2UgdHJhdmVyc2UgdGhvc2UgaWYgc28uICBGSVhNRTogaW1wbGVtZW50IHRoZXNlLgotREVGX1RSQVZFUlNFX1NUTVQoQ1hYQ29uc3RydWN0RXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoQ2FsbEV4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKENYWE1lbWJlckNhbGxFeHByLCB7IH0pCi0KLS8vIFRoZXNlIGV4cHJzIChtb3N0IG9mIHRoZW0pLCBkbyBub3QgbmVlZCBhbnkgYWN0aW9uIGV4Y2VwdCBpdGVyYXRpbmcKLS8vIG92ZXIgdGhlIGNoaWxkcmVuLgotREVGX1RSQVZFUlNFX1NUTVQoQWRkckxhYmVsRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoQXJyYXlTdWJzY3JpcHRFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChCbG9ja0V4cHIsIHsKLSAgVFJZX1RPKFRyYXZlcnNlRGVjbChTLT5nZXRCbG9ja0RlY2woKSkpOwotICByZXR1cm4gdHJ1ZTsgLy8gbm8gY2hpbGQgc3RhdGVtZW50cyB0byBsb29wIHRocm91Z2guCi19KQotREVGX1RSQVZFUlNFX1NUTVQoQ2hvb3NlRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoQ29tcG91bmRMaXRlcmFsRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoQ1hYQmluZFRlbXBvcmFyeUV4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKENYWEJvb2xMaXRlcmFsRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoQ1hYRGVmYXVsdEFyZ0V4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKENYWERlZmF1bHRJbml0RXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoQ1hYRGVsZXRlRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoRXhwcldpdGhDbGVhbnVwcywgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoQ1hYTnVsbFB0ckxpdGVyYWxFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChDWFhTdGRJbml0aWFsaXplckxpc3RFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChDWFhQc2V1ZG9EZXN0cnVjdG9yRXhwciwgewotICBUUllfVE8oVHJhdmVyc2VOZXN0ZWROYW1lU3BlY2lmaWVyTG9jKFMtPmdldFF1YWxpZmllckxvYygpKSk7Ci0gIGlmIChUeXBlU291cmNlSW5mbyAqU2NvcGVJbmZvID0gUy0+Z2V0U2NvcGVUeXBlSW5mbygpKQotICAgIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoU2NvcGVJbmZvLT5nZXRUeXBlTG9jKCkpKTsKLSAgaWYgKFR5cGVTb3VyY2VJbmZvICpEZXN0cm95ZWRUeXBlSW5mbyA9IFMtPmdldERlc3Ryb3llZFR5cGVJbmZvKCkpCi0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhEZXN0cm95ZWRUeXBlSW5mby0+Z2V0VHlwZUxvYygpKSk7Ci19KQotREVGX1RSQVZFUlNFX1NUTVQoQ1hYVGhpc0V4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKENYWFRocm93RXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoVXNlckRlZmluZWRMaXRlcmFsLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChEZXNpZ25hdGVkSW5pdEV4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKEV4dFZlY3RvckVsZW1lbnRFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChHTlVOdWxsRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoSW1wbGljaXRWYWx1ZUluaXRFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChPYmpDQm9vbExpdGVyYWxFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChPYmpDRW5jb2RlRXhwciwgewotICBpZiAoVHlwZVNvdXJjZUluZm8gKlRJbmZvID0gUy0+Z2V0RW5jb2RlZFR5cGVTb3VyY2VJbmZvKCkpCi0gICAgVFJZX1RPKFRyYXZlcnNlVHlwZUxvYyhUSW5mby0+Z2V0VHlwZUxvYygpKSk7Ci19KQotREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0lzYUV4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKE9iakNJdmFyUmVmRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoT2JqQ01lc3NhZ2VFeHByLCB7Ci0gIGlmIChUeXBlU291cmNlSW5mbyAqVEluZm8gPSBTLT5nZXRDbGFzc1JlY2VpdmVyVHlwZUluZm8oKSkKLSAgICBUUllfVE8oVHJhdmVyc2VUeXBlTG9jKFRJbmZvLT5nZXRUeXBlTG9jKCkpKTsKLX0pCi1ERUZfVFJBVkVSU0VfU1RNVChPYmpDUHJvcGVydHlSZWZFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChPYmpDU3Vic2NyaXB0UmVmRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoT2JqQ1Byb3RvY29sRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoT2JqQ1NlbGVjdG9yRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoT2JqQ0luZGlyZWN0Q29weVJlc3RvcmVFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChPYmpDQnJpZGdlZENhc3RFeHByLCB7Ci0gIFRSWV9UTyhUcmF2ZXJzZVR5cGVMb2MoUy0+Z2V0VHlwZUluZm9Bc1dyaXR0ZW4oKS0+Z2V0VHlwZUxvYygpKSk7Ci19KQotREVGX1RSQVZFUlNFX1NUTVQoUGFyZW5FeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChQYXJlbkxpc3RFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChQcmVkZWZpbmVkRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoU2h1ZmZsZVZlY3RvckV4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKENvbnZlcnRWZWN0b3JFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChTdG10RXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoVW5yZXNvbHZlZExvb2t1cEV4cHIsIHsKLSAgVFJZX1RPKFRyYXZlcnNlTmVzdGVkTmFtZVNwZWNpZmllckxvYyhTLT5nZXRRdWFsaWZpZXJMb2MoKSkpOwotICBpZiAoUy0+aGFzRXhwbGljaXRUZW1wbGF0ZUFyZ3MoKSkgewotICAgIFRSWV9UTyhUcmF2ZXJzZVRlbXBsYXRlQXJndW1lbnRMb2NzSGVscGVyKFMtPmdldFRlbXBsYXRlQXJncygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMtPmdldE51bVRlbXBsYXRlQXJncygpKSk7Ci0gIH0KLX0pCi0KLURFRl9UUkFWRVJTRV9TVE1UKFVucmVzb2x2ZWRNZW1iZXJFeHByLCB7Ci0gIFRSWV9UTyhUcmF2ZXJzZU5lc3RlZE5hbWVTcGVjaWZpZXJMb2MoUy0+Z2V0UXVhbGlmaWVyTG9jKCkpKTsKLSAgaWYgKFMtPmhhc0V4cGxpY2l0VGVtcGxhdGVBcmdzKCkpIHsKLSAgICBUUllfVE8oVHJhdmVyc2VUZW1wbGF0ZUFyZ3VtZW50TG9jc0hlbHBlcihTLT5nZXRUZW1wbGF0ZUFyZ3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLT5nZXROdW1UZW1wbGF0ZUFyZ3MoKSkpOwotICB9Ci19KQotCi1ERUZfVFJBVkVSU0VfU1RNVChNU1Byb3BlcnR5UmVmRXhwciwge30pCi1ERUZfVFJBVkVSU0VfU1RNVChTRUhUcnlTdG10LCB7fSkKLURFRl9UUkFWRVJTRV9TVE1UKFNFSEV4Y2VwdFN0bXQsIHt9KQotREVGX1RSQVZFUlNFX1NUTVQoU0VIRmluYWxseVN0bXQse30pCi1ERUZfVFJBVkVSU0VfU1RNVChDYXB0dXJlZFN0bXQsIHsKLSAgVFJZX1RPKFRyYXZlcnNlRGVjbChTLT5nZXRDYXB0dXJlZERlY2woKSkpOwotfSkKLQotREVGX1RSQVZFUlNFX1NUTVQoQ1hYT3BlcmF0b3JDYWxsRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoT3BhcXVlVmFsdWVFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChDVURBS2VybmVsQ2FsbEV4cHIsIHsgfSkKLQotLy8gVGhlc2Ugb3BlcmF0b3JzIChhbGwgb2YgdGhlbSkgZG8gbm90IG5lZWQgYW55IGFjdGlvbiBleGNlcHQKLS8vIGl0ZXJhdGluZyBvdmVyIHRoZSBjaGlsZHJlbi4KLURFRl9UUkFWRVJTRV9TVE1UKEJpbmFyeUNvbmRpdGlvbmFsT3BlcmF0b3IsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKENvbmRpdGlvbmFsT3BlcmF0b3IsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKFVuYXJ5T3BlcmF0b3IsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKEJpbmFyeU9wZXJhdG9yLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChDb21wb3VuZEFzc2lnbk9wZXJhdG9yLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChDWFhOb2V4Y2VwdEV4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKFBhY2tFeHBhbnNpb25FeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChTaXplT2ZQYWNrRXhwciwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoU3Vic3ROb25UeXBlVGVtcGxhdGVQYXJtUGFja0V4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKFN1YnN0Tm9uVHlwZVRlbXBsYXRlUGFybUV4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKEZ1bmN0aW9uUGFybVBhY2tFeHByLCB7IH0pCi1ERUZfVFJBVkVSU0VfU1RNVChNYXRlcmlhbGl6ZVRlbXBvcmFyeUV4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKEF0b21pY0V4cHIsIHsgfSkKLQotLy8gVGhlc2UgbGl0ZXJhbHMgKGFsbCBvZiB0aGVtKSBkbyBub3QgbmVlZCBhbnkgYWN0aW9uLgotREVGX1RSQVZFUlNFX1NUTVQoSW50ZWdlckxpdGVyYWwsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKENoYXJhY3RlckxpdGVyYWwsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKEZsb2F0aW5nTGl0ZXJhbCwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoSW1hZ2luYXJ5TGl0ZXJhbCwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoU3RyaW5nTGl0ZXJhbCwgeyB9KQotREVGX1RSQVZFUlNFX1NUTVQoT2JqQ1N0cmluZ0xpdGVyYWwsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKE9iakNCb3hlZEV4cHIsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKE9iakNBcnJheUxpdGVyYWwsIHsgfSkKLURFRl9UUkFWRVJTRV9TVE1UKE9iakNEaWN0aW9uYXJ5TGl0ZXJhbCwgeyB9KQotICAKLS8vIFRyYXZlcnNlIE9wZW5DTDogQXNUeXBlLCBDb252ZXJ0LgotREVGX1RSQVZFUlNFX1NUTVQoQXNUeXBlRXhwciwgeyB9KQotCi0vLyBPcGVuTVAgZGlyZWN0aXZlcy4KLURFRl9UUkFWRVJTRV9TVE1UKE9NUFBhcmFsbGVsRGlyZWN0aXZlLCB7Ci0gIEFycmF5UmVmPE9NUENsYXVzZSAqPiBDbGF1c2VzID0gUy0+Y2xhdXNlcygpOwotICBmb3IgKEFycmF5UmVmPE9NUENsYXVzZSAqPjo6aXRlcmF0b3IgSSA9IENsYXVzZXMuYmVnaW4oKSwgRSA9IENsYXVzZXMuZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpCi0gICAgaWYgKCFUcmF2ZXJzZU9NUENsYXVzZSgqSSkpIHJldHVybiBmYWxzZTsKLX0pCi0KLS8vIE9wZW5NUCBjbGF1c2VzLgotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VHJhdmVyc2VPTVBDbGF1c2UoT01QQ2xhdXNlICpDKSB7Ci0gIGlmICghQykgcmV0dXJuIHRydWU7Ci0gIHN3aXRjaCAoQy0+Z2V0Q2xhdXNlS2luZCgpKSB7Ci0jZGVmaW5lIE9QRU5NUF9DTEFVU0UoTmFtZSwgQ2xhc3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNhc2UgT01QQ18jI05hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIGdldERlcml2ZWQoKS5WaXNpdCMjQ2xhc3Moc3RhdGljX2Nhc3Q8Q2xhc3MqPihDKSk7Ci0jaW5jbHVkZSAiY2xhbmcvQmFzaWMvT3Blbk1QS2luZHMuZGVmIgotICBkZWZhdWx0OiBicmVhazsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBEZWZhdWx0Q2xhdXNlKE9NUERlZmF1bHRDbGF1c2UgKkMpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCBSZWN1cnNpdmVBU1RWaXNpdG9yPERlcml2ZWQ+OjpWaXNpdE9NUENsYXVzZUxpc3QoVCAqTm9kZSkgewotICBmb3IgKHR5cGVuYW1lIFQ6OnZhcmxpc3RfaXRlcmF0b3IgSSA9IE5vZGUtPnZhcmxpc3RfYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBOb2RlLT52YXJsaXN0X2VuZCgpOwotICAgICAgICAgSSAhPSBFOyArK0kpCi0gICAgVHJhdmVyc2VTdG10KCpJKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBQcml2YXRlQ2xhdXNlKE9NUFByaXZhdGVDbGF1c2UgKkMpIHsKLSAgVmlzaXRPTVBDbGF1c2VMaXN0KEMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgRGVyaXZlZD4KLWJvb2wgUmVjdXJzaXZlQVNUVmlzaXRvcjxEZXJpdmVkPjo6VmlzaXRPTVBGaXJzdHByaXZhdGVDbGF1c2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QRmlyc3Rwcml2YXRlQ2xhdXNlICpDKSB7Ci0gIFZpc2l0T01QQ2xhdXNlTGlzdChDKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIERlcml2ZWQ+Ci1ib29sIFJlY3Vyc2l2ZUFTVFZpc2l0b3I8RGVyaXZlZD46OlZpc2l0T01QU2hhcmVkQ2xhdXNlKE9NUFNoYXJlZENsYXVzZSAqQykgewotICBWaXNpdE9NUENsYXVzZUxpc3QoQyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBGSVhNRTogbG9vayBhdCB0aGUgZm9sbG93aW5nIHRyaWNreS1zZWVtaW5nIGV4cHJzIHRvIHNlZSBpZiB3ZQotLy8gbmVlZCB0byByZWN1cnNlIG9uIGFueXRoaW5nLiAgVGhlc2UgYXJlIG9uZXMgdGhhdCBoYXZlIG1ldGhvZHMKLS8vIHJldHVybmluZyBkZWNscyBvciBxdWFsdHlwZXMgb3IgbmVzdGVkbmFtZXNwZWNpZmllciAtLSB0aG91Z2ggSSdtCi0vLyBub3Qgc3VyZSBpZiB0aGV5IG93biB0aGVtIC0tIG9yIGp1c3Qgc2VlbWVkIHZlcnkgY29tcGxpY2F0ZWQsIG9yCi0vLyBoYWQgbG90cyBvZiBzdWItdHlwZXMgdG8gZXhwbG9yZS4KLS8vCi0vLyBWaXNpdE92ZXJsb2FkRXhwciBhbmQgaXRzIGNoaWxkcmVuOiByZWN1cnNlIG9uIHRlbXBsYXRlIGFyZ3M/IGV0Yz8KLQotLy8gRklYTUU6IGdvIHRocm91Z2ggYWxsIHRoZSBzdG10cyBhbmQgZXhwcnMgYWdhaW4sIGFuZCBzZWUgd2hpY2ggb2YgdGhlbQotLy8gY3JlYXRlIG5ldyB0eXBlcywgYW5kIHJlY3Vyc2Ugb24gdGhlIHR5cGVzIChUeXBlTG9jcz8pIG9mIHRob3NlLgotLy8gQ2FuZGlkYXRlczoKLS8vCi0vLyAgICBodHRwOi8vY2xhbmcubGx2bS5vcmcvZG94eWdlbi9jbGFzc2NsYW5nXzFfMUNYWFR5cGVpZEV4cHIuaHRtbAotLy8gICAgaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFVbmFyeUV4cHJPclR5cGVUcmFpdEV4cHIuaHRtbAotLy8gICAgaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RveHlnZW4vY2xhc3NjbGFuZ18xXzFUeXBlc0NvbXBhdGlibGVFeHByLmh0bWwKLS8vICAgIEV2ZXJ5IGNsYXNzIHRoYXQgaGFzIGdldFF1YWxpZmllci4KLQotI3VuZGVmIERFRl9UUkFWRVJTRV9TVE1UCi0KLSN1bmRlZiBUUllfVE8KLQotfSAvLyBlbmQgbmFtZXNwYWNlIGN4aW5kZXgKLX0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwotCi0jZW5kaWYgLy8gTExWTV9DTEFOR19MSUJDTEFOR19SRUNVUlNJVkVBU1RWSVNJVE9SX0gKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYmNsYW5nL2xpYmNsYW5nLmV4cG9ydHMgYi90b29scy9saWJjbGFuZy9saWJjbGFuZy5leHBvcnRzCmluZGV4IDliZjI2YzkuLjM3YjYxNTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmNsYW5nL2xpYmNsYW5nLmV4cG9ydHMKKysrIGIvdG9vbHMvbGliY2xhbmcvbGliY2xhbmcuZXhwb3J0cwpAQCAtNjQsNiArNjQsOCBAQAogY2xhbmdfVHlwZV9nZXRDbGFzc1R5cGUKIGNsYW5nX1R5cGVfZ2V0U2l6ZU9mCiBjbGFuZ19UeXBlX2dldE9mZnNldE9mCitjbGFuZ19UeXBlX2dldE51bVRlbXBsYXRlQXJndW1lbnRzCitjbGFuZ19UeXBlX2dldFRlbXBsYXRlQXJndW1lbnRBc1R5cGUKIGNsYW5nX1R5cGVfZ2V0Q1hYUmVmUXVhbGlmaWVyCiBjbGFuZ19WZXJiYXRpbUJsb2NrTGluZUNvbW1lbnRfZ2V0VGV4dAogY2xhbmdfVmVyYmF0aW1MaW5lQ29tbWVudF9nZXRUZXh0CkBAIC04Nyw2ICs4OSw3IEBACiBjbGFuZ19jcmVhdGVDWEN1cnNvclNldAogY2xhbmdfY3JlYXRlSW5kZXgKIGNsYW5nX2NyZWF0ZVRyYW5zbGF0aW9uVW5pdAorY2xhbmdfY3JlYXRlVHJhbnNsYXRpb25Vbml0MgogY2xhbmdfY3JlYXRlVHJhbnNsYXRpb25Vbml0RnJvbVNvdXJjZUZpbGUKIGNsYW5nX2RlZmF1bHRDb2RlQ29tcGxldGVPcHRpb25zCiBjbGFuZ19kZWZhdWx0RGlhZ25vc3RpY0Rpc3BsYXlPcHRpb25zCkBAIC0xMDEsNiArMTA0LDcgQEAKIGNsYW5nX2Rpc3Bvc2VJbmRleAogY2xhbmdfZGlzcG9zZU92ZXJyaWRkZW5DdXJzb3JzCiBjbGFuZ19kaXNwb3NlQ1hQbGF0Zm9ybUF2YWlsYWJpbGl0eQorY2xhbmdfZGlzcG9zZVNvdXJjZVJhbmdlTGlzdAogY2xhbmdfZGlzcG9zZVN0cmluZwogY2xhbmdfZGlzcG9zZVRva2VucwogY2xhbmdfZGlzcG9zZVRyYW5zbGF0aW9uVW5pdApAQCAtMTE4LDYgKzEyMiw3IEBACiBjbGFuZ19nZXRBcmdUeXBlCiBjbGFuZ19nZXRBcnJheUVsZW1lbnRUeXBlCiBjbGFuZ19nZXRBcnJheVNpemUKK2NsYW5nX2dldEJ1aWxkU2Vzc2lvblRpbWVzdGFtcAogY2xhbmdfZ2V0Q1N0cmluZwogY2xhbmdfZ2V0Q1hUVVJlc291cmNlVXNhZ2UKIGNsYW5nX2dldENYWEFjY2Vzc1NwZWNpZmllcgpAQCAtMjA3LDYgKzIxMiw3IEBACiBjbGFuZ19nZXRSZW1hcHBpbmdzCiBjbGFuZ19nZXRSZW1hcHBpbmdzRnJvbUZpbGVMaXN0CiBjbGFuZ19nZXRSZXN1bHRUeXBlCitjbGFuZ19nZXRTa2lwcGVkUmFuZ2VzCiBjbGFuZ19nZXRTcGVjaWFsaXplZEN1cnNvclRlbXBsYXRlCiBjbGFuZ19nZXRTcGVsbGluZ0xvY2F0aW9uCiBjbGFuZ19nZXRUVVJlc291cmNlVXNhZ2VOYW1lCkBAIC0yNTksNiArMjY1LDcgQEAKIGNsYW5nX0xvY2F0aW9uX2lzSW5TeXN0ZW1IZWFkZXIKIGNsYW5nX0xvY2F0aW9uX2lzRnJvbU1haW5GaWxlCiBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdAorY2xhbmdfcGFyc2VUcmFuc2xhdGlvblVuaXQyCiBjbGFuZ19yZW1hcF9kaXNwb3NlCiBjbGFuZ19yZW1hcF9nZXRGaWxlbmFtZXMKIGNsYW5nX3JlbWFwX2dldE51bUZpbGVzCkBAIC0yNzksMyArMjg2LDEzIEBACiBjbGFuZ19Db21waWxlQ29tbWFuZF9nZXRBcmcKIGNsYW5nX3Zpc2l0Q2hpbGRyZW4KIGNsYW5nX3Zpc2l0Q2hpbGRyZW5XaXRoQmxvY2sKK2NsYW5nX01vZHVsZU1hcERlc2NyaXB0b3JfY3JlYXRlCitjbGFuZ19Nb2R1bGVNYXBEZXNjcmlwdG9yX2Rpc3Bvc2UKK2NsYW5nX01vZHVsZU1hcERlc2NyaXB0b3Jfc2V0RnJhbWV3b3JrTW9kdWxlTmFtZQorY2xhbmdfTW9kdWxlTWFwRGVzY3JpcHRvcl9zZXRVbWJyZWxsYUhlYWRlcgorY2xhbmdfTW9kdWxlTWFwRGVzY3JpcHRvcl93cml0ZVRvQnVmZmVyCitjbGFuZ19WaXJ0dWFsRmlsZU92ZXJsYXlfYWRkRmlsZU1hcHBpbmcKK2NsYW5nX1ZpcnR1YWxGaWxlT3ZlcmxheV9jcmVhdGUKK2NsYW5nX1ZpcnR1YWxGaWxlT3ZlcmxheV9kaXNwb3NlCitjbGFuZ19WaXJ0dWFsRmlsZU92ZXJsYXlfc2V0Q2FzZVNlbnNpdGl2aXR5CitjbGFuZ19WaXJ0dWFsRmlsZU92ZXJsYXlfd3JpdGVUb0J1ZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvc2Nhbi1idWlsZC9jY2MtYW5hbHl6ZXIgYi90b29scy9zY2FuLWJ1aWxkL2NjYy1hbmFseXplcgppbmRleCBiNDYzZWMwLi5iNTQ0NWU2IDEwMDc1NQotLS0gYS90b29scy9zY2FuLWJ1aWxkL2NjYy1hbmFseXplcgorKysgYi90b29scy9zY2FuLWJ1aWxkL2NjYy1hbmFseXplcgpAQCAtMjksOCArMjksOSBAQAogbXkgJENsYW5nOwogbXkgJERlZmF1bHRDQ29tcGlsZXI7CiBteSAkRGVmYXVsdENYWENvbXBpbGVyOworbXkgJElzQ1hYOwogCi1pZiAoYHVuYW1lIC1hYCA9fiBtL0Rhcndpbi8pIHsgCitpZiAoYHVuYW1lIC1hYCA9fiBtL0Rhcndpbi8pIHsKICAgJERlZmF1bHRDQ29tcGlsZXIgPSAnY2xhbmcnOwogICAkRGVmYXVsdENYWENvbXBpbGVyID0gJ2NsYW5nKysnOwogfSBlbHNlIHsKQEAgLTQwLDE3ICs0MSwyMSBAQAogCiBpZiAoJEZpbmRCaW46OlNjcmlwdCA9fiAvY1wrXCstYW5hbHl6ZXIvKSB7CiAgICRDb21waWxlciA9ICRFTlZ7J0NDQ19DWFgnfTsKLSAgaWYgKCFkZWZpbmVkICRDb21waWxlcikgeyAkQ29tcGlsZXIgPSAkRGVmYXVsdENYWENvbXBpbGVyOyB9Ci0gIAorICBpZiAoIWRlZmluZWQgJENvbXBpbGVyIHx8ICEgLXggJENvbXBpbGVyKSB7ICRDb21waWxlciA9ICREZWZhdWx0Q1hYQ29tcGlsZXI7IH0KKwogICAkQ2xhbmcgPSAkRU5WeydDTEFOR19DWFgnfTsKLSAgaWYgKCFkZWZpbmVkICRDbGFuZykgeyAkQ2xhbmcgPSAnY2xhbmcrKyc7IH0KKyAgaWYgKCFkZWZpbmVkICRDbGFuZyB8fCAhIC14ICRDbGFuZykgeyAkQ2xhbmcgPSAnY2xhbmcrKyc7IH0KKworICAkSXNDWFggPSAxCiB9CiBlbHNlIHsKICAgJENvbXBpbGVyID0gJEVOVnsnQ0NDX0NDJ307Ci0gIGlmICghZGVmaW5lZCAkQ29tcGlsZXIpIHsgJENvbXBpbGVyID0gJERlZmF1bHRDQ29tcGlsZXI7IH0KKyAgaWYgKCFkZWZpbmVkICRDb21waWxlciB8fCAhIC14ICRDb21waWxlcikgeyAkQ29tcGlsZXIgPSAkRGVmYXVsdENDb21waWxlcjsgfQogCiAgICRDbGFuZyA9ICRFTlZ7J0NMQU5HJ307Ci0gIGlmICghZGVmaW5lZCAkQ2xhbmcpIHsgJENsYW5nID0gJ2NsYW5nJzsgfQorICBpZiAoIWRlZmluZWQgJENsYW5nIHx8ICEgLXggJENsYW5nKSB7ICRDbGFuZyA9ICdjbGFuZyc7IH0KKworICAkSXNDWFggPSAwCiB9CiAKICMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCkBAIC02NCw3ICs2OSw3IEBACiBteSAkUmVzdWx0RmlsZTsKIAogIyBSZW1vdmUgYW55IHN0YWxlIGZpbGVzIGF0IGV4aXQuCi1FTkQgeyAKK0VORCB7CiAgIGlmIChkZWZpbmVkICRSZXN1bHRGaWxlICYmIC16ICRSZXN1bHRGaWxlKSB7CiAgICAgYHJtIC1mICRSZXN1bHRGaWxlYDsKICAgfQpAQCAtOTUsNyArMTAwLDcgQEAKICAgbXkgKCRDbGFuZywgJExhbmcsICRmaWxlLCAkQXJncywgJEh0bWxEaXIsICRFcnJvclR5cGUsICRvZmlsZSkgPSBAXzsKICAgbXkgJERpciA9ICIkSHRtbERpci9mYWlsdXJlcyI7CiAgIG1rcGF0aCAkRGlyOwotICAKKwogICBteSAkcHJlZml4ID0gImNsYW5nX2NyYXNoIjsKICAgaWYgKCRFcnJvclR5cGUgZXEgJFBhcnNlclJlamVjdHMpIHsKICAgICAkcHJlZml4ID0gImNsYW5nX3BhcnNlcl9yZWplY3RzIjsKQEAgLTExMyw3ICsxMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSID0+ICREaXIpOwogICBzeXN0ZW0gJENsYW5nLCBAJEFyZ3MsICItRSIsICItbyIsICRQUEZpbGU7CiAgIGNsb3NlICgkUFBIKTsKLSAgCisKICAgIyBDcmVhdGUgdGhlIGluZm8gZmlsZS4KICAgb3BlbiAoT1VULCAiPiIsICIkUFBGaWxlLmluZm8udHh0Iikgb3IgZGllICJDYW5ub3Qgb3BlbiAkUFBGaWxlLmluZm8udHh0XG4iOwogICBwcmludCBPVVQgYWJzX3BhdGgoJGZpbGUpLCAiXG4iOwpAQCAtMTMzLDcgKzEzOCw3IEBACiBzdWIgR2V0Q0NBcmdzIHsKICAgbXkgJG1vZGUgPSBzaGlmdDsKICAgbXkgJEFyZ3MgPSBzaGlmdDsKLSAgCisKICAgcGlwZSAoRlJPTV9DSElMRCwgVE9fUEFSRU5UKTsKICAgbXkgJHBpZCA9IGZvcmsoKTsKICAgaWYgKCRwaWQgPT0gMCkgewpAQCAtMTQxLDIxICsxNDYsMjAgQEAKICAgICBvcGVuKFNURE9VVCwiPiYiLCBcKlRPX1BBUkVOVCk7CiAgICAgb3BlbihTVERFUlIsIj4mIiwgXCpUT19QQVJFTlQpOwogICAgIGV4ZWMgJENsYW5nLCAiLSMjIyIsICRtb2RlLCBAJEFyZ3M7Ci0gIH0gIAorICB9CiAgIGNsb3NlKFRPX1BBUkVOVCk7CiAgIG15ICRsaW5lOwogICB3aGlsZSAoPEZST01fQ0hJTEQ+KSB7Ci0gICAgbmV4dCBpZiAoIS8tY2MxLyk7CisgICAgbmV4dCBpZiAoIS9ccyI/LWNjMSI/XHMvKTsKICAgICAkbGluZSA9ICRfOwogICB9CiAKICAgd2FpdHBpZCgkcGlkLDApOwogICBjbG9zZShGUk9NX0NISUxEKTsKLSAgCisKICAgZGllICJjb3VsZCBub3QgZmluZCBjbGFuZyBsaW5lXG4iIGlmICghZGVmaW5lZCAkbGluZSk7Ci0gICMgU3RyaXAgdGhlIG5ld2xpbmUgYW5kIGluaXRpYWwgd2hpdHNwYWNlCi0gIGNob21wICRsaW5lOwotICAkbGluZSA9fiBzL15ccysvLzsKKyAgIyBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCisgICRsaW5lID1+IHMvXlxzK3xccyskLy9nOwogICBteSBAaXRlbXMgPSBxdW90ZXdvcmRzKCdccysnLCAwLCAkbGluZSk7CiAgIG15ICRjbWQgPSBzaGlmdCBAaXRlbXM7CiAgIGRpZSAiY2Fubm90IGZpbmQgJ2NsYW5nJyBpbiAnY2xhbmcnIGNvbW1hbmRcbiIgaWYgKCEoJGNtZCA9fiAvY2xhbmcvKSk7CkBAIC0yMDMsNyArMjA3LDcgQEAKICAgICB9CiAKICAgICAjIERpc3BsYXkgVWJpdml6IGdyYXBoPwotICAgIGlmIChkZWZpbmVkICRFTlZ7J0NDQ19VQkknfSkgeyAgIAorICAgIGlmIChkZWZpbmVkICRFTlZ7J0NDQ19VQkknfSkgewogICAgICAgcHVzaCBAQXJncywgIi1YY2xhbmciLCAiLWFuYWx5emVyLXZpei1lZ3JhcGgtdWJpZ3JhcGgiOwogICAgIH0KIApAQCAtMjI0LDcgKzIyOCw3IEBACiAgIH0KICAgaWYgKCRWZXJib3NlID09IDEpIHsKICAgICAjIFdlIE1VU1QgcHJpbnQgdG8gc3RkZXJyLiAgU29tZSBjbGllbnRzIHVzZSB0aGUgc3Rkb3V0IG91dHB1dCBvZgotICAgICMgZ2NjIGZvciB2YXJpb3VzIHB1cnBvc2VzLiAKKyAgICAjIGdjYyBmb3IgdmFyaW91cyBwdXJwb3Nlcy4KICAgICBwcmludCBTVERFUlIgam9pbignICcsIEBQcmludEFyZ3MpOwogICAgIHByaW50IFNUREVSUiAiXG4iOwogICB9CkBAIC0yMzUsNyArMjM5LDcgQEAKICAgIyBDYXB0dXJlIHRoZSBTVERFUlIgb2YgY2xhbmcgYW5kIHNlbmQgaXQgdG8gYSB0ZW1wb3JhcnkgZmlsZS4KICAgIyBDYXB0dXJlIHRoZSBTVERPVVQgb2YgY2xhbmcgYW5kIHJlcm91dGUgaXQgdG8gY2NjLWFuYWx5emVyJ3MgU1RERVJSLgogICAjIFdlIHNhdmUgdGhlIG91dHB1dCBmaWxlIGluIHRoZSAnY3Jhc2hlcycgZGlyZWN0b3J5IGlmIGNsYW5nIGVuY291bnRlcnMKLSAgIyBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgZmlsZS4gIAorICAjIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBmaWxlLgogICBwaXBlIChGUk9NX0NISUxELCBUT19QQVJFTlQpOwogICBteSAkcGlkID0gZm9yaygpOwogICBpZiAoJHBpZCA9PSAwKSB7CkBAIC0yNDcsNyArMjUxLDcgQEAKIAogICBjbG9zZSBUT19QQVJFTlQ7CiAgIG15ICgkb2ZoLCAkb2ZpbGUpID0gdGVtcGZpbGUoImNsYW5nX291dHB1dF9YWFhYWFgiLCBESVIgPT4gJEh0bWxEaXIpOwotICAKKwogICB3aGlsZSAoPEZST01fQ0hJTEQ+KSB7CiAgICAgcHJpbnQgJG9maCAkXzsKICAgICBwcmludCBTVERFUlIgJF87CkBAIC0yODksMTUgKzI5MywxNSBAQAogICAgICAgICAgICMgSGF2ZSB3ZSBhbHJlYWR5IHNwb3R0ZWQgdGhpcyB1bmhhbmRsZWQgYXR0cmlidXRlPwogICAgICAgICAgIG5leHQgaWYgKGRlZmluZWQgJGF0dHJpYnV0ZXNfbm90X2hhbmRsZWR7JDF9KTsKICAgICAgICAgICAkYXR0cmlidXRlc19ub3RfaGFuZGxlZHskMX0gPSAxOwotICAgICAgICAKKwogICAgICAgICAgICMgR2V0IHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgZmlsZS4KICAgICAgICAgICBteSAkZGlyID0gIiRIdG1sRGlyL2ZhaWx1cmVzIjsKICAgICAgICAgICBteSAkYWZpbGUgPSAiJGRpci9hdHRyaWJ1dGVfaWdub3JlZF8kMS50eHQiOwotICAgICAgICAKKwogICAgICAgICAgICMgT25seSBjcmVhdGUgYW5vdGhlciBwcmVwcm9jZXNzZWQgZmlsZSBpZiB0aGUgYXR0cmlidXRlIGZpbGUKICAgICAgICAgICAjIGRvZXNuJ3QgZXhpc3QgeWV0LgogICAgICAgICAgIG5leHQgaWYgKC1lICRhZmlsZSk7Ci0gICAgICAgIAorCiAgICAgICAgICAgIyBBZGQgdGhpcyBmaWxlIHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgY29udGFpbmVkIHRoaXMgYXR0cmlidXRlLgogICAgICAgICAgICMgR2VuZXJhdGUgYSBwcmVwcm9jZXNzZWQgZmlsZSBpZiB3ZSBoYXZlbid0IGFscmVhZHkuCiAgICAgICAgICAgaWYgKCEoZGVmaW5lZCAkcHBmaWxlKSkgewpAQCAtMzE1LDcgKzMxOSw3IEBACiAgICAgICB9CiAgICAgfQogICB9Ci0gIAorCiAgIHVubGluaygkb2ZpbGUpOwogfQogCkBAIC0zNzcsMjIgKzM4MSwyMyBAQAogKTsKIAogbXkgJUxhbmdNYXAgPSAoCi0gICdjJyAgID0+ICdjJywKKyAgJ2MnICAgPT4gJElzQ1hYID8gJ2MrKycgOiAnYycsCiAgICdjcCcgID0+ICdjKysnLAogICAnY3BwJyA9PiAnYysrJywKICAgJ2N4eCcgPT4gJ2MrKycsCiAgICd0eHgnID0+ICdjKysnLAogICAnY2MnICA9PiAnYysrJywKICAgJ0MnICAgPT4gJ2MrKycsCi0gICdpaScgID0+ICdjKysnLAotICAnaScgICA9PiAnYy1jcHAtb3V0cHV0JywKKyAgJ2lpJyAgPT4gJ2MrKy1jcHAtb3V0cHV0JywKKyAgJ2knICAgPT4gJElzQ1hYID8gJ2MrKy1jcHAtb3V0cHV0JyA6ICdjLWNwcC1vdXRwdXQnLAogICAnbScgICA9PiAnb2JqZWN0aXZlLWMnLAogICAnbWknICA9PiAnb2JqZWN0aXZlLWMtY3BwLW91dHB1dCcsCi0gICdtbScgID0+ICdvYmplY3RpdmUtYysrJworICAnbW0nICA9PiAnb2JqZWN0aXZlLWMrKycsCisgICdtaWknID0+ICdvYmplY3RpdmUtYysrLWNwcC1vdXRwdXQnLAogKTsKIAogbXkgJVVuaXF1ZU9wdGlvbnMgPSAoCi0gICctaXN5c3Jvb3QnID0+IDAgIAorICAnLWlzeXNyb290JyA9PiAwCiApOwogCiAjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jIwpAQCAtNDAzLDcgKzQwOCwxMCBAQAogICAib2JqZWN0aXZlLWMiID0+IDEsCiAgICJjIiA9PiAxLAogICAiYysrIiA9PiAxLAotICAib2JqZWN0aXZlLWMrKyIgPT4gMQorICAib2JqZWN0aXZlLWMrKyIgPT4gMSwKKyAgImMtY3BwLW91dHB1dCIgPT4gMSwKKyAgIm9iamVjdGl2ZS1jLWNwcC1vdXRwdXQiID0+IDEsCisgICJjKystY3BwLW91dHB1dCIgPT4gMQogKTsKIAogIyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIyMKQEAgLTQ0NCw2ICs0NTIsOSBAQAogbXkgJE91dHB1dEZvcm1hdCA9ICRFTlZ7J0NDQ19BTkFMWVpFUl9PVVRQVVRfRk9STUFUJ307CiBpZiAoIWRlZmluZWQgJE91dHB1dEZvcm1hdCkgeyAkT3V0cHV0Rm9ybWF0ID0gImh0bWwiOyB9CiAKKyMgR2V0IHRoZSBjb25maWcgb3B0aW9ucy4KK215ICRDb25maWdPcHRpb25zID0gJEVOVnsnQ0NDX0FOQUxZWkVSX0NPTkZJRyd9OworCiAjIERldGVybWluZSB0aGUgbGV2ZWwgb2YgdmVyYm9zaXR5LgogbXkgJFZlcmJvc2UgPSAwOwogaWYgKGRlZmluZWQgJEVOVnsnQ0NDX0FOQUxZWkVSX1ZFUkJPU0UnfSkgeyAkVmVyYm9zZSA9IDE7IH0KQEAgLTQ1OCw3ICs0NjksNyBAQAogCiAjIFByb2Nlc3MgdGhlIGFyZ3VtZW50cy4KIGZvcmVhY2ggKG15ICRpID0gMDsgJGkgPCBzY2FsYXIoQEFSR1YpOyArKyRpKSB7Ci0gIG15ICRBcmcgPSAkQVJHVlskaV07ICAKKyAgbXkgJEFyZyA9ICRBUkdWWyRpXTsKICAgbXkgKCRBcmdLZXkpID0gc3BsaXQgLz0vLCRBcmcsMjsKIAogICAjIE1vZGVzIGNjYy1hbmFseXplciBzdXBwb3J0cwpAQCAtNDg1LDcgKzQ5Niw3IEBACiAgICAgbmV4dDsKICAgfQogICAjIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpc24ndCBhIHNwYWNlIGFmdGVyIC1pcXVvdGUKLSAgaWYgKCRBcmcgPX4gLy1pcXVvdGUuKi8pIHsKKyAgaWYgKCRBcmcgPX4gL14taXF1b3RlLiovKSB7CiAgICAgcHVzaCBAQ29tcGlsZU9wdHMsJEFyZzsKICAgICBuZXh0OwogICB9CkBAIC01MDIsNyArNTEzLDcgQEAKICAgIyBhbmQgdGhlIGxpbmtlci4KICAgaWYgKGRlZmluZWQgJENvbXBpbGVyTGlua2VyT3B0aW9uTWFweyRBcmdLZXl9KSB7CiAgICAgbXkgJENudCA9ICRDb21waWxlckxpbmtlck9wdGlvbk1hcHskQXJnS2V5fTsKLSAgICAKKwogICAgICMgQ2hlY2sgaWYgdGhpcyBpcyBhbiBvcHRpb24gdGhhdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSB2YWx1ZSwgYW5kIGlmIHNvCiAgICAgIyBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIHdhcyBjaGVja2VkIGJlZm9yZS4KICAgICBpZiAoJFVuaXF1ZU9wdGlvbnN7JEFyZ30pIHsKQEAgLTUxMiw4ICs1MjMsOCBAQAogICAgICAgfQogICAgICAgJFVuaXF1ZWR7JEFyZ30gPSAxOwogICAgIH0KLSAgICAKLSAgICBwdXNoIEBDb21waWxlT3B0cywkQXJnOyAgICAKKworICAgIHB1c2ggQENvbXBpbGVPcHRzLCRBcmc7CiAgICAgcHVzaCBATGlua09wdHMsJEFyZzsKIAogICAgIHdoaWxlICgkQ250ID4gMCkgewpAQCAtNTIzLDcgKzUzNCw3IEBACiAgICAgfQogICAgIG5leHQ7CiAgIH0KLSAgCisKICAgIyBJZ25vcmVkIG9wdGlvbnMuCiAgIGlmIChkZWZpbmVkICRJZ25vcmVkT3B0aW9uTWFweyRBcmdLZXl9KSB7CiAgICAgbXkgJENudCA9ICRJZ25vcmVkT3B0aW9uTWFweyRBcmdLZXl9OwpAQCAtNTMyLDEwICs1NDMsMTAgQEAKICAgICB9CiAgICAgbmV4dDsKICAgfQotICAKKwogICAjIENvbXBpbGUgbW9kZSBmbGFncy4KICAgaWYgKCRBcmcgPX4gL14tW0QsSSxVXSguKikkLykgewotICAgIG15ICRUbXAgPSAkQXJnOyAgICAKKyAgICBteSAkVG1wID0gJEFyZzsKICAgICBpZiAoJDEgZXEgJycpIHsKICAgICAgICMgRklYTUU6IENoZWNrIGlmIHdlIGFyZSBnb2luZyBvZmYgdGhlIGVuZC4KICAgICAgICsrJGk7CkBAIC01NDQsMTIgKzU1NSwxMiBAQAogICAgIHB1c2ggQENvbXBpbGVPcHRzLCRUbXA7CiAgICAgbmV4dDsKICAgfQotICAKLSAgaWYgKCRBcmcgPX4gLy1tLiovKSB7CisKKyAgaWYgKCRBcmcgPX4gL14tbS4qLykgewogICAgIHB1c2ggQENvbXBpbGVPcHRzLCRBcmc7CiAgICAgbmV4dDsKICAgfQotICAKKwogICAjIExhbmd1YWdlLgogICBpZiAoJEFyZyBlcSAnLXgnKSB7CiAgICAgJExhbmcgPSAkQVJHVlskaSsxXTsKQEAgLTU2Miw3ICs1NzMsNyBAQAogICAgICRPdXRwdXQgPSAkQVJHVlskaV07CiAgICAgbmV4dDsKICAgfQotICAKKwogICAjIEdldCB0aGUgbGluayBtb2RlLgogICBpZiAoJEFyZyA9fiAvXi1bbCxMLE9dLykgewogICAgIGlmICgkQXJnIGVxICctTycpIHsgcHVzaCBATGlua09wdHMsJy1PMSc7IH0KQEAgLTU3MywxMiArNTg0LDEyIEBACiAgICAgaWYgKCRBcmcgPX4gL14tTy8pIHsgcHVzaCBAQ29tcGlsZU9wdHMsJEFyZzsgfQogICAgIG5leHQ7CiAgIH0KLSAgCisKICAgaWYgKCRBcmcgPX4gL14tc3RkPS8pIHsKICAgICBwdXNoIEBDb21waWxlT3B0cywkQXJnOwogICAgIG5leHQ7CiAgIH0KLSAgCisKICAgIyBHZXQgdGhlIGNvbXBpbGVyL2xpbmsgbW9kZS4KICAgaWYgKCRBcmcgPX4gL14tRiguKykkLykgewogICAgIG15ICRUbXAgPSAkQXJnOwpAQCAtNjAxLDEzICs2MTIsMTMgQEAKICAgICArKyRpOwogICAgIG5leHQ7CiAgIH0KLSAgCisKICAgaWYgKCRBcmcgPX4gL14tZi8pIHsKICAgICBwdXNoIEBDb21waWxlT3B0cywkQXJnOwogICAgIHB1c2ggQExpbmtPcHRzLCRBcmc7CiAgICAgbmV4dDsKICAgfQotICAKKwogICAjIEhhbmRsZSAtV25vLS4gIFdlIGRvbid0IGNhcmUgYWJvdXQgZXh0cmEgd2FybmluZ3MsIGJ1dAogICAjIHdlIHNob3VsZCBzdXBwcmVzcyBvbmVzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBzZWUuCiAgIGlmICgkQXJnID1+IC9eLVduby0vKSB7CkBAIC02MzYsNyArNjQ3LDcgQEAKICAgICAgICAgJEZpbGVMYW5nID0gJExhbmdNYXB7JDF9OwogICAgICAgfQogICAgIH0KLSAgICAKKwogICAgICMgRmlsZUxhbmcgc3RpbGwgbm90IGRlZmluZWQ/ICBTa2lwIHRoZSBmaWxlLgogICAgIG5leHQgaWYgKCFkZWZpbmVkICRGaWxlTGFuZyk7CiAKQEAgLTY0NCw4ICs2NTUsOCBAQAogICAgIG5leHQgaWYgKCFkZWZpbmVkICRMYW5nc0FjY2VwdGVkeyRGaWxlTGFuZ30pOwogCiAgICAgbXkgQENtZEFyZ3M7Ci0gICAgbXkgQEFuYWx5emVBcmdzOyAgICAKLSAgICAKKyAgICBteSBAQW5hbHl6ZUFyZ3M7CisKICAgICBpZiAoJEZpbGVMYW5nIG5lICd1bmtub3duJykgewogICAgICAgcHVzaCBAQ21kQXJncywgJy14JywgJEZpbGVMYW5nOwogICAgIH0KQEAgLTY2MSw3ICs2NzIsNyBAQAogICAgIGlmIChkZWZpbmVkICRJbnRlcm5hbFN0YXRzKSB7CiAgICAgICBwdXNoIEBBbmFseXplQXJncywgIi1hbmFseXplci1zdGF0cyI7CiAgICAgfQotICAgIAorCiAgICAgaWYgKGRlZmluZWQgJEFuYWx5c2VzKSB7CiAgICAgICBwdXNoIEBBbmFseXplQXJncywgc3BsaXQgJ1xzKycsICRBbmFseXNlczsKICAgICB9CkBAIC02NzcsMTIgKzY4OCwxNSBAQAogICAgICAgICBteSAoJGgsICRmKSA9IHRlbXBmaWxlKCJyZXBvcnQtWFhYWFhYIiwgU1VGRklYID0+ICIucGxpc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJUiA9PiAkSHRtbERpcik7CiAgICAgICAgICRSZXN1bHRGaWxlID0gJGY7Ci0gICAgICAgICMgSWYgdGhlIEh0bWxEaXIgaXMgbm90IHNldCwgd2Ugc291bGQgY2xlYW4gdXAgdGhlIHBsaXN0IGZpbGVzLgorICAgICAgICAjIElmIHRoZSBIdG1sRGlyIGlzIG5vdCBzZXQsIHdlIHNob3VsZCBjbGVhbiB1cCB0aGUgcGxpc3QgZmlsZXMuCiAgICAgICAgIGlmICghZGVmaW5lZCAkSHRtbERpciB8fCAteiAkSHRtbERpcikgewogICAgICAgICAgICRDbGVhbnVwRmlsZSA9ICRmOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQorICAgIGlmIChkZWZpbmVkICRDb25maWdPcHRpb25zKSB7CisgICAgICBwdXNoIEBBbmFseXplQXJncywgc3BsaXQgJ1xzKycsICRDb25maWdPcHRpb25zOworICAgIH0KIAogICAgIHB1c2ggQENtZEFyZ3MsIEBDb21waWxlT3B0czsKICAgICBwdXNoIEBDbWRBcmdzLCAkZmlsZTsKQEAgLTcwNCw0ICs3MTgsMyBAQAogfQogCiBleGl0KCRTdGF0dXMgPj4gOCk7Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL3NjYW4tYnVpbGQvc2Nhbi1idWlsZCBiL3Rvb2xzL3NjYW4tYnVpbGQvc2Nhbi1idWlsZAppbmRleCAwZjExOWY2Li4zMWRiZmI0IDEwMDc1NQotLS0gYS90b29scy9zY2FuLWJ1aWxkL3NjYW4tYnVpbGQKKysrIGIvdG9vbHMvc2Nhbi1idWlsZC9zY2FuLWJ1aWxkCkBAIC0zMiw3ICszMiw3IEBACiBteSAkVXNlQ29sb3IgPSAoZGVmaW5lZCAkVEVSTSBhbmQgJFRFUk0gPX4gJ3h0ZXJtLS4qY29sb3InIGFuZCAtdCBTVERPVVQKICAgICAgICAgICAgICAgICBhbmQgZGVmaW5lZCAkRU5WeydTQ0FOX0JVSUxEX0NPTE9SJ30pOwogCi0jIFBvcnRhYmlsaXR5OiBnZXRwd3VpZCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIFdpbjMyIChzZWUgUGVybCBsYW5ndWFnZSAKKyMgUG9ydGFiaWxpdHk6IGdldHB3dWlkIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgV2luMzIgKHNlZSBQZXJsIGxhbmd1YWdlCiAjIHJlZmVyZW5jZSwgcGVybHBvcnQpLCB1c2UgZ2V0bG9naW4gaW5zdGVhZC4KIG15ICRVc2VyTmFtZSA9IEh0bWxFc2NhcGUoZ2V0bG9naW4oKSB8fCBnZXRwd3VpZCgkPCkgfHwgJ3Vua25vd24nKTsKIG15ICRIb3N0TmFtZSA9IEh0bWxFc2NhcGUoaG9zdG5hbWUoKSB8fCAndW5rbm93bicpOwpAQCAtNTcsNyArNTcsNyBAQAogICB9CiAgIGVsc2UgewogICAgIHByaW50ICIkUHJvZzogQF8iOwotICB9ICAKKyAgfQogfQogCiBzdWIgRXJyb3JEaWFnIHsKQEAgLTY3LDcgKzY3LDcgQEAKICAgICBwcmludCBTVERFUlIgUkVTRVQ7CiAgIH0gZWxzZSB7CiAgICAgcHJpbnQgU1RERVJSICIkUHJvZzogQF8iOwotICB9ICAKKyAgfQogfQogCiBzdWIgRGlhZ0NyYXNoZXMgewpAQCAtMTE4LDIwICsxMTgsMjAgQEAKICMgR2V0SFRNTFJ1bkRpciAtIENvbnN0cnVjdCBhbiBIVE1MIGRpcmVjdG9yeSBuYW1lIGZvciB0aGUgY3VycmVudCBzdWItcnVuLgogIyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIyMKIAotc3ViIEdldEhUTUxSdW5EaXIgeyAgCi0gIGRpZSAiTm90IGVub3VnaCBhcmd1bWVudHMuIiBpZiAoQF8gPT0gMCk7ICAKLSAgbXkgJERpciA9IHNoaWZ0IEBfOyAgICAKK3N1YiBHZXRIVE1MUnVuRGlyIHsKKyAgZGllICJOb3QgZW5vdWdoIGFyZ3VtZW50cy4iIGlmIChAXyA9PSAwKTsKKyAgbXkgJERpciA9IHNoaWZ0IEBfOwogICBteSAkVG1wTW9kZSA9IDA7CiAgIGlmICghZGVmaW5lZCAkRGlyKSB7CiAgICAgJERpciA9ICRFTlZ7J1RNUERJUid9IHx8ICRFTlZ7J1RFTVAnfSB8fCAkRU5WeydUTVAnfSB8fCAiL3RtcCI7CiAgICAgJFRtcE1vZGUgPSAxOwogICB9Ci0gIAorCiAgICMgQ2hvcCBvZmYgYW55IHRyYWlsaW5nICcvJyBjaGFyYWN0ZXJzLgogICB3aGlsZSAoJERpciA9fiAvXC8kLykgeyBjaG9wICREaXI7IH0KIAogICAjIEdldCBjdXJyZW50IGRhdGUgYW5kIHRpbWUuCi0gIG15IEBDdXJyZW50VGltZSA9IGxvY2FsdGltZSgpOyAgCisgIG15IEBDdXJyZW50VGltZSA9IGxvY2FsdGltZSgpOwogICBteSAkeWVhciAgPSAkQ3VycmVudFRpbWVbNV0gKyAxOTAwOwogICBteSAkZGF5ICAgPSAkQ3VycmVudFRpbWVbM107CiAgIG15ICRtb250aCA9ICRDdXJyZW50VGltZVs0XSArIDE7CkBAIC0xNDIsMTYgKzE0MiwxNiBAQAogICBteSAkVGltZVN0cmluZyA9IHNwcmludGYoIiUwMmQlMDJkJTAyZCIsICRob3VyLCAkbWluLCAkc2VjKTsKICAgbXkgJERhdGVTdHJpbmcgPSBzcHJpbnRmKCIlZC0lMDJkLSUwMmQtJXMtJCQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHllYXIsICRtb250aCwgJGRheSwgJFRpbWVTdHJpbmcpOwotICAKLSAgIyBEZXRlcm1pbmUgdGhlIHJ1biBudW1iZXIuICAKKworICAjIERldGVybWluZSB0aGUgcnVuIG51bWJlci4KICAgbXkgJFJ1bk51bWJlcjsKLSAgCi0gIGlmICgtZCAkRGlyKSB7ICAgIAorCisgIGlmICgtZCAkRGlyKSB7CiAgICAgaWYgKCEgLXIgJERpcikgewogICAgICAgRGllRGlhZygiZGlyZWN0b3J5ICckRGlyJyBleGlzdHMgYnV0IGlzIG5vdCByZWFkYWJsZS5cbiIpOwotICAgIH0gICAgCi0gICAgIyBJdGVyYXRlIG92ZXIgYWxsIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LiAgICAKLSAgICBteSAkbWF4ID0gMDsgICAgCisgICAgfQorICAgICMgSXRlcmF0ZSBvdmVyIGFsbCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KKyAgICBteSAkbWF4ID0gMDsKICAgICBvcGVuZGlyKERJUiwgJERpcik7CiAgICAgbXkgQEZJTEVTID0gZ3JlcCB7IC1kICIkRGlyLyRfIiB9IHJlYWRkaXIoRElSKTsKICAgICBjbG9zZWRpcihESVIpOwpAQCAtMTcwLDE2ICsxNzAsMTYgQEAKICAgICAgIG5leHQgaWYgKCR4WzJdICE9ICRkYXkpOwogICAgICAgbmV4dCBpZiAoJHhbM10gIT0gJFRpbWVTdHJpbmcpOwogICAgICAgbmV4dCBpZiAoJHhbNF0gIT0gJCQpOwotICAgICAgCisKICAgICAgIGlmICgkeFs1XSA+ICRtYXgpIHsKICAgICAgICAgJG1heCA9ICR4WzVdOwotICAgICAgfSAgICAgIAorICAgICAgfQogICAgIH0KLSAgICAKKwogICAgICRSdW5OdW1iZXIgPSAkbWF4ICsgMTsKICAgfQogICBlbHNlIHsKLSAgICAKKwogICAgIGlmICgteCAkRGlyKSB7CiAgICAgICBEaWVEaWFnKCInJERpcicgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnkuXG4iKTsKICAgICB9CkBAIC0xODgsMTQgKzE4OCwxNCBAQAogICAgICAgRGllRGlhZygiVGhlIGRpcmVjdG9yeSAnL3RtcCcgZG9lcyBub3QgZXhpc3Qgb3IgY2Fubm90IGJlIGFjY2Vzc2VkLlxuIik7CiAgICAgfQogCi0gICAgIyAkRGlyIGRvZXMgbm90IGV4aXN0LiAgSXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdGhlIAotICAgICMgY2xhbmcgZHJpdmVyLiAgU2V0IHRoZSBydW4gbnVtYmVyIHRvIDEuICAKKyAgICAjICREaXIgZG9lcyBub3QgZXhpc3QuICBJdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUKKyAgICAjIGNsYW5nIGRyaXZlci4gIFNldCB0aGUgcnVuIG51bWJlciB0byAxLgogCiAgICAgJFJ1bk51bWJlciA9IDE7CiAgIH0KLSAgCisKICAgZGllICJSdW5OdW1iZXIgbXVzdCBiZSBkZWZpbmVkISIgaWYgKCFkZWZpbmVkICRSdW5OdW1iZXIpOwotICAKKwogICAjIEFwcGVuZCB0aGUgcnVuIG51bWJlci4KICAgbXkgJE5ld0RpcjsKICAgaWYgKCRUbXBNb2RlKSB7CkBAIC0yMDksMjQgKzIwOSwyNCBAQAogfQogCiBzdWIgU2V0SHRtbEVudiB7Ci0gIAorCiAgIGRpZSAiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy4iIGlmIChzY2FsYXIoQF8pICE9IDIpOwotICAKKwogICBteSAkQXJncyA9IHNoaWZ0OwogICBteSAkRGlyID0gc2hpZnQ7Ci0gIAorCiAgIGRpZSAiTm8gYnVpbGQgY29tbWFuZC4iIGlmIChzY2FsYXIoQCRBcmdzKSA9PSAwKTsKLSAgCisKICAgbXkgJENtZCA9ICQkQXJnc1swXTsKIAogICBpZiAoJENtZCA9fiAvY29uZmlndXJlLyB8fCAkQ21kID1+IC9hdXRvZ2VuLykgewogICAgIHJldHVybjsKICAgfQotICAKKwogICBpZiAoJFZlcmJvc2UpIHsKICAgICBEaWFnKCJFbWl0dGluZyByZXBvcnRzIGZvciB0aGlzIHJ1biB0byAnJERpcicuXG4iKTsKICAgfQotICAKKwogICAkRU5WeydDQ0NfQU5BTFlaRVJfSFRNTCd9ID0gJERpcjsKIH0KIApAQCAtMjM2LDE4ICsyMzYsMTggQEAKIAogc3ViIENvbXB1dGVEaWdlc3QgewogICBteSAkRk5hbWUgPSBzaGlmdDsKLSAgRGllRGlhZygiQ2Fubm90IHJlYWQgJEZOYW1lIHRvIGNvbXB1dGUgRGlnZXN0LlxuIikgaWYgKCEgLXIgJEZOYW1lKTsgIAotICAKKyAgRGllRGlhZygiQ2Fubm90IHJlYWQgJEZOYW1lIHRvIGNvbXB1dGUgRGlnZXN0LlxuIikgaWYgKCEgLXIgJEZOYW1lKTsKKwogICAjIFVzZSBEaWdlc3Q6Ok1ENS4gIFdlIGRvbid0IGhhdmUgdG8gYmUgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlLiAgV2UncmUKICAgIyBqdXN0IGxvb2tpbmcgZm9yIGR1cGxpY2F0ZSBmaWxlcyB0aGF0IGNvbWUgZnJvbSBhIG5vbi1tYWxpY2lvdXMgc291cmNlLgogICAjIFdlIHVzZSBEaWdlc3Q6Ok1ENSBiZWNhdXNlIGl0IGlzIGEgc3RhbmRhcmQgUGVybCBtb2R1bGUgdGhhdCBzaG91bGQKLSAgIyBjb21lIGJ1bmRsZWQgb24gbW9zdCBzeXN0ZW1zLiAgCisgICMgY29tZSBidW5kbGVkIG9uIG1vc3Qgc3lzdGVtcy4KICAgb3BlbihGSUxFLCAkRk5hbWUpIG9yIERpZURpYWcoIkNhbm5vdCBvcGVuICRGTmFtZSB3aGVuIGNvbXB1dGluZyBEaWdlc3QuXG4iKTsKICAgYmlubW9kZSBGSUxFOwogICBteSAkUmVzdWx0ID0gRGlnZXN0OjpNRDUtPm5ldy0+YWRkZmlsZSgqRklMRSktPmhleGRpZ2VzdDsKICAgY2xvc2UoRklMRSk7Ci0gIAotICAjIFJldHVybiB0aGUgZGlnZXN0LiAgCisKKyAgIyBSZXR1cm4gdGhlIGRpZ2VzdC4KICAgcmV0dXJuICRSZXN1bHQ7CiB9CiAKQEAgLTI2Niw3ICsyNjYsNyBAQAogICAgICRQcmVmaXggPSAkeDsKICAgICByZXR1cm47CiAgIH0KLSAgCisKICAgY2hvcCAkUHJlZml4IHdoaWxlICghKCR4ID1+IC9eXFEkUHJlZml4LykpOwogfQogCkBAIC0zMzksMTUgKzMzOSwxNSBAQAogbXkgJUFscmVhZHlTY2FubmVkOwogCiBzdWIgU2NhbkZpbGUgewotICAKKwogICBteSAkSW5kZXggPSBzaGlmdDsKICAgbXkgJERpciA9IHNoaWZ0OwogICBteSAkRk5hbWUgPSBzaGlmdDsKICAgbXkgJFN0YXRzID0gc2hpZnQ7Ci0gIAorCiAgICMgQ29tcHV0ZSBhIGRpZ2VzdCBmb3IgdGhlIHJlcG9ydCBmaWxlLiAgRGV0ZXJtaW5lIGlmIHdlIGhhdmUgYWxyZWFkeQogICAjIHNjYW5uZWQgYSBmaWxlIHRoYXQgbG9va3MganVzdCBsaWtlIGl0LgotICAKKwogICBteSAkZGlnZXN0ID0gQ29tcHV0ZURpZ2VzdCgiJERpci8kRk5hbWUiKTsKIAogICBpZiAoZGVmaW5lZCAkQWxyZWFkeVNjYW5uZWR7JGRpZ2VzdH0pIHsKQEAgLTM1NSwxMiArMzU1LDEyIEBACiAgICAgc3lzdGVtICgicm0iLCAiLWYiLCAiJERpci8kRk5hbWUiKTsKICAgICByZXR1cm47CiAgIH0KLSAgCisKICAgJEFscmVhZHlTY2FubmVkeyRkaWdlc3R9ID0gMTsKLSAgCisKICAgIyBBdCB0aGlzIHBvaW50IHRoZSByZXBvcnQgZmlsZSBpcyBub3Qgd29ybGQgcmVhZGFibGUuICBNYWtlIGl0IGhhcHBlbi4KICAgc3lzdGVtICgiY2htb2QiLCAiNjQ0IiwgIiREaXIvJEZOYW1lIik7Ci0gIAorCiAgICMgU2NhbiB0aGUgcmVwb3J0IGZpbGUgZm9yIHRhZ3MuCiAgIG9wZW4oSU4sICIkRGlyLyRGTmFtZSIpIG9yIERpZURpYWcoIkNhbm5vdCBvcGVuICckRGlyLyRGTmFtZSdcbiIpOwogCkBAIC0zODUsNyArMzg1LDcgQEAKICAgICAgICRCdWdQYXRoTGVuZ3RoID0gJDE7CiAgICAgfQogICAgIGVsc2lmICgvPCEtLSBCVUdMSU5FICguKikgLS0+JC8pIHsKLSAgICAgICRCdWdMaW5lID0gJDE7ICAgIAorICAgICAgJEJ1Z0xpbmUgPSAkMTsKICAgICB9CiAgICAgZWxzaWYgKC88IS0tIEJVR0NBVEVHT1JZICguKikgLS0+JC8pIHsKICAgICAgICRCdWdDYXRlZ29yeSA9ICQxOwpAQCAtMzk2LDcgKzM5Niw3IEBACiAgIH0KIAogICBjbG9zZShJTik7Ci0gIAorCiAgIGlmICghZGVmaW5lZCAkQnVnQ2F0ZWdvcnkpIHsKICAgICAkQnVnQ2F0ZWdvcnkgPSAiT3RoZXIiOwogICB9CkBAIC00MDYsNyArNDA2LDcgQEAKICAgICBBZGRTdGF0TGluZSgkQnVnRGVzY3JpcHRpb24sICRTdGF0cywgJEJ1Z0ZpbGUpOwogICAgIHJldHVybjsKICAgfQotICAKKwogICBwdXNoIEAkSW5kZXgsWyAkRk5hbWUsICRCdWdDYXRlZ29yeSwgJEJ1Z1R5cGUsICRCdWdGaWxlLCAkQnVnTGluZSwKICAgICAgICAgICAgICAgICAgJEJ1Z1BhdGhMZW5ndGggXTsKIH0KQEAgLTQyMCwxNyArNDIwLDE3IEBACiAgIG15ICREaXIgPSBzaGlmdDsKIAogICBteSAkSlMgPSBDd2Q6OnJlYWxwYXRoKCIkUmVhbEJpbi9zb3J0dGFibGUuanMiKTsKLSAgCisKICAgRGllRGlhZygiQ2Fubm90IGZpbmQgJ3NvcnR0YWJsZS5qcycuXG4iKQotICAgIGlmICghIC1yICRKUyk7ICAKKyAgICBpZiAoISAtciAkSlMpOwogCiAgIHN5c3RlbSAoImNwIiwgJEpTLCAiJERpciIpOwogCiAgIERpZURpYWcoIkNvdWxkIG5vdCBjb3B5ICdzb3J0dGFibGUuanMnIHRvICckRGlyJy5cbiIpCiAgICAgaWYgKCEgLXIgIiREaXIvc29ydHRhYmxlLmpzIik7Ci0gICAgCisKICAgbXkgJENTUyA9IEN3ZDo6cmVhbHBhdGgoIiRSZWFsQmluL3NjYW52aWV3LmNzcyIpOwotICAKKwogICBEaWVEaWFnKCJDYW5ub3QgZmluZCAnc2NhbnZpZXcuY3NzJy5cbiIpCiAgICAgaWYgKCEgLXIgJENTUyk7CiAKQEAgLTQ5Myw3ICs0OTMsNyBAQAogCiBteSBAZmlsZXNGb3VuZDsKIG15ICRiYXNlRGlyOwotc3ViIEZpbGVXYW50ZWQgeyAKK3N1YiBGaWxlV2FudGVkIHsKICAgICBteSAkYmFzZURpclJlZ0V4ID0gcXVvdGVtZXRhICRiYXNlRGlyOwogICAgIG15ICRmaWxlID0gJEZpbGU6OkZpbmQ6Om5hbWU7CiAgICAgaWYgKCRmaWxlID1+IC9yZXBvcnQtLipcLmh0bWwkLykgewpAQCAtNTA0LDE0ICs1MDQsMTQgQEAKIH0KIAogc3ViIFBvc3Rwcm9jZXNzIHsKLSAgCisKICAgbXkgJERpciAgICAgICAgICAgPSBzaGlmdDsKICAgbXkgJEJhc2VEaXIgICAgICAgPSBzaGlmdDsKICAgbXkgJEFuYWx5emVyU3RhdHMgPSBzaGlmdDsKICAgbXkgJEtlZXBFbXB0eSAgICAgPSBzaGlmdDsKLSAgCisKICAgZGllICJObyBkaXJlY3Rvcnkgc3BlY2lmaWVkLiIgaWYgKCFkZWZpbmVkICREaXIpOwotICAKKwogICBpZiAoISAtZCAkRGlyKSB7CiAgICAgRGlhZygiTm8gYnVncyBmb3VuZC5cbiIpOwogICAgIHJldHVybiAwOwpAQCAtNTI4LDEyICs1MjgsMTIgQEAKICAgICBEaWFnKCJObyBidWdzIGZvdW5kLlxuIik7CiAgICAgcmV0dXJuIDA7CiAgIH0KLSAgCi0gICMgU2NhbiBlYWNoIHJlcG9ydCBmaWxlIGFuZCBidWlsZCBhbiBpbmRleC4gIAorCisgICMgU2NhbiBlYWNoIHJlcG9ydCBmaWxlIGFuZCBidWlsZCBhbiBpbmRleC4KICAgbXkgQEluZGV4OwogICBteSBAU3RhdHM7CiAgIGZvcmVhY2ggbXkgJGZpbGUgKEBmaWxlc0ZvdW5kKSB7IFNjYW5GaWxlKFxASW5kZXgsICREaXIsICRmaWxlLCBcQFN0YXRzKTsgfQotICAKKwogICAjIFNjYW4gdGhlIGZhaWx1cmVzIGRpcmVjdG9yeSBhbmQgdXNlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgLmluZm8gZmlsZXMKICAgIyB0byB1cGRhdGUgdGhlIGNvbW1vbiBwcmVmaXggZGlyZWN0b3J5LgogICBteSBAZmFpbHVyZXM7CkBAIC01NDIsNyArNTQyLDcgQEAKICAgICBvcGVuZGlyKERJUiwgIiREaXIvZmFpbHVyZXMiKTsKICAgICBAZmFpbHVyZXMgPSBncmVwIHsgL1suXWluZm8udHh0JC8gJiYgIS9hdHRyaWJ1dGVfaWdub3JlZC87IH0gcmVhZGRpcihESVIpOwogICAgIGNsb3NlZGlyKERJUik7Ci0gICAgb3BlbmRpcihESVIsICIkRGlyL2ZhaWx1cmVzIik7ICAgICAgICAKKyAgICBvcGVuZGlyKERJUiwgIiREaXIvZmFpbHVyZXMiKTsKICAgICBAYXR0cmlidXRlc19pZ25vcmVkID0gZ3JlcCB7IC9eYXR0cmlidXRlX2lnbm9yZWQvOyB9IHJlYWRkaXIoRElSKTsKICAgICBjbG9zZWRpcihESVIpOwogICAgIGZvcmVhY2ggbXkgJGZpbGUgKEBmYWlsdXJlcykgewpAQCAtNTUwLDE1ICs1NTAsMTUgQEAKICAgICAgIG15ICRQYXRoID0gPElOPjsKICAgICAgIGlmIChkZWZpbmVkICRQYXRoKSB7IFVwZGF0ZVByZWZpeCgkUGF0aCk7IH0KICAgICAgIGNsb3NlIElOOwotICAgIH0gICAgCisgICAgfQogICB9Ci0gIAotICAjIEdlbmVyYXRlIGFuIGluZGV4Lmh0bWwgZmlsZS4gIAotICBteSAkRk5hbWUgPSAiJERpci9pbmRleC5odG1sIjsgIAorCisgICMgR2VuZXJhdGUgYW4gaW5kZXguaHRtbCBmaWxlLgorICBteSAkRk5hbWUgPSAiJERpci9pbmRleC5odG1sIjsKICAgb3BlbihPVVQsICI+IiwgJEZOYW1lKSBvciBEaWVEaWFnKCJDYW5ub3QgY3JlYXRlIGZpbGUgJyRGTmFtZSdcbiIpOwotICAKKwogICAjIFByaW50IG91dCB0aGUgaGVhZGVyLgotICAKKwogcHJpbnQgT1VUIDw8RU5EVEVYVDsKIDxodG1sPgogPGhlYWQ+CkBAIC01ODksMTMgKzU4OSwxMyBAQAogfQogCiBmdW5jdGlvbiByZXR1cm5PYmpCeUlkKCBpZCApIHsKLSAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQpIAorICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCkKICAgICAgICAgdmFyIHJldHVyblZhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgICBlbHNlIGlmIChkb2N1bWVudC5hbGwpCiAgICAgICAgIHZhciByZXR1cm5WYXIgPSBkb2N1bWVudC5hbGxbaWRdOwotICAgIGVsc2UgaWYgKGRvY3VtZW50LmxheWVycykgCisgICAgZWxzZSBpZiAoZG9jdW1lbnQubGF5ZXJzKQogICAgICAgICB2YXIgcmV0dXJuVmFyID0gZG9jdW1lbnQubGF5ZXJzW2lkXTsKLSAgICByZXR1cm4gcmV0dXJuVmFyOyAKKyAgICByZXR1cm4gcmV0dXJuVmFyOwogfQogCiB2YXIgTnVtVW5jaGVja2VkID0gMDsKQEAgLTY1MiwxNCArNjUyLDE0IEBACiAgICAgaWYgKGRlZmluZWQgJEJ1aWxkTmFtZSkgewogICAgICAgcHJpbnQgT1VUICJcbjxwPlJlc3VsdHMgaW4gdGhpcyBhbmFseXNpcyBydW4gYXJlIGJhc2VkIG9uIGFuYWx5emVyIGJ1aWxkIDxiPiRCdWlsZE5hbWU8L2I+LjwvcD5cbiIKICAgICB9Ci0gIAorCiAgIG15ICRUb3RhbEJ1Z3MgPSBzY2FsYXIoQEluZGV4KTsKIHByaW50IE9VVCA8PEVORFRFWFQ7CiA8dGFibGU+CiA8dGhlYWQ+PHRyPjx0ZD5CdWcgVHlwZTwvdGQ+PHRkPlF1YW50aXR5PC90ZD48dGQgY2xhc3M9InNvcnR0YWJsZV9ub3NvcnQiPkRpc3BsYXk/PC90ZD48L3RyPjwvdGhlYWQ+CiA8dHIgc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQiPjx0ZCBjbGFzcz0iU1VNTV9ERVNDIj5BbGwgQnVnczwvdGQ+PHRkIGNsYXNzPSJRIj4kVG90YWxCdWdzPC90ZD48dGQ+PGNlbnRlcj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJBbGxCdWdzQ2hlY2siIG9uQ2xpY2s9IkNvcHlDaGVja2VkU3RhdGVUb0NoZWNrQnV0dG9ucyh0aGlzKTsiIGNoZWNrZWQvPjwvY2VudGVyPjwvdGQ+PC90cj4KIEVORFRFWFQKLSAgCisKICAgICBteSAkbGFzdF9jYXRlZ29yeTsKIAogICAgIGZvciBteSAka2V5ICgKQEAgLTY2OSwxNCArNjY5LDE0IEBACiAgICAgICAgIG15ICRyZXMgPSAkeC0+WzFdIGNtcCAkeS0+WzFdOwogICAgICAgICAkcmVzID0gJHgtPlsyXSBjbXAgJHktPlsyXSBpZiAoJHJlcyA9PSAwKTsKICAgICAgICAgJHJlcwotICAgICAgfSBrZXlzICVUb3RhbHMgKSAKKyAgICAgIH0ga2V5cyAlVG90YWxzICkKICAgICB7CiAgICAgICBteSAkdmFsID0gJFRvdGFsc3ska2V5fTsKICAgICAgIG15ICRjYXRlZ29yeSA9ICR2YWwtPlsxXTsKICAgICAgIGlmICghZGVmaW5lZCAkbGFzdF9jYXRlZ29yeSBvciAkbGFzdF9jYXRlZ29yeSBuZSAkY2F0ZWdvcnkpIHsKICAgICAgICAgJGxhc3RfY2F0ZWdvcnkgPSAkY2F0ZWdvcnk7CiAgICAgICAgIHByaW50IE9VVCAiPHRyPjx0aD4kY2F0ZWdvcnk8L3RoPjx0aCBjb2xzcGFuPTI+PC90aD48L3RyPlxuIjsKLSAgICAgIH0gICAgICAKKyAgICAgIH0KICAgICAgIG15ICR4ID0gbGMgJGtleTsKICAgICAgICR4ID1+IHMvWyAsJyI6XC8oKV0rL18vZzsKICAgICAgIHByaW50IE9VVCAiPHRyPjx0ZCBjbGFzcz1cIlNVTU1fREVTQ1wiPiI7CkBAIC03MDksMTkgKzcwOSwxOSBAQAogICAgIG15ICRyZWdleDsKICAgICBteSAkSW5GaWxlUmVnZXg7CiAgICAgbXkgJEluRmlsZVByZWZpeCA9ICJGaWxlOjwvdGQ+PHRkPiI7Ci0gIAotICAgIGlmIChkZWZpbmVkICRwcmVmaXgpIHsgCi0gICAgICAkcmVnZXggPSBxci9eXFEkcHJlZml4XEUvaXM7ICAgIAorCisgICAgaWYgKGRlZmluZWQgJHByZWZpeCkgeworICAgICAgJHJlZ2V4ID0gcXIvXlxRJHByZWZpeFxFL2lzOwogICAgICAgJEluRmlsZVJlZ2V4ID0gcXIvXFEkSW5GaWxlUHJlZml4JHByZWZpeFxFL2lzOwotICAgIH0gICAgCisgICAgfQogCiAgICAgZm9yIG15ICRyb3cgKCBzb3J0IHsgJGEtPlsyXSBjbXAgJGItPlsyXSB9IEBJbmRleCApIHsKICAgICAgIG15ICR4ID0gIiRyb3ctPlsxXTokcm93LT5bMl0iOwogICAgICAgJHggPSBsYyAkeDsKICAgICAgICR4ID1+IHMvWyAsJyI6XC8oKV0rL18vZzsKLSAgICAKKwogICAgICAgbXkgJFJlcG9ydEZpbGUgPSAkcm93LT5bMF07Ci0gICAgICAgICAgCisKICAgICAgIHByaW50IE9VVCAiPHRyIGNsYXNzPVwiYnRfJHhcIj4iOwogICAgICAgcHJpbnQgT1VUICI8dGQgY2xhc3M9XCJERVNDXCI+IjsKICAgICAgIHByaW50IE9VVCAkcm93LT5bMV07CkBAIC03MjksMTYgKzcyOSwxNiBAQAogICAgICAgcHJpbnQgT1VUICI8dGQgY2xhc3M9XCJERVNDXCI+IjsKICAgICAgIHByaW50IE9VVCAkcm93LT5bMl07CiAgICAgICBwcmludCBPVVQgIjwvdGQ+IjsKLSAgICAgIAotICAgICAgIyBVcGRhdGUgdGhlIGZpbGUgcHJlZml4LiAgICAgIAorCisgICAgICAjIFVwZGF0ZSB0aGUgZmlsZSBwcmVmaXguCiAgICAgICBteSAkZm5hbWUgPSAkcm93LT5bM107CiAKICAgICAgIGlmIChkZWZpbmVkICRyZWdleCkgewogICAgICAgICAkZm5hbWUgPX4gcy8kcmVnZXgvLzsKICAgICAgICAgVXBkYXRlSW5GaWxlUGF0aCgiJERpci8kUmVwb3J0RmlsZSIsICRJbkZpbGVSZWdleCwgJEluRmlsZVByZWZpeCkKICAgICAgIH0KLSAgICAgIAotICAgICAgcHJpbnQgT1VUICI8dGQ+IjsgICAgICAKKworICAgICAgcHJpbnQgT1VUICI8dGQ+IjsKICAgICAgIG15IEBmbmFtZSA9IHNwbGl0IC9cLy8sJGZuYW1lOwogICAgICAgaWYgKCQjZm5hbWUgPiAwKSB7CiAgICAgICAgIHdoaWxlICgkI2ZuYW1lID49IDApIHsKQEAgLTc1MSwxNCArNzUxLDE0IEBACiAgICAgICB9CiAgICAgICBlbHNlIHsKICAgICAgICAgcHJpbnQgT1VUICRmbmFtZTsKLSAgICAgIH0gICAgICAKKyAgICAgIH0KICAgICAgIHByaW50IE9VVCAiPC90ZD4iOwotICAgICAgCisKICAgICAgICMgUHJpbnQgb3V0IHRoZSBxdWFudGl0aWVzLgogICAgICAgZm9yIG15ICRqICggNCAuLiA1ICkgewotICAgICAgICBwcmludCBPVVQgIjx0ZCBjbGFzcz1cIlFcIj4kcm93LT5bJGpdPC90ZD4iOyAgICAgICAgCisgICAgICAgIHByaW50IE9VVCAiPHRkIGNsYXNzPVwiUVwiPiRyb3ctPlskal08L3RkPiI7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgIyBQcmludCB0aGUgcmVzdCBvZiB0aGUgY29sdW1ucy4KICAgICAgIGZvciAobXkgJGogPSA2OyAkaiA8PSAkI3skcm93fTsgKyskaikgewogICAgICAgICBwcmludCBPVVQgIjx0ZD4kcm93LT5bJGpdPC90ZD4iCkBAIC03NjYsMjAgKzc2NiwyMCBAQAogCiAgICAgICAjIEVtaXQgdGhlICJWaWV3IiBsaW5rLgogICAgICAgcHJpbnQgT1VUICI8dGQ+PGEgaHJlZj1cIiRSZXBvcnRGaWxlI0VuZFBhdGhcIj5WaWV3IFJlcG9ydDwvYT48L3RkPiI7Ci0gICAgICAgIAorCiAgICAgICAjIEVtaXQgUkVQT1JUQlVHIG1hcmtlcnMuCiAgICAgICBwcmludCBPVVQgIlxuPCEtLSBSRVBPUlRCVUcgaWQ9XCIkUmVwb3J0RmlsZVwiIC0tPlxuIjsKLSAgICAgICAgCisKICAgICAgICMgRW5kIHRoZSByb3cuCiAgICAgICBwcmludCBPVVQgIjwvdHI+XG4iOwogICAgIH0KLSAgCisKICAgICBwcmludCBPVVQgIjwvdGJvZHk+XG48L3RhYmxlPlxuXG4iOwogICB9CiAKICAgaWYgKHNjYWxhciAoQGZhaWx1cmVzKSB8fCBzY2FsYXIoQGF0dHJpYnV0ZXNfaWdub3JlZCkpIHsKICAgICBwcmludCBPVVQgIjxoMj5BbmFseXplciBGYWlsdXJlczwvaDI+XG4iOwotICAgIAorCiAgICAgaWYgKHNjYWxhciBAYXR0cmlidXRlc19pZ25vcmVkKSB7CiAgICAgICBwcmludCBPVVQgIlRoZSBhbmFseXplcidzIHBhcnNlciBpZ25vcmVkIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8cD5cbiI7CiAgICAgICBwcmludCBPVVQgIjx0YWJsZT5cbiI7CkBAIC04MDksNyArODA5LDcgQEAKICAgICAgIH0KICAgICAgIHByaW50IE9VVCAiPC90YWJsZT5cbiI7CiAgICAgfQotICAgIAorCiAgICAgaWYgKHNjYWxhciBAZmFpbHVyZXMpIHsKICAgICAgIHByaW50IE9VVCAiPHA+VGhlIGFuYWx5emVyIGhhZCBwcm9ibGVtcyBwcm9jZXNzaW5nIHRoZSBmb2xsb3dpbmcgZmlsZXM6PC9wPlxuIjsKICAgICAgIHByaW50IE9VVCAiPHRhYmxlPlxuIjsKQEAgLTgzNSwxMSArODM1LDExIEBACiAgICAgICAgIHByaW50IE9VVCAiICA8IS0tIFJFUE9SVFBST0JMRU0gc3JjPVwiJHNyY2ZpbGVcIiBmaWxlPVwiZmFpbHVyZXMvJHBwZmlsZVwiIGNsYW5nZmlsZT1cImZhaWx1cmVzLyRwcGZpbGVfY2xhbmdcIiBzdGRlcnI9XCJmYWlsdXJlcy8kcHBmaWxlLnN0ZGVyci50eHRcIiBpbmZvPVwiZmFpbHVyZXMvJHBwZmlsZS5pbmZvLnR4dFwiIC0tPlxuIjsKICAgICAgIH0KICAgICAgIHByaW50IE9VVCAiPC90YWJsZT5cbiI7Ci0gICAgfSAgICAKKyAgICB9CiAgICAgcHJpbnQgT1VUICI8cD5QbGVhc2UgY29uc2lkZXIgc3VibWl0dGluZyBwcmVwcm9jZXNzZWQgZmlsZXMgYXMgPGEgaHJlZj1cImh0dHA6Ly9jbGFuZy1hbmFseXplci5sbHZtLm9yZy9maWxpbmdfYnVncy5odG1sXCI+YnVnIHJlcG9ydHM8L2E+LiA8IS0tIFJFUE9SVENSQVNIRVMgLS0+IDwvcD5cbiI7CiAgIH0KLSAgCi0gIHByaW50IE9VVCAiPC9ib2R5PjwvaHRtbD5cbiI7ICAKKworICBwcmludCBPVVQgIjwvYm9keT48L2h0bWw+XG4iOwogICBjbG9zZShPVVQpOwogICBDb3B5RmlsZXMoJERpcik7CiAKQEAgLTg1NSw5ICs4NTUsOSBAQAogICBpZiAoJE51bSA+IDAgJiYgLXIgIiREaXIvaW5kZXguaHRtbCIpIHsKICAgICBEaWFnKCJSdW4gJ3NjYW4tdmlldyAkRGlyJyB0byBleGFtaW5lIGJ1ZyByZXBvcnRzLlxuIik7CiAgIH0KLSAgCisKICAgRGlhZ0NyYXNoZXMoJERpcikgaWYgKHNjYWxhciBAZmFpbHVyZXMgfHwgc2NhbGFyIEBhdHRyaWJ1dGVzX2lnbm9yZWQpOwotICAKKwogICByZXR1cm4gJE51bTsKIH0KIApAQCAtODY3LDE2ICs4NjcsMTYgQEAKIAogc3ViIEFkZElmTm90UHJlc2VudCB7CiAgIG15ICRBcmdzID0gc2hpZnQ7Ci0gIG15ICRBcmcgPSBzaGlmdDsgIAorICBteSAkQXJnID0gc2hpZnQ7CiAgIG15ICRmb3VuZCA9IDA7Ci0gIAorCiAgIGZvcmVhY2ggbXkgJGsgKEAkQXJncykgewogICAgIGlmICgkayBlcSAkQXJnKSB7CiAgICAgICAkZm91bmQgPSAxOwogICAgICAgbGFzdDsKICAgICB9CiAgIH0KLSAgCisKICAgaWYgKCRmb3VuZCA9PSAwKSB7CiAgICAgcHVzaCBAJEFyZ3MsICRBcmc7CiAgIH0KQEAgLTg4NSw3ICs4ODUsOCBAQAogc3ViIFNldEVudiB7CiAgIG15ICRPcHRpb25zID0gc2hpZnQgQF87CiAgIGZvcmVhY2ggbXkgJG9wdCAoJ0NDJywgJ0NYWCcsICdDTEFORycsICdDTEFOR19DWFgnLAotICAgICAgICAgICAgICAgICAgICAnQ0NDX0FOQUxZWkVSX0FOQUxZU0lTJywgJ0NDQ19BTkFMWVpFUl9QTFVHSU5TJykgeworICAgICAgICAgICAgICAgICAgICAnQ0NDX0FOQUxZWkVSX0FOQUxZU0lTJywgJ0NDQ19BTkFMWVpFUl9QTFVHSU5TJywKKyAgICAgICAgICAgICAgICAgICAgJ0NDQ19BTkFMWVpFUl9DT05GSUcnKSB7CiAgICAgZGllICIkb3B0IGlzIHVuZGVmaW5lZFxuIiBpZiAoIWRlZmluZWQgJG9wdCk7CiAgICAgJEVOVnskb3B0fSA9ICRPcHRpb25zLT57JG9wdH07CiAgIH0KQEAgLTkwNiw3ICs5MDcsNyBAQAogfQogCiAjIFRoZSBmbGFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIC0tb3ZlcnJpZGUtY29tcGlsZXIgY29tbWFuZCBsaW5lIG9wdGlvbi4KLW15ICRPdmVycmlkZUNvbXBpbGVyID0gMDsgCitteSAkT3ZlcnJpZGVDb21waWxlciA9IDA7CiAKIHN1YiBSdW5YY29kZWJ1aWxkIHsKICAgbXkgJEFyZ3MgPSBzaGlmdDsKQEAgLTkzOSwxMyArOTQwLDEzIEBACiAgICAgfQogICB9CiAgIGNsb3NlKERFVEVDVF9YQ09ERSk7Ci0gIAotICAjIElmIC0tb3ZlcnJpZGUtY29tcGlsZXIgaXMgZXhwbGljaXRlbHkgcmVxdWVzdGVkLCByZXNvcnQgdG8gdGhlIG9sZCAKKworICAjIElmIC0tb3ZlcnJpZGUtY29tcGlsZXIgaXMgZXhwbGljaXRlbHkgcmVxdWVzdGVkLCByZXNvcnQgdG8gdGhlIG9sZAogICAjIGJlaGF2aW9yIHJlZ2FyZGxlc3Mgb2YgWGNvZGUgdmVyc2lvbi4KICAgaWYgKCRPdmVycmlkZUNvbXBpbGVyKSB7CiAgICAgJG9sZEJlaGF2aW9yID0gMTsKICAgfQotICAKKwogICBpZiAoJG9sZEJlaGF2aW9yID09IDApIHsKICAgICBteSAkT3V0cHV0RGlyID0gJE9wdGlvbnMtPnsiT1VUUFVUX0RJUiJ9OwogICAgIG15ICRDTEFORyA9ICRPcHRpb25zLT57IkNMQU5HIn07CkBAIC05NTksMTAgKzk2MCwxMCBAQAogCiAgICAgcmV0dXJuIChzeXN0ZW0oQCRBcmdzKSA+PiA4KTsKICAgfQotICAKKwogICAjIERlZmF1bHQgdG8gb2xkIGJlaGF2aW9yIHdoZXJlIHdlIGluc2VydCBhIGJvZ3VzIGNvbXBpbGVyLgogICBTZXRFbnYoJE9wdGlvbnMpOwotICAKKwogICAjIENoZWNrIGlmIHVzaW5nIGlQaG9uZSBTREsgMy4wIChzaW11bGF0b3IpLiAgSWYgc28gdGhlIGNvbXBpbGVyIGJlaW5nCiAgICMgdXNlZCBzaG91bGQgYmUgZ2NjLTQuMi4KICAgaWYgKCFkZWZpbmVkICRFTlZ7IkNDQ19DQyJ9KSB7CkBAIC05NzgsMTYgKzk3OSwxNiBAQAogCiAgICMgRGlzYWJsZSBQQ0ggZmlsZXMgdW50aWwgY2xhbmcgc3VwcG9ydHMgdGhlbS4KICAgQWRkSWZOb3RQcmVzZW50KCRBcmdzLCJHQ0NfUFJFQ09NUElMRV9QUkVGSVhfSEVBREVSPU5PIik7Ci0gIAorCiAgICMgV2hlbiAnQ0MnIGlzIHNldCwgeGNvZGVidWlsZCB1c2VzIGl0IHRvIGRvIGFsbCBsaW5raW5nLCBldmVuIGlmIHdlIGFyZQogICAjIGxpbmtpbmcgQysrIG9iamVjdCBmaWxlcy4gIFNldCAnTERQTFVTUExVUycgc28gdGhhdCB4Y29kZWJ1aWxkIHVzZXMgJ2crKycKICAgIyAodmlhIGMrKy1hbmFseXplcikgd2hlbiBsaW5raW5nIHN1Y2ggZmlsZXMuCiAgICRFTlZ7IkxEUExVU1BMVVMifSA9ICRDWFhBbmFseXplcjsKLSAKLSAgcmV0dXJuIChzeXN0ZW0oQCRBcmdzKSA+PiA4KTsgCisKKyAgcmV0dXJuIChzeXN0ZW0oQCRBcmdzKSA+PiA4KTsKIH0KIAotc3ViIFJ1bkJ1aWxkQ29tbWFuZCB7ICAKK3N1YiBSdW5CdWlsZENvbW1hbmQgewogICBteSAkQXJncyA9IHNoaWZ0OwogICBteSAkSWdub3JlRXJyb3JzID0gc2hpZnQ7CiAgIG15ICRDbWQgPSAkQXJncy0+WzBdOwpAQCAtMTAwMSwyOCArMTAwMiwyOCBAQAogCiAgICMgU2V0dXAgdGhlIGVudmlyb25tZW50LgogICBTZXRFbnYoJE9wdGlvbnMpOwotICAKLSAgaWYgKCRDbWQgPX4gLyguKlwvP2djY1teXC9dKiQpLyBvciAKKworICBpZiAoJENtZCA9fiAvKC4qXC8/Z2NjW15cL10qJCkvIG9yCiAgICAgICAkQ21kID1+IC8oLipcLz9jY1teXC9dKiQpLyBvcgogICAgICAgJENtZCA9fiAvKC4qXC8/bGx2bS1nY2NbXlwvXSokKS8gb3IKLSAgICAgICRDbWQgPX4gLyguKlwvP2NsYW5nJCkvIG9yIAorICAgICAgJENtZCA9fiAvKC4qXC8/Y2xhbmckKS8gb3IKICAgICAgICRDbWQgPX4gLyguKlwvP2NjYy1hbmFseXplclteXC9dKiQpLykgewogCiAgICAgaWYgKCEoJENtZCA9fiAvY2NjLWFuYWx5emVyLykgYW5kICFkZWZpbmVkICRFTlZ7IkNDQ19DQyJ9KSB7Ci0gICAgICAkRU5WeyJDQ0NfQ0MifSA9ICQxOyAgICAgIAorICAgICAgJEVOVnsiQ0NDX0NDIn0gPSAkMTsKICAgICB9Ci0gICAgICAgIAorCiAgICAgc2hpZnQgQCRBcmdzOwogICAgIHVuc2hpZnQgQCRBcmdzLCAkQ0NBbmFseXplcjsKICAgfQotICBlbHNpZiAoJENtZCA9fiAvKC4qXC8/Z1wrXCtbXlwvXSokKS8gb3IgCisgIGVsc2lmICgkQ21kID1+IC8oLipcLz9nXCtcK1teXC9dKiQpLyBvcgogICAgICAgICAkQ21kID1+IC8oLipcLz9jXCtcK1teXC9dKiQpLyBvcgogICAgICAgICAkQ21kID1+IC8oLipcLz9sbHZtLWdcK1wrW15cL10qJCkvIG9yCiAgICAgICAgICRDbWQgPX4gLyguKlwvP2NsYW5nXCtcKyQpLyBvcgogICAgICAgICAkQ21kID1+IC8oLipcLz9jXCtcKy1hbmFseXplclteXC9dKiQpLykgewogICAgIGlmICghKCRDbWQgPX4gL2NcK1wrLWFuYWx5emVyLykgYW5kICFkZWZpbmVkICRFTlZ7IkNDQ19DWFgifSkgewotICAgICAgJEVOVnsiQ0NDX0NYWCJ9ID0gJDE7ICAgICAgCi0gICAgfSAgICAgICAgCisgICAgICAkRU5WeyJDQ0NfQ1hYIn0gPSAkMTsKKyAgICB9CiAgICAgc2hpZnQgQCRBcmdzOwogICAgIHVuc2hpZnQgQCRBcmdzLCAkQ1hYQW5hbHl6ZXI7CiAgIH0KQEAgLTEwMzMsNyArMTAzNCw3IEBACiAgICAgICBBZGRJZk5vdFByZXNlbnQoJEFyZ3MsIi1rIik7CiAgICAgICBBZGRJZk5vdFByZXNlbnQoJEFyZ3MsIi1pIik7CiAgICAgfQotICB9IAorICB9CiAKICAgcmV0dXJuIChzeXN0ZW0oQCRBcmdzKSA+PiA4KTsKIH0KQEAgLTEwNDMsNyArMTA0NCw3IEBACiAjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jIwogCiBzdWIgRGlzcGxheUhlbHAgewotICAKKwogcHJpbnQgPDxFTkRURVhUOwogVVNBR0U6ICRQcm9nIFtvcHRpb25zXSA8YnVpbGQgY29tbWFuZD4gW2J1aWxkIG9wdGlvbnNdCiAKQEAgLTEwNTcsMjUgKzEwNTgsMjUgQEAKIE9QVElPTlM6CiAKICAtYW5hbHl6ZS1oZWFkZXJzCi0gCisKICAgIEFsc28gYW5hbHl6ZSBmdW5jdGlvbnMgaW4gI2luY2x1ZGVkIGZpbGVzLiAgQnkgZGVmYXVsdCwgc3VjaCBmdW5jdGlvbnMKICAgIGFyZSBza2lwcGVkIHVubGVzcyB0aGV5IGFyZSBjYWxsZWQgYnkgZnVuY3Rpb25zIHdpdGhpbiB0aGUgbWFpbiBzb3VyY2UgZmlsZS4KLSAKKwogIC1vIDxvdXRwdXQgbG9jYXRpb24+Ci0gIAorCiAgICBTcGVjaWZpZXMgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIGFuYWx5emVyIHJlcG9ydHMuIFN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKICAgIGNyZWF0ZWQgYXMgbmVlZGVkIHRvIHJlcHJlc2VudCBzZXBhcmF0ZSAicnVucyIgb2YgdGhlIGFuYWx5emVyLiBJZiB0aGlzCiAgICBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgYSBkaXJlY3RvcnkgaXMgY3JlYXRlZCBpbiAvdG1wIChUTVBESVIgb24gTWFjIE9TIFgpCiAgICB0byBzdG9yZSB0aGUgcmVwb3J0cy4KIAotIC1oICAgICAgICAgICAgIAorIC1oCiAgLS1oZWxwCiAKICAgIERpc3BsYXkgdGhpcyBtZXNzYWdlLgogCiAgLWsKICAtLWtlZXAtZ29pbmcKLQkJCQkgIAorCiAgICBBZGQgYSAia2VlcCBvbiBnb2luZyIgb3B0aW9uIHRvIHRoZSBzcGVjaWZpZWQgYnVpbGQgY29tbWFuZC4gVGhpcyBvcHRpb24KICAgIGN1cnJlbnRseSBzdXBwb3J0cyBtYWtlIGFuZCB4Y29kZWJ1aWxkLiBUaGlzIGlzIGEgY29udmVuaWVuY2Ugb3B0aW9uOyBvbmUKICAgIGNhbiBzcGVjaWZ5IHRoaXMgYmVoYXZpb3IgZGlyZWN0bHkgdXNpbmcgYnVpbGQgb3B0aW9ucy4KQEAgLTEwODcsNDEgKzEwODgsNDEgQEAKICAgIHRpdGxlIHdpbGwgYmUgdXNlZC4KIAogIC1wbGlzdAotIAorCiAgICBCeSBkZWZhdWx0IHRoZSBvdXRwdXQgb2Ygc2Nhbi1idWlsZCBpcyBhIHNldCBvZiBIVE1MIGZpbGVzLiBUaGlzIG9wdGlvbgogICAgb3V0cHV0cyB0aGUgcmVzdWx0cyBhcyBhIHNldCBvZiAucGxpc3QgZmlsZXMuCi0gCisKICAtcGxpc3QtaHRtbAotIAorCiAgICBCeSBkZWZhdWx0IHRoZSBvdXRwdXQgb2Ygc2Nhbi1idWlsZCBpcyBhIHNldCBvZiBIVE1MIGZpbGVzLiBUaGlzIG9wdGlvbgogICAgb3V0cHV0cyB0aGUgcmVzdWx0cyBhcyBhIHNldCBvZiBIVE1MIGFuZCAucGxpc3QgZmlsZXMuCi0gCisKICAtLXN0YXR1cy1idWdzCi0gCisKICAgIEJ5IGRlZmF1bHQsIHRoZSBleGl0IHN0YXR1cyBvZiBzY2FuLWJ1aWxkIGlzIHRoZSBzYW1lIGFzIHRoZSBleGVjdXRlZCBidWlsZAogICAgY29tbWFuZC4gU3BlY2lmeWluZyB0aGlzIG9wdGlvbiBjYXVzZXMgdGhlIGV4aXQgc3RhdHVzIG9mIHNjYW4tYnVpbGQgdG8gYmUgMQogICAgaWYgaXQgZm91bmQgcG90ZW50aWFsIGJ1Z3MgYW5kIDAgb3RoZXJ3aXNlLgogCi0gLS11c2UtY2MgW2NvbXBpbGVyIHBhdGhdICAgCisgLS11c2UtY2MgW2NvbXBpbGVyIHBhdGhdCiAgLS11c2UtY2M9W2NvbXBpbGVyIHBhdGhdCi0gIAorCiAgICBzY2FuLWJ1aWxkIGFuYWx5emVzIGEgcHJvamVjdCBieSBpbnRlcnBvc2luZyBhICJmYWtlIGNvbXBpbGVyIiwgd2hpY2gKICAgIGV4ZWN1dGVzIGEgcmVhbCBjb21waWxlciBmb3IgY29tcGlsYXRpb24gYW5kIHRoZSBzdGF0aWMgYW5hbHl6ZXIgZm9yIGFuYWx5c2lzLgogICAgQmVjYXVzZSBvZiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcnBvc2l0aW9uLCBzY2FuLWJ1aWxkIGRvZXMgbm90CiAgICBrbm93IHdoYXQgY29tcGlsZXIgeW91ciBwcm9qZWN0IG5vcm1hbGx5IHVzZXMuICBJbnN0ZWFkLCBpdCBzaW1wbHkgb3ZlcnJpZGVzCiAgICB0aGUgQ0MgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCBndWVzc2VzIHlvdXIgZGVmYXVsdCBjb21waWxlci4KLSAgIAorCiAgICBJbiB0aGUgZnV0dXJlLCB0aGlzIGludGVycG9zaXRpb24gbWVjaGFuaXNtIHRvIGJlIGltcHJvdmVkLCBidXQgaWYgeW91IG5lZWQKICAgIHNjYW4tYnVpbGQgdG8gdXNlIGEgc3BlY2lmaWMgY29tcGlsZXIgZm9yICpjb21waWxhdGlvbiogdGhlbiB5b3UgY2FuIHVzZQogICAgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSBhIHBhdGggdG8gdGhhdCBjb21waWxlci4KIAogIC0tdXNlLWMrKyBbY29tcGlsZXIgcGF0aF0KICAtLXVzZS1jKys9W2NvbXBpbGVyIHBhdGhdCi0gCisKICAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgIi11c2UtY2MiIGJ1dCBmb3IgQysrIGNvZGUuCi0gCisKICAtdgotIAorCiAgICBFbmFibGUgdmVyYm9zZSBvdXRwdXQgZnJvbSBzY2FuLWJ1aWxkLiBBIHNlY29uZCBhbmQgdGhpcmQgJy12JyBpbmNyZWFzZXMKICAgIHZlcmJvc2l0eS4KIApAQCAtMTEzMywyNiArMTEzNCwyNiBAQAogQURWQU5DRUQgT1BUSU9OUzoKIAogIC1uby1mYWlsdXJlLXJlcG9ydHMKLSAKKwogICAgRG8gbm90IGNyZWF0ZSBhICdmYWlsdXJlcycgc3ViZGlyZWN0b3J5IHRoYXQgaW5jbHVkZXMgYW5hbHl6ZXIgY3Jhc2ggcmVwb3J0cwogICAgYW5kIHByZXByb2Nlc3NlZCBzb3VyY2UgZmlsZXMuCiAKICAtc3RhdHMKLSAKKwogICAgR2VuZXJhdGVzIHZpc2l0YXRpb24gc3RhdGlzdGljcyBmb3IgdGhlIHByb2plY3QgYmVpbmcgYW5hbHl6ZWQuCiAKICAtbWF4bG9vcCA8bG9vcCBjb3VudD4KLSAKKwogICAgU3BlY2lmaXkgdGhlIG51bWJlciBvZiB0aW1lcyBhIGJsb2NrIGNhbiBiZSB2aXNpdGVkIGJlZm9yZSBnaXZpbmcgdXAuCiAgICBEZWZhdWx0IGlzIDQuIEluY3JlYXNlIGZvciBtb3JlIGNvbXByZWhlbnNpdmUgY292ZXJhZ2UgYXQgYSBjb3N0IG9mIHNwZWVkLgotICAKKwogIC1pbnRlcm5hbC1zdGF0cwotIAorCiAgICBHZW5lcmF0ZSBpbnRlcm5hbCBhbmFseXplciBzdGF0aXN0aWNzLgotIAotIC0tdXNlLWFuYWx5emVyIFtYY29kZXxwYXRoIHRvIGNsYW5nXSAKKworIC0tdXNlLWFuYWx5emVyIFtYY29kZXxwYXRoIHRvIGNsYW5nXQogIC0tdXNlLWFuYWx5emVyPVtYY29kZXxwYXRoIHRvIGNsYW5nXQotIAorCiAgICBzY2FuLWJ1aWxkIHVzZXMgdGhlICdjbGFuZycgZXhlY3V0YWJsZSByZWxhdGl2ZSB0byBpdHNlbGYgZm9yIHN0YXRpYwogICAgYW5hbHlzaXMuIE9uZSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciB3aXRoIHRoaXMgb3B0aW9uIGJ5IHVzaW5nIHRoZQogICAgJ2NsYW5nJyBwYWNrYWdlZCB3aXRoIFhjb2RlIChvbiBPUyBYKSBvciBmcm9tIHRoZSBQQVRILgpAQCAtMTE2MSwxMCArMTE2MiwxNCBAQAogCiAgICBEb24ndCByZW1vdmUgdGhlIGJ1aWxkIHJlc3VsdHMgZGlyZWN0b3J5IGV2ZW4gaWYgbm8gaXNzdWVzIHdlcmUgcmVwb3J0ZWQuCiAKLSAtLW92ZXJyaWRlLWNvbXBpbGVyIAotICAgQWx3YXlzIHJlc29ydCB0byB0aGUgY2NjLWFuYWx5emVyIGV2ZW4gd2hlbiBiZXR0ZXIgaW50ZXJwb3NpdGlvbiBtZXRob2RzIAorIC0tb3ZlcnJpZGUtY29tcGlsZXIKKyAgIEFsd2F5cyByZXNvcnQgdG8gdGhlIGNjYy1hbmFseXplciBldmVuIHdoZW4gYmV0dGVyIGludGVycG9zaXRpb24gbWV0aG9kcwogICAgYXJlIGF2YWlsYWJsZS4KLSAgIAorCisgLWFuYWx5emVyLWNvbmZpZyA8b3B0aW9ucz4KKworICAgUHJvdmlkZSBvcHRpb25zIHRvIHBhc3MgdGhyb3VnaCB0byB0aGUgYW5hbHl6ZXIncyAtYW5hbHl6ZXItY29uZmlnIGZsYWcuCisKIENPTlRST0xMSU5HIENIRUNLRVJTOgogCiAgQSBkZWZhdWx0IGdyb3VwIG9mIGNoZWNrZXJzIGFyZSBhbHdheXMgcnVuIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkLgpAQCAtMTE3Miw3ICsxMTc3LDcgQEAKIAogIC1lbmFibGUtY2hlY2tlciBbY2hlY2tlciBuYW1lXQogIC1kaXNhYmxlLWNoZWNrZXIgW2NoZWNrZXIgbmFtZV0KLSAKKwogTE9BRElORyBDSEVDS0VSUzoKIAogIExvYWRpbmcgZXh0ZXJuYWwgY2hlY2tlcnMgdXNpbmcgdGhlIGNsYW5nIHBsdWdpbiBpbnRlcmZhY2U6CkBAIC0xMTk3LDcgKzEyMDIsNyBAQAogICAgIGNsb3NlIEZST01fQ0hJTEQ7CiAgICAgb3BlbihTVERPVVQsIj4mIiwgXCpUT19QQVJFTlQpOwogICAgIG9wZW4oU1RERVJSLCI+JiIsIFwqVE9fUEFSRU5UKTsKLSAgICBleGVjICRDbGFuZywgKCBAUGx1Z2luTG9hZENvbW1hbmRsaW5lX3hjbGFuZywgJy0tYW5hbHl6ZScsICcteCcsICRsYW5nLCAnLScsICctIyMjJyk7IAorICAgIGV4ZWMgJENsYW5nLCAoIEBQbHVnaW5Mb2FkQ29tbWFuZGxpbmVfeGNsYW5nLCAnLS1hbmFseXplJywgJy14JywgJGxhbmcsICctJywgJy0jIyMnKTsKICAgfQogICBjbG9zZShUT19QQVJFTlQpOwogICB3aGlsZSg8RlJPTV9DSElMRD4pIHsKQEAgLTEyNjAsNyArMTI2NSw3IEBACiAgICAgICAgICAgIyBhcHBlbmQgYSBkb3QsIGlmIGFuIGFkZGl0aW9uYWwgZG9tYWluIGlzIGFkZGVkIGluIHRoZSBuZXh0IGl0ZXJhdGlvbgogICAgICAgICAgICRhZ2dyZWdhdGUgLj0gIi4iOwogICAgICAgICB9Ci0gICAgICAKKwogICAgICAgICBpZiAoJGVuYWJsZWQpIHsKICAgICAgICAgICBwcmludCAiICsgIjsKICAgICAgICAgfQpAQCAtMTI4OCw3ICsxMjkzLDcgQEAKIEVYQU1QTEUKIAogIHNjYW4tYnVpbGQgLW8gL3RtcC9teWh0bWxkaXIgbWFrZSAtajQKLSAgICAgCisKIFRoZSBhYm92ZSBleGFtcGxlIGNhdXNlcyBhbmFseXNpcyByZXBvcnRzIHRvIGJlIGRlcG9zaXRlZCBpbnRvIGEgc3ViZGlyZWN0b3J5CiBvZiAiL3RtcC9teWh0bWxkaXIiIGFuZCB0byBydW4gIm1ha2UiIHdpdGggdGhlICItajQiIG9wdGlvbi4gQSBkaWZmZXJlbnQKIHN1YmRpcmVjdG9yeSBpcyBjcmVhdGVkIGVhY2ggdGltZSBzY2FuLWJ1aWxkIGFuYWx5emVzIGEgcHJvamVjdC4gVGhlIGFuYWx5emVyCkBAIC0xMzM2LDYgKzEzNDEsNyBAQAogbXkgJFN0b3JlTW9kZWw7CiBteSAkQ29uc3RyYWludHNNb2RlbDsKIG15ICRJbnRlcm5hbFN0YXRzOworbXkgQENvbmZpZ09wdGlvbnM7CiBteSAkT3V0cHV0Rm9ybWF0ID0gImh0bWwiOwogbXkgJEFuYWx5emVyU3RhdHMgPSAwOwogbXkgJE1heExvb3AgPSAwOwpAQCAtMTM0OCw5ICsxMzU0LDkgQEAKIH0KIAogd2hpbGUgKEBBUkdWKSB7Ci0gIAorCiAgICMgU2NhbiBmb3Igb3B0aW9ucyB3ZSByZWNvZ25pemUuCi0gIAorCiAgIG15ICRhcmcgPSAkQVJHVlswXTsKIAogICBpZiAoJGFyZyBlcSAiLWgiIG9yICRhcmcgZXEgIi0taGVscCIpIHsKQEAgLTEzNTgsMjQgKzEzNjQsMjQgQEAKICAgICBzaGlmdCBAQVJHVjsKICAgICBuZXh0OwogICB9Ci0gIAorCiAgIGlmICgkYXJnIGVxICctYW5hbHl6ZS1oZWFkZXJzJykgewotICAgIHNoaWZ0IEBBUkdWOyAgICAKKyAgICBzaGlmdCBAQVJHVjsKICAgICAkQW5hbHl6ZUhlYWRlcnMgPSAxOwogICAgIG5leHQ7CiAgIH0KLSAgCisKICAgaWYgKCRhcmcgZXEgIi1vIikgewogICAgIHNoaWZ0IEBBUkdWOwotICAgICAgICAKKwogICAgIGlmICghQEFSR1YpIHsKICAgICAgIERpZURpYWcoIictbycgb3B0aW9uIHJlcXVpcmVzIGEgdGFyZ2V0IGRpcmVjdG9yeSBuYW1lLlxuIik7CiAgICAgfQotICAgIAorCiAgICAgIyBDb25zdHJ1Y3QgYW4gYWJzb2x1dGUgcGF0aC4gIFVzZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKICAgICAjIGFzIGEgYmFzZSBpZiB0aGUgb3JpZ2luYWwgcGF0aCB3YXMgbm90IGFic29sdXRlLgogICAgICRIdG1sRGlyID0gYWJzX3BhdGgoc2hpZnQgQEFSR1YpOwotICAgIAorCiAgICAgbmV4dDsKICAgfQogCkBAIC0xMzk0LDcgKzE0MDAsNyBAQAogCiAgICAgbmV4dDsKICAgfQotICAKKwogICBpZiAoJGFyZyBlcSAiLWsiIG9yICRhcmcgZXEgIi0ta2VlcC1nb2luZyIpIHsKICAgICBzaGlmdCBAQVJHVjsKICAgICAkSWdub3JlRXJyb3JzID0gMTsKQEAgLTE0MDQsNyArMTQxMCw3IEBACiAgIGlmICgkYXJnID1+IC9eLS11c2UtY2MoPSguKykpPyQvKSB7CiAgICAgc2hpZnQgQEFSR1Y7CiAgICAgbXkgJGNjOwotICAgIAorCiAgICAgaWYgKCFkZWZpbmVkICQyIHx8ICQyIGVxICIiKSB7CiAgICAgICBpZiAoIUBBUkdWKSB7CiAgICAgICAgIERpZURpYWcoIictLXVzZS1jYycgb3B0aW9uIHJlcXVpcmVzIGEgY29tcGlsZXIgZXhlY3V0YWJsZSBuYW1lLlxuIik7CkBAIC0xNDE0LDE1ICsxNDIwLDE1IEBACiAgICAgZWxzZSB7CiAgICAgICAkY2MgPSAkMjsKICAgICB9Ci0gICAgCisKICAgICAkRU5WeyJDQ0NfQ0MifSA9ICRjYzsKICAgICBuZXh0OwogICB9Ci0gIAorCiAgIGlmICgkYXJnID1+IC9eLS11c2UtY1wrXCsoPSguKykpPyQvKSB7CiAgICAgc2hpZnQgQEFSR1Y7Ci0gICAgbXkgJGN4eDsgICAgCi0gICAgCisgICAgbXkgJGN4eDsKKwogICAgIGlmICghZGVmaW5lZCAkMiB8fCAkMiBlcSAiIikgewogICAgICAgaWYgKCFAQVJHVikgewogICAgICAgICBEaWVEaWFnKCInLS11c2UtYysrJyBvcHRpb24gcmVxdWlyZXMgYSBjb21waWxlciBleGVjdXRhYmxlIG5hbWUuXG4iKTsKQEAgLTE0MzIsMjMgKzE0MzgsMjMgQEAKICAgICBlbHNlIHsKICAgICAgICRjeHggPSAkMjsKICAgICB9Ci0gICAgCisKICAgICAkRU5WeyJDQ0NfQ1hYIn0gPSAkY3h4OwogICAgIG5leHQ7CiAgIH0KLSAgCisKICAgaWYgKCRhcmcgZXEgIi12IikgewogICAgIHNoaWZ0IEBBUkdWOwogICAgICRWZXJib3NlKys7CiAgICAgbmV4dDsKICAgfQotICAKKwogICBpZiAoJGFyZyBlcSAiLVYiIG9yICRhcmcgZXEgIi0tdmlldyIpIHsKICAgICBzaGlmdCBAQVJHVjsKLSAgICAkVmlld1Jlc3VsdHMgPSAxOyAgICAKKyAgICAkVmlld1Jlc3VsdHMgPSAxOwogICAgIG5leHQ7CiAgIH0KLSAgCisKICAgaWYgKCRhcmcgZXEgIi0tc3RhdHVzLWJ1Z3MiKSB7CiAgICAgc2hpZnQgQEFSR1Y7CiAgICAgJEV4aXRTdGF0dXNGb3VuZEJ1Z3MgPSAxOwpAQCAtMTQ2MCw3ICsxNDY2LDcgQEAKICAgICAkU3RvcmVNb2RlbCA9IHNoaWZ0IEBBUkdWOwogICAgIG5leHQ7CiAgIH0KLSAgCisKICAgaWYgKCRhcmcgZXEgIi1jb25zdHJhaW50cyIpIHsKICAgICBzaGlmdCBAQVJHVjsKICAgICAkQ29uc3RyYWludHNNb2RlbCA9IHNoaWZ0IEBBUkdWOwpAQCAtMTQ3Miw3ICsxNDc4LDcgQEAKICAgICAkSW50ZXJuYWxTdGF0cyA9IDE7CiAgICAgbmV4dDsKICAgfQotICAKKwogICBpZiAoJGFyZyBlcSAiLXBsaXN0IikgewogICAgIHNoaWZ0IEBBUkdWOwogICAgICRPdXRwdXRGb3JtYXQgPSAicGxpc3QiOwpAQCAtMTQ4Myw3ICsxNDg5LDEzIEBACiAgICAgJE91dHB1dEZvcm1hdCA9ICJwbGlzdC1odG1sIjsKICAgICBuZXh0OwogICB9Ci0gIAorCisgIGlmICgkYXJnIGVxICItYW5hbHl6ZXItY29uZmlnIikgeworICAgIHNoaWZ0IEBBUkdWOworICAgIHB1c2ggQENvbmZpZ09wdGlvbnMsICItYW5hbHl6ZXItY29uZmlnIiwgc2hpZnQgQEFSR1Y7CisgICAgbmV4dDsKKyAgfQorCiAgIGlmICgkYXJnIGVxICItbm8tZmFpbHVyZS1yZXBvcnRzIikgewogICAgICRFTlZ7IkNDQ19SRVBPUlRfRkFJTFVSRVMifSA9IDA7CiAgICAgbmV4dDsKQEAgLTE1MzQsOSArMTU0Niw5IEBACiAgICAgJE92ZXJyaWRlQ29tcGlsZXIgPSAxOwogICAgIG5leHQ7CiAgIH0KLSAgCisKICAgRGllRGlhZygidW5yZWNvZ25pemVkIG9wdGlvbiAnJGFyZydcbiIpIGlmICgkYXJnID1+IC9eLS8pOwotICAKKwogICBsYXN0OwogfQogCkBAIC0xNTU3LDggKzE1NjksOCBAQAogICAgCSAgICAgICAgICAiICBDb25zaWRlciB1c2luZyAtLXVzZS1hbmFseXplciB0byBwaWNrIGEgdmVyc2lvbiBvZiAnY2xhbmcnIHRvIHVzZSBmb3Igc3RhdGljIGFuYWx5c2lzLlxuIik7CiAgICAgfQogICB9Ci19IAotZWxzZSB7ICAKK30KK2Vsc2UgewogICBpZiAoJEFuYWx5emVyRGlzY292ZXJ5TWV0aG9kID1+IC9eW1h4XWNvZGUkLykgewogCW15ICR4Y3J1biA9IGB3aGljaCB4Y3J1bmA7CiAgICAgY2hvbXAgJHhjcnVuOwpAQCAtMTU2Niw5ICsxNTc4LDkgQEAKICAgCSAgRGllRGlhZygiQ2Fubm90IGZpbmQgJ3hjcnVuJyB0byBmaW5kICdjbGFuZycgZm9yIGFuYWx5c2lzLlxuIik7CiAJfQogICAgICRDbGFuZyA9IGAkeGNydW4gLXRvb2xjaGFpbiBYY29kZURlZmF1bHQgLWZpbmQgY2xhbmdgOwotICAgIGNob21wICRDbGFuZzsgIAorICAgIGNob21wICRDbGFuZzsKICAgICBpZiAoJENsYW5nIGVxICIiKSB7Ci0gICAgICBEaWVEaWFnKCJObyAnY2xhbmcnIGV4ZWN1dGFibGUgZm91bmQgYnkgJ3hjcnVuJ1xuIik7IAorICAgICAgRGllRGlhZygiTm8gJ2NsYW5nJyBleGVjdXRhYmxlIGZvdW5kIGJ5ICd4Y3J1bidcbiIpOwogICAgIH0KICAgfQogICBlbHNlIHsKQEAgLTE2MTIsOSArMTYyNCw5IEBACiBteSAkQ21kID0gIiRBYnNSZWFsQmluL2xpYmV4ZWMvY2NjLWFuYWx5emVyIjsKIG15ICRDbWRDWFggPSAiJEFic1JlYWxCaW4vbGliZXhlYy9jKystYW5hbHl6ZXIiOwogCi0jIFBvcnRhYmlsaXR5OiB1c2UgbGVzcyBzdHJpY3QgYnV0IHBvcnRhYmxlIGNoZWNrIC1lIChmaWxlIGV4aXN0cykgaW5zdGVhZCBvZiAKKyMgUG9ydGFiaWxpdHk6IHVzZSBsZXNzIHN0cmljdCBidXQgcG9ydGFibGUgY2hlY2sgLWUgKGZpbGUgZXhpc3RzKSBpbnN0ZWFkIG9mCiAjIG5vbi1wb3J0YWJsZSAteCAoZmlsZSBpcyBleGVjdXRhYmxlKS4gT24gc29tZSB3aW5kb3dzIHBvcnRzIC14IGp1c3QgY2hlY2tzCi0jIGZpbGUgZXh0ZW5zaW9uIHRvIGRldGVybWluZSBpZiBhIGZpbGUgaXMgZXhlY3V0YWJsZSAoc2VlIFBlcmwgbGFuZ3VhZ2UgCisjIGZpbGUgZXh0ZW5zaW9uIHRvIGRldGVybWluZSBpZiBhIGZpbGUgaXMgZXhlY3V0YWJsZSAoc2VlIFBlcmwgbGFuZ3VhZ2UKICMgcmVmZXJlbmNlLCBwZXJscG9ydCkKIGlmICghZGVmaW5lZCAkQ21kIHx8ICEgLWUgJENtZCkgewogICAkQ21kID0gIiRBYnNSZWFsQmluL2NjYy1hbmFseXplciI7CkBAIC0xNjM2LDYgKzE2NDgsNyBAQAogIyBpbnRlcnBvc2l0aW9uLgogbXkgJENDQ19BTkFMWVpFUl9BTkFMWVNJUyA9IGpvaW4gJyAnLEBBbmFseXNlc1RvUnVuOwogbXkgJENDQ19BTkFMWVpFUl9QTFVHSU5TID0gam9pbiAnICcsQFBsdWdpbnNUb0xvYWQ7CitteSAkQ0NDX0FOQUxZWkVSX0NPTkZJRyA9IGpvaW4gJyAnLEBDb25maWdPcHRpb25zOwogbXkgJU9wdGlvbnMgPSAoCiAgICdDQycgPT4gJENtZCwKICAgJ0NYWCcgPT4gJENtZENYWCwKQEAgLTE2NDQsNiArMTY1Nyw3IEBACiAgICdWRVJCT1NFJyA9PiAkVmVyYm9zZSwKICAgJ0NDQ19BTkFMWVpFUl9BTkFMWVNJUycgPT4gJENDQ19BTkFMWVpFUl9BTkFMWVNJUywKICAgJ0NDQ19BTkFMWVpFUl9QTFVHSU5TJyA9PiAkQ0NDX0FOQUxZWkVSX1BMVUdJTlMsCisgICdDQ0NfQU5BTFlaRVJfQ09ORklHJyA9PiAkQ0NDX0FOQUxZWkVSX0NPTkZJRywKICAgJ09VVFBVVF9ESVInID0+ICRIdG1sRGlyCiApOwogCkBAIC0xNjg5LDQgKzE3MDMsMyBAQAogfQogCiBleGl0ICRFeGl0U3RhdHVzOwotCmRpZmYgLS1naXQgYS90b29scy9zY2FuLWJ1aWxkL3NjYW4tYnVpbGQuMSBiL3Rvb2xzL3NjYW4tYnVpbGQvc2Nhbi1idWlsZC4xCmluZGV4IDEwZGRjN2YuLjNkM2E5ZjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3NjYW4tYnVpbGQvc2Nhbi1idWlsZC4xCisrKyBiL3Rvb2xzL3NjYW4tYnVpbGQvc2Nhbi1idWlsZC4xCkBAIC0zLDcgKzMsNyBAQAogLlwiICRJZCQKIC5EZCBNYXkgMjUsIDIwMTIKIC5EdCBTQ0FOLUJVSUxEIDEKLS5PcyAiY2xhbmciICIzLjEiCisuT3MgImNsYW5nIiAiMy41IgogLlNoIE5BTUUKIC5ObSBzY2FuLWJ1aWxkCiAuTmQgQ2xhbmcgc3RhdGljIGFuYWx5emVyCmRpZmYgLS1naXQgYS90b29scy9zY2FuLWJ1aWxkL3NjYW52aWV3LmNzcyBiL3Rvb2xzL3NjYW4tYnVpbGQvc2NhbnZpZXcuY3NzCmluZGV4IGEwNDA2ZjMuLmNmOGE1YTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3NjYW4tYnVpbGQvc2NhbnZpZXcuY3NzCisrKyBiL3Rvb2xzL3NjYW4tYnVpbGQvc2NhbnZpZXcuY3NzCkBAIC0xMCw3ICsxMCw3IEBACiAgIHRleHQtYWxpZ246Y2VudGVyOwogICBmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7CiAgIHdoaXRlLXNwYWNlOm5vd3JhcDsKLX0gCit9CiAuVyB7IGZvbnQtc2l6ZTowcHggfQogdGgsIHRkIHsgcGFkZGluZzo1cHg7IHBhZGRpbmctbGVmdDo4cHg7IHRleHQtYWxpZ246bGVmdCB9CiB0ZC5TVU1NX0RFU0MgeyBwYWRkaW5nLWxlZnQ6MTJweCB9CkBAIC0yMSw3ICsyMSw3IEBACiAKIHRhYmxlLmZvcm1fZ3JvdXAgewogICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7Ci0gICAgYm9yZGVyOiAxcHggc29saWQgIzMzMzsgCisgICAgYm9yZGVyOiAxcHggc29saWQgIzMzMzsKICAgICBwYWRkaW5nOiAycHg7CiB9CiAKQEAgLTMzLDcgKzMzLDcgQEAKIAogdGFibGUuZm9ybSB7CiAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk5OTsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjMzMzOyAKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjMzMzOwogICAgIHBhZGRpbmc6IDJweDsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvc2Nhbi1idWlsZC9zZXQteGNvZGUtYW5hbHl6ZXIgYi90b29scy9zY2FuLWJ1aWxkL3NldC14Y29kZS1hbmFseXplcgppbmRleCAzMDc2YjM5Li41YWM1YzE4IDEwMDc1NQotLS0gYS90b29scy9zY2FuLWJ1aWxkL3NldC14Y29kZS1hbmFseXplcgorKysgYi90b29scy9zY2FuLWJ1aWxkL3NldC14Y29kZS1hbmFseXplcgpAQCAtOCw3ICs4LDcgQEAKIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNyk6CiAgICAgcHJpbnQgInNldC14Y29kZS1hbmFseXplciByZXF1aXJlcyBQeXRob24gMi43IG9yIGxhdGVyIgogICAgIHN5cy5leGl0KDEpCi0gICAgCisKIGltcG9ydCBvcwogaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCByZQpAQCAtNjUsNyArNjUsNyBAQAogICBwYXJzZXIuc2V0X2Rlc2NyaXB0aW9uKF9fZG9jX18pCiAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXVzZS1jaGVja2VyLWJ1aWxkIiwgZGVzdD0icGF0aCIsCiAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlVzZSB0aGUgQ2xhbmcgbG9jYXRlZCBhdCB0aGUgcHJvdmlkZWQgYWJzb2x1dGUgcGF0aCwgZS5nLiAvVXNlcnMvZm9vL2NoZWNrZXItMSIpCi0gIHBhcnNlci5hZGRfb3B0aW9uKCItLXVzZS14Y29kZS1jbGFuZyIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCAKKyAgcGFyc2VyLmFkZF9vcHRpb24oIi0tdXNlLXhjb2RlLWNsYW5nIiwgYWN0aW9uPSJzdG9yZV9jb25zdCIsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0PSIkKENMQU5HKSIsIGRlc3Q9ImRlZmF1bHQiLAogICAgICAgICAgICAgICAgICAgICBoZWxwPSJVc2UgdGhlIENsYW5nIGJ1bmRsZWQgd2l0aCBYY29kZSIpCiAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBwcmludCAiKCspIFVzaW5nIHRoZSBDbGFuZyBidW5kbGVkIHdpdGggWGNvZGUiCiAgICAgcGF0aCA9IG9wdGlvbnMuZGVmYXVsdAogICAgIGlzQnVpbHRpbkFuYWx5emVyID0gVHJ1ZQotICAKKwogICB0cnk6CiAgICAgeGNvZGVfcGF0aCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsieGNvZGUtc2VsZWN0IiwgIi1wcmludC1wYXRoIl0pCiAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKQEAgLTEwMSwxNSArMTAxLDE0IEBACiAgICAgIyBDdXQgb2ZmIHRoZSAnRGV2ZWxvcGVyJyBkaXIsIGFzIHRoZSB4Y3NwZWMgbGllcyBpbiBhbm90aGVyIHBhcnQKICAgICAjIG9mIHRoZSBYY29kZS5hcHAgc3VidHJlZS4KICAgICB4Y29kZV9wYXRoID0gb3MucGF0aC5kaXJuYW1lKHhjb2RlX3BhdGgpCi0gIAorCiAgIGZvdW5kU3BlYyA9IEZhbHNlCiAgIGZvciB4IGluIEZpbmRDbGFuZ1NwZWNzKHhjb2RlX3BhdGgpOgogICAgIGZvdW5kU3BlYyA9IFRydWUKICAgICBNb2RpZnlTcGVjKHgsIGlzQnVpbHRpbkFuYWx5emVyLCBwYXRoKQotICAgIAorCiAgIGlmIGZvdW5kU3BlYyA9PSBGYWxzZToKICAgICAgIHByaW50ICIoLSkgTm8gY29tcGlsZXIgY29uZmlndXJhdGlvbiBmaWxlIHdhcyBmb3VuZC4gIFhjb2RlJ3MgYW5hbHl6ZXIgaGFzIG5vdCBiZWVuIHVwZGF0ZWQuIgogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICBtYWluKCkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2Nhbi1idWlsZC9zb3J0dGFibGUuanMgYi90b29scy9zY2FuLWJ1aWxkL3NvcnR0YWJsZS5qcwppbmRleCA0MzUyZDNiLi4wM2ViZDkyIDEwMDY0NAotLS0gYS90b29scy9zY2FuLWJ1aWxkL3NvcnR0YWJsZS5qcworKysgYi90b29scy9zY2FuLWJ1aWxkL3NvcnR0YWJsZS5qcwpAQCAtMywxOSArMywxOSBAQAogICB2ZXJzaW9uIDIKICAgN3RoIEFwcmlsIDIwMDcKICAgU3R1YXJ0IExhbmdyaWRnZSwgaHR0cDovL3d3dy5rcnlvZ2VuaXgub3JnL2NvZGUvYnJvd3Nlci9zb3J0dGFibGUvCi0gIAorCiAgIEluc3RydWN0aW9uczoKICAgRG93bmxvYWQgdGhpcyBmaWxlCiAgIEFkZCA8c2NyaXB0IHNyYz0ic29ydHRhYmxlLmpzIj48L3NjcmlwdD4gdG8geW91ciBIVE1MCiAgIEFkZCBjbGFzcz0ic29ydGFibGUiIHRvIGFueSB0YWJsZSB5b3UnZCBsaWtlIHRvIG1ha2Ugc29ydGFibGUKICAgQ2xpY2sgb24gdGhlIGhlYWRlcnMgdG8gc29ydAotICAKKwogICBUaGFua3MgdG8gbWFueSwgbWFueSBwZW9wbGUgZm9yIGNvbnRyaWJ1dGlvbnMgYW5kIHN1Z2dlc3Rpb25zLgogICBMaWNlbmNlZCBhcyBYMTE6IGh0dHA6Ly93d3cua3J5b2dlbml4Lm9yZy9jb2RlL2Jyb3dzZXIvbGljZW5jZS5odG1sCiAgIFRoaXMgYmFzaWNhbGx5IG1lYW5zOiBkbyB3aGF0IHlvdSB3YW50IHdpdGggaXQuCiAqLwogCi0gCisKIHZhciBzdElzSUUgPSAvKkBjY19vbiFAKi9mYWxzZTsKIAogc29ydHRhYmxlID0gewpAQCAtMjYsMTkgKzI2LDE5IEBACiAgICAgYXJndW1lbnRzLmNhbGxlZS5kb25lID0gdHJ1ZTsKICAgICAvLyBraWxsIHRoZSB0aW1lcgogICAgIGlmIChfdGltZXIpIGNsZWFySW50ZXJ2YWwoX3RpbWVyKTsKLSAgICAKKwogICAgIGlmICghZG9jdW1lbnQuY3JlYXRlRWxlbWVudCB8fCAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHJldHVybjsKLSAgICAKKwogICAgIHNvcnR0YWJsZS5EQVRFX1JFID0gL14oXGRcZD8pW1wvXC4tXShcZFxkPylbXC9cLi1dKChcZFxkKT9cZFxkKSQvOwotICAgIAorCiAgICAgZm9yRWFjaChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGFibGUnKSwgZnVuY3Rpb24odGFibGUpIHsKICAgICAgIGlmICh0YWJsZS5jbGFzc05hbWUuc2VhcmNoKC9cYnNvcnRhYmxlXGIvKSAhPSAtMSkgewogICAgICAgICBzb3J0dGFibGUubWFrZVNvcnRhYmxlKHRhYmxlKTsKICAgICAgIH0KICAgICB9KTsKLSAgICAKKwogICB9LAotICAKKwogICBtYWtlU29ydGFibGU6IGZ1bmN0aW9uKHRhYmxlKSB7CiAgICAgaWYgKHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0aGVhZCcpLmxlbmd0aCA9PSAwKSB7CiAgICAgICAvLyB0YWJsZSBkb2Vzbid0IGhhdmUgYSB0SGVhZC4gU2luY2UgaXQgc2hvdWxkIGhhdmUsIGNyZWF0ZSBvbmUgYW5kCkBAIC00OSw5ICs0OSw5IEBACiAgICAgfQogICAgIC8vIFNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgdGFibGUudEhlYWQsIHNpZ2gKICAgICBpZiAodGFibGUudEhlYWQgPT0gbnVsbCkgdGFibGUudEhlYWQgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGhlYWQnKVswXTsKLSAgICAKKwogICAgIGlmICh0YWJsZS50SGVhZC5yb3dzLmxlbmd0aCAhPSAxKSByZXR1cm47IC8vIGNhbid0IGNvcGUgd2l0aCB0d28gaGVhZGVyIHJvd3MKLSAgICAKKwogICAgIC8vIFNvcnR0YWJsZSB2MSBwdXQgcm93cyB3aXRoIGEgY2xhc3Mgb2YgInNvcnRib3R0b20iIGF0IHRoZSBib3R0b20gKGFzCiAgICAgLy8gInRvdGFsIiByb3dzLCBmb3IgZXhhbXBsZSkuIFRoaXMgaXMgQiZSLCBzaW5jZSB3aGF0IHlvdSdyZSBzdXBwb3NlZAogICAgIC8vIHRvIGRvIGlzIHB1dCB0aGVtIGluIGEgdGZvb3QuIFNvLCBpZiB0aGVyZSBhcmUgc29ydGJvdHRvbSByb3dzLApAQCAtNzMsNyArNzMsNyBAQAogICAgICAgfQogICAgICAgZGVsZXRlIHNvcnRib3R0b21yb3dzOwogICAgIH0KLSAgICAKKwogICAgIC8vIHdvcmsgdGhyb3VnaCBlYWNoIGNvbHVtbiBhbmQgY2FsY3VsYXRlIGl0cyB0eXBlCiAgICAgaGVhZHJvdyA9IHRhYmxlLnRIZWFkLnJvd3NbMF0uY2VsbHM7CiAgICAgZm9yICh2YXIgaT0wOyBpPGhlYWRyb3cubGVuZ3RoOyBpKyspIHsKQEAgLTkyLDcgKzkyLDcgQEAKIAkgICAgICBkZWFuX2FkZEV2ZW50KGhlYWRyb3dbaV0sImNsaWNrIiwgZnVuY3Rpb24oZSkgewogCiAgICAgICAgICAgaWYgKHRoaXMuY2xhc3NOYW1lLnNlYXJjaCgvXGJzb3J0dGFibGVfc29ydGVkXGIvKSAhPSAtMSkgewotICAgICAgICAgICAgLy8gaWYgd2UncmUgYWxyZWFkeSBzb3J0ZWQgYnkgdGhpcyBjb2x1bW4sIGp1c3QgCisgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhbHJlYWR5IHNvcnRlZCBieSB0aGlzIGNvbHVtbiwganVzdAogICAgICAgICAgICAgLy8gcmV2ZXJzZSB0aGUgdGFibGUsIHdoaWNoIGlzIHF1aWNrZXIKICAgICAgICAgICAgIHNvcnR0YWJsZS5yZXZlcnNlKHRoaXMuc29ydHRhYmxlX3Rib2R5KTsKICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUucmVwbGFjZSgnc29ydHRhYmxlX3NvcnRlZCcsCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKHRoaXMuY2xhc3NOYW1lLnNlYXJjaCgvXGJzb3J0dGFibGVfc29ydGVkX3JldmVyc2VcYi8pICE9IC0xKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSdyZSBhbHJlYWR5IHNvcnRlZCBieSB0aGlzIGNvbHVtbiBpbiByZXZlcnNlLCBqdXN0IAorICAgICAgICAgICAgLy8gaWYgd2UncmUgYWxyZWFkeSBzb3J0ZWQgYnkgdGhpcyBjb2x1bW4gaW4gcmV2ZXJzZSwganVzdAogICAgICAgICAgICAgLy8gcmUtcmV2ZXJzZSB0aGUgdGFibGUsIHdoaWNoIGlzIHF1aWNrZXIKICAgICAgICAgICAgIHNvcnR0YWJsZS5yZXZlcnNlKHRoaXMuc29ydHRhYmxlX3Rib2R5KTsKICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUucmVwbGFjZSgnc29ydHRhYmxlX3NvcnRlZF9yZXZlcnNlJywKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChzb3J0ZndkaW5kKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9Ci0gICAgICAgICAgCisKICAgICAgICAgICAvLyByZW1vdmUgc29ydHRhYmxlX3NvcnRlZCBjbGFzc2VzCiAgICAgICAgICAgdGhlYWRyb3cgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgICAgZm9yRWFjaCh0aGVhZHJvdy5jaGlsZE5vZGVzLCBmdW5jdGlvbihjZWxsKSB7CkBAIC0xMzAsNyArMTMwLDcgQEAKICAgICAgICAgICBpZiAoc29ydGZ3ZGluZCkgeyBzb3J0ZndkaW5kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc29ydGZ3ZGluZCk7IH0KICAgICAgICAgICBzb3J0cmV2aW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NvcnR0YWJsZV9zb3J0cmV2aW5kJyk7CiAgICAgICAgICAgaWYgKHNvcnRyZXZpbmQpIHsgc29ydHJldmluZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNvcnRyZXZpbmQpOyB9Ci0gICAgICAgICAgCisKICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSArPSAnIHNvcnR0YWJsZV9zb3J0ZWQnOwogICAgICAgICAgIHNvcnRmd2RpbmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgICAgc29ydGZ3ZGluZC5pZCA9ICJzb3J0dGFibGVfc29ydGZ3ZGluZCI7CkBAIC0xNTEsMTggKzE1MSwxOCBAQAogCSAgICAgICAgc29ydHRhYmxlLnNoYWtlcl9zb3J0KHJvd19hcnJheSwgdGhpcy5zb3J0dGFibGVfc29ydGZ1bmN0aW9uKTsKIAkgICAgICAgIC8qIGFuZCBjb21tZW50IG91dCB0aGlzIG9uZSAqLwogCSAgICAgICAgLy9yb3dfYXJyYXkuc29ydCh0aGlzLnNvcnR0YWJsZV9zb3J0ZnVuY3Rpb24pOwotCSAgICAgICAgCisKIAkgICAgICAgIHRiID0gdGhpcy5zb3J0dGFibGVfdGJvZHk7CiAJICAgICAgICBmb3IgKHZhciBqPTA7IGo8cm93X2FycmF5Lmxlbmd0aDsgaisrKSB7CiAJICAgICAgICAgIHRiLmFwcGVuZENoaWxkKHJvd19hcnJheVtqXVsxXSk7CiAJICAgICAgICB9Ci0JICAgICAgICAKKwogCSAgICAgICAgZGVsZXRlIHJvd19hcnJheTsKIAkgICAgICB9KTsKIAkgICAgfQogICAgIH0KICAgfSwKLSAgCisKICAgZ3Vlc3NUeXBlOiBmdW5jdGlvbih0YWJsZSwgY29sdW1uKSB7CiAgICAgLy8gZ3Vlc3MgdGhlIHR5cGUgb2YgYSBjb2x1bW4gYmFzZWQgb24gaXRzIGZpcnN0IG5vbi1ibGFuayByb3cKICAgICBzb3J0Zm4gPSBzb3J0dGFibGUuc29ydF9hbHBoYTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgICAgICBpZiAodGV4dC5tYXRjaCgvXi0/W6MkpF0/W1xkLC5dKyU/JC8pKSB7CiAgICAgICAgICAgcmV0dXJuIHNvcnR0YWJsZS5zb3J0X251bWVyaWM7CiAgICAgICAgIH0KLSAgICAgICAgLy8gY2hlY2sgZm9yIGEgZGF0ZTogZGQvbW0veXl5eSBvciBkZC9tbS95eSAKKyAgICAgICAgLy8gY2hlY2sgZm9yIGEgZGF0ZTogZGQvbW0veXl5eSBvciBkZC9tbS95eQogICAgICAgICAvLyBjYW4gaGF2ZSAvIG9yIC4gb3IgLSBhcyBzZXBhcmF0b3IKICAgICAgICAgLy8gY2FuIGJlIG1tL2RkIGFzIHdlbGwKICAgICAgICAgcG9zc2RhdGUgPSB0ZXh0Lm1hdGNoKHNvcnR0YWJsZS5EQVRFX1JFKQpAQCAtMTk1LDE3ICsxOTUsMTcgQEAKICAgICB9CiAgICAgcmV0dXJuIHNvcnRmbjsKICAgfSwKLSAgCisKICAgZ2V0SW5uZXJUZXh0OiBmdW5jdGlvbihub2RlKSB7CiAgICAgLy8gZ2V0cyB0aGUgdGV4dCB3ZSB3YW50IHRvIHVzZSBmb3Igc29ydGluZyBmb3IgYSBjZWxsLgogICAgIC8vIHN0cmlwcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgogICAgIC8vIHRoaXMgaXMgKm5vdCogYSBnZW5lcmljIGdldElubmVyVGV4dCBmdW5jdGlvbjsgaXQncyBzcGVjaWFsIHRvIHNvcnR0YWJsZS4KICAgICAvLyBmb3IgZXhhbXBsZSwgeW91IGNhbiBvdmVycmlkZSB0aGUgY2VsbCB0ZXh0IHdpdGggYSBjdXN0b21rZXkgYXR0cmlidXRlLgogICAgIC8vIGl0IGFsc28gZ2V0cyAudmFsdWUgZm9yIDxpbnB1dD4gZmllbGRzLgotICAgIAorCiAgICAgaGFzSW5wdXRzID0gKHR5cGVvZiBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lID09ICdmdW5jdGlvbicpICYmCiAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JykubGVuZ3RoOwotICAgIAorCiAgICAgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCJzb3J0dGFibGVfY3VzdG9ta2V5IikgIT0gbnVsbCkgewogICAgICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKCJzb3J0dGFibGVfY3VzdG9ta2V5Iik7CiAgICAgfQpAQCAtMjQwLDcgKzI0MCw3IEBACiAgICAgICB9CiAgICAgfQogICB9LAotICAKKwogICByZXZlcnNlOiBmdW5jdGlvbih0Ym9keSkgewogICAgIC8vIHJldmVyc2UgdGhlIHJvd3MgaW4gYSB0Ym9keQogICAgIG5ld3Jvd3MgPSBbXTsKQEAgLTI1MiwxNCArMjUyLDE0IEBACiAgICAgfQogICAgIGRlbGV0ZSBuZXdyb3dzOwogICB9LAotICAKKwogICAvKiBzb3J0IGZ1bmN0aW9ucwogICAgICBlYWNoIHNvcnQgZnVuY3Rpb24gdGFrZXMgdHdvIHBhcmFtZXRlcnMsIGEgYW5kIGIKICAgICAgeW91IGFyZSBjb21wYXJpbmcgYVswXSBhbmQgYlswXSAqLwogICBzb3J0X251bWVyaWM6IGZ1bmN0aW9uKGEsYikgewogICAgIGFhID0gcGFyc2VGbG9hdChhWzBdLnJlcGxhY2UoL1teMC05Li1dL2csJycpKTsKICAgICBpZiAoaXNOYU4oYWEpKSBhYSA9IDA7Ci0gICAgYmIgPSBwYXJzZUZsb2F0KGJbMF0ucmVwbGFjZSgvW14wLTkuLV0vZywnJykpOyAKKyAgICBiYiA9IHBhcnNlRmxvYXQoYlswXS5yZXBsYWNlKC9bXjAtOS4tXS9nLCcnKSk7CiAgICAgaWYgKGlzTmFOKGJiKSkgYmIgPSAwOwogICAgIHJldHVybiBhYS1iYjsKICAgfSwKQEAgLTI5OCw3ICsyOTgsNyBAQAogICAgIGlmIChkdDE8ZHQyKSByZXR1cm4gLTE7CiAgICAgcmV0dXJuIDE7CiAgIH0sCi0gIAorCiAgIHNoYWtlcl9zb3J0OiBmdW5jdGlvbihsaXN0LCBjb21wX2Z1bmMpIHsKICAgICAvLyBBIHN0YWJsZSBzb3J0IGZ1bmN0aW9uIHRvIGFsbG93IG11bHRpLWxldmVsIHNvcnRpbmcgb2YgZGF0YQogICAgIC8vIHNlZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db2NrdGFpbF9zb3J0CkBAIC0zMjgsNyArMzI4LDcgQEAKICAgICAgICAgYisrOwogCiAgICAgfSAvLyB3aGlsZShzd2FwKQotICB9ICAKKyAgfQogfQogCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ5MCw0ICs0OTAsMyBAQAogCQlyZXNvbHZlLmZvckVhY2gob2JqZWN0LCBibG9jaywgY29udGV4dCk7CiAJfQogfTsKLQpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL0FTVC9BU1RDb250ZXh0UGFyZW50TWFwVGVzdC5jcHAgYi91bml0dGVzdHMvQVNUL0FTVENvbnRleHRQYXJlbnRNYXBUZXN0LmNwcAppbmRleCBjMTkxMGE4Li4wZGNiMTc1IDEwMDY0NAotLS0gYS91bml0dGVzdHMvQVNUL0FTVENvbnRleHRQYXJlbnRNYXBUZXN0LmNwcAorKysgYi91bml0dGVzdHMvQVNUL0FTVENvbnRleHRQYXJlbnRNYXBUZXN0LmNwcApAQCAtMTIsMTEgKzEyLDExIEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiAjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnRleHQuaCIKKyNpbmNsdWRlICJNYXRjaFZlcmlmaWVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hGaW5kZXIuaCIKICNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaGVycy5oIgogI2luY2x1ZGUgImNsYW5nL1Rvb2xpbmcvVG9vbGluZy5oIgogI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAiTWF0Y2hWZXJpZmllci5oIgogCiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIGFzdF9tYXRjaGVycyB7CmRpZmYgLS1naXQgYS91bml0dGVzdHMvQVNUL0FTVFR5cGVUcmFpdHNUZXN0LmNwcCBiL3VuaXR0ZXN0cy9BU1QvQVNUVHlwZVRyYWl0c1Rlc3QuY3BwCmluZGV4IGRkNzNiNTIuLjBlNzNmNzYgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9BU1QvQVNUVHlwZVRyYWl0c1Rlc3QuY3BwCisrKyBiL3VuaXR0ZXN0cy9BU1QvQVNUVHlwZVRyYWl0c1Rlc3QuY3BwCkBAIC05LDggKzksOCBAQAogCiAKICNpbmNsdWRlICJjbGFuZy9BU1QvQVNUVHlwZVRyYWl0cy5oIgotI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCiAjaW5jbHVkZSAiTWF0Y2hWZXJpZmllci5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBjbGFuZzo6YXN0X21hdGNoZXJzOwogCkBAIC0zNCw2ICszNCwxOSBAQAogICBFWFBFQ1RfVFJVRShETlQ8RGVjbD4oKS5pc1NhbWUoRE5UPERlY2w+KCkpKTsKIH0KIAorVEVTVChBU1ROb2RlS2luZCwgQmFzZURpc3RhbmNlcykgeworICB1bnNpZ25lZCBEaXN0YW5jZSA9IDE7CisgIEVYUEVDVF9UUlVFKEROVDxFeHByPigpLmlzQmFzZU9mKEROVDxFeHByPigpLCAmRGlzdGFuY2UpKTsKKyAgRVhQRUNUX0VRKDB1LCBEaXN0YW5jZSk7CisKKyAgRVhQRUNUX1RSVUUoRE5UPFN0bXQ+KCkuaXNCYXNlT2YoRE5UPElmU3RtdD4oKSwgJkRpc3RhbmNlKSk7CisgIEVYUEVDVF9FUSgxdSwgRGlzdGFuY2UpOworCisgIERpc3RhbmNlID0gMzsKKyAgRVhQRUNUX1RSVUUoRE5UPERlY2xhcmF0b3JEZWNsPigpLmlzQmFzZU9mKEROVDxQYXJtVmFyRGVjbD4oKSwgJkRpc3RhbmNlKSk7CisgIEVYUEVDVF9FUSgydSwgRGlzdGFuY2UpOworfQorCiBURVNUKEFTVE5vZGVLaW5kLCBTYW1lQmFzZSkgewogICBFWFBFQ1RfVFJVRShETlQ8RXhwcj4oKS5pc0Jhc2VPZihETlQ8Q2FsbEV4cHI+KCkpKTsKICAgRVhQRUNUX1RSVUUoRE5UPEV4cHI+KCkuaXNCYXNlT2YoRE5UPEJpbmFyeU9wZXJhdG9yPigpKSk7CmRpZmYgLS1naXQgYS91bml0dGVzdHMvQVNUL0NNYWtlTGlzdHMudHh0IGIvdW5pdHRlc3RzL0FTVC9DTWFrZUxpc3RzLnR4dAppbmRleCA3MGY4NmQzLi45YTU1NjI2IDEwMDY0NAotLS0gYS91bml0dGVzdHMvQVNUL0NNYWtlTGlzdHMudHh0CisrKyBiL3VuaXR0ZXN0cy9BU1QvQ01ha2VMaXN0cy50eHQKQEAgLTEsMyArMSw3IEBACitzZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMKKyAgU3VwcG9ydAorICApCisKIGFkZF9jbGFuZ191bml0dGVzdChBU1RUZXN0cwogICBBU1RDb250ZXh0UGFyZW50TWFwVGVzdC5jcHAKICAgQVNUVHlwZVRyYWl0c1Rlc3QuY3BwCkBAIC02LDEwICsxMCwxNiBAQAogICBDb21tZW50UGFyc2VyLmNwcAogICBEZWNsUHJpbnRlclRlc3QuY3BwCiAgIERlY2xUZXN0LmNwcAorICBFdmFsdWF0ZUFzUlZhbHVlVGVzdC5jcHAKKyAgRXh0ZXJuYWxBU1RTb3VyY2VUZXN0LmNwcAogICBTb3VyY2VMb2NhdGlvblRlc3QuY3BwCiAgIFN0bXRQcmludGVyVGVzdC5jcHAKICAgKQogCiB0YXJnZXRfbGlua19saWJyYXJpZXMoQVNUVGVzdHMKLSAgY2xhbmdBU1QgY2xhbmdBU1RNYXRjaGVycyBjbGFuZ1Rvb2xpbmcKKyAgY2xhbmdBU1QKKyAgY2xhbmdBU1RNYXRjaGVycworICBjbGFuZ0Jhc2ljCisgIGNsYW5nRnJvbnRlbmQKKyAgY2xhbmdUb29saW5nCiAgICkKZGlmZiAtLWdpdCBhL3VuaXR0ZXN0cy9BU1QvQ29tbWVudFBhcnNlci5jcHAgYi91bml0dGVzdHMvQVNUL0NvbW1lbnRQYXJzZXIuY3BwCmluZGV4IGY3NWM2MzYuLmM3MmFlZjEgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9BU1QvQ29tbWVudFBhcnNlci5jcHAKKysrIGIvdW5pdHRlc3RzL0FTVC9Db21tZW50UGFyc2VyLmNwcApAQCAtMTQyMCw2ICsxNDIwLDI2IEBACiAgIH0KIH0KIAorVEVTVF9GKENvbW1lbnRQYXJzZXJUZXN0LCBEZXByZWNhdGVkKSB7CisgIGNvbnN0IGNoYXIgKlNvdXJjZXNbXSA9IHsKKyAgICAiLyoqIEBkZXByZWNhdGVkKi8iLAorICAgICIvLy8gQGRlcHJlY2F0ZWRcbiIKKyAgfTsKKworICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IGFycmF5X2xlbmd0aG9mKFNvdXJjZXMpOyBpICE9IGU7IGkrKykgeworICAgIEZ1bGxDb21tZW50ICpGQyA9IHBhcnNlU3RyaW5nKFNvdXJjZXNbaV0pOworICAgIEFTU0VSVF9UUlVFKEhhc0NoaWxkQ291bnQoRkMsIDIpKTsKKworICAgIEFTU0VSVF9UUlVFKEhhc1BhcmFncmFwaENvbW1lbnRBdChGQywgMCwgIiAiKSk7CisgICAgeworICAgICAgQmxvY2tDb21tYW5kQ29tbWVudCAqQkNDOworICAgICAgUGFyYWdyYXBoQ29tbWVudCAqUEM7CisgICAgICBBU1NFUlRfVFJVRShIYXNCbG9ja0NvbW1hbmRBdChGQywgVHJhaXRzLCAxLCBCQ0MsICJkZXByZWNhdGVkIiwgUEMpKTsKKyAgICAgIEFTU0VSVF9UUlVFKEhhc0NoaWxkQ291bnQoUEMsIDApKTsKKyAgICB9CisgIH0KK30KKwogfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQogCiB9IC8vIGVuZCBuYW1lc3BhY2UgY29tbWVudHMKZGlmZiAtLWdpdCBhL3VuaXR0ZXN0cy9BU1QvRGVjbFByaW50ZXJUZXN0LmNwcCBiL3VuaXR0ZXN0cy9BU1QvRGVjbFByaW50ZXJUZXN0LmNwcAppbmRleCA0NGZhNzQyLi41MzQwNzU2IDEwMDY0NAotLS0gYS91bml0dGVzdHMvQVNUL0RlY2xQcmludGVyVGVzdC5jcHAKKysrIGIvdW5pdHRlc3RzL0FTVC9EZWNsUHJpbnRlclRlc3QuY3BwCkBAIC03NCwxMCArNzQsMTIgQEAKICAgUHJpbnRNYXRjaCBQcmludGVyOwogICBNYXRjaEZpbmRlciBGaW5kZXI7CiAgIEZpbmRlci5hZGRNYXRjaGVyKE5vZGVNYXRjaCwgJlByaW50ZXIpOwotICBPd25pbmdQdHI8RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiBGYWN0b3J5KG5ld0Zyb250ZW5kQWN0aW9uRmFjdG9yeSgmRmluZGVyKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbkZhY3Rvcnk+IEZhY3RvcnkoCisgICAgICBuZXdGcm9udGVuZEFjdGlvbkZhY3RvcnkoJkZpbmRlcikpOwogCiAgIGlmICghcnVuVG9vbE9uQ29kZVdpdGhBcmdzKEZhY3RvcnktPmNyZWF0ZSgpLCBDb2RlLCBBcmdzLCBGaWxlTmFtZSkpCi0gICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKSA8PCAiUGFyc2luZyBlcnJvciBpbiBcIiIgPDwgQ29kZSA8PCAiXCIiOworICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKKyAgICAgIDw8ICJQYXJzaW5nIGVycm9yIGluIFwiIiA8PCBDb2RlLnN0cigpIDw8ICJcIiI7CiAKICAgaWYgKFByaW50ZXIuZ2V0TnVtRm91bmREZWNscygpID09IDApCiAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQpAQCAtOTAsOCArOTIsOCBAQAogCiAgIGlmIChQcmludGVyLmdldFByaW50ZWQoKSAhPSBFeHBlY3RlZFByaW50ZWQpCiAgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCi0gICAgICA8PCAiRXhwZWN0ZWQgXCIiIDw8IEV4cGVjdGVkUHJpbnRlZCA8PCAiXCIsICIKLSAgICAgICAgICJnb3QgXCIiIDw8IFByaW50ZXIuZ2V0UHJpbnRlZCgpIDw8ICJcIiI7CisgICAgICA8PCAiRXhwZWN0ZWQgXCIiIDw8IEV4cGVjdGVkUHJpbnRlZC5zdHIoKSA8PCAiXCIsICIKKyAgICAgICAgICJnb3QgXCIiIDw8IFByaW50ZXIuZ2V0UHJpbnRlZCgpLnN0cigpIDw8ICJcIiI7CiAKICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOwogfQpAQCAtMTQyLDYgKzE0NCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dC5jYyIpOwogfQogCis6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmludGVkRGVjbENYWDExbm9uTVNDTWF0Y2hlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk1hdGNoZXIgJk5vZGVNYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRXhwZWN0ZWRQcmludGVkKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcmdzKDEsICItc3RkPWMrKzExIik7CisgIEFyZ3MucHVzaF9iYWNrKCItZm5vLWRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyIpOworICByZXR1cm4gUHJpbnRlZERlY2xNYXRjaGVzKENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlTWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0ZWRQcmludGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dC5jYyIpOworfQorCiA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBQcmludGVkRGVjbE9iakNNYXRjaGVzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY2xhcmF0aW9uTWF0Y2hlciAmTm9kZU1hdGNoLApAQCAtMTU2LDYgKzE3MSw0MCBAQAogCiB9IC8vIHVubmFtZWQgbmFtZXNwYWNlCiAKK1RFU1QoRGVjbFByaW50ZXIsIFRlc3RUeXBlZGVmMSkgeworICBBU1NFUlRfVFJVRShQcmludGVkRGVjbENYWDk4TWF0Y2hlcygKKyAgICAidHlwZWRlZiBpbnQgQTsiLAorICAgICJBIiwKKyAgICAidHlwZWRlZiBpbnQgQSIpKTsKKyAgICAvLyBTaG91bGQgYmU6IHdpdGggc2VtaWNvbG9uCit9CisKK1RFU1QoRGVjbFByaW50ZXIsIFRlc3RUeXBlZGVmMikgeworICBBU1NFUlRfVFJVRShQcmludGVkRGVjbENYWDk4TWF0Y2hlcygKKyAgICAidHlwZWRlZiBjb25zdCBjaGFyICpBOyIsCisgICAgIkEiLAorICAgICJ0eXBlZGVmIGNvbnN0IGNoYXIgKkEiKSk7CisgICAgLy8gU2hvdWxkIGJlOiB3aXRoIHNlbWljb2xvbgorfQorCitURVNUKERlY2xQcmludGVyLCBUZXN0VHlwZWRlZjMpIHsKKyAgQVNTRVJUX1RSVUUoUHJpbnRlZERlY2xDWFg5OE1hdGNoZXMoCisgICAgInRlbXBsYXRlIDx0eXBlbmFtZSBZPiBjbGFzcyBYIHt9OyIKKyAgICAidHlwZWRlZiBYPGludD4gQTsiLAorICAgICJBIiwKKyAgICAidHlwZWRlZiBYPGludD4gQSIpKTsKKyAgICAvLyBTaG91bGQgYmU6IHdpdGggc2VtaWNvbG9uCit9CisKK1RFU1QoRGVjbFByaW50ZXIsIFRlc3RUeXBlZGVmNCkgeworICBBU1NFUlRfVFJVRShQcmludGVkRGVjbENYWDk4TWF0Y2hlcygKKyAgICAibmFtZXNwYWNlIFggeyBjbGFzcyBZIHt9OyB9IgorICAgICJ0eXBlZGVmIFg6OlkgQTsiLAorICAgICJBIiwKKyAgICAidHlwZWRlZiBYOjpZIEEiKSk7CisgICAgLy8gU2hvdWxkIGJlOiB3aXRoIHNlbWljb2xvbgorfQorCiBURVNUKERlY2xQcmludGVyLCBUZXN0TmFtZXNwYWNlMSkgewogICBBU1NFUlRfVFJVRShQcmludGVkRGVjbENYWDk4TWF0Y2hlcygKICAgICAibmFtZXNwYWNlIEEgeyBpbnQgQjsgfSIsCkBAIC0zNDAsOCArMzg5LDggQEAKICAgQVNTRVJUX1RSVUUoUHJpbnRlZERlY2xDWFgxMU1hdGNoZXMoCiAgICAgImNvbnN0ZXhwciBpbnQgQShpbnQgYSk7IiwKICAgICAiQSIsCi0gICAgImludCBBKGludCBhKSIpKTsKLSAgICAvLyBXUk9ORzsgU2hvdWxkIGJlOiAiY29uc3RleHByIGludCBBKGludCBhKTsiCisgICAgImNvbnN0ZXhwciBpbnQgQShpbnQgYSkiKSk7CisgICAgLy8gU2hvdWxkIGJlOiB3aXRoIHNlbWljb2xvbgogfQogCiBURVNUKERlY2xQcmludGVyLCBUZXN0RnVuY3Rpb25EZWNsOCkgewpAQCAtMzcwLDExICs0MTksMTEgQEAKIAogVEVTVChEZWNsUHJpbnRlciwgVGVzdEZ1bmN0aW9uRGVjbDExKSB7CiAgIEFTU0VSVF9UUlVFKFByaW50ZWREZWNsQ1hYOThNYXRjaGVzKAotICAgICJ0eXBlZGVmIGxvbmcgc2l6ZV90OyIKKyAgICAidHlwZWRlZiBsb25nIHNzaXplX3Q7IgogICAgICJ0eXBlZGVmIGludCAqcEludDsiCi0gICAgInZvaWQgQShpbnQgYSwgcEludCBiLCBzaXplX3QgYyk7IiwKKyAgICAidm9pZCBBKGludCBhLCBwSW50IGIsIHNzaXplX3QgYyk7IiwKICAgICAiQSIsCi0gICAgInZvaWQgQShpbnQgYSwgcEludCBiLCBzaXplX3QgYykiKSk7CisgICAgInZvaWQgQShpbnQgYSwgcEludCBiLCBzc2l6ZV90IGMpIikpOwogICAgIC8vIFNob3VsZCBiZTogd2l0aCBzZW1pY29sb24KIH0KIApAQCAtNDY2LDggKzUxNSw3IEBACiAgICAgIiAgY29uc3RleHByIEEoKTsiCiAgICAgIn07IiwKICAgICBjb25zdHJ1Y3RvckRlY2wob2ZDbGFzcyhoYXNOYW1lKCJBIikpKS5iaW5kKCJpZCIpLAotICAgICJBKCkiKSk7Ci0gICAgLy8gV1JPTkc7IFNob3VsZCBiZTogImNvbnN0ZXhwciBBKCk7IgorICAgICJjb25zdGV4cHIgQSgpIikpOwogfQogCiBURVNUKERlY2xQcmludGVyLCBUZXN0Q1hYQ29uc3RydWN0b3JEZWNsOCkgewpAQCAtNDk4LDE4ICs1NDYsMTYgQEAKICAgICAiQTxULi4uPihjb25zdCBBPFQuLi4+ICZhKSIpKTsKIH0KIAotI2lmICFkZWZpbmVkKF9NU0NfVkVSKQogVEVTVChEZWNsUHJpbnRlciwgVGVzdENYWENvbnN0cnVjdG9yRGVjbDExKSB7Ci0gIEFTU0VSVF9UUlVFKFByaW50ZWREZWNsQ1hYMTFNYXRjaGVzKAorICBBU1NFUlRfVFJVRShQcmludGVkRGVjbENYWDExbm9uTVNDTWF0Y2hlcygKICAgICAidGVtcGxhdGU8dHlwZW5hbWUuLi4gVD4iCiAgICAgInN0cnVjdCBBIDogcHVibGljIFQuLi4geyIKICAgICAiICBBKFQmJi4uLiB0cykgOiBUKHRzKS4uLiB7fSIKICAgICAifTsiLAogICAgIGNvbnN0cnVjdG9yRGVjbChvZkNsYXNzKGhhc05hbWUoIkEiKSkpLmJpbmQoImlkIiksCi0gICAgIkE8VC4uLj4oVCAmJnRzLi4uKSA6IFQodHMpIikpOworICAgICJBPFQuLi4+KFQgJiZ0cy4uLikgOiBUKHRzKS4uLiIpKTsKICAgICAvLyBXUk9ORzsgU2hvdWxkIGJlOiAiQShUJiYuLi4gdHMpIDogVCh0cykuLi4iCiB9Ci0jZW5kaWYKIAogVEVTVChEZWNsUHJpbnRlciwgVGVzdENYWERlc3RydWN0b3JEZWNsMSkgewogICBBU1NFUlRfVFJVRShQcmludGVkRGVjbENYWDk4TWF0Y2hlcygKQEAgLTUxNyw4ICs1NjMsNyBAQAogICAgICIgIH5BKCk7IgogICAgICJ9OyIsCiAgICAgZGVzdHJ1Y3RvckRlY2wob2ZDbGFzcyhoYXNOYW1lKCJBIikpKS5iaW5kKCJpZCIpLAotICAgICJ2b2lkIH5BKCkiKSk7Ci0gICAgLy8gV1JPTkc7IFNob3VsZCBiZTogIn5BKCk7IgorICAgICJ+QSgpIikpOwogfQogCiBURVNUKERlY2xQcmludGVyLCBUZXN0Q1hYRGVzdHJ1Y3RvckRlY2wyKSB7CkBAIC01MjcsOCArNTcyLDcgQEAKICAgICAiICB2aXJ0dWFsIH5BKCk7IgogICAgICJ9OyIsCiAgICAgZGVzdHJ1Y3RvckRlY2wob2ZDbGFzcyhoYXNOYW1lKCJBIikpKS5iaW5kKCJpZCIpLAotICAgICJ2aXJ0dWFsIHZvaWQgfkEoKSIpKTsKLSAgICAvLyBXUk9ORzsgU2hvdWxkIGJlOiAidmlydHVhbCB+QSgpOyIKKyAgICAidmlydHVhbCB+QSgpIikpOwogfQogCiBURVNUKERlY2xQcmludGVyLCBUZXN0Q1hYQ29udmVyc2lvbkRlY2wxKSB7CkBAIC01MzcsOCArNTgxLDcgQEAKICAgICAiICBvcGVyYXRvciBpbnQoKTsiCiAgICAgIn07IiwKICAgICBtZXRob2REZWNsKG9mQ2xhc3MoaGFzTmFtZSgiQSIpKSkuYmluZCgiaWQiKSwKLSAgICAiaW50IG9wZXJhdG9yIGludCgpIikpOwotICAgIC8vIFdST05HOyBTaG91bGQgYmU6ICJvcGVyYXRvciBpbnQoKTsiCisgICAgIm9wZXJhdG9yIGludCgpIikpOwogfQogCiBURVNUKERlY2xQcmludGVyLCBUZXN0Q1hYQ29udmVyc2lvbkRlY2wyKSB7CkBAIC01NDcsOCArNTkwLDcgQEAKICAgICAiICBvcGVyYXRvciBib29sKCk7IgogICAgICJ9OyIsCiAgICAgbWV0aG9kRGVjbChvZkNsYXNzKGhhc05hbWUoIkEiKSkpLmJpbmQoImlkIiksCi0gICAgImJvb2wgb3BlcmF0b3IgX0Jvb2woKSIpKTsKLSAgICAvLyBXUk9ORzsgU2hvdWxkIGJlOiAib3BlcmF0b3IgYm9vbCgpOyIKKyAgICAib3BlcmF0b3IgYm9vbCgpIikpOwogfQogCiBURVNUKERlY2xQcmludGVyLCBUZXN0Q1hYQ29udmVyc2lvbkRlY2wzKSB7CkBAIC01NTgsOCArNjAwLDcgQEAKICAgICAiICBvcGVyYXRvciBaKCk7IgogICAgICJ9OyIsCiAgICAgbWV0aG9kRGVjbChvZkNsYXNzKGhhc05hbWUoIkEiKSkpLmJpbmQoImlkIiksCi0gICAgIlogb3BlcmF0b3Igc3RydWN0IFooKSIpKTsKLSAgICAvLyBXUk9ORzsgU2hvdWxkIGJlOiAib3BlcmF0b3IgWigpOyIKKyAgICAib3BlcmF0b3IgWigpIikpOwogfQogCiBURVNUKERlY2xQcmludGVyLCBUZXN0Q1hYTWV0aG9kRGVjbF9BbGxvY2F0aW9uRnVuY3Rpb24xKSB7CkBAIC03NTYsOCArNzk3LDggQEAKICAgICAiICB2b2lkIEEoaW50IGEpICY7IgogICAgICJ9OyIsCiAgICAgIkEiLAotICAgICJ2b2lkIEEoaW50IGEpIikpOwotICAgIC8vIFdST05HOyBTaG91bGQgYmU6ICJ2b2lkIEEoaW50IGEpICY7IgorICAgICJ2b2lkIEEoaW50IGEpICYiKSk7CisgICAgLy8gU2hvdWxkIGJlOiB3aXRoIHNlbWljb2xvbgogfQogCiBURVNUKERlY2xQcmludGVyLCBUZXN0Q1hYTWV0aG9kRGVjbF9SZWZRdWFsaWZpZXIyKSB7CkBAIC03NjYsOCArODA3LDggQEAKICAgICAiICB2b2lkIEEoaW50IGEpICYmOyIKICAgICAifTsiLAogICAgICJBIiwKLSAgICAidm9pZCBBKGludCBhKSIpKTsKLSAgICAvLyBXUk9ORzsgU2hvdWxkIGJlOiAidm9pZCBBKGludCBhKSAmJjsiCisgICAgInZvaWQgQShpbnQgYSkgJiYiKSk7CisgICAgLy8gU2hvdWxkIGJlOiB3aXRoIHNlbWljb2xvbgogfQogCiBURVNUKERlY2xQcmludGVyLCBUZXN0RnVuY3Rpb25EZWNsX0V4Y2VwdGlvblNwZWNpZmljYXRpb24xKSB7CmRpZmYgLS1naXQgYS91bml0dGVzdHMvQVNUL0RlY2xUZXN0LmNwcCBiL3VuaXR0ZXN0cy9BU1QvRGVjbFRlc3QuY3BwCmluZGV4IGM4NDVkYTIuLjg3YWVlZjQgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9BU1QvRGVjbFRlc3QuY3BwCisrKyBiL3VuaXR0ZXN0cy9BU1QvRGVjbFRlc3QuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKIFRFU1QoRGVjbCwgQ2xlYW5zVXBBUFZhbHVlcykgewogICBNYXRjaEZpbmRlciBGaW5kZXI7Ci0gIGxsdm06Ok93bmluZ1B0cjxGcm9udGVuZEFjdGlvbkZhY3Rvcnk+IEZhY3RvcnkoCisgIHN0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbkZhY3Rvcnk+IEZhY3RvcnkoCiAgICAgICBuZXdGcm9udGVuZEFjdGlvbkZhY3RvcnkoJkZpbmRlcikpOwogCiAgIC8vIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIGEgbWVtb3J5IGxlYWsgaW4gQVBWYWx1ZXMgZm9yIHN0cnVjdHMgdGhhdApkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL0FTVC9FdmFsdWF0ZUFzUlZhbHVlVGVzdC5jcHAgYi91bml0dGVzdHMvQVNUL0V2YWx1YXRlQXNSVmFsdWVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTIwYzkzCi0tLSAvZGV2L251bGwKKysrIGIvdW5pdHRlc3RzL0FTVC9FdmFsdWF0ZUFzUlZhbHVlVGVzdC5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8vPT09LSB1bml0dGVzdHMvQVNUL0V2YWx1YXRlQXNSVmFsdWVUZXN0LmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gXGZpbGUKKy8vIFxicmllZiBVbml0IHRlc3RzIGZvciBldmFsdWF0aW9uIG9mIGNvbnN0YW50IGluaXRpYWxpemVycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb25zdW1lci5oIgorI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL1JlY3Vyc2l2ZUFTVFZpc2l0b3IuaCIKKyNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1Rvb2xpbmcuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnN1bWVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjbGFuZzo6dG9vbGluZzsKKworbmFtZXNwYWNlIHsKKy8vIEZvciBlYWNoIHZhcmlhYmxlIG5hbWUgZW5jb3VudGVyZWQsIHdoZXRoZXIgaXRzIGluaXRpYWxpemVyIHdhcyBhCisvLyBjb25zdGFudC4KK3R5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGJvb2w+IFZhckluZm9NYXA7CisKKy8vLyBcYnJpZWYgUmVjb3JkcyBpbmZvcm1hdGlvbiBvbiB2YXJpYWJsZSBpbml0aWFsaXplcnMgdG8gYSBtYXAuCitjbGFzcyBFdmFsdWF0ZUNvbnN0YW50SW5pdGlhbGl6ZXJzVmlzaXRvcgorICAgIDogcHVibGljIGNsYW5nOjpSZWN1cnNpdmVBU1RWaXNpdG9yPEV2YWx1YXRlQ29uc3RhbnRJbml0aWFsaXplcnNWaXNpdG9yPiB7CisgcHVibGljOgorICBleHBsaWNpdCBFdmFsdWF0ZUNvbnN0YW50SW5pdGlhbGl6ZXJzVmlzaXRvcihWYXJJbmZvTWFwICZWYXJJbmZvKQorICAgICAgOiBWYXJJbmZvKFZhckluZm8pIHt9CisKKyAgLy8vIFxicmllZiBDaGVja3MgdGhhdCBpc0NvbnN0YW50SW5pdGlhbGl6ZXIgYW5kIEV2YWx1YXRlQXNSVmFsdWUgYWdyZWUKKyAgLy8vIGFuZCBkb24ndCBjcmFzaC4KKyAgLy8vCisgIC8vLyBGb3IgZWFjaCBWYXJEZWNsIHdpdGggYW4gaW5pdGlhbGl6ZXIgdGhpcyBhbHNvIHJlY29yZHMgaW4gVmFySW5mbworICAvLy8gd2hldGhlciB0aGUgaW5pdGlhbGl6ZXIgY291bGQgYmUgZXZhbHVhdGVkIGFzIGEgY29uc3RhbnQuCisgIGJvb2wgVmlzaXRWYXJEZWNsKGNvbnN0IGNsYW5nOjpWYXJEZWNsICpWRCkgeworICAgIGlmIChjb25zdCBjbGFuZzo6RXhwciAqSW5pdCA9IFZELT5nZXRJbml0KCkpIHsKKyAgICAgIGNsYW5nOjpFeHByOjpFdmFsUmVzdWx0IFJlc3VsdDsKKyAgICAgIGJvb2wgV2FzRXZhbHVhdGVkID0gSW5pdC0+RXZhbHVhdGVBc1JWYWx1ZShSZXN1bHQsIFZELT5nZXRBU1RDb250ZXh0KCkpOworICAgICAgVmFySW5mb1tWRC0+Z2V0TmFtZUFzU3RyaW5nKCldID0gV2FzRXZhbHVhdGVkOworICAgICAgRVhQRUNUX0VRKFdhc0V2YWx1YXRlZCwgSW5pdC0+aXNDb25zdGFudEluaXRpYWxpemVyKFZELT5nZXRBU1RDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypGb3JSZWYqLykpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgVmFySW5mb01hcCAmVmFySW5mbzsKK307CisKK2NsYXNzIEV2YWx1YXRlQ29uc3RhbnRJbml0aWFsaXplcnNBY3Rpb24gOiBwdWJsaWMgY2xhbmc6OkFTVEZyb250ZW5kQWN0aW9uIHsKKyBwdWJsaWM6CisgIGNsYW5nOjpBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoY2xhbmc6OkNvbXBpbGVySW5zdGFuY2UgJkNvbXBpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBGaWxlUGF0aCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBuZXcgQ29uc3VtZXI7CisgIH0KKworIHByaXZhdGU6CisgIGNsYXNzIENvbnN1bWVyIDogcHVibGljIGNsYW5nOjpBU1RDb25zdW1lciB7CisgICBwdWJsaWM6CisgICAgfkNvbnN1bWVyKCkgb3ZlcnJpZGUge30KKworICAgIHZvaWQgSGFuZGxlVHJhbnNsYXRpb25Vbml0KGNsYW5nOjpBU1RDb250ZXh0ICZDdHgpIG92ZXJyaWRlIHsKKyAgICAgIFZhckluZm9NYXAgVmFySW5mbzsKKyAgICAgIEV2YWx1YXRlQ29uc3RhbnRJbml0aWFsaXplcnNWaXNpdG9yIEV2YWx1YXRvcihWYXJJbmZvKTsKKyAgICAgIEV2YWx1YXRvci5UcmF2ZXJzZURlY2woQ3R4LmdldFRyYW5zbGF0aW9uVW5pdERlY2woKSk7CisgICAgICBFWFBFQ1RfRVEoMnUsIFZhckluZm8uc2l6ZSgpKTsKKyAgICAgIEVYUEVDVF9GQUxTRShWYXJJbmZvWyJEZXBlbmRlbnQiXSk7CisgICAgICBFWFBFQ1RfVFJVRShWYXJJbmZvWyJDb25zdGFudCJdKTsKKyAgICAgIEVYUEVDVF9FUSgydSwgVmFySW5mby5zaXplKCkpOworICAgIH0KKyAgfTsKK307Cit9CisKK1RFU1QoRXZhbHVhdGVBc1JWYWx1ZSwgRmFpbHNHcmFjZWZ1bGx5Rm9yVW5rbm93blR5cGVzKSB7CisgIC8vIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRlc3Q7IHRoZSBBU1QgbGlicmFyeSB1c2VkIHRvIHRyaWdnZXIgYXNzZXJ0aW9uCisgIC8vIGZhaWx1cmVzIGJlY2F1c2UgaXQgYXNzdW1lZCB0aGF0IHRoZSB0eXBlIG9mIGluaXRpYWxpemVycyB3YXMgYWx3YXlzCisgIC8vIGtub3duICh3aGljaCBpcyB0cnVlIG9ubHkgYWZ0ZXIgdGVtcGxhdGUgaW5zdGFudGlhdGlvbikuCisgIHN0ZDo6c3RyaW5nIE1vZGVzVG9UZXN0W10gPSB7Ii1zdGQ9YysrMDMiLCAiLXN0ZD1jKysxMSIsICItc3RkPWMrKzF5In07CisgIGZvciAoc3RkOjpzdHJpbmcgY29uc3QgJk1vZGUgOiBNb2Rlc1RvVGVzdCkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcmdzKDEsIE1vZGUpOworICAgIEFyZ3MucHVzaF9iYWNrKCItZm5vLWRlbGF5ZWQtdGVtcGxhdGUtcGFyc2luZyIpOworICAgIEFTU0VSVF9UUlVFKHJ1blRvb2xPbkNvZGVXaXRoQXJncygKKyAgICAgIG5ldyBFdmFsdWF0ZUNvbnN0YW50SW5pdGlhbGl6ZXJzQWN0aW9uKCksCisgICAgICAidGVtcGxhdGUgPHR5cGVuYW1lIFQ+IgorICAgICAgInN0cnVjdCB2ZWN0b3IgeyIKKyAgICAgICIgIGV4cGxpY2l0IHZlY3RvcihpbnQgc2l6ZSk7IgorICAgICAgIn07IgorICAgICAgInRlbXBsYXRlIDx0eXBlbmFtZSBSPiIKKyAgICAgICJzdHJ1Y3QgUyB7IgorICAgICAgIiAgdmVjdG9yPFI+IGludGVydmFscygpIGNvbnN0IHsiCisgICAgICAiICAgIHZlY3RvcjxSPiBEZXBlbmRlbnQoMik7IgorICAgICAgIiAgICByZXR1cm4gRGVwZW5kZW50OyIKKyAgICAgICIgIH0iCisgICAgICAifTsiCisgICAgICAidm9pZCBkb1NvbWV0aGluZygpIHsiCisgICAgICAiICBpbnQgQ29uc3RhbnQgPSAyICsgMjsiCisgICAgICAiICAodm9pZCkgQ29uc3RhbnQ7IgorICAgICAgIn0iLAorICAgICAgQXJncykpOworICB9Cit9CmRpZmYgLS1naXQgYS91bml0dGVzdHMvQVNUL0V4dGVybmFsQVNUU291cmNlVGVzdC5jcHAgYi91bml0dGVzdHMvQVNUL0V4dGVybmFsQVNUU291cmNlVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjMmRlZgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXR0ZXN0cy9BU1QvRXh0ZXJuYWxBU1RTb3VyY2VUZXN0LmNwcApAQCAtMCwwICsxLDgzIEBACisvLz09PS0gdW5pdHRlc3QvQVNUL0V4dGVybmFsQVNUU291cmNlVGVzdC5jcHAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0ZXN0cyBmb3IgQ2xhbmcncyBFeHRlcm5hbEFTVFNvdXJjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnN1bWVyLmgiCisjaW5jbHVkZSAiY2xhbmcvQVNUL0FTVENvbnRleHQuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvRXh0ZXJuYWxBU1RTb3VyY2UuaCIKKyNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Db21waWxlckluc3RhbmNlLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvQ29tcGlsZXJJbnZvY2F0aW9uLmgiCisjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25zLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNsYW5nOwordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKKworY2xhc3MgVGVzdEZyb250ZW5kQWN0aW9uIDogcHVibGljIEFTVEZyb250ZW5kQWN0aW9uIHsKK3B1YmxpYzoKKyAgVGVzdEZyb250ZW5kQWN0aW9uKEV4dGVybmFsQVNUU291cmNlICpTb3VyY2UpIDogU291cmNlKFNvdXJjZSkge30KKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIEV4ZWN1dGVBY3Rpb24oKSB7CisgICAgZ2V0Q29tcGlsZXJJbnN0YW5jZSgpLmdldEFTVENvbnRleHQoKS5zZXRFeHRlcm5hbFNvdXJjZShTb3VyY2UpOworICAgIGdldENvbXBpbGVySW5zdGFuY2UoKS5nZXRBU1RDb250ZXh0KCkuZ2V0VHJhbnNsYXRpb25Vbml0RGVjbCgpCisgICAgICAgIC0+c2V0SGFzRXh0ZXJuYWxWaXNpYmxlU3RvcmFnZSgpOworICAgIHJldHVybiBBU1RGcm9udGVuZEFjdGlvbjo6RXhlY3V0ZUFjdGlvbigpOworICB9CisKKyAgdmlydHVhbCBBU1RDb25zdW1lciAqQ3JlYXRlQVNUQ29uc3VtZXIoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBJbkZpbGUpIHsKKyAgICByZXR1cm4gbmV3IEFTVENvbnN1bWVyOworICB9CisKKyAgSW50cnVzaXZlUmVmQ250UHRyPEV4dGVybmFsQVNUU291cmNlPiBTb3VyY2U7Cit9OworCitib29sIHRlc3RFeHRlcm5hbEFTVFNvdXJjZShFeHRlcm5hbEFTVFNvdXJjZSAqU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVDb250ZW50cykgeworICBDb21waWxlckluc3RhbmNlIENvbXBpbGVyOworICBDb21waWxlci5jcmVhdGVEaWFnbm9zdGljcygpOworCisgIENvbXBpbGVySW52b2NhdGlvbiAqSW52b2NhdGlvbiA9IG5ldyBDb21waWxlckludm9jYXRpb247CisgIEludm9jYXRpb24tPmdldFByZXByb2Nlc3Nvck9wdHMoKS5hZGRSZW1hcHBlZEZpbGUoCisgICAgInRlc3QuY2MiLCBNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlcihGaWxlQ29udGVudHMpKTsKKyAgY29uc3QgY2hhciAqQXJnc1tdID0geyAidGVzdC5jYyIgfTsKKyAgQ29tcGlsZXJJbnZvY2F0aW9uOjpDcmVhdGVGcm9tQXJncygqSW52b2NhdGlvbiwgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzICsgYXJyYXlfbGVuZ3Rob2YoQXJncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXIuZ2V0RGlhZ25vc3RpY3MoKSk7CisgIENvbXBpbGVyLnNldEludm9jYXRpb24oSW52b2NhdGlvbik7CisKKyAgVGVzdEZyb250ZW5kQWN0aW9uIEFjdGlvbihTb3VyY2UpOworICByZXR1cm4gQ29tcGlsZXIuRXhlY3V0ZUFjdGlvbihBY3Rpb24pOworfQorCisKKy8vIEVuc3VyZSB0aGF0IGEgZmFpbGVkIG5hbWUgbG9va3VwIGludG8gYW4gZXh0ZXJuYWwgc291cmNlIG9ubHkgb2NjdXJzIG9uY2UuCitURVNUKEV4dGVybmFsQVNUU291cmNlVGVzdCwgRmFpbGVkTG9va3VwT2NjdXJzT25jZSkgeworICBzdHJ1Y3QgVGVzdFNvdXJjZSA6IEV4dGVybmFsQVNUU291cmNlIHsKKyAgICBUZXN0U291cmNlKHVuc2lnbmVkICZDYWxscykgOiBDYWxscyhDYWxscykge30KKworICAgIGJvb2wgRmluZEV4dGVybmFsVmlzaWJsZURlY2xzQnlOYW1lKGNvbnN0IERlY2xDb250ZXh0KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbk5hbWUgTmFtZSkgeworICAgICAgaWYgKE5hbWUuZ2V0QXNTdHJpbmcoKSA9PSAiaiIpCisgICAgICAgICsrQ2FsbHM7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgJkNhbGxzOworICB9OworCisgIHVuc2lnbmVkIENhbGxzID0gMDsKKyAgQVNTRVJUX1RSVUUodGVzdEV4dGVybmFsQVNUU291cmNlKG5ldyBUZXN0U291cmNlKENhbGxzKSwgImludCBqLCBrID0gajsiKSk7CisgIEVYUEVDVF9FUSgxdSwgQ2FsbHMpOworfQpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL0FTVC9NYXRjaFZlcmlmaWVyLmggYi91bml0dGVzdHMvQVNUL01hdGNoVmVyaWZpZXIuaAppbmRleCA1YTI5Y2RlLi4wMjY1ZjRhIDEwMDY0NAotLS0gYS91bml0dGVzdHMvQVNUL01hdGNoVmVyaWZpZXIuaAorKysgYi91bml0dGVzdHMvQVNUL01hdGNoVmVyaWZpZXIuaApAQCAtNzksNyArNzksNyBAQAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgQXJncywgTGFuZ3VhZ2UgTCkgewogICBNYXRjaEZpbmRlciBGaW5kZXI7CiAgIEZpbmRlci5hZGRNYXRjaGVyKEFNYXRjaGVyLmJpbmQoIiIpLCB0aGlzKTsKLSAgT3duaW5nUHRyPHRvb2xpbmc6OkZyb250ZW5kQWN0aW9uRmFjdG9yeT4gRmFjdG9yeSgKKyAgc3RkOjp1bmlxdWVfcHRyPHRvb2xpbmc6OkZyb250ZW5kQWN0aW9uRmFjdG9yeT4gRmFjdG9yeSgKICAgICAgIHRvb2xpbmc6Om5ld0Zyb250ZW5kQWN0aW9uRmFjdG9yeSgmRmluZGVyKSk7CiAKICAgU3RyaW5nUmVmIEZpbGVOYW1lOwpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL0FTVC9Tb3VyY2VMb2NhdGlvblRlc3QuY3BwIGIvdW5pdHRlc3RzL0FTVC9Tb3VyY2VMb2NhdGlvblRlc3QuY3BwCmluZGV4IDI5MTU2YmMuLjZlOTQ0NDIgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9BU1QvU291cmNlTG9jYXRpb25UZXN0LmNwcAorKysgYi91bml0dGVzdHMvQVNUL1NvdXJjZUxvY2F0aW9uVGVzdC5jcHAKQEAgLTE3LDExICsxNywxMSBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb250ZXh0LmgiCisjaW5jbHVkZSAiTWF0Y2hWZXJpZmllci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVE1hdGNoZXJzL0FTVE1hdGNoRmluZGVyLmgiCiAjaW5jbHVkZSAiY2xhbmcvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnMuaCIKICNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1Rvb2xpbmcuaCIKICNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgIk1hdGNoVmVyaWZpZXIuaCIKIAogbmFtZXNwYWNlIGNsYW5nIHsKIG5hbWVzcGFjZSBhc3RfbWF0Y2hlcnMgewpAQCAtMjExLDYgKzIxMSwxNiBAQAogICAgICAgZnVuY3Rpb25hbENhc3RFeHByKCksIExhbmdfQ1hYMTEpKTsKIH0KIAorVEVTVChDWFhDb25zdHJ1Y3RFeHByLCBTb3VyY2VSYW5nZSkgeworICBSYW5nZVZlcmlmaWVyPENYWENvbnN0cnVjdEV4cHI+IFZlcmlmaWVyOworICBWZXJpZmllci5leHBlY3RSYW5nZSgzLCAxNCwgMywgMTkpOworICBFWFBFQ1RfVFJVRShWZXJpZmllci5tYXRjaCgKKyAgICAgICJzdHJ1Y3QgQSB7IEEoaW50LCBpbnQpOyB9O1xuIgorICAgICAgInZvaWQgZihBIGEpO1xuIgorICAgICAgInZvaWQgZygpIHsgZih7MCwgMH0pOyB9IiwKKyAgICAgIGNvbnN0cnVjdEV4cHIoKSwgTGFuZ19DWFgxMSkpOworfQorCiBURVNUKENYWFRlbXBvcmFyeU9iamVjdEV4cHIsIFNvdXJjZVJhbmdlKSB7CiAgIFJhbmdlVmVyaWZpZXI8Q1hYVGVtcG9yYXJ5T2JqZWN0RXhwcj4gVmVyaWZpZXI7CiAgIFZlcmlmaWVyLmV4cGVjdFJhbmdlKDIsIDYsIDIsIDEyKTsKZGlmZiAtLWdpdCBhL3VuaXR0ZXN0cy9BU1QvU3RtdFByaW50ZXJUZXN0LmNwcCBiL3VuaXR0ZXN0cy9BU1QvU3RtdFByaW50ZXJUZXN0LmNwcAppbmRleCA0NzNlZTEzLi5kNzI2NTE3IDEwMDY0NAotLS0gYS91bml0dGVzdHMvQVNUL1N0bXRQcmludGVyVGVzdC5jcHAKKysrIGIvdW5pdHRlc3RzL0FTVC9TdG10UHJpbnRlclRlc3QuY3BwCkBAIC02NCwxOSArNjQsMjAgQEAKICAgfQogfTsKIAotOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJpbnRlZFN0bXRNYXRjaGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNsYXJhdGlvbk1hdGNoZXIgJk5vZGVNYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRXhwZWN0ZWRQcmludGVkKSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKzo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0CitQcmludGVkU3RtdE1hdGNoZXMoU3RyaW5nUmVmIENvZGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmQXJncywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBUICZOb2RlTWF0Y2gsIFN0cmluZ1JlZiBFeHBlY3RlZFByaW50ZWQpIHsKIAogICBQcmludE1hdGNoIFByaW50ZXI7CiAgIE1hdGNoRmluZGVyIEZpbmRlcjsKICAgRmluZGVyLmFkZE1hdGNoZXIoTm9kZU1hdGNoLCAmUHJpbnRlcik7Ci0gIE93bmluZ1B0cjxGcm9udGVuZEFjdGlvbkZhY3Rvcnk+IEZhY3RvcnkobmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5KCZGaW5kZXIpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPEZyb250ZW5kQWN0aW9uRmFjdG9yeT4gRmFjdG9yeSgKKyAgICAgIG5ld0Zyb250ZW5kQWN0aW9uRmFjdG9yeSgmRmluZGVyKSk7CiAKICAgaWYgKCFydW5Ub29sT25Db2RlV2l0aEFyZ3MoRmFjdG9yeS0+Y3JlYXRlKCksIENvZGUsIEFyZ3MpKQotICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkgPDwgIlBhcnNpbmcgZXJyb3IgaW4gXCIiIDw8IENvZGUgPDwgIlwiIjsKKyAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCisgICAgICA8PCAiUGFyc2luZyBlcnJvciBpbiBcIiIgPDwgQ29kZS5zdHIoKSA8PCAiXCIiOwogCiAgIGlmIChQcmludGVyLmdldE51bUZvdW5kU3RtdHMoKSA9PSAwKQogICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkKQEAgLTg5LDEyICs5MCwyMSBAQAogCiAgIGlmIChQcmludGVyLmdldFByaW50ZWQoKSAhPSBFeHBlY3RlZFByaW50ZWQpCiAgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCi0gICAgICA8PCAiRXhwZWN0ZWQgXCIiIDw8IEV4cGVjdGVkUHJpbnRlZCA8PCAiXCIsICIKLSAgICAgICAgICJnb3QgXCIiIDw8IFByaW50ZXIuZ2V0UHJpbnRlZCgpIDw8ICJcIiI7CisgICAgICA8PCAiRXhwZWN0ZWQgXCIiIDw8IEV4cGVjdGVkUHJpbnRlZC5zdHIoKSA8PCAiXCIsICIKKyAgICAgICAgICJnb3QgXCIiIDw8IFByaW50ZXIuZ2V0UHJpbnRlZCgpLnN0cigpIDw8ICJcIiI7CiAKICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOwogfQogCis6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdAorUHJpbnRlZFN0bXRDWFg5OE1hdGNoZXMoU3RyaW5nUmVmIENvZGUsIGNvbnN0IFN0YXRlbWVudE1hdGNoZXIgJk5vZGVNYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBFeHBlY3RlZFByaW50ZWQpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFyZ3M7CisgIEFyZ3MucHVzaF9iYWNrKCItc3RkPWMrKzk4Iik7CisgIEFyZ3MucHVzaF9iYWNrKCItV25vLXVudXNlZC12YWx1ZSIpOworICByZXR1cm4gUHJpbnRlZFN0bXRNYXRjaGVzKENvZGUsIEFyZ3MsIE5vZGVNYXRjaCwgRXhwZWN0ZWRQcmludGVkKTsKK30KKwogOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJpbnRlZFN0bXRDWFg5OE1hdGNoZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvbnRhaW5pbmdGdW5jdGlvbiwKQEAgLTEwOSw2ICsxMTksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RlZFByaW50ZWQpOwogfQogCis6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdAorUHJpbnRlZFN0bXRDWFgxMU1hdGNoZXMoU3RyaW5nUmVmIENvZGUsIGNvbnN0IFN0YXRlbWVudE1hdGNoZXIgJk5vZGVNYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBFeHBlY3RlZFByaW50ZWQpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFyZ3M7CisgIEFyZ3MucHVzaF9iYWNrKCItc3RkPWMrKzExIik7CisgIEFyZ3MucHVzaF9iYWNrKCItV25vLXVudXNlZC12YWx1ZSIpOworICByZXR1cm4gUHJpbnRlZFN0bXRNYXRjaGVzKENvZGUsIEFyZ3MsIE5vZGVNYXRjaCwgRXhwZWN0ZWRQcmludGVkKTsKK30KKwogOjp0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQgUHJpbnRlZFN0bXRNU01hdGNoZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvbnRhaW5pbmdGdW5jdGlvbiwKQEAgLTE2MywzICsxODIsMzIgQEAKICAgICAiMS5GICwgLTEuRiAsIDEuICwgLTEuICwgMS5MICwgLTEuTCIpKTsKICAgICAvLyBTaG91bGQgYmU6IHdpdGggc2VtaWNvbG9uCiB9CisKK1RFU1QoU3RtdFByaW50ZXIsIFRlc3RDWFhDb252ZXJzaW9uRGVjbEltcGxpY2l0KSB7CisgIEFTU0VSVF9UUlVFKFByaW50ZWRTdG10Q1hYOThNYXRjaGVzKAorICAgICJzdHJ1Y3QgQSB7IgorICAgICAgIm9wZXJhdG9yIHZvaWQgKigpOyIKKyAgICAgICJBIG9wZXJhdG9yJihBKTsiCisgICAgIn07IgorICAgICJ2b2lkIGJhcih2b2lkICopOyIKKyAgICAidm9pZCBmb28oQSBhLCBBIGIpIHsiCisgICAgIiAgYmFyKGEgJiBiKTsiCisgICAgIn0iLAorICAgIG1lbWJlckNhbGxFeHByKGFueXRoaW5nKCkpLmJpbmQoImlkIiksCisgICAgImEgJiBiIikpOworfQorCitURVNUKFN0bXRQcmludGVyLCBUZXN0Q1hYQ29udmVyc2lvbkRlY2xFeHBsaWNpdCkgeworICBBU1NFUlRfVFJVRShQcmludGVkU3RtdENYWDExTWF0Y2hlcygKKyAgICAic3RydWN0IEEgeyIKKyAgICAgICJvcGVyYXRvciB2b2lkICooKTsiCisgICAgICAiQSBvcGVyYXRvciYoQSk7IgorICAgICJ9OyIKKyAgICAidm9pZCBiYXIodm9pZCAqKTsiCisgICAgInZvaWQgZm9vKEEgYSwgQSBiKSB7IgorICAgICIgIGF1dG8geCA9IChhICYgYikub3BlcmF0b3Igdm9pZCAqKCk7IgorICAgICJ9IiwKKyAgICBtZW1iZXJDYWxsRXhwcihhbnl0aGluZygpKS5iaW5kKCJpZCIpLAorICAgICIoYSAmIGIpIikpOworICAgIC8vIFdST05HOyBTaG91bGQgYmU6IChhICYgYikub3BlcmF0b3Igdm9pZCAqKCkKK30KZGlmZiAtLWdpdCBhL3VuaXR0ZXN0cy9BU1RNYXRjaGVycy9BU1RNYXRjaGVyc1Rlc3QuY3BwIGIvdW5pdHRlc3RzL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzVGVzdC5jcHAKaW5kZXggY2MxM2MwMS4uNWQwOTcwMCAxMDA2NDQKLS0tIGEvdW5pdHRlc3RzL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzVGVzdC5jcHAKKysrIGIvdW5pdHRlc3RzL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzVGVzdC5jcHAKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9BU1RNYXRjaEZpbmRlci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzLmgiCiAjaW5jbHVkZSAiY2xhbmcvVG9vbGluZy9Ub29saW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0hvc3QuaCIKICNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgogCiBuYW1lc3BhY2UgY2xhbmcgewpAQCAtMTAzLDEyICsxMDUsMTMgQEAKIAogVEVTVChEZWNsYXJhdGlvbk1hdGNoZXIsIE1hdGNoQ2xhc3MpIHsKICAgRGVjbGFyYXRpb25NYXRjaGVyIENsYXNzTWF0Y2hlcihyZWNvcmREZWNsKCkpOwotI2lmICFkZWZpbmVkKF9NU0NfVkVSKQotICBFWFBFQ1RfRkFMU0UobWF0Y2hlcygiIiwgQ2xhc3NNYXRjaGVyKSk7Ci0jZWxzZQotICAvLyBNYXRjaGVzIGNsYXNzIHR5cGVfaW5mby4KLSAgRVhQRUNUX1RSVUUobWF0Y2hlcygiIiwgQ2xhc3NNYXRjaGVyKSk7Ci0jZW5kaWYKKyAgbGx2bTo6VHJpcGxlIFRyaXBsZShsbHZtOjpzeXM6OmdldERlZmF1bHRUYXJnZXRUcmlwbGUoKSk7CisgIGlmIChUcmlwbGUuZ2V0T1MoKSAhPSBsbHZtOjpUcmlwbGU6OldpbjMyIHx8CisgICAgICBUcmlwbGUuZ2V0RW52aXJvbm1lbnQoKSAhPSBsbHZtOjpUcmlwbGU6Ok1TVkMpCisgICAgRVhQRUNUX0ZBTFNFKG1hdGNoZXMoIiIsIENsYXNzTWF0Y2hlcikpOworICBlbHNlCisgICAgLy8gTWF0Y2hlcyBjbGFzcyB0eXBlX2luZm8uCisgICAgRVhQRUNUX1RSVUUobWF0Y2hlcygiIiwgQ2xhc3NNYXRjaGVyKSk7CiAKICAgRGVjbGFyYXRpb25NYXRjaGVyIENsYXNzWCA9IHJlY29yZERlY2wocmVjb3JkRGVjbChoYXNOYW1lKCJYIikpKTsKICAgRVhQRUNUX1RSVUUobWF0Y2hlcygiY2xhc3MgWDsiLCBDbGFzc1gpKTsKQEAgLTY2Myw3ICs2NjYsNyBAQAogICAgICAgOiBJZChJZCksIEV4cGVjdGVkQ291bnQoRXhwZWN0ZWRDb3VudCksIENvdW50KDApLAogICAgICAgICBFeHBlY3RlZE5hbWUoRXhwZWN0ZWROYW1lKSB7fQogCi0gIHZvaWQgb25FbmRPZlRyYW5zbGF0aW9uVW5pdCgpIExMVk1fT1ZFUlJJREUgeworICB2b2lkIG9uRW5kT2ZUcmFuc2xhdGlvblVuaXQoKSBvdmVycmlkZSB7CiAgICAgaWYgKEV4cGVjdGVkQ291bnQgIT0gLTEpCiAgICAgICBFWFBFQ1RfRVEoRXhwZWN0ZWRDb3VudCwgQ291bnQpOwogICAgIGlmICghRXhwZWN0ZWROYW1lLmVtcHR5KCkpCkBAIC0xMDAwLDcgKzEwMDMsNyBAQAogfQogCiBURVNUKE1hdGNoZXIsIExhbWJkYSkgewotICBFWFBFQ1RfVFJVRShtYXRjaGVzKCJhdXRvIGYgPSBbJl0gKGludCBpKSB7IHJldHVybiBpOyB9OyIsCisgIEVYUEVDVF9UUlVFKG1hdGNoZXMoImF1dG8gZiA9IFtdIChpbnQgaSkgeyByZXR1cm4gaTsgfTsiLAogICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYUV4cHIoKSkpOwogfQogCkBAIC0xMDM4LDcgKzEwNDEsNyBAQAogICBFWFBFQ1RfVFJVRShtYXRjaGVzKCJuYW1lc3BhY2UgbnMgeyBzdHJ1Y3QgQSB7fTsgfSAgc3RydWN0IEIgeyBuczo6QSBhOyB9OyIsCiAgICAgICBmaWVsZERlY2woaGFzVHlwZShhc1N0cmluZygibnM6OkEiKSkpKSk7CiAgIEVYUEVDVF9UUlVFKG1hdGNoZXMoIm5hbWVzcGFjZSB7IHN0cnVjdCBBIHt9OyB9ICBzdHJ1Y3QgQiB7IEEgYTsgfTsiLAotICAgICAgZmllbGREZWNsKGhhc1R5cGUoYXNTdHJpbmcoInN0cnVjdCA8YW5vbnltb3VzPjo6QSIpKSkpKTsKKyAgICAgIGZpZWxkRGVjbChoYXNUeXBlKGFzU3RyaW5nKCJzdHJ1Y3QgKGFub255bW91cyBuYW1lc3BhY2UpOjpBIikpKSkpOwogfQogCiBURVNUKE1hdGNoZXIsIE92ZXJsb2FkZWRPcGVyYXRvckNhbGwpIHsKQEAgLTEzMDAsMTUgKzEzMDMsMTYgQEAKICAgRVhQRUNUX1RSVUUobWF0Y2hlcygidm9pZCBmKCkgeyBmKCk7IH0iLCBDYWxsRnVuY3Rpb25GKSk7CiAgIEVYUEVDVF9UUlVFKG5vdE1hdGNoZXMoInZvaWQgZigpIHsgfSIsIENhbGxGdW5jdGlvbkYpKTsKIAotI2lmICFkZWZpbmVkKF9NU0NfVkVSKQotICAvLyBGSVhNRTogTWFrZSB0aGlzIHdvcmsgZm9yIE1TVkMuCi0gIC8vIERlcGVuZGVudCBjb250ZXh0cywgYnV0IGEgbm9uLWRlcGVuZGVudCBjYWxsLgotICBFWFBFQ1RfVFJVRShtYXRjaGVzKCJ2b2lkIGYoKTsgdGVtcGxhdGUgPGludCBOPiB2b2lkIGcoKSB7IGYoKTsgfSIsCi0gICAgICAgICAgICAgICAgICAgICAgQ2FsbEZ1bmN0aW9uRikpOwotICBFWFBFQ1RfVFJVRSgKLSAgICAgIG1hdGNoZXMoInZvaWQgZigpOyB0ZW1wbGF0ZSA8aW50IE4+IHN0cnVjdCBTIHsgdm9pZCBnKCkgeyBmKCk7IH0gfTsiLAotICAgICAgICAgICAgICBDYWxsRnVuY3Rpb25GKSk7Ci0jZW5kaWYKKyAgaWYgKGxsdm06OlRyaXBsZShsbHZtOjpzeXM6OmdldERlZmF1bHRUYXJnZXRUcmlwbGUoKSkuZ2V0T1MoKSAhPQorICAgICAgbGx2bTo6VHJpcGxlOjpXaW4zMikgeworICAgIC8vIEZJWE1FOiBNYWtlIHRoaXMgd29yayBmb3IgTVNWQy4KKyAgICAvLyBEZXBlbmRlbnQgY29udGV4dHMsIGJ1dCBhIG5vbi1kZXBlbmRlbnQgY2FsbC4KKyAgICBFWFBFQ1RfVFJVRShtYXRjaGVzKCJ2b2lkIGYoKTsgdGVtcGxhdGUgPGludCBOPiB2b2lkIGcoKSB7IGYoKTsgfSIsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxsRnVuY3Rpb25GKSk7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgIG1hdGNoZXMoInZvaWQgZigpOyB0ZW1wbGF0ZSA8aW50IE4+IHN0cnVjdCBTIHsgdm9pZCBnKCkgeyBmKCk7IH0gfTsiLAorICAgICAgICAgICAgICAgIENhbGxGdW5jdGlvbkYpKTsKKyAgfQogCiAgIC8vIERlcGVkZW50IGNhbGxzIGRvbid0IG1hdGNoLgogICBFWFBFQ1RfVFJVRSgKQEAgLTE0NzksNyArMTQ4Myw3IEBACiAgICAgICAgICAgcmVjb3JkRGVjbChoYXNOYW1lKCJYIikpKSkpKSkpOwogfQogCi1URVNUKEhhc05hbWUsIE1hdGNoZXNQYXJhbWV0ZXJWYXJpYWJsZURlY2xhcnRpb25zKSB7CitURVNUKEhhc05hbWUsIE1hdGNoZXNQYXJhbWV0ZXJWYXJpYWJsZURlY2xhcmF0aW9ucykgewogICBFWFBFQ1RfVFJVRShtYXRjaGVzKCJjbGFzcyBZIHt9OyBjbGFzcyBYIHsgdm9pZCB4KGludCB4KSB7fSB9OyIsCiAgICAgICBtZXRob2REZWNsKGhhc0FueVBhcmFtZXRlcihoYXNOYW1lKCJ4IikpKSkpOwogICBFWFBFQ1RfVFJVRShub3RNYXRjaGVzKCJjbGFzcyBZIHt9OyBjbGFzcyBYIHsgdm9pZCB4KGludCkge30gfTsiLApAQCAtMTUyNyw2ICsxNTMxLDE5IEBACiAgICAgICAiQTxpbnQ+IGE7IiwKICAgICAgIGNsYXNzVGVtcGxhdGVTcGVjaWFsaXphdGlvbkRlY2woaGFzQW55VGVtcGxhdGVBcmd1bWVudCgKICAgICAgICAgICByZWZlcnNUb0RlY2xhcmF0aW9uKGRlY2woKSkpKSkpOworCisgIEVYUEVDVF9UUlVFKG1hdGNoZXMoCisgICAgICAic3RydWN0IEIgeyBpbnQgbmV4dDsgfTsiCisgICAgICAidGVtcGxhdGU8aW50KEI6OipuZXh0X3B0cik+IHN0cnVjdCBBIHt9OyIKKyAgICAgICJBPCZCOjpuZXh0PiBhOyIsCisgICAgICB0ZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZShoYXNBbnlUZW1wbGF0ZUFyZ3VtZW50KGlzRXhwcigKKyAgICAgICAgICBoYXNEZXNjZW5kYW50KGRlY2xSZWZFeHByKHRvKGZpZWxkRGVjbChoYXNOYW1lKCJuZXh0IikpKSkpKSkpKSk7CisKKyAgRVhQRUNUX1RSVUUobm90TWF0Y2hlcygKKyAgICAgICJ0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEEge307IgorICAgICAgIkE8aW50PiBhOyIsCisgICAgICB0ZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZShoYXNBbnlUZW1wbGF0ZUFyZ3VtZW50KAorICAgICAgICAgIHJlZmVyc1RvRGVjbGFyYXRpb24oZGVjbCgpKSkpKSk7CiB9CiAKIFRFU1QoTWF0Y2hlciwgTWF0Y2hlc1NwZWNpZmljQXJndW1lbnQpIHsKQEAgLTE1NDAsNiArMTU1NywxNyBAQAogICAgICAgIkE8aW50LCBib29sPiBhOyIsCiAgICAgICBjbGFzc1RlbXBsYXRlU3BlY2lhbGl6YXRpb25EZWNsKGhhc1RlbXBsYXRlQXJndW1lbnQoCiAgICAgICAgICAgMSwgcmVmZXJzVG9UeXBlKGFzU3RyaW5nKCJpbnQiKSkpKSkpOworCisgIEVYUEVDVF9UUlVFKG1hdGNoZXMoCisgICAgICAidGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gY2xhc3MgQSB7fTsiCisgICAgICAiQTxib29sLCBpbnQ+IGE7IiwKKyAgICAgIHRlbXBsYXRlU3BlY2lhbGl6YXRpb25UeXBlKGhhc1RlbXBsYXRlQXJndW1lbnQoCisgICAgICAgICAgMSwgcmVmZXJzVG9UeXBlKGFzU3RyaW5nKCJpbnQiKSkpKSkpOworICBFWFBFQ1RfVFJVRShub3RNYXRjaGVzKAorICAgICAgInRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IGNsYXNzIEEge307IgorICAgICAgIkE8aW50LCBib29sPiBhOyIsCisgICAgICB0ZW1wbGF0ZVNwZWNpYWxpemF0aW9uVHlwZShoYXNUZW1wbGF0ZUFyZ3VtZW50KAorICAgICAgICAgIDEsIHJlZmVyc1RvVHlwZShhc1N0cmluZygiaW50IikpKSkpKTsKIH0KIAogVEVTVChNYXRjaGVyLCBNYXRjaGVzQWNjZXNzU3BlY0RlY2xzKSB7CkBAIC0xNTYxLDYgKzE1ODksMTMgQEAKICAgICAgIG1ldGhvZERlY2woaXNWaXJ0dWFsKCkpKSk7CiB9CiAKK1RFU1QoTWF0Y2hlciwgTWF0Y2hlc1B1cmVNZXRob2QpIHsKKyAgRVhQRUNUX1RSVUUobWF0Y2hlcygiY2xhc3MgWCB7IHZpcnR1YWwgaW50IGYoKSA9IDA7IH07IiwKKyAgICAgIG1ldGhvZERlY2woaXNQdXJlKCksIGhhc05hbWUoIjo6WDo6ZiIpKSkpOworICBFWFBFQ1RfVFJVRShub3RNYXRjaGVzKCJjbGFzcyBYIHsgaW50IGYoKTsgfTsiLAorICAgICAgbWV0aG9kRGVjbChpc1B1cmUoKSkpKTsKK30KKwogVEVTVChNYXRjaGVyLCBNYXRjaGVzQ29uc3RNZXRob2QpIHsKICAgRVhQRUNUX1RSVUUobWF0Y2hlcygic3RydWN0IEEgeyB2b2lkIGZvbygpIGNvbnN0OyB9OyIsCiAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRGVjbChpc0NvbnN0KCkpKSk7CkBAIC0xNjM3LDYgKzE2NzIsMTcgQEAKICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IxQXJnKSk7CiB9CiAKK1RFU1QoTWF0Y2hlciwgQ29uc3RydWN0b3JMaXN0SW5pdGlhbGl6YXRpb24pIHsKKyAgU3RhdGVtZW50TWF0Y2hlciBDb25zdHJ1Y3Rvckxpc3RJbml0ID0gY29uc3RydWN0RXhwcihpc0xpc3RJbml0aWFsaXphdGlvbigpKTsKKworICBFWFBFQ1RfVFJVRSgKKyAgICAgIG1hdGNoZXMoImNsYXNzIFggeyBwdWJsaWM6IFgoaW50KTsgfTsgdm9pZCB4KCkgeyBYIHh7MH07IH0iLAorICAgICAgICAgICAgICBDb25zdHJ1Y3Rvckxpc3RJbml0KSk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1hdGNoZXMoImNsYXNzIFggeyBwdWJsaWM6IFgoaW50KTsgfTsgdm9pZCB4KCkgeyBYIHgoMCk7IH0iLAorICAgICAgICAgICAgICBDb25zdHJ1Y3Rvckxpc3RJbml0KSk7Cit9CisKIFRFU1QoTWF0Y2hlcixUaGlzRXhwcikgewogICBFWFBFQ1RfVFJVRSgKICAgICAgIG1hdGNoZXMoInN0cnVjdCBYIHsgaW50IGE7IGludCBmICgpIHsgcmV0dXJuIGE7IH0gfTsiLCB0aGlzRXhwcigpKSk7CkBAIC0yMzM5LDYgKzIzODUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICBmb3JTdG10KGhhc0xvb3BJbml0KGFueXRoaW5nKCkpKSkpOwogfQogCitURVNUKEZvciwgRm9yUmFuZ2VMb29wSW50ZXJuYWxzKSB7CisgIEVYUEVDVF9UUlVFKG1hdGNoZXMoInZvaWQgZigpeyBpbnQgYVtdIHsxLCAyfTsgZm9yIChpbnQgaSA6IGEpOyB9IiwKKyAgICAgICAgICAgICAgICAgICAgICBmb3JSYW5nZVN0bXQoaGFzTG9vcFZhcmlhYmxlKGFueXRoaW5nKCkpKSkpOworfQorCiBURVNUKEZvciwgTmVnYXRpdmVGb3JMb29wSW50ZXJuYWxzKSB7CiAgIEVYUEVDVF9UUlVFKG5vdE1hdGNoZXMoInZvaWQgZigpeyBmb3IgKGludCBpID0gMDsgOyArK2kpOyB9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JTdG10KGhhc0NvbmRpdGlvbihleHByKCkpKSkpOwpAQCAtMjYwOCwxMyArMjY1OSwxMyBAQAogfQogCiBURVNUKEZ1bmN0aW9uYWxDYXN0LCBNYXRjaGVzU2ltcGxlQ2FzZSkgewotICBzdGQ6OnN0cmluZyBmb29fY2xhc3MgPSAiY2xhc3MgRm9vIHsgcHVibGljOiBGb28oY2hhciopOyB9OyI7CisgIHN0ZDo6c3RyaW5nIGZvb19jbGFzcyA9ICJjbGFzcyBGb28geyBwdWJsaWM6IEZvbyhjb25zdCBjaGFyKik7IH07IjsKICAgRVhQRUNUX1RSVUUobWF0Y2hlcyhmb29fY2xhc3MgKyAidm9pZCByKCkgeyBGb28gZiA9IEZvbyhcImhlbGxvIHdvcmxkXCIpOyB9IiwKICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbmFsQ2FzdEV4cHIoKSkpOwogfQogCiBURVNUKEZ1bmN0aW9uYWxDYXN0LCBEb2VzTm90TWF0Y2hPdGhlckNhc3RzKSB7Ci0gIHN0ZDo6c3RyaW5nIEZvb0NsYXNzID0gImNsYXNzIEZvbyB7IHB1YmxpYzogRm9vKGNoYXIqKTsgfTsiOworICBzdGQ6OnN0cmluZyBGb29DbGFzcyA9ICJjbGFzcyBGb28geyBwdWJsaWM6IEZvbyhjb25zdCBjaGFyKik7IH07IjsKICAgRVhQRUNUX1RSVUUoCiAgICAgICBub3RNYXRjaGVzKEZvb0NsYXNzICsgInZvaWQgcigpIHsgRm9vIGYgPSAoRm9vKSBcImhlbGxvIHdvcmxkXCI7IH0iLAogICAgICAgICAgICAgICAgICBmdW5jdGlvbmFsQ2FzdEV4cHIoKSkpOwpAQCAtMjg5Miw2ICsyOTQzLDE1IEBACiAgIEVYUEVDVF9UUlVFKG1hdGNoZXMoInZvaWQgeCgpIHsgaW50IGE7IH0iLCBkZWNsU3RtdCgpKSk7CiB9CiAKK1RFU1QoRXhwcldpdGhDbGVhbnVwcywgTWF0Y2hlc0V4cHJXaXRoQ2xlYW51cHMpIHsKKyAgRVhQRUNUX1RSVUUobWF0Y2hlcygic3RydWN0IEZvbyB7IH5Gb28oKTsgfTsiCisgICAgICAgICAgICAgICAgICAgICAgImNvbnN0IEZvbyBmID0gRm9vKCk7IiwKKyAgICAgICAgICAgICAgICAgICAgICB2YXJEZWNsKGhhc0luaXRpYWxpemVyKGV4cHJXaXRoQ2xlYW51cHMoKSkpKSk7CisgIEVYUEVDVF9GQUxTRShtYXRjaGVzKCJzdHJ1Y3QgRm9vIHsgfTsiCisgICAgICAgICAgICAgICAgICAgICAgImNvbnN0IEZvbyBmID0gRm9vKCk7IiwKKyAgICAgICAgICAgICAgICAgICAgICB2YXJEZWNsKGhhc0luaXRpYWxpemVyKGV4cHJXaXRoQ2xlYW51cHMoKSkpKSk7Cit9CisKIFRFU1QoSW5pdExpc3RFeHByZXNzaW9uLCBNYXRjaGVzSW5pdExpc3RFeHByZXNzaW9uKSB7CiAgIEVYUEVDVF9UUlVFKG1hdGNoZXMoImludCBhW10gPSB7IDEsIDIgfTsiLAogICAgICAgICAgICAgICAgICAgICAgIGluaXRMaXN0RXhwcihoYXNUeXBlKGFzU3RyaW5nKCJpbnQgWzJdIikpKSkpOwpAQCAtMzYxNywxMiArMzY3NywxNiBAQAogfQogCiBURVNUKFR5cGVNYXRjaGluZywgTWF0Y2hlc0F0b21pY1R5cGVzKSB7Ci0gIEVYUEVDVF9UUlVFKG1hdGNoZXMoIl9BdG9taWMoaW50KSBpOyIsIGF0b21pY1R5cGUoKSkpOworICBpZiAobGx2bTo6VHJpcGxlKGxsdm06OnN5czo6Z2V0RGVmYXVsdFRhcmdldFRyaXBsZSgpKS5nZXRPUygpICE9CisgICAgICBsbHZtOjpUcmlwbGU6OldpbjMyKSB7CisgICAgLy8gRklYTUU6IE1ha2UgdGhpcyB3b3JrIGZvciBNU1ZDLgorICAgIEVYUEVDVF9UUlVFKG1hdGNoZXMoIl9BdG9taWMoaW50KSBpOyIsIGF0b21pY1R5cGUoKSkpOwogCi0gIEVYUEVDVF9UUlVFKG1hdGNoZXMoIl9BdG9taWMoaW50KSBpOyIsCi0gICAgICAgICAgICAgICAgICAgICAgYXRvbWljVHlwZShoYXNWYWx1ZVR5cGUoaXNJbnRlZ2VyKCkpKSkpOwotICBFWFBFQ1RfVFJVRShub3RNYXRjaGVzKCJfQXRvbWljKGZsb2F0KSBmOyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXRvbWljVHlwZShoYXNWYWx1ZVR5cGUoaXNJbnRlZ2VyKCkpKSkpOworICAgIEVYUEVDVF9UUlVFKG1hdGNoZXMoIl9BdG9taWMoaW50KSBpOyIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdG9taWNUeXBlKGhhc1ZhbHVlVHlwZShpc0ludGVnZXIoKSkpKSk7CisgICAgRVhQRUNUX1RSVUUobm90TWF0Y2hlcygiX0F0b21pYyhmbG9hdCkgZjsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbWljVHlwZShoYXNWYWx1ZVR5cGUoaXNJbnRlZ2VyKCkpKSkpOworICB9CiB9CiAKIFRFU1QoVHlwZU1hdGNoaW5nLCBNYXRjaGVzQXV0b1R5cGVzKSB7CkBAIC00MTExLDEyICs0MTc1LDEzIEBACiAgIE1hdGNoRmluZGVyIEZpbmRlcjsKICAgVmVyaWZ5U3RhcnRPZlRyYW5zbGF0aW9uVW5pdCBWZXJpZnlDYWxsYmFjazsKICAgRmluZGVyLmFkZE1hdGNoZXIoZGVjbCgpLCAmVmVyaWZ5Q2FsbGJhY2spOwotICBPd25pbmdQdHI8RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiBGYWN0b3J5KG5ld0Zyb250ZW5kQWN0aW9uRmFjdG9yeSgmRmluZGVyKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbkZhY3Rvcnk+IEZhY3RvcnkoCisgICAgICBuZXdGcm9udGVuZEFjdGlvbkZhY3RvcnkoJkZpbmRlcikpOwogICBBU1NFUlRfVFJVRSh0b29saW5nOjpydW5Ub29sT25Db2RlKEZhY3RvcnktPmNyZWF0ZSgpLCAiaW50IHg7IikpOwogICBFWFBFQ1RfVFJVRShWZXJpZnlDYWxsYmFjay5DYWxsZWQpOwogCiAgIFZlcmlmeUNhbGxiYWNrLkNhbGxlZCA9IGZhbHNlOwotICBPd25pbmdQdHI8QVNUVW5pdD4gQVNUKHRvb2xpbmc6OmJ1aWxkQVNURnJvbUNvZGUoImludCB4OyIpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVFVuaXQ+IEFTVCh0b29saW5nOjpidWlsZEFTVEZyb21Db2RlKCJpbnQgeDsiKSk7CiAgIEFTU0VSVF9UUlVFKEFTVC5nZXQoKSk7CiAgIEZpbmRlci5tYXRjaEFTVChBU1QtPmdldEFTVENvbnRleHQoKSk7CiAgIEVYUEVDVF9UUlVFKFZlcmlmeUNhbGxiYWNrLkNhbGxlZCk7CkBAIC00MTM4LDEyICs0MjAzLDEzIEBACiAgIE1hdGNoRmluZGVyIEZpbmRlcjsKICAgVmVyaWZ5RW5kT2ZUcmFuc2xhdGlvblVuaXQgVmVyaWZ5Q2FsbGJhY2s7CiAgIEZpbmRlci5hZGRNYXRjaGVyKGRlY2woKSwgJlZlcmlmeUNhbGxiYWNrKTsKLSAgT3duaW5nUHRyPEZyb250ZW5kQWN0aW9uRmFjdG9yeT4gRmFjdG9yeShuZXdGcm9udGVuZEFjdGlvbkZhY3RvcnkoJkZpbmRlcikpOworICBzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiBGYWN0b3J5KAorICAgICAgbmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5KCZGaW5kZXIpKTsKICAgQVNTRVJUX1RSVUUodG9vbGluZzo6cnVuVG9vbE9uQ29kZShGYWN0b3J5LT5jcmVhdGUoKSwgImludCB4OyIpKTsKICAgRVhQRUNUX1RSVUUoVmVyaWZ5Q2FsbGJhY2suQ2FsbGVkKTsKIAogICBWZXJpZnlDYWxsYmFjay5DYWxsZWQgPSBmYWxzZTsKLSAgT3duaW5nUHRyPEFTVFVuaXQ+IEFTVCh0b29saW5nOjpidWlsZEFTVEZyb21Db2RlKCJpbnQgeDsiKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxBU1RVbml0PiBBU1QodG9vbGluZzo6YnVpbGRBU1RGcm9tQ29kZSgiaW50IHg7IikpOwogICBBU1NFUlRfVFJVRShBU1QuZ2V0KCkpOwogICBGaW5kZXIubWF0Y2hBU1QoQVNULT5nZXRBU1RDb250ZXh0KCkpOwogICBFWFBFQ1RfVFJVRShWZXJpZnlDYWxsYmFjay5DYWxsZWQpOwpAQCAtNDIwNCw3ICs0MjcwLDYgQEAKIH0KIAogVEVTVChFcXVhbHNCb3VuZE5vZGVNYXRjaGVyLCBVc2luZ0ZvckVhY2hEZXNjZW5kYW50KSB7Ci0KICAgRVhQRUNUX1RSVUUobWF0Y2hBbmRWZXJpZnlSZXN1bHRUcnVlKAogICAgICAgImludCBmKCkgeyIKICAgICAgICIgIGlmICgxKSB7IgpAQCAtNDIzOCw1ICs0MzAzLDM3IEBACiAgICAgICBuZXcgVmVyaWZ5SWRJc0JvdW5kVG88VmFyRGVjbD4oImQiLCA1KSkpOwogfQogCitURVNUKEVxdWFsc0JvdW5kTm9kZU1hdGNoZXIsIFVubGVzc0Rlc2NlbmRhbnRzT2ZBbmNlc3RvcnNNYXRjaCkgeworICBFWFBFQ1RfVFJVRShtYXRjaEFuZFZlcmlmeVJlc3VsdFRydWUoCisgICAgICAic3RydWN0IFN0cmluZ1JlZiB7IGludCBzaXplKCkgY29uc3Q7IGNvbnN0IGNoYXIqIGRhdGEoKSBjb25zdDsgfTsiCisgICAgICAidm9pZCBmKFN0cmluZ1JlZiB2KSB7IgorICAgICAgIiAgdi5kYXRhKCk7IgorICAgICAgIn0iLAorICAgICAgbWVtYmVyQ2FsbEV4cHIoCisgICAgICAgICAgY2FsbGVlKG1ldGhvZERlY2woaGFzTmFtZSgiZGF0YSIpKSksCisgICAgICAgICAgb24oZGVjbFJlZkV4cHIodG8odmFyRGVjbChoYXNUeXBlKHJlY29yZERlY2woaGFzTmFtZSgiU3RyaW5nUmVmIikpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpbmQoInZhciIpKSkpLAorICAgICAgICAgIHVubGVzcyhoYXNBbmNlc3RvcihzdG10KGhhc0Rlc2NlbmRhbnQobWVtYmVyQ2FsbEV4cHIoCisgICAgICAgICAgICAgIGNhbGxlZShtZXRob2REZWNsKGFueU9mKGhhc05hbWUoInNpemUiKSwgaGFzTmFtZSgibGVuZ3RoIikpKSksCisgICAgICAgICAgICAgIG9uKGRlY2xSZWZFeHByKHRvKHZhckRlY2woZXF1YWxzQm91bmROb2RlKCJ2YXIiKSkpKSkpKSkpKSkKKyAgICAgICAgICAuYmluZCgiZGF0YSIpLAorICAgICAgbmV3IFZlcmlmeUlkSXNCb3VuZFRvPEV4cHI+KCJkYXRhIiwgMSkpKTsKKworICBFWFBFQ1RfRkFMU0UobWF0Y2hlcygKKyAgICAgICJzdHJ1Y3QgU3RyaW5nUmVmIHsgaW50IHNpemUoKSBjb25zdDsgY29uc3QgY2hhciogZGF0YSgpIGNvbnN0OyB9OyIKKyAgICAgICJ2b2lkIGYoU3RyaW5nUmVmIHYpIHsiCisgICAgICAiICB2LmRhdGEoKTsiCisgICAgICAiICB2LnNpemUoKTsiCisgICAgICAifSIsCisgICAgICBtZW1iZXJDYWxsRXhwcigKKyAgICAgICAgICBjYWxsZWUobWV0aG9kRGVjbChoYXNOYW1lKCJkYXRhIikpKSwKKyAgICAgICAgICBvbihkZWNsUmVmRXhwcih0byh2YXJEZWNsKGhhc1R5cGUocmVjb3JkRGVjbChoYXNOYW1lKCJTdHJpbmdSZWYiKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmluZCgidmFyIikpKSksCisgICAgICAgICAgdW5sZXNzKGhhc0FuY2VzdG9yKHN0bXQoaGFzRGVzY2VuZGFudChtZW1iZXJDYWxsRXhwcigKKyAgICAgICAgICAgICAgY2FsbGVlKG1ldGhvZERlY2woYW55T2YoaGFzTmFtZSgic2l6ZSIpLCBoYXNOYW1lKCJsZW5ndGgiKSkpKSwKKyAgICAgICAgICAgICAgb24oZGVjbFJlZkV4cHIodG8odmFyRGVjbChlcXVhbHNCb3VuZE5vZGUoInZhciIpKSkpKSkpKSkpKQorICAgICAgICAgIC5iaW5kKCJkYXRhIikpKTsKK30KKwogfSAvLyBlbmQgbmFtZXNwYWNlIGFzdF9tYXRjaGVycwogfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCmRpZmYgLS1naXQgYS91bml0dGVzdHMvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnNUZXN0LmggYi91bml0dGVzdHMvQVNUTWF0Y2hlcnMvQVNUTWF0Y2hlcnNUZXN0LmgKaW5kZXggZjViY2QzNy4uZTIyNDcyMiAxMDA2NDQKLS0tIGEvdW5pdHRlc3RzL0FTVE1hdGNoZXJzL0FTVE1hdGNoZXJzVGVzdC5oCisrKyBiL3VuaXR0ZXN0cy9BU1RNYXRjaGVycy9BU1RNYXRjaGVyc1Rlc3QuaApAQCAtNDcsNyArNDcsNyBAQAogICAgIH0KICAgfQogCi0gIHZvaWQgb25FbmRPZlRyYW5zbGF0aW9uVW5pdCgpIExMVk1fT1ZFUlJJREUgeworICB2b2lkIG9uRW5kT2ZUcmFuc2xhdGlvblVuaXQoKSBvdmVycmlkZSB7CiAgICAgaWYgKEZpbmRSZXN1bHRSZXZpZXdlcikKICAgICAgIEZpbmRSZXN1bHRSZXZpZXdlci0+b25FbmRPZlRyYW5zbGF0aW9uVW5pdCgpOwogICB9CkBAIC02Nyw3ICs2Nyw4IEBACiAgIEZpbmRlci5hZGRNYXRjaGVyKEFNYXRjaGVyLCBuZXcgVmVyaWZ5TWF0Y2goMCwgJkZvdW5kKSk7CiAgIGlmICghRmluZGVyLmFkZER5bmFtaWNNYXRjaGVyKEFNYXRjaGVyLCBuZXcgVmVyaWZ5TWF0Y2goMCwgJkR5bmFtaWNGb3VuZCkpKQogICAgIHJldHVybiB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkNvdWxkIG5vdCBhZGQgZHluYW1pYyBtYXRjaGVyIjsKLSAgT3duaW5nUHRyPEZyb250ZW5kQWN0aW9uRmFjdG9yeT4gRmFjdG9yeShuZXdGcm9udGVuZEFjdGlvbkZhY3RvcnkoJkZpbmRlcikpOworICBzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiBGYWN0b3J5KAorICAgICAgbmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5KCZGaW5kZXIpKTsKICAgLy8gU29tZSB0ZXN0cyB1c2UgdHlwZW9mLCB3aGljaCBpcyBhIGdudSBleHRlbnNpb24uCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcmdzKDEsIENvbXBpbGVBcmcpOwogICBpZiAoIXJ1blRvb2xPbkNvZGVXaXRoQXJncyhGYWN0b3J5LT5jcmVhdGUoKSwgQ29kZSwgQXJncykpIHsKQEAgLTEwNSwxMiArMTA2LDEzIEBACiBtYXRjaEFuZFZlcmlmeVJlc3VsdENvbmRpdGlvbmFsbHkoY29uc3Qgc3RkOjpzdHJpbmcgJkNvZGUsIGNvbnN0IFQgJkFNYXRjaGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kTm9kZXNDYWxsYmFjayAqRmluZFJlc3VsdFZlcmlmaWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwZWN0UmVzdWx0KSB7Ci0gIE93bmluZ1B0cjxCb3VuZE5vZGVzQ2FsbGJhY2s+IFNjb3BlZFZlcmlmaWVyKEZpbmRSZXN1bHRWZXJpZmllcik7CisgIHN0ZDo6dW5pcXVlX3B0cjxCb3VuZE5vZGVzQ2FsbGJhY2s+IFNjb3BlZFZlcmlmaWVyKEZpbmRSZXN1bHRWZXJpZmllcik7CiAgIGJvb2wgVmVyaWZpZWRSZXN1bHQgPSBmYWxzZTsKICAgTWF0Y2hGaW5kZXIgRmluZGVyOwogICBGaW5kZXIuYWRkTWF0Y2hlcigKICAgICAgIEFNYXRjaGVyLCBuZXcgVmVyaWZ5TWF0Y2goRmluZFJlc3VsdFZlcmlmaWVyLCAmVmVyaWZpZWRSZXN1bHQpKTsKLSAgT3duaW5nUHRyPEZyb250ZW5kQWN0aW9uRmFjdG9yeT4gRmFjdG9yeShuZXdGcm9udGVuZEFjdGlvbkZhY3RvcnkoJkZpbmRlcikpOworICBzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiBGYWN0b3J5KAorICAgICAgbmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5KCZGaW5kZXIpKTsKICAgLy8gU29tZSB0ZXN0cyB1c2UgdHlwZW9mLCB3aGljaCBpcyBhIGdudSBleHRlbnNpb24uCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcmdzKDEsICItc3RkPWdudSsrOTgiKTsKICAgaWYgKCFydW5Ub29sT25Db2RlV2l0aEFyZ3MoRmFjdG9yeS0+Y3JlYXRlKCksIENvZGUsIEFyZ3MpKSB7CkBAIC0xMjUsNyArMTI3LDcgQEAKICAgfQogCiAgIFZlcmlmaWVkUmVzdWx0ID0gZmFsc2U7Ci0gIE93bmluZ1B0cjxBU1RVbml0PiBBU1QoYnVpbGRBU1RGcm9tQ29kZVdpdGhBcmdzKENvZGUsIEFyZ3MpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPEFTVFVuaXQ+IEFTVChidWlsZEFTVEZyb21Db2RlV2l0aEFyZ3MoQ29kZSwgQXJncykpOwogICBpZiAoIUFTVC5nZXQoKSkKICAgICByZXR1cm4gdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJQYXJzaW5nIGVycm9yIGluIFwiIiA8PCBDb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIgd2hpbGUgYnVpbGRpbmcgQVNUIjsKZGlmZiAtLWdpdCBhL3VuaXR0ZXN0cy9BU1RNYXRjaGVycy9DTWFrZUxpc3RzLnR4dCBiL3VuaXR0ZXN0cy9BU1RNYXRjaGVycy9DTWFrZUxpc3RzLnR4dAppbmRleCA4NjJjNmEwLi4zYWNlOWZlIDEwMDY0NAotLS0gYS91bml0dGVzdHMvQVNUTWF0Y2hlcnMvQ01ha2VMaXN0cy50eHQKKysrIGIvdW5pdHRlc3RzL0FTVE1hdGNoZXJzL0NNYWtlTGlzdHMudHh0CkBAIC0xLDE1ICsxLDE2IEBACiBzZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMKLSAgJHtMTFZNX1RBUkdFVFNfVE9fQlVJTER9Ci0gIGFzbXBhcnNlcgotICBiaXRyZWFkZXIKLSAgc3VwcG9ydAotICBtYworICBTdXBwb3J0CiAgICkKIAogYWRkX2NsYW5nX3VuaXR0ZXN0KEFTVE1hdGNoZXJzVGVzdHMKICAgQVNUTWF0Y2hlcnNUZXN0LmNwcCkKIAogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKEFTVE1hdGNoZXJzVGVzdHMKLSAgZ3Rlc3QgZ3Rlc3RfbWFpbiBjbGFuZ0FTVE1hdGNoZXJzIGNsYW5nVG9vbGluZykKKyAgY2xhbmdBU1QKKyAgY2xhbmdBU1RNYXRjaGVycworICBjbGFuZ0Jhc2ljCisgIGNsYW5nRnJvbnRlbmQKKyAgY2xhbmdUb29saW5nCisgICkKIAogYWRkX3N1YmRpcmVjdG9yeShEeW5hbWljKQpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL0FTVE1hdGNoZXJzL0R5bmFtaWMvQ01ha2VMaXN0cy50eHQgYi91bml0dGVzdHMvQVNUTWF0Y2hlcnMvRHluYW1pYy9DTWFrZUxpc3RzLnR4dAppbmRleCBlYjlmYTU0Li44Yjk1YTdiIDEwMDY0NAotLS0gYS91bml0dGVzdHMvQVNUTWF0Y2hlcnMvRHluYW1pYy9DTWFrZUxpc3RzLnR4dAorKysgYi91bml0dGVzdHMvQVNUTWF0Y2hlcnMvRHluYW1pYy9DTWFrZUxpc3RzLnR4dApAQCAtMSw3ICsxLDE2IEBACitzZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMKKyAgU3VwcG9ydAorICApCisKIGFkZF9jbGFuZ191bml0dGVzdChEeW5hbWljQVNUTWF0Y2hlcnNUZXN0cwogICBWYXJpYW50VmFsdWVUZXN0LmNwcAogICBQYXJzZXJUZXN0LmNwcAogICBSZWdpc3RyeVRlc3QuY3BwKQogCiB0YXJnZXRfbGlua19saWJyYXJpZXMoRHluYW1pY0FTVE1hdGNoZXJzVGVzdHMKLSAgZ3Rlc3QgZ3Rlc3RfbWFpbiBjbGFuZ0FTVE1hdGNoZXJzIGNsYW5nRHluYW1pY0FTVE1hdGNoZXJzIGNsYW5nVG9vbGluZykKKyAgY2xhbmdBU1QKKyAgY2xhbmdBU1RNYXRjaGVycworICBjbGFuZ0R5bmFtaWNBU1RNYXRjaGVycworICBjbGFuZ0Zyb250ZW5kCisgIGNsYW5nVG9vbGluZworICApCmRpZmYgLS1naXQgYS91bml0dGVzdHMvQVNUTWF0Y2hlcnMvRHluYW1pYy9QYXJzZXJUZXN0LmNwcCBiL3VuaXR0ZXN0cy9BU1RNYXRjaGVycy9EeW5hbWljL1BhcnNlclRlc3QuY3BwCmluZGV4IGYxOWVjNTEuLmNkZjRmOTIgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9BU1RNYXRjaGVycy9EeW5hbWljL1BhcnNlclRlc3QuY3BwCisrKyBiL3VuaXR0ZXN0cy9BU1RNYXRjaGVycy9EeW5hbWljL1BhcnNlclRlc3QuY3BwCkBAIC03LDE0ICs3LDE0IEBACiAvLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KICNpbmNsdWRlICIuLi9BU1RNYXRjaGVyc1Rlc3QuaCIKICNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1BhcnNlci5oIgogI2luY2x1ZGUgImNsYW5nL0FTVE1hdGNoZXJzL0R5bmFtaWMvUmVnaXN0cnkuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgY2xhbmcgewogbmFtZXNwYWNlIGFzdF9tYXRjaGVycyB7CkBAIC0zOSwxNSArMzksMjQgQEAKICAgICBFcnJvcnMucHVzaF9iYWNrKEVycm9yLnRvU3RyaW5nRnVsbCgpKTsKICAgfQogCi0gIFZhcmlhbnRNYXRjaGVyIGFjdE9uTWF0Y2hlckV4cHJlc3Npb24oU3RyaW5nUmVmIE1hdGNoZXJOYW1lLAorICBsbHZtOjpPcHRpb25hbDxNYXRjaGVyQ3Rvcj4gbG9va3VwTWF0Y2hlckN0b3IoU3RyaW5nUmVmIE1hdGNoZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlUmFuZ2UgJk5hbWVSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzICpFcnJvcikgeworICAgIGNvbnN0IEV4cGVjdGVkTWF0Y2hlcnNUeTo6dmFsdWVfdHlwZSAqTWF0Y2hlciA9CisgICAgICAgICYqRXhwZWN0ZWRNYXRjaGVycy5maW5kKE1hdGNoZXJOYW1lKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNYXRjaGVyQ3Rvcj4oTWF0Y2hlcik7CisgIH0KKworICBWYXJpYW50TWF0Y2hlciBhY3RPbk1hdGNoZXJFeHByZXNzaW9uKE1hdGNoZXJDdG9yIEN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlUmFuZ2UgJk5hbWVSYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQmluZElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBhcnNlclZhbHVlPiBBcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzICpFcnJvcikgewotICAgIE1hdGNoZXJJbmZvIFRvU3RvcmUgPSB7IE1hdGNoZXJOYW1lLCBOYW1lUmFuZ2UsIEFyZ3MsIEJpbmRJRCB9OworICAgIGNvbnN0IEV4cGVjdGVkTWF0Y2hlcnNUeTo6dmFsdWVfdHlwZSAqTWF0Y2hlciA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXhwZWN0ZWRNYXRjaGVyc1R5Ojp2YWx1ZV90eXBlICo+KEN0b3IpOworICAgIE1hdGNoZXJJbmZvIFRvU3RvcmUgPSB7IE1hdGNoZXItPmZpcnN0LCBOYW1lUmFuZ2UsIEFyZ3MsIEJpbmRJRCB9OwogICAgIE1hdGNoZXJzLnB1c2hfYmFjayhUb1N0b3JlKTsKLSAgICByZXR1cm4gVmFyaWFudE1hdGNoZXI6OlNpbmdsZU1hdGNoZXIoCi0gICAgICAgIEV4cGVjdGVkTWF0Y2hlcnMuZmluZChNYXRjaGVyTmFtZSktPnNlY29uZCk7CisgICAgcmV0dXJuIFZhcmlhbnRNYXRjaGVyOjpTaW5nbGVNYXRjaGVyKE1hdGNoZXItPnNlY29uZCk7CiAgIH0KIAogICBzdHJ1Y3QgTWF0Y2hlckluZm8gewpAQCAtNjAsOCArNjksOSBAQAogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRXJyb3JzOwogICBzdGQ6OnZlY3RvcjxWYXJpYW50VmFsdWU+IFZhbHVlczsKICAgc3RkOjp2ZWN0b3I8TWF0Y2hlckluZm8+IE1hdGNoZXJzOwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgYXN0X21hdGNoZXJzOjppbnRlcm5hbDo6TWF0Y2hlcjxTdG10PiA+Ci0gIEV4cGVjdGVkTWF0Y2hlcnM7CisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGFzdF9tYXRjaGVyczo6aW50ZXJuYWw6Ok1hdGNoZXI8U3RtdD4gPgorICBFeHBlY3RlZE1hdGNoZXJzVHk7CisgIEV4cGVjdGVkTWF0Y2hlcnNUeSBFeHBlY3RlZE1hdGNoZXJzOwogfTsKIAogVEVTVChQYXJzZXJUZXN0LCBQYXJzZVVuc2lnbmVkKSB7CkBAIC0xOTQsMTYgKzIwNCwxOSBAQAogICAgICAgIjE6NTogRXJyb3IgcGFyc2luZyBtYXRjaGVyLiBGb3VuZCB0b2tlbiA8MTIzPiB3aGlsZSBsb29raW5nIGZvciAnKCcuIiwKICAgICAgIFBhcnNlV2l0aEVycm9yKCJGb28gMTIzIikpOwogICBFWFBFQ1RfRVEoCisgICAgICAiMToxOiBNYXRjaGVyIG5vdCBmb3VuZDogRm9vXG4iCiAgICAgICAiMTo5OiBFcnJvciBwYXJzaW5nIG1hdGNoZXIuIEZvdW5kIHRva2VuIDwxMjM+IHdoaWxlIGxvb2tpbmcgZm9yICcsJy4iLAogICAgICAgUGFyc2VXaXRoRXJyb3IoIkZvbyhcIkFcIiAxMjMpIikpOwogICBFWFBFQ1RfRVEoCisgICAgICAiMToxOiBNYXRjaGVyIG5vdCBmb3VuZDogRm9vXG4iCiAgICAgICAiMTo0OiBFcnJvciBwYXJzaW5nIG1hdGNoZXIuIEZvdW5kIGVuZC1vZi1jb2RlIHdoaWxlIGxvb2tpbmcgZm9yICcpJy4iLAogICAgICAgUGFyc2VXaXRoRXJyb3IoIkZvbygiKSk7CiAgIEVYUEVDVF9FUSgiMToxOiBFbmQgb2YgY29kZSBmb3VuZCB3aGlsZSBsb29raW5nIGZvciB0b2tlbi4iLAogICAgICAgICAgICAgUGFyc2VXaXRoRXJyb3IoIiIpKTsKICAgRVhQRUNUX0VRKCJJbnB1dCB2YWx1ZSBpcyBub3QgYSBtYXRjaGVyIGV4cHJlc3Npb24uIiwKICAgICAgICAgICAgIFBhcnNlTWF0Y2hlcldpdGhFcnJvcigiXCJBXCIiKSk7Ci0gIEVYUEVDVF9FUSgiMToxOiBFcnJvciBwYXJzaW5nIGFyZ3VtZW50IDEgZm9yIG1hdGNoZXIgRm9vLlxuIgorICBFWFBFQ1RfRVEoIjE6MTogTWF0Y2hlciBub3QgZm91bmQ6IEZvb1xuIgorICAgICAgICAgICAgIjE6MTogRXJyb3IgcGFyc2luZyBhcmd1bWVudCAxIGZvciBtYXRjaGVyIEZvby5cbiIKICAgICAgICAgICAgICIxOjU6IEludmFsaWQgdG9rZW4gPCg+IGZvdW5kIHdoZW4gbG9va2luZyBmb3IgYSB2YWx1ZS4iLAogICAgICAgICAgICAgUGFyc2VXaXRoRXJyb3IoIkZvbygoIikpOwogICBFWFBFQ1RfRVEoIjE6NzogRXhwZWN0ZWQgZW5kIG9mIGNvZGUuIiwgUGFyc2VXaXRoRXJyb3IoImV4cHIoKWEiKSk7CkBAIC0yMzIsNiArMjQ1LDIwIEBACiAgICAgICAgICAgICBQYXJzZVdpdGhFcnJvcigiY2FsbGVlKFwiQVwiKSIpKTsKIH0KIAorVEVTVChQYXJzZXJUZXN0LCBDb21wbGV0aW9uKSB7CisgIHN0ZDo6dmVjdG9yPE1hdGNoZXJDb21wbGV0aW9uPiBDb21wcyA9CisgICAgICBQYXJzZXI6OmNvbXBsZXRlRXhwcmVzc2lvbigid2hpbGUiLCA1KTsKKyAgQVNTRVJUX0VRKDF1LCBDb21wcy5zaXplKCkpOworICBFWFBFQ1RfRVEoIlN0bXQoIiwgQ29tcHNbMF0uVHlwZWRUZXh0KTsKKyAgRVhQRUNUX0VRKCJNYXRjaGVyPFN0bXQ+IHdoaWxlU3RtdChNYXRjaGVyPFdoaWxlU3RtdD4uLi4pIiwKKyAgICAgICAgICAgIENvbXBzWzBdLk1hdGNoZXJEZWNsKTsKKworICBDb21wcyA9IFBhcnNlcjo6Y29tcGxldGVFeHByZXNzaW9uKCJ3aGlsZVN0bXQoKS4iLCAxMik7CisgIEFTU0VSVF9FUSgxdSwgQ29tcHMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJiaW5kKFwiIiwgQ29tcHNbMF0uVHlwZWRUZXh0KTsKKyAgRVhQRUNUX0VRKCJiaW5kIiwgQ29tcHNbMF0uTWF0Y2hlckRlY2wpOworfQorCiB9ICAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQogfSAgLy8gZW5kIG5hbWVzcGFjZSBkeW5hbWljCiB9ICAvLyBlbmQgbmFtZXNwYWNlIGFzdF9tYXRjaGVycwpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL0FTVE1hdGNoZXJzL0R5bmFtaWMvUmVnaXN0cnlUZXN0LmNwcCBiL3VuaXR0ZXN0cy9BU1RNYXRjaGVycy9EeW5hbWljL1JlZ2lzdHJ5VGVzdC5jcHAKaW5kZXggZTcxNjQ4NC4uMTUwZjhjOSAxMDA2NDQKLS0tIGEvdW5pdHRlc3RzL0FTVE1hdGNoZXJzL0R5bmFtaWMvUmVnaXN0cnlUZXN0LmNwcAorKysgYi91bml0dGVzdHMvQVNUTWF0Y2hlcnMvRHluYW1pYy9SZWdpc3RyeVRlc3QuY3BwCkBAIC03LDExICs3LDEwIEBACiAvLwogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCiAKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KICNpbmNsdWRlICIuLi9BU1RNYXRjaGVyc1Rlc3QuaCIKICNpbmNsdWRlICJjbGFuZy9BU1RNYXRjaGVycy9EeW5hbWljL1JlZ2lzdHJ5LmgiCiAjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBjbGFuZyB7CiBuYW1lc3BhY2UgYXN0X21hdGNoZXJzIHsKQEAgLTM2LDEyICszNSwyNCBAQAogICAgIHJldHVybiBPdXQ7CiAgIH0KIAorICBsbHZtOjpPcHRpb25hbDxNYXRjaGVyQ3Rvcj4gbG9va3VwTWF0Y2hlckN0b3IoU3RyaW5nUmVmIE1hdGNoZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY3MgKkVycm9yID0gMCkgeworICAgIERpYWdub3N0aWNzIER1bW15RXJyb3I7CisgICAgaWYgKCFFcnJvcikgRXJyb3IgPSAmRHVtbXlFcnJvcjsKKyAgICBsbHZtOjpPcHRpb25hbDxNYXRjaGVyQ3Rvcj4gQ3RvciA9CisgICAgICAgIFJlZ2lzdHJ5Ojpsb29rdXBNYXRjaGVyQ3RvcihNYXRjaGVyTmFtZSwgU291cmNlUmFuZ2UoKSwgRXJyb3IpOworICAgIEVYUEVDVF9FUSgiIiwgRHVtbXlFcnJvci50b1N0cmluZ0Z1bGwoKSk7CisgICAgcmV0dXJuIEN0b3I7CisgIH0KKwogICBWYXJpYW50TWF0Y2hlciBjb25zdHJ1Y3RNYXRjaGVyKFN0cmluZ1JlZiBNYXRjaGVyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IgPSBOVUxMKSB7CiAgICAgRGlhZ25vc3RpY3MgRHVtbXlFcnJvcjsKICAgICBpZiAoIUVycm9yKSBFcnJvciA9ICZEdW1teUVycm9yOwotICAgIGNvbnN0IFZhcmlhbnRNYXRjaGVyIE91dCA9Ci0gICAgICAgIFJlZ2lzdHJ5Ojpjb25zdHJ1Y3RNYXRjaGVyKE1hdGNoZXJOYW1lLCBTb3VyY2VSYW5nZSgpLCBBcmdzKCksIEVycm9yKTsKKyAgICBsbHZtOjpPcHRpb25hbDxNYXRjaGVyQ3Rvcj4gQ3RvciA9IGxvb2t1cE1hdGNoZXJDdG9yKE1hdGNoZXJOYW1lLCBFcnJvcik7CisgICAgVmFyaWFudE1hdGNoZXIgT3V0OworICAgIGlmIChDdG9yKQorICAgICAgT3V0ID0gUmVnaXN0cnk6OmNvbnN0cnVjdE1hdGNoZXIoKkN0b3IsIFNvdXJjZVJhbmdlKCksIEFyZ3MoKSwgRXJyb3IpOwogICAgIEVYUEVDVF9FUSgiIiwgRHVtbXlFcnJvci50b1N0cmluZ0Z1bGwoKSk7CiAgICAgcmV0dXJuIE91dDsKICAgfQpAQCAtNTEsOSArNjIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljcyAqRXJyb3IgPSBOVUxMKSB7CiAgICAgRGlhZ25vc3RpY3MgRHVtbXlFcnJvcjsKICAgICBpZiAoIUVycm9yKSBFcnJvciA9ICZEdW1teUVycm9yOwotICAgIGNvbnN0IFZhcmlhbnRNYXRjaGVyIE91dCA9IFJlZ2lzdHJ5Ojpjb25zdHJ1Y3RNYXRjaGVyKAotICAgICAgICBNYXRjaGVyTmFtZSwgU291cmNlUmFuZ2UoKSwgQXJncyhBcmcxKSwgRXJyb3IpOwotICAgIEVYUEVDVF9FUSgiIiwgRHVtbXlFcnJvci50b1N0cmluZ0Z1bGwoKSk7CisgICAgbGx2bTo6T3B0aW9uYWw8TWF0Y2hlckN0b3I+IEN0b3IgPSBsb29rdXBNYXRjaGVyQ3RvcihNYXRjaGVyTmFtZSwgRXJyb3IpOworICAgIFZhcmlhbnRNYXRjaGVyIE91dDsKKyAgICBpZiAoQ3RvcikKKyAgICAgIE91dCA9IFJlZ2lzdHJ5Ojpjb25zdHJ1Y3RNYXRjaGVyKCpDdG9yLCBTb3VyY2VSYW5nZSgpLCBBcmdzKEFyZzEpLCBFcnJvcik7CisgICAgRVhQRUNUX0VRKCIiLCBEdW1teUVycm9yLnRvU3RyaW5nRnVsbCgpKSA8PCBNYXRjaGVyTmFtZTsKICAgICByZXR1cm4gT3V0OwogICB9CiAKQEAgLTYzLDExICs3Niw1OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNzICpFcnJvciA9IE5VTEwpIHsKICAgICBEaWFnbm9zdGljcyBEdW1teUVycm9yOwogICAgIGlmICghRXJyb3IpIEVycm9yID0gJkR1bW15RXJyb3I7Ci0gICAgY29uc3QgVmFyaWFudE1hdGNoZXIgT3V0ID0gUmVnaXN0cnk6OmNvbnN0cnVjdE1hdGNoZXIoCi0gICAgICAgIE1hdGNoZXJOYW1lLCBTb3VyY2VSYW5nZSgpLCBBcmdzKEFyZzEsIEFyZzIpLCBFcnJvcik7CisgICAgbGx2bTo6T3B0aW9uYWw8TWF0Y2hlckN0b3I+IEN0b3IgPSBsb29rdXBNYXRjaGVyQ3RvcihNYXRjaGVyTmFtZSwgRXJyb3IpOworICAgIFZhcmlhbnRNYXRjaGVyIE91dDsKKyAgICBpZiAoQ3RvcikKKyAgICAgIE91dCA9IFJlZ2lzdHJ5Ojpjb25zdHJ1Y3RNYXRjaGVyKCpDdG9yLCBTb3VyY2VSYW5nZSgpLCBBcmdzKEFyZzEsIEFyZzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IpOwogICAgIEVYUEVDVF9FUSgiIiwgRHVtbXlFcnJvci50b1N0cmluZ0Z1bGwoKSk7CiAgICAgcmV0dXJuIE91dDsKICAgfQorCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8TWF0Y2hlckNvbXBsZXRpb24+IENvbXBWZWN0b3I7CisKKyAgQ29tcFZlY3RvciBnZXRDb21wbGV0aW9ucygpIHsKKyAgICByZXR1cm4gUmVnaXN0cnk6OmdldENvbXBsZXRpb25zKAorICAgICAgICBsbHZtOjpBcnJheVJlZjxzdGQ6OnBhaXI8TWF0Y2hlckN0b3IsIHVuc2lnbmVkPiA+KCkpOworICB9CisKKyAgQ29tcFZlY3RvciBnZXRDb21wbGV0aW9ucyhTdHJpbmdSZWYgTWF0Y2hlck5hbWUxLCB1bnNpZ25lZCBBcmdObzEpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8TWF0Y2hlckN0b3IsIHVuc2lnbmVkPiA+IENvbnRleHQ7CisgICAgbGx2bTo6T3B0aW9uYWw8TWF0Y2hlckN0b3I+IEN0b3IgPSBsb29rdXBNYXRjaGVyQ3RvcihNYXRjaGVyTmFtZTEpOworICAgIGlmICghQ3RvcikKKyAgICAgIHJldHVybiBDb21wVmVjdG9yKCk7CisgICAgQ29udGV4dC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoKkN0b3IsIEFyZ05vMSkpOworICAgIHJldHVybiBSZWdpc3RyeTo6Z2V0Q29tcGxldGlvbnMoQ29udGV4dCk7CisgIH0KKworICBDb21wVmVjdG9yIGdldENvbXBsZXRpb25zKFN0cmluZ1JlZiBNYXRjaGVyTmFtZTEsIHVuc2lnbmVkIEFyZ05vMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTWF0Y2hlck5hbWUyLCB1bnNpZ25lZCBBcmdObzIpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8TWF0Y2hlckN0b3IsIHVuc2lnbmVkPiA+IENvbnRleHQ7CisgICAgbGx2bTo6T3B0aW9uYWw8TWF0Y2hlckN0b3I+IEN0b3IgPSBsb29rdXBNYXRjaGVyQ3RvcihNYXRjaGVyTmFtZTEpOworICAgIGlmICghQ3RvcikKKyAgICAgIHJldHVybiBDb21wVmVjdG9yKCk7CisgICAgQ29udGV4dC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoKkN0b3IsIEFyZ05vMSkpOworICAgIEN0b3IgPSBsb29rdXBNYXRjaGVyQ3RvcihNYXRjaGVyTmFtZTIpOworICAgIGlmICghQ3RvcikKKyAgICAgIHJldHVybiBDb21wVmVjdG9yKCk7CisgICAgQ29udGV4dC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoKkN0b3IsIEFyZ05vMikpOworICAgIHJldHVybiBSZWdpc3RyeTo6Z2V0Q29tcGxldGlvbnMoQ29udGV4dCk7CisgIH0KKworICBib29sIGhhc0NvbXBsZXRpb24oY29uc3QgQ29tcFZlY3RvciAmQ29tcHMsIFN0cmluZ1JlZiBUeXBlZFRleHQsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTWF0Y2hlckRlY2wgPSBTdHJpbmdSZWYoKSwgdW5zaWduZWQgKkluZGV4ID0gMCkgeworICAgIGZvciAoQ29tcFZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgSSA9IENvbXBzLmJlZ2luKCksIEUgPSBDb21wcy5lbmQoKTsgSSAhPSBFOworICAgICAgICAgKytJKSB7CisgICAgICBpZiAoSS0+VHlwZWRUZXh0ID09IFR5cGVkVGV4dCAmJgorICAgICAgICAgIChNYXRjaGVyRGVjbC5lbXB0eSgpIHx8IEktPk1hdGNoZXJEZWNsID09IE1hdGNoZXJEZWNsKSkgeworICAgICAgICBpZiAoSW5kZXgpCisgICAgICAgICAgKkluZGV4ID0gSSAtIENvbXBzLmJlZ2luKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KIH07CiAKIFRFU1RfRihSZWdpc3RyeVRlc3QsIENhbkNvbnN0cnVjdE5vQXJncykgewpAQCAtMTUxLDYgKzIxMSwyNSBAQAogICBDb2RlID0gImNsYXNzIFogeyBwdWJsaWM6IHZvaWQgeigpIHsgdGhpcy0+eigpOyB9IH07IjsKICAgRVhQRUNUX1RSVUUobWF0Y2hlcyhDb2RlLCBDYWxsRXhwcjApKTsKICAgRVhQRUNUX0ZBTFNFKG1hdGNoZXMoQ29kZSwgQ2FsbEV4cHIxKSk7CisKKyAgTWF0Y2hlcjxEZWNsPiBEZWNsRGVjbCA9IGRlY2xhcmF0b3JEZWNsKGhhc1R5cGVMb2MoCisgICAgICBjb25zdHJ1Y3RNYXRjaGVyKAorICAgICAgICAgICJsb2MiLCBjb25zdHJ1Y3RNYXRjaGVyKCJhc1N0cmluZyIsIHN0ZDo6c3RyaW5nKCJjb25zdCBkb3VibGUgKiIpKSkKKyAgICAgICAgICAuZ2V0VHlwZWRNYXRjaGVyPFR5cGVMb2M+KCkpKTsKKworICBNYXRjaGVyPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+IE5OU0wgPQorICAgICAgY29uc3RydWN0TWF0Y2hlcigKKyAgICAgICAgICAibG9jIiwgVmFyaWFudE1hdGNoZXI6OlNpbmdsZU1hdGNoZXIobmVzdGVkTmFtZVNwZWNpZmllcigKKyAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllc1R5cGUoaGFzRGVjbGFyYXRpb24ocmVjb3JkRGVjbChoYXNOYW1lKCJBIikpKSkpKSkKKyAgICAgICAgICAuZ2V0VHlwZWRNYXRjaGVyPE5lc3RlZE5hbWVTcGVjaWZpZXJMb2M+KCk7CisKKyAgQ29kZSA9ICJjb25zdCBkb3VibGUgKiB4ID0gMDsiOworICBFWFBFQ1RfVFJVRShtYXRjaGVzKENvZGUsIERlY2xEZWNsKSk7CisgIEVYUEVDVF9GQUxTRShtYXRjaGVzKENvZGUsIE5OU0wpKTsKKworICBDb2RlID0gInN0cnVjdCBBIHsgc3RydWN0IEIge307IH07IEE6OkIgYV9iOyI7CisgIEVYUEVDVF9GQUxTRShtYXRjaGVzKENvZGUsIERlY2xEZWNsKSk7CisgIEVYUEVDVF9UUlVFKG1hdGNoZXMoQ29kZSwgTk5TTCkpOwogfQogCiBURVNUX0YoUmVnaXN0cnlUZXN0LCBQb2x5bW9ycGhpY01hdGNoZXJzKSB7CkBAIC0yOTUsMTEgKzM3NCwyMiBAQAogICBFWFBFQ1RfRkFMU0UobWF0Y2hlcygiaW50IGkgPSAwOyIsIEQpKTsKICAgRVhQRUNUX1RSVUUobWF0Y2hlcygiY2xhc3MgQmFye307IiwgRCkpOwogICBFWFBFQ1RfRkFMU0UobWF0Y2hlcygiY2xhc3MgT3RoZXJCYXJ7fTsiLCBEKSk7CisKKyAgRCA9IHJlY29yZERlY2woCisgICAgICBoYXMoZmllbGREZWNsKGhhc05hbWUoIkZvbyIpKSksCisgICAgICBjb25zdHJ1Y3RNYXRjaGVyKAorICAgICAgICAgICJ1bmxlc3MiLAorICAgICAgICAgIGNvbnN0cnVjdE1hdGNoZXIoIm5hbWVkRGVjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RNYXRjaGVyKCJoYXNOYW1lIiwgc3RkOjpzdHJpbmcoIkJhciIpKSkpCisgICAgICAgICAgLmdldFR5cGVkTWF0Y2hlcjxEZWNsPigpKTsKKworICBFWFBFQ1RfRkFMU0UobWF0Y2hlcygiY2xhc3MgQmFyeyBpbnQgRm9vOyB9OyIsIEQpKTsKKyAgRVhQRUNUX1RSVUUobWF0Y2hlcygiY2xhc3MgT3RoZXJCYXJ7IGludCBGb287IH07IiwgRCkpOwogfQogCiBURVNUX0YoUmVnaXN0cnlUZXN0LCBFcnJvcnMpIHsKICAgLy8gSW5jb3JyZWN0IGFyZ3VtZW50IGNvdW50LgotICBPd25pbmdQdHI8RGlhZ25vc3RpY3M+IEVycm9yKG5ldyBEaWFnbm9zdGljcygpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNzPiBFcnJvcihuZXcgRGlhZ25vc3RpY3MoKSk7CiAgIEVYUEVDVF9UUlVFKGNvbnN0cnVjdE1hdGNoZXIoImhhc0luaXRpYWxpemVyIiwgRXJyb3IuZ2V0KCkpLmlzTnVsbCgpKTsKICAgRVhQRUNUX0VRKCJJbmNvcnJlY3QgYXJndW1lbnQgY291bnQuIChFeHBlY3RlZCA9IDEpICE9IChBY3R1YWwgPSAwKSIsCiAgICAgICAgICAgICBFcnJvci0+dG9TdHJpbmcoKSk7CkBAIC0zMDcsNiArMzk3LDE1IEBACiAgIEVYUEVDVF9UUlVFKGNvbnN0cnVjdE1hdGNoZXIoImlzQXJyb3ciLCBzdGQ6OnN0cmluZygpLCBFcnJvci5nZXQoKSkuaXNOdWxsKCkpOwogICBFWFBFQ1RfRVEoIkluY29ycmVjdCBhcmd1bWVudCBjb3VudC4gKEV4cGVjdGVkID0gMCkgIT0gKEFjdHVhbCA9IDEpIiwKICAgICAgICAgICAgIEVycm9yLT50b1N0cmluZygpKTsKKyAgRXJyb3IucmVzZXQobmV3IERpYWdub3N0aWNzKCkpOworICBFWFBFQ1RfVFJVRShjb25zdHJ1Y3RNYXRjaGVyKCJhbnlPZiIsIEVycm9yLmdldCgpKS5pc051bGwoKSk7CisgIEVYUEVDVF9FUSgiSW5jb3JyZWN0IGFyZ3VtZW50IGNvdW50LiAoRXhwZWN0ZWQgPSAoMiwgKSkgIT0gKEFjdHVhbCA9IDApIiwKKyAgICAgICAgICAgIEVycm9yLT50b1N0cmluZygpKTsKKyAgRXJyb3IucmVzZXQobmV3IERpYWdub3N0aWNzKCkpOworICBFWFBFQ1RfVFJVRShjb25zdHJ1Y3RNYXRjaGVyKCJ1bmxlc3MiLCBzdGQ6OnN0cmluZygpLCBzdGQ6OnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yLmdldCgpKS5pc051bGwoKSk7CisgIEVYUEVDVF9FUSgiSW5jb3JyZWN0IGFyZ3VtZW50IGNvdW50LiAoRXhwZWN0ZWQgPSAoMSwgMSkpICE9IChBY3R1YWwgPSAyKSIsCisgICAgICAgICAgICBFcnJvci0+dG9TdHJpbmcoKSk7CiAKICAgLy8gQmFkIGFyZ3VtZW50IHR5cGUKICAgRXJyb3IucmVzZXQobmV3IERpYWdub3N0aWNzKCkpOwpAQCAtMzI0LDcgKzQyMyw4IEBACiAKICAgLy8gQmFkIGFyZ3VtZW50IHR5cGUgd2l0aCB2YXJpYWRpYy4KICAgRXJyb3IucmVzZXQobmV3IERpYWdub3N0aWNzKCkpOwotICBFWFBFQ1RfVFJVRShjb25zdHJ1Y3RNYXRjaGVyKCJhbnlPZiIsIHN0ZDo6c3RyaW5nKCksIEVycm9yLmdldCgpKS5pc051bGwoKSk7CisgIEVYUEVDVF9UUlVFKGNvbnN0cnVjdE1hdGNoZXIoImFueU9mIiwgc3RkOjpzdHJpbmcoKSwgc3RkOjpzdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvci5nZXQoKSkuaXNOdWxsKCkpOwogICBFWFBFQ1RfRVEoCiAgICAgICAiSW5jb3JyZWN0IHR5cGUgZm9yIGFyZyAxLiAoRXhwZWN0ZWQgPSBNYXRjaGVyPD4pICE9IChBY3R1YWwgPSBTdHJpbmcpIiwKICAgICAgIEVycm9yLT50b1N0cmluZygpKTsKQEAgLTM0MSw2ICs0NDEsNDcgQEAKICAgICAgICAgICAgIEVycm9yLT50b1N0cmluZygpKTsKIH0KIAorVEVTVF9GKFJlZ2lzdHJ5VGVzdCwgQ29tcGxldGlvbikgeworICBDb21wVmVjdG9yIENvbXBzID0gZ2V0Q29tcGxldGlvbnMoKTsKKyAgRVhQRUNUX1RSVUUoaGFzQ29tcGxldGlvbigKKyAgICAgIENvbXBzLCAiaGFzUGFyZW50KCIsICJNYXRjaGVyPERlY2x8U3RtdD4gaGFzUGFyZW50KE1hdGNoZXI8RGVjbHxTdG10PikiKSk7CisgIEVYUEVDVF9UUlVFKGhhc0NvbXBsZXRpb24oQ29tcHMsICJ3aGlsZVN0bXQoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF0Y2hlcjxTdG10PiB3aGlsZVN0bXQoTWF0Y2hlcjxXaGlsZVN0bXQ+Li4uKSIpKTsKKworICBDb21wVmVjdG9yIFdoaWxlQ29tcHMgPSBnZXRDb21wbGV0aW9ucygid2hpbGVTdG10IiwgMCk7CisKKyAgdW5zaWduZWQgSGFzQm9keUluZGV4LCBIYXNQYXJlbnRJbmRleCwgQWxsT2ZJbmRleDsKKyAgRVhQRUNUX1RSVUUoaGFzQ29tcGxldGlvbihXaGlsZUNvbXBzLCAiaGFzQm9keSgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXRjaGVyPFdoaWxlU3RtdD4gaGFzQm9keShNYXRjaGVyPFN0bXQ+KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkhhc0JvZHlJbmRleCkpOworICBFWFBFQ1RfVFJVRShoYXNDb21wbGV0aW9uKFdoaWxlQ29tcHMsICJoYXNQYXJlbnQoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF0Y2hlcjxTdG10PiBoYXNQYXJlbnQoTWF0Y2hlcjxEZWNsfFN0bXQ+KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkhhc1BhcmVudEluZGV4KSk7CisgIEVYUEVDVF9UUlVFKGhhc0NvbXBsZXRpb24oV2hpbGVDb21wcywgImFsbE9mKCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hdGNoZXI8VD4gYWxsT2YoTWF0Y2hlcjxUPi4uLikiLCAmQWxsT2ZJbmRleCkpOworICBFWFBFQ1RfR1QoSGFzUGFyZW50SW5kZXgsIEhhc0JvZHlJbmRleCk7CisgIEVYUEVDVF9HVChBbGxPZkluZGV4LCBIYXNQYXJlbnRJbmRleCk7CisKKyAgRVhQRUNUX0ZBTFNFKGhhc0NvbXBsZXRpb24oV2hpbGVDb21wcywgIndoaWxlU3RtdCgiKSk7CisgIEVYUEVDVF9GQUxTRShoYXNDb21wbGV0aW9uKFdoaWxlQ29tcHMsICJpZlN0bXQoIikpOworCisgIENvbXBWZWN0b3IgQWxsT2ZXaGlsZUNvbXBzID0KKyAgICAgIGdldENvbXBsZXRpb25zKCJhbGxPZiIsIDAsICJ3aGlsZVN0bXQiLCAwKTsKKyAgQVNTRVJUX0VRKEFsbE9mV2hpbGVDb21wcy5zaXplKCksIFdoaWxlQ29tcHMuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUoc3RkOjplcXVhbChXaGlsZUNvbXBzLmJlZ2luKCksIFdoaWxlQ29tcHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxsT2ZXaGlsZUNvbXBzLmJlZ2luKCkpKTsKKworICBDb21wVmVjdG9yIERlY2xXaGlsZUNvbXBzID0KKyAgICAgIGdldENvbXBsZXRpb25zKCJkZWNsIiwgMCwgIndoaWxlU3RtdCIsIDApOworICBFWFBFQ1RfRVEoMHUsIERlY2xXaGlsZUNvbXBzLnNpemUoKSk7CisKKyAgQ29tcFZlY3RvciBOYW1lZERlY2xDb21wcyA9IGdldENvbXBsZXRpb25zKCJuYW1lZERlY2wiLCAwKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBoYXNDb21wbGV0aW9uKE5hbWVkRGVjbENvbXBzLCAiaXNQdWJsaWMoKSIsICJNYXRjaGVyPERlY2w+IGlzUHVibGljKCkiKSk7CisgIEVYUEVDVF9UUlVFKGhhc0NvbXBsZXRpb24oTmFtZWREZWNsQ29tcHMsICJoYXNOYW1lKFwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF0Y2hlcjxOYW1lZERlY2w+IGhhc05hbWUoc3RyaW5nKSIpKTsKK30KKwogfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQogfSAvLyBlbmQgbmFtZXNwYWNlIGR5bmFtaWMKIH0gLy8gZW5kIG5hbWVzcGFjZSBhc3RfbWF0Y2hlcnMKZGlmZiAtLWdpdCBhL3VuaXR0ZXN0cy9BU1RNYXRjaGVycy9EeW5hbWljL1ZhcmlhbnRWYWx1ZVRlc3QuY3BwIGIvdW5pdHRlc3RzL0FTVE1hdGNoZXJzL0R5bmFtaWMvVmFyaWFudFZhbHVlVGVzdC5jcHAKaW5kZXggZDJiOGE1OC4uZTYyYTQ2NCAxMDA2NDQKLS0tIGEvdW5pdHRlc3RzL0FTVE1hdGNoZXJzL0R5bmFtaWMvVmFyaWFudFZhbHVlVGVzdC5jcHAKKysrIGIvdW5pdHRlc3RzL0FTVE1hdGNoZXJzL0R5bmFtaWMvVmFyaWFudFZhbHVlVGVzdC5jcHAKQEAgLTExNyw3ICsxMTcsNyBAQAogICBFWFBFQ1RfRkFMU0UoVmFyaWFudFZhbHVlKFZhcmlhbnRNYXRjaGVyOjpTaW5nbGVNYXRjaGVyKHZhckRlY2woKSkpCiAgICAgICAgICAgICAgICAgICAgLmdldE1hdGNoZXIoKQogICAgICAgICAgICAgICAgICAgIC5oYXNUeXBlZE1hdGNoZXI8U3RtdD4oKSk7Ci0jaWYgIWRlZmluZWQoTkRFQlVHKSAmJiBHVEVTVF9IQVNfREVBVEhfVEVTVCAmJiAhZGVmaW5lZChfTVNDX1ZFUikKKyNpZiAhZGVmaW5lZChOREVCVUcpICYmIEdURVNUX0hBU19ERUFUSF9URVNUCiAgIC8vIFRyeWluZyB0byBnZXQgdGhlIHdyb25nIG1hdGNoZXIgZmFpbHMgYW4gYXNzZXJ0aW9uIGluIE1hdGNoZXI8VD4uICBXZSBkb24ndAogICAvLyBkbyB0aGlzIHRlc3Qgd2hlbiBidWlsZGluZyB3aXRoIE1TVkMgYmVjYXVzZSBpdHMgZGVidWcgQyBydW50aW1lIHByaW50cyB0aGUKICAgLy8gYXNzZXJ0aW9uIGZhaWx1cmUgbWVzc2FnZSBhcyBhIHdpZGUgc3RyaW5nLCB3aGljaCBndGVzdCBkb2Vzbid0IHVuZGVyc3RhbmQuCmRpZmYgLS1naXQgYS91bml0dGVzdHMvQmFzaWMvQ01ha2VMaXN0cy50eHQgYi91bml0dGVzdHMvQmFzaWMvQ01ha2VMaXN0cy50eHQKaW5kZXggNTFkYjZjZS4uYjhmNjliZiAxMDA2NDQKLS0tIGEvdW5pdHRlc3RzL0Jhc2ljL0NNYWtlTGlzdHMudHh0CisrKyBiL3VuaXR0ZXN0cy9CYXNpYy9DTWFrZUxpc3RzLnR4dApAQCAtMSw3ICsxLDEyIEBACitzZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMKKyAgU3VwcG9ydAorICApCisKIGFkZF9jbGFuZ191bml0dGVzdChCYXNpY1Rlc3RzCiAgIENoYXJJbmZvVGVzdC5jcHAKICAgRmlsZU1hbmFnZXJUZXN0LmNwcAogICBTb3VyY2VNYW5hZ2VyVGVzdC5jcHAKKyAgVmlydHVhbEZpbGVTeXN0ZW1UZXN0LmNwcAogICApCiAKIHRhcmdldF9saW5rX2xpYnJhcmllcyhCYXNpY1Rlc3RzCmRpZmYgLS1naXQgYS91bml0dGVzdHMvQmFzaWMvRmlsZU1hbmFnZXJUZXN0LmNwcCBiL3VuaXR0ZXN0cy9CYXNpYy9GaWxlTWFuYWdlclRlc3QuY3BwCmluZGV4IGY4Y2U1MGQuLjlkZjg1MzIgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9CYXNpYy9GaWxlTWFuYWdlclRlc3QuY3BwCisrKyBiL3VuaXR0ZXN0cy9CYXNpYy9GaWxlTWFuYWdlclRlc3QuY3BwCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSAiY2xhbmcvQmFzaWMvRmlsZVN5c3RlbU9wdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9GaWxlU3lzdGVtU3RhdENhY2hlLmgiCiAjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9jb25maWcuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGxsdm07CiB1c2luZyBuYW1lc3BhY2UgY2xhbmc7CkBAIC0yOCwxMCArMjksMTMgQEAKIAogICB2b2lkIEluamVjdEZpbGVPckRpcmVjdG9yeShjb25zdCBjaGFyICpQYXRoLCBpbm9fdCBJTm9kZSwgYm9vbCBJc0ZpbGUpIHsKICAgICBGaWxlRGF0YSBEYXRhOwotICAgIG1lbXNldCgmRGF0YSwgMCwgc2l6ZW9mKEZpbGVEYXRhKSk7Ci0gICAgbGx2bTo6c3lzOjpmczo6VW5pcXVlSUQgSUQoMSwgSU5vZGUpOwotICAgIERhdGEuVW5pcXVlSUQgPSBJRDsKKyAgICBEYXRhLk5hbWUgPSBQYXRoOworICAgIERhdGEuU2l6ZSA9IDA7CisgICAgRGF0YS5Nb2RUaW1lID0gMDsKKyAgICBEYXRhLlVuaXF1ZUlEID0gbGx2bTo6c3lzOjpmczo6VW5pcXVlSUQoMSwgSU5vZGUpOwogICAgIERhdGEuSXNEaXJlY3RvcnkgPSAhSXNGaWxlOworICAgIERhdGEuSXNOYW1lZFBpcGUgPSBmYWxzZTsKKyAgICBEYXRhLkluUENIID0gZmFsc2U7CiAgICAgU3RhdENhbGxzW1BhdGhdID0gRGF0YTsKICAgfQogCkBAIC00OCw3ICs1Miw3IEBACiAKICAgLy8gSW1wbGVtZW50IEZpbGVTeXN0ZW1TdGF0Q2FjaGU6OmdldFN0YXQoKS4KICAgdmlydHVhbCBMb29rdXBSZXN1bHQgZ2V0U3RhdChjb25zdCBjaGFyICpQYXRoLCBGaWxlRGF0YSAmRGF0YSwgYm9vbCBpc0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpGaWxlRGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZmczo6RmlsZSAqKkYsIHZmczo6RmlsZVN5c3RlbSAmRlMpIHsKICAgICBpZiAoU3RhdENhbGxzLmNvdW50KFBhdGgpICE9IDApIHsKICAgICAgIERhdGEgPSBTdGF0Q2FsbHNbUGF0aF07CiAgICAgICByZXR1cm4gQ2FjaGVFeGlzdHM7CkBAIC0xMjMsNyArMTI3LDcgQEAKICAgc3RhdENhY2hlLT5JbmplY3REaXJlY3RvcnkoIi90bXAiLCA0Mik7CiAgIHN0YXRDYWNoZS0+SW5qZWN0RmlsZSgiL3RtcC90ZXN0IiwgNDMpOwogCi0jaWZkZWYgX1dJTjMyCisjaWZkZWYgTExWTV9PTl9XSU4zMgogICBjb25zdCBjaGFyICpEaXJOYW1lID0gIkM6LiI7CiAgIGNvbnN0IGNoYXIgKkZpbGVOYW1lID0gIkM6dGVzdCI7CiAgIHN0YXRDYWNoZS0+SW5qZWN0RGlyZWN0b3J5KERpck5hbWUsIDQ0KTsKQEAgLTE0MCw3ICsxNDQsNyBAQAogICBBU1NFUlRfVFJVRShkaXIgIT0gTlVMTCk7CiAgIEVYUEVDVF9TVFJFUSgiL3RtcCIsIGRpci0+Z2V0TmFtZSgpKTsKIAotI2lmZGVmIF9XSU4zMgorI2lmZGVmIExMVk1fT05fV0lOMzIKICAgZmlsZSA9IG1hbmFnZXIuZ2V0RmlsZShGaWxlTmFtZSk7CiAgIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7CiAKQEAgLTIwMSw3ICsyMDUsNyBAQAogCiAvLyBUaGUgZm9sbG93aW5nIHRlc3RzIGFwcGx5IHRvIFVuaXgtbGlrZSBzeXN0ZW0gb25seS4KIAotI2lmbmRlZiBfV0lOMzIKKyNpZm5kZWYgTExWTV9PTl9XSU4zMgogCiAvLyBnZXRGaWxlKCkgcmV0dXJucyB0aGUgc2FtZSBGaWxlRW50cnkgZm9yIHJlYWwgZmlsZXMgdGhhdCBhcmUgYWxpYXNlcy4KIFRFU1RfRihGaWxlTWFuYWdlclRlc3QsIGdldEZpbGVSZXR1cm5zU2FtZUZpbGVFbnRyeUZvckFsaWFzZWRSZWFsRmlsZXMpIHsKQEAgLTIzMSw2ICsyMzUsNiBAQAogICBFWFBFQ1RfRVEobWFuYWdlci5nZXRGaWxlKCJhYmMvZm9vLmNwcCIpLCBtYW5hZ2VyLmdldEZpbGUoImFiYy9iYXIuY3BwIikpOwogfQogCi0jZW5kaWYgIC8vICFfV0lOMzIKKyNlbmRpZiAgLy8gIUxMVk1fT05fV0lOMzIKIAogfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCmRpZmYgLS1naXQgYS91bml0dGVzdHMvQmFzaWMvVmlydHVhbEZpbGVTeXN0ZW1UZXN0LmNwcCBiL3VuaXR0ZXN0cy9CYXNpYy9WaXJ0dWFsRmlsZVN5c3RlbVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZDJmMTYKLS0tIC9kZXYvbnVsbAorKysgYi91bml0dGVzdHMvQmFzaWMvVmlydHVhbEZpbGVTeXN0ZW1UZXN0LmNwcApAQCAtMCwwICsxLDU4MiBAQAorLy89PT0tIHVuaXR0ZXN0cy9CYXNpYy9WaXJ0dWFsRmlsZVN5c3RlbS5jcHAgLS0tLS0tLS0tLS0tLS0tLSBWRlMgdGVzdHMgLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImNsYW5nL0Jhc2ljL1ZpcnR1YWxGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QYXRoLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSA8bWFwPgordXNpbmcgbmFtZXNwYWNlIGNsYW5nOwordXNpbmcgbmFtZXNwYWNlIGxsdm07Cit1c2luZyBsbHZtOjpzeXM6OmZzOjpVbmlxdWVJRDsKKworbmFtZXNwYWNlIHsKK2NsYXNzIER1bW15RmlsZVN5c3RlbSA6IHB1YmxpYyB2ZnM6OkZpbGVTeXN0ZW0geworICBpbnQgRlNJRDsgICAvLyB1c2VkIHRvIHByb2R1Y2UgVW5pcXVlSURzCisgIGludCBGaWxlSUQ7IC8vIHVzZWQgdG8gcHJvZHVjZSBVbmlxdWVJRHMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHZmczo6U3RhdHVzPiBGaWxlc0FuZERpcnM7CisKKyAgc3RhdGljIGludCBnZXROZXh0RlNJRCgpIHsKKyAgICBzdGF0aWMgaW50IENvdW50ID0gMDsKKyAgICByZXR1cm4gQ291bnQrKzsKKyAgfQorCitwdWJsaWM6CisgIER1bW15RmlsZVN5c3RlbSgpIDogRlNJRChnZXROZXh0RlNJRCgpKSwgRmlsZUlEKDApIHt9CisKKyAgRXJyb3JPcjx2ZnM6OlN0YXR1cz4gc3RhdHVzKGNvbnN0IFR3aW5lICZQYXRoKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHZmczo6U3RhdHVzPjo6aXRlcmF0b3IgSSA9CisgICAgICAgIEZpbGVzQW5kRGlycy5maW5kKFBhdGguc3RyKCkpOworICAgIGlmIChJID09IEZpbGVzQW5kRGlycy5lbmQoKSkKKyAgICAgIHJldHVybiBlcnJvcl9jb2RlKGVycmM6Om5vX3N1Y2hfZmlsZV9vcl9kaXJlY3RvcnksIHBvc2l4X2NhdGVnb3J5KCkpOworICAgIHJldHVybiBJLT5zZWNvbmQ7CisgIH0KKyAgZXJyb3JfY29kZSBvcGVuRmlsZUZvclJlYWQoY29uc3QgVHdpbmUgJlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx2ZnM6OkZpbGU+ICZSZXN1bHQpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmltcGxlbWVudGVkIik7CisgIH0KKyAgZXJyb3JfY29kZSBnZXRCdWZmZXJGb3JGaWxlKGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgRmlsZVNpemUgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVxdWlyZXNOdWxsVGVybWluYXRvciA9IHRydWUpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmltcGxlbWVudGVkIik7CisgIH0KKworICB2b2lkIGFkZEVudHJ5KFN0cmluZ1JlZiBQYXRoLCBjb25zdCB2ZnM6OlN0YXR1cyAmU3RhdHVzKSB7CisgICAgRmlsZXNBbmREaXJzW1BhdGhdID0gU3RhdHVzOworICB9CisKKyAgdm9pZCBhZGRSZWd1bGFyRmlsZShTdHJpbmdSZWYgUGF0aCwgc3lzOjpmczo6cGVybXMgUGVybXMgPSBzeXM6OmZzOjphbGxfYWxsKSB7CisgICAgdmZzOjpTdGF0dXMgUyhQYXRoLCBQYXRoLCBVbmlxdWVJRChGU0lELCBGaWxlSUQrKyksIHN5czo6VGltZVZhbHVlOjpub3coKSwKKyAgICAgICAgICAgICAgICAgIDAsIDAsIDEwMjQsIHN5czo6ZnM6OmZpbGVfdHlwZTo6cmVndWxhcl9maWxlLCBQZXJtcyk7CisgICAgYWRkRW50cnkoUGF0aCwgUyk7CisgIH0KKworICB2b2lkIGFkZERpcmVjdG9yeShTdHJpbmdSZWYgUGF0aCwgc3lzOjpmczo6cGVybXMgUGVybXMgPSBzeXM6OmZzOjphbGxfYWxsKSB7CisgICAgdmZzOjpTdGF0dXMgUyhQYXRoLCBQYXRoLCBVbmlxdWVJRChGU0lELCBGaWxlSUQrKyksIHN5czo6VGltZVZhbHVlOjpub3coKSwKKyAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIHN5czo6ZnM6OmZpbGVfdHlwZTo6ZGlyZWN0b3J5X2ZpbGUsIFBlcm1zKTsKKyAgICBhZGRFbnRyeShQYXRoLCBTKTsKKyAgfQorCisgIHZvaWQgYWRkU3ltbGluayhTdHJpbmdSZWYgUGF0aCkgeworICAgIHZmczo6U3RhdHVzIFMoUGF0aCwgUGF0aCwgVW5pcXVlSUQoRlNJRCwgRmlsZUlEKyspLCBzeXM6OlRpbWVWYWx1ZTo6bm93KCksCisgICAgICAgICAgICAgICAgICAwLCAwLCAwLCBzeXM6OmZzOjpmaWxlX3R5cGU6OnN5bWxpbmtfZmlsZSwgc3lzOjpmczo6YWxsX2FsbCk7CisgICAgYWRkRW50cnkoUGF0aCwgUyk7CisgIH0KK307Cit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK1RFU1QoVmlydHVhbEZpbGVTeXN0ZW1UZXN0LCBTdGF0dXNRdWVyaWVzKSB7CisgIEludHJ1c2l2ZVJlZkNudFB0cjxEdW1teUZpbGVTeXN0ZW0+IEQobmV3IER1bW15RmlsZVN5c3RlbSgpKTsKKyAgRXJyb3JPcjx2ZnM6OlN0YXR1cz4gU3RhdHVzKChlcnJvcl9jb2RlKCkpKTsKKworICBELT5hZGRSZWd1bGFyRmlsZSgiL2ZvbyIpOworICBTdGF0dXMgPSBELT5zdGF0dXMoIi9mb28iKTsKKyAgQVNTRVJUX0VRKGVycmM6OnN1Y2Nlc3MsIFN0YXR1cy5nZXRFcnJvcigpKTsKKyAgRVhQRUNUX1RSVUUoU3RhdHVzLT5pc1N0YXR1c0tub3duKCkpOworICBFWFBFQ1RfRkFMU0UoU3RhdHVzLT5pc0RpcmVjdG9yeSgpKTsKKyAgRVhQRUNUX1RSVUUoU3RhdHVzLT5pc1JlZ3VsYXJGaWxlKCkpOworICBFWFBFQ1RfRkFMU0UoU3RhdHVzLT5pc1N5bWxpbmsoKSk7CisgIEVYUEVDVF9GQUxTRShTdGF0dXMtPmlzT3RoZXIoKSk7CisgIEVYUEVDVF9UUlVFKFN0YXR1cy0+ZXhpc3RzKCkpOworCisgIEQtPmFkZERpcmVjdG9yeSgiL2JhciIpOworICBTdGF0dXMgPSBELT5zdGF0dXMoIi9iYXIiKTsKKyAgQVNTRVJUX0VRKGVycmM6OnN1Y2Nlc3MsIFN0YXR1cy5nZXRFcnJvcigpKTsKKyAgRVhQRUNUX1RSVUUoU3RhdHVzLT5pc1N0YXR1c0tub3duKCkpOworICBFWFBFQ1RfVFJVRShTdGF0dXMtPmlzRGlyZWN0b3J5KCkpOworICBFWFBFQ1RfRkFMU0UoU3RhdHVzLT5pc1JlZ3VsYXJGaWxlKCkpOworICBFWFBFQ1RfRkFMU0UoU3RhdHVzLT5pc1N5bWxpbmsoKSk7CisgIEVYUEVDVF9GQUxTRShTdGF0dXMtPmlzT3RoZXIoKSk7CisgIEVYUEVDVF9UUlVFKFN0YXR1cy0+ZXhpc3RzKCkpOworCisgIEQtPmFkZFN5bWxpbmsoIi9iYXoiKTsKKyAgU3RhdHVzID0gRC0+c3RhdHVzKCIvYmF6Iik7CisgIEFTU0VSVF9FUShlcnJjOjpzdWNjZXNzLCBTdGF0dXMuZ2V0RXJyb3IoKSk7CisgIEVYUEVDVF9UUlVFKFN0YXR1cy0+aXNTdGF0dXNLbm93bigpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0YXR1cy0+aXNEaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9GQUxTRShTdGF0dXMtPmlzUmVndWxhckZpbGUoKSk7CisgIEVYUEVDVF9UUlVFKFN0YXR1cy0+aXNTeW1saW5rKCkpOworICBFWFBFQ1RfRkFMU0UoU3RhdHVzLT5pc090aGVyKCkpOworICBFWFBFQ1RfVFJVRShTdGF0dXMtPmV4aXN0cygpKTsKKworICBFWFBFQ1RfVFJVRShTdGF0dXMtPmVxdWl2YWxlbnQoKlN0YXR1cykpOworICBFcnJvck9yPHZmczo6U3RhdHVzPiBTdGF0dXMyID0gRC0+c3RhdHVzKCIvZm9vIik7CisgIEFTU0VSVF9FUShlcnJjOjpzdWNjZXNzLCBTdGF0dXMyLmdldEVycm9yKCkpOworICBFWFBFQ1RfRkFMU0UoU3RhdHVzLT5lcXVpdmFsZW50KCpTdGF0dXMyKSk7Cit9CisKK1RFU1QoVmlydHVhbEZpbGVTeXN0ZW1UZXN0LCBCYXNlT25seU92ZXJsYXkpIHsKKyAgSW50cnVzaXZlUmVmQ250UHRyPER1bW15RmlsZVN5c3RlbT4gRChuZXcgRHVtbXlGaWxlU3lzdGVtKCkpOworICBFcnJvck9yPHZmczo6U3RhdHVzPiBTdGF0dXMoKGVycm9yX2NvZGUoKSkpOworICBFWFBFQ1RfRkFMU0UoU3RhdHVzID0gRC0+c3RhdHVzKCIvZm9vIikpOworCisgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6Ok92ZXJsYXlGaWxlU3lzdGVtPiBPKG5ldyB2ZnM6Ok92ZXJsYXlGaWxlU3lzdGVtKEQpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0YXR1cyA9IE8tPnN0YXR1cygiL2ZvbyIpKTsKKworICBELT5hZGRSZWd1bGFyRmlsZSgiL2ZvbyIpOworICBTdGF0dXMgPSBELT5zdGF0dXMoIi9mb28iKTsKKyAgRVhQRUNUX0VRKGVycmM6OnN1Y2Nlc3MsIFN0YXR1cy5nZXRFcnJvcigpKTsKKworICBFcnJvck9yPHZmczo6U3RhdHVzPiBTdGF0dXMyKChlcnJvcl9jb2RlKCkpKTsKKyAgU3RhdHVzMiA9IE8tPnN0YXR1cygiL2ZvbyIpOworICBFWFBFQ1RfRVEoZXJyYzo6c3VjY2VzcywgU3RhdHVzMi5nZXRFcnJvcigpKTsKKyAgRVhQRUNUX1RSVUUoU3RhdHVzLT5lcXVpdmFsZW50KCpTdGF0dXMyKSk7Cit9CisKK1RFU1QoVmlydHVhbEZpbGVTeXN0ZW1UZXN0LCBPdmVybGF5RmlsZXMpIHsKKyAgSW50cnVzaXZlUmVmQ250UHRyPER1bW15RmlsZVN5c3RlbT4gQmFzZShuZXcgRHVtbXlGaWxlU3lzdGVtKCkpOworICBJbnRydXNpdmVSZWZDbnRQdHI8RHVtbXlGaWxlU3lzdGVtPiBNaWRkbGUobmV3IER1bW15RmlsZVN5c3RlbSgpKTsKKyAgSW50cnVzaXZlUmVmQ250UHRyPER1bW15RmlsZVN5c3RlbT4gVG9wKG5ldyBEdW1teUZpbGVTeXN0ZW0oKSk7CisgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6Ok92ZXJsYXlGaWxlU3lzdGVtPiBPKAorICAgICAgbmV3IHZmczo6T3ZlcmxheUZpbGVTeXN0ZW0oQmFzZSkpOworICBPLT5wdXNoT3ZlcmxheShNaWRkbGUpOworICBPLT5wdXNoT3ZlcmxheShUb3ApOworCisgIEVycm9yT3I8dmZzOjpTdGF0dXM+IFN0YXR1czEoKGVycm9yX2NvZGUoKSkpLCBTdGF0dXMyKChlcnJvcl9jb2RlKCkpKSwKKyAgICAgIFN0YXR1czMoKGVycm9yX2NvZGUoKSkpLCBTdGF0dXNCKChlcnJvcl9jb2RlKCkpKSwgU3RhdHVzTSgoZXJyb3JfY29kZSgpKSksCisgICAgICBTdGF0dXNUKChlcnJvcl9jb2RlKCkpKTsKKworICBCYXNlLT5hZGRSZWd1bGFyRmlsZSgiL2ZvbyIpOworICBTdGF0dXNCID0gQmFzZS0+c3RhdHVzKCIvZm9vIik7CisgIEFTU0VSVF9FUShlcnJjOjpzdWNjZXNzLCBTdGF0dXNCLmdldEVycm9yKCkpOworICBTdGF0dXMxID0gTy0+c3RhdHVzKCIvZm9vIik7CisgIEFTU0VSVF9FUShlcnJjOjpzdWNjZXNzLCBTdGF0dXMxLmdldEVycm9yKCkpOworICBNaWRkbGUtPmFkZFJlZ3VsYXJGaWxlKCIvZm9vIik7CisgIFN0YXR1c00gPSBNaWRkbGUtPnN0YXR1cygiL2ZvbyIpOworICBBU1NFUlRfRVEoZXJyYzo6c3VjY2VzcywgU3RhdHVzTS5nZXRFcnJvcigpKTsKKyAgU3RhdHVzMiA9IE8tPnN0YXR1cygiL2ZvbyIpOworICBBU1NFUlRfRVEoZXJyYzo6c3VjY2VzcywgU3RhdHVzMi5nZXRFcnJvcigpKTsKKyAgVG9wLT5hZGRSZWd1bGFyRmlsZSgiL2ZvbyIpOworICBTdGF0dXNUID0gVG9wLT5zdGF0dXMoIi9mb28iKTsKKyAgQVNTRVJUX0VRKGVycmM6OnN1Y2Nlc3MsIFN0YXR1c1QuZ2V0RXJyb3IoKSk7CisgIFN0YXR1czMgPSBPLT5zdGF0dXMoIi9mb28iKTsKKyAgQVNTRVJUX0VRKGVycmM6OnN1Y2Nlc3MsIFN0YXR1czMuZ2V0RXJyb3IoKSk7CisKKyAgRVhQRUNUX1RSVUUoU3RhdHVzMS0+ZXF1aXZhbGVudCgqU3RhdHVzQikpOworICBFWFBFQ1RfVFJVRShTdGF0dXMyLT5lcXVpdmFsZW50KCpTdGF0dXNNKSk7CisgIEVYUEVDVF9UUlVFKFN0YXR1czMtPmVxdWl2YWxlbnQoKlN0YXR1c1QpKTsKKworICBFWFBFQ1RfRkFMU0UoU3RhdHVzMS0+ZXF1aXZhbGVudCgqU3RhdHVzMikpOworICBFWFBFQ1RfRkFMU0UoU3RhdHVzMi0+ZXF1aXZhbGVudCgqU3RhdHVzMykpOworICBFWFBFQ1RfRkFMU0UoU3RhdHVzMS0+ZXF1aXZhbGVudCgqU3RhdHVzMykpOworfQorCitURVNUKFZpcnR1YWxGaWxlU3lzdGVtVGVzdCwgT3ZlcmxheURpcnNOb25NZXJnZWQpIHsKKyAgSW50cnVzaXZlUmVmQ250UHRyPER1bW15RmlsZVN5c3RlbT4gTG93ZXIobmV3IER1bW15RmlsZVN5c3RlbSgpKTsKKyAgSW50cnVzaXZlUmVmQ250UHRyPER1bW15RmlsZVN5c3RlbT4gVXBwZXIobmV3IER1bW15RmlsZVN5c3RlbSgpKTsKKyAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6T3ZlcmxheUZpbGVTeXN0ZW0+IE8oCisgICAgICBuZXcgdmZzOjpPdmVybGF5RmlsZVN5c3RlbShMb3dlcikpOworICBPLT5wdXNoT3ZlcmxheShVcHBlcik7CisKKyAgTG93ZXItPmFkZERpcmVjdG9yeSgiL2xvd2VyLW9ubHkiKTsKKyAgVXBwZXItPmFkZERpcmVjdG9yeSgiL3VwcGVyLW9ubHkiKTsKKworICAvLyBub24tbWVyZ2VkIHBhdGhzIHNob3VsZCBiZSB0aGUgc2FtZQorICBFcnJvck9yPHZmczo6U3RhdHVzPiBTdGF0dXMxID0gTG93ZXItPnN0YXR1cygiL2xvd2VyLW9ubHkiKTsKKyAgQVNTRVJUX0VRKGVycmM6OnN1Y2Nlc3MsIFN0YXR1czEuZ2V0RXJyb3IoKSk7CisgIEVycm9yT3I8dmZzOjpTdGF0dXM+IFN0YXR1czIgPSBPLT5zdGF0dXMoIi9sb3dlci1vbmx5Iik7CisgIEFTU0VSVF9FUShlcnJjOjpzdWNjZXNzLCBTdGF0dXMyLmdldEVycm9yKCkpOworICBFWFBFQ1RfVFJVRShTdGF0dXMxLT5lcXVpdmFsZW50KCpTdGF0dXMyKSk7CisKKyAgU3RhdHVzMSA9IFVwcGVyLT5zdGF0dXMoIi91cHBlci1vbmx5Iik7CisgIEFTU0VSVF9FUShlcnJjOjpzdWNjZXNzLCBTdGF0dXMxLmdldEVycm9yKCkpOworICBTdGF0dXMyID0gTy0+c3RhdHVzKCIvdXBwZXItb25seSIpOworICBBU1NFUlRfRVEoZXJyYzo6c3VjY2VzcywgU3RhdHVzMi5nZXRFcnJvcigpKTsKKyAgRVhQRUNUX1RSVUUoU3RhdHVzMS0+ZXF1aXZhbGVudCgqU3RhdHVzMikpOworfQorCitURVNUKFZpcnR1YWxGaWxlU3lzdGVtVGVzdCwgTWVyZ2VkRGlyUGVybWlzc2lvbnMpIHsKKyAgLy8gbWVyZ2VkIGRpcmVjdG9yaWVzIGdldCB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIHVwcGVyIGRpcgorICBJbnRydXNpdmVSZWZDbnRQdHI8RHVtbXlGaWxlU3lzdGVtPiBMb3dlcihuZXcgRHVtbXlGaWxlU3lzdGVtKCkpOworICBJbnRydXNpdmVSZWZDbnRQdHI8RHVtbXlGaWxlU3lzdGVtPiBVcHBlcihuZXcgRHVtbXlGaWxlU3lzdGVtKCkpOworICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpPdmVybGF5RmlsZVN5c3RlbT4gTygKKyAgICAgIG5ldyB2ZnM6Ok92ZXJsYXlGaWxlU3lzdGVtKExvd2VyKSk7CisgIE8tPnB1c2hPdmVybGF5KFVwcGVyKTsKKworICBFcnJvck9yPHZmczo6U3RhdHVzPiBTdGF0dXMoKGVycm9yX2NvZGUoKSkpOworICBMb3dlci0+YWRkRGlyZWN0b3J5KCIvYm90aCIsIHN5czo6ZnM6Om93bmVyX3JlYWQpOworICBVcHBlci0+YWRkRGlyZWN0b3J5KCIvYm90aCIsIHN5czo6ZnM6Om93bmVyX2FsbCB8IHN5czo6ZnM6Omdyb3VwX3JlYWQpOworICBTdGF0dXMgPSBPLT5zdGF0dXMoIi9ib3RoIik7CisgIEFTU0VSVF9FUShlcnJjOjpzdWNjZXNzLCBTdGF0dXMuZ2V0RXJyb3IoKSk7CisgIEVYUEVDVF9FUSgwNzQwLCBTdGF0dXMtPmdldFBlcm1pc3Npb25zKCkpOworCisgIC8vIHBlcm1pc3Npb25zIChhcyB1c3VhbCkgYXJlIG5vdCByZWN1cnNpdmVseSBhcHBsaWVkCisgIExvd2VyLT5hZGRSZWd1bGFyRmlsZSgiL2JvdGgvZm9vIiwgc3lzOjpmczo6b3duZXJfcmVhZCk7CisgIFVwcGVyLT5hZGRSZWd1bGFyRmlsZSgiL2JvdGgvYmFyIiwgc3lzOjpmczo6b3duZXJfd3JpdGUpOworICBTdGF0dXMgPSBPLT5zdGF0dXMoIi9ib3RoL2ZvbyIpOworICBBU1NFUlRfRVEoZXJyYzo6c3VjY2VzcywgU3RhdHVzLmdldEVycm9yKCkpOworICBFWFBFQ1RfRVEoMDQwMCwgU3RhdHVzLT5nZXRQZXJtaXNzaW9ucygpKTsKKyAgU3RhdHVzID0gTy0+c3RhdHVzKCIvYm90aC9iYXIiKTsKKyAgQVNTRVJUX0VRKGVycmM6OnN1Y2Nlc3MsIFN0YXR1cy5nZXRFcnJvcigpKTsKKyAgRVhQRUNUX0VRKDAyMDAsIFN0YXR1cy0+Z2V0UGVybWlzc2lvbnMoKSk7Cit9CisKKy8vIE5PVEU6IGluIHRoZSB0ZXN0cyBiZWxvdywgd2UgdXNlICcvL3Jvb3QvJyBhcyBvdXIgcm9vdCBkaXJlY3RvcnksIHNpbmNlIGl0IGlzCisvLyBhIGxlZ2FsICphYnNvbHV0ZSogcGF0aCBvbiBXaW5kb3dzIGFzIHdlbGwgYXMgKm5peC4KK2NsYXNzIFZGU0Zyb21ZQU1MVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICBpbnQgTnVtRGlhZ25vc3RpY3M7CisKKyAgdm9pZCBTZXRVcCgpIHsKKyAgICBOdW1EaWFnbm9zdGljcyA9IDA7CisgIH0KKworICBzdGF0aWMgdm9pZCBDb3VudGluZ0RpYWdIYW5kbGVyKGNvbnN0IFNNRGlhZ25vc3RpYyAmLCB2b2lkICpDb250ZXh0KSB7CisgICAgVkZTRnJvbVlBTUxUZXN0ICpUZXN0ID0gc3RhdGljX2Nhc3Q8VkZTRnJvbVlBTUxUZXN0ICo+KENvbnRleHQpOworICAgICsrVGVzdC0+TnVtRGlhZ25vc3RpY3M7CisgIH0KKworICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPgorICBnZXRGcm9tWUFNTFJhd1N0cmluZyhTdHJpbmdSZWYgQ29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gRXh0ZXJuYWxGUykgeworICAgIE1lbW9yeUJ1ZmZlciAqQnVmZmVyID0gTWVtb3J5QnVmZmVyOjpnZXRNZW1CdWZmZXIoQ29udGVudCk7CisgICAgcmV0dXJuIGdldFZGU0Zyb21ZQU1MKEJ1ZmZlciwgQ291bnRpbmdEaWFnSGFuZGxlciwgdGhpcywgRXh0ZXJuYWxGUyk7CisgIH0KKworICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBnZXRGcm9tWUFNTFN0cmluZygKKyAgICAgIFN0cmluZ1JlZiBDb250ZW50LAorICAgICAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gRXh0ZXJuYWxGUyA9IG5ldyBEdW1teUZpbGVTeXN0ZW0oKSkgeworICAgIHN0ZDo6c3RyaW5nIFZlcnNpb25QbHVzQ29udGVudCgie1xuICAndmVyc2lvbic6MCxcbiIpOworICAgIFZlcnNpb25QbHVzQ29udGVudCArPSBDb250ZW50LnNsaWNlKENvbnRlbnQuZmluZCgneycpICsgMSwgU3RyaW5nUmVmOjpucG9zKTsKKyAgICByZXR1cm4gZ2V0RnJvbVlBTUxSYXdTdHJpbmcoVmVyc2lvblBsdXNDb250ZW50LCBFeHRlcm5hbEZTKTsKKyAgfQorfTsKKworVEVTVF9GKFZGU0Zyb21ZQU1MVGVzdCwgQmFzaWNWRlNGcm9tWUFNTCkgeworICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBGUzsKKyAgRlMgPSBnZXRGcm9tWUFNTFN0cmluZygiIik7CisgIEVYUEVDVF9FUShOVUxMLCBGUy5nZXRQdHIoKSk7CisgIEZTID0gZ2V0RnJvbVlBTUxTdHJpbmcoIltdIik7CisgIEVYUEVDVF9FUShOVUxMLCBGUy5nZXRQdHIoKSk7CisgIEZTID0gZ2V0RnJvbVlBTUxTdHJpbmcoIidzdHJpbmcnIik7CisgIEVYUEVDVF9FUShOVUxMLCBGUy5nZXRQdHIoKSk7CisgIEVYUEVDVF9FUSgzLCBOdW1EaWFnbm9zdGljcyk7Cit9CisKK1RFU1RfRihWRlNGcm9tWUFNTFRlc3QsIE1hcHBlZEZpbGVzKSB7CisgIEludHJ1c2l2ZVJlZkNudFB0cjxEdW1teUZpbGVTeXN0ZW0+IExvd2VyKG5ldyBEdW1teUZpbGVTeXN0ZW0oKSk7CisgIExvd2VyLT5hZGRSZWd1bGFyRmlsZSgiLy9yb290L2Zvby9iYXIvYSIpOworICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBGUyA9CisgICAgICBnZXRGcm9tWUFNTFN0cmluZygieyAncm9vdHMnOiBbXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgJ3R5cGUnOiAnZGlyZWN0b3J5JyxcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICduYW1lJzogJy8vcm9vdC8nLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgJ2NvbnRlbnRzJzogWyB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnZmlsZScsXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZmlsZTEnLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICdleHRlcm5hbC1jb250ZW50cyc6ICcvL3Jvb3QvZm9vL2Jhci9hJ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICB9LFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnZmlsZScsXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZmlsZTInLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICdleHRlcm5hbC1jb250ZW50cyc6ICcvL3Jvb3QvZm9vL2InXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgIH1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIF1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiXVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgICAgICAgICAgTG93ZXIpOworICBBU1NFUlRfVFJVRShGUy5nZXRQdHIoKSAhPSBOVUxMKTsKKworICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpPdmVybGF5RmlsZVN5c3RlbT4gTygKKyAgICAgIG5ldyB2ZnM6Ok92ZXJsYXlGaWxlU3lzdGVtKExvd2VyKSk7CisgIE8tPnB1c2hPdmVybGF5KEZTKTsKKworICAvLyBmaWxlCisgIEVycm9yT3I8dmZzOjpTdGF0dXM+IFMgPSBPLT5zdGF0dXMoIi8vcm9vdC9maWxlMSIpOworICBBU1NFUlRfRVEoZXJyYzo6c3VjY2VzcywgUy5nZXRFcnJvcigpKTsKKyAgRVhQRUNUX0VRKCIvL3Jvb3QvZm9vL2Jhci9hIiwgUy0+Z2V0TmFtZSgpKTsKKworICBFcnJvck9yPHZmczo6U3RhdHVzPiBTTG93ZXIgPSBPLT5zdGF0dXMoIi8vcm9vdC9mb28vYmFyL2EiKTsKKyAgRVhQRUNUX0VRKCIvL3Jvb3QvZm9vL2Jhci9hIiwgU0xvd2VyLT5nZXROYW1lKCkpOworICBFWFBFQ1RfVFJVRShTLT5lcXVpdmFsZW50KCpTTG93ZXIpKTsKKworICAvLyBkaXJlY3RvcnkKKyAgUyA9IE8tPnN0YXR1cygiLy9yb290LyIpOworICBBU1NFUlRfRVEoZXJyYzo6c3VjY2VzcywgUy5nZXRFcnJvcigpKTsKKyAgRVhQRUNUX1RSVUUoUy0+aXNEaXJlY3RvcnkoKSk7CisgIEVYUEVDVF9UUlVFKFMtPmVxdWl2YWxlbnQoKk8tPnN0YXR1cygiLy9yb290LyIpKSk7IC8vIG5vbi12b2xhdGlsZSBVbmlxdWVJRAorCisgIC8vIGJyb2tlbiBtYXBwaW5nCisgIEVYUEVDVF9FUShlcnJjOjpub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5LCBPLT5zdGF0dXMoIi8vcm9vdC9maWxlMiIpLmdldEVycm9yKCkpOworICBFWFBFQ1RfRVEoMCwgTnVtRGlhZ25vc3RpY3MpOworfQorCitURVNUX0YoVkZTRnJvbVlBTUxUZXN0LCBDYXNlSW5zZW5zaXRpdmUpIHsKKyAgSW50cnVzaXZlUmVmQ250UHRyPER1bW15RmlsZVN5c3RlbT4gTG93ZXIobmV3IER1bW15RmlsZVN5c3RlbSgpKTsKKyAgTG93ZXItPmFkZFJlZ3VsYXJGaWxlKCIvL3Jvb3QvZm9vL2Jhci9hIik7CisgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6OkZpbGVTeXN0ZW0+IEZTID0KKyAgICAgIGdldEZyb21ZQU1MU3RyaW5nKCJ7ICdjYXNlLXNlbnNpdGl2ZSc6ICdmYWxzZScsXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAncm9vdHMnOiBbXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgJ3R5cGUnOiAnZGlyZWN0b3J5JyxcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICduYW1lJzogJy8vcm9vdC8nLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgJ2NvbnRlbnRzJzogWyB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnZmlsZScsXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnWFgnLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICdleHRlcm5hbC1jb250ZW50cyc6ICcvL3Jvb3QvZm9vL2Jhci9hJ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICB9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBdXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAifV19IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvd2VyKTsKKyAgQVNTRVJUX1RSVUUoRlMuZ2V0UHRyKCkgIT0gTlVMTCk7CisKKyAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6T3ZlcmxheUZpbGVTeXN0ZW0+IE8oCisgICAgICBuZXcgdmZzOjpPdmVybGF5RmlsZVN5c3RlbShMb3dlcikpOworICBPLT5wdXNoT3ZlcmxheShGUyk7CisKKyAgRXJyb3JPcjx2ZnM6OlN0YXR1cz4gUyA9IE8tPnN0YXR1cygiLy9yb290L1hYIik7CisgIEFTU0VSVF9FUShlcnJjOjpzdWNjZXNzLCBTLmdldEVycm9yKCkpOworCisgIEVycm9yT3I8dmZzOjpTdGF0dXM+IFNTID0gTy0+c3RhdHVzKCIvL3Jvb3QveHgiKTsKKyAgQVNTRVJUX0VRKGVycmM6OnN1Y2Nlc3MsIFNTLmdldEVycm9yKCkpOworICBFWFBFQ1RfVFJVRShTLT5lcXVpdmFsZW50KCpTUykpOworICBTUyA9IE8tPnN0YXR1cygiLy9yb290L3hYIik7CisgIEVYUEVDVF9UUlVFKFMtPmVxdWl2YWxlbnQoKlNTKSk7CisgIFNTID0gTy0+c3RhdHVzKCIvL3Jvb3QvWHgiKTsKKyAgRVhQRUNUX1RSVUUoUy0+ZXF1aXZhbGVudCgqU1MpKTsKKyAgRVhQRUNUX0VRKDAsIE51bURpYWdub3N0aWNzKTsKK30KKworVEVTVF9GKFZGU0Zyb21ZQU1MVGVzdCwgQ2FzZVNlbnNpdGl2ZSkgeworICBJbnRydXNpdmVSZWZDbnRQdHI8RHVtbXlGaWxlU3lzdGVtPiBMb3dlcihuZXcgRHVtbXlGaWxlU3lzdGVtKCkpOworICBMb3dlci0+YWRkUmVndWxhckZpbGUoIi8vcm9vdC9mb28vYmFyL2EiKTsKKyAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gRlMgPQorICAgICAgZ2V0RnJvbVlBTUxTdHJpbmcoInsgJ2Nhc2Utc2Vuc2l0aXZlJzogJ3RydWUnLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgJ3Jvb3RzJzogW1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICd0eXBlJzogJ2RpcmVjdG9yeScsXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiICAnbmFtZSc6ICcvL3Jvb3QvJyxcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICdjb250ZW50cyc6IFsge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2ZpbGUnLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICduYW1lJzogJ1hYJyxcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAnZXh0ZXJuYWwtY29udGVudHMnOiAnLy9yb290L2Zvby9iYXIvYSdcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgXVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIn1dfSIsCisgICAgICAgICAgICAgICAgICAgICAgICBMb3dlcik7CisgIEFTU0VSVF9UUlVFKEZTLmdldFB0cigpICE9IE5VTEwpOworCisgIEludHJ1c2l2ZVJlZkNudFB0cjx2ZnM6Ok92ZXJsYXlGaWxlU3lzdGVtPiBPKAorICAgICAgbmV3IHZmczo6T3ZlcmxheUZpbGVTeXN0ZW0oTG93ZXIpKTsKKyAgTy0+cHVzaE92ZXJsYXkoRlMpOworCisgIEVycm9yT3I8dmZzOjpTdGF0dXM+IFNTID0gTy0+c3RhdHVzKCIvL3Jvb3QveHgiKTsKKyAgRVhQRUNUX0VRKGVycmM6Om5vX3N1Y2hfZmlsZV9vcl9kaXJlY3RvcnksIFNTLmdldEVycm9yKCkpOworICBTUyA9IE8tPnN0YXR1cygiLy9yb290L3hYIik7CisgIEVYUEVDVF9FUShlcnJjOjpub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5LCBTUy5nZXRFcnJvcigpKTsKKyAgU1MgPSBPLT5zdGF0dXMoIi8vcm9vdC9YeCIpOworICBFWFBFQ1RfRVEoZXJyYzo6bm9fc3VjaF9maWxlX29yX2RpcmVjdG9yeSwgU1MuZ2V0RXJyb3IoKSk7CisgIEVYUEVDVF9FUSgwLCBOdW1EaWFnbm9zdGljcyk7Cit9CisKK1RFU1RfRihWRlNGcm9tWUFNTFRlc3QsIElsbGVnYWxWRlNGaWxlKSB7CisgIEludHJ1c2l2ZVJlZkNudFB0cjxEdW1teUZpbGVTeXN0ZW0+IExvd2VyKG5ldyBEdW1teUZpbGVTeXN0ZW0oKSk7CisKKyAgLy8gaW52YWxpZCBZQU1MIGF0IHRvcC1sZXZlbAorICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKCJ7XSIsIExvd2VyKTsKKyAgRVhQRUNUX0VRKE5VTEwsIEZTLmdldFB0cigpKTsKKyAgLy8gaW52YWxpZCBZQU1MIGluIHJvb3RzCisgIEZTID0gZ2V0RnJvbVlBTUxTdHJpbmcoInsgJ3Jvb3RzJzpbfSIsIExvd2VyKTsKKyAgLy8gaW52YWxpZCBZQU1MIGluIGRpcmVjdG9yeQorICBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKAorICAgICAgInsgJ3Jvb3RzJzpbIHsgJ25hbWUnOiAnZm9vJywgJ3R5cGUnOiAnZGlyZWN0b3J5JywgJ2NvbnRlbnRzJzogW30iLAorICAgICAgTG93ZXIpOworICBFWFBFQ1RfRVEoTlVMTCwgRlMuZ2V0UHRyKCkpOworCisgIC8vIGludmFsaWQgY29uZmlndXJhdGlvbgorICBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKCJ7ICdrbm9idWxhcic6ICd0cnVlJywgJ3Jvb3RzJzpbXSB9IiwgTG93ZXIpOworICBFWFBFQ1RfRVEoTlVMTCwgRlMuZ2V0UHRyKCkpOworICBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKCJ7ICdjYXNlLXNlbnNpdGl2ZSc6ICdtYXliZScsICdyb290cyc6W10gfSIsIExvd2VyKTsKKyAgRVhQRUNUX0VRKE5VTEwsIEZTLmdldFB0cigpKTsKKworICAvLyBpbnZhbGlkIHJvb3RzCisgIEZTID0gZ2V0RnJvbVlBTUxTdHJpbmcoInsgJ3Jvb3RzJzonJyB9IiwgTG93ZXIpOworICBFWFBFQ1RfRVEoTlVMTCwgRlMuZ2V0UHRyKCkpOworICBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKCJ7ICdyb290cyc6e30gfSIsIExvd2VyKTsKKyAgRVhQRUNUX0VRKE5VTEwsIEZTLmdldFB0cigpKTsKKworICAvLyBpbnZhbGlkIGVudHJpZXMKKyAgRlMgPSBnZXRGcm9tWUFNTFN0cmluZygKKyAgICAgICJ7ICdyb290cyc6WyB7ICd0eXBlJzogJ290aGVyJywgJ25hbWUnOiAnbWUnLCAnY29udGVudHMnOiAnJyB9IiwgTG93ZXIpOworICBFWFBFQ1RfRVEoTlVMTCwgRlMuZ2V0UHRyKCkpOworICBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKCJ7ICdyb290cyc6WyB7ICd0eXBlJzogJ2ZpbGUnLCAnbmFtZSc6IFtdLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIidleHRlcm5hbC1jb250ZW50cyc6ICdvdGhlcicgfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTG93ZXIpOworICBFWFBFQ1RfRVEoTlVMTCwgRlMuZ2V0UHRyKCkpOworICBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKAorICAgICAgInsgJ3Jvb3RzJzpbIHsgJ3R5cGUnOiAnZmlsZScsICduYW1lJzogJ21lJywgJ2V4dGVybmFsLWNvbnRlbnRzJzogW10gfSIsCisgICAgICBMb3dlcik7CisgIEVYUEVDVF9FUShOVUxMLCBGUy5nZXRQdHIoKSk7CisgIEZTID0gZ2V0RnJvbVlBTUxTdHJpbmcoCisgICAgICAieyAncm9vdHMnOlsgeyAndHlwZSc6ICdmaWxlJywgJ25hbWUnOiAnbWUnLCAnZXh0ZXJuYWwtY29udGVudHMnOiB7fSB9IiwKKyAgICAgIExvd2VyKTsKKyAgRVhQRUNUX0VRKE5VTEwsIEZTLmdldFB0cigpKTsKKyAgRlMgPSBnZXRGcm9tWUFNTFN0cmluZygKKyAgICAgICJ7ICdyb290cyc6WyB7ICd0eXBlJzogJ2RpcmVjdG9yeScsICduYW1lJzogJ21lJywgJ2NvbnRlbnRzJzoge30gfSIsCisgICAgICBMb3dlcik7CisgIEVYUEVDVF9FUShOVUxMLCBGUy5nZXRQdHIoKSk7CisgIEZTID0gZ2V0RnJvbVlBTUxTdHJpbmcoCisgICAgICAieyAncm9vdHMnOlsgeyAndHlwZSc6ICdkaXJlY3RvcnknLCAnbmFtZSc6ICdtZScsICdjb250ZW50cyc6ICcnIH0iLAorICAgICAgTG93ZXIpOworICBFWFBFQ1RfRVEoTlVMTCwgRlMuZ2V0UHRyKCkpOworICBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKAorICAgICAgInsgJ3Jvb3RzJzpbIHsgJ3RoaW5neSc6ICdkaXJlY3RvcnknLCAnbmFtZSc6ICdtZScsICdjb250ZW50cyc6IFtdIH0iLAorICAgICAgTG93ZXIpOworICBFWFBFQ1RfRVEoTlVMTCwgRlMuZ2V0UHRyKCkpOworCisgIC8vIG1pc3NpbmcgbWFuZGF0b3J5IGZpZWxkcworICBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKCJ7ICdyb290cyc6WyB7ICd0eXBlJzogJ2ZpbGUnLCAnbmFtZSc6ICdtZScgfSIsIExvd2VyKTsKKyAgRVhQRUNUX0VRKE5VTEwsIEZTLmdldFB0cigpKTsKKyAgRlMgPSBnZXRGcm9tWUFNTFN0cmluZygKKyAgICAgICJ7ICdyb290cyc6WyB7ICd0eXBlJzogJ2ZpbGUnLCAnZXh0ZXJuYWwtY29udGVudHMnOiAnb3RoZXInIH0iLCBMb3dlcik7CisgIEVYUEVDVF9FUShOVUxMLCBGUy5nZXRQdHIoKSk7CisgIEZTID0gZ2V0RnJvbVlBTUxTdHJpbmcoInsgJ3Jvb3RzJzpbIHsgJ25hbWUnOiAnbWUnLCAnY29udGVudHMnOiBbXSB9IiwgTG93ZXIpOworICBFWFBFQ1RfRVEoTlVMTCwgRlMuZ2V0UHRyKCkpOworCisgIC8vIGR1cGxpY2F0ZSBrZXlzCisgIEZTID0gZ2V0RnJvbVlBTUxTdHJpbmcoInsgJ3Jvb3RzJzpbXSwgJ3Jvb3RzJzpbXSB9IiwgTG93ZXIpOworICBFWFBFQ1RfRVEoTlVMTCwgRlMuZ2V0UHRyKCkpOworICBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKAorICAgICAgInsgJ2Nhc2Utc2Vuc2l0aXZlJzondHJ1ZScsICdjYXNlLXNlbnNpdGl2ZSc6J3RydWUnLCAncm9vdHMnOltdIH0iLAorICAgICAgTG93ZXIpOworICBFWFBFQ1RfRVEoTlVMTCwgRlMuZ2V0UHRyKCkpOworICBGUyA9CisgICAgICBnZXRGcm9tWUFNTFN0cmluZygieyAncm9vdHMnOlt7J25hbWUnOidtZScsICduYW1lJzoneW91JywgJ3R5cGUnOidmaWxlJywgIgorICAgICAgICAgICAgICAgICAgICAgICAgIidleHRlcm5hbC1jb250ZW50cyc6J2JsYWgnIH0gXSB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvd2VyKTsKKyAgRVhQRUNUX0VRKE5VTEwsIEZTLmdldFB0cigpKTsKKworICAvLyBtaXNzaW5nIHZlcnNpb24KKyAgRlMgPSBnZXRGcm9tWUFNTFJhd1N0cmluZygieyAncm9vdHMnOltdIH0iLCBMb3dlcik7CisgIEVYUEVDVF9FUShOVUxMLCBGUy5nZXRQdHIoKSk7CisKKyAgLy8gYmFkIHZlcnNpb24gbnVtYmVyCisgIEZTID0gZ2V0RnJvbVlBTUxSYXdTdHJpbmcoInsgJ3ZlcnNpb24nOidmb28nLCAncm9vdHMnOltdIH0iLCBMb3dlcik7CisgIEVYUEVDVF9FUShOVUxMLCBGUy5nZXRQdHIoKSk7CisgIEZTID0gZ2V0RnJvbVlBTUxSYXdTdHJpbmcoInsgJ3ZlcnNpb24nOi0xLCAncm9vdHMnOltdIH0iLCBMb3dlcik7CisgIEVYUEVDVF9FUShOVUxMLCBGUy5nZXRQdHIoKSk7CisgIEZTID0gZ2V0RnJvbVlBTUxSYXdTdHJpbmcoInsgJ3ZlcnNpb24nOjEwMDAwMCwgJ3Jvb3RzJzpbXSB9IiwgTG93ZXIpOworICBFWFBFQ1RfRVEoTlVMTCwgRlMuZ2V0UHRyKCkpOworICBFWFBFQ1RfRVEoMjQsIE51bURpYWdub3N0aWNzKTsKK30KKworVEVTVF9GKFZGU0Zyb21ZQU1MVGVzdCwgVXNlRXh0ZXJuYWxOYW1lKSB7CisgIEludHJ1c2l2ZVJlZkNudFB0cjxEdW1teUZpbGVTeXN0ZW0+IExvd2VyKG5ldyBEdW1teUZpbGVTeXN0ZW0oKSk7CisgIExvd2VyLT5hZGRSZWd1bGFyRmlsZSgiLy9yb290L2V4dGVybmFsL2ZpbGUiKTsKKworICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKAorICAgICAgInsgJ3Jvb3RzJzogW1xuIgorICAgICAgIiAgeyAndHlwZSc6ICdmaWxlJywgJ25hbWUnOiAnLy9yb290L0EnLFxuIgorICAgICAgIiAgICAnZXh0ZXJuYWwtY29udGVudHMnOiAnLy9yb290L2V4dGVybmFsL2ZpbGUnXG4iCisgICAgICAiICB9LFxuIgorICAgICAgIiAgeyAndHlwZSc6ICdmaWxlJywgJ25hbWUnOiAnLy9yb290L0InLFxuIgorICAgICAgIiAgICAndXNlLWV4dGVybmFsLW5hbWUnOiB0cnVlLFxuIgorICAgICAgIiAgICAnZXh0ZXJuYWwtY29udGVudHMnOiAnLy9yb290L2V4dGVybmFsL2ZpbGUnXG4iCisgICAgICAiICB9LFxuIgorICAgICAgIiAgeyAndHlwZSc6ICdmaWxlJywgJ25hbWUnOiAnLy9yb290L0MnLFxuIgorICAgICAgIiAgICAndXNlLWV4dGVybmFsLW5hbWUnOiBmYWxzZSxcbiIKKyAgICAgICIgICAgJ2V4dGVybmFsLWNvbnRlbnRzJzogJy8vcm9vdC9leHRlcm5hbC9maWxlJ1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIl0gfSIsIExvd2VyKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCAhPSBGUy5nZXRQdHIoKSk7CisKKyAgLy8gZGVmYXVsdCB0cnVlCisgIEVYUEVDVF9FUSgiLy9yb290L2V4dGVybmFsL2ZpbGUiLCBGUy0+c3RhdHVzKCIvL3Jvb3QvQSIpLT5nZXROYW1lKCkpOworICAvLyBleHBsaWNpdAorICBFWFBFQ1RfRVEoIi8vcm9vdC9leHRlcm5hbC9maWxlIiwgRlMtPnN0YXR1cygiLy9yb290L0IiKS0+Z2V0TmFtZSgpKTsKKyAgRVhQRUNUX0VRKCIvL3Jvb3QvQyIsIEZTLT5zdGF0dXMoIi8vcm9vdC9DIiktPmdldE5hbWUoKSk7CisKKyAgLy8gZ2xvYmFsIGNvbmZpZ3VyYXRpb24KKyAgRlMgPSBnZXRGcm9tWUFNTFN0cmluZygKKyAgICAgICJ7ICd1c2UtZXh0ZXJuYWwtbmFtZXMnOiBmYWxzZSxcbiIKKyAgICAgICIgICdyb290cyc6IFtcbiIKKyAgICAgICIgIHsgJ3R5cGUnOiAnZmlsZScsICduYW1lJzogJy8vcm9vdC9BJyxcbiIKKyAgICAgICIgICAgJ2V4dGVybmFsLWNvbnRlbnRzJzogJy8vcm9vdC9leHRlcm5hbC9maWxlJ1xuIgorICAgICAgIiAgfSxcbiIKKyAgICAgICIgIHsgJ3R5cGUnOiAnZmlsZScsICduYW1lJzogJy8vcm9vdC9CJyxcbiIKKyAgICAgICIgICAgJ3VzZS1leHRlcm5hbC1uYW1lJzogdHJ1ZSxcbiIKKyAgICAgICIgICAgJ2V4dGVybmFsLWNvbnRlbnRzJzogJy8vcm9vdC9leHRlcm5hbC9maWxlJ1xuIgorICAgICAgIiAgfSxcbiIKKyAgICAgICIgIHsgJ3R5cGUnOiAnZmlsZScsICduYW1lJzogJy8vcm9vdC9DJyxcbiIKKyAgICAgICIgICAgJ3VzZS1leHRlcm5hbC1uYW1lJzogZmFsc2UsXG4iCisgICAgICAiICAgICdleHRlcm5hbC1jb250ZW50cyc6ICcvL3Jvb3QvZXh0ZXJuYWwvZmlsZSdcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJdIH0iLCBMb3dlcik7CisgIEFTU0VSVF9UUlVFKE5VTEwgIT0gRlMuZ2V0UHRyKCkpOworCisgIC8vIGRlZmF1bHQKKyAgRVhQRUNUX0VRKCIvL3Jvb3QvQSIsIEZTLT5zdGF0dXMoIi8vcm9vdC9BIiktPmdldE5hbWUoKSk7CisgIC8vIGV4cGxpY2l0CisgIEVYUEVDVF9FUSgiLy9yb290L2V4dGVybmFsL2ZpbGUiLCBGUy0+c3RhdHVzKCIvL3Jvb3QvQiIpLT5nZXROYW1lKCkpOworICBFWFBFQ1RfRVEoIi8vcm9vdC9DIiwgRlMtPnN0YXR1cygiLy9yb290L0MiKS0+Z2V0TmFtZSgpKTsKK30KKworVEVTVF9GKFZGU0Zyb21ZQU1MVGVzdCwgTXVsdGlDb21wb25lbnRQYXRoKSB7CisgIEludHJ1c2l2ZVJlZkNudFB0cjxEdW1teUZpbGVTeXN0ZW0+IExvd2VyKG5ldyBEdW1teUZpbGVTeXN0ZW0oKSk7CisgIExvd2VyLT5hZGRSZWd1bGFyRmlsZSgiLy9yb290L290aGVyIik7CisKKyAgLy8gZmlsZSBpbiByb290cworICBJbnRydXNpdmVSZWZDbnRQdHI8dmZzOjpGaWxlU3lzdGVtPiBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKAorICAgICAgInsgJ3Jvb3RzJzogW1xuIgorICAgICAgIiAgeyAndHlwZSc6ICdmaWxlJywgJ25hbWUnOiAnLy9yb290L3BhdGgvdG8vZmlsZScsXG4iCisgICAgICAiICAgICdleHRlcm5hbC1jb250ZW50cyc6ICcvL3Jvb3Qvb3RoZXInIH1dXG4iCisgICAgICAifSIsIExvd2VyKTsKKyAgQVNTRVJUX1RSVUUoTlVMTCAhPSBGUy5nZXRQdHIoKSk7CisgIEVYUEVDVF9FUShlcnJjOjpzdWNjZXNzLCBGUy0+c3RhdHVzKCIvL3Jvb3QvcGF0aC90by9maWxlIikuZ2V0RXJyb3IoKSk7CisgIEVYUEVDVF9FUShlcnJjOjpzdWNjZXNzLCBGUy0+c3RhdHVzKCIvL3Jvb3QvcGF0aC90byIpLmdldEVycm9yKCkpOworICBFWFBFQ1RfRVEoZXJyYzo6c3VjY2VzcywgRlMtPnN0YXR1cygiLy9yb290L3BhdGgiKS5nZXRFcnJvcigpKTsKKyAgRVhQRUNUX0VRKGVycmM6OnN1Y2Nlc3MsIEZTLT5zdGF0dXMoIi8vcm9vdC8iKS5nZXRFcnJvcigpKTsKKworICAvLyBhdCB0aGUgc3RhcnQKKyAgRlMgPSBnZXRGcm9tWUFNTFN0cmluZygKKyAgICAgICJ7ICdyb290cyc6IFtcbiIKKyAgICAgICIgIHsgJ3R5cGUnOiAnZGlyZWN0b3J5JywgJ25hbWUnOiAnLy9yb290L3BhdGgvdG8nLFxuIgorICAgICAgIiAgICAnY29udGVudHMnOiBbIHsgJ3R5cGUnOiAnZmlsZScsICduYW1lJzogJ2ZpbGUnLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgJ2V4dGVybmFsLWNvbnRlbnRzJzogJy8vcm9vdC9vdGhlcicgfV19XVxuIgorICAgICAgIn0iLCBMb3dlcik7CisgIEFTU0VSVF9UUlVFKE5VTEwgIT0gRlMuZ2V0UHRyKCkpOworICBFWFBFQ1RfRVEoZXJyYzo6c3VjY2VzcywgRlMtPnN0YXR1cygiLy9yb290L3BhdGgvdG8vZmlsZSIpLmdldEVycm9yKCkpOworICBFWFBFQ1RfRVEoZXJyYzo6c3VjY2VzcywgRlMtPnN0YXR1cygiLy9yb290L3BhdGgvdG8iKS5nZXRFcnJvcigpKTsKKyAgRVhQRUNUX0VRKGVycmM6OnN1Y2Nlc3MsIEZTLT5zdGF0dXMoIi8vcm9vdC9wYXRoIikuZ2V0RXJyb3IoKSk7CisgIEVYUEVDVF9FUShlcnJjOjpzdWNjZXNzLCBGUy0+c3RhdHVzKCIvL3Jvb3QvIikuZ2V0RXJyb3IoKSk7CisKKyAgLy8gYXQgdGhlIGVuZAorICBGUyA9IGdldEZyb21ZQU1MU3RyaW5nKAorICAgICAgInsgJ3Jvb3RzJzogW1xuIgorICAgICAgIiAgeyAndHlwZSc6ICdkaXJlY3RvcnknLCAnbmFtZSc6ICcvL3Jvb3QvJyxcbiIKKyAgICAgICIgICAgJ2NvbnRlbnRzJzogWyB7ICd0eXBlJzogJ2ZpbGUnLCAnbmFtZSc6ICdwYXRoL3RvL2ZpbGUnLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgJ2V4dGVybmFsLWNvbnRlbnRzJzogJy8vcm9vdC9vdGhlcicgfV19XVxuIgorICAgICAgIn0iLCBMb3dlcik7CisgIEFTU0VSVF9UUlVFKE5VTEwgIT0gRlMuZ2V0UHRyKCkpOworICBFWFBFQ1RfRVEoZXJyYzo6c3VjY2VzcywgRlMtPnN0YXR1cygiLy9yb290L3BhdGgvdG8vZmlsZSIpLmdldEVycm9yKCkpOworICBFWFBFQ1RfRVEoZXJyYzo6c3VjY2VzcywgRlMtPnN0YXR1cygiLy9yb290L3BhdGgvdG8iKS5nZXRFcnJvcigpKTsKKyAgRVhQRUNUX0VRKGVycmM6OnN1Y2Nlc3MsIEZTLT5zdGF0dXMoIi8vcm9vdC9wYXRoIikuZ2V0RXJyb3IoKSk7CisgIEVYUEVDVF9FUShlcnJjOjpzdWNjZXNzLCBGUy0+c3RhdHVzKCIvL3Jvb3QvIikuZ2V0RXJyb3IoKSk7Cit9CisKK1RFU1RfRihWRlNGcm9tWUFNTFRlc3QsIFRyYWlsaW5nU2xhc2hlcykgeworICBJbnRydXNpdmVSZWZDbnRQdHI8RHVtbXlGaWxlU3lzdGVtPiBMb3dlcihuZXcgRHVtbXlGaWxlU3lzdGVtKCkpOworICBMb3dlci0+YWRkUmVndWxhckZpbGUoIi8vcm9vdC9vdGhlciIpOworCisgIC8vIGZpbGUgaW4gcm9vdHMKKyAgSW50cnVzaXZlUmVmQ250UHRyPHZmczo6RmlsZVN5c3RlbT4gRlMgPSBnZXRGcm9tWUFNTFN0cmluZygKKyAgICAgICJ7ICdyb290cyc6IFtcbiIKKyAgICAgICIgIHsgJ3R5cGUnOiAnZGlyZWN0b3J5JywgJ25hbWUnOiAnLy9yb290L3BhdGgvdG8vLy8vJyxcbiIKKyAgICAgICIgICAgJ2NvbnRlbnRzJzogWyB7ICd0eXBlJzogJ2ZpbGUnLCAnbmFtZSc6ICdmaWxlJyxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICdleHRlcm5hbC1jb250ZW50cyc6ICcvL3Jvb3Qvb3RoZXInIH1dfV1cbiIKKyAgICAgICJ9IiwgTG93ZXIpOworICBBU1NFUlRfVFJVRShOVUxMICE9IEZTLmdldFB0cigpKTsKKyAgRVhQRUNUX0VRKGVycmM6OnN1Y2Nlc3MsIEZTLT5zdGF0dXMoIi8vcm9vdC9wYXRoL3RvL2ZpbGUiKS5nZXRFcnJvcigpKTsKKyAgRVhQRUNUX0VRKGVycmM6OnN1Y2Nlc3MsIEZTLT5zdGF0dXMoIi8vcm9vdC9wYXRoL3RvIikuZ2V0RXJyb3IoKSk7CisgIEVYUEVDVF9FUShlcnJjOjpzdWNjZXNzLCBGUy0+c3RhdHVzKCIvL3Jvb3QvcGF0aCIpLmdldEVycm9yKCkpOworICBFWFBFQ1RfRVEoZXJyYzo6c3VjY2VzcywgRlMtPnN0YXR1cygiLy9yb290LyIpLmdldEVycm9yKCkpOworfQpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL0NNYWtlTGlzdHMudHh0IGIvdW5pdHRlc3RzL0NNYWtlTGlzdHMudHh0CmluZGV4IDQ3OWIzNmYuLmNjMTMyMjYgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9DTWFrZUxpc3RzLnR4dAorKysgYi91bml0dGVzdHMvQ01ha2VMaXN0cy50eHQKQEAgLTExLDYgKzExLDcgQEAKIAogYWRkX3N1YmRpcmVjdG9yeShCYXNpYykKIGFkZF9zdWJkaXJlY3RvcnkoTGV4KQorYWRkX3N1YmRpcmVjdG9yeShEcml2ZXIpCiBpZihDTEFOR19FTkFCTEVfU1RBVElDX0FOQUxZWkVSKQogICBhZGRfc3ViZGlyZWN0b3J5KEZyb250ZW5kKQogZW5kaWYoKQpAQCAtMjEsMyArMjIsNiBAQAogICBhZGRfc3ViZGlyZWN0b3J5KEZvcm1hdCkKICAgYWRkX3N1YmRpcmVjdG9yeShTZW1hKQogZW5kaWYoKQoraWYoTk9UIFdJTjMyKSAjIEZJWE1FOkludmVzdGlnYXRpbmcuCisgIGFkZF9zdWJkaXJlY3RvcnkobGliY2xhbmcpCitlbmRpZigpCmRpZmYgLS1naXQgYS91bml0dGVzdHMvRHJpdmVyL0NNYWtlTGlzdHMudHh0IGIvdW5pdHRlc3RzL0RyaXZlci9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2M5NjNiCi0tLSAvZGV2L251bGwKKysrIGIvdW5pdHRlc3RzL0RyaXZlci9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDExIEBACitzZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMKKyAgU3VwcG9ydAorICApCisKK2FkZF9jbGFuZ191bml0dGVzdChDbGFuZ0RyaXZlclRlc3RzCisgIE11bHRpbGliVGVzdC5jcHAKKyAgKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMoQ2xhbmdEcml2ZXJUZXN0cworICBjbGFuZ0RyaXZlcgorICApCmRpZmYgLS1naXQgYS91bml0dGVzdHMvRHJpdmVyL01ha2VmaWxlIGIvdW5pdHRlc3RzL0RyaXZlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQxOWYzCi0tLSAvZGV2L251bGwKKysrIGIvdW5pdHRlc3RzL0RyaXZlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE2IEBACisjIz09PS0gdW5pdHRlc3RzL0RyaXZlci9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBNYWtlZmlsZSAtKi09PT0jIworIworIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorIyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitDTEFOR19MRVZFTCA9IC4uLy4uCitURVNUTkFNRSA9IE11bHRpbGliCitpbmNsdWRlICQoQ0xBTkdfTEVWRUwpLy4uLy4uL01ha2VmaWxlLmNvbmZpZworTElOS19DT01QT05FTlRTIDo9ICQoVEFSR0VUU19UT19CVUlMRCkgc3VwcG9ydCBvcHRpb24KK1VTRURMSUJTID0gY2xhbmdEcml2ZXIuYSBjbGFuZ0Jhc2ljLmEKKworaW5jbHVkZSAkKENMQU5HX0xFVkVMKS91bml0dGVzdHMvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL3VuaXR0ZXN0cy9Ecml2ZXIvTXVsdGlsaWJUZXN0LmNwcCBiL3VuaXR0ZXN0cy9Ecml2ZXIvTXVsdGlsaWJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2VhY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pdHRlc3RzL0RyaXZlci9NdWx0aWxpYlRlc3QuY3BwCkBAIC0wLDAgKzEsMzU2IEBACisvLz09PS0gdW5pdHRlc3RzL0RyaXZlci9NdWx0aWxpYlRlc3QuY3BwIC0tLSBNdWx0aWxpYiB0ZXN0cyAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFVuaXQgdGVzdHMgZm9yIE11bHRpbGliIGFuZCBNdWx0aWxpYlNldAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJjbGFuZy9Ecml2ZXIvTXVsdGlsaWIuaCIKKyNpbmNsdWRlICJjbGFuZy9CYXNpYy9MTFZNLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNsYW5nOjpkcml2ZXI7Cit1c2luZyBuYW1lc3BhY2UgY2xhbmc7CisKK1RFU1QoTXVsdGlsaWJUZXN0LCBNdWx0aWxpYlZhbGlkaXR5KSB7CisKKyAgQVNTRVJUX1RSVUUoTXVsdGlsaWIoKS5pc1ZhbGlkKCkpIDw8ICJFbXB0eSBtdWx0aWxpYiBpcyBub3QgdmFsaWQiOworCisgIEFTU0VSVF9UUlVFKE11bHRpbGliKCkuZmxhZygiK2ZvbyIpLmlzVmFsaWQoKSkKKyAgICAgIDw8ICJTaW5nbGUgaW5kaWNhdGl2ZSBmbGFnIGlzIG5vdCB2YWxpZCI7CisKKyAgQVNTRVJUX1RSVUUoTXVsdGlsaWIoKS5mbGFnKCItZm9vIikuaXNWYWxpZCgpKQorICAgICAgPDwgIlNpbmdsZSBjb250cmFpbmRpY2F0aXZlIGZsYWcgaXMgbm90IHZhbGlkIjsKKworICBBU1NFUlRfRkFMU0UoTXVsdGlsaWIoKS5mbGFnKCIrZm9vIikuZmxhZygiLWZvbyIpLmlzVmFsaWQoKSkKKyAgICAgIDw8ICJDb25mbGljdGluZyBmbGFncyBzaG91bGQgaW52YWxpZGF0ZSB0aGUgTXVsdGlsaWIiOworCisgIEFTU0VSVF9UUlVFKE11bHRpbGliKCkuZmxhZygiK2ZvbyIpLmZsYWcoIitmb28iKS5pc1ZhbGlkKCkpCisgICAgICA8PCAiTXVsdGlsaWIgc2hvdWxkIGJlIHZhbGlkIGV2ZW4gaWYgaXQgaGFzIHRoZSBzYW1lIGZsYWcgdHdpY2UiOworCisgIEFTU0VSVF9UUlVFKE11bHRpbGliKCkuZmxhZygiK2ZvbyIpLmZsYWcoIi1mb29iYXIiKS5pc1ZhbGlkKCkpCisgICAgICA8PCAiU2VlbWluZ2x5IGNvbmZsaWN0aW5nIHByZWZpeGVzIHNob3VsZG4ndCBhY3R1YWxseSBjb25mbGljdCI7Cit9CisKK1RFU1QoTXVsdGlsaWJUZXN0LCBPcEVxUmVmbGV4aXZpdHkxKSB7CisgIE11bHRpbGliIE07CisgIEFTU0VSVF9UUlVFKE0gPT0gTSkgPDwgIk11bHRpbGliOjpvcGVyYXRvcj09KCkgaXMgbm90IHJlZmxleGl2ZSI7Cit9CisKK1RFU1QoTXVsdGlsaWJUZXN0LCBPcEVxUmVmbGV4aXZpdHkyKSB7CisgIEFTU0VSVF9UUlVFKE11bHRpbGliKCkgPT0gTXVsdGlsaWIoKSkKKyAgICAgIDw8ICJTZXBhcmF0ZWx5IGNvbnN0cnVjdGVkIGRlZmF1bHQgbXVsdGlsaWJzIGFyZSBub3QgZXF1YWwiOworfQorCitURVNUKE11bHRpbGliVGVzdCwgT3BFcVJlZmxleGl2aXR5MykgeworICBNdWx0aWxpYiBNMSwgTTI7CisgIE0xLmZsYWcoIitmb28iKTsKKyAgTTIuZmxhZygiK2ZvbyIpOworICBBU1NFUlRfVFJVRShNMSA9PSBNMikgPDwgIk11bHRpbGlicyB3aXRoIHRoZSBzYW1lIGZsYWcgc2hvdWxkIGJlIHRoZSBzYW1lIjsKK30KKworVEVTVChNdWx0aWxpYlRlc3QsIE9wRXFJbmVxdWl2YWxlbmNlMSkgeworICBNdWx0aWxpYiBNMSwgTTI7CisgIE0xLmZsYWcoIitmb28iKTsKKyAgTTIuZmxhZygiLWZvbyIpOworICBBU1NFUlRfRkFMU0UoTTEgPT0gTTIpIDw8ICJNdWx0aWxpYnMgd2l0aCBjb25mbGljdGluZyBmbGFncyBhcmUgbm90IHRoZSBzYW1lIjsKKyAgQVNTRVJUX0ZBTFNFKE0yID09IE0xKQorICAgICAgPDwgIk11bHRpbGlicyB3aXRoIGNvbmZsaWN0aW5nIGZsYWdzIGFyZSBub3QgdGhlIHNhbWUgKGNvbW11dGVkKSI7Cit9CisKK1RFU1QoTXVsdGlsaWJUZXN0LCBPcEVxSW5lcXVpdmFsZW5jZTIpIHsKKyAgTXVsdGlsaWIgTTEsIE0yOworICBNMi5mbGFnKCIrZm9vIik7CisgIEFTU0VSVF9GQUxTRShNMSA9PSBNMikgPDwgIkZsYWdzIG1ha2UgTXVsdGlsaWJzIGRpZmZlcmVudCI7Cit9CisKK1RFU1QoTXVsdGlsaWJUZXN0LCBPcEVxRXF1aXZhbGVuY2UxKSB7CisgIE11bHRpbGliIE0xLCBNMjsKKyAgTTEuZmxhZygiK2ZvbyIpOworICBNMi5mbGFnKCIrZm9vIikuZmxhZygiK2ZvbyIpOworICBBU1NFUlRfVFJVRShNMSA9PSBNMikgPDwgIkZsYWcgZHVwbGljYXRpb24gc2hvdWxkbid0IGFmZmVjdCBlcXVpdmFsZW5jZSI7CisgIEFTU0VSVF9UUlVFKE0yID09IE0xKQorICAgICAgPDwgIkZsYWcgZHVwbGljYXRpb24gc2hvdWxkbid0IGFmZmVjdCBlcXVpdmFsZW5jZSAoY29tbXV0ZWQpIjsKK30KKworVEVTVChNdWx0aWxpYlRlc3QsIE9wRXFFcXVpdmFsZW5jZTIpIHsKKyAgTXVsdGlsaWIgTTEoIjY0Iik7CisgIE11bHRpbGliIE0yOworICBNMi5nY2NTdWZmaXgoIi82NCIpOworICBBU1NFUlRfVFJVRShNMSA9PSBNMikKKyAgICAgIDw8ICJDb25zdHJ1Y3RvciBhcmd1bWVudCBtdXN0IG1hdGNoIE11bHRpbGliOjpnY2NTdWZmaXgoKSI7CisgIEFTU0VSVF9UUlVFKE0yID09IE0xKQorICAgICAgPDwgIkNvbnN0cnVjdG9yIGFyZ3VtZW50IG11c3QgbWF0Y2ggTXVsdGlsaWI6OmdjY1N1ZmZpeCgpIChjb21tdXRlZCkiOworfQorCitURVNUKE11bHRpbGliVGVzdCwgT3BFcUVxdWl2YWxlbmNlMykgeworICBNdWx0aWxpYiBNMSgiIiwgIjMyIik7CisgIE11bHRpbGliIE0yOworICBNMi5vc1N1ZmZpeCgiLzMyIik7CisgIEFTU0VSVF9UUlVFKE0xID09IE0yKQorICAgICAgPDwgIkNvbnN0cnVjdG9yIGFyZ3VtZW50IG11c3QgbWF0Y2ggTXVsdGlsaWI6Om9zU3VmZml4KCkiOworICBBU1NFUlRfVFJVRShNMiA9PSBNMSkKKyAgICAgIDw8ICJDb25zdHJ1Y3RvciBhcmd1bWVudCBtdXN0IG1hdGNoIE11bHRpbGliOjpvc1N1ZmZpeCgpIChjb21tdXRlZCkiOworfQorCitURVNUKE11bHRpbGliVGVzdCwgT3BFcUVxdWl2YWxlbmNlNCkgeworICBNdWx0aWxpYiBNMSgiIiwgIiIsICIxNiIpOworICBNdWx0aWxpYiBNMjsKKyAgTTIuaW5jbHVkZVN1ZmZpeCgiLzE2Iik7CisgIEFTU0VSVF9UUlVFKE0xID09IE0yKQorICAgICAgPDwgIkNvbnN0cnVjdG9yIGFyZ3VtZW50IG11c3QgbWF0Y2ggTXVsdGlsaWI6OmluY2x1ZGVTdWZmaXgoKSI7CisgIEFTU0VSVF9UUlVFKE0yID09IE0xKQorICAgICAgPDwgIkNvbnN0cnVjdG9yIGFyZ3VtZW50IG11c3QgbWF0Y2ggTXVsdGlsaWI6OmluY2x1ZGVTdWZmaXgoKSAoY29tbXV0ZWQpIjsKK30KKworVEVTVChNdWx0aWxpYlRlc3QsIE9wRXFJbmVxdWl2YWxlbmNlMykgeworICBNdWx0aWxpYiBNMSgiZm9vIik7CisgIE11bHRpbGliIE0yKCJiYXIiKTsKKyAgQVNTRVJUX0ZBTFNFKE0xID09IE0yKSA8PCAiRGlmZmVyaW5nIGdjY1N1ZmZpeGVzIHNob3VsZCBiZSBkaWZmZXJlbnQiOworICBBU1NFUlRfRkFMU0UoTTIgPT0gTTEpCisgICAgICA8PCAiRGlmZmVyaW5nIGdjY1N1ZmZpeGVzIHNob3VsZCBiZSBkaWZmZXJlbnQgKGNvbW11dGVkKSI7Cit9CisKK1RFU1QoTXVsdGlsaWJUZXN0LCBPcEVxSW5lcXVpdmFsZW5jZTQpIHsKKyAgTXVsdGlsaWIgTTEoIiIsICJmb28iKTsKKyAgTXVsdGlsaWIgTTIoIiIsICJiYXIiKTsKKyAgQVNTRVJUX0ZBTFNFKE0xID09IE0yKSA8PCAiRGlmZmVyaW5nIG9zU3VmZml4ZXMgc2hvdWxkIGJlIGRpZmZlcmVudCI7CisgIEFTU0VSVF9GQUxTRShNMiA9PSBNMSkKKyAgICAgIDw8ICJEaWZmZXJpbmcgb3NTdWZmaXhlcyBzaG91bGQgYmUgZGlmZmVyZW50IChjb21tdXRlZCkiOworfQorCitURVNUKE11bHRpbGliVGVzdCwgT3BFcUluZXF1aXZhbGVuY2U1KSB7CisgIE11bHRpbGliIE0xKCIiLCAiIiwgImZvbyIpOworICBNdWx0aWxpYiBNMigiIiwgIiIsICJiYXIiKTsKKyAgQVNTRVJUX0ZBTFNFKE0xID09IE0yKSA8PCAiRGlmZmVyaW5nIGluY2x1ZGVTdWZmaXhlcyBzaG91bGQgYmUgZGlmZmVyZW50IjsKKyAgQVNTRVJUX0ZBTFNFKE0yID09IE0xKQorICAgICAgPDwgIkRpZmZlcmluZyBpbmNsdWRlU3VmZml4ZXMgc2hvdWxkIGJlIGRpZmZlcmVudCAoY29tbXV0ZWQpIjsKK30KKworVEVTVChNdWx0aWxpYlRlc3QsIENvbnN0cnVjdGlvbjEpIHsKKyAgTXVsdGlsaWIgTSgiZ2NjNjQiLCAib3M2NCIsICJpbmM2NCIpOworICBBU1NFUlRfVFJVRShNLmdjY1N1ZmZpeCgpID09ICIvZ2NjNjQiKTsKKyAgQVNTRVJUX1RSVUUoTS5vc1N1ZmZpeCgpID09ICIvb3M2NCIpOworICBBU1NFUlRfVFJVRShNLmluY2x1ZGVTdWZmaXgoKSA9PSAiL2luYzY0Iik7Cit9CisKK1RFU1QoTXVsdGlsaWJUZXN0LCBDb25zdHJ1Y3Rpb24yKSB7CisgIE11bHRpbGliIE0xOworICBNdWx0aWxpYiBNMigiIik7CisgIE11bHRpbGliIE0zKCIiLCAiIik7CisgIE11bHRpbGliIE00KCIiLCAiIiwgIiIpOworICBBU1NFUlRfVFJVRShNMSA9PSBNMikKKyAgICAgIDw8ICJEZWZhdWx0IGFyZ3VtZW50cyB0byBNdWx0aWxpYiBjb25zdHJ1Y3RvciBicm9rZW4gKGZpcnN0IGFyZ3VtZW50KSI7CisgIEFTU0VSVF9UUlVFKE0xID09IE0zKQorICAgICAgPDwgIkRlZmF1bHQgYXJndW1lbnRzIHRvIE11bHRpbGliIGNvbnN0cnVjdG9yIGJyb2tlbiAoc2Vjb25kIGFyZ3VtZW50KSI7CisgIEFTU0VSVF9UUlVFKE0xID09IE00KQorICAgICAgPDwgIkRlZmF1bHQgYXJndW1lbnRzIHRvIE11bHRpbGliIGNvbnN0cnVjdG9yIGJyb2tlbiAodGhpcmQgYXJndW1lbnQpIjsKK30KKworVEVTVChNdWx0aWxpYlRlc3QsIENvbnN0cnVjdGlvbjMpIHsKKyAgTXVsdGlsaWIgTSA9IE11bHRpbGliKCkuZmxhZygiK2YxIikuZmxhZygiK2YyIikuZmxhZygiLWYzIik7CisgIGZvciAoTXVsdGlsaWI6OmZsYWdzX2xpc3Q6OmNvbnN0X2l0ZXJhdG9yIEkgPSBNLmZsYWdzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IE0uZmxhZ3MoKS5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIEFTU0VSVF9UUlVFKGxsdm06OlN0cmluZ1N3aXRjaDxib29sPigqSSkKKyAgICAgICAgICAgICAgICAgICAgLkNhc2VzKCIrZjEiLCAiK2YyIiwgIi1mMyIsIHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5EZWZhdWx0KGZhbHNlKSk7CisgIH0KK30KKworc3RhdGljIGJvb2wgaGFzRmxhZyhjb25zdCBNdWx0aWxpYiAmTSwgU3RyaW5nUmVmIEZsYWcpIHsKKyAgZm9yIChNdWx0aWxpYjo6ZmxhZ3NfbGlzdDo6Y29uc3RfaXRlcmF0b3IgSSA9IE0uZmxhZ3MoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gTS5mbGFncygpLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgaWYgKCpJID09IEZsYWcpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlIGlmIChTdHJpbmdSZWYoKkkpLnN1YnN0cigxKSA9PSBGbGFnLnN1YnN0cigxKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK1RFU1QoTXVsdGlsaWJUZXN0LCBTZXRDb25zdHJ1Y3Rpb24xKSB7CisgIC8vIFNpbmdsZSBtYXliZQorICBNdWx0aWxpYlNldCBNUzsKKyAgQVNTRVJUX1RSVUUoTVMuc2l6ZSgpID09IDApOworICBNUy5NYXliZShNdWx0aWxpYigiNjQiKS5mbGFnKCIrbTY0IikpOworICBBU1NFUlRfVFJVRShNUy5zaXplKCkgPT0gMik7CisgIGZvciAoTXVsdGlsaWJTZXQ6OmNvbnN0X2l0ZXJhdG9yIEkgPSBNUy5iZWdpbigpLCBFID0gTVMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgaWYgKEktPmdjY1N1ZmZpeCgpID09ICIvNjQiKQorICAgICAgQVNTRVJUX1RSVUUoSS0+ZmxhZ3MoKVswXSA9PSAiK202NCIpOworICAgIGVsc2UgaWYgKEktPmdjY1N1ZmZpeCgpID09ICIiKQorICAgICAgQVNTRVJUX1RSVUUoSS0+ZmxhZ3MoKVswXSA9PSAiLW02NCIpOworICAgIGVsc2UKKyAgICAgIEZBSUwoKSA8PCAiVW5yZWNvZ25pemVkIGdjY1N1Zml4OiAiIDw8IEktPmdjY1N1ZmZpeCgpOworICB9Cit9CisKK1RFU1QoTXVsdGlsaWJUZXN0LCBTZXRDb25zdHJ1Y3Rpb24yKSB7CisgIC8vIERvdWJsZSBtYXliZQorICBNdWx0aWxpYlNldCBNUzsKKyAgTVMuTWF5YmUoTXVsdGlsaWIoInNvZiIpLmZsYWcoIitzb2YiKSk7CisgIE1TLk1heWJlKE11bHRpbGliKCJlbCIpLmZsYWcoIitFTCIpKTsKKyAgQVNTRVJUX1RSVUUoTVMuc2l6ZSgpID09IDQpOworICBmb3IgKE11bHRpbGliU2V0Ojpjb25zdF9pdGVyYXRvciBJID0gTVMuYmVnaW4oKSwgRSA9IE1TLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEFTU0VSVF9UUlVFKEktPmlzVmFsaWQoKSkgPDwgIk11bHRpbGIgIiA8PCAqSSA8PCAiIHNob3VsZCBiZSB2YWxpZCI7CisgICAgQVNTRVJUX1RSVUUobGx2bTo6U3RyaW5nU3dpdGNoPGJvb2w+KEktPmdjY1N1ZmZpeCgpKQorICAgICAgICAgICAgICAgICAgICAuQ2FzZXMoIiIsICIvc29mIiwgIi9lbCIsICIvc29mL2VsIiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgLkRlZmF1bHQoZmFsc2UpKQorICAgICAgICA8PCAiTXVsdGlsaWIgIiA8PCAqSSA8PCAiIHdhc24ndCBleHBlY3RlZCI7CisgICAgQVNTRVJUX1RSVUUobGx2bTo6U3RyaW5nU3dpdGNoPGJvb2w+KEktPmdjY1N1ZmZpeCgpKQorICAgICAgICAgICAgICAgICAgICAuQ2FzZSgiIiwgaGFzRmxhZygqSSwgIi1zb2YiKSkKKyAgICAgICAgICAgICAgICAgICAgLkNhc2UoIi9zb2YiLCBoYXNGbGFnKCpJLCAiK3NvZiIpKQorICAgICAgICAgICAgICAgICAgICAuQ2FzZSgiL2VsIiwgaGFzRmxhZygqSSwgIi1zb2YiKSkKKyAgICAgICAgICAgICAgICAgICAgLkNhc2UoIi9zb2YvZWwiLCBoYXNGbGFnKCpJLCAiK3NvZiIpKQorICAgICAgICAgICAgICAgICAgICAuRGVmYXVsdChmYWxzZSkpCisgICAgICAgIDw8ICJNdWx0aWxpYiAiIDw8ICpJIDw8ICIgZGlkbid0IGhhdmUgdGhlIGFwcHJvcHJpYXRlIHsrLC19c29mIGZsYWciOworICAgIEFTU0VSVF9UUlVFKGxsdm06OlN0cmluZ1N3aXRjaDxib29sPihJLT5nY2NTdWZmaXgoKSkKKyAgICAgICAgICAgICAgICAgICAgLkNhc2UoIiIsIGhhc0ZsYWcoKkksICItRUwiKSkKKyAgICAgICAgICAgICAgICAgICAgLkNhc2UoIi9zb2YiLCBoYXNGbGFnKCpJLCAiLUVMIikpCisgICAgICAgICAgICAgICAgICAgIC5DYXNlKCIvZWwiLCBoYXNGbGFnKCpJLCAiK0VMIikpCisgICAgICAgICAgICAgICAgICAgIC5DYXNlKCIvc29mL2VsIiwgaGFzRmxhZygqSSwgIitFTCIpKQorICAgICAgICAgICAgICAgICAgICAuRGVmYXVsdChmYWxzZSkpCisgICAgICAgIDw8ICJNdWx0aWxpYiAiIDw8ICpJIDw8ICIgZGlkbid0IGhhdmUgdGhlIGFwcHJvcHJpYXRlIHsrLC19RUwgZmxhZyI7CisgIH0KK30KKworVEVTVChNdWx0aWxpYlRlc3QsIFNldFB1c2hiYWNrKSB7CisgIE11bHRpbGliU2V0IE1TOworICBNUy5wdXNoX2JhY2soTXVsdGlsaWIoIm9uZSIpKTsKKyAgTVMucHVzaF9iYWNrKE11bHRpbGliKCJ0d28iKSk7CisgIEFTU0VSVF9UUlVFKE1TLnNpemUoKSA9PSAyKTsKKyAgZm9yIChNdWx0aWxpYlNldDo6Y29uc3RfaXRlcmF0b3IgSSA9IE1TLmJlZ2luKCksIEUgPSBNUy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBBU1NFUlRfVFJVRShsbHZtOjpTdHJpbmdTd2l0Y2g8Ym9vbD4oSS0+Z2NjU3VmZml4KCkpCisgICAgICAgICAgICAgICAgICAgIC5DYXNlcygiL29uZSIsICIvdHdvIiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgLkRlZmF1bHQoZmFsc2UpKTsKKyAgfQorICBNUy5jbGVhcigpOworICBBU1NFUlRfVFJVRShNUy5zaXplKCkgPT0gMCk7Cit9CisKK1RFU1QoTXVsdGlsaWJUZXN0LCBTZXRSZWdleEZpbHRlcikgeworICBNdWx0aWxpYlNldCBNUzsKKyAgTVMuTWF5YmUoTXVsdGlsaWIoIm9uZSIpKTsKKyAgTVMuTWF5YmUoTXVsdGlsaWIoInR3byIpKTsKKyAgTVMuTWF5YmUoTXVsdGlsaWIoInRocmVlIikpOworICBBU1NFUlRfRVEoTVMuc2l6ZSgpLCAodW5zaWduZWQpMiAqIDIgKiAyKQorICAgICAgPDwgIlNpemUgYmVmb3JlIGZpbHRlciB3YXMgaW5jb3JyZWN0LiBDb250ZW50czpcbiIgPDwgTVM7CisgIE1TLkZpbHRlck91dCgiL29uZS90d28vdGhyZWUiKTsKKyAgQVNTRVJUX0VRKE1TLnNpemUoKSwgKHVuc2lnbmVkKTIgKiAyICogMiAtIDEpCisgICAgICA8PCAiU2l6ZSBhZnRlciBmaWx0ZXIgd2FzIGluY29ycmVjdC4gQ29udGVudHM6XG4iIDw8IE1TOworICBmb3IgKE11bHRpbGliU2V0Ojpjb25zdF9pdGVyYXRvciBJID0gTVMuYmVnaW4oKSwgRSA9IE1TLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEFTU0VSVF9UUlVFKEktPmdjY1N1ZmZpeCgpICE9ICIvb25lL3R3by90aHJlZSIpCisgICAgICAgIDw8ICJUaGUgZmlsdGVyIHNob3VsZCBoYXZlIHJlbW92ZWQgIiA8PCAqSTsKKyAgfQorfQorCitURVNUKE11bHRpbGliVGVzdCwgU2V0RmlsdGVyT2JqZWN0KSB7CisgIC8vIEZpbHRlciBvYmplY3QKKyAgc3RydWN0IFN0YXJ0c1dpdGhQIDogcHVibGljIE11bHRpbGliU2V0OjpGaWx0ZXJDYWxsYmFjayB7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IE11bHRpbGliICZNKSBjb25zdCBvdmVycmlkZSB7CisgICAgICByZXR1cm4gU3RyaW5nUmVmKE0uZ2NjU3VmZml4KCkpLnN0YXJ0c3dpdGgoIi9wIik7CisgICAgfQorICB9OworICBNdWx0aWxpYlNldCBNUzsKKyAgTVMuTWF5YmUoTXVsdGlsaWIoIm9yYW5nZSIpKTsKKyAgTVMuTWF5YmUoTXVsdGlsaWIoInBlYXIiKSk7CisgIE1TLk1heWJlKE11bHRpbGliKCJwbHVtIikpOworICBBU1NFUlRfRVEoKGludClNUy5zaXplKCksIDEgLyogRGVmYXVsdCAqLyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBwZWFyICovICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qIHBsdW0gKi8gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogcGVhci9wbHVtICovICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qIG9yYW5nZSAqLyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBvcmFuZ2UvcGVhciAqLyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBvcmFuZ2UvcGx1bSAqLyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBvcmFuZ2UvcGVhci9wbHVtICovICkKKyAgICAgIDw8ICJTaXplIGJlZm9yZSBmaWx0ZXIgd2FzIGluY29ycmVjdC4gQ29udGVudHM6XG4iIDw8IE1TOworICBNUy5GaWx0ZXJPdXQoU3RhcnRzV2l0aFAoKSk7CisgIEFTU0VSVF9FUSgoaW50KU1TLnNpemUoKSwgMSAvKiBEZWZhdWx0ICovICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qIG9yYW5nZSAqLyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBvcmFuZ2UvcGVhciAqLyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiBvcmFuZ2UvcGx1bSAqLyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyogb3JhbmdlL3BlYXIvcGx1bSAqLyApCisgICAgICA8PCAiU2l6ZSBhZnRlciBmaWx0ZXIgd2FzIGluY29ycmVjdC4gQ29udGVudHM6XG4iIDw8IE1TOworICBmb3IgKE11bHRpbGliU2V0Ojpjb25zdF9pdGVyYXRvciBJID0gTVMuYmVnaW4oKSwgRSA9IE1TLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIEFTU0VSVF9GQUxTRShTdHJpbmdSZWYoSS0+Z2NjU3VmZml4KCkpLnN0YXJ0c3dpdGgoIi9wIikpCisgICAgICAgIDw8ICJUaGUgZmlsdGVyIHNob3VsZCBoYXZlIHJlbW92ZWQgIiA8PCAqSTsKKyAgfQorfQorCitURVNUKE11bHRpbGliVGVzdCwgU2V0U2VsZWN0aW9uMSkgeworICBNdWx0aWxpYlNldCBNUzEgPSBNdWx0aWxpYlNldCgpCisgICAgLk1heWJlKE11bHRpbGliKCI2NCIpLmZsYWcoIittNjQiKSk7CisKKyAgTXVsdGlsaWI6OmZsYWdzX2xpc3QgRmxhZ002NDsKKyAgRmxhZ002NC5wdXNoX2JhY2soIittNjQiKTsKKyAgTXVsdGlsaWIgU2VsZWN0aW9uTTY0OworICBBU1NFUlRfVFJVRShNUzEuc2VsZWN0KEZsYWdNNjQsIFNlbGVjdGlvbk02NCkpCisgICAgICA8PCAiRmxhZyBzZXQgd2FzIHtcIittNjRcIn0sIGJ1dCBzZWxlY3Rpb24gbm90IGZvdW5kIjsKKyAgQVNTRVJUX1RSVUUoU2VsZWN0aW9uTTY0LmdjY1N1ZmZpeCgpID09ICIvNjQiKQorICAgICAgPDwgIlNlbGVjdGlvbiBwaWNrZWQgIiA8PCBTZWxlY3Rpb25NNjQgPDwgIiB3aGljaCB3YXMgbm90IGV4cGVjdGVkIjsKKworICBNdWx0aWxpYjo6ZmxhZ3NfbGlzdCBGbGFnTm9NNjQ7CisgIEZsYWdOb002NC5wdXNoX2JhY2soIi1tNjQiKTsKKyAgTXVsdGlsaWIgU2VsZWN0aW9uTm9NNjQ7CisgIEFTU0VSVF9UUlVFKE1TMS5zZWxlY3QoRmxhZ05vTTY0LCBTZWxlY3Rpb25Ob002NCkpCisgICAgICA8PCAiRmxhZyBzZXQgd2FzIHtcIi1tNjRcIn0sIGJ1dCBzZWxlY3Rpb24gbm90IGZvdW5kIjsKKyAgQVNTRVJUX1RSVUUoU2VsZWN0aW9uTm9NNjQuZ2NjU3VmZml4KCkgPT0gIiIpCisgICAgICA8PCAiU2VsZWN0aW9uIHBpY2tlZCAiIDw8IFNlbGVjdGlvbk5vTTY0IDw8ICIgd2hpY2ggd2FzIG5vdCBleHBlY3RlZCI7Cit9CisKK1RFU1QoTXVsdGlsaWJUZXN0LCBTZXRTZWxlY3Rpb24yKSB7CisgIE11bHRpbGliU2V0IE1TMiA9IE11bHRpbGliU2V0KCkKKyAgICAuTWF5YmUoTXVsdGlsaWIoImVsIikuZmxhZygiK0VMIikpCisgICAgLk1heWJlKE11bHRpbGliKCJzZiIpLmZsYWcoIitTRiIpKTsKKworICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgNDsgKytJKSB7CisgICAgYm9vbCBJc0VMID0gSSAmIDB4MTsKKyAgICBib29sIElzU0YgPSBJICYgMHgyOworICAgIE11bHRpbGliOjpmbGFnc19saXN0IEZsYWdzOworICAgIGlmIChJc0VMKQorICAgICAgRmxhZ3MucHVzaF9iYWNrKCIrRUwiKTsKKyAgICBlbHNlCisgICAgICBGbGFncy5wdXNoX2JhY2soIi1FTCIpOworCisgICAgaWYgKElzU0YpCisgICAgICBGbGFncy5wdXNoX2JhY2soIitTRiIpOworICAgIGVsc2UKKyAgICAgIEZsYWdzLnB1c2hfYmFjaygiLVNGIik7CisKKyAgICBNdWx0aWxpYiBTZWxlY3Rpb247CisgICAgQVNTRVJUX1RSVUUoTVMyLnNlbGVjdChGbGFncywgU2VsZWN0aW9uKSkgPDwgIlNlbGVjdGlvbiBmYWlsZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoSXNFTCA/ICIrRUwiIDogIi1FTCIpIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChJc1NGID8gIitTRiIgOiAiLVNGIik7CisKKyAgICBzdGQ6OnN0cmluZyBTdWZmaXg7CisgICAgaWYgKElzRUwpCisgICAgICBTdWZmaXggKz0gIi9lbCI7CisgICAgaWYgKElzU0YpCisgICAgICBTdWZmaXggKz0gIi9zZiI7CisKKyAgICBBU1NFUlRfRVEoU2VsZWN0aW9uLmdjY1N1ZmZpeCgpLCBTdWZmaXgpIDw8ICJTZWxlY3Rpb24gcGlja2VkICIgPDwgU2VsZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHdoaWNoIHdhcyBub3QgZXhwZWN0ZWQgIjsKKyAgfQorfQorCitURVNUKE11bHRpbGliVGVzdCwgU2V0Q29tYmluZVdpdGgpIHsKKyAgTXVsdGlsaWJTZXQgQ29mZmVlOworICBDb2ZmZWUucHVzaF9iYWNrKE11bHRpbGliKCJjb2ZmZWUiKSk7CisgIE11bHRpbGliU2V0IE1pbGs7CisgIE1pbGsucHVzaF9iYWNrKE11bHRpbGliKCJtaWxrIikpOworICBNdWx0aWxpYlNldCBMYXR0ZTsKKyAgQVNTRVJUX0VRKExhdHRlLnNpemUoKSwgKHVuc2lnbmVkKTApOworICBMYXR0ZS5jb21iaW5lV2l0aChDb2ZmZWUpOworICBBU1NFUlRfRVEoTGF0dGUuc2l6ZSgpLCAodW5zaWduZWQpMSk7CisgIExhdHRlLmNvbWJpbmVXaXRoKE1pbGspOworICBBU1NFUlRfRVEoTGF0dGUuc2l6ZSgpLCAodW5zaWduZWQpMik7Cit9CmRpZmYgLS1naXQgYS91bml0dGVzdHMvRm9ybWF0L0NNYWtlTGlzdHMudHh0IGIvdW5pdHRlc3RzL0Zvcm1hdC9DTWFrZUxpc3RzLnR4dAppbmRleCAxNmQ1NzY0Li4xNGZjMjJkIDEwMDY0NAotLS0gYS91bml0dGVzdHMvRm9ybWF0L0NNYWtlTGlzdHMudHh0CisrKyBiL3VuaXR0ZXN0cy9Gb3JtYXQvQ01ha2VMaXN0cy50eHQKQEAgLTEsMTggKzEsMTQgQEAKIHNldChMTFZNX0xJTktfQ09NUE9ORU5UUwotICAke0xMVk1fVEFSR0VUU19UT19CVUlMRH0KLSAgYXNtcGFyc2VyCi0gIGJpdHJlYWRlcgotICBzdXBwb3J0Ci0gIG1jCisgIFN1cHBvcnQKICAgKQogCiBhZGRfY2xhbmdfdW5pdHRlc3QoRm9ybWF0VGVzdHMKICAgRm9ybWF0VGVzdC5jcHAKKyAgRm9ybWF0VGVzdEpTLmNwcAorICBGb3JtYXRUZXN0UHJvdG8uY3BwCiAgICkKIAogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKEZvcm1hdFRlc3RzCi0gIGNsYW5nQVNUCiAgIGNsYW5nRm9ybWF0CiAgIGNsYW5nVG9vbGluZwotICBjbGFuZ1Jld3JpdGVDb3JlCiAgICkKZGlmZiAtLWdpdCBhL3VuaXR0ZXN0cy9Gb3JtYXQvRm9ybWF0VGVzdC5jcHAgYi91bml0dGVzdHMvRm9ybWF0L0Zvcm1hdFRlc3QuY3BwCmluZGV4IGI2NTc0YzcuLjc2MDYyNjAgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9Gb3JtYXQvRm9ybWF0VGVzdC5jcHAKKysrIGIvdW5pdHRlc3RzL0Zvcm1hdC9Gb3JtYXRUZXN0LmNwcApAQCAtOSwxNCArOSwxOCBAQAogCiAjZGVmaW5lIERFQlVHX1RZUEUgImZvcm1hdC10ZXN0IgogCisjaW5jbHVkZSAiRm9ybWF0VGVzdFV0aWxzLmgiCiAjaW5jbHVkZSAiY2xhbmcvRm9ybWF0L0Zvcm1hdC5oIgotI2luY2x1ZGUgImNsYW5nL0xleC9MZXhlci5oIgogI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgogI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCiAKIG5hbWVzcGFjZSBjbGFuZyB7CiBuYW1lc3BhY2UgZm9ybWF0IHsKIAorRm9ybWF0U3R5bGUgZ2V0R29vZ2xlU3R5bGUoKSB7CisgIHJldHVybiBnZXRHb29nbGVTdHlsZShGb3JtYXRTdHlsZTo6TEtfQ3BwKTsKK30KKwogY2xhc3MgRm9ybWF0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewogcHJvdGVjdGVkOgogICBzdGQ6OnN0cmluZyBmb3JtYXQobGx2bTo6U3RyaW5nUmVmIENvZGUsIHVuc2lnbmVkIE9mZnNldCwgdW5zaWduZWQgTGVuZ3RoLApAQCAtMzcsNDYgKzQxLDYgQEAKICAgICByZXR1cm4gZm9ybWF0KENvZGUsIDAsIENvZGUuc2l6ZSgpLCBTdHlsZSk7CiAgIH0KIAotICBzdGQ6OnN0cmluZyBtZXNzVXAobGx2bTo6U3RyaW5nUmVmIENvZGUpIHsKLSAgICBzdGQ6OnN0cmluZyBNZXNzZWRVcChDb2RlLnN0cigpKTsKLSAgICBib29sIEluQ29tbWVudCA9IGZhbHNlOwotICAgIGJvb2wgSW5QcmVwcm9jZXNzb3JEaXJlY3RpdmUgPSBmYWxzZTsKLSAgICBib29sIEp1c3RSZXBsYWNlZE5ld2xpbmUgPSBmYWxzZTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTWVzc2VkVXAuc2l6ZSgpIC0gMTsgaSAhPSBlOyArK2kpIHsKLSAgICAgIGlmIChNZXNzZWRVcFtpXSA9PSAnLycgJiYgTWVzc2VkVXBbaSArIDFdID09ICcvJykgewotICAgICAgICBpZiAoSnVzdFJlcGxhY2VkTmV3bGluZSkKLSAgICAgICAgICBNZXNzZWRVcFtpIC0gMV0gPSAnXG4nOwotICAgICAgICBJbkNvbW1lbnQgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChNZXNzZWRVcFtpXSA9PSAnIycgJiYgKEp1c3RSZXBsYWNlZE5ld2xpbmUgfHwgaSA9PSAwKSkgewotICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICAgIE1lc3NlZFVwW2kgLSAxXSA9ICdcbic7Ci0gICAgICAgIEluUHJlcHJvY2Vzc29yRGlyZWN0aXZlID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoTWVzc2VkVXBbaV0gPT0gJ1xcJyAmJiBNZXNzZWRVcFtpICsgMV0gPT0gJ1xuJykgewotICAgICAgICBNZXNzZWRVcFtpXSA9ICcgJzsKLSAgICAgICAgTWVzc2VkVXBbaSArIDFdID0gJyAnOwotICAgICAgfSBlbHNlIGlmIChNZXNzZWRVcFtpXSA9PSAnXG4nKSB7Ci0gICAgICAgIGlmIChJbkNvbW1lbnQpIHsKLSAgICAgICAgICBJbkNvbW1lbnQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChJblByZXByb2Nlc3NvckRpcmVjdGl2ZSkgewotICAgICAgICAgIEluUHJlcHJvY2Vzc29yRGlyZWN0aXZlID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgSnVzdFJlcGxhY2VkTmV3bGluZSA9IHRydWU7Ci0gICAgICAgICAgTWVzc2VkVXBbaV0gPSAnICc7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoTWVzc2VkVXBbaV0gIT0gJyAnKSB7Ci0gICAgICAgIEp1c3RSZXBsYWNlZE5ld2xpbmUgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3RkOjpzdHJpbmcgV2l0aG91dFdoaXRlc3BhY2U7Ci0gICAgaWYgKE1lc3NlZFVwWzBdICE9ICcgJykKLSAgICAgIFdpdGhvdXRXaGl0ZXNwYWNlLnB1c2hfYmFjayhNZXNzZWRVcFswXSk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMSwgZSA9IE1lc3NlZFVwLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKLSAgICAgIGlmIChNZXNzZWRVcFtpXSAhPSAnICcgfHwgTWVzc2VkVXBbaSAtIDFdICE9ICcgJykKLSAgICAgICAgV2l0aG91dFdoaXRlc3BhY2UucHVzaF9iYWNrKE1lc3NlZFVwW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIFdpdGhvdXRXaGl0ZXNwYWNlOwotICB9Ci0KICAgRm9ybWF0U3R5bGUgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnModW5zaWduZWQgQ29sdW1uTGltaXQpIHsKICAgICBGb3JtYXRTdHlsZSBTdHlsZSA9IGdldExMVk1TdHlsZSgpOwogICAgIFN0eWxlLkNvbHVtbkxpbWl0ID0gQ29sdW1uTGltaXQ7CkBAIC05MSw3ICs1NSw3IEBACiAKICAgdm9pZCB2ZXJpZnlGb3JtYXQobGx2bTo6U3RyaW5nUmVmIENvZGUsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdFN0eWxlICZTdHlsZSA9IGdldExMVk1TdHlsZSgpKSB7Ci0gICAgRVhQRUNUX0VRKENvZGUuc3RyKCksIGZvcm1hdChtZXNzVXAoQ29kZSksIFN0eWxlKSk7CisgICAgRVhQRUNUX0VRKENvZGUuc3RyKCksIGZvcm1hdCh0ZXN0OjptZXNzVXAoQ29kZSksIFN0eWxlKSk7CiAgIH0KIAogICB2b2lkIHZlcmlmeUdvb2dsZUZvcm1hdChsbHZtOjpTdHJpbmdSZWYgQ29kZSkgewpAQCAtMTA3LDExICs3MSwxMSBAQAogfTsKIAogVEVTVF9GKEZvcm1hdFRlc3QsIE1lc3NVcCkgewotICBFWFBFQ1RfRVEoIjEgMiAzIiwgbWVzc1VwKCIxIDIgMyIpKTsKLSAgRVhQRUNUX0VRKCIxIDIgM1xuIiwgbWVzc1VwKCIxXG4yXG4zXG4iKSk7Ci0gIEVYUEVDVF9FUSgiYVxuLy9iXG5jIiwgbWVzc1VwKCJhXG4vL2JcbmMiKSk7Ci0gIEVYUEVDVF9FUSgiYVxuI2JcbmMiLCBtZXNzVXAoImFcbiNiXG5jIikpOwotICBFWFBFQ1RfRVEoImFcbiNiIGMgZFxuZSIsIG1lc3NVcCgiYVxuI2JcXFxuY1xcXG5kXG5lIikpOworICBFWFBFQ1RfRVEoIjEgMiAzIiwgdGVzdDo6bWVzc1VwKCIxIDIgMyIpKTsKKyAgRVhQRUNUX0VRKCIxIDIgM1xuIiwgdGVzdDo6bWVzc1VwKCIxXG4yXG4zXG4iKSk7CisgIEVYUEVDVF9FUSgiYVxuLy9iXG5jIiwgdGVzdDo6bWVzc1VwKCJhXG4vL2JcbmMiKSk7CisgIEVYUEVDVF9FUSgiYVxuI2JcbmMiLCB0ZXN0OjptZXNzVXAoImFcbiNiXG5jIikpOworICBFWFBFQ1RfRVEoImFcbiNiIGMgZFxuZSIsIHRlc3Q6Om1lc3NVcCgiYVxuI2JcXFxuY1xcXG5kXG5lIikpOwogfQogCiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwpAQCAtMTQ0LDcgKzEwOCw3IEBACiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBOZXN0ZWROYW1lU3BlY2lmaWVycykgewotICB2ZXJpZnlGb3JtYXQoInZlY3RvcjwgOjpUeXBlPiB2OyIpOworICB2ZXJpZnlGb3JtYXQoInZlY3Rvcjw6OlR5cGU+IHY7Iik7CiAgIHZlcmlmeUZvcm1hdCgiOjpuczo6U29tZUZ1bmN0aW9uKDo6bnM6OlNvbWVPdGhlckZ1bmN0aW9uKCkpIik7CiAgIHZlcmlmeUZvcm1hdCgic3RhdGljIGNvbnN0ZXhwciBib29sIEJhciA9IGRlY2x0eXBlKGJhcigpKTo6dmFsdWU7Iik7CiB9CkBAIC0xODcsMTAgKzE1MSwxMCBAQAogICAgICAgICAgICAgICAgICAgIDI2LCAwLCBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucygxMikpKTsKICAgRVhQRUNUX0VRKCIjZGVmaW5lIEEgIFxcXG4iCiAgICAgICAgICAgICAiICBpbnQgYTsgICBcXFxuIgotICAgICAgICAgICAgIiAgICBpbnQgYjsiLAorICAgICAgICAgICAgIiAgaW50IGI7IiwKICAgICAgICAgICAgIGZvcm1hdCgiI2RlZmluZSBBICBcXFxuIgogICAgICAgICAgICAgICAgICAgICIgIGludCBhOyAgIFxcXG4iCi0gICAgICAgICAgICAgICAgICAgIiAgICBpbnQgYjsiLAorICAgICAgICAgICAgICAgICAgICIgIGludCBiOyIsCiAgICAgICAgICAgICAgICAgICAgMjUsIDAsIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDEyKSkpOwogfQogCkBAIC0yMTAsNiArMTc0LDUxIEBACiAgICAgICAgICAgICAgICAgICAgIlxuIgogICAgICAgICAgICAgICAgICAgICJ9OyIpKTsKIAorICAvLyBEb24ndCByZW1vdmUgZW1wdHkgbGluZXMgYXQgdGhlIHN0YXJ0IG9mIG5hbWVzcGFjZXMuCisgIEVYUEVDVF9FUSgibmFtZXNwYWNlIE4ge1xuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgImludCBpO1xuIgorICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgZm9ybWF0KCJuYW1lc3BhY2UgTiB7XG4iCisgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICJpbnQgICAgaTtcbiIKKyAgICAgICAgICAgICAgICAgICAifSIsCisgICAgICAgICAgICAgICAgICAgZ2V0R29vZ2xlU3R5bGUoKSkpOworCisgIC8vIFJlbW92ZSBlbXB0eSBsaW5lcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYmxvY2tzLgorICBFWFBFQ1RfRVEoInZvaWQgZigpIHtcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICIgIGlmIChhKSB7XG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiICAgIGYoKTtcbiIKKyAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICJ9IiwKKyAgICAgICAgICAgIGZvcm1hdCgidm9pZCBmKCkge1xuIgorICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAiICBpZiAoYSkge1xuIgorICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIGYoKTtcbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAifSIsCisgICAgICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlKCkpKTsKKyAgRVhQRUNUX0VRKCJ2b2lkIGYoKSB7XG4iCisgICAgICAgICAgICAiICBpZiAoYSkge1xuIgorICAgICAgICAgICAgIiAgICBmKCk7XG4iCisgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAifSIsCisgICAgICAgICAgICBmb3JtYXQoInZvaWQgZigpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgIiAgaWYgKGEpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBmKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgICAgIGdldEdvb2dsZVN0eWxlKCkpKTsKKwogICAvLyBEb24ndCByZW1vdmUgZW1wdHkgbGluZXMgaW4gbW9yZSBjb21wbGV4IGNvbnRyb2wgc3RhdGVtZW50cy4KICAgRVhQRUNUX0VRKCJ2b2lkIGYoKSB7XG4iCiAgICAgICAgICAgICAiICBpZiAoYSkge1xuIgpAQCAtMjkzLDcgKzMwMiw3IEBACiAgICAgICAgICAgICAgICAiICBmKCk7XG4iCiAgICAgICAgICAgICAgICAifSIsCiAgICAgICAgICAgICAgICBBbGxvd3NNZXJnZWRJZik7Ci0gIHZlcmlmeUZvcm1hdCgiaWYgKGEpIHsgLyogTmV2ZXIgbWVyZ2UgdGhpcyAqL1xuIgorICB2ZXJpZnlGb3JtYXQoImlmIChhKSB7LyogTmV2ZXIgbWVyZ2UgdGhpcyAqL1xuIgogICAgICAgICAgICAgICAgIiAgZigpO1xuIgogICAgICAgICAgICAgICAgIn0iLAogICAgICAgICAgICAgICAgQWxsb3dzTWVyZ2VkSWYpOwpAQCAtNDUyLDYgKzQ2MSwxNyBAQAogICAgICAgICAgICAgICAgIiAgICAgYWFhYWFhYWFhYWFhYWFhYWEoYWFhYWFhYWFhYWFhYWFhYSwgYWFhYWFhYWFhYWFhYSkpIHtcbn0iKTsKICAgdmVyaWZ5Rm9ybWF0KCJmb3IgKGNvbnN0IGFhYWFhYWFhYWFhYWFhYWFhYWFhYSAmYWFhYWFhYWFhIDpcbiIKICAgICAgICAgICAgICAgICIgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKSB7XG59Iik7CisgIHZlcmlmeUZvcm1hdCgiZm9yIChhYWFhYWFhYWEgYWFhYWFhYWFhYWFhYWFhYWFhYWFhIDpcbiIKKyAgICAgICAgICAgICAgICIgICAgIGFhYWFhYWFhYWFhYS5hYWFhYWFhYWFhYWEoKS5hYWFhYWFhYWEoKS5hKCkpIHtcbn0iKTsKK30KKworVEVTVF9GKEZvcm1hdFRlc3QsIEZvckVhY2hMb29wcykgeworICB2ZXJpZnlGb3JtYXQoInZvaWQgZigpIHtcbiIKKyAgICAgICAgICAgICAgICIgIGZvcmVhY2ggKEl0ZW0gKml0ZW0sIGl0ZW1saXN0KSB7fVxuIgorICAgICAgICAgICAgICAgIiAgUV9GT1JFQUNIIChJdGVtICppdGVtLCBpdGVtbGlzdCkge31cbiIKKyAgICAgICAgICAgICAgICIgIEJPT1NUX0ZPUkVBQ0ggKEl0ZW0gKml0ZW0sIGl0ZW1saXN0KSB7fVxuIgorICAgICAgICAgICAgICAgIiAgVU5LTk9XTl9GT1JBQ0goSXRlbSAqIGl0ZW0sIGl0ZW1saXN0KSB7fVxuIgorICAgICAgICAgICAgICAgIn0iKTsKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIEZvcm1hdHNXaGlsZUxvb3ApIHsKQEAgLTYzNyw2ICs2NTcsOSBAQAogICB2ZXJpZnlGb3JtYXQoIlNvbWVPYmplY3RcbiIKICAgICAgICAgICAgICAgICIgICAgLy8gQ2FsbGluZyBzb21lRnVuY3Rpb24gb24gU29tZU9iamVjdFxuIgogICAgICAgICAgICAgICAgIiAgICAuc29tZUZ1bmN0aW9uKCk7Iik7CisgIHZlcmlmeUZvcm1hdCgiYXV0byByZXN1bHQgPSBTb21lT2JqZWN0XG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgLy8gQ2FsbGluZyBzb21lRnVuY3Rpb24gb24gU29tZU9iamVjdFxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIC5zb21lRnVuY3Rpb24oKTsiKTsKICAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGYoaW50IGksICAvLyBzb21lIGNvbW1lbnQgKHByb2JhYmx5IGZvciBpKVxuIgogICAgICAgICAgICAgICAgIiAgICAgICBpbnQgaiwgIC8vIHNvbWUgY29tbWVudCAocHJvYmFibHkgZm9yIGopXG4iCiAgICAgICAgICAgICAgICAiICAgICAgIGludCBrKTsgLy8gc29tZSBjb21tZW50IChwcm9iYWJseSBmb3IgaykiKTsKQEAgLTczMSwxMSArNzU0LDEwIEBACiAgIHZlcmlmeUdvb2dsZUZvcm1hdCgiI2VuZGlmICAvLyBIRUFERVJfR1VBUkQiKTsKIAogICB2ZXJpZnlGb3JtYXQoImNvbnN0IGNoYXIgKnRlc3RbXSA9IHtcbiIKLSAgICAgICAgICAgICAgICIgIC8vIEFcbiIKLSAgICAgICAgICAgICAgICIgIFwiYWFhYVwiLFxuIgotICAgICAgICAgICAgICAgIiAgLy8gQlxuIgotICAgICAgICAgICAgICAgIiAgXCJhYWFhYVwiLFxuIgotICAgICAgICAgICAgICAgIn07Iik7CisgICAgICAgICAgICAgICAiICAgIC8vIEFcbiIKKyAgICAgICAgICAgICAgICIgICAgXCJhYWFhXCIsXG4iCisgICAgICAgICAgICAgICAiICAgIC8vIEJcbiIKKyAgICAgICAgICAgICAgICIgICAgXCJhYWFhYVwifTsiKTsKICAgdmVyaWZ5R29vZ2xlRm9ybWF0KAogICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKFxuIgogICAgICAgIiAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKTsgIC8vIDgxX2NvbHNfd2l0aF90aGlzX2NvbW1lbnQiKTsKQEAgLTgwOSw2ICs4MzEsMzIgQEAKICAgICAgICAgICAgICAgICAgICAib3RoZXJMaW5lKCk7IikpOwogfQogCitURVNUX0YoRm9ybWF0VGVzdCwgS2VlcHNQYXJhbWV0ZXJXaXRoVHJhaWxpbmdDb21tZW50c09uVGhlaXJPd25MaW5lKSB7CisgIEVYUEVDVF9FUSgiU29tZUZ1bmN0aW9uKGEsXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgIGIsIC8vIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgYyk7IiwKKyAgICAgICAgICAgIGZvcm1hdCgiU29tZUZ1bmN0aW9uKGEsXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICBiLCAvLyBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIGMpOyIpKTsKKyAgRVhQRUNUX0VRKCJTb21lRnVuY3Rpb24oYSwgYixcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgLy8gY29tbWVudFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICBjKTsiLAorICAgICAgICAgICAgZm9ybWF0KCJTb21lRnVuY3Rpb24oYSxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgICAgIGIsXG4iCisgICAgICAgICAgICAgICAgICAiICAvLyBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIGMpOyIpKTsKKyAgRVhQRUNUX0VRKCJTb21lRnVuY3Rpb24oYSwgYiwgLy8gY29tbWVudCAodW5jbGVhciByZWxhdGlvbilcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgYyk7IiwKKyAgICAgICAgICAgIGZvcm1hdCgiU29tZUZ1bmN0aW9uKGEsIGIsIC8vIGNvbW1lbnQgKHVuY2xlYXIgcmVsYXRpb24pXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIGMpOyIpKTsKKyAgRVhQRUNUX0VRKCJTb21lRnVuY3Rpb24oYSwgLy8gY29tbWVudFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICBiLFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICBjKTsgLy8gY29tbWVudCIsCisgICAgICAgICAgICBmb3JtYXQoIlNvbWVGdW5jdGlvbihhLCAgICAgLy8gY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgYixcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgYyk7IC8vIGNvbW1lbnQiKSk7Cit9CisKIFRFU1RfRihGb3JtYXRUZXN0LCBDYW5Gb3JtYXRDb21tZW50c0xvY2FsbHkpIHsKICAgRVhQRUNUX0VRKCJpbnQgYTsgICAgLy8gY29tbWVudFxuIgogICAgICAgICAgICAgImludCAgICBiOyAvLyBjb21tZW50IiwKQEAgLTgyOSw2ICs4NzcsNDMgQEAKICAgICAgICAgICAgICAgICAgICAiaW50IGI7XG4iCiAgICAgICAgICAgICAgICAgICAgImludCAgIGM7IC8vIHVucmVsYXRlZCBjb21tZW50IiwKICAgICAgICAgICAgICAgICAgICAzMSwgMCwgZ2V0TExWTVN0eWxlKCkpKTsKKworICBFWFBFQ1RfRVEoImludCBhOyAvLyBUaGlzXG4iCisgICAgICAgICAgICAiICAgICAgIC8vIGlzXG4iCisgICAgICAgICAgICAiICAgICAgIC8vIGEiLAorICAgICAgICAgICAgZm9ybWF0KCJpbnQgYTsgICAgICAvLyBUaGlzXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIC8vIGlzXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIC8vIGEiLAorICAgICAgICAgICAgICAgICAgIDAsIDAsIGdldExMVk1TdHlsZSgpKSk7CisgIEVYUEVDVF9FUSgiaW50IGE7IC8vIFRoaXNcbiIKKyAgICAgICAgICAgICIgICAgICAgLy8gaXNcbiIKKyAgICAgICAgICAgICIgICAgICAgLy8gYVxuIgorICAgICAgICAgICAgIi8vIFRoaXMgaXMgYlxuIgorICAgICAgICAgICAgImludCBiOyIsCisgICAgICAgICAgICBmb3JtYXQoImludCBhOyAvLyBUaGlzXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgLy8gaXNcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAvLyBhXG4iCisgICAgICAgICAgICAgICAgICAgIi8vIFRoaXMgaXMgYlxuIgorICAgICAgICAgICAgICAgICAgICJpbnQgYjsiLAorICAgICAgICAgICAgICAgICAgIDAsIDAsIGdldExMVk1TdHlsZSgpKSk7CisgIEVYUEVDVF9FUSgiaW50IGE7IC8vIFRoaXNcbiIKKyAgICAgICAgICAgICIgICAgICAgLy8gaXNcbiIKKyAgICAgICAgICAgICIgICAgICAgLy8gYVxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIiAgLy8gVGhpcyBpcyB1bnJlbGF0ZWQiLAorICAgICAgICAgICAgZm9ybWF0KCJpbnQgYTsgLy8gVGhpc1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgIC8vIGlzXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgLy8gYVxuIgorICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAiICAvLyBUaGlzIGlzIHVucmVsYXRlZCIsCisgICAgICAgICAgICAgICAgICAgMCwgMCwgZ2V0TExWTVN0eWxlKCkpKTsKKyAgRVhQRUNUX0VRKCJpbnQgYTtcbiIKKyAgICAgICAgICAgICIvLyBUaGlzIGlzXG4iCisgICAgICAgICAgICAiLy8gbm90IGZvcm1hdHRlZC4gICAiLAorICAgICAgICAgICAgZm9ybWF0KCJpbnQgYTtcbiIKKyAgICAgICAgICAgICAgICAgICAiLy8gVGhpcyBpc1xuIgorICAgICAgICAgICAgICAgICAgICIvLyBub3QgZm9ybWF0dGVkLiAgICIsCisgICAgICAgICAgICAgICAgICAgMCwgMCwgZ2V0TExWTVN0eWxlKCkpKTsKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIFJlbW92ZXNUcmFpbGluZ1doaXRlc3BhY2VPZkNvbW1lbnRzKSB7CkBAIC04NDIsMTEgKzkyNywxMiBAQAogCiBURVNUX0YoRm9ybWF0VGVzdCwgVW5kZXJzdGFuZHNCbG9ja0NvbW1lbnRzKSB7CiAgIHZlcmlmeUZvcm1hdCgiZigvKm5vU3BhY2VBZnRlclBhcmFtZXRlck5hbWluZ0NvbW1lbnQ9Ki90cnVlKTsiKTsKLSAgRVhQRUNUX0VRKAotICAgICAgImYoYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSwgLyogVHJhaWxpbmcgY29tbWVudCBmb3IgYWEuLi4gKi9cbiIKLSAgICAgICIgIGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIpOyIsCi0gICAgICBmb3JtYXQoImYoYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSAsICAgXFxcbi8qIFRyYWlsaW5nIGNvbW1lbnQgZm9yIGFhLi4uICovXG4iCi0gICAgICAgICAgICAgIiAgYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYik7IikpOworICB2ZXJpZnlGb3JtYXQoInZvaWQgZigpIHsgZygvKmFhYT0qL3gsIC8qYmJiPSovIXkpOyB9Iik7CisgIEVYUEVDVF9FUSgiZihhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLCAvKiBUcmFpbGluZyBjb21tZW50IGZvciBhYS4uLiAqL1xuIgorICAgICAgICAgICAgIiAgYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYik7IiwKKyAgICAgICAgICAgIGZvcm1hdCgiZihhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhICwgICBcXFxuIgorICAgICAgICAgICAgICAgICAgICIvKiBUcmFpbGluZyBjb21tZW50IGZvciBhYS4uLiAqL1xuIgorICAgICAgICAgICAgICAgICAgICIgIGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIpOyIpKTsKICAgRVhQRUNUX0VRKAogICAgICAgImYoYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSxcbiIKICAgICAgICIgIC8qIExlYWRpbmcgY29tbWVudCBmb3IgYmIuLi4gKi8gYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYik7IiwKQEAgLTg2OSw2ICs5NTUsMTEgQEAKICAgICAgICAgICAgICAgICIgICAgICAgICAvKiBwYXJhbWV0ZXIgMyAqLyBhYWFhYWEsXG4iCiAgICAgICAgICAgICAgICAiICAgICAgICAgLyogcGFyYW1ldGVyIDQgKi8gYWFhYWFhKTsiLAogICAgICAgICAgICAgICAgTm9CaW5QYWNraW5nKTsKKworICAvLyBBbGlnbmluZyBibG9jayBjb21tZW50cyBpbiBtYWNyb3MuCisgIHZlcmlmeUdvb2dsZUZvcm1hdCgiI2RlZmluZSBBICAgICAgICBcXFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgaW50IGk7ICAgLyphKi8gXFxcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgIGludCBqamo7IC8qYiovIik7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBBbGlnbnNCbG9ja0NvbW1lbnRzKSB7CkBAIC05OTcsMTQgKzEwODgsMTQgQEAKICAgICAgICAgICAgIGZvcm1hdCgiLy8gQSBjb21tZW50IGJlZm9yZSBhIG1hY3JvIGRlZmluaXRpb25cbiIKICAgICAgICAgICAgICAgICAgICAiI2RlZmluZSBhIGIiLAogICAgICAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDIwKSkpOwotICBFWFBFQ1RfRVEoInZvaWQgZmZmZmZmKGludCBhYWFhYWFhYWEsICAvLyB3d3d3XG4iCi0gICAgICAgICAgICAiICAgICAgICAgICAgaW50IGEsIGludCBiYmIsIC8vIHh4eHh4eHhcbiIKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geXl5eXl5eXl5XG4iCi0gICAgICAgICAgICAiICAgICAgICAgICAgaW50IGMsIGludCBkLCBpbnQgZSkge30iLAorICBFWFBFQ1RfRVEoInZvaWRcbiIKKyAgICAgICAgICAgICJmZmZmZmYoaW50IGFhYWFhYWFhYSwgIC8vIHd3d3dcbiIKKyAgICAgICAgICAgICIgICAgICAgaW50IGJiYmJiYmJiYmIsIC8vIHh4eHh4eHhcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIC8vIHl5eXl5eXl5eXlcbiIKKyAgICAgICAgICAgICIgICAgICAgaW50IGMsIGludCBkLCBpbnQgZSkge30iLAogICAgICAgICAgICAgZm9ybWF0KCJ2b2lkIGZmZmZmZihcbiIKICAgICAgICAgICAgICAgICAgICAiICAgIGludCBhYWFhYWFhYWEsIC8vIHd3d3dcbiIKLSAgICAgICAgICAgICAgICAgICAiICAgIGludCBhLFxuIgotICAgICAgICAgICAgICAgICAgICIgICAgaW50IGJiYiwgLy8geHh4eHh4eCB5eXl5eXl5eXlcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIGludCBiYmJiYmJiYmJiLCAvLyB4eHh4eHh4IHl5eXl5eXl5eXlcbiIKICAgICAgICAgICAgICAgICAgICAiICAgIGludCBjLCBpbnQgZCwgaW50IGUpIHt9IiwKICAgICAgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucyg0MCkpKTsKICAgRVhQRUNUX0VRKCIvL1x0IGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIsCkBAIC0xMDIwLDYgKzExMTEsMjEgQEAKICAgICAgIGZvcm1hdCgiI2RlZmluZSBYWFggLy9xIHcgZSByIHQgeSB1IGkiLCBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucygyMikpKTsKIH0KIAorVEVTVF9GKEZvcm1hdFRlc3QsIFByZXNlcnZlc0hhbmdpbmdJbmRlbnRJbkN4eENvbW1lbnRzKSB7CisgIEVYUEVDVF9FUSgiLy8gICAgIEEgY29tbWVudFxuIgorICAgICAgICAgICAgIi8vICAgICB0aGF0IGRvZXNuJ3RcbiIKKyAgICAgICAgICAgICIvLyAgICAgZml0IG9uIG9uZVxuIgorICAgICAgICAgICAgIi8vICAgICBsaW5lIiwKKyAgICAgICAgICAgIGZvcm1hdCgiLy8gICAgIEEgY29tbWVudCB0aGF0IGRvZXNuJ3QgZml0IG9uIG9uZSBsaW5lIiwKKyAgICAgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucygyMCkpKTsKKyAgRVhQRUNUX0VRKCIvLy8gICAgIEEgY29tbWVudFxuIgorICAgICAgICAgICAgIi8vLyAgICAgdGhhdCBkb2Vzbid0XG4iCisgICAgICAgICAgICAiLy8vICAgICBmaXQgb24gb25lXG4iCisgICAgICAgICAgICAiLy8vICAgICBsaW5lIiwKKyAgICAgICAgICAgIGZvcm1hdCgiLy8vICAgICBBIGNvbW1lbnQgdGhhdCBkb2Vzbid0IGZpdCBvbiBvbmUgbGluZSIsCisgICAgICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMjApKSk7Cit9CisKIFRFU1RfRihGb3JtYXRUZXN0LCBEb250U3BsaXRMaW5lQ29tbWVudHNXaXRoRXNjYXBlZE5ld2xpbmVzKSB7CiAgIEVYUEVDVF9FUSgiLy8gYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXFxcbiIKICAgICAgICAgICAgICIvLyBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFcXFxuIgpAQCAtMTA0Niw2ICsxMTUyLDE3IEBACiAgICAgICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoNDkpKSk7CiB9CiAKK1RFU1RfRihGb3JtYXRUZXN0LCBEb250U3BsaXRMaW5lQ29tbWVudHNXaXRoUHJhZ21hcykgeworICBGb3JtYXRTdHlsZSBQcmFnbWFzID0gZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMzApOworICBQcmFnbWFzLkNvbW1lbnRQcmFnbWFzID0gIl4gSVdZVSBwcmFnbWE6IjsKKyAgRVhQRUNUX0VRKAorICAgICAgIi8vIElXWVUgcHJhZ21hOiBhYWFhYWFhYWFhYWFhYWFhYWEgYmJiYmJiYmJiYmJiYmIiLAorICAgICAgZm9ybWF0KCIvLyBJV1lVIHByYWdtYTogYWFhYWFhYWFhYWFhYWFhYWFhIGJiYmJiYmJiYmJiYmJiIiwgUHJhZ21hcykpOworICBFWFBFQ1RfRVEoCisgICAgICAiLyogSVdZVSBwcmFnbWE6IGFhYWFhYWFhYWFhYWFhYWFhYSBiYmJiYmJiYmJiYmJiYiAqLyIsCisgICAgICBmb3JtYXQoIi8qIElXWVUgcHJhZ21hOiBhYWFhYWFhYWFhYWFhYWFhYWEgYmJiYmJiYmJiYmJiYmIgKi8iLCBQcmFnbWFzKSk7Cit9CisKIFRFU1RfRihGb3JtYXRUZXN0LCBQcmlvcml0eU9mQ29tbWVudEJyZWFraW5nKSB7CiAgIEVYUEVDVF9FUSgiaWYgKHh4eCA9PVxuIgogICAgICAgICAgICAgIiAgICAgICAgeXl5ICYmIC8vIGFhYWFhYWFhYWFhYSBiYmJiYmJiYmJcbiIKQEAgLTEwNjgsOSArMTE4NSw5IEBACiAgICAgICAgICAgICBmb3JtYXQoImlmICh4eHh4eHh4eHh4ICYmIHl5eSB8fCAvLyBhYWFhYWEgYmJiYmJiYmIgY2NjY1xuIgogICAgICAgICAgICAgICAgICAgICIgICAgenp6KSBxKCk7IiwKICAgICAgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucyg0MCkpKTsKLSAgRVhQRUNUX0VRKCJmZmZmZmZmZmYoJnh4eCwgLy8gYWFhYWFhYWFhYWFhXG4iCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgIC8vIGJiYmJiYmJiYmJiXG4iCi0gICAgICAgICAgICAiICAgICAgICAgIHp6eik7IiwKKyAgRVhQRUNUX0VRKCJmZmZmZmZmZmYoXG4iCisgICAgICAgICAgICAiICAgICZ4eHgsIC8vIGFhYWFhYWFhYWFhYSBiYmJiYmJiYmJiYlxuIgorICAgICAgICAgICAgIiAgICB6enopOyIsCiAgICAgICAgICAgICBmb3JtYXQoImZmZmZmZmZmZigmeHh4LCAvLyBhYWFhYWFhYWFhYWEgYmJiYmJiYmJiYmJcbiIKICAgICAgICAgICAgICAgICAgICAiIHp6eik7IiwKICAgICAgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucyg0MCkpKTsKQEAgLTEzMDksMjEgKzE0MjYsMjEgQEAKIAogVEVTVF9GKEZvcm1hdFRlc3QsIENvbW1lbnRzSW5TdGF0aWNJbml0aWFsaXplcnMpIHsKICAgRVhQRUNUX0VRKAotICAgICAgInN0YXRpYyBTb21lVHlwZSB0eXBlID0geyBhYWFhYWFhYWFhYWFhYWFhYWFhYSwgLyogY29tbWVudCAqL1xuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYSAvKiBjb21tZW50ICovLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tZW50ICovIGFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYSwgLy8gY29tbWVudFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYSB9OyIsCisgICAgICAic3RhdGljIFNvbWVUeXBlIHR5cGUgPSB7YWFhYWFhYWFhYWFhYWFhYWFhYWEsIC8qIGNvbW1lbnQgKi9cbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYSAvKiBjb21tZW50ICovLFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1lbnQgKi8gYWFhYWFhYWFhYWFhYWFhYWFhYWEsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWEsIC8vIGNvbW1lbnRcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYX07IiwKICAgICAgIGZvcm1hdCgic3RhdGljIFNvbWVUeXBlIHR5cGUgPSB7IGFhYWFhYWFhYWFhYWFhYWFhYWFhICAsICAvKiBjb21tZW50ICovXG4iCiAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYSAgIC8qIGNvbW1lbnQgKi8gLFxuIgogICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAvKiBjb21tZW50ICovICAgYWFhYWFhYWFhYWFhYWFhYWFhYWEgLFxuIgogICAgICAgICAgICAgICIgICAgICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhICwgICAvLyBjb21tZW50XG4iCiAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhIH07IikpOwotICB2ZXJpZnlGb3JtYXQoInN0YXRpYyBTb21lVHlwZSB0eXBlID0geyBhYWFhYWFhYWFhYSwgLy8gY29tbWVudCBmb3IgYWEuLi5cbiIKLSAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgYmJiYmJiYmJiYmIsIGNjY2NjY2NjY2NjIH07Iik7Ci0gIHZlcmlmeUZvcm1hdCgic3RhdGljIFNvbWVUeXBlIHR5cGUgPSB7IGFhYWFhYWFhYWFhLFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tZW50IGZvciBiYi4uLi5cbiIKLSAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgYmJiYmJiYmJiYmIsIGNjY2NjY2NjY2NjIH07Iik7CisgIHZlcmlmeUZvcm1hdCgic3RhdGljIFNvbWVUeXBlIHR5cGUgPSB7YWFhYWFhYWFhYWEsIC8vIGNvbW1lbnQgZm9yIGFhLi4uXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgYmJiYmJiYmJiYmIsIGNjY2NjY2NjY2NjfTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJzdGF0aWMgU29tZVR5cGUgdHlwZSA9IHthYWFhYWFhYWFhYSxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tZW50IGZvciBiYi4uLi5cbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBiYmJiYmJiYmJiYiwgY2NjY2NjY2NjY2N9OyIpOwogICB2ZXJpZnlHb29nbGVGb3JtYXQoCiAgICAgICAic3RhdGljIFNvbWVUeXBlIHR5cGUgPSB7YWFhYWFhYWFhYWEsICAvLyBjb21tZW50IGZvciBhYS4uLlxuIgogICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIGJiYmJiYmJiYmJiLCBjY2NjY2NjY2NjY307Iik7CkBAIC0xMzMxLDIzICsxNDQ4LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWVudCBmb3IgYmIuLi4uXG4iCiAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgYmJiYmJiYmJiYmIsIGNjY2NjY2NjY2NjfTsiKTsKIAotICB2ZXJpZnlGb3JtYXQoIlMgcyA9IHsgeyBhLCBiLCBjIH0sICAgLy8gR3JvdXAgIzFcbiIKLSAgICAgICAgICAgICAgICIgICAgICAgIHsgZCwgZSwgZiB9LCAgIC8vIEdyb3VwICMyXG4iCi0gICAgICAgICAgICAgICAiICAgICAgICB7IGcsIGgsIGkgfSB9OyAvLyBHcm91cCAjMyIpOwotICB2ZXJpZnlGb3JtYXQoIlMgcyA9IHsgeyAvLyBHcm91cCAjMVxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICBhLCBiLCBjIH0sXG4iCi0gICAgICAgICAgICAgICAiICAgICAgICB7IC8vIEdyb3VwICMyXG4iCi0gICAgICAgICAgICAgICAiICAgICAgICAgIGQsIGUsIGYgfSxcbiIKLSAgICAgICAgICAgICAgICIgICAgICAgIHsgLy8gR3JvdXAgIzNcbiIKLSAgICAgICAgICAgICAgICIgICAgICAgICAgZywgaCwgaSB9IH07Iik7CisgIHZlcmlmeUZvcm1hdCgiUyBzID0ge3thLCBiLCBjfSwgIC8vIEdyb3VwICMxXG4iCisgICAgICAgICAgICAgICAiICAgICAgIHtkLCBlLCBmfSwgIC8vIEdyb3VwICMyXG4iCisgICAgICAgICAgICAgICAiICAgICAgIHtnLCBoLCBpfX07IC8vIEdyb3VwICMzIik7CisgIHZlcmlmeUZvcm1hdCgiUyBzID0ge3svLyBHcm91cCAjMVxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgYSwgYiwgY30sXG4iCisgICAgICAgICAgICAgICAiICAgICAgIHsvLyBHcm91cCAjMlxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgZCwgZSwgZn0sXG4iCisgICAgICAgICAgICAgICAiICAgICAgIHsvLyBHcm91cCAjM1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgZywgaCwgaX19OyIpOwogCiAgIEVYUEVDVF9FUSgiUyBzID0ge1xuIgotICAgICAgICAgICAgIiAgLy8gU29tZSBjb21tZW50XG4iCi0gICAgICAgICAgICAiICBhLFxuIgorICAgICAgICAgICAgIiAgICAvLyBTb21lIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICIgICAgYSxcbiIKICAgICAgICAgICAgICJcbiIKLSAgICAgICAgICAgICIgIC8vIENvbW1lbnQgYWZ0ZXIgZW1wdHkgbGluZVxuIgotICAgICAgICAgICAgIiAgYlxuIgotICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgIiAgICAvLyBDb21tZW50IGFmdGVyIGVtcHR5IGxpbmVcbiIKKyAgICAgICAgICAgICIgICAgYn0iLAogICAgICAgICAgICAgZm9ybWF0KCJTIHMgPSAgICB7XG4iCiAgICAgICAgICAgICAgICAgICAgIiAgICAgIC8vIFNvbWUgY29tbWVudFxuIgogICAgICAgICAgICAgICAgICAgICIgIGEsXG4iCkBAIC0xMzU2LDEyICsxNDcyLDExIEBACiAgICAgICAgICAgICAgICAgICAgIiAgICAgIGJcbiIKICAgICAgICAgICAgICAgICAgICAifSIpKTsKICAgRVhQRUNUX0VRKCJTIHMgPSB7XG4iCi0gICAgICAgICAgICAiICAvKiBTb21lIGNvbW1lbnQgKi9cbiIKLSAgICAgICAgICAgICIgIGEsXG4iCisgICAgICAgICAgICAiICAgIC8qIFNvbWUgY29tbWVudCAqL1xuIgorICAgICAgICAgICAgIiAgICBhLFxuIgogICAgICAgICAgICAgIlxuIgotICAgICAgICAgICAgIiAgLyogQ29tbWVudCBhZnRlciBlbXB0eSBsaW5lICovXG4iCi0gICAgICAgICAgICAiICBiXG4iCi0gICAgICAgICAgICAifSIsCisgICAgICAgICAgICAiICAgIC8qIENvbW1lbnQgYWZ0ZXIgZW1wdHkgbGluZSAqL1xuIgorICAgICAgICAgICAgIiAgICBifSIsCiAgICAgICAgICAgICBmb3JtYXQoIlMgcyA9ICAgIHtcbiIKICAgICAgICAgICAgICAgICAgICAiICAgICAgLyogU29tZSBjb21tZW50ICovXG4iCiAgICAgICAgICAgICAgICAgICAgIiAgYSxcbiIKQEAgLTEzNzAsMTAgKzE0ODUsOSBAQAogICAgICAgICAgICAgICAgICAgICIgICAgICBiXG4iCiAgICAgICAgICAgICAgICAgICAgIn0iKSk7CiAgIHZlcmlmeUZvcm1hdCgiY29uc3QgdWludDhfdCBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhWzBdID0ge1xuIgotICAgICAgICAgICAgICAgIiAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gY29tbWVudFxuIgotICAgICAgICAgICAgICAgIiAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gY29tbWVudFxuIgotICAgICAgICAgICAgICAgIiAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCAgICAgICAgICAgICAgLy8gY29tbWVudFxuIgotICAgICAgICAgICAgICAgIn07Iik7CisgICAgICAgICAgICAgICAiICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8vIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICIgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLy8gY29tbWVudFxuIgorICAgICAgICAgICAgICAgIiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwfTsgICAgICAgICAgICAvLyBjb21tZW50XG4iKTsKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIElnbm9yZXNJZjBDb250ZW50cykgewpAQCAtMTUzNiw2ICsxNjUwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAiIHByaXZhdGU6XG4iCiAgICAgICAgICAgICAgICAgICAgICAiICB2b2lkIGYoKSB7fVxuIgogICAgICAgICAgICAgICAgICAgICAgIn07Iik7CisgIHZlcmlmeUZvcm1hdCgiY2xhc3MgQSB7XG4iCisgICAgICAgICAgICAgICAicHVibGljIHNsb3RzOlxuIgorICAgICAgICAgICAgICAgIiAgdm9pZCBmKCkge31cbiIKKyAgICAgICAgICAgICAgICJwdWJsaWMgUV9TTE9UUzpcbiIKKyAgICAgICAgICAgICAgICIgIHZvaWQgZigpIHt9XG4iCisgICAgICAgICAgICAgICAifTsiKTsKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIFNlcGFyYXRlc0xvZ2ljYWxCbG9ja3MpIHsKQEAgLTE2MDEsNiArMTcyMSw5IEBACiAgIHZlcmlmeUZvcm1hdCgic3RydWN0IGFhYWFhYWFhYWFhYWFhYWFhYWFhXG4iCiAgICAgICAgICAgICAgICAiICAgIDogcHVibGljIGFhYWFhYWFhYWFhYWFhYWFhYWE8YWFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWE+IHt9OyIpOworICB2ZXJpZnlGb3JtYXQoInRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDPlxuIgorICAgICAgICAgICAgICAgInN0cnVjdCBBYWFhYWFhYWFhYWFhYWFhYTxSIChDOjoqKShpbnQpIGNvbnN0PlxuIgorICAgICAgICAgICAgICAgIiAgICA6IEFhYWFhYWFhYWFhYWFhYWFhPFIgKEM6OiopKGludCk+IHt9OyIpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgRm9ybWF0c1ZhcmlhYmxlRGVjbGFyYXRpb25zQWZ0ZXJTdHJ1Y3RPckNsYXNzKSB7CkBAIC0xNjM0LDE4ICsxNzU3LDIyIEBACiAgIHZlcmlmeUZvcm1hdCgiZW51bSBYIGYoKSB7XG4gIGEoKTtcbiAgcmV0dXJuIDQyO1xufSIpOwogICB2ZXJpZnlGb3JtYXQoImVudW0ge1xuIgogICAgICAgICAgICAgICAgIiAgQmFyID0gRm9vPGludCwgaW50Pjo6dmFsdWVcbiIKLSAgICAgICAgICAgICAgICJ9OyIpOworICAgICAgICAgICAgICAgIn07IiwKKyAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDMwKSk7CisKKyAgdmVyaWZ5Rm9ybWF0KCJlbnVtIFNob3J0RW51bSB7IEEsIEIsIEMgfTsiKTsKKyAgdmVyaWZ5R29vZ2xlRm9ybWF0KCJlbnVtIFNob3J0RW51bSB7IEEsIEIsIEMgfTsiKTsKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIEZvcm1hdHNFbnVtc1dpdGhFcnJvcnMpIHsKICAgdmVyaWZ5Rm9ybWF0KCJlbnVtIFR5cGUge1xuIgotICAgICAgICAgICAgICAgIiAgT25lID0gMDtcbiIgLy8gVGhlc2Ugc2VtaWNvbG9ucyBzaG91bGQgYmUgY29tbWFzLgorICAgICAgICAgICAgICAgIiAgT25lID0gMDsgLy8gVGhlc2Ugc2VtaWNvbG9ucyBzaG91bGQgYmUgY29tbWFzLlxuIgogICAgICAgICAgICAgICAgIiAgVHdvID0gMTtcbiIKICAgICAgICAgICAgICAgICJ9OyIpOwogICB2ZXJpZnlGb3JtYXQoIm5hbWVzcGFjZSBuIHtcbiIKICAgICAgICAgICAgICAgICJlbnVtIFR5cGUge1xuIgogICAgICAgICAgICAgICAgIiAgT25lLFxuIgotICAgICAgICAgICAgICAgIiAgVHdvLFxuIiAvLyBtaXNzaW5nIH07CisgICAgICAgICAgICAgICAiICBUd28sIC8vIG1pc3NpbmcgfTtcbiIKICAgICAgICAgICAgICAgICIgIGludCBpO1xuIgogICAgICAgICAgICAgICAgIn1cbiIKICAgICAgICAgICAgICAgICJ2b2lkIGcoKSB7fSIpOwpAQCAtMTY4NywxMyArMTgxNCwyMyBAQAogCiBURVNUX0YoRm9ybWF0VGVzdCwgRm9ybWF0c0VudW1UeXBlcykgewogICB2ZXJpZnlGb3JtYXQoImVudW0gWCA6IGludCB7XG4iCi0gICAgICAgICAgICAgICAiICBBLFxuIgorICAgICAgICAgICAgICAgIiAgQSwgLy8gRm9yY2UgbXVsdGlwbGUgbGluZXMuXG4iCiAgICAgICAgICAgICAgICAiICBCXG4iCiAgICAgICAgICAgICAgICAifTsiKTsKLSAgdmVyaWZ5Rm9ybWF0KCJlbnVtIFggOiBzdGQ6OnVpbnQzMl90IHtcbiIKLSAgICAgICAgICAgICAgICIgIEEsXG4iCi0gICAgICAgICAgICAgICAiICBCXG4iCi0gICAgICAgICAgICAgICAifTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJlbnVtIFggOiBpbnQgeyBBLCBCIH07Iik7CisgIHZlcmlmeUZvcm1hdCgiZW51bSBYIDogc3RkOjp1aW50MzJfdCB7IEEsIEIgfTsiKTsKK30KKworVEVTVF9GKEZvcm1hdFRlc3QsIEZvcm1hdHNOU0VudW1zKSB7CisgIHZlcmlmeUdvb2dsZUZvcm1hdCgidHlwZWRlZiBOU19FTlVNKE5TSW50ZWdlciwgU29tZU5hbWUpIHsgQUFBLCBCQkIgfSIpOworICB2ZXJpZnlHb29nbGVGb3JtYXQoInR5cGVkZWYgTlNfRU5VTShOU0ludGVnZXIsIE15VHlwZSkge1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgLy8gSW5mb3JtYXRpb24gYWJvdXQgc29tZURlY2VudGx5TG9uZ1ZhbHVlLlxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgc29tZURlY2VudGx5TG9uZ1ZhbHVlLFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgLy8gSW5mb3JtYXRpb24gYWJvdXQgYW5vdGhlckRlY2VudGx5TG9uZ1ZhbHVlLlxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgYW5vdGhlckRlY2VudGx5TG9uZ1ZhbHVlLFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgLy8gSW5mb3JtYXRpb24gYWJvdXQgYVRoaXJkRGVjZW50bHlMb25nVmFsdWUuXG4iCisgICAgICAgICAgICAgICAgICAgICAiICBhVGhpcmREZWNlbnRseUxvbmdWYWx1ZVxuIgorICAgICAgICAgICAgICAgICAgICAgIn07Iik7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBGb3JtYXRzQml0ZmllbGRzKSB7CkBAIC0xNzI2LDcgKzE4NjMsNyBAQAogCiAgIC8vIFRoaXMgY29kZSBpcyBtb3JlIGNvbW1vbiB0aGFuIHdlIHRob3VnaHQ7IGlmIHdlCiAgIC8vIGxheW91dCB0aGlzIGNvcnJlY3RseSB0aGUgc2VtaWNvbG9uIHdpbGwgZ28gaW50bwotICAvLyBpdHMgb3duIGxpbmUsIHdoaWNoIGlzIHVuZGVzaXJlYWJsZS4KKyAgLy8gaXRzIG93biBsaW5lLCB3aGljaCBpcyB1bmRlc2lyYWJsZS4KICAgdmVyaWZ5Rm9ybWF0KCJuYW1lc3BhY2Uge307Iik7CiAgIHZlcmlmeUZvcm1hdCgibmFtZXNwYWNlIHtcbiIKICAgICAgICAgICAgICAgICJjbGFzcyBBIHt9O1xuIgpAQCAtMTgzMiw5NiArMTk2OSw5MCBAQAogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgU3RhdGljSW5pdGlhbGl6ZXJzKSB7Ci0gIHZlcmlmeUZvcm1hdCgic3RhdGljIFNvbWVDbGFzcyBTQyA9IHsgMSwgJ2EnIH07Iik7CisgIHZlcmlmeUZvcm1hdCgic3RhdGljIFNvbWVDbGFzcyBTQyA9IHsxLCAnYSd9OyIpOwogCiAgIHZlcmlmeUZvcm1hdCgKICAgICAgICJzdGF0aWMgU29tZUNsYXNzIFdpdGhBTG9vb29vb29vb29vb29vb29vb29vbmdOYW1lID0ge1xuIgotICAgICAgIiAgMTAwMDAwMDAwLCBcImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXCJcbiIKLSAgICAgICJ9OyIpOworICAgICAgIiAgICAxMDAwMDAwMDAsIFwiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFcIn07Iik7CiAKICAgLy8gSGVyZSwgZXZlcnl0aGluZyBvdGhlciB0aGFuIHRoZSAifSIgd291bGQgZml0IG9uIGEgbGluZS4KICAgdmVyaWZ5Rm9ybWF0KCJzdGF0aWMgaW50IExvb29vb29vb29vb29vb29vb29vb29vb29vbmdWYXJpYWJsZVsxXSA9IHtcbiIKLSAgICAgICAgICAgICAgICIgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFxuIgotICAgICAgICAgICAgICAgIn07Iik7Ci0gIEVYUEVDVF9FUSgiUyBzID0geyBhLCBiIH07IiwgZm9ybWF0KCJTIHMgPSB7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGEsXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgYlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifTsiKSk7CisgICAgICAgICAgICAgICAiICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwfTsiKTsKKyAgRVhQRUNUX0VRKCJTIHMgPSB7YSwgYn07IiwgZm9ybWF0KCJTIHMgPSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBhLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgYlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn07IikpOwogCiAgIC8vIEZJWE1FOiBUaGlzIHdvdWxkIGZpdCBpbnRvIHRoZSBjb2x1bW4gbGltaXQgaWYgd2UnZCBmaXQgInsgeyIgb24gdGhlIGZpcnN0CiAgIC8vIGxpbmUuIEhvd2V2ZXIsIHRoZSBmb3JtYXR0aW5nIGxvb2tzIGEgYml0IG9mZiBhbmQgdGhpcyBwcm9iYWJseSBkb2Vzbid0CiAgIC8vIGhhcHBlbiBvZnRlbiBpbiBwcmFjdGljZS4KICAgdmVyaWZ5Rm9ybWF0KCJzdGF0aWMgaW50IFZhcmlhYmxlWzFdID0ge1xuIgotICAgICAgICAgICAgICAgIiAgeyAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIH1cbiIKLSAgICAgICAgICAgICAgICJ9OyIsCisgICAgICAgICAgICAgICAiICAgIHsxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwfX07IiwKICAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDQwKSk7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBEZXNpZ25hdGVkSW5pdGlhbGl6ZXJzKSB7Ci0gIHZlcmlmeUZvcm1hdCgiY29uc3Qgc3RydWN0IEEgYSA9IHsgLmEgPSAxLCAuYiA9IDIgfTsiKTsKLSAgdmVyaWZ5Rm9ybWF0KCJjb25zdCBzdHJ1Y3QgQSBhID0geyAuYWFhYWFhYWFhYSA9IDEsXG4iCi0gICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgLmJiYmJiYmJiYmIgPSAyLFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIC5jY2NjY2NjY2NjID0gMyxcbiIKLSAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAuZGRkZGRkZGRkZCA9IDQsXG4iCi0gICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgLmVlZWVlZWVlZWUgPSA1IH07Iik7CisgIHZlcmlmeUZvcm1hdCgiY29uc3Qgc3RydWN0IEEgYSA9IHsuYSA9IDEsIC5iID0gMn07Iik7CisgIHZlcmlmeUZvcm1hdCgiY29uc3Qgc3RydWN0IEEgYSA9IHsuYWFhYWFhYWFhYSA9IDEsXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAuYmJiYmJiYmJiYiA9IDIsXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAuY2NjY2NjY2NjYyA9IDMsXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAuZGRkZGRkZGRkZCA9IDQsXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAuZWVlZWVlZWVlZSA9IDV9OyIpOwogICB2ZXJpZnlGb3JtYXQoImNvbnN0IHN0cnVjdCBBYWFhYWFhYWFhYWFhYWFhIGFhYWFhYWFhYWFhYWFhYWFhYSA9IHtcbiIKLSAgICAgICAgICAgICAgICIgIC5hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEgPSAxLFxuIgotICAgICAgICAgICAgICAgIiAgLmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiA9IDIsXG4iCi0gICAgICAgICAgICAgICAiICAuY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjID0gMyxcbiIKLSAgICAgICAgICAgICAgICIgIC5kZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQgPSA0LFxuIgotICAgICAgICAgICAgICAgIiAgLmVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZSA9IDVcbiIKLSAgICAgICAgICAgICAgICJ9OyIpOworICAgICAgICAgICAgICAgIiAgICAuYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhID0gMSxcbiIKKyAgICAgICAgICAgICAgICIgICAgLmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiA9IDIsXG4iCisgICAgICAgICAgICAgICAiICAgIC5jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MgPSAzLFxuIgorICAgICAgICAgICAgICAgIiAgICAuZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkID0gNCxcbiIKKyAgICAgICAgICAgICAgICIgICAgLmVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZSA9IDV9OyIpOwogCiAgIHZlcmlmeUdvb2dsZUZvcm1hdCgiY29uc3Qgc3RydWN0IEEgYSA9IHsuYSA9IDEsIC5iID0gMn07Iik7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBOZXN0ZWRTdGF0aWNJbml0aWFsaXplcnMpIHsKLSAgdmVyaWZ5Rm9ybWF0KCJzdGF0aWMgQSB4ID0geyB7IHt9IH0gfTtcbiIpOwotICB2ZXJpZnlGb3JtYXQoInN0YXRpYyBBIHggPSB7IHsgeyBpbml0MSwgaW5pdDIsIGluaXQzLCBpbml0NCB9LFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgeyBpbml0MSwgaW5pdDIsIGluaXQzLCBpbml0NCB9IH0gfTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJzdGF0aWMgQSB4ID0ge3t7fX19O1xuIik7CisgIHZlcmlmeUZvcm1hdCgic3RhdGljIEEgeCA9IHt7e2luaXQxLCBpbml0MiwgaW5pdDMsIGluaXQ0fSxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICB7aW5pdDEsIGluaXQyLCBpbml0MywgaW5pdDR9fX07IiwKKyAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDUwKSk7CiAKICAgdmVyaWZ5Rm9ybWF0KCJzb21lcyBTdGF0dXM6Omdsb2JhbF9yZXBzWzNdID0ge1xuIgotICAgICAgICAgICAgICAgIiAgeyBrR2xvYmFsUmVmLCBPS19DT0RFLCBOVUxMLCBOVUxMLCBOVUxMIH0sXG4iCi0gICAgICAgICAgICAgICAiICB7IGtHbG9iYWxSZWYsIENBTkNFTExFRF9DT0RFLCBOVUxMLCBOVUxMLCBOVUxMIH0sXG4iCi0gICAgICAgICAgICAgICAiICB7IGtHbG9iYWxSZWYsIFVOS05PV05fQ09ERSwgTlVMTCwgTlVMTCwgTlVMTCB9XG4iCi0gICAgICAgICAgICAgICAifTsiKTsKKyAgICAgICAgICAgICAgICIgICAge2tHbG9iYWxSZWYsIE9LX0NPREUsIE5VTEwsIE5VTEwsIE5VTEx9LFxuIgorICAgICAgICAgICAgICAgIiAgICB7a0dsb2JhbFJlZiwgQ0FOQ0VMTEVEX0NPREUsIE5VTEwsIE5VTEwsIE5VTEx9LFxuIgorICAgICAgICAgICAgICAgIiAgICB7a0dsb2JhbFJlZiwgVU5LTk9XTl9DT0RFLCBOVUxMLCBOVUxMLCBOVUxMfX07IiwKKyAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDYwKSk7CiAgIHZlcmlmeUdvb2dsZUZvcm1hdCgiU29tZVR5cGUgU3RhdHVzOjpnbG9iYWxfcmVwc1szXSA9IHtcbiIKICAgICAgICAgICAgICAgICAgICAgICIgICAge2tHbG9iYWxSZWYsIE9LX0NPREUsIE5VTEwsIE5VTEwsIE5VTEx9LFxuIgogICAgICAgICAgICAgICAgICAgICAgIiAgICB7a0dsb2JhbFJlZiwgQ0FOQ0VMTEVEX0NPREUsIE5VTEwsIE5VTEwsIE5VTEx9LFxuIgogICAgICAgICAgICAgICAgICAgICAgIiAgICB7a0dsb2JhbFJlZiwgVU5LTk9XTl9DT0RFLCBOVUxMLCBOVUxMLCBOVUxMfX07Iik7CiAgIHZlcmlmeUZvcm1hdCgKLSAgICAgICJDR1JlY3QgY2dfcmVjdCA9IHsgeyByZWN0LmZMZWZ0LCByZWN0LmZUb3AgfSxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgeyByZWN0LmZSaWdodCAtIHJlY3QuZkxlZnQsIHJlY3QuZkJvdHRvbSAtIHJlY3QuZlRvcCIKLSAgICAgICIgfSB9OyIpOworICAgICAgIkNHUmVjdCBjZ19yZWN0ID0ge3tyZWN0LmZMZWZ0LCByZWN0LmZUb3B9LFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgIHtyZWN0LmZSaWdodCAtIHJlY3QuZkxlZnQsIHJlY3QuZkJvdHRvbSAtIHJlY3QuZlRvcH19OyIpOwogCiAgIHZlcmlmeUZvcm1hdCgKLSAgICAgICJTb21lQXJyYXlPZlNvbWVUeXBlIGEgPSB7IHsgeyAxLCAyLCAzIH0sIHsgMSwgMiwgMyB9LFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIsXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzIH0sXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMSwgMiwgMyB9LCB7IDEsIDIsIDMgfSB9IH07Iik7Ci0gIHZlcmlmeUZvcm1hdCgKLSAgICAgICJTb21lQXJyYXlPZlNvbWVUeXBlIGEgPSB7IHsgeyAxLCAyLCAzIH0gfSwgeyB7IDEsIDIsIDMgfSB9LFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB7IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIsXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzIH0gfSxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgIHsgeyAxLCAyLCAzIH0gfSwgeyB7IDEsIDIsIDMgfSB9IH07Iik7Ci0gIHZlcmlmeUdvb2dsZUZvcm1hdCgKICAgICAgICJTb21lQXJyYXlPZlNvbWVUeXBlIGEgPSB7XG4iCi0gICAgICAiICAgIHt7MSwgMiwgM319LCB7ezEsIDIsIDN9fSxcbiIKKyAgICAgICIgICAge3sxLCAyLCAzfSxcbiIKKyAgICAgICIgICAgIHsxLCAyLCAzfSxcbiIKKyAgICAgICIgICAgIHsxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEsIDIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMixcbiIKKyAgICAgICIgICAgICAzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzN9LFxuIgorICAgICAgIiAgICAgezEsIDIsIDN9LFxuIgorICAgICAgIiAgICAgezEsIDIsIDN9fX07Iik7CisgIHZlcmlmeUZvcm1hdCgKKyAgICAgICJTb21lQXJyYXlPZlNvbWVUeXBlIGEgPSB7XG4iCisgICAgICAiICAgIHt7MSwgMiwgM319LFxuIgorICAgICAgIiAgICB7ezEsIDIsIDN9fSxcbiIKICAgICAgICIgICAge3sxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEsIDIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMixcbiIKICAgICAgICIgICAgICAzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzN9fSxcbiIKLSAgICAgICIgICAge3sxLCAyLCAzfX0sIHt7MSwgMiwgM319fTsiKTsKKyAgICAgICIgICAge3sxLCAyLCAzfX0sXG4iCisgICAgICAiICAgIHt7MSwgMiwgM319fTsiKTsKIAogICB2ZXJpZnlGb3JtYXQoCiAgICAgICAic3RydWN0IHtcbiIKICAgICAgICIgIHVuc2lnbmVkIGJpdDtcbiIKICAgICAgICIgIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWU7XG4iCi0gICAgICAifSBrQml0c1RvT3NbXSA9IHsgeyBrT3NNYWMsIFwiTWFjXCIgfSxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICB7IGtPc1dpbiwgXCJXaW5kb3dzXCIgfSxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICB7IGtPc0xpbnV4LCBcIkxpbnV4XCIgfSxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICB7IGtPc0NyT1MsIFwiQ2hyb21lIE9TXCIgfSB9OyIpOworICAgICAgIn0ga0JpdHNUb09zW10gPSB7e2tPc01hYywgXCJNYWNcIn0sXG4iCisgICAgICAiICAgICAgICAgICAgICAgICB7a09zV2luLCBcIldpbmRvd3NcIn0sXG4iCisgICAgICAiICAgICAgICAgICAgICAgICB7a09zTGludXgsIFwiTGludXhcIn0sXG4iCisgICAgICAiICAgICAgICAgICAgICAgICB7a09zQ3JPUywgXCJDaHJvbWUgT1NcIn19OyIpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgRm9ybWF0c1NtYWxsTWFjcm9EZWZpbml0aW9uc0luU2luZ2xlTGluZSkgewpAQCAtMTk3OCw2ICsyMTA5LDEwIEBACiAgIHZlcmlmeUZvcm1hdCgiI2RlZmluZSBBICcncXFxIik7CiAgIHZlcmlmeUZvcm1hdCgiI2RlZmluZSBBIGBxcXEiKTsKICAgdmVyaWZ5Rm9ybWF0KCJmKFwiYWFhYSwgYmJiYiwgXCJcXFwiY2NjY2NcXFwiXCIpOyIpOworICBFWFBFQ1RfRVEoImNvbnN0IGNoYXIgKmMgPSBTVFJJTkdJRlkoXG4iCisgICAgICAgICAgICAiXFxuYSA6IGIpOyIsCisgICAgICAgICAgICBmb3JtYXQoImNvbnN0IGNoYXIgKiBjID0gU1RSSU5HSUZZKFxuIgorICAgICAgICAgICAgICAgICAgICJcXG5hIDogYik7IikpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgSW5kZW50c1BQRGlyZWN0aXZlSW5SZWR1Y2VkU3BhY2UpIHsKQEAgLTIwNzcsNyArMjIxMiw4IEBACiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBSZXNwZWN0V2hpdGVzcGFjZUluTWFjcm9EZWZpbml0aW9ucykgewotICB2ZXJpZnlGb3JtYXQoIiNkZWZpbmUgQSAoMSkiKTsKKyAgRVhQRUNUX0VRKCIjZGVmaW5lIEEgKHgpIiwgZm9ybWF0KCIjZGVmaW5lIEEgKHgpIikpOworICBFWFBFQ1RfRVEoIiNkZWZpbmUgQSh4KSIsIGZvcm1hdCgiI2RlZmluZSBBKHgpIikpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgRW1wdHlMaW5lc0luTWFjcm9EZWZpbml0aW9ucykgewpAQCAtMjE4MSw2ICsyMzE3LDE3IEBACiAgICAgICAgICAgICAgICAgICAgIiAgSVBDX0VORF9NRVNTQUdFX01BUCgpXG4iCiAgICAgICAgICAgICAgICAgICAgIn0iKSk7CiAKKyAgLy8gU2FtZSBpbnNpZGUgbWFjcm9zLgorICBFWFBFQ1RfRVEoIiNkZWZpbmUgTElTVChMKSBcXFxuIgorICAgICAgICAgICAgIiAgTChBKSAgICAgICAgICBcXFxuIgorICAgICAgICAgICAgIiAgTChCKSAgICAgICAgICBcXFxuIgorICAgICAgICAgICAgIiAgTChDKSIsCisgICAgICAgICAgICBmb3JtYXQoIiNkZWZpbmUgTElTVChMKSBcXFxuIgorICAgICAgICAgICAgICAgICAgICIgIEwoQSkgXFxcbiIKKyAgICAgICAgICAgICAgICAgICAiICBMKEIpIFxcXG4iCisgICAgICAgICAgICAgICAgICAgIiAgTChDKSIsCisgICAgICAgICAgICAgICAgICAgZ2V0R29vZ2xlU3R5bGUoKSkpOworCiAgIC8vIFRoZXNlIG11c3Qgbm90IGJlIHJlY29nbml6ZWQgYXMgbWFjcm9zLgogICBFWFBFQ1RfRVEoImludCBxKCkge1xuIgogICAgICAgICAgICAgIiAgZih4KTtcbiIKQEAgLTIyMjUsMzAgKzIzNzIsMzAgQEAKICAgICAgICAgICAgICAgICAgICAiICBpZnN0cmVhbSh4KVxuID4+IHg7XG4iCiAgICAgICAgICAgICAgICAgICAgIn1cbiIpKTsKICAgRVhQRUNUX0VRKCJpbnQgcSgpIHtcbiIKLSAgICAgICAgICAgICIgIGYoeClcbiIKKyAgICAgICAgICAgICIgIEYoeClcbiIKICAgICAgICAgICAgICIgIGlmICgxKSB7XG4iCiAgICAgICAgICAgICAiICB9XG4iCi0gICAgICAgICAgICAiICBmKHgpXG4iCisgICAgICAgICAgICAiICBGKHgpXG4iCiAgICAgICAgICAgICAiICB3aGlsZSAoMSkge1xuIgogICAgICAgICAgICAgIiAgfVxuIgotICAgICAgICAgICAgIiAgZih4KVxuIgotICAgICAgICAgICAgIiAgZyh4KTtcbiIKLSAgICAgICAgICAgICIgIGYoeClcbiIKKyAgICAgICAgICAgICIgIEYoeClcbiIKKyAgICAgICAgICAgICIgIEcoeCk7XG4iCisgICAgICAgICAgICAiICBGKHgpXG4iCiAgICAgICAgICAgICAiICB0cnkge1xuIgotICAgICAgICAgICAgIiAgICBxKCk7XG4iCisgICAgICAgICAgICAiICAgIFEoKTtcbiIKICAgICAgICAgICAgICIgIH1cbiIKICAgICAgICAgICAgICIgIGNhdGNoICguLi4pIHtcbiIKICAgICAgICAgICAgICIgIH1cbiIKICAgICAgICAgICAgICJ9XG4iLAogICAgICAgICAgICAgZm9ybWF0KCJpbnQgcSgpIHtcbiIKLSAgICAgICAgICAgICAgICAgICAiZih4KVxuIgorICAgICAgICAgICAgICAgICAgICJGKHgpXG4iCiAgICAgICAgICAgICAgICAgICAgImlmICgxKSB7fVxuIgotICAgICAgICAgICAgICAgICAgICJmKHgpXG4iCisgICAgICAgICAgICAgICAgICAgIkYoeClcbiIKICAgICAgICAgICAgICAgICAgICAid2hpbGUgKDEpIHt9XG4iCi0gICAgICAgICAgICAgICAgICAgImYoeClcbiIKLSAgICAgICAgICAgICAgICAgICAiZyh4KTtcbiIKLSAgICAgICAgICAgICAgICAgICAiZih4KVxuIgotICAgICAgICAgICAgICAgICAgICJ0cnkgeyBxKCk7IH0gY2F0Y2ggKC4uLikge31cbiIKKyAgICAgICAgICAgICAgICAgICAiRih4KVxuIgorICAgICAgICAgICAgICAgICAgICJHKHgpO1xuIgorICAgICAgICAgICAgICAgICAgICJGKHgpXG4iCisgICAgICAgICAgICAgICAgICAgInRyeSB7IFEoKTsgfSBjYXRjaCAoLi4uKSB7fVxuIgogICAgICAgICAgICAgICAgICAgICJ9XG4iKSk7CiAgIEVYUEVDVF9FUSgiY2xhc3MgQSB7XG4iCiAgICAgICAgICAgICAiICBBKCkgOiB0KDApIHt9XG4iCkBAIC0yMjYzLDYgKzI0MTAsMjcgQEAKICAgICAgICAgICAgICAgICAgICAiICBBKFggeClcbiIKICAgICAgICAgICAgICAgICAgICAiICB0cnkgOiB0KDApIHt9IGNhdGNoICguLi4pIHt9XG4iCiAgICAgICAgICAgICAgICAgICAgIn07IikpOworICBFWFBFQ1RfRVEoCisgICAgICAiY2xhc3MgU29tZUNsYXNzIHtcbiIKKyAgICAgICJwdWJsaWM6XG4iCisgICAgICAiICBTb21lQ2xhc3MoKSBFWENMVVNJVkVfTE9DS19GVU5DVElPTihtdV8pO1xuIgorICAgICAgIn07IiwKKyAgICAgIGZvcm1hdCgiY2xhc3MgU29tZUNsYXNzIHtcbiIKKyAgICAgICAgICAgICAicHVibGljOlxuIgorICAgICAgICAgICAgICIgIFNvbWVDbGFzcygpXG4iCisgICAgICAgICAgICAgIiAgRVhDTFVTSVZFX0xPQ0tfRlVOQ1RJT04obXVfKTtcbiIKKyAgICAgICAgICAgICAifTsiKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgICJjbGFzcyBTb21lQ2xhc3Mge1xuIgorICAgICAgInB1YmxpYzpcbiIKKyAgICAgICIgIFNvbWVDbGFzcygpXG4iCisgICAgICAiICAgICAgRVhDTFVTSVZFX0xPQ0tfRlVOQ1RJT04obXVfKTtcbiIKKyAgICAgICJ9OyIsCisgICAgICBmb3JtYXQoImNsYXNzIFNvbWVDbGFzcyB7XG4iCisgICAgICAgICAgICAgInB1YmxpYzpcbiIKKyAgICAgICAgICAgICAiICBTb21lQ2xhc3MoKVxuIgorICAgICAgICAgICAgICIgIEVYQ0xVU0lWRV9MT0NLX0ZVTkNUSU9OKG11Xyk7XG4iCisgICAgICAgICAgICAgIn07IiwgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoNDApKSk7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBMYXlvdXRNYWNyb0RlZmluaXRpb25zU3RhdGVtZW50c1NwYW5uaW5nQmxvY2tzKSB7CkBAIC0yMzkyLDYgKzI1NjAsMTEgQEAKICAgICAgICAgICAgICAgICIjZW5kaWYiKTsKIH0KIAorVEVTVF9GKEZvcm1hdFRlc3QsIEdyYWNpb3VzbHlIYW5kbGVJbmNvcnJlY3RQcmVwcm9jZXNzb3JDb25kaXRpb25zKSB7CisgIHZlcmlmeUZvcm1hdCgiI2VuZGlmXG4iCisgICAgICAgICAgICAgICAiI2lmIEIiKTsKK30KKwogVEVTVF9GKEZvcm1hdFRlc3QsIEZvcm1hdHNKb2luZWRMaW5lc09uU3Vic2VxdWVudFJ1bnMpIHsKICAgRm9ybWF0U3R5bGUgU2luZ2xlTGluZSA9IGdldExMVk1TdHlsZSgpOwogICBTaW5nbGVMaW5lLkFsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lID0gdHJ1ZTsKQEAgLTI0NTAsNyArMjYyMyw3IEBACiAgICAgICAgICAgICAgICAiICBzdHJ1Y3QgcyB7XG4iCiAgICAgICAgICAgICAgICAiICAgIGludCBpO1xuIgogICAgICAgICAgICAgICAgIiAgfTtcbiIKLSAgICAgICAgICAgICAgICIgIHMga0JpdHNUb09zW10gPSB7IHsgMTAgfSB9O1xuIgorICAgICAgICAgICAgICAgIiAgcyBrQml0c1RvT3NbXSA9IHt7MTB9fTtcbiIKICAgICAgICAgICAgICAgICIgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSlcbiIKICAgICAgICAgICAgICAgICIgICAgcmV0dXJuO1xuIgogICAgICAgICAgICAgICAgIn0iKTsKQEAgLTI0NjAsNiArMjYzMywxNCBAQAogICAgICAgICAgICAgICAgIiAgc29tZXRoaW5nZWxzZSgpO1xuIgogICAgICAgICAgICAgICAgIn0pOyIsCiAgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucyg0MCkpOworICB2ZXJpZnlGb3JtYXQoIkRFQlVHKCAvL1xuIgorICAgICAgICAgICAgICAgIiAgICB7IGYoKTsgfSwgYSk7Iik7CisgIHZlcmlmeUZvcm1hdCgiREVCVUcoIC8vXG4iCisgICAgICAgICAgICAgICAiICAgIHtcbiIKKyAgICAgICAgICAgICAgICIgICAgICBmKCk7IC8vXG4iCisgICAgICAgICAgICAgICAiICAgIH0sXG4iCisgICAgICAgICAgICAgICAiICAgIGEpOyIpOworCiAgIEVYUEVDVF9FUSgiY2FsbChwYXJhbWV0ZXIsIHtcbiIKICAgICAgICAgICAgICIgIHNvbWV0aGluZygpO1xuIgogICAgICAgICAgICAgIiAgLy8gQ29tbWVudCB0b29cbiIKQEAgLTI1MDYsNiArMjY4Nyw0NSBAQAogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgcmV0dXJuO1xuIgogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICB9LFxuIgogICAgICAgICAgICAgICAgIiAgICAgIGEpOyIsIFN0eWxlKTsKK30KKworVEVTVF9GKEZvcm1hdFRlc3QsIEluZGl2aWR1YWxTdGF0ZW1lbnRzT2ZOZXN0ZWRCbG9ja3MpIHsKKyAgRVhQRUNUX0VRKCJERUJVRyh7XG4iCisgICAgICAgICAgICAiICBpbnQgaTtcbiIKKyAgICAgICAgICAgICIgIGludCAgICAgICAgajtcbiIKKyAgICAgICAgICAgICJ9KTsiLAorICAgICAgICAgICAgZm9ybWF0KCJERUJVRyggICB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgaW50ICAgICAgICBpO1xuIgorICAgICAgICAgICAgICAgICAgICIgIGludCAgICAgICAgajtcbiIKKyAgICAgICAgICAgICAgICAgICAifSAgICkgIDsiLAorICAgICAgICAgICAgICAgICAgIDIwLCAxLCBnZXRMTFZNU3R5bGUoKSkpOworICBFWFBFQ1RfRVEoIkRFQlVHKCAgIHtcbiIKKyAgICAgICAgICAgICIgIGludCAgICAgICAgaTtcbiIKKyAgICAgICAgICAgICIgIGludCBqO1xuIgorICAgICAgICAgICAgIn0gICApICA7IiwKKyAgICAgICAgICAgIGZvcm1hdCgiREVCVUcoICAge1xuIgorICAgICAgICAgICAgICAgICAgICIgIGludCAgICAgICAgaTtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBpbnQgICAgICAgIGo7XG4iCisgICAgICAgICAgICAgICAgICAgIn0gICApICA7IiwKKyAgICAgICAgICAgICAgICAgICA0MSwgMSwgZ2V0TExWTVN0eWxlKCkpKTsKKyAgRVhQRUNUX0VRKCJERUJVRyggICB7XG4iCisgICAgICAgICAgICAiICAgIGludCAgICAgICAgaTtcbiIKKyAgICAgICAgICAgICIgICAgaW50IGo7XG4iCisgICAgICAgICAgICAifSAgICkgIDsiLAorICAgICAgICAgICAgZm9ybWF0KCJERUJVRyggICB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBpbnQgICAgICAgIGk7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBpbnQgICAgICAgIGo7XG4iCisgICAgICAgICAgICAgICAgICAgIn0gICApICA7IiwKKyAgICAgICAgICAgICAgICAgICA0MSwgMSwgZ2V0TExWTVN0eWxlKCkpKTsKKyAgRVhQRUNUX0VRKCJERUJVRyh7XG4iCisgICAgICAgICAgICAiICBpbnQgaTtcbiIKKyAgICAgICAgICAgICIgIGludCBqO1xuIgorICAgICAgICAgICAgIn0pOyIsCisgICAgICAgICAgICBmb3JtYXQoIkRFQlVHKCAgIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIGludCAgICAgICAgaTtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIGludCAgICAgICAgajtcbiIKKyAgICAgICAgICAgICAgICAgICAifSAgICkgIDsiLAorICAgICAgICAgICAgICAgICAgIDIwLCAxLCBnZXRMTFZNU3R5bGUoKSkpOwogCiAgIEVYUEVDVF9FUSgiRGVidWcoe1xuIgogICAgICAgICAgICAgIiAgICAgICAgaWYgKGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSlcbiIKQEAgLTI1MTgsMTggKzI3MzgsMjYgQEAKICAgICAgICAgICAgICAgICAgICAiICAgICAgfSxcbiIKICAgICAgICAgICAgICAgICAgICAiICAgICAgYSk7IiwKICAgICAgICAgICAgICAgICAgICA1MCwgMSwgZ2V0TExWTVN0eWxlKCkpKTsKLX0KLQotVEVTVF9GKEZvcm1hdFRlc3QsIEluZGl2aWR1YWxTdGF0ZW1lbnRzT2ZOZXN0ZWRCbG9ja3MpIHsKICAgRVhQRUNUX0VRKCJERUJVRyh7XG4iCi0gICAgICAgICAgICAiICBpbnQgICAgICAgIGk7XG4iCi0gICAgICAgICAgICAiICBpbnQgajtcbiIKKyAgICAgICAgICAgICIgIERFQlVHKHtcbiIKKyAgICAgICAgICAgICIgICAgaW50IGE7XG4iCisgICAgICAgICAgICAiICAgIGludCBiO1xuIgorICAgICAgICAgICAgIiAgfSkgO1xuIgogICAgICAgICAgICAgIn0pOyIsCi0gICAgICAgICAgICBmb3JtYXQoIkRFQlVHKCAgIHtcbiIKLSAgICAgICAgICAgICAgICAgICAiICBpbnQgICAgICAgIGk7XG4iCi0gICAgICAgICAgICAgICAgICAgIiAgaW50ICAgICAgICBqO1xuIgotICAgICAgICAgICAgICAgICAgICJ9ICAgKSAgOyIsCi0gICAgICAgICAgICAgICAgICAgNDAsIDEsIGdldExMVk1TdHlsZSgpKSk7CisgICAgICAgICAgICBmb3JtYXQoIkRFQlVHKHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICBERUJVRyh7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBpbnQgYTtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIGludCAgICBiO1xuIiAvLyBGb3JtYXQgdGhpcyBsaW5lIG9ubHkuCisgICAgICAgICAgICAgICAgICAgIiAgfSkgO1xuIiAgICAgICAgLy8gRG9uJ3QgdG91Y2ggdGhpcyBsaW5lLgorICAgICAgICAgICAgICAgICAgICJ9KTsiLAorICAgICAgICAgICAgICAgICAgIDM1LCAwLCBnZXRMTFZNU3R5bGUoKSkpOworICBFWFBFQ1RfRVEoIkRFQlVHKHtcbiIKKyAgICAgICAgICAgICIgIGludCBhOyAvL1xuIgorICAgICAgICAgICAgIn0pOyIsCisgICAgICAgICAgICBmb3JtYXQoIkRFQlVHKHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIGludCBhOyAvL1xuIgorICAgICAgICAgICAgICAgICAgICJ9KTsiLAorICAgICAgICAgICAgICAgICAgIDAsIDAsIGdldExMVk1TdHlsZSgpKSk7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBQdXRFbXB0eUJsb2Nrc0ludG9PbmVMaW5lKSB7CkBAIC0yNjYxLDggKzI4ODksOSBAQAogICAgICAgICAgICAgICAgIiAgICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSArXG4iCiAgICAgICAgICAgICAgICAiICAgICAgICBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiKSB7XG59Iik7CiAgIHZlcmlmeUZvcm1hdCgiaWYgKCkge1xuIgotICAgICAgICAgICAgICAgIn0gZWxzZSBpZiAoYWFhYWEgJiYgYmJiYmIgPiAvLyBicmVha1xuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIGNjY2NjKSB7XG4iCisgICAgICAgICAgICAgICAifSBlbHNlIGlmIChhYWFhYSAmJlxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgYmJiYmIgPiAvLyBicmVha1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIGNjY2NjKSB7XG4iCiAgICAgICAgICAgICAgICAifSIpOwogCiAgIC8vIFByZXNlbmNlIG9mIGEgdHJhaWxpbmcgY29tbWVudCB1c2VkIHRvIGNoYW5nZSBpbmRlbnRhdGlvbiBvZiBiLgpAQCAtMjcyMCw2ICsyOTQ5LDEwIEBACiAgICAgICAiICAgICsgc2l6ZW9mKGludDMyX3QpIC8vIE9mZnNldCBvZiBDVSBpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvblxuIgogICAgICAgIiAgICArIHNpemVvZihpbnQ4X3QpICAvLyBQb2ludGVyIFNpemUgKGluIGJ5dGVzKVxuIgogICAgICAgIiAgICArIHNpemVvZihpbnQ4X3QpOyAvLyBTZWdtZW50IFNpemUgKGluIGJ5dGVzKSIpOworCisgIHZlcmlmeUZvcm1hdCgicmV0dXJuIGJvb3N0OjpmdXNpb246OmF0X2M8MD4oaWlpaSkuc2Vjb25kXG4iCisgICAgICAgICAgICAgICAiICAgICAgID09IGJvb3N0OjpmdXNpb246OmF0X2M8MT4oaWlpaSkuc2Vjb25kOyIsCisgICAgICAgICAgICAgICBTdHlsZSk7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBDb25zdHJ1Y3RvckluaXRpYWxpemVycykgewpAQCAtMjc2OCw3ICszMDAxLDcgQEAKICAgICAgICAgICAgICAgICIgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYShhYWFhLCBhYWFhKSkge30iKTsKIAogICAvLyBIZXJlIGEgbGluZSBjb3VsZCBiZSBzYXZlZCBieSBzcGxpdHRpbmcgdGhlIHNlY29uZCBpbml0aWFsaXplciBvbnRvIHR3bwotICAvLyBsaW5lcywgYnV0IHRoYXQgaXMgbm90IGRlc2lyZWFibGUuCisgIC8vIGxpbmVzLCBidXQgdGhhdCBpcyBub3QgZGVzaXJhYmxlLgogICB2ZXJpZnlGb3JtYXQoIkNvbnN0cnVjdG9yKClcbiIKICAgICAgICAgICAgICAgICIgICAgOiBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEoYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKSxcbiIKICAgICAgICAgICAgICAgICIgICAgICBhYWFhYWFhYWFhYShhYWFhYWFhYWFhYSksXG4iCkBAIC0yODAyLDYgKzMwMzUsMTMgQEAKICAgICAgICAgICAgICAgICIgICAgOiBhYWFhYShhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLCBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgogICAgICAgICAgICAgICAgIiAgICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWEpIHt9IiwKICAgICAgICAgICAgICAgIE9uZVBlckxpbmUpOworCisgIEVYUEVDVF9FUSgiQ29uc3RydWN0b3IoKVxuIgorICAgICAgICAgICAgIiAgICA6IC8vIENvbW1lbnQgZm9yY2luZyB1bndhbnRlZCBicmVhay5cbiIKKyAgICAgICAgICAgICIgICAgICBhYWFhKGFhYWEpIHt9IiwKKyAgICAgICAgICAgIGZvcm1hdCgiQ29uc3RydWN0b3IoKSA6XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAvLyBDb21tZW50IGZvcmNpbmcgdW53YW50ZWQgYnJlYWsuXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBhYWFhKGFhYWEpIHt9IikpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgTWVtb2l6YXRpb25UZXN0cykgewpAQCAtMjk2Myw5ICszMjAzLDE4IEBACiAgICAgICAgICAgICAgICAib3BlcmF0b3I+KGNvbnN0IFNvbWVMb29vb29vb29vb29vb29vb29vb29vb29vb29nVHlwZSAmb3RoZXIpOyIpOwogICB2ZXJpZnlGb3JtYXQoIlNvbWVMb29vb29vb29vb29vb29vb29vb29vb29vb29nVHlwZVxuIgogICAgICAgICAgICAgICAgIm9wZXJhdG9yPj4oY29uc3QgU29tZUxvb29vb29vb29vb29vb29vb29vb29vb29vZ1R5cGUgJm90aGVyKTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJTb21lTG9vb29vb29vb29vb29vb29vb29vb29vb29vZ1R5cGVcbiIKKyAgICAgICAgICAgICAgICJvcGVyYXRvcjw8KGNvbnN0IFNvbWVMb29vb29vb29vb29vb29vb29vb29vb29vb2dUeXBlICZvdGhlcik7Iik7CisgIHZlcmlmeUdvb2dsZUZvcm1hdCgKKyAgICAgICJTb21lTG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb2dUeXBlIG9wZXJhdG9yPj4oXG4iCisgICAgICAiICAgIGNvbnN0IFNvbWVMb29vb29vb29vZ1R5cGUgJmEsIGNvbnN0IFNvbWVMb29vb29vb29vZ1R5cGUgJmIpOyIpOwogICB2ZXJpZnlHb29nbGVGb3JtYXQoCiAgICAgICAiU29tZUxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29nVHlwZSBvcGVyYXRvcjw8KFxuIgogICAgICAgIiAgICBjb25zdCBTb21lTG9vb29vb29vb2dUeXBlICZhLCBjb25zdCBTb21lTG9vb29vb29vb2dUeXBlICZiKTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEoXG4iCisgICAgICAgICAgICAgICAiICAgIGludCBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhID0gMSk7Iik7CisgIHZlcmlmeUZvcm1hdCgiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYVxuIgorICAgICAgICAgICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEoaW50IGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSA9IDEpOyIpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgVHJhaWxpbmdSZXR1cm5UeXBlKSB7CkBAIC0zMDAxLDE0ICszMjUwLDMwIEBACiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgYWFhYWEgYWFhYWFhYWFhYWFhYWFhYWFhYWEpIE9WRVJSSURFIEZJTkFMOyIpOwogICB2ZXJpZnlGb3JtYXQoInZvaWQgU29tZUZ1bmN0aW9uKGFhYWFhIGFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIGFhYWFhIGFhYWFhYWFhYWFhYWFhYWFhYWFhKSBvdmVycmlkZSBmaW5hbDsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2aXJ0dWFsIHZvaWQgYWFhYWEoYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEgYWFhYSxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgYWFhYWFhYWFhYWEgYWFhYWEpIGNvbnN0IG92ZXJyaWRlOyIpOworICB2ZXJpZnlHb29nbGVGb3JtYXQoCisgICAgICAidmlydHVhbCB2b2lkIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKClcbiIKKyAgICAgICIgICAgY29uc3Qgb3ZlcnJpZGU7Iik7CiAKLSAgLy8gVW5sZXNzIHRoaXMgd291bGQgbGVhZCB0byB0aGUgZmlyc3QgcGFyYW1ldGVyIGJlaW5nIGJyb2tlbi4KLSAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIHNvbWVMb25nRnVuY3Rpb24oaW50IHNvbWVMb25nUGFyYW1ldGVyKVxuIgotICAgICAgICAgICAgICAgIiAgICBjb25zdCB7fSIsCisgIC8vIEV2ZW4gaWYgdGhlIGZpcnN0IHBhcmFtZXRlciBoYXMgdG8gYmUgd3JhcHBlZC4KKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIHNvbWVMb25nRnVuY3Rpb24oXG4iCisgICAgICAgICAgICAgICAiICAgIGludCBzb21lTG9uZ1BhcmFtZXRlcikgY29uc3Qge30iLAogICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoNDYpKTsKLSAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIHNvbWVMb25nRnVuY3Rpb24oaW50IHNvbWVMb25nUGFyYW1ldGVyKVxuIgotICAgICAgICAgICAgICAgIiAgICBjb25zdCB7fSIsCisgIHZlcmlmeUZvcm1hdCgidm9pZCBzb21lTG9uZ0Z1bmN0aW9uKFxuIgorICAgICAgICAgICAgICAgIiAgICBpbnQgc29tZUxvbmdQYXJhbWV0ZXIpIGNvbnN0IHt9IiwKICAgICAgICAgICAgICAgIFN0eWxlKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIHNvbWVMb25nRnVuY3Rpb24oXG4iCisgICAgICAgICAgICAgICAiICAgIGludCBzb21lTG9uZ1BhcmFtZXRlcikgb3ZlcnJpZGUge30iLAorICAgICAgICAgICAgICAgU3R5bGUpOworICB2ZXJpZnlGb3JtYXQoInZvaWQgc29tZUxvbmdGdW5jdGlvbihcbiIKKyAgICAgICAgICAgICAgICIgICAgaW50IHNvbWVMb25nUGFyYW1ldGVyKSBmaW5hbCB7fSIsCisgICAgICAgICAgICAgICBTdHlsZSk7CisgIHZlcmlmeUZvcm1hdCgidm9pZCBzb21lTG9uZ0Z1bmN0aW9uKFxuIgorICAgICAgICAgICAgICAgIiAgICBpbnQgcGFyYW1ldGVyKSBjb25zdCBvdmVycmlkZSB7fSIsCisgICAgICAgICAgICAgICBTdHlsZSk7CisKKyAgLy8gVW5sZXNzIHRoZXNlIGFyZSB1bmtub3duIGFubm90YXRpb25zLgogICB2ZXJpZnlGb3JtYXQoInZvaWQgU29tZUZ1bmN0aW9uKGFhYWFhYWFhYWEgYWFhYWFhYWFhYWFhYWFhLFxuIgogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIGFhYWFhYWFhYWEgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSlcbiIKICAgICAgICAgICAgICAgICIgICAgTE9OR19BTkRfVUdMWV9BTk5PVEFUSU9OOyIpOwpAQCAtMzA3OSw3ICszMzQ0LDcgQEAKICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgogICAgICAgIiAgICAgICAgICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSk7Iik7CiAKLSAgLy8gSW5kZW50IGNvbnNpc3RlbnRseSBpbmRlbnBlbmRlbnQgb2YgY2FsbCBleHByZXNzaW9uLgorICAvLyBJbmRlbnQgY29uc2lzdGVudGx5IGluZGVwZW5kZW50IG9mIGNhbGwgZXhwcmVzc2lvbi4KICAgdmVyaWZ5Rm9ybWF0KCJhYWFhYWFhYWFhYShiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiLmNjY2NjY2NjY2NjY2NjY2NjKFxuIgogICAgICAgICAgICAgICAgIiAgICBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQpKTtcbiIKICAgICAgICAgICAgICAgICJhYWFhYWFhYWFhYShiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiKFxuIgpAQCAtMzIzMCwxNSArMzQ5NSwxNSBAQAogICAgICAgInZvaWQgZigpIHtcbiIKICAgICAgICIgIHNvbWVvLT5BZGQoKG5ldyB1dGlsOjpmaWxldG9vbHM6OkhhbmRsZXIoZGlyKSlcbiIKICAgICAgICIgICAgICAgICAgICAgICAgIC0+T25FdmVudDEoTmV3UGVybWFuZW50Q2FsbGJhY2soXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCAmSGFuZGxlckhvbGRlckNsYXNzOjpFdmVudEhhbmRsZXJDQkEpKVxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgIHRoaXMsICZIYW5kbGVySG9sZGVyQ2xhc3M6OkV2ZW50SGFuZGxlckNCQSkpXG4iCiAgICAgICAiICAgICAgICAgICAgICAgICAtPk9uRXZlbnQyKE5ld1Blcm1hbmVudENhbGxiYWNrKFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgJkhhbmRsZXJIb2xkZXJDbGFzczo6RXZlbnRIYW5kbGVyQ0JCKSlcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICB0aGlzLCAmSGFuZGxlckhvbGRlckNsYXNzOjpFdmVudEhhbmRsZXJDQkIpKVxuIgogICAgICAgIiAgICAgICAgICAgICAgICAgLT5PbkV2ZW50MyhOZXdQZXJtYW5lbnRDYWxsYmFjayhcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsICZIYW5kbGVySG9sZGVyQ2xhc3M6OkV2ZW50SGFuZGxlckNCQykpXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgdGhpcywgJkhhbmRsZXJIb2xkZXJDbGFzczo6RXZlbnRIYW5kbGVyQ0JDKSlcbiIKICAgICAgICIgICAgICAgICAgICAgICAgIC0+T25FdmVudDUoTmV3UGVybWFuZW50Q2FsbGJhY2soXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCAmSGFuZGxlckhvbGRlckNsYXNzOjpFdmVudEhhbmRsZXJDQkQpKVxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgIHRoaXMsICZIYW5kbGVySG9sZGVyQ2xhc3M6OkV2ZW50SGFuZGxlckNCRCkpXG4iCiAgICAgICAiICAgICAgICAgICAgICAgICAtPk9uRXZlbnQ2KE5ld1Blcm1hbmVudENhbGxiYWNrKFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgJkhhbmRsZXJIb2xkZXJDbGFzczo6RXZlbnRIYW5kbGVyQ0JFKSkpO1xuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgIHRoaXMsICZIYW5kbGVySG9sZGVyQ2xhc3M6OkV2ZW50SGFuZGxlckNCRSkpKTtcbiIKICAgICAgICJ9Iik7CiAKICAgdmVyaWZ5Rm9ybWF0KApAQCAtMzI2NCw3ICszNTI5LDcgQEAKICAgICAgICAgICAgICAgICIgICAgLmhhczxiYmJiYmJiYmJiYmJiYmJiYmJiYmI+KCk7Iik7CiAgIHZlcmlmeUZvcm1hdCgiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLmFhYWFhYWFhYWFhYWEoKVxuIgogICAgICAgICAgICAgICAgIiAgICAuYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhPFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYT4oKTsiKTsKKyAgICAgICAgICAgICAgICIgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYT4oKTsiKTsKIAogICAvLyBQcmVmZXIgbm90IHRvIGJyZWFrIGFmdGVyIGVtcHR5IHBhcmVudGhlc2VzLgogICB2ZXJpZnlGb3JtYXQoIkZpcnN0VG9rZW4tPldoaXRlc3BhY2VSYW5nZS5nZXRCZWdpbigpLmdldExvY1dpdGhPZmZzZXQoXG4iCkBAIC0zNDk1LDcgKzM3NjAsNyBAQAogICAgICAgICAgICAgICAgIiAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWE7IiwKICAgICAgICAgICAgICAgIFN0eWxlKTsKICAgdmVyaWZ5Rm9ybWF0KCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIGFhYWFhYSA9XG4iCi0gICAgICAgICAgICAgICAiICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSA/XG4iIAorICAgICAgICAgICAgICAgIiAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEgP1xuIgogICAgICAgICAgICAgICAgIiAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEgOlxuIgogICAgICAgICAgICAgICAgIiAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWE7IiwKICAgICAgICAgICAgICAgIFN0eWxlKTsKQEAgLTM2MTAsNiArMzg3NSwxMyBAQAogICB2ZXJpZnlGb3JtYXQoIiNkZWZpbmUgQSBcImRlZlwiXG4iCiAgICAgICAgICAgICAgICAiZihcImFiY1wiIEEgXCJnaGlcIlxuIgogICAgICAgICAgICAgICAgIiAgXCJqa2xcIik7Iik7CisKKyAgdmVyaWZ5Rm9ybWF0KCJmKExcImFcIlxuIgorICAgICAgICAgICAgICAgIiAgTFwiYlwiKSIpOworICB2ZXJpZnlGb3JtYXQoIiNkZWZpbmUgQShYKSAgICAgICAgICAgIFxcXG4iCisgICAgICAgICAgICAgICAiICBMXCJhYWFhYVwiICNYIExcImJiYmJiYlwiIFxcXG4iCisgICAgICAgICAgICAgICAiICBMXCJjY2NjY1wiIiwKKyAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDI1KSk7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBBbHdheXNCcmVha0JlZm9yZU11bHRpbGluZVN0cmluZ3MpIHsKQEAgLTM2MzgsNiArMzkxMCwxMCBAQAogICAgICAgICAgICAgICAgIiAgICAgXCJiYmJiXCJcbiIKICAgICAgICAgICAgICAgICIgICAgIFwiY2NjY1wiKTsiLAogICAgICAgICAgICAgICAgQnJlYWspOworICB2ZXJpZnlGb3JtYXQoImFhYWEocXFxLFxuIgorICAgICAgICAgICAgICAgIiAgICAgTFwiYmJiYlwiXG4iCisgICAgICAgICAgICAgICAiICAgICBMXCJjY2NjXCIpOyIsCisgICAgICAgICAgICAgICBCcmVhayk7CiAKICAgLy8gRG9uJ3QgYnJlYWsgaWYgdGhlcmUgaXMgbm8gY29sdW1uIGdhaW4uCiAgIHZlcmlmeUZvcm1hdCgiZihcImFhYWFcIlxuIgpAQCAtMzczMCw2ICs0MDA2LDggQEAKICAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDcwKSk7CiAKICAgLy8gQnV0IHNvbWV0aW1lcywgYnJlYWtpbmcgYmVmb3JlIHRoZSBmaXJzdCAiPDwiIGlzIGRlc2lyYWJsZS4KKyAgdmVyaWZ5Rm9ybWF0KCJEaWFnKGFhYWFhYWFhYWFhYWFhYWFhYWFhLCBhYWFhYWFhYSlcbiIKKyAgICAgICAgICAgICAgICIgICAgPDwgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYShhYWFhYWFhYWFhYWFhKTsiKTsKICAgdmVyaWZ5Rm9ybWF0KCJEaWFnKGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLCBiYmJiYmJiYmIpXG4iCiAgICAgICAgICAgICAgICAiICAgIDw8IGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXG4iCiAgICAgICAgICAgICAgICAiICAgIDw8IGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhOyIpOwpAQCAtMzc0NCw2ICs0MDIyLDExIEBACiAgIEVYUEVDVF9FUSgibGx2bTo6ZXJycygpIDw8IFwiXG4iCiAgICAgICAgICAgICAiICAgICAgICAgICAgIDw8IGE7IiwKICAgICAgICAgICAgIGZvcm1hdCgibGx2bTo6ZXJycygpIDw8IFwiXG48PGE7IikpOworCisgIHZlcmlmeUZvcm1hdCgidm9pZCBmKCkge1xuIgorICAgICAgICAgICAgICAgIiAgQ0hFQ0tfRVEoYWFhYSwgKCpiYmJiYmJiYmIpLT5jY2NjY2MpXG4iCisgICAgICAgICAgICAgICAiICAgICAgPDwgXCJxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFcIjtcbiIKKyAgICAgICAgICAgICAgICJ9Iik7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBVbmRlcnN0YW5kc0VxdWFscykgewpAQCAtMzc4OSw4ICs0MDcyLDggQEAKIAogICB2ZXJpZnlGb3JtYXQoIkVYUEVDVF9DQUxMKFNvbWVPYmplY3QsIFNvbWVGdW5jdGlvbihQYXJhbWV0ZXIpKVxuIgogICAgICAgICAgICAgICAgIiAgICAuV2lsbFJlcGVhdGVkbHkoUmV0dXJuKFNvbWVWYWx1ZSkpOyIpOwotICB2ZXJpZnlGb3JtYXQoIlNvbWVNYXBbc3RkOjpwYWlyKGFhYWFhYWFhYWFhYSwgYmJiYmJiYmJiYmJiYmJiKV1cbiIKLSAgICAgICAgICAgICAgICIgICAgLmluc2VydChjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYyk7Iik7CisgIHZlcmlmeUZvcm1hdCgiU29tZU1hcFtzdGQ6OnBhaXIoYWFhYWFhYWFhYWFhLCBiYmJiYmJiYmJiYmJiYmIpXS5pbnNlcnQoXG4iCisgICAgICAgICAgICAgICAiICAgIGNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjKTsiKTsKICAgdmVyaWZ5Rm9ybWF0KCJhYWFhYShhYWFhYShhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEsXG4iCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKS5hYWFhYShhYWFhYSksXG4iCiAgICAgICAgICAgICAgICAiICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhKTsiKTsKQEAgLTM4NDcsNiArNDEzMCwxMiBAQAogICB2ZXJpZnlGb3JtYXQoCiAgICAgICAiYWFhYWFhYWFhYWFhYWFhYWFhYWEoYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKFxuIgogICAgICAgIiAgICBhYWFhYWFhYWFhYWFhYWFhYWEsIGFhYWFhYWFhYWFhYWFhYWFhKSk7Iik7CisgIHZlcmlmeUZvcm1hdCgiYWFhYWFhYWFhYSA9IGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYShcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEpXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAuYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEoKTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJhYWFhYWFhYWFhKGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYShcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKVxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIC5hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKCkpOyIpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgV3JhcHNUZW1wbGF0ZURlY2xhcmF0aW9ucykgewpAQCAtMzg3Nyw2ICs0MTY2LDEwIEBACiAgICAgICAidGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA9IGNoYXIsIHR5cGVuYW1lIFQzID0gY2hhcixcbiIKICAgICAgICIgICAgICAgICAgdHlwZW5hbWUgVDQgPSBjaGFyPlxuIgogICAgICAgInZvaWQgZigpOyIpOworICB2ZXJpZnlGb3JtYXQoInRlbXBsYXRlIDx0eXBlbmFtZSBhYWFhYWFhYWFhYSwgdHlwZW5hbWUgYmJiYmJiYmJiYmJiYixcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBjY2NjY2NjY2NjY2NjY2NjY2NjY2NjLFxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICB0eXBlbmFtZSBkZGRkZGRkZGRkZGRkPlxuIgorICAgICAgICAgICAgICAgImNsYXNzIEMge307Iik7CiAgIHZlcmlmeUZvcm1hdCgKICAgICAgICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWE8YWFhYWFhYWFhYWFhYWFhYWEsIGFhYWFhYWFhYWFhYWFhYWFhPihcbiIKICAgICAgICIgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEpOyIpOwpAQCAtMzk1Myw3ICs0MjQ2LDcgQEAKIAogVEVTVF9GKEZvcm1hdFRlc3QsIFVuZGVyc3RhbmRzVGVtcGxhdGVQYXJhbWV0ZXJzKSB7CiAgIHZlcmlmeUZvcm1hdCgiQTxpbnQ+IGE7Iik7Ci0gIHZlcmlmeUZvcm1hdCgiQTxBPEE8aW50PiA+ID4gYTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJBPEE8QTxpbnQ+Pj4gYTsiKTsKICAgdmVyaWZ5Rm9ybWF0KCJBPEE8QTxpbnQsIDI+LCAzPiwgND4gYTsiKTsKICAgdmVyaWZ5Rm9ybWF0KCJib29sIHggPSBhIDwgMSB8fCAyID4gYTsiKTsKICAgdmVyaWZ5Rm9ybWF0KCJib29sIHggPSA1IDwgZjxpbnQ+KCk7Iik7CkBAIC00MDUyLDIyICs0MzQ1LDIwIEBACiAgIHZlcmlmeUZvcm1hdCgiI2RlZmluZSBYIC0xIik7CiAgIHZlcmlmeUZvcm1hdCgiI2RlZmluZSBYIC1rQ29uc3RhbnQiKTsKIAotICB2ZXJpZnlGb3JtYXQoImNvbnN0IE5TUG9pbnQga0Jyb3dzZXJGcmFtZVZpZXdQYXR0ZXJuT2Zmc2V0ID0geyAtNSwgKzMgfTsiKTsKLSAgdmVyaWZ5Rm9ybWF0KCJjb25zdCBOU1BvaW50IGtCcm93c2VyRnJhbWVWaWV3UGF0dGVybk9mZnNldCA9IHsgKzUsIC0zIH07Iik7CisgIHZlcmlmeUZvcm1hdCgiY29uc3QgTlNQb2ludCBrQnJvd3NlckZyYW1lVmlld1BhdHRlcm5PZmZzZXQgPSB7LTUsICszfTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJjb25zdCBOU1BvaW50IGtCcm93c2VyRnJhbWVWaWV3UGF0dGVybk9mZnNldCA9IHsrNSwgLTN9OyIpOwogCiAgIHZlcmlmeUZvcm1hdCgiaW50IGEgPSAvKiBjb25mdXNpbmcgY29tbWVudCAqLyAtMTsiKTsKICAgLy8gRklYTUU6IFRoZSBzcGFjZSBhZnRlciAnaScgaXMgd3JvbmcsIGJ1dCBob3BlZnVsbHksIHRoaXMgaXMgYSByYXJlIGNhc2UuCiAgIHZlcmlmeUZvcm1hdCgiaW50IGEgPSBpIC8qIGNvbmZ1c2luZyBjb21tZW50ICovKys7Iik7CiB9CiAKLVRFU1RfRihGb3JtYXRUZXN0LCBJbmRlbnRzUmVsYXRpdmVUb1VuYXJ5T3BlcmF0b3JzKSB7CitURVNUX0YoRm9ybWF0VGVzdCwgRG9lc05vdEluZGVudFJlbGF0aXZlVG9VbmFyeU9wZXJhdG9ycykgewogICB2ZXJpZnlGb3JtYXQoImlmICghYWFhYWFhYWFhYSggLy8gYnJlYWtcbiIKLSAgICAgICAgICAgICAgICIgICAgICAgICBhYWFhYSkpIHtcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgIGFhYWFhKSkge1xuIgogICAgICAgICAgICAgICAgIn0iKTsKICAgdmVyaWZ5Rm9ybWF0KCJhYWFhYWFhYWFhKCFhYWFhYWFhYWFhKCAvLyBicmVha1xuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBhYWFhYSkpOyIpOwotCi0gIC8vIE9ubHkgaW5kZW50IHJlbGF0aXZlIHRvIHVuYXJ5IG9wZXJhdG9ycyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBuZXN0ZWQuCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgYWFhYWEpKTsiKTsKICAgdmVyaWZ5Rm9ybWF0KCIqYWFhID0gYWFhYWFhYSggLy8gYnJlYWtcbiIKICAgICAgICAgICAgICAgICIgICAgYmJiYmJiKTsiKTsKIH0KQEAgLTQwODgsNyArNDM3OSw3IEBACiAgIHZlcmlmeUZvcm1hdCgib3BlcmF0b3Igdm9pZCAqKCk7Iik7CiAgIHZlcmlmeUZvcm1hdCgib3BlcmF0b3IgU29tZVR5cGU8aW50PigpOyIpOwogICB2ZXJpZnlGb3JtYXQoIm9wZXJhdG9yIFNvbWVUeXBlPGludCwgaW50PigpOyIpOwotICB2ZXJpZnlGb3JtYXQoIm9wZXJhdG9yIFNvbWVUeXBlPFNvbWVUeXBlPGludD4gPigpOyIpOworICB2ZXJpZnlGb3JtYXQoIm9wZXJhdG9yIFNvbWVUeXBlPFNvbWVUeXBlPGludD4+KCk7Iik7CiAgIHZlcmlmeUZvcm1hdCgidm9pZCAqb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IHNpemUpOyIpOwogICB2ZXJpZnlGb3JtYXQoInZvaWQgKm9wZXJhdG9yIG5ld1tdKHN0ZDo6c2l6ZV90IHNpemUpOyIpOwogICB2ZXJpZnlGb3JtYXQoInZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnB0cik7Iik7CkBAIC00MTEwLDYgKzQ0MDEsMTEgQEAKICAgdmVyaWZ5R29vZ2xlRm9ybWF0KCJvcGVyYXRvciA6OkEoKTsiKTsKIAogICB2ZXJpZnlGb3JtYXQoInVzaW5nIEE6Om9wZXJhdG9yKzsiKTsKKworICB2ZXJpZnlGb3JtYXQoIkRlbGV0ZWQgJm9wZXJhdG9yPShjb25zdCBEZWxldGVkICYpJiA9IGRlZmF1bHQ7Iik7CisgIHZlcmlmeUZvcm1hdCgiRGVsZXRlZCAmb3BlcmF0b3I9KGNvbnN0IERlbGV0ZWQgJikmJiA9IGRlbGV0ZTsiKTsKKyAgdmVyaWZ5R29vZ2xlRm9ybWF0KCJEZWxldGVkJiBvcGVyYXRvcj0oY29uc3QgRGVsZXRlZCYpJiA9IGRlZmF1bHQ7Iik7CisgIHZlcmlmeUdvb2dsZUZvcm1hdCgiRGVsZXRlZCYgb3BlcmF0b3I9KGNvbnN0IERlbGV0ZWQmKSYmID0gZGVsZXRlOyIpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgVW5kZXJzdGFuZHNOZXdBbmREZWxldGUpIHsKQEAgLTQxNjcsNiArNDQ2Myw3IEBACiAgIHZlcmlmeUZvcm1hdCgiYXV0byBhID0gW10oaW50ICoqJiwgaW50ICoqKikge307Iik7CiAgIHZlcmlmeUZvcm1hdCgiYXV0byBQb2ludGVyQmluZGluZyA9IFtdKGNvbnN0IGNoYXIgKlMpIHt9OyIpOwogICB2ZXJpZnlGb3JtYXQoInR5cGVkZWYgdHlwZW9mKGludChpbnQsIGludCkpICpNeUZ1bmM7Iik7CisgIHZlcmlmeUluZGVwZW5kZW50T2ZDb250ZXh0KCJ0eXBlZGVmIHZvaWQgKCpmKShpbnQgKmEpOyIpOwogCiAgIHZlcmlmeUluZGVwZW5kZW50T2ZDb250ZXh0KCJJbnZhbGlkUmVnaW9uc1sqUl0gPSAwOyIpOwogCkBAIC00MjA3LDkgKzQ1MDQsOCBAQAogCiAgIHZlcmlmeUluZGVwZW5kZW50T2ZDb250ZXh0KCJmKGIgKiAvKiBjb25mdXNpbmcgY29tbWVudCAqLyArK2MpOyIpOwogICB2ZXJpZnlGb3JtYXQoCi0gICAgICAiaW50ICpNeVZhbHVlcyA9IHtcbiIKLSAgICAgICIgICpBLCAvLyBPcGVyYXRvciBkZXRlY3Rpb24gbWlnaHQgYmUgY29uZnVzZWQgYnkgdGhlICd7J1xuIgotICAgICAgIiAgKkJCIC8vIE9wZXJhdG9yIGRldGVjdGlvbiBtaWdodCBiZSBjb25mdXNlZCBieSBwcmV2aW91cyBjb21tZW50XG4iCisgICAgICAiaW50ICpNeVZhbHVlcyA9IHsqQSwgLy8gT3BlcmF0b3IgZGV0ZWN0aW9uIG1pZ2h0IGJlIGNvbmZ1c2VkIGJ5IHRoZSAneydcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICpCQiAvLyBPcGVyYXRvciBkZXRlY3Rpb24gbWlnaHQgYmUgY29uZnVzZWQgYnkgcHJldmlvdXMgY29tbWVudFxuIgogICAgICAgIn07Iik7CiAKICAgdmVyaWZ5SW5kZXBlbmRlbnRPZkNvbnRleHQoImlmIChpbnQgKmEgPSAmYikiKTsKQEAgLTQyNDYsMTAgKzQ1NDIsMzQgQEAKICAgRm9ybWF0U3R5bGUgUG9pbnRlckxlZnQgPSBnZXRMTFZNU3R5bGUoKTsKICAgUG9pbnRlckxlZnQuUG9pbnRlckJpbmRzVG9UeXBlID0gdHJ1ZTsKICAgdmVyaWZ5Rm9ybWF0KCJkZWxldGUgKng7IiwgUG9pbnRlckxlZnQpOworICB2ZXJpZnlGb3JtYXQoIlNUQVRJQ19BU1NFUlQoKGEgJiBiKSA9PSAwKTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJTVEFUSUNfQVNTRVJUKDAgPT0gKGEgJiBiKSk7Iik7CisgIHZlcmlmeUZvcm1hdCgidGVtcGxhdGUgPGJvb2wgYSwgYm9vbCBiPiAiCisgICAgICAgICAgICAgICAidHlwZW5hbWUgdDo6aWY8eCAmJiB5Pjo6dHlwZSBmKCkge307Iik7CisgIHZlcmlmeUZvcm1hdCgidGVtcGxhdGUgPGludCAqeT4gZigpIHt9OyIpOworICB2ZXJpZnlGb3JtYXQoInZlY3RvcjxpbnQgKj4gdjsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2ZWN0b3I8aW50ICpjb25zdD4gdjsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2ZWN0b3I8aW50ICpjb25zdCAqKmNvbnN0ICo+IHY7Iik7CisgIHZlcmlmeUZvcm1hdCgidmVjdG9yPGludCAqdm9sYXRpbGU+IHY7Iik7CisgIHZlcmlmeUZvcm1hdCgidmVjdG9yPGEgKiBiPiB2OyIpOworICB2ZXJpZnlGb3JtYXQoImZvbzxiICYmIGZhbHNlPigpOyIpOworICB2ZXJpZnlGb3JtYXQoImZvbzxiICYgMT4oKTsiKTsKKworICB2ZXJpZnlJbmRlcGVuZGVudE9mQ29udGV4dCgiTUFDUk8oaW50ICppKTsiKTsKKyAgdmVyaWZ5SW5kZXBlbmRlbnRPZkNvbnRleHQoIk1BQ1JPKGF1dG8gKmEpOyIpOworICB2ZXJpZnlJbmRlcGVuZGVudE9mQ29udGV4dCgiTUFDUk8oY29uc3QgQSAqYSk7Iik7CisgIC8vIEZJWE1FOiBJcyB0aGVyZSBhIHdheSB0byBtYWtlIHRoaXMgd29yaz8KKyAgLy8gdmVyaWZ5SW5kZXBlbmRlbnRPZkNvbnRleHQoIk1BQ1JPKEEgKmEpOyIpOworCisgIC8vIEZJWE1FOiBXZSBjYW5ub3QgaGFuZGxlIHRoaXMgY2FzZSB5ZXQ7IHdlIG1pZ2h0IGJlIGFibGUgdG8gZmlndXJlIG91dCB0aGF0CisgIC8vIGZvbzx4PiBkID4gdjsgZG9lc24ndCBtYWtlIHNlbnNlLgorICB2ZXJpZnlGb3JtYXQoImZvbzxhIDwgYiAmJiBjPiBkID4gdjsiKTsKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIFVuZGVyc3RhbmRzQXR0cmlidXRlcykgewogICB2ZXJpZnlGb3JtYXQoIlNvbWVUeXBlIHMgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgKEluaXRWYWx1ZSk7Iik7CisgIHZlcmlmeUZvcm1hdCgiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIF9fYXR0cmlidXRlX18oKHVudXNlZCkpXG4iCisgICAgICAgICAgICAgICAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEoaW50IGkpOyIpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgVW5kZXJzdGFuZHNFbGxpcHNpcykgewpAQCAtNDQ4NSw2ICs0ODA1LDkgQEAKICAgICAgICJsbHZtOjpvdXRzKCkgPDwgXCJhYWFhYWFhYWFhYWE6IFwiXG4iCiAgICAgICAiICAgICAgICAgICAgIDw8ICgqYWFhYWFhYWlhYWFhYWFhKVthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXVxuIgogICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXTsiKTsKKworICB2ZXJpZnlHb29nbGVGb3JtYXQoImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWE8aW50PlxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFbYWFhYWFhYWFhYWFhXTsiKTsKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIExpbmVTdGFydHNXaXRoU3BlY2lhbENoYXJhY3RlcikgewpAQCAtNDUxNSw2ICs0ODM4LDEwIEBACiAgIHZlcmlmeUZvcm1hdCgiI2lmIF9faGFzX2luY2x1ZGUoPHN0cnN0cmVhbT4pXG4iCiAgICAgICAgICAgICAgICAiI2luY2x1ZGUgPHN0cnN0cmVhbT5cbiIKICAgICAgICAgICAgICAgICIjZW5kaWYiKTsKKworICAvLyBQcm90b2NvbCBidWZmZXIgZGVmaW5pdGlvbiBvciBtaXNzaW5nICIjIi4KKyAgdmVyaWZ5Rm9ybWF0KCJpbXBvcnQgXCJhYWFhYWFhYWFhYWFhYWFhYS9hYWFhYWFhYWFhYWFhYWFcIjsiLAorICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMzApKTsKIH0KIAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KQEAgLTQ2NDUsMTM0ICs0OTcyLDIwMSBAQAogCiBURVNUX0YoRm9ybWF0VGVzdCwgTGF5b3V0Q2FsbHNJbnNpZGVCcmFjZUluaXRpYWxpemVycykgewogICB2ZXJpZnlGb3JtYXQoImludCB4ID0ge1xuIgotICAgICAgICAgICAgICAgIiAgYXZhcmlhYmxlLFxuIgotICAgICAgICAgICAgICAgIiAgYihhbG9uZ2VydmFyaWFibGUpXG4iCi0gICAgICAgICAgICAgICAifTsiLAorICAgICAgICAgICAgICAgIiAgICBhdmFyaWFibGUsXG4iCisgICAgICAgICAgICAgICAiICAgIGIoYWxvbmdlcnZhcmlhYmxlKX07IiwKICAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDI1KSk7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBMYXlvdXRCcmFjZUluaXRpYWxpemVyc0luUmV0dXJuU3RhdGVtZW50KSB7Ci0gIHZlcmlmeUZvcm1hdCgicmV0dXJuIChhKShiKSB7IDEsIDIsIDMgfTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJyZXR1cm4gKGEpKGIpIHsxLCAyLCAzfTsiKTsKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIExheW91dEN4eDExQ29uc3RydWN0b3JCcmFjZUluaXRpYWxpemVycykgewotICAgIHZlcmlmeUZvcm1hdCgidmVjdG9yPGludD4geHsgMSwgMiwgMywgNCB9OyIpOwotICAgIHZlcmlmeUZvcm1hdCgidmVjdG9yPFQ+IHh7IHt9LCB7fSwge30sIHt9IH07Iik7Ci0gICAgdmVyaWZ5Rm9ybWF0KCJmKHsgMSwgMiB9KTsiKTsKLSAgICB2ZXJpZnlGb3JtYXQoImF1dG8gdiA9IEZvb3sgMSB9OyIpOwotICAgIHZlcmlmeUZvcm1hdCgiZih7IDEsIDIgfSwgeyB7IDIsIDMgfSwgeyA0LCA1IH0gfSwgYywgeyBkIH0pOyIpOwotICAgIHZlcmlmeUZvcm1hdCgiQ2xhc3M6OkNsYXNzIDogbWVtYmVyeyAxLCAyLCAzIH0ge30iKTsKLSAgICB2ZXJpZnlGb3JtYXQoIm5ldyB2ZWN0b3I8aW50PnsgMSwgMiwgMyB9OyIpOwotICAgIHZlcmlmeUZvcm1hdCgibmV3IGludFszXXsgMSwgMiwgMyB9OyIpOwotICAgIHZlcmlmeUZvcm1hdCgicmV0dXJuIHsgYXJnMSwgYXJnMiB9OyIpOwotICAgIHZlcmlmeUZvcm1hdCgicmV0dXJuIHsgYXJnMSwgU29tZVR5cGV7IHBhcmFtZXRlciB9IH07Iik7Ci0gICAgdmVyaWZ5Rm9ybWF0KCJuZXcgVHsgYXJnMSwgYXJnMiB9OyIpOwotICAgIHZlcmlmeUZvcm1hdCgiZihNeU1hcFt7IGNvbXBvc2l0ZSwga2V5IH1dKTsiKTsKLSAgICB2ZXJpZnlGb3JtYXQoImNsYXNzIENsYXNzIHtcbiIKLSAgICAgICAgICAgICAgICAgIiAgVCBtZW1iZXIgPSB7IGFyZzEsIGFyZzIgfTtcbiIKLSAgICAgICAgICAgICAgICAgIn07Iik7Ci0gICAgdmVyaWZ5Rm9ybWF0KAotICAgICAgICAiZm9vID0gYWFhYWFhYWFhYWEgPyB2ZWN0b3I8aW50PnsgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgotICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWEsIGFhYWFhIH1cbiIKLSAgICAgICAgIiAgICAgICAgICAgICAgICAgIDogdmVjdG9yPGludD57IGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYixcbiIKLSAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiYmJiYmJiYmJiYmJiYmJiYmJiLCBiYmJiYiB9OyIpOwotICAgIHZlcmlmeUZvcm1hdCgiRG9Tb21ldGhpbmdXaXRoVmVjdG9yKHt9IC8qIE5vIGRhdGEgKi8pOyIpOwotICAgIHZlcmlmeUZvcm1hdCgiRG9Tb21ldGhpbmdXaXRoVmVjdG9yKHsge30gLyogTm8gZGF0YSAqLyB9LCB7IHsgMSwgMiB9IH0pOyIpOwotICAgIHZlcmlmeUZvcm1hdCgKLSAgICAgICAgInNvbWVGdW5jdGlvbihPdGhlclBhcmFtLCBCcmFjZWRMaXN0e1xuIgotICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWVudCAxIChGb3JjaW5nIGludGVyZXN0aW5nIGJyZWFrKVxuIgotICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0xLCBwYXJhbTIsXG4iCi0gICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tZW50IDJcbiIKLSAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMywgcGFyYW00XG4iCi0gICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Iik7Ci0gICAgdmVyaWZ5Rm9ybWF0KAotICAgICAgICAic3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKFxuIgotICAgICAgICAiICAgIHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kc3sgc3RkOjpjaHJvbm86OnNlY29uZHN7IDEgfSB9IC8gNSk7Iik7CisgIHZlcmlmeUZvcm1hdCgidmVjdG9yPGludD4geHsxLCAyLCAzLCA0fTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2ZWN0b3I8aW50PiB4e1xuIgorICAgICAgICAgICAgICAgIiAgICAxLCAyLCAzLCA0LFxuIgorICAgICAgICAgICAgICAgIn07Iik7CisgIHZlcmlmeUZvcm1hdCgidmVjdG9yPFQ+IHh7e30sIHt9LCB7fSwge319OyIpOworICB2ZXJpZnlGb3JtYXQoImYoezEsIDJ9KTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJhdXRvIHYgPSBGb297LTF9OyIpOworICB2ZXJpZnlGb3JtYXQoImYoezEsIDJ9LCB7ezIsIDN9LCB7NCwgNX19LCBjLCB7ZH0pOyIpOworICB2ZXJpZnlGb3JtYXQoIkNsYXNzOjpDbGFzcyA6IG1lbWJlcnsxLCAyLCAzfSB7fSIpOworICB2ZXJpZnlGb3JtYXQoIm5ldyB2ZWN0b3I8aW50PnsxLCAyLCAzfTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJuZXcgaW50WzNdezEsIDIsIDN9OyIpOworICB2ZXJpZnlGb3JtYXQoInJldHVybiB7YXJnMSwgYXJnMn07Iik7CisgIHZlcmlmeUZvcm1hdCgicmV0dXJuIHthcmcxLCBTb21lVHlwZXtwYXJhbWV0ZXJ9fTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJpbnQgY291bnQgPSBzZXQ8aW50PntmKCksIGcoKSwgaCgpfS5zaXplKCk7Iik7CisgIHZlcmlmeUZvcm1hdCgibmV3IFR7YXJnMSwgYXJnMn07Iik7CisgIHZlcmlmeUZvcm1hdCgiZihNeU1hcFt7Y29tcG9zaXRlLCBrZXl9XSk7Iik7CisgIHZlcmlmeUZvcm1hdCgiY2xhc3MgQ2xhc3Mge1xuIgorICAgICAgICAgICAgICAgIiAgVCBtZW1iZXIgPSB7YXJnMSwgYXJnMn07XG4iCisgICAgICAgICAgICAgICAifTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2ZWN0b3I8aW50PiBmb28gPSB7OjpTb21lR2xvYmFsRnVuY3Rpb24oKX07Iik7CiAKLSAgICBGb3JtYXRTdHlsZSBOb1NwYWNlcyA9IGdldExMVk1TdHlsZSgpOwotICAgIE5vU3BhY2VzLkNwcDExQnJhY2VkTGlzdFN0eWxlID0gdHJ1ZTsKLSAgICB2ZXJpZnlGb3JtYXQoInZlY3RvcjxpbnQ+IHh7MSwgMiwgMywgNH07IiwgTm9TcGFjZXMpOwotICAgIHZlcmlmeUZvcm1hdCgidmVjdG9yPFQ+IHh7e30sIHt9LCB7fSwge319OyIsIE5vU3BhY2VzKTsKLSAgICB2ZXJpZnlGb3JtYXQoImYoezEsIDJ9KTsiLCBOb1NwYWNlcyk7Ci0gICAgdmVyaWZ5Rm9ybWF0KCJhdXRvIHYgPSBGb297LTF9OyIsIE5vU3BhY2VzKTsKLSAgICB2ZXJpZnlGb3JtYXQoImYoezEsIDJ9LCB7ezIsIDN9LCB7NCwgNX19LCBjLCB7ZH0pOyIsIE5vU3BhY2VzKTsKLSAgICB2ZXJpZnlGb3JtYXQoIkNsYXNzOjpDbGFzcyA6IG1lbWJlcnsxLCAyLCAzfSB7fSIsIE5vU3BhY2VzKTsKLSAgICB2ZXJpZnlGb3JtYXQoIm5ldyB2ZWN0b3I8aW50PnsxLCAyLCAzfTsiLCBOb1NwYWNlcyk7Ci0gICAgdmVyaWZ5Rm9ybWF0KCJuZXcgaW50WzNdezEsIDIsIDN9OyIsIE5vU3BhY2VzKTsKLSAgICB2ZXJpZnlGb3JtYXQoInJldHVybiB7YXJnMSwgYXJnMn07IiwgTm9TcGFjZXMpOwotICAgIHZlcmlmeUZvcm1hdCgicmV0dXJuIHthcmcxLCBTb21lVHlwZXtwYXJhbWV0ZXJ9fTsiLCBOb1NwYWNlcyk7Ci0gICAgdmVyaWZ5Rm9ybWF0KCJuZXcgVHthcmcxLCBhcmcyfTsiLCBOb1NwYWNlcyk7Ci0gICAgdmVyaWZ5Rm9ybWF0KCJmKE15TWFwW3tjb21wb3NpdGUsIGtleX1dKTsiLCBOb1NwYWNlcyk7Ci0gICAgdmVyaWZ5Rm9ybWF0KCJjbGFzcyBDbGFzcyB7XG4iCi0gICAgICAgICAgICAgICAgICIgIFQgbWVtYmVyID0ge2FyZzEsIGFyZzJ9O1xuIgotICAgICAgICAgICAgICAgICAifTsiLAotICAgICAgICAgICAgICAgICBOb1NwYWNlcyk7Ci0gICAgdmVyaWZ5Rm9ybWF0KCJDb25zdHJ1Y3Rvcjo6Q29uc3RydWN0b3IoKVxuIgotICAgICAgICAgICAgICAgICAiICAgIDogc29tZV92YWx1ZXsgLy9cbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICBhYWFhYWFhIC8vXG4iCi0gICAgICAgICAgICAgICAgICIgICAgICB9IHt9IiwKLSAgICAgICAgICAgICAgICAgTm9TcGFjZXMpOworICAvLyBGSVhNRTogVGhlIGFsaWdubWVudCBvZiB0aGVzZSB0cmFpbGluZyBjb21tZW50cyBtaWdodCBiZSBiYWQuIFRoZW4gYWdhaW4sCisgIC8vIHRoaXMgbWlnaHQgYmUgdXR0ZXJseSB1c2VsZXNzIGluIHJlYWwgY29kZS4KKyAgdmVyaWZ5Rm9ybWF0KCJDb25zdHJ1Y3Rvcjo6Q29uc3RydWN0b3IoKVxuIgorICAgICAgICAgICAgICAgIiAgICA6IHNvbWVfdmFsdWV7ICAgICAgICAvL1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgYWFhYWFhYSAvL1xuIgorICAgICAgICAgICAgICAgIiAgICAgIH0ge30iKTsKKworICAvLyBJbiBicmFjZWQgbGlzdHMsIHRoZSBmaXJzdCBjb21tZW50IGlzIGFsd2F5cyBhc3N1bWVkIHRvIGJlbG9uZyB0byB0aGUKKyAgLy8gZmlyc3QgZWxlbWVudC4gVGh1cywgaXQgY2FuIGJlIG1vdmVkIHRvIHRoZSBuZXh0IG9yIHByZXZpb3VzIGxpbmUgYXMKKyAgLy8gYXBwcm9wcmlhdGUuCisgIEVYUEVDVF9FUSgiZnVuY3Rpb24oey8vIEZpcnN0IGVsZW1lbnQ6XG4iCisgICAgICAgICAgICAiICAgICAgICAgIDEsXG4iCisgICAgICAgICAgICAiICAgICAgICAgIC8vIFNlY29uZCBlbGVtZW50OlxuIgorICAgICAgICAgICAgIiAgICAgICAgICAyfSk7IiwKKyAgICAgICAgICAgIGZvcm1hdCgiZnVuY3Rpb24oe1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgLy8gRmlyc3QgZWxlbWVudDpcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIDEsXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAvLyBTZWNvbmQgZWxlbWVudDpcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIDJ9KTsiKSk7CisgIEVYUEVDVF9FUSgic3RkOjp2ZWN0b3I8aW50PiBNeU51bWJlcnN7XG4iCisgICAgICAgICAgICAiICAgIC8vIEZpcnN0IGVsZW1lbnQ6XG4iCisgICAgICAgICAgICAiICAgIDEsXG4iCisgICAgICAgICAgICAiICAgIC8vIFNlY29uZCBlbGVtZW50OlxuIgorICAgICAgICAgICAgIiAgICAyfTsiLAorICAgICAgICAgICAgZm9ybWF0KCJzdGQ6OnZlY3RvcjxpbnQ+IE15TnVtYmVyc3svLyBGaXJzdCBlbGVtZW50OlxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAxLFxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWNvbmQgZWxlbWVudDpcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgMn07IiwKKyAgICAgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucygzMCkpKTsKKworICBGb3JtYXRTdHlsZSBFeHRyYVNwYWNlcyA9IGdldExMVk1TdHlsZSgpOworICBFeHRyYVNwYWNlcy5DcHAxMUJyYWNlZExpc3RTdHlsZSA9IGZhbHNlOworICBFeHRyYVNwYWNlcy5Db2x1bW5MaW1pdCA9IDc1OworICB2ZXJpZnlGb3JtYXQoInZlY3RvcjxpbnQ+IHh7IDEsIDIsIDMsIDQgfTsiLCBFeHRyYVNwYWNlcyk7CisgIHZlcmlmeUZvcm1hdCgidmVjdG9yPFQ+IHh7IHt9LCB7fSwge30sIHt9IH07IiwgRXh0cmFTcGFjZXMpOworICB2ZXJpZnlGb3JtYXQoImYoeyAxLCAyIH0pOyIsIEV4dHJhU3BhY2VzKTsKKyAgdmVyaWZ5Rm9ybWF0KCJhdXRvIHYgPSBGb297IDEgfTsiLCBFeHRyYVNwYWNlcyk7CisgIHZlcmlmeUZvcm1hdCgiZih7IDEsIDIgfSwgeyB7IDIsIDMgfSwgeyA0LCA1IH0gfSwgYywgeyBkIH0pOyIsIEV4dHJhU3BhY2VzKTsKKyAgdmVyaWZ5Rm9ybWF0KCJDbGFzczo6Q2xhc3MgOiBtZW1iZXJ7IDEsIDIsIDMgfSB7fSIsIEV4dHJhU3BhY2VzKTsKKyAgdmVyaWZ5Rm9ybWF0KCJuZXcgdmVjdG9yPGludD57IDEsIDIsIDMgfTsiLCBFeHRyYVNwYWNlcyk7CisgIHZlcmlmeUZvcm1hdCgibmV3IGludFszXXsgMSwgMiwgMyB9OyIsIEV4dHJhU3BhY2VzKTsKKyAgdmVyaWZ5Rm9ybWF0KCJyZXR1cm4geyBhcmcxLCBhcmcyIH07IiwgRXh0cmFTcGFjZXMpOworICB2ZXJpZnlGb3JtYXQoInJldHVybiB7IGFyZzEsIFNvbWVUeXBleyBwYXJhbWV0ZXIgfSB9OyIsIEV4dHJhU3BhY2VzKTsKKyAgdmVyaWZ5Rm9ybWF0KCJpbnQgY291bnQgPSBzZXQ8aW50PnsgZigpLCBnKCksIGgoKSB9LnNpemUoKTsiLCBFeHRyYVNwYWNlcyk7CisgIHZlcmlmeUZvcm1hdCgibmV3IFR7IGFyZzEsIGFyZzIgfTsiLCBFeHRyYVNwYWNlcyk7CisgIHZlcmlmeUZvcm1hdCgiZihNeU1hcFt7IGNvbXBvc2l0ZSwga2V5IH1dKTsiLCBFeHRyYVNwYWNlcyk7CisgIHZlcmlmeUZvcm1hdCgiY2xhc3MgQ2xhc3Mge1xuIgorICAgICAgICAgICAgICAgIiAgVCBtZW1iZXIgPSB7IGFyZzEsIGFyZzIgfTtcbiIKKyAgICAgICAgICAgICAgICJ9OyIsCisgICAgICAgICAgICAgICBFeHRyYVNwYWNlcyk7CisgIHZlcmlmeUZvcm1hdCgKKyAgICAgICJmb28gPSBhYWFhYWFhYWFhYSA/IHZlY3RvcjxpbnQ+eyBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWEsIGFhYWFhIH1cbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICA6IHZlY3RvcjxpbnQ+eyBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmJiYmJiYmJiYmJiYmJiYmJiYmIsIGJiYmJiIH07IiwKKyAgICAgIEV4dHJhU3BhY2VzKTsKKyAgdmVyaWZ5Rm9ybWF0KCJEb1NvbWV0aGluZ1dpdGhWZWN0b3Ioe30gLyogTm8gZGF0YSAqLyk7IiwgRXh0cmFTcGFjZXMpOworICB2ZXJpZnlGb3JtYXQoIkRvU29tZXRoaW5nV2l0aFZlY3Rvcih7IHt9IC8qIE5vIGRhdGEgKi8gfSwgeyB7IDEsIDIgfSB9KTsiLAorICAgICAgICAgICAgICAgRXh0cmFTcGFjZXMpOworICB2ZXJpZnlGb3JtYXQoCisgICAgICAic29tZUZ1bmN0aW9uKE90aGVyUGFyYW0sXG4iCisgICAgICAiICAgICAgICAgICAgIEJyYWNlZExpc3R7IC8vIGNvbW1lbnQgMSAoRm9yY2luZyBpbnRlcmVzdGluZyBicmVhaylcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0xLCBwYXJhbTIsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1lbnQgMlxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTMsIHBhcmFtNCB9KTsiLAorICAgICAgRXh0cmFTcGFjZXMpOworICB2ZXJpZnlGb3JtYXQoCisgICAgICAic3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKFxuIgorICAgICAgIiAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHN7IHN0ZDo6Y2hyb25vOjpzZWNvbmRzeyAxIH0gfSAvIDUpOyIsCisgICAgICBFeHRyYVNwYWNlcyk7CisgIHZlcmlmeUZvcm1hdCgic3RkOjp2ZWN0b3I8TXlWYWx1ZXM+IGFhYWFhYWFhYWFhYWFhYWFhYWF7XG4iCisgICAgICAgICAgICAgICAiICBhYWFhYWFhLCAgICAgIGFhYWFhYWFhYWEsXG4iCisgICAgICAgICAgICAgICAiICBhYWFhYSwgICAgICAgIGFhYWFhYWFhYWFhYWFhYSxcbiIKKyAgICAgICAgICAgICAgICIgIGFhYSwgICAgICAgICAgYWFhYWFhYWFhYSxcbiIKKyAgICAgICAgICAgICAgICIgIGEsICAgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgorICAgICAgICAgICAgICAgIiAgYWFhYWFhYWFhYWFhLCBhYWFhYWFhYWFhYWFhYWFhYWFhICsgYWFhYWFhYWFhYWFhYWFhYWFhYSxcbiIKKyAgICAgICAgICAgICAgICIgIGFhYWFhYWEsICAgICAgYVxuIgorICAgICAgICAgICAgICAgIn07IiwKKyAgICAgICAgICAgICAgIEV4dHJhU3BhY2VzKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2ZWN0b3I8aW50PiBmb28gPSB7IDo6U29tZUdsb2JhbEZ1bmN0aW9uKCkgfTsiLCBFeHRyYVNwYWNlcyk7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBGb3JtYXRzQnJhY2VkTGlzdHNJbkNvbHVtbkxheW91dCkgewotICB2ZXJpZnlGb3JtYXQoInZlY3RvcjxpbnQ+IHggPSB7IDEsIDIyLCAzMzMsIDQ0NDQsIDU1NTU1LCA2NjY2NjYsIDc3Nzc3NzcsXG4iCi0gICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgMSwgMjIsIDMzMywgNDQ0NCwgNTU1NTUsIDY2NjY2NiwgNzc3Nzc3NyxcbiIKLSAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAxLCAyMiwgMzMzLCA0NDQ0LCA1NTU1NSwgNjY2NjY2LCA3Nzc3Nzc3LFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIDEsIDIyLCAzMzMsIDQ0NDQsIDU1NTU1LCA2NjY2NjYsIDc3Nzc3NzcsXG4iCi0gICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgMSwgMjIsIDMzMywgNDQ0NCwgNTU1NTUsIDY2NjY2NiwgNzc3Nzc3NyxcbiIKLSAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAxLCAyMiwgMzMzLCA0NDQ0LCA1NTU1NSwgNjY2NjY2LCA3Nzc3Nzc3IH07Iik7Ci0gIHZlcmlmeUZvcm1hdCgidmVjdG9yPGludD4geCA9IHsgMSwgMjIsIDMzMywgNDQ0NCwgNTU1NTUsIDY2NjY2NiwgNzc3Nzc3NyxcbiIKLSAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAvLyBsaW5lIGNvbW1lbnRcbiIKLSAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAxLCAyMiwgMzMzLCA0NDQ0LCA1NTU1NSwgNjY2NjY2LCA3Nzc3Nzc3LFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIDEsIDIyLCAzMzMsIDQ0NDQsIDU1NTU1LFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIC8vIGxpbmUgY29tbWVudFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIDEsIDIyLCAzMzMsIDQ0NDQsIDU1NTU1LCA2NjY2NjYsIDc3Nzc3NzcsXG4iCi0gICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgMSwgMjIsIDMzMywgNDQ0NCwgNTU1NTUsIDY2NjY2NiwgNzc3Nzc3NyB9OyIpOworICB2ZXJpZnlGb3JtYXQoInZlY3RvcjxpbnQ+IHggPSB7MSwgMjIsIDMzMywgNDQ0NCwgNTU1NTUsIDY2NjY2NiwgNzc3Nzc3NyxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIDEsIDIyLCAzMzMsIDQ0NDQsIDU1NTU1LCA2NjY2NjYsIDc3Nzc3NzcsXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAxLCAyMiwgMzMzLCA0NDQ0LCA1NTU1NSwgNjY2NjY2LCA3Nzc3Nzc3LFxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgMSwgMjIsIDMzMywgNDQ0NCwgNTU1NTUsIDY2NjY2NiwgNzc3Nzc3NyxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIDEsIDIyLCAzMzMsIDQ0NDQsIDU1NTU1LCA2NjY2NjYsIDc3Nzc3NzcsXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAxLCAyMiwgMzMzLCA0NDQ0LCA1NTU1NSwgNjY2NjY2LCA3Nzc3Nzc3fTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2ZWN0b3I8aW50PiB4ID0gezEsIDIyLCAzMzMsIDQ0NDQsIDU1NTU1LCA2NjY2NjYsIDc3Nzc3NzcsXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAvLyBsaW5lIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIDEsIDIyLCAzMzMsIDQ0NDQsIDU1NTU1LCA2NjY2NjYsIDc3Nzc3NzcsXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAxLCAyMiwgMzMzLCA0NDQ0LCA1NTU1NSxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIC8vIGxpbmUgY29tbWVudFxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgMSwgMjIsIDMzMywgNDQ0NCwgNTU1NTUsIDY2NjY2NiwgNzc3Nzc3NyxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIDEsIDIyLCAzMzMsIDQ0NDQsIDU1NTU1LCA2NjY2NjYsIDc3Nzc3Nzd9OyIpOwogICB2ZXJpZnlGb3JtYXQoCi0gICAgICAidmVjdG9yPGludD4geCA9IHsgMSwgICAgICAgMjIsIDMzMywgNDQ0NCwgNTU1NTUsIDY2NjY2NiwgNzc3Nzc3NyxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAxLCAgICAgICAyMiwgMzMzLCA0NDQ0LCA1NTU1NSwgNjY2NjY2LCA3Nzc3Nzc3LFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgIDEsICAgICAgIDIyLCAzMzMsIDQ0NDQsIDU1NTU1LCA2NjY2NjYsIC8vIGNvbW1lbnRcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICA3Nzc3Nzc3LCAxLCAgMjIsICAzMzMsICA0NDQ0LCAgNTU1NTUsICA2NjY2NjYsXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAgNzc3Nzc3NywgMSwgIDIyLCAgMzMzLCAgNDQ0NCwgIDU1NTU1LCAgNjY2NjY2LFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgIDc3Nzc3NzcsIDEsICAyMiwgIDMzMywgIDQ0NDQsICA1NTU1NSwgIDY2NjY2NixcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICA3Nzc3Nzc3IH07Iik7CisgICAgICAidmVjdG9yPGludD4geCA9IHsxLCAgICAgICAyMiwgMzMzLCA0NDQ0LCA1NTU1NSwgNjY2NjY2LCA3Nzc3Nzc3LFxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgMSwgICAgICAgMjIsIDMzMywgNDQ0NCwgNTU1NTUsIDY2NjY2NiwgNzc3Nzc3NyxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgIDEsICAgICAgIDIyLCAzMzMsIDQ0NDQsIDU1NTU1LCA2NjY2NjYsIC8vIGNvbW1lbnRcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgIDc3Nzc3NzcsIDEsICAyMiwgIDMzMywgIDQ0NDQsICA1NTU1NSwgIDY2NjY2NixcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgIDc3Nzc3NzcsIDEsICAyMiwgIDMzMywgIDQ0NDQsICA1NTU1NSwgIDY2NjY2NixcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgIDc3Nzc3NzcsIDEsICAyMiwgIDMzMywgIDQ0NDQsICA1NTU1NSwgIDY2NjY2NixcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgIDc3Nzc3Nzd9OyIpOwogICB2ZXJpZnlGb3JtYXQoInN0YXRpYyBjb25zdCB1aW50MTZfdCBDYWxsZXJTYXZlZFJlZ3M2NEJpdHR0dHRbXSA9IHtcbiIKLSAgICAgICAgICAgICAgICIgIFg4Njo6UkFYLCBYODY6OlJEWCwgWDg2OjpSQ1gsIFg4Njo6UlNJLCBYODY6OlJESSxcbiIKLSAgICAgICAgICAgICAgICIgIFg4Njo6UjgsICBYODY6OlI5LCAgWDg2OjpSMTAsIFg4Njo6UjExLCAwXG4iCi0gICAgICAgICAgICAgICAifTsiKTsKLSAgdmVyaWZ5Rm9ybWF0KCJ2ZWN0b3I8aW50PiB4ID0geyAxLCAxLCAxLCAxLFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEgfTsiLAorICAgICAgICAgICAgICAgIiAgICBYODY6OlJBWCwgWDg2OjpSRFgsIFg4Njo6UkNYLCBYODY6OlJTSSwgWDg2OjpSREksXG4iCisgICAgICAgICAgICAgICAiICAgIFg4Njo6UjgsICBYODY6OlI5LCAgWDg2OjpSMTAsIFg4Njo6UjExLCAwfTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2ZWN0b3I8aW50PiB4ID0gezEsIDEsIDEsIDEsXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxfTsiLAogICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMzkpKTsKLSAgdmVyaWZ5Rm9ybWF0KCJ2ZWN0b3I8aW50PiB4ID0geyAxLCAxLCAxLCAxLFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEgfTsiLAorICB2ZXJpZnlGb3JtYXQoInZlY3RvcjxpbnQ+IHggPSB7MSwgMSwgMSwgMSxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDF9OyIsCiAgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucygzOCkpOwogICB2ZXJpZnlGb3JtYXQoInZlY3RvcjxpbnQ+IGFhYWFhYWFhYWFhYWFhYWFhYWFhYWEgPSB7XG4iCi0gICAgICAgICAgICAgICAiICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXG4iCi0gICAgICAgICAgICAgICAifTsiLAotICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoNDApKTsKKyAgICAgICAgICAgICAgICIgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07IiwKKyAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDQzKSk7CiAKICAgLy8gVHJhaWxpbmcgY29tbWFzLgotICB2ZXJpZnlGb3JtYXQoInZlY3RvcjxpbnQ+IHggPSB7IDEsIDEsIDEsIDEsXG4iCi0gICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgMSwgMSwgMSwgMSwgfTsiLAotICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMzkpKTsKLSAgdmVyaWZ5Rm9ybWF0KCJ2ZWN0b3I8aW50PiB4ID0geyAxLCAxLCAxLCAxLFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsIC8vXG4iCisgIHZlcmlmeUZvcm1hdCgidmVjdG9yPGludD4geCA9IHtcbiIKKyAgICAgICAgICAgICAgICIgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSxcbiIKICAgICAgICAgICAgICAgICJ9OyIsCiAgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucygzOSkpOwotICB2ZXJpZnlGb3JtYXQoInZlY3RvcjxpbnQ+IHggPSB7IDEsIDEsIDEsIDEsXG4iCi0gICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgMSwgMSwgMSwgMSxcbiIKLSAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAvKiovIC8qKi8gfTsiLAorICB2ZXJpZnlGb3JtYXQoInZlY3RvcjxpbnQ+IHggPSB7MSwgMSwgMSwgMSxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsIC8vXG4iCisgICAgICAgICAgICAgICAifTsiLAogICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMzkpKTsKLSAgdmVyaWZ5Rm9ybWF0KCJyZXR1cm4geyB7IGFhYWFhYWFhYWFhYWFhYWFhYWFhYSB9LFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgIHsgYWFhYWFhYWFhYWFhYWFhYWFhYSB9LFxuIgotICAgICAgICAgICAgICAgIiAgICAgICAgIHsgYWFhYWFhYWFhYWFhYWFhYWFhYWFhIH0sXG4iCi0gICAgICAgICAgICAgICAiICAgICAgICAgeyBhYWFhYWFhYWFhYWFhYWFhYSB9IH07IiwKKyAgdmVyaWZ5Rm9ybWF0KCJ2ZWN0b3I8aW50PiB4ID0gezEsIDEsIDEsIDEsXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLFxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgLyoqLyAvKiovfTsiLAorICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMzkpKTsKKyAgdmVyaWZ5Rm9ybWF0KCJyZXR1cm4ge3thYWFhYWFhYWFhYWFhYWFhYWFhYWF9LFxuIgorICAgICAgICAgICAgICAgIiAgICAgICAge2FhYWFhYWFhYWFhYWFhYWFhYWF9LFxuIgorICAgICAgICAgICAgICAgIiAgICAgICAge2FhYWFhYWFhYWFhYWFhYWFhYWFhYX0sXG4iCisgICAgICAgICAgICAgICAiICAgICAgICB7YWFhYWFhYWFhYWFhYWFhYWF9fTsiLAogICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoNjApKTsKKworICAvLyBXaXRoIG5lc3RlZCBsaXN0cywgd2Ugc2hvdWxkIGVpdGhlciBmb3JtYXQgb25lIGl0ZW0gcGVyIGxpbmUgb3IgYWxsIG5lc3RlZAorICAvLyBsaXN0cyBvbmUgb25lIGxpbmUuCisgIC8vIEZJWE1FOiBGb3Igc29tZSBuZXN0ZWQgbGlzdHMsIHdlIGNhbiBkbyBiZXR0ZXIuCisgIHZlcmlmeUZvcm1hdCgKKyAgICAgICJTb21lU3RydWN0IG15X3N0cnVjdF9hcnJheSA9IHtcbiIKKyAgICAgICIgICAge2FhYWFhYSwgYWFhYWFhYWEsIGFhYWFhYWFhYWEsIGFhYWFhYWFhYSwgYWFhYWFhYWFhLCBhYWFhYWFhYWFhLFxuIgorICAgICAgIiAgICAgYWFhYWFhYWFhYWFhYSwgYWFhYWFhYSwgYWFhfSxcbiIKKyAgICAgICIgICAge2FhYSwgYWFhfSxcbiIKKyAgICAgICIgICAge2FhYSwgYWFhfSxcbiIKKyAgICAgICIgICAge2FhYWEsIGFhYWEsIGFhYWEsIGFhYWEsIGFhYWEsIGFhYWEsIGFhYWEsIGFhYX0sXG4iCisgICAgICAiICAgIHthYWFhYWFhYWFhYWFhYWFhYSwgYWFhYWFhYWFhYWFhYWFhYWEsIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSxcbiIKKyAgICAgICIgICAgIGFhYWFhYWFhYWFhYSwgYSwgYWFhYWFhYWFhYSwgYWFhYWFhYWFhLCBhYWF9fTsiKTsKKworICAvLyBObyBjb2x1bW4gbGF5b3V0IHNob3VsZCBiZSB1c2VkIGhlcmUuCisgIHZlcmlmeUZvcm1hdCgiYWFhYWFhYWFhYWFhYWFhID0ge2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSwgMCwgMCxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJifTsiKTsKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIFB1bGxUcml2aWFsRnVuY3Rpb25EZWZpbml0aW9uc0ludG9TaW5nbGVMaW5lKSB7CisgIEZvcm1hdFN0eWxlIERvTm90TWVyZ2UgPSBnZXRMTFZNU3R5bGUoKTsKKyAgRG9Ob3RNZXJnZS5BbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZSA9IGZhbHNlOworCiAgIHZlcmlmeUZvcm1hdCgidm9pZCBmKCkgeyByZXR1cm4gNDI7IH0iKTsKICAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGYoKSB7XG4iCisgICAgICAgICAgICAgICAiICByZXR1cm4gNDI7XG4iCisgICAgICAgICAgICAgICAifSIsCisgICAgICAgICAgICAgICBEb05vdE1lcmdlKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGYoKSB7XG4iCiAgICAgICAgICAgICAgICAiICAvLyBDb21tZW50XG4iCiAgICAgICAgICAgICAgICAifSIpOwogICB2ZXJpZnlGb3JtYXQoIntcbiIKQEAgLTQ3ODcsNiArNTE4MSwxMyBAQAogICB2ZXJpZnlGb3JtYXQoInZvaWQgZigpIHsgaW50IGE7IH0gLy8gY29tbWVudCIpOwogICB2ZXJpZnlGb3JtYXQoInZvaWQgZigpIHtcbiIKICAgICAgICAgICAgICAgICJ9IC8vIGNvbW1lbnQiLAorICAgICAgICAgICAgICAgRG9Ob3RNZXJnZSk7CisgIHZlcmlmeUZvcm1hdCgidm9pZCBmKCkge1xuIgorICAgICAgICAgICAgICAgIiAgaW50IGE7XG4iCisgICAgICAgICAgICAgICAifSAvLyBjb21tZW50IiwKKyAgICAgICAgICAgICAgIERvTm90TWVyZ2UpOworICB2ZXJpZnlGb3JtYXQoInZvaWQgZigpIHtcbiIKKyAgICAgICAgICAgICAgICJ9IC8vIGNvbW1lbnQiLAogICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMTUpKTsKIAogICB2ZXJpZnlGb3JtYXQoInZvaWQgZigpIHsgcmV0dXJuIDQyOyB9IiwgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMjMpKTsKQEAgLTQ3OTQsMTMgKzUxOTUsNjIgQEAKIAogICB2ZXJpZnlGb3JtYXQoInZvaWQgZigpIHt9IiwgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMTEpKTsKICAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGYoKSB7XG59IiwgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMTApKTsKKyAgdmVyaWZ5Rm9ybWF0KCJjbGFzcyBDIHtcbiIKKyAgICAgICAgICAgICAgICIgIEMoKVxuIgorICAgICAgICAgICAgICAgIiAgICAgIDogaWlpaWlpaWkobnVsbHB0ciksXG4iCisgICAgICAgICAgICAgICAiICAgICAgICBra2tra2trKG51bGxwdHIpLFxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgbW1tbW1tbShudWxscHRyKSxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgIG5ubm5ubm4obnVsbHB0cikge31cbiIKKyAgICAgICAgICAgICAgICJ9OyIsCisgICAgICAgICAgICAgICBnZXRHb29nbGVTdHlsZSgpKTsKKworICBGb3JtYXRTdHlsZSBOb0NvbHVtbkxpbWl0ID0gZ2V0TExWTVN0eWxlKCk7CisgIE5vQ29sdW1uTGltaXQuQ29sdW1uTGltaXQgPSAwOworICBFWFBFQ1RfRVEoIkEoKSA6IGIoMCkge30iLCBmb3JtYXQoIkEoKTpiKDApe30iLCBOb0NvbHVtbkxpbWl0KSk7CisgIEVYUEVDVF9FUSgiY2xhc3MgQyB7XG4iCisgICAgICAgICAgICAiICBBKCkgOiBiKDApIHt9XG4iCisgICAgICAgICAgICAifTsiLCBmb3JtYXQoImNsYXNzIEN7QSgpOmIoMCl7fX07IiwgTm9Db2x1bW5MaW1pdCkpOworICBFWFBFQ1RfRVEoIkEoKVxuIgorICAgICAgICAgICAgIiAgICA6IGIoMCkge1xuIgorICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgZm9ybWF0KCJBKClcbjpiKDApXG57XG59IiwgTm9Db2x1bW5MaW1pdCkpOworCisgIEZvcm1hdFN0eWxlIERvTm90TWVyZ2VOb0NvbHVtbkxpbWl0ID0gTm9Db2x1bW5MaW1pdDsKKyAgRG9Ob3RNZXJnZU5vQ29sdW1uTGltaXQuQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmUgPSBmYWxzZTsKKyAgRVhQRUNUX0VRKCJBKClcbiIKKyAgICAgICAgICAgICIgICAgOiBiKDApIHtcbiIKKyAgICAgICAgICAgICJ9IiwKKyAgICAgICAgICAgIGZvcm1hdCgiQSgpOmIoMCl7fSIsIERvTm90TWVyZ2VOb0NvbHVtbkxpbWl0KSk7CisgIEVYUEVDVF9FUSgiQSgpXG4iCisgICAgICAgICAgICAiICAgIDogYigwKSB7XG4iCisgICAgICAgICAgICAifSIsCisgICAgICAgICAgICBmb3JtYXQoIkEoKVxuOmIoMClcbntcbn0iLCBEb05vdE1lcmdlTm9Db2x1bW5MaW1pdCkpOworCisgIHZlcmlmeUZvcm1hdCgiI2RlZmluZSBBICAgICAgICAgIFxcXG4iCisgICAgICAgICAgICAgICAiICB2b2lkIGYoKSB7ICAgICAgIFxcXG4iCisgICAgICAgICAgICAgICAiICAgIGludCBpOyAgICAgICAgIFxcXG4iCisgICAgICAgICAgICAgICAiICB9IiwKKyAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDIwKSk7CisgIHZlcmlmeUZvcm1hdCgiI2RlZmluZSBBICAgICAgICAgICBcXFxuIgorICAgICAgICAgICAgICAgIiAgdm9pZCBmKCkgeyBpbnQgaTsgfSIsCisgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucygyMSkpOworICB2ZXJpZnlGb3JtYXQoIiNkZWZpbmUgQSAgICAgICAgICAgIFxcXG4iCisgICAgICAgICAgICAgICAiICB2b2lkIGYoKSB7ICAgICAgICAgXFxcbiIKKyAgICAgICAgICAgICAgICIgICAgaW50IGk7ICAgICAgICAgICBcXFxuIgorICAgICAgICAgICAgICAgIiAgfSAgICAgICAgICAgICAgICAgIFxcXG4iCisgICAgICAgICAgICAgICAiICBpbnQgajsiLAorICAgICAgICAgICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMjIpKTsKKyAgdmVyaWZ5Rm9ybWF0KCIjZGVmaW5lIEEgICAgICAgICAgICAgXFxcbiIKKyAgICAgICAgICAgICAgICIgIHZvaWQgZigpIHsgaW50IGk7IH0gXFxcbiIKKyAgICAgICAgICAgICAgICIgIGludCBqOyIsCisgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucygyMykpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgVW5kZXJzdGFuZENvbnRleHRPZlJlY29yZFR5cGVLZXl3b3JkcykgewogICAvLyBFbGFib3JhdGUgdHlwZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCi0gIHZlcmlmeUZvcm1hdCgic3RydWN0IGZvbyBhID0geyBiYXIgfTtcbmludCBuOyIpOwotICB2ZXJpZnlGb3JtYXQoImNsYXNzIGZvbyBhID0geyBiYXIgfTtcbmludCBuOyIpOwotICB2ZXJpZnlGb3JtYXQoInVuaW9uIGZvbyBhID0geyBiYXIgfTtcbmludCBuOyIpOworICB2ZXJpZnlGb3JtYXQoInN0cnVjdCBmb28gYSA9IHtiYXJ9O1xuaW50IG47Iik7CisgIHZlcmlmeUZvcm1hdCgiY2xhc3MgZm9vIGEgPSB7YmFyfTtcbmludCBuOyIpOworICB2ZXJpZnlGb3JtYXQoInVuaW9uIGZvbyBhID0ge2Jhcn07XG5pbnQgbjsiKTsKIAogICAvLyBFbGFib3JhdGUgdHlwZXMgaW5zaWRlIGZ1bmN0aW9uIGRlZmluaXRpb25zLgogICB2ZXJpZnlGb3JtYXQoInN0cnVjdCBmb28gZigpIHt9XG5pbnQgbjsiKTsKQEAgLTQ4NjQsNiArNTMxNCw3IEBACiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBGb3JtYXRIYXNoSWZFeHByZXNzaW9ucykgeworICB2ZXJpZnlGb3JtYXQoIiNpZiBBQUFBICYmIEJCQkIiKTsKICAgLy8gRklYTUU6IENvbWUgdXAgd2l0aCBhIGJldHRlciBpbmRlbnRhdGlvbiBmb3IgI2VsaWYuCiAgIHZlcmlmeUZvcm1hdCgKICAgICAgICIjaWYgIWRlZmluZWQoQUFBQUFBQSkgJiYgKGRlZmluZWQgQ0NDQ0NDIHx8IGRlZmluZWQgREREREREKSAmJiAgXFxcbiIKQEAgLTQ5MDYsNiArNTM1NywxNyBAQAogICAgICAgICAgICAgICAgIiAgaWYgKHRydWUpIGNvbnRpbnVlO1xuIgogICAgICAgICAgICAgICAgIn0iLAogICAgICAgICAgICAgICAgU2hvcnRNZXJnZWRJZik7CisgIFNob3J0TWVyZ2VkSWYuQ29sdW1uTGltaXQgPSAyOTsKKyAgdmVyaWZ5Rm9ybWF0KCIjZGVmaW5lIEEgICAgICAgICAgICAgICAgICAgXFxcbiIKKyAgICAgICAgICAgICAgICIgIGlmIChhYWFhYWFhYWFhKSByZXR1cm4gMTsgXFxcbiIKKyAgICAgICAgICAgICAgICIgIHJldHVybiAyOyIsCisgICAgICAgICAgICAgICBTaG9ydE1lcmdlZElmKTsKKyAgU2hvcnRNZXJnZWRJZi5Db2x1bW5MaW1pdCA9IDI4OworICB2ZXJpZnlGb3JtYXQoIiNkZWZpbmUgQSAgICAgICAgIFxcXG4iCisgICAgICAgICAgICAgICAiICBpZiAoYWFhYWFhYWFhYSkgXFxcbiIKKyAgICAgICAgICAgICAgICIgICAgcmV0dXJuIDE7ICAgICBcXFxuIgorICAgICAgICAgICAgICAgIiAgcmV0dXJuIDI7IiwKKyAgICAgICAgICAgICAgIFNob3J0TWVyZ2VkSWYpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgQmxvY2tDb21tZW50c0luQ29udHJvbExvb3BzKSB7CkBAIC01MDU0LDEzICs1NTE2LDEzIEBACiAKIFRFU1RfRihGb3JtYXRUZXN0LCBCbG9ja0NvbW1lbnRzQXRFbmRPZkxpbmUpIHsKICAgRVhQRUNUX0VRKCJhID0ge1xuIgotICAgICAgICAgICAgIiAgMTExMSAvKiAgICAqL1xuIgorICAgICAgICAgICAgIiAgICAxMTExIC8qICAgICovXG4iCiAgICAgICAgICAgICAifTsiLAogICAgICAgICAgICAgZm9ybWF0KCJhID0gezExMTEgLyogICAgKi9cbiIKICAgICAgICAgICAgICAgICAgICAifTsiLAogICAgICAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDE1KSkpOwogICBFWFBFQ1RfRVEoImEgPSB7XG4iCi0gICAgICAgICAgICAiICAxMTExIC8qICAgICAgKi9cbiIKKyAgICAgICAgICAgICIgICAgMTExMSAvKiAgICAgICovXG4iCiAgICAgICAgICAgICAifTsiLAogICAgICAgICAgICAgZm9ybWF0KCJhID0gezExMTEgLyogICAgICAqL1xuIgogICAgICAgICAgICAgICAgICAgICJ9OyIsCkBAIC01MDY4LDggKzU1MzAsOCBAQAogCiAgIC8vIEZJWE1FOiBUaGUgZm9ybWF0dGluZyBpcyBzdGlsbCB3cm9uZyBoZXJlLgogICBFWFBFQ1RfRVEoImEgPSB7XG4iCi0gICAgICAgICAgICAiICAxMTExIC8qICAgICAgYVxuIgotICAgICAgICAgICAgIiAgICAgICAgICAqL1xuIgorICAgICAgICAgICAgIiAgICAxMTExIC8qICAgICAgYVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICovXG4iCiAgICAgICAgICAgICAifTsiLAogICAgICAgICAgICAgZm9ybWF0KCJhID0gezExMTEgLyogICAgICBhICovXG4iCiAgICAgICAgICAgICAgICAgICAgIn07IiwKQEAgLTUxNTYsMTEgKzU2MTgsNiBAQAogICB2ZXJpZnlHb29nbGVGb3JtYXQoIi0gZm9vOihpbnQpZm9vOyIpOwogfQogCi1URVNUX0YoRm9ybWF0VGVzdCwgRm9ybWF0T2JqQ0Jsb2NrcykgewotICB2ZXJpZnlGb3JtYXQoImludCAoXkJsb2NrKShpbnQsIGludCk7Iik7Ci0gIHZlcmlmeUZvcm1hdCgiaW50ICheQmxvY2sxKShpbnQsIGludCkgPSBeKGludCBpLCBpbnQgaikiKTsKLX0KLQogVEVTVF9GKEZvcm1hdFRlc3QsIEZvcm1hdE9iakNJbnRlcmZhY2UpIHsKICAgdmVyaWZ5Rm9ybWF0KCJAaW50ZXJmYWNlIEZvbyA6IE5TT2JqZWN0IDxOU1NvbWVEZWxlZ2F0ZT4ge1xuIgogICAgICAgICAgICAgICAgIkBwdWJsaWNcbiIKQEAgLTUzNzIsNiArNTgyOSwxMCBAQAogICAgICAgICAgICAgICAgIiAgICBpbnQgKmxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nTnVtYmVyO1xuIgogICAgICAgICAgICAgICAgIkBwcm9wZXJ0eShub25hdG9taWMsIGFzc2lnbiwgcmVhZG9ubHkpXG4iCiAgICAgICAgICAgICAgICAiICAgIE5TU3RyaW5nICpsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ05hbWU7Iik7CisKKyAgdmVyaWZ5Rm9ybWF0KCJAaW1wbGVtZW50YXRpb24gUFIxODQwNlxuIgorICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICJAZW5kIik7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBGb3JtYXRPYmpDTWV0aG9kRGVjbGFyYXRpb25zKSB7CkBAIC01NTAxLDYgKzU5NjIsMTcgQEAKICAgICAgICIgICAgICAgICAgICAgICAgICAgIGRlcjpOT10pO1xuIgogICAgICAgIn0iLAogICAgICAgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoNzApKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ7XG4iCisgICAgICAgICAgICAgICAiICBwb3B1cF93aW5kb3dfLnJlc2V0KFtbUmVuZGVyV2lkZ2V0UG9wdXBXaW5kb3cgYWxsb2NdXG4iCisgICAgICAgICAgICAgICAiICAgICAgaW5pdFdpdGhDb250ZW50UmVjdDpOU01ha2VSZWN0KG9yaWdpbl9nbG9iYWwueCxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luX2dsb2JhbC55LFxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3Mud2lkdGgoKSxcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLmhlaWdodCgpKVxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBzdHlsZU1hc2s6TlNCb3JkZXJsZXNzV2luZG93TWFza1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIGJhY2tpbmc6TlNCYWNraW5nU3RvcmVCdWZmZXJlZFxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgZGVmZXI6Tk9dKTtcbiIKKyAgICAgICAgICAgICAgICJ9IiwKKyAgICAgICAgICAgICAgIGdldENocm9taXVtU3R5bGUoRm9ybWF0U3R5bGU6OkxLX0NwcCkpOwogICB2ZXJpZnlGb3JtYXQoIltjb250ZW50c0NvbnRhaW5lciByZXBsYWNlU3Vidmlldzpbc3Vidmlld3Mgb2JqZWN0QXRJbmRleDowXVxuIgogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aDpjb250ZW50c05hdGl2ZVZpZXddOyIpOwogCkBAIC01NTQ4LDYgKzYwMjAsOCBAQAogICB2ZXJpZnlGb3JtYXQoIltzZWxmIC8vIGJyZWFrXG4iCiAgICAgICAgICAgICAgICAiICAgICAgYTphXG4iCiAgICAgICAgICAgICAgICAiICAgIGFhYTphYWFdOyIpOworICB2ZXJpZnlGb3JtYXQoImJvb2wgYSA9IChbYWFhYWFhYWEgYWFhYWFdID09IGFhYWFhYWFhYWFhYWFhYWFhIHx8XG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgIFthYWFhYWFhYSBhYWFhYV0gPT0gYWFhYWFhYWFhYWFhYWFhYWFhYWEpOyIpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgT2JqQ0F0KSB7CkBAIC01NjA2LDYgKzYwODAsMTIgQEAKICAgdmVyaWZ5Rm9ybWF0KCJAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIENHRmxvYXQgaG92ZXJBbHBoYTsiKTsKICAgdmVyaWZ5Rm9ybWF0KCJAcHJvcGVydHkoYXNzaWduLCBnZXR0ZXI9aXNFZGl0YWJsZSkgQk9PTCBlZGl0YWJsZTsiKTsKICAgdmVyaWZ5R29vZ2xlRm9ybWF0KCJAcHJvcGVydHkoYXNzaWduLCBnZXR0ZXI9aXNFZGl0YWJsZSkgQk9PTCBlZGl0YWJsZTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJAcHJvcGVydHkgKGFzc2lnbiwgZ2V0dGVyPWlzRWRpdGFibGUpIEJPT0wgZWRpdGFibGU7IiwKKyAgICAgICAgICAgICAgIGdldE1vemlsbGFTdHlsZSgpKTsKKyAgdmVyaWZ5Rm9ybWF0KCJAcHJvcGVydHkgQk9PTCBlZGl0YWJsZTsiLCBnZXRNb3ppbGxhU3R5bGUoKSk7CisgIHZlcmlmeUZvcm1hdCgiQHByb3BlcnR5IChhc3NpZ24sIGdldHRlcj1pc0VkaXRhYmxlKSBCT09MIGVkaXRhYmxlOyIsCisgICAgICAgICAgICAgICBnZXRXZWJLaXRTdHlsZSgpKTsKKyAgdmVyaWZ5Rm9ybWF0KCJAcHJvcGVydHkgQk9PTCBlZGl0YWJsZTsiLCBnZXRXZWJLaXRTdHlsZSgpKTsKIAogICB2ZXJpZnlGb3JtYXQoIkBpbXBvcnQgZm9vLmJhcjtcbiIKICAgICAgICAgICAgICAgICJAaW1wb3J0IGJhejsiKTsKQEAgLTU2MjUsMjYgKzYxMDUsMzAgQEAKICAgdmVyaWZ5Rm9ybWF0KCJOU051bWJlciAqcGlPdmVyVHdvID0gQChNX1BJIC8gMik7Iik7CiAgIHZlcmlmeUZvcm1hdCgiTlNOdW1iZXIgKmZhdm9yaXRlQ29sb3IgPSBAKEdyZWVuKTsiKTsKICAgdmVyaWZ5Rm9ybWF0KCJOU1N0cmluZyAqcGF0aCA9IEAoZ2V0ZW52KFwiUEFUSFwiKSk7Iik7CisKKyAgdmVyaWZ5Rm9ybWF0KCJbZGljdGlvbmFyeSBzZXRPYmplY3Q6QCgxKSBmb3JLZXk6QFwibnVtYmVyXCJdOyIpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgT2JqQ0RpY3RMaXRlcmFscykgewogICB2ZXJpZnlGb3JtYXQoIkB7Iik7CiAgIHZlcmlmeUZvcm1hdCgiQHt9Iik7Ci0gIHZlcmlmeUZvcm1hdCgiQHsgQFwib25lXCIgOiBAMSB9Iik7Ci0gIHZlcmlmeUZvcm1hdCgicmV0dXJuIEB7IEBcIm9uZVwiIDogQDEgfTsiKTsKLSAgdmVyaWZ5Rm9ybWF0KCJAeyBAXCJvbmVcIiA6IEAxLCB9Iik7CisgIHZlcmlmeUZvcm1hdCgiQHtAXCJvbmVcIiA6IEAxfSIpOworICB2ZXJpZnlGb3JtYXQoInJldHVybiBAe0BcIm9uZVwiIDogQDE7Iik7CisgIHZlcmlmeUZvcm1hdCgiQHtAXCJvbmVcIiA6IEAxfSIpOwogCi0gIHZlcmlmeUZvcm1hdCgiQHsgQFwib25lXCIgOiBAeyBAMiA6IEAxIH0gfSIpOwotICB2ZXJpZnlGb3JtYXQoIkB7IEBcIm9uZVwiIDogQHsgQDIgOiBAMSB9LCB9Iik7CisgIHZlcmlmeUZvcm1hdCgiQHtAXCJvbmVcIiA6IEB7QDIgOiBAMX19Iik7CisgIHZlcmlmeUZvcm1hdCgiQHtcbiIKKyAgICAgICAgICAgICAgICIgIEBcIm9uZVwiIDogQHtAMiA6IEAxfSxcbiIKKyAgICAgICAgICAgICAgICJ9Iik7CiAKLSAgdmVyaWZ5Rm9ybWF0KCJAeyAxID4gMiA/IEBcIm9uZVwiIDogQFwidHdvXCIgOiAxID4gMiA/IEAxIDogQDIgfSIpOworICB2ZXJpZnlGb3JtYXQoIkB7MSA+IDIgPyBAXCJvbmVcIiA6IEBcInR3b1wiIDogMSA+IDIgPyBAMSA6IEAyfSIpOwogICB2ZXJpZnlGb3JtYXQoIltzZWxmIHNldERpY3Q6QHt9Iik7Ci0gIHZlcmlmeUZvcm1hdCgiW3NlbGYgc2V0RGljdDpAeyBAMSA6IEAyIH0iKTsKLSAgdmVyaWZ5Rm9ybWF0KCJOU0xvZyhAXCIlQFwiLCBAeyBAMSA6IEAyLCBAMiA6IEAzIH1bQDFdKTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJbc2VsZiBzZXREaWN0OkB7QDEgOiBAMn0iKTsKKyAgdmVyaWZ5Rm9ybWF0KCJOU0xvZyhAXCIlQFwiLCBAe0AxIDogQDIsIEAyIDogQDN9W0AxXSk7Iik7CiAgIHZlcmlmeUZvcm1hdCgKLSAgICAgICJOU0RpY3Rpb25hcnkgKm1hc3NlcyA9IEB7IEBcIkhcIiA6IEAxLjAwNzgsIEBcIkhlXCIgOiBANC4wMDI2IH07Iik7CisgICAgICAiTlNEaWN0aW9uYXJ5ICptYXNzZXMgPSBAe0BcIkhcIiA6IEAxLjAwNzgsIEBcIkhlXCIgOiBANC4wMDI2fTsiKTsKICAgdmVyaWZ5Rm9ybWF0KAotICAgICAgIk5TRGljdGlvbmFyeSAqc2V0dGluZ3MgPSBAeyBBVkVuY29kZXJLZXkgOiBAKEFWQXVkaW9RdWFsaXR5TWF4KSB9OyIpOworICAgICAgIk5TRGljdGlvbmFyeSAqc2V0dGluZ3MgPSBAe0FWRW5jb2RlcktleSA6IEAoQVZBdWRpb1F1YWxpdHlNYXgpfTsiKTsKIAogICB2ZXJpZnlGb3JtYXQoCiAgICAgICAiTlNEaWN0aW9uYXJ5ICpkID0gQHtcbiIKQEAgLTU2NjIsNiArNjE0NiwxMSBAQAogICAgICAgIiAgTlNGb250QXR0cmlidXRlTmFtZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZSA6ICIKICAgICAgICJyZWd1bGFyRm9udCxcbiIKICAgICAgICJ9OyIpOworICB2ZXJpZnlGb3JtYXQoCisgICAgICAiQHtcbiIKKyAgICAgICIgIE5TRm9udEF0dHJpYnV0ZU5hbWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWUgOlxuIgorICAgICAgIiAgICAgIHJlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVndWxhckZvbnQsXG4iCisgICAgICAifTsiKTsKIAogICAvLyBXZSBzaG91bGQgdHJ5IHRvIGJlIHJvYnVzdCBpbiBjYXNlIHNvbWVvbmUgZm9yZ2V0cyB0aGUgIkAiLgogICB2ZXJpZnlGb3JtYXQoCkBAIC01NzA3LDYgKzYxOTYsMTQgQEAKICAgICAgICAgICAgICAgICIgIEBcImFhYWFhYWFhYWFhYWFhYWFhXCIsXG4iCiAgICAgICAgICAgICAgICAiICBAXCJhYWFhYWFhYWFhYWFhYWFhYVwiLFxuIgogICAgICAgICAgICAgICAgIl07Iik7CisgIHZlcmlmeUZvcm1hdCgKKyAgICAgICItIChOU0F0dHJpYnV0ZWRTdHJpbmcgKilhdHRyaWJ1dGVkU3RyaW5nRm9yU2VnbWVudDooTlNVSW50ZWdlcilzZWdtZW50XG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6KE5TVUludGVnZXIpaW5kZXhcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbkRpZ2l0QXR0cmlidXRlczpcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlNEaWN0aW9uYXJ5ICopbm9EaWdpdEF0dHJpYnV0ZXM7Iik7CisgIHZlcmlmeUZvcm1hdCgKKyAgICAgICJbc29tZUZ1bmN0aW9uIHNvbWVMb29vb29vb29vb29vb25nUGFyYW1ldGVyOlxuIgorICAgICAgIiAgICAgICAgICAgICAgICAgIEBbIE5TQnVuZGxlLm1haW5CdW5kbGUuaW5mb0RpY3Rpb25hcnlbQFwiYVwiXSBdXTsiKTsKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIFJlZm9ybWF0UmVnaW9uQWRqdXN0c0luZGVudCkgewpAQCAtNTc5Miw2ICs2Mjg5LDI5IEBACiAgICAgICAgICAgICBmb3JtYXQoIiAgaW50IGE7XG4iCiAgICAgICAgICAgICAgICAgICAgInZvaWQgZmZmZmZmKCkge30iLAogICAgICAgICAgICAgICAgICAgIDExLCAwLCBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucygxMSkpKTsKKworICBFWFBFQ1RfRVEoIiB2b2lkIGYoKSB7XG4iCisgICAgICAgICAgICAiI2RlZmluZSBBIDFcbiIKKyAgICAgICAgICAgICIgfSIsCisgICAgICAgICAgICBmb3JtYXQoIiB2b2lkIGYoKSB7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgI2RlZmluZSBBIDFcbiIgLy8gRm9ybWF0IHRoaXMgbGluZS4KKyAgICAgICAgICAgICAgICAgICAiIH0iLAorICAgICAgICAgICAgICAgICAgIDIwLCAwLCBnZXRMTFZNU3R5bGUoKSkpOworICBFWFBFQ1RfRVEoIiB2b2lkIGYoKSB7XG4iCisgICAgICAgICAgICAiICAgIGludCBpO1xuIgorICAgICAgICAgICAgIiNkZWZpbmUgQSBcXFxuIgorICAgICAgICAgICAgIiAgICBpbnQgaTsgIFxcXG4iCisgICAgICAgICAgICAiICAgaW50IGo7XG4iCisgICAgICAgICAgICAiICAgIGludCBrO1xuIgorICAgICAgICAgICAgIiB9IiwKKyAgICAgICAgICAgIGZvcm1hdCgiIHZvaWQgZigpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIGludCBpO1xuIgorICAgICAgICAgICAgICAgICAgICIjZGVmaW5lIEEgXFxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgIGludCBpOyAgXFxcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgaW50IGo7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIGludCBrO1xuIiAvLyBGb3JtYXQgdGhpcyBsaW5lLgorICAgICAgICAgICAgICAgICAgICIgfSIsCisgICAgICAgICAgICAgICAgICAgNjcsIDAsIGdldExMVk1TdHlsZSgpKSk7CiB9CiAKIFRFU1RfRihGb3JtYXRUZXN0LCBCcmVha1N0cmluZ0xpdGVyYWxzKSB7CkBAIC01OTU0LDcgKzY0NzQsNyBAQAogICAgICAgZm9ybWF0KCIjZGVmaW5lIEEgXCJzb21lIHRleHQgb3RoZXJcIjsiLCBBbGlnbkxlZnQpKTsKIH0KIAotVEVTVF9GKEZvcm1hdFRlc3QsIEJyZWFrc1dpZGVTdHJpbmdMaXRlcmFscykgeworVEVTVF9GKEZvcm1hdFRlc3QsIEJyZWFrc1dpZGVBbmROU1N0cmluZ0xpdGVyYWxzKSB7CiAgIEVYUEVDVF9FUSgKICAgICAgICJ1OFwidXRmOCBzdHJpbmcgXCJcbiIKICAgICAgICJ1OFwibGl0ZXJhbFwiOyIsCkBAIC01OTcwLDYgKzY0OTAsOSBAQAogICBFWFBFQ1RfRVEoIkxcIndpZGUgc3RyaW5nIFwiXG4iCiAgICAgICAgICAgICAiTFwibGl0ZXJhbFwiOyIsCiAgICAgICAgICAgICBmb3JtYXQoIkxcIndpZGUgc3RyaW5nIGxpdGVyYWxcIjsiLCBnZXRHb29nbGVTdHlsZVdpdGhDb2x1bW5zKDE2KSkpOworICBFWFBFQ1RfRVEoIkBcIk5TU3RyaW5nIFwiXG4iCisgICAgICAgICAgICAiQFwibGl0ZXJhbFwiOyIsCisgICAgICAgICAgICBmb3JtYXQoIkBcIk5TU3RyaW5nIGxpdGVyYWxcIjsiLCBnZXRHb29nbGVTdHlsZVdpdGhDb2x1bW5zKDE5KSkpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgQnJlYWtzUmF3U3RyaW5nTGl0ZXJhbHMpIHsKQEAgLTYwMjYsNyArNjU0OSw3IEBACiAKIFRFU1RfRihGb3JtYXRUZXN0LCBDb3VudHNDaGFyYWN0ZXJzSW5NdWx0aWxpbmVSYXdTdHJpbmdMaXRlcmFscykgewogICBFWFBFQ1RfRVEoImYoZyhSXCJ4KHJhdyBsaXRlcmFsKXhcIiwgYSksIGIpOyIsCi0gICAgICAgICAgICBmb3JtYXQoImYoZyhSXCJ4KHJhdyBsaXRlcmFsKXhcIiwgYSksIGIpOyIsIGdldEdvb2dsZVN0eWxlKCkpKTsKKyAgICAgICAgICAgIGZvcm1hdCgiZihnKFJcIngocmF3IGxpdGVyYWwpeFwiLCAgIGEpLCBiKTsiLCBnZXRHb29nbGVTdHlsZSgpKSk7CiAgIEVYUEVDVF9FUSgiZmZmZmZmZmZmZmYoZyhSXCJ4KFxuIgogICAgICAgICAgICAgIm11bHRpbGluZSByYXcgc3RyaW5nIGxpdGVyYWwgeHh4eHh4eHh4eHh4eHhcbiIKICAgICAgICAgICAgICIpeFwiLFxuIgpAQCAtNjA1NiwxMCArNjU3OSwxOSBAQAogICAgICAgICAgICAgICAgICAgIGdldEdvb2dsZVN0eWxlV2l0aENvbHVtbnMoMjApKSk7CiAgIEVYUEVDVF9FUSgiZmZmZmZmZmZmZmYoUlwieChcbiIKICAgICAgICAgICAgICJtdWx0aWxpbmUgcmF3IHN0cmluZyBsaXRlcmFsIHh4eHh4eHh4eHh4eHh4XG4iCi0gICAgICAgICAgICAiKXhcIiArXG4iCi0gICAgICAgICAgICAiICAgICAgICAgICAgYmJiYmJiKTsiLAorICAgICAgICAgICAgIil4XCIgKyBiYmJiYmIpOyIsCiAgICAgICAgICAgICBmb3JtYXQoImZmZmZmZmZmZmZmKFJcIngoXG4iCiAgICAgICAgICAgICAgICAgICAgIm11bHRpbGluZSByYXcgc3RyaW5nIGxpdGVyYWwgeHh4eHh4eHh4eHh4eHhcbiIKKyAgICAgICAgICAgICAgICAgICAiKXhcIiArICAgYmJiYmJiKTsiLAorICAgICAgICAgICAgICAgICAgIGdldEdvb2dsZVN0eWxlV2l0aENvbHVtbnMoMjApKSk7CisgIEVYUEVDVF9FUSgiZmZmZmZmZmZmZmYoXG4iCisgICAgICAgICAgICAiICAgIFJcIngoXG4iCisgICAgICAgICAgICAibXVsdGlsaW5lIHJhdyBzdHJpbmcgbGl0ZXJhbCB4eHh4eHh4eHh4eHh4eFxuIgorICAgICAgICAgICAgIil4XCIgK1xuIgorICAgICAgICAgICAgIiAgICBiYmJiYmIpOyIsCisgICAgICAgICAgICBmb3JtYXQoImZmZmZmZmZmZmZmKFxuIgorICAgICAgICAgICAgICAgICAgICIgUlwieChcbiIKKyAgICAgICAgICAgICAgICAgICAibXVsdGlsaW5lIHJhdyBzdHJpbmcgbGl0ZXJhbCB4eHh4eHh4eHh4eHh4eFxuIgogICAgICAgICAgICAgICAgICAgICIpeFwiICsgYmJiYmJiKTsiLAogICAgICAgICAgICAgICAgICAgIGdldEdvb2dsZVN0eWxlV2l0aENvbHVtbnMoMjApKSk7CiB9CkBAIC02MDczLDggKzY2MDUsMTAgQEAKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIERvZXNOb3RUcnlUb1BhcnNlVURMaXRlcmFsc0luUHJlQ3BwMTFDb2RlKSB7CisgIEZvcm1hdFN0eWxlIFN0eWxlID0gZ2V0TExWTVN0eWxlKCk7CisgIFN0eWxlLlN0YW5kYXJkID0gRm9ybWF0U3R5bGU6OkxTX0NwcDAzOwogICBFWFBFQ1RfRVEoIiNkZWZpbmUgeChfYSkgcHJpbnRmKFwiZm9vXCIgX2EpOyIsCi0gICAgICAgICAgICBmb3JtYXQoIiNkZWZpbmUgeChfYSkgcHJpbnRmKFwiZm9vXCJfYSk7IiwgZ2V0TExWTVN0eWxlKCkpKTsKKyAgICAgICAgICAgIGZvcm1hdCgiI2RlZmluZSB4KF9hKSBwcmludGYoXCJmb29cIl9hKTsiLCBTdHlsZSkpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgQnJlYWtTdHJpbmdMaXRlcmFsc0JlZm9yZVVuYnJlYWthYmxlVG9rZW5TZXF1ZW5jZSkgewpAQCAtNjE3MiwxNCArNjcwNiwxOCBAQAogICB2ZXJpZnlGb3JtYXQoInZvaWQgZigpIHtcbiIKICAgICAgICAgICAgICAgICIgIHJldHVybiBnKCkge31cbiIKICAgICAgICAgICAgICAgICIgIHZvaWQgaCgpIHt9Iik7Ci0gIHZlcmlmeUZvcm1hdCgiaWYgKGZvbylcbiIKLSAgICAgICAgICAgICAgICIgIHJldHVybiB7IGZvcmdvdF9jbG9zaW5nX2JyYWNlKCk7XG4iCi0gICAgICAgICAgICAgICAidGVzdCgpOyIpOwotICB2ZXJpZnlGb3JtYXQoImludCBhW10gPSB7IHZvaWQgZm9yZ290X2Nsb3NpbmdfYnJhY2UoKSB7IGYoKTtcbiIKKyAgdmVyaWZ5Rm9ybWF0KCJpbnQgYVtdID0ge3ZvaWQgZm9yZ290X2Nsb3NpbmdfYnJhY2UoKSB7ZigpO1xuIgogICAgICAgICAgICAgICAgImcoKTtcbiIKICAgICAgICAgICAgICAgICJ9Iik7CiB9CiAKK1RFU1RfRihGb3JtYXRUZXN0LCBEb05vdFByZW1hdHVyZWx5RW5kVW53cmFwcGVkTGluZUZvclJldHVyblN0YXRlbWVudHMpIHsKKyAgdmVyaWZ5Rm9ybWF0KAorICAgICAgInZvaWQgZigpIHtcbiIKKyAgICAgICIgIHJldHVybiBDe3BhcmFtMSwgcGFyYW0yfS5Tb21lQ2FsbChwYXJhbTEsIHBhcmFtMik7XG4iCisgICAgICAifVxuIik7Cit9CisKIFRFU1RfRihGb3JtYXRUZXN0LCBGb3JtYXRzQ2xvc2luZ0JyYWNlc0luRW1wdHlOZXN0ZWRCbG9ja3MpIHsKICAgdmVyaWZ5Rm9ybWF0KCJjbGFzcyBYIHtcbiIKICAgICAgICAgICAgICAgICIgIHZvaWQgZigpIHtcbiIKQEAgLTYxOTEsNiArNjcyOSw3IEBACiBURVNUX0YoRm9ybWF0VGVzdCwgQ29uZmlndXJhYmxlSW5kZW50V2lkdGgpIHsKICAgRm9ybWF0U3R5bGUgRWlnaHRJbmRlbnQgPSBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucygxOCk7CiAgIEVpZ2h0SW5kZW50LkluZGVudFdpZHRoID0gODsKKyAgRWlnaHRJbmRlbnQuQ29udGludWF0aW9uSW5kZW50V2lkdGggPSA4OwogICB2ZXJpZnlGb3JtYXQoInZvaWQgZigpIHtcbiIKICAgICAgICAgICAgICAgICIgICAgICAgIHNvbWVGdW5jdGlvbigpO1xuIgogICAgICAgICAgICAgICAgIiAgICAgICAgaWYgKHRydWUpIHtcbiIKQEAgLTYyMDUsOCArNjc0NCw3IEBACiAgICAgICAgICAgICAgICBFaWdodEluZGVudCk7CiAgIHZlcmlmeUZvcm1hdCgiaW50IHhbXSA9IHtcbiIKICAgICAgICAgICAgICAgICIgICAgICAgIGNhbGwoKSxcbiIKLSAgICAgICAgICAgICAgICIgICAgICAgIGNhbGwoKSxcbiIKLSAgICAgICAgICAgICAgICJ9OyIsCisgICAgICAgICAgICAgICAiICAgICAgICBjYWxsKCl9OyIsCiAgICAgICAgICAgICAgICBFaWdodEluZGVudCk7CiB9CiAKQEAgLTYzMjAsMTcgKzY4NTgsMTcgQEAKICAgICAgICAgICAgICAgICAgICBUYWIpKTsKIAogICBUYWIuVXNlVGFiID0gRm9ybWF0U3R5bGU6OlVUX0ZvckluZGVudGF0aW9uOwotICB2ZXJpZnlGb3JtYXQoIlQgdFtdID0ge1xuIgotICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgotICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgotICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgotICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgotICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLFxuIgotICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhXG4iCisgIHZlcmlmeUZvcm1hdCgie1xuIgorICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSgpO1xuIgorICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSgpO1xuIgorICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSgpO1xuIgorICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSgpO1xuIgorICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSgpO1xuIgorICAgICAgICAgICAgICAgIlx0YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSgpO1xuIgogICAgICAgICAgICAgICAgIn07IiwKICAgICAgICAgICAgICAgIFRhYik7CiAgIHZlcmlmeUZvcm1hdCgiZW51bSBBIHtcbiIKLSAgICAgICAgICAgICAgICJcdGExLFxuIgorICAgICAgICAgICAgICAgIlx0YTEsIC8vIEZvcmNlIG11bHRpcGxlIGxpbmVzXG4iCiAgICAgICAgICAgICAgICAiXHRhMixcbiIKICAgICAgICAgICAgICAgICJcdGEzXG4iCiAgICAgICAgICAgICAgICAifTsiLApAQCAtNjUwMCw5ICs3MDM4LDkgQEAKICAgICAgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGUoKSkpOwogfQogCi1URVNUX0YoRm9ybWF0VGVzdCwgQ29uZmlndXJhYmxlU3BhY2VBZnRlckNvbnRyb2xTdGF0ZW1lbnRLZXl3b3JkKSB7CitURVNUX0YoRm9ybWF0VGVzdCwgQ29uZmlndXJhYmxlU3BhY2VCZWZvcmVQYXJlbnMpIHsKICAgRm9ybWF0U3R5bGUgTm9TcGFjZSA9IGdldExMVk1TdHlsZSgpOwotICBOb1NwYWNlLlNwYWNlQWZ0ZXJDb250cm9sU3RhdGVtZW50S2V5d29yZCA9IGZhbHNlOworICBOb1NwYWNlLlNwYWNlQmVmb3JlUGFyZW5zID0gRm9ybWF0U3R5bGU6OlNCUE9fTmV2ZXI7CiAKICAgdmVyaWZ5Rm9ybWF0KCJ3aGlsZSh0cnVlKVxuIgogICAgICAgICAgICAgICAgIiAgY29udGludWU7IiwgTm9TcGFjZSk7CkBAIC02NTE5LDYgKzcwNTcsNDIgQEAKICAgICAgICAgICAgICAgICJkZWZhdWx0OlxuIgogICAgICAgICAgICAgICAgIiAgYnJlYWs7XG4iCiAgICAgICAgICAgICAgICAifSIsIE5vU3BhY2UpOworCisgIEZvcm1hdFN0eWxlIFNwYWNlID0gZ2V0TExWTVN0eWxlKCk7CisgIFNwYWNlLlNwYWNlQmVmb3JlUGFyZW5zID0gRm9ybWF0U3R5bGU6OlNCUE9fQWx3YXlzOworCisgIHZlcmlmeUZvcm1hdCgiaW50IGYgKCk7IiwgU3BhY2UpOworICB2ZXJpZnlGb3JtYXQoInZvaWQgZiAoaW50IGEsIFQgYikge1xuIgorICAgICAgICAgICAgICAgIiAgd2hpbGUgKHRydWUpXG4iCisgICAgICAgICAgICAgICAiICAgIGNvbnRpbnVlO1xuIgorICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgU3BhY2UpOworICB2ZXJpZnlGb3JtYXQoImlmICh0cnVlKVxuIgorICAgICAgICAgICAgICAgIiAgZiAoKTtcbiIKKyAgICAgICAgICAgICAgICJlbHNlIGlmICh0cnVlKVxuIgorICAgICAgICAgICAgICAgIiAgZiAoKTsiLAorICAgICAgICAgICAgICAgU3BhY2UpOworICB2ZXJpZnlGb3JtYXQoImRvIHtcbiIKKyAgICAgICAgICAgICAgICIgIGRvX3NvbWV0aGluZyAoKTtcbiIKKyAgICAgICAgICAgICAgICJ9IHdoaWxlIChzb21ldGhpbmcgKCkpOyIsCisgICAgICAgICAgICAgICBTcGFjZSk7CisgIHZlcmlmeUZvcm1hdCgic3dpdGNoICh4KSB7XG4iCisgICAgICAgICAgICAgICAiZGVmYXVsdDpcbiIKKyAgICAgICAgICAgICAgICIgIGJyZWFrO1xuIgorICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgU3BhY2UpOworICB2ZXJpZnlGb3JtYXQoIkE6OkEgKCkgOiBhICgxKSB7fSIsIFNwYWNlKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGYgKCkgX19hdHRyaWJ1dGVfXyAoKGFzZGYpKTsiLCBTcGFjZSk7CisgIHZlcmlmeUZvcm1hdCgiKigmYSArIDEpO1xuIgorICAgICAgICAgICAgICAgIiYoKCZhKVsxXSk7XG4iCisgICAgICAgICAgICAgICAiYVsoYiArIGMpICogZF07XG4iCisgICAgICAgICAgICAgICAiKCgoYSArIDEpICogMikgKyAzKSAqIDQ7IiwKKyAgICAgICAgICAgICAgIFNwYWNlKTsKKyAgdmVyaWZ5Rm9ybWF0KCIjZGVmaW5lIEEoeCkgeCIsIFNwYWNlKTsKKyAgdmVyaWZ5Rm9ybWF0KCIjZGVmaW5lIEEgKHgpIHgiLCBTcGFjZSk7CisgIHZlcmlmeUZvcm1hdCgiI2lmIGRlZmluZWQoeClcbiIKKyAgICAgICAgICAgICAgICIjZW5kaWYiLAorICAgICAgICAgICAgICAgU3BhY2UpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgQ29uZmlndXJhYmxlU3BhY2VzSW5QYXJlbnRoZXNlcykgewpAQCAtNjYwOCwxMCArNzE4Miw3IEBACiAgICAgICAgICAgICAgICAiICAgICAgYigpO1xuIgogICAgICAgICAgICAgICAgIiAgICB9XG4iCiAgICAgICAgICAgICAgICAiICB9XG4iCi0gICAgICAgICAgICAgICAiICB2b2lkIGcoKVxuIgotICAgICAgICAgICAgICAgIiAge1xuIgotICAgICAgICAgICAgICAgIiAgICByZXR1cm47XG4iCi0gICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAiICB2b2lkIGcoKSB7IHJldHVybjsgfVxuIgogICAgICAgICAgICAgICAgIn1cbiIKICAgICAgICAgICAgICAgICJ9IiwKICAgICAgICAgICAgICAgIEJyZWFrQmVmb3JlQnJhY2UpOwpAQCAtNjYyOSwxMCArNzIwMCw3IEBACiAgICAgICAgICAgICAgICAiICAgICAgYigpO1xuIgogICAgICAgICAgICAgICAgIiAgICB9XG4iCiAgICAgICAgICAgICAgICAiICB9XG4iCi0gICAgICAgICAgICAgICAiICB2b2lkIGcoKVxuIgotICAgICAgICAgICAgICAgIiAge1xuIgotICAgICAgICAgICAgICAgIiAgICByZXR1cm47XG4iCi0gICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAiICB2b2lkIGcoKSB7IHJldHVybjsgfVxuIgogICAgICAgICAgICAgICAgIn1cbiIKICAgICAgICAgICAgICAgICJ9IiwKICAgICAgICAgICAgICAgIEJyZWFrQmVmb3JlQnJhY2UpOwpAQCAtNjY1MywxMCArNzIyMSw3IEBACiAgICAgICAgICAgICAgICAiICAgICAgYigpO1xuIgogICAgICAgICAgICAgICAgIiAgICB9XG4iCiAgICAgICAgICAgICAgICAiICB9XG4iCi0gICAgICAgICAgICAgICAiICB2b2lkIGcoKVxuIgotICAgICAgICAgICAgICAgIiAge1xuIgotICAgICAgICAgICAgICAgIiAgICByZXR1cm47XG4iCi0gICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICAiICB2b2lkIGcoKSB7IHJldHVybjsgfVxuIgogICAgICAgICAgICAgICAgIn1cbiIKICAgICAgICAgICAgICAgICJ9IiwKICAgICAgICAgICAgICAgIEJyZWFrQmVmb3JlQnJhY2UpOwpAQCAtNjcyMSw2ICs3Mjg2LDE2IEBACiAgICAgICAgICAgICAgICAifVxuIiwKICAgICAgICAgICAgICAgIEJyZWFrQmVmb3JlQnJhY2UpOwogCisgIEJyZWFrQmVmb3JlQnJhY2UuQ29sdW1uTGltaXQgPSAxOTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGYoKSB7IGludCBpOyB9IiwgQnJlYWtCZWZvcmVCcmFjZSk7CisgIEJyZWFrQmVmb3JlQnJhY2UuQ29sdW1uTGltaXQgPSAxODsKKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGYoKVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgIGludCBpO1xuIgorICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgQnJlYWtCZWZvcmVCcmFjZSk7CisgIEJyZWFrQmVmb3JlQnJhY2UuQ29sdW1uTGltaXQgPSA4MDsKKwogICBGb3JtYXRTdHlsZSBCcmVha0JlZm9yZUJyYWNlU2hvcnRJZnMgPSBCcmVha0JlZm9yZUJyYWNlOwogICBCcmVha0JlZm9yZUJyYWNlU2hvcnRJZnMuQWxsb3dTaG9ydElmU3RhdGVtZW50c09uQVNpbmdsZUxpbmUgPSB0cnVlOwogICBCcmVha0JlZm9yZUJyYWNlU2hvcnRJZnMuQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZSA9IHRydWU7CkBAIC02NzQ3LDYgKzczMjIsOTEgQEAKICAgICAgICAgICAgICAgIEJyZWFrQmVmb3JlQnJhY2VTaG9ydElmcyk7CiB9CiAKK1RFU1RfRihGb3JtYXRUZXN0LCBHTlVCcmFjZUJyZWFraW5nKSB7CisgIEZvcm1hdFN0eWxlIEdOVUJyYWNlU3R5bGUgPSBnZXRMTFZNU3R5bGUoKTsKKyAgR05VQnJhY2VTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyA9IEZvcm1hdFN0eWxlOjpCU19HTlU7CisgIHZlcmlmeUZvcm1hdCgibmFtZXNwYWNlIGFcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiY2xhc3MgQVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgIHZvaWQgZigpXG4iCisgICAgICAgICAgICAgICAiICB7XG4iCisgICAgICAgICAgICAgICAiICAgIGludCBhO1xuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgaW50IGI7XG4iCisgICAgICAgICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgICAgICAgICIgICAgaWYgKHRydWUpXG4iCisgICAgICAgICAgICAgICAiICAgICAge1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgYSgpO1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgYigpO1xuIgorICAgICAgICAgICAgICAgIiAgICAgIH1cbiIKKyAgICAgICAgICAgICAgICIgIH1cbiIKKyAgICAgICAgICAgICAgICIgIHZvaWQgZygpIHsgcmV0dXJuOyB9XG4iCisgICAgICAgICAgICAgICAifVxuIgorICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgR05VQnJhY2VTdHlsZSk7CisKKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGYoKVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICIgIGlmICh0cnVlKVxuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgYSgpO1xuIgorICAgICAgICAgICAgICAgIiAgICB9XG4iCisgICAgICAgICAgICAgICAiICBlbHNlIGlmIChmYWxzZSlcbiIKKyAgICAgICAgICAgICAgICIgICAge1xuIgorICAgICAgICAgICAgICAgIiAgICAgIGIoKTtcbiIKKyAgICAgICAgICAgICAgICIgICAgfVxuIgorICAgICAgICAgICAgICAgIiAgZWxzZVxuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgYygpO1xuIgorICAgICAgICAgICAgICAgIiAgICB9XG4iCisgICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICAgIEdOVUJyYWNlU3R5bGUpOworCisgIHZlcmlmeUZvcm1hdCgidm9pZCBmKClcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpXG4iCisgICAgICAgICAgICAgICAiICAgIHtcbiIKKyAgICAgICAgICAgICAgICIgICAgICBhKCk7XG4iCisgICAgICAgICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgICAgICAgICIgIHdoaWxlIChmYWxzZSlcbiIKKyAgICAgICAgICAgICAgICIgICAge1xuIgorICAgICAgICAgICAgICAgIiAgICAgIGIoKTtcbiIKKyAgICAgICAgICAgICAgICIgICAgfVxuIgorICAgICAgICAgICAgICAgIiAgZG9cbiIKKyAgICAgICAgICAgICAgICIgICAge1xuIgorICAgICAgICAgICAgICAgIiAgICAgIGMoKTtcbiIKKyAgICAgICAgICAgICAgICIgICAgfVxuIgorICAgICAgICAgICAgICAgIiAgd2hpbGUgKGZhbHNlKTtcbiIKKyAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgR05VQnJhY2VTdHlsZSk7CisKKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGYoaW50IGEpXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIiAgc3dpdGNoIChhKVxuIgorICAgICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAgICAiICAgIGNhc2UgMDpcbiIKKyAgICAgICAgICAgICAgICIgICAgICBicmVhaztcbiIKKyAgICAgICAgICAgICAgICIgICAgY2FzZSAxOlxuIgorICAgICAgICAgICAgICAgIiAgICAgIHtcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgIGJyZWFrO1xuIgorICAgICAgICAgICAgICAgIiAgICAgIH1cbiIKKyAgICAgICAgICAgICAgICIgICAgY2FzZSAyOlxuIgorICAgICAgICAgICAgICAgIiAgICAgIHtcbiIKKyAgICAgICAgICAgICAgICIgICAgICB9XG4iCisgICAgICAgICAgICAgICAiICAgICAgYnJlYWs7XG4iCisgICAgICAgICAgICAgICAiICAgIGRlZmF1bHQ6XG4iCisgICAgICAgICAgICAgICAiICAgICAgYnJlYWs7XG4iCisgICAgICAgICAgICAgICAiICAgIH1cbiIKKyAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgR05VQnJhY2VTdHlsZSk7CisKKyAgdmVyaWZ5Rm9ybWF0KCJlbnVtIFhcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICBZID0gMCxcbiIKKyAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgR05VQnJhY2VTdHlsZSk7Cit9CiBURVNUX0YoRm9ybWF0VGVzdCwgQ2F0Y2hFeGNlcHRpb25SZWZlcmVuY2VCaW5kaW5nKSB7CiAgIHZlcmlmeUZvcm1hdCgidm9pZCBmKCkge1xuIgogICAgICAgICAgICAgICAgIiAgdHJ5IHtcbiIKQEAgLTY3NjAsNDggKzc0MjAsMTAyIEBACiBURVNUX0YoRm9ybWF0VGVzdCwgVW5kZXJzdGFuZHNQcmFnbWFzKSB7CiAgIHZlcmlmeUZvcm1hdCgiI3ByYWdtYSBvbXAgcmVkdWN0aW9uKHwgOiB2YXIpIik7CiAgIHZlcmlmeUZvcm1hdCgiI3ByYWdtYSBvbXAgcmVkdWN0aW9uKCsgOiB2YXIpIik7CisKKyAgRVhQRUNUX0VRKCIjcHJhZ21hIG1hcmsgQW55IG5vbi1oeXBoZW5hdGVkIG9yIGh5cGhlbmF0ZWQgc3RyaW5nICIKKyAgICAgICAgICAgICIoaW5jbHVkaW5nIHBhcmVudGhlc2VzKS4iLAorICAgICAgICAgICAgZm9ybWF0KCIjcHJhZ21hICAgIG1hcmsgICBBbnkgbm9uLWh5cGhlbmF0ZWQgb3IgaHlwaGVuYXRlZCBzdHJpbmcgIgorICAgICAgICAgICAgICAgICAgICIoaW5jbHVkaW5nIHBhcmVudGhlc2VzKS4iKSk7CiB9CiAKLWJvb2wgYWxsU3R5bGVzRXF1YWwoQXJyYXlSZWY8Rm9ybWF0U3R5bGU+IFN0eWxlcykgewotICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IFN0eWxlcy5zaXplKCk7ICsraSkKLSAgICBpZiAoIShTdHlsZXNbMF0gPT0gU3R5bGVzW2ldKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19CisjZGVmaW5lIEVYUEVDVF9BTExfU1RZTEVTX0VRVUFMKFN0eWxlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IFN0eWxlcy5zaXplKCk7ICsraSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFWFBFQ1RfRVEoU3R5bGVzWzBdLCBTdHlsZXNbaV0pIDw8ICJTdHlsZSAjIiA8PCBpIDw8ICIgb2YgIiAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBTdHlsZXMuc2l6ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkaWZmZXJzIGZyb20gU3R5bGUgIzAiCiAKIFRFU1RfRihGb3JtYXRUZXN0LCBHZXRzUHJlZGVmaW5lZFN0eWxlQnlOYW1lKSB7Ci0gIEZvcm1hdFN0eWxlIFN0eWxlc1szXTsKKyAgU21hbGxWZWN0b3I8Rm9ybWF0U3R5bGUsIDM+IFN0eWxlczsKKyAgU3R5bGVzLnJlc2l6ZSgzKTsKIAogICBTdHlsZXNbMF0gPSBnZXRMTFZNU3R5bGUoKTsKLSAgRVhQRUNUX1RSVUUoZ2V0UHJlZGVmaW5lZFN0eWxlKCJMTFZNIiwgJlN0eWxlc1sxXSkpOwotICBFWFBFQ1RfVFJVRShnZXRQcmVkZWZpbmVkU3R5bGUoImxMdk0iLCAmU3R5bGVzWzJdKSk7Ci0gIEVYUEVDVF9UUlVFKGFsbFN0eWxlc0VxdWFsKFN0eWxlcykpOworICBFWFBFQ1RfVFJVRShnZXRQcmVkZWZpbmVkU3R5bGUoIkxMVk0iLCBGb3JtYXRTdHlsZTo6TEtfQ3BwLCAmU3R5bGVzWzFdKSk7CisgIEVYUEVDVF9UUlVFKGdldFByZWRlZmluZWRTdHlsZSgibEx2TSIsIEZvcm1hdFN0eWxlOjpMS19DcHAsICZTdHlsZXNbMl0pKTsKKyAgRVhQRUNUX0FMTF9TVFlMRVNfRVFVQUwoU3R5bGVzKTsKIAogICBTdHlsZXNbMF0gPSBnZXRHb29nbGVTdHlsZSgpOwotICBFWFBFQ1RfVFJVRShnZXRQcmVkZWZpbmVkU3R5bGUoIkdvb2dsZSIsICZTdHlsZXNbMV0pKTsKLSAgRVhQRUNUX1RSVUUoZ2V0UHJlZGVmaW5lZFN0eWxlKCJnT09nbGUiLCAmU3R5bGVzWzJdKSk7Ci0gIEVYUEVDVF9UUlVFKGFsbFN0eWxlc0VxdWFsKFN0eWxlcykpOworICBFWFBFQ1RfVFJVRShnZXRQcmVkZWZpbmVkU3R5bGUoIkdvb2dsZSIsIEZvcm1hdFN0eWxlOjpMS19DcHAsICZTdHlsZXNbMV0pKTsKKyAgRVhQRUNUX1RSVUUoZ2V0UHJlZGVmaW5lZFN0eWxlKCJnT09nbGUiLCBGb3JtYXRTdHlsZTo6TEtfQ3BwLCAmU3R5bGVzWzJdKSk7CisgIEVYUEVDVF9BTExfU1RZTEVTX0VRVUFMKFN0eWxlcyk7CiAKLSAgU3R5bGVzWzBdID0gZ2V0Q2hyb21pdW1TdHlsZSgpOwotICBFWFBFQ1RfVFJVRShnZXRQcmVkZWZpbmVkU3R5bGUoIkNocm9taXVtIiwgJlN0eWxlc1sxXSkpOwotICBFWFBFQ1RfVFJVRShnZXRQcmVkZWZpbmVkU3R5bGUoImNIUm9NaVVNIiwgJlN0eWxlc1syXSkpOwotICBFWFBFQ1RfVFJVRShhbGxTdHlsZXNFcXVhbChTdHlsZXMpKTsKKyAgU3R5bGVzWzBdID0gZ2V0R29vZ2xlU3R5bGUoRm9ybWF0U3R5bGU6OkxLX0phdmFTY3JpcHQpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIGdldFByZWRlZmluZWRTdHlsZSgiR29vZ2xlIiwgRm9ybWF0U3R5bGU6OkxLX0phdmFTY3JpcHQsICZTdHlsZXNbMV0pKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBnZXRQcmVkZWZpbmVkU3R5bGUoImdPT2dsZSIsIEZvcm1hdFN0eWxlOjpMS19KYXZhU2NyaXB0LCAmU3R5bGVzWzJdKSk7CisgIEVYUEVDVF9BTExfU1RZTEVTX0VRVUFMKFN0eWxlcyk7CisKKyAgU3R5bGVzWzBdID0gZ2V0Q2hyb21pdW1TdHlsZShGb3JtYXRTdHlsZTo6TEtfQ3BwKTsKKyAgRVhQRUNUX1RSVUUoZ2V0UHJlZGVmaW5lZFN0eWxlKCJDaHJvbWl1bSIsIEZvcm1hdFN0eWxlOjpMS19DcHAsICZTdHlsZXNbMV0pKTsKKyAgRVhQRUNUX1RSVUUoZ2V0UHJlZGVmaW5lZFN0eWxlKCJjSFJvTWlVTSIsIEZvcm1hdFN0eWxlOjpMS19DcHAsICZTdHlsZXNbMl0pKTsKKyAgRVhQRUNUX0FMTF9TVFlMRVNfRVFVQUwoU3R5bGVzKTsKIAogICBTdHlsZXNbMF0gPSBnZXRNb3ppbGxhU3R5bGUoKTsKLSAgRVhQRUNUX1RSVUUoZ2V0UHJlZGVmaW5lZFN0eWxlKCJNb3ppbGxhIiwgJlN0eWxlc1sxXSkpOwotICBFWFBFQ1RfVFJVRShnZXRQcmVkZWZpbmVkU3R5bGUoIm1vWklMbGEiLCAmU3R5bGVzWzJdKSk7Ci0gIEVYUEVDVF9UUlVFKGFsbFN0eWxlc0VxdWFsKFN0eWxlcykpOworICBFWFBFQ1RfVFJVRShnZXRQcmVkZWZpbmVkU3R5bGUoIk1vemlsbGEiLCBGb3JtYXRTdHlsZTo6TEtfQ3BwLCAmU3R5bGVzWzFdKSk7CisgIEVYUEVDVF9UUlVFKGdldFByZWRlZmluZWRTdHlsZSgibW9aSUxsYSIsIEZvcm1hdFN0eWxlOjpMS19DcHAsICZTdHlsZXNbMl0pKTsKKyAgRVhQRUNUX0FMTF9TVFlMRVNfRVFVQUwoU3R5bGVzKTsKIAogICBTdHlsZXNbMF0gPSBnZXRXZWJLaXRTdHlsZSgpOwotICBFWFBFQ1RfVFJVRShnZXRQcmVkZWZpbmVkU3R5bGUoIldlYktpdCIsICZTdHlsZXNbMV0pKTsKLSAgRVhQRUNUX1RSVUUoZ2V0UHJlZGVmaW5lZFN0eWxlKCJ3RWJLaXQiLCAmU3R5bGVzWzJdKSk7Ci0gIEVYUEVDVF9UUlVFKGFsbFN0eWxlc0VxdWFsKFN0eWxlcykpOworICBFWFBFQ1RfVFJVRShnZXRQcmVkZWZpbmVkU3R5bGUoIldlYktpdCIsIEZvcm1hdFN0eWxlOjpMS19DcHAsICZTdHlsZXNbMV0pKTsKKyAgRVhQRUNUX1RSVUUoZ2V0UHJlZGVmaW5lZFN0eWxlKCJ3RWJLaXQiLCBGb3JtYXRTdHlsZTo6TEtfQ3BwLCAmU3R5bGVzWzJdKSk7CisgIEVYUEVDVF9BTExfU1RZTEVTX0VRVUFMKFN0eWxlcyk7CiAKLSAgRVhQRUNUX0ZBTFNFKGdldFByZWRlZmluZWRTdHlsZSgicXdlcnR5IiwgJlN0eWxlc1swXSkpOworICBTdHlsZXNbMF0gPSBnZXRHTlVTdHlsZSgpOworICBFWFBFQ1RfVFJVRShnZXRQcmVkZWZpbmVkU3R5bGUoIkdOVSIsIEZvcm1hdFN0eWxlOjpMS19DcHAsICZTdHlsZXNbMV0pKTsKKyAgRVhQRUNUX1RSVUUoZ2V0UHJlZGVmaW5lZFN0eWxlKCJnblUiLCBGb3JtYXRTdHlsZTo6TEtfQ3BwLCAmU3R5bGVzWzJdKSk7CisgIEVYUEVDVF9BTExfU1RZTEVTX0VRVUFMKFN0eWxlcyk7CisKKyAgRVhQRUNUX0ZBTFNFKGdldFByZWRlZmluZWRTdHlsZSgicXdlcnR5IiwgRm9ybWF0U3R5bGU6OkxLX0NwcCwgJlN0eWxlc1swXSkpOwogfQogCi1URVNUX0YoRm9ybWF0VGVzdCwgUGFyc2VzQ29uZmlndXJhdGlvbikgewotICBGb3JtYXRTdHlsZSBTdHlsZSA9IHt9OworVEVTVF9GKEZvcm1hdFRlc3QsIEdldHNDb3JyZWN0QmFzZWRPblN0eWxlKSB7CisgIFNtYWxsVmVjdG9yPEZvcm1hdFN0eWxlLCA4PiBTdHlsZXM7CisgIFN0eWxlcy5yZXNpemUoMik7CisKKyAgU3R5bGVzWzBdID0gZ2V0R29vZ2xlU3R5bGUoKTsKKyAgU3R5bGVzWzFdID0gZ2V0TExWTVN0eWxlKCk7CisgIEVYUEVDVF9FUSgwLCBwYXJzZUNvbmZpZ3VyYXRpb24oIkJhc2VkT25TdHlsZTogR29vZ2xlIiwgJlN0eWxlc1sxXSkudmFsdWUoKSk7CisgIEVYUEVDVF9BTExfU1RZTEVTX0VRVUFMKFN0eWxlcyk7CisKKyAgU3R5bGVzLnJlc2l6ZSg1KTsKKyAgU3R5bGVzWzBdID0gZ2V0R29vZ2xlU3R5bGUoRm9ybWF0U3R5bGU6OkxLX0phdmFTY3JpcHQpOworICBTdHlsZXNbMV0gPSBnZXRMTFZNU3R5bGUoKTsKKyAgU3R5bGVzWzFdLkxhbmd1YWdlID0gRm9ybWF0U3R5bGU6OkxLX0phdmFTY3JpcHQ7CisgIEVYUEVDVF9FUSgwLCBwYXJzZUNvbmZpZ3VyYXRpb24oIkJhc2VkT25TdHlsZTogR29vZ2xlIiwgJlN0eWxlc1sxXSkudmFsdWUoKSk7CisKKyAgU3R5bGVzWzJdID0gZ2V0TExWTVN0eWxlKCk7CisgIFN0eWxlc1syXS5MYW5ndWFnZSA9IEZvcm1hdFN0eWxlOjpMS19KYXZhU2NyaXB0OworICBFWFBFQ1RfRVEoMCwgcGFyc2VDb25maWd1cmF0aW9uKCJMYW5ndWFnZTogSmF2YVNjcmlwdFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYXNlZE9uU3R5bGU6IEdvb2dsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0eWxlc1syXSkudmFsdWUoKSk7CisKKyAgU3R5bGVzWzNdID0gZ2V0TExWTVN0eWxlKCk7CisgIFN0eWxlc1szXS5MYW5ndWFnZSA9IEZvcm1hdFN0eWxlOjpMS19KYXZhU2NyaXB0OworICBFWFBFQ1RfRVEoMCwgcGFyc2VDb25maWd1cmF0aW9uKCJCYXNlZE9uU3R5bGU6IEdvb2dsZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYW5ndWFnZTogSmF2YVNjcmlwdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0eWxlc1szXSkudmFsdWUoKSk7CisKKyAgU3R5bGVzWzRdID0gZ2V0TExWTVN0eWxlKCk7CisgIFN0eWxlc1s0XS5MYW5ndWFnZSA9IEZvcm1hdFN0eWxlOjpMS19KYXZhU2NyaXB0OworICBFWFBFQ1RfRVEoMCwgcGFyc2VDb25maWd1cmF0aW9uKCItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzZWRPblN0eWxlOiBMTFZNXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZGVudFdpZHRoOiAxMjNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2VkT25TdHlsZTogR29vZ2xlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhbmd1YWdlOiBKYXZhU2NyaXB0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3R5bGVzWzRdKS52YWx1ZSgpKTsKKyAgRVhQRUNUX0FMTF9TVFlMRVNfRVFVQUwoU3R5bGVzKTsKK30KKwogI2RlZmluZSBDSEVDS19QQVJTRShURVhULCBGSUVMRCwgVkFMVUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgRVhQRUNUX05FKFZBTFVFLCBTdHlsZS5GSUVMRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIEVYUEVDVF9FUSgwLCBwYXJzZUNvbmZpZ3VyYXRpb24oVEVYVCwgJlN0eWxlKS52YWx1ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNjgxNCw5ICs3NTI4LDEzIEBACiAgIEVYUEVDVF9FUSgwLCBwYXJzZUNvbmZpZ3VyYXRpb24oI0ZJRUxEICI6IGZhbHNlIiwgJlN0eWxlKS52YWx1ZSgpKTsgICAgICAgICAgXAogICBFWFBFQ1RfRkFMU0UoU3R5bGUuRklFTEQpOwogCitURVNUX0YoRm9ybWF0VGVzdCwgUGFyc2VzQ29uZmlndXJhdGlvbikgeworICBGb3JtYXRTdHlsZSBTdHlsZSA9IHt9OworICBTdHlsZS5MYW5ndWFnZSA9IEZvcm1hdFN0eWxlOjpMS19DcHA7CiAgIENIRUNLX1BBUlNFX0JPT0woQWxpZ25Fc2NhcGVkTmV3bGluZXNMZWZ0KTsKICAgQ0hFQ0tfUEFSU0VfQk9PTChBbGlnblRyYWlsaW5nQ29tbWVudHMpOwogICBDSEVDS19QQVJTRV9CT09MKEFsbG93QWxsUGFyYW1ldGVyc09mRGVjbGFyYXRpb25Pbk5leHRMaW5lKTsKKyAgQ0hFQ0tfUEFSU0VfQk9PTChBbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZSk7CiAgIENIRUNLX1BBUlNFX0JPT0woQWxsb3dTaG9ydElmU3RhdGVtZW50c09uQVNpbmdsZUxpbmUpOwogICBDSEVDS19QQVJTRV9CT09MKEFsbG93U2hvcnRMb29wc09uQVNpbmdsZUxpbmUpOwogICBDSEVDS19QQVJTRV9CT09MKEFsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnMpOwpAQCAtNjgyNyw2ICs3NTQ1LDggQEAKICAgQ0hFQ0tfUEFSU0VfQk9PTChDb25zdHJ1Y3RvckluaXRpYWxpemVyQWxsT25PbmVMaW5lT3JPbmVQZXJMaW5lKTsKICAgQ0hFQ0tfUEFSU0VfQk9PTChEZXJpdmVQb2ludGVyQmluZGluZyk7CiAgIENIRUNLX1BBUlNFX0JPT0woSW5kZW50Q2FzZUxhYmVscyk7CisgIENIRUNLX1BBUlNFX0JPT0woS2VlcEVtcHR5TGluZXNBdFRoZVN0YXJ0T2ZCbG9ja3MpOworICBDSEVDS19QQVJTRV9CT09MKE9iakNTcGFjZUFmdGVyUHJvcGVydHkpOwogICBDSEVDS19QQVJTRV9CT09MKE9iakNTcGFjZUJlZm9yZVByb3RvY29sTGlzdCk7CiAgIENIRUNLX1BBUlNFX0JPT0woUG9pbnRlckJpbmRzVG9UeXBlKTsKICAgQ0hFQ0tfUEFSU0VfQk9PTChDcHAxMUJyYWNlZExpc3RTdHlsZSk7CkBAIC02ODM0LDggKzc1NTQsOCBAQAogICBDSEVDS19QQVJTRV9CT09MKFNwYWNlc0luUGFyZW50aGVzZXMpOwogICBDSEVDS19QQVJTRV9CT09MKFNwYWNlc0luQW5nbGVzKTsKICAgQ0hFQ0tfUEFSU0VfQk9PTChTcGFjZUluRW1wdHlQYXJlbnRoZXNlcyk7CisgIENIRUNLX1BBUlNFX0JPT0woU3BhY2VzSW5Db250YWluZXJMaXRlcmFscyk7CiAgIENIRUNLX1BBUlNFX0JPT0woU3BhY2VzSW5DU3R5bGVDYXN0UGFyZW50aGVzZXMpOwotICBDSEVDS19QQVJTRV9CT09MKFNwYWNlQWZ0ZXJDb250cm9sU3RhdGVtZW50S2V5d29yZCk7CiAgIENIRUNLX1BBUlNFX0JPT0woU3BhY2VCZWZvcmVBc3NpZ25tZW50T3BlcmF0b3JzKTsKIAogICBDSEVDS19QQVJTRSgiQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC0xMjM0IiwgQWNjZXNzTW9kaWZpZXJPZmZzZXQsIC0xMjM0KTsKQEAgLTY4NjcsNiArNzU4NywxOSBAQAogICBDSEVDS19QQVJTRSgiVXNlVGFiOiBGb3JJbmRlbnRhdGlvbiIsIFVzZVRhYiwgRm9ybWF0U3R5bGU6OlVUX0ZvckluZGVudGF0aW9uKTsKICAgQ0hFQ0tfUEFSU0UoIlVzZVRhYjogQWx3YXlzIiwgVXNlVGFiLCBGb3JtYXRTdHlsZTo6VVRfQWx3YXlzKTsKIAorICBTdHlsZS5TcGFjZUJlZm9yZVBhcmVucyA9IEZvcm1hdFN0eWxlOjpTQlBPX0Fsd2F5czsKKyAgQ0hFQ0tfUEFSU0UoIlNwYWNlQmVmb3JlUGFyZW5zOiBOZXZlciIsIFNwYWNlQmVmb3JlUGFyZW5zLAorICAgICAgICAgICAgICBGb3JtYXRTdHlsZTo6U0JQT19OZXZlcik7CisgIENIRUNLX1BBUlNFKCJTcGFjZUJlZm9yZVBhcmVuczogQWx3YXlzIiwgU3BhY2VCZWZvcmVQYXJlbnMsCisgICAgICAgICAgICAgIEZvcm1hdFN0eWxlOjpTQlBPX0Fsd2F5cyk7CisgIENIRUNLX1BBUlNFKCJTcGFjZUJlZm9yZVBhcmVuczogQ29udHJvbFN0YXRlbWVudHMiLCBTcGFjZUJlZm9yZVBhcmVucywKKyAgICAgICAgICAgICAgRm9ybWF0U3R5bGU6OlNCUE9fQ29udHJvbFN0YXRlbWVudHMpOworICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKKyAgQ0hFQ0tfUEFSU0UoIlNwYWNlQWZ0ZXJDb250cm9sU3RhdGVtZW50S2V5d29yZDogZmFsc2UiLCBTcGFjZUJlZm9yZVBhcmVucywKKyAgICAgICAgICAgICAgRm9ybWF0U3R5bGU6OlNCUE9fTmV2ZXIpOworICBDSEVDS19QQVJTRSgiU3BhY2VBZnRlckNvbnRyb2xTdGF0ZW1lbnRLZXl3b3JkOiB0cnVlIiwgU3BhY2VCZWZvcmVQYXJlbnMsCisgICAgICAgICAgICAgIEZvcm1hdFN0eWxlOjpTQlBPX0NvbnRyb2xTdGF0ZW1lbnRzKTsKKwogICBTdHlsZS5Db2x1bW5MaW1pdCA9IDEyMzsKICAgRm9ybWF0U3R5bGUgQmFzZVN0eWxlID0gZ2V0TExWTVN0eWxlKCk7CiAgIENIRUNLX1BBUlNFKCJCYXNlZE9uU3R5bGU6IExMVk0iLCBDb2x1bW5MaW1pdCwgQmFzZVN0eWxlLkNvbHVtbkxpbWl0KTsKQEAgLTY4NzksNiArNzYxMiw5IEBACiAgICAgICAgICAgICAgIEZvcm1hdFN0eWxlOjpCU19MaW51eCk7CiAgIENIRUNLX1BBUlNFKCJCcmVha0JlZm9yZUJyYWNlczogU3Ryb3VzdHJ1cCIsIEJyZWFrQmVmb3JlQnJhY2VzLAogICAgICAgICAgICAgICBGb3JtYXRTdHlsZTo6QlNfU3Ryb3VzdHJ1cCk7CisgIENIRUNLX1BBUlNFKCJCcmVha0JlZm9yZUJyYWNlczogQWxsbWFuIiwgQnJlYWtCZWZvcmVCcmFjZXMsCisgICAgICAgICAgICAgIEZvcm1hdFN0eWxlOjpCU19BbGxtYW4pOworICBDSEVDS19QQVJTRSgiQnJlYWtCZWZvcmVCcmFjZXM6IEdOVSIsIEJyZWFrQmVmb3JlQnJhY2VzLCBGb3JtYXRTdHlsZTo6QlNfR05VKTsKIAogICBTdHlsZS5OYW1lc3BhY2VJbmRlbnRhdGlvbiA9IEZvcm1hdFN0eWxlOjpOSV9BbGw7CiAgIENIRUNLX1BBUlNFKCJOYW1lc3BhY2VJbmRlbnRhdGlvbjogTm9uZSIsIE5hbWVzcGFjZUluZGVudGF0aW9uLApAQCAtNjg4OCwxNCArNzYyNCwxNDUgQEAKICAgQ0hFQ0tfUEFSU0UoIk5hbWVzcGFjZUluZGVudGF0aW9uOiBBbGwiLCBOYW1lc3BhY2VJbmRlbnRhdGlvbiwKICAgICAgICAgICAgICAgRm9ybWF0U3R5bGU6Ok5JX0FsbCk7CiAKKyAgU3R5bGUuRm9yRWFjaE1hY3Jvcy5jbGVhcigpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQm9vc3RGb3JlYWNoOworICBCb29zdEZvcmVhY2gucHVzaF9iYWNrKCJCT09TVF9GT1JFQUNIIik7CisgIENIRUNLX1BBUlNFKCJGb3JFYWNoTWFjcm9zOiBbQk9PU1RfRk9SRUFDSF0iLCBGb3JFYWNoTWFjcm9zLCBCb29zdEZvcmVhY2gpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQm9vc3RBbmRRRm9yZWFjaDsKKyAgQm9vc3RBbmRRRm9yZWFjaC5wdXNoX2JhY2soIkJPT1NUX0ZPUkVBQ0giKTsKKyAgQm9vc3RBbmRRRm9yZWFjaC5wdXNoX2JhY2soIlFfRk9SRUFDSCIpOworICBDSEVDS19QQVJTRSgiRm9yRWFjaE1hY3JvczogW0JPT1NUX0ZPUkVBQ0gsIFFfRk9SRUFDSF0iLCBGb3JFYWNoTWFjcm9zLAorICAgICAgICAgICAgICBCb29zdEFuZFFGb3JlYWNoKTsKK30KKworVEVTVF9GKEZvcm1hdFRlc3QsIFBhcnNlc0NvbmZpZ3VyYXRpb25XaXRoTGFuZ3VhZ2VzKSB7CisgIEZvcm1hdFN0eWxlIFN0eWxlID0ge307CisgIFN0eWxlLkxhbmd1YWdlID0gRm9ybWF0U3R5bGU6OkxLX0NwcDsKKyAgQ0hFQ0tfUEFSU0UoIkxhbmd1YWdlOiBDcHBcbiIKKyAgICAgICAgICAgICAgIkluZGVudFdpZHRoOiAxMiIsCisgICAgICAgICAgICAgIEluZGVudFdpZHRoLCAxMnUpOworICBFWFBFQ1RfRVEobGx2bTo6ZXJyYzo6bm90X3N1cHBvcnRlZCwKKyAgICAgICAgICAgIHBhcnNlQ29uZmlndXJhdGlvbigiTGFuZ3VhZ2U6IEphdmFTY3JpcHRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kZW50V2lkdGg6IDM0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3R5bGUpKTsKKyAgRVhQRUNUX0VRKDEydSwgU3R5bGUuSW5kZW50V2lkdGgpOworICBDSEVDS19QQVJTRSgiSW5kZW50V2lkdGg6IDU2IiwgSW5kZW50V2lkdGgsIDU2dSk7CisgIEVYUEVDVF9FUShGb3JtYXRTdHlsZTo6TEtfQ3BwLCBTdHlsZS5MYW5ndWFnZSk7CisKKyAgU3R5bGUuTGFuZ3VhZ2UgPSBGb3JtYXRTdHlsZTo6TEtfSmF2YVNjcmlwdDsKKyAgQ0hFQ0tfUEFSU0UoIkxhbmd1YWdlOiBKYXZhU2NyaXB0XG4iCisgICAgICAgICAgICAgICJJbmRlbnRXaWR0aDogMTIiLAorICAgICAgICAgICAgICBJbmRlbnRXaWR0aCwgMTJ1KTsKKyAgQ0hFQ0tfUEFSU0UoIkluZGVudFdpZHRoOiAyMyIsIEluZGVudFdpZHRoLCAyM3UpOworICBFWFBFQ1RfRVEobGx2bTo6ZXJyYzo6bm90X3N1cHBvcnRlZCwgcGFyc2VDb25maWd1cmF0aW9uKCJMYW5ndWFnZTogQ3BwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZGVudFdpZHRoOiAzNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0eWxlKSk7CisgIEVYUEVDVF9FUSgyM3UsIFN0eWxlLkluZGVudFdpZHRoKTsKKyAgQ0hFQ0tfUEFSU0UoIkluZGVudFdpZHRoOiA1NiIsIEluZGVudFdpZHRoLCA1NnUpOworICBFWFBFQ1RfRVEoRm9ybWF0U3R5bGU6OkxLX0phdmFTY3JpcHQsIFN0eWxlLkxhbmd1YWdlKTsKKworICBDSEVDS19QQVJTRSgiQmFzZWRPblN0eWxlOiBMTFZNXG4iCisgICAgICAgICAgICAgICJJbmRlbnRXaWR0aDogNjciLAorICAgICAgICAgICAgICBJbmRlbnRXaWR0aCwgNjd1KTsKKworICBDSEVDS19QQVJTRSgiLS0tXG4iCisgICAgICAgICAgICAgICJMYW5ndWFnZTogSmF2YVNjcmlwdFxuIgorICAgICAgICAgICAgICAiSW5kZW50V2lkdGg6IDEyXG4iCisgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgIkxhbmd1YWdlOiBDcHBcbiIKKyAgICAgICAgICAgICAgIkluZGVudFdpZHRoOiAzNFxuIgorICAgICAgICAgICAgICAiLi4uXG4iLAorICAgICAgICAgICAgICBJbmRlbnRXaWR0aCwgMTJ1KTsKKworICBTdHlsZS5MYW5ndWFnZSA9IEZvcm1hdFN0eWxlOjpMS19DcHA7CisgIENIRUNLX1BBUlNFKCItLS1cbiIKKyAgICAgICAgICAgICAgIkxhbmd1YWdlOiBKYXZhU2NyaXB0XG4iCisgICAgICAgICAgICAgICJJbmRlbnRXaWR0aDogMTJcbiIKKyAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAiTGFuZ3VhZ2U6IENwcFxuIgorICAgICAgICAgICAgICAiSW5kZW50V2lkdGg6IDM0XG4iCisgICAgICAgICAgICAgICIuLi5cbiIsCisgICAgICAgICAgICAgIEluZGVudFdpZHRoLCAzNHUpOworICBDSEVDS19QQVJTRSgiLS0tXG4iCisgICAgICAgICAgICAgICJJbmRlbnRXaWR0aDogNzhcbiIKKyAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAiTGFuZ3VhZ2U6IEphdmFTY3JpcHRcbiIKKyAgICAgICAgICAgICAgIkluZGVudFdpZHRoOiA1NlxuIgorICAgICAgICAgICAgICAiLi4uXG4iLAorICAgICAgICAgICAgICBJbmRlbnRXaWR0aCwgNzh1KTsKKworICBTdHlsZS5Db2x1bW5MaW1pdCA9IDEyMzsKKyAgU3R5bGUuSW5kZW50V2lkdGggPSAyMzQ7CisgIFN0eWxlLkJyZWFrQmVmb3JlQnJhY2VzID0gRm9ybWF0U3R5bGU6OkJTX0xpbnV4OworICBTdHlsZS5UYWJXaWR0aCA9IDM0NTsKKyAgRVhQRUNUX0VRKGxsdm06OmVycmM6OnN1Y2Nlc3MsCisgICAgICAgICAgICBwYXJzZUNvbmZpZ3VyYXRpb24oIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmRlbnRXaWR0aDogNDU2XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJyZWFrQmVmb3JlQnJhY2VzOiBBbGxtYW5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhbmd1YWdlOiBKYXZhU2NyaXB0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZGVudFdpZHRoOiAxMTFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFiV2lkdGg6IDExMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGFuZ3VhZ2U6IENwcFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmVha0JlZm9yZUJyYWNlczogU3Ryb3VzdHJ1cFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUYWJXaWR0aDogNzg5XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3R5bGUpKTsKKyAgRVhQRUNUX0VRKDEyM3UsIFN0eWxlLkNvbHVtbkxpbWl0KTsKKyAgRVhQRUNUX0VRKDQ1NnUsIFN0eWxlLkluZGVudFdpZHRoKTsKKyAgRVhQRUNUX0VRKEZvcm1hdFN0eWxlOjpCU19TdHJvdXN0cnVwLCBTdHlsZS5CcmVha0JlZm9yZUJyYWNlcyk7CisgIEVYUEVDVF9FUSg3ODl1LCBTdHlsZS5UYWJXaWR0aCk7CisKKworICBFWFBFQ1RfRVEobGx2bTo6ZXJyYzo6aW52YWxpZF9hcmd1bWVudCwKKyAgICAgICAgICAgIHBhcnNlQ29uZmlndXJhdGlvbigiLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhbmd1YWdlOiBKYXZhU2NyaXB0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZGVudFdpZHRoOiA1NlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kZW50V2lkdGg6IDc4XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3R5bGUpKTsKKyAgRVhQRUNUX0VRKGxsdm06OmVycmM6OmludmFsaWRfYXJndW1lbnQsCisgICAgICAgICAgICBwYXJzZUNvbmZpZ3VyYXRpb24oIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYW5ndWFnZTogSmF2YVNjcmlwdFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmRlbnRXaWR0aDogNTZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhbmd1YWdlOiBKYXZhU2NyaXB0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZGVudFdpZHRoOiA3OFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0eWxlKSk7CisKKyAgRVhQRUNUX0VRKEZvcm1hdFN0eWxlOjpMS19DcHAsIFN0eWxlLkxhbmd1YWdlKTsKK30KKwogI3VuZGVmIENIRUNLX1BBUlNFCiAjdW5kZWYgQ0hFQ0tfUEFSU0VfQk9PTAorCitURVNUX0YoRm9ybWF0VGVzdCwgVXNlc0xhbmd1YWdlRm9yQmFzZWRPblN0eWxlKSB7CisgIEZvcm1hdFN0eWxlIFN0eWxlID0ge307CisgIFN0eWxlLkxhbmd1YWdlID0gRm9ybWF0U3R5bGU6OkxLX0phdmFTY3JpcHQ7CisgIFN0eWxlLkJyZWFrQmVmb3JlVGVybmFyeU9wZXJhdG9ycyA9IHRydWU7CisgIEVYUEVDVF9FUSgwLCBwYXJzZUNvbmZpZ3VyYXRpb24oIkJhc2VkT25TdHlsZTogR29vZ2xlIiwgJlN0eWxlKS52YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKFN0eWxlLkJyZWFrQmVmb3JlVGVybmFyeU9wZXJhdG9ycyk7CisKKyAgU3R5bGUuQnJlYWtCZWZvcmVUZXJuYXJ5T3BlcmF0b3JzID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKDAsIHBhcnNlQ29uZmlndXJhdGlvbigiLS0tXG4iCisgICAgICAgICAgICAgICJCYXNlZE9uU3R5bGU6IEdvb2dsZVxuIgorICAgICAgICAgICAgICAiLS0tXG4iCisgICAgICAgICAgICAgICJMYW5ndWFnZTogSmF2YVNjcmlwdFxuIgorICAgICAgICAgICAgICAiSW5kZW50V2lkdGg6IDc2XG4iCisgICAgICAgICAgICAgICIuLi5cbiIsICZTdHlsZSkudmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShTdHlsZS5CcmVha0JlZm9yZVRlcm5hcnlPcGVyYXRvcnMpOworICBFWFBFQ1RfRVEoNzZ1LCBTdHlsZS5JbmRlbnRXaWR0aCk7CisgIEVYUEVDVF9FUShGb3JtYXRTdHlsZTo6TEtfSmF2YVNjcmlwdCwgU3R5bGUuTGFuZ3VhZ2UpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgQ29uZmlndXJhdGlvblJvdW5kVHJpcFRlc3QpIHsKICAgRm9ybWF0U3R5bGUgU3R5bGUgPSBnZXRMTFZNU3R5bGUoKTsKICAgc3RkOjpzdHJpbmcgWUFNTCA9IGNvbmZpZ3VyYXRpb25Bc1RleHQoU3R5bGUpOwogICBGb3JtYXRTdHlsZSBQYXJzZWRTdHlsZSA9IHt9OworICBQYXJzZWRTdHlsZS5MYW5ndWFnZSA9IEZvcm1hdFN0eWxlOjpMS19DcHA7CiAgIEVYUEVDVF9FUSgwLCBwYXJzZUNvbmZpZ3VyYXRpb24oWUFNTCwgJlBhcnNlZFN0eWxlKS52YWx1ZSgpKTsKICAgRVhQRUNUX0VRKFN0eWxlLCBQYXJzZWRTdHlsZSk7CiB9CkBAIC02OTM4LDYgKzc4MDUsMTYgQEAKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIFNwbGl0c1VURjhTdHJpbmdzKSB7CisgIC8vIE5vbi1wcmludGFibGUgY2hhcmFjdGVycycgd2lkdGggaXMgY3VycmVudGx5IGNvbnNpZGVyZWQgdG8gYmUgdGhlIGxlbmd0aCBpbgorICAvLyBieXRlcyBpbiBVVEY4LiBUaGUgY2hhcmFjdGVycyBjYW4gYmUgZGlzcGxheWVkIGluIHZlcnkgZGlmZmVyZW50IG1hbm5lcgorICAvLyAoemVyby13aWR0aCwgc2luZ2xlIHdpZHRoIHdpdGggYSBzdWJzdGl0dXRpb24gZ2x5cGgsIGV4cGFuZGVkIHRvIHRoZWlyIGNvZGUKKyAgLy8gKGUuZy4gIjw4ZD4iKSwgc28gdGhlcmUncyBubyBzaW5nbGUgY29ycmVjdCB3YXkgdG8gaGFuZGxlIHRoZW0uCisgIEVYUEVDVF9FUSgiXCJhYWFhw4RcIlxuIgorICAgICAgICAgICAgIlwiXHhjMlx4OGRcIjsiLAorICAgICAgICAgICAgZm9ybWF0KCJcImFhYWHDhFx4YzJceDhkXCI7IiwgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMTApKSk7CisgIEVYUEVDVF9FUSgiXCJhYWFhYWFhw4RcIlxuIgorICAgICAgICAgICAgIlwiXHhjMlx4OGRcIjsiLAorICAgICAgICAgICAgZm9ybWF0KCJcImFhYWFhYWHDhFx4YzJceDhkXCI7IiwgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMTApKSk7CiAgIEVYUEVDVF9FUSgKICAgICAgICJcItCe0LTQvdCw0LbQtNGLLCDQsiBcIlxuIgogICAgICAgIlwi0YHRgtGD0LTRkdC90YPRjiBcIlxuIgpAQCAtNjk3MSw2ICs3ODQ4LDggQEAKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIFNwbGl0c1VURjhMaW5lQ29tbWVudHMpIHsKKyAgRVhQRUNUX0VRKCIvLyBhYWFhw4RceGMyXHg4ZCIsCisgICAgICAgICAgICBmb3JtYXQoIi8vIGFhYWHDhFx4YzJceDhkIiwgZ2V0TExWTVN0eWxlV2l0aENvbHVtbnMoMTApKSk7CiAgIEVYUEVDVF9FUSgiLy8g0K8g0LjQtyDQu9C10YHRg1xuIgogICAgICAgICAgICAgIi8vINCy0YvRiNC10Ls7INCx0YvQu1xuIgogICAgICAgICAgICAgIi8vINGB0LjQu9GM0L3Ri9C5XG4iCkBAIC03MDQxLDcgKzc5MjAsMzggQEAKICAgICAgICAgICAgICAgICIgICAgLCBiKGIpXG4iCiAgICAgICAgICAgICAgICAiICAgICwgYyhjKSB7fSIsCiAgICAgICAgICAgICAgICBTdHlsZSk7CisgIHZlcmlmeUZvcm1hdCgiU29tZUNsYXNzOjpDb25zdHJ1Y3RvcigpXG4iCisgICAgICAgICAgICAgICAiICAgIDogYShhKSB7fSIsCisgICAgICAgICAgICAgICBTdHlsZSk7CiAKKyAgU3R5bGUuQ29sdW1uTGltaXQgPSAwOworICB2ZXJpZnlGb3JtYXQoIlNvbWVDbGFzczo6Q29uc3RydWN0b3IoKVxuIgorICAgICAgICAgICAgICAgIiAgICA6IGEoYSkge30iLAorICAgICAgICAgICAgICAgU3R5bGUpOworICB2ZXJpZnlGb3JtYXQoIlNvbWVDbGFzczo6Q29uc3RydWN0b3IoKVxuIgorICAgICAgICAgICAgICAgIiAgICA6IGEoYSlcbiIKKyAgICAgICAgICAgICAgICIgICAgLCBiKGIpXG4iCisgICAgICAgICAgICAgICAiICAgICwgYyhjKSB7fSIsCisgICAgICAgICAgICAgICBTdHlsZSk7CisgIHZlcmlmeUZvcm1hdCgiU29tZUNsYXNzOjpDb25zdHJ1Y3RvcigpXG4iCisgICAgICAgICAgICAgICAiICAgIDogYShhKSB7XG4iCisgICAgICAgICAgICAgICAiICBmb28oKTtcbiIKKyAgICAgICAgICAgICAgICIgIGJhcigpO1xuIgorICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgU3R5bGUpOworCisgIFN0eWxlLkFsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lID0gZmFsc2U7CisgIHZlcmlmeUZvcm1hdCgiU29tZUNsYXNzOjpDb25zdHJ1Y3RvcigpXG4iCisgICAgICAgICAgICAgICAiICAgIDogYShhKVxuIgorICAgICAgICAgICAgICAgIiAgICAsIGIoYilcbiIKKyAgICAgICAgICAgICAgICIgICAgLCBjKGMpIHtcbn0iLAorICAgICAgICAgICAgICAgU3R5bGUpOworICB2ZXJpZnlGb3JtYXQoIlNvbWVDbGFzczo6Q29uc3RydWN0b3IoKVxuIgorICAgICAgICAgICAgICAgIiAgICA6IGEoYSkge1xufSIsCisgICAgICAgICAgICAgICBTdHlsZSk7CisKKyAgU3R5bGUuQ29sdW1uTGltaXQgPSA4MDsKKyAgU3R5bGUuQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmUgPSB0cnVlOwogICBTdHlsZS5Db25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGggPSAyOwogICB2ZXJpZnlGb3JtYXQoIlNvbWVDbGFzczo6Q29uc3RydWN0b3IoKVxuIgogICAgICAgICAgICAgICAgIiAgOiBhKGEpXG4iCkBAIC03MDU4LDYgKzc5NjgsMTAgQEAKIAogICBTdHlsZS5Db25zdHJ1Y3RvckluaXRpYWxpemVyQWxsT25PbmVMaW5lT3JPbmVQZXJMaW5lID0gdHJ1ZTsKICAgU3R5bGUuQ29uc3RydWN0b3JJbml0aWFsaXplckluZGVudFdpZHRoID0gNDsKKyAgdmVyaWZ5Rm9ybWF0KCJTb21lQ2xhc3M6OkNvbnN0cnVjdG9yKCkgOiBhYWFhYWFhYShhYWFhYWFhYSkge30iLCBTdHlsZSk7CisgIHZlcmlmeUZvcm1hdCgKKyAgICAgICJTb21lQ2xhc3M6OkNvbnN0cnVjdG9yKCkgOiBhYWFhYShhYWFhYSksIGFhYWFhKGFhYWFhKSwgYWFhYWEoYWFhYWEpXG4iLAorICAgICAgU3R5bGUpOwogICB2ZXJpZnlGb3JtYXQoCiAgICAgICAiU29tZUNsYXNzOjpDb25zdHJ1Y3RvcigpXG4iCiAgICAgICAiICAgIDogYWFhYWFhYWEoYWFhYWFhYWEpLCBhYWFhYWFhYShhYWFhYWFhYSksIGFhYWFhYWFhKGFhYWFhYWFhKSB7fSIsCkBAIC03MTIxLDcgKzgwMzUsMzIgQEAKICAgICAgICAgICAgICAgICIgICAgOiBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEoYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKVxuIgogICAgICAgICAgICAgICAgIiAgICAsIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYShhYWFhYWFhYWFhYWFhYSwgLy8gYnJlYWtcbiIKICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFhYWFhYWFhYWFhYWEpXG4iCi0gICAgICAgICAgICAgICAiICAgICwgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEoKVxue1xufSIsCisgICAgICAgICAgICAgICAiICAgICwgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEoKVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICJ9IiwKKyAgICAgICAgICAgICAgIFN0eWxlKTsKKyAgdmVyaWZ5Rm9ybWF0KCJTb21lQ2xhc3M6OkNvbnN0cnVjdG9yKClcbiIKKyAgICAgICAgICAgICAgICIgICAgOiBhKGEpXG4iCisgICAgICAgICAgICAgICAie1xuIgorICAgICAgICAgICAgICAgIn0iLAorICAgICAgICAgICAgICAgU3R5bGUpOworICBFWFBFQ1RfRVEoIlNvbWVDbGFzczo6Q29uc3RydWN0b3IoKVxuIgorICAgICAgICAgICAgIiAgICA6IGEoYSlcbiIKKyAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAifSIsCisgICAgICAgICAgICBmb3JtYXQoIlNvbWVDbGFzczo6Q29uc3RydWN0b3IoKTphKGEpe30iLCBTdHlsZSkpOworICB2ZXJpZnlGb3JtYXQoIlNvbWVDbGFzczo6Q29uc3RydWN0b3IoKVxuIgorICAgICAgICAgICAgICAgIiAgICA6IGEoYSlcbiIKKyAgICAgICAgICAgICAgICIgICAgLCBiKGIpXG4iCisgICAgICAgICAgICAgICAiICAgICwgYyhjKVxuIgorICAgICAgICAgICAgICAgIntcbiIKKyAgICAgICAgICAgICAgICJ9IiwgU3R5bGUpOworICB2ZXJpZnlGb3JtYXQoIlNvbWVDbGFzczo6Q29uc3RydWN0b3IoKVxuIgorICAgICAgICAgICAgICAgIiAgICA6IGEoYSlcbiIKKyAgICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgICAiICAgIGZvbygpO1xuIgorICAgICAgICAgICAgICAgIiAgICBiYXIoKTtcbiIKKyAgICAgICAgICAgICAgICJ9IiwKICAgICAgICAgICAgICAgIFN0eWxlKTsKIAogICAvLyBBY2Nlc3Mgc3BlY2lmaWVycyBzaG91bGQgYmUgYWxpZ25lZCBsZWZ0LgpAQCAtNzE1OSwxNSArODA5OCw2IEBACiAgICAgICAgICAgICAgICAgICAgU3R5bGUpKTsKIH0KIAotVEVTVF9GKEZvcm1hdFRlc3QsIEZvcm1hdHNQcm90b2NvbEJ1ZmZlckRlZmluaXRpb25zKSB7Ci0gIC8vIEl0IHNlZW1zIHRoYXQgY2xhbmctZm9ybWF0IGNhbiBmb3JtYXQgcHJvdG9jb2wgYnVmZmVyIGRlZmluaXRpb25zCi0gIC8vIChzZWUgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8pLgotICB2ZXJpZnlGb3JtYXQoIm1lc3NhZ2UgU29tZU1lc3NhZ2Uge1xuIgotICAgICAgICAgICAgICAgIiAgcmVxdWlyZWQgaW50MzIgZmllbGQxID0gMTtcbiIKLSAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDIgPSAyIFtkZWZhdWx0ID0gXCIyXCJdXG4iCi0gICAgICAgICAgICAgICAifSIpOwotfQotCiBURVNUX0YoRm9ybWF0VGVzdCwgRm9ybWF0c0xhbWJkYXMpIHsKICAgdmVyaWZ5Rm9ybWF0KCJpbnQgYyA9IFtiXSgpIG11dGFibGUge1xuIgogICAgICAgICAgICAgICAgIiAgcmV0dXJuIFsmYl0geyByZXR1cm4gYisrOyB9KCk7XG4iCkBAIC03MTgxLDEwICs4MTExLDEwIEBACiAgIHZlcmlmeUZvcm1hdCgiaW50IGMgPSBbJmEsICZhLCBhXSB7XG4iCiAgICAgICAgICAgICAgICAiICBbPSwgYSwgYiwgJmNdIHsgcmV0dXJuIGIrKzsgfSgpO1xuIgogICAgICAgICAgICAgICAgIn0oKTtcbiIpOwotICB2ZXJpZnlGb3JtYXQoImF1dG8gYyA9IHsgWyZhLCAmYSwgYV0ge1xuIgorICB2ZXJpZnlGb3JtYXQoImF1dG8gYyA9IHtbJmEsICZhLCBhXSB7XG4iCiAgICAgICAgICAgICAgICAiICBbPSwgYSwgYiwgJmNdIHsgcmV0dXJuIGIrKzsgfSgpO1xuIgotICAgICAgICAgICAgICAgIn0gfVxuIik7Ci0gIHZlcmlmeUZvcm1hdCgiYXV0byBjID0geyBbJmEsICZhLCBhXSB7IFs9LCBhLCBiLCAmY10ge30oKTsgfSB9XG4iKTsKKyAgICAgICAgICAgICAgICJ9fVxuIik7CisgIHZlcmlmeUZvcm1hdCgiYXV0byBjID0ge1smYSwgJmEsIGFdIHsgWz0sIGEsIGIsICZjXSB7fSgpOyB9fVxuIik7CiAgIHZlcmlmeUZvcm1hdCgidm9pZCBmKCkge1xuIgogICAgICAgICAgICAgICAgIiAgb3RoZXIoeC5iZWdpbigpLCB4LmVuZCgpLCBbJl0oaW50LCBpbnQpIHsgcmV0dXJuIDE7IH0pO1xuIgogICAgICAgICAgICAgICAgIn1cbiIpOwpAQCAtNzE5NCwxOCArODEyNCwxMTAgQEAKICAgICAgICAgICAgICAgICIgICAgICAgIFsmXShpbnQsIGludCkgeyByZXR1cm4gMTsgfSk7XG4iCiAgICAgICAgICAgICAgICAifVxuIik7CiAKKyAgLy8gTGFtYmRhcyB3aXRoIHJldHVybiB0eXBlcy4KKyAgdmVyaWZ5Rm9ybWF0KCJpbnQgYyA9IFtdKCkgLT4gaW50IHsgcmV0dXJuIDI7IH0oKTtcbiIpOworICB2ZXJpZnlGb3JtYXQoImludCBjID0gW10oKSAtPiB2ZWN0b3I8aW50PiB7IHJldHVybiB7Mn07IH0oKTtcbiIpOworICB2ZXJpZnlGb3JtYXQoIkZvbyhbXSgpIC0+IHN0ZDo6dmVjdG9yPGludD4geyByZXR1cm4gezJ9OyB9KCkpOyIpOworICB2ZXJpZnlGb3JtYXQoImF1dG8gYWFhYWFhYWEgPSBbXShpbnQgaSwgLy8gYnJlYWsgZm9yIHNvbWUgcmVhc29uXG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIGludCBqKSAtPiBpbnQge1xuIgorICAgICAgICAgICAgICAgIiAgcmV0dXJuIGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZihpICogaik7XG4iCisgICAgICAgICAgICAgICAifTsiKTsKKwogICAvLyBOb3QgbGFtYmRhcy4KLSAgdmVyaWZ5Rm9ybWF0KCJjb25zdGV4cHIgY2hhciBoZWxsb1tdeyBcImhlbGxvXCIgfTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJjb25zdGV4cHIgY2hhciBoZWxsb1tde1wiaGVsbG9cIn07Iik7CiAgIHZlcmlmeUZvcm1hdCgiZG91YmxlICZvcGVyYXRvcltdKGludCBpKSB7IHJldHVybiAwOyB9XG4iCiAgICAgICAgICAgICAgICAiaW50IGk7Iik7CisgIHZlcmlmeUZvcm1hdCgic3RkOjp1bmlxdWVfcHRyPGludFtdPiBmb28oKSB7fSIpOworICB2ZXJpZnlGb3JtYXQoImludCBpID0gYVthXVthXS0+ZigpOyIpOworICB2ZXJpZnlGb3JtYXQoImludCBpID0gKCpiKVthXS0+ZigpOyIpOworCisgIC8vIE90aGVyIGNvcm5lciBjYXNlcy4KKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGYoKSB7XG4iCisgICAgICAgICAgICAgICAiICBiYXIoW10oKSB7fSAvLyBEaWQgbm90IHJlc3BlY3QgU3BhY2VzQmVmb3JlVHJhaWxpbmdDb21tZW50c1xuIgorICAgICAgICAgICAgICAgIiAgICAgICk7XG4iCisgICAgICAgICAgICAgICAifSIpOworCisgIC8vIExhbWJkYXMgY3JlYXRlZCB0aHJvdWdoIHdlaXJkIG1hY3Jvcy4KKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIGYoKSB7XG4iCisgICAgICAgICAgICAgICAiICBNQUNSTygoY29uc3QgQUEgJmEpIHsgcmV0dXJuIDE7IH0pO1xuIgorICAgICAgICAgICAgICAgIn0iKTsKIH0KIAogVEVTVF9GKEZvcm1hdFRlc3QsIEZvcm1hdHNCbG9ja3MpIHsKKyAgdmVyaWZ5Rm9ybWF0KCJpbnQgKF5CbG9jaykoaW50LCBpbnQpOyIpOworICB2ZXJpZnlGb3JtYXQoImludCAoXkJsb2NrMSkoaW50LCBpbnQpID0gXihpbnQgaSwgaW50IGopIik7CisgIHZlcmlmeUZvcm1hdCgidm9pZCAoXmJsb2NrKShpbnQpID0gXihpZCB0ZXN0KSB7IGludCBpOyB9OyIpOworICB2ZXJpZnlGb3JtYXQoInZvaWQgKF5ibG9jaykoaW50KSA9IF4oaW50IHRlc3QpIHsgaW50IGk7IH07Iik7CisgIHZlcmlmeUZvcm1hdCgidm9pZCAoXmJsb2NrKShpbnQpID0gXmlkKGludCB0ZXN0KSB7IGludCBpOyB9OyIpOworICB2ZXJpZnlGb3JtYXQoInZvaWQgKF5ibG9jaykoaW50KSA9IF5pbnQoaW50IHRlc3QpIHsgaW50IGk7IH07Iik7CisKKyAgdmVyaWZ5Rm9ybWF0KCJmb28oXnsgYmFyKCk7IH0pOyIpOworICB2ZXJpZnlGb3JtYXQoImZvbyhhLCBeeyBiYXIoKTsgfSk7Iik7CisKICAgLy8gRklYTUU6IE1ha2Ugd2hpdGVzcGFjZSBmb3JtYXR0aW5nIGNvbnNpc3RlbnQuIEFzayBhIE9iakMgZGV2IGhvdwogICAvLyBpdCB3b3VsZCBpZGVhbGx5IGxvb2suCiAgIHZlcmlmeUZvcm1hdCgiW29wZXJhdGlvbiBzZXRDb21wbGV0aW9uQmxvY2s6XnsgW3NlbGYgb25PcGVyYXRpb25Eb25lXTsgfV07Iik7CiAgIHZlcmlmeUZvcm1hdCgiaW50IGkgPSB7W29wZXJhdGlvbiBzZXRDb21wbGV0aW9uQmxvY2sgOiBeeyBbc2VsZiAiCi0gICAgICAgICAgICAgICAib25PcGVyYXRpb25Eb25lXTsgfV0gfTsiKTsKKyAgICAgICAgICAgICAgICJvbk9wZXJhdGlvbkRvbmVdOyB9XX07Iik7CisgIHZlcmlmeUZvcm1hdCgiW29wZXJhdGlvbiBzZXRDb21wbGV0aW9uQmxvY2s6XihpbnQgKmkpIHsgZigpOyB9XTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJpbnQgYSA9IFtvcGVyYXRpb24gYmxvY2s6XmludChpbnQgKmkpIHsgcmV0dXJuIDE7IH1dOyIpOworICB2ZXJpZnlGb3JtYXQoIltteU9iamVjdCBkb1NvbWV0aGluZ1dpdGg6YXJnMVxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICBhYWE6XmludChpbnQgKmEpIHsgcmV0dXJuIDE7IH1cbiIKKyAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgYmJiOmYoYSAqIGIpXTsiKTsKKworICB2ZXJpZnlGb3JtYXQoIltvcGVyYXRpb24gc2V0Q29tcGxldGlvbkJsb2NrOl57XG4iCisgICAgICAgICAgICAgICAiICAgIFtzZWxmLmRlbGVnYXRlIG5ld0RhdGFBdmFpbGFibGVdO1xuIgorICAgICAgICAgICAgICAgIn1dOyIsCisgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucyg2MCkpOworICB2ZXJpZnlGb3JtYXQoImRpc3BhdGNoX2FzeW5jKF9maWxlSU9RdWV1ZSwgXntcbiIKKyAgICAgICAgICAgICAgICIgICAgTlNTdHJpbmcgKnBhdGggPSBbc2VsZiBzZXNzaW9uRmlsZVBhdGhdO1xuIgorICAgICAgICAgICAgICAgIiAgICBpZiAocGF0aCkge1xuIgorICAgICAgICAgICAgICAgIiAgICAgIC8vIC4uLlxuIgorICAgICAgICAgICAgICAgIiAgICB9XG4iCisgICAgICAgICAgICAgICAifSk7Iik7CisgIHZlcmlmeUZvcm1hdCgiW1tTZXNzaW9uU2VydmljZSBzaGFyZWRTZXJ2aWNlXVxuIgorICAgICAgICAgICAgICAgIiAgICBsb2FkV2luZG93V2l0aENvbXBsZXRpb25CbG9jazpeKFNlc3Npb25XaW5kb3cgKndpbmRvdykge1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgaWYgKHdpbmRvdykge1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICBbc2VsZiB3aW5kb3dEaWRMb2FkOndpbmRvd107XG4iCisgICAgICAgICAgICAgICAiICAgICAgICB9IGVsc2Uge1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICBbc2VsZiBlcnJvckxvYWRpbmdXaW5kb3ddO1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgfVxuIgorICAgICAgICAgICAgICAgIiAgICB9XTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2b2lkIChebGFyZ2VCbG9jaykodm9pZCkgPSBee1xuIgorICAgICAgICAgICAgICAgIiAgICAvLyAuLi5cbiIKKyAgICAgICAgICAgICAgICJ9O1xuIiwKKyAgICAgICAgICAgICAgIGdldExMVk1TdHlsZVdpdGhDb2x1bW5zKDQwKSk7CisgIHZlcmlmeUZvcm1hdCgiW1tTZXNzaW9uU2VydmljZSBzaGFyZWRTZXJ2aWNlXVxuIgorICAgICAgICAgICAgICAgIiAgICBsb2FkV2luZG93V2l0aENvbXBsZXRpb25CbG9jazogLy9cbiIKKyAgICAgICAgICAgICAgICIgICAgICAgIF4oU2Vzc2lvbldpbmRvdyAqd2luZG93KSB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgaWYgKHdpbmRvdykge1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgW3NlbGYgd2luZG93RGlkTG9hZDp3aW5kb3ddO1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgIH0gZWxzZSB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBbc2VsZiBlcnJvckxvYWRpbmdXaW5kb3ddO1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgIH1cbiIKKyAgICAgICAgICAgICAgICIgICAgICAgIH1dOyIsCisgICAgICAgICAgICAgICBnZXRMTFZNU3R5bGVXaXRoQ29sdW1ucyg2MCkpOworICB2ZXJpZnlGb3JtYXQoIltteU9iamVjdCBkb1NvbWV0aGluZ1dpdGg6YXJnMVxuIgorICAgICAgICAgICAgICAgIiAgICBmaXJzdEJsb2NrOl4oRm9vICphKSB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICAvLyAuLi5cbiIKKyAgICAgICAgICAgICAgICIgICAgICAgIGludCBpO1xuIgorICAgICAgICAgICAgICAgIiAgICB9XG4iCisgICAgICAgICAgICAgICAiICAgIHNlY29uZEJsb2NrOl4oQmFyICpiKSB7XG4iCisgICAgICAgICAgICAgICAiICAgICAgICAvLyAuLi5cbiIKKyAgICAgICAgICAgICAgICIgICAgICAgIGludCBpO1xuIgorICAgICAgICAgICAgICAgIiAgICB9XG4iCisgICAgICAgICAgICAgICAiICAgIHRoaXJkQmxvY2s6XkZvbyhCYXIgKmIpIHtcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgIC8vIC4uLlxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgaW50IGk7XG4iCisgICAgICAgICAgICAgICAiICAgIH1dOyIpOworCisgIHZlcmlmeUZvcm1hdCgiZihee1xuIgorICAgICAgICAgICAgICAgIiAgICBAYXV0b3JlbGVhc2Vwb29sIHtcbiIKKyAgICAgICAgICAgICAgICIgICAgICBpZiAoYSkge1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgZygpO1xuIgorICAgICAgICAgICAgICAgIiAgICAgIH1cbiIKKyAgICAgICAgICAgICAgICIgICAgfVxuIgorICAgICAgICAgICAgICAgIn0pOyIpOwogfQogCiBURVNUX0YoRm9ybWF0VGVzdCwgU3VwcG9ydHNDUkxGKSB7CkBAIC03Mjk5LDEwICs4MzIxLDI0IEBACiAgIFNwYWNlcy5TdGFuZGFyZCA9IEZvcm1hdFN0eWxlOjpMU19DcHAxMTsKICAgU3BhY2VzLlNwYWNlc0luQW5nbGVzID0gdHJ1ZTsKICAgdmVyaWZ5Rm9ybWF0KCJBPCBBPCBpbnQgPiA+KCk7IiwgU3BhY2VzKTsKLSAgCisKICAgU3BhY2VzLlNwYWNlc0luQW5nbGVzID0gZmFsc2U7CiAgIHZlcmlmeUZvcm1hdCgiQTxBPGludD4+KCk7IiwgU3BhY2VzKTsKIH0KIAorVEVTVF9GKEZvcm1hdFRlc3QsIEhhbmRsZVVuYmFsYW5jZWRJbXBsaWNpdEJyYWNlc0Fjcm9zc1BQQnJhbmNoZXMpIHsKKyAgc3RkOjpzdHJpbmcgY29kZSA9ICIjaWYgQVxuIgorICAgICAgICAgICAgICAgICAgICAgIiNpZiBCXG4iCisgICAgICAgICAgICAgICAgICAgICAiYS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICIjZW5kaWZcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICAgYSA9IDE7XG4iCisgICAgICAgICAgICAgICAgICAgICAiI2Vsc2VcbiIKKyAgICAgICAgICAgICAgICAgICAgICIjZW5kaWZcbiIKKyAgICAgICAgICAgICAgICAgICAgICIjaWYgQ1xuIgorICAgICAgICAgICAgICAgICAgICAgIiNlbHNlXG4iCisgICAgICAgICAgICAgICAgICAgICAiI2VuZGlmXG4iOworICBFWFBFQ1RfRVEoY29kZSwgZm9ybWF0KGNvZGUpKTsKK30KKwogfSAvLyBlbmQgbmFtZXNwYWNlIHRvb2xpbmcKIH0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL0Zvcm1hdC9Gb3JtYXRUZXN0SlMuY3BwIGIvdW5pdHRlc3RzL0Zvcm1hdC9Gb3JtYXRUZXN0SlMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMjE1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi91bml0dGVzdHMvRm9ybWF0L0Zvcm1hdFRlc3RKUy5jcHAKQEAgLTAsMCArMSw5NSBAQAorLy89PT0tIHVuaXR0ZXN0L0Zvcm1hdC9Gb3JtYXRUZXN0SlMuY3BwIC0gRm9ybWF0dGluZyB1bml0IHRlc3RzIGZvciBKUyAtLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2RlZmluZSBERUJVR19UWVBFICJmb3JtYXQtdGVzdCIKKworI2luY2x1ZGUgIkZvcm1hdFRlc3RVdGlscy5oIgorI2luY2x1ZGUgImNsYW5nL0Zvcm1hdC9Gb3JtYXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgY2xhbmcgeworbmFtZXNwYWNlIGZvcm1hdCB7CisKK2NsYXNzIEZvcm1hdFRlc3RKUyA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICBzdGF0aWMgc3RkOjpzdHJpbmcgZm9ybWF0KGxsdm06OlN0cmluZ1JlZiBDb2RlLCB1bnNpZ25lZCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGVuZ3RoLCBjb25zdCBGb3JtYXRTdHlsZSAmU3R5bGUpIHsKKyAgICBERUJVRyhsbHZtOjplcnJzKCkgPDwgIi0tLVxuIik7CisgICAgREVCVUcobGx2bTo6ZXJycygpIDw8IENvZGUgPDwgIlxuXG4iKTsKKyAgICBzdGQ6OnZlY3Rvcjx0b29saW5nOjpSYW5nZT4gUmFuZ2VzKDEsIHRvb2xpbmc6OlJhbmdlKE9mZnNldCwgTGVuZ3RoKSk7CisgICAgdG9vbGluZzo6UmVwbGFjZW1lbnRzIFJlcGxhY2VzID0gcmVmb3JtYXQoU3R5bGUsIENvZGUsIFJhbmdlcyk7CisgICAgc3RkOjpzdHJpbmcgUmVzdWx0ID0gYXBwbHlBbGxSZXBsYWNlbWVudHMoQ29kZSwgUmVwbGFjZXMpOworICAgIEVYUEVDVF9ORSgiIiwgUmVzdWx0KTsKKyAgICBERUJVRyhsbHZtOjplcnJzKCkgPDwgIlxuIiA8PCBSZXN1bHQgPDwgIlxuXG4iKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGZvcm1hdChsbHZtOjpTdHJpbmdSZWYgQ29kZSwgY29uc3QgRm9ybWF0U3R5bGUgJlN0eWxlKSB7CisgICAgcmV0dXJuIGZvcm1hdChDb2RlLCAwLCBDb2RlLnNpemUoKSwgU3R5bGUpOworICB9CisKKyAgc3RhdGljIEZvcm1hdFN0eWxlIGdldEdvb2dsZUpTU3R5bGVXaXRoQ29sdW1ucyh1bnNpZ25lZCBDb2x1bW5MaW1pdCkgeworICAgIEZvcm1hdFN0eWxlIFN0eWxlID0gZ2V0R29vZ2xlU3R5bGUoRm9ybWF0U3R5bGU6OkxLX0phdmFTY3JpcHQpOworICAgIFN0eWxlLkNvbHVtbkxpbWl0ID0gQ29sdW1uTGltaXQ7CisgICAgcmV0dXJuIFN0eWxlOworICB9CisKKyAgc3RhdGljIHZvaWQgdmVyaWZ5Rm9ybWF0KAorICAgICAgbGx2bTo6U3RyaW5nUmVmIENvZGUsCisgICAgICBjb25zdCBGb3JtYXRTdHlsZSAmU3R5bGUgPSBnZXRHb29nbGVTdHlsZShGb3JtYXRTdHlsZTo6TEtfSmF2YVNjcmlwdCkpIHsKKyAgICBFWFBFQ1RfRVEoQ29kZS5zdHIoKSwgZm9ybWF0KHRlc3Q6Om1lc3NVcChDb2RlKSwgU3R5bGUpKTsKKyAgfQorfTsKKworVEVTVF9GKEZvcm1hdFRlc3RKUywgVW5kZXJzdGFuZHNKYXZhU2NyaXB0T3BlcmF0b3JzKSB7CisgIHZlcmlmeUZvcm1hdCgiYSA9PSA9IGI7Iik7CisgIHZlcmlmeUZvcm1hdCgiYSAhPSA9IGI7Iik7CisKKyAgdmVyaWZ5Rm9ybWF0KCJhID09PSBiOyIpOworICB2ZXJpZnlGb3JtYXQoImFhYWFhYWEgPT09XG4gICAgYjsiLCBnZXRHb29nbGVKU1N0eWxlV2l0aENvbHVtbnMoMTApKTsKKyAgdmVyaWZ5Rm9ybWF0KCJhICE9PSBiOyIpOworICB2ZXJpZnlGb3JtYXQoImFhYWFhYWEgIT09XG4gICAgYjsiLCBnZXRHb29nbGVKU1N0eWxlV2l0aENvbHVtbnMoMTApKTsKKyAgdmVyaWZ5Rm9ybWF0KCJpZiAoYSArIGIgKyBjICtcbiIKKyAgICAgICAgICAgICAgICIgICAgICAgIGQgIT09XG4iCisgICAgICAgICAgICAgICAiICAgIGUgKyBmICsgZylcbiIKKyAgICAgICAgICAgICAgICIgIHEoKTsiLAorICAgICAgICAgICAgICAgZ2V0R29vZ2xlSlNTdHlsZVdpdGhDb2x1bW5zKDIwKSk7CisKKyAgdmVyaWZ5Rm9ybWF0KCJhID4+ID49IGI7Iik7CisKKyAgdmVyaWZ5Rm9ybWF0KCJhID4+PiBiOyIpOworICB2ZXJpZnlGb3JtYXQoImFhYWFhYWEgPj4+XG4gICAgYjsiLCBnZXRHb29nbGVKU1N0eWxlV2l0aENvbHVtbnMoMTApKTsKKyAgdmVyaWZ5Rm9ybWF0KCJhID4+Pj0gYjsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJhYWFhYWFhID4+Pj1cbiAgICBiOyIsIGdldEdvb2dsZUpTU3R5bGVXaXRoQ29sdW1ucygxMCkpOworICB2ZXJpZnlGb3JtYXQoImlmIChhICsgYiArIGMgK1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgZCA+Pj5cbiIKKyAgICAgICAgICAgICAgICIgICAgZSArIGYgKyBnKVxuIgorICAgICAgICAgICAgICAgIiAgcSgpOyIsCisgICAgICAgICAgICAgICBnZXRHb29nbGVKU1N0eWxlV2l0aENvbHVtbnMoMjApKTsKKyAgdmVyaWZ5Rm9ybWF0KCJ2YXIgeCA9IGFhYWFhYWFhYWEgP1xuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgIGJiYmJiYiA6XG4iCisgICAgICAgICAgICAgICAiICAgICAgICAgICAgY2NjOyIsCisgICAgICAgICAgICAgICBnZXRHb29nbGVKU1N0eWxlV2l0aENvbHVtbnMoMjApKTsKK30KKworVEVTVF9GKEZvcm1hdFRlc3RKUywgU3BhY2VzSW5Db250YWluZXJMaXRlcmFscykgeworICB2ZXJpZnlGb3JtYXQoInZhciBhcnIgPSBbMSwgMiwgM107Iik7CisgIHZlcmlmeUZvcm1hdCgidmFyIG9iaiA9IHthOiAxLCBiOiAyLCBjOiAzfTsiKTsKKworICB2ZXJpZnlGb3JtYXQoInZhciBvYmogPSB7YTogMSwgYjogMiwgYzogM307IiwKKyAgICAgICAgICAgICAgIGdldENocm9taXVtU3R5bGUoRm9ybWF0U3R5bGU6OkxLX0phdmFTY3JpcHQpKTsKK30KKworVEVTVF9GKEZvcm1hdFRlc3RKUywgU2luZ2xlUXVvdGVTdHJpbmdzKSB7CisgIHZlcmlmeUZvcm1hdCgidGhpcy5mdW5jdGlvbignJywgdHJ1ZSk7Iik7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0b29saW5nCit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKZGlmZiAtLWdpdCBhL3VuaXR0ZXN0cy9Gb3JtYXQvRm9ybWF0VGVzdFByb3RvLmNwcCBiL3VuaXR0ZXN0cy9Gb3JtYXQvRm9ybWF0VGVzdFByb3RvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQ0MTZlCi0tLSAvZGV2L251bGwKKysrIGIvdW5pdHRlc3RzL0Zvcm1hdC9Gb3JtYXRUZXN0UHJvdG8uY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8vPT09LSB1bml0dGVzdC9Gb3JtYXQvRm9ybWF0VGVzdFByb3RvLmNwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNkZWZpbmUgREVCVUdfVFlQRSAiZm9ybWF0LXRlc3QiCisKKyNpbmNsdWRlICJGb3JtYXRUZXN0VXRpbHMuaCIKKyNpbmNsdWRlICJjbGFuZy9Gb3JtYXQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBmb3JtYXQgeworCitjbGFzcyBGb3JtYXRUZXN0UHJvdG8gOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3Byb3RlY3RlZDoKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGZvcm1hdChsbHZtOjpTdHJpbmdSZWYgQ29kZSwgdW5zaWduZWQgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExlbmd0aCwgY29uc3QgRm9ybWF0U3R5bGUgJlN0eWxlKSB7CisgICAgREVCVUcobGx2bTo6ZXJycygpIDw8ICItLS1cbiIpOworICAgIERFQlVHKGxsdm06OmVycnMoKSA8PCBDb2RlIDw8ICJcblxuIik7CisgICAgc3RkOjp2ZWN0b3I8dG9vbGluZzo6UmFuZ2U+IFJhbmdlcygxLCB0b29saW5nOjpSYW5nZShPZmZzZXQsIExlbmd0aCkpOworICAgIHRvb2xpbmc6OlJlcGxhY2VtZW50cyBSZXBsYWNlcyA9IHJlZm9ybWF0KFN0eWxlLCBDb2RlLCBSYW5nZXMpOworICAgIHN0ZDo6c3RyaW5nIFJlc3VsdCA9IGFwcGx5QWxsUmVwbGFjZW1lbnRzKENvZGUsIFJlcGxhY2VzKTsKKyAgICBFWFBFQ1RfTkUoIiIsIFJlc3VsdCk7CisgICAgREVCVUcobGx2bTo6ZXJycygpIDw8ICJcbiIgPDwgUmVzdWx0IDw8ICJcblxuIik7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBmb3JtYXQobGx2bTo6U3RyaW5nUmVmIENvZGUpIHsKKyAgICBGb3JtYXRTdHlsZSBTdHlsZSA9IGdldEdvb2dsZVN0eWxlKEZvcm1hdFN0eWxlOjpMS19Qcm90byk7CisgICAgU3R5bGUuQ29sdW1uTGltaXQgPSA2MDsgLy8gVG8gbWFrZSB3cml0aW5nIHRlc3RzIGVhc2llci4KKyAgICByZXR1cm4gZm9ybWF0KENvZGUsIDAsIENvZGUuc2l6ZSgpLCBTdHlsZSk7CisgIH0KKworICBzdGF0aWMgdm9pZCB2ZXJpZnlGb3JtYXQobGx2bTo6U3RyaW5nUmVmIENvZGUpIHsKKyAgICBFWFBFQ1RfRVEoQ29kZS5zdHIoKSwgZm9ybWF0KHRlc3Q6Om1lc3NVcChDb2RlKSkpOworICB9Cit9OworCitURVNUX0YoRm9ybWF0VGVzdFByb3RvLCBGb3JtYXRzTWVzc2FnZXMpIHsKKyAgdmVyaWZ5Rm9ybWF0KCJtZXNzYWdlIFNvbWVNZXNzYWdlIHtcbiIKKyAgICAgICAgICAgICAgICIgIHJlcXVpcmVkIGludDMyIGZpZWxkMSA9IDE7XG4iCisgICAgICAgICAgICAgICAifSIpOworICB2ZXJpZnlGb3JtYXQoIm1lc3NhZ2UgU29tZU1lc3NhZ2Uge1xuIgorICAgICAgICAgICAgICAgIiAgcmVxdWlyZWQgaW50MzIgZmllbGQxID0gMTtcbiIKKyAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIHN0cmluZyBmaWVsZDIgPSAyIFtkZWZhdWx0ID0gXCIyXCJdXG4iCisgICAgICAgICAgICAgICAifSIpOworCisgIHZlcmlmeUZvcm1hdCgibWVzc2FnZSBTb21lTWVzc2FnZSB7XG4iCisgICAgICAgICAgICAgICAiICBvcHRpb25hbCByZWFsbHkucmVhbGx5LmxvbmcuYW5kLnF1YWxpZmllZC50eXBlLmFhYWFhYWFcbiIKKyAgICAgICAgICAgICAgICIgICAgICBmaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWVsZCA9IDE7XG4iCisgICAgICAgICAgICAgICAiICBvcHRpb25hbFxuIgorICAgICAgICAgICAgICAgIiAgICAgIHJlYWxseS5yZWFsbHkubG9uZy5hbmQucXVhbGlmaWVkLnR5cGUuYWFhYWFhYS5hYWFhYWFhYVxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICBhbm90aGVyX2ZpaWlpaWlpaWlpaWlpaWlpaWlpaWllbGQgPSAyO1xuIgorICAgICAgICAgICAgICAgIn0iKTsKK30KKworVEVTVF9GKEZvcm1hdFRlc3RQcm90bywgRm9ybWF0c0VudW1zKSB7CisgIHZlcmlmeUZvcm1hdCgiZW51bSBUeXBlIHtcbiIKKyAgICAgICAgICAgICAgICIgIFVOS05PV04gPSAwO1xuIgorICAgICAgICAgICAgICAgIiAgVFlQRV9BID0gMTtcbiIKKyAgICAgICAgICAgICAgICIgIFRZUEVfQiA9IDI7XG4iCisgICAgICAgICAgICAgICAifTsiKTsKK30KKworVEVTVF9GKEZvcm1hdFRlc3RQcm90bywgVW5kZXJzdGFuZHNSZXR1cm5zKSB7CisgIHZlcmlmeUZvcm1hdCgicnBjIFNlYXJjaChTZWFyY2hSZXF1ZXN0KSByZXR1cm5zIChTZWFyY2hSZXNwb25zZSk7Iik7Cit9CisKK1RFU1RfRihGb3JtYXRUZXN0UHJvdG8sIE1lc3NhZ2VGaWVsZEF0dHJpYnV0ZXMpIHsKKyAgdmVyaWZ5Rm9ybWF0KCJvcHRpb25hbCBzdHJpbmcgdGVzdCA9IDEgW2RlZmF1bHQgPSBcInRlc3RcIl07Iik7CisgIHZlcmlmeUZvcm1hdCgib3B0aW9uYWwgYm9vbCBhID0gMSBbZGVmYXVsdCA9IHRydWUsIGRlcHJlY2F0ZWQgPSB0cnVlXTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJvcHRpb25hbCBMb25nTWVzc2FnZVR5cGUgbG9uZ19wcm90b19maWVsZCA9IDFcbiIKKyAgICAgICAgICAgICAgICIgICAgW2RlZmF1bHQgPSBSRUFMTFlfUkVBTExZX0xPTkdfQ09OU1RBTlRfVkFMVUUsXG4iCisgICAgICAgICAgICAgICAiICAgICBkZXByZWNhdGVkID0gdHJ1ZV07Iik7CisgIHZlcmlmeUZvcm1hdCgib3B0aW9uYWwgTG9uZ01lc3NhZ2VUeXBlIGxvbmdfcHJvdG9fZmllbGQgPSAxXG4iCisgICAgICAgICAgICAgICAiICAgIFtkZWZhdWx0ID0gUkVBTExZX1JFQUxMWV9MT05HX0NPTlNUQU5UX1ZBTFVFXTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJyZXBlYXRlZCBkb3VibGUgdmFsdWUgPSAxXG4iCisgICAgICAgICAgICAgICAiICAgIFsoYWFhYWFhYS5hYWFhYWFhYWEpID0ge2FhYWFhYWFhYWFhYWFhYWFhIDogQUFBQUFBQUF9XTsiKTsKKyAgdmVyaWZ5Rm9ybWF0KCJyZXBlYXRlZCBkb3VibGUgdmFsdWUgPSAxXG4iCisgICAgICAgICAgICAgICAiICAgIFsoYWFhYWFhYS5hYWFhYWFhYWEpID0ge2FhYWFhYWFhYWFhYWFhYWEgOiBBQUFBQUFBQUFBLFxuIgorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYmJiYmJiYmJiYmJiYmJiIDogQkJCQkJCQkJCQn1dOyIpOworfQorCitURVNUX0YoRm9ybWF0VGVzdFByb3RvLCBGb3JtYXRzT3B0aW9ucykgeworICB2ZXJpZnlGb3JtYXQoIm9wdGlvbiBqYXZhX3BhY2thZ2UgPSBcIm15LnRlc3QucGFja2FnZVwiOyIpOworICB2ZXJpZnlGb3JtYXQoIm9wdGlvbiAobXlfY3VzdG9tX29wdGlvbikgPSBcImFiY1wiOyIpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgdG9vbGluZworfSAvLyBlbmQgbmFtZXNwYWNlIGNsYW5nCmRpZmYgLS1naXQgYS91bml0dGVzdHMvRm9ybWF0L0Zvcm1hdFRlc3RVdGlscy5oIGIvdW5pdHRlc3RzL0Zvcm1hdC9Gb3JtYXRUZXN0VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDlmNWIzCi0tLSAvZGV2L251bGwKKysrIGIvdW5pdHRlc3RzL0Zvcm1hdC9Gb3JtYXRUZXN0VXRpbHMuaApAQCAtMCwwICsxLDY3IEBACisvLz09PS0gdW5pdHRlc3QvRm9ybWF0L0Zvcm1hdFRlc3RVdGlscy5oIC0gRm9ybWF0dGluZyB1bml0IHRlc3RzIC0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgQ2xhbmctRm9ybWF0IHJlbGF0ZWQgdGVzdHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NMQU5HX0ZPUk1BVF9URVNUX1VUSUxTX0gKKyNkZWZpbmUgTExWTV9DTEFOR19GT1JNQVRfVEVTVF9VVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGNsYW5nIHsKK25hbWVzcGFjZSBmb3JtYXQgeworbmFtZXNwYWNlIHRlc3QgeworCitpbmxpbmUgc3RkOjpzdHJpbmcgbWVzc1VwKGxsdm06OlN0cmluZ1JlZiBDb2RlKSB7CisgIHN0ZDo6c3RyaW5nIE1lc3NlZFVwKENvZGUuc3RyKCkpOworICBib29sIEluQ29tbWVudCA9IGZhbHNlOworICBib29sIEluUHJlcHJvY2Vzc29yRGlyZWN0aXZlID0gZmFsc2U7CisgIGJvb2wgSnVzdFJlcGxhY2VkTmV3bGluZSA9IGZhbHNlOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gTWVzc2VkVXAuc2l6ZSgpIC0gMTsgaSAhPSBlOyArK2kpIHsKKyAgICBpZiAoTWVzc2VkVXBbaV0gPT0gJy8nICYmIE1lc3NlZFVwW2kgKyAxXSA9PSAnLycpIHsKKyAgICAgIGlmIChKdXN0UmVwbGFjZWROZXdsaW5lKQorICAgICAgICBNZXNzZWRVcFtpIC0gMV0gPSAnXG4nOworICAgICAgSW5Db21tZW50ID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKE1lc3NlZFVwW2ldID09ICcjJyAmJiAoSnVzdFJlcGxhY2VkTmV3bGluZSB8fCBpID09IDApKSB7CisgICAgICBpZiAoaSAhPSAwKQorICAgICAgICBNZXNzZWRVcFtpIC0gMV0gPSAnXG4nOworICAgICAgSW5QcmVwcm9jZXNzb3JEaXJlY3RpdmUgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoTWVzc2VkVXBbaV0gPT0gJ1xcJyAmJiBNZXNzZWRVcFtpICsgMV0gPT0gJ1xuJykgeworICAgICAgTWVzc2VkVXBbaV0gPSAnICc7CisgICAgICBNZXNzZWRVcFtpICsgMV0gPSAnICc7CisgICAgfSBlbHNlIGlmIChNZXNzZWRVcFtpXSA9PSAnXG4nKSB7CisgICAgICBpZiAoSW5Db21tZW50KSB7CisgICAgICAgIEluQ29tbWVudCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChJblByZXByb2Nlc3NvckRpcmVjdGl2ZSkgeworICAgICAgICBJblByZXByb2Nlc3NvckRpcmVjdGl2ZSA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgSnVzdFJlcGxhY2VkTmV3bGluZSA9IHRydWU7CisgICAgICAgIE1lc3NlZFVwW2ldID0gJyAnOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoTWVzc2VkVXBbaV0gIT0gJyAnKSB7CisgICAgICBKdXN0UmVwbGFjZWROZXdsaW5lID0gZmFsc2U7CisgICAgfQorICB9CisgIHN0ZDo6c3RyaW5nIFdpdGhvdXRXaGl0ZXNwYWNlOworICBpZiAoTWVzc2VkVXBbMF0gIT0gJyAnKQorICAgIFdpdGhvdXRXaGl0ZXNwYWNlLnB1c2hfYmFjayhNZXNzZWRVcFswXSk7CisgIGZvciAodW5zaWduZWQgaSA9IDEsIGUgPSBNZXNzZWRVcC5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgaWYgKE1lc3NlZFVwW2ldICE9ICcgJyB8fCBNZXNzZWRVcFtpIC0gMV0gIT0gJyAnKQorICAgICAgV2l0aG91dFdoaXRlc3BhY2UucHVzaF9iYWNrKE1lc3NlZFVwW2ldKTsKKyAgfQorICByZXR1cm4gV2l0aG91dFdoaXRlc3BhY2U7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0ZXN0Cit9IC8vIGVuZCBuYW1lc3BhY2UgZm9ybWF0Cit9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmcKKworI2VuZGlmIC8vIExMVk1fQ0xBTkdfRk9STUFUX1RFU1RfVVRJTFNfSApkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL0Zyb250ZW5kL0NNYWtlTGlzdHMudHh0IGIvdW5pdHRlc3RzL0Zyb250ZW5kL0NNYWtlTGlzdHMudHh0CmluZGV4IGM2NWExNjMuLmNkYzk1NTkgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9Gcm9udGVuZC9DTWFrZUxpc3RzLnR4dAorKysgYi91bml0dGVzdHMvRnJvbnRlbmQvQ01ha2VMaXN0cy50eHQKQEAgLTEsMTQgKzEsMTEgQEAKIHNldChMTFZNX0xJTktfQ09NUE9ORU5UUwotICAke0xMVk1fVEFSR0VUU19UT19CVUlMRH0KLSAgYXNtcGFyc2VyCi0gIGJpdHJlYWRlcgotICBzdXBwb3J0Ci0gIG1jCisgIFN1cHBvcnQKICAgKQogCiBhZGRfY2xhbmdfdW5pdHRlc3QoRnJvbnRlbmRUZXN0cwogICBGcm9udGVuZEFjdGlvblRlc3QuY3BwCiAgICkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhGcm9udGVuZFRlc3RzCisgIGNsYW5nQVNUCiAgIGNsYW5nRnJvbnRlbmQKICAgKQpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL0Zyb250ZW5kL0Zyb250ZW5kQWN0aW9uVGVzdC5jcHAgYi91bml0dGVzdHMvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25UZXN0LmNwcAppbmRleCBiY2IzNDBkLi5lMzlkMDBmIDEwMDY0NAotLS0gYS91bml0dGVzdHMvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25UZXN0LmNwcAorKysgYi91bml0dGVzdHMvRnJvbnRlbmQvRnJvbnRlbmRBY3Rpb25UZXN0LmNwcApAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgImNsYW5nL0FTVC9SZWN1cnNpdmVBU1RWaXNpdG9yLmgiCiAjaW5jbHVkZSAiY2xhbmcvRnJvbnRlbmQvQ29tcGlsZXJJbnN0YW5jZS5oIgogI2luY2x1ZGUgImNsYW5nL0Zyb250ZW5kL0NvbXBpbGVySW52b2NhdGlvbi5oIgorI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKICNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKICNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCiAjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKQEAgLTI0LDggKzI1LDE5IEBACiAKIGNsYXNzIFRlc3RBU1RGcm9udGVuZEFjdGlvbiA6IHB1YmxpYyBBU1RGcm9udGVuZEFjdGlvbiB7CiBwdWJsaWM6CisgIFRlc3RBU1RGcm9udGVuZEFjdGlvbihib29sIGVuYWJsZUluY3JlbWVudGFsUHJvY2Vzc2luZyA9IGZhbHNlKQorICAgIDogRW5hYmxlSW5jcmVtZW50YWxQcm9jZXNzaW5nKGVuYWJsZUluY3JlbWVudGFsUHJvY2Vzc2luZykgeyB9CisKKyAgYm9vbCBFbmFibGVJbmNyZW1lbnRhbFByb2Nlc3Npbmc7CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZWNsX25hbWVzOwogCisgIHZpcnR1YWwgYm9vbCBCZWdpblNvdXJjZUZpbGVBY3Rpb24oQ29tcGlsZXJJbnN0YW5jZSAmY2ksIFN0cmluZ1JlZiBmaWxlbmFtZSkgeworICAgIGlmIChFbmFibGVJbmNyZW1lbnRhbFByb2Nlc3NpbmcpCisgICAgICBjaS5nZXRQcmVwcm9jZXNzb3IoKS5lbmFibGVJbmNyZW1lbnRhbFByb2Nlc3NpbmcoKTsKKworICAgIHJldHVybiBBU1RGcm9udGVuZEFjdGlvbjo6QmVnaW5Tb3VyY2VGaWxlQWN0aW9uKGNpLCBmaWxlbmFtZSk7CisgIH0KKwogICB2aXJ0dWFsIEFTVENvbnN1bWVyICpDcmVhdGVBU1RDb25zdW1lcihDb21waWxlckluc3RhbmNlICZDSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluRmlsZSkgewogICAgIHJldHVybiBuZXcgVmlzaXRvcihkZWNsX25hbWVzKTsKQEAgLTY0LDEwICs3NiwyOCBAQAogCiAgIFRlc3RBU1RGcm9udGVuZEFjdGlvbiB0ZXN0X2FjdGlvbjsKICAgQVNTRVJUX1RSVUUoY29tcGlsZXIuRXhlY3V0ZUFjdGlvbih0ZXN0X2FjdGlvbikpOwotICBBU1NFUlRfRVEoM1UsIHRlc3RfYWN0aW9uLmRlY2xfbmFtZXMuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKCJfX2J1aWx0aW5fdmFfbGlzdCIsIHRlc3RfYWN0aW9uLmRlY2xfbmFtZXNbMF0pOwotICBFWFBFQ1RfRVEoIm1haW4iLCB0ZXN0X2FjdGlvbi5kZWNsX25hbWVzWzFdKTsKLSAgRVhQRUNUX0VRKCJ4IiwgdGVzdF9hY3Rpb24uZGVjbF9uYW1lc1syXSk7CisgIEFTU0VSVF9FUSgyVSwgdGVzdF9hY3Rpb24uZGVjbF9uYW1lcy5zaXplKCkpOworICBFWFBFQ1RfRVEoIm1haW4iLCB0ZXN0X2FjdGlvbi5kZWNsX25hbWVzWzBdKTsKKyAgRVhQRUNUX0VRKCJ4IiwgdGVzdF9hY3Rpb24uZGVjbF9uYW1lc1sxXSk7Cit9CisKK1RFU1QoQVNURnJvbnRlbmRBY3Rpb24sIEluY3JlbWVudGFsUGFyc2luZykgeworICBDb21waWxlckludm9jYXRpb24gKmludm9jYXRpb24gPSBuZXcgQ29tcGlsZXJJbnZvY2F0aW9uOworICBpbnZvY2F0aW9uLT5nZXRQcmVwcm9jZXNzb3JPcHRzKCkuYWRkUmVtYXBwZWRGaWxlKAorICAgICJ0ZXN0LmNjIiwgTWVtb3J5QnVmZmVyOjpnZXRNZW1CdWZmZXIoImludCBtYWluKCkgeyBmbG9hdCB4OyB9IikpOworICBpbnZvY2F0aW9uLT5nZXRGcm9udGVuZE9wdHMoKS5JbnB1dHMucHVzaF9iYWNrKEZyb250ZW5kSW5wdXRGaWxlKCJ0ZXN0LmNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJS19DWFgpKTsKKyAgaW52b2NhdGlvbi0+Z2V0RnJvbnRlbmRPcHRzKCkuUHJvZ3JhbUFjdGlvbiA9IGZyb250ZW5kOjpQYXJzZVN5bnRheE9ubHk7CisgIGludm9jYXRpb24tPmdldFRhcmdldE9wdHMoKS5UcmlwbGUgPSAiaTM4Ni11bmtub3duLWxpbnV4LWdudSI7CisgIENvbXBpbGVySW5zdGFuY2UgY29tcGlsZXI7CisgIGNvbXBpbGVyLnNldEludm9jYXRpb24oaW52b2NhdGlvbik7CisgIGNvbXBpbGVyLmNyZWF0ZURpYWdub3N0aWNzKCk7CisKKyAgVGVzdEFTVEZyb250ZW5kQWN0aW9uIHRlc3RfYWN0aW9uKC8qZW5hYmxlSW5jcmVtZW50YWxQcm9jZXNzaW5nPSovdHJ1ZSk7CisgIEFTU0VSVF9UUlVFKGNvbXBpbGVyLkV4ZWN1dGVBY3Rpb24odGVzdF9hY3Rpb24pKTsKKyAgQVNTRVJUX0VRKDJVLCB0ZXN0X2FjdGlvbi5kZWNsX25hbWVzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgibWFpbiIsIHRlc3RfYWN0aW9uLmRlY2xfbmFtZXNbMF0pOworICBFWFBFQ1RfRVEoIngiLCB0ZXN0X2FjdGlvbi5kZWNsX25hbWVzWzFdKTsKIH0KIAogfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCmRpZmYgLS1naXQgYS91bml0dGVzdHMvTGV4L0NNYWtlTGlzdHMudHh0IGIvdW5pdHRlc3RzL0xleC9DTWFrZUxpc3RzLnR4dAppbmRleCBjYjNiOTI3Li40NjFlMGQ5IDEwMDY0NAotLS0gYS91bml0dGVzdHMvTGV4L0NNYWtlTGlzdHMudHh0CisrKyBiL3VuaXR0ZXN0cy9MZXgvQ01ha2VMaXN0cy50eHQKQEAgLTEsMyArMSw3IEBACitzZXQoTExWTV9MSU5LX0NPTVBPTkVOVFMKKyAgU3VwcG9ydAorICApCisKIGFkZF9jbGFuZ191bml0dGVzdChMZXhUZXN0cwogICBMZXhlclRlc3QuY3BwCiAgIFBQQ2FsbGJhY2tzVGVzdC5jcHAKQEAgLTUsNSArOSw5IEBACiAgICkKIAogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKExleFRlc3RzCi0gIGNsYW5nTGV4IGNsYW5nUGFyc2UgY2xhbmdTZW1hCisgIGNsYW5nQVNUCisgIGNsYW5nQmFzaWMKKyAgY2xhbmdMZXgKKyAgY2xhbmdQYXJzZQorICBjbGFuZ1NlbWEKICAgKQpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL0xleC9QUENhbGxiYWNrc1Rlc3QuY3BwIGIvdW5pdHRlc3RzL0xleC9QUENhbGxiYWNrc1Rlc3QuY3BwCmluZGV4IDk0MDVhODQuLmUzYTRhNzYgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9MZXgvUFBDYWxsYmFja3NUZXN0LmNwcAorKysgYi91bml0dGVzdHMvTGV4L1BQQ2FsbGJhY2tzVGVzdC5jcHAKQEAgLTgsNiArOCw4IEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgImNsYW5nL0xleC9QcmVwcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29uc3VtZXIuaCIKKyNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0RpYWdub3N0aWMuaCIKICNpbmNsdWRlICJjbGFuZy9CYXNpYy9GaWxlTWFuYWdlci5oIgogI2luY2x1ZGUgImNsYW5nL0Jhc2ljL0xhbmdPcHRpb25zLmgiCkBAIC0yMCw4ICsyMiw2IEBACiAjaW5jbHVkZSAiY2xhbmcvTGV4L1ByZXByb2Nlc3Nvck9wdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9QYXJzZS9QYXJzZXIuaCIKICNpbmNsdWRlICJjbGFuZy9TZW1hL1NlbWEuaCIKLSNpbmNsdWRlICJjbGFuZy9BU1QvQVNUQ29udGV4dC5oIgotI2luY2x1ZGUgImNsYW5nL0FTVC9BU1RDb25zdW1lci5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCiAjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdGguaCIKICNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL01ha2VmaWxlIGIvdW5pdHRlc3RzL01ha2VmaWxlCmluZGV4IGQwZGZlNDcuLjliOTVhNmUgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9NYWtlZmlsZQorKysgYi91bml0dGVzdHMvTWFrZWZpbGUKQEAgLTE0LDcgKzE0LDcgQEAKIAogSVNfVU5JVFRFU1RfTEVWRUwgOj0gMQogQ0xBTkdfTEVWRUwgOj0gLi4KLVBBUkFMTEVMX0RJUlMgPSBCYXNpYyBMZXgKK1BBUkFMTEVMX0RJUlMgPSBCYXNpYyBMZXggRHJpdmVyIGxpYmNsYW5nCiAKIGluY2x1ZGUgJChDTEFOR19MRVZFTCkvLi4vLi4vL01ha2VmaWxlLmNvbmZpZwogCmRpZmYgLS1naXQgYS91bml0dGVzdHMvU2VtYS9DTWFrZUxpc3RzLnR4dCBiL3VuaXR0ZXN0cy9TZW1hL0NNYWtlTGlzdHMudHh0CmluZGV4IGQ0OTE2NTUuLmMyNWRiODEgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9TZW1hL0NNYWtlTGlzdHMudHh0CisrKyBiL3VuaXR0ZXN0cy9TZW1hL0NNYWtlTGlzdHMudHh0CkBAIC0xLDcgKzEsMTYgQEAKK3NldChMTFZNX0xJTktfQ09NUE9ORU5UUworICBTdXBwb3J0CisgICkKKwogYWRkX2NsYW5nX3VuaXR0ZXN0KFNlbWFUZXN0cwogICBFeHRlcm5hbFNlbWFTb3VyY2VUZXN0LmNwcAogICApCiAKIHRhcmdldF9saW5rX2xpYnJhcmllcyhTZW1hVGVzdHMKLSAgY2xhbmdBU1QgY2xhbmdBU1RNYXRjaGVycyBjbGFuZ1Rvb2xpbmcKKyAgY2xhbmdBU1QKKyAgY2xhbmdCYXNpYworICBjbGFuZ0Zyb250ZW5kCisgIGNsYW5nUGFyc2UKKyAgY2xhbmdTZW1hCisgIGNsYW5nVG9vbGluZwogICApCmRpZmYgLS1naXQgYS91bml0dGVzdHMvU2VtYS9FeHRlcm5hbFNlbWFTb3VyY2VUZXN0LmNwcCBiL3VuaXR0ZXN0cy9TZW1hL0V4dGVybmFsU2VtYVNvdXJjZVRlc3QuY3BwCmluZGV4IGUyN2QwY2QuLjdjYjVhZjEgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9TZW1hL0V4dGVybmFsU2VtYVNvdXJjZVRlc3QuY3BwCisrKyBiL3VuaXR0ZXN0cy9TZW1hL0V4dGVybmFsU2VtYVNvdXJjZVRlc3QuY3BwCkBAIC0xMzcsNyArMTM3LDcgQEAKIGNsYXNzIEV4dGVybmFsU2VtYVNvdXJjZUluc3RhbGxlciA6IHB1YmxpYyBjbGFuZzo6QVNURnJvbnRlbmRBY3Rpb24gewogICBzdGQ6OnZlY3RvcjxOYW1lc3BhY2VEaWFnbm9zdGljV2F0Y2hlciAqPiBXYXRjaGVyczsKICAgc3RkOjp2ZWN0b3I8Y2xhbmc6OkV4dGVybmFsU2VtYVNvdXJjZSAqPiBTb3VyY2VzOwotICBsbHZtOjpPd25pbmdQdHI8RGlhZ25vc3RpY0NvbnN1bWVyPiBPd25lZENsaWVudDsKKyAgc3RkOjp1bmlxdWVfcHRyPERpYWdub3N0aWNDb25zdW1lcj4gT3duZWRDbGllbnQ7CiAKIHByb3RlY3RlZDoKICAgdmlydHVhbCBjbGFuZzo6QVNUQ29uc3VtZXIgKgpAQCAtMTc4LDIwICsxNzgsMjAgQEAKIAogLy8gTWFrZSBzdXJlIHRoYXQgdGhlIE5hbWVzcGFjZURpYWdub3N0aWNXYXRjaGVyIGlzIG5vdCBtaXNjb3VudGluZy4KIFRFU1QoRXh0ZXJuYWxTZW1hU291cmNlLCBTYW5pdHlDaGVjaykgewotICBsbHZtOjpPd25pbmdQdHI8RXh0ZXJuYWxTZW1hU291cmNlSW5zdGFsbGVyPiBJbnN0YWxsZXIoCisgIHN0ZDo6dW5pcXVlX3B0cjxFeHRlcm5hbFNlbWFTb3VyY2VJbnN0YWxsZXI+IEluc3RhbGxlcigKICAgICAgIG5ldyBFeHRlcm5hbFNlbWFTb3VyY2VJbnN0YWxsZXIpOwogICBOYW1lc3BhY2VEaWFnbm9zdGljV2F0Y2hlciBXYXRjaGVyKCJBQUIiLCAiQkJCIik7CiAgIEluc3RhbGxlci0+UHVzaFdhdGNoZXIoJldhdGNoZXIpOwogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQXJncygxLCAiLXN0ZD1jKysxMSIpOwogICBBU1NFUlRfVFJVRShjbGFuZzo6dG9vbGluZzo6cnVuVG9vbE9uQ29kZVdpdGhBcmdzKAotICAgICAgSW5zdGFsbGVyLnRha2UoKSwgIm5hbWVzcGFjZSBBQUEgeyB9IHVzaW5nIG5hbWVzcGFjZSBBQUI7IiwgQXJncykpOworICAgICAgSW5zdGFsbGVyLnJlbGVhc2UoKSwgIm5hbWVzcGFjZSBBQUEgeyB9IHVzaW5nIG5hbWVzcGFjZSBBQUI7IiwgQXJncykpOwogICBBU1NFUlRfRVEoMCwgV2F0Y2hlci5TZWVuQ291bnQpOwogfQogCiAvLyBDaGVjayB0aGF0IHdoZW4gd2UgYWRkIGEgTmFtZXNwYWNlVHlwZVByb3ZpZGVyLCB3ZSB1c2UgdGhhdCBzdWdnZXN0aW9uCiAvLyBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBzdWdnZXN0aW9uIHdlIHdvdWxkIHVzZSBhYm92ZS4KIFRFU1QoRXh0ZXJuYWxTZW1hU291cmNlLCBFeHRlcm5hbFR5cG9Db3JyZWN0aW9uUHJpb3JpdGl6ZWQpIHsKLSAgbGx2bTo6T3duaW5nUHRyPEV4dGVybmFsU2VtYVNvdXJjZUluc3RhbGxlcj4gSW5zdGFsbGVyKAorICBzdGQ6OnVuaXF1ZV9wdHI8RXh0ZXJuYWxTZW1hU291cmNlSW5zdGFsbGVyPiBJbnN0YWxsZXIoCiAgICAgICBuZXcgRXh0ZXJuYWxTZW1hU291cmNlSW5zdGFsbGVyKTsKICAgTmFtZXNwYWNlVHlwb1Byb3ZpZGVyIFByb3ZpZGVyKCJBQUIiLCAiQkJCIik7CiAgIE5hbWVzcGFjZURpYWdub3N0aWNXYXRjaGVyIFdhdGNoZXIoIkFBQiIsICJCQkIiKTsKQEAgLTE5OSw3ICsxOTksNyBAQAogICBJbnN0YWxsZXItPlB1c2hXYXRjaGVyKCZXYXRjaGVyKTsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFyZ3MoMSwgIi1zdGQ9YysrMTEiKTsKICAgQVNTRVJUX1RSVUUoY2xhbmc6OnRvb2xpbmc6OnJ1blRvb2xPbkNvZGVXaXRoQXJncygKLSAgICAgIEluc3RhbGxlci50YWtlKCksICJuYW1lc3BhY2UgQUFBIHsgfSB1c2luZyBuYW1lc3BhY2UgQUFCOyIsIEFyZ3MpKTsKKyAgICAgIEluc3RhbGxlci5yZWxlYXNlKCksICJuYW1lc3BhY2UgQUFBIHsgfSB1c2luZyBuYW1lc3BhY2UgQUFCOyIsIEFyZ3MpKTsKICAgQVNTRVJUX0xFKDAsIFByb3ZpZGVyLkNhbGxDb3VudCk7CiAgIEFTU0VSVF9FUSgxLCBXYXRjaGVyLlNlZW5Db3VudCk7CiB9CkBAIC0yMDcsNyArMjA3LDcgQEAKIC8vIENoZWNrIHRoYXQgd2UgdXNlIHRoZSBmaXJzdCBzdWNjZXNzZnVsIFR5cG9Db3JyZWN0aW9uIHJldHVybmVkIGZyb20gYW4KIC8vIEV4dGVybmFsU2VtYVNvdXJjZS4KIFRFU1QoRXh0ZXJuYWxTZW1hU291cmNlLCBFeHRlcm5hbFR5cG9Db3JyZWN0aW9uT3JkZXJpbmcpIHsKLSAgbGx2bTo6T3duaW5nUHRyPEV4dGVybmFsU2VtYVNvdXJjZUluc3RhbGxlcj4gSW5zdGFsbGVyKAorICBzdGQ6OnVuaXF1ZV9wdHI8RXh0ZXJuYWxTZW1hU291cmNlSW5zdGFsbGVyPiBJbnN0YWxsZXIoCiAgICAgICBuZXcgRXh0ZXJuYWxTZW1hU291cmNlSW5zdGFsbGVyKTsKICAgTmFtZXNwYWNlVHlwb1Byb3ZpZGVyIEZpcnN0KCJYWFgiLCAiQkJCIik7CiAgIE5hbWVzcGFjZVR5cG9Qcm92aWRlciBTZWNvbmQoIkFBQiIsICJDQ0MiKTsKQEAgLTIxOSw3ICsyMTksNyBAQAogICBJbnN0YWxsZXItPlB1c2hXYXRjaGVyKCZXYXRjaGVyKTsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFyZ3MoMSwgIi1zdGQ9YysrMTEiKTsKICAgQVNTRVJUX1RSVUUoY2xhbmc6OnRvb2xpbmc6OnJ1blRvb2xPbkNvZGVXaXRoQXJncygKLSAgICAgIEluc3RhbGxlci50YWtlKCksICJuYW1lc3BhY2UgQUFBIHsgfSB1c2luZyBuYW1lc3BhY2UgQUFCOyIsIEFyZ3MpKTsKKyAgICAgIEluc3RhbGxlci5yZWxlYXNlKCksICJuYW1lc3BhY2UgQUFBIHsgfSB1c2luZyBuYW1lc3BhY2UgQUFCOyIsIEFyZ3MpKTsKICAgQVNTRVJUX0xFKDEsIEZpcnN0LkNhbGxDb3VudCk7CiAgIEFTU0VSVF9MRSgxLCBTZWNvbmQuQ2FsbENvdW50KTsKICAgQVNTRVJUX0VRKDAsIFRoaXJkLkNhbGxDb3VudCk7CkBAIC0yMjksNyArMjI5LDcgQEAKIC8vIFdlIHNob3VsZCBvbmx5IHRyeSBNYXliZURpYWdub3NlTWlzc2luZ0NvbXBsZXRlVHlwZSBpZiB3ZSBjYW4ndCBvdGhlcndpc2UKIC8vIHNvbHZlIHRoZSBwcm9ibGVtLgogVEVTVChFeHRlcm5hbFNlbWFTb3VyY2UsIFRyeU90aGVyVGFjdGljc0JlZm9yZURpYWdub3NpbmcpIHsKLSAgbGx2bTo6T3duaW5nUHRyPEV4dGVybmFsU2VtYVNvdXJjZUluc3RhbGxlcj4gSW5zdGFsbGVyKAorICBzdGQ6OnVuaXF1ZV9wdHI8RXh0ZXJuYWxTZW1hU291cmNlSW5zdGFsbGVyPiBJbnN0YWxsZXIoCiAgICAgICBuZXcgRXh0ZXJuYWxTZW1hU291cmNlSW5zdGFsbGVyKTsKICAgQ29tcGxldGVUeXBlRGlhZ25vc2VyIERpYWdub3NlcihmYWxzZSk7CiAgIEluc3RhbGxlci0+UHVzaFNvdXJjZSgmRGlhZ25vc2VyKTsKQEAgLTIzNyw3ICsyMzcsNyBAQAogICAvLyBUaGlzIGNvZGUgaGl0cyB0aGUgY2xhc3MgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24vY2xhc3MgbWVtYmVyIG9mIGEgY2xhc3MKICAgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gY2hlY2tzIGluIFNlbWE6OlJlcXVpcmVDb21wbGV0ZVR5cGVJbXBsLgogICBBU1NFUlRfVFJVRShjbGFuZzo6dG9vbGluZzo6cnVuVG9vbE9uQ29kZVdpdGhBcmdzKAotICAgICAgSW5zdGFsbGVyLnRha2UoKSwKKyAgICAgIEluc3RhbGxlci5yZWxlYXNlKCksCiAgICAgICAidGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBTIHsgY2xhc3MgQyB7IH07IH07IFM8Y2hhcj46OkMgU0NJbnN0OyIsCiAgICAgICBBcmdzKSk7CiAgIEFTU0VSVF9FUSgwLCBEaWFnbm9zZXIuQ2FsbENvdW50KTsKQEAgLTI0Niw3ICsyNDYsNyBAQAogLy8gVGhlIGZpcnN0IEV4dGVybmFsU2VtYVNvdXJjZSB3aGVyZSBNYXliZURpYWdub3NlTWlzc2luZ0NvbXBsZXRlVHlwZSByZXR1cm5zCiAvLyB0cnVlIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkLgogVEVTVChFeHRlcm5hbFNlbWFTb3VyY2UsIEZpcnN0RGlhZ25vc2VyVGFrZW4pIHsKLSAgbGx2bTo6T3duaW5nUHRyPEV4dGVybmFsU2VtYVNvdXJjZUluc3RhbGxlcj4gSW5zdGFsbGVyKAorICBzdGQ6OnVuaXF1ZV9wdHI8RXh0ZXJuYWxTZW1hU291cmNlSW5zdGFsbGVyPiBJbnN0YWxsZXIoCiAgICAgICBuZXcgRXh0ZXJuYWxTZW1hU291cmNlSW5zdGFsbGVyKTsKICAgQ29tcGxldGVUeXBlRGlhZ25vc2VyIEZpcnN0KGZhbHNlKTsKICAgQ29tcGxldGVUeXBlRGlhZ25vc2VyIFNlY29uZCh0cnVlKTsKQEAgLTI1Niw3ICsyNTYsNyBAQAogICBJbnN0YWxsZXItPlB1c2hTb3VyY2UoJlRoaXJkKTsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFyZ3MoMSwgIi1zdGQ9YysrMTEiKTsKICAgQVNTRVJUX0ZBTFNFKGNsYW5nOjp0b29saW5nOjpydW5Ub29sT25Db2RlV2l0aEFyZ3MoCi0gICAgICBJbnN0YWxsZXIudGFrZSgpLCAiY2xhc3MgSW5jb21wbGV0ZTsgSW5jb21wbGV0ZSBJbmNvbXBsZXRlSW5zdGFuY2U7IiwKKyAgICAgIEluc3RhbGxlci5yZWxlYXNlKCksICJjbGFzcyBJbmNvbXBsZXRlOyBJbmNvbXBsZXRlIEluY29tcGxldGVJbnN0YW5jZTsiLAogICAgICAgQXJncykpOwogICBBU1NFUlRfRVEoMSwgRmlyc3QuQ2FsbENvdW50KTsKICAgQVNTRVJUX0VRKDEsIFNlY29uZC5DYWxsQ291bnQpOwpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL1Rvb2xpbmcvQ01ha2VMaXN0cy50eHQgYi91bml0dGVzdHMvVG9vbGluZy9DTWFrZUxpc3RzLnR4dAppbmRleCAzM2Q3NjE3Li5jNTlmZjg3IDEwMDY0NAotLS0gYS91bml0dGVzdHMvVG9vbGluZy9DTWFrZUxpc3RzLnR4dAorKysgYi91bml0dGVzdHMvVG9vbGluZy9DTWFrZUxpc3RzLnR4dApAQCAtMSw5ICsxLDUgQEAKIHNldChMTFZNX0xJTktfQ09NUE9ORU5UUwotICAke0xMVk1fVEFSR0VUU19UT19CVUlMRH0KLSAgYXNtcGFyc2VyCi0gIGJpdHJlYWRlcgotICBzdXBwb3J0Ci0gIG1jCisgIFN1cHBvcnQKICAgKQogCiBhZGRfY2xhbmdfdW5pdHRlc3QoVG9vbGluZ1Rlc3RzCkBAIC0xOSw2ICsxNSwxMCBAQAogCiB0YXJnZXRfbGlua19saWJyYXJpZXMoVG9vbGluZ1Rlc3RzCiAgIGNsYW5nQVNUCi0gIGNsYW5nVG9vbGluZworICBjbGFuZ0FTVE1hdGNoZXJzCisgIGNsYW5nQmFzaWMKKyAgY2xhbmdGcm9udGVuZAorICBjbGFuZ0xleAogICBjbGFuZ1Jld3JpdGVDb3JlCisgIGNsYW5nVG9vbGluZwogICApCmRpZmYgLS1naXQgYS91bml0dGVzdHMvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlVGVzdC5jcHAgYi91bml0dGVzdHMvVG9vbGluZy9Db21waWxhdGlvbkRhdGFiYXNlVGVzdC5jcHAKaW5kZXggYzU3NWRmZi4uOWYwNzhmNCAxMDA2NDQKLS0tIGEvdW5pdHRlc3RzL1Rvb2xpbmcvQ29tcGlsYXRpb25EYXRhYmFzZVRlc3QuY3BwCisrKyBiL3VuaXR0ZXN0cy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2VUZXN0LmNwcApAQCAtMjQsNyArMjQsNyBAQAogICBzdGQ6OnN0cmluZyBFcnJvck1lc3NhZ2U7CiAgIEVYUEVDVF9FUShOVUxMLCBKU09OQ29tcGlsYXRpb25EYXRhYmFzZTo6bG9hZEZyb21CdWZmZXIoSlNPTkRhdGFiYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSkpCi0gICAgPDwgIkV4cGVjdGVkIGFuIGVycm9yIGJlY2F1c2Ugb2Y6ICIgPDwgRXhwbGFuYXRpb247CisgICAgPDwgIkV4cGVjdGVkIGFuIGVycm9yIGJlY2F1c2Ugb2Y6ICIgPDwgRXhwbGFuYXRpb24uc3RyKCk7CiB9CiAKIFRFU1QoSlNPTkNvbXBpbGF0aW9uRGF0YWJhc2UsIEVycnNPbkludmFsaWRGb3JtYXQpIHsKQEAgLTQyLDcgKzQyLDcgQEAKIAogc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXRBbGxGaWxlcyhTdHJpbmdSZWYgSlNPTkRhdGFiYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmRXJyb3JNZXNzYWdlKSB7Ci0gIE93bmluZ1B0cjxDb21waWxhdGlvbkRhdGFiYXNlPiBEYXRhYmFzZSgKKyAgc3RkOjp1bmlxdWVfcHRyPENvbXBpbGF0aW9uRGF0YWJhc2U+IERhdGFiYXNlKAogICAgICAgSlNPTkNvbXBpbGF0aW9uRGF0YWJhc2U6OmxvYWRGcm9tQnVmZmVyKEpTT05EYXRhYmFzZSwgRXJyb3JNZXNzYWdlKSk7CiAgIGlmICghRGF0YWJhc2UpIHsKICAgICBBRERfRkFJTFVSRSgpIDw8IEVycm9yTWVzc2FnZTsKQEAgLTUzLDcgKzUzLDcgQEAKIAogc3RhdGljIHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPiBnZXRBbGxDb21waWxlQ29tbWFuZHMoU3RyaW5nUmVmIEpTT05EYXRhYmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmRXJyb3JNZXNzYWdlKSB7Ci0gIE93bmluZ1B0cjxDb21waWxhdGlvbkRhdGFiYXNlPiBEYXRhYmFzZSgKKyAgc3RkOjp1bmlxdWVfcHRyPENvbXBpbGF0aW9uRGF0YWJhc2U+IERhdGFiYXNlKAogICAgICAgSlNPTkNvbXBpbGF0aW9uRGF0YWJhc2U6OmxvYWRGcm9tQnVmZmVyKEpTT05EYXRhYmFzZSwgRXJyb3JNZXNzYWdlKSk7CiAgIGlmICghRGF0YWJhc2UpIHsKICAgICBBRERfRkFJTFVSRSgpIDw8IEVycm9yTWVzc2FnZTsKQEAgLTExNSw3ICsxMTUsNyBAQAogc3RhdGljIENvbXBpbGVDb21tYW5kIGZpbmRDb21waWxlQXJnc0luSnNvbkRhdGFiYXNlKFN0cmluZ1JlZiBGaWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSlNPTkRhdGFiYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZFcnJvck1lc3NhZ2UpIHsKLSAgT3duaW5nUHRyPENvbXBpbGF0aW9uRGF0YWJhc2U+IERhdGFiYXNlKAorICBzdGQ6OnVuaXF1ZV9wdHI8Q29tcGlsYXRpb25EYXRhYmFzZT4gRGF0YWJhc2UoCiAgICAgICBKU09OQ29tcGlsYXRpb25EYXRhYmFzZTo6bG9hZEZyb21CdWZmZXIoSlNPTkRhdGFiYXNlLCBFcnJvck1lc3NhZ2UpKTsKICAgaWYgKCFEYXRhYmFzZSkKICAgICByZXR1cm4gQ29tcGlsZUNvbW1hbmQoKTsKQEAgLTQzMyw3ICs0MzMsNyBAQAogCiBURVNUKFBhcnNlRml4ZWRDb21waWxhdGlvbkRhdGFiYXNlLCBSZXR1cm5zTnVsbE9uRW1wdHlBcmd1bWVudExpc3QpIHsKICAgaW50IEFyZ2MgPSAwOwotICBPd25pbmdQdHI8Rml4ZWRDb21waWxhdGlvbkRhdGFiYXNlPiBEYXRhYmFzZSgKKyAgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ29tcGlsYXRpb25EYXRhYmFzZT4gRGF0YWJhc2UoCiAgICAgICBGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2U6OmxvYWRGcm9tQ29tbWFuZExpbmUoQXJnYywgTlVMTCkpOwogICBFWFBFQ1RfRkFMU0UoRGF0YWJhc2UpOwogICBFWFBFQ1RfRVEoMCwgQXJnYyk7CkBAIC00NDIsNyArNDQyLDcgQEAKIFRFU1QoUGFyc2VGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2UsIFJldHVybnNOdWxsV2l0aG91dERvdWJsZURhc2gpIHsKICAgaW50IEFyZ2MgPSAyOwogICBjb25zdCBjaGFyICpBcmd2W10gPSB7ICIxIiwgIjIiIH07Ci0gIE93bmluZ1B0cjxGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2U+IERhdGFiYXNlKAorICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDb21waWxhdGlvbkRhdGFiYXNlPiBEYXRhYmFzZSgKICAgICAgIEZpeGVkQ29tcGlsYXRpb25EYXRhYmFzZTo6bG9hZEZyb21Db21tYW5kTGluZShBcmdjLCBBcmd2KSk7CiAgIEVYUEVDVF9GQUxTRShEYXRhYmFzZSk7CiAgIEVYUEVDVF9FUSgyLCBBcmdjKTsKQEAgLTQ1Myw5ICs0NTMsOSBAQAogICBjb25zdCBjaGFyICpBcmd2W10gPSB7CiAgICAgIjEiLCAiMiIsICItLVwwbm8tY29uc3RhbnQtZm9sZGluZyIsICItRERFRjMiLCAiLURERUY0IgogICB9OwotICBPd25pbmdQdHI8Rml4ZWRDb21waWxhdGlvbkRhdGFiYXNlPiBEYXRhYmFzZSgKKyAgc3RkOjp1bmlxdWVfcHRyPEZpeGVkQ29tcGlsYXRpb25EYXRhYmFzZT4gRGF0YWJhc2UoCiAgICAgICBGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2U6OmxvYWRGcm9tQ29tbWFuZExpbmUoQXJnYywgQXJndikpOwotICBBU1NFUlRfVFJVRShEYXRhYmFzZS5pc1ZhbGlkKCkpOworICBBU1NFUlRfVFJVRSgoYm9vbClEYXRhYmFzZSk7CiAgIHN0ZDo6dmVjdG9yPENvbXBpbGVDb21tYW5kPiBSZXN1bHQgPQogICAgIERhdGFiYXNlLT5nZXRDb21waWxlQ29tbWFuZHMoInNvdXJjZSIpOwogICBBU1NFUlRfRVEoMXVsLCBSZXN1bHQuc2l6ZSgpKTsKQEAgLTQ3Miw5ICs0NzIsOSBAQAogVEVTVChQYXJzZUZpeGVkQ29tcGlsYXRpb25EYXRhYmFzZSwgUmV0dXJuc0VtcHR5Q29tbWFuZExpbmUpIHsKICAgaW50IEFyZ2MgPSAzOwogICBjb25zdCBjaGFyICpBcmd2W10gPSB7ICIxIiwgIjIiLCAiLS1cMG5vLWNvbnN0YW50LWZvbGRpbmciIH07Ci0gIE93bmluZ1B0cjxGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2U+IERhdGFiYXNlKAorICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDb21waWxhdGlvbkRhdGFiYXNlPiBEYXRhYmFzZSgKICAgICAgIEZpeGVkQ29tcGlsYXRpb25EYXRhYmFzZTo6bG9hZEZyb21Db21tYW5kTGluZShBcmdjLCBBcmd2KSk7Ci0gIEFTU0VSVF9UUlVFKERhdGFiYXNlLmlzVmFsaWQoKSk7CisgIEFTU0VSVF9UUlVFKChib29sKURhdGFiYXNlKTsKICAgc3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmQ+IFJlc3VsdCA9CiAgICAgRGF0YWJhc2UtPmdldENvbXBpbGVDb21tYW5kcygic291cmNlIik7CiAgIEFTU0VSVF9FUSgxdWwsIFJlc3VsdC5zaXplKCkpOwpAQCAtNDg5LDkgKzQ4OSw5IEBACiBURVNUKFBhcnNlRml4ZWRDb21waWxhdGlvbkRhdGFiYXNlLCBIYW5kbGVzUG9zaXRpb25hbEFyZ3MpIHsKICAgY29uc3QgY2hhciAqQXJndltdID0geyIxIiwgIjIiLCAiLS0iLCAiLWMiLCAic29tZWZpbGUuY3BwIiwgIi1EREVGMyJ9OwogICBpbnQgQXJnYyA9IHNpemVvZihBcmd2KSAvIHNpemVvZihjaGFyKik7Ci0gIE93bmluZ1B0cjxGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2U+IERhdGFiYXNlKAorICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDb21waWxhdGlvbkRhdGFiYXNlPiBEYXRhYmFzZSgKICAgICAgIEZpeGVkQ29tcGlsYXRpb25EYXRhYmFzZTo6bG9hZEZyb21Db21tYW5kTGluZShBcmdjLCBBcmd2KSk7Ci0gIEFTU0VSVF9UUlVFKERhdGFiYXNlLmlzVmFsaWQoKSk7CisgIEFTU0VSVF9UUlVFKChib29sKURhdGFiYXNlKTsKICAgc3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmQ+IFJlc3VsdCA9CiAgICAgRGF0YWJhc2UtPmdldENvbXBpbGVDb21tYW5kcygic291cmNlIik7CiAgIEFTU0VSVF9FUSgxdWwsIFJlc3VsdC5zaXplKCkpOwpAQCAtNTA4LDkgKzUwOCw5IEBACiBURVNUKFBhcnNlRml4ZWRDb21waWxhdGlvbkRhdGFiYXNlLCBIYW5kbGVzQXJndjApIHsKICAgY29uc3QgY2hhciAqQXJndltdID0geyIxIiwgIjIiLCAiLS0iLCAibXl0b29sIiwgInNvbWVmaWxlLmNwcCJ9OwogICBpbnQgQXJnYyA9IHNpemVvZihBcmd2KSAvIHNpemVvZihjaGFyKik7Ci0gIE93bmluZ1B0cjxGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2U+IERhdGFiYXNlKAorICBzdGQ6OnVuaXF1ZV9wdHI8Rml4ZWRDb21waWxhdGlvbkRhdGFiYXNlPiBEYXRhYmFzZSgKICAgICAgIEZpeGVkQ29tcGlsYXRpb25EYXRhYmFzZTo6bG9hZEZyb21Db21tYW5kTGluZShBcmdjLCBBcmd2KSk7Ci0gIEFTU0VSVF9UUlVFKERhdGFiYXNlLmlzVmFsaWQoKSk7CisgIEFTU0VSVF9UUlVFKChib29sKURhdGFiYXNlKTsKICAgc3RkOjp2ZWN0b3I8Q29tcGlsZUNvbW1hbmQ+IFJlc3VsdCA9CiAgICAgRGF0YWJhc2UtPmdldENvbXBpbGVDb21tYW5kcygic291cmNlIik7CiAgIEFTU0VSVF9FUSgxdWwsIFJlc3VsdC5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL1Rvb2xpbmcvUmVjdXJzaXZlQVNUVmlzaXRvclRlc3QuY3BwIGIvdW5pdHRlc3RzL1Rvb2xpbmcvUmVjdXJzaXZlQVNUVmlzaXRvclRlc3QuY3BwCmluZGV4IDMyMzQ3NjcuLmE1Zjg1ZmYgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9Ub29saW5nL1JlY3Vyc2l2ZUFTVFZpc2l0b3JUZXN0LmNwcAorKysgYi91bml0dGVzdHMvVG9vbGluZy9SZWN1cnNpdmVBU1RWaXNpdG9yVGVzdC5jcHAKQEAgLTgsNyArOCw2IEBACiAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwogCiAjaW5jbHVkZSAiVGVzdFZpc2l0b3IuaCIKLQogI2luY2x1ZGUgPHN0YWNrPgogCiBuYW1lc3BhY2UgY2xhbmcgewpAQCAtNTc3LDQgKzU3Niw0MyBAQAogICBFWFBFQ1RfVFJVRShWaXNpdG9yLnNhd09ubHlJbXBsaWNpdExhbWJkYUNsYXNzZXMoKSk7CiB9CiAKKworCisvLyBDaGVjayB0byBlbnN1cmUgdGhhdCBhdHRyaWJ1dGVzIGFuZCBleHByZXNzaW9ucyB3aXRoaW4gdGhlbSBhcmUgYmVpbmcKKy8vIHZpc2l0ZWQuCitjbGFzcyBBdHRyVmlzaXRvciA6IHB1YmxpYyBFeHBlY3RlZExvY2F0aW9uVmlzaXRvcjxBdHRyVmlzaXRvcj4geworcHVibGljOgorICBib29sIFZpc2l0TWVtYmVyRXhwcihNZW1iZXJFeHByICpNRSkgeworICAgIE1hdGNoKE1FLT5nZXRNZW1iZXJEZWNsKCktPmdldE5hbWVBc1N0cmluZygpLCBNRS0+Z2V0TG9jU3RhcnQoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCBWaXNpdEF0dHIoQXR0ciAqQSkgeworICAgIE1hdGNoKCJBdHRyIiwgQS0+Z2V0TG9jYXRpb24oKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCBWaXNpdEd1YXJkZWRCeUF0dHIoR3VhcmRlZEJ5QXR0ciAqQSkgeworICAgIE1hdGNoKCJndWFyZGVkX2J5IiwgQS0+Z2V0TG9jYXRpb24oKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKKworVEVTVChSZWN1cnNpdmVBU1RWaXNpdG9yLCBBdHRyaWJ1dGVzQXJlVmlzaXRlZCkgeworICBBdHRyVmlzaXRvciBWaXNpdG9yOworICBWaXNpdG9yLkV4cGVjdE1hdGNoKCJBdHRyIiwgNCwgMjQpOworICBWaXNpdG9yLkV4cGVjdE1hdGNoKCJndWFyZGVkX2J5IiwgNCwgMjQpOworICBWaXNpdG9yLkV4cGVjdE1hdGNoKCJtdTEiLCAgNCwgMzUpOworICBWaXNpdG9yLkV4cGVjdE1hdGNoKCJBdHRyIiwgNSwgMjkpOworICBWaXNpdG9yLkV4cGVjdE1hdGNoKCJtdTEiLCAgNSwgNTQpOworICBWaXNpdG9yLkV4cGVjdE1hdGNoKCJtdTIiLCAgNSwgNTkpOworICBFWFBFQ1RfVFJVRShWaXNpdG9yLnJ1bk92ZXIoCisgICAgImNsYXNzIEZvbyB7XG4iCisgICAgIiAgaW50IG11MTtcbiIKKyAgICAiICBpbnQgbXUyO1xuIgorICAgICIgIGludCBhIF9fYXR0cmlidXRlX18oKGd1YXJkZWRfYnkobXUxKSkpO1xuIgorICAgICIgIHZvaWQgYmFyKCkgX19hdHRyaWJ1dGVfXygoZXhjbHVzaXZlX2xvY2tzX3JlcXVpcmVkKG11MSwgbXUyKSkpO1xuIgorICAgICJ9O1xuIikpOworfQorCisKIH0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL1Rvb2xpbmcvUmVmYWN0b3JpbmdDYWxsYmFja3NUZXN0LmNwcCBiL3VuaXR0ZXN0cy9Ub29saW5nL1JlZmFjdG9yaW5nQ2FsbGJhY2tzVGVzdC5jcHAKaW5kZXggOWUwODZkOC4uYzJiMzMxYyAxMDA2NDQKLS0tIGEvdW5pdHRlc3RzL1Rvb2xpbmcvUmVmYWN0b3JpbmdDYWxsYmFja3NUZXN0LmNwcAorKysgYi91bml0dGVzdHMvVG9vbGluZy9SZWZhY3RvcmluZ0NhbGxiYWNrc1Rlc3QuY3BwCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICBSZWZhY3RvcmluZ0NhbGxiYWNrICZDYWxsYmFjaykgewogICBNYXRjaEZpbmRlciBGaW5kZXI7CiAgIEZpbmRlci5hZGRNYXRjaGVyKEFNYXRjaGVyLCAmQ2FsbGJhY2spOwotICBPd25pbmdQdHI8dG9vbGluZzo6RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiBGYWN0b3J5KAorICBzdGQ6OnVuaXF1ZV9wdHI8dG9vbGluZzo6RnJvbnRlbmRBY3Rpb25GYWN0b3J5PiBGYWN0b3J5KAogICAgICAgdG9vbGluZzo6bmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5KCZGaW5kZXIpKTsKICAgQVNTRVJUX1RSVUUodG9vbGluZzo6cnVuVG9vbE9uQ29kZShGYWN0b3J5LT5jcmVhdGUoKSwgQ29kZSkpCiAgICAgICA8PCAiUGFyc2luZyBlcnJvciBpbiBcIiIgPDwgQ29kZSA8PCAiXCIiOwpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL1Rvb2xpbmcvVG9vbGluZ1Rlc3QuY3BwIGIvdW5pdHRlc3RzL1Rvb2xpbmcvVG9vbGluZ1Rlc3QuY3BwCmluZGV4IDJjNGE4YTcuLjFlZmY2ZDAgMTAwNjQ0Ci0tLSBhL3VuaXR0ZXN0cy9Ub29saW5nL1Rvb2xpbmdUZXN0LmNwcAorKysgYi91bml0dGVzdHMvVG9vbGluZy9Ub29saW5nVGVzdC5jcHAKQEAgLTE2LDggKzE2LDkgQEAKICNpbmNsdWRlICJjbGFuZy9Gcm9udGVuZC9Gcm9udGVuZEFjdGlvbnMuaCIKICNpbmNsdWRlICJjbGFuZy9Ub29saW5nL0NvbXBpbGF0aW9uRGF0YWJhc2UuaCIKICNpbmNsdWRlICJjbGFuZy9Ub29saW5nL1Rvb2xpbmcuaCIKLSNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgogI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2NvbmZpZy5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCiAjaW5jbHVkZSA8c3RyaW5nPgogCiBuYW1lc3BhY2UgY2xhbmcgewpAQCAtNjAsMTIgKzYxLDcgQEAKICAgYm9vbCBGb3VuZFRvcExldmVsRGVjbCA9IGZhbHNlOwogICBFWFBFQ1RfVFJVRShydW5Ub29sT25Db2RlKAogICAgICAgbmV3IFRlc3RBY3Rpb24obmV3IEZpbmRUb3BMZXZlbERlY2xDb25zdW1lcigmRm91bmRUb3BMZXZlbERlY2wpKSwgIiIpKTsKLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikKICAgRVhQRUNUX0ZBTFNFKEZvdW5kVG9wTGV2ZWxEZWNsKTsKLSNlbHNlCi0gIC8vIEZJWE1FOiBMYW5nT3B0cy5NaWNyb3NvZnRFeHQgYXBwZW5kcyAiY2xhc3MgdHlwZV9pbmZvOyIKLSAgRVhQRUNUX1RSVUUoRm91bmRUb3BMZXZlbERlY2wpOwotI2VuZGlmCiB9CiAKIG5hbWVzcGFjZSB7CkBAIC0xMTIsNyArMTA4LDcgQEAKIH0KIAogVEVTVChidWlsZEFTVEZyb21Db2RlLCBGaW5kc0NsYXNzRGVjbCkgewotICBPd25pbmdQdHI8QVNUVW5pdD4gQVNUKGJ1aWxkQVNURnJvbUNvZGUoImNsYXNzIFg7IikpOworICBzdGQ6OnVuaXF1ZV9wdHI8QVNUVW5pdD4gQVNUKGJ1aWxkQVNURnJvbUNvZGUoImNsYXNzIFg7IikpOwogICBBU1NFUlRfVFJVRShBU1QuZ2V0KCkpOwogICBFWFBFQ1RfVFJVRShGaW5kQ2xhc3NEZWNsWChBU1QuZ2V0KCkpKTsKIApAQCAtMTIyLDkgKzExOCw5IEBACiB9CiAKIFRFU1QobmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5LCBDcmVhdGVzRnJvbnRlbmRBY3Rpb25GYWN0b3J5RnJvbVR5cGUpIHsKLSAgT3duaW5nUHRyPEZyb250ZW5kQWN0aW9uRmFjdG9yeT4gRmFjdG9yeSgKKyAgc3RkOjp1bmlxdWVfcHRyPEZyb250ZW5kQWN0aW9uRmFjdG9yeT4gRmFjdG9yeSgKICAgICAgIG5ld0Zyb250ZW5kQWN0aW9uRmFjdG9yeTxTeW50YXhPbmx5QWN0aW9uPigpKTsKLSAgT3duaW5nUHRyPEZyb250ZW5kQWN0aW9uPiBBY3Rpb24oRmFjdG9yeS0+Y3JlYXRlKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb24+IEFjdGlvbihGYWN0b3J5LT5jcmVhdGUoKSk7CiAgIEVYUEVDVF9UUlVFKEFjdGlvbi5nZXQoKSAhPSBOVUxMKTsKIH0KIApAQCAtMTM2LDkgKzEzMiw5IEBACiAKIFRFU1QobmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5LCBDcmVhdGVzRnJvbnRlbmRBY3Rpb25GYWN0b3J5RnJvbUZhY3RvcnlUeXBlKSB7CiAgIEluZGVwZW5kZW50RnJvbnRlbmRBY3Rpb25DcmVhdG9yIENyZWF0b3I7Ci0gIE93bmluZ1B0cjxGcm9udGVuZEFjdGlvbkZhY3Rvcnk+IEZhY3RvcnkoCisgIHN0ZDo6dW5pcXVlX3B0cjxGcm9udGVuZEFjdGlvbkZhY3Rvcnk+IEZhY3RvcnkoCiAgICAgICBuZXdGcm9udGVuZEFjdGlvbkZhY3RvcnkoJkNyZWF0b3IpKTsKLSAgT3duaW5nUHRyPEZyb250ZW5kQWN0aW9uPiBBY3Rpb24oRmFjdG9yeS0+Y3JlYXRlKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8RnJvbnRlbmRBY3Rpb24+IEFjdGlvbihGYWN0b3J5LT5jcmVhdGUoKSk7CiAgIEVYUEVDVF9UUlVFKEFjdGlvbi5nZXQoKSAhPSBOVUxMKTsKIH0KIApAQCAtMTgyLDcgKzE3OCw3IEBACiBzdHJ1Y3QgVmVyaWZ5RW5kQ2FsbGJhY2sgOiBwdWJsaWMgU291cmNlRmlsZUNhbGxiYWNrcyB7CiAgIFZlcmlmeUVuZENhbGxiYWNrKCkgOiBCZWdpbkNhbGxlZCgwKSwgRW5kQ2FsbGVkKDApLCBNYXRjaGVkKGZhbHNlKSB7fQogICB2aXJ0dWFsIGJvb2wgaGFuZGxlQmVnaW5Tb3VyY2UoQ29tcGlsZXJJbnN0YW5jZSAmQ0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZW5hbWUpIExMVk1fT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVuYW1lKSBvdmVycmlkZSB7CiAgICAgKytCZWdpbkNhbGxlZDsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtMTk3LDcgKzE5Myw3IEBACiAgIGJvb2wgTWF0Y2hlZDsKIH07CiAKLSNpZiAhZGVmaW5lZChfV0lOMzIpCisjaWYgIWRlZmluZWQoTExWTV9PTl9XSU4zMikKIFRFU1QobmV3RnJvbnRlbmRBY3Rpb25GYWN0b3J5LCBJbmplY3RzU291cmNlRmlsZUNhbGxiYWNrcykgewogICBWZXJpZnlFbmRDYWxsYmFjayBFbmRDYWxsYmFjazsKIApAQCAtMjQxLDYgKzIzNywyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50IHNraXBNZU5vdCgpIHsgYW5fZXJyb3JfaGVyZSB9IikpOwogfQogCitURVNUKHJ1blRvb2xPbkNvZGVXaXRoQXJncywgVGVzdE5vRGVwRmlsZSkgeworICBsbHZtOjpTbWFsbFN0cmluZzwzMj4gRGVwRmlsZVBhdGg7CisgIEFTU0VSVF9GQUxTRSgKKyAgICAgIGxsdm06OnN5czo6ZnM6OmNyZWF0ZVRlbXBvcmFyeUZpbGUoImRlcGZpbGUiLCAiZCIsIERlcEZpbGVQYXRoKSk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcmdzOworICBBcmdzLnB1c2hfYmFjaygiLU1NRCIpOworICBBcmdzLnB1c2hfYmFjaygiLU1UIik7CisgIEFyZ3MucHVzaF9iYWNrKERlcEZpbGVQYXRoLnN0cigpKTsKKyAgQXJncy5wdXNoX2JhY2soIi1NRiIpOworICBBcmdzLnB1c2hfYmFjayhEZXBGaWxlUGF0aC5zdHIoKSk7CisgIEVYUEVDVF9UUlVFKHJ1blRvb2xPbkNvZGVXaXRoQXJncyhuZXcgU2tpcEJvZHlBY3Rpb24sICIiLCBBcmdzKSk7CisgIEVYUEVDVF9GQUxTRShsbHZtOjpzeXM6OmZzOjpleGlzdHMoRGVwRmlsZVBhdGguc3RyKCkpKTsKKyAgRVhQRUNUX0ZBTFNFKGxsdm06OnN5czo6ZnM6OnJlbW92ZShEZXBGaWxlUGF0aC5zdHIoKSkpOworfQorCiBzdHJ1Y3QgQ2hlY2tTeW50YXhPbmx5QWRqdXN0ZXI6IHB1YmxpYyBBcmd1bWVudHNBZGp1c3RlciB7CiAgIGJvb2wgJkZvdW5kOwogICBib29sICZSYW47CkBAIC0yNDgsNyArMjU5LDcgQEAKICAgQ2hlY2tTeW50YXhPbmx5QWRqdXN0ZXIoYm9vbCAmRm91bmQsIGJvb2wgJlJhbikgOiBGb3VuZChGb3VuZCksIFJhbihSYW4pIHsgfQogCiAgIHZpcnR1YWwgQ29tbWFuZExpbmVBcmd1bWVudHMKLSAgQWRqdXN0KGNvbnN0IENvbW1hbmRMaW5lQXJndW1lbnRzICZBcmdzKSBMTFZNX09WRVJSSURFIHsKKyAgQWRqdXN0KGNvbnN0IENvbW1hbmRMaW5lQXJndW1lbnRzICZBcmdzKSBvdmVycmlkZSB7CiAgICAgUmFuID0gdHJ1ZTsKICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gQXJncy5zaXplKCk7IEkgIT0gRTsgKytJKSB7CiAgICAgICBpZiAoQXJnc1tJXSA9PSAiLWZzeW50YXgtb25seSIpIHsKQEAgLTI4Miw3ICsyOTMsNyBAQAogICBFWFBFQ1RfRkFMU0UoRm91bmQpOwogfQogCi0jaWZuZGVmIF9XSU4zMgorI2lmbmRlZiBMTFZNX09OX1dJTjMyCiBURVNUKENsYW5nVG9vbFRlc3QsIEJ1aWxkQVNUcykgewogICBGaXhlZENvbXBpbGF0aW9uRGF0YWJhc2UgQ29tcGlsYXRpb25zKCIvIiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KCkpOwogCmRpZmYgLS1naXQgYS91bml0dGVzdHMvbGliY2xhbmcvQ01ha2VMaXN0cy50eHQgYi91bml0dGVzdHMvbGliY2xhbmcvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkYzQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXR0ZXN0cy9saWJjbGFuZy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDcgQEAKK2FkZF9jbGFuZ191bml0dGVzdChsaWJjbGFuZ1Rlc3RzCisgIExpYmNsYW5nVGVzdC5jcHAKKyAgKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMobGliY2xhbmdUZXN0cworICBsaWJjbGFuZworICApCmRpZmYgLS1naXQgYS91bml0dGVzdHMvbGliY2xhbmcvTGliY2xhbmdUZXN0LmNwcCBiL3VuaXR0ZXN0cy9saWJjbGFuZy9MaWJjbGFuZ1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MTI4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi91bml0dGVzdHMvbGliY2xhbmcvTGliY2xhbmdUZXN0LmNwcApAQCAtMCwwICsxLDE4OSBAQAorLy89PT0tIHVuaXR0ZXN0cy9saWJjbGFuZy9MaWJjbGFuZ1Rlc3QuY3BwIC0tLSBsaWJjbGFuZyB0ZXN0cyAtLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImNsYW5nLWMvSW5kZXguaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCitURVNUKGxpYmNsYW5nLCBjbGFuZ19wYXJzZVRyYW5zbGF0aW9uVW5pdDJfSW52YWxpZEFyZ3MpIHsKKyAgRVhQRUNUX0VRKENYRXJyb3JfSW52YWxpZEFyZ3VtZW50cywKKyAgICAgICAgICAgIGNsYW5nX3BhcnNlVHJhbnNsYXRpb25Vbml0MigwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSk7Cit9CisKK1RFU1QobGliY2xhbmcsIGNsYW5nX2NyZWF0ZVRyYW5zbGF0aW9uVW5pdF9JbnZhbGlkQXJncykgeworICBFWFBFQ1RfRVEoMCwgY2xhbmdfY3JlYXRlVHJhbnNsYXRpb25Vbml0KDAsIDApKTsKK30KKworVEVTVChsaWJjbGFuZywgY2xhbmdfY3JlYXRlVHJhbnNsYXRpb25Vbml0Ml9JbnZhbGlkQXJncykgeworICBFWFBFQ1RfRVEoQ1hFcnJvcl9JbnZhbGlkQXJndW1lbnRzLAorICAgICAgICAgICAgY2xhbmdfY3JlYXRlVHJhbnNsYXRpb25Vbml0MigwLCAwLCAwKSk7CisKKyAgQ1hUcmFuc2xhdGlvblVuaXQgVFUgPSByZWludGVycHJldF9jYXN0PENYVHJhbnNsYXRpb25Vbml0PigxKTsKKyAgRVhQRUNUX0VRKENYRXJyb3JfSW52YWxpZEFyZ3VtZW50cywKKyAgICAgICAgICAgIGNsYW5nX2NyZWF0ZVRyYW5zbGF0aW9uVW5pdDIoMCwgMCwgJlRVKSk7CisgIEVYUEVDVF9FUSgwLCBUVSk7Cit9CisKK25hbWVzcGFjZSB7CitzdHJ1Y3QgVGVzdFZGTyB7CisgIGNvbnN0IGNoYXIgKkNvbnRlbnRzOworICBDWFZpcnR1YWxGaWxlT3ZlcmxheSBWRk87CisKKyAgVGVzdFZGTyhjb25zdCBjaGFyICpDb250ZW50cykgOiBDb250ZW50cyhDb250ZW50cykgeworICAgIFZGTyA9IGNsYW5nX1ZpcnR1YWxGaWxlT3ZlcmxheV9jcmVhdGUoMCk7CisgIH0KKworICB2b2lkIG1hcChjb25zdCBjaGFyICpWUGF0aCwgY29uc3QgY2hhciAqUlBhdGgpIHsKKyAgICBDWEVycm9yQ29kZSBFcnIgPSBjbGFuZ19WaXJ0dWFsRmlsZU92ZXJsYXlfYWRkRmlsZU1hcHBpbmcoVkZPLCBWUGF0aCwgUlBhdGgpOworICAgIEVYUEVDVF9FUShFcnIsIENYRXJyb3JfU3VjY2Vzcyk7CisgIH0KKworICB2b2lkIG1hcEVycm9yKGNvbnN0IGNoYXIgKlZQYXRoLCBjb25zdCBjaGFyICpSUGF0aCwgQ1hFcnJvckNvZGUgRXhwRXJyKSB7CisgICAgQ1hFcnJvckNvZGUgRXJyID0gY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X2FkZEZpbGVNYXBwaW5nKFZGTywgVlBhdGgsIFJQYXRoKTsKKyAgICBFWFBFQ1RfRVEoRXJyLCBFeHBFcnIpOworICB9CisKKyAgflRlc3RWRk8oKSB7CisgICAgaWYgKCFDb250ZW50cykKKyAgICAgIHJldHVybjsKKyAgICBjaGFyICpCdWZQdHI7CisgICAgdW5zaWduZWQgQnVmU2l6ZTsKKyAgICBjbGFuZ19WaXJ0dWFsRmlsZU92ZXJsYXlfd3JpdGVUb0J1ZmZlcihWRk8sIDAsICZCdWZQdHIsICZCdWZTaXplKTsKKyAgICBzdGQ6OnN0cmluZyBCdWZTdHIoQnVmUHRyLCBCdWZTaXplKTsKKyAgICBFWFBFQ1RfU1RSRVEoQ29udGVudHMsIEJ1ZlN0ci5jX3N0cigpKTsKKyAgICBmcmVlKEJ1ZlB0cik7CisgICAgY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X2Rpc3Bvc2UoVkZPKTsKKyAgfQorfTsKK30KKworVEVTVChsaWJjbGFuZywgVmlydHVhbEZpbGVPdmVybGF5KSB7CisgIHsKKyAgICBjb25zdCBjaGFyICpjb250ZW50cyA9CisgICAgIntcbiIKKyAgICAiICAndmVyc2lvbic6IDAsXG4iCisgICAgIiAgJ3Jvb3RzJzogW1xuIgorICAgICIgICAge1xuIgorICAgICIgICAgICAndHlwZSc6ICdkaXJlY3RvcnknLFxuIgorICAgICIgICAgICAnbmFtZSc6IFwiL3BhdGgvdmlydHVhbFwiLFxuIgorICAgICIgICAgICAnY29udGVudHMnOiBbXG4iCisgICAgIiAgICAgICAge1xuIgorICAgICIgICAgICAgICAgJ3R5cGUnOiAnZmlsZScsXG4iCisgICAgIiAgICAgICAgICAnbmFtZSc6IFwiZm9vLmhcIixcbiIKKyAgICAiICAgICAgICAgICdleHRlcm5hbC1jb250ZW50cyc6IFwiL3JlYWwvZm9vLmhcIlxuIgorICAgICIgICAgICAgIH1cbiIKKyAgICAiICAgICAgXVxuIgorICAgICIgICAgfVxuIgorICAgICIgIF1cbiIKKyAgICAifVxuIjsKKyAgICBUZXN0VkZPIFQoY29udGVudHMpOworICAgIFQubWFwKCIvcGF0aC92aXJ0dWFsL2Zvby5oIiwgIi9yZWFsL2Zvby5oIik7CisgIH0KKyAgeworICAgIFRlc3RWRk8gVChOVUxMKTsKKyAgICBULm1hcEVycm9yKCIvcGF0aC8uL3ZpcnR1YWwvLi4vZm9vLmgiLCAiL3JlYWwvZm9vLmgiLAorICAgICAgICAgICAgICAgQ1hFcnJvcl9JbnZhbGlkQXJndW1lbnRzKTsKKyAgfQorICB7CisgICAgY29uc3QgY2hhciAqY29udGVudHMgPQorICAgICJ7XG4iCisgICAgIiAgJ3ZlcnNpb24nOiAwLFxuIgorICAgICIgICdyb290cyc6IFtcbiIKKyAgICAiICAgIHtcbiIKKyAgICAiICAgICAgJ3R5cGUnOiAnZGlyZWN0b3J5JyxcbiIKKyAgICAiICAgICAgJ25hbWUnOiBcIi9hbm90aGVyL2RpclwiLFxuIgorICAgICIgICAgICAnY29udGVudHMnOiBbXG4iCisgICAgIiAgICAgICAge1xuIgorICAgICIgICAgICAgICAgJ3R5cGUnOiAnZmlsZScsXG4iCisgICAgIiAgICAgICAgICAnbmFtZSc6IFwiZm9vMi5oXCIsXG4iCisgICAgIiAgICAgICAgICAnZXh0ZXJuYWwtY29udGVudHMnOiBcIi9yZWFsL2ZvbzIuaFwiXG4iCisgICAgIiAgICAgICAgfVxuIgorICAgICIgICAgICBdXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAge1xuIgorICAgICIgICAgICAndHlwZSc6ICdkaXJlY3RvcnknLFxuIgorICAgICIgICAgICAnbmFtZSc6IFwiL3BhdGgvdmlydHVhbC9kaXJcIixcbiIKKyAgICAiICAgICAgJ2NvbnRlbnRzJzogW1xuIgorICAgICIgICAgICAgIHtcbiIKKyAgICAiICAgICAgICAgICd0eXBlJzogJ2ZpbGUnLFxuIgorICAgICIgICAgICAgICAgJ25hbWUnOiBcImZvbzEuaFwiLFxuIgorICAgICIgICAgICAgICAgJ2V4dGVybmFsLWNvbnRlbnRzJzogXCIvcmVhbC9mb28xLmhcIlxuIgorICAgICIgICAgICAgIH0sXG4iCisgICAgIiAgICAgICAge1xuIgorICAgICIgICAgICAgICAgJ3R5cGUnOiAnZmlsZScsXG4iCisgICAgIiAgICAgICAgICAnbmFtZSc6IFwiZm9vMy5oXCIsXG4iCisgICAgIiAgICAgICAgICAnZXh0ZXJuYWwtY29udGVudHMnOiBcIi9yZWFsL2ZvbzMuaFwiXG4iCisgICAgIiAgICAgICAgfSxcbiIKKyAgICAiICAgICAgICB7XG4iCisgICAgIiAgICAgICAgICAndHlwZSc6ICdkaXJlY3RvcnknLFxuIgorICAgICIgICAgICAgICAgJ25hbWUnOiBcImluL3N1YmRpclwiLFxuIgorICAgICIgICAgICAgICAgJ2NvbnRlbnRzJzogW1xuIgorICAgICIgICAgICAgICAgICB7XG4iCisgICAgIiAgICAgICAgICAgICAgJ3R5cGUnOiAnZmlsZScsXG4iCisgICAgIiAgICAgICAgICAgICAgJ25hbWUnOiBcImZvbzQuaFwiLFxuIgorICAgICIgICAgICAgICAgICAgICdleHRlcm5hbC1jb250ZW50cyc6IFwiL3JlYWwvZm9vNC5oXCJcbiIKKyAgICAiICAgICAgICAgICAgfVxuIgorICAgICIgICAgICAgICAgXVxuIgorICAgICIgICAgICAgIH1cbiIKKyAgICAiICAgICAgXVxuIgorICAgICIgICAgfVxuIgorICAgICIgIF1cbiIKKyAgICAifVxuIjsKKyAgICBUZXN0VkZPIFQoY29udGVudHMpOworICAgIFQubWFwKCIvcGF0aC92aXJ0dWFsL2Rpci9mb28xLmgiLCAiL3JlYWwvZm9vMS5oIik7CisgICAgVC5tYXAoIi9hbm90aGVyL2Rpci9mb28yLmgiLCAiL3JlYWwvZm9vMi5oIik7CisgICAgVC5tYXAoIi9wYXRoL3ZpcnR1YWwvZGlyL2ZvbzMuaCIsICIvcmVhbC9mb28zLmgiKTsKKyAgICBULm1hcCgiL3BhdGgvdmlydHVhbC9kaXIvaW4vc3ViZGlyL2ZvbzQuaCIsICIvcmVhbC9mb280LmgiKTsKKyAgfQorICB7CisgICAgY29uc3QgY2hhciAqY29udGVudHMgPQorICAgICJ7XG4iCisgICAgIiAgJ3ZlcnNpb24nOiAwLFxuIgorICAgICIgICdjYXNlLXNlbnNpdGl2ZSc6ICdmYWxzZScsXG4iCisgICAgIiAgJ3Jvb3RzJzogW1xuIgorICAgICIgICAge1xuIgorICAgICIgICAgICAndHlwZSc6ICdkaXJlY3RvcnknLFxuIgorICAgICIgICAgICAnbmFtZSc6IFwiL3BhdGgvdmlydHVhbFwiLFxuIgorICAgICIgICAgICAnY29udGVudHMnOiBbXG4iCisgICAgIiAgICAgICAge1xuIgorICAgICIgICAgICAgICAgJ3R5cGUnOiAnZmlsZScsXG4iCisgICAgIiAgICAgICAgICAnbmFtZSc6IFwiZm9vLmhcIixcbiIKKyAgICAiICAgICAgICAgICdleHRlcm5hbC1jb250ZW50cyc6IFwiL3JlYWwvZm9vLmhcIlxuIgorICAgICIgICAgICAgIH1cbiIKKyAgICAiICAgICAgXVxuIgorICAgICIgICAgfVxuIgorICAgICIgIF1cbiIKKyAgICAifVxuIjsKKyAgICBUZXN0VkZPIFQoY29udGVudHMpOworICAgIFQubWFwKCIvcGF0aC92aXJ0dWFsL2Zvby5oIiwgIi9yZWFsL2Zvby5oIik7CisgICAgY2xhbmdfVmlydHVhbEZpbGVPdmVybGF5X3NldENhc2VTZW5zaXRpdml0eShULlZGTywgZmFsc2UpOworICB9Cit9CisKK1RFU1QobGliY2xhbmcsIE1vZHVsZU1hcERlc2NyaXB0b3IpIHsKKyAgY29uc3QgY2hhciAqQ29udGVudHMgPQorICAgICJmcmFtZXdvcmsgbW9kdWxlIFRlc3RGcmFtZSB7XG4iCisgICAgIiAgdW1icmVsbGEgaGVhZGVyIFwiVGVzdEZyYW1lLmhcIlxuIgorICAgICJcbiIKKyAgICAiICBleHBvcnQgKlxuIgorICAgICIgIG1vZHVsZSAqIHsgZXhwb3J0ICogfVxuIgorICAgICJ9XG4iOworCisgIENYTW9kdWxlTWFwRGVzY3JpcHRvciBNTUQgPSBjbGFuZ19Nb2R1bGVNYXBEZXNjcmlwdG9yX2NyZWF0ZSgwKTsKKworICBjbGFuZ19Nb2R1bGVNYXBEZXNjcmlwdG9yX3NldEZyYW1ld29ya01vZHVsZU5hbWUoTU1ELCAiVGVzdEZyYW1lIik7CisgIGNsYW5nX01vZHVsZU1hcERlc2NyaXB0b3Jfc2V0VW1icmVsbGFIZWFkZXIoTU1ELCAiVGVzdEZyYW1lLmgiKTsKKworICBjaGFyICpCdWZQdHI7CisgIHVuc2lnbmVkIEJ1ZlNpemU7CisgIGNsYW5nX01vZHVsZU1hcERlc2NyaXB0b3Jfd3JpdGVUb0J1ZmZlcihNTUQsIDAsICZCdWZQdHIsICZCdWZTaXplKTsKKyAgc3RkOjpzdHJpbmcgQnVmU3RyKEJ1ZlB0ciwgQnVmU2l6ZSk7CisgIEVYUEVDVF9TVFJFUShDb250ZW50cywgQnVmU3RyLmNfc3RyKCkpOworICBmcmVlKEJ1ZlB0cik7CisgIGNsYW5nX01vZHVsZU1hcERlc2NyaXB0b3JfZGlzcG9zZShNTUQpOworfQpkaWZmIC0tZ2l0IGEvdW5pdHRlc3RzL2xpYmNsYW5nL01ha2VmaWxlIGIvdW5pdHRlc3RzL2xpYmNsYW5nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMTRjODIKLS0tIC9kZXYvbnVsbAorKysgYi91bml0dGVzdHMvbGliY2xhbmcvTWFrZWZpbGUKQEAgLTAsMCArMSwyNyBAQAorIyM9PT0tIHVuaXR0ZXN0cy9saWJjbGFuZy9NYWtlZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gTWFrZWZpbGUgLSotPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyMgTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKworQ0xBTkdfTEVWRUwgPSAuLi8uLgorVEVTVE5BTUUgPSBsaWJjbGFuZworTElOS19MSUJTX0lOX1NIQVJFRCA6PSAxCisKK2luY2x1ZGUgJChDTEFOR19MRVZFTCkvLi4vLi4vTWFrZWZpbGUuY29uZmlnCitMSU5LX0NPTVBPTkVOVFMgOj0gJChUQVJHRVRTX1RPX0JVSUxEKSBhc21wYXJzZXIgYml0cmVhZGVyIHN1cHBvcnQgbWMgb3B0aW9uCisKKyMgTm90ZSB0aGF0ICdVU0VETElCUycgbXVzdCBpbmNsdWRlIGFsbCBvZiB0aGUgY29yZSBjbGFuZyBsaWJyYXJpZXMKKyMgd2hlbiAtc3RhdGljIGlzIGdpdmVuIHRvIGxpbmtlciBvbiBjeWdtaW5nLgorVVNFRExJQlMgPSBjbGFuZy5hIFwKKwkgICBjbGFuZ0luZGV4LmEgY2xhbmdGb3JtYXQuYSBjbGFuZ1Jld3JpdGVDb3JlLmEgXAorCSAgIGNsYW5nRnJvbnRlbmQuYSBjbGFuZ0RyaXZlci5hIFwKKwkgICBjbGFuZ1Rvb2xpbmcuYSBcCisJICAgY2xhbmdTZXJpYWxpemF0aW9uLmEgY2xhbmdQYXJzZS5hIGNsYW5nU2VtYS5hIFwKKwkgICBjbGFuZ0FuYWx5c2lzLmEgY2xhbmdFZGl0LmEgY2xhbmdBU1QuYSBjbGFuZ0xleC5hIFwKKwkgICBjbGFuZ0Jhc2ljLmEKKworaW5jbHVkZSAkKENMQU5HX0xFVkVMKS91bml0dGVzdHMvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL3V0aWxzL1RhYmxlR2VuL0NsYW5nQXR0ckVtaXR0ZXIuY3BwIGIvdXRpbHMvVGFibGVHZW4vQ2xhbmdBdHRyRW1pdHRlci5jcHAKaW5kZXggNjUzZDdiNy4uZTAzYWZlNCAxMDA2NDQKLS0tIGEvdXRpbHMvVGFibGVHZW4vQ2xhbmdBdHRyRW1pdHRlci5jcHAKKysrIGIvdXRpbHMvVGFibGVHZW4vQ2xhbmdBdHRyRW1pdHRlci5jcHAKQEAgLTEyLDM1ICsxMiw2MyBAQAogLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KIAogI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCi0jaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCiAjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTd2l0Y2guaCIKKyNpbmNsdWRlICJsbHZtL1RhYmxlR2VuL0Vycm9yLmgiCiAjaW5jbHVkZSAibGx2bS9UYWJsZUdlbi9SZWNvcmQuaCIKICNpbmNsdWRlICJsbHZtL1RhYmxlR2VuL1N0cmluZ01hdGNoZXIuaCIKICNpbmNsdWRlICJsbHZtL1RhYmxlR2VuL1RhYmxlR2VuQmFja2VuZC5oIgogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgogCiB1c2luZyBuYW1lc3BhY2UgbGx2bTsKIAotc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4KLWdldFZhbHVlQXNMaXN0T2ZTdHJpbmdzKFJlY29yZCAmUiwgU3RyaW5nUmVmIEZpZWxkTmFtZSkgewotICBMaXN0SW5pdCAqTGlzdCA9IFIuZ2V0VmFsdWVBc0xpc3RJbml0KEZpZWxkTmFtZSk7Ci0gIGFzc2VydCAoTGlzdCAmJiAiR290IGEgbnVsbCBMaXN0SW5pdCIpOworY2xhc3MgRmxhdHRlbmVkU3BlbGxpbmcgeworICBzdGQ6OnN0cmluZyBWLCBOLCBOUzsKKyAgYm9vbCBLOwogCi0gIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gU3RyaW5nczsKLSAgU3RyaW5ncy5yZXNlcnZlKExpc3QtPmdldFNpemUoKSk7CitwdWJsaWM6CisgIEZsYXR0ZW5lZFNwZWxsaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZWYXJpZXR5LCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWVzcGFjZSwgYm9vbCBLbm93blRvR0NDKSA6CisgICAgVihWYXJpZXR5KSwgTihOYW1lKSwgTlMoTmFtZXNwYWNlKSwgSyhLbm93blRvR0NDKSB7fQorICBleHBsaWNpdCBGbGF0dGVuZWRTcGVsbGluZyhjb25zdCBSZWNvcmQgJlNwZWxsaW5nKSA6CisgICAgVihTcGVsbGluZy5nZXRWYWx1ZUFzU3RyaW5nKCJWYXJpZXR5IikpLAorICAgIE4oU3BlbGxpbmcuZ2V0VmFsdWVBc1N0cmluZygiTmFtZSIpKSB7CiAKLSAgZm9yIChMaXN0SW5pdDo6Y29uc3RfaXRlcmF0b3IgaSA9IExpc3QtPmJlZ2luKCksIGUgPSBMaXN0LT5lbmQoKTsKLSAgICAgICBpICE9IGU7Ci0gICAgICAgKytpKSB7Ci0gICAgYXNzZXJ0KCppICYmICJHb3QgYSBudWxsIGVsZW1lbnQgaW4gYSBMaXN0SW5pdCIpOwotICAgIGlmIChTdHJpbmdJbml0ICpTID0gZHluX2Nhc3Q8U3RyaW5nSW5pdD4oKmkpKQotICAgICAgU3RyaW5ncy5wdXNoX2JhY2soUy0+Z2V0VmFsdWUoKSk7Ci0gICAgZWxzZQotICAgICAgYXNzZXJ0KGZhbHNlICYmICJHb3QgYSBub24tc3RyaW5nLCBub24tY29kZSBlbGVtZW50IGluIGEgTGlzdEluaXQiKTsKKyAgICBhc3NlcnQoViAhPSAiR0NDIiAmJiAiR2l2ZW4gYSBHQ0Mgc3BlbGxpbmcsIHdoaWNoIG1lYW5zIHRoaXMgaGFzbid0IGJlZW4iCisgICAgICAgICAgICJmbGF0dGVuZWQhIik7CisgICAgaWYgKFYgPT0gIkNYWDExIikKKyAgICAgIE5TID0gU3BlbGxpbmcuZ2V0VmFsdWVBc1N0cmluZygiTmFtZXNwYWNlIik7CisgICAgYm9vbCBVbnNldDsKKyAgICBLID0gU3BlbGxpbmcuZ2V0VmFsdWVBc0JpdE9yVW5zZXQoIktub3duVG9HQ0MiLCBVbnNldCk7CiAgIH0KIAotICByZXR1cm4gU3RyaW5nczsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJnZhcmlldHkoKSBjb25zdCB7IHJldHVybiBWOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKCkgY29uc3QgeyByZXR1cm4gTjsgfQorICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZVNwYWNlKCkgY29uc3QgeyByZXR1cm4gTlM7IH0KKyAgYm9vbCBrbm93blRvR0NDKCkgY29uc3QgeyByZXR1cm4gSzsgfQorfTsKKworc3RkOjp2ZWN0b3I8RmxhdHRlbmVkU3BlbGxpbmc+IEdldEZsYXR0ZW5lZFNwZWxsaW5ncyhjb25zdCBSZWNvcmQgJkF0dHIpIHsKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkICo+IFNwZWxsaW5ncyA9IEF0dHIuZ2V0VmFsdWVBc0xpc3RPZkRlZnMoIlNwZWxsaW5ncyIpOworICBzdGQ6OnZlY3RvcjxGbGF0dGVuZWRTcGVsbGluZz4gUmV0OworCisgIGZvciAoY29uc3QgYXV0byAmU3BlbGxpbmcgOiBTcGVsbGluZ3MpIHsKKyAgICBpZiAoU3BlbGxpbmctPmdldFZhbHVlQXNTdHJpbmcoIlZhcmlldHkiKSA9PSAiR0NDIikgeworICAgICAgLy8gR2luIHVwIHR3byBuZXcgc3BlbGxpbmcgb2JqZWN0cyB0byBhZGQgaW50byB0aGUgbGlzdC4KKyAgICAgIFJldC5wdXNoX2JhY2soRmxhdHRlbmVkU3BlbGxpbmcoIkdOVSIsIFNwZWxsaW5nLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCB0cnVlKSk7CisgICAgICBSZXQucHVzaF9iYWNrKEZsYXR0ZW5lZFNwZWxsaW5nKAorICAgICAgICAgICJDWFgxMSIsIFNwZWxsaW5nLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIiksICJnbnUiLCB0cnVlKSk7CisgICAgfSBlbHNlCisgICAgICBSZXQucHVzaF9iYWNrKEZsYXR0ZW5lZFNwZWxsaW5nKCpTcGVsbGluZykpOworICB9CisKKyAgcmV0dXJuIFJldDsKIH0KIAogc3RhdGljIHN0ZDo6c3RyaW5nIFJlYWRQQ0hSZWNvcmQoU3RyaW5nUmVmIHR5cGUpIHsKQEAgLTUwLDcgKzc4LDYgQEAKICAgICAuQ2FzZSgiVHlwZVNvdXJjZUluZm8gKiIsICJHZXRUeXBlU291cmNlSW5mbyhGLCBSZWNvcmQsIElkeCkiKQogICAgIC5DYXNlKCJFeHByICoiLCAiUmVhZEV4cHIoRikiKQogICAgIC5DYXNlKCJJZGVudGlmaWVySW5mbyAqIiwgIkdldElkZW50aWZpZXJJbmZvKEYsIFJlY29yZCwgSWR4KSIpCi0gICAgLkNhc2UoIlNvdXJjZUxvY2F0aW9uIiwgIlJlYWRTb3VyY2VMb2NhdGlvbihGLCBSZWNvcmQsIElkeCkiKQogICAgIC5EZWZhdWx0KCJSZWNvcmRbSWR4KytdIik7CiB9CiAKQEAgLTY0LDggKzkxLDYgQEAKICAgICAuQ2FzZSgiRXhwciAqIiwgIkFkZFN0bXQoIiArIHN0ZDo6c3RyaW5nKG5hbWUpICsgIik7XG4iKQogICAgIC5DYXNlKCJJZGVudGlmaWVySW5mbyAqIiwgCiAgICAgICAgICAgIkFkZElkZW50aWZpZXJSZWYoIiArIHN0ZDo6c3RyaW5nKG5hbWUpICsgIiwgUmVjb3JkKTtcbiIpCi0gICAgLkNhc2UoIlNvdXJjZUxvY2F0aW9uIiwgCi0gICAgICAgICAgIkFkZFNvdXJjZUxvY2F0aW9uKCIgKyBzdGQ6OnN0cmluZyhuYW1lKSArICIsIFJlY29yZCk7XG4iKQogICAgIC5EZWZhdWx0KCJSZWNvcmQucHVzaF9iYWNrKCIgKyBzdGQ6OnN0cmluZyhuYW1lKSArICIpO1xuIik7CiB9CiAKQEAgLTgyLDYgKzEwNywxNyBAQAogICByZXR1cm4gQXR0ck5hbWU7CiB9CiAKKy8vIE5vcm1hbGl6ZSB0aGUgbmFtZSBieSByZW1vdmluZyBhbnkgYW5kIGFsbCBsZWFkaW5nIGFuZCB0cmFpbGluZyB1bmRlcnNjb3Jlcy4KKy8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gTm9ybWFsaXplQXR0ck5hbWUgaW4gdGhhdCBpdCBhbHNvIGhhbmRsZXMgbmFtZXMgbGlrZQorLy8gX3Bhc2NhbCBhbmQgX19wYXNjYWwuCitzdGF0aWMgU3RyaW5nUmVmIE5vcm1hbGl6ZU5hbWVGb3JTcGVsbGluZ0NvbXBhcmlzb24oU3RyaW5nUmVmIE5hbWUpIHsKKyAgd2hpbGUgKE5hbWUuc3RhcnRzd2l0aCgiXyIpKQorICAgIE5hbWUgPSBOYW1lLnN1YnN0cigxLCBOYW1lLnNpemUoKSk7CisgIHdoaWxlIChOYW1lLmVuZHN3aXRoKCJfIikpCisgICAgTmFtZSA9IE5hbWUuc3Vic3RyKDAsIE5hbWUuc2l6ZSgpIC0gMSk7CisgIHJldHVybiBOYW1lOworfQorCiAvLyBOb3JtYWxpemUgYXR0cmlidXRlIHNwZWxsaW5nIG9ubHkgaWYgdGhlIHNwZWxsaW5nIGhhcyBib3RoIGxlYWRpbmcKIC8vIGFuZCB0cmFpbGluZyB1bmRlcnNjb3Jlcy4gRm9yIGV4YW1wbGUsIF9fbXNfc3RydWN0X18gd2lsbCBiZSAKIC8vIG5vcm1hbGl6ZWQgdG8gIm1zX3N0cnVjdCI7IF9fY2RlY2wgd2lsbCByZW1haW4gaW50YWN0LgpAQCAtOTMsNiArMTI5LDM3IEBACiAgIHJldHVybiBBdHRyU3BlbGxpbmc7CiB9CiAKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBSZWNvcmQgKj4+IFBhcnNlZEF0dHJNYXA7CisKK3N0YXRpYyBQYXJzZWRBdHRyTWFwIGdldFBhcnNlZEF0dHJMaXN0KGNvbnN0IFJlY29yZEtlZXBlciAmUmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZEF0dHJNYXAgKkR1cGVzID0gMCkgeworICBzdGQ6OnZlY3RvcjxSZWNvcmQgKj4gQXR0cnMgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiQXR0ciIpOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gU2VlbjsKKyAgUGFyc2VkQXR0ck1hcCBSOworICBmb3IgKGF1dG8gQXR0ciA6IEF0dHJzKSB7CisgICAgaWYgKEF0dHItPmdldFZhbHVlQXNCaXQoIlNlbWFIYW5kbGVyIikpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIEFOOworICAgICAgaWYgKEF0dHItPmlzU3ViQ2xhc3NPZigiVGFyZ2V0U3BlY2lmaWNBdHRyIikgJiYKKyAgICAgICAgICAhQXR0ci0+aXNWYWx1ZVVuc2V0KCJQYXJzZUtpbmQiKSkgeworICAgICAgICBBTiA9IEF0dHItPmdldFZhbHVlQXNTdHJpbmcoIlBhcnNlS2luZCIpOworCisgICAgICAgIC8vIElmIHRoaXMgYXR0cmlidXRlIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCwgaXQgZG9lcyBub3QgbmVlZCB0byBiZQorICAgICAgICAvLyBoYW5kbGVkIGFnYWluLgorICAgICAgICBpZiAoU2Vlbi5maW5kKEFOKSAhPSBTZWVuLmVuZCgpKSB7CisgICAgICAgICAgaWYgKER1cGVzKQorICAgICAgICAgICAgRHVwZXMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihBTiwgQXR0cikpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFNlZW4uaW5zZXJ0KEFOKTsKKyAgICAgIH0gZWxzZQorICAgICAgICBBTiA9IE5vcm1hbGl6ZUF0dHJOYW1lKEF0dHItPmdldE5hbWUoKSkuc3RyKCk7CisKKyAgICAgIFIucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEFOLCBBdHRyKSk7CisgICAgfQorICB9CisgIHJldHVybiBSOworfQorCiBuYW1lc3BhY2UgewogICBjbGFzcyBBcmd1bWVudCB7CiAgICAgc3RkOjpzdHJpbmcgbG93ZXJOYW1lLCB1cHBlck5hbWU7CkBAIC0xMjAsNiArMTg3LDcgQEAKICAgICAvLyBUaGVzZSBmdW5jdGlvbnMgcHJpbnQgdGhlIGFyZ3VtZW50IGNvbnRlbnRzIGZvcm1hdHRlZCBpbiBkaWZmZXJlbnQgd2F5cy4KICAgICB2aXJ0dWFsIHZvaWQgd3JpdGVBY2Nlc3NvcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHdyaXRlQWNjZXNzb3JEZWZpbml0aW9ucyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHt9CisgICAgdmlydHVhbCB2b2lkIHdyaXRlQVNUVmlzaXRvclRyYXZlcnNhbChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHt9CiAgICAgdmlydHVhbCB2b2lkIHdyaXRlQ2xvbmVBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgdm9pZCB3cml0ZVRlbXBsYXRlSW5zdGFudGlhdGlvbkFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHdyaXRlVGVtcGxhdGVJbnN0YW50aWF0aW9uKHJhd19vc3RyZWFtICZPUykgY29uc3Qge30KQEAgLTEzOCw2ICsyMDYsMTAgQEAKIAogICAgIHZpcnR1YWwgYm9vbCBpc0VudW1BcmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc1ZhcmlhZGljRW51bUFyZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVJbXBsaWNpdEN0b3JBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgICAgT1MgPDwgZ2V0VXBwZXJOYW1lKCk7CisgICAgfQogICB9OwogCiAgIGNsYXNzIFNpbXBsZUFyZ3VtZW50IDogcHVibGljIEFyZ3VtZW50IHsKQEAgLTE1MCw0MSArMjIyLDQxIEBACiAKICAgICBzdGQ6OnN0cmluZyBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZTsgfQogCi0gICAgdm9pZCB3cml0ZUFjY2Vzc29ycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQWNjZXNzb3JzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgIiA8PCB0eXBlIDw8ICIgZ2V0IiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiKCkgY29uc3Qge1xuIjsKICAgICAgIE9TIDw8ICIgICAgcmV0dXJuICIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIjtcbiI7CiAgICAgICBPUyA8PCAiICB9IjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUNsb25lQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQ2xvbmVBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgZ2V0TG93ZXJOYW1lKCk7CiAgICAgfQotICAgIHZvaWQgd3JpdGVUZW1wbGF0ZUluc3RhbnRpYXRpb25BcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVUZW1wbGF0ZUluc3RhbnRpYXRpb25BcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIkEtPmdldCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIigpIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUN0b3JJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCBnZXRMb3dlck5hbWUoKSA8PCAiKCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIikiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ3RvckRlZmF1bHRJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JEZWZhdWx0SW5pdGlhbGl6ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIigpIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUN0b3JQYXJhbWV0ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVDdG9yUGFyYW1ldGVycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8IHR5cGUgPDwgIiAiIDw8IGdldFVwcGVyTmFtZSgpOwogICAgIH0KLSAgICB2b2lkIHdyaXRlRGVjbGFyYXRpb25zKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVEZWNsYXJhdGlvbnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCB0eXBlIDw8ICIgIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiOyI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVQQ0hSZWFkRGVjbHMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZVBDSFJlYWREZWNscyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIHN0ZDo6c3RyaW5nIHJlYWQgPSBSZWFkUENIUmVjb3JkKHR5cGUpOwogICAgICAgT1MgPDwgIiAgICAiIDw8IHR5cGUgPDwgIiAiIDw8IGdldExvd2VyTmFtZSgpIDw8ICIgPSAiIDw8IHJlYWQgPDwgIjtcbiI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVQQ0hSZWFkQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlUENIUmVhZEFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCBnZXRMb3dlck5hbWUoKTsKICAgICB9Ci0gICAgdm9pZCB3cml0ZVBDSFdyaXRlKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVQQ0hXcml0ZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICIgICAgIiA8PCBXcml0ZVBDSFJlY29yZCh0eXBlLCAiU0EtPmdldCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGdldFVwcGVyTmFtZSgpKSArICIoKSIpOwogICAgIH0KLSAgICB2b2lkIHdyaXRlVmFsdWUocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZVZhbHVlKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgaWYgKHR5cGUgPT0gIkZ1bmN0aW9uRGVjbCAqIikgewogICAgICAgICBPUyA8PCAiXCIgPDwgZ2V0IiA8PCBnZXRVcHBlck5hbWUoKQogICAgICAgICAgICA8PCAiKCktPmdldE5hbWVJbmZvKCkuZ2V0QXNTdHJpbmcoKSA8PCBcIiI7CkBAIC0xOTIsMTMgKzI2NCwxMSBAQAogICAgICAgICBPUyA8PCAiXCIgPDwgZ2V0IiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiKCktPmdldE5hbWUoKSA8PCBcIiI7CiAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gIlR5cGVTb3VyY2VJbmZvICoiKSB7CiAgICAgICAgIE9TIDw8ICJcIiA8PCBnZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIoKS5nZXRBc1N0cmluZygpIDw8IFwiIjsKLSAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAiU291cmNlTG9jYXRpb24iKSB7Ci0gICAgICAgIE9TIDw8ICJcIiA8PCBnZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIoKS5nZXRSYXdFbmNvZGluZygpIDw8IFwiIjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIE9TIDw8ICJcIiA8PCBnZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIoKSA8PCBcIiI7CiAgICAgICB9CiAgICAgfQotICAgIHZvaWQgd3JpdGVEdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVEdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgaWYgKHR5cGUgPT0gIkZ1bmN0aW9uRGVjbCAqIikgewogICAgICAgICBPUyA8PCAiICAgIE9TIDw8IFwiIFwiO1xuIjsKICAgICAgICAgT1MgPDwgIiAgICBkdW1wQmFyZURlY2xSZWYoU0EtPmdldCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIigpKTtcbiI7IApAQCAtMjA4LDkgKzI3OCw2IEBACiAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gIlR5cGVTb3VyY2VJbmZvICoiKSB7CiAgICAgICAgIE9TIDw8ICIgICAgT1MgPDwgXCIgXCIgPDwgU0EtPmdldCIgPDwgZ2V0VXBwZXJOYW1lKCkKICAgICAgICAgICAgPDwgIigpLmdldEFzU3RyaW5nKCk7XG4iOwotICAgICAgfSBlbHNlIGlmICh0eXBlID09ICJTb3VyY2VMb2NhdGlvbiIpIHsKLSAgICAgICAgT1MgPDwgIiAgICBPUyA8PCBcIiBcIjtcbiI7Ci0gICAgICAgIE9TIDw8ICIgICAgU0EtPmdldCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIigpLnByaW50KE9TLCAqU00pO1xuIjsKICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAiYm9vbCIpIHsKICAgICAgICAgT1MgPDwgIiAgICBpZiAoU0EtPmdldCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIigpKSBPUyA8PCBcIiAiCiAgICAgICAgICAgIDw8IGdldFVwcGVyTmFtZSgpIDw8ICJcIjtcbiI7CkBAIC0yMjIsMTMgKzI4OSwyOSBAQAogICAgIH0KICAgfTsKIAorICBjbGFzcyBEZWZhdWx0U2ltcGxlQXJndW1lbnQgOiBwdWJsaWMgU2ltcGxlQXJndW1lbnQgeworICAgIGludDY0X3QgRGVmYXVsdDsKKworICBwdWJsaWM6CisgICAgRGVmYXVsdFNpbXBsZUFyZ3VtZW50KFJlY29yZCAmQXJnLCBTdHJpbmdSZWYgQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgVCwgaW50NjRfdCBEZWZhdWx0KQorICAgICAgOiBTaW1wbGVBcmd1bWVudChBcmcsIEF0dHIsIFQpLCBEZWZhdWx0KERlZmF1bHQpIHt9CisKKyAgICB2b2lkIHdyaXRlQWNjZXNzb3JzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgU2ltcGxlQXJndW1lbnQ6OndyaXRlQWNjZXNzb3JzKE9TKTsKKworICAgICAgT1MgPDwgIlxuXG4gIHN0YXRpYyBjb25zdCAiIDw8IGdldFR5cGUoKSA8PCAiIERlZmF1bHQiIDw8IGdldFVwcGVyTmFtZSgpCisgICAgICAgICA8PCAiID0gIiA8PCBEZWZhdWx0IDw8ICI7IjsKKyAgICB9CisgIH07CisKICAgY2xhc3MgU3RyaW5nQXJndW1lbnQgOiBwdWJsaWMgQXJndW1lbnQgewogICBwdWJsaWM6CiAgICAgU3RyaW5nQXJndW1lbnQoUmVjb3JkICZBcmcsIFN0cmluZ1JlZiBBdHRyKQogICAgICAgOiBBcmd1bWVudChBcmcsIEF0dHIpCiAgICAge30KIAotICAgIHZvaWQgd3JpdGVBY2Nlc3NvcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUFjY2Vzc29ycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICIgIGxsdm06OlN0cmluZ1JlZiBnZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIoKSBjb25zdCB7XG4iOwogICAgICAgT1MgPDwgIiAgICByZXR1cm4gbGx2bTo6U3RyaW5nUmVmKCIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIiwgIgogICAgICAgICAgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIkxlbmd0aCk7XG4iOwpAQCAtMjQ1LDQ1ICszMjgsNDUgQEAKICAgICAgICAgIDw8IGdldExvd2VyTmFtZSgpIDw8ICJMZW5ndGgpO1xuIjsKICAgICAgIE9TIDw8ICIgIH0iOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ2xvbmVBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVDbG9uZUFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiZ2V0IiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiKCkiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlVGVtcGxhdGVJbnN0YW50aWF0aW9uQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlVGVtcGxhdGVJbnN0YW50aWF0aW9uQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICJBLT5nZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIoKSI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVDdG9yQm9keShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQ3RvckJvZHkocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiICAgICAgc3RkOjptZW1jcHkoIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiLCAiIDw8IGdldFVwcGVyTmFtZSgpCiAgICAgICAgICA8PCAiLmRhdGEoKSwgIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiTGVuZ3RoKTsiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ3RvckluaXRpYWxpemVycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQ3RvckluaXRpYWxpemVycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8IGdldExvd2VyTmFtZSgpIDw8ICJMZW5ndGgoIiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiLnNpemUoKSksIgogICAgICAgICAgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIihuZXcgKEN0eCwgMSkgY2hhclsiIDw8IGdldExvd2VyTmFtZSgpCiAgICAgICAgICA8PCAiTGVuZ3RoXSkiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ3RvckRlZmF1bHRJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JEZWZhdWx0SW5pdGlhbGl6ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIkxlbmd0aCgwKSwiIDw8IGdldExvd2VyTmFtZSgpIDw8ICIoMCkiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ3RvclBhcmFtZXRlcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JQYXJhbWV0ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgImxsdm06OlN0cmluZ1JlZiAiIDw8IGdldFVwcGVyTmFtZSgpOwogICAgIH0KLSAgICB2b2lkIHdyaXRlRGVjbGFyYXRpb25zKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVEZWNsYXJhdGlvbnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAidW5zaWduZWQgIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiTGVuZ3RoO1xuIjsKICAgICAgIE9TIDw8ICJjaGFyICoiIDw8IGdldExvd2VyTmFtZSgpIDw8ICI7IjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZVBDSFJlYWREZWNscyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlUENIUmVhZERlY2xzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgICBzdGQ6OnN0cmluZyAiIDw8IGdldExvd2VyTmFtZSgpCiAgICAgICAgICA8PCAiPSBSZWFkU3RyaW5nKFJlY29yZCwgSWR4KTtcbiI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVQQ0hSZWFkQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlUENIUmVhZEFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCBnZXRMb3dlck5hbWUoKTsKICAgICB9Ci0gICAgdm9pZCB3cml0ZVBDSFdyaXRlKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVQQ0hXcml0ZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICIgICAgQWRkU3RyaW5nKFNBLT5nZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIoKSwgUmVjb3JkKTtcbiI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVWYWx1ZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlVmFsdWUocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiXFxcIlwiIDw8IGdldCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIigpIDw8IFwiXFxcIiI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVEdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVEdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgICBPUyA8PCBcIiBcXFwiXCIgPDwgU0EtPmdldCIgPDwgZ2V0VXBwZXJOYW1lKCkKICAgICAgICAgIDw8ICIoKSA8PCBcIlxcXCJcIjtcbiI7CiAgICAgfQpAQCAtMjk1LDcgKzM3OCw3IEBACiAgICAgICA6IEFyZ3VtZW50KEFyZywgQXR0cikKICAgICB7fQogCi0gICAgdm9pZCB3cml0ZUFjY2Vzc29ycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQWNjZXNzb3JzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgYm9vbCBpcyIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIkRlcGVuZGVudCgpIGNvbnN0O1xuIjsKIAogICAgICAgT1MgPDwgIiAgdW5zaWduZWQgZ2V0IiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiKEFTVENvbnRleHQgJkN0eCkgY29uc3Q7XG4iOwpAQCAtMzE0LDcgKzM5Nyw3IEBACiAgICAgICBPUyA8PCAiICAgIHJldHVybiAiIDw8IGdldExvd2VyTmFtZSgpIDw8ICJUeXBlO1xuIjsKICAgICAgIE9TIDw8ICIgIH0iOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQWNjZXNzb3JEZWZpbml0aW9ucyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQWNjZXNzb3JEZWZpbml0aW9ucyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICJib29sICIgPDwgZ2V0QXR0ck5hbWUoKSA8PCAiQXR0cjo6aXMiIDw8IGdldFVwcGVyTmFtZSgpCiAgICAgICAgICA8PCAiRGVwZW5kZW50KCkgY29uc3Qge1xuIjsKICAgICAgIE9TIDw8ICIgIGlmIChpcyIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIkV4cHIpXG4iOwpAQCAtMzQyLDE3ICs0MjUsMTcgQEAKICAgICAgIE9TIDw8ICIgICAgcmV0dXJuIDA7IC8vIEZJWE1FXG4iOwogICAgICAgT1MgPDwgIn1cbiI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVDbG9uZUFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUNsb25lQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICJpcyIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIkV4cHIsIGlzIiA8PCBnZXRMb3dlck5hbWUoKQogICAgICAgICAgPDwgIkV4cHIgPyBzdGF0aWNfY2FzdDx2b2lkKj4oIiA8PCBnZXRMb3dlck5hbWUoKQogICAgICAgICAgPDwgIkV4cHIpIDogIiA8PCBnZXRMb3dlck5hbWUoKQogICAgICAgICAgPDwgIlR5cGUiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlVGVtcGxhdGVJbnN0YW50aWF0aW9uQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlVGVtcGxhdGVJbnN0YW50aWF0aW9uQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIC8vIEZJWE1FOiBtb3ZlIHRoZSBkZWZpbml0aW9uIGluIFNlbWE6Okluc3RhbnRpYXRlQXR0cnMgdG8gaGVyZS4KICAgICAgIC8vIEluIHRoZSBtZWFudGltZSwgYWxpZ25lZCBhdHRyaWJ1dGVzIGFyZSBjbG9uZWQuCiAgICAgfQotICAgIHZvaWQgd3JpdGVDdG9yQm9keShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQ3RvckJvZHkocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiICAgIGlmIChpcyIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIkV4cHIpXG4iOwogICAgICAgT1MgPDwgIiAgICAgICAiIDw8IGdldExvd2VyTmFtZSgpIDw8ICJFeHByID0gcmVpbnRlcnByZXRfY2FzdDxFeHByICo+KCIKICAgICAgICAgIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIpO1xuIjsKQEAgLTM2MSwyNiArNDQ0LDI5IEBACiAgICAgICAgICA8PCAiVHlwZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VHlwZVNvdXJjZUluZm8gKj4oIiA8PCBnZXRVcHBlck5hbWUoKQogICAgICAgICAgPDwgIik7IjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUN0b3JJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiaXMiIDw8IGdldExvd2VyTmFtZSgpIDw8ICJFeHByKElzIiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiRXhwcikiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ3RvckRlZmF1bHRJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JEZWZhdWx0SW5pdGlhbGl6ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgImlzIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiRXhwcihmYWxzZSkiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ3RvclBhcmFtZXRlcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JQYXJhbWV0ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgImJvb2wgSXMiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICJFeHByLCB2b2lkICoiIDw8IGdldFVwcGVyTmFtZSgpOwogICAgIH0KLSAgICB2b2lkIHdyaXRlRGVjbGFyYXRpb25zKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVJbXBsaWNpdEN0b3JBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgT1MgPDwgIklzIiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiRXhwciwgIiA8PCBnZXRVcHBlck5hbWUoKTsKKyAgICB9CisgICAgdm9pZCB3cml0ZURlY2xhcmF0aW9ucyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICJib29sIGlzIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiRXhwcjtcbiI7CiAgICAgICBPUyA8PCAidW5pb24ge1xuIjsKICAgICAgIE9TIDw8ICJFeHByICoiIDw8IGdldExvd2VyTmFtZSgpIDw8ICJFeHByO1xuIjsKICAgICAgIE9TIDw8ICJUeXBlU291cmNlSW5mbyAqIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiVHlwZTtcbiI7CiAgICAgICBPUyA8PCAifTsiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlUENIUmVhZEFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZVBDSFJlYWRBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgImlzIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiRXhwciwgIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiUHRyIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZVBDSFJlYWREZWNscyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlUENIUmVhZERlY2xzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgICBib29sIGlzIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiRXhwciA9IFJlY29yZFtJZHgrK107XG4iOwogICAgICAgT1MgPDwgIiAgICB2b2lkICoiIDw8IGdldExvd2VyTmFtZSgpIDw8ICJQdHI7XG4iOwogICAgICAgT1MgPDwgIiAgICBpZiAoaXMiIDw8IGdldExvd2VyTmFtZSgpIDw8ICJFeHByKVxuIjsKQEAgLTM4OSw3ICs0NzUsNyBAQAogICAgICAgT1MgPDwgIiAgICAgICIgPDwgZ2V0TG93ZXJOYW1lKCkKICAgICAgICAgIDw8ICJQdHIgPSBHZXRUeXBlU291cmNlSW5mbyhGLCBSZWNvcmQsIElkeCk7XG4iOwogICAgIH0KLSAgICB2b2lkIHdyaXRlUENIV3JpdGUocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZVBDSFdyaXRlKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT5pcyIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIkV4cHIoKSk7XG4iOwogICAgICAgT1MgPDwgIiAgICBpZiAoU0EtPmlzIiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiRXhwcigpKVxuIjsKICAgICAgIE9TIDw8ICIgICAgICBBZGRTdG10KFNBLT5nZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICJFeHByKCkpO1xuIjsKQEAgLTM5NywxNCArNDgzLDE0IEBACiAgICAgICBPUyA8PCAiICAgICAgQWRkVHlwZVNvdXJjZUluZm8oU0EtPmdldCIgPDwgZ2V0VXBwZXJOYW1lKCkKICAgICAgICAgIDw8ICJUeXBlKCksIFJlY29yZCk7XG4iOwogICAgIH0KLSAgICB2b2lkIHdyaXRlVmFsdWUocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZVZhbHVlKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIlwiO1xuIgogICAgICAgICAgPDwgIiAgIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiRXhwci0+cHJpbnRQcmV0dHkoT1MsIDAsIFBvbGljeSk7XG4iCiAgICAgICAgICA8PCAiICBPUyA8PCBcIiI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVEdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVEdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgIH0KLSAgICB2b2lkIHdyaXRlRHVtcENoaWxkcmVuKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVEdW1wQ2hpbGRyZW4ocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiICAgIGlmIChTQS0+aXMiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICJFeHByKCkpIHtcbiI7CiAgICAgICBPUyA8PCAiICAgICAgbGFzdENoaWxkKCk7XG4iOwogICAgICAgT1MgPDwgIiAgICAgIGR1bXBTdG10KFNBLT5nZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICJFeHByKCkpO1xuIjsKQEAgLTQxMiw3ICs0OTgsNyBAQAogICAgICAgT1MgPDwgIiAgICAgIGR1bXBUeXBlKFNBLT5nZXQiIDw8IGdldFVwcGVyTmFtZSgpCiAgICAgICAgICA8PCAiVHlwZSgpLT5nZXRUeXBlKCkpO1xuIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUhhc0NoaWxkcmVuKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVIYXNDaGlsZHJlbihyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICJTQS0+aXMiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICJFeHByKCkiOwogICAgIH0KICAgfTsKQEAgLTQyNyw3ICs1MTMsNyBAQAogCiAgICAgc3RkOjpzdHJpbmcgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGU7IH0KIAotICAgIHZvaWQgd3JpdGVBY2Nlc3NvcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUFjY2Vzc29ycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICIgIHR5cGVkZWYgIiA8PCB0eXBlIDw8ICIqICIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIl9pdGVyYXRvcjtcbiI7CiAgICAgICBPUyA8PCAiICAiIDw8IGdldExvd2VyTmFtZSgpIDw8ICJfaXRlcmF0b3IgIiA8PCBnZXRMb3dlck5hbWUoKQogICAgICAgICAgPDwgIl9iZWdpbigpIGNvbnN0IHtcbiI7CkBAIC00NDIsMzYgKzUyOCwzOSBAQAogICAgICAgICAgPDwgIiAgICByZXR1cm4gIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiU2l6ZTtcbiI7CiAgICAgICBPUyA8PCAiICB9IjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUNsb25lQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQ2xvbmVBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIiwgIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiU2l6ZSI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVUZW1wbGF0ZUluc3RhbnRpYXRpb25BcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVUZW1wbGF0ZUluc3RhbnRpYXRpb25BcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgLy8gVGhpcyBpc24ndCBlbGVnYW50LCBidXQgd2UgaGF2ZSB0byBnbyB0aHJvdWdoIHB1YmxpYyBtZXRob2RzLi4uCiAgICAgICBPUyA8PCAiQS0+IiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiX2JlZ2luKCksICIKICAgICAgICAgIDw8ICJBLT4iIDw8IGdldExvd2VyTmFtZSgpIDw8ICJfc2l6ZSgpIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUN0b3JCb2R5KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVDdG9yQm9keShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIC8vIEZJWE1FOiBtZW1jcHkgaXMgbm90IHNhZmUgb24gbm9uLXRyaXZpYWwgdHlwZXMuCiAgICAgICBPUyA8PCAiICAgIHN0ZDo6bWVtY3B5KCIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIiwgIiA8PCBnZXRVcHBlck5hbWUoKQogICAgICAgICAgPDwgIiwgIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiU2l6ZSAqIHNpemVvZigiIDw8IGdldFR5cGUoKSA8PCAiKSk7XG4iOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ3RvckluaXRpYWxpemVycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQ3RvckluaXRpYWxpemVycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8IGdldExvd2VyTmFtZSgpIDw8ICJTaXplKCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIlNpemUpLCAiCiAgICAgICAgICA8PCBnZXRMb3dlck5hbWUoKSA8PCAiKG5ldyAoQ3R4LCAxNikgIiA8PCBnZXRUeXBlKCkgPDwgIlsiCiAgICAgICAgICA8PCBnZXRMb3dlck5hbWUoKSA8PCAiU2l6ZV0pIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUN0b3JEZWZhdWx0SW5pdGlhbGl6ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVDdG9yRGVmYXVsdEluaXRpYWxpemVycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8IGdldExvd2VyTmFtZSgpIDw8ICJTaXplKDApLCAiIDw8IGdldExvd2VyTmFtZSgpIDw8ICIoMCkiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ3RvclBhcmFtZXRlcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JQYXJhbWV0ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgZ2V0VHlwZSgpIDw8ICIgKiIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIiwgdW5zaWduZWQgIgogICAgICAgICAgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIlNpemUiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlRGVjbGFyYXRpb25zKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVJbXBsaWNpdEN0b3JBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgT1MgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIiwgIiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiU2l6ZSI7CisgICAgfQorICAgIHZvaWQgd3JpdGVEZWNsYXJhdGlvbnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiICB1bnNpZ25lZCAiIDw8IGdldExvd2VyTmFtZSgpIDw8ICJTaXplO1xuIjsKICAgICAgIE9TIDw8ICIgICIgPDwgZ2V0VHlwZSgpIDw8ICIgKiIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIjsiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlUENIUmVhZERlY2xzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVQQ0hSZWFkRGVjbHMocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiICB1bnNpZ25lZCAiIDw8IGdldExvd2VyTmFtZSgpIDw8ICJTaXplID0gUmVjb3JkW0lkeCsrXTtcbiI7CiAgICAgICBPUyA8PCAiICBTbWFsbFZlY3RvcjwiIDw8IHR5cGUgPDwgIiwgND4gIiA8PCBnZXRMb3dlck5hbWUoKQogICAgICAgICAgPDwgIjtcbiI7CkBAIC00ODIsMTcgKzU3MSwxNyBAQAogICAgICAgc3RkOjpzdHJpbmcgcmVhZCA9IFJlYWRQQ0hSZWNvcmQodHlwZSk7CiAgICAgICBPUyA8PCAiICAgICIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIi5wdXNoX2JhY2soIiA8PCByZWFkIDw8ICIpO1xuIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZVBDSFJlYWRBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVQQ0hSZWFkQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8IGdldExvd2VyTmFtZSgpIDw8ICIuZGF0YSgpLCAiIDw8IGdldExvd2VyTmFtZSgpIDw8ICJTaXplIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZVBDSFdyaXRlKHJhd19vc3RyZWFtICZPUykgY29uc3R7CisgICAgdm9pZCB3cml0ZVBDSFdyaXRlKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT4iIDw8IGdldExvd2VyTmFtZSgpIDw8ICJfc2l6ZSgpKTtcbiI7CiAgICAgICBPUyA8PCAiICAgIGZvciAoIiA8PCBnZXRBdHRyTmFtZSgpIDw8ICJBdHRyOjoiIDw8IGdldExvd2VyTmFtZSgpCiAgICAgICAgICA8PCAiX2l0ZXJhdG9yIGkgPSBTQS0+IiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiX2JlZ2luKCksIGUgPSBTQS0+IgogICAgICAgICAgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIl9lbmQoKTsgaSAhPSBlOyArK2kpXG4iOwogICAgICAgT1MgPDwgIiAgICAgICIgPDwgV3JpdGVQQ0hSZWNvcmQodHlwZSwgIigqaSkiKTsKICAgICB9Ci0gICAgdm9pZCB3cml0ZVZhbHVlKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVWYWx1ZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICJcIjtcbiI7CiAgICAgICBPUyA8PCAiICBib29sIGlzRmlyc3QgPSB0cnVlO1xuIgogICAgICAgICAgPDwgIiAgZm9yICgiIDw8IGdldEF0dHJOYW1lKCkgPDwgIkF0dHI6OiIgPDwgZ2V0TG93ZXJOYW1lKCkKQEAgLTUwNCw3ICs1OTMsNyBAQAogICAgICAgICAgPDwgIiAgfVxuIjsKICAgICAgIE9TIDw8ICIgIE9TIDw8IFwiIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiICAgIGZvciAoIiA8PCBnZXRBdHRyTmFtZSgpIDw8ICJBdHRyOjoiIDw8IGdldExvd2VyTmFtZSgpCiAgICAgICAgICA8PCAiX2l0ZXJhdG9yIEkgPSBTQS0+IiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiX2JlZ2luKCksIEUgPSBTQS0+IgogICAgICAgICAgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIl9lbmQoKTsgSSAhPSBFOyArK0kpXG4iOwpAQCAtNTEyLDQ4ICs2MDEsNjAgQEAKICAgICB9CiAgIH07CiAKKyAgLy8gVW5pcXVlIHRoZSBlbnVtcywgYnV0IG1haW50YWluIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBvcmRlcmluZy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+CisgIHVuaXF1ZUVudW1zSW5PcmRlcihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmVudW1zKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHVuaXF1ZXM7CisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVuaXF1ZV9zZXQoZW51bXMuYmVnaW4oKSwgZW51bXMuZW5kKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmaSA6IGVudW1zKSB7CisgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIHNldF9pID0gdW5pcXVlX3NldC5maW5kKGkpOworICAgICAgaWYgKHNldF9pICE9IHVuaXF1ZV9zZXQuZW5kKCkpIHsKKyAgICAgICAgdW5pcXVlcy5wdXNoX2JhY2soaSk7CisgICAgICAgIHVuaXF1ZV9zZXQuZXJhc2Uoc2V0X2kpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdW5pcXVlczsKKyAgfQorCiAgIGNsYXNzIEVudW1Bcmd1bWVudCA6IHB1YmxpYyBBcmd1bWVudCB7CiAgICAgc3RkOjpzdHJpbmcgdHlwZTsKLSAgICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IHZhbHVlcywgZW51bXMsIHVuaXF1ZXM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZhbHVlcywgZW51bXMsIHVuaXF1ZXM7CiAgIHB1YmxpYzoKICAgICBFbnVtQXJndW1lbnQoUmVjb3JkICZBcmcsIFN0cmluZ1JlZiBBdHRyKQogICAgICAgOiBBcmd1bWVudChBcmcsIEF0dHIpLCB0eXBlKEFyZy5nZXRWYWx1ZUFzU3RyaW5nKCJUeXBlIikpLAotICAgICAgICB2YWx1ZXMoZ2V0VmFsdWVBc0xpc3RPZlN0cmluZ3MoQXJnLCAiVmFsdWVzIikpLAotICAgICAgICBlbnVtcyhnZXRWYWx1ZUFzTGlzdE9mU3RyaW5ncyhBcmcsICJFbnVtcyIpKSwKLSAgICAgICAgdW5pcXVlcyhlbnVtcykKKyAgICAgICAgdmFsdWVzKEFyZy5nZXRWYWx1ZUFzTGlzdE9mU3RyaW5ncygiVmFsdWVzIikpLAorICAgICAgICBlbnVtcyhBcmcuZ2V0VmFsdWVBc0xpc3RPZlN0cmluZ3MoIkVudW1zIikpLAorICAgICAgICB1bmlxdWVzKHVuaXF1ZUVudW1zSW5PcmRlcihlbnVtcykpCiAgICAgewotICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB2YXJpb3VzIGVudW0gdmFsdWVzCi0gICAgICBzdGQ6OnNvcnQodW5pcXVlcy5iZWdpbigpLCB1bmlxdWVzLmVuZCgpKTsKLSAgICAgIHVuaXF1ZXMuZXJhc2Uoc3RkOjp1bmlxdWUodW5pcXVlcy5iZWdpbigpLCB1bmlxdWVzLmVuZCgpKSwgdW5pcXVlcy5lbmQoKSk7CiAgICAgICAvLyBGSVhNRTogRW1pdCBhIHByb3BlciBlcnJvcgogICAgICAgYXNzZXJ0KCF1bmlxdWVzLmVtcHR5KCkpOwogICAgIH0KIAotICAgIGJvb2wgaXNFbnVtQXJnKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgaXNFbnVtQXJnKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCi0gICAgdm9pZCB3cml0ZUFjY2Vzc29ycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQWNjZXNzb3JzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgIiA8PCB0eXBlIDw8ICIgZ2V0IiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiKCkgY29uc3Qge1xuIjsKICAgICAgIE9TIDw8ICIgICAgcmV0dXJuICIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIjtcbiI7CiAgICAgICBPUyA8PCAiICB9IjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUNsb25lQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQ2xvbmVBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgZ2V0TG93ZXJOYW1lKCk7CiAgICAgfQotICAgIHZvaWQgd3JpdGVUZW1wbGF0ZUluc3RhbnRpYXRpb25BcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVUZW1wbGF0ZUluc3RhbnRpYXRpb25BcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIkEtPmdldCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIigpIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUN0b3JJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCBnZXRMb3dlck5hbWUoKSA8PCAiKCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIikiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ3RvckRlZmF1bHRJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JEZWZhdWx0SW5pdGlhbGl6ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIigiIDw8IHR5cGUgPDwgIigwKSkiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ3RvclBhcmFtZXRlcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JQYXJhbWV0ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgdHlwZSA8PCAiICIgPDwgZ2V0VXBwZXJOYW1lKCk7CiAgICAgfQotICAgIHZvaWQgd3JpdGVEZWNsYXJhdGlvbnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7Ci0gICAgICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+Ojpjb25zdF9pdGVyYXRvciBpID0gdW5pcXVlcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHVuaXF1ZXMuZW5kKCk7CisgICAgdm9pZCB3cml0ZURlY2xhcmF0aW9ucyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaSA9IHVuaXF1ZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHVuaXF1ZXMuZW5kKCk7CiAgICAgICAvLyBUaGUgbGFzdCBvbmUgbmVlZHMgdG8gbm90IGhhdmUgYSBjb21tYS4KICAgICAgIC0tZTsKIApAQCAtNTY2LDI2ICs2NjcsMjUgQEAKICAgICAgIE9TIDw8ICJwcml2YXRlOlxuIjsKICAgICAgIE9TIDw8ICIgICIgPDwgdHlwZSA8PCAiICIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIjsiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlUENIUmVhZERlY2xzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVQQ0hSZWFkRGVjbHMocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiICAgICIgPDwgZ2V0QXR0ck5hbWUoKSA8PCAiQXR0cjo6IiA8PCB0eXBlIDw8ICIgIiA8PCBnZXRMb3dlck5hbWUoKQogICAgICAgICAgPDwgIihzdGF0aWNfY2FzdDwiIDw8IGdldEF0dHJOYW1lKCkgPDwgIkF0dHI6OiIgPDwgdHlwZQogICAgICAgICAgPDwgIj4oUmVjb3JkW0lkeCsrXSkpO1xuIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZVBDSFJlYWRBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVQQ0hSZWFkQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8IGdldExvd2VyTmFtZSgpOwogICAgIH0KLSAgICB2b2lkIHdyaXRlUENIV3JpdGUocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZVBDSFdyaXRlKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIlJlY29yZC5wdXNoX2JhY2soU0EtPmdldCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIigpKTtcbiI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVWYWx1ZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlVmFsdWUocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiXCIgPDwgZ2V0IiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiKCkgPDwgXCIiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlRHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlRHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICIgICAgc3dpdGNoKFNBLT5nZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIoKSkge1xuIjsKLSAgICAgIGZvciAoc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPjo6Y29uc3RfaXRlcmF0b3IgSSA9IHVuaXF1ZXMuYmVnaW4oKSwKLSAgICAgICAgICAgRSA9IHVuaXF1ZXMuZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICAgIE9TIDw8ICIgICAgY2FzZSAiIDw8IGdldEF0dHJOYW1lKCkgPDwgIkF0dHI6OiIgPDwgKkkgPDwgIjpcbiI7Ci0gICAgICAgIE9TIDw8ICIgICAgICBPUyA8PCBcIiAiIDw8ICpJIDw8ICJcIjtcbiI7CisgICAgICBmb3IgKGNvbnN0IGF1dG8gJkkgOiB1bmlxdWVzKSB7CisgICAgICAgIE9TIDw8ICIgICAgY2FzZSAiIDw8IGdldEF0dHJOYW1lKCkgPDwgIkF0dHI6OiIgPDwgSSA8PCAiOlxuIjsKKyAgICAgICAgT1MgPDwgIiAgICAgIE9TIDw8IFwiICIgPDwgSSA8PCAiXCI7XG4iOwogICAgICAgICBPUyA8PCAiICAgICAgYnJlYWs7XG4iOwogICAgICAgfQogICAgICAgT1MgPDwgIiAgICB9XG4iOwpAQCAtNTk1LDcgKzY5NSw3IEBACiAgICAgICBPUyA8PCAiICBzdGF0aWMgYm9vbCBDb252ZXJ0U3RyVG8iIDw8IHR5cGUgPDwgIihTdHJpbmdSZWYgVmFsLCAiOwogICAgICAgT1MgPDwgdHlwZSA8PCAiICZPdXQpIHtcbiI7CiAgICAgICBPUyA8PCAiICAgIE9wdGlvbmFsPCIgPDwgdHlwZSA8PCAiPiBSID0gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPCI7Ci0gICAgICBPUyA8PCB0eXBlIDw8ICI+ID4oVmFsKVxuIjsKKyAgICAgIE9TIDw8IHR5cGUgPDwgIj4+KFZhbClcbiI7CiAgICAgICBmb3IgKHNpemVfdCBJID0gMDsgSSA8IGVudW1zLnNpemUoKTsgKytJKSB7CiAgICAgICAgIE9TIDw8ICIgICAgICAuQ2FzZShcIiIgPDwgdmFsdWVzW0ldIDw8ICJcIiwgIjsKICAgICAgICAgT1MgPDwgZ2V0QXR0ck5hbWUoKSA8PCAiQXR0cjo6IiA8PCBlbnVtc1tJXSA8PCAiKVxuIjsKQEAgLTYxMCwzMCArNzEwLDI2IEBACiAgIAogICBjbGFzcyBWYXJpYWRpY0VudW1Bcmd1bWVudDogcHVibGljIFZhcmlhZGljQXJndW1lbnQgewogICAgIHN0ZDo6c3RyaW5nIHR5cGUsIFF1YWxpZmllZFR5cGVOYW1lOwotICAgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gdmFsdWVzLCBlbnVtcywgdW5pcXVlczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmFsdWVzLCBlbnVtcywgdW5pcXVlczsKICAgcHVibGljOgogICAgIFZhcmlhZGljRW51bUFyZ3VtZW50KFJlY29yZCAmQXJnLCBTdHJpbmdSZWYgQXR0cikKICAgICAgIDogVmFyaWFkaWNBcmd1bWVudChBcmcsIEF0dHIsIEFyZy5nZXRWYWx1ZUFzU3RyaW5nKCJUeXBlIikpLAogICAgICAgICB0eXBlKEFyZy5nZXRWYWx1ZUFzU3RyaW5nKCJUeXBlIikpLAotICAgICAgICB2YWx1ZXMoZ2V0VmFsdWVBc0xpc3RPZlN0cmluZ3MoQXJnLCAiVmFsdWVzIikpLAotICAgICAgICBlbnVtcyhnZXRWYWx1ZUFzTGlzdE9mU3RyaW5ncyhBcmcsICJFbnVtcyIpKSwKLSAgICAgICAgdW5pcXVlcyhlbnVtcykKKyAgICAgICAgdmFsdWVzKEFyZy5nZXRWYWx1ZUFzTGlzdE9mU3RyaW5ncygiVmFsdWVzIikpLAorICAgICAgICBlbnVtcyhBcmcuZ2V0VmFsdWVBc0xpc3RPZlN0cmluZ3MoIkVudW1zIikpLAorICAgICAgICB1bmlxdWVzKHVuaXF1ZUVudW1zSW5PcmRlcihlbnVtcykpCiAgICAgewotICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB2YXJpb3VzIGVudW0gdmFsdWVzCi0gICAgICBzdGQ6OnNvcnQodW5pcXVlcy5iZWdpbigpLCB1bmlxdWVzLmVuZCgpKTsKLSAgICAgIHVuaXF1ZXMuZXJhc2Uoc3RkOjp1bmlxdWUodW5pcXVlcy5iZWdpbigpLCB1bmlxdWVzLmVuZCgpKSwgdW5pcXVlcy5lbmQoKSk7Ci0gICAgICAKICAgICAgIFF1YWxpZmllZFR5cGVOYW1lID0gZ2V0QXR0ck5hbWUoKS5zdHIoKSArICJBdHRyOjoiICsgdHlwZTsKICAgICAgIAogICAgICAgLy8gRklYTUU6IEVtaXQgYSBwcm9wZXIgZXJyb3IKICAgICAgIGFzc2VydCghdW5pcXVlcy5lbXB0eSgpKTsKICAgICB9CiAKLSAgICBib29sIGlzVmFyaWFkaWNFbnVtQXJnKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgaXNWYXJpYWRpY0VudW1BcmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAgICAgCi0gICAgdm9pZCB3cml0ZURlY2xhcmF0aW9ucyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKLSAgICAgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj46OmNvbnN0X2l0ZXJhdG9yIGkgPSB1bmlxdWVzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdW5pcXVlcy5lbmQoKTsKKyAgICB2b2lkIHdyaXRlRGVjbGFyYXRpb25zKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpID0gdW5pcXVlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdW5pcXVlcy5lbmQoKTsKICAgICAgIC8vIFRoZSBsYXN0IG9uZSBuZWVkcyB0byBub3QgaGF2ZSBhIGNvbW1hLgogICAgICAgLS1lOwogCkBAIC02NDcsMjEgKzc0MywyMCBAQAogICAgICAgCiAgICAgICBWYXJpYWRpY0FyZ3VtZW50Ojp3cml0ZURlY2xhcmF0aW9ucyhPUyk7CiAgICAgfQotICAgIHZvaWQgd3JpdGVEdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVEdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgICBmb3IgKCIgPDwgZ2V0QXR0ck5hbWUoKSA8PCAiQXR0cjo6IiA8PCBnZXRMb3dlck5hbWUoKQogICAgICAgICAgPDwgIl9pdGVyYXRvciBJID0gU0EtPiIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIl9iZWdpbigpLCBFID0gU0EtPiIKICAgICAgICAgIDw8IGdldExvd2VyTmFtZSgpIDw8ICJfZW5kKCk7IEkgIT0gRTsgKytJKSB7XG4iOwogICAgICAgT1MgPDwgIiAgICAgIHN3aXRjaCgqSSkge1xuIjsKLSAgICAgIGZvciAoc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPjo6Y29uc3RfaXRlcmF0b3IgVUkgPSB1bmlxdWVzLmJlZ2luKCksCi0gICAgICAgICAgIFVFID0gdW5pcXVlcy5lbmQoKTsgVUkgIT0gVUU7ICsrVUkpIHsKLSAgICAgICAgT1MgPDwgIiAgICBjYXNlICIgPDwgZ2V0QXR0ck5hbWUoKSA8PCAiQXR0cjo6IiA8PCAqVUkgPDwgIjpcbiI7Ci0gICAgICAgIE9TIDw8ICIgICAgICBPUyA8PCBcIiAiIDw8ICpVSSA8PCAiXCI7XG4iOworICAgICAgZm9yIChjb25zdCBhdXRvICZVSSA6IHVuaXF1ZXMpIHsKKyAgICAgICAgT1MgPDwgIiAgICBjYXNlICIgPDwgZ2V0QXR0ck5hbWUoKSA8PCAiQXR0cjo6IiA8PCBVSSA8PCAiOlxuIjsKKyAgICAgICAgT1MgPDwgIiAgICAgIE9TIDw8IFwiICIgPDwgVUkgPDwgIlwiO1xuIjsKICAgICAgICAgT1MgPDwgIiAgICAgIGJyZWFrO1xuIjsKICAgICAgIH0KICAgICAgIE9TIDw8ICIgICAgICB9XG4iOwogICAgICAgT1MgPDwgIiAgICB9XG4iOwogICAgIH0KLSAgICB2b2lkIHdyaXRlUENIUmVhZERlY2xzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVQQ0hSZWFkRGVjbHMocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiICAgIHVuc2lnbmVkICIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIlNpemUgPSBSZWNvcmRbSWR4KytdO1xuIjsKICAgICAgIE9TIDw8ICIgICAgU21hbGxWZWN0b3I8IiA8PCBRdWFsaWZpZWRUeXBlTmFtZSA8PCAiLCA0PiAiIDw8IGdldExvd2VyTmFtZSgpCiAgICAgICAgICA8PCAiO1xuIjsKQEAgLTY3MSw3ICs3NjYsNyBAQAogICAgICAgT1MgPDwgIiAgICAgICIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIi5wdXNoX2JhY2soIiA8PCAic3RhdGljX2Nhc3Q8IgogICAgICAgICAgPDwgUXVhbGlmaWVkVHlwZU5hbWUgPDwgIj4oUmVjb3JkW0lkeCsrXSkpO1xuIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZVBDSFdyaXRlKHJhd19vc3RyZWFtICZPUykgY29uc3R7CisgICAgdm9pZCB3cml0ZVBDSFdyaXRlKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgICBSZWNvcmQucHVzaF9iYWNrKFNBLT4iIDw8IGdldExvd2VyTmFtZSgpIDw8ICJfc2l6ZSgpKTtcbiI7CiAgICAgICBPUyA8PCAiICAgIGZvciAoIiA8PCBnZXRBdHRyTmFtZSgpIDw8ICJBdHRyOjoiIDw8IGdldExvd2VyTmFtZSgpCiAgICAgICAgICA8PCAiX2l0ZXJhdG9yIGkgPSBTQS0+IiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiX2JlZ2luKCksIGUgPSBTQS0+IgpAQCAtNjgyLDcgKzc3Nyw3IEBACiAgICAgICBPUyA8PCAiICBzdGF0aWMgYm9vbCBDb252ZXJ0U3RyVG8iIDw8IHR5cGUgPDwgIihTdHJpbmdSZWYgVmFsLCAiOwogICAgICAgT1MgPDwgdHlwZSA8PCAiICZPdXQpIHtcbiI7CiAgICAgICBPUyA8PCAiICAgIE9wdGlvbmFsPCIgPDwgdHlwZSA8PCAiPiBSID0gbGx2bTo6U3RyaW5nU3dpdGNoPE9wdGlvbmFsPCI7Ci0gICAgICBPUyA8PCB0eXBlIDw8ICI+ID4oVmFsKVxuIjsKKyAgICAgIE9TIDw8IHR5cGUgPDwgIj4+KFZhbClcbiI7CiAgICAgICBmb3IgKHNpemVfdCBJID0gMDsgSSA8IGVudW1zLnNpemUoKTsgKytJKSB7CiAgICAgICAgIE9TIDw8ICIgICAgICAuQ2FzZShcIiIgPDwgdmFsdWVzW0ldIDw8ICJcIiwgIjsKICAgICAgICAgT1MgPDwgZ2V0QXR0ck5hbWUoKSA8PCAiQXR0cjo6IiA8PCBlbnVtc1tJXSA8PCAiKVxuIjsKQEAgLTcwMSw3ICs3OTYsNyBAQAogICAgICAgOiBBcmd1bWVudChBcmcsIEF0dHIpCiAgICAge30KIAotICAgIHZvaWQgd3JpdGVBY2Nlc3NvcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUFjY2Vzc29ycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICIgIFZlcnNpb25UdXBsZSBnZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIoKSBjb25zdCB7XG4iOwogICAgICAgT1MgPDwgIiAgICByZXR1cm4gIiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiO1xuIjsKICAgICAgIE9TIDw8ICIgIH1cbiI7CkBAIC03MTAsNDAgKzgwNSwzOCBAQAogICAgICAgT1MgPDwgIiAgICAiIDw8IGdldExvd2VyTmFtZSgpIDw8ICIgPSBWO1xuIjsKICAgICAgIE9TIDw8ICIgIH0iOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ2xvbmVBcmdzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVDbG9uZUFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiZ2V0IiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiKCkiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlVGVtcGxhdGVJbnN0YW50aWF0aW9uQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlVGVtcGxhdGVJbnN0YW50aWF0aW9uQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICJBLT5nZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIoKSI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVDdG9yQm9keShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKLSAgICB9Ci0gICAgdm9pZCB3cml0ZUN0b3JJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCBnZXRMb3dlck5hbWUoKSA8PCAiKCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIikiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlQ3RvckRlZmF1bHRJbml0aWFsaXplcnMocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUN0b3JEZWZhdWx0SW5pdGlhbGl6ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIigpIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUN0b3JQYXJhbWV0ZXJzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVDdG9yUGFyYW1ldGVycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICJWZXJzaW9uVHVwbGUgIiA8PCBnZXRVcHBlck5hbWUoKTsKICAgICB9Ci0gICAgdm9pZCB3cml0ZURlY2xhcmF0aW9ucyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlRGVjbGFyYXRpb25zKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIlZlcnNpb25UdXBsZSAiIDw8IGdldExvd2VyTmFtZSgpIDw8ICI7XG4iOwogICAgIH0KLSAgICB2b2lkIHdyaXRlUENIUmVhZERlY2xzKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVQQ0hSZWFkRGVjbHMocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiICAgIFZlcnNpb25UdXBsZSAiIDw8IGdldExvd2VyTmFtZSgpCiAgICAgICAgICA8PCAiPSBSZWFkVmVyc2lvblR1cGxlKFJlY29yZCwgSWR4KTtcbiI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVQQ0hSZWFkQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlUENIUmVhZEFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCBnZXRMb3dlck5hbWUoKTsKICAgICB9Ci0gICAgdm9pZCB3cml0ZVBDSFdyaXRlKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVQQ0hXcml0ZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICIgICAgQWRkVmVyc2lvblR1cGxlKFNBLT5nZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIoKSwgUmVjb3JkKTtcbiI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVWYWx1ZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlVmFsdWUocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCBnZXRMb3dlck5hbWUoKSA8PCAiPVwiIDw8IGdldCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIigpIDw8IFwiIjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZUR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiICAgIE9TIDw8IFwiIFwiIDw8IFNBLT5nZXQiIDw8IGdldFVwcGVyTmFtZSgpIDw8ICIoKTtcbiI7CiAgICAgfQogICB9OwpAQCAtNzU0LDExICs4NDcsMTcgQEAKICAgICAgIDogU2ltcGxlQXJndW1lbnQoQXJnLCBBdHRyLCAiRXhwciAqIikKICAgICB7fQogCi0gICAgdm9pZCB3cml0ZVRlbXBsYXRlSW5zdGFudGlhdGlvbkFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUFTVFZpc2l0b3JUcmF2ZXJzYWwocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CisgICAgICBPUyA8PCAiICBpZiAoISIKKyAgICAgICAgIDw8ICJnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KEEtPmdldCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIigpKSlcbiI7CisgICAgICBPUyA8PCAiICAgIHJldHVybiBmYWxzZTtcbiI7CisgICAgfQorCisgICAgdm9pZCB3cml0ZVRlbXBsYXRlSW5zdGFudGlhdGlvbkFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAidGVtcEluc3QiIDw8IGdldFVwcGVyTmFtZSgpOwogICAgIH0KIAotICAgIHZvaWQgd3JpdGVUZW1wbGF0ZUluc3RhbnRpYXRpb24ocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZVRlbXBsYXRlSW5zdGFudGlhdGlvbihyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICIgICAgICAiIDw8IGdldFR5cGUoKSA8PCAiIHRlbXBJbnN0IiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiO1xuIjsKICAgICAgIE9TIDw8ICIgICAgICB7XG4iOwogICAgICAgT1MgPDwgIiAgICAgICAgRW50ZXJFeHByZXNzaW9uRXZhbHVhdGlvbkNvbnRleHQgIgpAQCAtNzcwLDE0ICs4NjksMTMgQEAKICAgICAgIE9TIDw8ICIgICAgICB9XG4iOwogICAgIH0KIAotICAgIHZvaWQgd3JpdGVEdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3QgewotICAgIH0KKyAgICB2b2lkIHdyaXRlRHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHt9CiAKLSAgICB2b2lkIHdyaXRlRHVtcENoaWxkcmVuKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVEdW1wQ2hpbGRyZW4ocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiICAgIGxhc3RDaGlsZCgpO1xuIjsKICAgICAgIE9TIDw8ICIgICAgZHVtcFN0bXQoU0EtPmdldCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIigpKTtcbiI7CiAgICAgfQotICAgIHZvaWQgd3JpdGVIYXNDaGlsZHJlbihyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsgT1MgPDwgInRydWUiOyB9CisgICAgdm9pZCB3cml0ZUhhc0NoaWxkcmVuKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgeyBPUyA8PCAidHJ1ZSI7IH0KICAgfTsKIAogICBjbGFzcyBWYXJpYWRpY0V4cHJBcmd1bWVudCA6IHB1YmxpYyBWYXJpYWRpY0FyZ3VtZW50IHsKQEAgLTc4NiwxMiArODg0LDI1IEBACiAgICAgICA6IFZhcmlhZGljQXJndW1lbnQoQXJnLCBBdHRyLCAiRXhwciAqIikKICAgICB7fQogCi0gICAgdm9pZCB3cml0ZVRlbXBsYXRlSW5zdGFudGlhdGlvbkFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZUFTVFZpc2l0b3JUcmF2ZXJzYWwocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CisgICAgICBPUyA8PCAiICB7XG4iOworICAgICAgT1MgPDwgIiAgICAiIDw8IGdldFR5cGUoKSA8PCAiICpJID0gQS0+IiA8PCBnZXRMb3dlck5hbWUoKQorICAgICAgICAgPDwgIl9iZWdpbigpO1xuIjsKKyAgICAgIE9TIDw8ICIgICAgIiA8PCBnZXRUeXBlKCkgPDwgIiAqRSA9IEEtPiIgPDwgZ2V0TG93ZXJOYW1lKCkKKyAgICAgICAgIDw8ICJfZW5kKCk7XG4iOworICAgICAgT1MgPDwgIiAgICBmb3IgKDsgSSAhPSBFOyArK0kpIHtcbiI7CisgICAgICBPUyA8PCAiICAgICAgaWYgKCFnZXREZXJpdmVkKCkuVHJhdmVyc2VTdG10KCpJKSlcbiI7CisgICAgICBPUyA8PCAiICAgICAgICByZXR1cm4gZmFsc2U7XG4iOworICAgICAgT1MgPDwgIiAgICB9XG4iOworICAgICAgT1MgPDwgIiAgfVxuIjsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlVGVtcGxhdGVJbnN0YW50aWF0aW9uQXJncyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICJ0ZW1wSW5zdCIgPDwgZ2V0VXBwZXJOYW1lKCkgPDwgIiwgIgogICAgICAgICAgPDwgIkEtPiIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIl9zaXplKCkiOwogICAgIH0KIAotICAgIHZvaWQgd3JpdGVUZW1wbGF0ZUluc3RhbnRpYXRpb24ocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZVRlbXBsYXRlSW5zdGFudGlhdGlvbihyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICIgICAgICAiIDw8IGdldFR5cGUoKSA8PCAiICp0ZW1wSW5zdCIgPDwgZ2V0VXBwZXJOYW1lKCkKICAgICAgICAgIDw8ICIgPSBuZXcgKEMsIDE2KSAiIDw8IGdldFR5cGUoKQogICAgICAgICAgPDwgIltBLT4iIDw8IGdldExvd2VyTmFtZSgpIDw8ICJfc2l6ZSgpXTtcbiI7CkBAIC04MTEsMTAgKzkyMiw5IEBACiAgICAgICBPUyA8PCAiICAgICAgfVxuIjsKICAgICB9CiAKLSAgICB2b2lkIHdyaXRlRHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKLSAgICB9CisgICAgdm9pZCB3cml0ZUR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7fQogCi0gICAgdm9pZCB3cml0ZUR1bXBDaGlsZHJlbihyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlRHVtcENoaWxkcmVuKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgICBmb3IgKCIgPDwgZ2V0QXR0ck5hbWUoKSA8PCAiQXR0cjo6IiA8PCBnZXRMb3dlck5hbWUoKQogICAgICAgICAgPDwgIl9pdGVyYXRvciBJID0gU0EtPiIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIl9iZWdpbigpLCBFID0gU0EtPiIKICAgICAgICAgIDw8IGdldExvd2VyTmFtZSgpIDw8ICJfZW5kKCk7IEkgIT0gRTsgKytJKSB7XG4iOwpAQCAtODI0LDcgKzkzNCw3IEBACiAgICAgICBPUyA8PCAiICAgIH1cbiI7CiAgICAgfQogCi0gICAgdm9pZCB3cml0ZUhhc0NoaWxkcmVuKHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIHZvaWQgd3JpdGVIYXNDaGlsZHJlbihyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgIE9TIDw8ICJTQS0+IiA8PCBnZXRMb3dlck5hbWUoKSA8PCAiX2JlZ2luKCkgIT0gIgogICAgICAgICAgPDwgIlNBLT4iIDw8IGdldExvd2VyTmFtZSgpIDw8ICJfZW5kKCkiOwogICAgIH0KQEAgLTgzNiw3ICs5NDYsNyBAQAogICAgICAgOiBTaW1wbGVBcmd1bWVudChBcmcsIEF0dHIsICJUeXBlU291cmNlSW5mbyAqIikKICAgICB7fQogCi0gICAgdm9pZCB3cml0ZUFjY2Vzc29ycyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgICB2b2lkIHdyaXRlQWNjZXNzb3JzKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgUXVhbFR5cGUgZ2V0IiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiKCkgY29uc3Qge1xuIjsKICAgICAgIE9TIDw8ICIgICAgcmV0dXJuICIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIi0+Z2V0VHlwZSgpO1xuIjsKICAgICAgIE9TIDw8ICIgIH0iOwpAQCAtODQ0LDE4ICs5NTQsMTggQEAKICAgICAgIE9TIDw8ICIgICAgcmV0dXJuICIgPDwgZ2V0TG93ZXJOYW1lKCkgPDwgIjtcbiI7CiAgICAgICBPUyA8PCAiICB9IjsKICAgICB9Ci0gICAgdm9pZCB3cml0ZVRlbXBsYXRlSW5zdGFudGlhdGlvbkFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZVRlbXBsYXRlSW5zdGFudGlhdGlvbkFyZ3MocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICBPUyA8PCAiQS0+Z2V0IiA8PCBnZXRVcHBlck5hbWUoKSA8PCAiTG9jKCkiOwogICAgIH0KLSAgICB2b2lkIHdyaXRlUENIV3JpdGUocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgICAgdm9pZCB3cml0ZVBDSFdyaXRlKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgT1MgPDwgIiAgICAiIDw8IFdyaXRlUENIUmVjb3JkKAogICAgICAgICAgIGdldFR5cGUoKSwgIlNBLT5nZXQiICsgc3RkOjpzdHJpbmcoZ2V0VXBwZXJOYW1lKCkpICsgIkxvYygpIik7CiAgICAgfQogICB9OwogfQogCi1zdGF0aWMgQXJndW1lbnQgKmNyZWF0ZUFyZ3VtZW50KFJlY29yZCAmQXJnLCBTdHJpbmdSZWYgQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkICpTZWFyY2ggPSAwKSB7CitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFyZ3VtZW50PiBjcmVhdGVBcmd1bWVudChSZWNvcmQgJkFyZywgU3RyaW5nUmVmIEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmQgKlNlYXJjaCA9IDApIHsKICAgaWYgKCFTZWFyY2gpCiAgICAgU2VhcmNoID0gJkFyZzsKIApAQCAtODY5LDE1ICs5NzksMTkgQEAKICAgICBQdHIgPSBuZXcgU2ltcGxlQXJndW1lbnQoQXJnLCBBdHRyLCAiRnVuY3Rpb25EZWNsICoiKTsKICAgZWxzZSBpZiAoQXJnTmFtZSA9PSAiSWRlbnRpZmllckFyZ3VtZW50IikKICAgICBQdHIgPSBuZXcgU2ltcGxlQXJndW1lbnQoQXJnLCBBdHRyLCAiSWRlbnRpZmllckluZm8gKiIpOworICBlbHNlIGlmIChBcmdOYW1lID09ICJEZWZhdWx0Qm9vbEFyZ3VtZW50IikKKyAgICBQdHIgPSBuZXcgRGVmYXVsdFNpbXBsZUFyZ3VtZW50KEFyZywgQXR0ciwgImJvb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnLmdldFZhbHVlQXNCaXQoIkRlZmF1bHQiKSk7CiAgIGVsc2UgaWYgKEFyZ05hbWUgPT0gIkJvb2xBcmd1bWVudCIpIFB0ciA9IG5ldyBTaW1wbGVBcmd1bWVudChBcmcsIEF0dHIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvb2wiKTsKKyAgZWxzZSBpZiAoQXJnTmFtZSA9PSAiRGVmYXVsdEludEFyZ3VtZW50IikKKyAgICBQdHIgPSBuZXcgRGVmYXVsdFNpbXBsZUFyZ3VtZW50KEFyZywgQXR0ciwgImludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcuZ2V0VmFsdWVBc0ludCgiRGVmYXVsdCIpKTsKICAgZWxzZSBpZiAoQXJnTmFtZSA9PSAiSW50QXJndW1lbnQiKSBQdHIgPSBuZXcgU2ltcGxlQXJndW1lbnQoQXJnLCBBdHRyLCAiaW50Iik7CiAgIGVsc2UgaWYgKEFyZ05hbWUgPT0gIlN0cmluZ0FyZ3VtZW50IikgUHRyID0gbmV3IFN0cmluZ0FyZ3VtZW50KEFyZywgQXR0cik7CiAgIGVsc2UgaWYgKEFyZ05hbWUgPT0gIlR5cGVBcmd1bWVudCIpIFB0ciA9IG5ldyBUeXBlQXJndW1lbnQoQXJnLCBBdHRyKTsKICAgZWxzZSBpZiAoQXJnTmFtZSA9PSAiVW5zaWduZWRBcmd1bWVudCIpCiAgICAgUHRyID0gbmV3IFNpbXBsZUFyZ3VtZW50KEFyZywgQXR0ciwgInVuc2lnbmVkIik7Ci0gIGVsc2UgaWYgKEFyZ05hbWUgPT0gIlNvdXJjZUxvY0FyZ3VtZW50IikKLSAgICBQdHIgPSBuZXcgU2ltcGxlQXJndW1lbnQoQXJnLCBBdHRyLCAiU291cmNlTG9jYXRpb24iKTsKICAgZWxzZSBpZiAoQXJnTmFtZSA9PSAiVmFyaWFkaWNVbnNpZ25lZEFyZ3VtZW50IikKICAgICBQdHIgPSBuZXcgVmFyaWFkaWNBcmd1bWVudChBcmcsIEF0dHIsICJ1bnNpZ25lZCIpOwogICBlbHNlIGlmIChBcmdOYW1lID09ICJWYXJpYWRpY0VudW1Bcmd1bWVudCIpCkBAIC04ODgsMTAgKzEwMDIsMTAgQEAKICAgICBQdHIgPSBuZXcgVmVyc2lvbkFyZ3VtZW50KEFyZywgQXR0cik7CiAKICAgaWYgKCFQdHIpIHsKKyAgICAvLyBTZWFyY2ggaW4gcmV2ZXJzZSBvcmRlciBzbyB0aGF0IHRoZSBtb3N0LWRlcml2ZWQgdHlwZSBpcyBoYW5kbGVkIGZpcnN0LgogICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEJhc2VzID0gU2VhcmNoLT5nZXRTdXBlckNsYXNzZXMoKTsKLSAgICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+OjppdGVyYXRvciBpID0gQmFzZXMuYmVnaW4oKSwgZSA9IEJhc2VzLmVuZCgpOwotICAgICAgICAgaSAhPSBlOyArK2kpIHsKLSAgICAgIFB0ciA9IGNyZWF0ZUFyZ3VtZW50KEFyZywgQXR0ciwgKmkpOworICAgIGZvciAoYXV0byBpID0gQmFzZXMucmJlZ2luKCksIGUgPSBCYXNlcy5yZW5kKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBQdHIgPSBjcmVhdGVBcmd1bWVudChBcmcsIEF0dHIsICppKS5yZWxlYXNlKCk7CiAgICAgICBpZiAoUHRyKQogICAgICAgICBicmVhazsKICAgICB9CkBAIC05MDAsNyArMTAxNCw3IEBACiAgIGlmIChQdHIgJiYgQXJnLmdldFZhbHVlQXNCaXQoIk9wdGlvbmFsIikpCiAgICAgUHRyLT5zZXRPcHRpb25hbCh0cnVlKTsKIAotICByZXR1cm4gUHRyOworICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEFyZ3VtZW50PihQdHIpOwogfQogCiBzdGF0aWMgdm9pZCB3cml0ZUF2YWlsYWJpbGl0eVZhbHVlKHJhd19vc3RyZWFtICZPUykgewpAQCAtOTEyLDkgKzEwMjYsMzQgQEAKICAgICAgPDwgIiAgT1MgPDwgXCIiOwogfQogCi1zdGF0aWMgdm9pZCB3cml0ZVByZXR0eVByaW50RnVuY3Rpb24oUmVjb3JkICZSLCBzdGQ6OnZlY3RvcjxBcmd1bWVudCo+ICZBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgewotICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBTcGVsbGluZ3MgPSBSLmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJTcGVsbGluZ3MiKTsKK3N0YXRpYyB2b2lkIHdyaXRlR2V0U3BlbGxpbmdGdW5jdGlvbihSZWNvcmQgJlIsIHJhd19vc3RyZWFtICZPUykgeworICBzdGQ6OnZlY3RvcjxGbGF0dGVuZWRTcGVsbGluZz4gU3BlbGxpbmdzID0gR2V0RmxhdHRlbmVkU3BlbGxpbmdzKFIpOworCisgIE9TIDw8ICJjb25zdCBjaGFyICoiIDw8IFIuZ2V0TmFtZSgpIDw8ICJBdHRyOjpnZXRTcGVsbGluZygpIGNvbnN0IHtcbiI7CisgIGlmIChTcGVsbGluZ3MuZW1wdHkoKSkgeworICAgIE9TIDw8ICIgIHJldHVybiBcIihObyBzcGVsbGluZylcIjtcbn1cblxuIjsKKyAgICByZXR1cm47CisgIH0KKworICBPUyA8PCAiICBzd2l0Y2ggKFNwZWxsaW5nTGlzdEluZGV4KSB7XG4iCisgICAgICAgICIgIGRlZmF1bHQ6XG4iCisgICAgICAgICIgICAgbGx2bV91bnJlYWNoYWJsZShcIlVua25vd24gYXR0cmlidXRlIHNwZWxsaW5nIVwiKTtcbiIKKyAgICAgICAgIiAgICByZXR1cm4gXCIoTm8gc3BlbGxpbmcpXCI7XG4iOworCisgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgPCBTcGVsbGluZ3Muc2l6ZSgpOyArK0kpCisgICAgT1MgPDwgIiAgY2FzZSAiIDw8IEkgPDwgIjpcbiIKKyAgICAgICAgICAiICAgIHJldHVybiBcIiIgPDwgU3BlbGxpbmdzW0ldLm5hbWUoKSA8PCAiXCI7XG4iOworICAvLyBFbmQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnQuCisgIE9TIDw8ICIgIH1cbiI7CisgIC8vIEVuZCBvZiB0aGUgZ2V0U3BlbGxpbmcgZnVuY3Rpb24uCisgIE9TIDw8ICJ9XG5cbiI7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZVByZXR0eVByaW50RnVuY3Rpb24oUmVjb3JkICZSLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBcmd1bWVudD4+ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgeworICBzdGQ6OnZlY3RvcjxGbGF0dGVuZWRTcGVsbGluZz4gU3BlbGxpbmdzID0gR2V0RmxhdHRlbmVkU3BlbGxpbmdzKFIpOwogCiAgIE9TIDw8ICJ2b2lkICIgPDwgUi5nZXROYW1lKCkgPDwgIkF0dHI6OnByaW50UHJldHR5KCIKICAgICA8PCAicmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCB7XG4iOwpAQCAtOTM2LDggKzEwNzUsOCBAQAogICAgIC8vIFRoZSBhY3R1YWwgc3BlbGxpbmcgb2YgdGhlIG5hbWUgYW5kIG5hbWVzcGFjZSAoaWYgYXBwbGljYWJsZSkKICAgICAvLyBvZiBhbiBhdHRyaWJ1dGUgd2l0aG91dCBjb25zaWRlcmluZyBwcmVmaXggYW5kIHN1ZmZpeC4KICAgICBsbHZtOjpTbWFsbFN0cmluZzw2ND4gU3BlbGxpbmc7Ci0gICAgc3RkOjpzdHJpbmcgTmFtZSA9IFNwZWxsaW5nc1tJXS0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZSIpOwotICAgIHN0ZDo6c3RyaW5nIFZhcmlldHkgPSBTcGVsbGluZ3NbSV0tPmdldFZhbHVlQXNTdHJpbmcoIlZhcmlldHkiKTsKKyAgICBzdGQ6OnN0cmluZyBOYW1lID0gU3BlbGxpbmdzW0ldLm5hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBWYXJpZXR5ID0gU3BlbGxpbmdzW0ldLnZhcmlldHkoKTsKIAogICAgIGlmIChWYXJpZXR5ID09ICJHTlUiKSB7CiAgICAgICBQcmVmaXggPSAiIF9fYXR0cmlidXRlX18oKCI7CkBAIC05NDUsNyArMTA4NCw3IEBACiAgICAgfSBlbHNlIGlmIChWYXJpZXR5ID09ICJDWFgxMSIpIHsKICAgICAgIFByZWZpeCA9ICIgW1siOwogICAgICAgU3VmZml4ID0gIl1dIjsKLSAgICAgIHN0ZDo6c3RyaW5nIE5hbWVzcGFjZSA9IFNwZWxsaW5nc1tJXS0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZXNwYWNlIik7CisgICAgICBzdGQ6OnN0cmluZyBOYW1lc3BhY2UgPSBTcGVsbGluZ3NbSV0ubmFtZVNwYWNlKCk7CiAgICAgICBpZiAoTmFtZXNwYWNlICE9ICIiKSB7CiAgICAgICAgIFNwZWxsaW5nICs9IE5hbWVzcGFjZTsKICAgICAgICAgU3BlbGxpbmcgKz0gIjo6IjsKQEAgLTk2NiwxOCArMTEwNSwxOSBAQAogICAgICAgIiAgY2FzZSAiIDw8IEkgPDwgIiA6IHtcbiIKICAgICAgICIgICAgT1MgPDwgXCIiICsgUHJlZml4LnN0cigpICsgU3BlbGxpbmcuc3RyKCk7CiAKLSAgICBpZiAoQXJncy5zaXplKCkpIE9TIDw8ICIoIjsKKyAgICBpZiAoIUFyZ3MuZW1wdHkoKSkKKyAgICAgIE9TIDw8ICIoIjsKICAgICBpZiAoU3BlbGxpbmcgPT0gImF2YWlsYWJpbGl0eSIpIHsKICAgICAgIHdyaXRlQXZhaWxhYmlsaXR5VmFsdWUoT1MpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKHN0ZDo6dmVjdG9yPEFyZ3VtZW50Kj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBBcmdzLmJlZ2luKCksCi0gICAgICAgICAgIEUgPSBBcmdzLmVuZCgpOyBJICE9IEU7ICsrIEkpIHsKKyAgICAgIGZvciAoYXV0byBJID0gQXJncy5iZWdpbigpLCBFID0gQXJncy5lbmQoKTsgSSAhPSBFOyArKyBJKSB7CiAgICAgICAgIGlmIChJICE9IEFyZ3MuYmVnaW4oKSkgT1MgPDwgIiwgIjsKICAgICAgICAgKCpJKS0+d3JpdGVWYWx1ZShPUyk7CiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKEFyZ3Muc2l6ZSgpKSBPUyA8PCAiKSI7CisgICAgaWYgKCFBcmdzLmVtcHR5KCkpCisgICAgICBPUyA8PCAiKSI7CiAgICAgT1MgPDwgU3VmZml4LnN0cigpICsgIlwiO1xuIjsKIAogICAgIE9TIDw8CkBAIC05OTIsMTkgKzExMzIsMTggQEAKIH0KIAogLy8vIFxicmllZiBSZXR1cm4gdGhlIGluZGV4IG9mIGEgc3BlbGxpbmcgaW4gYSBzcGVsbGluZyBsaXN0Lgotc3RhdGljIHVuc2lnbmVkIGdldFNwZWxsaW5nTGlzdEluZGV4KGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCo+ICZTcGVsbGluZ0xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVjb3JkICZTcGVsbGluZykgeworc3RhdGljIHVuc2lnbmVkCitnZXRTcGVsbGluZ0xpc3RJbmRleChjb25zdCBzdGQ6OnZlY3RvcjxGbGF0dGVuZWRTcGVsbGluZz4gJlNwZWxsaW5nTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsYXR0ZW5lZFNwZWxsaW5nICZTcGVsbGluZykgewogICBhc3NlcnQoU3BlbGxpbmdMaXN0LnNpemUoKSAmJiAiU3BlbGxpbmcgbGlzdCBpcyBlbXB0eSEiKTsKIAogICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBTcGVsbGluZ0xpc3Quc2l6ZSgpOyArK0luZGV4KSB7Ci0gICAgUmVjb3JkICpTID0gU3BlbGxpbmdMaXN0W0luZGV4XTsKLSAgICBpZiAoUy0+Z2V0VmFsdWVBc1N0cmluZygiVmFyaWV0eSIpICE9IFNwZWxsaW5nLmdldFZhbHVlQXNTdHJpbmcoIlZhcmlldHkiKSkKKyAgICBjb25zdCBGbGF0dGVuZWRTcGVsbGluZyAmUyA9IFNwZWxsaW5nTGlzdFtJbmRleF07CisgICAgaWYgKFMudmFyaWV0eSgpICE9IFNwZWxsaW5nLnZhcmlldHkoKSkKICAgICAgIGNvbnRpbnVlOwotICAgIGlmIChTLT5nZXRWYWx1ZUFzU3RyaW5nKCJWYXJpZXR5IikgPT0gIkNYWDExIiAmJgotICAgICAgICBTLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lc3BhY2UiKSAhPQotICAgICAgICBTcGVsbGluZy5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lc3BhY2UiKSkKKyAgICBpZiAoUy5uYW1lU3BhY2UoKSAhPSBTcGVsbGluZy5uYW1lU3BhY2UoKSkKICAgICAgIGNvbnRpbnVlOwotICAgIGlmIChTLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIikgIT0gU3BlbGxpbmcuZ2V0VmFsdWVBc1N0cmluZygiTmFtZSIpKQorICAgIGlmIChTLm5hbWUoKSAhPSBTcGVsbGluZy5uYW1lKCkpCiAgICAgICBjb250aW51ZTsKIAogICAgIHJldHVybiBJbmRleDsKQEAgLTEwMTMsMjEgKzExNTIsMTkgQEAKICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBzcGVsbGluZyEiKTsKIH0KIAotc3RhdGljIHZvaWQgd3JpdGVBdHRyQWNjZXNzb3JEZWZpbml0aW9uKFJlY29yZCAmUiwgcmF3X29zdHJlYW0gJk9TKSB7CitzdGF0aWMgdm9pZCB3cml0ZUF0dHJBY2Nlc3NvckRlZmluaXRpb24oY29uc3QgUmVjb3JkICZSLCByYXdfb3N0cmVhbSAmT1MpIHsKICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gQWNjZXNzb3JzID0gUi5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiQWNjZXNzb3JzIik7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8UmVjb3JkKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBBY2Nlc3NvcnMuYmVnaW4oKSwKLSAgICAgICBFID0gQWNjZXNzb3JzLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIFJlY29yZCAqQWNjZXNzb3IgPSAqSTsKKyAgZm9yIChhdXRvIEFjY2Vzc29yIDogQWNjZXNzb3JzKSB7CiAgICAgc3RkOjpzdHJpbmcgTmFtZSA9IEFjY2Vzc29yLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIik7Ci0gICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gU3BlbGxpbmdzID0gQWNjZXNzb3ItPmdldFZhbHVlQXNMaXN0T2ZEZWZzKAotICAgICAgIlNwZWxsaW5ncyIpOwotICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFNwZWxsaW5nTGlzdCA9IFIuZ2V0VmFsdWVBc0xpc3RPZkRlZnMoIlNwZWxsaW5ncyIpOworICAgIHN0ZDo6dmVjdG9yPEZsYXR0ZW5lZFNwZWxsaW5nPiBTcGVsbGluZ3MgPSAKKyAgICAgIEdldEZsYXR0ZW5lZFNwZWxsaW5ncygqQWNjZXNzb3IpOworICAgIHN0ZDo6dmVjdG9yPEZsYXR0ZW5lZFNwZWxsaW5nPiBTcGVsbGluZ0xpc3QgPSBHZXRGbGF0dGVuZWRTcGVsbGluZ3MoUik7CiAgICAgYXNzZXJ0KFNwZWxsaW5nTGlzdC5zaXplKCkgJiYKICAgICAgICAgICAgIkF0dHJpYnV0ZSB3aXRoIGVtcHR5IHNwZWxsaW5nIGxpc3QgY2FuJ3QgaGF2ZSBhY2Nlc3NvcnMhIik7CiAKICAgICBPUyA8PCAiICBib29sICIgPDwgTmFtZSA8PCAiKCkgY29uc3QgeyByZXR1cm4gU3BlbGxpbmdMaXN0SW5kZXggPT0gIjsKICAgICBmb3IgKHVuc2lnbmVkIEluZGV4ID0gMDsgSW5kZXggPCBTcGVsbGluZ3Muc2l6ZSgpOyArK0luZGV4KSB7Ci0gICAgICBPUyA8PCBnZXRTcGVsbGluZ0xpc3RJbmRleChTcGVsbGluZ0xpc3QsICpTcGVsbGluZ3NbSW5kZXhdKTsKKyAgICAgIE9TIDw8IGdldFNwZWxsaW5nTGlzdEluZGV4KFNwZWxsaW5nTGlzdCwgU3BlbGxpbmdzW0luZGV4XSk7CiAgICAgICBpZiAoSW5kZXggIT0gU3BlbGxpbmdzLnNpemUoKSAtMSkKICAgICAgICAgT1MgPDwgIiB8fFxuICAgIFNwZWxsaW5nTGlzdEluZGV4ID09ICI7CiAgICAgICBlbHNlCkBAIC0xMDM2LDYgKzExNzMsMTczIEBACiAgIH0KIH0KIAorc3RhdGljIGJvb2wKK1NwZWxsaW5nTmFtZXNBcmVDb21tb24oY29uc3Qgc3RkOjp2ZWN0b3I8RmxhdHRlbmVkU3BlbGxpbmc+JiBTcGVsbGluZ3MpIHsKKyAgYXNzZXJ0KCFTcGVsbGluZ3MuZW1wdHkoKSAmJiAiQW4gZW1wdHkgbGlzdCBvZiBzcGVsbGluZ3Mgd2FzIHByb3ZpZGVkIik7CisgIHN0ZDo6c3RyaW5nIEZpcnN0TmFtZSA9IE5vcm1hbGl6ZU5hbWVGb3JTcGVsbGluZ0NvbXBhcmlzb24oCisgICAgU3BlbGxpbmdzLmZyb250KCkubmFtZSgpKTsKKyAgZm9yIChhdXRvIEkgPSBzdGQ6Om5leHQoU3BlbGxpbmdzLmJlZ2luKCkpLCBFID0gU3BlbGxpbmdzLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKSB7CisgICAgc3RkOjpzdHJpbmcgTmFtZSA9IE5vcm1hbGl6ZU5hbWVGb3JTcGVsbGluZ0NvbXBhcmlzb24oSS0+bmFtZSgpKTsKKyAgICBpZiAoTmFtZSAhPSBGaXJzdE5hbWUpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3R5cGVkZWYgc3RkOjptYXA8dW5zaWduZWQsIHN0ZDo6c3RyaW5nPiBTZW1hbnRpY1NwZWxsaW5nTWFwOworc3RhdGljIHN0ZDo6c3RyaW5nCitDcmVhdGVTZW1hbnRpY1NwZWxsaW5ncyhjb25zdCBzdGQ6OnZlY3RvcjxGbGF0dGVuZWRTcGVsbGluZz4gJlNwZWxsaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFudGljU3BlbGxpbmdNYXAgJk1hcCkgeworICAvLyBUaGUgZW51bWVyYW50cyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHZhcmlldHksCisgIC8vIG5hbWVzcGFjZSAoaWYgcHJlc2VudCkgYW5kIG5hbWUgZm9yIGVhY2ggYXR0cmlidXRlIHNwZWxsaW5nLiBIb3dldmVyLAorICAvLyBjYXJlIGlzIHRha2VuIHRvIGF2b2lkIHRyYW1wbGluZyBvbiB0aGUgcmVzZXJ2ZWQgbmFtZXNwYWNlIGR1ZSB0bworICAvLyB1bmRlcnNjb3Jlcy4KKyAgc3RkOjpzdHJpbmcgUmV0KCIgIGVudW0gU3BlbGxpbmcge1xuIik7CisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBVbmlxdWVzOworICB1bnNpZ25lZCBJZHggPSAwOworICBmb3IgKGF1dG8gSSA9IFNwZWxsaW5ncy5iZWdpbigpLCBFID0gU3BlbGxpbmdzLmVuZCgpOyBJICE9IEU7ICsrSSwgKytJZHgpIHsKKyAgICBjb25zdCBGbGF0dGVuZWRTcGVsbGluZyAmUyA9ICpJOworICAgIHN0ZDo6c3RyaW5nIFZhcmlldHkgPSBTLnZhcmlldHkoKTsKKyAgICBzdGQ6OnN0cmluZyBTcGVsbGluZyA9IFMubmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIE5hbWVzcGFjZSA9IFMubmFtZVNwYWNlKCk7CisgICAgc3RkOjpzdHJpbmcgRW51bU5hbWUgPSAiIjsKKworICAgIEVudW1OYW1lICs9IChWYXJpZXR5ICsgIl8iKTsKKyAgICBpZiAoIU5hbWVzcGFjZS5lbXB0eSgpKQorICAgICAgRW51bU5hbWUgKz0gKE5vcm1hbGl6ZU5hbWVGb3JTcGVsbGluZ0NvbXBhcmlzb24oTmFtZXNwYWNlKS5zdHIoKSArCisgICAgICAiXyIpOworICAgIEVudW1OYW1lICs9IE5vcm1hbGl6ZU5hbWVGb3JTcGVsbGluZ0NvbXBhcmlzb24oU3BlbGxpbmcpOworCisgICAgLy8gRXZlbiBpZiB0aGUgbmFtZSBpcyBub3QgdW5pcXVlLCB0aGlzIHNwZWxsaW5nIGluZGV4IGNvcnJlc3BvbmRzIHRvIGEKKyAgICAvLyBwYXJ0aWN1bGFyIGVudW1lcmFudCBuYW1lIHRoYXQgd2UndmUgY2FsY3VsYXRlZC4KKyAgICBNYXBbSWR4XSA9IEVudW1OYW1lOworCisgICAgLy8gU2luY2Ugd2UgaGF2ZSBiZWVuIHN0cmlwcGluZyB1bmRlcnNjb3JlcyB0byBhdm9pZCB0cmFtcGxpbmcgb24gdGhlCisgICAgLy8gcmVzZXJ2ZWQgbmFtZXNwYWNlLCB3ZSBtYXkgaGF2ZSBpbmFkdmVydGVudGx5IGNyZWF0ZWQgZHVwbGljYXRlCisgICAgLy8gZW51bWVyYW50IG5hbWVzLiBUaGVzZSBkdXBsaWNhdGVzIGFyZSBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZQorICAgIC8vIHNlbWFudGljIHNwZWxsaW5nLCBhbmQgY2FuIGJlIGVsaWRlZC4KKyAgICBpZiAoVW5pcXVlcy5maW5kKEVudW1OYW1lKSAhPSBVbmlxdWVzLmVuZCgpKQorICAgICAgY29udGludWU7CisKKyAgICBVbmlxdWVzLmluc2VydChFbnVtTmFtZSk7CisgICAgaWYgKEkgIT0gU3BlbGxpbmdzLmJlZ2luKCkpCisgICAgICBSZXQgKz0gIixcbiI7CisgICAgUmV0ICs9ICIgICAgIiArIEVudW1OYW1lOworICB9CisgIFJldCArPSAiXG4gIH07XG5cbiI7CisgIHJldHVybiBSZXQ7Cit9CisKK3ZvaWQgV3JpdGVTZW1hbnRpY1NwZWxsaW5nU3dpdGNoKGNvbnN0IHN0ZDo6c3RyaW5nICZWYXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VtYW50aWNTcGVsbGluZ01hcCAmTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKSB7CisgIE9TIDw8ICIgIHN3aXRjaCAoIiA8PCBWYXJOYW1lIDw8ICIpIHtcbiAgICBkZWZhdWx0OiAiCisgICAgPDwgImxsdm1fdW5yZWFjaGFibGUoXCJVbmtub3duIHNwZWxsaW5nIGxpc3QgaW5kZXhcIik7XG4iOworICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBNYXApCisgICAgT1MgPDwgIiAgICBjYXNlICIgPDwgSS5maXJzdCA8PCAiOiByZXR1cm4gIiA8PCBJLnNlY29uZCA8PCAiO1xuIjsKKyAgT1MgPDwgIiAgfVxuIjsKK30KKworLy8gRW1pdHMgdGhlIExhdGVQYXJzZWQgcHJvcGVydHkgZm9yIGF0dHJpYnV0ZXMuCitzdGF0aWMgdm9pZCBlbWl0Q2xhbmdBdHRyTGF0ZVBhcnNlZExpc3QoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgT1MgPDwgIiNpZiBkZWZpbmVkKENMQU5HX0FUVFJfTEFURV9QQVJTRURfTElTVClcbiI7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEF0dHJzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkF0dHIiKTsKKworICBmb3IgKGF1dG8gQXR0ciA6IEF0dHJzKSB7CisgICAgYm9vbCBMYXRlUGFyc2VkID0gQXR0ci0+Z2V0VmFsdWVBc0JpdCgiTGF0ZVBhcnNlZCIpOworCisgICAgaWYgKExhdGVQYXJzZWQpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPEZsYXR0ZW5lZFNwZWxsaW5nPiBTcGVsbGluZ3MgPSBHZXRGbGF0dGVuZWRTcGVsbGluZ3MoKkF0dHIpOworCisgICAgICAvLyBGSVhNRTogSGFuZGxlIG5vbi1HTlUgYXR0cmlidXRlcworICAgICAgZm9yIChjb25zdCBhdXRvICZJIDogU3BlbGxpbmdzKSB7CisgICAgICAgIGlmIChJLnZhcmlldHkoKSAhPSAiR05VIikKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgT1MgPDwgIi5DYXNlKFwiIiA8PCBJLm5hbWUoKSA8PCAiXCIsICIgPDwgTGF0ZVBhcnNlZCA8PCAiKVxuIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgT1MgPDwgIiNlbmRpZiAvLyBDTEFOR19BVFRSX0xBVEVfUEFSU0VEX0xJU1RcblxuIjsKK30KKworLy8vIFxicmllZiBFbWl0cyB0aGUgZmlyc3QtYXJndW1lbnQtaXMtdHlwZSBwcm9wZXJ0eSBmb3IgYXR0cmlidXRlcy4KK3N0YXRpYyB2b2lkIGVtaXRDbGFuZ0F0dHJUeXBlQXJnTGlzdChSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUykgeworICBPUyA8PCAiI2lmIGRlZmluZWQoQ0xBTkdfQVRUUl9UWVBFX0FSR19MSVNUKVxuIjsKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkICo+IEF0dHJzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkF0dHIiKTsKKworICBmb3IgKGF1dG8gQXR0ciA6IEF0dHJzKSB7CisgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgdHlwZS4KKyAgICBzdGQ6OnZlY3RvcjxSZWNvcmQgKj4gQXJncyA9IEF0dHItPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJBcmdzIik7CisgICAgaWYgKEFyZ3MuZW1wdHkoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKEFyZ3NbMF0tPmdldFN1cGVyQ2xhc3NlcygpLmJhY2soKS0+Z2V0TmFtZSgpICE9ICJUeXBlQXJndW1lbnQiKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBBbGwgdGhlc2Ugc3BlbGxpbmdzIHRha2UgYSBzaW5nbGUgdHlwZSBhcmd1bWVudC4KKyAgICBzdGQ6OnZlY3RvcjxGbGF0dGVuZWRTcGVsbGluZz4gU3BlbGxpbmdzID0gR2V0RmxhdHRlbmVkU3BlbGxpbmdzKCpBdHRyKTsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gRW1pdHRlZDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlMgOiBTcGVsbGluZ3MpIHsKKyAgICAgIGlmIChFbWl0dGVkLmluc2VydChTLm5hbWUoKSkuc2Vjb25kKQorICAgICAgICBPUyA8PCAiLkNhc2UoXCIiIDw8IFMubmFtZSgpIDw8ICJcIiwgIiA8PCAidHJ1ZSIgPDwgIilcbiI7CisgICAgfQorICB9CisgIE9TIDw8ICIjZW5kaWYgLy8gQ0xBTkdfQVRUUl9UWVBFX0FSR19MSVNUXG5cbiI7Cit9CisKKy8vLyBcYnJpZWYgRW1pdHMgdGhlIHBhcnNlLWFyZ3VtZW50cy1pbi11bmV2YWx1YXRlZC1jb250ZXh0IHByb3BlcnR5IGZvcgorLy8vIGF0dHJpYnV0ZXMuCitzdGF0aWMgdm9pZCBlbWl0Q2xhbmdBdHRyQXJnQ29udGV4dExpc3QoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgT1MgPDwgIiNpZiBkZWZpbmVkKENMQU5HX0FUVFJfQVJHX0NPTlRFWFRfTElTVClcbiI7CisgIFBhcnNlZEF0dHJNYXAgQXR0cnMgPSBnZXRQYXJzZWRBdHRyTGlzdChSZWNvcmRzKTsKKyAgZm9yIChjb25zdCBhdXRvICZJIDogQXR0cnMpIHsKKyAgICBjb25zdCBSZWNvcmQgJkF0dHIgPSAqSS5zZWNvbmQ7CisKKyAgICBpZiAoIUF0dHIuZ2V0VmFsdWVBc0JpdCgiUGFyc2VBcmd1bWVudHNBc1VuZXZhbHVhdGVkIikpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEFsbCB0aGVzZSBzcGVsbGluZ3MgdGFrZSBhcmUgcGFyc2VkIHVuZXZhbHVhdGVkLgorICAgIHN0ZDo6dmVjdG9yPEZsYXR0ZW5lZFNwZWxsaW5nPiBTcGVsbGluZ3MgPSBHZXRGbGF0dGVuZWRTcGVsbGluZ3MoQXR0cik7CisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEVtaXR0ZWQ7CisgICAgZm9yIChjb25zdCBhdXRvICZTIDogU3BlbGxpbmdzKSB7CisgICAgICBpZiAoRW1pdHRlZC5pbnNlcnQoUy5uYW1lKCkpLnNlY29uZCkKKyAgICAgICAgT1MgPDwgIi5DYXNlKFwiIiA8PCBTLm5hbWUoKSA8PCAiXCIsICIgPDwgInRydWUiIDw8ICIpXG4iOworICAgIH0KKyAgfQorICBPUyA8PCAiI2VuZGlmIC8vIENMQU5HX0FUVFJfQVJHX0NPTlRFWFRfTElTVFxuXG4iOworfQorCitzdGF0aWMgYm9vbCBpc0lkZW50aWZpZXJBcmd1bWVudChSZWNvcmQgKkFyZykgeworICByZXR1cm4gIUFyZy0+Z2V0U3VwZXJDbGFzc2VzKCkuZW1wdHkoKSAmJgorICAgIGxsdm06OlN0cmluZ1N3aXRjaDxib29sPihBcmctPmdldFN1cGVyQ2xhc3NlcygpLmJhY2soKS0+Z2V0TmFtZSgpKQorICAgIC5DYXNlKCJJZGVudGlmaWVyQXJndW1lbnQiLCB0cnVlKQorICAgIC5DYXNlKCJFbnVtQXJndW1lbnQiLCB0cnVlKQorICAgIC5EZWZhdWx0KGZhbHNlKTsKK30KKworLy8gRW1pdHMgdGhlIGZpcnN0LWFyZ3VtZW50LWlzLWlkZW50aWZpZXIgcHJvcGVydHkgZm9yIGF0dHJpYnV0ZXMuCitzdGF0aWMgdm9pZCBlbWl0Q2xhbmdBdHRySWRlbnRpZmllckFyZ0xpc3QoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgT1MgPDwgIiNpZiBkZWZpbmVkKENMQU5HX0FUVFJfSURFTlRJRklFUl9BUkdfTElTVClcbiI7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEF0dHJzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkF0dHIiKTsKKworICBmb3IgKGF1dG8gQXR0ciA6IEF0dHJzKSB7CisgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFuIGlkZW50aWZpZXIuCisgICAgc3RkOjp2ZWN0b3I8UmVjb3JkICo+IEFyZ3MgPSBBdHRyLT5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiQXJncyIpOworICAgIGlmIChBcmdzLmVtcHR5KCkgfHwgIWlzSWRlbnRpZmllckFyZ3VtZW50KEFyZ3NbMF0pKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBBbGwgdGhlc2Ugc3BlbGxpbmdzIHRha2UgYW4gaWRlbnRpZmllciBhcmd1bWVudC4KKyAgICBzdGQ6OnZlY3RvcjxGbGF0dGVuZWRTcGVsbGluZz4gU3BlbGxpbmdzID0gR2V0RmxhdHRlbmVkU3BlbGxpbmdzKCpBdHRyKTsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gRW1pdHRlZDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlMgOiBTcGVsbGluZ3MpIHsKKyAgICAgIGlmIChFbWl0dGVkLmluc2VydChTLm5hbWUoKSkuc2Vjb25kKQorICAgICAgICBPUyA8PCAiLkNhc2UoXCIiIDw8IFMubmFtZSgpIDw8ICJcIiwgIiA8PCAidHJ1ZSIgPDwgIilcbiI7CisgICAgfQorICB9CisgIE9TIDw8ICIjZW5kaWYgLy8gQ0xBTkdfQVRUUl9JREVOVElGSUVSX0FSR19MSVNUXG5cbiI7Cit9CisKIG5hbWVzcGFjZSBjbGFuZyB7CiAKIC8vIEVtaXRzIHRoZSBjbGFzcyBkZWZpbml0aW9ucyBmb3IgYXR0cmlidXRlcy4KQEAgLTEwNDcsOSArMTM1MSwxOSBAQAogCiAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEF0dHJzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkF0dHIiKTsKIAotICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+OjppdGVyYXRvciBpID0gQXR0cnMuYmVnaW4oKSwgZSA9IEF0dHJzLmVuZCgpOwotICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgUmVjb3JkICZSID0gKippOworICBmb3IgKGF1dG8gaSA6IEF0dHJzKSB7CisgICAgY29uc3QgUmVjb3JkICZSID0gKmk7CisKKyAgICAvLyBGSVhNRTogQ3VycmVudGx5LCBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZCBhcy1uZWVkZWQgZHVlIHRvIHRoZSBmYWN0CisgICAgLy8gdGhhdCB0aGVyZSBpcyBubyB3YXkgdG8gYWxsb3cgYSBnZW5lcmF0ZWQgcHJvamVjdCAicmVhY2ggaW50byIgdGhlIGRvY3MKKyAgICAvLyBkaXJlY3RvcnkgKGZvciBpbnN0YW5jZSwgaXQgbWF5IGJlIGFuIG91dC1vZi10cmVlIGJ1aWxkKS4gSG93ZXZlciwgd2Ugd2FudAorICAgIC8vIHRvIGVuc3VyZSB0aGF0IGV2ZXJ5IGF0dHJpYnV0ZSBoYXMgYSBEb2N1bWVudGF0aW9uIGZpZWxkLCBhbmQgcHJvZHVjZSBhbgorICAgIC8vIGVycm9yIGlmIGl0IGhhcyBiZWVuIG5lZ2xlY3RlZC4gT3RoZXJ3aXNlLCB0aGUgb24tZGVtYW5kIGdlbmVyYXRpb24gd2hpY2gKKyAgICAvLyBoYXBwZW5zIHNlcnZlci1zaWRlIHdpbGwgZmFpbC4gVGhpcyBjb2RlIGlzIGVuc3VyaW5nIHRoYXQgZnVuY3Rpb25hbGl0eSwKKyAgICAvLyBldmVuIHRob3VnaCB0aGlzIEVtaXR0ZXIgZG9lc24ndCB0ZWNobmljYWxseSBuZWVkIHRoZSBkb2N1bWVudGF0aW9uLgorICAgIC8vIFdoZW4gYXR0cmlidXRlIGRvY3VtZW50YXRpb24gY2FuIGJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoZSBidWlsZAorICAgIC8vIGl0c2VsZiwgdGhpcyBjb2RlIGNhbiBiZSByZW1vdmVkLgorICAgICh2b2lkKVIuZ2V0VmFsdWVBc0xpc3RPZkRlZnMoIkRvY3VtZW50YXRpb24iKTsKICAgICAKICAgICBpZiAoIVIuZ2V0VmFsdWVBc0JpdCgiQVNUTm9kZSIpKQogICAgICAgY29udGludWU7CkBAIC0xMDU3LDggKzEzNzEsNyBAQAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY29yZCAqPiBTdXBlcnMgPSBSLmdldFN1cGVyQ2xhc3NlcygpOwogICAgIGFzc2VydCghU3VwZXJzLmVtcHR5KCkgJiYgIkZvcmdvdCB0byBzcGVjaWZ5IGEgc3VwZXJjbGFzcyBmb3IgdGhlIGF0dHIiKTsKICAgICBzdGQ6OnN0cmluZyBTdXBlck5hbWU7Ci0gICAgZm9yIChzdGQ6OnZlY3RvcjxSZWNvcmQgKj46OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgSSA9IFN1cGVycy5yYmVnaW4oKSwKLSAgICAgICAgIEUgPSBTdXBlcnMucmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGZvciAoYXV0byBJID0gU3VwZXJzLnJiZWdpbigpLCBFID0gU3VwZXJzLnJlbmQoKTsgSSAhPSBFOyArK0kpIHsKICAgICAgIGNvbnN0IFJlY29yZCAmUiA9ICoqSTsKICAgICAgIGlmIChSLmdldE5hbWUoKSAhPSAiVGFyZ2V0U3BlY2lmaWNBdHRyIiAmJiBTdXBlck5hbWUuZW1wdHkoKSkKICAgICAgICAgU3VwZXJOYW1lID0gUi5nZXROYW1lKCk7CkBAIC0xMDY3LDUyICsxMzgwLDc4IEBACiAgICAgT1MgPDwgImNsYXNzICIgPDwgUi5nZXROYW1lKCkgPDwgIkF0dHIgOiBwdWJsaWMgIiA8PCBTdXBlck5hbWUgPDwgIiB7XG4iOwogCiAgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gQXJnUmVjb3JkcyA9IFIuZ2V0VmFsdWVBc0xpc3RPZkRlZnMoIkFyZ3MiKTsKLSAgICBzdGQ6OnZlY3RvcjxBcmd1bWVudCo+IEFyZ3M7Ci0gICAgc3RkOjp2ZWN0b3I8QXJndW1lbnQqPjo6aXRlcmF0b3IgYWksIGFlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxBcmd1bWVudD4+IEFyZ3M7CiAgICAgQXJncy5yZXNlcnZlKEFyZ1JlY29yZHMuc2l6ZSgpKTsKIAotICAgIGZvciAoc3RkOjp2ZWN0b3I8UmVjb3JkKj46Oml0ZXJhdG9yIHJpID0gQXJnUmVjb3Jkcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlID0gQXJnUmVjb3Jkcy5lbmQoKTsKLSAgICAgICAgIHJpICE9IHJlOyArK3JpKSB7Ci0gICAgICBSZWNvcmQgJkFyZ1JlY29yZCA9ICoqcmk7Ci0gICAgICBBcmd1bWVudCAqQXJnID0gY3JlYXRlQXJndW1lbnQoQXJnUmVjb3JkLCBSLmdldE5hbWUoKSk7Ci0gICAgICBhc3NlcnQoQXJnKTsKLSAgICAgIEFyZ3MucHVzaF9iYWNrKEFyZyk7Ci0KLSAgICAgIEFyZy0+d3JpdGVEZWNsYXJhdGlvbnMoT1MpOworICAgIGZvciAoYXV0byBBcmdSZWNvcmQgOiBBcmdSZWNvcmRzKSB7CisgICAgICBBcmdzLmVtcGxhY2VfYmFjayhjcmVhdGVBcmd1bWVudCgqQXJnUmVjb3JkLCBSLmdldE5hbWUoKSkpOworICAgICAgQXJncy5iYWNrKCktPndyaXRlRGVjbGFyYXRpb25zKE9TKTsKICAgICAgIE9TIDw8ICJcblxuIjsKICAgICB9CiAKLSAgICBhZSA9IEFyZ3MuZW5kKCk7CisgICAgT1MgPDwgIlxucHVibGljOlxuIjsKIAotICAgIE9TIDw8ICJcbiBwdWJsaWM6XG4iOworICAgIHN0ZDo6dmVjdG9yPEZsYXR0ZW5lZFNwZWxsaW5nPiBTcGVsbGluZ3MgPSBHZXRGbGF0dGVuZWRTcGVsbGluZ3MoUik7CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgemVybyBvciBvbmUgc3BlbGxpbmdzLCBhbGwgc3BlbGxpbmctcmVsYXRlZCBmdW5jdGlvbmFsaXR5CisgICAgLy8gY2FuIGJlIGVsaWRlZC4gSWYgYWxsIG9mIHRoZSBzcGVsbGluZ3Mgc2hhcmUgdGhlIHNhbWUgbmFtZSwgdGhlIHNwZWxsaW5nCisgICAgLy8gZnVuY3Rpb25hbGl0eSBjYW4gYWxzbyBiZSBlbGlkZWQuCisgICAgYm9vbCBFbGlkZVNwZWxsaW5nID0gKFNwZWxsaW5ncy5zaXplKCkgPD0gMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTcGVsbGluZ05hbWVzQXJlQ29tbW9uKFNwZWxsaW5ncyk7CisKKyAgICAvLyBUaGlzIG1hcHMgc3BlbGxpbmcgaW5kZXggdmFsdWVzIHRvIHNlbWFudGljIFNwZWxsaW5nIGVudW1lcmFudHMuCisgICAgU2VtYW50aWNTcGVsbGluZ01hcCBTZW1hbnRpY1RvU3ludGFjdGljTWFwOworCisgICAgaWYgKCFFbGlkZVNwZWxsaW5nKQorICAgICAgT1MgPDwgQ3JlYXRlU2VtYW50aWNTcGVsbGluZ3MoU3BlbGxpbmdzLCBTZW1hbnRpY1RvU3ludGFjdGljTWFwKTsKKworICAgIE9TIDw8ICIgIHN0YXRpYyAiIDw8IFIuZ2V0TmFtZSgpIDw8ICJBdHRyICpDcmVhdGVJbXBsaWNpdCgiOworICAgIE9TIDw8ICJBU1RDb250ZXh0ICZDdHgiOworICAgIGlmICghRWxpZGVTcGVsbGluZykKKyAgICAgIE9TIDw8ICIsIFNwZWxsaW5nIFMiOworICAgIGZvciAoYXV0byBjb25zdCAmYWkgOiBBcmdzKSB7CisgICAgICBPUyA8PCAiLCAiOworICAgICAgYWktPndyaXRlQ3RvclBhcmFtZXRlcnMoT1MpOworICAgIH0KKyAgICBPUyA8PCAiLCBTb3VyY2VSYW5nZSBMb2MgPSBTb3VyY2VSYW5nZSgpIjsKKyAgICBPUyA8PCAiKSB7XG4iOworICAgIE9TIDw8ICIgICAgIiA8PCBSLmdldE5hbWUoKSA8PCAiQXR0ciAqQSA9IG5ldyAoQ3R4KSAiIDw8IFIuZ2V0TmFtZSgpOworICAgIE9TIDw8ICJBdHRyKExvYywgQ3R4LCAiOworICAgIGZvciAoYXV0byBjb25zdCAmYWkgOiBBcmdzKSB7CisgICAgICBhaS0+d3JpdGVJbXBsaWNpdEN0b3JBcmdzKE9TKTsKKyAgICAgIE9TIDw8ICIsICI7CisgICAgfQorICAgIE9TIDw8IChFbGlkZVNwZWxsaW5nID8gIjAiIDogIlMiKSA8PCAiKTtcbiI7CisgICAgT1MgPDwgIiAgICBBLT5zZXRJbXBsaWNpdCh0cnVlKTtcbiI7CisgICAgT1MgPDwgIiAgICByZXR1cm4gQTtcbiAgfVxuXG4iOworCiAgICAgT1MgPDwgIiAgIiA8PCBSLmdldE5hbWUoKSA8PCAiQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHhcbiI7CiAgICAgCiAgICAgYm9vbCBIYXNPcHQgPSBmYWxzZTsKLSAgICBmb3IgKGFpID0gQXJncy5iZWdpbigpOyBhaSAhPSBhZTsgKythaSkgeworICAgIGZvciAoYXV0byBjb25zdCAmYWkgOiBBcmdzKSB7CiAgICAgICBPUyA8PCAiICAgICAgICAgICAgICAsICI7Ci0gICAgICAoKmFpKS0+d3JpdGVDdG9yUGFyYW1ldGVycyhPUyk7CisgICAgICBhaS0+d3JpdGVDdG9yUGFyYW1ldGVycyhPUyk7CiAgICAgICBPUyA8PCAiXG4iOwotICAgICAgaWYgKCgqYWkpLT5pc09wdGlvbmFsKCkpCisgICAgICBpZiAoYWktPmlzT3B0aW9uYWwoKSkKICAgICAgICAgSGFzT3B0ID0gdHJ1ZTsKICAgICB9CiAKICAgICBPUyA8PCAiICAgICAgICAgICAgICAsICI7Ci0gICAgT1MgPDwgInVuc2lnbmVkIFNJID0gMFxuIjsKKyAgICBPUyA8PCAidW5zaWduZWQgU0lcbiI7CiAKICAgICBPUyA8PCAiICAgICAgICAgICAgIClcbiI7CiAgICAgT1MgPDwgIiAgICA6ICIgPDwgU3VwZXJOYW1lIDw8ICIoYXR0cjo6IiA8PCBSLmdldE5hbWUoKSA8PCAiLCBSLCBTSSlcbiI7CiAKLSAgICBmb3IgKGFpID0gQXJncy5iZWdpbigpOyBhaSAhPSBhZTsgKythaSkgeworICAgIGZvciAoYXV0byBjb25zdCAmYWkgOiBBcmdzKSB7CiAgICAgICBPUyA8PCAiICAgICAgICAgICAgICAsICI7Ci0gICAgICAoKmFpKS0+d3JpdGVDdG9ySW5pdGlhbGl6ZXJzKE9TKTsKKyAgICAgIGFpLT53cml0ZUN0b3JJbml0aWFsaXplcnMoT1MpOwogICAgICAgT1MgPDwgIlxuIjsKICAgICB9CiAKICAgICBPUyA8PCAiICB7XG4iOwogICAKLSAgICBmb3IgKGFpID0gQXJncy5iZWdpbigpOyBhaSAhPSBhZTsgKythaSkgewotICAgICAgKCphaSktPndyaXRlQ3RvckJvZHkoT1MpOworICAgIGZvciAoYXV0byBjb25zdCAmYWkgOiBBcmdzKSB7CisgICAgICBhaS0+d3JpdGVDdG9yQm9keShPUyk7CiAgICAgICBPUyA8PCAiXG4iOwogICAgIH0KICAgICBPUyA8PCAiICB9XG5cbiI7CkBAIC0xMTIxLDU0ICsxNDYwLDYxIEBACiAgICAgLy8gb3B0aW9uYWwgYXJndW1lbnRzIGFzIHdlbGwuCiAgICAgaWYgKEhhc09wdCkgewogICAgICAgT1MgPDwgIiAgIiA8PCBSLmdldE5hbWUoKSA8PCAiQXR0cihTb3VyY2VSYW5nZSBSLCBBU1RDb250ZXh0ICZDdHhcbiI7Ci0gICAgICBmb3IgKGFpID0gQXJncy5iZWdpbigpOyBhaSAhPSBhZTsgKythaSkgewotICAgICAgICBpZiAoISgqYWkpLT5pc09wdGlvbmFsKCkpIHsKKyAgICAgIGZvciAoYXV0byBjb25zdCAmYWkgOiBBcmdzKSB7CisgICAgICAgIGlmICghYWktPmlzT3B0aW9uYWwoKSkgewogICAgICAgICAgIE9TIDw8ICIgICAgICAgICAgICAgICwgIjsKLSAgICAgICAgICAoKmFpKS0+d3JpdGVDdG9yUGFyYW1ldGVycyhPUyk7CisgICAgICAgICAgYWktPndyaXRlQ3RvclBhcmFtZXRlcnMoT1MpOwogICAgICAgICAgIE9TIDw8ICJcbiI7CiAgICAgICAgIH0KICAgICAgIH0KIAogICAgICAgT1MgPDwgIiAgICAgICAgICAgICAgLCAiOwotICAgICAgT1MgPDwgInVuc2lnbmVkIFNJID0gMFxuIjsKKyAgICAgIE9TIDw8ICJ1bnNpZ25lZCBTSVxuIjsKIAogICAgICAgT1MgPDwgIiAgICAgICAgICAgICApXG4iOwogICAgICAgT1MgPDwgIiAgICA6ICIgPDwgU3VwZXJOYW1lIDw8ICIoYXR0cjo6IiA8PCBSLmdldE5hbWUoKSA8PCAiLCBSLCBTSSlcbiI7CiAKLSAgICAgIGZvciAoYWkgPSBBcmdzLmJlZ2luKCk7IGFpICE9IGFlOyArK2FpKSB7CisgICAgICBmb3IgKGF1dG8gY29uc3QgJmFpIDogQXJncykgewogICAgICAgICBPUyA8PCAiICAgICAgICAgICAgICAsICI7Ci0gICAgICAgICgqYWkpLT53cml0ZUN0b3JEZWZhdWx0SW5pdGlhbGl6ZXJzKE9TKTsKKyAgICAgICAgYWktPndyaXRlQ3RvckRlZmF1bHRJbml0aWFsaXplcnMoT1MpOwogICAgICAgICBPUyA8PCAiXG4iOwogICAgICAgfQogCiAgICAgICBPUyA8PCAiICB7XG4iOwogICAKLSAgICAgIGZvciAoYWkgPSBBcmdzLmJlZ2luKCk7IGFpICE9IGFlOyArK2FpKSB7Ci0gICAgICAgIGlmICghKCphaSktPmlzT3B0aW9uYWwoKSkgewotICAgICAgICAgICgqYWkpLT53cml0ZUN0b3JCb2R5KE9TKTsKKyAgICAgIGZvciAoYXV0byBjb25zdCAmYWkgOiBBcmdzKSB7CisgICAgICAgIGlmICghYWktPmlzT3B0aW9uYWwoKSkgeworICAgICAgICAgIGFpLT53cml0ZUN0b3JCb2R5KE9TKTsKICAgICAgICAgICBPUyA8PCAiXG4iOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBPUyA8PCAiICB9XG5cbiI7CiAgICAgfQogCi0gICAgT1MgPDwgIiAgdmlydHVhbCAiIDw8IFIuZ2V0TmFtZSgpIDw8ICJBdHRyICpjbG9uZSAoQVNUQ29udGV4dCAmQykgY29uc3Q7XG4iOwotICAgIE9TIDw8ICIgIHZpcnR1YWwgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsXG4iCi0gICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByaW50aW5nUG9saWN5ICZQb2xpY3kpIGNvbnN0O1xuIjsKKyAgICBPUyA8PCAiICAiIDw8IFIuZ2V0TmFtZSgpIDw8ICJBdHRyICpjbG9uZShBU1RDb250ZXh0ICZDKSBjb25zdCBvdmVycmlkZTtcbiI7CisgICAgT1MgPDwgIiAgdm9pZCBwcmludFByZXR0eShyYXdfb3N0cmVhbSAmT1MsXG4iCisgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICBjb25zdCBQcmludGluZ1BvbGljeSAmUG9saWN5KSBjb25zdCBvdmVycmlkZTtcbiI7CisgICAgT1MgPDwgIiAgY29uc3QgY2hhciAqZ2V0U3BlbGxpbmcoKSBjb25zdCBvdmVycmlkZTtcbiI7CisgICAgCisgICAgaWYgKCFFbGlkZVNwZWxsaW5nKSB7CisgICAgICBhc3NlcnQoIVNlbWFudGljVG9TeW50YWN0aWNNYXAuZW1wdHkoKSAmJiAiRW1wdHkgc2VtYW50aWMgbWFwcGluZyBsaXN0Iik7CisgICAgICBPUyA8PCAiICBTcGVsbGluZyBnZXRTZW1hbnRpY1NwZWxsaW5nKCkgY29uc3Qge1xuIjsKKyAgICAgIFdyaXRlU2VtYW50aWNTcGVsbGluZ1N3aXRjaCgiU3BlbGxpbmdMaXN0SW5kZXgiLCBTZW1hbnRpY1RvU3ludGFjdGljTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TKTsKKyAgICAgIE9TIDw8ICIgIH1cbiI7CisgICAgfQogCiAgICAgd3JpdGVBdHRyQWNjZXNzb3JEZWZpbml0aW9uKFIsIE9TKTsKIAotICAgIGZvciAoYWkgPSBBcmdzLmJlZ2luKCk7IGFpICE9IGFlOyArK2FpKSB7Ci0gICAgICAoKmFpKS0+d3JpdGVBY2Nlc3NvcnMoT1MpOworICAgIGZvciAoYXV0byBjb25zdCAmYWkgOiBBcmdzKSB7CisgICAgICBhaS0+d3JpdGVBY2Nlc3NvcnMoT1MpOwogICAgICAgT1MgPDwgIlxuXG4iOwogCi0gICAgICBpZiAoKCphaSktPmlzRW51bUFyZygpKSB7Ci0gICAgICAgIEVudW1Bcmd1bWVudCAqRUEgPSAoRW51bUFyZ3VtZW50ICopKmFpOwotICAgICAgICBFQS0+d3JpdGVDb252ZXJzaW9uKE9TKTsKLSAgICAgIH0gZWxzZSBpZiAoKCphaSktPmlzVmFyaWFkaWNFbnVtQXJnKCkpIHsKLSAgICAgICAgVmFyaWFkaWNFbnVtQXJndW1lbnQgKlZFQSA9IChWYXJpYWRpY0VudW1Bcmd1bWVudCAqKSphaTsKLSAgICAgICAgVkVBLT53cml0ZUNvbnZlcnNpb24oT1MpOwotICAgICAgfQorICAgICAgaWYgKGFpLT5pc0VudW1BcmcoKSkKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgRW51bUFyZ3VtZW50ICo+KGFpLmdldCgpKS0+d3JpdGVDb252ZXJzaW9uKE9TKTsKKyAgICAgIGVsc2UgaWYgKGFpLT5pc1ZhcmlhZGljRW51bUFyZygpKQorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBWYXJpYWRpY0VudW1Bcmd1bWVudCAqPihhaS5nZXQoKSkKKyAgICAgICAgICAgIC0+d3JpdGVDb252ZXJzaW9uKE9TKTsKICAgICB9CiAKICAgICBPUyA8PCBSLmdldFZhbHVlQXNTdHJpbmcoIkFkZGl0aW9uYWxNZW1iZXJzIik7CkBAIC0xMTc4LDExNCArMTUyNCw0OSBAQAogICAgICAgIDw8ICJhdHRyOjoiIDw8IFIuZ2V0TmFtZSgpIDw8ICI7IH1cbiI7CiAKICAgICBib29sIExhdGVQYXJzZWQgPSBSLmdldFZhbHVlQXNCaXQoIkxhdGVQYXJzZWQiKTsKLSAgICBPUyA8PCAiICB2aXJ0dWFsIGJvb2wgaXNMYXRlUGFyc2VkKCkgY29uc3QgeyByZXR1cm4gIgorICAgIE9TIDw8ICIgIGJvb2wgaXNMYXRlUGFyc2VkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIgogICAgICAgIDw8IExhdGVQYXJzZWQgPDwgIjsgfVxuIjsKIAorICAgIGlmIChSLmdldFZhbHVlQXNCaXQoIkR1cGxpY2F0ZXNBbGxvd2VkV2hpbGVNZXJnaW5nIikpCisgICAgICBPUyA8PCAiICBib29sIGR1cGxpY2F0ZXNBbGxvd2VkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfVxuXG4iOworCiAgICAgT1MgPDwgIn07XG5cbiI7CiAgIH0KIAogICBPUyA8PCAiI2VuZGlmXG4iOwogfQogCi1zdGF0aWMgYm9vbCBpc0lkZW50aWZpZXJBcmd1bWVudChSZWNvcmQgKkFyZykgewotICByZXR1cm4gIUFyZy0+Z2V0U3VwZXJDbGFzc2VzKCkuZW1wdHkoKSAmJgotICAgICAgICAgbGx2bTo6U3RyaW5nU3dpdGNoPGJvb2w+KEFyZy0+Z2V0U3VwZXJDbGFzc2VzKCkuYmFjaygpLT5nZXROYW1lKCkpCi0gICAgICAgICAgICAgLkNhc2UoIklkZW50aWZpZXJBcmd1bWVudCIsIHRydWUpCi0gICAgICAgICAgICAgLkNhc2UoIkVudW1Bcmd1bWVudCIsIHRydWUpCi0gICAgICAgICAgICAgLkRlZmF1bHQoZmFsc2UpOwotfQotCi0vLy8gXGJyaWVmIEVtaXRzIHRoZSBmaXJzdC1hcmd1bWVudC1pcy10eXBlIHByb3BlcnR5IGZvciBhdHRyaWJ1dGVzLgotdm9pZCBFbWl0Q2xhbmdBdHRyVHlwZUFyZ0xpc3QoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpIHsKLSAgZW1pdFNvdXJjZUZpbGVIZWFkZXIoImxsdm06OlN0cmluZ1N3aXRjaCBjb2RlIHRvIG1hdGNoIGF0dHJpYnV0ZXMgd2l0aCBhICIKLSAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgYXJndW1lbnQiLCBPUyk7Ci0KLSAgc3RkOjp2ZWN0b3I8UmVjb3JkICo+IEF0dHJzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkF0dHIiKTsKLQotICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCAqPjo6aXRlcmF0b3IgSSA9IEF0dHJzLmJlZ2luKCksIEUgPSBBdHRycy5lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIFJlY29yZCAmQXR0ciA9ICoqSTsKLQotICAgIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHR5cGUuCi0gICAgc3RkOjp2ZWN0b3I8UmVjb3JkICo+IEFyZ3MgPSBBdHRyLmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJBcmdzIik7Ci0gICAgaWYgKEFyZ3MuZW1wdHkoKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaWYgKEFyZ3NbMF0tPmdldFN1cGVyQ2xhc3NlcygpLmJhY2soKS0+Z2V0TmFtZSgpICE9ICJUeXBlQXJndW1lbnQiKQotICAgICAgY29udGludWU7Ci0KLSAgICAvLyBBbGwgdGhlc2Ugc3BlbGxpbmdzIHRha2UgYSBzaW5nbGUgdHlwZSBhcmd1bWVudC4KLSAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBTcGVsbGluZ3MgPSBBdHRyLmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJTcGVsbGluZ3MiKTsKLSAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gRW1pdHRlZDsKLSAgICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+Ojpjb25zdF9pdGVyYXRvciBJID0gU3BlbGxpbmdzLmJlZ2luKCksCi0gICAgICAgICBFID0gU3BlbGxpbmdzLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgaWYgKEVtaXR0ZWQuaW5zZXJ0KCgqSSktPmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKSkuc2Vjb25kKQotICAgICAgICBPUyA8PCAiLkNhc2UoXCIiIDw8ICgqSSktPmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKSA8PCAiXCIsICIKLSAgICAgICAgICAgPDwgInRydWUiIDw8ICIpXG4iOwotICAgIH0KLSAgfQotfQotCi0vLyBFbWl0cyB0aGUgZmlyc3QtYXJndW1lbnQtaXMtaWRlbnRpZmllciBwcm9wZXJ0eSBmb3IgYXR0cmlidXRlcy4KLXZvaWQgRW1pdENsYW5nQXR0cklkZW50aWZpZXJBcmdMaXN0KFJlY29yZEtlZXBlciAmUmVjb3JkcywgcmF3X29zdHJlYW0gJk9TKSB7Ci0gIGVtaXRTb3VyY2VGaWxlSGVhZGVyKCJsbHZtOjpTdHJpbmdTd2l0Y2ggY29kZSB0byBtYXRjaCBhdHRyaWJ1dGVzIHdpdGggIgotICAgICAgICAgICAgICAgICAgICAgICAiYW4gaWRlbnRpZmllciBhcmd1bWVudCIsIE9TKTsKLQotICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBBdHRycyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJBdHRyIik7Ci0KLSAgZm9yIChzdGQ6OnZlY3RvcjxSZWNvcmQqPjo6aXRlcmF0b3IgSSA9IEF0dHJzLmJlZ2luKCksIEUgPSBBdHRycy5lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIFJlY29yZCAmQXR0ciA9ICoqSTsKLQotICAgIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbiBpZGVudGlmaWVyLgotICAgIHN0ZDo6dmVjdG9yPFJlY29yZCAqPiBBcmdzID0gQXR0ci5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiQXJncyIpOwotICAgIGlmIChBcmdzLmVtcHR5KCkgfHwgIWlzSWRlbnRpZmllckFyZ3VtZW50KEFyZ3NbMF0pKQotICAgICAgY29udGludWU7Ci0KLSAgICAvLyBBbGwgdGhlc2Ugc3BlbGxpbmdzIHRha2UgYW4gaWRlbnRpZmllciBhcmd1bWVudC4KLSAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBTcGVsbGluZ3MgPSBBdHRyLmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJTcGVsbGluZ3MiKTsKLSAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gRW1pdHRlZDsKLSAgICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+Ojpjb25zdF9pdGVyYXRvciBJID0gU3BlbGxpbmdzLmJlZ2luKCksCi0gICAgICAgICBFID0gU3BlbGxpbmdzLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgaWYgKEVtaXR0ZWQuaW5zZXJ0KCgqSSktPmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKSkuc2Vjb25kKQotICAgICAgICBPUyA8PCAiLkNhc2UoXCIiIDw8ICgqSSktPmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKSA8PCAiXCIsICIKLSAgICAgICAgICAgPDwgInRydWUiIDw8ICIpXG4iOwotICAgIH0KLSAgfQotfQotCiAvLyBFbWl0cyB0aGUgY2xhc3MgbWV0aG9kIGRlZmluaXRpb25zIGZvciBhdHRyaWJ1dGVzLgogdm9pZCBFbWl0Q2xhbmdBdHRySW1wbChSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUykgewogICBlbWl0U291cmNlRmlsZUhlYWRlcigiQXR0cmlidXRlIGNsYXNzZXMnIG1lbWJlciBmdW5jdGlvbiBkZWZpbml0aW9ucyIsIE9TKTsKIAogICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBBdHRycyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJBdHRyIik7Ci0gIHN0ZDo6dmVjdG9yPFJlY29yZCo+OjppdGVyYXRvciBpID0gQXR0cnMuYmVnaW4oKSwgZSA9IEF0dHJzLmVuZCgpLCByaSwgcmU7Ci0gIHN0ZDo6dmVjdG9yPEFyZ3VtZW50Kj46Oml0ZXJhdG9yIGFpLCBhZTsKIAotICBmb3IgKDsgaSAhPSBlOyArK2kpIHsKLSAgICBSZWNvcmQgJlIgPSAqKmk7CisgIGZvciAoYXV0byBpIDogQXR0cnMpIHsKKyAgICBSZWNvcmQgJlIgPSAqaTsKICAgICAKICAgICBpZiAoIVIuZ2V0VmFsdWVBc0JpdCgiQVNUTm9kZSIpKQogICAgICAgY29udGludWU7Ci0gICAgCi0gICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gQXJnUmVjb3JkcyA9IFIuZ2V0VmFsdWVBc0xpc3RPZkRlZnMoIkFyZ3MiKTsKLSAgICBzdGQ6OnZlY3RvcjxBcmd1bWVudCo+IEFyZ3M7Ci0gICAgZm9yIChyaSA9IEFyZ1JlY29yZHMuYmVnaW4oKSwgcmUgPSBBcmdSZWNvcmRzLmVuZCgpOyByaSAhPSByZTsgKytyaSkKLSAgICAgIEFyZ3MucHVzaF9iYWNrKGNyZWF0ZUFyZ3VtZW50KCoqcmksIFIuZ2V0TmFtZSgpKSk7CiAKLSAgICBmb3IgKGFpID0gQXJncy5iZWdpbigpLCBhZSA9IEFyZ3MuZW5kKCk7IGFpICE9IGFlOyArK2FpKQotICAgICAgKCphaSktPndyaXRlQWNjZXNzb3JEZWZpbml0aW9ucyhPUyk7CisgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gQXJnUmVjb3JkcyA9IFIuZ2V0VmFsdWVBc0xpc3RPZkRlZnMoIkFyZ3MiKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QXJndW1lbnQ+PiBBcmdzOworICAgIGZvciAoYXV0byByaSA6IEFyZ1JlY29yZHMpCisgICAgICBBcmdzLmVtcGxhY2VfYmFjayhjcmVhdGVBcmd1bWVudCgqcmksIFIuZ2V0TmFtZSgpKSk7CisKKyAgICBmb3IgKGF1dG8gY29uc3QgJmFpIDogQXJncykKKyAgICAgIGFpLT53cml0ZUFjY2Vzc29yRGVmaW5pdGlvbnMoT1MpOwogCiAgICAgT1MgPDwgUi5nZXROYW1lKCkgPDwgIkF0dHIgKiIgPDwgUi5nZXROYW1lKCkKICAgICAgICA8PCAiQXR0cjo6Y2xvbmUoQVNUQ29udGV4dCAmQykgY29uc3Qge1xuIjsKICAgICBPUyA8PCAiICByZXR1cm4gbmV3IChDKSAiIDw8IFIuZ2V0TmFtZSgpIDw8ICJBdHRyKGdldExvY2F0aW9uKCksIEMiOwotICAgIGZvciAoYWkgPSBBcmdzLmJlZ2luKCk7IGFpICE9IGFlOyArK2FpKSB7CisgICAgZm9yIChhdXRvIGNvbnN0ICZhaSA6IEFyZ3MpIHsKICAgICAgIE9TIDw8ICIsICI7Ci0gICAgICAoKmFpKS0+d3JpdGVDbG9uZUFyZ3MoT1MpOworICAgICAgYWktPndyaXRlQ2xvbmVBcmdzKE9TKTsKICAgICB9CiAgICAgT1MgPDwgIiwgZ2V0U3BlbGxpbmdMaXN0SW5kZXgoKSk7XG59XG5cbiI7CiAKICAgICB3cml0ZVByZXR0eVByaW50RnVuY3Rpb24oUiwgQXJncywgT1MpOworICAgIHdyaXRlR2V0U3BlbGxpbmdGdW5jdGlvbihSLCBPUyk7CiAgIH0KIH0KIApAQCAtMTMzNSw0NiArMTYxNiwzMCBAQAogICAgICAgICAiIElOSEVSSVRBQkxFX1BBUkFNX0FUVFIoTkFNRSlcbiI7CiAgIE9TIDw8ICIjZW5kaWZcblxuIjsKIAotICBPUyA8PCAiI2lmbmRlZiBNU19JTkhFUklUQU5DRV9BVFRSXG4iOwotICBPUyA8PCAiI2RlZmluZSBNU19JTkhFUklUQU5DRV9BVFRSKE5BTUUpIElOSEVSSVRBQkxFX0FUVFIoTkFNRSlcbiI7Ci0gIE9TIDw8ICIjZW5kaWZcblxuIjsKLQotICBPUyA8PCAiI2lmbmRlZiBMQVNUX01TX0lOSEVSSVRBTkNFX0FUVFJcbiI7Ci0gIE9TIDw8ICIjZGVmaW5lIExBU1RfTVNfSU5IRVJJVEFOQ0VfQVRUUihOQU1FKSIKLSAgICAgICAgIiBNU19JTkhFUklUQU5DRV9BVFRSKE5BTUUpXG4iOwotICBPUyA8PCAiI2VuZGlmXG5cbiI7Ci0KICAgUmVjb3JkICpJbmhDbGFzcyA9IFJlY29yZHMuZ2V0Q2xhc3MoIkluaGVyaXRhYmxlQXR0ciIpOwogICBSZWNvcmQgKkluaFBhcmFtQ2xhc3MgPSBSZWNvcmRzLmdldENsYXNzKCJJbmhlcml0YWJsZVBhcmFtQXR0ciIpOwotICBSZWNvcmQgKk1TSW5oZXJpdGFuY2VDbGFzcyA9IFJlY29yZHMuZ2V0Q2xhc3MoIk1TSW5oZXJpdGFuY2VBdHRyIik7CiAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEF0dHJzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkF0dHIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgTm9uSW5oQXR0cnMsIEluaEF0dHJzLCBJbmhQYXJhbUF0dHJzLCBNU0luaEF0dHJzOwotICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+OjppdGVyYXRvciBpID0gQXR0cnMuYmVnaW4oKSwgZSA9IEF0dHJzLmVuZCgpOwotICAgICAgIGkgIT0gZTsgKytpKSB7Ci0gICAgaWYgKCEoKmkpLT5nZXRWYWx1ZUFzQml0KCJBU1ROb2RlIikpCisgICAgICAgICAgICAgICAgICAgICAgIE5vbkluaEF0dHJzLCBJbmhBdHRycywgSW5oUGFyYW1BdHRyczsKKyAgZm9yIChhdXRvIGkgOiBBdHRycykgeworICAgIGlmICghaS0+Z2V0VmFsdWVBc0JpdCgiQVNUTm9kZSIpKQogICAgICAgY29udGludWU7CiAgICAgCi0gICAgaWYgKCgqaSktPmlzU3ViQ2xhc3NPZihJbmhQYXJhbUNsYXNzKSkKLSAgICAgIEluaFBhcmFtQXR0cnMucHVzaF9iYWNrKCppKTsKLSAgICBlbHNlIGlmICgoKmkpLT5pc1N1YkNsYXNzT2YoTVNJbmhlcml0YW5jZUNsYXNzKSkKLSAgICAgIE1TSW5oQXR0cnMucHVzaF9iYWNrKCppKTsKLSAgICBlbHNlIGlmICgoKmkpLT5pc1N1YkNsYXNzT2YoSW5oQ2xhc3MpKQotICAgICAgSW5oQXR0cnMucHVzaF9iYWNrKCppKTsKKyAgICBpZiAoaS0+aXNTdWJDbGFzc09mKEluaFBhcmFtQ2xhc3MpKQorICAgICAgSW5oUGFyYW1BdHRycy5wdXNoX2JhY2soaSk7CisgICAgZWxzZSBpZiAoaS0+aXNTdWJDbGFzc09mKEluaENsYXNzKSkKKyAgICAgIEluaEF0dHJzLnB1c2hfYmFjayhpKTsKICAgICBlbHNlCi0gICAgICBOb25JbmhBdHRycy5wdXNoX2JhY2soKmkpOworICAgICAgTm9uSW5oQXR0cnMucHVzaF9iYWNrKGkpOwogICB9CiAKICAgRW1pdEF0dHJMaXN0KE9TLCAiSU5IRVJJVEFCTEVfUEFSQU1fQVRUUiIsIEluaFBhcmFtQXR0cnMpOwotICBFbWl0QXR0ckxpc3QoT1MsICJNU19JTkhFUklUQU5DRV9BVFRSIiwgTVNJbmhBdHRycyk7CiAgIEVtaXRBdHRyTGlzdChPUywgIklOSEVSSVRBQkxFX0FUVFIiLCBJbmhBdHRycyk7CiAgIEVtaXRBdHRyTGlzdChPUywgIkFUVFIiLCBOb25JbmhBdHRycyk7CiAKICAgT1MgPDwgIiN1bmRlZiBMQVNUX0FUVFJcbiI7CiAgIE9TIDw8ICIjdW5kZWYgSU5IRVJJVEFCTEVfQVRUUlxuIjsKLSAgT1MgPDwgIiN1bmRlZiBNU19JTkhFUklUQU5DRV9BVFRSXG4iOwogICBPUyA8PCAiI3VuZGVmIExBU1RfSU5IRVJJVEFCTEVfQVRUUlxuIjsKICAgT1MgPDwgIiN1bmRlZiBMQVNUX0lOSEVSSVRBQkxFX1BBUkFNX0FUVFJcbiI7Ci0gIE9TIDw8ICIjdW5kZWYgTEFTVF9NU19JTkhFUklUQU5DRV9BVFRSXG4iOwogICBPUyA8PCAiI3VuZGVmIEFUVFJcbiI7CiB9CiAKQEAgLTEzODUsMzcgKzE2NTAsMzcgQEAKICAgUmVjb3JkICpJbmhDbGFzcyA9IFJlY29yZHMuZ2V0Q2xhc3MoIkluaGVyaXRhYmxlQXR0ciIpOwogICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBBdHRycyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJBdHRyIiksCiAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1JlY29yZHM7Ci0gIHN0ZDo6dmVjdG9yPFJlY29yZCo+OjppdGVyYXRvciBpID0gQXR0cnMuYmVnaW4oKSwgZSA9IEF0dHJzLmVuZCgpLCBhaSwgYWU7Ci0gIHN0ZDo6dmVjdG9yPEFyZ3VtZW50Kj4gQXJnczsKLSAgc3RkOjp2ZWN0b3I8QXJndW1lbnQqPjo6aXRlcmF0b3IgcmksIHJlOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QXJndW1lbnQ+PiBBcmdzOwogCiAgIE9TIDw8ICIgIHN3aXRjaCAoS2luZCkge1xuIjsKICAgT1MgPDwgIiAgZGVmYXVsdDpcbiI7CiAgIE9TIDw8ICIgICAgYXNzZXJ0KDAgJiYgXCJVbmtub3duIGF0dHJpYnV0ZSFcIik7XG4iOwogICBPUyA8PCAiICAgIGJyZWFrO1xuIjsKLSAgZm9yICg7IGkgIT0gZTsgKytpKSB7Ci0gICAgUmVjb3JkICZSID0gKippOworICBmb3IgKGF1dG8gaSA6IEF0dHJzKSB7CisgICAgY29uc3QgUmVjb3JkICZSID0gKmk7CiAgICAgaWYgKCFSLmdldFZhbHVlQXNCaXQoIkFTVE5vZGUiKSkKICAgICAgIGNvbnRpbnVlOwogICAgIAogICAgIE9TIDw8ICIgIGNhc2UgYXR0cjo6IiA8PCBSLmdldE5hbWUoKSA8PCAiOiB7XG4iOwogICAgIGlmIChSLmlzU3ViQ2xhc3NPZihJbmhDbGFzcykpCiAgICAgICBPUyA8PCAiICAgIGJvb2wgaXNJbmhlcml0ZWQgPSBSZWNvcmRbSWR4KytdO1xuIjsKKyAgICBPUyA8PCAiICAgIGJvb2wgaXNJbXBsaWNpdCA9IFJlY29yZFtJZHgrK107XG4iOworICAgIE9TIDw8ICIgICAgdW5zaWduZWQgU3BlbGxpbmcgPSBSZWNvcmRbSWR4KytdO1xuIjsKICAgICBBcmdSZWNvcmRzID0gUi5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiQXJncyIpOwogICAgIEFyZ3MuY2xlYXIoKTsKLSAgICBmb3IgKGFpID0gQXJnUmVjb3Jkcy5iZWdpbigpLCBhZSA9IEFyZ1JlY29yZHMuZW5kKCk7IGFpICE9IGFlOyArK2FpKSB7Ci0gICAgICBBcmd1bWVudCAqQSA9IGNyZWF0ZUFyZ3VtZW50KCoqYWksIFIuZ2V0TmFtZSgpKTsKLSAgICAgIEFyZ3MucHVzaF9iYWNrKEEpOwotICAgICAgQS0+d3JpdGVQQ0hSZWFkRGVjbHMoT1MpOworICAgIGZvciAoYXV0byBhaSA6IEFyZ1JlY29yZHMpIHsKKyAgICAgIEFyZ3MuZW1wbGFjZV9iYWNrKGNyZWF0ZUFyZ3VtZW50KCphaSwgUi5nZXROYW1lKCkpKTsKKyAgICAgIEFyZ3MuYmFjaygpLT53cml0ZVBDSFJlYWREZWNscyhPUyk7CiAgICAgfQogICAgIE9TIDw8ICIgICAgTmV3ID0gbmV3IChDb250ZXh0KSAiIDw8IFIuZ2V0TmFtZSgpIDw8ICJBdHRyKFJhbmdlLCBDb250ZXh0IjsKLSAgICBmb3IgKHJpID0gQXJncy5iZWdpbigpLCByZSA9IEFyZ3MuZW5kKCk7IHJpICE9IHJlOyArK3JpKSB7CisgICAgZm9yIChhdXRvIGNvbnN0ICZyaSA6IEFyZ3MpIHsKICAgICAgIE9TIDw8ICIsICI7Ci0gICAgICAoKnJpKS0+d3JpdGVQQ0hSZWFkQXJncyhPUyk7CisgICAgICByaS0+d3JpdGVQQ0hSZWFkQXJncyhPUyk7CiAgICAgfQotICAgIE9TIDw8ICIpO1xuIjsKKyAgICBPUyA8PCAiLCBTcGVsbGluZyk7XG4iOwogICAgIGlmIChSLmlzU3ViQ2xhc3NPZihJbmhDbGFzcykpCiAgICAgICBPUyA8PCAiICAgIGNhc3Q8SW5oZXJpdGFibGVBdHRyPihOZXcpLT5zZXRJbmhlcml0ZWQoaXNJbmhlcml0ZWQpO1xuIjsKKyAgICBPUyA8PCAiICAgIE5ldy0+c2V0SW1wbGljaXQoaXNJbXBsaWNpdCk7XG4iOwogICAgIE9TIDw8ICIgICAgYnJlYWs7XG4iOwogICAgIE9TIDw8ICIgIH1cbiI7CiAgIH0KQEAgLTE0MjgsMTQgKzE2OTMsMTMgQEAKIAogICBSZWNvcmQgKkluaENsYXNzID0gUmVjb3Jkcy5nZXRDbGFzcygiSW5oZXJpdGFibGVBdHRyIik7CiAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IEF0dHJzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkF0dHIiKSwgQXJnczsKLSAgc3RkOjp2ZWN0b3I8UmVjb3JkKj46Oml0ZXJhdG9yIGkgPSBBdHRycy5iZWdpbigpLCBlID0gQXR0cnMuZW5kKCksIGFpLCBhZTsKIAogICBPUyA8PCAiICBzd2l0Y2ggKEEtPmdldEtpbmQoKSkge1xuIjsKICAgT1MgPDwgIiAgZGVmYXVsdDpcbiI7CiAgIE9TIDw8ICIgICAgbGx2bV91bnJlYWNoYWJsZShcIlVua25vd24gYXR0cmlidXRlIGtpbmQhXCIpO1xuIjsKICAgT1MgPDwgIiAgICBicmVhaztcbiI7Ci0gIGZvciAoOyBpICE9IGU7ICsraSkgewotICAgIFJlY29yZCAmUiA9ICoqaTsKKyAgZm9yIChhdXRvIGkgOiBBdHRycykgeworICAgIGNvbnN0IFJlY29yZCAmUiA9ICppOwogICAgIGlmICghUi5nZXRWYWx1ZUFzQml0KCJBU1ROb2RlIikpCiAgICAgICBjb250aW51ZTsKICAgICBPUyA8PCAiICBjYXNlIGF0dHI6OiIgPDwgUi5nZXROYW1lKCkgPDwgIjoge1xuIjsKQEAgLTE0NDUsMzEgKzE3MDksMTI0IEBACiAgICAgICAgICA8PCAiQXR0cj4oQSk7XG4iOwogICAgIGlmIChSLmlzU3ViQ2xhc3NPZihJbmhDbGFzcykpCiAgICAgICBPUyA8PCAiICAgIFJlY29yZC5wdXNoX2JhY2soU0EtPmlzSW5oZXJpdGVkKCkpO1xuIjsKLSAgICBmb3IgKGFpID0gQXJncy5iZWdpbigpLCBhZSA9IEFyZ3MuZW5kKCk7IGFpICE9IGFlOyArK2FpKQotICAgICAgY3JlYXRlQXJndW1lbnQoKiphaSwgUi5nZXROYW1lKCkpLT53cml0ZVBDSFdyaXRlKE9TKTsKKyAgICBPUyA8PCAiICAgIFJlY29yZC5wdXNoX2JhY2soQS0+aXNJbXBsaWNpdCgpKTtcbiI7CisgICAgT1MgPDwgIiAgICBSZWNvcmQucHVzaF9iYWNrKEEtPmdldFNwZWxsaW5nTGlzdEluZGV4KCkpO1xuIjsKKworICAgIGZvciAoYXV0byBhaSA6IEFyZ3MpCisgICAgICBjcmVhdGVBcmd1bWVudCgqYWksIFIuZ2V0TmFtZSgpKS0+d3JpdGVQQ0hXcml0ZShPUyk7CiAgICAgT1MgPDwgIiAgICBicmVhaztcbiI7CiAgICAgT1MgPDwgIiAgfVxuIjsKICAgfQogICBPUyA8PCAiICB9XG4iOwogfQogCitzdGF0aWMgdm9pZCBHZW5lcmF0ZUhhc0F0dHJTcGVsbGluZ1N0cmluZ1N3aXRjaCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZWNvcmQgKj4gJkF0dHJzLCByYXdfb3N0cmVhbSAmT1MsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJlZhcmlldHkgPSAiIiwgY29uc3Qgc3RkOjpzdHJpbmcgJlNjb3BlID0gIiIpIHsKKyAgZm9yIChjb25zdCBhdXRvICpBdHRyIDogQXR0cnMpIHsKKyAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUgd2lsbCBiZSBhbiBsbHZtOjpUcmlwbGUgb2JqZWN0IG5hbWVkIFQgd2l0aGluCisgICAgLy8gc2NvcGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgYXR0cmlidXRlIGV4aXN0cyBpbgorICAgIC8vIGEgZ2l2ZW4gdGFyZ2V0LgorICAgIHN0ZDo6c3RyaW5nIFRlc3Q7CisgICAgaWYgKEF0dHItPmlzU3ViQ2xhc3NPZigiVGFyZ2V0U3BlY2lmaWNBdHRyIikpIHsKKyAgICAgIGNvbnN0IFJlY29yZCAqUiA9IEF0dHItPmdldFZhbHVlQXNEZWYoIlRhcmdldCIpOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEFyY2hlcyA9IFItPmdldFZhbHVlQXNMaXN0T2ZTdHJpbmdzKCJBcmNoZXMiKTsKKworICAgICAgVGVzdCArPSAiKCI7CisgICAgICBmb3IgKGF1dG8gQUkgPSBBcmNoZXMuYmVnaW4oKSwgQUUgPSBBcmNoZXMuZW5kKCk7IEFJICE9IEFFOyArK0FJKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIFBhcnQgPSAqQUk7CisgICAgICAgIFRlc3QgKz0gIlQuZ2V0QXJjaCgpID09IGxsdm06OlRyaXBsZTo6IiArIFBhcnQ7CisgICAgICAgIGlmIChBSSArIDEgIT0gQUUpCisgICAgICAgICAgVGVzdCArPSAiIHx8ICI7CisgICAgICB9CisgICAgICBUZXN0ICs9ICIpIjsKKworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE9TZXM7CisgICAgICBpZiAoIVItPmlzVmFsdWVVbnNldCgiT1NlcyIpKSB7CisgICAgICAgIFRlc3QgKz0gIiAmJiAoIjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE9TZXMgPSBSLT5nZXRWYWx1ZUFzTGlzdE9mU3RyaW5ncygiT1NlcyIpOworICAgICAgICBmb3IgKGF1dG8gQUkgPSBPU2VzLmJlZ2luKCksIEFFID0gT1Nlcy5lbmQoKTsgQUkgIT0gQUU7ICsrQUkpIHsKKyAgICAgICAgICBzdGQ6OnN0cmluZyBQYXJ0ID0gKkFJOworCisgICAgICAgICAgVGVzdCArPSAiVC5nZXRPUygpID09IGxsdm06OlRyaXBsZTo6IiArIFBhcnQ7CisgICAgICAgICAgaWYgKEFJICsgMSAhPSBBRSkKKyAgICAgICAgICAgIFRlc3QgKz0gIiB8fCAiOworICAgICAgICB9CisgICAgICAgIFRlc3QgKz0gIikiOworICAgICAgfQorICAgICAgCisgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBDKysxMSB2YXJpZXR5LCBhbHNvIGFkZCBpbiB0aGUgTGFuZ09wdHMgdGVzdC4KKyAgICAgIGlmIChWYXJpZXR5ID09ICJDWFgxMSIpCisgICAgICAgIFRlc3QgKz0gIiAmJiBMYW5nT3B0cy5DUGx1c1BsdXMxMSI7CisgICAgfSBlbHNlIGlmIChWYXJpZXR5ID09ICJDWFgxMSIpCisgICAgICAvLyBDKysxMSBtb2RlIHNob3VsZCBiZSBjaGVja2VkIGFnYWluc3QgTGFuZ09wdHMsIHdoaWNoIGlzIHByZXN1bWVkIHRvIGJlCisgICAgICAvLyBwcmVzZW50IGluIHRoZSBjYWxsZXIuCisgICAgICBUZXN0ID0gIkxhbmdPcHRzLkNQbHVzUGx1czExIjsKKyAgICBlbHNlCisgICAgICBUZXN0ID0gInRydWUiOworCisgICAgc3RkOjp2ZWN0b3I8RmxhdHRlbmVkU3BlbGxpbmc+IFNwZWxsaW5ncyA9IEdldEZsYXR0ZW5lZFNwZWxsaW5ncygqQXR0cik7CisgICAgZm9yIChjb25zdCBhdXRvICZTIDogU3BlbGxpbmdzKQorICAgICAgaWYgKFZhcmlldHkuZW1wdHkoKSB8fCAoVmFyaWV0eSA9PSBTLnZhcmlldHkoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNjb3BlLmVtcHR5KCkgfHwgU2NvcGUgPT0gUy5uYW1lU3BhY2UoKSkpKQorICAgICAgICBPUyA8PCAiICAgIC5DYXNlKFwiIiA8PCBTLm5hbWUoKSA8PCAiXCIsICIgPDwgVGVzdCA8PCAiKVxuIjsKKyAgfQorICBPUyA8PCAiICAgIC5EZWZhdWx0KGZhbHNlKTtcbiI7Cit9CisKIC8vIEVtaXRzIHRoZSBsaXN0IG9mIHNwZWxsaW5ncyBmb3IgYXR0cmlidXRlcy4KLXZvaWQgRW1pdENsYW5nQXR0clNwZWxsaW5nTGlzdChSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUykgewotICBlbWl0U291cmNlRmlsZUhlYWRlcigibGx2bTo6U3RyaW5nU3dpdGNoIGNvZGUgdG8gbWF0Y2ggYWxsIGtub3duIGF0dHJpYnV0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICBPUyk7Cit2b2lkIEVtaXRDbGFuZ0F0dHJIYXNBdHRySW1wbChSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUykgeworICBlbWl0U291cmNlRmlsZUhlYWRlcigiQ29kZSB0byBpbXBsZW1lbnQgdGhlIF9faGFzX2F0dHJpYnV0ZSBsb2dpYyIsIE9TKTsKIAotICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBBdHRycyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJBdHRyIik7Ci0gIAotICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+OjppdGVyYXRvciBJID0gQXR0cnMuYmVnaW4oKSwgRSA9IEF0dHJzLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgIFJlY29yZCAmQXR0ciA9ICoqSTsKKyAgLy8gU2VwYXJhdGUgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG91dCBpbnRvIGZvdXIgZ3JvdXA6IGdlbmVyaWMsIEMrKzExLCBHTlUsCisgIC8vIGFuZCBkZWNsc3BlY3MuIFRoZW4gZ2VuZXJhdGUgYSBiaWcgc3dpdGNoIHN0YXRlbWVudCBmb3IgZWFjaCBvZiB0aGVtLgorICBzdGQ6OnZlY3RvcjxSZWNvcmQgKj4gQXR0cnMgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiQXR0ciIpOworICBzdGQ6OnZlY3RvcjxSZWNvcmQgKj4gRGVjbHNwZWMsIEdOVTsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPFJlY29yZCAqPj4gQ1hYOwogCi0gICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gU3BlbGxpbmdzID0gQXR0ci5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiU3BlbGxpbmdzIik7Ci0KLSAgICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+Ojpjb25zdF9pdGVyYXRvciBJID0gU3BlbGxpbmdzLmJlZ2luKCksIEUgPSBTcGVsbGluZ3MuZW5kKCk7IEkgIT0gRTsgKytJKSB7Ci0gICAgICBPUyA8PCAiLkNhc2UoXCIiIDw8ICgqSSktPmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKSA8PCAiXCIsIHRydWUpXG4iOworICAvLyBXYWxrIG92ZXIgdGhlIGxpc3Qgb2YgYWxsIGF0dHJpYnV0ZXMsIGFuZCBzcGxpdCB0aGVtIG91dCBiYXNlZCBvbiB0aGUKKyAgLy8gc3BlbGxpbmcgdmFyaWV0eS4KKyAgZm9yIChhdXRvICpSIDogQXR0cnMpIHsKKyAgICBzdGQ6OnZlY3RvcjxGbGF0dGVuZWRTcGVsbGluZz4gU3BlbGxpbmdzID0gR2V0RmxhdHRlbmVkU3BlbGxpbmdzKCpSKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlNJIDogU3BlbGxpbmdzKSB7CisgICAgICBzdGQ6OnN0cmluZyBWYXJpZXR5ID0gU0kudmFyaWV0eSgpOworICAgICAgaWYgKFZhcmlldHkgPT0gIkdOVSIpCisgICAgICAgIEdOVS5wdXNoX2JhY2soUik7CisgICAgICBlbHNlIGlmIChWYXJpZXR5ID09ICJEZWNsc3BlYyIpCisgICAgICAgIERlY2xzcGVjLnB1c2hfYmFjayhSKTsKKyAgICAgIGVsc2UgaWYgKFZhcmlldHkgPT0gIkNYWDExIikgeworICAgICAgICBDWFhbU0kubmFtZVNwYWNlKCldLnB1c2hfYmFjayhSKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIAorICBPUyA8PCAic3dpdGNoIChTeW50YXgpIHtcbiI7CisgIE9TIDw8ICJjYXNlIEF0dHJTeW50YXg6OkdlbmVyaWM6XG4iOworICBPUyA8PCAiICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGJvb2w+KE5hbWUpXG4iOworICBHZW5lcmF0ZUhhc0F0dHJTcGVsbGluZ1N0cmluZ1N3aXRjaChBdHRycywgT1MpOworICBPUyA8PCAiY2FzZSBBdHRyU3ludGF4OjpHTlU6XG4iOworICBPUyA8PCAiICByZXR1cm4gbGx2bTo6U3RyaW5nU3dpdGNoPGJvb2w+KE5hbWUpXG4iOworICBHZW5lcmF0ZUhhc0F0dHJTcGVsbGluZ1N0cmluZ1N3aXRjaChHTlUsIE9TLCAiR05VIik7CisgIE9TIDw8ICJjYXNlIEF0dHJTeW50YXg6OkRlY2xzcGVjOlxuIjsKKyAgT1MgPDwgIiAgcmV0dXJuIGxsdm06OlN0cmluZ1N3aXRjaDxib29sPihOYW1lKVxuIjsKKyAgR2VuZXJhdGVIYXNBdHRyU3BlbGxpbmdTdHJpbmdTd2l0Y2goRGVjbHNwZWMsIE9TLCAiRGVjbHNwZWMiKTsKKyAgT1MgPDwgImNhc2UgQXR0clN5bnRheDo6Q1hYOiB7XG4iOworICAvLyBDKysxMS1zdHlsZSBhdHRyaWJ1dGVzIGFyZSBmdXJ0aGVyIHNwbGl0IG91dCBiYXNlZCBvbiB0aGUgU2NvcGUuCisgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPFJlY29yZCAqPj46Oml0ZXJhdG9yIEkgPSBDWFguYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IENYWC5lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkgeworICAgIGlmIChJICE9IENYWC5iZWdpbigpKQorICAgICAgT1MgPDwgIiBlbHNlICI7CisgICAgaWYgKEktPmZpcnN0LmVtcHR5KCkpCisgICAgICBPUyA8PCAiaWYgKCFTY29wZSB8fCBTY29wZS0+Z2V0TmFtZSgpID09IFwiXCIpIHtcbiI7CisgICAgZWxzZQorICAgICAgT1MgPDwgImlmIChTY29wZS0+Z2V0TmFtZSgpID09IFwiIiA8PCBJLT5maXJzdCA8PCAiXCIpIHtcbiI7CisgICAgT1MgPDwgIiAgcmV0dXJuIGxsdm06OlN0cmluZ1N3aXRjaDxib29sPihOYW1lKVxuIjsKKyAgICBHZW5lcmF0ZUhhc0F0dHJTcGVsbGluZ1N0cmluZ1N3aXRjaChJLT5zZWNvbmQsIE9TLCAiQ1hYMTEiLCBJLT5maXJzdCk7CisgICAgT1MgPDwgIn0iOworICB9CisgIE9TIDw8ICJcbn1cbiI7CisgIE9TIDw8ICJ9XG4iOwogfQogCiB2b2lkIEVtaXRDbGFuZ0F0dHJTcGVsbGluZ0xpc3RJbmRleChSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUykgewpAQCAtMTQ3Nyw4OCArMTgzNCwxMDUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgImludG8gaW50ZXJuYWwgaWRlbnRpZmllcnMiLCBPUyk7CiAKICAgT1MgPDwKLSAgICAiICB1bnNpZ25lZCBJbmRleCA9IDA7XG4iCiAgICAgIiAgc3dpdGNoIChBdHRyS2luZCkge1xuIgogICAgICIgIGRlZmF1bHQ6XG4iCiAgICAgIiAgICBsbHZtX3VucmVhY2hhYmxlKFwiVW5rbm93biBhdHRyaWJ1dGUga2luZCFcIik7XG4iCiAgICAgIiAgICBicmVhaztcbiI7CiAKLSAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gQXR0cnMgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiQXR0ciIpOwotICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+Ojpjb25zdF9pdGVyYXRvciBJID0gQXR0cnMuYmVnaW4oKSwgRSA9IEF0dHJzLmVuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgUmVjb3JkICZSID0gKipJOwotICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCBhdHRyaWJ1dGVzIHRoYXQgcGFydGljaXBhdGUgaW4gU2VtYSBjaGVja2luZywgc28KLSAgICAvLyBza2lwIHRob3NlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IGFibGUgdG8gbWFrZSB0aGVpciB3YXkgdG8gU2VtYS4KLSAgICBpZiAoIVIuZ2V0VmFsdWVBc0JpdCgiU2VtYUhhbmRsZXIiKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gU3BlbGxpbmdzID0gUi5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiU3BlbGxpbmdzIik7Ci0gICAgLy8gRWFjaCBkaXN0aW5jdCBzcGVsbGluZyB5aWVsZHMgYW4gYXR0cmlidXRlIGtpbmQuCi0gICAgaWYgKFIuZ2V0VmFsdWVBc0JpdCgiRGlzdGluY3RTcGVsbGluZ3MiKSkgewotICAgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSA8IFNwZWxsaW5ncy5zaXplKCk7ICsrIEkpIHsKLSAgICAgICAgT1MgPDwKLSAgICAgICAgICAiICBjYXNlIEFUXyIgPDwgU3BlbGxpbmdzW0ldLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIikgPDwgIjogXG4iCi0gICAgICAgICAgIiAgICBJbmRleCA9ICIgPDwgSSA8PCAiO1xuIgotICAgICAgICAgICIgIGJyZWFrO1xuIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgT1MgPDwgIiAgY2FzZSBBVF8iIDw8IFIuZ2V0TmFtZSgpIDw8ICIgOiB7XG4iOwotICAgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSA8IFNwZWxsaW5ncy5zaXplKCk7ICsrIEkpIHsKLSAgICAgICAgU21hbGxTdHJpbmc8MTY+IE5hbWVzcGFjZTsKLSAgICAgICAgaWYgKFNwZWxsaW5nc1tJXS0+Z2V0VmFsdWVBc1N0cmluZygiVmFyaWV0eSIpID09ICJDWFgxMSIpCi0gICAgICAgICAgTmFtZXNwYWNlID0gU3BlbGxpbmdzW0ldLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lc3BhY2UiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIE5hbWVzcGFjZSA9ICIiOwotCi0gICAgICAgIE9TIDw8ICIgICAgaWYgKE5hbWUgPT0gXCIiCi0gICAgICAgICAgPDwgU3BlbGxpbmdzW0ldLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIikgPDwgIlwiICYmICIKLSAgICAgICAgICA8PCAiU3ludGF4VXNlZCA9PSAiCi0gICAgICAgICAgPDwgU3RyaW5nU3dpdGNoPHVuc2lnbmVkPihTcGVsbGluZ3NbSV0tPmdldFZhbHVlQXNTdHJpbmcoIlZhcmlldHkiKSkKLSAgICAgICAgICAgIC5DYXNlKCJHTlUiLCAwKQotICAgICAgICAgICAgLkNhc2UoIkNYWDExIiwgMSkKLSAgICAgICAgICAgIC5DYXNlKCJEZWNsc3BlYyIsIDIpCi0gICAgICAgICAgICAuQ2FzZSgiS2V5d29yZCIsIDMpCi0gICAgICAgICAgICAuRGVmYXVsdCgwKQotICAgICAgICAgIDw8ICIgJiYgU2NvcGUgPT0gXCIiIDw8IE5hbWVzcGFjZSA8PCAiXCIpXG4iCi0gICAgICAgICAgPDwgIiAgICAgICAgcmV0dXJuICIgPDwgSSA8PCAiO1xuIjsKLSAgICAgIH0KLQotICAgICAgT1MgPDwgIiAgICBicmVhaztcbiI7Ci0gICAgICBPUyA8PCAiICB9XG4iOworICBQYXJzZWRBdHRyTWFwIEF0dHJzID0gZ2V0UGFyc2VkQXR0ckxpc3QoUmVjb3Jkcyk7CisgIGZvciAoY29uc3QgYXV0byAmSSA6IEF0dHJzKSB7CisgICAgUmVjb3JkICZSID0gKkkuc2Vjb25kOworICAgIHN0ZDo6dmVjdG9yPEZsYXR0ZW5lZFNwZWxsaW5nPiBTcGVsbGluZ3MgPSBHZXRGbGF0dGVuZWRTcGVsbGluZ3MoUik7CisgICAgT1MgPDwgIiAgY2FzZSBBVF8iIDw8IEkuZmlyc3QgPDwgIjoge1xuIjsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgU3BlbGxpbmdzLnNpemUoKTsgKysgSSkgeworICAgICAgT1MgPDwgIiAgICBpZiAoTmFtZSA9PSBcIiIKKyAgICAgICAgPDwgU3BlbGxpbmdzW0ldLm5hbWUoKSA8PCAiXCIgJiYgIgorICAgICAgICA8PCAiU3ludGF4VXNlZCA9PSAiCisgICAgICAgIDw8IFN0cmluZ1N3aXRjaDx1bnNpZ25lZD4oU3BlbGxpbmdzW0ldLnZhcmlldHkoKSkKKyAgICAgICAgICAuQ2FzZSgiR05VIiwgMCkKKyAgICAgICAgICAuQ2FzZSgiQ1hYMTEiLCAxKQorICAgICAgICAgIC5DYXNlKCJEZWNsc3BlYyIsIDIpCisgICAgICAgICAgLkNhc2UoIktleXdvcmQiLCAzKQorICAgICAgICAgIC5EZWZhdWx0KDApCisgICAgICAgIDw8ICIgJiYgU2NvcGUgPT0gXCIiIDw8IFNwZWxsaW5nc1tJXS5uYW1lU3BhY2UoKSA8PCAiXCIpXG4iCisgICAgICAgIDw8ICIgICAgICAgIHJldHVybiAiIDw8IEkgPDwgIjtcbiI7CiAgICAgfQorCisgICAgT1MgPDwgIiAgICBicmVhaztcbiI7CisgICAgT1MgPDwgIiAgfVxuIjsKICAgfQogCiAgIE9TIDw8ICIgIH1cbiI7Ci0gIE9TIDw8ICIgIHJldHVybiBJbmRleDtcbiI7CisgIE9TIDw8ICIgIHJldHVybiAwO1xuIjsKIH0KIAotLy8gRW1pdHMgdGhlIExhdGVQYXJzZWQgcHJvcGVydHkgZm9yIGF0dHJpYnV0ZXMuCi12b2lkIEVtaXRDbGFuZ0F0dHJMYXRlUGFyc2VkTGlzdChSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUykgewotICBlbWl0U291cmNlRmlsZUhlYWRlcigibGx2bTo6U3RyaW5nU3dpdGNoIGNvZGUgdG8gbWF0Y2ggbGF0ZSBwYXJzZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlcyIsIE9TKTsKKy8vIEVtaXRzIGNvZGUgdXNlZCBieSBSZWN1cnNpdmVBU1RWaXNpdG9yIHRvIHZpc2l0IGF0dHJpYnV0ZXMKK3ZvaWQgRW1pdENsYW5nQXR0ckFTVFZpc2l0b3IoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgZW1pdFNvdXJjZUZpbGVIZWFkZXIoIlVzZWQgYnkgUmVjdXJzaXZlQVNUVmlzaXRvciB0byB2aXNpdCBhdHRyaWJ1dGVzLiIsIE9TKTsKIAogICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBBdHRycyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJBdHRyIik7CiAKLSAgZm9yIChzdGQ6OnZlY3RvcjxSZWNvcmQqPjo6aXRlcmF0b3IgSSA9IEF0dHJzLmJlZ2luKCksIEUgPSBBdHRycy5lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIFJlY29yZCAmQXR0ciA9ICoqSTsKLQotICAgIGJvb2wgTGF0ZVBhcnNlZCA9IEF0dHIuZ2V0VmFsdWVBc0JpdCgiTGF0ZVBhcnNlZCIpOwotCi0gICAgaWYgKExhdGVQYXJzZWQpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPFJlY29yZCo+IFNwZWxsaW5ncyA9Ci0gICAgICAgIEF0dHIuZ2V0VmFsdWVBc0xpc3RPZkRlZnMoIlNwZWxsaW5ncyIpOwotCi0gICAgICAvLyBGSVhNRTogSGFuZGxlIG5vbi1HTlUgYXR0cmlidXRlcwotICAgICAgZm9yIChzdGQ6OnZlY3RvcjxSZWNvcmQqPjo6Y29uc3RfaXRlcmF0b3IgSSA9IFNwZWxsaW5ncy5iZWdpbigpLAotICAgICAgICAgICBFID0gU3BlbGxpbmdzLmVuZCgpOyBJICE9IEU7ICsrSSkgewotICAgICAgICBpZiAoKCpJKS0+Z2V0VmFsdWVBc1N0cmluZygiVmFyaWV0eSIpICE9ICJHTlUiKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBPUyA8PCAiLkNhc2UoXCIiIDw8ICgqSSktPmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKSA8PCAiXCIsICIKLSAgICAgICAgICAgPDwgTGF0ZVBhcnNlZCA8PCAiKVxuIjsKLSAgICAgIH0KLSAgICB9CisgIC8vIFdyaXRlIG1ldGhvZCBkZWNsYXJhdGlvbnMgZm9yIFRyYXZlcnNlKiBtZXRob2RzLgorICAvLyBXZSBlbWl0IHRoaXMgaGVyZSBiZWNhdXNlIHdlIG9ubHkgZ2VuZXJhdGUgbWV0aG9kcyBmb3IgYXR0cmlidXRlcyB0aGF0CisgIC8vIGFyZSBkZWNsYXJlZCBhcyBBU1ROb2Rlcy4KKyAgT1MgPDwgIiNpZmRlZiBBVFRSX1ZJU0lUT1JfREVDTFNfT05MWVxuXG4iOworICBmb3IgKGF1dG8gSSA6IEF0dHJzKSB7CisgICAgY29uc3QgUmVjb3JkICZSID0gKkk7CisgICAgaWYgKCFSLmdldFZhbHVlQXNCaXQoIkFTVE5vZGUiKSkKKyAgICAgIGNvbnRpbnVlOworICAgIE9TIDw8ICIgIGJvb2wgVHJhdmVyc2UiCisgICAgICAgPDwgUi5nZXROYW1lKCkgPDwgIkF0dHIoIiA8PCBSLmdldE5hbWUoKSA8PCAiQXR0ciAqQSk7XG4iOworICAgIE9TIDw8ICIgIGJvb2wgVmlzaXQiCisgICAgICAgPDwgUi5nZXROYW1lKCkgPDwgIkF0dHIoIiA8PCBSLmdldE5hbWUoKSA8PCAiQXR0ciAqQSkge1xuIgorICAgICAgIDw8ICIgICAgcmV0dXJuIHRydWU7IFxuIgorICAgICAgIDw8ICIgIH07XG4iOwogICB9CisgIE9TIDw8ICJcbiNlbHNlIC8vIEFUVFJfVklTSVRPUl9ERUNMU19PTkxZXG5cbiI7CisKKyAgLy8gV3JpdGUgaW5kaXZpZHVhbCBUcmF2ZXJzZSogbWV0aG9kcyBmb3IgZWFjaCBhdHRyaWJ1dGUgY2xhc3MuCisgIGZvciAoYXV0byBJIDogQXR0cnMpIHsKKyAgICBjb25zdCBSZWNvcmQgJlIgPSAqSTsKKyAgICBpZiAoIVIuZ2V0VmFsdWVBc0JpdCgiQVNUTm9kZSIpKQorICAgICAgY29udGludWU7CisKKyAgICBPUyA8PCAidGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWQ+XG4iCisgICAgICAgPDwgImJvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZSIKKyAgICAgICA8PCBSLmdldE5hbWUoKSA8PCAiQXR0cigiIDw8IFIuZ2V0TmFtZSgpIDw8ICJBdHRyICpBKSB7XG4iCisgICAgICAgPDwgIiAgaWYgKCFnZXREZXJpdmVkKCkuVmlzaXRBdHRyKEEpKVxuIgorICAgICAgIDw8ICIgICAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgIDw8ICIgIGlmICghZ2V0RGVyaXZlZCgpLlZpc2l0IiA8PCBSLmdldE5hbWUoKSA8PCAiQXR0cihBKSlcbiIKKyAgICAgICA8PCAiICAgIHJldHVybiBmYWxzZTtcbiI7CisKKyAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBBcmdSZWNvcmRzID0gUi5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiQXJncyIpOworICAgIGZvciAoYXV0byByaSA6IEFyZ1JlY29yZHMpCisgICAgICBjcmVhdGVBcmd1bWVudCgqcmksIFIuZ2V0TmFtZSgpKS0+d3JpdGVBU1RWaXNpdG9yVHJhdmVyc2FsKE9TKTsKKworICAgIE9TIDw8ICIgIHJldHVybiB0cnVlO1xuIjsKKyAgICBPUyA8PCAifVxuXG4iOworICB9CisKKyAgLy8gV3JpdGUgZ2VuZXJpYyBUcmF2ZXJzZSByb3V0aW5lCisgIE9TIDw8ICJ0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD5cbiIKKyAgICAgPDwgImJvb2wgVklTSVRPUkNMQVNTPERlcml2ZWQ+OjpUcmF2ZXJzZUF0dHIoQXR0ciAqQSkge1xuIgorICAgICA8PCAiICBpZiAoIUEpXG4iCisgICAgIDw8ICIgICAgcmV0dXJuIHRydWU7XG4iCisgICAgIDw8ICJcbiIKKyAgICAgPDwgIiAgc3dpdGNoIChBLT5nZXRLaW5kKCkpIHtcbiIKKyAgICAgPDwgIiAgICBkZWZhdWx0OlxuIgorICAgICA8PCAiICAgICAgcmV0dXJuIHRydWU7XG4iOworCisgIGZvciAoYXV0byBJIDogQXR0cnMpIHsKKyAgICBjb25zdCBSZWNvcmQgJlIgPSAqSTsKKyAgICBpZiAoIVIuZ2V0VmFsdWVBc0JpdCgiQVNUTm9kZSIpKQorICAgICAgY29udGludWU7CisKKyAgICBPUyA8PCAiICAgIGNhc2UgYXR0cjo6IiA8PCBSLmdldE5hbWUoKSA8PCAiOlxuIgorICAgICAgIDw8ICIgICAgICByZXR1cm4gZ2V0RGVyaXZlZCgpLlRyYXZlcnNlIiA8PCBSLmdldE5hbWUoKSA8PCAiQXR0cigiCisgICAgICAgPDwgImNhc3Q8IiA8PCBSLmdldE5hbWUoKSA8PCAiQXR0cj4oQSkpO1xuIjsKKyAgfQorICBPUyA8PCAiICB9XG4iOyAgLy8gZW5kIGNhc2UKKyAgT1MgPDwgIn1cbiI7ICAvLyBlbmQgZnVuY3Rpb24KKyAgT1MgPDwgIiNlbmRpZiAgLy8gQVRUUl9WSVNJVE9SX0RFQ0xTX09OTFlcbiI7CiB9CiAKIC8vIEVtaXRzIGNvZGUgdG8gaW5zdGFudGlhdGUgZGVwZW5kZW50IGF0dHJpYnV0ZXMgb24gdGVtcGxhdGVzLgpAQCAtMTU3Niw5ICsxOTUwLDggQEAKICAgICAgPDwgIiAgICBkZWZhdWx0OlxuIgogICAgICA8PCAiICAgICAgYnJlYWs7XG4iOwogCi0gIGZvciAoc3RkOjp2ZWN0b3I8UmVjb3JkKj46Oml0ZXJhdG9yIEkgPSBBdHRycy5iZWdpbigpLCBFID0gQXR0cnMuZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBSZWNvcmQgJlIgPSAqKkk7CisgIGZvciAoYXV0byBJIDogQXR0cnMpIHsKKyAgICBjb25zdCBSZWNvcmQgJlIgPSAqSTsKICAgICBpZiAoIVIuZ2V0VmFsdWVBc0JpdCgiQVNUTm9kZSIpKQogICAgICAgY29udGludWU7CiAKQEAgLTE2MDIsMjkgKzE5NzUsMjEgQEAKICAgICB9CiAKICAgICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBBcmdSZWNvcmRzID0gUi5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiQXJncyIpOwotICAgIHN0ZDo6dmVjdG9yPEFyZ3VtZW50Kj4gQXJnczsKLSAgICBzdGQ6OnZlY3RvcjxBcmd1bWVudCo+OjppdGVyYXRvciBhaSwgYWU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFyZ3VtZW50Pj4gQXJnczsKICAgICBBcmdzLnJlc2VydmUoQXJnUmVjb3Jkcy5zaXplKCkpOwogCi0gICAgZm9yIChzdGQ6OnZlY3RvcjxSZWNvcmQqPjo6aXRlcmF0b3IgcmkgPSBBcmdSZWNvcmRzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUgPSBBcmdSZWNvcmRzLmVuZCgpOwotICAgICAgICAgcmkgIT0gcmU7ICsrcmkpIHsKLSAgICAgIFJlY29yZCAmQXJnUmVjb3JkID0gKipyaTsKLSAgICAgIEFyZ3VtZW50ICpBcmcgPSBjcmVhdGVBcmd1bWVudChBcmdSZWNvcmQsIFIuZ2V0TmFtZSgpKTsKLSAgICAgIGFzc2VydChBcmcpOwotICAgICAgQXJncy5wdXNoX2JhY2soQXJnKTsKLSAgICB9Ci0gICAgYWUgPSBBcmdzLmVuZCgpOworICAgIGZvciAoYXV0byBBcmdSZWNvcmQgOiBBcmdSZWNvcmRzKQorICAgICAgQXJncy5lbXBsYWNlX2JhY2soY3JlYXRlQXJndW1lbnQoKkFyZ1JlY29yZCwgUi5nZXROYW1lKCkpKTsKIAotICAgIGZvciAoYWkgPSBBcmdzLmJlZ2luKCk7IGFpICE9IGFlOyArK2FpKSB7Ci0gICAgICAoKmFpKS0+d3JpdGVUZW1wbGF0ZUluc3RhbnRpYXRpb24oT1MpOwotICAgIH0KKyAgICBmb3IgKGF1dG8gY29uc3QgJmFpIDogQXJncykKKyAgICAgIGFpLT53cml0ZVRlbXBsYXRlSW5zdGFudGlhdGlvbihPUyk7CisKICAgICBPUyA8PCAiICAgICAgcmV0dXJuIG5ldyAoQykgIiA8PCBSLmdldE5hbWUoKSA8PCAiQXR0cihBLT5nZXRMb2NhdGlvbigpLCBDIjsKLSAgICBmb3IgKGFpID0gQXJncy5iZWdpbigpOyBhaSAhPSBhZTsgKythaSkgeworICAgIGZvciAoYXV0byBjb25zdCAmYWkgOiBBcmdzKSB7CiAgICAgICBPUyA8PCAiLCAiOwotICAgICAgKCphaSktPndyaXRlVGVtcGxhdGVJbnN0YW50aWF0aW9uQXJncyhPUyk7CisgICAgICBhaS0+d3JpdGVUZW1wbGF0ZUluc3RhbnRpYXRpb25BcmdzKE9TKTsKICAgICB9Ci0gICAgT1MgPDwgIik7XG4gICAgfVxuIjsKKyAgICBPUyA8PCAiLCBBLT5nZXRTcGVsbGluZ0xpc3RJbmRleCgpKTtcbiAgICB9XG4iOwogICB9CiAgIE9TIDw8ICIgIH0gLy8gZW5kIHN3aXRjaFxuIgogICAgICA8PCAiICBsbHZtX3VucmVhY2hhYmxlKFwiVW5rbm93biBhdHRyaWJ1dGUhXCIpO1xuIgpAQCAtMTYzNCwzOSArMTk5OSw2IEBACiAgICAgIDw8ICJ9IC8vIGVuZCBuYW1lc3BhY2UgY2xhbmdcbiI7CiB9CiAKLXR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBSZWNvcmQgKj4gPiBQYXJzZWRBdHRyTWFwOwotCi1zdGF0aWMgUGFyc2VkQXR0ck1hcCBnZXRQYXJzZWRBdHRyTGlzdChjb25zdCBSZWNvcmRLZWVwZXIgJlJlY29yZHMpIHsKLSAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gQXR0cnMgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiQXR0ciIpOwotICBQYXJzZWRBdHRyTWFwIFI7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8UmVjb3JkKj46Oml0ZXJhdG9yIEkgPSBBdHRycy5iZWdpbigpLCBFID0gQXR0cnMuZW5kKCk7Ci0gICAgICAgSSAhPSBFOyArK0kpIHsKLSAgICBSZWNvcmQgJkF0dHIgPSAqKkk7Ci0gICAgCi0gICAgYm9vbCBTZW1hSGFuZGxlciA9IEF0dHIuZ2V0VmFsdWVBc0JpdCgiU2VtYUhhbmRsZXIiKTsKLSAgICBib29sIERpc3RpbmN0U3BlbGxpbmdzID0gQXR0ci5nZXRWYWx1ZUFzQml0KCJEaXN0aW5jdFNwZWxsaW5ncyIpOwotCi0gICAgaWYgKFNlbWFIYW5kbGVyKSB7Ci0gICAgICBpZiAoRGlzdGluY3RTcGVsbGluZ3MpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gU3BlbGxpbmdzID0gQXR0ci5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiU3BlbGxpbmdzIik7Ci0gICAgICAgIAotICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+Ojpjb25zdF9pdGVyYXRvciBJID0gU3BlbGxpbmdzLmJlZ2luKCksCi0gICAgICAgICAgICAgRSA9IFNwZWxsaW5ncy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgICAgICBzdGQ6OnN0cmluZyBBdHRyTmFtZSA9ICgqSSktPmdldFZhbHVlQXNTdHJpbmcoIk5hbWUiKTsKLQotICAgICAgICAgIFN0cmluZ1JlZiBTcGVsbGluZyA9IE5vcm1hbGl6ZUF0dHJOYW1lKEF0dHJOYW1lKTsKLSAgICAgICAgICBSLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihTcGVsbGluZy5zdHIoKSwgJkF0dHIpKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgU3RyaW5nUmVmIEF0dHJOYW1lID0gQXR0ci5nZXROYW1lKCk7Ci0gICAgICAgIEF0dHJOYW1lID0gTm9ybWFsaXplQXR0ck5hbWUoQXR0ck5hbWUpOwotICAgICAgICBSLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihBdHRyTmFtZS5zdHIoKSwgKkkpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFI7Ci19Ci0KIC8vIEVtaXRzIHRoZSBsaXN0IG9mIHBhcnNlZCBhdHRyaWJ1dGVzLgogdm9pZCBFbWl0Q2xhbmdBdHRyUGFyc2VkQXR0ckxpc3QoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpIHsKICAgZW1pdFNvdXJjZUZpbGVIZWFkZXIoIkxpc3Qgb2YgYWxsIGF0dHJpYnV0ZXMgdGhhdCBDbGFuZyByZWNvZ25pemVzIiwgT1MpOwpAQCAtMTY3Niw0NyArMjAwOCw0NjggQEAKICAgT1MgPDwgIiNlbmRpZlxuXG4iOwogICAKICAgUGFyc2VkQXR0ck1hcCBOYW1lcyA9IGdldFBhcnNlZEF0dHJMaXN0KFJlY29yZHMpOwotICBmb3IgKFBhcnNlZEF0dHJNYXA6Oml0ZXJhdG9yIEkgPSBOYW1lcy5iZWdpbigpLCBFID0gTmFtZXMuZW5kKCk7IEkgIT0gRTsKLSAgICAgICArK0kpIHsKLSAgICBPUyA8PCAiUEFSU0VEX0FUVFIoIiA8PCBJLT5maXJzdCA8PCAiKVxuIjsKKyAgZm9yIChjb25zdCBhdXRvICZJIDogTmFtZXMpIHsKKyAgICBPUyA8PCAiUEFSU0VEX0FUVFIoIiA8PCBJLmZpcnN0IDw8ICIpXG4iOwogICB9CiB9CiAKLXN0YXRpYyB2b2lkIGVtaXRBcmdJbmZvKGNvbnN0IFJlY29yZCAmUiwgcmF3X29zdHJlYW0gJk9TKSB7CitzdGF0aWMgdm9pZCBlbWl0QXJnSW5mbyhjb25zdCBSZWNvcmQgJlIsIHN0ZDo6c3RyaW5nc3RyZWFtICZPUykgewogICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgY291bnQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgc3BlY2lmaWVkIGZvciB0aGUKICAgLy8gYXR0cmlidXRlIGFuZCBlbWl0IHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgYXJndW1lbnRzIGZvbGxvd2VkIGJ5IHRoZQogICAvLyBudW1iZXIgb2Ygb3B0aW9uYWwgYXJndW1lbnRzLgogICBzdGQ6OnZlY3RvcjxSZWNvcmQgKj4gQXJncyA9IFIuZ2V0VmFsdWVBc0xpc3RPZkRlZnMoIkFyZ3MiKTsKICAgdW5zaWduZWQgQXJnQ291bnQgPSAwLCBPcHRDb3VudCA9IDA7Ci0gIGZvciAoc3RkOjp2ZWN0b3I8UmVjb3JkICo+Ojpjb25zdF9pdGVyYXRvciBJID0gQXJncy5iZWdpbigpLCBFID0gQXJncy5lbmQoKTsKLSAgICAgICBJICE9IEU7ICsrSSkgewotICAgIGNvbnN0IFJlY29yZCAmQXJnID0gKipJOwotICAgIEFyZy5nZXRWYWx1ZUFzQml0KCJPcHRpb25hbCIpID8gKytPcHRDb3VudCA6ICsrQXJnQ291bnQ7CisgIGZvciAoYXV0byBBcmcgOiBBcmdzKSB7CisgICAgQXJnLT5nZXRWYWx1ZUFzQml0KCJPcHRpb25hbCIpID8gKytPcHRDb3VudCA6ICsrQXJnQ291bnQ7CiAgIH0KICAgT1MgPDwgQXJnQ291bnQgPDwgIiwgIiA8PCBPcHRDb3VudDsKIH0KIAorc3RhdGljIHZvaWQgR2VuZXJhdGVEZWZhdWx0QXBwZXJ0YWluc1RvKHJhd19vc3RyZWFtICZPUykgeworICBPUyA8PCAic3RhdGljIGJvb2wgZGVmYXVsdEFwcGVydGFpbnNUbyhTZW1hICYsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJiwiOworICBPUyA8PCAiY29uc3QgRGVjbCAqKSB7XG4iOworICBPUyA8PCAiICByZXR1cm4gdHJ1ZTtcbiI7CisgIE9TIDw8ICJ9XG5cbiI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBDYWxjdWxhdGVEaWFnbm9zdGljKGNvbnN0IFJlY29yZCAmUykgeworICAvLyBJZiB0aGUgU3ViamVjdExpc3Qgb2JqZWN0IGhhcyBhIGN1c3RvbSBkaWFnbm9zdGljIGFzc29jaWF0ZWQgd2l0aCBpdCwKKyAgLy8gcmV0dXJuIHRoYXQgZGlyZWN0bHkuCisgIHN0ZDo6c3RyaW5nIEN1c3RvbURpYWcgPSBTLmdldFZhbHVlQXNTdHJpbmcoIkN1c3RvbURpYWciKTsKKyAgaWYgKCFDdXN0b21EaWFnLmVtcHR5KCkpCisgICAgcmV0dXJuIEN1c3RvbURpYWc7CisKKyAgLy8gR2l2ZW4gdGhlIGxpc3Qgb2Ygc3ViamVjdHMsIGRldGVybWluZSB3aGF0IGRpYWdub3N0aWMgYmVzdCBmaXRzLgorICBlbnVtIHsKKyAgICBGdW5jID0gMVUgPDwgMCwKKyAgICBWYXIgPSAxVSA8PCAxLAorICAgIE9iakNNZXRob2QgPSAxVSA8PCAyLAorICAgIFBhcmFtID0gMVUgPDwgMywKKyAgICBDbGFzcyA9IDFVIDw8IDQsCisgICAgR2VuZXJpY1JlY29yZCA9IDFVIDw8IDUsCisgICAgVHlwZSA9IDFVIDw8IDYsCisgICAgT2JqQ0lWYXIgPSAxVSA8PCA3LAorICAgIE9iakNQcm9wID0gMVUgPDwgOCwKKyAgICBPYmpDSW50ZXJmYWNlID0gMVUgPDwgOSwKKyAgICBCbG9jayA9IDFVIDw8IDEwLAorICAgIE5hbWVzcGFjZSA9IDFVIDw8IDExLAorICAgIEZ1bmNUZW1wbGF0ZSA9IDFVIDw8IDEyLAorICAgIEZpZWxkID0gMVUgPDwgMTMsCisgICAgQ1hYTWV0aG9kID0gMVUgPDwgMTQsCisgICAgT2JqQ1Byb3RvY29sID0gMVUgPDwgMTUKKyAgfTsKKyAgdWludDMyX3QgU3ViTWFzayA9IDA7CisKKyAgc3RkOjp2ZWN0b3I8UmVjb3JkICo+IFN1YmplY3RzID0gUy5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiU3ViamVjdHMiKTsKKyAgZm9yIChhdXRvIEkgOiBTdWJqZWN0cykgeworICAgIGNvbnN0IFJlY29yZCAmUiA9ICpJOworICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisKKyAgICBpZiAoUi5pc1N1YkNsYXNzT2YoIlN1YnNldFN1YmplY3QiKSkgeworICAgICAgUHJpbnRFcnJvcihSLmdldExvYygpLCAiU3Vic2V0U3ViamVjdHMgc2hvdWxkIHVzZSBhIGN1c3RvbSBkaWFnbm9zdGljIik7CisgICAgICAvLyBBcyBhIGZhbGxiYWNrLCBsb29rIHRocm91Z2ggdGhlIFN1YnNldFN1YmplY3QgdG8gc2VlIHdoYXQgaXRzIGJhc2UKKyAgICAgIC8vIHR5cGUgaXMsIGFuZCB1c2UgdGhhdC4gVGhpcyBuZWVkcyB0byBiZSB1cGRhdGVkIGlmIFN1YnNldFN1YmplY3RzCisgICAgICAvLyBhcmUgYWxsb3dlZCB3aXRoaW4gb3RoZXIgU3Vic2V0U3ViamVjdHMuCisgICAgICBOYW1lID0gUi5nZXRWYWx1ZUFzRGVmKCJCYXNlIiktPmdldE5hbWUoKTsKKyAgICB9IGVsc2UKKyAgICAgIE5hbWUgPSBSLmdldE5hbWUoKTsKKworICAgIHVpbnQzMl90IFYgPSBTdHJpbmdTd2l0Y2g8dWludDMyX3Q+KE5hbWUpCisgICAgICAgICAgICAgICAgICAgLkNhc2UoIkZ1bmN0aW9uIiwgRnVuYykKKyAgICAgICAgICAgICAgICAgICAuQ2FzZSgiVmFyIiwgVmFyKQorICAgICAgICAgICAgICAgICAgIC5DYXNlKCJPYmpDTWV0aG9kIiwgT2JqQ01ldGhvZCkKKyAgICAgICAgICAgICAgICAgICAuQ2FzZSgiUGFybVZhciIsIFBhcmFtKQorICAgICAgICAgICAgICAgICAgIC5DYXNlKCJUeXBlZGVmTmFtZSIsIFR5cGUpCisgICAgICAgICAgICAgICAgICAgLkNhc2UoIk9iakNJdmFyIiwgT2JqQ0lWYXIpCisgICAgICAgICAgICAgICAgICAgLkNhc2UoIk9iakNQcm9wZXJ0eSIsIE9iakNQcm9wKQorICAgICAgICAgICAgICAgICAgIC5DYXNlKCJSZWNvcmQiLCBHZW5lcmljUmVjb3JkKQorICAgICAgICAgICAgICAgICAgIC5DYXNlKCJPYmpDSW50ZXJmYWNlIiwgT2JqQ0ludGVyZmFjZSkKKyAgICAgICAgICAgICAgICAgICAuQ2FzZSgiT2JqQ1Byb3RvY29sIiwgT2JqQ1Byb3RvY29sKQorICAgICAgICAgICAgICAgICAgIC5DYXNlKCJCbG9jayIsIEJsb2NrKQorICAgICAgICAgICAgICAgICAgIC5DYXNlKCJDWFhSZWNvcmQiLCBDbGFzcykKKyAgICAgICAgICAgICAgICAgICAuQ2FzZSgiTmFtZXNwYWNlIiwgTmFtZXNwYWNlKQorICAgICAgICAgICAgICAgICAgIC5DYXNlKCJGdW5jdGlvblRlbXBsYXRlIiwgRnVuY1RlbXBsYXRlKQorICAgICAgICAgICAgICAgICAgIC5DYXNlKCJGaWVsZCIsIEZpZWxkKQorICAgICAgICAgICAgICAgICAgIC5DYXNlKCJDWFhNZXRob2QiLCBDWFhNZXRob2QpCisgICAgICAgICAgICAgICAgICAgLkRlZmF1bHQoMCk7CisgICAgaWYgKCFWKSB7CisgICAgICAvLyBTb21ldGhpbmcgd2Fzbid0IGluIG91ciBtYXBwaW5nLCBzbyBiZSBoZWxwZnVsIGFuZCBsZXQgdGhlIGRldmVsb3BlcgorICAgICAgLy8ga25vdyBhYm91dCBpdC4KKyAgICAgIFByaW50RmF0YWxFcnJvcihSLmdldExvYygpLCAiVW5rbm93biBzdWJqZWN0IHR5cGU6ICIgKyBSLmdldE5hbWUoKSk7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgU3ViTWFzayB8PSBWOworICB9CisKKyAgc3dpdGNoIChTdWJNYXNrKSB7CisgICAgLy8gRm9yIHRoZSBzaW1wbGUgY2FzZXMgd2hlcmUgdGhlcmUncyBvbmx5IGEgc2luZ2xlIGVudHJ5IGluIHRoZSBtYXNrLCB3ZQorICAgIC8vIGRvbid0IGhhdmUgdG8gcmVzb3J0IHRvIGJpdCBmaWRkbGluZy4KKyAgICBjYXNlIEZ1bmM6ICByZXR1cm4gIkV4cGVjdGVkRnVuY3Rpb24iOworICAgIGNhc2UgVmFyOiAgIHJldHVybiAiRXhwZWN0ZWRWYXJpYWJsZSI7CisgICAgY2FzZSBQYXJhbTogcmV0dXJuICJFeHBlY3RlZFBhcmFtZXRlciI7CisgICAgY2FzZSBDbGFzczogcmV0dXJuICJFeHBlY3RlZENsYXNzIjsKKyAgICBjYXNlIENYWE1ldGhvZDoKKyAgICAgIC8vIEZJWE1FOiBDdXJyZW50bHksIHRoaXMgbWFwcyB0byBFeHBlY3RlZE1ldGhvZCBiYXNlZCBvbiBleGlzdGluZyBjb2RlLAorICAgICAgLy8gYnV0IHNob3VsZCBtYXAgdG8gc29tZXRoaW5nIGEgYml0IG1vcmUgYWNjdXJhdGUgYXQgc29tZSBwb2ludC4KKyAgICBjYXNlIE9iakNNZXRob2Q6ICByZXR1cm4gIkV4cGVjdGVkTWV0aG9kIjsKKyAgICBjYXNlIFR5cGU6ICByZXR1cm4gIkV4cGVjdGVkVHlwZSI7CisgICAgY2FzZSBPYmpDSW50ZXJmYWNlOiByZXR1cm4gIkV4cGVjdGVkT2JqZWN0aXZlQ0ludGVyZmFjZSI7CisgICAgY2FzZSBPYmpDUHJvdG9jb2w6IHJldHVybiAiRXhwZWN0ZWRPYmplY3RpdmVDUHJvdG9jb2wiOworICAgIAorICAgIC8vICJHZW5lcmljUmVjb3JkIiBtZWFucyBzdHJ1Y3QsIHVuaW9uIG9yIGNsYXNzOyBjaGVjayB0aGUgbGFuZ3VhZ2Ugb3B0aW9ucworICAgIC8vIGFuZCBpZiBub3QgY29tcGlsaW5nIGZvciBDKyssIHN0cmlwIG9mZiB0aGUgY2xhc3MgcGFydC4gTm90ZSB0aGF0IHRoaXMKKyAgICAvLyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB0aGUgY29udGV4dCBmb3IgdGhpcyBkZWNsYXJlcyAiU2VtYSAmUyIuCisgICAgY2FzZSBHZW5lcmljUmVjb3JkOgorICAgICAgcmV0dXJuICIoUy5nZXRMYW5nT3B0cygpLkNQbHVzUGx1cyA/IEV4cGVjdGVkU3RydWN0T3JVbmlvbk9yQ2xhc3MgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkU3RydWN0T3JVbmlvbikiOworICAgIGNhc2UgRnVuYyB8IE9iakNNZXRob2QgfCBCbG9jazogcmV0dXJuICJFeHBlY3RlZEZ1bmN0aW9uTWV0aG9kT3JCbG9jayI7CisgICAgY2FzZSBGdW5jIHwgT2JqQ01ldGhvZCB8IENsYXNzOiByZXR1cm4gIkV4cGVjdGVkRnVuY3Rpb25NZXRob2RPckNsYXNzIjsKKyAgICBjYXNlIEZ1bmMgfCBQYXJhbToKKyAgICBjYXNlIEZ1bmMgfCBPYmpDTWV0aG9kIHwgUGFyYW06IHJldHVybiAiRXhwZWN0ZWRGdW5jdGlvbk1ldGhvZE9yUGFyYW1ldGVyIjsKKyAgICBjYXNlIEZ1bmMgfCBGdW5jVGVtcGxhdGU6CisgICAgY2FzZSBGdW5jIHwgT2JqQ01ldGhvZDogcmV0dXJuICJFeHBlY3RlZEZ1bmN0aW9uT3JNZXRob2QiOworICAgIGNhc2UgRnVuYyB8IFZhcjogcmV0dXJuICJFeHBlY3RlZFZhcmlhYmxlT3JGdW5jdGlvbiI7CisKKyAgICAvLyBJZiBub3QgY29tcGlsaW5nIGZvciBDKyssIHRoZSBjbGFzcyBwb3J0aW9uIGRvZXMgbm90IGFwcGx5LgorICAgIGNhc2UgRnVuYyB8IFZhciB8IENsYXNzOgorICAgICAgcmV0dXJuICIoUy5nZXRMYW5nT3B0cygpLkNQbHVzUGx1cyA/IEV4cGVjdGVkRnVuY3Rpb25WYXJpYWJsZU9yQ2xhc3MgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkVmFyaWFibGVPckZ1bmN0aW9uKSI7CisKKyAgICBjYXNlIE9iakNNZXRob2QgfCBPYmpDUHJvcDogcmV0dXJuICJFeHBlY3RlZE1ldGhvZE9yUHJvcGVydHkiOworICAgIGNhc2UgRmllbGQgfCBWYXI6IHJldHVybiAiRXhwZWN0ZWRGaWVsZE9yR2xvYmFsVmFyIjsKKyAgfQorCisgIFByaW50RmF0YWxFcnJvcihTLmdldExvYygpLAorICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZWR1Y2UgZGlhZ25vc3RpYyBhcmd1bWVudCBmb3IgQXR0ciBzdWJqZWN0cyIpOworCisgIHJldHVybiAiIjsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIEdldFN1YmplY3RXaXRoU3VmZml4KGNvbnN0IFJlY29yZCAqUikgeworICBzdGQ6OnN0cmluZyBCID0gUi0+Z2V0TmFtZSgpOworICBpZiAoQiA9PSAiRGVjbEJhc2UiKQorICAgIHJldHVybiAiRGVjbCI7CisgIHJldHVybiBCICsgIkRlY2wiOworfQorc3RhdGljIHN0ZDo6c3RyaW5nIEdlbmVyYXRlQ3VzdG9tQXBwZXJ0YWluc1RvKGNvbnN0IFJlY29yZCAmU3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsKKyAgc3RkOjpzdHJpbmcgRm5OYW1lID0gImlzIiArIFN1YmplY3QuZ2V0TmFtZSgpOworCisgIC8vIElmIHRoaXMgY29kZSBoYXMgYWxyZWFkeSBiZWVuIGdlbmVyYXRlZCwgc2ltcGx5IHJldHVybiB0aGUgcHJldmlvdXMKKyAgLy8gaW5zdGFuY2Ugb2YgaXQuCisgIHN0YXRpYyBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gQ3VzdG9tU3ViamVjdFNldDsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBJID0gQ3VzdG9tU3ViamVjdFNldC5maW5kKEZuTmFtZSk7CisgIGlmIChJICE9IEN1c3RvbVN1YmplY3RTZXQuZW5kKCkpCisgICAgcmV0dXJuICpJOworCisgIFJlY29yZCAqQmFzZSA9IFN1YmplY3QuZ2V0VmFsdWVBc0RlZigiQmFzZSIpOworCisgIC8vIE5vdCBjdXJyZW50bHkgc3VwcG9ydCBjdXN0b20gc3ViamVjdHMgd2l0aGluIGN1c3RvbSBzdWJqZWN0cy4KKyAgaWYgKEJhc2UtPmlzU3ViQ2xhc3NPZigiU3Vic2V0U3ViamVjdCIpKSB7CisgICAgUHJpbnRGYXRhbEVycm9yKFN1YmplY3QuZ2V0TG9jKCksCisgICAgICAgICAgICAgICAgICAgICJTdWJzZXRTdWJqZWN0cyB3aXRoaW4gU3Vic2V0U3ViamVjdHMgaXMgbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiAiIjsKKyAgfQorCisgIE9TIDw8ICJzdGF0aWMgYm9vbCAiIDw8IEZuTmFtZSA8PCAiKGNvbnN0IERlY2wgKkQpIHtcbiI7CisgIE9TIDw8ICIgIGlmIChjb25zdCAiIDw8IEdldFN1YmplY3RXaXRoU3VmZml4KEJhc2UpIDw8ICIgKlMgPSBkeW5fY2FzdDwiOworICBPUyA8PCBHZXRTdWJqZWN0V2l0aFN1ZmZpeChCYXNlKTsKKyAgT1MgPDwgIj4oRCkpXG4iOworICBPUyA8PCAiICAgIHJldHVybiAiIDw8IFN1YmplY3QuZ2V0VmFsdWVBc1N0cmluZygiQ2hlY2tDb2RlIikgPDwgIjtcbiI7CisgIE9TIDw8ICIgIHJldHVybiBmYWxzZTtcbiI7CisgIE9TIDw8ICJ9XG5cbiI7CisKKyAgQ3VzdG9tU3ViamVjdFNldC5pbnNlcnQoRm5OYW1lKTsKKyAgcmV0dXJuIEZuTmFtZTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIEdlbmVyYXRlQXBwZXJ0YWluc1RvKGNvbnN0IFJlY29yZCAmQXR0ciwgcmF3X29zdHJlYW0gJk9TKSB7CisgIC8vIElmIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QgY29udGFpbiBhIFN1YmplY3RzIGRlZmluaXRpb24sIHRoZW4gdXNlIHRoZQorICAvLyBkZWZhdWx0IGFwcGVydGFpbnNUbyBsb2dpYy4KKyAgaWYgKEF0dHIuaXNWYWx1ZVVuc2V0KCJTdWJqZWN0cyIpKQorICAgIHJldHVybiAiZGVmYXVsdEFwcGVydGFpbnNUbyI7CisKKyAgY29uc3QgUmVjb3JkICpTdWJqZWN0T2JqID0gQXR0ci5nZXRWYWx1ZUFzRGVmKCJTdWJqZWN0cyIpOworICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBTdWJqZWN0cyA9IFN1YmplY3RPYmotPmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJTdWJqZWN0cyIpOworCisgIC8vIElmIHRoZSBsaXN0IG9mIHN1YmplY3RzIGlzIGVtcHR5LCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGF0dHJpYnV0ZQorICAvLyBhcHBlcnRhaW5zIHRvIGV2ZXJ5dGhpbmcuCisgIGlmIChTdWJqZWN0cy5lbXB0eSgpKQorICAgIHJldHVybiAiZGVmYXVsdEFwcGVydGFpbnNUbyI7CisKKyAgYm9vbCBXYXJuID0gU3ViamVjdE9iai0+Z2V0VmFsdWVBc0RlZigiRGlhZyIpLT5nZXRWYWx1ZUFzQml0KCJXYXJuIik7CisKKyAgLy8gT3RoZXJ3aXNlLCBnZW5lcmF0ZSBhbiBhcHBlcnRhaW5zVG8gY2hlY2sgc3BlY2lmaWMgdG8gdGhpcyBhdHRyaWJ1dGUgd2hpY2gKKyAgLy8gY2hlY2tzIGFsbCBvZiB0aGUgZ2l2ZW4gc3ViamVjdHMgYWdhaW5zdCB0aGUgRGVjbCBwYXNzZWQgaW4uIFJldHVybiB0aGUKKyAgLy8gbmFtZSBvZiB0aGF0IGNoZWNrIHRvIHRoZSBjYWxsZXIuCisgIHN0ZDo6c3RyaW5nIEZuTmFtZSA9ICJjaGVjayIgKyBBdHRyLmdldE5hbWUoKSArICJBcHBlcnRhaW5zVG8iOworICBzdGQ6OnN0cmluZ3N0cmVhbSBTUzsKKyAgU1MgPDwgInN0YXRpYyBib29sICIgPDwgRm5OYW1lIDw8ICIoU2VtYSAmUywgY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0ciwgIjsKKyAgU1MgPDwgImNvbnN0IERlY2wgKkQpIHtcbiI7CisgIFNTIDw8ICIgIGlmICgiOworICBmb3IgKGF1dG8gSSA9IFN1YmplY3RzLmJlZ2luKCksIEUgPSBTdWJqZWN0cy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAvLyBJZiB0aGUgc3ViamVjdCBoYXMgY3VzdG9tIGNvZGUgYXNzb2NpYXRlZCB3aXRoIGl0LCBnZW5lcmF0ZSBhIGZ1bmN0aW9uCisgICAgLy8gZm9yIGl0LiBUaGUgZnVuY3Rpb24gY2Fubm90IGJlIGlubGluZWQgaW50byB0aGlzIGNoZWNrICh5ZXQpIGJlY2F1c2UgaXQKKyAgICAvLyByZXF1aXJlcyB0aGUgc3ViamVjdCB0byBiZSBvZiBhIHNwZWNpZmljIHR5cGUsIGFuZCB3ZXJlIHRoYXQgaW5mb3JtYXRpb24KKyAgICAvLyBpbmxpbmVkIGhlcmUsIGl0IHdvdWxkIG5vdCBzdXBwb3J0IGFuIGF0dHJpYnV0ZSB3aXRoIG11bHRpcGxlIGN1c3RvbQorICAgIC8vIHN1YmplY3RzLgorICAgIGlmICgoKkkpLT5pc1N1YkNsYXNzT2YoIlN1YnNldFN1YmplY3QiKSkgeworICAgICAgU1MgPDwgIiEiIDw8IEdlbmVyYXRlQ3VzdG9tQXBwZXJ0YWluc1RvKCoqSSwgT1MpIDw8ICIoRCkiOworICAgIH0gZWxzZSB7CisgICAgICBTUyA8PCAiIWlzYTwiIDw8IEdldFN1YmplY3RXaXRoU3VmZml4KCpJKSA8PCAiPihEKSI7CisgICAgfQorCisgICAgaWYgKEkgKyAxICE9IEUpCisgICAgICBTUyA8PCAiICYmICI7CisgIH0KKyAgU1MgPDwgIikge1xuIjsKKyAgU1MgPDwgIiAgICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6IjsKKyAgU1MgPDwgKFdhcm4gPyAid2Fybl9hdHRyaWJ1dGVfd3JvbmdfZGVjbF90eXBlIiA6CisgICAgICAgICAgICAgICAiZXJyX2F0dHJpYnV0ZV93cm9uZ19kZWNsX3R5cGUiKTsKKyAgU1MgPDwgIilcbiI7CisgIFNTIDw8ICIgICAgICA8PCBBdHRyLmdldE5hbWUoKSA8PCAiOworICBTUyA8PCBDYWxjdWxhdGVEaWFnbm9zdGljKCpTdWJqZWN0T2JqKSA8PCAiO1xuIjsKKyAgU1MgPDwgIiAgICByZXR1cm4gZmFsc2U7XG4iOworICBTUyA8PCAiICB9XG4iOworICBTUyA8PCAiICByZXR1cm4gdHJ1ZTtcbiI7CisgIFNTIDw8ICJ9XG5cbiI7CisKKyAgT1MgPDwgU1Muc3RyKCk7CisgIHJldHVybiBGbk5hbWU7Cit9CisKK3N0YXRpYyB2b2lkIEdlbmVyYXRlRGVmYXVsdExhbmdPcHRSZXF1aXJlbWVudHMocmF3X29zdHJlYW0gJk9TKSB7CisgIE9TIDw8ICJzdGF0aWMgYm9vbCBkZWZhdWx0RGlhZ25vc2VMYW5nT3B0cyhTZW1hICYsICI7CisgIE9TIDw8ICJjb25zdCBBdHRyaWJ1dGVMaXN0ICYpIHtcbiI7CisgIE9TIDw8ICIgIHJldHVybiB0cnVlO1xuIjsKKyAgT1MgPDwgIn1cblxuIjsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIEdlbmVyYXRlTGFuZ09wdFJlcXVpcmVtZW50cyhjb25zdCBSZWNvcmQgJlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgeworICAvLyBJZiB0aGUgYXR0cmlidXRlIGhhcyBhbiBlbXB0eSBvciB1bnNldCBsaXN0IG9mIGxhbmd1YWdlIHJlcXVpcmVtZW50cywKKyAgLy8gcmV0dXJuIHRoZSBkZWZhdWx0IGhhbmRsZXIuCisgIHN0ZDo6dmVjdG9yPFJlY29yZCAqPiBMYW5nT3B0cyA9IFIuZ2V0VmFsdWVBc0xpc3RPZkRlZnMoIkxhbmdPcHRzIik7CisgIGlmIChMYW5nT3B0cy5lbXB0eSgpKQorICAgIHJldHVybiAiZGVmYXVsdERpYWdub3NlTGFuZ09wdHMiOworCisgIC8vIEdlbmVyYXRlIHRoZSB0ZXN0IGNvbmRpdGlvbiwgYXMgd2VsbCBhcyBhIHVuaXF1ZSBmdW5jdGlvbiBuYW1lIGZvciB0aGUKKyAgLy8gZGlhZ25vc3RpYyB0ZXN0LiBUaGUgbGlzdCBvZiBvcHRpb25zIHNob3VsZCB1c3VhbGx5IGJlIHNob3J0IChvbmUgb3IgdHdvCisgIC8vIG9wdGlvbnMpLCBhbmQgdGhlIHVuaXF1ZW5lc3MgaXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IChpdCBpcyBqdXN0IGZvcgorICAvLyBjb2RlZ2VuIGVmZmljaWVuY3kpLgorICBzdGQ6OnN0cmluZyBGbk5hbWUgPSAiY2hlY2siLCBUZXN0OworICBmb3IgKGF1dG8gSSA9IExhbmdPcHRzLmJlZ2luKCksIEUgPSBMYW5nT3B0cy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBzdGQ6OnN0cmluZyBQYXJ0ID0gKCpJKS0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZSIpOworICAgIFRlc3QgKz0gIlMuTGFuZ09wdHMuIiArIFBhcnQ7CisgICAgaWYgKEkgKyAxICE9IEUpCisgICAgICBUZXN0ICs9ICIgfHwgIjsKKyAgICBGbk5hbWUgKz0gUGFydDsKKyAgfQorICBGbk5hbWUgKz0gIkxhbmdPcHRzIjsKKworICAvLyBJZiB0aGlzIGNvZGUgaGFzIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQsIHNpbXBseSByZXR1cm4gdGhlIHByZXZpb3VzCisgIC8vIGluc3RhbmNlIG9mIGl0LgorICBzdGF0aWMgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEN1c3RvbUxhbmdPcHRzU2V0OworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIEkgPSBDdXN0b21MYW5nT3B0c1NldC5maW5kKEZuTmFtZSk7CisgIGlmIChJICE9IEN1c3RvbUxhbmdPcHRzU2V0LmVuZCgpKQorICAgIHJldHVybiAqSTsKKworICBPUyA8PCAic3RhdGljIGJvb2wgIiA8PCBGbk5hbWUgPDwgIihTZW1hICZTLCBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7XG4iOworICBPUyA8PCAiICBpZiAoIiA8PCBUZXN0IDw8ICIpXG4iOworICBPUyA8PCAiICAgIHJldHVybiB0cnVlO1xuXG4iOworICBPUyA8PCAiICBTLkRpYWcoQXR0ci5nZXRMb2MoKSwgZGlhZzo6d2Fybl9hdHRyaWJ1dGVfaWdub3JlZCkgIjsKKyAgT1MgPDwgIjw8IEF0dHIuZ2V0TmFtZSgpO1xuIjsKKyAgT1MgPDwgIiAgcmV0dXJuIGZhbHNlO1xuIjsKKyAgT1MgPDwgIn1cblxuIjsKKworICBDdXN0b21MYW5nT3B0c1NldC5pbnNlcnQoRm5OYW1lKTsKKyAgcmV0dXJuIEZuTmFtZTsKK30KKworc3RhdGljIHZvaWQgR2VuZXJhdGVEZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzKHJhd19vc3RyZWFtICZPUykgeworICBPUyA8PCAic3RhdGljIGJvb2wgZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cyhjb25zdCBsbHZtOjpUcmlwbGUgJikge1xuIjsKKyAgT1MgPDwgIiAgcmV0dXJuIHRydWU7XG4iOworICBPUyA8PCAifVxuXG4iOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgR2VuZXJhdGVUYXJnZXRSZXF1aXJlbWVudHMoY29uc3QgUmVjb3JkICZBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnNlZEF0dHJNYXAgJkR1cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgeworICAvLyBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBhIHRhcmdldCBzcGVjaWZpYyBhdHRyaWJ1dGUsIHJldHVybiB0aGUgZGVmYXVsdAorICAvLyB0YXJnZXQgaGFuZGxlci4KKyAgaWYgKCFBdHRyLmlzU3ViQ2xhc3NPZigiVGFyZ2V0U3BlY2lmaWNBdHRyIikpCisgICAgcmV0dXJuICJkZWZhdWx0VGFyZ2V0UmVxdWlyZW1lbnRzIjsKKworICAvLyBHZXQgdGhlIGxpc3Qgb2YgYXJjaGl0ZWN0dXJlcyB0byBiZSB0ZXN0ZWQgZm9yLgorICBjb25zdCBSZWNvcmQgKlIgPSBBdHRyLmdldFZhbHVlQXNEZWYoIlRhcmdldCIpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQXJjaGVzID0gUi0+Z2V0VmFsdWVBc0xpc3RPZlN0cmluZ3MoIkFyY2hlcyIpOworICBpZiAoQXJjaGVzLmVtcHR5KCkpIHsKKyAgICBQcmludEVycm9yKEF0dHIuZ2V0TG9jKCksICJFbXB0eSBsaXN0IG9mIHRhcmdldCBhcmNoaXRlY3R1cmVzIGZvciBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQtc3BlY2lmaWMgYXR0ciIpOworICAgIHJldHVybiAiZGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cyI7CisgIH0KKworICAvLyBJZiB0aGVyZSBhcmUgb3RoZXIgYXR0cmlidXRlcyB3aGljaCBzaGFyZSB0aGUgc2FtZSBwYXJzZWQgYXR0cmlidXRlIGtpbmQsCisgIC8vIHN1Y2ggYXMgdGFyZ2V0LXNwZWNpZmljIGF0dHJpYnV0ZXMgd2l0aCBhIHNoYXJlZCBzcGVsbGluZywgY29sbGFwc2UgdGhlCisgIC8vIGR1cGxpY2F0ZSBhcmNoaXRlY3R1cmVzLiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgYSBzaGFyZWQgdGFyZ2V0LXNwZWNpZmljCisgIC8vIGF0dHJpYnV0ZSBoYXMgb25seSBvbmUgQXR0cmlidXRlTGlzdDo6S2luZCBlbnVtZXJhdGlvbiB2YWx1ZSwgYnV0IGl0CisgIC8vIGFwcGxpZXMgdG8gbXVsdGlwbGUgdGFyZ2V0IGFyY2hpdGVjdHVyZXMuIEluIG9yZGVyIGZvciB0aGUgYXR0cmlidXRlIHRvIGJlCisgIC8vIGNvbnNpZGVyZWQgdmFsaWQsIGFsbCBvZiBpdHMgYXJjaGl0ZWN0dXJlcyBuZWVkIHRvIGJlIGluY2x1ZGVkLgorICBpZiAoIUF0dHIuaXNWYWx1ZVVuc2V0KCJQYXJzZUtpbmQiKSkgeworICAgIHN0ZDo6c3RyaW5nIEFQSyA9IEF0dHIuZ2V0VmFsdWVBc1N0cmluZygiUGFyc2VLaW5kIik7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogRHVwZXMpIHsKKyAgICAgIGlmIChJLmZpcnN0ID09IEFQSykgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gREEgPSBJLnNlY29uZC0+Z2V0VmFsdWVBc0RlZigiVGFyZ2V0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0VmFsdWVBc0xpc3RPZlN0cmluZ3MoIkFyY2hlcyIpOworICAgICAgICBzdGQ6OmNvcHkoREEuYmVnaW4oKSwgREEuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcihBcmNoZXMpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBGbk5hbWUgPSAiaXNUYXJnZXQiLCBUZXN0ID0gIigiOworICBmb3IgKGF1dG8gSSA9IEFyY2hlcy5iZWdpbigpLCBFID0gQXJjaGVzLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIHN0ZDo6c3RyaW5nIFBhcnQgPSAqSTsKKyAgICBUZXN0ICs9ICJBcmNoID09IGxsdm06OlRyaXBsZTo6IiArIFBhcnQ7CisgICAgaWYgKEkgKyAxICE9IEUpCisgICAgICBUZXN0ICs9ICIgfHwgIjsKKyAgICBGbk5hbWUgKz0gUGFydDsKKyAgfQorICBUZXN0ICs9ICIpIjsKKworICAvLyBJZiB0aGUgdGFyZ2V0IGFsc28gcmVxdWlyZXMgT1MgdGVzdGluZywgZ2VuZXJhdGUgdGhvc2UgdGVzdHMgYXMgd2VsbC4KKyAgYm9vbCBVc2VzT1MgPSBmYWxzZTsKKyAgaWYgKCFSLT5pc1ZhbHVlVW5zZXQoIk9TZXMiKSkgeworICAgIFVzZXNPUyA9IHRydWU7CisgICAgCisgICAgLy8gV2Uga25vdyB0aGF0IHRoZXJlIHdhcyBhdCBsZWFzdCBvbmUgYXJjaCB0ZXN0LCBzbyB3ZSBuZWVkIHRvIGFuZCBpbiB0aGUKKyAgICAvLyBPUyB0ZXN0cy4KKyAgICBUZXN0ICs9ICIgJiYgKCI7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE9TZXMgPSBSLT5nZXRWYWx1ZUFzTGlzdE9mU3RyaW5ncygiT1NlcyIpOworICAgIGZvciAoYXV0byBJID0gT1Nlcy5iZWdpbigpLCBFID0gT1Nlcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIFBhcnQgPSAqSTsKKworICAgICAgVGVzdCArPSAiT1MgPT0gbGx2bTo6VHJpcGxlOjoiICsgUGFydDsKKyAgICAgIGlmIChJICsgMSAhPSBFKQorICAgICAgICBUZXN0ICs9ICIgfHwgIjsKKyAgICAgIEZuTmFtZSArPSBQYXJ0OworICAgIH0KKyAgICBUZXN0ICs9ICIpIjsKKyAgfQorCisgIC8vIElmIHRoaXMgY29kZSBoYXMgYWxyZWFkeSBiZWVuIGdlbmVyYXRlZCwgc2ltcGx5IHJldHVybiB0aGUgcHJldmlvdXMKKyAgLy8gaW5zdGFuY2Ugb2YgaXQuCisgIHN0YXRpYyBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gQ3VzdG9tVGFyZ2V0U2V0OworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIEkgPSBDdXN0b21UYXJnZXRTZXQuZmluZChGbk5hbWUpOworICBpZiAoSSAhPSBDdXN0b21UYXJnZXRTZXQuZW5kKCkpCisgICAgcmV0dXJuICpJOworCisgIE9TIDw8ICJzdGF0aWMgYm9vbCAiIDw8IEZuTmFtZSA8PCAiKGNvbnN0IGxsdm06OlRyaXBsZSAmVCkge1xuIjsKKyAgT1MgPDwgIiAgbGx2bTo6VHJpcGxlOjpBcmNoVHlwZSBBcmNoID0gVC5nZXRBcmNoKCk7XG4iOworICBpZiAoVXNlc09TKQorICAgIE9TIDw8ICIgIGxsdm06OlRyaXBsZTo6T1NUeXBlIE9TID0gVC5nZXRPUygpO1xuIjsKKyAgT1MgPDwgIiAgcmV0dXJuICIgPDwgVGVzdCA8PCAiO1xuIjsKKyAgT1MgPDwgIn1cblxuIjsKKworICBDdXN0b21UYXJnZXRTZXQuaW5zZXJ0KEZuTmFtZSk7CisgIHJldHVybiBGbk5hbWU7Cit9CisKK3N0YXRpYyB2b2lkIEdlbmVyYXRlRGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcocmF3X29zdHJlYW0gJk9TKSB7CisgIE9TIDw8ICJzdGF0aWMgdW5zaWduZWQgZGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcoIgorICAgICA8PCAiY29uc3QgQXR0cmlidXRlTGlzdCAmQXR0cikge1xuIjsKKyAgT1MgPDwgIiAgcmV0dXJuIFVJTlRfTUFYO1xuIjsKKyAgT1MgPDwgIn1cblxuIjsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIEdlbmVyYXRlU3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZyhjb25zdCBSZWNvcmQgJkF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgeworICAvLyBJZiB0aGUgYXR0cmlidXRlIGRvZXMgbm90IGhhdmUgYSBzZW1hbnRpYyBmb3JtLCB3ZSBjYW4gYmFpbCBvdXQgZWFybHkuCisgIGlmICghQXR0ci5nZXRWYWx1ZUFzQml0KCJBU1ROb2RlIikpCisgICAgcmV0dXJuICJkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZyI7CisKKyAgc3RkOjp2ZWN0b3I8RmxhdHRlbmVkU3BlbGxpbmc+IFNwZWxsaW5ncyA9IEdldEZsYXR0ZW5lZFNwZWxsaW5ncyhBdHRyKTsKKworICAvLyBJZiB0aGVyZSBhcmUgemVybyBvciBvbmUgc3BlbGxpbmdzLCBvciBhbGwgb2YgdGhlIHNwZWxsaW5ncyBzaGFyZSB0aGUgc2FtZQorICAvLyBuYW1lLCB3ZSBjYW4gYWxzbyBiYWlsIG91dCBlYXJseS4KKyAgaWYgKFNwZWxsaW5ncy5zaXplKCkgPD0gMSB8fCBTcGVsbGluZ05hbWVzQXJlQ29tbW9uKFNwZWxsaW5ncykpCisgICAgcmV0dXJuICJkZWZhdWx0U3BlbGxpbmdJbmRleFRvU2VtYW50aWNTcGVsbGluZyI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGVudW1lcmF0aW9uIHdlIHdpbGwgdXNlIGZvciB0aGUgbWFwcGluZy4KKyAgU2VtYW50aWNTcGVsbGluZ01hcCBTZW1hbnRpY1RvU3ludGFjdGljTWFwOworICBzdGQ6OnN0cmluZyBFbnVtID0gQ3JlYXRlU2VtYW50aWNTcGVsbGluZ3MoU3BlbGxpbmdzLCBTZW1hbnRpY1RvU3ludGFjdGljTWFwKTsKKyAgc3RkOjpzdHJpbmcgTmFtZSA9IEF0dHIuZ2V0TmFtZSgpICsgIkF0dHJTcGVsbGluZ01hcCI7CisKKyAgT1MgPDwgInN0YXRpYyB1bnNpZ25lZCAiIDw8IE5hbWUgPDwgIihjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRyKSB7XG4iOworICBPUyA8PCBFbnVtOworICBPUyA8PCAiICB1bnNpZ25lZCBJZHggPSBBdHRyLmdldEF0dHJpYnV0ZVNwZWxsaW5nTGlzdEluZGV4KCk7XG4iOworICBXcml0ZVNlbWFudGljU3BlbGxpbmdTd2l0Y2goIklkeCIsIFNlbWFudGljVG9TeW50YWN0aWNNYXAsIE9TKTsKKyAgT1MgPDwgIn1cblxuIjsKKworICByZXR1cm4gTmFtZTsKK30KKworc3RhdGljIGJvb2wgSXNLbm93blRvR0NDKGNvbnN0IFJlY29yZCAmQXR0cikgeworICAvLyBMb29rIGF0IHRoZSBzcGVsbGluZ3MgZm9yIHRoaXMgc3ViamVjdDsgaWYgdGhlcmUgYXJlIGFueSBzcGVsbGluZ3Mgd2hpY2gKKyAgLy8gY2xhaW0gdG8gYmUga25vd24gdG8gR0NDLCB0aGUgYXR0cmlidXRlIGlzIGtub3duIHRvIEdDQy4KKyAgc3RkOjp2ZWN0b3I8RmxhdHRlbmVkU3BlbGxpbmc+IFNwZWxsaW5ncyA9IEdldEZsYXR0ZW5lZFNwZWxsaW5ncyhBdHRyKTsKKyAgZm9yIChjb25zdCBhdXRvICZJIDogU3BlbGxpbmdzKSB7CisgICAgaWYgKEkua25vd25Ub0dDQygpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCiAvLy8gRW1pdHMgdGhlIHBhcnNlZCBhdHRyaWJ1dGUgaGVscGVycwogdm9pZCBFbWl0Q2xhbmdBdHRyUGFyc2VkQXR0ckltcGwoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpIHsKICAgZW1pdFNvdXJjZUZpbGVIZWFkZXIoIlBhcnNlZCBhdHRyaWJ1dGUgaGVscGVycyIsIE9TKTsKIAotICBQYXJzZWRBdHRyTWFwIEF0dHJzID0gZ2V0UGFyc2VkQXR0ckxpc3QoUmVjb3Jkcyk7CisgIC8vIEdldCB0aGUgbGlzdCBvZiBwYXJzZWQgYXR0cmlidXRlcywgYW5kIGFjY2VwdCB0aGUgb3B0aW9uYWwgbGlzdCBvZgorICAvLyBkdXBsaWNhdGVzIGR1ZSB0byB0aGUgUGFyc2VLaW5kLgorICBQYXJzZWRBdHRyTWFwIER1cGVzOworICBQYXJzZWRBdHRyTWFwIEF0dHJzID0gZ2V0UGFyc2VkQXR0ckxpc3QoUmVjb3JkcywgJkR1cGVzKTsKIAotICBPUyA8PCAic3RhdGljIGNvbnN0IFBhcnNlZEF0dHJJbmZvIEF0dHJJbmZvTWFwW0F0dHJpYnV0ZUxpc3Q6OlVua25vd25BdHRyaWJ1dGUgKyAxXSA9IHtcbiI7Ci0gIGZvciAoUGFyc2VkQXR0ck1hcDo6aXRlcmF0b3IgSSA9IEF0dHJzLmJlZ2luKCksIEUgPSBBdHRycy5lbmQoKTsgSSAhPSBFOwotICAgICAgICsrSSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGVmYXVsdCBhcHBlcnRhaW5zVG8sIHRhcmdldCBhbmQgbGFuZ3VhZ2Ugb3B0aW9uIGRpYWdub3N0aWMsCisgIC8vIGFuZCBzcGVsbGluZyBsaXN0IGluZGV4IG1hcHBpbmcgbWV0aG9kcy4KKyAgR2VuZXJhdGVEZWZhdWx0QXBwZXJ0YWluc1RvKE9TKTsKKyAgR2VuZXJhdGVEZWZhdWx0TGFuZ09wdFJlcXVpcmVtZW50cyhPUyk7CisgIEdlbmVyYXRlRGVmYXVsdFRhcmdldFJlcXVpcmVtZW50cyhPUyk7CisgIEdlbmVyYXRlRGVmYXVsdFNwZWxsaW5nSW5kZXhUb1NlbWFudGljU3BlbGxpbmcoT1MpOworCisgIC8vIEdlbmVyYXRlIHRoZSBhcHBlcnRhaW5zVG8gZGlhZ25vc3RpYyBtZXRob2RzIGFuZCB3cml0ZSB0aGVpciBuYW1lcyBpbnRvCisgIC8vIGFub3RoZXIgbWFwcGluZy4gQXQgdGhlIHNhbWUgdGltZSwgZ2VuZXJhdGUgdGhlIEF0dHJJbmZvTWFwIG9iamVjdAorICAvLyBjb250ZW50cy4gRHVlIHRvIHRoZSByZWxpYW5jZSBvbiBnZW5lcmF0ZWQgY29kZSwgdXNlIHNlcGFyYXRlIHN0cmVhbXMgc28KKyAgLy8gdGhhdCBjb2RlIHdpbGwgbm90IGJlIGludGVybGVhdmVkLgorICBzdGQ6OnN0cmluZ3N0cmVhbSBTUzsKKyAgZm9yIChhdXRvIEkgPSBBdHRycy5iZWdpbigpLCBFID0gQXR0cnMuZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgLy8gVE9ETzogSWYgdGhlIGF0dHJpYnV0ZSdzIGtpbmQgYXBwZWFycyBpbiB0aGUgbGlzdCBvZiBkdXBsaWNhdGVzLCB0aGF0IGlzCisgICAgLy8gYmVjYXVzZSBpdCBpcyBhIHRhcmdldC1zcGVjaWZpYyBhdHRyaWJ1dGUgdGhhdCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzLgorICAgIC8vIEl0IHdvdWxkIGJlIGJlbmVmaWNpYWwgdG8gdGVzdCB3aGV0aGVyIHRoZSBkdXBsaWNhdGVzIGFyZSAic2ltaWxhcgorICAgIC8vIGVub3VnaCIgdG8gZWFjaCBvdGhlciB0byBub3QgY2F1c2UgcHJvYmxlbXMuIEZvciBpbnN0YW5jZSwgY2hlY2sgdGhhdAorICAgIC8vIHRoZSBzcGVsbGluZ3MgYXJlIGlkZW50aWNhbCwgYW5kIGN1c3RvbSBwYXJzaW5nIHJ1bGVzIG1hdGNoLCBldGMuCisKICAgICAvLyBXZSBuZWVkIHRvIGdlbmVyYXRlIHN0cnVjdCBpbnN0YW5jZXMgYmFzZWQgb2ZmIFBhcnNlZEF0dHJJbmZvIGZyb20KICAgICAvLyBBdHRyaWJ1dGVMaXN0LmNwcC4KLSAgICBPUyA8PCAiICB7ICI7Ci0gICAgZW1pdEFyZ0luZm8oKkktPnNlY29uZCwgT1MpOwotICAgIE9TIDw8ICIsICIgPDwgSS0+c2Vjb25kLT5nZXRWYWx1ZUFzQml0KCJIYXNDdXN0b21QYXJzaW5nIik7Ci0gICAgT1MgPDwgIiB9IjsKKyAgICBTUyA8PCAiICB7ICI7CisgICAgZW1pdEFyZ0luZm8oKkktPnNlY29uZCwgU1MpOworICAgIFNTIDw8ICIsICIgPDwgSS0+c2Vjb25kLT5nZXRWYWx1ZUFzQml0KCJIYXNDdXN0b21QYXJzaW5nIik7CisgICAgU1MgPDwgIiwgIiA8PCBJLT5zZWNvbmQtPmlzU3ViQ2xhc3NPZigiVGFyZ2V0U3BlY2lmaWNBdHRyIik7CisgICAgU1MgPDwgIiwgIiA8PCBJLT5zZWNvbmQtPmlzU3ViQ2xhc3NPZigiVHlwZUF0dHIiKTsKKyAgICBTUyA8PCAiLCAiIDw8IElzS25vd25Ub0dDQygqSS0+c2Vjb25kKTsKKyAgICBTUyA8PCAiLCAiIDw8IEdlbmVyYXRlQXBwZXJ0YWluc1RvKCpJLT5zZWNvbmQsIE9TKTsKKyAgICBTUyA8PCAiLCAiIDw8IEdlbmVyYXRlTGFuZ09wdFJlcXVpcmVtZW50cygqSS0+c2Vjb25kLCBPUyk7CisgICAgU1MgPDwgIiwgIiA8PCBHZW5lcmF0ZVRhcmdldFJlcXVpcmVtZW50cygqSS0+c2Vjb25kLCBEdXBlcywgT1MpOworICAgIFNTIDw8ICIsICIgPDwgR2VuZXJhdGVTcGVsbGluZ0luZGV4VG9TZW1hbnRpY1NwZWxsaW5nKCpJLT5zZWNvbmQsIE9TKTsKKyAgICBTUyA8PCAiIH0iOwogCiAgICAgaWYgKEkgKyAxICE9IEUpCi0gICAgICBPUyA8PCAiLCI7Ci0gICAgCi0gICAgT1MgPDwgIiAgLy8gQVRfIiA8PCBJLT5maXJzdCA8PCAiXG4iOworICAgICAgU1MgPDwgIiwiOworCisgICAgU1MgPDwgIiAgLy8gQVRfIiA8PCBJLT5maXJzdCA8PCAiXG4iOwogICB9CisKKyAgT1MgPDwgInN0YXRpYyBjb25zdCBQYXJzZWRBdHRySW5mbyBBdHRySW5mb01hcFtBdHRyaWJ1dGVMaXN0OjpVbmtub3duQXR0cmlidXRlICsgMV0gPSB7XG4iOworICBPUyA8PCBTUy5zdHIoKTsKICAgT1MgPDwgIn07XG5cbiI7CiB9CiAKQEAgLTE3MjQsNTAgKzI0NzcsNzYgQEAKIHZvaWQgRW1pdENsYW5nQXR0clBhcnNlZEF0dHJLaW5kcyhSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUykgewogICBlbWl0U291cmNlRmlsZUhlYWRlcigiQXR0cmlidXRlIG5hbWUgbWF0Y2hlciIsIE9TKTsKIAotICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBBdHRycyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJBdHRyIik7CisgIHN0ZDo6dmVjdG9yPFJlY29yZCAqPiBBdHRycyA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJBdHRyIik7CisgIHN0ZDo6dmVjdG9yPFN0cmluZ01hdGNoZXI6OlN0cmluZ1BhaXI+IEdOVSwgRGVjbHNwZWMsIENYWDExLCBLZXl3b3JkczsKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IFNlZW47CisgIGZvciAoYXV0byBJIDogQXR0cnMpIHsKKyAgICBjb25zdCBSZWNvcmQgJkF0dHIgPSAqSTsKIAotICBzdGQ6OnZlY3RvcjxTdHJpbmdNYXRjaGVyOjpTdHJpbmdQYWlyPiBNYXRjaGVzOwotICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+OjppdGVyYXRvciBJID0gQXR0cnMuYmVnaW4oKSwgRSA9IEF0dHJzLmVuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgUmVjb3JkICZBdHRyID0gKipJOwotICAgIAogICAgIGJvb2wgU2VtYUhhbmRsZXIgPSBBdHRyLmdldFZhbHVlQXNCaXQoIlNlbWFIYW5kbGVyIik7CiAgICAgYm9vbCBJZ25vcmVkID0gQXR0ci5nZXRWYWx1ZUFzQml0KCJJZ25vcmVkIik7Ci0gICAgYm9vbCBEaXN0aW5jdFNwZWxsaW5ncyA9IEF0dHIuZ2V0VmFsdWVBc0JpdCgiRGlzdGluY3RTcGVsbGluZ3MiKTsKICAgICBpZiAoU2VtYUhhbmRsZXIgfHwgSWdub3JlZCkgewotICAgICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gU3BlbGxpbmdzID0gQXR0ci5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiU3BlbGxpbmdzIik7CisgICAgICAvLyBBdHRyaWJ1dGUgc3BlbGxpbmdzIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiB0YXJnZXQtc3BlY2lmaWMgYXR0cmlidXRlcywKKyAgICAgIC8vIGFuZCBjYW4gYmUgc2hhcmVkIGJldHdlZW4gc3ludGF4ZXMgZm9yIHRoZSBzYW1lIGF0dHJpYnV0ZS4gRm9yCisgICAgICAvLyBpbnN0YW5jZSwgYW4gYXR0cmlidXRlIGNhbiBiZSBzcGVsbGVkIEdOVTwiaW50ZXJydXB0Ij4gZm9yIGFuIEFSTS0KKyAgICAgIC8vIHNwZWNpZmljIGF0dHJpYnV0ZSwgb3IgTVNQNDMwLXNwZWNpZmljIGF0dHJpYnV0ZS4gQWRkaXRpb25hbGx5LCBhbgorICAgICAgLy8gYXR0cmlidXRlIGNhbiBiZSBzcGVsbGVkIEdOVTwiZGxsZXhwb3J0Ij4gYW5kIERlY2xzcGVjPCJkbGxleHBvcnQiPgorICAgICAgLy8gZm9yIHRoZSBzYW1lIHNlbWFudGljIGF0dHJpYnV0ZS4gVWx0aW1hdGVseSwgd2UgbmVlZCB0byBtYXAgZWFjaCBvZgorICAgICAgLy8gdGhlc2UgdG8gYSBzaW5nbGUgQXR0cmlidXRlTGlzdDo6S2luZCB2YWx1ZSwgYnV0IHRoZSBTdHJpbmdNYXRjaGVyCisgICAgICAvLyBjbGFzcyBjYW5ub3QgaGFuZGxlIGR1cGxpY2F0ZSBtYXRjaCBzdHJpbmdzLiBTbyB3ZSBnZW5lcmF0ZSBhIGxpc3Qgb2YKKyAgICAgIC8vIHN0cmluZyB0byBtYXRjaCBiYXNlZCBvbiB0aGUgc3ludGF4LCBhbmQgZW1pdCBtdWx0aXBsZSBzdHJpbmcgbWF0Y2hlcnMKKyAgICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgc3ludGF4IHVzZWQuCisgICAgICBzdGQ6OnN0cmluZyBBdHRyTmFtZTsKKyAgICAgIGlmIChBdHRyLmlzU3ViQ2xhc3NPZigiVGFyZ2V0U3BlY2lmaWNBdHRyIikgJiYKKyAgICAgICAgICAhQXR0ci5pc1ZhbHVlVW5zZXQoIlBhcnNlS2luZCIpKSB7CisgICAgICAgIEF0dHJOYW1lID0gQXR0ci5nZXRWYWx1ZUFzU3RyaW5nKCJQYXJzZUtpbmQiKTsKKyAgICAgICAgaWYgKFNlZW4uZmluZChBdHRyTmFtZSkgIT0gU2Vlbi5lbmQoKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgU2Vlbi5pbnNlcnQoQXR0ck5hbWUpOworICAgICAgfSBlbHNlCisgICAgICAgIEF0dHJOYW1lID0gTm9ybWFsaXplQXR0ck5hbWUoU3RyaW5nUmVmKEF0dHIuZ2V0TmFtZSgpKSkuc3RyKCk7CiAKLSAgICAgIGZvciAoc3RkOjp2ZWN0b3I8UmVjb3JkKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBTcGVsbGluZ3MuYmVnaW4oKSwKLSAgICAgICAgICAgRSA9IFNwZWxsaW5ncy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgUmF3U3BlbGxpbmcgPSAoKkkpLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIik7Ci0gICAgICAgIFN0cmluZ1JlZiBBdHRyTmFtZSA9IE5vcm1hbGl6ZUF0dHJOYW1lKERpc3RpbmN0U3BlbGxpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmdSZWYoUmF3U3BlbGxpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmdSZWYoQXR0ci5nZXROYW1lKCkpKTsKLQotICAgICAgICBTbWFsbFN0cmluZzw2ND4gU3BlbGxpbmc7Ci0gICAgICAgIGlmICgoKkkpLT5nZXRWYWx1ZUFzU3RyaW5nKCJWYXJpZXR5IikgPT0gIkNYWDExIikgewotICAgICAgICAgIFNwZWxsaW5nICs9ICgqSSktPmdldFZhbHVlQXNTdHJpbmcoIk5hbWVzcGFjZSIpOworICAgICAgc3RkOjp2ZWN0b3I8RmxhdHRlbmVkU3BlbGxpbmc+IFNwZWxsaW5ncyA9IEdldEZsYXR0ZW5lZFNwZWxsaW5ncyhBdHRyKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byAmUyA6IFNwZWxsaW5ncykgeworICAgICAgICBzdGQ6OnN0cmluZyBSYXdTcGVsbGluZyA9IFMubmFtZSgpOworICAgICAgICBzdGQ6OnZlY3RvcjxTdHJpbmdNYXRjaGVyOjpTdHJpbmdQYWlyPiAqTWF0Y2hlcyA9IDA7CisgICAgICAgIHN0ZDo6c3RyaW5nIFNwZWxsaW5nLCBWYXJpZXR5ID0gUy52YXJpZXR5KCk7CisgICAgICAgIGlmIChWYXJpZXR5ID09ICJDWFgxMSIpIHsKKyAgICAgICAgICBNYXRjaGVzID0gJkNYWDExOworICAgICAgICAgIFNwZWxsaW5nICs9IFMubmFtZVNwYWNlKCk7CiAgICAgICAgICAgU3BlbGxpbmcgKz0gIjo6IjsKLSAgICAgICAgfQotICAgICAgICBTcGVsbGluZyArPSBOb3JtYWxpemVBdHRyU3BlbGxpbmcoUmF3U3BlbGxpbmcpOworICAgICAgICB9IGVsc2UgaWYgKFZhcmlldHkgPT0gIkdOVSIpCisgICAgICAgICAgTWF0Y2hlcyA9ICZHTlU7CisgICAgICAgIGVsc2UgaWYgKFZhcmlldHkgPT0gIkRlY2xzcGVjIikKKyAgICAgICAgICBNYXRjaGVzID0gJkRlY2xzcGVjOworICAgICAgICBlbHNlIGlmIChWYXJpZXR5ID09ICJLZXl3b3JkIikKKyAgICAgICAgICBNYXRjaGVzID0gJktleXdvcmRzOwogCisgICAgICAgIGFzc2VydChNYXRjaGVzICYmICJVbnN1cHBvcnRlZCBzcGVsbGluZyB2YXJpZXR5IGZvdW5kIik7CisKKyAgICAgICAgU3BlbGxpbmcgKz0gTm9ybWFsaXplQXR0clNwZWxsaW5nKFJhd1NwZWxsaW5nKTsKICAgICAgICAgaWYgKFNlbWFIYW5kbGVyKQotICAgICAgICAgIE1hdGNoZXMucHVzaF9iYWNrKAotICAgICAgICAgICAgU3RyaW5nTWF0Y2hlcjo6U3RyaW5nUGFpcigKLSAgICAgICAgICAgICAgU3RyaW5nUmVmKFNwZWxsaW5nKSwKLSAgICAgICAgICAgICAgInJldHVybiBBdHRyaWJ1dGVMaXN0OjpBVF8iICsgQXR0ck5hbWUuc3RyKCkgKyAiOyIpKTsKKyAgICAgICAgICBNYXRjaGVzLT5wdXNoX2JhY2soU3RyaW5nTWF0Y2hlcjo6U3RyaW5nUGFpcihTcGVsbGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm4gQXR0cmlidXRlTGlzdDo6QVRfIiArIEF0dHJOYW1lICsgIjsiKSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICBNYXRjaGVzLnB1c2hfYmFjaygKLSAgICAgICAgICAgIFN0cmluZ01hdGNoZXI6OlN0cmluZ1BhaXIoCi0gICAgICAgICAgICAgIFN0cmluZ1JlZihTcGVsbGluZyksCi0gICAgICAgICAgICAgICJyZXR1cm4gQXR0cmlidXRlTGlzdDo6SWdub3JlZEF0dHJpYnV0ZTsiKSk7CisgICAgICAgICAgTWF0Y2hlcy0+cHVzaF9iYWNrKFN0cmluZ01hdGNoZXI6OlN0cmluZ1BhaXIoU3BlbGxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuIEF0dHJpYnV0ZUxpc3Q6Oklnbm9yZWRBdHRyaWJ1dGU7IikpOwogICAgICAgfQogICAgIH0KICAgfQogICAKLSAgT1MgPDwgInN0YXRpYyBBdHRyaWJ1dGVMaXN0OjpLaW5kIGdldEF0dHJLaW5kKFN0cmluZ1JlZiBOYW1lKSB7XG4iOwotICBTdHJpbmdNYXRjaGVyKCJOYW1lIiwgTWF0Y2hlcywgT1MpLkVtaXQoKTsKLSAgT1MgPDwgInJldHVybiBBdHRyaWJ1dGVMaXN0OjpVbmtub3duQXR0cmlidXRlO1xuIgorICBPUyA8PCAic3RhdGljIEF0dHJpYnV0ZUxpc3Q6OktpbmQgZ2V0QXR0cktpbmQoU3RyaW5nUmVmIE5hbWUsICI7CisgIE9TIDw8ICJBdHRyaWJ1dGVMaXN0OjpTeW50YXggU3ludGF4KSB7XG4iOworICBPUyA8PCAiICBpZiAoQXR0cmlidXRlTGlzdDo6QVNfR05VID09IFN5bnRheCkge1xuIjsKKyAgU3RyaW5nTWF0Y2hlcigiTmFtZSIsIEdOVSwgT1MpLkVtaXQoKTsKKyAgT1MgPDwgIiAgfSBlbHNlIGlmIChBdHRyaWJ1dGVMaXN0OjpBU19EZWNsc3BlYyA9PSBTeW50YXgpIHtcbiI7CisgIFN0cmluZ01hdGNoZXIoIk5hbWUiLCBEZWNsc3BlYywgT1MpLkVtaXQoKTsKKyAgT1MgPDwgIiAgfSBlbHNlIGlmIChBdHRyaWJ1dGVMaXN0OjpBU19DWFgxMSA9PSBTeW50YXgpIHtcbiI7CisgIFN0cmluZ01hdGNoZXIoIk5hbWUiLCBDWFgxMSwgT1MpLkVtaXQoKTsKKyAgT1MgPDwgIiAgfSBlbHNlIGlmIChBdHRyaWJ1dGVMaXN0OjpBU19LZXl3b3JkID09IFN5bnRheCkge1xuIjsKKyAgU3RyaW5nTWF0Y2hlcigiTmFtZSIsIEtleXdvcmRzLCBPUykuRW1pdCgpOworICBPUyA8PCAiICB9XG4iOworICBPUyA8PCAiICByZXR1cm4gQXR0cmlidXRlTGlzdDo6VW5rbm93bkF0dHJpYnV0ZTtcbiIKICAgICAgPDwgIn1cbiI7CiB9CiAKQEAgLTE3ODEsMzYgKzI1NjAsNDEgQEAKICAgICAiICAgIGxsdm1fdW5yZWFjaGFibGUoXCJVbmtub3duIGF0dHJpYnV0ZSBraW5kIVwiKTtcbiIKICAgICAiICAgIGJyZWFrO1xuIjsKICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gQXR0cnMgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiQXR0ciIpLCBBcmdzOwotICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+OjppdGVyYXRvciBJID0gQXR0cnMuYmVnaW4oKSwgRSA9IEF0dHJzLmVuZCgpOwotICAgICAgIEkgIT0gRTsgKytJKSB7Ci0gICAgUmVjb3JkICZSID0gKipJOworICBmb3IgKGF1dG8gSSA6IEF0dHJzKSB7CisgICAgY29uc3QgUmVjb3JkICZSID0gKkk7CiAgICAgaWYgKCFSLmdldFZhbHVlQXNCaXQoIkFTVE5vZGUiKSkKICAgICAgIGNvbnRpbnVlOwogICAgIE9TIDw8ICIgIGNhc2UgYXR0cjo6IiA8PCBSLmdldE5hbWUoKSA8PCAiOiB7XG4iOworCisgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBoYXMgYSBzZW1hbnRpY2FsbHktbWVhbmluZ2Z1bCBuYW1lICh3aGljaCBpcyBkZXRlcm1pbmVkCisgICAgLy8gYnkgd2hldGhlciB0aGVyZSBpcyBhIFNwZWxsaW5nIGVudW1lcmF0aW9uIGZvciBpdCksIHRoZW4gd3JpdGUgb3V0IHRoZQorICAgIC8vIHNwZWxsaW5nIHVzZWQgZm9yIHRoZSBhdHRyaWJ1dGUuCisgICAgc3RkOjp2ZWN0b3I8RmxhdHRlbmVkU3BlbGxpbmc+IFNwZWxsaW5ncyA9IEdldEZsYXR0ZW5lZFNwZWxsaW5ncyhSKTsKKyAgICBpZiAoU3BlbGxpbmdzLnNpemUoKSA+IDEgJiYgIVNwZWxsaW5nTmFtZXNBcmVDb21tb24oU3BlbGxpbmdzKSkKKyAgICAgIE9TIDw8ICIgICAgT1MgPDwgXCIgXCIgPDwgQS0+Z2V0U3BlbGxpbmcoKTtcbiI7CisKICAgICBBcmdzID0gUi5nZXRWYWx1ZUFzTGlzdE9mRGVmcygiQXJncyIpOwogICAgIGlmICghQXJncy5lbXB0eSgpKSB7CiAgICAgICBPUyA8PCAiICAgIGNvbnN0ICIgPDwgUi5nZXROYW1lKCkgPDwgIkF0dHIgKlNBID0gY2FzdDwiIDw8IFIuZ2V0TmFtZSgpCiAgICAgICAgICA8PCAiQXR0cj4oQSk7XG4iOwotICAgICAgZm9yIChzdGQ6OnZlY3RvcjxSZWNvcmQqPjo6aXRlcmF0b3IgSSA9IEFyZ3MuYmVnaW4oKSwgRSA9IEFyZ3MuZW5kKCk7Ci0gICAgICAgICAgIEkgIT0gRTsgKytJKQotICAgICAgICBjcmVhdGVBcmd1bWVudCgqKkksIFIuZ2V0TmFtZSgpKS0+d3JpdGVEdW1wKE9TKTsKKyAgICAgIGZvciAoYXV0byBBSSA6IEFyZ3MpCisgICAgICAgIGNyZWF0ZUFyZ3VtZW50KCpBSSwgUi5nZXROYW1lKCkpLT53cml0ZUR1bXAoT1MpOwogCiAgICAgICAvLyBDb2RlIGZvciBkZXRlY3RpbmcgdGhlIGxhc3QgY2hpbGQuCiAgICAgICBPUyA8PCAiICAgIGJvb2wgT2xkTW9yZUNoaWxkcmVuID0gaGFzTW9yZUNoaWxkcmVuKCk7XG4iOwotICAgICAgT1MgPDwgIiAgICBib29sIE1vcmVDaGlsZHJlbiA9IE9sZE1vcmVDaGlsZHJlbjtcbiI7ICAgICAKKyAgICAgIE9TIDw8ICIgICAgYm9vbCBNb3JlQ2hpbGRyZW47XG4iOwogCi0gICAgICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+OjppdGVyYXRvciBJID0gQXJncy5iZWdpbigpLCBFID0gQXJncy5lbmQoKTsKLSAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgIGZvciAoYXV0byBBSSA9IEFyZ3MuYmVnaW4oKSwgQUUgPSBBcmdzLmVuZCgpOyBBSSAhPSBBRTsgKytBSSkgewogICAgICAgICAvLyBNb3JlIGNvZGUgZm9yIGRldGVjdGluZyB0aGUgbGFzdCBjaGlsZC4KICAgICAgICAgT1MgPDwgIiAgICBNb3JlQ2hpbGRyZW4gPSBPbGRNb3JlQ2hpbGRyZW4iOwotICAgICAgICBmb3IgKHN0ZDo6dmVjdG9yPFJlY29yZCo+OjppdGVyYXRvciBOZXh0ID0gSSArIDE7IE5leHQgIT0gRTsgKytOZXh0KSB7CisgICAgICAgIGZvciAoYXV0byBOZXh0ID0gQUkgKyAxOyBOZXh0ICE9IEFFOyArK05leHQpIHsKICAgICAgICAgICBPUyA8PCAiIHx8ICI7CiAgICAgICAgICAgY3JlYXRlQXJndW1lbnQoKipOZXh0LCBSLmdldE5hbWUoKSktPndyaXRlSGFzQ2hpbGRyZW4oT1MpOwogICAgICAgICB9CiAgICAgICAgIE9TIDw8ICI7XG4iOwogICAgICAgICBPUyA8PCAiICAgIHNldE1vcmVDaGlsZHJlbihNb3JlQ2hpbGRyZW4pO1xuIjsKIAotICAgICAgICBjcmVhdGVBcmd1bWVudCgqKkksIFIuZ2V0TmFtZSgpKS0+d3JpdGVEdW1wQ2hpbGRyZW4oT1MpOworICAgICAgICBjcmVhdGVBcmd1bWVudCgqKkFJLCBSLmdldE5hbWUoKSktPndyaXRlRHVtcENoaWxkcmVuKE9TKTsKICAgICAgIH0KIAogICAgICAgLy8gUmVzZXQgdGhlIGxhc3QgY2hpbGQuCkBAIC0xODIzLDQgKzI2MDcsMjE2IEBACiAgIE9TIDw8ICIgIH1cbiI7CiB9CiAKK3ZvaWQgRW1pdENsYW5nQXR0clBhcnNlclN0cmluZ1N3aXRjaGVzKFJlY29yZEtlZXBlciAmUmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUykgeworICBlbWl0U291cmNlRmlsZUhlYWRlcigiUGFyc2VyLXJlbGF0ZWQgbGx2bTo6U3RyaW5nU3dpdGNoIGNhc2VzIiwgT1MpOworICBlbWl0Q2xhbmdBdHRyQXJnQ29udGV4dExpc3QoUmVjb3JkcywgT1MpOworICBlbWl0Q2xhbmdBdHRySWRlbnRpZmllckFyZ0xpc3QoUmVjb3JkcywgT1MpOworICBlbWl0Q2xhbmdBdHRyVHlwZUFyZ0xpc3QoUmVjb3JkcywgT1MpOworICBlbWl0Q2xhbmdBdHRyTGF0ZVBhcnNlZExpc3QoUmVjb3JkcywgT1MpOworfQorCitjbGFzcyBEb2N1bWVudGF0aW9uRGF0YSB7CitwdWJsaWM6CisgIGNvbnN0IFJlY29yZCAqRG9jdW1lbnRhdGlvbjsKKyAgY29uc3QgUmVjb3JkICpBdHRyaWJ1dGU7CisKKyAgRG9jdW1lbnRhdGlvbkRhdGEoY29uc3QgUmVjb3JkICZEb2N1bWVudGF0aW9uLCBjb25zdCBSZWNvcmQgJkF0dHJpYnV0ZSkKKyAgICAgIDogRG9jdW1lbnRhdGlvbigmRG9jdW1lbnRhdGlvbiksIEF0dHJpYnV0ZSgmQXR0cmlidXRlKSB7fQorfTsKKworc3RhdGljIHZvaWQgV3JpdGVDYXRlZ29yeUhlYWRlcihjb25zdCBSZWNvcmQgKkRvY0NhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUgPSBEb2NDYXRlZ29yeS0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZSIpOworICBPUyA8PCBOYW1lIDw8ICJcbiIgPDwgc3RkOjpzdHJpbmcoTmFtZS5sZW5ndGgoKSwgJz0nKSA8PCAiXG4iOworCisgIC8vIElmIHRoZXJlIGlzIGNvbnRlbnQsIHByaW50IHRoYXQgYXMgd2VsbC4KKyAgc3RkOjpzdHJpbmcgQ29udGVudFN0ciA9IERvY0NhdGVnb3J5LT5nZXRWYWx1ZUFzU3RyaW5nKCJDb250ZW50Iik7CisgIGlmICghQ29udGVudFN0ci5lbXB0eSgpKSB7CisgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBuZXdsaW5lcyBhbmQgc3BhY2VzLgorICAgIFN0cmluZ1JlZiBDb250ZW50KENvbnRlbnRTdHIpOworICAgIHdoaWxlIChDb250ZW50LnN0YXJ0c3dpdGgoIlxyIikgfHwgQ29udGVudC5zdGFydHN3aXRoKCJcbiIpIHx8CisgICAgICAgICAgIENvbnRlbnQuc3RhcnRzd2l0aCgiICIpIHx8IENvbnRlbnQuc3RhcnRzd2l0aCgiXHQiKSkKKyAgICAgICAgICAgQ29udGVudCA9IENvbnRlbnQuc3Vic3RyKDEpOworICAgIHdoaWxlIChDb250ZW50LmVuZHN3aXRoKCJcciIpIHx8IENvbnRlbnQuZW5kc3dpdGgoIlxuIikgfHwKKyAgICAgICAgICAgQ29udGVudC5lbmRzd2l0aCgiICIpIHx8IENvbnRlbnQuZW5kc3dpdGgoIlx0IikpCisgICAgICAgICAgIENvbnRlbnQgPSBDb250ZW50LnN1YnN0cigwLCBDb250ZW50LnNpemUoKSAtIDEpOworICAgIE9TIDw8IENvbnRlbnQ7CisgIH0KKyAgT1MgPDwgIlxuXG4iOworfQorCitlbnVtIFNwZWxsaW5nS2luZCB7CisgIEdOVSA9IDEgPDwgMCwKKyAgQ1hYMTEgPSAxIDw8IDEsCisgIERlY2xzcGVjID0gMSA8PCAyLAorICBLZXl3b3JkID0gMSA8PCAzCit9OworCitzdGF0aWMgdm9pZCBXcml0ZURvY3VtZW50YXRpb24oY29uc3QgRG9jdW1lbnRhdGlvbkRhdGEgJkRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpIHsKKyAgLy8gRklYTUU6IHRoZXJlIGlzIG5vIHdheSB0byBoYXZlIGEgcGVyLXNwZWxsaW5nIGNhdGVnb3J5IGZvciB0aGUgYXR0cmlidXRlCisgIC8vIGRvY3VtZW50YXRpb24uIFRoaXMgbWF5IG5vdCBiZSBhIGxpbWl0aW5nIGZhY3RvciBzaW5jZSB0aGUgc3BlbGxpbmdzCisgIC8vIHNob3VsZCBnZW5lcmFsbHkgYmUgY29uc2lzdGVudGx5IGFwcGxpZWQgYWNyb3NzIHRoZSBjYXRlZ29yeS4KKworICBzdGQ6OnZlY3RvcjxGbGF0dGVuZWRTcGVsbGluZz4gU3BlbGxpbmdzID0gR2V0RmxhdHRlbmVkU3BlbGxpbmdzKCpEb2MuQXR0cmlidXRlKTsKKworICAvLyBEZXRlcm1pbmUgdGhlIGhlYWRpbmcgdG8gYmUgdXNlZCBmb3IgdGhpcyBhdHRyaWJ1dGUuCisgIHN0ZDo6c3RyaW5nIEhlYWRpbmcgPSBEb2MuRG9jdW1lbnRhdGlvbi0+Z2V0VmFsdWVBc1N0cmluZygiSGVhZGluZyIpOworICBib29sIEN1c3RvbUhlYWRpbmcgPSAhSGVhZGluZy5lbXB0eSgpOworICBpZiAoSGVhZGluZy5lbXB0eSgpKSB7CisgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBzcGVsbGluZywgd2UgY2FuIHNpbXBseSB1c2UgdGhhdC4KKyAgICBpZiAoU3BlbGxpbmdzLnNpemUoKSA9PSAxKQorICAgICAgSGVhZGluZyA9IFNwZWxsaW5ncy5iZWdpbigpLT5uYW1lKCk7CisgICAgZWxzZSB7CisgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gVW5pcXVlczsKKyAgICAgIGZvciAoYXV0byBJID0gU3BlbGxpbmdzLmJlZ2luKCksIEUgPSBTcGVsbGluZ3MuZW5kKCk7CisgICAgICAgICAgIEkgIT0gRSAmJiBVbmlxdWVzLnNpemUoKSA8PSAxOyArK0kpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgU3BlbGxpbmcgPSBOb3JtYWxpemVOYW1lRm9yU3BlbGxpbmdDb21wYXJpc29uKEktPm5hbWUoKSk7CisgICAgICAgIFVuaXF1ZXMuaW5zZXJ0KFNwZWxsaW5nKTsKKyAgICAgIH0KKyAgICAgIC8vIElmIHRoZSBzZW1hbnRpYyBtYXAgaGFzIG9ubHkgb25lIHNwZWxsaW5nLCB0aGF0IGlzIHN1ZmZpY2llbnQgZm9yIG91cgorICAgICAgLy8gbmVlZHMuCisgICAgICBpZiAoVW5pcXVlcy5zaXplKCkgPT0gMSkKKyAgICAgICAgSGVhZGluZyA9ICpVbmlxdWVzLmJlZ2luKCk7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIGhlYWRpbmcgaXMgc3RpbGwgZW1wdHksIGl0IGlzIGFuIGVycm9yLgorICBpZiAoSGVhZGluZy5lbXB0eSgpKQorICAgIFByaW50RmF0YWxFcnJvcihEb2MuQXR0cmlidXRlLT5nZXRMb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgYXR0cmlidXRlIHJlcXVpcmVzIGEgaGVhZGluZyB0byBiZSBzcGVjaWZpZWQiKTsKKworICAvLyBHYXRoZXIgYSBsaXN0IG9mIHVuaXF1ZSBzcGVsbGluZ3M7IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBzZW1hbnRpYworICAvLyBzcGVsbGluZyBmb3IgdGhlIGF0dHJpYnV0ZS4gVmFyaWF0aW9ucyBpbiB1bmRlcnNjb3JlcyBhbmQgb3RoZXIgbm9uLQorICAvLyBzZW1hbnRpYyBjaGFyYWN0ZXJzIGFyZSBzdGlsbCBhY2NlcHRhYmxlLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTmFtZXM7CisKKyAgdW5zaWduZWQgU3VwcG9ydGVkU3BlbGxpbmdzID0gMDsKKyAgZm9yIChjb25zdCBhdXRvICZJIDogU3BlbGxpbmdzKSB7CisgICAgU3BlbGxpbmdLaW5kIEtpbmQgPSBTdHJpbmdTd2l0Y2g8U3BlbGxpbmdLaW5kPihJLnZhcmlldHkoKSkKKyAgICAgIC5DYXNlKCJHTlUiLCBHTlUpCisgICAgICAuQ2FzZSgiQ1hYMTEiLCBDWFgxMSkKKyAgICAgIC5DYXNlKCJEZWNsc3BlYyIsIERlY2xzcGVjKQorICAgICAgLkNhc2UoIktleXdvcmQiLCBLZXl3b3JkKTsKKworICAgIC8vIE1hc2sgaW4gdGhlIHN1cHBvcnRlZCBzcGVsbGluZy4KKyAgICBTdXBwb3J0ZWRTcGVsbGluZ3MgfD0gS2luZDsKKworICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisgICAgaWYgKEtpbmQgPT0gQ1hYMTEgJiYgIUkubmFtZVNwYWNlKCkuZW1wdHkoKSkKKyAgICAgIE5hbWUgPSBJLm5hbWVTcGFjZSgpICsgIjo6IjsKKyAgICBOYW1lICs9IEkubmFtZSgpOworCisgICAgLy8gSWYgdGhpcyBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBoZWFkaW5nLCBkbyBub3QgYWRkIGl0LgorICAgIGlmIChOYW1lICE9IEhlYWRpbmcpCisgICAgICBOYW1lcy5wdXNoX2JhY2soTmFtZSk7CisgIH0KKworICAvLyBQcmludCBvdXQgdGhlIGhlYWRpbmcgZm9yIHRoZSBhdHRyaWJ1dGUuIElmIHRoZXJlIGFyZSBhbHRlcm5hdGUgc3BlbGxpbmdzLAorICAvLyB0aGVuIGRpc3BsYXkgdGhvc2UgYWZ0ZXIgdGhlIGhlYWRpbmcuCisgIGlmICghQ3VzdG9tSGVhZGluZyAmJiAhTmFtZXMuZW1wdHkoKSkgeworICAgIEhlYWRpbmcgKz0gIiAoIjsKKyAgICBmb3IgKGF1dG8gSSA9IE5hbWVzLmJlZ2luKCksIEUgPSBOYW1lcy5lbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmIChJICE9IE5hbWVzLmJlZ2luKCkpCisgICAgICAgIEhlYWRpbmcgKz0gIiwgIjsKKyAgICAgIEhlYWRpbmcgKz0gKkk7CisgICAgfQorICAgIEhlYWRpbmcgKz0gIikiOworICB9CisgIE9TIDw8IEhlYWRpbmcgPDwgIlxuIiA8PCBzdGQ6OnN0cmluZyhIZWFkaW5nLmxlbmd0aCgpLCAnLScpIDw8ICJcbiI7CisKKyAgaWYgKCFTdXBwb3J0ZWRTcGVsbGluZ3MpCisgICAgUHJpbnRGYXRhbEVycm9yKERvYy5BdHRyaWJ1dGUtPmdldExvYygpLAorICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIGhhcyBubyBzdXBwb3J0ZWQgc3BlbGxpbmdzOyBjYW5ub3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAiZG9jdW1lbnRlZCIpOworCisgIC8vIExpc3Qgd2hhdCBzcGVsbGluZyBzeW50YXhlcyB0aGUgYXR0cmlidXRlIHN1cHBvcnRzLgorICBPUyA8PCAiLi4gY3N2LXRhYmxlOjogU3VwcG9ydGVkIFN5bnRheGVzXG4iOworICBPUyA8PCAiICAgOmhlYWRlcjogXCJHTlVcIiwgXCJDKysxMVwiLCBcIl9fZGVjbHNwZWNcIiwgXCJLZXl3b3JkXCJcblxuIjsKKyAgT1MgPDwgIiAgIFwiIjsKKyAgaWYgKFN1cHBvcnRlZFNwZWxsaW5ncyAmIEdOVSkgT1MgPDwgIlgiOworICBPUyA8PCAiXCIsXCIiOworICBpZiAoU3VwcG9ydGVkU3BlbGxpbmdzICYgQ1hYMTEpIE9TIDw8ICJYIjsKKyAgT1MgPDwgIlwiLFwiIjsKKyAgaWYgKFN1cHBvcnRlZFNwZWxsaW5ncyAmIERlY2xzcGVjKSBPUyA8PCAiWCI7CisgIE9TIDw8ICJcIixcIiI7CisgIGlmIChTdXBwb3J0ZWRTcGVsbGluZ3MgJiBLZXl3b3JkKSBPUyA8PCAiWCI7CisgIE9TIDw8ICJcIlxuXG4iOworCisgIC8vIElmIHRoZSBhdHRyaWJ1dGUgaXMgZGVwcmVjYXRlZCwgcHJpbnQgYSBtZXNzYWdlIGFib3V0IGl0LCBhbmQgcG9zc2libHkKKyAgLy8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGF0dHJpYnV0ZS4KKyAgaWYgKCFEb2MuRG9jdW1lbnRhdGlvbi0+aXNWYWx1ZVVuc2V0KCJEZXByZWNhdGVkIikpIHsKKyAgICBPUyA8PCAiVGhpcyBhdHRyaWJ1dGUgaGFzIGJlZW4gZGVwcmVjYXRlZCwgYW5kIG1heSBiZSByZW1vdmVkIGluIGEgZnV0dXJlICIKKyAgICAgICA8PCAidmVyc2lvbiBvZiBDbGFuZy4iOworICAgIGNvbnN0IFJlY29yZCAmRGVwcmVjYXRlZCA9ICpEb2MuRG9jdW1lbnRhdGlvbi0+Z2V0VmFsdWVBc0RlZigiRGVwcmVjYXRlZCIpOworICAgIHN0ZDo6c3RyaW5nIFJlcGxhY2VtZW50ID0gRGVwcmVjYXRlZC5nZXRWYWx1ZUFzU3RyaW5nKCJSZXBsYWNlbWVudCIpOworICAgIGlmICghUmVwbGFjZW1lbnQuZW1wdHkoKSkKKyAgICAgIE9TIDw8ICIgIFRoaXMgYXR0cmlidXRlIGhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgYGAiCisgICAgICAgICA8PCBSZXBsYWNlbWVudCA8PCAiYGAuIjsKKyAgICBPUyA8PCAiXG5cbiI7CisgIH0KKworICBzdGQ6OnN0cmluZyBDb250ZW50U3RyID0gRG9jLkRvY3VtZW50YXRpb24tPmdldFZhbHVlQXNTdHJpbmcoIkNvbnRlbnQiKTsKKyAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBuZXdsaW5lcyBhbmQgc3BhY2VzLgorICBTdHJpbmdSZWYgQ29udGVudChDb250ZW50U3RyKTsKKyAgd2hpbGUgKENvbnRlbnQuc3RhcnRzd2l0aCgiXHIiKSB8fCBDb250ZW50LnN0YXJ0c3dpdGgoIlxuIikgfHwKKyAgICAgICAgIENvbnRlbnQuc3RhcnRzd2l0aCgiICIpIHx8IENvbnRlbnQuc3RhcnRzd2l0aCgiXHQiKSkKKyAgICBDb250ZW50ID0gQ29udGVudC5zdWJzdHIoMSk7CisgIHdoaWxlIChDb250ZW50LmVuZHN3aXRoKCJcciIpIHx8IENvbnRlbnQuZW5kc3dpdGgoIlxuIikgfHwKKyAgICAgICAgIENvbnRlbnQuZW5kc3dpdGgoIiAiKSB8fCBDb250ZW50LmVuZHN3aXRoKCJcdCIpKQorICAgIENvbnRlbnQgPSBDb250ZW50LnN1YnN0cigwLCBDb250ZW50LnNpemUoKSAtIDEpOworICBPUyA8PCBDb250ZW50OworCisgIE9TIDw8ICJcblxuXG4iOworfQorCit2b2lkIEVtaXRDbGFuZ0F0dHJEb2NzKFJlY29yZEtlZXBlciAmUmVjb3JkcywgcmF3X29zdHJlYW0gJk9TKSB7CisgIC8vIEdldCB0aGUgZG9jdW1lbnRhdGlvbiBpbnRyb2R1Y3Rpb24gcGFyYWdyYXBoLgorICBjb25zdCBSZWNvcmQgKkRvY3VtZW50YXRpb24gPSBSZWNvcmRzLmdldERlZigiR2xvYmFsRG9jdW1lbnRhdGlvbiIpOworICBpZiAoIURvY3VtZW50YXRpb24pIHsKKyAgICBQcmludEZhdGFsRXJyb3IoIlRoZSBEb2N1bWVudGF0aW9uIHRvcC1sZXZlbCBkZWZpbml0aW9uIGlzIG1pc3NpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgIm5vIGRvY3VtZW50YXRpb24gd2lsbCBiZSBnZW5lcmF0ZWQuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgT1MgPDwgRG9jdW1lbnRhdGlvbi0+Z2V0VmFsdWVBc1N0cmluZygiSW50cm8iKSA8PCAiXG4iOworCisgIC8vIEdhdGhlciB0aGUgRG9jdW1lbnRhdGlvbiBsaXN0cyBmcm9tIGVhY2ggb2YgdGhlIGF0dHJpYnV0ZXMsIGJhc2VkIG9uIHRoZQorICAvLyBjYXRlZ29yeSBwcm92aWRlZC4KKyAgc3RkOjp2ZWN0b3I8UmVjb3JkICo+IEF0dHJzID0gUmVjb3Jkcy5nZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoIkF0dHIiKTsKKyAgc3RkOjptYXA8Y29uc3QgUmVjb3JkICosIHN0ZDo6dmVjdG9yPERvY3VtZW50YXRpb25EYXRhPj4gU3BsaXREb2NzOworICBmb3IgKGF1dG8gSSA6IEF0dHJzKSB7CisgICAgY29uc3QgUmVjb3JkICZBdHRyID0gKkk7CisgICAgc3RkOjp2ZWN0b3I8UmVjb3JkICo+IERvY3MgPSBBdHRyLmdldFZhbHVlQXNMaXN0T2ZEZWZzKCJEb2N1bWVudGF0aW9uIik7CisgICAgZm9yIChhdXRvIERJIDogRG9jcykgeworICAgICAgY29uc3QgUmVjb3JkICZEb2MgPSAqREk7CisgICAgICBjb25zdCBSZWNvcmQgKkNhdGVnb3J5ID0gRG9jLmdldFZhbHVlQXNEZWYoIkNhdGVnb3J5Iik7CisgICAgICAvLyBJZiB0aGUgY2F0ZWdvcnkgaXMgInVuZG9jdW1lbnRlZCIsIHRoZW4gdGhlcmUgY2Fubm90IGJlIGFueSBvdGhlcgorICAgICAgLy8gZG9jdW1lbnRhdGlvbiBjYXRlZ29yaWVzIChvdGhlcndpc2UsIHRoZSBhdHRyaWJ1dGUgd291bGQgYmVjb21lCisgICAgICAvLyBkb2N1bWVudGVkKS4KKyAgICAgIHN0ZDo6c3RyaW5nIENhdCA9IENhdGVnb3J5LT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIik7CisgICAgICBib29sIFVuZG9jdW1lbnRlZCA9IENhdCA9PSAiVW5kb2N1bWVudGVkIjsKKyAgICAgIGlmIChVbmRvY3VtZW50ZWQgJiYgRG9jcy5zaXplKCkgPiAxKQorICAgICAgICBQcmludEZhdGFsRXJyb3IoRG9jLmdldExvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBpcyBcIlVuZG9jdW1lbnRlZFwiLCBidXQgaGFzIG11bHRpcGxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJkb2N1bWVudGF0aW9uIGNhdGVnb3JpZXMiKTsgICAgICAKKworICAgICAgaWYgKCFVbmRvY3VtZW50ZWQpCisgICAgICAgIFNwbGl0RG9jc1tDYXRlZ29yeV0ucHVzaF9iYWNrKERvY3VtZW50YXRpb25EYXRhKERvYywgQXR0cikpOworICAgIH0KKyAgfQorCisgIC8vIEhhdmluZyBzcGxpdCB0aGUgYXR0cmlidXRlcyBvdXQgYmFzZWQgb24gd2hhdCBkb2N1bWVudGF0aW9uIGdvZXMgd2hlcmUsCisgIC8vIHdlIGNhbiBiZWdpbiB0byBnZW5lcmF0ZSBzZWN0aW9ucyBvZiBkb2N1bWVudGF0aW9uLgorICBmb3IgKGNvbnN0IGF1dG8gJkkgOiBTcGxpdERvY3MpIHsKKyAgICBXcml0ZUNhdGVnb3J5SGVhZGVyKEkuZmlyc3QsIE9TKTsKKworICAgIC8vIFdhbGsgb3ZlciBlYWNoIG9mIHRoZSBhdHRyaWJ1dGVzIGluIHRoZSBjYXRlZ29yeSBhbmQgd3JpdGUgb3V0IHRoZWlyCisgICAgLy8gZG9jdW1lbnRhdGlvbi4KKyAgICBmb3IgKGNvbnN0IGF1dG8gJkRvYyA6IEkuc2Vjb25kKQorICAgICAgV3JpdGVEb2N1bWVudGF0aW9uKERvYywgT1MpOworICB9Cit9CisKIH0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvdXRpbHMvVGFibGVHZW4vQ2xhbmdEaWFnbm9zdGljc0VtaXR0ZXIuY3BwIGIvdXRpbHMvVGFibGVHZW4vQ2xhbmdEaWFnbm9zdGljc0VtaXR0ZXIuY3BwCmluZGV4IGRiMTU5ZDEuLjQwYWY5ZjYgMTAwNjQ0Ci0tLSBhL3V0aWxzL1RhYmxlR2VuL0NsYW5nRGlhZ25vc3RpY3NFbWl0dGVyLmNwcAorKysgYi91dGlscy9UYWJsZUdlbi9DbGFuZ0RpYWdub3N0aWNzRW1pdHRlci5jcHAKQEAgLTQ3Miw2ICs0NzIsMTEgQEAKICAgcmV0dXJuIENsc05hbWUgPT0gIkNMQVNTX0VSUk9SIjsKIH0KIAorc3RhdGljIGJvb2wgaXNSZW1hcmsoY29uc3QgUmVjb3JkICZEaWFnKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZDbHNOYW1lID0gRGlhZy5nZXRWYWx1ZUFzRGVmKCJDbGFzcyIpLT5nZXROYW1lKCk7CisgIHJldHVybiBDbHNOYW1lID09ICJDTEFTU19SRU1BUksiOworfQorCiAvLy8gQ2xhbmdEaWFnc0RlZnNFbWl0dGVyIC0gVGhlIHRvcC1sZXZlbCBjbGFzcyBlbWl0cyAuZGVmIGZpbGVzIGNvbnRhaW5pbmcKIC8vLyBkZWNsYXJhdGlvbnMgb2YgQ2xhbmcgZGlhZ25vc3RpY3MuCiBuYW1lc3BhY2UgY2xhbmcgewpAQCAtNTE4LDYgKzUyMywxNCBAQAogICAgICAgfQogICAgIH0KIAorICAgIC8vIENoZWNrIHRoYXQgYWxsIHJlbWFya3MgaGF2ZSBhbiBhc3NvY2lhdGVkIGRpYWdub3N0aWMgZ3JvdXAuCisgICAgaWYgKGlzUmVtYXJrKFIpKSB7CisgICAgICBpZiAoIWlzYTxEZWZJbml0PihSLmdldFZhbHVlSW5pdCgiR3JvdXAiKSkpIHsKKyAgICAgICAgUHJpbnRGYXRhbEVycm9yKFIuZ2V0TG9jKCksICJFcnJvciAiICsgUi5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbm90IGluIGFueSBkaWFnbm9zdGljIGdyb3VwIik7CisgICAgICB9CisgICAgfQorCiAgICAgLy8gRmlsdGVyIGJ5IGNvbXBvbmVudC4KICAgICBpZiAoIUNvbXBvbmVudC5lbXB0eSgpICYmIENvbXBvbmVudCAhPSBSLmdldFZhbHVlQXNTdHJpbmcoIkNvbXBvbmVudCIpKQogICAgICAgY29udGludWU7CkBAIC03NDgsMTcgKzc2MSw2IEBACiAKICAgc3RkOjpzdHJpbmcgTmFtZTsKIH07Ci0KLXN0cnVjdCBSZWNvcmRJbmRleEVsZW1lbnRTb3J0ZXIgOgotICBwdWJsaWMgc3RkOjpiaW5hcnlfZnVuY3Rpb248UmVjb3JkSW5kZXhFbGVtZW50LCBSZWNvcmRJbmRleEVsZW1lbnQsIGJvb2w+IHsKLQotICBib29sIG9wZXJhdG9yKCkoUmVjb3JkSW5kZXhFbGVtZW50IGNvbnN0ICZMaHMsCi0gICAgICAgICAgICAgICAgICBSZWNvcmRJbmRleEVsZW1lbnQgY29uc3QgJlJocykgY29uc3QgewotICAgIHJldHVybiBMaHMuTmFtZSA8IFJocy5OYW1lOwotICB9Ci0KLX07Ci0KIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UuCiAKIG5hbWVzcGFjZSBjbGFuZyB7CkBAIC03NzMsNyArNzc1LDkgQEAKICAgICBJbmRleC5wdXNoX2JhY2soUmVjb3JkSW5kZXhFbGVtZW50KFIpKTsKICAgfQogCi0gIHN0ZDo6c29ydChJbmRleC5iZWdpbigpLCBJbmRleC5lbmQoKSwgUmVjb3JkSW5kZXhFbGVtZW50U29ydGVyKCkpOworICBzdGQ6OnNvcnQoSW5kZXguYmVnaW4oKSwgSW5kZXguZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBSZWNvcmRJbmRleEVsZW1lbnQgJkxocywKKyAgICAgICAgICAgICAgIGNvbnN0IFJlY29yZEluZGV4RWxlbWVudCAmUmhzKSB7IHJldHVybiBMaHMuTmFtZSA8IFJocy5OYW1lOyB9KTsKIAogICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5kZXguc2l6ZSgpOyBpICE9IGU7ICsraSkgewogICAgIGNvbnN0IFJlY29yZEluZGV4RWxlbWVudCAmUiA9IEluZGV4W2ldOwpkaWZmIC0tZ2l0IGEvdXRpbHMvVGFibGVHZW4vTmVvbkVtaXR0ZXIuY3BwIGIvdXRpbHMvVGFibGVHZW4vTmVvbkVtaXR0ZXIuY3BwCmluZGV4IGIwOTM5YzkuLjE2NWU3NDkgMTAwNjQ0Ci0tLSBhL3V0aWxzL1RhYmxlR2VuL05lb25FbWl0dGVyLmNwcAorKysgYi91dGlscy9UYWJsZUdlbi9OZW9uRW1pdHRlci5jcHAKQEAgLTUyLDYgKzUyLDcgQEAKICAgT3BNbGEsCiAgIE9wTWxhbCwKICAgT3BNdWxsSGksCisgIE9wTXVsbEhpUDY0LAogICBPcE11bGxIaU4sCiAgIE9wTWxhbEhpLAogICBPcE1sYWxIaU4sCkBAIC0xOTMsNiArMTk0LDcgQEAKICAgICBQb2x5OCwKICAgICBQb2x5MTYsCiAgICAgUG9seTY0LAorICAgIFBvbHkxMjgsCiAgICAgRmxvYXQxNiwKICAgICBGbG9hdDMyLAogICAgIEZsb2F0NjQKQEAgLTIzNCw2ICsyMzYsNyBAQAogICAgIE9wTWFwWyJPUF9NTEEiXSAgID0gT3BNbGE7CiAgICAgT3BNYXBbIk9QX01MQUwiXSAgPSBPcE1sYWw7CiAgICAgT3BNYXBbIk9QX01VTExIaSJdICA9IE9wTXVsbEhpOworICAgIE9wTWFwWyJPUF9NVUxMSGlfUDY0Il0gID0gT3BNdWxsSGlQNjQ7CiAgICAgT3BNYXBbIk9QX01VTExIaV9OIl0gID0gT3BNdWxsSGlOOwogICAgIE9wTWFwWyJPUF9NTEFMSGkiXSAgPSBPcE1sYWxIaTsKICAgICBPcE1hcFsiT1BfTUxBTEhpX04iXSAgPSBPcE1sYWxIaU47CkBAIC0zNjksMTggKzM3MiwxNSBAQAogICB2b2lkIHJ1blRlc3RzKHJhd19vc3RyZWFtICZvKTsKIAogcHJpdmF0ZToKKyAgdm9pZCBlbWl0R3VhcmRlZEludHJpbnNpYyhyYXdfb3N0cmVhbSAmT1MsIFJlY29yZCAqUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmQ3VycmVudEd1YXJkLCBib29sICZJbkd1YXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ01hcDxDbGFzc0tpbmQ+ICZFbWl0dGVkTWFwKTsKICAgdm9pZCBlbWl0SW50cmluc2ljKHJhd19vc3RyZWFtICZPUywgUmVjb3JkICpSLAogICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTWFwPENsYXNzS2luZD4gJkVtaXR0ZWRNYXApOwotICB2b2lkIGdlbkJ1aWx0aW5zRGVmKHJhd19vc3RyZWFtICZPUywgU3RyaW5nTWFwPENsYXNzS2luZD4gJkE2NEludHJpbnNpY01hcCwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQTY0R2VuQnVpbHRpbkRlZik7Ci0gIHZvaWQgZ2VuT3ZlcmxvYWRUeXBlQ2hlY2tDb2RlKHJhd19vc3RyZWFtICZPUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTWFwPENsYXNzS2luZD4gJkE2NEludHJpbnNpY01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0E2NFR5cGVDaGVjayk7Ci0gIHZvaWQgZ2VuSW50cmluc2ljUmFuZ2VDaGVja0NvZGUocmF3X29zdHJlYW0gJk9TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ01hcDxDbGFzc0tpbmQ+ICZBNjRJbnRyaW5zaWNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0E2NFJhbmdlQ2hlY2spOwotICB2b2lkIGdlblRhcmdldFRlc3QocmF3X29zdHJlYW0gJk9TLCBTdHJpbmdNYXA8T3BLaW5kPiAmRW1pdHRlZE1hcCwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNBNjRUZXN0R2VuKTsKKyAgdm9pZCBnZW5CdWlsdGluc0RlZihyYXdfb3N0cmVhbSAmT1MpOworICB2b2lkIGdlbk92ZXJsb2FkVHlwZUNoZWNrQ29kZShyYXdfb3N0cmVhbSAmT1MpOworICB2b2lkIGdlbkludHJpbnNpY1JhbmdlQ2hlY2tDb2RlKHJhd19vc3RyZWFtICZPUyk7CisgIHZvaWQgZ2VuVGFyZ2V0VGVzdChyYXdfb3N0cmVhbSAmT1MpOwogfTsKIH0gLy8gZW5kIGFub255bW91cyBuYW1lc3BhY2UKIApAQCAtNDAzLDYgKzQwMyw3IEBACiAgICAgICBjYXNlICdzJzoKICAgICAgIGNhc2UgJ2knOgogICAgICAgY2FzZSAnbCc6CisgICAgICBjYXNlICdrJzoKICAgICAgIGNhc2UgJ2gnOgogICAgICAgY2FzZSAnZic6CiAgICAgICBjYXNlICdkJzoKQEAgLTQyNyw2ICs0MjgsOCBAQAogICAgICAgcmV0dXJuICdpJzsKICAgICBjYXNlICdpJzoKICAgICAgIHJldHVybiAnbCc7CisgICAgY2FzZSAnbCc6CisgICAgICByZXR1cm4gJ2snOwogICAgIGNhc2UgJ2gnOgogICAgICAgcmV0dXJuICdmJzsKICAgICBjYXNlICdmJzoKQEAgLTQ0Niw2ICs0NDksOCBAQAogICAgICAgcmV0dXJuICdzJzsKICAgICBjYXNlICdsJzoKICAgICAgIHJldHVybiAnaSc7CisgICAgY2FzZSAnayc6CisgICAgICByZXR1cm4gJ2wnOwogICAgIGNhc2UgJ2YnOgogICAgICAgcmV0dXJuICdoJzsKICAgICBjYXNlICdkJzoKQEAgLTQ2OSw2ICs0NzQsOSBAQAogICAgICAgY2FzZSAnbCc6CiAgICAgICAgIHMgKz0gJ2knOwogICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2snOgorICAgICAgICBzICs9ICdsJzsKKyAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgogICAgICAgICBzICs9IHR5W2ldOwogICAgICAgICBicmVhazsKQEAgLTY4MCw2ICs2ODgsOSBAQAogICAgICAgICBicmVhazsKICAgICAgIHMgKz0gcXVhZCA/ICJ4MiIgOiAieDEiOwogICAgICAgYnJlYWs7CisgICAgY2FzZSAnayc6CisgICAgICBzICs9ICJwb2x5MTI4IjsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgJ2gnOgogICAgICAgcyArPSAiZmxvYXQxNiI7CiAgICAgICBpZiAoc2NhbCkKQEAgLTc0NSw2ICs3NTYsOSBAQAogICAvLyBCYXNlZCBvbiB0aGUgbW9kaWZ5aW5nIGNoYXJhY3RlciwgY2hhbmdlIHRoZSB0eXBlIGFuZCB3aWR0aCBpZiBuZWNlc3NhcnkuCiAgIHR5cGUgPSBNb2RUeXBlKG1vZCwgdHlwZSwgcXVhZCwgcG9seSwgdXNnbiwgc2NhbCwgY25zdCwgcG50cik7CiAKKyAgdXNnbiA9IHVzZ24gfCBwb2x5IHwgKChjayA9PSBDbGFzc0kgfHwgY2sgPT0gQ2xhc3NXKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWwgJiYgdHlwZSAhPSAnZicgJiYgdHlwZSAhPSAnZCcpOworCiAgIC8vIEFsbCBwb2ludGVycyBhcmUgdm9pZCogcG9pbnRlcnMuICBDaGFuZ2UgdHlwZSB0byAndicgbm93LgogICBpZiAocG50cikgewogICAgIHVzZ24gPSBmYWxzZTsKQEAgLTc1Niw4ICs3NzAsNiBAQAogICAgIHR5cGUgPSAncyc7CiAgICAgdXNnbiA9IHRydWU7CiAgIH0KLSAgdXNnbiA9IHVzZ24gfCBwb2x5IHwgKChjayA9PSBDbGFzc0kgfHwgY2sgPT0gQ2xhc3NXKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWwgJiYgdHlwZSAhPSAnZicgJiYgdHlwZSAhPSAnZCcpOwogCiAgIGlmIChzY2FsKSB7CiAgICAgU21hbGxTdHJpbmc8MTI4PiBzOwpAQCAtNzY4LDcgKzc4MCw5IEBACiAgICAgICBzLnB1c2hfYmFjaygnUycpOyAvLyBtYWtlIGNoYXJzIGV4cGxpY2l0bHkgc2lnbmVkCiAKICAgICBpZiAodHlwZSA9PSAnbCcpIC8vIDY0LWJpdCBsb25nCi0gICAgICBzICs9ICJMTGkiOworICAgICAgcyArPSAiV2kiOworICAgIGVsc2UgaWYgKHR5cGUgPT0gJ2snKSAvLyAxMjgtYml0IGxvbmcKKyAgICAgIHMgPSAiTExMaSI7CiAgICAgZWxzZQogICAgICAgcy5wdXNoX2JhY2sodHlwZSk7CiAKQEAgLTc5NSw3ICs4MDksNyBAQAogICAgIGlmIChjayAhPSBDbGFzc0IgJiYgdHlwZSA9PSAnaScpCiAgICAgICByZXR1cm4gcXVhZCA/ICJWNGkiIDogIlYyaSI7CiAgICAgaWYgKGNrICE9IENsYXNzQiAmJiB0eXBlID09ICdsJykKLSAgICAgIHJldHVybiBxdWFkID8gIlYyTExpIiA6ICJWMUxMaSI7CisgICAgICByZXR1cm4gcXVhZCA/ICJWMldpIiA6ICJWMVdpIjsKIAogICAgIHJldHVybiBxdWFkID8gIlYxNlNjIiA6ICJWOFNjIjsKICAgfQpAQCAtODE3LDcgKzgzMSw3IEBACiAgIGlmIChjayAhPSBDbGFzc0IgJiYgdHlwZSA9PSAnaScpCiAgICAgcmV0dXJuIHF1YWQgPyAiVjRpIiA6ICJWMmkiOwogICBpZiAoY2sgIT0gQ2xhc3NCICYmIHR5cGUgPT0gJ2wnKQotICAgIHJldHVybiBxdWFkID8gIlYyTExpIiA6ICJWMUxMaSI7CisgICAgcmV0dXJuIHF1YWQgPyAiVjJXaSIgOiAiVjFXaSI7CiAKICAgcmV0dXJuIHF1YWQgPyAiVjE2U2MiIDogIlY4U2MiOwogfQpAQCAtODY1LDYgKzg3OSwxMCBAQAogICAgIGRlZmF1bHQ6IGJyZWFrOwogICAgIH0KICAgICBicmVhazsKKyAgY2FzZSAnayc6CisgICAgYXNzZXJ0KHBvbHkgJiYgIlVucmVjb2duaXplZCAxMjggYml0IGludGVnZXIuIik7CisgICAgdHlwZUNvZGUgPSAicDEyOCI7CisgICAgYnJlYWs7CiAgIGNhc2UgJ2gnOgogICAgIHN3aXRjaCAoY2spIHsKICAgICBjYXNlIENsYXNzUzoKQEAgLTExOTcsNyArMTIxNSw2IEBACiAgIFJlZ2lzdGVyU3VmZml4ID0gIiI7CiAKICAgY29uc3QgU3RyaW5nUmVmIE5hbWVSZWYoTmFtZSk7Ci0gIGNvbnN0IFN0cmluZ1JlZiBQcm90b1JlZihQcm90byk7CiAKICAgaWYgKChOYW1lUmVmLmNvdW50KCJ2ZHVwIikgfHwgTmFtZVJlZi5jb3VudCgidm1vdiIpKSAmJiBIYXNOUG9zdGZpeCkgewogICAgIHJldHVybjsKQEAgLTE0MTksNyArMTQzNiw3IEBACiAKIC8vLyBVc2VNYWNybyAtIEV4YW1pbmUgdGhlIHByb3RvdHlwZSBzdHJpbmcgdG8gZGV0ZXJtaW5lIGlmIHRoZSBpbnRyaW5zaWMKIC8vLyBzaG91bGQgYmUgZGVmaW5lZCBhcyBhIHByZXByb2Nlc3NvciBtYWNybyBpbnN0ZWFkIG9mIGFuIGlubGluZSBmdW5jdGlvbi4KLXN0YXRpYyBib29sIFVzZU1hY3JvKGNvbnN0IHN0ZDo6c3RyaW5nICZwcm90bykgeworc3RhdGljIGJvb2wgVXNlTWFjcm8oY29uc3Qgc3RkOjpzdHJpbmcgJnByb3RvLCBTdHJpbmdSZWYgdHlwZXN0cikgewogICAvLyBJZiB0aGlzIGJ1aWx0aW4gdGFrZXMgYW4gaW1tZWRpYXRlIGFyZ3VtZW50LCB3ZSBuZWVkIHRvICNkZWZpbmUgaXQgcmF0aGVyCiAgIC8vIHRoYW4gdXNlIGEgc3RhbmRhcmQgZGVjbGFyYXRpb24sIHNvIHRoYXQgU2VtYUNoZWNraW5nIGNhbiByYW5nZSBjaGVjawogICAvLyB0aGUgaW1tZWRpYXRlIHBhc3NlZCBieSB0aGUgdXNlci4KQEAgLTE0MzIsNiArMTQ0OSwxMiBAQAogICAgICAgcHJvdG8uZmluZCgnYycpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQogICAgIHJldHVybiB0cnVlOwogCisgIC8vIEl0IGlzIG5vdCBwZXJtaXR0ZWQgdG8gcGFzcyBvciByZXR1cm4gYW4gX19mcDE2IGJ5IHZhbHVlLCBzbyBpbnRyaW5zaWNzCisgIC8vIHRha2luZyBhIHNjYWxhciBmbG9hdDE2X3QgbXVzdCBiZSBpbXBsZW1lbnRlZCBhcyBtYWNyb3MuCisgIGlmICh0eXBlc3RyLmZpbmQoJ2gnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgcHJvdG8uZmluZCgncycpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgIHJldHVybiB0cnVlOworCiAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtMTQ0Niw3ICsxNDY5LDcgQEAKIC8vIEdlbmVyYXRlIHRoZSBzdHJpbmcgIihhcmd0eXBlIGEsIGFyZ3R5cGUgYiwgLi4uKSIKIHN0YXRpYyBzdGQ6OnN0cmluZyBHZW5BcmdzKGNvbnN0IHN0ZDo6c3RyaW5nICZwcm90bywgU3RyaW5nUmVmIHR5cGVzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewotICBib29sIGRlZmluZSA9IFVzZU1hY3JvKHByb3RvKTsKKyAgYm9vbCBkZWZpbmUgPSBVc2VNYWNybyhwcm90bywgdHlwZXN0cik7CiAgIGNoYXIgYXJnID0gJ2EnOwogCiAgIHN0ZDo6c3RyaW5nIHM7CkBAIC0xNDYzLDkgKzE0ODYsNiBAQAogICAgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvW2ldLCB0eXBlc3RyKSArICIgX18iOwogICAgIH0KICAgICBzLnB1c2hfYmFjayhhcmcpOwotICAgIC8vVG8gYXZvaWQgYXJndW1lbnQgYmVpbmcgbXVsdGlwbGUgZGVmaW5lZCwgYWRkIGV4dHJhIG51bWJlciBmb3IgcmVuYW1pbmcuCi0gICAgaWYgKG5hbWUgPT0gInZjb3B5X2xhbmUiIHx8IG5hbWUgPT0gInZjb3B5X2xhbmVxIikKLSAgICAgIHMucHVzaF9iYWNrKCcxJyk7CiAgICAgaWYgKChpICsgMSkgPCBlKQogICAgICAgcyArPSAiLCAiOwogICB9CkBAIC0xNDg4LDE4ICsxNTA4LDEwIEBACiAgICAgaWYgKE1hY3JvQXJnVXNlZERpcmVjdGx5KHByb3RvLCBpKSkKICAgICAgIGNvbnRpbnVlOwogICAgIGdlbmVyYXRlZExvY2FsID0gdHJ1ZTsKLSAgICBib29sIGV4dHJhbnVtYmVyID0gZmFsc2U7Ci0gICAgaWYgKG5hbWUgPT0gInZjb3B5X2xhbmUiIHx8IG5hbWUgPT0gInZjb3B5X2xhbmVxIikKLSAgICAgIGV4dHJhbnVtYmVyID0gdHJ1ZTsKLQogICAgIHMgKz0gVHlwZVN0cmluZyhwcm90b1tpXSwgdHlwZXN0cikgKyAiIF9fIjsKICAgICBzLnB1c2hfYmFjayhhcmcpOwotICAgIGlmKGV4dHJhbnVtYmVyKQotICAgICAgcy5wdXNoX2JhY2soJzEnKTsKICAgICBzICs9ICIgPSAoIjsKICAgICBzLnB1c2hfYmFjayhhcmcpOwotICAgIGlmKGV4dHJhbnVtYmVyKQotICAgICAgcy5wdXNoX2JhY2soJzEnKTsKICAgICBzICs9ICIpOyAiOwogICB9CiAKQEAgLTE2MDYsNiArMTYxOCw3IEBACiAgIGNhc2UgJ3MnOiBuRWx0cyA9IDQ7IGJyZWFrOwogICBjYXNlICdpJzogbkVsdHMgPSAyOyBicmVhazsKICAgY2FzZSAnbCc6IG5FbHRzID0gMTsgYnJlYWs7CisgIGNhc2UgJ2snOiBuRWx0cyA9IDE7IGJyZWFrOwogICBjYXNlICdoJzogbkVsdHMgPSA0OyBicmVhazsKICAgY2FzZSAnZic6IG5FbHRzID0gMjsgYnJlYWs7CiAgIGNhc2UgJ2QnOgpAQCAtMTYxOSwxMSArMTYzMiwyMyBAQAogfQogCiAvLyBHZW5lcmF0ZSB0aGUgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRyaW5zaWMsIGUuZy4gImEgKyBiIiBmb3IgT3BBZGQuCisvLworLy8gTm90ZSB0aGF0IHNvbWUgaW50cmluc2ljIGRlZmluaXRpb25zIGFyb3VuZCAnbGFuZScgYXJlIGJlaW5nIGltcGxlbWVudGVkCisvLyB3aXRoIG1hY3JvcywgYmVjYXVzZSB0aGV5IGFsbCBjb250YWluIGNvbnN0YW50IGludGVnZXIgYXJndW1lbnQsIGFuZCB3ZQorLy8gc3RhdGljYWxseSBjaGVjayB0aGUgcmFuZ2Ugb2YgdGhlIGxhbmUgaW5kZXggdG8gbWVldCB0aGUgc2VtYW50aWMKKy8vIHJlcXVpcmVtZW50IG9mIGRpZmZlcmVudCBpbnRyaW5zaWNzLgorLy8KKy8vIEZvciB0aGUgaW50cmluc2ljcyBpbXBsZW1lbnRlZCB3aXRoIG1hY3JvLCBpZiB0aGV5IGNvbnRhaW4gYW5vdGhlciBpbnRyaW5zaWMKKy8vIGltcGxlbWVudGVkIHdpdGggbWFjbywgd2UgaGF2ZSB0byBhdm9pZCB1c2luZyB0aGUgc2FtZSBhcmd1bWVudCBuYW1lcyBmb3IKKy8vIHRoZSBuZXN0ZWQgaW5zdHJpbnNpY3MuIEZvciBleGFtcGxlLCBtYWNybyB2Zm1zX2xhbmUgaXMgYmVpbmcgaW1wbGVtZW50ZWQKKy8vIHdpdGggYW5vdGhlciBtYWNvciB2Zm1hX2xhbmUsIHNvIHdlIHJlbmFtZSBhbGwgYXJndW1lbnRzIGZvciB2Zm1zX2xhbmUgYnkKKy8vIGFkZGluZyBhIHN1ZmZpeCAnMScuCisKIHN0YXRpYyBzdGQ6OnN0cmluZyBHZW5PcFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgT3BLaW5kIG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm90bywgU3RyaW5nUmVmIHR5cGVzdHIpIHsKICAgYm9vbCBxdWFkOwogICB1bnNpZ25lZCBuRWx0cyA9IEdldE51bUVsZW1lbnRzKHR5cGVzdHIsIHF1YWQpOwotICBib29sIGRlZmluZSA9IFVzZU1hY3JvKHByb3RvKTsKKyAgYm9vbCBkZWZpbmUgPSBVc2VNYWNybyhwcm90bywgdHlwZXN0cik7CiAKICAgc3RkOjpzdHJpbmcgdHMgPSBUeXBlU3RyaW5nKHByb3RvWzBdLCB0eXBlc3RyKTsKICAgc3RkOjpzdHJpbmcgczsKQEAgLTE3MTgsNiArMTc0MywxMyBAQAogICBjYXNlIE9wTXVsbEhpOgogICAgIHMgKz0gR2VuMk9wV2l0aDJIaWdoKHR5cGVzdHIsICJ2bXVsbCIsICJfX2EiLCAiX19iIik7CiAgICAgYnJlYWs7CisgIGNhc2UgT3BNdWxsSGlQNjQ6IHsKKyAgICBzdGQ6OnN0cmluZyBPcDEgPSBHZXRIaWdoKCJfX2EiLCB0eXBlc3RyKTsKKyAgICBzdGQ6OnN0cmluZyBPcDIgPSBHZXRIaWdoKCJfX2IiLCB0eXBlc3RyKTsKKyAgICBzICs9IE1hbmdsZU5hbWUoInZtdWxsIiwgdHlwZXN0ciwgQ2xhc3NTKTsKKyAgICBzICs9ICIoKHBvbHk2NF90KSIgKyBPcDEgKyAiLCAocG9seTY0X3QpIiArIE9wMiArICIpOyI7CisgICAgYnJlYWs7CisgIH0KICAgY2FzZSBPcE11bGxIaU46CiAgICAgcyArPSBNYW5nbGVOYW1lKCJ2bXVsbF9uIiwgdHlwZXN0ciwgQ2xhc3NTKTsKICAgICBzICs9ICIoIiArIEdldEhpZ2goIl9fYSIsIHR5cGVzdHIpICsgIiwgX19iKTsiOwpAQCAtMjA4MSwyMyArMjExMywyOSBAQAogICAgIGJyZWFrOwogICB9CiAgIGNhc2UgT3BDb3B5TGFuZTogeworICAgIHMgKz0gVHlwZVN0cmluZyhwcm90b1sxXSwgdHlwZXN0cikgKyAiIF9fYTEgPSBfX2E7IFxcXG4gICI7CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzNdLCB0eXBlc3RyKSArICIgX19jMSA9IF9fYzsgXFxcbiAgIjsKICAgICBzICs9IFR5cGVTdHJpbmcoJ3MnLCB0eXBlc3RyKSArICIgX19jMiA9ICIgKwotICAgICAgICAgTWFuZ2xlTmFtZSgidmdldF9sYW5lIiwgdHlwZXN0ciwgQ2xhc3NTKSArICIoX19jMSwgX19kMSk7IFxcXG4gICIgKwotICAgICAgICAgTWFuZ2xlTmFtZSgidnNldF9sYW5lIiwgdHlwZXN0ciwgQ2xhc3NTKSArICIoX19jMiwgX19hMSwgX19iMSk7IjsKKyAgICAgICAgIE1hbmdsZU5hbWUoInZnZXRfbGFuZSIsIHR5cGVzdHIsIENsYXNzUykgKyAiKF9fYzEsIF9fZCk7IFxcXG4gICIgKworICAgICAgICAgTWFuZ2xlTmFtZSgidnNldF9sYW5lIiwgdHlwZXN0ciwgQ2xhc3NTKSArICIoX19jMiwgX19hMSwgX19iKTsiOwogICAgIGJyZWFrOwogICB9CiAgIGNhc2UgT3BDb3B5UUxhbmU6IHsKICAgICBzdGQ6OnN0cmluZyB0eXBlQ29kZSA9ICIiOwogICAgIEluc3RydWN0aW9uVHlwZUNvZGUodHlwZXN0ciwgQ2xhc3NTLCBxdWFkLCB0eXBlQ29kZSk7CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzFdLCB0eXBlc3RyKSArICIgX19hMSA9IF9fYTsgXFxcbiAgIjsKKyAgICBzICs9IFR5cGVTdHJpbmcocHJvdG9bM10sIHR5cGVzdHIpICsgIiBfX2MxID0gX19jOyBcXFxuICAiOwogICAgIHMgKz0gVHlwZVN0cmluZygncycsIHR5cGVzdHIpICsgIiBfX2MyID0gdmdldF9sYW5lXyIgKyB0eXBlQ29kZSArCi0gICAgICAgICAiKF9fYzEsIF9fZDEpOyBcXFxuICB2c2V0cV9sYW5lXyIgKyB0eXBlQ29kZSArICIoX19jMiwgX19hMSwgX19iMSk7IjsKKyAgICAgICAgICIoX19jMSwgX19kKTsgXFxcbiAgdnNldHFfbGFuZV8iICsgdHlwZUNvZGUgKyAiKF9fYzIsIF9fYTEsIF9fYik7IjsKICAgICBicmVhazsKICAgfQogICBjYXNlIE9wQ29weUxhbmVROiB7CiAgICAgc3RkOjpzdHJpbmcgdHlwZUNvZGUgPSAiIjsKICAgICBJbnN0cnVjdGlvblR5cGVDb2RlKHR5cGVzdHIsIENsYXNzUywgcXVhZCwgdHlwZUNvZGUpOworICAgIHMgKz0gVHlwZVN0cmluZyhwcm90b1sxXSwgdHlwZXN0cikgKyAiIF9fYTEgPSBfX2E7IFxcXG4gICI7CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzNdLCB0eXBlc3RyKSArICIgX19jMSA9IF9fYzsgXFxcbiAgIjsKICAgICBzICs9IFR5cGVTdHJpbmcoJ3MnLCB0eXBlc3RyKSArICIgX19jMiA9IHZnZXRxX2xhbmVfIiArIHR5cGVDb2RlICsKLSAgICAgICAgICIoX19jMSwgX19kMSk7IFxcXG4gIHZzZXRfbGFuZV8iICsgdHlwZUNvZGUgKyAiKF9fYzIsIF9fYTEsIF9fYjEpOyI7CisgICAgICAgICAiKF9fYzEsIF9fZCk7IFxcXG4gIHZzZXRfbGFuZV8iICsgdHlwZUNvZGUgKyAiKF9fYzIsIF9fYTEsIF9fYik7IjsKICAgICBicmVhazsKICAgfQogICBjYXNlIE9wU2NhbGFyTXVsTGFuZTogewpAQCAtMjExMCw4ICsyMTQ4LDEwIEBACiAgIGNhc2UgT3BTY2FsYXJNdWxMYW5lUTogewogICAgIHN0ZDo6c3RyaW5nIHR5cGVDb2RlID0gIiI7CiAgICAgSW5zdHJ1Y3Rpb25UeXBlQ29kZSh0eXBlc3RyLCBDbGFzc1MsIHF1YWQsIHR5cGVDb2RlKTsKLSAgICAgICAgcyArPSBUeXBlU3RyaW5nKCdzJywgdHlwZXN0cikgKyAiIF9fZDEgPSB2Z2V0cV9sYW5lXyIgKyB0eXBlQ29kZSArCi0gICAgICAgICAgIihfX2IsIF9fYyk7XFxcbiAgX19hICogX19kMTsiOworICAgIHMgKz0gVHlwZVN0cmluZyhwcm90b1sxXSwgdHlwZXN0cikgKyAiIF9fYTEgPSBfX2E7IFxcXG4gICI7CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzJdLCB0eXBlc3RyKSArICIgX19iMSA9IF9fYjsgXFxcbiAgIjsKKyAgICBzICs9IFR5cGVTdHJpbmcoJ3MnLCB0eXBlc3RyKSArICIgX19kMSA9IHZnZXRxX2xhbmVfIiArIHR5cGVDb2RlICsKKyAgICAgICIoX19iMSwgX19jKTtcXFxuICBfX2ExICogX19kMTsiOwogICAgIGJyZWFrOwogICB9CiAgIGNhc2UgT3BTY2FsYXJNdWxYTGFuZTogewpAQCAtMjEyMCw5ICsyMTYwLDExIEBACiAgICAgaWYgKHR5cGUgPT0gJ2YnKSB0eXBlID0gJ3MnOwogICAgIHN0ZDo6c3RyaW5nIHR5cGVDb2RlID0gIiI7CiAgICAgSW5zdHJ1Y3Rpb25UeXBlQ29kZSh0eXBlc3RyLCBDbGFzc1MsIHF1YWQsIHR5cGVDb2RlKTsKKyAgICBzICs9IFR5cGVTdHJpbmcocHJvdG9bMV0sIHR5cGVzdHIpICsgIiBfX2ExID0gX19hOyBcXFxuICAiOworICAgIHMgKz0gVHlwZVN0cmluZyhwcm90b1syXSwgdHlwZXN0cikgKyAiIF9fYjEgPSBfX2I7IFxcXG4gICI7CiAgICAgcyArPSBUeXBlU3RyaW5nKCdzJywgdHlwZXN0cikgKyAiIF9fZDEgPSB2Z2V0X2xhbmVfIiArIHR5cGVDb2RlICsKLSAgICAgICIoX19iLCBfX2MpO1xcXG4gIHZtdWx4IiArIHR5cGUgKyAiXyIgKwotICAgICAgdHlwZUNvZGUgKyAgIihfX2EsIF9fZDEpOyI7CisgICAgICAiKF9fYjEsIF9fYyk7XFxcbiAgdm11bHgiICsgdHlwZSArICJfIiArCisgICAgICB0eXBlQ29kZSArICAiKF9fYTEsIF9fZDEpOyI7CiAgICAgYnJlYWs7CiAgIH0KICAgY2FzZSBPcFNjYWxhck11bFhMYW5lUTogewpAQCAtMjEzMSw5ICsyMTczLDExIEBACiAgICAgaWYgKHR5cGUgPT0gJ2YnKSB0eXBlID0gJ3MnOwogICAgIHN0ZDo6c3RyaW5nIHR5cGVDb2RlID0gIiI7CiAgICAgSW5zdHJ1Y3Rpb25UeXBlQ29kZSh0eXBlc3RyLCBDbGFzc1MsIHF1YWQsIHR5cGVDb2RlKTsKKyAgICBzICs9IFR5cGVTdHJpbmcocHJvdG9bMV0sIHR5cGVzdHIpICsgIiBfX2ExID0gX19hOyBcXFxuICAiOworICAgIHMgKz0gVHlwZVN0cmluZyhwcm90b1syXSwgdHlwZXN0cikgKyAiIF9fYjEgPSBfX2I7IFxcXG4gICI7CiAgICAgcyArPSBUeXBlU3RyaW5nKCdzJywgdHlwZXN0cikgKyAiIF9fZDEgPSB2Z2V0cV9sYW5lXyIgKwotICAgICAgdHlwZUNvZGUgKyAiKF9fYiwgX19jKTtcXFxuICB2bXVseCIgKyB0eXBlICsKLSAgICAgICJfIiArIHR5cGVDb2RlICsgICIoX19hLCBfX2QxKTsiOworICAgICAgdHlwZUNvZGUgKyAiKF9fYjEsIF9fYyk7XFxcbiAgdm11bHgiICsgdHlwZSArCisgICAgICAiXyIgKyB0eXBlQ29kZSArICAiKF9fYTEsIF9fZDEpOyI7CiAgICAgYnJlYWs7CiAgIH0KIApAQCAtMjE0MywxMCArMjE4NywxMiBAQAogICAgIGlmICh0eXBlID09ICdmJykgdHlwZSA9ICdzJzsKICAgICBzdGQ6OnN0cmluZyB0eXBlQ29kZSA9ICIiOwogICAgIEluc3RydWN0aW9uVHlwZUNvZGUodHlwZXN0ciwgQ2xhc3NTLCBxdWFkLCB0eXBlQ29kZSk7CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzFdLCB0eXBlc3RyKSArICIgX19hMSA9IF9fYTsgXFxcbiAgIjsKKyAgICBzICs9IFR5cGVTdHJpbmcocHJvdG9bMl0sIHR5cGVzdHIpICsgIiBfX2IxID0gX19iOyBcXFxuICAiOwogICAgIHMgKz0gVHlwZVN0cmluZygncycsIHR5cGVzdHIpICsgIiBfX2QxID0gdmdldF9sYW5lXyIgKwotICAgICAgdHlwZUNvZGUgKyAiKF9fYSwgMCk7XFxcbiIgKworICAgICAgdHlwZUNvZGUgKyAiKF9fYTEsIDApO1xcXG4iICsKICAgICAgICIgICIgKyBUeXBlU3RyaW5nKCdzJywgdHlwZXN0cikgKyAiIF9fZTEgPSB2Z2V0X2xhbmVfIiArCi0gICAgICB0eXBlQ29kZSArICIoX19iLCBfX2MpO1xcXG4iICsKKyAgICAgIHR5cGVDb2RlICsgIihfX2IxLCBfX2MpO1xcXG4iICsKICAgICAgICIgICIgKyBUeXBlU3RyaW5nKCdzJywgdHlwZXN0cikgKyAiIF9fZjEgPSB2bXVseCIgKyB0eXBlICsgIl8iICsKICAgICAgIHR5cGVDb2RlICsgIihfX2QxLCBfX2UxKTtcXFxuIiArCiAgICAgICAiICAiICsgVHlwZVN0cmluZygnZCcsIHR5cGVzdHIpICsgIiBfX2cxO1xcXG4iICsKQEAgLTIxNjAsMTAgKzIyMDYsMTIgQEAKICAgICBpZiAodHlwZSA9PSAnZicpIHR5cGUgPSAncyc7CiAgICAgc3RkOjpzdHJpbmcgdHlwZUNvZGUgPSAiIjsKICAgICBJbnN0cnVjdGlvblR5cGVDb2RlKHR5cGVzdHIsIENsYXNzUywgcXVhZCwgdHlwZUNvZGUpOworICAgIHMgKz0gVHlwZVN0cmluZyhwcm90b1sxXSwgdHlwZXN0cikgKyAiIF9fYTEgPSBfX2E7IFxcXG4gICI7CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzJdLCB0eXBlc3RyKSArICIgX19iMSA9IF9fYjsgXFxcbiAgIjsKICAgICBzICs9IFR5cGVTdHJpbmcoJ3MnLCB0eXBlc3RyKSArICIgX19kMSA9IHZnZXRfbGFuZV8iICsKLSAgICAgIHR5cGVDb2RlICsgIihfX2EsIDApO1xcXG4iICsKKyAgICAgIHR5cGVDb2RlICsgIihfX2ExLCAwKTtcXFxuIiArCiAgICAgICAiICAiICsgVHlwZVN0cmluZygncycsIHR5cGVzdHIpICsgIiBfX2UxID0gdmdldHFfbGFuZV8iICsKLSAgICAgIHR5cGVDb2RlICsgIihfX2IsIF9fYyk7XFxcbiIgKworICAgICAgdHlwZUNvZGUgKyAiKF9fYjEsIF9fYyk7XFxcbiIgKwogICAgICAgIiAgIiArIFR5cGVTdHJpbmcoJ3MnLCB0eXBlc3RyKSArICIgX19mMSA9IHZtdWx4IiArIHR5cGUgKyAiXyIgKwogICAgICAgdHlwZUNvZGUgKyAiKF9fZDEsIF9fZTEpO1xcXG4iICsKICAgICAgICIgICIgKyBUeXBlU3RyaW5nKCdkJywgdHlwZXN0cikgKyAiIF9fZzE7XFxcbiIgKwpAQCAtMjE3Myw3MCArMjIyMSw5NCBAQAogICBjYXNlIE9wU2NhbGFyUURNdWxsTGFuZTogewogICAgIHN0ZDo6c3RyaW5nIHR5cGVDb2RlID0gIiI7CiAgICAgSW5zdHJ1Y3Rpb25UeXBlQ29kZSh0eXBlc3RyLCBDbGFzc1MsIHF1YWQsIHR5cGVDb2RlKTsKLSAgICBzICs9IE1hbmdsZU5hbWUoInZxZG11bGwiLCB0eXBlc3RyLCBDbGFzc1MpICsgIihfX2EsICIgKwotICAgICJ2Z2V0X2xhbmVfIiArIHR5cGVDb2RlICsgIihiLCBfX2MpKTsiOworICAgIHMgKz0gVHlwZVN0cmluZyhwcm90b1sxXSwgdHlwZXN0cikgKyAiIF9fYTEgPSBfX2E7IFxcXG4gICI7CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzJdLCB0eXBlc3RyKSArICIgX19iMSA9IF9fYjsgXFxcbiAgIjsKKyAgICBzICs9IE1hbmdsZU5hbWUoInZxZG11bGwiLCB0eXBlc3RyLCBDbGFzc1MpICsgIihfX2ExLCAiICsKKyAgICAidmdldF9sYW5lXyIgKyB0eXBlQ29kZSArICIoX19iMSwgX19jKSk7IjsKICAgICBicmVhazsKICAgfQogICBjYXNlIE9wU2NhbGFyUURNdWxsTGFuZVE6IHsKICAgICBzdGQ6OnN0cmluZyB0eXBlQ29kZSA9ICIiOwogICAgIEluc3RydWN0aW9uVHlwZUNvZGUodHlwZXN0ciwgQ2xhc3NTLCBxdWFkLCB0eXBlQ29kZSk7Ci0gICAgcyArPSBNYW5nbGVOYW1lKCJ2cWRtdWxsIiwgdHlwZXN0ciwgQ2xhc3NTKSArICIoX19hLCAiICsKLSAgICAidmdldHFfbGFuZV8iICsgdHlwZUNvZGUgKyAiKGIsIF9fYykpOyI7CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzFdLCB0eXBlc3RyKSArICIgX19hMSA9IF9fYTsgXFxcbiAgIjsKKyAgICBzICs9IFR5cGVTdHJpbmcocHJvdG9bMl0sIHR5cGVzdHIpICsgIiBfX2IxID0gX19iOyBcXFxuICAiOworICAgIHMgKz0gTWFuZ2xlTmFtZSgidnFkbXVsbCIsIHR5cGVzdHIsIENsYXNzUykgKyAiKF9fYTEsICIgKworICAgICJ2Z2V0cV9sYW5lXyIgKyB0eXBlQ29kZSArICIoX19iMSwgX19jKSk7IjsKICAgICBicmVhazsKICAgfQogICBjYXNlIE9wU2NhbGFyUURNdWxIaUxhbmU6IHsKICAgICBzdGQ6OnN0cmluZyB0eXBlQ29kZSA9ICIiOwogICAgIEluc3RydWN0aW9uVHlwZUNvZGUodHlwZXN0ciwgQ2xhc3NTLCBxdWFkLCB0eXBlQ29kZSk7Ci0gICAgcyArPSBNYW5nbGVOYW1lKCJ2cWRtdWxoIiwgdHlwZXN0ciwgQ2xhc3NTKSArICIoX19hLCAiICsKLSAgICAidmdldF9sYW5lXyIgKyB0eXBlQ29kZSArICIoX19iLCBfX2MpKTsiOworICAgIHMgKz0gVHlwZVN0cmluZyhwcm90b1sxXSwgdHlwZXN0cikgKyAiIF9fYTEgPSBfX2E7IFxcXG4gICI7CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzJdLCB0eXBlc3RyKSArICIgX19iMSA9IF9fYjsgXFxcbiAgIjsKKyAgICBzICs9IE1hbmdsZU5hbWUoInZxZG11bGgiLCB0eXBlc3RyLCBDbGFzc1MpICsgIihfX2ExLCAiICsKKyAgICAidmdldF9sYW5lXyIgKyB0eXBlQ29kZSArICIoX19iMSwgX19jKSk7IjsKICAgICBicmVhazsKICAgfQogICBjYXNlIE9wU2NhbGFyUURNdWxIaUxhbmVROiB7CiAgICAgc3RkOjpzdHJpbmcgdHlwZUNvZGUgPSAiIjsKICAgICBJbnN0cnVjdGlvblR5cGVDb2RlKHR5cGVzdHIsIENsYXNzUywgcXVhZCwgdHlwZUNvZGUpOwotICAgIHMgKz0gTWFuZ2xlTmFtZSgidnFkbXVsaCIsIHR5cGVzdHIsIENsYXNzUykgKyAiKF9fYSwgIiArCi0gICAgInZnZXRxX2xhbmVfIiArIHR5cGVDb2RlICsgIihfX2IsIF9fYykpOyI7CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzFdLCB0eXBlc3RyKSArICIgX19hMSA9IF9fYTsgXFxcbiAgIjsKKyAgICBzICs9IFR5cGVTdHJpbmcocHJvdG9bMl0sIHR5cGVzdHIpICsgIiBfX2IxID0gX19iOyBcXFxuICAiOworICAgIHMgKz0gTWFuZ2xlTmFtZSgidnFkbXVsaCIsIHR5cGVzdHIsIENsYXNzUykgKyAiKF9fYTEsICIgKworICAgICJ2Z2V0cV9sYW5lXyIgKyB0eXBlQ29kZSArICIoX19iMSwgX19jKSk7IjsKICAgICBicmVhazsKICAgfQogICBjYXNlIE9wU2NhbGFyUVJETXVsSGlMYW5lOiB7CiAgICAgc3RkOjpzdHJpbmcgdHlwZUNvZGUgPSAiIjsKICAgICBJbnN0cnVjdGlvblR5cGVDb2RlKHR5cGVzdHIsIENsYXNzUywgcXVhZCwgdHlwZUNvZGUpOwotICAgIHMgKz0gTWFuZ2xlTmFtZSgidnFyZG11bGgiLCB0eXBlc3RyLCBDbGFzc1MpICsgIihfX2EsICIgKwotICAgICJ2Z2V0X2xhbmVfIiArIHR5cGVDb2RlICsgIihfX2IsIF9fYykpOyI7CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzFdLCB0eXBlc3RyKSArICIgX19hMSA9IF9fYTsgXFxcbiAgIjsKKyAgICBzICs9IFR5cGVTdHJpbmcocHJvdG9bMl0sIHR5cGVzdHIpICsgIiBfX2IxID0gX19iOyBcXFxuICAiOworICAgIHMgKz0gTWFuZ2xlTmFtZSgidnFyZG11bGgiLCB0eXBlc3RyLCBDbGFzc1MpICsgIihfX2ExLCAiICsKKyAgICAidmdldF9sYW5lXyIgKyB0eXBlQ29kZSArICIoX19iMSwgX19jKSk7IjsKICAgICBicmVhazsKICAgfQogICBjYXNlIE9wU2NhbGFyUVJETXVsSGlMYW5lUTogewogICAgIHN0ZDo6c3RyaW5nIHR5cGVDb2RlID0gIiI7CiAgICAgSW5zdHJ1Y3Rpb25UeXBlQ29kZSh0eXBlc3RyLCBDbGFzc1MsIHF1YWQsIHR5cGVDb2RlKTsKLSAgICBzICs9IE1hbmdsZU5hbWUoInZxcmRtdWxoIiwgdHlwZXN0ciwgQ2xhc3NTKSArICIoX19hLCAiICsKLSAgICAidmdldHFfbGFuZV8iICsgdHlwZUNvZGUgKyAiKF9fYiwgX19jKSk7IjsKKyAgICBzICs9IFR5cGVTdHJpbmcocHJvdG9bMV0sIHR5cGVzdHIpICsgIiBfX2ExID0gX19hOyBcXFxuICAiOworICAgIHMgKz0gVHlwZVN0cmluZyhwcm90b1syXSwgdHlwZXN0cikgKyAiIF9fYjEgPSBfX2I7IFxcXG4gICI7CisgICAgcyArPSBNYW5nbGVOYW1lKCJ2cXJkbXVsaCIsIHR5cGVzdHIsIENsYXNzUykgKyAiKF9fYTEsICIgKworICAgICJ2Z2V0cV9sYW5lXyIgKyB0eXBlQ29kZSArICIoX19iMSwgX19jKSk7IjsKICAgICBicmVhazsKICAgfQogICBjYXNlIE9wU2NhbGFyR2V0TGFuZTp7CiAgICAgc3RkOjpzdHJpbmcgdHlwZUNvZGUgPSAiIjsKICAgICBJbnN0cnVjdGlvblR5cGVDb2RlKHR5cGVzdHIsIENsYXNzUywgcXVhZCwgdHlwZUNvZGUpOwotICAgIGlmIChxdWFkKSB7Ci0gICAgIHMgKz0gImludDE2eDhfdCBfX2ExID0gdnJlaW50ZXJwcmV0cV9zMTZfZjE2KF9fYSk7XFxcbiI7Ci0gICAgIHMgKz0gIiAgdmdldHFfbGFuZV9zMTYoX19hMSwgX19iKTsiOwotICAgIH0gZWxzZSB7Ci0gICAgIHMgKz0gImludDE2eDRfdCBfX2ExID0gdnJlaW50ZXJwcmV0X3MxNl9mMTYoX19hKTtcXFxuIjsKLSAgICAgcyArPSAiICB2Z2V0X2xhbmVfczE2KF9fYTEsIF9fYik7IjsKLSAgICB9CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzFdLCB0eXBlc3RyKSArICIgX19hMSA9IF9fYTsgXFxcbiAgIjsKKworICAgIHN0ZDo6c3RyaW5nIGludFR5cGUgPSBxdWFkID8gImludDE2eDhfdCIgOiAiaW50MTZ4NF90IjsKKyAgICBzdGQ6OnN0cmluZyBpbnROYW1lID0gcXVhZCA/ICJ2Z2V0cSIgOiAidmdldCI7CisKKyAgICAvLyByZWludGVycHJldCBmbG9hdDE2IHZlY3RvciBhcyBpbnQxNiB2ZWN0b3IKKyAgICBzICs9IGludFR5cGUgKyAiIF9fYTIgPSAqKCIgKyBpbnRUeXBlICsgIiAqKSgmX19hMSk7XFxcbiI7CisKKyAgICBzICs9ICIgIGludDE2X3QgX19hMyA9ICIgKyBpbnROYW1lICsgIl9sYW5lX3MxNihfX2EyLCBfX2IpO1xcXG4iOworCisgICAgLy8gcmVpbnRlcnByZXQgaW50MTYgdmVjdG9yIGFzIGZsb2F0MTYgdmVjdG9yCisgICAgcyArPSAiICBmbG9hdDE2X3QgX19hNCA9ICooZmxvYXQxNl90ICopKCZfX2EzKTtcXFxuIjsKKyAgICBzICs9ICIgIF9fYTQ7IjsKICAgICBicmVhazsKICAgfQogICBjYXNlIE9wU2NhbGFyU2V0TGFuZTp7CiAgICAgc3RkOjpzdHJpbmcgdHlwZUNvZGUgPSAiIjsKICAgICBJbnN0cnVjdGlvblR5cGVDb2RlKHR5cGVzdHIsIENsYXNzUywgcXVhZCwgdHlwZUNvZGUpOwotICAgIHMgKz0gImludDE2X3QgX19hMSA9IChpbnQxNl90KV9fYTtcXFxuIjsKLSAgICBpZiAocXVhZCkgewotICAgICBzICs9ICIgIGludDE2eDhfdCBfX2IxID0gdnJlaW50ZXJwcmV0cV9zMTZfZjE2KGIpO1xcXG4iOwotICAgICBzICs9ICIgIGludDE2eDhfdCBfX2IyID0gdnNldHFfbGFuZV9zMTYoX19hMSwgX19iMSwgX19jKTtcXFxuIjsKLSAgICAgcyArPSAiICB2cmVpbnRlcnByZXRxX2YxNl9zMTYoX19iMik7IjsKLSAgICB9IGVsc2UgewotICAgICBzICs9ICIgIGludDE2eDRfdCBfX2IxID0gdnJlaW50ZXJwcmV0X3MxNl9mMTYoYik7XFxcbiI7Ci0gICAgIHMgKz0gIiAgaW50MTZ4NF90IF9fYjIgPSB2c2V0X2xhbmVfczE2KF9fYTEsIF9fYjEsIF9fYyk7XFxcbiI7Ci0gICAgIHMgKz0gIiAgdnJlaW50ZXJwcmV0X2YxNl9zMTYoX19iMik7IjsKLSAgICB9CisgICAgcyArPSBUeXBlU3RyaW5nKHByb3RvWzFdLCB0eXBlc3RyKSArICIgX19hMSA9IF9fYTtcXFxuICAiOworCisgICAgc3RkOjpzdHJpbmcgb3JpZ1R5cGUgPSBxdWFkID8gImZsb2F0MTZ4OF90IiA6ICJmbG9hdDE2eDRfdCI7CisgICAgc3RkOjpzdHJpbmcgaW50VHlwZSA9IHF1YWQgPyAiaW50MTZ4OF90IiA6ICJpbnQxNng0X3QiOworICAgIHN0ZDo6c3RyaW5nIGludE5hbWUgPSBxdWFkID8gInZzZXRxIiA6ICJ2c2V0IjsKKworICAgIC8vIHJlaW50ZXJwcmV0IGZsb2F0MTZfdCBhcyBpbnQxNl90CisgICAgcyArPSAiaW50MTZfdCBfX2EyID0gKihpbnQxNl90ICopKCZfX2ExKTtcXFxuIjsKKyAgICAvLyByZWludGVycHJldCBmbG9hdDE2IHZlY3RvciBhcyBpbnQxNiB2ZWN0b3IKKyAgICBzICs9ICIgICIgKyBpbnRUeXBlICsgIiBfX2IyID0gKigiICsgaW50VHlwZSArICIgKikoJl9fYik7XFxcbiI7CisKKyAgICBzICs9ICIgICIgKyBpbnRUeXBlICsgIiBfX2IzID0gIiArIGludE5hbWUgKyAiX2xhbmVfczE2KF9fYTIsIF9fYjIsIF9fYyk7XFxcbiI7CisKKyAgICAvLyByZWludGVycHJldCBpbnQxNiB2ZWN0b3IgYXMgZmxvYXQxNiB2ZWN0b3IKKyAgICBzICs9ICIgICIgKyBvcmlnVHlwZSArICIgX19iNCA9ICooIiArIG9yaWdUeXBlICsgIiAqKSgmX19iMyk7XFxcbiI7CisgICAgcyArPSAiX19iNDsiOwogICAgIGJyZWFrOwogICB9CiAKQEAgLTIyNzksNiArMjM1MSw5IEBACiAgICAgY2FzZSAnbCc6CiAgICAgICBFVCA9IHBvbHkgPyBOZW9uVHlwZUZsYWdzOjpQb2x5NjQgOiBOZW9uVHlwZUZsYWdzOjpJbnQ2NDsKICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2snOgorICAgICAgRVQgPSBOZW9uVHlwZUZsYWdzOjpQb2x5MTI4OworICAgICAgYnJlYWs7CiAgICAgY2FzZSAnaCc6CiAgICAgICBFVCA9IE5lb25UeXBlRmxhZ3M6OkZsb2F0MTY7CiAgICAgICBicmVhazsKQEAgLTIzMTcsNyArMjM5Miw3IEBACiAgIC8vIHNyZXQtbGlrZSBhcmd1bWVudC4KICAgYm9vbCBzcmV0ID0gSXNNdWx0aVZlY1Byb3RvKHByb3RvWzBdKTsKIAotICBib29sIGRlZmluZSA9IFVzZU1hY3JvKHByb3RvKTsKKyAgYm9vbCBkZWZpbmUgPSBVc2VNYWNybyhwcm90bywgdHlwZXN0cik7CiAKICAgLy8gQ2hlY2sgaWYgdGhlIHByb3RvdHlwZSBoYXMgYSBzY2FsYXIgb3BlcmFuZCB3aXRoIHRoZSB0eXBlIG9mIHRoZSB2ZWN0b3IKICAgLy8gZWxlbWVudHMuICBJZiBub3QsIGJpdGNhc3RpbmcgdGhlIGFyZ3Mgd2lsbCB0YWtlIGNhcmUgb2YgYXJnIGNoZWNraW5nLgpAQCAtMjM4MSw3ICsyNDU2LDcgQEAKICAgICB9IGVsc2UgaWYgKHByb3RvW2ldID49ICdCJyAmJiBwcm90b1tpXSA8PSAnRCcpIHsKICAgICAgIE51bU9mVmVjID0gcHJvdG9baV0gLSAnQScgKyAxOwogICAgIH0KLSAgICAKKwogICAgIGlmIChOdW1PZlZlYyA+IDApIHsKICAgICAgIC8vIENoZWNrIGlmIGFuIGV4cGxpY2l0IGNhc3QgaXMgbmVlZGVkLgogICAgICAgaWYgKGFyZ1R5cGUgIT0gJ2MnIHx8IGFyZ1BvbHkgfHwgYXJnVXNnbikKQEAgLTI0NjIsNyArMjUzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBvdXRUeXBlU3RyLCBTdHJpbmdSZWYgaW5UeXBlU3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcEtpbmQga2luZCwgQ2xhc3NLaW5kIGNsYXNzS2luZCkgewogICBhc3NlcnQoIXByb3RvLmVtcHR5KCkgJiYgIiIpOwotICBib29sIGRlZmluZSA9IFVzZU1hY3JvKHByb3RvKSAmJiBraW5kICE9IE9wVW5hdmFpbGFibGU7CisgIGJvb2wgZGVmaW5lID0gVXNlTWFjcm8ocHJvdG8sIG91dFR5cGVTdHIpICYmIGtpbmQgIT0gT3BVbmF2YWlsYWJsZTsKICAgc3RkOjpzdHJpbmcgczsKIAogICAvLyBzdGF0aWMgYWx3YXlzIGlubGluZSArIHJldHVybiB0eXBlCkBAIC0yNTExLDcgKzI1ODYsNyBAQAogLy8vIHJ1biAtIFJlYWQgdGhlIHJlY29yZHMgaW4gYXJtX25lb24udGQgYW5kIG91dHB1dCBhcm1fbmVvbi5oLiAgYXJtX25lb24uaAogLy8vIGlzIGNvbXByaXNlZCBvZiB0eXBlIGRlZmluaXRpb25zIGFuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCiB2b2lkIE5lb25FbWl0dGVyOjpydW4ocmF3X29zdHJlYW0gJk9TKSB7Ci0gIE9TIDw8IAorICBPUyA8PAogICAgICIvKj09PS0tLS0gYXJtX25lb24uaCAtIEFSTSBOZW9uIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgogICAgICItLS09PT1cbiIKICAgICAiICpcbiIKQEAgLTI1NTEsNyArMjYyNiw3IEBACiAgIE9TIDw8ICIjaWZuZGVmIF9fQVJNX05FT05fSFxuIjsKICAgT1MgPDwgIiNkZWZpbmUgX19BUk1fTkVPTl9IXG5cbiI7CiAKLSAgT1MgPDwgIiNpZiAhZGVmaW5lZChfX0FSTV9ORU9OX18pICYmICFkZWZpbmVkKF9fQVJNX05FT04pXG4iOworICBPUyA8PCAiI2lmICFkZWZpbmVkKF9fQVJNX05FT04pXG4iOwogICBPUyA8PCAiI2Vycm9yIFwiTkVPTiBzdXBwb3J0IG5vdCBlbmFibGVkXCJcbiI7CiAgIE9TIDw8ICIjZW5kaWZcblxuIjsKIApAQCAtMjU3MCw2ICsyNjQ1LDcgQEAKICAgT1MgPDwgInR5cGVkZWYgdWludDhfdCBwb2x5OF90O1xuIjsKICAgT1MgPDwgInR5cGVkZWYgdWludDE2X3QgcG9seTE2X3Q7XG4iOwogICBPUyA8PCAidHlwZWRlZiB1aW50NjRfdCBwb2x5NjRfdDtcbiI7CisgIE9TIDw8ICJ0eXBlZGVmIF9fdWludDEyOF90IHBvbHkxMjhfdDtcbiI7CiAgIE9TIDw8ICIjZWxzZVxuIjsKICAgT1MgPDwgInR5cGVkZWYgaW50OF90IHBvbHk4X3Q7XG4iOwogICBPUyA8PCAidHlwZWRlZiBpbnQxNl90IHBvbHkxNl90O1xuIjsKQEAgLTI2NjMsNzggKzI3MzksNTkgQEAKICAgc3RkOjp2ZWN0b3I8UmVjb3JkKj4gUlYgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiSW5zdCIpOwogCiAgIFN0cmluZ01hcDxDbGFzc0tpbmQ+IEVtaXR0ZWRNYXA7CisgIHN0ZDo6c3RyaW5nIEN1cnJlbnRHdWFyZCA9ICIiOworICBib29sIEluR3VhcmQgPSBmYWxzZTsKIAotICAvLyBFbWl0IHZtb3ZsLCB2bXVsbCBhbmQgdmFiZCBpbnRyaW5zaWNzIGZpcnN0IHNvIHRoZXkgY2FuIGJlIHVzZWQgYnkgb3RoZXIKLSAgLy8gaW50cmluc2ljcy4gIChTb21lIG9mIHRoZSBzYXR1cmF0aW5nIG11bHRpcGx5IGluc3RydWN0aW9ucyBhcmUgYWxzbwotICAvLyB1c2VkIHRvIGltcGxlbWVudCB0aGUgY29ycmVzcG9uZGluZyAiX2xhbmUiIHZhcmlhbnRzLCBidXQgdGFibGVnZW4KLSAgLy8gc29ydHMgdGhlIHJlY29yZHMgaW50byBhbHBoYWJldGljYWwgb3JkZXIgc28gdGhhdCB0aGUgIl9sYW5lIiB2YXJpYW50cwotICAvLyBjb21lIGFmdGVyIHRoZSBpbnRyaW5zaWNzIHRoZXkgdXNlLikKLSAgZW1pdEludHJpbnNpYyhPUywgUmVjb3Jkcy5nZXREZWYoIlZNT1ZMIiksIEVtaXR0ZWRNYXApOwotICBlbWl0SW50cmluc2ljKE9TLCBSZWNvcmRzLmdldERlZigiVk1VTEwiKSwgRW1pdHRlZE1hcCk7Ci0gIGVtaXRJbnRyaW5zaWMoT1MsIFJlY29yZHMuZ2V0RGVmKCJWQUJEIiksIEVtaXR0ZWRNYXApOwotICBlbWl0SW50cmluc2ljKE9TLCBSZWNvcmRzLmdldERlZigiVkFCREwiKSwgRW1pdHRlZE1hcCk7CisgIC8vIFNvbWUgaW50cmluc2ljcyBhcmUgdXNlZCB0byBleHByZXNzIG90aGVycy4gVGhlc2UgbmVlZCB0byBiZSBlbWl0dGVkIG5lYXIKKyAgLy8gdGhlIGJlZ2lubmluZyBzbyB0aGF0IHRoZSBkZWNsYXJhdGlvbnMgYXJlIHByZXNlbnQgd2hlbiBuZWVkZWQuIFRoaXMgaXMKKyAgLy8gcmF0aGVyIGFuIHVnbHksIGFyYml0cmFyeSBsaXN0LCBidXQgcHJvYmFibHkgc2ltcGxlciB0aGFuIGFjdHVhbGx5IHRyYWNraW5nCisgIC8vIGRlcGVuZGVuY3kgaW5mby4KKyAgc3RhdGljIGNvbnN0IGNoYXIgKkVhcmx5RGVmc0FycltdID0KKyAgICAgIHsgIlZGTUEiLCAgICAgICJWUU1PVk4iLCAgICAiVlFNT1ZVTiIsICAiVkFCRCIsICAgICJWTU9WTCIsCisgICAgICAgICJWQUJETCIsICAgICAiVkdFVF9ISUdIIiwgIlZDT01CSU5FIiwgIlZTSExMX04iLCAiVk1PVkxfSElHSCIsCisgICAgICAgICJWTVVMTCIsICAgICAiVk1MQUxfTiIsICAgIlZNTFNMX04iLCAgIlZNVUxMX04iLCAiVk1VTExfUDY0IiwKKyAgICAgICAgIlZRRE1MQUxfTiIsICJWUURNTFNMX04iLCAiVlFETVVMTF9OIiB9OworICBBcnJheVJlZjxjb25zdCBjaGFyICo+IEVhcmx5RGVmcyhFYXJseURlZnNBcnIpOwogCi0gIC8vIEFSTSBpbnRyaW5zaWNzIG11c3QgYmUgZW1pdHRlZCBiZWZvcmUgQUFyY2g2NCBpbnRyaW5zaWNzIHRvIGVuc3VyZQotICAvLyBjb21tb24gaW50cmluc2ljcyBhcHBlYXIgb25seSBvbmNlIGluIHRoZSBvdXRwdXQgc3RyZWFtLgotICAvLyBUaGUgY2hlY2sgZm9yIHVuaXF1aW5lc3MgaXMgZG9uZSBpbiBlbWl0SW50cmluc2ljLgotICAvLyBFbWl0IEFSTSBpbnRyaW5zaWNzLgotICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUlYuc2l6ZSgpOyBpICE9IGU7ICsraSkgewotICAgIFJlY29yZCAqUiA9IFJWW2ldOwotCi0gICAgLy8gU2tpcCBBQXJjaDY0IGludHJpbnNpY3M7IHRoZXkgd2lsbCBiZSBlbWl0dGVkIGF0IHRoZSBlbmQuCi0gICAgYm9vbCBpc0E2NCA9IFItPmdldFZhbHVlQXNCaXQoImlzQTY0Iik7Ci0gICAgaWYgKGlzQTY0KQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAoUi0+Z2V0TmFtZSgpICE9ICJWTU9WTCIgJiYgUi0+Z2V0TmFtZSgpICE9ICJWTVVMTCIgJiYKLSAgICAgICAgUi0+Z2V0TmFtZSgpICE9ICJWQUJEIikKLSAgICAgIGVtaXRJbnRyaW5zaWMoT1MsIFIsIEVtaXR0ZWRNYXApOworICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRWFybHlEZWZzLnNpemUoKTsgKytpKSB7CisgICAgUmVjb3JkICpSID0gUmVjb3Jkcy5nZXREZWYoRWFybHlEZWZzW2ldKTsKKyAgICBlbWl0R3VhcmRlZEludHJpbnNpYyhPUywgUiwgQ3VycmVudEd1YXJkLCBJbkd1YXJkLCBFbWl0dGVkTWFwKTsKICAgfQogCi0gIC8vIEVtaXQgQUFyY2g2NC1zcGVjaWZpYyBpbnRyaW5zaWNzLgotICBPUyA8PCAiI2lmZGVmIF9fYWFyY2g2NF9fXG4iOwotCi0gIGVtaXRJbnRyaW5zaWMoT1MsIFJlY29yZHMuZ2V0RGVmKCJWTU9WTF9ISUdIIiksIEVtaXR0ZWRNYXApOwotICBlbWl0SW50cmluc2ljKE9TLCBSZWNvcmRzLmdldERlZigiVk1VTExfSElHSCIpLCBFbWl0dGVkTWFwKTsKLSAgZW1pdEludHJpbnNpYyhPUywgUmVjb3Jkcy5nZXREZWYoIlZBQkRMX0hJR0giKSwgRW1pdHRlZE1hcCk7Ci0KICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJWLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKICAgICBSZWNvcmQgKlIgPSBSVltpXTsKLQotICAgIC8vIFNraXAgQVJNIGludHJpbnNpY3MgYWxyZWFkeSBpbmNsdWRlZCBhYm92ZS4KLSAgICBib29sIGlzQTY0ID0gUi0+Z2V0VmFsdWVBc0JpdCgiaXNBNjQiKTsKLSAgICBpZiAoIWlzQTY0KQorICAgIGlmIChzdGQ6OmZpbmQoRWFybHlEZWZzLmJlZ2luKCksIEVhcmx5RGVmcy5lbmQoKSwgUi0+Z2V0TmFtZSgpKSAhPQorICAgICAgICBFYXJseURlZnMuZW5kKCkpCiAgICAgICBjb250aW51ZTsKIAotICAgIC8vIFNraXAgY3J5cHRvIHRlbXBvcmFyaWx5LCBhbmQgd2lsbCBlbWl0IHRoZW0gYWxsIHRvZ2V0aGVyIGF0IHRoZSBlbmQuCi0gICAgYm9vbCBpc0NyeXB0byA9IFItPmdldFZhbHVlQXNCaXQoImlzQ3J5cHRvIik7Ci0gICAgaWYgKGlzQ3J5cHRvKQotICAgICAgY29udGludWU7Ci0KLSAgICBlbWl0SW50cmluc2ljKE9TLCBSLCBFbWl0dGVkTWFwKTsKKyAgICBlbWl0R3VhcmRlZEludHJpbnNpYyhPUywgUiwgQ3VycmVudEd1YXJkLCBJbkd1YXJkLCBFbWl0dGVkTWFwKTsKICAgfQogCi0gIE9TIDw8ICIjaWZkZWYgX19BUk1fRkVBVFVSRV9DUllQVE9cbiI7Ci0KLSAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJWLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKLSAgICBSZWNvcmQgKlIgPSBSVltpXTsKLQotICAgIC8vIFNraXAgY3J5cHRvIHRlbXBvcmFyaWx5LCBhbmQgd2lsbCBlbWl0IHRoZW0gYWxsIHRvZ2V0aGVyIGF0IHRoZSBlbmQuCi0gICAgYm9vbCBpc0NyeXB0byA9IFItPmdldFZhbHVlQXNCaXQoImlzQ3J5cHRvIik7Ci0gICAgaWYgKCFpc0NyeXB0bykKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgZW1pdEludHJpbnNpYyhPUywgUiwgRW1pdHRlZE1hcCk7Ci0gIH0KLSAgCi0gIE9TIDw8ICIjZW5kaWZcblxuIjsKLQotICBPUyA8PCAiI2VuZGlmXG5cbiI7CisgIGlmIChJbkd1YXJkKQorICAgIE9TIDw8ICIjZW5kaWZcblxuIjsKIAogICBPUyA8PCAiI3VuZGVmIF9fYWlcblxuIjsKICAgT1MgPDwgIiNlbmRpZiAvKiBfX0FSTV9ORU9OX0ggKi9cbiI7CiB9CiAKK3ZvaWQgTmVvbkVtaXR0ZXI6OmVtaXRHdWFyZGVkSW50cmluc2ljKHJhd19vc3RyZWFtICZPUywgUmVjb3JkICpSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJkN1cnJlbnRHdWFyZCwgYm9vbCAmSW5HdWFyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ01hcDxDbGFzc0tpbmQ+ICZFbWl0dGVkTWFwKSB7CisKKyAgc3RkOjpzdHJpbmcgTmV3R3VhcmQgPSBSLT5nZXRWYWx1ZUFzU3RyaW5nKCJBcmNoR3VhcmQiKTsKKyAgaWYgKE5ld0d1YXJkICE9IEN1cnJlbnRHdWFyZCkgeworICAgIGlmIChJbkd1YXJkKQorICAgICAgT1MgPDwgIiNlbmRpZlxuXG4iOworICAgIGlmIChOZXdHdWFyZC5zaXplKCkpCisgICAgICBPUyA8PCAiI2lmICIgPDwgTmV3R3VhcmQgPDwgJ1xuJzsKKworICAgIEN1cnJlbnRHdWFyZCA9IE5ld0d1YXJkOworICAgIEluR3VhcmQgPSBOZXdHdWFyZC5zaXplKCkgIT0gMDsKKyAgfQorCisgIGVtaXRJbnRyaW5zaWMoT1MsIFIsIEVtaXR0ZWRNYXApOworfQorCiAvLy8gZW1pdEludHJpbnNpYyAtIFdyaXRlIG91dCB0aGUgYXJtX25lb24uaCBoZWFkZXIgZmlsZSBkZWZpbml0aW9ucyBmb3IgdGhlCiAvLy8gaW50cmluc2ljcyBzcGVjaWZpZWQgYnkgcmVjb3JkIFIgY2hlY2tpbmcgZm9yIGludHJpbnNpYyB1bmlxdWVuZXNzLgogdm9pZCBOZW9uRW1pdHRlcjo6ZW1pdEludHJpbnNpYyhyYXdfb3N0cmVhbSAmT1MsIFJlY29yZCAqUiwKQEAgLTI3NzUsOCArMjgzMiwxMSBAQAogICAgIH0gZWxzZSB7CiAgICAgICBzdGQ6OnN0cmluZyBzID0KICAgICAgICAgICBHZW5JbnRyaW5zaWMobmFtZSwgUHJvdG8sIFR5cGVWZWNbdGldLCBUeXBlVmVjW3RpXSwga2luZCwgY2xhc3NLaW5kKTsKLSAgICAgIGlmIChFbWl0dGVkTWFwLmNvdW50KHMpKQorICAgICAgaWYgKEVtaXR0ZWRNYXAuY291bnQocykpIHsKKyAgICAgICAgZXJycygpIDw8ICJ3YXJuaW5nOiBkdXBsaWNhdGUgZGVmaW5pdGlvbjogIiA8PCBuYW1lCisgICAgICAgICAgICAgICA8PCAiICh0eXBlOiAiIDw8IFR5cGVTdHJpbmcoJ2QnLCBUeXBlVmVjW3RpXSkgPDwgIilcbiI7CiAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQogICAgICAgRW1pdHRlZE1hcFtzXSA9IGNsYXNzS2luZDsKICAgICAgIE9TIDw8IHM7CiAgICAgfQpAQCAtMjgwMiw2ICsyODYyLDggQEAKICAgICBjYXNlICdkJzoKICAgICBjYXNlICdsJzoKICAgICAgIHJldHVybiAoMSA8PCAoaW50KXF1YWQpIC0gMTsKKyAgICBjYXNlICdrJzoKKyAgICAgIHJldHVybiAwOwogICAgIGRlZmF1bHQ6CiAgICAgICBQcmludEZhdGFsRXJyb3IoInVuaGFuZGxlZCB0eXBlISIpOwogICB9CkBAIC0yODI1LDYgKzI4ODcsOCBAQAogICAgIGNhc2UgJ2QnOgogICAgIGNhc2UgJ2wnOgogICAgICAgcmV0dXJuIDYzOworICAgIGNhc2UgJ2snOgorICAgICAgcmV0dXJuIDEyNzsKICAgICBkZWZhdWx0OgogICAgICAgUHJpbnRGYXRhbEVycm9yKCJ1bmhhbmRsZWQgdHlwZSEiKTsKICAgfQpAQCAtMjgzMywxNyArMjg5NywxMiBAQAogLy8vIEdlbmVyYXRlIHRoZSBBUk0gYW5kIEFBcmNoNjQgaW50cmluc2ljIHJhbmdlIGNoZWNraW5nIGNvZGUgZm9yCiAvLy8gc2hpZnQvbGFuZSBpbW1lZGlhdGVzLCBjaGVja2luZyBmb3IgdW5pcXVlIGRlY2xhcmF0aW9ucy4KIHZvaWQKLU5lb25FbWl0dGVyOjpnZW5JbnRyaW5zaWNSYW5nZUNoZWNrQ29kZShyYXdfb3N0cmVhbSAmT1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTWFwPENsYXNzS2luZD4gJkE2NEludHJpbnNpY01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQTY0UmFuZ2VDaGVjaykgeworTmVvbkVtaXR0ZXI6OmdlbkludHJpbnNpY1JhbmdlQ2hlY2tDb2RlKHJhd19vc3RyZWFtICZPUykgewogICBzdGQ6OnZlY3RvcjxSZWNvcmQgKj4gUlYgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiSW5zdCIpOwogICBTdHJpbmdNYXA8T3BLaW5kPiBFbWl0dGVkTWFwOwogCiAgIC8vIEdlbmVyYXRlIHRoZSBpbnRyaW5zaWMgcmFuZ2UgY2hlY2tpbmcgY29kZSBmb3Igc2hpZnQvbGFuZSBpbW1lZGlhdGVzLgotICBpZiAoaXNBNjRSYW5nZUNoZWNrKQotICAgIE9TIDw8ICIjaWZkZWYgR0VUX05FT05fQUFSQ0g2NF9JTU1FRElBVEVfQ0hFQ0tcbiI7Ci0gIGVsc2UKLSAgICBPUyA8PCAiI2lmZGVmIEdFVF9ORU9OX0lNTUVESUFURV9DSEVDS1xuIjsKKyAgT1MgPDwgIiNpZmRlZiBHRVRfTkVPTl9JTU1FRElBVEVfQ0hFQ0tcbiI7CiAKICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJWLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKICAgICBSZWNvcmQgKlIgPSBSVltpXTsKQEAgLTI4NzgsMTkgKzI5MzcsNiBAQAogICAgIGlmICghUHJvdG9IYXNTY2FsYXIoUHJvdG8pKQogICAgICAgY2sgPSBDbGFzc0I7CiAKLSAgICAvLyBEbyBub3QgaW5jbHVkZSBBQXJjaDY0IHJhbmdlIGNoZWNrcyBpZiBub3QgZ2VuZXJhdGluZyBjb2RlIGZvciBBQXJjaDY0LgotICAgIGJvb2wgaXNBNjQgPSBSLT5nZXRWYWx1ZUFzQml0KCJpc0E2NCIpOwotICAgIGlmICghaXNBNjRSYW5nZUNoZWNrICYmIGlzQTY0KQotICAgICAgY29udGludWU7Ci0KLSAgICAvLyBJbmNsdWRlIEFSTSByYW5nZSBjaGVja3MgaW4gQUFyY2g2NCBidXQgb25seSBpZiBBUk0gaW50cmluc2ljcyBhcmUgbm90Ci0gICAgLy8gcmVkZWZpbmVkIGJ5IEFBcmNoNjQgdG8gaGFuZGxlIG5ldyB0eXBlcy4KLSAgICBpZiAoaXNBNjRSYW5nZUNoZWNrICYmICFpc0E2NCAmJiBBNjRJbnRyaW5zaWNNYXAuY291bnQoUmVuYW1lKSkgewotICAgICAgQ2xhc3NLaW5kICZBNjRDSyA9IEE2NEludHJpbnNpY01hcFtSZW5hbWVdOwotICAgICAgaWYgKEE2NENLID09IGNrICYmIGNrICE9IENsYXNzTm9uZSkKLSAgICAgICAgY29udGludWU7Ci0gICAgfQotCiAgICAgZm9yICh1bnNpZ25lZCB0aSA9IDAsIHRlID0gVHlwZVZlYy5zaXplKCk7IHRpICE9IHRlOyArK3RpKSB7CiAgICAgICBzdGQ6OnN0cmluZyBuYW1lc3RyLCBzaGlmdHN0ciwgcmFuZ2VzdHI7CiAKQEAgLTI5MjksNiArMjk3NSwxNCBAQAogICAgICAgICAgIHJhbmdlc3RyID0gImwgPSAxOyAiOwogCiAgICAgICAgIHJhbmdlc3RyICs9ICJ1ID0gUkZUKFRWIiArIHNoaWZ0c3RyICsgIikiOworICAgICAgfSBlbHNlIGlmIChjayA9PSBDbGFzc0IpIHsKKyAgICAgICAgLy8gQ2xhc3NCIGludHJpbnNpY3MgaGF2ZSBhIHR5cGUgKGFuZCBoZW5jZSBsYW5lIG51bWJlcikgdGhhdCBpcyBvbmx5CisgICAgICAgIC8vIGtub3duIGF0IHJ1bnRpbWUuCisgICAgICAgIGFzc2VydChpbW1Qb3MgPiAwICYmICJ1bmV4cGVjdGVkIGltbWVkaWF0ZSBvcGVyYW5kIik7CisgICAgICAgIGlmIChSLT5nZXRWYWx1ZUFzQml0KCJpc0xhbmVRIikpCisgICAgICAgICAgcmFuZ2VzdHIgPSAidSA9IFJGVChUViwgZmFsc2UsIHRydWUpIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJhbmdlc3RyID0gInUgPSBSRlQoVFYsIGZhbHNlLCBmYWxzZSkiOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVGhlIGltbWVkaWF0ZSBnZW5lcmFsbHkgcmVmZXJzIHRvIGEgbGFuZSBpbiB0aGUgcHJlY2VkaW5nIGFyZ3VtZW50LgogICAgICAgICBhc3NlcnQoaW1tUG9zID4gMCAmJiAidW5leHBlY3RlZCBpbW1lZGlhdGUgb3BlcmFuZCIpOwpAQCAtMjk3MywxMCArMzAyNyw3IEBACiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmIChpc0E2NFJhbmdlQ2hlY2spCi0gICAgICAgIE9TIDw8ICJjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fIjsKLSAgICAgIGVsc2UKLSAgICAgICAgT1MgPDwgImNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uXyI7CisgICAgICBPUyA8PCAiY2FzZSBORU9OOjpCSV9fYnVpbHRpbl9uZW9uXyI7CiAgICAgICBPUyA8PCBNYW5nbGVOYW1lKG5hbWUsIFR5cGVWZWNbdGldLCBjaykgPDwgIjogaSA9ICIgPDwgaW1taWR4IDw8ICI7ICIKICAgICAgICAgIDw8IHJhbmdlc3RyIDw8ICI7IGJyZWFrO1xuIjsKICAgICB9CkBAIC0yOTg0LDIwICszMDM1LDI1IEBACiAgIE9TIDw8ICIjZW5kaWZcblxuIjsKIH0KIAorc3RydWN0IE92ZXJsb2FkSW5mbyB7CisgIHVpbnQ2NF90IE1hc2s7CisgIGludCBQdHJBcmdOdW07CisgIGJvb2wgSGFzQ29uc3RQdHI7Cit9OwogLy8vIEdlbmVyYXRlIHRoZSBBUk0gYW5kIEFBcmNoNjQgb3ZlcmxvYWRlZCB0eXBlIGNoZWNraW5nIGNvZGUgZm9yCiAvLy8gU2VtYUNoZWNraW5nLmNwcCwgY2hlY2tpbmcgZm9yIHVuaXF1ZSBidWlsdGluIGRlY2xhcmF0aW9ucy4KIHZvaWQKLU5lb25FbWl0dGVyOjpnZW5PdmVybG9hZFR5cGVDaGVja0NvZGUocmF3X29zdHJlYW0gJk9TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdNYXA8Q2xhc3NLaW5kPiAmQTY0SW50cmluc2ljTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQTY0VHlwZUNoZWNrKSB7CitOZW9uRW1pdHRlcjo6Z2VuT3ZlcmxvYWRUeXBlQ2hlY2tDb2RlKHJhd19vc3RyZWFtICZPUykgewogICBzdGQ6OnZlY3RvcjxSZWNvcmQgKj4gUlYgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiSW5zdCIpOwotICBTdHJpbmdNYXA8T3BLaW5kPiBFbWl0dGVkTWFwOwogCiAgIC8vIEdlbmVyYXRlIHRoZSBvdmVybG9hZGVkIHR5cGUgY2hlY2tpbmcgY29kZSBmb3IgU2VtYUNoZWNraW5nLmNwcAotICBpZiAoaXNBNjRUeXBlQ2hlY2spCi0gICAgT1MgPDwgIiNpZmRlZiBHRVRfTkVPTl9BQVJDSDY0X09WRVJMT0FEX0NIRUNLXG4iOwotICBlbHNlCi0gICAgT1MgPDwgIiNpZmRlZiBHRVRfTkVPTl9PVkVSTE9BRF9DSEVDS1xuIjsKKyAgT1MgPDwgIiNpZmRlZiBHRVRfTkVPTl9PVkVSTE9BRF9DSEVDS1xuIjsKKworICAvLyBXZSByZWNvcmQgZWFjaCBvdmVybG9hZCBjaGVjayBsaW5lIGJlZm9yZSBlbWl0dGluZyBiZWNhdXNlIHN1YnNlcXVlbnQgSW5zdAorICAvLyBkZWZpbml0aW9ucyBtYXkgZXh0ZW5kIHRoZSBudW1iZXIgb2YgcGVybWl0dGVkIHR5cGVzIChpLmUuIGF1Z21lbnQgdGhlCisgIC8vIE1hc2spLiBVc2Ugc3RkOjptYXAgdG8gYXZvaWQgc29ydGluZyB0aGUgdGFibGUgYnkgaGFzaCBudW1iZXIuCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBPdmVybG9hZEluZm8+IE92ZXJsb2FkTWFwOworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBPdmVybG9hZEluZm8+OjppdGVyYXRvciBPdmVybG9hZEl0ZXJhdG9yOwogCiAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBSVi5zaXplKCk7IGkgIT0gZTsgKytpKSB7CiAgICAgUmVjb3JkICpSID0gUlZbaV07CkBAIC0zMDA5LDcgKzMwNjUsNyBAQAogICAgIHN0ZDo6c3RyaW5nIFR5cGVzID0gUi0+Z2V0VmFsdWVBc1N0cmluZygiVHlwZXMiKTsKICAgICBzdGQ6OnN0cmluZyBuYW1lID0gUi0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZSIpOwogICAgIHN0ZDo6c3RyaW5nIFJlbmFtZSA9IG5hbWUgKyAiQCIgKyBQcm90bzsKLSAgICAKKwogICAgIC8vIEZ1bmN0aW9ucyB3aXRoICdhJyAodGhlIHNwbGF0IGNvZGUpIGluIHRoZSB0eXBlIHByb3RvdHlwZSBzaG91bGQgbm90IGdldAogICAgIC8vIHRoZWlyIG93biBidWlsdGluIGFzIHRoZXkgdXNlIHRoZSBub24tc3BsYXQgdmFyaWFudC4KICAgICBpZiAoUHJvdG8uZmluZCgnYScpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQpAQCAtMzAyNiwyMSArMzA4Miw2IEBACiAgICAgaWYgKFItPmdldFN1cGVyQ2xhc3NlcygpLnNpemUoKSA8IDIpCiAgICAgICBQcmludEZhdGFsRXJyb3IoUi0+Z2V0TG9jKCksICJCdWlsdGluIGhhcyBubyBjbGFzcyBraW5kIik7CiAKLSAgICAvLyBEbyBub3QgaW5jbHVkZSBBQXJjaDY0IHR5cGUgY2hlY2tzIGlmIG5vdCBnZW5lcmF0aW5nIGNvZGUgZm9yIEFBcmNoNjQuCi0gICAgYm9vbCBpc0E2NCA9IFItPmdldFZhbHVlQXNCaXQoImlzQTY0Iik7Ci0gICAgaWYgKCFpc0E2NFR5cGVDaGVjayAmJiBpc0E2NCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLy8gSW5jbHVkZSBBUk0gIHR5cGUgY2hlY2sgaW4gQUFyY2g2NCBidXQgb25seSBpZiBBUk0gaW50cmluc2ljcwotICAgIC8vIGFyZSBub3QgcmVkZWZpbmVkIGluIEFBcmNoNjQgdG8gaGFuZGxlIG5ldyB0eXBlcywgZS5nLiAidmFiZCIgaXMgYSBTSW50cgotICAgIC8vIHJlZGVmaW5lZCBpbiBBQXJjaDY0IHRvIGhhbmRsZSBhbiBhZGRpdGlvbmFsIDIgeCBmNjQgdHlwZS4KLSAgICBDbGFzc0tpbmQgY2sgPSBDbGFzc01hcFtSLT5nZXRTdXBlckNsYXNzZXMoKVsxXV07Ci0gICAgaWYgKGlzQTY0VHlwZUNoZWNrICYmICFpc0E2NCAmJiBBNjRJbnRyaW5zaWNNYXAuY291bnQoUmVuYW1lKSkgewotICAgICAgQ2xhc3NLaW5kICZBNjRDSyA9IEE2NEludHJpbnNpY01hcFtSZW5hbWVdOwotICAgICAgaWYgKEE2NENLID09IGNrICYmIGNrICE9IENsYXNzTm9uZSkKLSAgICAgICAgY29udGludWU7Ci0gICAgfQotCiAgICAgaW50IHNpID0gLTEsIHFpID0gLTE7CiAgICAgdWludDY0X3QgbWFzayA9IDAsIHFtYXNrID0gMDsKICAgICBmb3IgKHVuc2lnbmVkIHRpID0gMCwgdGUgPSBUeXBlVmVjLnNpemUoKTsgdGkgIT0gdGU7ICsrdGkpIHsKQEAgLTMwODgsNDggKzMxMjksNTIgQEAKICAgICB9CiAKICAgICBpZiAobWFzaykgewotICAgICAgaWYgKGlzQTY0VHlwZUNoZWNrKQotICAgICAgICBPUyA8PCAiY2FzZSBBQXJjaDY0OjpCSV9fYnVpbHRpbl9uZW9uXyI7Ci0gICAgICBlbHNlCi0gICAgICAgIE9TIDw8ICJjYXNlIEFSTTo6QklfX2J1aWx0aW5fbmVvbl8iOwotICAgICAgT1MgPDwgTWFuZ2xlTmFtZShuYW1lLCBUeXBlVmVjW3NpXSwgQ2xhc3NCKSA8PCAiOiBtYXNrID0gIgotICAgICAgICAgPDwgIjB4IiA8PCB1dG9oZXhzdHIobWFzaykgPDwgIlVMTCI7Ci0gICAgICBpZiAoUHRyQXJnTnVtID49IDApCi0gICAgICAgIE9TIDw8ICI7IFB0ckFyZ051bSA9ICIgPDwgUHRyQXJnTnVtOwotICAgICAgaWYgKEhhc0NvbnN0UHRyKQotICAgICAgICBPUyA8PCAiOyBIYXNDb25zdFB0ciA9IHRydWUiOwotICAgICAgT1MgPDwgIjsgYnJlYWs7XG4iOworICAgICAgc3RkOjpwYWlyPE92ZXJsb2FkSXRlcmF0b3IsIGJvb2w+IEkgPSBPdmVybG9hZE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgTWFuZ2xlTmFtZShuYW1lLCBUeXBlVmVjW3NpXSwgQ2xhc3NCKSwgT3ZlcmxvYWRJbmZvKCkpKTsKKyAgICAgIE92ZXJsb2FkSW5mbyAmUmVjb3JkID0gSS5maXJzdC0+c2Vjb25kOworICAgICAgaWYgKCFJLnNlY29uZCkKKyAgICAgICAgYXNzZXJ0KFJlY29yZC5QdHJBcmdOdW0gPT0gUHRyQXJnTnVtICYmCisgICAgICAgICAgICAgICBSZWNvcmQuSGFzQ29uc3RQdHIgPT0gSGFzQ29uc3RQdHIpOworICAgICAgUmVjb3JkLk1hc2sgfD0gbWFzazsKKyAgICAgIFJlY29yZC5QdHJBcmdOdW0gPSBQdHJBcmdOdW07CisgICAgICBSZWNvcmQuSGFzQ29uc3RQdHIgPSBIYXNDb25zdFB0cjsKICAgICB9CiAgICAgaWYgKHFtYXNrKSB7Ci0gICAgICBpZiAoaXNBNjRUeXBlQ2hlY2spCi0gICAgICAgIE9TIDw8ICJjYXNlIEFBcmNoNjQ6OkJJX19idWlsdGluX25lb25fIjsKLSAgICAgIGVsc2UKLSAgICAgICAgT1MgPDwgImNhc2UgQVJNOjpCSV9fYnVpbHRpbl9uZW9uXyI7Ci0gICAgICBPUyA8PCBNYW5nbGVOYW1lKG5hbWUsIFR5cGVWZWNbcWldLCBDbGFzc0IpIDw8ICI6IG1hc2sgPSAiCi0gICAgICAgICA8PCAiMHgiIDw8IHV0b2hleHN0cihxbWFzaykgPDwgIlVMTCI7Ci0gICAgICBpZiAoUHRyQXJnTnVtID49IDApCi0gICAgICAgIE9TIDw8ICI7IFB0ckFyZ051bSA9ICIgPDwgUHRyQXJnTnVtOwotICAgICAgaWYgKEhhc0NvbnN0UHRyKQotICAgICAgICBPUyA8PCAiOyBIYXNDb25zdFB0ciA9IHRydWUiOwotICAgICAgT1MgPDwgIjsgYnJlYWs7XG4iOworICAgICAgc3RkOjpwYWlyPE92ZXJsb2FkSXRlcmF0b3IsIGJvb2w+IEkgPSBPdmVybG9hZE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgTWFuZ2xlTmFtZShuYW1lLCBUeXBlVmVjW3FpXSwgQ2xhc3NCKSwgT3ZlcmxvYWRJbmZvKCkpKTsKKyAgICAgIE92ZXJsb2FkSW5mbyAmUmVjb3JkID0gSS5maXJzdC0+c2Vjb25kOworICAgICAgaWYgKCFJLnNlY29uZCkKKyAgICAgICAgYXNzZXJ0KFJlY29yZC5QdHJBcmdOdW0gPT0gUHRyQXJnTnVtICYmCisgICAgICAgICAgICAgICBSZWNvcmQuSGFzQ29uc3RQdHIgPT0gSGFzQ29uc3RQdHIpOworICAgICAgUmVjb3JkLk1hc2sgfD0gcW1hc2s7CisgICAgICBSZWNvcmQuUHRyQXJnTnVtID0gUHRyQXJnTnVtOworICAgICAgUmVjb3JkLkhhc0NvbnN0UHRyID0gSGFzQ29uc3RQdHI7CiAgICAgfQogICB9CisKKyAgZm9yIChPdmVybG9hZEl0ZXJhdG9yIEkgPSBPdmVybG9hZE1hcC5iZWdpbigpLCBFID0gT3ZlcmxvYWRNYXAuZW5kKCk7IEkgIT0gRTsKKyAgICAgICArK0kpIHsKKyAgICBPdmVybG9hZEluZm8gJkJ1aWx0aW5PdmVybG9hZHMgPSBJLT5zZWNvbmQ7CisgICAgT1MgPDwgImNhc2UgTkVPTjo6QklfX2J1aWx0aW5fbmVvbl8iIDw8IEktPmZpcnN0IDw8ICI6ICI7CisgICAgT1MgPDwgIm1hc2sgPSAiIDw8ICIweCIgPDwgdXRvaGV4c3RyKEJ1aWx0aW5PdmVybG9hZHMuTWFzaykgPDwgIlVMTCI7CisgICAgaWYgKEJ1aWx0aW5PdmVybG9hZHMuUHRyQXJnTnVtID49IDApCisgICAgICBPUyA8PCAiOyBQdHJBcmdOdW0gPSAiIDw8IEJ1aWx0aW5PdmVybG9hZHMuUHRyQXJnTnVtOworICAgIGlmIChCdWlsdGluT3ZlcmxvYWRzLkhhc0NvbnN0UHRyKQorICAgICAgT1MgPDwgIjsgSGFzQ29uc3RQdHIgPSB0cnVlIjsKKyAgICBPUyA8PCAiOyBicmVhaztcbiI7CisgIH0KKwogICBPUyA8PCAiI2VuZGlmXG5cbiI7CiB9CiAKIC8vLyBnZW5CdWlsdGluc0RlZjogR2VuZXJhdGUgdGhlIEJ1aWx0aW5zQVJNLmRlZiBhbmQgIEJ1aWx0aW5zQUFyY2g2NC5kZWYKIC8vLyBkZWNsYXJhdGlvbiBvZiBidWlsdGlucywgY2hlY2tpbmcgZm9yIHVuaXF1ZSBidWlsdGluIGRlY2xhcmF0aW9ucy4KLXZvaWQgTmVvbkVtaXR0ZXI6OmdlbkJ1aWx0aW5zRGVmKHJhd19vc3RyZWFtICZPUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ01hcDxDbGFzc0tpbmQ+ICZBNjRJbnRyaW5zaWNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQTY0R2VuQnVpbHRpbkRlZikgewordm9pZCBOZW9uRW1pdHRlcjo6Z2VuQnVpbHRpbnNEZWYocmF3X29zdHJlYW0gJk9TKSB7CiAgIHN0ZDo6dmVjdG9yPFJlY29yZCAqPiBSViA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJJbnN0Iik7Ci0gIFN0cmluZ01hcDxPcEtpbmQ+IEVtaXR0ZWRNYXA7CiAKLSAgLy8gR2VuZXJhdGUgQnVpbHRpbnNBUk0uZGVmIGFuZCBCdWlsdGluc0FBcmNoNjQuZGVmCi0gIGlmIChpc0E2NEdlbkJ1aWx0aW5EZWYpCi0gICAgT1MgPDwgIiNpZmRlZiBHRVRfTkVPTl9BQVJDSDY0X0JVSUxUSU5TXG4iOwotICBlbHNlCi0gICAgT1MgPDwgIiNpZmRlZiBHRVRfTkVPTl9CVUlMVElOU1xuIjsKKyAgLy8gV2Ugd2FudCB0byBlbWl0IHRoZSBpbnRyaW5zaWNzIGluIGFscGhhYmV0aWNhbCBvcmRlciwgc28gdXNlIHRoZSBtb3JlCisgIC8vIGV4cGVuc2l2ZSBzdGQ6Om1hcCB0byBnYXRoZXIgdGhlbSB0b2dldGhlciBmaXJzdC4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE9wS2luZD4gRW1pdHRlZE1hcDsKIAogICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUlYuc2l6ZSgpOyBpICE9IGU7ICsraSkgewogICAgIFJlY29yZCAqUiA9IFJWW2ldOwpAQCAtMzE1NSwyMSArMzIwMCw2IEBACiAKICAgICBDbGFzc0tpbmQgY2sgPSBDbGFzc01hcFtSLT5nZXRTdXBlckNsYXNzZXMoKVsxXV07CiAKLSAgICAvLyBEbyBub3QgaW5jbHVkZSBBQXJjaDY0IEJVSUxUSU4oKSBtYWNyb3MgaWYgbm90IGdlbmVyYXRpbmcKLSAgICAvLyBjb2RlIGZvciBBQXJjaDY0Ci0gICAgYm9vbCBpc0E2NCA9IFItPmdldFZhbHVlQXNCaXQoImlzQTY0Iik7Ci0gICAgaWYgKCFpc0E2NEdlbkJ1aWx0aW5EZWYgJiYgaXNBNjQpCi0gICAgICBjb250aW51ZTsKLQotICAgIC8vIEluY2x1ZGUgQVJNICBCVUlMVElOKCkgbWFjcm9zICBpbiBBQXJjaDY0IGJ1dCBvbmx5IGlmIEFSTSBpbnRyaW5zaWNzCi0gICAgLy8gYXJlIG5vdCByZWRlZmluZWQgaW4gQUFyY2g2NCB0byBoYW5kbGUgbmV3IHR5cGVzLCBlLmcuICJ2YWJkIiBpcyBhIFNJbnRyCi0gICAgLy8gcmVkZWZpbmVkIGluIEFBcmNoNjQgdG8gaGFuZGxlIGFuIGFkZGl0aW9uYWwgMiB4IGY2NCB0eXBlLgotICAgIGlmIChpc0E2NEdlbkJ1aWx0aW5EZWYgJiYgIWlzQTY0ICYmIEE2NEludHJpbnNpY01hcC5jb3VudChSZW5hbWUpKSB7Ci0gICAgICBDbGFzc0tpbmQgJkE2NENLID0gQTY0SW50cmluc2ljTWFwW1JlbmFtZV07Ci0gICAgICBpZiAoQTY0Q0sgPT0gY2sgJiYgY2sgIT0gQ2xhc3NOb25lKQotICAgICAgICBjb250aW51ZTsKLSAgICB9Ci0KICAgICBmb3IgKHVuc2lnbmVkIHRpID0gMCwgdGUgPSBUeXBlVmVjLnNpemUoKTsgdGkgIT0gdGU7ICsrdGkpIHsKICAgICAgIC8vIEdlbmVyYXRlIHRoZSBkZWNsYXJhdGlvbiBmb3IgdGhpcyBidWlsdGluLCBlbnN1cmluZwogICAgICAgLy8gdGhhdCBlYWNoIHVuaXF1ZSBCVUlMVElOKCkgbWFjcm8gYXBwZWFycyBvbmx5IG9uY2UgaW4gdGhlIG91dHB1dApAQCAtMzE3OSw5ICszMjA5LDE3IEBACiAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICBFbWl0dGVkTWFwW2JkXSA9IE9wTm9uZTsKLSAgICAgIE9TIDw8IGJkIDw8ICJcbiI7CiAgICAgfQogICB9CisKKyAgLy8gR2VuZXJhdGUgQnVpbHRpbnNORU9OLgorICBPUyA8PCAiI2lmZGVmIEdFVF9ORU9OX0JVSUxUSU5TXG4iOworCisgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIE9wS2luZD46Oml0ZXJhdG9yIEkgPSBFbWl0dGVkTWFwLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBFbWl0dGVkTWFwLmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIE9TIDw8IEktPmZpcnN0IDw8ICJcbiI7CisKICAgT1MgPDwgIiNlbmRpZlxuXG4iOwogfQogCkBAIC0zMTkyLDQ0ICszMjMwLDE0IEBACiB2b2lkIE5lb25FbWl0dGVyOjpydW5IZWFkZXIocmF3X29zdHJlYW0gJk9TKSB7CiAgIHN0ZDo6dmVjdG9yPFJlY29yZCAqPiBSViA9IFJlY29yZHMuZ2V0QWxsRGVyaXZlZERlZmluaXRpb25zKCJJbnN0Iik7CiAKLSAgLy8gYnVpbGQgYSBtYXAgb2YgQUFyY2g2NCBpbnRyaW5pc2NzIHRvIGJlIHVzZWQgaW4gdW5pcXVlbmVzcyBjaGVja3MuCi0gIFN0cmluZ01hcDxDbGFzc0tpbmQ+IEE2NEludHJpbnNpY01hcDsKLSAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJWLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKLSAgICBSZWNvcmQgKlIgPSBSVltpXTsKLQotICAgIGJvb2wgaXNBNjQgPSBSLT5nZXRWYWx1ZUFzQml0KCJpc0E2NCIpOwotICAgIGlmICghaXNBNjQpCi0gICAgICBjb250aW51ZTsKLQotICAgIENsYXNzS2luZCBDSyA9IENsYXNzTm9uZTsKLSAgICBpZiAoUi0+Z2V0U3VwZXJDbGFzc2VzKCkuc2l6ZSgpID49IDIpCi0gICAgICBDSyA9IENsYXNzTWFwW1ItPmdldFN1cGVyQ2xhc3NlcygpWzFdXTsKLQotICAgIHN0ZDo6c3RyaW5nIE5hbWUgPSBSLT5nZXRWYWx1ZUFzU3RyaW5nKCJOYW1lIik7Ci0gICAgc3RkOjpzdHJpbmcgUHJvdG8gPSBSLT5nZXRWYWx1ZUFzU3RyaW5nKCJQcm90b3R5cGUiKTsKLSAgICBzdGQ6OnN0cmluZyBSZW5hbWUgPSBOYW1lICsgIkAiICsgUHJvdG87Ci0gICAgaWYgKEE2NEludHJpbnNpY01hcC5jb3VudChSZW5hbWUpKQotICAgICAgY29udGludWU7Ci0gICAgQTY0SW50cmluc2ljTWFwW1JlbmFtZV0gPSBDSzsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIEJ1aWx0aW5zQVJNLmRlZiBmb3IgQVJNCi0gIGdlbkJ1aWx0aW5zRGVmKE9TLCBBNjRJbnRyaW5zaWNNYXAsIGZhbHNlKTsKLQotICAvLyBHZW5lcmF0ZSBCdWlsdGluc0FBcmNoNjQuZGVmIGZvciBBQXJjaDY0Ci0gIGdlbkJ1aWx0aW5zRGVmKE9TLCBBNjRJbnRyaW5zaWNNYXAsIHRydWUpOworICAvLyBHZW5lcmF0ZSBzaGFyZWQgQnVpbHRpbnNYWFguZGVmCisgIGdlbkJ1aWx0aW5zRGVmKE9TKTsKIAogICAvLyBHZW5lcmF0ZSBBUk0gb3ZlcmxvYWRlZCB0eXBlIGNoZWNraW5nIGNvZGUgZm9yIFNlbWFDaGVja2luZy5jcHAKLSAgZ2VuT3ZlcmxvYWRUeXBlQ2hlY2tDb2RlKE9TLCBBNjRJbnRyaW5zaWNNYXAsIGZhbHNlKTsKLQotICAvLyBHZW5lcmF0ZSBBQXJjaDY0IG92ZXJsb2FkZWQgdHlwZSBjaGVja2luZyBjb2RlIGZvciBTZW1hQ2hlY2tpbmcuY3BwCi0gIGdlbk92ZXJsb2FkVHlwZUNoZWNrQ29kZShPUywgQTY0SW50cmluc2ljTWFwLCB0cnVlKTsKKyAgZ2VuT3ZlcmxvYWRUeXBlQ2hlY2tDb2RlKE9TKTsKIAogICAvLyBHZW5lcmF0ZSBBUk0gcmFuZ2UgY2hlY2tpbmcgY29kZSBmb3Igc2hpZnQvbGFuZSBpbW1lZGlhdGVzLgotICBnZW5JbnRyaW5zaWNSYW5nZUNoZWNrQ29kZShPUywgQTY0SW50cmluc2ljTWFwLCBmYWxzZSk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIEFBcmNoNjQgcmFuZ2UgY2hlY2tpbmcgY29kZSBmb3Igc2hpZnQvbGFuZSBpbW1lZGlhdGVzLgotICBnZW5JbnRyaW5zaWNSYW5nZUNoZWNrQ29kZShPUywgQTY0SW50cmluc2ljTWFwLCB0cnVlKTsKKyAgZ2VuSW50cmluc2ljUmFuZ2VDaGVja0NvZGUoT1MpOwogfQogCiAvLy8gR2VuVGVzdCAtIFdyaXRlIG91dCBhIHRlc3QgZm9yIHRoZSBpbnRyaW5zaWMgc3BlY2lmaWVkIGJ5IHRoZSBuYW1lIGFuZApAQCAtMzI1OSw5ICszMjY3LDkgQEAKICAgLy8gZm9yIGFhcmNoNjQgaW5zdHJ1Y3Rpb25zIHlldAogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRmlsZUNoZWNrUGF0dGVybnM7CiAgIGlmICghaXNBNjQpIHsKLQlHZW5lcmF0ZUNoZWNrc0ZvckludHJpbnNpYyhuYW1lLCBwcm90bywgb3V0VHlwZVN0ciwgaW5UeXBlU3RyLCBjaywgSW5zdE5hbWUsCi0JCQkJCQkJICAgaXNIaWRkZW5MT3AsIEZpbGVDaGVja1BhdHRlcm5zKTsKLQlzKz0gIi8vIENIRUNLX0FSTTogdGVzdF8iICsgbWFuZ2xlZE5hbWUgKyAiXG4iOworICAgIEdlbmVyYXRlQ2hlY2tzRm9ySW50cmluc2ljKG5hbWUsIHByb3RvLCBvdXRUeXBlU3RyLCBpblR5cGVTdHIsIGNrLCBJbnN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hpZGRlbkxPcCwgRmlsZUNoZWNrUGF0dGVybnMpOworICAgIHMrPSAiLy8gQ0hFQ0tfQVJNOiB0ZXN0XyIgKyBtYW5nbGVkTmFtZSArICJcbiI7CiAgIH0KICAgcyArPSAiLy8gQ0hFQ0tfQUFSQ0g2NDogdGVzdF8iICsgbWFuZ2xlZE5hbWUgKyAiXG4iOwogCkBAIC0zMzE5LDEwICszMzI3LDEwIEBACiAKIC8vLyBXcml0ZSBvdXQgYWxsIGludHJpbnNpYyB0ZXN0cyBmb3IgdGhlIHNwZWNpZmllZCB0YXJnZXQsIGNoZWNraW5nCiAvLy8gZm9yIGludHJpbnNpYyB0ZXN0IHVuaXF1ZW5lc3MuCi12b2lkIE5lb25FbWl0dGVyOjpnZW5UYXJnZXRUZXN0KHJhd19vc3RyZWFtICZPUywgU3RyaW5nTWFwPE9wS2luZD4gJkVtaXR0ZWRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNBNjRHZW5UZXN0KSB7Ci0gIGlmIChpc0E2NEdlblRlc3QpCi0JT1MgPDwgIiNpZmRlZiBfX2FhcmNoNjRfX1xuIjsKK3ZvaWQgTmVvbkVtaXR0ZXI6OmdlblRhcmdldFRlc3QocmF3X29zdHJlYW0gJk9TKSB7CisgIFN0cmluZ01hcDxPcEtpbmQ+IEVtaXR0ZWRNYXA7CisgIHN0ZDo6c3RyaW5nIEN1cnJlbnRHdWFyZCA9ICIiOworICBib29sIEluR3VhcmQgPSBmYWxzZTsKIAogICBzdGQ6OnZlY3RvcjxSZWNvcmQgKj4gUlYgPSBSZWNvcmRzLmdldEFsbERlcml2ZWREZWZpbml0aW9ucygiSW5zdCIpOwogICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUlYuc2l6ZSgpOyBpICE9IGU7ICsraSkgewpAQCAtMzMzMywxMiArMzM0MSwxNyBAQAogICAgIGJvb2wgaXNTaGlmdCA9IFItPmdldFZhbHVlQXNCaXQoImlzU2hpZnQiKTsKICAgICBzdGQ6OnN0cmluZyBJbnN0TmFtZSA9IFItPmdldFZhbHVlQXNTdHJpbmcoIkluc3ROYW1lIik7CiAgICAgYm9vbCBpc0hpZGRlbkxPcCA9IFItPmdldFZhbHVlQXNCaXQoImlzSGlkZGVuTEluc3QiKTsKLSAgICBib29sIGlzQTY0ID0gUi0+Z2V0VmFsdWVBc0JpdCgiaXNBNjQiKTsKIAotICAgIC8vIGRvIG5vdCBpbmNsdWRlIEFBcmNoNjQgaW50cmluc2ljIHRlc3QgaWYgbm90IGdlbmVyYXRpbmcKLSAgICAvLyBjb2RlIGZvciBBQXJjaDY0Ci0gICAgaWYgKCFpc0E2NEdlblRlc3QgJiYgaXNBNjQpCi0gICAgICBjb250aW51ZTsKKyAgICBzdGQ6OnN0cmluZyBOZXdHdWFyZCA9IFItPmdldFZhbHVlQXNTdHJpbmcoIkFyY2hHdWFyZCIpOworICAgIGlmIChOZXdHdWFyZCAhPSBDdXJyZW50R3VhcmQpIHsKKyAgICAgIGlmIChJbkd1YXJkKQorICAgICAgICBPUyA8PCAiI2VuZGlmXG5cbiI7CisgICAgICBpZiAoTmV3R3VhcmQuc2l6ZSgpKQorICAgICAgICBPUyA8PCAiI2lmICIgPDwgTmV3R3VhcmQgPDwgJ1xuJzsKKworICAgICAgQ3VycmVudEd1YXJkID0gTmV3R3VhcmQ7CisgICAgICBJbkd1YXJkID0gTmV3R3VhcmQuc2l6ZSgpICE9IDA7CisgICAgfQogCiAgICAgU21hbGxWZWN0b3I8U3RyaW5nUmVmLCAxNj4gVHlwZVZlYzsKICAgICBQYXJzZVR5cGVzKFIsIFR5cGVzLCBUeXBlVmVjKTsKQEAgLTMzNTgsMjkgKzMzNzEsMjcgQEAKICAgICAgICAgICAodm9pZClDbGFzc2lmeVR5cGUoVHlwZVZlY1tzcmN0aV0sIGluUXVhZCwgZHVtbXksIGR1bW15KTsKICAgICAgICAgICBpZiAoc3JjdGkgPT0gdGkgfHwgaW5RdWFkICE9IG91dFF1YWQpCiAgICAgICAgICAgICBjb250aW51ZTsKLQkJICBzdGQ6OnN0cmluZyB0ZXN0RnVuY1Byb3RvOworICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3RGdW5jUHJvdG87CiAgICAgICAgICAgc3RkOjpzdHJpbmcgcyA9IEdlblRlc3QobmFtZSwgUHJvdG8sIFR5cGVWZWNbdGldLCBUeXBlVmVjW3NyY3RpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NoaWZ0LCBpc0hpZGRlbkxPcCwgY2ssIEluc3ROYW1lLCBpc0E2NCwKLQkJCQkJCQkJICB0ZXN0RnVuY1Byb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NoaWZ0LCBpc0hpZGRlbkxPcCwgY2ssIEluc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRHdWFyZC5zaXplKCksIHRlc3RGdW5jUHJvdG8pOwogICAgICAgICAgIGlmIChFbWl0dGVkTWFwLmNvdW50KHRlc3RGdW5jUHJvdG8pKQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgRW1pdHRlZE1hcFt0ZXN0RnVuY1Byb3RvXSA9IGtpbmQ7CiAgICAgICAgICAgT1MgPDwgcyA8PCAiXG4iOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewotCQlzdGQ6OnN0cmluZyB0ZXN0RnVuY1Byb3RvOwotICAgICAgICBzdGQ6OnN0cmluZyBzID0gR2VuVGVzdChuYW1lLCBQcm90bywgVHlwZVZlY1t0aV0sIFR5cGVWZWNbdGldLCBpc1NoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hpZGRlbkxPcCwgY2ssIEluc3ROYW1lLCBpc0E2NCwgdGVzdEZ1bmNQcm90byk7Ci0gICAgICAgIGlmIChFbWl0dGVkTWFwLmNvdW50KHRlc3RGdW5jUHJvdG8pKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBFbWl0dGVkTWFwW3Rlc3RGdW5jUHJvdG9dID0ga2luZDsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGVzdEZ1bmNQcm90bzsKKyAgICAgICAgc3RkOjpzdHJpbmcgcyA9CisgICAgICAgICAgICBHZW5UZXN0KG5hbWUsIFByb3RvLCBUeXBlVmVjW3RpXSwgVHlwZVZlY1t0aV0sIGlzU2hpZnQsIGlzSGlkZGVuTE9wLAorICAgICAgICAgICAgICAgICAgICBjaywgSW5zdE5hbWUsIEN1cnJlbnRHdWFyZC5zaXplKCksIHRlc3RGdW5jUHJvdG8pOwogICAgICAgICBPUyA8PCBzIDw8ICJcbiI7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgaWYgKGlzQTY0R2VuVGVzdCkKLQlPUyA8PCAiI2VuZGlmXG4iOworICBpZiAoSW5HdWFyZCkKKyAgICBPUyA8PCAiI2VuZGlmXG4iOwogfQogLy8vIHJ1blRlc3RzIC0gV3JpdGUgb3V0IGEgY29tcGxldGUgc2V0IG9mIHRlc3RzIGZvciBhbGwgb2YgdGhlIE5lb24KIC8vLyBpbnRyaW5zaWNzLgpAQCAtMzM4OSwyNSArMzQwMCwxNyBAQAogICAgICAgICAiYXBjcy1nbnVcXFxuIgogICAgICAgICAiLy8gUlVOOiAgLXRhcmdldC1jcHUgc3dpZnQgLWZmcmVlc3RhbmRpbmcgLU9zIC1TIC1vIC0gJXNcXFxuIgogICAgICAgICAiLy8gUlVOOiAgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1DSEVDS19BUk1cbiIKLQkJIlxuIgotCSAgICAiLy8gUlVOOiAlY2xhbmdfY2MxIC10cmlwbGUgYWFyY2g2NC1ub25lLWxpbnV4LWdudSBcXFxuIgotCSAgICAiLy8gUlVOIC10YXJnZXQtZmVhdHVyZSArbmVvbiAgLWZmcmVlc3RhbmRpbmcgLVMgLW8gLSAlcyBcXFxuIgotCSAgICAiLy8gUlVOOiAgfCBGaWxlQ2hlY2sgJXMgLWNoZWNrLXByZWZpeD1DSEVDS19BQVJDSDY0XG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIi8vIFJVTjogJWNsYW5nX2NjMSAtdHJpcGxlIGFhcmNoNjQtbm9uZS1saW51eC1nbnUgXFxcbiIKKyAgICAgICAgIi8vIFJVTiAtdGFyZ2V0LWZlYXR1cmUgK25lb24gIC1mZnJlZXN0YW5kaW5nIC1TIC1vIC0gJXMgXFxcbiIKKyAgICAgICAgIi8vIFJVTjogIHwgRmlsZUNoZWNrICVzIC1jaGVjay1wcmVmaXg9Q0hFQ0tfQUFSQ0g2NFxuIgogICAgICAgICAiXG4iCiAgICAgICAgICIvLyBSRVFVSVJFUzogbG9uZ190ZXN0c1xuIgogICAgICAgICAiXG4iCiAgICAgICAgICIjaW5jbHVkZSA8YXJtX25lb24uaD5cbiIKICAgICAgICAgIlxuIjsKIAotICAvLyBBUk0gdGVzdHMgbXVzdCBiZSBlbWl0dGVkIGJlZm9yZSBBQXJjaDY0IHRlc3RzIHRvIGVuc3VyZQotICAvLyB0ZXN0cyBmb3IgaW50cmluc2ljcyB0aGF0IGFyZSBjb21tb24gdG8gQVJNIGFuZCBBQXJjaDY0Ci0gIC8vIGFwcGVhciBvbmx5IG9uY2UgaW4gdGhlIG91dHB1dCBzdHJlYW0uCi0gIC8vIFRoZSBjaGVjayBmb3IgdW5pcXVlbmVzcyBpcyBkb25lIGluIGdlblRhcmdldFRlc3QuCi0gIFN0cmluZ01hcDxPcEtpbmQ+IEVtaXR0ZWRNYXA7Ci0KLSAgZ2VuVGFyZ2V0VGVzdChPUywgRW1pdHRlZE1hcCwgZmFsc2UpOwotCi0gIGdlblRhcmdldFRlc3QoT1MsIEVtaXR0ZWRNYXAsIHRydWUpOworICBnZW5UYXJnZXRUZXN0KE9TKTsKIH0KIAogbmFtZXNwYWNlIGNsYW5nIHsKZGlmZiAtLWdpdCBhL3V0aWxzL1RhYmxlR2VuL1RhYmxlR2VuLmNwcCBiL3V0aWxzL1RhYmxlR2VuL1RhYmxlR2VuLmNwcAppbmRleCAwZTQ1ZDgxLi40NDg0ZTY1IDEwMDY0NAotLS0gYS91dGlscy9UYWJsZUdlbi9UYWJsZUdlbi5jcHAKKysrIGIvdXRpbHMvVGFibGVHZW4vVGFibGVHZW4uY3BwCkBAIC0yNCwxNSArMjQsMTQgQEAKIAogZW51bSBBY3Rpb25UeXBlIHsKICAgR2VuQ2xhbmdBdHRyQ2xhc3NlcywKLSAgR2VuQ2xhbmdBdHRySWRlbnRpZmllckFyZ0xpc3QsCi0gIEdlbkNsYW5nQXR0clR5cGVBcmdMaXN0LAorICBHZW5DbGFuZ0F0dHJQYXJzZXJTdHJpbmdTd2l0Y2hlcywKICAgR2VuQ2xhbmdBdHRySW1wbCwKICAgR2VuQ2xhbmdBdHRyTGlzdCwKICAgR2VuQ2xhbmdBdHRyUENIUmVhZCwKICAgR2VuQ2xhbmdBdHRyUENIV3JpdGUsCi0gIEdlbkNsYW5nQXR0clNwZWxsaW5nTGlzdCwKKyAgR2VuQ2xhbmdBdHRySGFzQXR0cmlidXRlSW1wbCwKICAgR2VuQ2xhbmdBdHRyU3BlbGxpbmdMaXN0SW5kZXgsCi0gIEdlbkNsYW5nQXR0ckxhdGVQYXJzZWRMaXN0LAorICBHZW5DbGFuZ0F0dHJBU1RWaXNpdG9yLAogICBHZW5DbGFuZ0F0dHJUZW1wbGF0ZUluc3RhbnRpYXRlLAogICBHZW5DbGFuZ0F0dHJQYXJzZWRBdHRyTGlzdCwKICAgR2VuQ2xhbmdBdHRyUGFyc2VkQXR0ckltcGwsCkBAIC01Miw3ICs1MSw4IEBACiAgIEdlbkNsYW5nQ29tbWVudENvbW1hbmRMaXN0LAogICBHZW5Bcm1OZW9uLAogICBHZW5Bcm1OZW9uU2VtYSwKLSAgR2VuQXJtTmVvblRlc3QKKyAgR2VuQXJtTmVvblRlc3QsCisgIEdlbkF0dHJEb2NzCiB9OwogCiBuYW1lc3BhY2UgewpAQCAtNjEsMTQgKzYxLDkgQEAKICAgICBjbDo6dmFsdWVzKAogICAgICAgICBjbEVudW1WYWxOKEdlbkNsYW5nQXR0ckNsYXNzZXMsICJnZW4tY2xhbmctYXR0ci1jbGFzc2VzIiwKICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgY2xhbmcgYXR0cmlidXRlIGNsYXNlcyIpLAotICAgICAgICBjbEVudW1WYWxOKEdlbkNsYW5nQXR0cklkZW50aWZpZXJBcmdMaXN0LAotICAgICAgICAgICAgICAgICAgICJnZW4tY2xhbmctYXR0ci1pZGVudGlmaWVyLWFyZy1saXN0IiwKLSAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgYSBsaXN0IG9mIGF0dHJpYnV0ZXMgdGhhdCB0YWtlIGFuICIKLSAgICAgICAgICAgICAgICAgICAiaWRlbnRpZmllciBhcyB0aGVpciBmaXJzdCBhcmd1bWVudCIpLAotICAgICAgICBjbEVudW1WYWxOKEdlbkNsYW5nQXR0clR5cGVBcmdMaXN0LAotICAgICAgICAgICAgICAgICAgICJnZW4tY2xhbmctYXR0ci10eXBlLWFyZy1saXN0IiwKLSAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgYSBsaXN0IG9mIGF0dHJpYnV0ZXMgdGhhdCB0YWtlIGEgdHlwZSBhcyB0aGVpciAiCi0gICAgICAgICAgICAgICAgICAgImZpcnN0IGFyZ3VtZW50IiksCisgICAgICAgIGNsRW51bVZhbE4oR2VuQ2xhbmdBdHRyUGFyc2VyU3RyaW5nU3dpdGNoZXMsCisgICAgICAgICAgICAgICAgICAgImdlbi1jbGFuZy1hdHRyLXBhcnNlci1zdHJpbmctc3dpdGNoZXMiLAorICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBhbGwgcGFyc2VyLXJlbGF0ZWQgYXR0cmlidXRlIHN0cmluZyBzd2l0Y2hlcyIpLAogICAgICAgICBjbEVudW1WYWxOKEdlbkNsYW5nQXR0ckltcGwsICJnZW4tY2xhbmctYXR0ci1pbXBsIiwKICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgY2xhbmcgYXR0cmlidXRlIGltcGxlbWVudGF0aW9ucyIpLAogICAgICAgICBjbEVudW1WYWxOKEdlbkNsYW5nQXR0ckxpc3QsICJnZW4tY2xhbmctYXR0ci1saXN0IiwKQEAgLTc3LDE0ICs3MiwxNSBAQAogICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBjbGFuZyBQQ0ggYXR0cmlidXRlIHJlYWRlciIpLAogICAgICAgICBjbEVudW1WYWxOKEdlbkNsYW5nQXR0clBDSFdyaXRlLCAiZ2VuLWNsYW5nLWF0dHItcGNoLXdyaXRlIiwKICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgY2xhbmcgUENIIGF0dHJpYnV0ZSB3cml0ZXIiKSwKLSAgICAgICAgY2xFbnVtVmFsTihHZW5DbGFuZ0F0dHJTcGVsbGluZ0xpc3QsICJnZW4tY2xhbmctYXR0ci1zcGVsbGluZy1saXN0IiwKKyAgICAgICAgY2xFbnVtVmFsTihHZW5DbGFuZ0F0dHJIYXNBdHRyaWJ1dGVJbXBsLAorICAgICAgICAgICAgICAgICAgICJnZW4tY2xhbmctYXR0ci1oYXMtYXR0cmlidXRlLWltcGwiLAogICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBhIGNsYW5nIGF0dHJpYnV0ZSBzcGVsbGluZyBsaXN0IiksCiAgICAgICAgIGNsRW51bVZhbE4oR2VuQ2xhbmdBdHRyU3BlbGxpbmdMaXN0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgImdlbi1jbGFuZy1hdHRyLXNwZWxsaW5nLWluZGV4IiwKICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgYSBjbGFuZyBhdHRyaWJ1dGUgc3BlbGxpbmcgaW5kZXgiKSwKLSAgICAgICAgY2xFbnVtVmFsTihHZW5DbGFuZ0F0dHJMYXRlUGFyc2VkTGlzdCwKLSAgICAgICAgICAgICAgICAgICAiZ2VuLWNsYW5nLWF0dHItbGF0ZS1wYXJzZWQtbGlzdCIsCi0gICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIGEgY2xhbmcgYXR0cmlidXRlIExhdGVQYXJzZWQgbGlzdCIpLAorICAgICAgICBjbEVudW1WYWxOKEdlbkNsYW5nQXR0ckFTVFZpc2l0b3IsCisgICAgICAgICAgICAgICAgICAgImdlbi1jbGFuZy1hdHRyLWFzdC12aXNpdG9yIiwKKyAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgYSByZWN1cnNpdmUgQVNUIHZpc2l0b3IgZm9yIGNsYW5nIGF0dHJpYnV0ZXMiKSwKICAgICAgICAgY2xFbnVtVmFsTihHZW5DbGFuZ0F0dHJUZW1wbGF0ZUluc3RhbnRpYXRlLAogICAgICAgICAgICAgICAgICAgICJnZW4tY2xhbmctYXR0ci10ZW1wbGF0ZS1pbnN0YW50aWF0ZSIsCiAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIGEgY2xhbmcgdGVtcGxhdGUgaW5zdGFudGlhdGUgY29kZSIpLApAQCAtMTM1LDYgKzEzMSw4IEBACiAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIEFSTSBORU9OIHNlbWEgc3VwcG9ydCBmb3IgY2xhbmciKSwKICAgICAgICAgY2xFbnVtVmFsTihHZW5Bcm1OZW9uVGVzdCwgImdlbi1hcm0tbmVvbi10ZXN0IiwKICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgQVJNIE5FT04gdGVzdHMgZm9yIGNsYW5nIiksCisgICAgICAgIGNsRW51bVZhbE4oR2VuQXR0ckRvY3MsICJnZW4tYXR0ci1kb2NzIiwKKyAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgYXR0cmlidXRlIGRvY3VtZW50YXRpb24iKSwKICAgICAgICAgY2xFbnVtVmFsRW5kKSk7CiAKIGNsOjpvcHQ8c3RkOjpzdHJpbmc+CkBAIC0xNDcsMTEgKzE0NSw4IEBACiAgIGNhc2UgR2VuQ2xhbmdBdHRyQ2xhc3NlczoKICAgICBFbWl0Q2xhbmdBdHRyQ2xhc3MoUmVjb3JkcywgT1MpOwogICAgIGJyZWFrOwotICBjYXNlIEdlbkNsYW5nQXR0cklkZW50aWZpZXJBcmdMaXN0OgotICAgIEVtaXRDbGFuZ0F0dHJJZGVudGlmaWVyQXJnTGlzdChSZWNvcmRzLCBPUyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgR2VuQ2xhbmdBdHRyVHlwZUFyZ0xpc3Q6Ci0gICAgRW1pdENsYW5nQXR0clR5cGVBcmdMaXN0KFJlY29yZHMsIE9TKTsKKyAgY2FzZSBHZW5DbGFuZ0F0dHJQYXJzZXJTdHJpbmdTd2l0Y2hlczoKKyAgICBFbWl0Q2xhbmdBdHRyUGFyc2VyU3RyaW5nU3dpdGNoZXMoUmVjb3JkcywgT1MpOwogICAgIGJyZWFrOwogICBjYXNlIEdlbkNsYW5nQXR0ckltcGw6CiAgICAgRW1pdENsYW5nQXR0ckltcGwoUmVjb3JkcywgT1MpOwpAQCAtMTY1LDE0ICsxNjAsMTQgQEAKICAgY2FzZSBHZW5DbGFuZ0F0dHJQQ0hXcml0ZToKICAgICBFbWl0Q2xhbmdBdHRyUENIV3JpdGUoUmVjb3JkcywgT1MpOwogICAgIGJyZWFrOwotICBjYXNlIEdlbkNsYW5nQXR0clNwZWxsaW5nTGlzdDoKLSAgICBFbWl0Q2xhbmdBdHRyU3BlbGxpbmdMaXN0KFJlY29yZHMsIE9TKTsKKyAgY2FzZSBHZW5DbGFuZ0F0dHJIYXNBdHRyaWJ1dGVJbXBsOgorICAgIEVtaXRDbGFuZ0F0dHJIYXNBdHRySW1wbChSZWNvcmRzLCBPUyk7CiAgICAgYnJlYWs7CiAgIGNhc2UgR2VuQ2xhbmdBdHRyU3BlbGxpbmdMaXN0SW5kZXg6CiAgICAgRW1pdENsYW5nQXR0clNwZWxsaW5nTGlzdEluZGV4KFJlY29yZHMsIE9TKTsKICAgICBicmVhazsKLSAgY2FzZSBHZW5DbGFuZ0F0dHJMYXRlUGFyc2VkTGlzdDoKLSAgICBFbWl0Q2xhbmdBdHRyTGF0ZVBhcnNlZExpc3QoUmVjb3JkcywgT1MpOworICBjYXNlIEdlbkNsYW5nQXR0ckFTVFZpc2l0b3I6CisgICAgRW1pdENsYW5nQXR0ckFTVFZpc2l0b3IoUmVjb3JkcywgT1MpOwogICAgIGJyZWFrOwogICBjYXNlIEdlbkNsYW5nQXR0clRlbXBsYXRlSW5zdGFudGlhdGU6CiAgICAgRW1pdENsYW5nQXR0clRlbXBsYXRlSW5zdGFudGlhdGUoUmVjb3JkcywgT1MpOwpAQCAtMjM1LDYgKzIzMCw5IEBACiAgIGNhc2UgR2VuQXJtTmVvblRlc3Q6CiAgICAgRW1pdE5lb25UZXN0KFJlY29yZHMsIE9TKTsKICAgICBicmVhazsKKyAgY2FzZSBHZW5BdHRyRG9jczoKKyAgICBFbWl0Q2xhbmdBdHRyRG9jcyhSZWNvcmRzLCBPUyk7CisgICAgYnJlYWs7CiAgIH0KIAogICByZXR1cm4gZmFsc2U7CkBAIC0yNDgsMyArMjQ2LDEyIEBACiAKICAgcmV0dXJuIFRhYmxlR2VuTWFpbihhcmd2WzBdLCAmQ2xhbmdUYWJsZUdlbk1haW4pOwogfQorCisjaWZkZWYgX19oYXNfZmVhdHVyZQorI2lmIF9faGFzX2ZlYXR1cmUoYWRkcmVzc19zYW5pdGl6ZXIpCisjaW5jbHVkZSA8c2FuaXRpemVyL2xzYW5faW50ZXJmYWNlLmg+CisvLyBEaXNhYmxlIExlYWtTYW5pdGl6ZXIgZm9yIHRoaXMgYmluYXJ5IGFzIGl0IGhhcyB0b28gbWFueSBsZWFrcyB0aGF0IGFyZSBub3QKKy8vIHZlcnkgaW50ZXJlc3RpbmcgdG8gZml4LiBTZWUgY29tcGlsZXItcnQvaW5jbHVkZS9zYW5pdGl6ZXIvbHNhbl9pbnRlcmZhY2UuaCAuCitpbnQgX19sc2FuX2lzX3R1cm5lZF9vZmYoKSB7IHJldHVybiAxOyB9CisjZW5kaWYgIC8vIF9faGFzX2ZlYXR1cmUoYWRkcmVzc19zYW5pdGl6ZXIpCisjZW5kaWYgIC8vIGRlZmluZWQoX19oYXNfZmVhdHVyZSkKZGlmZiAtLWdpdCBhL3V0aWxzL1RhYmxlR2VuL1RhYmxlR2VuQmFja2VuZHMuaCBiL3V0aWxzL1RhYmxlR2VuL1RhYmxlR2VuQmFja2VuZHMuaAppbmRleCA4OTA0Mjg3Li43ZTA1NDk2IDEwMDY0NAotLS0gYS91dGlscy9UYWJsZUdlbi9UYWJsZUdlbkJhY2tlbmRzLmgKKysrIGIvdXRpbHMvVGFibGVHZW4vVGFibGVHZW5CYWNrZW5kcy5oCkBAIC0yOSwxNiArMjksMTUgQEAKIHZvaWQgRW1pdENsYW5nQVNUTm9kZXMoUmVjb3JkS2VlcGVyICZSSywgcmF3X29zdHJlYW0gJk9TLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTiwgY29uc3Qgc3RkOjpzdHJpbmcgJlMpOwogCit2b2lkIEVtaXRDbGFuZ0F0dHJQYXJzZXJTdHJpbmdTd2l0Y2hlcyhSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUyk7CiB2b2lkIEVtaXRDbGFuZ0F0dHJDbGFzcyhSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUyk7Ci12b2lkIEVtaXRDbGFuZ0F0dHJJZGVudGlmaWVyQXJnTGlzdChSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUyk7Ci12b2lkIEVtaXRDbGFuZ0F0dHJUeXBlQXJnTGlzdChSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUyk7CiB2b2lkIEVtaXRDbGFuZ0F0dHJJbXBsKFJlY29yZEtlZXBlciAmUmVjb3JkcywgcmF3X29zdHJlYW0gJk9TKTsKIHZvaWQgRW1pdENsYW5nQXR0ckxpc3QoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpOwogdm9pZCBFbWl0Q2xhbmdBdHRyUENIUmVhZChSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUyk7CiB2b2lkIEVtaXRDbGFuZ0F0dHJQQ0hXcml0ZShSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUyk7Ci12b2lkIEVtaXRDbGFuZ0F0dHJTcGVsbGluZ0xpc3QoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpOwordm9pZCBFbWl0Q2xhbmdBdHRySGFzQXR0ckltcGwoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpOwogdm9pZCBFbWl0Q2xhbmdBdHRyU3BlbGxpbmdMaXN0SW5kZXgoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpOwotdm9pZCBFbWl0Q2xhbmdBdHRyTGF0ZVBhcnNlZExpc3QoUmVjb3JkS2VlcGVyICZSZWNvcmRzLCByYXdfb3N0cmVhbSAmT1MpOwordm9pZCBFbWl0Q2xhbmdBdHRyQVNUVmlzaXRvcihSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUyk7CiB2b2lkIEVtaXRDbGFuZ0F0dHJUZW1wbGF0ZUluc3RhbnRpYXRlKFJlY29yZEtlZXBlciAmUmVjb3JkcywgcmF3X29zdHJlYW0gJk9TKTsKIHZvaWQgRW1pdENsYW5nQXR0clBhcnNlZEF0dHJMaXN0KFJlY29yZEtlZXBlciAmUmVjb3JkcywgcmF3X29zdHJlYW0gJk9TKTsKIHZvaWQgRW1pdENsYW5nQXR0clBhcnNlZEF0dHJJbXBsKFJlY29yZEtlZXBlciAmUmVjb3JkcywgcmF3X29zdHJlYW0gJk9TKTsKQEAgLTYzLDQgKzYyLDYgQEAKIHZvaWQgRW1pdE5lb25TZW1hKFJlY29yZEtlZXBlciAmUmVjb3JkcywgcmF3X29zdHJlYW0gJk9TKTsKIHZvaWQgRW1pdE5lb25UZXN0KFJlY29yZEtlZXBlciAmUmVjb3JkcywgcmF3X29zdHJlYW0gJk9TKTsKIAordm9pZCBFbWl0Q2xhbmdBdHRyRG9jcyhSZWNvcmRLZWVwZXIgJlJlY29yZHMsIHJhd19vc3RyZWFtICZPUyk7CisKIH0gLy8gZW5kIG5hbWVzcGFjZSBjbGFuZwpkaWZmIC0tZ2l0IGEvdXRpbHMvYW5hbHl6ZXIvU0FUZXN0QnVpbGQucHkgYi91dGlscy9hbmFseXplci9TQVRlc3RCdWlsZC5weQppbmRleCA1MWJjNmUyLi40NDEwMzJlIDEwMDc1NQotLS0gYS91dGlscy9hbmFseXplci9TQVRlc3RCdWlsZC5weQorKysgYi91dGlscy9hbmFseXplci9TQVRlc3RCdWlsZC5weQpAQCAtMTY4LDcgKzE2OCw3IEBACiBTQk91dHB1dERpclJlZmVyZW5jZVByZWZpeCA9ICJSZWYiCiAKICMgVGhlIGxpc3Qgb2YgY2hlY2tlcnMgdXNlZCBkdXJpbmcgYW5hbHl6ZXMuCi0jIEN1cnJlbnRseSwgY29uc2lzdHMgb2YgYWxsIHRoZSBub24gZXhwZXJpbWVudGFsIGNoZWNrZXJzLCBwbHVzIGEgZmV3IGFscGhhCisjIEN1cnJlbnRseSwgY29uc2lzdHMgb2YgYWxsIHRoZSBub24tZXhwZXJpbWVudGFsIGNoZWNrZXJzLCBwbHVzIGEgZmV3IGFscGhhCiAjIGNoZWNrZXJzIHdlIGRvbid0IHdhbnQgdG8gcmVncmVzcyBvbi4KIENoZWNrZXJzPSJhbHBoYS51bml4LlNpbXBsZVN0cmVhbSxhbHBoYS5zZWN1cml0eS50YWludCxhbHBoYS5jcGx1c3BsdXMuTmV3RGVsZXRlTGVha3MsY29yZSxjcGx1c3BsdXMsZGVhZGNvZGUsc2VjdXJpdHksdW5peCxvc3giCiAKQEAgLTM2Myw3ICszNjMsNyBAQAogICAgIGlmIFRvdGFsRmFpbGVkID09IDA6CiAgICAgICAgIENsZWFuVXBFbXB0eVBsaXN0cyhTQk91dHB1dERpcikKICAgICAgICAgUGxpc3RzID0gZ2xvYi5nbG9iKFNCT3V0cHV0RGlyICsgIi8qLyoucGxpc3QiKQotICAgICAgICBwcmludCAiTnVtYmVyIG9mIGJ1ZyByZXBvcnRzIChub24gZW1wdHkgcGxpc3QgZmlsZXMpIHByb2R1Y2VkOiAlZCIgJVwKKyAgICAgICAgcHJpbnQgIk51bWJlciBvZiBidWcgcmVwb3J0cyAobm9uLWVtcHR5IHBsaXN0IGZpbGVzKSBwcm9kdWNlZDogJWQiICVcCiAgICAgICAgICAgIGxlbihQbGlzdHMpCiAgICAgICAgIHJldHVybjsKICAgICAKZGlmZiAtLWdpdCBhL3V0aWxzL2NsYW5nLm5hdHZpcyBiL3V0aWxzL2NsYW5nLm5hdHZpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjk1NmYxCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbHMvY2xhbmcubmF0dmlzCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPCEtLQ0KK1Zpc3VhbCBTdHVkaW8gMjAxMiBOYXRpdmUgRGVidWdnaW5nIFZpc3VhbGl6ZXJzIGZvciBMTFZNDQorDQorUHV0IHRoaXMgZmlsZSBpbnRvICIlVVNFUlBST0ZJTEUlXERvY3VtZW50c1xWaXN1YWwgU3R1ZGlvIDIwMTJcVmlzdWFsaXplcnMiDQorb3IgY3JlYXRlIGEgc3ltYm9saWMgbGluayBzbyBpdCB1cGRhdGVzIGF1dG9tYXRpY2FsbHkuDQorLS0+DQorPEF1dG9WaXN1YWxpemVyIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3ZzdHVkaW8vZGVidWdnZXIvbmF0dmlzLzIwMTAiPg0KKyAgPFR5cGUgTmFtZT0iY2xhbmc6OklkZW50aWZpZXJJbmZvIj4NCisgICAgPERpc3BsYXlTdHJpbmcgQ29uZGl0aW9uPSJFbnRyeSAhPSAwIj4oeygobGx2bTo6U3RyaW5nTWFwRW50cnkmbHQ7Y2xhbmc6OklkZW50aWZpZXJJbmZvIComZ3Q7KilFbnRyeSkrMSxzfSk8L0Rpc3BsYXlTdHJpbmc+DQorICAgIDxFeHBhbmQ+DQorICAgICAgPEl0ZW0gQ29uZGl0aW9uPSJFbnRyeSAhPSAwIiBOYW1lPSJbSWRlbnRpZmllcl0iPigobGx2bTo6U3RyaW5nTWFwRW50cnkmbHQ7Y2xhbmc6OklkZW50aWZpZXJJbmZvIComZ3Q7KilFbnRyeSkrMSxzPC9JdGVtPg0KKyAgICAgIDxJdGVtIE5hbWU9IlRva2VuIEtpbmQiPihjbGFuZzo6dG9rOjpUb2tlbktpbmQpVG9rZW5JRDwvSXRlbT4NCisgICAgPC9FeHBhbmQ+DQorICA8L1R5cGU+DQorICA8VHlwZSBOYW1lPSJjbGFuZzo6RGVjbGFyYXRpb25OYW1lIj4NCisgICAgPERpc3BsYXlTdHJpbmcgQ29uZGl0aW9uPSJQdHIgPT0gMCI+RW1wdHk8L0Rpc3BsYXlTdHJpbmc+DQorICAgIDxEaXNwbGF5U3RyaW5nIENvbmRpdGlvbj0iKFB0ciAmYW1wOyBQdHJNYXNrKSA9PSBTdG9yZWRJZGVudGlmaWVyIj57e0lkZW50aWZpZXIgKHsoY2xhbmc6OklkZW50aWZpZXJJbmZvICopKFB0ciAmYW1wOyB+UHRyTWFzayl9KX19PC9EaXNwbGF5U3RyaW5nPg0KKyAgICA8RGlzcGxheVN0cmluZyBDb25kaXRpb249IihQdHIgJmFtcDsgUHRyTWFzaykgPT0gU3RvcmVkT2JqQ1plcm9BcmdTZWxlY3RvciI+e3tPYmpDIFplcm8gQXJnIFNlbGVjdG9yICh7KGNsYW5nOjpJZGVudGlmaWVySW5mbyAqKShQdHIgJmFtcDsgflB0ck1hc2spfSl9fTwvRGlzcGxheVN0cmluZz4NCisgICAgPERpc3BsYXlTdHJpbmcgQ29uZGl0aW9uPSIoUHRyICZhbXA7IFB0ck1hc2spID09IFN0b3JlZE9iakNPbmVBcmdTZWxlY3RvciI+e3tPYmpDIE9uZSBBcmcgU2VsZWN0b3IgKHsoY2xhbmc6OklkZW50aWZpZXJJbmZvICopKFB0ciAmYW1wOyB+UHRyTWFzayl9KX19PC9EaXNwbGF5U3RyaW5nPg0KKyAgICA8RGlzcGxheVN0cmluZyBDb25kaXRpb249IihQdHIgJmFtcDsgUHRyTWFzaykgPT0gU3RvcmVkRGVjbGFyYXRpb25OYW1lRXh0cmEiPnt7RXh0cmEgKHsoY2xhbmc6OkRlY2xhcmF0aW9uTmFtZUV4dHJhOjpFeHRyYUtpbmQpKChjbGFuZzo6RGVjbGFyYXRpb25OYW1lRXh0cmEgKikoUHRyICZhbXA7IH5QdHJNYXNrKSktJmd0O0V4dHJhS2luZE9yTnVtQXJnc30pfX08L0Rpc3BsYXlTdHJpbmc+DQorICAgIDxFeHBhbmQ+DQorICAgICAgPEl0ZW0gQ29uZGl0aW9uPSIoUHRyICZhbXA7IFB0ck1hc2spID09IFN0b3JlZElkZW50aWZpZXIiIE5hbWU9IltJZGVudGlmaWVyXSI+KGNsYW5nOjpJZGVudGlmaWVySW5mbyAqKShQdHIgJmFtcDsgflB0ck1hc2spPC9JdGVtPg0KKyAgICAgIDxJdGVtIENvbmRpdGlvbj0iKFB0ciAmYW1wOyBQdHJNYXNrKSA9PSBTdG9yZWRPYmpDWmVyb0FyZ1NlbGVjdG9yIiBOYW1lPSJbT2JqQyBaZXJvIEFyZyBTZWxlY3Rvcl0iPihjbGFuZzo6SWRlbnRpZmllckluZm8gKikoUHRyICZhbXA7IH5QdHJNYXNrKTwvSXRlbT4NCisgICAgICA8SXRlbSBDb25kaXRpb249IihQdHIgJmFtcDsgUHRyTWFzaykgPT0gU3RvcmVkT2JqQ09uZUFyZ1NlbGVjdG9yIiBOYW1lPSJbT2JqQyBPbmUgQXJnIFNlbGVjdG9yXSI+KGNsYW5nOjpJZGVudGlmaWVySW5mbyAqKShQdHIgJmFtcDsgflB0ck1hc2spPC9JdGVtPg0KKyAgICAgIDxJdGVtIENvbmRpdGlvbj0iKFB0ciAmYW1wOyBQdHJNYXNrKSA9PSBTdG9yZWREZWNsYXJhdGlvbk5hbWVFeHRyYSIgTmFtZT0iW0V4dHJhXSI+KGNsYW5nOjpEZWNsYXJhdGlvbk5hbWVFeHRyYTo6RXh0cmFLaW5kKSgoY2xhbmc6OkRlY2xhcmF0aW9uTmFtZUV4dHJhICopKFB0ciAmYW1wOyB+UHRyTWFzaykpLSZndDtFeHRyYUtpbmRPck51bUFyZ3M8L0l0ZW0+DQorICAgIDwvRXhwYW5kPg0KKyAgPC9UeXBlPg0KKyAgPFR5cGUgTmFtZT0iY2xhbmc6OlRva2VuIj4NCisgICAgPERpc3BsYXlTdHJpbmc+eyhjbGFuZzo6dG9rOjpUb2tlbktpbmQpS2luZH08L0Rpc3BsYXlTdHJpbmc+DQorICA8L1R5cGU+DQorICA8VHlwZSBOYW1lPSJjbGFuZzo6RGVjbFNwZWMiPg0KKyAgICA8RGlzcGxheVN0cmluZz5beyhjbGFuZzo6RGVjbFNwZWM6OlNDUylTdG9yYWdlQ2xhc3NTcGVjfV0sIFt7KGNsYW5nOjpUeXBlU3BlY2lmaWVyVHlwZSlUeXBlU3BlY1R5cGV9XTwvRGlzcGxheVN0cmluZz4NCisgIDwvVHlwZT4NCisgIDxUeXBlIE5hbWU9ImNsYW5nOjpQcmFnbWFIYW5kbGVyIj4NCisgICAgPERpc3BsYXlTdHJpbmc+e05hbWUsc308L0Rpc3BsYXlTdHJpbmc+DQorICA8L1R5cGU+DQorICA8VHlwZSBOYW1lPSJjbGFuZzo6RmlsZUVudHJ5Ij4NCisgICAgPERpc3BsYXlTdHJpbmc+e05hbWUsc308L0Rpc3BsYXlTdHJpbmc+DQorICA8L1R5cGU+DQorICA8VHlwZSBOYW1lPSJjbGFuZzo6RGlyZWN0b3J5RW50cnkiPg0KKyAgICA8RGlzcGxheVN0cmluZz57TmFtZSxzfTwvRGlzcGxheVN0cmluZz4NCisgIDwvVHlwZT4NCis8L0F1dG9WaXN1YWxpemVyPg0KZGlmZiAtLWdpdCBhL3V0aWxzL2NsYW5nVmlzdWFsaXplcnMudHh0IGIvdXRpbHMvY2xhbmdWaXN1YWxpemVycy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMTliOWMuLjAwMDAwMDAKLS0tIGEvdXRpbHMvY2xhbmdWaXN1YWxpemVycy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotCi1bVmlzdWFsaXplcl0KLQotbGx2bTo6U21hbGxWZWN0b3I8KiwqPnsKLQlwcmV2aWV3ICgKLQkJI2lmICgoKCRUMSopJGUuRW5kWCAtICgkVDEqKSRlLkJlZ2luWCkgPT0gMCkgKCAiZW1wdHkiICkKLQkJI2Vsc2UgKAotCQkJIygKLQkJCQkiWyIsCi0JCQkJKCRUMSopJGUuRW5kWCAtICgkVDEqKSRlLkJlZ2luWCwKLQkJCQkiXSgiLAotCQkJCSNhcnJheSgKLQkJCQkJZXhwcjogKCgkVDEqKSRlLkJlZ2luWClbJGldLAotCQkJCQlzaXplOiAoJFQxKikkZS5FbmRYIC0gKCRUMSopJGUuQmVnaW5YCi0JCQkJKSwKLQkJCQkiKSIKLQkJCSkKLQkJKQotCSkKLQotCWNoaWxkcmVuICgKLQkJIygKLQkJCSMoW3NpemVdIDogKCRUMSopJGUuRW5kWCAtICgkVDEqKSRlLkJlZ2luWCksCi0JCQkjKFtjYXBhY2l0eV0gOiAoJFQxKikkZS5DYXBhY2l0eVggLSAoJFQxKikkZS5CZWdpblgpLAotCQkJI2FycmF5KAotCQkJCWV4cHI6ICgoJFQxKikkZS5CZWdpblgpWyRpXSwKLQkJCQlzaXplOiAoJFQxKikkZS5FbmRYIC0gKCRUMSopJGUuQmVnaW5YCi0JCQkpCi0JCSkKLQkpCi19Ci0KLWxsdm06OlNtYWxsVmVjdG9ySW1wbDwqPnsKLQlwcmV2aWV3ICgKLQkJI2lmICgoKCRUMSopJGUuRW5kWCAtICgkVDEqKSRlLkJlZ2luWCkgPT0gMCkgKCAiZW1wdHkiICkKLQkJI2Vsc2UgKAotCQkJIygKLQkJCQkiWyIsCi0JCQkJKCRUMSopJGUuRW5kWCAtICgkVDEqKSRlLkJlZ2luWCwKLQkJCQkiXSgiLAotCQkJCSNhcnJheSgKLQkJCQkJZXhwcjogKCgkVDEqKSRlLkJlZ2luWClbJGldLAotCQkJCQlzaXplOiAoJFQxKikkZS5FbmRYIC0gKCRUMSopJGUuQmVnaW5YCi0JCQkJKSwKLQkJCQkiKSIKLQkJCSkKLQkJKQotCSkKLQotCWNoaWxkcmVuICgKLQkJIygKLQkJCSMoW3NpemVdIDogKCRUMSopJGUuRW5kWCAtICgkVDEqKSRlLkJlZ2luWCksCi0JCQkjKFtjYXBhY2l0eV0gOiAoJFQxKikkZS5DYXBhY2l0eVggLSAoJFQxKikkZS5CZWdpblgpLAotCQkJI2FycmF5KAotCQkJCWV4cHI6ICgoJFQxKikkZS5CZWdpblgpWyRpXSwKLQkJCQlzaXplOiAoJFQxKikkZS5FbmRYIC0gKCRUMSopJGUuQmVnaW5YCi0JCQkpCi0JCSkKLQkpCi19Ci0KLWxsdm06OlNtYWxsU3RyaW5nPCo+ewotCXByZXZpZXcgKFskZS5CZWdpblgsc10pCi0Jc3RyaW5ndmlldyAoWyRlLkJlZ2luWCxzYl0pCi19Ci0KLWxsdm06OlN0cmluZ1JlZnsKLQlwcmV2aWV3IChbJGUuRGF0YSxzXSkKLQlzdHJpbmd2aWV3IChbJGUuRGF0YSxzYl0pCi0KLQljaGlsZHJlbiAoCi0JCSMoCi0JCQkjKFtzaXplXSA6ICRlLkxlbmd0aCksCi0JCQkjYXJyYXkoZXhwcjogJGUuRGF0YVskaV0sIHNpemU6ICRlLkxlbmd0aCkKLQkJKQotCSkKLX0KLQotY2xhbmc6OlRva2VuewotCXByZXZpZXcoKGNsYW5nOjp0b2s6OlRva2VuS2luZCkoaW50KSRlLktpbmQpCi19Ci0KLWxsdm06OlBvaW50ZXJJbnRQYWlyPCosKiwqLCo+ewotCXByZXZpZXcgKAotCQkjKAotCQkJKCRUMSopKCRlLlZhbHVlICYgJGUuUG9pbnRlckJpdE1hc2spLAotCQkJIiBbIiwKLQkJCSgkVDMpKCgkZS5WYWx1ZSA+PiAkZS5JbnRTaGlmdCkgJiAkZS5JbnRNYXNrKSwKLQkJCSJdIgotCQkpCi0JKQotCQotCWNoaWxkcmVuICgKLQkJIygKLQkJCSMoW3JhdyBtZW1iZXJzXSA6IFskZSwhXSksCi0JCQkjKFtwdHJdIDogKCRUMSopKCRlLlZhbHVlICYgJGUuUG9pbnRlckJpdE1hc2spKSwKLQkJCSMoW2ludF0gOiAoJFQzKSgkZS5WYWx1ZSA+PiAkZS5JbnRTaGlmdCkgJiAkZS5JbnRNYXNrKQotCQkpCi0JKQotfQotCi1sbHZtOjpQb2ludGVyVW5pb248KiwqPnsKLQlwcmV2aWV3ICgKLQkJI2lmICgoKCRlLlZhbC5WYWx1ZSA+PiAkZS5WYWwuSW50U2hpZnQpICYgJGUuVmFsLkludE1hc2spID09IDApICggIlBUMSIgKQotCQkjZWxzZSAoICJQVDIiICkKLQkpCi0JCi0JY2hpbGRyZW4gKAotCQkjKAotCQkJIyhbcmF3IG1lbWJlcnNdIDogWyRlLCFdKSwKLQkJCSNpZiAoKCgkZS5WYWwuVmFsdWUgPj4gJGUuVmFsLkludFNoaWZ0KSAmICRlLlZhbC5JbnRNYXNrKSA9PSAwKSAoCi0JCQkJIyhbcHRyXSA6ICgkVDEpKCRlLlZhbC5WYWx1ZSAmICRlLlZhbC5Qb2ludGVyQml0TWFzaykpCi0JCQkpICNlbHNlICgKLQkJCQkjKFtwdHJdIDogKCRUMikoJGUuVmFsLlZhbHVlICYgJGUuVmFsLlBvaW50ZXJCaXRNYXNrKSkKLQkJCSkKLQkJKQotCSkKLX0KLQotbGx2bTo6UG9pbnRlclVuaW9uMzwqLCosKj57Ci0JcHJldmlldyAoCi0JCSNpZiAoKCRlLlZhbC5WYWwuVmFsdWUgJiAweDIpID09IDIpICggIlBUMiIgKQotCQkjZWxpZiAoKCRlLlZhbC5WYWwuVmFsdWUgJiAweDEpID09IDEpICggIlBUMyIgKQotCQkjZWxzZSAoICJQVDEiICkKLQkpCi0JCi0JY2hpbGRyZW4gKAotCQkjKAotCQkJI2lmICgoJGUuVmFsLlZhbC5WYWx1ZSAmIDB4MikgPT0gMikgKAotCQkJCSMoW3B0cl0gOiAoJFQyKSgoJGUuVmFsLlZhbC5WYWx1ZSA+PiAyKSA8PCAyKSkKLQkJCSkgI2VsaWYgKCgkZS5WYWwuVmFsLlZhbHVlICYgMHgxKSA9PSAxKSAoCi0JCQkJIyhbcHRyXSA6ICgkVDMpKCgkZS5WYWwuVmFsLlZhbHVlID4+IDIpIDw8IDIpKQotCQkJKSAjZWxzZSAoCi0JCQkJIyhbcHRyXSA6ICgkVDEpKCgkZS5WYWwuVmFsLlZhbHVlID4+IDIpIDw8IDIpKQotCQkJKQotCQkpCi0JKQotfQotCi1sbHZtOjpQb2ludGVyVW5pb240PCosKiwqLCo+ewotCXByZXZpZXcgKAotCQkjaWYgKCgkZS5WYWwuVmFsLlZhbHVlICYgMHgzKSA9PSAzKSAoICJQVDQiICkKLQkJI2VsaWYgKCgkZS5WYWwuVmFsLlZhbHVlICYgMHgyKSA9PSAyKSAoICJQVDIiICkKLQkJI2VsaWYgKCgkZS5WYWwuVmFsLlZhbHVlICYgMHgxKSA9PSAxKSAoICJQVDMiICkKLQkJI2Vsc2UgKCAiUFQxIiApCi0JKQotCQotCWNoaWxkcmVuICgKLQkJIygKLQkJCSNpZiAoKCRlLlZhbC5WYWwuVmFsdWUgJiAweDMpID09IDMpICgKLQkJCQkjKFtwdHJdIDogKCRUNCkoKCRlLlZhbC5WYWwuVmFsdWUgPj4gMikgPDwgMikpCi0JCQkpICNlbGlmICgoJGUuVmFsLlZhbC5WYWx1ZSAmIDB4MikgPT0gMikgKAotCQkJCSMoW3B0cl0gOiAoJFQyKSgoJGUuVmFsLlZhbC5WYWx1ZSA+PiAyKSA8PCAyKSkKLQkJCSkgI2VsaWYgKCgkZS5WYWwuVmFsLlZhbHVlICYgMHgxKSA9PSAxKSAoCi0JCQkJIyhbcHRyXSA6ICgkVDMpKCgkZS5WYWwuVmFsLlZhbHVlID4+IDIpIDw8IDIpKQotCQkJKSAjZWxzZSAoCi0JCQkJIyhbcHRyXSA6ICgkVDEpKCgkZS5WYWwuVmFsLlZhbHVlID4+IDIpIDw8IDIpKQotCQkJKQotCQkpCi0JKQotfQotCi1sbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8Kj57Ci0JcHJldmlldyAoCi0JCSNpZiAoJGUuT2JqID09IDApICggImVtcHR5IiApCi0JCSNlbHNlICgKLQkJCSMoCi0JCQkJIltSZWZDbnQ9IiwgJGUuT2JqLT5yZWZfY250LAotCQkJCSIsICIsCi0JCQkJIk9iaj0iLCAkZS5PYmosCi0JCQkJIl0iCi0JCQkpCi0JCSkKLQkpCi0KLQljaGlsZHJlbiAoCi0JCSNpZiAoJGUuT2JqID09IDApICggI2FycmF5KGV4cHI6IDAsIHNpemU6IDApICkKLQkJI2Vsc2UgKAotCQkJIygKLQkJCQkjKFJlZkNudCA6ICRlLk9iai0+cmVmX2NudCksCi0JCQkJIyhPYmogOiAkZS5PYmopCi0JCQkpCi0JCSkKLQkpCi19Ci0KLWxsdm06Ok93bmluZ1B0cjwqPnsKLQlwcmV2aWV3ICgKLQkJI2lmICgkZS5QdHIgPT0gMCkgKCAiZW1wdHkiICkKLQkJI2Vsc2UgKCAkZS5QdHIgKQotCSkKLQotCWNoaWxkcmVuICgKLQkJI2lmICgkZS5QdHIgPT0gMCkgKCAjYXJyYXkoZXhwcjogMCwgc2l6ZTogMCkgKQotCQkjZWxzZSAoICMoUHRyIDogJGUuUHRyKSApCi0JKQkKLX0KLQotbGx2bTo6U21hbGxQdHJTZXQ8KiwqPnsKLQlwcmV2aWV3ICgKLQkJIygKLQkJCSNpZiAoKCRlLkN1ckFycmF5KSA9PSAoJGUuU21hbGxBcnJheSkpICggIltTbWFsbCBNb2RlXSAiICkKLQkJCSNlbHNlICggIltCaWcgTW9kZV0gIiApLAotCQkJIk51bUVsZW1lbnRzPSIsICRlLk51bUVsZW1lbnRzLAotCQkJIiBDdXJBcnJheVNpemU9IiwgJGUuQ3VyQXJyYXlTaXplCi0JCSkKLQkpCi0KLQljaGlsZHJlbiAoCi0JCSMoCi0JCQkjKFtyYXcgbWVtYmVyc10gOiBbJGMsIV0pLAotCQkJIyhOdW1FbGVtZW50cyA6ICRlLk51bUVsZW1lbnRzKSwKLQkJCSMoQ3VyQXJyYXlTaXplIDogJGUuQ3VyQXJyYXlTaXplKSwKLQkJCSNhcnJheSgKLQkJCQlleHByOiAkZS5DdXJBcnJheVskaV0sCi0JCQkJc2l6ZTogJGUuQ3VyQXJyYXlTaXplICsgMQotCQkJKSA6ICgkVDEqKSYkZQotCQkpCi0JKQotfQotCi1sbHZtOjpEZW5zZU1hcDwqLCosKj57Ci0JcHJldmlldyAoCi0JCSNpZiAoJGUuTnVtRW50cmllcyA9PSAwKSAoICJlbXB0eSIgKQotCQkjZWxzZSAoCi0JCQkjKAotCQkJCSJbTnVtRW50cmllcz0iLCAkZS5OdW1FbnRyaWVzLAotCQkJCSIgTnVtQnVja2V0cz0iLCAkZS5OdW1CdWNrZXRzLAotCQkJCSJdIgotCQkJKQotCQkpCi0JKQotCi0JY2hpbGRyZW4gKAotCQkjaWYgKCRlLk51bUVudHJpZXMgPT0gMCkgKCAjYXJyYXkoZXhwcjogMCwgc2l6ZTogMCkgKQotCQkjZWxzZSAoCi0JCQkjKAotCQkJCSMoW3JhdyBtZW1iZXJzXSA6IFskYywhXSksCi0JCQkJIyhOdW1FbnRyaWVzIDogJGUuTnVtRW50cmllcyksCi0JCQkJIyhOdW1CdWNrZXRzIDogJGUuTnVtQnVja2V0cyksCi0JCQkJI2FycmF5KAotCQkJCQlleHByOiAkZS5CdWNrZXRzWyRpXSwKLQkJCQkJc2l6ZTogJGUuTnVtQnVja2V0cwotCQkJCSkKLQkJCSkKLQkJKQotCSkKLX0KLQotbGx2bTo6U3RyaW5nTWFwPCosKj57Ci0JcHJldmlldyAoCi0JCSMoCi0JCQkiW051bUJ1Y2tldHM9IiwgJGUuTnVtQnVja2V0cywKLQkJCSIgSXRlbVNpemU9IiwgJGUuSXRlbVNpemUsCi0JCQkiXSIKLQkJKQotCSkKLQotCWNoaWxkcmVuICgKLQkJIygKLQkJCSMoW3JhdyBtZW1iZXJzXSA6IFskYywhXSksCi0JCQkjKE51bUJ1Y2tldHMgOiAkZS5OdW1CdWNrZXRzKSwKLQkJCSMoSXRlbVNpemUgOiAkZS5JdGVtU2l6ZSksCi0JCQkjYXJyYXkoCi0JCQkJZXhwcjogJGUuVGhlVGFibGVbJGldLAotCQkJCXNpemU6ICRlLk51bUJ1Y2tldHMsCi0JCQkpIDogKGxsdm06OlN0cmluZ01hcEVudHJ5PCRUMT4qKSYkZQotCQkpCi0JKQotfQotCi1sbHZtOjpTdHJpbmdNYXBFbnRyeTwqPnsKLQlwcmV2aWV3ICgKLQkJI2lmICgkZS5TdHJMZW4gPT0gMCkgKCAiZW1wdHkiICkKLQkJI2Vsc2UgKAkjKEVudHJ5IDogJGUuc2Vjb25kKSApCi0JKQotCi0JY2hpbGRyZW4gKAotCQkjaWYgKCRlLlN0ckxlbiA9PSAwKSAoICJlbXB0eSIgKQotCQkjZWxzZSAoICMoRW50cnkgOiAkZS5zZWNvbmQpICkJCi0JKQotfQotCi1jbGFuZzo6RGlyZWN0b3J5RW50cnl8Y2xhbmc6OkZpbGVFbnRyeXxjbGFuZzo6UHJhZ21hSGFuZGxlcnsKLQlwcmV2aWV3ICggWyRlLk5hbWUsc10gKQotCWNoaWxkcmVuICgKLQkJIygKLQkJCSMoW3JhdyBtZW1iZXJzXSA6IFskYywhXSksCi0JCQkjKE5hbWUgOiBbJGUuTmFtZSxzXSkKLQkJKQotCSkKLX0KLQotY2xhbmc6OkRlY2xhcmF0aW9uTmFtZXsKLQlwcmV2aWV3ICgKLQkJOyBlbnVtIHZhbHVlcyBmcm9tIGNsYW5nOjpEZWNsYXJhdGlvbk5hbWU6OlN0b3JlZE5hbWVLaW5kCi0JCSNpZiAoJGUuUHRyID09IDApICgKLQkJCSJlbXB0eSIKLQkJKSAjZWxpZiAoKCRlLlB0ciAmICRlLlB0ck1hc2spID09ICRlLlN0b3JlZElkZW50aWZpZXIpICgKLQkJCSNlbHNlICggIygiSWRlbnRpZmllciwgIiwgKGNsYW5nOjpJZGVudGlmaWVySW5mbyopKCRlLlB0ciAmIH4kZS5QdHJNYXNrKSkgKQotCQkpICNlbGlmICgoJGUuUHRyICYgJGUuUHRyTWFzaykgPT0gJGUuU3RvcmVkT2JqQ1plcm9BcmdTZWxlY3RvcikgKAotCQkJIygiWmVyb0FyZ1NlbGVjdG9yLCAiLCAoY2xhbmc6OklkZW50aWZpZXJJbmZvKikoJGUuUHRyICYgfiRlLlB0ck1hc2spKQotCQkpICNlbGlmICgoJGUuUHRyICYgJGUuUHRyTWFzaykgPT0gJGUuU3RvcmVkT2JqQ09uZUFyZ1NlbGVjdG9yKSAoCi0JCQkjKCJPbmVBcmdTZWxlY3RvciwgIiwgKGNsYW5nOjpJZGVudGlmaWVySW5mbyopKCRlLlB0ciAmIH4kZS5QdHJNYXNrKSkKLQkJKSAjZWxpZiAoKCRlLlB0ciAmICRlLlB0ck1hc2spID09ICRlLlN0b3JlZERlY2xhcmF0aW9uTmFtZUV4dHJhKSAoCi0JCQkjc3dpdGNoICgoKGNsYW5nOjpEZWNsYXJhdGlvbk5hbWVFeHRyYSopKCRlLlB0ciAmIH4kZS5QdHJNYXNrKSkuRXh0cmFLaW5kT3JOdW1BcmdzKQotCQkJI2Nhc2UgMCAoIDtEZWNsYXJhdGlvbk5hbWVFeHRyYTo6Q1hYQ29uc3RydWN0b3IKLQkJCQkjKCJDWFhDb25zdHJ1Y3Rvck5hbWUsICIsIChjbGFuZzo6Q1hYU3BlY2lhbE5hbWUqKSgkZS5QdHIgJiB+JGUuUHRyTWFzaykpCi0JCQkpCi0JCQkjY2FzZSAxICggO0RlY2xhcmF0aW9uTmFtZUV4dHJhOjpDWFhEZXN0cnVjdG9yCi0JCQkJIygiQ1hYRGVzdHJ1Y3Rvck5hbWUsICIsIChjbGFuZzo6Q1hYU3BlY2lhbE5hbWUqKSgkZS5QdHIgJiB+JGUuUHRyTWFzaykpCi0JCQkpCi0JCQkjY2FzZSAyICggO0RlY2xhcmF0aW9uTmFtZUV4dHJhOjpDWFhDb252ZXJzaW9uRnVuY3Rpb24KLQkJCQkjKCJDWFhDb252ZXJzaW9uRnVuY3Rpb25OYW1lLCAiLCAoY2xhbmc6OkNYWFNwZWNpYWxOYW1lKikoJGUuUHRyICYgfiRlLlB0ck1hc2spKQotCQkJKQotCQkJI2Nhc2UgNDYgKCA7RGVjbGFyYXRpb25OYW1lRXh0cmE6OkNYWExpdGVyYWxPcGVyYXRvcgotCQkJCSMoIkNYWExpdGVyYWxPcGVyYXRvck5hbWUsICIsIChjbGFuZzo6Q1hYTGl0ZXJhbE9wZXJhdG9ySWROYW1lKikoJGUuUHRyICYgfiRlLlB0ck1hc2spKQotCQkJKQotCQkJI2Nhc2UgNDcgKCA7RGVjbGFyYXRpb25OYW1lRXh0cmE6OkNYWFVzaW5nRGlyZWN0aXZlCi0JCQkJIygiQ1hYVXNpbmdEaXJlY3RpdmUiKQk7VE9ETyBXaGF0IHRvIGFkZCBoZXJlPwotCQkJKQotCQkJI2RlZmF1bHQgKAotCQkJCSNpZiAoKChjbGFuZzo6RGVjbGFyYXRpb25OYW1lRXh0cmEqKSgkZS5QdHIgJiB+JGUuUHRyTWFzaykpLkV4dHJhS2luZE9yTnVtQXJncyA8IDQ3KSAoCi0JCQkJCSMoIkNYWE9wZXJhdG9yTmFtZSwgIiwgKGNsYW5nOjpDWFhPcGVyYXRvcklkTmFtZSopKCRlLlB0ciAmIH4kZS5QdHJNYXNrKSkKLQkJCQkpICNlbHNlICgKLQkJCQkJIygiT2JqQ011bHRpQXJnU2VsZWN0b3IsICIsIChjbGFuZzo6TXVsdGlLZXl3b3JkU2VsZWN0b3IqKSgkZS5QdHIgJiB+JGUuUHRyTWFzaykpCi0JCQkJKQotCQkJKQotCQkpCi0JKQotCi0JY2hpbGRyZW4gKAotCQkjKAotCQkJOyBlbnVtIHZhbHVlcyBmcm9tIGNsYW5nOjpEZWNsYXJhdGlvbk5hbWU6OlN0b3JlZE5hbWVLaW5kCi0JCQkjaWYgKCRlLlB0ciA9PSAwKSAoCi0JCQkJI2FycmF5KCBleHByOiAwLCBzaXplOiAwICkKLQkJCSkgI2Vsc2UgKAotCQkJCSMoCi0JCQkJCSMoW3JhdyBtZW1iZXJzXSA6IFskZS5QdHIsIV0pLAotCQkJCQlpZiAoKCRlLlB0ciAmICRlLlB0ck1hc2spID09ICRlLlN0b3JlZElkZW50aWZpZXIpICgKLQkJCQkJCSMoUHRyIDogKGNsYW5nOjpJZGVudGlmaWVySW5mbyopKCRlLlB0ciAmIH4kZS5QdHJNYXNrKSkKLQkJCQkJKSAjZWxpZiAoKCRlLlB0ciAmICRlLlB0ck1hc2spID09ICRlLlN0b3JlZE9iakNaZXJvQXJnU2VsZWN0b3IpICgKLQkJCQkJCSMoUHRyIDogKGNsYW5nOjpJZGVudGlmaWVySW5mbyopKCRlLlB0ciAmIH4kZS5QdHJNYXNrKSkKLQkJCQkJKSAjZWxpZiAoKCRlLlB0ciAmICRlLlB0ck1hc2spID09ICRlLlN0b3JlZE9iakNPbmVBcmdTZWxlY3RvcikgKAotCQkJCQkJIyhQdHIgOiAoY2xhbmc6OklkZW50aWZpZXJJbmZvKikoJGUuUHRyICYgfiRlLlB0ck1hc2spKQotCQkJCQkpICNlbGlmICgoJGUuUHRyICYgJGUuUHRyTWFzaykgPT0gJGUuU3RvcmVkRGVjbGFyYXRpb25OYW1lRXh0cmEpICgKLQkJCQkJCSNzd2l0Y2ggKCgoY2xhbmc6OkRlY2xhcmF0aW9uTmFtZUV4dHJhKikoJGUuUHRyICYgfiRlLlB0ck1hc2spKS5FeHRyYUtpbmRPck51bUFyZ3MpCi0JCQkJCQkjY2FzZSAwICggO0RlY2xhcmF0aW9uTmFtZUV4dHJhOjpDWFhDb25zdHJ1Y3RvcgotCQkJCQkJCSMoUHRyIDogKGNsYW5nOjpDWFhTcGVjaWFsTmFtZSopKCRlLlB0ciAmIH4kZS5QdHJNYXNrKSkKLQkJCQkJCSkKLQkJCQkJCSNjYXNlIDEgKCA7RGVjbGFyYXRpb25OYW1lRXh0cmE6OkNYWERlc3RydWN0b3IKLQkJCQkJCQkjKFB0ciA6IChjbGFuZzo6Q1hYU3BlY2lhbE5hbWUqKSgkZS5QdHIgJiB+JGUuUHRyTWFzaykpCi0JCQkJCQkpCi0JCQkJCQkjY2FzZSAyICggO0RlY2xhcmF0aW9uTmFtZUV4dHJhOjpDWFhDb252ZXJzaW9uRnVuY3Rpb24KLQkJCQkJCQkjKFB0ciA6IChjbGFuZzo6Q1hYU3BlY2lhbE5hbWUqKSgkZS5QdHIgJiB+JGUuUHRyTWFzaykpCi0JCQkJCQkpCi0JCQkJCQkjY2FzZSA0NiAoIDtEZWNsYXJhdGlvbk5hbWVFeHRyYTo6Q1hYTGl0ZXJhbE9wZXJhdG9yCi0JCQkJCQkJIyhQdHIgOiAoY2xhbmc6OkNYWExpdGVyYWxPcGVyYXRvcklkTmFtZSopKCRlLlB0ciAmIH4kZS5QdHJNYXNrKSkKLQkJCQkJCSkKLQkJCQkJCSNjYXNlIDQ3ICggO0RlY2xhcmF0aW9uTmFtZUV4dHJhOjpDWFhVc2luZ0RpcmVjdGl2ZQotCQkJCQkJCSMoUHRyIDogJGUuUHRyKQk7VE9ETyBXaGF0IHRvIGFkZCBoZXJlPwotCQkJCQkJKQotCQkJCQkJI2RlZmF1bHQgKAotCQkJCQkJCSNpZiAoKChjbGFuZzo6RGVjbGFyYXRpb25OYW1lRXh0cmEqKSgkZS5QdHIgJiB+JGUuUHRyTWFzaykpLkV4dHJhS2luZE9yTnVtQXJncyA8IDQ3KSAoCi0JCQkJCQkJCSMoUHRyIDogKENYWE9wZXJhdG9ySWROYW1lKikoJGUuUHRyICYgfiRlLlB0ck1hc2spKQotCQkJCQkJCSkgI2Vsc2UgKAotCQkJCQkJCQkjKFB0ciA6IChjbGFuZzo6TXVsdGlLZXl3b3JkU2VsZWN0b3IqKSgkZS5QdHIgJiB+JGUuUHRyTWFzaykpCi0JCQkJCQkJKQotCQkJCQkJKQotCQkJCQkpCi0JCQkJKQotCQkJKQotCQkpCi0JKQotfQotCi1jbGFuZzo6RGVjbFNwZWN7Ci0JcHJldmlldyAoCi0JCSMoCi0JCQkiWyIsCi0JCQkoY2xhbmc6OkRlY2xTcGVjOjpTQ1MpJGUuU3RvcmFnZUNsYXNzU3BlYywKLQkJCSIsICIsCi0JCQkoY2xhbmc6OlR5cGVTcGVjaWZpZXJUeXBlKSRlLlR5cGVTcGVjVHlwZSwKLQkJCSJdIgotCQkpCi0JKQotfQotCi1sbHZtOjpUcmlwbGV7Ci0JcHJldmlldyAoICRlLkRhdGEgKQotfQpkaWZmIC0tZ2l0IGEvd3d3L2FuYWx5emVyL2xhdGVzdF9jaGVja2VyLmh0bWwuaW5jbCBiL3d3dy9hbmFseXplci9sYXRlc3RfY2hlY2tlci5odG1sLmluY2wKaW5kZXggNTA2MjYyMi4uOTllZDNkOCAxMDA2NDQKLS0tIGEvd3d3L2FuYWx5emVyL2xhdGVzdF9jaGVja2VyLmh0bWwuaW5jbAorKysgYi93d3cvYW5hbHl6ZXIvbGF0ZXN0X2NoZWNrZXIuaHRtbC5pbmNsCkBAIC0xICsxIEBACi08Yj48YSBocmVmPSJkb3dubG9hZHMvY2hlY2tlci0yNzUudGFyLmJ6MiI+Y2hlY2tlci0yNzUudGFyLmJ6MjwvYT48L2I+IChidWlsdCBNYXkgMjMsIDIwMTMpCis8Yj48YSBocmVmPSJkb3dubG9hZHMvY2hlY2tlci0yNzYudGFyLmJ6MiI+Y2hlY2tlci0yNzYudGFyLmJ6MjwvYT48L2I+IChidWlsdCBGZWJydWFyeSAxOSwgMjAxNCkKZGlmZiAtLWdpdCBhL3d3dy9hbmFseXplci9wb3RlbnRpYWxfY2hlY2tlcnMuaHRtbCBiL3d3dy9hbmFseXplci9wb3RlbnRpYWxfY2hlY2tlcnMuaHRtbAppbmRleCBhYjg5MTdjLi41YjMyZGQwIDEwMDY0NAotLS0gYS93d3cvYW5hbHl6ZXIvcG90ZW50aWFsX2NoZWNrZXJzLmh0bWwKKysrIGIvd3d3L2FuYWx5emVyL3BvdGVudGlhbF9jaGVja2Vycy5odG1sCkBAIC0xMDUwLDMyICsxMDUwLDYgQEAKIH0KIDwvcHJlPjwvdGQ+PHRkIGNsYXNzPSJhbGlnbmVkIj48L3RkPjwvdHI+CiAKLTx0cj48dGQ+PHNwYW4gY2xhc3M9Im5hbWUiPmRpZmZlcmVudC5JZGVudGljYWxFeHByQmluT3AKLTxicj4oQyk8L3NwYW4+PGJyPjxicj4KLVRoZXJlIGFyZSBpZGVudGljYWwgc3ViLWV4cHJlc3Npb25zIHRvIHRoZSBsZWZ0IGFuZCB0byB0aGUgcmlnaHQgb2YgdGhlIAotb3BlcmF0b3IKLTwvdGQ+PHRkPjxwcmU+Ci0jZGVmaW5lIEEgMQotI2RlZmluZSBCIDEKLQotYm9vbCBpc05hbihkb3VibGUgZCkgeyAKLSAgcmV0dXJuIGQgIT0gZDsgLy8gb2sKLX0KLQotaW50IGYoKTsKLQotdm9pZCB0ZXN0KCkgewotICBpbnQgaSA9IDA7Ci0gIGlmIChpICE9IDAgJiYgaSAhPSAwKSB7fSAvLyB3YXJuCi0KLSAgaWYoaSA9PSBBIHx8IGkgPT0gQikge30gLy8gb2sKLQotICBpZiAoKytpICE9IDAgJiYgKytpICE9IDApIHt9IC8vIG9rCi0KLSAgaWYgKGYoKSAmJiBmKCkpIHt9IC8vIG9rCi19Ci08L3ByZT48L3RkPjx0ZCBjbGFzcz0iYWxpZ25lZCI+PC90ZD48L3RyPgotCiA8dHI+PHRkPjxzcGFuIGNsYXNzPSJuYW1lIj5kaWZmZXJlbnQuRnVuY1B0ckluc3RlYWRPZkNhbGwKIDxicj4oQyk8L3NwYW4+PGJyPjxicj4KIFBvc3NpYmx5IGEgZnVuY3Rpb24gY2FsbCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGEgcG9pbnRlciB0byBmdW5jdGlvbgpAQCAtMTA4NywxOCArMTA2MSw2IEBACiB9CiA8L3ByZT48L3RkPjx0ZCBjbGFzcz0iYWxpZ25lZCI+PC90ZD48L3RyPgogCi08dHI+PHRkPjxzcGFuIGNsYXNzPSJuYW1lIj5kaWZmZXJlbnQuSWRlbnRpY2FsQ29uZElmRWxzZUlmCi08YnI+KEMpPC9zcGFuPjxicj48YnI+Ci1UaGUgdXNlIG9mICdpZiAoQSkgey4uLn0gZWxzZSBpZiAoQSkgey4uLn0nIHBhdHRlcm4gd2FzIGRldGVjdGVkLiBUaGVyZSBpcyBhIAotcHJvYmFiaWxpdHkgb2YgbG9naWNhbCBlcnJvciBwcmVzZW5jZQotPC90ZD48dGQ+PHByZT4KLXZvaWQgdGVzdCgpIHsgCi0gIGludCBpID0gNzsKLSAgaWYgKGkgPT0gMSkge30KLSAgZWxzZSBpZiAoaSA9PSAxKSB7fSAvLyB3YXJuCi19Ci08L3ByZT48L3RkPjx0ZCBjbGFzcz0iYWxpZ25lZCI+PC90ZD48L3RyPgotCiA8dHI+PHRkPjxzcGFuIGNsYXNzPSJuYW1lIj5TdWNjZXNzaXZlQXNzaWduCiA8YnI+KEMpPC9zcGFuPjxicj48YnI+CiBTdWNjZXNzaXZlIGFzc2lnbiB0byBhIHZhcmlhYmxlCkBAIC0xMTQ2LDIxICsxMTA4LDYgQEAKIH0KIDwvcHJlPjwvdGQ+PHRkIGNsYXNzPSJhbGlnbmVkIj48L3RkPjwvdHI+CiAKLTx0cj48dGQ+PHNwYW4gY2xhc3M9Im5hbWUiPmRpZmZlcmVudC5JZGVudGljYWxTdG10VGhlbkVsc2UKLTxicj4oQyk8L3NwYW4+PGJyPjxicj4KLVRoZSAnZWxzZScgc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8gdGhlICd0aGVuJyBzdGF0ZW1lbnQKLTwvdGQ+PHRkPjxwcmU+Ci12b2lkIHRlc3QoKSB7Ci0gIGludCBpOwotICBpZiAoaT09MSkgewotICAgIGkrKzsKLSAgfQotICBlbHNlIHsgLy8gd2FybgotICAgIGkrKzsKLSAgfQotfQotPC9wcmU+PC90ZD48dGQgY2xhc3M9ImFsaWduZWQiPjwvdGQ+PC90cj4KLQogPHRyPjx0ZD48c3BhbiBjbGFzcz0ibmFtZSI+ZGlmZmVyZW50Lk11bHRpcGxlQWNjZXNzb3JzCiA8YnI+KEMrKyk8L3NwYW4+PGJyPjxicj4KIG11bHRpcGxlIGFjY2Vzc29ycyBtZXQgZm9yICdjbGFzczo6ZmllbGQnCkBAIC0xMjgxLDE2ICsxMjI4LDYgQEAKIH0KIDwvcHJlPjwvdGQ+PHRkIGNsYXNzPSJhbGlnbmVkIj48L3RkPjwvdHI+CiAKLTx0cj48dGQ+PHNwYW4gY2xhc3M9Im5hbWUiPmRpZmZlcmVudC5Db25kT3BJZGVudGljYWxSZXR1cm4KLTxicj4oQyk8L3NwYW4+PGJyPjxicj4KLVRoZSByZXR1cm4gZXhwcmVzc2lvbnMgb2YgdGhlICc/Oicgb3BlcmF0b3IgYXJlIGlkZW50aWNhbAotPC90ZD48dGQ+PHByZT4KLXZvaWQgdGVzdCgpIHsKLSAgdW5zaWduZWQgYTsKLSAgYSA9IGEgPiA1ID8gYSA6IGE7IC8vIHdhcm4KLX0KLTwvcHJlPjwvdGQ+PHRkIGNsYXNzPSJhbGlnbmVkIj48L3RkPjwvdHI+Ci0KIDx0cj48dGQ+PHNwYW4gY2xhc3M9Im5hbWUiPmRpZmZlcmVudC5Mb2dpY2FsT3BVc2VsZXNzQXJnCiA8YnI+KEMpPC9zcGFuPjxicj48YnI+CiBUaGUgc2Vjb25kIG9wZXJhbmQgb2YgdGhlICZhbXA7JmFtcDsgb3BlcmF0b3IgaGFzIG5vIGltcGFjdCBvbiBleHByZXNzaW9uIHJlc3VsdApkaWZmIC0tZ2l0IGEvd3d3L2FuYWx5emVyL3JlbGVhc2Vfbm90ZXMuaHRtbCBiL3d3dy9hbmFseXplci9yZWxlYXNlX25vdGVzLmh0bWwKaW5kZXggYmMwNTJiYi4uODFmOWM5YSAxMDA2NDQKLS0tIGEvd3d3L2FuYWx5emVyL3JlbGVhc2Vfbm90ZXMuaHRtbAorKysgYi93d3cvYW5hbHl6ZXIvcmVsZWFzZV9ub3Rlcy5odG1sCkBAIC0xNSw2ICsxNSwxOCBAQAogCiA8aDE+UmVsZWFzZSBub3RlcyBmb3IgPHR0PmNoZWNrZXItWFhYPC90dD4gYnVpbGRzPC9oMT4KIAorPGg0IGlkPSJjaGVja2VyXzI3NiI+Y2hlY2tlci0yNzY8L2g0PgorPHA+PGI+YnVpbHQ6PC9iPiBGZWJydWFyeSAxOSwgMjAxNDwvYnI+CisJPGI+ZG93bmxvYWQ6PC9iPiA8YSBocmVmPSJkb3dubG9hZHMvY2hlY2tlci0yNzYudGFyLmJ6MiI+Y2hlY2tlci0yNzYudGFyLmJ6MjwvYT48L3A+CisJPHA+PGI+aGlnaGxpZ2h0czo8L2I+PC9wPgorCTx1bD4KKyAgICA8bGk+SW5jbHVkZXMgYWJvdXQgOSBtb250aHMgb2YgY2hhbmdlIHRvIENsYW5nIGl0c2VsZiAoaW1wcm92ZWQgQysrMTEvMTQgc3VwcG9ydCwgZXRjLik8L2xpPgorICAgIDxsaT5Nb3JlIHByZWNpc2UgbW9kZWxpbmcgb2YgT2JqZWN0aXZlLUMgcHJvcGVydGllcywgd2hpY2ggZW5hYmxlcyB0aGUgYW5hbHl6ZXIgdG8gZmluZCBtb3JlIGJ1Z3MuPC9saT4KKyAgICA8bGk+SW5jbHVkZXMgYSBuZXcgIm1pc3NpbmcgY2FsbCB0byA8dHQ+c3VwZXI8L3R0PiIgd2FybmluZywgd2hpY2ggbG9va3MgZm9yIGNvbW1vbiBwYXR0ZXJuIGluIGlPUy9PU1ggQVBJcyB0aGF0IHJlcXVpcmUgY2hhaW5pbmcgYSBjYWxsIHRvIGEgc3VwZXIgY2xhc3MncyBpbXBsZW1lbnRhdGlvbiBvZiBhIG1ldGhvZC48L2xpPgorICAgIDxsaT5BY2NlcHRzIDx0dD4tYXJjaCBhcm02NDwvdHQ+ICh3aGljaCBtYXkgYmUgcGFzc2VkIGJ5IFhjb2RlIDUuMCksIGJ1dCBmb3IgdGhlIHRpbWUgYmVpbmcgYW5hbHl6ZXMgY29kZSBpbiBzdWNoIGNhc2VzIGFzIDx0dD4tYXJjaCBhcm12N3M8L3R0Pi48L2xpPgorICAgIDxsaT5NYW55IHN1bmRyeSBmaXhlcywgaW1wcm92ZW1lbnRzIHRvIEMrKyBzdXBwb3J0LCBldGMuPC9saT4KKwk8L3VsPgorICAKIDxoNCBpZD0iY2hlY2tlcl8yNzUiPmNoZWNrZXItMjc1PC9oND4KIDxwPjxiPmJ1aWx0OjwvYj4gTWF5IDIzLCAyMDEzPC9icj4KIAk8Yj5kb3dubG9hZDo8L2I+IDxhIGhyZWY9ImRvd25sb2Fkcy9jaGVja2VyLTI3NS50YXIuYnoyIj5jaGVja2VyLTI3NS50YXIuYnoyPC9hPjwvcD4KZGlmZiAtLWdpdCBhL3d3dy9jb21wYXJpc29uLmh0bWwgYi93d3cvY29tcGFyaXNvbi5odG1sCmluZGV4IGFmYzMyMWUuLjQwYTBkMDAgMTAwNjQ0Ci0tLSBhL3d3dy9jb21wYXJpc29uLmh0bWwKKysrIGIvd3d3L2NvbXBhcmlzb24uaHRtbApAQCAtNTEsOCArNTEsMTQgQEAKICAgICA8bGk+R0NDIHN1cHBvcnRzIGxhbmd1YWdlcyB0aGF0IGNsYW5nIGRvZXMgbm90IGFpbSB0bywgc3VjaCBhcyBKYXZhLCBBZGEsCiAgICAgICAgIEZPUlRSQU4sIGV0Yy48L2xpPgogICAgIDxsaT5HQ0Mgc3VwcG9ydHMgbW9yZSB0YXJnZXRzIHRoYW4gTExWTS48L2xpPgorICAgIDxsaT5HQ0Mgc3VwcG9ydHMgbWFueSBsYW5ndWFnZSBleHRlbnNpb25zLCBzb21lIG9mIHdoaWNoIGFyZSBub3QgaW1wbGVtZW50ZWQKKyAgICBieSBDbGFuZy4gRm9yIGluc3RhbmNlLCBpbiBDIG1vZGUsIEdDQyBzdXBwb3J0cworICAgIDxhIGhyZWY9Imh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy9OZXN0ZWQtRnVuY3Rpb25zLmh0bWwiPm5lc3RlZAorICAgIGZ1bmN0aW9uczwvYT4gYW5kIGhhcyBhbgorICAgIDxhIGhyZWY9Imh0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzc0MjgiPnVuZG9jdW1lbnRlZAorICAgIGV4dGVuc2lvbiBhbGxvd2luZyBWTEFzIGluIHN0cnVjdHM8L2E+LgogICAgIDwvdWw+Ci0gICAgCisKICAgICA8cD5Qcm8ncyBvZiBjbGFuZyB2cyBHQ0M6PC9wPgogICAgIAogICAgIDx1bD4KQEAgLTgxLDcgKzg3LDggQEAKICAgICAgICAgR0NDIGRvZXMgbm90IHRyYWNrIGluZm9ybWF0aW9uIGFib3V0IG1hY3JvIGluc3RhbnRpYXRpb25zIHdoZW4gcGFyc2luZwogICAgICAgICBzb3VyY2UgY29kZS4gIFRoaXMgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHQgZm9yIHNvdXJjZSByZXdyaXRpbmcgdG9vbHMKICAgICAgICAgKGUuZy4gZm9yIHJlZmFjdG9yaW5nKSB0byB3b3JrIGluIHRoZSBwcmVzZW5jZSBvZiAoZXZlbiBzaW1wbGUpIAotICAgICAgICBtYWNyb3MuPC9saT4KKyAgICAgICAgbWFjcm9zLiBUaGlzIGFwcGVhcnMgdG8gYmUgcGFydGlhbGx5IG9yIGZ1bGx5IGFkZHJlc3NlZCBpbiByZWNlbnQKKyAgICAgICAgcmVsZWFzZXMgb2YgR0NDLjwvbGk+CiAgICAgPGxpPkNsYW5nIGRvZXMgbm90IGltcGxpY2l0bHkgc2ltcGxpZnkgY29kZSBhcyBpdCBwYXJzZXMgaXQgbGlrZSBHQ0MgZG9lcy4KICAgICAgICAgRG9pbmcgc28gY2F1c2VzIG1hbnkgcHJvYmxlbXMgZm9yIHNvdXJjZSBhbmFseXNpcyB0b29sczogYXMgb25lIHNpbXBsZQogICAgICAgICBleGFtcGxlLCBpZiB5b3Ugd3JpdGUgIngteCIgaW4geW91ciBzb3VyY2UgY29kZSwgdGhlIEdDQyBBU1Qgd2lsbApAQCAtMTA5LDggKzExNiwxMiBAQAogICAgICAgICBwbHVnZ2FibGUgb3B0aW1pemVycywgbGluay10aW1lIG9wdGltaXphdGlvbiBzdXBwb3J0LCBKdXN0LUluLVRpbWUKICAgICAgICAgY29tcGlsYXRpb24sIGFiaWxpdHkgdG8gbGluayBpbiBtdWx0aXBsZSBjb2RlIGdlbmVyYXRvcnMsIGV0Yy48L2xpPgogICAgIDxsaT48YSBocmVmPSJjb21wYXRpYmlsaXR5Lmh0bWwjYysrIj5DbGFuZydzIHN1cHBvcnQgZm9yIEMrKzwvYT4gaXMgbW9yZQotICAgICAgICBjb21wbGlhbnQgdGhhbiBHQ0MncyBpbiBtYW55IHdheXMgKGUuZy4gY29uZm9ybWFudCB0d28gcGhhc2UgbmFtZQotICAgICAgICBsb29rdXApLjwvbGk+CisgICAgICAgIGNvbXBsaWFudCB0aGFuIEdDQydzIGluIG1hbnkgd2F5cy48L2xpPgorICAgIDxsaT5DbGFuZyBzdXBwb3J0cworICAgICAgICA8YSBocmVmPSJodHRwOi8vY2xhbmcubGx2bS5vcmcvZG9jcy9MYW5ndWFnZUV4dGVuc2lvbnMuaHRtbCI+bWFueSBsYW5ndWFnZQorICAgICAgICBleHRlbnNpb25zPC9hPiwgc29tZSBvZiB3aGljaCBhcmUgbm90IGltcGxlbWVudGVkIGJ5IEdDQy4gRm9yIGluc3RhbmNlLAorICAgICAgICBDbGFuZyBwcm92aWRlcyBhdHRyaWJ1dGVzIGZvciBjaGVja2luZyB0aHJlYWQgc2FmZXR5IGFuZCBleHRlbmRlZCB2ZWN0b3IKKyAgICAgICAgdHlwZXMuPC9saT4KICAgICA8L3VsPgogCiAgICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgpkaWZmIC0tZ2l0IGEvd3d3L2N4eF9kcl9zdGF0dXMuaHRtbCBiL3d3dy9jeHhfZHJfc3RhdHVzLmh0bWwKaW5kZXggNjgyNTVlMy4uNzNiYjE2MCAxMDA2NDQKLS0tIGEvd3d3L2N4eF9kcl9zdGF0dXMuaHRtbAorKysgYi93d3cvY3h4X2RyX3N0YXR1cy5odG1sCkBAIC0xLDUgKzEsNiBAQAogPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgogICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzwhLS0gVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IG1ha2VfY3h4X2RyX3N0YXR1cy4gRG8gbm90IG1vZGlmeS4gLS0+CiA8aHRtbD4KIDxoZWFkPgogICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KQEAgLTE0LDcgKzE1LDcgQEAKICAgICAubmEgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjREREREREIH0KICAgICAub3BlbiAqIHsgY29sb3I6ICNBQUFBQUEgfQogICAgIC8vLm9wZW4geyBmaWx0ZXI6IG9wYWNpdHkoMC4yKSB9Ci0gICAgc3Bhbjp0YXJnZXQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkJCOyBvdXRsaW5lOiAjRERERDU1IHNvbGlkIHRoaW47IH0KKyAgICB0cjp0YXJnZXQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkJCIH0KICAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNGRkREQUEgfQogICA8L3N0eWxlPgogPC9oZWFkPgpAQCAtNDAsMzIzMSArNDEsMzIzMSBAQAogICAgIDx0aD5Jc3N1ZSB0aXRsZTwvdGg+CiAgICAgPHRoPkF2YWlsYWJsZSBpbiBDbGFuZz88L3RoPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxIj4xPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPldoYXQgaWYgdHdvIHVzaW5nLWRlY2xhcmF0aW9ucyByZWZlciB0byB0aGUgc2FtZSBmdW5jdGlvbiBidXQgdGhlIGRlY2xhcmF0aW9ucyBpbnRyb2R1Y2UgZGlmZmVyZW50IGRlZmF1bHQtYXJndW1lbnRzPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMyIj4yPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+SG93IGNhbiBkZXBlbmRlbnQgbmFtZXMgYmUgdXNlZCBpbiBtZW1iZXIgZGVjbGFyYXRpb25zIHRoYXQgYXBwZWFyIG91dHNpZGUgb2YgdGhlIGNsYXNzIHRlbXBsYXRlIGRlZmluaXRpb24/PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMzIj4zPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlRoZSB0ZW1wbGF0ZSBjb21waWxhdGlvbiBtb2RlbCBydWxlcyByZW5kZXIgc29tZSBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBkZWNsYXJhdGlvbnMgbm90IHZpc2libGUgZHVyaW5nIGluc3RhbnRpYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNCI+NDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Eb2VzIGV4dGVybiAiQyIgYWZmZWN0IHRoZSBsaW5rYWdlIG9mIGZ1bmN0aW9uIG5hbWVzIHdpdGggaW50ZXJuYWwgbGlua2FnZT88L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNSI+NTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5DVi1xdWFsaWZpZXJzIGFuZCB0eXBlIGNvbnZlcnNpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM2Ij42PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5TaG91bGQgdGhlIG9wdGltaXphdGlvbiB0aGF0IGFsbG93cyBhIGNsYXNzIG9iamVjdCB0byBhbGlhcyBhbm90aGVyIG9iamVjdCBhbHNvIGFsbG93IHRoZSBjYXNlIG9mIGEgcGFyYW1ldGVyIGluIGFuIGlubGluZSBmdW5jdGlvbiB0byBhbGlhcyBpdHMgYXJndW1lbnQ/PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM3Ij43PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkNhbiBhIGNsYXNzIHdpdGggYSBwcml2YXRlIHZpcnR1YWwgYmFzZSBjbGFzcyBiZSBkZXJpdmVkIGZyb20/PC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzgiPjg8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+QWNjZXNzIHRvIHRlbXBsYXRlIGFyZ3VtZW50cyB1c2VkIGluIGEgZnVuY3Rpb24gcmV0dXJuIHR5cGUgYW5kIGluIHRoZSBuZXN0ZWQgbmFtZSBzcGVjaWZpZXI8L3RkPgotICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDQ1PC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjNDUiPjQ1PC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzkiPjk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q2xhcmlmaWNhdGlvbiBvZiBhY2Nlc3MgdG8gYmFzZSBjbGFzcyBtZW1iZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMCI+MTA8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q2FuIGEgbmVzdGVkIGNsYXNzIGFjY2VzcyBpdHMgb3duIGNsYXNzIG5hbWUgYXMgYSBxdWFsaWZpZWQgbmFtZSBpZiBpdCBpcyBhIHByaXZhdGUgbWVtYmVyIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3M/PC90ZD4KLSAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA0NTwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzQ1Ij40NTwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTEiPjExPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkhvdyBkbyB0aGUga2V5d29yZHMgdHlwZW5hbWUvdGVtcGxhdGUgaW50ZXJhY3Qgd2l0aCB1c2luZy1kZWNsYXJhdGlvbnM/PC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEyIj4xMjwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5EZWZhdWx0IGFyZ3VtZW50cyBvbiBkaWZmZXJlbnQgZGVjbGFyYXRpb25zIGZvciB0aGUgc2FtZSBmdW5jdGlvbiBhbmQgdGhlIEtvZW5pZyBsb29rdXA8L3RkPgotICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+U3VwZXJzZWRlZCBieSAyMzk8L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+U3VwZXJzZWRlZCBieSA8YSBocmVmPSIjMjM5Ij4yMzk8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEzIj4xMzwvYT48L3RkPgotICAgIDx0ZD5leHRlbnNpb248L3RkPgorICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5leHRlcm4gIkMiIGZvciBQYXJhbWV0ZXJzIG9mIEZ1bmN0aW9uIFRlbXBsYXRlczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0Ij4xNDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5leHRlcm4gIkMiIGZ1bmN0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE1Ij4xNTwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5EZWZhdWx0IGFyZ3VtZW50cyBmb3IgcGFyYW1ldGVycyBvZiBmdW5jdGlvbiB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE2Ij4xNjwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5BY2Nlc3MgdG8gbWVtYmVycyBvZiBpbmRpcmVjdCBwcml2YXRlIGJhc2UgY2xhc3NlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNyI+MTc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+Rm9vdG5vdGUgOTkgc2hvdWxkIGRpc2N1c3MgdGhlIG5hbWluZyBjbGFzcyB3aGVuIGRlc2NyaWJpbmcgbWVtYmVycyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBmcm9tIGZyaWVuZHM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTgiPjE4PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPmYoVFlQRSkgd2hlcmUgVFlQRSBpcyB2b2lkIHNob3VsZCBiZSBhbGxvd2VkPC90ZD4KLSAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDxhIGhyZWY9IiM1NzciPjU3NzwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxOSI+MTk8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+Q2xhcmlmeSBwcm90ZWN0ZWQgbWVtYmVyIGFjY2VzczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjAiPjIwPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlNvbWUgY2xhcmlmaWNhdGlvbnMgbmVlZGVkIGZvciAxMi44IHBhcmEgMTU8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzIxIj4yMTwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5DYW4gYSBkZWZhdWx0IGFyZ3VtZW50IGZvciBhIHRlbXBsYXRlIHBhcmFtZXRlciBhcHBlYXIgaW4gYSBmcmllbmQgZGVjbGFyYXRpb24/PC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyMiI+MjI8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+VGVtcGxhdGUgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IGFyZ3VtZW50IHRoYXQgcmVmZXJzIHRvIGl0c2VsZjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDQ4MTwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDxhIGhyZWY9IiM0ODEiPjQ4MTwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMyMyI+MjM8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+U29tZSBxdWVzdGlvbnMgcmVnYXJkaW5nIHBhcnRpYWwgb3JkZXJpbmcgb2YgZnVuY3Rpb24gdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyNCI+MjQ8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+RXJyb3JzIGluIGV4YW1wbGVzIGluIDE0LjcuMzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI1Ij4yNTwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5FeGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgYW5kIHBvaW50ZXJzIHRvIG1lbWJlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMjYiPjI2PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkNvcHkgY29uc3RydWN0b3JzIGFuZCBkZWZhdWx0IGFyZ3VtZW50czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMyNyI+Mjc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+T3ZlcmxvYWQgYW1iaWd1aXRpZXMgZm9yIGJ1aWx0aW4gPzogcHJvdG90eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjgiPjI4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPidleGl0JywgJ3NpZ25hbCcgYW5kIHN0YXRpYyBvYmplY3QgZGVzdHJ1Y3Rpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyOSI+Mjk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+TGlua2FnZSBvZiBsb2NhbGx5IGRlY2xhcmVkIGZ1bmN0aW9uczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJzdm4iIGFsaWduPSJjZW50ZXIiPlNWTjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5DbGFuZyAzLjQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzAiPjMwPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlZhbGlkIHVzZXMgb2YgIjxUVD46OnRlbXBsYXRlPC9UVD4iPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlN1cGVyc2VkZWQgYnkgNDY4IChDKysxMSBvbndhcmRzKTwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDxhIGhyZWY9IiM0NjgiPjQ2ODwvYT4gKEMrKzExIG9ud2FyZHMpPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMzEiPjMxPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkxvb2tpbmcgdXAgbmV3L2RlbGV0ZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzIiPjMyPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkNsYXJpZmljYXRpb24gb2YgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBub24tZXhwb3J0ZWQgdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzMiPjMzPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkFyZ3VtZW50IGRlcGVuZGVudCBsb29rdXAgYW5kIG92ZXJsb2FkZWQgZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzM0Ij4zNDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Bcmd1bWVudCBkZXBlbmRlbnQgbG9va3VwIGFuZCBwb2ludHMgb2YgaW5zdGFudGlhdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM1Ij4zNTwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5EZWZpbml0aW9uIG9mIGRlZmF1bHQtaW5pdGlhbGl6YXRpb248L3RkPgotICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDE3ODwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzE3OCI+MTc4PC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjM2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMzYiPjM2PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD48ST51c2luZy1kZWNsYXJhdGlvbjwvST5zIGluIG11bHRpcGxlLWRlY2xhcmF0aW9uIGNvbnRleHRzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMzciPjM3PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPldoZW4gaXMgdW5jYXVnaHRfZXhjZXB0aW9uKCkgdHJ1ZT88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+U3VwZXJzZWRlZCBieSA0NzU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+U3VwZXJzZWRlZCBieSA8YSBocmVmPSIjNDc1Ij40NzU8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM4Ij4zODwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5FeHBsaWNpdCB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIG9wZXJhdG9yIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzkiPjM5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkNvbmZsaWN0aW5nIGFtYmlndWl0eSBydWxlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0MCI+NDA8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+U3ludGF4IG9mIDxJPmRlY2xhcmF0b3ItaWQ8L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDEiPjQxPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkNsYXJpZmljYXRpb24gb2YgbG9va3VwIG9mIG5hbWVzIGFmdGVyIGRlY2xhcmF0b3ItaWQ8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNDIiPjQyPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlJlZGVmaW5pbmcgbmFtZXMgZnJvbSBiYXNlIGNsYXNzZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQzIj40MzwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5Db3B5aW5nIGJhc2UgY2xhc3NlcyAoUE9EcykgdXNpbmcgbWVtY3B5PC90ZD4KICAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDQiPjQ0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk1lbWJlciBzcGVjaWFsaXphdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ1Ij40NTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5BY2Nlc3MgdG8gbmVzdGVkIGNsYXNzZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNDYiPjQ2PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgbWVtYmVyIHRlbXBsYXRlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM0NyI+NDc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+VGVtcGxhdGUgZnJpZW5kIGlzc3VlczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIGNsYXNzPSJzdm4iIGFsaWduPSJjZW50ZXIiPlN1cGVyc2VkZWQgYnkgPGEgaHJlZj0iIzMyOSI+MzI5PC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0OCI+NDg8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbnMgb2YgdW51c2VkIHN0YXRpYyBtZW1iZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0OSI+NDk8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+UmVzdHJpY3Rpb24gb24gbm9uLXR5cGUsIG5vbi12YWx1ZSB0ZW1wbGF0ZSBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjUwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNTAiPjUwPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkNvbnZlcnRpbmcgcG9pbnRlciB0byBpbmNvbXBsZXRlIHR5cGUgdG8gc2FtZSB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1MSI+NTE8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+T3ZlcmxvYWRpbmcgYW5kIHVzZXItZGVmaW5lZCBjb252ZXJzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTIiPjUyPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPk5vbi1zdGF0aWMgbWVtYmVycywgbWVtYmVyIHNlbGVjdGlvbiBhbmQgYWNjZXNzIGNoZWNraW5nPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1MyI+NTM8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+THZhbHVlLXRvLXJ2YWx1ZSBjb252ZXJzaW9uIGJlZm9yZSBjZXJ0YWluIHN0YXRpY19jYXN0czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTQiPjU0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlN0YXRpY19jYXN0IGZyb20gcHJpdmF0ZSBiYXNlIHRvIGRlcml2ZWQgY2xhc3M8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNTUiPjU1PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkFkZGluZy9zdWJ0cmFjdGluZyBwb2ludGVyIGFuZCBlbnVtZXJhdGlvbiB2YWx1ZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTYiPjU2PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlJlZGVjbGFyaW5nIHR5cGVkZWZzIHdpdGhpbiBjbGFzc2VzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjU3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNTciPjU3PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5FbXB0eSB1bmlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTgiPjU4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlNpZ25lZG5lc3Mgb2YgYml0IGZpZWxkcyBvZiBlbnVtIHR5cGU8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU5Ij41OTwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5DbGFyaWZpY2F0aW9uIG9mIG92ZXJsb2FkaW5nIGFuZCBVREMgdG8gcmVmZXJlbmNlIHR5cGU8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzYwIj42MDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5SZWZlcmVuY2UgYmluZGluZyBhbmQgdmFsaWQgY29udmVyc2lvbiBzZXF1ZW5jZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNjEiPjYxPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkFkZHJlc3Mgb2Ygc3RhdGljIG1lbWJlciBmdW5jdGlvbiAiPFRUPiZhbXA7cC0mZ3Q7ZjwvVFQ+IjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjIiPjYyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlVubmFtZWQgbWVtYmVycyBvZiBjbGFzc2VzIHVzZWQgYXMgdHlwZSBwYXJhbWV0ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MyI+NjM8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q2xhc3MgaW5zdGFudGlhdGlvbiBmcm9tIHBvaW50ZXIgY29udmVyc2lvbiB0byB2b2lkKiwgbnVsbCBhbmQgc2VsZjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjQiPjY0PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlBhcnRpYWwgb3JkZXJpbmcgdG8gZGlzYW1iaWd1YXRlIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2NSI+NjU8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+VHlwbyBpbiBkZWZhdWx0IGFyZ3VtZW50IGV4YW1wbGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzY2Ij42NjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5WaXNpYmlsaXR5IG9mIGRlZmF1bHQgYXJncyB2cyBvdmVybG9hZHMgYWRkZWQgYWZ0ZXIgdXNpbmctZGVjbGFyYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjciPjY3PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkV2YWx1YXRpb24gb2YgbGVmdCBzaWRlIG9mIG9iamVjdC1leHByZXNzaW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjgiPjY4PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkdyYW1tYXIgZG9lcyBub3QgYWxsb3cgImZyaWVuZCBjbGFzcyBBJmx0O2ludCZndDs7IjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjkiPjY5PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlN0b3JhZ2UgY2xhc3Mgc3BlY2lmaWVycyBvbiB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjcwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzcwIj43MDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5JcyBhbiBhcnJheSBib3VuZCBhIG5vbmRlZHVjZWQgY29udGV4dD88L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjcxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNzEiPjcxPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkluY29ycmVjdCBjcm9zcyByZWZlcmVuY2U8L3RkPgogICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzcyIj43MjwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5MaW5rYWdlIGFuZCBzdG9yYWdlIGNsYXNzIHNwZWNpZmllcnMgZm9yIHRlbXBsYXRlczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgNjk8L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDxhIGhyZWY9IiM2OSI+Njk8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjczIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzczIj43MzwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5Qb2ludGVyIGVxdWFsaXR5PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc0Ij43NDwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5FbnVtZXJhdGlvbiB2YWx1ZSBpbiBkaXJlY3QtbmV3LWRlY2xhcmF0b3I8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc1Ij43NTwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5Jbi1jbGFzcyBpbml0aWFsaXplZCBtZW1iZXJzIG11c3QgYmUgY29uc3Q8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc2Ij43NjwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5BcmUgY29uc3Qgdm9sYXRpbGUgdmFyaWFibGVzIGNvbnNpZGVyZWQgImNvbnN0YW50IGV4cHJlc3Npb25zIj88L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc3Ij43NzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5UaGUgZGVmaW5pdGlvbiBvZiBmcmllbmQgZG9lcyBub3QgYWxsb3cgbmVzdGVkIGNsYXNzZXMgdG8gYmUgZnJpZW5kczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzgiPjc4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlNlY3Rpb24gOC41IHBhcmFncmFwaCA5IHNob3VsZCBzdGF0ZSBpdCBvbmx5IGFwcGxpZXMgdG8gbm9uLXN0YXRpYyBvYmplY3RzPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlN1cGVyc2VkZWQgYnkgPz8/PzwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDxhIGhyZWY9IiM/Pz8/Ij4/Pz8/PC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzc5Ij43OTwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5BbGlnbm1lbnQgYW5kIHBsYWNlbWVudCBuZXc8L3RkPgogICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4MCI+ODA8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+Q2xhc3MgbWVtYmVycyB3aXRoIHNhbWUgbmFtZSBhcyBjbGFzczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM4MSI+ODE8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+TnVsbCBwb2ludGVycyBhbmQgQyBjb21wYXRpYmlsaXR5PC90ZD4KICAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM4MiI+ODI8L2E+PC90ZD4KICAgICA8dGQ+ZHVwPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbiBvZiAidXNpbmciIGEgY29uc3RhbnQgZXhwcmVzc2lvbjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgNDg8L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDxhIGhyZWY9IiM0OCI+NDg8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzgzIj44MzwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5PdmVybG9hZGluZyBhbmQgZGVwcmVjYXRlZCBjb252ZXJzaW9uIG9mIHN0cmluZyBsaXRlcmFsPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4NCI+ODQ8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+T3ZlcmxvYWRpbmcgYW5kIGNvbnZlcnNpb24gbG9vcGhvbGUgdXNlZCBieSA8VFQ+YXV0b19wdHI8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODUiPjg1PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlJlZGVjbGFyYXRpb24gb2YgbWVtYmVyIGNsYXNzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4NiI+ODY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+TGlmZXRpbWUgb2YgdGVtcG9yYXJpZXMgaW4gcXVlcnkgZXhwcmVzc2lvbnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDQ0NjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzQ0NiI+NDQ2PC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4NyI+ODc8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIG9uIGZ1bmN0aW9uIHBhcmFtZXRlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM4OCI+ODg8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+U3BlY2lhbGl6YXRpb24gb2YgbWVtYmVyIGNvbnN0YW50IHRlbXBsYXRlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODkiPjg5PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPk9iamVjdCBsaWZldGltZSBkb2VzIG5vdCBhY2NvdW50IGZvciByZWZlcmVuY2UgcmViaW5kaW5nPC90ZD4KICAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTAiPjkwPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlNob3VsZCB0aGUgZW5jbG9zaW5nIGNsYXNzIGJlIGFuICJhc3NvY2lhdGVkIGNsYXNzIiB0b28/PC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzkxIj45MTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5BIHVuaW9uJ3MgYXNzb2NpYXRlZCB0eXBlcyBzaG91bGQgaW5jbHVkZSB0aGUgdW5pb24gaXRzZWxmPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iOTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM5MiI+OTI8L2E+PC90ZD4KLSAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+U2hvdWxkIDxJPmV4Y2VwdGlvbi1zcGVjaWZpY2F0aW9uPC9JPnMgYmUgcGFydCBvZiB0aGUgdHlwZSBzeXN0ZW0/PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5MyI+OTM8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+TWlzc2luZyB3b3JkIGluIDMuOCA8VT5iYXNpYy5saWZlPC9VPiBwYXJhZ3JhcGggMjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk0Ij45NDwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5JbmNvbnNpc3RlbmNpZXMgaW4gdGhlIGRlc2NyaXB0aW9ucyBvZiBjb25zdGFudCBleHByZXNzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM5NSI+OTU8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RWxhYm9yYXRlZCB0eXBlIHNwZWNpZmllcnMgcmVmZXJlbmNpbmcgbmFtZXMgZGVjbGFyZWQgaW4gZnJpZW5kIGRlY2xzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5NiI+OTY8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+U3ludGFjdGljIGRpc2FtYmlndWF0aW9uIHVzaW5nIHRoZSA8VFQ+dGVtcGxhdGU8L1RUPiBrZXl3b3JkPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjOTciPjk3PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlVzZSBvZiBib29sIGNvbnN0YW50cyBpbiBpbnRlZ3JhbCBjb25zdGFudCBleHByZXNzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTgiPjk4PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkJyYW5jaGluZyBpbnRvIHRyeSBibG9jazwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM5OSI+OTk8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+UGFydGlhbCBvcmRlcmluZywgcmVmZXJlbmNlcyBhbmQgY3YtcXVhbGlmaWVyczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDIxNDwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDxhIGhyZWY9IiMyMTQiPjIxNDwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwMCI+MTAwPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkNsYXJpZnkgd2h5IHN0cmluZyBsaXRlcmFscyBhcmUgbm90IGFsbG93ZWQgYXMgdGVtcGxhdGUgYXJndW1lbnRzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTAxIj4xMDE8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+UmVkZWNsYXJhdGlvbiBvZiBleHRlcm4gIkMiIG5hbWVzIHZpYSB1c2luZy1kZWNsYXJhdGlvbnM8L3RkPgotICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQgY2xhc3M9InN2biIgYWxpZ249ImNlbnRlciI+U1ZOPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEwMiI+MTAyPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPk9wZXJhdG9yIGxvb2t1cCBydWxlcyBkbyBub3Qgd29yayB3ZWxsIHdpdGggcGFydHMgb2YgdGhlIGxpYnJhcnk8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDMiPjEwMzwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5JcyBpdCA8ST5leHRlbmRlZC1uYW1lc3BhY2UtZGVmaW5pdGlvbjwvST4gb3IgPEk+ZXh0ZW5zaW9uLW5hbWVzcGFjZS1kZWZpbml0aW9uPC9JPiA/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTA0Ij4xMDQ8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RGVzdHJveWluZyB0aGUgZXhjZXB0aW9uIHRlbXAgd2hlbiBubyBoYW5kbGVyIGlzIGZvdW5kPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNSI+MTA1PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPk1lYW5pbmcgb2YgInRlbXBsYXRlIGZ1bmN0aW9uIjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDYiPjEwNjwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5DcmVhdGluZyByZWZlcmVuY2VzIHRvIHJlZmVyZW5jZXMgZHVyaW5nIHRlbXBsYXRlIGRlZHVjdGlvbi9pbnN0YW50aWF0aW9uPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlN1cGVyc2VkZWQgYnkgNTQwPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlN1cGVyc2VkZWQgYnkgPGEgaHJlZj0iIzU0MCI+NTQwPC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMDciPjEwNzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5MaW5rYWdlIG9mIG9wZXJhdG9yIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwOCI+MTA4PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkFyZSBjbGFzc2VzIG5lc3RlZCBpbiB0ZW1wbGF0ZXMgZGVwZW5kZW50PzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTA5Ij4xMDk8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+QWxsb3dpbmcgPFRUPjo6dGVtcGxhdGU8L1RUPiBpbiA8ST51c2luZy1kZWNsYXJhdGlvbjwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjExMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzExMCI+MTEwPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5DYW4gdGVtcGxhdGUgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGJlIGRlY2xhcmVkIGluIHRoZSBzYW1lIHNjb3BlPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMTEiPjExMTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Db3B5IGNvbnN0cnVjdG9ycyBhbmQgY3YtcXVhbGlmaWVyczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgNTM1PC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjNTM1Ij41MzU8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTIiPjExMjwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5BcnJheSB0eXBlcyBhbmQgY3YtcXVhbGlmaWVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExMyI+MTEzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlZpc2liaWxpdHkgb2YgY2FsbGVkIGZ1bmN0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMTQiPjExNDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5WaXJ0dWFsIG92ZXJyaWRpbmcgYnkgdGVtcGxhdGUgbWVtYmVyIGZ1bmN0aW9uIHNwZWNpYWxpemF0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExNSI+MTE1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkFkZHJlc3Mgb2YgdGVtcGxhdGUtaWQ8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTYiPjExNjwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5FcXVpdmFsZW50IGFuZCBmdW5jdGlvbmFsbHktZXF1aXZhbGVudCBmdW5jdGlvbiB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzExNyI+MTE3PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlRpbWluZyBvZiBkZXN0cnVjdGlvbiBvZiB0ZW1wb3JhcmllczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTgiPjExODwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5DYWxscyB2aWEgcG9pbnRlcnMgdG8gdmlydHVhbCBtZW1iZXIgZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExOSI+MTE5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk9iamVjdCBsaWZldGltZSBhbmQgYWdncmVnYXRlIGluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMCI+MTIwPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPk5vbmV4aXN0ZW50IG5vbi10ZXJtaW5hbCA8ST5xdWFsaWZpZWQtbmFtZTwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTIxIj4xMjE8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+RGVwZW5kZW50IHR5cGUgbmFtZXMgd2l0aCBub24tZGVwZW5kZW50IDxJPm5lc3RlZC1uYW1lLXNwZWNpZmllcjwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTIyIj4xMjI8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+PEk+dGVtcGxhdGUtaWQ8L0k+cyBhcyA8ST51bnF1YWxpZmllZC1pZDwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTIzIj4xMjM8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+QmFkIGNyb3NzLXJlZmVyZW5jZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjQiPjEyNDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5MaWZldGltZSBvZiB0ZW1wb3JhcmllcyBpbiBkZWZhdWx0IGluaXRpYWxpemF0aW9uIG9mIGNsYXNzIGFycmF5czwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgMjAxPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjMjAxIj4yMDE8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjUiPjEyNTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5BbWJpZ3VpdHkgaW4gPFRUPmZyaWVuZDwvVFQ+IGRlY2xhcmF0aW9uIHN5bnRheDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyNiI+MTI2PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBhbmQgPFRUPmNvbnN0PC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyNyI+MTI3PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkFtYmlndWl0eSBpbiBkZXNjcmlwdGlvbiBvZiBtYXRjaGluZyBkZWFsbG9jYXRpb24gZnVuY3Rpb248L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjgiPjEyODwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5DYXN0aW5nIGJldHdlZW4gZW51bSB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyOSI+MTI5PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5TdGFiaWxpdHkgb2YgdW5pbml0aWFsaXplZCBhdXRvIHZhcmlhYmxlczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgNjE2PC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjNjE2Ij42MTY8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEzMCI+MTMwPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlNlcXVlbmNlIHBvaW50cyBhbmQgPEk+bmV3LWV4cHJlc3Npb248L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzEiPjEzMTwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5UeXBvIGluIExhbyBjaGFyYWN0ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMzIiPjEzMjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Mb2NhbCB0eXBlcyBhbmQgbGlua2FnZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMzMiPjEzMzwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5FeGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgYW5kIGNoZWNraW5nPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA4NzwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzg3Ij44NzwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzNCI+MTM0PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlRlbXBsYXRlIGNsYXNzZXMgYW5kIDxJPmRlY2xhcmF0b3ItaWQ8L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzUiPjEzNTwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5DbGFzcyB0eXBlIGluIGluLWNsYXNzIG1lbWJlciBmdW5jdGlvbiBkZWZpbml0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzNiI+MTM2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkRlZmF1bHQgYXJndW1lbnRzIGFuZCBmcmllbmQgZGVjbGFyYXRpb25zPC90ZD4KLSAgICA8dGQgY2xhc3M9InN2biIgYWxpZ249ImNlbnRlciI+U1ZOPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkNsYW5nIDMuNDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM3Ij4xMzc8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+PFRUPnN0YXRpY19jYXN0PC9UVD4gb2YgPEk+Y3Y8L0k+IDxUVD52b2lkKjwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEzOCI+MTM4PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+RnJpZW5kIGRlY2xhcmF0aW9uIG5hbWUgbG9va3VwPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzkiPjEzOTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5FcnJvciBpbiA8VFQ+ZnJpZW5kPC9UVD4gbG9va3VwIGV4YW1wbGU8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDAiPjE0MDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5BZ3JlZW1lbnQgb2YgcGFyYW1ldGVyIGRlY2xhcmF0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MSI+MTQxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk5vbi1tZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGVzIGluIG1lbWJlciBhY2Nlc3MgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDIiPjE0MjwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5JbmplY3Rpb24tcmVsYXRlZCBlcnJvcnMgaW4gYWNjZXNzIGV4YW1wbGU8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDMiPjE0MzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5GcmllbmRzIGFuZCBLb2VuaWcgbG9va3VwPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE0NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0NCI+MTQ0PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5Qb3NpdGlvbiBvZiA8VFQ+ZnJpZW5kPC9UVD4gc3BlY2lmaWVyPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDUiPjE0NTwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5EZXByZWNhdGlvbiBvZiBwcmVmaXggPFRUPisrPC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTQ2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTQ2Ij4xNDY8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkZsb2F0aW5nLXBvaW50IHplcm88L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0NyI+MTQ3PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPk5hbWluZyB0aGUgY29uc3RydWN0b3I8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0OCI+MTQ4PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlBPRCBjbGFzc2VzIGFuZCBwb2ludGVycyB0byBtZW1iZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ5Ij4xNDk8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+QWNjZXNzaWJpbGl0eSBhbmQgYW1iaWd1aXR5PC90ZD4KICAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNTAiPjE1MDwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+VGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhbmQgZGVmYXVsdCBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTUxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1MSI+MTUxPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlRlcm1pbm9sb2d5IG9mIHplcm8taW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTIiPjE1MjwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD48VFQ+ZXhwbGljaXQ8L1RUPiBjb3B5IGNvbnN0cnVjdG9yczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTUzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1MyI+MTUzPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPk1pc2xlYWRpbmcgd29yZGluZyAocmFuayBvZiBjb252ZXJzaW9uKTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE1NCI+MTU0PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkFub255bW91cyB1bmlvbnMgaW4gdW5uYW1lZCBuYW1lc3BhY2VzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNTUiPjE1NTwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5CcmFjZSBpbml0aWFsaXplciBmb3Igc2NhbGFyPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA2MzI8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDxhIGhyZWY9IiM2MzIiPjYzMjwvYT48L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNTYiPjE1NjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk5hbWUgbG9va3VwIGZvciBjb252ZXJzaW9uIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE1NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1NyI+MTU3PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5PbWl0dGVkIHR5cGVkZWYgZGVjbGFyYXRvcjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTU4Ij4xNTg8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+QWxpYXNpbmcgYW5kIHF1YWxpZmljYXRpb24gY29udmVyc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTU5Ij4xNTk8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+TmFtZXNwYWNlIHF1YWxpZmljYXRpb24gaW4gZGVjbGFyYXRvcnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZCBjbGFzcz0ic3ZuIiBhbGlnbj0iY2VudGVyIj5TVk48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTYwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE2MCI+MTYwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk1pc3NpbmcgPFRUPnN0ZDo6PC9UVD4gcXVhbGlmaWNhdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjEiPjE2MTwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5BY2Nlc3MgdG8gcHJvdGVjdGVkIG5lc3RlZCB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTYyIj4xNjI8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+KDxUVD4mYW1wO0M6OmYpKCk8L1RUPiB3aXRoIG5vbnN0YXRpYyBtZW1iZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjMiPjE2MzwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5EZXNjcmlwdGlvbiBvZiBzdWJhZ2dyZWdhdGUgaW5pdGlhbGl6ZXI8L3RkPgogICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNjQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTY0Ij4xNjQ8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+T3ZlcmxhcCBiZXR3ZWVuIEtvZW5pZyBhbmQgbm9ybWFsIGxvb2t1cDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTY1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTY1Ij4xNjU8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbnMgb2YgZnJpZW5kcyBhbmQgYmxvY2stc2NvcGUgZXh0ZXJuczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTY2Ij4xNjY8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+RnJpZW5kIGRlY2xhcmF0aW9ucyBvZiA8ST50ZW1wbGF0ZS1pZDwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNjciPjE2NzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5EZXByZWNhdGluZyBzdGF0aWMgZnVuY3Rpb25zPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlN1cGVyc2VkZWQgYnkgMTAxMjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDxhIGhyZWY9IiMxMDEyIj4xMDEyPC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNjgiPjE2ODwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5DIGxpbmthZ2UgZm9yIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE2OSI+MTY5PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPjxJPnRlbXBsYXRlLWlkPC9JPnMgaW4gPEk+dXNpbmctZGVjbGFyYXRpb248L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzAiPjE3MDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlBvaW50ZXItdG8tbWVtYmVyIGNvbnZlcnNpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE3MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNzEiPjE3MTwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5HbG9iYWwgbmFtZXNwYWNlIHNjb3BlPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTcyIj4xNzI8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+VW5zaWduZWQgaW50IGFzIHVuZGVybHlpbmcgdHlwZSBvZiBlbnVtPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTczIj4xNzM8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+Q29uc3RyYWludHMgb24gZXhlY3V0aW9uIGNoYXJhY3RlciBzZXQ8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE3NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE3NCI+MTc0PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlVuZGVwcmVjYXRpbmcgZ2xvYmFsIHN0YXRpYzwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDEwMTI8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+U3VwZXJzZWRlZCBieSA8YSBocmVmPSIjMTAxMiI+MTAxMjwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTc1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3NSI+MTc1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkNsYXNzIG5hbWUgaW5qZWN0aW9uIGFuZCBiYXNlIG5hbWUgYWNjZXNzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNzYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTc2Ij4xNzY8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+TmFtZSBpbmplY3Rpb24gYW5kIHRlbXBsYXRlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTc3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3NyI+MTc3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkx2YWx1ZXMgdnMgcnZhbHVlcyBpbiBjb3B5LWluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNzgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTc4Ij4xNzg8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+TW9yZSBvbiB2YWx1ZS1pbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTc5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3OSI+MTc5PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBzdWJ0cmFjdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTgwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE4MCI+MTgwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPjxUVD50eXBlbmFtZTwvVFQ+IGFuZCBlbGFib3JhdGVkIHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxODEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTgxIj4xODE8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+RXJyb3JzIGluIHRlbXBsYXRlIDxJPnRlbXBsYXRlLXBhcmFtZXRlcjwvST4gZXhhbXBsZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTgyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTgyIj4xODI8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+QWNjZXNzIGNoZWNraW5nIG9uIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTgzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE4MyI+MTgzPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPjxUVD50eXBlbmFtZTwvVFQ+IGluIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDM4MjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDxhIGhyZWY9IiMzODIiPjM4MjwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTg0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE4NCI+MTg0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkRlZmF1bHQgYXJndW1lbnRzIGluIHRlbXBsYXRlIDxJPnRlbXBsYXRlLXBhcmFtZXRlcjwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxODUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTg1Ij4xODU8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+Ik5hbWVkIiB0ZW1wb3JhcmllcyBhbmQgY29weSBlbGlzaW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODYiPjE4NjwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+TmFtZSBoaWRpbmcgYW5kIHRlbXBsYXRlIDxJPnRlbXBsYXRlLXBhcmFtZXRlcjwvST5zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE4NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxODciPjE4NzwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5TY29wZSBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbmFtZXM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+U3VwZXJzZWRlZCBieSA0ODE8L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+U3VwZXJzZWRlZCBieSA8YSBocmVmPSIjNDgxIj40ODE8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE4OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxODgiPjE4ODwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5Db21tYSBvcGVyYXRvciBhbmQgcnZhbHVlIGNvbnZlcnNpb248L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTg5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTg5Ij4xODk8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5EZWZpbml0aW9uIG9mIDxJPm9wZXJhdG9yPC9JPiBhbmQgPEk+cHVuY3R1YXRvcjwvST48L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTkwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE5MCI+MTkwPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkxheW91dC1jb21wYXRpYmxlIFBPRC1zdHJ1Y3QgdHlwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE5MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE5MSI+MTkxPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5OYW1lIGxvb2t1cCBkb2VzIG5vdCBoYW5kbGUgY29tcGxleCBuZXN0aW5nPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTkyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTkyIj4xOTI8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5OYW1lIGxvb2t1cCBpbiBwYXJhbWV0ZXJzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE5MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxOTMiPjE5MzwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5PcmRlciBvZiBkZXN0cnVjdGlvbiBvZiBsb2NhbCBhdXRvbWF0aWNzIG9mIGRlc3RydWN0b3I8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxOTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTk0Ij4xOTQ8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+SWRlbnRpZnlpbmcgY29uc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxOTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTk1Ij4xOTU8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q29udmVydGluZyBiZXR3ZWVuIGZ1bmN0aW9uIGFuZCBvYmplY3QgcG9pbnRlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTk2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTk2Ij4xOTY8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkFyZ3VtZW50cyB0byBkZWFsbG9jYXRpb24gZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE5NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxOTciPjE5NzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Jc3N1ZXMgd2l0aCB0d28tc3RhZ2UgbG9va3VwIG9mIGRlcGVuZGVudCBuYW1lczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTk4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE5OCI+MTk4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb24gb2YgInVzZSIgaW4gbG9jYWwgYW5kIG5lc3RlZCBjbGFzc2VzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxOTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTk5Ij4xOTk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+T3JkZXIgb2YgZGVzdHJ1Y3Rpb24gb2YgdGVtcG9yYXJpZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyMDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMyMDAiPjIwMDwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5QYXJ0aWFsIG9yZGVyaW5nIGFuZCBleHBsaWNpdCBhcmd1bWVudHM8L3RkPgotICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDIxNDwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzIxNCI+MjE0PC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyMDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjAxIj4yMDE8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+T3JkZXIgb2YgZGVzdHJ1Y3Rpb24gb2YgdGVtcG9yYXJpZXMgaW4gaW5pdGlhbGl6ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjAyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzIwMiI+MjAyPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlVzZSBvZiBvdmVybG9hZGVkIGZ1bmN0aW9uIG5hbWU8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMjAzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMjAzIj4yMDM8L2E+PC90ZD4KICAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+VHlwZSBvZiBhZGRyZXNzLW9mLW1lbWJlciBleHByZXNzaW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIwNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyMDQiPjIwNDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5FeHBvcnRlZCBjbGFzcyB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIyMDUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMyMDUiPjIwNTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlRlbXBsYXRlcyBhbmQgc3RhdGljIGRhdGEgbWVtYmVyczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyMDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjA2Ij4yMDY8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+U2VtYW50aWMgY29uc3RyYWludHMgb24gbm9uLWRlcGVuZGVudCBuYW1lczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjA3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzIwNyI+MjA3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPjxJPnVzaW5nLWRlY2xhcmF0aW9uPC9JPnMgYW5kIHByb3RlY3RlZCBhY2Nlc3M8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIwOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyMDgiPjIwODwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5SZXRocm93aW5nIGV4Y2VwdGlvbnMgaW4gbmVzdGVkIGhhbmRsZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjA5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMjA5Ij4yMDk8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+TXVzdCBmcmllbmQgZGVjbGFyYXRpb24gbmFtZXMgYmUNCiBhY2Nlc3NpYmxlPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjEwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzIxMCI+MjEwPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPldoYXQgaXMgdGhlIHR5cGUgbWF0Y2hlZCBieSBhbiBleGNlcHRpb24gaGFuZGxlcj88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyMTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMyMTEiPjIxMTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Db25zdHJ1Y3RvcnMgc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIHJldHVybiBub3JtYWxseSBhZnRlciBhbiBleGNlcHRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMjEyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMjEyIj4yMTI8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5JbXBsaWNpdCBpbnN0YW50aWF0aW9uIGlzIG5vdCBkZXNjcmliZWQgY2xlYXJseSBlbm91Z2g8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjEzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzIxMyI+MjEzPC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkxvb2t1cCBpbiBkZXBlbmRlbnQgYmFzZSBjbGFzc2VzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyMTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjE0Ij4yMTQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+UGFydGlhbCBvcmRlcmluZyBvZiBmdW5jdGlvbiB0ZW1wbGF0ZXMgaXMgdW5kZXJzcGVjaWZpZWQ8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIxNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyMTUiPjIxNTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5UZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBub3QgYWxsb3dlZCBpbiA8ST5uZXN0ZWQtbmFtZS1zcGVjaWZpZXI8L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjE2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzIxNiI+MjE2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkxpbmthZ2Ugb2YgbmFtZWxlc3MgY2xhc3Mtc2NvcGUgZW51bWVyYXRpb24gdHlwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjE3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzIxNyI+MjE3PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPkRlZmF1bHQgYXJndW1lbnRzIGZvciBub24tdGVtcGxhdGUgbWVtYmVyIGZ1bmN0aW9ucyBvZiBjbGFzcyB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIxOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyMTgiPjIxODwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5TcGVjaWZpY2F0aW9uIG9mIEtvZW5pZyBsb29rdXA8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIxOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzIxOSI+MjE5PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkNhbm5vdCBkZWZlbmQgYWdhaW5zdCBkZXN0cnVjdG9ycyB0aGF0IHRocm93IGV4Y2VwdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyMjAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjIwIj4yMjA8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+QWxsIGRlYWxsb2NhdGlvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHJlcXVpcmVkIG5vdCB0byB0aHJvdzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIyMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyMjEiPjIyMTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5NdXN0IGNvbXBvdW5kIGFzc2lnbm1lbnQgb3BlcmF0b3JzIGJlIG1lbWJlciBmdW5jdGlvbnM/PC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyMjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjIyIj4yMjI8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+U2VxdWVuY2UgcG9pbnRzIGFuZCBsdmFsdWUtcmV0dXJuaW5nIG9wZXJhdG9yczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjNjM3Ij42Mzc8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIyMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyMjMiPjIyMzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+VGhlIG1lYW5pbmcgb2YgZGVwcmVjYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyMjQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjI0Ij4yMjQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbiBvZiBkZXBlbmRlbnQgbmFtZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjI1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMjI1Ij4yMjU8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+S29lbmlnIGxvb2t1cCBhbmQgZnVuZGFtZW50YWwgdHlwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIyNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyMjYiPjIyNjwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5EZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIyNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyMjciPjIyNzwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5Ib3cgbWFueSBzY29wZXMgaW4gYW4gPFRUPmlmPC9UVD4gc3RhdGVtZW50PzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjI4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzIyOCI+MjI4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlVzZSBvZiA8VFQ+dGVtcGxhdGU8L1RUPiBrZXl3b3JkIHdpdGggbm9uLW1lbWJlciB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIyOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzIyOSI+MjI5PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2YgZnVuY3Rpb24gdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMjMwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMjMwIj4yMzA8L2E+PC90ZD4KLSAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+Q2FsbHMgdG8gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjMxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMjMxIj4yMzE8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+VmlzaWJpbGl0eSBvZiBuYW1lcyBhZnRlciA8ST51c2luZy1kaXJlY3RpdmU8L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIyMzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMyMzIiPjIzMjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPklzIGluZGlyZWN0aW9uIHRocm91Z2ggYSBudWxsIHBvaW50ZXIgdW5kZWZpbmVkIGJlaGF2aW9yPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjIzMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzIzMyI+MjMzPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5SZWZlcmVuY2VzIHZzIHBvaW50ZXJzIGluIFVEQyBvdmVybG9hZCByZXNvbHV0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIzNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzIzNCI+MjM0PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlJldXNlIG9mIGJhc2UgY2xhc3Mgc3Vib2JqZWN0czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjIzNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyMzUiPjIzNTwvYT48L3RkPgogICAgIDx0ZD5UQzE8L3RkPgogICAgIDx0ZD5Bc3NpZ25tZW50IHZzIGluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjM2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMjM2Ij4yMzY8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RXhwbGljaXQgdGVtcG9yYXJpZXMgYW5kIGludGVncmFsIGNvbnN0YW50IGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyMzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjM3Ij4yMzc8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RXhwbGljaXQgaW5zdGFudGlhdGlvbiBhbmQgYmFzZSBjbGFzcyBtZW1iZXJzPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA0NzA8L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDxhIGhyZWY9IiM0NzAiPjQ3MDwvYT48L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIyMzgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMyMzgiPjIzODwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+UHJlY2lzaW9uIGFuZCBhY2N1cmFjeSBjb25zdHJhaW50cyBvbiBmbG9hdGluZyBwb2ludDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyMzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjM5Ij4yMzk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Rm9vdG5vdGUgMTE2IGFuZCBLb2VuaWcgbG9va3VwPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjQwIj4yNDA8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlVuaW5pdGlhbGl6ZWQgdmFsdWVzIGFuZCB1bmRlZmluZWQgYmVoYXZpb3I8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDYxNjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzYxNiI+NjE2PC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjQxIj4yNDE8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+RXJyb3IgaW4gZXhhbXBsZSBpbiAxNC44LjE8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMjQyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMjQyIj4yNDI8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkludGVycHJldGF0aW9uIG9mIG9sZC1zdHlsZSBjYXN0czwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNDMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMyNDMiPjI0MzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5XZWlnaHRpbmcgb2YgY29udmVyc2lvbiBmdW5jdGlvbnMgaW4gZGlyZWN0LWluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNDQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjQ0Ij4yNDQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RGVzdHJ1Y3RvciBsb29rdXA8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjQ1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI0NSI+MjQ1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk5hbWUgbG9va3VwIGluIDxJPmVsYWJvcmF0ZWQtdHlwZS1zcGVjaWZpZXI8L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjQ2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI0NiI+MjQ2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkp1bXBzIGluIDxJPmZ1bmN0aW9uLXRyeS1ibG9jazwvST4gaGFuZGxlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI0NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzI0NyI+MjQ3PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlBvaW50ZXItdG8tbWVtYmVyIGNhc3RzIGFuZCBmdW5jdGlvbiBvdmVybG9hZCByZXNvbHV0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNDgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjQ4Ij4yNDg8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+SWRlbnRpZmllciBjaGFyYWN0ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllcyAoQysrMTEgb253YXJkcyk8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjQ5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI0OSI+MjQ5PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPldoYXQgaXMgYSBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGU/PC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjUwIj4yNTA8L2E+PC90ZD4KICAgICA8dGQ+VEMxPC90ZD4KICAgICA8dGQ+QWRkcmVzcyBvZiBmdW5jdGlvbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aXRoIG5vbi1kZWR1Y2VkIHRlbXBsYXRlIGFyZ3VtZW50czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIyNTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMyNTEiPjI1MTwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+SG93IG1hbnkgc2lnbmVkIGludGVnZXIgdHlwZXMgYXJlIHRoZXJlPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjUyIj4yNTI8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+TG9va2luZyB1cCBkZWFsbG9jYXRpb24gZnVuY3Rpb25zIGluIHZpcnR1YWwgZGVzdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMjUzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMjUzIj4yNTM8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5XaHkgbXVzdCBlbXB0eSBvciBmdWxseS1pbml0aWFsaXplZCBjb25zdCBvYmplY3RzIGJlIGluaXRpYWxpemVkPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjU0Ij4yNTQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbmFsIHByb2JsZW1zIHdpdGggPEk+ZWxhYm9yYXRlZC10eXBlLXNwZWNpZmllcjwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjI1NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzI1NSI+MjU1PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+UGxhY2VtZW50IGRlYWxsb2NhdGlvbiBmdW5jdGlvbnMgYW5kIGxvb2t1cCBhbWJpZ3VpdHk8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjU2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI1NiI+MjU2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk92ZXJmbG93IGluIHNpemUgY2FsY3VsYXRpb25zPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA2MjQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDxhIGhyZWY9IiM2MjQiPjYyNDwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjU3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI1NyI+MjU3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkFic3RyYWN0IGJhc2UgY29uc3RydWN0b3JzIGFuZCB2aXJ0dWFsIGJhc2UgaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI1OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyNTgiPjI1ODwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD48ST51c2luZy1kZWNsYXJhdGlvbjwvST5zIGFuZCBjdi1xdWFsaWZpZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjU5Ij4yNTk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+UmVzdHJpY3Rpb25zIG9uIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGFuZCBpbnN0YW50aWF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllcyAoQysrMTEgb253YXJkcyk8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIyNjAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMyNjAiPjI2MDwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+VXNlci1kZWZpbmVkIGNvbnZlcnNpb25zIGFuZCBidWlsdC1pbiA8VFQ+b3BlcmF0b3I9PC9UVD48L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjYxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI2MSI+MjYxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPldoZW4gaXMgYSBkZWFsbG9jYXRpb24gZnVuY3Rpb24gInVzZWQ/IjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjYyIj4yNjI8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RGVmYXVsdCBhcmd1bWVudHMgYW5kIGVsbGlwc2lzPC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNjMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjYzIj4yNjM8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q2FuIGEgY29uc3RydWN0b3IgYmUgZGVjbGFyZWQgYSBmcmllbmQ/PC90ZD4KICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjI2NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzI2NCI+MjY0PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5VbnVzYWJsZSB0ZW1wbGF0ZSBjb25zdHJ1Y3RvcnMgYW5kIGNvbnZlcnNpb24gZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI2NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzI2NSI+MjY1PC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPkRlc3RydWN0b3JzLCBleGNlcHRpb25zLCBhbmQgZGVhbGxvY2F0aW9uPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiAzNTM8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDxhIGhyZWY9IiMzNTMiPjM1MzwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjY2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMjY2Ij4yNjY8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+Tm8gZ3JhbW1hciBzZW50ZW5jZSBzeW1ib2w8L3RkPgogICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjI2NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzI2NyI+MjY3PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5BbGlnbm1lbnQgcmVxdWlyZW1lbnQgZm9yIDxJPm5ldy1leHByZXNzaW9uPC9JPnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIyNjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMyNjgiPjI2ODwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+TWFjcm8gbmFtZSBzdXBwcmVzc2lvbiBpbiByZXNjYW5uZWQgcmVwbGFjZW1lbnQgdGV4dDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNjkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMyNjkiPjI2OTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5PcmRlciBvZiBpbml0aWFsaXphdGlvbiBvZiBtdWx0aXBseS1kZWZpbmVkIHN0YXRpYyBkYXRhIG1lbWJlcnMNCiBvZiBjbGFzcyB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNzAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjcwIj4yNzA8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+T3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gb2Ygc3RhdGljIGRhdGEgbWVtYmVycyBvZiBjbGFzcyB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjI3MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzI3MSI+MjcxPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5FeHBsaWNpdCBpbnN0YW50aWF0aW9uIGFuZCB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjcyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI3MiI+MjcyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0IGRlc3RydWN0b3IgaW52b2NhdGlvbiBhbmQgPEk+cXVhbGlmaWVkLWlkPC9JPnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjczIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI3MyI+MjczPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlBPRCBjbGFzc2VzIGFuZCA8VFQ+b3BlcmF0b3ImYW1wOygpPC9UVD48L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjc0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI3NCI+Mjc0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkN2LXF1YWxpZmljYXRpb24gYW5kIGNoYXItYWxpYXMgYWNjZXNzIHRvIG91dC1vZi1saWZldGltZSBvYmplY3RzPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNzUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjc1Ij4yNzU8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RXhwbGljaXQgaW5zdGFudGlhdGlvbi9zcGVjaWFsaXphdGlvbiBhbmQgPEk+dXNpbmctZGlyZWN0aXZlPC9JPnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyNzYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjc2Ij4yNzY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+T3JkZXIgb2YgZGVzdHJ1Y3Rpb24gb2YgcGFyYW1ldGVycyBhbmQgdGVtcG9yYXJpZXM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI3NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyNzciPjI3NzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5aZXJvLWluaXRpYWxpemF0aW9uIG9mIHBvaW50ZXJzPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMjc4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMjc4Ij4yNzg8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkV4dGVybmFsIGxpbmthZ2UgYW5kIG5hbWVsZXNzIGVudGl0aWVzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMjc5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMjc5Ij4yNzk8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkNvcnJlc3BvbmRlbmNlIG9mICJuYW1lcyBmb3IgbGlua2FnZSBwdXJwb3NlcyI8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjgwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI4MCI+MjgwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkFjY2VzcyBhbmQgc3Vycm9nYXRlIGNhbGwgZnVuY3Rpb25zPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI4MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyODEiPjI4MTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD48VFQ+aW5saW5lPC9UVD4gc3BlY2lmaWVyIGluIDxUVD5mcmllbmQ8L1RUPiBkZWNsYXJhdGlvbnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjI4MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzI4MiI+MjgyPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5OYW1lc3BhY2UgZm9yIDxUVD5leHRlbmRlZF90eXBlX2luZm88L1RUPjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyODMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjgzIj4yODM8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+VGVtcGxhdGUgPEk+dHlwZS1wYXJhbWV0ZXI8L0k+cyBhcmUgbm90IHN5bnRhY3RpY2FsbHkgPEk+dHlwZS1uYW1lPC9JPnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjg0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI4NCI+Mjg0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPjxJPnF1YWxpZmllZC1pZDwvST5zIGluIGNsYXNzIGRlY2xhcmF0aW9uczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI4NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzI4NSI+Mjg1PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPklkZW50aWZ5aW5nIGEgZnVuY3Rpb24gdGVtcGxhdGUgYmVpbmcgc3BlY2lhbGl6ZWQ8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjg2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI4NiI+Mjg2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkluY29ycmVjdCBleGFtcGxlIGluIHBhcnRpYWwgc3BlY2lhbGl6YXRpb248L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIyODciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMyODciPjI4NzwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk9yZGVyIGRlcGVuZGVuY2llcyBpbiB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI4OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyODgiPjI4ODwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5NaXN1c2Ugb2YgInN0YXRpYyB0eXBlIiBpbiBkZXNjcmliaW5nIHBvaW50ZXJzPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyODkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjg5Ij4yODk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+SW5jb21wbGV0ZSBsaXN0IG9mIGNvbnRleHRzIHJlcXVpcmluZyBhIGNvbXBsZXRlIHR5cGU8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjkwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMjkwIj4yOTA8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+U2hvdWxkIG1lbWNweSBiZSBhbGxvd2VkIGludG8gYSBQT0Qgd2l0aCBhIGNvbnN0IG1lbWJlcj88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI5MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyOTEiPjI5MTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5PdmVybG9hZCByZXNvbHV0aW9uIG5lZWRlZCB3aGVuIGJpbmRpbmcgcmVmZXJlbmNlIHRvIGNsYXNzIHJ2YWx1ZTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjMzkxIj4zOTE8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI5MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyOTIiPjI5MjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+RGVhbGxvY2F0aW9uIG9uIGV4Y2VwdGlvbiBpbiA8VFQ+bmV3PC9UVD4gYmVmb3JlIGFyZ3VtZW50cyBldmFsdWF0ZWQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjI5MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzI5MyI+MjkzPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5TeW50YXggb2YgZXhwbGljaXQgaW5zdGFudGlhdGlvbi9zcGVjaWFsaXphdGlvbiB0b28gcGVybWlzc2l2ZTwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyOTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMyOTQiPjI5NDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5DYW4gPFRUPnN0YXRpY19jYXN0PC9UVD4gZHJvcCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnM/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMjk1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzI5NSI+Mjk1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPmN2LXF1YWxpZmllcnMgb24gZnVuY3Rpb24gdHlwZXM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyOTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjk2Ij4yOTY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q2FuIGNvbnZlcnNpb24gZnVuY3Rpb25zIGJlIHN0YXRpYz88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIyOTciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMyOTciPjI5NzwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+V2hpY2ggdGVtcGxhdGUgZG9lcyBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBzcGVjaWFsaXplPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIyOTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMjk4Ij4yOTg8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+PFRUPlQ6Ong8L1RUPiB3aGVuIDxUVD5UPC9UVD4gaXMgY3YtcXVhbGlmaWVkPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjI5OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMyOTkiPjI5OTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Db252ZXJzaW9uIG9uIGFycmF5IGJvdW5kIGV4cHJlc3Npb24gaW4gPFRUPm5ldzwvVFQ+PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzIChDKysxMSBvbndhcmRzKTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzAwIj4zMDA8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+UmVmZXJlbmNlcyB0byBmdW5jdGlvbnMgaW4gdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMwMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzMDEiPjMwMTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5TeW50YXggZm9yIDxJPnRlbXBsYXRlLW5hbWU8L0k+PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMwMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzMDIiPjMwMjwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5WYWx1ZS1pbml0aWFsaXphdGlvbiBhbmQgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IGNvbnN0cnVjdG9yPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMwMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzMwMyI+MzAzPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkludGVncmFsIHByb21vdGlvbnMgb24gYml0LWZpZWxkczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzA0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzMwNCI+MzA0PC9hPjwvdGQ+CiAgICAgPHRkPlRDMTwvdGQ+CiAgICAgPHRkPlZhbHVlLWluaXRpYWxpemF0aW9uIG9mIGEgcmVmZXJlbmNlPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMwNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzMDUiPjMwNTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5OYW1lIGxvb2t1cCBpbiBkZXN0cnVjdG9yIGNhbGw8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzA2Ij4zMDY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+QW1iaWd1aXR5IGJ5IGNsYXNzIG5hbWUgaW5qZWN0aW9uPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzA3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMzA3Ij4zMDc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+SW5pdGlhbGl6YXRpb24gb2YgYSB2aXJ0dWFsIGJhc2UgY2xhc3Mgc3Vib2JqZWN0PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMDgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMzMDgiPjMwODwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5DYXRjaGluZyBleGNlcHRpb25zIHdpdGggYW1iaWd1b3VzIGJhc2UgY2xhc3NlczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMDkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzA5Ij4zMDk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+TGlua2FnZSBvZiBlbnRpdGllcyB3aG9zZSBuYW1lcyBhcmUgbm90IHNpbXBseSBpZGVudGlmaWVycywgaW4gaW50cm9kdWN0aW9uPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDxhIGhyZWY9IiM0ODUiPjQ4NTwvYT48L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIzMTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMzMTAiPjMxMDwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+Q2FuIGZ1bmN0aW9uIHRlbXBsYXRlcyBkaWZmZXJpbmcgb25seSBpbiBwYXJhbWV0ZXIgY3YtcXVhbGlmaWVycyBiZSBvdmVybG9hZGVkPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMzMTEiPjMxMTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Vc2luZyBxdWFsaWZpZWQgbmFtZSB0byByZW9wZW4gbmVzdGVkIG5hbWVzcGFjZTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzEyIj4zMTI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPiYjODIyMDt1c2UmIzgyMjE7IG9mIGludmFsaWQgcG9pbnRlciB2YWx1ZSBub3QgZGVmaW5lZDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjNjE2Ij42MTY8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMxMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzMxMyI+MzEzPC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPkNsYXNzIHdpdGggc2luZ2xlIGNvbnZlcnNpb24gZnVuY3Rpb24gdG8gaW50ZWdyYWwgYXMgYXJyYXkgc2l6ZSBpbiA8VFQ+bmV3PC9UVD48L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzI5OSI+Mjk5PC9hPiAoQysrMTEgb253YXJkcyk8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjMxNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzMxNCI+MzE0PC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD48VFQ+dGVtcGxhdGU8L1RUPiBpbiBiYXNlIGNsYXNzIHNwZWNpZmllcjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzE3MTAiPjE3MTA8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMxNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzMxNSI+MzE1PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPklzIGNhbGwgb2Ygc3RhdGljIG1lbWJlciBmdW5jdGlvbiB0aHJvdWdoIG51bGwgcG9pbnRlciB1bmRlZmluZWQ/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMzMTYiPjMxNjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5JbmplY3RlZC1jbGFzcy1uYW1lIG9mIHRlbXBsYXRlIHVzZWQgYXMgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+U3VwZXJzZWRlZCBieSA8YSBocmVmPSIjMTAwNCI+MTAwNDwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzE3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzMxNyI+MzE3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkNhbiBhIGZ1bmN0aW9uIGJlIGRlY2xhcmVkIGlubGluZSBhZnRlciBpdCBoYXMgYmVlbiBjYWxsZWQ/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ic3ZuIiBhbGlnbj0iY2VudGVyIj5TVk48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzE4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzMxOCI+MzE4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPjxUVD5zdHJ1Y3QgQTo6QTwvVFQ+IHNob3VsZCBub3QgbmFtZSB0aGUgY29uc3RydWN0b3Igb2YgPFRUPkE8L1RUPjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlN1cGVyc2VkZWQgYnkgPGEgaHJlZj0iIzEzMTAiPjEzMTA8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMxOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzMTkiPjMxOTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Vc2Ugb2YgbmFtZXMgd2l0aG91dCBsaW5rYWdlIGluIGRlY2xhcmluZyBlbnRpdGllcyB3aXRoIGxpbmthZ2U8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMjAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzIwIj4zMjA8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+UXVlc3Rpb24gb24gY29weSBjb25zdHJ1Y3RvciBlbGlzaW9uIGV4YW1wbGU8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzIxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMzIxIj4zMjE8L2E+PC90ZD4KICAgICA8dGQ+ZHVwPC90ZD4KICAgICA8dGQ+QXNzb2NpYXRlZCBjbGFzc2VzIGFuZCBuYW1lc3BhY2VzIGZvciBhcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDxhIGhyZWY9IiM1NTciPjU1NzwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzIyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzMyMiI+MzIyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkRlZHVjdGlvbiBvZiByZWZlcmVuY2UgY29udmVyc2lvbnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzIzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzMyMyI+MzIzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPldoZXJlIG11c3QgPFRUPmV4cG9ydDwvVFQ+IGFwcGVhcj88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMjQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzI0Ij4zMjQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q2FuICI8VFQ+JmFtcDs8L1RUPiIgYmUgYXBwbGllZCB0byBhc3NpZ25tZW50IHRvIGJpdC1maWVsZD88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIzMjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMzMjUiPjMyNTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPldoZW4gYXJlIGRlZmF1bHQgYXJndW1lbnRzIHBhcnNlZD88L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzI2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzMyNiI+MzI2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPldvcmRpbmcgZm9yIGRlZmluaXRpb24gb2YgdHJpdmlhbCBjb25zdHJ1Y3RvcjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzI3Ij4zMjc8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+VXNlIG9mICJzdHJ1Y3R1cmUiIHdpdGhvdXQgZGVmaW5pdGlvbjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjNTM4Ij41Mzg8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMyOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzMjgiPjMyODwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5NaXNzaW5nIHJlcXVpcmVtZW50IHRoYXQgY2xhc3MgbWVtYmVyIHR5cGVzIGJlIGNvbXBsZXRlPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMyOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzMjkiPjMyOTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5FdmFsdWF0aW9uIG9mIGZyaWVuZHMgb2YgdGVtcGxhdGVzPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ic3ZuIiBhbGlnbj0iY2VudGVyIj5TVk48L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIzMzAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMzMzAiPjMzMDwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+UXVhbGlmaWNhdGlvbiBjb252ZXJzaW9ucyBhbmQgcG9pbnRlcnMgdG8gYXJyYXlzIG9mIHBvaW50ZXJzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMzMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzMzEiPjMzMTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5BbGxvd2VkIGNvcHkgY29uc3RydWN0b3Igc2lnbmF0dXJlczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzMyIj4zMzI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPmN2LXF1YWxpZmllZCA8VFQ+dm9pZDwvVFQ+IHBhcmFtZXRlciB0eXBlczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjNTU3Ij41NTc8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMzMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzMzMyI+MzMzPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkFtYmlndW91cyB1c2Ugb2YgImRlY2xhcmF0aW9uIiBpbiBkaXNhbWJpZ3VhdGlvbiBzZWN0aW9uPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMzNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzMzNCI+MzM0PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPklzIGEgY29tbWEtZXhwcmVzc2lvbiBkZXBlbmRlbnQgaWYgaXRzIGZpcnN0IG9wZXJhbmQgaXM/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjMzNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzMzUiPjMzNTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5BbGxvd2luZyA8VFQ+ZXhwb3J0PC9UVD4gb24gdGVtcGxhdGUgbWVtYmVycyBvZiBub250ZW1wbGF0ZSBjbGFzc2VzPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzM2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzMzNiI+MzM2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGV4YW1wbGVzIGFyZSBzdGlsbCBpbmNvcnJlY3Q8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzM3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzMzNyI+MzM3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkF0dGVtcHQgdG8gY3JlYXRlIGFycmF5IG9mIGFidHJhY3QgdHlwZSBzaG91bGQgY2F1c2UgZGVkdWN0aW9uIHRvIGZhaWw8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIzMzgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMzMzgiPjMzODwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+RW51bWVyYXRvciBuYW1lIHdpdGggbGlua2FnZSB1c2VkIGFzIGNsYXNzIG5hbWUgaW4gb3RoZXIgdHJhbnNsYXRpb24gdW5pdDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzMzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzM5Ij4zMzk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+T3ZlcmxvYWQgcmVzb2x1dGlvbiBpbiBvcGVyYW5kIG9mIDxUVD5zaXplb2Y8L1RUPiBpbiBjb25zdGFudCBleHByZXNzaW9uPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM0MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzM0MCI+MzQwPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlVuY2xlYXIgd29yZGluZyBpbiBkaXNhbWJpZ3VhdGlvbiBzZWN0aW9uPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM0MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzNDEiPjM0MTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48VFQ+ZXh0ZXJuICJDIjwvVFQ+IG5hbWVzcGFjZSBtZW1iZXIgZnVuY3Rpb24gdmVyc3VzIGdsb2JhbCB2YXJpYWJsZTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlN1cGVyc2VkZWQgYnkgPGEgaHJlZj0iIzE3MDgiPjE3MDg8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM0MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzNDIiPjM0MjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+VGVybWlub2xvZ3k6ICJpbmRpcmVjdGlvbiIgdmVyc3VzICJkZXJlZmVyZW5jZSI8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIzNDMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMzNDMiPjM0MzwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5NYWtlIDxUVD50ZW1wbGF0ZTwvVFQ+IG9wdGlvbmFsIGluIGNvbnRleHRzIHRoYXQgcmVxdWlyZSBhIHR5cGU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMzNDQiPjM0NDwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgPHRyIGlkPSIzNDQiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzQ0Ij4zNDQ8L2E+PC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+TmFtaW5nIGRlc3RydWN0b3JzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjMTQzNSI+MTQzNTwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzQ1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM0NSI+MzQ1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk1pc2xlYWRpbmcgY29tbWVudCBvbiBleGFtcGxlIGluIHRlbXBsYXRlcyBjaGFwdGVyPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM0NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzM0NiI+MzQ2PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlR5cG8gaW4gMTUuNDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzQ3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMzQ3Ij4zNDc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+VXNlIG9mIGRlcml2ZWQgY2xhc3MgbmFtZSBpbiBkZWZpbmluZyBiYXNlIGNsYXNzIG5lc3RlZCBjbGFzczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzNDgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzQ4Ij4zNDg8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+PFRUPmRlbGV0ZTwvVFQ+IGFuZCB1c2VyLXdyaXR0ZW4gZGVhbGxvY2F0aW9uIGZ1bmN0aW9uczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzQ5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM0OSI+MzQ5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBmb3IgY29udmVyc2lvbiBmdW5jdGlvbnMgYW5kIHF1YWxpZmljYXRpb24gY29udmVyc2lvbnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjM1MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzM1MCI+MzUwPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD48VFQ+c2lnbmVkIGNoYXI8L1RUPiB1bmRlcmx5aW5nIHJlcHJlc2VudGF0aW9uIGZvciBvYmplY3RzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM1MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzNTEiPjM1MTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5TZXF1ZW5jZSBwb2ludCBlcnJvcjogdW5zcGVjaWZpZWQgb3IgdW5kZWZpbmVkPzwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzUyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM1MiI+MzUyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk5vbmRlZHVjZWQgY29udGV4dHM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzUzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM1MyI+MzUzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPklzIGRlYWxsb2NhdGlvbiByb3V0aW5lIGNhbGxlZCBpZiBkZXN0cnVjdG9yIHRocm93cyBleGNlcHRpb24gaW4gZGVsZXRlPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM1NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzNTQiPjM1NDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5OdWxsIGFzIG5vbnR5cGUgdGVtcGxhdGUgYXJndW1lbnQ8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXMgKEMrKzExIG9ud2FyZHMpPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM1NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzNTUiPjM1NTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5HbG9iYWwtc2NvcGUgPFRUPjo6PC9UVD4gaW4gPEk+bmVzdGVkLW5hbWUtc3BlY2lmaWVyPC9JPjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzNTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMzNTYiPjM1NjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Xb3JkaW5nIG9mIGJlaGF2aW9yIG9mIGdlbmVyYXRlZCBjb3B5IGNvbnN0cnVjdG9yIGZvciBzY2FsYXIgbWVtYmVyczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzU3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM1NyI+MzU3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb24gb2Ygc2lnbmF0dXJlIHNob3VsZCBpbmNsdWRlIG5hbWU8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzU4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMzU4Ij4zNTg8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+TmFtZXNwYWNlcyBhbmQgZXh0ZXJuICJDIjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzNTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMzNTkiPjM1OTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5UeXBlIGRlZmluaXRpb24gaW4gYW5vbnltb3VzIHVuaW9uPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMzYwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMzYwIj4zNjA8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPlVzaW5nLWRlY2xhcmF0aW9uIHRoYXQgcmVkdWNlcyBhY2Nlc3M8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIzNjEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMzNjEiPjM2MTwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+Rm9yd2FyZCByZWZlcmVuY2UgdG8gZGVmYXVsdCBhcmd1bWVudDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzNjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzYyIj4zNjI8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+T3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaW4gaW5zdGFudGlhdGlvbiB1bml0czwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzYzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMzYzIj4zNjM8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+SW5pdGlhbGl6YXRpb24gb2YgY2xhc3MgZnJvbSBzZWxmPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzNjQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzY0Ij4zNjQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q2FsbGluZyBvdmVybG9hZGVkIGZ1bmN0aW9uIHdpdGggc3RhdGljIGluIHNldCwgd2l0aCBubyBvYmplY3Q8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIzNjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMzNjUiPjM2NTwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+U3RvcmFnZSBkdXJhdGlvbiBhbmQgdGVtcG9yYXJpZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzY2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM2NiI+MzY2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlN0cmluZyBsaXRlcmFsIGFsbG93ZWQgaW4gaW50ZWdyYWwgY29uc3RhbnQgZXhwcmVzc2lvbj88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzY3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM2NyI+MzY3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPjxUVD50aHJvdzwvVFQ+IG9wZXJhdG9yIGFsbG93ZWQgaW4gY29uc3RhbnQgZXhwcmVzc2lvbj88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzY4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM2OCI+MzY4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlVzZXMgb2Ygbm9uLXR5cGUgcGFyYW1ldGVycyB0aGF0IHNob3VsZCBjYXVzZSBkZWR1Y3Rpb24gdG8gZmFpbDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjM2OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzM2OSI+MzY5PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+QXJlIDxUVD5uZXc8L1RUPi88VFQ+ZGVsZXRlPC9UVD4gaWRlbnRpZmllcnMgb3IgPEk+cHJlcHJvY2Vzc2luZy1vcC1vci1wdW5jPC9JPj88L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzcwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM3MCI+MzcwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkNhbiA8VFQ+I2luY2x1ZGUgJmx0Oy4uLiZndDs8L1RUPiBmb3JtIGJlIHVzZWQgb3RoZXIgdGhhbiBmb3Igc3RhbmRhcmQgQysrIGhlYWRlcnM/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjM3MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzM3MSI+MzcxPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5JbnRlcmxlYXZpbmcgb2YgY29uc3RydWN0b3IgY2FsbHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzcyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM3MiI+MzcyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPklzIGFjY2VzcyBncmFudGVkIGJ5IGJhc2UgY2xhc3Mgc3BlY2lmaWVycyBhdmFpbGFibGUgaW4gZm9sbG93aW5nIGJhc2UgY2xhc3Mgc3BlY2lmaWVycz88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzNzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzczIj4zNzM8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TG9va3VwIG9uIG5hbWVzcGFjZSBxdWFsaWZpZWQgbmFtZSBpbiB1c2luZy1kaXJlY3RpdmU8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzNzQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzc0Ij4zNzQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+Q2FuIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG91dHNpZGUgbmFtZXNwYWNlIHVzZSBxdWFsaWZpZWQgbmFtZT88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXMgKEMrKzExIG9ud2FyZHMpPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM3NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzM3NSI+Mzc1PC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPkNvbmZ1c2luZyBleGFtcGxlIG9uIGxvb2t1cCB3aXRoIDxUVD50eXBlbmFtZTwvVFQ+PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+RHVwbGljYXRlIG9mIDxhIGhyZWY9IiMzNDUiPjM0NTwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzc2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMzc2Ij4zNzY8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+Q2xhc3MgImRlZmluaXRpb24iIHZlcnN1cyBjbGFzcyAiZGVjbGFyYXRpb24iPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzNzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzc3Ij4zNzc8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RW51bSB3aG9zZSBlbnVtZXJhdG9ycyB3aWxsIG5vdCBmaXQgaW4gYW55IGludGVncmFsIHR5cGU8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzc4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM3OCI+Mzc4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPldvcmRpbmcgdGhhdCBzYXlzIHRlbXBvcmFyaWVzIGFyZSBkZWNsYXJlZDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzI3NiI+Mjc2PC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzNzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzc5Ij4zNzk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q2hhbmdlICJjbGFzcyBkZWNsYXJhdGlvbiIgdG8gImNsYXNzIGRlZmluaXRpb24iPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjM4MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzM4MCI+MzgwPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5EZWZpbml0aW9uIG9mICJhbWJpZ3VvdXMgYmFzZSBjbGFzcyIgbWlzc2luZzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzODEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzgxIj4zODE8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+SW5jb3JyZWN0IGV4YW1wbGUgb2YgYmFzZSBjbGFzcyBtZW1iZXIgbG9va3VwPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM4MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzODIiPjM4MjwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5BbGxvdyA8VFQ+dHlwZW5hbWU8L1RUPiBvdXRzaWRlIG9mIHRlbXBsYXRlczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllcyAoQysrMTEgb253YXJkcyk8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzgzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM4MyI+MzgzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPklzIGEgY2xhc3Mgd2l0aCBhIGRlY2xhcmVkIGJ1dCBub3QgZGVmaW5lZCBkZXN0cnVjdG9yIGEgUE9EPzwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzODQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMzODQiPjM4NDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Bcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwIGFuZCBvcGVyYXRvciBmdW5jdGlvbnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzg1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM4NSI+Mzg1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkhvdyBkb2VzIHByb3RlY3RlZCBtZW1iZXIgY2hlY2sgb2YgMTEuNSBpbnRlcmFjdCB3aXRoIHVzaW5nLWRlY2xhcmF0aW9ucz88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIzODYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMzODYiPjM4NjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkZyaWVuZCBkZWNsYXJhdGlvbiBvZiBuYW1lIGJyb3VnaHQgaW4gYnkgPEk+dXNpbmctZGVjbGFyYXRpb248L0k+PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM4NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzODciPjM4NzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5FcnJvcnMgaW4gZXhhbXBsZSBpbiAxNC42LjU8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzg4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM4OCI+Mzg4PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5DYXRjaGluZyBiYXNlPFRUPiomYW1wOzwvVFQ+IGZyb20gYSB0aHJvdyBvZiBkZXJpdmVkPFRUPio8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM4OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzODkiPjM4OTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Vbm5hbWVkIHR5cGVzIGluIGVudGl0aWVzIHdpdGggbGlua2FnZTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjM5MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMzOTAiPjM5MDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5QdXJlIHZpcnR1YWwgbXVzdCBiZSBkZWZpbmVkIHdoZW4gaW1wbGljaXRseSBjYWxsZWQ8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzkxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM5MSI+MzkxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlJlcXVpcmUgZGlyZWN0IGJpbmRpbmcgb2Ygc2hvcnQtbGl2ZWQgcmVmZXJlbmNlcyB0byBydmFsdWVzPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzIChDKysxMSBvbndhcmRzKTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzOTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzkyIj4zOTI8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+VXNlIG9mIGZ1bGwgZXhwcmVzc2lvbiBsdmFsdWUgYmVmb3JlIHRlbXBvcmFyeSBkZXN0cnVjdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIzOTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMzOTMiPjM5MzwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5Qb2ludGVyIHRvIGFycmF5IG9mIHVua25vd24gYm91bmQgaW4gdGVtcGxhdGUgYXJndW1lbnQgbGlzdCBpbiBwYXJhbWV0ZXI8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzOTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzk0Ij4zOTQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+PEk+aWRlbnRpZmllci1saXN0PC9JPiBpcyBuZXZlciBkZWZpbmVkPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzOTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMzOTUiPjM5NTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Db252ZXJzaW9uIG9wZXJhdG9yIHRlbXBsYXRlIHN5bnRheDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzOTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzk2Ij4zOTY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+TWlzbGVhZGluZyBub3RlIHJlZ2FyZGluZyB1c2Ugb2YgPFRUPmF1dG88L1RUPiBmb3IgZGlzYW1iaWd1YXRpb248L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMzk3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzM5NyI+Mzk3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlNhbWUgYWRkcmVzcyBmb3Igc3RyaW5nIGxpdGVyYWxzIGZyb20gZGVmYXVsdCBhcmd1bWVudHMgaW4gaW5saW5lIGZ1bmN0aW9ucz88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDxhIGhyZWY9IiMxODIzIj4xODIzPC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIzOTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMzk4Ij4zOTg8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+QW1iaWd1b3VzIHdvcmRpbmcgb24gbmFtaW5nIGEgdHlwZSBpbiBkZWR1Y3Rpb248L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIzOTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMzOTkiPjM5OTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkRlc3RydWN0b3IgbG9va3VwIHJlZHV4PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQwMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0MDAiPjQwMDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Vc2luZy1kZWNsYXJhdGlvbnMgYW5kIHRoZSAic3RydWN0IGhhY2siPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQwMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0MDEiPjQwMTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5XaGVuIGlzIGFjY2VzcyBmb3IgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZmF1bHQgYXJndW1lbnRzIGNoZWNrZWQ/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNDAyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNDAyIj40MDI8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPk1vcmUgb24gcGFydGlhbCBvcmRlcmluZyBvZiBmdW5jdGlvbiB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDAzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQwMyI+NDAzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlJlZmVyZW5jZSB0byBhIHR5cGUgYXMgYSA8ST50ZW1wbGF0ZS1pZDwvST48L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDA0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQwNCI+NDA0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlVuY2xlYXIgcmVmZXJlbmNlIHRvIGNvbnN0cnVjdGlvbiB3aXRoIG5vbi10cml2aWFsIGNvbnN0cnVjdG9yPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjQwNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzQwNSI+NDA1PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5VbnF1YWxpZmllZCBmdW5jdGlvbiBuYW1lIGxvb2t1cDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDA2Ij40MDY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+U3RhdGljIGRhdGEgbWVtYmVyIGluIGNsYXNzIHdpdGggbmFtZSBmb3IgbGlua2FnZSBwdXJwb3NlczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MDciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDA3Ij40MDc8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TmFtZWQgY2xhc3Mgd2l0aCBhc3NvY2lhdGVkIHR5cGVkZWY6IHR3byBuYW1lcyBvciBvbmU/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDA4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQwOCI+NDA4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPnNpemVvZiBhcHBsaWVkIHRvIHVua25vd24tYm91bmQgYXJyYXkgc3RhdGljIGRhdGEgbWVtYmVyIG9mIHRlbXBsYXRlPC90ZD4KLSAgICA8dGQgY2xhc3M9InN2biIgYWxpZ249ImNlbnRlciI+U1ZOPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkNsYW5nIDMuNDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MDkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDA5Ij40MDk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+T2Jzb2xldGUgcGFyYWdyYXBoIG1pc3NlZCBieSBjaGFuZ2VzIGZvciBpc3N1ZSAyMjQ8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDEwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQxMCI+NDEwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlBhcmFncmFwaCBtaXNzZWQgaW4gY2hhbmdlcyBmb3IgaXNzdWUgMTY2PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI0MTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM0MTEiPjQxMTwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+VXNlIG9mIHVuaXZlcnNhbC1jaGFyYWN0ZXItbmFtZSBpbiBjaGFyYWN0ZXIgdmVyc3VzIHN0cmluZyBsaXRlcmFsczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM0MTIiPjQxMjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5DYW4gYSByZXBsYWNlbWVudCBhbGxvY2F0aW9uIGZ1bmN0aW9uIGJlIGlubGluZT88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDEzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQxMyI+NDEzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb24gb2YgImVtcHR5IGNsYXNzIjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDE0Ij40MTQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+TXVsdGlwbGUgdHlwZXMgZm91bmQgb24gZGVzdHJ1Y3RvciBsb29rdXA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzMwNSI+MzA1PC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDE1Ij40MTU8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+VGVtcGxhdGUgZGVkdWN0aW9uIGRvZXMgbm90IGNhdXNlIGluc3RhbnRpYXRpb248L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDE2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQxNiI+NDE2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkNsYXNzIG11c3QgYmUgY29tcGxldGUgdG8gYWxsb3cgb3BlcmF0b3IgbG9va3VwPzwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MTciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDE3Ij40MTc8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+VXNpbmcgZGVyaXZlZC1jbGFzcyBxdWFsaWZpZWQgbmFtZSBpbiBvdXQtb2YtY2xhc3MgbmVzdGVkIGNsYXNzIGRlZmluaXRpb248L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjQxOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzQxOCI+NDE4PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5JbXBlcmZlY3Qgd29yZGluZyBvbiBlcnJvciBvbiBtdWx0aXBsZSBkZWZhdWx0IGFyZ3VtZW50cyBvbiBhIGNhbGxlZCBmdW5jdGlvbjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjQxOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzQxOSI+NDE5PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5DYW4gY2FzdCB0byB2aXJ0dWFsIGJhc2UgY2xhc3MgYmUgZG9uZSBvbiBwYXJ0aWFsbHktY29uc3RydWN0ZWQgb2JqZWN0PzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MjAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDIwIj40MjA8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+cG9zdGZpeGV4cHJlc3Npb24tJmd0O3NjYWxhcl90eXBlX2R0b3IoKSBpbmNvbnNpc3RlbnQ8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDIxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQyMSI+NDIxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPklzIHJ2YWx1ZS5maWVsZCBhbiBydmFsdWU/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQyMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzQyMiI+NDIyPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPklzIGEgdHlwZWRlZiByZWRlY2xhcmF0aW9uIGFsbG93ZWQgd2l0aCBhIHRlbXBsYXRlIHR5cGUgdGhhdCBtaWdodCBiZSB0aGUgc2FtZT88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDIzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNDIzIj40MjM8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+Q2FuIGEgY29udmVyc2lvbiBiZSBkb25lIG9uIHRoZSBsZWZ0IG9wZXJhbmQgb2YgYSBjb21wb3VuZCBhc3NpZ25tZW50PzwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MjQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDI0Ij40MjQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+V29yZGluZyBwcm9ibGVtIHdpdGggaXNzdWUgNTYgcmVzb2x1dGlvbiBvbiByZWRlY2xhcmluZyB0eXBlZGVmcyBpbiBjbGFzcyBzY29wZTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDI1Ij40MjU8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+U2V0IG9mIGNhbmRpZGF0ZXMgZm9yIG92ZXJsb2FkZWQgYnVpbHQtaW4gb3BlcmF0b3Igd2l0aCBmbG9hdCBvcGVyYW5kPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNDI2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNDI2Ij40MjY8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5JZGVudGljYWxseS1uYW1lZCB2YXJpYWJsZXMsIG9uZSBpbnRlcm5hbGx5IGFuZCBvbmUgZXh0ZXJuYWxseSBsaW5rZWQsIGFsbG93ZWQ/PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQyNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0MjciPjQyNzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD48VFQ+c3RhdGljX2Nhc3Q8L1RUPiBhbWJpZ3VpdHk6IGNvbnZlcnNpb24gdmVyc3VzIGNhc3QgdG8gZGVyaXZlZDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDI4Ij40Mjg8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+TWVudGlvbiBvZiBleHByZXNzaW9uIHdpdGggcmVmZXJlbmNlIHR5cGU8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDI5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQyOSI+NDI5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk1hdGNoaW5nIGRlYWxsb2NhdGlvbiBmdW5jdGlvbiBjaG9zZW4gYmFzZWQgb24gc3ludGF4IG9yIHNpZ25hdHVyZT88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXMgKEMrKzExIG9ud2FyZHMpPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQzMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0MzAiPjQzMDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5PcmRlcmluZyBvZiBleHByZXNzaW9uIGV2YWx1YXRpb24gaW4gaW5pdGlhbGl6ZXIgbGlzdDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllcyAoQysrMTEgb253YXJkcyk8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDMxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQzMSI+NDMxPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkRlZmVjdCBpbiB3b3JkaW5nIGluIDE0LjI8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDMyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQzMiI+NDMyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPklzIGluamVjdGVkIGNsYXNzIG5hbWUgdmlzaWJsZSBpbiBiYXNlIGNsYXNzIHNwZWNpZmllciBsaXN0PzwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDMzIj40MzM8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RG8gZWxhYm9yYXRlZCB0eXBlIHNwZWNpZmllcnMgaW4gdGVtcGxhdGVzIGluamVjdCBpbnRvIGVuY2xvc2luZyBuYW1lc3BhY2Ugc2NvcGU/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQzNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzQzNCI+NDM0PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlVuY2xlYXIgc3VwcHJlc3Npb24gb2Ygc3RhbmRhcmQgY29udmVyc2lvbnMgd2hpbGUgYmluZGluZyByZWZlcmVuY2UgdG8gbHZhbHVlPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQzNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzQzNSI+NDM1PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkNoYW5nZSAiZGVjbGFyYXJhdGlvbiBvciBkZWZpbml0aW9uIiB0byAiZGVjbGFyYXRpb24iPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MzYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDM2Ij40MzY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+UHJvYmxlbSBpbiBleGFtcGxlIGluIDkuNiBwYXJhZ3JhcGggNDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDM3Ij40Mzc8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+SXMgdHlwZSBvZiBjbGFzcyBhbGxvd2VkIGluIG1lbWJlciBmdW5jdGlvbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbj88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MzgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDM4Ij40Mzg8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+UG9zc2libGUgZmxhdyBpbiB3b3JkaW5nIGZvciBtdWx0aXBsZSBhY2Nlc3NlcyB0byBvYmplY3QgYmV0d2VlbiBzZXF1ZW5jZSBwb2ludHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0MzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDM5Ij40Mzk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+R3VhcmFudGVlcyBvbiBjYXN0aW5nIHBvaW50ZXIgYmFjayB0byBjdi1xdWFsaWZpZWQgdmVyc2lvbiBvZiBvcmlnaW5hbCB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI0NDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM0NDAiPjQ0MDwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+QWxsb3cgaW1wbGljaXQgcG9pbnRlci10by1tZW1iZXIgY29udmVyc2lvbiBvbiBub250eXBlIHRlbXBsYXRlIGFyZ3VtZW50PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ0MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0NDEiPjQ0MTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5PcmRlcmluZyBvZiBzdGF0aWMgcmVmZXJlbmNlIGluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDQyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ0MiI+NDQyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkluY29ycmVjdCB1c2Ugb2YgbnVsbCBwb2ludGVyIGNvbnN0YW50IGluIGRlc2NyaXB0aW9uIG9mIGRlbGV0ZSBvcGVyYXRvcjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5TdXBlcnNlZGVkIGJ5IDxhIGhyZWY9IiMzNDgiPjM0ODwvYT48L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDQzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ0MyI+NDQzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPldvcmRpbmcgbml0IGluIGRlc2NyaXB0aW9uIG9mIGxpZmV0aW1lIG9mIHRlbXBvcmFyaWVzPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0NDQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM0NDQiPjQ0NDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5PdmVycmlkaW5nIGFuZCB0aGUgZ2VuZXJhdGVkIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0NDUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM0NDUiPjQ0NTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Xb3JkaW5nIGlzc3VlIG9uIGZyaWVuZCBkZWNsYXJhdGlvbnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDQ2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ0NiI+NDQ2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkRvZXMgYW4gbHZhbHVlLXRvLXJ2YWx1ZSBjb252ZXJzaW9uIG9uIHRoZSAiPyIgb3BlcmF0b3IgcHJvZHVjZSBhIHRlbXBvcmFyeT88L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDQ3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ0NyI+NDQ3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPklzIG9mZnNldG9mIHR5cGUtZGVwZW5kZW50PzwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0NDgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDQ4Ij40NDg8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+U2V0IG9mIHRlbXBsYXRlIGZ1bmN0aW9ucyBpbiBjYWxsIHdpdGggZGVwZW5kZW50IGV4cGxpY2l0IGFyZ3VtZW50PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ0OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzQ0OSI+NDQ5PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkNvbnNpc3RlbmN5IGluIHVzZSBvZiBoeXBoZW4gd2l0aCBuYW1lcyBvZiAibm9uIiBlbnRpdGllczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5hIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDUwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ1MCI+NDUwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkJpbmRpbmcgYSByZWZlcmVuY2UgdG8gY29uc3QgdG8gYSBjdi1xdWFsaWZpZWQgYXJyYXkgcnZhbHVlPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ1MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0NTEiPjQ1MTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5FeHByZXNzaW9ucyB3aXRoIGludmFsaWQgcmVzdWx0cyBhbmQgaWxsLWZvcm1lZG5lc3M8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDUyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ1MiI+NDUyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPldvcmRpbmcgbml0IG9uIGRlc2NyaXB0aW9uIG9mIDxUVD50aGlzPC9UVD48L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI0NTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM0NTMiPjQ1MzwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlJlZmVyZW5jZXMgbWF5IG9ubHkgYmluZCB0byAmIzgyMjA7dmFsaWQmIzgyMjE7IG9iamVjdHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDU0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ1NCI+NDU0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPldoZW4gaXMgYSBkZWZpbml0aW9uIG9mIGEgc3RhdGljIGRhdGEgbWVtYmVyIHJlcXVpcmVkPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNDU1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNDU1Ij40NTU8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5QYXJ0aWFsIG9yZGVyaW5nIGFuZCBub24tZGVkdWNlZCBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDU2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNDU2Ij40NTY8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+SXMgaW5pdGlhbGl6ZWQgY29uc3QgaW50IG9yIGNvbnN0IGJvb2wgdmFyaWFibGUgYSBudWxsIHBvaW50ZXIgY29uc3RhbnQ/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ1NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0NTciPjQ1NzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Xb3JkaW5nIG5pdCBvbiB1c2Ugb2YgY29uc3QgdmFyaWFibGVzIGluIGNvbnN0YW50IGV4cHJlc3Npb25zPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ1OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0NTgiPjQ1ODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5IaWRpbmcgb2YgbWVtYmVyIHRlbXBsYXRlIHBhcmFtZXRlcnMgYnkgb3RoZXIgbWVtYmVyczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNDU5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNDU5Ij40NTk8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkhpZGluZyBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGJ5IGJhc2UgY2xhc3MgbWVtYmVyczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0NjAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDYwIj40NjA8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q2FuIGEgPEk+dXNpbmctZGVjbGFyYXRpb248L0k+IG5hbWUgYSBuYW1lc3BhY2U/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ2MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzQ2MSI+NDYxPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPk1ha2UgPFRUPmFzbTwvVFQ+IGNvbmRpdGlvbmFsbHktc3VwcG9ydGVkPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0NjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDYyIj40NjI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkxpZmV0aW1lIG9mIHRlbXBvcmFyaWVzIGJvdW5kIHRvIGNvbW1hIGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDYzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ2MyI+NDYzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPjxUVD5yZWludGVycHJldF9jYXN0Jmx0O1QqJmd0OygwKTwvVFQ+PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0NjQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDY0Ij40NjQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+V29yZGluZyBuaXQgb24gbGlmZXRpbWUgb2YgdGVtcG9yYXJpZXMgdG8gd2hpY2ggcmVmZXJlbmNlcyBhcmUgYm91bmQ8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ2NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzQ2NSI+NDY1PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPk1heSBjb25zdHJ1Y3RvcnMgb2YgZ2xvYmFsIG9iamVjdHMgY2FsbCA8VFQ+ZXhpdCgpPC9UVD4/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0NjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDY2Ij40NjY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Y3YtcXVhbGlmaWVycyBvbiBwc2V1ZG8tZGVzdHJ1Y3RvciB0eXBlPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDY3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNDY3Ij40Njc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+SnVtcCBwYXN0IGluaXRpYWxpemF0aW9uIG9mIGxvY2FsIHN0YXRpYyB2YXJpYWJsZTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0NjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDY4Ij40Njg8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+QWxsb3cgPFRUPjo6dGVtcGxhdGU8L1RUPiBvdXRzaWRlIG9mIHRlbXBsYXRlczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllcyAoQysrMTEgb253YXJkcyk8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDY5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNDY5Ij40Njk8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+Q29uc3QgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIGFuZCByZWZlcmVuY2UgYXJndW1lbnRzPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDcwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ3MCI+NDcwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkluc3RhbnRpYXRpb24gb2YgbWVtYmVycyBvZiBhbiBleHBsaWNpdGx5LWluc3RhbnRpYXRlZCBjbGFzcyB0ZW1wbGF0ZTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0NzEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM0NzEiPjQ3MTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Db25mbGljdGluZyBpbmhlcml0ZWQgYWNjZXNzIHNwZWNpZmljYXRpb25zPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNDcyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNDcyIj40NzI8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5DYXN0aW5nIGFjcm9zcyBwcm90ZWN0ZWQgaW5oZXJpdGFuY2U8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI0NzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM0NzMiPjQ3MzwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+QmxvY2stc2NvcGUgZGVjbGFyYXRpb25zIG9mIGFsbG9jYXRvciBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDc0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ3NCI+NDc0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkJsb2NrLXNjb3BlIDxUVD5leHRlcm48L1RUPiBkZWNsYXJhdGlvbnMgaW4gbmFtZXNwYWNlIG1lbWJlcnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDc1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ3NSI+NDc1PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPldoZW4gaXMgPFRUPnN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCk8L1RUPiB0cnVlPyAodGFrZSAyKTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNDc2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNDc2Ij40NzY8L2E+PC90ZD4KICAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+RGV0ZXJtaW5pbmcgdGhlIGJ1ZmZlciBzaXplIGZvciBwbGFjZW1lbnQgbmV3PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ3NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0NzciPjQ3NzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5DYW4gPFRUPnZpcnR1YWw8L1RUPiBhcHBlYXIgaW4gYSA8VFQ+ZnJpZW5kPC9UVD4gZGVjbGFyYXRpb24/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDc4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNDc4Ij40Nzg8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+TWF5IGEgZnVuY3Rpb24gcGFyYW1ldGVyIGJlIGFuIGFycmF5IG9mIGFuIGFic3RyYWN0IGNsYXNzIHR5cGU/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ3OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0NzkiPjQ3OTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Db3B5IGVsaXNpb24gaW4gZXhjZXB0aW9uIGhhbmRsaW5nPC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ4MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0ODAiPjQ4MDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5JcyBhIGJhc2Ugb2YgYSB2aXJ0dWFsIGJhc2UgYWxzbyB2aXJ0dWFsPzwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0ODEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDgxIj40ODE8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+U2NvcGUgb2YgdGVtcGxhdGUgcGFyYW1ldGVyczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0ODIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDgyIj40ODI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlF1YWxpZmllZCBkZWNsYXJhdG9ycyBpbiByZWRlY2xhcmF0aW9uczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9InN2biIgYWxpZ249ImNlbnRlciI+U1ZOPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ4MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0ODMiPjQ4MzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+Tm9ybWF0aXZlIHJlcXVpcmVtZW50cyBvbiBpbnRlZ3JhbCByYW5nZXM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDg0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ4NCI+NDg0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkNhbiBhIDxJPmJhc2Utc3BlY2lmaWVyPC9JPiBuYW1lIGEgY3YtcXVhbGlmaWVkIGNsYXNzIHR5cGU/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ4NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0ODUiPjQ4NTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5XaGF0IGlzIGEgJiM4MjIwO25hbWUmIzgyMjE7PzwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0ODYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDg2Ij40ODY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+SW52YWxpZCByZXR1cm4gdHlwZXMgYW5kIHRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0ODciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM0ODciPjQ4NzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5PcGVyYXRvciBvdmVybG9hZGluZyBpbiBjb25zdGFudCBleHByZXNzaW9uczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0ODgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDg4Ij40ODg8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+TG9jYWwgdHlwZXMsIG92ZXJsb2FkIHJlc29sdXRpb24sIGFuZCB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb248L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXMgKEMrKzExIG9ud2FyZHMpPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ4OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzQ4OSI+NDg5PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPk11c3QgbWVtYmVyIGZ1bmN0aW9uIHRlbXBsYXRlcyBiZSBpbnN0YW50aWF0ZWQgZHVyaW5nIG92ZXJsb2FkIHJlc29sdXRpb24/PC90ZD4KLSAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0OTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDkwIj40OTA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+TmFtZSBsb29rdXAgaW4gZnJpZW5kIGRlY2xhcmF0aW9uczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0OTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDkxIj40OTE8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+SW5pdGlhbGl6ZXJzIGZvciBlbXB0eS1jbGFzcyBhZ2dyZWdyYXRlIG1lbWJlcnM8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzQxMyI+NDEzPC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0OTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDkyIj40OTI8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+PFRUPnR5cGVpZDwvVFQ+IGNvbnN0bmVzcyBpbmNvbnNpc3RlbnQgd2l0aCBleGFtcGxlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDkzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ5MyI+NDkzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlR5cGUgZGVkdWN0aW9uIGZyb20gYSA8VFQ+Ym9vbDwvVFQ+IGNvbnRleHQ8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5EdXBsaWNhdGUgb2YgPGEgaHJlZj0iIzk3NiI+OTc2PC9hPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0OTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDk0Ij40OTQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+UHJvYmxlbXMgd2l0aCB0aGUgcmVzb2x1dGlvbiBvZiBpc3N1ZSA0NTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjMzcyIj4zNzI8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ5NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0OTUiPjQ5NTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5PdmVybG9hZCByZXNvbHV0aW9uIHdpdGggdGVtcGxhdGUgYW5kIG5vbi10ZW1wbGF0ZSBjb252ZXJzaW9uIGZ1bmN0aW9uczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI0OTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNDk2Ij40OTY8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPklzIGEgdm9sYXRpbGUtcXVhbGlmaWVkIHR5cGUgcmVhbGx5IGEgUE9EPzwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjQ5NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM0OTciPjQ5NzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5NaXNzaW5nIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIGluIGV4YW1wbGU8L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI0OTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM0OTgiPjQ5ODwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+U3RvcmFnZSBjbGFzcyBzcGVjaWZpZXJzIGluIGRlZmluaXRpb25zIG9mIGNsYXNzIG1lbWJlcnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNDk5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzQ5OSI+NDk5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlRocm93aW5nIGFuIGFycmF5IG9mIHVua25vd24gc2l6ZTwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTAwIj41MDA8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+QWNjZXNzIGluIDxJPmJhc2Utc3BlY2lmaWVyPC9JPnMgb2YgZnJpZW5kIGFuZCBuZXN0ZWQgY2xhc3NlczwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPkR1cGxpY2F0ZSBvZiA8YSBocmVmPSIjMzcyIj4zNzI8L2E+PC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjUwMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzUwMSI+NTAxPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlZpc2liaWxpdHkgb2YgZnJpZW5kIGRlY2xhcmF0aW9ucyB3aXRoaW4gdGhlIGJlZnJpZW5kaW5nIGNsYXNzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTAyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzUwMiI+NTAyPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkRlcGVuZGVuY3kgb2YgbmVzdGVkIGVudW1lcmF0aW9ucyBhbmQgZW51bWVyYXRvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjUwMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzUwMyI+NTAzPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5Ddi1xdWFsaWZpZWQgZnVuY3Rpb24gdHlwZXMgaW4gdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNTA0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNTA0Ij41MDQ8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPlNob3VsZCB1c2Ugb2YgYSB2YXJpYWJsZSBpbiBpdHMgb3duIGluaXRpYWxpemVyIHJlcXVpcmUgYSBkaWFnbm9zdGljPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MDUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTA1Ij41MDU8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q29uZGl0aW9uYWxseS1zdXBwb3J0ZWQgYmVoYXZpb3IgZm9yIHVua25vd24gY2hhcmFjdGVyIGVzY2FwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTA2Ij41MDY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q29uZGl0aW9uYWxseS1zdXBwb3J0ZWQgYmVoYXZpb3IgZm9yIG5vbi1QT0Qgb2JqZWN0cyBwYXNzZWQgdG8gZWxsaXBzaXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MDciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM1MDciPjUwNzwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5BbWJpZ3VpdHkgYXNzaWduaW5nIGNsYXNzIG9iamVjdCB0byBidWlsdC1pbiB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTA4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzUwOCI+NTA4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk5vbi1jb25zdHJ1Y3RlZCB2YWx1ZS1pbml0aWFsaXplZCBvYmplY3RzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTA5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzUwOSI+NTA5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkRlYWQgY29kZSBpbiB0aGUgc3BlY2lmaWNhdGlvbiBvZiBkZWZhdWx0IGluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTEwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzUxMCI+NTEwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkRlZmF1bHQgaW5pdGlhbGl6YXRpb24gb2YgUE9EIGNsYXNzZXM/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI1MTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM1MTEiPjUxMTwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+UE9ELXN0cnVjdHMgd2l0aCB0ZW1wbGF0ZSBhc3NpZ25tZW50IG9wZXJhdG9yczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM1MTIiPjUxMjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5VbmlvbiBtZW1iZXJzIHdpdGggdXNlci1kZWNsYXJlZCBub24tZGVmYXVsdCBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTEzIj41MTM8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Tm9uLWNsYXNzICYjODIyMDttb3N0LWRlcml2ZWQmIzgyMjE7IG9iamVjdHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTE0Ij41MTQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+SXMgdGhlIGluaXRpYWxpemVyIGZvciBhIG5hbWVzcGFjZSBtZW1iZXIgaW4gdGhlIHNjb3BlIG9mIHRoZSBuYW1lc3BhY2U/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTE1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzUxNSI+NTE1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk5vbi1kZXBlbmRlbnQgcmVmZXJlbmNlcyB0byBiYXNlIGNsYXNzIG1lbWJlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTE2Ij41MTY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+VXNlIG9mIDxUVD5zaWduZWQ8L1RUPiBpbiBiaXQtZmllbGQgZGVjbGFyYXRpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTE3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzUxNyI+NTE3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlBhcnRpYWwgc3BlY2lhbGl6YXRpb24gZm9sbG93aW5nIGV4cGxpY2l0IGluc3RhbnRpYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTE4Ij41MTg8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+VHJhaWxpbmcgY29tbWEgZm9sbG93aW5nIDxJPmVudW1lcmF0b3ItbGlzdDwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTE5Ij41MTk8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+TnVsbCBwb2ludGVyIHByZXNlcnZhdGlvbiBpbiA8VFQ+dm9pZCo8L1RUPiBjb252ZXJzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjUyMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1MjAiPjUyMDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5PbGQtc3R5bGUgY2FzdHMgYmV0d2VlbiBpbmNvbXBsZXRlIGNsYXNzIHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTIxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzUyMSI+NTIxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlJlcXVpcmVtZW50cyBmb3IgZXhjZXB0aW9ucyB0aHJvd24gYnkgYWxsb2NhdGlvbiBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTIyIj41MjI8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+QXJyYXktdG8tcG9pbnRlciBkZWNheSBpbiB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjUyMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzUyMyI+NTIzPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5DYW4gYSBvbmUtcGFzdC10aGUtZW5kIHBvaW50ZXIgYmUgaW52YWxpZGF0ZWQgYnkgZGVsZXRpbmcgYW4gYWRqYWNlbnQgb2JqZWN0PzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MjQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTI0Ij41MjQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q2FuIGZ1bmN0aW9uLW5vdGF0aW9uIGNhbGxzIHRvIG9wZXJhdG9yIGZ1bmN0aW9ucyBiZSBkZXBlbmRlbnQ/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTI1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzUyNSI+NTI1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk1pc3NpbmcgPFRUPio8L1RUPiBpbiBleGFtcGxlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTI2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzUyNiI+NTI2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkNvbmZ1c2luZyBhc3BlY3RzIGluIHRoZSBzcGVjaWZpY2F0aW9uIG9mIG5vbi1kZWR1Y2VkIGNvbnRleHRzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTI3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzUyNyI+NTI3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlByb2JsZW1zIHdpdGggbGlua2FnZSBvZiB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNTI4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNTI4Ij41Mjg8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPldoeSBhcmUgaW5jb21wbGV0ZSBjbGFzcyB0eXBlcyBub3QgYWxsb3dlZCB3aXRoIDxUVD50eXBlaWQ8L1RUPj88L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI1MjkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM1MjkiPjUyOTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlVzZSBvZiA8VFQ+dGVtcGxhdGUmbHQ7Jmd0OzwvVFQ+IHdpdGggJiM4MjIwO2V4cGxpY2l0bHktc3BlY2lhbGl6ZWQmIzgyMjE7IGNsYXNzIHRlbXBsYXRlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MzAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTMwIj41MzA8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Tm9udHlwZSB0ZW1wbGF0ZSBhcmd1bWVudHMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MzEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTMxIj41MzE8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RGVmaW5pbmcgbWVtYmVycyBvZiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTMyIj41MzI8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TWVtYmVyL25vbm1lbWJlciBvcGVyYXRvciB0ZW1wbGF0ZSBwYXJ0aWFsIG9yZGVyaW5nPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTMzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNTMzIj41MzM8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+U3BlY2lhbCB0cmVhdG1lbnQgZm9yIEMtc3R5bGUgaGVhZGVyIG5hbWVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTM0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzUzNCI+NTM0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPjxJPnRlbXBsYXRlLW5hbWU8L0k+cyBhbmQgPEk+b3BlcmF0b3ItZnVuY3Rpb24taWQ8L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjUzNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1MzUiPjUzNTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+Q29weSBjb25zdHJ1Y3Rpb24gd2l0aG91dCBhIGNvcHkgY29uc3RydWN0b3I8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjUzNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzUzNiI+NTM2PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+UHJvYmxlbXMgaW4gdGhlIGRlc2NyaXB0aW9uIG9mIDxJPmlkLWV4cHJlc3Npb248L0k+czwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1MzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTM3Ij41Mzc8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbiBvZiAmIzgyMjA7c2lnbmF0dXJlJiM4MjIxOzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjUzOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1MzgiPjUzODwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5EZWZpbml0aW9uIGFuZCB1c2FnZQ0KQEAgLTMyNzIsNzMxOCArMzI3Myw3NzM4IEBACiBhbmQgPEk+UE9EIGNsYXNzPC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjUzOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1MzkiPjUzOTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+Q29uc3RyYWludHMgb24gPEk+dHlwZS1zcGVjaWZpZXItc2VxPC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU0MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1NDAiPjU0MDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Qcm9wYWdhdGlvbiBvZiBjdi1xdWFsaWZpZXJzIGluIHJlZmVyZW5jZS10by1yZWZlcmVuY2UgY29sbGFwc2U8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTQxIj41NDE8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RGVwZW5kZW50IGZ1bmN0aW9uIHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTQyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU0MiI+NTQyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlZhbHVlIGluaXRpYWxpemF0aW9uIG9mIGFycmF5cyBvZiBQT0Qtc3RydWN0czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU0MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1NDMiPjU0MzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5WYWx1ZSBpbml0aWFsaXphdGlvbiBhbmQgZGVmYXVsdCBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NDQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM1NDQiPjU0NDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5CYXNlIGNsYXNzIGxvb2t1cCBpbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNTQ1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNTQ1Ij41NDU8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPlVzZXItZGVmaW5lZCBjb252ZXJzaW9ucyBhbmQgYnVpbHQtaW4gb3BlcmF0b3Igb3ZlcmxvYWQgcmVzb2x1dGlvbjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTQ2Ij41NDY8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBjbGFzcyB0ZW1wbGF0ZSBtZW1iZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTQ3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU0NyI+NTQ3PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb24gbWVtYmVyIGZ1bmN0aW9uIHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTQ4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNTQ4Ij41NDg8L2E+PC90ZD4KICAgICA8dGQ+ZHVwPC90ZD4KICAgICA8dGQ+PEk+cXVhbGlmaWVkLWlkPC9JPnMgaW4gZGVjbGFyYXRpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI1NDkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM1NDkiPjU0OTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk5vbi1kZWR1Y2libGUgcGFyYW1ldGVycyBpbiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjU1MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzU1MCI+NTUwPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5Qb2ludGVyIHRvIGFycmF5IG9mIHVua25vd24gYm91bmQgaW4gcGFyYW1ldGVyIGRlY2xhcmF0aW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTUxIj41NTE8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+V2hlbiBpcyA8VFQ+aW5saW5lPC9UVD4gcGVybWl0dGVkIGluIGFuIGV4cGxpY2l0IGluc3RhbnRpYXRpb24/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTUyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNTUyIj41NTI8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+VXNlIG9mIDxUVD50eXBlbmFtZTwvVFQ+IGluIHRoZSB0eXBlIGluIGEgbm9uLXR5cGUgPEk+cGFyYW1ldGVyLWRlY2xhcmF0aW9uPC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU1MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzU1MyI+NTUzPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlByb2JsZW1zIHdpdGggZnJpZW5kIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjU1NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzU1NCI+NTU0PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbiBvZiAmIzgyMjA7ZGVjbGFyYXRpdmUgcmVnaW9uJiM4MjIxOyBhbmQgJiM4MjIwO3Njb3BlJiM4MjIxOzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjU1NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzU1NSI+NTU1PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+UHNldWRvLWRlc3RydWN0b3IgbmFtZSBsb29rdXA8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTU2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU1NiI+NTU2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgYWNjZXB0YWJsZSBhbGlhc2luZzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU1NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1NTciPjU1NzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Eb2VzIGFyZ3VtZW50LWRlcGVuZGVudCBsb29rdXAgY2F1c2UgdGVtcGxhdGUgaW5zdGFudGlhdGlvbj88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTU4Ij41NTg8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RXhjbHVkZWQgY2hhcmFjdGVycyBpbiB1bml2ZXJzYWwgY2hhcmFjdGVyIG5hbWVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTU5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU1OSI+NTU5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkVkaXRpbmcgZXJyb3IgaW4gaXNzdWUgMzgyIHJlc29sdXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjU2MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzU2MCI+NTYwPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+VXNlIG9mIHRoZSA8VFQ+dHlwZW5hbWU8L1RUPiBrZXl3b3JkIGluIHJldHVybiB0eXBlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NjEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTYxIj41NjE8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+SW50ZXJuYWwgbGlua2FnZSBmdW5jdGlvbnMgaW4gZGVwZW5kZW50IG5hbWUgbG9va3VwPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI1NjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM1NjIiPjU2MjwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+PEk+cXVhbGlmaWVkLWlkPC9JPnMgaW4gbm9uLWV4cHJlc3Npb24gY29udGV4dHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI1NjMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM1NjMiPjU2MzwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+TGlua2FnZSBzcGVjaWZpY2F0aW9uIGZvciBvYmplY3RzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU2NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1NjQiPjU2NDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5BZ3JlZW1lbnQgb2YgbGFuZ3VhZ2UgbGlua2FnZSBvciA8ST5saW5rYWdlLXNwZWNpZmljYXRpb248L0k+cz88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTY1Ij41NjU8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkNvbmZsaWN0IHJ1bGVzIGZvciA8ST51c2luZy1kZWNsYXJhdGlvbjwvST5zIG5hbWluZyBmdW5jdGlvbiB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM1NjYiPjU2NjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Db252ZXJzaW9uIG9mIG5lZ2F0aXZlIGZsb2F0aW5nIHBvaW50IHZhbHVlcyB0byBpbnRlZ2VyIHR5cGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM1NjciPjU2NzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5DYW4gPFRUPnNpemVfdDwvVFQ+IGFuZCA8VFQ+cHRyZGlmZl90PC9UVD4gYmUgbGFyZ2VyIHRoYW4gPFRUPmxvbmc8L1RUPj88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTY4Ij41Njg8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbiBvZiBQT0QgaXMgdG9vIHN0cmljdDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU2OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1NjkiPjU2OTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5TcHVyaW91cyBzZW1pY29sb25zIGF0IG5hbWVzcGFjZSBzY29wZSBzaG91bGQgYmUgYWxsb3dlZDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU3MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1NzAiPjU3MDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5BcmUgcmVmZXJlbmNlcyBzdWJqZWN0IHRvIHRoZSBPRFI/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTcxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU3MSI+NTcxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlJlZmVyZW5jZXMgZGVjbGFyZWQgPFRUPmNvbnN0PC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTcyIj41NzI8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+U3RhbmRhcmQgY29udmVyc2lvbnMgZm9yIG5vbi1idWlsdC1pbiB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU3MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1NzMiPjU3MzwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Db252ZXJzaW9ucyBiZXR3ZWVuIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCA8VFQ+dm9pZCo8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU3NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzU3NCI+NTc0PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb24gb2YgJiM4MjIwO2NvcHkgYXNzaWdubWVudCBvcGVyYXRvciYjODIyMTs8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1NzUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNTc1Ij41NzU8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+Q3JpdGVyaWEgZm9yIGRlZHVjdGlvbiBmYWlsdXJlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTc2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU3NiI+NTc2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlR5cGVkZWZzIGluIGZ1bmN0aW9uIGRlZmluaXRpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTc3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU3NyI+NTc3PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD48VFQ+dm9pZDwvVFQ+IGluIGFuIGVtcHR5IHBhcmFtZXRlciBsaXN0PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI1NzgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM1NzgiPjU3ODwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+UGhhc2UgMSByZXBsYWNlbWVudCBvZiBjaGFyYWN0ZXJzIHdpdGggPEk+dW5pdmVyc2FsLWNoYXJhY3Rlci1uYW1lPC9JPnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI1NzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM1NzkiPjU3OTwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+V2hhdCBpcyBhICYjODIyMDtuZXN0ZWQmIzgyMjE7IDxUVD4mZ3Q7PC9UVD4gb3IgPFRUPiZndDsmZ3Q7PC9UVD4/PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU4MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1ODAiPjU4MDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5BY2Nlc3MgaW4gPEk+dGVtcGxhdGUtcGFyYW1ldGVyPC9JPnMgb2YgbWVtYmVyIGFuZCBmcmllbmQgZGVmaW5pdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjU4MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzU4MSI+NTgxPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5DYW4gYSB0ZW1wbGF0ZWQgY29uc3RydWN0b3IgYmUgZXhwbGljaXRseSBpbnN0YW50aWF0ZWQgb3Igc3BlY2lhbGl6ZWQ/PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU4MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1ODIiPjU4MjwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5UZW1wbGF0ZSBjb252ZXJzaW9uIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU4MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1ODMiPjU4MzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+UmVsYXRpb25hbCBwb2ludGVyIGNvbXBhcmlzb25zIGFnYWluc3QgdGhlIG51bGwgcG9pbnRlciBjb25zdGFudDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU4NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzU4NCI+NTg0PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlVuaW9ucyBhbmQgYWxpYXNpbmc8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1ODUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM1ODUiPjU4NTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5GcmllbmQgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU4NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzU4NiI+NTg2PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkRlZmF1bHQgPEk+dGVtcGxhdGUtYXJndW1lbnQ8L0k+cyBhbmQgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTg3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU4NyI+NTg3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkx2YWx1ZSBvcGVyYW5kcyBvZiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZGlmZmVyaW5nIG9ubHkgaW4gY3YtcXVhbGlmaWNhdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU4OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1ODgiPjU4ODwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5TZWFyY2hpbmcgZGVwZW5kZW50IGJhc2VzIG9mIGNsYXNzZXMgbG9jYWwgdG8gZnVuY3Rpb24gdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTg5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU4OSI+NTg5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkRpcmVjdCBiaW5kaW5nIG9mIGNsYXNzIGFuZCBhcnJheSBydmFsdWVzIGluIHJlZmVyZW5jZSBpbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU5MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1OTAiPjU5MDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5OZXN0ZWQgY2xhc3NlcyBhbmQgdGhlICYjODIyMDtjdXJyZW50IGluc3RhbnRpYXRpb24mIzgyMjE7PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjU5MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzU5MSI+NTkxPC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5XaGVuIGEgZGVwZW5kZW50IGJhc2UgY2xhc3MgaXMgdGhlIGN1cnJlbnQgaW5zdGFudGlhdGlvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU5MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1OTIiPjU5MjwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5FeGNlcHRpb25zIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgbG9jYWwgc3RhdGljIG9iamVjdHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1OTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM1OTMiPjU5MzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5GYWxsaW5nIG9mZiB0aGUgZW5kIG9mIGEgZGVzdHJ1Y3RvcidzIDxJPmZ1bmN0aW9uLXRyeS1ibG9jazwvST4gaGFuZGxlcjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU5NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1OTQiPjU5NDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Db29yZGluYXRpbmcgaXNzdWVzIDExOSBhbmQgNDA0IHdpdGggZGVsZWdhdGluZyBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI1OTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM1OTUiPjU5NTwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5FeGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgaW4gdGVtcGxhdGVzIGluc3RhbnRpYXRlZCBmcm9tIGNsYXNzIGJvZGllczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNTk2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNTk2Ij41OTY8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPlJlcGxhY2luZyBhbiBleGNlcHRpb24gb2JqZWN0PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjU5NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM1OTciPjU5NzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+Q29udmVyc2lvbnMgYXBwbGllZCB0byBvdXQtb2YtbGlmZXRpbWUgbm9uLVBPRCBsdmFsdWVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTk4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU5OCI+NTk4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkFzc29jaWF0ZWQgbmFtZXNwYWNlcyBvZiBvdmVybG9hZGVkIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb24gdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNTk5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzU5OSI+NTk5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkRlbGV0aW5nIGEgbnVsbCBmdW5jdGlvbiBwb2ludGVyPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI2MDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM2MDAiPjYwMDwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+RG9lcyBhY2Nlc3MgY29udHJvbCBhcHBseSB0byBtZW1iZXJzIG9yIHRvIG5hbWVzPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2MDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjAxIj42MDE8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VHlwZSBvZiBsaXRlcmFscyBpbiBwcmVwcm9jZXNzaW5nIGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjAyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzYwMiI+NjAyPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPldoZW4gaXMgdGhlIGluamVjdGVkLWNsYXNzLW5hbWUgb2YgYSBjbGFzcyB0ZW1wbGF0ZSBhIHRlbXBsYXRlPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYwMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MDMiPjYwMzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5UeXBlIGVxdWl2YWxlbmNlIGFuZCB1bnNpZ25lZCBvdmVyZmxvdzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYwNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MDQiPjYwNDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5Bcmd1bWVudCBsaXN0IGZvciBvdmVybG9hZCByZXNvbHV0aW9uIGluIGNvcHktaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2MDUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjA1Ij42MDU8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TGlua2FnZSBvZiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2MDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjA2Ij42MDY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+VGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGZvciBydmFsdWUgcmVmZXJlbmNlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNjA3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNjA3Ij42MDc8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkxvb2t1cCBvZiA8ST5tZW0taW5pdGlhbGl6ZXItaWQ8L0k+czwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2MDgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjA4Ij42MDg8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RGV0ZXJtaW5pbmcgdGhlIGZpbmFsIG92ZXJyaWRlciBvZiBhIHZpcnR1YWwgZnVuY3Rpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iNjA5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNjA5Ij42MDk8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+V2hhdCBpcyBhICYjODIyMDt0b3AtbGV2ZWwmIzgyMjE7IGN2LXF1YWxpZmllcj88L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2MTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM2MTAiPjYxMDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Db21wdXRpbmcgdGhlIG5lZ2F0aXZlIG9mIDxUVD4wVTwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjExIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzYxMSI+NjExPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlplcm8taW5pdGlhbGl6aW5nIHJlZmVyZW5jZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2MTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjEyIj42MTI8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+UmVxdWlyZW1lbnRzIG9uIGEgY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYxMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MTMiPjYxMzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5VbmV2YWx1YXRlZCB1c2VzIG9mIG5vbi1zdGF0aWMgY2xhc3MgbWVtYmVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYxNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MTQiPjYxNDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5SZXN1bHRzIG9mIGludGVnZXIgPFRUPi88L1RUPiBhbmQgPFRUPiU8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYxNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MTUiPjYxNTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3QgZGVzY3JpcHRpb24gb2YgdmFyaWFibGVzIHRoYXQgY2FuIGJlIGluaXRpYWxpemVkPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjE2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzYxNiI+NjE2PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5EZWZpbml0aW9uIG9mICYjODIyMDtpbmRldGVybWluYXRlIHZhbHVlJiM4MjIxOzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNjE3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNjE3Ij42MTc8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5MdmFsdWUtdG8tcnZhbHVlIGNvbnZlcnNpb25zIG9mIHVuaW5pdGlhbGl6ZWQgPFRUPmNoYXI8L1RUPiBvYmplY3RzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYxOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MTgiPjYxODwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5DYXN0cyBpbiBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2MTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjE5Ij42MTk8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+Q29tcGxldGVuZXNzIG9mIGFycmF5IHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjIwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzYyMCI+NjIwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkRlY2xhcmF0aW9uIG9yZGVyIGluIGxheW91dC1jb21wYXRpYmxlIFBPRCBzdHJ1Y3RzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjIxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzYyMSI+NjIxPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBmcm9tIGZ1bmN0aW9uIHJldHVybiB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNjIyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNjIyIj42MjI8L2E+PC90ZD4KICAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+UmVsYXRpb25hbCBjb21wYXJpc29ucyBvZiBhcmJpdHJhcnkgcG9pbnRlcnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM2MjMiPjYyMzwvYT48L3RkPgotICAgIDx0ZD5leHRlbnNpb248L3RkPgorICA8dHIgaWQ9IjYyMyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MjMiPjYyMzwvYT48L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Vc2Ugb2YgcG9pbnRlcnMgdG8gZGVhbGxvY2F0ZWQgc3RvcmFnZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYyNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MjQiPjYyNDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5PdmVyZmxvdyBpbiBjYWxjdWxhdGluZyBzaXplIG9mIGFsbG9jYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2MjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjI1Ij42MjU8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VXNlIG9mIDxUVD5hdXRvPC9UVD4gYXMgYSA8ST50ZW1wbGF0ZS1hcmd1bWVudDwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2MjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjI2Ij42MjY8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+UHJlcHJvY2Vzc29yIHN0cmluZyBsaXRlcmFsczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYyNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzYyNyI+NjI3PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlZhbHVlcyBiZWhhdmluZyBhcyB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYyOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MjgiPjYyODwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5UaGUgdmFsdWVzIG9mIGFuIGVudW1lcmF0aW9uIHdpdGggbm8gZW51bWVyYXRvcjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYyOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MjkiPjYyOTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD48VFQ+YXV0bzwvVFQ+IHBhcnNpbmcgYW1iaWd1aXR5PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjMwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzYzMCI+NjMwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkVxdWFsaXR5IG9mIG5hcnJvdyBhbmQgd2lkZSBjaGFyYWN0ZXIgdmFsdWVzIGluIHRoZSBiYXNpYyBjaGFyYWN0ZXIgc2V0PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjMxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzYzMSI+NjMxPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5KdW1waW5nIGludG8gYSAmIzgyMjA7dGhlbiYjODIyMTsgY2xhdXNlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjMyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzYzMiI+NjMyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkJyYWNlLWVuY2xvc2VkIGluaXRpYWxpemVyIGZvciBzY2FsYXIgbWVtYmVyIG9mIGFnZ3JlZ2F0ZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYzMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MzMiPjYzMzwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5TcGVjaWZpY2F0aW9ucyBmb3IgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGFsc28gYXBwbHkgdG8gcmVmZXJlbmNlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYzNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MzQiPjYzNDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Db25kaXRpb25hbGx5LXN1cHBvcnRlZCBiZWhhdmlvciBmb3Igbm9uLVBPRCBvYmplY3RzIHBhc3NlZCB0byBlbGxpcHNpcyByZWR1eDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYzNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzYzNSI+NjM1PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPk5hbWVzIG9mIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgb2YgdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI2MzYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM2MzYiPjYzNjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkR5bmFtaWMgdHlwZSBvZiBvYmplY3RzIGFuZCBhbGlhc2luZzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2MzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjM3Ij42Mzc8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+U2VxdWVuY2luZyBydWxlcyBhbmQgZXhhbXBsZSBkaXNhZ3JlZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYzOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MzgiPjYzODwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5FeHBsaWNpdCBzcGVjaWFsaXphdGlvbiBhbmQgZnJpZW5kc2hpcDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjYzOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2MzkiPjYzOTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5XaGF0IG1ha2VzIHNpZGUgZWZmZWN0cyAmIzgyMjA7ZGlmZmVyZW50JiM4MjIxOyBmcm9tIG9uZSBhbm90aGVyPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNjQwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNjQwIj42NDA8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkFjY2Vzc2luZyBkZXN0cm95ZWQgbG9jYWwgb2JqZWN0cyBvZiBzdGF0aWMgc3RvcmFnZSBkdXJhdGlvbjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjQxIj42NDE8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+T3ZlcmxvYWQgcmVzb2x1dGlvbiBhbmQgY29udmVyc2lvbi10by1zYW1lLXR5cGUgb3BlcmF0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjQyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY0MiI+NjQyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb24gYW5kIHVzZSBvZiAmIzgyMjA7YmxvY2sgc2NvcGUmIzgyMjE7IGFuZCAmIzgyMjA7bG9jYWwgc2NvcGUmIzgyMjE7PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjQzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNjQzIj42NDM8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+VXNlIG9mIDxUVD5kZWNsdHlwZTwvVFQ+IGluIGEgY2xhc3MgPEk+bWVtYmVyLXNwZWNpZmljYXRpb248L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjQ0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY0NCI+NjQ0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlNob3VsZCBhIHRyaXZpYWwgY2xhc3MgdHlwZSBiZSBhIGxpdGVyYWwgdHlwZT88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NDUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjQ1Ij42NDU8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+QXJlIGJpdC1maWVsZCBhbmQgbm9uLWJpdC1maWVsZCBtZW1iZXJzIGxheW91dCBjb21wYXRpYmxlPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY0NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzY0NiI+NjQ2PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkNhbiBhIGNsYXNzIHdpdGggYSBjb25zdGV4cHIgY29weSBjb25zdHJ1Y3RvciBiZSBhIGxpdGVyYWwgdHlwZT88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NDciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjQ3Ij42NDc8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Tm9uLWNvbnN0ZXhwciBpbnN0YW5jZXMgb2YgY29uc3RleHByIGNvbnN0cnVjdG9yIHRlbXBsYXRlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY0OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2NDgiPjY0ODwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Db25zdGFudCBleHByZXNzaW9ucyBpbiBjb25zdGV4cHIgaW5pdGlhbGl6ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjQ5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY0OSI+NjQ5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPk9wdGlvbmFsbHkgaWxsLWZvcm1lZCBleHRlbmRlZCBhbGlnbm1lbnQgcmVxdWVzdHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjUwIj42NTA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+T3JkZXIgb2YgZGVzdHJ1Y3Rpb24gZm9yIHRlbXBvcmFyaWVzIGJvdW5kIHRvIHRoZSByZXR1cm5lZCB2YWx1ZSBvZiBhIGZ1bmN0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjUxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY1MSI+NjUxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlByb2JsZW1zIGluIDxUVD5kZWNsdHlwZTwvVFQ+IHNwZWNpZmljYXRpb24gYW5kIGV4YW1wbGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjUyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY1MiI+NjUyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkNvbXBpbGUtdGltZSBldmFsdWF0aW9uIG9mIGZsb2F0aW5nLXBvaW50IGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjUzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY1MyI+NjUzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkNvcHkgYXNzaWdubWVudCBvZiB1bmlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjU0Ij42NTQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+Q29udmVyc2lvbnMgdG8gYW5kIGZyb20gPFRUPm51bGxwdHJfdDwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjU1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY1NSI+NjU1PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkluaXRpYWxpemF0aW9uIG5vdCBzcGVjaWZpZWQgZm9yIGZvcndhcmRpbmcgY29uc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjU2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY1NiI+NjU2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkRpcmVjdCBiaW5kaW5nIHRvIHRoZSByZXN1bHQgb2YgYSBjb252ZXJzaW9uIG9wZXJhdG9yPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjU3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY1NyI+NjU3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkFic3RyYWN0IGNsYXNzIHBhcmFtZXRlciBpbiBzeW50aGVzaXplZCBkZWNsYXJhdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY1OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2NTgiPjY1ODwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5EZWZpbmluZyA8VFQ+cmVpbnRlcnByZXRfY2FzdDwvVFQ+IGZvciBwb2ludGVyIHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjU5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY1OSI+NjU5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkFsaWdubWVudCBvZiBmdW5jdGlvbiB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY2MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2NjAiPjY2MDwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Vbm5hbWVkIHNjb3BlZCBlbnVtZXJhdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NjEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjYxIj42NjE8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+U2VtYW50aWNzIG9mIGFyaXRobWV0aWMgY29tcGFyaXNvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM2NjIiPjY2MjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Gb3JtaW5nIGEgcG9pbnRlciB0byBhIHJlZmVyZW5jZSB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjYzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY2MyI+NjYzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlZhbGlkIEN5cmlsbGljIGlkZW50aWZpZXIgY2hhcmFjdGVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY2NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2NjQiPjY2NDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5EaXJlY3QgYmluZGluZyBvZiByZWZlcmVuY2VzIHRvIG5vbi1jbGFzcyBydmFsdWUgcmVmZXJlbmNlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY2NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2NjUiPjY2NTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5Qcm9ibGVtcyBpbiB0aGUgc3BlY2lmaWNhdGlvbiBvZiA8VFQ+ZHluYW1pY19jYXN0PC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjY2Ij42NjY8L2E+PC90ZD4KICAgICA8dGQ+Q0QxPC90ZD4KICAgICA8dGQ+RGVwZW5kZW50IDxJPnF1YWxpZmllZC1pZDwvST5zIHdpdGhvdXQgdGhlIDxUVD50eXBlbmFtZTwvVFQ+IGtleXdvcmQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjY3Ij42Njc8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VHJpdmlhbCBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbnMgdGhhdCBjYW5ub3QgYmUgaW1wbGljaXRseSBkZWZpbmVkPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjY4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY2OCI+NjY4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlRocm93aW5nIGFuIGV4Y2VwdGlvbiBmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIGEgbG9jYWwgc3RhdGljIG9iamVjdDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY2OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzY2OSI+NjY5PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkNvbmZ1c2luZyBzcGVjaWZpY2F0aW9uIG9mIHRoZSBtZWFuaW5nIG9mIDxUVD5kZWNsdHlwZTwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI2NzAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM2NzAiPjY3MDwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+Q29weSBpbml0aWFsaXphdGlvbiB2aWEgZGVyaXZlZC10by1iYXNlIGNvbnZlcnNpb24gaW4gdGhlIHNlY29uZCBzdGVwPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY3MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2NzEiPjY3MTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5FeHBsaWNpdCBjb252ZXJzaW9uIGZyb20gYSBzY29wZWQgZW51bWVyYXRpb24gdHlwZSB0byBpbnRlZ3JhbCB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjcyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY3MiI+NjcyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlNlcXVlbmNpbmcgb2YgaW5pdGlhbGl6YXRpb24gaW4gPEk+bmV3LWV4cHJlc3Npb248L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY3MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzY3MyI+NjczPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkluamVjdGlvbiBvZiBuYW1lcyBmcm9tIDxJPmVsYWJvcmF0ZWQtdHlwZS1zcGVjaWZpZXI8L0k+cyBpbiA8VFQ+ZnJpZW5kPC9UVD4gZGVjbGFyYXRpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjc0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY3NCI+Njc0PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPiYjODIyMDttYXRjaGluZyBzcGVjaWFsaXphdGlvbiYjODIyMTsgZm9yIGEgZnJpZW5kIGRlY2xhcmF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjc1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY3NSI+Njc1PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5TaWduZWRuZXNzIG9mIGJpdC1maWVsZCB3aXRoIHR5cGVkZWYgb3IgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2NzYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjc2Ij42NzY8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+PEk+c3RhdGljX2Fzc2VydC1kZWNsYXJhdGlvbjwvST5zIGFuZCBnZW5lcmFsIHJlcXVpcmVtZW50cyBmb3IgZGVjbGFyYXRpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjc3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY3NyI+Njc3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkRlbGV0ZWQgPFRUPm9wZXJhdG9yIGRlbGV0ZTwvVFQ+IGFuZCB2aXJ0dWFsIGRlc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjc4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY3OCI+Njc4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkxhbmd1YWdlIGxpbmthZ2Ugb2YgbWVtYmVyIGZ1bmN0aW9uIHBhcmFtZXRlciB0eXBlcyBhbmQgdGhlIE9EUjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY3OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2NzkiPjY3OTwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5FcXVpdmFsZW5jZSBvZiA8ST50ZW1wbGF0ZS1pZDwvST5zIGFuZCBvcGVyYXRvciBmdW5jdGlvbiB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2ODAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjgwIj42ODA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+V2hhdCBpcyBhIG1vdmUgY29uc3RydWN0b3I/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjgxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY4MSI+NjgxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlJlc3RyaWN0aW9ucyBvbiBkZWNsYXJhdG9ycyB3aXRoIGxhdGUtc3BlY2lmaWVkIHJldHVybiB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNjgyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNjgyIj42ODI8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5NaXNzaW5nIGRlc2NyaXB0aW9uIG9mIGxvb2t1cCBvZiB0ZW1wbGF0ZSBhbGlhc2VzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY4MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2ODMiPjY4MzwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5SZXF1aXJlbWVudHMgZm9yIHRyaXZpYWwgc3Vib2JqZWN0IHNwZWNpYWwgZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjg0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY4NCI+Njg0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPkNvbnN0YW50IGV4cHJlc3Npb25zIGludm9sdmluZyB0aGUgYWRkcmVzcyBvZiBhbiBhdXRvbWF0aWMgdmFyaWFibGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2ODUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjg1Ij42ODU8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+SW50ZWdyYWwgcHJvbW90aW9uIG9mIGVudW1lcmF0aW9uIGlnbm9yZXMgZml4ZWQgdW5kZXJseWluZyB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjg2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY4NiI+Njg2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMTwvdGQ+CiAgICAgPHRkPlR5cGUgZGVjbGFyYXRpb25zL2RlZmluaXRpb25zIGluIDxJPnR5cGUtc3BlY2lmaWVyLXNlcTwvST5zIGFuZCA8ST50eXBlLWlkPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjY4NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzY4NyI+Njg3PC9hPjwvdGQ+CiAgICAgPHRkPmV4dGVuc2lvbjwvdGQ+CiAgICAgPHRkPjxUVD50ZW1wbGF0ZTwvVFQ+IGtleXdvcmQgd2l0aCA8ST51bnF1YWxpZmllZC1pZDwvST5zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY4OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2ODgiPjY4ODwvYT48L3RkPgogICAgIDx0ZD5DRDE8L3RkPgogICAgIDx0ZD5Db25zdGV4cHIgY29uc3RydWN0b3JzIGFuZCBzdGF0aWMgaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjY4OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzY4OSI+Njg5PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5NYXhpbXVtIHZhbHVlcyBvZiBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXJzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY5MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2OTAiPjY5MDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5UaGUgZHluYW1pYyB0eXBlIG9mIGFuIHJ2YWx1ZSByZWZlcmVuY2U8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2OTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjkxIj42OTE8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+VGVtcGxhdGUgcGFyYW1ldGVyIHBhY2tzIGluIGNsYXNzIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjkyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY5MiI+NjkyPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlBhcnRpYWwgb3JkZXJpbmcgb2YgdmFyaWFkaWMgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2OTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjkzIj42OTM8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+TmV3IHN0cmluZyB0eXBlcyBhbmQgZGVwcmVjYXRlZCBjb252ZXJzaW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjk0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY5NCI+Njk0PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlplcm8tIGFuZCB2YWx1ZS1pbml0aWFsaXphdGlvbiBvZiB1bmlvbiBvYmplY3RzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNjk1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzY5NSI+Njk1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkNvbXBpbGUtdGltZSBjYWxjdWxhdGlvbiBlcnJvcnMgaW4gY29uc3RleHByIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjY5NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM2OTYiPjY5NjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Vc2Ugb2YgYmxvY2stc2NvcGUgY29uc3RhbnRzIGluIGxvY2FsIGNsYXNzZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjY5NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzY5NyI+Njk3PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5EZWR1Y3Rpb24gcnVsZXMgYXBwbHkgdG8gbW9yZSB0aGFuIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjY5OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzY5OCI+Njk4PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5UaGUgZGVmaW5pdGlvbiBvZiAmIzgyMjA7c2VxdWVuY2VkIGJlZm9yZSYjODIyMTsgaXMgdG9vIG5hcnJvdzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI2OTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNjk5Ij42OTk8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+TXVzdCBjb25zdGV4cHIgbWVtYmVyIGZ1bmN0aW9ucyBiZSBkZWZpbmVkIGluIHRoZSBjbGFzcyA8ST5tZW1iZXItc3BlY2lmaWNhdGlvbjwvST4/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzAwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzcwMCI+NzAwPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkNvbnN0ZXhwciBtZW1iZXIgZnVuY3Rpb25zIG9mIGNsYXNzIHRlbXBsYXRlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjcwMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MDEiPjcwMTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5XaGVuIGlzIHRoZSBhcnJheS10by1wb2ludGVyIGNvbnZlcnNpb24gYXBwbGllZD88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3MDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzAyIj43MDI8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+UHJlZmVycmluZyBjb252ZXJzaW9uIHRvIDxUVD5zdGQ6OmluaXRpYWxpemVyX2xpc3Q8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjcwMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MDMiPjcwMzwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5OYXJyb3dpbmcgZm9yIGxpdGVyYWxzIHRoYXQgY2Fubm90IGJlIGV4YWN0bHkgcmVwcmVzZW50ZWQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3MDQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzA0Ij43MDQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VG8gd2hpY2ggPEk+cG9zdGZpeC1leHByZXNzaW9uPC9JPnMgZG9lcyBvdmVybG9hZCByZXNvbHV0aW9uIGFwcGx5PzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjcwNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MDUiPjcwNTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5TdXBwcmVzc2luZyBhcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwIHZpYSBwYXJlbnRoZXNlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjcwNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzcwNiI+NzA2PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlVzZSBvZiA8VFQ+YXV0bzwvVFQ+IHdpdGggcnZhbHVlIHJlZmVyZW5jZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3MDciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzA3Ij43MDc8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VW5kZWZpbmVkIGJlaGF2aW9yIGluIGludGVncmFsLXRvLWZsb2F0aW5nIGNvbnZlcnNpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI3MDgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM3MDgiPjcwODwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+UGFydGlhbCBzcGVjaWFsaXphdGlvbiBvZiBtZW1iZXIgdGVtcGxhdGVzIG9mIGNsYXNzIHRlbXBsYXRlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3MDkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzA5Ij43MDk8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RW51bWVyYXRpb24gbmFtZXMgYXMgPEk+bmVzdGVkLW5hbWUtc3BlY2lmaWVyPC9JPnMgaW4gZGVkdWN0aW9uIGZhaWx1cmU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3MTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzEwIj43MTA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RGF0YSByYWNlcyBkdXJpbmcgY29uc3RydWN0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzExIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzcxMSI+NzExPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPjxUVD5hdXRvPC9UVD4gd2l0aCA8ST5icmFjZWQtaW5pdC1saXN0PC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjcxMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MTIiPjcxMjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+QXJlIGludGVnZXIgY29uc3RhbnQgb3BlcmFuZHMgb2YgYSA8ST5jb25kaXRpb25hbC1leHByZXNzaW9uPC9JPiAmIzgyMjA7dXNlZD8mIzgyMjE7PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzEzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzcxMyI+NzEzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlVuY2xlYXIgbm90ZSBhYm91dCBjdi1xdWFsaWZpZWQgZnVuY3Rpb24gdHlwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3MTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzE0Ij43MTQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+U3RhdGljIGNvbnN0IGRhdGEgbWVtYmVycyBhbmQgPEk+YnJhY2VkLWluaXQtbGlzdDwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzE1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzcxNSI+NzE1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkNsYXNzIG1lbWJlciBhY2Nlc3MgY29uc3RhbnQgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3MTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzE2Ij43MTY8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+U3BlY2lmaWNhdGlvbnMgdGhhdCBzaG91bGQgYXBwbHkgb25seSB0byBub24tc3RhdGljIHVuaW9uIGRhdGEgbWVtYmVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjcxNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MTciPjcxNzwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5VbmludGVudGlvbmFsIHJlc3RyaWN0aW9ucyBvbiB0aGUgdXNlIG9mIDxUVD50aHJlYWRfbG9jYWw8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNzE4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNzE4Ij43MTg8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPk5vbi1jbGFzcywgbm9uLWZ1bmN0aW9uIGZyaWVuZCBkZWNsYXJhdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzE5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzcxOSI+NzE5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlNwZWNpZmljYXRpb25zIGZvciA8ST5vcGVyYXRvci1mdW5jdGlvbi1pZDwvST4gdGhhdCBzaG91bGQgYWxzbyBhcHBseSB0byA8ST5saXRlcmFsLW9wZXJhdG9yLWlkPC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjcyMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MjAiPjcyMDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5OZWVkIGV4YW1wbGVzIG9mIDxJPmxhbWJkYS1leHByZXNzaW9uPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3MjEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzIxIj43MjE8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+V2hlcmUgbXVzdCBhIHZhcmlhYmxlIGJlIGluaXRpYWxpemVkIHRvIGJlIHVzZWQgaW4gYSBjb25zdGFudCBleHByZXNzaW9uPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjcyMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MjIiPjcyMjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5DYW4gPFRUPm51bGxwdHI8L1RUPiBiZSBwYXNzZWQgdG8gYW4gZWxsaXBzaXM/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzI2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzcyNiI+NzI2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkF0b21pYyBhbmQgbm9uLWF0b21pYyBvYmplY3RzIGluIHRoZSBtZW1vcnkgbW9kZWw8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjcyNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzcyNyI+NzI3PC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkluLWNsYXNzIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjcyOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzcyOCI+NzI4PC9hPjwvdGQ+CiAgICAgPHRkPmV4dGVuc2lvbjwvdGQ+CiAgICAgPHRkPlJlc3RyaWN0aW9ucyBvbiBsb2NhbCBjbGFzc2VzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjcyOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MjkiPjcyOTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+UXVhbGlmaWNhdGlvbiBjb252ZXJzaW9ucyBhbmQgaGFuZGxlcnMgb2YgcmVmZXJlbmNlLXRvLXBvaW50ZXIgdHlwZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjczMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MzAiPjczMDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5FeHBsaWNpdCBzcGVjaWFsaXphdGlvbnMgb2YgbWVtYmVycyBvZiBub24tdGVtcGxhdGUgY2xhc3NlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjczMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MzEiPjczMTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5PbWl0dGVkIHJlZmVyZW5jZSBxdWFsaWZpY2F0aW9uIG9mIG1lbWJlciBmdW5jdGlvbiB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzMyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzczMiI+NzMyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkxhdGUtc3BlY2lmaWVkIHJldHVybiB0eXBlcyBpbiBmdW5jdGlvbiBkZWZpbml0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjczMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzczMyI+NzMzPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlJlZmVyZW5jZSBxdWFsaWZpY2F0aW9uIG9mIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3MzQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzM0Ij43MzQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+QXJlIHVuaXF1ZSBhZGRyZXNzZXMgcmVxdWlyZWQgZm9yIG5hbWVzcGFjZS1zY29wZSB2YXJpYWJsZXM/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzM1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzczNSI+NzM1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPk1pc3NpbmcgY2FzZSBpbiBzcGVjaWZpY2F0aW9uIG9mIHNhZmVseS1kZXJpdmVkIHBvaW50ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzM2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNzM2Ij43MzY8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+SXMgdGhlIDxUVD4mYW1wOzwvVFQ+IDxJPnJlZi1xdWFsaWZpZXI8L0k+IG5lZWRlZD88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3MzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzM3Ij43Mzc8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VW5pbml0aWFsaXplZCB0cmFpbGluZyBjaGFyYWN0ZXJzIGluIHN0cmluZyBpbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjczOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MzgiPjczODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48VFQ+Y29uc3RleHByPC9UVD4gbm90IHBlcm1pdHRlZCBieSB0aGUgc3ludGF4IG9mIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjczOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3MzkiPjczOTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+U2lnbmVkbmVzcyBvZiBwbGFpbiBiaXQtZmllbGRzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzQwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc0MCI+NzQwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkluY29ycmVjdCBub3RlIG9uIGRhdGEgcmFjZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzQxIj43NDE8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+JiM4MjIwO3BsYWluJiM4MjIxOyA8VFQ+bG9uZyBsb25nPC9UVD4gYml0LWZpZWxkczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNzQyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjNzQyIj43NDI8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPlBvc3RmaXggaW5jcmVtZW50L2RlY3JlbWVudCB3aXRoIGxvbmcgYml0LWZpZWxkIG9wZXJhbmRzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc0MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NDMiPjc0MzwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5Vc2Ugb2YgPFRUPmRlY2x0eXBlPC9UVD4gaW4gYSA8ST5uZXN0ZWQtbmFtZS1zcGVjaWZpZXI8L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzQ0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc0NCI+NzQ0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPk1hdGNoaW5nIHRlbXBsYXRlIGFyZ3VtZW50cyB3aXRoIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlcnMgd2l0aCBwYXJhbWV0ZXIgcGFja3M8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9Ijc0NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzc0NSI+NzQ1PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5FZmZlY3Qgb2YgaWxsLWZvcm1lZG5lc3MgcmVzdWx0aW5nIGZyb20gPFRUPiNlcnJvcjwvVFQ+PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc0NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NDYiPjc0NjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5Vc2Ugb2YgPFRUPmF1dG88L1RUPiBpbiA8ST5uZXctZXhwcmVzc2lvbjwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzQ3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNzQ3Ij43NDc8L2E+PC90ZD4KICAgICA8dGQ+ZHVwPC90ZD4KICAgICA8dGQ+QWNjZXNzIG9mIHByb3RlY3RlZCBiYXNlIGNsYXNzZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NDkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzQ5Ij43NDk8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+UmVmZXJlbmNlcyB0byBmdW5jdGlvbiB0eXBlcyB3aXRoIGEgPEk+Y3YtcXVhbGlmaWVyPC9JPiBvciA8ST5yZWYtcXVhbGlmaWVyPC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc1MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NTAiPjc1MDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5JbXBsZW1lbnRhdGlvbiBjb25zdHJhaW50cyBvbiByZWZlcmVuY2Utb25seSBjbG9zdXJlIG9iamVjdHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzUxIj43NTE8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RGVyaXZpbmcgZnJvbSBjbG9zdXJlIGNsYXNzZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzUyIj43NTI8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+TmFtZSBsb29rdXAgaW4gbmVzdGVkIDxJPmxhbWJkYS1leHByZXNzaW9uPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzUzIj43NTM8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+QXJyYXkgbmFtZXMgaW4gbGFtYmRhIGNhcHR1cmUgc2V0czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc1NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NTQiPjc1NDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5MYW1iZGEgZXhwcmVzc2lvbnMgaW4gZGVmYXVsdCBhcmd1bWVudHMgb2YgYmxvY2stc2NvcGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM3NTUiPjc1NTwvYT48L3RkPgotICAgIDx0ZD5leHRlbnNpb248L3RkPgorICA8dHIgaWQ9Ijc1NSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NTUiPjc1NTwvYT48L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5HZW5lcmFsaXplZCA8ST5sYW1iZGEtY2FwdHVyZTwvST5zPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzU2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc1NiI+NzU2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkRyb3BwaW5nIGN2LXF1YWxpZmljYXRpb24gb24gbWVtYmVycyBvZiBjbG9zdXJlIG9iamVjdHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NTciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzU3Ij43NTc8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VHlwZXMgd2l0aG91dCBsaW5rYWdlIGluIGRlY2xhcmF0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc1OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NTgiPjc1ODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5NaXNzaW5nIGNhc2VzIG9mIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBub3QgZGVmaW5pdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzU5Ij43NTk8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RGVzdHJ1Y3Rpb24gb2YgY2xvc3VyZSBvYmplY3RzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzYwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc2MCI+NzYwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPjxUVD50aGlzPC9UVD4gaW5zaWRlIGEgbmVzdGVkIGNsYXNzIG9mIGEgbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NjEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzYxIj43NjE8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+SW5mZXJyZWQgcmV0dXJuIHR5cGUgb2YgY2xvc3VyZSBvYmplY3QgY2FsbCBvcGVyYXRvcjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc2MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NjIiPjc2MjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5OYW1lIGxvb2t1cCBpbiB0aGUgPEk+Y29tcG91bmQtc3RhdGVtZW50PC9JPiBvZiBhIGxhbWJkYSBleHByZXNzaW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzYzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc2MyI+NzYzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPklzIGEgY2xvc3VyZSBvYmplY3QncyA8VFQ+b3BlcmF0b3IoKTwvVFQ+IGlubGluZT88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NjQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzY0Ij43NjQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+Q2FwdHVyaW5nIHVudXNlZCB2YXJpYWJsZXMgaW4gYSBsYW1iZGEgZXhwcmVzc2lvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc2NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NjUiPjc2NTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5Mb2NhbCB0eXBlcyBpbiBpbmxpbmUgZnVuY3Rpb25zIHdpdGggZXh0ZXJuYWwgbGlua2FnZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc2NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NjYiPjc2NjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5XaGVyZSBtYXkgbGFtYmRhIGV4cHJlc3Npb25zIGFwcGVhcj88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzY3Ij43Njc8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+PFRUPnZvaWQ8L1RUPiBhbmQgb3RoZXIgdW5uYW1lZCA8ST5sYW1iZGEtcGFyYW1ldGVyPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzY4Ij43Njg8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RWxsaXBzaXMgaW4gYSBsYW1iZGEgcGFyYW1ldGVyIGxpc3Q8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NjkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzY5Ij43Njk8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+SW5pdGlhbGl6YXRpb24gb2YgY2xvc3VyZSBvYmplY3RzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzcwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc3MCI+NzcwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkFtYmlndWl0eSBpbiBsYXRlLXNwZWNpZmllZCByZXR1cm4gdHlwZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc3MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NzEiPjc3MTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5Nb3ZlLWNvbnN0cnVjdGlvbiBvZiByZWZlcmVuY2UgbWVtYmVycyBvZiBjbG9zdXJlIG9iamVjdHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzcyIj43NzI8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+PEk+Y2FwdHVyZS1kZWZhdWx0PC9JPiBpbiBsYW1iZGFzIGluIGxvY2FsIGRlZmF1bHQgYXJndW1lbnRzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzczIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc3MyI+NzczPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlBhcmVudGhlc2VzIGluIGFkZHJlc3Mgbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnRzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzc0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc3NCI+Nzc0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkNhbiBhIGNsb3N1cmUgY2xhc3MgYmUgYSBQT0Q/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzc1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc3NSI+Nzc1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkNhcHR1cmluZyByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc3NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NzYiPjc3NjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5EZWxlZ2F0aW5nIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMsIGFuZCA8VFQ+c3RkOjpleGl0PC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3NzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzc3Ij43Nzc8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RGVmYXVsdCBhcmd1bWVudHMgYW5kIHBhcmFtZXRlciBwYWNrczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc3OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NzgiPjc3ODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5UZW1wbGF0ZSBwYXJhbWV0ZXIgcGFja3MgaW4gbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc3OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3NzkiPjc3OTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5SdmFsdWUgcmVmZXJlbmNlIG1lbWJlcnMgb2YgY2xvc3VyZSBvYmplY3RzPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc4MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3ODIiPjc4MjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5MYW1iZGEgZXhwcmVzc2lvbnMgYW5kIGFyZ3VtZW50LWRlcGVuZGVudCBsb29rdXA8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9Ijc4MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzc4MyI+NzgzPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5EZWZpbml0aW9uIG9mICYjODIyMDthcmd1bWVudCYjODIyMTs8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzg0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc4NCI+Nzg0PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkxpc3Qgb2YgaW5jb21wYXRpYmlsaXRpZXMgd2l0aCB0aGUgcHJldmlvdXMgU3RhbmRhcmQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3ODUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzg1Ij43ODU8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+JiM4MjIwO0V4ZWN1dGlvbiBzZXF1ZW5jZSYjODIyMTsgaXMgaW5hcHByb3ByaWF0ZSBwaHJhc2VvbG9neTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc4NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3ODYiPjc4NjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5EZWZpbml0aW9uIG9mICYjODIyMDt0aHJlYWQmIzgyMjE7PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzg3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc4NyI+Nzg3PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlVubmVjZXNzYXJ5IGxleGljYWwgdW5kZWZpbmVkIGJlaGF2aW9yPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzg4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc4OCI+Nzg4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlJlbGF0aW9uc2hpcCBiZXR3ZWVuIGxvY2FsZSBhbmQgdmFsdWVzIG9mIHRoZSBleGVjdXRpb24gY2hhcmFjdGVyIHNldDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc4OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3ODkiPjc4OTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5EZXByZWNhdGluZyB0cmlncmFwaHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3OTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjNzkwIj43OTA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+Q29uY2F0ZW5hdGlvbiBvZiByYXcgYW5kIG5vbi1yYXcgc3RyaW5nIGxpdGVyYWxzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzkyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc5MiI+NzkyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkVmZmVjdHMgb2YgPFRUPnN0ZDo6cXVpY2tfZXhpdDwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzkzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc5MyI+NzkzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlVzZSBvZiBjbGFzcyBtZW1iZXJzIGR1cmluZyBkZXN0cnVjdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iNzk0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjNzk0Ij43OTQ8L2E+PC90ZD4KICAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+QmFzZS1kZXJpdmVkIGNvbnZlcnNpb24gaW4gbWVtYmVyIHR5cGUgb2YgcG9pbnRlci10by1tZW1iZXIgY29udmVyc2lvbjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI3OTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM3OTUiPjc5NTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5EZXBlbmRlbmN5IG9mIGxhbWJkYXMgb24gPFRUPiZsdDtmdW5jdGlvbmFsJmd0OzwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzk2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc5NiI+Nzk2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkxpZmV0aW1lIG9mIGEgY2xvc3VyZSBvYmplY3Qgd2l0aCBtZW1iZXJzIGNhcHR1cmVkIGJ5IHJlZmVyZW5jZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc5NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3OTciPjc5NzwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5Db252ZXJ0aW5nIGEgbm8tY2FwdHVyZSBsYW1iZGEgdG8gYSBmdW5jdGlvbiB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iNzk4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzc5OCI+Nzk4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk92ZXJsb2FkZWQgc3Vic2NyaXB0IG9wZXJhdG9yIGRlc2NyaWJlZCBpbiBjbGF1c2UgNTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijc5OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM3OTkiPjc5OTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5DYW4gPFRUPnJlaW50ZXJwcmV0X2Nhc3Q8L1RUPiBiZSB1c2VkIHRvIGNhc3QgYW4gb3BlcmFuZCB0byBpdHMgb3duIHR5cGU/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODAwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjODAwIj44MDA8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+U2FmZWx5LWRlcml2ZWQgcG9pbnRlcnMgYW5kIG9iamVjdCBwb2ludGVycyBjb252ZXJ0ZWQgZnJvbSBmdW5jdGlvbiBwb2ludGVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgwMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4MDEiPjgwMTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5DYXN0aW5nIGF3YXkgY29uc3RuZXNzIGluIGEgY2FzdCB0byBydmFsdWUgcmVmZXJlbmNlIHR5cGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MDMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODAzIj44MDM8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+PFRUPnNpemVvZjwvVFQ+IGFuIGVudW1lcmF0aW9uIHR5cGUgd2l0aCBhIGZpeGVkIHVuZGVybHlpbmcgdHlwZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgwNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4MDQiPjgwNDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5EZWR1Y2luZyB0aGUgdHlwZSBpbiA8VFQ+bmV3IGF1dG8oeCk8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgwNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4MDUiPjgwNTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5XaGljaCBleGNlcHRpb24gdG8gdGhyb3cgZm9yIG92ZXJmbG93IGluIGFycmF5IHNpemUgY2FsY3VsYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODA2Ij44MDY8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RW51bWVyYXRpb24gdHlwZXMgaW4gaW50ZWdyYWwgY29uc3RhbnQgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MDciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM4MDciPjgwNzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD48VFQ+dHlwZWlkPC9UVD4gZXhwcmVzc2lvbnMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MDgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODA4Ij44MDg8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+Tm9uLXR5cGUgPEk+ZGVjbC1zcGVjaWZpZXI8L0k+cyB2ZXJzdXMgbWF4LW11bmNoPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODA5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzgwOSI+ODA5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkRlcHJlY2F0aW9uIG9mIHRoZSA8VFQ+cmVnaXN0ZXI8L1RUPiBrZXl3b3JkPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODEwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzgxMCI+ODEwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkJsb2NrLXNjb3BlIDxUVD50aHJlYWRfbG9jYWw8L1RUPiB2YXJpYWJsZXMgc2hvdWxkIGJlIGltcGxpY2l0bHkgPFRUPnN0YXRpYzwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODExIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzgxMSI+ODExPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlVuY2xlYXIgaW1wbGljYXRpb25zIG9mIGNvbnN0LXF1YWxpZmljYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODEyIj44MTI8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RHVwbGljYXRlIG5hbWVzIGluIGlubGluZSBuYW1lc3BhY2VzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI4MTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM4MTMiPjgxMzwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+PFRUPnR5cGVuYW1lPC9UVD4gaW4gYSA8ST51c2luZy1kZWNsYXJhdGlvbjwvST4gd2l0aCBhIG5vbi1kZXBlbmRlbnQgbmFtZTwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODE0Ij44MTQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+QXR0cmlidXRlIHRvIGluZGljYXRlIHRoYXQgYSBmdW5jdGlvbiB0aHJvd3Mgbm90aGluZzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgxNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4MTUiPjgxNTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5QYXJhbWV0ZXIgcGFjayBleHBhbnNpb24gaW5zaWRlIGF0dHJpYnV0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODE2Ij44MTY8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RGlhZ25vc2luZyB2aW9sYXRpb25zIG9mIDxUVD5bW2ZpbmFsXV08L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgxNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4MTciPjgxNzwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5NZWFuaW5nIG9mIDxUVD5bW2ZpbmFsXV08L1RUPiBhcHBsaWVkIHRvIGEgY2xhc3MgZGVmaW5pdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgxOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4MTgiPjgxODwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5GdW5jdGlvbiBwYXJhbWV0ZXIgcGFja3MgaW4gbm9uLWZpbmFsIHBvc2l0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgxOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzgxOSI+ODE5PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkFjY2VzcyBjb250cm9sIGFuZCBkZWxldGVkIGltcGxpY2l0bHktZGVjbGFyZWQgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODIwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzgyMCI+ODIwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkRlcHJlY2F0aW9uIG9mIDxUVD5leHBvcnQ8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iODIyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjODIyIj44MjI8L2E+PC90ZD4KICAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+QWRkaXRpb25hbCBjb250ZXh0cyBmb3IgdGVtcGxhdGUgYWxpYXNlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MjMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODIzIj44MjM8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+TGl0ZXJhbCB0eXBlcyB3aXRoIGNvbnN0ZXhwciBjb252ZXJzaW9ucyBhcyBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODI4Ij44Mjg8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RGVzdHJ1Y3Rpb24gb2YgZXhjZXB0aW9uIG9iamVjdHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MjkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM4MjkiPjgyOTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5BdCB3aGF0IHBvaW50IGlzIDxUVD5zdGQ6OnVuZXhwZWN0ZWQ8L1RUPiBjYWxsZWQ/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODMwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzgzMCI+ODMwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkRlcHJlY2F0aW5nIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgzMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4MzEiPjgzMTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5MaW1pdCBvbiByZWN1cnNpdmVseSBuZXN0ZWQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODMyIj44MzI8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VmFsdWUgb2YgcHJlcHJvY2Vzc2luZyBudW1iZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODMzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzgzMyI+ODMzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0IGNvbnZlcnNpb24gb2YgYSBzY29wZWQgZW51bWVyYXRpb24gdmFsdWUgdG8gYSBmbG9hdGluZyB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODM0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzgzNCI+ODM0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPldoYXQgaXMgYW4gJiM4MjIwO29yZGluYXJ5IHN0cmluZyBsaXRlcmFsJiM4MjIxOz88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4MzUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODM1Ij44MzU8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+U2NvcGVkIGVudW1lcmF0aW9ucyBhbmQgdGhlICYjODIyMDt1c3VhbCBhcml0aG1ldGljIGNvbnZlcnNpb25zJiM4MjIxOzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgzNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzgzNiI+ODM2PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPjxUVD5bW25vcmV0dXJuXV08L1RUPiBhcHBsaWVkIHRvIGZ1bmN0aW9uIHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODM3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzgzNyI+ODM3PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkNvbnN0ZXhwciBmdW5jdGlvbnMgYW5kIDxUVD5yZXR1cm48L1RUPiA8ST5icmFjZWQtaW5pdC1saXN0PC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgzOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4MzgiPjgzODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Vc2Ugb2YgPFRUPnRoaXM8L1RUPiBpbiBhIDxJPmJyYWNlLW9yLWVxdWFsLWluaXRpYWxpemVyPC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjgzOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzgzOSI+ODM5PC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPjxUVD5zaXplb2Y8L1RUPiB3aXRoIG9wYXF1ZSBlbnVtZXJhdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODQwIj44NDA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+UnZhbHVlIHJlZmVyZW5jZXMgYXMgbm9udHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODQyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg0MiI+ODQyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkNhc3RpbmcgdG8gcnZhbHVlIHJlZmVyZW5jZSB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODQ1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg0NSI+ODQ1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPldoYXQgaXMgdGhlICYjODIyMDtmaXJzdCBkZWNsYXJhdGlvbiYjODIyMTsgb2YgYW4gZXhwbGljaXQgc3BlY2lhbGl6YXRpb24/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODQ2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg0NiI+ODQ2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlJ2YWx1ZSByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijg0NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4NDciPjg0NzwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5FcnJvciBpbiBydmFsdWUgcmVmZXJlbmNlIGRlZHVjdGlvbiBleGFtcGxlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODUwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg1MCI+ODUwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlJlc3RyaWN0aW9ucyBvbiB1c2Ugb2Ygbm9uLXN0YXRpYyBkYXRhIG1lbWJlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9Ijg1MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzg1MiI+ODUyPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD48ST51c2luZy1kZWNsYXJhdGlvbjwvST5zIGFuZCBkZXBlbmRlbnQgYmFzZSBjbGFzc2VzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijg1MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4NTMiPjg1MzwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5TdXBwb3J0IGZvciByZWxheGVkIHBvaW50ZXIgc2FmZXR5PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODU0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg1NCI+ODU0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkxlZnQgc2hpZnQgYW5kIHVuc2lnbmVkIGV4dGVuZGVkIHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODU1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg1NSI+ODU1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkluY29ycmVjdCBjb21tZW50cyBpbiA8ST5icmFjZWQtaW5pdC1saXN0PC9JPiBhc3NpZ25tZW50IGV4YW1wbGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODU4Ij44NTg8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RXhhbXBsZSBiaW5kaW5nIGFuIHJ2YWx1ZSByZWZlcmVuY2UgdG8gYW4gbHZhbHVlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODYwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg2MCI+ODYwPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0IHF1YWxpZmljYXRpb24gb2YgY29uc3RleHByIG1lbWJlciBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NjEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODYxIj44NjE8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VW5pbnRlbmRlZCBhbWJpZ3VpdHkgaW4gaW5saW5lIG5hbWVzcGFjZSBsb29rdXA8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODYyIj44NjI8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VW5kZWZpbmVkIGJlaGF2aW9yIHdpdGggZW51bWVyYXRvciB2YWx1ZSBvdmVyZmxvdzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijg2MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4NjMiPjg2MzwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5SdmFsdWUgcmVmZXJlbmNlIGNhc3QgdG8gaW5jb21wbGV0ZSB0eXBlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODY0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg2NCI+ODY0PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPjxJPmJyYWNlZC1pbml0LWxpc3Q8L0k+IGluIHRoZSByYW5nZS1iYXNlZCA8VFQ+Zm9yPC9UVD4gc3RhdGVtZW50PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODY1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg2NSI+ODY1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkluaXRpYWxpemluZyBhIDxUVD5zdGQ6OmluaXRpYWxpemVyX2xpc3Q8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijg2OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4NjkiPjg2OTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5VbmluaXRpYWxpemVkIDxUVD50aHJlYWRfbG9jYWw8L1RUPiBvYmplY3RzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODcyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg3MiI+ODcyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkxleGljYWwgaXNzdWVzIHdpdGggcmF3IHN0cmluZ3M8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODczIj44NzM8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RGVkdWNpbmcgcnZhbHVlIHJlZmVyZW5jZXMgaW4gZGVjbGFyYXRpdmUgY29udGV4dHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NzQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODc0Ij44NzQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+Q2xhc3Mtc2NvcGUgZGVmaW5pdGlvbnMgb2YgZW51bWVyYXRpb24gdHlwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NzYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODc2Ij44NzY8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VHlwZSByZWZlcmVuY2VzIGluIHJ2YWx1ZSByZWZlcmVuY2UgZGVkdWN0aW9uIHNwZWNpZmljYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODc3Ij44Nzc8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VmlhYmxlIGZ1bmN0aW9ucyBhbmQgYmluZGluZyByZWZlcmVuY2VzIHRvIHJ2YWx1ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4NzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODc5Ij44Nzk8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+TWlzc2luZyBidWlsdC1pbiBjb21wYXJpc29uIG9wZXJhdG9ycyBmb3IgcG9pbnRlciB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijg4MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4ODAiPjg4MDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5CdWlsdC1pbiBjb25kaXRpb25hbCBvcGVyYXRvciBmb3Igc2NvcGVkIGVudW1lcmF0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijg4MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4ODIiPjg4MjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5EZWZpbmluZyA8VFQ+bWFpbjwvVFQ+IGFzIGRlbGV0ZWQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4ODMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODgzIj44ODM8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+PFRUPnN0ZDo6bWVtY3B5PC9UVD4gdnMgPFRUPnN0ZDo6bWVtbW92ZTwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODg0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg4NCI+ODg0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkRlZmluaW5nIGFuIGV4cGxpY2l0bHktc3BlY2lhbGl6ZWQgc3RhdGljIGRhdGEgbWVtYmVyPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODg1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjODg1Ij44ODU8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+UGFydGlhbCBvcmRlcmluZyBvZiBmdW5jdGlvbiB0ZW1wbGF0ZXMgd2l0aCB1bm9yZGVyZWQgcGFyYW1ldGVyIHBhaXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODg2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg4NiI+ODg2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPk1lbWJlciBpbml0aWFsaXplcnMgYW5kIGFnZ3JlZ2F0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI4ODciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjODg3Ij44ODc8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+TW92ZSBjb25zdHJ1Y3Rpb24gb2YgdGhyb3duIG9iamVjdDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijg4OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4ODgiPjg4ODwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5VbmlvbiBtZW1iZXIgaW5pdGlhbGl6ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODkxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg5MSI+ODkxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPjxUVD5jb25zdF9jYXN0PC9UVD4gdG8gcnZhbHVlIHJlZmVyZW5jZSBmcm9tIG9iamVjdGxlc3MgcnZhbHVlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODkyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg5MiI+ODkyPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk1pc3NpbmcgcmVxdWlyZW1lbnRzIGZvciBjb25zdGV4cHIgY29uc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODkzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjODkzIj44OTM8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+QnJhY2Ugc3ludGF4IGZvciA8ST5lbnVtZXJhdG9yLWRlZmluaXRpb248L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijg5NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM4OTYiPjg5NjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5SdmFsdWUgcmVmZXJlbmNlcyBhbmQgcnZhbHVlLXJlZmVyZW5jZSBjb252ZXJzaW9uIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iODk3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjODk3Ij44OTc8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPjxUVD5fUHJhZ21hPC9UVD4gYW5kIGV4dGVuZGVkIDxJPnN0cmluZy1saXRlcmFsPC9JPnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODk4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg5OCI+ODk4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkRlY2xhcmF0aW9ucyBpbiBjb25zdGV4cHIgZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iODk5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzg5OSI+ODk5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0IGNvbnZlcnNpb24gZnVuY3Rpb25zIGluIGRpcmVjdCBjbGFzcyBpbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjkwMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzkwMCI+OTAwPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkxpZmV0aW1lIG9mIHRlbXBvcmFyaWVzIGluIHJhbmdlLWJhc2VkIDxUVD5mb3I8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iOTAxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjOTAxIj45MDE8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5EZWxldGVkIDxUVD5vcGVyYXRvciBkZWxldGU8L1RUPjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM5MDIiPjkwMjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Jbi1jbGFzcyBpbml0aWFsaXphdGlvbiBvZiBub24tY29uc3RhbnQgc3RhdGljIGRhdGEgbWVtYmVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjkwMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5MDMiPjkwMzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+VmFsdWUtZGVwZW5kZW50IGludGVncmFsIG51bGwgcG9pbnRlciBjb25zdGFudHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MDQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTA0Ij45MDQ8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+UGFyYW1ldGVyIHBhY2tzIGluIDxJPmxhbWJkYS1jYXB0dXJlPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MDUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTA1Ij45MDU8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RXhwbGljaXQgZGVmYXVsdGVkIGNvcHkgY29uc3RydWN0b3JzIGFuZCB0cml2aWFsIGNvcHlhYmlsaXR5PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTA2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzkwNiI+OTA2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPldoaWNoIHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9ucyBjYW4gYmUgZGVmYXVsdGVkPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjkwOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5MDgiPjkwODwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5EZWxldGVkIGdsb2JhbCBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTA5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjOTA5Ij45MDk8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+T2xkLXN0eWxlIGNhc3RzIHdpdGggY29udmVyc2lvbiBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTEwIj45MTA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+TW92ZSBjb25zdHJ1Y3RvcnMgYW5kIGltcGxpY2l0bHktZGVjbGFyZWQgY29weSBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTEyIj45MTI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkNoYXJhY3RlciBsaXRlcmFscyBhbmQgPEk+dW5pdmVyc2FsLWNoYXJhY3Rlci1uYW1lPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTEzIj45MTM8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RGVkdWN0aW9uIHJ1bGVzIGZvciBhcnJheS0gYW5kIGZ1bmN0aW9uLXR5cGUgY29udmVyc2lvbiBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjkxNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzkxNCI+OTE0PC9hPjwvdGQ+CiAgICAgPHRkPmV4dGVuc2lvbjwvdGQ+CiAgICAgPHRkPlZhbHVlLWluaXRpYWxpemF0aW9uIG9mIGFycmF5IHR5cGVzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjkxNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5MTUiPjkxNTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5EZWxldGVkIHNwZWNpYWxpemF0aW9ucyBvZiBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI5MTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM5MTYiPjkxNjwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+RG9lcyBhIHJlZmVyZW5jZSB0eXBlIGhhdmUgYSBkZXN0cnVjdG9yPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTE5Ij45MTk8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+Q29udHJhZGljdGlvbnMgcmVnYXJkaW5nIGlubGluZSBuYW1lc3BhY2VzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTIwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzkyMCI+OTIwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkludGVyYWN0aW9uIG9mIGlubGluZSBuYW1lc3BhY2VzIGFuZCA8ST51c2luZy1kZWNsYXJhdGlvbjwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTIxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzkyMSI+OTIxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlVuY2xlYXIgc3BlY2lmaWNhdGlvbiBvZiBpbmxpbmUgbmFtZXNwYWNlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjkyMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5MjIiPjkyMjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5JbXBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9yIGRlZmluaXRpb25zIGFuZCA8VFQ+Y29uc3Q8L1RUPiB2YXJpYW50IG1lbWJlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MjMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTIzIj45MjM8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+SW5saW5lIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjkyNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5MjQiPjkyNDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48ST5hbGlhcy1kZWNsYXJhdGlvbjwvST4gYXMgYSBjbGFzcyBtZW1iZXI8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjkyNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzkyNSI+OTI1PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5UeXBlIG9mIGNoYXJhY3RlciBsaXRlcmFscyBpbiBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTI2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzkyNiI+OTI2PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPklubGluZSB1bm5hbWVkIG5hbWVzcGFjZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTI3Ij45Mjc8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+SW1wbGljaXRseS1kZWxldGVkIGRlZmF1bHQgY29uc3RydWN0b3JzIGFuZCBtZW1iZXIgaW5pdGlhbGl6ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTI4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzkyOCI+OTI4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkRlZmF1bHRpbmcgYSBmdW5jdGlvbiB0aGF0IHdvdWxkIGJlIGltcGxpY2l0bHkgZGVmaW5lZCBhcyBkZWxldGVkPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTI5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzkyOSI+OTI5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPldoYXQgaXMgYSB0ZW1wbGF0ZSBhbGlhcz88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MzAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTMwIj45MzA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+PFRUPmFsaWdub2Y8L1RUPiB3aXRoIGluY29tcGxldGUgYXJyYXkgdHlwZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjkzMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5MzEiPjkzMTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5Db25mdXNpbmcgcmVmZXJlbmNlIHRvIHRoZSBsZW5ndGggb2YgYSB1c2VyLWRlZmluZWQgc3RyaW5nIGxpdGVyYWw8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTMyIj45MzI8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+VUNOcyBpbiBjbG9zaW5nIGRlbGltaXRlcnMgb2YgcmF3IHN0cmluZyBsaXRlcmFsczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjkzMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5MzMiPjkzMzwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD4zMi1iaXQgVUNOcyB3aXRoIDE2LWJpdCA8VFQ+d2NoYXJfdDwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTM0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzkzNCI+OTM0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkxpc3QtaW5pdGlhbGl6YXRpb24gb2YgcmVmZXJlbmNlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjkzNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5MzUiPjkzNTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5NaXNzaW5nIG92ZXJsb2FkcyBmb3IgY2hhcmFjdGVyIHR5cGVzIGZvciB1c2VyLWRlZmluZWQgbGl0ZXJhbHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MzYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTM2Ij45MzY8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+QXJyYXkgaW5pdGlhbGl6YXRpb24gd2l0aCBuZXcgc3RyaW5nIGxpdGVyYWxzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTM3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjOTM3Ij45Mzc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+UmVzdHJpY3Rpb25zIG9uIHZhbHVlcyBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgaW4gdXNlci1kZWZpbmVkIGxpdGVyYWxzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTM4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzkzOCI+OTM4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkluaXRpYWxpemVyIGxpc3RzIGFuZCBhcnJheSBuZXc8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5MzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTM5Ij45Mzk8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RXhwbGljaXRseSBjaGVja2luZyB2aXJ0dWFsIGZ1bmN0aW9uIG92ZXJyaWRpbmc8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTQwIj45NDA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+R2xvYmFsIGFub255bW91cyB1bmlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTQxIj45NDE8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RXhwbGljaXQgc3BlY2lhbGl6YXRpb24gb2YgZGVsZXRlZCBmdW5jdGlvbiB0ZW1wbGF0ZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk0MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5NDIiPjk0MjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5JcyA8VFQ+dGhpczwvVFQ+IGFuIGVudGl0eT88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9Ijk0MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzk0MyI+OTQzPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5JcyA8VFQ+VCgpPC9UVD4gYSB0ZW1wb3Jhcnk/PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iOTQ0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjOTQ0Ij45NDQ8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPjxUVD5yZWludGVycHJldF9jYXN0PC9UVD4gZm9yIGFsbCB0eXBlcyB3aXRoIHRoZSBzYW1lIHNpemUgYW5kIGFsaWdubWVudDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NDUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTQ1Ij45NDU8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+VXNlIG9mIDxUVD50aGlzPC9UVD4gaW4gYSBsYXRlLXNwZWNpZmllZCByZXR1cm4gdHlwZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk0NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5NDYiPjk0NjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5PcmRlciBvZiBkZXN0cnVjdGlvbiBvZiBsb2NhbCBzdGF0aWMgb2JqZWN0cyBhbmQgY2FsbHMgdG8gPFRUPnN0ZDo6YXRleGl0PC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iOTQ3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjOTQ3Ij45NDc8L2E+PC90ZD4KLSAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RGVkdWNpbmcgdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudHMgZnJvbSBkZWZhdWx0IGZ1bmN0aW9uIGFyZ3VtZW50czwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk0OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5NDgiPjk0ODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48VFQ+Y29uc3RleHByPC9UVD4gaW4gPEk+Y29uZGl0aW9uPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9Ijk0OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzk0OSI+OTQ5PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5SZXF1aXJlbWVudHMgZm9yIGZyZWVzdGFuZGluZyBpbXBsZW1lbnRhdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTUwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk1MCI+OTUwPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlVzZSBvZiA8VFQ+ZGVjbHR5cGU8L1RUPiBhcyBhIDxJPmNsYXNzLW5hbWU8L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTUxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk1MSI+OTUxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlByb2JsZW1zIHdpdGggPEk+YXR0cmlidXRlLXNwZWNpZmllcjwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSI5NTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCM5NTIiPjk1MjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkluc3VmZmljaWVudCBkZXNjcmlwdGlvbiBvZiAmIzgyMjA7bmFtaW5nIGNsYXNzJiM4MjIxOzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTUzIj45NTM8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+UnZhbHVlIHJlZmVyZW5jZXMgYW5kIGZ1bmN0aW9uIHZpYWJpbGl0eTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iOTU0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjOTU0Ij45NTQ8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPk92ZXJsb2FkIHJlc29sdXRpb24gb2YgY29udmVyc2lvbiBvcGVyYXRvciB0ZW1wbGF0ZXMgd2l0aCBidWlsdC1pbiB0eXBlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTU1Ij45NTU8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+Q2FuIGEgY2xvc3VyZSB0eXBlJ3MgPFRUPm9wZXJhdG9yKCk8L1RUPiBiZSB2aXJ0dWFsPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk1NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5NTYiPjk1NjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5GdW5jdGlvbiBwcm90b3R5cGUgc2NvcGUgd2l0aCBsYXRlLXNwZWNpZmllZCByZXR1cm4gdHlwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NTciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTU3Ij45NTc8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+QWx0ZXJuYXRpdmUgdG9rZW5zIGFuZCA8ST5hdHRyaWJ1dGUtdG9rZW48L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk1OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzk1OCI+OTU4PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkxhbWJkYXMgYW5kIDxUVD5kZWNsdHlwZTwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTU5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk1OSI+OTU5PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkFsaWdubWVudCBhdHRyaWJ1dGUgZm9yIGNsYXNzIGFuZCBlbnVtZXJhdGlvbiB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk2MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5NjAiPjk2MDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5Db3ZhcmlhbnQgZnVuY3Rpb25zIGFuZCBsdmFsdWUvcnZhbHVlIHJlZmVyZW5jZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NjEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTYxIj45NjE8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+T3ZlcmxvYWQgcmVzb2x1dGlvbiBhbmQgY29udmVyc2lvbiBvZiA8VFQ+c3RkOjpudWxscHRyX3Q8L1RUPiB0byA8VFQ+Ym9vbDwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTYyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk2MiI+OTYyPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkF0dHJpYnV0ZXMgYXBwZXJ0YWluaW5nIHRvIGNsYXNzIGFuZCBlbnVtIHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTYzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk2MyI+OTYzPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkNvbXBhcmluZyA8VFQ+bnVsbHB0cjwvVFQ+IHdpdGggMDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk2NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5NjQiPjk2NDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3QgZGVzY3JpcHRpb24gb2Ygd2hlbiB0aGUgbHZhbHVlLXRvLXJ2YWx1ZSBjb252ZXJzaW9uIGFwcGxpZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTY1Ij45NjU8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+TGltaXRpbmcgdGhlIGFwcGxpY2FiaWxpdHkgb2YgdGhlIDxUVD5jYXJyaWVzX2RlcGVuZGVuY3k8L1RUPiBhdHRyaWJ1dGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTY2Ij45NjY8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+TmVzdGVkIHR5cGVzIHdpdGhvdXQgbGlua2FnZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iOTY3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjOTY3Ij45Njc8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIG9mIHJlcGxhY2VtZW50IGFsbG9jYXRpb24gZnVuY3Rpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTY4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk2OCI+OTY4PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlN5bnRhY3RpYyBhbWJpZ3VpdHkgb2YgdGhlIGF0dHJpYnV0ZSBub3RhdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk2OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5NjkiPjk2OTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5FeHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9ucyBvZiBjbGFzcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NzAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTcwIj45NzA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+Q29uc2lzdGVudCB1c2Ugb2YgJiM4MjIwO2FwcGVydGFpbiYjODIyMTsgYW5kICYjODIyMDthcHBseSYjODIyMTs8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NzEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTcxIj45NzE8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+SW5jb3JyZWN0IHRyZWF0bWVudCBvZiA8ST5leGNlcHRpb24tZGVjbGFyYXRpb248L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk3MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5NzIiPjk3MjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5BbGxvd2luZyBtdWx0aXBsZSA8ST5hdHRyaWJ1dGUtc3BlY2lmaWVyPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTczIj45NzM8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RnVuY3Rpb24gdHlwZXMgaW4gPEk+ZXhjZXB0aW9uLXNwZWNpZmljYXRpb248L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk3NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5NzQiPjk3NDwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+RGVmYXVsdCBhcmd1bWVudHMgZm9yIGxhbWJkYXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NzUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTc1Ij45NzU8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlJlc3RyaWN0aW9ucyBvbiByZXR1cm4gdHlwZSBkZWR1Y3Rpb24gZm9yIGxhbWJkYXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NzYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTc2Ij45NzY8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RGVkdWN0aW9uIGZvciA8VFQ+Y29uc3QgVCZhbXA7PC9UVD4gY29udmVyc2lvbiBvcGVyYXRvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTc3Ij45Nzc8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPldoZW4gaXMgYW4gZW51bWVyYXRpb24gdHlwZSBjb21wbGV0ZT88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NzgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTc4Ij45Nzg8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+SW5jb3JyZWN0IHNwZWNpZmljYXRpb24gZm9yIGNvcHkgaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5NzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTc5Ij45Nzk8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+UG9zaXRpb24gb2YgPEk+YXR0cmlidXRlLXNwZWNpZmllcjwvST4gaW4gZGVjbGFyYXRvciBzeW50YXg8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5ODAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTgwIj45ODA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+RXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBhIG1lbWJlciBvZiBhIGNsYXNzIHRlbXBsYXRlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTgxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk4MSI+OTgxPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkNvbnN0ZXhwciBjb25zdHJ1Y3RvciB0ZW1wbGF0ZXMgYW5kIGxpdGVyYWwgdHlwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5ODIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCM5ODIiPjk4MjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Jbml0aWFsaXphdGlvbiB3aXRoIGFuIGVtcHR5IGluaXRpYWxpemVyIGxpc3Q8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5ODMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTgzIj45ODM8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+QW1iaWd1b3VzIHBvaW50ZXItdG8tbWVtYmVyIGNvbnN0YW50PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTg0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk4NCI+OTg0PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPiYjODIyMDtEZWR1Y2VkIHR5cGUmIzgyMjE7IGlzIHVuY2xlYXIgaW4gPFRUPmF1dG88L1RUPiB0eXBlIGRlZHVjdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk4NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5ODUiPjk4NTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5BbHRlcm5hdGl2ZSB0b2tlbnMgYW5kIHVzZXItZGVmaW5lZCBsaXRlcmFsczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk4NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5ODYiPjk4NjwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5UcmFuc2l0aXZpdHkgb2YgPEk+dXNpbmctZGlyZWN0aXZlPC9JPnMgdmVyc3VzIHF1YWxpZmllZCBsb29rdXA8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9Ijk4NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzk4NyI+OTg3PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5XaGljaCBkZWNsYXJhdGlvbnMgaW50cm9kdWNlIG5hbWVzcGFjZSBtZW1iZXJzPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5ODgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTg4Ij45ODg8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+UmVmZXJlbmNlLXRvLXJlZmVyZW5jZSBjb2xsYXBzaW5nIHdpdGggPFRUPmRlY2x0eXBlPC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5ODkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTg5Ij45ODk8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+TWlzcGxhY2VkIGxpc3QtaW5pdGlhbGl6YXRpb24gZXhhbXBsZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk5MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5OTAiPjk5MDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5WYWx1ZSBpbml0aWFsaXphdGlvbiB3aXRoIG11bHRpcGxlIGluaXRpYWxpemVyLWxpc3QgY29uc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTkxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk5MSI+OTkxPC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPlJlZmVyZW5jZSBwYXJhbWV0ZXJzIG9mIGNvbnN0ZXhwciBmdW5jdGlvbnMgYW5kIGNvbnN0cnVjdG9yczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk5MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzk5MiI+OTkyPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkluaGVyaXRpbmcgZXhwbGljaXRuZXNzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTkzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk5MyI+OTkzPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkZyZWVkb20gdG8gcGVyZm9ybSBpbnN0YW50aWF0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbGF0aW9uIHVuaXQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5OTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTk0Ij45OTQ8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+PEk+YnJhY2VkLWluaXQtbGlzdDwvST4gYXMgYSBkZWZhdWx0IGFyZ3VtZW50PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iOTk1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzk5NSI+OTk1PC9hPjwvdGQ+CiAgICAgPHRkPkNEMjwvdGQ+CiAgICAgPHRkPkluY29ycmVjdCBleGFtcGxlIGZvciA8ST51c2luZy1kZWNsYXJhdGlvbjwvST4gYW5kIGV4cGxpY2l0IGluc3RhbnRpYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5OTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTk2Ij45OTY8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+QW1iaWd1b3VzIHBhcnRpYWwgc3BlY2lhbGl6YXRpb25zIG9mIG1lbWJlciBjbGFzcyB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSI5OTciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjOTk3Ij45OTc8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+QXJndW1lbnQtZGVwZW5kZW50IGxvb2t1cCBhbmQgZGVwZW5kZW50IGZ1bmN0aW9uIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk5OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzk5OCI+OTk4PC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPkZ1bmN0aW9uIHBhcmFtZXRlciB0cmFuc2Zvcm1hdGlvbnMgYW5kIHRlbXBsYXRlIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9Ijk5OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCM5OTkiPjk5OTwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD4mIzgyMjA7SW1wbGljaXQmIzgyMjE7IG9yICYjODIyMDtpbXBsaWVkJiM4MjIxOyBvYmplY3QgYXJndW1lbnQvcGFyYW1ldGVyPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTAwMCI+MTAwMDwvYT48L3RkPgogICAgIDx0ZD5DRDI8L3RkPgogICAgIDx0ZD5NaXN0YWtpbmcgbWVtYmVyIHR5cGVkZWZzIGZvciBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEwMDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMDAxIj4xMDAxPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+UGFyYW1ldGVyIHR5cGUgYWRqdXN0bWVudCBpbiBkZXBlbmRlbnQgcGFyYW1ldGVyIHR5cGVzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMDAyIj4xMDAyPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlBhY2sgZXhwYW5zaW9uIGZvciBmdW5jdGlvbiBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDAzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwMDMiPjEwMDM8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkFjY2VwdGFibGUgZGVmaW5pdGlvbnMgb2YgPFRUPm1haW48L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMDQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTAwNCI+MTAwNDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5JbmplY3RlZC1jbGFzcy1uYW1lcyBhcyBhcmd1bWVudHMgZm9yIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDA1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTAwNSI+MTAwNTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5RdWFsaWZpZWQgbmFtZSByZXNvbHV0aW9uIGluIG1lbWJlciBmdW5jdGlvbnMgb2YgY2xhc3MgdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAwNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDA2Ij4xMDA2PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPjxUVD5zdGQ6Om51bGxwdHJfdDwvVFQ+IGFzIGEgbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAwNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEwMDciPjEwMDc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+UHJvdGVjdGVkIGFjY2VzcyBhbmQgcG9pbnRlcnMgdG8gbWVtYmVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTAwOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEwMDgiPjEwMDg8L2E+PC90ZD4KICAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+UXVlcnlpbmcgdGhlIGFsaWdubWVudCBvZiBhbiBvYmplY3Q8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAwOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDA5Ij4xMDA5PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk1pc3NpbmcgY2FzZXMgaW4gdGhlIDxJPmRlY2xhcmF0b3ItaWQ8L0k+IG9mIGEgZnVuY3Rpb24gdGVtcGxhdGUgZGVjbGFyYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDEwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwMTAiPjEwMTA8L2E+PC90ZD4KICAgICA8dGQ+Q0QyPC90ZD4KICAgICA8dGQ+QWRkcmVzcyBvZiBvYmplY3Qgd2l0aCBkeW5hbWljIHN0b3JhZ2UgZHVyYXRpb24gaW4gY29uc3RhbnQgZXhwcmVzc2lvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTAxMSI+MTAxMTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5TdGFuZGFyZCBjb252ZXJzaW9ucyB0aGF0IGNhbm5vdCBiZSBpbnZlcnRlZDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTAxMiI+MTAxMjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5VbmRlcHJlY2F0aW5nIDxUVD5zdGF0aWM8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTAxMyI+MTAxMzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+VW5pbml0aWFsaXplZCA8VFQ+c3RkOjpudWxscHRyX3Q8L1RUPiBvYmplY3RzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAxNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEwMTQiPjEwMTQ8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+T3ZlcmxvYWQgcmVzb2x1dGlvbiBiZXR3ZWVuIDxUVD5jb25zdCBUJmFtcDs8L1RUPiBhbmQgPFRUPlQmYW1wOyZhbXA7PC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDE1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwMTUiPjEwMTU8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+VGVtcGxhdGUgYXJndW1lbnRzIGFuZCBhcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAxNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDE2Ij4xMDE2PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk92ZXJsb2FkYWJsZSBkZWNsYXJhdGlvbnMsIGZ1bmN0aW9uIHRlbXBsYXRlcywgYW5kIHJlZmVyZW5jZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDE3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwMTciPjEwMTc8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TWVtYmVyIGFjY2VzcyB0cmFuc2Zvcm1hdGlvbiBpbiB1bmV2YWx1YXRlZCBvcGVyYW5kczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTAxOCI+MTAxODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5BbWJpZ3VpdHkgYmV0d2VlbiA8ST5zaW1wbGUtZGVjbGFyYXRpb248L0k+IGFuZCA8ST5hdHRyaWJ1dGUtZGVjbGFyYXRpb248L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAxOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEwMTkiPjEwMTk8L2E+PC90ZD4KICAgICA8dGQ+ZHVwPC90ZD4KICAgICA8dGQ+RGVwZW5kZW50IDxJPnNpbXBsZS10ZW1wbGF0ZS1pZDwvST5zIGluIDxJPmJhc2Utc3BlY2lmaWVyPC9JPnMgYW5kIDxJPm1lbS1pbml0aWFsaXplcjwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAyMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDIwIj4xMDIwPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkltcGxpY2l0bHktZGVmaW5lZCBjb3B5IGNvbnN0cnVjdG9ycyBhbmQgZXhwbGljaXQgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEwMjEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMDIxIj4xMDIxPC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb25zIG9mIG5hbWVzcGFjZSBtZW1iZXJzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTAyMiI+MTAyMjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5DYW4gYW4gZW51bWVyYXRpb24gdmFyaWFibGUgaGF2ZSB2YWx1ZXMgb3V0c2lkZSB0aGUgdmFsdWVzIG9mIHRoZSBlbnVtZXJhdGlvbj88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDIzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTAyMyI+MTAyMzwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD48VFQ+dGhyZWFkX2xvY2FsPC9UVD4gb2JqZWN0cyBhcyBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDI0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwMjQiPjEwMjQ8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkxpbWl0cyBvbiBtdWx0aWNoYXJhY3RlciBsaXRlcmFsczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTAyNSI+MTAyNTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Vc2Ugb2YgYSByZWZlcmVuY2UgYXMgYSBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMDI2Ij4xMDI2PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkN2LXF1YWxpZmllZCBub24tY2xhc3MgcnZhbHVlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTAyNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEwMjciPjEwMjc8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5UeXBlIGNvbnNpc3RlbmN5IGFuZCByZWFsbG9jYXRpb24gb2Ygc2NhbGFyIHR5cGVzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTAyOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEwMjgiPjEwMjg8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkRlcGVuZGVudCBuYW1lcyBpbiBub24tZGVmaW5pbmcgZGVjbGFyYXRpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMjkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTAyOSI+MTAyOTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5UeXBlIG9mIGEgZGVzdHJ1Y3RvciBjYWxsPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAzMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDMwIj4xMDMwPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkV2YWx1YXRpb24gb3JkZXIgaW4gPEk+aW5pdGlhbGl6ZXItbGlzdDwvST5zIHVzZWQgaW4gYWdncmVnYXRlIGluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAzMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDMxIj4xMDMxPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk9wdGlvbmFsIGVsZW1lbnRzIGluIGF0dHJpYnV0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDMyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwMzIiPjEwMzI8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RW1wdHkgcGFjayBleHBhbnNpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAzMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDMzIj4xMDMzPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlJlc3RyaWN0aW9ucyBvbiBhbGlnbm1lbnQgYXR0cmlidXRlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMzQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTAzNCI+MTAzNDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5BdHRyaWJ1dGVzIGZvciA8VFQ+cmV0dXJuPC9UVD4gc3RhdGVtZW50cyBpbiBsYW1iZGFzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAzNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDM1Ij4xMDM1PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk9taXR0ZWQgYW5kIHJlcXVpcmVkIDxJPmRlY2wtc3BlY2lmaWVyPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDM2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwMzYiPjEwMzY8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+QWxpZ25tZW50IGF0dHJpYnV0ZSBpbiBhbiA8ST5leGNlcHRpb24tZGVjbGFyYXRpb248L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTAzNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDM3Ij4xMDM3PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlJlcXVpcmVtZW50cyBmb3Igb3BlcmFuZHMgb2YgPEk+ZGVsZXRlLWV4cHJlc3Npb248L0k+cyBhbmQgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTAzOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEwMzgiPjEwMzg8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPk92ZXJsb2FkIHJlc29sdXRpb24gb2YgPFRUPiZhbXA7eC5zdGF0aWNfZnVuYzwvVFQ+PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwMzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMDM5Ij4xMDM5PC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPkNvb3JkaW5hdGluZyBDIGFuZCBDKysgYWxpZ25tZW50IHNwZWNpZmljYXRpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA0MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEwNDAiPjEwNDA8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+TWVtb3J5IG1vZGVsIGlzc3VlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMDQxIj4xMDQxPC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPjxJPmFsaWFzLWRlY2xhcmF0aW9uPC9JPnMgYXMgY2xhc3MgbWVtYmVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA0MiI+MTA0MjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5BdHRyaWJ1dGVzIGluIDxJPmFsaWFzLWRlY2xhcmF0aW9uPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDQzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNDMiPjEwNDM8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+UXVhbGlmaWVkIG5hbWUgbG9va3VwIGluIHRoZSBjdXJyZW50IGluc3RhbnRpYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDQ0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNDQiPjEwNDQ8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+UG9pbnQgb2YgZGVjbGFyYXRpb24gZm9yIGFuIDxJPmFsaWFzLWRlY2xhcmF0aW9uPC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNDUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMDQ1Ij4xMDQ1PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlJlcXVpcmluZyBleHBsaWNpdCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTA0NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEwNDYiPjEwNDY8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPldoYXQgaXMgYSAmIzgyMjA7dXNlJiM4MjIxOyBvZiBhIGNsYXNzIHNwZWNpYWxpemF0aW9uPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDQ3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNDciPjEwNDc8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+V2hlbiBpcyA8VFQ+dHlwZWlkPC9UVD4gdmFsdWUtZGVwZW5kZW50PzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTA0OCI+MTA0ODwvYT48L3RkPgotICAgIDx0ZD5leHRlbnNpb248L3RkPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMDQ4Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTA0OCI+MTA0ODwvYT48L3RkPgorICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+PFRUPmF1dG88L1RUPiBkZWR1Y3Rpb24gYW5kIGxhbWJkYSByZXR1cm4gdHlwZSBkZWR1Y3Rpb24uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTA0OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEwNDkiPjEwNDk8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkNvcHkgZWxpc2lvbiB0aHJvdWdoIHJlZmVyZW5jZSBwYXJhbWV0ZXJzIG9mIGlubGluZSBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA1MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEwNTAiPjEwNTA8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RWZmZWN0cyBvZiB0aHJlYWQgc3VwcG9ydCBvbiBvYmplY3QgbGlmZXRpbWU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDUxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNTEiPjEwNTE8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+UmVmZXJlbmNlIG1lbWJlcnMgYW5kIGdlbmVyYXRlZCBjb3B5IGNvbnN0cnVjdG9yczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMDUyIj4xMDUyPC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPjxUVD5jb25zdDwvVFQ+IG5vbi1zdGF0aWMgZGF0YSBtZW1iZXIgYW5kIFBPRG5lc3M8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDUzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTA1MyI+MTA1MzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5UZXJtaW5hdGUgdnMgdW5kZWZpbmVkIGJlaGF2aW9yIGZvciBub2V4Y2VwdCB2aW9sYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDU0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNTQiPjEwNTQ8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+THZhbHVlLXRvLXJ2YWx1ZSBjb252ZXJzaW9ucyBpbiBleHByZXNzaW9uIHN0YXRlbWVudHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDU1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNTUiPjEwNTU8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+UGVybWlzc2libGUgdXNlcyBvZiA8VFQ+dm9pZDwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA1NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDU2Ij4xMDU2PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlRlbXBsYXRlIGFsaWFzZXMsIG1lbWJlciBkZWZpbml0aW9ucywgYW5kIHRoZSBjdXJyZW50IGluc3RhbnRpYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDU3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNTciPjEwNTc8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+PFRUPmRlY2x0eXBlPC9UVD4gYW5kIHRoZSBjdXJyZW50IGluc3RhbnRpYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDU4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTA1OCI+MTA1ODwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5SZWZlcmVuY2UgYmluZGluZyBvZiBpbmNvbXBhdGlibGUgYXJyYXkgdHlwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDU5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNTkiPjEwNTk8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkN2LXF1YWxpZmllZCBhcnJheSB0eXBlcyAod2l0aCBydmFsdWVzKTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNjAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA2MCI+MTA2MDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5TY29wZWQgZW51bWVyYXRvcnMgaW4gaW50ZWdyYWwgY29uc3RhbnQgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDYxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNjEiPjEwNjE8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TmVnYXRpdmUgYXJyYXkgYm91bmRzIGluIGEgPEk+bmV3LWV4cHJlc3Npb248L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA2MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDYyIj4xMDYyPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlN5bnRheCBvZiA8ST5hdHRyaWJ1dGUtc3BlY2lmaWVyPC9JPnMgaW4gbGFtYmRhczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNjMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA2MyI+MTA2MzwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48VFQ+W1toaWRpbmddXTwvVFQ+IHdpdGggbm9uLWF0dHJpYnV0ZSBkZWNsYXJhdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDY0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNjQiPjEwNjQ8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RGVmYXVsdGVkIG1vdmUgY29uc3RydWN0b3IgZm9yIGEgdW5pb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDY1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNjUiPjEwNjU8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+PFRUPltbaGlkaW5nXV08L1RUPiB3aXRoIDxUVD5bW292ZXJyaWRlXV08L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA2NiI+MTA2NjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5XaGVuIGlzIGEgY29weS9tb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IgaW1wbGljaXRseSBkZWZpbmVkPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMDY3Ij4xMDY3PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPjxUVD5bW2hpZGluZ11dPC9UVD4sIDxJPnVzaW5nLWRlY2xhcmF0aW9uPC9JPnMsIGFuZCBtdWx0aXBsZSBpbmhlcml0YW5jZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA2OCI+MTA2ODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5UZW1wbGF0ZSBhbGlhc2VzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIHRlbXBsYXRlIHBhcmFtZXRlciBwYWNrczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNjkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA2OSI+MTA2OTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3QgZnVuY3Rpb24gdHlwZSB3aXRoIDxJPnRyYWlsaW5nLXJldHVybi10eXBlPC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNzAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA3MCI+MTA3MDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5NaXNzaW5nIGluaXRpYWxpemVyIGNsYXVzZXMgaW4gYWdncmVnYXRlIGluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA3MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDcxIj4xMDcxPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkxpdGVyYWwgY2xhc3MgdHlwZXMgYW5kIHRyaXZpYWwgZGVmYXVsdCBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDcyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNzIiPjEwNzI8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+U2NvcGVkIGVudW1lcmF0b3Igd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGl0cyBjb250YWluaW5nIGNsYXNzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA3MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDczIj4xMDczPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk1lcmdpbmcgPEk+ZHluYW1pYy1leGNlcHRpb24tc3BlY2lmaWNhdGlvbjwvST5zIGFuZCA8ST5ub2V4Y2VwdC1zcGVjaWZpY2F0aW9uPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDc0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwNzQiPjEwNzQ8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+VmFsdWUtZGVwZW5kZW50IDxJPm5vZXhjZXB0LWV4cHJlc3Npb248L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwNzUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA3NSI+MTA3NTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5HcmFtbWFyIGRvZXMgbm90IGFsbG93IHRlbXBsYXRlIGFsaWFzIGluIDxJPnR5cGUtbmFtZTwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEwNzYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMDc2Ij4xMDc2PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5WYWx1ZSBjYXRlZ29yaWVzIGFuZCBsdmFsdWUgdGVtcG9yYXJpZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMDc3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTA3NyI+MTA3NzwvYT48L3RkPgogICAgIDx0ZD5leHRlbnNpb248L3RkPgogICAgIDx0ZD5FeHBsaWNpdCBzcGVjaWFsaXphdGlvbnMgaW4gbm9uLWNvbnRhaW5pbmcgbmFtZXNwYWNlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDc4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTA3OCI+MTA3ODwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5OYXJyb3dpbmcgYW5kIHRoZSB1c3VhbCBhcml0aG1ldGljIGNvbnZlcnNpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA3OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDc5Ij4xMDc5PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk92ZXJsb2FkIHJlc29sdXRpb24gaW52b2x2aW5nIGFnZ3JlZ2F0ZSBpbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwODAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA4MCI+MTA4MDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Db25mdXNpbmcgcmVsYXRpb25zaGlwIGJldHdlZW4gdGVtcGxhdGVzIGFuZCBjb3B5IGNvbnN0cnVjdG9yczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwODEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA4MSI+MTA4MTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5EZWZhdWx0ZWQgZGVzdHJ1Y3RvciBhbmQgdW51c2FibGUgb3BlcmF0b3IgZGVsZXRlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA4MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDgyIj4xMDgyPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkltcGxpY2l0IGNvcHkgZnVuY3Rpb24gaWYgc3Vib2JqZWN0IGhhcyBub25lPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwODMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA4MyI+MTA4MzwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5QYXNzaW5nIGFuIG9iamVjdCB0byBlbGxpcHNpcyB3aXRoIG5vbi10cml2aWFsIG1vdmUgY29uc3RydWN0b3I8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDg0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTA4NCI+MTA4NDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Db25kaXRpb25zIGZvciBhIGRlbGV0ZWQgbW92ZSBmdW5jdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwODUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMDg1Ij4xMDg1PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPk1vdmUgYXNzaWdubWVudCBvcGVyYXRvcnMgYW5kIHZpcnR1YWwgYmFzZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDg2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwODYiPjEwODY8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+PFRUPmNvbnN0X2Nhc3Q8L1RUPiB0byBydmFsdWUgcmVmZXJlbmNlIHRvIGZ1bmN0aW9uIHR5cGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDg3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwODciPjEwODc8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+QWRkaXRpb25hbCBhcHBsaWNhdGlvbnMgb2YgaXNzdWUgODk5PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA4OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDg4Ij4xMDg4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkRlcGVuZGVudCBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEwODkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMDg5Ij4xMDg5PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+VGVtcGxhdGUgcGFyYW1ldGVycyBpbiBtZW1iZXIgc2VsZWN0aW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDkwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwOTAiPjEwOTA8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+QWxpZ25tZW50IG9mIHN1Ym9iamVjdHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDkxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwOTEiPjEwOTE8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+SW5jb25zaXN0ZW50IHVzZSBvZiB0aGUgdGVybSAmIzgyMjA7b2JqZWN0IGV4cHJlc3Npb24mIzgyMjE7PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMDkyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTA5MiI+MTA5MjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkN5Y2xlcyBpbiBvdmVybG9hZCByZXNvbHV0aW9uIGR1cmluZyBpbnN0YW50aWF0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwOTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA5MyI+MTA5MzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+VmFsdWUtaW5pdGlhbGl6aW5nIG5vbi1vYmplY3RzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA5NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDk0Ij4xMDk0PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkNvbnZlcnRpbmcgZmxvYXRpbmctcG9pbnQgdmFsdWVzIHRvIHNjb3BlZCBlbnVtZXJhdGlvbiB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwOTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA5NSI+MTA5NTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5MaXN0LWluaXRpYWxpemF0aW9uIG9mIHJlZmVyZW5jZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDk2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEwOTYiPjEwOTY8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TWlzc2luZyByZXF1aXJlbWVudCBmb3IgdGVtcGxhdGUgZGVmaW5pdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMDk3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTA5NyI+MTA5NzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5BZ2dyZWdhdGUgaW5pdGlhbGl6YXRpb24gb2YgZnVuY3Rpb24gcGFyYW1ldGVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEwOTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTA5OCI+MTA5ODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Qb2ludGVyIGNvbnZlcnNpb25zIGluIGNvbnN0YW50IGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTA5OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMDk5Ij4xMDk5PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkluZmluaXRlIHJlY3Vyc2lvbiBpbiA8VFQ+Y29uc3RleHByPC9UVD4gZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEwMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTAwIj4xMTAwPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPjxUVD5jb25zdGV4cHI8L1RUPiBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhbmQgbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnRzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEwMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTAxIj4xMTAxPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk5vbi1pbnRlZ3JhbCBpbml0aWFsaXplZCBzdGF0aWMgZGF0YSBtZW1iZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEwMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTAyIj4xMTAyPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkJldHRlciBleGFtcGxlIG9mIHVuZGVmaW5lZCBiZWhhdmlvcjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMDMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTEwMyI+MTEwMzwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5SZXZlcnNpb24gb2YgcGhhc2UgMSBhbmQgMiB0cmFuc2Zvcm1hdGlvbnMgaW4gcmF3IHN0cmluZyBsaXRlcmFsczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMDQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTEwNCI+MTEwNDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5HbG9iYWwtc2NvcGUgdGVtcGxhdGUgYXJndW1lbnRzIHZzIHRoZSA8VFQ+Jmx0Ozo8L1RUPiBkaWdyYXBoPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEwNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTA1Ij4xMTA1PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPklzc3VlcyByZWxhdGluZyB0byBUUiAxMDE3NjoyMDAzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEwNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTA2Ij4xMTA2PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk5lZWQgbW9yZSBkZXRhaWwgaW4gPFRUPm51bGxwdHI8L1RUPiBrZXl3b3JkIGRlc2NyaXB0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEwNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTA3Ij4xMTA3PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk92ZXJsb2FkIHJlc29sdXRpb24gZm9yIHVzZXItZGVmaW5lZCBpbnRlZ2VyIGxpdGVyYWxzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEwOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzExMDgiPjExMDg8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+VXNlci1kZWZpbmVkIGxpdGVyYWxzIGhhdmUgbm90IGJlZW4gaW1wbGVtZW50ZWQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTA5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExMDkiPjExMDk8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+V2hlbiBpcyAmIzgyMjA7dXNlJiM4MjIxOyBhIHJlZmVyZW5jZSB0byB0aGUgT0RSIG1lYW5pbmc/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTExMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzExMTAiPjExMTA8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+SW5jb21wbGV0ZSByZXR1cm4gdHlwZSBzaG91bGQgYmUgYWxsb3dlZCBpbiA8VFQ+ZGVjbHR5cGU8L1RUPiBvcGVyYW5kPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTExMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTExIj4xMTExPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlJlbW92ZSBkdWFsLXNjb3BlIGxvb2t1cCBvZiBtZW1iZXIgdGVtcGxhdGUgbmFtZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTEyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExMTIiPjExMTI8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+PFRUPmNvbnN0ZXhwcjwvVFQ+IHZhcmlhYmxlcyBzaG91bGQgaGF2ZSBpbnRlcm5hbCBsaW5rYWdlIGxpa2UgPFRUPmNvbnN0PC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTEzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExMTMiPjExMTM8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TGlua2FnZSBvZiBuYW1lc3BhY2UgbWVtYmVyIG9mIHVubmFtZWQgbmFtZXNwYWNlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTExNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTE0Ij4xMTE0PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkluY29ycmVjdCB1c2Ugb2YgcGxhY2VtZW50IDxUVD5uZXc8L1RUPiBpbiBleGFtcGxlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTExNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTE1Ij4xMTE1PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkMtY29tcGF0aWJsZSBhbGlnbm1lbnQgc3BlY2lmaWNhdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTExNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzExMTYiPjExMTY8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5BbGlhc2luZyBvZiB1bmlvbiBtZW1iZXJzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMTciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTExNyI+MTExNzwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3Qgbm90ZSBhYm91dCB4dmFsdWUgbWVtYmVyIGFjY2VzcyBleHByZXNzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMTE4Ij4xMTE4PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkltcGxpY2l0IGxhbWJkYSBjYXB0dXJlIHZpYSBleHBsaWNpdCBjb3B5IGNvbnN0cnVjdG9yPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTExOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTE5Ij4xMTE5PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk1pc3NpbmcgY2FzZSBpbiBkZXNjcmlwdGlvbiBvZiBtZW1iZXIgYWNjZXNzIGFtYmlndWl0eTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMjAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTEyMCI+MTEyMDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48VFQ+cmVpbnRlcnByZXRfY2FzdDwvVFQ+IGFuZCA8VFQ+dm9pZCo8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMjEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTEyMSI+MTEyMTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Vbm5lY2Vzc2FyeSBhbWJpZ3VpdHkgZXJyb3IgaW4gZm9ybWF0aW9uIG9mIHBvaW50ZXIgdG8gbWVtYmVyPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEyMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTIyIj4xMTIyPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkNpcmN1bGFyIGRlZmluaXRpb24gb2YgPFRUPnN0ZDo6c2l6ZV90PC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTIzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExMjMiPjExMjM8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RGVzdHJ1Y3RvcnMgc2hvdWxkIGJlIDxUVD5ub2V4Y2VwdDwvVFQ+IGJ5IGRlZmF1bHQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTI0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTEyNCI+MTEyNDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5FcnJvciBpbiBkZXNjcmlwdGlvbiBvZiB2YWx1ZSBjYXRlZ29yeSBvZiBwb2ludGVyLXRvLW1lbWJlciBleHByZXNzaW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEyNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTI1Ij4xMTI1PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlVuY2xlYXIgZGVmaW5pdGlvbiBvZiAmIzgyMjA7cG90ZW50aWFsIGNvbnN0YW50IGV4cHJlc3Npb24mIzgyMjE7PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEyNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTI2Ij4xMTI2PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPjxUVD5jb25zdGV4cHI8L1RUPiBmdW5jdGlvbnMgaW4gPFRUPmNvbnN0PC9UVD4gaW5pdGlhbGl6ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEyNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTI3Ij4xMTI3PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk92ZXJsb2FkIHJlc29sdXRpb24gaW4gPFRUPmNvbnN0ZXhwcjwvVFQ+IGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTEyOCI+MTEyODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48ST5hdHRyaWJ1dGUtc3BlY2lmaWVyPC9JPnMgaW4gPEk+ZGVjbC1zcGVjaWZpZXItc2VxPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTI5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExMjkiPjExMjk8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RGVmYXVsdCA8VFQ+bm90aHJvdzwvVFQ+IGZvciA8VFQ+Y29uc3RleHByPC9UVD4gZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEzMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTMwIj4xMTMwPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkZ1bmN0aW9uIHBhcmFtZXRlciB0eXBlIGFkanVzdG1lbnRzIGFuZCA8VFQ+ZGVjbHR5cGU8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMzEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTEzMSI+MTEzMTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5UZW1wbGF0ZSBhbGlhc2VzIGluIDxJPmVsYWJvcmF0ZWQtdHlwZS1zcGVjaWZpZXI8L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMTMyIj4xMTMyPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPktleXdvcmQgdnMgYXR0cmlidXRlIGZvciA8VFQ+bm9yZXR1cm48L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTEzMyI+MTEzMzwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5LZXl3b3JkcyB2cyBhdHRyaWJ1dGVzIGZvciBjb250cm9sIG9mIGhpZGluZyBhbmQgb3ZlcnJpZGluZzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMzQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTEzNCI+MTEzNDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5XaGVuIGlzIGFuIGV4cGxpY2l0bHktZGVmYXVsdGVkIGZ1bmN0aW9uIGRlZmluZWQ/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEzNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTM1Ij4xMTM1PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0bHktZGVmYXVsdGVkIG5vbi1wdWJsaWMgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEzNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTM2Ij4xMTM2PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0bHktZGVmYXVsdGVkIGV4cGxpY2l0IGNvbnN0cnVjdG9yczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTEzNyI+MTEzNzwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5FeHBsaWNpdGx5LWRlZmF1bHRlZCB2aXJ0dWFsIHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExMzgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTEzOCI+MTEzODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5SdmFsdWUtbmVzcyBjaGVjayBmb3IgcnZhbHVlIHJlZmVyZW5jZSBiaW5kaW5nIGlzIHdyb25nPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTEzOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTM5Ij4xMTM5PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlJ2YWx1ZSByZWZlcmVuY2UgYmluZGluZyB0byBzY2FsYXIgeHZhbHVlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE0MCI+MTE0MDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3QgcmVkZWZpbml0aW9uIG9mIFBPRCBjbGFzczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMTQxIj4xMTQxPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPk5vbi1zdGF0aWMgZGF0YSBtZW1iZXIgaW5pdGlhbGl6ZXJzIGhhdmUgbm90IGJlZW4gaW1wbGVtZW50ZWQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTQyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExNDIiPjExNDI8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+PFRUPmZyaWVuZDwvVFQ+IGRlY2xhcmF0aW9uIG9mIG1lbWJlciBmdW5jdGlvbiBvZiBjb250YWluaW5nIGNsYXNzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE0MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzExNDMiPjExNDM8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+TW92ZSBzZW1hbnRpY3MgZm9yIDxUVD4qdGhpczwvVFQ+IGhhdmUgbm90IGJlZW4gaW1wbGVtZW50ZWQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTQ0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExNDQiPjExNDQ8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+UmVtb3ZlIGFjY2VzcyBkZWNsYXJhdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTQ1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExNDUiPjExNDU8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RGVmYXVsdGluZyBhbmQgdHJpdmlhbGl0eTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE0NiI+MTE0NjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48ST5leGNlcHRpb24tc3BlY2lmaWNhdGlvbjwvST5zIG9mIGRlZmF1bHRlZCBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTQ3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExNDciPjExNDc8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RGVzdHJ1Y3RvcnMgc2hvdWxkIGJlIGRlZmF1bHQgPFRUPm5vdGhyb3c8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNDgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE0OCI+MTE0ODwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Db3B5IGVsaXNpb24gYW5kIG1vdmUgY29uc3RydWN0aW9uIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTQ5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExNDkiPjExNDk8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+VHJpdmlhbCBub24tcHVibGljIGNvcHkgb3BlcmF0b3JzIGluIHN1Ym9iamVjdHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTUwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTE1MCI+MTE1MDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Jbmhlcml0aW5nIGNvbnN0cnVjdG9ycyBoYXZlIG5vdCBiZWVuIGltcGxlbWVudGVkPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE1MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTUxIj4xMTUxPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk92ZXJsb2FkIHJlc29sdXRpb24gd2l0aCBpbml0aWFsaXplci1saXN0IGFuZCBub24tbGlzdCBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTUyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExNTIiPjExNTI8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+UnVsZXMgZm9yIGRldGVybWluaW5nIGV4aXN0ZW5jZSBvZiBpbXBsaWNpdCBjb252ZXJzaW9uIHNlcXVlbmNlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE1MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTUzIj4xMTUzPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlR5cGUgbWF0Y2hpbmcgaW4gYWRkcmVzcyBvZiBvdmVybG9hZGVkIGZ1bmN0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE1NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTU0Ij4xMTU0PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkFkZHJlc3Mgb2YgPFRUPnRocmVhZF9sb2NhbDwvVFQ+IHZhcmlhYmxlIGFzIG5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE1NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTU1Ij4xMTU1PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkludGVybmFsLWxpbmthZ2Ugbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnRzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE1NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTU2Ij4xMTU2PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlBhcnRpYWwgb3JkZXJpbmcgaW4gYSBub24tY2FsbCBjb250ZXh0PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMTU3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTE1NyI+MTE1NzwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+UGFydGlhbCBvcmRlcmluZyBvZiBmdW5jdGlvbiB0ZW1wbGF0ZXMgaXMgc3RpbGwgdW5kZXJzcGVjaWZpZWQ8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE1OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTU4Ij4xMTU4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlJlY3Vyc2l2ZSBpbnN0YW50aWF0aW9uIHZpYSBhbGlhcyB0ZW1wbGF0ZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE1OSI+MTE1OTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5DbGFzcyBhbmQgZW51bWVyYXRpb24gZGVmaW5pdGlvbnMgaW4gdGVtcGxhdGUgYWxpYXNlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNjAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE2MCI+MTE2MDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5EZWZpbml0aW9ucyBvZiB0ZW1wbGF0ZSBtZW1iZXJzIGFuZCB0aGUgY3VycmVudCBpbnN0YW50aWF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE2MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTYxIj4xMTYxPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkRlcGVuZGVudCA8ST5uZXN0ZWQtbmFtZS1zcGVjaWZpZXI8L0k+IGluIGEgcG9pbnRlci10by1tZW1iZXIgZGVjbGFyYXRvcjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMTYyIj4xMTYyPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkRlcGVuZGVudCA8ST5lbGFib3JhdGVkLXR5cGUtc3BlY2lmaWVyPC9JPnMgaW4gbm9uLWRlZHVjZWQgY29udGV4dHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTYzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTE2MyI+MTE2MzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD48VFQ+ZXh0ZXJuIHRlbXBsYXRlPC9UVD4gcHJldmVudHMgaW5saW5pbmcgZnVuY3Rpb25zIG5vdCBtYXJrZWQgPFRUPmlubGluZTwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE2NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTY0Ij4xMTY0PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlBhcnRpYWwgb3JkZXJpbmcgb2YgPFRUPmYoVCZhbXA7KTwvVFQ+IGFuZCA8VFQ+ZihUJmFtcDsmYW1wOyk8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE2NSI+MTE2NTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5FeGNlcHRpb25zIHdoZW4gZGVzdHJveWluZyBhcnJheSBlbGVtZW50czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE2NiI+MTE2NjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48ST5leGNlcHRpb24tZGVjbGFyYXRpb248L0k+cyB0aGF0IGRvIG5vdCBkZWNsYXJlIG9iamVjdHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTY3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExNjciPjExNjc8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+PEk+ZnVuY3Rpb24tdHJ5LWJsb2NrPC9JPnMgZm9yIGRlc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE2OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTY4Ij4xMTY4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkFkZGl0aW9uYWwgcmVhc29ucyB0byBjYWxsIDxUVD5zdGQ6OnRlcm1pbmF0ZTwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE2OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTY5Ij4xMTY5PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk1pc3NpbmcgZmVhdHVyZSBtYWNybyBmb3Igc3RyaWN0IHBvaW50ZXIgc2FmZXR5PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE3MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTcwIj4xMTcwPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkFjY2VzcyBjaGVja2luZyBkdXJpbmcgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE3MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTcxIj4xMTcxPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlBhcnRpYWwgc3RhY2sgdW53aW5kaW5nIHdpdGggPFRUPm5vZXhjZXB0PC9UVD4gdmlvbGF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMTcyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTE3MiI+MTE3MjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPiYjODIyMDtpbnN0YW50aWF0aW9uLWRlcGVuZGVudCYjODIyMTsgY29uc3RydWN0czwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTczIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExNzMiPjExNzM8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+VW5jbGVhciBzcGVjaWZpY2F0aW9uIG9mIGVmZmVjdHMgb2Ygc2lnbmFsIGhhbmRsaW5nPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE3NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTc0Ij4xMTc0PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPldoZW4gaXMgYSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gJiM4MjIwO3VzZWQ/JiM4MjIxOzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExNzUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE3NSI+MTE3NTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5EaXNhbWJpZ3VhdGluZyB1c2VyLWRlZmluZWQgbGl0ZXJhbHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTc2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExNzYiPjExNzY8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbiBvZiByZWxlYXNlIHNlcXVlbmNlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE3NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTc3Ij4xMTc3PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkludHJhLXRocmVhZCBkZXBlbmRlbmN5LW9yZGVyZWQtYmVmb3JlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE3OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTc4Ij4xMTc4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkRlZHVjdGlvbiBmYWlsdXJlIG1hdGNoaW5nIHBsYWNlbWVudCBuZXc8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTc5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTE3OSI+MTE3OTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Ddi1xdWFsaWZpY2F0aW9uIG9mIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTgwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExODAiPjExODA8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+T3Zlci1hbGlnbmVkIGNsYXNzIHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE4MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTgxIj4xMTgxPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPldoYXQgaXMgYSAmIzgyMjA7YnVpbHQtaW4gdHlwZT8mIzgyMjE7PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE4MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTgyIj4xMTgyPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkluY29ycmVjdCBkZXNjcmlwdGlvbiBvZiBwYWNrIGV4cGFuc2lvbiBzeW50YXg8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTgzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExODMiPjExODM8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RXhwYW5zaW9uIG9mIHBhcmFtZXRlciBwYWNrcyBpbiBkZWNsYXJhdG9yczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExODQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE4NCI+MTE4NDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Bcmd1bWVudCBjb252ZXJzaW9ucyB0byBub25kZWR1Y2VkIHBhcmFtZXRlciB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExODUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE4NSI+MTE4NTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5NaXNsZWFkaW5nIGRlc2NyaXB0aW9uIG9mIGxhbmd1YWdlIGxpbmthZ2UgYW5kIG1lbWJlciBmdW5jdGlvbiB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExODYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE4NiI+MTE4NjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Ob24tZGVwZW5kZW50IDxUVD5jb25zdGV4cHI8L1RUPiB2aW9sYXRpb25zIGluIGZ1bmN0aW9uIHRlbXBsYXRlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExODciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE4NyI+MTE4NzwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Qcm9ibGVtcyBpbiBpbml0aWFsaXphdGlvbiBleGFtcGxlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE4OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTg4Ij4xMTg4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlR5cGUgcHVubmluZyBpbiBjb25zdGFudCBleHByZXNzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExODkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE4OSI+MTE4OTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5BZGRyZXNzIG9mIGRpc3RpbmN0IGJhc2UgY2xhc3Mgc3Vib2JqZWN0czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExOTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE5MCI+MTE5MDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5PcGVyYXRpb25zIG9uIG5vbi1zYWZlbHktZGVyaXZlZCBwb2ludGVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExOTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE5MSI+MTE5MTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5EZWxldGVkIHN1Ym9iamVjdCBkZXN0cnVjdG9ycyBhbmQgaW1wbGljaXRseS1kZWZpbmVkIGNvbnN0cnVjdG9yczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjExOTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTE5MiI+MTE5MjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5JbmFkdmVydGVudCBjaGFuZ2UgdG8gT0RSIGFuZCB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTkzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExOTMiPjExOTM8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+VXNlIG9mIGFkZHJlc3MtY29uc3RhbnQgcG9pbnRlcnMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTk0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExOTQiPjExOTQ8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+Q29uc3RleHByIHJlZmVyZW5jZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTk1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExOTUiPjExOTU8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+UmVmZXJlbmNlcyB0byBub24tbGl0ZXJhbCB0eXBlcyBpbiBjb25zdGV4cHIgZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE5NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTk2Ij4xMTk2PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb24gcmVxdWlyZWQgZm9yIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gYWZ0ZXIgZXhwbGljaXQgc3BlY2lhbGl6YXRpb24/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTE5NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMTk3Ij4xMTk3PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkNvbnN0ZXhwciBhcnJheXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTk4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExOTgiPjExOTg8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TGl0ZXJhbCB0eXBlcyBhbmQgY29weSBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMTk5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzExOTkiPjExOTk8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RGVsZXRlZCBjb25zdGV4cHIgZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMjAwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTIwMCI+MTIwMDwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+TG9va3VwIHJ1bGVzIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyMDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTIwMSI+MTIwMTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5BcmUgZGVsZXRlZCBhbmQgZGVmYXVsdGVkIGZ1bmN0aW9ucyBkZWZpbml0aW9ucz88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjAyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMDIiPjEyMDI8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+Q2FsbGluZyB2aXJ0dWFsIGZ1bmN0aW9ucyBkdXJpbmcgZGVzdHJ1Y3Rpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjAzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTIwMyI+MTIwMzwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5NaXNsZWFkaW5nIG5vdGUgcmVnYXJkaW5nIGluaXRpYWxpemVkIHN0YXRpYyBkYXRhIG1lbWJlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjA0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMDQiPjEyMDQ8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+U3BlY2lmaWVycyBpbiBhIDxJPmZvci1yYW5nZS1kZWNsYXJhdGlvbjwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjA1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTIwNSI+MTIwNTwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5MdmFsdWUgcmVmZXJlbmNlIGJpbmRpbmcgYW5kIGZ1bmN0aW9uIHZpYWJpbGl0eTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyMDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTIwNiI+MTIwNjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5EZWZpbmluZyBvcGFxdWUgZW51bWVyYXRpb24gbWVtYmVycyBvZiBjbGFzcyB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjA3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMDciPjEyMDc8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+VHlwZSBvZiBjbGFzcyBtZW1iZXIgaW4gPEk+dHJhaWxpbmctcmV0dXJuLXR5cGU8L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIwOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjA4Ij4xMjA4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0IDxUVD5ub2V4Y2VwdDwvVFQ+IGluIGRlZmF1bHRlZCBkZWZpbml0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMjA5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTIwOSI+MTIwOTwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+SXMgYSBwb3RlbnRpYWxseS1ldmFsdWF0ZWQgZXhwcmVzc2lvbiBpbiBhIHRlbXBsYXRlIGRlZmluaXRpb24gYSAmIzgyMjA7dXNlPyYjODIyMTs8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIxMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjEwIj4xMjEwPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkluamVjdGlvbiBvZiA8ST5lbGFib3JhdGVkLXR5cGUtc3BlY2lmaWVyPC9JPiBpbiBlbnVtZXJhdGlvbiBzY29wZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTIxMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyMTEiPjEyMTE8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5NaXNhbGlnbmVkIGx2YWx1ZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIxMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjEyIj4xMjEyPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPk5vbi1mdW5jdGlvbi1jYWxsIHh2YWx1ZXMgYW5kIDxUVD5kZWNsdHlwZTwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIxMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjEzIj4xMjEzPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5BcnJheSBzdWJzY3JpcHRpbmcgYW5kIHh2YWx1ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjE0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMTQiPjEyMTQ8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+S2luZHMgb2YgaW5pdGlhbGl6ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIxNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjE1Ij4xMjE1PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb24gb2YgUE9EIHN0cnVjdDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyMTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTIxNiI+MTIxNjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5FeGNlcHRpb25zICYjODIyMDthbGxvd2VkJiM4MjIxOyBieSBhIDxJPm5vZXhjZXB0LXNwZWNpZmljYXRpb248L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIxNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEyMTciPjEyMTc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+QXJlIGRlbGV0ZWQgZnVuY3Rpb25zIGltcGxpY2l0bHkgPFRUPm5vZXhjZXB0PC9UVD4/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIxOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjE4Ij4xMjE4PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPldoYXQgaXMgdGhlICYjODIyMDtjdXJyZW50bHktaGFuZGxlZCBleGNlcHRpb24mIzgyMjE7IGluIGEgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbT88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjE5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMTkiPjEyMTk8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+Tm9uLXN0YXRpYyBkYXRhIG1lbWJlciBpbml0aWFsaXplcnMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjIwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMjAiPjEyMjA8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TG9va2luZyB1cCA8ST5jb252ZXJzaW9uLXR5cGUtaWQ8L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTIyMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyMjEiPjEyMjE8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPlBhcnRpYWwgb3JkZXJpbmcgYW5kIHJlZmVyZW5jZSBjb2xsYXBzaW5nPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyMjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMjIyIj4xMjIyPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlVubmVjZXNzYXJ5IHJlc3RyaWN0aW9uIG9uIDxUVD5hdXRvPC9UVD4gYXJyYXkgdHlwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEyMjMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMjIzIj4xMjIzPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+U3ludGFjdGljIGRpc2FtYmlndWF0aW9uIGFuZCA8ST50cmFpbGluZy1yZXR1cm4tdHlwZTwvST5zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyMjQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTIyNCI+MTIyNDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48VFQ+Y29uc3RleHByPC9UVD4gZGVmYXVsdGVkIGNvcHkgY29uc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIyNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjI1Ij4xMjI1PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPjxUVD5jb25zdGV4cHI8L1RUPiBjb25zdHJ1Y3RvcnMgYW5kIHZpcnR1YWwgYmFzZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjI2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMjYiPjEyMjY8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkNvbnZlcnRpbmcgYSA8ST5icmFjZWQtaW5pdC1saXN0PC9JPiBkZWZhdWx0IGFyZ3VtZW50PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIyNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjI3Ij4xMjI3PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5NaXhpbmcgaW1tZWRpYXRlIGFuZCBub24taW1tZWRpYXRlIGNvbnRleHRzIGluIGRlZHVjdGlvbiBmYWlsdXJlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIyOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEyMjgiPjEyMjg8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+Q29weS1saXN0LWluaXRpYWxpemF0aW9uIGFuZCA8VFQ+ZXhwbGljaXQ8L1RUPiBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjI5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMjkiPjEyMjk8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+T3ZlcmxvYWQgcmVzb2x1dGlvbiB3aXRoIGVtcHR5IDxJPmJyYWNlZC1pbml0LWxpc3Q8L0k+IGFyZ3VtZW50PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMjMwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTIzMCI+MTIzMDwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+Q29uZnVzaW5nIGRlc2NyaXB0aW9uIG9mIGFtYmlndWl0eSBvZiBkZXN0cnVjdG9yIG5hbWU8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIzMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjMxIj4xMjMxPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPlZhcmlhZGljIHRlbXBsYXRlcyByZXF1aXJpbmcgYW4gZW1wdHkgcGFjayBleHBhbnNpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjMyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMzIiPjEyMzI8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+Q3JlYXRpb24gb2YgYXJyYXkgdGVtcG9yYXJpZXMgdXNpbmcgYSA8ST5icmFjZWQtaW5pdC1saXN0PC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyMzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTIzMyI+MTIzMzwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5QYWNrIGV4cGFuc2lvbnMgYW5kIGRlcGVuZGVudCBjYWxsczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyMzQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTIzNCI+MTIzNDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48ST5hYnN0cmFjdC1kZWNsYXJhdG9yPC9JPiBkb2VzIG5vdCBwZXJtaXQgPFRUPi4uLjwvVFQ+IGFmdGVyIDxJPnB0ci1vcGVyYXRvcjwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjM1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMzUiPjEyMzU8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+JiM4MjIwO1VudXNlZCYjODIyMTsgZWxsaXBzaXMgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGluIHBhcnRpYWwgb3JkZXJpbmc8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjM2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMzYiPjEyMzY8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+SW5jb25zaXN0ZW50bHktaW50ZXJyZWxhdGVkIGV4YW1wbGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIzNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjM3Ij4xMjM3PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkRlcHJlY2F0ZWQgaW1wbGljaXQgY29weSBhc3NpZ25tZW50IGluIGV4YW1wbGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjM4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyMzgiPjEyMzg8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+T3ZlcmxvYWRpbmcgYW1iaWd1aXR5IGJpbmRpbmcgcmVmZXJlbmNlIHRvIGZ1bmN0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTIzOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjM5Ij4xMjM5PC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkhleGFkZWNpbWFsIGZsb2F0aW5nLXBvaW50IGxpdGVyYWxzIHZzIHVzZXItZGVmaW5lZCBsaXRlcmFsczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyNDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTI0MCI+MTI0MDwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD48VFQ+Y29uc3RleHByPC9UVD4gZGVmYXVsdGVkIGNvbnN0cnVjdG9yczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyNDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTI0MSI+MTI0MTwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5XaGljaCBtZW1iZXJzIGRvZXMgYSBkZXN0cnVjdG9yIGRlc3Ryb3k/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI0MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjQyIj4xMjQyPC9hPjwvdGQ+Ci0gICAgPHRkPkZESVM8L3RkPgorICAgIDx0ZD5DKysxMTwvdGQ+CiAgICAgPHRkPkluaXRpYWxpemluZyB2YXJpYW50IGNsYXNzIG1lbWJlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjQzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyNDMiPjEyNDM8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TWlzbGVhZGluZyBmb290bm90ZSByZWdhcmRpbmcgbXVsdGlwbGUtZGVjbGFyYXRvciBkZWNsYXJhdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjQ0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyNDQiPjEyNDQ8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+RXF1aXZhbGVuY2Ugb2YgYWxpYXMgdGVtcGxhdGVzIGFuZCBjbGFzcyB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjQ1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyNDUiPjEyNDU8L2E+PC90ZD4KLSAgICA8dGQ+RkRJUzwvdGQ+CisgICAgPHRkPkMrKzExPC90ZD4KICAgICA8dGQ+TWF0Y2hpbmcgZGVjbGFyYXRpb25zIGludm9sdmluZyA8VFQ+ZGVjbHR5cGU8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyNDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTI0NiI+MTI0NjwvYT48L3RkPgotICAgIDx0ZD5GRElTPC90ZD4KKyAgICA8dGQ+QysrMTE8L3RkPgogICAgIDx0ZD5Ob24tZGVkdWNlZCBub24tZmluYWwgcGFyYW1ldGVyIHBhY2tzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMjQ3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTI0NyI+MTI0NzwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlJlc3RyaWN0aW9uIG9uIGFsaWFzIG5hbWUgYXBwZWFyaW5nIGluIDxJPnR5cGUtaWQ8L0k+PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTI0OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyNDgiPjEyNDg8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPlVwZGF0aW5nIEFubmV4IEMgdG8gQzk5PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTI0OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyNDkiPjEyNDk8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5Ddi1xdWFsaWZpY2F0aW9uIG9mIG5lc3RlZCBsYW1iZGEgY2FwdHVyZTwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjUwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyNTAiPjEyNTA8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkN2LXF1YWxpZmljYXRpb24gb2YgaW5jb21wbGV0ZSB2aXJ0dWFsIGZ1bmN0aW9uIHJldHVybiB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyNTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTI1MSI+MTI1MTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+QyBjb21wYXRpYmlsaXR5OiBjYXN0aW5nIHRvIHVucXVhbGlmaWVkIDxUVD52b2lkKjwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMjUyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTI1MiI+MTI1MjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk92ZXJsb2FkaW5nIG1lbWJlciBmdW5jdGlvbiB0ZW1wbGF0ZXMgYmFzZWQgb24gZGVwZW5kZW50IHJldHVybiB0eXBlPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTI1MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyNTMiPjEyNTM8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5HZW5lcmljIG5vbi10ZW1wbGF0ZSBtZW1iZXJzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyNTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMjU0Ij4xMjU0PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPm9kci11c2UgdnMgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCBjb25zdGV4cHIgZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMjU1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTI1NSI+MTI1NTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb24gcHJvYmxlbXMgd2l0aCA8VFQ+Y29uc3RleHByPC9UVD4gZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTI1NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyNTYiPjEyNTY8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPlVuZXZhbHVhdGVkIG9wZXJhbmRzIGFyZSBub3QgbmVjZXNzYXJpbHkgY29uc3RhbnQgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMjU3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTI1NyI+MTI1NzwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+SW5zdGFudGlhdGlvbiB2aWEgbm9uLWRlcGVuZGVudCByZWZlcmVuY2VzIGluIHVuaW5zdGFudGlhdGVkIHRlbXBsYXRlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEyNTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMjU4Ij4xMjU4PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+JiM4MjIwO0luc3RhbnRpYXRpb24gY29udGV4dCYjODIyMTsgZGlmZmVycyBmcm9tIGRlcGVuZGVudCBsb29rdXAgcnVsZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMjU5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTI1OSI+MTI1OTwvYT48L3RkPgogICAgIDx0ZD5leHRlbnNpb248L3RkPgogICAgIDx0ZD5EZWxldGluZyBhIFBPRCB2aWEgYSBwb2ludGVyIHRvIGJhc2U8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI2MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjYwIj4xMjYwPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3QgdXNlIG9mIHRlcm0gJiM4MjIwO292ZXJsb2FkZWQmIzgyMjE7IGluIGRlc2NyaXB0aW9uIG9mIG9kci11c2U8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjYxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyNjEiPjEyNjE8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0IGhhbmRsaW5nIG9mIGN2LXF1YWxpZmljYXRpb24gd2l0aCBub24tY2xhc3MgcHJ2YWx1ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjYyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyNjIiPjEyNjI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCBkZWR1Y3Rpb24gZmFpbHVyZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyNjMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMjYzIj4xMjYzPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPk1pc21hdGNoIGJldHdlZW4gcnZhbHVlIHJlZmVyZW5jZSBiaW5kaW5nIGFuZCBvdmVybG9hZCByZXNvbHV0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI2NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjY0Ij4xMjY0PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Vc2Ugb2YgPFRUPnRoaXM8L1RUPiBpbiA8VFQ+Y29uc3RleHByPC9UVD4gY29uc3RydWN0b3I8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjY1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyNjUiPjEyNjU8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPk1peGVkIHVzZSBvZiB0aGUgPFRUPmF1dG88L1RUPiBzcGVjaWZpZXI8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEyNjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMjY2Ij4xMjY2PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD48ST51c2VyLWRlZmluZWQtaW50ZWdlci1saXRlcmFsPC9JPiBvdmVyZmxvdzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjY3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyNjciPjEyNjc8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlJ2YWx1ZSByZWZlcmVuY2UgdHlwZXMgaW4gPEk+ZXhjZXB0aW9uLXNwZWNpZmljYXRpb248L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyNjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTI2OCI+MTI2ODwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+PFRUPnJlaW50ZXJwcmV0X2Nhc3Q8L1RUPiBvZiBhbiB4dmFsdWUgb3BlcmFuZDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyNjkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTI2OSI+MTI2OTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+PFRUPmR5bmFtaWNfY2FzdDwvVFQ+IG9mIGFuIHh2YWx1ZSBvcGVyYW5kPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI3MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjcwIj4xMjcwPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5CcmFjZSBlbGlzaW9uIGluIGFycmF5IHRlbXBvcmFyeSBpbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTI3MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyNzEiPjEyNzE8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5JbXByZWNpc2Ugd29yZGluZyByZWdhcmRpbmcgZGVwZW5kZW50IHR5cGVzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTI3MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEyNzIiPjEyNzI8L2E+PC90ZD4KICAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+SW1wbGljaXQgZGVmaW5pdGlvbiBvZiBzdGF0aWMgZGF0YSBtZW1iZXIgb2YgY29uc3QgbGl0ZXJhbCB0eXBlPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyNzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMjczIj4xMjczPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkFjY2Vzc2liaWxpdHkgYW5kIGZ1bmN0aW9uIHNpZ25hdHVyZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEyNzQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMjc0Ij4xMjc0PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+Q29tbW9uIG5vbnRlcm1pbmFsIGZvciA8ST5leHByZXNzaW9uPC9JPiBhbmQgPEk+YnJhY2VkLWluaXQtbGlzdDwvST48L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI3NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjc1Ij4xMjc1PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3QgY29tbWVudCBpbiBleGFtcGxlIG9mIHRlbXBsYXRlIHBhcmFtZXRlciBwYWNrIHJlc3RyaWN0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI3NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEyNzYiPjEyNzY8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+UmVmZXJlbmNlIHRvIDxUVD5zdGRpbnQuaDwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI3NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEyNzciPjEyNzc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+TGF4IGRlZmluaXRpb24gb2YgPFRUPmludG1heF90PC9UVD4gYW5kIDxUVD51aW50bWF4X3Q8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTI3OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyNzgiPjEyNzg8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3QgdHJlYXRtZW50IG9mIGNvbnRyaXZlZCBvYmplY3Q8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMjc5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTI3OSI+MTI3OTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkFkZGl0aW9uYWwgZGlmZmVyZW5jZXMgYmV0d2VlbiBDKysgMjAwMyBhbmQgQysrIDIwMTE8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI4MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEyODAiPjEyODA8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+T2JqZWN0IHJlYWxsb2NhdGlvbiBhbmQgcmVmZXJlbmNlIG1lbWJlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjgxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTI4MSI+MTI4MTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5WaXJ0dWFsIGFuZCBkZXBlbmRlbnQgYmFzZSBjbGFzc2VzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI4MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjgyIj4xMjgyPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5VbmRlcnNwZWNpZmllZCBkZXN0cnVjdG9yIDxJPmV4Y2VwdGlvbi1zcGVjaWZpY2F0aW9uPC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTI4MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyODMiPjEyODM8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5TdGF0aWMgZGF0YSBtZW1iZXJzIG9mIGNsYXNzZXMgd2l0aCB0eXBlZGVmIG5hbWUgZm9yIGxpbmthZ2UgcHVycG9zZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMjg0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTI4NCI+MTI4NDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlNob3VsZCB0aGUgbGlmZXRpbWUgb2YgYW4gYXJyYXkgYmUgaW5kZXBlbmRlbnQgb2YgdGhhdCBvZiBpdHMgZWxlbWVudHM/PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTI4NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyODUiPjEyODU8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPlRyaXZpYWwgZGVzdHJ1Y3RvcnMgYW5kIG9iamVjdCBsaWZldGltZTwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEyODYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMjg2Ij4xMjg2PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+RXF1aXZhbGVuY2Ugb2YgYWxpYXMgdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyODciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTI4NyI+MTI4NzwvYT48L3RkPgotICAgIDx0ZD5EUjwvdGQ+CisgICAgPHRkPkRSV1A8L3RkPgogICAgIDx0ZD5EaXJlY3QgaW5pdGlhbGl6YXRpb24gdnMgJiM4MjIwO2ltcGxpY2l0JiM4MjIxOyBjb252ZXJzaW9uIGluIHJlZmVyZW5jZSBiaW5kaW5nPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI4OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjg4Ij4xMjg4PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5SZWZlcmVuY2UgbGlzdCBpbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyODkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMjg5Ij4xMjg5PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkNhbiBhbiBhbGlhcyB0ZW1wbGF0ZSBuYW1lIHRoZSBjdXJyZW50IGluc3RhbnRpYXRpb24/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI5MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjkwIj4xMjkwPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5MaWZldGltZSBvZiB0aGUgdW5kZXJseWluZyBhcnJheSBvZiBhbiA8VFQ+aW5pdGlhbGl6ZXJfbGlzdDwvVFQ+IG1lbWJlcjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTI5MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyOTEiPjEyOTE8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5Mb29raW5nIHVwIGEgPEk+Y29udmVyc2lvbi10eXBlLWlkPC9JPjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTI5MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyOTIiPjEyOTI8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPkRlcGVuZGVudCBjYWxscyB3aXRoIDxJPmJyYWNlZC1pbml0LWxpc3Q8L0k+cyBjb250YWluaW5nIGEgcGFjayBleHBhbnNpb248L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjkzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyOTMiPjEyOTM8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlN0cmluZyBsaXRlcmFscyBpbiBjb25zdGFudCBleHByZXNzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTI5NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEyOTQiPjEyOTQ8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5TaWRlIGVmZmVjdHMgaW4gZHluYW1pYy9zdGF0aWMgaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTI5NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMjk1Ij4xMjk1PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5CaW5kaW5nIGEgcmVmZXJlbmNlIHRvIGFuIHJ2YWx1ZSBiaXQtZmllbGQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjk2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyOTYiPjEyOTY8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPklsbC1mb3JtZWQgdGVtcGxhdGUgZGVjbGFyYXRpb25zIChub3QganVzdCBkZWZpbml0aW9ucyk8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMjk3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEyOTciPjEyOTc8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPk1pc3BsYWNlZCBmdW5jdGlvbiA8ST5hdHRyaWJ1dGUtc3BlY2lmaWVyPC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEyOTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTI5OCI+MTI5ODwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+SW5jb3JyZWN0IGV4YW1wbGUgaW4gb3ZlcmxvYWQgcmVzb2x1dGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxMjk5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTI5OSI+MTI5OTwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+JiM4MjIwO1RlbXBvcmFyeSBvYmplY3RzJiM4MjIxOyB2cyAmIzgyMjA7dGVtcG9yYXJ5IGV4cHJlc3Npb25zJiM4MjIxOzwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxMzAwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTMwMCI+MTMwMDwvYT48L3RkPgotICAgIDx0ZD5leHRlbnNpb248L3RkPgorICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD48VFQ+VCgpPC9UVD4gZm9yIGFycmF5IHR5cGVzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMwMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzAxIj4xMzAxPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5WYWx1ZSBpbml0aWFsaXphdGlvbiBvZiB1bmlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzMDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTMwMiI+MTMwMjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+PFRUPm5vZXhjZXB0PC9UVD4gYXBwbGllZCB0byBleHByZXNzaW9uIG9mIHR5cGUgPFRUPnZvaWQ8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzMDMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMzAzIj4xMzAzPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkMgbGFuZ3VhZ2UgbGlua2FnZSBmb3IgdGVtcGxhdGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMzA0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTMwNCI+MTMwNDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk9taXR0ZWQgYXJyYXkgYm91bmQgd2l0aCBzdHJpbmcgaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMwNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzA1Ij4xMzA1PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD48VFQ+YWxpZ25vZjwvVFQ+IGFwcGxpZWQgdG8gYXJyYXkgb2YgdW5rbm93biBzaXplPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMwNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzA2Ij4xMzA2PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Nb2RpZnlpbmcgYW4gb2JqZWN0IHdpdGhpbiBhIDxUVD5jb25zdDwvVFQ+IG1lbWJlciBmdW5jdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzMDciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTMwNyI+MTMwNzwvYT48L3RkPgotICAgIDx0ZD5EUjwvdGQ+CisgICAgPHRkPkRSV1A8L3RkPgogICAgIDx0ZD5PdmVybG9hZCByZXNvbHV0aW9uIGJhc2VkIG9uIHNpemUgb2YgYXJyYXkgPEk+aW5pdGlhbGl6ZXItbGlzdDwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzA4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzMDgiPjEzMDg8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkNvbXBsZXRlbmVzcyBvZiBjbGFzcyB0eXBlIHdpdGhpbiBhbiA8ST5leGNlcHRpb24tc3BlY2lmaWNhdGlvbjwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzMDkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzA5Ij4xMzA5PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+SW5jb3JyZWN0IG5vdGUgcmVnYXJkaW5nIGxvb2t1cCBvZiBhIG1lbWJlciBvZiB0aGUgY3VycmVudCBpbnN0YW50aWF0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzMTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTMxMCI+MTMxMDwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+V2hhdCBpcyBhbiAmIzgyMjA7YWNjZXB0YWJsZSBsb29rdXAgcmVzdWx0PyYjODIyMTs8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzExIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzMTEiPjEzMTE8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlZvbGF0aWxlIGx2YWx1ZXMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzEyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzMTIiPjEzMTI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlNpbXVsYXRlZCA8VFQ+cmVpbnRlcnByZXRfY2FzdDwvVFQ+IGluIGNvbnN0YW50IGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMxMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzEzIj4xMzEzPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5VbmRlZmluZWQgcG9pbnRlciBhcml0aG1ldGljIGluIGNvbnN0YW50IGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMxNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEzMTQiPjEzMTQ8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+UG9pbnRlciBhcml0aG1ldGljIHdpdGhpbiBzdGFuZGFyZC1sYXlvdXQgb2JqZWN0czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTMxNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEzMTUiPjEzMTU8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5SZXN0cmljdGlvbnMgb24gbm9uLXR5cGUgdGVtcGxhdGUgYXJndW1lbnRzIGluIHBhcnRpYWwgc3BlY2lhbGl6YXRpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzMTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMzE2Ij4xMzE2PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPjxUVD5jb25zdGV4cHI8L1RUPiBmdW5jdGlvbiByZXF1aXJlbWVudHMgYW5kIGNsYXNzIHNjb3BlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMxNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEzMTciPjEzMTc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+VW5uYW1lZCBzY29wZWQgZW51bWVyYXRpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMxOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzE4Ij4xMzE4PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5TeW50YWN0aWMgYW1iaWd1aXRpZXMgd2l0aCA8VFQ+ZmluYWw8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzMTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMzE5Ij4xMzE5PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkVycm9yIGluIHBhY2sgZXhwYW5zaW9uIGV4YW1wbGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzIwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzMjAiPjEzMjA8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkNvbnZlcnRpbmcgc2NvcGVkIGVudW1lcmF0aW9ucyB0byA8VFQ+Ym9vbDwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMyMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzIxIj4xMzIxPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5FcXVpdmFsZW5jeSBvZiBkZXBlbmRlbnQgY2FsbHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzMjIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzIyIj4xMzIyPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+RnVuY3Rpb24gcGFyYW1ldGVyIHR5cGUgZGVjYXkgaW4gdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzMjMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMzIzIj4xMzIzPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPk5vbmV4aXN0ZW50IG5vbnRlcm1pbmFsIGluIDxJPmFsaWdubWVudC1zcGVjaWZpZXI8L0k+IGdyYW1tYXI8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzI0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzMjQiPjEzMjQ8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlZhbHVlIGluaXRpYWxpemF0aW9uIGFuZCBkZWZhdWx0ZWQgY29uc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMzI1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTMyNSI+MTMyNTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk9taXR0ZWQgZGVjbGFyYXRvciBpbiA8VFQ+ZnJpZW5kPC9UVD4gZGVjbGFyYXRpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTMyNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEzMjYiPjEzMjY8L2E+PC90ZD4KICAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+RGVkdWNpbmcgYW4gYXJyYXkgYm91bmQgZnJvbSBhbiA8ST5pbml0aWFsaXplci1saXN0PC9JPjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzI3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzMjciPjEzMjc8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPjxJPnZpcnQtc3BlY2lmaWVyPC9JPiBpbiBhIGRlZmF1bHRlZCBkZWZpbml0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMyOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzI4Ij4xMzI4PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Db25mbGljdCBpbiByZWZlcmVuY2UgYmluZGluZyB2cyBvdmVybG9hZCByZXNvbHV0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMyOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzI5Ij4xMzI5PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5SZWN1cnNpdmUgZGVkdWN0aW9uIHN1YnN0aXR1dGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzMwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzMzAiPjEzMzA8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkRlbGF5ZWQgaW5zdGFudGlhdGlvbiBvZiA8VFQ+bm9leGNlcHQ8L1RUPiBzcGVjaWZpZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMzMxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTMzMSI+MTMzMTwvYT48L3RkPgogICAgIDx0ZD5leHRlbnNpb248L3RkPgogICAgIDx0ZD48VFQ+Y29uc3Q8L1RUPiBtaXNtYXRjaCB3aXRoIGRlZmF1bHRlZCBjb3B5IGNvbnN0cnVjdG9yPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTMzMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEzMzIiPjEzMzI8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5IYW5kbGluZyBvZiBpbnZhbGlkIHVuaXZlcnNhbC1jaGFyYWN0ZXItbmFtZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMzMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzMzIj4xMzMzPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5PbWlzc2lvbiBvZiA8VFQ+Y29uc3Q8L1RUPiBpbiBhIGRlZmF1bHRlZCBjb3B5IGNvbnN0cnVjdG9yPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTMzNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEzMzQiPjEzMzQ8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+TGF5b3V0IGNvbXBhdGliaWxpdHkgYW5kIGN2LXF1YWxpZmljYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzMzUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzM1Ij4xMzM1PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+U3RyaW5naXppbmcsIGV4dGVuZGVkIGNoYXJhY3RlcnMsIGFuZCB1bml2ZXJzYWwtY2hhcmFjdGVyLW5hbWVzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzMzYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTMzNiI+MTMzNjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbiBvZiAmIzgyMjA7Y29udmVydGluZyBjb25zdHJ1Y3RvciYjODIyMTs8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzM3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTMzNyI+MTMzNzwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5QYXJ0aWFsIG9yZGVyaW5nIGFuZCBub24tZGVkdWNlZCBwYXJhbWV0ZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjEzMzgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzM4Ij4xMzM4PC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5BbGlhc2luZyBhbmQgYWxsb2NhdGlvbiBmdW5jdGlvbnM8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzM5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTMzOSI+MTMzOTwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5QYXJlbnRoZXNpemVkIDxJPmJyYWNlZC1pbml0LWxpc3Q8L0k+IGFuZCBhcnJheXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzQwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzNDAiPjEzNDA8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkNvbXBsZXRlIHR5cGUgaW4gbWVtYmVyIHBvaW50ZXIgZXhwcmVzc2lvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzNDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzQxIj4xMzQxPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+Qml0LWZpZWxkIGluaXRpYWxpemVyczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzNDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzQyIj4xMzQyPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+T3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gd2l0aCBtdWx0aXBsZSBkZWNsYXJhdG9yczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzNDMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzQzIj4xMzQzPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+U2VxdWVuY2luZyBvZiBub24tY2xhc3MgaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEzNDQiPjEzNDQ8L2E+PC90ZD4KLSAgICA8dGQ+cmVhZHk8L3RkPgorICA8dHIgaWQ9IjEzNDQiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM0NCI+MTM0NDwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPkFkZGluZyBuZXcgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb25zIHRvIGEgY2xhc3MgdmlhIGRlZmF1bHQgYXJndW1lbnRzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM0NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzQ1Ij4xMzQ1PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Jbml0aWFsaXphdGlvbiBvZiBhbm9ueW1vdXMgdW5pb24gY2xhc3MgbWVtYmVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM0NiI+MTM0NjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+PEk+ZXhwcmVzc2lvbi1saXN0PC9JPiBpbml0aWFsaXplcnMgYW5kIHRoZSA8VFQ+YXV0bzwvVFQ+IHNwZWNpZmllcjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9InN2biIgYWxpZ249ImNlbnRlciI+U1ZOPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNDciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM0NyI+MTM0NzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+Q29uc2lzdGVuY3kgb2YgPFRUPmF1dG88L1RUPiBpbiBtdWx0aXBsZS1kZWNsYXJhdG9yIGRlY2xhcmF0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTM0OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEzNDgiPjEzNDg8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5Vc2Ugb2YgPFRUPmF1dG88L1RUPiBpbiBhIDxJPnRyYWlsaW5nLXJldHVybi10eXBlPC9JPjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzNDkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzQ5Ij4xMzQ5PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+Q29uc2lzdGVuY3kgb2YgYWxpYXMgdGVtcGxhdGUgcmVkZWNsYXJhdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM1MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzUwIj4xMzUwPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3QgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gZm9yIGluaGVyaXRlZCBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTM1MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEzNTEiPjEzNTE8L2E+PC90ZD4KLSAgICA8dGQ+cmV2aWV3PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5Qcm9ibGVtcyB3aXRoIGltcGxpY2l0bHktZGVjbGFyZWQgPEk+ZXhjZXB0aW9uLXNwZWNpZmljYXRpb248L0k+czwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNTIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM1MiI+MTM1MjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+SW5jb25zaXN0ZW50IGNsYXNzIHNjb3BlIGFuZCBjb21wbGV0ZW5lc3MgcnVsZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzNTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzUzIj4xMzUzPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+QXJyYXkgYW5kIHZhcmlhbnQgbWVtYmVycyBhbmQgZGVsZXRlZCBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM1NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzU0Ij4xMzU0PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5EZXN0cnVjdG9yIGV4Y2VwdGlvbnMgZm9yIHRlbXBvcmFyaWVzIGluIG5vZXhjZXB0IGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM1NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzU1Ij4xMzU1PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5BZ2dyZWdhdGVzIGFuZCAmIzgyMjA7dXNlci1wcm92aWRlZCYjODIyMTsgY29uc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjEzNTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzU2Ij4xMzU2PC9hPjwvdGQ+Ci0gICAgPHRkPnJldmlldzwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+RXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIG9mIGNvcHkgYXNzaWdubWVudCBvcGVyYXRvcnMgd2l0aCB2aXJ0dWFsIGJhc2VzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM1NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzU3Ij4xMzU3PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD48ST5icmFjZS1vci1lcXVhbC1pbml0aWFsaXplcjwvST5zIGZvciBmdW5jdGlvbiBhbmQgdHlwZWRlZiBtZW1iZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM1OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzU4Ij4xMzU4PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5VbmludGVudGlvbmFsbHkgaWxsLWZvcm1lZCA8VFQ+Y29uc3RleHByPC9UVD4gZnVuY3Rpb24gdGVtcGxhdGUgaW5zdGFuY2VzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM1OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzU5Ij4xMzU5PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD48VFQ+Y29uc3RleHByPC9UVD4gdW5pb24gY29uc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMzYwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTM2MCI+MTM2MDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPjxUVD5jb25zdGV4cHI8L1RUPiBkZWZhdWx0ZWQgZGVmYXVsdCBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM2MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzYxIj4xMzYxPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5SZXF1aXJlbWVudCBvbiA8ST5icmFjZS1vci1lcXVhbC1pbml0aWFsaXplcjwvST5zIG9mIGxpdGVyYWwgdHlwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzYyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzNjIiPjEzNjI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkNvbXBsZXRlIHR5cGUgcmVxdWlyZWQgZm9yIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gPFRUPlQmYW1wOzwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM2MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzYzIj4xMzYzPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Ucml2aWFsaXR5IHZzIG11bHRpcGxlIGRlZmF1bHQgY29uc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM2NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzY0Ij4xMzY0PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD48VFQ+Y29uc3RleHByPC9UVD4gZnVuY3Rpb24gcGFyYW1ldGVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM2NSI+MTM2NTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+Q2FsbGluZyB1bmRlZmluZWQgPFRUPmNvbnN0ZXhwcjwvVFQ+IGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM2NiI+MTM2NjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+RGVsZXRlZCA8VFQ+Y29uc3RleHByPC9UVD4gY29uc3RydWN0b3JzIGFuZCB2aXJ0dWFsIGJhc2UgY2xhc3NlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM2NyI+MTM2NzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+VXNlIG9mIDxUVD50aGlzPC9UVD4gaW4gYSBjb25zdGFudCBleHByZXNzaW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM2OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzY4Ij4xMzY4PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5WYWx1ZSBpbml0aWFsaXphdGlvbiBhbmQgZGVmYXVsdGVkIGNvbnN0cnVjdG9ycyAocGFydCAyKTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNjkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM2OSI+MTM2OTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+RnVuY3Rpb24gaW52b2NhdGlvbiBzdWJzdGl0dXRpb24gb2YgPFRUPnRoaXM8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNzAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM3MCI+MTM3MDwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+PEk+aWRlbnRpZmllci1saXN0PC9JPiBjYW5ub3QgY29udGFpbiBlbGxpcHNpczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNzEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMzcxIj4xMzcxPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkRlZHVjdGlvbiBmcm9tIDxUVD5UJmFtcDsmYW1wOzwvVFQ+IGluIHJldHVybiB0eXBlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM3MiI+MTM3MjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+Q3Jvc3MtcmVmZXJlbmNlcyBpbmNvcnJlY3QgaW4gY29udmVyc2lvbiBmdW5jdGlvbiB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzczIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTM3MyI+MTM3MzwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5PdmVybG9hZCByZXNvbHV0aW9uIGNoYW5nZXMgbWF0Y2hpbmcgcmVmZXJlbmNlLWJpbmRpbmcgY2hhbmdlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNzQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM3NCI+MTM3NDwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+UXVhbGlmaWNhdGlvbiBjb252ZXJzaW9uIHZzIGRpZmZlcmVuY2UgaW4gcmVmZXJlbmNlIGJpbmRpbmc8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzc1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzNzUiPjEzNzU8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlJlZmVyZW5jZSB0byBhbm9ueW1vdXMgdW5pb24/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEzNzYiPjEzNzY8L2E+PC90ZD4KLSAgICA8dGQ+cmVhZHk8L3RkPgorICA8dHIgaWQ9IjEzNzYiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM3NiI+MTM3NjwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPjxUVD5zdGF0aWNfY2FzdDwvVFQ+IG9mIHRlbXBvcmFyeSB0byBydmFsdWUgcmVmZXJlbmNlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM3NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEzNzciPjEzNzc8L2E+PC90ZD4KICAgICA8dGQ+ZHVwPC90ZD4KICAgICA8dGQ+QWNjZXNzIGRlY2xhcmF0aW9ucyBub3QgbWVudGlvbmVkIGluIEFubmV4IEM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzNzgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzc4Ij4xMzc4PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5XaGVuIGlzIGFuIGluc3RhbnRpYXRpb24gcmVxdWlyZWQ/PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzNzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMzc5Ij4xMzc5PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPklzIDxUVD5zdGQ6OmluaXRpYWxpemVyX2xpc3Q8L1RUPiBhbiBhZ2dyZWdhdGU/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM4MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzgwIj4xMzgwPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5UeXBlIGRlZmluaXRpb25zIGluIDxJPnRlbXBsYXRlLXBhcmFtZXRlcjwvST4gPEk+cGFyYW1ldGVyLWRlY2xhcmF0aW9uPC9JPnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzgxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzODEiPjEzODE8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkltcGxpY2l0bHktZGVjbGFyZWQgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb25zIGFuZCBkZWZhdWx0IDxUVD5ub3Rocm93PC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzgyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzODIiPjEzODI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkRlYWQgY29kZSBmb3IgY29uc3RydWN0b3IgbmFtZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzgzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzODMiPjEzODM8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkNsYXJpZnlpbmcgZGlzY2FyZGVkLXZhbHVlIGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM4NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzEzODQiPjEzODQ8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+PFRUPnJlaW50ZXJwcmV0X2Nhc3Q8L1RUPiBpbiBjb25zdGFudCBleHByZXNzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzODUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM4NSI+MTM4NTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+U3ludGFjdGljIGZvcm1zIG9mIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZvciBzdXJyb2dhdGUgY2FsbCBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzg2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTM4NiI+MTM4NjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5FeHBsaWNpdGx5LXNwZWNpZmllZCBwYXJ0aWFsIGFyZ3VtZW50IGxpc3Qgd2l0aCBtdWx0aXBsZSBwYXJhbWV0ZXIgcGFja3M8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzg3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzODciPjEzODc8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPk1pc3Npbmcgbm9uLWRlZHVjZWQgY29udGV4dCBmb3IgPFRUPmRlY2x0eXBlPC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzg4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzODgiPjEzODg8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPk1pc3Npbmcgbm9uLWRlZHVjZWQgY29udGV4dCBmb2xsb3dpbmcgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgcGFjazwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzODkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMzg5Ij4xMzg5PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlJlY3Vyc2l2ZSByZWZlcmVuY2UgaW4gPEk+dHJhaWxpbmctcmV0dXJuLXR5cGU8L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMzkwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTM5MCI+MTM5MDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkRlcGVuZGVuY3kgb2YgYWxpYXMgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTM5MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzEzOTEiPjEzOTE8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgotICAgIDx0ZD5Db252ZXJzaW9ucyB0byBwYXJhbWV0ZXIgdHlwZXMgd2l0aCBub24gZGVkdWNlZCB0ZW1wbGF0ZSBhcmd1bWVudHM8L3RkPgorICAgIDx0ZD5Db252ZXJzaW9ucyB0byBwYXJhbWV0ZXIgdHlwZXMgd2l0aCBub24tZGVkdWNlZCB0ZW1wbGF0ZSBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTM5MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxMzkyIj4xMzkyPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5FeHBsaWNpdCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBmb3IgcmVmZXJlbmNlcyBhbmQgbm9uLXJlZmVyZW5jZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzOTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxMzkzIj4xMzkzPC9hPjwvdGQ+CiAgICAgPHRkPmV4dGVuc2lvbjwvdGQ+CiAgICAgPHRkPlBhY2sgZXhwYW5zaW9ucyBpbiA8ST51c2luZy1kZWNsYXJhdGlvbjwvST5zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzOTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM5NCI+MTM5NDwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+SW5jb21wbGV0ZSB0eXBlcyBhcyBwYXJhbWV0ZXJzIG9mIGRlbGV0ZWQgZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMzk1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTM5NSI+MTM5NTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlBhcnRpYWwgb3JkZXJpbmcgb2YgdmFyaWFkaWMgdGVtcGxhdGVzIHJlY29uc2lkZXJlZDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjEzOTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxMzk2Ij4xMzk2PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+RGVmZXJyZWQgaW5zdGFudGlhdGlvbiBhbmQgY2hlY2tpbmcgb2Ygbm9uLXN0YXRpYyBkYXRhIG1lbWJlciBpbml0aWFsaXplcnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxMzk3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTM5NyI+MTM5NzwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkNsYXNzIGNvbXBsZXRlbmVzcyBpbiBub24tc3RhdGljIGRhdGEgbWVtYmVyIGluaXRpYWxpemVyczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxMzk4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzEzOTgiPjEzOTg8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPk5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlcnMgb2YgdHlwZSA8VFQ+c3RkOjpudWxscHRyX3Q8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjEzOTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTM5OSI+MTM5OTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+RGVkdWN0aW9uIHdpdGggbXVsdGlwbGUgZnVuY3Rpb24gcGFyYW1ldGVyIHBhY2tzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQwMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0MDAiPjE0MDA8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RnVuY3Rpb24gcG9pbnRlciBlcXVhbGl0eTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0MDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQwMSI+MTQwMTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+U2ltaWxhciB0eXBlcyBhbmQgcmVmZXJlbmNlIGNvbXBhdGliaWxpdHk8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDAyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MDIiPjE0MDI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPk1vdmUgZnVuY3Rpb25zIHRvbyBvZnRlbiBkZWxldGVkPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNDAzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTQwMyI+MTQwMzwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+VW5pdmVyc2FsLWNoYXJhY3Rlci1uYW1lcyBpbiBjb21tZW50czwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE0MDQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNDA0Ij4xNDA0PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+T2JqZWN0IHJlYWxsb2NhdGlvbiBpbiB1bmlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQwNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDA1Ij4xNDA1PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD48VFQ+Y29uc3RleHByPC9UVD4gYW5kIG11dGFibGUgbWVtYmVycyBvZiBsaXRlcmFsIHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQwNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDA2Ij4xNDA2PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD48ST5yZWYtcXVhbGlmaWVyPC9JPnMgYW5kIGFkZGVkIHBhcmFtZXRlcnMgb2Ygbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQwNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0MDciPjE0MDc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+SW50ZWdyYWwgdG8gPFRUPmJvb2w8L1RUPiBjb252ZXJzaW9uIGluIGNvbnZlcnRlZCBjb25zdGFudCBleHByZXNzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0MDgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQwOCI+MTQwODwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+V2hhdCBpcyAmIzgyMjA7dGhlIHNhbWUgYWdncmVnYXRlIGluaXRpYWxpemF0aW9uPyYjODIyMTs8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDA5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MDkiPjE0MDk8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPldoYXQgaXMgdGhlIHNlY29uZCBzdGFuZGFyZCBjb252ZXJzaW9uIHNlcXVlbmNlIG9mIGEgbGlzdC1pbml0aWFsaXphdGlvbiBzZXF1ZW5jZT88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDEwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MTAiPjE0MTA8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlJlZmVyZW5jZSBvdmVybG9hZCB0aWVicmVha2VycyBzaG91bGQgYXBwbHkgdG8gcnZhbHVlIHJlZmVyZW5jZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDExIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MTEiPjE0MTE8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPk1vcmUgb24gZ2xvYmFsIHNjb3BlIDxUVD46OjwvVFQ+IGluIDxJPm5lc3RlZC1uYW1lLXNwZWNpZmllcjwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDEyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MTIiPjE0MTI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlByb2JsZW1zIGluIHNwZWNpZnlpbmcgcG9pbnRlciBjb252ZXJzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0MTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQxMyI+MTQxMzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+TWlzc2luZyBjYXNlcyBvZiB2YWx1ZS1kZXBlbmRlbmN5PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNDE0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTQxNCI+MTQxNDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkJpbmRpbmcgYW4gcnZhbHVlIHJlZmVyZW5jZSB0byBhIHJlZmVyZW5jZS11bnJlbGF0ZWQgbHZhbHVlPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0MTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQxNSI+MTQxNTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+TWlzc2luZyBwcm9oaWJpdGlvbiBvZiBibG9jay1zY29wZSBkZWZpbml0aW9uIG9mIDxUVD5leHRlcm48L1RUPiBvYmplY3Q8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDE2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MTYiPjE0MTY8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkZ1bmN0aW9uIGN2LXF1YWxpZmllcnMgYW5kIDxUVD50eXBlaWQ8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0MTciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQxNyI+MTQxNzwvYT48L3RkPgotICAgIDx0ZD5EUjwvdGQ+CisgICAgPHRkPkRSV1A8L3RkPgogICAgIDx0ZD5Qb2ludGVycy9yZWZlcmVuY2VzIHRvIGZ1bmN0aW9ucyB3aXRoIGN2LXF1YWxpZmllcnMgb3IgPEk+cmVmLXF1YWxpZmllcjwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDE4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MTgiPjE0MTg8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlR5cGUgb2YgPFRUPmluaXRpYWxpemVyX2xpc3Q8L1RUPiBiYWNraW5nIGFycmF5PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQxOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0MTkiPjE0MTk8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RXZhbHVhdGlvbiBvcmRlciBpbiBhZ2dyZWdhdGUgaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDIwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTQyMCI+MTQyMDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5BYnN0cmFjdCBmaW5hbCBjbGFzc2VzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQyMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0MjEiPjE0MjE8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RnVsbCBleHByZXNzaW9ucyBhbmQgYWdncmVnYXRlIGluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQyMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0MjIiPjE0MjI8L2E+PC90ZD4KICAgICA8dGQ+ZHVwPC90ZD4KICAgICA8dGQ+VHlwZSBvZiBjaGFyYWN0ZXIgbGl0ZXJhbHMgY29udGFpbmluZyB1bml2ZXJzYWwtY2hhcmFjdGVyLW5hbWVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQyMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDIzIj4xNDIzPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Db252ZXJ0aWJpbGl0eSBvZiA8VFQ+bnVsbHB0cjwvVFQ+IHRvIDxUVD5ib29sPC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDI0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MjQiPjE0MjQ8L2E+PC90ZD4KLSAgICA8dGQ+RFI8L3RkPgorICAgIDx0ZD5EUldQPC90ZD4KICAgICA8dGQ+V2hlbiBtdXN0IHN1Yi1vYmplY3QgZGVzdHJ1Y3RvcnMgYmUgYWNjZXNzaWJsZT88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDI1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MjUiPjE0MjU8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkJhc2UtY2xhc3Mgc3Vib2JqZWN0cyBvZiBzdGFuZGFyZC1sYXlvdXQgc3RydWN0czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTQyNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0MjYiPjE0MjY8L2E+PC90ZD4KICAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+QWxsb3dpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXIgdHlwZXMgaW4gZGVmYXVsdGVkIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDI3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTQyNyI+MTQyNzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5EZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZWxldGVkIG9yIGluYWNjZXNzaWJsZSBkZXN0cnVjdG9yczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0MjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQyOCI+MTQyODwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+RHluYW1pYyBjb25zdCBvYmplY3RzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQyOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0MjkiPjE0Mjk8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+U2NvcGUgb2YgYSBtZW1iZXIgdGVtcGxhdGUncyB0ZW1wbGF0ZSBwYXJhbWV0ZXI8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE0MzAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNDMwIj4xNDMwPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+UGFjayBleHBhbnNpb24gaW50byBmaXhlZCBhbGlhcyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDMxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MzEiPjE0MzE8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkV4Y2VwdGlvbnMgZnJvbSBvdGhlciB0aGFuIDxJPnRocm93LWV4cHJlc3Npb248L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTQzMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0MzIiPjE0MzI8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5OZXdseS1hbWJpZ3VvdXMgdmFyaWFkaWMgdGVtcGxhdGUgZXhwYW5zaW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE0MzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNDMzIj4xNDMzPC9hPjwvdGQ+CiAgICAgPHRkPmV4dGVuc2lvbjwvdGQ+CiAgICAgPHRkPjxJPnRyYWlsaW5nLXJldHVybi10eXBlPC9JPiBhbmQgcG9pbnQgb2YgZGVjbGFyYXRpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQzNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0MzQiPjE0MzQ8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+UGFyZW50aGVzaXplZCA8ST5icmFjZWQtaW5pdC1saXN0PC9JPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0MzUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQzNSI+MTQzNTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+PEk+dGVtcGxhdGUtaWQ8L0k+IGFzIHRoZSBkZWNsYXJhdG9yIGZvciBhIGNsYXNzIHRlbXBsYXRlIGNvbnN0cnVjdG9yPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNDM2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTQzNiI+MTQzNjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkludGVyYWN0aW9uIG9mIGNvbnN0YW50IGV4cHJlc3Npb24gY2hhbmdlcyB3aXRoIHByZXByb2Nlc3NvciBleHByZXNzaW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDM3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MzciPjE0Mzc8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPjxUVD5hbGlnbmFzPC9UVD4gaW4gPEk+YWxpYXMtZGVjbGFyYXRpb248L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQzOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDM4Ij4xNDM4PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Ob24tZGVyZWZlcmVuY2UgdXNlIG9mIGludmFsaWQgcG9pbnRlcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDM5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0MzkiPjE0Mzk8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkxvb2t1cCBhbmQgZnJpZW5kIHRlbXBsYXRlIGRlY2xhcmF0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0NDAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ0MCI+MTQ0MDwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+QWNjZXB0YWJsZSA8ST5kZWNsdHlwZS1zcGVjaWZpZXI8L0k+cyB1c2VkIGFzIDxJPm5lc3RlZC1uYW1lLXNwZWNpZmllcjwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNDQxIj4xNDQxPC9hPjwvdGQ+Ci0gICAgPHRkPmNvbmN1cnJlbmN5PC90ZD4KKyAgPHRyIGlkPSIxNDQxIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0NDEiPjE0NDE8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5VbmNsZWFyIHdvcmRpbmcgZm9yIHNpZ25hbCBoYW5kbGVyIHJlc3RyaWN0aW9uczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0NDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ0MiI+MTQ0MjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+QXJndW1lbnQtZGVwZW5kZW50IGxvb2t1cCBpbiB0aGUgcmFuZ2UtYmFzZWQgPFRUPmZvcjwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ0MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0NDMiPjE0NDM8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RGVmYXVsdCBhcmd1bWVudHMgYW5kIG5vbi1zdGF0aWMgZGF0YSBtZW1iZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNDQ0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTQ0NCI+MTQ0NDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlR5cGUgYWRqdXN0bWVudHMgb2Ygbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDQ1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTQ0NSI+MTQ0NTwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5Bcmd1bWVudC1kZXBlbmRlbnQgbG9va3VwIG9mIDxUVD5iZWdpbjwvVFQ+IGFuZCA8VFQ+ZW5kPC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTQ0NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0NDYiPjE0NDY8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPk1lbWJlciBmdW5jdGlvbiB3aXRoIG5vIDxJPnJlZi1xdWFsaWZpZXI8L0k+IGFuZCBub24tbWVtYmVyIGZ1bmN0aW9uIHdpdGggcnZhbHVlIHJlZmVyZW5jZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0NDciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ0NyI+MTQ0NzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+PFRUPnN0YXRpY19jYXN0PC9UVD4gb2YgYml0LWZpZWxkIGx2YWx1ZSB0byBydmFsdWUgcmVmZXJlbmNlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ0OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0NDgiPjE0NDg8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+SW50ZWdyYWwgdmFsdWVzIG9mIHR5cGUgPFRUPmJvb2w8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0NDkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ0OSI+MTQ0OTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+TmFycm93aW5nIGNvbnZlcnNpb24gb2YgbmVnYXRpdmUgdmFsdWUgdG8gdW5zaWduZWQgdHlwZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0NTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ1MCI+MTQ1MDwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+PFRUPklOVF9NSU4gJSAtMTwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNDUxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTQ1MSI+MTQ1MTwvYT48L3RkPgogICAgIDx0ZD5leHRlbnNpb248L3RkPgogICAgIDx0ZD5PYmplY3RzIHdpdGggbm8gbGlua2FnZSBpbiBub24tdHlwZSB0ZW1wbGF0ZSBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNDUyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTQ1MiI+MTQ1MjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlZhbHVlLWluaXRpYWxpemVkIG9iamVjdHMgbWF5IGJlIGNvbnN0YW50czwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDUzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0NTMiPjE0NTM8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlZvbGF0aWxlIG1lbWJlcnMgaW4gbGl0ZXJhbCBjbGFzc2VzPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0NTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ1NCI+MTQ1NDwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+UGFzc2luZyBjb25zdGFudHMgdGhyb3VnaCA8VFQ+Y29uc3RleHByPC9UVD4gZnVuY3Rpb25zIHZpYSByZWZlcmVuY2VzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ1NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDU1Ij4xNDU1PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5MdmFsdWUgY29udmVydGVkIGNvbnN0YW50IGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ1NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDU2Ij4xNDU2PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5BZGRyZXNzIGNvbnN0YW50IGV4cHJlc3Npb24gZGVzaWduYXRpbmcgdGhlIG9uZS1wYXN0LXRoZS1lbmQgYWRkcmVzczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0NTciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ1NyI+MTQ1NzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+VW5kZWZpbmVkIGJlaGF2aW9yIGluIGxlZnQtc2hpZnQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDU4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0NTgiPjE0NTg8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkFkZHJlc3Mgb2YgaW5jb21wbGV0ZSB0eXBlIHZzIDxUVD5vcGVyYXRvciZhbXA7KCk8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTQ1OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0NTkiPjE0NTk8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPlJlZmVyZW5jZS1iaW5kaW5nIHRpZWJyZWFrZXJzIGluIG92ZXJsb2FkIHJlc29sdXRpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ2MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDYwIj4xNDYwPC9hPjwvdGQ+Ci0gICAgPHRkPkRSPC90ZD4KKyAgICA8dGQ+RFJXUDwvdGQ+CiAgICAgPHRkPldoYXQgaXMgYW4gZW1wdHkgdW5pb24/PC90ZD4KKyAgICA8dGQgY2xhc3M9InN2biIgYWxpZ249ImNlbnRlciI+U1ZOPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxNDYxIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTQ2MSI+MTQ2MTwvYT48L3RkPgorICAgIDx0ZD5OQUQ8L3RkPgorICAgIDx0ZD5OYXJyb3dpbmcgY29udmVyc2lvbnMgdG8gYml0LWZpZWxkczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTQ2MSI+MTQ2MTwvYT48L3RkPgotICAgIDx0ZD5leHRlbnNpb248L3RkPgotICAgIDx0ZD5OYXJyb3dpbmcgY29udmVyc2lvbnMgdG8gYml0LWZpZWxkczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDYyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0NjIiPjE0NjI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkRlZHVjdGlvbiBmYWlsdXJlIHZzICYjODIyMDtpbGwtZm9ybWVkLCBubyBkaWFnbm9zdGljIHJlcXVpcmVkJiM4MjIxOzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTQ2MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0NjMiPjE0NjM8L2E+PC90ZD4KICAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+PFRUPmV4dGVybiAiQyI8L1RUPiBhbGlhcyB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ2NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDY0Ij4xNDY0PC9hPjwvdGQ+Ci0gICAgPHRkPldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+TmVnYXRpdmUgYXJyYXkgYm91bmQgaW4gYSA8ST5uZXctZXhwcmVzc2lvbjwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTQ2NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0NjUiPjE0NjU8L2E+PC90ZD4KLSAgICA8dGQ+cmV2aWV3PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD48VFQ+bm9leGNlcHQ8L1RUPiBhbmQgPFRUPnN0ZDo6YmFkX2FycmF5X25ld19sZW5ndGg8L1RUPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTQ2NiI+MTQ2NjwvYT48L3RkPgotICAgIDx0ZD5jb25jdXJyZW5jeTwvdGQ+CisgIDx0ciBpZD0iMTQ2NiI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDY2Ij4xNDY2PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+VmlzaWJsZSBzZXF1ZW5jZXMgb2Ygc2lkZSBlZmZlY3RzIGFyZSByZWR1bmRhbnQ8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE0NjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNDY3Ij4xNDY3PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+TGlzdC1pbml0aWFsaXphdGlvbiBvZiBhZ2dyZWdhdGUgZnJvbSBzYW1lLXR5cGUgb2JqZWN0PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTQ2OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0NjgiPjE0Njg8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD48VFQ+dHlwZWlkPC9UVD4sIG92ZXJsb2FkIHJlc29sdXRpb24sIGFuZCBpbXBsaWNpdCBsYW1iZGEgY2FwdHVyZTwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0NjkiPjE0Njk8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNDY5Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTQ2OSI+MTQ2OTwvYT48L3RkPgorICAgIDx0ZD5leHRlbnNpb248L3RkPgogICAgIDx0ZD5PbWl0dGVkIGJvdW5kIGluIGFycmF5IDxJPm5ldy1leHByZXNzaW9uPC9JPjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDcwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTQ3MCI+MTQ3MDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5UaHJlYWQgbWlncmF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ3MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDcxIj4xNDcxPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5OZXN0ZWQgdHlwZSBvZiBub24tZGVwZW5kZW50IGJhc2U8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDcyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0NzIiPjE0NzI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPm9kci11c2Ugb2YgcmVmZXJlbmNlIHZhcmlhYmxlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0NzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ3MyI+MTQ3MzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+U3ludGF4IG9mIDxJPmxpdGVyYWwtb3BlcmF0b3ItaWQ8L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjE0NzQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNDc0Ij4xNDc0PC9hPjwvdGQ+Ci0gICAgPHRkPmV4dGVuc2lvbjwvdGQ+CisgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlVzZXItZGVmaW5lZCBsaXRlcmFscyBhbmQgPFRUPiZsdDtpbnR0eXBlcy5oJmd0OzwvVFQ+IGZvcm1hdCBtYWNyb3M8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDc1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0NzUiPjE0NzU8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkVycm9ycyBpbiA8VFQ+W1tjYXJyaWVzX2RlcGVuZGVuY3ldXTwvVFQ+IGV4YW1wbGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDc2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0NzYiPjE0NzY8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb24gb2YgdXNlci1kZWZpbmVkIHR5cGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDc3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0NzciPjE0Nzc8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb24gb2YgYSA8VFQ+ZnJpZW5kPC9UVD4gb3V0c2lkZSBpdHMgbmFtZXNwYWNlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNDc4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTQ3OCI+MTQ3ODwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPjxUVD50ZW1wbGF0ZTwvVFQ+IGtleXdvcmQgZm9yIGRlcGVuZGVudCB0ZW1wbGF0ZSB0ZW1wbGF0ZSBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ3OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDc5Ij4xNDc5PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5MaXRlcmFsIG9wZXJhdG9ycyBhbmQgZGVmYXVsdCBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0ODAiPjE0ODA8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICA8dHIgaWQ9IjE0ODAiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ4MCI+MTQ4MDwvYT48L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Db25zdGFudCBpbml0aWFsaXphdGlvbiB2aWEgbm9uLWNvbnN0YW50IHRlbXBvcmFyeTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0ODEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ4MSI+MTQ4MTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+SW5jcmVtZW50L2RlY3JlbWVudCBvcGVyYXRvcnMgd2l0aCByZWZlcmVuY2UgcGFyYW1ldGVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0ODIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ4MiI+MTQ4MjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+UG9pbnQgb2YgZGVjbGFyYXRpb24gb2YgZW51bWVyYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDgzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTQ4MyI+MTQ4MzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Ob24tZGVwZW5kZW50IDxJPnN0YXRpY19hc3NlcnQtZGVjbGFyYXRpb248L0k+czwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNDg0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTQ4NCI+MTQ4NDwvYT48L3RkPgotICAgIDx0ZD5yZXZpZXc8L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPlVudXNlZCBsb2NhbCBjbGFzc2VzIG9mIGZ1bmN0aW9uIHRlbXBsYXRlczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTQ4NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0ODUiPjE0ODU8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5PdXQtb2YtY2xhc3MgZGVmaW5pdGlvbiBvZiBtZW1iZXIgdW5zY29wZWQgb3BhcXVlIGVudW1lcmF0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTQ4NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0ODYiPjE0ODY8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5CYXNlLWRlcml2ZWQgY29udmVyc2lvbiBpbiBtZW1iZXIgcG9pbnRlciBkZWR1Y3Rpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ4NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDg3Ij4xNDg3PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5XaGVuIGFyZSBpbmhlcml0aW5nIGNvbnN0cnVjdG9ycyBkZWNsYXJlZD88L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE0ODgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNDg4Ij4xNDg4PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+PEk+YWJzdHJhY3QtcGFjay1kZWNsYXJhdG9yPC9JPnMgaW4gPEk+dHlwZS1pZDwvST5zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0ODkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTQ4OSI+MTQ4OTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+SXMgdmFsdWUtaW5pdGlhbGl6YXRpb24gb2YgYW4gYXJyYXkgY29uc3RhbnQgaW5pdGlhbGl6YXRpb24/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNDkwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTQ5MCI+MTQ5MDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkxpc3QtaW5pdGlhbGl6YXRpb24gZnJvbSBhIHN0cmluZyBsaXRlcmFsPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTQ5MSI+MTQ5MTwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgIDx0ciBpZD0iMTQ5MSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDkxIj4xNDkxPC9hPjwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPk1vdmUgY29uc3RydWN0aW9uIGFuZCBydmFsdWUgcmVmZXJlbmNlIG1lbWJlcnM8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTQ5MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0OTIiPjE0OTI8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgotICAgIDx0ZD5FeGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgb24gdGVtcGxhdGUgZGVzdHJ1Y3RvcnM8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0OTMiPjE0OTM8L2E+PC90ZD4KICAgICA8dGQ+cmVhZHk8L3RkPgorICAgIDx0ZD5FeGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgb24gdGVtcGxhdGUgZGVzdHJ1Y3RvcnM8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgIDwvdHI+CisgIDx0ciBpZD0iMTQ5MyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDkzIj4xNDkzPC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+Q3JpdGVyaWEgZm9yIG1vdmUtY29uc3RydWN0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ5NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNDk0Ij4xNDk0PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5UZW1wb3JhcnkgaW5pdGlhbGl6YXRpb24gZm9yIHJlZmVyZW5jZSBiaW5kaW5nIGluIGxpc3QtaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNDk1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE0OTUiPjE0OTU8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2YgdmFyaWFkaWMgY2xhc3MgdGVtcGxhdGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE0OTYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNDk2Ij4xNDk2PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+VHJpdmlhbGl0eSB3aXRoIGRlbGV0ZWQgYW5kIG1pc3NpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTQ5NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE0OTciPjE0OTc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+QWdncmVnYXRlIGluaXRpYWxpemF0aW9uIHdpdGggcGFyZW50aGVzaXplZCBzdHJpbmcgbGl0ZXJhbDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE0OTgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNDk4Ij4xNDk4PC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPkxpZmV0aW1lIG9mIHRlbXBvcmFyaWVzIGluIHJhbmdlLWJhc2VkIDxUVD5mb3I8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTQ5OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE0OTkiPjE0OTk8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5NaXNzaW5nIGNhc2UgZm9yIGRlbGV0ZWQgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTUwMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1MDAiPjE1MDA8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPk5hbWUgbG9va3VwIG9mIGRlcGVuZGVudCBjb252ZXJzaW9uIGZ1bmN0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1MDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNTAxIj4xNTAxPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPk5lc3RlZCBicmFjZXMgaW4gbGlzdC1pbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1MDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTUwMiI+MTUwMjwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+VmFsdWUgaW5pdGlhbGl6YXRpb24gb2YgdW5pb25zIHdpdGggbWVtYmVyIGluaXRpYWxpemVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1MDMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTUwMyI+MTUwMzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+RXhjZXB0aW9ucyBkdXJpbmcgY29weSB0byBleGNlcHRpb24gb2JqZWN0PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTUwNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTA0Ij4xNTA0PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Qb2ludGVyIGFyaXRobWV0aWMgYWZ0ZXIgZGVyaXZlZC1iYXNlIGNvbnZlcnNpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTA1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTUwNSI+MTUwNTwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5EaXJlY3QgYmluZGluZyBvZiByZWZlcmVuY2UgdG8gdGVtcG9yYXJ5IGluIGxpc3QtaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTA2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1MDYiPjE1MDY8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPlZhbHVlIGNhdGVnb3J5IG9mIDxUVD5pbml0aWFsaXplcl9saXN0PC9UVD4gb2JqZWN0PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTUwNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTA3Ij4xNTA3PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5WYWx1ZSBpbml0aWFsaXphdGlvbiB3aXRoIHRyaXZpYWwgaW5hY2Nlc3NpYmxlIGRlZmF1bHQgY29uc3RydWN0b3I8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTA4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1MDgiPjE1MDg8L2E+PC90ZD4KLSAgICA8dGQ+RFI8L3RkPgorICAgIDx0ZD5EUldQPC90ZD4KICAgICA8dGQ+VGVtcGxhdGUgaW5pdGlhbGl6ZXItbGlzdCBjb25zdHJ1Y3RvcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTA5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1MDkiPjE1MDk8L2E+PC90ZD4KLSAgICA8dGQ+RFI8L3RkPgorICAgIDx0ZD5EUldQPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbiBvZiAmIzgyMjA7bm9uLXRlbXBsYXRlIGZ1bmN0aW9uJiM4MjIxOzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1MTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTUxMCI+MTUxMDwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+Y3YtcXVhbGlmaWVkIHJlZmVyZW5jZXMgdmlhIDxUVD5kZWNsdHlwZTwvVFQ+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTUxMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTExIj4xNTExPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD48VFQ+Y29uc3Qgdm9sYXRpbGU8L1RUPiB2YXJpYWJsZXMgYW5kIHRoZSBvbmUtZGVmaW5pdGlvbiBydWxlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTUxMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTEyIj4xNTEyPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Qb2ludGVyIGNvbXBhcmlzb24gdnMgcXVhbGlmaWNhdGlvbiBjb252ZXJzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTUxMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1MTMiPjE1MTM8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD48VFQ+aW5pdGlhbGl6ZXJfbGlzdDwvVFQ+IGRlZHVjdGlvbiBmYWlsdXJlPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1MTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTUxNCI+MTUxNDwvYT48L3RkPgotICAgIDx0ZD5EUjwvdGQ+CisgICAgPHRkPkRSV1A8L3RkPgogICAgIDx0ZD5BbWJpZ3VpdHkgYmV0d2VlbiBlbnVtZXJhdGlvbiBkZWZpbml0aW9uIGFuZCB6ZXJvLWxlbmd0aCBiaXQtZmllbGQ8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTE1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1MTUiPjE1MTU8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPk1vZHVsbyAyPFNVUD48ST5uPC9JPjwvU1VQPiBhcml0aG1ldGljIGZvciBpbXBsaWNpdGx5LXVuc2lnbmVkIHR5cGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTUxNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTE2Ij4xNTE2PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5EZWZpbml0aW9uIG9mICYjODIyMDt2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwmIzgyMjE7PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNTE3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTUxNyI+MTUxNzwvYT48L3RkPgotICAgIDx0ZD5yZXZpZXc8L3RkPgorICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlVuY2xlYXIvbWlzc2luZyBkZXNjcmlwdGlvbiBvZiBiZWhhdmlvciBkdXJpbmcgY29uc3RydWN0aW9uL2Rlc3RydWN0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTUxOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1MTgiPjE1MTg8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5FeHBsaWNpdCBkZWZhdWx0IGNvbnN0cnVjdG9ycyBhbmQgY29weS1saXN0LWluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNTE5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTUxOSI+MTUxOTwvYT48L3RkPgotICAgIDx0ZD5leHRlbnNpb248L3RkPgorICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5Db25mbGljdGluZyBkZWZhdWx0IGFuZCB2YXJpYWRpYyBjb25zdHJ1Y3RvcnM8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTIwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTUyMCI+MTUyMDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5BbGlhcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB2cyBwYWNrIGV4cGFuc2lvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTUyMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1MjEiPjE1MjE8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD48VFQ+VHs8L1RUPjxJPmV4cHI8L0k+PFRUPn08L1RUPiB3aXRoIHJlZmVyZW5jZSB0eXBlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTIyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1MjIiPjE1MjI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkFjY2VzcyBjaGVja2luZyBmb3IgPFRUPmluaXRpYWxpemVyX2xpc3Q8L1RUPiBhcnJheSBpbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTUyMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1MjMiPjE1MjM8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5Qb2ludCBvZiBkZWNsYXJhdGlvbiBpbiByYW5nZS1iYXNlZCA8VFQ+Zm9yPC9UVD48L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNTI0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTUyNCI+MTUyNDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkluY29tcGxldGVseS1kZWZpbmVkIGNsYXNzIHRlbXBsYXRlIGJhc2U8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTUyNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE1MjUiPjE1MjU8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+QXJyYXkgYm91bmQgaW5mZXJlbmNlIGluIHRlbXBvcmFyeSBhcnJheTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1MjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNTI2Ij4xNTI2PC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPkRlcGVuZGVudC1jbGFzcyBsb29rdXAgaW4gdGhlIGN1cnJlbnQgaW5zdGFudGlhdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1MjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTUyNyI+MTUyNzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+QXNzaWdubWVudCBmcm9tIDxJPmJyYWNlZC1pbml0LWxpc3Q8L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTUyOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTI4Ij4xNTI4PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5SZXBlYXRlZCA8ST5jdi1xdWFsaWZpZXI8L0k+cyBpbiBkZWNsYXJhdG9yczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTUyOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1MjkiPjE1Mjk8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5Ob21lbmNsYXR1cmUgZm9yIHZhcmlhYmxlIHZzIHJlZmVyZW5jZSBub24tc3RhdGljIGRhdGEgbWVtYmVyPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTUzMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1MzAiPjE1MzA8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5NZW1iZXIgYWNjZXNzIGluIG91dC1vZi1saWZldGltZSBvYmplY3RzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1MzEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTUzMSI+MTUzMTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbiBvZiAmIzgyMjA7YWNjZXNzJiM4MjIxOyAodmVyYik8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTMyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1MzIiPjE1MzI8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0IGluc3RhbnRpYXRpb24gYW5kIG1lbWJlciB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTMzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1MzMiPjE1MzM8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkZ1bmN0aW9uIHBhY2sgZXhwYW5zaW9uIGZvciBtZW1iZXIgaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTM0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTUzNCI+MTUzNDwvYT48L3RkPgogICAgIDx0ZD5kdXA8L3RkPgogICAgIDx0ZD5jdi1xdWFsaWZpY2F0aW9uIG9mIHBydmFsdWUgb2YgdHlwZSAmIzgyMjA7YXJyYXkgb2YgY2xhc3MmIzgyMjE7PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTUzNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTM1Ij4xNTM1PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD48VFQ+dHlwZWlkPC9UVD4gaW4gY29yZSBjb25zdGFudCBleHByZXNzaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTUzNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1MzYiPjE1MzY8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5PdmVybG9hZCByZXNvbHV0aW9uIHdpdGggdGVtcG9yYXJ5IGZyb20gaW5pdGlhbGl6ZXIgbGlzdDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTM3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1MzciPjE1Mzc8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPk9wdGlvbmFsIGNvbXBpbGUtdGltZSBldmFsdWF0aW9uIG9mIGNvbnN0YW50IGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTUzOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTM4Ij4xNTM4PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5DLXN0eWxlIGNhc3QgaW4gPEk+YnJhY2VkLWluaXQtbGlzdDwvST4gYXNzaWdubWVudDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1MzkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTUzOSI+MTUzOTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+RGVmaW5pdGlvbiBvZiAmIzgyMjA7Y2hhcmFjdGVyIHR5cGUmIzgyMjE7PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU0MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE1NDAiPjE1NDA8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+VXNlIG9mIGFkZHJlc3MgY29uc3RhbnRzIGluIGNvbnN0YW50IGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU0MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTQxIj4xNTQxPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD48ST5jdjwvST4gPFRUPnZvaWQ8L1RUPiByZXR1cm4gdHlwZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE1NDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNTQyIj4xNTQyPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+Q29tcG91bmQgYXNzaWdubWVudCBvZiA8ST5icmFjZWQtaW5pdC1saXN0PC9JPjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTQzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1NDMiPjE1NDM8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkltcGxpY2l0IGNvbnZlcnNpb24gc2VxdWVuY2UgZm9yIGVtcHR5IGluaXRpYWxpemVyIGxpc3Q8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTQ0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1NDQiPjE1NDQ8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkxpbmthZ2Ugb2YgbWVtYmVyIG9mIHVubmFtZWQgbmFtZXNwYWNlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNTQ1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTU0NSI+MTU0NTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPjxUVD5mcmllbmQ8L1RUPiBmdW5jdGlvbiB0ZW1wbGF0ZXMgZGVmaW5lZCBpbiBjbGFzcyB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU0NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE1NDYiPjE1NDY8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RXJyb3JzIGluIGZ1bmN0aW9uIHRlbXBsYXRlIGRlZmF1bHQgYXJndW1lbnRzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU0NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE1NDciPjE1NDc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+PFRUPnR5cGVuYW1lPC9UVD4ga2V5d29yZCBpbiA8ST5hbGlhcy1kZWNsYXJhdGlvbjwvST5zPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNTQ4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTU0OCI+MTU0ODwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkNvcHkvbW92ZSBjb25zdHJ1Y3Rpb24gYW5kIGNvbnZlcnNpb24gZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTU0OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1NDkiPjE1NDk8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPk92ZXJsb2FkZWQgY29tbWEgb3BlcmF0b3Igd2l0aCA8VFQ+dm9pZDwvVFQ+IG9wZXJhbmQ8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU1MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTUwIj4xNTUwPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5QYXJlbnRoZXNpemVkIDxJPnRocm93LWV4cHJlc3Npb248L0k+IG9wZXJhbmQgb2YgPEk+Y29uZGl0aW9uYWwtZXhwcmVzc2lvbjwvST48L3RkPgotICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU1MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTUxIj4xNTUxPC9hPjwvdGQ+Ci0gICAgPHRkPkRSPC90ZD4KKyAgICA8dGQ+RFJXUDwvdGQ+CiAgICAgPHRkPldvcmRpbmcgcHJvYmxlbXMgaW4gPEk+dXNpbmctZGVjbGFyYXRpb248L0k+IHNwZWNpZmljYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTU1MiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1NTIiPjE1NTI8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPjxJPmV4Y2VwdGlvbi1zcGVjaWZpY2F0aW9uPC9JPnMgYW5kIGRlZmF1bHRlZCBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbnM8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTUzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1NTMiPjE1NTM8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPjxUVD5zaXplb2Y8L1RUPiBhbmQgeHZhbHVlIGJpdC1maWVsZHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE1NTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNTU0Ij4xNTU0PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+QWNjZXNzIGFuZCBhbGlhcyB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNTU1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTU1NSI+MTU1NTwvYT48L3RkPgogICAgIDx0ZD5leHRlbnNpb248L3RkPgogICAgIDx0ZD5MYW5ndWFnZSBsaW5rYWdlIGFuZCBmdW5jdGlvbiB0eXBlIGNvbXBhdGliaWxpdHk8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU1NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTU2Ij4xNTU2PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5Db25zdHJ1Y3RvcnMgYW5kIGV4cGxpY2l0IGNvbnZlcnNpb24gZnVuY3Rpb25zIGluIGRpcmVjdCBpbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1NTciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTU1NyI+MTU1NzwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+TGFuZ3VhZ2UgbGlua2FnZSBvZiBjb252ZXJ0ZWQgbGFtYmRhIGZ1bmN0aW9uIHBvaW50ZXI8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTU1OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1NTgiPjE1NTg8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPlVudXNlZCBhcmd1bWVudHMgaW4gYWxpYXMgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU1OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTU5Ij4xNTU5PC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5TdHJpbmcgdG9vIGxvbmcgaW4gaW5pdGlhbGl6ZXIgbGlzdCBvZiA8ST5uZXctZXhwcmVzc2lvbjwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTYwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1NjAiPjE1NjA8L2E+PC90ZD4KLSAgICA8dGQ+RFJXUDwvdGQ+CisgICAgPHRkPkNEMzwvdGQ+CiAgICAgPHRkPkdyYXR1aXRvdXMgbHZhbHVlLXRvLXJ2YWx1ZSBjb252ZXJzaW9uIGluIDxJPmNvbmRpdGlvbmFsLWV4cHJlc3Npb248L0k+IHdpdGggPEk+dGhyb3ctZXhwcmVzc2lvbjwvST4gb3BlcmFuZDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgICA8dGQgY2xhc3M9InN2biIgYWxpZ249ImNlbnRlciI+U1ZOPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTU2MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE1NjEiPjE1NjE8L2E+PC90ZD4KICAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+QWdncmVnYXRlcyB3aXRoIGVtcHR5IGJhc2UgY2xhc3NlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTYyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1NjIiPjE1NjI8L2E+PC90ZD4KLSAgICA8dGQ+RFI8L3RkPgorICAgIDx0ZD5EUldQPC90ZD4KICAgICA8dGQ+Tm9uLXN0YXRpYyBkYXRhIG1lbWJlciBpbml0aWFsaXplcnMgYW5kIHVuaW9uIDxJPmN0b3ItaW5pdGlhbGl6ZXI8L0k+PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU2MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTYzIj4xNTYzPC9hPjwvdGQ+Ci0gICAgPHRkPkRSV1A8L3RkPgorICAgIDx0ZD5DRDM8L3RkPgogICAgIDx0ZD5MaXN0LWluaXRpYWxpemF0aW9uIGFuZCBvdmVybG9hZGVkIGZ1bmN0aW9uIGRpc2FtYmlndWF0aW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNTY0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTU2NCI+MTU2NDwvYT48L3RkPgogICAgIDx0ZD5leHRlbnNpb248L3RkPgogICAgIDx0ZD5UZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gZnJvbSBhbiBpbml0aWFsaXplciBsaXN0PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTU2NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1NjUiPjE1NjU8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5Db3B5IGVsaXNpb24gYW5kIGxpZmV0aW1lIG9mIDxUVD5pbml0aWFsaXplcl9saXN0PC9UVD4gdW5kZXJseWluZyBhcnJheTwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTY2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTU2NiI+MTU2NjwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5TaG91bGQgPFRUPm5ldyBzdGQ6OmluaXRpYWxpemVyX2xpc3QmbHQ7VCZndDs8L1RUPiBiZSBpbGwtZm9ybWVkPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1NjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTU2NyI+MTU2NzwvYT48L3RkPgotICAgIDx0ZD5EUjwvdGQ+CisgICAgPHRkPkRSV1A8L3RkPgogICAgIDx0ZD5Jbmhlcml0aW5nIGNvbnN0cnVjdG9ycyBhbmQgY29weS9tb3ZlIGNvbnN0cnVjdG9yczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1NjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNTY4Ij4xNTY4PC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPlRlbXBvcmFyeSBsaWZldGltZSBleHRlbnNpb24gd2l0aCBpbnRlcnZlbmluZyBjYXN0PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU2OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTY5Ij4xNTY5PC9hPjwvdGQ+Ci0gICAgPHRkPkRSPC90ZD4KKyAgICA8dGQ+RFJXUDwvdGQ+CiAgICAgPHRkPkRlZHVjaW5nIGEgZnVuY3Rpb24gcGFyYW1ldGVyIHBhY2sgYmVmb3JlIGVsbGlwc2lzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU3MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTcwIj4xNTcwPC9hPjwvdGQ+Ci0gICAgPHRkPkRSPC90ZD4KKyAgICA8dGQ+RFJXUDwvdGQ+CiAgICAgPHRkPkFkZHJlc3Mgb2Ygc3Vib2JqZWN0IGFzIG5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjE1NzEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNTcxIj4xNTcxPC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5jdi1xdWFsaWZpY2F0aW9uIGZvciBpbmRpcmVjdCByZWZlcmVuY2UgYmluZGluZyB2aWEgY29udmVyc2lvbiBmdW5jdGlvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNTcyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTU3MiI+MTU3MjwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+SW5jb3JyZWN0IGV4YW1wbGUgZm9yIHJ2YWx1ZSByZWZlcmVuY2UgYmluZGluZyB2aWEgY29udmVyc2lvbiBmdW5jdGlvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNTczIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTU3MyI+MTU3MzwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+SW5oZXJpdGVkIGNvbnN0cnVjdG9yIGNoYXJhY3RlcmlzdGljczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1NzQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNTc0Ij4xNTc0PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0bHktZGVmYXVsdGVkIDxUVD5jb25zdGV4cHI8L1RUPiBmdW5jdGlvbnMgaW4gd3JhcHBlciB0ZW1wbGF0ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTc1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1NzUiPjE1NzU8L2E+PC90ZD4KLSAgICA8dGQ+RFI8L3RkPgorICAgIDx0ZD5EUldQPC90ZD4KICAgICA8dGQ+SW5jb3JyZWN0IGRlZmluaXRpb24gb2YgJiM4MjIwO3N0cmljdCBwb2ludGVyIHNhZmV0eSYjODIyMTs8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTc2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1NzYiPjE1NzY8L2E+PC90ZD4KLSAgICA8dGQ+RFI8L3RkPgorICAgIDx0ZD5EUldQPC90ZD4KICAgICA8dGQ+RGlzY2FyZGVkLXZhbHVlIHZvbGF0aWxlIHh2YWx1ZXM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE1NzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNTc3Ij4xNTc3PC9hPjwvdGQ+CiAgICAgPHRkPmV4dGVuc2lvbjwvdGQ+CiAgICAgPHRkPlVubmVjZXNzYXJ5IHJlc3RyaWN0aW9ucyBvbiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTc4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTU3OCI+MTU3ODwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5WYWx1ZS1pbml0aWFsaXphdGlvbiBvZiBhZ2dyZWdhdGVzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1NzkiPjE1Nzk8L2E+PC90ZD4KLSAgICA8dGQ+cmVhZHk8L3RkPgorICA8dHIgaWQ9IjE1NzkiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTU3OSI+MTU3OTwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPlJldHVybiBieSBjb252ZXJ0aW5nIG1vdmUgY29uc3RydWN0b3I8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE1ODAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNTgwIj4xNTgwPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+RGVmYXVsdCBhcmd1bWVudHMgaW4gZXhwbGljaXQgaW5zdGFudGlhdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNTgxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTU4MSI+MTU4MTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPldoZW4gYXJlIDxUVD5jb25zdGV4cHI8L1RUPiBtZW1iZXIgZnVuY3Rpb25zIGRlZmluZWQ/PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTU4MiI+MTU4MjwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE1ODIiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNTgyIj4xNTgyPC9hPjwvdGQ+CisgICAgPHRkPmV4dGVuc2lvbjwvdGQ+CiAgICAgPHRkPlRlbXBsYXRlIGRlZmF1bHQgYXJndW1lbnRzIGFuZCBkZWR1Y3Rpb24gZmFpbHVyZTwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTgzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1ODMiPjE1ODM8L2E+PC90ZD4KLSAgICA8dGQ+RFI8L3RkPgorICAgIDx0ZD5EUldQPC90ZD4KICAgICA8dGQ+SW5jb3JyZWN0IGV4YW1wbGUgb2YgdW5zcGVjaWZpZWQgYmVoYXZpb3I8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTU4NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1ODQiPjE1ODQ8L2E+PC90ZD4KLSAgICA8dGQ+cmV2aWV3PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5EZWR1Y2luZyBmdW5jdGlvbiB0eXBlcyBmcm9tIGN2LXF1YWxpZmllZCB0eXBlczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1ODUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNTg1Ij4xNTg1PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlZhbHVlIGNhdGVnb3J5IG9mIG1lbWJlciBhY2Nlc3Mgb2YgcnZhbHVlIHJlZmVyZW5jZSBtZW1iZXI8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1ODYiPjE1ODY8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNTg2Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTU4NiI+MTU4NjwvYT48L3RkPgorICAgIDx0ZD5leHRlbnNpb248L3RkPgogICAgIDx0ZD5OYW1pbmcgYSBkZXN0cnVjdG9yIHZpYSA8VFQ+ZGVjbHR5cGU8L1RUPjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTg3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1ODciPjE1ODc8L2E+PC90ZD4KLSAgICA8dGQ+RFI8L3RkPgorICAgIDx0ZD5EUldQPC90ZD4KICAgICA8dGQ+PFRUPmNvbnN0ZXhwcjwvVFQ+IGluaXRpYWxpemF0aW9uIGFuZCBuZXN0ZWQgYW5vbnltb3VzIHVuaW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1ODgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTU4OCI+MTU4ODwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+RGVkdWNpbmcgY3YtcXVhbGlmaWVkIDxUVD5hdXRvPC9UVD48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE1ODkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNTg5Ij4xNTg5PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+QW1iaWd1b3VzIHJhbmtpbmcgb2YgbGlzdC1pbml0aWFsaXphdGlvbiBzZXF1ZW5jZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjE1OTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNTkwIj4xNTkwPC9hPjwvdGQ+Ci0gICAgPHRkPnJldmlldzwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+QnlwYXNzaW5nIG5vbi1jb3B5L21vdmUgY29uc3RydWN0b3IgY29weWluZzwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNTkxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTU5MSI+MTU5MTwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+RGVkdWNpbmcgYXJyYXkgYm91bmQgYW5kIGVsZW1lbnQgdHlwZSBmcm9tIGluaXRpYWxpemVyIGxpc3Q8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNTkyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE1OTIiPjE1OTI8L2E+PC90ZD4KLSAgICA8dGQ+RFI8L3RkPgorICAgIDx0ZD5EUldQPC90ZD4KICAgICA8dGQ+V2hlbiBkbyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIG1hdGNoPzwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE1OTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTU5MyI+MTU5MzwvYT48L3RkPgotICAgIDx0ZD5EUjwvdGQ+CisgICAgPHRkPkRSV1A8L3RkPgogICAgIDx0ZD4mIzgyMjA7UGFyYW1ldGVyIHR5cGUmIzgyMjE7IG9mIHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTU5NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE1OTQiPjE1OTQ8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5MYXp5IGRlY2xhcmF0aW9uIG9mIHNwZWNpYWwgbWVtYmVycyB2cyBvdmVybG9hZCBlcnJvcnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU5NSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTk1Ij4xNTk1PC9hPjwvdGQ+Ci0gICAgPHRkPkRSPC90ZD4KKyAgICA8dGQ+RFJXUDwvdGQ+CiAgICAgPHRkPkNvbnN0cnVjdG9ycyAmIzgyMjA7aW52b2x2ZWQgaW4mIzgyMjE7IHN1Ym9iamVjdCBpbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNTk2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTU5NiI+MTU5NjwvYT48L3RkPgotICAgIDx0ZD5yZXZpZXc8L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPk5vbi1hcnJheSBvYmplY3RzIGFzIDxUVD5hcnJheVsxXTwvVFQ+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTU5NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTk3Ij4xNTk3PC9hPjwvdGQ+Ci0gICAgPHRkPldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+TWlzbGVhZGluZyA8VFQ+Y29uc3RleHByPC9UVD4gZXhhbXBsZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTU5OCI+MTU5ODwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgIDx0ciBpZD0iMTU5OCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNTk4Ij4xNTk4PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+Q3JpdGVyaW9uIGZvciBlcXVhbGl0eSBvZiBwb2ludGVycyB0byBtZW1iZXJzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNTk5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTU5OSI+MTU5OTwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+TGlmZXRpbWUgb2YgPFRUPmluaXRpYWxpemVyX2xpc3Q8L1RUPiB1bmRlcmx5aW5nIGFycmF5PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNjAwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTYwMCI+MTYwMDwvYT48L3RkPgotICAgIDx0ZD5yZXZpZXc8L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPkVycm9uZW91cyByZWZlcmVuY2UgaW5pdGlhbGl6YXRpb24gaW4gZXhhbXBsZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2MDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTYwMSI+MTYwMTwvYT48L3RkPgotICAgIDx0ZD5EUjwvdGQ+CisgICAgPHRkPkRSV1A8L3RkPgogICAgIDx0ZD5Qcm9tb3Rpb24gb2YgZW51bWVyYXRpb24gd2l0aCBmaXhlZCB1bmRlcmx5aW5nIHR5cGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2MDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjAyIj4xNjAyPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5MaW5rYWdlIG9mIHNwZWNpYWxpemF0aW9uIHZzIGxpbmthZ2Ugb2YgdGVtcGxhdGUgYXJndW1lbnRzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTYwMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MDMiPjE2MDM8L2E+PC90ZD4KICAgICA8dGQ+cmV2aWV3PC90ZD4KICAgICA8dGQ+RXJyb3JzIHJlc3VsdGluZyBmcm9tIGdpdmluZyB1bm5hbWVkIG5hbWVzcGFjZXMgaW50ZXJuYWwgbGlua2FnZTwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTYwNCI+MTYwNDwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTYwNCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjA0Ij4xNjA0PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+RG91YmxlIHRlbXBvcmFyaWVzIGluIHJlZmVyZW5jZSBpbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2MDUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTYwNSI+MTYwNTwvYT48L3RkPgotICAgIDx0ZD5EUldQPC90ZD4KKyAgICA8dGQ+Q0QzPC90ZD4KICAgICA8dGQ+TWlzbGVhZGluZyBwYXJlbnRoZXRpY2FsIGNvbW1lbnQgZm9yIGV4cGxpY2l0IGRlc3RydWN0b3IgY2FsbDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2MDYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNjA2Ij4xNjA2PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPjxUVD5zaXplb2Y8L1RUPiBjbG9zdXJlIGNsYXNzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MDciPjE2MDc8L2E+PC90ZD4KLSAgICA8dGQ+cmVhZHk8L3RkPgorICA8dHIgaWQ9IjE2MDciPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTYwNyI+MTYwNzwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPkxhbWJkYXMgaW4gdGVtcGxhdGUgcGFyYW1ldGVyczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2MDgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTYwOCI+MTYwODwvYT48L3RkPgotICAgIDx0ZD5EUjwvdGQ+CisgICAgPHRkPkRSV1A8L3RkPgogICAgIDx0ZD5PcGVyYXRvciBsb29rdXAgaW4gdHJhaWxpbmcgcmV0dXJuIHR5cGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2MDkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjA5Ij4xNjA5PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5EZWZhdWx0IGFyZ3VtZW50cyBhbmQgZnVuY3Rpb24gcGFyYW1ldGVyIHBhY2tzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTYxMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MTAiPjE2MTA8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5Ddi1xdWFsaWZpY2F0aW9uIGluIGRlZHVjdGlvbiBvZiByZWZlcmVuY2UgdG8gYXJyYXk8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MTEiPjE2MTE8L2E+PC90ZD4KLSAgICA8dGQ+dGVudGF0aXZlbHkgcmVhZHk8L3RkPgorICA8dHIgaWQ9IjE2MTEiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTYxMSI+MTYxMTwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPkRlbGV0ZWQgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgYWJzdHJhY3QgY2xhc3M8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTYxMiI+MTYxMjwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTYxMiI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjEyIj4xNjEyPC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+SW1wbGljaXQgbGFtYmRhIGNhcHR1cmUgYW5kIGFub255bW91cyB1bmlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTYxMyI+MTYxMzwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTYxMyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjEzIj4xNjEzPC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+Q29uc3RhbnQgZXhwcmVzc2lvbnMgYW5kIGxhbWJkYSBjYXB0dXJlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjE2MTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjE0Ij4xNjE0PC9hPjwvdGQ+Ci0gICAgPHRkPnJldmlldzwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+QWRkcmVzcyBvZiBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gdnMgb2RyLXVzZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNjE1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTYxNSI+MTYxNTwvYT48L3RkPgotICAgIDx0ZD5yZXZpZXc8L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPkFsaWdubWVudCBvZiB0eXBlcywgdmFyaWFibGVzLCBhbmQgbWVtYmVyczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTYxNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MTYiPjE2MTY8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5EaXNhbWJpZ3VhdGlvbiBwYXJzaW5nIGFuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTYxNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MTciPjE2MTc8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPjxUVD5hbGlnbmFzPC9UVD4gYW5kIG5vbi1kZWZpbmluZyBkZWNsYXJhdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTYxOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjE4Ij4xNjE4PC9hPjwvdGQ+Ci0gICAgPHRkPkRSPC90ZD4KKyAgICA8dGQ+RFJXUDwvdGQ+CiAgICAgPHRkPkdyYXR1aXRvdXNseS11bnNpZ25lZCB1bmRlcmx5aW5nIGVudW0gdHlwZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTYxOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MTkiPjE2MTk8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkRlZmluaXRpb24gb2YgY3VycmVudCBpbnN0YW50aWF0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTYyMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MjAiPjE2MjA8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPlVzZXItZGVmaW5lZCBsaXRlcmFscyBhbmQgZXh0ZW5kZWQgaW50ZWdlciB0eXBlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2MjEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjIxIj4xNjIxPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+TWVtYmVyIGluaXRpYWxpemVycyBpbiBhbm9ueW1vdXMgdW5pb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTYyMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MjIiPjE2MjI8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5FbXB0eSBhZ2dyZWdhdGUgaW5pdGlhbGl6ZXIgZm9yIHVuaW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTYyMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MjMiPjE2MjM8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5EZWxldGVkIGRlZmF1bHQgdW5pb24gY29uc3RydWN0b3IgYW5kIG1lbWJlciBpbml0aWFsaXplcnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTYyNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE2MjQiPjE2MjQ8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RGVzdHJ1Y3Rpb24gb2YgdW5pb24gbWVtYmVycyB3aXRoIG1lbWJlciBpbml0aWFsaXplcnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2MjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjI1Ij4xNjI1PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5BZGRpbmcgc3BhY2VzIGJldHdlZW4gdG9rZW5zIGluIHN0cmluZ2l6aW5nPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTYyNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MjYiPjE2MjY8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD48VFQ+Y29uc3RleHByPC9UVD4gbWVtYmVyIGZ1bmN0aW9ucyBpbiA8ST5icmFjZS1vci1lcXVhbC1pbml0aWFsaXplcjwvST5zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2MjciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNjI3Ij4xNjI3PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkFncmVlbWVudCBvZiBkZXBlbmRlbnQgPFRUPmFsaWduYXM8L1RUPiBzcGVjaWZpZXJzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjI4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTYyOCI+MTYyODwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+RGVhbGxvY2F0aW9uIGZ1bmN0aW9uIHRlbXBsYXRlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MjkiPjE2Mjk8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICA8dHIgaWQ9IjE2MjkiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTYyOSI+MTYyOTwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPkNhbiBhIGNsb3N1cmUgY2xhc3MgYmUgYSBsaXRlcmFsIHR5cGU/PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjMwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTYzMCI+MTYzMDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk11bHRpcGxlIGRlZmF1bHQgY29uc3RydWN0b3IgdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTYzMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MzEiPjE2MzE8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3Qgb3ZlcmxvYWQgcmVzb2x1dGlvbiBmb3Igc2luZ2xlLWVsZW1lbnQgPEk+aW5pdGlhbGl6ZXItbGlzdDwvST48L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjMyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTYzMiI+MTYzMjwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+TGFtYmRhIGNhcHR1cmUgaW4gbWVtYmVyIGluaXRpYWxpemVyczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2MzMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjMzIj4xNjMzPC9hPjwvdGQ+CiAgICAgPHRkPnJldmlldzwvdGQ+CiAgICAgPHRkPkNvcHktaW5pdGlhbGl6YXRpb24gaW4gbWVtYmVyIGluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTYzNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MzQiPjE2MzQ8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5UZW1wb3Jhcnkgc3RvcmFnZSBkdXJhdGlvbjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2MzUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjM1Ij4xNjM1PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+SG93IHNpbWlsYXIgYXJlIHRlbXBsYXRlIGRlZmF1bHQgYXJndW1lbnRzIHRvIGZ1bmN0aW9uIGRlZmF1bHQgYXJndW1lbnRzPzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2MzYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjM2Ij4xNjM2PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+Qml0cyByZXF1aXJlZCBmb3IgbmVnYXRpdmUgZW51bWVyYXRvciB2YWx1ZXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTYzNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE2MzciPjE2Mzc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+UmVjdXJzaW9uIGluIDxUVD5jb25zdGV4cHI8L1RUPiB0ZW1wbGF0ZSBkZWZhdWx0IGNvbnN0cnVjdG9yPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjM4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTYzOCI+MTYzODwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkRlY2xhcmluZyBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiBhIHNjb3BlZCBlbnVtZXJhdGlvbjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTYzOSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2MzkiPjE2Mzk8L2E+PC90ZD4KLSAgICA8dGQ+cmV2aWV3PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD48ST5leGNlcHRpb24tc3BlY2lmaWNhdGlvbjwvST5zIGFuZCBwb2ludGVyL3BvaW50ZXItdG8tbWVtYmVyIGV4cHJlc3Npb25zPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjQwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY0MCI+MTY0MDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkFycmF5IG9mIGFic3RyYWN0IGluc3RhbmNlIG9mIGNsYXNzIHRlbXBsYXRlPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2NDEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNjQxIj4xNjQxPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPkFzc2lnbm1lbnQgaW4gbWVtYmVyIGluaXRpYWxpemVyPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjQyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY0MiI+MTY0MjwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+TWlzc2luZyByZXF1aXJlbWVudHMgZm9yIHBydmFsdWUgb3BlcmFuZHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjQzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTY0MyI+MTY0MzwvYT48L3RkPgogICAgIDx0ZD5leHRlbnNpb248L3RkPgogICAgIDx0ZD5EZWZhdWx0IGFyZ3VtZW50cyBmb3IgdGVtcGxhdGUgcGFyYW1ldGVyIHBhY2tzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTY0NCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NDQiPjE2NDQ8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkVxdWl2YWxlbnQgPEk+ZXhjZXB0aW9uLXNwZWNpZmljYXRpb248L0k+cyBpbiBmdW5jdGlvbiB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjQ1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY0NSI+MTY0NTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPklkZW50aWNhbCBpbmhlcml0aW5nIGNvbnN0cnVjdG9ycyB2aWEgZGVmYXVsdCBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjQ2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY0NiI+MTY0NjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPjxJPmRlY2x0eXBlLXNwZWNpZmllcjwvST5zLCBhYnN0cmFjdCBjbGFzc2VzLCBhbmQgZGVkdWN0aW9uIGZhaWx1cmU8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjQ3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY0NyI+MTY0NzwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlR5cGUgYWdyZWVtZW50IG9mIG5vbi10eXBlIHRlbXBsYXRlIGFyZ3VtZW50cyBpbiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNjQ4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE2NDgiPjE2NDg8L2E+PC90ZD4KLSAgICA8dGQ+RFI8L3RkPgorICAgIDx0ZD5EUldQPC90ZD4KICAgICA8dGQ+PFRUPnRocmVhZF9sb2NhbDwvVFQ+IHZzIGJsb2NrIGV4dGVybiBkZWNsYXJhdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNjQ5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE2NDkiPjE2NDk8L2E+PC90ZD4KLSAgICA8dGQ+RFI8L3RkPgorICAgIDx0ZD5EUldQPC90ZD4KICAgICA8dGQ+RXJyb3IgaW4gdGhlIHN5bnRheCBvZiA8ST5tZW0taW5pdGlhbGl6ZXItbGlzdDwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NTAiPjE2NTA8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgIDx0ciBpZD0iMTY1MCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE2NTAiPjE2NTA8L2E+PC90ZD4KKyAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+Q2xhc3MgcHJ2YWx1ZXMgaW4gcmVmZXJlbmNlIGluaXRpYWxpemF0aW9uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjE2NTEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjUxIj4xNjUxPC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5MaWZldGltZSBleHRlbnNpb24gb2YgdGVtcG9yYXJ5IHZpYSByZWZlcmVuY2UgdG8gc3Vib2JqZWN0PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjUyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY1MiI+MTY1MjwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk9iamVjdCBhZGRyZXNzZXMgaW4gPFRUPmNvbnN0ZXhwcjwvVFQ+IGV4cHJlc3Npb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTY1MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NTMiPjE2NTM8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5SZW1vdmluZyBkZXByZWNhdGVkIGluY3JlbWVudCBvZiA8VFQ+Ym9vbDwvVFQ+PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2NTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNjU0Ij4xNjU0PC9hPjwvdGQ+CiAgICAgPHRkPmR1cDwvdGQ+CiAgICAgPHRkPkxpdGVyYWwgdHlwZXMgYW5kIDxUVD5jb25zdGV4cHI8L1RUPiBkZWZhdWx0ZWQgY29uc3RydWN0b3JzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjU1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY1NSI+MTY1NTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkxpbmUgZW5kaW5ncyBpbiByYXcgc3RyaW5nIGxpdGVyYWxzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTY1NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NTYiPjE2NTY8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5FbmNvZGluZyBvZiBudW1lcmljYWxseS1lc2NhcGVkIGNoYXJhY3RlcnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjU3Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTY1NyI+MTY1NzwvYT48L3RkPgogICAgIDx0ZD5leHRlbnNpb248L3RkPgogICAgIDx0ZD5BdHRyaWJ1dGVzIGZvciBuYW1lc3BhY2VzIGFuZCBlbnVtZXJhdG9yczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NTgiPjE2NTg8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICA8dHIgaWQ9IjE2NTgiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTY1OCI+MTY1ODwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPkRlbGV0ZWQgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgYWJzdHJhY3QgY2xhc3MgdmlhIGRlc3RydWN0b3I8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2NTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjU5Ij4xNjU5PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD5Jbml0aWFsaXphdGlvbiBvcmRlciBvZiB0aHJlYWRfbG9jYWwgdGVtcGxhdGUgc3RhdGljIGRhdGEgbWVtYmVyczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NjAiPjE2NjA8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgIDx0ciBpZD0iMTY2MCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjYwIj4xNjYwPC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+PEk+bWVtYmVyLWRlY2xhcmF0aW9uPC9JPiByZXF1aXJlbWVudHMgYW5kIHVubmFtZWQgYml0LWZpZWxkczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTY2MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NjEiPjE2NjE8L2E+PC90ZD4KICAgICA8dGQ+Y29uY3VycmVuY3k8L3RkPgogICAgIDx0ZD5QcmVzZXJ2YXRpb24gb2YgaW5maW5pdGUgbG9vcHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NjIiPjE2NjI8L2E+PC90ZD4KLSAgICA8dGQ+cmVhZHk8L3RkPgorICA8dHIgaWQ9IjE2NjIiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTY2MiI+MTY2MjwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPkNhcHR1cmluZyBmdW5jdGlvbiBwYXJhbWV0ZXIgcGFja3M8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNjYzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTY2MyI+MTY2MzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5DYXB0dXJpbmcgYW4gZW1wdHkgcGFjayBleHBhbnNpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY2NCI+MTY2NDwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTY2NCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjY0Ij4xNjY0PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+QXJndW1lbnQtZGVwZW5kZW50IGxvb2t1cCBvZiBsYW1iZGFzIHVzZWQgaW4gZGVmYXVsdCBhcmd1bWVudHM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2NjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjY1Ij4xNjY1PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+RGVjbGFyYXRpb24gbWF0Y2hpbmcgaW4gZXhwbGljaXQgaW5zdGFudGlhdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjY2Ij4xNjY2PC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgPHRyIGlkPSIxNjY2Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE2NjYiPjE2NjY8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5BZGRyZXNzIGNvbnN0YW50IGV4cHJlc3Npb25zPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTY2NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE2NjciPjE2Njc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RnVuY3Rpb24gZXhpdGluZyB2aWEgZXhjZXB0aW9uIGNhbGxlZCBieSBkZXN0cnVjdG9yIGR1cmluZyB1bndpbmRpbmc8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2NjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjY4Ij4xNjY4PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+UGFyYW1ldGVyIHR5cGUgZGV0ZXJtaW5hdGlvbiBzdGlsbCBub3QgY2xlYXIgZW5vdWdoPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY2OSI+MTY2OTwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgIDx0ciBpZD0iMTY2OSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjY5Ij4xNjY5PC9hPjwvdGQ+CisgICAgPHRkPmFjY2VwdGVkPC90ZD4KICAgICA8dGQ+PFRUPmF1dG88L1RUPiByZXR1cm4gdHlwZSBmb3IgPFRUPm1haW48L1RUPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTY3MCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NzAiPjE2NzA8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+PFRUPmF1dG88L1RUPiBhcyA8ST5jb252ZXJzaW9uLXR5cGUtaWQ8L0k+PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2NzEiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNjcxIj4xNjcxPC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlVuY2xlYXIgcnVsZXMgZm9yIGRlZHVjdGlvbiB3aXRoIGN2LXF1YWxpZmljYXRpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2NzIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjcyIj4xNjcyPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+TGF5b3V0IGNvbXBhdGliaWxpdHkgd2l0aCBtdWx0aXBsZSBlbXB0eSBiYXNlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NzMiPjE2NzM8L2E+PC90ZD4KLSAgICA8dGQ+cmV2aWV3PC90ZD4KKyAgPHRyIGlkPSIxNjczIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE2NzMiPjE2NzM8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5DbGFyaWZ5aW5nIG92ZXJsb2FkIHJlc29sdXRpb24gZm9yIHRoZSBzZWNvbmQgc3RlcCBvZiBjb3B5LWluaXRpYWxpemF0aW9uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjc0Ij4xNjc0PC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgPHRyIGlkPSIxNjc0Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE2NzQiPjE2NzQ8L2E+PC90ZD4KKyAgICA8dGQ+YWNjZXB0ZWQ8L3RkPgogICAgIDx0ZD5SZXR1cm4gdHlwZSBkZWR1Y3Rpb24gZm9yIGFkZHJlc3Mgb2YgZnVuY3Rpb248L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY3NSI+MTY3NTwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTY3NSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE2NzUiPjE2NzU8L2E+PC90ZD4KKyAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+U2l6ZSBsaW1pdCBmb3IgYXV0b21hdGljIGFycmF5IG9iamVjdDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTY3NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NzYiPjE2NzY8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD48VFQ+YXV0bzwvVFQ+IHJldHVybiB0eXBlIGZvciBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gZnVuY3Rpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTY3NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2NzciPjE2Nzc8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5Db25zdGFudCBpbml0aWFsaXphdGlvbiB2aWEgYWdncmVnYXRlIGluaXRpYWxpemF0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE2NzgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNjc4Ij4xNjc4PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPk5hbWluZyB0aGUgdHlwZSBvZiBhbiBhcnJheSBvZiBydW50aW1lIGJvdW5kPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTY3OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE2NzkiPjE2Nzk8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+UmFuZ2UtYmFzZWQgPFRUPmZvcjwvVFQ+IGFuZCBhcnJheSBvZiBydW50aW1lIGJvdW5kPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjgwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY4MCI+MTY4MDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkluY2x1ZGluZyA8VFQ+Jmx0O2luaXRpYWxpemVyX2xpc3QmZ3Q7PC9UVD4gZm9yIHJhbmdlLWJhc2VkIDxUVD5mb3I8L1RUPjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY4MSI+MTY4MTwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTY4MSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjgxIj4xNjgxPC9hPjwvdGQ+CisgICAgPHRkPmFjY2VwdGVkPC90ZD4KICAgICA8dGQ+PEk+aW5pdC1jYXB0dXJlPC9JPnMgYW5kIG5lc3RlZCBsYW1iZGFzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjgyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY4MiI+MTY4MjwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+T3Zlcmx5LXJlc3RyaWN0aXZlIHJ1bGVzIG9uIGZ1bmN0aW9uIHRlbXBsYXRlcyBhcyBhbGxvY2F0aW9uIGZ1bmN0aW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2ODMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjgzIj4xNjgzPC9hPjwvdGQ+CiAgICAgPHRkPnJldmlldzwvdGQ+CiAgICAgPHRkPkluY29ycmVjdCBleGFtcGxlIGFmdGVyIDxUVD5jb25zdGV4cHI8L1RUPiBjaGFuZ2VzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY4NCI+MTY4NDwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgIDx0ciBpZD0iMTY4NCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjg0Ij4xNjg0PC9hPjwvdGQ+CisgICAgPHRkPmFjY2VwdGVkPC90ZD4KICAgICA8dGQ+U3RhdGljIDxUVD5jb25zdGV4cHI8L1RUPiBtZW1iZXIgZnVuY3Rpb25zIGZvciBub24tbGl0ZXJhbCBjbGFzc2VzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjg1Ij4xNjg1PC9hPjwvdGQ+Ci0gICAgPHRkPnJldmlldzwvdGQ+CisgIDx0ciBpZD0iMTY4NSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE2ODUiPjE2ODU8L2E+PC90ZD4KKyAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+VmFsdWUgY2F0ZWdvcnkgb2YgPFRUPm5vZXhjZXB0PC9UVD4gZXhwcmVzc2lvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNjg2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY4NiI+MTY4NjwvYT48L3RkPgotICAgIDx0ZD5yZXZpZXc8L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPldoaWNoIHZhcmlhYmxlcyBhcmUgJiM4MjIwO2V4cGxpY2l0bHkgZGVjbGFyZWQgPFRUPmNvbnN0PC9UVD4/JiM4MjIxOzwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY4NyI+MTY4NzwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgIDx0ciBpZD0iMTY4NyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjg3Ij4xNjg3PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+Q29udmVyc2lvbnMgb2Ygb3BlcmFuZHMgb2YgYnVpbHQtaW4gb3BlcmF0b3JzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTY4OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE2ODgiPjE2ODg8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+Vm9sYXRpbGUgPFRUPmNvbnN0ZXhwcjwvVFQ+IHZhcmlhYmxlczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY4OSI+MTY4OTwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgIDx0ciBpZD0iMTY4OSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjg5Ij4xNjg5PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+U3ludGFjdGljIG5vbnRlcm1pbmFsIGZvciBvcGVyYW5kIG9mIDxUVD5hbGlnbmFzPC9UVD48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY5MCI+MTY5MDwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTY5MCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjkwIj4xNjkwPC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+QXNzb2NpYXRlZCBuYW1lc3BhY2UgZm9yIGxvY2FsIHR5cGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY5MSI+MTY5MTwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTY5MSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNjkxIj4xNjkxPC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+QXJndW1lbnQtZGVwZW5kZW50IGxvb2t1cCBhbmQgb3BhcXVlIGVudW1lcmF0aW9uczwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjkyIj4xNjkyPC9hPjwvdGQ+Ci0gICAgPHRkPnJlYWR5PC90ZD4KKyAgPHRyIGlkPSIxNjkyIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE2OTIiPjE2OTI8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5Bc3NvY2lhdGVkIG5hbWVzcGFjZXMgb2YgZG91Ymx5LW5lc3RlZCBjbGFzc2VzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjkzIj4xNjkzPC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgPHRyIGlkPSIxNjkzIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE2OTMiPjE2OTM8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5TdXBlcmZsdW91cyBzZW1pY29sb25zIGluIGNsYXNzIGRlZmluaXRpb25zPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjE2OTQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjk0Ij4xNjk0PC9hPjwvdGQ+Ci0gICAgPHRkPnJldmlldzwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+UmVzdHJpY3Rpb24gb24gcmVmZXJlbmNlIHRvIHRlbXBvcmFyeSBhcyBhIGNvbnN0YW50IGV4cHJlc3Npb248L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2OTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjk1Ij4xNjk1PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+TGlmZXRpbWUgZXh0ZW5zaW9uIHZpYSA8ST5pbml0LWNhcHR1cmU8L0k+PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTY5NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE2OTYiPjE2OTY8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+VGVtcG9yYXJ5IGxpZmV0aW1lIGFuZCBub24tc3RhdGljIGRhdGEgbWVtYmVyIGluaXRpYWxpemVyczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE2OTciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNjk3Ij4xNjk3PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+TGlmZXRpbWUgZXh0ZW5zaW9uIGFuZCBjb3B5IGVsaXNpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjk4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY5OCI+MTY5ODwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+RmlsZXMgZW5kaW5nIGluIDxUVD5cPC9UVD48L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNjk5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTY5OSI+MTY5OTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkRvZXMgYmVmcmllbmRpbmcgYSBjbGFzcyBiZWZyaWVuZCBpdHMgZnJpZW5kcz88L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTcwMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE3MDAiPjE3MDA8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+RG9lcyB0aGUgc3BlY2lhbCBydmFsdWUtcmVmZXJlbmNlIGRlZHVjdGlvbiBhcHBseSB0byBhbGlhcyB0ZW1wbGF0ZXM/PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzAxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTcwMSI+MTcwMTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkFycmF5IHZzIHNlcXVlbmNlIGluIG9iamVjdCByZXByZXNlbnRhdGlvbjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE3MDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzAyIj4xNzAyPC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+UmVwaHJhc2luZyB0aGUgZGVmaW5pdGlvbiBvZiAmIzgyMjA7YW5vbnltb3VzIHVuaW9uJiM4MjIxOzwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNzAzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTcwMyI+MTcwMzwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5MYW5ndWFnZSBsaW5rYWdlIG9mIG5hbWVzIG9mIGZ1bmN0aW9ucyB3aXRoIGludGVybmFsIGxpbmthZ2U8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE3MDQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzA0Ij4xNzA0PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+VHlwZSBjaGVja2luZyBpbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIHZhcmlhYmxlIHRlbXBsYXRlczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTcwNSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MDUiPjE3MDU8L2E+PC90ZD4KLSAgICA8dGQ+cmV2aWV3PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5VbmNsZWFyIHNwZWNpZmljYXRpb24gb2YgJiM4MjIwO21vcmUgc3BlY2lhbGl6ZWQmIzgyMjE7PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzA2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTcwNiI+MTcwNjwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD48VFQ+YWxpZ25hczwvVFQ+IHBhY2sgZXhwYW5zaW9uIHN5bnRheDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MDciPjE3MDc8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICA8dHIgaWQ9IjE3MDciPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTcwNyI+MTcwNzwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPjxUVD50ZW1wbGF0ZTwvVFQ+IGluIDxJPmVsYWJvcmF0ZWQtdHlwZS1zcGVjaWZpZXI8L0k+IHdpdGhvdXQgPEk+bmVzdGVkLW5hbWUtc3BlY2lmaWVyPC9JPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNzA4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTcwOCI+MTcwODwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+b3Zlcmx5LXN0cmljdCByZXF1aXJlbWVudHMgZm9yIG5hbWVzIHdpdGggQyBsYW5ndWFnZSBsaW5rYWdlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzA5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTcwOSI+MTcwOTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlN0cmluZ2l6aW5nIHJhdyBzdHJpbmcgbGl0ZXJhbHMgY29udGFpbmluZyBuZXdsaW5lPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNzEwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTcxMCI+MTcxMDwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+TWlzc2luZyA8VFQ+dGVtcGxhdGU8L1RUPiBrZXl3b3JkIGluIDxJPmNsYXNzLW9yLWRlY2x0eXBlPC9JPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTcxMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MTEiPjE3MTE8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+TWlzc2luZyBzcGVjaWZpY2F0aW9uIG9mIHZhcmlhYmxlIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNzEyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTcxMiI+MTcxMjwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+PFRUPmNvbnN0ZXhwcjwvVFQ+IHZhcmlhYmxlIHRlbXBsYXRlIGRlY2xhcmF0aW9uczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTcxMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MTMiPjE3MTM8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+TGlua2FnZSBvZiB2YXJpYWJsZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzE0Ij4xNzE0PC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgPHRyIGlkPSIxNzE0Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTcxNCI+MTcxNDwvYT48L3RkPgorICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5vZHItdXNlIG9mIDxUVD50aGlzPC9UVD4gZnJvbSBhIGxvY2FsIGNsYXNzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjE3MTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzE1Ij4xNzE1PC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KLSAgICA8dGQ+QWNjZXNzIGFuZCBpbmhlcml0ZWQgY29uc3RydWN0b3IgdGVtcGxhdGVzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KLSAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTcxNiI+MTcxNjwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+Ci0gICAgPHRkPldoZW4gYXJlIGRlZmF1bHQgYXJndW1lbnRzIGV2YWx1YXRlZD88L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MTciPjE3MTc8L2E+PC90ZD4KICAgICA8dGQ+cmVhZHk8L3RkPgorICAgIDx0ZD5BY2Nlc3MgYW5kIGluaGVyaXRlZCBjb25zdHJ1Y3RvciB0ZW1wbGF0ZXM8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgIDwvdHI+CisgIDx0ciBpZD0iMTcxNiI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNzE2Ij4xNzE2PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KKyAgICA8dGQ+V2hlbiBhcmUgZGVmYXVsdCBhcmd1bWVudHMgZXZhbHVhdGVkPzwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxNzE3Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3MTciPjE3MTc8L2E+PC90ZD4KKyAgICA8dGQ+YWNjZXB0ZWQ8L3RkPgogICAgIDx0ZD5NaXNzaW5nIHNwZWNpZmljYXRpb24gb2YgdHlwZSBvZiBiaW5hcnkgbGl0ZXJhbDwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTcxOCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MTgiPjE3MTg8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+TWFjcm8gaW52b2NhdGlvbiBzcGFubmluZyBlbmQtb2YtZmlsZTwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE3MTkiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzE5Ij4xNzE5PC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkxheW91dCBjb21wYXRpYmlsaXR5IGFuZCBjdi1xdWFsaWZpY2F0aW9uIHJldmlzaXRlZDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KKyAgPHRyIGlkPSIxNzIwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTcyMCI+MTcyMDwvYT48L3RkPgogICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5NYWNybyBpbnZvY2F0aW9uIGluIDxUVD4jaW5jbHVkZTwvVFQ+IGRpcmVjdGl2ZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTcyMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MjEiPjE3MjE8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5EaWFnbm9zaW5nIE9EUiB2aW9sYXRpb25zIGZvciBzdGF0aWMgZGF0YSBtZW1iZXJzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTcyMiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MjIiPjE3MjI8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5TaG91bGQgbGFtYmRhIHRvIGZ1bmN0aW9uIHBvaW50ZXIgY29udmVyc2lvbiBmdW5jdGlvbiBiZSA8VFQ+bm9leGNlcHQ8L1RUPj88L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzIzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTcyMyI+MTcyMzwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk11bHRpY2hhcmFjdGVyIHVzZXItZGVmaW5lZCBjaGFyYWN0ZXIgbGl0ZXJhbHM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzI0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTcyNCI+MTcyNDwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPlVuY2xlYXIgcnVsZXMgZm9yIGRlZHVjdGlvbiBmYWlsdXJlPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgorICA8dHIgaWQ9IjE3MjUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNzI1Ij4xNzI1PC9hPjwvdGQ+CiAgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlRyYWlsaW5nIHJldHVybiB0eXBlIHdpdGggbmVzdGVkIGZ1bmN0aW9uIGRlY2xhcmF0b3I8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE3MjYiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzI2Ij4xNzI2PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+RGVjbGFyYXRvciBvcGVyYXRvcnMgYW5kIGNvbnZlcnNpb24gZnVuY3Rpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTcyNyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE3MjciPjE3Mjc8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+VHlwZSBvZiBhIHNwZWNpYWxpemF0aW9uIG9mIGEgdmFyaWFibGUgdGVtcGxhdGU8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE3MjgiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzI4Ij4xNzI4PC9hPjwvdGQ+CiAgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+VHlwZSBvZiBhbiBleHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIGEgdmFyaWFibGUgdGVtcGxhdGU8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzI5Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTcyOSI+MTcyOTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk1hdGNoaW5nIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgb2YgdmFyaWFibGUgdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTczMCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MzAiPjE3MzA8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5DYW4gYSB2YXJpYWJsZSB0ZW1wbGF0ZSBoYXZlIGFuIHVubmFtZWQgdHlwZT88L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHI+CisgIDx0ciBpZD0iMTczMSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE3MzEiPjE3MzE8L2E+PC90ZD4KICAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+PFRUPmlzX3RyaXZpYWxseV88L1RUPjxJPlg8L0k+IGFuZCBkZWZpbml0aW9ucyBvZiBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MzIiPjE3MzI8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICA8dHIgaWQ9IjE3MzIiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTczMiI+MTczMjwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPkRlZmluaW5nIHR5cGVzIGluIDxJPmNvbmRpdGlvbjwvST5zIGFuZCByYW5nZS1iYXNlZCA8VFQ+Zm9yPC9UVD4gc3RhdGVtZW50czwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTczMyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MzMiPjE3MzM8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5SZXR1cm4gdHlwZSBhbmQgdmFsdWUgZm9yIDxUVD5vcGVyYXRvcj08L1RUPiB3aXRoIDxJPnJlZi1xdWFsaWZpZXI8L0k+PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTczNCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MzQiPjE3MzQ8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5Ob250cml2aWFsIGRlbGV0ZWQgY29weSBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzM1Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTczNSI+MTczNTwvYT48L3RkPgogICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk91dC1vZi1yYW5nZSBsaXRlcmFscyBpbiA8ST51c2VyLWRlZmluZWQtbGl0ZXJhbDwvST5zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTczNiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3MzYiPjE3MzY8L2E+PC90ZD4KICAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5Jbmhlcml0aW5nIGNvbnN0cnVjdG9yIHRlbXBsYXRlcyBpbiBhIGxvY2FsIGNsYXNzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTczNyI+MTczNzwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgIDx0ciBpZD0iMTczNyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNzM3Ij4xNzM3PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+VHlwZSBkZXBlbmRlbmNlIG9mIGNhbGwgdG8gYSBtZW1iZXIgb2YgdGhlIGN1cnJlbnQgaW5zdGFudGlhdGlvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTczOCI+MTczODwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgIDx0ciBpZD0iMTczOCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNzM4Ij4xNzM4PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+RXhwbGljaXQgaW5zdGFudGlhdGlvbi9zcGVjaWFsaXphdGlvbiBvZiBpbmhlcml0aW5nIGNvbnN0cnVjdG9yIHRlbXBsYXRlczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTczOSI+MTczOTwvYT48L3RkPgotICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgIDx0ciBpZD0iMTczOSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNzM5Ij4xNzM5PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+Q29udmVyc2lvbiBvZiBmbG9hdGluZyBwb2ludCB0byBlbnVtZXJhdGlvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzQwIj4xNzQwPC9hPjwvdGQ+Ci0gICAgPHRkPnJlYWR5PC90ZD4KKyAgPHRyIGlkPSIxNzQwIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3NDAiPjE3NDA8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5EaXNhbWJpZ3VhdGlvbiBvZiA8VFQ+bm9leGNlcHQ8L1RUPjwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzQxIj4xNzQxPC9hPjwvdGQ+Ci0gICAgPHRkPnJlYWR5PC90ZD4KKyAgPHRyIGlkPSIxNzQxIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3NDEiPjE3NDE8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5vZHItdXNlIG9mIGNsYXNzIG9iamVjdCBpbiBsdmFsdWUtdG8tcnZhbHVlIGNvbnZlcnNpb248L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE3NDIiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzQyIj4xNzQyPC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgogICAgIDx0ZD48ST51c2luZy1kZWNsYXJhdGlvbjwvST5zIGFuZCBzY29wZWQgZW51bWVyYXRvcnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzQzIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc0MyI+MTc0MzwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+PEk+aW5pdC1jYXB0dXJlPC9JPnMgaW4gbmVzdGVkIGxhbWJkYXM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzQ0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc0NCI+MTc0NDwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+cmV2aWV3PC90ZD4KICAgICA8dGQ+VW5vcmRlcmVkIGluaXRpYWxpemF0aW9uIGZvciB2YXJpYWJsZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzQ1Ij4xNzQ1PC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICA8dHIgaWQ9IjE3NDUiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNzQ1Ij4xNzQ1PC9hPjwvdGQ+CisgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPjxUVD50aHJlYWRfbG9jYWwgY29uc3RleHByPC9UVD4gdmFyaWFibGU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NDYiPjE3NDY8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgIDx0ciBpZD0iMTc0NiI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNzQ2Ij4xNzQ2PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+QXJlIHZvbGF0aWxlIHNjYWxhciB0eXBlcyB0cml2aWFsbHkgY29weWFibGU/PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzQ3Ij4xNzQ3PC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICA8dHIgaWQ9IjE3NDciPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTc0NyI+MTc0NzwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPkNvbnN0YW50IGluaXRpYWxpemF0aW9uIG9mIHJlZmVyZW5jZSB0byBmdW5jdGlvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNzQ4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc0OCI+MTc0ODwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5QbGFjZW1lbnQgbmV3IHdpdGggYSBudWxsIHBvaW50ZXI8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NDkiPjE3NDk8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgIDx0ciBpZD0iMTc0OSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE3NDkiPjE3NDk8L2E+PC90ZD4KKyAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+Q29uZnVzaW5nIGRlZmluaXRpb24gZm9yIGNvbnN0YW50IGluaXRpYWxpemVyPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjE3NTAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzUwIj4xNzUwPC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPiYjODIyMDtBcmd1bWVudCYjODIyMTsgdnMgJiM4MjIwO3BhcmFtZXRlciYjODIyMTs8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTc1MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NTEiPjE3NTE8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+Tm9uLXRyaXZpYWwgb3BlcmF0aW9ucyB2cyBub24tdHJpdmlhbCBpbml0aWFsaXphdGlvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNzUyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc1MiI+MTc1MjwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5SaWdodC1yZWN1cnNpb24gaW4gPEk+bWVtLWluaXRpYWxpemVyLWxpc3Q8L0k+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjE3NTMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzUzIj4xNzUzPC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPjxJPmRlY2x0eXBlLXNwZWNpZmllcjwvST4gaW4gPEk+bmVzdGVkLW5hbWUtc3BlY2lmaWVyPC9JPiBvZiBkZXN0cnVjdG9yPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzU0Ij4xNzU0PC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzU0Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTc1NCI+MTc1NDwvYT48L3RkPgorICAgIDx0ZD5leHRlbnNpb248L3RkPgogICAgIDx0ZD5EZWNsYXJhdGlvbiBvZiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIHN0YXRpYyBkYXRhIG1lbWJlciB0ZW1wbGF0ZTwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE3NTUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzU1Ij4xNzU1PC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPk91dC1vZi1jbGFzcyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9ucyBvZiBtZW1iZXIgdGVtcGxhdGVzPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTc1NiI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NTYiPjE3NTY8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPnJldmlldzwvdGQ+CiAgICAgPHRkPkRpcmVjdC1saXN0LWluaXRpYWxpemF0aW9uIG9mIGEgbm9uLWNsYXNzIG9iamVjdDwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTc1NyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NTciPjE3NTc8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+Q29uc3QgaW50ZWdyYWwgc3Vib2JqZWN0czwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTc1OCI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NTgiPjE3NTg8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0IGNvbnZlcnNpb24gaW4gY29weS9tb3ZlIGxpc3QgaW5pdGlhbGl6YXRpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzU5Ij4xNzU5PC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgPHRyIGlkPSIxNzU5Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3NTkiPjE3NTk8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5VVEYtOCBjb2RlIHVuaXRzIGluIHBsYWluIDxUVD5jaGFyPC9UVD48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc2MCI+MTc2MDwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTc2MCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNzYwIj4xNzYwPC9hPjwvdGQ+CisgICAgPHRkPmFjY2VwdGVkPC90ZD4KICAgICA8dGQ+QWNjZXNzIG9mIG1lbWJlciBjb3JyZXNwb25kaW5nIHRvIDxJPmluaXQtY2FwdHVyZTwvST48L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc2MSI+MTc2MTwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTc2MSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE3NjEiPjE3NjE8L2E+PC90ZD4KKyAgICA8dGQ+TkFEPC90ZD4KICAgICA8dGQ+UnVudGltZSBjaGVjayBvbiBzaXplIG9mIGF1dG9tYXRpYyBhcnJheTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzYyIj4xNzYyPC9hPjwvdGQ+Ci0gICAgPHRkPnJlYWR5PC90ZD4KKyAgPHRyIGlkPSIxNzYyIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3NjIiPjE3NjI8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5SZXNlcnZlZCBpZGVudGlmaWVyIHVzZWQgaW4gPEk+bGl0ZXJhbC1vcGVyYXRvci1pZDwvST4gZXhhbXBsZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTc2MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NjMiPjE3NjM8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkxlbmd0aCBtaXNtYXRjaCBpbiB0ZW1wbGF0ZSB0eXBlIGRlZHVjdGlvbjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc2NCI+MTc2NDwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTc2NCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNzY0Ij4xNzY0PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+SGlkaW5nIG9mIGZ1bmN0aW9uIGZyb20gdXNpbmctZGVjbGFyYXRpb24gYnkgc2lnbmF0dXJlPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NjUiPjE3NjU8L2E+PC90ZD4KLSAgICA8dGQ+cmVhZHk8L3RkPgorICA8dHIgaWQ9IjE3NjUiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTc2NSI+MTc2NTwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPk92ZXJmbG93IG9mIGVudW1lcmF0aW9uIHVzZWQgYXMgZW51bWVyYXRvciB2YWx1ZTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNzY2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc2NiI+MTc2NjwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KLSAgICA8dGQ+VmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlIG9mIHRoZSB2YWx1ZXMgb2YgYW4gZW51bWVyYXRpb248L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NjciPjE3Njc8L2E+PC90ZD4KICAgICA8dGQ+cmVhZHk8L3RkPgorICAgIDx0ZD5WYWx1ZXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIHZhbHVlcyBvZiBhbiBlbnVtZXJhdGlvbjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxNzY3Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3NjciPjE3Njc8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5TY29wZWQgZW51bWVyYXRpb24gaW4gYSA8VFQ+c3dpdGNoPC9UVD4gc3RhdGVtZW50PC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NjgiPjE3Njg8L2E+PC90ZD4KLSAgICA8dGQ+cmVhZHk8L3RkPgorICA8dHIgaWQ9IjE3NjgiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNzY4Ij4xNzY4PC9hPjwvdGQ+CisgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPlplcm8tZWxlbWVudCBhcnJheSBvZiBydW50aW1lIGJvdW5kPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzY5Ij4xNzY5PC9hPjwvdGQ+Ci0gICAgPHRkPnJldmlldzwvdGQ+CisgIDx0ciBpZD0iMTc2OSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNzY5Ij4xNzY5PC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+Q2F0Y2hpbmcgYSBiYXNlIGNsYXNzIG9mIHRoZSBleGNlcHRpb24gb2JqZWN0PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NzAiPjE3NzA8L2E+PC90ZD4KLSAgICA8dGQ+cmVhZHk8L3RkPgorICA8dHIgaWQ9IjE3NzAiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTc3MCI+MTc3MDwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPlR5cGUgbWF0Y2hpbmcgb2Ygbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhbmQgYXJndW1lbnRzPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzcxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc3MSI+MTc3MTwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+UmVzdHJpY3RlZCBsb29rdXAgaW4gPEk+bmVzdGVkLW5hbWUtc3BlY2lmaWVyPC9JPjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc3MiI+MTc3MjwvYT48L3RkPgotICAgIDx0ZD5yZWFkeTwvdGQ+CisgIDx0ciBpZD0iMTc3MiI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNzcyIj4xNzcyPC9hPjwvdGQ+CisgICAgPHRkPkRSPC90ZD4KICAgICA8dGQ+PFRUPl9fZnVuY19fPC9UVD4gaW4gYSBsYW1iZGEgYm9keTwvdGQ+CiAgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzczIj4xNzczPC9hPjwvdGQ+Ci0gICAgPHRkPnJlYWR5PC90ZD4KKyAgPHRyIGlkPSIxNzczIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3NzMiPjE3NzM8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5PdXQtb2YtbGlmZXRpbWUgbHZhbHVlLXRvLXJ2YWx1ZSBjb252ZXJzaW9uPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzc0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc3NCI+MTc3NDwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5EaXNjcmVwYW5jeSBiZXR3ZWVuIHN1Ym9iamVjdCBkZXN0cnVjdGlvbiBhbmQgc3RhY2sgdW53aW5kaW5nPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzc1Ij4xNzc1PC9hPjwvdGQ+Ci0gICAgPHRkPnJlYWR5PC90ZD4KKyAgPHRyIGlkPSIxNzc1Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3NzUiPjE3NzU8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5VbmRlZmluZWQgYmVoYXZpb3Igb2YgbGluZSBzcGxpY2UgaW4gcmF3IHN0cmluZyBsaXRlcmFsPC90ZD4KICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzc2Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc3NiI+MTc3NjwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+ZHJhZnRpbmc8L3RkPgogICAgIDx0ZD5SZXBsYWNlbWVudCBvZiBjbGFzcyBvYmplY3RzIGNvbnRhaW5pbmcgcmVmZXJlbmNlIG1lbWJlcnM8L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjE3NzciPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzc3Ij4xNzc3PC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgotICAgIDx0ZD5FbXB0eSBwYWNrIGV4cGFuc2lvbiBpbiA8ST5keW5hbWljLWV4Y2VwdGlvbi1zcGVjaWZpY2F0aW9uPC9JPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc3OCI+MTc3ODwvYT48L3RkPgogICAgIDx0ZD5yZWFkeTwvdGQ+CisgICAgPHRkPkVtcHR5IHBhY2sgZXhwYW5zaW9uIGluIDxJPmR5bmFtaWMtZXhjZXB0aW9uLXNwZWNpZmljYXRpb248L0k+PC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICA8L3RyPgorICA8dHIgaWQ9IjE3NzgiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTc3OCI+MTc3ODwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPjxJPmV4Y2VwdGlvbi1zcGVjaWZpY2F0aW9uPC9JPiBpbiBleHBsaWNpdGx5LWRlZmF1bHRlZCBmdW5jdGlvbnM8L3RkPgogICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTc3OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3NzkiPjE3Nzk8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+VHlwZSBkZXBlbmRlbmN5IG9mIDxUVD5fX2Z1bmNfXzwvVFQ+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgaWQ9IjE3ODAiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzgwIj4xNzgwPC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CiAgICAgPHRkPkV4cGxpY2l0IGluc3RhbnRpYXRpb24vc3BlY2lhbGl6YXRpb24gb2YgZ2VuZXJpYyBsYW1iZGEgPFRUPm9wZXJhdG9yKCk8L1RUPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTc4MSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3ODEiPjE3ODE8L2E+PC90ZD4KICAgICA8dGQ+b3BlbjwvdGQ+CiAgICAgPHRkPkNvbnZlcnRpbmcgZnJvbSA8VFQ+bnVsbHB0cl90PC9UVD4gdG8gPFRUPmJvb2w8L1RUPiBpbiBvdmVybG9hZCByZXNvbHV0aW9uPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNzgyIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc4MiI+MTc4MjwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5Gb3JtIG9mIGluaXRpYWxpemF0aW9uIGZvciA8VFQ+bnVsbHB0cl90PC9UVD4gdG8gPFRUPmJvb2w8L1RUPiBjb252ZXJzaW9uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzgzIj4xNzgzPC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICA8dHIgaWQ9IjE3ODMiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxNzgzIj4xNzgzPC9hPjwvdGQ+CisgICAgPHRkPk5BRDwvdGQ+CiAgICAgPHRkPldoeSBhcmUgdmlydHVhbCBkZXN0cnVjdG9ycyBub24tdHJpdmlhbD88L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE3ODQiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzg0Ij4xNzg0PC9hPjwvdGQ+CiAgICAgPHRkPmNvbmN1cnJlbmN5PC90ZD4KICAgICA8dGQ+Q29uY3VycmVudCBleGVjdXRpb24gZHVyaW5nIHN0YXRpYyBsb2NhbCBpbml0aWFsaXphdGlvbjwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE3ODUiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzg1Ij4xNzg1PC9hPjwvdGQ+Ci0gICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5kcmFmdGluZzwvdGQ+CiAgICAgPHRkPkNvbmZsaWN0aW5nIGRpYWdub3N0aWMgcmVxdWlyZW1lbnRzIGZvciB0ZW1wbGF0ZSBkZWZpbml0aW9uczwvdGQ+CiAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3ODYiPjE3ODY8L2E+PC90ZD4KLSAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICA8dHIgaWQ9IjE3ODYiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTc4NiI+MTc4NjwvYT48L3RkPgorICAgIDx0ZD5EUjwvdGQ+CiAgICAgPHRkPkVmZmVjdCBvZiBtZXJnaW5nIGFsbG9jYXRpb25zIG9uIG1lbW9yeSBsZWFrYWdlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzg3Ij4xNzg3PC9hPjwvdGQ+Ci0gICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgPHRyIGlkPSIxNzg3Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfZGVmZWN0cy5odG1sIzE3ODciPjE3ODc8L2E+PC90ZD4KKyAgICA8dGQ+RFI8L3RkPgogICAgIDx0ZD5VbmluaXRpYWxpemVkIDxUVD51bnNpZ25lZCBjaGFyPC9UVD4gdmFsdWVzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzg4Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc4OCI+MTc4ODwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+cmV2aWV3PC90ZD4KICAgICA8dGQ+U2l6ZWQgZGVhbGxvY2F0aW9uIG9mIGFycmF5IG9mIG5vbi1jbGFzcyB0eXBlPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTc4OSI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3ODkiPjE3ODk8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KICAgICA8dGQ+QXJyYXkgcmVmZXJlbmNlIHZzIGFycmF5IGRlY2F5IGluIG92ZXJsb2FkIHJlc29sdXRpb248L3RkPgogICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgogICA8L3RyPgotICA8dHIgY2xhc3M9Im9wZW4iPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzkwIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc5MCI+MTc5MDwvYT48L3RkPgogICAgIDx0ZD5vcGVuPC90ZD4KICAgICA8dGQ+RWxsaXBzaXMgZm9sbG93aW5nIGZ1bmN0aW9uIHBhcmFtZXRlciBwYWNrPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNzkxIj4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc5MSI+MTc5MTwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3QgcmVzdHJpY3Rpb25zIG9uIDxJPmN2LXF1YWxpZmllci1zZXE8L0k+IGFuZCA8ST5yZWYtcXVhbGlmaWVyPC9JPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc5MiI+MTc5MjwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgPHRyIGlkPSIxNzkyIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTc5MiI+MTc5MjwvYT48L3RkPgorICAgIDx0ZD5OQUQ8L3RkPgogICAgIDx0ZD5JbmNvcnJlY3QgZXhhbXBsZSBvZiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiBtZW1iZXIgZW51bWVyYXRpb248L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CiAgIDwvdHI+Ci0gIDx0ciBjbGFzcz0ib3BlbiI+CisgIDx0ciBpZD0iMTc5MyI+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3OTMiPjE3OTM8L2E+PC90ZD4KLSAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KICAgICA8dGQ+PFRUPnRocmVhZF9sb2NhbDwvVFQ+IGluIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KKyAgPHRyIGlkPSIxNzk0Ij4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc5NCI+MTc5NDwvYT48L3RkPgotICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgogICAgIDx0ZD48VFQ+dGVtcGxhdGU8L1RUPiBrZXl3b3JkIGFuZCBhbGlhcyB0ZW1wbGF0ZXM8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE3OTUiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzk1Ij4xNzk1PC9hPjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+RGlzYW1iaWd1YXRpbmcgPEk+b3JpZ2luYWwtbmFtZXNwYWNlLWRlZmluaXRpb248L0k+IGFuZCA8ST5leHRlbnNpb24tbmFtZXNwYWNlLWRlZmluaXRpb248L0k+PC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KLSAgPHRyIGNsYXNzPSJvcGVuIj4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTc5NSI+MTc5NTwvYT48L3RkPgorICA8dHIgaWQ9IjE3OTYiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxNzk2Ij4xNzk2PC9hPjwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KKyAgICA8dGQ+SXMgYWxsLWJpdHMtemVybyBmb3IgbnVsbCBjaGFyYWN0ZXJzIGEgbWVhbmluZ2Z1bCByZXF1aXJlbWVudD88L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgIDwvdHI+CisgIDx0ciBpZD0iMTc5NyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3OTciPjE3OTc8L2E+PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgorICAgIDx0ZD5BcmUgYWxsIGJpdCBwYXR0ZXJucyBvZiA8VFQ+dW5zaWduZWQgY2hhcjwvVFQ+IGRpc3RpbmN0IG51bWJlcnM/PC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxNzk4Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTc5OCI+MTc5ODwvYT48L3RkPgorICAgIDx0ZD5leHRlbnNpb248L3RkPgorICAgIDx0ZD48ST5leGNlcHRpb24tc3BlY2lmaWNhdGlvbjwvST5zIG9mIHRlbXBsYXRlIGFyZ3VtZW50czwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBpZD0iMTc5OSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE3OTkiPjE3OTk8L2E+PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgorICAgIDx0ZD48VFQ+bXV0YWJsZTwvVFQ+IGFuZCBub24tZXhwbGljaXQgY29uc3QgcXVhbGlmaWNhdGlvbjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxODAwIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgwMCI+MTgwMDwvYT48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CisgICAgPHRkPlBvaW50ZXIgdG8gbWVtYmVyIG9mIG5lc3RlZCBhbm9ueW1vdXMgdW5pb248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4MDEiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODAxIj4xODAxPC9hPjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+S2luZCBvZiBleHByZXNzaW9uIHJlZmVycmluZyB0byBtZW1iZXIgb2YgYW5vbnltb3VzIHVuaW9uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxODAyIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgwMiI+MTgwMjwvYT48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CisgICAgPHRkPjxUVD5jaGFyMTZfdDwvVFQ+IHN0cmluZyBsaXRlcmFscyBhbmQgc3Vycm9nYXRlIHBhaXJzPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODAzIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgwMyI+MTgwMzwvYT48L3RkPgorICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPjxJPm9wYXF1ZS1lbnVtLWRlY2xhcmF0aW9uPC9JPiBhcyA8ST5tZW1iZXItZGVjbGFyYXRpb248L0k+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxODA0Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgwNCI+MTgwNDwvYT48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CisgICAgPHRkPlBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYW5kIGZyaWVuZHNoaXA8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgIDwvdHI+CisgIDx0ciBpZD0iMTgwNSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4MDUiPjE4MDU8L2E+PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgorICAgIDx0ZD5Db252ZXJzaW9ucyBvZiBhcnJheSBvcGVyYW5kcyBpbiA8ST5jb25kaXRpb25hbC1leHByZXNzaW9uPC9JPnM8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4MDYiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODA2Ij4xODA2PC9hPjwvdGQ+CisgICAgPHRkPnJldmlldzwvdGQ+CisgICAgPHRkPlZpcnR1YWwgYmFzZXMgYW5kIG1vdmUtYXNzaWdubWVudDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBpZD0iMTgwNyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4MDciPjE4MDc8L2E+PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgorICAgIDx0ZD5PcmRlciBvZiBkZXN0cnVjdGlvbiBvZiBhcnJheSBlbGVtZW50cyBhZnRlciBhbiBleGNlcHRpb248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4MDgiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODA4Ij4xODA4PC9hPjwvdGQ+CiAgICAgPHRkPm9wZW48L3RkPgotICAgIDx0ZD5EaXNhbWJpZ3VhdGluZyA8ST5vcmlnaW5hbC1uYW1lc3BhY2UtZGVmaW5pdGlvbjwvST4gYW5kIDxJPmV4dGVuc2lvbi1uYW1lc3BhY2UtZGVmaW5pdGlvbjwvST48L3RkPgorICAgIDx0ZD5Db25zdHJ1Y3RvciB0ZW1wbGF0ZXMgdnMgZGVmYXVsdCBjb25zdHJ1Y3RvcnM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgaWQ9IjE4MDkiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODA5Ij4xODA5PC9hPjwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KKyAgICA8dGQ+TmFycm93aW5nIGFuZCB0ZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb248L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgIDwvdHI+CisgIDx0ciBpZD0iMTgxMCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4MTAiPjE4MTA8L2E+PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgorICAgIDx0ZD5JbnZhbGlkIDxJPnVkLXN1ZmZpeDwvST5lczwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxODExIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgxMSI+MTgxMTwvYT48L3RkPgorICAgIDx0ZD50ZW50YXRpdmVseSByZWFkeTwvdGQ+CisgICAgPHRkPkxvb2t1cCBvZiBkZWFsbG9jYXRpb24gZnVuY3Rpb24gaW4gYSB2aXJ0dWFsIGRlc3RydWN0b3IgZGVmaW5pdGlvbjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxODEyIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgxMiI+MTgxMjwvYT48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CisgICAgPHRkPk9taXNzaW9uIG9mIDxUVD50ZW1wbGF0ZTwvVFQ+IGluIGEgPEk+dHlwZW5hbWUtc3BlY2lmaWVyPC9JPjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTgxMyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4MTMiPjE4MTM8L2E+PC90ZD4KKyAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICAgIDx0ZD5EaXJlY3QgdnMgaW5kaXJlY3QgYmFzZXMgaW4gc3RhbmRhcmQtbGF5b3V0IGNsYXNzZXM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgaWQ9IjE4MTQiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODE0Ij4xODE0PC9hPjwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KKyAgICA8dGQ+RGVmYXVsdCBhcmd1bWVudHMgaW4gPEk+bGFtYmRhLWV4cHJlc3Npb248L0k+czwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTgxNSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4MTUiPjE4MTU8L2E+PC90ZD4KKyAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICAgIDx0ZD5MaWZldGltZSBleHRlbnNpb24gaW4gYWdncmVnYXRlIGluaXRpYWxpemF0aW9uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxODE2Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgxNiI+MTgxNjwvYT48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CisgICAgPHRkPlVuY2xlYXIgc3BlY2lmaWNhdGlvbiBvZiBiaXQtZmllbGQgdmFsdWVzPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICA8L3RyPgorICA8dHIgaWQ9IjE4MTciPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODE3Ij4xODE3PC9hPjwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KKyAgICA8dGQ+TGlua2FnZSBzcGVjaWZpY2F0aW9ucyBhbmQgbmVzdGVkIHNjb3BlczwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTgxOCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4MTgiPjE4MTg8L2E+PC90ZD4KKyAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPlZpc2liaWxpdHkgYW5kIGluaGVyaXRlZCBsYW5ndWFnZSBsaW5rYWdlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTgxOSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4MTkiPjE4MTk8L2E+PC90ZD4KKyAgICA8dGQ+cmV2aWV3PC90ZD4KKyAgICA8dGQ+QWNjZXB0YWJsZSBzY29wZXMgZm9yIGRlZmluaXRpb24gb2YgcGFydGlhbCBzcGVjaWFsaXphdGlvbjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4MjAiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODIwIj4xODIwPC9hPjwvdGQ+CisgICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5RdWFsaWZpZWQgdHlwZWRlZiBuYW1lczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4MjEiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODIxIj4xODIxPC9hPjwvdGQ+CisgICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5RdWFsaWZpZWQgcmVkZWNsYXJhdGlvbnMgaW4gYSBjbGFzcyA8ST5tZW1iZXItc3BlY2lmaWNhdGlvbjwvST48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODIyIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgyMiI+MTgyMjwvYT48L3RkPgorICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+TG9va3VwIG9mIHBhcmFtZXRlciBuYW1lcyBpbiA8ST5sYW1iZGEtZXhwcmVzc2lvbjwvST5zPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTgyMyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4MjMiPjE4MjM8L2E+PC90ZD4KKyAgICA8dGQ+cmV2aWV3PC90ZD4KKyAgICA8dGQ+U3RyaW5nIGxpdGVyYWwgdW5pcXVlbmVzcyBpbiBpbmxpbmUgZnVuY3Rpb25zPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxODI0Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgyNCI+MTgyNDwvYT48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CisgICAgPHRkPkNvbXBsZXRlbmVzcyBvZiByZXR1cm4gdHlwZSB2cyBwb2ludCBvZiBpbnN0YW50aWF0aW9uPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODI1Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgyNSI+MTgyNTwvYT48L3RkPgorICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPlBhcnRpYWwgb3JkZXJpbmcgYmV0d2VlbiB2YXJpYWRpYyBhbmQgbm9uLXZhcmlhZGljIGZ1bmN0aW9uIHRlbXBsYXRlczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4MjYiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19jbG9zZWQuaHRtbCMxODI2Ij4xODI2PC9hPjwvdGQ+CisgICAgPHRkPmV4dGVuc2lvbjwvdGQ+CisgICAgPHRkPjxUVD5jb25zdDwvVFQ+IGZsb2F0aW5nLXBvaW50IGluIGNvbnN0YW50IGV4cHJlc3Npb25zPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTgyNyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4MjciPjE4Mjc8L2E+PC90ZD4KKyAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICAgIDx0ZD5SZWZlcmVuY2UgYmluZGluZyB3aXRoIGFtYmlndW91cyBjb252ZXJzaW9uczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4MjgiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODI4Ij4xODI4PC9hPjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+PEk+bmVzdGVkLW5hbWUtc3BlY2lmaWVyPC9JPiBhbWJpZ3VpdHk8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODI5Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgyOSI+MTgyOTwvYT48L3RkPgorICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+RGVwZW5kZW50IHVubmFtZWQgdHlwZXM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgaWQ9IjE4MzAiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODMwIj4xODMwPC9hPjwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KKyAgICA8dGQ+UmVwZWF0ZWQgc3BlY2lmaWVyczwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxODMxIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfY2xvc2VkLmh0bWwjMTgzMSI+MTgzMTwvYT48L3RkPgorICAgIDx0ZD5OQUQ8L3RkPgorICAgIDx0ZD5FeHBsaWNpdGx5IHZzIGltcGxpY2l0bHkgZGVsZXRlZCBtb3ZlIGNvbnN0cnVjdG9yczwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxODMyIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgzMiI+MTgzMjwvYT48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CisgICAgPHRkPkNhc3RpbmcgdG8gaW5jb21wbGV0ZSBlbnVtZXJhdGlvbjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTgzMyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2Nsb3NlZC5odG1sIzE4MzMiPjE4MzM8L2E+PC90ZD4KKyAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQ+PFRUPmZyaWVuZDwvVFQ+IGRlY2xhcmF0aW9ucyBuYW1pbmcgaW1wbGljaXRseS1kZWNsYXJlZCBtZW1iZXIgZnVuY3Rpb25zPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxODM0Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgzNCI+MTgzNDwvYT48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CisgICAgPHRkPkNvbnN0YW50IGluaXRpYWxpemF0aW9uIGJpbmRpbmcgYSByZWZlcmVuY2UgdG8gYW4geHZhbHVlPC90ZD4KKyAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPlVua25vd248L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODM1Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgzNSI+MTgzNTwvYT48L3RkPgorICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPkRlcGVuZGVudCBtZW1iZXIgbG9va3VwIGJlZm9yZSA8VFQ+Jmx0OzwvVFQ+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTgzNiI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4MzYiPjE4MzY8L2E+PC90ZD4KKyAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICAgIDx0ZD5Vc2Ugb2YgY2xhc3MgdHlwZSBiZWluZyBkZWZpbmVkIGluIDxJPnRyYWlsaW5nLXJldHVybi10eXBlPC9JPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4MzciPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODM3Ij4xODM3PC9hPjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+VXNlIG9mIDxUVD50aGlzPC9UVD4gaW4gPFRUPmZyaWVuZDwvVFQ+IGFuZCBsb2NhbCBjbGFzcyBkZWNsYXJhdGlvbnM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODM4Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTgzOCI+MTgzODwvYT48L3RkPgorICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPkRlZmluaXRpb24gdmlhIDxJPnVucXVhbGlmaWVkLWlkPC9JPiBhbmQgPEk+dXNpbmctZGVjbGFyYXRpb248L0k+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTgzOSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4MzkiPjE4Mzk8L2E+PC90ZD4KKyAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICAgIDx0ZD5Mb29rdXAgb2YgYmxvY2stc2NvcGUgPFRUPmV4dGVybjwvVFQ+IGRlY2xhcmF0aW9uczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4NDAiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODQwIj4xODQwPC9hPjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+Tm9uLWRlbGV0ZWQgZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gb2YgZGVsZXRlZCBmdW5jdGlvbiB0ZW1wbGF0ZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4NDEiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODQxIj4xODQxPC9hPjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+PFRUPiZsdDs8L1RUPiBmb2xsb3dpbmcgdGVtcGxhdGUgaW5qZWN0ZWQtY2xhc3MtbmFtZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4NDIiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODQyIj4xODQyPC9hPjwvdGQ+CisgICAgPHRkPmNvbmN1cnJlbmN5PC90ZD4KKyAgICA8dGQ+VW5ldmFsdWF0ZWQgb3BlcmFuZHMgYW5kICYjODIyMDtjYXJyaWVzIGEgZGVwZW5kZW5jeSYjODIyMTs8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgaWQ9IjE4NDMiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODQzIj4xODQzPC9hPjwvdGQ+CisgICAgPHRkPnJlYWR5PC90ZD4KKyAgICA8dGQ+Qml0LWZpZWxkIGluIGNvbmRpdGlvbmFsIG9wZXJhdG9yIHdpdGggPFRUPnRocm93PC9UVD4gb3BlcmFuZDwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTg0NCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4NDQiPjE4NDQ8L2E+PC90ZD4KKyAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICAgIDx0ZD5EZWZpbmluZyAmIzgyMjA7aW1tZWRpYXRlIGNvbnRleHQmIzgyMjE7PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTg0NSI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4NDUiPjE4NDU8L2E+PC90ZD4KKyAgICA8dGQ+ZHJhZnRpbmc8L3RkPgorICAgIDx0ZD5Qb2ludCBvZiBpbnN0YW50aWF0aW9uIG9mIGEgdmFyaWFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb248L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODQ2Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTg0NiI+MTg0NjwvYT48L3RkPgorICAgIDx0ZD5yZXZpZXc8L3RkPgorICAgIDx0ZD5EZWNsYXJpbmcgZXhwbGljaXRseS1kZWZhdWx0ZWQgaW1wbGljaXRseS1kZWxldGVkIGZ1bmN0aW9uczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4NDciPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODQ3Ij4xODQ3PC9hPjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+Q2xhcmlmeWluZyBjb21wYXRpYmlsaXR5IGR1cmluZyBwYXJ0aWFsIG9yZGVyaW5nPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTg0OCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4NDgiPjE4NDg8L2E+PC90ZD4KKyAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPlBhcmVudGhlc2l6ZWQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgZGVjbGFyYXRvcnM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODQ5Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTg0OSI+MTg0OTwvYT48L3RkPgorICAgIDx0ZD5kcmFmdGluZzwvdGQ+CisgICAgPHRkPlZhcmlhYmxlIHRlbXBsYXRlcyBhbmQgdGhlIE9EUjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBpZD0iMTg1MCI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4NTAiPjE4NTA8L2E+PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgorICAgIDx0ZD5EaWZmZXJlbmNlcyBiZXR3ZWVuIGRlZmluaXRpb24gY29udGV4dCBhbmQgcG9pbnQgb2YgaW5zdGFudGlhdGlvbjwvdGQ+CisgICAgPHRkIGNsYXNzPSJub25lIiBhbGlnbj0iY2VudGVyIj5Vbmtub3duPC90ZD4KKyAgPC90cj4KKyAgPHRyIGlkPSIxODUxIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTg1MSI+MTg1MTwvYT48L3RkPgorICAgIDx0ZD5yZWFkeTwvdGQ+CisgICAgPHRkPjxUVD5kZWNsdHlwZShhdXRvKTwvVFQ+IGluIDxJPm5ldy1leHByZXNzaW9uPC9JPnM8L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgIDwvdHI+CisgIDx0ciBpZD0iMTg1MiI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4NTIiPjE4NTI8L2E+PC90ZD4KKyAgICA8dGQ+cmVhZHk8L3RkPgorICAgIDx0ZD5Xb3JkaW5nIGlzc3VlcyByZWdhcmRpbmcgPFRUPmRlY2x0eXBlKGF1dG8pPC9UVD48L3RkPgorICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+VW5rbm93bjwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4NTMiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODUzIj4xODUzPC9hPjwvdGQ+CisgICAgPHRkPmRyYWZ0aW5nPC90ZD4KKyAgICA8dGQ+RGVmaW5pbmcgJiM4MjIwO2FsbG9jYXRlZCBzdG9yYWdlJiM4MjIxOzwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4NTQiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODU0Ij4xODU0PC9hPjwvdGQ+CisgICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5EaXNhbGxvd2luZyB1c2Ugb2YgaW1wbGljaXRseS1kZWxldGVkIGZ1bmN0aW9uczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4NTUiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODU1Ij4xODU1PC9hPjwvdGQ+CisgICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5PdXQtb2YtbGlmZXRpbWUgYWNjZXNzIHRvIG5vbnN0YXRpYyBkYXRhIG1lbWJlcnM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODU2Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTg1NiI+MTg1NjwvYT48L3RkPgorICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+SW5kaXJlY3QgbmVzdGVkIGNsYXNzZXMgb2YgY2xhc3MgdGVtcGxhdGVzPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KKyAgPC90cj4KKyAgPHRyIGNsYXNzPSJvcGVuIiBpZD0iMTg1NyI+CisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvY3dnX2FjdGl2ZS5odG1sIzE4NTciPjE4NTc8L2E+PC90ZD4KKyAgICA8dGQ+b3BlbjwvdGQ+CisgICAgPHRkPkFkZGl0aW9uYWwgcXVlc3Rpb25zIGFib3V0IGJpdHM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODU4Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTg1OCI+MTg1ODwvYT48L3RkPgorICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+Q29tcGFyaW5nIHBvaW50ZXJzIHRvIHVuaW9uIG1lbWJlcnM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODU5Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTg1OSI+MTg1OTwvYT48L3RkPgorICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+VVRGLTE2IGluIDxUVD5jaGFyMTZfdDwvVFQ+IHN0cmluZyBsaXRlcmFsczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4NjAiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODYwIj4xODYwPC9hPjwvdGQ+CisgICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5XaGF0IGlzIGEgJiM4MjIwO2RpcmVjdCBtZW1iZXI/JiM4MjIxOzwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4NjEiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODYxIj4xODYxPC9hPjwvdGQ+CisgICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5WYWx1ZXMgb2YgYSBiaXQtZmllbGQ8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODYyIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTg2MiI+MTg2MjwvYT48L3RkPgorICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+RGV0ZXJtaW5pbmcgJiM4MjIwO2NvcnJlc3BvbmRpbmcgbWVtYmVycyYjODIyMTsgZm9yIGZyaWVuZHNoaXA8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODYzIj4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTg2MyI+MTg2MzwvYT48L3RkPgorICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+UmVxdWlyZW1lbnRzIG9uIHRocm93biBvYmplY3QgdHlwZSB0byBzdXBwb3J0IDxUVD5zdGQ6OmN1cnJlbnRfZXhjZXB0aW9uKCk8L1RUPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vdCByZXNvbHZlZDwvdGQ+CisgIDwvdHI+CisgIDx0ciBjbGFzcz0ib3BlbiIgaWQ9IjE4NjQiPgorICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19hY3RpdmUuaHRtbCMxODY0Ij4xODY0PC9hPjwvdGQ+CisgICAgPHRkPm9wZW48L3RkPgorICAgIDx0ZD5MaXN0LWluaXRpYWxpemF0aW9uIG9mIGFycmF5IG9iamVjdHM8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Ob3QgcmVzb2x2ZWQ8L3RkPgorICA8L3RyPgorICA8dHIgY2xhc3M9Im9wZW4iIGlkPSIxODY1Ij4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9jd2dfYWN0aXZlLmh0bWwjMTg2NSI+MTg2NTwvYT48L3RkPgorICAgIDx0ZD5vcGVuPC90ZD4KKyAgICA8dGQ+UG9pbnRlciBhcml0aG1ldGljIGFuZCBtdWx0aS1sZXZlbCBxdWFsaWZpY2F0aW9uIGNvbnZlcnNpb25zPC90ZD4KICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm90IHJlc29sdmVkPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CmRpZmYgLS1naXQgYS93d3cvY3h4X3N0YXR1cy5odG1sIGIvd3d3L2N4eF9zdGF0dXMuaHRtbAppbmRleCBlYzgyM2Y3Li4wODQ5YmJjIDEwMDY0NAotLS0gYS93d3cvY3h4X3N0YXR1cy5odG1sCisrKyBiL3d3dy9jeHhfc3RhdHVzLmh0bWwKQEAgLTMsNyArMyw3IEBACiA8aHRtbD4KIDxoZWFkPgogICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLSAgPHRpdGxlPkNsYW5nIC0gQysrOTgsIEMrKzExLCBhbmQgQysrMTQgU3RhdHVzPC90aXRsZT4KKyAgPHRpdGxlPkNsYW5nIC0gQysrMTQsIEMrKzExIGFuZCBDKys5OCBTdGF0dXM8L3RpdGxlPgogICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJtZW51LmNzcyI+CiAgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNvbnRlbnQuY3NzIj4KICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KQEAgLTIzLDE4ICsyMywzMiBAQAogPGRpdiBpZD0iY29udGVudCI+CiAKIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+Ci08aDE+QysrOTgsIEMrKzExLCBhbmQgQysrMTQgU3VwcG9ydCBpbiBDbGFuZzwvaDE+Cis8aDE+QysrMTQsIEMrKzExIGFuZCBDKys5OCBTdXBwb3J0IGluIENsYW5nPC9oMT4KIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CiA8cD5MYXN0IHVwZGF0ZWQ6ICREYXRlJDwvcD4KIAorPHA+Q2xhbmcgZnVsbHkgaW1wbGVtZW50cyBhbGwgcHVibGlzaGVkIElTTyBDKysgc3RhbmRhcmRzIGluY2x1ZGluZyA8YQoraHJlZj0iI2N4eDExIj5DKysxMTwvYT4sIGFzIHdlbGwgYXMgdGhlIHVwY29taW5nIHN0YW5kYXJkIHByb3Zpc2lvbmFsbHkgbmFtZWQgPGEKK2hyZWY9IiNjeHgxNCI+QysrMTQ8L2E+LCBhbmQgaXMgY29uc2lkZXJlZCBhIHByb2R1Y3Rpb24tcXVhbGl0eSBDKysgY29tcGlsZXIuCisKKzxwPlRoZSBDbGFuZyBjb21tdW5pdHkgaXMgY29udGludWFsbHkgc3RyaXZpbmcgdG8gaW1wcm92ZSBDKysgc3RhbmRhcmRzCitjb21wbGlhbmNlIGJldHdlZW4gcmVsZWFzZXMgYnkgc3VibWl0dGluZyBhbmQgdHJhY2tpbmcgPGEKK2hyZWY9ImN4eF9kcl9zdGF0dXMuaHRtbCI+QysrIERlZmVjdCBSZXBvcnRzPC9hPiBhbmQgaW1wbGVtZW50aW5nIHJlc29sdXRpb25zCithcyB0aGV5IGJlY29tZSBhdmFpbGFibGUuPC9wPgorCis8cD5FeHBlcmltZW50YWwgd29yayBpcyBhbHNvIHVuZGVyIHdheSB0byBpbXBsZW1lbnQgPGEgaHJlZj0iI3RzIj5DKysgVGVjaG5pY2FsCitTcGVjaWZpY2F0aW9uczwvYT4gdGhhdCB3aWxsIGhlbHAgZHJpdmUgdGhlIGZ1dHVyZSBvZiB0aGUgQysrIHByb2dyYW1taW5nCitsYW5ndWFnZS48L3A+CisKKzxwPlRoZSA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvYnVncy8iPkxMVk0gYnVnIHRyYWNrZXI8L2E+IGNvbnRhaW5zIENsYW5nCitDKysgY29tcG9uZW50cyB0aGF0IHRyYWNrIGtub3duIGJ1Z3Mgd2l0aCBDbGFuZydzIGxhbmd1YWdlIGNvbmZvcm1hbmNlIGluCitlYWNoIGxhbmd1YWdlIG1vZGUuPC9wPgorCiA8aDIgaWQ9ImN4eDk4Ij5DKys5OCBpbXBsZW1lbnRhdGlvbiBzdGF0dXM8L2gyPgogCi08cD5DbGFuZyBjdXJyZW50bHkgaW1wbGVtZW50cyBhbGwgb2YgdGhlIElTTyBDKysgMTk5OCBzdGFuZGFyZAorPHA+Q2xhbmcgaW1wbGVtZW50cyBhbGwgb2YgdGhlIElTTyBDKysgMTk5OCBzdGFuZGFyZAogICAoaW5jbHVkaW5nIHRoZSBkZWZlY3RzIGFkZHJlc3NlZCBpbiB0aGUgSVNPIEMrKyAyMDAzIHN0YW5kYXJkKQotICBleGNlcHQgZm9yIDx0dD5leHBvcnQ8L3R0PiAod2hpY2ggaGFzIGJlZW4gcmVtb3ZlZCBpbiBDKysxMSkKLSAgYW5kIGlzIGNvbnNpZGVyZWQgYSBwcm9kdWN0aW9uLXF1YWxpdHkgQysrIGNvbXBpbGVyLiAgVGhlIDxhCi0gICBocmVmPSJodHRwOi8vbGx2bS5vcmcvYnVncy8iPkxMVk0gYnVnIHRyYWNrZXI8L2E+IGNvbnRhaW5zIGEgQ2xhbmcKLSAgQysrIGNvbXBvbmVudCB0aGF0IHRyYWNrcyBrbm93biBDbGFuZyBDKysgYnVncy48L3A+CisgIGV4Y2VwdCBmb3IgPHR0PmV4cG9ydDwvdHQ+ICh3aGljaCBoYXMgYmVlbiByZW1vdmVkIGluIEMrKzExKS4KIAogPGgyIGlkPSJjeHgxMSI+QysrMTEgaW1wbGVtZW50YXRpb24gc3RhdHVzPC9oMj4KIApAQCAtNTIsNyArNjYsNyBAQAogPGEgaHJlZj0ibGlic3RkYysrNC42LWNsYW5nMTEucGF0Y2giPmxpYnN0ZGMrKy00LjY8L2E+CiBhbmQgPGEgaHJlZj0ibGlic3RkYysrNC43LWNsYW5nMTEucGF0Y2giPmxpYnN0ZGMrKy00Ljc8L2E+IHdvcmsgd2l0aCBDbGFuZwogcmVsZWFzZXMgcHJpb3IgdG8gdmVyc2lvbiAzLjIgaW4gQysrMTEgbW9kZS4gPHR0PnRocmVhZF9sb2NhbDwvdHQ+IHN1cHBvcnQKLWN1cnJlbnRseSByZXF1aXJlcyBnKystNC44J3MgQysrIHJ1bnRpbWUgbGlicmFyeS48L3A+CitjdXJyZW50bHkgcmVxdWlyZXMgdGhlIEMrKyBydW50aW1lIGxpYnJhcnkgZnJvbSBnKystNC44IG9yIGxhdGVyLjwvcD4KIAogPHRhYmxlIHdpZHRoPSI2ODkiIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiPgogIDx0cj4KQEAgLTE3Nyw3ICsxOTEsNyBAQAogICAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5DbGFuZyAzLjE8L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkPkdlbmVyYWxpemVkIGF0dHJpYnV0ZXM8L3RkPgorICAgICAgPHRkPlN0YW5kYXJkaXplZCBhdHRyaWJ1dGUgc3ludGF4PC90ZD4KICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDA4L24yNzYxLnBkZiI+TjI3NjE8L2E+PC90ZD4KICAgICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+Q2xhbmcgMy4zIDxhIGhyZWY9IiNuMjc2MSI+KDEpPC9hPjwvdGQ+CiAgICAgPC90cj4KQEAgLTE5MSw4ICsyMDUsMTYgQEAKICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDA3L24yMzQxLnBkZiI+TjIzNDE8L2E+PC90ZD4KICAgICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+Q2xhbmcgMy4zPC90ZD4KICAgICA8L3RyPgotICAgIDwhLS0gU2tpcHBlZCBOMTYyNzogQ29uZGl0aW9uYWxseS1zdXBwb3J0IGJlaGF2aW9yIC0tPgotICAgIDwhLS0gU2tpcHBlZCBOMTcyNzogQ2hhbmdpbmcgVW5kZWZpbmVkIEJlaGF2aW9yIGludG8gRGlhZ25vc2FibGUgRXJyb3JzIC0tPgorICAgIDx0cj4KKyAgICAgIDx0ZD5Db25kaXRpb25hbGx5LXN1cHBvcnQgYmVoYXZpb3I8L3RkPgorICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMDQvbjE2MjcucGRmIj5OMTYyNzwvYT48L3RkPgorICAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5DbGFuZyAyLjk8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPkNoYW5naW5nIHVuZGVmaW5lZCBiZWhhdmlvciBpbnRvIGRpYWdub3NhYmxlIGVycm9yczwvdGQ+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAwNC9uMTcyNy5wZGYiPk4xNzI3PC9hPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkNsYW5nIDIuOTwvdGQ+CisgICAgPC90cj4KICAgICA8dHI+CiAgICAgICA8dGQ+RGVsZWdhdGluZyBjb25zdHJ1Y3RvcnM8L3RkPgogICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMDYvbjE5ODYucGRmIj5OMTk4NjwvYT48L3RkPgpAQCAtMjg5LDcgKzMxMSw3IEBACiAgICAgPHRyPgogICAgICAgPHRkPk1pbmltYWwgc3VwcG9ydCBmb3IgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCByZWFjaGFiaWxpdHktYmFzZWQgbGVhayBkZXRlY3Rpb248L3RkPgogICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMDgvbjI2NzAuaHRtIj5OMjY3MDwvYT48L3RkPgotICAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQSA8YSBocmVmPSIjbjI2NzAiPigyKTwvYT48L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgogICAgICAgPHRkPkFsbG93aW5nIG1vdmUgY29uc3RydWN0b3JzIHRvIHRocm93IFtub2V4Y2VwdF08L3RkPgpAQCAtMzE4LDcgKzM0MCw3IEBACiAgICAgPHRyPgogICAgICAgPHRkPlN0cm9uZyBDb21wYXJlIGFuZCBFeGNoYW5nZTwvdGQ+CiAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAwOC9uMjc0OC5odG1sIj5OMjc0ODwvYT48L3RkPgotICAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5DbGFuZyAzLjEgPGEgaHJlZj0iI24yNzQ4Ij4oMik8L2E+PC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+Q2xhbmcgMy4xIDxhIGhyZWY9IiNuMjc0OCI+KDMpPC9hPjwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+CiAgICAgICA8dGQ+QmlkaXJlY3Rpb25hbCBGZW5jZXM8L3RkPgpAQCAtMzM0LDcgKzM1Niw3IEBACiAgICAgPHRyPgogICAgICAgPHRkPkRhdGEtZGVwZW5kZW5jeSBvcmRlcmluZzogYXRvbWljcyBhbmQgbWVtb3J5IG1vZGVsPC90ZD4KICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDA4L24yNjY0Lmh0bSI+TjI2NjQ8L2E+PC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+Q2xhbmcgMy4yIDxhIGhyZWY9IiNuMjY2NCI+KDMpPC9hPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkNsYW5nIDMuMiA8YSBocmVmPSIjbjI2NjQiPig0KTwvYT48L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgogICAgICAgPHRkPlByb3BhZ2F0aW5nIGV4Y2VwdGlvbnM8L3RkPgpAQCAtMzQyLDExICszNjQsNiBAQAogICAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5DbGFuZyAyLjk8L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkPkFiYW5kb25pbmcgYSBwcm9jZXNzIGFuZCBhdF9xdWlja19leGl0PC90ZD4KLSAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDA3L24yNDQwLmh0bSI+TjI0NDA8L2E+PC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+CiAgICAgICA8dGQ+QWxsb3cgYXRvbWljcyB1c2UgaW4gc2lnbmFsIGhhbmRsZXJzPC90ZD4KICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDA4L24yNTQ3Lmh0bSI+TjI1NDc8L2E+PC90ZD4KICAgICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+Q2xhbmcgMy4xPC90ZD4KQEAgLTM4MywyMCArNDAwLDI0IEBACiAgICAgPHRyPgogICAgICAgPHRkPkV4dGVuZGVkIGludGVncmFsIHR5cGVzPC90ZD4KICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDA2L24xOTg4LnBkZiI+TjE5ODg8L2E+PC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0ibmEiIGFsaWduPSJjZW50ZXIiPk4vQSA8YSBocmVmPSIjbjE5ODgiPig0KTwvYT48L3RkPgorICAgICAgPHRkIGNsYXNzPSJuYSIgYWxpZ249ImNlbnRlciI+Ti9BIDxhIGhyZWY9IiNuMTk4OCI+KDUpPC9hPjwvdGQ+CiAgICAgPC90cj4KIDwvdGFibGU+CiAKIDxwPgogPHNwYW4gaWQ9Im4yNzYxIj4oMSk6IFRoZSA8Y29kZT5bW2NhcnJpZXNfZGVwZW5kZW5jeV1dPC9jb2RlPiBhdHRyaWJ1dGUKIGhhcyBubyBlZmZlY3QuPC9zcGFuPjxicj4KLTxzcGFuIGlkPSJuMjc0OCI+KDIpOiBBbGwgY29tcGFyZS1leGNoYW5nZSBvcGVyYXRpb25zIGFyZSBlbWl0dGVkIGFzCis8c3BhbiBpZD0ibjI2NzAiPigyKTogTm8gY29tcGlsZXIgY2hhbmdlcyBhcmUgcmVxdWlyZWQgZm9yIGFuIGltcGxlbWVudGF0aW9uCitzdWNoIGFzIENsYW5nIHRoYXQgZG9lcyBub3QgcHJvdmlkZSBnYXJiYWdlIGNvbGxlY3Rpb24uPC9zcGFuPjxicj4KKzxzcGFuIGlkPSJuMjc0OCI+KDMpOiBBbGwgY29tcGFyZS1leGNoYW5nZSBvcGVyYXRpb25zIGFyZSBlbWl0dGVkIGFzCiBzdHJvbmcgY29tcGFyZS1leGNoYW5nZXMuPC9zcGFuPjxicj4KLTxzcGFuIGlkPSJuMjY2NCI+KDMpOiA8Y29kZT5tZW1vcnlfb3JkZXJfY29uc3VtZTwvY29kZT4gaXMgbG93ZXJlZCB0bworPHNwYW4gaWQ9Im4yNjY0Ij4oNCk6IDxjb2RlPm1lbW9yeV9vcmRlcl9jb25zdW1lPC9jb2RlPiBpcyBsb3dlcmVkIHRvCiA8Y29kZT5tZW1vcnlfb3JkZXJfYWNxdWlyZTwvY29kZT4uPC9zcGFuPjxicj4KLTxzcGFuIGlkPSJuMTk4OCI+KDQpOiA8Y29kZT5fX2ludDEyODwvY29kZT4gaXMgbm90IHRyZWF0ZWQgYXMgYW4gZXh0ZW5kZWQKLWludGVnZXIgdHlwZSwgYmVjYXVzZSBjaGFuZ2luZyA8Y29kZT5pbnRtYXhfdDwvY29kZT4gd291bGQgYmUgYW4KLUFCSS1pbmNvbXBhdGlibGUgY2hhbmdlLjwvc3Bhbj4KKzxzcGFuIGlkPSJuMTk4OCI+KDUpOiBObyBjb21waWxlciBjaGFuZ2VzIGFyZSByZXF1aXJlZCBmb3IgYW4gaW1wbGVtZW50YXRpb24KK3N1Y2ggYXMgQ2xhbmcgdGhhdCBkb2VzIG5vdCBwcm92aWRlIGFueSBleHRlbmRlZCBpbnRlZ2VyIHR5cGVzLgorPGNvZGU+X19pbnQxMjg8L2NvZGU+IGlzIG5vdCB0cmVhdGVkIGFzIGFuIGV4dGVuZGVkIGludGVnZXIgdHlwZSwKK2JlY2F1c2UgY2hhbmdpbmcgPGNvZGU+aW50bWF4X3Q8L2NvZGU+IHdvdWxkIGJlIGFuIEFCSS1pbmNvbXBhdGlibGUKK2NoYW5nZS48L3NwYW4+CiA8L3A+CiAKIDxoMiBpZD0iY3h4MTQiPkMrKzF5IGltcGxlbWVudGF0aW9uIHN0YXR1czwvaDI+CkBAIC00MTcsNyArNDM4LDcgQEAKICAgICA8dHI+CiAgICAgICA8dGQ+VHdlYWsgdG8gY2VydGFpbiBDKysgY29udGV4dHVhbCBjb252ZXJzaW9uczwvdGQ+CiAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAxMi9uMzMyMy5wZGYiPk4zMzIzPC9hPjwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9InN2biIgYWxpZ249ImNlbnRlciI+U1ZOPC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+Q2xhbmcgMy40PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KICAgICAgIDx0ZD5CaW5hcnkgbGl0ZXJhbHM8L3RkPgpAQCAtNDMxLDI3ICs0NTIsMjcgQEAKICAgICA8L3RyPgogICAgIDx0cj4KICAgICAgIDx0ZD5SZXR1cm4gdHlwZSBkZWR1Y3Rpb24gZm9yIG5vcm1hbCBmdW5jdGlvbnM8L3RkPgotICAgICAgPHRkIGNsYXNzPSJzdm4iIGFsaWduPSJjZW50ZXIiPlNWTjwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkNsYW5nIDMuNDwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+CiAgICAgICA8dGQ+SW5pdGlhbGl6ZWQgbGFtYmRhIGNhcHR1cmVzPC90ZD4KICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDEzL24zNjQ4Lmh0bWwiPk4zNjQ4PC9hPjwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9InN2biIgYWxpZ249ImNlbnRlciI+U1ZOPC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+Q2xhbmcgMy40PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KICAgICAgIDx0ZD5HZW5lcmljIGxhbWJkYXM8L3RkPgogICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMTMvbjM2NDkuaHRtbCI+TjM2NDk8L2E+PC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0ic3ZuIiBhbGlnbj0iY2VudGVyIj5TVk48L3RkPgorICAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5DbGFuZyAzLjQ8L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgogICAgICAgPHRkPlZhcmlhYmxlIHRlbXBsYXRlczwvdGQ+CiAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAxMy9uMzY1MS5wZGYiPk4zNjUxPC9hPjwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9InN2biIgYWxpZ249ImNlbnRlciI+U1ZOPC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+Q2xhbmcgMy40PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KICAgICAgIDx0ZD5SZWxheGluZyByZXF1aXJlbWVudHMgb24gY29uc3RleHByIGZ1bmN0aW9uczwvdGQ+CiAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAxMy9uMzY1Mi5odG1sIj5OMzY1MjwvYT48L3RkPgotICAgICAgPHRkIGNsYXNzPSJzdm4iIGFsaWduPSJjZW50ZXIiPlNWTjwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkNsYW5nIDMuNDwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+CiAgICAgICA8dGQ+TWVtYmVyIGluaXRpYWxpemVycyBhbmQgYWdncmVnYXRlczwvdGQ+CkBAIC00NjEsMjIgKzQ4MiwyMiBAQAogICAgIDx0cj4KICAgICAgIDx0ZD5DbGFyaWZ5aW5nIG1lbW9yeSBhbGxvY2F0aW9uPC90ZD4KICAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDEzL24zNjY0Lmh0bWwiPk4zNjY0PC9hPjwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9InN2biIgYWxpZ249ImNlbnRlciI+U1ZOPC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0iZnVsbCIgYWxpZ249ImNlbnRlciI+Q2xhbmcgMy40PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KICAgICAgIDx0ZD48dHQ+W1tkZXByZWNhdGVkXV08L3R0PiBhdHRyaWJ1dGU8L3RkPgogICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMTMvbjM3NjAuaHRtbCI+TjM3NjA8L2E+PC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0ic3ZuIiBhbGlnbj0iY2VudGVyIj5TVk48L3RkPgorICAgICAgPHRkIGNsYXNzPSJmdWxsIiBhbGlnbj0iY2VudGVyIj5DbGFuZyAzLjQ8L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgogICAgICAgPHRkPlNpbmdsZSBxdW90YXRpb24gbWFyayBhcyBkaWdpdCBzZXBhcmF0b3I8L3RkPgogICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMTMvbjM3ODEucGRmIj5OMzc4MTwvYT48L3RkPgotICAgICAgPHRkIGNsYXNzPSJzdm4iIGFsaWduPSJjZW50ZXIiPlNWTjwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkNsYW5nIDMuNDwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+CiAgICAgICA8dGQ+QysrIFNpemVkIERlYWxsb2NhdGlvbjwvdGQ+CiAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAxMy9uMzc3OC5odG1sIj5OMzc3ODwvYT48L3RkPgotICAgICAgPHRkIGNsYXNzPSJzdm4iIGFsaWduPSJjZW50ZXIiPlNWTjwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkNsYW5nIDMuNDwvdGQ+CiAgICAgPC90cj4KIDwvdGFibGU+CiAKQEAgLTUwNywxMyArNTI4LDIzIEBACiAgICAgPHRyPgogICAgICAgPHRkPlNELTY6IFNHMTAgZmVhdHVyZSB0ZXN0IHJlY29tbWVuZGF0aW9uczwvdGQ+CiAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL2lzb2NwcC5vcmcvc3RkL3N0YW5kaW5nLWRvY3VtZW50cy9zZC02LXNnMTAtZmVhdHVyZS10ZXN0LXJlY29tbWVuZGF0aW9ucyI+U0QtNjwvYT48L3RkPgotICAgICAgPHRkIGNsYXNzPSJzdm4iIGFsaWduPSJjZW50ZXIiPlNWTiAoPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAxMy9uMzc0NSI+TjM3NDU8L2E+KTwvdGQ+CisgICAgICA8dGQgY2xhc3M9ImZ1bGwiIGFsaWduPSJjZW50ZXIiPkNsYW5nIDMuNCAoPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAxMy9uMzc0NSI+TjM3NDU8L2E+KTwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+CiAgICAgICA8dGQ+W0RSQUZUIFRTXSBBcnJheSBleHRlbnNpb25zIChhcnJheXMgb2YgcnVudGltZSBib3VuZCk8L3RkPgogICAgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMTMvbjM4MjAuaHRtbCI+TjM4MjA8L2E+PC90ZD4KICAgICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPltEUkFGVCBUU10gTGlicmFyeSBmdW5kYW1lbnRhbHMgKGludm9jYXRpb24gdHlwZSB0cmFpdHMpPC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDE0L24zOTA4Lmh0bWwiPk4zOTA4PC9hPjwvdGQ+CisgICAgICA8dGQgY2xhc3M9Im5vbmUiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5bRFJBRlQgVFNdIENvbmNlcHRzPC90ZD4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDE0L24zOTI5LnBkZiI+TjM5Mjk8L2E+PC90ZD4KKyAgICAgIDx0ZCBjbGFzcz0ibm9uZSIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDwvdHI+CiA8L3RhYmxlPgogCiA8L2Rpdj4KZGlmZiAtLWdpdCBhL3d3dy9kaWFnbm9zdGljcy5odG1sIGIvd3d3L2RpYWdub3N0aWNzLmh0bWwKaW5kZXggYmQ5YTg5ZC4uMDBhM2Y5YSAxMDA2NDQKLS0tIGEvd3d3L2RpYWdub3N0aWNzLmh0bWwKKysrIGIvd3d3L2RpYWdub3N0aWNzLmh0bWwKQEAgLTcsMTAgKzcsMTQgQEAKICAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibWVudS5jc3MiPgogICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjb250ZW50LmNzcyI+CiAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gIC53YXJuIHsgY29sb3I6bWFnZW50YTsgfQotICAuZXJyIHsgY29sb3I6cmVkOyB9Ci0gIC5zbmlwIHsgY29sb3I6ZGFya2dyZWVuOyB9Ci0gIC5wb2ludCB7IGNvbG9yOmJsdWU7IH0KKyAgLmxvYyB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9CisgIC5lcnIgeyBjb2xvcjpyZWQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB9CisgIC53YXJuIHsgY29sb3I6bWFnZW50YTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KKyAgLm5vdGUgeyBjb2xvcjpncmF5OyBmb250LXdlaWdodDogYm9sZDsgfQorICAubXNnIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KKyAgLmNtZCB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQorICAuc25pcCB7IH0KKyAgLnBvaW50IHsgY29sb3I6Z3JlZW47IGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgIDwvc3R5bGU+CiA8L2hlYWQ+CiA8Ym9keT4KQEAgLTI5LDEwICszMyw3IEBACiBtYWtpbmcgdGhlIGRpYWdub3N0aWNzIChlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcykgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlcgogYmUgYXMgdXNlZnVsIGFzIHBvc3NpYmxlLiAgVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0aGF0IHdlIGRvIHRoaXMuICBUaGlzIHNlY3Rpb24KIHRhbGtzIGFib3V0IHRoZSBleHBlcmllbmNlIHByb3ZpZGVkIGJ5IHRoZSBjb21tYW5kIGxpbmUgY29tcGlsZXIsIGNvbnRyYXN0aW5nCi1DbGFuZyBvdXRwdXQgdG8gR0NDIDQuMidzIG91dHB1dCBpbiBzZXZlcmFsIGV4YW1wbGVzLgotPCEtLQotT3RoZXIgY2xpZW50cwotdGhhdCBlbWJlZCBDbGFuZyBhbmQgZXh0cmFjdCBlcXVpdmFsZW50IGluZm9ybWF0aW9uIHRocm91Z2ggaW50ZXJuYWwgQVBJcy4tLT4KK0NsYW5nIG91dHB1dCB0byBHQ0MgNC45J3Mgb3V0cHV0IGluIHNvbWUgY2FzZXMuCiA8L3A+CiAKIDxoMj5Db2x1bW4gTnVtYmVycyBhbmQgQ2FyZXQgRGlhZ25vc3RpY3M8L2gyPgpAQCAtNDEsMjUgKzQyLDM1IEBACiBpbmZvcm1hdGlvbi4gVGhlIGNsYW5nIGNvbW1hbmQtbGluZSBjb21waWxlciBkcml2ZXIgdXNlcyB0aGlzIGluZm9ybWF0aW9uCiB0byBwcmludCAicG9pbnQgZGlhZ25vc3RpY3MiLgogKElERXMgY2FuIHVzZSB0aGUgaW5mb3JtYXRpb24gdG8gZGlzcGxheSBpbi1saW5lIGVycm9yIG1hcmt1cC4pCi1QcmVjaXNlIGVycm9yIGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgaXMgYSBmZWF0dXJlIHByb3ZpZGVkIGJ5IG1hbnkgY29tbWVyY2lhbAotY29tcGlsZXJzLCBidXQgaXMgZ2VuZXJhbGx5IG1pc3NpbmcgZnJvbSBvcGVuIHNvdXJjZQotY29tcGlsZXJzLiAgVGhpcyBpcyBuaWNlIGJlY2F1c2UgaXQgbWFrZXMgaXQgdmVyeSBlYXN5IHRvIHVuZGVyc3RhbmQgZXhhY3RseQotd2hhdCBpcyB3cm9uZyBpbiBhIHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZTwvcD4KK1RoaXMgaXMgbmljZSBiZWNhdXNlIGl0IG1ha2VzIGl0IHZlcnkgZWFzeSB0byB1bmRlcnN0YW5kIGV4YWN0bHkKK3doYXQgaXMgd3JvbmcgaW4gYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIGNvZGUuPC9wPgogCi08cD5UaGUgcG9pbnQgKHRoZSBibHVlICJeIiBjaGFyYWN0ZXIpIGV4YWN0bHkgc2hvd3Mgd2hlcmUgdGhlIHByb2JsZW0gaXMsIGV2ZW4KKzxwPlRoZSBwb2ludCAodGhlIGdyZWVuICJeIiBjaGFyYWN0ZXIpIGV4YWN0bHkgc2hvd3Mgd2hlcmUgdGhlIHByb2JsZW0gaXMsIGV2ZW4KIGluc2lkZSBvZiBhIHN0cmluZy4gIFRoaXMgbWFrZXMgaXQgcmVhbGx5IGVhc3kgdG8ganVtcCB0byB0aGUgcHJvYmxlbSBhbmQKLWhlbHBzIHdoZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGNoYXJhY3RlciBvY2N1ciBvbiBhIGxpbmUuIChXZSdsbCAKK2hlbHBzIHdoZW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGNoYXJhY3RlciBvY2N1ciBvbiBhIGxpbmUuIChXZSdsbAogcmV2aXNpdCB0aGlzIG1vcmUgaW4gZm9sbG93aW5nIGV4YW1wbGVzLik8L3A+CiAKIDxwcmU+Ci0gICQgPGI+Z2NjLTQuMiAtZnN5bnRheC1vbmx5IC1XZm9ybWF0IGZvcm1hdC1zdHJpbmdzLmM8L2I+Ci0gIGZvcm1hdC1zdHJpbmdzLmM6OTE6IHdhcm5pbmc6IHRvbyBmZXcgYXJndW1lbnRzIGZvciBmb3JtYXQKLSAgJCA8Yj5jbGFuZyAtZnN5bnRheC1vbmx5IGZvcm1hdC1zdHJpbmdzLmM8L2I+Ci0gIGZvcm1hdC1zdHJpbmdzLmM6OTE6MTM6IDxzcGFuIGNsYXNzPSJ3YXJuIj53YXJuaW5nOjwvc3Bhbj4gJy4qJyBzcGVjaWZpZWQgZmllbGQgcHJlY2lzaW9uIGlzIG1pc3NpbmcgYSBtYXRjaGluZyAnaW50JyBhcmd1bWVudAotICA8c3BhbiBjbGFzcz0ic25pcCI+ICBwcmludGYoIiUuKmQiKTs8L3NwYW4+CisgICQgPHNwYW4gY2xhc3M9ImNtZCI+Z2NjLTQuOSAtZnN5bnRheC1vbmx5IC1XZm9ybWF0IGZvcm1hdC1zdHJpbmdzLmM8L3NwYW4+CisgIGZvcm1hdC1zdHJpbmdzLmM6IEluIGZ1bmN0aW9uICd2b2lkIGYoKSc6CisgIGZvcm1hdC1zdHJpbmdzLmM6OTE6MTY6IHdhcm5pbmc6IGZpZWxkIHByZWNpc2lvbiBzcGVjaWZpZXIgJy4qJyBleHBlY3RzIGEgbWF0Y2hpbmcgJ2ludCcgYXJndW1lbnQgWy1XZm9ybWF0PV0KKyAgICAgcHJpbnRmKCIlLipkIik7CisgICAgICAgICAgICAgICAgICBeCisgIGZvcm1hdC1zdHJpbmdzLmM6OTE6MTY6IHdhcm5pbmc6IGZvcm1hdCAnJWQnIGV4cGVjdHMgYSBtYXRjaGluZyAnaW50JyBhcmd1bWVudCBbLVdmb3JtYXQ9XQorICAkIDxzcGFuIGNsYXNzPSJjbWQiPmNsYW5nIC1mc3ludGF4LW9ubHkgZm9ybWF0LXN0cmluZ3MuYzwvc3Bhbj4KKyAgPHNwYW4gY2xhc3M9ImxvYyI+Zm9ybWF0LXN0cmluZ3MuYzo5MToxMzo8L3NwYW4+IDxzcGFuIGNsYXNzPSJ3YXJuIj53YXJuaW5nOjwvc3Bhbj4gPHNwYW4gY2xhc3M9Im1zZyI+Jy4qJyBzcGVjaWZpZWQgZmllbGQgcHJlY2lzaW9uIGlzIG1pc3NpbmcgYSBtYXRjaGluZyAnaW50JyBhcmd1bWVudDwvc3Bhbj4KKyAgPHNwYW4gY2xhc3M9InNuaXAiID4gIHByaW50ZigiJS4qZCIpOzwvc3Bhbj4KICAgPHNwYW4gY2xhc3M9InBvaW50Ij4gICAgICAgICAgICBePC9zcGFuPgogPC9wcmU+CiAKKzxwPk5vdGUgdGhhdCBtb2Rlcm4gdmVyc2lvbnMgb2YgR0NDIGhhdmUgZm9sbG93ZWQgQ2xhbmcncyBsZWFkLCBhbmQgYXJlCitub3cgYWJsZSB0byBnaXZlIGEgY29sdW1uIGZvciBhIGRpYWdub3N0aWMsIGFuZCBpbmNsdWRlIGEgc25pcHBldCBvZiBzb3VyY2UKK3RleHQgaW4gdGhlIHJlc3VsdC4gSG93ZXZlciwgQ2xhbmcncyBjb2x1bW4gbnVtYmVyIGlzIG11Y2ggbW9yZSBhY2N1cmF0ZSwKK3BvaW50aW5nIGF0IHRoZSBwcm9ibGVtYXRpYyBmb3JtYXQgc3BlY2lmaWVyLCByYXRoZXIgdGhhbiB0aGUgPHR0Pik8L3R0PgorY2hhcmFjdGVyIHRoZSBwYXJzZXIgaGFkIHJlYWNoZWQgd2hlbiB0aGUgcHJvYmxlbSB3YXMgZGV0ZWN0ZWQuCitBbHNvLCBDbGFuZydzIGRpYWdub3N0aWMgaXMgY29sb3JlZCBieSBkZWZhdWx0LCBtYWtpbmcgaXQgZWFzaWVyIHRvCitkaXN0aW5ndWlzaCBmcm9tIG5lYXJieSB0ZXh0LjwvcD4KKwogPGgyPlJhbmdlIEhpZ2hsaWdodGluZyBmb3IgUmVsYXRlZCBUZXh0PC9oMj4KIAogPHA+Q2xhbmcgY2FwdHVyZXMgYW5kIGFjY3VyYXRlbHkgdHJhY2tzIHJhbmdlIGluZm9ybWF0aW9uIGZvciBleHByZXNzaW9ucywKQEAgLTc0LDExICs4NSwxNCBAQAogY2FzZXMgaW52b2x2aW5nIHByZWNlZGVuY2UgaXNzdWVzIGFuZCBtYW55IG90aGVyIGNhc2VzLjwvcD4KIAogPHByZT4KLSAgJCA8Yj5nY2MtNC4yIC1mc3ludGF4LW9ubHkgdC5jPC9iPgotICB0LmM6NzogZXJyb3I6IGludmFsaWQgb3BlcmFuZHMgdG8gYmluYXJ5ICsgKGhhdmUgJ2ludCcgYW5kICdzdHJ1Y3QgQScpCi0gICQgPGI+Y2xhbmcgLWZzeW50YXgtb25seSB0LmM8L2I+Ci0gIHQuYzo3OjM5OiA8c3BhbiBjbGFzcz0iZXJyIj5lcnJvcjo8L3NwYW4+IGludmFsaWQgb3BlcmFuZHMgdG8gYmluYXJ5IGV4cHJlc3Npb24gKCdpbnQnIGFuZCAnc3RydWN0IEEnKQotICA8c3BhbiBjbGFzcz0ic25pcCI+ICByZXR1cm4geSArIGZ1bmMoeSA/ICgoU29tZUEuWCArIDQwKSArIFNvbWVBKSAvIDQyICsgU29tZUEuWCA6IFNvbWVBLlgpOzwvc3Bhbj4KKyAgJCA8c3BhbiBjbGFzcz0iY21kIj5nY2MtNC45IC1mc3ludGF4LW9ubHkgdC5jPC9zcGFuPgorICB0LmM6IEluIGZ1bmN0aW9uICdpbnQgZihpbnQsIGludCknOgorICB0LmM6NzozOTogZXJyb3I6IGludmFsaWQgb3BlcmFuZHMgdG8gYmluYXJ5ICsgKGhhdmUgJ2ludCcgYW5kICdzdHJ1Y3QgQScpCisgICAgIHJldHVybiB5ICsgZnVuYyh5ID8gKChTb21lQS5YICsgNDApICsgU29tZUEpIC8gNDIgKyBTb21lQS5YIDogU29tZUEuWCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgJCA8c3BhbiBjbGFzcz0iY21kIj5jbGFuZyAtZnN5bnRheC1vbmx5IHQuYzwvc3Bhbj4KKyAgPHNwYW4gY2xhc3M9ImxvYyI+dC5jOjc6Mzk6PC9zcGFuPiA8c3BhbiBjbGFzcz0iZXJyIj5lcnJvcjo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtc2ciPmludmFsaWQgb3BlcmFuZHMgdG8gYmluYXJ5IGV4cHJlc3Npb24gKCdpbnQnIGFuZCAnc3RydWN0IEEnKTwvc3Bhbj4KKyAgPHNwYW4gY2xhc3M9InNuaXAiID4gIHJldHVybiB5ICsgZnVuYyh5ID8gKChTb21lQS5YICsgNDApICsgU29tZUEpIC8gNDIgKyBTb21lQS5YIDogU29tZUEuWCk7PC9zcGFuPgogICA8c3BhbiBjbGFzcz0icG9pbnQiPiAgICAgICAgICAgICAgICAgICAgICAgfn5+fn5+fn5+fn5+fn4gXiB+fn5+fjwvc3Bhbj4KIDwvcHJlPgogCkBAIC05MCw2MiArMTA0LDI0IEBACiB0aGUgbGVmdCBhbmQgcmlnaHQgaGFuZCBzaWRlcywgYW5kIHdlIGRvbid0IHJlcGVhdCB3aGF0IGlzIG9idmlvdXMgZnJvbSB0aGUKIHBvaW50IChlLmcuLCB0aGF0IHRoaXMgaXMgYSAiYmluYXJ5ICsiKS48L3A+CiAKLTxwPk1hbnkgb3RoZXIgZXhhbXBsZXMgYWJvdW5kLiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIG5vdCBvbmx5IGRvIHdlIHRlbGwgeW91IHRoYXQgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlICoKKzxwPk1hbnkgb3RoZXIgZXhhbXBsZXMgYWJvdW5kLiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIG5vdCBvbmx5IGRvIHdlIHRlbGwgeW91Cit0aGF0IHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSA8dHQ+KjwvdHQ+CiBhbmQgcG9pbnQgdG8gaXQsIHdlIHNheSBleGFjdGx5IHdoeSBhbmQgdGVsbCB5b3Ugd2hhdCB0aGUgdHlwZSBpcyAoaW4gY2FzZSBpdCBpcwogYSBjb21wbGljYXRlZCBzdWJleHByZXNzaW9uLCBzdWNoIGFzIGEgY2FsbCB0byBhbiBvdmVybG9hZGVkIGZ1bmN0aW9uKS4gIFRoaXMKIHNvcnQgb2YgYXR0ZW50aW9uIHRvIGRldGFpbCBtYWtlcyBpdCBtdWNoIGVhc2llciB0byB1bmRlcnN0YW5kIGFuZCBmaXggcHJvYmxlbXMKIHF1aWNrbHkuPC9wPgogCiA8cHJlPgotICAkIDxiPmdjYy00LjIgLWZzeW50YXgtb25seSB0LmM8L2I+Ci0gIHQuYzo1OiBlcnJvcjogaW52YWxpZCB0eXBlIGFyZ3VtZW50IG9mICd1bmFyeSAqJwotICAkIDxiPmNsYW5nIC1mc3ludGF4LW9ubHkgdC5jPC9iPgotICB0LmM6NToxMTogPHNwYW4gY2xhc3M9ImVyciI+ZXJyb3I6PC9zcGFuPiBpbmRpcmVjdGlvbiByZXF1aXJlcyBwb2ludGVyIG9wZXJhbmQgKCdpbnQnIGludmFsaWQpCi0gIDxzcGFuIGNsYXNzPSJzbmlwIj4gIGludCB5ID0gKlNvbWVBLlg7PC9zcGFuPgorICAkIDxzcGFuIGNsYXNzPSJjbWQiPmdjYy00LjkgLWZzeW50YXgtb25seSB0LmM8L3NwYW4+CisgIHQuYzo1OjExOiBlcnJvcjogaW52YWxpZCB0eXBlIGFyZ3VtZW50IG9mIHVuYXJ5ICcqJyAoaGF2ZSAnaW50JykKKyAgICByZXR1cm4gKlNvbWVBLlg7CisgICAgICAgICAgIF4KKyAgJCA8c3BhbiBjbGFzcz0iY21kIj5jbGFuZyAtZnN5bnRheC1vbmx5IHQuYzwvc3Bhbj4KKyAgPHNwYW4gY2xhc3M9ImxvYyI+dC5jOjU6MTE6PC9zcGFuPiA8c3BhbiBjbGFzcz0iZXJyIj5lcnJvcjo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtc2ciPmluZGlyZWN0aW9uIHJlcXVpcmVzIHBvaW50ZXIgb3BlcmFuZCAoJ2ludCcgaW52YWxpZCk8L3NwYW4+CisgIDxzcGFuIGNsYXNzPSJzbmlwIiA+ICBpbnQgeSA9ICpTb21lQS5YOzwvc3Bhbj4KICAgPHNwYW4gY2xhc3M9InBvaW50Ij4gICAgICAgICAgXn5+fn5+fn48L3NwYW4+CiA8L3ByZT4KIAotPGgyPk5vIFByZXR0eSBQcmludGluZyBvZiBFeHByZXNzaW9ucyBpbiBEaWFnbm9zdGljczwvaDI+Ci0KLTxwPlNpbmNlIENsYW5nIGhhcyByYW5nZSBoaWdobGlnaHRpbmcsIGl0IG5ldmVyIG5lZWRzIHRvIHByZXR0eSBwcmludCB5b3VyIGNvZGUKLWJhY2sgb3V0IHRvIHlvdS4gIEdDQyBjYW4gcHJvZHVjZSBpbnNjcnV0aWJsZSBlcnJvciBtZXNzYWdlcyBpbiBzb21lIGNhc2VzIHdoZW4KLWl0IHRyaWVzIHRvIGRvIHRoaXMuICBJbiB0aGlzIGV4YW1wbGUgUCBhbmQgUSBoYXZlIHR5cGUgImludCoiOjwvcD4KLQotPHByZT4KLSAgJCA8Yj5nY2MtNC4yIC1mc3ludGF4LW9ubHkgdC5jPC9iPgotICAjJ2V4YWN0X2Rpdl9leHByJyBub3Qgc3VwcG9ydGVkIGJ5IHBwX2NfZXhwcmVzc2lvbiMndC5jOjEyOiBlcnJvcjogY2FsbGVkIG9iamVjdCAgaXMgbm90IGEgZnVuY3Rpb24KLSAgJCA8Yj5jbGFuZyAtZnN5bnRheC1vbmx5IHQuYzwvYj4KLSAgdC5jOjEyOjg6IDxzcGFuIGNsYXNzPSJlcnIiPmVycm9yOjwvc3Bhbj4gY2FsbGVkIG9iamVjdCB0eXBlICdpbnQnIGlzIG5vdCBhIGZ1bmN0aW9uIG9yIGZ1bmN0aW9uIHBvaW50ZXIKLSAgPHNwYW4gY2xhc3M9InNuaXAiPiAgKFAtUSkoKTs8L3NwYW4+Ci0gIDxzcGFuIGNsYXNzPSJwb2ludCI+ICB+fn5+fl48L3NwYW4+Ci08L3ByZT4KLQotPHA+VGhpcyBjYW4gYmUgcGFydGljdWxhcmx5IGJhZCBpbiBHKyssIHdoaWNoIG9mdGVuIGVtaXRzIGVycm9ycwotICAgY29udGFpbmluZyBsb3dlcmVkIHZ0YWJsZSByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGU6PC9wPgotICAKLTxwcmU+Ci0gICQgPGI+Y2F0IHQuY2M8L2I+Ci0gIHN0cnVjdCBhIHsKLSAgICB2aXJ0dWFsIGludCBiYXIoKTsKLSAgfTsKLSAgCi0gIHN0cnVjdCBmb28gOiBwdWJsaWMgdmlydHVhbCBhIHsKLSAgfTsKLSAgCi0gIHZvaWQgdGVzdChmb28gKlApIHsKLSAgICByZXR1cm4gUC0+YmFyKCkgKyAqUDsKLSAgfQotICAkIDxiPmdjYy00LjIgdC5jYzwvYj4KLSAgdC5jYzogSW4gZnVuY3Rpb24gJ3ZvaWQgdGVzdChmb28qKSc6Ci0gIHQuY2M6OTogZXJyb3I6IG5vIG1hdGNoIGZvciAnb3BlcmF0b3IrJyBpbiAnKCgoYSopUCkgKyAoKihsb25nIGludCopKFAtJmd0O2Zvbzo6Jmx0O2Fub255bW91cyZndDsuYTo6X3ZwdHIkYSArIC0weDAwMDAwMDAwMDAwMDAwMDIwKSkpLSZndDthOjpiYXIoKSArICogUCcKLSAgdC5jYzo5OiBlcnJvcjogcmV0dXJuLXN0YXRlbWVudCB3aXRoIGEgdmFsdWUsIGluIGZ1bmN0aW9uIHJldHVybmluZyAndm9pZCcKLSAgJCA8Yj5jbGFuZyB0LmNjPC9iPgotICB0LmNjOjk6MTg6IDxzcGFuIGNsYXNzPSJlcnIiPmVycm9yOjwvc3Bhbj4gaW52YWxpZCBvcGVyYW5kcyB0byBiaW5hcnkgZXhwcmVzc2lvbiAoJ2ludCcgYW5kICdmb28nKQotICA8c3BhbiBjbGFzcz0ic25pcCI+ICByZXR1cm4gUC0+YmFyKCkgKyAqUDs8L3NwYW4+Ci0gIDxzcGFuIGNsYXNzPSJwb2ludCI+ICAgICAgICAgfn5+fn5+fn4gXiB+fjwvc3Bhbj4KLTwvcHJlPgotICAKLQogPGgyPlR5cGVkZWYgUHJlc2VydmF0aW9uIGFuZCBTZWxlY3RpdmUgVW53cmFwcGluZzwvaDI+CiAKIDxwPk1hbnkgcHJvZ3JhbW1lcnMgdXNlIGhpZ2gtbGV2ZWwgdXNlciBkZWZpbmVkIHR5cGVzLCB0eXBlZGVmcywgYW5kIG90aGVyCkBAIC0xNTYsMTUgKzEzMiwxMSBAQAogaXMgZ29pbmcgb24uICBDbGFuZyBhaW1zIHRvIGhhbmRsZSBib3RoIGNhc2VzIHdlbGwuPHA+CiAKIDxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB3aGVyZSBpdCBpcyBpbXBvcnRhbnQgdG8gcHJlc2VydmUKLWEgdHlwZWRlZiBpbiBDLiBIZXJlIHRoZSB0eXBlIHByaW50ZWQgYnkgR0NDIGlzbid0IGV2ZW4gdmFsaWQsIGJ1dCBpZiB0aGUgZXJyb3IKLXdlcmUgYWJvdXQgYSB2ZXJ5IGxvbmcgYW5kIGNvbXBsaWNhdGVkIHR5cGUgKGFzIG9mdGVuIGhhcHBlbnMgaW4gQysrKSB0aGUgZXJyb3IKLW1lc3NhZ2Ugd291bGQgYmUgdWdseSBqdXN0IGJlY2F1c2UgaXQgd2FzIGxvbmcgYW5kIGhhcmQgdG8gcmVhZC48L3A+CithIHR5cGVkZWYgaW4gQy48L3A+CiAKIDxwcmU+Ci0gICQgPGI+Z2NjLTQuMiAtZnN5bnRheC1vbmx5IHQuYzwvYj4KLSAgdC5jOjE1OiBlcnJvcjogaW52YWxpZCBvcGVyYW5kcyB0byBiaW5hcnkgLyAoaGF2ZSAnZmxvYXQgX192ZWN0b3JfXycgYW5kICdjb25zdCBpbnQgKicpCi0gICQgPGI+Y2xhbmcgLWZzeW50YXgtb25seSB0LmM8L2I+Ci0gIHQuYzoxNToxMTogPHNwYW4gY2xhc3M9ImVyciI+ZXJyb3I6PC9zcGFuPiBjYW4ndCBjb252ZXJ0IGJldHdlZW4gdmVjdG9yIHZhbHVlcyBvZiBkaWZmZXJlbnQgc2l6ZSAoJ19fbTEyOCcgYW5kICdpbnQgY29uc3QgKicpCisgICQgPHNwYW4gY2xhc3M9ImNtZCI+Y2xhbmcgLWZzeW50YXgtb25seSB0LmM8L3NwYW4+CisgIDxzcGFuIGNsYXNzPSJsb2MiPnQuYzoxNToxMTo8L3NwYW4+IDxzcGFuIGNsYXNzPSJlcnIiPmVycm9yOjwvc3Bhbj4gPHNwYW4gY2xhc3M9Im1zZyI+Y2FuJ3QgY29udmVydCBiZXR3ZWVuIHZlY3RvciB2YWx1ZXMgb2YgZGlmZmVyZW50IHNpemUgKCdfX20xMjgnIGFuZCAnaW50IGNvbnN0IConKTwvc3Bhbj4KICAgPHNwYW4gY2xhc3M9InNuaXAiPiAgbXl2ZWNbMV0vUDs8L3NwYW4+CiAgIDxzcGFuIGNsYXNzPSJwb2ludCI+ICB+fn5+fn5+fl5+PC9zcGFuPgogPC9wcmU+CkBAIC0xNzQsMTAgKzE0Niw4IEBACiBzeXN0ZW0gInBpZF90IiB0eXBlZGVmIGlzIGRlZmluZWQsIENsYW5nIGhlbHBmdWxseSBkaXNwbGF5cyBpdCB3aXRoICJha2EiLjwvcD4KIAogPHByZT4KLSAgJCA8Yj5nY2MtNC4yIC1mc3ludGF4LW9ubHkgdC5jPC9iPgotICB0LmM6MTM6IGVycm9yOiByZXF1ZXN0IGZvciBtZW1iZXIgJ3gnIGluIHNvbWV0aGluZyBub3QgYSBzdHJ1Y3R1cmUgb3IgdW5pb24KLSAgJCA8Yj5jbGFuZyAtZnN5bnRheC1vbmx5IHQuYzwvYj4KLSAgdC5jOjEzOjk6IDxzcGFuIGNsYXNzPSJlcnIiPmVycm9yOjwvc3Bhbj4gbWVtYmVyIHJlZmVyZW5jZSBiYXNlIHR5cGUgJ3BpZF90JyAoYWthICdpbnQnKSBpcyBub3QgYSBzdHJ1Y3R1cmUgb3IgdW5pb24KKyAgJCA8c3BhbiBjbGFzcz0iY21kIj5jbGFuZyAtZnN5bnRheC1vbmx5IHQuYzwvc3Bhbj4KKyAgPHNwYW4gY2xhc3M9ImxvYyI+dC5jOjEzOjk6PC9zcGFuPiA8c3BhbiBjbGFzcz0iZXJyIj5lcnJvcjo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtc2ciPm1lbWJlciByZWZlcmVuY2UgYmFzZSB0eXBlICdwaWRfdCcgKGFrYSAnaW50JykgaXMgbm90IGEgc3RydWN0dXJlIG9yIHVuaW9uPC9zcGFuPgogICA8c3BhbiBjbGFzcz0ic25pcCI+ICBteXZhciA9IG15dmFyLng7PC9zcGFuPgogICA8c3BhbiBjbGFzcz0icG9pbnQiPiAgICAgICAgICB+fn5+fiBePC9zcGFuPgogPC9wcmU+CkBAIC0yMDIsMTMgKzE3MiwxMSBAQAogPC9wcmU+CiA8L2Jsb2NrcXVvdGU+CiAKLTxwPmFuZCB0aGVuIGNvbXBpbGUgaXQsIHdlIHNlZSB0aGF0IENsYW5nIGlzIGJvdGggcHJvdmlkaW5nIG1vcmUgYWNjdXJhdGUgaW5mb3JtYXRpb24gYW5kIGlzIHJldGFpbmluZyB0aGUgdHlwZXMgYXMgd3JpdHRlbiBieSB0aGUgdXNlciAoZS5nLiwgInNlcnZlcnM6OlNlcnZlciIsICI6OnNlcnZpY2VzOjpXZWJTZXJ2aWNlIik6Cis8cD5hbmQgdGhlbiBjb21waWxlIGl0LCB3ZSBzZWUgdGhhdCBDbGFuZyBpcyBib3RoIHByb3ZpZGluZyBhY2N1cmF0ZSBpbmZvcm1hdGlvbiBhbmQgaXMgcmV0YWluaW5nIHRoZSB0eXBlcyBhcyB3cml0dGVuIGJ5IHRoZSB1c2VyIChlLmcuLCAic2VydmVyczo6U2VydmVyIiwgIjo6c2VydmljZXM6OldlYlNlcnZpY2UiKToKIAogPHByZT4KLSAgJCA8Yj5nKystNC4yIC1mc3ludGF4LW9ubHkgdC5jcHA8L2I+Ci0gIHQuY3BwOjk6IGVycm9yOiBubyBtYXRjaCBmb3IgJ29wZXJhdG9yKz0nIGluICdzZXJ2ZXIgKz0gaHR0cCcKLSAgJCA8Yj5jbGFuZyAtZnN5bnRheC1vbmx5IHQuY3BwPC9iPgotICB0LmNwcDo5OjEwOiA8c3BhbiBjbGFzcz0iZXJyIj5lcnJvcjo8L3NwYW4+IGludmFsaWQgb3BlcmFuZHMgdG8gYmluYXJ5IGV4cHJlc3Npb24gKCdzZXJ2ZXJzOjpTZXJ2ZXIgY29uc3QnIGFuZCAnOjpzZXJ2aWNlczo6V2ViU2VydmljZSBjb25zdCAqJykKKyAgJCA8c3BhbiBjbGFzcz0iY21kIj5jbGFuZyAtZnN5bnRheC1vbmx5IHQuY3BwPC9zcGFuPgorICA8c3BhbiBjbGFzcz0ibG9jIj50LmNwcDo5OjEwOjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImVyciI+ZXJyb3I6PC9zcGFuPiA8c3BhbiBjbGFzcz0ibXNnIj5pbnZhbGlkIG9wZXJhbmRzIHRvIGJpbmFyeSBleHByZXNzaW9uICgnc2VydmVyczo6U2VydmVyIGNvbnN0JyBhbmQgJzo6c2VydmljZXM6OldlYlNlcnZpY2UgY29uc3QgKicpPC9zcGFuPgogICAgIDxzcGFuIGNsYXNzPSJzbmlwIj5zZXJ2ZXIgKz0gaHR0cDs8L3NwYW4+CiAgICAgPHNwYW4gY2xhc3M9InBvaW50Ij5+fn5+fn4gXiAgfn5+fjwvc3Bhbj4KIDwvcHJlPgpAQCAtMjE2LDEwICsxODQsOCBAQAogPHA+TmF0dXJhbGx5LCB0eXBlIHByZXNlcnZhdGlvbiBleHRlbmRzIHRvIHVzZXMgb2YgdGVtcGxhdGVzLCBhbmQgQ2xhbmcgcmV0YWlucyBpbmZvcm1hdGlvbiBhYm91dCBob3cgYSBwYXJ0aWN1bGFyIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIChsaWtlIDxjb2RlPnN0ZDo6dmVjdG9yJmx0O1JlYWwmZ3Q7PC9jb2RlPikgd2FzIHNwZWxsZWQgd2l0aGluIHRoZSBzb3VyY2UgY29kZS4gRm9yIGV4YW1wbGU6PC9wPgogCiA8cHJlPgotICAkIDxiPmcrKy00LjIgLWZzeW50YXgtb25seSB0LmNwcDwvYj4KLSAgdC5jcHA6MTI6IGVycm9yOiBubyBtYXRjaCBmb3IgJ29wZXJhdG9yPScgaW4gJ3N0ciA9IHZlYycKLSAgJCA8Yj5jbGFuZyAtZnN5bnRheC1vbmx5IHQuY3BwPC9iPgotICB0LmNwcDoxMjo3OiA8c3BhbiBjbGFzcz0iZXJyIj5lcnJvcjo8L3NwYW4+IGluY29tcGF0aWJsZSB0eXBlIGFzc2lnbmluZyAndmVjdG9yJmx0O1JlYWwmZ3Q7JywgZXhwZWN0ZWQgJ3N0ZDo6c3RyaW5nJyAoYWthICdjbGFzcyBzdGQ6OmJhc2ljX3N0cmluZyZsdDtjaGFyJmd0OycpCisgICQgPHNwYW4gY2xhc3M9ImNtZCI+Y2xhbmcgLWZzeW50YXgtb25seSB0LmNwcDwvc3Bhbj4KKyAgPHNwYW4gY2xhc3M9ImxvYyI+dC5jcHA6MTI6Nzo8L3NwYW4+IDxzcGFuIGNsYXNzPSJlcnIiPmVycm9yOjwvc3Bhbj4gPHNwYW4gY2xhc3M9Im1zZyI+aW5jb21wYXRpYmxlIHR5cGUgYXNzaWduaW5nICd2ZWN0b3ImbHQ7UmVhbCZndDsnLCBleHBlY3RlZCAnc3RkOjpzdHJpbmcnIChha2EgJ2NsYXNzIHN0ZDo6YmFzaWNfc3RyaW5nJmx0O2NoYXImZ3Q7Jyk8L3NwYW4+CiAgICAgPHNwYW4gY2xhc3M9InNuaXAiPnN0ciA9IHZlYzwvc3Bhbj47CiAgICAgICAgIDxzcGFuIGNsYXNzPSJwb2ludCI+XiB+fn48L3NwYW4+CiA8L3ByZT4KQEAgLTIzNywxNCArMjAzLDE0IEBACiBwb2ludCBsaW5lICgiLnggPSIgb3IgIi55ID0iLCByZXNwZWN0aXZlbHkpLjwvcD4KIAogPHByZT4KLSAgJCA8Yj5jbGFuZyB0LmM8L2I+Ci0gIHQuYzo1OjI4OiA8c3BhbiBjbGFzcz0id2FybiI+d2FybmluZzo8L3NwYW4+IHVzZSBvZiBHTlUgb2xkLXN0eWxlIGZpZWxkIGRlc2lnbmF0b3IgZXh0ZW5zaW9uCisgICQgPHNwYW4gY2xhc3M9ImNtZCI+Y2xhbmcgdC5jPC9zcGFuPgorICA8c3BhbiBjbGFzcz0ibG9jIj50LmM6NToyODo8L3NwYW4+IDxzcGFuIGNsYXNzPSJ3YXJuIj53YXJuaW5nOjwvc3Bhbj4gPHNwYW4gY2xhc3M9Im1zZyI+dXNlIG9mIEdOVSBvbGQtc3R5bGUgZmllbGQgZGVzaWduYXRvciBleHRlbnNpb248L3NwYW4+CiAgIDxzcGFuIGNsYXNzPSJzbmlwIj5zdHJ1Y3QgcG9pbnQgb3JpZ2luID0geyB4OiAwLjAsIHk6IDAuMCB9Ozwvc3Bhbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVyciI+fn48L3NwYW4+IDxzcGFuIGNsYXNzPSJwb2ludCI+Xjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVyciI+fn48L3NwYW4+IDxzcGFuIGNsYXNzPSJtc2ciPjxzcGFuIGNsYXNzPSJwb2ludCI+Xjwvc3Bhbj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzbmlwIj4ueCA9IDwvc3Bhbj4KLSAgdC5jOjU6MzY6IDxzcGFuIGNsYXNzPSJ3YXJuIj53YXJuaW5nOjwvc3Bhbj4gdXNlIG9mIEdOVSBvbGQtc3R5bGUgZmllbGQgZGVzaWduYXRvciBleHRlbnNpb24KKyAgPHNwYW4gY2xhc3M9ImxvYyI+dC5jOjU6MzY6PC9zcGFuPiA8c3BhbiBjbGFzcz0id2FybiI+d2FybmluZzo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtc2ciPnVzZSBvZiBHTlUgb2xkLXN0eWxlIGZpZWxkIGRlc2lnbmF0b3IgZXh0ZW5zaW9uPC9zcGFuPgogICA8c3BhbiBjbGFzcz0ic25pcCI+c3RydWN0IHBvaW50IG9yaWdpbiA9IHsgeDogMC4wLCB5OiAwLjAgfTs8L3NwYW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVyciI+fn48L3NwYW4+IDxzcGFuIGNsYXNzPSJwb2ludCI+Xjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZXJyIj5+fjwvc3Bhbj4gPHNwYW4gY2xhc3M9Im1zZyI+PHNwYW4gY2xhc3M9InBvaW50Ij5ePC9zcGFuPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic25pcCI+LnkgPSA8L3NwYW4+CiA8L3ByZT4KIApAQCAtMjU2LDggKzIyMiw4IEBACiBkaWFnbm9zdGljLjxwPgogCiA8cHJlPgotICAkIDxiPmNsYW5nIHQuY3BwPC9iPgotICB0LmNwcDo5OjM6IDxzcGFuIGNsYXNzPSJlcnIiPmVycm9yOjwvc3Bhbj4gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gcmVxdWlyZXMgJ3RlbXBsYXRlJmx0OyZndDsnCisgICQgPHNwYW4gY2xhc3M9ImNtZCI+Y2xhbmcgdC5jcHA8L3NwYW4+CisgIDxzcGFuIGNsYXNzPSJsb2MiPnQuY3BwOjk6Mzo8L3NwYW4+IDxzcGFuIGNsYXNzPSJlcnIiPmVycm9yOjwvc3Bhbj4gPHNwYW4gY2xhc3M9Im1zZyI+dGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gcmVxdWlyZXMgJ3RlbXBsYXRlJmx0OyZndDsnPC9zcGFuPgogICAgIHN0cnVjdCBpdGVyYXRvcl90cmFpdHMmbHQ7ZmlsZV9pdGVyYXRvciZndDsgewogICAgIDxzcGFuIGNsYXNzPSJwb2ludCI+Xjwvc3Bhbj4KICAgICA8c3BhbiBjbGFzcz0ic25pcCI+dGVtcGxhdGUmbHQ7Jmd0OyA8L3NwYW4+CkBAIC0yNzMsMTUgKzIzOSwxNSBAQAogCiBEZWZhdWx0OiB0ZW1wbGF0ZSBkaWZmIHdpdGggdHlwZSBlbGlzaW9uCiA8cHJlPgotdC5jYzo0OjU6IDxzcGFuIGNsYXNzPSJub3RlIj5ub3RlOjwvc3Bhbj4gY2FuZGlkYXRlIGZ1bmN0aW9uIG5vdCB2aWFibGU6IG5vIGtub3duIGNvbnZlcnNpb24gZnJvbSAndmVjdG9yJmx0O21hcCZsdDtbLi4uXSwgPHNwYW4gY2xhc3M9InRlbXBsYXRlLWhpZ2hsaWdodCI+ZmxvYXQ8L3NwYW4+Jmd0OyZndDsnIHRvICd2ZWN0b3ImbHQ7bWFwJmx0O1suLi5dLCA8c3BhbiBjbGFzcz0idGVtcGxhdGUtaGlnaGxpZ2h0Ij5kb3VibGU8L3NwYW4+Jmd0OyZndDsnIGZvciAxc3QgYXJndW1lbnQ7Cis8c3BhbiBjbGFzcz0ibG9jIj50LmNjOjQ6NTo8L3NwYW4+IDxzcGFuIGNsYXNzPSJub3RlIj5ub3RlOjwvc3Bhbj4gY2FuZGlkYXRlIGZ1bmN0aW9uIG5vdCB2aWFibGU6IG5vIGtub3duIGNvbnZlcnNpb24gZnJvbSAndmVjdG9yJmx0O21hcCZsdDtbLi4uXSwgPHNwYW4gY2xhc3M9InRlbXBsYXRlLWhpZ2hsaWdodCI+ZmxvYXQ8L3NwYW4+Jmd0OyZndDsnIHRvICd2ZWN0b3ImbHQ7bWFwJmx0O1suLi5dLCA8c3BhbiBjbGFzcz0idGVtcGxhdGUtaGlnaGxpZ2h0Ij5kb3VibGU8L3NwYW4+Jmd0OyZndDsnIGZvciAxc3QgYXJndW1lbnQ7CiA8L3ByZT4KIC1mbm8tZWxpZGUtdHlwZTogdGVtcGxhdGUgZGlmZiB3aXRob3V0IGVsaXNpb24KIDxwcmU+Ci10LmNjOjQ6NTogPHNwYW4gY2xhc3M9Im5vdGUiPm5vdGU6PC9zcGFuPiBjYW5kaWRhdGUgZnVuY3Rpb24gbm90IHZpYWJsZTogbm8ga25vd24gY29udmVyc2lvbiBmcm9tICd2ZWN0b3ImbHQ7bWFwJmx0O2ludCwgPHNwYW4gY2xhc3M9InRlbXBsYXRlLWhpZ2hsaWdodCI+ZmxvYXQ8L3NwYW4+Jmd0OyZndDsnIHRvICd2ZWN0b3ImbHQ7bWFwJmx0O2ludCwgPHNwYW4gY2xhc3M9InRlbXBsYXRlLWhpZ2hsaWdodCI+ZG91YmxlPC9zcGFuPiZndDsmZ3Q7JyBmb3IgMXN0IGFyZ3VtZW50OworPHNwYW4gY2xhc3M9ImxvYyI+dC5jYzo0OjU6PC9zcGFuPiA8c3BhbiBjbGFzcz0ibm90ZSI+bm90ZTo8L3NwYW4+IGNhbmRpZGF0ZSBmdW5jdGlvbiBub3QgdmlhYmxlOiBubyBrbm93biBjb252ZXJzaW9uIGZyb20gJ3ZlY3RvciZsdDttYXAmbHQ7aW50LCA8c3BhbiBjbGFzcz0idGVtcGxhdGUtaGlnaGxpZ2h0Ij5mbG9hdDwvc3Bhbj4mZ3Q7Jmd0OycgdG8gJ3ZlY3RvciZsdDttYXAmbHQ7aW50LCA8c3BhbiBjbGFzcz0idGVtcGxhdGUtaGlnaGxpZ2h0Ij5kb3VibGU8L3NwYW4+Jmd0OyZndDsnIGZvciAxc3QgYXJndW1lbnQ7CiA8L3ByZT4KIC1mZGlhZ25vc3RpY3Mtc2hvdy10ZW1wbGF0ZS10cmVlOiB0ZW1wbGF0ZSB0cmVlIHByaW50aW5nIHdpdGggZWxpc2lvbgogPHByZT4KLXQuY2M6NDo1OiA8c3BhbiBjbGFzcz0ibm90ZSI+bm90ZTo8L3NwYW4+IGNhbmRpZGF0ZSBmdW5jdGlvbiBub3QgdmlhYmxlOiBubyBrbm93biBjb252ZXJzaW9uIGZvciAxc3QgYXJndW1lbnQ7Cis8c3BhbiBjbGFzcz0ibG9jIj50LmNjOjQ6NTo8L3NwYW4+IDxzcGFuIGNsYXNzPSJub3RlIj5ub3RlOjwvc3Bhbj4gY2FuZGlkYXRlIGZ1bmN0aW9uIG5vdCB2aWFibGU6IG5vIGtub3duIGNvbnZlcnNpb24gZm9yIDFzdCBhcmd1bWVudDsKICAgdmVjdG9yJmx0OwogICAgIG1hcCZsdDsKICAgICAgIFsuLi5dLCAKQEAgLTI4OSw3ICsyNTUsNyBAQAogPC9wcmU+CiAtZmRpYWdub3N0aWNzLXNob3ctdGVtcGxhdGUtdHJlZSAtZm5vLWVsaWRlLXR5cGU6IHRlbXBsYXRlIHRyZWUgcHJpbnRpbmcgd2l0aCBubyBlbGlzaW9uCiA8cHJlPgotdC5jYzo0OjU6IDxzcGFuIGNsYXNzPSJub3RlIj5ub3RlOk08L3NwYW4+IGNhbmRpZGF0ZSBmdW5jdGlvbiBub3QgdmlhYmxlOiBubyBrbm93biBjb252ZXJzaW9uIGZvciAxc3QgYXJndW1lbnQ7Cis8c3BhbiBjbGFzcz0ibG9jIj50LmNjOjQ6NTo8L3NwYW4+IDxzcGFuIGNsYXNzPSJub3RlIj5ub3RlOjwvc3Bhbj4gY2FuZGlkYXRlIGZ1bmN0aW9uIG5vdCB2aWFibGU6IG5vIGtub3duIGNvbnZlcnNpb24gZm9yIDFzdCBhcmd1bWVudDsKICAgdmVjdG9yJmx0OwogICAgIG1hcCZsdDsKICAgICAgIGludCwgCkBAIC0zMDYsMTQgKzI3MiwxMSBAQAogYW5kIGFsc28gc2hvd3MgaG93IHNvbWUgb2YgdGhlIG90aGVyIHBpZWNlcyB3b3JrIGluIGEgYmlnZ2VyIGV4YW1wbGUuPC9wPgogCiA8cHJlPgotICAkIDxiPmdjYy00LjIgLWZzeW50YXgtb25seSB0LmM8L2I+Ci0gIHQuYzogSW4gZnVuY3Rpb24gJ3Rlc3QnOgotICB0LmM6ODA6IGVycm9yOiBpbnZhbGlkIG9wZXJhbmRzIHRvIGJpbmFyeSAmbHQ7IChoYXZlICdzdHJ1Y3QgbXlzdHJ1Y3QnIGFuZCAnZmxvYXQnKQotICAkIDxiPmNsYW5nIC1mc3ludGF4LW9ubHkgdC5jPC9iPgotICB0LmM6ODA6MzogPHNwYW4gY2xhc3M9ImVyciI+ZXJyb3I6PC9zcGFuPiBpbnZhbGlkIG9wZXJhbmRzIHRvIGJpbmFyeSBleHByZXNzaW9uICgndHlwZW9mKFApJyAoYWthICdzdHJ1Y3QgbXlzdHJ1Y3QnKSBhbmQgJ3R5cGVvZihGKScgKGFrYSAnZmxvYXQnKSkKKyAgJCA8c3BhbiBjbGFzcz0iY21kIj5jbGFuZyAtZnN5bnRheC1vbmx5IHQuYzwvc3Bhbj4KKyAgPHNwYW4gY2xhc3M9ImxvYyI+dC5jOjgwOjM6PC9zcGFuPiA8c3BhbiBjbGFzcz0iZXJyIj5lcnJvcjo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtc2ciPmludmFsaWQgb3BlcmFuZHMgdG8gYmluYXJ5IGV4cHJlc3Npb24gKCd0eXBlb2YoUCknIChha2EgJ3N0cnVjdCBteXN0cnVjdCcpIGFuZCAndHlwZW9mKEYpJyAoYWthICdmbG9hdCcpKTwvc3Bhbj4KICAgPHNwYW4gY2xhc3M9InNuaXAiPiAgWCA9IE1ZTUFYKFAsIEYpOzwvc3Bhbj4KICAgPHNwYW4gY2xhc3M9InBvaW50Ij4gICAgICBefn5+fn5+fn5+fjwvc3Bhbj4KLSAgdC5jOjc2Ojk0OiBub3RlOiBleHBhbmRlZCBmcm9tOgorICA8c3BhbiBjbGFzcz0ibG9jIj50LmM6NzY6OTQ6PC9zcGFuPiA8c3BhbiBjbGFzcz0ibm90ZSI+bm90ZTo8L3NwYW4+IGV4cGFuZGVkIGZyb206CiAgIDxzcGFuIGNsYXNzPSJzbmlwIj4jZGVmaW5lIE1ZTUFYKEEsQikgICAgX19leHRlbnNpb25fXyAoeyBfX3R5cGVvZl9fKEEpIF9fYSA9IChBKTsgX190eXBlb2ZfXyhCKSBfX2IgPSAoQik7IF9fYSAmbHQ7IF9fYiA/IF9fYiA6IF9fYTsgfSk8L3NwYW4+CiAgIDxzcGFuIGNsYXNzPSJwb2ludCI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+fn4gXiB+fn48L3NwYW4+CiA8L3ByZT4KQEAgLTMyMiwxNCArMjg1LDE0IEBACiBpbXBsZW1lbnRzIHRoZSAid3dvcGVuIiBjbGFzcyBvZiBBUElzKTo8L3A+CiAKIDxwcmU+Ci0gICQgPGI+Y2xhbmcgLWZzeW50YXgtb25seSB0LmM8L2I+Ci0gIHQuYzoyMjoyOiA8c3BhbiBjbGFzcz0id2FybiI+d2FybmluZzo8L3NwYW4+IHR5cGUgc3BlY2lmaWVyIG1pc3NpbmcsIGRlZmF1bHRzIHRvICdpbnQnCisgICQgPHNwYW4gY2xhc3M9ImNtZCI+Y2xhbmcgLWZzeW50YXgtb25seSB0LmM8L3NwYW4+CisgIDxzcGFuIGNsYXNzPSJsb2MiPnQuYzoyMjoyOjwvc3Bhbj4gPHNwYW4gY2xhc3M9Indhcm4iPndhcm5pbmc6PC9zcGFuPiA8c3BhbiBjbGFzcz0ibXNnIj50eXBlIHNwZWNpZmllciBtaXNzaW5nLCBkZWZhdWx0cyB0byAnaW50Jzwvc3Bhbj4KICAgPHNwYW4gY2xhc3M9InNuaXAiPiAgICAgICAgSUxQQUQoKTs8L3NwYW4+CiAgIDxzcGFuIGNsYXNzPSJwb2ludCI+ICAgICAgICBePC9zcGFuPgotICB0LmM6MTc6MTc6IG5vdGU6IGV4cGFuZGVkIGZyb206CisgIDxzcGFuIGNsYXNzPSJsb2MiPnQuYzoxNzoxNzo8L3NwYW4+IDxzcGFuIGNsYXNzPSJub3RlIj5ub3RlOjwvc3Bhbj4gZXhwYW5kZWQgZnJvbToKICAgPHNwYW4gY2xhc3M9InNuaXAiPiNkZWZpbmUgSUxQQUQoKSBQQUQoKE5ST1cgLSB0dC50dF9yb3cpICogMTApICAgIC8qIDEgbXMgcGVyIGNoYXIgKi88L3NwYW4+CiAgIDxzcGFuIGNsYXNzPSJwb2ludCI+ICAgICAgICAgICAgICAgIF48L3NwYW4+Ci0gIHQuYzoxNDoyOiBub3RlOiBleHBhbmRlZCBmcm9tOgorICA8c3BhbiBjbGFzcz0ibG9jIj50LmM6MTQ6Mjo8L3NwYW4+IDxzcGFuIGNsYXNzPSJub3RlIj5ub3RlOjwvc3Bhbj4gZXhwYW5kZWQgZnJvbToKICAgPHNwYW4gY2xhc3M9InNuaXAiPiAgICAgICAgcmVnaXN0ZXIgaTsgXDwvc3Bhbj4KICAgPHNwYW4gY2xhc3M9InBvaW50Ij4gICAgICAgIF48L3NwYW4+CiA8L3ByZT4KQEAgLTM0Miw2MyArMzA1LDY1IEBACiA8cD5GaW5hbGx5LCB3ZSBoYXZlIHB1dCBhIGxvdCBvZiB3b3JrIHBvbGlzaGluZyB0aGUgbGl0dGxlIHRoaW5ncywgYmVjYXVzZQogbGl0dGxlIHRoaW5ncyBhZGQgdXAgb3ZlciB0aW1lIGFuZCBjb250cmlidXRlIHRvIGEgZ3JlYXQgdXNlciBleHBlcmllbmNlLjwvcD4KIAotPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgdHJpdmlhbCBsaXR0bGUgdHdlYWssIHdoZXJlIHdlIHRlbGwgeW91IHRvIHB1dCB0aGUgc2VtaWNvbG9uIGF0Ci10aGUgZW5kIG9mIHRoZSBsaW5lIHRoYXQgaXMgbWlzc2luZyBpdCAobGluZSA0KSBpbnN0ZWFkIG9mIGF0IHRoZSBiZWdpbm5pbmcgb2YKLXRoZSBmb2xsb3dpbmcgbGluZSAobGluZSA1KS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCB3aXRoIGZpeGl0IGhpbnRzCi1hbmQgcG9pbnQgZGlhZ25vc3RpY3MsIGJlY2F1c2Ugb3RoZXJ3aXNlIHlvdSBkb24ndCBnZXQgdGhlIGltcG9ydGFudCBjb250ZXh0LgotPC9wPgotCi08cHJlPgotICAkIDxiPmdjYy00LjIgdC5jPC9iPgotICB0LmM6IEluIGZ1bmN0aW9uICdmb28nOgotICB0LmM6NTogZXJyb3I6IGV4cGVjdGVkICc7JyBiZWZvcmUgJ30nIHRva2VuCi0gICQgPGI+Y2xhbmcgdC5jPC9iPgotICB0LmM6NDo4OiA8c3BhbiBjbGFzcz0iZXJyIj5lcnJvcjo8L3NwYW4+IGV4cGVjdGVkICc7JyBhZnRlciBleHByZXNzaW9uCi0gIDxzcGFuIGNsYXNzPSJzbmlwIj4gIGJhcigpPC9zcGFuPgotICA8c3BhbiBjbGFzcz0icG9pbnQiPiAgICAgICBePC9zcGFuPgotICA8c3BhbiBjbGFzcz0icG9pbnQiPiAgICAgICA7PC9zcGFuPgotPC9wcmU+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBtdWNoIGJldHRlciBlcnJvciByZWNvdmVyeSB0aGFuIEdDQy4gVGhlIG1lc3NhZ2UgY29taW5nIG91dAotb2YgR0NDIGlzIGNvbXBsZXRlbHkgdXNlbGVzcyBmb3IgZGlhZ25vc2luZyB0aGUgcHJvYmxlbS4gQ2xhbmcgdHJpZXMgbXVjaCBoYXJkZXIKLWFuZCBwcm9kdWNlcyBhIG11Y2ggbW9yZSB1c2VmdWwgZGlhZ25vc2lzIG9mIHRoZSBwcm9ibGVtLjwvcD4KLQotPHByZT4KLSAgJCA8Yj5nY2MtNC4yIHQuYzwvYj4KLSAgdC5jOjM6IGVycm9yOiBleHBlY3RlZCAnPScsICcsJywgJzsnLCAnYXNtJyBvciAnX19hdHRyaWJ1dGVfXycgYmVmb3JlICcqJyB0b2tlbgotICAkIDxiPmNsYW5nIHQuYzwvYj4KLSAgdC5jOjM6MTogPHNwYW4gY2xhc3M9ImVyciI+ZXJyb3I6PC9zcGFuPiB1bmtub3duIHR5cGUgbmFtZSAnZm9vX3QnCi0gIDxzcGFuIGNsYXNzPSJzbmlwIj5mb29fdCAqUCA9IDA7PC9zcGFuPgotICA8c3BhbiBjbGFzcz0icG9pbnQiPl48L3NwYW4+Ci08L3ByZT4KLQogPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoYXQgd2UgcmVjb3ZlciBmcm9tIHRoZSBzaW1wbGUgY2FzZSBvZgogZm9yZ2V0dGluZyBhIDsgYWZ0ZXIgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBtdWNoIGJldHRlciB0aGFuIEdDQy48L3A+CiAKIDxwcmU+Ci0gICQgPGI+Y2F0IHQuY2M8L2I+CisgICQgPHNwYW4gY2xhc3M9ImNtZCI+Y2F0IHQuY2M8L3NwYW4+CiAgIHRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7Ci0gIGNsYXNzIGEge30KLSAgY2xhc3MgdGVtcCB7fTsKLSAgYSZsdDt0ZW1wJmd0OyBiOwotICBzdHJ1Y3QgYiB7Ci0gIH0KLSAgJCA8Yj5nY2MtNC4yIHQuY2M8L2I+Ci0gIHQuY2M6MzogZXJyb3I6IG11bHRpcGxlIHR5cGVzIGluIG9uZSBkZWNsYXJhdGlvbgotICB0LmNjOjQ6IGVycm9yOiBub24tdGVtcGxhdGUgdHlwZSAnYScgdXNlZCBhcyBhIHRlbXBsYXRlCi0gIHQuY2M6NDogZXJyb3I6IGludmFsaWQgdHlwZSBpbiBkZWNsYXJhdGlvbiBiZWZvcmUgJzsnIHRva2VuCi0gIHQuY2M6NjogZXJyb3I6IGV4cGVjdGVkIHVucXVhbGlmaWVkLWlkIGF0IGVuZCBvZiBpbnB1dAotICAkIDxiPmNsYW5nIHQuY2M8L2I+Ci0gIHQuY2M6MjoxMTogPHNwYW4gY2xhc3M9ImVyciI+ZXJyb3I6PC9zcGFuPiBleHBlY3RlZCAnOycgYWZ0ZXIgY2xhc3MKLSAgPHNwYW4gY2xhc3M9InNuaXAiPmNsYXNzIGEge308L3NwYW4+Ci0gIDxzcGFuIGNsYXNzPSJwb2ludCI+ICAgICAgICAgIF48L3NwYW4+Ci0gIDxzcGFuIGNsYXNzPSJwb2ludCI+ICAgICAgICAgIDs8L3NwYW4+Ci0gIHQuY2M6NjoyOiA8c3BhbiBjbGFzcz0iZXJyIj5lcnJvcjo8L3NwYW4+IGV4cGVjdGVkICc7JyBhZnRlciBzdHJ1Y3QKLSAgPHNwYW4gY2xhc3M9InNuaXAiPn08L3NwYW4+Ci0gIDxzcGFuIGNsYXNzPSJwb2ludCI+IF48L3NwYW4+Ci0gIDxzcGFuIGNsYXNzPSJwb2ludCI+IDs8L3NwYW4+CisgIGNsYXNzIGEge307CisgIHN0cnVjdCBiIHt9CisgIGEmbHQ7aW50Jmd0OyBjOworICAkIDxzcGFuIGNsYXNzPSJjbWQiPmdjYy00LjkgdC5jYzwvc3Bhbj4KKyAgdC5jYzo0Ojg6IGVycm9yOiBpbnZhbGlkIGRlY2xhcmF0b3IgYmVmb3JlICdjJworICAgYSZsdDtpbnQmZ3Q7IGM7CisgICAgICAgICAgIF4KKyAgJCA8c3BhbiBjbGFzcz0iY21kIj5jbGFuZyB0LmNjPC9zcGFuPgorICA8c3BhbiBjbGFzcz0ibG9jIj50LmNjOjM6MTI6PC9zcGFuPiA8c3BhbiBjbGFzcz0iZXJyIj5lcnJvcjo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtc2ciPmV4cGVjdGVkICc7JyBhZnRlciBzdHJ1Y3Q8L3NwYW4+CisgIDxzcGFuIGNsYXNzPSJzbmlwIiA+c3RydWN0IGIge308L3NwYW4+CisgIDxzcGFuIGNsYXNzPSJwb2ludCI+ICAgICAgICAgICBePC9zcGFuPgorICA8c3BhbiBjbGFzcz0icG9pbnQiPiAgICAgICAgICAgOzwvc3Bhbj4KIDwvcHJlPgogCis8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhhdCB3ZSBkaWFnbm9zZSBhbmQgcmVjb3ZlciBmcm9tIGEgbWlzc2luZworPHR0PnR5cGVuYW1lPC90dD4ga2V5d29yZCB3ZWxsLCBldmVuIGluIGNvbXBsZXggY2lyY3Vtc3RhbmNlcyB3aGVyZSBHQ0MKK2Nhbm5vdCBjb3BlLjwvcD4KKworPHByZT4KKyAgJCA8c3BhbiBjbGFzcz0iY21kIj5jYXQgdC5jYzwvc3Bhbj4KKyAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsgdm9pZCBmKFQ6OnR5cGUpIHsgfQorICBzdHJ1Y3QgQSB7IH07CisgIHZvaWQgZygpCisgIHsKKyAgICAgIEEgYTsKKyAgICAgIGYmbHQ7QSZndDsoYSk7CisgIH0KKyAgJCA8c3BhbiBjbGFzcz0iY21kIj5nY2MtNC45IHQuY2M8L3NwYW4+CisgIHQuY2M6MTozMzogZXJyb3I6IHZhcmlhYmxlIG9yIGZpZWxkICdmJyBkZWNsYXJlZCB2b2lkCisgICB0ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OyB2b2lkIGYoVDo6dHlwZSkgeyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgdC5jYzogSW4gZnVuY3Rpb24gJ3ZvaWQgZygpJzoKKyAgdC5jYzo2OjU6IGVycm9yOiAnZicgd2FzIG5vdCBkZWNsYXJlZCBpbiB0aGlzIHNjb3BlCisgICAgICAgZiZsdDtBJmd0OyhhKTsKKyAgICAgICBeCisgIHQuY2M6Njo4OiBlcnJvcjogZXhwZWN0ZWQgcHJpbWFyeS1leHByZXNzaW9uIGJlZm9yZSAnPicgdG9rZW4KKyAgICAgICBmJmx0O0EmZ3Q7KGEpOworICAgICAgICAgIF4KKyAgJCA8c3BhbiBjbGFzcz0iY21kIj5jbGFuZyB0LmNjPC9zcGFuPgorICA8c3BhbiBjbGFzcz0ibG9jIj50LmNjOjE6MjY6PC9zcGFuPiA8c3BhbiBjbGFzcz0iZXJyIj5lcnJvcjo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtc2ciPm1pc3NpbmcgJ3R5cGVuYW1lJyBwcmlvciB0byBkZXBlbmRlbnQgdHlwZSBuYW1lICdUOjp0eXBlJzwvc3Bhbj4KKyAgPHNwYW4gY2xhc3M9InNuaXAiID50ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OyB2b2lkIGYoVDo6dHlwZSkgeyB9PC9zcGFuPgorICA8c3BhbiBjbGFzcz0icG9pbnQiPiAgICAgICAgICAgICAgICAgICAgICAgICBefn5+fn5+PC9zcGFuPgorICA8c3BhbiBjbGFzcz0icG9pbnQiPiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSA8L3NwYW4+CisgIDxzcGFuIGNsYXNzPSJsb2MiPnQuY2M6Njo1Ojwvc3Bhbj4gPHNwYW4gY2xhc3M9ImVyciI+ZXJyb3I6PC9zcGFuPiA8c3BhbiBjbGFzcz0ibXNnIj5ubyBtYXRjaGluZyBmdW5jdGlvbiBmb3IgY2FsbCB0byAnZic8L3NwYW4+CisgIDxzcGFuIGNsYXNzPSJzbmlwIiA+ICAgIGYmbHQ7QSZndDsoYSk7PC9zcGFuPgorICA8c3BhbiBjbGFzcz0icG9pbnQiPiAgICBefn5+PC9zcGFuPgorICA8c3BhbiBjbGFzcz0ibG9jIj50LmNjOjE6MjQ6PC9zcGFuPiA8c3BhbiBjbGFzcz0ibm90ZSI+bm90ZTo8L3NwYW4+IDxzcGFuIGNsYXNzPSJtc2ciPmNhbmRpZGF0ZSB0ZW1wbGF0ZSBpZ25vcmVkOiBzdWJzdGl0dXRpb24gZmFpbHVyZSBbd2l0aCBUID0gQV06IG5vIHR5cGUgbmFtZWQgJ3R5cGUnIGluICdBJzwvc3Bhbj4KKyAgPHNwYW4gY2xhc3M9InNuaXAiID50ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OyB2b2lkIGYoVDo6dHlwZSkgeyB9PC9zcGFuPgorICA8c3BhbiBjbGFzcz0icG9pbnQiPiAgICAgICAgICAgICAgICAgICAgICAgXiAgICB+fn5+PC9zcGFuPgorPC9wcmU+CisKKworCiA8cD5XaGlsZSBlYWNoIG9mIHRoZXNlIGRldGFpbHMgaXMgbWlub3IsIHdlIGZlZWwgdGhhdCB0aGV5IGFsbCBhZGQgdXAgdG8gcHJvdmlkZQogYSBtdWNoIG1vcmUgcG9saXNoZWQgZXhwZXJpZW5jZS48L3A+CiAKZGlmZiAtLWdpdCBhL3d3dy9mZWF0dXJlcy5odG1sIGIvd3d3L2ZlYXR1cmVzLmh0bWwKaW5kZXggMmQzMTkxZS4uZDZkOTkyYiAxMDA2NDQKLS0tIGEvd3d3L2ZlYXR1cmVzLmh0bWwKKysrIGIvd3d3L2ZlYXR1cmVzLmh0bWwKQEAgLTY5LDcgKzY5LDcgQEAKIAogPHA+V2hpbGUgdGhlcmUgaXMgc3RpbGwgbXVjaCB0aGF0IGNhbiBiZSBkb25lLCB3ZSBmaW5kIHRoYXQgdGhlIGNsYW5nIGZyb250LWVuZAogaXMgc2lnbmlmaWNhbnRseSBxdWlja2VyIHRoYW4gZ2NjIGFuZCB1c2VzIGxlc3MgbWVtb3J5ICBGb3IgZXhhbXBsZSwgd2hlbgotY29tcGlsaW5nICJDYXJib24uaCIgb24gTWFjIE9TL1gsIHdlIHNlZSB0aGF0IGNsYW5nIGlzIDIuNXggZmFzdGVyIHRoYW4gR0NDOjwvcD4KK2NvbXBpbGluZyAiQ2FyYm9uLmgiIG9uIE1hYyBPUyBYLCB3ZSBzZWUgdGhhdCBjbGFuZyBpcyAyLjV4IGZhc3RlciB0aGFuIEdDQzo8L3A+CiAKIDxpbWcgY2xhc3M9ImltZ19zbGlkZSIgc3JjPSJmZWF0dXJlLWNvbXBpbGUxLnBuZyIgd2lkdGg9IjQwMCIgaGVpZ2h0PSIzMDAiCiAgICAgIGFsdD0iVGltZSB0byBwYXJzZSBjYXJib24uaDogLWZzeW50YXgtb25seSI+CmRpZmYgLS1naXQgYS93d3cvZ2V0X2ludm9sdmVkLmh0bWwgYi93d3cvZ2V0X2ludm9sdmVkLmh0bWwKaW5kZXggOWVkMmQ0Ny4uNWQxNmRiOSAxMDA2NDQKLS0tIGEvd3d3L2dldF9pbnZvbHZlZC5odG1sCisrKyBiL3d3dy9nZXRfaW52b2x2ZWQuaHRtbApAQCAtNTQsNyArNTQsMTMgQEAKIGxpc3Q8L2E+LiAgQWxsIG9mIHRoZXNlIGxpc3RzIGhhdmUgYXJjaGl2ZXMsIHNvIHlvdSBjYW4gYnJvd3NlIHRocm91Z2ggcHJldmlvdXMKIGRpc2N1c3Npb25zIG9yIGZvbGxvdyB0aGUgbGlzdCBkZXZlbG9wbWVudCBvbiB0aGUgd2ViIGlmIHlvdSBwcmVmZXIuPC9wPgogCi08cD5JZiB5b3UncmUgbG9va2luZyBmb3Igc29tZXRoaW5nIHRvIHdvcmsgb24sIGNoZWNrIG91dCBvdXIgPGEgaHJlZj0iT3BlblByb2plY3RzLmh0bWwiPk9wZW4gUHJvamVjdHM8L2E+IHBhZ2Ugb3IgZ28gbG9vayB0aHJvdWdoIHRoZSA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvYnVncy8iPkJ1Z3ppbGxhIGJ1ZyBkYXRhYmFzZTwvYT4uPC9wPgorPHA+WW91IGNhbiBhbHNvIGZvbGxvdyB0aGUgPGEgaHJlZj0iaHR0cDovL3BsYW5ldC5jbGFuZy5vcmcvIj5QbGFuZXQgQ2xhbmc8L2E+Citjb21tdW5pdHkgbmV3cyBmZWVkIHdoaWNoIG9mZmVycyBhIHdpbmRvdyBpbnRvIHRoZSB3b3JsZCwgd29yayBhbmQgbGl2ZXMgb2YKK0NsYW5nIGRldmVsb3BlcnMsIGNvbnRyaWJ1dG9ycyBhbmQgdGhlIHN0YW5kYXJkcyB0aGV5IGltcGxlbWVudC48L3A+CisKKzxwPklmIHlvdSdyZSBsb29raW5nIGZvciBzb21ldGhpbmcgdG8gd29yayBvbiwgY2hlY2sgb3V0IG91ciA8YQoraHJlZj0iT3BlblByb2plY3RzLmh0bWwiPk9wZW4gUHJvamVjdHM8L2E+IHBhZ2Ugb3IgbG9vayB0aHJvdWdoIHRoZSA8YQoraHJlZj0iaHR0cDovL2xsdm0ub3JnL2J1Z3MvIj5CdWd6aWxsYSBidWcgZGF0YWJhc2U8L2E+LjwvcD4KIAogPGgyIGlkPSJjcml0ZXJpYSI+Q29udHJpYnV0aW5nIEV4dGVuc2lvbnMgdG8gQ2xhbmc8L2gyPgogCmRpZmYgLS1naXQgYS93d3cvZ2V0X3N0YXJ0ZWQuaHRtbCBiL3d3dy9nZXRfc3RhcnRlZC5odG1sCmluZGV4IDUxMjgzMzEuLmM3ZWMzZWIgMTAwNjQ0Ci0tLSBhL3d3dy9nZXRfc3RhcnRlZC5odG1sCisrKyBiL3d3dy9nZXRfc3RhcnRlZC5odG1sCkBAIC0xNDIsNyArMTQyLDcgQEAKICAgICAgICAgcHJvamVjdCBmaWxlcy4gIEdldCBpdCBmcm9tOgogICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmNtYWtlLm9yZy9jbWFrZS9yZXNvdXJjZXMvc29mdHdhcmUuaHRtbCI+CiAgICAgICAgIGh0dHA6Ly93d3cuY21ha2Uub3JnL2NtYWtlL3Jlc291cmNlcy9zb2Z0d2FyZS5odG1sPC9hPjwvbGk+Ci0gICAgPGxpPjxiPlZpc3VhbCBTdHVkaW8gMjAwOCBvciAyMDEwPC9iPjwvbGk+CisgICAgPGxpPjxiPlZpc3VhbCBTdHVkaW8gMjAxMiBvciBsYXRlcjwvYj48L2xpPgogICAgIDxsaT48Yj5QeXRob248L2I+LiAgVGhpcyBpcyBuZWVkZWQgb25seSBpZiB5b3Ugd2lsbCBiZSBydW5uaW5nIHRoZSB0ZXN0cwogICAgICAgICAod2hpY2ggaXMgZXNzZW50aWFsLCBpZiB5b3Ugd2lsbCBiZSBkZXZlbG9waW5nIGZvciBjbGFuZykuCiAgICAgICAgIEdldCBpdCBmcm9tOgpAQCAtMTc0LDggKzE3NCw3IEBACiAgICAgPGxpPjx0dD5jZCAuLlwuLjwvdHQ+ICAoYmFjayB0byB3aGVyZSB5b3Ugc3RhcnRlZCk8L2xpPgogICAgIDxsaT48dHQ+bWtkaXIgYnVpbGQ8L3R0PiAoZm9yIGJ1aWxkaW5nIHdpdGhvdXQgcG9sbHV0aW5nIHRoZSBzb3VyY2UgZGlyKTwvbGk+CiAgICAgPGxpPjx0dD5jZCBidWlsZDwvdHQ+PC9saT4KLSAgICA8bGk+SWYgeW91IGFyZSB1c2luZyBWaXN1YWwgU3R1ZGlvIDIwMDg6ICA8dHQ+Y21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gOSAyMDA4IiAuLlxsbHZtPC90dD48L2xpPgotICAgIDxsaT5PciBpZiB5b3UgYXJlIHVzaW5nIFZpc3VhbCBTdHVkaW8gMjAxMDogIDx0dD5jbWFrZSAtRyAiVmlzdWFsIFN0dWRpbyAxMCIgLi5cbGx2bTwvdHQ+PC9saT4KKyAgICA8bGk+SWYgeW91IGFyZSB1c2luZyBWaXN1YWwgU3R1ZGlvIDIwMTI6ICA8dHQ+Y21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTEiIC4uXGxsdm08L3R0PjwvbGk+CiAgICAgPGxpPlNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5sbHZtLm9yZy9kb2NzL0NNYWtlLmh0bWwiPkxMVk0gQ01ha2UgZ3VpZGU8L2E+IGZvcgogICAgICAgICBtb3JlIGluZm9ybWF0aW9uIG9uIG90aGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgQ01ha2UuPC9saT4KICAgICA8bGk+VGhlIGFib3ZlLCBpZiBzdWNjZXNzZnVsLCB3aWxsIGhhdmUgY3JlYXRlZCBhbiBMTFZNLnNsbiBmaWxlIGluIHRoZQpkaWZmIC0tZ2l0IGEvd3d3L2hhY2tpbmcuaHRtbCBiL3d3dy9oYWNraW5nLmh0bWwKaW5kZXggYTFmZjhkNC4uZDdhODcwMSAxMDA2NDQKLS0tIGEvd3d3L2hhY2tpbmcuaHRtbAorKysgYi93d3cvaGFja2luZy5odG1sCkBAIC05NywyMyArOTcsMTUgQEAKICAgPGgzIGlkPSJkZWJ1Z2dpbmdWaXN1YWxTdHVkaW8iPkRlYnVnZ2luZyB1c2luZyBWaXN1YWwgU3R1ZGlvPC9oMz4KICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgogCi0gIDxwPlRoZSBmaWxlIDx0dD51dGlscy9jbGFuZ1Zpc3VhbGl6ZXJzLnR4dDwvdHQ+IHByb3ZpZGVzIGRlYnVnZ2VyIHZpc3VhbGl6ZXJzIHRoYXQgbWFrZSBkZWJ1Z2dpbmcKLSAgb2YgbW9yZSBjb21wbGV4IGRhdGEgdHlwZXMgbXVjaCBlYXNpZXIuPC9wPgotICA8cD5UaGVyZSBhcmUgdHdvIHdheXMgdG8gaW5zdGFsbCB0aGVtOjwvcD4KLSAgCi0gIDx1bD4KLSAgICAgIDxsaT5QdXQgdGhlIHBhdGggdG8gPHR0PmNsYW5nVmlzdWFsaXplcnMudHh0PC90dD4gaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbGxlZAotICAgICAgPHR0Pl92Y2VlX2F1dG9leHA8L3R0Pi4gVGhpcyBtZXRob2Qgc2hvdWxkIHdvcmsgZm9yIFZpc3VhbCBTdHVkaW8gMjAwOCBhbmQgYWJvdmUuCi0gICAgICA8L2xpPgotICAgICAgPGxpPkVkaXQgeW91ciBsb2NhbCA8dHQ+YXV0b2V4cC5kYXQ8L3R0PiAobWFrZSBzdXJlIHlvdSBtYWtlIGEgYmFja3VwIGZpcnN0ISksIAotICAgICAgbG9jYXRlZCBpbiA8dHQ+VmlzdWFsIFN0dWRpbyBEaXJlY3RvcnlcQ29tbW9uN1xQYWNrYWdlc1xEZWJ1Z2dlcjwvdHQ+IGFuZCBhcHBlbmQgCi0gICAgICB0aGUgY29udGVudHMgb2YgPHR0PmNsYW5nVmlzdWFpbHplcnMudHh0PC90dD4gdG8gaXQuIFRoaXMgbWV0aG9kIHNob3VsZCB3b3JrIGZvciAKLSAgICAgIFZpc3VhbCBTdHVkaW8gMjAwOCBhbmQgYWJvdmUuCi0gICAgICAgPC9saT4KLSAgPC91bD4KLQotICA8cD48aT5bTm90ZTogVG8gZGlzYWJsZSB0aGUgdmlzdWFsaXplciBmb3IgYW55IHNwZWNpZmljIHZhcmlhYmxlLCB0eXBlIAotICA8dHQ+dmFyaWFibGVfbmFtZSwhPC90dD4gaW5zaWRlIHRoZSB3YXRjaCB3aW5kb3cuXTwvaT48L3A+CisgIDxwPlRoZSBmaWxlcyAKKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdC9sbHZtL3RydW5rL3V0aWxzL2xsdm0ubmF0dmlzIj4KKyAgICAgIDx0dD51dGlscy9sbHZtLm5hdHZpczwvdHQ+PC9hPiBhbmQgCisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3QvY2ZlL3RydW5rL3V0aWxzL2NsYW5nLm5hdHZpcyI+CisgICAgICA8dHQ+dXRpbHMvY2xhbmcubmF0dmlzPC90dD48L2E+IHByb3ZpZGUgZGVidWdnZXIgdmlzdWFsaXplcnMgCisgICAgICB0aGF0IG1ha2UgZGVidWdnaW5nIG9mIG1vcmUgY29tcGxleCBkYXRhIHR5cGVzIG11Y2ggZWFzaWVyLjwvcD4KKyAgPHA+UHV0IHRoZSBmaWxlcyBpbnRvIAorICAgIDx0dD4lVVNFUlBST0ZJTEUlXERvY3VtZW50c1xWaXN1YWwgU3R1ZGlvIDIwMTJcVmlzdWFsaXplcnM8L3R0PiBvciAKKyAgICBjcmVhdGUgYSBzeW1ib2xpYyBsaW5rIHNvIHRoZXkgdXBkYXRlIGF1dG9tYXRpY2FsbHkuPC9wPgogCiAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KICAgPGgyIGlkPSJ0ZXN0aW5nIj5UZXN0aW5nPC9oMj4KZGlmZiAtLWdpdCBhL3d3dy9pbmRleC5odG1sIGIvd3d3L2luZGV4Lmh0bWwKaW5kZXggMjNkODJlMy4uMmQzY2E4ZiAxMDA2NDQKLS0tIGEvd3d3L2luZGV4Lmh0bWwKKysrIGIvd3d3L2luZGV4Lmh0bWwKQEAgLTQwLDcgKzQwLDcgQEAKICAgPHVsPgogICA8bGk+TW9kdWxhciBsaWJyYXJ5IGJhc2VkIGFyY2hpdGVjdHVyZTwvbGk+CiAgIDxsaT5TdXBwb3J0IGRpdmVyc2UgY2xpZW50cyAocmVmYWN0b3JpbmcsIHN0YXRpYyBhbmFseXNpcywgY29kZSBnZW5lcmF0aW9uLAotICAgZXRjKTwvbGk+CisgICBldGMuKTwvbGk+CiAgIDxsaT5BbGxvdyB0aWdodCBpbnRlZ3JhdGlvbiB3aXRoIElERXM8L2xpPgogICA8bGk+VXNlIHRoZSBMTFZNICdCU0QnIExpY2Vuc2U8L2xpPgogICA8L3VsPgpAQCAtNjUsNyArNjUsNyBAQAogICA8aDI+V2h5PzwvaDI+CiAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KICAgCi0gIDxwPlRoZSBkZXZlbG9wbWVudCBvZiBhIG5ldyBmcm9udC1lbmQgd2FzIHN0YXJ0ZWQgb3V0IG9mIGEgbmVlZCAtLSBhIG5lZWQKKyAgPHA+RGV2ZWxvcG1lbnQgb2YgdGhlIG5ldyBmcm9udC1lbmQgd2FzIHN0YXJ0ZWQgb3V0IG9mIGEgbmVlZAogICAgICBmb3IgYSBjb21waWxlciB0aGF0IGFsbG93cyBiZXR0ZXIgZGlhZ25vc3RpY3MsIGJldHRlciBpbnRlZ3JhdGlvbiB3aXRoCiAgICAgIElERXMsIGEgbGljZW5zZSB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCBjb21tZXJjaWFsIHByb2R1Y3RzLCBhbmQgYQogICAgICBuaW1ibGUgY29tcGlsZXIgdGhhdCBpcyBlYXN5IHRvIGRldmVsb3AgYW5kIG1haW50YWluLiAgQWxsIG9mIHRoZXNlIHdlcmUKQEAgLTg5LDcgKzg5LDcgQEAKICAgPGgyPkN1cnJlbnQgU3RhdHVzPC9oMj4KICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgogICAKLSAgPHA+Q2xhbmcgaXMgc3RpbGwgdW5kZXIgaGVhdnkgZGV2ZWxvcG1lbnQuICBDbGFuZyBpcyBjb25zaWRlcmVkIHRvCisgIDxwPkNsYW5nIGlzIGNvbnNpZGVyZWQgdG8KICAgIGJlIGEgcHJvZHVjdGlvbiBxdWFsaXR5IEMsIE9iamVjdGl2ZS1DLCBDKysgYW5kIE9iamVjdGl2ZS1DKysgY29tcGlsZXIgd2hlbiAKICAgIHRhcmdldGluZyBYODYtMzIsIFg4Ni02NCwgYW5kIEFSTSAob3RoZXIgdGFyZ2V0cyBtYXkgaGF2ZSBjYXZlYXRzLCBidXQgYXJlIAogICAgdXN1YWxseSBlYXN5IHRvIGZpeCkuICBJZiB5b3UgYXJlIGxvb2tpbmcgZm9yIHNvdXJjZSBhbmFseXNpcyBvcgpkaWZmIC0tZ2l0IGEvd3d3L21ha2VfY3h4X2RyX3N0YXR1cyBiL3d3dy9tYWtlX2N4eF9kcl9zdGF0dXMKaW5kZXggNDc1MGUxYi4uODJlOGFiZCAxMDA3NTUKLS0tIGEvd3d3L21ha2VfY3h4X2RyX3N0YXR1cworKysgYi93d3cvbWFrZV9jeHhfZHJfc3RhdHVzCkBAIC01MSw2ICs1MSw3IEBACiBwcmludCA+PiBvdXRfZmlsZSwgJycnXAogPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgogICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzwhLS0gVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGJ5IG1ha2VfY3h4X2RyX3N0YXR1cy4gRG8gbm90IG1vZGlmeS4gLS0+CiA8aHRtbD4KIDxoZWFkPgogICA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KQEAgLTY1LDcgKzY2LDcgQEAKICAgICAubmEgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjREREREREIH0KICAgICAub3BlbiAqIHsgY29sb3I6ICNBQUFBQUEgfQogICAgIC8vLm9wZW4geyBmaWx0ZXI6IG9wYWNpdHkoMC4yKSB9Ci0gICAgc3Bhbjp0YXJnZXQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkJCOyBvdXRsaW5lOiAjRERERDU1IHNvbGlkIHRoaW47IH0KKyAgICB0cjp0YXJnZXQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkJCIH0KICAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNGRkREQUEgfQogICA8L3N0eWxlPgogPC9oZWFkPgpAQCAtMTAxLDEwICsxMDIsMTAgQEAKICAgaWYgc3RhdHVzID09ICd1bmtub3duJzoKICAgICBhdmFpbCA9ICdVbmtub3duJwogICAgIGF2YWlsX3N0eWxlID0gJyBjbGFzcz0ibm9uZSInCi0gIGVsaWYgc3RhdHVzID09ICczLjQnOgorICBlbGlmIHN0YXR1cyA9PSAnMy41JzoKICAgICBhdmFpbCA9ICdTVk4nCiAgICAgYXZhaWxfc3R5bGUgPSAnIGNsYXNzPSJzdm4iJwotICBlbGlmIHN0YXR1cyBpbiAoJzMuMScsICczLjInLCAnMy4zJyk6CisgIGVsaWYgc3RhdHVzIGluICgnMy4xJywgJzMuMicsICczLjMnLCAnMy40Jyk6CiAgICAgYXZhaWwgPSAnQ2xhbmcgJXMnICUgc3RhdHVzCiAgICAgYXZhaWxfc3R5bGUgPSAnIGNsYXNzPSJmdWxsIicKICAgZWxpZiBzdGF0dXMgPT0gJ3llcyc6CkBAIC0xMjEsNyArMTIyLDcgQEAKICAgICBhdmFpbF9zdHlsZSA9ICcgY2xhc3M9Im5hIicKICAgZWxpZiBzdGF0dXMuc3RhcnRzd2l0aCgnc3VwICcpOgogICAgIGR1cCA9IHN0YXR1cy5zcGxpdCgnICcsIDEpWzFdCi0gICAgYXZhaWwgPSAnU3VwZXJzZWRlZCBieSAlcycgJSBkdXAKKyAgICBhdmFpbCA9ICdTdXBlcnNlZGVkIGJ5IDxhIGhyZWY9IiMlcyI+JXM8L2E+JyAlIChkdXAsIGR1cCkKICAgICB0cnk6CiAgICAgICBfLCBhdmFpbF9zdHlsZSA9IGF2YWlsYWJpbGl0eShpbnQoZHVwKSkKICAgICBleGNlcHQ6CkBAIC0xMjksNyArMTMwLDcgQEAKICAgICAgIGF2YWlsX3N0eWxlID0gJyBjbGFzcz0ibm9uZSInCiAgIGVsaWYgc3RhdHVzLnN0YXJ0c3dpdGgoJ2R1cCAnKToKICAgICBkdXAgPSBpbnQoc3RhdHVzLnNwbGl0KCcgJywgMSlbMV0pCi0gICAgYXZhaWwgPSAnRHVwbGljYXRlIG9mICVzJyAlIGR1cAorICAgIGF2YWlsID0gJ0R1cGxpY2F0ZSBvZiA8YSBocmVmPSIjJXMiPiVzPC9hPicgJSAoZHVwLCBkdXApCiAgICAgXywgYXZhaWxfc3R5bGUgPSBhdmFpbGFiaWxpdHkoZHVwKQogICBlbHNlOgogICAgIGFzc2VydCBGYWxzZSwgJ3Vua25vd24gc3RhdHVzICVzIGZvciBpc3N1ZSAlcycgJSAoc3RhdHVzLCBkci5pc3N1ZSkKQEAgLTE1MywxMyArMTU0LDEyIEBACiAgICAgICBjb3VudFthdmFpbF0gPSBjb3VudC5nZXQoYXZhaWwsIDApICsgMQogCiAgIHByaW50ID4+IG91dF9maWxlLCAnJydcCi0gIDx0ciVzPgorICA8dHIlcyBpZD0iJXMiPgogICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzLyVzIj4lczwvYT48L3RkPgogICAgIDx0ZD4lczwvdGQ+CiAgICAgPHRkPiVzPC90ZD4KICAgICA8dGQlcyBhbGlnbj0iY2VudGVyIj4lczwvdGQ+Ci0gIDwvdHI+JycnICUgKHJvd19zdHlsZSwgZHIudXJsLCBkci5pc3N1ZSwgZHIuc3RhdHVzLCBkci50aXRsZSwgYXZhaWxfc3R5bGUsCi0gICAgICAgICAgICAgIGF2YWlsKQorICA8L3RyPicnJyAlIChyb3dfc3R5bGUsIGRyLmlzc3VlLCBkci51cmwsIGRyLmlzc3VlLCBkci5zdGF0dXMsIGRyLnRpdGxlLCBhdmFpbF9zdHlsZSwgYXZhaWwpCiAKIGZvciBzdGF0dXMsIG51bSBpbiBjb3VudC5pdGVtcygpOgogICBwcmludCAiJXM6ICVzIiAlIChzdGF0dXMsIG51bSkKZGlmZiAtLWdpdCBhL3d3dy9tZW51Lmh0bWwuaW5jbCBiL3d3dy9tZW51Lmh0bWwuaW5jbAppbmRleCA0MzgyOTkxLi5iODY4OWQxIDEwMDY0NAotLS0gYS93d3cvbWVudS5odG1sLmluY2wKKysrIGIvd3d3L21lbnUuaHRtbC5pbmNsCkBAIC0zNSw4ICszNSw5IEBACiAgICAgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmNzLnVpdWMuZWR1L21haWxtYW4vbGlzdGluZm8vY2ZlLXVzZXJzIj5jZmUtdXNlcnMgTGlzdDwvYT4KICAgICA8YSBocmVmPSJodHRwOi8vbGlzdHMuY3MudWl1Yy5lZHUvbWFpbG1hbi9saXN0aW5mby9jZmUtZGV2Ij5jZmUtZGV2IExpc3Q8L2E+CiAgICAgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmNzLnVpdWMuZWR1L21haWxtYW4vbGlzdGluZm8vY2ZlLWNvbW1pdHMiPmNmZS1jb21taXRzIExpc3Q8L2E+Ci0gICAgPGEgaHJlZj0iaXJjOi8vaXJjLm9mdGMubmV0L2xsdm0iPklSQzogaXJjLm9mdGMubmV0I2xsdm08L2E+CiAgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2J1Z3MvIj5CdWcgUmVwb3J0czwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vcGxhbmV0LmNsYW5nLm9yZy8iPlBsYW5ldCBDbGFuZzwvYT4KKyAgICA8YSBocmVmPSJpcmM6Ly9pcmMub2Z0Yy5uZXQvbGx2bSI+SVJDOiBpcmMub2Z0Yy5uZXQjbGx2bTwvYT4KICAgPC9kaXY+CiAKICAgPGRpdiBjbGFzcz0ic3VibWVudSI+Cg==